summaryrefslogtreecommitdiff
path: root/core/src
diff options
context:
space:
mode:
Diffstat (limited to 'core/src')
-rw-r--r--core/src/fdrm/crypto/fx_crypt.cpp518
-rw-r--r--core/src/fdrm/crypto/fx_crypt_aes.cpp2026
-rw-r--r--core/src/fdrm/crypto/fx_crypt_sha.cpp1484
-rw-r--r--core/src/fpdfapi/fpdf_basic_module.cpp356
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/CNS1/B5pc-H_0.cpp182
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/CNS1/B5pc-V_0.cpp24
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/CNS1/CNS-EUC-H_0.cpp364
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/CNS1/CNS-EUC-V_0.cpp402
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/CNS1/ETen-B5-H_0.cpp186
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/CNS1/ETen-B5-V_0.cpp26
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/CNS1/ETenms-B5-H_0.cpp18
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/CNS1/ETenms-B5-V_0.cpp28
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/CNS1/UniCNS-UTF16-H_0.cpp7302
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/GB1/GB-EUC-H_0.cpp76
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/GB1/GB-EUC-V_0.cpp30
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/GB1/GBK-EUC-H_2.cpp2730
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/GB1/GBKp-EUC-H_2.cpp2730
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/GB1/GBpc-EUC-H_0.cpp78
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/GB1/GBpc-EUC-V_0.cpp30
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/GB1/UniGB-UCS2-H_4.cpp9234
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/Japan1/83pv-RKSJ-H_1.cpp164
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/Japan1/90ms-RKSJ-H_2.cpp130
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/Japan1/90msp-RKSJ-H_2.cpp130
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/Japan1/90pv-RKSJ-H_1.cpp192
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/Japan1/Add-RKSJ-H_1.cpp440
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/Japan1/Add-RKSJ-V_1.cpp54
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/Japan1/Adobe-Japan1-UCS2_4.cpp3878
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/Japan1/EUC-H_1.cpp96
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/Japan1/H_1.cpp96
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UCS2-HW-V_4.cpp150
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UCS2-H_4.cpp4902
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UCS2-V_4.cpp142
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UTF16-H_5.cpp6898
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UTF16-V_5.cpp162
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/Korea1/Adobe-Korea1-UCS2_2.cpp4604
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/Korea1/KSC-EUC-H_0.cpp328
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/Korea1/KSC-EUC-V_0.cpp28
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/Korea1/KSCms-UHC-HW-H_1.cpp466
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/Korea1/KSCms-UHC-H_1.cpp466
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/Korea1/KSCpc-EUC-H_0.cpp356
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/Korea1/UniKS-UCS2-H_1.cpp5612
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/Korea1/UniKS-UTF16-H_0.cpp96
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/cmap_int.h40
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/fpdf_cmaps.cpp366
-rw-r--r--core/src/fpdfapi/fpdf_edit/editint.h118
-rw-r--r--core/src/fpdfapi/fpdf_edit/fpdf_edit_content.cpp328
-rw-r--r--core/src/fpdfapi/fpdf_edit/fpdf_edit_create.cpp4262
-rw-r--r--core/src/fpdfapi/fpdf_edit/fpdf_edit_doc.cpp2410
-rw-r--r--core/src/fpdfapi/fpdf_edit/fpdf_edit_image.cpp748
-rw-r--r--core/src/fpdfapi/fpdf_font/common.h34
-rw-r--r--core/src/fpdfapi/fpdf_font/font_int.h402
-rw-r--r--core/src/fpdfapi/fpdf_font/fpdf_font.cpp3526
-rw-r--r--core/src/fpdfapi/fpdf_font/fpdf_font_charset.cpp1250
-rw-r--r--core/src/fpdfapi/fpdf_font/fpdf_font_cid.cpp3432
-rw-r--r--core/src/fpdfapi/fpdf_font/fpdf_font_utility.cpp194
-rw-r--r--core/src/fpdfapi/fpdf_font/ttgsubtable.cpp904
-rw-r--r--core/src/fpdfapi/fpdf_font/ttgsubtable.h838
-rw-r--r--core/src/fpdfapi/fpdf_page/fpdf_page.cpp2094
-rw-r--r--core/src/fpdfapi/fpdf_page/fpdf_page_colors.cpp2802
-rw-r--r--core/src/fpdfapi/fpdf_page/fpdf_page_doc.cpp1294
-rw-r--r--core/src/fpdfapi/fpdf_page/fpdf_page_func.cpp1772
-rw-r--r--core/src/fpdfapi/fpdf_page/fpdf_page_graph_state.cpp1414
-rw-r--r--core/src/fpdfapi/fpdf_page/fpdf_page_image.cpp232
-rw-r--r--core/src/fpdfapi/fpdf_page/fpdf_page_parser.cpp3362
-rw-r--r--core/src/fpdfapi/fpdf_page/fpdf_page_parser_new.cpp1644
-rw-r--r--core/src/fpdfapi/fpdf_page/fpdf_page_parser_old.cpp2292
-rw-r--r--core/src/fpdfapi/fpdf_page/fpdf_page_path.cpp104
-rw-r--r--core/src/fpdfapi/fpdf_page/fpdf_page_pattern.cpp556
-rw-r--r--core/src/fpdfapi/fpdf_page/pageint.h1010
-rw-r--r--core/src/fpdfapi/fpdf_parser/filters_int.h238
-rw-r--r--core/src/fpdfapi/fpdf_parser/fpdf_parser_decode.cpp1066
-rw-r--r--core/src/fpdfapi/fpdf_parser/fpdf_parser_document.cpp796
-rw-r--r--core/src/fpdfapi/fpdf_parser/fpdf_parser_encrypt.cpp1914
-rw-r--r--core/src/fpdfapi/fpdf_parser/fpdf_parser_fdf.cpp448
-rw-r--r--core/src/fpdfapi/fpdf_parser/fpdf_parser_filters.cpp1818
-rw-r--r--core/src/fpdfapi/fpdf_parser/fpdf_parser_objects.cpp2688
-rw-r--r--core/src/fpdfapi/fpdf_parser/fpdf_parser_utility.cpp906
-rw-r--r--core/src/fpdfapi/fpdf_render/fpdf_render.cpp2976
-rw-r--r--core/src/fpdfapi/fpdf_render/fpdf_render_cache.cpp778
-rw-r--r--core/src/fpdfapi/fpdf_render/fpdf_render_image.cpp2330
-rw-r--r--core/src/fpdfapi/fpdf_render/fpdf_render_loadimage.cpp3048
-rw-r--r--core/src/fpdfapi/fpdf_render/fpdf_render_pattern.cpp2186
-rw-r--r--core/src/fpdfapi/fpdf_render/fpdf_render_text.cpp1520
-rw-r--r--core/src/fpdfapi/fpdf_render/render_int.h924
-rw-r--r--core/src/fpdfdoc/doc_action.cpp724
-rw-r--r--core/src/fpdfdoc/doc_annot.cpp1038
-rw-r--r--core/src/fpdfdoc/doc_ap.cpp1616
-rw-r--r--core/src/fpdfdoc/doc_basic.cpp1134
-rw-r--r--core/src/fpdfdoc/doc_bookmark.cpp182
-rw-r--r--core/src/fpdfdoc/doc_form.cpp3328
-rw-r--r--core/src/fpdfdoc/doc_formcontrol.cpp922
-rw-r--r--core/src/fpdfdoc/doc_formfield.cpp2190
-rw-r--r--core/src/fpdfdoc/doc_link.cpp210
-rw-r--r--core/src/fpdfdoc/doc_metadata.cpp304
-rw-r--r--core/src/fpdfdoc/doc_ocg.cpp600
-rw-r--r--core/src/fpdfdoc/doc_tagged.cpp896
-rw-r--r--core/src/fpdfdoc/doc_utils.cpp1498
-rw-r--r--core/src/fpdfdoc/doc_viewerPreferences.cpp62
-rw-r--r--core/src/fpdfdoc/doc_vt.cpp3728
-rw-r--r--core/src/fpdfdoc/doc_vtmodule.cpp34
-rw-r--r--core/src/fpdfdoc/pdf_vt.h1284
-rw-r--r--core/src/fpdfdoc/tagged_int.h182
-rw-r--r--core/src/fpdftext/fpdf_text.cpp1582
-rw-r--r--core/src/fpdftext/fpdf_text_int.cpp5608
-rw-r--r--core/src/fpdftext/fpdf_text_search.cpp650
-rw-r--r--core/src/fpdftext/text_int.h430
-rw-r--r--core/src/fpdftext/txtproc.h140
-rw-r--r--core/src/fpdftext/unicodenormalization.cpp150
-rw-r--r--core/src/fpdftext/unicodenormalizationdata.cpp9322
-rw-r--r--core/src/fx_freetype.h30
-rw-r--r--core/src/fx_jpeglib.h20
-rw-r--r--core/src/fx_zlib.h20
-rw-r--r--core/src/fxcodec/codec/codec_int.h540
-rw-r--r--core/src/fxcodec/codec/fx_codec.cpp894
-rw-r--r--core/src/fxcodec/codec/fx_codec_fax.cpp1936
-rw-r--r--core/src/fxcodec/codec/fx_codec_flate.cpp1890
-rw-r--r--core/src/fxcodec/codec/fx_codec_icc.cpp2720
-rw-r--r--core/src/fxcodec/codec/fx_codec_jbig.cpp424
-rw-r--r--core/src/fxcodec/codec/fx_codec_jpeg.cpp1470
-rw-r--r--core/src/fxcodec/codec/fx_codec_jpx_opj.cpp1598
-rw-r--r--core/src/fxcodec/jbig2/JBig2_ArithDecoder.h252
-rw-r--r--core/src/fxcodec/jbig2/JBig2_ArithIntDecoder.cpp210
-rw-r--r--core/src/fxcodec/jbig2/JBig2_ArithIntDecoder.h78
-rw-r--r--core/src/fxcodec/jbig2/JBig2_ArithQe.h128
-rw-r--r--core/src/fxcodec/jbig2/JBig2_BitStream.h632
-rw-r--r--core/src/fxcodec/jbig2/JBig2_Context.cpp3624
-rw-r--r--core/src/fxcodec/jbig2/JBig2_Context.h270
-rw-r--r--core/src/fxcodec/jbig2/JBig2_Define.h68
-rw-r--r--core/src/fxcodec/jbig2/JBig2_GeneralDecoder.cpp8580
-rw-r--r--core/src/fxcodec/jbig2/JBig2_GeneralDecoder.h556
-rw-r--r--core/src/fxcodec/jbig2/JBig2_HuffmanDecoder.cpp110
-rw-r--r--core/src/fxcodec/jbig2/JBig2_HuffmanDecoder.h48
-rw-r--r--core/src/fxcodec/jbig2/JBig2_HuffmanTable.cpp386
-rw-r--r--core/src/fxcodec/jbig2/JBig2_HuffmanTable.h84
-rw-r--r--core/src/fxcodec/jbig2/JBig2_HuffmanTable_Standard.h502
-rw-r--r--core/src/fxcodec/jbig2/JBig2_Image.cpp3238
-rw-r--r--core/src/fxcodec/jbig2/JBig2_Image.h136
-rw-r--r--core/src/fxcodec/jbig2/JBig2_List.h134
-rw-r--r--core/src/fxcodec/jbig2/JBig2_Module.h64
-rw-r--r--core/src/fxcodec/jbig2/JBig2_Object.cpp144
-rw-r--r--core/src/fxcodec/jbig2/JBig2_Object.h86
-rw-r--r--core/src/fxcodec/jbig2/JBig2_Page.h38
-rw-r--r--core/src/fxcodec/jbig2/JBig2_PatternDict.cpp48
-rw-r--r--core/src/fxcodec/jbig2/JBig2_PatternDict.h44
-rw-r--r--core/src/fxcodec/jbig2/JBig2_Segment.cpp106
-rw-r--r--core/src/fxcodec/jbig2/JBig2_Segment.h136
-rw-r--r--core/src/fxcodec/jbig2/JBig2_SymbolDict.cpp68
-rw-r--r--core/src/fxcodec/jbig2/JBig2_SymbolDict.h52
-rw-r--r--core/src/fxcodec/lcms2/include/fx_lcms2.h20
-rw-r--r--core/src/fxcodec/lcms2/include/fx_lcms2_plugin.h20
-rw-r--r--core/src/fxcodec/lcms2/lcms2-2.6/src/cmserr.c88
-rw-r--r--core/src/fxcodec/lcms2/lcms2-2.6/src/cmsgmt.c1180
-rw-r--r--core/src/fxcodec/lcms2/src/fx_cmscam02.c14
-rw-r--r--core/src/fxcodec/lcms2/src/fx_cmscgats.c14
-rw-r--r--core/src/fxcodec/lcms2/src/fx_cmscnvrt.c14
-rw-r--r--core/src/fxcodec/lcms2/src/fx_cmserr.c14
-rw-r--r--core/src/fxcodec/lcms2/src/fx_cmsgamma.c14
-rw-r--r--core/src/fxcodec/lcms2/src/fx_cmsgmt.c14
-rw-r--r--core/src/fxcodec/lcms2/src/fx_cmshalf.c14
-rw-r--r--core/src/fxcodec/lcms2/src/fx_cmsintrp.c14
-rw-r--r--core/src/fxcodec/lcms2/src/fx_cmsio0.c14
-rw-r--r--core/src/fxcodec/lcms2/src/fx_cmsio1.c14
-rw-r--r--core/src/fxcodec/lcms2/src/fx_cmslut.c14
-rw-r--r--core/src/fxcodec/lcms2/src/fx_cmsmd5.c14
-rw-r--r--core/src/fxcodec/lcms2/src/fx_cmsmtrx.c14
-rw-r--r--core/src/fxcodec/lcms2/src/fx_cmsnamed.c14
-rw-r--r--core/src/fxcodec/lcms2/src/fx_cmsopt.c14
-rw-r--r--core/src/fxcodec/lcms2/src/fx_cmspack.c14
-rw-r--r--core/src/fxcodec/lcms2/src/fx_cmspcs.c14
-rw-r--r--core/src/fxcodec/lcms2/src/fx_cmsplugin.c14
-rw-r--r--core/src/fxcodec/lcms2/src/fx_cmsps2.c14
-rw-r--r--core/src/fxcodec/lcms2/src/fx_cmssamp.c14
-rw-r--r--core/src/fxcodec/lcms2/src/fx_cmssm.c14
-rw-r--r--core/src/fxcodec/lcms2/src/fx_cmstypes.c14
-rw-r--r--core/src/fxcodec/lcms2/src/fx_cmsvirt.c14
-rw-r--r--core/src/fxcodec/lcms2/src/fx_cmswtpnt.c14
-rw-r--r--core/src/fxcodec/lcms2/src/fx_cmsxform.c14
-rw-r--r--core/src/fxcodec/libjpeg/cderror.h264
-rw-r--r--core/src/fxcodec/libjpeg/cdjpeg.h368
-rw-r--r--core/src/fxcodec/libjpeg/fpdfapi_jcapimin.c566
-rw-r--r--core/src/fxcodec/libjpeg/fpdfapi_jcapistd.c328
-rw-r--r--core/src/fxcodec/libjpeg/fpdfapi_jccoefct.c904
-rw-r--r--core/src/fxcodec/libjpeg/fpdfapi_jccolor.c924
-rw-r--r--core/src/fxcodec/libjpeg/fpdfapi_jcdctmgr.c780
-rw-r--r--core/src/fxcodec/libjpeg/fpdfapi_jchuff.c1830
-rw-r--r--core/src/fxcodec/libjpeg/fpdfapi_jcinit.c150
-rw-r--r--core/src/fxcodec/libjpeg/fpdfapi_jcmainct.c592
-rw-r--r--core/src/fxcodec/libjpeg/fpdfapi_jcmarker.c1334
-rw-r--r--core/src/fxcodec/libjpeg/fpdfapi_jcmaster.c1186
-rw-r--r--core/src/fxcodec/libjpeg/fpdfapi_jcomapi.c218
-rw-r--r--core/src/fxcodec/libjpeg/fpdfapi_jcparam.c1226
-rw-r--r--core/src/fxcodec/libjpeg/fpdfapi_jcphuff.c1672
-rw-r--r--core/src/fxcodec/libjpeg/fpdfapi_jcprepct.c714
-rw-r--r--core/src/fxcodec/libjpeg/fpdfapi_jcsample.c1044
-rw-r--r--core/src/fxcodec/libjpeg/fpdfapi_jctrans.c782
-rw-r--r--core/src/fxcodec/libjpeg/fpdfapi_jdapimin.c796
-rw-r--r--core/src/fxcodec/libjpeg/fpdfapi_jdapistd.c558
-rw-r--r--core/src/fxcodec/libjpeg/fpdfapi_jdcoefct.c1478
-rw-r--r--core/src/fxcodec/libjpeg/fpdfapi_jdcolor.c798
-rw-r--r--core/src/fxcodec/libjpeg/fpdfapi_jddctmgr.c544
-rw-r--r--core/src/fxcodec/libjpeg/fpdfapi_jdhuff.c1314
-rw-r--r--core/src/fxcodec/libjpeg/fpdfapi_jdinput.c768
-rw-r--r--core/src/fxcodec/libjpeg/fpdfapi_jdmainct.c1030
-rw-r--r--core/src/fxcodec/libjpeg/fpdfapi_jdmarker.c2792
-rw-r--r--core/src/fxcodec/libjpeg/fpdfapi_jdmaster.c1120
-rw-r--r--core/src/fxcodec/libjpeg/fpdfapi_jdmerge.c812
-rw-r--r--core/src/fxcodec/libjpeg/fpdfapi_jdphuff.c1342
-rw-r--r--core/src/fxcodec/libjpeg/fpdfapi_jdpostct.c586
-rw-r--r--core/src/fxcodec/libjpeg/fpdfapi_jdsample.c962
-rw-r--r--core/src/fxcodec/libjpeg/fpdfapi_jdtrans.c292
-rw-r--r--core/src/fxcodec/libjpeg/fpdfapi_jerror.c510
-rw-r--r--core/src/fxcodec/libjpeg/fpdfapi_jfdctfst.c454
-rw-r--r--core/src/fxcodec/libjpeg/fpdfapi_jfdctint.c572
-rw-r--r--core/src/fxcodec/libjpeg/fpdfapi_jidctfst.c742
-rw-r--r--core/src/fxcodec/libjpeg/fpdfapi_jidctint.c784
-rw-r--r--core/src/fxcodec/libjpeg/fpdfapi_jidctred.c802
-rw-r--r--core/src/fxcodec/libjpeg/fpdfapi_jmemmgr.c2246
-rw-r--r--core/src/fxcodec/libjpeg/fpdfapi_jmemnobs.c252
-rw-r--r--core/src/fxcodec/libjpeg/fpdfapi_jutils.c364
-rw-r--r--core/src/fxcodec/libjpeg/jchuff.h94
-rw-r--r--core/src/fxcodec/libjpeg/jconfig.h90
-rw-r--r--core/src/fxcodec/libjpeg/jdct.h352
-rw-r--r--core/src/fxcodec/libjpeg/jdhuff.h402
-rw-r--r--core/src/fxcodec/libjpeg/jerror.h582
-rw-r--r--core/src/fxcodec/libjpeg/jinclude.h204
-rw-r--r--core/src/fxcodec/libjpeg/jmemsys.h400
-rw-r--r--core/src/fxcodec/libjpeg/jmorecfg.h752
-rw-r--r--core/src/fxcodec/libjpeg/jpegint.h784
-rw-r--r--core/src/fxcodec/libjpeg/jpeglib.h2330
-rw-r--r--core/src/fxcodec/libjpeg/jversion.h28
-rw-r--r--core/src/fxcodec/libjpeg/transupp.h270
-rw-r--r--core/src/fxcrt/extension.h826
-rw-r--r--core/src/fxcrt/fx_basic_array.cpp730
-rw-r--r--core/src/fxcrt/fx_basic_bstring.cpp2408
-rw-r--r--core/src/fxcrt/fx_basic_buffer.cpp1148
-rw-r--r--core/src/fxcrt/fx_basic_coords.cpp1112
-rw-r--r--core/src/fxcrt/fx_basic_gcc.cpp464
-rw-r--r--core/src/fxcrt/fx_basic_list.cpp282
-rw-r--r--core/src/fxcrt/fx_basic_maps.cpp1308
-rw-r--r--core/src/fxcrt/fx_basic_memmgr.cpp612
-rw-r--r--core/src/fxcrt/fx_basic_memmgr_mini.cpp1644
-rw-r--r--core/src/fxcrt/fx_basic_plex.cpp56
-rw-r--r--core/src/fxcrt/fx_basic_utf.cpp204
-rw-r--r--core/src/fxcrt/fx_basic_util.cpp888
-rw-r--r--core/src/fxcrt/fx_basic_wstring.cpp2336
-rw-r--r--core/src/fxcrt/fx_extension.cpp802
-rw-r--r--core/src/fxcrt/fx_xml_composer.cpp84
-rw-r--r--core/src/fxcrt/fx_xml_parser.cpp2034
-rw-r--r--core/src/fxcrt/fxcrt_platforms.cpp406
-rw-r--r--core/src/fxcrt/fxcrt_platforms.h70
-rw-r--r--core/src/fxcrt/fxcrt_posix.cpp402
-rw-r--r--core/src/fxcrt/fxcrt_posix.h66
-rw-r--r--core/src/fxcrt/fxcrt_windows.cpp444
-rw-r--r--core/src/fxcrt/fxcrt_windows.h66
-rw-r--r--core/src/fxcrt/mem_int.h464
-rw-r--r--core/src/fxcrt/plex.h30
-rw-r--r--core/src/fxcrt/xml_int.h356
-rw-r--r--core/src/fxge/Microsoft SDK/include/DWrite.h10012
-rw-r--r--core/src/fxge/Microsoft SDK/include/Dcommon.h130
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlus.h312
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlusBase.h80
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlusBitmap.h2008
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlusBrush.h1902
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlusCachedBitmap.h142
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlusColor.h418
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlusColorMatrix.h126
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlusEnums.h2504
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlusFlat.h5480
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlusFont.h598
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlusFontCollection.h298
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlusFontFamily.h542
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlusGpStubs.h214
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlusGraphics.h5452
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlusHeaders.h1586
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlusImageCodec.h146
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlusImaging.h1080
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlusLineCaps.h506
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlusMatrix.h618
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlusMem.h98
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlusMetaFile.h748
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlusMetaHeader.h426
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlusPath.h3372
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlusPen.h1038
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlusPixelFormats.h402
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlusRegion.h996
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlusStringFormat.h762
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlusTypes.h1652
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlusimageAttributes.h794
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiplusInit.h208
-rw-r--r--core/src/fxge/Microsoft SDK/include/sal.h1458
-rw-r--r--core/src/fxge/Microsoft SDK/include/specstrings.h1956
-rw-r--r--core/src/fxge/apple/apple_int.h492
-rw-r--r--core/src/fxge/apple/fx_apple_platform.cpp346
-rw-r--r--core/src/fxge/apple/fx_mac_imp.cpp234
-rw-r--r--core/src/fxge/apple/fx_quartz_device.cpp2276
-rw-r--r--core/src/fxge/dib/dib_int.h176
-rw-r--r--core/src/fxge/dib/fx_dib_composite.cpp9204
-rw-r--r--core/src/fxge/dib/fx_dib_convert.cpp2180
-rw-r--r--core/src/fxge/dib/fx_dib_engine.cpp1734
-rw-r--r--core/src/fxge/dib/fx_dib_main.cpp3468
-rw-r--r--core/src/fxge/dib/fx_dib_transform.cpp1594
-rw-r--r--core/src/fxge/ge/fx_ge.cpp158
-rw-r--r--core/src/fxge/ge/fx_ge_device.cpp810
-rw-r--r--core/src/fxge/ge/fx_ge_font.cpp916
-rw-r--r--core/src/fxge/ge/fx_ge_fontmap.cpp3116
-rw-r--r--core/src/fxge/ge/fx_ge_linux.cpp518
-rw-r--r--core/src/fxge/ge/fx_ge_path.cpp1308
-rw-r--r--core/src/fxge/ge/fx_ge_ps.cpp1314
-rw-r--r--core/src/fxge/ge/fx_ge_text.cpp3548
-rw-r--r--core/src/fxge/ge/text_int.h200
-rw-r--r--core/src/fxge/win32/dwrite_int.h118
-rw-r--r--core/src/fxge/win32/fx_win32_device.cpp2400
-rw-r--r--core/src/fxge/win32/fx_win32_dib.cpp620
-rw-r--r--core/src/fxge/win32/fx_win32_dwrite.cpp960
-rw-r--r--core/src/fxge/win32/fx_win32_gdipext.cpp2572
-rw-r--r--core/src/fxge/win32/fx_win32_print.cpp852
-rw-r--r--core/src/fxge/win32/win32_int.h476
317 files changed, 170549 insertions, 170549 deletions
diff --git a/core/src/fdrm/crypto/fx_crypt.cpp b/core/src/fdrm/crypto/fx_crypt.cpp
index 0f1bf5f997..8128f91f89 100644
--- a/core/src/fdrm/crypto/fx_crypt.cpp
+++ b/core/src/fdrm/crypto/fx_crypt.cpp
@@ -1,259 +1,259 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../../include/fxcrt/fx_basic.h"
-#include "../../../include/fdrm/fx_crypt.h"
-#ifdef __cplusplus
-extern "C" {
-#endif
-struct rc4_state {
- int x, y, m[256];
-};
-void CRYPT_ArcFourSetup(void* context, FX_LPCBYTE key, FX_DWORD length )
-{
- rc4_state *s = (rc4_state*)context;
- int i, j, k, *m, a;
- s->x = 0;
- s->y = 0;
- m = s->m;
- for( i = 0; i < 256; i++ ) {
- m[i] = i;
- }
- j = k = 0;
- for( i = 0; i < 256; i++ ) {
- a = m[i];
- j = ( j + a + key[k] ) & 0xFF;
- m[i] = m[j];
- m[j] = a;
- if( ++k >= (int)length ) {
- k = 0;
- }
- }
-}
-void CRYPT_ArcFourCrypt(void* context, unsigned char *data, FX_DWORD length )
-{
- struct rc4_state* s = (struct rc4_state*)context;
- int i, x, y, *m, a, b;
- x = s->x;
- y = s->y;
- m = s->m;
- for( i = 0; i < (int)length; i++ ) {
- x = ( x + 1 ) & 0xFF;
- a = m[x];
- y = ( y + a ) & 0xFF;
- m[x] = b = m[y];
- m[y] = a;
- data[i] ^= m[( a + b ) & 0xFF];
- }
- s->x = x;
- s->y = y;
-}
-void CRYPT_ArcFourCryptBlock(FX_LPBYTE pData, FX_DWORD size, FX_LPCBYTE key, FX_DWORD keylen)
-{
- rc4_state s;
- CRYPT_ArcFourSetup(&s, key, keylen);
- CRYPT_ArcFourCrypt(&s, pData, size);
-}
-struct md5_context {
- FX_DWORD total[2];
- FX_DWORD state[4];
- FX_BYTE buffer[64];
-};
-#define GET_FX_DWORD(n,b,i) \
- { \
- (n) = (FX_DWORD) ((FX_BYTE *) b)[(i)] \
- | (((FX_DWORD) ((FX_BYTE *) b)[(i)+1]) << 8) \
- | (((FX_DWORD) ((FX_BYTE *) b)[(i)+2]) << 16) \
- | (((FX_DWORD) ((FX_BYTE *) b)[(i)+3]) << 24); \
- }
-#define PUT_FX_DWORD(n,b,i) \
- { \
- (((FX_BYTE *) b)[(i)] ) = (FX_BYTE) (((n) ) & 0xFF); \
- (((FX_BYTE *) b)[(i)+1]) = (FX_BYTE) (((n) >> 8) & 0xFF); \
- (((FX_BYTE *) b)[(i)+2]) = (FX_BYTE) (((n) >> 16) & 0xFF); \
- (((FX_BYTE *) b)[(i)+3]) = (FX_BYTE) (((n) >> 24) & 0xFF); \
- }
-void md5_process( struct md5_context *ctx, const FX_BYTE data[64] )
-{
- FX_DWORD A, B, C, D, X[16];
- GET_FX_DWORD( X[0], data, 0 );
- GET_FX_DWORD( X[1], data, 4 );
- GET_FX_DWORD( X[2], data, 8 );
- GET_FX_DWORD( X[3], data, 12 );
- GET_FX_DWORD( X[4], data, 16 );
- GET_FX_DWORD( X[5], data, 20 );
- GET_FX_DWORD( X[6], data, 24 );
- GET_FX_DWORD( X[7], data, 28 );
- GET_FX_DWORD( X[8], data, 32 );
- GET_FX_DWORD( X[9], data, 36 );
- GET_FX_DWORD( X[10], data, 40 );
- GET_FX_DWORD( X[11], data, 44 );
- GET_FX_DWORD( X[12], data, 48 );
- GET_FX_DWORD( X[13], data, 52 );
- GET_FX_DWORD( X[14], data, 56 );
- GET_FX_DWORD( X[15], data, 60 );
-#define S(x,n) ((x << n) | ((x & 0xFFFFFFFF) >> (32 - n)))
-#define P(a,b,c,d,k,s,t) \
- { \
- a += F(b,c,d) + X[k] + t; a = S(a,s) + b; \
- }
- A = ctx->state[0];
- B = ctx->state[1];
- C = ctx->state[2];
- D = ctx->state[3];
-#define F(x,y,z) (z ^ (x & (y ^ z)))
- P( A, B, C, D, 0, 7, 0xD76AA478 );
- P( D, A, B, C, 1, 12, 0xE8C7B756 );
- P( C, D, A, B, 2, 17, 0x242070DB );
- P( B, C, D, A, 3, 22, 0xC1BDCEEE );
- P( A, B, C, D, 4, 7, 0xF57C0FAF );
- P( D, A, B, C, 5, 12, 0x4787C62A );
- P( C, D, A, B, 6, 17, 0xA8304613 );
- P( B, C, D, A, 7, 22, 0xFD469501 );
- P( A, B, C, D, 8, 7, 0x698098D8 );
- P( D, A, B, C, 9, 12, 0x8B44F7AF );
- P( C, D, A, B, 10, 17, 0xFFFF5BB1 );
- P( B, C, D, A, 11, 22, 0x895CD7BE );
- P( A, B, C, D, 12, 7, 0x6B901122 );
- P( D, A, B, C, 13, 12, 0xFD987193 );
- P( C, D, A, B, 14, 17, 0xA679438E );
- P( B, C, D, A, 15, 22, 0x49B40821 );
-#undef F
-#define F(x,y,z) (y ^ (z & (x ^ y)))
- P( A, B, C, D, 1, 5, 0xF61E2562 );
- P( D, A, B, C, 6, 9, 0xC040B340 );
- P( C, D, A, B, 11, 14, 0x265E5A51 );
- P( B, C, D, A, 0, 20, 0xE9B6C7AA );
- P( A, B, C, D, 5, 5, 0xD62F105D );
- P( D, A, B, C, 10, 9, 0x02441453 );
- P( C, D, A, B, 15, 14, 0xD8A1E681 );
- P( B, C, D, A, 4, 20, 0xE7D3FBC8 );
- P( A, B, C, D, 9, 5, 0x21E1CDE6 );
- P( D, A, B, C, 14, 9, 0xC33707D6 );
- P( C, D, A, B, 3, 14, 0xF4D50D87 );
- P( B, C, D, A, 8, 20, 0x455A14ED );
- P( A, B, C, D, 13, 5, 0xA9E3E905 );
- P( D, A, B, C, 2, 9, 0xFCEFA3F8 );
- P( C, D, A, B, 7, 14, 0x676F02D9 );
- P( B, C, D, A, 12, 20, 0x8D2A4C8A );
-#undef F
-#define F(x,y,z) (x ^ y ^ z)
- P( A, B, C, D, 5, 4, 0xFFFA3942 );
- P( D, A, B, C, 8, 11, 0x8771F681 );
- P( C, D, A, B, 11, 16, 0x6D9D6122 );
- P( B, C, D, A, 14, 23, 0xFDE5380C );
- P( A, B, C, D, 1, 4, 0xA4BEEA44 );
- P( D, A, B, C, 4, 11, 0x4BDECFA9 );
- P( C, D, A, B, 7, 16, 0xF6BB4B60 );
- P( B, C, D, A, 10, 23, 0xBEBFBC70 );
- P( A, B, C, D, 13, 4, 0x289B7EC6 );
- P( D, A, B, C, 0, 11, 0xEAA127FA );
- P( C, D, A, B, 3, 16, 0xD4EF3085 );
- P( B, C, D, A, 6, 23, 0x04881D05 );
- P( A, B, C, D, 9, 4, 0xD9D4D039 );
- P( D, A, B, C, 12, 11, 0xE6DB99E5 );
- P( C, D, A, B, 15, 16, 0x1FA27CF8 );
- P( B, C, D, A, 2, 23, 0xC4AC5665 );
-#undef F
-#define F(x,y,z) (y ^ (x | ~z))
- P( A, B, C, D, 0, 6, 0xF4292244 );
- P( D, A, B, C, 7, 10, 0x432AFF97 );
- P( C, D, A, B, 14, 15, 0xAB9423A7 );
- P( B, C, D, A, 5, 21, 0xFC93A039 );
- P( A, B, C, D, 12, 6, 0x655B59C3 );
- P( D, A, B, C, 3, 10, 0x8F0CCC92 );
- P( C, D, A, B, 10, 15, 0xFFEFF47D );
- P( B, C, D, A, 1, 21, 0x85845DD1 );
- P( A, B, C, D, 8, 6, 0x6FA87E4F );
- P( D, A, B, C, 15, 10, 0xFE2CE6E0 );
- P( C, D, A, B, 6, 15, 0xA3014314 );
- P( B, C, D, A, 13, 21, 0x4E0811A1 );
- P( A, B, C, D, 4, 6, 0xF7537E82 );
- P( D, A, B, C, 11, 10, 0xBD3AF235 );
- P( C, D, A, B, 2, 15, 0x2AD7D2BB );
- P( B, C, D, A, 9, 21, 0xEB86D391 );
-#undef F
- ctx->state[0] += A;
- ctx->state[1] += B;
- ctx->state[2] += C;
- ctx->state[3] += D;
-}
-void CRYPT_MD5Start(void* context)
-{
- struct md5_context *ctx = (struct md5_context*)context;
- ctx->total[0] = 0;
- ctx->total[1] = 0;
- ctx->state[0] = 0x67452301;
- ctx->state[1] = 0xEFCDAB89;
- ctx->state[2] = 0x98BADCFE;
- ctx->state[3] = 0x10325476;
-}
-void CRYPT_MD5Update(FX_LPVOID pctx, FX_LPCBYTE input, FX_DWORD length )
-{
- struct md5_context *ctx = (struct md5_context *)pctx;
- FX_DWORD left, fill;
- if( ! length ) {
- return;
- }
- left = ( ctx->total[0] >> 3 ) & 0x3F;
- fill = 64 - left;
- ctx->total[0] += length << 3;
- ctx->total[1] += length >> 29;
- ctx->total[0] &= 0xFFFFFFFF;
- ctx->total[1] += ctx->total[0] < length << 3;
- if( left && length >= fill ) {
- FXSYS_memcpy32( (void *) (ctx->buffer + left), (void *) input, fill );
- md5_process( ctx, ctx->buffer );
- length -= fill;
- input += fill;
- left = 0;
- }
- while( length >= 64 ) {
- md5_process( ctx, input );
- length -= 64;
- input += 64;
- }
- if( length ) {
- FXSYS_memcpy32( (void *) (ctx->buffer + left), (void *) input, length );
- }
-}
-const FX_BYTE md5_padding[64] = {
- 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
-};
-void CRYPT_MD5Finish(FX_LPVOID pctx, FX_BYTE digest[16] )
-{
- struct md5_context *ctx = (struct md5_context *)pctx;
- FX_DWORD last, padn;
- FX_BYTE msglen[8];
- PUT_FX_DWORD( ctx->total[0], msglen, 0 );
- PUT_FX_DWORD( ctx->total[1], msglen, 4 );
- last = ( ctx->total[0] >> 3 ) & 0x3F;
- padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last );
- CRYPT_MD5Update( ctx, md5_padding, padn );
- CRYPT_MD5Update( ctx, msglen, 8 );
- PUT_FX_DWORD( ctx->state[0], digest, 0 );
- PUT_FX_DWORD( ctx->state[1], digest, 4 );
- PUT_FX_DWORD( ctx->state[2], digest, 8 );
- PUT_FX_DWORD( ctx->state[3], digest, 12 );
-}
-void CRYPT_MD5Generate(FX_LPCBYTE input, FX_DWORD length, FX_BYTE digest[16])
-{
- md5_context ctx;
- CRYPT_MD5Start(&ctx);
- CRYPT_MD5Update(&ctx, input, length);
- CRYPT_MD5Finish(&ctx, digest);
-}
-static FX_BOOL (*g_PubKeyDecryptor)(FX_LPCBYTE pData, FX_DWORD size, FX_LPBYTE data_buf, FX_DWORD& data_len) = NULL;
-void CRYPT_SetPubKeyDecryptor(FX_BOOL (*func)(FX_LPCBYTE pData, FX_DWORD size, FX_LPBYTE data_buf, FX_DWORD& data_len))
-{
- g_PubKeyDecryptor = func;
-}
-#ifdef __cplusplus
-};
-#endif
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxcrt/fx_basic.h"
+#include "../../../include/fdrm/fx_crypt.h"
+#ifdef __cplusplus
+extern "C" {
+#endif
+struct rc4_state {
+ int x, y, m[256];
+};
+void CRYPT_ArcFourSetup(void* context, FX_LPCBYTE key, FX_DWORD length )
+{
+ rc4_state *s = (rc4_state*)context;
+ int i, j, k, *m, a;
+ s->x = 0;
+ s->y = 0;
+ m = s->m;
+ for( i = 0; i < 256; i++ ) {
+ m[i] = i;
+ }
+ j = k = 0;
+ for( i = 0; i < 256; i++ ) {
+ a = m[i];
+ j = ( j + a + key[k] ) & 0xFF;
+ m[i] = m[j];
+ m[j] = a;
+ if( ++k >= (int)length ) {
+ k = 0;
+ }
+ }
+}
+void CRYPT_ArcFourCrypt(void* context, unsigned char *data, FX_DWORD length )
+{
+ struct rc4_state* s = (struct rc4_state*)context;
+ int i, x, y, *m, a, b;
+ x = s->x;
+ y = s->y;
+ m = s->m;
+ for( i = 0; i < (int)length; i++ ) {
+ x = ( x + 1 ) & 0xFF;
+ a = m[x];
+ y = ( y + a ) & 0xFF;
+ m[x] = b = m[y];
+ m[y] = a;
+ data[i] ^= m[( a + b ) & 0xFF];
+ }
+ s->x = x;
+ s->y = y;
+}
+void CRYPT_ArcFourCryptBlock(FX_LPBYTE pData, FX_DWORD size, FX_LPCBYTE key, FX_DWORD keylen)
+{
+ rc4_state s;
+ CRYPT_ArcFourSetup(&s, key, keylen);
+ CRYPT_ArcFourCrypt(&s, pData, size);
+}
+struct md5_context {
+ FX_DWORD total[2];
+ FX_DWORD state[4];
+ FX_BYTE buffer[64];
+};
+#define GET_FX_DWORD(n,b,i) \
+ { \
+ (n) = (FX_DWORD) ((FX_BYTE *) b)[(i)] \
+ | (((FX_DWORD) ((FX_BYTE *) b)[(i)+1]) << 8) \
+ | (((FX_DWORD) ((FX_BYTE *) b)[(i)+2]) << 16) \
+ | (((FX_DWORD) ((FX_BYTE *) b)[(i)+3]) << 24); \
+ }
+#define PUT_FX_DWORD(n,b,i) \
+ { \
+ (((FX_BYTE *) b)[(i)] ) = (FX_BYTE) (((n) ) & 0xFF); \
+ (((FX_BYTE *) b)[(i)+1]) = (FX_BYTE) (((n) >> 8) & 0xFF); \
+ (((FX_BYTE *) b)[(i)+2]) = (FX_BYTE) (((n) >> 16) & 0xFF); \
+ (((FX_BYTE *) b)[(i)+3]) = (FX_BYTE) (((n) >> 24) & 0xFF); \
+ }
+void md5_process( struct md5_context *ctx, const FX_BYTE data[64] )
+{
+ FX_DWORD A, B, C, D, X[16];
+ GET_FX_DWORD( X[0], data, 0 );
+ GET_FX_DWORD( X[1], data, 4 );
+ GET_FX_DWORD( X[2], data, 8 );
+ GET_FX_DWORD( X[3], data, 12 );
+ GET_FX_DWORD( X[4], data, 16 );
+ GET_FX_DWORD( X[5], data, 20 );
+ GET_FX_DWORD( X[6], data, 24 );
+ GET_FX_DWORD( X[7], data, 28 );
+ GET_FX_DWORD( X[8], data, 32 );
+ GET_FX_DWORD( X[9], data, 36 );
+ GET_FX_DWORD( X[10], data, 40 );
+ GET_FX_DWORD( X[11], data, 44 );
+ GET_FX_DWORD( X[12], data, 48 );
+ GET_FX_DWORD( X[13], data, 52 );
+ GET_FX_DWORD( X[14], data, 56 );
+ GET_FX_DWORD( X[15], data, 60 );
+#define S(x,n) ((x << n) | ((x & 0xFFFFFFFF) >> (32 - n)))
+#define P(a,b,c,d,k,s,t) \
+ { \
+ a += F(b,c,d) + X[k] + t; a = S(a,s) + b; \
+ }
+ A = ctx->state[0];
+ B = ctx->state[1];
+ C = ctx->state[2];
+ D = ctx->state[3];
+#define F(x,y,z) (z ^ (x & (y ^ z)))
+ P( A, B, C, D, 0, 7, 0xD76AA478 );
+ P( D, A, B, C, 1, 12, 0xE8C7B756 );
+ P( C, D, A, B, 2, 17, 0x242070DB );
+ P( B, C, D, A, 3, 22, 0xC1BDCEEE );
+ P( A, B, C, D, 4, 7, 0xF57C0FAF );
+ P( D, A, B, C, 5, 12, 0x4787C62A );
+ P( C, D, A, B, 6, 17, 0xA8304613 );
+ P( B, C, D, A, 7, 22, 0xFD469501 );
+ P( A, B, C, D, 8, 7, 0x698098D8 );
+ P( D, A, B, C, 9, 12, 0x8B44F7AF );
+ P( C, D, A, B, 10, 17, 0xFFFF5BB1 );
+ P( B, C, D, A, 11, 22, 0x895CD7BE );
+ P( A, B, C, D, 12, 7, 0x6B901122 );
+ P( D, A, B, C, 13, 12, 0xFD987193 );
+ P( C, D, A, B, 14, 17, 0xA679438E );
+ P( B, C, D, A, 15, 22, 0x49B40821 );
+#undef F
+#define F(x,y,z) (y ^ (z & (x ^ y)))
+ P( A, B, C, D, 1, 5, 0xF61E2562 );
+ P( D, A, B, C, 6, 9, 0xC040B340 );
+ P( C, D, A, B, 11, 14, 0x265E5A51 );
+ P( B, C, D, A, 0, 20, 0xE9B6C7AA );
+ P( A, B, C, D, 5, 5, 0xD62F105D );
+ P( D, A, B, C, 10, 9, 0x02441453 );
+ P( C, D, A, B, 15, 14, 0xD8A1E681 );
+ P( B, C, D, A, 4, 20, 0xE7D3FBC8 );
+ P( A, B, C, D, 9, 5, 0x21E1CDE6 );
+ P( D, A, B, C, 14, 9, 0xC33707D6 );
+ P( C, D, A, B, 3, 14, 0xF4D50D87 );
+ P( B, C, D, A, 8, 20, 0x455A14ED );
+ P( A, B, C, D, 13, 5, 0xA9E3E905 );
+ P( D, A, B, C, 2, 9, 0xFCEFA3F8 );
+ P( C, D, A, B, 7, 14, 0x676F02D9 );
+ P( B, C, D, A, 12, 20, 0x8D2A4C8A );
+#undef F
+#define F(x,y,z) (x ^ y ^ z)
+ P( A, B, C, D, 5, 4, 0xFFFA3942 );
+ P( D, A, B, C, 8, 11, 0x8771F681 );
+ P( C, D, A, B, 11, 16, 0x6D9D6122 );
+ P( B, C, D, A, 14, 23, 0xFDE5380C );
+ P( A, B, C, D, 1, 4, 0xA4BEEA44 );
+ P( D, A, B, C, 4, 11, 0x4BDECFA9 );
+ P( C, D, A, B, 7, 16, 0xF6BB4B60 );
+ P( B, C, D, A, 10, 23, 0xBEBFBC70 );
+ P( A, B, C, D, 13, 4, 0x289B7EC6 );
+ P( D, A, B, C, 0, 11, 0xEAA127FA );
+ P( C, D, A, B, 3, 16, 0xD4EF3085 );
+ P( B, C, D, A, 6, 23, 0x04881D05 );
+ P( A, B, C, D, 9, 4, 0xD9D4D039 );
+ P( D, A, B, C, 12, 11, 0xE6DB99E5 );
+ P( C, D, A, B, 15, 16, 0x1FA27CF8 );
+ P( B, C, D, A, 2, 23, 0xC4AC5665 );
+#undef F
+#define F(x,y,z) (y ^ (x | ~z))
+ P( A, B, C, D, 0, 6, 0xF4292244 );
+ P( D, A, B, C, 7, 10, 0x432AFF97 );
+ P( C, D, A, B, 14, 15, 0xAB9423A7 );
+ P( B, C, D, A, 5, 21, 0xFC93A039 );
+ P( A, B, C, D, 12, 6, 0x655B59C3 );
+ P( D, A, B, C, 3, 10, 0x8F0CCC92 );
+ P( C, D, A, B, 10, 15, 0xFFEFF47D );
+ P( B, C, D, A, 1, 21, 0x85845DD1 );
+ P( A, B, C, D, 8, 6, 0x6FA87E4F );
+ P( D, A, B, C, 15, 10, 0xFE2CE6E0 );
+ P( C, D, A, B, 6, 15, 0xA3014314 );
+ P( B, C, D, A, 13, 21, 0x4E0811A1 );
+ P( A, B, C, D, 4, 6, 0xF7537E82 );
+ P( D, A, B, C, 11, 10, 0xBD3AF235 );
+ P( C, D, A, B, 2, 15, 0x2AD7D2BB );
+ P( B, C, D, A, 9, 21, 0xEB86D391 );
+#undef F
+ ctx->state[0] += A;
+ ctx->state[1] += B;
+ ctx->state[2] += C;
+ ctx->state[3] += D;
+}
+void CRYPT_MD5Start(void* context)
+{
+ struct md5_context *ctx = (struct md5_context*)context;
+ ctx->total[0] = 0;
+ ctx->total[1] = 0;
+ ctx->state[0] = 0x67452301;
+ ctx->state[1] = 0xEFCDAB89;
+ ctx->state[2] = 0x98BADCFE;
+ ctx->state[3] = 0x10325476;
+}
+void CRYPT_MD5Update(FX_LPVOID pctx, FX_LPCBYTE input, FX_DWORD length )
+{
+ struct md5_context *ctx = (struct md5_context *)pctx;
+ FX_DWORD left, fill;
+ if( ! length ) {
+ return;
+ }
+ left = ( ctx->total[0] >> 3 ) & 0x3F;
+ fill = 64 - left;
+ ctx->total[0] += length << 3;
+ ctx->total[1] += length >> 29;
+ ctx->total[0] &= 0xFFFFFFFF;
+ ctx->total[1] += ctx->total[0] < length << 3;
+ if( left && length >= fill ) {
+ FXSYS_memcpy32( (void *) (ctx->buffer + left), (void *) input, fill );
+ md5_process( ctx, ctx->buffer );
+ length -= fill;
+ input += fill;
+ left = 0;
+ }
+ while( length >= 64 ) {
+ md5_process( ctx, input );
+ length -= 64;
+ input += 64;
+ }
+ if( length ) {
+ FXSYS_memcpy32( (void *) (ctx->buffer + left), (void *) input, length );
+ }
+}
+const FX_BYTE md5_padding[64] = {
+ 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+};
+void CRYPT_MD5Finish(FX_LPVOID pctx, FX_BYTE digest[16] )
+{
+ struct md5_context *ctx = (struct md5_context *)pctx;
+ FX_DWORD last, padn;
+ FX_BYTE msglen[8];
+ PUT_FX_DWORD( ctx->total[0], msglen, 0 );
+ PUT_FX_DWORD( ctx->total[1], msglen, 4 );
+ last = ( ctx->total[0] >> 3 ) & 0x3F;
+ padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last );
+ CRYPT_MD5Update( ctx, md5_padding, padn );
+ CRYPT_MD5Update( ctx, msglen, 8 );
+ PUT_FX_DWORD( ctx->state[0], digest, 0 );
+ PUT_FX_DWORD( ctx->state[1], digest, 4 );
+ PUT_FX_DWORD( ctx->state[2], digest, 8 );
+ PUT_FX_DWORD( ctx->state[3], digest, 12 );
+}
+void CRYPT_MD5Generate(FX_LPCBYTE input, FX_DWORD length, FX_BYTE digest[16])
+{
+ md5_context ctx;
+ CRYPT_MD5Start(&ctx);
+ CRYPT_MD5Update(&ctx, input, length);
+ CRYPT_MD5Finish(&ctx, digest);
+}
+static FX_BOOL (*g_PubKeyDecryptor)(FX_LPCBYTE pData, FX_DWORD size, FX_LPBYTE data_buf, FX_DWORD& data_len) = NULL;
+void CRYPT_SetPubKeyDecryptor(FX_BOOL (*func)(FX_LPCBYTE pData, FX_DWORD size, FX_LPBYTE data_buf, FX_DWORD& data_len))
+{
+ g_PubKeyDecryptor = func;
+}
+#ifdef __cplusplus
+};
+#endif
diff --git a/core/src/fdrm/crypto/fx_crypt_aes.cpp b/core/src/fdrm/crypto/fx_crypt_aes.cpp
index b8644d141b..6efa935be3 100644
--- a/core/src/fdrm/crypto/fx_crypt_aes.cpp
+++ b/core/src/fdrm/crypto/fx_crypt_aes.cpp
@@ -1,1013 +1,1013 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../../include/fxcrt/fx_basic.h"
-#include "../../../include/fdrm/fx_crypt.h"
-#ifdef __cplusplus
-extern "C" {
-#endif
-#define MAX_NR 14
-#define MAX_NK 8
-#define MAX_NB 8
-#define mulby2(x) ( ((x&0x7F) << 1) ^ (x & 0x80 ? 0x1B : 0) )
-#define GET_32BIT_MSB_FIRST(cp) \
- (((unsigned long)(unsigned char)(cp)[3]) | \
- ((unsigned long)(unsigned char)(cp)[2] << 8) | \
- ((unsigned long)(unsigned char)(cp)[1] << 16) | \
- ((unsigned long)(unsigned char)(cp)[0] << 24))
-#define PUT_32BIT_MSB_FIRST(cp, value) do { \
- (cp)[3] = (value); \
- (cp)[2] = (value) >> 8; \
- (cp)[1] = (value) >> 16; \
- (cp)[0] = (value) >> 24; } while (0)
-struct AESContext {
- unsigned int keysched[(MAX_NR + 1) * MAX_NB];
- unsigned int invkeysched[(MAX_NR + 1) * MAX_NB];
- void (*encrypt) (AESContext * ctx, unsigned int * block);
- void (*decrypt) (AESContext * ctx, unsigned int * block);
- unsigned int iv[MAX_NB];
- int Nb, Nr;
-};
-static const unsigned char Sbox[256] = {
- 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5,
- 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76,
- 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0,
- 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0,
- 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc,
- 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,
- 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a,
- 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75,
- 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0,
- 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84,
- 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b,
- 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
- 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85,
- 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8,
- 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5,
- 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2,
- 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17,
- 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,
- 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88,
- 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb,
- 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c,
- 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79,
- 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9,
- 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
- 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6,
- 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a,
- 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e,
- 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e,
- 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94,
- 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,
- 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68,
- 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16
-};
-static const unsigned char Sboxinv[256] = {
- 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38,
- 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb,
- 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87,
- 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb,
- 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d,
- 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e,
- 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2,
- 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25,
- 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16,
- 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92,
- 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda,
- 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84,
- 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a,
- 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06,
- 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02,
- 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b,
- 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea,
- 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73,
- 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85,
- 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e,
- 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89,
- 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b,
- 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20,
- 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4,
- 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31,
- 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f,
- 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d,
- 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef,
- 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0,
- 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61,
- 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26,
- 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d
-};
-static const unsigned int E0[256] = {
- 0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d,
- 0xfff2f20d, 0xd66b6bbd, 0xde6f6fb1, 0x91c5c554,
- 0x60303050, 0x02010103, 0xce6767a9, 0x562b2b7d,
- 0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a,
- 0x8fcaca45, 0x1f82829d, 0x89c9c940, 0xfa7d7d87,
- 0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b,
- 0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea,
- 0x239c9cbf, 0x53a4a4f7, 0xe4727296, 0x9bc0c05b,
- 0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a,
- 0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f,
- 0x6834345c, 0x51a5a5f4, 0xd1e5e534, 0xf9f1f108,
- 0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f,
- 0x0804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e,
- 0x30181828, 0x379696a1, 0x0a05050f, 0x2f9a9ab5,
- 0x0e070709, 0x24121236, 0x1b80809b, 0xdfe2e23d,
- 0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f,
- 0x1209091b, 0x1d83839e, 0x582c2c74, 0x341a1a2e,
- 0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb,
- 0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce,
- 0x5229297b, 0xdde3e33e, 0x5e2f2f71, 0x13848497,
- 0xa65353f5, 0xb9d1d168, 0x00000000, 0xc1eded2c,
- 0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed,
- 0xd46a6abe, 0x8dcbcb46, 0x67bebed9, 0x7239394b,
- 0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a,
- 0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16,
- 0x864343c5, 0x9a4d4dd7, 0x66333355, 0x11858594,
- 0x8a4545cf, 0xe9f9f910, 0x04020206, 0xfe7f7f81,
- 0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3,
- 0xa25151f3, 0x5da3a3fe, 0x804040c0, 0x058f8f8a,
- 0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504,
- 0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163,
- 0x20101030, 0xe5ffff1a, 0xfdf3f30e, 0xbfd2d26d,
- 0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f,
- 0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739,
- 0x93c4c457, 0x55a7a7f2, 0xfc7e7e82, 0x7a3d3d47,
- 0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395,
- 0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f,
- 0x44222266, 0x542a2a7e, 0x3b9090ab, 0x0b888883,
- 0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c,
- 0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76,
- 0xdbe0e03b, 0x64323256, 0x743a3a4e, 0x140a0a1e,
- 0x924949db, 0x0c06060a, 0x4824246c, 0xb85c5ce4,
- 0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6,
- 0x399191a8, 0x319595a4, 0xd3e4e437, 0xf279798b,
- 0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7,
- 0x018d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0,
- 0xd86c6cb4, 0xac5656fa, 0xf3f4f407, 0xcfeaea25,
- 0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818,
- 0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72,
- 0x381c1c24, 0x57a6a6f1, 0x73b4b4c7, 0x97c6c651,
- 0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21,
- 0x964b4bdd, 0x61bdbddc, 0x0d8b8b86, 0x0f8a8a85,
- 0xe0707090, 0x7c3e3e42, 0x71b5b5c4, 0xcc6666aa,
- 0x904848d8, 0x06030305, 0xf7f6f601, 0x1c0e0e12,
- 0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0,
- 0x17868691, 0x99c1c158, 0x3a1d1d27, 0x279e9eb9,
- 0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133,
- 0xd26969bb, 0xa9d9d970, 0x078e8e89, 0x339494a7,
- 0x2d9b9bb6, 0x3c1e1e22, 0x15878792, 0xc9e9e920,
- 0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a,
- 0x038c8c8f, 0x59a1a1f8, 0x09898980, 0x1a0d0d17,
- 0x65bfbfda, 0xd7e6e631, 0x844242c6, 0xd06868b8,
- 0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11,
- 0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a,
-};
-static const unsigned int E1[256] = {
- 0xa5c66363, 0x84f87c7c, 0x99ee7777, 0x8df67b7b,
- 0x0dfff2f2, 0xbdd66b6b, 0xb1de6f6f, 0x5491c5c5,
- 0x50603030, 0x03020101, 0xa9ce6767, 0x7d562b2b,
- 0x19e7fefe, 0x62b5d7d7, 0xe64dabab, 0x9aec7676,
- 0x458fcaca, 0x9d1f8282, 0x4089c9c9, 0x87fa7d7d,
- 0x15effafa, 0xebb25959, 0xc98e4747, 0x0bfbf0f0,
- 0xec41adad, 0x67b3d4d4, 0xfd5fa2a2, 0xea45afaf,
- 0xbf239c9c, 0xf753a4a4, 0x96e47272, 0x5b9bc0c0,
- 0xc275b7b7, 0x1ce1fdfd, 0xae3d9393, 0x6a4c2626,
- 0x5a6c3636, 0x417e3f3f, 0x02f5f7f7, 0x4f83cccc,
- 0x5c683434, 0xf451a5a5, 0x34d1e5e5, 0x08f9f1f1,
- 0x93e27171, 0x73abd8d8, 0x53623131, 0x3f2a1515,
- 0x0c080404, 0x5295c7c7, 0x65462323, 0x5e9dc3c3,
- 0x28301818, 0xa1379696, 0x0f0a0505, 0xb52f9a9a,
- 0x090e0707, 0x36241212, 0x9b1b8080, 0x3ddfe2e2,
- 0x26cdebeb, 0x694e2727, 0xcd7fb2b2, 0x9fea7575,
- 0x1b120909, 0x9e1d8383, 0x74582c2c, 0x2e341a1a,
- 0x2d361b1b, 0xb2dc6e6e, 0xeeb45a5a, 0xfb5ba0a0,
- 0xf6a45252, 0x4d763b3b, 0x61b7d6d6, 0xce7db3b3,
- 0x7b522929, 0x3edde3e3, 0x715e2f2f, 0x97138484,
- 0xf5a65353, 0x68b9d1d1, 0x00000000, 0x2cc1eded,
- 0x60402020, 0x1fe3fcfc, 0xc879b1b1, 0xedb65b5b,
- 0xbed46a6a, 0x468dcbcb, 0xd967bebe, 0x4b723939,
- 0xde944a4a, 0xd4984c4c, 0xe8b05858, 0x4a85cfcf,
- 0x6bbbd0d0, 0x2ac5efef, 0xe54faaaa, 0x16edfbfb,
- 0xc5864343, 0xd79a4d4d, 0x55663333, 0x94118585,
- 0xcf8a4545, 0x10e9f9f9, 0x06040202, 0x81fe7f7f,
- 0xf0a05050, 0x44783c3c, 0xba259f9f, 0xe34ba8a8,
- 0xf3a25151, 0xfe5da3a3, 0xc0804040, 0x8a058f8f,
- 0xad3f9292, 0xbc219d9d, 0x48703838, 0x04f1f5f5,
- 0xdf63bcbc, 0xc177b6b6, 0x75afdada, 0x63422121,
- 0x30201010, 0x1ae5ffff, 0x0efdf3f3, 0x6dbfd2d2,
- 0x4c81cdcd, 0x14180c0c, 0x35261313, 0x2fc3ecec,
- 0xe1be5f5f, 0xa2359797, 0xcc884444, 0x392e1717,
- 0x5793c4c4, 0xf255a7a7, 0x82fc7e7e, 0x477a3d3d,
- 0xacc86464, 0xe7ba5d5d, 0x2b321919, 0x95e67373,
- 0xa0c06060, 0x98198181, 0xd19e4f4f, 0x7fa3dcdc,
- 0x66442222, 0x7e542a2a, 0xab3b9090, 0x830b8888,
- 0xca8c4646, 0x29c7eeee, 0xd36bb8b8, 0x3c281414,
- 0x79a7dede, 0xe2bc5e5e, 0x1d160b0b, 0x76addbdb,
- 0x3bdbe0e0, 0x56643232, 0x4e743a3a, 0x1e140a0a,
- 0xdb924949, 0x0a0c0606, 0x6c482424, 0xe4b85c5c,
- 0x5d9fc2c2, 0x6ebdd3d3, 0xef43acac, 0xa6c46262,
- 0xa8399191, 0xa4319595, 0x37d3e4e4, 0x8bf27979,
- 0x32d5e7e7, 0x438bc8c8, 0x596e3737, 0xb7da6d6d,
- 0x8c018d8d, 0x64b1d5d5, 0xd29c4e4e, 0xe049a9a9,
- 0xb4d86c6c, 0xfaac5656, 0x07f3f4f4, 0x25cfeaea,
- 0xafca6565, 0x8ef47a7a, 0xe947aeae, 0x18100808,
- 0xd56fbaba, 0x88f07878, 0x6f4a2525, 0x725c2e2e,
- 0x24381c1c, 0xf157a6a6, 0xc773b4b4, 0x5197c6c6,
- 0x23cbe8e8, 0x7ca1dddd, 0x9ce87474, 0x213e1f1f,
- 0xdd964b4b, 0xdc61bdbd, 0x860d8b8b, 0x850f8a8a,
- 0x90e07070, 0x427c3e3e, 0xc471b5b5, 0xaacc6666,
- 0xd8904848, 0x05060303, 0x01f7f6f6, 0x121c0e0e,
- 0xa3c26161, 0x5f6a3535, 0xf9ae5757, 0xd069b9b9,
- 0x91178686, 0x5899c1c1, 0x273a1d1d, 0xb9279e9e,
- 0x38d9e1e1, 0x13ebf8f8, 0xb32b9898, 0x33221111,
- 0xbbd26969, 0x70a9d9d9, 0x89078e8e, 0xa7339494,
- 0xb62d9b9b, 0x223c1e1e, 0x92158787, 0x20c9e9e9,
- 0x4987cece, 0xffaa5555, 0x78502828, 0x7aa5dfdf,
- 0x8f038c8c, 0xf859a1a1, 0x80098989, 0x171a0d0d,
- 0xda65bfbf, 0x31d7e6e6, 0xc6844242, 0xb8d06868,
- 0xc3824141, 0xb0299999, 0x775a2d2d, 0x111e0f0f,
- 0xcb7bb0b0, 0xfca85454, 0xd66dbbbb, 0x3a2c1616,
-};
-static const unsigned int E2[256] = {
- 0x63a5c663, 0x7c84f87c, 0x7799ee77, 0x7b8df67b,
- 0xf20dfff2, 0x6bbdd66b, 0x6fb1de6f, 0xc55491c5,
- 0x30506030, 0x01030201, 0x67a9ce67, 0x2b7d562b,
- 0xfe19e7fe, 0xd762b5d7, 0xabe64dab, 0x769aec76,
- 0xca458fca, 0x829d1f82, 0xc94089c9, 0x7d87fa7d,
- 0xfa15effa, 0x59ebb259, 0x47c98e47, 0xf00bfbf0,
- 0xadec41ad, 0xd467b3d4, 0xa2fd5fa2, 0xafea45af,
- 0x9cbf239c, 0xa4f753a4, 0x7296e472, 0xc05b9bc0,
- 0xb7c275b7, 0xfd1ce1fd, 0x93ae3d93, 0x266a4c26,
- 0x365a6c36, 0x3f417e3f, 0xf702f5f7, 0xcc4f83cc,
- 0x345c6834, 0xa5f451a5, 0xe534d1e5, 0xf108f9f1,
- 0x7193e271, 0xd873abd8, 0x31536231, 0x153f2a15,
- 0x040c0804, 0xc75295c7, 0x23654623, 0xc35e9dc3,
- 0x18283018, 0x96a13796, 0x050f0a05, 0x9ab52f9a,
- 0x07090e07, 0x12362412, 0x809b1b80, 0xe23ddfe2,
- 0xeb26cdeb, 0x27694e27, 0xb2cd7fb2, 0x759fea75,
- 0x091b1209, 0x839e1d83, 0x2c74582c, 0x1a2e341a,
- 0x1b2d361b, 0x6eb2dc6e, 0x5aeeb45a, 0xa0fb5ba0,
- 0x52f6a452, 0x3b4d763b, 0xd661b7d6, 0xb3ce7db3,
- 0x297b5229, 0xe33edde3, 0x2f715e2f, 0x84971384,
- 0x53f5a653, 0xd168b9d1, 0x00000000, 0xed2cc1ed,
- 0x20604020, 0xfc1fe3fc, 0xb1c879b1, 0x5bedb65b,
- 0x6abed46a, 0xcb468dcb, 0xbed967be, 0x394b7239,
- 0x4ade944a, 0x4cd4984c, 0x58e8b058, 0xcf4a85cf,
- 0xd06bbbd0, 0xef2ac5ef, 0xaae54faa, 0xfb16edfb,
- 0x43c58643, 0x4dd79a4d, 0x33556633, 0x85941185,
- 0x45cf8a45, 0xf910e9f9, 0x02060402, 0x7f81fe7f,
- 0x50f0a050, 0x3c44783c, 0x9fba259f, 0xa8e34ba8,
- 0x51f3a251, 0xa3fe5da3, 0x40c08040, 0x8f8a058f,
- 0x92ad3f92, 0x9dbc219d, 0x38487038, 0xf504f1f5,
- 0xbcdf63bc, 0xb6c177b6, 0xda75afda, 0x21634221,
- 0x10302010, 0xff1ae5ff, 0xf30efdf3, 0xd26dbfd2,
- 0xcd4c81cd, 0x0c14180c, 0x13352613, 0xec2fc3ec,
- 0x5fe1be5f, 0x97a23597, 0x44cc8844, 0x17392e17,
- 0xc45793c4, 0xa7f255a7, 0x7e82fc7e, 0x3d477a3d,
- 0x64acc864, 0x5de7ba5d, 0x192b3219, 0x7395e673,
- 0x60a0c060, 0x81981981, 0x4fd19e4f, 0xdc7fa3dc,
- 0x22664422, 0x2a7e542a, 0x90ab3b90, 0x88830b88,
- 0x46ca8c46, 0xee29c7ee, 0xb8d36bb8, 0x143c2814,
- 0xde79a7de, 0x5ee2bc5e, 0x0b1d160b, 0xdb76addb,
- 0xe03bdbe0, 0x32566432, 0x3a4e743a, 0x0a1e140a,
- 0x49db9249, 0x060a0c06, 0x246c4824, 0x5ce4b85c,
- 0xc25d9fc2, 0xd36ebdd3, 0xacef43ac, 0x62a6c462,
- 0x91a83991, 0x95a43195, 0xe437d3e4, 0x798bf279,
- 0xe732d5e7, 0xc8438bc8, 0x37596e37, 0x6db7da6d,
- 0x8d8c018d, 0xd564b1d5, 0x4ed29c4e, 0xa9e049a9,
- 0x6cb4d86c, 0x56faac56, 0xf407f3f4, 0xea25cfea,
- 0x65afca65, 0x7a8ef47a, 0xaee947ae, 0x08181008,
- 0xbad56fba, 0x7888f078, 0x256f4a25, 0x2e725c2e,
- 0x1c24381c, 0xa6f157a6, 0xb4c773b4, 0xc65197c6,
- 0xe823cbe8, 0xdd7ca1dd, 0x749ce874, 0x1f213e1f,
- 0x4bdd964b, 0xbddc61bd, 0x8b860d8b, 0x8a850f8a,
- 0x7090e070, 0x3e427c3e, 0xb5c471b5, 0x66aacc66,
- 0x48d89048, 0x03050603, 0xf601f7f6, 0x0e121c0e,
- 0x61a3c261, 0x355f6a35, 0x57f9ae57, 0xb9d069b9,
- 0x86911786, 0xc15899c1, 0x1d273a1d, 0x9eb9279e,
- 0xe138d9e1, 0xf813ebf8, 0x98b32b98, 0x11332211,
- 0x69bbd269, 0xd970a9d9, 0x8e89078e, 0x94a73394,
- 0x9bb62d9b, 0x1e223c1e, 0x87921587, 0xe920c9e9,
- 0xce4987ce, 0x55ffaa55, 0x28785028, 0xdf7aa5df,
- 0x8c8f038c, 0xa1f859a1, 0x89800989, 0x0d171a0d,
- 0xbfda65bf, 0xe631d7e6, 0x42c68442, 0x68b8d068,
- 0x41c38241, 0x99b02999, 0x2d775a2d, 0x0f111e0f,
- 0xb0cb7bb0, 0x54fca854, 0xbbd66dbb, 0x163a2c16,
-};
-static const unsigned int E3[256] = {
- 0x6363a5c6, 0x7c7c84f8, 0x777799ee, 0x7b7b8df6,
- 0xf2f20dff, 0x6b6bbdd6, 0x6f6fb1de, 0xc5c55491,
- 0x30305060, 0x01010302, 0x6767a9ce, 0x2b2b7d56,
- 0xfefe19e7, 0xd7d762b5, 0xababe64d, 0x76769aec,
- 0xcaca458f, 0x82829d1f, 0xc9c94089, 0x7d7d87fa,
- 0xfafa15ef, 0x5959ebb2, 0x4747c98e, 0xf0f00bfb,
- 0xadadec41, 0xd4d467b3, 0xa2a2fd5f, 0xafafea45,
- 0x9c9cbf23, 0xa4a4f753, 0x727296e4, 0xc0c05b9b,
- 0xb7b7c275, 0xfdfd1ce1, 0x9393ae3d, 0x26266a4c,
- 0x36365a6c, 0x3f3f417e, 0xf7f702f5, 0xcccc4f83,
- 0x34345c68, 0xa5a5f451, 0xe5e534d1, 0xf1f108f9,
- 0x717193e2, 0xd8d873ab, 0x31315362, 0x15153f2a,
- 0x04040c08, 0xc7c75295, 0x23236546, 0xc3c35e9d,
- 0x18182830, 0x9696a137, 0x05050f0a, 0x9a9ab52f,
- 0x0707090e, 0x12123624, 0x80809b1b, 0xe2e23ddf,
- 0xebeb26cd, 0x2727694e, 0xb2b2cd7f, 0x75759fea,
- 0x09091b12, 0x83839e1d, 0x2c2c7458, 0x1a1a2e34,
- 0x1b1b2d36, 0x6e6eb2dc, 0x5a5aeeb4, 0xa0a0fb5b,
- 0x5252f6a4, 0x3b3b4d76, 0xd6d661b7, 0xb3b3ce7d,
- 0x29297b52, 0xe3e33edd, 0x2f2f715e, 0x84849713,
- 0x5353f5a6, 0xd1d168b9, 0x00000000, 0xeded2cc1,
- 0x20206040, 0xfcfc1fe3, 0xb1b1c879, 0x5b5bedb6,
- 0x6a6abed4, 0xcbcb468d, 0xbebed967, 0x39394b72,
- 0x4a4ade94, 0x4c4cd498, 0x5858e8b0, 0xcfcf4a85,
- 0xd0d06bbb, 0xefef2ac5, 0xaaaae54f, 0xfbfb16ed,
- 0x4343c586, 0x4d4dd79a, 0x33335566, 0x85859411,
- 0x4545cf8a, 0xf9f910e9, 0x02020604, 0x7f7f81fe,
- 0x5050f0a0, 0x3c3c4478, 0x9f9fba25, 0xa8a8e34b,
- 0x5151f3a2, 0xa3a3fe5d, 0x4040c080, 0x8f8f8a05,
- 0x9292ad3f, 0x9d9dbc21, 0x38384870, 0xf5f504f1,
- 0xbcbcdf63, 0xb6b6c177, 0xdada75af, 0x21216342,
- 0x10103020, 0xffff1ae5, 0xf3f30efd, 0xd2d26dbf,
- 0xcdcd4c81, 0x0c0c1418, 0x13133526, 0xecec2fc3,
- 0x5f5fe1be, 0x9797a235, 0x4444cc88, 0x1717392e,
- 0xc4c45793, 0xa7a7f255, 0x7e7e82fc, 0x3d3d477a,
- 0x6464acc8, 0x5d5de7ba, 0x19192b32, 0x737395e6,
- 0x6060a0c0, 0x81819819, 0x4f4fd19e, 0xdcdc7fa3,
- 0x22226644, 0x2a2a7e54, 0x9090ab3b, 0x8888830b,
- 0x4646ca8c, 0xeeee29c7, 0xb8b8d36b, 0x14143c28,
- 0xdede79a7, 0x5e5ee2bc, 0x0b0b1d16, 0xdbdb76ad,
- 0xe0e03bdb, 0x32325664, 0x3a3a4e74, 0x0a0a1e14,
- 0x4949db92, 0x06060a0c, 0x24246c48, 0x5c5ce4b8,
- 0xc2c25d9f, 0xd3d36ebd, 0xacacef43, 0x6262a6c4,
- 0x9191a839, 0x9595a431, 0xe4e437d3, 0x79798bf2,
- 0xe7e732d5, 0xc8c8438b, 0x3737596e, 0x6d6db7da,
- 0x8d8d8c01, 0xd5d564b1, 0x4e4ed29c, 0xa9a9e049,
- 0x6c6cb4d8, 0x5656faac, 0xf4f407f3, 0xeaea25cf,
- 0x6565afca, 0x7a7a8ef4, 0xaeaee947, 0x08081810,
- 0xbabad56f, 0x787888f0, 0x25256f4a, 0x2e2e725c,
- 0x1c1c2438, 0xa6a6f157, 0xb4b4c773, 0xc6c65197,
- 0xe8e823cb, 0xdddd7ca1, 0x74749ce8, 0x1f1f213e,
- 0x4b4bdd96, 0xbdbddc61, 0x8b8b860d, 0x8a8a850f,
- 0x707090e0, 0x3e3e427c, 0xb5b5c471, 0x6666aacc,
- 0x4848d890, 0x03030506, 0xf6f601f7, 0x0e0e121c,
- 0x6161a3c2, 0x35355f6a, 0x5757f9ae, 0xb9b9d069,
- 0x86869117, 0xc1c15899, 0x1d1d273a, 0x9e9eb927,
- 0xe1e138d9, 0xf8f813eb, 0x9898b32b, 0x11113322,
- 0x6969bbd2, 0xd9d970a9, 0x8e8e8907, 0x9494a733,
- 0x9b9bb62d, 0x1e1e223c, 0x87879215, 0xe9e920c9,
- 0xcece4987, 0x5555ffaa, 0x28287850, 0xdfdf7aa5,
- 0x8c8c8f03, 0xa1a1f859, 0x89898009, 0x0d0d171a,
- 0xbfbfda65, 0xe6e631d7, 0x4242c684, 0x6868b8d0,
- 0x4141c382, 0x9999b029, 0x2d2d775a, 0x0f0f111e,
- 0xb0b0cb7b, 0x5454fca8, 0xbbbbd66d, 0x16163a2c,
-};
-static const unsigned int D0[256] = {
- 0x51f4a750, 0x7e416553, 0x1a17a4c3, 0x3a275e96,
- 0x3bab6bcb, 0x1f9d45f1, 0xacfa58ab, 0x4be30393,
- 0x2030fa55, 0xad766df6, 0x88cc7691, 0xf5024c25,
- 0x4fe5d7fc, 0xc52acbd7, 0x26354480, 0xb562a38f,
- 0xdeb15a49, 0x25ba1b67, 0x45ea0e98, 0x5dfec0e1,
- 0xc32f7502, 0x814cf012, 0x8d4697a3, 0x6bd3f9c6,
- 0x038f5fe7, 0x15929c95, 0xbf6d7aeb, 0x955259da,
- 0xd4be832d, 0x587421d3, 0x49e06929, 0x8ec9c844,
- 0x75c2896a, 0xf48e7978, 0x99583e6b, 0x27b971dd,
- 0xbee14fb6, 0xf088ad17, 0xc920ac66, 0x7dce3ab4,
- 0x63df4a18, 0xe51a3182, 0x97513360, 0x62537f45,
- 0xb16477e0, 0xbb6bae84, 0xfe81a01c, 0xf9082b94,
- 0x70486858, 0x8f45fd19, 0x94de6c87, 0x527bf8b7,
- 0xab73d323, 0x724b02e2, 0xe31f8f57, 0x6655ab2a,
- 0xb2eb2807, 0x2fb5c203, 0x86c57b9a, 0xd33708a5,
- 0x302887f2, 0x23bfa5b2, 0x02036aba, 0xed16825c,
- 0x8acf1c2b, 0xa779b492, 0xf307f2f0, 0x4e69e2a1,
- 0x65daf4cd, 0x0605bed5, 0xd134621f, 0xc4a6fe8a,
- 0x342e539d, 0xa2f355a0, 0x058ae132, 0xa4f6eb75,
- 0x0b83ec39, 0x4060efaa, 0x5e719f06, 0xbd6e1051,
- 0x3e218af9, 0x96dd063d, 0xdd3e05ae, 0x4de6bd46,
- 0x91548db5, 0x71c45d05, 0x0406d46f, 0x605015ff,
- 0x1998fb24, 0xd6bde997, 0x894043cc, 0x67d99e77,
- 0xb0e842bd, 0x07898b88, 0xe7195b38, 0x79c8eedb,
- 0xa17c0a47, 0x7c420fe9, 0xf8841ec9, 0x00000000,
- 0x09808683, 0x322bed48, 0x1e1170ac, 0x6c5a724e,
- 0xfd0efffb, 0x0f853856, 0x3daed51e, 0x362d3927,
- 0x0a0fd964, 0x685ca621, 0x9b5b54d1, 0x24362e3a,
- 0x0c0a67b1, 0x9357e70f, 0xb4ee96d2, 0x1b9b919e,
- 0x80c0c54f, 0x61dc20a2, 0x5a774b69, 0x1c121a16,
- 0xe293ba0a, 0xc0a02ae5, 0x3c22e043, 0x121b171d,
- 0x0e090d0b, 0xf28bc7ad, 0x2db6a8b9, 0x141ea9c8,
- 0x57f11985, 0xaf75074c, 0xee99ddbb, 0xa37f60fd,
- 0xf701269f, 0x5c72f5bc, 0x44663bc5, 0x5bfb7e34,
- 0x8b432976, 0xcb23c6dc, 0xb6edfc68, 0xb8e4f163,
- 0xd731dcca, 0x42638510, 0x13972240, 0x84c61120,
- 0x854a247d, 0xd2bb3df8, 0xaef93211, 0xc729a16d,
- 0x1d9e2f4b, 0xdcb230f3, 0x0d8652ec, 0x77c1e3d0,
- 0x2bb3166c, 0xa970b999, 0x119448fa, 0x47e96422,
- 0xa8fc8cc4, 0xa0f03f1a, 0x567d2cd8, 0x223390ef,
- 0x87494ec7, 0xd938d1c1, 0x8ccaa2fe, 0x98d40b36,
- 0xa6f581cf, 0xa57ade28, 0xdab78e26, 0x3fadbfa4,
- 0x2c3a9de4, 0x5078920d, 0x6a5fcc9b, 0x547e4662,
- 0xf68d13c2, 0x90d8b8e8, 0x2e39f75e, 0x82c3aff5,
- 0x9f5d80be, 0x69d0937c, 0x6fd52da9, 0xcf2512b3,
- 0xc8ac993b, 0x10187da7, 0xe89c636e, 0xdb3bbb7b,
- 0xcd267809, 0x6e5918f4, 0xec9ab701, 0x834f9aa8,
- 0xe6956e65, 0xaaffe67e, 0x21bccf08, 0xef15e8e6,
- 0xbae79bd9, 0x4a6f36ce, 0xea9f09d4, 0x29b07cd6,
- 0x31a4b2af, 0x2a3f2331, 0xc6a59430, 0x35a266c0,
- 0x744ebc37, 0xfc82caa6, 0xe090d0b0, 0x33a7d815,
- 0xf104984a, 0x41ecdaf7, 0x7fcd500e, 0x1791f62f,
- 0x764dd68d, 0x43efb04d, 0xccaa4d54, 0xe49604df,
- 0x9ed1b5e3, 0x4c6a881b, 0xc12c1fb8, 0x4665517f,
- 0x9d5eea04, 0x018c355d, 0xfa877473, 0xfb0b412e,
- 0xb3671d5a, 0x92dbd252, 0xe9105633, 0x6dd64713,
- 0x9ad7618c, 0x37a10c7a, 0x59f8148e, 0xeb133c89,
- 0xcea927ee, 0xb761c935, 0xe11ce5ed, 0x7a47b13c,
- 0x9cd2df59, 0x55f2733f, 0x1814ce79, 0x73c737bf,
- 0x53f7cdea, 0x5ffdaa5b, 0xdf3d6f14, 0x7844db86,
- 0xcaaff381, 0xb968c43e, 0x3824342c, 0xc2a3405f,
- 0x161dc372, 0xbce2250c, 0x283c498b, 0xff0d9541,
- 0x39a80171, 0x080cb3de, 0xd8b4e49c, 0x6456c190,
- 0x7bcb8461, 0xd532b670, 0x486c5c74, 0xd0b85742,
-};
-static const unsigned int D1[256] = {
- 0x5051f4a7, 0x537e4165, 0xc31a17a4, 0x963a275e,
- 0xcb3bab6b, 0xf11f9d45, 0xabacfa58, 0x934be303,
- 0x552030fa, 0xf6ad766d, 0x9188cc76, 0x25f5024c,
- 0xfc4fe5d7, 0xd7c52acb, 0x80263544, 0x8fb562a3,
- 0x49deb15a, 0x6725ba1b, 0x9845ea0e, 0xe15dfec0,
- 0x02c32f75, 0x12814cf0, 0xa38d4697, 0xc66bd3f9,
- 0xe7038f5f, 0x9515929c, 0xebbf6d7a, 0xda955259,
- 0x2dd4be83, 0xd3587421, 0x2949e069, 0x448ec9c8,
- 0x6a75c289, 0x78f48e79, 0x6b99583e, 0xdd27b971,
- 0xb6bee14f, 0x17f088ad, 0x66c920ac, 0xb47dce3a,
- 0x1863df4a, 0x82e51a31, 0x60975133, 0x4562537f,
- 0xe0b16477, 0x84bb6bae, 0x1cfe81a0, 0x94f9082b,
- 0x58704868, 0x198f45fd, 0x8794de6c, 0xb7527bf8,
- 0x23ab73d3, 0xe2724b02, 0x57e31f8f, 0x2a6655ab,
- 0x07b2eb28, 0x032fb5c2, 0x9a86c57b, 0xa5d33708,
- 0xf2302887, 0xb223bfa5, 0xba02036a, 0x5ced1682,
- 0x2b8acf1c, 0x92a779b4, 0xf0f307f2, 0xa14e69e2,
- 0xcd65daf4, 0xd50605be, 0x1fd13462, 0x8ac4a6fe,
- 0x9d342e53, 0xa0a2f355, 0x32058ae1, 0x75a4f6eb,
- 0x390b83ec, 0xaa4060ef, 0x065e719f, 0x51bd6e10,
- 0xf93e218a, 0x3d96dd06, 0xaedd3e05, 0x464de6bd,
- 0xb591548d, 0x0571c45d, 0x6f0406d4, 0xff605015,
- 0x241998fb, 0x97d6bde9, 0xcc894043, 0x7767d99e,
- 0xbdb0e842, 0x8807898b, 0x38e7195b, 0xdb79c8ee,
- 0x47a17c0a, 0xe97c420f, 0xc9f8841e, 0x00000000,
- 0x83098086, 0x48322bed, 0xac1e1170, 0x4e6c5a72,
- 0xfbfd0eff, 0x560f8538, 0x1e3daed5, 0x27362d39,
- 0x640a0fd9, 0x21685ca6, 0xd19b5b54, 0x3a24362e,
- 0xb10c0a67, 0x0f9357e7, 0xd2b4ee96, 0x9e1b9b91,
- 0x4f80c0c5, 0xa261dc20, 0x695a774b, 0x161c121a,
- 0x0ae293ba, 0xe5c0a02a, 0x433c22e0, 0x1d121b17,
- 0x0b0e090d, 0xadf28bc7, 0xb92db6a8, 0xc8141ea9,
- 0x8557f119, 0x4caf7507, 0xbbee99dd, 0xfda37f60,
- 0x9ff70126, 0xbc5c72f5, 0xc544663b, 0x345bfb7e,
- 0x768b4329, 0xdccb23c6, 0x68b6edfc, 0x63b8e4f1,
- 0xcad731dc, 0x10426385, 0x40139722, 0x2084c611,
- 0x7d854a24, 0xf8d2bb3d, 0x11aef932, 0x6dc729a1,
- 0x4b1d9e2f, 0xf3dcb230, 0xec0d8652, 0xd077c1e3,
- 0x6c2bb316, 0x99a970b9, 0xfa119448, 0x2247e964,
- 0xc4a8fc8c, 0x1aa0f03f, 0xd8567d2c, 0xef223390,
- 0xc787494e, 0xc1d938d1, 0xfe8ccaa2, 0x3698d40b,
- 0xcfa6f581, 0x28a57ade, 0x26dab78e, 0xa43fadbf,
- 0xe42c3a9d, 0x0d507892, 0x9b6a5fcc, 0x62547e46,
- 0xc2f68d13, 0xe890d8b8, 0x5e2e39f7, 0xf582c3af,
- 0xbe9f5d80, 0x7c69d093, 0xa96fd52d, 0xb3cf2512,
- 0x3bc8ac99, 0xa710187d, 0x6ee89c63, 0x7bdb3bbb,
- 0x09cd2678, 0xf46e5918, 0x01ec9ab7, 0xa8834f9a,
- 0x65e6956e, 0x7eaaffe6, 0x0821bccf, 0xe6ef15e8,
- 0xd9bae79b, 0xce4a6f36, 0xd4ea9f09, 0xd629b07c,
- 0xaf31a4b2, 0x312a3f23, 0x30c6a594, 0xc035a266,
- 0x37744ebc, 0xa6fc82ca, 0xb0e090d0, 0x1533a7d8,
- 0x4af10498, 0xf741ecda, 0x0e7fcd50, 0x2f1791f6,
- 0x8d764dd6, 0x4d43efb0, 0x54ccaa4d, 0xdfe49604,
- 0xe39ed1b5, 0x1b4c6a88, 0xb8c12c1f, 0x7f466551,
- 0x049d5eea, 0x5d018c35, 0x73fa8774, 0x2efb0b41,
- 0x5ab3671d, 0x5292dbd2, 0x33e91056, 0x136dd647,
- 0x8c9ad761, 0x7a37a10c, 0x8e59f814, 0x89eb133c,
- 0xeecea927, 0x35b761c9, 0xede11ce5, 0x3c7a47b1,
- 0x599cd2df, 0x3f55f273, 0x791814ce, 0xbf73c737,
- 0xea53f7cd, 0x5b5ffdaa, 0x14df3d6f, 0x867844db,
- 0x81caaff3, 0x3eb968c4, 0x2c382434, 0x5fc2a340,
- 0x72161dc3, 0x0cbce225, 0x8b283c49, 0x41ff0d95,
- 0x7139a801, 0xde080cb3, 0x9cd8b4e4, 0x906456c1,
- 0x617bcb84, 0x70d532b6, 0x74486c5c, 0x42d0b857,
-};
-static const unsigned int D2[256] = {
- 0xa75051f4, 0x65537e41, 0xa4c31a17, 0x5e963a27,
- 0x6bcb3bab, 0x45f11f9d, 0x58abacfa, 0x03934be3,
- 0xfa552030, 0x6df6ad76, 0x769188cc, 0x4c25f502,
- 0xd7fc4fe5, 0xcbd7c52a, 0x44802635, 0xa38fb562,
- 0x5a49deb1, 0x1b6725ba, 0x0e9845ea, 0xc0e15dfe,
- 0x7502c32f, 0xf012814c, 0x97a38d46, 0xf9c66bd3,
- 0x5fe7038f, 0x9c951592, 0x7aebbf6d, 0x59da9552,
- 0x832dd4be, 0x21d35874, 0x692949e0, 0xc8448ec9,
- 0x896a75c2, 0x7978f48e, 0x3e6b9958, 0x71dd27b9,
- 0x4fb6bee1, 0xad17f088, 0xac66c920, 0x3ab47dce,
- 0x4a1863df, 0x3182e51a, 0x33609751, 0x7f456253,
- 0x77e0b164, 0xae84bb6b, 0xa01cfe81, 0x2b94f908,
- 0x68587048, 0xfd198f45, 0x6c8794de, 0xf8b7527b,
- 0xd323ab73, 0x02e2724b, 0x8f57e31f, 0xab2a6655,
- 0x2807b2eb, 0xc2032fb5, 0x7b9a86c5, 0x08a5d337,
- 0x87f23028, 0xa5b223bf, 0x6aba0203, 0x825ced16,
- 0x1c2b8acf, 0xb492a779, 0xf2f0f307, 0xe2a14e69,
- 0xf4cd65da, 0xbed50605, 0x621fd134, 0xfe8ac4a6,
- 0x539d342e, 0x55a0a2f3, 0xe132058a, 0xeb75a4f6,
- 0xec390b83, 0xefaa4060, 0x9f065e71, 0x1051bd6e,
- 0x8af93e21, 0x063d96dd, 0x05aedd3e, 0xbd464de6,
- 0x8db59154, 0x5d0571c4, 0xd46f0406, 0x15ff6050,
- 0xfb241998, 0xe997d6bd, 0x43cc8940, 0x9e7767d9,
- 0x42bdb0e8, 0x8b880789, 0x5b38e719, 0xeedb79c8,
- 0x0a47a17c, 0x0fe97c42, 0x1ec9f884, 0x00000000,
- 0x86830980, 0xed48322b, 0x70ac1e11, 0x724e6c5a,
- 0xfffbfd0e, 0x38560f85, 0xd51e3dae, 0x3927362d,
- 0xd9640a0f, 0xa621685c, 0x54d19b5b, 0x2e3a2436,
- 0x67b10c0a, 0xe70f9357, 0x96d2b4ee, 0x919e1b9b,
- 0xc54f80c0, 0x20a261dc, 0x4b695a77, 0x1a161c12,
- 0xba0ae293, 0x2ae5c0a0, 0xe0433c22, 0x171d121b,
- 0x0d0b0e09, 0xc7adf28b, 0xa8b92db6, 0xa9c8141e,
- 0x198557f1, 0x074caf75, 0xddbbee99, 0x60fda37f,
- 0x269ff701, 0xf5bc5c72, 0x3bc54466, 0x7e345bfb,
- 0x29768b43, 0xc6dccb23, 0xfc68b6ed, 0xf163b8e4,
- 0xdccad731, 0x85104263, 0x22401397, 0x112084c6,
- 0x247d854a, 0x3df8d2bb, 0x3211aef9, 0xa16dc729,
- 0x2f4b1d9e, 0x30f3dcb2, 0x52ec0d86, 0xe3d077c1,
- 0x166c2bb3, 0xb999a970, 0x48fa1194, 0x642247e9,
- 0x8cc4a8fc, 0x3f1aa0f0, 0x2cd8567d, 0x90ef2233,
- 0x4ec78749, 0xd1c1d938, 0xa2fe8cca, 0x0b3698d4,
- 0x81cfa6f5, 0xde28a57a, 0x8e26dab7, 0xbfa43fad,
- 0x9de42c3a, 0x920d5078, 0xcc9b6a5f, 0x4662547e,
- 0x13c2f68d, 0xb8e890d8, 0xf75e2e39, 0xaff582c3,
- 0x80be9f5d, 0x937c69d0, 0x2da96fd5, 0x12b3cf25,
- 0x993bc8ac, 0x7da71018, 0x636ee89c, 0xbb7bdb3b,
- 0x7809cd26, 0x18f46e59, 0xb701ec9a, 0x9aa8834f,
- 0x6e65e695, 0xe67eaaff, 0xcf0821bc, 0xe8e6ef15,
- 0x9bd9bae7, 0x36ce4a6f, 0x09d4ea9f, 0x7cd629b0,
- 0xb2af31a4, 0x23312a3f, 0x9430c6a5, 0x66c035a2,
- 0xbc37744e, 0xcaa6fc82, 0xd0b0e090, 0xd81533a7,
- 0x984af104, 0xdaf741ec, 0x500e7fcd, 0xf62f1791,
- 0xd68d764d, 0xb04d43ef, 0x4d54ccaa, 0x04dfe496,
- 0xb5e39ed1, 0x881b4c6a, 0x1fb8c12c, 0x517f4665,
- 0xea049d5e, 0x355d018c, 0x7473fa87, 0x412efb0b,
- 0x1d5ab367, 0xd25292db, 0x5633e910, 0x47136dd6,
- 0x618c9ad7, 0x0c7a37a1, 0x148e59f8, 0x3c89eb13,
- 0x27eecea9, 0xc935b761, 0xe5ede11c, 0xb13c7a47,
- 0xdf599cd2, 0x733f55f2, 0xce791814, 0x37bf73c7,
- 0xcdea53f7, 0xaa5b5ffd, 0x6f14df3d, 0xdb867844,
- 0xf381caaf, 0xc43eb968, 0x342c3824, 0x405fc2a3,
- 0xc372161d, 0x250cbce2, 0x498b283c, 0x9541ff0d,
- 0x017139a8, 0xb3de080c, 0xe49cd8b4, 0xc1906456,
- 0x84617bcb, 0xb670d532, 0x5c74486c, 0x5742d0b8,
-};
-static const unsigned int D3[256] = {
- 0xf4a75051, 0x4165537e, 0x17a4c31a, 0x275e963a,
- 0xab6bcb3b, 0x9d45f11f, 0xfa58abac, 0xe303934b,
- 0x30fa5520, 0x766df6ad, 0xcc769188, 0x024c25f5,
- 0xe5d7fc4f, 0x2acbd7c5, 0x35448026, 0x62a38fb5,
- 0xb15a49de, 0xba1b6725, 0xea0e9845, 0xfec0e15d,
- 0x2f7502c3, 0x4cf01281, 0x4697a38d, 0xd3f9c66b,
- 0x8f5fe703, 0x929c9515, 0x6d7aebbf, 0x5259da95,
- 0xbe832dd4, 0x7421d358, 0xe0692949, 0xc9c8448e,
- 0xc2896a75, 0x8e7978f4, 0x583e6b99, 0xb971dd27,
- 0xe14fb6be, 0x88ad17f0, 0x20ac66c9, 0xce3ab47d,
- 0xdf4a1863, 0x1a3182e5, 0x51336097, 0x537f4562,
- 0x6477e0b1, 0x6bae84bb, 0x81a01cfe, 0x082b94f9,
- 0x48685870, 0x45fd198f, 0xde6c8794, 0x7bf8b752,
- 0x73d323ab, 0x4b02e272, 0x1f8f57e3, 0x55ab2a66,
- 0xeb2807b2, 0xb5c2032f, 0xc57b9a86, 0x3708a5d3,
- 0x2887f230, 0xbfa5b223, 0x036aba02, 0x16825ced,
- 0xcf1c2b8a, 0x79b492a7, 0x07f2f0f3, 0x69e2a14e,
- 0xdaf4cd65, 0x05bed506, 0x34621fd1, 0xa6fe8ac4,
- 0x2e539d34, 0xf355a0a2, 0x8ae13205, 0xf6eb75a4,
- 0x83ec390b, 0x60efaa40, 0x719f065e, 0x6e1051bd,
- 0x218af93e, 0xdd063d96, 0x3e05aedd, 0xe6bd464d,
- 0x548db591, 0xc45d0571, 0x06d46f04, 0x5015ff60,
- 0x98fb2419, 0xbde997d6, 0x4043cc89, 0xd99e7767,
- 0xe842bdb0, 0x898b8807, 0x195b38e7, 0xc8eedb79,
- 0x7c0a47a1, 0x420fe97c, 0x841ec9f8, 0x00000000,
- 0x80868309, 0x2bed4832, 0x1170ac1e, 0x5a724e6c,
- 0x0efffbfd, 0x8538560f, 0xaed51e3d, 0x2d392736,
- 0x0fd9640a, 0x5ca62168, 0x5b54d19b, 0x362e3a24,
- 0x0a67b10c, 0x57e70f93, 0xee96d2b4, 0x9b919e1b,
- 0xc0c54f80, 0xdc20a261, 0x774b695a, 0x121a161c,
- 0x93ba0ae2, 0xa02ae5c0, 0x22e0433c, 0x1b171d12,
- 0x090d0b0e, 0x8bc7adf2, 0xb6a8b92d, 0x1ea9c814,
- 0xf1198557, 0x75074caf, 0x99ddbbee, 0x7f60fda3,
- 0x01269ff7, 0x72f5bc5c, 0x663bc544, 0xfb7e345b,
- 0x4329768b, 0x23c6dccb, 0xedfc68b6, 0xe4f163b8,
- 0x31dccad7, 0x63851042, 0x97224013, 0xc6112084,
- 0x4a247d85, 0xbb3df8d2, 0xf93211ae, 0x29a16dc7,
- 0x9e2f4b1d, 0xb230f3dc, 0x8652ec0d, 0xc1e3d077,
- 0xb3166c2b, 0x70b999a9, 0x9448fa11, 0xe9642247,
- 0xfc8cc4a8, 0xf03f1aa0, 0x7d2cd856, 0x3390ef22,
- 0x494ec787, 0x38d1c1d9, 0xcaa2fe8c, 0xd40b3698,
- 0xf581cfa6, 0x7ade28a5, 0xb78e26da, 0xadbfa43f,
- 0x3a9de42c, 0x78920d50, 0x5fcc9b6a, 0x7e466254,
- 0x8d13c2f6, 0xd8b8e890, 0x39f75e2e, 0xc3aff582,
- 0x5d80be9f, 0xd0937c69, 0xd52da96f, 0x2512b3cf,
- 0xac993bc8, 0x187da710, 0x9c636ee8, 0x3bbb7bdb,
- 0x267809cd, 0x5918f46e, 0x9ab701ec, 0x4f9aa883,
- 0x956e65e6, 0xffe67eaa, 0xbccf0821, 0x15e8e6ef,
- 0xe79bd9ba, 0x6f36ce4a, 0x9f09d4ea, 0xb07cd629,
- 0xa4b2af31, 0x3f23312a, 0xa59430c6, 0xa266c035,
- 0x4ebc3774, 0x82caa6fc, 0x90d0b0e0, 0xa7d81533,
- 0x04984af1, 0xecdaf741, 0xcd500e7f, 0x91f62f17,
- 0x4dd68d76, 0xefb04d43, 0xaa4d54cc, 0x9604dfe4,
- 0xd1b5e39e, 0x6a881b4c, 0x2c1fb8c1, 0x65517f46,
- 0x5eea049d, 0x8c355d01, 0x877473fa, 0x0b412efb,
- 0x671d5ab3, 0xdbd25292, 0x105633e9, 0xd647136d,
- 0xd7618c9a, 0xa10c7a37, 0xf8148e59, 0x133c89eb,
- 0xa927eece, 0x61c935b7, 0x1ce5ede1, 0x47b13c7a,
- 0xd2df599c, 0xf2733f55, 0x14ce7918, 0xc737bf73,
- 0xf7cdea53, 0xfdaa5b5f, 0x3d6f14df, 0x44db8678,
- 0xaff381ca, 0x68c43eb9, 0x24342c38, 0xa3405fc2,
- 0x1dc37216, 0xe2250cbc, 0x3c498b28, 0x0d9541ff,
- 0xa8017139, 0x0cb3de08, 0xb4e49cd8, 0x56c19064,
- 0xcb84617b, 0x32b670d5, 0x6c5c7448, 0xb85742d0,
-};
-#define ADD_ROUND_KEY_4 (block[0]^=*keysched++, block[1]^=*keysched++, \
- block[2]^=*keysched++, block[3]^=*keysched++)
-#define ADD_ROUND_KEY_6 (block[0]^=*keysched++, block[1]^=*keysched++, \
- block[2]^=*keysched++, block[3]^=*keysched++, \
- block[4]^=*keysched++, block[5]^=*keysched++)
-#define ADD_ROUND_KEY_8 (block[0]^=*keysched++, block[1]^=*keysched++, \
- block[2]^=*keysched++, block[3]^=*keysched++, \
- block[4]^=*keysched++, block[5]^=*keysched++, \
- block[6]^=*keysched++, block[7]^=*keysched++)
-#define MOVEWORD(i) ( block[i] = newstate[i] )
-#undef MAKEWORD
-#define MAKEWORD(i) ( newstate[i] = (E0[(block[i] >> 24) & 0xFF] ^ \
- E1[(block[(i+C1)%Nb] >> 16) & 0xFF] ^ \
- E2[(block[(i+C2)%Nb] >> 8) & 0xFF] ^ \
- E3[block[(i+C3)%Nb] & 0xFF]) )
-#define LASTWORD(i) ( newstate[i] = (Sbox[(block[i] >> 24) & 0xFF] << 24) | \
- (Sbox[(block[(i+C1)%Nb] >> 16) & 0xFF] << 16) | \
- (Sbox[(block[(i+C2)%Nb] >> 8) & 0xFF] << 8) | \
- (Sbox[(block[(i+C3)%Nb] ) & 0xFF] ) )
-static void aes_encrypt_nb_4(AESContext * ctx, unsigned int * block)
-{
- int i;
- static const int C1 = 1, C2 = 2, C3 = 3, Nb = 4;
- unsigned int *keysched = ctx->keysched;
- unsigned int newstate[4];
- for (i = 0; i < ctx->Nr - 1; i++) {
- ADD_ROUND_KEY_4;
- MAKEWORD(0);
- MAKEWORD(1);
- MAKEWORD(2);
- MAKEWORD(3);
- MOVEWORD(0);
- MOVEWORD(1);
- MOVEWORD(2);
- MOVEWORD(3);
- }
- ADD_ROUND_KEY_4;
- LASTWORD(0);
- LASTWORD(1);
- LASTWORD(2);
- LASTWORD(3);
- MOVEWORD(0);
- MOVEWORD(1);
- MOVEWORD(2);
- MOVEWORD(3);
- ADD_ROUND_KEY_4;
-}
-static void aes_encrypt_nb_6(AESContext * ctx, unsigned int * block)
-{
- int i;
- static const int C1 = 1, C2 = 2, C3 = 3, Nb = 6;
- unsigned int *keysched = ctx->keysched;
- unsigned int newstate[6];
- for (i = 0; i < ctx->Nr - 1; i++) {
- ADD_ROUND_KEY_6;
- MAKEWORD(0);
- MAKEWORD(1);
- MAKEWORD(2);
- MAKEWORD(3);
- MAKEWORD(4);
- MAKEWORD(5);
- MOVEWORD(0);
- MOVEWORD(1);
- MOVEWORD(2);
- MOVEWORD(3);
- MOVEWORD(4);
- MOVEWORD(5);
- }
- ADD_ROUND_KEY_6;
- LASTWORD(0);
- LASTWORD(1);
- LASTWORD(2);
- LASTWORD(3);
- LASTWORD(4);
- LASTWORD(5);
- MOVEWORD(0);
- MOVEWORD(1);
- MOVEWORD(2);
- MOVEWORD(3);
- MOVEWORD(4);
- MOVEWORD(5);
- ADD_ROUND_KEY_6;
-}
-static void aes_encrypt_nb_8(AESContext * ctx, unsigned int * block)
-{
- int i;
- static const int C1 = 1, C2 = 3, C3 = 4, Nb = 8;
- unsigned int *keysched = ctx->keysched;
- unsigned int newstate[8];
- for (i = 0; i < ctx->Nr - 1; i++) {
- ADD_ROUND_KEY_8;
- MAKEWORD(0);
- MAKEWORD(1);
- MAKEWORD(2);
- MAKEWORD(3);
- MAKEWORD(4);
- MAKEWORD(5);
- MAKEWORD(6);
- MAKEWORD(7);
- MOVEWORD(0);
- MOVEWORD(1);
- MOVEWORD(2);
- MOVEWORD(3);
- MOVEWORD(4);
- MOVEWORD(5);
- MOVEWORD(6);
- MOVEWORD(7);
- }
- ADD_ROUND_KEY_8;
- LASTWORD(0);
- LASTWORD(1);
- LASTWORD(2);
- LASTWORD(3);
- LASTWORD(4);
- LASTWORD(5);
- LASTWORD(6);
- LASTWORD(7);
- MOVEWORD(0);
- MOVEWORD(1);
- MOVEWORD(2);
- MOVEWORD(3);
- MOVEWORD(4);
- MOVEWORD(5);
- MOVEWORD(6);
- MOVEWORD(7);
- ADD_ROUND_KEY_8;
-}
-#undef MAKEWORD
-#undef LASTWORD
-#define MAKEWORD(i) ( newstate[i] = (D0[(block[i] >> 24) & 0xFF] ^ \
- D1[(block[(i+C1)%Nb] >> 16) & 0xFF] ^ \
- D2[(block[(i+C2)%Nb] >> 8) & 0xFF] ^ \
- D3[block[(i+C3)%Nb] & 0xFF]) )
-#define LASTWORD(i) (newstate[i] = (Sboxinv[(block[i] >> 24) & 0xFF] << 24) | \
- (Sboxinv[(block[(i+C1)%Nb] >> 16) & 0xFF] << 16) | \
- (Sboxinv[(block[(i+C2)%Nb] >> 8) & 0xFF] << 8) | \
- (Sboxinv[(block[(i+C3)%Nb] ) & 0xFF] ) )
-static void aes_decrypt_nb_4(AESContext * ctx, unsigned int * block)
-{
- int i;
- static const int C1 = 4 - 1, C2 = 4 - 2, C3 = 4 - 3, Nb = 4;
- unsigned int *keysched = ctx->invkeysched;
- unsigned int newstate[4];
- for (i = 0; i < ctx->Nr - 1; i++) {
- ADD_ROUND_KEY_4;
- MAKEWORD(0);
- MAKEWORD(1);
- MAKEWORD(2);
- MAKEWORD(3);
- MOVEWORD(0);
- MOVEWORD(1);
- MOVEWORD(2);
- MOVEWORD(3);
- }
- ADD_ROUND_KEY_4;
- LASTWORD(0);
- LASTWORD(1);
- LASTWORD(2);
- LASTWORD(3);
- MOVEWORD(0);
- MOVEWORD(1);
- MOVEWORD(2);
- MOVEWORD(3);
- ADD_ROUND_KEY_4;
-}
-static void aes_decrypt_nb_6(AESContext * ctx, unsigned int * block)
-{
- int i;
- static const int C1 = 6 - 1, C2 = 6 - 2, C3 = 6 - 3, Nb = 6;
- unsigned int *keysched = ctx->invkeysched;
- unsigned int newstate[6];
- for (i = 0; i < ctx->Nr - 1; i++) {
- ADD_ROUND_KEY_6;
- MAKEWORD(0);
- MAKEWORD(1);
- MAKEWORD(2);
- MAKEWORD(3);
- MAKEWORD(4);
- MAKEWORD(5);
- MOVEWORD(0);
- MOVEWORD(1);
- MOVEWORD(2);
- MOVEWORD(3);
- MOVEWORD(4);
- MOVEWORD(5);
- }
- ADD_ROUND_KEY_6;
- LASTWORD(0);
- LASTWORD(1);
- LASTWORD(2);
- LASTWORD(3);
- LASTWORD(4);
- LASTWORD(5);
- MOVEWORD(0);
- MOVEWORD(1);
- MOVEWORD(2);
- MOVEWORD(3);
- MOVEWORD(4);
- MOVEWORD(5);
- ADD_ROUND_KEY_6;
-}
-static void aes_decrypt_nb_8(AESContext * ctx, unsigned int * block)
-{
- int i;
- static const int C1 = 8 - 1, C2 = 8 - 3, C3 = 8 - 4, Nb = 8;
- unsigned int *keysched = ctx->invkeysched;
- unsigned int newstate[8];
- for (i = 0; i < ctx->Nr - 1; i++) {
- ADD_ROUND_KEY_8;
- MAKEWORD(0);
- MAKEWORD(1);
- MAKEWORD(2);
- MAKEWORD(3);
- MAKEWORD(4);
- MAKEWORD(5);
- MAKEWORD(6);
- MAKEWORD(7);
- MOVEWORD(0);
- MOVEWORD(1);
- MOVEWORD(2);
- MOVEWORD(3);
- MOVEWORD(4);
- MOVEWORD(5);
- MOVEWORD(6);
- MOVEWORD(7);
- }
- ADD_ROUND_KEY_8;
- LASTWORD(0);
- LASTWORD(1);
- LASTWORD(2);
- LASTWORD(3);
- LASTWORD(4);
- LASTWORD(5);
- LASTWORD(6);
- LASTWORD(7);
- MOVEWORD(0);
- MOVEWORD(1);
- MOVEWORD(2);
- MOVEWORD(3);
- MOVEWORD(4);
- MOVEWORD(5);
- MOVEWORD(6);
- MOVEWORD(7);
- ADD_ROUND_KEY_8;
-}
-#undef MAKEWORD
-#undef LASTWORD
-static void aes_setup(AESContext * ctx, int blocklen,
- const unsigned char *key, int keylen)
-{
- int i, j, Nk, rconst;
- ASSERT(blocklen == 16 || blocklen == 24 || blocklen == 32);
- ASSERT(keylen == 16 || keylen == 24 || keylen == 32);
- Nk = keylen / 4;
- ctx->Nb = blocklen / 4;
- ctx->Nr = 6 + (ctx->Nb > Nk ? ctx->Nb : Nk);
- if (ctx->Nb == 8) {
- ctx->encrypt = aes_encrypt_nb_8, ctx->decrypt = aes_decrypt_nb_8;
- } else if (ctx->Nb == 6) {
- ctx->encrypt = aes_encrypt_nb_6, ctx->decrypt = aes_decrypt_nb_6;
- } else if (ctx->Nb == 4) {
- ctx->encrypt = aes_encrypt_nb_4, ctx->decrypt = aes_decrypt_nb_4;
- }
- rconst = 1;
- for (i = 0; i < (ctx->Nr + 1) * ctx->Nb; i++) {
- if (i < Nk) {
- ctx->keysched[i] = GET_32BIT_MSB_FIRST(key + 4 * i);
- } else {
- unsigned int temp = ctx->keysched[i - 1];
- if (i % Nk == 0) {
- int a, b, c, d;
- a = (temp >> 16) & 0xFF;
- b = (temp >> 8) & 0xFF;
- c = (temp >> 0) & 0xFF;
- d = (temp >> 24) & 0xFF;
- temp = Sbox[a] ^ rconst;
- temp = (temp << 8) | Sbox[b];
- temp = (temp << 8) | Sbox[c];
- temp = (temp << 8) | Sbox[d];
- rconst = mulby2(rconst);
- } else if (i % Nk == 4 && Nk > 6) {
- int a, b, c, d;
- a = (temp >> 24) & 0xFF;
- b = (temp >> 16) & 0xFF;
- c = (temp >> 8) & 0xFF;
- d = (temp >> 0) & 0xFF;
- temp = Sbox[a];
- temp = (temp << 8) | Sbox[b];
- temp = (temp << 8) | Sbox[c];
- temp = (temp << 8) | Sbox[d];
- }
- ctx->keysched[i] = ctx->keysched[i - Nk] ^ temp;
- }
- }
- for (i = 0; i <= ctx->Nr; i++) {
- for (j = 0; j < ctx->Nb; j++) {
- unsigned int temp;
- temp = ctx->keysched[(ctx->Nr - i) * ctx->Nb + j];
- if (i != 0 && i != ctx->Nr) {
- int a, b, c, d;
- a = (temp >> 24) & 0xFF;
- b = (temp >> 16) & 0xFF;
- c = (temp >> 8) & 0xFF;
- d = (temp >> 0) & 0xFF;
- temp = D0[Sbox[a]];
- temp ^= D1[Sbox[b]];
- temp ^= D2[Sbox[c]];
- temp ^= D3[Sbox[d]];
- }
- ctx->invkeysched[i * ctx->Nb + j] = temp;
- }
- }
-}
-static void aes_decrypt(AESContext * ctx, unsigned int * block)
-{
- ctx->decrypt(ctx, block);
-}
-static void aes_decrypt_cbc(unsigned char *dest, const unsigned char *src, int len, AESContext * ctx)
-{
- unsigned int iv[4], x[4], ct[4];
- int i;
- ASSERT((len & 15) == 0);
- FXSYS_memcpy32(iv, ctx->iv, sizeof(iv));
- while (len > 0) {
- for (i = 0; i < 4; i++) {
- x[i] = ct[i] = GET_32BIT_MSB_FIRST(src + 4 * i);
- }
- aes_decrypt(ctx, x);
- for (i = 0; i < 4; i++) {
- PUT_32BIT_MSB_FIRST(dest + 4 * i, iv[i] ^ x[i]);
- iv[i] = ct[i];
- }
- dest += 16;
- src += 16;
- len -= 16;
- }
- FXSYS_memcpy32(ctx->iv, iv, sizeof(iv));
-}
-static void aes_encrypt(AESContext * ctx, unsigned int * block)
-{
- ctx->encrypt(ctx, block);
-}
-static void aes_encrypt_cbc(unsigned char *dest, const unsigned char *src, int len, AESContext * ctx)
-{
- unsigned int iv[4];
- int i;
- ASSERT((len & 15) == 0);
- FXSYS_memcpy32(iv, ctx->iv, sizeof(iv));
- while (len > 0) {
- for (i = 0; i < 4; i++) {
- iv[i] ^= GET_32BIT_MSB_FIRST(src + 4 * i);
- }
- aes_encrypt(ctx, iv);
- for (i = 0; i < 4; i++) {
- PUT_32BIT_MSB_FIRST(dest + 4 * i, iv[i]);
- }
- dest += 16;
- src += 16;
- len -= 16;
- }
- FXSYS_memcpy32(ctx->iv, iv, sizeof(iv));
-}
-void CRYPT_AESSetKey(FX_LPVOID context, FX_DWORD blocklen, FX_LPCBYTE key, FX_DWORD keylen, FX_BOOL bEncrypt)
-{
- aes_setup((AESContext*)context, blocklen, key, keylen);
-}
-void CRYPT_AESSetIV(FX_LPVOID context, FX_LPCBYTE iv)
-{
- int i;
- for (i = 0; i < ((AESContext*)context)->Nb; i++) {
- ((AESContext*)context)->iv[i] = GET_32BIT_MSB_FIRST(iv + 4 * i);
- }
-}
-void CRYPT_AESDecrypt(FX_LPVOID context, FX_LPBYTE dest, FX_LPCBYTE src, FX_DWORD len)
-{
- aes_decrypt_cbc(dest, src, len, (AESContext*)context);
-}
-void CRYPT_AESEncrypt(FX_LPVOID context, FX_LPBYTE dest, FX_LPCBYTE src, FX_DWORD len)
-{
- aes_encrypt_cbc(dest, src, len, (AESContext*)context);
-}
-#ifdef __cplusplus
-};
-#endif
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxcrt/fx_basic.h"
+#include "../../../include/fdrm/fx_crypt.h"
+#ifdef __cplusplus
+extern "C" {
+#endif
+#define MAX_NR 14
+#define MAX_NK 8
+#define MAX_NB 8
+#define mulby2(x) ( ((x&0x7F) << 1) ^ (x & 0x80 ? 0x1B : 0) )
+#define GET_32BIT_MSB_FIRST(cp) \
+ (((unsigned long)(unsigned char)(cp)[3]) | \
+ ((unsigned long)(unsigned char)(cp)[2] << 8) | \
+ ((unsigned long)(unsigned char)(cp)[1] << 16) | \
+ ((unsigned long)(unsigned char)(cp)[0] << 24))
+#define PUT_32BIT_MSB_FIRST(cp, value) do { \
+ (cp)[3] = (value); \
+ (cp)[2] = (value) >> 8; \
+ (cp)[1] = (value) >> 16; \
+ (cp)[0] = (value) >> 24; } while (0)
+struct AESContext {
+ unsigned int keysched[(MAX_NR + 1) * MAX_NB];
+ unsigned int invkeysched[(MAX_NR + 1) * MAX_NB];
+ void (*encrypt) (AESContext * ctx, unsigned int * block);
+ void (*decrypt) (AESContext * ctx, unsigned int * block);
+ unsigned int iv[MAX_NB];
+ int Nb, Nr;
+};
+static const unsigned char Sbox[256] = {
+ 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5,
+ 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76,
+ 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0,
+ 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0,
+ 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc,
+ 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,
+ 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a,
+ 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75,
+ 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0,
+ 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84,
+ 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b,
+ 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
+ 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85,
+ 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8,
+ 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5,
+ 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2,
+ 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17,
+ 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,
+ 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88,
+ 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb,
+ 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c,
+ 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79,
+ 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9,
+ 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
+ 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6,
+ 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a,
+ 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e,
+ 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e,
+ 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94,
+ 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,
+ 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68,
+ 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16
+};
+static const unsigned char Sboxinv[256] = {
+ 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38,
+ 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb,
+ 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87,
+ 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb,
+ 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d,
+ 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e,
+ 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2,
+ 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25,
+ 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16,
+ 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92,
+ 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda,
+ 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84,
+ 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a,
+ 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06,
+ 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02,
+ 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b,
+ 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea,
+ 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73,
+ 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85,
+ 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e,
+ 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89,
+ 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b,
+ 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20,
+ 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4,
+ 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31,
+ 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f,
+ 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d,
+ 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef,
+ 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0,
+ 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61,
+ 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26,
+ 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d
+};
+static const unsigned int E0[256] = {
+ 0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d,
+ 0xfff2f20d, 0xd66b6bbd, 0xde6f6fb1, 0x91c5c554,
+ 0x60303050, 0x02010103, 0xce6767a9, 0x562b2b7d,
+ 0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a,
+ 0x8fcaca45, 0x1f82829d, 0x89c9c940, 0xfa7d7d87,
+ 0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b,
+ 0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea,
+ 0x239c9cbf, 0x53a4a4f7, 0xe4727296, 0x9bc0c05b,
+ 0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a,
+ 0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f,
+ 0x6834345c, 0x51a5a5f4, 0xd1e5e534, 0xf9f1f108,
+ 0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f,
+ 0x0804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e,
+ 0x30181828, 0x379696a1, 0x0a05050f, 0x2f9a9ab5,
+ 0x0e070709, 0x24121236, 0x1b80809b, 0xdfe2e23d,
+ 0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f,
+ 0x1209091b, 0x1d83839e, 0x582c2c74, 0x341a1a2e,
+ 0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb,
+ 0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce,
+ 0x5229297b, 0xdde3e33e, 0x5e2f2f71, 0x13848497,
+ 0xa65353f5, 0xb9d1d168, 0x00000000, 0xc1eded2c,
+ 0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed,
+ 0xd46a6abe, 0x8dcbcb46, 0x67bebed9, 0x7239394b,
+ 0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a,
+ 0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16,
+ 0x864343c5, 0x9a4d4dd7, 0x66333355, 0x11858594,
+ 0x8a4545cf, 0xe9f9f910, 0x04020206, 0xfe7f7f81,
+ 0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3,
+ 0xa25151f3, 0x5da3a3fe, 0x804040c0, 0x058f8f8a,
+ 0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504,
+ 0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163,
+ 0x20101030, 0xe5ffff1a, 0xfdf3f30e, 0xbfd2d26d,
+ 0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f,
+ 0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739,
+ 0x93c4c457, 0x55a7a7f2, 0xfc7e7e82, 0x7a3d3d47,
+ 0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395,
+ 0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f,
+ 0x44222266, 0x542a2a7e, 0x3b9090ab, 0x0b888883,
+ 0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c,
+ 0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76,
+ 0xdbe0e03b, 0x64323256, 0x743a3a4e, 0x140a0a1e,
+ 0x924949db, 0x0c06060a, 0x4824246c, 0xb85c5ce4,
+ 0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6,
+ 0x399191a8, 0x319595a4, 0xd3e4e437, 0xf279798b,
+ 0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7,
+ 0x018d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0,
+ 0xd86c6cb4, 0xac5656fa, 0xf3f4f407, 0xcfeaea25,
+ 0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818,
+ 0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72,
+ 0x381c1c24, 0x57a6a6f1, 0x73b4b4c7, 0x97c6c651,
+ 0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21,
+ 0x964b4bdd, 0x61bdbddc, 0x0d8b8b86, 0x0f8a8a85,
+ 0xe0707090, 0x7c3e3e42, 0x71b5b5c4, 0xcc6666aa,
+ 0x904848d8, 0x06030305, 0xf7f6f601, 0x1c0e0e12,
+ 0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0,
+ 0x17868691, 0x99c1c158, 0x3a1d1d27, 0x279e9eb9,
+ 0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133,
+ 0xd26969bb, 0xa9d9d970, 0x078e8e89, 0x339494a7,
+ 0x2d9b9bb6, 0x3c1e1e22, 0x15878792, 0xc9e9e920,
+ 0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a,
+ 0x038c8c8f, 0x59a1a1f8, 0x09898980, 0x1a0d0d17,
+ 0x65bfbfda, 0xd7e6e631, 0x844242c6, 0xd06868b8,
+ 0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11,
+ 0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a,
+};
+static const unsigned int E1[256] = {
+ 0xa5c66363, 0x84f87c7c, 0x99ee7777, 0x8df67b7b,
+ 0x0dfff2f2, 0xbdd66b6b, 0xb1de6f6f, 0x5491c5c5,
+ 0x50603030, 0x03020101, 0xa9ce6767, 0x7d562b2b,
+ 0x19e7fefe, 0x62b5d7d7, 0xe64dabab, 0x9aec7676,
+ 0x458fcaca, 0x9d1f8282, 0x4089c9c9, 0x87fa7d7d,
+ 0x15effafa, 0xebb25959, 0xc98e4747, 0x0bfbf0f0,
+ 0xec41adad, 0x67b3d4d4, 0xfd5fa2a2, 0xea45afaf,
+ 0xbf239c9c, 0xf753a4a4, 0x96e47272, 0x5b9bc0c0,
+ 0xc275b7b7, 0x1ce1fdfd, 0xae3d9393, 0x6a4c2626,
+ 0x5a6c3636, 0x417e3f3f, 0x02f5f7f7, 0x4f83cccc,
+ 0x5c683434, 0xf451a5a5, 0x34d1e5e5, 0x08f9f1f1,
+ 0x93e27171, 0x73abd8d8, 0x53623131, 0x3f2a1515,
+ 0x0c080404, 0x5295c7c7, 0x65462323, 0x5e9dc3c3,
+ 0x28301818, 0xa1379696, 0x0f0a0505, 0xb52f9a9a,
+ 0x090e0707, 0x36241212, 0x9b1b8080, 0x3ddfe2e2,
+ 0x26cdebeb, 0x694e2727, 0xcd7fb2b2, 0x9fea7575,
+ 0x1b120909, 0x9e1d8383, 0x74582c2c, 0x2e341a1a,
+ 0x2d361b1b, 0xb2dc6e6e, 0xeeb45a5a, 0xfb5ba0a0,
+ 0xf6a45252, 0x4d763b3b, 0x61b7d6d6, 0xce7db3b3,
+ 0x7b522929, 0x3edde3e3, 0x715e2f2f, 0x97138484,
+ 0xf5a65353, 0x68b9d1d1, 0x00000000, 0x2cc1eded,
+ 0x60402020, 0x1fe3fcfc, 0xc879b1b1, 0xedb65b5b,
+ 0xbed46a6a, 0x468dcbcb, 0xd967bebe, 0x4b723939,
+ 0xde944a4a, 0xd4984c4c, 0xe8b05858, 0x4a85cfcf,
+ 0x6bbbd0d0, 0x2ac5efef, 0xe54faaaa, 0x16edfbfb,
+ 0xc5864343, 0xd79a4d4d, 0x55663333, 0x94118585,
+ 0xcf8a4545, 0x10e9f9f9, 0x06040202, 0x81fe7f7f,
+ 0xf0a05050, 0x44783c3c, 0xba259f9f, 0xe34ba8a8,
+ 0xf3a25151, 0xfe5da3a3, 0xc0804040, 0x8a058f8f,
+ 0xad3f9292, 0xbc219d9d, 0x48703838, 0x04f1f5f5,
+ 0xdf63bcbc, 0xc177b6b6, 0x75afdada, 0x63422121,
+ 0x30201010, 0x1ae5ffff, 0x0efdf3f3, 0x6dbfd2d2,
+ 0x4c81cdcd, 0x14180c0c, 0x35261313, 0x2fc3ecec,
+ 0xe1be5f5f, 0xa2359797, 0xcc884444, 0x392e1717,
+ 0x5793c4c4, 0xf255a7a7, 0x82fc7e7e, 0x477a3d3d,
+ 0xacc86464, 0xe7ba5d5d, 0x2b321919, 0x95e67373,
+ 0xa0c06060, 0x98198181, 0xd19e4f4f, 0x7fa3dcdc,
+ 0x66442222, 0x7e542a2a, 0xab3b9090, 0x830b8888,
+ 0xca8c4646, 0x29c7eeee, 0xd36bb8b8, 0x3c281414,
+ 0x79a7dede, 0xe2bc5e5e, 0x1d160b0b, 0x76addbdb,
+ 0x3bdbe0e0, 0x56643232, 0x4e743a3a, 0x1e140a0a,
+ 0xdb924949, 0x0a0c0606, 0x6c482424, 0xe4b85c5c,
+ 0x5d9fc2c2, 0x6ebdd3d3, 0xef43acac, 0xa6c46262,
+ 0xa8399191, 0xa4319595, 0x37d3e4e4, 0x8bf27979,
+ 0x32d5e7e7, 0x438bc8c8, 0x596e3737, 0xb7da6d6d,
+ 0x8c018d8d, 0x64b1d5d5, 0xd29c4e4e, 0xe049a9a9,
+ 0xb4d86c6c, 0xfaac5656, 0x07f3f4f4, 0x25cfeaea,
+ 0xafca6565, 0x8ef47a7a, 0xe947aeae, 0x18100808,
+ 0xd56fbaba, 0x88f07878, 0x6f4a2525, 0x725c2e2e,
+ 0x24381c1c, 0xf157a6a6, 0xc773b4b4, 0x5197c6c6,
+ 0x23cbe8e8, 0x7ca1dddd, 0x9ce87474, 0x213e1f1f,
+ 0xdd964b4b, 0xdc61bdbd, 0x860d8b8b, 0x850f8a8a,
+ 0x90e07070, 0x427c3e3e, 0xc471b5b5, 0xaacc6666,
+ 0xd8904848, 0x05060303, 0x01f7f6f6, 0x121c0e0e,
+ 0xa3c26161, 0x5f6a3535, 0xf9ae5757, 0xd069b9b9,
+ 0x91178686, 0x5899c1c1, 0x273a1d1d, 0xb9279e9e,
+ 0x38d9e1e1, 0x13ebf8f8, 0xb32b9898, 0x33221111,
+ 0xbbd26969, 0x70a9d9d9, 0x89078e8e, 0xa7339494,
+ 0xb62d9b9b, 0x223c1e1e, 0x92158787, 0x20c9e9e9,
+ 0x4987cece, 0xffaa5555, 0x78502828, 0x7aa5dfdf,
+ 0x8f038c8c, 0xf859a1a1, 0x80098989, 0x171a0d0d,
+ 0xda65bfbf, 0x31d7e6e6, 0xc6844242, 0xb8d06868,
+ 0xc3824141, 0xb0299999, 0x775a2d2d, 0x111e0f0f,
+ 0xcb7bb0b0, 0xfca85454, 0xd66dbbbb, 0x3a2c1616,
+};
+static const unsigned int E2[256] = {
+ 0x63a5c663, 0x7c84f87c, 0x7799ee77, 0x7b8df67b,
+ 0xf20dfff2, 0x6bbdd66b, 0x6fb1de6f, 0xc55491c5,
+ 0x30506030, 0x01030201, 0x67a9ce67, 0x2b7d562b,
+ 0xfe19e7fe, 0xd762b5d7, 0xabe64dab, 0x769aec76,
+ 0xca458fca, 0x829d1f82, 0xc94089c9, 0x7d87fa7d,
+ 0xfa15effa, 0x59ebb259, 0x47c98e47, 0xf00bfbf0,
+ 0xadec41ad, 0xd467b3d4, 0xa2fd5fa2, 0xafea45af,
+ 0x9cbf239c, 0xa4f753a4, 0x7296e472, 0xc05b9bc0,
+ 0xb7c275b7, 0xfd1ce1fd, 0x93ae3d93, 0x266a4c26,
+ 0x365a6c36, 0x3f417e3f, 0xf702f5f7, 0xcc4f83cc,
+ 0x345c6834, 0xa5f451a5, 0xe534d1e5, 0xf108f9f1,
+ 0x7193e271, 0xd873abd8, 0x31536231, 0x153f2a15,
+ 0x040c0804, 0xc75295c7, 0x23654623, 0xc35e9dc3,
+ 0x18283018, 0x96a13796, 0x050f0a05, 0x9ab52f9a,
+ 0x07090e07, 0x12362412, 0x809b1b80, 0xe23ddfe2,
+ 0xeb26cdeb, 0x27694e27, 0xb2cd7fb2, 0x759fea75,
+ 0x091b1209, 0x839e1d83, 0x2c74582c, 0x1a2e341a,
+ 0x1b2d361b, 0x6eb2dc6e, 0x5aeeb45a, 0xa0fb5ba0,
+ 0x52f6a452, 0x3b4d763b, 0xd661b7d6, 0xb3ce7db3,
+ 0x297b5229, 0xe33edde3, 0x2f715e2f, 0x84971384,
+ 0x53f5a653, 0xd168b9d1, 0x00000000, 0xed2cc1ed,
+ 0x20604020, 0xfc1fe3fc, 0xb1c879b1, 0x5bedb65b,
+ 0x6abed46a, 0xcb468dcb, 0xbed967be, 0x394b7239,
+ 0x4ade944a, 0x4cd4984c, 0x58e8b058, 0xcf4a85cf,
+ 0xd06bbbd0, 0xef2ac5ef, 0xaae54faa, 0xfb16edfb,
+ 0x43c58643, 0x4dd79a4d, 0x33556633, 0x85941185,
+ 0x45cf8a45, 0xf910e9f9, 0x02060402, 0x7f81fe7f,
+ 0x50f0a050, 0x3c44783c, 0x9fba259f, 0xa8e34ba8,
+ 0x51f3a251, 0xa3fe5da3, 0x40c08040, 0x8f8a058f,
+ 0x92ad3f92, 0x9dbc219d, 0x38487038, 0xf504f1f5,
+ 0xbcdf63bc, 0xb6c177b6, 0xda75afda, 0x21634221,
+ 0x10302010, 0xff1ae5ff, 0xf30efdf3, 0xd26dbfd2,
+ 0xcd4c81cd, 0x0c14180c, 0x13352613, 0xec2fc3ec,
+ 0x5fe1be5f, 0x97a23597, 0x44cc8844, 0x17392e17,
+ 0xc45793c4, 0xa7f255a7, 0x7e82fc7e, 0x3d477a3d,
+ 0x64acc864, 0x5de7ba5d, 0x192b3219, 0x7395e673,
+ 0x60a0c060, 0x81981981, 0x4fd19e4f, 0xdc7fa3dc,
+ 0x22664422, 0x2a7e542a, 0x90ab3b90, 0x88830b88,
+ 0x46ca8c46, 0xee29c7ee, 0xb8d36bb8, 0x143c2814,
+ 0xde79a7de, 0x5ee2bc5e, 0x0b1d160b, 0xdb76addb,
+ 0xe03bdbe0, 0x32566432, 0x3a4e743a, 0x0a1e140a,
+ 0x49db9249, 0x060a0c06, 0x246c4824, 0x5ce4b85c,
+ 0xc25d9fc2, 0xd36ebdd3, 0xacef43ac, 0x62a6c462,
+ 0x91a83991, 0x95a43195, 0xe437d3e4, 0x798bf279,
+ 0xe732d5e7, 0xc8438bc8, 0x37596e37, 0x6db7da6d,
+ 0x8d8c018d, 0xd564b1d5, 0x4ed29c4e, 0xa9e049a9,
+ 0x6cb4d86c, 0x56faac56, 0xf407f3f4, 0xea25cfea,
+ 0x65afca65, 0x7a8ef47a, 0xaee947ae, 0x08181008,
+ 0xbad56fba, 0x7888f078, 0x256f4a25, 0x2e725c2e,
+ 0x1c24381c, 0xa6f157a6, 0xb4c773b4, 0xc65197c6,
+ 0xe823cbe8, 0xdd7ca1dd, 0x749ce874, 0x1f213e1f,
+ 0x4bdd964b, 0xbddc61bd, 0x8b860d8b, 0x8a850f8a,
+ 0x7090e070, 0x3e427c3e, 0xb5c471b5, 0x66aacc66,
+ 0x48d89048, 0x03050603, 0xf601f7f6, 0x0e121c0e,
+ 0x61a3c261, 0x355f6a35, 0x57f9ae57, 0xb9d069b9,
+ 0x86911786, 0xc15899c1, 0x1d273a1d, 0x9eb9279e,
+ 0xe138d9e1, 0xf813ebf8, 0x98b32b98, 0x11332211,
+ 0x69bbd269, 0xd970a9d9, 0x8e89078e, 0x94a73394,
+ 0x9bb62d9b, 0x1e223c1e, 0x87921587, 0xe920c9e9,
+ 0xce4987ce, 0x55ffaa55, 0x28785028, 0xdf7aa5df,
+ 0x8c8f038c, 0xa1f859a1, 0x89800989, 0x0d171a0d,
+ 0xbfda65bf, 0xe631d7e6, 0x42c68442, 0x68b8d068,
+ 0x41c38241, 0x99b02999, 0x2d775a2d, 0x0f111e0f,
+ 0xb0cb7bb0, 0x54fca854, 0xbbd66dbb, 0x163a2c16,
+};
+static const unsigned int E3[256] = {
+ 0x6363a5c6, 0x7c7c84f8, 0x777799ee, 0x7b7b8df6,
+ 0xf2f20dff, 0x6b6bbdd6, 0x6f6fb1de, 0xc5c55491,
+ 0x30305060, 0x01010302, 0x6767a9ce, 0x2b2b7d56,
+ 0xfefe19e7, 0xd7d762b5, 0xababe64d, 0x76769aec,
+ 0xcaca458f, 0x82829d1f, 0xc9c94089, 0x7d7d87fa,
+ 0xfafa15ef, 0x5959ebb2, 0x4747c98e, 0xf0f00bfb,
+ 0xadadec41, 0xd4d467b3, 0xa2a2fd5f, 0xafafea45,
+ 0x9c9cbf23, 0xa4a4f753, 0x727296e4, 0xc0c05b9b,
+ 0xb7b7c275, 0xfdfd1ce1, 0x9393ae3d, 0x26266a4c,
+ 0x36365a6c, 0x3f3f417e, 0xf7f702f5, 0xcccc4f83,
+ 0x34345c68, 0xa5a5f451, 0xe5e534d1, 0xf1f108f9,
+ 0x717193e2, 0xd8d873ab, 0x31315362, 0x15153f2a,
+ 0x04040c08, 0xc7c75295, 0x23236546, 0xc3c35e9d,
+ 0x18182830, 0x9696a137, 0x05050f0a, 0x9a9ab52f,
+ 0x0707090e, 0x12123624, 0x80809b1b, 0xe2e23ddf,
+ 0xebeb26cd, 0x2727694e, 0xb2b2cd7f, 0x75759fea,
+ 0x09091b12, 0x83839e1d, 0x2c2c7458, 0x1a1a2e34,
+ 0x1b1b2d36, 0x6e6eb2dc, 0x5a5aeeb4, 0xa0a0fb5b,
+ 0x5252f6a4, 0x3b3b4d76, 0xd6d661b7, 0xb3b3ce7d,
+ 0x29297b52, 0xe3e33edd, 0x2f2f715e, 0x84849713,
+ 0x5353f5a6, 0xd1d168b9, 0x00000000, 0xeded2cc1,
+ 0x20206040, 0xfcfc1fe3, 0xb1b1c879, 0x5b5bedb6,
+ 0x6a6abed4, 0xcbcb468d, 0xbebed967, 0x39394b72,
+ 0x4a4ade94, 0x4c4cd498, 0x5858e8b0, 0xcfcf4a85,
+ 0xd0d06bbb, 0xefef2ac5, 0xaaaae54f, 0xfbfb16ed,
+ 0x4343c586, 0x4d4dd79a, 0x33335566, 0x85859411,
+ 0x4545cf8a, 0xf9f910e9, 0x02020604, 0x7f7f81fe,
+ 0x5050f0a0, 0x3c3c4478, 0x9f9fba25, 0xa8a8e34b,
+ 0x5151f3a2, 0xa3a3fe5d, 0x4040c080, 0x8f8f8a05,
+ 0x9292ad3f, 0x9d9dbc21, 0x38384870, 0xf5f504f1,
+ 0xbcbcdf63, 0xb6b6c177, 0xdada75af, 0x21216342,
+ 0x10103020, 0xffff1ae5, 0xf3f30efd, 0xd2d26dbf,
+ 0xcdcd4c81, 0x0c0c1418, 0x13133526, 0xecec2fc3,
+ 0x5f5fe1be, 0x9797a235, 0x4444cc88, 0x1717392e,
+ 0xc4c45793, 0xa7a7f255, 0x7e7e82fc, 0x3d3d477a,
+ 0x6464acc8, 0x5d5de7ba, 0x19192b32, 0x737395e6,
+ 0x6060a0c0, 0x81819819, 0x4f4fd19e, 0xdcdc7fa3,
+ 0x22226644, 0x2a2a7e54, 0x9090ab3b, 0x8888830b,
+ 0x4646ca8c, 0xeeee29c7, 0xb8b8d36b, 0x14143c28,
+ 0xdede79a7, 0x5e5ee2bc, 0x0b0b1d16, 0xdbdb76ad,
+ 0xe0e03bdb, 0x32325664, 0x3a3a4e74, 0x0a0a1e14,
+ 0x4949db92, 0x06060a0c, 0x24246c48, 0x5c5ce4b8,
+ 0xc2c25d9f, 0xd3d36ebd, 0xacacef43, 0x6262a6c4,
+ 0x9191a839, 0x9595a431, 0xe4e437d3, 0x79798bf2,
+ 0xe7e732d5, 0xc8c8438b, 0x3737596e, 0x6d6db7da,
+ 0x8d8d8c01, 0xd5d564b1, 0x4e4ed29c, 0xa9a9e049,
+ 0x6c6cb4d8, 0x5656faac, 0xf4f407f3, 0xeaea25cf,
+ 0x6565afca, 0x7a7a8ef4, 0xaeaee947, 0x08081810,
+ 0xbabad56f, 0x787888f0, 0x25256f4a, 0x2e2e725c,
+ 0x1c1c2438, 0xa6a6f157, 0xb4b4c773, 0xc6c65197,
+ 0xe8e823cb, 0xdddd7ca1, 0x74749ce8, 0x1f1f213e,
+ 0x4b4bdd96, 0xbdbddc61, 0x8b8b860d, 0x8a8a850f,
+ 0x707090e0, 0x3e3e427c, 0xb5b5c471, 0x6666aacc,
+ 0x4848d890, 0x03030506, 0xf6f601f7, 0x0e0e121c,
+ 0x6161a3c2, 0x35355f6a, 0x5757f9ae, 0xb9b9d069,
+ 0x86869117, 0xc1c15899, 0x1d1d273a, 0x9e9eb927,
+ 0xe1e138d9, 0xf8f813eb, 0x9898b32b, 0x11113322,
+ 0x6969bbd2, 0xd9d970a9, 0x8e8e8907, 0x9494a733,
+ 0x9b9bb62d, 0x1e1e223c, 0x87879215, 0xe9e920c9,
+ 0xcece4987, 0x5555ffaa, 0x28287850, 0xdfdf7aa5,
+ 0x8c8c8f03, 0xa1a1f859, 0x89898009, 0x0d0d171a,
+ 0xbfbfda65, 0xe6e631d7, 0x4242c684, 0x6868b8d0,
+ 0x4141c382, 0x9999b029, 0x2d2d775a, 0x0f0f111e,
+ 0xb0b0cb7b, 0x5454fca8, 0xbbbbd66d, 0x16163a2c,
+};
+static const unsigned int D0[256] = {
+ 0x51f4a750, 0x7e416553, 0x1a17a4c3, 0x3a275e96,
+ 0x3bab6bcb, 0x1f9d45f1, 0xacfa58ab, 0x4be30393,
+ 0x2030fa55, 0xad766df6, 0x88cc7691, 0xf5024c25,
+ 0x4fe5d7fc, 0xc52acbd7, 0x26354480, 0xb562a38f,
+ 0xdeb15a49, 0x25ba1b67, 0x45ea0e98, 0x5dfec0e1,
+ 0xc32f7502, 0x814cf012, 0x8d4697a3, 0x6bd3f9c6,
+ 0x038f5fe7, 0x15929c95, 0xbf6d7aeb, 0x955259da,
+ 0xd4be832d, 0x587421d3, 0x49e06929, 0x8ec9c844,
+ 0x75c2896a, 0xf48e7978, 0x99583e6b, 0x27b971dd,
+ 0xbee14fb6, 0xf088ad17, 0xc920ac66, 0x7dce3ab4,
+ 0x63df4a18, 0xe51a3182, 0x97513360, 0x62537f45,
+ 0xb16477e0, 0xbb6bae84, 0xfe81a01c, 0xf9082b94,
+ 0x70486858, 0x8f45fd19, 0x94de6c87, 0x527bf8b7,
+ 0xab73d323, 0x724b02e2, 0xe31f8f57, 0x6655ab2a,
+ 0xb2eb2807, 0x2fb5c203, 0x86c57b9a, 0xd33708a5,
+ 0x302887f2, 0x23bfa5b2, 0x02036aba, 0xed16825c,
+ 0x8acf1c2b, 0xa779b492, 0xf307f2f0, 0x4e69e2a1,
+ 0x65daf4cd, 0x0605bed5, 0xd134621f, 0xc4a6fe8a,
+ 0x342e539d, 0xa2f355a0, 0x058ae132, 0xa4f6eb75,
+ 0x0b83ec39, 0x4060efaa, 0x5e719f06, 0xbd6e1051,
+ 0x3e218af9, 0x96dd063d, 0xdd3e05ae, 0x4de6bd46,
+ 0x91548db5, 0x71c45d05, 0x0406d46f, 0x605015ff,
+ 0x1998fb24, 0xd6bde997, 0x894043cc, 0x67d99e77,
+ 0xb0e842bd, 0x07898b88, 0xe7195b38, 0x79c8eedb,
+ 0xa17c0a47, 0x7c420fe9, 0xf8841ec9, 0x00000000,
+ 0x09808683, 0x322bed48, 0x1e1170ac, 0x6c5a724e,
+ 0xfd0efffb, 0x0f853856, 0x3daed51e, 0x362d3927,
+ 0x0a0fd964, 0x685ca621, 0x9b5b54d1, 0x24362e3a,
+ 0x0c0a67b1, 0x9357e70f, 0xb4ee96d2, 0x1b9b919e,
+ 0x80c0c54f, 0x61dc20a2, 0x5a774b69, 0x1c121a16,
+ 0xe293ba0a, 0xc0a02ae5, 0x3c22e043, 0x121b171d,
+ 0x0e090d0b, 0xf28bc7ad, 0x2db6a8b9, 0x141ea9c8,
+ 0x57f11985, 0xaf75074c, 0xee99ddbb, 0xa37f60fd,
+ 0xf701269f, 0x5c72f5bc, 0x44663bc5, 0x5bfb7e34,
+ 0x8b432976, 0xcb23c6dc, 0xb6edfc68, 0xb8e4f163,
+ 0xd731dcca, 0x42638510, 0x13972240, 0x84c61120,
+ 0x854a247d, 0xd2bb3df8, 0xaef93211, 0xc729a16d,
+ 0x1d9e2f4b, 0xdcb230f3, 0x0d8652ec, 0x77c1e3d0,
+ 0x2bb3166c, 0xa970b999, 0x119448fa, 0x47e96422,
+ 0xa8fc8cc4, 0xa0f03f1a, 0x567d2cd8, 0x223390ef,
+ 0x87494ec7, 0xd938d1c1, 0x8ccaa2fe, 0x98d40b36,
+ 0xa6f581cf, 0xa57ade28, 0xdab78e26, 0x3fadbfa4,
+ 0x2c3a9de4, 0x5078920d, 0x6a5fcc9b, 0x547e4662,
+ 0xf68d13c2, 0x90d8b8e8, 0x2e39f75e, 0x82c3aff5,
+ 0x9f5d80be, 0x69d0937c, 0x6fd52da9, 0xcf2512b3,
+ 0xc8ac993b, 0x10187da7, 0xe89c636e, 0xdb3bbb7b,
+ 0xcd267809, 0x6e5918f4, 0xec9ab701, 0x834f9aa8,
+ 0xe6956e65, 0xaaffe67e, 0x21bccf08, 0xef15e8e6,
+ 0xbae79bd9, 0x4a6f36ce, 0xea9f09d4, 0x29b07cd6,
+ 0x31a4b2af, 0x2a3f2331, 0xc6a59430, 0x35a266c0,
+ 0x744ebc37, 0xfc82caa6, 0xe090d0b0, 0x33a7d815,
+ 0xf104984a, 0x41ecdaf7, 0x7fcd500e, 0x1791f62f,
+ 0x764dd68d, 0x43efb04d, 0xccaa4d54, 0xe49604df,
+ 0x9ed1b5e3, 0x4c6a881b, 0xc12c1fb8, 0x4665517f,
+ 0x9d5eea04, 0x018c355d, 0xfa877473, 0xfb0b412e,
+ 0xb3671d5a, 0x92dbd252, 0xe9105633, 0x6dd64713,
+ 0x9ad7618c, 0x37a10c7a, 0x59f8148e, 0xeb133c89,
+ 0xcea927ee, 0xb761c935, 0xe11ce5ed, 0x7a47b13c,
+ 0x9cd2df59, 0x55f2733f, 0x1814ce79, 0x73c737bf,
+ 0x53f7cdea, 0x5ffdaa5b, 0xdf3d6f14, 0x7844db86,
+ 0xcaaff381, 0xb968c43e, 0x3824342c, 0xc2a3405f,
+ 0x161dc372, 0xbce2250c, 0x283c498b, 0xff0d9541,
+ 0x39a80171, 0x080cb3de, 0xd8b4e49c, 0x6456c190,
+ 0x7bcb8461, 0xd532b670, 0x486c5c74, 0xd0b85742,
+};
+static const unsigned int D1[256] = {
+ 0x5051f4a7, 0x537e4165, 0xc31a17a4, 0x963a275e,
+ 0xcb3bab6b, 0xf11f9d45, 0xabacfa58, 0x934be303,
+ 0x552030fa, 0xf6ad766d, 0x9188cc76, 0x25f5024c,
+ 0xfc4fe5d7, 0xd7c52acb, 0x80263544, 0x8fb562a3,
+ 0x49deb15a, 0x6725ba1b, 0x9845ea0e, 0xe15dfec0,
+ 0x02c32f75, 0x12814cf0, 0xa38d4697, 0xc66bd3f9,
+ 0xe7038f5f, 0x9515929c, 0xebbf6d7a, 0xda955259,
+ 0x2dd4be83, 0xd3587421, 0x2949e069, 0x448ec9c8,
+ 0x6a75c289, 0x78f48e79, 0x6b99583e, 0xdd27b971,
+ 0xb6bee14f, 0x17f088ad, 0x66c920ac, 0xb47dce3a,
+ 0x1863df4a, 0x82e51a31, 0x60975133, 0x4562537f,
+ 0xe0b16477, 0x84bb6bae, 0x1cfe81a0, 0x94f9082b,
+ 0x58704868, 0x198f45fd, 0x8794de6c, 0xb7527bf8,
+ 0x23ab73d3, 0xe2724b02, 0x57e31f8f, 0x2a6655ab,
+ 0x07b2eb28, 0x032fb5c2, 0x9a86c57b, 0xa5d33708,
+ 0xf2302887, 0xb223bfa5, 0xba02036a, 0x5ced1682,
+ 0x2b8acf1c, 0x92a779b4, 0xf0f307f2, 0xa14e69e2,
+ 0xcd65daf4, 0xd50605be, 0x1fd13462, 0x8ac4a6fe,
+ 0x9d342e53, 0xa0a2f355, 0x32058ae1, 0x75a4f6eb,
+ 0x390b83ec, 0xaa4060ef, 0x065e719f, 0x51bd6e10,
+ 0xf93e218a, 0x3d96dd06, 0xaedd3e05, 0x464de6bd,
+ 0xb591548d, 0x0571c45d, 0x6f0406d4, 0xff605015,
+ 0x241998fb, 0x97d6bde9, 0xcc894043, 0x7767d99e,
+ 0xbdb0e842, 0x8807898b, 0x38e7195b, 0xdb79c8ee,
+ 0x47a17c0a, 0xe97c420f, 0xc9f8841e, 0x00000000,
+ 0x83098086, 0x48322bed, 0xac1e1170, 0x4e6c5a72,
+ 0xfbfd0eff, 0x560f8538, 0x1e3daed5, 0x27362d39,
+ 0x640a0fd9, 0x21685ca6, 0xd19b5b54, 0x3a24362e,
+ 0xb10c0a67, 0x0f9357e7, 0xd2b4ee96, 0x9e1b9b91,
+ 0x4f80c0c5, 0xa261dc20, 0x695a774b, 0x161c121a,
+ 0x0ae293ba, 0xe5c0a02a, 0x433c22e0, 0x1d121b17,
+ 0x0b0e090d, 0xadf28bc7, 0xb92db6a8, 0xc8141ea9,
+ 0x8557f119, 0x4caf7507, 0xbbee99dd, 0xfda37f60,
+ 0x9ff70126, 0xbc5c72f5, 0xc544663b, 0x345bfb7e,
+ 0x768b4329, 0xdccb23c6, 0x68b6edfc, 0x63b8e4f1,
+ 0xcad731dc, 0x10426385, 0x40139722, 0x2084c611,
+ 0x7d854a24, 0xf8d2bb3d, 0x11aef932, 0x6dc729a1,
+ 0x4b1d9e2f, 0xf3dcb230, 0xec0d8652, 0xd077c1e3,
+ 0x6c2bb316, 0x99a970b9, 0xfa119448, 0x2247e964,
+ 0xc4a8fc8c, 0x1aa0f03f, 0xd8567d2c, 0xef223390,
+ 0xc787494e, 0xc1d938d1, 0xfe8ccaa2, 0x3698d40b,
+ 0xcfa6f581, 0x28a57ade, 0x26dab78e, 0xa43fadbf,
+ 0xe42c3a9d, 0x0d507892, 0x9b6a5fcc, 0x62547e46,
+ 0xc2f68d13, 0xe890d8b8, 0x5e2e39f7, 0xf582c3af,
+ 0xbe9f5d80, 0x7c69d093, 0xa96fd52d, 0xb3cf2512,
+ 0x3bc8ac99, 0xa710187d, 0x6ee89c63, 0x7bdb3bbb,
+ 0x09cd2678, 0xf46e5918, 0x01ec9ab7, 0xa8834f9a,
+ 0x65e6956e, 0x7eaaffe6, 0x0821bccf, 0xe6ef15e8,
+ 0xd9bae79b, 0xce4a6f36, 0xd4ea9f09, 0xd629b07c,
+ 0xaf31a4b2, 0x312a3f23, 0x30c6a594, 0xc035a266,
+ 0x37744ebc, 0xa6fc82ca, 0xb0e090d0, 0x1533a7d8,
+ 0x4af10498, 0xf741ecda, 0x0e7fcd50, 0x2f1791f6,
+ 0x8d764dd6, 0x4d43efb0, 0x54ccaa4d, 0xdfe49604,
+ 0xe39ed1b5, 0x1b4c6a88, 0xb8c12c1f, 0x7f466551,
+ 0x049d5eea, 0x5d018c35, 0x73fa8774, 0x2efb0b41,
+ 0x5ab3671d, 0x5292dbd2, 0x33e91056, 0x136dd647,
+ 0x8c9ad761, 0x7a37a10c, 0x8e59f814, 0x89eb133c,
+ 0xeecea927, 0x35b761c9, 0xede11ce5, 0x3c7a47b1,
+ 0x599cd2df, 0x3f55f273, 0x791814ce, 0xbf73c737,
+ 0xea53f7cd, 0x5b5ffdaa, 0x14df3d6f, 0x867844db,
+ 0x81caaff3, 0x3eb968c4, 0x2c382434, 0x5fc2a340,
+ 0x72161dc3, 0x0cbce225, 0x8b283c49, 0x41ff0d95,
+ 0x7139a801, 0xde080cb3, 0x9cd8b4e4, 0x906456c1,
+ 0x617bcb84, 0x70d532b6, 0x74486c5c, 0x42d0b857,
+};
+static const unsigned int D2[256] = {
+ 0xa75051f4, 0x65537e41, 0xa4c31a17, 0x5e963a27,
+ 0x6bcb3bab, 0x45f11f9d, 0x58abacfa, 0x03934be3,
+ 0xfa552030, 0x6df6ad76, 0x769188cc, 0x4c25f502,
+ 0xd7fc4fe5, 0xcbd7c52a, 0x44802635, 0xa38fb562,
+ 0x5a49deb1, 0x1b6725ba, 0x0e9845ea, 0xc0e15dfe,
+ 0x7502c32f, 0xf012814c, 0x97a38d46, 0xf9c66bd3,
+ 0x5fe7038f, 0x9c951592, 0x7aebbf6d, 0x59da9552,
+ 0x832dd4be, 0x21d35874, 0x692949e0, 0xc8448ec9,
+ 0x896a75c2, 0x7978f48e, 0x3e6b9958, 0x71dd27b9,
+ 0x4fb6bee1, 0xad17f088, 0xac66c920, 0x3ab47dce,
+ 0x4a1863df, 0x3182e51a, 0x33609751, 0x7f456253,
+ 0x77e0b164, 0xae84bb6b, 0xa01cfe81, 0x2b94f908,
+ 0x68587048, 0xfd198f45, 0x6c8794de, 0xf8b7527b,
+ 0xd323ab73, 0x02e2724b, 0x8f57e31f, 0xab2a6655,
+ 0x2807b2eb, 0xc2032fb5, 0x7b9a86c5, 0x08a5d337,
+ 0x87f23028, 0xa5b223bf, 0x6aba0203, 0x825ced16,
+ 0x1c2b8acf, 0xb492a779, 0xf2f0f307, 0xe2a14e69,
+ 0xf4cd65da, 0xbed50605, 0x621fd134, 0xfe8ac4a6,
+ 0x539d342e, 0x55a0a2f3, 0xe132058a, 0xeb75a4f6,
+ 0xec390b83, 0xefaa4060, 0x9f065e71, 0x1051bd6e,
+ 0x8af93e21, 0x063d96dd, 0x05aedd3e, 0xbd464de6,
+ 0x8db59154, 0x5d0571c4, 0xd46f0406, 0x15ff6050,
+ 0xfb241998, 0xe997d6bd, 0x43cc8940, 0x9e7767d9,
+ 0x42bdb0e8, 0x8b880789, 0x5b38e719, 0xeedb79c8,
+ 0x0a47a17c, 0x0fe97c42, 0x1ec9f884, 0x00000000,
+ 0x86830980, 0xed48322b, 0x70ac1e11, 0x724e6c5a,
+ 0xfffbfd0e, 0x38560f85, 0xd51e3dae, 0x3927362d,
+ 0xd9640a0f, 0xa621685c, 0x54d19b5b, 0x2e3a2436,
+ 0x67b10c0a, 0xe70f9357, 0x96d2b4ee, 0x919e1b9b,
+ 0xc54f80c0, 0x20a261dc, 0x4b695a77, 0x1a161c12,
+ 0xba0ae293, 0x2ae5c0a0, 0xe0433c22, 0x171d121b,
+ 0x0d0b0e09, 0xc7adf28b, 0xa8b92db6, 0xa9c8141e,
+ 0x198557f1, 0x074caf75, 0xddbbee99, 0x60fda37f,
+ 0x269ff701, 0xf5bc5c72, 0x3bc54466, 0x7e345bfb,
+ 0x29768b43, 0xc6dccb23, 0xfc68b6ed, 0xf163b8e4,
+ 0xdccad731, 0x85104263, 0x22401397, 0x112084c6,
+ 0x247d854a, 0x3df8d2bb, 0x3211aef9, 0xa16dc729,
+ 0x2f4b1d9e, 0x30f3dcb2, 0x52ec0d86, 0xe3d077c1,
+ 0x166c2bb3, 0xb999a970, 0x48fa1194, 0x642247e9,
+ 0x8cc4a8fc, 0x3f1aa0f0, 0x2cd8567d, 0x90ef2233,
+ 0x4ec78749, 0xd1c1d938, 0xa2fe8cca, 0x0b3698d4,
+ 0x81cfa6f5, 0xde28a57a, 0x8e26dab7, 0xbfa43fad,
+ 0x9de42c3a, 0x920d5078, 0xcc9b6a5f, 0x4662547e,
+ 0x13c2f68d, 0xb8e890d8, 0xf75e2e39, 0xaff582c3,
+ 0x80be9f5d, 0x937c69d0, 0x2da96fd5, 0x12b3cf25,
+ 0x993bc8ac, 0x7da71018, 0x636ee89c, 0xbb7bdb3b,
+ 0x7809cd26, 0x18f46e59, 0xb701ec9a, 0x9aa8834f,
+ 0x6e65e695, 0xe67eaaff, 0xcf0821bc, 0xe8e6ef15,
+ 0x9bd9bae7, 0x36ce4a6f, 0x09d4ea9f, 0x7cd629b0,
+ 0xb2af31a4, 0x23312a3f, 0x9430c6a5, 0x66c035a2,
+ 0xbc37744e, 0xcaa6fc82, 0xd0b0e090, 0xd81533a7,
+ 0x984af104, 0xdaf741ec, 0x500e7fcd, 0xf62f1791,
+ 0xd68d764d, 0xb04d43ef, 0x4d54ccaa, 0x04dfe496,
+ 0xb5e39ed1, 0x881b4c6a, 0x1fb8c12c, 0x517f4665,
+ 0xea049d5e, 0x355d018c, 0x7473fa87, 0x412efb0b,
+ 0x1d5ab367, 0xd25292db, 0x5633e910, 0x47136dd6,
+ 0x618c9ad7, 0x0c7a37a1, 0x148e59f8, 0x3c89eb13,
+ 0x27eecea9, 0xc935b761, 0xe5ede11c, 0xb13c7a47,
+ 0xdf599cd2, 0x733f55f2, 0xce791814, 0x37bf73c7,
+ 0xcdea53f7, 0xaa5b5ffd, 0x6f14df3d, 0xdb867844,
+ 0xf381caaf, 0xc43eb968, 0x342c3824, 0x405fc2a3,
+ 0xc372161d, 0x250cbce2, 0x498b283c, 0x9541ff0d,
+ 0x017139a8, 0xb3de080c, 0xe49cd8b4, 0xc1906456,
+ 0x84617bcb, 0xb670d532, 0x5c74486c, 0x5742d0b8,
+};
+static const unsigned int D3[256] = {
+ 0xf4a75051, 0x4165537e, 0x17a4c31a, 0x275e963a,
+ 0xab6bcb3b, 0x9d45f11f, 0xfa58abac, 0xe303934b,
+ 0x30fa5520, 0x766df6ad, 0xcc769188, 0x024c25f5,
+ 0xe5d7fc4f, 0x2acbd7c5, 0x35448026, 0x62a38fb5,
+ 0xb15a49de, 0xba1b6725, 0xea0e9845, 0xfec0e15d,
+ 0x2f7502c3, 0x4cf01281, 0x4697a38d, 0xd3f9c66b,
+ 0x8f5fe703, 0x929c9515, 0x6d7aebbf, 0x5259da95,
+ 0xbe832dd4, 0x7421d358, 0xe0692949, 0xc9c8448e,
+ 0xc2896a75, 0x8e7978f4, 0x583e6b99, 0xb971dd27,
+ 0xe14fb6be, 0x88ad17f0, 0x20ac66c9, 0xce3ab47d,
+ 0xdf4a1863, 0x1a3182e5, 0x51336097, 0x537f4562,
+ 0x6477e0b1, 0x6bae84bb, 0x81a01cfe, 0x082b94f9,
+ 0x48685870, 0x45fd198f, 0xde6c8794, 0x7bf8b752,
+ 0x73d323ab, 0x4b02e272, 0x1f8f57e3, 0x55ab2a66,
+ 0xeb2807b2, 0xb5c2032f, 0xc57b9a86, 0x3708a5d3,
+ 0x2887f230, 0xbfa5b223, 0x036aba02, 0x16825ced,
+ 0xcf1c2b8a, 0x79b492a7, 0x07f2f0f3, 0x69e2a14e,
+ 0xdaf4cd65, 0x05bed506, 0x34621fd1, 0xa6fe8ac4,
+ 0x2e539d34, 0xf355a0a2, 0x8ae13205, 0xf6eb75a4,
+ 0x83ec390b, 0x60efaa40, 0x719f065e, 0x6e1051bd,
+ 0x218af93e, 0xdd063d96, 0x3e05aedd, 0xe6bd464d,
+ 0x548db591, 0xc45d0571, 0x06d46f04, 0x5015ff60,
+ 0x98fb2419, 0xbde997d6, 0x4043cc89, 0xd99e7767,
+ 0xe842bdb0, 0x898b8807, 0x195b38e7, 0xc8eedb79,
+ 0x7c0a47a1, 0x420fe97c, 0x841ec9f8, 0x00000000,
+ 0x80868309, 0x2bed4832, 0x1170ac1e, 0x5a724e6c,
+ 0x0efffbfd, 0x8538560f, 0xaed51e3d, 0x2d392736,
+ 0x0fd9640a, 0x5ca62168, 0x5b54d19b, 0x362e3a24,
+ 0x0a67b10c, 0x57e70f93, 0xee96d2b4, 0x9b919e1b,
+ 0xc0c54f80, 0xdc20a261, 0x774b695a, 0x121a161c,
+ 0x93ba0ae2, 0xa02ae5c0, 0x22e0433c, 0x1b171d12,
+ 0x090d0b0e, 0x8bc7adf2, 0xb6a8b92d, 0x1ea9c814,
+ 0xf1198557, 0x75074caf, 0x99ddbbee, 0x7f60fda3,
+ 0x01269ff7, 0x72f5bc5c, 0x663bc544, 0xfb7e345b,
+ 0x4329768b, 0x23c6dccb, 0xedfc68b6, 0xe4f163b8,
+ 0x31dccad7, 0x63851042, 0x97224013, 0xc6112084,
+ 0x4a247d85, 0xbb3df8d2, 0xf93211ae, 0x29a16dc7,
+ 0x9e2f4b1d, 0xb230f3dc, 0x8652ec0d, 0xc1e3d077,
+ 0xb3166c2b, 0x70b999a9, 0x9448fa11, 0xe9642247,
+ 0xfc8cc4a8, 0xf03f1aa0, 0x7d2cd856, 0x3390ef22,
+ 0x494ec787, 0x38d1c1d9, 0xcaa2fe8c, 0xd40b3698,
+ 0xf581cfa6, 0x7ade28a5, 0xb78e26da, 0xadbfa43f,
+ 0x3a9de42c, 0x78920d50, 0x5fcc9b6a, 0x7e466254,
+ 0x8d13c2f6, 0xd8b8e890, 0x39f75e2e, 0xc3aff582,
+ 0x5d80be9f, 0xd0937c69, 0xd52da96f, 0x2512b3cf,
+ 0xac993bc8, 0x187da710, 0x9c636ee8, 0x3bbb7bdb,
+ 0x267809cd, 0x5918f46e, 0x9ab701ec, 0x4f9aa883,
+ 0x956e65e6, 0xffe67eaa, 0xbccf0821, 0x15e8e6ef,
+ 0xe79bd9ba, 0x6f36ce4a, 0x9f09d4ea, 0xb07cd629,
+ 0xa4b2af31, 0x3f23312a, 0xa59430c6, 0xa266c035,
+ 0x4ebc3774, 0x82caa6fc, 0x90d0b0e0, 0xa7d81533,
+ 0x04984af1, 0xecdaf741, 0xcd500e7f, 0x91f62f17,
+ 0x4dd68d76, 0xefb04d43, 0xaa4d54cc, 0x9604dfe4,
+ 0xd1b5e39e, 0x6a881b4c, 0x2c1fb8c1, 0x65517f46,
+ 0x5eea049d, 0x8c355d01, 0x877473fa, 0x0b412efb,
+ 0x671d5ab3, 0xdbd25292, 0x105633e9, 0xd647136d,
+ 0xd7618c9a, 0xa10c7a37, 0xf8148e59, 0x133c89eb,
+ 0xa927eece, 0x61c935b7, 0x1ce5ede1, 0x47b13c7a,
+ 0xd2df599c, 0xf2733f55, 0x14ce7918, 0xc737bf73,
+ 0xf7cdea53, 0xfdaa5b5f, 0x3d6f14df, 0x44db8678,
+ 0xaff381ca, 0x68c43eb9, 0x24342c38, 0xa3405fc2,
+ 0x1dc37216, 0xe2250cbc, 0x3c498b28, 0x0d9541ff,
+ 0xa8017139, 0x0cb3de08, 0xb4e49cd8, 0x56c19064,
+ 0xcb84617b, 0x32b670d5, 0x6c5c7448, 0xb85742d0,
+};
+#define ADD_ROUND_KEY_4 (block[0]^=*keysched++, block[1]^=*keysched++, \
+ block[2]^=*keysched++, block[3]^=*keysched++)
+#define ADD_ROUND_KEY_6 (block[0]^=*keysched++, block[1]^=*keysched++, \
+ block[2]^=*keysched++, block[3]^=*keysched++, \
+ block[4]^=*keysched++, block[5]^=*keysched++)
+#define ADD_ROUND_KEY_8 (block[0]^=*keysched++, block[1]^=*keysched++, \
+ block[2]^=*keysched++, block[3]^=*keysched++, \
+ block[4]^=*keysched++, block[5]^=*keysched++, \
+ block[6]^=*keysched++, block[7]^=*keysched++)
+#define MOVEWORD(i) ( block[i] = newstate[i] )
+#undef MAKEWORD
+#define MAKEWORD(i) ( newstate[i] = (E0[(block[i] >> 24) & 0xFF] ^ \
+ E1[(block[(i+C1)%Nb] >> 16) & 0xFF] ^ \
+ E2[(block[(i+C2)%Nb] >> 8) & 0xFF] ^ \
+ E3[block[(i+C3)%Nb] & 0xFF]) )
+#define LASTWORD(i) ( newstate[i] = (Sbox[(block[i] >> 24) & 0xFF] << 24) | \
+ (Sbox[(block[(i+C1)%Nb] >> 16) & 0xFF] << 16) | \
+ (Sbox[(block[(i+C2)%Nb] >> 8) & 0xFF] << 8) | \
+ (Sbox[(block[(i+C3)%Nb] ) & 0xFF] ) )
+static void aes_encrypt_nb_4(AESContext * ctx, unsigned int * block)
+{
+ int i;
+ static const int C1 = 1, C2 = 2, C3 = 3, Nb = 4;
+ unsigned int *keysched = ctx->keysched;
+ unsigned int newstate[4];
+ for (i = 0; i < ctx->Nr - 1; i++) {
+ ADD_ROUND_KEY_4;
+ MAKEWORD(0);
+ MAKEWORD(1);
+ MAKEWORD(2);
+ MAKEWORD(3);
+ MOVEWORD(0);
+ MOVEWORD(1);
+ MOVEWORD(2);
+ MOVEWORD(3);
+ }
+ ADD_ROUND_KEY_4;
+ LASTWORD(0);
+ LASTWORD(1);
+ LASTWORD(2);
+ LASTWORD(3);
+ MOVEWORD(0);
+ MOVEWORD(1);
+ MOVEWORD(2);
+ MOVEWORD(3);
+ ADD_ROUND_KEY_4;
+}
+static void aes_encrypt_nb_6(AESContext * ctx, unsigned int * block)
+{
+ int i;
+ static const int C1 = 1, C2 = 2, C3 = 3, Nb = 6;
+ unsigned int *keysched = ctx->keysched;
+ unsigned int newstate[6];
+ for (i = 0; i < ctx->Nr - 1; i++) {
+ ADD_ROUND_KEY_6;
+ MAKEWORD(0);
+ MAKEWORD(1);
+ MAKEWORD(2);
+ MAKEWORD(3);
+ MAKEWORD(4);
+ MAKEWORD(5);
+ MOVEWORD(0);
+ MOVEWORD(1);
+ MOVEWORD(2);
+ MOVEWORD(3);
+ MOVEWORD(4);
+ MOVEWORD(5);
+ }
+ ADD_ROUND_KEY_6;
+ LASTWORD(0);
+ LASTWORD(1);
+ LASTWORD(2);
+ LASTWORD(3);
+ LASTWORD(4);
+ LASTWORD(5);
+ MOVEWORD(0);
+ MOVEWORD(1);
+ MOVEWORD(2);
+ MOVEWORD(3);
+ MOVEWORD(4);
+ MOVEWORD(5);
+ ADD_ROUND_KEY_6;
+}
+static void aes_encrypt_nb_8(AESContext * ctx, unsigned int * block)
+{
+ int i;
+ static const int C1 = 1, C2 = 3, C3 = 4, Nb = 8;
+ unsigned int *keysched = ctx->keysched;
+ unsigned int newstate[8];
+ for (i = 0; i < ctx->Nr - 1; i++) {
+ ADD_ROUND_KEY_8;
+ MAKEWORD(0);
+ MAKEWORD(1);
+ MAKEWORD(2);
+ MAKEWORD(3);
+ MAKEWORD(4);
+ MAKEWORD(5);
+ MAKEWORD(6);
+ MAKEWORD(7);
+ MOVEWORD(0);
+ MOVEWORD(1);
+ MOVEWORD(2);
+ MOVEWORD(3);
+ MOVEWORD(4);
+ MOVEWORD(5);
+ MOVEWORD(6);
+ MOVEWORD(7);
+ }
+ ADD_ROUND_KEY_8;
+ LASTWORD(0);
+ LASTWORD(1);
+ LASTWORD(2);
+ LASTWORD(3);
+ LASTWORD(4);
+ LASTWORD(5);
+ LASTWORD(6);
+ LASTWORD(7);
+ MOVEWORD(0);
+ MOVEWORD(1);
+ MOVEWORD(2);
+ MOVEWORD(3);
+ MOVEWORD(4);
+ MOVEWORD(5);
+ MOVEWORD(6);
+ MOVEWORD(7);
+ ADD_ROUND_KEY_8;
+}
+#undef MAKEWORD
+#undef LASTWORD
+#define MAKEWORD(i) ( newstate[i] = (D0[(block[i] >> 24) & 0xFF] ^ \
+ D1[(block[(i+C1)%Nb] >> 16) & 0xFF] ^ \
+ D2[(block[(i+C2)%Nb] >> 8) & 0xFF] ^ \
+ D3[block[(i+C3)%Nb] & 0xFF]) )
+#define LASTWORD(i) (newstate[i] = (Sboxinv[(block[i] >> 24) & 0xFF] << 24) | \
+ (Sboxinv[(block[(i+C1)%Nb] >> 16) & 0xFF] << 16) | \
+ (Sboxinv[(block[(i+C2)%Nb] >> 8) & 0xFF] << 8) | \
+ (Sboxinv[(block[(i+C3)%Nb] ) & 0xFF] ) )
+static void aes_decrypt_nb_4(AESContext * ctx, unsigned int * block)
+{
+ int i;
+ static const int C1 = 4 - 1, C2 = 4 - 2, C3 = 4 - 3, Nb = 4;
+ unsigned int *keysched = ctx->invkeysched;
+ unsigned int newstate[4];
+ for (i = 0; i < ctx->Nr - 1; i++) {
+ ADD_ROUND_KEY_4;
+ MAKEWORD(0);
+ MAKEWORD(1);
+ MAKEWORD(2);
+ MAKEWORD(3);
+ MOVEWORD(0);
+ MOVEWORD(1);
+ MOVEWORD(2);
+ MOVEWORD(3);
+ }
+ ADD_ROUND_KEY_4;
+ LASTWORD(0);
+ LASTWORD(1);
+ LASTWORD(2);
+ LASTWORD(3);
+ MOVEWORD(0);
+ MOVEWORD(1);
+ MOVEWORD(2);
+ MOVEWORD(3);
+ ADD_ROUND_KEY_4;
+}
+static void aes_decrypt_nb_6(AESContext * ctx, unsigned int * block)
+{
+ int i;
+ static const int C1 = 6 - 1, C2 = 6 - 2, C3 = 6 - 3, Nb = 6;
+ unsigned int *keysched = ctx->invkeysched;
+ unsigned int newstate[6];
+ for (i = 0; i < ctx->Nr - 1; i++) {
+ ADD_ROUND_KEY_6;
+ MAKEWORD(0);
+ MAKEWORD(1);
+ MAKEWORD(2);
+ MAKEWORD(3);
+ MAKEWORD(4);
+ MAKEWORD(5);
+ MOVEWORD(0);
+ MOVEWORD(1);
+ MOVEWORD(2);
+ MOVEWORD(3);
+ MOVEWORD(4);
+ MOVEWORD(5);
+ }
+ ADD_ROUND_KEY_6;
+ LASTWORD(0);
+ LASTWORD(1);
+ LASTWORD(2);
+ LASTWORD(3);
+ LASTWORD(4);
+ LASTWORD(5);
+ MOVEWORD(0);
+ MOVEWORD(1);
+ MOVEWORD(2);
+ MOVEWORD(3);
+ MOVEWORD(4);
+ MOVEWORD(5);
+ ADD_ROUND_KEY_6;
+}
+static void aes_decrypt_nb_8(AESContext * ctx, unsigned int * block)
+{
+ int i;
+ static const int C1 = 8 - 1, C2 = 8 - 3, C3 = 8 - 4, Nb = 8;
+ unsigned int *keysched = ctx->invkeysched;
+ unsigned int newstate[8];
+ for (i = 0; i < ctx->Nr - 1; i++) {
+ ADD_ROUND_KEY_8;
+ MAKEWORD(0);
+ MAKEWORD(1);
+ MAKEWORD(2);
+ MAKEWORD(3);
+ MAKEWORD(4);
+ MAKEWORD(5);
+ MAKEWORD(6);
+ MAKEWORD(7);
+ MOVEWORD(0);
+ MOVEWORD(1);
+ MOVEWORD(2);
+ MOVEWORD(3);
+ MOVEWORD(4);
+ MOVEWORD(5);
+ MOVEWORD(6);
+ MOVEWORD(7);
+ }
+ ADD_ROUND_KEY_8;
+ LASTWORD(0);
+ LASTWORD(1);
+ LASTWORD(2);
+ LASTWORD(3);
+ LASTWORD(4);
+ LASTWORD(5);
+ LASTWORD(6);
+ LASTWORD(7);
+ MOVEWORD(0);
+ MOVEWORD(1);
+ MOVEWORD(2);
+ MOVEWORD(3);
+ MOVEWORD(4);
+ MOVEWORD(5);
+ MOVEWORD(6);
+ MOVEWORD(7);
+ ADD_ROUND_KEY_8;
+}
+#undef MAKEWORD
+#undef LASTWORD
+static void aes_setup(AESContext * ctx, int blocklen,
+ const unsigned char *key, int keylen)
+{
+ int i, j, Nk, rconst;
+ ASSERT(blocklen == 16 || blocklen == 24 || blocklen == 32);
+ ASSERT(keylen == 16 || keylen == 24 || keylen == 32);
+ Nk = keylen / 4;
+ ctx->Nb = blocklen / 4;
+ ctx->Nr = 6 + (ctx->Nb > Nk ? ctx->Nb : Nk);
+ if (ctx->Nb == 8) {
+ ctx->encrypt = aes_encrypt_nb_8, ctx->decrypt = aes_decrypt_nb_8;
+ } else if (ctx->Nb == 6) {
+ ctx->encrypt = aes_encrypt_nb_6, ctx->decrypt = aes_decrypt_nb_6;
+ } else if (ctx->Nb == 4) {
+ ctx->encrypt = aes_encrypt_nb_4, ctx->decrypt = aes_decrypt_nb_4;
+ }
+ rconst = 1;
+ for (i = 0; i < (ctx->Nr + 1) * ctx->Nb; i++) {
+ if (i < Nk) {
+ ctx->keysched[i] = GET_32BIT_MSB_FIRST(key + 4 * i);
+ } else {
+ unsigned int temp = ctx->keysched[i - 1];
+ if (i % Nk == 0) {
+ int a, b, c, d;
+ a = (temp >> 16) & 0xFF;
+ b = (temp >> 8) & 0xFF;
+ c = (temp >> 0) & 0xFF;
+ d = (temp >> 24) & 0xFF;
+ temp = Sbox[a] ^ rconst;
+ temp = (temp << 8) | Sbox[b];
+ temp = (temp << 8) | Sbox[c];
+ temp = (temp << 8) | Sbox[d];
+ rconst = mulby2(rconst);
+ } else if (i % Nk == 4 && Nk > 6) {
+ int a, b, c, d;
+ a = (temp >> 24) & 0xFF;
+ b = (temp >> 16) & 0xFF;
+ c = (temp >> 8) & 0xFF;
+ d = (temp >> 0) & 0xFF;
+ temp = Sbox[a];
+ temp = (temp << 8) | Sbox[b];
+ temp = (temp << 8) | Sbox[c];
+ temp = (temp << 8) | Sbox[d];
+ }
+ ctx->keysched[i] = ctx->keysched[i - Nk] ^ temp;
+ }
+ }
+ for (i = 0; i <= ctx->Nr; i++) {
+ for (j = 0; j < ctx->Nb; j++) {
+ unsigned int temp;
+ temp = ctx->keysched[(ctx->Nr - i) * ctx->Nb + j];
+ if (i != 0 && i != ctx->Nr) {
+ int a, b, c, d;
+ a = (temp >> 24) & 0xFF;
+ b = (temp >> 16) & 0xFF;
+ c = (temp >> 8) & 0xFF;
+ d = (temp >> 0) & 0xFF;
+ temp = D0[Sbox[a]];
+ temp ^= D1[Sbox[b]];
+ temp ^= D2[Sbox[c]];
+ temp ^= D3[Sbox[d]];
+ }
+ ctx->invkeysched[i * ctx->Nb + j] = temp;
+ }
+ }
+}
+static void aes_decrypt(AESContext * ctx, unsigned int * block)
+{
+ ctx->decrypt(ctx, block);
+}
+static void aes_decrypt_cbc(unsigned char *dest, const unsigned char *src, int len, AESContext * ctx)
+{
+ unsigned int iv[4], x[4], ct[4];
+ int i;
+ ASSERT((len & 15) == 0);
+ FXSYS_memcpy32(iv, ctx->iv, sizeof(iv));
+ while (len > 0) {
+ for (i = 0; i < 4; i++) {
+ x[i] = ct[i] = GET_32BIT_MSB_FIRST(src + 4 * i);
+ }
+ aes_decrypt(ctx, x);
+ for (i = 0; i < 4; i++) {
+ PUT_32BIT_MSB_FIRST(dest + 4 * i, iv[i] ^ x[i]);
+ iv[i] = ct[i];
+ }
+ dest += 16;
+ src += 16;
+ len -= 16;
+ }
+ FXSYS_memcpy32(ctx->iv, iv, sizeof(iv));
+}
+static void aes_encrypt(AESContext * ctx, unsigned int * block)
+{
+ ctx->encrypt(ctx, block);
+}
+static void aes_encrypt_cbc(unsigned char *dest, const unsigned char *src, int len, AESContext * ctx)
+{
+ unsigned int iv[4];
+ int i;
+ ASSERT((len & 15) == 0);
+ FXSYS_memcpy32(iv, ctx->iv, sizeof(iv));
+ while (len > 0) {
+ for (i = 0; i < 4; i++) {
+ iv[i] ^= GET_32BIT_MSB_FIRST(src + 4 * i);
+ }
+ aes_encrypt(ctx, iv);
+ for (i = 0; i < 4; i++) {
+ PUT_32BIT_MSB_FIRST(dest + 4 * i, iv[i]);
+ }
+ dest += 16;
+ src += 16;
+ len -= 16;
+ }
+ FXSYS_memcpy32(ctx->iv, iv, sizeof(iv));
+}
+void CRYPT_AESSetKey(FX_LPVOID context, FX_DWORD blocklen, FX_LPCBYTE key, FX_DWORD keylen, FX_BOOL bEncrypt)
+{
+ aes_setup((AESContext*)context, blocklen, key, keylen);
+}
+void CRYPT_AESSetIV(FX_LPVOID context, FX_LPCBYTE iv)
+{
+ int i;
+ for (i = 0; i < ((AESContext*)context)->Nb; i++) {
+ ((AESContext*)context)->iv[i] = GET_32BIT_MSB_FIRST(iv + 4 * i);
+ }
+}
+void CRYPT_AESDecrypt(FX_LPVOID context, FX_LPBYTE dest, FX_LPCBYTE src, FX_DWORD len)
+{
+ aes_decrypt_cbc(dest, src, len, (AESContext*)context);
+}
+void CRYPT_AESEncrypt(FX_LPVOID context, FX_LPBYTE dest, FX_LPCBYTE src, FX_DWORD len)
+{
+ aes_encrypt_cbc(dest, src, len, (AESContext*)context);
+}
+#ifdef __cplusplus
+};
+#endif
diff --git a/core/src/fdrm/crypto/fx_crypt_sha.cpp b/core/src/fdrm/crypto/fx_crypt_sha.cpp
index acabcb7ba4..4e931b2d03 100644
--- a/core/src/fdrm/crypto/fx_crypt_sha.cpp
+++ b/core/src/fdrm/crypto/fx_crypt_sha.cpp
@@ -1,742 +1,742 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../../include/fxcrt/fx_basic.h"
-#include "../../../include/fdrm/fx_crypt.h"
-#ifdef __cplusplus
-extern "C" {
-#endif
-typedef struct {
- unsigned int h[5];
- unsigned char block[64];
- int blkused;
- unsigned int lenhi, lenlo;
-} SHA_State;
-#define rol(x,y) ( ((x) << (y)) | (((unsigned int)x) >> (32-y)) )
-static void SHA_Core_Init(unsigned int h[5])
-{
- h[0] = 0x67452301;
- h[1] = 0xefcdab89;
- h[2] = 0x98badcfe;
- h[3] = 0x10325476;
- h[4] = 0xc3d2e1f0;
-}
-static void SHATransform(unsigned int * digest, unsigned int * block)
-{
- unsigned int w[80];
- unsigned int a, b, c, d, e;
- int t;
- for (t = 0; t < 16; t++) {
- w[t] = block[t];
- }
- for (t = 16; t < 80; t++) {
- unsigned int tmp = w[t - 3] ^ w[t - 8] ^ w[t - 14] ^ w[t - 16];
- w[t] = rol(tmp, 1);
- }
- a = digest[0];
- b = digest[1];
- c = digest[2];
- d = digest[3];
- e = digest[4];
- for (t = 0; t < 20; t++) {
- unsigned int tmp =
- rol(a, 5) + ((b & c) | (d & ~b)) + e + w[t] + 0x5a827999;
- e = d;
- d = c;
- c = rol(b, 30);
- b = a;
- a = tmp;
- }
- for (t = 20; t < 40; t++) {
- unsigned int tmp = rol(a, 5) + (b ^ c ^ d) + e + w[t] + 0x6ed9eba1;
- e = d;
- d = c;
- c = rol(b, 30);
- b = a;
- a = tmp;
- }
- for (t = 40; t < 60; t++) {
- unsigned int tmp = rol(a,
- 5) + ((b & c) | (b & d) | (c & d)) + e + w[t] +
- 0x8f1bbcdc;
- e = d;
- d = c;
- c = rol(b, 30);
- b = a;
- a = tmp;
- }
- for (t = 60; t < 80; t++) {
- unsigned int tmp = rol(a, 5) + (b ^ c ^ d) + e + w[t] + 0xca62c1d6;
- e = d;
- d = c;
- c = rol(b, 30);
- b = a;
- a = tmp;
- }
- digest[0] += a;
- digest[1] += b;
- digest[2] += c;
- digest[3] += d;
- digest[4] += e;
-}
-void CRYPT_SHA1Start(FX_LPVOID context)
-{
- SHA_State * s = (SHA_State*)context;
- SHA_Core_Init(s->h);
- s->blkused = 0;
- s->lenhi = s->lenlo = 0;
-}
-void CRYPT_SHA1Update(FX_LPVOID context, FX_LPCBYTE data, FX_DWORD size)
-{
- SHA_State * s = (SHA_State*)context;
- unsigned char *q = (unsigned char *)data;
- unsigned int wordblock[16];
- int len = size;
- unsigned int lenw = len;
- int i;
- s->lenlo += lenw;
- s->lenhi += (s->lenlo < lenw);
- if (s->blkused && s->blkused + len < 64) {
- FXSYS_memcpy32(s->block + s->blkused, q, len);
- s->blkused += len;
- } else {
- while (s->blkused + len >= 64) {
- FXSYS_memcpy32(s->block + s->blkused, q, 64 - s->blkused);
- q += 64 - s->blkused;
- len -= 64 - s->blkused;
- for (i = 0; i < 16; i++) {
- wordblock[i] =
- (((unsigned int) s->block[i * 4 + 0]) << 24) |
- (((unsigned int) s->block[i * 4 + 1]) << 16) |
- (((unsigned int) s->block[i * 4 + 2]) << 8) |
- (((unsigned int) s->block[i * 4 + 3]) << 0);
- }
- SHATransform(s->h, wordblock);
- s->blkused = 0;
- }
- FXSYS_memcpy32(s->block, q, len);
- s->blkused = len;
- }
-}
-void CRYPT_SHA1Finish(FX_LPVOID context, FX_BYTE digest[20])
-{
- SHA_State * s = (SHA_State*)context;
- int i;
- int pad;
- unsigned char c[64];
- unsigned int lenhi, lenlo;
- if (s->blkused >= 56) {
- pad = 56 + 64 - s->blkused;
- } else {
- pad = 56 - s->blkused;
- }
- lenhi = (s->lenhi << 3) | (s->lenlo >> (32 - 3));
- lenlo = (s->lenlo << 3);
- FXSYS_memset32(c, 0, pad);
- c[0] = 0x80;
- CRYPT_SHA1Update(s, c, pad);
- c[0] = (lenhi >> 24) & 0xFF;
- c[1] = (lenhi >> 16) & 0xFF;
- c[2] = (lenhi >> 8) & 0xFF;
- c[3] = (lenhi >> 0) & 0xFF;
- c[4] = (lenlo >> 24) & 0xFF;
- c[5] = (lenlo >> 16) & 0xFF;
- c[6] = (lenlo >> 8) & 0xFF;
- c[7] = (lenlo >> 0) & 0xFF;
- CRYPT_SHA1Update(s, c, 8);
- for (i = 0; i < 5; i++) {
- digest[i * 4] = (s->h[i] >> 24) & 0xFF;
- digest[i * 4 + 1] = (s->h[i] >> 16) & 0xFF;
- digest[i * 4 + 2] = (s->h[i] >> 8) & 0xFF;
- digest[i * 4 + 3] = (s->h[i]) & 0xFF;
- }
-}
-void CRYPT_SHA1Generate(FX_LPCBYTE data, FX_DWORD size, FX_BYTE digest[20])
-{
- SHA_State s;
- CRYPT_SHA1Start(&s);
- CRYPT_SHA1Update(&s, data, size);
- CRYPT_SHA1Finish(&s, digest);
-}
-typedef struct {
- FX_DWORD total[2];
- FX_DWORD state[8];
- FX_BYTE buffer[64];
-}
-sha256_context;
-#define GET_FX_DWORD(n,b,i) \
- { \
- (n) = ( (FX_DWORD) (b)[(i) ] << 24 ) \
- | ( (FX_DWORD) (b)[(i) + 1] << 16 ) \
- | ( (FX_DWORD) (b)[(i) + 2] << 8 ) \
- | ( (FX_DWORD) (b)[(i) + 3] ); \
- }
-#define PUT_FX_DWORD(n,b,i) \
- { \
- (b)[(i) ] = (FX_BYTE) ( (n) >> 24 ); \
- (b)[(i) + 1] = (FX_BYTE) ( (n) >> 16 ); \
- (b)[(i) + 2] = (FX_BYTE) ( (n) >> 8 ); \
- (b)[(i) + 3] = (FX_BYTE) ( (n) ); \
- }
-void CRYPT_SHA256Start( FX_LPVOID context )
-{
- sha256_context *ctx = (sha256_context *)context;
- ctx->total[0] = 0;
- ctx->total[1] = 0;
- ctx->state[0] = 0x6A09E667;
- ctx->state[1] = 0xBB67AE85;
- ctx->state[2] = 0x3C6EF372;
- ctx->state[3] = 0xA54FF53A;
- ctx->state[4] = 0x510E527F;
- ctx->state[5] = 0x9B05688C;
- ctx->state[6] = 0x1F83D9AB;
- ctx->state[7] = 0x5BE0CD19;
-}
-static void sha256_process( sha256_context *ctx, const FX_BYTE data[64] )
-{
- FX_DWORD temp1, temp2, W[64];
- FX_DWORD A, B, C, D, E, F, G, H;
- GET_FX_DWORD( W[0], data, 0 );
- GET_FX_DWORD( W[1], data, 4 );
- GET_FX_DWORD( W[2], data, 8 );
- GET_FX_DWORD( W[3], data, 12 );
- GET_FX_DWORD( W[4], data, 16 );
- GET_FX_DWORD( W[5], data, 20 );
- GET_FX_DWORD( W[6], data, 24 );
- GET_FX_DWORD( W[7], data, 28 );
- GET_FX_DWORD( W[8], data, 32 );
- GET_FX_DWORD( W[9], data, 36 );
- GET_FX_DWORD( W[10], data, 40 );
- GET_FX_DWORD( W[11], data, 44 );
- GET_FX_DWORD( W[12], data, 48 );
- GET_FX_DWORD( W[13], data, 52 );
- GET_FX_DWORD( W[14], data, 56 );
- GET_FX_DWORD( W[15], data, 60 );
-#define SHR(x,n) ((x & 0xFFFFFFFF) >> n)
-#define ROTR(x,n) (SHR(x,n) | (x << (32 - n)))
-#define S0(x) (ROTR(x, 7) ^ ROTR(x,18) ^ SHR(x, 3))
-#define S1(x) (ROTR(x,17) ^ ROTR(x,19) ^ SHR(x,10))
-#define S2(x) (ROTR(x, 2) ^ ROTR(x,13) ^ ROTR(x,22))
-#define S3(x) (ROTR(x, 6) ^ ROTR(x,11) ^ ROTR(x,25))
-#define F0(x,y,z) ((x & y) | (z & (x | y)))
-#define F1(x,y,z) (z ^ (x & (y ^ z)))
-#define R(t) \
- ( \
- W[t] = S1(W[t - 2]) + W[t - 7] + \
- S0(W[t - 15]) + W[t - 16] \
- )
-#define P(a,b,c,d,e,f,g,h,x,K) \
- { \
- temp1 = h + S3(e) + F1(e,f,g) + K + x; \
- temp2 = S2(a) + F0(a,b,c); \
- d += temp1; h = temp1 + temp2; \
- }
- A = ctx->state[0];
- B = ctx->state[1];
- C = ctx->state[2];
- D = ctx->state[3];
- E = ctx->state[4];
- F = ctx->state[5];
- G = ctx->state[6];
- H = ctx->state[7];
- P( A, B, C, D, E, F, G, H, W[ 0], 0x428A2F98 );
- P( H, A, B, C, D, E, F, G, W[ 1], 0x71374491 );
- P( G, H, A, B, C, D, E, F, W[ 2], 0xB5C0FBCF );
- P( F, G, H, A, B, C, D, E, W[ 3], 0xE9B5DBA5 );
- P( E, F, G, H, A, B, C, D, W[ 4], 0x3956C25B );
- P( D, E, F, G, H, A, B, C, W[ 5], 0x59F111F1 );
- P( C, D, E, F, G, H, A, B, W[ 6], 0x923F82A4 );
- P( B, C, D, E, F, G, H, A, W[ 7], 0xAB1C5ED5 );
- P( A, B, C, D, E, F, G, H, W[ 8], 0xD807AA98 );
- P( H, A, B, C, D, E, F, G, W[ 9], 0x12835B01 );
- P( G, H, A, B, C, D, E, F, W[10], 0x243185BE );
- P( F, G, H, A, B, C, D, E, W[11], 0x550C7DC3 );
- P( E, F, G, H, A, B, C, D, W[12], 0x72BE5D74 );
- P( D, E, F, G, H, A, B, C, W[13], 0x80DEB1FE );
- P( C, D, E, F, G, H, A, B, W[14], 0x9BDC06A7 );
- P( B, C, D, E, F, G, H, A, W[15], 0xC19BF174 );
- P( A, B, C, D, E, F, G, H, R(16), 0xE49B69C1 );
- P( H, A, B, C, D, E, F, G, R(17), 0xEFBE4786 );
- P( G, H, A, B, C, D, E, F, R(18), 0x0FC19DC6 );
- P( F, G, H, A, B, C, D, E, R(19), 0x240CA1CC );
- P( E, F, G, H, A, B, C, D, R(20), 0x2DE92C6F );
- P( D, E, F, G, H, A, B, C, R(21), 0x4A7484AA );
- P( C, D, E, F, G, H, A, B, R(22), 0x5CB0A9DC );
- P( B, C, D, E, F, G, H, A, R(23), 0x76F988DA );
- P( A, B, C, D, E, F, G, H, R(24), 0x983E5152 );
- P( H, A, B, C, D, E, F, G, R(25), 0xA831C66D );
- P( G, H, A, B, C, D, E, F, R(26), 0xB00327C8 );
- P( F, G, H, A, B, C, D, E, R(27), 0xBF597FC7 );
- P( E, F, G, H, A, B, C, D, R(28), 0xC6E00BF3 );
- P( D, E, F, G, H, A, B, C, R(29), 0xD5A79147 );
- P( C, D, E, F, G, H, A, B, R(30), 0x06CA6351 );
- P( B, C, D, E, F, G, H, A, R(31), 0x14292967 );
- P( A, B, C, D, E, F, G, H, R(32), 0x27B70A85 );
- P( H, A, B, C, D, E, F, G, R(33), 0x2E1B2138 );
- P( G, H, A, B, C, D, E, F, R(34), 0x4D2C6DFC );
- P( F, G, H, A, B, C, D, E, R(35), 0x53380D13 );
- P( E, F, G, H, A, B, C, D, R(36), 0x650A7354 );
- P( D, E, F, G, H, A, B, C, R(37), 0x766A0ABB );
- P( C, D, E, F, G, H, A, B, R(38), 0x81C2C92E );
- P( B, C, D, E, F, G, H, A, R(39), 0x92722C85 );
- P( A, B, C, D, E, F, G, H, R(40), 0xA2BFE8A1 );
- P( H, A, B, C, D, E, F, G, R(41), 0xA81A664B );
- P( G, H, A, B, C, D, E, F, R(42), 0xC24B8B70 );
- P( F, G, H, A, B, C, D, E, R(43), 0xC76C51A3 );
- P( E, F, G, H, A, B, C, D, R(44), 0xD192E819 );
- P( D, E, F, G, H, A, B, C, R(45), 0xD6990624 );
- P( C, D, E, F, G, H, A, B, R(46), 0xF40E3585 );
- P( B, C, D, E, F, G, H, A, R(47), 0x106AA070 );
- P( A, B, C, D, E, F, G, H, R(48), 0x19A4C116 );
- P( H, A, B, C, D, E, F, G, R(49), 0x1E376C08 );
- P( G, H, A, B, C, D, E, F, R(50), 0x2748774C );
- P( F, G, H, A, B, C, D, E, R(51), 0x34B0BCB5 );
- P( E, F, G, H, A, B, C, D, R(52), 0x391C0CB3 );
- P( D, E, F, G, H, A, B, C, R(53), 0x4ED8AA4A );
- P( C, D, E, F, G, H, A, B, R(54), 0x5B9CCA4F );
- P( B, C, D, E, F, G, H, A, R(55), 0x682E6FF3 );
- P( A, B, C, D, E, F, G, H, R(56), 0x748F82EE );
- P( H, A, B, C, D, E, F, G, R(57), 0x78A5636F );
- P( G, H, A, B, C, D, E, F, R(58), 0x84C87814 );
- P( F, G, H, A, B, C, D, E, R(59), 0x8CC70208 );
- P( E, F, G, H, A, B, C, D, R(60), 0x90BEFFFA );
- P( D, E, F, G, H, A, B, C, R(61), 0xA4506CEB );
- P( C, D, E, F, G, H, A, B, R(62), 0xBEF9A3F7 );
- P( B, C, D, E, F, G, H, A, R(63), 0xC67178F2 );
- ctx->state[0] += A;
- ctx->state[1] += B;
- ctx->state[2] += C;
- ctx->state[3] += D;
- ctx->state[4] += E;
- ctx->state[5] += F;
- ctx->state[6] += G;
- ctx->state[7] += H;
-}
-void CRYPT_SHA256Update( void* context, FX_LPCBYTE input, FX_DWORD length )
-{
- sha256_context *ctx = (sha256_context *)context;
- FX_DWORD left, fill;
- if( ! length ) {
- return;
- }
- left = ctx->total[0] & 0x3F;
- fill = 64 - left;
- ctx->total[0] += length;
- ctx->total[0] &= 0xFFFFFFFF;
- if( ctx->total[0] < length ) {
- ctx->total[1]++;
- }
- if( left && length >= fill ) {
- FXSYS_memcpy32( (void *) (ctx->buffer + left),
- (void *) input, fill );
- sha256_process( ctx, ctx->buffer );
- length -= fill;
- input += fill;
- left = 0;
- }
- while( length >= 64 ) {
- sha256_process( ctx, input );
- length -= 64;
- input += 64;
- }
- if( length ) {
- FXSYS_memcpy32( (void *) (ctx->buffer + left),
- (void *) input, length );
- }
-}
-static const FX_BYTE sha256_padding[64] = {
- 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
-};
-void CRYPT_SHA256Finish( FX_LPVOID context, FX_BYTE digest[32] )
-{
- sha256_context *ctx = (sha256_context *)context;
- FX_DWORD last, padn;
- FX_DWORD high, low;
- FX_BYTE msglen[8];
- high = ( ctx->total[0] >> 29 )
- | ( ctx->total[1] << 3 );
- low = ( ctx->total[0] << 3 );
- PUT_FX_DWORD( high, msglen, 0 );
- PUT_FX_DWORD( low, msglen, 4 );
- last = ctx->total[0] & 0x3F;
- padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last );
- CRYPT_SHA256Update( ctx, sha256_padding, padn );
- CRYPT_SHA256Update( ctx, msglen, 8 );
- PUT_FX_DWORD( ctx->state[0], digest, 0 );
- PUT_FX_DWORD( ctx->state[1], digest, 4 );
- PUT_FX_DWORD( ctx->state[2], digest, 8 );
- PUT_FX_DWORD( ctx->state[3], digest, 12 );
- PUT_FX_DWORD( ctx->state[4], digest, 16 );
- PUT_FX_DWORD( ctx->state[5], digest, 20 );
- PUT_FX_DWORD( ctx->state[6], digest, 24 );
- PUT_FX_DWORD( ctx->state[7], digest, 28 );
-}
-void CRYPT_SHA256Generate(FX_LPCBYTE data, FX_DWORD size, FX_BYTE digest[32])
-{
- sha256_context ctx;
- CRYPT_SHA256Start(&ctx);
- CRYPT_SHA256Update(&ctx, data, size);
- CRYPT_SHA256Finish(&ctx, digest);
-}
-typedef struct {
- FX_UINT64 total[2];
- FX_UINT64 state[8];
- FX_BYTE buffer[128];
-} sha384_context;
-FX_UINT64 FX_ato64i(FX_LPCSTR str)
-{
- FXSYS_assert(str != NULL);
- FX_UINT64 ret = 0;
- int len = (int)FXSYS_strlen(str);
- len = len > 16 ? 16 : len;
- for (int i = 0; i < len; ++i) {
- if (i) {
- ret <<= 4;
- }
- if (str[i] >= '0' && str[i] <= '9') {
- ret |= (str[i] - '0') & 0xFF;
- } else if (str[i] >= 'a' && str[i] <= 'f') {
- ret |= (str[i] - 'a' + 10) & 0xFF;
- } else if (str[i] >= 'A' && str[i] <= 'F') {
- ret |= (str[i] - 'A' + 10) & 0xFF;
- } else {
- FXSYS_assert(FALSE);
- }
- }
- return ret;
-}
-void CRYPT_SHA384Start(FX_LPVOID context)
-{
- if (context == NULL) {
- return;
- }
- sha384_context *ctx = (sha384_context *)context;
- FXSYS_memset32(ctx, 0, sizeof(sha384_context));
- ctx->state[0] = FX_ato64i("cbbb9d5dc1059ed8");
- ctx->state[1] = FX_ato64i("629a292a367cd507");
- ctx->state[2] = FX_ato64i("9159015a3070dd17");
- ctx->state[3] = FX_ato64i("152fecd8f70e5939");
- ctx->state[4] = FX_ato64i("67332667ffc00b31");
- ctx->state[5] = FX_ato64i("8eb44a8768581511");
- ctx->state[6] = FX_ato64i("db0c2e0d64f98fa7");
- ctx->state[7] = FX_ato64i("47b5481dbefa4fa4");
-}
-#define SHA384_F0(x,y,z) ((x & y) | (z & (x | y)))
-#define SHA384_F1(x,y,z) (z ^ (x & (y ^ z)))
-#define SHA384_SHR(x,n) (x >> n)
-#define SHA384_ROTR(x,n) (SHA384_SHR(x, n) | x << (64 - n))
-#define SHA384_S0(x) (SHA384_ROTR(x, 1) ^ SHA384_ROTR(x, 8) ^ SHA384_SHR(x, 7))
-#define SHA384_S1(x) (SHA384_ROTR(x,19) ^ SHA384_ROTR(x, 61) ^ SHA384_SHR(x, 6))
-#define SHA384_S2(x) (SHA384_ROTR(x, 28) ^ SHA384_ROTR(x, 34) ^ SHA384_ROTR(x, 39))
-#define SHA384_S3(x) (SHA384_ROTR(x, 14) ^ SHA384_ROTR(x,18) ^ SHA384_ROTR(x, 41))
-#define SHA384_P(a,b,c,d,e,f,g,h,x,K) \
- { \
- temp1 = h + SHA384_S3(e) + SHA384_F1(e,f,g) + K + x; \
- temp2 = SHA384_S2(a) + SHA384_F0(a,b,c); \
- d += temp1; h = temp1 + temp2; \
- }
-static const FX_BYTE sha384_padding[128] = {
- 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-};
-#define SHA384_R(t) (W[t] = SHA384_S1(W[t - 2]) + W[t - 7] + SHA384_S0(W[t - 15]) + W[t - 16])
-static FX_LPCSTR constants[] = {
- "428a2f98d728ae22",
- "7137449123ef65cd",
- "b5c0fbcfec4d3b2f",
- "e9b5dba58189dbbc",
- "3956c25bf348b538",
- "59f111f1b605d019",
- "923f82a4af194f9b",
- "ab1c5ed5da6d8118",
- "d807aa98a3030242",
- "12835b0145706fbe",
- "243185be4ee4b28c",
- "550c7dc3d5ffb4e2",
- "72be5d74f27b896f",
- "80deb1fe3b1696b1",
- "9bdc06a725c71235",
- "c19bf174cf692694",
- "e49b69c19ef14ad2",
- "efbe4786384f25e3",
- "0fc19dc68b8cd5b5",
- "240ca1cc77ac9c65",
- "2de92c6f592b0275",
- "4a7484aa6ea6e483",
- "5cb0a9dcbd41fbd4",
- "76f988da831153b5",
- "983e5152ee66dfab",
- "a831c66d2db43210",
- "b00327c898fb213f",
- "bf597fc7beef0ee4",
- "c6e00bf33da88fc2",
- "d5a79147930aa725",
- "06ca6351e003826f",
- "142929670a0e6e70",
- "27b70a8546d22ffc",
- "2e1b21385c26c926",
- "4d2c6dfc5ac42aed",
- "53380d139d95b3df",
- "650a73548baf63de",
- "766a0abb3c77b2a8",
- "81c2c92e47edaee6",
- "92722c851482353b",
- "a2bfe8a14cf10364",
- "a81a664bbc423001",
- "c24b8b70d0f89791",
- "c76c51a30654be30",
- "d192e819d6ef5218",
- "d69906245565a910",
- "f40e35855771202a",
- "106aa07032bbd1b8",
- "19a4c116b8d2d0c8",
- "1e376c085141ab53",
- "2748774cdf8eeb99",
- "34b0bcb5e19b48a8",
- "391c0cb3c5c95a63",
- "4ed8aa4ae3418acb",
- "5b9cca4f7763e373",
- "682e6ff3d6b2b8a3",
- "748f82ee5defb2fc",
- "78a5636f43172f60",
- "84c87814a1f0ab72",
- "8cc702081a6439ec",
- "90befffa23631e28",
- "a4506cebde82bde9",
- "bef9a3f7b2c67915",
- "c67178f2e372532b",
- "ca273eceea26619c",
- "d186b8c721c0c207",
- "eada7dd6cde0eb1e",
- "f57d4f7fee6ed178",
- "06f067aa72176fba",
- "0a637dc5a2c898a6",
- "113f9804bef90dae",
- "1b710b35131c471b",
- "28db77f523047d84",
- "32caab7b40c72493",
- "3c9ebe0a15c9bebc",
- "431d67c49c100d4c",
- "4cc5d4becb3e42b6",
- "597f299cfc657e2a",
- "5fcb6fab3ad6faec",
- "6c44198c4a475817",
-};
-#define GET_FX_64WORD(n,b,i) \
- { \
- (n) = ( (FX_UINT64) (b)[(i) ] << 56 ) \
- | ( (FX_UINT64) (b)[(i) + 1] << 48 ) \
- | ( (FX_UINT64) (b)[(i) + 2] << 40 ) \
- | ( (FX_UINT64) (b)[(i) + 3] << 32 ) \
- | ( (FX_UINT64) (b)[(i) + 4] << 24 ) \
- | ( (FX_UINT64) (b)[(i) + 5] << 16 ) \
- | ( (FX_UINT64) (b)[(i) + 6] << 8 ) \
- | ( (FX_UINT64) (b)[(i) + 7] ); \
- }
-#define PUT_FX_64DWORD(n,b,i) \
- { \
- (b)[(i) ] = (FX_BYTE) ( (n) >> 56 ); \
- (b)[(i) + 1] = (FX_BYTE) ( (n) >> 48 ); \
- (b)[(i) + 2] = (FX_BYTE) ( (n) >> 40 ); \
- (b)[(i) + 3] = (FX_BYTE) ( (n) >> 32 ); \
- (b)[(i) + 4] = (FX_BYTE) ( (n) >> 24 ); \
- (b)[(i) + 5] = (FX_BYTE) ( (n) >> 16 ); \
- (b)[(i) + 6] = (FX_BYTE) ( (n) >> 8 ); \
- (b)[(i) + 7] = (FX_BYTE) ( (n) ); \
- }
-static void sha384_process( sha384_context *ctx, const FX_BYTE data[128] )
-{
- FX_UINT64 temp1, temp2;
- FX_UINT64 A, B, C, D, E, F, G, H;
- FX_UINT64 W[80];
- GET_FX_64WORD(W[0], data, 0);
- GET_FX_64WORD(W[1], data, 8);
- GET_FX_64WORD(W[2], data, 16);
- GET_FX_64WORD(W[3], data, 24);
- GET_FX_64WORD(W[4], data, 32);
- GET_FX_64WORD(W[5], data, 40);
- GET_FX_64WORD(W[6], data, 48);
- GET_FX_64WORD(W[7], data, 56);
- GET_FX_64WORD(W[8], data, 64);
- GET_FX_64WORD(W[9], data, 72);
- GET_FX_64WORD(W[10], data, 80);
- GET_FX_64WORD(W[11], data, 88);
- GET_FX_64WORD(W[12], data, 96);
- GET_FX_64WORD(W[13], data, 104);
- GET_FX_64WORD(W[14], data, 112);
- GET_FX_64WORD(W[15], data, 120);
- A = ctx->state[0];
- B = ctx->state[1];
- C = ctx->state[2];
- D = ctx->state[3];
- E = ctx->state[4];
- F = ctx->state[5];
- G = ctx->state[6];
- H = ctx->state[7];
- for (int i = 0; i < 10; ++i) {
- FX_UINT64 temp[8];
- if (i < 2) {
- temp[0] = W[i * 8];
- temp[1] = W[i * 8 + 1];
- temp[2] = W[i * 8 + 2];
- temp[3] = W[i * 8 + 3];
- temp[4] = W[i * 8 + 4];
- temp[5] = W[i * 8 + 5];
- temp[6] = W[i * 8 + 6];
- temp[7] = W[i * 8 + 7];
- } else {
- temp[0] = SHA384_R(i * 8);
- temp[1] = SHA384_R(i * 8 + 1);
- temp[2] = SHA384_R(i * 8 + 2);
- temp[3] = SHA384_R(i * 8 + 3);
- temp[4] = SHA384_R(i * 8 + 4);
- temp[5] = SHA384_R(i * 8 + 5);
- temp[6] = SHA384_R(i * 8 + 6);
- temp[7] = SHA384_R(i * 8 + 7);
- }
- SHA384_P( A, B, C, D, E, F, G, H, temp[ 0], FX_ato64i(constants[i * 8 ]) );
- SHA384_P( H, A, B, C, D, E, F, G, temp[ 1], FX_ato64i(constants[i * 8 + 1]) );
- SHA384_P( G, H, A, B, C, D, E, F, temp[ 2], FX_ato64i(constants[i * 8 + 2]) );
- SHA384_P( F, G, H, A, B, C, D, E, temp[ 3], FX_ato64i(constants[i * 8 + 3]) );
- SHA384_P( E, F, G, H, A, B, C, D, temp[ 4], FX_ato64i(constants[i * 8 + 4]) );
- SHA384_P( D, E, F, G, H, A, B, C, temp[ 5], FX_ato64i(constants[i * 8 + 5]) );
- SHA384_P( C, D, E, F, G, H, A, B, temp[ 6], FX_ato64i(constants[i * 8 + 6]) );
- SHA384_P( B, C, D, E, F, G, H, A, temp[ 7], FX_ato64i(constants[i * 8 + 7]) );
- }
- ctx->state[0] += A;
- ctx->state[1] += B;
- ctx->state[2] += C;
- ctx->state[3] += D;
- ctx->state[4] += E;
- ctx->state[5] += F;
- ctx->state[6] += G;
- ctx->state[7] += H;
-}
-void CRYPT_SHA384Update(FX_LPVOID context, FX_LPCBYTE input, FX_DWORD length)
-{
- sha384_context *ctx = (sha384_context *)context;
- FX_DWORD left, fill;
- if( ! length ) {
- return;
- }
- left = (FX_DWORD)ctx->total[0] & 0x7F;
- fill = 128 - left;
- ctx->total[0] += length;
- if( ctx->total[0] < length ) {
- ctx->total[1]++;
- }
- if( left && length >= fill ) {
- FXSYS_memcpy32( (void *) (ctx->buffer + left),
- (void *) input, fill );
- sha384_process( ctx, ctx->buffer );
- length -= fill;
- input += fill;
- left = 0;
- }
- while( length >= 128 ) {
- sha384_process( ctx, input );
- length -= 128;
- input += 128;
- }
- if( length ) {
- FXSYS_memcpy32( (void *) (ctx->buffer + left),
- (void *) input, length );
- }
-}
-void CRYPT_SHA384Finish(FX_LPVOID context, FX_BYTE digest[48])
-{
- sha384_context *ctx = (sha384_context *)context;
- FX_DWORD last, padn;
- FX_BYTE msglen[16];
- FXSYS_memset32(msglen, 0, 16);
- FX_UINT64 high, low;
- high = ( ctx->total[0] >> 29 )
- | ( ctx->total[1] << 3 );
- low = ( ctx->total[0] << 3 );
- PUT_FX_64DWORD( high, msglen, 0 );
- PUT_FX_64DWORD( low, msglen, 8 );
- last = (FX_DWORD)ctx->total[0] & 0x7F;
- padn = ( last < 112 ) ? ( 112 - last ) : ( 240 - last );
- CRYPT_SHA384Update( ctx, sha384_padding, padn );
- CRYPT_SHA384Update( ctx, msglen, 16 );
- PUT_FX_64DWORD(ctx->state[0], digest, 0);
- PUT_FX_64DWORD(ctx->state[1], digest, 8);
- PUT_FX_64DWORD(ctx->state[2], digest, 16);
- PUT_FX_64DWORD(ctx->state[3], digest, 24);
- PUT_FX_64DWORD(ctx->state[4], digest, 32);
- PUT_FX_64DWORD(ctx->state[5], digest, 40);
-}
-void CRYPT_SHA384Generate(FX_LPCBYTE data, FX_DWORD size, FX_BYTE digest[64])
-{
- sha384_context context;
- CRYPT_SHA384Start(&context);
- CRYPT_SHA384Update(&context, data, size);
- CRYPT_SHA384Finish(&context, digest);
-}
-void CRYPT_SHA512Start(FX_LPVOID context)
-{
- if (context == NULL) {
- return;
- }
- sha384_context *ctx = (sha384_context *)context;
- FXSYS_memset32(ctx, 0, sizeof(sha384_context));
- ctx->state[0] = FX_ato64i("6a09e667f3bcc908");
- ctx->state[1] = FX_ato64i("bb67ae8584caa73b");
- ctx->state[2] = FX_ato64i("3c6ef372fe94f82b");
- ctx->state[3] = FX_ato64i("a54ff53a5f1d36f1");
- ctx->state[4] = FX_ato64i("510e527fade682d1");
- ctx->state[5] = FX_ato64i("9b05688c2b3e6c1f");
- ctx->state[6] = FX_ato64i("1f83d9abfb41bd6b");
- ctx->state[7] = FX_ato64i("5be0cd19137e2179");
-}
-void CRYPT_SHA512Update(FX_LPVOID context, FX_LPCBYTE data, FX_DWORD size)
-{
- CRYPT_SHA384Update(context, data, size);
-}
-void CRYPT_SHA512Finish(FX_LPVOID context, FX_BYTE digest[64])
-{
- sha384_context *ctx = (sha384_context *)context;
- FX_DWORD last, padn;
- FX_BYTE msglen[16];
- FXSYS_memset32(msglen, 0, 16);
- FX_UINT64 high, low;
- high = ( ctx->total[0] >> 29 )
- | ( ctx->total[1] << 3 );
- low = ( ctx->total[0] << 3 );
- PUT_FX_64DWORD( high, msglen, 0 );
- PUT_FX_64DWORD( low, msglen, 8 );
- last = (FX_DWORD)ctx->total[0] & 0x7F;
- padn = ( last < 112 ) ? ( 112 - last ) : ( 240 - last );
- CRYPT_SHA512Update( ctx, sha384_padding, padn );
- CRYPT_SHA512Update( ctx, msglen, 16 );
- PUT_FX_64DWORD(ctx->state[0], digest, 0);
- PUT_FX_64DWORD(ctx->state[1], digest, 8);
- PUT_FX_64DWORD(ctx->state[2], digest, 16);
- PUT_FX_64DWORD(ctx->state[3], digest, 24);
- PUT_FX_64DWORD(ctx->state[4], digest, 32);
- PUT_FX_64DWORD(ctx->state[5], digest, 40);
- PUT_FX_64DWORD(ctx->state[6], digest, 48);
- PUT_FX_64DWORD(ctx->state[7], digest, 56);
-}
-void CRYPT_SHA512Generate(FX_LPCBYTE data, FX_DWORD size, FX_BYTE digest[64])
-{
- sha384_context context;
- CRYPT_SHA512Start(&context);
- CRYPT_SHA512Update(&context, data, size);
- CRYPT_SHA512Finish(&context, digest);
-}
-#ifdef __cplusplus
-};
-#endif
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxcrt/fx_basic.h"
+#include "../../../include/fdrm/fx_crypt.h"
+#ifdef __cplusplus
+extern "C" {
+#endif
+typedef struct {
+ unsigned int h[5];
+ unsigned char block[64];
+ int blkused;
+ unsigned int lenhi, lenlo;
+} SHA_State;
+#define rol(x,y) ( ((x) << (y)) | (((unsigned int)x) >> (32-y)) )
+static void SHA_Core_Init(unsigned int h[5])
+{
+ h[0] = 0x67452301;
+ h[1] = 0xefcdab89;
+ h[2] = 0x98badcfe;
+ h[3] = 0x10325476;
+ h[4] = 0xc3d2e1f0;
+}
+static void SHATransform(unsigned int * digest, unsigned int * block)
+{
+ unsigned int w[80];
+ unsigned int a, b, c, d, e;
+ int t;
+ for (t = 0; t < 16; t++) {
+ w[t] = block[t];
+ }
+ for (t = 16; t < 80; t++) {
+ unsigned int tmp = w[t - 3] ^ w[t - 8] ^ w[t - 14] ^ w[t - 16];
+ w[t] = rol(tmp, 1);
+ }
+ a = digest[0];
+ b = digest[1];
+ c = digest[2];
+ d = digest[3];
+ e = digest[4];
+ for (t = 0; t < 20; t++) {
+ unsigned int tmp =
+ rol(a, 5) + ((b & c) | (d & ~b)) + e + w[t] + 0x5a827999;
+ e = d;
+ d = c;
+ c = rol(b, 30);
+ b = a;
+ a = tmp;
+ }
+ for (t = 20; t < 40; t++) {
+ unsigned int tmp = rol(a, 5) + (b ^ c ^ d) + e + w[t] + 0x6ed9eba1;
+ e = d;
+ d = c;
+ c = rol(b, 30);
+ b = a;
+ a = tmp;
+ }
+ for (t = 40; t < 60; t++) {
+ unsigned int tmp = rol(a,
+ 5) + ((b & c) | (b & d) | (c & d)) + e + w[t] +
+ 0x8f1bbcdc;
+ e = d;
+ d = c;
+ c = rol(b, 30);
+ b = a;
+ a = tmp;
+ }
+ for (t = 60; t < 80; t++) {
+ unsigned int tmp = rol(a, 5) + (b ^ c ^ d) + e + w[t] + 0xca62c1d6;
+ e = d;
+ d = c;
+ c = rol(b, 30);
+ b = a;
+ a = tmp;
+ }
+ digest[0] += a;
+ digest[1] += b;
+ digest[2] += c;
+ digest[3] += d;
+ digest[4] += e;
+}
+void CRYPT_SHA1Start(FX_LPVOID context)
+{
+ SHA_State * s = (SHA_State*)context;
+ SHA_Core_Init(s->h);
+ s->blkused = 0;
+ s->lenhi = s->lenlo = 0;
+}
+void CRYPT_SHA1Update(FX_LPVOID context, FX_LPCBYTE data, FX_DWORD size)
+{
+ SHA_State * s = (SHA_State*)context;
+ unsigned char *q = (unsigned char *)data;
+ unsigned int wordblock[16];
+ int len = size;
+ unsigned int lenw = len;
+ int i;
+ s->lenlo += lenw;
+ s->lenhi += (s->lenlo < lenw);
+ if (s->blkused && s->blkused + len < 64) {
+ FXSYS_memcpy32(s->block + s->blkused, q, len);
+ s->blkused += len;
+ } else {
+ while (s->blkused + len >= 64) {
+ FXSYS_memcpy32(s->block + s->blkused, q, 64 - s->blkused);
+ q += 64 - s->blkused;
+ len -= 64 - s->blkused;
+ for (i = 0; i < 16; i++) {
+ wordblock[i] =
+ (((unsigned int) s->block[i * 4 + 0]) << 24) |
+ (((unsigned int) s->block[i * 4 + 1]) << 16) |
+ (((unsigned int) s->block[i * 4 + 2]) << 8) |
+ (((unsigned int) s->block[i * 4 + 3]) << 0);
+ }
+ SHATransform(s->h, wordblock);
+ s->blkused = 0;
+ }
+ FXSYS_memcpy32(s->block, q, len);
+ s->blkused = len;
+ }
+}
+void CRYPT_SHA1Finish(FX_LPVOID context, FX_BYTE digest[20])
+{
+ SHA_State * s = (SHA_State*)context;
+ int i;
+ int pad;
+ unsigned char c[64];
+ unsigned int lenhi, lenlo;
+ if (s->blkused >= 56) {
+ pad = 56 + 64 - s->blkused;
+ } else {
+ pad = 56 - s->blkused;
+ }
+ lenhi = (s->lenhi << 3) | (s->lenlo >> (32 - 3));
+ lenlo = (s->lenlo << 3);
+ FXSYS_memset32(c, 0, pad);
+ c[0] = 0x80;
+ CRYPT_SHA1Update(s, c, pad);
+ c[0] = (lenhi >> 24) & 0xFF;
+ c[1] = (lenhi >> 16) & 0xFF;
+ c[2] = (lenhi >> 8) & 0xFF;
+ c[3] = (lenhi >> 0) & 0xFF;
+ c[4] = (lenlo >> 24) & 0xFF;
+ c[5] = (lenlo >> 16) & 0xFF;
+ c[6] = (lenlo >> 8) & 0xFF;
+ c[7] = (lenlo >> 0) & 0xFF;
+ CRYPT_SHA1Update(s, c, 8);
+ for (i = 0; i < 5; i++) {
+ digest[i * 4] = (s->h[i] >> 24) & 0xFF;
+ digest[i * 4 + 1] = (s->h[i] >> 16) & 0xFF;
+ digest[i * 4 + 2] = (s->h[i] >> 8) & 0xFF;
+ digest[i * 4 + 3] = (s->h[i]) & 0xFF;
+ }
+}
+void CRYPT_SHA1Generate(FX_LPCBYTE data, FX_DWORD size, FX_BYTE digest[20])
+{
+ SHA_State s;
+ CRYPT_SHA1Start(&s);
+ CRYPT_SHA1Update(&s, data, size);
+ CRYPT_SHA1Finish(&s, digest);
+}
+typedef struct {
+ FX_DWORD total[2];
+ FX_DWORD state[8];
+ FX_BYTE buffer[64];
+}
+sha256_context;
+#define GET_FX_DWORD(n,b,i) \
+ { \
+ (n) = ( (FX_DWORD) (b)[(i) ] << 24 ) \
+ | ( (FX_DWORD) (b)[(i) + 1] << 16 ) \
+ | ( (FX_DWORD) (b)[(i) + 2] << 8 ) \
+ | ( (FX_DWORD) (b)[(i) + 3] ); \
+ }
+#define PUT_FX_DWORD(n,b,i) \
+ { \
+ (b)[(i) ] = (FX_BYTE) ( (n) >> 24 ); \
+ (b)[(i) + 1] = (FX_BYTE) ( (n) >> 16 ); \
+ (b)[(i) + 2] = (FX_BYTE) ( (n) >> 8 ); \
+ (b)[(i) + 3] = (FX_BYTE) ( (n) ); \
+ }
+void CRYPT_SHA256Start( FX_LPVOID context )
+{
+ sha256_context *ctx = (sha256_context *)context;
+ ctx->total[0] = 0;
+ ctx->total[1] = 0;
+ ctx->state[0] = 0x6A09E667;
+ ctx->state[1] = 0xBB67AE85;
+ ctx->state[2] = 0x3C6EF372;
+ ctx->state[3] = 0xA54FF53A;
+ ctx->state[4] = 0x510E527F;
+ ctx->state[5] = 0x9B05688C;
+ ctx->state[6] = 0x1F83D9AB;
+ ctx->state[7] = 0x5BE0CD19;
+}
+static void sha256_process( sha256_context *ctx, const FX_BYTE data[64] )
+{
+ FX_DWORD temp1, temp2, W[64];
+ FX_DWORD A, B, C, D, E, F, G, H;
+ GET_FX_DWORD( W[0], data, 0 );
+ GET_FX_DWORD( W[1], data, 4 );
+ GET_FX_DWORD( W[2], data, 8 );
+ GET_FX_DWORD( W[3], data, 12 );
+ GET_FX_DWORD( W[4], data, 16 );
+ GET_FX_DWORD( W[5], data, 20 );
+ GET_FX_DWORD( W[6], data, 24 );
+ GET_FX_DWORD( W[7], data, 28 );
+ GET_FX_DWORD( W[8], data, 32 );
+ GET_FX_DWORD( W[9], data, 36 );
+ GET_FX_DWORD( W[10], data, 40 );
+ GET_FX_DWORD( W[11], data, 44 );
+ GET_FX_DWORD( W[12], data, 48 );
+ GET_FX_DWORD( W[13], data, 52 );
+ GET_FX_DWORD( W[14], data, 56 );
+ GET_FX_DWORD( W[15], data, 60 );
+#define SHR(x,n) ((x & 0xFFFFFFFF) >> n)
+#define ROTR(x,n) (SHR(x,n) | (x << (32 - n)))
+#define S0(x) (ROTR(x, 7) ^ ROTR(x,18) ^ SHR(x, 3))
+#define S1(x) (ROTR(x,17) ^ ROTR(x,19) ^ SHR(x,10))
+#define S2(x) (ROTR(x, 2) ^ ROTR(x,13) ^ ROTR(x,22))
+#define S3(x) (ROTR(x, 6) ^ ROTR(x,11) ^ ROTR(x,25))
+#define F0(x,y,z) ((x & y) | (z & (x | y)))
+#define F1(x,y,z) (z ^ (x & (y ^ z)))
+#define R(t) \
+ ( \
+ W[t] = S1(W[t - 2]) + W[t - 7] + \
+ S0(W[t - 15]) + W[t - 16] \
+ )
+#define P(a,b,c,d,e,f,g,h,x,K) \
+ { \
+ temp1 = h + S3(e) + F1(e,f,g) + K + x; \
+ temp2 = S2(a) + F0(a,b,c); \
+ d += temp1; h = temp1 + temp2; \
+ }
+ A = ctx->state[0];
+ B = ctx->state[1];
+ C = ctx->state[2];
+ D = ctx->state[3];
+ E = ctx->state[4];
+ F = ctx->state[5];
+ G = ctx->state[6];
+ H = ctx->state[7];
+ P( A, B, C, D, E, F, G, H, W[ 0], 0x428A2F98 );
+ P( H, A, B, C, D, E, F, G, W[ 1], 0x71374491 );
+ P( G, H, A, B, C, D, E, F, W[ 2], 0xB5C0FBCF );
+ P( F, G, H, A, B, C, D, E, W[ 3], 0xE9B5DBA5 );
+ P( E, F, G, H, A, B, C, D, W[ 4], 0x3956C25B );
+ P( D, E, F, G, H, A, B, C, W[ 5], 0x59F111F1 );
+ P( C, D, E, F, G, H, A, B, W[ 6], 0x923F82A4 );
+ P( B, C, D, E, F, G, H, A, W[ 7], 0xAB1C5ED5 );
+ P( A, B, C, D, E, F, G, H, W[ 8], 0xD807AA98 );
+ P( H, A, B, C, D, E, F, G, W[ 9], 0x12835B01 );
+ P( G, H, A, B, C, D, E, F, W[10], 0x243185BE );
+ P( F, G, H, A, B, C, D, E, W[11], 0x550C7DC3 );
+ P( E, F, G, H, A, B, C, D, W[12], 0x72BE5D74 );
+ P( D, E, F, G, H, A, B, C, W[13], 0x80DEB1FE );
+ P( C, D, E, F, G, H, A, B, W[14], 0x9BDC06A7 );
+ P( B, C, D, E, F, G, H, A, W[15], 0xC19BF174 );
+ P( A, B, C, D, E, F, G, H, R(16), 0xE49B69C1 );
+ P( H, A, B, C, D, E, F, G, R(17), 0xEFBE4786 );
+ P( G, H, A, B, C, D, E, F, R(18), 0x0FC19DC6 );
+ P( F, G, H, A, B, C, D, E, R(19), 0x240CA1CC );
+ P( E, F, G, H, A, B, C, D, R(20), 0x2DE92C6F );
+ P( D, E, F, G, H, A, B, C, R(21), 0x4A7484AA );
+ P( C, D, E, F, G, H, A, B, R(22), 0x5CB0A9DC );
+ P( B, C, D, E, F, G, H, A, R(23), 0x76F988DA );
+ P( A, B, C, D, E, F, G, H, R(24), 0x983E5152 );
+ P( H, A, B, C, D, E, F, G, R(25), 0xA831C66D );
+ P( G, H, A, B, C, D, E, F, R(26), 0xB00327C8 );
+ P( F, G, H, A, B, C, D, E, R(27), 0xBF597FC7 );
+ P( E, F, G, H, A, B, C, D, R(28), 0xC6E00BF3 );
+ P( D, E, F, G, H, A, B, C, R(29), 0xD5A79147 );
+ P( C, D, E, F, G, H, A, B, R(30), 0x06CA6351 );
+ P( B, C, D, E, F, G, H, A, R(31), 0x14292967 );
+ P( A, B, C, D, E, F, G, H, R(32), 0x27B70A85 );
+ P( H, A, B, C, D, E, F, G, R(33), 0x2E1B2138 );
+ P( G, H, A, B, C, D, E, F, R(34), 0x4D2C6DFC );
+ P( F, G, H, A, B, C, D, E, R(35), 0x53380D13 );
+ P( E, F, G, H, A, B, C, D, R(36), 0x650A7354 );
+ P( D, E, F, G, H, A, B, C, R(37), 0x766A0ABB );
+ P( C, D, E, F, G, H, A, B, R(38), 0x81C2C92E );
+ P( B, C, D, E, F, G, H, A, R(39), 0x92722C85 );
+ P( A, B, C, D, E, F, G, H, R(40), 0xA2BFE8A1 );
+ P( H, A, B, C, D, E, F, G, R(41), 0xA81A664B );
+ P( G, H, A, B, C, D, E, F, R(42), 0xC24B8B70 );
+ P( F, G, H, A, B, C, D, E, R(43), 0xC76C51A3 );
+ P( E, F, G, H, A, B, C, D, R(44), 0xD192E819 );
+ P( D, E, F, G, H, A, B, C, R(45), 0xD6990624 );
+ P( C, D, E, F, G, H, A, B, R(46), 0xF40E3585 );
+ P( B, C, D, E, F, G, H, A, R(47), 0x106AA070 );
+ P( A, B, C, D, E, F, G, H, R(48), 0x19A4C116 );
+ P( H, A, B, C, D, E, F, G, R(49), 0x1E376C08 );
+ P( G, H, A, B, C, D, E, F, R(50), 0x2748774C );
+ P( F, G, H, A, B, C, D, E, R(51), 0x34B0BCB5 );
+ P( E, F, G, H, A, B, C, D, R(52), 0x391C0CB3 );
+ P( D, E, F, G, H, A, B, C, R(53), 0x4ED8AA4A );
+ P( C, D, E, F, G, H, A, B, R(54), 0x5B9CCA4F );
+ P( B, C, D, E, F, G, H, A, R(55), 0x682E6FF3 );
+ P( A, B, C, D, E, F, G, H, R(56), 0x748F82EE );
+ P( H, A, B, C, D, E, F, G, R(57), 0x78A5636F );
+ P( G, H, A, B, C, D, E, F, R(58), 0x84C87814 );
+ P( F, G, H, A, B, C, D, E, R(59), 0x8CC70208 );
+ P( E, F, G, H, A, B, C, D, R(60), 0x90BEFFFA );
+ P( D, E, F, G, H, A, B, C, R(61), 0xA4506CEB );
+ P( C, D, E, F, G, H, A, B, R(62), 0xBEF9A3F7 );
+ P( B, C, D, E, F, G, H, A, R(63), 0xC67178F2 );
+ ctx->state[0] += A;
+ ctx->state[1] += B;
+ ctx->state[2] += C;
+ ctx->state[3] += D;
+ ctx->state[4] += E;
+ ctx->state[5] += F;
+ ctx->state[6] += G;
+ ctx->state[7] += H;
+}
+void CRYPT_SHA256Update( void* context, FX_LPCBYTE input, FX_DWORD length )
+{
+ sha256_context *ctx = (sha256_context *)context;
+ FX_DWORD left, fill;
+ if( ! length ) {
+ return;
+ }
+ left = ctx->total[0] & 0x3F;
+ fill = 64 - left;
+ ctx->total[0] += length;
+ ctx->total[0] &= 0xFFFFFFFF;
+ if( ctx->total[0] < length ) {
+ ctx->total[1]++;
+ }
+ if( left && length >= fill ) {
+ FXSYS_memcpy32( (void *) (ctx->buffer + left),
+ (void *) input, fill );
+ sha256_process( ctx, ctx->buffer );
+ length -= fill;
+ input += fill;
+ left = 0;
+ }
+ while( length >= 64 ) {
+ sha256_process( ctx, input );
+ length -= 64;
+ input += 64;
+ }
+ if( length ) {
+ FXSYS_memcpy32( (void *) (ctx->buffer + left),
+ (void *) input, length );
+ }
+}
+static const FX_BYTE sha256_padding[64] = {
+ 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+};
+void CRYPT_SHA256Finish( FX_LPVOID context, FX_BYTE digest[32] )
+{
+ sha256_context *ctx = (sha256_context *)context;
+ FX_DWORD last, padn;
+ FX_DWORD high, low;
+ FX_BYTE msglen[8];
+ high = ( ctx->total[0] >> 29 )
+ | ( ctx->total[1] << 3 );
+ low = ( ctx->total[0] << 3 );
+ PUT_FX_DWORD( high, msglen, 0 );
+ PUT_FX_DWORD( low, msglen, 4 );
+ last = ctx->total[0] & 0x3F;
+ padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last );
+ CRYPT_SHA256Update( ctx, sha256_padding, padn );
+ CRYPT_SHA256Update( ctx, msglen, 8 );
+ PUT_FX_DWORD( ctx->state[0], digest, 0 );
+ PUT_FX_DWORD( ctx->state[1], digest, 4 );
+ PUT_FX_DWORD( ctx->state[2], digest, 8 );
+ PUT_FX_DWORD( ctx->state[3], digest, 12 );
+ PUT_FX_DWORD( ctx->state[4], digest, 16 );
+ PUT_FX_DWORD( ctx->state[5], digest, 20 );
+ PUT_FX_DWORD( ctx->state[6], digest, 24 );
+ PUT_FX_DWORD( ctx->state[7], digest, 28 );
+}
+void CRYPT_SHA256Generate(FX_LPCBYTE data, FX_DWORD size, FX_BYTE digest[32])
+{
+ sha256_context ctx;
+ CRYPT_SHA256Start(&ctx);
+ CRYPT_SHA256Update(&ctx, data, size);
+ CRYPT_SHA256Finish(&ctx, digest);
+}
+typedef struct {
+ FX_UINT64 total[2];
+ FX_UINT64 state[8];
+ FX_BYTE buffer[128];
+} sha384_context;
+FX_UINT64 FX_ato64i(FX_LPCSTR str)
+{
+ FXSYS_assert(str != NULL);
+ FX_UINT64 ret = 0;
+ int len = (int)FXSYS_strlen(str);
+ len = len > 16 ? 16 : len;
+ for (int i = 0; i < len; ++i) {
+ if (i) {
+ ret <<= 4;
+ }
+ if (str[i] >= '0' && str[i] <= '9') {
+ ret |= (str[i] - '0') & 0xFF;
+ } else if (str[i] >= 'a' && str[i] <= 'f') {
+ ret |= (str[i] - 'a' + 10) & 0xFF;
+ } else if (str[i] >= 'A' && str[i] <= 'F') {
+ ret |= (str[i] - 'A' + 10) & 0xFF;
+ } else {
+ FXSYS_assert(FALSE);
+ }
+ }
+ return ret;
+}
+void CRYPT_SHA384Start(FX_LPVOID context)
+{
+ if (context == NULL) {
+ return;
+ }
+ sha384_context *ctx = (sha384_context *)context;
+ FXSYS_memset32(ctx, 0, sizeof(sha384_context));
+ ctx->state[0] = FX_ato64i("cbbb9d5dc1059ed8");
+ ctx->state[1] = FX_ato64i("629a292a367cd507");
+ ctx->state[2] = FX_ato64i("9159015a3070dd17");
+ ctx->state[3] = FX_ato64i("152fecd8f70e5939");
+ ctx->state[4] = FX_ato64i("67332667ffc00b31");
+ ctx->state[5] = FX_ato64i("8eb44a8768581511");
+ ctx->state[6] = FX_ato64i("db0c2e0d64f98fa7");
+ ctx->state[7] = FX_ato64i("47b5481dbefa4fa4");
+}
+#define SHA384_F0(x,y,z) ((x & y) | (z & (x | y)))
+#define SHA384_F1(x,y,z) (z ^ (x & (y ^ z)))
+#define SHA384_SHR(x,n) (x >> n)
+#define SHA384_ROTR(x,n) (SHA384_SHR(x, n) | x << (64 - n))
+#define SHA384_S0(x) (SHA384_ROTR(x, 1) ^ SHA384_ROTR(x, 8) ^ SHA384_SHR(x, 7))
+#define SHA384_S1(x) (SHA384_ROTR(x,19) ^ SHA384_ROTR(x, 61) ^ SHA384_SHR(x, 6))
+#define SHA384_S2(x) (SHA384_ROTR(x, 28) ^ SHA384_ROTR(x, 34) ^ SHA384_ROTR(x, 39))
+#define SHA384_S3(x) (SHA384_ROTR(x, 14) ^ SHA384_ROTR(x,18) ^ SHA384_ROTR(x, 41))
+#define SHA384_P(a,b,c,d,e,f,g,h,x,K) \
+ { \
+ temp1 = h + SHA384_S3(e) + SHA384_F1(e,f,g) + K + x; \
+ temp2 = SHA384_S2(a) + SHA384_F0(a,b,c); \
+ d += temp1; h = temp1 + temp2; \
+ }
+static const FX_BYTE sha384_padding[128] = {
+ 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+};
+#define SHA384_R(t) (W[t] = SHA384_S1(W[t - 2]) + W[t - 7] + SHA384_S0(W[t - 15]) + W[t - 16])
+static FX_LPCSTR constants[] = {
+ "428a2f98d728ae22",
+ "7137449123ef65cd",
+ "b5c0fbcfec4d3b2f",
+ "e9b5dba58189dbbc",
+ "3956c25bf348b538",
+ "59f111f1b605d019",
+ "923f82a4af194f9b",
+ "ab1c5ed5da6d8118",
+ "d807aa98a3030242",
+ "12835b0145706fbe",
+ "243185be4ee4b28c",
+ "550c7dc3d5ffb4e2",
+ "72be5d74f27b896f",
+ "80deb1fe3b1696b1",
+ "9bdc06a725c71235",
+ "c19bf174cf692694",
+ "e49b69c19ef14ad2",
+ "efbe4786384f25e3",
+ "0fc19dc68b8cd5b5",
+ "240ca1cc77ac9c65",
+ "2de92c6f592b0275",
+ "4a7484aa6ea6e483",
+ "5cb0a9dcbd41fbd4",
+ "76f988da831153b5",
+ "983e5152ee66dfab",
+ "a831c66d2db43210",
+ "b00327c898fb213f",
+ "bf597fc7beef0ee4",
+ "c6e00bf33da88fc2",
+ "d5a79147930aa725",
+ "06ca6351e003826f",
+ "142929670a0e6e70",
+ "27b70a8546d22ffc",
+ "2e1b21385c26c926",
+ "4d2c6dfc5ac42aed",
+ "53380d139d95b3df",
+ "650a73548baf63de",
+ "766a0abb3c77b2a8",
+ "81c2c92e47edaee6",
+ "92722c851482353b",
+ "a2bfe8a14cf10364",
+ "a81a664bbc423001",
+ "c24b8b70d0f89791",
+ "c76c51a30654be30",
+ "d192e819d6ef5218",
+ "d69906245565a910",
+ "f40e35855771202a",
+ "106aa07032bbd1b8",
+ "19a4c116b8d2d0c8",
+ "1e376c085141ab53",
+ "2748774cdf8eeb99",
+ "34b0bcb5e19b48a8",
+ "391c0cb3c5c95a63",
+ "4ed8aa4ae3418acb",
+ "5b9cca4f7763e373",
+ "682e6ff3d6b2b8a3",
+ "748f82ee5defb2fc",
+ "78a5636f43172f60",
+ "84c87814a1f0ab72",
+ "8cc702081a6439ec",
+ "90befffa23631e28",
+ "a4506cebde82bde9",
+ "bef9a3f7b2c67915",
+ "c67178f2e372532b",
+ "ca273eceea26619c",
+ "d186b8c721c0c207",
+ "eada7dd6cde0eb1e",
+ "f57d4f7fee6ed178",
+ "06f067aa72176fba",
+ "0a637dc5a2c898a6",
+ "113f9804bef90dae",
+ "1b710b35131c471b",
+ "28db77f523047d84",
+ "32caab7b40c72493",
+ "3c9ebe0a15c9bebc",
+ "431d67c49c100d4c",
+ "4cc5d4becb3e42b6",
+ "597f299cfc657e2a",
+ "5fcb6fab3ad6faec",
+ "6c44198c4a475817",
+};
+#define GET_FX_64WORD(n,b,i) \
+ { \
+ (n) = ( (FX_UINT64) (b)[(i) ] << 56 ) \
+ | ( (FX_UINT64) (b)[(i) + 1] << 48 ) \
+ | ( (FX_UINT64) (b)[(i) + 2] << 40 ) \
+ | ( (FX_UINT64) (b)[(i) + 3] << 32 ) \
+ | ( (FX_UINT64) (b)[(i) + 4] << 24 ) \
+ | ( (FX_UINT64) (b)[(i) + 5] << 16 ) \
+ | ( (FX_UINT64) (b)[(i) + 6] << 8 ) \
+ | ( (FX_UINT64) (b)[(i) + 7] ); \
+ }
+#define PUT_FX_64DWORD(n,b,i) \
+ { \
+ (b)[(i) ] = (FX_BYTE) ( (n) >> 56 ); \
+ (b)[(i) + 1] = (FX_BYTE) ( (n) >> 48 ); \
+ (b)[(i) + 2] = (FX_BYTE) ( (n) >> 40 ); \
+ (b)[(i) + 3] = (FX_BYTE) ( (n) >> 32 ); \
+ (b)[(i) + 4] = (FX_BYTE) ( (n) >> 24 ); \
+ (b)[(i) + 5] = (FX_BYTE) ( (n) >> 16 ); \
+ (b)[(i) + 6] = (FX_BYTE) ( (n) >> 8 ); \
+ (b)[(i) + 7] = (FX_BYTE) ( (n) ); \
+ }
+static void sha384_process( sha384_context *ctx, const FX_BYTE data[128] )
+{
+ FX_UINT64 temp1, temp2;
+ FX_UINT64 A, B, C, D, E, F, G, H;
+ FX_UINT64 W[80];
+ GET_FX_64WORD(W[0], data, 0);
+ GET_FX_64WORD(W[1], data, 8);
+ GET_FX_64WORD(W[2], data, 16);
+ GET_FX_64WORD(W[3], data, 24);
+ GET_FX_64WORD(W[4], data, 32);
+ GET_FX_64WORD(W[5], data, 40);
+ GET_FX_64WORD(W[6], data, 48);
+ GET_FX_64WORD(W[7], data, 56);
+ GET_FX_64WORD(W[8], data, 64);
+ GET_FX_64WORD(W[9], data, 72);
+ GET_FX_64WORD(W[10], data, 80);
+ GET_FX_64WORD(W[11], data, 88);
+ GET_FX_64WORD(W[12], data, 96);
+ GET_FX_64WORD(W[13], data, 104);
+ GET_FX_64WORD(W[14], data, 112);
+ GET_FX_64WORD(W[15], data, 120);
+ A = ctx->state[0];
+ B = ctx->state[1];
+ C = ctx->state[2];
+ D = ctx->state[3];
+ E = ctx->state[4];
+ F = ctx->state[5];
+ G = ctx->state[6];
+ H = ctx->state[7];
+ for (int i = 0; i < 10; ++i) {
+ FX_UINT64 temp[8];
+ if (i < 2) {
+ temp[0] = W[i * 8];
+ temp[1] = W[i * 8 + 1];
+ temp[2] = W[i * 8 + 2];
+ temp[3] = W[i * 8 + 3];
+ temp[4] = W[i * 8 + 4];
+ temp[5] = W[i * 8 + 5];
+ temp[6] = W[i * 8 + 6];
+ temp[7] = W[i * 8 + 7];
+ } else {
+ temp[0] = SHA384_R(i * 8);
+ temp[1] = SHA384_R(i * 8 + 1);
+ temp[2] = SHA384_R(i * 8 + 2);
+ temp[3] = SHA384_R(i * 8 + 3);
+ temp[4] = SHA384_R(i * 8 + 4);
+ temp[5] = SHA384_R(i * 8 + 5);
+ temp[6] = SHA384_R(i * 8 + 6);
+ temp[7] = SHA384_R(i * 8 + 7);
+ }
+ SHA384_P( A, B, C, D, E, F, G, H, temp[ 0], FX_ato64i(constants[i * 8 ]) );
+ SHA384_P( H, A, B, C, D, E, F, G, temp[ 1], FX_ato64i(constants[i * 8 + 1]) );
+ SHA384_P( G, H, A, B, C, D, E, F, temp[ 2], FX_ato64i(constants[i * 8 + 2]) );
+ SHA384_P( F, G, H, A, B, C, D, E, temp[ 3], FX_ato64i(constants[i * 8 + 3]) );
+ SHA384_P( E, F, G, H, A, B, C, D, temp[ 4], FX_ato64i(constants[i * 8 + 4]) );
+ SHA384_P( D, E, F, G, H, A, B, C, temp[ 5], FX_ato64i(constants[i * 8 + 5]) );
+ SHA384_P( C, D, E, F, G, H, A, B, temp[ 6], FX_ato64i(constants[i * 8 + 6]) );
+ SHA384_P( B, C, D, E, F, G, H, A, temp[ 7], FX_ato64i(constants[i * 8 + 7]) );
+ }
+ ctx->state[0] += A;
+ ctx->state[1] += B;
+ ctx->state[2] += C;
+ ctx->state[3] += D;
+ ctx->state[4] += E;
+ ctx->state[5] += F;
+ ctx->state[6] += G;
+ ctx->state[7] += H;
+}
+void CRYPT_SHA384Update(FX_LPVOID context, FX_LPCBYTE input, FX_DWORD length)
+{
+ sha384_context *ctx = (sha384_context *)context;
+ FX_DWORD left, fill;
+ if( ! length ) {
+ return;
+ }
+ left = (FX_DWORD)ctx->total[0] & 0x7F;
+ fill = 128 - left;
+ ctx->total[0] += length;
+ if( ctx->total[0] < length ) {
+ ctx->total[1]++;
+ }
+ if( left && length >= fill ) {
+ FXSYS_memcpy32( (void *) (ctx->buffer + left),
+ (void *) input, fill );
+ sha384_process( ctx, ctx->buffer );
+ length -= fill;
+ input += fill;
+ left = 0;
+ }
+ while( length >= 128 ) {
+ sha384_process( ctx, input );
+ length -= 128;
+ input += 128;
+ }
+ if( length ) {
+ FXSYS_memcpy32( (void *) (ctx->buffer + left),
+ (void *) input, length );
+ }
+}
+void CRYPT_SHA384Finish(FX_LPVOID context, FX_BYTE digest[48])
+{
+ sha384_context *ctx = (sha384_context *)context;
+ FX_DWORD last, padn;
+ FX_BYTE msglen[16];
+ FXSYS_memset32(msglen, 0, 16);
+ FX_UINT64 high, low;
+ high = ( ctx->total[0] >> 29 )
+ | ( ctx->total[1] << 3 );
+ low = ( ctx->total[0] << 3 );
+ PUT_FX_64DWORD( high, msglen, 0 );
+ PUT_FX_64DWORD( low, msglen, 8 );
+ last = (FX_DWORD)ctx->total[0] & 0x7F;
+ padn = ( last < 112 ) ? ( 112 - last ) : ( 240 - last );
+ CRYPT_SHA384Update( ctx, sha384_padding, padn );
+ CRYPT_SHA384Update( ctx, msglen, 16 );
+ PUT_FX_64DWORD(ctx->state[0], digest, 0);
+ PUT_FX_64DWORD(ctx->state[1], digest, 8);
+ PUT_FX_64DWORD(ctx->state[2], digest, 16);
+ PUT_FX_64DWORD(ctx->state[3], digest, 24);
+ PUT_FX_64DWORD(ctx->state[4], digest, 32);
+ PUT_FX_64DWORD(ctx->state[5], digest, 40);
+}
+void CRYPT_SHA384Generate(FX_LPCBYTE data, FX_DWORD size, FX_BYTE digest[64])
+{
+ sha384_context context;
+ CRYPT_SHA384Start(&context);
+ CRYPT_SHA384Update(&context, data, size);
+ CRYPT_SHA384Finish(&context, digest);
+}
+void CRYPT_SHA512Start(FX_LPVOID context)
+{
+ if (context == NULL) {
+ return;
+ }
+ sha384_context *ctx = (sha384_context *)context;
+ FXSYS_memset32(ctx, 0, sizeof(sha384_context));
+ ctx->state[0] = FX_ato64i("6a09e667f3bcc908");
+ ctx->state[1] = FX_ato64i("bb67ae8584caa73b");
+ ctx->state[2] = FX_ato64i("3c6ef372fe94f82b");
+ ctx->state[3] = FX_ato64i("a54ff53a5f1d36f1");
+ ctx->state[4] = FX_ato64i("510e527fade682d1");
+ ctx->state[5] = FX_ato64i("9b05688c2b3e6c1f");
+ ctx->state[6] = FX_ato64i("1f83d9abfb41bd6b");
+ ctx->state[7] = FX_ato64i("5be0cd19137e2179");
+}
+void CRYPT_SHA512Update(FX_LPVOID context, FX_LPCBYTE data, FX_DWORD size)
+{
+ CRYPT_SHA384Update(context, data, size);
+}
+void CRYPT_SHA512Finish(FX_LPVOID context, FX_BYTE digest[64])
+{
+ sha384_context *ctx = (sha384_context *)context;
+ FX_DWORD last, padn;
+ FX_BYTE msglen[16];
+ FXSYS_memset32(msglen, 0, 16);
+ FX_UINT64 high, low;
+ high = ( ctx->total[0] >> 29 )
+ | ( ctx->total[1] << 3 );
+ low = ( ctx->total[0] << 3 );
+ PUT_FX_64DWORD( high, msglen, 0 );
+ PUT_FX_64DWORD( low, msglen, 8 );
+ last = (FX_DWORD)ctx->total[0] & 0x7F;
+ padn = ( last < 112 ) ? ( 112 - last ) : ( 240 - last );
+ CRYPT_SHA512Update( ctx, sha384_padding, padn );
+ CRYPT_SHA512Update( ctx, msglen, 16 );
+ PUT_FX_64DWORD(ctx->state[0], digest, 0);
+ PUT_FX_64DWORD(ctx->state[1], digest, 8);
+ PUT_FX_64DWORD(ctx->state[2], digest, 16);
+ PUT_FX_64DWORD(ctx->state[3], digest, 24);
+ PUT_FX_64DWORD(ctx->state[4], digest, 32);
+ PUT_FX_64DWORD(ctx->state[5], digest, 40);
+ PUT_FX_64DWORD(ctx->state[6], digest, 48);
+ PUT_FX_64DWORD(ctx->state[7], digest, 56);
+}
+void CRYPT_SHA512Generate(FX_LPCBYTE data, FX_DWORD size, FX_BYTE digest[64])
+{
+ sha384_context context;
+ CRYPT_SHA512Start(&context);
+ CRYPT_SHA512Update(&context, data, size);
+ CRYPT_SHA512Finish(&context, digest);
+}
+#ifdef __cplusplus
+};
+#endif
diff --git a/core/src/fpdfapi/fpdf_basic_module.cpp b/core/src/fpdfapi/fpdf_basic_module.cpp
index 4c648b4d4e..a446aa5d21 100644
--- a/core/src/fpdfapi/fpdf_basic_module.cpp
+++ b/core/src/fpdfapi/fpdf_basic_module.cpp
@@ -1,178 +1,178 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../include/fxcodec/fx_codec.h"
-#include "../../include/fpdfapi/fpdf_module.h"
-static CPDF_ModuleMgr* g_FPDFAPI_pDefaultMgr = NULL;
-CPDF_ModuleMgr* CPDF_ModuleMgr::Get()
-{
- return g_FPDFAPI_pDefaultMgr;
-}
-void CPDF_ModuleMgr::Create()
-{
- g_FPDFAPI_pDefaultMgr = FX_NEW CPDF_ModuleMgr;
- g_FPDFAPI_pDefaultMgr->Initialize();
-}
-void CPDF_ModuleMgr::Destroy()
-{
- if (g_FPDFAPI_pDefaultMgr) {
- delete g_FPDFAPI_pDefaultMgr;
- }
- g_FPDFAPI_pDefaultMgr = NULL;
-}
-CPDF_ModuleMgr::CPDF_ModuleMgr()
-{
- m_pCodecModule = NULL;
- m_pPageModule = NULL;
- m_pRenderModule = NULL;
- m_FileBufSize = 512;
-}
-void CPDF_ModuleMgr::Initialize()
-{
- InitModules();
- m_FileBufSize = 512;
-}
-void CPDF_ModuleMgr::InitModules()
-{
- m_pCodecModule = NULL;
- m_pPageModule = FX_NEW CPDF_PageModuleDef;
- m_pRenderModule = FX_NEW CPDF_RenderModuleDef;
-}
-CPDF_ModuleMgr::~CPDF_ModuleMgr()
-{
- if (m_pPageModule) {
- delete m_pPageModule;
- }
- if (m_pRenderModule) {
- delete m_pRenderModule;
- }
-}
-void CPDF_ModuleMgr::SetDownloadCallback(FX_BOOL (*callback)(FX_LPCSTR module_name))
-{
- m_pDownloadCallback = callback;
-}
-FX_BOOL CPDF_ModuleMgr::DownloadModule(FX_LPCSTR module_name)
-{
- if (m_pDownloadCallback == NULL) {
- return FALSE;
- }
- return m_pDownloadCallback(module_name);
-}
-static CFX_ByteString _GetPath(const CFX_ByteString& folder, FX_LPCSTR name)
-{
- FX_STRSIZE folder_len = folder.GetLength();
-#if _FX_OS_ == _FX_SYMBIAN_ || _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
- if (folder[folder_len - 1] == '\\') {
- return folder + name;
- } else {
- return (folder + "\\") + name;
- }
-#else
- if (folder[folder_len - 1] == '/') {
- return folder + name;
- } else {
- return (folder + "/") + name;
- }
-#endif
-}
-void CPDF_ModuleMgr::SetModulePath(FX_LPCSTR module_name, FX_LPCSTR path)
-{
- if (module_name == NULL || module_name[0] == 0) {
- m_DefaultModulePath = path;
- } else {
- m_ModulePathList.SetAt(module_name, FX_NEW CFX_ByteString(path, -1));
- }
-}
-CFX_ByteString CPDF_ModuleMgr::GetModuleFilePath(FX_LPCSTR module_name, FX_LPCSTR name)
-{
- CFX_ByteString* pPath = NULL;
- if (m_ModulePathList.Lookup(module_name, (FX_LPVOID&)pPath)) {
- return _GetPath(*pPath, name);
- }
- if (!m_DefaultModulePath.IsEmpty()) {
- return _GetPath(m_DefaultModulePath, name);
- }
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
- FX_WCHAR app_path[260];
- ::GetModuleFileNameW(NULL, (LPWSTR)app_path, 260);
- FX_INTPTR len = FXSYS_wcslen(app_path);
- for (FX_INTPTR i = len; i >= 0; i --)
- if (app_path[i] == '\\') {
- app_path[i] = 0;
- break;
- }
- CFX_ByteString path = CFX_ByteString::FromUnicode(app_path);
- path += '\\';
- path += name;
- return path;
-#else
- return name;
-#endif
-}
-void CPDF_ModuleMgr::NotifyModuleAvailable(FX_LPCSTR module_name)
-{
- if (FXSYS_strcmp(module_name, ADDIN_NAME_CJK) == 0) {
- m_pPageModule->NotifyCJKAvailable();
- } else if (FXSYS_strcmp(module_name, ADDIN_NAME_DECODER) == 0) {
- m_pRenderModule->NotifyDecoderAvailable();
- }
-}
-void CPDF_ModuleMgr::RegisterSecurityHandler(FX_LPCSTR filter, CPDF_SecurityHandler * (*CreateHandler)(void* param), void* param)
-{
- if (CreateHandler == NULL) {
- m_SecurityHandlerMap.RemoveKey(filter);
- } else {
- m_SecurityHandlerMap.SetAt(filter, (void*)CreateHandler);
- }
- if (param) {
- m_SecurityHandlerMap.SetAt(FX_BSTRC("_param_") + filter, param);
- }
-}
-void CPDF_ModuleMgr::SetPrivateData(FX_LPVOID module_id, FX_LPVOID pData, PD_CALLBACK_FREEDATA callback)
-{
- m_privateData.SetPrivateData(module_id, pData, callback);
-}
-FX_LPVOID CPDF_ModuleMgr::GetPrivateData(FX_LPVOID module_id)
-{
- return m_privateData.GetPrivateData(module_id);
-}
-CPDF_SecurityHandler* CPDF_ModuleMgr::CreateSecurityHandler(FX_LPCSTR filter)
-{
- CPDF_SecurityHandler* (*CreateHandler)(void*) = NULL;
- if (!m_SecurityHandlerMap.Lookup(filter, (void*&)CreateHandler)) {
- return NULL;
- }
- if (CreateHandler == NULL) {
- return NULL;
- }
- void* param = NULL;
- m_SecurityHandlerMap.Lookup(FX_BSTRC("_param_") + filter, param);
- return CreateHandler(param);
-}
-ICodec_FaxModule* CPDF_ModuleMgr::GetFaxModule()
-{
- return m_pCodecModule ? m_pCodecModule->GetFaxModule() : NULL;
-}
-ICodec_JpegModule* CPDF_ModuleMgr::GetJpegModule()
-{
- return m_pCodecModule ? m_pCodecModule->GetJpegModule() : NULL;
-}
-ICodec_JpxModule* CPDF_ModuleMgr::GetJpxModule()
-{
- return m_pCodecModule ? m_pCodecModule->GetJpxModule() : NULL;
-}
-ICodec_Jbig2Module* CPDF_ModuleMgr::GetJbig2Module()
-{
- return m_pCodecModule ? m_pCodecModule->GetJbig2Module() : NULL;
-}
-ICodec_IccModule* CPDF_ModuleMgr::GetIccModule()
-{
- return m_pCodecModule ? m_pCodecModule->GetIccModule() : NULL;
-}
-ICodec_FlateModule* CPDF_ModuleMgr::GetFlateModule()
-{
- return m_pCodecModule ? m_pCodecModule->GetFlateModule() : NULL;
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fxcodec/fx_codec.h"
+#include "../../include/fpdfapi/fpdf_module.h"
+static CPDF_ModuleMgr* g_FPDFAPI_pDefaultMgr = NULL;
+CPDF_ModuleMgr* CPDF_ModuleMgr::Get()
+{
+ return g_FPDFAPI_pDefaultMgr;
+}
+void CPDF_ModuleMgr::Create()
+{
+ g_FPDFAPI_pDefaultMgr = FX_NEW CPDF_ModuleMgr;
+ g_FPDFAPI_pDefaultMgr->Initialize();
+}
+void CPDF_ModuleMgr::Destroy()
+{
+ if (g_FPDFAPI_pDefaultMgr) {
+ delete g_FPDFAPI_pDefaultMgr;
+ }
+ g_FPDFAPI_pDefaultMgr = NULL;
+}
+CPDF_ModuleMgr::CPDF_ModuleMgr()
+{
+ m_pCodecModule = NULL;
+ m_pPageModule = NULL;
+ m_pRenderModule = NULL;
+ m_FileBufSize = 512;
+}
+void CPDF_ModuleMgr::Initialize()
+{
+ InitModules();
+ m_FileBufSize = 512;
+}
+void CPDF_ModuleMgr::InitModules()
+{
+ m_pCodecModule = NULL;
+ m_pPageModule = FX_NEW CPDF_PageModuleDef;
+ m_pRenderModule = FX_NEW CPDF_RenderModuleDef;
+}
+CPDF_ModuleMgr::~CPDF_ModuleMgr()
+{
+ if (m_pPageModule) {
+ delete m_pPageModule;
+ }
+ if (m_pRenderModule) {
+ delete m_pRenderModule;
+ }
+}
+void CPDF_ModuleMgr::SetDownloadCallback(FX_BOOL (*callback)(FX_LPCSTR module_name))
+{
+ m_pDownloadCallback = callback;
+}
+FX_BOOL CPDF_ModuleMgr::DownloadModule(FX_LPCSTR module_name)
+{
+ if (m_pDownloadCallback == NULL) {
+ return FALSE;
+ }
+ return m_pDownloadCallback(module_name);
+}
+static CFX_ByteString _GetPath(const CFX_ByteString& folder, FX_LPCSTR name)
+{
+ FX_STRSIZE folder_len = folder.GetLength();
+#if _FX_OS_ == _FX_SYMBIAN_ || _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+ if (folder[folder_len - 1] == '\\') {
+ return folder + name;
+ } else {
+ return (folder + "\\") + name;
+ }
+#else
+ if (folder[folder_len - 1] == '/') {
+ return folder + name;
+ } else {
+ return (folder + "/") + name;
+ }
+#endif
+}
+void CPDF_ModuleMgr::SetModulePath(FX_LPCSTR module_name, FX_LPCSTR path)
+{
+ if (module_name == NULL || module_name[0] == 0) {
+ m_DefaultModulePath = path;
+ } else {
+ m_ModulePathList.SetAt(module_name, FX_NEW CFX_ByteString(path, -1));
+ }
+}
+CFX_ByteString CPDF_ModuleMgr::GetModuleFilePath(FX_LPCSTR module_name, FX_LPCSTR name)
+{
+ CFX_ByteString* pPath = NULL;
+ if (m_ModulePathList.Lookup(module_name, (FX_LPVOID&)pPath)) {
+ return _GetPath(*pPath, name);
+ }
+ if (!m_DefaultModulePath.IsEmpty()) {
+ return _GetPath(m_DefaultModulePath, name);
+ }
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+ FX_WCHAR app_path[260];
+ ::GetModuleFileNameW(NULL, (LPWSTR)app_path, 260);
+ FX_INTPTR len = FXSYS_wcslen(app_path);
+ for (FX_INTPTR i = len; i >= 0; i --)
+ if (app_path[i] == '\\') {
+ app_path[i] = 0;
+ break;
+ }
+ CFX_ByteString path = CFX_ByteString::FromUnicode(app_path);
+ path += '\\';
+ path += name;
+ return path;
+#else
+ return name;
+#endif
+}
+void CPDF_ModuleMgr::NotifyModuleAvailable(FX_LPCSTR module_name)
+{
+ if (FXSYS_strcmp(module_name, ADDIN_NAME_CJK) == 0) {
+ m_pPageModule->NotifyCJKAvailable();
+ } else if (FXSYS_strcmp(module_name, ADDIN_NAME_DECODER) == 0) {
+ m_pRenderModule->NotifyDecoderAvailable();
+ }
+}
+void CPDF_ModuleMgr::RegisterSecurityHandler(FX_LPCSTR filter, CPDF_SecurityHandler * (*CreateHandler)(void* param), void* param)
+{
+ if (CreateHandler == NULL) {
+ m_SecurityHandlerMap.RemoveKey(filter);
+ } else {
+ m_SecurityHandlerMap.SetAt(filter, (void*)CreateHandler);
+ }
+ if (param) {
+ m_SecurityHandlerMap.SetAt(FX_BSTRC("_param_") + filter, param);
+ }
+}
+void CPDF_ModuleMgr::SetPrivateData(FX_LPVOID module_id, FX_LPVOID pData, PD_CALLBACK_FREEDATA callback)
+{
+ m_privateData.SetPrivateData(module_id, pData, callback);
+}
+FX_LPVOID CPDF_ModuleMgr::GetPrivateData(FX_LPVOID module_id)
+{
+ return m_privateData.GetPrivateData(module_id);
+}
+CPDF_SecurityHandler* CPDF_ModuleMgr::CreateSecurityHandler(FX_LPCSTR filter)
+{
+ CPDF_SecurityHandler* (*CreateHandler)(void*) = NULL;
+ if (!m_SecurityHandlerMap.Lookup(filter, (void*&)CreateHandler)) {
+ return NULL;
+ }
+ if (CreateHandler == NULL) {
+ return NULL;
+ }
+ void* param = NULL;
+ m_SecurityHandlerMap.Lookup(FX_BSTRC("_param_") + filter, param);
+ return CreateHandler(param);
+}
+ICodec_FaxModule* CPDF_ModuleMgr::GetFaxModule()
+{
+ return m_pCodecModule ? m_pCodecModule->GetFaxModule() : NULL;
+}
+ICodec_JpegModule* CPDF_ModuleMgr::GetJpegModule()
+{
+ return m_pCodecModule ? m_pCodecModule->GetJpegModule() : NULL;
+}
+ICodec_JpxModule* CPDF_ModuleMgr::GetJpxModule()
+{
+ return m_pCodecModule ? m_pCodecModule->GetJpxModule() : NULL;
+}
+ICodec_Jbig2Module* CPDF_ModuleMgr::GetJbig2Module()
+{
+ return m_pCodecModule ? m_pCodecModule->GetJbig2Module() : NULL;
+}
+ICodec_IccModule* CPDF_ModuleMgr::GetIccModule()
+{
+ return m_pCodecModule ? m_pCodecModule->GetIccModule() : NULL;
+}
+ICodec_FlateModule* CPDF_ModuleMgr::GetFlateModule()
+{
+ return m_pCodecModule ? m_pCodecModule->GetFlateModule() : NULL;
+}
diff --git a/core/src/fpdfapi/fpdf_cmaps/CNS1/B5pc-H_0.cpp b/core/src/fpdfapi/fpdf_cmaps/CNS1/B5pc-H_0.cpp
index e12a8597ed..d70e3611c3 100644
--- a/core/src/fpdfapi/fpdf_cmaps/CNS1/B5pc-H_0.cpp
+++ b/core/src/fpdfapi/fpdf_cmaps/CNS1/B5pc-H_0.cpp
@@ -1,91 +1,91 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-extern const unsigned short g_FXCMAP_B5pc_H_0[247 * 3] = {
- 0x0020, 0x007E, 0x0001, 0x0080, 0x0080, 0x003D, 0x00FD, 0x00FF, 0x0060,
- 0xA140, 0xA158, 0x0063, 0xA159, 0xA15C, 0x35AF, 0xA15D, 0xA17E, 0x0080,
- 0xA1A1, 0xA1F5, 0x00A2, 0xA1F6, 0xA1F6, 0x00F8, 0xA1F7, 0xA1F7, 0x00F7,
- 0xA1F8, 0xA1FE, 0x00F9, 0xA240, 0xA27E, 0x0100, 0xA2A1, 0xA2FE, 0x013F,
- 0xA340, 0xA37E, 0x019D, 0xA3A1, 0xA3BB, 0x01DC, 0xA3BD, 0xA3BF, 0x01F7,
- 0xA3C0, 0xA3E0, 0x0232, 0xA440, 0xA47E, 0x0253, 0xA4A1, 0xA4FE, 0x0292,
- 0xA540, 0xA57E, 0x02F0, 0xA5A1, 0xA5FE, 0x032F, 0xA640, 0xA67E, 0x038D,
- 0xA6A1, 0xA6FE, 0x03CC, 0xA740, 0xA77E, 0x042A, 0xA7A1, 0xA7FE, 0x0469,
- 0xA840, 0xA87E, 0x04C7, 0xA8A1, 0xA8FE, 0x0506, 0xA940, 0xA97E, 0x0564,
- 0xA9A1, 0xA9FE, 0x05A3, 0xAA40, 0xAA7E, 0x0601, 0xAAA1, 0xAAFE, 0x0640,
- 0xAB40, 0xAB7E, 0x069E, 0xABA1, 0xABFE, 0x06DD, 0xAC40, 0xAC7E, 0x073B,
- 0xACA1, 0xACFD, 0x077A, 0xACFE, 0xACFE, 0x097F, 0xAD40, 0xAD7E, 0x07D7,
- 0xADA1, 0xADFE, 0x0816, 0xAE40, 0xAE7E, 0x0874, 0xAEA1, 0xAEFE, 0x08B3,
- 0xAF40, 0xAF7E, 0x0911, 0xAFA1, 0xAFCF, 0x0950, 0xAFD0, 0xAFFE, 0x0980,
- 0xB040, 0xB07E, 0x09AF, 0xB0A1, 0xB0FE, 0x09EE, 0xB140, 0xB17E, 0x0A4C,
- 0xB1A1, 0xB1FE, 0x0A8B, 0xB240, 0xB27E, 0x0AE9, 0xB2A1, 0xB2FE, 0x0B28,
- 0xB340, 0xB37E, 0x0B86, 0xB3A1, 0xB3FE, 0x0BC5, 0xB440, 0xB47E, 0x0C23,
- 0xB4A1, 0xB4FE, 0x0C62, 0xB540, 0xB57E, 0x0CC0, 0xB5A1, 0xB5FE, 0x0CFF,
- 0xB640, 0xB67E, 0x0D5D, 0xB6A1, 0xB6FE, 0x0D9C, 0xB740, 0xB77E, 0x0DFA,
- 0xB7A1, 0xB7FE, 0x0E39, 0xB840, 0xB87E, 0x0E97, 0xB8A1, 0xB8FE, 0x0ED6,
- 0xB940, 0xB97E, 0x0F34, 0xB9A1, 0xB9FE, 0x0F73, 0xBA40, 0xBA7E, 0x0FD1,
- 0xBAA1, 0xBAFE, 0x1010, 0xBB40, 0xBB7E, 0x106E, 0xBBA1, 0xBBC7, 0x10AD,
- 0xBBC8, 0xBBFE, 0x10D5, 0xBC40, 0xBC7E, 0x110C, 0xBCA1, 0xBCFE, 0x114B,
- 0xBD40, 0xBD7E, 0x11A9, 0xBDA1, 0xBDFE, 0x11E8, 0xBE40, 0xBE51, 0x1246,
- 0xBE52, 0xBE52, 0x10D4, 0xBE53, 0xBE7E, 0x1258, 0xBEA1, 0xBEFE, 0x1284,
- 0xBF40, 0xBF7E, 0x12E2, 0xBFA1, 0xBFFE, 0x1321, 0xC040, 0xC07E, 0x137F,
- 0xC0A1, 0xC0FE, 0x13BE, 0xC140, 0xC17E, 0x141C, 0xC1A1, 0xC1AA, 0x145B,
- 0xC1AB, 0xC1FE, 0x1466, 0xC240, 0xC27E, 0x14BA, 0xC2A1, 0xC2CA, 0x14F9,
- 0xC2CB, 0xC2CB, 0x1465, 0xC2CC, 0xC2FE, 0x1523, 0xC340, 0xC360, 0x1556,
- 0xC361, 0xC37E, 0x1578, 0xC3A1, 0xC3B8, 0x1596, 0xC3B9, 0xC3B9, 0x15AF,
- 0xC3BA, 0xC3BA, 0x15AE, 0xC3BB, 0xC3FE, 0x15B0, 0xC440, 0xC455, 0x15F4,
- 0xC456, 0xC456, 0x1577, 0xC457, 0xC47E, 0x160A, 0xC4A1, 0xC4FE, 0x1632,
- 0xC540, 0xC57E, 0x1690, 0xC5A1, 0xC5FE, 0x16CF, 0xC640, 0xC67E, 0x172D,
- 0xC940, 0xC949, 0x176C, 0xC94A, 0xC94A, 0x0274, 0xC94B, 0xC96B, 0x1776,
- 0xC96C, 0xC97E, 0x1798, 0xC9A1, 0xC9BD, 0x17AB, 0xC9BE, 0xC9BE, 0x1797,
- 0xC9BF, 0xC9EC, 0x17C8, 0xC9ED, 0xC9FE, 0x17F7, 0xCA40, 0xCA7E, 0x1809,
- 0xCAA1, 0xCAF6, 0x1848, 0xCAF7, 0xCAF7, 0x17F6, 0xCAF8, 0xCAFE, 0x189E,
- 0xCB40, 0xCB7E, 0x18A5, 0xCBA1, 0xCBFE, 0x18E4, 0xCC40, 0xCC7E, 0x1942,
- 0xCCA1, 0xCCFE, 0x1981, 0xCD40, 0xCD7E, 0x19DF, 0xCDA1, 0xCDFE, 0x1A1E,
- 0xCE40, 0xCE7E, 0x1A7C, 0xCEA1, 0xCEFE, 0x1ABB, 0xCF40, 0xCF7E, 0x1B19,
- 0xCFA1, 0xCFFE, 0x1B58, 0xD040, 0xD07E, 0x1BB6, 0xD0A1, 0xD0FE, 0x1BF5,
- 0xD140, 0xD17E, 0x1C53, 0xD1A1, 0xD1FE, 0x1C92, 0xD240, 0xD27E, 0x1CF0,
- 0xD2A1, 0xD2FE, 0x1D2F, 0xD340, 0xD37E, 0x1D8D, 0xD3A1, 0xD3FE, 0x1DCC,
- 0xD440, 0xD47E, 0x1E2A, 0xD4A1, 0xD4FE, 0x1E69, 0xD540, 0xD57E, 0x1EC7,
- 0xD5A1, 0xD5FE, 0x1F06, 0xD640, 0xD67E, 0x1F64, 0xD6A1, 0xD6CB, 0x1FA3,
- 0xD6CC, 0xD6CC, 0x2254, 0xD6CD, 0xD6FE, 0x1FCF, 0xD740, 0xD779, 0x2001,
- 0xD77A, 0xD77A, 0x22B9, 0xD77B, 0xD77E, 0x203B, 0xD7A1, 0xD7FE, 0x203F,
- 0xD840, 0xD87E, 0x209D, 0xD8A1, 0xD8FE, 0x20DC, 0xD940, 0xD97E, 0x213A,
- 0xD9A1, 0xD9FE, 0x2179, 0xDA40, 0xDA7E, 0x21D7, 0xDAA1, 0xDADE, 0x2216,
- 0xDADF, 0xDADF, 0x1FCE, 0xDAE0, 0xDAFE, 0x2255, 0xDB40, 0xDB7E, 0x2274,
- 0xDBA1, 0xDBA6, 0x22B3, 0xDBA7, 0xDBFE, 0x22BA, 0xDC40, 0xDC7E, 0x2312,
- 0xDCA1, 0xDCFE, 0x2351, 0xDD40, 0xDD7E, 0x23AF, 0xDDA1, 0xDDFB, 0x23EE,
- 0xDDFC, 0xDDFC, 0x2381, 0xDDFD, 0xDDFE, 0x2449, 0xDE40, 0xDE7E, 0x244B,
- 0xDEA1, 0xDEFE, 0x248A, 0xDF40, 0xDF7E, 0x24E8, 0xDFA1, 0xDFFE, 0x2527,
- 0xE040, 0xE07E, 0x2585, 0xE0A1, 0xE0FE, 0x25C4, 0xE140, 0xE17E, 0x2622,
- 0xE1A1, 0xE1FE, 0x2661, 0xE240, 0xE27E, 0x26BF, 0xE2A1, 0xE2FE, 0x26FE,
- 0xE340, 0xE37E, 0x275C, 0xE3A1, 0xE3FE, 0x279B, 0xE440, 0xE47E, 0x27F9,
- 0xE4A1, 0xE4FE, 0x2838, 0xE540, 0xE57E, 0x2896, 0xE5A1, 0xE5FE, 0x28D5,
- 0xE640, 0xE67E, 0x2933, 0xE6A1, 0xE6FE, 0x2972, 0xE740, 0xE77E, 0x29D0,
- 0xE7A1, 0xE7FE, 0x2A0F, 0xE840, 0xE87E, 0x2A6D, 0xE8A1, 0xE8A2, 0x2AAC,
- 0xE8A3, 0xE8FE, 0x2AAF, 0xE940, 0xE975, 0x2B0B, 0xE976, 0xE97E, 0x2B42,
- 0xE9A1, 0xE9FE, 0x2B4B, 0xEA40, 0xEA7E, 0x2BA9, 0xEAA1, 0xEAFE, 0x2BE8,
- 0xEB40, 0xEB5A, 0x2C46, 0xEB5B, 0xEB7E, 0x2C62, 0xEBA1, 0xEBF0, 0x2C86,
- 0xEBF1, 0xEBF1, 0x2AAE, 0xEBF2, 0xEBFE, 0x2CD6, 0xEC40, 0xEC7E, 0x2CE3,
- 0xECA1, 0xECDD, 0x2D22, 0xECDE, 0xECDE, 0x2B41, 0xECDF, 0xECFE, 0x2D5F,
- 0xED40, 0xED7E, 0x2D7F, 0xEDA1, 0xEDA9, 0x2DBE, 0xEDAA, 0xEDFE, 0x2DC8,
- 0xEE40, 0xEE7E, 0x2E1D, 0xEEA1, 0xEEEA, 0x2E5C, 0xEEEB, 0xEEEB, 0x3014,
- 0xEEEC, 0xEEFE, 0x2EA6, 0xEF40, 0xEF7E, 0x2EB9, 0xEFA1, 0xEFFE, 0x2EF8,
- 0xF040, 0xF055, 0x2F56, 0xF056, 0xF056, 0x2DC7, 0xF057, 0xF07E, 0x2F6C,
- 0xF0A1, 0xF0CA, 0x2F94, 0xF0CB, 0xF0CB, 0x2C61, 0xF0CC, 0xF0FE, 0x2FBE,
- 0xF140, 0xF162, 0x2FF1, 0xF163, 0xF16A, 0x3015, 0xF16B, 0xF16B, 0x3160,
- 0xF16C, 0xF17E, 0x301D, 0xF1A1, 0xF1FE, 0x3030, 0xF240, 0xF267, 0x308E,
- 0xF268, 0xF268, 0x31EF, 0xF269, 0xF27E, 0x30B6, 0xF2A1, 0xF2C2, 0x30CC,
- 0xF2C3, 0xF2FE, 0x30EF, 0xF340, 0xF374, 0x312B, 0xF375, 0xF37E, 0x3161,
- 0xF3A1, 0xF3FE, 0x316B, 0xF440, 0xF465, 0x31C9, 0xF466, 0xF47E, 0x31F0,
- 0xF4A1, 0xF4B4, 0x3209, 0xF4B5, 0xF4B5, 0x30EE, 0xF4B6, 0xF4FC, 0x321D,
- 0xF4FD, 0xF4FE, 0x3265, 0xF540, 0xF57E, 0x3267, 0xF5A1, 0xF5FE, 0x32A6,
- 0xF640, 0xF662, 0x3304, 0xF663, 0xF663, 0x3264, 0xF664, 0xF67E, 0x3327,
- 0xF6A1, 0xF6FE, 0x3342, 0xF740, 0xF77E, 0x33A0, 0xF7A1, 0xF7FE, 0x33DF,
- 0xF840, 0xF87E, 0x343D, 0xF8A1, 0xF8FE, 0x347C, 0xF940, 0xF976, 0x34DA,
- 0xF977, 0xF97E, 0x3512, 0xF9A1, 0xF9C3, 0x351A, 0xF9C4, 0xF9C4, 0x3511,
- 0xF9C5, 0xF9C5, 0x353D, 0xF9C6, 0xF9C6, 0x3549, 0xF9C7, 0xF9D1, 0x353E,
- 0xF9D2, 0xF9D5, 0x354A,
-};
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_B5pc_H_0[247 * 3] = {
+ 0x0020, 0x007E, 0x0001, 0x0080, 0x0080, 0x003D, 0x00FD, 0x00FF, 0x0060,
+ 0xA140, 0xA158, 0x0063, 0xA159, 0xA15C, 0x35AF, 0xA15D, 0xA17E, 0x0080,
+ 0xA1A1, 0xA1F5, 0x00A2, 0xA1F6, 0xA1F6, 0x00F8, 0xA1F7, 0xA1F7, 0x00F7,
+ 0xA1F8, 0xA1FE, 0x00F9, 0xA240, 0xA27E, 0x0100, 0xA2A1, 0xA2FE, 0x013F,
+ 0xA340, 0xA37E, 0x019D, 0xA3A1, 0xA3BB, 0x01DC, 0xA3BD, 0xA3BF, 0x01F7,
+ 0xA3C0, 0xA3E0, 0x0232, 0xA440, 0xA47E, 0x0253, 0xA4A1, 0xA4FE, 0x0292,
+ 0xA540, 0xA57E, 0x02F0, 0xA5A1, 0xA5FE, 0x032F, 0xA640, 0xA67E, 0x038D,
+ 0xA6A1, 0xA6FE, 0x03CC, 0xA740, 0xA77E, 0x042A, 0xA7A1, 0xA7FE, 0x0469,
+ 0xA840, 0xA87E, 0x04C7, 0xA8A1, 0xA8FE, 0x0506, 0xA940, 0xA97E, 0x0564,
+ 0xA9A1, 0xA9FE, 0x05A3, 0xAA40, 0xAA7E, 0x0601, 0xAAA1, 0xAAFE, 0x0640,
+ 0xAB40, 0xAB7E, 0x069E, 0xABA1, 0xABFE, 0x06DD, 0xAC40, 0xAC7E, 0x073B,
+ 0xACA1, 0xACFD, 0x077A, 0xACFE, 0xACFE, 0x097F, 0xAD40, 0xAD7E, 0x07D7,
+ 0xADA1, 0xADFE, 0x0816, 0xAE40, 0xAE7E, 0x0874, 0xAEA1, 0xAEFE, 0x08B3,
+ 0xAF40, 0xAF7E, 0x0911, 0xAFA1, 0xAFCF, 0x0950, 0xAFD0, 0xAFFE, 0x0980,
+ 0xB040, 0xB07E, 0x09AF, 0xB0A1, 0xB0FE, 0x09EE, 0xB140, 0xB17E, 0x0A4C,
+ 0xB1A1, 0xB1FE, 0x0A8B, 0xB240, 0xB27E, 0x0AE9, 0xB2A1, 0xB2FE, 0x0B28,
+ 0xB340, 0xB37E, 0x0B86, 0xB3A1, 0xB3FE, 0x0BC5, 0xB440, 0xB47E, 0x0C23,
+ 0xB4A1, 0xB4FE, 0x0C62, 0xB540, 0xB57E, 0x0CC0, 0xB5A1, 0xB5FE, 0x0CFF,
+ 0xB640, 0xB67E, 0x0D5D, 0xB6A1, 0xB6FE, 0x0D9C, 0xB740, 0xB77E, 0x0DFA,
+ 0xB7A1, 0xB7FE, 0x0E39, 0xB840, 0xB87E, 0x0E97, 0xB8A1, 0xB8FE, 0x0ED6,
+ 0xB940, 0xB97E, 0x0F34, 0xB9A1, 0xB9FE, 0x0F73, 0xBA40, 0xBA7E, 0x0FD1,
+ 0xBAA1, 0xBAFE, 0x1010, 0xBB40, 0xBB7E, 0x106E, 0xBBA1, 0xBBC7, 0x10AD,
+ 0xBBC8, 0xBBFE, 0x10D5, 0xBC40, 0xBC7E, 0x110C, 0xBCA1, 0xBCFE, 0x114B,
+ 0xBD40, 0xBD7E, 0x11A9, 0xBDA1, 0xBDFE, 0x11E8, 0xBE40, 0xBE51, 0x1246,
+ 0xBE52, 0xBE52, 0x10D4, 0xBE53, 0xBE7E, 0x1258, 0xBEA1, 0xBEFE, 0x1284,
+ 0xBF40, 0xBF7E, 0x12E2, 0xBFA1, 0xBFFE, 0x1321, 0xC040, 0xC07E, 0x137F,
+ 0xC0A1, 0xC0FE, 0x13BE, 0xC140, 0xC17E, 0x141C, 0xC1A1, 0xC1AA, 0x145B,
+ 0xC1AB, 0xC1FE, 0x1466, 0xC240, 0xC27E, 0x14BA, 0xC2A1, 0xC2CA, 0x14F9,
+ 0xC2CB, 0xC2CB, 0x1465, 0xC2CC, 0xC2FE, 0x1523, 0xC340, 0xC360, 0x1556,
+ 0xC361, 0xC37E, 0x1578, 0xC3A1, 0xC3B8, 0x1596, 0xC3B9, 0xC3B9, 0x15AF,
+ 0xC3BA, 0xC3BA, 0x15AE, 0xC3BB, 0xC3FE, 0x15B0, 0xC440, 0xC455, 0x15F4,
+ 0xC456, 0xC456, 0x1577, 0xC457, 0xC47E, 0x160A, 0xC4A1, 0xC4FE, 0x1632,
+ 0xC540, 0xC57E, 0x1690, 0xC5A1, 0xC5FE, 0x16CF, 0xC640, 0xC67E, 0x172D,
+ 0xC940, 0xC949, 0x176C, 0xC94A, 0xC94A, 0x0274, 0xC94B, 0xC96B, 0x1776,
+ 0xC96C, 0xC97E, 0x1798, 0xC9A1, 0xC9BD, 0x17AB, 0xC9BE, 0xC9BE, 0x1797,
+ 0xC9BF, 0xC9EC, 0x17C8, 0xC9ED, 0xC9FE, 0x17F7, 0xCA40, 0xCA7E, 0x1809,
+ 0xCAA1, 0xCAF6, 0x1848, 0xCAF7, 0xCAF7, 0x17F6, 0xCAF8, 0xCAFE, 0x189E,
+ 0xCB40, 0xCB7E, 0x18A5, 0xCBA1, 0xCBFE, 0x18E4, 0xCC40, 0xCC7E, 0x1942,
+ 0xCCA1, 0xCCFE, 0x1981, 0xCD40, 0xCD7E, 0x19DF, 0xCDA1, 0xCDFE, 0x1A1E,
+ 0xCE40, 0xCE7E, 0x1A7C, 0xCEA1, 0xCEFE, 0x1ABB, 0xCF40, 0xCF7E, 0x1B19,
+ 0xCFA1, 0xCFFE, 0x1B58, 0xD040, 0xD07E, 0x1BB6, 0xD0A1, 0xD0FE, 0x1BF5,
+ 0xD140, 0xD17E, 0x1C53, 0xD1A1, 0xD1FE, 0x1C92, 0xD240, 0xD27E, 0x1CF0,
+ 0xD2A1, 0xD2FE, 0x1D2F, 0xD340, 0xD37E, 0x1D8D, 0xD3A1, 0xD3FE, 0x1DCC,
+ 0xD440, 0xD47E, 0x1E2A, 0xD4A1, 0xD4FE, 0x1E69, 0xD540, 0xD57E, 0x1EC7,
+ 0xD5A1, 0xD5FE, 0x1F06, 0xD640, 0xD67E, 0x1F64, 0xD6A1, 0xD6CB, 0x1FA3,
+ 0xD6CC, 0xD6CC, 0x2254, 0xD6CD, 0xD6FE, 0x1FCF, 0xD740, 0xD779, 0x2001,
+ 0xD77A, 0xD77A, 0x22B9, 0xD77B, 0xD77E, 0x203B, 0xD7A1, 0xD7FE, 0x203F,
+ 0xD840, 0xD87E, 0x209D, 0xD8A1, 0xD8FE, 0x20DC, 0xD940, 0xD97E, 0x213A,
+ 0xD9A1, 0xD9FE, 0x2179, 0xDA40, 0xDA7E, 0x21D7, 0xDAA1, 0xDADE, 0x2216,
+ 0xDADF, 0xDADF, 0x1FCE, 0xDAE0, 0xDAFE, 0x2255, 0xDB40, 0xDB7E, 0x2274,
+ 0xDBA1, 0xDBA6, 0x22B3, 0xDBA7, 0xDBFE, 0x22BA, 0xDC40, 0xDC7E, 0x2312,
+ 0xDCA1, 0xDCFE, 0x2351, 0xDD40, 0xDD7E, 0x23AF, 0xDDA1, 0xDDFB, 0x23EE,
+ 0xDDFC, 0xDDFC, 0x2381, 0xDDFD, 0xDDFE, 0x2449, 0xDE40, 0xDE7E, 0x244B,
+ 0xDEA1, 0xDEFE, 0x248A, 0xDF40, 0xDF7E, 0x24E8, 0xDFA1, 0xDFFE, 0x2527,
+ 0xE040, 0xE07E, 0x2585, 0xE0A1, 0xE0FE, 0x25C4, 0xE140, 0xE17E, 0x2622,
+ 0xE1A1, 0xE1FE, 0x2661, 0xE240, 0xE27E, 0x26BF, 0xE2A1, 0xE2FE, 0x26FE,
+ 0xE340, 0xE37E, 0x275C, 0xE3A1, 0xE3FE, 0x279B, 0xE440, 0xE47E, 0x27F9,
+ 0xE4A1, 0xE4FE, 0x2838, 0xE540, 0xE57E, 0x2896, 0xE5A1, 0xE5FE, 0x28D5,
+ 0xE640, 0xE67E, 0x2933, 0xE6A1, 0xE6FE, 0x2972, 0xE740, 0xE77E, 0x29D0,
+ 0xE7A1, 0xE7FE, 0x2A0F, 0xE840, 0xE87E, 0x2A6D, 0xE8A1, 0xE8A2, 0x2AAC,
+ 0xE8A3, 0xE8FE, 0x2AAF, 0xE940, 0xE975, 0x2B0B, 0xE976, 0xE97E, 0x2B42,
+ 0xE9A1, 0xE9FE, 0x2B4B, 0xEA40, 0xEA7E, 0x2BA9, 0xEAA1, 0xEAFE, 0x2BE8,
+ 0xEB40, 0xEB5A, 0x2C46, 0xEB5B, 0xEB7E, 0x2C62, 0xEBA1, 0xEBF0, 0x2C86,
+ 0xEBF1, 0xEBF1, 0x2AAE, 0xEBF2, 0xEBFE, 0x2CD6, 0xEC40, 0xEC7E, 0x2CE3,
+ 0xECA1, 0xECDD, 0x2D22, 0xECDE, 0xECDE, 0x2B41, 0xECDF, 0xECFE, 0x2D5F,
+ 0xED40, 0xED7E, 0x2D7F, 0xEDA1, 0xEDA9, 0x2DBE, 0xEDAA, 0xEDFE, 0x2DC8,
+ 0xEE40, 0xEE7E, 0x2E1D, 0xEEA1, 0xEEEA, 0x2E5C, 0xEEEB, 0xEEEB, 0x3014,
+ 0xEEEC, 0xEEFE, 0x2EA6, 0xEF40, 0xEF7E, 0x2EB9, 0xEFA1, 0xEFFE, 0x2EF8,
+ 0xF040, 0xF055, 0x2F56, 0xF056, 0xF056, 0x2DC7, 0xF057, 0xF07E, 0x2F6C,
+ 0xF0A1, 0xF0CA, 0x2F94, 0xF0CB, 0xF0CB, 0x2C61, 0xF0CC, 0xF0FE, 0x2FBE,
+ 0xF140, 0xF162, 0x2FF1, 0xF163, 0xF16A, 0x3015, 0xF16B, 0xF16B, 0x3160,
+ 0xF16C, 0xF17E, 0x301D, 0xF1A1, 0xF1FE, 0x3030, 0xF240, 0xF267, 0x308E,
+ 0xF268, 0xF268, 0x31EF, 0xF269, 0xF27E, 0x30B6, 0xF2A1, 0xF2C2, 0x30CC,
+ 0xF2C3, 0xF2FE, 0x30EF, 0xF340, 0xF374, 0x312B, 0xF375, 0xF37E, 0x3161,
+ 0xF3A1, 0xF3FE, 0x316B, 0xF440, 0xF465, 0x31C9, 0xF466, 0xF47E, 0x31F0,
+ 0xF4A1, 0xF4B4, 0x3209, 0xF4B5, 0xF4B5, 0x30EE, 0xF4B6, 0xF4FC, 0x321D,
+ 0xF4FD, 0xF4FE, 0x3265, 0xF540, 0xF57E, 0x3267, 0xF5A1, 0xF5FE, 0x32A6,
+ 0xF640, 0xF662, 0x3304, 0xF663, 0xF663, 0x3264, 0xF664, 0xF67E, 0x3327,
+ 0xF6A1, 0xF6FE, 0x3342, 0xF740, 0xF77E, 0x33A0, 0xF7A1, 0xF7FE, 0x33DF,
+ 0xF840, 0xF87E, 0x343D, 0xF8A1, 0xF8FE, 0x347C, 0xF940, 0xF976, 0x34DA,
+ 0xF977, 0xF97E, 0x3512, 0xF9A1, 0xF9C3, 0x351A, 0xF9C4, 0xF9C4, 0x3511,
+ 0xF9C5, 0xF9C5, 0x353D, 0xF9C6, 0xF9C6, 0x3549, 0xF9C7, 0xF9D1, 0x353E,
+ 0xF9D2, 0xF9D5, 0x354A,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/CNS1/B5pc-V_0.cpp b/core/src/fpdfapi/fpdf_cmaps/CNS1/B5pc-V_0.cpp
index 188aefc458..65a016efc8 100644
--- a/core/src/fpdfapi/fpdf_cmaps/CNS1/B5pc-V_0.cpp
+++ b/core/src/fpdfapi/fpdf_cmaps/CNS1/B5pc-V_0.cpp
@@ -1,12 +1,12 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-extern const unsigned short g_FXCMAP_B5pc_V_0[12 * 3] = {
- 0xA14B, 0xA14B, 0x354E, 0xA15A, 0xA15A, 0x35AF, 0xA15C, 0xA15C, 0x35B1,
- 0xA15D, 0xA15E, 0x0082, 0xA161, 0xA162, 0x0086, 0xA165, 0xA166, 0x008A,
- 0xA169, 0xA16A, 0x008E, 0xA16D, 0xA16E, 0x0092, 0xA171, 0xA172, 0x0096,
- 0xA175, 0xA176, 0x009A, 0xA179, 0xA17A, 0x009E, 0xA1E3, 0xA1E3, 0x354F,
-};
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_B5pc_V_0[12 * 3] = {
+ 0xA14B, 0xA14B, 0x354E, 0xA15A, 0xA15A, 0x35AF, 0xA15C, 0xA15C, 0x35B1,
+ 0xA15D, 0xA15E, 0x0082, 0xA161, 0xA162, 0x0086, 0xA165, 0xA166, 0x008A,
+ 0xA169, 0xA16A, 0x008E, 0xA16D, 0xA16E, 0x0092, 0xA171, 0xA172, 0x0096,
+ 0xA175, 0xA176, 0x009A, 0xA179, 0xA17A, 0x009E, 0xA1E3, 0xA1E3, 0x354F,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/CNS1/CNS-EUC-H_0.cpp b/core/src/fpdfapi/fpdf_cmaps/CNS1/CNS-EUC-H_0.cpp
index 57ae87ce24..6041f34ec9 100644
--- a/core/src/fpdfapi/fpdf_cmaps/CNS1/CNS-EUC-H_0.cpp
+++ b/core/src/fpdfapi/fpdf_cmaps/CNS1/CNS-EUC-H_0.cpp
@@ -1,182 +1,182 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-extern const unsigned short g_FXCMAP_CNS_EUC_H_0[157 * 3] = {
- 0x0020, 0x007E, 0x3550, 0xA1A1, 0xA1FE, 0x0063, 0xA2A1, 0xA2FE, 0x00C1,
- 0xA3A1, 0xA3CE, 0x011F, 0xA4A1, 0xA4FE, 0x014D, 0xA5A1, 0xA5EC, 0x01AB,
- 0xA5EE, 0xA5F0, 0x01F7, 0xA6A1, 0xA6BE, 0x01FA, 0xA7A1, 0xA7A1, 0x0253,
- 0xA7A2, 0xA7A4, 0x0218, 0xA7A5, 0xA7A5, 0x0254, 0xA7A6, 0xA7A6, 0x021B,
- 0xA7A7, 0xA7A7, 0x025A, 0xA7A8, 0xA7A8, 0x021C, 0xA7A9, 0xA7AC, 0x025B,
- 0xA7AD, 0xA7AF, 0x021D, 0xA7B0, 0xA7B0, 0x025F, 0xA7B1, 0xA7B1, 0x176E,
- 0xA7B2, 0xA7B2, 0x0260, 0xA7B3, 0xA7B3, 0x0262, 0xA7B4, 0xA7B4, 0x0220,
- 0xA7B5, 0xA7B5, 0x0263, 0xA7B6, 0xA7B6, 0x176F, 0xA7B7, 0xA7B7, 0x0221,
- 0xA7B8, 0xA7B9, 0x0264, 0xA7BA, 0xA7BA, 0x0222, 0xA7BB, 0xA7BB, 0x1770,
- 0xA7BC, 0xA7BC, 0x0223, 0xA7BD, 0xA7BD, 0x0266, 0xA7BE, 0xA7BE, 0x0279,
- 0xA7BF, 0xA7BF, 0x1775, 0xA7C0, 0xA7C1, 0x027A, 0xA7C2, 0xA7C2, 0x0224,
- 0xA7C3, 0xA7C6, 0x027C, 0xA7C7, 0xA7C7, 0x0225, 0xA7C8, 0xA7CB, 0x0282,
- 0xA7CC, 0xA7CC, 0x1776, 0xA7CD, 0xA7CD, 0x0286, 0xA7CE, 0xA7CE, 0x0226,
- 0xA7CF, 0xA7D0, 0x0288, 0xA7D1, 0xA7D2, 0x028C, 0xA7D3, 0xA7D5, 0x0227,
- 0xA7D6, 0xA7D8, 0x028E, 0xA7D9, 0xA7DA, 0x022A, 0xA7DB, 0xA7DB, 0x1777,
- 0xA7DC, 0xA7DF, 0x02D0, 0xA7E0, 0xA7E0, 0x02D5, 0xA7E1, 0xA7E1, 0x022C,
- 0xA7E2, 0xA7E5, 0x02D6, 0xA7E6, 0xA7E6, 0x022D, 0xA7E7, 0xA7ED, 0x02DA,
- 0xA7EE, 0xA7EE, 0x178A, 0xA7EF, 0xA7F2, 0x02E1, 0xA7F3, 0xA7F3, 0x178C,
- 0xA7F4, 0xA7F8, 0x02E5, 0xA7F9, 0xA7F9, 0x178D, 0xA7FA, 0xA7FD, 0x02EA,
- 0xA7FE, 0xA7FE, 0x0356, 0xA8A1, 0xA8A6, 0x0357, 0xA8A7, 0xA8A7, 0x035E,
- 0xA8A8, 0xA8A8, 0x0362, 0xA8A9, 0xA8AA, 0x022E, 0xA8AB, 0xA8B2, 0x0363,
- 0xA8B3, 0xA8B3, 0x17B2, 0xA8B4, 0xA8B6, 0x036B, 0xA8B7, 0xA8BA, 0x03F6,
- 0xA8BB, 0xA8BB, 0x1812, 0xA8BC, 0xA8BE, 0x03FA, 0xA8BF, 0xA8C3, 0x03FE,
- 0xA8C4, 0xA8CC, 0x0405, 0xA8CD, 0xA8CD, 0x1813, 0xA8CE, 0xA8CE, 0x1818,
- 0xA8CF, 0xA8D2, 0x040F, 0xA8D3, 0xA8D3, 0x1819, 0xA8D4, 0xA8D9, 0x0508,
- 0xA8DA, 0xA8DA, 0x18E7, 0xA8DB, 0xA8E2, 0x050E, 0xA8E3, 0xA8E3, 0x0230,
- 0xA8E4, 0xA8E4, 0x051B, 0xA8E5, 0xA8E7, 0x0520, 0xA8E8, 0xA8EB, 0x0696,
- 0xA8EC, 0xA8EC, 0x0231, 0xA8ED, 0xA8F0, 0x069F, 0xA8F1, 0xA8FB, 0x0826,
- 0xA8FC, 0xA8FE, 0x09F5, 0xA9A1, 0xA9A1, 0x1E33, 0xA9A2, 0xA9A2, 0x09F8,
- 0xA9A3, 0xA9A3, 0x1E34, 0xA9A4, 0xA9A5, 0x09F9, 0xA9A6, 0xA9AB, 0x0BE1,
- 0xA9AC, 0xA9AE, 0x0DBB, 0xA9AF, 0xA9AF, 0x2360, 0xA9B0, 0xA9B0, 0x2612,
- 0xA9B1, 0xA9B3, 0x0F7B, 0xA9B4, 0xA9B5, 0x1100, 0xA9B6, 0xA9B6, 0x1289,
- 0xA9B7, 0xA9B8, 0x13B2, 0xA9B9, 0xA9B9, 0x2F0D, 0xC2A1, 0xC2C1, 0x0232,
- 0xC4A1, 0xC4FE, 0x0253, 0xC5A1, 0xC5FE, 0x02B1, 0xC6A1, 0xC6FE, 0x030F,
- 0xC7A1, 0xC7FE, 0x036D, 0xC8A1, 0xC8FE, 0x03CB, 0xC9A1, 0xC9FE, 0x0429,
- 0xCAA1, 0xCAFE, 0x0487, 0xCBA1, 0xCBFE, 0x04E5, 0xCCA1, 0xCCFE, 0x0543,
- 0xCDA1, 0xCDFE, 0x05A1, 0xCEA1, 0xCEFE, 0x05FF, 0xCFA1, 0xCFFE, 0x065D,
- 0xD0A1, 0xD0FE, 0x06BB, 0xD1A1, 0xD1FE, 0x0719, 0xD2A1, 0xD2FE, 0x0777,
- 0xD3A1, 0xD3FE, 0x07D5, 0xD4A1, 0xD4FE, 0x0833, 0xD5A1, 0xD5FE, 0x0891,
- 0xD6A1, 0xD6FE, 0x08EF, 0xD7A1, 0xD7FE, 0x094D, 0xD8A1, 0xD8FE, 0x09AB,
- 0xD9A1, 0xD9FE, 0x0A09, 0xDAA1, 0xDAFE, 0x0A67, 0xDBA1, 0xDBFE, 0x0AC5,
- 0xDCA1, 0xDCFE, 0x0B23, 0xDDA1, 0xDDFE, 0x0B81, 0xDEA1, 0xDEFE, 0x0BDF,
- 0xDFA1, 0xDFFE, 0x0C3D, 0xE0A1, 0xE0FE, 0x0C9B, 0xE1A1, 0xE1FE, 0x0CF9,
- 0xE2A1, 0xE2FE, 0x0D57, 0xE3A1, 0xE3FE, 0x0DB5, 0xE4A1, 0xE4FE, 0x0E13,
- 0xE5A1, 0xE5FE, 0x0E71, 0xE6A1, 0xE6FE, 0x0ECF, 0xE7A1, 0xE7FE, 0x0F2D,
- 0xE8A1, 0xE8FE, 0x0F8B, 0xE9A1, 0xE9FE, 0x0FE9, 0xEAA1, 0xEAFE, 0x1047,
- 0xEBA1, 0xEBFE, 0x10A5, 0xECA1, 0xECFE, 0x1103, 0xEDA1, 0xEDFE, 0x1161,
- 0xEEA1, 0xEEFE, 0x11BF, 0xEFA1, 0xEFFE, 0x121D, 0xF0A1, 0xF0FE, 0x127B,
- 0xF1A1, 0xF1FE, 0x12D9, 0xF2A1, 0xF2FE, 0x1337, 0xF3A1, 0xF3FE, 0x1395,
- 0xF4A1, 0xF4FE, 0x13F3, 0xF5A1, 0xF5FE, 0x1451, 0xF6A1, 0xF6FE, 0x14AF,
- 0xF7A1, 0xF7FE, 0x150D, 0xF8A1, 0xF8FE, 0x156B, 0xF9A1, 0xF9FE, 0x15C9,
- 0xFAA1, 0xFAFE, 0x1627, 0xFBA1, 0xFBFE, 0x1685, 0xFCA1, 0xFCFE, 0x16E3,
- 0xFDA1, 0xFDCB, 0x1741,
-};
-extern const unsigned short g_FXCMAP_CNS_EUC_H_0_DWord[238 * 4] = {
- 0x8EA1, 0xA1A1, 0xA1FE, 0x0063, 0x8EA1, 0xA2A1, 0xA2FE, 0x00C1,
- 0x8EA1, 0xA3A1, 0xA3CE, 0x011F, 0x8EA1, 0xA4A1, 0xA4FE, 0x014D,
- 0x8EA1, 0xA5A1, 0xA5EC, 0x01AB, 0x8EA1, 0xA5EE, 0xA5F0, 0x01F7,
- 0x8EA1, 0xA6A1, 0xA6BE, 0x01FA, 0x8EA1, 0xA7A1, 0xA7A1, 0x0253,
- 0x8EA1, 0xA7A2, 0xA7A4, 0x0218, 0x8EA1, 0xA7A5, 0xA7A5, 0x0254,
- 0x8EA1, 0xA7A6, 0xA7A6, 0x021B, 0x8EA1, 0xA7A7, 0xA7A7, 0x025A,
- 0x8EA1, 0xA7A8, 0xA7A8, 0x021C, 0x8EA1, 0xA7A9, 0xA7AC, 0x025B,
- 0x8EA1, 0xA7AD, 0xA7AF, 0x021D, 0x8EA1, 0xA7B0, 0xA7B0, 0x025F,
- 0x8EA1, 0xA7B1, 0xA7B1, 0x176E, 0x8EA1, 0xA7B2, 0xA7B2, 0x0260,
- 0x8EA1, 0xA7B3, 0xA7B3, 0x0262, 0x8EA1, 0xA7B4, 0xA7B4, 0x0220,
- 0x8EA1, 0xA7B5, 0xA7B5, 0x0263, 0x8EA1, 0xA7B6, 0xA7B6, 0x176F,
- 0x8EA1, 0xA7B7, 0xA7B7, 0x0221, 0x8EA1, 0xA7B8, 0xA7B9, 0x0264,
- 0x8EA1, 0xA7BA, 0xA7BA, 0x0222, 0x8EA1, 0xA7BB, 0xA7BB, 0x1770,
- 0x8EA1, 0xA7BC, 0xA7BC, 0x0223, 0x8EA1, 0xA7BD, 0xA7BD, 0x0266,
- 0x8EA1, 0xA7BE, 0xA7BE, 0x0279, 0x8EA1, 0xA7BF, 0xA7BF, 0x1775,
- 0x8EA1, 0xA7C0, 0xA7C1, 0x027A, 0x8EA1, 0xA7C2, 0xA7C2, 0x0224,
- 0x8EA1, 0xA7C3, 0xA7C6, 0x027C, 0x8EA1, 0xA7C7, 0xA7C7, 0x0225,
- 0x8EA1, 0xA7C8, 0xA7CB, 0x0282, 0x8EA1, 0xA7CC, 0xA7CC, 0x1776,
- 0x8EA1, 0xA7CD, 0xA7CD, 0x0286, 0x8EA1, 0xA7CE, 0xA7CE, 0x0226,
- 0x8EA1, 0xA7CF, 0xA7D0, 0x0288, 0x8EA1, 0xA7D1, 0xA7D2, 0x028C,
- 0x8EA1, 0xA7D3, 0xA7D5, 0x0227, 0x8EA1, 0xA7D6, 0xA7D8, 0x028E,
- 0x8EA1, 0xA7D9, 0xA7DA, 0x022A, 0x8EA1, 0xA7DB, 0xA7DB, 0x1777,
- 0x8EA1, 0xA7DC, 0xA7DF, 0x02D0, 0x8EA1, 0xA7E0, 0xA7E0, 0x02D5,
- 0x8EA1, 0xA7E1, 0xA7E1, 0x022C, 0x8EA1, 0xA7E2, 0xA7E5, 0x02D6,
- 0x8EA1, 0xA7E6, 0xA7E6, 0x022D, 0x8EA1, 0xA7E7, 0xA7ED, 0x02DA,
- 0x8EA1, 0xA7EE, 0xA7EE, 0x178A, 0x8EA1, 0xA7EF, 0xA7F2, 0x02E1,
- 0x8EA1, 0xA7F3, 0xA7F3, 0x178C, 0x8EA1, 0xA7F4, 0xA7F8, 0x02E5,
- 0x8EA1, 0xA7F9, 0xA7F9, 0x178D, 0x8EA1, 0xA7FA, 0xA7FD, 0x02EA,
- 0x8EA1, 0xA7FE, 0xA7FE, 0x0356, 0x8EA1, 0xA8A1, 0xA8A6, 0x0357,
- 0x8EA1, 0xA8A7, 0xA8A7, 0x035E, 0x8EA1, 0xA8A8, 0xA8A8, 0x0362,
- 0x8EA1, 0xA8A9, 0xA8AA, 0x022E, 0x8EA1, 0xA8AB, 0xA8B2, 0x0363,
- 0x8EA1, 0xA8B3, 0xA8B3, 0x17B2, 0x8EA1, 0xA8B4, 0xA8B6, 0x036B,
- 0x8EA1, 0xA8B7, 0xA8BA, 0x03F6, 0x8EA1, 0xA8BB, 0xA8BB, 0x1812,
- 0x8EA1, 0xA8BC, 0xA8BE, 0x03FA, 0x8EA1, 0xA8BF, 0xA8C3, 0x03FE,
- 0x8EA1, 0xA8C4, 0xA8CC, 0x0405, 0x8EA1, 0xA8CD, 0xA8CD, 0x1813,
- 0x8EA1, 0xA8CE, 0xA8CE, 0x1818, 0x8EA1, 0xA8CF, 0xA8D2, 0x040F,
- 0x8EA1, 0xA8D3, 0xA8D3, 0x1819, 0x8EA1, 0xA8D4, 0xA8D9, 0x0508,
- 0x8EA1, 0xA8DA, 0xA8DA, 0x18E7, 0x8EA1, 0xA8DB, 0xA8E2, 0x050E,
- 0x8EA1, 0xA8E3, 0xA8E3, 0x0230, 0x8EA1, 0xA8E4, 0xA8E4, 0x051B,
- 0x8EA1, 0xA8E5, 0xA8E7, 0x0520, 0x8EA1, 0xA8E8, 0xA8EB, 0x0696,
- 0x8EA1, 0xA8EC, 0xA8EC, 0x0231, 0x8EA1, 0xA8ED, 0xA8F0, 0x069F,
- 0x8EA1, 0xA8F1, 0xA8FB, 0x0826, 0x8EA1, 0xA8FC, 0xA8FE, 0x09F5,
- 0x8EA1, 0xA9A1, 0xA9A1, 0x1E33, 0x8EA1, 0xA9A2, 0xA9A2, 0x09F8,
- 0x8EA1, 0xA9A3, 0xA9A3, 0x1E34, 0x8EA1, 0xA9A4, 0xA9A5, 0x09F9,
- 0x8EA1, 0xA9A6, 0xA9AB, 0x0BE1, 0x8EA1, 0xA9AC, 0xA9AE, 0x0DBB,
- 0x8EA1, 0xA9AF, 0xA9AF, 0x2360, 0x8EA1, 0xA9B0, 0xA9B0, 0x2612,
- 0x8EA1, 0xA9B1, 0xA9B3, 0x0F7B, 0x8EA1, 0xA9B4, 0xA9B5, 0x1100,
- 0x8EA1, 0xA9B6, 0xA9B6, 0x1289, 0x8EA1, 0xA9B7, 0xA9B8, 0x13B2,
- 0x8EA1, 0xA9B9, 0xA9B9, 0x2F0D, 0x8EA1, 0xC2A1, 0xC2C1, 0x0232,
- 0x8EA1, 0xC4A1, 0xC4FE, 0x0253, 0x8EA1, 0xC5A1, 0xC5FE, 0x02B1,
- 0x8EA1, 0xC6A1, 0xC6FE, 0x030F, 0x8EA1, 0xC7A1, 0xC7FE, 0x036D,
- 0x8EA1, 0xC8A1, 0xC8FE, 0x03CB, 0x8EA1, 0xC9A1, 0xC9FE, 0x0429,
- 0x8EA1, 0xCAA1, 0xCAFE, 0x0487, 0x8EA1, 0xCBA1, 0xCBFE, 0x04E5,
- 0x8EA1, 0xCCA1, 0xCCFE, 0x0543, 0x8EA1, 0xCDA1, 0xCDFE, 0x05A1,
- 0x8EA1, 0xCEA1, 0xCEFE, 0x05FF, 0x8EA1, 0xCFA1, 0xCFFE, 0x065D,
- 0x8EA1, 0xD0A1, 0xD0FE, 0x06BB, 0x8EA1, 0xD1A1, 0xD1FE, 0x0719,
- 0x8EA1, 0xD2A1, 0xD2FE, 0x0777, 0x8EA1, 0xD3A1, 0xD3FE, 0x07D5,
- 0x8EA1, 0xD4A1, 0xD4FE, 0x0833, 0x8EA1, 0xD5A1, 0xD5FE, 0x0891,
- 0x8EA1, 0xD6A1, 0xD6FE, 0x08EF, 0x8EA1, 0xD7A1, 0xD7FE, 0x094D,
- 0x8EA1, 0xD8A1, 0xD8FE, 0x09AB, 0x8EA1, 0xD9A1, 0xD9FE, 0x0A09,
- 0x8EA1, 0xDAA1, 0xDAFE, 0x0A67, 0x8EA1, 0xDBA1, 0xDBFE, 0x0AC5,
- 0x8EA1, 0xDCA1, 0xDCFE, 0x0B23, 0x8EA1, 0xDDA1, 0xDDFE, 0x0B81,
- 0x8EA1, 0xDEA1, 0xDEFE, 0x0BDF, 0x8EA1, 0xDFA1, 0xDFFE, 0x0C3D,
- 0x8EA1, 0xE0A1, 0xE0FE, 0x0C9B, 0x8EA1, 0xE1A1, 0xE1FE, 0x0CF9,
- 0x8EA1, 0xE2A1, 0xE2FE, 0x0D57, 0x8EA1, 0xE3A1, 0xE3FE, 0x0DB5,
- 0x8EA1, 0xE4A1, 0xE4FE, 0x0E13, 0x8EA1, 0xE5A1, 0xE5FE, 0x0E71,
- 0x8EA1, 0xE6A1, 0xE6FE, 0x0ECF, 0x8EA1, 0xE7A1, 0xE7FE, 0x0F2D,
- 0x8EA1, 0xE8A1, 0xE8FE, 0x0F8B, 0x8EA1, 0xE9A1, 0xE9FE, 0x0FE9,
- 0x8EA1, 0xEAA1, 0xEAFE, 0x1047, 0x8EA1, 0xEBA1, 0xEBFE, 0x10A5,
- 0x8EA1, 0xECA1, 0xECFE, 0x1103, 0x8EA1, 0xEDA1, 0xEDFE, 0x1161,
- 0x8EA1, 0xEEA1, 0xEEFE, 0x11BF, 0x8EA1, 0xEFA1, 0xEFFE, 0x121D,
- 0x8EA1, 0xF0A1, 0xF0FE, 0x127B, 0x8EA1, 0xF1A1, 0xF1FE, 0x12D9,
- 0x8EA1, 0xF2A1, 0xF2FE, 0x1337, 0x8EA1, 0xF3A1, 0xF3FE, 0x1395,
- 0x8EA1, 0xF4A1, 0xF4FE, 0x13F3, 0x8EA1, 0xF5A1, 0xF5FE, 0x1451,
- 0x8EA1, 0xF6A1, 0xF6FE, 0x14AF, 0x8EA1, 0xF7A1, 0xF7FE, 0x150D,
- 0x8EA1, 0xF8A1, 0xF8FE, 0x156B, 0x8EA1, 0xF9A1, 0xF9FE, 0x15C9,
- 0x8EA1, 0xFAA1, 0xFAFE, 0x1627, 0x8EA1, 0xFBA1, 0xFBFE, 0x1685,
- 0x8EA1, 0xFCA1, 0xFCFE, 0x16E3, 0x8EA1, 0xFDA1, 0xFDCB, 0x1741,
- 0x8EA2, 0xA1A1, 0xA1FE, 0x176C, 0x8EA2, 0xA2A1, 0xA2FE, 0x17CA,
- 0x8EA2, 0xA3A1, 0xA3FE, 0x1828, 0x8EA2, 0xA4A1, 0xA4FE, 0x1886,
- 0x8EA2, 0xA5A1, 0xA5FE, 0x18E4, 0x8EA2, 0xA6A1, 0xA6FE, 0x1942,
- 0x8EA2, 0xA7A1, 0xA7FE, 0x19A0, 0x8EA2, 0xA8A1, 0xA8FE, 0x19FE,
- 0x8EA2, 0xA9A1, 0xA9FE, 0x1A5C, 0x8EA2, 0xAAA1, 0xAAFE, 0x1ABA,
- 0x8EA2, 0xABA1, 0xABFE, 0x1B18, 0x8EA2, 0xACA1, 0xACFE, 0x1B76,
- 0x8EA2, 0xADA1, 0xADFE, 0x1BD4, 0x8EA2, 0xAEA1, 0xAEFE, 0x1C32,
- 0x8EA2, 0xAFA1, 0xAFFE, 0x1C90, 0x8EA2, 0xB0A1, 0xB0FE, 0x1CEE,
- 0x8EA2, 0xB1A1, 0xB1FE, 0x1D4C, 0x8EA2, 0xB2A1, 0xB2FE, 0x1DAA,
- 0x8EA2, 0xB3A1, 0xB3FE, 0x1E08, 0x8EA2, 0xB4A1, 0xB4FE, 0x1E66,
- 0x8EA2, 0xB5A1, 0xB5FE, 0x1EC4, 0x8EA2, 0xB6A1, 0xB6FE, 0x1F22,
- 0x8EA2, 0xB7A1, 0xB7FE, 0x1F80, 0x8EA2, 0xB8A1, 0xB8FE, 0x1FDE,
- 0x8EA2, 0xB9A1, 0xB9FE, 0x203C, 0x8EA2, 0xBAA1, 0xBAFE, 0x209A,
- 0x8EA2, 0xBBA1, 0xBBFE, 0x20F8, 0x8EA2, 0xBCA1, 0xBCFE, 0x2156,
- 0x8EA2, 0xBDA1, 0xBDFE, 0x21B4, 0x8EA2, 0xBEA1, 0xBEFE, 0x2212,
- 0x8EA2, 0xBFA1, 0xBFFE, 0x2270, 0x8EA2, 0xC0A1, 0xC0FE, 0x22CE,
- 0x8EA2, 0xC1A1, 0xC1FE, 0x232C, 0x8EA2, 0xC2A1, 0xC2FE, 0x238A,
- 0x8EA2, 0xC3A1, 0xC3FE, 0x23E8, 0x8EA2, 0xC4A1, 0xC4FE, 0x2446,
- 0x8EA2, 0xC5A1, 0xC5FE, 0x24A4, 0x8EA2, 0xC6A1, 0xC6FE, 0x2502,
- 0x8EA2, 0xC7A1, 0xC7FE, 0x2560, 0x8EA2, 0xC8A1, 0xC8FE, 0x25BE,
- 0x8EA2, 0xC9A1, 0xC9FE, 0x261C, 0x8EA2, 0xCAA1, 0xCAFE, 0x267A,
- 0x8EA2, 0xCBA1, 0xCBFE, 0x26D8, 0x8EA2, 0xCCA1, 0xCCFE, 0x2736,
- 0x8EA2, 0xCDA1, 0xCDFE, 0x2794, 0x8EA2, 0xCEA1, 0xCEFE, 0x27F2,
- 0x8EA2, 0xCFA1, 0xCFFE, 0x2850, 0x8EA2, 0xD0A1, 0xD0FE, 0x28AE,
- 0x8EA2, 0xD1A1, 0xD1FE, 0x290C, 0x8EA2, 0xD2A1, 0xD2FE, 0x296A,
- 0x8EA2, 0xD3A1, 0xD3FE, 0x29C8, 0x8EA2, 0xD4A1, 0xD4FE, 0x2A26,
- 0x8EA2, 0xD5A1, 0xD5FE, 0x2A84, 0x8EA2, 0xD6A1, 0xD6FE, 0x2AE2,
- 0x8EA2, 0xD7A1, 0xD7FE, 0x2B40, 0x8EA2, 0xD8A1, 0xD8FE, 0x2B9E,
- 0x8EA2, 0xD9A1, 0xD9FE, 0x2BFC, 0x8EA2, 0xDAA1, 0xDAFE, 0x2C5A,
- 0x8EA2, 0xDBA1, 0xDBFE, 0x2CB8, 0x8EA2, 0xDCA1, 0xDCFE, 0x2D16,
- 0x8EA2, 0xDDA1, 0xDDFE, 0x2D74, 0x8EA2, 0xDEA1, 0xDEFE, 0x2DD2,
- 0x8EA2, 0xDFA1, 0xDFFE, 0x2E30, 0x8EA2, 0xE0A1, 0xE0FE, 0x2E8E,
- 0x8EA2, 0xE1A1, 0xE1FE, 0x2EEC, 0x8EA2, 0xE2A1, 0xE2FE, 0x2F4A,
- 0x8EA2, 0xE3A1, 0xE3FE, 0x2FA8, 0x8EA2, 0xE4A1, 0xE4FE, 0x3006,
- 0x8EA2, 0xE5A1, 0xE5FE, 0x3064, 0x8EA2, 0xE6A1, 0xE6FE, 0x30C2,
- 0x8EA2, 0xE7A1, 0xE7FE, 0x3120, 0x8EA2, 0xE8A1, 0xE8FE, 0x317E,
- 0x8EA2, 0xE9A1, 0xE9FE, 0x31DC, 0x8EA2, 0xEAA1, 0xEAFE, 0x323A,
- 0x8EA2, 0xEBA1, 0xEBFE, 0x3298, 0x8EA2, 0xECA1, 0xECFE, 0x32F6,
- 0x8EA2, 0xEDA1, 0xEDFE, 0x3354, 0x8EA2, 0xEEA1, 0xEEFE, 0x33B2,
- 0x8EA2, 0xEFA1, 0xEFFE, 0x3410, 0x8EA2, 0xF0A1, 0xF0FE, 0x346E,
- 0x8EA2, 0xF1A1, 0xF1FE, 0x34CC, 0x8EA2, 0xF2A1, 0xF2C4, 0x352A,
-};
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_CNS_EUC_H_0[157 * 3] = {
+ 0x0020, 0x007E, 0x3550, 0xA1A1, 0xA1FE, 0x0063, 0xA2A1, 0xA2FE, 0x00C1,
+ 0xA3A1, 0xA3CE, 0x011F, 0xA4A1, 0xA4FE, 0x014D, 0xA5A1, 0xA5EC, 0x01AB,
+ 0xA5EE, 0xA5F0, 0x01F7, 0xA6A1, 0xA6BE, 0x01FA, 0xA7A1, 0xA7A1, 0x0253,
+ 0xA7A2, 0xA7A4, 0x0218, 0xA7A5, 0xA7A5, 0x0254, 0xA7A6, 0xA7A6, 0x021B,
+ 0xA7A7, 0xA7A7, 0x025A, 0xA7A8, 0xA7A8, 0x021C, 0xA7A9, 0xA7AC, 0x025B,
+ 0xA7AD, 0xA7AF, 0x021D, 0xA7B0, 0xA7B0, 0x025F, 0xA7B1, 0xA7B1, 0x176E,
+ 0xA7B2, 0xA7B2, 0x0260, 0xA7B3, 0xA7B3, 0x0262, 0xA7B4, 0xA7B4, 0x0220,
+ 0xA7B5, 0xA7B5, 0x0263, 0xA7B6, 0xA7B6, 0x176F, 0xA7B7, 0xA7B7, 0x0221,
+ 0xA7B8, 0xA7B9, 0x0264, 0xA7BA, 0xA7BA, 0x0222, 0xA7BB, 0xA7BB, 0x1770,
+ 0xA7BC, 0xA7BC, 0x0223, 0xA7BD, 0xA7BD, 0x0266, 0xA7BE, 0xA7BE, 0x0279,
+ 0xA7BF, 0xA7BF, 0x1775, 0xA7C0, 0xA7C1, 0x027A, 0xA7C2, 0xA7C2, 0x0224,
+ 0xA7C3, 0xA7C6, 0x027C, 0xA7C7, 0xA7C7, 0x0225, 0xA7C8, 0xA7CB, 0x0282,
+ 0xA7CC, 0xA7CC, 0x1776, 0xA7CD, 0xA7CD, 0x0286, 0xA7CE, 0xA7CE, 0x0226,
+ 0xA7CF, 0xA7D0, 0x0288, 0xA7D1, 0xA7D2, 0x028C, 0xA7D3, 0xA7D5, 0x0227,
+ 0xA7D6, 0xA7D8, 0x028E, 0xA7D9, 0xA7DA, 0x022A, 0xA7DB, 0xA7DB, 0x1777,
+ 0xA7DC, 0xA7DF, 0x02D0, 0xA7E0, 0xA7E0, 0x02D5, 0xA7E1, 0xA7E1, 0x022C,
+ 0xA7E2, 0xA7E5, 0x02D6, 0xA7E6, 0xA7E6, 0x022D, 0xA7E7, 0xA7ED, 0x02DA,
+ 0xA7EE, 0xA7EE, 0x178A, 0xA7EF, 0xA7F2, 0x02E1, 0xA7F3, 0xA7F3, 0x178C,
+ 0xA7F4, 0xA7F8, 0x02E5, 0xA7F9, 0xA7F9, 0x178D, 0xA7FA, 0xA7FD, 0x02EA,
+ 0xA7FE, 0xA7FE, 0x0356, 0xA8A1, 0xA8A6, 0x0357, 0xA8A7, 0xA8A7, 0x035E,
+ 0xA8A8, 0xA8A8, 0x0362, 0xA8A9, 0xA8AA, 0x022E, 0xA8AB, 0xA8B2, 0x0363,
+ 0xA8B3, 0xA8B3, 0x17B2, 0xA8B4, 0xA8B6, 0x036B, 0xA8B7, 0xA8BA, 0x03F6,
+ 0xA8BB, 0xA8BB, 0x1812, 0xA8BC, 0xA8BE, 0x03FA, 0xA8BF, 0xA8C3, 0x03FE,
+ 0xA8C4, 0xA8CC, 0x0405, 0xA8CD, 0xA8CD, 0x1813, 0xA8CE, 0xA8CE, 0x1818,
+ 0xA8CF, 0xA8D2, 0x040F, 0xA8D3, 0xA8D3, 0x1819, 0xA8D4, 0xA8D9, 0x0508,
+ 0xA8DA, 0xA8DA, 0x18E7, 0xA8DB, 0xA8E2, 0x050E, 0xA8E3, 0xA8E3, 0x0230,
+ 0xA8E4, 0xA8E4, 0x051B, 0xA8E5, 0xA8E7, 0x0520, 0xA8E8, 0xA8EB, 0x0696,
+ 0xA8EC, 0xA8EC, 0x0231, 0xA8ED, 0xA8F0, 0x069F, 0xA8F1, 0xA8FB, 0x0826,
+ 0xA8FC, 0xA8FE, 0x09F5, 0xA9A1, 0xA9A1, 0x1E33, 0xA9A2, 0xA9A2, 0x09F8,
+ 0xA9A3, 0xA9A3, 0x1E34, 0xA9A4, 0xA9A5, 0x09F9, 0xA9A6, 0xA9AB, 0x0BE1,
+ 0xA9AC, 0xA9AE, 0x0DBB, 0xA9AF, 0xA9AF, 0x2360, 0xA9B0, 0xA9B0, 0x2612,
+ 0xA9B1, 0xA9B3, 0x0F7B, 0xA9B4, 0xA9B5, 0x1100, 0xA9B6, 0xA9B6, 0x1289,
+ 0xA9B7, 0xA9B8, 0x13B2, 0xA9B9, 0xA9B9, 0x2F0D, 0xC2A1, 0xC2C1, 0x0232,
+ 0xC4A1, 0xC4FE, 0x0253, 0xC5A1, 0xC5FE, 0x02B1, 0xC6A1, 0xC6FE, 0x030F,
+ 0xC7A1, 0xC7FE, 0x036D, 0xC8A1, 0xC8FE, 0x03CB, 0xC9A1, 0xC9FE, 0x0429,
+ 0xCAA1, 0xCAFE, 0x0487, 0xCBA1, 0xCBFE, 0x04E5, 0xCCA1, 0xCCFE, 0x0543,
+ 0xCDA1, 0xCDFE, 0x05A1, 0xCEA1, 0xCEFE, 0x05FF, 0xCFA1, 0xCFFE, 0x065D,
+ 0xD0A1, 0xD0FE, 0x06BB, 0xD1A1, 0xD1FE, 0x0719, 0xD2A1, 0xD2FE, 0x0777,
+ 0xD3A1, 0xD3FE, 0x07D5, 0xD4A1, 0xD4FE, 0x0833, 0xD5A1, 0xD5FE, 0x0891,
+ 0xD6A1, 0xD6FE, 0x08EF, 0xD7A1, 0xD7FE, 0x094D, 0xD8A1, 0xD8FE, 0x09AB,
+ 0xD9A1, 0xD9FE, 0x0A09, 0xDAA1, 0xDAFE, 0x0A67, 0xDBA1, 0xDBFE, 0x0AC5,
+ 0xDCA1, 0xDCFE, 0x0B23, 0xDDA1, 0xDDFE, 0x0B81, 0xDEA1, 0xDEFE, 0x0BDF,
+ 0xDFA1, 0xDFFE, 0x0C3D, 0xE0A1, 0xE0FE, 0x0C9B, 0xE1A1, 0xE1FE, 0x0CF9,
+ 0xE2A1, 0xE2FE, 0x0D57, 0xE3A1, 0xE3FE, 0x0DB5, 0xE4A1, 0xE4FE, 0x0E13,
+ 0xE5A1, 0xE5FE, 0x0E71, 0xE6A1, 0xE6FE, 0x0ECF, 0xE7A1, 0xE7FE, 0x0F2D,
+ 0xE8A1, 0xE8FE, 0x0F8B, 0xE9A1, 0xE9FE, 0x0FE9, 0xEAA1, 0xEAFE, 0x1047,
+ 0xEBA1, 0xEBFE, 0x10A5, 0xECA1, 0xECFE, 0x1103, 0xEDA1, 0xEDFE, 0x1161,
+ 0xEEA1, 0xEEFE, 0x11BF, 0xEFA1, 0xEFFE, 0x121D, 0xF0A1, 0xF0FE, 0x127B,
+ 0xF1A1, 0xF1FE, 0x12D9, 0xF2A1, 0xF2FE, 0x1337, 0xF3A1, 0xF3FE, 0x1395,
+ 0xF4A1, 0xF4FE, 0x13F3, 0xF5A1, 0xF5FE, 0x1451, 0xF6A1, 0xF6FE, 0x14AF,
+ 0xF7A1, 0xF7FE, 0x150D, 0xF8A1, 0xF8FE, 0x156B, 0xF9A1, 0xF9FE, 0x15C9,
+ 0xFAA1, 0xFAFE, 0x1627, 0xFBA1, 0xFBFE, 0x1685, 0xFCA1, 0xFCFE, 0x16E3,
+ 0xFDA1, 0xFDCB, 0x1741,
+};
+extern const unsigned short g_FXCMAP_CNS_EUC_H_0_DWord[238 * 4] = {
+ 0x8EA1, 0xA1A1, 0xA1FE, 0x0063, 0x8EA1, 0xA2A1, 0xA2FE, 0x00C1,
+ 0x8EA1, 0xA3A1, 0xA3CE, 0x011F, 0x8EA1, 0xA4A1, 0xA4FE, 0x014D,
+ 0x8EA1, 0xA5A1, 0xA5EC, 0x01AB, 0x8EA1, 0xA5EE, 0xA5F0, 0x01F7,
+ 0x8EA1, 0xA6A1, 0xA6BE, 0x01FA, 0x8EA1, 0xA7A1, 0xA7A1, 0x0253,
+ 0x8EA1, 0xA7A2, 0xA7A4, 0x0218, 0x8EA1, 0xA7A5, 0xA7A5, 0x0254,
+ 0x8EA1, 0xA7A6, 0xA7A6, 0x021B, 0x8EA1, 0xA7A7, 0xA7A7, 0x025A,
+ 0x8EA1, 0xA7A8, 0xA7A8, 0x021C, 0x8EA1, 0xA7A9, 0xA7AC, 0x025B,
+ 0x8EA1, 0xA7AD, 0xA7AF, 0x021D, 0x8EA1, 0xA7B0, 0xA7B0, 0x025F,
+ 0x8EA1, 0xA7B1, 0xA7B1, 0x176E, 0x8EA1, 0xA7B2, 0xA7B2, 0x0260,
+ 0x8EA1, 0xA7B3, 0xA7B3, 0x0262, 0x8EA1, 0xA7B4, 0xA7B4, 0x0220,
+ 0x8EA1, 0xA7B5, 0xA7B5, 0x0263, 0x8EA1, 0xA7B6, 0xA7B6, 0x176F,
+ 0x8EA1, 0xA7B7, 0xA7B7, 0x0221, 0x8EA1, 0xA7B8, 0xA7B9, 0x0264,
+ 0x8EA1, 0xA7BA, 0xA7BA, 0x0222, 0x8EA1, 0xA7BB, 0xA7BB, 0x1770,
+ 0x8EA1, 0xA7BC, 0xA7BC, 0x0223, 0x8EA1, 0xA7BD, 0xA7BD, 0x0266,
+ 0x8EA1, 0xA7BE, 0xA7BE, 0x0279, 0x8EA1, 0xA7BF, 0xA7BF, 0x1775,
+ 0x8EA1, 0xA7C0, 0xA7C1, 0x027A, 0x8EA1, 0xA7C2, 0xA7C2, 0x0224,
+ 0x8EA1, 0xA7C3, 0xA7C6, 0x027C, 0x8EA1, 0xA7C7, 0xA7C7, 0x0225,
+ 0x8EA1, 0xA7C8, 0xA7CB, 0x0282, 0x8EA1, 0xA7CC, 0xA7CC, 0x1776,
+ 0x8EA1, 0xA7CD, 0xA7CD, 0x0286, 0x8EA1, 0xA7CE, 0xA7CE, 0x0226,
+ 0x8EA1, 0xA7CF, 0xA7D0, 0x0288, 0x8EA1, 0xA7D1, 0xA7D2, 0x028C,
+ 0x8EA1, 0xA7D3, 0xA7D5, 0x0227, 0x8EA1, 0xA7D6, 0xA7D8, 0x028E,
+ 0x8EA1, 0xA7D9, 0xA7DA, 0x022A, 0x8EA1, 0xA7DB, 0xA7DB, 0x1777,
+ 0x8EA1, 0xA7DC, 0xA7DF, 0x02D0, 0x8EA1, 0xA7E0, 0xA7E0, 0x02D5,
+ 0x8EA1, 0xA7E1, 0xA7E1, 0x022C, 0x8EA1, 0xA7E2, 0xA7E5, 0x02D6,
+ 0x8EA1, 0xA7E6, 0xA7E6, 0x022D, 0x8EA1, 0xA7E7, 0xA7ED, 0x02DA,
+ 0x8EA1, 0xA7EE, 0xA7EE, 0x178A, 0x8EA1, 0xA7EF, 0xA7F2, 0x02E1,
+ 0x8EA1, 0xA7F3, 0xA7F3, 0x178C, 0x8EA1, 0xA7F4, 0xA7F8, 0x02E5,
+ 0x8EA1, 0xA7F9, 0xA7F9, 0x178D, 0x8EA1, 0xA7FA, 0xA7FD, 0x02EA,
+ 0x8EA1, 0xA7FE, 0xA7FE, 0x0356, 0x8EA1, 0xA8A1, 0xA8A6, 0x0357,
+ 0x8EA1, 0xA8A7, 0xA8A7, 0x035E, 0x8EA1, 0xA8A8, 0xA8A8, 0x0362,
+ 0x8EA1, 0xA8A9, 0xA8AA, 0x022E, 0x8EA1, 0xA8AB, 0xA8B2, 0x0363,
+ 0x8EA1, 0xA8B3, 0xA8B3, 0x17B2, 0x8EA1, 0xA8B4, 0xA8B6, 0x036B,
+ 0x8EA1, 0xA8B7, 0xA8BA, 0x03F6, 0x8EA1, 0xA8BB, 0xA8BB, 0x1812,
+ 0x8EA1, 0xA8BC, 0xA8BE, 0x03FA, 0x8EA1, 0xA8BF, 0xA8C3, 0x03FE,
+ 0x8EA1, 0xA8C4, 0xA8CC, 0x0405, 0x8EA1, 0xA8CD, 0xA8CD, 0x1813,
+ 0x8EA1, 0xA8CE, 0xA8CE, 0x1818, 0x8EA1, 0xA8CF, 0xA8D2, 0x040F,
+ 0x8EA1, 0xA8D3, 0xA8D3, 0x1819, 0x8EA1, 0xA8D4, 0xA8D9, 0x0508,
+ 0x8EA1, 0xA8DA, 0xA8DA, 0x18E7, 0x8EA1, 0xA8DB, 0xA8E2, 0x050E,
+ 0x8EA1, 0xA8E3, 0xA8E3, 0x0230, 0x8EA1, 0xA8E4, 0xA8E4, 0x051B,
+ 0x8EA1, 0xA8E5, 0xA8E7, 0x0520, 0x8EA1, 0xA8E8, 0xA8EB, 0x0696,
+ 0x8EA1, 0xA8EC, 0xA8EC, 0x0231, 0x8EA1, 0xA8ED, 0xA8F0, 0x069F,
+ 0x8EA1, 0xA8F1, 0xA8FB, 0x0826, 0x8EA1, 0xA8FC, 0xA8FE, 0x09F5,
+ 0x8EA1, 0xA9A1, 0xA9A1, 0x1E33, 0x8EA1, 0xA9A2, 0xA9A2, 0x09F8,
+ 0x8EA1, 0xA9A3, 0xA9A3, 0x1E34, 0x8EA1, 0xA9A4, 0xA9A5, 0x09F9,
+ 0x8EA1, 0xA9A6, 0xA9AB, 0x0BE1, 0x8EA1, 0xA9AC, 0xA9AE, 0x0DBB,
+ 0x8EA1, 0xA9AF, 0xA9AF, 0x2360, 0x8EA1, 0xA9B0, 0xA9B0, 0x2612,
+ 0x8EA1, 0xA9B1, 0xA9B3, 0x0F7B, 0x8EA1, 0xA9B4, 0xA9B5, 0x1100,
+ 0x8EA1, 0xA9B6, 0xA9B6, 0x1289, 0x8EA1, 0xA9B7, 0xA9B8, 0x13B2,
+ 0x8EA1, 0xA9B9, 0xA9B9, 0x2F0D, 0x8EA1, 0xC2A1, 0xC2C1, 0x0232,
+ 0x8EA1, 0xC4A1, 0xC4FE, 0x0253, 0x8EA1, 0xC5A1, 0xC5FE, 0x02B1,
+ 0x8EA1, 0xC6A1, 0xC6FE, 0x030F, 0x8EA1, 0xC7A1, 0xC7FE, 0x036D,
+ 0x8EA1, 0xC8A1, 0xC8FE, 0x03CB, 0x8EA1, 0xC9A1, 0xC9FE, 0x0429,
+ 0x8EA1, 0xCAA1, 0xCAFE, 0x0487, 0x8EA1, 0xCBA1, 0xCBFE, 0x04E5,
+ 0x8EA1, 0xCCA1, 0xCCFE, 0x0543, 0x8EA1, 0xCDA1, 0xCDFE, 0x05A1,
+ 0x8EA1, 0xCEA1, 0xCEFE, 0x05FF, 0x8EA1, 0xCFA1, 0xCFFE, 0x065D,
+ 0x8EA1, 0xD0A1, 0xD0FE, 0x06BB, 0x8EA1, 0xD1A1, 0xD1FE, 0x0719,
+ 0x8EA1, 0xD2A1, 0xD2FE, 0x0777, 0x8EA1, 0xD3A1, 0xD3FE, 0x07D5,
+ 0x8EA1, 0xD4A1, 0xD4FE, 0x0833, 0x8EA1, 0xD5A1, 0xD5FE, 0x0891,
+ 0x8EA1, 0xD6A1, 0xD6FE, 0x08EF, 0x8EA1, 0xD7A1, 0xD7FE, 0x094D,
+ 0x8EA1, 0xD8A1, 0xD8FE, 0x09AB, 0x8EA1, 0xD9A1, 0xD9FE, 0x0A09,
+ 0x8EA1, 0xDAA1, 0xDAFE, 0x0A67, 0x8EA1, 0xDBA1, 0xDBFE, 0x0AC5,
+ 0x8EA1, 0xDCA1, 0xDCFE, 0x0B23, 0x8EA1, 0xDDA1, 0xDDFE, 0x0B81,
+ 0x8EA1, 0xDEA1, 0xDEFE, 0x0BDF, 0x8EA1, 0xDFA1, 0xDFFE, 0x0C3D,
+ 0x8EA1, 0xE0A1, 0xE0FE, 0x0C9B, 0x8EA1, 0xE1A1, 0xE1FE, 0x0CF9,
+ 0x8EA1, 0xE2A1, 0xE2FE, 0x0D57, 0x8EA1, 0xE3A1, 0xE3FE, 0x0DB5,
+ 0x8EA1, 0xE4A1, 0xE4FE, 0x0E13, 0x8EA1, 0xE5A1, 0xE5FE, 0x0E71,
+ 0x8EA1, 0xE6A1, 0xE6FE, 0x0ECF, 0x8EA1, 0xE7A1, 0xE7FE, 0x0F2D,
+ 0x8EA1, 0xE8A1, 0xE8FE, 0x0F8B, 0x8EA1, 0xE9A1, 0xE9FE, 0x0FE9,
+ 0x8EA1, 0xEAA1, 0xEAFE, 0x1047, 0x8EA1, 0xEBA1, 0xEBFE, 0x10A5,
+ 0x8EA1, 0xECA1, 0xECFE, 0x1103, 0x8EA1, 0xEDA1, 0xEDFE, 0x1161,
+ 0x8EA1, 0xEEA1, 0xEEFE, 0x11BF, 0x8EA1, 0xEFA1, 0xEFFE, 0x121D,
+ 0x8EA1, 0xF0A1, 0xF0FE, 0x127B, 0x8EA1, 0xF1A1, 0xF1FE, 0x12D9,
+ 0x8EA1, 0xF2A1, 0xF2FE, 0x1337, 0x8EA1, 0xF3A1, 0xF3FE, 0x1395,
+ 0x8EA1, 0xF4A1, 0xF4FE, 0x13F3, 0x8EA1, 0xF5A1, 0xF5FE, 0x1451,
+ 0x8EA1, 0xF6A1, 0xF6FE, 0x14AF, 0x8EA1, 0xF7A1, 0xF7FE, 0x150D,
+ 0x8EA1, 0xF8A1, 0xF8FE, 0x156B, 0x8EA1, 0xF9A1, 0xF9FE, 0x15C9,
+ 0x8EA1, 0xFAA1, 0xFAFE, 0x1627, 0x8EA1, 0xFBA1, 0xFBFE, 0x1685,
+ 0x8EA1, 0xFCA1, 0xFCFE, 0x16E3, 0x8EA1, 0xFDA1, 0xFDCB, 0x1741,
+ 0x8EA2, 0xA1A1, 0xA1FE, 0x176C, 0x8EA2, 0xA2A1, 0xA2FE, 0x17CA,
+ 0x8EA2, 0xA3A1, 0xA3FE, 0x1828, 0x8EA2, 0xA4A1, 0xA4FE, 0x1886,
+ 0x8EA2, 0xA5A1, 0xA5FE, 0x18E4, 0x8EA2, 0xA6A1, 0xA6FE, 0x1942,
+ 0x8EA2, 0xA7A1, 0xA7FE, 0x19A0, 0x8EA2, 0xA8A1, 0xA8FE, 0x19FE,
+ 0x8EA2, 0xA9A1, 0xA9FE, 0x1A5C, 0x8EA2, 0xAAA1, 0xAAFE, 0x1ABA,
+ 0x8EA2, 0xABA1, 0xABFE, 0x1B18, 0x8EA2, 0xACA1, 0xACFE, 0x1B76,
+ 0x8EA2, 0xADA1, 0xADFE, 0x1BD4, 0x8EA2, 0xAEA1, 0xAEFE, 0x1C32,
+ 0x8EA2, 0xAFA1, 0xAFFE, 0x1C90, 0x8EA2, 0xB0A1, 0xB0FE, 0x1CEE,
+ 0x8EA2, 0xB1A1, 0xB1FE, 0x1D4C, 0x8EA2, 0xB2A1, 0xB2FE, 0x1DAA,
+ 0x8EA2, 0xB3A1, 0xB3FE, 0x1E08, 0x8EA2, 0xB4A1, 0xB4FE, 0x1E66,
+ 0x8EA2, 0xB5A1, 0xB5FE, 0x1EC4, 0x8EA2, 0xB6A1, 0xB6FE, 0x1F22,
+ 0x8EA2, 0xB7A1, 0xB7FE, 0x1F80, 0x8EA2, 0xB8A1, 0xB8FE, 0x1FDE,
+ 0x8EA2, 0xB9A1, 0xB9FE, 0x203C, 0x8EA2, 0xBAA1, 0xBAFE, 0x209A,
+ 0x8EA2, 0xBBA1, 0xBBFE, 0x20F8, 0x8EA2, 0xBCA1, 0xBCFE, 0x2156,
+ 0x8EA2, 0xBDA1, 0xBDFE, 0x21B4, 0x8EA2, 0xBEA1, 0xBEFE, 0x2212,
+ 0x8EA2, 0xBFA1, 0xBFFE, 0x2270, 0x8EA2, 0xC0A1, 0xC0FE, 0x22CE,
+ 0x8EA2, 0xC1A1, 0xC1FE, 0x232C, 0x8EA2, 0xC2A1, 0xC2FE, 0x238A,
+ 0x8EA2, 0xC3A1, 0xC3FE, 0x23E8, 0x8EA2, 0xC4A1, 0xC4FE, 0x2446,
+ 0x8EA2, 0xC5A1, 0xC5FE, 0x24A4, 0x8EA2, 0xC6A1, 0xC6FE, 0x2502,
+ 0x8EA2, 0xC7A1, 0xC7FE, 0x2560, 0x8EA2, 0xC8A1, 0xC8FE, 0x25BE,
+ 0x8EA2, 0xC9A1, 0xC9FE, 0x261C, 0x8EA2, 0xCAA1, 0xCAFE, 0x267A,
+ 0x8EA2, 0xCBA1, 0xCBFE, 0x26D8, 0x8EA2, 0xCCA1, 0xCCFE, 0x2736,
+ 0x8EA2, 0xCDA1, 0xCDFE, 0x2794, 0x8EA2, 0xCEA1, 0xCEFE, 0x27F2,
+ 0x8EA2, 0xCFA1, 0xCFFE, 0x2850, 0x8EA2, 0xD0A1, 0xD0FE, 0x28AE,
+ 0x8EA2, 0xD1A1, 0xD1FE, 0x290C, 0x8EA2, 0xD2A1, 0xD2FE, 0x296A,
+ 0x8EA2, 0xD3A1, 0xD3FE, 0x29C8, 0x8EA2, 0xD4A1, 0xD4FE, 0x2A26,
+ 0x8EA2, 0xD5A1, 0xD5FE, 0x2A84, 0x8EA2, 0xD6A1, 0xD6FE, 0x2AE2,
+ 0x8EA2, 0xD7A1, 0xD7FE, 0x2B40, 0x8EA2, 0xD8A1, 0xD8FE, 0x2B9E,
+ 0x8EA2, 0xD9A1, 0xD9FE, 0x2BFC, 0x8EA2, 0xDAA1, 0xDAFE, 0x2C5A,
+ 0x8EA2, 0xDBA1, 0xDBFE, 0x2CB8, 0x8EA2, 0xDCA1, 0xDCFE, 0x2D16,
+ 0x8EA2, 0xDDA1, 0xDDFE, 0x2D74, 0x8EA2, 0xDEA1, 0xDEFE, 0x2DD2,
+ 0x8EA2, 0xDFA1, 0xDFFE, 0x2E30, 0x8EA2, 0xE0A1, 0xE0FE, 0x2E8E,
+ 0x8EA2, 0xE1A1, 0xE1FE, 0x2EEC, 0x8EA2, 0xE2A1, 0xE2FE, 0x2F4A,
+ 0x8EA2, 0xE3A1, 0xE3FE, 0x2FA8, 0x8EA2, 0xE4A1, 0xE4FE, 0x3006,
+ 0x8EA2, 0xE5A1, 0xE5FE, 0x3064, 0x8EA2, 0xE6A1, 0xE6FE, 0x30C2,
+ 0x8EA2, 0xE7A1, 0xE7FE, 0x3120, 0x8EA2, 0xE8A1, 0xE8FE, 0x317E,
+ 0x8EA2, 0xE9A1, 0xE9FE, 0x31DC, 0x8EA2, 0xEAA1, 0xEAFE, 0x323A,
+ 0x8EA2, 0xEBA1, 0xEBFE, 0x3298, 0x8EA2, 0xECA1, 0xECFE, 0x32F6,
+ 0x8EA2, 0xEDA1, 0xEDFE, 0x3354, 0x8EA2, 0xEEA1, 0xEEFE, 0x33B2,
+ 0x8EA2, 0xEFA1, 0xEFFE, 0x3410, 0x8EA2, 0xF0A1, 0xF0FE, 0x346E,
+ 0x8EA2, 0xF1A1, 0xF1FE, 0x34CC, 0x8EA2, 0xF2A1, 0xF2C4, 0x352A,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/CNS1/CNS-EUC-V_0.cpp b/core/src/fpdfapi/fpdf_cmaps/CNS1/CNS-EUC-V_0.cpp
index 8737cf4c90..eb773a7a93 100644
--- a/core/src/fpdfapi/fpdf_cmaps/CNS1/CNS-EUC-V_0.cpp
+++ b/core/src/fpdfapi/fpdf_cmaps/CNS1/CNS-EUC-V_0.cpp
@@ -1,201 +1,201 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-extern const unsigned short g_FXCMAP_CNS_EUC_V_0[180 * 3] = {
- 0x0020, 0x007E, 0x3550, 0xA1A1, 0xA1AB, 0x0063, 0xA1AC, 0xA1AC, 0x354E,
- 0xA1AD, 0xA1BA, 0x006F, 0xA1BB, 0xA1BB, 0x007C, 0xA1BC, 0xA1BC, 0x007E,
- 0xA1BD, 0xA1BD, 0x007E, 0xA1BE, 0xA1BF, 0x0082, 0xA1C0, 0xA1C1, 0x0082,
- 0xA1C2, 0xA1C3, 0x0086, 0xA1C4, 0xA1C5, 0x0086, 0xA1C6, 0xA1C7, 0x008A,
- 0xA1C8, 0xA1C9, 0x008A, 0xA1CA, 0xA1CB, 0x008E, 0xA1CC, 0xA1CD, 0x008E,
- 0xA1CE, 0xA1CF, 0x0092, 0xA1D0, 0xA1D1, 0x0092, 0xA1D2, 0xA1D3, 0x0096,
- 0xA1D4, 0xA1D5, 0x0096, 0xA1D6, 0xA1D7, 0x009A, 0xA1D8, 0xA1D9, 0x009A,
- 0xA1DA, 0xA1DB, 0x009E, 0xA1DC, 0xA1FE, 0x009E, 0xA2A1, 0xA2C3, 0x00C1,
- 0xA2C4, 0xA2C4, 0x354F, 0xA2C5, 0xA2FE, 0x00E5, 0xA3A1, 0xA3CE, 0x011F,
- 0xA4A1, 0xA4FE, 0x014D, 0xA5A1, 0xA5EC, 0x01AB, 0xA5EE, 0xA5F0, 0x01F7,
- 0xA6A1, 0xA6BE, 0x01FA, 0xA7A1, 0xA7A1, 0x0253, 0xA7A2, 0xA7A4, 0x0218,
- 0xA7A5, 0xA7A5, 0x0254, 0xA7A6, 0xA7A6, 0x021B, 0xA7A7, 0xA7A7, 0x025A,
- 0xA7A8, 0xA7A8, 0x021C, 0xA7A9, 0xA7AC, 0x025B, 0xA7AD, 0xA7AF, 0x021D,
- 0xA7B0, 0xA7B0, 0x025F, 0xA7B1, 0xA7B1, 0x176E, 0xA7B2, 0xA7B2, 0x0260,
- 0xA7B3, 0xA7B3, 0x0262, 0xA7B4, 0xA7B4, 0x0220, 0xA7B5, 0xA7B5, 0x0263,
- 0xA7B6, 0xA7B6, 0x176F, 0xA7B7, 0xA7B7, 0x0221, 0xA7B8, 0xA7B9, 0x0264,
- 0xA7BA, 0xA7BA, 0x0222, 0xA7BB, 0xA7BB, 0x1770, 0xA7BC, 0xA7BC, 0x0223,
- 0xA7BD, 0xA7BD, 0x0266, 0xA7BE, 0xA7BE, 0x0279, 0xA7BF, 0xA7BF, 0x1775,
- 0xA7C0, 0xA7C1, 0x027A, 0xA7C2, 0xA7C2, 0x0224, 0xA7C3, 0xA7C6, 0x027C,
- 0xA7C7, 0xA7C7, 0x0225, 0xA7C8, 0xA7CB, 0x0282, 0xA7CC, 0xA7CC, 0x1776,
- 0xA7CD, 0xA7CD, 0x0286, 0xA7CE, 0xA7CE, 0x0226, 0xA7CF, 0xA7D0, 0x0288,
- 0xA7D1, 0xA7D2, 0x028C, 0xA7D3, 0xA7D5, 0x0227, 0xA7D6, 0xA7D8, 0x028E,
- 0xA7D9, 0xA7DA, 0x022A, 0xA7DB, 0xA7DB, 0x1777, 0xA7DC, 0xA7DF, 0x02D0,
- 0xA7E0, 0xA7E0, 0x02D5, 0xA7E1, 0xA7E1, 0x022C, 0xA7E2, 0xA7E5, 0x02D6,
- 0xA7E6, 0xA7E6, 0x022D, 0xA7E7, 0xA7ED, 0x02DA, 0xA7EE, 0xA7EE, 0x178A,
- 0xA7EF, 0xA7F2, 0x02E1, 0xA7F3, 0xA7F3, 0x178C, 0xA7F4, 0xA7F8, 0x02E5,
- 0xA7F9, 0xA7F9, 0x178D, 0xA7FA, 0xA7FD, 0x02EA, 0xA7FE, 0xA7FE, 0x0356,
- 0xA8A1, 0xA8A6, 0x0357, 0xA8A7, 0xA8A7, 0x035E, 0xA8A8, 0xA8A8, 0x0362,
- 0xA8A9, 0xA8AA, 0x022E, 0xA8AB, 0xA8B2, 0x0363, 0xA8B3, 0xA8B3, 0x17B2,
- 0xA8B4, 0xA8B6, 0x036B, 0xA8B7, 0xA8BA, 0x03F6, 0xA8BB, 0xA8BB, 0x1812,
- 0xA8BC, 0xA8BE, 0x03FA, 0xA8BF, 0xA8C3, 0x03FE, 0xA8C4, 0xA8CC, 0x0405,
- 0xA8CD, 0xA8CD, 0x1813, 0xA8CE, 0xA8CE, 0x1818, 0xA8CF, 0xA8D2, 0x040F,
- 0xA8D3, 0xA8D3, 0x1819, 0xA8D4, 0xA8D9, 0x0508, 0xA8DA, 0xA8DA, 0x18E7,
- 0xA8DB, 0xA8E2, 0x050E, 0xA8E3, 0xA8E3, 0x0230, 0xA8E4, 0xA8E4, 0x051B,
- 0xA8E5, 0xA8E7, 0x0520, 0xA8E8, 0xA8EB, 0x0696, 0xA8EC, 0xA8EC, 0x0231,
- 0xA8ED, 0xA8F0, 0x069F, 0xA8F1, 0xA8FB, 0x0826, 0xA8FC, 0xA8FE, 0x09F5,
- 0xA9A1, 0xA9A1, 0x1E33, 0xA9A2, 0xA9A2, 0x09F8, 0xA9A3, 0xA9A3, 0x1E34,
- 0xA9A4, 0xA9A5, 0x09F9, 0xA9A6, 0xA9AB, 0x0BE1, 0xA9AC, 0xA9AE, 0x0DBB,
- 0xA9AF, 0xA9AF, 0x2360, 0xA9B0, 0xA9B0, 0x2612, 0xA9B1, 0xA9B3, 0x0F7B,
- 0xA9B4, 0xA9B5, 0x1100, 0xA9B6, 0xA9B6, 0x1289, 0xA9B7, 0xA9B8, 0x13B2,
- 0xA9B9, 0xA9B9, 0x2F0D, 0xC2A1, 0xC2C1, 0x0232, 0xC4A1, 0xC4FE, 0x0253,
- 0xC5A1, 0xC5FE, 0x02B1, 0xC6A1, 0xC6FE, 0x030F, 0xC7A1, 0xC7FE, 0x036D,
- 0xC8A1, 0xC8FE, 0x03CB, 0xC9A1, 0xC9FE, 0x0429, 0xCAA1, 0xCAFE, 0x0487,
- 0xCBA1, 0xCBFE, 0x04E5, 0xCCA1, 0xCCFE, 0x0543, 0xCDA1, 0xCDFE, 0x05A1,
- 0xCEA1, 0xCEFE, 0x05FF, 0xCFA1, 0xCFFE, 0x065D, 0xD0A1, 0xD0FE, 0x06BB,
- 0xD1A1, 0xD1FE, 0x0719, 0xD2A1, 0xD2FE, 0x0777, 0xD3A1, 0xD3FE, 0x07D5,
- 0xD4A1, 0xD4FE, 0x0833, 0xD5A1, 0xD5FE, 0x0891, 0xD6A1, 0xD6FE, 0x08EF,
- 0xD7A1, 0xD7FE, 0x094D, 0xD8A1, 0xD8FE, 0x09AB, 0xD9A1, 0xD9FE, 0x0A09,
- 0xDAA1, 0xDAFE, 0x0A67, 0xDBA1, 0xDBFE, 0x0AC5, 0xDCA1, 0xDCFE, 0x0B23,
- 0xDDA1, 0xDDFE, 0x0B81, 0xDEA1, 0xDEFE, 0x0BDF, 0xDFA1, 0xDFFE, 0x0C3D,
- 0xE0A1, 0xE0FE, 0x0C9B, 0xE1A1, 0xE1FE, 0x0CF9, 0xE2A1, 0xE2FE, 0x0D57,
- 0xE3A1, 0xE3FE, 0x0DB5, 0xE4A1, 0xE4FE, 0x0E13, 0xE5A1, 0xE5FE, 0x0E71,
- 0xE6A1, 0xE6FE, 0x0ECF, 0xE7A1, 0xE7FE, 0x0F2D, 0xE8A1, 0xE8FE, 0x0F8B,
- 0xE9A1, 0xE9FE, 0x0FE9, 0xEAA1, 0xEAFE, 0x1047, 0xEBA1, 0xEBFE, 0x10A5,
- 0xECA1, 0xECFE, 0x1103, 0xEDA1, 0xEDFE, 0x1161, 0xEEA1, 0xEEFE, 0x11BF,
- 0xEFA1, 0xEFFE, 0x121D, 0xF0A1, 0xF0FE, 0x127B, 0xF1A1, 0xF1FE, 0x12D9,
- 0xF2A1, 0xF2FE, 0x1337, 0xF3A1, 0xF3FE, 0x1395, 0xF4A1, 0xF4FE, 0x13F3,
- 0xF5A1, 0xF5FE, 0x1451, 0xF6A1, 0xF6FE, 0x14AF, 0xF7A1, 0xF7FE, 0x150D,
- 0xF8A1, 0xF8FE, 0x156B, 0xF9A1, 0xF9FE, 0x15C9, 0xFAA1, 0xFAFE, 0x1627,
- 0xFBA1, 0xFBFE, 0x1685, 0xFCA1, 0xFCFE, 0x16E3, 0xFDA1, 0xFDCB, 0x1741,
-};
-extern const unsigned short g_FXCMAP_CNS_EUC_V_0_DWord[261 * 4] = {
- 0x8EA1, 0xA1A1, 0xA1AB, 0x0063, 0x8EA1, 0xA1AC, 0xA1AC, 0x354E,
- 0x8EA1, 0xA1AD, 0xA1BA, 0x006F, 0x8EA1, 0xA1BB, 0xA1BB, 0x007C,
- 0x8EA1, 0xA1BC, 0xA1BC, 0x007E, 0x8EA1, 0xA1BD, 0xA1BD, 0x007E,
- 0x8EA1, 0xA1BE, 0xA1BF, 0x0082, 0x8EA1, 0xA1C0, 0xA1C1, 0x0082,
- 0x8EA1, 0xA1C2, 0xA1C3, 0x0086, 0x8EA1, 0xA1C4, 0xA1C5, 0x0086,
- 0x8EA1, 0xA1C6, 0xA1C7, 0x008A, 0x8EA1, 0xA1C8, 0xA1C9, 0x008A,
- 0x8EA1, 0xA1CA, 0xA1CB, 0x008E, 0x8EA1, 0xA1CC, 0xA1CD, 0x008E,
- 0x8EA1, 0xA1CE, 0xA1CF, 0x0092, 0x8EA1, 0xA1D0, 0xA1D1, 0x0092,
- 0x8EA1, 0xA1D2, 0xA1D3, 0x0096, 0x8EA1, 0xA1D4, 0xA1D5, 0x0096,
- 0x8EA1, 0xA1D6, 0xA1D7, 0x009A, 0x8EA1, 0xA1D8, 0xA1D9, 0x009A,
- 0x8EA1, 0xA1DA, 0xA1DB, 0x009E, 0x8EA1, 0xA1DC, 0xA1FE, 0x009E,
- 0x8EA1, 0xA2A1, 0xA2C3, 0x00C1, 0x8EA1, 0xA2C4, 0xA2C4, 0x354F,
- 0x8EA1, 0xA2C5, 0xA2FE, 0x00E5, 0x8EA1, 0xA3A1, 0xA3CE, 0x011F,
- 0x8EA1, 0xA4A1, 0xA4FE, 0x014D, 0x8EA1, 0xA5A1, 0xA5EC, 0x01AB,
- 0x8EA1, 0xA5EE, 0xA5F0, 0x01F7, 0x8EA1, 0xA6A1, 0xA6BE, 0x01FA,
- 0x8EA1, 0xA7A1, 0xA7A1, 0x0253, 0x8EA1, 0xA7A2, 0xA7A4, 0x0218,
- 0x8EA1, 0xA7A5, 0xA7A5, 0x0254, 0x8EA1, 0xA7A6, 0xA7A6, 0x021B,
- 0x8EA1, 0xA7A7, 0xA7A7, 0x025A, 0x8EA1, 0xA7A8, 0xA7A8, 0x021C,
- 0x8EA1, 0xA7A9, 0xA7AC, 0x025B, 0x8EA1, 0xA7AD, 0xA7AF, 0x021D,
- 0x8EA1, 0xA7B0, 0xA7B0, 0x025F, 0x8EA1, 0xA7B1, 0xA7B1, 0x176E,
- 0x8EA1, 0xA7B2, 0xA7B2, 0x0260, 0x8EA1, 0xA7B3, 0xA7B3, 0x0262,
- 0x8EA1, 0xA7B4, 0xA7B4, 0x0220, 0x8EA1, 0xA7B5, 0xA7B5, 0x0263,
- 0x8EA1, 0xA7B6, 0xA7B6, 0x176F, 0x8EA1, 0xA7B7, 0xA7B7, 0x0221,
- 0x8EA1, 0xA7B8, 0xA7B9, 0x0264, 0x8EA1, 0xA7BA, 0xA7BA, 0x0222,
- 0x8EA1, 0xA7BB, 0xA7BB, 0x1770, 0x8EA1, 0xA7BC, 0xA7BC, 0x0223,
- 0x8EA1, 0xA7BD, 0xA7BD, 0x0266, 0x8EA1, 0xA7BE, 0xA7BE, 0x0279,
- 0x8EA1, 0xA7BF, 0xA7BF, 0x1775, 0x8EA1, 0xA7C0, 0xA7C1, 0x027A,
- 0x8EA1, 0xA7C2, 0xA7C2, 0x0224, 0x8EA1, 0xA7C3, 0xA7C6, 0x027C,
- 0x8EA1, 0xA7C7, 0xA7C7, 0x0225, 0x8EA1, 0xA7C8, 0xA7CB, 0x0282,
- 0x8EA1, 0xA7CC, 0xA7CC, 0x1776, 0x8EA1, 0xA7CD, 0xA7CD, 0x0286,
- 0x8EA1, 0xA7CE, 0xA7CE, 0x0226, 0x8EA1, 0xA7CF, 0xA7D0, 0x0288,
- 0x8EA1, 0xA7D1, 0xA7D2, 0x028C, 0x8EA1, 0xA7D3, 0xA7D5, 0x0227,
- 0x8EA1, 0xA7D6, 0xA7D8, 0x028E, 0x8EA1, 0xA7D9, 0xA7DA, 0x022A,
- 0x8EA1, 0xA7DB, 0xA7DB, 0x1777, 0x8EA1, 0xA7DC, 0xA7DF, 0x02D0,
- 0x8EA1, 0xA7E0, 0xA7E0, 0x02D5, 0x8EA1, 0xA7E1, 0xA7E1, 0x022C,
- 0x8EA1, 0xA7E2, 0xA7E5, 0x02D6, 0x8EA1, 0xA7E6, 0xA7E6, 0x022D,
- 0x8EA1, 0xA7E7, 0xA7ED, 0x02DA, 0x8EA1, 0xA7EE, 0xA7EE, 0x178A,
- 0x8EA1, 0xA7EF, 0xA7F2, 0x02E1, 0x8EA1, 0xA7F3, 0xA7F3, 0x178C,
- 0x8EA1, 0xA7F4, 0xA7F8, 0x02E5, 0x8EA1, 0xA7F9, 0xA7F9, 0x178D,
- 0x8EA1, 0xA7FA, 0xA7FD, 0x02EA, 0x8EA1, 0xA7FE, 0xA7FE, 0x0356,
- 0x8EA1, 0xA8A1, 0xA8A6, 0x0357, 0x8EA1, 0xA8A7, 0xA8A7, 0x035E,
- 0x8EA1, 0xA8A8, 0xA8A8, 0x0362, 0x8EA1, 0xA8A9, 0xA8AA, 0x022E,
- 0x8EA1, 0xA8AB, 0xA8B2, 0x0363, 0x8EA1, 0xA8B3, 0xA8B3, 0x17B2,
- 0x8EA1, 0xA8B4, 0xA8B6, 0x036B, 0x8EA1, 0xA8B7, 0xA8BA, 0x03F6,
- 0x8EA1, 0xA8BB, 0xA8BB, 0x1812, 0x8EA1, 0xA8BC, 0xA8BE, 0x03FA,
- 0x8EA1, 0xA8BF, 0xA8C3, 0x03FE, 0x8EA1, 0xA8C4, 0xA8CC, 0x0405,
- 0x8EA1, 0xA8CD, 0xA8CD, 0x1813, 0x8EA1, 0xA8CE, 0xA8CE, 0x1818,
- 0x8EA1, 0xA8CF, 0xA8D2, 0x040F, 0x8EA1, 0xA8D3, 0xA8D3, 0x1819,
- 0x8EA1, 0xA8D4, 0xA8D9, 0x0508, 0x8EA1, 0xA8DA, 0xA8DA, 0x18E7,
- 0x8EA1, 0xA8DB, 0xA8E2, 0x050E, 0x8EA1, 0xA8E3, 0xA8E3, 0x0230,
- 0x8EA1, 0xA8E4, 0xA8E4, 0x051B, 0x8EA1, 0xA8E5, 0xA8E7, 0x0520,
- 0x8EA1, 0xA8E8, 0xA8EB, 0x0696, 0x8EA1, 0xA8EC, 0xA8EC, 0x0231,
- 0x8EA1, 0xA8ED, 0xA8F0, 0x069F, 0x8EA1, 0xA8F1, 0xA8FB, 0x0826,
- 0x8EA1, 0xA8FC, 0xA8FE, 0x09F5, 0x8EA1, 0xA9A1, 0xA9A1, 0x1E33,
- 0x8EA1, 0xA9A2, 0xA9A2, 0x09F8, 0x8EA1, 0xA9A3, 0xA9A3, 0x1E34,
- 0x8EA1, 0xA9A4, 0xA9A5, 0x09F9, 0x8EA1, 0xA9A6, 0xA9AB, 0x0BE1,
- 0x8EA1, 0xA9AC, 0xA9AE, 0x0DBB, 0x8EA1, 0xA9AF, 0xA9AF, 0x2360,
- 0x8EA1, 0xA9B0, 0xA9B0, 0x2612, 0x8EA1, 0xA9B1, 0xA9B3, 0x0F7B,
- 0x8EA1, 0xA9B4, 0xA9B5, 0x1100, 0x8EA1, 0xA9B6, 0xA9B6, 0x1289,
- 0x8EA1, 0xA9B7, 0xA9B8, 0x13B2, 0x8EA1, 0xA9B9, 0xA9B9, 0x2F0D,
- 0x8EA1, 0xC2A1, 0xC2C1, 0x0232, 0x8EA1, 0xC4A1, 0xC4FE, 0x0253,
- 0x8EA1, 0xC5A1, 0xC5FE, 0x02B1, 0x8EA1, 0xC6A1, 0xC6FE, 0x030F,
- 0x8EA1, 0xC7A1, 0xC7FE, 0x036D, 0x8EA1, 0xC8A1, 0xC8FE, 0x03CB,
- 0x8EA1, 0xC9A1, 0xC9FE, 0x0429, 0x8EA1, 0xCAA1, 0xCAFE, 0x0487,
- 0x8EA1, 0xCBA1, 0xCBFE, 0x04E5, 0x8EA1, 0xCCA1, 0xCCFE, 0x0543,
- 0x8EA1, 0xCDA1, 0xCDFE, 0x05A1, 0x8EA1, 0xCEA1, 0xCEFE, 0x05FF,
- 0x8EA1, 0xCFA1, 0xCFFE, 0x065D, 0x8EA1, 0xD0A1, 0xD0FE, 0x06BB,
- 0x8EA1, 0xD1A1, 0xD1FE, 0x0719, 0x8EA1, 0xD2A1, 0xD2FE, 0x0777,
- 0x8EA1, 0xD3A1, 0xD3FE, 0x07D5, 0x8EA1, 0xD4A1, 0xD4FE, 0x0833,
- 0x8EA1, 0xD5A1, 0xD5FE, 0x0891, 0x8EA1, 0xD6A1, 0xD6FE, 0x08EF,
- 0x8EA1, 0xD7A1, 0xD7FE, 0x094D, 0x8EA1, 0xD8A1, 0xD8FE, 0x09AB,
- 0x8EA1, 0xD9A1, 0xD9FE, 0x0A09, 0x8EA1, 0xDAA1, 0xDAFE, 0x0A67,
- 0x8EA1, 0xDBA1, 0xDBFE, 0x0AC5, 0x8EA1, 0xDCA1, 0xDCFE, 0x0B23,
- 0x8EA1, 0xDDA1, 0xDDFE, 0x0B81, 0x8EA1, 0xDEA1, 0xDEFE, 0x0BDF,
- 0x8EA1, 0xDFA1, 0xDFFE, 0x0C3D, 0x8EA1, 0xE0A1, 0xE0FE, 0x0C9B,
- 0x8EA1, 0xE1A1, 0xE1FE, 0x0CF9, 0x8EA1, 0xE2A1, 0xE2FE, 0x0D57,
- 0x8EA1, 0xE3A1, 0xE3FE, 0x0DB5, 0x8EA1, 0xE4A1, 0xE4FE, 0x0E13,
- 0x8EA1, 0xE5A1, 0xE5FE, 0x0E71, 0x8EA1, 0xE6A1, 0xE6FE, 0x0ECF,
- 0x8EA1, 0xE7A1, 0xE7FE, 0x0F2D, 0x8EA1, 0xE8A1, 0xE8FE, 0x0F8B,
- 0x8EA1, 0xE9A1, 0xE9FE, 0x0FE9, 0x8EA1, 0xEAA1, 0xEAFE, 0x1047,
- 0x8EA1, 0xEBA1, 0xEBFE, 0x10A5, 0x8EA1, 0xECA1, 0xECFE, 0x1103,
- 0x8EA1, 0xEDA1, 0xEDFE, 0x1161, 0x8EA1, 0xEEA1, 0xEEFE, 0x11BF,
- 0x8EA1, 0xEFA1, 0xEFFE, 0x121D, 0x8EA1, 0xF0A1, 0xF0FE, 0x127B,
- 0x8EA1, 0xF1A1, 0xF1FE, 0x12D9, 0x8EA1, 0xF2A1, 0xF2FE, 0x1337,
- 0x8EA1, 0xF3A1, 0xF3FE, 0x1395, 0x8EA1, 0xF4A1, 0xF4FE, 0x13F3,
- 0x8EA1, 0xF5A1, 0xF5FE, 0x1451, 0x8EA1, 0xF6A1, 0xF6FE, 0x14AF,
- 0x8EA1, 0xF7A1, 0xF7FE, 0x150D, 0x8EA1, 0xF8A1, 0xF8FE, 0x156B,
- 0x8EA1, 0xF9A1, 0xF9FE, 0x15C9, 0x8EA1, 0xFAA1, 0xFAFE, 0x1627,
- 0x8EA1, 0xFBA1, 0xFBFE, 0x1685, 0x8EA1, 0xFCA1, 0xFCFE, 0x16E3,
- 0x8EA1, 0xFDA1, 0xFDCB, 0x1741, 0x8EA2, 0xA1A1, 0xA1FE, 0x176C,
- 0x8EA2, 0xA2A1, 0xA2FE, 0x17CA, 0x8EA2, 0xA3A1, 0xA3FE, 0x1828,
- 0x8EA2, 0xA4A1, 0xA4FE, 0x1886, 0x8EA2, 0xA5A1, 0xA5FE, 0x18E4,
- 0x8EA2, 0xA6A1, 0xA6FE, 0x1942, 0x8EA2, 0xA7A1, 0xA7FE, 0x19A0,
- 0x8EA2, 0xA8A1, 0xA8FE, 0x19FE, 0x8EA2, 0xA9A1, 0xA9FE, 0x1A5C,
- 0x8EA2, 0xAAA1, 0xAAFE, 0x1ABA, 0x8EA2, 0xABA1, 0xABFE, 0x1B18,
- 0x8EA2, 0xACA1, 0xACFE, 0x1B76, 0x8EA2, 0xADA1, 0xADFE, 0x1BD4,
- 0x8EA2, 0xAEA1, 0xAEFE, 0x1C32, 0x8EA2, 0xAFA1, 0xAFFE, 0x1C90,
- 0x8EA2, 0xB0A1, 0xB0FE, 0x1CEE, 0x8EA2, 0xB1A1, 0xB1FE, 0x1D4C,
- 0x8EA2, 0xB2A1, 0xB2FE, 0x1DAA, 0x8EA2, 0xB3A1, 0xB3FE, 0x1E08,
- 0x8EA2, 0xB4A1, 0xB4FE, 0x1E66, 0x8EA2, 0xB5A1, 0xB5FE, 0x1EC4,
- 0x8EA2, 0xB6A1, 0xB6FE, 0x1F22, 0x8EA2, 0xB7A1, 0xB7FE, 0x1F80,
- 0x8EA2, 0xB8A1, 0xB8FE, 0x1FDE, 0x8EA2, 0xB9A1, 0xB9FE, 0x203C,
- 0x8EA2, 0xBAA1, 0xBAFE, 0x209A, 0x8EA2, 0xBBA1, 0xBBFE, 0x20F8,
- 0x8EA2, 0xBCA1, 0xBCFE, 0x2156, 0x8EA2, 0xBDA1, 0xBDFE, 0x21B4,
- 0x8EA2, 0xBEA1, 0xBEFE, 0x2212, 0x8EA2, 0xBFA1, 0xBFFE, 0x2270,
- 0x8EA2, 0xC0A1, 0xC0FE, 0x22CE, 0x8EA2, 0xC1A1, 0xC1FE, 0x232C,
- 0x8EA2, 0xC2A1, 0xC2FE, 0x238A, 0x8EA2, 0xC3A1, 0xC3FE, 0x23E8,
- 0x8EA2, 0xC4A1, 0xC4FE, 0x2446, 0x8EA2, 0xC5A1, 0xC5FE, 0x24A4,
- 0x8EA2, 0xC6A1, 0xC6FE, 0x2502, 0x8EA2, 0xC7A1, 0xC7FE, 0x2560,
- 0x8EA2, 0xC8A1, 0xC8FE, 0x25BE, 0x8EA2, 0xC9A1, 0xC9FE, 0x261C,
- 0x8EA2, 0xCAA1, 0xCAFE, 0x267A, 0x8EA2, 0xCBA1, 0xCBFE, 0x26D8,
- 0x8EA2, 0xCCA1, 0xCCFE, 0x2736, 0x8EA2, 0xCDA1, 0xCDFE, 0x2794,
- 0x8EA2, 0xCEA1, 0xCEFE, 0x27F2, 0x8EA2, 0xCFA1, 0xCFFE, 0x2850,
- 0x8EA2, 0xD0A1, 0xD0FE, 0x28AE, 0x8EA2, 0xD1A1, 0xD1FE, 0x290C,
- 0x8EA2, 0xD2A1, 0xD2FE, 0x296A, 0x8EA2, 0xD3A1, 0xD3FE, 0x29C8,
- 0x8EA2, 0xD4A1, 0xD4FE, 0x2A26, 0x8EA2, 0xD5A1, 0xD5FE, 0x2A84,
- 0x8EA2, 0xD6A1, 0xD6FE, 0x2AE2, 0x8EA2, 0xD7A1, 0xD7FE, 0x2B40,
- 0x8EA2, 0xD8A1, 0xD8FE, 0x2B9E, 0x8EA2, 0xD9A1, 0xD9FE, 0x2BFC,
- 0x8EA2, 0xDAA1, 0xDAFE, 0x2C5A, 0x8EA2, 0xDBA1, 0xDBFE, 0x2CB8,
- 0x8EA2, 0xDCA1, 0xDCFE, 0x2D16, 0x8EA2, 0xDDA1, 0xDDFE, 0x2D74,
- 0x8EA2, 0xDEA1, 0xDEFE, 0x2DD2, 0x8EA2, 0xDFA1, 0xDFFE, 0x2E30,
- 0x8EA2, 0xE0A1, 0xE0FE, 0x2E8E, 0x8EA2, 0xE1A1, 0xE1FE, 0x2EEC,
- 0x8EA2, 0xE2A1, 0xE2FE, 0x2F4A, 0x8EA2, 0xE3A1, 0xE3FE, 0x2FA8,
- 0x8EA2, 0xE4A1, 0xE4FE, 0x3006, 0x8EA2, 0xE5A1, 0xE5FE, 0x3064,
- 0x8EA2, 0xE6A1, 0xE6FE, 0x30C2, 0x8EA2, 0xE7A1, 0xE7FE, 0x3120,
- 0x8EA2, 0xE8A1, 0xE8FE, 0x317E, 0x8EA2, 0xE9A1, 0xE9FE, 0x31DC,
- 0x8EA2, 0xEAA1, 0xEAFE, 0x323A, 0x8EA2, 0xEBA1, 0xEBFE, 0x3298,
- 0x8EA2, 0xECA1, 0xECFE, 0x32F6, 0x8EA2, 0xEDA1, 0xEDFE, 0x3354,
- 0x8EA2, 0xEEA1, 0xEEFE, 0x33B2, 0x8EA2, 0xEFA1, 0xEFFE, 0x3410,
- 0x8EA2, 0xF0A1, 0xF0FE, 0x346E, 0x8EA2, 0xF1A1, 0xF1FE, 0x34CC,
- 0x8EA2, 0xF2A1, 0xF2C4, 0x352A,
-};
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_CNS_EUC_V_0[180 * 3] = {
+ 0x0020, 0x007E, 0x3550, 0xA1A1, 0xA1AB, 0x0063, 0xA1AC, 0xA1AC, 0x354E,
+ 0xA1AD, 0xA1BA, 0x006F, 0xA1BB, 0xA1BB, 0x007C, 0xA1BC, 0xA1BC, 0x007E,
+ 0xA1BD, 0xA1BD, 0x007E, 0xA1BE, 0xA1BF, 0x0082, 0xA1C0, 0xA1C1, 0x0082,
+ 0xA1C2, 0xA1C3, 0x0086, 0xA1C4, 0xA1C5, 0x0086, 0xA1C6, 0xA1C7, 0x008A,
+ 0xA1C8, 0xA1C9, 0x008A, 0xA1CA, 0xA1CB, 0x008E, 0xA1CC, 0xA1CD, 0x008E,
+ 0xA1CE, 0xA1CF, 0x0092, 0xA1D0, 0xA1D1, 0x0092, 0xA1D2, 0xA1D3, 0x0096,
+ 0xA1D4, 0xA1D5, 0x0096, 0xA1D6, 0xA1D7, 0x009A, 0xA1D8, 0xA1D9, 0x009A,
+ 0xA1DA, 0xA1DB, 0x009E, 0xA1DC, 0xA1FE, 0x009E, 0xA2A1, 0xA2C3, 0x00C1,
+ 0xA2C4, 0xA2C4, 0x354F, 0xA2C5, 0xA2FE, 0x00E5, 0xA3A1, 0xA3CE, 0x011F,
+ 0xA4A1, 0xA4FE, 0x014D, 0xA5A1, 0xA5EC, 0x01AB, 0xA5EE, 0xA5F0, 0x01F7,
+ 0xA6A1, 0xA6BE, 0x01FA, 0xA7A1, 0xA7A1, 0x0253, 0xA7A2, 0xA7A4, 0x0218,
+ 0xA7A5, 0xA7A5, 0x0254, 0xA7A6, 0xA7A6, 0x021B, 0xA7A7, 0xA7A7, 0x025A,
+ 0xA7A8, 0xA7A8, 0x021C, 0xA7A9, 0xA7AC, 0x025B, 0xA7AD, 0xA7AF, 0x021D,
+ 0xA7B0, 0xA7B0, 0x025F, 0xA7B1, 0xA7B1, 0x176E, 0xA7B2, 0xA7B2, 0x0260,
+ 0xA7B3, 0xA7B3, 0x0262, 0xA7B4, 0xA7B4, 0x0220, 0xA7B5, 0xA7B5, 0x0263,
+ 0xA7B6, 0xA7B6, 0x176F, 0xA7B7, 0xA7B7, 0x0221, 0xA7B8, 0xA7B9, 0x0264,
+ 0xA7BA, 0xA7BA, 0x0222, 0xA7BB, 0xA7BB, 0x1770, 0xA7BC, 0xA7BC, 0x0223,
+ 0xA7BD, 0xA7BD, 0x0266, 0xA7BE, 0xA7BE, 0x0279, 0xA7BF, 0xA7BF, 0x1775,
+ 0xA7C0, 0xA7C1, 0x027A, 0xA7C2, 0xA7C2, 0x0224, 0xA7C3, 0xA7C6, 0x027C,
+ 0xA7C7, 0xA7C7, 0x0225, 0xA7C8, 0xA7CB, 0x0282, 0xA7CC, 0xA7CC, 0x1776,
+ 0xA7CD, 0xA7CD, 0x0286, 0xA7CE, 0xA7CE, 0x0226, 0xA7CF, 0xA7D0, 0x0288,
+ 0xA7D1, 0xA7D2, 0x028C, 0xA7D3, 0xA7D5, 0x0227, 0xA7D6, 0xA7D8, 0x028E,
+ 0xA7D9, 0xA7DA, 0x022A, 0xA7DB, 0xA7DB, 0x1777, 0xA7DC, 0xA7DF, 0x02D0,
+ 0xA7E0, 0xA7E0, 0x02D5, 0xA7E1, 0xA7E1, 0x022C, 0xA7E2, 0xA7E5, 0x02D6,
+ 0xA7E6, 0xA7E6, 0x022D, 0xA7E7, 0xA7ED, 0x02DA, 0xA7EE, 0xA7EE, 0x178A,
+ 0xA7EF, 0xA7F2, 0x02E1, 0xA7F3, 0xA7F3, 0x178C, 0xA7F4, 0xA7F8, 0x02E5,
+ 0xA7F9, 0xA7F9, 0x178D, 0xA7FA, 0xA7FD, 0x02EA, 0xA7FE, 0xA7FE, 0x0356,
+ 0xA8A1, 0xA8A6, 0x0357, 0xA8A7, 0xA8A7, 0x035E, 0xA8A8, 0xA8A8, 0x0362,
+ 0xA8A9, 0xA8AA, 0x022E, 0xA8AB, 0xA8B2, 0x0363, 0xA8B3, 0xA8B3, 0x17B2,
+ 0xA8B4, 0xA8B6, 0x036B, 0xA8B7, 0xA8BA, 0x03F6, 0xA8BB, 0xA8BB, 0x1812,
+ 0xA8BC, 0xA8BE, 0x03FA, 0xA8BF, 0xA8C3, 0x03FE, 0xA8C4, 0xA8CC, 0x0405,
+ 0xA8CD, 0xA8CD, 0x1813, 0xA8CE, 0xA8CE, 0x1818, 0xA8CF, 0xA8D2, 0x040F,
+ 0xA8D3, 0xA8D3, 0x1819, 0xA8D4, 0xA8D9, 0x0508, 0xA8DA, 0xA8DA, 0x18E7,
+ 0xA8DB, 0xA8E2, 0x050E, 0xA8E3, 0xA8E3, 0x0230, 0xA8E4, 0xA8E4, 0x051B,
+ 0xA8E5, 0xA8E7, 0x0520, 0xA8E8, 0xA8EB, 0x0696, 0xA8EC, 0xA8EC, 0x0231,
+ 0xA8ED, 0xA8F0, 0x069F, 0xA8F1, 0xA8FB, 0x0826, 0xA8FC, 0xA8FE, 0x09F5,
+ 0xA9A1, 0xA9A1, 0x1E33, 0xA9A2, 0xA9A2, 0x09F8, 0xA9A3, 0xA9A3, 0x1E34,
+ 0xA9A4, 0xA9A5, 0x09F9, 0xA9A6, 0xA9AB, 0x0BE1, 0xA9AC, 0xA9AE, 0x0DBB,
+ 0xA9AF, 0xA9AF, 0x2360, 0xA9B0, 0xA9B0, 0x2612, 0xA9B1, 0xA9B3, 0x0F7B,
+ 0xA9B4, 0xA9B5, 0x1100, 0xA9B6, 0xA9B6, 0x1289, 0xA9B7, 0xA9B8, 0x13B2,
+ 0xA9B9, 0xA9B9, 0x2F0D, 0xC2A1, 0xC2C1, 0x0232, 0xC4A1, 0xC4FE, 0x0253,
+ 0xC5A1, 0xC5FE, 0x02B1, 0xC6A1, 0xC6FE, 0x030F, 0xC7A1, 0xC7FE, 0x036D,
+ 0xC8A1, 0xC8FE, 0x03CB, 0xC9A1, 0xC9FE, 0x0429, 0xCAA1, 0xCAFE, 0x0487,
+ 0xCBA1, 0xCBFE, 0x04E5, 0xCCA1, 0xCCFE, 0x0543, 0xCDA1, 0xCDFE, 0x05A1,
+ 0xCEA1, 0xCEFE, 0x05FF, 0xCFA1, 0xCFFE, 0x065D, 0xD0A1, 0xD0FE, 0x06BB,
+ 0xD1A1, 0xD1FE, 0x0719, 0xD2A1, 0xD2FE, 0x0777, 0xD3A1, 0xD3FE, 0x07D5,
+ 0xD4A1, 0xD4FE, 0x0833, 0xD5A1, 0xD5FE, 0x0891, 0xD6A1, 0xD6FE, 0x08EF,
+ 0xD7A1, 0xD7FE, 0x094D, 0xD8A1, 0xD8FE, 0x09AB, 0xD9A1, 0xD9FE, 0x0A09,
+ 0xDAA1, 0xDAFE, 0x0A67, 0xDBA1, 0xDBFE, 0x0AC5, 0xDCA1, 0xDCFE, 0x0B23,
+ 0xDDA1, 0xDDFE, 0x0B81, 0xDEA1, 0xDEFE, 0x0BDF, 0xDFA1, 0xDFFE, 0x0C3D,
+ 0xE0A1, 0xE0FE, 0x0C9B, 0xE1A1, 0xE1FE, 0x0CF9, 0xE2A1, 0xE2FE, 0x0D57,
+ 0xE3A1, 0xE3FE, 0x0DB5, 0xE4A1, 0xE4FE, 0x0E13, 0xE5A1, 0xE5FE, 0x0E71,
+ 0xE6A1, 0xE6FE, 0x0ECF, 0xE7A1, 0xE7FE, 0x0F2D, 0xE8A1, 0xE8FE, 0x0F8B,
+ 0xE9A1, 0xE9FE, 0x0FE9, 0xEAA1, 0xEAFE, 0x1047, 0xEBA1, 0xEBFE, 0x10A5,
+ 0xECA1, 0xECFE, 0x1103, 0xEDA1, 0xEDFE, 0x1161, 0xEEA1, 0xEEFE, 0x11BF,
+ 0xEFA1, 0xEFFE, 0x121D, 0xF0A1, 0xF0FE, 0x127B, 0xF1A1, 0xF1FE, 0x12D9,
+ 0xF2A1, 0xF2FE, 0x1337, 0xF3A1, 0xF3FE, 0x1395, 0xF4A1, 0xF4FE, 0x13F3,
+ 0xF5A1, 0xF5FE, 0x1451, 0xF6A1, 0xF6FE, 0x14AF, 0xF7A1, 0xF7FE, 0x150D,
+ 0xF8A1, 0xF8FE, 0x156B, 0xF9A1, 0xF9FE, 0x15C9, 0xFAA1, 0xFAFE, 0x1627,
+ 0xFBA1, 0xFBFE, 0x1685, 0xFCA1, 0xFCFE, 0x16E3, 0xFDA1, 0xFDCB, 0x1741,
+};
+extern const unsigned short g_FXCMAP_CNS_EUC_V_0_DWord[261 * 4] = {
+ 0x8EA1, 0xA1A1, 0xA1AB, 0x0063, 0x8EA1, 0xA1AC, 0xA1AC, 0x354E,
+ 0x8EA1, 0xA1AD, 0xA1BA, 0x006F, 0x8EA1, 0xA1BB, 0xA1BB, 0x007C,
+ 0x8EA1, 0xA1BC, 0xA1BC, 0x007E, 0x8EA1, 0xA1BD, 0xA1BD, 0x007E,
+ 0x8EA1, 0xA1BE, 0xA1BF, 0x0082, 0x8EA1, 0xA1C0, 0xA1C1, 0x0082,
+ 0x8EA1, 0xA1C2, 0xA1C3, 0x0086, 0x8EA1, 0xA1C4, 0xA1C5, 0x0086,
+ 0x8EA1, 0xA1C6, 0xA1C7, 0x008A, 0x8EA1, 0xA1C8, 0xA1C9, 0x008A,
+ 0x8EA1, 0xA1CA, 0xA1CB, 0x008E, 0x8EA1, 0xA1CC, 0xA1CD, 0x008E,
+ 0x8EA1, 0xA1CE, 0xA1CF, 0x0092, 0x8EA1, 0xA1D0, 0xA1D1, 0x0092,
+ 0x8EA1, 0xA1D2, 0xA1D3, 0x0096, 0x8EA1, 0xA1D4, 0xA1D5, 0x0096,
+ 0x8EA1, 0xA1D6, 0xA1D7, 0x009A, 0x8EA1, 0xA1D8, 0xA1D9, 0x009A,
+ 0x8EA1, 0xA1DA, 0xA1DB, 0x009E, 0x8EA1, 0xA1DC, 0xA1FE, 0x009E,
+ 0x8EA1, 0xA2A1, 0xA2C3, 0x00C1, 0x8EA1, 0xA2C4, 0xA2C4, 0x354F,
+ 0x8EA1, 0xA2C5, 0xA2FE, 0x00E5, 0x8EA1, 0xA3A1, 0xA3CE, 0x011F,
+ 0x8EA1, 0xA4A1, 0xA4FE, 0x014D, 0x8EA1, 0xA5A1, 0xA5EC, 0x01AB,
+ 0x8EA1, 0xA5EE, 0xA5F0, 0x01F7, 0x8EA1, 0xA6A1, 0xA6BE, 0x01FA,
+ 0x8EA1, 0xA7A1, 0xA7A1, 0x0253, 0x8EA1, 0xA7A2, 0xA7A4, 0x0218,
+ 0x8EA1, 0xA7A5, 0xA7A5, 0x0254, 0x8EA1, 0xA7A6, 0xA7A6, 0x021B,
+ 0x8EA1, 0xA7A7, 0xA7A7, 0x025A, 0x8EA1, 0xA7A8, 0xA7A8, 0x021C,
+ 0x8EA1, 0xA7A9, 0xA7AC, 0x025B, 0x8EA1, 0xA7AD, 0xA7AF, 0x021D,
+ 0x8EA1, 0xA7B0, 0xA7B0, 0x025F, 0x8EA1, 0xA7B1, 0xA7B1, 0x176E,
+ 0x8EA1, 0xA7B2, 0xA7B2, 0x0260, 0x8EA1, 0xA7B3, 0xA7B3, 0x0262,
+ 0x8EA1, 0xA7B4, 0xA7B4, 0x0220, 0x8EA1, 0xA7B5, 0xA7B5, 0x0263,
+ 0x8EA1, 0xA7B6, 0xA7B6, 0x176F, 0x8EA1, 0xA7B7, 0xA7B7, 0x0221,
+ 0x8EA1, 0xA7B8, 0xA7B9, 0x0264, 0x8EA1, 0xA7BA, 0xA7BA, 0x0222,
+ 0x8EA1, 0xA7BB, 0xA7BB, 0x1770, 0x8EA1, 0xA7BC, 0xA7BC, 0x0223,
+ 0x8EA1, 0xA7BD, 0xA7BD, 0x0266, 0x8EA1, 0xA7BE, 0xA7BE, 0x0279,
+ 0x8EA1, 0xA7BF, 0xA7BF, 0x1775, 0x8EA1, 0xA7C0, 0xA7C1, 0x027A,
+ 0x8EA1, 0xA7C2, 0xA7C2, 0x0224, 0x8EA1, 0xA7C3, 0xA7C6, 0x027C,
+ 0x8EA1, 0xA7C7, 0xA7C7, 0x0225, 0x8EA1, 0xA7C8, 0xA7CB, 0x0282,
+ 0x8EA1, 0xA7CC, 0xA7CC, 0x1776, 0x8EA1, 0xA7CD, 0xA7CD, 0x0286,
+ 0x8EA1, 0xA7CE, 0xA7CE, 0x0226, 0x8EA1, 0xA7CF, 0xA7D0, 0x0288,
+ 0x8EA1, 0xA7D1, 0xA7D2, 0x028C, 0x8EA1, 0xA7D3, 0xA7D5, 0x0227,
+ 0x8EA1, 0xA7D6, 0xA7D8, 0x028E, 0x8EA1, 0xA7D9, 0xA7DA, 0x022A,
+ 0x8EA1, 0xA7DB, 0xA7DB, 0x1777, 0x8EA1, 0xA7DC, 0xA7DF, 0x02D0,
+ 0x8EA1, 0xA7E0, 0xA7E0, 0x02D5, 0x8EA1, 0xA7E1, 0xA7E1, 0x022C,
+ 0x8EA1, 0xA7E2, 0xA7E5, 0x02D6, 0x8EA1, 0xA7E6, 0xA7E6, 0x022D,
+ 0x8EA1, 0xA7E7, 0xA7ED, 0x02DA, 0x8EA1, 0xA7EE, 0xA7EE, 0x178A,
+ 0x8EA1, 0xA7EF, 0xA7F2, 0x02E1, 0x8EA1, 0xA7F3, 0xA7F3, 0x178C,
+ 0x8EA1, 0xA7F4, 0xA7F8, 0x02E5, 0x8EA1, 0xA7F9, 0xA7F9, 0x178D,
+ 0x8EA1, 0xA7FA, 0xA7FD, 0x02EA, 0x8EA1, 0xA7FE, 0xA7FE, 0x0356,
+ 0x8EA1, 0xA8A1, 0xA8A6, 0x0357, 0x8EA1, 0xA8A7, 0xA8A7, 0x035E,
+ 0x8EA1, 0xA8A8, 0xA8A8, 0x0362, 0x8EA1, 0xA8A9, 0xA8AA, 0x022E,
+ 0x8EA1, 0xA8AB, 0xA8B2, 0x0363, 0x8EA1, 0xA8B3, 0xA8B3, 0x17B2,
+ 0x8EA1, 0xA8B4, 0xA8B6, 0x036B, 0x8EA1, 0xA8B7, 0xA8BA, 0x03F6,
+ 0x8EA1, 0xA8BB, 0xA8BB, 0x1812, 0x8EA1, 0xA8BC, 0xA8BE, 0x03FA,
+ 0x8EA1, 0xA8BF, 0xA8C3, 0x03FE, 0x8EA1, 0xA8C4, 0xA8CC, 0x0405,
+ 0x8EA1, 0xA8CD, 0xA8CD, 0x1813, 0x8EA1, 0xA8CE, 0xA8CE, 0x1818,
+ 0x8EA1, 0xA8CF, 0xA8D2, 0x040F, 0x8EA1, 0xA8D3, 0xA8D3, 0x1819,
+ 0x8EA1, 0xA8D4, 0xA8D9, 0x0508, 0x8EA1, 0xA8DA, 0xA8DA, 0x18E7,
+ 0x8EA1, 0xA8DB, 0xA8E2, 0x050E, 0x8EA1, 0xA8E3, 0xA8E3, 0x0230,
+ 0x8EA1, 0xA8E4, 0xA8E4, 0x051B, 0x8EA1, 0xA8E5, 0xA8E7, 0x0520,
+ 0x8EA1, 0xA8E8, 0xA8EB, 0x0696, 0x8EA1, 0xA8EC, 0xA8EC, 0x0231,
+ 0x8EA1, 0xA8ED, 0xA8F0, 0x069F, 0x8EA1, 0xA8F1, 0xA8FB, 0x0826,
+ 0x8EA1, 0xA8FC, 0xA8FE, 0x09F5, 0x8EA1, 0xA9A1, 0xA9A1, 0x1E33,
+ 0x8EA1, 0xA9A2, 0xA9A2, 0x09F8, 0x8EA1, 0xA9A3, 0xA9A3, 0x1E34,
+ 0x8EA1, 0xA9A4, 0xA9A5, 0x09F9, 0x8EA1, 0xA9A6, 0xA9AB, 0x0BE1,
+ 0x8EA1, 0xA9AC, 0xA9AE, 0x0DBB, 0x8EA1, 0xA9AF, 0xA9AF, 0x2360,
+ 0x8EA1, 0xA9B0, 0xA9B0, 0x2612, 0x8EA1, 0xA9B1, 0xA9B3, 0x0F7B,
+ 0x8EA1, 0xA9B4, 0xA9B5, 0x1100, 0x8EA1, 0xA9B6, 0xA9B6, 0x1289,
+ 0x8EA1, 0xA9B7, 0xA9B8, 0x13B2, 0x8EA1, 0xA9B9, 0xA9B9, 0x2F0D,
+ 0x8EA1, 0xC2A1, 0xC2C1, 0x0232, 0x8EA1, 0xC4A1, 0xC4FE, 0x0253,
+ 0x8EA1, 0xC5A1, 0xC5FE, 0x02B1, 0x8EA1, 0xC6A1, 0xC6FE, 0x030F,
+ 0x8EA1, 0xC7A1, 0xC7FE, 0x036D, 0x8EA1, 0xC8A1, 0xC8FE, 0x03CB,
+ 0x8EA1, 0xC9A1, 0xC9FE, 0x0429, 0x8EA1, 0xCAA1, 0xCAFE, 0x0487,
+ 0x8EA1, 0xCBA1, 0xCBFE, 0x04E5, 0x8EA1, 0xCCA1, 0xCCFE, 0x0543,
+ 0x8EA1, 0xCDA1, 0xCDFE, 0x05A1, 0x8EA1, 0xCEA1, 0xCEFE, 0x05FF,
+ 0x8EA1, 0xCFA1, 0xCFFE, 0x065D, 0x8EA1, 0xD0A1, 0xD0FE, 0x06BB,
+ 0x8EA1, 0xD1A1, 0xD1FE, 0x0719, 0x8EA1, 0xD2A1, 0xD2FE, 0x0777,
+ 0x8EA1, 0xD3A1, 0xD3FE, 0x07D5, 0x8EA1, 0xD4A1, 0xD4FE, 0x0833,
+ 0x8EA1, 0xD5A1, 0xD5FE, 0x0891, 0x8EA1, 0xD6A1, 0xD6FE, 0x08EF,
+ 0x8EA1, 0xD7A1, 0xD7FE, 0x094D, 0x8EA1, 0xD8A1, 0xD8FE, 0x09AB,
+ 0x8EA1, 0xD9A1, 0xD9FE, 0x0A09, 0x8EA1, 0xDAA1, 0xDAFE, 0x0A67,
+ 0x8EA1, 0xDBA1, 0xDBFE, 0x0AC5, 0x8EA1, 0xDCA1, 0xDCFE, 0x0B23,
+ 0x8EA1, 0xDDA1, 0xDDFE, 0x0B81, 0x8EA1, 0xDEA1, 0xDEFE, 0x0BDF,
+ 0x8EA1, 0xDFA1, 0xDFFE, 0x0C3D, 0x8EA1, 0xE0A1, 0xE0FE, 0x0C9B,
+ 0x8EA1, 0xE1A1, 0xE1FE, 0x0CF9, 0x8EA1, 0xE2A1, 0xE2FE, 0x0D57,
+ 0x8EA1, 0xE3A1, 0xE3FE, 0x0DB5, 0x8EA1, 0xE4A1, 0xE4FE, 0x0E13,
+ 0x8EA1, 0xE5A1, 0xE5FE, 0x0E71, 0x8EA1, 0xE6A1, 0xE6FE, 0x0ECF,
+ 0x8EA1, 0xE7A1, 0xE7FE, 0x0F2D, 0x8EA1, 0xE8A1, 0xE8FE, 0x0F8B,
+ 0x8EA1, 0xE9A1, 0xE9FE, 0x0FE9, 0x8EA1, 0xEAA1, 0xEAFE, 0x1047,
+ 0x8EA1, 0xEBA1, 0xEBFE, 0x10A5, 0x8EA1, 0xECA1, 0xECFE, 0x1103,
+ 0x8EA1, 0xEDA1, 0xEDFE, 0x1161, 0x8EA1, 0xEEA1, 0xEEFE, 0x11BF,
+ 0x8EA1, 0xEFA1, 0xEFFE, 0x121D, 0x8EA1, 0xF0A1, 0xF0FE, 0x127B,
+ 0x8EA1, 0xF1A1, 0xF1FE, 0x12D9, 0x8EA1, 0xF2A1, 0xF2FE, 0x1337,
+ 0x8EA1, 0xF3A1, 0xF3FE, 0x1395, 0x8EA1, 0xF4A1, 0xF4FE, 0x13F3,
+ 0x8EA1, 0xF5A1, 0xF5FE, 0x1451, 0x8EA1, 0xF6A1, 0xF6FE, 0x14AF,
+ 0x8EA1, 0xF7A1, 0xF7FE, 0x150D, 0x8EA1, 0xF8A1, 0xF8FE, 0x156B,
+ 0x8EA1, 0xF9A1, 0xF9FE, 0x15C9, 0x8EA1, 0xFAA1, 0xFAFE, 0x1627,
+ 0x8EA1, 0xFBA1, 0xFBFE, 0x1685, 0x8EA1, 0xFCA1, 0xFCFE, 0x16E3,
+ 0x8EA1, 0xFDA1, 0xFDCB, 0x1741, 0x8EA2, 0xA1A1, 0xA1FE, 0x176C,
+ 0x8EA2, 0xA2A1, 0xA2FE, 0x17CA, 0x8EA2, 0xA3A1, 0xA3FE, 0x1828,
+ 0x8EA2, 0xA4A1, 0xA4FE, 0x1886, 0x8EA2, 0xA5A1, 0xA5FE, 0x18E4,
+ 0x8EA2, 0xA6A1, 0xA6FE, 0x1942, 0x8EA2, 0xA7A1, 0xA7FE, 0x19A0,
+ 0x8EA2, 0xA8A1, 0xA8FE, 0x19FE, 0x8EA2, 0xA9A1, 0xA9FE, 0x1A5C,
+ 0x8EA2, 0xAAA1, 0xAAFE, 0x1ABA, 0x8EA2, 0xABA1, 0xABFE, 0x1B18,
+ 0x8EA2, 0xACA1, 0xACFE, 0x1B76, 0x8EA2, 0xADA1, 0xADFE, 0x1BD4,
+ 0x8EA2, 0xAEA1, 0xAEFE, 0x1C32, 0x8EA2, 0xAFA1, 0xAFFE, 0x1C90,
+ 0x8EA2, 0xB0A1, 0xB0FE, 0x1CEE, 0x8EA2, 0xB1A1, 0xB1FE, 0x1D4C,
+ 0x8EA2, 0xB2A1, 0xB2FE, 0x1DAA, 0x8EA2, 0xB3A1, 0xB3FE, 0x1E08,
+ 0x8EA2, 0xB4A1, 0xB4FE, 0x1E66, 0x8EA2, 0xB5A1, 0xB5FE, 0x1EC4,
+ 0x8EA2, 0xB6A1, 0xB6FE, 0x1F22, 0x8EA2, 0xB7A1, 0xB7FE, 0x1F80,
+ 0x8EA2, 0xB8A1, 0xB8FE, 0x1FDE, 0x8EA2, 0xB9A1, 0xB9FE, 0x203C,
+ 0x8EA2, 0xBAA1, 0xBAFE, 0x209A, 0x8EA2, 0xBBA1, 0xBBFE, 0x20F8,
+ 0x8EA2, 0xBCA1, 0xBCFE, 0x2156, 0x8EA2, 0xBDA1, 0xBDFE, 0x21B4,
+ 0x8EA2, 0xBEA1, 0xBEFE, 0x2212, 0x8EA2, 0xBFA1, 0xBFFE, 0x2270,
+ 0x8EA2, 0xC0A1, 0xC0FE, 0x22CE, 0x8EA2, 0xC1A1, 0xC1FE, 0x232C,
+ 0x8EA2, 0xC2A1, 0xC2FE, 0x238A, 0x8EA2, 0xC3A1, 0xC3FE, 0x23E8,
+ 0x8EA2, 0xC4A1, 0xC4FE, 0x2446, 0x8EA2, 0xC5A1, 0xC5FE, 0x24A4,
+ 0x8EA2, 0xC6A1, 0xC6FE, 0x2502, 0x8EA2, 0xC7A1, 0xC7FE, 0x2560,
+ 0x8EA2, 0xC8A1, 0xC8FE, 0x25BE, 0x8EA2, 0xC9A1, 0xC9FE, 0x261C,
+ 0x8EA2, 0xCAA1, 0xCAFE, 0x267A, 0x8EA2, 0xCBA1, 0xCBFE, 0x26D8,
+ 0x8EA2, 0xCCA1, 0xCCFE, 0x2736, 0x8EA2, 0xCDA1, 0xCDFE, 0x2794,
+ 0x8EA2, 0xCEA1, 0xCEFE, 0x27F2, 0x8EA2, 0xCFA1, 0xCFFE, 0x2850,
+ 0x8EA2, 0xD0A1, 0xD0FE, 0x28AE, 0x8EA2, 0xD1A1, 0xD1FE, 0x290C,
+ 0x8EA2, 0xD2A1, 0xD2FE, 0x296A, 0x8EA2, 0xD3A1, 0xD3FE, 0x29C8,
+ 0x8EA2, 0xD4A1, 0xD4FE, 0x2A26, 0x8EA2, 0xD5A1, 0xD5FE, 0x2A84,
+ 0x8EA2, 0xD6A1, 0xD6FE, 0x2AE2, 0x8EA2, 0xD7A1, 0xD7FE, 0x2B40,
+ 0x8EA2, 0xD8A1, 0xD8FE, 0x2B9E, 0x8EA2, 0xD9A1, 0xD9FE, 0x2BFC,
+ 0x8EA2, 0xDAA1, 0xDAFE, 0x2C5A, 0x8EA2, 0xDBA1, 0xDBFE, 0x2CB8,
+ 0x8EA2, 0xDCA1, 0xDCFE, 0x2D16, 0x8EA2, 0xDDA1, 0xDDFE, 0x2D74,
+ 0x8EA2, 0xDEA1, 0xDEFE, 0x2DD2, 0x8EA2, 0xDFA1, 0xDFFE, 0x2E30,
+ 0x8EA2, 0xE0A1, 0xE0FE, 0x2E8E, 0x8EA2, 0xE1A1, 0xE1FE, 0x2EEC,
+ 0x8EA2, 0xE2A1, 0xE2FE, 0x2F4A, 0x8EA2, 0xE3A1, 0xE3FE, 0x2FA8,
+ 0x8EA2, 0xE4A1, 0xE4FE, 0x3006, 0x8EA2, 0xE5A1, 0xE5FE, 0x3064,
+ 0x8EA2, 0xE6A1, 0xE6FE, 0x30C2, 0x8EA2, 0xE7A1, 0xE7FE, 0x3120,
+ 0x8EA2, 0xE8A1, 0xE8FE, 0x317E, 0x8EA2, 0xE9A1, 0xE9FE, 0x31DC,
+ 0x8EA2, 0xEAA1, 0xEAFE, 0x323A, 0x8EA2, 0xEBA1, 0xEBFE, 0x3298,
+ 0x8EA2, 0xECA1, 0xECFE, 0x32F6, 0x8EA2, 0xEDA1, 0xEDFE, 0x3354,
+ 0x8EA2, 0xEEA1, 0xEEFE, 0x33B2, 0x8EA2, 0xEFA1, 0xEFFE, 0x3410,
+ 0x8EA2, 0xF0A1, 0xF0FE, 0x346E, 0x8EA2, 0xF1A1, 0xF1FE, 0x34CC,
+ 0x8EA2, 0xF2A1, 0xF2C4, 0x352A,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/CNS1/ETen-B5-H_0.cpp b/core/src/fpdfapi/fpdf_cmaps/CNS1/ETen-B5-H_0.cpp
index f1c9483239..2e09a50afa 100644
--- a/core/src/fpdfapi/fpdf_cmaps/CNS1/ETen-B5-H_0.cpp
+++ b/core/src/fpdfapi/fpdf_cmaps/CNS1/ETen-B5-H_0.cpp
@@ -1,93 +1,93 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-extern const unsigned short g_FXCMAP_ETen_B5_H_0[254 * 3] = {
- 0x0020, 0x007E, 0x3550, 0xA140, 0xA158, 0x0063, 0xA159, 0xA15C, 0x35AF,
- 0xA15D, 0xA17E, 0x0080, 0xA1A1, 0xA1F5, 0x00A2, 0xA1F6, 0xA1F6, 0x00F8,
- 0xA1F7, 0xA1F7, 0x00F7, 0xA1F8, 0xA1FE, 0x00F9, 0xA240, 0xA27E, 0x0100,
- 0xA2A1, 0xA2FE, 0x013F, 0xA340, 0xA37E, 0x019D, 0xA3A1, 0xA3BB, 0x01DC,
- 0xA3BD, 0xA3BF, 0x01F7, 0xA440, 0xA47E, 0x0253, 0xA4A1, 0xA4FE, 0x0292,
- 0xA540, 0xA57E, 0x02F0, 0xA5A1, 0xA5FE, 0x032F, 0xA640, 0xA67E, 0x038D,
- 0xA6A1, 0xA6FE, 0x03CC, 0xA740, 0xA77E, 0x042A, 0xA7A1, 0xA7FE, 0x0469,
- 0xA840, 0xA87E, 0x04C7, 0xA8A1, 0xA8FE, 0x0506, 0xA940, 0xA97E, 0x0564,
- 0xA9A1, 0xA9FE, 0x05A3, 0xAA40, 0xAA7E, 0x0601, 0xAAA1, 0xAAFE, 0x0640,
- 0xAB40, 0xAB7E, 0x069E, 0xABA1, 0xABFE, 0x06DD, 0xAC40, 0xAC7E, 0x073B,
- 0xACA1, 0xACFD, 0x077A, 0xACFE, 0xACFE, 0x097F, 0xAD40, 0xAD7E, 0x07D7,
- 0xADA1, 0xADFE, 0x0816, 0xAE40, 0xAE7E, 0x0874, 0xAEA1, 0xAEFE, 0x08B3,
- 0xAF40, 0xAF7E, 0x0911, 0xAFA1, 0xAFCF, 0x0950, 0xAFD0, 0xAFFE, 0x0980,
- 0xB040, 0xB07E, 0x09AF, 0xB0A1, 0xB0FE, 0x09EE, 0xB140, 0xB17E, 0x0A4C,
- 0xB1A1, 0xB1FE, 0x0A8B, 0xB240, 0xB27E, 0x0AE9, 0xB2A1, 0xB2FE, 0x0B28,
- 0xB340, 0xB37E, 0x0B86, 0xB3A1, 0xB3FE, 0x0BC5, 0xB440, 0xB47E, 0x0C23,
- 0xB4A1, 0xB4FE, 0x0C62, 0xB540, 0xB57E, 0x0CC0, 0xB5A1, 0xB5FE, 0x0CFF,
- 0xB640, 0xB67E, 0x0D5D, 0xB6A1, 0xB6FE, 0x0D9C, 0xB740, 0xB77E, 0x0DFA,
- 0xB7A1, 0xB7FE, 0x0E39, 0xB840, 0xB87E, 0x0E97, 0xB8A1, 0xB8FE, 0x0ED6,
- 0xB940, 0xB97E, 0x0F34, 0xB9A1, 0xB9FE, 0x0F73, 0xBA40, 0xBA7E, 0x0FD1,
- 0xBAA1, 0xBAFE, 0x1010, 0xBB40, 0xBB7E, 0x106E, 0xBBA1, 0xBBC7, 0x10AD,
- 0xBBC8, 0xBBFE, 0x10D5, 0xBC40, 0xBC7E, 0x110C, 0xBCA1, 0xBCFE, 0x114B,
- 0xBD40, 0xBD7E, 0x11A9, 0xBDA1, 0xBDFE, 0x11E8, 0xBE40, 0xBE51, 0x1246,
- 0xBE52, 0xBE52, 0x10D4, 0xBE53, 0xBE7E, 0x1258, 0xBEA1, 0xBEFE, 0x1284,
- 0xBF40, 0xBF7E, 0x12E2, 0xBFA1, 0xBFFE, 0x1321, 0xC040, 0xC07E, 0x137F,
- 0xC0A1, 0xC0FE, 0x13BE, 0xC140, 0xC17E, 0x141C, 0xC1A1, 0xC1AA, 0x145B,
- 0xC1AB, 0xC1FE, 0x1466, 0xC240, 0xC27E, 0x14BA, 0xC2A1, 0xC2CA, 0x14F9,
- 0xC2CB, 0xC2CB, 0x1465, 0xC2CC, 0xC2FE, 0x1523, 0xC340, 0xC360, 0x1556,
- 0xC361, 0xC37E, 0x1578, 0xC3A1, 0xC3B8, 0x1596, 0xC3B9, 0xC3B9, 0x15AF,
- 0xC3BA, 0xC3BA, 0x15AE, 0xC3BB, 0xC3FE, 0x15B0, 0xC440, 0xC455, 0x15F4,
- 0xC456, 0xC456, 0x1577, 0xC457, 0xC47E, 0x160A, 0xC4A1, 0xC4FE, 0x1632,
- 0xC540, 0xC57E, 0x1690, 0xC5A1, 0xC5FE, 0x16CF, 0xC640, 0xC67E, 0x172D,
- 0xC6A1, 0xC6BE, 0x01FA, 0xC6BF, 0xC6D7, 0x0219, 0xC6D8, 0xC6DE, 0x35B3,
- 0xC6DF, 0xC6DF, 0x1794, 0xC6E0, 0xC6FE, 0x35BA, 0xC740, 0xC77E, 0x35D9,
- 0xC7A1, 0xC7FE, 0x3618, 0xC840, 0xC87E, 0x3676, 0xC8A1, 0xC8D3, 0x36B5,
- 0xC940, 0xC949, 0x176C, 0xC94A, 0xC94A, 0x0274, 0xC94B, 0xC96B, 0x1776,
- 0xC96C, 0xC97E, 0x1798, 0xC9A1, 0xC9BD, 0x17AB, 0xC9BE, 0xC9BE, 0x1797,
- 0xC9BF, 0xC9EC, 0x17C8, 0xC9ED, 0xC9FE, 0x17F7, 0xCA40, 0xCA7E, 0x1809,
- 0xCAA1, 0xCAF6, 0x1848, 0xCAF7, 0xCAF7, 0x17F6, 0xCAF8, 0xCAFE, 0x189E,
- 0xCB40, 0xCB7E, 0x18A5, 0xCBA1, 0xCBFE, 0x18E4, 0xCC40, 0xCC7E, 0x1942,
- 0xCCA1, 0xCCFE, 0x1981, 0xCD40, 0xCD7E, 0x19DF, 0xCDA1, 0xCDFE, 0x1A1E,
- 0xCE40, 0xCE7E, 0x1A7C, 0xCEA1, 0xCEFE, 0x1ABB, 0xCF40, 0xCF7E, 0x1B19,
- 0xCFA1, 0xCFFE, 0x1B58, 0xD040, 0xD07E, 0x1BB6, 0xD0A1, 0xD0FE, 0x1BF5,
- 0xD140, 0xD17E, 0x1C53, 0xD1A1, 0xD1FE, 0x1C92, 0xD240, 0xD27E, 0x1CF0,
- 0xD2A1, 0xD2FE, 0x1D2F, 0xD340, 0xD37E, 0x1D8D, 0xD3A1, 0xD3FE, 0x1DCC,
- 0xD440, 0xD47E, 0x1E2A, 0xD4A1, 0xD4FE, 0x1E69, 0xD540, 0xD57E, 0x1EC7,
- 0xD5A1, 0xD5FE, 0x1F06, 0xD640, 0xD67E, 0x1F64, 0xD6A1, 0xD6CB, 0x1FA3,
- 0xD6CC, 0xD6CC, 0x2254, 0xD6CD, 0xD6FE, 0x1FCF, 0xD740, 0xD779, 0x2001,
- 0xD77A, 0xD77A, 0x22B9, 0xD77B, 0xD77E, 0x203B, 0xD7A1, 0xD7FE, 0x203F,
- 0xD840, 0xD87E, 0x209D, 0xD8A1, 0xD8FE, 0x20DC, 0xD940, 0xD97E, 0x213A,
- 0xD9A1, 0xD9FE, 0x2179, 0xDA40, 0xDA7E, 0x21D7, 0xDAA1, 0xDADE, 0x2216,
- 0xDADF, 0xDADF, 0x1FCE, 0xDAE0, 0xDAFE, 0x2255, 0xDB40, 0xDB7E, 0x2274,
- 0xDBA1, 0xDBA6, 0x22B3, 0xDBA7, 0xDBFE, 0x22BA, 0xDC40, 0xDC7E, 0x2312,
- 0xDCA1, 0xDCFE, 0x2351, 0xDD40, 0xDD7E, 0x23AF, 0xDDA1, 0xDDFB, 0x23EE,
- 0xDDFC, 0xDDFC, 0x2381, 0xDDFD, 0xDDFE, 0x2449, 0xDE40, 0xDE7E, 0x244B,
- 0xDEA1, 0xDEFE, 0x248A, 0xDF40, 0xDF7E, 0x24E8, 0xDFA1, 0xDFFE, 0x2527,
- 0xE040, 0xE07E, 0x2585, 0xE0A1, 0xE0FE, 0x25C4, 0xE140, 0xE17E, 0x2622,
- 0xE1A1, 0xE1FE, 0x2661, 0xE240, 0xE27E, 0x26BF, 0xE2A1, 0xE2FE, 0x26FE,
- 0xE340, 0xE37E, 0x275C, 0xE3A1, 0xE3FE, 0x279B, 0xE440, 0xE47E, 0x27F9,
- 0xE4A1, 0xE4FE, 0x2838, 0xE540, 0xE57E, 0x2896, 0xE5A1, 0xE5FE, 0x28D5,
- 0xE640, 0xE67E, 0x2933, 0xE6A1, 0xE6FE, 0x2972, 0xE740, 0xE77E, 0x29D0,
- 0xE7A1, 0xE7FE, 0x2A0F, 0xE840, 0xE87E, 0x2A6D, 0xE8A1, 0xE8A2, 0x2AAC,
- 0xE8A3, 0xE8FE, 0x2AAF, 0xE940, 0xE975, 0x2B0B, 0xE976, 0xE97E, 0x2B42,
- 0xE9A1, 0xE9FE, 0x2B4B, 0xEA40, 0xEA7E, 0x2BA9, 0xEAA1, 0xEAFE, 0x2BE8,
- 0xEB40, 0xEB5A, 0x2C46, 0xEB5B, 0xEB7E, 0x2C62, 0xEBA1, 0xEBF0, 0x2C86,
- 0xEBF1, 0xEBF1, 0x2AAE, 0xEBF2, 0xEBFE, 0x2CD6, 0xEC40, 0xEC7E, 0x2CE3,
- 0xECA1, 0xECDD, 0x2D22, 0xECDE, 0xECDE, 0x2B41, 0xECDF, 0xECFE, 0x2D5F,
- 0xED40, 0xED7E, 0x2D7F, 0xEDA1, 0xEDA9, 0x2DBE, 0xEDAA, 0xEDFE, 0x2DC8,
- 0xEE40, 0xEE7E, 0x2E1D, 0xEEA1, 0xEEEA, 0x2E5C, 0xEEEB, 0xEEEB, 0x3014,
- 0xEEEC, 0xEEFE, 0x2EA6, 0xEF40, 0xEF7E, 0x2EB9, 0xEFA1, 0xEFFE, 0x2EF8,
- 0xF040, 0xF055, 0x2F56, 0xF056, 0xF056, 0x2DC7, 0xF057, 0xF07E, 0x2F6C,
- 0xF0A1, 0xF0CA, 0x2F94, 0xF0CB, 0xF0CB, 0x2C61, 0xF0CC, 0xF0FE, 0x2FBE,
- 0xF140, 0xF162, 0x2FF1, 0xF163, 0xF16A, 0x3015, 0xF16B, 0xF16B, 0x3160,
- 0xF16C, 0xF17E, 0x301D, 0xF1A1, 0xF1FE, 0x3030, 0xF240, 0xF267, 0x308E,
- 0xF268, 0xF268, 0x31EF, 0xF269, 0xF27E, 0x30B6, 0xF2A1, 0xF2C2, 0x30CC,
- 0xF2C3, 0xF2FE, 0x30EF, 0xF340, 0xF374, 0x312B, 0xF375, 0xF37E, 0x3161,
- 0xF3A1, 0xF3FE, 0x316B, 0xF440, 0xF465, 0x31C9, 0xF466, 0xF47E, 0x31F0,
- 0xF4A1, 0xF4B4, 0x3209, 0xF4B5, 0xF4B5, 0x30EE, 0xF4B6, 0xF4FC, 0x321D,
- 0xF4FD, 0xF4FE, 0x3265, 0xF540, 0xF57E, 0x3267, 0xF5A1, 0xF5FE, 0x32A6,
- 0xF640, 0xF662, 0x3304, 0xF663, 0xF663, 0x3264, 0xF664, 0xF67E, 0x3327,
- 0xF6A1, 0xF6FE, 0x3342, 0xF740, 0xF77E, 0x33A0, 0xF7A1, 0xF7FE, 0x33DF,
- 0xF840, 0xF87E, 0x343D, 0xF8A1, 0xF8FE, 0x347C, 0xF940, 0xF976, 0x34DA,
- 0xF977, 0xF97E, 0x3512, 0xF9A1, 0xF9C3, 0x351A, 0xF9C4, 0xF9C4, 0x3511,
- 0xF9C5, 0xF9C5, 0x353D, 0xF9C6, 0xF9C6, 0x3549, 0xF9C7, 0xF9D1, 0x353E,
- 0xF9D2, 0xF9D5, 0x354A, 0xF9D6, 0xF9FE, 0x36E8,
-};
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_ETen_B5_H_0[254 * 3] = {
+ 0x0020, 0x007E, 0x3550, 0xA140, 0xA158, 0x0063, 0xA159, 0xA15C, 0x35AF,
+ 0xA15D, 0xA17E, 0x0080, 0xA1A1, 0xA1F5, 0x00A2, 0xA1F6, 0xA1F6, 0x00F8,
+ 0xA1F7, 0xA1F7, 0x00F7, 0xA1F8, 0xA1FE, 0x00F9, 0xA240, 0xA27E, 0x0100,
+ 0xA2A1, 0xA2FE, 0x013F, 0xA340, 0xA37E, 0x019D, 0xA3A1, 0xA3BB, 0x01DC,
+ 0xA3BD, 0xA3BF, 0x01F7, 0xA440, 0xA47E, 0x0253, 0xA4A1, 0xA4FE, 0x0292,
+ 0xA540, 0xA57E, 0x02F0, 0xA5A1, 0xA5FE, 0x032F, 0xA640, 0xA67E, 0x038D,
+ 0xA6A1, 0xA6FE, 0x03CC, 0xA740, 0xA77E, 0x042A, 0xA7A1, 0xA7FE, 0x0469,
+ 0xA840, 0xA87E, 0x04C7, 0xA8A1, 0xA8FE, 0x0506, 0xA940, 0xA97E, 0x0564,
+ 0xA9A1, 0xA9FE, 0x05A3, 0xAA40, 0xAA7E, 0x0601, 0xAAA1, 0xAAFE, 0x0640,
+ 0xAB40, 0xAB7E, 0x069E, 0xABA1, 0xABFE, 0x06DD, 0xAC40, 0xAC7E, 0x073B,
+ 0xACA1, 0xACFD, 0x077A, 0xACFE, 0xACFE, 0x097F, 0xAD40, 0xAD7E, 0x07D7,
+ 0xADA1, 0xADFE, 0x0816, 0xAE40, 0xAE7E, 0x0874, 0xAEA1, 0xAEFE, 0x08B3,
+ 0xAF40, 0xAF7E, 0x0911, 0xAFA1, 0xAFCF, 0x0950, 0xAFD0, 0xAFFE, 0x0980,
+ 0xB040, 0xB07E, 0x09AF, 0xB0A1, 0xB0FE, 0x09EE, 0xB140, 0xB17E, 0x0A4C,
+ 0xB1A1, 0xB1FE, 0x0A8B, 0xB240, 0xB27E, 0x0AE9, 0xB2A1, 0xB2FE, 0x0B28,
+ 0xB340, 0xB37E, 0x0B86, 0xB3A1, 0xB3FE, 0x0BC5, 0xB440, 0xB47E, 0x0C23,
+ 0xB4A1, 0xB4FE, 0x0C62, 0xB540, 0xB57E, 0x0CC0, 0xB5A1, 0xB5FE, 0x0CFF,
+ 0xB640, 0xB67E, 0x0D5D, 0xB6A1, 0xB6FE, 0x0D9C, 0xB740, 0xB77E, 0x0DFA,
+ 0xB7A1, 0xB7FE, 0x0E39, 0xB840, 0xB87E, 0x0E97, 0xB8A1, 0xB8FE, 0x0ED6,
+ 0xB940, 0xB97E, 0x0F34, 0xB9A1, 0xB9FE, 0x0F73, 0xBA40, 0xBA7E, 0x0FD1,
+ 0xBAA1, 0xBAFE, 0x1010, 0xBB40, 0xBB7E, 0x106E, 0xBBA1, 0xBBC7, 0x10AD,
+ 0xBBC8, 0xBBFE, 0x10D5, 0xBC40, 0xBC7E, 0x110C, 0xBCA1, 0xBCFE, 0x114B,
+ 0xBD40, 0xBD7E, 0x11A9, 0xBDA1, 0xBDFE, 0x11E8, 0xBE40, 0xBE51, 0x1246,
+ 0xBE52, 0xBE52, 0x10D4, 0xBE53, 0xBE7E, 0x1258, 0xBEA1, 0xBEFE, 0x1284,
+ 0xBF40, 0xBF7E, 0x12E2, 0xBFA1, 0xBFFE, 0x1321, 0xC040, 0xC07E, 0x137F,
+ 0xC0A1, 0xC0FE, 0x13BE, 0xC140, 0xC17E, 0x141C, 0xC1A1, 0xC1AA, 0x145B,
+ 0xC1AB, 0xC1FE, 0x1466, 0xC240, 0xC27E, 0x14BA, 0xC2A1, 0xC2CA, 0x14F9,
+ 0xC2CB, 0xC2CB, 0x1465, 0xC2CC, 0xC2FE, 0x1523, 0xC340, 0xC360, 0x1556,
+ 0xC361, 0xC37E, 0x1578, 0xC3A1, 0xC3B8, 0x1596, 0xC3B9, 0xC3B9, 0x15AF,
+ 0xC3BA, 0xC3BA, 0x15AE, 0xC3BB, 0xC3FE, 0x15B0, 0xC440, 0xC455, 0x15F4,
+ 0xC456, 0xC456, 0x1577, 0xC457, 0xC47E, 0x160A, 0xC4A1, 0xC4FE, 0x1632,
+ 0xC540, 0xC57E, 0x1690, 0xC5A1, 0xC5FE, 0x16CF, 0xC640, 0xC67E, 0x172D,
+ 0xC6A1, 0xC6BE, 0x01FA, 0xC6BF, 0xC6D7, 0x0219, 0xC6D8, 0xC6DE, 0x35B3,
+ 0xC6DF, 0xC6DF, 0x1794, 0xC6E0, 0xC6FE, 0x35BA, 0xC740, 0xC77E, 0x35D9,
+ 0xC7A1, 0xC7FE, 0x3618, 0xC840, 0xC87E, 0x3676, 0xC8A1, 0xC8D3, 0x36B5,
+ 0xC940, 0xC949, 0x176C, 0xC94A, 0xC94A, 0x0274, 0xC94B, 0xC96B, 0x1776,
+ 0xC96C, 0xC97E, 0x1798, 0xC9A1, 0xC9BD, 0x17AB, 0xC9BE, 0xC9BE, 0x1797,
+ 0xC9BF, 0xC9EC, 0x17C8, 0xC9ED, 0xC9FE, 0x17F7, 0xCA40, 0xCA7E, 0x1809,
+ 0xCAA1, 0xCAF6, 0x1848, 0xCAF7, 0xCAF7, 0x17F6, 0xCAF8, 0xCAFE, 0x189E,
+ 0xCB40, 0xCB7E, 0x18A5, 0xCBA1, 0xCBFE, 0x18E4, 0xCC40, 0xCC7E, 0x1942,
+ 0xCCA1, 0xCCFE, 0x1981, 0xCD40, 0xCD7E, 0x19DF, 0xCDA1, 0xCDFE, 0x1A1E,
+ 0xCE40, 0xCE7E, 0x1A7C, 0xCEA1, 0xCEFE, 0x1ABB, 0xCF40, 0xCF7E, 0x1B19,
+ 0xCFA1, 0xCFFE, 0x1B58, 0xD040, 0xD07E, 0x1BB6, 0xD0A1, 0xD0FE, 0x1BF5,
+ 0xD140, 0xD17E, 0x1C53, 0xD1A1, 0xD1FE, 0x1C92, 0xD240, 0xD27E, 0x1CF0,
+ 0xD2A1, 0xD2FE, 0x1D2F, 0xD340, 0xD37E, 0x1D8D, 0xD3A1, 0xD3FE, 0x1DCC,
+ 0xD440, 0xD47E, 0x1E2A, 0xD4A1, 0xD4FE, 0x1E69, 0xD540, 0xD57E, 0x1EC7,
+ 0xD5A1, 0xD5FE, 0x1F06, 0xD640, 0xD67E, 0x1F64, 0xD6A1, 0xD6CB, 0x1FA3,
+ 0xD6CC, 0xD6CC, 0x2254, 0xD6CD, 0xD6FE, 0x1FCF, 0xD740, 0xD779, 0x2001,
+ 0xD77A, 0xD77A, 0x22B9, 0xD77B, 0xD77E, 0x203B, 0xD7A1, 0xD7FE, 0x203F,
+ 0xD840, 0xD87E, 0x209D, 0xD8A1, 0xD8FE, 0x20DC, 0xD940, 0xD97E, 0x213A,
+ 0xD9A1, 0xD9FE, 0x2179, 0xDA40, 0xDA7E, 0x21D7, 0xDAA1, 0xDADE, 0x2216,
+ 0xDADF, 0xDADF, 0x1FCE, 0xDAE0, 0xDAFE, 0x2255, 0xDB40, 0xDB7E, 0x2274,
+ 0xDBA1, 0xDBA6, 0x22B3, 0xDBA7, 0xDBFE, 0x22BA, 0xDC40, 0xDC7E, 0x2312,
+ 0xDCA1, 0xDCFE, 0x2351, 0xDD40, 0xDD7E, 0x23AF, 0xDDA1, 0xDDFB, 0x23EE,
+ 0xDDFC, 0xDDFC, 0x2381, 0xDDFD, 0xDDFE, 0x2449, 0xDE40, 0xDE7E, 0x244B,
+ 0xDEA1, 0xDEFE, 0x248A, 0xDF40, 0xDF7E, 0x24E8, 0xDFA1, 0xDFFE, 0x2527,
+ 0xE040, 0xE07E, 0x2585, 0xE0A1, 0xE0FE, 0x25C4, 0xE140, 0xE17E, 0x2622,
+ 0xE1A1, 0xE1FE, 0x2661, 0xE240, 0xE27E, 0x26BF, 0xE2A1, 0xE2FE, 0x26FE,
+ 0xE340, 0xE37E, 0x275C, 0xE3A1, 0xE3FE, 0x279B, 0xE440, 0xE47E, 0x27F9,
+ 0xE4A1, 0xE4FE, 0x2838, 0xE540, 0xE57E, 0x2896, 0xE5A1, 0xE5FE, 0x28D5,
+ 0xE640, 0xE67E, 0x2933, 0xE6A1, 0xE6FE, 0x2972, 0xE740, 0xE77E, 0x29D0,
+ 0xE7A1, 0xE7FE, 0x2A0F, 0xE840, 0xE87E, 0x2A6D, 0xE8A1, 0xE8A2, 0x2AAC,
+ 0xE8A3, 0xE8FE, 0x2AAF, 0xE940, 0xE975, 0x2B0B, 0xE976, 0xE97E, 0x2B42,
+ 0xE9A1, 0xE9FE, 0x2B4B, 0xEA40, 0xEA7E, 0x2BA9, 0xEAA1, 0xEAFE, 0x2BE8,
+ 0xEB40, 0xEB5A, 0x2C46, 0xEB5B, 0xEB7E, 0x2C62, 0xEBA1, 0xEBF0, 0x2C86,
+ 0xEBF1, 0xEBF1, 0x2AAE, 0xEBF2, 0xEBFE, 0x2CD6, 0xEC40, 0xEC7E, 0x2CE3,
+ 0xECA1, 0xECDD, 0x2D22, 0xECDE, 0xECDE, 0x2B41, 0xECDF, 0xECFE, 0x2D5F,
+ 0xED40, 0xED7E, 0x2D7F, 0xEDA1, 0xEDA9, 0x2DBE, 0xEDAA, 0xEDFE, 0x2DC8,
+ 0xEE40, 0xEE7E, 0x2E1D, 0xEEA1, 0xEEEA, 0x2E5C, 0xEEEB, 0xEEEB, 0x3014,
+ 0xEEEC, 0xEEFE, 0x2EA6, 0xEF40, 0xEF7E, 0x2EB9, 0xEFA1, 0xEFFE, 0x2EF8,
+ 0xF040, 0xF055, 0x2F56, 0xF056, 0xF056, 0x2DC7, 0xF057, 0xF07E, 0x2F6C,
+ 0xF0A1, 0xF0CA, 0x2F94, 0xF0CB, 0xF0CB, 0x2C61, 0xF0CC, 0xF0FE, 0x2FBE,
+ 0xF140, 0xF162, 0x2FF1, 0xF163, 0xF16A, 0x3015, 0xF16B, 0xF16B, 0x3160,
+ 0xF16C, 0xF17E, 0x301D, 0xF1A1, 0xF1FE, 0x3030, 0xF240, 0xF267, 0x308E,
+ 0xF268, 0xF268, 0x31EF, 0xF269, 0xF27E, 0x30B6, 0xF2A1, 0xF2C2, 0x30CC,
+ 0xF2C3, 0xF2FE, 0x30EF, 0xF340, 0xF374, 0x312B, 0xF375, 0xF37E, 0x3161,
+ 0xF3A1, 0xF3FE, 0x316B, 0xF440, 0xF465, 0x31C9, 0xF466, 0xF47E, 0x31F0,
+ 0xF4A1, 0xF4B4, 0x3209, 0xF4B5, 0xF4B5, 0x30EE, 0xF4B6, 0xF4FC, 0x321D,
+ 0xF4FD, 0xF4FE, 0x3265, 0xF540, 0xF57E, 0x3267, 0xF5A1, 0xF5FE, 0x32A6,
+ 0xF640, 0xF662, 0x3304, 0xF663, 0xF663, 0x3264, 0xF664, 0xF67E, 0x3327,
+ 0xF6A1, 0xF6FE, 0x3342, 0xF740, 0xF77E, 0x33A0, 0xF7A1, 0xF7FE, 0x33DF,
+ 0xF840, 0xF87E, 0x343D, 0xF8A1, 0xF8FE, 0x347C, 0xF940, 0xF976, 0x34DA,
+ 0xF977, 0xF97E, 0x3512, 0xF9A1, 0xF9C3, 0x351A, 0xF9C4, 0xF9C4, 0x3511,
+ 0xF9C5, 0xF9C5, 0x353D, 0xF9C6, 0xF9C6, 0x3549, 0xF9C7, 0xF9D1, 0x353E,
+ 0xF9D2, 0xF9D5, 0x354A, 0xF9D6, 0xF9FE, 0x36E8,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/CNS1/ETen-B5-V_0.cpp b/core/src/fpdfapi/fpdf_cmaps/CNS1/ETen-B5-V_0.cpp
index e1d9e238f8..941c1f2b9a 100644
--- a/core/src/fpdfapi/fpdf_cmaps/CNS1/ETen-B5-V_0.cpp
+++ b/core/src/fpdfapi/fpdf_cmaps/CNS1/ETen-B5-V_0.cpp
@@ -1,13 +1,13 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-extern const unsigned short g_FXCMAP_ETen_B5_V_0[13 * 3] = {
- 0xA14B, 0xA14B, 0x354E, 0xA15A, 0xA15A, 0x35AF, 0xA15C, 0xA15C, 0x35B1,
- 0xA15D, 0xA15E, 0x0082, 0xA161, 0xA162, 0x0086, 0xA165, 0xA166, 0x008A,
- 0xA169, 0xA16A, 0x008E, 0xA16D, 0xA16E, 0x0092, 0xA171, 0xA172, 0x0096,
- 0xA175, 0xA176, 0x009A, 0xA179, 0xA17A, 0x009E, 0xA1E3, 0xA1E3, 0x354F,
- 0xC6E4, 0xC6E5, 0x3711,
-};
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_ETen_B5_V_0[13 * 3] = {
+ 0xA14B, 0xA14B, 0x354E, 0xA15A, 0xA15A, 0x35AF, 0xA15C, 0xA15C, 0x35B1,
+ 0xA15D, 0xA15E, 0x0082, 0xA161, 0xA162, 0x0086, 0xA165, 0xA166, 0x008A,
+ 0xA169, 0xA16A, 0x008E, 0xA16D, 0xA16E, 0x0092, 0xA171, 0xA172, 0x0096,
+ 0xA175, 0xA176, 0x009A, 0xA179, 0xA17A, 0x009E, 0xA1E3, 0xA1E3, 0x354F,
+ 0xC6E4, 0xC6E5, 0x3711,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/CNS1/ETenms-B5-H_0.cpp b/core/src/fpdfapi/fpdf_cmaps/CNS1/ETenms-B5-H_0.cpp
index 1b5136e2ba..fae2633452 100644
--- a/core/src/fpdfapi/fpdf_cmaps/CNS1/ETenms-B5-H_0.cpp
+++ b/core/src/fpdfapi/fpdf_cmaps/CNS1/ETenms-B5-H_0.cpp
@@ -1,9 +1,9 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-extern const unsigned short g_FXCMAP_ETenms_B5_H_0[1 * 3] = {
- 0x0020, 0x007E, 0x0001,
-};
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_ETenms_B5_H_0[1 * 3] = {
+ 0x0020, 0x007E, 0x0001,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/CNS1/ETenms-B5-V_0.cpp b/core/src/fpdfapi/fpdf_cmaps/CNS1/ETenms-B5-V_0.cpp
index 1b8ad0eb87..79b8a34053 100644
--- a/core/src/fpdfapi/fpdf_cmaps/CNS1/ETenms-B5-V_0.cpp
+++ b/core/src/fpdfapi/fpdf_cmaps/CNS1/ETenms-B5-V_0.cpp
@@ -1,14 +1,14 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-extern const unsigned short g_FXCMAP_ETenms_B5_V_0[18 * 3] = {
- 0xA14B, 0xA14B, 0x354E, 0xA14C, 0xA14C, 0x006D, 0xA156, 0xA156, 0x0138,
- 0xA158, 0xA158, 0x007A, 0xA15A, 0xA15A, 0x35AF, 0xA15C, 0xA15C, 0x35B1,
- 0xA15D, 0xA15E, 0x0082, 0xA161, 0xA162, 0x0086, 0xA165, 0xA166, 0x008A,
- 0xA169, 0xA16A, 0x008E, 0xA16D, 0xA16E, 0x0092, 0xA171, 0xA172, 0x0096,
- 0xA175, 0xA176, 0x009A, 0xA179, 0xA17A, 0x009E, 0xA17D, 0xA17E, 0x0082,
- 0xA1A1, 0xA1A2, 0x0086, 0xA1A3, 0xA1A4, 0x008A, 0xC6E4, 0xC6E5, 0x3711,
-};
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_ETenms_B5_V_0[18 * 3] = {
+ 0xA14B, 0xA14B, 0x354E, 0xA14C, 0xA14C, 0x006D, 0xA156, 0xA156, 0x0138,
+ 0xA158, 0xA158, 0x007A, 0xA15A, 0xA15A, 0x35AF, 0xA15C, 0xA15C, 0x35B1,
+ 0xA15D, 0xA15E, 0x0082, 0xA161, 0xA162, 0x0086, 0xA165, 0xA166, 0x008A,
+ 0xA169, 0xA16A, 0x008E, 0xA16D, 0xA16E, 0x0092, 0xA171, 0xA172, 0x0096,
+ 0xA175, 0xA176, 0x009A, 0xA179, 0xA17A, 0x009E, 0xA17D, 0xA17E, 0x0082,
+ 0xA1A1, 0xA1A2, 0x0086, 0xA1A3, 0xA1A4, 0x008A, 0xC6E4, 0xC6E5, 0x3711,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/CNS1/UniCNS-UTF16-H_0.cpp b/core/src/fpdfapi/fpdf_cmaps/CNS1/UniCNS-UTF16-H_0.cpp
index d29a725fb6..ea7f118386 100644
--- a/core/src/fpdfapi/fpdf_cmaps/CNS1/UniCNS-UTF16-H_0.cpp
+++ b/core/src/fpdfapi/fpdf_cmaps/CNS1/UniCNS-UTF16-H_0.cpp
@@ -1,3651 +1,3651 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-extern const unsigned short g_FXCMAP_UniCNS_UTF16_H_0[14557 * 2] = {
- 0x0020, 0x0001, 0x0021, 0x0002, 0x0022, 0x0003, 0x0023, 0x0004,
- 0x0024, 0x0005, 0x0025, 0x0006, 0x0026, 0x0007, 0x0027, 0x0008,
- 0x0028, 0x0009, 0x0029, 0x000A, 0x002A, 0x000B, 0x002B, 0x000C,
- 0x002C, 0x000D, 0x002D, 0x000E, 0x002E, 0x000F, 0x002F, 0x0010,
- 0x0030, 0x0011, 0x0031, 0x0012, 0x0032, 0x0013, 0x0033, 0x0014,
- 0x0034, 0x0015, 0x0035, 0x0016, 0x0036, 0x0017, 0x0037, 0x0018,
- 0x0038, 0x0019, 0x0039, 0x001A, 0x003A, 0x001B, 0x003B, 0x001C,
- 0x003C, 0x001D, 0x003D, 0x001E, 0x003E, 0x001F, 0x003F, 0x0020,
- 0x0040, 0x0021, 0x0041, 0x0022, 0x0042, 0x0023, 0x0043, 0x0024,
- 0x0044, 0x0025, 0x0045, 0x0026, 0x0046, 0x0027, 0x0047, 0x0028,
- 0x0048, 0x0029, 0x0049, 0x002A, 0x004A, 0x002B, 0x004B, 0x002C,
- 0x004C, 0x002D, 0x004D, 0x002E, 0x004E, 0x002F, 0x004F, 0x0030,
- 0x0050, 0x0031, 0x0051, 0x0032, 0x0052, 0x0033, 0x0053, 0x0034,
- 0x0054, 0x0035, 0x0055, 0x0036, 0x0056, 0x0037, 0x0057, 0x0038,
- 0x0058, 0x0039, 0x0059, 0x003A, 0x005A, 0x003B, 0x005B, 0x003C,
- 0x005C, 0x003D, 0x005D, 0x003E, 0x005E, 0x003F, 0x005F, 0x0040,
- 0x0060, 0x0041, 0x0061, 0x0042, 0x0062, 0x0043, 0x0063, 0x0044,
- 0x0064, 0x0045, 0x0065, 0x0046, 0x0066, 0x0047, 0x0067, 0x0048,
- 0x0068, 0x0049, 0x0069, 0x004A, 0x006A, 0x004B, 0x006B, 0x004C,
- 0x006C, 0x004D, 0x006D, 0x004E, 0x006E, 0x004F, 0x006F, 0x0050,
- 0x0070, 0x0051, 0x0071, 0x0052, 0x0072, 0x0053, 0x0073, 0x0054,
- 0x0074, 0x0055, 0x0075, 0x0056, 0x0076, 0x0057, 0x0077, 0x0058,
- 0x0078, 0x0059, 0x0079, 0x005A, 0x007A, 0x005B, 0x007B, 0x005C,
- 0x007C, 0x005D, 0x007D, 0x005E, 0x007E, 0x005F, 0x00A2, 0x0106,
- 0x00A3, 0x0107, 0x00A5, 0x0104, 0x00A7, 0x00B2, 0x00A8, 0x35B3,
- 0x00AC, 0x36E1, 0x00AF, 0x00C3, 0x00B0, 0x0118, 0x00B1, 0x00D4,
- 0x00B7, 0x0073, 0x00D7, 0x00D2, 0x00F7, 0x00D3, 0x02C6, 0x35B4,
- 0x02C7, 0x01F8, 0x02CA, 0x01F7, 0x02CB, 0x01F9, 0x02CD, 0x00C6,
- 0x02D9, 0x01F6, 0x0308, 0x35B3, 0x0391, 0x01A1, 0x0392, 0x01A2,
- 0x0393, 0x01A3, 0x0394, 0x01A4, 0x0395, 0x01A5, 0x0396, 0x01A6,
- 0x0397, 0x01A7, 0x0398, 0x01A8, 0x0399, 0x01A9, 0x039A, 0x01AA,
- 0x039B, 0x01AB, 0x039C, 0x01AC, 0x039D, 0x01AD, 0x039E, 0x01AE,
- 0x039F, 0x01AF, 0x03A0, 0x01B0, 0x03A1, 0x01B1, 0x03A3, 0x01B2,
- 0x03A4, 0x01B3, 0x03A5, 0x01B4, 0x03A6, 0x01B5, 0x03A7, 0x01B6,
- 0x03A8, 0x01B7, 0x03A9, 0x01B8, 0x03B1, 0x01B9, 0x03B2, 0x01BA,
- 0x03B3, 0x01BB, 0x03B4, 0x01BC, 0x03B5, 0x01BD, 0x03B6, 0x01BE,
- 0x03B7, 0x01BF, 0x03B8, 0x01C0, 0x03B9, 0x01C1, 0x03BA, 0x01C2,
- 0x03BB, 0x01C3, 0x03BC, 0x01C4, 0x03BD, 0x01C5, 0x03BE, 0x01C6,
- 0x03BF, 0x01C7, 0x03C0, 0x01C8, 0x03C1, 0x01C9, 0x03C3, 0x01CA,
- 0x03C4, 0x01CB, 0x03C5, 0x01CC, 0x03C6, 0x01CD, 0x03C7, 0x01CE,
- 0x03C8, 0x01CF, 0x03C9, 0x01D0, 0x0401, 0x3670, 0x0410, 0x366A,
- 0x0411, 0x366B, 0x0412, 0x366C, 0x0413, 0x366D, 0x0414, 0x366E,
- 0x0415, 0x366F, 0x0416, 0x3671, 0x0417, 0x3672, 0x0418, 0x3673,
- 0x0419, 0x3674, 0x041A, 0x3675, 0x041B, 0x3676, 0x041C, 0x3677,
- 0x041D, 0x3678, 0x041E, 0x3679, 0x041F, 0x367A, 0x0420, 0x367B,
- 0x0421, 0x367C, 0x0422, 0x367D, 0x0423, 0x367E, 0x0424, 0x367F,
- 0x0425, 0x3680, 0x0426, 0x3681, 0x0427, 0x3682, 0x0428, 0x3683,
- 0x0429, 0x3684, 0x042A, 0x3685, 0x042B, 0x3686, 0x042C, 0x3687,
- 0x042D, 0x3688, 0x042E, 0x3689, 0x042F, 0x368A, 0x0430, 0x368B,
- 0x0431, 0x368C, 0x0432, 0x368D, 0x0433, 0x368E, 0x0434, 0x368F,
- 0x0435, 0x3690, 0x0436, 0x3692, 0x0437, 0x3693, 0x0438, 0x3694,
- 0x0439, 0x3695, 0x043A, 0x3696, 0x043B, 0x3697, 0x043C, 0x3698,
- 0x043D, 0x3699, 0x043E, 0x369A, 0x043F, 0x369B, 0x0440, 0x369C,
- 0x0441, 0x369D, 0x0442, 0x369E, 0x0443, 0x369F, 0x0444, 0x36A0,
- 0x0445, 0x36A1, 0x0446, 0x36A2, 0x0447, 0x36A3, 0x0448, 0x36A4,
- 0x0449, 0x36A5, 0x044A, 0x36A6, 0x044B, 0x36A7, 0x044C, 0x36A8,
- 0x044D, 0x36A9, 0x044E, 0x36AA, 0x044F, 0x36AB, 0x0451, 0x3691,
- 0x2013, 0x0079, 0x2014, 0x007B, 0x2018, 0x00A6, 0x2019, 0x00A7,
- 0x201C, 0x00A8, 0x201D, 0x00A9, 0x2022, 0x0068, 0x2025, 0x006F,
- 0x2026, 0x006E, 0x2027, 0x0068, 0x2032, 0x00AD, 0x2035, 0x00AC,
- 0x203B, 0x00B1, 0x203E, 0x00C3, 0x2103, 0x010A, 0x2105, 0x00C2,
- 0x2109, 0x010B, 0x2116, 0x36E6, 0x2121, 0x36E7, 0x2160, 0x0157,
- 0x2161, 0x0158, 0x2162, 0x0159, 0x2163, 0x015A, 0x2164, 0x015B,
- 0x2165, 0x015C, 0x2166, 0x015D, 0x2167, 0x015E, 0x2168, 0x015F,
- 0x2169, 0x0160, 0x2170, 0x020E, 0x2171, 0x020F, 0x2172, 0x0210,
- 0x2173, 0x0211, 0x2174, 0x0212, 0x2175, 0x0213, 0x2176, 0x0214,
- 0x2177, 0x0215, 0x2178, 0x0216, 0x2179, 0x0217, 0x2190, 0x00F8,
- 0x2191, 0x00F5, 0x2192, 0x00F7, 0x2193, 0x00F6, 0x2196, 0x00F9,
- 0x2197, 0x00FA, 0x2198, 0x00FC, 0x2199, 0x00FB, 0x21B8, 0x36AD,
- 0x21B9, 0x36AE, 0x21E7, 0x36AC, 0x2215, 0x0101, 0x221A, 0x00D5,
- 0x221E, 0x00DC, 0x221F, 0x00E9, 0x2220, 0x00E8, 0x2223, 0x00FE,
- 0x2225, 0x00FD, 0x2229, 0x00E5, 0x222A, 0x00E6, 0x222B, 0x00ED,
- 0x222E, 0x00EE, 0x2234, 0x00F0, 0x2235, 0x00EF, 0x223C, 0x00E4,
- 0x2252, 0x00DD, 0x2260, 0x00DB, 0x2261, 0x00DE, 0x2266, 0x00D9,
- 0x2267, 0x00DA, 0x2295, 0x00F3, 0x2299, 0x00F4, 0x22A5, 0x00E7,
- 0x22BF, 0x00EA, 0x22EF, 0x006E, 0x2400, 0x0232, 0x2401, 0x0233,
- 0x2402, 0x0234, 0x2403, 0x0235, 0x2404, 0x0236, 0x2405, 0x0237,
- 0x2406, 0x0238, 0x2407, 0x0239, 0x2408, 0x023A, 0x2409, 0x023B,
- 0x240A, 0x023C, 0x240B, 0x023D, 0x240C, 0x023E, 0x240D, 0x023F,
- 0x240E, 0x0240, 0x240F, 0x0241, 0x2410, 0x0242, 0x2411, 0x0243,
- 0x2412, 0x0244, 0x2413, 0x0245, 0x2414, 0x0246, 0x2415, 0x0247,
- 0x2416, 0x0248, 0x2417, 0x0249, 0x2418, 0x024A, 0x2419, 0x024B,
- 0x241A, 0x024C, 0x241B, 0x024D, 0x241C, 0x024E, 0x241D, 0x024F,
- 0x241E, 0x0250, 0x241F, 0x0251, 0x2421, 0x0252, 0x2460, 0x01FA,
- 0x2461, 0x01FB, 0x2462, 0x01FC, 0x2463, 0x01FD, 0x2464, 0x01FE,
- 0x2465, 0x01FF, 0x2466, 0x0200, 0x2467, 0x0201, 0x2468, 0x0202,
- 0x2469, 0x0203, 0x2474, 0x0204, 0x2475, 0x0205, 0x2476, 0x0206,
- 0x2477, 0x0207, 0x2478, 0x0208, 0x2479, 0x0209, 0x247A, 0x020A,
- 0x247B, 0x020B, 0x247C, 0x020C, 0x247D, 0x020D, 0x2500, 0x0137,
- 0x2502, 0x0138, 0x250C, 0x013A, 0x2510, 0x013B, 0x2514, 0x013C,
- 0x2518, 0x013D, 0x251C, 0x0135, 0x2524, 0x0134, 0x252C, 0x0133,
- 0x2534, 0x0132, 0x253C, 0x0131, 0x2550, 0x0142, 0x2551, 0x370A,
- 0x2552, 0x36F8, 0x2553, 0x3701, 0x2554, 0x36EF, 0x2555, 0x36FA,
- 0x2556, 0x3703, 0x2557, 0x36F1, 0x2558, 0x36FE, 0x2559, 0x3707,
- 0x255A, 0x36F5, 0x255B, 0x3700, 0x255C, 0x3709, 0x255D, 0x36F7,
- 0x255E, 0x0143, 0x255F, 0x3704, 0x2560, 0x36F2, 0x2561, 0x0145,
- 0x2562, 0x3706, 0x2563, 0x36F4, 0x2564, 0x36F9, 0x2565, 0x3702,
- 0x2566, 0x36F0, 0x2567, 0x36FF, 0x2568, 0x3708, 0x2569, 0x36F6,
- 0x256A, 0x0144, 0x256B, 0x3705, 0x256C, 0x36F3, 0x256D, 0x013E,
- 0x256E, 0x013F, 0x256F, 0x0141, 0x2570, 0x0140, 0x2571, 0x014A,
- 0x2572, 0x014B, 0x2573, 0x014C, 0x2574, 0x35B0, 0x2581, 0x0122,
- 0x2582, 0x0123, 0x2583, 0x0124, 0x2584, 0x0125, 0x2585, 0x0126,
- 0x2586, 0x0127, 0x2587, 0x0128, 0x2588, 0x0129, 0x2589, 0x0130,
- 0x258A, 0x012F, 0x258B, 0x012E, 0x258C, 0x012D, 0x258D, 0x012C,
- 0x258E, 0x012B, 0x258F, 0x012A, 0x2593, 0x3710, 0x2594, 0x0136,
- 0x2595, 0x0139, 0x25A0, 0x00BE, 0x25A1, 0x00BD, 0x25B2, 0x00B7,
- 0x25B3, 0x00B6, 0x25BC, 0x00C0, 0x25BD, 0x00BF, 0x25C6, 0x00BC,
- 0x25C7, 0x00BB, 0x25CB, 0x00B4, 0x25CE, 0x00B8, 0x25CF, 0x00B5,
- 0x25E2, 0x0146, 0x25E3, 0x0147, 0x25E4, 0x0149, 0x25E5, 0x0148,
- 0x2605, 0x00BA, 0x2606, 0x00B9, 0x2609, 0x00F4, 0x2640, 0x00F1,
- 0x2641, 0x00F3, 0x2642, 0x00F2, 0x273D, 0x35C0, 0x2F00, 0x0253,
- 0x2F01, 0x0218, 0x2F02, 0x0219, 0x2F03, 0x021A, 0x2F04, 0x0254,
- 0x2F05, 0x021B, 0x2F06, 0x025A, 0x2F07, 0x021C, 0x2F08, 0x025B,
- 0x2F09, 0x025C, 0x2F0A, 0x025D, 0x2F0B, 0x025E, 0x2F0C, 0x021D,
- 0x2F0D, 0x021E, 0x2F0E, 0x021F, 0x2F0F, 0x025F, 0x2F10, 0x176E,
- 0x2F11, 0x0260, 0x2F12, 0x0262, 0x2F13, 0x0220, 0x2F14, 0x0263,
- 0x2F15, 0x176F, 0x2F16, 0x0221, 0x2F17, 0x0264, 0x2F18, 0x0265,
- 0x2F19, 0x0222, 0x2F1A, 0x1770, 0x2F1B, 0x0223, 0x2F1C, 0x0266,
- 0x2F1D, 0x0279, 0x2F1E, 0x1775, 0x2F1F, 0x027A, 0x2F20, 0x027B,
- 0x2F21, 0x0224, 0x2F22, 0x0224, 0x2F23, 0x027C, 0x2F24, 0x027D,
- 0x2F25, 0x027E, 0x2F26, 0x027F, 0x2F27, 0x0225, 0x2F28, 0x0282,
- 0x2F29, 0x0283, 0x2F2A, 0x0284, 0x2F2B, 0x0285, 0x2F2C, 0x1776,
- 0x2F2D, 0x0286, 0x2F2E, 0x0226, 0x2F2F, 0x0288, 0x2F30, 0x0289,
- 0x2F31, 0x028C, 0x2F32, 0x028D, 0x2F33, 0x0227, 0x2F34, 0x0228,
- 0x2F35, 0x0229, 0x2F36, 0x028E, 0x2F37, 0x028F, 0x2F38, 0x0290,
- 0x2F39, 0x022A, 0x2F3A, 0x022B, 0x2F3B, 0x1777, 0x2F3C, 0x02D0,
- 0x2F3D, 0x02D1, 0x2F3E, 0x02D2, 0x2F3F, 0x02D3, 0x2F40, 0x02D5,
- 0x2F41, 0x022C, 0x2F42, 0x02D6, 0x2F43, 0x02D7, 0x2F44, 0x02D8,
- 0x2F45, 0x02D9, 0x2F46, 0x022D, 0x2F47, 0x02DA, 0x2F48, 0x02DB,
- 0x2F49, 0x02DC, 0x2F4A, 0x02DD, 0x2F4B, 0x02DE, 0x2F4C, 0x02DF,
- 0x2F4D, 0x02E0, 0x2F4E, 0x178A, 0x2F4F, 0x02E1, 0x2F50, 0x02E2,
- 0x2F51, 0x02E3, 0x2F52, 0x02E4, 0x2F53, 0x178C, 0x2F54, 0x02E5,
- 0x2F55, 0x02E6, 0x2F56, 0x02E7, 0x2F57, 0x02E8, 0x2F58, 0x02E9,
- 0x2F59, 0x178D, 0x2F5A, 0x02EA, 0x2F5B, 0x02EB, 0x2F5C, 0x02EC,
- 0x2F5D, 0x02ED, 0x2F5E, 0x0356, 0x2F5F, 0x0357, 0x2F60, 0x0358,
- 0x2F61, 0x0359, 0x2F62, 0x035A, 0x2F63, 0x035B, 0x2F64, 0x035C,
- 0x2F65, 0x035E, 0x2F66, 0x0362, 0x2F67, 0x022E, 0x2F68, 0x022F,
- 0x2F69, 0x0363, 0x2F6A, 0x0364, 0x2F6B, 0x0365, 0x2F6C, 0x0366,
- 0x2F6D, 0x0367, 0x2F6E, 0x0368, 0x2F6F, 0x0369, 0x2F70, 0x036A,
- 0x2F71, 0x17B2, 0x2F72, 0x036B, 0x2F73, 0x036C, 0x2F74, 0x036D,
- 0x2F75, 0x03F6, 0x2F76, 0x03F7, 0x2F77, 0x03F8, 0x2F78, 0x03F9,
- 0x2F79, 0x1812, 0x2F7A, 0x03FA, 0x2F7B, 0x03FB, 0x2F7C, 0x03FC,
- 0x2F7D, 0x03FE, 0x2F7E, 0x03FF, 0x2F7F, 0x0400, 0x2F80, 0x0401,
- 0x2F81, 0x0402, 0x2F82, 0x0405, 0x2F83, 0x0406, 0x2F84, 0x0407,
- 0x2F85, 0x0408, 0x2F86, 0x0409, 0x2F87, 0x040A, 0x2F88, 0x040B,
- 0x2F89, 0x040C, 0x2F8A, 0x040D, 0x2F8B, 0x1813, 0x2F8C, 0x1818,
- 0x2F8D, 0x040F, 0x2F8E, 0x0410, 0x2F8F, 0x0411, 0x2F90, 0x0412,
- 0x2F91, 0x1819, 0x2F92, 0x0508, 0x2F93, 0x0509, 0x2F94, 0x050A,
- 0x2F95, 0x050B, 0x2F96, 0x050C, 0x2F97, 0x050D, 0x2F98, 0x18E7,
- 0x2F99, 0x050E, 0x2F9A, 0x050F, 0x2F9B, 0x0510, 0x2F9C, 0x0511,
- 0x2F9D, 0x0512, 0x2F9E, 0x0513, 0x2F9F, 0x0514, 0x2FA0, 0x0515,
- 0x2FA1, 0x0230, 0x2FA2, 0x051B, 0x2FA3, 0x0520, 0x2FA4, 0x0521,
- 0x2FA5, 0x0522, 0x2FA6, 0x0696, 0x2FA7, 0x0697, 0x2FA8, 0x0698,
- 0x2FA9, 0x0699, 0x2FAA, 0x0231, 0x2FAB, 0x069F, 0x2FAC, 0x06A0,
- 0x2FAE, 0x06A2, 0x2FAF, 0x0826, 0x2FB0, 0x0827, 0x2FB1, 0x0828,
- 0x2FB2, 0x0829, 0x2FB3, 0x082A, 0x2FB4, 0x082B, 0x2FB5, 0x082C,
- 0x2FB6, 0x082D, 0x2FB7, 0x082E, 0x2FB8, 0x082F, 0x2FB9, 0x0830,
- 0x2FBA, 0x09F5, 0x2FBB, 0x09F6, 0x2FBC, 0x09F7, 0x2FBD, 0x1E33,
- 0x2FBE, 0x09F8, 0x2FBF, 0x1E34, 0x2FC0, 0x09F9, 0x2FC1, 0x09FA,
- 0x2FC2, 0x0BE1, 0x2FC3, 0x0BE2, 0x2FC4, 0x0BE3, 0x2FC5, 0x0BE4,
- 0x2FC6, 0x0BE5, 0x2FC7, 0x0BE6, 0x2FC8, 0x0DBB, 0x2FC9, 0x0DBC,
- 0x2FCA, 0x0DBD, 0x2FCB, 0x2360, 0x2FCC, 0x2612, 0x2FCD, 0x0F7B,
- 0x2FCE, 0x0F7C, 0x2FCF, 0x0F7D, 0x2FD0, 0x1100, 0x2FD1, 0x1101,
- 0x2FD2, 0x1289, 0x2FD3, 0x13B2, 0x2FD4, 0x13B3, 0x2FD5, 0x2F0D,
- 0x3000, 0x0063, 0x3001, 0x0065, 0x3002, 0x0066, 0x3003, 0x00B3,
- 0x3005, 0x35BA, 0x3006, 0x35BB, 0x3007, 0x35BC, 0x3008, 0x0094,
- 0x3009, 0x0095, 0x300A, 0x0090, 0x300B, 0x0091, 0x300C, 0x0098,
- 0x300D, 0x0099, 0x300E, 0x009C, 0x300F, 0x009D, 0x3010, 0x008C,
- 0x3011, 0x008D, 0x3012, 0x0105, 0x3014, 0x0088, 0x3015, 0x0089,
- 0x301D, 0x00AA, 0x301E, 0x00AB, 0x3021, 0x0161, 0x3022, 0x0162,
- 0x3023, 0x0163, 0x3024, 0x0164, 0x3025, 0x0165, 0x3026, 0x0166,
- 0x3027, 0x0167, 0x3028, 0x0168, 0x3029, 0x0169, 0x3038, 0x016A,
- 0x3039, 0x016B, 0x303A, 0x016C, 0x3041, 0x35C1, 0x3042, 0x35C2,
- 0x3043, 0x35C3, 0x3044, 0x35C4, 0x3045, 0x35C5, 0x3046, 0x35C6,
- 0x3047, 0x35C7, 0x3048, 0x35C8, 0x3049, 0x35C9, 0x304A, 0x35CA,
- 0x304B, 0x35CB, 0x304C, 0x35CC, 0x304D, 0x35CD, 0x304E, 0x35CE,
- 0x304F, 0x35CF, 0x3050, 0x35D0, 0x3051, 0x35D1, 0x3052, 0x35D2,
- 0x3053, 0x35D3, 0x3054, 0x35D4, 0x3055, 0x35D5, 0x3056, 0x35D6,
- 0x3057, 0x35D7, 0x3058, 0x35D8, 0x3059, 0x35D9, 0x305A, 0x35DA,
- 0x305B, 0x35DB, 0x305C, 0x35DC, 0x305D, 0x35DD, 0x305E, 0x35DE,
- 0x305F, 0x35DF, 0x3060, 0x35E0, 0x3061, 0x35E1, 0x3062, 0x35E2,
- 0x3063, 0x35E3, 0x3064, 0x35E4, 0x3065, 0x35E5, 0x3066, 0x35E6,
- 0x3067, 0x35E7, 0x3068, 0x35E8, 0x3069, 0x35E9, 0x306A, 0x35EA,
- 0x306B, 0x35EB, 0x306C, 0x35EC, 0x306D, 0x35ED, 0x306E, 0x35EE,
- 0x306F, 0x35EF, 0x3070, 0x35F0, 0x3071, 0x35F1, 0x3072, 0x35F2,
- 0x3073, 0x35F3, 0x3074, 0x35F4, 0x3075, 0x35F5, 0x3076, 0x35F6,
- 0x3077, 0x35F7, 0x3078, 0x35F8, 0x3079, 0x35F9, 0x307A, 0x35FA,
- 0x307B, 0x35FB, 0x307C, 0x35FC, 0x307D, 0x35FD, 0x307E, 0x35FE,
- 0x307F, 0x35FF, 0x3080, 0x3600, 0x3081, 0x3601, 0x3082, 0x3602,
- 0x3083, 0x3603, 0x3084, 0x3604, 0x3085, 0x3605, 0x3086, 0x3606,
- 0x3087, 0x3607, 0x3088, 0x3608, 0x3089, 0x3609, 0x308A, 0x360A,
- 0x308B, 0x360B, 0x308C, 0x360C, 0x308D, 0x360D, 0x308E, 0x360E,
- 0x308F, 0x360F, 0x3090, 0x3610, 0x3091, 0x3611, 0x3092, 0x3612,
- 0x3093, 0x3613, 0x309D, 0x35B7, 0x309E, 0x35B8, 0x30A1, 0x3614,
- 0x30A2, 0x3615, 0x30A3, 0x3616, 0x30A4, 0x3617, 0x30A5, 0x3618,
- 0x30A6, 0x3619, 0x30A7, 0x361A, 0x30A8, 0x361B, 0x30A9, 0x361C,
- 0x30AA, 0x361D, 0x30AB, 0x361E, 0x30AC, 0x361F, 0x30AD, 0x3620,
- 0x30AE, 0x3621, 0x30AF, 0x3622, 0x30B0, 0x3623, 0x30B1, 0x3624,
- 0x30B2, 0x3625, 0x30B3, 0x3626, 0x30B4, 0x3627, 0x30B5, 0x3628,
- 0x30B6, 0x3629, 0x30B7, 0x362A, 0x30B8, 0x362B, 0x30B9, 0x362C,
- 0x30BA, 0x362D, 0x30BB, 0x362E, 0x30BC, 0x362F, 0x30BD, 0x3630,
- 0x30BE, 0x3631, 0x30BF, 0x3632, 0x30C0, 0x3633, 0x30C1, 0x3634,
- 0x30C2, 0x3635, 0x30C3, 0x3636, 0x30C4, 0x3637, 0x30C5, 0x3638,
- 0x30C6, 0x3639, 0x30C7, 0x363A, 0x30C8, 0x363B, 0x30C9, 0x363C,
- 0x30CA, 0x363D, 0x30CB, 0x363E, 0x30CC, 0x363F, 0x30CD, 0x3640,
- 0x30CE, 0x3641, 0x30CF, 0x3642, 0x30D0, 0x3643, 0x30D1, 0x3644,
- 0x30D2, 0x3645, 0x30D3, 0x3646, 0x30D4, 0x3647, 0x30D5, 0x3648,
- 0x30D6, 0x3649, 0x30D7, 0x364A, 0x30D8, 0x364B, 0x30D9, 0x364C,
- 0x30DA, 0x364D, 0x30DB, 0x364E, 0x30DC, 0x364F, 0x30DD, 0x3650,
- 0x30DE, 0x3651, 0x30DF, 0x3652, 0x30E0, 0x3653, 0x30E1, 0x3654,
- 0x30E2, 0x3655, 0x30E3, 0x3656, 0x30E4, 0x3657, 0x30E5, 0x3658,
- 0x30E6, 0x3659, 0x30E7, 0x365A, 0x30E8, 0x365B, 0x30E9, 0x365C,
- 0x30EA, 0x365D, 0x30EB, 0x365E, 0x30EC, 0x365F, 0x30ED, 0x3660,
- 0x30EE, 0x3661, 0x30EF, 0x3662, 0x30F0, 0x3663, 0x30F1, 0x3664,
- 0x30F2, 0x3665, 0x30F3, 0x3666, 0x30F4, 0x3667, 0x30F5, 0x3668,
- 0x30F6, 0x3669, 0x30FC, 0x35BD, 0x30FD, 0x35B5, 0x30FE, 0x35B6,
- 0x3105, 0x01D1, 0x3106, 0x01D2, 0x3107, 0x01D3, 0x3108, 0x01D4,
- 0x3109, 0x01D5, 0x310A, 0x01D6, 0x310B, 0x01D7, 0x310C, 0x01D8,
- 0x310D, 0x01D9, 0x310E, 0x01DA, 0x310F, 0x01DB, 0x3110, 0x01DC,
- 0x3111, 0x01DD, 0x3112, 0x01DE, 0x3113, 0x01DF, 0x3114, 0x01E0,
- 0x3115, 0x01E1, 0x3116, 0x01E2, 0x3117, 0x01E3, 0x3118, 0x01E4,
- 0x3119, 0x01E5, 0x311A, 0x01E6, 0x311B, 0x01E7, 0x311C, 0x01E8,
- 0x311D, 0x01E9, 0x311E, 0x01EA, 0x311F, 0x01EB, 0x3120, 0x01EC,
- 0x3121, 0x01ED, 0x3122, 0x01EE, 0x3123, 0x01EF, 0x3124, 0x01F0,
- 0x3125, 0x01F1, 0x3126, 0x01F2, 0x3127, 0x01F3, 0x3128, 0x01F4,
- 0x3129, 0x01F5, 0x3231, 0x36E5, 0x32A3, 0x00C1, 0x338E, 0x0115,
- 0x338F, 0x0116, 0x339C, 0x0110, 0x339D, 0x0111, 0x339E, 0x0112,
- 0x33A1, 0x0114, 0x33C4, 0x0117, 0x33CE, 0x0113, 0x33D1, 0x00EC,
- 0x33D2, 0x00EB, 0x33D5, 0x010F, 0x361D, 0x36B7, 0x4491, 0x36B4,
- 0x4E00, 0x0253, 0x4E01, 0x0255, 0x4E03, 0x0256, 0x4E07, 0x1771,
- 0x4E08, 0x0269, 0x4E09, 0x0267, 0x4E0A, 0x026A, 0x4E0B, 0x0268,
- 0x4E0C, 0x1772, 0x4E0D, 0x0294, 0x4E0E, 0x177A, 0x4E0F, 0x1778,
- 0x4E10, 0x0293, 0x4E11, 0x0292, 0x4E14, 0x02F2, 0x4E15, 0x02F1,
- 0x4E16, 0x02F0, 0x4E18, 0x02F3, 0x4E19, 0x02EF, 0x4E1E, 0x036E,
- 0x4E1F, 0x036F, 0x4E26, 0x0528, 0x4E28, 0x0218, 0x4E2B, 0x026B,
- 0x4E2D, 0x0295, 0x4E2E, 0x177B, 0x4E30, 0x0296, 0x4E31, 0x178E,
- 0x4E32, 0x0415, 0x4E33, 0x18F4, 0x4E36, 0x0219, 0x4E38, 0x026C,
- 0x4E39, 0x0297, 0x4E3B, 0x02F4, 0x4E3C, 0x178F, 0x4E3F, 0x021A,
- 0x4E41, 0x36AF, 0x4E42, 0x176C, 0x4E43, 0x0257, 0x4E45, 0x026E,
- 0x4E47, 0x1773, 0x4E48, 0x026F, 0x4E4B, 0x0298, 0x4E4D, 0x02F5,
- 0x4E4E, 0x02F7, 0x4E4F, 0x02F6, 0x4E52, 0x0370, 0x4E53, 0x0371,
- 0x4E56, 0x0529, 0x4E58, 0x0831, 0x4E59, 0x0254, 0x4E5A, 0x36B1,
- 0x4E5C, 0x176D, 0x4E5D, 0x0258, 0x4E5E, 0x0271, 0x4E5F, 0x0270,
- 0x4E69, 0x0372, 0x4E73, 0x052A, 0x4E7E, 0x09FB, 0x4E7F, 0x1E35,
- 0x4E82, 0x0DBE, 0x4E83, 0x2361, 0x4E84, 0x2362, 0x4E85, 0x021B,
- 0x4E86, 0x0259, 0x4E88, 0x029A, 0x4E8B, 0x052B, 0x4E8C, 0x025A,
- 0x4E8D, 0x1774, 0x4E8E, 0x0272, 0x4E91, 0x029B, 0x4E92, 0x029D,
- 0x4E93, 0x177C, 0x4E94, 0x029E, 0x4E95, 0x029C, 0x4E99, 0x0373,
- 0x4E9B, 0x052C, 0x4E9E, 0x052D, 0x4E9F, 0x06A3, 0x4EA0, 0x021C,
- 0x4EA1, 0x0273, 0x4EA2, 0x029F, 0x4EA4, 0x0374, 0x4EA5, 0x0376,
- 0x4EA6, 0x0375, 0x4EA8, 0x0416, 0x4EAB, 0x052E, 0x4EAC, 0x052F,
- 0x4EAD, 0x06A4, 0x4EAE, 0x06A5, 0x4EB3, 0x0832, 0x4EB6, 0x2363,
- 0x4EB9, 0x3377, 0x4EBA, 0x025B, 0x4EC0, 0x02A1, 0x4EC1, 0x02A0,
- 0x4EC2, 0x177D, 0x4EC3, 0x02A2, 0x4EC4, 0x02A8, 0x4EC6, 0x02A3,
- 0x4EC7, 0x02A4, 0x4EC8, 0x177F, 0x4EC9, 0x177E, 0x4ECA, 0x02A6,
- 0x4ECB, 0x02A7, 0x4ECD, 0x02A5, 0x4ED4, 0x02FA, 0x4ED5, 0x02FB,
- 0x4ED6, 0x02FC, 0x4ED7, 0x02FD, 0x4ED8, 0x02F9, 0x4ED9, 0x0300,
- 0x4EDA, 0x1795, 0x4EDC, 0x1791, 0x4EDD, 0x1794, 0x4EDE, 0x0301,
- 0x4EDF, 0x0311, 0x4EE1, 0x1793, 0x4EE3, 0x02FE, 0x4EE4, 0x02FF,
- 0x4EE5, 0x02F8, 0x4EE8, 0x1790, 0x4EE9, 0x1792, 0x4EF0, 0x0383,
- 0x4EF1, 0x17BA, 0x4EF2, 0x0380, 0x4EF3, 0x0384, 0x4EF4, 0x17C4,
- 0x4EF5, 0x17B8, 0x4EF6, 0x0381, 0x4EF7, 0x17BC, 0x4EFB, 0x0382,
- 0x4EFD, 0x0385, 0x4EFF, 0x0377, 0x4F00, 0x17BB, 0x4F01, 0x0386,
- 0x4F02, 0x17BF, 0x4F04, 0x17C3, 0x4F05, 0x17C0, 0x4F08, 0x17BD,
- 0x4F09, 0x0378, 0x4F0A, 0x037A, 0x4F0B, 0x0387, 0x4F0D, 0x037C,
- 0x4F0E, 0x17B5, 0x4F0F, 0x037F, 0x4F10, 0x037D, 0x4F11, 0x037E,
- 0x4F12, 0x17C5, 0x4F13, 0x17C2, 0x4F14, 0x17B9, 0x4F15, 0x037B,
- 0x4F18, 0x17B6, 0x4F19, 0x0379, 0x4F1D, 0x17BE, 0x4F22, 0x17C1,
- 0x4F2C, 0x17B7, 0x4F2D, 0x182F, 0x4F2F, 0x042C, 0x4F30, 0x041F,
- 0x4F33, 0x1830, 0x4F34, 0x041C, 0x4F36, 0x042E, 0x4F38, 0x0424,
- 0x4F3A, 0x0423, 0x4F3B, 0x1824, 0x4F3C, 0x0427, 0x4F3D, 0x0422,
- 0x4F3E, 0x1829, 0x4F3F, 0x1831, 0x4F41, 0x182D, 0x4F43, 0x0425,
- 0x4F46, 0x0428, 0x4F47, 0x0419, 0x4F48, 0x0431, 0x4F49, 0x1826,
- 0x4F4C, 0x1900, 0x4F4D, 0x0417, 0x4F4E, 0x042D, 0x4F4F, 0x0418,
- 0x4F50, 0x0420, 0x4F51, 0x0421, 0x4F52, 0x182B, 0x4F53, 0x1827,
- 0x4F54, 0x0426, 0x4F55, 0x041E, 0x4F56, 0x1823, 0x4F57, 0x041A,
- 0x4F58, 0x182E, 0x4F59, 0x042F, 0x4F5A, 0x0432, 0x4F5B, 0x041D,
- 0x4F5C, 0x042A, 0x4F5D, 0x0430, 0x4F5E, 0x041B, 0x4F5F, 0x182C,
- 0x4F60, 0x042B, 0x4F61, 0x1832, 0x4F62, 0x1825, 0x4F63, 0x0429,
- 0x4F64, 0x1828, 0x4F67, 0x182A, 0x4F69, 0x053D, 0x4F6A, 0x1902,
- 0x4F6B, 0x190E, 0x4F6C, 0x0535, 0x4F6E, 0x190F, 0x4F6F, 0x0530,
- 0x4F70, 0x053A, 0x4F73, 0x0533, 0x4F74, 0x18FC, 0x4F75, 0x053B,
- 0x4F76, 0x18FB, 0x4F77, 0x18FF, 0x4F78, 0x1906, 0x4F79, 0x1904,
- 0x4F7A, 0x0543, 0x4F7B, 0x053E, 0x4F7C, 0x18F6, 0x4F7D, 0x18F8,
- 0x4F7E, 0x0540, 0x4F7F, 0x0534, 0x4F80, 0x18F9, 0x4F81, 0x1905,
- 0x4F82, 0x190C, 0x4F83, 0x0539, 0x4F84, 0x18FE, 0x4F85, 0x18F7,
- 0x4F86, 0x0538, 0x4F87, 0x18FA, 0x4F88, 0x053C, 0x4F89, 0x18FD,
- 0x4F8B, 0x0537, 0x4F8D, 0x0532, 0x4F8F, 0x0541, 0x4F90, 0x1907,
- 0x4F91, 0x0542, 0x4F92, 0x190B, 0x4F94, 0x1909, 0x4F95, 0x190D,
- 0x4F96, 0x053F, 0x4F97, 0x1901, 0x4F98, 0x18F5, 0x4F9A, 0x1903,
- 0x4F9B, 0x0536, 0x4F9C, 0x1908, 0x4F9D, 0x0531, 0x4F9E, 0x190A,
- 0x4FAE, 0x06B4, 0x4FAF, 0x06A8, 0x4FB2, 0x1A5D, 0x4FB3, 0x1A65,
- 0x4FB5, 0x06A7, 0x4FB6, 0x06AF, 0x4FB7, 0x06BB, 0x4FB9, 0x1A6B,
- 0x4FBA, 0x1A69, 0x4FBB, 0x1A64, 0x4FBF, 0x06A9, 0x4FC0, 0x1A6A,
- 0x4FC1, 0x1A60, 0x4FC2, 0x06B7, 0x4FC3, 0x06AE, 0x4FC4, 0x06B6,
- 0x4FC5, 0x1A5B, 0x4FC7, 0x1A67, 0x4FC9, 0x1A5E, 0x4FCA, 0x06B2,
- 0x4FCB, 0x1A5F, 0x4FCD, 0x1A5A, 0x4FCE, 0x06B9, 0x4FCF, 0x06AC,
- 0x4FD0, 0x06B5, 0x4FD1, 0x06AB, 0x4FD3, 0x1A5C, 0x4FD4, 0x1A61,
- 0x4FD6, 0x1A68, 0x4FD7, 0x06B3, 0x4FD8, 0x06B0, 0x4FD9, 0x1A63,
- 0x4FDA, 0x06B8, 0x4FDB, 0x1A66, 0x4FDC, 0x1A62, 0x4FDD, 0x06AD,
- 0x4FDE, 0x06BA, 0x4FDF, 0x06B1, 0x4FE0, 0x06AA, 0x4FE1, 0x06A6,
- 0x4FEC, 0x1A6C, 0x4FEE, 0x084C, 0x4FEF, 0x0836, 0x4FF1, 0x0846,
- 0x4FF3, 0x084B, 0x4FF4, 0x1C24, 0x4FF5, 0x1C23, 0x4FF6, 0x1C28,
- 0x4FF7, 0x1C29, 0x4FF8, 0x0839, 0x4FFA, 0x0842, 0x4FFE, 0x084F,
- 0x5000, 0x0843, 0x5005, 0x1C1D, 0x5006, 0x083C, 0x5007, 0x1C1E,
- 0x5009, 0x0851, 0x500B, 0x0848, 0x500C, 0x0833, 0x500D, 0x0834,
- 0x500E, 0x1C31, 0x500F, 0x0A0C, 0x5011, 0x0841, 0x5012, 0x0840,
- 0x5013, 0x1C1F, 0x5014, 0x0844, 0x5015, 0x1E45, 0x5016, 0x083B,
- 0x5017, 0x1C2A, 0x5018, 0x084A, 0x5019, 0x0849, 0x501A, 0x083F,
- 0x501B, 0x1C22, 0x501C, 0x1C2B, 0x501E, 0x1C1C, 0x501F, 0x083E,
- 0x5020, 0x1C2C, 0x5021, 0x0847, 0x5022, 0x1C20, 0x5023, 0x0835,
- 0x5025, 0x0838, 0x5026, 0x0837, 0x5027, 0x1C2D, 0x5028, 0x0845,
- 0x5029, 0x083A, 0x502A, 0x084E, 0x502B, 0x0850, 0x502C, 0x1C27,
- 0x502D, 0x084D, 0x502F, 0x1C2F, 0x5030, 0x1C21, 0x5031, 0x1C30,
- 0x5033, 0x1C25, 0x5035, 0x1C2E, 0x5037, 0x1C26, 0x503C, 0x083D,
- 0x5040, 0x1E4D, 0x5041, 0x1E41, 0x5043, 0x0A00, 0x5045, 0x1E46,
- 0x5046, 0x1E4C, 0x5047, 0x09FF, 0x5048, 0x1E3F, 0x5049, 0x0A03,
- 0x504A, 0x1E43, 0x504B, 0x1E3C, 0x504C, 0x0A01, 0x504D, 0x1E40,
- 0x504E, 0x0A06, 0x504F, 0x0A0B, 0x5051, 0x1E51, 0x5053, 0x1E3B,
- 0x5055, 0x0A07, 0x5057, 0x1E50, 0x505A, 0x0A02, 0x505B, 0x1E42,
- 0x505C, 0x09FE, 0x505D, 0x1E3D, 0x505E, 0x1E39, 0x505F, 0x1E47,
- 0x5060, 0x1E3A, 0x5061, 0x1E38, 0x5062, 0x1E44, 0x5063, 0x1E4A,
- 0x5064, 0x1E4B, 0x5065, 0x0A04, 0x5068, 0x20B8, 0x5069, 0x1E48,
- 0x506A, 0x1E37, 0x506B, 0x1E49, 0x506D, 0x0A0E, 0x506E, 0x1E4E,
- 0x506F, 0x0A0D, 0x5070, 0x1E36, 0x5072, 0x1E3E, 0x5073, 0x1E4F,
- 0x5074, 0x0A09, 0x5075, 0x0A08, 0x5076, 0x0A05, 0x5077, 0x0A0A,
- 0x507A, 0x09FC, 0x507D, 0x09FD, 0x5080, 0x0BEC, 0x5082, 0x20BB,
- 0x5083, 0x20B4, 0x5085, 0x0BE9, 0x5087, 0x20BC, 0x508B, 0x20B2,
- 0x508C, 0x20B5, 0x508D, 0x0BE8, 0x508E, 0x20B6, 0x5091, 0x0BEB,
- 0x5092, 0x20BA, 0x5094, 0x20B0, 0x5095, 0x20AF, 0x5096, 0x0BED,
- 0x5098, 0x0BEE, 0x5099, 0x0BEA, 0x509A, 0x0BEF, 0x509B, 0x20AE,
- 0x509C, 0x20B9, 0x509D, 0x20B7, 0x509E, 0x20B1, 0x50A2, 0x0BE7,
- 0x50A3, 0x20B3, 0x50AC, 0x0DC5, 0x50AD, 0x0DBF, 0x50AE, 0x2367,
- 0x50AF, 0x0DC8, 0x50B0, 0x236D, 0x50B1, 0x2370, 0x50B2, 0x0DC1,
- 0x50B3, 0x0DC2, 0x50B4, 0x236A, 0x50B5, 0x0DC0, 0x50B6, 0x2373,
- 0x50B7, 0x0DC6, 0x50B8, 0x2374, 0x50BA, 0x236F, 0x50BB, 0x0DC7,
- 0x50BD, 0x2364, 0x50BE, 0x0DC4, 0x50BF, 0x2365, 0x50C1, 0x236E,
- 0x50C2, 0x236C, 0x50C4, 0x2368, 0x50C5, 0x0DC3, 0x50C6, 0x2366,
- 0x50C7, 0x0DC9, 0x50C8, 0x236B, 0x50C9, 0x2372, 0x50CA, 0x2369,
- 0x50CB, 0x2371, 0x50CE, 0x0F88, 0x50CF, 0x0F85, 0x50D1, 0x0F86,
- 0x50D3, 0x261C, 0x50D4, 0x2614, 0x50D5, 0x0F84, 0x50D6, 0x0F81,
- 0x50D7, 0x2615, 0x50DA, 0x0F83, 0x50DB, 0x2618, 0x50DD, 0x261A,
- 0x50E0, 0x2621, 0x50E3, 0x2620, 0x50E4, 0x261B, 0x50E5, 0x0F80,
- 0x50E6, 0x2613, 0x50E7, 0x0F7E, 0x50E8, 0x2616, 0x50E9, 0x0F89,
- 0x50EA, 0x2619, 0x50EC, 0x261D, 0x50ED, 0x0F82, 0x50EE, 0x0F7F,
- 0x50EF, 0x261F, 0x50F0, 0x261E, 0x50F1, 0x0F87, 0x50F3, 0x2617,
- 0x50F5, 0x1105, 0x50F6, 0x2883, 0x50F8, 0x2880, 0x50F9, 0x1106,
- 0x50FB, 0x1104, 0x50FD, 0x2887, 0x50FE, 0x2884, 0x50FF, 0x287D,
- 0x5100, 0x1103, 0x5102, 0x1107, 0x5103, 0x287E, 0x5104, 0x1102,
- 0x5105, 0x110A, 0x5106, 0x2881, 0x5107, 0x2882, 0x5108, 0x1108,
- 0x5109, 0x1109, 0x510A, 0x2888, 0x510B, 0x2885, 0x510C, 0x2886,
- 0x5110, 0x128D, 0x5111, 0x2B04, 0x5112, 0x128A, 0x5113, 0x2B01,
- 0x5114, 0x128C, 0x5115, 0x128E, 0x5117, 0x2B02, 0x5118, 0x128B,
- 0x511A, 0x2B03, 0x511C, 0x2B00, 0x511F, 0x13B5, 0x5120, 0x2D3E,
- 0x5121, 0x13B6, 0x5122, 0x2D3C, 0x5124, 0x2D3D, 0x5125, 0x2D3B,
- 0x5126, 0x2D3A, 0x5129, 0x2D3F, 0x512A, 0x13B4, 0x512D, 0x2F0F,
- 0x512E, 0x2F10, 0x5130, 0x287F, 0x5131, 0x2F0E, 0x5132, 0x13B7,
- 0x5133, 0x1575, 0x5134, 0x307A, 0x5135, 0x307B, 0x5137, 0x1668,
- 0x5138, 0x1669, 0x5139, 0x32C6, 0x513A, 0x32C5, 0x513B, 0x16BC,
- 0x513C, 0x16BB, 0x513D, 0x340E, 0x513F, 0x025C, 0x5140, 0x0274,
- 0x5141, 0x02AA, 0x5143, 0x02A9, 0x5144, 0x0303, 0x5145, 0x0302,
- 0x5146, 0x038A, 0x5147, 0x0389, 0x5148, 0x038B, 0x5149, 0x0388,
- 0x514B, 0x0434, 0x514C, 0x0433, 0x514D, 0x0435, 0x5152, 0x0545,
- 0x5154, 0x0544, 0x5155, 0x0546, 0x5157, 0x06BC, 0x5159, 0x0119,
- 0x515A, 0x1C32, 0x515B, 0x011A, 0x515C, 0x0A0F, 0x515D, 0x011C,
- 0x515E, 0x011B, 0x515F, 0x20BD, 0x5161, 0x011D, 0x5162, 0x0F8A,
- 0x5163, 0x011E, 0x5165, 0x025D, 0x5167, 0x02AB, 0x5168, 0x038C,
- 0x5169, 0x0547, 0x516B, 0x025E, 0x516C, 0x02AE, 0x516D, 0x02AC,
- 0x516E, 0x02AD, 0x5171, 0x038D, 0x5175, 0x0436, 0x5176, 0x0549,
- 0x5177, 0x0548, 0x5178, 0x054A, 0x517C, 0x0852, 0x5180, 0x128F,
- 0x5182, 0x021D, 0x5187, 0x1779, 0x5188, 0x36B6, 0x5189, 0x0304,
- 0x518A, 0x0305, 0x518D, 0x038E, 0x518F, 0x1833, 0x5191, 0x06BE,
- 0x5192, 0x06BD, 0x5193, 0x1C34, 0x5194, 0x1C33, 0x5195, 0x0A10,
- 0x5196, 0x021E, 0x5197, 0x02AF, 0x5198, 0x1780, 0x519E, 0x1910,
- 0x51A0, 0x06BF, 0x51A2, 0x0855, 0x51A4, 0x0853, 0x51A5, 0x0854,
- 0x51AA, 0x1290, 0x51AB, 0x021F, 0x51AC, 0x0306, 0x51B0, 0x038F,
- 0x51B1, 0x17C6, 0x51B6, 0x0437, 0x51B7, 0x0438, 0x51B9, 0x1834,
- 0x51BC, 0x1911, 0x51BD, 0x054B, 0x51BE, 0x1912, 0x51C4, 0x1C36,
- 0x51C5, 0x1C37, 0x51C6, 0x0858, 0x51C8, 0x1C38, 0x51CA, 0x1C35,
- 0x51CB, 0x0859, 0x51CC, 0x0857, 0x51CD, 0x0856, 0x51CE, 0x1C39,
- 0x51D0, 0x1E52, 0x51D4, 0x20BE, 0x51D7, 0x2375, 0x51D8, 0x2622,
- 0x51DC, 0x110B, 0x51DD, 0x1291, 0x51DE, 0x2B05, 0x51E0, 0x025F,
- 0x51E1, 0x026D, 0x51F0, 0x0A11, 0x51F1, 0x0BF1, 0x51F3, 0x0F8B,
- 0x51F5, 0x176E, 0x51F6, 0x02B0, 0x51F8, 0x0309, 0x51F9, 0x0307,
- 0x51FA, 0x0308, 0x51FD, 0x054C, 0x5200, 0x0260, 0x5201, 0x0261,
- 0x5202, 0x36B3, 0x5203, 0x0275, 0x5206, 0x02B1, 0x5207, 0x02B2,
- 0x5208, 0x02B3, 0x5209, 0x1797, 0x520A, 0x030A, 0x520C, 0x1796,
- 0x520E, 0x0393, 0x5210, 0x17C8, 0x5211, 0x0391, 0x5212, 0x0392,
- 0x5213, 0x17C7, 0x5216, 0x0394, 0x5217, 0x0390, 0x521C, 0x1835,
- 0x521D, 0x068B, 0x521E, 0x1836, 0x5221, 0x1837, 0x5224, 0x043A,
- 0x5225, 0x0439, 0x5228, 0x043D, 0x5229, 0x043B, 0x522A, 0x043C,
- 0x522E, 0x0552, 0x5230, 0x0551, 0x5231, 0x1917, 0x5232, 0x1914,
- 0x5233, 0x1915, 0x5235, 0x1913, 0x5236, 0x0553, 0x5237, 0x054F,
- 0x5238, 0x054E, 0x523A, 0x0550, 0x523B, 0x054D, 0x5241, 0x0554,
- 0x5243, 0x06C1, 0x5244, 0x1A6D, 0x5246, 0x1916, 0x5247, 0x06C6,
- 0x5249, 0x1A6E, 0x524A, 0x06C2, 0x524B, 0x06C5, 0x524C, 0x06C4,
- 0x524D, 0x06C3, 0x524E, 0x06C0, 0x5252, 0x1C3C, 0x5254, 0x085C,
- 0x5255, 0x1C3F, 0x5256, 0x085A, 0x525A, 0x1C3B, 0x525B, 0x085D,
- 0x525C, 0x085B, 0x525D, 0x085E, 0x525E, 0x1C3D, 0x525F, 0x1C3E,
- 0x5261, 0x1C3A, 0x5262, 0x1C40, 0x5269, 0x0BF5, 0x526A, 0x0A12,
- 0x526B, 0x1E53, 0x526C, 0x1E55, 0x526D, 0x1E54, 0x526E, 0x1E56,
- 0x526F, 0x0A13, 0x5272, 0x0BF2, 0x5274, 0x0BF3, 0x5275, 0x0BF4,
- 0x5277, 0x0DCB, 0x5278, 0x2377, 0x527A, 0x2376, 0x527B, 0x2378,
- 0x527C, 0x2379, 0x527D, 0x0DCC, 0x527F, 0x0DCA, 0x5280, 0x2623,
- 0x5281, 0x2624, 0x5282, 0x0F8D, 0x5283, 0x0F8C, 0x5284, 0x2776,
- 0x5287, 0x110C, 0x5288, 0x110D, 0x5289, 0x110E, 0x528A, 0x1110,
- 0x528B, 0x2889, 0x528C, 0x288A, 0x528D, 0x110F, 0x5291, 0x1292,
- 0x5293, 0x1293, 0x5296, 0x307C, 0x5297, 0x32C8, 0x5298, 0x32C7,
- 0x5299, 0x340F, 0x529B, 0x0262, 0x529F, 0x030C, 0x52A0, 0x030B,
- 0x52A3, 0x0395, 0x52A6, 0x17C9, 0x52A9, 0x043F, 0x52AA, 0x0440,
- 0x52AB, 0x043E, 0x52AC, 0x0441, 0x52AD, 0x1838, 0x52AE, 0x1839,
- 0x52BB, 0x0556, 0x52BC, 0x1918, 0x52BE, 0x0555, 0x52C0, 0x1A6F,
- 0x52C1, 0x06CA, 0x52C2, 0x1A70, 0x52C3, 0x06C9, 0x52C7, 0x06C7,
- 0x52C9, 0x06C8, 0x52CD, 0x1C41, 0x52D2, 0x0A14, 0x52D3, 0x1E58,
- 0x52D5, 0x0A17, 0x52D6, 0x1E57, 0x52D7, 0x0ACF, 0x52D8, 0x0A16,
- 0x52D9, 0x0A15, 0x52DB, 0x0BF8, 0x52DD, 0x0BF7, 0x52DE, 0x0BF6,
- 0x52DF, 0x0DCD, 0x52E2, 0x0DD0, 0x52E3, 0x0DD1, 0x52E4, 0x0DCF,
- 0x52E6, 0x0DCE, 0x52E9, 0x2625, 0x52EB, 0x2626, 0x52EF, 0x288C,
- 0x52F0, 0x1111, 0x52F1, 0x288B, 0x52F3, 0x1294, 0x52F4, 0x2D40,
- 0x52F5, 0x13B8, 0x52F7, 0x307D, 0x52F8, 0x1609, 0x52F9, 0x0220,
- 0x52FA, 0x0276, 0x52FB, 0x02B4, 0x52FC, 0x1781, 0x52FE, 0x02B5,
- 0x52FF, 0x02B6, 0x5305, 0x030D, 0x5306, 0x030E, 0x5308, 0x0396,
- 0x5309, 0x183A, 0x530A, 0x1919, 0x530B, 0x191A, 0x530D, 0x06CB,
- 0x530E, 0x1C42, 0x530F, 0x0A19, 0x5310, 0x0A18, 0x5311, 0x20C0,
- 0x5312, 0x20BF, 0x5315, 0x0263, 0x5316, 0x02B7, 0x5317, 0x030F,
- 0x5319, 0x0A1A, 0x531A, 0x176F, 0x531C, 0x1798, 0x531D, 0x0310,
- 0x531F, 0x17CB, 0x5320, 0x0398, 0x5321, 0x0397, 0x5322, 0x17CA,
- 0x5323, 0x0442, 0x532A, 0x085F, 0x532D, 0x1E59, 0x532F, 0x0DD2,
- 0x5330, 0x2627, 0x5331, 0x0F8E, 0x5334, 0x2B06, 0x5337, 0x31C7,
- 0x5338, 0x0221, 0x5339, 0x02B8, 0x533C, 0x191B, 0x533D, 0x1A71,
- 0x533E, 0x0A1D, 0x533F, 0x0A1B, 0x5340, 0x0A1C, 0x5341, 0x0264,
- 0x5343, 0x0277, 0x5344, 0x016B, 0x5345, 0x02BB, 0x5347, 0x02BA,
- 0x5348, 0x02B9, 0x5349, 0x0313, 0x534A, 0x0312, 0x534C, 0x1799,
- 0x534D, 0x17CC, 0x5351, 0x055A, 0x5352, 0x0557, 0x5353, 0x0559,
- 0x5354, 0x0558, 0x5357, 0x06CC, 0x535A, 0x0BF9, 0x535C, 0x0265,
- 0x535E, 0x02BC, 0x5360, 0x0315, 0x5361, 0x0314, 0x5363, 0x183B,
- 0x5366, 0x055B, 0x5369, 0x0222, 0x536C, 0x1782, 0x536E, 0x0317,
- 0x536F, 0x0316, 0x5370, 0x0399, 0x5371, 0x039A, 0x5372, 0x183C,
- 0x5373, 0x0443, 0x5375, 0x0444, 0x5377, 0x055C, 0x5378, 0x055D,
- 0x5379, 0x055E, 0x537B, 0x06CD, 0x537C, 0x1A72, 0x537F, 0x0860,
- 0x5382, 0x1770, 0x5384, 0x02BD, 0x538A, 0x17CD, 0x538E, 0x183D,
- 0x538F, 0x183E, 0x5392, 0x191C, 0x5394, 0x191D, 0x5396, 0x1A74,
- 0x5397, 0x1A73, 0x5398, 0x1A76, 0x5399, 0x1A75, 0x539A, 0x06CE,
- 0x539C, 0x1E5A, 0x539D, 0x0862, 0x539E, 0x1C43, 0x539F, 0x0861,
- 0x53A4, 0x20C1, 0x53A5, 0x0BFA, 0x53A7, 0x20C2, 0x53AC, 0x2628,
- 0x53AD, 0x0F8F, 0x53B2, 0x1112, 0x53B4, 0x307E, 0x53B6, 0x0223,
- 0x53B9, 0x1783, 0x53BB, 0x0318, 0x53C3, 0x0A1E, 0x53C8, 0x0266,
- 0x53C9, 0x0278, 0x53CA, 0x02BF, 0x53CB, 0x02BE, 0x53CD, 0x02C0,
- 0x53D4, 0x0560, 0x53D6, 0x055F, 0x53D7, 0x0561, 0x53DB, 0x06CF,
- 0x53DF, 0x0863, 0x53E1, 0x2B07, 0x53E2, 0x14C9, 0x53E3, 0x0279,
- 0x53E4, 0x031A, 0x53E5, 0x0329, 0x53E6, 0x0324, 0x53E8, 0x031F,
- 0x53E9, 0x031E, 0x53EA, 0x0325, 0x53EB, 0x0323, 0x53EC, 0x031C,
- 0x53ED, 0x032A, 0x53EE, 0x031D, 0x53EF, 0x0319, 0x53F0, 0x0328,
- 0x53F1, 0x0327, 0x53F2, 0x0326, 0x53F3, 0x031B, 0x53F5, 0x0322,
- 0x53F8, 0x0321, 0x53FB, 0x032B, 0x53FC, 0x0320, 0x5401, 0x03A0,
- 0x5403, 0x03A6, 0x5404, 0x03A2, 0x5406, 0x03A8, 0x5407, 0x17CE,
- 0x5408, 0x03A5, 0x5409, 0x039B, 0x540A, 0x039E, 0x540B, 0x03A1,
- 0x540C, 0x039D, 0x540D, 0x03A4, 0x540E, 0x03A7, 0x540F, 0x039C,
- 0x5410, 0x039F, 0x5411, 0x03A3, 0x5412, 0x03A9, 0x5418, 0x1847,
- 0x5419, 0x1844, 0x541B, 0x0451, 0x541C, 0x1845, 0x541D, 0x0445,
- 0x541E, 0x0447, 0x541F, 0x045F, 0x5420, 0x045A, 0x5424, 0x184C,
- 0x5425, 0x1846, 0x5426, 0x0449, 0x5427, 0x044B, 0x5428, 0x184B,
- 0x5429, 0x0452, 0x542A, 0x1841, 0x542B, 0x045E, 0x542C, 0x0460,
- 0x542D, 0x0446, 0x542E, 0x0457, 0x5430, 0x183F, 0x5431, 0x045D,
- 0x5433, 0x044E, 0x5435, 0x0458, 0x5436, 0x0459, 0x5437, 0x1840,
- 0x5438, 0x0456, 0x5439, 0x0454, 0x543B, 0x0455, 0x543C, 0x045B,
- 0x543D, 0x1848, 0x543E, 0x0448, 0x5440, 0x045C, 0x5441, 0x184A,
- 0x5442, 0x0450, 0x5443, 0x044D, 0x5445, 0x1843, 0x5446, 0x044C,
- 0x5447, 0x184D, 0x5448, 0x044F, 0x544A, 0x0453, 0x544E, 0x044A,
- 0x544F, 0x1849, 0x5454, 0x1842, 0x5460, 0x192E, 0x5461, 0x192D,
- 0x5462, 0x0573, 0x5463, 0x1930, 0x5464, 0x1932, 0x5465, 0x1927,
- 0x5466, 0x192A, 0x5467, 0x1931, 0x5468, 0x0574, 0x546B, 0x1924,
- 0x546C, 0x1928, 0x546F, 0x192C, 0x5470, 0x1A85, 0x5471, 0x056F,
- 0x5472, 0x1A89, 0x5473, 0x0562, 0x5474, 0x1929, 0x5475, 0x0563,
- 0x5476, 0x0570, 0x5477, 0x0569, 0x5478, 0x0565, 0x547A, 0x1925,
- 0x547B, 0x0568, 0x547C, 0x056D, 0x547D, 0x0576, 0x547E, 0x1926,
- 0x547F, 0x191F, 0x5480, 0x0567, 0x5481, 0x1920, 0x5482, 0x1922,
- 0x5484, 0x056A, 0x5486, 0x056C, 0x5487, 0x191E, 0x5488, 0x1923,
- 0x548B, 0x0575, 0x548C, 0x0571, 0x548D, 0x192B, 0x548E, 0x0577,
- 0x5490, 0x056E, 0x5491, 0x1921, 0x5492, 0x056B, 0x5495, 0x0566,
- 0x5496, 0x0564, 0x5498, 0x192F, 0x549A, 0x0572, 0x54A0, 0x1A84,
- 0x54A1, 0x1A78, 0x54A2, 0x1A87, 0x54A5, 0x1A7A, 0x54A6, 0x06D6,
- 0x54A7, 0x06E4, 0x54A8, 0x06D2, 0x54A9, 0x06E3, 0x54AA, 0x06DB,
- 0x54AB, 0x06E0, 0x54AC, 0x06D0, 0x54AD, 0x1A79, 0x54AE, 0x1A7F,
- 0x54AF, 0x06DF, 0x54B0, 0x1A8B, 0x54B1, 0x06E1, 0x54B3, 0x06D7,
- 0x54B6, 0x1A81, 0x54B7, 0x1A7E, 0x54B8, 0x06D5, 0x54BA, 0x1A77,
- 0x54BB, 0x06E2, 0x54BC, 0x1A86, 0x54BD, 0x06DA, 0x54BE, 0x1A88,
- 0x54BF, 0x06E5, 0x54C0, 0x06D1, 0x54C1, 0x06DC, 0x54C2, 0x06D9,
- 0x54C3, 0x1A7C, 0x54C4, 0x06DD, 0x54C5, 0x1A82, 0x54C6, 0x1A83,
- 0x54C7, 0x06D8, 0x54C8, 0x06DE, 0x54C9, 0x06D4, 0x54CE, 0x06D3,
- 0x54CF, 0x1A7B, 0x54D6, 0x1A80, 0x54DE, 0x1A8A, 0x54E0, 0x1C57,
- 0x54E1, 0x0870, 0x54E2, 0x1C45, 0x54E4, 0x1C4A, 0x54E5, 0x0869,
- 0x54E6, 0x0874, 0x54E7, 0x1C48, 0x54E8, 0x0864, 0x54E9, 0x086E,
- 0x54EA, 0x0873, 0x54EB, 0x1C4F, 0x54ED, 0x086F, 0x54EE, 0x0872,
- 0x54F1, 0x1C52, 0x54F2, 0x086A, 0x54F3, 0x1C49, 0x54F7, 0x1C55,
- 0x54F8, 0x1C56, 0x54FA, 0x086C, 0x54FB, 0x1C54, 0x54FC, 0x0868,
- 0x54FD, 0x0877, 0x54FF, 0x1C4C, 0x5501, 0x0866, 0x5503, 0x1C59,
- 0x5504, 0x1C4D, 0x5505, 0x1C51, 0x5506, 0x086B, 0x5507, 0x0876,
- 0x5508, 0x1C4E, 0x5509, 0x0871, 0x550A, 0x1C53, 0x550B, 0x1C5A,
- 0x550C, 0x1E69, 0x550E, 0x1C58, 0x550F, 0x0878, 0x5510, 0x0865,
- 0x5511, 0x1C50, 0x5512, 0x1C47, 0x5514, 0x086D, 0x5517, 0x1C46,
- 0x551A, 0x1C4B, 0x5526, 0x1C44, 0x5527, 0x0875, 0x552A, 0x1E61,
- 0x552C, 0x0A31, 0x552D, 0x1E6F, 0x552E, 0x0A2F, 0x552F, 0x0A2C,
- 0x5530, 0x1E66, 0x5531, 0x0A28, 0x5532, 0x1E6A, 0x5533, 0x0A33,
- 0x5534, 0x1E60, 0x5535, 0x1E65, 0x5536, 0x1E64, 0x5537, 0x0867,
- 0x5538, 0x0A2E, 0x5539, 0x1E6D, 0x553B, 0x1E70, 0x553C, 0x1E5D,
- 0x553E, 0x0C0C, 0x5540, 0x1E71, 0x5541, 0x0A34, 0x5543, 0x0A26,
- 0x5544, 0x0A23, 0x5545, 0x1E68, 0x5546, 0x0A20, 0x5548, 0x1E6E,
- 0x554A, 0x0A27, 0x554B, 0x1E72, 0x554D, 0x1E5E, 0x554E, 0x1E6C,
- 0x554F, 0x0A2A, 0x5550, 0x1E5F, 0x5551, 0x1E62, 0x5552, 0x1E67,
- 0x5555, 0x0A2B, 0x5556, 0x0A29, 0x5557, 0x0A35, 0x555C, 0x0A30,
- 0x555E, 0x0A24, 0x555F, 0x0ABC, 0x5561, 0x0A25, 0x5562, 0x1E63,
- 0x5563, 0x0A32, 0x5564, 0x0A2D, 0x5565, 0x1E6B, 0x5566, 0x0A22,
- 0x556A, 0x0A21, 0x5575, 0x1E5B, 0x5576, 0x1E5C, 0x5577, 0x20C7,
- 0x557B, 0x0BFB, 0x557C, 0x0BFE, 0x557D, 0x20D2, 0x557E, 0x0C12,
- 0x557F, 0x20D5, 0x5580, 0x0BFC, 0x5581, 0x20CE, 0x5582, 0x0C02,
- 0x5583, 0x0C08, 0x5584, 0x0D1B, 0x5587, 0x0C06, 0x5588, 0x20CB,
- 0x5589, 0x0C13, 0x558A, 0x0BFF, 0x558B, 0x0C07, 0x558C, 0x20D3,
- 0x558D, 0x2387, 0x558E, 0x20D8, 0x558F, 0x20CC, 0x5591, 0x20C3,
- 0x5592, 0x20D0, 0x5593, 0x20CA, 0x5594, 0x0C05, 0x5595, 0x20D6,
- 0x5598, 0x0C01, 0x5599, 0x0C15, 0x559A, 0x0C0E, 0x559C, 0x0C03,
- 0x559D, 0x0C00, 0x559F, 0x0C0B, 0x55A1, 0x20D7, 0x55A2, 0x20C9,
- 0x55A3, 0x20CF, 0x55A4, 0x20D1, 0x55A5, 0x20C5, 0x55A6, 0x20D4,
- 0x55A7, 0x0BFD, 0x55A8, 0x20C4, 0x55AA, 0x0C04, 0x55AB, 0x0C14,
- 0x55AC, 0x0C10, 0x55AD, 0x20C6, 0x55AE, 0x0C0A, 0x55B1, 0x0C11,
- 0x55B2, 0x0C0D, 0x55B3, 0x0C09, 0x55B5, 0x20CD, 0x55BB, 0x0C0F,
- 0x55BF, 0x2385, 0x55C0, 0x2381, 0x55C2, 0x2390, 0x55C3, 0x237A,
- 0x55C4, 0x2383, 0x55C5, 0x0DE0, 0x55C6, 0x0DE1, 0x55C7, 0x0DD9,
- 0x55C8, 0x238C, 0x55C9, 0x0DE3, 0x55CA, 0x237F, 0x55CB, 0x237E,
- 0x55CC, 0x237C, 0x55CD, 0x238E, 0x55CE, 0x0DD7, 0x55CF, 0x2388,
- 0x55D0, 0x237D, 0x55D1, 0x0DDA, 0x55D2, 0x2386, 0x55D3, 0x0DD5,
- 0x55D4, 0x2382, 0x55D5, 0x2389, 0x55D6, 0x238B, 0x55D9, 0x238F,
- 0x55DA, 0x0DDE, 0x55DB, 0x237B, 0x55DC, 0x0DD8, 0x55DD, 0x2380,
- 0x55DF, 0x0DD3, 0x55E1, 0x0DDF, 0x55E2, 0x238A, 0x55E3, 0x0DDB,
- 0x55E4, 0x0DDC, 0x55E5, 0x0DE2, 0x55E6, 0x0DD6, 0x55E7, 0x011F,
- 0x55E8, 0x0DD4, 0x55E9, 0x2384, 0x55EF, 0x0DDD, 0x55F2, 0x238D,
- 0x55F6, 0x0F9F, 0x55F7, 0x0F9A, 0x55F9, 0x2637, 0x55FA, 0x2633,
- 0x55FC, 0x262D, 0x55FD, 0x0F94, 0x55FE, 0x0F90, 0x55FF, 0x2636,
- 0x5600, 0x0F91, 0x5601, 0x2630, 0x5602, 0x2632, 0x5604, 0x2635,
- 0x5606, 0x0F96, 0x5608, 0x0F9D, 0x5609, 0x0F97, 0x560C, 0x262B,
- 0x560D, 0x0F98, 0x560E, 0x0F99, 0x560F, 0x262E, 0x5610, 0x0F9E,
- 0x5612, 0x262C, 0x5613, 0x2631, 0x5614, 0x0F95, 0x5615, 0x262A,
- 0x5616, 0x0F9B, 0x5617, 0x0F93, 0x561B, 0x0F92, 0x561C, 0x262F,
- 0x561D, 0x2634, 0x561F, 0x0F9C, 0x5627, 0x2629, 0x5629, 0x1119,
- 0x562A, 0x289D, 0x562C, 0x289A, 0x562E, 0x1113, 0x562F, 0x111F,
- 0x5630, 0x1120, 0x5632, 0x1116, 0x5633, 0x2898, 0x5634, 0x1118,
- 0x5635, 0x2890, 0x5636, 0x111E, 0x5638, 0x289C, 0x5639, 0x1115,
- 0x563A, 0x289E, 0x563B, 0x1114, 0x563D, 0x2899, 0x563E, 0x289B,
- 0x563F, 0x1117, 0x5640, 0x2897, 0x5641, 0x2891, 0x5642, 0x288E,
- 0x5645, 0x20C8, 0x5646, 0x2894, 0x5648, 0x288D, 0x5649, 0x2893,
- 0x564A, 0x2892, 0x564C, 0x288F, 0x564E, 0x111B, 0x5653, 0x111A,
- 0x5657, 0x111C, 0x5658, 0x2895, 0x5659, 0x1295, 0x565A, 0x2896,
- 0x565E, 0x2B10, 0x5660, 0x2B09, 0x5662, 0x12A1, 0x5663, 0x2B0D,
- 0x5664, 0x1299, 0x5665, 0x129D, 0x5666, 0x2B0C, 0x5668, 0x129C,
- 0x5669, 0x1298, 0x566A, 0x129B, 0x566B, 0x1296, 0x566C, 0x12A0,
- 0x566D, 0x2B0E, 0x566E, 0x2B0A, 0x566F, 0x129F, 0x5670, 0x2B08,
- 0x5671, 0x129E, 0x5672, 0x2B0F, 0x5673, 0x2B0B, 0x5674, 0x111D,
- 0x5676, 0x12A2, 0x5677, 0x2B11, 0x5678, 0x129A, 0x5679, 0x1297,
- 0x567E, 0x2D47, 0x567F, 0x2D49, 0x5680, 0x13BA, 0x5681, 0x2D4A,
- 0x5682, 0x2D48, 0x5683, 0x2D46, 0x5684, 0x2D45, 0x5685, 0x13BC,
- 0x5686, 0x2D44, 0x5687, 0x13BD, 0x568C, 0x2D42, 0x568D, 0x2D43,
- 0x568E, 0x13B9, 0x568F, 0x13BE, 0x5690, 0x13BB, 0x5693, 0x2D41,
- 0x5695, 0x14CA, 0x5697, 0x2F13, 0x5698, 0x2F11, 0x5699, 0x2F16,
- 0x569A, 0x2F14, 0x569C, 0x2F12, 0x569D, 0x2F15, 0x56A5, 0x1576,
- 0x56A6, 0x3081, 0x56A7, 0x3082, 0x56A8, 0x1577, 0x56AA, 0x3083,
- 0x56AB, 0x307F, 0x56AC, 0x3084, 0x56AD, 0x3080, 0x56AE, 0x14CB,
- 0x56B2, 0x31C8, 0x56B3, 0x31CA, 0x56B4, 0x160C, 0x56B5, 0x31C9,
- 0x56B6, 0x160B, 0x56B7, 0x160A, 0x56BC, 0x160D, 0x56BD, 0x32CA,
- 0x56BE, 0x32CB, 0x56C0, 0x166B, 0x56C1, 0x166A, 0x56C2, 0x166C,
- 0x56C3, 0x32C9, 0x56C5, 0x3379, 0x56C6, 0x3378, 0x56C8, 0x16BD,
- 0x56C9, 0x16BF, 0x56CA, 0x16BE, 0x56CB, 0x337A, 0x56CC, 0x16F6,
- 0x56CD, 0x3481, 0x56D1, 0x171F, 0x56D3, 0x3480, 0x56D4, 0x34C9,
- 0x56D7, 0x1775, 0x56DA, 0x032D, 0x56DB, 0x032C, 0x56DD, 0x03AC,
- 0x56DE, 0x03AB, 0x56DF, 0x17D0, 0x56E0, 0x03AA, 0x56E1, 0x17CF,
- 0x56E4, 0x0463, 0x56E5, 0x1850, 0x56E7, 0x184F, 0x56EA, 0x0461,
- 0x56EB, 0x0464, 0x56EE, 0x184E, 0x56F0, 0x0462, 0x56F7, 0x1933,
- 0x56F9, 0x1934, 0x56FA, 0x0578, 0x56FF, 0x06E6, 0x5701, 0x1C5B,
- 0x5702, 0x1C5C, 0x5703, 0x0879, 0x5704, 0x087A, 0x5707, 0x1E74,
- 0x5708, 0x0A36, 0x5709, 0x0A38, 0x570A, 0x1E73, 0x570B, 0x0A37,
- 0x570C, 0x20D9, 0x570D, 0x0C16, 0x5712, 0x0DE4, 0x5713, 0x0DE5,
- 0x5714, 0x2391, 0x5716, 0x0FA1, 0x5718, 0x0FA0, 0x571A, 0x289F,
- 0x571B, 0x2B13, 0x571C, 0x2B12, 0x571E, 0x3505, 0x571F, 0x027A,
- 0x5720, 0x1784, 0x5722, 0x179A, 0x5723, 0x179B, 0x5728, 0x03AF,
- 0x5729, 0x03B3, 0x572A, 0x17D2, 0x572C, 0x03B1, 0x572D, 0x03B0,
- 0x572E, 0x17D1, 0x572F, 0x03B2, 0x5730, 0x03AE, 0x5733, 0x03AD,
- 0x5734, 0x17D3, 0x573B, 0x046E, 0x573E, 0x046B, 0x5740, 0x0467,
- 0x5741, 0x1851, 0x5745, 0x1852, 0x5747, 0x0469, 0x5749, 0x1854,
- 0x574A, 0x0465, 0x574B, 0x1855, 0x574C, 0x1853, 0x574D, 0x0468,
- 0x574E, 0x046A, 0x574F, 0x046D, 0x5750, 0x046C, 0x5751, 0x0466,
- 0x5752, 0x1856, 0x5761, 0x057D, 0x5762, 0x1941, 0x5764, 0x057F,
- 0x5766, 0x057E, 0x5768, 0x1942, 0x5769, 0x057C, 0x576A, 0x057B,
- 0x576B, 0x1938, 0x576D, 0x1937, 0x576F, 0x1935, 0x5770, 0x193A,
- 0x5771, 0x1939, 0x5772, 0x1936, 0x5773, 0x193F, 0x5774, 0x1940,
- 0x5775, 0x193D, 0x5776, 0x193B, 0x5777, 0x057A, 0x577B, 0x193E,
- 0x577C, 0x0580, 0x577D, 0x1943, 0x5780, 0x193C, 0x5782, 0x06E7,
- 0x5783, 0x0579, 0x578B, 0x06E8, 0x578C, 0x1A90, 0x578F, 0x1A96,
- 0x5793, 0x06EE, 0x5794, 0x1A94, 0x5795, 0x1A9A, 0x5797, 0x1A91,
- 0x5798, 0x1A95, 0x5799, 0x1A97, 0x579A, 0x1A99, 0x579B, 0x1A93,
- 0x579D, 0x1A92, 0x579E, 0x1A8D, 0x579F, 0x1A8E, 0x57A0, 0x06E9,
- 0x57A2, 0x06EB, 0x57A3, 0x06EA, 0x57A4, 0x1A8F, 0x57A5, 0x1A98,
- 0x57AE, 0x06ED, 0x57B5, 0x1A8C, 0x57B6, 0x1C66, 0x57B8, 0x1C65,
- 0x57B9, 0x1C6A, 0x57BA, 0x1C61, 0x57BC, 0x1C64, 0x57BD, 0x1C63,
- 0x57BF, 0x1C67, 0x57C1, 0x1C6B, 0x57C2, 0x087B, 0x57C3, 0x087E,
- 0x57C6, 0x1C62, 0x57C7, 0x1C68, 0x57CB, 0x087D, 0x57CC, 0x1C5D,
- 0x57CE, 0x06EC, 0x57CF, 0x1E82, 0x57D0, 0x1C69, 0x57D2, 0x1C60,
- 0x57D4, 0x087C, 0x57D5, 0x1C5F, 0x57DC, 0x1E79, 0x57DF, 0x0A39,
- 0x57E0, 0x0A3D, 0x57E1, 0x1E89, 0x57E2, 0x1E77, 0x57E3, 0x1E85,
- 0x57E4, 0x0A3E, 0x57E5, 0x1E87, 0x57E7, 0x1E8D, 0x57E9, 0x1E91,
- 0x57EC, 0x1E88, 0x57ED, 0x1E7C, 0x57EE, 0x1E84, 0x57F0, 0x1E92,
- 0x57F1, 0x1E90, 0x57F2, 0x1E86, 0x57F3, 0x1E81, 0x57F4, 0x1E7A,
- 0x57F5, 0x20E1, 0x57F6, 0x1E78, 0x57F7, 0x0A42, 0x57F8, 0x1E7F,
- 0x57F9, 0x0A43, 0x57FA, 0x0A3F, 0x57FB, 0x1E75, 0x57FC, 0x1E8B,
- 0x57FD, 0x1E7D, 0x5800, 0x1E7B, 0x5801, 0x1E8E, 0x5802, 0x0A40,
- 0x5804, 0x1E94, 0x5805, 0x0A3A, 0x5806, 0x0A3C, 0x5807, 0x1E83,
- 0x5808, 0x1E7E, 0x5809, 0x087F, 0x580A, 0x0A3B, 0x580B, 0x1E80,
- 0x580C, 0x1E8F, 0x580D, 0x1E93, 0x580E, 0x1E8A, 0x5810, 0x1E8C,
- 0x5814, 0x1E76, 0x5819, 0x20DC, 0x581B, 0x20E5, 0x581C, 0x20E4,
- 0x581D, 0x0C1E, 0x581E, 0x20DD, 0x5820, 0x0C1F, 0x5821, 0x0C1D,
- 0x5823, 0x20DF, 0x5824, 0x0C1A, 0x5825, 0x20E3, 0x5827, 0x20DE,
- 0x5828, 0x20E0, 0x5829, 0x20DA, 0x582A, 0x0C18, 0x582C, 0x20ED,
- 0x582D, 0x20EC, 0x582E, 0x20E9, 0x582F, 0x0C17, 0x5830, 0x0C1B,
- 0x5831, 0x0C1C, 0x5832, 0x1C5E, 0x5833, 0x20E6, 0x5834, 0x0C19,
- 0x5835, 0x0A41, 0x5836, 0x20E8, 0x5837, 0x20DB, 0x5838, 0x20EB,
- 0x5839, 0x20EA, 0x583B, 0x20EE, 0x583D, 0x239F, 0x583F, 0x20E7,
- 0x5848, 0x20E2, 0x5849, 0x2397, 0x584A, 0x0DEF, 0x584B, 0x0DF2,
- 0x584C, 0x0DED, 0x584D, 0x2396, 0x584E, 0x239A, 0x584F, 0x2395,
- 0x5851, 0x0DE7, 0x5852, 0x0DF1, 0x5853, 0x2392, 0x5854, 0x0DEB,
- 0x5855, 0x2399, 0x5857, 0x0DE9, 0x5858, 0x0DE8, 0x5859, 0x239C,
- 0x585A, 0x0DEA, 0x585B, 0x239E, 0x585D, 0x239B, 0x585E, 0x0DE6,
- 0x5862, 0x0DF0, 0x5863, 0x23A0, 0x5864, 0x2394, 0x5865, 0x239D,
- 0x5868, 0x2393, 0x586B, 0x0DEC, 0x586D, 0x0DEE, 0x586F, 0x2398,
- 0x5871, 0x23A1, 0x5874, 0x263F, 0x5875, 0x0FA2, 0x5876, 0x2645,
- 0x5879, 0x0FA7, 0x587A, 0x2641, 0x587B, 0x2648, 0x587C, 0x2639,
- 0x587D, 0x0FA9, 0x587E, 0x0FA3, 0x587F, 0x263E, 0x5880, 0x1121,
- 0x5881, 0x263D, 0x5882, 0x2646, 0x5883, 0x0FA4, 0x5885, 0x0FA8,
- 0x5886, 0x263C, 0x5887, 0x2642, 0x5888, 0x2647, 0x5889, 0x2638,
- 0x588A, 0x0FA6, 0x588B, 0x2640, 0x588E, 0x2644, 0x588F, 0x264A,
- 0x5890, 0x263A, 0x5891, 0x2643, 0x5893, 0x0FA5, 0x5894, 0x2649,
- 0x5898, 0x263B, 0x589C, 0x1125, 0x589D, 0x28A1, 0x589E, 0x1123,
- 0x589F, 0x1122, 0x58A0, 0x28A3, 0x58A1, 0x28A8, 0x58A3, 0x28A4,
- 0x58A5, 0x28A7, 0x58A6, 0x1128, 0x58A8, 0x1288, 0x58A9, 0x1127,
- 0x58AB, 0x28A0, 0x58AC, 0x28A6, 0x58AE, 0x1126, 0x58AF, 0x28A5,
- 0x58B1, 0x28A2, 0x58B3, 0x1124, 0x58BA, 0x2B18, 0x58BB, 0x36EB,
- 0x58BC, 0x2B1A, 0x58BD, 0x2B15, 0x58BE, 0x12A4, 0x58BF, 0x2B17,
- 0x58C1, 0x12A3, 0x58C2, 0x2B19, 0x58C5, 0x12A6, 0x58C6, 0x2B1B,
- 0x58C7, 0x12A5, 0x58C8, 0x2B14, 0x58C9, 0x2B16, 0x58CE, 0x13C2,
- 0x58CF, 0x2D4D, 0x58D1, 0x13C1, 0x58D2, 0x2D4E, 0x58D3, 0x13C0,
- 0x58D4, 0x2D4C, 0x58D5, 0x13BF, 0x58D6, 0x2D4B, 0x58D8, 0x14CD,
- 0x58D9, 0x14CC, 0x58DA, 0x3085, 0x58DB, 0x3087, 0x58DD, 0x3086,
- 0x58DE, 0x1578, 0x58DF, 0x1579, 0x58E2, 0x157A, 0x58E3, 0x31CB,
- 0x58E4, 0x160E, 0x58E7, 0x3411, 0x58E8, 0x3410, 0x58E9, 0x1720,
- 0x58EB, 0x027B, 0x58EC, 0x02C1, 0x58EF, 0x046F, 0x58F4, 0x1A9B,
- 0x58F9, 0x0C20, 0x58FA, 0x0C21, 0x58FC, 0x23A2, 0x58FD, 0x0FAA,
- 0x58FE, 0x264B, 0x58FF, 0x28A9, 0x5902, 0x0224, 0x5903, 0x1785,
- 0x5906, 0x1857, 0x590A, 0x0224, 0x590C, 0x1944, 0x590D, 0x1A9C,
- 0x590E, 0x1C6C, 0x590F, 0x0880, 0x5912, 0x3088, 0x5914, 0x166D,
- 0x5915, 0x027C, 0x5916, 0x032E, 0x5917, 0x179C, 0x5919, 0x03B4,
- 0x591A, 0x03B5, 0x591C, 0x0581, 0x5920, 0x0A44, 0x5922, 0x0FAC,
- 0x5924, 0x0FAD, 0x5925, 0x0FAB, 0x5927, 0x027D, 0x5929, 0x02C2,
- 0x592A, 0x02C4, 0x592B, 0x02C3, 0x592C, 0x1786, 0x592D, 0x02C5,
- 0x592E, 0x032F, 0x592F, 0x179D, 0x5931, 0x0330, 0x5937, 0x03B6,
- 0x5938, 0x03B7, 0x593C, 0x17D4, 0x593E, 0x0470, 0x5940, 0x1858,
- 0x5944, 0x0585, 0x5945, 0x1945, 0x5947, 0x0583, 0x5948, 0x0584,
- 0x5949, 0x0582, 0x594A, 0x1C6D, 0x594E, 0x06F2, 0x594F, 0x06F1,
- 0x5950, 0x06F3, 0x5951, 0x06F0, 0x5953, 0x1A9D, 0x5954, 0x0586,
- 0x5955, 0x06EF, 0x5957, 0x0881, 0x5958, 0x0882, 0x595A, 0x0883,
- 0x595C, 0x1E95, 0x5960, 0x0C22, 0x5961, 0x20EF, 0x5962, 0x0A45,
- 0x5967, 0x0DF3, 0x5969, 0x0FAF, 0x596A, 0x0FAE, 0x596B, 0x264C,
- 0x596D, 0x1129, 0x596E, 0x12A7, 0x5970, 0x2F17, 0x5971, 0x337B,
- 0x5972, 0x3412, 0x5973, 0x027E, 0x5974, 0x0331, 0x5976, 0x0332,
- 0x5977, 0x17DA, 0x5978, 0x03B9, 0x5979, 0x03BC, 0x597B, 0x17D8,
- 0x597C, 0x17D6, 0x597D, 0x03BB, 0x597E, 0x17D9, 0x597F, 0x17DB,
- 0x5980, 0x17D5, 0x5981, 0x03BE, 0x5982, 0x03BD, 0x5983, 0x03BA,
- 0x5984, 0x03B8, 0x5985, 0x17D7, 0x598A, 0x047B, 0x598D, 0x0478,
- 0x598E, 0x185D, 0x598F, 0x1860, 0x5990, 0x185F, 0x5992, 0x0472,
- 0x5993, 0x047A, 0x5996, 0x0477, 0x5997, 0x185C, 0x5998, 0x185A,
- 0x5999, 0x0476, 0x599D, 0x0471, 0x599E, 0x0474, 0x59A0, 0x185B,
- 0x59A1, 0x1862, 0x59A2, 0x185E, 0x59A3, 0x0475, 0x59A4, 0x0479,
- 0x59A5, 0x047C, 0x59A6, 0x1859, 0x59A7, 0x1861, 0x59A8, 0x0473,
- 0x59AE, 0x058B, 0x59AF, 0x0593, 0x59B1, 0x1951, 0x59B2, 0x194A,
- 0x59B3, 0x0594, 0x59B4, 0x1955, 0x59B5, 0x1946, 0x59B6, 0x194D,
- 0x59B9, 0x058A, 0x59BA, 0x1947, 0x59BB, 0x0588, 0x59BC, 0x194E,
- 0x59BD, 0x1952, 0x59BE, 0x0587, 0x59C0, 0x1953, 0x59C1, 0x194C,
- 0x59C3, 0x194F, 0x59C5, 0x0596, 0x59C6, 0x058D, 0x59C7, 0x1956,
- 0x59C8, 0x1954, 0x59CA, 0x0592, 0x59CB, 0x0590, 0x59CC, 0x194B,
- 0x59CD, 0x058F, 0x59CE, 0x1949, 0x59CF, 0x1948, 0x59D0, 0x058E,
- 0x59D1, 0x058C, 0x59D2, 0x0595, 0x59D3, 0x0591, 0x59D4, 0x0589,
- 0x59D6, 0x1950, 0x59D8, 0x06F5, 0x59DA, 0x06FC, 0x59DB, 0x1AAB,
- 0x59DC, 0x06F4, 0x59DD, 0x1AA3, 0x59DE, 0x1A9F, 0x59E0, 0x1AAF,
- 0x59E1, 0x1A9E, 0x59E3, 0x06F7, 0x59E4, 0x1AA8, 0x59E5, 0x06FA,
- 0x59E6, 0x06FD, 0x59E8, 0x06F8, 0x59E9, 0x1AAC, 0x59EA, 0x06FB,
- 0x59EC, 0x088A, 0x59ED, 0x1AB2, 0x59EE, 0x1AA0, 0x59F1, 0x1AA2,
- 0x59F2, 0x1AA9, 0x59F3, 0x1AAD, 0x59F4, 0x1AB1, 0x59F5, 0x1AAE,
- 0x59F6, 0x1AA7, 0x59F7, 0x1AAA, 0x59FA, 0x1AA4, 0x59FB, 0x06FF,
- 0x59FC, 0x1AA6, 0x59FD, 0x1AA5, 0x59FE, 0x1AB0, 0x59FF, 0x06F6,
- 0x5A00, 0x1AA1, 0x5A01, 0x06FE, 0x5A03, 0x06F9, 0x5A09, 0x0890,
- 0x5A0A, 0x1C75, 0x5A0C, 0x088F, 0x5A0F, 0x1C73, 0x5A11, 0x0884,
- 0x5A13, 0x0889, 0x5A15, 0x1C72, 0x5A16, 0x1C6F, 0x5A17, 0x1C74,
- 0x5A18, 0x0885, 0x5A19, 0x1C6E, 0x5A1B, 0x0888, 0x5A1C, 0x0886,
- 0x5A1E, 0x1C76, 0x5A1F, 0x0887, 0x5A20, 0x088B, 0x5A23, 0x088C,
- 0x5A25, 0x088E, 0x5A29, 0x088D, 0x5A2D, 0x1C70, 0x5A2E, 0x1C71,
- 0x5A33, 0x1C77, 0x5A35, 0x1E9C, 0x5A36, 0x0A46, 0x5A37, 0x20FD,
- 0x5A38, 0x1E9B, 0x5A39, 0x1EAE, 0x5A3C, 0x0A4C, 0x5A3E, 0x1EAC,
- 0x5A40, 0x0A4B, 0x5A41, 0x0A47, 0x5A42, 0x1EB5, 0x5A43, 0x1EA5,
- 0x5A44, 0x1EA8, 0x5A46, 0x0A4F, 0x5A47, 0x1EB2, 0x5A48, 0x1EAA,
- 0x5A49, 0x0A48, 0x5A4A, 0x0A50, 0x5A4C, 0x1EAF, 0x5A4D, 0x1EAD,
- 0x5A50, 0x1E9E, 0x5A51, 0x1EB3, 0x5A52, 0x1EA7, 0x5A53, 0x1EA2,
- 0x5A55, 0x1E98, 0x5A56, 0x1EB4, 0x5A57, 0x1EA4, 0x5A58, 0x1E97,
- 0x5A5A, 0x0A4E, 0x5A5B, 0x1EA9, 0x5A5C, 0x1EB6, 0x5A5D, 0x1EA6,
- 0x5A5E, 0x1E9A, 0x5A5F, 0x1E9F, 0x5A60, 0x1E96, 0x5A62, 0x0A4D,
- 0x5A64, 0x1EA3, 0x5A65, 0x1EA0, 0x5A66, 0x0A49, 0x5A67, 0x1E99,
- 0x5A69, 0x1EB1, 0x5A6A, 0x0A4A, 0x5A6C, 0x1EA1, 0x5A6D, 0x1E9D,
- 0x5A70, 0x1EB0, 0x5A77, 0x0C23, 0x5A78, 0x20F6, 0x5A7A, 0x20F3,
- 0x5A7B, 0x2104, 0x5A7C, 0x20F8, 0x5A7D, 0x2105, 0x5A7F, 0x0C25,
- 0x5A83, 0x2101, 0x5A84, 0x20FE, 0x5A8A, 0x20FF, 0x5A8B, 0x2102,
- 0x5A8C, 0x2106, 0x5A8E, 0x1EAB, 0x5A8F, 0x2108, 0x5A90, 0x23B6,
- 0x5A92, 0x0C26, 0x5A93, 0x2109, 0x5A94, 0x20F1, 0x5A95, 0x20FB,
- 0x5A97, 0x2100, 0x5A9A, 0x0C24, 0x5A9B, 0x0C27, 0x5A9C, 0x2107,
- 0x5A9D, 0x210A, 0x5A9E, 0x20F5, 0x5A9F, 0x20F2, 0x5AA2, 0x20F4,
- 0x5AA5, 0x20F9, 0x5AA6, 0x20F7, 0x5AA7, 0x0C28, 0x5AA9, 0x2103,
- 0x5AAC, 0x20FA, 0x5AAE, 0x20FC, 0x5AAF, 0x20F0, 0x5AB0, 0x23AA,
- 0x5AB1, 0x23A8, 0x5AB2, 0x0DFC, 0x5AB3, 0x0DFA, 0x5AB4, 0x23B2,
- 0x5AB5, 0x23A9, 0x5AB6, 0x23B3, 0x5AB7, 0x23AF, 0x5AB8, 0x23A7,
- 0x5AB9, 0x23B5, 0x5ABA, 0x23A6, 0x5ABB, 0x23AD, 0x5ABC, 0x0DF9,
- 0x5ABD, 0x0DF8, 0x5ABE, 0x0DF7, 0x5ABF, 0x23AB, 0x5AC0, 0x23B0,
- 0x5AC1, 0x0DF4, 0x5AC2, 0x0DFB, 0x5AC4, 0x23A4, 0x5AC6, 0x23AE,
- 0x5AC7, 0x23A3, 0x5AC8, 0x23AC, 0x5AC9, 0x0DF5, 0x5ACA, 0x23B1,
- 0x5ACB, 0x23A5, 0x5ACC, 0x0DF6, 0x5ACD, 0x23B4, 0x5AD5, 0x2650,
- 0x5AD6, 0x0FB4, 0x5AD7, 0x0FB3, 0x5AD8, 0x0FB5, 0x5AD9, 0x265C,
- 0x5ADA, 0x2652, 0x5ADB, 0x2658, 0x5ADC, 0x264D, 0x5ADD, 0x265B,
- 0x5ADE, 0x265A, 0x5ADF, 0x265E, 0x5AE0, 0x2657, 0x5AE1, 0x0FB0,
- 0x5AE2, 0x2656, 0x5AE3, 0x0FB6, 0x5AE5, 0x264F, 0x5AE6, 0x0FB1,
- 0x5AE8, 0x265D, 0x5AE9, 0x0FB2, 0x5AEA, 0x2651, 0x5AEB, 0x2654,
- 0x5AEC, 0x2659, 0x5AED, 0x2653, 0x5AEE, 0x264E, 0x5AF3, 0x2655,
- 0x5AF4, 0x28AB, 0x5AF5, 0x112D, 0x5AF6, 0x28AE, 0x5AF7, 0x28AD,
- 0x5AF8, 0x28B0, 0x5AF9, 0x28B2, 0x5AFA, 0x36EE, 0x5AFB, 0x112B,
- 0x5AFD, 0x28AC, 0x5AFF, 0x28AA, 0x5B01, 0x28B3, 0x5B02, 0x28B1,
- 0x5B03, 0x28AF, 0x5B05, 0x28B5, 0x5B07, 0x28B4, 0x5B08, 0x112F,
- 0x5B09, 0x112A, 0x5B0B, 0x112C, 0x5B0C, 0x112E, 0x5B0F, 0x28B6,
- 0x5B10, 0x2B22, 0x5B13, 0x2B21, 0x5B14, 0x2B20, 0x5B16, 0x2B23,
- 0x5B17, 0x2B1C, 0x5B19, 0x2B1D, 0x5B1A, 0x2B25, 0x5B1B, 0x2B1E,
- 0x5B1D, 0x12A8, 0x5B1E, 0x2B27, 0x5B20, 0x2B26, 0x5B21, 0x2B1F,
- 0x5B23, 0x2D52, 0x5B24, 0x13C5, 0x5B25, 0x2D50, 0x5B26, 0x2D55,
- 0x5B27, 0x2D54, 0x5B28, 0x2B24, 0x5B2A, 0x13C4, 0x5B2C, 0x2D53,
- 0x5B2D, 0x2D4F, 0x5B2E, 0x2D57, 0x5B2F, 0x2D56, 0x5B30, 0x13C3,
- 0x5B32, 0x2D51, 0x5B34, 0x12A9, 0x5B38, 0x14CE, 0x5B3C, 0x2F18,
- 0x5B3D, 0x3089, 0x5B3E, 0x308A, 0x5B3F, 0x308B, 0x5B40, 0x160F,
- 0x5B43, 0x1610, 0x5B45, 0x31CC, 0x5B47, 0x32CD, 0x5B48, 0x32CC,
- 0x5B4B, 0x337C, 0x5B4C, 0x337D, 0x5B4D, 0x3413, 0x5B4E, 0x3482,
- 0x5B50, 0x027F, 0x5B51, 0x0280, 0x5B53, 0x0281, 0x5B54, 0x02C6,
- 0x5B55, 0x0333, 0x5B56, 0x17DC, 0x5B57, 0x03BF, 0x5B58, 0x03C0,
- 0x5B5A, 0x047F, 0x5B5B, 0x0480, 0x5B5C, 0x047E, 0x5B5D, 0x047D,
- 0x5B5F, 0x0597, 0x5B62, 0x1957, 0x5B63, 0x0599, 0x5B64, 0x0598,
- 0x5B65, 0x1958, 0x5B69, 0x0700, 0x5B6B, 0x0891, 0x5B6C, 0x1C78,
- 0x5B6E, 0x1EB8, 0x5B70, 0x0A51, 0x5B71, 0x0C2A, 0x5B72, 0x1EB7,
- 0x5B73, 0x0C29, 0x5B75, 0x0FB7, 0x5B77, 0x265F, 0x5B78, 0x12AA,
- 0x5B7A, 0x13C6, 0x5B7B, 0x2D58, 0x5B7D, 0x1611, 0x5B7F, 0x16C0,
- 0x5B80, 0x0225, 0x5B81, 0x179E, 0x5B83, 0x0334, 0x5B84, 0x179F,
- 0x5B85, 0x03C3, 0x5B87, 0x03C1, 0x5B88, 0x03C2, 0x5B89, 0x03C4,
- 0x5B8B, 0x0482, 0x5B8C, 0x0481, 0x5B8E, 0x1863, 0x5B8F, 0x0483,
- 0x5B92, 0x1864, 0x5B93, 0x1959, 0x5B95, 0x195A, 0x5B97, 0x059A,
- 0x5B98, 0x059C, 0x5B99, 0x059E, 0x5B9A, 0x059B, 0x5B9B, 0x059F,
- 0x5B9C, 0x059D, 0x5BA2, 0x0704, 0x5BA3, 0x0701, 0x5BA4, 0x0703,
- 0x5BA5, 0x0705, 0x5BA6, 0x0702, 0x5BA7, 0x1C79, 0x5BA8, 0x1AB3,
- 0x5BAC, 0x1C7B, 0x5BAD, 0x1C7A, 0x5BAE, 0x0897, 0x5BB0, 0x0893,
- 0x5BB3, 0x0894, 0x5BB4, 0x0896, 0x5BB5, 0x0898, 0x5BB6, 0x0895,
- 0x5BB8, 0x089A, 0x5BB9, 0x0899, 0x5BBF, 0x0A56, 0x5BC0, 0x1EBA,
- 0x5BC1, 0x1EB9, 0x5BC2, 0x0A55, 0x5BC4, 0x0A54, 0x5BC5, 0x0A53,
- 0x5BC6, 0x0A57, 0x5BC7, 0x0A52, 0x5BCA, 0x2110, 0x5BCB, 0x210D,
- 0x5BCC, 0x0C2C, 0x5BCD, 0x210C, 0x5BCE, 0x2111, 0x5BD0, 0x0C2E,
- 0x5BD1, 0x210F, 0x5BD2, 0x0C2B, 0x5BD3, 0x0C2D, 0x5BD4, 0x210E,
- 0x5BD6, 0x23B7, 0x5BD8, 0x23B8, 0x5BD9, 0x23B9, 0x5BDE, 0x0FB8,
- 0x5BDF, 0x0FC0, 0x5BE0, 0x2660, 0x5BE1, 0x0FBA, 0x5BE2, 0x0FBE,
- 0x5BE3, 0x2661, 0x5BE4, 0x0FBF, 0x5BE5, 0x0FBB, 0x5BE6, 0x0FBC,
- 0x5BE7, 0x0FB9, 0x5BE8, 0x0FBD, 0x5BE9, 0x1132, 0x5BEA, 0x210B,
- 0x5BEB, 0x1133, 0x5BEC, 0x1131, 0x5BEE, 0x1130, 0x5BEF, 0x2B28,
- 0x5BF0, 0x12AB, 0x5BF1, 0x2D59, 0x5BF2, 0x2D5A, 0x5BF5, 0x157B,
- 0x5BF6, 0x1612, 0x5BF8, 0x0282, 0x5BFA, 0x03C5, 0x5C01, 0x0706,
- 0x5C03, 0x1C7C, 0x5C04, 0x089B, 0x5C07, 0x0A5A, 0x5C08, 0x0A59,
- 0x5C09, 0x0A58, 0x5C0A, 0x0C2F, 0x5C0B, 0x0C30, 0x5C0C, 0x2112,
- 0x5C0D, 0x0FC1, 0x5C0E, 0x12AC, 0x5C0F, 0x0283, 0x5C10, 0x1787,
- 0x5C11, 0x02C7, 0x5C12, 0x17A0, 0x5C15, 0x17DD, 0x5C16, 0x03C6,
- 0x5C1A, 0x05A0, 0x5C1F, 0x23BA, 0x5C22, 0x0284, 0x5C24, 0x02C8,
- 0x5C25, 0x17DE, 0x5C28, 0x1865, 0x5C2A, 0x1866, 0x5C2C, 0x0484,
- 0x5C30, 0x2113, 0x5C31, 0x0C31, 0x5C33, 0x23BB, 0x5C37, 0x13C7,
- 0x5C38, 0x0285, 0x5C39, 0x0299, 0x5C3A, 0x02C9, 0x5C3B, 0x17A1,
- 0x5C3C, 0x0335, 0x5C3E, 0x0488, 0x5C3F, 0x0487, 0x5C40, 0x0485,
- 0x5C41, 0x0486, 0x5C44, 0x195B, 0x5C45, 0x05A2, 0x5C46, 0x05A3,
- 0x5C47, 0x195C, 0x5C48, 0x05A1, 0x5C4B, 0x070A, 0x5C4C, 0x1AB4,
- 0x5C4D, 0x0709, 0x5C4E, 0x0707, 0x5C4F, 0x0708, 0x5C50, 0x089E,
- 0x5C51, 0x089C, 0x5C54, 0x1C7E, 0x5C55, 0x089D, 0x5C56, 0x1C7D,
- 0x5C58, 0x0892, 0x5C59, 0x1EBB, 0x5C5C, 0x0A5C, 0x5C5D, 0x0A5D,
- 0x5C60, 0x0A5B, 0x5C62, 0x0FC2, 0x5C63, 0x2662, 0x5C64, 0x1134,
- 0x5C65, 0x1135, 0x5C67, 0x28B7, 0x5C68, 0x13C8, 0x5C69, 0x2F19,
- 0x5C6A, 0x2F1A, 0x5C6C, 0x166E, 0x5C6D, 0x3483, 0x5C6E, 0x1776,
- 0x5C6F, 0x02CA, 0x5C71, 0x0286, 0x5C73, 0x17A3, 0x5C74, 0x17A2,
- 0x5C79, 0x03C7, 0x5C7A, 0x17E0, 0x5C7B, 0x17E1, 0x5C7C, 0x17DF,
- 0x5C7E, 0x17E2, 0x5C86, 0x186E, 0x5C88, 0x1869, 0x5C89, 0x186B,
- 0x5C8A, 0x186D, 0x5C8B, 0x186A, 0x5C8C, 0x048C, 0x5C8D, 0x1867,
- 0x5C8F, 0x1868, 0x5C90, 0x0489, 0x5C91, 0x048A, 0x5C92, 0x186C,
- 0x5C93, 0x186F, 0x5C94, 0x048B, 0x5C95, 0x1870, 0x5C9D, 0x196A,
- 0x5C9F, 0x1964, 0x5CA0, 0x195F, 0x5CA1, 0x05A5, 0x5CA2, 0x1967,
- 0x5CA3, 0x1965, 0x5CA4, 0x195E, 0x5CA5, 0x196B, 0x5CA6, 0x196E,
- 0x5CA7, 0x1969, 0x5CA8, 0x1962, 0x5CA9, 0x05A7, 0x5CAA, 0x1968,
- 0x5CAB, 0x05A8, 0x5CAC, 0x1963, 0x5CAD, 0x1966, 0x5CAE, 0x195D,
- 0x5CAF, 0x1961, 0x5CB0, 0x196D, 0x5CB1, 0x05A9, 0x5CB3, 0x05AA,
- 0x5CB5, 0x1960, 0x5CB6, 0x196C, 0x5CB7, 0x05A4, 0x5CB8, 0x05A6,
- 0x5CC6, 0x1AC5, 0x5CC7, 0x1ABE, 0x5CC8, 0x1AC4, 0x5CC9, 0x1ABD,
- 0x5CCA, 0x1ABF, 0x5CCB, 0x1AB9, 0x5CCC, 0x1AB7, 0x5CCE, 0x1AC6,
- 0x5CCF, 0x1AC3, 0x5CD0, 0x1AB5, 0x5CD2, 0x070C, 0x5CD3, 0x1AC1,
- 0x5CD4, 0x1AC2, 0x5CD6, 0x1AC0, 0x5CD7, 0x1AB8, 0x5CD8, 0x1AB6,
- 0x5CD9, 0x070B, 0x5CDA, 0x1ABC, 0x5CDB, 0x1ABA, 0x5CDE, 0x1ABB,
- 0x5CDF, 0x1AC7, 0x5CE8, 0x08A3, 0x5CEA, 0x08A2, 0x5CEC, 0x1C7F,
- 0x5CED, 0x089F, 0x5CEE, 0x1C81, 0x5CF0, 0x08A4, 0x5CF1, 0x1C82,
- 0x5CF4, 0x08A7, 0x5CF6, 0x08A5, 0x5CF7, 0x1C83, 0x5CF8, 0x1AC8,
- 0x5CF9, 0x1C85, 0x5CFB, 0x08A1, 0x5CFD, 0x08A0, 0x5CFF, 0x1C80,
- 0x5D00, 0x1C84, 0x5D01, 0x08A6, 0x5D06, 0x0A5F, 0x5D07, 0x0A5E,
- 0x5D0B, 0x1EBD, 0x5D0C, 0x1EC1, 0x5D0D, 0x1EC3, 0x5D0E, 0x0A60,
- 0x5D0F, 0x1EC6, 0x5D11, 0x0A64, 0x5D12, 0x1EC8, 0x5D14, 0x0A66,
- 0x5D16, 0x0A62, 0x5D17, 0x0A6A, 0x5D19, 0x0A67, 0x5D1A, 0x1EBF,
- 0x5D1B, 0x0A61, 0x5D1D, 0x1EBE, 0x5D1E, 0x1EBC, 0x5D1F, 0x1ECA,
- 0x5D20, 0x1EC0, 0x5D22, 0x0A63, 0x5D23, 0x1EC9, 0x5D24, 0x0A68,
- 0x5D25, 0x1EC5, 0x5D26, 0x1EC4, 0x5D27, 0x0A69, 0x5D28, 0x1EC2,
- 0x5D29, 0x0A65, 0x5D2E, 0x1ECB, 0x5D30, 0x1EC7, 0x5D31, 0x2122,
- 0x5D32, 0x2129, 0x5D33, 0x211E, 0x5D34, 0x0C34, 0x5D35, 0x211A,
- 0x5D36, 0x212A, 0x5D37, 0x2114, 0x5D38, 0x2127, 0x5D39, 0x2125,
- 0x5D3A, 0x211F, 0x5D3C, 0x2128, 0x5D3D, 0x2121, 0x5D3F, 0x2119,
- 0x5D40, 0x212B, 0x5D41, 0x2117, 0x5D42, 0x2124, 0x5D43, 0x2115,
- 0x5D45, 0x212C, 0x5D47, 0x0C35, 0x5D49, 0x2126, 0x5D4A, 0x23BE,
- 0x5D4B, 0x2118, 0x5D4C, 0x0C32, 0x5D4E, 0x211C, 0x5D50, 0x0C33,
- 0x5D51, 0x211B, 0x5D52, 0x2120, 0x5D55, 0x211D, 0x5D59, 0x2123,
- 0x5D5E, 0x23C2, 0x5D62, 0x23C5, 0x5D63, 0x23BD, 0x5D65, 0x23BF,
- 0x5D67, 0x23C4, 0x5D68, 0x23C3, 0x5D69, 0x0DFD, 0x5D6B, 0x2116,
- 0x5D6C, 0x23C1, 0x5D6F, 0x0DFE, 0x5D71, 0x23BC, 0x5D72, 0x23C0,
- 0x5D77, 0x2669, 0x5D79, 0x2670, 0x5D7A, 0x2667, 0x5D7C, 0x266E,
- 0x5D7D, 0x2665, 0x5D7E, 0x266D, 0x5D7F, 0x2671, 0x5D80, 0x2664,
- 0x5D81, 0x2668, 0x5D82, 0x2663, 0x5D84, 0x0FC3, 0x5D86, 0x2666,
- 0x5D87, 0x0FC4, 0x5D88, 0x266C, 0x5D89, 0x266B, 0x5D8A, 0x266A,
- 0x5D8D, 0x266F, 0x5D92, 0x28BB, 0x5D93, 0x28BD, 0x5D94, 0x1137,
- 0x5D95, 0x28BE, 0x5D97, 0x28B9, 0x5D99, 0x28B8, 0x5D9A, 0x28C2,
- 0x5D9C, 0x28C0, 0x5D9D, 0x1136, 0x5D9E, 0x28C3, 0x5D9F, 0x28BA,
- 0x5DA0, 0x28BF, 0x5DA1, 0x28C1, 0x5DA2, 0x28BC, 0x5DA7, 0x2B2C,
- 0x5DA8, 0x2B31, 0x5DA9, 0x2B2B, 0x5DAA, 0x2B30, 0x5DAC, 0x2B29,
- 0x5DAD, 0x2B33, 0x5DAE, 0x2B2F, 0x5DAF, 0x2B34, 0x5DB0, 0x2B2E,
- 0x5DB1, 0x2B2A, 0x5DB2, 0x2B32, 0x5DB4, 0x2B35, 0x5DB5, 0x2B2D,
- 0x5DB7, 0x2D5B, 0x5DB8, 0x13CC, 0x5DBA, 0x13CA, 0x5DBC, 0x13C9,
- 0x5DBD, 0x13CB, 0x5DC0, 0x2F1B, 0x5DC2, 0x3023, 0x5DC3, 0x308C,
- 0x5DC6, 0x31CD, 0x5DC7, 0x31CE, 0x5DC9, 0x1613, 0x5DCB, 0x32CE,
- 0x5DCD, 0x166F, 0x5DCF, 0x32CF, 0x5DD1, 0x337F, 0x5DD2, 0x16C2,
- 0x5DD4, 0x16C1, 0x5DD5, 0x337E, 0x5DD6, 0x16F7, 0x5DD8, 0x3414,
- 0x5DDB, 0x0226, 0x5DDD, 0x0287, 0x5DDE, 0x03C8, 0x5DDF, 0x17E3,
- 0x5DE0, 0x1871, 0x5DE1, 0x051A, 0x5DE2, 0x0A6B, 0x5DE5, 0x0288,
- 0x5DE6, 0x0338, 0x5DE7, 0x0337, 0x5DE8, 0x0336, 0x5DEB, 0x048D,
- 0x5DEE, 0x08A8, 0x5DF0, 0x23C6, 0x5DF1, 0x0289, 0x5DF2, 0x028A,
- 0x5DF3, 0x028B, 0x5DF4, 0x02CB, 0x5DF7, 0x070D, 0x5DF9, 0x1AC9,
- 0x5DFD, 0x0C36, 0x5DFE, 0x028C, 0x5DFF, 0x1788, 0x5E02, 0x0339,
- 0x5E03, 0x033A, 0x5E04, 0x17A4, 0x5E06, 0x03C9, 0x5E0A, 0x1872,
- 0x5E0C, 0x048E, 0x5E0E, 0x1873, 0x5E11, 0x05B0, 0x5E14, 0x1970,
- 0x5E15, 0x05AE, 0x5E16, 0x05AD, 0x5E17, 0x196F, 0x5E18, 0x05AB,
- 0x5E19, 0x1971, 0x5E1A, 0x05AC, 0x5E1B, 0x05AF, 0x5E1D, 0x070E,
- 0x5E1F, 0x0710, 0x5E20, 0x1ACD, 0x5E21, 0x1ACA, 0x5E22, 0x1ACB,
- 0x5E23, 0x1ACC, 0x5E24, 0x1ACE, 0x5E25, 0x070F, 0x5E28, 0x1C87,
- 0x5E29, 0x1C86, 0x5E2B, 0x08AA, 0x5E2D, 0x08A9, 0x5E33, 0x0A6E,
- 0x5E34, 0x1ECD, 0x5E36, 0x0A6D, 0x5E37, 0x0A6F, 0x5E38, 0x0A6C,
- 0x5E3D, 0x0C38, 0x5E3E, 0x1ECC, 0x5E40, 0x0C39, 0x5E41, 0x212E,
- 0x5E43, 0x0C3A, 0x5E44, 0x212D, 0x5E45, 0x0C37, 0x5E4A, 0x23C9,
- 0x5E4B, 0x23CB, 0x5E4C, 0x0DFF, 0x5E4D, 0x23CA, 0x5E4E, 0x23C8,
- 0x5E4F, 0x23C7, 0x5E53, 0x2674, 0x5E54, 0x0FC9, 0x5E55, 0x0FC7,
- 0x5E57, 0x0FC8, 0x5E58, 0x2672, 0x5E59, 0x2673, 0x5E5B, 0x0FC5,
- 0x5E5C, 0x28C7, 0x5E5D, 0x28C5, 0x5E5F, 0x1139, 0x5E60, 0x28C6,
- 0x5E61, 0x113A, 0x5E62, 0x1138, 0x5E63, 0x0FC6, 0x5E66, 0x2B38,
- 0x5E67, 0x2B36, 0x5E68, 0x2B37, 0x5E69, 0x28C4, 0x5E6A, 0x2D5D,
- 0x5E6B, 0x13CD, 0x5E6C, 0x2D5C, 0x5E6D, 0x2F1C, 0x5E6E, 0x2F1D,
- 0x5E6F, 0x2B39, 0x5E70, 0x308D, 0x5E72, 0x028D, 0x5E73, 0x033B,
- 0x5E74, 0x03CB, 0x5E75, 0x17E4, 0x5E76, 0x03CA, 0x5E78, 0x05B1,
- 0x5E79, 0x0E00, 0x5E7A, 0x0227, 0x5E7B, 0x02CC, 0x5E7C, 0x033C,
- 0x5E7D, 0x0711, 0x5E7E, 0x0C3B, 0x5E7F, 0x0228, 0x5E80, 0x17A5,
- 0x5E82, 0x17A6, 0x5E84, 0x17E5, 0x5E87, 0x0490, 0x5E88, 0x1877,
- 0x5E89, 0x1875, 0x5E8A, 0x0491, 0x5E8B, 0x1874, 0x5E8C, 0x1876,
- 0x5E8D, 0x1878, 0x5E8F, 0x048F, 0x5E95, 0x05B5, 0x5E96, 0x05B6,
- 0x5E97, 0x05B3, 0x5E9A, 0x05B2, 0x5E9B, 0x1AD2, 0x5E9C, 0x05B4,
- 0x5EA0, 0x0712, 0x5EA2, 0x1AD1, 0x5EA3, 0x1AD3, 0x5EA4, 0x1AD0,
- 0x5EA5, 0x1AD4, 0x5EA6, 0x0713, 0x5EA7, 0x08AD, 0x5EA8, 0x1C88,
- 0x5EAA, 0x1C8A, 0x5EAB, 0x08AB, 0x5EAC, 0x1C8B, 0x5EAD, 0x08AC,
- 0x5EAE, 0x1C89, 0x5EB0, 0x1ACF, 0x5EB1, 0x1ECE, 0x5EB2, 0x1ED1,
- 0x5EB3, 0x1ED2, 0x5EB4, 0x1ECF, 0x5EB5, 0x0A73, 0x5EB6, 0x0A72,
- 0x5EB7, 0x0A70, 0x5EB8, 0x0A71, 0x5EB9, 0x1ED0, 0x5EBE, 0x0A74,
- 0x5EC1, 0x0C3D, 0x5EC2, 0x0C3E, 0x5EC4, 0x0C3F, 0x5EC5, 0x23CC,
- 0x5EC6, 0x23CE, 0x5EC7, 0x23D0, 0x5EC8, 0x0E02, 0x5EC9, 0x0E01,
- 0x5ECA, 0x0C3C, 0x5ECB, 0x23CF, 0x5ECC, 0x23CD, 0x5ECE, 0x2678,
- 0x5ED1, 0x2676, 0x5ED2, 0x267C, 0x5ED3, 0x0FCA, 0x5ED4, 0x267D,
- 0x5ED5, 0x267A, 0x5ED6, 0x0FCB, 0x5ED7, 0x2677, 0x5ED8, 0x2675,
- 0x5ED9, 0x267B, 0x5EDA, 0x113C, 0x5EDB, 0x28C9, 0x5EDC, 0x2679,
- 0x5EDD, 0x113E, 0x5EDE, 0x28CA, 0x5EDF, 0x113D, 0x5EE0, 0x1140,
- 0x5EE1, 0x28CB, 0x5EE2, 0x113B, 0x5EE3, 0x113F, 0x5EE5, 0x2B3E,
- 0x5EE6, 0x2B3C, 0x5EE7, 0x2B3B, 0x5EE8, 0x2B3D, 0x5EE9, 0x2B3A,
- 0x5EEC, 0x157D, 0x5EEE, 0x31CF, 0x5EEF, 0x31D0, 0x5EF1, 0x32D0,
- 0x5EF2, 0x3380, 0x5EF3, 0x1742, 0x5EF4, 0x0229, 0x5EF6, 0x05B7,
- 0x5EF7, 0x0492, 0x5EFA, 0x0714, 0x5EFE, 0x028E, 0x5EFF, 0x02CD,
- 0x5F01, 0x033D, 0x5F02, 0x17E6, 0x5F04, 0x0493, 0x5F05, 0x1879,
- 0x5F07, 0x1AD5, 0x5F08, 0x0715, 0x5F0A, 0x0FCC, 0x5F0B, 0x028F,
- 0x5F0F, 0x03CC, 0x5F12, 0x0E03, 0x5F13, 0x0290, 0x5F14, 0x02CE,
- 0x5F15, 0x02CF, 0x5F17, 0x033F, 0x5F18, 0x033E, 0x5F1A, 0x17E7,
- 0x5F1B, 0x03CD, 0x5F1D, 0x187A, 0x5F1F, 0x0494, 0x5F22, 0x1973,
- 0x5F23, 0x1974, 0x5F24, 0x1975, 0x5F26, 0x05B8, 0x5F27, 0x05B9,
- 0x5F28, 0x1972, 0x5F29, 0x05BA, 0x5F2D, 0x0716, 0x5F2E, 0x1AD6,
- 0x5F30, 0x1C8D, 0x5F31, 0x08AE, 0x5F33, 0x1C8C, 0x5F35, 0x0A75,
- 0x5F36, 0x1ED3, 0x5F37, 0x0A76, 0x5F38, 0x1ED4, 0x5F3C, 0x0C40,
- 0x5F40, 0x23D1, 0x5F43, 0x267F, 0x5F44, 0x267E, 0x5F46, 0x0FCD,
- 0x5F48, 0x1141, 0x5F49, 0x28CC, 0x5F4A, 0x12AD, 0x5F4B, 0x2B3F,
- 0x5F4C, 0x13CE, 0x5F4E, 0x16C3, 0x5F4F, 0x3416, 0x5F50, 0x022A,
- 0x5F54, 0x1976, 0x5F56, 0x1AD7, 0x5F57, 0x0A77, 0x5F58, 0x212F,
- 0x5F59, 0x0E04, 0x5F5D, 0x14CF, 0x5F61, 0x022B, 0x5F62, 0x0496,
- 0x5F64, 0x0495, 0x5F65, 0x0717, 0x5F67, 0x1C8E, 0x5F69, 0x0A79,
- 0x5F6A, 0x0B89, 0x5F6B, 0x0A7A, 0x5F6C, 0x0A78, 0x5F6D, 0x0C41,
- 0x5F6F, 0x2680, 0x5F70, 0x0FCE, 0x5F71, 0x1142, 0x5F73, 0x1777,
- 0x5F74, 0x17E8, 0x5F76, 0x187C, 0x5F77, 0x0497, 0x5F78, 0x187B,
- 0x5F79, 0x0498, 0x5F7C, 0x05BE, 0x5F7D, 0x1979, 0x5F7E, 0x1978,
- 0x5F7F, 0x05BD, 0x5F80, 0x05BB, 0x5F81, 0x05BC, 0x5F82, 0x1977,
- 0x5F85, 0x0719, 0x5F86, 0x1AD8, 0x5F87, 0x071C, 0x5F88, 0x0718,
- 0x5F89, 0x071E, 0x5F8A, 0x071A, 0x5F8B, 0x071B, 0x5F8C, 0x071D,
- 0x5F90, 0x08B1, 0x5F91, 0x08B0, 0x5F92, 0x08AF, 0x5F96, 0x1ED6,
- 0x5F97, 0x0A7B, 0x5F98, 0x0A7E, 0x5F99, 0x0A7C, 0x5F9B, 0x1ED5,
- 0x5F9C, 0x0A81, 0x5F9E, 0x0A7D, 0x5F9F, 0x1ED7, 0x5FA0, 0x0A80,
- 0x5FA1, 0x0A7F, 0x5FA5, 0x2131, 0x5FA6, 0x2130, 0x5FA8, 0x0C44,
- 0x5FA9, 0x0C42, 0x5FAA, 0x0C43, 0x5FAB, 0x2132, 0x5FAC, 0x0E05,
- 0x5FAD, 0x23D3, 0x5FAE, 0x0E06, 0x5FAF, 0x23D2, 0x5FB2, 0x28CD,
- 0x5FB5, 0x1144, 0x5FB6, 0x2681, 0x5FB7, 0x1143, 0x5FB9, 0x0FCF,
- 0x5FBB, 0x2B41, 0x5FBC, 0x2B40, 0x5FBD, 0x13CF, 0x5FBE, 0x2D5E,
- 0x5FBF, 0x308E, 0x5FC0, 0x31D1, 0x5FC1, 0x31D2, 0x5FC3, 0x02D0,
- 0x5FC5, 0x0340, 0x5FC9, 0x17A7, 0x5FCC, 0x049A, 0x5FCD, 0x049C,
- 0x5FCF, 0x17EB, 0x5FD0, 0x187F, 0x5FD1, 0x187E, 0x5FD2, 0x187D,
- 0x5FD4, 0x17EA, 0x5FD5, 0x17E9, 0x5FD6, 0x03CF, 0x5FD7, 0x049B,
- 0x5FD8, 0x0499, 0x5FD9, 0x03CE, 0x5FDD, 0x05BF, 0x5FDE, 0x197A,
- 0x5FE0, 0x05C0, 0x5FE1, 0x1884, 0x5FE3, 0x1886, 0x5FE4, 0x1885,
- 0x5FE5, 0x197B, 0x5FE8, 0x1881, 0x5FEA, 0x04A0, 0x5FEB, 0x049E,
- 0x5FED, 0x1880, 0x5FEE, 0x1882, 0x5FEF, 0x1888, 0x5FF1, 0x049D,
- 0x5FF3, 0x1883, 0x5FF4, 0x188C, 0x5FF5, 0x05C2, 0x5FF7, 0x1889,
- 0x5FF8, 0x049F, 0x5FFA, 0x1887, 0x5FFB, 0x188A, 0x5FFD, 0x05C1,
- 0x5FFF, 0x05C3, 0x6000, 0x188B, 0x6009, 0x198F, 0x600A, 0x1982,
- 0x600B, 0x1980, 0x600C, 0x198E, 0x600D, 0x1989, 0x600E, 0x0723,
- 0x600F, 0x05C4, 0x6010, 0x198A, 0x6011, 0x198D, 0x6012, 0x071F,
- 0x6013, 0x198C, 0x6014, 0x05C5, 0x6015, 0x05CA, 0x6016, 0x05C8,
- 0x6017, 0x1983, 0x6019, 0x197E, 0x601A, 0x1985, 0x601B, 0x05CF,
- 0x601C, 0x1990, 0x601D, 0x0720, 0x601E, 0x1986, 0x6020, 0x0721,
- 0x6021, 0x05CB, 0x6022, 0x1988, 0x6024, 0x1AE7, 0x6025, 0x0722,
- 0x6026, 0x197D, 0x6027, 0x05CC, 0x6028, 0x0724, 0x6029, 0x05CD,
- 0x602A, 0x05C9, 0x602B, 0x05CE, 0x602C, 0x1987, 0x602D, 0x197C,
- 0x602E, 0x198B, 0x602F, 0x05C6, 0x6032, 0x197F, 0x6033, 0x1984,
- 0x6034, 0x1981, 0x6035, 0x05C7, 0x6037, 0x1AD9, 0x6039, 0x1ADA,
- 0x6040, 0x1AE4, 0x6041, 0x1C92, 0x6042, 0x1AE5, 0x6043, 0x072A,
- 0x6044, 0x1AE8, 0x6045, 0x1ADE, 0x6046, 0x0729, 0x6047, 0x1AE0,
- 0x6049, 0x1AE1, 0x604C, 0x1AE3, 0x604D, 0x0725, 0x6050, 0x08B5,
- 0x6052, 0x36EC, 0x6053, 0x1ADF, 0x6054, 0x1ADB, 0x6055, 0x08B6,
- 0x6058, 0x1AE9, 0x6059, 0x08B2, 0x605A, 0x1C90, 0x605B, 0x1AE2,
- 0x605D, 0x1C8F, 0x605E, 0x1ADD, 0x605F, 0x1AE6, 0x6062, 0x0728,
- 0x6063, 0x08B3, 0x6064, 0x072E, 0x6065, 0x08B4, 0x6066, 0x1AEA,
- 0x6067, 0x1C91, 0x6068, 0x0727, 0x6069, 0x08B8, 0x606A, 0x072D,
- 0x606B, 0x072C, 0x606C, 0x072B, 0x606D, 0x08B7, 0x606E, 0x1AEB,
- 0x606F, 0x08B9, 0x6070, 0x0726, 0x6072, 0x1ADC, 0x607F, 0x0A82,
- 0x6080, 0x1C95, 0x6081, 0x1C97, 0x6083, 0x1C99, 0x6084, 0x08BA,
- 0x6085, 0x08C0, 0x6086, 0x1EDA, 0x6087, 0x1C9D, 0x6088, 0x1C94,
- 0x6089, 0x0A84, 0x608A, 0x1ED8, 0x608C, 0x08BF, 0x608D, 0x08BD,
- 0x608E, 0x1C9F, 0x6090, 0x1ED9, 0x6092, 0x1C96, 0x6094, 0x08BE,
- 0x6095, 0x1C9A, 0x6096, 0x08C1, 0x6097, 0x1C9C, 0x609A, 0x08BC,
- 0x609B, 0x1C9B, 0x609C, 0x1C9E, 0x609D, 0x1C98, 0x609F, 0x08BB,
- 0x60A0, 0x0A85, 0x60A2, 0x1C93, 0x60A3, 0x0A83, 0x60A8, 0x0A86,
- 0x60B0, 0x1EDC, 0x60B1, 0x1EE5, 0x60B2, 0x0C47, 0x60B4, 0x0A88,
- 0x60B5, 0x0A8D, 0x60B6, 0x0C48, 0x60B7, 0x1EE7, 0x60B8, 0x0A94,
- 0x60B9, 0x2134, 0x60BA, 0x1EDD, 0x60BB, 0x0A8C, 0x60BC, 0x0A8F,
- 0x60BD, 0x0A8A, 0x60BE, 0x1EDB, 0x60BF, 0x1EE9, 0x60C0, 0x1EEC,
- 0x60C1, 0x2143, 0x60C3, 0x1EEA, 0x60C4, 0x2138, 0x60C5, 0x0A8B,
- 0x60C6, 0x0A92, 0x60C7, 0x0A96, 0x60C8, 0x1EE4, 0x60C9, 0x2133,
- 0x60CA, 0x1EE8, 0x60CB, 0x0A87, 0x60CC, 0x2135, 0x60CD, 0x1EEB,
- 0x60CE, 0x2137, 0x60CF, 0x1EE0, 0x60D1, 0x0C45, 0x60D3, 0x1EDE,
- 0x60D4, 0x1EDF, 0x60D5, 0x0A91, 0x60D8, 0x0A90, 0x60D9, 0x1EE2,
- 0x60DA, 0x0A95, 0x60DB, 0x1EE6, 0x60DC, 0x0A8E, 0x60DD, 0x1EE3,
- 0x60DF, 0x0A93, 0x60E0, 0x0C49, 0x60E1, 0x0C46, 0x60E2, 0x2136,
- 0x60E4, 0x1EE1, 0x60E6, 0x0A89, 0x60F0, 0x0C4E, 0x60F1, 0x0C52,
- 0x60F2, 0x213A, 0x60F3, 0x0E0B, 0x60F4, 0x0C50, 0x60F5, 0x213E,
- 0x60F6, 0x0C54, 0x60F7, 0x23D4, 0x60F8, 0x2140, 0x60F9, 0x0E0D,
- 0x60FA, 0x0C4C, 0x60FB, 0x0C4F, 0x60FC, 0x2141, 0x60FE, 0x2142,
- 0x60FF, 0x2148, 0x6100, 0x0C56, 0x6101, 0x0E0E, 0x6103, 0x2144,
- 0x6104, 0x2149, 0x6105, 0x213D, 0x6106, 0x0E18, 0x6108, 0x0E0F,
- 0x6109, 0x0C55, 0x610A, 0x213B, 0x610B, 0x214A, 0x610D, 0x0E17,
- 0x610E, 0x0C53, 0x610F, 0x0E08, 0x6110, 0x2147, 0x6112, 0x0C57,
- 0x6113, 0x213F, 0x6114, 0x2139, 0x6115, 0x0C4D, 0x6116, 0x213C,
- 0x6118, 0x2145, 0x611A, 0x0E07, 0x611B, 0x0E0C, 0x611C, 0x0C4A,
- 0x611D, 0x2146, 0x611F, 0x0E0A, 0x6123, 0x0C4B, 0x6127, 0x0E16,
- 0x6128, 0x2683, 0x6129, 0x23DF, 0x612B, 0x23D7, 0x612C, 0x2682,
- 0x612E, 0x23DB, 0x612F, 0x23DD, 0x6132, 0x23DA, 0x6134, 0x0E15,
- 0x6136, 0x23D9, 0x6137, 0x0E19, 0x613B, 0x2692, 0x613E, 0x0E14,
- 0x613F, 0x0FD1, 0x6140, 0x23E0, 0x6141, 0x2684, 0x6144, 0x0E12,
- 0x6145, 0x23D8, 0x6146, 0x23DC, 0x6147, 0x0FD0, 0x6148, 0x0E09,
- 0x6149, 0x23D5, 0x614A, 0x23D6, 0x614B, 0x0FD2, 0x614C, 0x0E11,
- 0x614D, 0x0E13, 0x614E, 0x0E10, 0x614F, 0x23DE, 0x6152, 0x2688,
- 0x6153, 0x2689, 0x6154, 0x268E, 0x6155, 0x1149, 0x6156, 0x2695,
- 0x6158, 0x0FD8, 0x615A, 0x0FD7, 0x615B, 0x2690, 0x615D, 0x1148,
- 0x615E, 0x2685, 0x615F, 0x0FD6, 0x6161, 0x2694, 0x6162, 0x0FD4,
- 0x6163, 0x0FD5, 0x6165, 0x2691, 0x6166, 0x28DE, 0x6167, 0x1146,
- 0x6168, 0x0C51, 0x616A, 0x2693, 0x616B, 0x114D, 0x616C, 0x268B,
- 0x616E, 0x1147, 0x6170, 0x114C, 0x6171, 0x2686, 0x6172, 0x268A,
- 0x6173, 0x2687, 0x6174, 0x268D, 0x6175, 0x0FD9, 0x6176, 0x1145,
- 0x6177, 0x0FD3, 0x6179, 0x28D0, 0x617A, 0x268F, 0x617C, 0x114B,
- 0x617E, 0x114E, 0x6180, 0x268C, 0x6182, 0x114A, 0x6183, 0x28CF,
- 0x6189, 0x28D4, 0x618A, 0x12B1, 0x618B, 0x28CE, 0x618C, 0x2B4D,
- 0x618D, 0x28DD, 0x618E, 0x1152, 0x6190, 0x1150, 0x6191, 0x12AF,
- 0x6192, 0x28DA, 0x6193, 0x28D6, 0x6194, 0x1156, 0x6196, 0x2B44,
- 0x619A, 0x1154, 0x619B, 0x28D5, 0x619D, 0x2B42, 0x619F, 0x28D9,
- 0x61A1, 0x28DC, 0x61A2, 0x28D3, 0x61A4, 0x1155, 0x61A7, 0x114F,
- 0x61A8, 0x2B43, 0x61A9, 0x12B0, 0x61AA, 0x28DB, 0x61AB, 0x1151,
- 0x61AC, 0x1153, 0x61AD, 0x28D8, 0x61AE, 0x1157, 0x61AF, 0x28D7,
- 0x61B0, 0x28D2, 0x61B1, 0x28D1, 0x61B2, 0x12AE, 0x61B3, 0x28DF,
- 0x61B4, 0x2B46, 0x61B5, 0x2D60, 0x61B6, 0x12B3, 0x61B8, 0x2B4C,
- 0x61BA, 0x2B4A, 0x61BC, 0x2D61, 0x61BE, 0x12B4, 0x61BF, 0x2B4B,
- 0x61C1, 0x2B48, 0x61C2, 0x13D1, 0x61C3, 0x2D5F, 0x61C5, 0x2B45,
- 0x61C6, 0x2B47, 0x61C7, 0x13D2, 0x61C8, 0x12B6, 0x61C9, 0x13D0,
- 0x61CA, 0x12B5, 0x61CB, 0x13D4, 0x61CC, 0x2B49, 0x61CD, 0x12B2,
- 0x61D6, 0x2F26, 0x61D8, 0x2F1E, 0x61DE, 0x2D67, 0x61DF, 0x2F1F,
- 0x61E0, 0x2D63, 0x61E3, 0x14D0, 0x61E4, 0x2D65, 0x61E5, 0x2D64,
- 0x61E6, 0x13D3, 0x61E7, 0x2D62, 0x61E8, 0x2D66, 0x61E9, 0x2F27,
- 0x61EA, 0x2F23, 0x61EB, 0x2F25, 0x61ED, 0x2F20, 0x61EE, 0x2F21,
- 0x61F0, 0x2F24, 0x61F1, 0x2F22, 0x61F2, 0x157E, 0x61F5, 0x1581,
- 0x61F6, 0x1580, 0x61F7, 0x157F, 0x61F8, 0x1614, 0x61F9, 0x31D3,
- 0x61FA, 0x1615, 0x61FB, 0x308F, 0x61FC, 0x1670, 0x61FD, 0x32D1,
- 0x61FE, 0x1671, 0x61FF, 0x16C4, 0x6200, 0x16F8, 0x6201, 0x3417,
- 0x6203, 0x3418, 0x6204, 0x3419, 0x6207, 0x3533, 0x6208, 0x02D1,
- 0x6209, 0x17A8, 0x620A, 0x0341, 0x620C, 0x03D1, 0x620D, 0x03D2,
- 0x620E, 0x03D0, 0x6210, 0x03D3, 0x6211, 0x04A2, 0x6212, 0x04A1,
- 0x6214, 0x1991, 0x6215, 0x05D1, 0x6216, 0x05D0, 0x6219, 0x1CA0,
- 0x621A, 0x0A97, 0x621B, 0x0A98, 0x621F, 0x0C58, 0x6220, 0x23E1,
- 0x6221, 0x0E1A, 0x6222, 0x0E1B, 0x6223, 0x23E3, 0x6224, 0x23E5,
- 0x6225, 0x23E4, 0x6227, 0x2697, 0x6229, 0x2696, 0x622A, 0x0FDA,
- 0x622B, 0x2698, 0x622D, 0x28E0, 0x622E, 0x1158, 0x6230, 0x12B7,
- 0x6232, 0x13D5, 0x6233, 0x14D1, 0x6234, 0x13D6, 0x6236, 0x02D2,
- 0x623A, 0x188D, 0x623D, 0x1992, 0x623E, 0x05D3, 0x623F, 0x05D2,
- 0x6240, 0x05D4, 0x6241, 0x072F, 0x6242, 0x1AEC, 0x6243, 0x1AED,
- 0x6246, 0x1CA1, 0x6247, 0x08C2, 0x6248, 0x0A99, 0x6249, 0x0C59,
- 0x624A, 0x214B, 0x624B, 0x02D3, 0x624D, 0x0291, 0x624E, 0x02D4,
- 0x6250, 0x17A9, 0x6251, 0x0345, 0x6252, 0x0344, 0x6253, 0x0342,
- 0x6254, 0x0343, 0x6258, 0x03D6, 0x6259, 0x17F2, 0x625A, 0x17F4,
- 0x625B, 0x03D5, 0x625C, 0x17EC, 0x625E, 0x17ED, 0x6260, 0x17F3,
- 0x6261, 0x17EF, 0x6262, 0x17F1, 0x6263, 0x03D4, 0x6264, 0x17EE,
- 0x6265, 0x17F5, 0x6266, 0x17F0, 0x626D, 0x04A9, 0x626E, 0x04B2,
- 0x626F, 0x04B0, 0x6270, 0x1897, 0x6271, 0x1894, 0x6272, 0x189C,
- 0x6273, 0x04AE, 0x6274, 0x189D, 0x6276, 0x04A7, 0x6277, 0x189A,
- 0x6279, 0x04AD, 0x627A, 0x1896, 0x627B, 0x1895, 0x627C, 0x04AB,
- 0x627D, 0x189B, 0x627E, 0x04AC, 0x627F, 0x05D5, 0x6280, 0x04A6,
- 0x6281, 0x1898, 0x6283, 0x188E, 0x6284, 0x04A3, 0x6286, 0x04B6,
- 0x6287, 0x1893, 0x6288, 0x1899, 0x6289, 0x04A8, 0x628A, 0x04AA,
- 0x628C, 0x188F, 0x628E, 0x1890, 0x628F, 0x1891, 0x6291, 0x04B5,
- 0x6292, 0x04AF, 0x6293, 0x04B4, 0x6294, 0x1892, 0x6295, 0x04B3,
- 0x6296, 0x04A5, 0x6297, 0x04A4, 0x6298, 0x04B1, 0x62A8, 0x05E3,
- 0x62A9, 0x199E, 0x62AA, 0x1997, 0x62AB, 0x05DE, 0x62AC, 0x05F1,
- 0x62AD, 0x1993, 0x62AE, 0x199A, 0x62AF, 0x199C, 0x62B0, 0x199F,
- 0x62B1, 0x05EC, 0x62B3, 0x199B, 0x62B4, 0x1994, 0x62B5, 0x05EA,
- 0x62B6, 0x1998, 0x62B8, 0x19A0, 0x62B9, 0x05DB, 0x62BB, 0x199D,
- 0x62BC, 0x05E5, 0x62BD, 0x05E4, 0x62BE, 0x1996, 0x62BF, 0x05D9,
- 0x62C2, 0x05DA, 0x62C4, 0x05D8, 0x62C6, 0x05F0, 0x62C7, 0x05E8,
- 0x62C8, 0x05E2, 0x62C9, 0x05D6, 0x62CA, 0x1999, 0x62CB, 0x05E1,
- 0x62CC, 0x05D7, 0x62CD, 0x05E9, 0x62CE, 0x05F2, 0x62CF, 0x1AEE,
- 0x62D0, 0x05E6, 0x62D1, 0x1995, 0x62D2, 0x05DC, 0x62D3, 0x05DF,
- 0x62D4, 0x05E0, 0x62D6, 0x05EE, 0x62D7, 0x05EF, 0x62D8, 0x05ED,
- 0x62D9, 0x05E7, 0x62DA, 0x05EB, 0x62DB, 0x05DD, 0x62DC, 0x0730,
- 0x62EB, 0x1AF4, 0x62EC, 0x073C, 0x62ED, 0x0734, 0x62EE, 0x0736,
- 0x62EF, 0x073B, 0x62F0, 0x1B00, 0x62F1, 0x0739, 0x62F2, 0x1CA2,
- 0x62F3, 0x08C3, 0x62F4, 0x073E, 0x62F5, 0x1AF1, 0x62F6, 0x1AF9,
- 0x62F7, 0x073A, 0x62F8, 0x1AF8, 0x62F9, 0x1AF5, 0x62FA, 0x1AFD,
- 0x62FB, 0x1AFF, 0x62FC, 0x0733, 0x62FD, 0x0737, 0x62FE, 0x073D,
- 0x62FF, 0x08C5, 0x6300, 0x1AFA, 0x6301, 0x0735, 0x6302, 0x0740,
- 0x6303, 0x1AF3, 0x6307, 0x0738, 0x6308, 0x08C4, 0x6309, 0x0732,
- 0x630B, 0x1AF0, 0x630C, 0x1AF7, 0x630D, 0x1AEF, 0x630E, 0x1AF2,
- 0x630F, 0x1AF6, 0x6310, 0x1CA3, 0x6311, 0x073F, 0x6313, 0x1AFB,
- 0x6314, 0x1AFC, 0x6315, 0x1AFE, 0x6316, 0x0731, 0x6328, 0x08D3,
- 0x6329, 0x1CAF, 0x632A, 0x08D1, 0x632B, 0x08D2, 0x632C, 0x1CA5,
- 0x632D, 0x1CB5, 0x632F, 0x08C8, 0x6332, 0x1EED, 0x6333, 0x1CB7,
- 0x6334, 0x1CB1, 0x6336, 0x1CA8, 0x6338, 0x1CBA, 0x6339, 0x1CAB,
- 0x633A, 0x08CE, 0x633B, 0x1F04, 0x633C, 0x1CAE, 0x633D, 0x08D0,
- 0x633E, 0x08C7, 0x6340, 0x1CBC, 0x6341, 0x1CB0, 0x6342, 0x08CA,
- 0x6343, 0x1CA9, 0x6344, 0x1CA6, 0x6345, 0x1CA7, 0x6346, 0x08CB,
- 0x6347, 0x1CB6, 0x6348, 0x1CBD, 0x6349, 0x08CD, 0x634A, 0x1CAD,
- 0x634B, 0x1CAC, 0x634C, 0x08D5, 0x634D, 0x08D4, 0x634E, 0x08C6,
- 0x634F, 0x08CC, 0x6350, 0x08CF, 0x6351, 0x1CB9, 0x6354, 0x1CB3,
- 0x6355, 0x08C9, 0x6356, 0x1CA4, 0x6357, 0x1CBB, 0x6358, 0x1CB2,
- 0x6359, 0x1CB4, 0x635A, 0x1CB8, 0x6365, 0x1EEE, 0x6367, 0x0AA1,
- 0x6368, 0x0AB5, 0x6369, 0x0AB4, 0x636B, 0x0AA9, 0x636D, 0x1F00,
- 0x636E, 0x1EFC, 0x636F, 0x1EF9, 0x6370, 0x1F0B, 0x6371, 0x0AA4,
- 0x6372, 0x0A9C, 0x6375, 0x1EFE, 0x6376, 0x0C69, 0x6377, 0x0AA0,
- 0x6378, 0x1F06, 0x637A, 0x0AB6, 0x637B, 0x0AB3, 0x637C, 0x1F02,
- 0x637D, 0x1EF1, 0x6380, 0x0AB2, 0x6381, 0x1F08, 0x6382, 0x1EF0,
- 0x6383, 0x0AA7, 0x6384, 0x0AAB, 0x6385, 0x1F07, 0x6387, 0x1EFA,
- 0x6388, 0x0AAC, 0x6389, 0x0AA6, 0x638A, 0x1EEF, 0x638C, 0x0C5B,
- 0x638D, 0x1F0A, 0x638E, 0x1EF8, 0x638F, 0x0AB1, 0x6390, 0x1EFB,
- 0x6391, 0x1F09, 0x6392, 0x0AB0, 0x6394, 0x214C, 0x6396, 0x0A9D,
- 0x6397, 0x1EF6, 0x6398, 0x0AA2, 0x6399, 0x0AAD, 0x639B, 0x0AA8,
- 0x639C, 0x1EFF, 0x639D, 0x1EF5, 0x639E, 0x1EF3, 0x639F, 0x1F05,
- 0x63A0, 0x0A9A, 0x63A1, 0x0AAE, 0x63A2, 0x0A9E, 0x63A3, 0x0C5A,
- 0x63A4, 0x1F03, 0x63A5, 0x0A9F, 0x63A7, 0x0A9B, 0x63A8, 0x0AAA,
- 0x63A9, 0x0AA5, 0x63AA, 0x0AA3, 0x63AB, 0x1EF7, 0x63AC, 0x0AAF,
- 0x63AD, 0x1EF4, 0x63AE, 0x1F01, 0x63AF, 0x1EFD, 0x63B0, 0x214E,
- 0x63B1, 0x214D, 0x63BD, 0x1EF2, 0x63BE, 0x215E, 0x63C0, 0x0C5D,
- 0x63C2, 0x2164, 0x63C3, 0x2153, 0x63C4, 0x2161, 0x63C5, 0x23E6,
- 0x63C6, 0x0C60, 0x63C7, 0x2165, 0x63C8, 0x2168, 0x63C9, 0x0C5F,
- 0x63CA, 0x2156, 0x63CB, 0x2167, 0x63CC, 0x2166, 0x63CD, 0x0C61,
- 0x63CE, 0x214F, 0x63CF, 0x0C5C, 0x63D0, 0x0C64, 0x63D2, 0x0C62,
- 0x63D3, 0x2163, 0x63D5, 0x2159, 0x63D6, 0x0C66, 0x63D7, 0x216A,
- 0x63D8, 0x2162, 0x63D9, 0x216B, 0x63DA, 0x0C6E, 0x63DB, 0x0C6C,
- 0x63DC, 0x2160, 0x63DD, 0x215F, 0x63DF, 0x215D, 0x63E0, 0x2157,
- 0x63E1, 0x0C65, 0x63E3, 0x0C63, 0x63E4, 0x1CAA, 0x63E5, 0x2150,
- 0x63E7, 0x2404, 0x63E8, 0x2151, 0x63E9, 0x0C5E, 0x63EA, 0x0C6B,
- 0x63EB, 0x23E8, 0x63ED, 0x0C67, 0x63EE, 0x0C68, 0x63EF, 0x2152,
- 0x63F0, 0x2169, 0x63F1, 0x23E7, 0x63F2, 0x215A, 0x63F3, 0x2155,
- 0x63F4, 0x0C6A, 0x63F5, 0x215B, 0x63F6, 0x2158, 0x63F9, 0x0C6F,
- 0x6406, 0x0E2A, 0x6409, 0x23EB, 0x640A, 0x23FE, 0x640B, 0x2403,
- 0x640C, 0x23F7, 0x640D, 0x0E26, 0x640E, 0x2408, 0x640F, 0x0E23,
- 0x6410, 0x23E9, 0x6412, 0x23EA, 0x6413, 0x0E1C, 0x6414, 0x0E25,
- 0x6415, 0x23F1, 0x6416, 0x0E28, 0x6417, 0x0E29, 0x6418, 0x23F2,
- 0x641A, 0x23FF, 0x641B, 0x2405, 0x641C, 0x0E24, 0x641E, 0x0E1E,
- 0x641F, 0x23F0, 0x6420, 0x23EC, 0x6421, 0x2407, 0x6422, 0x23F5,
- 0x6423, 0x23F6, 0x6424, 0x23ED, 0x6425, 0x2401, 0x6426, 0x23F8,
- 0x6427, 0x2402, 0x6428, 0x23FA, 0x642A, 0x0E1F, 0x642B, 0x2699,
- 0x642C, 0x0E22, 0x642D, 0x0E20, 0x642E, 0x2406, 0x642F, 0x23FD,
- 0x6430, 0x23F9, 0x6433, 0x23EE, 0x6434, 0x0FE4, 0x6435, 0x23FC,
- 0x6436, 0x0E27, 0x6437, 0x23F4, 0x6439, 0x23F3, 0x643D, 0x0E21,
- 0x643E, 0x0E1D, 0x643F, 0x26AE, 0x6440, 0x2400, 0x6441, 0x23FB,
- 0x6443, 0x23EF, 0x644B, 0x26A9, 0x644D, 0x269A, 0x644E, 0x26A5,
- 0x6450, 0x26AC, 0x6451, 0x0FE2, 0x6452, 0x0C6D, 0x6453, 0x26AA,
- 0x6454, 0x0FDD, 0x6458, 0x0FDC, 0x6459, 0x26B1, 0x645B, 0x269B,
- 0x645C, 0x26A8, 0x645D, 0x269C, 0x645E, 0x26A7, 0x645F, 0x0FE0,
- 0x6460, 0x26AB, 0x6461, 0x215C, 0x6465, 0x26B2, 0x6466, 0x26A3,
- 0x6467, 0x0FE3, 0x6468, 0x28EE, 0x6469, 0x1159, 0x646B, 0x26B0,
- 0x646C, 0x26AF, 0x646D, 0x0FE5, 0x646E, 0x28E1, 0x646F, 0x115A,
- 0x6470, 0x28E2, 0x6472, 0x269F, 0x6473, 0x26A0, 0x6474, 0x269D,
- 0x6475, 0x26A2, 0x6476, 0x269E, 0x6477, 0x26B3, 0x6478, 0x0FDF,
- 0x6479, 0x115B, 0x647A, 0x0FE1, 0x647B, 0x0FE6, 0x647D, 0x26A1,
- 0x647F, 0x26AD, 0x6482, 0x26A6, 0x6485, 0x28E5, 0x6487, 0x0FDB,
- 0x6488, 0x115E, 0x6489, 0x2B54, 0x648A, 0x28EA, 0x648B, 0x28E9,
- 0x648C, 0x28EB, 0x648F, 0x28E8, 0x6490, 0x115F, 0x6492, 0x1165,
- 0x6493, 0x1162, 0x6495, 0x1163, 0x6496, 0x28E3, 0x6497, 0x28E6,
- 0x6498, 0x28F0, 0x6499, 0x116B, 0x649A, 0x1169, 0x649C, 0x28E7,
- 0x649D, 0x2154, 0x649E, 0x115C, 0x649F, 0x28ED, 0x64A0, 0x28E4,
- 0x64A2, 0x116C, 0x64A3, 0x28EC, 0x64A4, 0x0FDE, 0x64A5, 0x1161,
- 0x64A6, 0x26A4, 0x64A9, 0x1164, 0x64AB, 0x1168, 0x64AC, 0x116A,
- 0x64AD, 0x1167, 0x64AE, 0x1166, 0x64B0, 0x1160, 0x64B1, 0x28EF,
- 0x64B2, 0x115D, 0x64B3, 0x116D, 0x64BB, 0x12BB, 0x64BC, 0x12BC,
- 0x64BD, 0x2B53, 0x64BE, 0x12C5, 0x64BF, 0x12C2, 0x64C1, 0x12B9,
- 0x64C2, 0x12C0, 0x64C3, 0x2B55, 0x64C4, 0x12BE, 0x64C5, 0x12B8,
- 0x64C7, 0x12BF, 0x64C9, 0x2B52, 0x64CA, 0x13D8, 0x64CB, 0x12BA,
- 0x64CD, 0x12C1, 0x64CE, 0x13D7, 0x64CF, 0x2B51, 0x64D0, 0x2B50,
- 0x64D2, 0x12C3, 0x64D4, 0x12C4, 0x64D6, 0x2B4F, 0x64D7, 0x2B4E,
- 0x64D8, 0x13D9, 0x64D9, 0x2B58, 0x64DA, 0x12BD, 0x64DB, 0x2B56,
- 0x64E0, 0x13DA, 0x64E2, 0x13DF, 0x64E3, 0x2D6A, 0x64E4, 0x2D6C,
- 0x64E6, 0x13DC, 0x64E8, 0x2D6D, 0x64E9, 0x2D69, 0x64EB, 0x2D6B,
- 0x64EC, 0x13DD, 0x64ED, 0x13E0, 0x64EF, 0x2D68, 0x64F0, 0x13DB,
- 0x64F1, 0x13DE, 0x64F2, 0x14D3, 0x64F3, 0x2B57, 0x64F4, 0x14D2,
- 0x64F7, 0x14D8, 0x64F8, 0x2F2B, 0x64FA, 0x14D6, 0x64FB, 0x14D7,
- 0x64FC, 0x2F2E, 0x64FD, 0x2F2A, 0x64FE, 0x14D4, 0x64FF, 0x2F28,
- 0x6500, 0x1582, 0x6501, 0x2F2C, 0x6503, 0x2F2D, 0x6504, 0x2F29,
- 0x6506, 0x14D5, 0x6507, 0x3090, 0x6509, 0x3093, 0x650C, 0x3094,
- 0x650D, 0x3092, 0x650E, 0x3095, 0x650F, 0x1583, 0x6510, 0x3091,
- 0x6513, 0x31D7, 0x6514, 0x1617, 0x6515, 0x31D6, 0x6516, 0x31D5,
- 0x6517, 0x31D4, 0x6518, 0x1616, 0x6519, 0x1618, 0x651B, 0x32D2,
- 0x651C, 0x1673, 0x651D, 0x1672, 0x6520, 0x3382, 0x6521, 0x3381,
- 0x6522, 0x3384, 0x6523, 0x16F9, 0x6524, 0x16C5, 0x6525, 0x341B,
- 0x6526, 0x3383, 0x6529, 0x341A, 0x652A, 0x16FB, 0x652B, 0x16FA,
- 0x652C, 0x1721, 0x652D, 0x3484, 0x652E, 0x34CA, 0x652F, 0x02D5,
- 0x6532, 0x216C, 0x6533, 0x2B59, 0x6534, 0x022C, 0x6536, 0x03D7,
- 0x6537, 0x17F6, 0x6538, 0x04B9, 0x6539, 0x04B7, 0x653B, 0x04B8,
- 0x653D, 0x19A1, 0x653E, 0x05F3, 0x653F, 0x0741, 0x6541, 0x1B01,
- 0x6543, 0x1B02, 0x6545, 0x0742, 0x6546, 0x1CBF, 0x6548, 0x08D6,
- 0x6549, 0x08D7, 0x654A, 0x1CBE, 0x654F, 0x0ABD, 0x6551, 0x0AB9,
- 0x6553, 0x1F0C, 0x6554, 0x0AC0, 0x6555, 0x0ABF, 0x6556, 0x0AB8,
- 0x6557, 0x0ABB, 0x6558, 0x0ABE, 0x6559, 0x0ABA, 0x655C, 0x2170,
- 0x655D, 0x0AB7, 0x655E, 0x0C70, 0x6562, 0x0C72, 0x6563, 0x0C73,
- 0x6564, 0x216F, 0x6565, 0x2172, 0x6566, 0x0C71, 0x6567, 0x216D,
- 0x6568, 0x2171, 0x656A, 0x216E, 0x656C, 0x0E2B, 0x656F, 0x2409,
- 0x6572, 0x0FE7, 0x6573, 0x26B4, 0x6574, 0x12C6, 0x6575, 0x116E,
- 0x6576, 0x28F1, 0x6577, 0x116F, 0x6578, 0x1170, 0x6579, 0x28F3,
- 0x657A, 0x28F2, 0x657B, 0x28F4, 0x657C, 0x2B5B, 0x657F, 0x2B5A,
- 0x6580, 0x2D6F, 0x6581, 0x2D6E, 0x6582, 0x13E1, 0x6583, 0x13E2,
- 0x6584, 0x3096, 0x6587, 0x02D6, 0x658C, 0x2173, 0x6590, 0x0C75,
- 0x6591, 0x0C74, 0x6592, 0x240A, 0x6594, 0x2F2F, 0x6595, 0x1674,
- 0x6596, 0x341C, 0x6597, 0x02D7, 0x6599, 0x08D8, 0x659B, 0x0AC2,
- 0x659C, 0x0AC1, 0x659D, 0x2174, 0x659E, 0x2175, 0x659F, 0x0E2C,
- 0x65A0, 0x26B5, 0x65A1, 0x0FE8, 0x65A2, 0x2B5C, 0x65A4, 0x02D8,
- 0x65A5, 0x0346, 0x65A7, 0x05F4, 0x65A8, 0x19A2, 0x65AA, 0x1B03,
- 0x65AB, 0x0743, 0x65AC, 0x0AC3, 0x65AE, 0x2176, 0x65AF, 0x0C76,
- 0x65B0, 0x0E2D, 0x65B2, 0x28F5, 0x65B3, 0x28F6, 0x65B6, 0x2D70,
- 0x65B7, 0x14D9, 0x65B8, 0x34CB, 0x65B9, 0x02D9, 0x65BB, 0x19A3,
- 0x65BC, 0x05F5, 0x65BD, 0x0744, 0x65BF, 0x1B04, 0x65C1, 0x08D9,
- 0x65C2, 0x1CC3, 0x65C3, 0x1CC1, 0x65C4, 0x1CC2, 0x65C5, 0x08DA,
- 0x65C6, 0x1CC0, 0x65CB, 0x0AC5, 0x65CC, 0x0AC6, 0x65CD, 0x1F0D,
- 0x65CE, 0x0AC7, 0x65CF, 0x0AC4, 0x65D0, 0x2177, 0x65D2, 0x2178,
- 0x65D3, 0x240B, 0x65D6, 0x0FEA, 0x65D7, 0x0FE9, 0x65DA, 0x2D71,
- 0x65DB, 0x2F30, 0x65DD, 0x3098, 0x65DE, 0x3097, 0x65DF, 0x31D8,
- 0x65E0, 0x022D, 0x65E1, 0x1789, 0x65E2, 0x0745, 0x65E5, 0x02DA,
- 0x65E6, 0x0347, 0x65E8, 0x03D9, 0x65E9, 0x03D8, 0x65EC, 0x03DA,
- 0x65ED, 0x03DB, 0x65EE, 0x17F8, 0x65EF, 0x17F7, 0x65F0, 0x189E,
- 0x65F1, 0x04BA, 0x65F2, 0x18A1, 0x65F3, 0x18A0, 0x65F4, 0x189F,
- 0x65F5, 0x18A2, 0x65FA, 0x05F6, 0x65FB, 0x19A9, 0x65FC, 0x19A5,
- 0x65FD, 0x19AE, 0x6600, 0x05FD, 0x6602, 0x05FB, 0x6603, 0x19AA,
- 0x6604, 0x19A6, 0x6605, 0x19AD, 0x6606, 0x05FA, 0x6607, 0x0601,
- 0x6608, 0x19A8, 0x6609, 0x19A4, 0x660A, 0x0600, 0x660B, 0x19AB,
- 0x660C, 0x05F9, 0x660D, 0x19AC, 0x660E, 0x05FC, 0x660F, 0x05FE,
- 0x6610, 0x19B0, 0x6611, 0x19AF, 0x6612, 0x19A7, 0x6613, 0x05F8,
- 0x6614, 0x05F7, 0x6615, 0x05FF, 0x661C, 0x1B09, 0x661D, 0x1B0F,
- 0x661F, 0x074B, 0x6620, 0x0748, 0x6621, 0x1B06, 0x6622, 0x1B0B,
- 0x6624, 0x074E, 0x6625, 0x0746, 0x6626, 0x1B0A, 0x6627, 0x0749,
- 0x6628, 0x074C, 0x662B, 0x1B0D, 0x662D, 0x0747, 0x662E, 0x1B12,
- 0x662F, 0x074A, 0x6631, 0x074D, 0x6632, 0x1B07, 0x6633, 0x1B0C,
- 0x6634, 0x1B10, 0x6635, 0x1B08, 0x6636, 0x1B05, 0x6639, 0x1B11,
- 0x663A, 0x1B0E, 0x6641, 0x08E2, 0x6642, 0x08DB, 0x6643, 0x08DE,
- 0x6645, 0x08E1, 0x6647, 0x1CC6, 0x6649, 0x08DC, 0x664A, 0x1CC4,
- 0x664C, 0x08E0, 0x664F, 0x08DD, 0x6651, 0x1CC7, 0x6652, 0x08DF,
- 0x6659, 0x1F11, 0x665A, 0x0AC9, 0x665B, 0x1F10, 0x665C, 0x1F12,
- 0x665D, 0x0AC8, 0x665E, 0x0ACD, 0x665F, 0x1CC5, 0x6661, 0x1F0F,
- 0x6662, 0x1F13, 0x6664, 0x0ACA, 0x6665, 0x1F0E, 0x6666, 0x0ACC,
- 0x6668, 0x0ACB, 0x666A, 0x217F, 0x666C, 0x217A, 0x666E, 0x0C77,
- 0x666F, 0x0C7B, 0x6670, 0x0C78, 0x6671, 0x217D, 0x6672, 0x2180,
- 0x6674, 0x0C79, 0x6676, 0x0C7A, 0x6677, 0x0C7F, 0x6678, 0x2414,
- 0x6679, 0x217E, 0x667A, 0x0C7D, 0x667B, 0x217B, 0x667C, 0x2179,
- 0x667E, 0x0C7E, 0x6680, 0x217C, 0x6684, 0x0E33, 0x6686, 0x240C,
- 0x6687, 0x0E30, 0x6688, 0x0E31, 0x6689, 0x0E2F, 0x668A, 0x2411,
- 0x668B, 0x2410, 0x668C, 0x240D, 0x668D, 0x0E35, 0x6690, 0x240F,
- 0x6691, 0x0C7C, 0x6694, 0x2413, 0x6695, 0x240E, 0x6696, 0x0E32,
- 0x6697, 0x0E2E, 0x6698, 0x0E34, 0x6699, 0x2412, 0x669D, 0x0FED,
- 0x669F, 0x26B8, 0x66A0, 0x26B7, 0x66A1, 0x26B6, 0x66A2, 0x0FEB,
- 0x66A8, 0x0FEC, 0x66A9, 0x28F9, 0x66AA, 0x28FC, 0x66AB, 0x1172,
- 0x66AE, 0x1171, 0x66AF, 0x28FD, 0x66B0, 0x28F8, 0x66B1, 0x1174,
- 0x66B2, 0x28FA, 0x66B4, 0x1173, 0x66B5, 0x28F7, 0x66B7, 0x28FB,
- 0x66B8, 0x12CC, 0x66B9, 0x12C9, 0x66BA, 0x2B65, 0x66BB, 0x2B64,
- 0x66BD, 0x2B63, 0x66BE, 0x2B5E, 0x66C0, 0x2B5F, 0x66C4, 0x12CA,
- 0x66C6, 0x12C7, 0x66C7, 0x12CB, 0x66C8, 0x2B5D, 0x66C9, 0x12C8,
- 0x66CA, 0x2B60, 0x66CB, 0x2B61, 0x66CC, 0x2B66, 0x66CF, 0x2B62,
- 0x66D2, 0x2D72, 0x66D6, 0x13E4, 0x66D8, 0x2F33, 0x66D9, 0x13E3,
- 0x66DA, 0x2F31, 0x66DB, 0x2F32, 0x66DC, 0x14DA, 0x66DD, 0x1585,
- 0x66DE, 0x3099, 0x66E0, 0x1584, 0x66E3, 0x31DA, 0x66E4, 0x31DB,
- 0x66E6, 0x1619, 0x66E8, 0x31D9, 0x66E9, 0x1675, 0x66EB, 0x341D,
- 0x66EC, 0x16FC, 0x66ED, 0x3485, 0x66EE, 0x3486, 0x66F0, 0x02DB,
- 0x66F2, 0x03DC, 0x66F3, 0x03DD, 0x66F4, 0x04BB, 0x66F6, 0x19B1,
- 0x66F7, 0x074F, 0x66F8, 0x08E3, 0x66F9, 0x0ACE, 0x66FC, 0x0A1F,
- 0x66FE, 0x0C80, 0x66FF, 0x0C81, 0x6700, 0x0BF0, 0x6701, 0x2181,
- 0x6703, 0x0E36, 0x6704, 0x26BA, 0x6705, 0x26B9, 0x6708, 0x02DC,
- 0x6709, 0x03DE, 0x670A, 0x19B2, 0x670B, 0x0603, 0x670D, 0x0602,
- 0x670F, 0x1B13, 0x6710, 0x1B14, 0x6712, 0x1CC8, 0x6713, 0x1CC9,
- 0x6714, 0x08E4, 0x6715, 0x08E5, 0x6717, 0x08E6, 0x6718, 0x1F14,
- 0x671B, 0x0AD0, 0x671D, 0x0C83, 0x671F, 0x0C82, 0x6720, 0x2415,
- 0x6721, 0x2522, 0x6722, 0x26BB, 0x6723, 0x2B67, 0x6726, 0x14DB,
- 0x6727, 0x161A, 0x6728, 0x02DD, 0x672A, 0x034A, 0x672B, 0x034B,
- 0x672C, 0x0349, 0x672D, 0x034C, 0x672E, 0x0348, 0x6731, 0x03E1,
- 0x6733, 0x1800, 0x6734, 0x03E0, 0x6735, 0x03E2, 0x6738, 0x17FB,
- 0x6739, 0x17FA, 0x673A, 0x17FD, 0x673B, 0x17FC, 0x673C, 0x17FF,
- 0x673D, 0x03DF, 0x673E, 0x17F9, 0x673F, 0x17FE, 0x6745, 0x18A3,
- 0x6746, 0x04C5, 0x6747, 0x18A4, 0x6748, 0x18A8, 0x6749, 0x04C4,
- 0x674B, 0x18AC, 0x674C, 0x18A7, 0x674D, 0x18AA, 0x674E, 0x04BD,
- 0x674F, 0x04BE, 0x6750, 0x04BF, 0x6751, 0x04C0, 0x6753, 0x04C7,
- 0x6755, 0x18A6, 0x6756, 0x04C2, 0x6757, 0x04C8, 0x6759, 0x18A5,
- 0x675A, 0x18AB, 0x675C, 0x04C1, 0x675D, 0x18A9, 0x675E, 0x04C3,
- 0x675F, 0x04BC, 0x6760, 0x04C6, 0x676A, 0x0618, 0x676C, 0x19B4,
- 0x676D, 0x0604, 0x676F, 0x060E, 0x6770, 0x060F, 0x6771, 0x0607,
- 0x6772, 0x0619, 0x6773, 0x0609, 0x6774, 0x19BC, 0x6775, 0x0614,
- 0x6776, 0x19B7, 0x6777, 0x060A, 0x6778, 0x19C6, 0x6779, 0x19C7,
- 0x677A, 0x19BF, 0x677B, 0x19B8, 0x677C, 0x0617, 0x677D, 0x19C4,
- 0x677E, 0x0612, 0x677F, 0x0610, 0x6781, 0x19C5, 0x6783, 0x19C3,
- 0x6784, 0x19BB, 0x6785, 0x19B3, 0x6786, 0x19BA, 0x6787, 0x060B,
- 0x6789, 0x0611, 0x678B, 0x0605, 0x678C, 0x19BE, 0x678D, 0x19BD,
- 0x678E, 0x19B5, 0x6790, 0x0613, 0x6791, 0x19C1, 0x6792, 0x19B6,
- 0x6793, 0x0616, 0x6794, 0x19C8, 0x6795, 0x0606, 0x6797, 0x060D,
- 0x6798, 0x19B9, 0x6799, 0x19C2, 0x679A, 0x0615, 0x679C, 0x0608,
- 0x679D, 0x060C, 0x679F, 0x19C0, 0x67AE, 0x1B34, 0x67AF, 0x0757,
- 0x67B0, 0x0764, 0x67B2, 0x1B2F, 0x67B3, 0x1B25, 0x67B4, 0x075D,
- 0x67B5, 0x1B23, 0x67B6, 0x0756, 0x67B7, 0x1B1E, 0x67B8, 0x0760,
- 0x67B9, 0x1B2B, 0x67BA, 0x1B18, 0x67BB, 0x1B1A, 0x67C0, 0x1B1D,
- 0x67C1, 0x1B15, 0x67C2, 0x1B2A, 0x67C3, 0x1B3A, 0x67C4, 0x075B,
- 0x67C5, 0x1B1F, 0x67C6, 0x1B31, 0x67C8, 0x1B17, 0x67C9, 0x1B38,
- 0x67CA, 0x1B39, 0x67CB, 0x1B3C, 0x67CC, 0x1B33, 0x67CD, 0x1B24,
- 0x67CE, 0x1B2C, 0x67CF, 0x0761, 0x67D0, 0x0754, 0x67D1, 0x075C,
- 0x67D2, 0x0768, 0x67D3, 0x0751, 0x67D4, 0x0753, 0x67D8, 0x1B1C,
- 0x67D9, 0x0765, 0x67DA, 0x075E, 0x67DB, 0x1B36, 0x67DC, 0x1B19,
- 0x67DD, 0x0767, 0x67DE, 0x0762, 0x67DF, 0x1B22, 0x67E2, 0x0766,
- 0x67E3, 0x1B29, 0x67E4, 0x1B21, 0x67E5, 0x075F, 0x67E6, 0x1B35,
- 0x67E7, 0x1B2D, 0x67E9, 0x0759, 0x67EA, 0x1B3B, 0x67EB, 0x1B20,
- 0x67EC, 0x0755, 0x67ED, 0x1B32, 0x67EE, 0x1B28, 0x67EF, 0x075A,
- 0x67F0, 0x1B2E, 0x67F1, 0x0752, 0x67F2, 0x1B16, 0x67F3, 0x0763,
- 0x67F4, 0x08F5, 0x67F5, 0x0758, 0x67F6, 0x1B27, 0x67F7, 0x1B26,
- 0x67F8, 0x1B1B, 0x67FA, 0x1B37, 0x67FC, 0x1B30, 0x67FF, 0x0750,
- 0x6812, 0x1CDD, 0x6813, 0x08FC, 0x6814, 0x1CDE, 0x6816, 0x1CD2,
- 0x6817, 0x08F1, 0x6818, 0x08FD, 0x681A, 0x1CCB, 0x681C, 0x1CD4,
- 0x681D, 0x1CDC, 0x681F, 0x1CCA, 0x6820, 0x1CE5, 0x6821, 0x08E7,
- 0x6825, 0x1CE4, 0x6826, 0x1CDF, 0x6828, 0x1CE0, 0x6829, 0x08EF,
- 0x682A, 0x08FA, 0x682B, 0x1CD6, 0x682D, 0x1CD7, 0x682E, 0x1CE1,
- 0x682F, 0x1CD8, 0x6831, 0x1CD3, 0x6832, 0x1CCD, 0x6833, 0x1CCE,
- 0x6834, 0x1CDB, 0x6835, 0x1CD5, 0x6838, 0x08E8, 0x6839, 0x08EC,
- 0x683A, 0x1CE3, 0x683B, 0x1CCF, 0x683C, 0x08F8, 0x683D, 0x08F4,
- 0x6840, 0x08F7, 0x6841, 0x08FE, 0x6842, 0x08ED, 0x6843, 0x08F9,
- 0x6844, 0x1CDA, 0x6845, 0x08FB, 0x6846, 0x08EA, 0x6848, 0x08E9,
- 0x6849, 0x1CCC, 0x684B, 0x1CD0, 0x684C, 0x08F2, 0x684D, 0x1CE2,
- 0x684E, 0x1CD9, 0x684F, 0x1CD1, 0x6850, 0x08F6, 0x6851, 0x08F3,
- 0x6853, 0x08EB, 0x6854, 0x08EE, 0x686B, 0x1F29, 0x686D, 0x1F19,
- 0x686E, 0x1F1A, 0x686F, 0x1F1E, 0x6871, 0x1F2D, 0x6872, 0x1F2A,
- 0x6874, 0x1F23, 0x6875, 0x1F22, 0x6876, 0x0AD7, 0x6877, 0x1F26,
- 0x6878, 0x1F35, 0x6879, 0x1F15, 0x687B, 0x1F36, 0x687C, 0x1F28,
- 0x687D, 0x1F3A, 0x687E, 0x1F2E, 0x687F, 0x0AD6, 0x6880, 0x1F2C,
- 0x6881, 0x0AD1, 0x6882, 0x0AE6, 0x6883, 0x0ADC, 0x6885, 0x0AE0,
- 0x6886, 0x0ADF, 0x6887, 0x1F16, 0x6889, 0x1F33, 0x688A, 0x1F39,
- 0x688B, 0x1F31, 0x688C, 0x1F38, 0x688F, 0x1F25, 0x6890, 0x1F17,
- 0x6891, 0x1F37, 0x6892, 0x1F27, 0x6893, 0x0AD4, 0x6894, 0x0AE1,
- 0x6896, 0x1F30, 0x6897, 0x0ADA, 0x689B, 0x1F2F, 0x689C, 0x1F18,
- 0x689D, 0x0AE2, 0x689F, 0x0AE4, 0x68A0, 0x1F32, 0x68A1, 0x0AE5,
- 0x68A2, 0x0AD3, 0x68A3, 0x1F1F, 0x68A4, 0x1F34, 0x68A7, 0x0AD9,
- 0x68A8, 0x0AE3, 0x68A9, 0x1F21, 0x68AA, 0x1F2B, 0x68AB, 0x1F1C,
- 0x68AC, 0x1F20, 0x68AD, 0x0ADE, 0x68AE, 0x1F1B, 0x68AF, 0x0AD2,
- 0x68B0, 0x0ADB, 0x68B1, 0x0AD8, 0x68B2, 0x1F24, 0x68B3, 0x08F0,
- 0x68B4, 0x2198, 0x68B5, 0x0AD5, 0x68C4, 0x0ADD, 0x68C6, 0x219B,
- 0x68C7, 0x21B1, 0x68C8, 0x21A6, 0x68C9, 0x0C97, 0x68CB, 0x0C92,
- 0x68CC, 0x2195, 0x68CD, 0x0C93, 0x68CE, 0x21A5, 0x68D0, 0x219E,
- 0x68D1, 0x21AB, 0x68D2, 0x0C8F, 0x68D3, 0x2183, 0x68D4, 0x21AD,
- 0x68D5, 0x0C85, 0x68D6, 0x218B, 0x68D7, 0x0C88, 0x68D8, 0x0C87,
- 0x68DA, 0x0C98, 0x68DC, 0x2185, 0x68DD, 0x21A7, 0x68DE, 0x21A8,
- 0x68DF, 0x0C8A, 0x68E0, 0x0C86, 0x68E1, 0x2193, 0x68E3, 0x0C91,
- 0x68E4, 0x218E, 0x68E6, 0x21A9, 0x68E7, 0x0C8D, 0x68E8, 0x21A1,
- 0x68E9, 0x21AE, 0x68EA, 0x2188, 0x68EB, 0x218D, 0x68EC, 0x2187,
- 0x68EE, 0x0C8C, 0x68EF, 0x219A, 0x68F0, 0x242B, 0x68F1, 0x2189,
- 0x68F2, 0x0C90, 0x68F3, 0x2192, 0x68F4, 0x21AA, 0x68F5, 0x0C8B,
- 0x68F6, 0x218F, 0x68F7, 0x218C, 0x68F8, 0x219D, 0x68F9, 0x0C8E,
- 0x68FA, 0x0C84, 0x68FB, 0x0C9A, 0x68FC, 0x21A0, 0x68FD, 0x219F,
- 0x6904, 0x2184, 0x6905, 0x0C89, 0x6906, 0x21AC, 0x6907, 0x2194,
- 0x6908, 0x2196, 0x690A, 0x21A3, 0x690B, 0x21A2, 0x690C, 0x2182,
- 0x690D, 0x0C94, 0x690E, 0x0C96, 0x690F, 0x218A, 0x6910, 0x2191,
- 0x6911, 0x2199, 0x6912, 0x0C95, 0x6913, 0x2190, 0x6914, 0x219C,
- 0x6915, 0x21AF, 0x6917, 0x21A4, 0x6925, 0x21B0, 0x692A, 0x2186,
- 0x692F, 0x243F, 0x6930, 0x0E3E, 0x6932, 0x243D, 0x6933, 0x2428,
- 0x6934, 0x242D, 0x6935, 0x2426, 0x6937, 0x2439, 0x6938, 0x2418,
- 0x6939, 0x241F, 0x693B, 0x2437, 0x693C, 0x2441, 0x693D, 0x2429,
- 0x693F, 0x241C, 0x6940, 0x242F, 0x6941, 0x2434, 0x6942, 0x2420,
- 0x6944, 0x2431, 0x6945, 0x241D, 0x6948, 0x2424, 0x6949, 0x2425,
- 0x694A, 0x0E40, 0x694B, 0x2438, 0x694C, 0x2436, 0x694E, 0x2419,
- 0x694F, 0x243B, 0x6951, 0x243C, 0x6952, 0x243E, 0x6953, 0x0E44,
- 0x6954, 0x0E3C, 0x6956, 0x1F1D, 0x6957, 0x2421, 0x6958, 0x2433,
- 0x6959, 0x2422, 0x695A, 0x0E39, 0x695B, 0x0E49, 0x695C, 0x243A,
- 0x695D, 0x0E47, 0x695E, 0x0E43, 0x695F, 0x2417, 0x6960, 0x0E3B,
- 0x6962, 0x241A, 0x6963, 0x0E48, 0x6965, 0x242A, 0x6966, 0x2416,
- 0x6968, 0x0E41, 0x6969, 0x242E, 0x696A, 0x241E, 0x696B, 0x0E42,
- 0x696C, 0x2427, 0x696D, 0x0E38, 0x696E, 0x0C99, 0x696F, 0x2430,
- 0x6970, 0x2197, 0x6971, 0x241B, 0x6974, 0x2435, 0x6975, 0x0E3D,
- 0x6976, 0x2432, 0x6977, 0x0E3A, 0x6978, 0x242C, 0x6979, 0x0E45,
- 0x697A, 0x2423, 0x697B, 0x2440, 0x6982, 0x0E3F, 0x6983, 0x24AF,
- 0x6986, 0x0E46, 0x698D, 0x26C9, 0x698E, 0x26C7, 0x6990, 0x26DD,
- 0x6991, 0x26C5, 0x6993, 0x26D7, 0x6994, 0x0E37, 0x6995, 0x0FF0,
- 0x6996, 0x26C1, 0x6997, 0x26DC, 0x6999, 0x26C6, 0x699A, 0x26D4,
- 0x699B, 0x0FF5, 0x699C, 0x0FEE, 0x699E, 0x26DA, 0x69A0, 0x26BF,
- 0x69A1, 0x26D9, 0x69A3, 0x1000, 0x69A4, 0x26D0, 0x69A5, 0x26E0,
- 0x69A6, 0x0FFE, 0x69A7, 0x26C8, 0x69A8, 0x0FEF, 0x69A9, 0x26CA,
- 0x69AA, 0x26D8, 0x69AB, 0x0FF8, 0x69AC, 0x26C3, 0x69AD, 0x0FFC,
- 0x69AE, 0x0FF2, 0x69AF, 0x26CC, 0x69B0, 0x26C2, 0x69B1, 0x26BC,
- 0x69B3, 0x26D6, 0x69B4, 0x0FF9, 0x69B5, 0x26DF, 0x69B6, 0x26BD,
- 0x69B7, 0x0FF6, 0x69B9, 0x26D2, 0x69BB, 0x0FF7, 0x69BC, 0x26C4,
- 0x69BD, 0x26CF, 0x69BE, 0x26CB, 0x69BF, 0x26CD, 0x69C1, 0x0FF1,
- 0x69C2, 0x26DE, 0x69C3, 0x0FFF, 0x69C4, 0x26CE, 0x69C6, 0x26E1,
- 0x69C9, 0x26BE, 0x69CA, 0x26D3, 0x69CB, 0x0FF4, 0x69CC, 0x0FFD,
- 0x69CD, 0x0FFB, 0x69CE, 0x26C0, 0x69CF, 0x26D5, 0x69D0, 0x0FFA,
- 0x69D3, 0x0FF3, 0x69D4, 0x26D1, 0x69D9, 0x26DB, 0x69E2, 0x2909,
- 0x69E4, 0x2905, 0x69E5, 0x2901, 0x69E6, 0x2915, 0x69E7, 0x2912,
- 0x69E8, 0x1177, 0x69EB, 0x2919, 0x69EC, 0x2908, 0x69ED, 0x1182,
- 0x69EE, 0x290F, 0x69F1, 0x2904, 0x69F2, 0x290E, 0x69F3, 0x117F,
- 0x69F4, 0x2922, 0x69F6, 0x291F, 0x69F7, 0x2911, 0x69F8, 0x2902,
- 0x69FB, 0x2916, 0x69FC, 0x2918, 0x69FD, 0x117B, 0x69FE, 0x290C,
- 0x69FF, 0x2907, 0x6A00, 0x28FE, 0x6A01, 0x1178, 0x6A02, 0x1180,
- 0x6A04, 0x291B, 0x6A05, 0x1181, 0x6A06, 0x28FF, 0x6A07, 0x2921,
- 0x6A08, 0x2914, 0x6A09, 0x291A, 0x6A0A, 0x117E, 0x6A0D, 0x2917,
- 0x6A0F, 0x291E, 0x6A11, 0x1183, 0x6A13, 0x117D, 0x6A14, 0x2910,
- 0x6A15, 0x2903, 0x6A16, 0x2923, 0x6A17, 0x2900, 0x6A18, 0x291C,
- 0x6A19, 0x117A, 0x6A1B, 0x290A, 0x6A1D, 0x290B, 0x6A1E, 0x1179,
- 0x6A1F, 0x1176, 0x6A20, 0x2906, 0x6A21, 0x117C, 0x6A23, 0x1175,
- 0x6A25, 0x291D, 0x6A26, 0x2920, 0x6A27, 0x290D, 0x6A28, 0x2B74,
- 0x6A32, 0x2B6C, 0x6A34, 0x2B68, 0x6A35, 0x12D9, 0x6A38, 0x12CE,
- 0x6A39, 0x12D3, 0x6A3A, 0x12CF, 0x6A3B, 0x2B76, 0x6A3C, 0x2B81,
- 0x6A3D, 0x12CD, 0x6A3E, 0x2B6E, 0x6A3F, 0x2B77, 0x6A40, 0x2913,
- 0x6A41, 0x2B78, 0x6A44, 0x12D4, 0x6A46, 0x2B87, 0x6A47, 0x12D8,
- 0x6A48, 0x12DB, 0x6A49, 0x2B6A, 0x6A4B, 0x12D7, 0x6A4D, 0x2B85,
- 0x6A4E, 0x2B86, 0x6A4F, 0x2B7C, 0x6A50, 0x2B7B, 0x6A51, 0x2B73,
- 0x6A54, 0x2B7D, 0x6A55, 0x2B84, 0x6A56, 0x2B83, 0x6A58, 0x12D2,
- 0x6A59, 0x12D0, 0x6A5A, 0x2B75, 0x6A5B, 0x2B72, 0x6A5D, 0x2B6F,
- 0x6A5E, 0x2B82, 0x6A5F, 0x12DA, 0x6A60, 0x2B80, 0x6A61, 0x12D6,
- 0x6A62, 0x12D5, 0x6A64, 0x2B7A, 0x6A66, 0x2B69, 0x6A67, 0x2B6B,
- 0x6A68, 0x2B6D, 0x6A69, 0x2B7F, 0x6A6A, 0x2B79, 0x6A6B, 0x12D1,
- 0x6A6D, 0x2B70, 0x6A6F, 0x2B7E, 0x6A76, 0x2B71, 0x6A7E, 0x13EC,
- 0x6A7F, 0x2D84, 0x6A80, 0x13E5, 0x6A81, 0x2D75, 0x6A83, 0x2D80,
- 0x6A84, 0x13E7, 0x6A85, 0x2D87, 0x6A87, 0x2D7C, 0x6A89, 0x2D77,
- 0x6A8C, 0x2D88, 0x6A8D, 0x2D73, 0x6A8E, 0x2D7E, 0x6A90, 0x13EE,
- 0x6A91, 0x2D83, 0x6A92, 0x2D89, 0x6A93, 0x2D7D, 0x6A94, 0x13E6,
- 0x6A95, 0x2D7F, 0x6A96, 0x2D74, 0x6A97, 0x13ED, 0x6A9A, 0x2D86,
- 0x6A9B, 0x2D79, 0x6A9C, 0x13E9, 0x6A9E, 0x2D7B, 0x6A9F, 0x2D78,
- 0x6AA0, 0x13EF, 0x6AA1, 0x2D7A, 0x6AA2, 0x13E8, 0x6AA3, 0x13EB,
- 0x6AA4, 0x2D82, 0x6AA5, 0x2D76, 0x6AA6, 0x2D85, 0x6AA8, 0x2D81,
- 0x6AAC, 0x14DD, 0x6AAD, 0x2F3E, 0x6AAE, 0x14E2, 0x6AAF, 0x14E3,
- 0x6AB3, 0x14DC, 0x6AB4, 0x2F3D, 0x6AB6, 0x2F3A, 0x6AB7, 0x2F3B,
- 0x6AB8, 0x14E0, 0x6AB9, 0x2F35, 0x6ABA, 0x2F39, 0x6ABB, 0x14DF,
- 0x6ABD, 0x2F36, 0x6AC2, 0x14E1, 0x6AC3, 0x14DE, 0x6AC5, 0x2F34,
- 0x6AC6, 0x2F38, 0x6AC7, 0x2F3C, 0x6ACB, 0x309F, 0x6ACC, 0x309C,
- 0x6ACD, 0x30A5, 0x6ACF, 0x30A4, 0x6AD0, 0x30A2, 0x6AD1, 0x309D,
- 0x6AD3, 0x1589, 0x6AD9, 0x309E, 0x6ADA, 0x1588, 0x6ADB, 0x13EA,
- 0x6ADC, 0x30A1, 0x6ADD, 0x1587, 0x6ADE, 0x30A6, 0x6ADF, 0x30A0,
- 0x6AE0, 0x309B, 0x6AE1, 0x2F37, 0x6AE5, 0x1586, 0x6AE7, 0x309A,
- 0x6AE8, 0x31DF, 0x6AEA, 0x31DE, 0x6AEB, 0x30A3, 0x6AEC, 0x161B,
- 0x6AEE, 0x31E2, 0x6AEF, 0x31E3, 0x6AF0, 0x31DD, 0x6AF1, 0x31E1,
- 0x6AF3, 0x31DC, 0x6AF8, 0x32D6, 0x6AF9, 0x31E0, 0x6AFA, 0x1678,
- 0x6AFB, 0x1676, 0x6AFC, 0x32D4, 0x6B00, 0x32D7, 0x6B02, 0x32D3,
- 0x6B03, 0x32D5, 0x6B04, 0x1677, 0x6B08, 0x3386, 0x6B09, 0x3387,
- 0x6B0A, 0x16C6, 0x6B0B, 0x3385, 0x6B0F, 0x3420, 0x6B10, 0x16FD,
- 0x6B11, 0x341E, 0x6B12, 0x341F, 0x6B13, 0x3487, 0x6B16, 0x1743,
- 0x6B17, 0x34CE, 0x6B18, 0x34CC, 0x6B19, 0x34CD, 0x6B1A, 0x34CF,
- 0x6B1E, 0x3534, 0x6B20, 0x02DE, 0x6B21, 0x03E3, 0x6B23, 0x061A,
- 0x6B25, 0x19C9, 0x6B28, 0x1B3D, 0x6B2C, 0x1CE6, 0x6B2D, 0x1CE8,
- 0x6B2F, 0x1CE7, 0x6B31, 0x1CE9, 0x6B32, 0x0AE7, 0x6B33, 0x1F3C,
- 0x6B34, 0x1CEA, 0x6B36, 0x1F3B, 0x6B37, 0x1F3D, 0x6B38, 0x1F3E,
- 0x6B39, 0x21B2, 0x6B3A, 0x0C9C, 0x6B3B, 0x21B3, 0x6B3C, 0x21B5,
- 0x6B3D, 0x0C9D, 0x6B3E, 0x0C9B, 0x6B3F, 0x21B4, 0x6B41, 0x2447,
- 0x6B42, 0x2445, 0x6B43, 0x2444, 0x6B45, 0x2443, 0x6B46, 0x2442,
- 0x6B47, 0x0E4A, 0x6B48, 0x2446, 0x6B49, 0x1001, 0x6B4A, 0x26E2,
- 0x6B4B, 0x26E4, 0x6B4C, 0x1002, 0x6B4D, 0x26E3, 0x6B4E, 0x1185,
- 0x6B50, 0x1184, 0x6B51, 0x2924, 0x6B54, 0x2B89, 0x6B55, 0x2B88,
- 0x6B56, 0x2B8A, 0x6B59, 0x12DC, 0x6B5B, 0x2D8A, 0x6B5C, 0x13F0,
- 0x6B5E, 0x2F3F, 0x6B5F, 0x14E4, 0x6B60, 0x30A7, 0x6B61, 0x16C7,
- 0x6B62, 0x02DF, 0x6B63, 0x034D, 0x6B64, 0x03E4, 0x6B65, 0x04C9,
- 0x6B66, 0x061B, 0x6B67, 0x061C, 0x6B6A, 0x0769, 0x6B6D, 0x1CEB,
- 0x6B72, 0x0E4B, 0x6B76, 0x29A2, 0x6B77, 0x12DD, 0x6B78, 0x14E5,
- 0x6B79, 0x02E0, 0x6B7B, 0x03E5, 0x6B7E, 0x19CB, 0x6B7F, 0x061D,
- 0x6B80, 0x19CA, 0x6B82, 0x1B3E, 0x6B83, 0x076A, 0x6B84, 0x1B3F,
- 0x6B86, 0x076B, 0x6B88, 0x1CED, 0x6B89, 0x0900, 0x6B8A, 0x08FF,
- 0x6B8C, 0x1F43, 0x6B8D, 0x1F41, 0x6B8E, 0x1F42, 0x6B8F, 0x1F40,
- 0x6B91, 0x1F3F, 0x6B94, 0x21B6, 0x6B95, 0x21B9, 0x6B96, 0x0C9F,
- 0x6B97, 0x21B7, 0x6B98, 0x0C9E, 0x6B99, 0x21B8, 0x6B9B, 0x2448,
- 0x6B9E, 0x26E5, 0x6B9F, 0x26E6, 0x6BA0, 0x26E7, 0x6BA2, 0x2927,
- 0x6BA3, 0x2926, 0x6BA4, 0x1186, 0x6BA5, 0x2925, 0x6BA6, 0x2928,
- 0x6BA7, 0x2B8B, 0x6BAA, 0x2B8C, 0x6BAB, 0x2B8D, 0x6BAD, 0x2D8B,
- 0x6BAE, 0x13F1, 0x6BAF, 0x14E6, 0x6BB0, 0x30A8, 0x6BB2, 0x1679,
- 0x6BB3, 0x178A, 0x6BB5, 0x076C, 0x6BB6, 0x1B40, 0x6BB7, 0x0901,
- 0x6BBA, 0x0AE8, 0x6BBC, 0x0CA0, 0x6BBD, 0x21BA, 0x6BBF, 0x0E4D,
- 0x6BC0, 0x0E4C, 0x6BC3, 0x26E8, 0x6BC4, 0x26E9, 0x6BC5, 0x1187,
- 0x6BC6, 0x1188, 0x6BC7, 0x2B8F, 0x6BC8, 0x2B8E, 0x6BC9, 0x2F40,
- 0x6BCA, 0x3421, 0x6BCB, 0x02E1, 0x6BCC, 0x178B, 0x6BCD, 0x034E,
- 0x6BCF, 0x04CA, 0x6BD0, 0x18AD, 0x6BD2, 0x076D, 0x6BD3, 0x0E4E,
- 0x6BD4, 0x02E2, 0x6BD6, 0x1B41, 0x6BD7, 0x076E, 0x6BD8, 0x1B42,
- 0x6BDA, 0x13F2, 0x6BDB, 0x02E3, 0x6BDE, 0x19CC, 0x6BE0, 0x1B43,
- 0x6BE2, 0x1CF2, 0x6BE3, 0x1CF1, 0x6BE4, 0x1CEF, 0x6BE6, 0x1CEE,
- 0x6BE7, 0x1CF3, 0x6BE8, 0x1CF0, 0x6BEB, 0x0AE9, 0x6BEC, 0x0AEA,
- 0x6BEF, 0x0CA1, 0x6BF0, 0x21BB, 0x6BF2, 0x21BC, 0x6BF3, 0x21BD,
- 0x6BF7, 0x244C, 0x6BF8, 0x244D, 0x6BF9, 0x244B, 0x6BFB, 0x2449,
- 0x6BFC, 0x244A, 0x6BFD, 0x0E4F, 0x6BFE, 0x26EA, 0x6BFF, 0x292B,
- 0x6C00, 0x292A, 0x6C01, 0x2929, 0x6C02, 0x292C, 0x6C03, 0x2B91,
- 0x6C04, 0x2B90, 0x6C05, 0x12DE, 0x6C06, 0x2B92, 0x6C08, 0x13F3,
- 0x6C09, 0x2D8C, 0x6C0B, 0x2F41, 0x6C0C, 0x30A9, 0x6C0D, 0x3388,
- 0x6C0F, 0x02E4, 0x6C10, 0x0350, 0x6C11, 0x034F, 0x6C13, 0x061E,
- 0x6C14, 0x178C, 0x6C15, 0x17AA, 0x6C16, 0x03E6, 0x6C18, 0x1801,
- 0x6C19, 0x18AE, 0x6C1A, 0x18AF, 0x6C1B, 0x061F, 0x6C1D, 0x19CD,
- 0x6C1F, 0x076F, 0x6C20, 0x1B44, 0x6C21, 0x1B45, 0x6C23, 0x0902,
- 0x6C24, 0x0906, 0x6C25, 0x1CF4, 0x6C26, 0x0905, 0x6C27, 0x0903,
- 0x6C28, 0x0904, 0x6C2A, 0x1F44, 0x6C2B, 0x0AEB, 0x6C2C, 0x0CA4,
- 0x6C2E, 0x0CA2, 0x6C2F, 0x0CA3, 0x6C30, 0x21BE, 0x6C33, 0x1003,
- 0x6C34, 0x02E5, 0x6C36, 0x17AB, 0x6C38, 0x0351, 0x6C3B, 0x17AE,
- 0x6C3E, 0x0354, 0x6C3F, 0x17AD, 0x6C40, 0x0353, 0x6C41, 0x0352,
- 0x6C42, 0x04CB, 0x6C43, 0x17AC, 0x6C46, 0x1802, 0x6C4A, 0x1806,
- 0x6C4B, 0x1808, 0x6C4C, 0x1809, 0x6C4D, 0x03F0, 0x6C4E, 0x03F1,
- 0x6C4F, 0x1805, 0x6C50, 0x03EC, 0x6C52, 0x1803, 0x6C54, 0x1807,
- 0x6C55, 0x03ED, 0x6C57, 0x03E8, 0x6C59, 0x03E9, 0x6C5B, 0x03EF,
- 0x6C5C, 0x1804, 0x6C5D, 0x03E7, 0x6C5E, 0x04CC, 0x6C5F, 0x03EA,
- 0x6C60, 0x03EB, 0x6C61, 0x03EE, 0x6C65, 0x18C0, 0x6C66, 0x18BE,
- 0x6C67, 0x18B1, 0x6C68, 0x04D8, 0x6C69, 0x18B8, 0x6C6A, 0x04D3,
- 0x6C6B, 0x18B2, 0x6C6D, 0x18BA, 0x6C6F, 0x18B7, 0x6C70, 0x04D6,
- 0x6C71, 0x18B6, 0x6C72, 0x04DD, 0x6C73, 0x18BF, 0x6C74, 0x04DF,
- 0x6C76, 0x04E1, 0x6C78, 0x18B0, 0x6C7A, 0x04D4, 0x6C7B, 0x18C1,
- 0x6C7D, 0x04DB, 0x6C7E, 0x04DE, 0x6C80, 0x19E4, 0x6C81, 0x04CE,
- 0x6C82, 0x04E5, 0x6C83, 0x04DC, 0x6C84, 0x18B3, 0x6C85, 0x04D1,
- 0x6C86, 0x04E0, 0x6C87, 0x18BB, 0x6C88, 0x04CF, 0x6C89, 0x04D0,
- 0x6C8A, 0x19E2, 0x6C8B, 0x18B4, 0x6C8C, 0x04D7, 0x6C8D, 0x04E2,
- 0x6C8E, 0x18C2, 0x6C8F, 0x18B5, 0x6C90, 0x04D5, 0x6C92, 0x04DA,
- 0x6C93, 0x19CE, 0x6C94, 0x04E3, 0x6C95, 0x18BC, 0x6C96, 0x04D9,
- 0x6C98, 0x04E4, 0x6C99, 0x04CD, 0x6C9A, 0x18B9, 0x6C9B, 0x04D2,
- 0x6C9C, 0x18BD, 0x6C9D, 0x19E3, 0x6CAB, 0x062B, 0x6CAC, 0x063B,
- 0x6CAD, 0x19D5, 0x6CAE, 0x0632, 0x6CB0, 0x19EA, 0x6CB1, 0x0623,
- 0x6CB3, 0x0626, 0x6CB4, 0x19E1, 0x6CB6, 0x19D3, 0x6CB7, 0x19D7,
- 0x6CB8, 0x062E, 0x6CB9, 0x0630, 0x6CBA, 0x19DA, 0x6CBB, 0x0637,
- 0x6CBC, 0x0629, 0x6CBD, 0x0627, 0x6CBE, 0x0628, 0x6CBF, 0x0636,
- 0x6CC0, 0x19E6, 0x6CC1, 0x0631, 0x6CC2, 0x19D9, 0x6CC3, 0x19DB,
- 0x6CC4, 0x062F, 0x6CC5, 0x0634, 0x6CC6, 0x19DC, 0x6CC7, 0x19E9,
- 0x6CC9, 0x0770, 0x6CCA, 0x063A, 0x6CCC, 0x0624, 0x6CCD, 0x19E8,
- 0x6CCF, 0x19EC, 0x6CD0, 0x19D8, 0x6CD1, 0x19EE, 0x6CD2, 0x19DF,
- 0x6CD3, 0x062D, 0x6CD4, 0x19D4, 0x6CD5, 0x062C, 0x6CD6, 0x063E,
- 0x6CD7, 0x0633, 0x6CD9, 0x19D2, 0x6CDA, 0x1B4E, 0x6CDB, 0x0639,
- 0x6CDC, 0x063D, 0x6CDD, 0x19E0, 0x6CDE, 0x19E5, 0x6CE0, 0x063F,
- 0x6CE1, 0x0638, 0x6CE2, 0x062A, 0x6CE3, 0x0620, 0x6CE5, 0x0625,
- 0x6CE7, 0x19D6, 0x6CE8, 0x0621, 0x6CE9, 0x19ED, 0x6CEB, 0x19D0,
- 0x6CEC, 0x19CF, 0x6CED, 0x19DD, 0x6CEE, 0x19D1, 0x6CEF, 0x063C,
- 0x6CF0, 0x0907, 0x6CF1, 0x0635, 0x6CF2, 0x19DE, 0x6CF3, 0x0622,
- 0x6CF5, 0x077F, 0x6CF9, 0x19EB, 0x6D00, 0x1B55, 0x6D01, 0x1B58,
- 0x6D03, 0x1B5B, 0x6D04, 0x1B50, 0x6D07, 0x1B5E, 0x6D08, 0x1B61,
- 0x6D09, 0x1B63, 0x6D0A, 0x1B4D, 0x6D0B, 0x0771, 0x6D0C, 0x0776,
- 0x6D0D, 0x1CF9, 0x6D0E, 0x0786, 0x6D0F, 0x1B5C, 0x6D10, 0x1B64,
- 0x6D11, 0x1B54, 0x6D12, 0x1B4C, 0x6D16, 0x1D14, 0x6D17, 0x0779,
- 0x6D18, 0x1B59, 0x6D19, 0x1B51, 0x6D1A, 0x1B53, 0x6D1B, 0x077E,
- 0x6D1D, 0x1B56, 0x6D1E, 0x0778, 0x6D1F, 0x1B49, 0x6D20, 0x1B5F,
- 0x6D22, 0x1B62, 0x6D25, 0x0775, 0x6D27, 0x0781, 0x6D28, 0x1B46,
- 0x6D29, 0x0783, 0x6D2A, 0x0773, 0x6D2B, 0x0787, 0x6D2C, 0x1B60,
- 0x6D2D, 0x1B48, 0x6D2E, 0x0784, 0x6D2F, 0x1D0E, 0x6D30, 0x19E7,
- 0x6D31, 0x0777, 0x6D32, 0x0772, 0x6D33, 0x1B4F, 0x6D34, 0x1B47,
- 0x6D35, 0x0785, 0x6D36, 0x077D, 0x6D37, 0x1B5A, 0x6D38, 0x0782,
- 0x6D39, 0x0780, 0x6D3A, 0x1B52, 0x6D3B, 0x077A, 0x6D3C, 0x1B4A,
- 0x6D3D, 0x077B, 0x6D3E, 0x077C, 0x6D3F, 0x1B4B, 0x6D40, 0x1B5D,
- 0x6D41, 0x0774, 0x6D42, 0x1B57, 0x6D58, 0x1CFC, 0x6D59, 0x090F,
- 0x6D5A, 0x0914, 0x6D5E, 0x1D05, 0x6D5F, 0x1D0B, 0x6D60, 0x1D07,
- 0x6D61, 0x1CFA, 0x6D62, 0x1CFD, 0x6D63, 0x1CF6, 0x6D64, 0x1CF7,
- 0x6D65, 0x091B, 0x6D66, 0x090C, 0x6D67, 0x1D06, 0x6D68, 0x1D0F,
- 0x6D69, 0x0916, 0x6D6A, 0x0908, 0x6D6C, 0x0911, 0x6D6D, 0x1CFE,
- 0x6D6E, 0x0913, 0x6D6F, 0x1CFF, 0x6D70, 0x1D09, 0x6D74, 0x0915,
- 0x6D75, 0x1D18, 0x6D76, 0x1CF8, 0x6D77, 0x090E, 0x6D78, 0x090D,
- 0x6D79, 0x0919, 0x6D7A, 0x1CF5, 0x6D7B, 0x1D16, 0x6D7C, 0x1D0A,
- 0x6D7D, 0x1D17, 0x6D7E, 0x1D11, 0x6D7F, 0x1D03, 0x6D80, 0x1D12,
- 0x6D82, 0x1D0C, 0x6D83, 0x1D15, 0x6D84, 0x1D13, 0x6D85, 0x091A,
- 0x6D86, 0x1D04, 0x6D87, 0x090B, 0x6D88, 0x090A, 0x6D89, 0x0912,
- 0x6D8A, 0x0918, 0x6D8B, 0x1D10, 0x6D8C, 0x0917, 0x6D8D, 0x1D01,
- 0x6D8E, 0x0AEC, 0x6D90, 0x1D19, 0x6D91, 0x1D00, 0x6D92, 0x1CFB,
- 0x6D93, 0x0910, 0x6D94, 0x091C, 0x6D95, 0x0909, 0x6D97, 0x1D08,
- 0x6D98, 0x1D0D, 0x6DAA, 0x0B0E, 0x6DAB, 0x1F46, 0x6DAC, 0x1F4A,
- 0x6DAE, 0x0AFB, 0x6DAF, 0x0AF9, 0x6DB2, 0x0AF0, 0x6DB3, 0x1F48,
- 0x6DB4, 0x1F47, 0x6DB5, 0x0B04, 0x6DB7, 0x1F4D, 0x6DB8, 0x0AFE,
- 0x6DBA, 0x1F5F, 0x6DBB, 0x1F6B, 0x6DBC, 0x0AED, 0x6DBD, 0x1F5C,
- 0x6DBE, 0x1F55, 0x6DBF, 0x0B10, 0x6DC0, 0x1F45, 0x6DC2, 0x1F61,
- 0x6DC4, 0x0B0D, 0x6DC5, 0x0B01, 0x6DC6, 0x0B0C, 0x6DC7, 0x0AF7,
- 0x6DC8, 0x1F51, 0x6DC9, 0x1F63, 0x6DCA, 0x1F5B, 0x6DCB, 0x0AF8,
- 0x6DCC, 0x0AF2, 0x6DCD, 0x1F69, 0x6DCF, 0x1F62, 0x6DD0, 0x1F64,
- 0x6DD1, 0x0AFA, 0x6DD2, 0x0B02, 0x6DD3, 0x1F66, 0x6DD4, 0x1F4F,
- 0x6DD5, 0x1F60, 0x6DD6, 0x1F54, 0x6DD7, 0x1F68, 0x6DD8, 0x0B07,
- 0x6DD9, 0x0AEF, 0x6DDA, 0x0B05, 0x6DDB, 0x1F59, 0x6DDC, 0x1F57,
- 0x6DDD, 0x1F58, 0x6DDE, 0x0AFC, 0x6DDF, 0x1F53, 0x6DE0, 0x1F52,
- 0x6DE1, 0x0AF1, 0x6DE2, 0x1F4C, 0x6DE3, 0x1F6A, 0x6DE4, 0x0AF3,
- 0x6DE5, 0x1F56, 0x6DE6, 0x0B11, 0x6DE8, 0x0B0B, 0x6DE9, 0x1F4B,
- 0x6DEA, 0x0B08, 0x6DEB, 0x0B06, 0x6DEC, 0x0B0F, 0x6DED, 0x1F5D,
- 0x6DEE, 0x0B0A, 0x6DEF, 0x1D02, 0x6DF0, 0x1F5E, 0x6DF1, 0x0B09,
- 0x6DF2, 0x1F65, 0x6DF3, 0x0AEE, 0x6DF4, 0x1F5A, 0x6DF5, 0x0B00,
- 0x6DF6, 0x1F4E, 0x6DF7, 0x0AFF, 0x6DF9, 0x0AFD, 0x6DFA, 0x0AF5,
- 0x6DFB, 0x0AF4, 0x6DFC, 0x21BF, 0x6DFD, 0x1F67, 0x6E00, 0x1F50,
- 0x6E03, 0x21D4, 0x6E05, 0x0AF6, 0x6E19, 0x0CC1, 0x6E1A, 0x0B03,
- 0x6E1B, 0x0CAF, 0x6E1C, 0x21CE, 0x6E1D, 0x0CBD, 0x6E1F, 0x21C2,
- 0x6E20, 0x0CAC, 0x6E21, 0x0CA8, 0x6E22, 0x21E0, 0x6E23, 0x0CAE,
- 0x6E24, 0x0CB2, 0x6E25, 0x0CAD, 0x6E26, 0x0CB6, 0x6E27, 0x21E4,
- 0x6E28, 0x21DB, 0x6E2B, 0x21C9, 0x6E2C, 0x0CBB, 0x6E2D, 0x0CB5,
- 0x6E2E, 0x21D5, 0x6E2F, 0x0CA5, 0x6E30, 0x21E1, 0x6E31, 0x21DA,
- 0x6E32, 0x0CA9, 0x6E33, 0x21CF, 0x6E34, 0x0CB8, 0x6E35, 0x21EC,
- 0x6E36, 0x21ED, 0x6E38, 0x0CA6, 0x6E39, 0x21DF, 0x6E3A, 0x0CBA,
- 0x6E3B, 0x21D3, 0x6E3C, 0x21C5, 0x6E3D, 0x21C6, 0x6E3E, 0x0CBE,
- 0x6E3F, 0x21CA, 0x6E40, 0x21D1, 0x6E41, 0x21CB, 0x6E43, 0x0CBC,
- 0x6E44, 0x0CC4, 0x6E45, 0x21C7, 0x6E46, 0x21C0, 0x6E47, 0x21C1,
- 0x6E49, 0x21C3, 0x6E4A, 0x0CAB, 0x6E4B, 0x21D0, 0x6E4D, 0x0CB9,
- 0x6E4E, 0x0CC2, 0x6E51, 0x21D2, 0x6E52, 0x21EA, 0x6E53, 0x21E2,
- 0x6E54, 0x0CA7, 0x6E55, 0x21E8, 0x6E56, 0x0CB3, 0x6E58, 0x0CB1,
- 0x6E5A, 0x21EE, 0x6E5B, 0x0CB0, 0x6E5C, 0x21D8, 0x6E5D, 0x21CC,
- 0x6E5E, 0x21D6, 0x6E5F, 0x0CC7, 0x6E60, 0x21DC, 0x6E61, 0x21D9,
- 0x6E62, 0x21C8, 0x6E63, 0x0CC3, 0x6E64, 0x21E6, 0x6E65, 0x21E3,
- 0x6E66, 0x21EB, 0x6E67, 0x0CAA, 0x6E68, 0x21D7, 0x6E69, 0x0CC6,
- 0x6E6B, 0x21DE, 0x6E6E, 0x0CB4, 0x6E6F, 0x0CB7, 0x6E71, 0x21DD,
- 0x6E72, 0x0CC5, 0x6E73, 0x21CD, 0x6E74, 0x1F49, 0x6E77, 0x21E7,
- 0x6E78, 0x21E5, 0x6E79, 0x21E9, 0x6E88, 0x21C4, 0x6E89, 0x0CC0,
- 0x6E8D, 0x246C, 0x6E8E, 0x246B, 0x6E8F, 0x2451, 0x6E90, 0x0E55,
- 0x6E92, 0x246A, 0x6E93, 0x2454, 0x6E94, 0x2455, 0x6E96, 0x0E5F,
- 0x6E97, 0x2473, 0x6E98, 0x0E5A, 0x6E99, 0x2469, 0x6E9B, 0x244E,
- 0x6E9C, 0x0E60, 0x6E9D, 0x0E56, 0x6E9E, 0x245D, 0x6E9F, 0x2453,
- 0x6EA0, 0x2456, 0x6EA1, 0x246E, 0x6EA2, 0x0E50, 0x6EA3, 0x2475,
- 0x6EA4, 0x246D, 0x6EA5, 0x0E59, 0x6EA6, 0x2462, 0x6EA7, 0x0E64,
- 0x6EAA, 0x0E63, 0x6EAB, 0x0E5D, 0x6EAE, 0x2474, 0x6EAF, 0x0E51,
- 0x6EB0, 0x2460, 0x6EB1, 0x2457, 0x6EB2, 0x2464, 0x6EB3, 0x2470,
- 0x6EB4, 0x0E65, 0x6EB6, 0x0E53, 0x6EB7, 0x245F, 0x6EB9, 0x2458,
- 0x6EBA, 0x0E5C, 0x6EBC, 0x0E5B, 0x6EBD, 0x245B, 0x6EBE, 0x2465,
- 0x6EBF, 0x246F, 0x6EC0, 0x2452, 0x6EC1, 0x245C, 0x6EC2, 0x0E54,
- 0x6EC3, 0x2466, 0x6EC4, 0x0E61, 0x6EC5, 0x0E58, 0x6EC6, 0x2459,
- 0x6EC7, 0x0E57, 0x6EC8, 0x2450, 0x6EC9, 0x245E, 0x6ECA, 0x2472,
- 0x6ECB, 0x0CBF, 0x6ECC, 0x101F, 0x6ECD, 0x2461, 0x6ECE, 0x26EB,
- 0x6ECF, 0x2463, 0x6ED0, 0x2471, 0x6ED1, 0x0E5E, 0x6ED2, 0x245A,
- 0x6ED3, 0x0E52, 0x6ED4, 0x0E62, 0x6ED5, 0x119A, 0x6ED6, 0x244F,
- 0x6ED8, 0x2468, 0x6EDC, 0x2467, 0x6EEB, 0x2707, 0x6EEC, 0x101C,
- 0x6EED, 0x26FC, 0x6EEE, 0x2701, 0x6EEF, 0x1011, 0x6EF1, 0x26ED,
- 0x6EF2, 0x101E, 0x6EF4, 0x1008, 0x6EF5, 0x26EC, 0x6EF6, 0x270D,
- 0x6EF7, 0x1020, 0x6EF8, 0x26F0, 0x6EF9, 0x2700, 0x6EFB, 0x26F2,
- 0x6EFC, 0x2710, 0x6EFD, 0x270C, 0x6EFE, 0x1006, 0x6EFF, 0x1010,
- 0x6F00, 0x2946, 0x6F01, 0x101D, 0x6F02, 0x100E, 0x6F03, 0x26EE,
- 0x6F05, 0x270B, 0x6F06, 0x1012, 0x6F07, 0x2708, 0x6F08, 0x2715,
- 0x6F09, 0x26F4, 0x6F0A, 0x26FD, 0x6F0D, 0x2713, 0x6F0E, 0x2709,
- 0x6F0F, 0x100D, 0x6F12, 0x26FB, 0x6F13, 0x1007, 0x6F14, 0x1005,
- 0x6F15, 0x1017, 0x6F18, 0x26F9, 0x6F19, 0x26F6, 0x6F1A, 0x26F7,
- 0x6F1C, 0x270F, 0x6F1E, 0x2714, 0x6F1F, 0x2712, 0x6F20, 0x100B,
- 0x6F21, 0x2716, 0x6F22, 0x100F, 0x6F23, 0x1016, 0x6F25, 0x26EF,
- 0x6F26, 0x292E, 0x6F27, 0x26F8, 0x6F29, 0x1009, 0x6F2A, 0x101B,
- 0x6F2B, 0x1018, 0x6F2C, 0x100C, 0x6F2D, 0x2702, 0x6F2E, 0x26F3,
- 0x6F2F, 0x1019, 0x6F30, 0x2704, 0x6F31, 0x1013, 0x6F32, 0x1015,
- 0x6F33, 0x1004, 0x6F35, 0x2706, 0x6F36, 0x26FE, 0x6F37, 0x26F1,
- 0x6F38, 0x1014, 0x6F39, 0x270E, 0x6F3A, 0x2711, 0x6F3B, 0x26FA,
- 0x6F3C, 0x2705, 0x6F3E, 0x100A, 0x6F3F, 0x1189, 0x6F40, 0x2703,
- 0x6F41, 0x292D, 0x6F43, 0x270A, 0x6F4E, 0x26F5, 0x6F4F, 0x2937,
- 0x6F50, 0x2941, 0x6F51, 0x118C, 0x6F52, 0x2940, 0x6F53, 0x294C,
- 0x6F54, 0x118E, 0x6F55, 0x293E, 0x6F57, 0x2942, 0x6F58, 0x1199,
- 0x6F5A, 0x2939, 0x6F5B, 0x1191, 0x6F5D, 0x2945, 0x6F5E, 0x2B9A,
- 0x6F5F, 0x119D, 0x6F60, 0x119C, 0x6F61, 0x2947, 0x6F62, 0x2936,
- 0x6F63, 0x2951, 0x6F64, 0x1197, 0x6F66, 0x118D, 0x6F67, 0x294A,
- 0x6F69, 0x294E, 0x6F6A, 0x2953, 0x6F6B, 0x2948, 0x6F6C, 0x293C,
- 0x6F6D, 0x1190, 0x6F6E, 0x1193, 0x6F6F, 0x119B, 0x6F70, 0x1196,
- 0x6F72, 0x293F, 0x6F73, 0x26FF, 0x6F76, 0x293B, 0x6F77, 0x2952,
- 0x6F78, 0x1192, 0x6F7A, 0x1195, 0x6F7B, 0x2954, 0x6F7C, 0x118A,
- 0x6F7D, 0x2949, 0x6F7E, 0x292F, 0x6F7F, 0x294F, 0x6F80, 0x13FC,
- 0x6F82, 0x293D, 0x6F84, 0x118B, 0x6F85, 0x2938, 0x6F86, 0x118F,
- 0x6F87, 0x2930, 0x6F88, 0x101A, 0x6F89, 0x2934, 0x6F8B, 0x294D,
- 0x6F8C, 0x2935, 0x6F8D, 0x2933, 0x6F8E, 0x1194, 0x6F90, 0x294B,
- 0x6F92, 0x2932, 0x6F93, 0x2944, 0x6F94, 0x2943, 0x6F95, 0x2950,
- 0x6F96, 0x293A, 0x6F97, 0x1198, 0x6F9E, 0x2B9D, 0x6FA0, 0x12EB,
- 0x6FA1, 0x12E1, 0x6FA2, 0x2BA9, 0x6FA3, 0x2B95, 0x6FA4, 0x12E3,
- 0x6FA5, 0x2BA1, 0x6FA6, 0x12EA, 0x6FA7, 0x12E5, 0x6FA8, 0x2B9F,
- 0x6FA9, 0x2D8E, 0x6FAA, 0x2BA5, 0x6FAB, 0x2BAB, 0x6FAC, 0x2BA4,
- 0x6FAD, 0x2B93, 0x6FAE, 0x2BA2, 0x6FAF, 0x2BAD, 0x6FB0, 0x2BAF,
- 0x6FB1, 0x12E0, 0x6FB2, 0x2BAE, 0x6FB3, 0x12E6, 0x6FB4, 0x12EC,
- 0x6FB6, 0x12E9, 0x6FB8, 0x2BA8, 0x6FB9, 0x12E8, 0x6FBA, 0x2BA3,
- 0x6FBC, 0x2B97, 0x6FBD, 0x2B9C, 0x6FBF, 0x2BA7, 0x6FC0, 0x12E7,
- 0x6FC1, 0x12E4, 0x6FC2, 0x12DF, 0x6FC3, 0x12E2, 0x6FC4, 0x2B9B,
- 0x6FC6, 0x2931, 0x6FC7, 0x2B96, 0x6FC8, 0x2B99, 0x6FC9, 0x2BAA,
- 0x6FCA, 0x2B9E, 0x6FCB, 0x2B94, 0x6FCC, 0x2D8D, 0x6FCD, 0x2BAC,
- 0x6FCE, 0x2B98, 0x6FCF, 0x2BA6, 0x6FD4, 0x2D90, 0x6FD5, 0x1400,
- 0x6FD8, 0x13F4, 0x6FDB, 0x13F8, 0x6FDC, 0x2D92, 0x6FDD, 0x2D98,
- 0x6FDE, 0x2D96, 0x6FDF, 0x13F6, 0x6FE0, 0x13F7, 0x6FE1, 0x13FE,
- 0x6FE2, 0x2D99, 0x6FE3, 0x2D91, 0x6FE4, 0x13F9, 0x6FE6, 0x2D95,
- 0x6FE7, 0x2D94, 0x6FE8, 0x2D9A, 0x6FE9, 0x13FF, 0x6FEB, 0x13FA,
- 0x6FEC, 0x13FD, 0x6FED, 0x2D93, 0x6FEE, 0x1401, 0x6FEF, 0x13FB,
- 0x6FF0, 0x1402, 0x6FF1, 0x13F5, 0x6FF2, 0x2D97, 0x6FF4, 0x2D8F,
- 0x6FF7, 0x2F4E, 0x6FFA, 0x14EB, 0x6FFB, 0x2F4B, 0x6FFC, 0x2F4D,
- 0x6FFE, 0x14E9, 0x6FFF, 0x2F49, 0x7000, 0x2F4A, 0x7001, 0x2F45,
- 0x7004, 0x2BA0, 0x7005, 0x2F46, 0x7006, 0x14EA, 0x7007, 0x2F42,
- 0x7009, 0x14E7, 0x700A, 0x2F4F, 0x700B, 0x14E8, 0x700C, 0x2F43,
- 0x700D, 0x2F44, 0x700E, 0x2F48, 0x700F, 0x14ED, 0x7011, 0x14EC,
- 0x7014, 0x2F47, 0x7015, 0x158F, 0x7016, 0x30AD, 0x7017, 0x30B3,
- 0x7018, 0x1590, 0x7019, 0x30AA, 0x701A, 0x158D, 0x701B, 0x158A,
- 0x701C, 0x30B5, 0x701D, 0x158E, 0x701F, 0x158B, 0x7020, 0x30AC,
- 0x7021, 0x30AF, 0x7022, 0x30B0, 0x7023, 0x30B1, 0x7024, 0x30B4,
- 0x7026, 0x2F4C, 0x7027, 0x30AB, 0x7028, 0x158C, 0x7029, 0x30B2,
- 0x702A, 0x31EF, 0x702B, 0x30AE, 0x702F, 0x31E6, 0x7030, 0x161D,
- 0x7031, 0x31E9, 0x7032, 0x161E, 0x7033, 0x31F2, 0x7034, 0x31E8,
- 0x7035, 0x31E5, 0x7037, 0x31E7, 0x7038, 0x31EB, 0x7039, 0x31EE,
- 0x703A, 0x31ED, 0x703B, 0x31F1, 0x703C, 0x31E4, 0x703E, 0x161C,
- 0x703F, 0x31EC, 0x7040, 0x31F0, 0x7041, 0x31F3, 0x7042, 0x31EA,
- 0x7043, 0x32D8, 0x7044, 0x32D9, 0x7045, 0x32DD, 0x7046, 0x32DE,
- 0x7048, 0x32DB, 0x7049, 0x32DC, 0x704A, 0x32DA, 0x704C, 0x167A,
- 0x7051, 0x16C8, 0x7052, 0x338C, 0x7055, 0x3389, 0x7056, 0x338A,
- 0x7057, 0x338B, 0x7058, 0x16C9, 0x705A, 0x3423, 0x705B, 0x3422,
- 0x705D, 0x348A, 0x705E, 0x1722, 0x705F, 0x3488, 0x7060, 0x348B,
- 0x7061, 0x3489, 0x7062, 0x34D0, 0x7063, 0x1744, 0x7064, 0x1752,
- 0x7065, 0x351C, 0x7066, 0x3506, 0x7068, 0x351B, 0x7069, 0x3547,
- 0x706A, 0x3548, 0x706B, 0x02E6, 0x7070, 0x03F2, 0x7071, 0x180A,
- 0x7074, 0x18C3, 0x7076, 0x04E6, 0x7078, 0x04E9, 0x707A, 0x18C4,
- 0x707C, 0x04E7, 0x707D, 0x04E8, 0x7082, 0x19F7, 0x7083, 0x19F9,
- 0x7084, 0x19F4, 0x7085, 0x19F1, 0x7086, 0x19F3, 0x708A, 0x0643,
- 0x708E, 0x0641, 0x7091, 0x19F5, 0x7092, 0x0642, 0x7093, 0x19F2,
- 0x7094, 0x19EF, 0x7095, 0x0640, 0x7096, 0x19F6, 0x7098, 0x19F0,
- 0x7099, 0x0644, 0x709A, 0x19F8, 0x709F, 0x1B66, 0x70A1, 0x1B6A,
- 0x70A4, 0x0790, 0x70A9, 0x1B6D, 0x70AB, 0x0788, 0x70AC, 0x078B,
- 0x70AD, 0x078D, 0x70AE, 0x078F, 0x70AF, 0x078C, 0x70B0, 0x1B69,
- 0x70B1, 0x1B68, 0x70B3, 0x078A, 0x70B4, 0x1B6B, 0x70B5, 0x1B6C,
- 0x70B7, 0x1B65, 0x70B8, 0x078E, 0x70BA, 0x0789, 0x70BE, 0x1B67,
- 0x70C5, 0x1D27, 0x70C6, 0x1D28, 0x70C7, 0x1D29, 0x70C8, 0x0921,
- 0x70CA, 0x091D, 0x70CB, 0x1D1E, 0x70CD, 0x1D26, 0x70CE, 0x1D2B,
- 0x70CF, 0x0922, 0x70D1, 0x1D1C, 0x70D2, 0x1D22, 0x70D3, 0x1D1B,
- 0x70D4, 0x1D25, 0x70D7, 0x1D21, 0x70D8, 0x091E, 0x70D9, 0x0920,
- 0x70DA, 0x1D2A, 0x70DC, 0x1D1A, 0x70DD, 0x1D1D, 0x70DE, 0x1D23,
- 0x70E0, 0x1D24, 0x70E1, 0x1D2C, 0x70E2, 0x1D20, 0x70E4, 0x091F,
- 0x70EF, 0x0B16, 0x70F0, 0x1F72, 0x70F3, 0x1F74, 0x70F4, 0x1F70,
- 0x70F6, 0x1F7C, 0x70F7, 0x1F6E, 0x70F8, 0x1F7B, 0x70F9, 0x0B12,
- 0x70FA, 0x1F6C, 0x70FB, 0x21F2, 0x70FC, 0x1F76, 0x70FD, 0x0B15,
- 0x70FF, 0x1F77, 0x7100, 0x1F7A, 0x7102, 0x1F7E, 0x7104, 0x1F73,
- 0x7106, 0x1F78, 0x7109, 0x0B13, 0x710A, 0x0B14, 0x710B, 0x1F7D,
- 0x710C, 0x1F71, 0x710D, 0x1F6D, 0x710E, 0x1F7F, 0x7110, 0x1F75,
- 0x7113, 0x1F79, 0x7117, 0x1F6F, 0x7119, 0x0CC8, 0x711A, 0x0CC9,
- 0x711B, 0x21FC, 0x711C, 0x0CCF, 0x711E, 0x21F0, 0x711F, 0x21F9,
- 0x7120, 0x21EF, 0x7121, 0x0CCC, 0x7122, 0x21F7, 0x7123, 0x21F5,
- 0x7125, 0x21F6, 0x7126, 0x0CCA, 0x7128, 0x21FA, 0x712E, 0x21F3,
- 0x712F, 0x21F1, 0x7130, 0x0CCB, 0x7131, 0x21F4, 0x7132, 0x21F8,
- 0x7136, 0x0CCD, 0x713A, 0x21FB, 0x7141, 0x247B, 0x7142, 0x2482,
- 0x7143, 0x2484, 0x7144, 0x248A, 0x7146, 0x0E72, 0x7147, 0x2476,
- 0x7149, 0x0E6A, 0x714B, 0x2485, 0x714C, 0x0E6F, 0x714D, 0x248B,
- 0x714E, 0x0E66, 0x7150, 0x2488, 0x7152, 0x2478, 0x7153, 0x2489,
- 0x7154, 0x2477, 0x7156, 0x0E74, 0x7158, 0x2483, 0x7159, 0x0E67,
- 0x715A, 0x248C, 0x715C, 0x0E6C, 0x715D, 0x247C, 0x715E, 0x0E71,
- 0x715F, 0x2487, 0x7160, 0x247A, 0x7161, 0x2481, 0x7162, 0x247D,
- 0x7163, 0x2479, 0x7164, 0x0E69, 0x7165, 0x0E70, 0x7166, 0x0E6E,
- 0x7167, 0x0E6B, 0x7168, 0x0E73, 0x7169, 0x0E68, 0x716A, 0x2480,
- 0x716C, 0x0E6D, 0x716E, 0x0CCE, 0x7170, 0x2486, 0x7172, 0x247E,
- 0x7178, 0x247F, 0x717B, 0x271E, 0x717D, 0x1023, 0x7180, 0x271A,
- 0x7181, 0x2720, 0x7182, 0x271C, 0x7184, 0x1025, 0x7185, 0x271B,
- 0x7186, 0x271F, 0x7187, 0x2717, 0x7189, 0x2719, 0x718A, 0x1024,
- 0x718F, 0x271D, 0x7190, 0x2718, 0x7192, 0x1026, 0x7194, 0x1021,
- 0x7197, 0x2721, 0x7199, 0x1022, 0x719A, 0x295A, 0x719B, 0x2957,
- 0x719C, 0x2963, 0x719D, 0x295D, 0x719E, 0x295F, 0x719F, 0x119E,
- 0x71A0, 0x2959, 0x71A1, 0x2961, 0x71A4, 0x2960, 0x71A5, 0x295E,
- 0x71A7, 0x2964, 0x71A8, 0x11A1, 0x71A9, 0x295B, 0x71AA, 0x2962,
- 0x71AC, 0x119F, 0x71AF, 0x2956, 0x71B0, 0x2958, 0x71B1, 0x11A0,
- 0x71B2, 0x2955, 0x71B3, 0x2965, 0x71B5, 0x295C, 0x71B8, 0x2BB3,
- 0x71B9, 0x12F3, 0x71BC, 0x2BBE, 0x71BD, 0x2BBC, 0x71BE, 0x12ED,
- 0x71BF, 0x2BB2, 0x71C0, 0x2BB5, 0x71C1, 0x2BB6, 0x71C2, 0x2BB1,
- 0x71C3, 0x12F7, 0x71C4, 0x12F8, 0x71C5, 0x2BB0, 0x71C6, 0x2BBF,
- 0x71C7, 0x2BBA, 0x71C8, 0x12F1, 0x71C9, 0x12EE, 0x71CA, 0x2BB9,
- 0x71CB, 0x2BB7, 0x71CE, 0x12F4, 0x71CF, 0x2BBB, 0x71D0, 0x12EF,
- 0x71D2, 0x12F0, 0x71D4, 0x2BB8, 0x71D5, 0x12F2, 0x71D6, 0x2BB4,
- 0x71D8, 0x2BBD, 0x71D9, 0x12F5, 0x71DA, 0x2BC0, 0x71DB, 0x2BC1,
- 0x71DC, 0x12F6, 0x71DF, 0x1404, 0x71E0, 0x140B, 0x71E1, 0x2D9B,
- 0x71E2, 0x2DA1, 0x71E4, 0x2D9F, 0x71E5, 0x1407, 0x71E6, 0x1406,
- 0x71E7, 0x1403, 0x71E8, 0x2D9D, 0x71EC, 0x1409, 0x71ED, 0x1408,
- 0x71EE, 0x1405, 0x71F0, 0x2DA0, 0x71F1, 0x2D9C, 0x71F2, 0x2D9E,
- 0x71F4, 0x140A, 0x71F8, 0x14F1, 0x71F9, 0x2F52, 0x71FB, 0x14EE,
- 0x71FC, 0x14EF, 0x71FD, 0x2F54, 0x71FE, 0x14F0, 0x71FF, 0x2F51,
- 0x7201, 0x2F50, 0x7202, 0x30B9, 0x7203, 0x2F53, 0x7205, 0x30BA,
- 0x7206, 0x1591, 0x7207, 0x30B8, 0x720A, 0x30B7, 0x720C, 0x30B6,
- 0x720D, 0x1592, 0x7210, 0x161F, 0x7213, 0x31F4, 0x7214, 0x31F5,
- 0x7219, 0x32E1, 0x721A, 0x32E0, 0x721B, 0x167B, 0x721D, 0x32DF,
- 0x721E, 0x338D, 0x721F, 0x338E, 0x7222, 0x3424, 0x7223, 0x348C,
- 0x7226, 0x34D1, 0x7227, 0x3535, 0x7228, 0x1766, 0x7229, 0x3549,
- 0x722A, 0x02E7, 0x722C, 0x0645, 0x722D, 0x0646, 0x7230, 0x0791,
- 0x7235, 0x140C, 0x7236, 0x02E8, 0x7238, 0x0647, 0x7239, 0x0923,
- 0x723A, 0x0E75, 0x723B, 0x02E9, 0x723D, 0x0B17, 0x723E, 0x1027,
- 0x723F, 0x178D, 0x7241, 0x1B6E, 0x7242, 0x1D2D, 0x7244, 0x2722,
- 0x7246, 0x140D, 0x7247, 0x02EA, 0x7248, 0x0648, 0x7249, 0x1B6F,
- 0x724A, 0x1B70, 0x724B, 0x21FD, 0x724C, 0x0CD0, 0x724F, 0x248D,
- 0x7252, 0x0E76, 0x7253, 0x2723, 0x7256, 0x11A2, 0x7258, 0x1593,
- 0x7259, 0x02EB, 0x725A, 0x21FE, 0x725B, 0x02EC, 0x725D, 0x03F4,
- 0x725E, 0x180B, 0x725F, 0x03F3, 0x7260, 0x04EC, 0x7261, 0x04EB,
- 0x7262, 0x04EA, 0x7263, 0x18C5, 0x7267, 0x0649, 0x7269, 0x064A,
- 0x726A, 0x19FA, 0x726C, 0x1B71, 0x726E, 0x1B74, 0x726F, 0x0793,
- 0x7270, 0x1B72, 0x7272, 0x0792, 0x7273, 0x1B73, 0x7274, 0x0794,
- 0x7276, 0x1D30, 0x7277, 0x1D2F, 0x7278, 0x1D2E, 0x7279, 0x0924,
- 0x727B, 0x1F81, 0x727C, 0x1F82, 0x727D, 0x0B18, 0x727E, 0x1F80,
- 0x727F, 0x1F83, 0x7280, 0x0CD2, 0x7281, 0x0B19, 0x7284, 0x0CD1,
- 0x7285, 0x2202, 0x7286, 0x2201, 0x7288, 0x21FF, 0x7289, 0x2200,
- 0x728B, 0x2203, 0x728C, 0x248F, 0x728D, 0x248E, 0x728E, 0x2492,
- 0x7290, 0x2491, 0x7291, 0x2490, 0x7292, 0x1028, 0x7293, 0x2726,
- 0x7295, 0x2725, 0x7296, 0x1029, 0x7297, 0x2724, 0x7298, 0x2966,
- 0x729A, 0x2967, 0x729B, 0x11A3, 0x729D, 0x2BC2, 0x729E, 0x2BC3,
- 0x72A1, 0x30BF, 0x72A2, 0x1594, 0x72A3, 0x30BE, 0x72A4, 0x30BD,
- 0x72A5, 0x30BB, 0x72A6, 0x30BC, 0x72A7, 0x167C, 0x72A8, 0x31F6,
- 0x72A9, 0x338F, 0x72AA, 0x34D2, 0x72AC, 0x02ED, 0x72AE, 0x17AF,
- 0x72AF, 0x0355, 0x72B0, 0x17B0, 0x72B4, 0x180C, 0x72B5, 0x180D,
- 0x72BA, 0x18CB, 0x72BD, 0x18C7, 0x72BF, 0x18C6, 0x72C0, 0x064B,
- 0x72C1, 0x18CA, 0x72C2, 0x04EE, 0x72C3, 0x18C8, 0x72C4, 0x04ED,
- 0x72C5, 0x18CC, 0x72C6, 0x18C9, 0x72C9, 0x19FE, 0x72CA, 0x1B75,
- 0x72CB, 0x19FC, 0x72CC, 0x1A03, 0x72CE, 0x064C, 0x72D0, 0x064F,
- 0x72D1, 0x1A04, 0x72D2, 0x1A00, 0x72D4, 0x1A01, 0x72D6, 0x19FB,
- 0x72D7, 0x064E, 0x72D8, 0x19FD, 0x72D9, 0x064D, 0x72DA, 0x1A02,
- 0x72DC, 0x19FF, 0x72DF, 0x1B79, 0x72E0, 0x0796, 0x72E1, 0x0797,
- 0x72E3, 0x1B7C, 0x72E4, 0x1B76, 0x72E6, 0x1B7B, 0x72E8, 0x1B77,
- 0x72E9, 0x0795, 0x72EA, 0x1B7A, 0x72EB, 0x1B78, 0x72F3, 0x1D36,
- 0x72F4, 0x1D33, 0x72F6, 0x1D35, 0x72F7, 0x0929, 0x72F8, 0x0928,
- 0x72F9, 0x0926, 0x72FA, 0x1D32, 0x72FB, 0x1D37, 0x72FC, 0x0925,
- 0x72FD, 0x0927, 0x72FE, 0x1D34, 0x72FF, 0x1F8B, 0x7300, 0x1D31,
- 0x7301, 0x1D38, 0x7307, 0x1F86, 0x7308, 0x1F8A, 0x730A, 0x1F89,
- 0x730B, 0x2205, 0x730C, 0x2210, 0x730F, 0x1F8C, 0x7311, 0x1F87,
- 0x7312, 0x2204, 0x7313, 0x0B1D, 0x7316, 0x0B1C, 0x7317, 0x1F85,
- 0x7318, 0x1F88, 0x7319, 0x0B1E, 0x731B, 0x0B1B, 0x731C, 0x0B1A,
- 0x731D, 0x1F84, 0x731E, 0x1F8D, 0x7322, 0x2207, 0x7323, 0x220E,
- 0x7325, 0x0CD4, 0x7326, 0x220D, 0x7327, 0x220A, 0x7329, 0x0CD6,
- 0x732D, 0x220C, 0x7330, 0x2206, 0x7331, 0x2208, 0x7332, 0x220B,
- 0x7333, 0x2209, 0x7334, 0x0CD5, 0x7335, 0x220F, 0x7336, 0x0CD3,
- 0x7337, 0x0E77, 0x733A, 0x2496, 0x733B, 0x2495, 0x733C, 0x2493,
- 0x733E, 0x0E7A, 0x733F, 0x0E79, 0x7340, 0x2497, 0x7342, 0x2494,
- 0x7343, 0x2727, 0x7344, 0x102A, 0x7345, 0x0E78, 0x7349, 0x2499,
- 0x734A, 0x2498, 0x734C, 0x272A, 0x734D, 0x2728, 0x734E, 0x11A4,
- 0x7350, 0x102B, 0x7351, 0x2729, 0x7352, 0x2969, 0x7357, 0x11A5,
- 0x7358, 0x2968, 0x7359, 0x2971, 0x735A, 0x2970, 0x735B, 0x296E,
- 0x735D, 0x296D, 0x735E, 0x296A, 0x735F, 0x296B, 0x7360, 0x296C,
- 0x7361, 0x296F, 0x7362, 0x2972, 0x7365, 0x2BC8, 0x7366, 0x2BC5,
- 0x7367, 0x2BC6, 0x7368, 0x12F9, 0x7369, 0x2BC4, 0x736A, 0x2BCA,
- 0x736B, 0x2BC9, 0x736C, 0x2BC7, 0x736E, 0x2DA3, 0x736F, 0x2DA4,
- 0x7370, 0x140E, 0x7372, 0x140F, 0x7373, 0x2DA2, 0x7375, 0x14F3,
- 0x7376, 0x2F55, 0x7377, 0x14F2, 0x7378, 0x1595, 0x737A, 0x1596,
- 0x737B, 0x1620, 0x737C, 0x31F8, 0x737D, 0x31F7, 0x737E, 0x32E2,
- 0x737F, 0x3390, 0x7380, 0x16CA, 0x7381, 0x3426, 0x7382, 0x3425,
- 0x7383, 0x3427, 0x7384, 0x0356, 0x7385, 0x1B7D, 0x7386, 0x092A,
- 0x7387, 0x0B1F, 0x7388, 0x1F8E, 0x7389, 0x0357, 0x738A, 0x17B1,
- 0x738B, 0x02EE, 0x738E, 0x180E, 0x7392, 0x18D1, 0x7393, 0x18CF,
- 0x7394, 0x18D0, 0x7395, 0x18CD, 0x7396, 0x04EF, 0x7397, 0x18CE,
- 0x739D, 0x1A0C, 0x739F, 0x0652, 0x73A0, 0x1A0A, 0x73A1, 0x1A06,
- 0x73A2, 0x1A09, 0x73A4, 0x1A05, 0x73A5, 0x0654, 0x73A6, 0x1A08,
- 0x73A8, 0x0651, 0x73A9, 0x0650, 0x73AB, 0x0653, 0x73AC, 0x1A0B,
- 0x73AD, 0x1A07, 0x73B2, 0x079B, 0x73B3, 0x079E, 0x73B4, 0x1B85,
- 0x73B5, 0x1B84, 0x73B6, 0x1B83, 0x73B7, 0x0798, 0x73B8, 0x1B8C,
- 0x73B9, 0x1B82, 0x73BB, 0x079A, 0x73BC, 0x1D3D, 0x73BE, 0x1B89,
- 0x73BF, 0x1B87, 0x73C0, 0x079D, 0x73C2, 0x1B7F, 0x73C3, 0x1B8A,
- 0x73C5, 0x1B81, 0x73C6, 0x1B8B, 0x73C7, 0x1B88, 0x73C8, 0x1B80,
- 0x73CA, 0x0799, 0x73CB, 0x1B8D, 0x73CC, 0x1B7E, 0x73CD, 0x079C,
- 0x73D2, 0x1D42, 0x73D3, 0x1D39, 0x73D4, 0x1D44, 0x73D6, 0x1D3C,
- 0x73D7, 0x1D47, 0x73D8, 0x1D48, 0x73D9, 0x1D3A, 0x73DA, 0x1D46,
- 0x73DB, 0x1D43, 0x73DC, 0x1D41, 0x73DD, 0x1D45, 0x73DE, 0x0930,
- 0x73E0, 0x092E, 0x73E3, 0x1D3F, 0x73E5, 0x1D3B, 0x73E7, 0x1D3E,
- 0x73E8, 0x1D49, 0x73E9, 0x1D40, 0x73EA, 0x092F, 0x73EB, 0x1B86,
- 0x73ED, 0x092B, 0x73EE, 0x092D, 0x73F4, 0x1F9C, 0x73F5, 0x1F91,
- 0x73F6, 0x1F8F, 0x73F8, 0x1F90, 0x73FA, 0x1F97, 0x73FC, 0x1F98,
- 0x73FD, 0x1F94, 0x73FE, 0x0B24, 0x73FF, 0x1F99, 0x7400, 0x1F96,
- 0x7401, 0x1F93, 0x7403, 0x0B22, 0x7404, 0x1F92, 0x7405, 0x0B20,
- 0x7406, 0x0B23, 0x7407, 0x1F95, 0x7408, 0x1F9D, 0x7409, 0x092C,
- 0x740A, 0x0B21, 0x740B, 0x1F9B, 0x740C, 0x1F9A, 0x740D, 0x0B25,
- 0x7416, 0x2215, 0x741A, 0x2216, 0x741B, 0x0CE0, 0x741D, 0x221C,
- 0x7420, 0x221E, 0x7421, 0x2217, 0x7422, 0x0CDA, 0x7423, 0x221B,
- 0x7424, 0x221A, 0x7425, 0x0CDB, 0x7426, 0x0CE1, 0x7428, 0x0CE2,
- 0x7429, 0x221D, 0x742A, 0x0CD8, 0x742B, 0x2214, 0x742C, 0x2212,
- 0x742D, 0x2218, 0x742E, 0x2211, 0x742F, 0x0CDF, 0x7430, 0x2213,
- 0x7431, 0x2219, 0x7432, 0x221F, 0x7433, 0x0CD9, 0x7434, 0x0CDE,
- 0x7435, 0x0CDC, 0x7436, 0x0CDD, 0x743A, 0x0CD7, 0x743F, 0x0E81,
- 0x7440, 0x24A0, 0x7441, 0x0E80, 0x7442, 0x24A4, 0x7444, 0x249A,
- 0x7446, 0x24A5, 0x744A, 0x249B, 0x744B, 0x249C, 0x744D, 0x24A6,
- 0x744E, 0x24A3, 0x744F, 0x24A1, 0x7450, 0x24A2, 0x7451, 0x249E,
- 0x7452, 0x249D, 0x7454, 0x24A7, 0x7455, 0x0E7D, 0x7457, 0x249F,
- 0x7459, 0x0E82, 0x745A, 0x0E7C, 0x745B, 0x0E83, 0x745C, 0x0E84,
- 0x745E, 0x0E7F, 0x745F, 0x0E7E, 0x7462, 0x272B, 0x7463, 0x102D,
- 0x7464, 0x102C, 0x7467, 0x2730, 0x7469, 0x11A6, 0x746A, 0x102E,
- 0x746D, 0x1030, 0x746E, 0x2731, 0x746F, 0x0E7B, 0x7470, 0x102F,
- 0x7471, 0x272D, 0x7472, 0x272F, 0x7473, 0x272C, 0x7475, 0x272E,
- 0x7479, 0x297C, 0x747C, 0x297B, 0x747D, 0x2978, 0x747E, 0x11A9,
- 0x747F, 0x2BCB, 0x7480, 0x11AA, 0x7481, 0x2977, 0x7483, 0x11A8,
- 0x7485, 0x2979, 0x7486, 0x2976, 0x7487, 0x2973, 0x7488, 0x297A,
- 0x7489, 0x2974, 0x748A, 0x2975, 0x748B, 0x11A7, 0x7490, 0x2DA8,
- 0x7492, 0x2BCF, 0x7494, 0x2BCE, 0x7495, 0x2BD0, 0x7497, 0x2DA5,
- 0x7498, 0x12FC, 0x749A, 0x2BCC, 0x749C, 0x12FA, 0x749E, 0x12FE,
- 0x749F, 0x12FD, 0x74A0, 0x2BCD, 0x74A1, 0x2BD1, 0x74A3, 0x12FB,
- 0x74A5, 0x2DAC, 0x74A6, 0x1412, 0x74A7, 0x14F4, 0x74A8, 0x1413,
- 0x74A9, 0x1410, 0x74AA, 0x2DA9, 0x74AB, 0x2DA7, 0x74AD, 0x2DAA,
- 0x74AF, 0x2DAD, 0x74B0, 0x1411, 0x74B1, 0x2DAB, 0x74B2, 0x2DA6,
- 0x74B5, 0x2F58, 0x74B6, 0x2F5B, 0x74B7, 0x30C2, 0x74B8, 0x2F56,
- 0x74BA, 0x31F9, 0x74BB, 0x2F5C, 0x74BD, 0x1597, 0x74BE, 0x2F5A,
- 0x74BF, 0x14F5, 0x74C0, 0x2F57, 0x74C1, 0x2F59, 0x74C2, 0x2F5D,
- 0x74C3, 0x30C3, 0x74C5, 0x30C1, 0x74CA, 0x1598, 0x74CB, 0x30C0,
- 0x74CF, 0x1621, 0x74D4, 0x167E, 0x74D5, 0x3392, 0x74D6, 0x167D,
- 0x74D7, 0x3394, 0x74D8, 0x3391, 0x74D9, 0x3393, 0x74DA, 0x16FE,
- 0x74DB, 0x348D, 0x74DC, 0x0358, 0x74DD, 0x1A0D, 0x74DE, 0x1D4A,
- 0x74DF, 0x1D4B, 0x74E0, 0x0B26, 0x74E1, 0x24A8, 0x74E2, 0x12FF,
- 0x74E3, 0x1599, 0x74E4, 0x16CB, 0x74E5, 0x348E, 0x74E6, 0x0359,
- 0x74E8, 0x1A0E, 0x74E9, 0x0120, 0x74EC, 0x1B8E, 0x74EE, 0x1B8F,
- 0x74F4, 0x1D4C, 0x74F5, 0x1D4D, 0x74F6, 0x0B27, 0x74F7, 0x0B28,
- 0x74FB, 0x2220, 0x74FD, 0x24AB, 0x74FE, 0x24AA, 0x74FF, 0x24A9,
- 0x7500, 0x2732, 0x7502, 0x2733, 0x7503, 0x2734, 0x7504, 0x1031,
- 0x7507, 0x297E, 0x7508, 0x297D, 0x750B, 0x2BD2, 0x750C, 0x1300,
- 0x750D, 0x1301, 0x750F, 0x2DB1, 0x7510, 0x2DAE, 0x7511, 0x2DAF,
- 0x7512, 0x2DB0, 0x7513, 0x2F5F, 0x7514, 0x2F5E, 0x7515, 0x14F6,
- 0x7516, 0x30C4, 0x7517, 0x32E3, 0x7518, 0x035A, 0x751A, 0x079F,
- 0x751C, 0x0B29, 0x751D, 0x24AC, 0x751F, 0x035B, 0x7521, 0x1D4E,
- 0x7522, 0x0B2A, 0x7525, 0x0CE3, 0x7526, 0x0CE4, 0x7528, 0x035C,
- 0x7529, 0x035D, 0x752A, 0x180F, 0x752B, 0x04F1, 0x752C, 0x04F0,
- 0x752D, 0x07A0, 0x752E, 0x1B90, 0x752F, 0x2221, 0x7530, 0x035E,
- 0x7531, 0x035F, 0x7532, 0x0360, 0x7533, 0x0361, 0x7537, 0x04F2,
- 0x7538, 0x04F3, 0x7539, 0x18D3, 0x753A, 0x18D2, 0x753D, 0x0655,
- 0x753E, 0x1A11, 0x753F, 0x1A0F, 0x7540, 0x1A10, 0x7547, 0x1B91,
- 0x7548, 0x1B92, 0x754B, 0x07A4, 0x754C, 0x07A2, 0x754E, 0x07A3,
- 0x754F, 0x07A1, 0x7554, 0x0931, 0x7559, 0x0935, 0x755A, 0x0934,
- 0x755B, 0x1D4F, 0x755C, 0x0933, 0x755D, 0x0932, 0x755F, 0x1D50,
- 0x7562, 0x0B2D, 0x7563, 0x1F9F, 0x7564, 0x1F9E, 0x7565, 0x0B2B,
- 0x7566, 0x0B2C, 0x756A, 0x0CE6, 0x756B, 0x0CE5, 0x756C, 0x2223,
- 0x756F, 0x2222, 0x7570, 0x0B2E, 0x7576, 0x0E85, 0x7577, 0x24AE,
- 0x7578, 0x0E86, 0x7579, 0x24AD, 0x757D, 0x2735, 0x757E, 0x297F,
- 0x757F, 0x11AB, 0x7580, 0x2BD3, 0x7584, 0x2DB2, 0x7586, 0x159B,
- 0x7587, 0x159A, 0x758A, 0x16CC, 0x758B, 0x0362, 0x758C, 0x1A12,
- 0x758F, 0x0B2F, 0x7590, 0x2736, 0x7591, 0x1032, 0x7592, 0x022E,
- 0x7594, 0x18D4, 0x7595, 0x18D5, 0x7598, 0x1A13, 0x7599, 0x0657,
- 0x759A, 0x0658, 0x759D, 0x0656, 0x75A2, 0x07A8, 0x75A3, 0x07A9,
- 0x75A4, 0x07A6, 0x75A5, 0x07A7, 0x75A7, 0x1B93, 0x75AA, 0x1B94,
- 0x75AB, 0x07A5, 0x75B0, 0x1D51, 0x75B2, 0x0939, 0x75B3, 0x093A,
- 0x75B5, 0x0B32, 0x75B6, 0x1D57, 0x75B8, 0x093F, 0x75B9, 0x093D,
- 0x75BA, 0x1D58, 0x75BB, 0x1D53, 0x75BC, 0x093C, 0x75BD, 0x093B,
- 0x75BE, 0x0936, 0x75BF, 0x1D56, 0x75C0, 0x1D55, 0x75C1, 0x1D52,
- 0x75C2, 0x093E, 0x75C4, 0x1D54, 0x75C5, 0x0937, 0x75C7, 0x0938,
- 0x75CA, 0x0B33, 0x75CB, 0x1FA3, 0x75CC, 0x1FA4, 0x75CD, 0x0B34,
- 0x75CE, 0x1FA0, 0x75CF, 0x1FA2, 0x75D0, 0x1FA6, 0x75D1, 0x1FA5,
- 0x75D2, 0x1FA1, 0x75D4, 0x0B30, 0x75D5, 0x0B31, 0x75D7, 0x222B,
- 0x75D8, 0x0CEB, 0x75D9, 0x0CEA, 0x75DA, 0x2225, 0x75DB, 0x0CE8,
- 0x75DD, 0x2228, 0x75DE, 0x0CEC, 0x75DF, 0x2229, 0x75E0, 0x0CED,
- 0x75E1, 0x2226, 0x75E2, 0x0CE7, 0x75E3, 0x0CE9, 0x75E4, 0x222A,
- 0x75E6, 0x2227, 0x75E7, 0x2224, 0x75ED, 0x24BB, 0x75EF, 0x24B0,
- 0x75F0, 0x0E88, 0x75F1, 0x0E8B, 0x75F2, 0x0E8A, 0x75F3, 0x0E8F,
- 0x75F4, 0x0E8E, 0x75F5, 0x24BC, 0x75F6, 0x24BA, 0x75F7, 0x24B3,
- 0x75F8, 0x24B7, 0x75F9, 0x24B6, 0x75FA, 0x0E8C, 0x75FB, 0x24B9,
- 0x75FC, 0x24B5, 0x75FD, 0x24BD, 0x75FE, 0x24B4, 0x75FF, 0x0E8D,
- 0x7600, 0x0E87, 0x7601, 0x0E89, 0x7603, 0x24B2, 0x7608, 0x2738,
- 0x7609, 0x1036, 0x760A, 0x273C, 0x760B, 0x1035, 0x760C, 0x2739,
- 0x760D, 0x1034, 0x760F, 0x24B1, 0x7610, 0x24B8, 0x7611, 0x273B,
- 0x7613, 0x1037, 0x7614, 0x273D, 0x7615, 0x273A, 0x7616, 0x2737,
- 0x7619, 0x2982, 0x761A, 0x2986, 0x761B, 0x2988, 0x761C, 0x2984,
- 0x761D, 0x2983, 0x761E, 0x2981, 0x761F, 0x11AE, 0x7620, 0x11AC,
- 0x7621, 0x11B1, 0x7622, 0x11B2, 0x7623, 0x2985, 0x7624, 0x11AF,
- 0x7625, 0x2980, 0x7626, 0x11B0, 0x7627, 0x1033, 0x7628, 0x2987,
- 0x7629, 0x11AD, 0x762D, 0x2BD5, 0x762F, 0x2BD4, 0x7630, 0x2BDC,
- 0x7631, 0x2BD6, 0x7632, 0x2BDB, 0x7633, 0x2BD8, 0x7634, 0x1302,
- 0x7635, 0x2BDA, 0x7638, 0x1303, 0x763A, 0x1304, 0x763C, 0x2BD9,
- 0x763D, 0x2BD7, 0x7642, 0x1415, 0x7643, 0x2DB3, 0x7646, 0x1414,
- 0x7647, 0x2DB6, 0x7648, 0x2DB4, 0x7649, 0x2DB5, 0x764C, 0x1416,
- 0x7650, 0x2F63, 0x7652, 0x14F9, 0x7653, 0x2F64, 0x7656, 0x14F7,
- 0x7657, 0x2F65, 0x7658, 0x14F8, 0x7659, 0x2F62, 0x765A, 0x2F66,
- 0x765C, 0x2F60, 0x765F, 0x159C, 0x7660, 0x30C5, 0x7661, 0x159D,
- 0x7662, 0x1622, 0x7664, 0x2F61, 0x7665, 0x1623, 0x7669, 0x167F,
- 0x766A, 0x32E4, 0x766C, 0x16CE, 0x766D, 0x3395, 0x766E, 0x16CD,
- 0x7670, 0x3428, 0x7671, 0x1723, 0x7672, 0x1724, 0x7675, 0x3543,
- 0x7676, 0x022F, 0x7678, 0x07AA, 0x7679, 0x1B95, 0x767B, 0x0CEE,
- 0x767C, 0x0CEF, 0x767D, 0x0363, 0x767E, 0x03F5, 0x767F, 0x1810,
- 0x7681, 0x18D6, 0x7682, 0x04F4, 0x7684, 0x0659, 0x7686, 0x07AB,
- 0x7687, 0x07AC, 0x7688, 0x07AD, 0x7689, 0x1FA8, 0x768A, 0x1D59,
- 0x768B, 0x0940, 0x768E, 0x0B35, 0x768F, 0x1FA7, 0x7692, 0x222D,
- 0x7693, 0x0CF1, 0x7695, 0x222C, 0x7696, 0x0CF0, 0x7699, 0x24BE,
- 0x769A, 0x11B3, 0x769B, 0x298C, 0x769C, 0x2989, 0x769D, 0x298A,
- 0x769E, 0x298B, 0x76A4, 0x2DB7, 0x76A6, 0x2F67, 0x76AA, 0x31FB,
- 0x76AB, 0x31FA, 0x76AD, 0x3396, 0x76AE, 0x0364, 0x76AF, 0x1A14,
- 0x76B0, 0x0941, 0x76B4, 0x0CF2, 0x76B5, 0x24BF, 0x76B8, 0x273E,
- 0x76BA, 0x11B4, 0x76BB, 0x2BDD, 0x76BD, 0x2F68, 0x76BE, 0x31FC,
- 0x76BF, 0x0365, 0x76C2, 0x065A, 0x76C3, 0x07B0, 0x76C4, 0x1B96,
- 0x76C5, 0x07B1, 0x76C6, 0x07AF, 0x76C8, 0x07AE, 0x76C9, 0x1D5A,
- 0x76CA, 0x0942, 0x76CD, 0x0943, 0x76CE, 0x0944, 0x76D2, 0x0B37,
- 0x76D3, 0x1FA9, 0x76D4, 0x0B36, 0x76DA, 0x222E, 0x76DB, 0x0B38,
- 0x76DC, 0x0CF3, 0x76DD, 0x24C0, 0x76DE, 0x0E90, 0x76DF, 0x0E91,
- 0x76E1, 0x1038, 0x76E3, 0x1039, 0x76E4, 0x11B5, 0x76E5, 0x1306,
- 0x76E6, 0x2BDE, 0x76E7, 0x1305, 0x76E9, 0x2DB8, 0x76EA, 0x1417,
- 0x76EC, 0x2F69, 0x76ED, 0x31FD, 0x76EE, 0x0366, 0x76EF, 0x04F5,
- 0x76F0, 0x1A17, 0x76F1, 0x1A16, 0x76F2, 0x065B, 0x76F3, 0x1A15,
- 0x76F4, 0x065C, 0x76F5, 0x1A18, 0x76F7, 0x1B9C, 0x76F8, 0x07B4,
- 0x76F9, 0x07B3, 0x76FA, 0x1B9E, 0x76FB, 0x1B9D, 0x76FC, 0x07B8,
- 0x76FE, 0x07B7, 0x7701, 0x07B2, 0x7703, 0x1B98, 0x7704, 0x1B99,
- 0x7705, 0x1B9A, 0x7707, 0x07B9, 0x7708, 0x1B97, 0x7709, 0x07B5,
- 0x770A, 0x1B9B, 0x770B, 0x07B6, 0x7710, 0x1D5D, 0x7711, 0x1D61,
- 0x7712, 0x1D5F, 0x7713, 0x1D5E, 0x7715, 0x1D62, 0x7719, 0x1D63,
- 0x771A, 0x1D64, 0x771B, 0x1D5C, 0x771D, 0x1D5B, 0x771F, 0x0946,
- 0x7720, 0x0947, 0x7722, 0x1D65, 0x7723, 0x1D60, 0x7725, 0x1FB2,
- 0x7727, 0x1D66, 0x7728, 0x0948, 0x7729, 0x0945, 0x772D, 0x1FAC,
- 0x772F, 0x1FAB, 0x7731, 0x1FAD, 0x7732, 0x1FAE, 0x7733, 0x1FB0,
- 0x7734, 0x1FAF, 0x7735, 0x1FB4, 0x7736, 0x0B3C, 0x7737, 0x0B39,
- 0x7738, 0x0B3D, 0x7739, 0x1FAA, 0x773A, 0x0B3E, 0x773B, 0x1FB3,
- 0x773C, 0x0B3B, 0x773D, 0x1FB1, 0x773E, 0x0B3A, 0x7744, 0x2231,
- 0x7745, 0x2233, 0x7746, 0x222F, 0x7747, 0x2230, 0x774A, 0x2234,
- 0x774B, 0x2236, 0x774C, 0x2237, 0x774D, 0x2232, 0x774E, 0x2235,
- 0x774F, 0x0CF4, 0x7752, 0x24C4, 0x7754, 0x24C9, 0x7755, 0x24C1,
- 0x7756, 0x24C5, 0x7759, 0x24CA, 0x775A, 0x24C6, 0x775B, 0x0E92,
- 0x775C, 0x0E9A, 0x775E, 0x0E95, 0x775F, 0x24C2, 0x7760, 0x24C3,
- 0x7761, 0x103D, 0x7762, 0x0E9D, 0x7763, 0x0E96, 0x7765, 0x0E9B,
- 0x7766, 0x0E94, 0x7767, 0x24C8, 0x7768, 0x0E9C, 0x7769, 0x24C7,
- 0x776A, 0x0E98, 0x776B, 0x0E93, 0x776C, 0x0E99, 0x776D, 0x24CB,
- 0x776E, 0x2743, 0x776F, 0x2745, 0x7779, 0x0E97, 0x777C, 0x2740,
- 0x777D, 0x103B, 0x777E, 0x2746, 0x777F, 0x103C, 0x7780, 0x2744,
- 0x7781, 0x273F, 0x7782, 0x2742, 0x7783, 0x2747, 0x7784, 0x103A,
- 0x7785, 0x2741, 0x7787, 0x11B7, 0x7788, 0x2990, 0x7789, 0x298F,
- 0x778B, 0x11BA, 0x778C, 0x11B8, 0x778D, 0x298D, 0x778E, 0x11B6,
- 0x778F, 0x298E, 0x7791, 0x11B9, 0x7795, 0x2BE6, 0x7797, 0x2BE8,
- 0x7799, 0x2BE7, 0x779A, 0x2BDF, 0x779B, 0x2BE3, 0x779C, 0x2BE2,
- 0x779D, 0x2BE0, 0x779E, 0x1308, 0x779F, 0x1309, 0x77A0, 0x1307,
- 0x77A1, 0x2BE1, 0x77A2, 0x2BE4, 0x77A3, 0x2BE5, 0x77A5, 0x130A,
- 0x77A7, 0x141C, 0x77A8, 0x2DC0, 0x77AA, 0x1419, 0x77AB, 0x2DBA,
- 0x77AC, 0x141B, 0x77AD, 0x141D, 0x77B0, 0x141A, 0x77B1, 0x2DBF,
- 0x77B2, 0x2DBB, 0x77B3, 0x1418, 0x77B4, 0x2DBE, 0x77B5, 0x2DB9,
- 0x77B6, 0x2DBD, 0x77B7, 0x2DBC, 0x77BA, 0x2F6B, 0x77BB, 0x14FC,
- 0x77BC, 0x14FD, 0x77BD, 0x14FA, 0x77BF, 0x14FB, 0x77C2, 0x2F6A,
- 0x77C4, 0x30C8, 0x77C7, 0x159E, 0x77C9, 0x30C6, 0x77CA, 0x30C7,
- 0x77CC, 0x31FE, 0x77CD, 0x3201, 0x77CE, 0x31FF, 0x77CF, 0x3200,
- 0x77D0, 0x32E5, 0x77D3, 0x1680, 0x77D4, 0x3429, 0x77D5, 0x348F,
- 0x77D7, 0x1725, 0x77D8, 0x34D3, 0x77D9, 0x34D4, 0x77DA, 0x1753,
- 0x77DB, 0x0367, 0x77DC, 0x07BA, 0x77DE, 0x2238, 0x77E0, 0x24CC,
- 0x77E2, 0x0368, 0x77E3, 0x04F6, 0x77E5, 0x065D, 0x77E7, 0x1B9F,
- 0x77E8, 0x1BA0, 0x77E9, 0x0949, 0x77EC, 0x2239, 0x77ED, 0x0CF5,
- 0x77EE, 0x0E9E, 0x77EF, 0x141E, 0x77F0, 0x2DC1, 0x77F1, 0x30C9,
- 0x77F2, 0x3202, 0x77F3, 0x0369, 0x77F7, 0x1A1E, 0x77F8, 0x1A19,
- 0x77F9, 0x1A1B, 0x77FA, 0x1A1D, 0x77FB, 0x1A1C, 0x77FC, 0x1A1A,
- 0x77FD, 0x065E, 0x7802, 0x07BB, 0x7803, 0x1BA9, 0x7805, 0x1BA4,
- 0x7806, 0x1BA1, 0x7809, 0x1BA8, 0x780C, 0x07BD, 0x780D, 0x07BE,
- 0x780E, 0x1BA7, 0x780F, 0x1BA6, 0x7810, 0x1BA5, 0x7811, 0x1BA2,
- 0x7812, 0x1BA3, 0x7813, 0x1BAA, 0x7814, 0x07BC, 0x781D, 0x094D,
- 0x781F, 0x0953, 0x7820, 0x0952, 0x7821, 0x1D6F, 0x7822, 0x1D69,
- 0x7823, 0x1D67, 0x7825, 0x0950, 0x7826, 0x1FBB, 0x7827, 0x094B,
- 0x7828, 0x1D6C, 0x7829, 0x1D70, 0x782A, 0x1D72, 0x782B, 0x1D6E,
- 0x782C, 0x1D68, 0x782D, 0x0951, 0x782E, 0x1D6D, 0x782F, 0x1D6B,
- 0x7830, 0x094A, 0x7831, 0x1D73, 0x7832, 0x0954, 0x7833, 0x1D71,
- 0x7834, 0x094E, 0x7835, 0x1D6A, 0x7837, 0x094F, 0x7838, 0x094C,
- 0x7843, 0x0B40, 0x7845, 0x1FBC, 0x7848, 0x1FB5, 0x7849, 0x1FB7,
- 0x784A, 0x1FB9, 0x784C, 0x1FBA, 0x784D, 0x1FB8, 0x784E, 0x0B41,
- 0x7850, 0x1FBD, 0x7852, 0x1FB6, 0x785C, 0x223D, 0x785D, 0x0CF6,
- 0x785E, 0x2245, 0x7860, 0x223A, 0x7862, 0x2246, 0x7864, 0x223B,
- 0x7865, 0x223C, 0x7868, 0x2244, 0x7869, 0x2243, 0x786A, 0x2240,
- 0x786B, 0x0B3F, 0x786C, 0x0CF7, 0x786D, 0x223E, 0x786E, 0x2241,
- 0x786F, 0x0CF8, 0x7870, 0x2242, 0x7871, 0x223F, 0x7879, 0x24D7,
- 0x787B, 0x24DB, 0x787C, 0x0EA5, 0x787E, 0x274D, 0x787F, 0x0EA8,
- 0x7880, 0x24D9, 0x7881, 0x36E8, 0x7883, 0x24D6, 0x7884, 0x24D1,
- 0x7885, 0x24D3, 0x7886, 0x24D4, 0x7887, 0x24CD, 0x7889, 0x0EA4,
- 0x788C, 0x0EA3, 0x788E, 0x0E9F, 0x788F, 0x24D0, 0x7891, 0x0EA6,
- 0x7893, 0x0EA7, 0x7894, 0x24CF, 0x7895, 0x24D2, 0x7896, 0x24DA,
- 0x7897, 0x0EA1, 0x7898, 0x0EA2, 0x7899, 0x24D8, 0x789A, 0x24CE,
- 0x789E, 0x274F, 0x789F, 0x103F, 0x78A0, 0x2751, 0x78A1, 0x24D5,
- 0x78A2, 0x2753, 0x78A3, 0x1043, 0x78A4, 0x2754, 0x78A5, 0x2750,
- 0x78A7, 0x1040, 0x78A8, 0x274C, 0x78A9, 0x1042, 0x78AA, 0x2749,
- 0x78AB, 0x274E, 0x78AC, 0x2752, 0x78AD, 0x274B, 0x78B0, 0x0EA0,
- 0x78B2, 0x2748, 0x78B3, 0x1041, 0x78B4, 0x274A, 0x78BA, 0x11BD,
- 0x78BB, 0x2992, 0x78BC, 0x11C1, 0x78BE, 0x11BF, 0x78C1, 0x103E,
- 0x78C3, 0x2999, 0x78C4, 0x299A, 0x78C5, 0x11BC, 0x78C8, 0x2998,
- 0x78C9, 0x299B, 0x78CA, 0x11BE, 0x78CB, 0x11BB, 0x78CC, 0x2994,
- 0x78CD, 0x2991, 0x78CE, 0x2996, 0x78CF, 0x2993, 0x78D0, 0x11C2,
- 0x78D1, 0x2995, 0x78D4, 0x2997, 0x78D5, 0x11C0, 0x78DA, 0x130C,
- 0x78DB, 0x2BEF, 0x78DD, 0x2BE9, 0x78DE, 0x2BED, 0x78DF, 0x2BF3,
- 0x78E0, 0x2BF4, 0x78E1, 0x2BF0, 0x78E2, 0x2BF1, 0x78E3, 0x2BEE,
- 0x78E5, 0x2BEB, 0x78E7, 0x130E, 0x78E8, 0x130B, 0x78E9, 0x2BEA,
- 0x78EA, 0x2BEC, 0x78EC, 0x130D, 0x78ED, 0x2BF2, 0x78EF, 0x1422,
- 0x78F2, 0x2DC8, 0x78F3, 0x2DC2, 0x78F4, 0x1421, 0x78F7, 0x141F,
- 0x78F9, 0x2DCA, 0x78FA, 0x1420, 0x78FB, 0x2DC5, 0x78FC, 0x2DC6,
- 0x78FD, 0x2DC3, 0x78FE, 0x2DCB, 0x78FF, 0x2DC7, 0x7901, 0x1423,
- 0x7902, 0x2DC4, 0x7904, 0x2DCC, 0x7905, 0x2DC9, 0x7909, 0x2F6F,
- 0x790C, 0x2F6C, 0x790E, 0x14FE, 0x7910, 0x2F70, 0x7911, 0x2F72,
- 0x7912, 0x2F71, 0x7913, 0x2F6D, 0x7914, 0x2F6E, 0x7917, 0x30CE,
- 0x7919, 0x159F, 0x791B, 0x30CB, 0x791C, 0x30CD, 0x791D, 0x30CA,
- 0x791E, 0x30CF, 0x7921, 0x30CC, 0x7923, 0x3204, 0x7924, 0x3207,
- 0x7925, 0x3203, 0x7926, 0x1624, 0x7927, 0x3205, 0x7928, 0x3206,
- 0x7929, 0x3208, 0x792A, 0x1625, 0x792B, 0x1627, 0x792C, 0x1626,
- 0x792D, 0x32E6, 0x792F, 0x32E8, 0x7931, 0x32E7, 0x7935, 0x3397,
- 0x7938, 0x3490, 0x7939, 0x34D5, 0x793A, 0x036A, 0x793D, 0x18D7,
- 0x793E, 0x065F, 0x793F, 0x1A20, 0x7940, 0x0660, 0x7941, 0x0661,
- 0x7942, 0x1A1F, 0x7944, 0x1BAF, 0x7945, 0x1BAE, 0x7946, 0x07BF,
- 0x7947, 0x07C2, 0x7948, 0x07C1, 0x7949, 0x07C0, 0x794A, 0x1BAB,
- 0x794B, 0x1BAD, 0x794C, 0x1BAC, 0x794F, 0x1D76, 0x7950, 0x0956,
- 0x7951, 0x1D7A, 0x7952, 0x1D79, 0x7953, 0x1D78, 0x7954, 0x1D74,
- 0x7955, 0x0955, 0x7956, 0x0959, 0x7957, 0x095C, 0x795A, 0x095D,
- 0x795B, 0x1D75, 0x795C, 0x1D77, 0x795D, 0x095B, 0x795E, 0x095A,
- 0x795F, 0x0958, 0x7960, 0x0957, 0x7961, 0x1FC4, 0x7963, 0x1FC2,
- 0x7964, 0x1FBE, 0x7965, 0x0B42, 0x7967, 0x1FBF, 0x7968, 0x0B43,
- 0x7969, 0x1FC0, 0x796A, 0x1FC1, 0x796B, 0x1FC3, 0x796D, 0x0B44,
- 0x7970, 0x224A, 0x7972, 0x2249, 0x7973, 0x2248, 0x7974, 0x2247,
- 0x7979, 0x24DF, 0x797A, 0x0EA9, 0x797C, 0x24DC, 0x797D, 0x24DE,
- 0x797F, 0x0EAA, 0x7981, 0x0EAB, 0x7982, 0x24DD, 0x7988, 0x275D,
- 0x798A, 0x2756, 0x798B, 0x2757, 0x798D, 0x1046, 0x798E, 0x1044,
- 0x798F, 0x1045, 0x7990, 0x275F, 0x7992, 0x275E, 0x7993, 0x275B,
- 0x7994, 0x275A, 0x7995, 0x2759, 0x7996, 0x2758, 0x7997, 0x275C,
- 0x7998, 0x2755, 0x799A, 0x299C, 0x799B, 0x29A1, 0x799C, 0x299F,
- 0x79A0, 0x299E, 0x79A1, 0x299D, 0x79A2, 0x29A0, 0x79A4, 0x2BF5,
- 0x79A6, 0x130F, 0x79A7, 0x1424, 0x79A8, 0x2DCE, 0x79AA, 0x1425,
- 0x79AB, 0x2DCD, 0x79AC, 0x2F74, 0x79AD, 0x2F73, 0x79AE, 0x14FF,
- 0x79B0, 0x30D0, 0x79B1, 0x15A0, 0x79B2, 0x3209, 0x79B3, 0x16CF,
- 0x79B4, 0x3398, 0x79B6, 0x3492, 0x79B7, 0x3491, 0x79B8, 0x17B2,
- 0x79B9, 0x07C3, 0x79BA, 0x07C4, 0x79BB, 0x1FC5, 0x79BD, 0x0EAD,
- 0x79BE, 0x036B, 0x79BF, 0x04F9, 0x79C0, 0x04F8, 0x79C1, 0x04F7,
- 0x79C5, 0x1A21, 0x79C8, 0x0663, 0x79C9, 0x0662, 0x79CB, 0x07C7,
- 0x79CD, 0x1BB1, 0x79CE, 0x1BB4, 0x79CF, 0x1BB2, 0x79D1, 0x07C5,
- 0x79D2, 0x07C6, 0x79D5, 0x1BB0, 0x79D6, 0x1BB3, 0x79D8, 0x0964,
- 0x79DC, 0x1D81, 0x79DD, 0x1D83, 0x79DE, 0x1D82, 0x79DF, 0x0961,
- 0x79E0, 0x1D7D, 0x79E3, 0x095F, 0x79E4, 0x095E, 0x79E6, 0x0962,
- 0x79E7, 0x0960, 0x79E9, 0x0963, 0x79EA, 0x1D80, 0x79EB, 0x1D7B,
- 0x79EC, 0x1D7C, 0x79ED, 0x1D7F, 0x79EE, 0x1D7E, 0x79F6, 0x1FC8,
- 0x79F7, 0x1FC9, 0x79F8, 0x1FC7, 0x79FA, 0x1FC6, 0x79FB, 0x0B45,
- 0x7A00, 0x0CFD, 0x7A02, 0x224B, 0x7A03, 0x224D, 0x7A04, 0x224F,
- 0x7A05, 0x0CFC, 0x7A08, 0x0CFA, 0x7A0A, 0x224C, 0x7A0B, 0x0CFB,
- 0x7A0C, 0x224E, 0x7A0D, 0x0CF9, 0x7A10, 0x24E9, 0x7A11, 0x24E0,
- 0x7A12, 0x24E3, 0x7A13, 0x24E7, 0x7A14, 0x0EB1, 0x7A15, 0x24E5,
- 0x7A17, 0x24E4, 0x7A18, 0x24E1, 0x7A19, 0x24E2, 0x7A1A, 0x0EAF,
- 0x7A1B, 0x24E8, 0x7A1C, 0x0EAE, 0x7A1E, 0x0EB3, 0x7A1F, 0x0EB2,
- 0x7A20, 0x0EB0, 0x7A22, 0x24E6, 0x7A26, 0x2765, 0x7A28, 0x2764,
- 0x7A2B, 0x2760, 0x7A2E, 0x1047, 0x7A2F, 0x2763, 0x7A30, 0x2762,
- 0x7A31, 0x1048, 0x7A37, 0x11C7, 0x7A39, 0x29A3, 0x7A3B, 0x11C8,
- 0x7A3C, 0x11C4, 0x7A3D, 0x11C6, 0x7A3F, 0x11C3, 0x7A40, 0x11C5,
- 0x7A44, 0x2BF6, 0x7A46, 0x1312, 0x7A47, 0x2BF8, 0x7A48, 0x2BF7,
- 0x7A4A, 0x2761, 0x7A4B, 0x1314, 0x7A4C, 0x1313, 0x7A4D, 0x1310,
- 0x7A4E, 0x1311, 0x7A54, 0x2DD3, 0x7A56, 0x2DD1, 0x7A57, 0x1426,
- 0x7A58, 0x2DD2, 0x7A5A, 0x2DD4, 0x7A5B, 0x2DD0, 0x7A5C, 0x2DCF,
- 0x7A5F, 0x2F75, 0x7A60, 0x1502, 0x7A61, 0x1500, 0x7A62, 0x1501,
- 0x7A67, 0x30D1, 0x7A68, 0x30D2, 0x7A69, 0x15A2, 0x7A6B, 0x15A1,
- 0x7A6C, 0x320B, 0x7A6D, 0x320C, 0x7A6E, 0x320A, 0x7A70, 0x3399,
- 0x7A71, 0x339A, 0x7A74, 0x036C, 0x7A75, 0x1811, 0x7A76, 0x04FA,
- 0x7A78, 0x1A22, 0x7A79, 0x0665, 0x7A7A, 0x0664, 0x7A7B, 0x1A23,
- 0x7A7E, 0x1BB6, 0x7A7F, 0x07C8, 0x7A80, 0x1BB5, 0x7A81, 0x07C9,
- 0x7A84, 0x0965, 0x7A85, 0x1D86, 0x7A86, 0x1D84, 0x7A87, 0x1D8A,
- 0x7A88, 0x0966, 0x7A89, 0x1D85, 0x7A8A, 0x1D89, 0x7A8B, 0x1D87,
- 0x7A8C, 0x1D88, 0x7A8F, 0x1FCA, 0x7A90, 0x1FCC, 0x7A92, 0x0B46,
- 0x7A94, 0x1FCB, 0x7A95, 0x0B47, 0x7A96, 0x0D00, 0x7A97, 0x0CFF,
- 0x7A98, 0x0CFE, 0x7A99, 0x2250, 0x7A9E, 0x24EC, 0x7A9F, 0x0EB4,
- 0x7AA0, 0x0EB5, 0x7AA2, 0x24EB, 0x7AA3, 0x24EA, 0x7AA8, 0x2766,
- 0x7AA9, 0x104A, 0x7AAA, 0x1049, 0x7AAB, 0x2767, 0x7AAC, 0x2768,
- 0x7AAE, 0x11CA, 0x7AAF, 0x11C9, 0x7AB1, 0x2BFC, 0x7AB2, 0x29A4,
- 0x7AB3, 0x29A6, 0x7AB4, 0x29A5, 0x7AB5, 0x2BFB, 0x7AB6, 0x2BF9,
- 0x7AB7, 0x2BFD, 0x7AB8, 0x2BFA, 0x7ABA, 0x1315, 0x7ABE, 0x2DD5,
- 0x7ABF, 0x1427, 0x7AC0, 0x2DD6, 0x7AC1, 0x2DD7, 0x7AC4, 0x1503,
- 0x7AC5, 0x1504, 0x7AC7, 0x1628, 0x7ACA, 0x16FF, 0x7ACB, 0x036D,
- 0x7AD1, 0x1BB7, 0x7AD8, 0x1D8B, 0x7AD9, 0x0967, 0x7ADF, 0x0BDE,
- 0x7AE0, 0x0BDD, 0x7AE3, 0x0D02, 0x7AE4, 0x2252, 0x7AE5, 0x0D01,
- 0x7AE6, 0x2251, 0x7AEB, 0x24ED, 0x7AED, 0x104B, 0x7AEE, 0x2769,
- 0x7AEF, 0x104C, 0x7AF6, 0x1629, 0x7AF7, 0x320D, 0x7AF9, 0x03F6,
- 0x7AFA, 0x0666, 0x7AFB, 0x1A24, 0x7AFD, 0x07CB, 0x7AFF, 0x07CA,
- 0x7B00, 0x1BB8, 0x7B01, 0x1BB9, 0x7B04, 0x1D8D, 0x7B05, 0x1D8F,
- 0x7B06, 0x0968, 0x7B08, 0x1D91, 0x7B09, 0x1D94, 0x7B0A, 0x1D92,
- 0x7B0E, 0x1D93, 0x7B0F, 0x1D90, 0x7B10, 0x1D8C, 0x7B11, 0x0969,
- 0x7B12, 0x1D95, 0x7B13, 0x1D8E, 0x7B18, 0x1FD5, 0x7B19, 0x0B4D,
- 0x7B1A, 0x1FDE, 0x7B1B, 0x0B4A, 0x7B1D, 0x1FD7, 0x7B1E, 0x0B4E,
- 0x7B20, 0x0B48, 0x7B22, 0x1FD2, 0x7B23, 0x1FDF, 0x7B24, 0x1FD3,
- 0x7B25, 0x1FD0, 0x7B26, 0x0B4C, 0x7B28, 0x0B49, 0x7B2A, 0x1FD6,
- 0x7B2B, 0x1FD9, 0x7B2C, 0x0B4B, 0x7B2D, 0x1FDA, 0x7B2E, 0x0B4F,
- 0x7B2F, 0x1FDB, 0x7B30, 0x1FD1, 0x7B31, 0x1FD8, 0x7B32, 0x1FDC,
- 0x7B33, 0x1FD4, 0x7B34, 0x1FCF, 0x7B35, 0x1FCD, 0x7B38, 0x1FDD,
- 0x7B3B, 0x1FCE, 0x7B40, 0x2259, 0x7B44, 0x2255, 0x7B45, 0x225B,
- 0x7B46, 0x0D05, 0x7B47, 0x2254, 0x7B48, 0x2256, 0x7B49, 0x0D03,
- 0x7B4A, 0x2253, 0x7B4B, 0x0D0A, 0x7B4C, 0x2257, 0x7B4D, 0x0D09,
- 0x7B4E, 0x2258, 0x7B4F, 0x0D0B, 0x7B50, 0x0D06, 0x7B51, 0x0D0C,
- 0x7B52, 0x0D07, 0x7B54, 0x0D08, 0x7B56, 0x0D04, 0x7B58, 0x225A,
- 0x7B60, 0x0EB8, 0x7B61, 0x24F8, 0x7B63, 0x24FB, 0x7B64, 0x24EF,
- 0x7B65, 0x24F4, 0x7B66, 0x24EE, 0x7B67, 0x0EBA, 0x7B69, 0x24F2,
- 0x7B6D, 0x24F0, 0x7B6E, 0x0EB9, 0x7B70, 0x24F7, 0x7B71, 0x24F6,
- 0x7B72, 0x24F3, 0x7B73, 0x24F5, 0x7B74, 0x24F1, 0x7B75, 0x1050,
- 0x7B76, 0x24FA, 0x7B77, 0x0EB6, 0x7B78, 0x24F9, 0x7B82, 0x2779,
- 0x7B84, 0x1057, 0x7B85, 0x2774, 0x7B87, 0x1056, 0x7B88, 0x276A,
- 0x7B8A, 0x276C, 0x7B8B, 0x104F, 0x7B8C, 0x2771, 0x7B8D, 0x2770,
- 0x7B8E, 0x2773, 0x7B8F, 0x1054, 0x7B90, 0x276E, 0x7B91, 0x276D,
- 0x7B94, 0x1053, 0x7B95, 0x104E, 0x7B96, 0x276F, 0x7B97, 0x1051,
- 0x7B98, 0x2775, 0x7B99, 0x2777, 0x7B9B, 0x2772, 0x7B9C, 0x276B,
- 0x7B9D, 0x1052, 0x7BA0, 0x11D2, 0x7BA1, 0x104D, 0x7BA4, 0x2778,
- 0x7BAC, 0x29AA, 0x7BAD, 0x11CB, 0x7BAF, 0x29AC, 0x7BB1, 0x11CC,
- 0x7BB4, 0x11CE, 0x7BB5, 0x29AF, 0x7BB7, 0x29A7, 0x7BB8, 0x1055,
- 0x7BB9, 0x29AD, 0x7BBE, 0x29A9, 0x7BC0, 0x0EB7, 0x7BC1, 0x11D1,
- 0x7BC4, 0x11CD, 0x7BC6, 0x11CF, 0x7BC7, 0x11D0, 0x7BC9, 0x1318,
- 0x7BCA, 0x29AE, 0x7BCB, 0x29A8, 0x7BCC, 0x11D3, 0x7BCE, 0x29AB,
- 0x7BD4, 0x2C07, 0x7BD5, 0x2C02, 0x7BD8, 0x2C0C, 0x7BD9, 0x1316,
- 0x7BDA, 0x2C04, 0x7BDB, 0x131A, 0x7BDC, 0x2C0A, 0x7BDD, 0x2C01,
- 0x7BDE, 0x2BFE, 0x7BDF, 0x2C0D, 0x7BE0, 0x142D, 0x7BE1, 0x131B,
- 0x7BE2, 0x2C09, 0x7BE3, 0x2BFF, 0x7BE4, 0x1319, 0x7BE5, 0x2C03,
- 0x7BE6, 0x131D, 0x7BE7, 0x2C00, 0x7BE8, 0x2C05, 0x7BE9, 0x131C,
- 0x7BEA, 0x2C08, 0x7BEB, 0x2C0B, 0x7BF0, 0x2DE9, 0x7BF1, 0x2DEA,
- 0x7BF2, 0x2DDA, 0x7BF3, 0x2DE1, 0x7BF4, 0x2DDF, 0x7BF7, 0x142B,
- 0x7BF8, 0x2DE6, 0x7BF9, 0x2C06, 0x7BFB, 0x2DDD, 0x7BFD, 0x2DE7,
- 0x7BFE, 0x142A, 0x7BFF, 0x2DDC, 0x7C00, 0x2DDB, 0x7C01, 0x2DE5,
- 0x7C02, 0x2DE2, 0x7C03, 0x2DE4, 0x7C05, 0x2DD8, 0x7C06, 0x2DE8,
- 0x7C07, 0x1428, 0x7C09, 0x2DE3, 0x7C0A, 0x2DEC, 0x7C0B, 0x2DE0,
- 0x7C0C, 0x142C, 0x7C0D, 0x1429, 0x7C0E, 0x2DDE, 0x7C0F, 0x2DD9,
- 0x7C10, 0x2DEB, 0x7C11, 0x1317, 0x7C19, 0x2F78, 0x7C1C, 0x2F76,
- 0x7C1D, 0x2F7C, 0x7C1E, 0x1508, 0x7C1F, 0x2F7A, 0x7C20, 0x2F79,
- 0x7C21, 0x150A, 0x7C22, 0x2F7F, 0x7C23, 0x1509, 0x7C25, 0x2F80,
- 0x7C26, 0x2F7D, 0x7C27, 0x1506, 0x7C28, 0x2F7E, 0x7C29, 0x2F77,
- 0x7C2A, 0x1507, 0x7C2B, 0x1505, 0x7C2C, 0x30D6, 0x7C2D, 0x2F7B,
- 0x7C30, 0x2F81, 0x7C33, 0x30D3, 0x7C37, 0x15A7, 0x7C38, 0x15A5,
- 0x7C39, 0x30D5, 0x7C3B, 0x30D7, 0x7C3C, 0x30D4, 0x7C3D, 0x15A6,
- 0x7C3E, 0x15A3, 0x7C3F, 0x15A4, 0x7C40, 0x15A8, 0x7C43, 0x162B,
- 0x7C45, 0x3212, 0x7C47, 0x3211, 0x7C48, 0x320F, 0x7C49, 0x320E,
- 0x7C4A, 0x3210, 0x7C4C, 0x162A, 0x7C4D, 0x162C, 0x7C50, 0x1681,
- 0x7C53, 0x32EA, 0x7C54, 0x32E9, 0x7C57, 0x339B, 0x7C59, 0x339D,
- 0x7C5A, 0x339F, 0x7C5B, 0x339E, 0x7C5C, 0x339C, 0x7C5F, 0x16D1,
- 0x7C60, 0x16D0, 0x7C63, 0x1701, 0x7C64, 0x1700, 0x7C65, 0x1702,
- 0x7C66, 0x342B, 0x7C67, 0x342A, 0x7C69, 0x34D6, 0x7C6A, 0x3493,
- 0x7C6B, 0x34D7, 0x7C6C, 0x1745, 0x7C6E, 0x1746, 0x7C6F, 0x3507,
- 0x7C72, 0x176B, 0x7C73, 0x03F7, 0x7C75, 0x1A25, 0x7C78, 0x1BBB,
- 0x7C79, 0x1BBC, 0x7C7A, 0x1BBA, 0x7C7D, 0x07CC, 0x7C7F, 0x1BBD,
- 0x7C80, 0x1BBE, 0x7C81, 0x1BBF, 0x7C84, 0x1D96, 0x7C85, 0x1D9C,
- 0x7C88, 0x1D9A, 0x7C89, 0x096A, 0x7C8A, 0x1D98, 0x7C8C, 0x1D99,
- 0x7C8D, 0x1D9B, 0x7C91, 0x1D97, 0x7C92, 0x0B50, 0x7C94, 0x1FE0,
- 0x7C95, 0x0B52, 0x7C96, 0x1FE2, 0x7C97, 0x0B51, 0x7C98, 0x1FE1,
- 0x7C9E, 0x225D, 0x7C9F, 0x0D0D, 0x7CA1, 0x225F, 0x7CA2, 0x225C,
- 0x7CA3, 0x1FE3, 0x7CA5, 0x0D0E, 0x7CA7, 0x36ED, 0x7CA8, 0x225E,
- 0x7CAF, 0x24FE, 0x7CB1, 0x0EBB, 0x7CB2, 0x24FC, 0x7CB3, 0x0EBC,
- 0x7CB4, 0x24FD, 0x7CB5, 0x0EBD, 0x7CB9, 0x1058, 0x7CBA, 0x277D,
- 0x7CBB, 0x277A, 0x7CBC, 0x277C, 0x7CBD, 0x1059, 0x7CBE, 0x105A,
- 0x7CBF, 0x277B, 0x7CC5, 0x29B0, 0x7CC8, 0x29B1, 0x7CCA, 0x11D4,
- 0x7CCB, 0x29B3, 0x7CCC, 0x29B2, 0x7CCE, 0x0121, 0x7CD0, 0x2C11,
- 0x7CD1, 0x2C12, 0x7CD2, 0x2C0E, 0x7CD4, 0x2C0F, 0x7CD5, 0x131E,
- 0x7CD6, 0x131F, 0x7CD7, 0x2C10, 0x7CD9, 0x1433, 0x7CDC, 0x142F,
- 0x7CDD, 0x1434, 0x7CDE, 0x1430, 0x7CDF, 0x1432, 0x7CE0, 0x142E,
- 0x7CE2, 0x1431, 0x7CE7, 0x150B, 0x7CE8, 0x2DED, 0x7CEA, 0x30D9,
- 0x7CEC, 0x30D8, 0x7CEE, 0x3213, 0x7CEF, 0x162D, 0x7CF0, 0x162E,
- 0x7CF1, 0x33A1, 0x7CF2, 0x32EB, 0x7CF4, 0x33A0, 0x7CF6, 0x34D8,
- 0x7CF7, 0x351D, 0x7CF8, 0x03F8, 0x7CFB, 0x04FB, 0x7CFD, 0x1A26,
- 0x7CFE, 0x0667, 0x7D00, 0x07CF, 0x7D01, 0x1BC2, 0x7D02, 0x07CD,
- 0x7D03, 0x1BC0, 0x7D04, 0x07D2, 0x7D05, 0x07CE, 0x7D06, 0x07D3,
- 0x7D07, 0x07D1, 0x7D08, 0x1BC1, 0x7D09, 0x07D0, 0x7D0A, 0x096E,
- 0x7D0B, 0x096D, 0x7D0C, 0x1DA7, 0x7D0D, 0x0976, 0x7D0E, 0x1DA0,
- 0x7D0F, 0x1DA6, 0x7D10, 0x0972, 0x7D11, 0x1D9F, 0x7D12, 0x1DA5,
- 0x7D13, 0x1DA3, 0x7D14, 0x0971, 0x7D15, 0x0973, 0x7D16, 0x1DA2,
- 0x7D17, 0x096C, 0x7D18, 0x1DA1, 0x7D19, 0x0977, 0x7D1A, 0x0974,
- 0x7D1B, 0x0978, 0x7D1C, 0x0975, 0x7D1D, 0x1D9E, 0x7D1E, 0x1D9D,
- 0x7D1F, 0x1DA4, 0x7D20, 0x096F, 0x7D21, 0x096B, 0x7D22, 0x0970,
- 0x7D28, 0x1FF2, 0x7D29, 0x1FEB, 0x7D2B, 0x0D13, 0x7D2C, 0x1FEA,
- 0x7D2E, 0x0B56, 0x7D2F, 0x0B5D, 0x7D30, 0x0B5A, 0x7D31, 0x0B60,
- 0x7D32, 0x0B5F, 0x7D33, 0x0B5B, 0x7D35, 0x1FE4, 0x7D36, 0x1FE7,
- 0x7D38, 0x1FE6, 0x7D39, 0x0B57, 0x7D3A, 0x1FE8, 0x7D3B, 0x1FF1,
- 0x7D3C, 0x0B58, 0x7D3D, 0x1FE5, 0x7D3E, 0x1FEE, 0x7D3F, 0x1FEF,
- 0x7D40, 0x0B59, 0x7D41, 0x1FEC, 0x7D42, 0x0B5E, 0x7D43, 0x0B54,
- 0x7D44, 0x0B5C, 0x7D45, 0x1FE9, 0x7D46, 0x0B53, 0x7D47, 0x1FED,
- 0x7D4A, 0x1FF0, 0x7D4E, 0x2270, 0x7D4F, 0x2267, 0x7D50, 0x0D10,
- 0x7D51, 0x226E, 0x7D52, 0x226B, 0x7D53, 0x2263, 0x7D54, 0x226C,
- 0x7D55, 0x0D12, 0x7D56, 0x2264, 0x7D58, 0x2260, 0x7D5B, 0x0EC3,
- 0x7D5C, 0x2269, 0x7D5E, 0x0D0F, 0x7D5F, 0x226F, 0x7D61, 0x0D16,
- 0x7D62, 0x0D18, 0x7D63, 0x2262, 0x7D66, 0x0D17, 0x7D67, 0x2265,
- 0x7D68, 0x0D11, 0x7D69, 0x226D, 0x7D6A, 0x2266, 0x7D6B, 0x226A,
- 0x7D6D, 0x2268, 0x7D6E, 0x0D14, 0x7D6F, 0x2261, 0x7D70, 0x0D19,
- 0x7D71, 0x0B55, 0x7D72, 0x0D15, 0x7D73, 0x0D1A, 0x7D79, 0x0EBF,
- 0x7D7A, 0x2505, 0x7D7B, 0x2507, 0x7D7C, 0x2509, 0x7D7D, 0x250D,
- 0x7D7F, 0x2503, 0x7D80, 0x2501, 0x7D81, 0x0EC1, 0x7D83, 0x2508,
- 0x7D84, 0x250C, 0x7D85, 0x2504, 0x7D86, 0x2500, 0x7D88, 0x24FF,
- 0x7D8C, 0x250A, 0x7D8D, 0x2502, 0x7D8E, 0x2506, 0x7D8F, 0x0EC2,
- 0x7D91, 0x0EC0, 0x7D92, 0x250E, 0x7D93, 0x0EBE, 0x7D94, 0x250B,
- 0x7D96, 0x278E, 0x7D9C, 0x105D, 0x7D9D, 0x2786, 0x7D9E, 0x11E1,
- 0x7D9F, 0x2790, 0x7DA0, 0x1060, 0x7DA1, 0x2794, 0x7DA2, 0x1066,
- 0x7DA3, 0x2781, 0x7DA6, 0x2791, 0x7DA7, 0x277E, 0x7DA9, 0x2793,
- 0x7DAA, 0x2782, 0x7DAC, 0x106D, 0x7DAD, 0x106A, 0x7DAE, 0x2792,
- 0x7DAF, 0x278C, 0x7DB0, 0x105C, 0x7DB1, 0x1064, 0x7DB2, 0x1063,
- 0x7DB4, 0x1062, 0x7DB5, 0x1068, 0x7DB7, 0x277F, 0x7DB8, 0x1069,
- 0x7DB9, 0x278D, 0x7DBA, 0x1065, 0x7DBB, 0x105B, 0x7DBC, 0x278F,
- 0x7DBD, 0x105E, 0x7DBE, 0x105F, 0x7DBF, 0x1067, 0x7DC0, 0x2784,
- 0x7DC1, 0x2783, 0x7DC2, 0x2780, 0x7DC4, 0x2788, 0x7DC5, 0x2785,
- 0x7DC6, 0x2789, 0x7DC7, 0x106C, 0x7DC9, 0x2795, 0x7DCA, 0x1061,
- 0x7DCB, 0x278A, 0x7DCC, 0x278B, 0x7DCE, 0x2787, 0x7DD2, 0x106B,
- 0x7DD7, 0x29B8, 0x7DD8, 0x11D9, 0x7DD9, 0x11E2, 0x7DDA, 0x11DE,
- 0x7DDB, 0x29B5, 0x7DDD, 0x11DB, 0x7DDE, 0x11DF, 0x7DDF, 0x29C1,
- 0x7DE0, 0x11D5, 0x7DE1, 0x29B9, 0x7DE3, 0x11DD, 0x7DE6, 0x29BC,
- 0x7DE7, 0x29B7, 0x7DE8, 0x11DC, 0x7DE9, 0x11E0, 0x7DEA, 0x29B6,
- 0x7DEC, 0x11DA, 0x7DEE, 0x29C0, 0x7DEF, 0x11D7, 0x7DF0, 0x29BF,
- 0x7DF1, 0x29BE, 0x7DF2, 0x11E3, 0x7DF3, 0x28C8, 0x7DF4, 0x11D6,
- 0x7DF6, 0x29BD, 0x7DF7, 0x29B4, 0x7DF9, 0x11E4, 0x7DFA, 0x29BB,
- 0x7DFB, 0x11D8, 0x7E03, 0x29BA, 0x7E08, 0x1322, 0x7E09, 0x1327,
- 0x7E0A, 0x1320, 0x7E0B, 0x2C1F, 0x7E0C, 0x2C16, 0x7E0D, 0x2C22,
- 0x7E0E, 0x2C1A, 0x7E0F, 0x2C20, 0x7E10, 0x1328, 0x7E11, 0x1321,
- 0x7E12, 0x2C13, 0x7E13, 0x2C19, 0x7E14, 0x2C23, 0x7E15, 0x2C1C,
- 0x7E16, 0x2C21, 0x7E17, 0x2C15, 0x7E1A, 0x2C1D, 0x7E1B, 0x1323,
- 0x7E1C, 0x2C1B, 0x7E1D, 0x1326, 0x7E1E, 0x1325, 0x7E1F, 0x2C17,
- 0x7E20, 0x2C18, 0x7E21, 0x2C14, 0x7E22, 0x2C1E, 0x7E23, 0x1324,
- 0x7E24, 0x2C25, 0x7E25, 0x2C24, 0x7E29, 0x2DF8, 0x7E2A, 0x2DF4,
- 0x7E2B, 0x143B, 0x7E2D, 0x2DEE, 0x7E2E, 0x1435, 0x7E2F, 0x1445,
- 0x7E30, 0x2DFA, 0x7E31, 0x143D, 0x7E32, 0x1439, 0x7E33, 0x2DF1,
- 0x7E34, 0x1440, 0x7E35, 0x1443, 0x7E36, 0x2DFC, 0x7E37, 0x1438,
- 0x7E38, 0x2DF3, 0x7E39, 0x1441, 0x7E3A, 0x2DFE, 0x7E3B, 0x2DFB,
- 0x7E3C, 0x2DEF, 0x7E3D, 0x143C, 0x7E3E, 0x1436, 0x7E3F, 0x1444,
- 0x7E40, 0x2DF6, 0x7E41, 0x143F, 0x7E42, 0x2DF0, 0x7E43, 0x143A,
- 0x7E44, 0x2DFD, 0x7E45, 0x143E, 0x7E46, 0x1437, 0x7E47, 0x2DF7,
- 0x7E48, 0x1442, 0x7E49, 0x2DF5, 0x7E4C, 0x2DF9, 0x7E50, 0x2F83,
- 0x7E51, 0x2F89, 0x7E52, 0x1511, 0x7E53, 0x2F8C, 0x7E54, 0x150C,
- 0x7E55, 0x150D, 0x7E56, 0x2F84, 0x7E57, 0x2F8B, 0x7E58, 0x2F86,
- 0x7E59, 0x1512, 0x7E5A, 0x150F, 0x7E5C, 0x2F82, 0x7E5E, 0x150E,
- 0x7E5F, 0x2F88, 0x7E60, 0x2F8A, 0x7E61, 0x1510, 0x7E62, 0x2F87,
- 0x7E63, 0x2F85, 0x7E68, 0x30E3, 0x7E69, 0x15AC, 0x7E6A, 0x15AD,
- 0x7E6B, 0x15A9, 0x7E6D, 0x15AA, 0x7E6F, 0x30DF, 0x7E70, 0x30DD,
- 0x7E72, 0x30E1, 0x7E73, 0x15AE, 0x7E74, 0x30E2, 0x7E75, 0x30DB,
- 0x7E76, 0x30DA, 0x7E77, 0x30DE, 0x7E78, 0x30DC, 0x7E79, 0x15AB,
- 0x7E7A, 0x30E0, 0x7E7B, 0x3214, 0x7E7C, 0x1631, 0x7E7D, 0x1630,
- 0x7E7E, 0x3215, 0x7E80, 0x3217, 0x7E81, 0x3216, 0x7E82, 0x1632,
- 0x7E86, 0x32F0, 0x7E87, 0x32ED, 0x7E88, 0x32EE, 0x7E8A, 0x32EC,
- 0x7E8B, 0x32EF, 0x7E8C, 0x1683, 0x7E8D, 0x32F1, 0x7E8F, 0x1682,
- 0x7E91, 0x33A2, 0x7E93, 0x1703, 0x7E94, 0x1705, 0x7E95, 0x342C,
- 0x7E96, 0x1704, 0x7E97, 0x3494, 0x7E98, 0x34DA, 0x7E99, 0x34DC,
- 0x7E9A, 0x34D9, 0x7E9B, 0x34DB, 0x7E9C, 0x1759, 0x7F36, 0x03F9,
- 0x7F38, 0x07D4, 0x7F39, 0x1D1F, 0x7F3A, 0x0979, 0x7F3D, 0x0B61,
- 0x7F3E, 0x2271, 0x7F3F, 0x2272, 0x7F43, 0x2C26, 0x7F44, 0x1446,
- 0x7F45, 0x2DFF, 0x7F48, 0x1513, 0x7F4A, 0x30E5, 0x7F4B, 0x30E4,
- 0x7F4C, 0x1633, 0x7F4D, 0x32F2, 0x7F4F, 0x33A3, 0x7F50, 0x1726,
- 0x7F51, 0x1812, 0x7F54, 0x0668, 0x7F55, 0x04FC, 0x7F58, 0x1BC3,
- 0x7F5B, 0x1DAD, 0x7F5C, 0x1DA8, 0x7F5D, 0x1DAC, 0x7F5E, 0x1DAA,
- 0x7F5F, 0x097A, 0x7F60, 0x1DAB, 0x7F61, 0x1DA9, 0x7F63, 0x1FF3,
- 0x7F65, 0x2273, 0x7F66, 0x2274, 0x7F67, 0x2511, 0x7F68, 0x2512,
- 0x7F69, 0x0EC5, 0x7F6A, 0x0EC6, 0x7F6B, 0x2510, 0x7F6C, 0x2513,
- 0x7F6D, 0x250F, 0x7F6E, 0x0EC4, 0x7F70, 0x106E, 0x7F72, 0x0EC7,
- 0x7F73, 0x2796, 0x7F75, 0x11E5, 0x7F76, 0x29C2, 0x7F77, 0x11E6,
- 0x7F79, 0x1329, 0x7F7A, 0x2C29, 0x7F7B, 0x2C27, 0x7F7C, 0x2C28,
- 0x7F7D, 0x2E02, 0x7F7E, 0x2E01, 0x7F7F, 0x2E00, 0x7F83, 0x30E6,
- 0x7F85, 0x15AF, 0x7F86, 0x30E7, 0x7F87, 0x33A4, 0x7F88, 0x1727,
- 0x7F89, 0x3495, 0x7F8A, 0x03FA, 0x7F8B, 0x066A, 0x7F8C, 0x0669,
- 0x7F8D, 0x1BC5, 0x7F8E, 0x07D5, 0x7F91, 0x1BC4, 0x7F92, 0x1DAF,
- 0x7F94, 0x097B, 0x7F95, 0x1FF4, 0x7F96, 0x1DAE, 0x7F9A, 0x0B63,
- 0x7F9B, 0x1FF7, 0x7F9C, 0x1FF5, 0x7F9D, 0x1FF6, 0x7F9E, 0x0B62,
- 0x7FA0, 0x2276, 0x7FA1, 0x2277, 0x7FA2, 0x2275, 0x7FA4, 0x0ECA,
- 0x7FA5, 0x2515, 0x7FA6, 0x2514, 0x7FA7, 0x2516, 0x7FA8, 0x0EC9,
- 0x7FA9, 0x0EC8, 0x7FAC, 0x29C3, 0x7FAD, 0x29C5, 0x7FAF, 0x11E7,
- 0x7FB0, 0x29C4, 0x7FB1, 0x2C2A, 0x7FB2, 0x132A, 0x7FB3, 0x2F8E,
- 0x7FB5, 0x2F8D, 0x7FB6, 0x15B0, 0x7FB7, 0x30E8, 0x7FB8, 0x15B2,
- 0x7FB9, 0x15B1, 0x7FBA, 0x3218, 0x7FBB, 0x32F3, 0x7FBC, 0x1684,
- 0x7FBD, 0x03FB, 0x7FBE, 0x1BC6, 0x7FBF, 0x07D6, 0x7FC0, 0x1DB2,
- 0x7FC1, 0x097D, 0x7FC2, 0x1DB1, 0x7FC3, 0x1DB0, 0x7FC5, 0x097C,
- 0x7FC7, 0x1FFD, 0x7FC9, 0x1FFF, 0x7FCA, 0x1FF8, 0x7FCB, 0x1FF9,
- 0x7FCC, 0x0B64, 0x7FCD, 0x1FFA, 0x7FCE, 0x0B65, 0x7FCF, 0x1FFE,
- 0x7FD0, 0x1FFB, 0x7FD1, 0x1FFC, 0x7FD2, 0x0B66, 0x7FD4, 0x0D1C,
- 0x7FD5, 0x0D1D, 0x7FD7, 0x2278, 0x7FDB, 0x2517, 0x7FDC, 0x2518,
- 0x7FDE, 0x279A, 0x7FDF, 0x1071, 0x7FE0, 0x106F, 0x7FE1, 0x1070,
- 0x7FE2, 0x2797, 0x7FE3, 0x2798, 0x7FE5, 0x2799, 0x7FE6, 0x29CA,
- 0x7FE8, 0x29CB, 0x7FE9, 0x11E8, 0x7FEA, 0x29C8, 0x7FEB, 0x29C7,
- 0x7FEC, 0x29C9, 0x7FED, 0x29C6, 0x7FEE, 0x132D, 0x7FEF, 0x2C2B,
- 0x7FF0, 0x132B, 0x7FF1, 0x132C, 0x7FF2, 0x2E04, 0x7FF3, 0x1447,
- 0x7FF4, 0x2E03, 0x7FF5, 0x2EFF, 0x7FF7, 0x2F8F, 0x7FF8, 0x2F90,
- 0x7FF9, 0x1514, 0x7FFB, 0x1515, 0x7FFC, 0x1448, 0x7FFD, 0x30E9,
- 0x7FFE, 0x30EA, 0x7FFF, 0x3219, 0x8000, 0x1634, 0x8001, 0x03FC,
- 0x8003, 0x03FD, 0x8004, 0x097F, 0x8005, 0x066B, 0x8006, 0x097E,
- 0x8007, 0x1BC7, 0x800B, 0x0D1E, 0x800C, 0x03FE, 0x800D, 0x07D8,
- 0x800E, 0x1BC8, 0x800F, 0x1BC9, 0x8010, 0x07D7, 0x8011, 0x07D9,
- 0x8012, 0x03FF, 0x8014, 0x1BCA, 0x8015, 0x0981, 0x8016, 0x1DB3,
- 0x8017, 0x0983, 0x8018, 0x0980, 0x8019, 0x0982, 0x801B, 0x2002,
- 0x801C, 0x0B67, 0x801E, 0x2001, 0x801F, 0x2000, 0x8021, 0x2519,
- 0x8024, 0x279B, 0x8026, 0x11E9, 0x8028, 0x132E, 0x8029, 0x2C2D,
- 0x802A, 0x2C2C, 0x802C, 0x2E05, 0x8030, 0x32F4, 0x8033, 0x0400,
- 0x8034, 0x18D8, 0x8035, 0x1A27, 0x8036, 0x07DA, 0x8037, 0x1BCB,
- 0x8039, 0x1DB5, 0x803D, 0x0984, 0x803E, 0x1DB4, 0x803F, 0x0985,
- 0x8043, 0x2004, 0x8046, 0x0B69, 0x8047, 0x2003, 0x8048, 0x2005,
- 0x804A, 0x0B68, 0x804F, 0x227A, 0x8050, 0x227B, 0x8051, 0x2279,
- 0x8052, 0x0D1F, 0x8056, 0x0ECB, 0x8058, 0x0ECC, 0x805A, 0x1073,
- 0x805C, 0x279D, 0x805D, 0x279C, 0x805E, 0x1072, 0x8064, 0x29CC,
- 0x8067, 0x29CD, 0x806C, 0x2C2E, 0x806F, 0x144C, 0x8070, 0x144B,
- 0x8071, 0x1449, 0x8072, 0x144A, 0x8073, 0x144D, 0x8075, 0x2F91,
- 0x8076, 0x1517, 0x8077, 0x1516, 0x8078, 0x30EB, 0x8079, 0x321A,
- 0x807D, 0x16D3, 0x807E, 0x16D2, 0x807F, 0x0401, 0x8082, 0x1CEC,
- 0x8084, 0x0ECE, 0x8085, 0x0D20, 0x8086, 0x0ECD, 0x8087, 0x1074,
- 0x8089, 0x0402, 0x808A, 0x17B3, 0x808B, 0x0403, 0x808C, 0x0404,
- 0x808F, 0x1A28, 0x8090, 0x18DB, 0x8092, 0x18DC, 0x8093, 0x04FE,
- 0x8095, 0x18D9, 0x8096, 0x04FD, 0x8098, 0x0500, 0x8099, 0x18DA,
- 0x809A, 0x0502, 0x809B, 0x0501, 0x809C, 0x18DD, 0x809D, 0x04FF,
- 0x80A1, 0x0670, 0x80A2, 0x066E, 0x80A3, 0x1A2A, 0x80A5, 0x066D,
- 0x80A9, 0x0672, 0x80AA, 0x0674, 0x80AB, 0x0671, 0x80AD, 0x1A2D,
- 0x80AE, 0x1A29, 0x80AF, 0x0675, 0x80B1, 0x066F, 0x80B2, 0x0503,
- 0x80B4, 0x0673, 0x80B5, 0x1A2C, 0x80B8, 0x1A2B, 0x80BA, 0x066C,
- 0x80C2, 0x1BD1, 0x80C3, 0x07DE, 0x80C4, 0x07DF, 0x80C5, 0x1BD3,
- 0x80C7, 0x1BCD, 0x80C8, 0x1BD0, 0x80C9, 0x1BD9, 0x80CA, 0x1BD7,
- 0x80CC, 0x07E0, 0x80CD, 0x1BDD, 0x80CE, 0x07E3, 0x80CF, 0x1BDA,
- 0x80D0, 0x1BD2, 0x80D1, 0x1BCF, 0x80D4, 0x227D, 0x80D5, 0x1BD8,
- 0x80D6, 0x07DB, 0x80D7, 0x1BDB, 0x80D8, 0x1BCC, 0x80D9, 0x1BD5,
- 0x80DA, 0x07DD, 0x80DB, 0x07E2, 0x80DC, 0x1BD6, 0x80DD, 0x07E6,
- 0x80DE, 0x07E4, 0x80E0, 0x1BCE, 0x80E1, 0x07E1, 0x80E3, 0x1BD4,
- 0x80E4, 0x07E5, 0x80E5, 0x07DC, 0x80E6, 0x1BDC, 0x80ED, 0x098A,
- 0x80EF, 0x0993, 0x80F0, 0x0988, 0x80F1, 0x0986, 0x80F2, 0x1DB7,
- 0x80F3, 0x098E, 0x80F4, 0x098B, 0x80F5, 0x1DB9, 0x80F8, 0x098D,
- 0x80F9, 0x1DB8, 0x80FA, 0x1DB6, 0x80FB, 0x1DBB, 0x80FC, 0x0992,
- 0x80FD, 0x0990, 0x80FE, 0x227C, 0x8100, 0x1DBC, 0x8101, 0x1DBA,
- 0x8102, 0x0987, 0x8105, 0x0989, 0x8106, 0x098C, 0x8108, 0x098F,
- 0x810A, 0x0991, 0x8115, 0x200F, 0x8116, 0x0B6B, 0x8118, 0x2006,
- 0x8119, 0x2008, 0x811B, 0x2009, 0x811D, 0x2011, 0x811E, 0x200D,
- 0x811F, 0x200B, 0x8121, 0x200E, 0x8122, 0x2012, 0x8123, 0x0B6C,
- 0x8124, 0x0B70, 0x8125, 0x2007, 0x8127, 0x2010, 0x8129, 0x0B6E,
- 0x812B, 0x0B6D, 0x812C, 0x200C, 0x812D, 0x200A, 0x812F, 0x0B6A,
- 0x8130, 0x0B6F, 0x8139, 0x0D26, 0x813A, 0x2285, 0x813D, 0x2283,
- 0x813E, 0x0D28, 0x8143, 0x227E, 0x8144, 0x2527, 0x8146, 0x0D27,
- 0x8147, 0x2282, 0x814A, 0x227F, 0x814B, 0x0D23, 0x814C, 0x0D29,
- 0x814D, 0x2284, 0x814E, 0x0D25, 0x814F, 0x2281, 0x8150, 0x1075,
- 0x8151, 0x0D24, 0x8152, 0x2280, 0x8153, 0x0D2A, 0x8154, 0x0D22,
- 0x8155, 0x0D21, 0x815B, 0x251F, 0x815C, 0x251D, 0x815E, 0x2523,
- 0x8160, 0x251B, 0x8161, 0x2528, 0x8162, 0x2520, 0x8164, 0x251A,
- 0x8165, 0x0ED2, 0x8166, 0x0ED8, 0x8167, 0x2525, 0x8169, 0x251E,
- 0x816B, 0x0ED5, 0x816E, 0x0ED3, 0x816F, 0x2526, 0x8170, 0x0ED0,
- 0x8171, 0x0ECF, 0x8172, 0x2521, 0x8173, 0x0ED4, 0x8174, 0x0D2B,
- 0x8176, 0x2524, 0x8177, 0x251C, 0x8178, 0x0ED1, 0x8179, 0x0ED6,
- 0x817A, 0x0ED7, 0x817F, 0x107A, 0x8180, 0x1076, 0x8182, 0x107B,
- 0x8183, 0x27A0, 0x8186, 0x279F, 0x8187, 0x27A1, 0x8188, 0x1078,
- 0x8189, 0x279E, 0x818A, 0x1079, 0x818B, 0x27A4, 0x818C, 0x27A3,
- 0x818D, 0x27A2, 0x818F, 0x1077, 0x8195, 0x29D1, 0x8197, 0x29D4,
- 0x8198, 0x11EF, 0x8199, 0x29D3, 0x819A, 0x11EE, 0x819B, 0x11EA,
- 0x819C, 0x11EB, 0x819D, 0x11EC, 0x819E, 0x29D0, 0x819F, 0x29CF,
- 0x81A0, 0x11ED, 0x81A2, 0x29D2, 0x81A3, 0x29CE, 0x81A6, 0x2C30,
- 0x81A7, 0x2C3A, 0x81A8, 0x1331, 0x81A9, 0x1330, 0x81AB, 0x2C34,
- 0x81AC, 0x2C36, 0x81AE, 0x2C31, 0x81B0, 0x2C35, 0x81B1, 0x2C2F,
- 0x81B2, 0x2C38, 0x81B3, 0x132F, 0x81B4, 0x2C37, 0x81B5, 0x2C33,
- 0x81B7, 0x2C39, 0x81B9, 0x2C32, 0x81BA, 0x1450, 0x81BB, 0x2E06,
- 0x81BC, 0x2E0C, 0x81BD, 0x1454, 0x81BE, 0x1456, 0x81BF, 0x1453,
- 0x81C0, 0x1452, 0x81C2, 0x1451, 0x81C3, 0x144F, 0x81C4, 0x2E07,
- 0x81C5, 0x2E0A, 0x81C6, 0x144E, 0x81C7, 0x2E0B, 0x81C9, 0x1455,
- 0x81CA, 0x2E09, 0x81CC, 0x2E08, 0x81CD, 0x1518, 0x81CF, 0x1519,
- 0x81D0, 0x2F94, 0x81D1, 0x2F92, 0x81D2, 0x2F93, 0x81D5, 0x30ED,
- 0x81D7, 0x30EC, 0x81D8, 0x15B3, 0x81D9, 0x321C, 0x81DA, 0x1635,
- 0x81DB, 0x321B, 0x81DD, 0x32F5, 0x81DE, 0x33A5, 0x81DF, 0x16D4,
- 0x81E0, 0x34DD, 0x81E1, 0x34DE, 0x81E2, 0x1706, 0x81E3, 0x0405,
- 0x81E5, 0x0676, 0x81E6, 0x2286, 0x81E7, 0x107C, 0x81E8, 0x1457,
- 0x81E9, 0x2E0D, 0x81EA, 0x0406, 0x81EC, 0x0995, 0x81ED, 0x0994,
- 0x81EE, 0x2287, 0x81F2, 0x2C3B, 0x81F3, 0x0407, 0x81F4, 0x07E7,
- 0x81F7, 0x2288, 0x81F8, 0x2289, 0x81F9, 0x228A, 0x81FA, 0x107D,
- 0x81FB, 0x1332, 0x81FC, 0x0408, 0x81FE, 0x0677, 0x81FF, 0x1BDE,
- 0x8200, 0x0996, 0x8201, 0x1DBD, 0x8202, 0x0B71, 0x8204, 0x228B,
- 0x8205, 0x0ED9, 0x8207, 0x107E, 0x8208, 0x1333, 0x8209, 0x1458,
- 0x820A, 0x151A, 0x820B, 0x30EE, 0x820C, 0x0409, 0x820D, 0x0678,
- 0x8210, 0x0997, 0x8211, 0x2013, 0x8212, 0x0D2C, 0x8214, 0x107F,
- 0x8215, 0x27A5, 0x8216, 0x29D5, 0x821B, 0x040A, 0x821C, 0x0D2D,
- 0x821D, 0x2529, 0x821E, 0x1080, 0x821F, 0x040B, 0x8220, 0x1A2E,
- 0x8221, 0x1BDF, 0x8222, 0x07E8, 0x8225, 0x1DBF, 0x8228, 0x099A,
- 0x822A, 0x0998, 0x822B, 0x0999, 0x822C, 0x099B, 0x822F, 0x1DBE,
- 0x8232, 0x2018, 0x8233, 0x2015, 0x8234, 0x2017, 0x8235, 0x0B72,
- 0x8236, 0x0B74, 0x8237, 0x0B73, 0x8238, 0x2014, 0x8239, 0x0B75,
- 0x823A, 0x2016, 0x823C, 0x228C, 0x823D, 0x228D, 0x823F, 0x228E,
- 0x8240, 0x252C, 0x8242, 0x252D, 0x8244, 0x252B, 0x8245, 0x252E,
- 0x8247, 0x0EDA, 0x8249, 0x252A, 0x824B, 0x1081, 0x824E, 0x29DA,
- 0x824F, 0x29D6, 0x8250, 0x29D9, 0x8251, 0x29DB, 0x8252, 0x29D8,
- 0x8253, 0x29D7, 0x8255, 0x2C3C, 0x8256, 0x2C3D, 0x8257, 0x2C3E,
- 0x8258, 0x1334, 0x8259, 0x1335, 0x825A, 0x2E0F, 0x825B, 0x2E0E,
- 0x825C, 0x2E10, 0x825E, 0x2F96, 0x825F, 0x2F95, 0x8261, 0x30F0,
- 0x8263, 0x30F1, 0x8264, 0x30EF, 0x8266, 0x1636, 0x8268, 0x321D,
- 0x8269, 0x321E, 0x826B, 0x33A6, 0x826C, 0x342D, 0x826D, 0x3496,
- 0x826E, 0x040C, 0x826F, 0x0504, 0x8271, 0x1459, 0x8272, 0x040D,
- 0x8274, 0x2019, 0x8275, 0x228F, 0x8277, 0x172E, 0x8278, 0x1813,
- 0x827C, 0x1814, 0x827D, 0x1816, 0x827E, 0x040E, 0x827F, 0x1817,
- 0x8280, 0x1815, 0x8283, 0x18E5, 0x8284, 0x18E6, 0x8285, 0x18E0,
- 0x828A, 0x18E4, 0x828B, 0x0506, 0x828D, 0x0507, 0x828E, 0x18E1,
- 0x828F, 0x18DF, 0x8290, 0x18DE, 0x8291, 0x18E2, 0x8292, 0x0505,
- 0x8293, 0x18E3, 0x8294, 0x1BE0, 0x8298, 0x1A33, 0x8299, 0x067B,
- 0x829A, 0x1A32, 0x829B, 0x1A34, 0x829D, 0x067A, 0x829E, 0x1A39,
- 0x829F, 0x067E, 0x82A0, 0x1A2F, 0x82A1, 0x1A3D, 0x82A2, 0x1A43,
- 0x82A3, 0x0685, 0x82A4, 0x1A40, 0x82A5, 0x0682, 0x82A7, 0x1A36,
- 0x82A8, 0x1A3C, 0x82A9, 0x1A3E, 0x82AB, 0x1A31, 0x82AC, 0x0681,
- 0x82AD, 0x067C, 0x82AE, 0x1A37, 0x82AF, 0x0683, 0x82B0, 0x0686,
- 0x82B1, 0x0680, 0x82B3, 0x0679, 0x82B4, 0x1A3B, 0x82B5, 0x1A35,
- 0x82B6, 0x1A42, 0x82B7, 0x0688, 0x82B8, 0x0684, 0x82B9, 0x067F,
- 0x82BA, 0x1A3A, 0x82BB, 0x099C, 0x82BC, 0x1A38, 0x82BD, 0x067D,
- 0x82BE, 0x0687, 0x82C0, 0x1A30, 0x82C2, 0x1A3F, 0x82C3, 0x1A41,
- 0x82D1, 0x07F9, 0x82D2, 0x07F3, 0x82D3, 0x07FB, 0x82D4, 0x07F8,
- 0x82D5, 0x1BE7, 0x82D6, 0x1BEA, 0x82D7, 0x07F4, 0x82D9, 0x1BE1,
- 0x82DB, 0x07ED, 0x82DC, 0x07F7, 0x82DE, 0x07FA, 0x82DF, 0x07FC,
- 0x82E0, 0x1BF6, 0x82E1, 0x1BED, 0x82E3, 0x07EC, 0x82E4, 0x1BF5,
- 0x82E5, 0x07F0, 0x82E6, 0x07EE, 0x82E7, 0x07E9, 0x82E8, 0x1BE5,
- 0x82EA, 0x1BF4, 0x82EB, 0x1BE9, 0x82EC, 0x1BEC, 0x82ED, 0x1BF9,
- 0x82EF, 0x07FD, 0x82F0, 0x1BF3, 0x82F1, 0x07F5, 0x82F2, 0x1BEE,
- 0x82F3, 0x1BF8, 0x82F4, 0x1BEB, 0x82F5, 0x1BEF, 0x82F6, 0x1BF2,
- 0x82F9, 0x1BE3, 0x82FA, 0x1BF7, 0x82FB, 0x1BF1, 0x82FE, 0x1BE2,
- 0x8300, 0x1BE6, 0x8301, 0x07F6, 0x8302, 0x07F1, 0x8303, 0x07EA,
- 0x8304, 0x07EF, 0x8305, 0x07EB, 0x8306, 0x07FE, 0x8307, 0x1BE4,
- 0x8308, 0x1DD0, 0x8309, 0x07F2, 0x830C, 0x1BF0, 0x830D, 0x1A7D,
- 0x8316, 0x1DD3, 0x8317, 0x09AA, 0x8319, 0x1DC3, 0x831B, 0x1DCE,
- 0x831C, 0x1DCA, 0x831E, 0x1DDD, 0x8320, 0x1DD5, 0x8322, 0x1DCB,
- 0x8324, 0x1DD4, 0x8325, 0x1DC5, 0x8326, 0x1DC9, 0x8327, 0x1DE0,
- 0x8328, 0x09AD, 0x8329, 0x1DD8, 0x832A, 0x1DCF, 0x832B, 0x099D,
- 0x832C, 0x1DDE, 0x832D, 0x1DC1, 0x832F, 0x1DD7, 0x8331, 0x09AC,
- 0x8332, 0x09A7, 0x8333, 0x1DC0, 0x8334, 0x09A5, 0x8335, 0x09A4,
- 0x8336, 0x09A9, 0x8337, 0x1DD6, 0x8338, 0x09A1, 0x8339, 0x09A8,
- 0x833A, 0x1BE8, 0x833B, 0x2290, 0x833C, 0x1DD1, 0x833F, 0x1DC7,
- 0x8340, 0x09AB, 0x8341, 0x1DC8, 0x8342, 0x1DCC, 0x8343, 0x09AE,
- 0x8344, 0x1DC2, 0x8345, 0x1DDA, 0x8347, 0x1DD9, 0x8348, 0x1DE1,
- 0x8349, 0x09A3, 0x834A, 0x09A0, 0x834B, 0x1DDF, 0x834C, 0x1DDB,
- 0x834D, 0x1DD2, 0x834E, 0x1DCD, 0x834F, 0x09A6, 0x8350, 0x09A2,
- 0x8351, 0x1DC4, 0x8352, 0x099E, 0x8353, 0x1DDC, 0x8354, 0x099F,
- 0x8356, 0x1DC6, 0x8373, 0x201F, 0x8374, 0x2021, 0x8375, 0x2026,
- 0x8376, 0x203A, 0x8377, 0x0B83, 0x8378, 0x0B79, 0x837A, 0x201E,
- 0x837B, 0x0B84, 0x837C, 0x0B85, 0x837D, 0x2029, 0x837E, 0x2030,
- 0x837F, 0x2036, 0x8381, 0x2023, 0x8383, 0x202A, 0x8386, 0x0B86,
- 0x8387, 0x2038, 0x8388, 0x2033, 0x8389, 0x0B81, 0x838A, 0x0B7F,
- 0x838B, 0x202F, 0x838C, 0x202B, 0x838D, 0x201D, 0x838E, 0x0B76,
- 0x838F, 0x2022, 0x8390, 0x201A, 0x8392, 0x0B7E, 0x8393, 0x0B80,
- 0x8394, 0x2027, 0x8395, 0x2024, 0x8396, 0x0B7B, 0x8397, 0x2034,
- 0x8398, 0x0B78, 0x8399, 0x2025, 0x839A, 0x22B9, 0x839B, 0x202D,
- 0x839D, 0x202C, 0x839E, 0x0B77, 0x83A0, 0x0B82, 0x83A2, 0x0B7A,
- 0x83A3, 0x201B, 0x83A4, 0x2020, 0x83A5, 0x2031, 0x83A6, 0x2037,
- 0x83A7, 0x0B87, 0x83A8, 0x201C, 0x83A9, 0x2028, 0x83AA, 0x202E,
- 0x83AB, 0x0B7D, 0x83AE, 0x2039, 0x83AF, 0x2032, 0x83B0, 0x2035,
- 0x83BD, 0x0B7C, 0x83BF, 0x22A0, 0x83C0, 0x2294, 0x83C1, 0x0D35,
- 0x83C2, 0x22B1, 0x83C3, 0x22BA, 0x83C4, 0x22BD, 0x83C5, 0x0D33,
- 0x83C6, 0x229C, 0x83C7, 0x22B5, 0x83C8, 0x229D, 0x83C9, 0x22AB,
- 0x83CA, 0x0D40, 0x83CB, 0x22A7, 0x83CC, 0x0D3D, 0x83CE, 0x22A8,
- 0x83CF, 0x2291, 0x83D1, 0x22B6, 0x83D4, 0x0D46, 0x83D5, 0x22B3,
- 0x83D6, 0x22A9, 0x83D7, 0x22BF, 0x83D8, 0x22A4, 0x83D9, 0x254E,
- 0x83DB, 0x22C2, 0x83DC, 0x0D44, 0x83DD, 0x22A2, 0x83DE, 0x22AE,
- 0x83DF, 0x0D47, 0x83E0, 0x0D32, 0x83E1, 0x22A6, 0x83E2, 0x22C0,
- 0x83E3, 0x229F, 0x83E4, 0x2298, 0x83E5, 0x22A3, 0x83E7, 0x2297,
- 0x83E8, 0x2295, 0x83E9, 0x0D2E, 0x83EA, 0x22B7, 0x83EB, 0x229E,
- 0x83EC, 0x22BB, 0x83EE, 0x22BC, 0x83EF, 0x0D36, 0x83F0, 0x0D3B,
- 0x83F1, 0x0D37, 0x83F2, 0x0D3F, 0x83F3, 0x22B2, 0x83F4, 0x0D38,
- 0x83F5, 0x22AA, 0x83F6, 0x229A, 0x83F8, 0x0D30, 0x83F9, 0x2292,
- 0x83FA, 0x22B4, 0x83FB, 0x22BE, 0x83FC, 0x2299, 0x83FD, 0x0D3E,
- 0x83FE, 0x22C3, 0x83FF, 0x22A5, 0x8401, 0x22A1, 0x8403, 0x0D2F,
- 0x8404, 0x0D43, 0x8406, 0x22B0, 0x8407, 0x0D45, 0x8409, 0x22AC,
- 0x840A, 0x0D3A, 0x840B, 0x0D34, 0x840C, 0x0D3C, 0x840D, 0x0D31,
- 0x840E, 0x0D42, 0x840F, 0x22AD, 0x8410, 0x229B, 0x8411, 0x22AF,
- 0x8412, 0x2296, 0x8413, 0x22B8, 0x841B, 0x22C1, 0x8423, 0x2293,
- 0x8429, 0x254D, 0x842B, 0x2563, 0x842C, 0x0EAC, 0x842D, 0x2552,
- 0x842F, 0x2550, 0x8430, 0x253B, 0x8431, 0x0EDE, 0x8432, 0x254B,
- 0x8433, 0x255F, 0x8434, 0x2547, 0x8435, 0x0EE6, 0x8436, 0x255E,
- 0x8437, 0x2545, 0x8438, 0x0D41, 0x8439, 0x2555, 0x843A, 0x2546,
- 0x843B, 0x255C, 0x843C, 0x0EE5, 0x843D, 0x0EDD, 0x843F, 0x2530,
- 0x8440, 0x2538, 0x8442, 0x2551, 0x8443, 0x2549, 0x8444, 0x2562,
- 0x8445, 0x254C, 0x8446, 0x0EEB, 0x8447, 0x255D, 0x8449, 0x0EE2,
- 0x844B, 0x254F, 0x844C, 0x2557, 0x844D, 0x253C, 0x844E, 0x2556,
- 0x8450, 0x2567, 0x8451, 0x2537, 0x8452, 0x2558, 0x8454, 0x2565,
- 0x8456, 0x2531, 0x8457, 0x0D39, 0x8459, 0x253F, 0x845A, 0x253E,
- 0x845B, 0x0EE4, 0x845D, 0x2542, 0x845E, 0x2544, 0x845F, 0x2553,
- 0x8460, 0x2564, 0x8461, 0x0EE7, 0x8463, 0x0EE8, 0x8465, 0x2536,
- 0x8466, 0x0EE0, 0x8467, 0x253A, 0x8468, 0x2560, 0x8469, 0x0EE9,
- 0x846B, 0x0EE1, 0x846C, 0x0EE3, 0x846D, 0x0EEA, 0x846E, 0x2566,
- 0x846F, 0x2559, 0x8470, 0x2554, 0x8473, 0x2541, 0x8474, 0x2540,
- 0x8475, 0x0EDF, 0x8476, 0x2532, 0x8477, 0x0EDC, 0x8478, 0x254A,
- 0x8479, 0x2533, 0x847A, 0x2548, 0x847D, 0x253D, 0x847E, 0x2561,
- 0x8482, 0x0EDB, 0x8486, 0x2539, 0x848D, 0x2535, 0x848E, 0x255B,
- 0x848F, 0x2534, 0x8490, 0x108E, 0x8491, 0x27CD, 0x8494, 0x27BC,
- 0x8497, 0x27A6, 0x8498, 0x27C4, 0x8499, 0x1086, 0x849A, 0x27B5,
- 0x849B, 0x27BF, 0x849C, 0x1089, 0x849D, 0x27B8, 0x849E, 0x1087,
- 0x849F, 0x27A9, 0x84A0, 0x27C7, 0x84A1, 0x27A8, 0x84A2, 0x27BB,
- 0x84A4, 0x27A7, 0x84A7, 0x27B9, 0x84A8, 0x27C2, 0x84A9, 0x27C0,
- 0x84AA, 0x27B4, 0x84AB, 0x27AF, 0x84AC, 0x27AD, 0x84AE, 0x27AE,
- 0x84AF, 0x27C1, 0x84B0, 0x27CC, 0x84B1, 0x27B6, 0x84B2, 0x1088,
- 0x84B4, 0x27B1, 0x84B6, 0x27C5, 0x84B8, 0x108B, 0x84B9, 0x27B0,
- 0x84BA, 0x27AA, 0x84BB, 0x27BA, 0x84BC, 0x108F, 0x84BF, 0x1083,
- 0x84C0, 0x108C, 0x84C1, 0x27B2, 0x84C2, 0x27AC, 0x84C4, 0x1085,
- 0x84C5, 0x255A, 0x84C6, 0x1084, 0x84C7, 0x27BD, 0x84C9, 0x1082,
- 0x84CA, 0x1091, 0x84CB, 0x108A, 0x84CC, 0x27BE, 0x84CD, 0x27B3,
- 0x84CE, 0x27AB, 0x84CF, 0x27C6, 0x84D0, 0x27B7, 0x84D1, 0x1090,
- 0x84D2, 0x27CA, 0x84D3, 0x108D, 0x84D4, 0x27C9, 0x84D6, 0x27C3,
- 0x84D7, 0x27C8, 0x84DB, 0x27CB, 0x84E7, 0x2A03, 0x84E8, 0x2A04,
- 0x84E9, 0x29F7, 0x84EA, 0x29F6, 0x84EB, 0x29F2, 0x84EC, 0x11FB,
- 0x84EE, 0x11F3, 0x84EF, 0x2A06, 0x84F0, 0x2A05, 0x84F1, 0x252F,
- 0x84F2, 0x29EF, 0x84F3, 0x29F3, 0x84F4, 0x29ED, 0x84F6, 0x2A00,
- 0x84F7, 0x29F1, 0x84F9, 0x2A07, 0x84FA, 0x29EA, 0x84FB, 0x29E8,
- 0x84FC, 0x29F4, 0x84FD, 0x29FE, 0x84FE, 0x29F9, 0x84FF, 0x11FD,
- 0x8500, 0x29DF, 0x8502, 0x29FD, 0x8506, 0x11FE, 0x8507, 0x2543,
- 0x8508, 0x29EB, 0x8509, 0x29E2, 0x850A, 0x29E5, 0x850B, 0x2A0B,
- 0x850C, 0x29EC, 0x850D, 0x29E3, 0x850E, 0x29E1, 0x850F, 0x29DE,
- 0x8511, 0x11F7, 0x8512, 0x29F5, 0x8513, 0x11F6, 0x8514, 0x11FA,
- 0x8515, 0x29F0, 0x8516, 0x29F8, 0x8517, 0x11F0, 0x8518, 0x2A08,
- 0x8519, 0x2A0C, 0x851A, 0x11F2, 0x851C, 0x29E7, 0x851D, 0x29FB,
- 0x851E, 0x29FF, 0x851F, 0x29E4, 0x8520, 0x2A09, 0x8521, 0x11F9,
- 0x8523, 0x11F8, 0x8524, 0x29DC, 0x8525, 0x11FC, 0x8526, 0x2A02,
- 0x8527, 0x29E6, 0x8528, 0x29FA, 0x8529, 0x29E0, 0x852A, 0x29EE,
- 0x852B, 0x29E9, 0x852C, 0x11F4, 0x852D, 0x11F5, 0x852E, 0x29FC,
- 0x852F, 0x2A0D, 0x8530, 0x2A0A, 0x8531, 0x2A01, 0x853B, 0x29DD,
- 0x853D, 0x11F1, 0x853E, 0x2C4F, 0x8540, 0x2C46, 0x8541, 0x2C49,
- 0x8543, 0x133B, 0x8544, 0x2C4B, 0x8545, 0x2C40, 0x8546, 0x2C47,
- 0x8547, 0x2C4D, 0x8548, 0x1338, 0x8549, 0x133C, 0x854A, 0x1336,
- 0x854D, 0x2C42, 0x854E, 0x2C52, 0x8551, 0x2C4C, 0x8553, 0x2C43,
- 0x8554, 0x2C5B, 0x8555, 0x2C55, 0x8556, 0x2C3F, 0x8557, 0x2E23,
- 0x8558, 0x2C45, 0x8559, 0x1337, 0x855B, 0x2C50, 0x855D, 0x2C5A,
- 0x855E, 0x133F, 0x8560, 0x2C57, 0x8561, 0x2C44, 0x8562, 0x2C4A,
- 0x8563, 0x2C4E, 0x8564, 0x2C48, 0x8565, 0x2C5C, 0x8566, 0x2C59,
- 0x8567, 0x2C56, 0x8568, 0x1339, 0x8569, 0x133A, 0x856A, 0x133E,
- 0x856B, 0x2C41, 0x856C, 0x2C5D, 0x856D, 0x133D, 0x856E, 0x2C53,
- 0x8571, 0x2C51, 0x8575, 0x2C54, 0x8576, 0x2E30, 0x8577, 0x2E1D,
- 0x8578, 0x2E22, 0x8579, 0x2E2F, 0x857A, 0x2E21, 0x857B, 0x2E19,
- 0x857C, 0x2E1E, 0x857E, 0x145C, 0x8580, 0x2E12, 0x8581, 0x2E2A,
- 0x8582, 0x2E2C, 0x8583, 0x2E11, 0x8584, 0x145B, 0x8585, 0x2E2E,
- 0x8586, 0x2E26, 0x8587, 0x1462, 0x8588, 0x2E2D, 0x8589, 0x2E1F,
- 0x858A, 0x1464, 0x858B, 0x2E17, 0x858C, 0x2C58, 0x858D, 0x2E27,
- 0x858E, 0x2E24, 0x858F, 0x2E13, 0x8590, 0x2E32, 0x8591, 0x145E,
- 0x8594, 0x145F, 0x8595, 0x2E15, 0x8596, 0x2E25, 0x8598, 0x2E31,
- 0x8599, 0x2E28, 0x859A, 0x2E1B, 0x859B, 0x1461, 0x859C, 0x145D,
- 0x859D, 0x2E29, 0x859E, 0x2E1C, 0x859F, 0x2E33, 0x85A0, 0x2E16,
- 0x85A1, 0x2E20, 0x85A2, 0x2E2B, 0x85A3, 0x2E18, 0x85A4, 0x2E1A,
- 0x85A6, 0x1465, 0x85A7, 0x2E14, 0x85A8, 0x1463, 0x85A9, 0x151C,
- 0x85AA, 0x145A, 0x85AF, 0x1460, 0x85B0, 0x1520, 0x85B1, 0x2FA6,
- 0x85B3, 0x2F9C, 0x85B4, 0x2F97, 0x85B5, 0x2F9D, 0x85B6, 0x2FA7,
- 0x85B7, 0x2FAB, 0x85B8, 0x2FAA, 0x85B9, 0x1522, 0x85BA, 0x1521,
- 0x85BD, 0x2F9E, 0x85BE, 0x2FAC, 0x85BF, 0x2FA1, 0x85C0, 0x2F99,
- 0x85C2, 0x2F9B, 0x85C3, 0x2F9A, 0x85C4, 0x2FA0, 0x85C5, 0x2FA5,
- 0x85C6, 0x2F98, 0x85C7, 0x2F9F, 0x85C8, 0x2FA4, 0x85C9, 0x151F,
- 0x85CB, 0x2FA2, 0x85CD, 0x151D, 0x85CE, 0x2FA3, 0x85CF, 0x151B,
- 0x85D0, 0x151E, 0x85D1, 0x3101, 0x85D2, 0x2FA8, 0x85D5, 0x15B7,
- 0x85D7, 0x30F9, 0x85D8, 0x30FD, 0x85D9, 0x30F5, 0x85DA, 0x30F8,
- 0x85DC, 0x3100, 0x85DD, 0x15B5, 0x85DE, 0x3105, 0x85DF, 0x30FE,
- 0x85E1, 0x30F6, 0x85E2, 0x3106, 0x85E3, 0x30FF, 0x85E4, 0x15B8,
- 0x85E5, 0x15B9, 0x85E6, 0x3103, 0x85E8, 0x30F7, 0x85E9, 0x15B4,
- 0x85EA, 0x15B6, 0x85EB, 0x30F2, 0x85EC, 0x30FA, 0x85ED, 0x30F4,
- 0x85EF, 0x3104, 0x85F0, 0x3102, 0x85F1, 0x30F3, 0x85F2, 0x30FB,
- 0x85F6, 0x3225, 0x85F7, 0x15BA, 0x85F8, 0x30FC, 0x85F9, 0x1638,
- 0x85FA, 0x163A, 0x85FB, 0x1637, 0x85FD, 0x322A, 0x85FE, 0x3222,
- 0x85FF, 0x3220, 0x8600, 0x3224, 0x8601, 0x3221, 0x8604, 0x3226,
- 0x8605, 0x3228, 0x8606, 0x163B, 0x8607, 0x163D, 0x8609, 0x3227,
- 0x860A, 0x163E, 0x860B, 0x163C, 0x860C, 0x3229, 0x8611, 0x1639,
- 0x8617, 0x1685, 0x8618, 0x32F6, 0x8619, 0x32FC, 0x861A, 0x1687,
- 0x861B, 0x3223, 0x861C, 0x32FB, 0x861E, 0x3302, 0x861F, 0x32F9,
- 0x8620, 0x3300, 0x8621, 0x32FF, 0x8622, 0x321F, 0x8623, 0x32FA,
- 0x8624, 0x2FA9, 0x8625, 0x3303, 0x8626, 0x32F8, 0x8627, 0x32FD,
- 0x8629, 0x3301, 0x862A, 0x32F7, 0x862C, 0x33AA, 0x862D, 0x1686,
- 0x862E, 0x32FE, 0x8631, 0x3432, 0x8632, 0x33AB, 0x8633, 0x33A9,
- 0x8634, 0x33A7, 0x8635, 0x33A8, 0x8636, 0x33AC, 0x8638, 0x1707,
- 0x8639, 0x3430, 0x863A, 0x342E, 0x863B, 0x3433, 0x863C, 0x3431,
- 0x863E, 0x3434, 0x863F, 0x1708, 0x8640, 0x342F, 0x8643, 0x3497,
- 0x8646, 0x34DF, 0x8647, 0x34E0, 0x8648, 0x34E1, 0x864B, 0x353E,
- 0x864C, 0x3536, 0x864D, 0x1818, 0x864E, 0x0689, 0x8650, 0x07FF,
- 0x8652, 0x1DE3, 0x8653, 0x1DE2, 0x8654, 0x09AF, 0x8655, 0x0B88,
- 0x8656, 0x203C, 0x8659, 0x203B, 0x865B, 0x0D48, 0x865C, 0x0EED,
- 0x865E, 0x0EEC, 0x865F, 0x0EEE, 0x8661, 0x27CE, 0x8662, 0x2A0E,
- 0x8663, 0x2C5E, 0x8664, 0x2C60, 0x8665, 0x2C5F, 0x8667, 0x1466,
- 0x8668, 0x2E34, 0x8669, 0x2FAD, 0x866A, 0x351E, 0x866B, 0x040F,
- 0x866D, 0x1A46, 0x866E, 0x1A47, 0x866F, 0x1A45, 0x8670, 0x1A44,
- 0x8671, 0x068A, 0x8673, 0x1BFD, 0x8674, 0x1BFB, 0x8677, 0x1BFA,
- 0x8679, 0x0800, 0x867A, 0x0802, 0x867B, 0x0801, 0x867C, 0x1BFC,
- 0x8685, 0x1DEF, 0x8686, 0x1DEC, 0x8687, 0x1DEA, 0x868A, 0x09B0,
- 0x868B, 0x1DED, 0x868C, 0x09B5, 0x868D, 0x1DE7, 0x868E, 0x1DF6,
- 0x8690, 0x1DF8, 0x8691, 0x1DE8, 0x8693, 0x09B2, 0x8694, 0x1DF9,
- 0x8695, 0x1DF4, 0x8696, 0x1DE6, 0x8697, 0x1DEB, 0x8698, 0x1DF5,
- 0x8699, 0x1DF1, 0x869A, 0x1DEE, 0x869C, 0x09B7, 0x869D, 0x1DF7,
- 0x869E, 0x1DE9, 0x86A1, 0x1DF2, 0x86A2, 0x1DE4, 0x86A3, 0x09B6,
- 0x86A4, 0x09B3, 0x86A5, 0x1DF0, 0x86A7, 0x1DF3, 0x86A8, 0x1DE5,
- 0x86A9, 0x09B4, 0x86AA, 0x09B1, 0x86AF, 0x0B92, 0x86B0, 0x2043,
- 0x86B1, 0x0B91, 0x86B3, 0x2046, 0x86B4, 0x2049, 0x86B5, 0x0B8E,
- 0x86B6, 0x0B8C, 0x86B7, 0x203E, 0x86B8, 0x2047, 0x86B9, 0x2045,
- 0x86BA, 0x2042, 0x86BB, 0x204A, 0x86BC, 0x204B, 0x86BD, 0x204D,
- 0x86BE, 0x204E, 0x86BF, 0x203D, 0x86C0, 0x0B8B, 0x86C1, 0x2040,
- 0x86C2, 0x203F, 0x86C3, 0x204C, 0x86C4, 0x0B8D, 0x86C5, 0x2041,
- 0x86C6, 0x0B8F, 0x86C7, 0x0B8A, 0x86C8, 0x2044, 0x86C9, 0x0B93,
- 0x86CB, 0x0B90, 0x86CC, 0x2048, 0x86D0, 0x0D4F, 0x86D1, 0x22D2,
- 0x86D3, 0x22C7, 0x86D4, 0x0D4C, 0x86D6, 0x256D, 0x86D7, 0x22D0,
- 0x86D8, 0x22C4, 0x86D9, 0x0D4A, 0x86DA, 0x22C9, 0x86DB, 0x0D4D,
- 0x86DC, 0x22CD, 0x86DD, 0x22CB, 0x86DE, 0x0D50, 0x86DF, 0x0D49,
- 0x86E2, 0x22C5, 0x86E3, 0x22C8, 0x86E4, 0x0D4E, 0x86E6, 0x22C6,
- 0x86E8, 0x22D1, 0x86E9, 0x22CF, 0x86EA, 0x22CA, 0x86EB, 0x22CC,
- 0x86EC, 0x22CE, 0x86ED, 0x0D4B, 0x86F5, 0x256E, 0x86F6, 0x2574,
- 0x86F7, 0x256A, 0x86F8, 0x2570, 0x86F9, 0x0EEF, 0x86FA, 0x256C,
- 0x86FB, 0x0EF5, 0x86FE, 0x0EF4, 0x8700, 0x0EF3, 0x8701, 0x2573,
- 0x8702, 0x0EF6, 0x8703, 0x0EF7, 0x8704, 0x2569, 0x8705, 0x2576,
- 0x8706, 0x0EF8, 0x8707, 0x0EF2, 0x8708, 0x0EF1, 0x8709, 0x2572,
- 0x870A, 0x0EF9, 0x870B, 0x2568, 0x870C, 0x256B, 0x870D, 0x2575,
- 0x870E, 0x2571, 0x8711, 0x27EE, 0x8712, 0x27E3, 0x8713, 0x0EF0,
- 0x8718, 0x1098, 0x8719, 0x27D7, 0x871A, 0x27EC, 0x871B, 0x27D8,
- 0x871C, 0x1093, 0x871E, 0x27D5, 0x8720, 0x27DE, 0x8721, 0x27D6,
- 0x8722, 0x1095, 0x8723, 0x27D0, 0x8724, 0x27EB, 0x8725, 0x1096,
- 0x8726, 0x27E8, 0x8727, 0x27E9, 0x8728, 0x27D1, 0x8729, 0x109B,
- 0x872A, 0x27E0, 0x872C, 0x27DA, 0x872D, 0x27E1, 0x872E, 0x27D4,
- 0x8730, 0x27ED, 0x8731, 0x27E5, 0x8732, 0x27DF, 0x8733, 0x27CF,
- 0x8734, 0x1097, 0x8735, 0x27E6, 0x8737, 0x109A, 0x8738, 0x27EA,
- 0x873A, 0x27E4, 0x873B, 0x1094, 0x873C, 0x27E2, 0x873E, 0x27DC,
- 0x873F, 0x1092, 0x8740, 0x27D3, 0x8741, 0x27DB, 0x8742, 0x27E7,
- 0x8743, 0x27D9, 0x8746, 0x27DD, 0x874C, 0x1208, 0x874D, 0x256F,
- 0x874E, 0x2A20, 0x874F, 0x2A29, 0x8750, 0x2A1F, 0x8751, 0x2A1B,
- 0x8752, 0x2A18, 0x8753, 0x1209, 0x8754, 0x2A16, 0x8755, 0x1099,
- 0x8756, 0x2A0F, 0x8757, 0x1207, 0x8758, 0x2A15, 0x8759, 0x1206,
- 0x875A, 0x2A1A, 0x875B, 0x2A17, 0x875C, 0x2A27, 0x875D, 0x2A22,
- 0x875E, 0x2A1C, 0x875F, 0x2A21, 0x8760, 0x1202, 0x8761, 0x2A19,
- 0x8762, 0x2A2C, 0x8763, 0x2A10, 0x8764, 0x2A11, 0x8765, 0x2A28,
- 0x8766, 0x1203, 0x8767, 0x2A2D, 0x8768, 0x1205, 0x8769, 0x2A2E,
- 0x876A, 0x2A1E, 0x876B, 0x27D2, 0x876C, 0x2A24, 0x876D, 0x2A1D,
- 0x876E, 0x2A26, 0x876F, 0x2A23, 0x8773, 0x2A14, 0x8774, 0x1200,
- 0x8775, 0x2A2B, 0x8776, 0x1201, 0x8777, 0x2A12, 0x8778, 0x1204,
- 0x8779, 0x2C6B, 0x877A, 0x2A25, 0x877B, 0x2A2A, 0x8781, 0x2C68,
- 0x8782, 0x11FF, 0x8783, 0x1340, 0x8784, 0x2C72, 0x8785, 0x2C6E,
- 0x8787, 0x2C6C, 0x8788, 0x2C67, 0x8789, 0x2C76, 0x878D, 0x1344,
- 0x878F, 0x2C63, 0x8790, 0x2C6F, 0x8791, 0x2C70, 0x8792, 0x2C66,
- 0x8793, 0x2C65, 0x8794, 0x2C73, 0x8796, 0x2C69, 0x8797, 0x2C64,
- 0x8798, 0x2C6A, 0x879A, 0x2C75, 0x879B, 0x2C62, 0x879C, 0x2C74,
- 0x879D, 0x2C71, 0x879E, 0x1342, 0x879F, 0x1341, 0x87A2, 0x1343,
- 0x87A3, 0x2C6D, 0x87A4, 0x2C61, 0x87AA, 0x2E36, 0x87AB, 0x146C,
- 0x87AC, 0x2E3A, 0x87AD, 0x2E37, 0x87AE, 0x2E3E, 0x87AF, 0x2E44,
- 0x87B0, 0x2E39, 0x87B2, 0x2E4D, 0x87B3, 0x1469, 0x87B4, 0x2E47,
- 0x87B5, 0x2E3C, 0x87B6, 0x2E48, 0x87B7, 0x2E43, 0x87B8, 0x2E4A,
- 0x87B9, 0x2E3B, 0x87BA, 0x146E, 0x87BB, 0x146D, 0x87BC, 0x2E3D,
- 0x87BD, 0x2E4B, 0x87BE, 0x2E35, 0x87BF, 0x2E49, 0x87C0, 0x1467,
- 0x87C2, 0x2E41, 0x87C3, 0x2E40, 0x87C4, 0x2E45, 0x87C5, 0x2E38,
- 0x87C6, 0x146B, 0x87C8, 0x146F, 0x87C9, 0x2E3F, 0x87CA, 0x2E46,
- 0x87CB, 0x1470, 0x87CC, 0x2E42, 0x87D1, 0x1468, 0x87D2, 0x146A,
- 0x87D3, 0x2FBA, 0x87D4, 0x2FB8, 0x87D7, 0x2FBE, 0x87D8, 0x2FBC,
- 0x87D9, 0x2FBF, 0x87DB, 0x2FB1, 0x87DC, 0x2FB9, 0x87DD, 0x2FC3,
- 0x87DE, 0x2E4C, 0x87DF, 0x2FB5, 0x87E0, 0x1526, 0x87E1, 0x2A13,
- 0x87E2, 0x2FB0, 0x87E3, 0x2FBD, 0x87E4, 0x2FB7, 0x87E5, 0x2FB4,
- 0x87E6, 0x2FAF, 0x87E7, 0x2FAE, 0x87E8, 0x2FC2, 0x87EA, 0x2FB3,
- 0x87EB, 0x2FB2, 0x87EC, 0x1524, 0x87ED, 0x2FBB, 0x87EF, 0x1523,
- 0x87F2, 0x1525, 0x87F3, 0x2FB6, 0x87F4, 0x2FC1, 0x87F6, 0x310A,
- 0x87F7, 0x310B, 0x87F9, 0x15BE, 0x87FA, 0x3108, 0x87FB, 0x15BB,
- 0x87FC, 0x3110, 0x87FE, 0x15BF, 0x87FF, 0x3112, 0x8800, 0x3107,
- 0x8801, 0x2FC0, 0x8802, 0x3114, 0x8803, 0x3109, 0x8805, 0x15BC,
- 0x8806, 0x310F, 0x8808, 0x3111, 0x8809, 0x310C, 0x880A, 0x3113,
- 0x880B, 0x310E, 0x880C, 0x310D, 0x880D, 0x15BD, 0x8810, 0x322C,
- 0x8811, 0x322D, 0x8813, 0x322F, 0x8814, 0x163F, 0x8815, 0x1640,
- 0x8816, 0x3230, 0x8817, 0x322E, 0x8819, 0x322B, 0x881B, 0x3306,
- 0x881C, 0x3309, 0x881D, 0x3305, 0x881F, 0x168B, 0x8820, 0x3307,
- 0x8821, 0x168A, 0x8822, 0x1689, 0x8823, 0x1688, 0x8824, 0x3308,
- 0x8825, 0x33B1, 0x8826, 0x33AF, 0x8828, 0x33AE, 0x8829, 0x3304,
- 0x882A, 0x33B0, 0x882B, 0x330A, 0x882C, 0x33AD, 0x882E, 0x3437,
- 0x882F, 0x3415, 0x8830, 0x3435, 0x8831, 0x1709, 0x8832, 0x3436,
- 0x8833, 0x3438, 0x8835, 0x349A, 0x8836, 0x1728, 0x8837, 0x3499,
- 0x8838, 0x3498, 0x8839, 0x1729, 0x883B, 0x1747, 0x883C, 0x3508,
- 0x883D, 0x3520, 0x883E, 0x351F, 0x883F, 0x3521, 0x8840, 0x0410,
- 0x8841, 0x1BFE, 0x8843, 0x1DFA, 0x8844, 0x1DFB, 0x8848, 0x22D3,
- 0x884A, 0x330B, 0x884B, 0x349B, 0x884C, 0x0411, 0x884D, 0x0803,
- 0x884E, 0x1BFF, 0x8852, 0x204F, 0x8853, 0x0B94, 0x8855, 0x22D5,
- 0x8856, 0x22D4, 0x8857, 0x0D51, 0x8859, 0x0EFA, 0x885A, 0x2A2F,
- 0x885B, 0x120A, 0x885D, 0x120B, 0x8861, 0x1345, 0x8862, 0x172A,
- 0x8863, 0x0412, 0x8867, 0x1C00, 0x8868, 0x068C, 0x8869, 0x1C02,
- 0x886A, 0x1C01, 0x886B, 0x0804, 0x886D, 0x1DFC, 0x886F, 0x1E03,
- 0x8870, 0x09B8, 0x8871, 0x1E01, 0x8872, 0x1DFF, 0x8874, 0x1E06,
- 0x8875, 0x1DFD, 0x8876, 0x1DFE, 0x8877, 0x09B9, 0x8879, 0x09BD,
- 0x887C, 0x1E07, 0x887D, 0x09BC, 0x887E, 0x1E05, 0x887F, 0x1E02,
- 0x8880, 0x1E00, 0x8881, 0x09BA, 0x8882, 0x09BB, 0x8883, 0x1E04,
- 0x8888, 0x0B96, 0x8889, 0x2050, 0x888B, 0x0B9B, 0x888C, 0x2060,
- 0x888D, 0x0B9A, 0x888E, 0x2062, 0x8891, 0x2056, 0x8892, 0x0B98,
- 0x8893, 0x2061, 0x8895, 0x2051, 0x8896, 0x0B99, 0x8897, 0x205D,
- 0x8898, 0x2059, 0x8899, 0x205B, 0x889A, 0x2055, 0x889B, 0x205C,
- 0x889E, 0x0B95, 0x889F, 0x2058, 0x88A1, 0x2057, 0x88A2, 0x2053,
- 0x88A4, 0x205E, 0x88A7, 0x205A, 0x88A8, 0x2052, 0x88AA, 0x2054,
- 0x88AB, 0x0B97, 0x88AC, 0x205F, 0x88B1, 0x0D54, 0x88B2, 0x22E0,
- 0x88B6, 0x22DC, 0x88B7, 0x22DE, 0x88B8, 0x22D9, 0x88B9, 0x22D8,
- 0x88BA, 0x22D6, 0x88BC, 0x22DD, 0x88BD, 0x22DF, 0x88BE, 0x22DB,
- 0x88C0, 0x22DA, 0x88C1, 0x0D52, 0x88C2, 0x0D53, 0x88C9, 0x22E2,
- 0x88CA, 0x0F02, 0x88CB, 0x2578, 0x88CC, 0x257E, 0x88CD, 0x2579,
- 0x88CE, 0x257A, 0x88CF, 0x36EA, 0x88D0, 0x257F, 0x88D2, 0x0F04,
- 0x88D4, 0x0EFC, 0x88D5, 0x0F03, 0x88D6, 0x2577, 0x88D7, 0x22D7,
- 0x88D8, 0x0EFF, 0x88D9, 0x0EFD, 0x88DA, 0x257D, 0x88DB, 0x257C,
- 0x88DC, 0x0EFE, 0x88DD, 0x0F00, 0x88DE, 0x257B, 0x88DF, 0x0EFB,
- 0x88E1, 0x0F01, 0x88E7, 0x27F0, 0x88E8, 0x10A2, 0x88EB, 0x27FB,
- 0x88EC, 0x27FA, 0x88EE, 0x27F5, 0x88EF, 0x10A4, 0x88F0, 0x27F9,
- 0x88F1, 0x27F1, 0x88F2, 0x27F2, 0x88F3, 0x109C, 0x88F4, 0x109E,
- 0x88F6, 0x27F7, 0x88F7, 0x27EF, 0x88F8, 0x10A0, 0x88F9, 0x109F,
- 0x88FA, 0x27F3, 0x88FB, 0x27F8, 0x88FC, 0x27F6, 0x88FD, 0x10A1,
- 0x88FE, 0x27F4, 0x8901, 0x22E1, 0x8902, 0x109D, 0x8905, 0x2A30,
- 0x8906, 0x2A37, 0x8907, 0x120D, 0x8909, 0x2A3B, 0x890A, 0x1211,
- 0x890B, 0x2A33, 0x890C, 0x2A31, 0x890E, 0x2A3A, 0x8910, 0x120C,
- 0x8911, 0x2A39, 0x8912, 0x120E, 0x8913, 0x120F, 0x8914, 0x2A32,
- 0x8915, 0x1210, 0x8916, 0x2A38, 0x8917, 0x2A34, 0x8918, 0x2A35,
- 0x8919, 0x2A36, 0x891A, 0x10A3, 0x891E, 0x2C77, 0x891F, 0x2C83,
- 0x8921, 0x134A, 0x8922, 0x2C7E, 0x8923, 0x2C80, 0x8925, 0x1348,
- 0x8926, 0x2C78, 0x8927, 0x2C7C, 0x8929, 0x2C7F, 0x892A, 0x1346,
- 0x892B, 0x1349, 0x892C, 0x2C82, 0x892D, 0x2C7A, 0x892E, 0x2C7B,
- 0x892F, 0x2C81, 0x8930, 0x2C79, 0x8931, 0x2C7D, 0x8932, 0x1347,
- 0x8933, 0x2E4F, 0x8935, 0x2E4E, 0x8936, 0x1472, 0x8937, 0x2E54,
- 0x8938, 0x1474, 0x893B, 0x1471, 0x893C, 0x2E50, 0x893D, 0x1475,
- 0x893E, 0x2E51, 0x8941, 0x2E52, 0x8942, 0x2E55, 0x8944, 0x1473,
- 0x8946, 0x2FC8, 0x8949, 0x2FCB, 0x894B, 0x2FC5, 0x894C, 0x2FC7,
- 0x894F, 0x2FC6, 0x8950, 0x2FC9, 0x8951, 0x2FCA, 0x8952, 0x2E53,
- 0x8953, 0x2FC4, 0x8956, 0x15C2, 0x8957, 0x3118, 0x8958, 0x311B,
- 0x8959, 0x311D, 0x895A, 0x3116, 0x895B, 0x3117, 0x895C, 0x311A,
- 0x895D, 0x311C, 0x895E, 0x15C3, 0x895F, 0x15C1, 0x8960, 0x15C0,
- 0x8961, 0x3119, 0x8962, 0x3115, 0x8963, 0x3231, 0x8964, 0x1641,
- 0x8966, 0x3232, 0x8969, 0x330D, 0x896A, 0x168C, 0x896B, 0x330F,
- 0x896C, 0x168D, 0x896D, 0x330C, 0x896E, 0x330E, 0x896F, 0x16D6,
- 0x8971, 0x33B2, 0x8972, 0x16D5, 0x8973, 0x343B, 0x8974, 0x343A,
- 0x8976, 0x3439, 0x8979, 0x34E2, 0x897A, 0x34E3, 0x897B, 0x34E5,
- 0x897C, 0x34E4, 0x897E, 0x1819, 0x897F, 0x0413, 0x8981, 0x0805,
- 0x8982, 0x2063, 0x8983, 0x0D55, 0x8985, 0x2580, 0x8986, 0x1527,
- 0x8988, 0x311E, 0x898B, 0x0508, 0x898F, 0x0B9D, 0x8993, 0x0B9C,
- 0x8995, 0x22E3, 0x8996, 0x0D56, 0x8997, 0x22E5, 0x8998, 0x22E4,
- 0x899B, 0x2581, 0x899C, 0x0F05, 0x899D, 0x27FC, 0x899E, 0x27FF,
- 0x899F, 0x27FE, 0x89A1, 0x27FD, 0x89A2, 0x2A3C, 0x89A3, 0x2A3E,
- 0x89A4, 0x2A3D, 0x89A6, 0x134C, 0x89AA, 0x134B, 0x89AC, 0x1476,
- 0x89AD, 0x2E56, 0x89AE, 0x2E58, 0x89AF, 0x2E57, 0x89B2, 0x1528,
- 0x89B6, 0x3120, 0x89B7, 0x311F, 0x89B9, 0x3233, 0x89BA, 0x1642,
- 0x89BD, 0x168E, 0x89BE, 0x33B4, 0x89BF, 0x33B3, 0x89C0, 0x1748,
- 0x89D2, 0x0509, 0x89D3, 0x1C03, 0x89D4, 0x0806, 0x89D5, 0x2066,
- 0x89D6, 0x2064, 0x89D9, 0x2065, 0x89DA, 0x22E7, 0x89DB, 0x22E8,
- 0x89DC, 0x2588, 0x89DD, 0x22E6, 0x89DF, 0x2582, 0x89E0, 0x2586,
- 0x89E1, 0x2585, 0x89E2, 0x2587, 0x89E3, 0x0F06, 0x89E4, 0x2584,
- 0x89E5, 0x2583, 0x89E6, 0x2589, 0x89E8, 0x2802, 0x89E9, 0x2800,
- 0x89EB, 0x2801, 0x89EC, 0x2A41, 0x89ED, 0x2A3F, 0x89F0, 0x2A40,
- 0x89F1, 0x2C84, 0x89F2, 0x2E59, 0x89F3, 0x2E5A, 0x89F4, 0x1529,
- 0x89F6, 0x3121, 0x89F7, 0x3234, 0x89F8, 0x1643, 0x89FA, 0x3310,
- 0x89FB, 0x33B5, 0x89FC, 0x16D7, 0x89FE, 0x343C, 0x89FF, 0x34E6,
- 0x8A00, 0x050A, 0x8A02, 0x0808, 0x8A03, 0x0809, 0x8A04, 0x1C04,
- 0x8A07, 0x1C05, 0x8A08, 0x0807, 0x8A0A, 0x09C3, 0x8A0C, 0x09C1,
- 0x8A0E, 0x09C0, 0x8A0F, 0x09C7, 0x8A10, 0x09BF, 0x8A11, 0x09C8,
- 0x8A12, 0x1E08, 0x8A13, 0x09C5, 0x8A15, 0x09C2, 0x8A16, 0x09C6,
- 0x8A17, 0x09C4, 0x8A18, 0x09BE, 0x8A1B, 0x0BA5, 0x8A1D, 0x0B9F,
- 0x8A1E, 0x206A, 0x8A1F, 0x0BA4, 0x8A22, 0x0BA6, 0x8A23, 0x0BA0,
- 0x8A25, 0x0BA1, 0x8A27, 0x2068, 0x8A2A, 0x0B9E, 0x8A2C, 0x2069,
- 0x8A2D, 0x0BA3, 0x8A30, 0x2067, 0x8A31, 0x0BA2, 0x8A34, 0x0D61,
- 0x8A36, 0x0D63, 0x8A39, 0x22EB, 0x8A3A, 0x0D62, 0x8A3B, 0x0D57,
- 0x8A3C, 0x0D5B, 0x8A3E, 0x0F19, 0x8A3F, 0x258E, 0x8A40, 0x22ED,
- 0x8A41, 0x0D5C, 0x8A44, 0x22F0, 0x8A45, 0x22F1, 0x8A46, 0x0D60,
- 0x8A48, 0x22F3, 0x8A4A, 0x22F5, 0x8A4C, 0x22F6, 0x8A4D, 0x22EA,
- 0x8A4E, 0x22E9, 0x8A4F, 0x22F7, 0x8A50, 0x0D5F, 0x8A51, 0x22F4,
- 0x8A52, 0x22F2, 0x8A54, 0x0D5D, 0x8A55, 0x0D59, 0x8A56, 0x0D64,
- 0x8A57, 0x22EE, 0x8A58, 0x22EF, 0x8A59, 0x22EC, 0x8A5B, 0x0D5E,
- 0x8A5E, 0x0D5A, 0x8A60, 0x0D58, 0x8A61, 0x258D, 0x8A62, 0x0F14,
- 0x8A63, 0x0F0F, 0x8A66, 0x0F0A, 0x8A68, 0x0F1A, 0x8A69, 0x0F0B,
- 0x8A6B, 0x0F07, 0x8A6C, 0x0F16, 0x8A6D, 0x0F13, 0x8A6E, 0x0F15,
- 0x8A70, 0x0F0C, 0x8A71, 0x0F11, 0x8A72, 0x0F08, 0x8A73, 0x0F09,
- 0x8A74, 0x2595, 0x8A75, 0x2592, 0x8A76, 0x258A, 0x8A77, 0x258F,
- 0x8A79, 0x0F17, 0x8A7A, 0x2596, 0x8A7B, 0x0F18, 0x8A7C, 0x0F0E,
- 0x8A7F, 0x258C, 0x8A81, 0x2594, 0x8A82, 0x2590, 0x8A83, 0x2593,
- 0x8A84, 0x2591, 0x8A85, 0x0F12, 0x8A86, 0x258B, 0x8A87, 0x0F0D,
- 0x8A8B, 0x2805, 0x8A8C, 0x10A6, 0x8A8D, 0x10A9, 0x8A8F, 0x2807,
- 0x8A91, 0x10B1, 0x8A92, 0x2806, 0x8A93, 0x10AB, 0x8A95, 0x1216,
- 0x8A96, 0x2808, 0x8A98, 0x10B0, 0x8A99, 0x2804, 0x8A9A, 0x10B2,
- 0x8A9E, 0x10A7, 0x8AA0, 0x0F10, 0x8AA1, 0x10AA, 0x8AA3, 0x10A8,
- 0x8AA4, 0x10AC, 0x8AA5, 0x10AE, 0x8AA6, 0x10A5, 0x8AA7, 0x10B3,
- 0x8AA8, 0x10AF, 0x8AAA, 0x10AD, 0x8AAB, 0x2803, 0x8AB0, 0x121D,
- 0x8AB2, 0x1219, 0x8AB6, 0x1220, 0x8AB8, 0x2A44, 0x8AB9, 0x1221,
- 0x8ABA, 0x2A50, 0x8ABB, 0x2A49, 0x8ABC, 0x1212, 0x8ABD, 0x2A51,
- 0x8ABE, 0x2A4B, 0x8ABF, 0x121C, 0x8AC0, 0x2A4C, 0x8AC2, 0x121B,
- 0x8AC3, 0x2A4F, 0x8AC4, 0x1215, 0x8AC5, 0x2A4D, 0x8AC6, 0x2A43,
- 0x8AC7, 0x1214, 0x8AC8, 0x2C8F, 0x8AC9, 0x121A, 0x8ACB, 0x1217,
- 0x8ACD, 0x121F, 0x8ACF, 0x2A42, 0x8AD1, 0x2A46, 0x8AD2, 0x1213,
- 0x8AD3, 0x2A45, 0x8AD4, 0x2A47, 0x8AD5, 0x2A48, 0x8AD6, 0x121E,
- 0x8AD7, 0x2A4A, 0x8AD8, 0x2A4E, 0x8AD9, 0x2A52, 0x8ADB, 0x1222,
- 0x8ADC, 0x1352, 0x8ADD, 0x2C8A, 0x8ADE, 0x2C90, 0x8ADF, 0x2C8D,
- 0x8AE0, 0x2C85, 0x8AE1, 0x2C91, 0x8AE2, 0x2C86, 0x8AE4, 0x2C8C,
- 0x8AE6, 0x134D, 0x8AE7, 0x1353, 0x8AE8, 0x2C92, 0x8AEB, 0x134F,
- 0x8AED, 0x1359, 0x8AEE, 0x1354, 0x8AEF, 0x2C94, 0x8AF0, 0x2C8E,
- 0x8AF1, 0x1350, 0x8AF2, 0x2C87, 0x8AF3, 0x135A, 0x8AF4, 0x2C88,
- 0x8AF5, 0x2C89, 0x8AF6, 0x135B, 0x8AF7, 0x1358, 0x8AF8, 0x1218,
- 0x8AFA, 0x134E, 0x8AFB, 0x2C95, 0x8AFC, 0x135C, 0x8AFE, 0x1355,
- 0x8AFF, 0x2C93, 0x8B00, 0x1351, 0x8B01, 0x1356, 0x8B02, 0x1357,
- 0x8B04, 0x147E, 0x8B05, 0x2E5F, 0x8B06, 0x2E68, 0x8B07, 0x2E65,
- 0x8B08, 0x2E67, 0x8B0A, 0x147B, 0x8B0B, 0x2E60, 0x8B0D, 0x2E66,
- 0x8B0E, 0x1477, 0x8B0F, 0x2E62, 0x8B10, 0x147F, 0x8B11, 0x2E5E,
- 0x8B12, 0x2E63, 0x8B13, 0x2E6A, 0x8B14, 0x2C8B, 0x8B15, 0x2E64,
- 0x8B16, 0x2E5D, 0x8B17, 0x1478, 0x8B18, 0x2E5C, 0x8B19, 0x1479,
- 0x8B1A, 0x2E6B, 0x8B1B, 0x147A, 0x8B1C, 0x2E69, 0x8B1D, 0x147D,
- 0x8B1E, 0x2E5B, 0x8B20, 0x147C, 0x8B22, 0x2E61, 0x8B23, 0x2FCE,
- 0x8B24, 0x2FDC, 0x8B25, 0x2FD7, 0x8B26, 0x2FD9, 0x8B27, 0x2FCD,
- 0x8B28, 0x152A, 0x8B2A, 0x2FCC, 0x8B2B, 0x152D, 0x8B2C, 0x152C,
- 0x8B2E, 0x2FDB, 0x8B2F, 0x2FD3, 0x8B30, 0x2FD0, 0x8B31, 0x2FD6,
- 0x8B33, 0x2FCF, 0x8B35, 0x2FD1, 0x8B36, 0x2FDA, 0x8B37, 0x2FD8,
- 0x8B39, 0x152B, 0x8B3A, 0x2FDF, 0x8B3B, 0x2FDD, 0x8B3C, 0x2FD4,
- 0x8B3D, 0x2FDE, 0x8B3E, 0x2FD5, 0x8B40, 0x3125, 0x8B41, 0x15C4,
- 0x8B42, 0x312C, 0x8B45, 0x3313, 0x8B46, 0x15CB, 0x8B47, 0x2FD2,
- 0x8B48, 0x3123, 0x8B49, 0x15C7, 0x8B4A, 0x3124, 0x8B4B, 0x3129,
- 0x8B4E, 0x15C9, 0x8B4F, 0x15CA, 0x8B50, 0x3122, 0x8B51, 0x312B,
- 0x8B52, 0x312D, 0x8B53, 0x3126, 0x8B54, 0x3128, 0x8B55, 0x312A,
- 0x8B56, 0x3127, 0x8B57, 0x312E, 0x8B58, 0x15C6, 0x8B59, 0x15CC,
- 0x8B5A, 0x15C8, 0x8B5C, 0x15C5, 0x8B5D, 0x3237, 0x8B5F, 0x1648,
- 0x8B60, 0x3235, 0x8B63, 0x3239, 0x8B65, 0x323A, 0x8B66, 0x1646,
- 0x8B67, 0x323B, 0x8B68, 0x3238, 0x8B6A, 0x3236, 0x8B6B, 0x1649,
- 0x8B6C, 0x1645, 0x8B6D, 0x323C, 0x8B6F, 0x1647, 0x8B70, 0x1644,
- 0x8B74, 0x168F, 0x8B77, 0x1690, 0x8B78, 0x3312, 0x8B79, 0x3311,
- 0x8B7A, 0x3314, 0x8B7B, 0x3315, 0x8B7D, 0x1691, 0x8B7E, 0x33B6,
- 0x8B7F, 0x33BB, 0x8B80, 0x16D8, 0x8B82, 0x33B8, 0x8B84, 0x33B7,
- 0x8B85, 0x33BA, 0x8B86, 0x33B9, 0x8B88, 0x3440, 0x8B8A, 0x170A,
- 0x8B8B, 0x343F, 0x8B8C, 0x343D, 0x8B8E, 0x343E, 0x8B92, 0x172C,
- 0x8B93, 0x172B, 0x8B94, 0x349C, 0x8B95, 0x349D, 0x8B96, 0x172D,
- 0x8B98, 0x34E7, 0x8B99, 0x34E8, 0x8B9A, 0x1754, 0x8B9C, 0x175A,
- 0x8B9E, 0x3522, 0x8B9F, 0x353F, 0x8C37, 0x050B, 0x8C39, 0x206B,
- 0x8C3B, 0x206C, 0x8C3C, 0x2597, 0x8C3D, 0x2809, 0x8C3E, 0x2A53,
- 0x8C3F, 0x1481, 0x8C41, 0x1480, 0x8C42, 0x2FE0, 0x8C43, 0x312F,
- 0x8C45, 0x3441, 0x8C46, 0x050C, 0x8C47, 0x1E09, 0x8C48, 0x09C9,
- 0x8C49, 0x0BA7, 0x8C4A, 0x2599, 0x8C4B, 0x2598, 0x8C4C, 0x1223,
- 0x8C4D, 0x2A54, 0x8C4E, 0x1224, 0x8C4F, 0x2E6C, 0x8C50, 0x152E,
- 0x8C54, 0x1763, 0x8C55, 0x050D, 0x8C56, 0x1A48, 0x8C57, 0x1E0A,
- 0x8C5A, 0x0BA8, 0x8C5C, 0x206D, 0x8C5D, 0x206E, 0x8C5F, 0x22F8,
- 0x8C61, 0x0D65, 0x8C62, 0x0F1B, 0x8C64, 0x259B, 0x8C65, 0x259A,
- 0x8C66, 0x259C, 0x8C68, 0x280A, 0x8C69, 0x280B, 0x8C6A, 0x10B4,
- 0x8C6B, 0x135D, 0x8C6C, 0x1225, 0x8C6D, 0x135E, 0x8C6F, 0x2E70,
- 0x8C70, 0x2E6D, 0x8C71, 0x2E6F, 0x8C72, 0x2E6E, 0x8C73, 0x1482,
- 0x8C75, 0x2FE1, 0x8C76, 0x3131, 0x8C77, 0x3130, 0x8C78, 0x18E7,
- 0x8C79, 0x09CB, 0x8C7A, 0x09CA, 0x8C7B, 0x1E0B, 0x8C7D, 0x206F,
- 0x8C80, 0x22FA, 0x8C81, 0x22F9, 0x8C82, 0x0D66, 0x8C84, 0x259E,
- 0x8C85, 0x259F, 0x8C86, 0x259D, 0x8C89, 0x0F1D, 0x8C8A, 0x0F1C,
- 0x8C8C, 0x10B6, 0x8C8D, 0x10B5, 0x8C8F, 0x2A55, 0x8C90, 0x2C98,
- 0x8C91, 0x2C96, 0x8C92, 0x2C97, 0x8C93, 0x135F, 0x8C94, 0x2E72,
- 0x8C95, 0x2E71, 0x8C97, 0x2FE4, 0x8C98, 0x2FE3, 0x8C99, 0x2FE2,
- 0x8C9A, 0x3132, 0x8C9C, 0x3523, 0x8C9D, 0x050E, 0x8C9E, 0x080A,
- 0x8CA0, 0x080B, 0x8CA1, 0x09CC, 0x8CA2, 0x09CD, 0x8CA3, 0x1E0D,
- 0x8CA4, 0x1E0C, 0x8CA5, 0x2070, 0x8CA7, 0x0BAE, 0x8CA8, 0x0BAC,
- 0x8CA9, 0x0BA9, 0x8CAA, 0x0BAD, 0x8CAB, 0x0BAB, 0x8CAC, 0x0BAA,
- 0x8CAF, 0x0D67, 0x8CB0, 0x22FD, 0x8CB2, 0x0F22, 0x8CB3, 0x0D69,
- 0x8CB4, 0x0D6E, 0x8CB5, 0x22FF, 0x8CB6, 0x0D70, 0x8CB7, 0x0D6F,
- 0x8CB8, 0x0D72, 0x8CB9, 0x22FE, 0x8CBA, 0x22FB, 0x8CBB, 0x0D6C,
- 0x8CBC, 0x0D68, 0x8CBD, 0x0D6A, 0x8CBE, 0x22FC, 0x8CBF, 0x0D71,
- 0x8CC0, 0x0D6D, 0x8CC1, 0x0D6B, 0x8CC2, 0x0F24, 0x8CC3, 0x0F23,
- 0x8CC4, 0x0F21, 0x8CC5, 0x0F25, 0x8CC7, 0x0F1F, 0x8CC8, 0x0F20,
- 0x8CCA, 0x0F1E, 0x8CCC, 0x25A0, 0x8CCF, 0x280D, 0x8CD1, 0x10B8,
- 0x8CD2, 0x10B9, 0x8CD3, 0x10B7, 0x8CD5, 0x280C, 0x8CD7, 0x280E,
- 0x8CD9, 0x2A58, 0x8CDA, 0x2A5A, 0x8CDC, 0x122E, 0x8CDD, 0x2A5B,
- 0x8CDE, 0x1227, 0x8CDF, 0x2A57, 0x8CE0, 0x1226, 0x8CE1, 0x1230,
- 0x8CE2, 0x122C, 0x8CE3, 0x122D, 0x8CE4, 0x1229, 0x8CE5, 0x2A56,
- 0x8CE6, 0x1228, 0x8CE7, 0x2A5C, 0x8CE8, 0x2A59, 0x8CEA, 0x122F,
- 0x8CEC, 0x122A, 0x8CED, 0x122B, 0x8CEE, 0x2C9A, 0x8CF0, 0x2C9C,
- 0x8CF1, 0x2C9B, 0x8CF3, 0x2C9D, 0x8CF4, 0x1360, 0x8CF5, 0x2C99,
- 0x8CF8, 0x1486, 0x8CF9, 0x2E73, 0x8CFA, 0x1483, 0x8CFB, 0x1487,
- 0x8CFC, 0x1485, 0x8CFD, 0x1484, 0x8CFE, 0x2FE5, 0x8D00, 0x2FE8,
- 0x8D02, 0x2FE7, 0x8D04, 0x2FE6, 0x8D05, 0x152F, 0x8D06, 0x3133,
- 0x8D07, 0x3134, 0x8D08, 0x15CD, 0x8D09, 0x3135, 0x8D0A, 0x15CE,
- 0x8D0D, 0x164B, 0x8D0F, 0x164A, 0x8D10, 0x3316, 0x8D13, 0x1692,
- 0x8D14, 0x3317, 0x8D15, 0x33BC, 0x8D16, 0x16D9, 0x8D17, 0x16DA,
- 0x8D19, 0x3442, 0x8D1B, 0x172F, 0x8D64, 0x050F, 0x8D66, 0x0BB0,
- 0x8D67, 0x0BAF, 0x8D68, 0x25A1, 0x8D69, 0x25A2, 0x8D6B, 0x10BA,
- 0x8D6C, 0x2C9E, 0x8D6D, 0x1231, 0x8D6E, 0x2C9F, 0x8D6F, 0x2E74,
- 0x8D70, 0x0510, 0x8D72, 0x1C06, 0x8D73, 0x080D, 0x8D74, 0x080C,
- 0x8D76, 0x1E0E, 0x8D77, 0x09CE, 0x8D78, 0x1E0F, 0x8D79, 0x2073,
- 0x8D7B, 0x2072, 0x8D7D, 0x2071, 0x8D80, 0x2301, 0x8D81, 0x0D75,
- 0x8D84, 0x2300, 0x8D85, 0x0D74, 0x8D89, 0x2302, 0x8D8A, 0x0D73,
- 0x8D8C, 0x25A4, 0x8D8D, 0x25A7, 0x8D8E, 0x25A5, 0x8D8F, 0x25A6,
- 0x8D90, 0x25AA, 0x8D91, 0x25A3, 0x8D92, 0x25AB, 0x8D93, 0x25A8,
- 0x8D94, 0x25A9, 0x8D95, 0x10BC, 0x8D96, 0x280F, 0x8D99, 0x10BB,
- 0x8D9B, 0x2A60, 0x8D9C, 0x2A5E, 0x8D9F, 0x1232, 0x8DA0, 0x2A5D,
- 0x8DA1, 0x2A5F, 0x8DA3, 0x1233, 0x8DA5, 0x2CA0, 0x8DA7, 0x2CA1,
- 0x8DA8, 0x1488, 0x8DAA, 0x3137, 0x8DAB, 0x3139, 0x8DAC, 0x3136,
- 0x8DAD, 0x3138, 0x8DAE, 0x323D, 0x8DAF, 0x3318, 0x8DB2, 0x3509,
- 0x8DB3, 0x0511, 0x8DB4, 0x080E, 0x8DB5, 0x1E10, 0x8DB6, 0x1E12,
- 0x8DB7, 0x1E11, 0x8DB9, 0x2076, 0x8DBA, 0x0BB2, 0x8DBC, 0x2074,
- 0x8DBE, 0x0BB1, 0x8DBF, 0x2077, 0x8DC1, 0x2078, 0x8DC2, 0x2075,
- 0x8DC5, 0x230E, 0x8DC6, 0x0D7D, 0x8DC7, 0x2306, 0x8DC8, 0x230C,
- 0x8DCB, 0x0D78, 0x8DCC, 0x0D7B, 0x8DCD, 0x2305, 0x8DCE, 0x0D76,
- 0x8DCF, 0x2309, 0x8DD0, 0x25B1, 0x8DD1, 0x0D7A, 0x8DD3, 0x2304,
- 0x8DD5, 0x230A, 0x8DD6, 0x2307, 0x8DD7, 0x230D, 0x8DD8, 0x2303,
- 0x8DD9, 0x230B, 0x8DDA, 0x0D79, 0x8DDB, 0x0D7C, 0x8DDC, 0x2308,
- 0x8DDD, 0x0D77, 0x8DDF, 0x0F27, 0x8DE0, 0x25AD, 0x8DE1, 0x0F26,
- 0x8DE2, 0x25B4, 0x8DE3, 0x25B3, 0x8DE4, 0x0F2D, 0x8DE6, 0x0F2E,
- 0x8DE7, 0x25B5, 0x8DE8, 0x0F28, 0x8DE9, 0x25B2, 0x8DEA, 0x0F2C,
- 0x8DEB, 0x25B7, 0x8DEC, 0x25AE, 0x8DEE, 0x25B0, 0x8DEF, 0x0F29,
- 0x8DF0, 0x25AC, 0x8DF1, 0x25AF, 0x8DF2, 0x25B6, 0x8DF3, 0x0F2A,
- 0x8DF4, 0x25B8, 0x8DFA, 0x0F2B, 0x8DFC, 0x10BD, 0x8DFD, 0x2814,
- 0x8DFE, 0x281A, 0x8DFF, 0x2812, 0x8E00, 0x281B, 0x8E02, 0x2811,
- 0x8E03, 0x2816, 0x8E04, 0x281C, 0x8E05, 0x2819, 0x8E06, 0x2818,
- 0x8E07, 0x2817, 0x8E09, 0x2810, 0x8E0A, 0x2815, 0x8E0D, 0x2813,
- 0x8E0F, 0x1238, 0x8E10, 0x1235, 0x8E11, 0x2A69, 0x8E12, 0x2A6E,
- 0x8E13, 0x2A70, 0x8E14, 0x2A6D, 0x8E15, 0x2A66, 0x8E16, 0x2A68,
- 0x8E17, 0x2A72, 0x8E18, 0x2A6F, 0x8E19, 0x2A6A, 0x8E1A, 0x2A73,
- 0x8E1B, 0x2A67, 0x8E1C, 0x2A71, 0x8E1D, 0x1236, 0x8E1E, 0x123C,
- 0x8E1F, 0x123A, 0x8E20, 0x2A61, 0x8E21, 0x123B, 0x8E22, 0x1237,
- 0x8E23, 0x2A62, 0x8E24, 0x2A64, 0x8E25, 0x2A63, 0x8E26, 0x2A6B,
- 0x8E27, 0x2A6C, 0x8E29, 0x1239, 0x8E2B, 0x1234, 0x8E2E, 0x2A65,
- 0x8E30, 0x2CAB, 0x8E31, 0x1362, 0x8E33, 0x2CA2, 0x8E34, 0x1363,
- 0x8E35, 0x1366, 0x8E36, 0x2CA7, 0x8E38, 0x2CA4, 0x8E39, 0x1365,
- 0x8E3C, 0x2CA8, 0x8E3D, 0x2CA9, 0x8E3E, 0x2CA3, 0x8E3F, 0x2CAC,
- 0x8E40, 0x2CA5, 0x8E41, 0x2CAA, 0x8E42, 0x1364, 0x8E44, 0x1361,
- 0x8E45, 0x2CA6, 0x8E47, 0x2E7A, 0x8E48, 0x148B, 0x8E49, 0x1489,
- 0x8E4A, 0x148C, 0x8E4B, 0x148A, 0x8E4C, 0x2E79, 0x8E4D, 0x2E76,
- 0x8E4E, 0x2E75, 0x8E50, 0x2E78, 0x8E53, 0x2E77, 0x8E54, 0x2FF6,
- 0x8E55, 0x1535, 0x8E56, 0x2FED, 0x8E57, 0x2FEC, 0x8E59, 0x1530,
- 0x8E5A, 0x2FF2, 0x8E5B, 0x2FF1, 0x8E5C, 0x2FE9, 0x8E5D, 0x2FF4,
- 0x8E5E, 0x2FEE, 0x8E5F, 0x1534, 0x8E60, 0x2FEB, 0x8E61, 0x2FF3,
- 0x8E62, 0x2FEA, 0x8E63, 0x1531, 0x8E64, 0x1533, 0x8E65, 0x2FEF,
- 0x8E66, 0x1532, 0x8E67, 0x2FF0, 0x8E69, 0x2FF5, 0x8E6A, 0x313D,
- 0x8E6C, 0x15D3, 0x8E6D, 0x313A, 0x8E6F, 0x313E, 0x8E72, 0x15D0,
- 0x8E73, 0x313C, 0x8E74, 0x15D5, 0x8E76, 0x15D2, 0x8E78, 0x313B,
- 0x8E7A, 0x15D4, 0x8E7B, 0x313F, 0x8E7C, 0x15CF, 0x8E81, 0x164D,
- 0x8E82, 0x164F, 0x8E84, 0x3240, 0x8E85, 0x164E, 0x8E86, 0x323E,
- 0x8E87, 0x15D1, 0x8E88, 0x323F, 0x8E89, 0x164C, 0x8E8A, 0x1693,
- 0x8E8B, 0x1695, 0x8E8C, 0x331A, 0x8E8D, 0x1694, 0x8E8E, 0x3319,
- 0x8E90, 0x33C1, 0x8E91, 0x16DB, 0x8E92, 0x33C0, 0x8E93, 0x16DC,
- 0x8E94, 0x33BE, 0x8E95, 0x33BD, 0x8E96, 0x33C2, 0x8E97, 0x33C3,
- 0x8E98, 0x3443, 0x8E9A, 0x33BF, 0x8E9D, 0x34A1, 0x8E9E, 0x349E,
- 0x8E9F, 0x349F, 0x8EA0, 0x34A0, 0x8EA1, 0x1749, 0x8EA3, 0x34EB,
- 0x8EA4, 0x34EA, 0x8EA5, 0x34E9, 0x8EA6, 0x350A, 0x8EA8, 0x3537,
- 0x8EA9, 0x3524, 0x8EAA, 0x175B, 0x8EAB, 0x0512, 0x8EAC, 0x09CF,
- 0x8EB2, 0x0F2F, 0x8EBA, 0x123D, 0x8EBD, 0x2CAD, 0x8EC0, 0x1536,
- 0x8EC2, 0x3140, 0x8EC9, 0x3525, 0x8ECA, 0x0513, 0x8ECB, 0x068D,
- 0x8ECC, 0x0810, 0x8ECD, 0x080F, 0x8ECF, 0x09D2, 0x8ED1, 0x1E13,
- 0x8ED2, 0x09D0, 0x8ED3, 0x1E14, 0x8ED4, 0x09D1, 0x8ED7, 0x207D,
- 0x8ED8, 0x2079, 0x8EDB, 0x0BB3, 0x8EDC, 0x207C, 0x8EDD, 0x207B,
- 0x8EDE, 0x207A, 0x8EDF, 0x0BB4, 0x8EE0, 0x207E, 0x8EE1, 0x207F,
- 0x8EE5, 0x2315, 0x8EE6, 0x2313, 0x8EE7, 0x2317, 0x8EE8, 0x2318,
- 0x8EE9, 0x231E, 0x8EEB, 0x231A, 0x8EEC, 0x231C, 0x8EEE, 0x2314,
- 0x8EEF, 0x230F, 0x8EF1, 0x231B, 0x8EF4, 0x231D, 0x8EF5, 0x2316,
- 0x8EF6, 0x2319, 0x8EF7, 0x2310, 0x8EF8, 0x0D7F, 0x8EF9, 0x2312,
- 0x8EFA, 0x2311, 0x8EFB, 0x0D7E, 0x8EFC, 0x0D80, 0x8EFE, 0x0F32,
- 0x8EFF, 0x25BA, 0x8F00, 0x25BC, 0x8F01, 0x25BB, 0x8F02, 0x25C0,
- 0x8F03, 0x0F30, 0x8F05, 0x25BD, 0x8F06, 0x25B9, 0x8F07, 0x25BE,
- 0x8F08, 0x25BF, 0x8F09, 0x0F31, 0x8F0A, 0x0F33, 0x8F0B, 0x25C1,
- 0x8F0D, 0x2820, 0x8F0E, 0x281F, 0x8F10, 0x281D, 0x8F11, 0x281E,
- 0x8F12, 0x10BF, 0x8F13, 0x10C1, 0x8F14, 0x10BE, 0x8F15, 0x10C0,
- 0x8F16, 0x2A7A, 0x8F17, 0x2A7B, 0x8F18, 0x2A76, 0x8F1A, 0x2A77,
- 0x8F1B, 0x123F, 0x8F1C, 0x1244, 0x8F1D, 0x123E, 0x8F1E, 0x1245,
- 0x8F1F, 0x1240, 0x8F20, 0x2A78, 0x8F23, 0x2A79, 0x8F24, 0x2A75,
- 0x8F25, 0x1246, 0x8F26, 0x1242, 0x8F29, 0x1241, 0x8F2A, 0x1243,
- 0x8F2C, 0x2A74, 0x8F2E, 0x2CAF, 0x8F2F, 0x1368, 0x8F32, 0x2CB1,
- 0x8F33, 0x136A, 0x8F34, 0x2CB4, 0x8F35, 0x2CB0, 0x8F36, 0x2CAE,
- 0x8F37, 0x2CB3, 0x8F38, 0x1369, 0x8F39, 0x2CB2, 0x8F3B, 0x1367,
- 0x8F3E, 0x148E, 0x8F3F, 0x1491, 0x8F40, 0x2E7C, 0x8F42, 0x148F,
- 0x8F43, 0x2E7B, 0x8F44, 0x148D, 0x8F45, 0x1490, 0x8F46, 0x2FF7,
- 0x8F47, 0x2FF8, 0x8F48, 0x2FF9, 0x8F49, 0x1537, 0x8F4B, 0x2FFA,
- 0x8F4D, 0x1538, 0x8F4E, 0x15D7, 0x8F4F, 0x3143, 0x8F50, 0x3144,
- 0x8F51, 0x3142, 0x8F52, 0x3141, 0x8F53, 0x3145, 0x8F54, 0x15D6,
- 0x8F55, 0x3244, 0x8F56, 0x3242, 0x8F57, 0x3243, 0x8F58, 0x3245,
- 0x8F59, 0x3241, 0x8F5A, 0x3246, 0x8F5B, 0x331C, 0x8F5D, 0x331D,
- 0x8F5E, 0x331B, 0x8F5F, 0x1696, 0x8F60, 0x33C4, 0x8F61, 0x16DD,
- 0x8F62, 0x33C5, 0x8F63, 0x3445, 0x8F64, 0x3444, 0x8F9B, 0x0514,
- 0x8F9C, 0x0D81, 0x8F9F, 0x0F34, 0x8FA3, 0x10C2, 0x8FA6, 0x136C,
- 0x8FA8, 0x136B, 0x8FAD, 0x15D8, 0x8FAE, 0x162F, 0x8FAF, 0x1697,
- 0x8FB0, 0x0515, 0x8FB1, 0x09D3, 0x8FB2, 0x0F35, 0x8FB4, 0x3146,
- 0x8FB5, 0x0230, 0x8FBF, 0x18E9, 0x8FC2, 0x0516, 0x8FC4, 0x0519,
- 0x8FC5, 0x0518, 0x8FC6, 0x0517, 0x8FC9, 0x18E8, 0x8FCB, 0x1A4A,
- 0x8FCD, 0x1A4C, 0x8FCE, 0x068E, 0x8FD1, 0x0690, 0x8FD2, 0x1A49,
- 0x8FD3, 0x1A4B, 0x8FD4, 0x068F, 0x8FD5, 0x1A4E, 0x8FD6, 0x1A4D,
- 0x8FD7, 0x1A4F, 0x8FE0, 0x1C0A, 0x8FE1, 0x1C08, 0x8FE2, 0x0813,
- 0x8FE3, 0x1C07, 0x8FE4, 0x0818, 0x8FE5, 0x0815, 0x8FE6, 0x0812,
- 0x8FE8, 0x0819, 0x8FEA, 0x0814, 0x8FEB, 0x0817, 0x8FED, 0x0816,
- 0x8FEE, 0x1C09, 0x8FF0, 0x0811, 0x8FF4, 0x09D9, 0x8FF5, 0x1E16,
- 0x8FF6, 0x1E1C, 0x8FF7, 0x09D6, 0x8FF8, 0x09DD, 0x8FFA, 0x09D8,
- 0x8FFB, 0x1E19, 0x8FFC, 0x1E1B, 0x8FFD, 0x09DB, 0x8FFE, 0x1E15,
- 0x8FFF, 0x1E18, 0x9000, 0x09D7, 0x9001, 0x09D4, 0x9002, 0x1E17,
- 0x9003, 0x09DA, 0x9004, 0x1E1A, 0x9005, 0x09DC, 0x9006, 0x09D5,
- 0x900B, 0x2081, 0x900C, 0x2084, 0x900D, 0x0BB6, 0x900F, 0x0BC0,
- 0x9010, 0x0BBC, 0x9011, 0x2082, 0x9014, 0x0BC4, 0x9015, 0x0BBD,
- 0x9016, 0x0BC2, 0x9017, 0x0BB8, 0x9019, 0x0BB5, 0x901A, 0x0BB7,
- 0x901B, 0x0BC3, 0x901C, 0x2083, 0x901D, 0x0BBB, 0x901E, 0x0BBE,
- 0x901F, 0x0BBA, 0x9020, 0x0BBF, 0x9021, 0x2085, 0x9022, 0x0BC1,
- 0x9023, 0x0BB9, 0x9024, 0x2080, 0x902D, 0x231F, 0x902E, 0x0D82,
- 0x902F, 0x2321, 0x9031, 0x0D84, 0x9032, 0x0D86, 0x9034, 0x2320,
- 0x9035, 0x0D83, 0x9036, 0x0D87, 0x9038, 0x0D85, 0x903C, 0x0F3B,
- 0x903D, 0x25C6, 0x903E, 0x0F43, 0x903F, 0x25C3, 0x9041, 0x0F44,
- 0x9042, 0x0F39, 0x9044, 0x25C4, 0x9047, 0x0F3E, 0x9049, 0x25C5,
- 0x904A, 0x0F37, 0x904B, 0x0F36, 0x904D, 0x0F41, 0x904E, 0x0F40,
- 0x904F, 0x0F3F, 0x9050, 0x0F3D, 0x9051, 0x0F42, 0x9052, 0x25C2,
- 0x9053, 0x0F38, 0x9054, 0x0F3A, 0x9055, 0x0F3C, 0x9058, 0x10C4,
- 0x9059, 0x10C7, 0x905B, 0x10CB, 0x905C, 0x10C5, 0x905D, 0x10CA,
- 0x905E, 0x10C8, 0x9060, 0x10C3, 0x9062, 0x10C9, 0x9063, 0x10C6,
- 0x9067, 0x2A7F, 0x9068, 0x1249, 0x9069, 0x1247, 0x906B, 0x2A80,
- 0x906D, 0x124A, 0x906E, 0x1248, 0x906F, 0x2A7E, 0x9070, 0x2A7D,
- 0x9072, 0x1370, 0x9073, 0x2A7C, 0x9074, 0x136E, 0x9075, 0x136D,
- 0x9076, 0x2CB5, 0x9077, 0x124B, 0x9078, 0x136F, 0x9079, 0x2CB6,
- 0x907A, 0x1372, 0x907B, 0x2CB7, 0x907C, 0x1371, 0x907D, 0x1493,
- 0x907E, 0x2E7E, 0x907F, 0x1492, 0x9080, 0x1497, 0x9081, 0x1495,
- 0x9082, 0x1496, 0x9083, 0x153A, 0x9084, 0x1494, 0x9085, 0x2E7D,
- 0x9086, 0x2CB8, 0x9087, 0x1539, 0x9088, 0x153B, 0x908A, 0x15D9,
- 0x908B, 0x15DA, 0x908D, 0x3247, 0x908F, 0x170C, 0x9090, 0x170B,
- 0x9091, 0x051B, 0x9094, 0x181E, 0x9095, 0x09DE, 0x9097, 0x181B,
- 0x9098, 0x181C, 0x9099, 0x181A, 0x909B, 0x181D, 0x909E, 0x18ED,
- 0x909F, 0x18EA, 0x90A0, 0x18EF, 0x90A1, 0x18EB, 0x90A2, 0x051C,
- 0x90A3, 0x051F, 0x90A5, 0x18EC, 0x90A6, 0x051E, 0x90A7, 0x18EE,
- 0x90AA, 0x051D, 0x90AF, 0x1A52, 0x90B0, 0x1A54, 0x90B1, 0x0693,
- 0x90B2, 0x1A50, 0x90B3, 0x1A53, 0x90B4, 0x1A51, 0x90B5, 0x0691,
- 0x90B6, 0x0694, 0x90B8, 0x0692, 0x90BD, 0x1C0C, 0x90BE, 0x1C10,
- 0x90BF, 0x1C0D, 0x90C1, 0x081C, 0x90C3, 0x081D, 0x90C5, 0x1C0F,
- 0x90C7, 0x1C11, 0x90C8, 0x1C13, 0x90CA, 0x081A, 0x90CB, 0x1C12,
- 0x90CE, 0x081B, 0x90D4, 0x208C, 0x90D5, 0x1C0E, 0x90D6, 0x1E1D,
- 0x90D7, 0x1E26, 0x90D8, 0x1E24, 0x90D9, 0x1E1F, 0x90DA, 0x1E20,
- 0x90DB, 0x1E25, 0x90DC, 0x1E27, 0x90DD, 0x09E0, 0x90DF, 0x1E22,
- 0x90E0, 0x1E1E, 0x90E1, 0x09DF, 0x90E2, 0x09E1, 0x90E3, 0x1E21,
- 0x90E4, 0x1E28, 0x90E5, 0x1E23, 0x90E8, 0x0BC5, 0x90E9, 0x208F,
- 0x90EA, 0x2087, 0x90EB, 0x208D, 0x90EC, 0x208E, 0x90ED, 0x0BC6,
- 0x90EF, 0x2086, 0x90F0, 0x2088, 0x90F1, 0x1C0B, 0x90F2, 0x208A,
- 0x90F3, 0x208B, 0x90F4, 0x2089, 0x90F5, 0x0D89, 0x90F9, 0x2328,
- 0x90FA, 0x2CB9, 0x90FB, 0x2329, 0x90FC, 0x2326, 0x90FD, 0x0BC7,
- 0x90FE, 0x0D8B, 0x90FF, 0x2325, 0x9100, 0x232B, 0x9101, 0x232A,
- 0x9102, 0x0D88, 0x9103, 0x232E, 0x9104, 0x2324, 0x9105, 0x232D,
- 0x9106, 0x2322, 0x9107, 0x232C, 0x9108, 0x2327, 0x9109, 0x0D8A,
- 0x910B, 0x25CD, 0x910D, 0x25C8, 0x910E, 0x25CE, 0x910F, 0x25C9,
- 0x9110, 0x25C7, 0x9111, 0x25CA, 0x9112, 0x0F45, 0x9114, 0x25CC,
- 0x9116, 0x25CB, 0x9117, 0x0F46, 0x9118, 0x10CD, 0x9119, 0x10CC,
- 0x911A, 0x2827, 0x911B, 0x282A, 0x911C, 0x2822, 0x911D, 0x2826,
- 0x911E, 0x10CE, 0x911F, 0x2825, 0x9120, 0x2823, 0x9121, 0x2829,
- 0x9122, 0x2824, 0x9123, 0x2821, 0x9124, 0x2828, 0x9126, 0x2A86,
- 0x9127, 0x124E, 0x9128, 0x2FFB, 0x9129, 0x2A83, 0x912A, 0x2A84,
- 0x912B, 0x2A82, 0x912C, 0x2323, 0x912D, 0x124D, 0x912E, 0x2A87,
- 0x912F, 0x2A81, 0x9130, 0x124C, 0x9131, 0x124F, 0x9132, 0x2A85,
- 0x9133, 0x2CBA, 0x9134, 0x1373, 0x9135, 0x2CBB, 0x9136, 0x2CBC,
- 0x9138, 0x2E7F, 0x9139, 0x1498, 0x913A, 0x2FFC, 0x913B, 0x2FFD,
- 0x913E, 0x2FFE, 0x913F, 0x3148, 0x9140, 0x3147, 0x9141, 0x3249,
- 0x9143, 0x3248, 0x9144, 0x331F, 0x9145, 0x3320, 0x9146, 0x331E,
- 0x9147, 0x33C6, 0x9148, 0x16DE, 0x9149, 0x0520, 0x914A, 0x081F,
- 0x914B, 0x081E, 0x914C, 0x09E4, 0x914D, 0x09E3, 0x914E, 0x1E2A,
- 0x914F, 0x1E2B, 0x9150, 0x1E29, 0x9152, 0x09E2, 0x9153, 0x2093,
- 0x9155, 0x2094, 0x9156, 0x2090, 0x9157, 0x0BC8, 0x9158, 0x2091,
- 0x915A, 0x2092, 0x915F, 0x2331, 0x9160, 0x2333, 0x9161, 0x232F,
- 0x9162, 0x2332, 0x9163, 0x0D8C, 0x9164, 0x2330, 0x9165, 0x0D8D,
- 0x9168, 0x23E2, 0x9169, 0x0F49, 0x916A, 0x0F48, 0x916C, 0x0F47,
- 0x916E, 0x25CF, 0x916F, 0x25D0, 0x9172, 0x282C, 0x9173, 0x282E,
- 0x9174, 0x10D2, 0x9175, 0x10CF, 0x9177, 0x10D1, 0x9178, 0x10D0,
- 0x9179, 0x282D, 0x917A, 0x282B, 0x9180, 0x2A8E, 0x9181, 0x2A8B,
- 0x9182, 0x2A8C, 0x9183, 0x1253, 0x9184, 0x2A8D, 0x9185, 0x2A88,
- 0x9186, 0x2A89, 0x9187, 0x1250, 0x9189, 0x1251, 0x918A, 0x2A8A,
- 0x918B, 0x1252, 0x918D, 0x2CC0, 0x918F, 0x2CC1, 0x9190, 0x2CBE,
- 0x9191, 0x2CBF, 0x9192, 0x1374, 0x9193, 0x2CBD, 0x9199, 0x2E83,
- 0x919A, 0x2E80, 0x919B, 0x2E82, 0x919C, 0x149B, 0x919D, 0x2E86,
- 0x919E, 0x149A, 0x919F, 0x2E84, 0x91A0, 0x2E87, 0x91A1, 0x2E85,
- 0x91A2, 0x2E81, 0x91A3, 0x1499, 0x91A5, 0x3000, 0x91A7, 0x3001,
- 0x91A8, 0x2FFF, 0x91AA, 0x3003, 0x91AB, 0x153C, 0x91AC, 0x153D,
- 0x91AD, 0x314A, 0x91AE, 0x15DC, 0x91AF, 0x3002, 0x91B0, 0x3149,
- 0x91B1, 0x15DB, 0x91B2, 0x324C, 0x91B3, 0x324D, 0x91B4, 0x1650,
- 0x91B5, 0x324B, 0x91B7, 0x324A, 0x91B9, 0x3321, 0x91BA, 0x1698,
- 0x91BC, 0x3446, 0x91BD, 0x34A3, 0x91BE, 0x34A2, 0x91C0, 0x1730,
- 0x91C1, 0x174A, 0x91C2, 0x34A4, 0x91C3, 0x350B, 0x91C5, 0x175C,
- 0x91C6, 0x0521, 0x91C7, 0x0695, 0x91C9, 0x0F4A, 0x91CB, 0x1651,
- 0x91CC, 0x0522, 0x91CD, 0x0820, 0x91CE, 0x0BC9, 0x91CF, 0x0D8E,
- 0x91D0, 0x153E, 0x91D1, 0x0696, 0x91D3, 0x1C15, 0x91D4, 0x1C14,
- 0x91D5, 0x1E2C, 0x91D7, 0x09E7, 0x91D8, 0x09E5, 0x91D9, 0x09E9,
- 0x91DA, 0x1E2E, 0x91DC, 0x09E8, 0x91DD, 0x09E6, 0x91E2, 0x1E2D,
- 0x91E3, 0x0BCC, 0x91E4, 0x209A, 0x91E6, 0x0BCB, 0x91E7, 0x0BCD,
- 0x91E8, 0x209F, 0x91E9, 0x0BCF, 0x91EA, 0x209C, 0x91EB, 0x209D,
- 0x91EC, 0x2095, 0x91ED, 0x0BCE, 0x91EE, 0x20A0, 0x91F1, 0x2097,
- 0x91F3, 0x2098, 0x91F4, 0x2096, 0x91F5, 0x0BCA, 0x91F7, 0x209E,
- 0x91F8, 0x2099, 0x91F9, 0x209B, 0x91FD, 0x233F, 0x91FF, 0x233E,
- 0x9200, 0x233C, 0x9201, 0x2334, 0x9202, 0x2343, 0x9203, 0x2337,
- 0x9204, 0x2341, 0x9205, 0x2348, 0x9206, 0x2340, 0x9207, 0x0D96,
- 0x9209, 0x0D92, 0x920A, 0x2335, 0x920C, 0x233B, 0x920D, 0x0D94,
- 0x920F, 0x233A, 0x9210, 0x0D95, 0x9211, 0x0D97, 0x9212, 0x233D,
- 0x9214, 0x0D8F, 0x9215, 0x0D90, 0x9216, 0x2349, 0x9217, 0x2347,
- 0x9219, 0x2346, 0x921A, 0x2338, 0x921C, 0x2344, 0x921E, 0x0D93,
- 0x9223, 0x0D91, 0x9224, 0x2345, 0x9225, 0x2336, 0x9226, 0x2339,
- 0x9227, 0x2342, 0x922D, 0x2851, 0x922E, 0x25DA, 0x9230, 0x25D3,
- 0x9231, 0x25E6, 0x9232, 0x25EF, 0x9233, 0x25D6, 0x9234, 0x0F55,
- 0x9236, 0x25E3, 0x9237, 0x0F4B, 0x9238, 0x0F4D, 0x9239, 0x0F59,
- 0x923A, 0x25D4, 0x923D, 0x0F4E, 0x923E, 0x0F50, 0x923F, 0x0F5A,
- 0x9240, 0x0F4F, 0x9245, 0x0F58, 0x9246, 0x25DC, 0x9248, 0x25D1,
- 0x9249, 0x0F56, 0x924A, 0x25DB, 0x924B, 0x0F52, 0x924C, 0x25ED,
- 0x924D, 0x0F57, 0x924E, 0x25EB, 0x924F, 0x25DF, 0x9250, 0x25E9,
- 0x9251, 0x0F54, 0x9252, 0x25D2, 0x9253, 0x25EC, 0x9254, 0x25E7,
- 0x9256, 0x25EE, 0x9257, 0x0F4C, 0x925A, 0x0F5B, 0x925B, 0x0F51,
- 0x925E, 0x25D8, 0x9260, 0x25E0, 0x9261, 0x25E4, 0x9263, 0x25E8,
- 0x9264, 0x0F53, 0x9265, 0x25D7, 0x9266, 0x25D5, 0x9267, 0x25E1,
- 0x926C, 0x25DE, 0x926D, 0x25DD, 0x926F, 0x25E2, 0x9270, 0x25E5,
- 0x9272, 0x25EA, 0x9276, 0x2831, 0x9278, 0x10D3, 0x9279, 0x283B,
- 0x927A, 0x2833, 0x927B, 0x10D9, 0x927C, 0x10DD, 0x927D, 0x2844,
- 0x927E, 0x284C, 0x927F, 0x283D, 0x9280, 0x10D5, 0x9282, 0x2841,
- 0x9283, 0x25D9, 0x9285, 0x10D6, 0x9286, 0x2848, 0x9287, 0x284D,
- 0x9288, 0x2845, 0x928A, 0x2847, 0x928B, 0x2850, 0x928C, 0x2849,
- 0x928D, 0x2837, 0x928E, 0x2840, 0x9291, 0x10DE, 0x9293, 0x10DA,
- 0x9294, 0x2835, 0x9295, 0x2842, 0x9296, 0x10D8, 0x9297, 0x283C,
- 0x9298, 0x10D7, 0x9299, 0x284A, 0x929A, 0x2839, 0x929B, 0x2832,
- 0x929C, 0x10DB, 0x929D, 0x284F, 0x92A0, 0x2834, 0x92A1, 0x2846,
- 0x92A2, 0x2843, 0x92A3, 0x283E, 0x92A4, 0x2830, 0x92A5, 0x282F,
- 0x92A6, 0x2838, 0x92A7, 0x284B, 0x92A8, 0x10DC, 0x92A9, 0x284E,
- 0x92AA, 0x2836, 0x92AB, 0x283A, 0x92AC, 0x10D4, 0x92B2, 0x125F,
- 0x92B3, 0x125A, 0x92B4, 0x2AB0, 0x92B5, 0x2AAC, 0x92B6, 0x2A94,
- 0x92B7, 0x1256, 0x92B9, 0x36E9, 0x92BB, 0x1255, 0x92BC, 0x125B,
- 0x92C0, 0x2A92, 0x92C1, 0x1259, 0x92C2, 0x2A9E, 0x92C3, 0x2A90,
- 0x92C4, 0x2A91, 0x92C5, 0x1254, 0x92C6, 0x2AAF, 0x92C7, 0x125D,
- 0x92C8, 0x2AA1, 0x92C9, 0x2AA6, 0x92CA, 0x2AA0, 0x92CB, 0x2CD3,
- 0x92CC, 0x2A9C, 0x92CD, 0x2AA4, 0x92CE, 0x2AA2, 0x92CF, 0x2A95,
- 0x92D0, 0x2A8F, 0x92D1, 0x2AAA, 0x92D2, 0x125C, 0x92D3, 0x2AAB,
- 0x92D5, 0x2AA5, 0x92D7, 0x2A9A, 0x92D8, 0x2A98, 0x92D9, 0x2A93,
- 0x92DD, 0x2A9B, 0x92DE, 0x2AA8, 0x92DF, 0x2A97, 0x92E0, 0x2AA7,
- 0x92E1, 0x2AAD, 0x92E4, 0x1258, 0x92E6, 0x2AA3, 0x92E7, 0x2AA9,
- 0x92E8, 0x2A9F, 0x92E9, 0x2A99, 0x92EA, 0x1257, 0x92EE, 0x283F,
- 0x92EF, 0x2A9D, 0x92F0, 0x125E, 0x92F1, 0x2A96, 0x92F7, 0x2CD8,
- 0x92F8, 0x1377, 0x92F9, 0x2CD7, 0x92FA, 0x2CD5, 0x92FB, 0x2CE7,
- 0x92FC, 0x137B, 0x92FE, 0x2CE4, 0x92FF, 0x2CDC, 0x9300, 0x2CE6,
- 0x9301, 0x2CCE, 0x9302, 0x2CDA, 0x9304, 0x137D, 0x9306, 0x2CC6,
- 0x9308, 0x2CC4, 0x9309, 0x2CE5, 0x930B, 0x2CE3, 0x930C, 0x2CE2,
- 0x930D, 0x2CD2, 0x930E, 0x2CD1, 0x930F, 0x2CC7, 0x9310, 0x137F,
- 0x9312, 0x2CCD, 0x9313, 0x2CD6, 0x9314, 0x2CE1, 0x9315, 0x1382,
- 0x9316, 0x2CE8, 0x9318, 0x14A3, 0x9319, 0x1384, 0x931A, 0x137E,
- 0x931B, 0x2CCB, 0x931D, 0x2CD4, 0x931E, 0x2CC3, 0x931F, 0x2CC5,
- 0x9320, 0x1375, 0x9321, 0x1381, 0x9322, 0x137A, 0x9323, 0x2CCC,
- 0x9324, 0x2CDB, 0x9325, 0x2AAE, 0x9326, 0x1380, 0x9327, 0x2CC2,
- 0x9328, 0x149E, 0x9329, 0x2CDD, 0x932A, 0x2CE0, 0x932B, 0x137C,
- 0x932D, 0x2CD0, 0x932E, 0x1383, 0x932F, 0x1379, 0x9333, 0x1378,
- 0x9334, 0x2CD9, 0x9335, 0x2CDF, 0x9336, 0x1376, 0x9338, 0x2CC9,
- 0x9339, 0x2CDE, 0x933C, 0x2CCA, 0x9346, 0x2CCF, 0x9347, 0x2E8D,
- 0x9349, 0x2E92, 0x934A, 0x14A0, 0x934B, 0x14A2, 0x934C, 0x2E98,
- 0x934D, 0x149C, 0x934E, 0x2EA6, 0x934F, 0x2E9E, 0x9350, 0x2E93,
- 0x9351, 0x2E94, 0x9352, 0x2E9D, 0x9354, 0x14A9, 0x9355, 0x2E9C,
- 0x9356, 0x2E8C, 0x9357, 0x2E9B, 0x9358, 0x2E8F, 0x9359, 0x2EA7,
- 0x935A, 0x14A8, 0x935B, 0x14A6, 0x935C, 0x2E90, 0x935E, 0x2EA3,
- 0x9360, 0x2E95, 0x9361, 0x2EA2, 0x9363, 0x2EA4, 0x9364, 0x2E8B,
- 0x9365, 0x14A1, 0x9367, 0x2EA5, 0x936A, 0x2E99, 0x936C, 0x14A5,
- 0x936D, 0x2E96, 0x9370, 0x14A7, 0x9371, 0x2E9F, 0x9375, 0x149F,
- 0x9376, 0x2E91, 0x9377, 0x2EA0, 0x9379, 0x2E9A, 0x937A, 0x2CC8,
- 0x937B, 0x2EA1, 0x937C, 0x2E8E, 0x937E, 0x14A4, 0x9380, 0x3014,
- 0x9382, 0x149D, 0x9383, 0x2E89, 0x9388, 0x3011, 0x9389, 0x300A,
- 0x938A, 0x1540, 0x938C, 0x3005, 0x938D, 0x3015, 0x938E, 0x300C,
- 0x938F, 0x2E97, 0x9391, 0x3017, 0x9392, 0x3006, 0x9394, 0x153F,
- 0x9395, 0x3010, 0x9396, 0x1541, 0x9397, 0x1549, 0x9398, 0x1547,
- 0x9399, 0x3012, 0x939A, 0x1548, 0x939B, 0x3008, 0x939D, 0x3009,
- 0x939E, 0x300E, 0x939F, 0x3013, 0x93A1, 0x2E88, 0x93A2, 0x1542,
- 0x93A3, 0x301C, 0x93A4, 0x3019, 0x93A5, 0x3160, 0x93A6, 0x300F,
- 0x93A7, 0x300B, 0x93A8, 0x301A, 0x93A9, 0x3155, 0x93AA, 0x300D,
- 0x93AC, 0x1545, 0x93AE, 0x1544, 0x93AF, 0x2E8A, 0x93B0, 0x1546,
- 0x93B1, 0x3016, 0x93B2, 0x3018, 0x93B3, 0x1543, 0x93B4, 0x301B,
- 0x93B5, 0x3004, 0x93B7, 0x3007, 0x93C0, 0x315E, 0x93C2, 0x314E,
- 0x93C3, 0x15E0, 0x93C4, 0x315C, 0x93C7, 0x314C, 0x93C8, 0x15E1,
- 0x93CA, 0x3157, 0x93CC, 0x3153, 0x93CD, 0x15E6, 0x93CE, 0x315D,
- 0x93CF, 0x314D, 0x93D0, 0x3150, 0x93D1, 0x15DE, 0x93D2, 0x315F,
- 0x93D4, 0x3158, 0x93D5, 0x315B, 0x93D6, 0x15E4, 0x93D7, 0x15E9,
- 0x93D8, 0x15E7, 0x93D9, 0x3154, 0x93DA, 0x314F, 0x93DC, 0x15E2,
- 0x93DD, 0x15E3, 0x93DE, 0x314B, 0x93DF, 0x15DF, 0x93E1, 0x15DD,
- 0x93E2, 0x15E5, 0x93E3, 0x315A, 0x93E4, 0x15E8, 0x93E6, 0x3156,
- 0x93E7, 0x3161, 0x93E8, 0x15EA, 0x93EC, 0x3152, 0x93EE, 0x3159,
- 0x93F5, 0x325A, 0x93F6, 0x3269, 0x93F7, 0x325C, 0x93F8, 0x3263,
- 0x93F9, 0x3151, 0x93FA, 0x3261, 0x93FB, 0x3250, 0x93FC, 0x3267,
- 0x93FD, 0x1654, 0x93FE, 0x3254, 0x93FF, 0x3266, 0x9400, 0x325B,
- 0x9403, 0x1653, 0x9406, 0x326B, 0x9407, 0x325D, 0x9409, 0x3262,
- 0x940A, 0x3265, 0x940B, 0x324E, 0x940C, 0x3268, 0x940D, 0x3259,
- 0x940E, 0x325E, 0x940F, 0x3252, 0x9410, 0x3256, 0x9411, 0x326A,
- 0x9412, 0x3260, 0x9413, 0x324F, 0x9414, 0x3253, 0x9415, 0x3255,
- 0x9416, 0x325F, 0x9418, 0x1652, 0x9419, 0x3258, 0x9420, 0x3251,
- 0x9428, 0x3257, 0x9429, 0x3325, 0x942A, 0x3329, 0x942B, 0x169F,
- 0x942C, 0x332B, 0x942E, 0x1699, 0x9430, 0x3327, 0x9431, 0x332D,
- 0x9432, 0x169E, 0x9433, 0x169A, 0x9435, 0x169B, 0x9436, 0x3324,
- 0x9437, 0x332A, 0x9438, 0x169D, 0x9439, 0x3328, 0x943A, 0x169C,
- 0x943B, 0x3323, 0x943C, 0x3264, 0x943D, 0x3326, 0x943F, 0x3322,
- 0x9440, 0x332C, 0x9444, 0x16DF, 0x9445, 0x33CD, 0x9446, 0x33D0,
- 0x9447, 0x33CC, 0x9448, 0x33CE, 0x9449, 0x33CF, 0x944A, 0x33C9,
- 0x944B, 0x33CA, 0x944C, 0x33C7, 0x944F, 0x33CB, 0x9450, 0x33C8,
- 0x9451, 0x16E0, 0x9452, 0x16E1, 0x9455, 0x3448, 0x9457, 0x344A,
- 0x945D, 0x3449, 0x945E, 0x344B, 0x9460, 0x170E, 0x9462, 0x3447,
- 0x9463, 0x170D, 0x9464, 0x170F, 0x9468, 0x34A6, 0x9469, 0x34A7,
- 0x946A, 0x1731, 0x946B, 0x34A5, 0x946D, 0x34ED, 0x946E, 0x34EC,
- 0x946F, 0x34EE, 0x9470, 0x174C, 0x9471, 0x34EF, 0x9472, 0x174B,
- 0x9473, 0x34F0, 0x9474, 0x350C, 0x9475, 0x350F, 0x9476, 0x350E,
- 0x9477, 0x1755, 0x9478, 0x350D, 0x947C, 0x175F, 0x947D, 0x175D,
- 0x947E, 0x175E, 0x947F, 0x1764, 0x9480, 0x3539, 0x9481, 0x353A,
- 0x9482, 0x3538, 0x9483, 0x3540, 0x9577, 0x0697, 0x957A, 0x20A1,
- 0x957B, 0x234A, 0x957C, 0x2AB1, 0x957D, 0x3162, 0x9580, 0x0698,
- 0x9582, 0x0821, 0x9583, 0x09EA, 0x9586, 0x20A2, 0x9588, 0x20A3,
- 0x9589, 0x0BD0, 0x958B, 0x0D9A, 0x958C, 0x234C, 0x958D, 0x234B,
- 0x958E, 0x0D9E, 0x958F, 0x0D99, 0x9590, 0x234D, 0x9591, 0x0D9B,
- 0x9592, 0x0D9D, 0x9593, 0x0D9C, 0x9594, 0x0D98, 0x9598, 0x0F5C,
- 0x959B, 0x25F3, 0x959C, 0x25F1, 0x959E, 0x25F2, 0x959F, 0x25F0,
- 0x95A1, 0x10DF, 0x95A3, 0x10E2, 0x95A4, 0x10E4, 0x95A5, 0x10E3,
- 0x95A8, 0x10E0, 0x95A9, 0x10E1, 0x95AB, 0x2AB3, 0x95AC, 0x2AB2,
- 0x95AD, 0x1260, 0x95AE, 0x2AB4, 0x95B0, 0x2AB5, 0x95B1, 0x1261,
- 0x95B5, 0x2CF0, 0x95B6, 0x2CEE, 0x95B7, 0x2EAD, 0x95B9, 0x2CEC,
- 0x95BA, 0x2CED, 0x95BB, 0x1385, 0x95BC, 0x2CE9, 0x95BD, 0x2CF1,
- 0x95BE, 0x2CEB, 0x95BF, 0x2CEF, 0x95C0, 0x2EA9, 0x95C3, 0x2EAB,
- 0x95C5, 0x2EAC, 0x95C6, 0x14AE, 0x95C7, 0x2EA8, 0x95C8, 0x14AD,
- 0x95C9, 0x2EAA, 0x95CA, 0x14AA, 0x95CB, 0x14AB, 0x95CC, 0x14AC,
- 0x95CD, 0x2CEA, 0x95D0, 0x154C, 0x95D1, 0x301F, 0x95D2, 0x301D,
- 0x95D3, 0x301E, 0x95D4, 0x154A, 0x95D5, 0x154D, 0x95D6, 0x154B,
- 0x95DA, 0x3163, 0x95DB, 0x3164, 0x95DC, 0x15EB, 0x95DE, 0x326C,
- 0x95DF, 0x326E, 0x95E0, 0x326D, 0x95E1, 0x1655, 0x95E2, 0x16A0,
- 0x95E3, 0x3330, 0x95E4, 0x332F, 0x95E5, 0x332E, 0x961C, 0x0699,
- 0x961E, 0x17B4, 0x9620, 0x1821, 0x9621, 0x0414, 0x9622, 0x181F,
- 0x9623, 0x1822, 0x9624, 0x1820, 0x9628, 0x18F1, 0x962A, 0x0526,
- 0x962C, 0x0527, 0x962D, 0x18F3, 0x962E, 0x0524, 0x962F, 0x18F2,
- 0x9630, 0x18F0, 0x9631, 0x0525, 0x9632, 0x0523, 0x9639, 0x1A55,
- 0x963A, 0x1A58, 0x963B, 0x069C, 0x963C, 0x1A57, 0x963D, 0x1A56,
- 0x963F, 0x069B, 0x9640, 0x069A, 0x9642, 0x069E, 0x9643, 0x1A59,
- 0x9644, 0x069D, 0x964A, 0x1C1A, 0x964B, 0x0823, 0x964C, 0x0824,
- 0x964D, 0x0825, 0x964E, 0x1C1B, 0x964F, 0x1C17, 0x9650, 0x0822,
- 0x9651, 0x1C18, 0x9653, 0x1C19, 0x9654, 0x1C16, 0x9658, 0x09F1,
- 0x965B, 0x09EE, 0x965C, 0x1E2F, 0x965D, 0x09EF, 0x965E, 0x09F2,
- 0x965F, 0x1E30, 0x9661, 0x09ED, 0x9662, 0x09EB, 0x9663, 0x09EC,
- 0x9664, 0x09F0, 0x966A, 0x0BD1, 0x966B, 0x20A6, 0x966C, 0x0BD9,
- 0x966D, 0x20A5, 0x966F, 0x20A8, 0x9670, 0x0BD5, 0x9671, 0x20A7,
- 0x9672, 0x0DA6, 0x9673, 0x0BD3, 0x9674, 0x0BD6, 0x9675, 0x0BD2,
- 0x9676, 0x0BD7, 0x9677, 0x0BD8, 0x9678, 0x0BD4, 0x967C, 0x20A4,
- 0x967D, 0x0DA2, 0x967E, 0x234F, 0x9680, 0x2353, 0x9683, 0x2352,
- 0x9684, 0x0DA7, 0x9685, 0x0DA3, 0x9686, 0x0DA4, 0x9687, 0x234E,
- 0x9688, 0x2350, 0x9689, 0x2351, 0x968A, 0x0D9F, 0x968B, 0x0DA1,
- 0x968D, 0x0DA5, 0x968E, 0x0DA0, 0x9691, 0x25F6, 0x9692, 0x25F4,
- 0x9693, 0x25F5, 0x9694, 0x0F5E, 0x9695, 0x0F5F, 0x9697, 0x25F7,
- 0x9698, 0x0F5D, 0x9699, 0x10E5, 0x969B, 0x10E7, 0x969C, 0x10E6,
- 0x969E, 0x2852, 0x96A1, 0x2853, 0x96A2, 0x2AB7, 0x96A4, 0x2AB6,
- 0x96A7, 0x1386, 0x96A8, 0x1387, 0x96A9, 0x2CF2, 0x96AA, 0x1388,
- 0x96AC, 0x2EB0, 0x96AE, 0x2EAE, 0x96B0, 0x2EAF, 0x96B1, 0x14AF,
- 0x96B3, 0x3020, 0x96B4, 0x15EC, 0x96B6, 0x0231, 0x96B8, 0x14B0,
- 0x96B9, 0x069F, 0x96BB, 0x09F3, 0x96BC, 0x1E31, 0x96BF, 0x20A9,
- 0x96C0, 0x0BDA, 0x96C1, 0x0DA8, 0x96C2, 0x2354, 0x96C3, 0x2356,
- 0x96C4, 0x0DAA, 0x96C5, 0x0DA9, 0x96C6, 0x0DAB, 0x96C7, 0x0DAC,
- 0x96C8, 0x2355, 0x96C9, 0x0F62, 0x96CA, 0x0F63, 0x96CB, 0x0F61,
- 0x96CC, 0x10E8, 0x96CD, 0x0F60, 0x96CE, 0x25F8, 0x96D2, 0x10E9,
- 0x96D3, 0x2AB8, 0x96D4, 0x2CF3, 0x96D5, 0x1389, 0x96D6, 0x14B1,
- 0x96D7, 0x3021, 0x96D8, 0x3025, 0x96D9, 0x1550, 0x96DA, 0x3022,
- 0x96DB, 0x1551, 0x96DC, 0x154F, 0x96DD, 0x3026, 0x96DE, 0x1552,
- 0x96DF, 0x3024, 0x96E1, 0x3165, 0x96E2, 0x154E, 0x96E3, 0x15ED,
- 0x96E5, 0x34A8, 0x96E8, 0x06A0, 0x96E9, 0x0BDC, 0x96EA, 0x0BDB,
- 0x96EF, 0x0DAD, 0x96F0, 0x2358, 0x96F1, 0x2357, 0x96F2, 0x0DAE,
- 0x96F5, 0x25FC, 0x96F6, 0x0F67, 0x96F7, 0x0F64, 0x96F8, 0x25FB,
- 0x96F9, 0x0F66, 0x96FA, 0x25F9, 0x96FB, 0x0F65, 0x96FD, 0x25FA,
- 0x96FF, 0x2854, 0x9700, 0x10EA, 0x9702, 0x2ABB, 0x9704, 0x1262,
- 0x9705, 0x2AB9, 0x9706, 0x1263, 0x9707, 0x1264, 0x9708, 0x2ABA,
- 0x9709, 0x1265, 0x970B, 0x2CF4, 0x970D, 0x138D, 0x970E, 0x138A,
- 0x970F, 0x138F, 0x9710, 0x2CF6, 0x9711, 0x138B, 0x9712, 0x2CF5,
- 0x9713, 0x138E, 0x9716, 0x138C, 0x9718, 0x2EB3, 0x9719, 0x2EB5,
- 0x971C, 0x14B2, 0x971D, 0x2EB4, 0x971E, 0x14B3, 0x971F, 0x2EB2,
- 0x9720, 0x2EB1, 0x9722, 0x3028, 0x9723, 0x3027, 0x9724, 0x1553,
- 0x9725, 0x3029, 0x9726, 0x316A, 0x9727, 0x15EF, 0x9728, 0x3169,
- 0x9729, 0x3166, 0x972A, 0x15EE, 0x972B, 0x3167, 0x972C, 0x3168,
- 0x972E, 0x326F, 0x972F, 0x3270, 0x9730, 0x1656, 0x9732, 0x16A3,
- 0x9735, 0x3331, 0x9738, 0x16A1, 0x9739, 0x16A2, 0x973A, 0x3332,
- 0x973D, 0x16E2, 0x973E, 0x16E3, 0x973F, 0x33D1, 0x9742, 0x1732,
- 0x9743, 0x34AA, 0x9744, 0x1734, 0x9746, 0x34A9, 0x9747, 0x34AB,
- 0x9748, 0x1733, 0x9749, 0x34F1, 0x974B, 0x3526, 0x9752, 0x06A1,
- 0x9756, 0x0F68, 0x9758, 0x2855, 0x975A, 0x2ABC, 0x975B, 0x1390,
- 0x975C, 0x1391, 0x975E, 0x06A2, 0x9760, 0x1266, 0x9761, 0x15F0,
- 0x9762, 0x0826, 0x9766, 0x1392, 0x9768, 0x1710, 0x9769, 0x0827,
- 0x976A, 0x20AA, 0x976C, 0x2359, 0x976E, 0x235B, 0x9770, 0x235A,
- 0x9772, 0x2600, 0x9773, 0x25FD, 0x9774, 0x0F69, 0x9776, 0x0F6A,
- 0x9777, 0x25FE, 0x9778, 0x25FF, 0x977A, 0x2857, 0x977B, 0x285C,
- 0x977C, 0x10EB, 0x977D, 0x2856, 0x977E, 0x2858, 0x977F, 0x285F,
- 0x9780, 0x285A, 0x9781, 0x285E, 0x9782, 0x285B, 0x9783, 0x2859,
- 0x9784, 0x285D, 0x9785, 0x10EC, 0x9788, 0x2ABF, 0x978A, 0x2ABD,
- 0x978B, 0x1268, 0x978D, 0x1267, 0x978E, 0x2ABE, 0x978F, 0x1269,
- 0x9794, 0x2CF9, 0x9797, 0x2CF8, 0x9798, 0x1393, 0x9799, 0x2CF7,
- 0x979A, 0x2EB6, 0x979C, 0x2EB8, 0x979D, 0x2EBA, 0x979E, 0x2EB9,
- 0x97A0, 0x14B4, 0x97A1, 0x2EB7, 0x97A2, 0x3030, 0x97A3, 0x1554,
- 0x97A4, 0x302E, 0x97A5, 0x3031, 0x97A6, 0x1555, 0x97A8, 0x302C,
- 0x97AA, 0x302F, 0x97AB, 0x302D, 0x97AC, 0x302A, 0x97AD, 0x1556,
- 0x97AE, 0x302B, 0x97B3, 0x316B, 0x97B6, 0x316D, 0x97B7, 0x316C,
- 0x97B9, 0x3271, 0x97BB, 0x3272, 0x97BF, 0x3333, 0x97C1, 0x16E5,
- 0x97C3, 0x16E4, 0x97C4, 0x344C, 0x97C5, 0x344D, 0x97C6, 0x1735,
- 0x97C7, 0x34AC, 0x97C9, 0x1756, 0x97CB, 0x0828, 0x97CC, 0x0DAF,
- 0x97CD, 0x2861, 0x97CE, 0x2860, 0x97CF, 0x2AC1, 0x97D0, 0x2AC0,
- 0x97D3, 0x14B5, 0x97D4, 0x2EBC, 0x97D5, 0x2EBB, 0x97D6, 0x3034,
- 0x97D7, 0x3032, 0x97D8, 0x3035, 0x97D9, 0x3033, 0x97DC, 0x15F1,
- 0x97DD, 0x316E, 0x97DE, 0x316F, 0x97DF, 0x3170, 0x97E1, 0x3334,
- 0x97E3, 0x33D2, 0x97E5, 0x34AD, 0x97ED, 0x0829, 0x97F0, 0x2CFA,
- 0x97F1, 0x2EBD, 0x97F3, 0x082A, 0x97F6, 0x10ED, 0x97F8, 0x2CFB,
- 0x97F9, 0x1557, 0x97FA, 0x3036, 0x97FB, 0x15F2, 0x97FD, 0x3273,
- 0x97FE, 0x3274, 0x97FF, 0x16A4, 0x9800, 0x344E, 0x9801, 0x082B,
- 0x9802, 0x0BDF, 0x9803, 0x0BE0, 0x9804, 0x20AB, 0x9805, 0x0DB0,
- 0x9806, 0x0DB1, 0x9807, 0x235C, 0x9808, 0x0DB2, 0x980A, 0x0F6E,
- 0x980C, 0x0F70, 0x980D, 0x2602, 0x980E, 0x2603, 0x980F, 0x2601,
- 0x9810, 0x0F6B, 0x9811, 0x0F6C, 0x9812, 0x0F6F, 0x9813, 0x0F6D,
- 0x9816, 0x2862, 0x9817, 0x10EE, 0x9818, 0x10EF, 0x981B, 0x2AC8,
- 0x981C, 0x126C, 0x981D, 0x2AC3, 0x981E, 0x2AC2, 0x9820, 0x2AC7,
- 0x9821, 0x126A, 0x9824, 0x139A, 0x9826, 0x2AC4, 0x9827, 0x2AC9,
- 0x9828, 0x2AC6, 0x9829, 0x2AC5, 0x982B, 0x126B, 0x982D, 0x1398,
- 0x982F, 0x2CFD, 0x9830, 0x1394, 0x9832, 0x2CFE, 0x9835, 0x2CFC,
- 0x9837, 0x1397, 0x9838, 0x1395, 0x9839, 0x1399, 0x983B, 0x1396,
- 0x9841, 0x2EBE, 0x9843, 0x2EC3, 0x9844, 0x2EBF, 0x9845, 0x2EC2,
- 0x9846, 0x14B6, 0x9848, 0x2DF2, 0x9849, 0x2EC1, 0x984A, 0x2EC0,
- 0x984C, 0x155A, 0x984D, 0x1558, 0x984E, 0x155B, 0x984F, 0x1559,
- 0x9850, 0x3037, 0x9851, 0x3038, 0x9852, 0x3039, 0x9853, 0x155C,
- 0x9857, 0x3174, 0x9858, 0x15F4, 0x9859, 0x3172, 0x985B, 0x15F5,
- 0x985C, 0x3171, 0x985D, 0x3173, 0x985E, 0x15F3, 0x985F, 0x3278,
- 0x9860, 0x3275, 0x9862, 0x3276, 0x9863, 0x3277, 0x9864, 0x3335,
- 0x9865, 0x16A6, 0x9867, 0x16A5, 0x9869, 0x33D4, 0x986A, 0x33D3,
- 0x986B, 0x16E6, 0x986F, 0x1711, 0x9870, 0x1736, 0x9871, 0x174D,
- 0x9872, 0x34F2, 0x9873, 0x3527, 0x9874, 0x3528, 0x98A8, 0x082C,
- 0x98A9, 0x235D, 0x98AC, 0x2604, 0x98AD, 0x2863, 0x98AE, 0x2864,
- 0x98AF, 0x10F0, 0x98B1, 0x10F1, 0x98B2, 0x2ACA, 0x98B3, 0x126D,
- 0x98B6, 0x14B7, 0x98B8, 0x303A, 0x98BA, 0x155D, 0x98BB, 0x3177,
- 0x98BC, 0x15F6, 0x98BD, 0x3176, 0x98BE, 0x3178, 0x98BF, 0x3175,
- 0x98C0, 0x3338, 0x98C1, 0x3279, 0x98C2, 0x327A, 0x98C4, 0x1657,
- 0x98C6, 0x3337, 0x98C9, 0x3336, 0x98CB, 0x33D5, 0x98CC, 0x3529,
- 0x98DB, 0x082D, 0x98DF, 0x082E, 0x98E2, 0x09F4, 0x98E3, 0x1E32,
- 0x98E5, 0x20AC, 0x98E7, 0x0DB3, 0x98E9, 0x0DB6, 0x98EA, 0x0DB4,
- 0x98EB, 0x235E, 0x98ED, 0x0DB8, 0x98EF, 0x0DB5, 0x98F2, 0x0DB7,
- 0x98F4, 0x0F72, 0x98F6, 0x2605, 0x98F9, 0x2606, 0x98FA, 0x2ACC,
- 0x98FC, 0x0F71, 0x98FD, 0x0F73, 0x98FE, 0x0F74, 0x9900, 0x2866,
- 0x9902, 0x2865, 0x9903, 0x10F2, 0x9905, 0x10F3, 0x9907, 0x2867,
- 0x9908, 0x2ACB, 0x9909, 0x10F5, 0x990A, 0x126E, 0x990C, 0x10F4,
- 0x9910, 0x139B, 0x9911, 0x2ACD, 0x9912, 0x1270, 0x9913, 0x126F,
- 0x9914, 0x2ACE, 0x9915, 0x2AD1, 0x9916, 0x2ACF, 0x9917, 0x2AD0,
- 0x9918, 0x1271, 0x991A, 0x13A0, 0x991B, 0x139E, 0x991E, 0x139D,
- 0x991F, 0x2D00, 0x9921, 0x139F, 0x9924, 0x2CFF, 0x9925, 0x2EC4,
- 0x9927, 0x2D01, 0x9928, 0x139C, 0x9929, 0x2D02, 0x992A, 0x2EC7,
- 0x992B, 0x2EC5, 0x992C, 0x2EC6, 0x992D, 0x2ECB, 0x992E, 0x1561,
- 0x992F, 0x2ECA, 0x9930, 0x2ECD, 0x9931, 0x2ECC, 0x9932, 0x2EC9,
- 0x9933, 0x2EC8, 0x9935, 0x14B8, 0x993A, 0x303D, 0x993C, 0x303C,
- 0x993D, 0x1560, 0x993E, 0x155E, 0x993F, 0x155F, 0x9941, 0x303B,
- 0x9943, 0x317B, 0x9945, 0x15F7, 0x9947, 0x317A, 0x9948, 0x3179,
- 0x9949, 0x15F8, 0x994B, 0x327F, 0x994C, 0x327E, 0x994E, 0x327C,
- 0x9950, 0x327B, 0x9951, 0x1659, 0x9952, 0x1658, 0x9953, 0x3280,
- 0x9954, 0x33D6, 0x9955, 0x16E7, 0x9956, 0x333A, 0x9957, 0x16A7,
- 0x9958, 0x3339, 0x9959, 0x327D, 0x995B, 0x33D7, 0x995C, 0x1712,
- 0x995E, 0x174E, 0x995F, 0x34F3, 0x9961, 0x352A, 0x9996, 0x082F,
- 0x9997, 0x20AD, 0x9998, 0x2ECE, 0x9999, 0x0830, 0x999C, 0x2869,
- 0x999D, 0x2868, 0x999E, 0x2D03, 0x99A1, 0x2ED0, 0x99A3, 0x2ECF,
- 0x99A5, 0x1562, 0x99A6, 0x317C, 0x99A7, 0x317D, 0x99A8, 0x165A,
- 0x99AB, 0x352B, 0x99AC, 0x09F5, 0x99AD, 0x0DBA, 0x99AE, 0x0DB9,
- 0x99AF, 0x2607, 0x99B0, 0x2609, 0x99B1, 0x0F76, 0x99B2, 0x2608,
- 0x99B3, 0x0F75, 0x99B4, 0x0F77, 0x99B5, 0x260A, 0x99B9, 0x286B,
- 0x99BA, 0x286D, 0x99BB, 0x286C, 0x99BD, 0x286F, 0x99C1, 0x10F6,
- 0x99C2, 0x286E, 0x99C3, 0x286A, 0x99C7, 0x2870, 0x99C9, 0x2AD8,
- 0x99CB, 0x2ADB, 0x99CC, 0x2ADD, 0x99CD, 0x2AD3, 0x99CE, 0x2AD7,
- 0x99CF, 0x2AD4, 0x99D0, 0x1273, 0x99D1, 0x1276, 0x99D2, 0x1278,
- 0x99D3, 0x2AD5, 0x99D4, 0x2AD6, 0x99D5, 0x1277, 0x99D6, 0x2AD9,
- 0x99D7, 0x2ADC, 0x99D8, 0x2ADA, 0x99D9, 0x1279, 0x99DB, 0x1275,
- 0x99DC, 0x2AD2, 0x99DD, 0x1272, 0x99DF, 0x1274, 0x99E2, 0x13A2,
- 0x99E3, 0x2D09, 0x99E4, 0x2D07, 0x99E5, 0x2D06, 0x99E7, 0x2D0C,
- 0x99E9, 0x2D0B, 0x99EA, 0x2D0A, 0x99EC, 0x2D05, 0x99ED, 0x13A1,
- 0x99EE, 0x2D04, 0x99F0, 0x2D08, 0x99F1, 0x13A3, 0x99F4, 0x2ED3,
- 0x99F6, 0x2ED7, 0x99F7, 0x2ED4, 0x99F8, 0x2ED6, 0x99F9, 0x2ED5,
- 0x99FA, 0x2ED2, 0x99FB, 0x2ED8, 0x99FC, 0x2EDB, 0x99FD, 0x2ED9,
- 0x99FE, 0x2EDA, 0x99FF, 0x14BA, 0x9A01, 0x14B9, 0x9A02, 0x2ED1,
- 0x9A03, 0x2EDC, 0x9A04, 0x3042, 0x9A05, 0x3045, 0x9A06, 0x3047,
- 0x9A07, 0x3046, 0x9A09, 0x3040, 0x9A0A, 0x3044, 0x9A0B, 0x303F,
- 0x9A0D, 0x3041, 0x9A0E, 0x1563, 0x9A0F, 0x303E, 0x9A11, 0x3043,
- 0x9A14, 0x318A, 0x9A15, 0x317F, 0x9A16, 0x15F9, 0x9A19, 0x15FA,
- 0x9A1A, 0x317E, 0x9A1B, 0x3183, 0x9A1C, 0x3189, 0x9A1D, 0x3181,
- 0x9A1E, 0x3188, 0x9A20, 0x3185, 0x9A22, 0x3184, 0x9A23, 0x3187,
- 0x9A24, 0x3182, 0x9A25, 0x3180, 0x9A27, 0x3186, 0x9A29, 0x3287,
- 0x9A2A, 0x3285, 0x9A2B, 0x165B, 0x9A2C, 0x3284, 0x9A2D, 0x328A,
- 0x9A2E, 0x3288, 0x9A30, 0x165C, 0x9A31, 0x3283, 0x9A32, 0x3281,
- 0x9A34, 0x3282, 0x9A35, 0x165E, 0x9A36, 0x3286, 0x9A37, 0x165D,
- 0x9A38, 0x3289, 0x9A39, 0x333B, 0x9A3A, 0x3341, 0x9A3D, 0x333C,
- 0x9A3E, 0x16AB, 0x9A3F, 0x3342, 0x9A40, 0x16AA, 0x9A41, 0x3340,
- 0x9A42, 0x333F, 0x9A43, 0x16A9, 0x9A44, 0x333E, 0x9A45, 0x16A8,
- 0x9A46, 0x333D, 0x9A48, 0x33DD, 0x9A49, 0x33DF, 0x9A4A, 0x33DE,
- 0x9A4C, 0x33DB, 0x9A4D, 0x16E9, 0x9A4E, 0x33D8, 0x9A4F, 0x33DC,
- 0x9A50, 0x33E1, 0x9A52, 0x33E0, 0x9A53, 0x33D9, 0x9A54, 0x33DA,
- 0x9A55, 0x16E8, 0x9A56, 0x344F, 0x9A57, 0x1715, 0x9A59, 0x3450,
- 0x9A5A, 0x1713, 0x9A5B, 0x1714, 0x9A5E, 0x34AE, 0x9A5F, 0x1737,
- 0x9A60, 0x3510, 0x9A62, 0x1757, 0x9A64, 0x352C, 0x9A65, 0x1758,
- 0x9A66, 0x352D, 0x9A67, 0x352E, 0x9A68, 0x353C, 0x9A69, 0x353B,
- 0x9A6A, 0x1767, 0x9A6B, 0x3544, 0x9AA8, 0x09F6, 0x9AAB, 0x260C,
- 0x9AAD, 0x260B, 0x9AAF, 0x10F7, 0x9AB0, 0x10F8, 0x9AB1, 0x2871,
- 0x9AB3, 0x2ADE, 0x9AB4, 0x2D0F, 0x9AB7, 0x127A, 0x9AB8, 0x13A4,
- 0x9AB9, 0x2D0D, 0x9ABB, 0x2D10, 0x9ABC, 0x13A5, 0x9ABE, 0x2EDD,
- 0x9ABF, 0x2D0E, 0x9AC0, 0x3048, 0x9AC1, 0x1564, 0x9AC2, 0x318B,
- 0x9AC6, 0x328D, 0x9AC7, 0x328B, 0x9ACA, 0x328C, 0x9ACD, 0x3343,
- 0x9ACF, 0x16AC, 0x9AD0, 0x33E2, 0x9AD1, 0x1718, 0x9AD2, 0x16EA,
- 0x9AD3, 0x1716, 0x9AD4, 0x1717, 0x9AD5, 0x34AF, 0x9AD6, 0x174F,
- 0x9AD8, 0x09F7, 0x9ADC, 0x3049, 0x9ADF, 0x1E33, 0x9AE1, 0x0F78,
- 0x9AE3, 0x2872, 0x9AE6, 0x10F9, 0x9AE7, 0x2873, 0x9AEB, 0x2AE0,
- 0x9AEC, 0x2ADF, 0x9AED, 0x13A7, 0x9AEE, 0x127B, 0x9AEF, 0x127C,
- 0x9AF1, 0x2AE3, 0x9AF2, 0x2AE2, 0x9AF3, 0x2AE1, 0x9AF6, 0x2D11,
- 0x9AF7, 0x2D14, 0x9AF9, 0x2D13, 0x9AFA, 0x2D12, 0x9AFB, 0x13A6,
- 0x9AFC, 0x2EE1, 0x9AFD, 0x2EDF, 0x9AFE, 0x2EDE, 0x9B01, 0x2EE0,
- 0x9B03, 0x1565, 0x9B04, 0x304B, 0x9B05, 0x304C, 0x9B06, 0x1566,
- 0x9B08, 0x304A, 0x9B0A, 0x318D, 0x9B0B, 0x318C, 0x9B0C, 0x318F,
- 0x9B0D, 0x15FB, 0x9B0E, 0x318E, 0x9B10, 0x328E, 0x9B11, 0x3290,
- 0x9B12, 0x328F, 0x9B15, 0x3344, 0x9B16, 0x3347, 0x9B17, 0x3345,
- 0x9B18, 0x3346, 0x9B19, 0x33E3, 0x9B1A, 0x16EB, 0x9B1E, 0x3451,
- 0x9B1F, 0x3452, 0x9B20, 0x3453, 0x9B22, 0x1738, 0x9B23, 0x1750,
- 0x9B24, 0x352F, 0x9B25, 0x09F8, 0x9B27, 0x127D, 0x9B28, 0x13A8,
- 0x9B29, 0x304D, 0x9B2B, 0x33E4, 0x9B2E, 0x3511, 0x9B2F, 0x1E34,
- 0x9B31, 0x1768, 0x9B32, 0x09F9, 0x9B33, 0x2D15, 0x9B35, 0x304E,
- 0x9B37, 0x3190, 0x9B3A, 0x3348, 0x9B3B, 0x33E5, 0x9B3C, 0x09FA,
- 0x9B3E, 0x2874, 0x9B3F, 0x2875, 0x9B41, 0x10FA, 0x9B42, 0x10FB,
- 0x9B43, 0x2AE5, 0x9B44, 0x127F, 0x9B45, 0x127E, 0x9B46, 0x2AE4,
- 0x9B48, 0x2EE2, 0x9B4A, 0x304F, 0x9B4B, 0x3051, 0x9B4C, 0x3050,
- 0x9B4D, 0x1569, 0x9B4E, 0x1568, 0x9B4F, 0x1567, 0x9B51, 0x16AE,
- 0x9B52, 0x3349, 0x9B54, 0x16AD, 0x9B55, 0x33E7, 0x9B56, 0x33E6,
- 0x9B58, 0x1739, 0x9B59, 0x34B0, 0x9B5A, 0x0BE1, 0x9B5B, 0x260D,
- 0x9B5F, 0x2878, 0x9B60, 0x2876, 0x9B61, 0x2877, 0x9B64, 0x2AEE,
- 0x9B66, 0x2AE9, 0x9B67, 0x2AE6, 0x9B68, 0x2AED, 0x9B6C, 0x2AEF,
- 0x9B6F, 0x1281, 0x9B70, 0x2AEC, 0x9B71, 0x2AE8, 0x9B74, 0x2AE7,
- 0x9B75, 0x2AEB, 0x9B76, 0x2AEA, 0x9B77, 0x1280, 0x9B7A, 0x2D20,
- 0x9B7B, 0x2D1B, 0x9B7C, 0x2D19, 0x9B7D, 0x2D22, 0x9B7E, 0x2D1A,
- 0x9B80, 0x2D16, 0x9B82, 0x2D1C, 0x9B85, 0x2D17, 0x9B86, 0x2EEB,
- 0x9B87, 0x2D18, 0x9B88, 0x2D23, 0x9B90, 0x2D1F, 0x9B91, 0x13A9,
- 0x9B92, 0x2D1E, 0x9B93, 0x2D1D, 0x9B95, 0x2D21, 0x9B9A, 0x2EE3,
- 0x9B9B, 0x2EE6, 0x9B9E, 0x2EE5, 0x9BA0, 0x2EED, 0x9BA1, 0x2EE8,
- 0x9BA2, 0x2EEC, 0x9BA4, 0x2EEA, 0x9BA5, 0x2EE9, 0x9BA6, 0x2EE7,
- 0x9BA8, 0x2EE4, 0x9BAA, 0x14BD, 0x9BAB, 0x14BC, 0x9BAD, 0x14BE,
- 0x9BAE, 0x14BB, 0x9BAF, 0x2EEE, 0x9BB5, 0x3057, 0x9BB6, 0x305A,
- 0x9BB8, 0x3058, 0x9BB9, 0x305C, 0x9BBD, 0x305D, 0x9BBF, 0x3055,
- 0x9BC0, 0x156E, 0x9BC1, 0x3056, 0x9BC3, 0x3054, 0x9BC4, 0x305B,
- 0x9BC6, 0x3053, 0x9BC7, 0x3052, 0x9BC8, 0x156D, 0x9BC9, 0x156B,
- 0x9BCA, 0x156A, 0x9BD3, 0x3059, 0x9BD4, 0x3199, 0x9BD5, 0x319F,
- 0x9BD6, 0x15FE, 0x9BD7, 0x319A, 0x9BD9, 0x319D, 0x9BDA, 0x31A1,
- 0x9BDB, 0x15FF, 0x9BDC, 0x319C, 0x9BDE, 0x3194, 0x9BE0, 0x3193,
- 0x9BE1, 0x31A0, 0x9BE2, 0x3197, 0x9BE4, 0x3195, 0x9BE5, 0x319E,
- 0x9BE6, 0x3196, 0x9BE7, 0x15FD, 0x9BE8, 0x15FC, 0x9BEA, 0x3191,
- 0x9BEB, 0x3192, 0x9BEC, 0x319B, 0x9BF0, 0x3198, 0x9BF7, 0x3293,
- 0x9BF8, 0x3296, 0x9BFD, 0x156C, 0x9C05, 0x3294, 0x9C06, 0x329A,
- 0x9C07, 0x3298, 0x9C08, 0x3292, 0x9C09, 0x329D, 0x9C0B, 0x3291,
- 0x9C0D, 0x1660, 0x9C0E, 0x3299, 0x9C12, 0x3295, 0x9C13, 0x165F,
- 0x9C14, 0x329C, 0x9C17, 0x329B, 0x9C1C, 0x334C, 0x9C1D, 0x334B,
- 0x9C21, 0x3352, 0x9C23, 0x334E, 0x9C24, 0x3351, 0x9C25, 0x16B0,
- 0x9C28, 0x334F, 0x9C29, 0x3350, 0x9C2B, 0x334A, 0x9C2C, 0x334D,
- 0x9C2D, 0x16AF, 0x9C31, 0x16ED, 0x9C32, 0x33F2, 0x9C33, 0x33ED,
- 0x9C34, 0x33F1, 0x9C36, 0x33F4, 0x9C37, 0x33F0, 0x9C39, 0x33EC,
- 0x9C3B, 0x16EF, 0x9C3C, 0x33EF, 0x9C3D, 0x33F3, 0x9C3E, 0x16EE,
- 0x9C3F, 0x33EA, 0x9C40, 0x3297, 0x9C41, 0x33EE, 0x9C44, 0x33EB,
- 0x9C46, 0x33E8, 0x9C48, 0x33E9, 0x9C49, 0x16EC, 0x9C4A, 0x3457,
- 0x9C4B, 0x3459, 0x9C4C, 0x345C, 0x9C4D, 0x3458, 0x9C4E, 0x345D,
- 0x9C50, 0x3456, 0x9C52, 0x3454, 0x9C54, 0x1719, 0x9C55, 0x345A,
- 0x9C56, 0x171B, 0x9C57, 0x171A, 0x9C58, 0x3455, 0x9C59, 0x345B,
- 0x9C5E, 0x34B5, 0x9C5F, 0x173A, 0x9C60, 0x34B6, 0x9C62, 0x34B4,
- 0x9C63, 0x34B1, 0x9C66, 0x34B3, 0x9C67, 0x34B2, 0x9C68, 0x34F4,
- 0x9C6D, 0x34F6, 0x9C6E, 0x34F5, 0x9C71, 0x3514, 0x9C73, 0x3513,
- 0x9C74, 0x3512, 0x9C75, 0x3515, 0x9C77, 0x1760, 0x9C78, 0x1761,
- 0x9C79, 0x3541, 0x9C7A, 0x3545, 0x9CE5, 0x0BE2, 0x9CE6, 0x235F,
- 0x9CE7, 0x2610, 0x9CE9, 0x0F79, 0x9CEA, 0x260E, 0x9CED, 0x260F,
- 0x9CF1, 0x2879, 0x9CF2, 0x287A, 0x9CF3, 0x10FE, 0x9CF4, 0x10FC,
- 0x9CF5, 0x287B, 0x9CF6, 0x10FD, 0x9CF7, 0x2AF4, 0x9CF9, 0x2AF7,
- 0x9CFA, 0x2AF1, 0x9CFB, 0x2AF8, 0x9CFC, 0x2AF0, 0x9CFD, 0x2AF2,
- 0x9CFF, 0x2AF3, 0x9D00, 0x2AF6, 0x9D03, 0x1284, 0x9D04, 0x2AFB,
- 0x9D05, 0x2AFA, 0x9D06, 0x1282, 0x9D07, 0x2AF5, 0x9D08, 0x2AF9,
- 0x9D09, 0x1283, 0x9D10, 0x2D2D, 0x9D12, 0x13AE, 0x9D14, 0x2D28,
- 0x9D15, 0x13AA, 0x9D17, 0x2D25, 0x9D18, 0x2D2B, 0x9D19, 0x2D2E,
- 0x9D1B, 0x13AF, 0x9D1D, 0x2D2A, 0x9D1E, 0x2D27, 0x9D1F, 0x2D2F,
- 0x9D20, 0x2D26, 0x9D22, 0x2D2C, 0x9D23, 0x13AB, 0x9D25, 0x2D24,
- 0x9D26, 0x13AC, 0x9D28, 0x13AD, 0x9D29, 0x2D29, 0x9D2D, 0x2F00,
- 0x9D2E, 0x2EF3, 0x9D2F, 0x2EF4, 0x9D30, 0x2EF7, 0x9D31, 0x2EF5,
- 0x9D33, 0x2EEF, 0x9D36, 0x2EF2, 0x9D37, 0x2EFC, 0x9D38, 0x2EF6,
- 0x9D3B, 0x14BF, 0x9D3D, 0x2EFE, 0x9D3E, 0x2EFB, 0x9D3F, 0x14C0,
- 0x9D40, 0x2EFD, 0x9D41, 0x2EF0, 0x9D42, 0x2EF9, 0x9D43, 0x2EFA,
- 0x9D45, 0x2EF8, 0x9D4A, 0x3061, 0x9D4B, 0x3063, 0x9D4C, 0x3066,
- 0x9D4F, 0x3060, 0x9D51, 0x156F, 0x9D52, 0x3068, 0x9D53, 0x305F,
- 0x9D54, 0x3069, 0x9D56, 0x3065, 0x9D57, 0x3067, 0x9D58, 0x306B,
- 0x9D59, 0x3064, 0x9D5A, 0x306C, 0x9D5B, 0x3062, 0x9D5C, 0x305E,
- 0x9D5D, 0x1570, 0x9D5F, 0x306A, 0x9D60, 0x1571, 0x9D61, 0x1601,
- 0x9D67, 0x2EF1, 0x9D68, 0x31BB, 0x9D69, 0x31B2, 0x9D6A, 0x1603,
- 0x9D6B, 0x31AE, 0x9D6C, 0x1604, 0x9D6F, 0x31B7, 0x9D70, 0x31B1,
- 0x9D71, 0x31A7, 0x9D72, 0x1602, 0x9D73, 0x31B4, 0x9D74, 0x31AF,
- 0x9D75, 0x31B0, 0x9D77, 0x31A2, 0x9D78, 0x31A9, 0x9D79, 0x31B8,
- 0x9D7B, 0x31B5, 0x9D7D, 0x31AD, 0x9D7F, 0x31B9, 0x9D80, 0x31A8,
- 0x9D81, 0x31A3, 0x9D82, 0x31B6, 0x9D84, 0x31A5, 0x9D85, 0x31B3,
- 0x9D86, 0x31AA, 0x9D87, 0x31BA, 0x9D88, 0x31A6, 0x9D89, 0x1600,
- 0x9D8A, 0x31A4, 0x9D8B, 0x31AB, 0x9D8C, 0x31AC, 0x9D90, 0x32A4,
- 0x9D92, 0x32A2, 0x9D94, 0x32A7, 0x9D96, 0x32B3, 0x9D97, 0x32AA,
- 0x9D98, 0x32A3, 0x9D99, 0x329F, 0x9D9A, 0x32AC, 0x9D9B, 0x32A5,
- 0x9D9C, 0x32A8, 0x9D9D, 0x32A1, 0x9D9E, 0x32AF, 0x9D9F, 0x329E,
- 0x9DA0, 0x32A6, 0x9DA1, 0x32AB, 0x9DA2, 0x32AD, 0x9DA3, 0x32B0,
- 0x9DA4, 0x32A0, 0x9DA6, 0x32B4, 0x9DA7, 0x32B5, 0x9DA8, 0x32AE,
- 0x9DA9, 0x32B2, 0x9DAA, 0x32A9, 0x9DAC, 0x3362, 0x9DAD, 0x3365,
- 0x9DAF, 0x16B1, 0x9DB1, 0x3364, 0x9DB2, 0x3369, 0x9DB3, 0x3367,
- 0x9DB4, 0x16B2, 0x9DB5, 0x335E, 0x9DB6, 0x3354, 0x9DB7, 0x3353,
- 0x9DB8, 0x16B4, 0x9DB9, 0x3360, 0x9DBA, 0x3361, 0x9DBB, 0x335D,
- 0x9DBC, 0x3355, 0x9DBE, 0x335A, 0x9DBF, 0x32B1, 0x9DC1, 0x3356,
- 0x9DC2, 0x16B3, 0x9DC3, 0x335C, 0x9DC5, 0x335B, 0x9DC7, 0x3357,
- 0x9DC8, 0x3363, 0x9DCA, 0x3358, 0x9DCB, 0x33F9, 0x9DCC, 0x3366,
- 0x9DCD, 0x3368, 0x9DCE, 0x335F, 0x9DCF, 0x3359, 0x9DD0, 0x33FA,
- 0x9DD1, 0x33FC, 0x9DD2, 0x33F6, 0x9DD3, 0x16F0, 0x9DD5, 0x3403,
- 0x9DD6, 0x3401, 0x9DD7, 0x16F1, 0x9DD8, 0x3400, 0x9DD9, 0x33FF,
- 0x9DDA, 0x33F8, 0x9DDB, 0x33F5, 0x9DDC, 0x33FB, 0x9DDD, 0x3404,
- 0x9DDE, 0x33F7, 0x9DDF, 0x33FD, 0x9DE1, 0x3466, 0x9DE2, 0x346B,
- 0x9DE3, 0x3461, 0x9DE4, 0x3464, 0x9DE5, 0x171C, 0x9DE6, 0x3468,
- 0x9DE8, 0x346F, 0x9DE9, 0x33FE, 0x9DEB, 0x3462, 0x9DEC, 0x346C,
- 0x9DED, 0x3470, 0x9DEE, 0x3467, 0x9DEF, 0x3460, 0x9DF0, 0x346A,
- 0x9DF2, 0x3469, 0x9DF3, 0x346E, 0x9DF4, 0x346D, 0x9DF5, 0x3402,
- 0x9DF6, 0x3465, 0x9DF7, 0x345F, 0x9DF8, 0x3463, 0x9DF9, 0x173B,
- 0x9DFA, 0x173C, 0x9DFB, 0x345E, 0x9DFD, 0x34C1, 0x9DFE, 0x34B8,
- 0x9DFF, 0x34C0, 0x9E00, 0x34BD, 0x9E01, 0x34BE, 0x9E02, 0x34B7,
- 0x9E03, 0x34BA, 0x9E04, 0x34C2, 0x9E05, 0x34BC, 0x9E06, 0x34BB,
- 0x9E07, 0x34B9, 0x9E09, 0x34BF, 0x9E0B, 0x34F7, 0x9E0D, 0x34F8,
- 0x9E0F, 0x34FA, 0x9E10, 0x34F9, 0x9E11, 0x34FC, 0x9E12, 0x34FB,
- 0x9E13, 0x3517, 0x9E14, 0x3516, 0x9E15, 0x3530, 0x9E17, 0x3531,
- 0x9E19, 0x353D, 0x9E1A, 0x1765, 0x9E1B, 0x1769, 0x9E1D, 0x3546,
- 0x9E1E, 0x176A, 0x9E75, 0x0BE3, 0x9E79, 0x1661, 0x9E7A, 0x336A,
- 0x9E7C, 0x173D, 0x9E7D, 0x173E, 0x9E7F, 0x0BE4, 0x9E80, 0x2611,
- 0x9E82, 0x0F7A, 0x9E83, 0x2AFC, 0x9E86, 0x2D31, 0x9E87, 0x2D32,
- 0x9E88, 0x2D30, 0x9E89, 0x2F02, 0x9E8A, 0x2F01, 0x9E8B, 0x14C1,
- 0x9E8C, 0x306E, 0x9E8D, 0x2F03, 0x9E8E, 0x306D, 0x9E91, 0x31BD,
- 0x9E92, 0x1605, 0x9E93, 0x1607, 0x9E94, 0x31BC, 0x9E97, 0x1606,
- 0x9E99, 0x32B6, 0x9E9A, 0x32B8, 0x9E9B, 0x32B7, 0x9E9C, 0x336B,
- 0x9E9D, 0x16B5, 0x9E9F, 0x171D, 0x9EA0, 0x34C3, 0x9EA1, 0x34FD,
- 0x9EA4, 0x354A, 0x9EA5, 0x0BE5, 0x9EA7, 0x287C, 0x9EA9, 0x1285,
- 0x9EAD, 0x2D34, 0x9EAE, 0x2D33, 0x9EB0, 0x2F04, 0x9EB4, 0x1608,
- 0x9EB5, 0x1662, 0x9EB6, 0x3405, 0x9EB7, 0x3542, 0x9EBB, 0x0BE6,
- 0x9EBC, 0x10FF, 0x9EBE, 0x1286, 0x9EC0, 0x31BE, 0x9EC2, 0x3471,
- 0x9EC3, 0x0DBB, 0x9EC8, 0x2F05, 0x9ECC, 0x1751, 0x9ECD, 0x0DBC,
- 0x9ECE, 0x1287, 0x9ECF, 0x14C2, 0x9ED0, 0x3472, 0x9ED1, 0x0DBD,
- 0x9ED3, 0x2AFD, 0x9ED4, 0x13B1, 0x9ED5, 0x2D35, 0x9ED6, 0x2D36,
- 0x9ED8, 0x13B0, 0x9EDA, 0x2F06, 0x9EDB, 0x14C6, 0x9EDC, 0x14C4,
- 0x9EDD, 0x14C5, 0x9EDE, 0x14C3, 0x9EDF, 0x306F, 0x9EE0, 0x1572,
- 0x9EE4, 0x32BA, 0x9EE5, 0x32B9, 0x9EE6, 0x32BC, 0x9EE7, 0x32BB,
- 0x9EE8, 0x1663, 0x9EEB, 0x336C, 0x9EED, 0x336E, 0x9EEE, 0x336D,
- 0x9EEF, 0x16B6, 0x9EF0, 0x3406, 0x9EF2, 0x3473, 0x9EF3, 0x3474,
- 0x9EF4, 0x171E, 0x9EF5, 0x34FE, 0x9EF6, 0x3518, 0x9EF7, 0x1762,
- 0x9EF9, 0x2360, 0x9EFA, 0x2D37, 0x9EFB, 0x2F07, 0x9EFC, 0x31BF,
- 0x9EFD, 0x2612, 0x9EFF, 0x2F08, 0x9F00, 0x3071, 0x9F01, 0x3070,
- 0x9F06, 0x3475, 0x9F07, 0x173F, 0x9F09, 0x34FF, 0x9F0A, 0x3519,
- 0x9F0E, 0x0F7B, 0x9F0F, 0x2AFE, 0x9F10, 0x2AFF, 0x9F12, 0x2D38,
- 0x9F13, 0x0F7C, 0x9F15, 0x1573, 0x9F16, 0x3072, 0x9F18, 0x3370,
- 0x9F19, 0x16B7, 0x9F1A, 0x3371, 0x9F1B, 0x336F, 0x9F1C, 0x3476,
- 0x9F1E, 0x34C4, 0x9F20, 0x0F7D, 0x9F22, 0x2F0B, 0x9F23, 0x2F0A,
- 0x9F24, 0x2F09, 0x9F25, 0x3073, 0x9F28, 0x3077, 0x9F29, 0x3076,
- 0x9F2A, 0x3075, 0x9F2B, 0x3074, 0x9F2C, 0x1574, 0x9F2D, 0x31C0,
- 0x9F2E, 0x32BE, 0x9F2F, 0x1664, 0x9F30, 0x32BD, 0x9F31, 0x3372,
- 0x9F32, 0x3409, 0x9F33, 0x3408, 0x9F34, 0x16F2, 0x9F35, 0x3407,
- 0x9F36, 0x3479, 0x9F37, 0x3478, 0x9F38, 0x3477, 0x9F3B, 0x1100,
- 0x9F3D, 0x2D39, 0x9F3E, 0x14C7, 0x9F40, 0x31C1, 0x9F41, 0x31C2,
- 0x9F42, 0x340A, 0x9F43, 0x347A, 0x9F46, 0x34C5, 0x9F47, 0x3500,
- 0x9F48, 0x3532, 0x9F49, 0x354C, 0x9F4A, 0x1101, 0x9F4B, 0x14C8,
- 0x9F4C, 0x3078, 0x9F4D, 0x31C3, 0x9F4E, 0x3373, 0x9F4F, 0x347B,
- 0x9F52, 0x1289, 0x9F54, 0x2F0C, 0x9F55, 0x3079, 0x9F56, 0x31C4,
- 0x9F57, 0x31C5, 0x9F58, 0x31C6, 0x9F59, 0x32C3, 0x9F5B, 0x32BF,
- 0x9F5C, 0x16B8, 0x9F5D, 0x32C2, 0x9F5E, 0x32C1, 0x9F5F, 0x1665,
- 0x9F60, 0x32C0, 0x9F61, 0x1667, 0x9F63, 0x1666, 0x9F64, 0x3375,
- 0x9F65, 0x3374, 0x9F66, 0x16B9, 0x9F67, 0x16BA, 0x9F6A, 0x16F4,
- 0x9F6B, 0x340B, 0x9F6C, 0x16F3, 0x9F6E, 0x347E, 0x9F6F, 0x347F,
- 0x9F70, 0x347D, 0x9F71, 0x347C, 0x9F72, 0x1741, 0x9F74, 0x34C6,
- 0x9F75, 0x34C7, 0x9F76, 0x34C8, 0x9F77, 0x1740, 0x9F78, 0x3501,
- 0x9F79, 0x3504, 0x9F7A, 0x3503, 0x9F7B, 0x3502, 0x9F7E, 0x354B,
- 0x9F8D, 0x13B2, 0x9F90, 0x157C, 0x9F91, 0x32C4, 0x9F92, 0x3376,
- 0x9F94, 0x16F5, 0x9F95, 0x340C, 0x9F98, 0x354D, 0x9F9C, 0x13B3,
- 0x9FA0, 0x2F0D, 0x9FA2, 0x340D, 0x9FA4, 0x351A, 0xE01F, 0x083A,
- 0xE026, 0x09FD, 0xE05B, 0x030D, 0xE063, 0x016B, 0xE073, 0x0860,
- 0xE0F3, 0x0C23, 0xE12E, 0x17E4, 0xE149, 0x212F, 0xE191, 0x115F,
- 0xE1BA, 0x0C79, 0xE1C9, 0x04C3, 0xE22C, 0x18BD, 0xE22D, 0x0CBD,
- 0xE230, 0x0CA5, 0xE266, 0x0CCE, 0xE2A3, 0x0E84, 0xE2BC, 0x0120,
- 0xE2EF, 0x1BA8, 0xE33A, 0x1055, 0xE340, 0x2DE8, 0xE34F, 0x0121,
- 0xE35A, 0x106B, 0xE363, 0x1326, 0xE37C, 0x066B, 0xE37F, 0x132E,
- 0xE3C5, 0x0D35, 0xE3D7, 0x27C2, 0xE3DC, 0x22AD, 0xE417, 0x134C,
- 0xE44A, 0x09CE, 0xE478, 0x0BC7, 0xE485, 0x36E9, 0xE4C5, 0x1391,
- 0xE4DA, 0x16A4, 0xE545, 0x3072, 0xE5D2, 0x0119, 0xE5D3, 0x011A,
- 0xE5D4, 0x011C, 0xE5D5, 0x011B, 0xE5F4, 0x297C, 0xE6C6, 0x1D06,
- 0xE727, 0x29A1, 0xE7D3, 0x181B, 0xE893, 0x2B24, 0xEB40, 0x2F50,
- 0xEB42, 0x1725, 0xEB45, 0x32ED, 0xEB6E, 0x2AD9, 0xEB86, 0x1C14,
- 0xEB9E, 0x12E9, 0xEBA9, 0x2CAE, 0xEBBA, 0x1A64, 0xEBC9, 0x1404,
- 0xEBCF, 0x2324, 0xEBD2, 0x346A, 0xEBDE, 0x2291, 0xEC01, 0x1787,
- 0xEC02, 0x095F, 0xEC15, 0x1E99, 0xEC5B, 0x25C1, 0xEC5E, 0x0D0C,
- 0xECA6, 0x05E6, 0xED28, 0x0728, 0xED6E, 0x24B6, 0xED7C, 0x1806,
- 0xED9E, 0x3511, 0xEDE7, 0x0F82, 0xEE52, 0x05F2, 0xEE98, 0x247D,
- 0xF6B1, 0x01FA, 0xF6B2, 0x01FB, 0xF6B3, 0x01FC, 0xF6B4, 0x01FD,
- 0xF6B5, 0x01FE, 0xF6B6, 0x01FF, 0xF6B7, 0x0200, 0xF6B8, 0x0201,
- 0xF6B9, 0x0202, 0xF6BA, 0x0203, 0xF6BB, 0x0204, 0xF6BC, 0x0205,
- 0xF6BD, 0x0206, 0xF6BE, 0x0207, 0xF6BF, 0x0208, 0xF6C0, 0x0209,
- 0xF6C1, 0x020A, 0xF6C2, 0x020B, 0xF6C3, 0x020C, 0xF6C4, 0x020D,
- 0xF6C5, 0x020E, 0xF6C6, 0x020F, 0xF6C7, 0x0210, 0xF6C8, 0x0211,
- 0xF6C9, 0x0212, 0xF6CA, 0x0213, 0xF6CB, 0x0214, 0xF6CC, 0x0215,
- 0xF6CD, 0x0216, 0xF6CE, 0x0217, 0xF6CF, 0x0219, 0xF6D0, 0x021A,
- 0xF6D1, 0x021B, 0xF6D2, 0x021C, 0xF6D3, 0x021D, 0xF6D4, 0x021E,
- 0xF6D5, 0x021F, 0xF6D6, 0x0220, 0xF6D7, 0x0221, 0xF6D8, 0x0222,
- 0xF6D9, 0x0223, 0xF6DA, 0x0224, 0xF6DB, 0x0225, 0xF6DC, 0x0226,
- 0xF6DD, 0x0227, 0xF6DE, 0x0228, 0xF6E0, 0x022A, 0xF6E1, 0x022B,
- 0xF6E2, 0x022C, 0xF6E4, 0x022E, 0xF6E6, 0x0230, 0xF6E8, 0x35B3,
- 0xF6E9, 0x35B4, 0xF6EA, 0x35B5, 0xF6EB, 0x35B6, 0xF6EC, 0x35B7,
- 0xF6ED, 0x35B8, 0xF6F0, 0x35BA, 0xF6F1, 0x35BB, 0xF6F2, 0x35BC,
- 0xF6F3, 0x35BD, 0xF6F4, 0x35BE, 0xF6F5, 0x35BF, 0xF6F6, 0x35C0,
- 0xF6F7, 0x35C1, 0xF6F8, 0x35C2, 0xF6F9, 0x35C3, 0xF6FA, 0x35C4,
- 0xF6FB, 0x35C5, 0xF6FC, 0x35C6, 0xF6FD, 0x35C7, 0xF6FE, 0x35C8,
- 0xF6FF, 0x35C9, 0xF700, 0x35CA, 0xF701, 0x35CB, 0xF702, 0x35CC,
- 0xF703, 0x35CD, 0xF704, 0x35CE, 0xF705, 0x35CF, 0xF706, 0x35D0,
- 0xF707, 0x35D1, 0xF708, 0x35D2, 0xF709, 0x35D3, 0xF70A, 0x35D4,
- 0xF70B, 0x35D5, 0xF70C, 0x35D6, 0xF70D, 0x35D7, 0xF70E, 0x35D8,
- 0xF70F, 0x35D9, 0xF710, 0x35DA, 0xF711, 0x35DB, 0xF712, 0x35DC,
- 0xF713, 0x35DD, 0xF714, 0x35DE, 0xF715, 0x35DF, 0xF716, 0x35E0,
- 0xF717, 0x35E1, 0xF718, 0x35E2, 0xF719, 0x35E3, 0xF71A, 0x35E4,
- 0xF71B, 0x35E5, 0xF71C, 0x35E6, 0xF71D, 0x35E7, 0xF71E, 0x35E8,
- 0xF71F, 0x35E9, 0xF720, 0x35EA, 0xF721, 0x35EB, 0xF722, 0x35EC,
- 0xF723, 0x35ED, 0xF724, 0x35EE, 0xF725, 0x35EF, 0xF726, 0x35F0,
- 0xF727, 0x35F1, 0xF728, 0x35F2, 0xF729, 0x35F3, 0xF72A, 0x35F4,
- 0xF72B, 0x35F5, 0xF72C, 0x35F6, 0xF72D, 0x35F7, 0xF72E, 0x35F8,
- 0xF72F, 0x35F9, 0xF730, 0x35FA, 0xF731, 0x35FB, 0xF732, 0x35FC,
- 0xF733, 0x35FD, 0xF734, 0x35FE, 0xF735, 0x35FF, 0xF736, 0x3600,
- 0xF737, 0x3601, 0xF738, 0x3602, 0xF739, 0x3603, 0xF73A, 0x3604,
- 0xF73B, 0x3605, 0xF73C, 0x3606, 0xF73D, 0x3607, 0xF73E, 0x3608,
- 0xF73F, 0x3609, 0xF740, 0x360A, 0xF741, 0x360B, 0xF742, 0x360C,
- 0xF743, 0x360D, 0xF744, 0x360E, 0xF745, 0x360F, 0xF746, 0x3610,
- 0xF747, 0x3611, 0xF748, 0x3612, 0xF749, 0x3613, 0xF74A, 0x3614,
- 0xF74B, 0x3615, 0xF74C, 0x3616, 0xF74D, 0x3617, 0xF74E, 0x3618,
- 0xF74F, 0x3619, 0xF750, 0x361A, 0xF751, 0x361B, 0xF752, 0x361C,
- 0xF753, 0x361D, 0xF754, 0x361E, 0xF755, 0x361F, 0xF756, 0x3620,
- 0xF757, 0x3621, 0xF758, 0x3622, 0xF759, 0x3623, 0xF75A, 0x3624,
- 0xF75B, 0x3625, 0xF75C, 0x3626, 0xF75D, 0x3627, 0xF75E, 0x3628,
- 0xF75F, 0x3629, 0xF760, 0x362A, 0xF761, 0x362B, 0xF762, 0x362C,
- 0xF763, 0x362D, 0xF764, 0x362E, 0xF765, 0x362F, 0xF766, 0x3630,
- 0xF767, 0x3631, 0xF768, 0x3632, 0xF769, 0x3633, 0xF76A, 0x3634,
- 0xF76B, 0x3635, 0xF76C, 0x3636, 0xF76D, 0x3637, 0xF76E, 0x3638,
- 0xF76F, 0x3639, 0xF770, 0x363A, 0xF771, 0x363B, 0xF772, 0x363C,
- 0xF773, 0x363D, 0xF774, 0x363E, 0xF775, 0x363F, 0xF776, 0x3640,
- 0xF777, 0x3641, 0xF778, 0x3642, 0xF779, 0x3643, 0xF77A, 0x3644,
- 0xF77B, 0x3645, 0xF77C, 0x3646, 0xF77D, 0x3647, 0xF77E, 0x3648,
- 0xF77F, 0x3649, 0xF780, 0x364A, 0xF781, 0x364B, 0xF782, 0x364C,
- 0xF783, 0x364D, 0xF784, 0x364E, 0xF785, 0x364F, 0xF786, 0x3650,
- 0xF787, 0x3651, 0xF788, 0x3652, 0xF789, 0x3653, 0xF78A, 0x3654,
- 0xF78B, 0x3655, 0xF78C, 0x3656, 0xF78D, 0x3657, 0xF78E, 0x3658,
- 0xF78F, 0x3659, 0xF790, 0x365A, 0xF791, 0x365B, 0xF792, 0x365C,
- 0xF793, 0x365D, 0xF794, 0x365E, 0xF795, 0x365F, 0xF796, 0x3660,
- 0xF797, 0x3661, 0xF798, 0x3662, 0xF799, 0x3663, 0xF79A, 0x3664,
- 0xF79B, 0x3665, 0xF79C, 0x3666, 0xF79D, 0x3667, 0xF79E, 0x3668,
- 0xF79F, 0x3669, 0xF7A0, 0x366A, 0xF7A1, 0x366B, 0xF7A2, 0x366C,
- 0xF7A3, 0x366D, 0xF7A4, 0x366E, 0xF7A5, 0x366F, 0xF7A6, 0x3670,
- 0xF7A7, 0x3671, 0xF7A8, 0x3672, 0xF7A9, 0x3673, 0xF7AA, 0x3674,
- 0xF7AB, 0x3675, 0xF7AC, 0x3676, 0xF7AD, 0x3677, 0xF7AE, 0x3678,
- 0xF7AF, 0x3679, 0xF7B0, 0x367A, 0xF7B1, 0x367B, 0xF7B2, 0x367C,
- 0xF7B3, 0x367D, 0xF7B4, 0x367E, 0xF7B5, 0x367F, 0xF7B6, 0x3680,
- 0xF7B7, 0x3681, 0xF7B8, 0x3682, 0xF7B9, 0x3683, 0xF7BA, 0x3684,
- 0xF7BB, 0x3685, 0xF7BC, 0x3686, 0xF7BD, 0x3687, 0xF7BE, 0x3688,
- 0xF7BF, 0x3689, 0xF7C0, 0x368A, 0xF7C1, 0x368B, 0xF7C2, 0x368C,
- 0xF7C3, 0x368D, 0xF7C4, 0x368E, 0xF7C5, 0x368F, 0xF7C6, 0x3690,
- 0xF7C7, 0x3691, 0xF7C8, 0x3692, 0xF7C9, 0x3693, 0xF7CA, 0x3694,
- 0xF7CB, 0x3695, 0xF7CC, 0x3696, 0xF7CD, 0x3697, 0xF7CE, 0x3698,
- 0xF7CF, 0x3699, 0xF7D0, 0x369A, 0xF7D1, 0x369B, 0xF7D2, 0x369C,
- 0xF7D3, 0x369D, 0xF7D4, 0x369E, 0xF7D5, 0x369F, 0xF7D6, 0x36A0,
- 0xF7D7, 0x36A1, 0xF7D8, 0x36A2, 0xF7D9, 0x36A3, 0xF7DA, 0x36A4,
- 0xF7DB, 0x36A5, 0xF7DC, 0x36A6, 0xF7DD, 0x36A7, 0xF7DE, 0x36A8,
- 0xF7DF, 0x36A9, 0xF7E0, 0x36AA, 0xF7E1, 0x36AB, 0xF7E2, 0x36AC,
- 0xF7E3, 0x36AD, 0xF7E4, 0x36AE, 0xF7E5, 0x36AF, 0xF7E6, 0x36B0,
- 0xF7E7, 0x36B1, 0xF7E8, 0x36B2, 0xF7E9, 0x36B3, 0xF7EA, 0x36B4,
- 0xF7EB, 0x36B5, 0xF7EC, 0x36B6, 0xF7ED, 0x36B7, 0xF7EE, 0x36B8,
- 0xF817, 0x36E1, 0xF818, 0x36E2, 0xF819, 0x36E3, 0xF81A, 0x36E4,
- 0xF81B, 0x36E5, 0xF81C, 0x36E6, 0xF81D, 0x36E7, 0xFA0C, 0x0274,
- 0xFA0D, 0x2381, 0xFE30, 0x006D, 0xFE31, 0x007A, 0xFE33, 0x35AF,
- 0xFE34, 0x35B1, 0xFE35, 0x0082, 0xFE36, 0x0083, 0xFE37, 0x0086,
- 0xFE38, 0x0087, 0xFE39, 0x008A, 0xFE3A, 0x008B, 0xFE3B, 0x008E,
- 0xFE3C, 0x008F, 0xFE3D, 0x0092, 0xFE3E, 0x0093, 0xFE3F, 0x0096,
- 0xFE40, 0x0097, 0xFE41, 0x009A, 0xFE42, 0x009B, 0xFE43, 0x009E,
- 0xFE44, 0x009F, 0xFE49, 0x00C7, 0xFE4A, 0x00C8, 0xFE4B, 0x00CB,
- 0xFE4C, 0x00CC, 0xFE4D, 0x00C9, 0xFE4E, 0x00CA, 0xFE4F, 0x35B2,
- 0xFE50, 0x0070, 0xFE51, 0x0071, 0xFE52, 0x0072, 0xFE54, 0x0074,
- 0xFE55, 0x0075, 0xFE56, 0x0076, 0xFE57, 0x0077, 0xFE59, 0x00A0,
- 0xFE5A, 0x00A1, 0xFE5B, 0x00A2, 0xFE5C, 0x00A3, 0xFE5D, 0x00A4,
- 0xFE5E, 0x00A5, 0xFE5F, 0x00CD, 0xFE60, 0x00CE, 0xFE61, 0x00CF,
- 0xFE62, 0x00DF, 0xFE63, 0x00E0, 0xFE64, 0x00E1, 0xFE65, 0x00E2,
- 0xFE66, 0x00E3, 0xFE68, 0x0102, 0xFE69, 0x010C, 0xFE6A, 0x010D,
- 0xFE6B, 0x010E, 0xFF01, 0x006C, 0xFF02, 0x36E4, 0xFF03, 0x00AE,
- 0xFF04, 0x0103, 0xFF05, 0x0108, 0xFF06, 0x00AF, 0xFF07, 0x36E3,
- 0xFF08, 0x0080, 0xFF09, 0x0081, 0xFF0A, 0x00B0, 0xFF0B, 0x00D0,
- 0xFF0C, 0x0064, 0xFF0D, 0x00D1, 0xFF0E, 0x0067, 0xFF0F, 0x0101,
- 0xFF10, 0x014D, 0xFF11, 0x014E, 0xFF12, 0x014F, 0xFF13, 0x0150,
- 0xFF14, 0x0151, 0xFF15, 0x0152, 0xFF16, 0x0153, 0xFF17, 0x0154,
- 0xFF18, 0x0155, 0xFF19, 0x0156, 0xFF1A, 0x006A, 0xFF1B, 0x0069,
- 0xFF1C, 0x00D6, 0xFF1D, 0x00D8, 0xFF1E, 0x00D7, 0xFF1F, 0x006B,
- 0xFF20, 0x0109, 0xFF21, 0x016D, 0xFF22, 0x016E, 0xFF23, 0x016F,
- 0xFF24, 0x0170, 0xFF25, 0x0171, 0xFF26, 0x0172, 0xFF27, 0x0173,
- 0xFF28, 0x0174, 0xFF29, 0x0175, 0xFF2A, 0x0176, 0xFF2B, 0x0177,
- 0xFF2C, 0x0178, 0xFF2D, 0x0179, 0xFF2E, 0x017A, 0xFF2F, 0x017B,
- 0xFF30, 0x017C, 0xFF31, 0x017D, 0xFF32, 0x017E, 0xFF33, 0x017F,
- 0xFF34, 0x0180, 0xFF35, 0x0181, 0xFF36, 0x0182, 0xFF37, 0x0183,
- 0xFF38, 0x0184, 0xFF39, 0x0185, 0xFF3A, 0x0186, 0xFF3B, 0x35BE,
- 0xFF3C, 0x0102, 0xFF3D, 0x35BF, 0xFF3E, 0x35B4, 0xFF3F, 0x00C5,
- 0xFF41, 0x0187, 0xFF42, 0x0188, 0xFF43, 0x0189, 0xFF44, 0x018A,
- 0xFF45, 0x018B, 0xFF46, 0x018C, 0xFF47, 0x018D, 0xFF48, 0x018E,
- 0xFF49, 0x018F, 0xFF4A, 0x0190, 0xFF4B, 0x0191, 0xFF4C, 0x0192,
- 0xFF4D, 0x0193, 0xFF4E, 0x0194, 0xFF4F, 0x0195, 0xFF50, 0x0196,
- 0xFF51, 0x0197, 0xFF52, 0x0198, 0xFF53, 0x0199, 0xFF54, 0x019A,
- 0xFF55, 0x019B, 0xFF56, 0x019C, 0xFF57, 0x019D, 0xFF58, 0x019E,
- 0xFF59, 0x019F, 0xFF5A, 0x01A0, 0xFF5B, 0x0084, 0xFF5C, 0x0078,
- 0xFF5D, 0x0085, 0xFF5E, 0x00E4, 0xFF64, 0x0071, 0xFFE0, 0x0106,
- 0xFFE1, 0x0107, 0xFFE2, 0x36E1, 0xFFE3, 0x00C4, 0xFFE4, 0x36E2,
- 0xFFE5, 0x0104,
-};
-extern const unsigned short g_FXCMAP_UniCNS_UTF16_H_0_DWord[3 * 3] = {
- 0xD840, 0xDC8A, 0x36B2, 0xD840, 0xDCCC, 0x36B0, 0xD85D, 0xDE07, 0x36B8,
-};
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_UniCNS_UTF16_H_0[14557 * 2] = {
+ 0x0020, 0x0001, 0x0021, 0x0002, 0x0022, 0x0003, 0x0023, 0x0004,
+ 0x0024, 0x0005, 0x0025, 0x0006, 0x0026, 0x0007, 0x0027, 0x0008,
+ 0x0028, 0x0009, 0x0029, 0x000A, 0x002A, 0x000B, 0x002B, 0x000C,
+ 0x002C, 0x000D, 0x002D, 0x000E, 0x002E, 0x000F, 0x002F, 0x0010,
+ 0x0030, 0x0011, 0x0031, 0x0012, 0x0032, 0x0013, 0x0033, 0x0014,
+ 0x0034, 0x0015, 0x0035, 0x0016, 0x0036, 0x0017, 0x0037, 0x0018,
+ 0x0038, 0x0019, 0x0039, 0x001A, 0x003A, 0x001B, 0x003B, 0x001C,
+ 0x003C, 0x001D, 0x003D, 0x001E, 0x003E, 0x001F, 0x003F, 0x0020,
+ 0x0040, 0x0021, 0x0041, 0x0022, 0x0042, 0x0023, 0x0043, 0x0024,
+ 0x0044, 0x0025, 0x0045, 0x0026, 0x0046, 0x0027, 0x0047, 0x0028,
+ 0x0048, 0x0029, 0x0049, 0x002A, 0x004A, 0x002B, 0x004B, 0x002C,
+ 0x004C, 0x002D, 0x004D, 0x002E, 0x004E, 0x002F, 0x004F, 0x0030,
+ 0x0050, 0x0031, 0x0051, 0x0032, 0x0052, 0x0033, 0x0053, 0x0034,
+ 0x0054, 0x0035, 0x0055, 0x0036, 0x0056, 0x0037, 0x0057, 0x0038,
+ 0x0058, 0x0039, 0x0059, 0x003A, 0x005A, 0x003B, 0x005B, 0x003C,
+ 0x005C, 0x003D, 0x005D, 0x003E, 0x005E, 0x003F, 0x005F, 0x0040,
+ 0x0060, 0x0041, 0x0061, 0x0042, 0x0062, 0x0043, 0x0063, 0x0044,
+ 0x0064, 0x0045, 0x0065, 0x0046, 0x0066, 0x0047, 0x0067, 0x0048,
+ 0x0068, 0x0049, 0x0069, 0x004A, 0x006A, 0x004B, 0x006B, 0x004C,
+ 0x006C, 0x004D, 0x006D, 0x004E, 0x006E, 0x004F, 0x006F, 0x0050,
+ 0x0070, 0x0051, 0x0071, 0x0052, 0x0072, 0x0053, 0x0073, 0x0054,
+ 0x0074, 0x0055, 0x0075, 0x0056, 0x0076, 0x0057, 0x0077, 0x0058,
+ 0x0078, 0x0059, 0x0079, 0x005A, 0x007A, 0x005B, 0x007B, 0x005C,
+ 0x007C, 0x005D, 0x007D, 0x005E, 0x007E, 0x005F, 0x00A2, 0x0106,
+ 0x00A3, 0x0107, 0x00A5, 0x0104, 0x00A7, 0x00B2, 0x00A8, 0x35B3,
+ 0x00AC, 0x36E1, 0x00AF, 0x00C3, 0x00B0, 0x0118, 0x00B1, 0x00D4,
+ 0x00B7, 0x0073, 0x00D7, 0x00D2, 0x00F7, 0x00D3, 0x02C6, 0x35B4,
+ 0x02C7, 0x01F8, 0x02CA, 0x01F7, 0x02CB, 0x01F9, 0x02CD, 0x00C6,
+ 0x02D9, 0x01F6, 0x0308, 0x35B3, 0x0391, 0x01A1, 0x0392, 0x01A2,
+ 0x0393, 0x01A3, 0x0394, 0x01A4, 0x0395, 0x01A5, 0x0396, 0x01A6,
+ 0x0397, 0x01A7, 0x0398, 0x01A8, 0x0399, 0x01A9, 0x039A, 0x01AA,
+ 0x039B, 0x01AB, 0x039C, 0x01AC, 0x039D, 0x01AD, 0x039E, 0x01AE,
+ 0x039F, 0x01AF, 0x03A0, 0x01B0, 0x03A1, 0x01B1, 0x03A3, 0x01B2,
+ 0x03A4, 0x01B3, 0x03A5, 0x01B4, 0x03A6, 0x01B5, 0x03A7, 0x01B6,
+ 0x03A8, 0x01B7, 0x03A9, 0x01B8, 0x03B1, 0x01B9, 0x03B2, 0x01BA,
+ 0x03B3, 0x01BB, 0x03B4, 0x01BC, 0x03B5, 0x01BD, 0x03B6, 0x01BE,
+ 0x03B7, 0x01BF, 0x03B8, 0x01C0, 0x03B9, 0x01C1, 0x03BA, 0x01C2,
+ 0x03BB, 0x01C3, 0x03BC, 0x01C4, 0x03BD, 0x01C5, 0x03BE, 0x01C6,
+ 0x03BF, 0x01C7, 0x03C0, 0x01C8, 0x03C1, 0x01C9, 0x03C3, 0x01CA,
+ 0x03C4, 0x01CB, 0x03C5, 0x01CC, 0x03C6, 0x01CD, 0x03C7, 0x01CE,
+ 0x03C8, 0x01CF, 0x03C9, 0x01D0, 0x0401, 0x3670, 0x0410, 0x366A,
+ 0x0411, 0x366B, 0x0412, 0x366C, 0x0413, 0x366D, 0x0414, 0x366E,
+ 0x0415, 0x366F, 0x0416, 0x3671, 0x0417, 0x3672, 0x0418, 0x3673,
+ 0x0419, 0x3674, 0x041A, 0x3675, 0x041B, 0x3676, 0x041C, 0x3677,
+ 0x041D, 0x3678, 0x041E, 0x3679, 0x041F, 0x367A, 0x0420, 0x367B,
+ 0x0421, 0x367C, 0x0422, 0x367D, 0x0423, 0x367E, 0x0424, 0x367F,
+ 0x0425, 0x3680, 0x0426, 0x3681, 0x0427, 0x3682, 0x0428, 0x3683,
+ 0x0429, 0x3684, 0x042A, 0x3685, 0x042B, 0x3686, 0x042C, 0x3687,
+ 0x042D, 0x3688, 0x042E, 0x3689, 0x042F, 0x368A, 0x0430, 0x368B,
+ 0x0431, 0x368C, 0x0432, 0x368D, 0x0433, 0x368E, 0x0434, 0x368F,
+ 0x0435, 0x3690, 0x0436, 0x3692, 0x0437, 0x3693, 0x0438, 0x3694,
+ 0x0439, 0x3695, 0x043A, 0x3696, 0x043B, 0x3697, 0x043C, 0x3698,
+ 0x043D, 0x3699, 0x043E, 0x369A, 0x043F, 0x369B, 0x0440, 0x369C,
+ 0x0441, 0x369D, 0x0442, 0x369E, 0x0443, 0x369F, 0x0444, 0x36A0,
+ 0x0445, 0x36A1, 0x0446, 0x36A2, 0x0447, 0x36A3, 0x0448, 0x36A4,
+ 0x0449, 0x36A5, 0x044A, 0x36A6, 0x044B, 0x36A7, 0x044C, 0x36A8,
+ 0x044D, 0x36A9, 0x044E, 0x36AA, 0x044F, 0x36AB, 0x0451, 0x3691,
+ 0x2013, 0x0079, 0x2014, 0x007B, 0x2018, 0x00A6, 0x2019, 0x00A7,
+ 0x201C, 0x00A8, 0x201D, 0x00A9, 0x2022, 0x0068, 0x2025, 0x006F,
+ 0x2026, 0x006E, 0x2027, 0x0068, 0x2032, 0x00AD, 0x2035, 0x00AC,
+ 0x203B, 0x00B1, 0x203E, 0x00C3, 0x2103, 0x010A, 0x2105, 0x00C2,
+ 0x2109, 0x010B, 0x2116, 0x36E6, 0x2121, 0x36E7, 0x2160, 0x0157,
+ 0x2161, 0x0158, 0x2162, 0x0159, 0x2163, 0x015A, 0x2164, 0x015B,
+ 0x2165, 0x015C, 0x2166, 0x015D, 0x2167, 0x015E, 0x2168, 0x015F,
+ 0x2169, 0x0160, 0x2170, 0x020E, 0x2171, 0x020F, 0x2172, 0x0210,
+ 0x2173, 0x0211, 0x2174, 0x0212, 0x2175, 0x0213, 0x2176, 0x0214,
+ 0x2177, 0x0215, 0x2178, 0x0216, 0x2179, 0x0217, 0x2190, 0x00F8,
+ 0x2191, 0x00F5, 0x2192, 0x00F7, 0x2193, 0x00F6, 0x2196, 0x00F9,
+ 0x2197, 0x00FA, 0x2198, 0x00FC, 0x2199, 0x00FB, 0x21B8, 0x36AD,
+ 0x21B9, 0x36AE, 0x21E7, 0x36AC, 0x2215, 0x0101, 0x221A, 0x00D5,
+ 0x221E, 0x00DC, 0x221F, 0x00E9, 0x2220, 0x00E8, 0x2223, 0x00FE,
+ 0x2225, 0x00FD, 0x2229, 0x00E5, 0x222A, 0x00E6, 0x222B, 0x00ED,
+ 0x222E, 0x00EE, 0x2234, 0x00F0, 0x2235, 0x00EF, 0x223C, 0x00E4,
+ 0x2252, 0x00DD, 0x2260, 0x00DB, 0x2261, 0x00DE, 0x2266, 0x00D9,
+ 0x2267, 0x00DA, 0x2295, 0x00F3, 0x2299, 0x00F4, 0x22A5, 0x00E7,
+ 0x22BF, 0x00EA, 0x22EF, 0x006E, 0x2400, 0x0232, 0x2401, 0x0233,
+ 0x2402, 0x0234, 0x2403, 0x0235, 0x2404, 0x0236, 0x2405, 0x0237,
+ 0x2406, 0x0238, 0x2407, 0x0239, 0x2408, 0x023A, 0x2409, 0x023B,
+ 0x240A, 0x023C, 0x240B, 0x023D, 0x240C, 0x023E, 0x240D, 0x023F,
+ 0x240E, 0x0240, 0x240F, 0x0241, 0x2410, 0x0242, 0x2411, 0x0243,
+ 0x2412, 0x0244, 0x2413, 0x0245, 0x2414, 0x0246, 0x2415, 0x0247,
+ 0x2416, 0x0248, 0x2417, 0x0249, 0x2418, 0x024A, 0x2419, 0x024B,
+ 0x241A, 0x024C, 0x241B, 0x024D, 0x241C, 0x024E, 0x241D, 0x024F,
+ 0x241E, 0x0250, 0x241F, 0x0251, 0x2421, 0x0252, 0x2460, 0x01FA,
+ 0x2461, 0x01FB, 0x2462, 0x01FC, 0x2463, 0x01FD, 0x2464, 0x01FE,
+ 0x2465, 0x01FF, 0x2466, 0x0200, 0x2467, 0x0201, 0x2468, 0x0202,
+ 0x2469, 0x0203, 0x2474, 0x0204, 0x2475, 0x0205, 0x2476, 0x0206,
+ 0x2477, 0x0207, 0x2478, 0x0208, 0x2479, 0x0209, 0x247A, 0x020A,
+ 0x247B, 0x020B, 0x247C, 0x020C, 0x247D, 0x020D, 0x2500, 0x0137,
+ 0x2502, 0x0138, 0x250C, 0x013A, 0x2510, 0x013B, 0x2514, 0x013C,
+ 0x2518, 0x013D, 0x251C, 0x0135, 0x2524, 0x0134, 0x252C, 0x0133,
+ 0x2534, 0x0132, 0x253C, 0x0131, 0x2550, 0x0142, 0x2551, 0x370A,
+ 0x2552, 0x36F8, 0x2553, 0x3701, 0x2554, 0x36EF, 0x2555, 0x36FA,
+ 0x2556, 0x3703, 0x2557, 0x36F1, 0x2558, 0x36FE, 0x2559, 0x3707,
+ 0x255A, 0x36F5, 0x255B, 0x3700, 0x255C, 0x3709, 0x255D, 0x36F7,
+ 0x255E, 0x0143, 0x255F, 0x3704, 0x2560, 0x36F2, 0x2561, 0x0145,
+ 0x2562, 0x3706, 0x2563, 0x36F4, 0x2564, 0x36F9, 0x2565, 0x3702,
+ 0x2566, 0x36F0, 0x2567, 0x36FF, 0x2568, 0x3708, 0x2569, 0x36F6,
+ 0x256A, 0x0144, 0x256B, 0x3705, 0x256C, 0x36F3, 0x256D, 0x013E,
+ 0x256E, 0x013F, 0x256F, 0x0141, 0x2570, 0x0140, 0x2571, 0x014A,
+ 0x2572, 0x014B, 0x2573, 0x014C, 0x2574, 0x35B0, 0x2581, 0x0122,
+ 0x2582, 0x0123, 0x2583, 0x0124, 0x2584, 0x0125, 0x2585, 0x0126,
+ 0x2586, 0x0127, 0x2587, 0x0128, 0x2588, 0x0129, 0x2589, 0x0130,
+ 0x258A, 0x012F, 0x258B, 0x012E, 0x258C, 0x012D, 0x258D, 0x012C,
+ 0x258E, 0x012B, 0x258F, 0x012A, 0x2593, 0x3710, 0x2594, 0x0136,
+ 0x2595, 0x0139, 0x25A0, 0x00BE, 0x25A1, 0x00BD, 0x25B2, 0x00B7,
+ 0x25B3, 0x00B6, 0x25BC, 0x00C0, 0x25BD, 0x00BF, 0x25C6, 0x00BC,
+ 0x25C7, 0x00BB, 0x25CB, 0x00B4, 0x25CE, 0x00B8, 0x25CF, 0x00B5,
+ 0x25E2, 0x0146, 0x25E3, 0x0147, 0x25E4, 0x0149, 0x25E5, 0x0148,
+ 0x2605, 0x00BA, 0x2606, 0x00B9, 0x2609, 0x00F4, 0x2640, 0x00F1,
+ 0x2641, 0x00F3, 0x2642, 0x00F2, 0x273D, 0x35C0, 0x2F00, 0x0253,
+ 0x2F01, 0x0218, 0x2F02, 0x0219, 0x2F03, 0x021A, 0x2F04, 0x0254,
+ 0x2F05, 0x021B, 0x2F06, 0x025A, 0x2F07, 0x021C, 0x2F08, 0x025B,
+ 0x2F09, 0x025C, 0x2F0A, 0x025D, 0x2F0B, 0x025E, 0x2F0C, 0x021D,
+ 0x2F0D, 0x021E, 0x2F0E, 0x021F, 0x2F0F, 0x025F, 0x2F10, 0x176E,
+ 0x2F11, 0x0260, 0x2F12, 0x0262, 0x2F13, 0x0220, 0x2F14, 0x0263,
+ 0x2F15, 0x176F, 0x2F16, 0x0221, 0x2F17, 0x0264, 0x2F18, 0x0265,
+ 0x2F19, 0x0222, 0x2F1A, 0x1770, 0x2F1B, 0x0223, 0x2F1C, 0x0266,
+ 0x2F1D, 0x0279, 0x2F1E, 0x1775, 0x2F1F, 0x027A, 0x2F20, 0x027B,
+ 0x2F21, 0x0224, 0x2F22, 0x0224, 0x2F23, 0x027C, 0x2F24, 0x027D,
+ 0x2F25, 0x027E, 0x2F26, 0x027F, 0x2F27, 0x0225, 0x2F28, 0x0282,
+ 0x2F29, 0x0283, 0x2F2A, 0x0284, 0x2F2B, 0x0285, 0x2F2C, 0x1776,
+ 0x2F2D, 0x0286, 0x2F2E, 0x0226, 0x2F2F, 0x0288, 0x2F30, 0x0289,
+ 0x2F31, 0x028C, 0x2F32, 0x028D, 0x2F33, 0x0227, 0x2F34, 0x0228,
+ 0x2F35, 0x0229, 0x2F36, 0x028E, 0x2F37, 0x028F, 0x2F38, 0x0290,
+ 0x2F39, 0x022A, 0x2F3A, 0x022B, 0x2F3B, 0x1777, 0x2F3C, 0x02D0,
+ 0x2F3D, 0x02D1, 0x2F3E, 0x02D2, 0x2F3F, 0x02D3, 0x2F40, 0x02D5,
+ 0x2F41, 0x022C, 0x2F42, 0x02D6, 0x2F43, 0x02D7, 0x2F44, 0x02D8,
+ 0x2F45, 0x02D9, 0x2F46, 0x022D, 0x2F47, 0x02DA, 0x2F48, 0x02DB,
+ 0x2F49, 0x02DC, 0x2F4A, 0x02DD, 0x2F4B, 0x02DE, 0x2F4C, 0x02DF,
+ 0x2F4D, 0x02E0, 0x2F4E, 0x178A, 0x2F4F, 0x02E1, 0x2F50, 0x02E2,
+ 0x2F51, 0x02E3, 0x2F52, 0x02E4, 0x2F53, 0x178C, 0x2F54, 0x02E5,
+ 0x2F55, 0x02E6, 0x2F56, 0x02E7, 0x2F57, 0x02E8, 0x2F58, 0x02E9,
+ 0x2F59, 0x178D, 0x2F5A, 0x02EA, 0x2F5B, 0x02EB, 0x2F5C, 0x02EC,
+ 0x2F5D, 0x02ED, 0x2F5E, 0x0356, 0x2F5F, 0x0357, 0x2F60, 0x0358,
+ 0x2F61, 0x0359, 0x2F62, 0x035A, 0x2F63, 0x035B, 0x2F64, 0x035C,
+ 0x2F65, 0x035E, 0x2F66, 0x0362, 0x2F67, 0x022E, 0x2F68, 0x022F,
+ 0x2F69, 0x0363, 0x2F6A, 0x0364, 0x2F6B, 0x0365, 0x2F6C, 0x0366,
+ 0x2F6D, 0x0367, 0x2F6E, 0x0368, 0x2F6F, 0x0369, 0x2F70, 0x036A,
+ 0x2F71, 0x17B2, 0x2F72, 0x036B, 0x2F73, 0x036C, 0x2F74, 0x036D,
+ 0x2F75, 0x03F6, 0x2F76, 0x03F7, 0x2F77, 0x03F8, 0x2F78, 0x03F9,
+ 0x2F79, 0x1812, 0x2F7A, 0x03FA, 0x2F7B, 0x03FB, 0x2F7C, 0x03FC,
+ 0x2F7D, 0x03FE, 0x2F7E, 0x03FF, 0x2F7F, 0x0400, 0x2F80, 0x0401,
+ 0x2F81, 0x0402, 0x2F82, 0x0405, 0x2F83, 0x0406, 0x2F84, 0x0407,
+ 0x2F85, 0x0408, 0x2F86, 0x0409, 0x2F87, 0x040A, 0x2F88, 0x040B,
+ 0x2F89, 0x040C, 0x2F8A, 0x040D, 0x2F8B, 0x1813, 0x2F8C, 0x1818,
+ 0x2F8D, 0x040F, 0x2F8E, 0x0410, 0x2F8F, 0x0411, 0x2F90, 0x0412,
+ 0x2F91, 0x1819, 0x2F92, 0x0508, 0x2F93, 0x0509, 0x2F94, 0x050A,
+ 0x2F95, 0x050B, 0x2F96, 0x050C, 0x2F97, 0x050D, 0x2F98, 0x18E7,
+ 0x2F99, 0x050E, 0x2F9A, 0x050F, 0x2F9B, 0x0510, 0x2F9C, 0x0511,
+ 0x2F9D, 0x0512, 0x2F9E, 0x0513, 0x2F9F, 0x0514, 0x2FA0, 0x0515,
+ 0x2FA1, 0x0230, 0x2FA2, 0x051B, 0x2FA3, 0x0520, 0x2FA4, 0x0521,
+ 0x2FA5, 0x0522, 0x2FA6, 0x0696, 0x2FA7, 0x0697, 0x2FA8, 0x0698,
+ 0x2FA9, 0x0699, 0x2FAA, 0x0231, 0x2FAB, 0x069F, 0x2FAC, 0x06A0,
+ 0x2FAE, 0x06A2, 0x2FAF, 0x0826, 0x2FB0, 0x0827, 0x2FB1, 0x0828,
+ 0x2FB2, 0x0829, 0x2FB3, 0x082A, 0x2FB4, 0x082B, 0x2FB5, 0x082C,
+ 0x2FB6, 0x082D, 0x2FB7, 0x082E, 0x2FB8, 0x082F, 0x2FB9, 0x0830,
+ 0x2FBA, 0x09F5, 0x2FBB, 0x09F6, 0x2FBC, 0x09F7, 0x2FBD, 0x1E33,
+ 0x2FBE, 0x09F8, 0x2FBF, 0x1E34, 0x2FC0, 0x09F9, 0x2FC1, 0x09FA,
+ 0x2FC2, 0x0BE1, 0x2FC3, 0x0BE2, 0x2FC4, 0x0BE3, 0x2FC5, 0x0BE4,
+ 0x2FC6, 0x0BE5, 0x2FC7, 0x0BE6, 0x2FC8, 0x0DBB, 0x2FC9, 0x0DBC,
+ 0x2FCA, 0x0DBD, 0x2FCB, 0x2360, 0x2FCC, 0x2612, 0x2FCD, 0x0F7B,
+ 0x2FCE, 0x0F7C, 0x2FCF, 0x0F7D, 0x2FD0, 0x1100, 0x2FD1, 0x1101,
+ 0x2FD2, 0x1289, 0x2FD3, 0x13B2, 0x2FD4, 0x13B3, 0x2FD5, 0x2F0D,
+ 0x3000, 0x0063, 0x3001, 0x0065, 0x3002, 0x0066, 0x3003, 0x00B3,
+ 0x3005, 0x35BA, 0x3006, 0x35BB, 0x3007, 0x35BC, 0x3008, 0x0094,
+ 0x3009, 0x0095, 0x300A, 0x0090, 0x300B, 0x0091, 0x300C, 0x0098,
+ 0x300D, 0x0099, 0x300E, 0x009C, 0x300F, 0x009D, 0x3010, 0x008C,
+ 0x3011, 0x008D, 0x3012, 0x0105, 0x3014, 0x0088, 0x3015, 0x0089,
+ 0x301D, 0x00AA, 0x301E, 0x00AB, 0x3021, 0x0161, 0x3022, 0x0162,
+ 0x3023, 0x0163, 0x3024, 0x0164, 0x3025, 0x0165, 0x3026, 0x0166,
+ 0x3027, 0x0167, 0x3028, 0x0168, 0x3029, 0x0169, 0x3038, 0x016A,
+ 0x3039, 0x016B, 0x303A, 0x016C, 0x3041, 0x35C1, 0x3042, 0x35C2,
+ 0x3043, 0x35C3, 0x3044, 0x35C4, 0x3045, 0x35C5, 0x3046, 0x35C6,
+ 0x3047, 0x35C7, 0x3048, 0x35C8, 0x3049, 0x35C9, 0x304A, 0x35CA,
+ 0x304B, 0x35CB, 0x304C, 0x35CC, 0x304D, 0x35CD, 0x304E, 0x35CE,
+ 0x304F, 0x35CF, 0x3050, 0x35D0, 0x3051, 0x35D1, 0x3052, 0x35D2,
+ 0x3053, 0x35D3, 0x3054, 0x35D4, 0x3055, 0x35D5, 0x3056, 0x35D6,
+ 0x3057, 0x35D7, 0x3058, 0x35D8, 0x3059, 0x35D9, 0x305A, 0x35DA,
+ 0x305B, 0x35DB, 0x305C, 0x35DC, 0x305D, 0x35DD, 0x305E, 0x35DE,
+ 0x305F, 0x35DF, 0x3060, 0x35E0, 0x3061, 0x35E1, 0x3062, 0x35E2,
+ 0x3063, 0x35E3, 0x3064, 0x35E4, 0x3065, 0x35E5, 0x3066, 0x35E6,
+ 0x3067, 0x35E7, 0x3068, 0x35E8, 0x3069, 0x35E9, 0x306A, 0x35EA,
+ 0x306B, 0x35EB, 0x306C, 0x35EC, 0x306D, 0x35ED, 0x306E, 0x35EE,
+ 0x306F, 0x35EF, 0x3070, 0x35F0, 0x3071, 0x35F1, 0x3072, 0x35F2,
+ 0x3073, 0x35F3, 0x3074, 0x35F4, 0x3075, 0x35F5, 0x3076, 0x35F6,
+ 0x3077, 0x35F7, 0x3078, 0x35F8, 0x3079, 0x35F9, 0x307A, 0x35FA,
+ 0x307B, 0x35FB, 0x307C, 0x35FC, 0x307D, 0x35FD, 0x307E, 0x35FE,
+ 0x307F, 0x35FF, 0x3080, 0x3600, 0x3081, 0x3601, 0x3082, 0x3602,
+ 0x3083, 0x3603, 0x3084, 0x3604, 0x3085, 0x3605, 0x3086, 0x3606,
+ 0x3087, 0x3607, 0x3088, 0x3608, 0x3089, 0x3609, 0x308A, 0x360A,
+ 0x308B, 0x360B, 0x308C, 0x360C, 0x308D, 0x360D, 0x308E, 0x360E,
+ 0x308F, 0x360F, 0x3090, 0x3610, 0x3091, 0x3611, 0x3092, 0x3612,
+ 0x3093, 0x3613, 0x309D, 0x35B7, 0x309E, 0x35B8, 0x30A1, 0x3614,
+ 0x30A2, 0x3615, 0x30A3, 0x3616, 0x30A4, 0x3617, 0x30A5, 0x3618,
+ 0x30A6, 0x3619, 0x30A7, 0x361A, 0x30A8, 0x361B, 0x30A9, 0x361C,
+ 0x30AA, 0x361D, 0x30AB, 0x361E, 0x30AC, 0x361F, 0x30AD, 0x3620,
+ 0x30AE, 0x3621, 0x30AF, 0x3622, 0x30B0, 0x3623, 0x30B1, 0x3624,
+ 0x30B2, 0x3625, 0x30B3, 0x3626, 0x30B4, 0x3627, 0x30B5, 0x3628,
+ 0x30B6, 0x3629, 0x30B7, 0x362A, 0x30B8, 0x362B, 0x30B9, 0x362C,
+ 0x30BA, 0x362D, 0x30BB, 0x362E, 0x30BC, 0x362F, 0x30BD, 0x3630,
+ 0x30BE, 0x3631, 0x30BF, 0x3632, 0x30C0, 0x3633, 0x30C1, 0x3634,
+ 0x30C2, 0x3635, 0x30C3, 0x3636, 0x30C4, 0x3637, 0x30C5, 0x3638,
+ 0x30C6, 0x3639, 0x30C7, 0x363A, 0x30C8, 0x363B, 0x30C9, 0x363C,
+ 0x30CA, 0x363D, 0x30CB, 0x363E, 0x30CC, 0x363F, 0x30CD, 0x3640,
+ 0x30CE, 0x3641, 0x30CF, 0x3642, 0x30D0, 0x3643, 0x30D1, 0x3644,
+ 0x30D2, 0x3645, 0x30D3, 0x3646, 0x30D4, 0x3647, 0x30D5, 0x3648,
+ 0x30D6, 0x3649, 0x30D7, 0x364A, 0x30D8, 0x364B, 0x30D9, 0x364C,
+ 0x30DA, 0x364D, 0x30DB, 0x364E, 0x30DC, 0x364F, 0x30DD, 0x3650,
+ 0x30DE, 0x3651, 0x30DF, 0x3652, 0x30E0, 0x3653, 0x30E1, 0x3654,
+ 0x30E2, 0x3655, 0x30E3, 0x3656, 0x30E4, 0x3657, 0x30E5, 0x3658,
+ 0x30E6, 0x3659, 0x30E7, 0x365A, 0x30E8, 0x365B, 0x30E9, 0x365C,
+ 0x30EA, 0x365D, 0x30EB, 0x365E, 0x30EC, 0x365F, 0x30ED, 0x3660,
+ 0x30EE, 0x3661, 0x30EF, 0x3662, 0x30F0, 0x3663, 0x30F1, 0x3664,
+ 0x30F2, 0x3665, 0x30F3, 0x3666, 0x30F4, 0x3667, 0x30F5, 0x3668,
+ 0x30F6, 0x3669, 0x30FC, 0x35BD, 0x30FD, 0x35B5, 0x30FE, 0x35B6,
+ 0x3105, 0x01D1, 0x3106, 0x01D2, 0x3107, 0x01D3, 0x3108, 0x01D4,
+ 0x3109, 0x01D5, 0x310A, 0x01D6, 0x310B, 0x01D7, 0x310C, 0x01D8,
+ 0x310D, 0x01D9, 0x310E, 0x01DA, 0x310F, 0x01DB, 0x3110, 0x01DC,
+ 0x3111, 0x01DD, 0x3112, 0x01DE, 0x3113, 0x01DF, 0x3114, 0x01E0,
+ 0x3115, 0x01E1, 0x3116, 0x01E2, 0x3117, 0x01E3, 0x3118, 0x01E4,
+ 0x3119, 0x01E5, 0x311A, 0x01E6, 0x311B, 0x01E7, 0x311C, 0x01E8,
+ 0x311D, 0x01E9, 0x311E, 0x01EA, 0x311F, 0x01EB, 0x3120, 0x01EC,
+ 0x3121, 0x01ED, 0x3122, 0x01EE, 0x3123, 0x01EF, 0x3124, 0x01F0,
+ 0x3125, 0x01F1, 0x3126, 0x01F2, 0x3127, 0x01F3, 0x3128, 0x01F4,
+ 0x3129, 0x01F5, 0x3231, 0x36E5, 0x32A3, 0x00C1, 0x338E, 0x0115,
+ 0x338F, 0x0116, 0x339C, 0x0110, 0x339D, 0x0111, 0x339E, 0x0112,
+ 0x33A1, 0x0114, 0x33C4, 0x0117, 0x33CE, 0x0113, 0x33D1, 0x00EC,
+ 0x33D2, 0x00EB, 0x33D5, 0x010F, 0x361D, 0x36B7, 0x4491, 0x36B4,
+ 0x4E00, 0x0253, 0x4E01, 0x0255, 0x4E03, 0x0256, 0x4E07, 0x1771,
+ 0x4E08, 0x0269, 0x4E09, 0x0267, 0x4E0A, 0x026A, 0x4E0B, 0x0268,
+ 0x4E0C, 0x1772, 0x4E0D, 0x0294, 0x4E0E, 0x177A, 0x4E0F, 0x1778,
+ 0x4E10, 0x0293, 0x4E11, 0x0292, 0x4E14, 0x02F2, 0x4E15, 0x02F1,
+ 0x4E16, 0x02F0, 0x4E18, 0x02F3, 0x4E19, 0x02EF, 0x4E1E, 0x036E,
+ 0x4E1F, 0x036F, 0x4E26, 0x0528, 0x4E28, 0x0218, 0x4E2B, 0x026B,
+ 0x4E2D, 0x0295, 0x4E2E, 0x177B, 0x4E30, 0x0296, 0x4E31, 0x178E,
+ 0x4E32, 0x0415, 0x4E33, 0x18F4, 0x4E36, 0x0219, 0x4E38, 0x026C,
+ 0x4E39, 0x0297, 0x4E3B, 0x02F4, 0x4E3C, 0x178F, 0x4E3F, 0x021A,
+ 0x4E41, 0x36AF, 0x4E42, 0x176C, 0x4E43, 0x0257, 0x4E45, 0x026E,
+ 0x4E47, 0x1773, 0x4E48, 0x026F, 0x4E4B, 0x0298, 0x4E4D, 0x02F5,
+ 0x4E4E, 0x02F7, 0x4E4F, 0x02F6, 0x4E52, 0x0370, 0x4E53, 0x0371,
+ 0x4E56, 0x0529, 0x4E58, 0x0831, 0x4E59, 0x0254, 0x4E5A, 0x36B1,
+ 0x4E5C, 0x176D, 0x4E5D, 0x0258, 0x4E5E, 0x0271, 0x4E5F, 0x0270,
+ 0x4E69, 0x0372, 0x4E73, 0x052A, 0x4E7E, 0x09FB, 0x4E7F, 0x1E35,
+ 0x4E82, 0x0DBE, 0x4E83, 0x2361, 0x4E84, 0x2362, 0x4E85, 0x021B,
+ 0x4E86, 0x0259, 0x4E88, 0x029A, 0x4E8B, 0x052B, 0x4E8C, 0x025A,
+ 0x4E8D, 0x1774, 0x4E8E, 0x0272, 0x4E91, 0x029B, 0x4E92, 0x029D,
+ 0x4E93, 0x177C, 0x4E94, 0x029E, 0x4E95, 0x029C, 0x4E99, 0x0373,
+ 0x4E9B, 0x052C, 0x4E9E, 0x052D, 0x4E9F, 0x06A3, 0x4EA0, 0x021C,
+ 0x4EA1, 0x0273, 0x4EA2, 0x029F, 0x4EA4, 0x0374, 0x4EA5, 0x0376,
+ 0x4EA6, 0x0375, 0x4EA8, 0x0416, 0x4EAB, 0x052E, 0x4EAC, 0x052F,
+ 0x4EAD, 0x06A4, 0x4EAE, 0x06A5, 0x4EB3, 0x0832, 0x4EB6, 0x2363,
+ 0x4EB9, 0x3377, 0x4EBA, 0x025B, 0x4EC0, 0x02A1, 0x4EC1, 0x02A0,
+ 0x4EC2, 0x177D, 0x4EC3, 0x02A2, 0x4EC4, 0x02A8, 0x4EC6, 0x02A3,
+ 0x4EC7, 0x02A4, 0x4EC8, 0x177F, 0x4EC9, 0x177E, 0x4ECA, 0x02A6,
+ 0x4ECB, 0x02A7, 0x4ECD, 0x02A5, 0x4ED4, 0x02FA, 0x4ED5, 0x02FB,
+ 0x4ED6, 0x02FC, 0x4ED7, 0x02FD, 0x4ED8, 0x02F9, 0x4ED9, 0x0300,
+ 0x4EDA, 0x1795, 0x4EDC, 0x1791, 0x4EDD, 0x1794, 0x4EDE, 0x0301,
+ 0x4EDF, 0x0311, 0x4EE1, 0x1793, 0x4EE3, 0x02FE, 0x4EE4, 0x02FF,
+ 0x4EE5, 0x02F8, 0x4EE8, 0x1790, 0x4EE9, 0x1792, 0x4EF0, 0x0383,
+ 0x4EF1, 0x17BA, 0x4EF2, 0x0380, 0x4EF3, 0x0384, 0x4EF4, 0x17C4,
+ 0x4EF5, 0x17B8, 0x4EF6, 0x0381, 0x4EF7, 0x17BC, 0x4EFB, 0x0382,
+ 0x4EFD, 0x0385, 0x4EFF, 0x0377, 0x4F00, 0x17BB, 0x4F01, 0x0386,
+ 0x4F02, 0x17BF, 0x4F04, 0x17C3, 0x4F05, 0x17C0, 0x4F08, 0x17BD,
+ 0x4F09, 0x0378, 0x4F0A, 0x037A, 0x4F0B, 0x0387, 0x4F0D, 0x037C,
+ 0x4F0E, 0x17B5, 0x4F0F, 0x037F, 0x4F10, 0x037D, 0x4F11, 0x037E,
+ 0x4F12, 0x17C5, 0x4F13, 0x17C2, 0x4F14, 0x17B9, 0x4F15, 0x037B,
+ 0x4F18, 0x17B6, 0x4F19, 0x0379, 0x4F1D, 0x17BE, 0x4F22, 0x17C1,
+ 0x4F2C, 0x17B7, 0x4F2D, 0x182F, 0x4F2F, 0x042C, 0x4F30, 0x041F,
+ 0x4F33, 0x1830, 0x4F34, 0x041C, 0x4F36, 0x042E, 0x4F38, 0x0424,
+ 0x4F3A, 0x0423, 0x4F3B, 0x1824, 0x4F3C, 0x0427, 0x4F3D, 0x0422,
+ 0x4F3E, 0x1829, 0x4F3F, 0x1831, 0x4F41, 0x182D, 0x4F43, 0x0425,
+ 0x4F46, 0x0428, 0x4F47, 0x0419, 0x4F48, 0x0431, 0x4F49, 0x1826,
+ 0x4F4C, 0x1900, 0x4F4D, 0x0417, 0x4F4E, 0x042D, 0x4F4F, 0x0418,
+ 0x4F50, 0x0420, 0x4F51, 0x0421, 0x4F52, 0x182B, 0x4F53, 0x1827,
+ 0x4F54, 0x0426, 0x4F55, 0x041E, 0x4F56, 0x1823, 0x4F57, 0x041A,
+ 0x4F58, 0x182E, 0x4F59, 0x042F, 0x4F5A, 0x0432, 0x4F5B, 0x041D,
+ 0x4F5C, 0x042A, 0x4F5D, 0x0430, 0x4F5E, 0x041B, 0x4F5F, 0x182C,
+ 0x4F60, 0x042B, 0x4F61, 0x1832, 0x4F62, 0x1825, 0x4F63, 0x0429,
+ 0x4F64, 0x1828, 0x4F67, 0x182A, 0x4F69, 0x053D, 0x4F6A, 0x1902,
+ 0x4F6B, 0x190E, 0x4F6C, 0x0535, 0x4F6E, 0x190F, 0x4F6F, 0x0530,
+ 0x4F70, 0x053A, 0x4F73, 0x0533, 0x4F74, 0x18FC, 0x4F75, 0x053B,
+ 0x4F76, 0x18FB, 0x4F77, 0x18FF, 0x4F78, 0x1906, 0x4F79, 0x1904,
+ 0x4F7A, 0x0543, 0x4F7B, 0x053E, 0x4F7C, 0x18F6, 0x4F7D, 0x18F8,
+ 0x4F7E, 0x0540, 0x4F7F, 0x0534, 0x4F80, 0x18F9, 0x4F81, 0x1905,
+ 0x4F82, 0x190C, 0x4F83, 0x0539, 0x4F84, 0x18FE, 0x4F85, 0x18F7,
+ 0x4F86, 0x0538, 0x4F87, 0x18FA, 0x4F88, 0x053C, 0x4F89, 0x18FD,
+ 0x4F8B, 0x0537, 0x4F8D, 0x0532, 0x4F8F, 0x0541, 0x4F90, 0x1907,
+ 0x4F91, 0x0542, 0x4F92, 0x190B, 0x4F94, 0x1909, 0x4F95, 0x190D,
+ 0x4F96, 0x053F, 0x4F97, 0x1901, 0x4F98, 0x18F5, 0x4F9A, 0x1903,
+ 0x4F9B, 0x0536, 0x4F9C, 0x1908, 0x4F9D, 0x0531, 0x4F9E, 0x190A,
+ 0x4FAE, 0x06B4, 0x4FAF, 0x06A8, 0x4FB2, 0x1A5D, 0x4FB3, 0x1A65,
+ 0x4FB5, 0x06A7, 0x4FB6, 0x06AF, 0x4FB7, 0x06BB, 0x4FB9, 0x1A6B,
+ 0x4FBA, 0x1A69, 0x4FBB, 0x1A64, 0x4FBF, 0x06A9, 0x4FC0, 0x1A6A,
+ 0x4FC1, 0x1A60, 0x4FC2, 0x06B7, 0x4FC3, 0x06AE, 0x4FC4, 0x06B6,
+ 0x4FC5, 0x1A5B, 0x4FC7, 0x1A67, 0x4FC9, 0x1A5E, 0x4FCA, 0x06B2,
+ 0x4FCB, 0x1A5F, 0x4FCD, 0x1A5A, 0x4FCE, 0x06B9, 0x4FCF, 0x06AC,
+ 0x4FD0, 0x06B5, 0x4FD1, 0x06AB, 0x4FD3, 0x1A5C, 0x4FD4, 0x1A61,
+ 0x4FD6, 0x1A68, 0x4FD7, 0x06B3, 0x4FD8, 0x06B0, 0x4FD9, 0x1A63,
+ 0x4FDA, 0x06B8, 0x4FDB, 0x1A66, 0x4FDC, 0x1A62, 0x4FDD, 0x06AD,
+ 0x4FDE, 0x06BA, 0x4FDF, 0x06B1, 0x4FE0, 0x06AA, 0x4FE1, 0x06A6,
+ 0x4FEC, 0x1A6C, 0x4FEE, 0x084C, 0x4FEF, 0x0836, 0x4FF1, 0x0846,
+ 0x4FF3, 0x084B, 0x4FF4, 0x1C24, 0x4FF5, 0x1C23, 0x4FF6, 0x1C28,
+ 0x4FF7, 0x1C29, 0x4FF8, 0x0839, 0x4FFA, 0x0842, 0x4FFE, 0x084F,
+ 0x5000, 0x0843, 0x5005, 0x1C1D, 0x5006, 0x083C, 0x5007, 0x1C1E,
+ 0x5009, 0x0851, 0x500B, 0x0848, 0x500C, 0x0833, 0x500D, 0x0834,
+ 0x500E, 0x1C31, 0x500F, 0x0A0C, 0x5011, 0x0841, 0x5012, 0x0840,
+ 0x5013, 0x1C1F, 0x5014, 0x0844, 0x5015, 0x1E45, 0x5016, 0x083B,
+ 0x5017, 0x1C2A, 0x5018, 0x084A, 0x5019, 0x0849, 0x501A, 0x083F,
+ 0x501B, 0x1C22, 0x501C, 0x1C2B, 0x501E, 0x1C1C, 0x501F, 0x083E,
+ 0x5020, 0x1C2C, 0x5021, 0x0847, 0x5022, 0x1C20, 0x5023, 0x0835,
+ 0x5025, 0x0838, 0x5026, 0x0837, 0x5027, 0x1C2D, 0x5028, 0x0845,
+ 0x5029, 0x083A, 0x502A, 0x084E, 0x502B, 0x0850, 0x502C, 0x1C27,
+ 0x502D, 0x084D, 0x502F, 0x1C2F, 0x5030, 0x1C21, 0x5031, 0x1C30,
+ 0x5033, 0x1C25, 0x5035, 0x1C2E, 0x5037, 0x1C26, 0x503C, 0x083D,
+ 0x5040, 0x1E4D, 0x5041, 0x1E41, 0x5043, 0x0A00, 0x5045, 0x1E46,
+ 0x5046, 0x1E4C, 0x5047, 0x09FF, 0x5048, 0x1E3F, 0x5049, 0x0A03,
+ 0x504A, 0x1E43, 0x504B, 0x1E3C, 0x504C, 0x0A01, 0x504D, 0x1E40,
+ 0x504E, 0x0A06, 0x504F, 0x0A0B, 0x5051, 0x1E51, 0x5053, 0x1E3B,
+ 0x5055, 0x0A07, 0x5057, 0x1E50, 0x505A, 0x0A02, 0x505B, 0x1E42,
+ 0x505C, 0x09FE, 0x505D, 0x1E3D, 0x505E, 0x1E39, 0x505F, 0x1E47,
+ 0x5060, 0x1E3A, 0x5061, 0x1E38, 0x5062, 0x1E44, 0x5063, 0x1E4A,
+ 0x5064, 0x1E4B, 0x5065, 0x0A04, 0x5068, 0x20B8, 0x5069, 0x1E48,
+ 0x506A, 0x1E37, 0x506B, 0x1E49, 0x506D, 0x0A0E, 0x506E, 0x1E4E,
+ 0x506F, 0x0A0D, 0x5070, 0x1E36, 0x5072, 0x1E3E, 0x5073, 0x1E4F,
+ 0x5074, 0x0A09, 0x5075, 0x0A08, 0x5076, 0x0A05, 0x5077, 0x0A0A,
+ 0x507A, 0x09FC, 0x507D, 0x09FD, 0x5080, 0x0BEC, 0x5082, 0x20BB,
+ 0x5083, 0x20B4, 0x5085, 0x0BE9, 0x5087, 0x20BC, 0x508B, 0x20B2,
+ 0x508C, 0x20B5, 0x508D, 0x0BE8, 0x508E, 0x20B6, 0x5091, 0x0BEB,
+ 0x5092, 0x20BA, 0x5094, 0x20B0, 0x5095, 0x20AF, 0x5096, 0x0BED,
+ 0x5098, 0x0BEE, 0x5099, 0x0BEA, 0x509A, 0x0BEF, 0x509B, 0x20AE,
+ 0x509C, 0x20B9, 0x509D, 0x20B7, 0x509E, 0x20B1, 0x50A2, 0x0BE7,
+ 0x50A3, 0x20B3, 0x50AC, 0x0DC5, 0x50AD, 0x0DBF, 0x50AE, 0x2367,
+ 0x50AF, 0x0DC8, 0x50B0, 0x236D, 0x50B1, 0x2370, 0x50B2, 0x0DC1,
+ 0x50B3, 0x0DC2, 0x50B4, 0x236A, 0x50B5, 0x0DC0, 0x50B6, 0x2373,
+ 0x50B7, 0x0DC6, 0x50B8, 0x2374, 0x50BA, 0x236F, 0x50BB, 0x0DC7,
+ 0x50BD, 0x2364, 0x50BE, 0x0DC4, 0x50BF, 0x2365, 0x50C1, 0x236E,
+ 0x50C2, 0x236C, 0x50C4, 0x2368, 0x50C5, 0x0DC3, 0x50C6, 0x2366,
+ 0x50C7, 0x0DC9, 0x50C8, 0x236B, 0x50C9, 0x2372, 0x50CA, 0x2369,
+ 0x50CB, 0x2371, 0x50CE, 0x0F88, 0x50CF, 0x0F85, 0x50D1, 0x0F86,
+ 0x50D3, 0x261C, 0x50D4, 0x2614, 0x50D5, 0x0F84, 0x50D6, 0x0F81,
+ 0x50D7, 0x2615, 0x50DA, 0x0F83, 0x50DB, 0x2618, 0x50DD, 0x261A,
+ 0x50E0, 0x2621, 0x50E3, 0x2620, 0x50E4, 0x261B, 0x50E5, 0x0F80,
+ 0x50E6, 0x2613, 0x50E7, 0x0F7E, 0x50E8, 0x2616, 0x50E9, 0x0F89,
+ 0x50EA, 0x2619, 0x50EC, 0x261D, 0x50ED, 0x0F82, 0x50EE, 0x0F7F,
+ 0x50EF, 0x261F, 0x50F0, 0x261E, 0x50F1, 0x0F87, 0x50F3, 0x2617,
+ 0x50F5, 0x1105, 0x50F6, 0x2883, 0x50F8, 0x2880, 0x50F9, 0x1106,
+ 0x50FB, 0x1104, 0x50FD, 0x2887, 0x50FE, 0x2884, 0x50FF, 0x287D,
+ 0x5100, 0x1103, 0x5102, 0x1107, 0x5103, 0x287E, 0x5104, 0x1102,
+ 0x5105, 0x110A, 0x5106, 0x2881, 0x5107, 0x2882, 0x5108, 0x1108,
+ 0x5109, 0x1109, 0x510A, 0x2888, 0x510B, 0x2885, 0x510C, 0x2886,
+ 0x5110, 0x128D, 0x5111, 0x2B04, 0x5112, 0x128A, 0x5113, 0x2B01,
+ 0x5114, 0x128C, 0x5115, 0x128E, 0x5117, 0x2B02, 0x5118, 0x128B,
+ 0x511A, 0x2B03, 0x511C, 0x2B00, 0x511F, 0x13B5, 0x5120, 0x2D3E,
+ 0x5121, 0x13B6, 0x5122, 0x2D3C, 0x5124, 0x2D3D, 0x5125, 0x2D3B,
+ 0x5126, 0x2D3A, 0x5129, 0x2D3F, 0x512A, 0x13B4, 0x512D, 0x2F0F,
+ 0x512E, 0x2F10, 0x5130, 0x287F, 0x5131, 0x2F0E, 0x5132, 0x13B7,
+ 0x5133, 0x1575, 0x5134, 0x307A, 0x5135, 0x307B, 0x5137, 0x1668,
+ 0x5138, 0x1669, 0x5139, 0x32C6, 0x513A, 0x32C5, 0x513B, 0x16BC,
+ 0x513C, 0x16BB, 0x513D, 0x340E, 0x513F, 0x025C, 0x5140, 0x0274,
+ 0x5141, 0x02AA, 0x5143, 0x02A9, 0x5144, 0x0303, 0x5145, 0x0302,
+ 0x5146, 0x038A, 0x5147, 0x0389, 0x5148, 0x038B, 0x5149, 0x0388,
+ 0x514B, 0x0434, 0x514C, 0x0433, 0x514D, 0x0435, 0x5152, 0x0545,
+ 0x5154, 0x0544, 0x5155, 0x0546, 0x5157, 0x06BC, 0x5159, 0x0119,
+ 0x515A, 0x1C32, 0x515B, 0x011A, 0x515C, 0x0A0F, 0x515D, 0x011C,
+ 0x515E, 0x011B, 0x515F, 0x20BD, 0x5161, 0x011D, 0x5162, 0x0F8A,
+ 0x5163, 0x011E, 0x5165, 0x025D, 0x5167, 0x02AB, 0x5168, 0x038C,
+ 0x5169, 0x0547, 0x516B, 0x025E, 0x516C, 0x02AE, 0x516D, 0x02AC,
+ 0x516E, 0x02AD, 0x5171, 0x038D, 0x5175, 0x0436, 0x5176, 0x0549,
+ 0x5177, 0x0548, 0x5178, 0x054A, 0x517C, 0x0852, 0x5180, 0x128F,
+ 0x5182, 0x021D, 0x5187, 0x1779, 0x5188, 0x36B6, 0x5189, 0x0304,
+ 0x518A, 0x0305, 0x518D, 0x038E, 0x518F, 0x1833, 0x5191, 0x06BE,
+ 0x5192, 0x06BD, 0x5193, 0x1C34, 0x5194, 0x1C33, 0x5195, 0x0A10,
+ 0x5196, 0x021E, 0x5197, 0x02AF, 0x5198, 0x1780, 0x519E, 0x1910,
+ 0x51A0, 0x06BF, 0x51A2, 0x0855, 0x51A4, 0x0853, 0x51A5, 0x0854,
+ 0x51AA, 0x1290, 0x51AB, 0x021F, 0x51AC, 0x0306, 0x51B0, 0x038F,
+ 0x51B1, 0x17C6, 0x51B6, 0x0437, 0x51B7, 0x0438, 0x51B9, 0x1834,
+ 0x51BC, 0x1911, 0x51BD, 0x054B, 0x51BE, 0x1912, 0x51C4, 0x1C36,
+ 0x51C5, 0x1C37, 0x51C6, 0x0858, 0x51C8, 0x1C38, 0x51CA, 0x1C35,
+ 0x51CB, 0x0859, 0x51CC, 0x0857, 0x51CD, 0x0856, 0x51CE, 0x1C39,
+ 0x51D0, 0x1E52, 0x51D4, 0x20BE, 0x51D7, 0x2375, 0x51D8, 0x2622,
+ 0x51DC, 0x110B, 0x51DD, 0x1291, 0x51DE, 0x2B05, 0x51E0, 0x025F,
+ 0x51E1, 0x026D, 0x51F0, 0x0A11, 0x51F1, 0x0BF1, 0x51F3, 0x0F8B,
+ 0x51F5, 0x176E, 0x51F6, 0x02B0, 0x51F8, 0x0309, 0x51F9, 0x0307,
+ 0x51FA, 0x0308, 0x51FD, 0x054C, 0x5200, 0x0260, 0x5201, 0x0261,
+ 0x5202, 0x36B3, 0x5203, 0x0275, 0x5206, 0x02B1, 0x5207, 0x02B2,
+ 0x5208, 0x02B3, 0x5209, 0x1797, 0x520A, 0x030A, 0x520C, 0x1796,
+ 0x520E, 0x0393, 0x5210, 0x17C8, 0x5211, 0x0391, 0x5212, 0x0392,
+ 0x5213, 0x17C7, 0x5216, 0x0394, 0x5217, 0x0390, 0x521C, 0x1835,
+ 0x521D, 0x068B, 0x521E, 0x1836, 0x5221, 0x1837, 0x5224, 0x043A,
+ 0x5225, 0x0439, 0x5228, 0x043D, 0x5229, 0x043B, 0x522A, 0x043C,
+ 0x522E, 0x0552, 0x5230, 0x0551, 0x5231, 0x1917, 0x5232, 0x1914,
+ 0x5233, 0x1915, 0x5235, 0x1913, 0x5236, 0x0553, 0x5237, 0x054F,
+ 0x5238, 0x054E, 0x523A, 0x0550, 0x523B, 0x054D, 0x5241, 0x0554,
+ 0x5243, 0x06C1, 0x5244, 0x1A6D, 0x5246, 0x1916, 0x5247, 0x06C6,
+ 0x5249, 0x1A6E, 0x524A, 0x06C2, 0x524B, 0x06C5, 0x524C, 0x06C4,
+ 0x524D, 0x06C3, 0x524E, 0x06C0, 0x5252, 0x1C3C, 0x5254, 0x085C,
+ 0x5255, 0x1C3F, 0x5256, 0x085A, 0x525A, 0x1C3B, 0x525B, 0x085D,
+ 0x525C, 0x085B, 0x525D, 0x085E, 0x525E, 0x1C3D, 0x525F, 0x1C3E,
+ 0x5261, 0x1C3A, 0x5262, 0x1C40, 0x5269, 0x0BF5, 0x526A, 0x0A12,
+ 0x526B, 0x1E53, 0x526C, 0x1E55, 0x526D, 0x1E54, 0x526E, 0x1E56,
+ 0x526F, 0x0A13, 0x5272, 0x0BF2, 0x5274, 0x0BF3, 0x5275, 0x0BF4,
+ 0x5277, 0x0DCB, 0x5278, 0x2377, 0x527A, 0x2376, 0x527B, 0x2378,
+ 0x527C, 0x2379, 0x527D, 0x0DCC, 0x527F, 0x0DCA, 0x5280, 0x2623,
+ 0x5281, 0x2624, 0x5282, 0x0F8D, 0x5283, 0x0F8C, 0x5284, 0x2776,
+ 0x5287, 0x110C, 0x5288, 0x110D, 0x5289, 0x110E, 0x528A, 0x1110,
+ 0x528B, 0x2889, 0x528C, 0x288A, 0x528D, 0x110F, 0x5291, 0x1292,
+ 0x5293, 0x1293, 0x5296, 0x307C, 0x5297, 0x32C8, 0x5298, 0x32C7,
+ 0x5299, 0x340F, 0x529B, 0x0262, 0x529F, 0x030C, 0x52A0, 0x030B,
+ 0x52A3, 0x0395, 0x52A6, 0x17C9, 0x52A9, 0x043F, 0x52AA, 0x0440,
+ 0x52AB, 0x043E, 0x52AC, 0x0441, 0x52AD, 0x1838, 0x52AE, 0x1839,
+ 0x52BB, 0x0556, 0x52BC, 0x1918, 0x52BE, 0x0555, 0x52C0, 0x1A6F,
+ 0x52C1, 0x06CA, 0x52C2, 0x1A70, 0x52C3, 0x06C9, 0x52C7, 0x06C7,
+ 0x52C9, 0x06C8, 0x52CD, 0x1C41, 0x52D2, 0x0A14, 0x52D3, 0x1E58,
+ 0x52D5, 0x0A17, 0x52D6, 0x1E57, 0x52D7, 0x0ACF, 0x52D8, 0x0A16,
+ 0x52D9, 0x0A15, 0x52DB, 0x0BF8, 0x52DD, 0x0BF7, 0x52DE, 0x0BF6,
+ 0x52DF, 0x0DCD, 0x52E2, 0x0DD0, 0x52E3, 0x0DD1, 0x52E4, 0x0DCF,
+ 0x52E6, 0x0DCE, 0x52E9, 0x2625, 0x52EB, 0x2626, 0x52EF, 0x288C,
+ 0x52F0, 0x1111, 0x52F1, 0x288B, 0x52F3, 0x1294, 0x52F4, 0x2D40,
+ 0x52F5, 0x13B8, 0x52F7, 0x307D, 0x52F8, 0x1609, 0x52F9, 0x0220,
+ 0x52FA, 0x0276, 0x52FB, 0x02B4, 0x52FC, 0x1781, 0x52FE, 0x02B5,
+ 0x52FF, 0x02B6, 0x5305, 0x030D, 0x5306, 0x030E, 0x5308, 0x0396,
+ 0x5309, 0x183A, 0x530A, 0x1919, 0x530B, 0x191A, 0x530D, 0x06CB,
+ 0x530E, 0x1C42, 0x530F, 0x0A19, 0x5310, 0x0A18, 0x5311, 0x20C0,
+ 0x5312, 0x20BF, 0x5315, 0x0263, 0x5316, 0x02B7, 0x5317, 0x030F,
+ 0x5319, 0x0A1A, 0x531A, 0x176F, 0x531C, 0x1798, 0x531D, 0x0310,
+ 0x531F, 0x17CB, 0x5320, 0x0398, 0x5321, 0x0397, 0x5322, 0x17CA,
+ 0x5323, 0x0442, 0x532A, 0x085F, 0x532D, 0x1E59, 0x532F, 0x0DD2,
+ 0x5330, 0x2627, 0x5331, 0x0F8E, 0x5334, 0x2B06, 0x5337, 0x31C7,
+ 0x5338, 0x0221, 0x5339, 0x02B8, 0x533C, 0x191B, 0x533D, 0x1A71,
+ 0x533E, 0x0A1D, 0x533F, 0x0A1B, 0x5340, 0x0A1C, 0x5341, 0x0264,
+ 0x5343, 0x0277, 0x5344, 0x016B, 0x5345, 0x02BB, 0x5347, 0x02BA,
+ 0x5348, 0x02B9, 0x5349, 0x0313, 0x534A, 0x0312, 0x534C, 0x1799,
+ 0x534D, 0x17CC, 0x5351, 0x055A, 0x5352, 0x0557, 0x5353, 0x0559,
+ 0x5354, 0x0558, 0x5357, 0x06CC, 0x535A, 0x0BF9, 0x535C, 0x0265,
+ 0x535E, 0x02BC, 0x5360, 0x0315, 0x5361, 0x0314, 0x5363, 0x183B,
+ 0x5366, 0x055B, 0x5369, 0x0222, 0x536C, 0x1782, 0x536E, 0x0317,
+ 0x536F, 0x0316, 0x5370, 0x0399, 0x5371, 0x039A, 0x5372, 0x183C,
+ 0x5373, 0x0443, 0x5375, 0x0444, 0x5377, 0x055C, 0x5378, 0x055D,
+ 0x5379, 0x055E, 0x537B, 0x06CD, 0x537C, 0x1A72, 0x537F, 0x0860,
+ 0x5382, 0x1770, 0x5384, 0x02BD, 0x538A, 0x17CD, 0x538E, 0x183D,
+ 0x538F, 0x183E, 0x5392, 0x191C, 0x5394, 0x191D, 0x5396, 0x1A74,
+ 0x5397, 0x1A73, 0x5398, 0x1A76, 0x5399, 0x1A75, 0x539A, 0x06CE,
+ 0x539C, 0x1E5A, 0x539D, 0x0862, 0x539E, 0x1C43, 0x539F, 0x0861,
+ 0x53A4, 0x20C1, 0x53A5, 0x0BFA, 0x53A7, 0x20C2, 0x53AC, 0x2628,
+ 0x53AD, 0x0F8F, 0x53B2, 0x1112, 0x53B4, 0x307E, 0x53B6, 0x0223,
+ 0x53B9, 0x1783, 0x53BB, 0x0318, 0x53C3, 0x0A1E, 0x53C8, 0x0266,
+ 0x53C9, 0x0278, 0x53CA, 0x02BF, 0x53CB, 0x02BE, 0x53CD, 0x02C0,
+ 0x53D4, 0x0560, 0x53D6, 0x055F, 0x53D7, 0x0561, 0x53DB, 0x06CF,
+ 0x53DF, 0x0863, 0x53E1, 0x2B07, 0x53E2, 0x14C9, 0x53E3, 0x0279,
+ 0x53E4, 0x031A, 0x53E5, 0x0329, 0x53E6, 0x0324, 0x53E8, 0x031F,
+ 0x53E9, 0x031E, 0x53EA, 0x0325, 0x53EB, 0x0323, 0x53EC, 0x031C,
+ 0x53ED, 0x032A, 0x53EE, 0x031D, 0x53EF, 0x0319, 0x53F0, 0x0328,
+ 0x53F1, 0x0327, 0x53F2, 0x0326, 0x53F3, 0x031B, 0x53F5, 0x0322,
+ 0x53F8, 0x0321, 0x53FB, 0x032B, 0x53FC, 0x0320, 0x5401, 0x03A0,
+ 0x5403, 0x03A6, 0x5404, 0x03A2, 0x5406, 0x03A8, 0x5407, 0x17CE,
+ 0x5408, 0x03A5, 0x5409, 0x039B, 0x540A, 0x039E, 0x540B, 0x03A1,
+ 0x540C, 0x039D, 0x540D, 0x03A4, 0x540E, 0x03A7, 0x540F, 0x039C,
+ 0x5410, 0x039F, 0x5411, 0x03A3, 0x5412, 0x03A9, 0x5418, 0x1847,
+ 0x5419, 0x1844, 0x541B, 0x0451, 0x541C, 0x1845, 0x541D, 0x0445,
+ 0x541E, 0x0447, 0x541F, 0x045F, 0x5420, 0x045A, 0x5424, 0x184C,
+ 0x5425, 0x1846, 0x5426, 0x0449, 0x5427, 0x044B, 0x5428, 0x184B,
+ 0x5429, 0x0452, 0x542A, 0x1841, 0x542B, 0x045E, 0x542C, 0x0460,
+ 0x542D, 0x0446, 0x542E, 0x0457, 0x5430, 0x183F, 0x5431, 0x045D,
+ 0x5433, 0x044E, 0x5435, 0x0458, 0x5436, 0x0459, 0x5437, 0x1840,
+ 0x5438, 0x0456, 0x5439, 0x0454, 0x543B, 0x0455, 0x543C, 0x045B,
+ 0x543D, 0x1848, 0x543E, 0x0448, 0x5440, 0x045C, 0x5441, 0x184A,
+ 0x5442, 0x0450, 0x5443, 0x044D, 0x5445, 0x1843, 0x5446, 0x044C,
+ 0x5447, 0x184D, 0x5448, 0x044F, 0x544A, 0x0453, 0x544E, 0x044A,
+ 0x544F, 0x1849, 0x5454, 0x1842, 0x5460, 0x192E, 0x5461, 0x192D,
+ 0x5462, 0x0573, 0x5463, 0x1930, 0x5464, 0x1932, 0x5465, 0x1927,
+ 0x5466, 0x192A, 0x5467, 0x1931, 0x5468, 0x0574, 0x546B, 0x1924,
+ 0x546C, 0x1928, 0x546F, 0x192C, 0x5470, 0x1A85, 0x5471, 0x056F,
+ 0x5472, 0x1A89, 0x5473, 0x0562, 0x5474, 0x1929, 0x5475, 0x0563,
+ 0x5476, 0x0570, 0x5477, 0x0569, 0x5478, 0x0565, 0x547A, 0x1925,
+ 0x547B, 0x0568, 0x547C, 0x056D, 0x547D, 0x0576, 0x547E, 0x1926,
+ 0x547F, 0x191F, 0x5480, 0x0567, 0x5481, 0x1920, 0x5482, 0x1922,
+ 0x5484, 0x056A, 0x5486, 0x056C, 0x5487, 0x191E, 0x5488, 0x1923,
+ 0x548B, 0x0575, 0x548C, 0x0571, 0x548D, 0x192B, 0x548E, 0x0577,
+ 0x5490, 0x056E, 0x5491, 0x1921, 0x5492, 0x056B, 0x5495, 0x0566,
+ 0x5496, 0x0564, 0x5498, 0x192F, 0x549A, 0x0572, 0x54A0, 0x1A84,
+ 0x54A1, 0x1A78, 0x54A2, 0x1A87, 0x54A5, 0x1A7A, 0x54A6, 0x06D6,
+ 0x54A7, 0x06E4, 0x54A8, 0x06D2, 0x54A9, 0x06E3, 0x54AA, 0x06DB,
+ 0x54AB, 0x06E0, 0x54AC, 0x06D0, 0x54AD, 0x1A79, 0x54AE, 0x1A7F,
+ 0x54AF, 0x06DF, 0x54B0, 0x1A8B, 0x54B1, 0x06E1, 0x54B3, 0x06D7,
+ 0x54B6, 0x1A81, 0x54B7, 0x1A7E, 0x54B8, 0x06D5, 0x54BA, 0x1A77,
+ 0x54BB, 0x06E2, 0x54BC, 0x1A86, 0x54BD, 0x06DA, 0x54BE, 0x1A88,
+ 0x54BF, 0x06E5, 0x54C0, 0x06D1, 0x54C1, 0x06DC, 0x54C2, 0x06D9,
+ 0x54C3, 0x1A7C, 0x54C4, 0x06DD, 0x54C5, 0x1A82, 0x54C6, 0x1A83,
+ 0x54C7, 0x06D8, 0x54C8, 0x06DE, 0x54C9, 0x06D4, 0x54CE, 0x06D3,
+ 0x54CF, 0x1A7B, 0x54D6, 0x1A80, 0x54DE, 0x1A8A, 0x54E0, 0x1C57,
+ 0x54E1, 0x0870, 0x54E2, 0x1C45, 0x54E4, 0x1C4A, 0x54E5, 0x0869,
+ 0x54E6, 0x0874, 0x54E7, 0x1C48, 0x54E8, 0x0864, 0x54E9, 0x086E,
+ 0x54EA, 0x0873, 0x54EB, 0x1C4F, 0x54ED, 0x086F, 0x54EE, 0x0872,
+ 0x54F1, 0x1C52, 0x54F2, 0x086A, 0x54F3, 0x1C49, 0x54F7, 0x1C55,
+ 0x54F8, 0x1C56, 0x54FA, 0x086C, 0x54FB, 0x1C54, 0x54FC, 0x0868,
+ 0x54FD, 0x0877, 0x54FF, 0x1C4C, 0x5501, 0x0866, 0x5503, 0x1C59,
+ 0x5504, 0x1C4D, 0x5505, 0x1C51, 0x5506, 0x086B, 0x5507, 0x0876,
+ 0x5508, 0x1C4E, 0x5509, 0x0871, 0x550A, 0x1C53, 0x550B, 0x1C5A,
+ 0x550C, 0x1E69, 0x550E, 0x1C58, 0x550F, 0x0878, 0x5510, 0x0865,
+ 0x5511, 0x1C50, 0x5512, 0x1C47, 0x5514, 0x086D, 0x5517, 0x1C46,
+ 0x551A, 0x1C4B, 0x5526, 0x1C44, 0x5527, 0x0875, 0x552A, 0x1E61,
+ 0x552C, 0x0A31, 0x552D, 0x1E6F, 0x552E, 0x0A2F, 0x552F, 0x0A2C,
+ 0x5530, 0x1E66, 0x5531, 0x0A28, 0x5532, 0x1E6A, 0x5533, 0x0A33,
+ 0x5534, 0x1E60, 0x5535, 0x1E65, 0x5536, 0x1E64, 0x5537, 0x0867,
+ 0x5538, 0x0A2E, 0x5539, 0x1E6D, 0x553B, 0x1E70, 0x553C, 0x1E5D,
+ 0x553E, 0x0C0C, 0x5540, 0x1E71, 0x5541, 0x0A34, 0x5543, 0x0A26,
+ 0x5544, 0x0A23, 0x5545, 0x1E68, 0x5546, 0x0A20, 0x5548, 0x1E6E,
+ 0x554A, 0x0A27, 0x554B, 0x1E72, 0x554D, 0x1E5E, 0x554E, 0x1E6C,
+ 0x554F, 0x0A2A, 0x5550, 0x1E5F, 0x5551, 0x1E62, 0x5552, 0x1E67,
+ 0x5555, 0x0A2B, 0x5556, 0x0A29, 0x5557, 0x0A35, 0x555C, 0x0A30,
+ 0x555E, 0x0A24, 0x555F, 0x0ABC, 0x5561, 0x0A25, 0x5562, 0x1E63,
+ 0x5563, 0x0A32, 0x5564, 0x0A2D, 0x5565, 0x1E6B, 0x5566, 0x0A22,
+ 0x556A, 0x0A21, 0x5575, 0x1E5B, 0x5576, 0x1E5C, 0x5577, 0x20C7,
+ 0x557B, 0x0BFB, 0x557C, 0x0BFE, 0x557D, 0x20D2, 0x557E, 0x0C12,
+ 0x557F, 0x20D5, 0x5580, 0x0BFC, 0x5581, 0x20CE, 0x5582, 0x0C02,
+ 0x5583, 0x0C08, 0x5584, 0x0D1B, 0x5587, 0x0C06, 0x5588, 0x20CB,
+ 0x5589, 0x0C13, 0x558A, 0x0BFF, 0x558B, 0x0C07, 0x558C, 0x20D3,
+ 0x558D, 0x2387, 0x558E, 0x20D8, 0x558F, 0x20CC, 0x5591, 0x20C3,
+ 0x5592, 0x20D0, 0x5593, 0x20CA, 0x5594, 0x0C05, 0x5595, 0x20D6,
+ 0x5598, 0x0C01, 0x5599, 0x0C15, 0x559A, 0x0C0E, 0x559C, 0x0C03,
+ 0x559D, 0x0C00, 0x559F, 0x0C0B, 0x55A1, 0x20D7, 0x55A2, 0x20C9,
+ 0x55A3, 0x20CF, 0x55A4, 0x20D1, 0x55A5, 0x20C5, 0x55A6, 0x20D4,
+ 0x55A7, 0x0BFD, 0x55A8, 0x20C4, 0x55AA, 0x0C04, 0x55AB, 0x0C14,
+ 0x55AC, 0x0C10, 0x55AD, 0x20C6, 0x55AE, 0x0C0A, 0x55B1, 0x0C11,
+ 0x55B2, 0x0C0D, 0x55B3, 0x0C09, 0x55B5, 0x20CD, 0x55BB, 0x0C0F,
+ 0x55BF, 0x2385, 0x55C0, 0x2381, 0x55C2, 0x2390, 0x55C3, 0x237A,
+ 0x55C4, 0x2383, 0x55C5, 0x0DE0, 0x55C6, 0x0DE1, 0x55C7, 0x0DD9,
+ 0x55C8, 0x238C, 0x55C9, 0x0DE3, 0x55CA, 0x237F, 0x55CB, 0x237E,
+ 0x55CC, 0x237C, 0x55CD, 0x238E, 0x55CE, 0x0DD7, 0x55CF, 0x2388,
+ 0x55D0, 0x237D, 0x55D1, 0x0DDA, 0x55D2, 0x2386, 0x55D3, 0x0DD5,
+ 0x55D4, 0x2382, 0x55D5, 0x2389, 0x55D6, 0x238B, 0x55D9, 0x238F,
+ 0x55DA, 0x0DDE, 0x55DB, 0x237B, 0x55DC, 0x0DD8, 0x55DD, 0x2380,
+ 0x55DF, 0x0DD3, 0x55E1, 0x0DDF, 0x55E2, 0x238A, 0x55E3, 0x0DDB,
+ 0x55E4, 0x0DDC, 0x55E5, 0x0DE2, 0x55E6, 0x0DD6, 0x55E7, 0x011F,
+ 0x55E8, 0x0DD4, 0x55E9, 0x2384, 0x55EF, 0x0DDD, 0x55F2, 0x238D,
+ 0x55F6, 0x0F9F, 0x55F7, 0x0F9A, 0x55F9, 0x2637, 0x55FA, 0x2633,
+ 0x55FC, 0x262D, 0x55FD, 0x0F94, 0x55FE, 0x0F90, 0x55FF, 0x2636,
+ 0x5600, 0x0F91, 0x5601, 0x2630, 0x5602, 0x2632, 0x5604, 0x2635,
+ 0x5606, 0x0F96, 0x5608, 0x0F9D, 0x5609, 0x0F97, 0x560C, 0x262B,
+ 0x560D, 0x0F98, 0x560E, 0x0F99, 0x560F, 0x262E, 0x5610, 0x0F9E,
+ 0x5612, 0x262C, 0x5613, 0x2631, 0x5614, 0x0F95, 0x5615, 0x262A,
+ 0x5616, 0x0F9B, 0x5617, 0x0F93, 0x561B, 0x0F92, 0x561C, 0x262F,
+ 0x561D, 0x2634, 0x561F, 0x0F9C, 0x5627, 0x2629, 0x5629, 0x1119,
+ 0x562A, 0x289D, 0x562C, 0x289A, 0x562E, 0x1113, 0x562F, 0x111F,
+ 0x5630, 0x1120, 0x5632, 0x1116, 0x5633, 0x2898, 0x5634, 0x1118,
+ 0x5635, 0x2890, 0x5636, 0x111E, 0x5638, 0x289C, 0x5639, 0x1115,
+ 0x563A, 0x289E, 0x563B, 0x1114, 0x563D, 0x2899, 0x563E, 0x289B,
+ 0x563F, 0x1117, 0x5640, 0x2897, 0x5641, 0x2891, 0x5642, 0x288E,
+ 0x5645, 0x20C8, 0x5646, 0x2894, 0x5648, 0x288D, 0x5649, 0x2893,
+ 0x564A, 0x2892, 0x564C, 0x288F, 0x564E, 0x111B, 0x5653, 0x111A,
+ 0x5657, 0x111C, 0x5658, 0x2895, 0x5659, 0x1295, 0x565A, 0x2896,
+ 0x565E, 0x2B10, 0x5660, 0x2B09, 0x5662, 0x12A1, 0x5663, 0x2B0D,
+ 0x5664, 0x1299, 0x5665, 0x129D, 0x5666, 0x2B0C, 0x5668, 0x129C,
+ 0x5669, 0x1298, 0x566A, 0x129B, 0x566B, 0x1296, 0x566C, 0x12A0,
+ 0x566D, 0x2B0E, 0x566E, 0x2B0A, 0x566F, 0x129F, 0x5670, 0x2B08,
+ 0x5671, 0x129E, 0x5672, 0x2B0F, 0x5673, 0x2B0B, 0x5674, 0x111D,
+ 0x5676, 0x12A2, 0x5677, 0x2B11, 0x5678, 0x129A, 0x5679, 0x1297,
+ 0x567E, 0x2D47, 0x567F, 0x2D49, 0x5680, 0x13BA, 0x5681, 0x2D4A,
+ 0x5682, 0x2D48, 0x5683, 0x2D46, 0x5684, 0x2D45, 0x5685, 0x13BC,
+ 0x5686, 0x2D44, 0x5687, 0x13BD, 0x568C, 0x2D42, 0x568D, 0x2D43,
+ 0x568E, 0x13B9, 0x568F, 0x13BE, 0x5690, 0x13BB, 0x5693, 0x2D41,
+ 0x5695, 0x14CA, 0x5697, 0x2F13, 0x5698, 0x2F11, 0x5699, 0x2F16,
+ 0x569A, 0x2F14, 0x569C, 0x2F12, 0x569D, 0x2F15, 0x56A5, 0x1576,
+ 0x56A6, 0x3081, 0x56A7, 0x3082, 0x56A8, 0x1577, 0x56AA, 0x3083,
+ 0x56AB, 0x307F, 0x56AC, 0x3084, 0x56AD, 0x3080, 0x56AE, 0x14CB,
+ 0x56B2, 0x31C8, 0x56B3, 0x31CA, 0x56B4, 0x160C, 0x56B5, 0x31C9,
+ 0x56B6, 0x160B, 0x56B7, 0x160A, 0x56BC, 0x160D, 0x56BD, 0x32CA,
+ 0x56BE, 0x32CB, 0x56C0, 0x166B, 0x56C1, 0x166A, 0x56C2, 0x166C,
+ 0x56C3, 0x32C9, 0x56C5, 0x3379, 0x56C6, 0x3378, 0x56C8, 0x16BD,
+ 0x56C9, 0x16BF, 0x56CA, 0x16BE, 0x56CB, 0x337A, 0x56CC, 0x16F6,
+ 0x56CD, 0x3481, 0x56D1, 0x171F, 0x56D3, 0x3480, 0x56D4, 0x34C9,
+ 0x56D7, 0x1775, 0x56DA, 0x032D, 0x56DB, 0x032C, 0x56DD, 0x03AC,
+ 0x56DE, 0x03AB, 0x56DF, 0x17D0, 0x56E0, 0x03AA, 0x56E1, 0x17CF,
+ 0x56E4, 0x0463, 0x56E5, 0x1850, 0x56E7, 0x184F, 0x56EA, 0x0461,
+ 0x56EB, 0x0464, 0x56EE, 0x184E, 0x56F0, 0x0462, 0x56F7, 0x1933,
+ 0x56F9, 0x1934, 0x56FA, 0x0578, 0x56FF, 0x06E6, 0x5701, 0x1C5B,
+ 0x5702, 0x1C5C, 0x5703, 0x0879, 0x5704, 0x087A, 0x5707, 0x1E74,
+ 0x5708, 0x0A36, 0x5709, 0x0A38, 0x570A, 0x1E73, 0x570B, 0x0A37,
+ 0x570C, 0x20D9, 0x570D, 0x0C16, 0x5712, 0x0DE4, 0x5713, 0x0DE5,
+ 0x5714, 0x2391, 0x5716, 0x0FA1, 0x5718, 0x0FA0, 0x571A, 0x289F,
+ 0x571B, 0x2B13, 0x571C, 0x2B12, 0x571E, 0x3505, 0x571F, 0x027A,
+ 0x5720, 0x1784, 0x5722, 0x179A, 0x5723, 0x179B, 0x5728, 0x03AF,
+ 0x5729, 0x03B3, 0x572A, 0x17D2, 0x572C, 0x03B1, 0x572D, 0x03B0,
+ 0x572E, 0x17D1, 0x572F, 0x03B2, 0x5730, 0x03AE, 0x5733, 0x03AD,
+ 0x5734, 0x17D3, 0x573B, 0x046E, 0x573E, 0x046B, 0x5740, 0x0467,
+ 0x5741, 0x1851, 0x5745, 0x1852, 0x5747, 0x0469, 0x5749, 0x1854,
+ 0x574A, 0x0465, 0x574B, 0x1855, 0x574C, 0x1853, 0x574D, 0x0468,
+ 0x574E, 0x046A, 0x574F, 0x046D, 0x5750, 0x046C, 0x5751, 0x0466,
+ 0x5752, 0x1856, 0x5761, 0x057D, 0x5762, 0x1941, 0x5764, 0x057F,
+ 0x5766, 0x057E, 0x5768, 0x1942, 0x5769, 0x057C, 0x576A, 0x057B,
+ 0x576B, 0x1938, 0x576D, 0x1937, 0x576F, 0x1935, 0x5770, 0x193A,
+ 0x5771, 0x1939, 0x5772, 0x1936, 0x5773, 0x193F, 0x5774, 0x1940,
+ 0x5775, 0x193D, 0x5776, 0x193B, 0x5777, 0x057A, 0x577B, 0x193E,
+ 0x577C, 0x0580, 0x577D, 0x1943, 0x5780, 0x193C, 0x5782, 0x06E7,
+ 0x5783, 0x0579, 0x578B, 0x06E8, 0x578C, 0x1A90, 0x578F, 0x1A96,
+ 0x5793, 0x06EE, 0x5794, 0x1A94, 0x5795, 0x1A9A, 0x5797, 0x1A91,
+ 0x5798, 0x1A95, 0x5799, 0x1A97, 0x579A, 0x1A99, 0x579B, 0x1A93,
+ 0x579D, 0x1A92, 0x579E, 0x1A8D, 0x579F, 0x1A8E, 0x57A0, 0x06E9,
+ 0x57A2, 0x06EB, 0x57A3, 0x06EA, 0x57A4, 0x1A8F, 0x57A5, 0x1A98,
+ 0x57AE, 0x06ED, 0x57B5, 0x1A8C, 0x57B6, 0x1C66, 0x57B8, 0x1C65,
+ 0x57B9, 0x1C6A, 0x57BA, 0x1C61, 0x57BC, 0x1C64, 0x57BD, 0x1C63,
+ 0x57BF, 0x1C67, 0x57C1, 0x1C6B, 0x57C2, 0x087B, 0x57C3, 0x087E,
+ 0x57C6, 0x1C62, 0x57C7, 0x1C68, 0x57CB, 0x087D, 0x57CC, 0x1C5D,
+ 0x57CE, 0x06EC, 0x57CF, 0x1E82, 0x57D0, 0x1C69, 0x57D2, 0x1C60,
+ 0x57D4, 0x087C, 0x57D5, 0x1C5F, 0x57DC, 0x1E79, 0x57DF, 0x0A39,
+ 0x57E0, 0x0A3D, 0x57E1, 0x1E89, 0x57E2, 0x1E77, 0x57E3, 0x1E85,
+ 0x57E4, 0x0A3E, 0x57E5, 0x1E87, 0x57E7, 0x1E8D, 0x57E9, 0x1E91,
+ 0x57EC, 0x1E88, 0x57ED, 0x1E7C, 0x57EE, 0x1E84, 0x57F0, 0x1E92,
+ 0x57F1, 0x1E90, 0x57F2, 0x1E86, 0x57F3, 0x1E81, 0x57F4, 0x1E7A,
+ 0x57F5, 0x20E1, 0x57F6, 0x1E78, 0x57F7, 0x0A42, 0x57F8, 0x1E7F,
+ 0x57F9, 0x0A43, 0x57FA, 0x0A3F, 0x57FB, 0x1E75, 0x57FC, 0x1E8B,
+ 0x57FD, 0x1E7D, 0x5800, 0x1E7B, 0x5801, 0x1E8E, 0x5802, 0x0A40,
+ 0x5804, 0x1E94, 0x5805, 0x0A3A, 0x5806, 0x0A3C, 0x5807, 0x1E83,
+ 0x5808, 0x1E7E, 0x5809, 0x087F, 0x580A, 0x0A3B, 0x580B, 0x1E80,
+ 0x580C, 0x1E8F, 0x580D, 0x1E93, 0x580E, 0x1E8A, 0x5810, 0x1E8C,
+ 0x5814, 0x1E76, 0x5819, 0x20DC, 0x581B, 0x20E5, 0x581C, 0x20E4,
+ 0x581D, 0x0C1E, 0x581E, 0x20DD, 0x5820, 0x0C1F, 0x5821, 0x0C1D,
+ 0x5823, 0x20DF, 0x5824, 0x0C1A, 0x5825, 0x20E3, 0x5827, 0x20DE,
+ 0x5828, 0x20E0, 0x5829, 0x20DA, 0x582A, 0x0C18, 0x582C, 0x20ED,
+ 0x582D, 0x20EC, 0x582E, 0x20E9, 0x582F, 0x0C17, 0x5830, 0x0C1B,
+ 0x5831, 0x0C1C, 0x5832, 0x1C5E, 0x5833, 0x20E6, 0x5834, 0x0C19,
+ 0x5835, 0x0A41, 0x5836, 0x20E8, 0x5837, 0x20DB, 0x5838, 0x20EB,
+ 0x5839, 0x20EA, 0x583B, 0x20EE, 0x583D, 0x239F, 0x583F, 0x20E7,
+ 0x5848, 0x20E2, 0x5849, 0x2397, 0x584A, 0x0DEF, 0x584B, 0x0DF2,
+ 0x584C, 0x0DED, 0x584D, 0x2396, 0x584E, 0x239A, 0x584F, 0x2395,
+ 0x5851, 0x0DE7, 0x5852, 0x0DF1, 0x5853, 0x2392, 0x5854, 0x0DEB,
+ 0x5855, 0x2399, 0x5857, 0x0DE9, 0x5858, 0x0DE8, 0x5859, 0x239C,
+ 0x585A, 0x0DEA, 0x585B, 0x239E, 0x585D, 0x239B, 0x585E, 0x0DE6,
+ 0x5862, 0x0DF0, 0x5863, 0x23A0, 0x5864, 0x2394, 0x5865, 0x239D,
+ 0x5868, 0x2393, 0x586B, 0x0DEC, 0x586D, 0x0DEE, 0x586F, 0x2398,
+ 0x5871, 0x23A1, 0x5874, 0x263F, 0x5875, 0x0FA2, 0x5876, 0x2645,
+ 0x5879, 0x0FA7, 0x587A, 0x2641, 0x587B, 0x2648, 0x587C, 0x2639,
+ 0x587D, 0x0FA9, 0x587E, 0x0FA3, 0x587F, 0x263E, 0x5880, 0x1121,
+ 0x5881, 0x263D, 0x5882, 0x2646, 0x5883, 0x0FA4, 0x5885, 0x0FA8,
+ 0x5886, 0x263C, 0x5887, 0x2642, 0x5888, 0x2647, 0x5889, 0x2638,
+ 0x588A, 0x0FA6, 0x588B, 0x2640, 0x588E, 0x2644, 0x588F, 0x264A,
+ 0x5890, 0x263A, 0x5891, 0x2643, 0x5893, 0x0FA5, 0x5894, 0x2649,
+ 0x5898, 0x263B, 0x589C, 0x1125, 0x589D, 0x28A1, 0x589E, 0x1123,
+ 0x589F, 0x1122, 0x58A0, 0x28A3, 0x58A1, 0x28A8, 0x58A3, 0x28A4,
+ 0x58A5, 0x28A7, 0x58A6, 0x1128, 0x58A8, 0x1288, 0x58A9, 0x1127,
+ 0x58AB, 0x28A0, 0x58AC, 0x28A6, 0x58AE, 0x1126, 0x58AF, 0x28A5,
+ 0x58B1, 0x28A2, 0x58B3, 0x1124, 0x58BA, 0x2B18, 0x58BB, 0x36EB,
+ 0x58BC, 0x2B1A, 0x58BD, 0x2B15, 0x58BE, 0x12A4, 0x58BF, 0x2B17,
+ 0x58C1, 0x12A3, 0x58C2, 0x2B19, 0x58C5, 0x12A6, 0x58C6, 0x2B1B,
+ 0x58C7, 0x12A5, 0x58C8, 0x2B14, 0x58C9, 0x2B16, 0x58CE, 0x13C2,
+ 0x58CF, 0x2D4D, 0x58D1, 0x13C1, 0x58D2, 0x2D4E, 0x58D3, 0x13C0,
+ 0x58D4, 0x2D4C, 0x58D5, 0x13BF, 0x58D6, 0x2D4B, 0x58D8, 0x14CD,
+ 0x58D9, 0x14CC, 0x58DA, 0x3085, 0x58DB, 0x3087, 0x58DD, 0x3086,
+ 0x58DE, 0x1578, 0x58DF, 0x1579, 0x58E2, 0x157A, 0x58E3, 0x31CB,
+ 0x58E4, 0x160E, 0x58E7, 0x3411, 0x58E8, 0x3410, 0x58E9, 0x1720,
+ 0x58EB, 0x027B, 0x58EC, 0x02C1, 0x58EF, 0x046F, 0x58F4, 0x1A9B,
+ 0x58F9, 0x0C20, 0x58FA, 0x0C21, 0x58FC, 0x23A2, 0x58FD, 0x0FAA,
+ 0x58FE, 0x264B, 0x58FF, 0x28A9, 0x5902, 0x0224, 0x5903, 0x1785,
+ 0x5906, 0x1857, 0x590A, 0x0224, 0x590C, 0x1944, 0x590D, 0x1A9C,
+ 0x590E, 0x1C6C, 0x590F, 0x0880, 0x5912, 0x3088, 0x5914, 0x166D,
+ 0x5915, 0x027C, 0x5916, 0x032E, 0x5917, 0x179C, 0x5919, 0x03B4,
+ 0x591A, 0x03B5, 0x591C, 0x0581, 0x5920, 0x0A44, 0x5922, 0x0FAC,
+ 0x5924, 0x0FAD, 0x5925, 0x0FAB, 0x5927, 0x027D, 0x5929, 0x02C2,
+ 0x592A, 0x02C4, 0x592B, 0x02C3, 0x592C, 0x1786, 0x592D, 0x02C5,
+ 0x592E, 0x032F, 0x592F, 0x179D, 0x5931, 0x0330, 0x5937, 0x03B6,
+ 0x5938, 0x03B7, 0x593C, 0x17D4, 0x593E, 0x0470, 0x5940, 0x1858,
+ 0x5944, 0x0585, 0x5945, 0x1945, 0x5947, 0x0583, 0x5948, 0x0584,
+ 0x5949, 0x0582, 0x594A, 0x1C6D, 0x594E, 0x06F2, 0x594F, 0x06F1,
+ 0x5950, 0x06F3, 0x5951, 0x06F0, 0x5953, 0x1A9D, 0x5954, 0x0586,
+ 0x5955, 0x06EF, 0x5957, 0x0881, 0x5958, 0x0882, 0x595A, 0x0883,
+ 0x595C, 0x1E95, 0x5960, 0x0C22, 0x5961, 0x20EF, 0x5962, 0x0A45,
+ 0x5967, 0x0DF3, 0x5969, 0x0FAF, 0x596A, 0x0FAE, 0x596B, 0x264C,
+ 0x596D, 0x1129, 0x596E, 0x12A7, 0x5970, 0x2F17, 0x5971, 0x337B,
+ 0x5972, 0x3412, 0x5973, 0x027E, 0x5974, 0x0331, 0x5976, 0x0332,
+ 0x5977, 0x17DA, 0x5978, 0x03B9, 0x5979, 0x03BC, 0x597B, 0x17D8,
+ 0x597C, 0x17D6, 0x597D, 0x03BB, 0x597E, 0x17D9, 0x597F, 0x17DB,
+ 0x5980, 0x17D5, 0x5981, 0x03BE, 0x5982, 0x03BD, 0x5983, 0x03BA,
+ 0x5984, 0x03B8, 0x5985, 0x17D7, 0x598A, 0x047B, 0x598D, 0x0478,
+ 0x598E, 0x185D, 0x598F, 0x1860, 0x5990, 0x185F, 0x5992, 0x0472,
+ 0x5993, 0x047A, 0x5996, 0x0477, 0x5997, 0x185C, 0x5998, 0x185A,
+ 0x5999, 0x0476, 0x599D, 0x0471, 0x599E, 0x0474, 0x59A0, 0x185B,
+ 0x59A1, 0x1862, 0x59A2, 0x185E, 0x59A3, 0x0475, 0x59A4, 0x0479,
+ 0x59A5, 0x047C, 0x59A6, 0x1859, 0x59A7, 0x1861, 0x59A8, 0x0473,
+ 0x59AE, 0x058B, 0x59AF, 0x0593, 0x59B1, 0x1951, 0x59B2, 0x194A,
+ 0x59B3, 0x0594, 0x59B4, 0x1955, 0x59B5, 0x1946, 0x59B6, 0x194D,
+ 0x59B9, 0x058A, 0x59BA, 0x1947, 0x59BB, 0x0588, 0x59BC, 0x194E,
+ 0x59BD, 0x1952, 0x59BE, 0x0587, 0x59C0, 0x1953, 0x59C1, 0x194C,
+ 0x59C3, 0x194F, 0x59C5, 0x0596, 0x59C6, 0x058D, 0x59C7, 0x1956,
+ 0x59C8, 0x1954, 0x59CA, 0x0592, 0x59CB, 0x0590, 0x59CC, 0x194B,
+ 0x59CD, 0x058F, 0x59CE, 0x1949, 0x59CF, 0x1948, 0x59D0, 0x058E,
+ 0x59D1, 0x058C, 0x59D2, 0x0595, 0x59D3, 0x0591, 0x59D4, 0x0589,
+ 0x59D6, 0x1950, 0x59D8, 0x06F5, 0x59DA, 0x06FC, 0x59DB, 0x1AAB,
+ 0x59DC, 0x06F4, 0x59DD, 0x1AA3, 0x59DE, 0x1A9F, 0x59E0, 0x1AAF,
+ 0x59E1, 0x1A9E, 0x59E3, 0x06F7, 0x59E4, 0x1AA8, 0x59E5, 0x06FA,
+ 0x59E6, 0x06FD, 0x59E8, 0x06F8, 0x59E9, 0x1AAC, 0x59EA, 0x06FB,
+ 0x59EC, 0x088A, 0x59ED, 0x1AB2, 0x59EE, 0x1AA0, 0x59F1, 0x1AA2,
+ 0x59F2, 0x1AA9, 0x59F3, 0x1AAD, 0x59F4, 0x1AB1, 0x59F5, 0x1AAE,
+ 0x59F6, 0x1AA7, 0x59F7, 0x1AAA, 0x59FA, 0x1AA4, 0x59FB, 0x06FF,
+ 0x59FC, 0x1AA6, 0x59FD, 0x1AA5, 0x59FE, 0x1AB0, 0x59FF, 0x06F6,
+ 0x5A00, 0x1AA1, 0x5A01, 0x06FE, 0x5A03, 0x06F9, 0x5A09, 0x0890,
+ 0x5A0A, 0x1C75, 0x5A0C, 0x088F, 0x5A0F, 0x1C73, 0x5A11, 0x0884,
+ 0x5A13, 0x0889, 0x5A15, 0x1C72, 0x5A16, 0x1C6F, 0x5A17, 0x1C74,
+ 0x5A18, 0x0885, 0x5A19, 0x1C6E, 0x5A1B, 0x0888, 0x5A1C, 0x0886,
+ 0x5A1E, 0x1C76, 0x5A1F, 0x0887, 0x5A20, 0x088B, 0x5A23, 0x088C,
+ 0x5A25, 0x088E, 0x5A29, 0x088D, 0x5A2D, 0x1C70, 0x5A2E, 0x1C71,
+ 0x5A33, 0x1C77, 0x5A35, 0x1E9C, 0x5A36, 0x0A46, 0x5A37, 0x20FD,
+ 0x5A38, 0x1E9B, 0x5A39, 0x1EAE, 0x5A3C, 0x0A4C, 0x5A3E, 0x1EAC,
+ 0x5A40, 0x0A4B, 0x5A41, 0x0A47, 0x5A42, 0x1EB5, 0x5A43, 0x1EA5,
+ 0x5A44, 0x1EA8, 0x5A46, 0x0A4F, 0x5A47, 0x1EB2, 0x5A48, 0x1EAA,
+ 0x5A49, 0x0A48, 0x5A4A, 0x0A50, 0x5A4C, 0x1EAF, 0x5A4D, 0x1EAD,
+ 0x5A50, 0x1E9E, 0x5A51, 0x1EB3, 0x5A52, 0x1EA7, 0x5A53, 0x1EA2,
+ 0x5A55, 0x1E98, 0x5A56, 0x1EB4, 0x5A57, 0x1EA4, 0x5A58, 0x1E97,
+ 0x5A5A, 0x0A4E, 0x5A5B, 0x1EA9, 0x5A5C, 0x1EB6, 0x5A5D, 0x1EA6,
+ 0x5A5E, 0x1E9A, 0x5A5F, 0x1E9F, 0x5A60, 0x1E96, 0x5A62, 0x0A4D,
+ 0x5A64, 0x1EA3, 0x5A65, 0x1EA0, 0x5A66, 0x0A49, 0x5A67, 0x1E99,
+ 0x5A69, 0x1EB1, 0x5A6A, 0x0A4A, 0x5A6C, 0x1EA1, 0x5A6D, 0x1E9D,
+ 0x5A70, 0x1EB0, 0x5A77, 0x0C23, 0x5A78, 0x20F6, 0x5A7A, 0x20F3,
+ 0x5A7B, 0x2104, 0x5A7C, 0x20F8, 0x5A7D, 0x2105, 0x5A7F, 0x0C25,
+ 0x5A83, 0x2101, 0x5A84, 0x20FE, 0x5A8A, 0x20FF, 0x5A8B, 0x2102,
+ 0x5A8C, 0x2106, 0x5A8E, 0x1EAB, 0x5A8F, 0x2108, 0x5A90, 0x23B6,
+ 0x5A92, 0x0C26, 0x5A93, 0x2109, 0x5A94, 0x20F1, 0x5A95, 0x20FB,
+ 0x5A97, 0x2100, 0x5A9A, 0x0C24, 0x5A9B, 0x0C27, 0x5A9C, 0x2107,
+ 0x5A9D, 0x210A, 0x5A9E, 0x20F5, 0x5A9F, 0x20F2, 0x5AA2, 0x20F4,
+ 0x5AA5, 0x20F9, 0x5AA6, 0x20F7, 0x5AA7, 0x0C28, 0x5AA9, 0x2103,
+ 0x5AAC, 0x20FA, 0x5AAE, 0x20FC, 0x5AAF, 0x20F0, 0x5AB0, 0x23AA,
+ 0x5AB1, 0x23A8, 0x5AB2, 0x0DFC, 0x5AB3, 0x0DFA, 0x5AB4, 0x23B2,
+ 0x5AB5, 0x23A9, 0x5AB6, 0x23B3, 0x5AB7, 0x23AF, 0x5AB8, 0x23A7,
+ 0x5AB9, 0x23B5, 0x5ABA, 0x23A6, 0x5ABB, 0x23AD, 0x5ABC, 0x0DF9,
+ 0x5ABD, 0x0DF8, 0x5ABE, 0x0DF7, 0x5ABF, 0x23AB, 0x5AC0, 0x23B0,
+ 0x5AC1, 0x0DF4, 0x5AC2, 0x0DFB, 0x5AC4, 0x23A4, 0x5AC6, 0x23AE,
+ 0x5AC7, 0x23A3, 0x5AC8, 0x23AC, 0x5AC9, 0x0DF5, 0x5ACA, 0x23B1,
+ 0x5ACB, 0x23A5, 0x5ACC, 0x0DF6, 0x5ACD, 0x23B4, 0x5AD5, 0x2650,
+ 0x5AD6, 0x0FB4, 0x5AD7, 0x0FB3, 0x5AD8, 0x0FB5, 0x5AD9, 0x265C,
+ 0x5ADA, 0x2652, 0x5ADB, 0x2658, 0x5ADC, 0x264D, 0x5ADD, 0x265B,
+ 0x5ADE, 0x265A, 0x5ADF, 0x265E, 0x5AE0, 0x2657, 0x5AE1, 0x0FB0,
+ 0x5AE2, 0x2656, 0x5AE3, 0x0FB6, 0x5AE5, 0x264F, 0x5AE6, 0x0FB1,
+ 0x5AE8, 0x265D, 0x5AE9, 0x0FB2, 0x5AEA, 0x2651, 0x5AEB, 0x2654,
+ 0x5AEC, 0x2659, 0x5AED, 0x2653, 0x5AEE, 0x264E, 0x5AF3, 0x2655,
+ 0x5AF4, 0x28AB, 0x5AF5, 0x112D, 0x5AF6, 0x28AE, 0x5AF7, 0x28AD,
+ 0x5AF8, 0x28B0, 0x5AF9, 0x28B2, 0x5AFA, 0x36EE, 0x5AFB, 0x112B,
+ 0x5AFD, 0x28AC, 0x5AFF, 0x28AA, 0x5B01, 0x28B3, 0x5B02, 0x28B1,
+ 0x5B03, 0x28AF, 0x5B05, 0x28B5, 0x5B07, 0x28B4, 0x5B08, 0x112F,
+ 0x5B09, 0x112A, 0x5B0B, 0x112C, 0x5B0C, 0x112E, 0x5B0F, 0x28B6,
+ 0x5B10, 0x2B22, 0x5B13, 0x2B21, 0x5B14, 0x2B20, 0x5B16, 0x2B23,
+ 0x5B17, 0x2B1C, 0x5B19, 0x2B1D, 0x5B1A, 0x2B25, 0x5B1B, 0x2B1E,
+ 0x5B1D, 0x12A8, 0x5B1E, 0x2B27, 0x5B20, 0x2B26, 0x5B21, 0x2B1F,
+ 0x5B23, 0x2D52, 0x5B24, 0x13C5, 0x5B25, 0x2D50, 0x5B26, 0x2D55,
+ 0x5B27, 0x2D54, 0x5B28, 0x2B24, 0x5B2A, 0x13C4, 0x5B2C, 0x2D53,
+ 0x5B2D, 0x2D4F, 0x5B2E, 0x2D57, 0x5B2F, 0x2D56, 0x5B30, 0x13C3,
+ 0x5B32, 0x2D51, 0x5B34, 0x12A9, 0x5B38, 0x14CE, 0x5B3C, 0x2F18,
+ 0x5B3D, 0x3089, 0x5B3E, 0x308A, 0x5B3F, 0x308B, 0x5B40, 0x160F,
+ 0x5B43, 0x1610, 0x5B45, 0x31CC, 0x5B47, 0x32CD, 0x5B48, 0x32CC,
+ 0x5B4B, 0x337C, 0x5B4C, 0x337D, 0x5B4D, 0x3413, 0x5B4E, 0x3482,
+ 0x5B50, 0x027F, 0x5B51, 0x0280, 0x5B53, 0x0281, 0x5B54, 0x02C6,
+ 0x5B55, 0x0333, 0x5B56, 0x17DC, 0x5B57, 0x03BF, 0x5B58, 0x03C0,
+ 0x5B5A, 0x047F, 0x5B5B, 0x0480, 0x5B5C, 0x047E, 0x5B5D, 0x047D,
+ 0x5B5F, 0x0597, 0x5B62, 0x1957, 0x5B63, 0x0599, 0x5B64, 0x0598,
+ 0x5B65, 0x1958, 0x5B69, 0x0700, 0x5B6B, 0x0891, 0x5B6C, 0x1C78,
+ 0x5B6E, 0x1EB8, 0x5B70, 0x0A51, 0x5B71, 0x0C2A, 0x5B72, 0x1EB7,
+ 0x5B73, 0x0C29, 0x5B75, 0x0FB7, 0x5B77, 0x265F, 0x5B78, 0x12AA,
+ 0x5B7A, 0x13C6, 0x5B7B, 0x2D58, 0x5B7D, 0x1611, 0x5B7F, 0x16C0,
+ 0x5B80, 0x0225, 0x5B81, 0x179E, 0x5B83, 0x0334, 0x5B84, 0x179F,
+ 0x5B85, 0x03C3, 0x5B87, 0x03C1, 0x5B88, 0x03C2, 0x5B89, 0x03C4,
+ 0x5B8B, 0x0482, 0x5B8C, 0x0481, 0x5B8E, 0x1863, 0x5B8F, 0x0483,
+ 0x5B92, 0x1864, 0x5B93, 0x1959, 0x5B95, 0x195A, 0x5B97, 0x059A,
+ 0x5B98, 0x059C, 0x5B99, 0x059E, 0x5B9A, 0x059B, 0x5B9B, 0x059F,
+ 0x5B9C, 0x059D, 0x5BA2, 0x0704, 0x5BA3, 0x0701, 0x5BA4, 0x0703,
+ 0x5BA5, 0x0705, 0x5BA6, 0x0702, 0x5BA7, 0x1C79, 0x5BA8, 0x1AB3,
+ 0x5BAC, 0x1C7B, 0x5BAD, 0x1C7A, 0x5BAE, 0x0897, 0x5BB0, 0x0893,
+ 0x5BB3, 0x0894, 0x5BB4, 0x0896, 0x5BB5, 0x0898, 0x5BB6, 0x0895,
+ 0x5BB8, 0x089A, 0x5BB9, 0x0899, 0x5BBF, 0x0A56, 0x5BC0, 0x1EBA,
+ 0x5BC1, 0x1EB9, 0x5BC2, 0x0A55, 0x5BC4, 0x0A54, 0x5BC5, 0x0A53,
+ 0x5BC6, 0x0A57, 0x5BC7, 0x0A52, 0x5BCA, 0x2110, 0x5BCB, 0x210D,
+ 0x5BCC, 0x0C2C, 0x5BCD, 0x210C, 0x5BCE, 0x2111, 0x5BD0, 0x0C2E,
+ 0x5BD1, 0x210F, 0x5BD2, 0x0C2B, 0x5BD3, 0x0C2D, 0x5BD4, 0x210E,
+ 0x5BD6, 0x23B7, 0x5BD8, 0x23B8, 0x5BD9, 0x23B9, 0x5BDE, 0x0FB8,
+ 0x5BDF, 0x0FC0, 0x5BE0, 0x2660, 0x5BE1, 0x0FBA, 0x5BE2, 0x0FBE,
+ 0x5BE3, 0x2661, 0x5BE4, 0x0FBF, 0x5BE5, 0x0FBB, 0x5BE6, 0x0FBC,
+ 0x5BE7, 0x0FB9, 0x5BE8, 0x0FBD, 0x5BE9, 0x1132, 0x5BEA, 0x210B,
+ 0x5BEB, 0x1133, 0x5BEC, 0x1131, 0x5BEE, 0x1130, 0x5BEF, 0x2B28,
+ 0x5BF0, 0x12AB, 0x5BF1, 0x2D59, 0x5BF2, 0x2D5A, 0x5BF5, 0x157B,
+ 0x5BF6, 0x1612, 0x5BF8, 0x0282, 0x5BFA, 0x03C5, 0x5C01, 0x0706,
+ 0x5C03, 0x1C7C, 0x5C04, 0x089B, 0x5C07, 0x0A5A, 0x5C08, 0x0A59,
+ 0x5C09, 0x0A58, 0x5C0A, 0x0C2F, 0x5C0B, 0x0C30, 0x5C0C, 0x2112,
+ 0x5C0D, 0x0FC1, 0x5C0E, 0x12AC, 0x5C0F, 0x0283, 0x5C10, 0x1787,
+ 0x5C11, 0x02C7, 0x5C12, 0x17A0, 0x5C15, 0x17DD, 0x5C16, 0x03C6,
+ 0x5C1A, 0x05A0, 0x5C1F, 0x23BA, 0x5C22, 0x0284, 0x5C24, 0x02C8,
+ 0x5C25, 0x17DE, 0x5C28, 0x1865, 0x5C2A, 0x1866, 0x5C2C, 0x0484,
+ 0x5C30, 0x2113, 0x5C31, 0x0C31, 0x5C33, 0x23BB, 0x5C37, 0x13C7,
+ 0x5C38, 0x0285, 0x5C39, 0x0299, 0x5C3A, 0x02C9, 0x5C3B, 0x17A1,
+ 0x5C3C, 0x0335, 0x5C3E, 0x0488, 0x5C3F, 0x0487, 0x5C40, 0x0485,
+ 0x5C41, 0x0486, 0x5C44, 0x195B, 0x5C45, 0x05A2, 0x5C46, 0x05A3,
+ 0x5C47, 0x195C, 0x5C48, 0x05A1, 0x5C4B, 0x070A, 0x5C4C, 0x1AB4,
+ 0x5C4D, 0x0709, 0x5C4E, 0x0707, 0x5C4F, 0x0708, 0x5C50, 0x089E,
+ 0x5C51, 0x089C, 0x5C54, 0x1C7E, 0x5C55, 0x089D, 0x5C56, 0x1C7D,
+ 0x5C58, 0x0892, 0x5C59, 0x1EBB, 0x5C5C, 0x0A5C, 0x5C5D, 0x0A5D,
+ 0x5C60, 0x0A5B, 0x5C62, 0x0FC2, 0x5C63, 0x2662, 0x5C64, 0x1134,
+ 0x5C65, 0x1135, 0x5C67, 0x28B7, 0x5C68, 0x13C8, 0x5C69, 0x2F19,
+ 0x5C6A, 0x2F1A, 0x5C6C, 0x166E, 0x5C6D, 0x3483, 0x5C6E, 0x1776,
+ 0x5C6F, 0x02CA, 0x5C71, 0x0286, 0x5C73, 0x17A3, 0x5C74, 0x17A2,
+ 0x5C79, 0x03C7, 0x5C7A, 0x17E0, 0x5C7B, 0x17E1, 0x5C7C, 0x17DF,
+ 0x5C7E, 0x17E2, 0x5C86, 0x186E, 0x5C88, 0x1869, 0x5C89, 0x186B,
+ 0x5C8A, 0x186D, 0x5C8B, 0x186A, 0x5C8C, 0x048C, 0x5C8D, 0x1867,
+ 0x5C8F, 0x1868, 0x5C90, 0x0489, 0x5C91, 0x048A, 0x5C92, 0x186C,
+ 0x5C93, 0x186F, 0x5C94, 0x048B, 0x5C95, 0x1870, 0x5C9D, 0x196A,
+ 0x5C9F, 0x1964, 0x5CA0, 0x195F, 0x5CA1, 0x05A5, 0x5CA2, 0x1967,
+ 0x5CA3, 0x1965, 0x5CA4, 0x195E, 0x5CA5, 0x196B, 0x5CA6, 0x196E,
+ 0x5CA7, 0x1969, 0x5CA8, 0x1962, 0x5CA9, 0x05A7, 0x5CAA, 0x1968,
+ 0x5CAB, 0x05A8, 0x5CAC, 0x1963, 0x5CAD, 0x1966, 0x5CAE, 0x195D,
+ 0x5CAF, 0x1961, 0x5CB0, 0x196D, 0x5CB1, 0x05A9, 0x5CB3, 0x05AA,
+ 0x5CB5, 0x1960, 0x5CB6, 0x196C, 0x5CB7, 0x05A4, 0x5CB8, 0x05A6,
+ 0x5CC6, 0x1AC5, 0x5CC7, 0x1ABE, 0x5CC8, 0x1AC4, 0x5CC9, 0x1ABD,
+ 0x5CCA, 0x1ABF, 0x5CCB, 0x1AB9, 0x5CCC, 0x1AB7, 0x5CCE, 0x1AC6,
+ 0x5CCF, 0x1AC3, 0x5CD0, 0x1AB5, 0x5CD2, 0x070C, 0x5CD3, 0x1AC1,
+ 0x5CD4, 0x1AC2, 0x5CD6, 0x1AC0, 0x5CD7, 0x1AB8, 0x5CD8, 0x1AB6,
+ 0x5CD9, 0x070B, 0x5CDA, 0x1ABC, 0x5CDB, 0x1ABA, 0x5CDE, 0x1ABB,
+ 0x5CDF, 0x1AC7, 0x5CE8, 0x08A3, 0x5CEA, 0x08A2, 0x5CEC, 0x1C7F,
+ 0x5CED, 0x089F, 0x5CEE, 0x1C81, 0x5CF0, 0x08A4, 0x5CF1, 0x1C82,
+ 0x5CF4, 0x08A7, 0x5CF6, 0x08A5, 0x5CF7, 0x1C83, 0x5CF8, 0x1AC8,
+ 0x5CF9, 0x1C85, 0x5CFB, 0x08A1, 0x5CFD, 0x08A0, 0x5CFF, 0x1C80,
+ 0x5D00, 0x1C84, 0x5D01, 0x08A6, 0x5D06, 0x0A5F, 0x5D07, 0x0A5E,
+ 0x5D0B, 0x1EBD, 0x5D0C, 0x1EC1, 0x5D0D, 0x1EC3, 0x5D0E, 0x0A60,
+ 0x5D0F, 0x1EC6, 0x5D11, 0x0A64, 0x5D12, 0x1EC8, 0x5D14, 0x0A66,
+ 0x5D16, 0x0A62, 0x5D17, 0x0A6A, 0x5D19, 0x0A67, 0x5D1A, 0x1EBF,
+ 0x5D1B, 0x0A61, 0x5D1D, 0x1EBE, 0x5D1E, 0x1EBC, 0x5D1F, 0x1ECA,
+ 0x5D20, 0x1EC0, 0x5D22, 0x0A63, 0x5D23, 0x1EC9, 0x5D24, 0x0A68,
+ 0x5D25, 0x1EC5, 0x5D26, 0x1EC4, 0x5D27, 0x0A69, 0x5D28, 0x1EC2,
+ 0x5D29, 0x0A65, 0x5D2E, 0x1ECB, 0x5D30, 0x1EC7, 0x5D31, 0x2122,
+ 0x5D32, 0x2129, 0x5D33, 0x211E, 0x5D34, 0x0C34, 0x5D35, 0x211A,
+ 0x5D36, 0x212A, 0x5D37, 0x2114, 0x5D38, 0x2127, 0x5D39, 0x2125,
+ 0x5D3A, 0x211F, 0x5D3C, 0x2128, 0x5D3D, 0x2121, 0x5D3F, 0x2119,
+ 0x5D40, 0x212B, 0x5D41, 0x2117, 0x5D42, 0x2124, 0x5D43, 0x2115,
+ 0x5D45, 0x212C, 0x5D47, 0x0C35, 0x5D49, 0x2126, 0x5D4A, 0x23BE,
+ 0x5D4B, 0x2118, 0x5D4C, 0x0C32, 0x5D4E, 0x211C, 0x5D50, 0x0C33,
+ 0x5D51, 0x211B, 0x5D52, 0x2120, 0x5D55, 0x211D, 0x5D59, 0x2123,
+ 0x5D5E, 0x23C2, 0x5D62, 0x23C5, 0x5D63, 0x23BD, 0x5D65, 0x23BF,
+ 0x5D67, 0x23C4, 0x5D68, 0x23C3, 0x5D69, 0x0DFD, 0x5D6B, 0x2116,
+ 0x5D6C, 0x23C1, 0x5D6F, 0x0DFE, 0x5D71, 0x23BC, 0x5D72, 0x23C0,
+ 0x5D77, 0x2669, 0x5D79, 0x2670, 0x5D7A, 0x2667, 0x5D7C, 0x266E,
+ 0x5D7D, 0x2665, 0x5D7E, 0x266D, 0x5D7F, 0x2671, 0x5D80, 0x2664,
+ 0x5D81, 0x2668, 0x5D82, 0x2663, 0x5D84, 0x0FC3, 0x5D86, 0x2666,
+ 0x5D87, 0x0FC4, 0x5D88, 0x266C, 0x5D89, 0x266B, 0x5D8A, 0x266A,
+ 0x5D8D, 0x266F, 0x5D92, 0x28BB, 0x5D93, 0x28BD, 0x5D94, 0x1137,
+ 0x5D95, 0x28BE, 0x5D97, 0x28B9, 0x5D99, 0x28B8, 0x5D9A, 0x28C2,
+ 0x5D9C, 0x28C0, 0x5D9D, 0x1136, 0x5D9E, 0x28C3, 0x5D9F, 0x28BA,
+ 0x5DA0, 0x28BF, 0x5DA1, 0x28C1, 0x5DA2, 0x28BC, 0x5DA7, 0x2B2C,
+ 0x5DA8, 0x2B31, 0x5DA9, 0x2B2B, 0x5DAA, 0x2B30, 0x5DAC, 0x2B29,
+ 0x5DAD, 0x2B33, 0x5DAE, 0x2B2F, 0x5DAF, 0x2B34, 0x5DB0, 0x2B2E,
+ 0x5DB1, 0x2B2A, 0x5DB2, 0x2B32, 0x5DB4, 0x2B35, 0x5DB5, 0x2B2D,
+ 0x5DB7, 0x2D5B, 0x5DB8, 0x13CC, 0x5DBA, 0x13CA, 0x5DBC, 0x13C9,
+ 0x5DBD, 0x13CB, 0x5DC0, 0x2F1B, 0x5DC2, 0x3023, 0x5DC3, 0x308C,
+ 0x5DC6, 0x31CD, 0x5DC7, 0x31CE, 0x5DC9, 0x1613, 0x5DCB, 0x32CE,
+ 0x5DCD, 0x166F, 0x5DCF, 0x32CF, 0x5DD1, 0x337F, 0x5DD2, 0x16C2,
+ 0x5DD4, 0x16C1, 0x5DD5, 0x337E, 0x5DD6, 0x16F7, 0x5DD8, 0x3414,
+ 0x5DDB, 0x0226, 0x5DDD, 0x0287, 0x5DDE, 0x03C8, 0x5DDF, 0x17E3,
+ 0x5DE0, 0x1871, 0x5DE1, 0x051A, 0x5DE2, 0x0A6B, 0x5DE5, 0x0288,
+ 0x5DE6, 0x0338, 0x5DE7, 0x0337, 0x5DE8, 0x0336, 0x5DEB, 0x048D,
+ 0x5DEE, 0x08A8, 0x5DF0, 0x23C6, 0x5DF1, 0x0289, 0x5DF2, 0x028A,
+ 0x5DF3, 0x028B, 0x5DF4, 0x02CB, 0x5DF7, 0x070D, 0x5DF9, 0x1AC9,
+ 0x5DFD, 0x0C36, 0x5DFE, 0x028C, 0x5DFF, 0x1788, 0x5E02, 0x0339,
+ 0x5E03, 0x033A, 0x5E04, 0x17A4, 0x5E06, 0x03C9, 0x5E0A, 0x1872,
+ 0x5E0C, 0x048E, 0x5E0E, 0x1873, 0x5E11, 0x05B0, 0x5E14, 0x1970,
+ 0x5E15, 0x05AE, 0x5E16, 0x05AD, 0x5E17, 0x196F, 0x5E18, 0x05AB,
+ 0x5E19, 0x1971, 0x5E1A, 0x05AC, 0x5E1B, 0x05AF, 0x5E1D, 0x070E,
+ 0x5E1F, 0x0710, 0x5E20, 0x1ACD, 0x5E21, 0x1ACA, 0x5E22, 0x1ACB,
+ 0x5E23, 0x1ACC, 0x5E24, 0x1ACE, 0x5E25, 0x070F, 0x5E28, 0x1C87,
+ 0x5E29, 0x1C86, 0x5E2B, 0x08AA, 0x5E2D, 0x08A9, 0x5E33, 0x0A6E,
+ 0x5E34, 0x1ECD, 0x5E36, 0x0A6D, 0x5E37, 0x0A6F, 0x5E38, 0x0A6C,
+ 0x5E3D, 0x0C38, 0x5E3E, 0x1ECC, 0x5E40, 0x0C39, 0x5E41, 0x212E,
+ 0x5E43, 0x0C3A, 0x5E44, 0x212D, 0x5E45, 0x0C37, 0x5E4A, 0x23C9,
+ 0x5E4B, 0x23CB, 0x5E4C, 0x0DFF, 0x5E4D, 0x23CA, 0x5E4E, 0x23C8,
+ 0x5E4F, 0x23C7, 0x5E53, 0x2674, 0x5E54, 0x0FC9, 0x5E55, 0x0FC7,
+ 0x5E57, 0x0FC8, 0x5E58, 0x2672, 0x5E59, 0x2673, 0x5E5B, 0x0FC5,
+ 0x5E5C, 0x28C7, 0x5E5D, 0x28C5, 0x5E5F, 0x1139, 0x5E60, 0x28C6,
+ 0x5E61, 0x113A, 0x5E62, 0x1138, 0x5E63, 0x0FC6, 0x5E66, 0x2B38,
+ 0x5E67, 0x2B36, 0x5E68, 0x2B37, 0x5E69, 0x28C4, 0x5E6A, 0x2D5D,
+ 0x5E6B, 0x13CD, 0x5E6C, 0x2D5C, 0x5E6D, 0x2F1C, 0x5E6E, 0x2F1D,
+ 0x5E6F, 0x2B39, 0x5E70, 0x308D, 0x5E72, 0x028D, 0x5E73, 0x033B,
+ 0x5E74, 0x03CB, 0x5E75, 0x17E4, 0x5E76, 0x03CA, 0x5E78, 0x05B1,
+ 0x5E79, 0x0E00, 0x5E7A, 0x0227, 0x5E7B, 0x02CC, 0x5E7C, 0x033C,
+ 0x5E7D, 0x0711, 0x5E7E, 0x0C3B, 0x5E7F, 0x0228, 0x5E80, 0x17A5,
+ 0x5E82, 0x17A6, 0x5E84, 0x17E5, 0x5E87, 0x0490, 0x5E88, 0x1877,
+ 0x5E89, 0x1875, 0x5E8A, 0x0491, 0x5E8B, 0x1874, 0x5E8C, 0x1876,
+ 0x5E8D, 0x1878, 0x5E8F, 0x048F, 0x5E95, 0x05B5, 0x5E96, 0x05B6,
+ 0x5E97, 0x05B3, 0x5E9A, 0x05B2, 0x5E9B, 0x1AD2, 0x5E9C, 0x05B4,
+ 0x5EA0, 0x0712, 0x5EA2, 0x1AD1, 0x5EA3, 0x1AD3, 0x5EA4, 0x1AD0,
+ 0x5EA5, 0x1AD4, 0x5EA6, 0x0713, 0x5EA7, 0x08AD, 0x5EA8, 0x1C88,
+ 0x5EAA, 0x1C8A, 0x5EAB, 0x08AB, 0x5EAC, 0x1C8B, 0x5EAD, 0x08AC,
+ 0x5EAE, 0x1C89, 0x5EB0, 0x1ACF, 0x5EB1, 0x1ECE, 0x5EB2, 0x1ED1,
+ 0x5EB3, 0x1ED2, 0x5EB4, 0x1ECF, 0x5EB5, 0x0A73, 0x5EB6, 0x0A72,
+ 0x5EB7, 0x0A70, 0x5EB8, 0x0A71, 0x5EB9, 0x1ED0, 0x5EBE, 0x0A74,
+ 0x5EC1, 0x0C3D, 0x5EC2, 0x0C3E, 0x5EC4, 0x0C3F, 0x5EC5, 0x23CC,
+ 0x5EC6, 0x23CE, 0x5EC7, 0x23D0, 0x5EC8, 0x0E02, 0x5EC9, 0x0E01,
+ 0x5ECA, 0x0C3C, 0x5ECB, 0x23CF, 0x5ECC, 0x23CD, 0x5ECE, 0x2678,
+ 0x5ED1, 0x2676, 0x5ED2, 0x267C, 0x5ED3, 0x0FCA, 0x5ED4, 0x267D,
+ 0x5ED5, 0x267A, 0x5ED6, 0x0FCB, 0x5ED7, 0x2677, 0x5ED8, 0x2675,
+ 0x5ED9, 0x267B, 0x5EDA, 0x113C, 0x5EDB, 0x28C9, 0x5EDC, 0x2679,
+ 0x5EDD, 0x113E, 0x5EDE, 0x28CA, 0x5EDF, 0x113D, 0x5EE0, 0x1140,
+ 0x5EE1, 0x28CB, 0x5EE2, 0x113B, 0x5EE3, 0x113F, 0x5EE5, 0x2B3E,
+ 0x5EE6, 0x2B3C, 0x5EE7, 0x2B3B, 0x5EE8, 0x2B3D, 0x5EE9, 0x2B3A,
+ 0x5EEC, 0x157D, 0x5EEE, 0x31CF, 0x5EEF, 0x31D0, 0x5EF1, 0x32D0,
+ 0x5EF2, 0x3380, 0x5EF3, 0x1742, 0x5EF4, 0x0229, 0x5EF6, 0x05B7,
+ 0x5EF7, 0x0492, 0x5EFA, 0x0714, 0x5EFE, 0x028E, 0x5EFF, 0x02CD,
+ 0x5F01, 0x033D, 0x5F02, 0x17E6, 0x5F04, 0x0493, 0x5F05, 0x1879,
+ 0x5F07, 0x1AD5, 0x5F08, 0x0715, 0x5F0A, 0x0FCC, 0x5F0B, 0x028F,
+ 0x5F0F, 0x03CC, 0x5F12, 0x0E03, 0x5F13, 0x0290, 0x5F14, 0x02CE,
+ 0x5F15, 0x02CF, 0x5F17, 0x033F, 0x5F18, 0x033E, 0x5F1A, 0x17E7,
+ 0x5F1B, 0x03CD, 0x5F1D, 0x187A, 0x5F1F, 0x0494, 0x5F22, 0x1973,
+ 0x5F23, 0x1974, 0x5F24, 0x1975, 0x5F26, 0x05B8, 0x5F27, 0x05B9,
+ 0x5F28, 0x1972, 0x5F29, 0x05BA, 0x5F2D, 0x0716, 0x5F2E, 0x1AD6,
+ 0x5F30, 0x1C8D, 0x5F31, 0x08AE, 0x5F33, 0x1C8C, 0x5F35, 0x0A75,
+ 0x5F36, 0x1ED3, 0x5F37, 0x0A76, 0x5F38, 0x1ED4, 0x5F3C, 0x0C40,
+ 0x5F40, 0x23D1, 0x5F43, 0x267F, 0x5F44, 0x267E, 0x5F46, 0x0FCD,
+ 0x5F48, 0x1141, 0x5F49, 0x28CC, 0x5F4A, 0x12AD, 0x5F4B, 0x2B3F,
+ 0x5F4C, 0x13CE, 0x5F4E, 0x16C3, 0x5F4F, 0x3416, 0x5F50, 0x022A,
+ 0x5F54, 0x1976, 0x5F56, 0x1AD7, 0x5F57, 0x0A77, 0x5F58, 0x212F,
+ 0x5F59, 0x0E04, 0x5F5D, 0x14CF, 0x5F61, 0x022B, 0x5F62, 0x0496,
+ 0x5F64, 0x0495, 0x5F65, 0x0717, 0x5F67, 0x1C8E, 0x5F69, 0x0A79,
+ 0x5F6A, 0x0B89, 0x5F6B, 0x0A7A, 0x5F6C, 0x0A78, 0x5F6D, 0x0C41,
+ 0x5F6F, 0x2680, 0x5F70, 0x0FCE, 0x5F71, 0x1142, 0x5F73, 0x1777,
+ 0x5F74, 0x17E8, 0x5F76, 0x187C, 0x5F77, 0x0497, 0x5F78, 0x187B,
+ 0x5F79, 0x0498, 0x5F7C, 0x05BE, 0x5F7D, 0x1979, 0x5F7E, 0x1978,
+ 0x5F7F, 0x05BD, 0x5F80, 0x05BB, 0x5F81, 0x05BC, 0x5F82, 0x1977,
+ 0x5F85, 0x0719, 0x5F86, 0x1AD8, 0x5F87, 0x071C, 0x5F88, 0x0718,
+ 0x5F89, 0x071E, 0x5F8A, 0x071A, 0x5F8B, 0x071B, 0x5F8C, 0x071D,
+ 0x5F90, 0x08B1, 0x5F91, 0x08B0, 0x5F92, 0x08AF, 0x5F96, 0x1ED6,
+ 0x5F97, 0x0A7B, 0x5F98, 0x0A7E, 0x5F99, 0x0A7C, 0x5F9B, 0x1ED5,
+ 0x5F9C, 0x0A81, 0x5F9E, 0x0A7D, 0x5F9F, 0x1ED7, 0x5FA0, 0x0A80,
+ 0x5FA1, 0x0A7F, 0x5FA5, 0x2131, 0x5FA6, 0x2130, 0x5FA8, 0x0C44,
+ 0x5FA9, 0x0C42, 0x5FAA, 0x0C43, 0x5FAB, 0x2132, 0x5FAC, 0x0E05,
+ 0x5FAD, 0x23D3, 0x5FAE, 0x0E06, 0x5FAF, 0x23D2, 0x5FB2, 0x28CD,
+ 0x5FB5, 0x1144, 0x5FB6, 0x2681, 0x5FB7, 0x1143, 0x5FB9, 0x0FCF,
+ 0x5FBB, 0x2B41, 0x5FBC, 0x2B40, 0x5FBD, 0x13CF, 0x5FBE, 0x2D5E,
+ 0x5FBF, 0x308E, 0x5FC0, 0x31D1, 0x5FC1, 0x31D2, 0x5FC3, 0x02D0,
+ 0x5FC5, 0x0340, 0x5FC9, 0x17A7, 0x5FCC, 0x049A, 0x5FCD, 0x049C,
+ 0x5FCF, 0x17EB, 0x5FD0, 0x187F, 0x5FD1, 0x187E, 0x5FD2, 0x187D,
+ 0x5FD4, 0x17EA, 0x5FD5, 0x17E9, 0x5FD6, 0x03CF, 0x5FD7, 0x049B,
+ 0x5FD8, 0x0499, 0x5FD9, 0x03CE, 0x5FDD, 0x05BF, 0x5FDE, 0x197A,
+ 0x5FE0, 0x05C0, 0x5FE1, 0x1884, 0x5FE3, 0x1886, 0x5FE4, 0x1885,
+ 0x5FE5, 0x197B, 0x5FE8, 0x1881, 0x5FEA, 0x04A0, 0x5FEB, 0x049E,
+ 0x5FED, 0x1880, 0x5FEE, 0x1882, 0x5FEF, 0x1888, 0x5FF1, 0x049D,
+ 0x5FF3, 0x1883, 0x5FF4, 0x188C, 0x5FF5, 0x05C2, 0x5FF7, 0x1889,
+ 0x5FF8, 0x049F, 0x5FFA, 0x1887, 0x5FFB, 0x188A, 0x5FFD, 0x05C1,
+ 0x5FFF, 0x05C3, 0x6000, 0x188B, 0x6009, 0x198F, 0x600A, 0x1982,
+ 0x600B, 0x1980, 0x600C, 0x198E, 0x600D, 0x1989, 0x600E, 0x0723,
+ 0x600F, 0x05C4, 0x6010, 0x198A, 0x6011, 0x198D, 0x6012, 0x071F,
+ 0x6013, 0x198C, 0x6014, 0x05C5, 0x6015, 0x05CA, 0x6016, 0x05C8,
+ 0x6017, 0x1983, 0x6019, 0x197E, 0x601A, 0x1985, 0x601B, 0x05CF,
+ 0x601C, 0x1990, 0x601D, 0x0720, 0x601E, 0x1986, 0x6020, 0x0721,
+ 0x6021, 0x05CB, 0x6022, 0x1988, 0x6024, 0x1AE7, 0x6025, 0x0722,
+ 0x6026, 0x197D, 0x6027, 0x05CC, 0x6028, 0x0724, 0x6029, 0x05CD,
+ 0x602A, 0x05C9, 0x602B, 0x05CE, 0x602C, 0x1987, 0x602D, 0x197C,
+ 0x602E, 0x198B, 0x602F, 0x05C6, 0x6032, 0x197F, 0x6033, 0x1984,
+ 0x6034, 0x1981, 0x6035, 0x05C7, 0x6037, 0x1AD9, 0x6039, 0x1ADA,
+ 0x6040, 0x1AE4, 0x6041, 0x1C92, 0x6042, 0x1AE5, 0x6043, 0x072A,
+ 0x6044, 0x1AE8, 0x6045, 0x1ADE, 0x6046, 0x0729, 0x6047, 0x1AE0,
+ 0x6049, 0x1AE1, 0x604C, 0x1AE3, 0x604D, 0x0725, 0x6050, 0x08B5,
+ 0x6052, 0x36EC, 0x6053, 0x1ADF, 0x6054, 0x1ADB, 0x6055, 0x08B6,
+ 0x6058, 0x1AE9, 0x6059, 0x08B2, 0x605A, 0x1C90, 0x605B, 0x1AE2,
+ 0x605D, 0x1C8F, 0x605E, 0x1ADD, 0x605F, 0x1AE6, 0x6062, 0x0728,
+ 0x6063, 0x08B3, 0x6064, 0x072E, 0x6065, 0x08B4, 0x6066, 0x1AEA,
+ 0x6067, 0x1C91, 0x6068, 0x0727, 0x6069, 0x08B8, 0x606A, 0x072D,
+ 0x606B, 0x072C, 0x606C, 0x072B, 0x606D, 0x08B7, 0x606E, 0x1AEB,
+ 0x606F, 0x08B9, 0x6070, 0x0726, 0x6072, 0x1ADC, 0x607F, 0x0A82,
+ 0x6080, 0x1C95, 0x6081, 0x1C97, 0x6083, 0x1C99, 0x6084, 0x08BA,
+ 0x6085, 0x08C0, 0x6086, 0x1EDA, 0x6087, 0x1C9D, 0x6088, 0x1C94,
+ 0x6089, 0x0A84, 0x608A, 0x1ED8, 0x608C, 0x08BF, 0x608D, 0x08BD,
+ 0x608E, 0x1C9F, 0x6090, 0x1ED9, 0x6092, 0x1C96, 0x6094, 0x08BE,
+ 0x6095, 0x1C9A, 0x6096, 0x08C1, 0x6097, 0x1C9C, 0x609A, 0x08BC,
+ 0x609B, 0x1C9B, 0x609C, 0x1C9E, 0x609D, 0x1C98, 0x609F, 0x08BB,
+ 0x60A0, 0x0A85, 0x60A2, 0x1C93, 0x60A3, 0x0A83, 0x60A8, 0x0A86,
+ 0x60B0, 0x1EDC, 0x60B1, 0x1EE5, 0x60B2, 0x0C47, 0x60B4, 0x0A88,
+ 0x60B5, 0x0A8D, 0x60B6, 0x0C48, 0x60B7, 0x1EE7, 0x60B8, 0x0A94,
+ 0x60B9, 0x2134, 0x60BA, 0x1EDD, 0x60BB, 0x0A8C, 0x60BC, 0x0A8F,
+ 0x60BD, 0x0A8A, 0x60BE, 0x1EDB, 0x60BF, 0x1EE9, 0x60C0, 0x1EEC,
+ 0x60C1, 0x2143, 0x60C3, 0x1EEA, 0x60C4, 0x2138, 0x60C5, 0x0A8B,
+ 0x60C6, 0x0A92, 0x60C7, 0x0A96, 0x60C8, 0x1EE4, 0x60C9, 0x2133,
+ 0x60CA, 0x1EE8, 0x60CB, 0x0A87, 0x60CC, 0x2135, 0x60CD, 0x1EEB,
+ 0x60CE, 0x2137, 0x60CF, 0x1EE0, 0x60D1, 0x0C45, 0x60D3, 0x1EDE,
+ 0x60D4, 0x1EDF, 0x60D5, 0x0A91, 0x60D8, 0x0A90, 0x60D9, 0x1EE2,
+ 0x60DA, 0x0A95, 0x60DB, 0x1EE6, 0x60DC, 0x0A8E, 0x60DD, 0x1EE3,
+ 0x60DF, 0x0A93, 0x60E0, 0x0C49, 0x60E1, 0x0C46, 0x60E2, 0x2136,
+ 0x60E4, 0x1EE1, 0x60E6, 0x0A89, 0x60F0, 0x0C4E, 0x60F1, 0x0C52,
+ 0x60F2, 0x213A, 0x60F3, 0x0E0B, 0x60F4, 0x0C50, 0x60F5, 0x213E,
+ 0x60F6, 0x0C54, 0x60F7, 0x23D4, 0x60F8, 0x2140, 0x60F9, 0x0E0D,
+ 0x60FA, 0x0C4C, 0x60FB, 0x0C4F, 0x60FC, 0x2141, 0x60FE, 0x2142,
+ 0x60FF, 0x2148, 0x6100, 0x0C56, 0x6101, 0x0E0E, 0x6103, 0x2144,
+ 0x6104, 0x2149, 0x6105, 0x213D, 0x6106, 0x0E18, 0x6108, 0x0E0F,
+ 0x6109, 0x0C55, 0x610A, 0x213B, 0x610B, 0x214A, 0x610D, 0x0E17,
+ 0x610E, 0x0C53, 0x610F, 0x0E08, 0x6110, 0x2147, 0x6112, 0x0C57,
+ 0x6113, 0x213F, 0x6114, 0x2139, 0x6115, 0x0C4D, 0x6116, 0x213C,
+ 0x6118, 0x2145, 0x611A, 0x0E07, 0x611B, 0x0E0C, 0x611C, 0x0C4A,
+ 0x611D, 0x2146, 0x611F, 0x0E0A, 0x6123, 0x0C4B, 0x6127, 0x0E16,
+ 0x6128, 0x2683, 0x6129, 0x23DF, 0x612B, 0x23D7, 0x612C, 0x2682,
+ 0x612E, 0x23DB, 0x612F, 0x23DD, 0x6132, 0x23DA, 0x6134, 0x0E15,
+ 0x6136, 0x23D9, 0x6137, 0x0E19, 0x613B, 0x2692, 0x613E, 0x0E14,
+ 0x613F, 0x0FD1, 0x6140, 0x23E0, 0x6141, 0x2684, 0x6144, 0x0E12,
+ 0x6145, 0x23D8, 0x6146, 0x23DC, 0x6147, 0x0FD0, 0x6148, 0x0E09,
+ 0x6149, 0x23D5, 0x614A, 0x23D6, 0x614B, 0x0FD2, 0x614C, 0x0E11,
+ 0x614D, 0x0E13, 0x614E, 0x0E10, 0x614F, 0x23DE, 0x6152, 0x2688,
+ 0x6153, 0x2689, 0x6154, 0x268E, 0x6155, 0x1149, 0x6156, 0x2695,
+ 0x6158, 0x0FD8, 0x615A, 0x0FD7, 0x615B, 0x2690, 0x615D, 0x1148,
+ 0x615E, 0x2685, 0x615F, 0x0FD6, 0x6161, 0x2694, 0x6162, 0x0FD4,
+ 0x6163, 0x0FD5, 0x6165, 0x2691, 0x6166, 0x28DE, 0x6167, 0x1146,
+ 0x6168, 0x0C51, 0x616A, 0x2693, 0x616B, 0x114D, 0x616C, 0x268B,
+ 0x616E, 0x1147, 0x6170, 0x114C, 0x6171, 0x2686, 0x6172, 0x268A,
+ 0x6173, 0x2687, 0x6174, 0x268D, 0x6175, 0x0FD9, 0x6176, 0x1145,
+ 0x6177, 0x0FD3, 0x6179, 0x28D0, 0x617A, 0x268F, 0x617C, 0x114B,
+ 0x617E, 0x114E, 0x6180, 0x268C, 0x6182, 0x114A, 0x6183, 0x28CF,
+ 0x6189, 0x28D4, 0x618A, 0x12B1, 0x618B, 0x28CE, 0x618C, 0x2B4D,
+ 0x618D, 0x28DD, 0x618E, 0x1152, 0x6190, 0x1150, 0x6191, 0x12AF,
+ 0x6192, 0x28DA, 0x6193, 0x28D6, 0x6194, 0x1156, 0x6196, 0x2B44,
+ 0x619A, 0x1154, 0x619B, 0x28D5, 0x619D, 0x2B42, 0x619F, 0x28D9,
+ 0x61A1, 0x28DC, 0x61A2, 0x28D3, 0x61A4, 0x1155, 0x61A7, 0x114F,
+ 0x61A8, 0x2B43, 0x61A9, 0x12B0, 0x61AA, 0x28DB, 0x61AB, 0x1151,
+ 0x61AC, 0x1153, 0x61AD, 0x28D8, 0x61AE, 0x1157, 0x61AF, 0x28D7,
+ 0x61B0, 0x28D2, 0x61B1, 0x28D1, 0x61B2, 0x12AE, 0x61B3, 0x28DF,
+ 0x61B4, 0x2B46, 0x61B5, 0x2D60, 0x61B6, 0x12B3, 0x61B8, 0x2B4C,
+ 0x61BA, 0x2B4A, 0x61BC, 0x2D61, 0x61BE, 0x12B4, 0x61BF, 0x2B4B,
+ 0x61C1, 0x2B48, 0x61C2, 0x13D1, 0x61C3, 0x2D5F, 0x61C5, 0x2B45,
+ 0x61C6, 0x2B47, 0x61C7, 0x13D2, 0x61C8, 0x12B6, 0x61C9, 0x13D0,
+ 0x61CA, 0x12B5, 0x61CB, 0x13D4, 0x61CC, 0x2B49, 0x61CD, 0x12B2,
+ 0x61D6, 0x2F26, 0x61D8, 0x2F1E, 0x61DE, 0x2D67, 0x61DF, 0x2F1F,
+ 0x61E0, 0x2D63, 0x61E3, 0x14D0, 0x61E4, 0x2D65, 0x61E5, 0x2D64,
+ 0x61E6, 0x13D3, 0x61E7, 0x2D62, 0x61E8, 0x2D66, 0x61E9, 0x2F27,
+ 0x61EA, 0x2F23, 0x61EB, 0x2F25, 0x61ED, 0x2F20, 0x61EE, 0x2F21,
+ 0x61F0, 0x2F24, 0x61F1, 0x2F22, 0x61F2, 0x157E, 0x61F5, 0x1581,
+ 0x61F6, 0x1580, 0x61F7, 0x157F, 0x61F8, 0x1614, 0x61F9, 0x31D3,
+ 0x61FA, 0x1615, 0x61FB, 0x308F, 0x61FC, 0x1670, 0x61FD, 0x32D1,
+ 0x61FE, 0x1671, 0x61FF, 0x16C4, 0x6200, 0x16F8, 0x6201, 0x3417,
+ 0x6203, 0x3418, 0x6204, 0x3419, 0x6207, 0x3533, 0x6208, 0x02D1,
+ 0x6209, 0x17A8, 0x620A, 0x0341, 0x620C, 0x03D1, 0x620D, 0x03D2,
+ 0x620E, 0x03D0, 0x6210, 0x03D3, 0x6211, 0x04A2, 0x6212, 0x04A1,
+ 0x6214, 0x1991, 0x6215, 0x05D1, 0x6216, 0x05D0, 0x6219, 0x1CA0,
+ 0x621A, 0x0A97, 0x621B, 0x0A98, 0x621F, 0x0C58, 0x6220, 0x23E1,
+ 0x6221, 0x0E1A, 0x6222, 0x0E1B, 0x6223, 0x23E3, 0x6224, 0x23E5,
+ 0x6225, 0x23E4, 0x6227, 0x2697, 0x6229, 0x2696, 0x622A, 0x0FDA,
+ 0x622B, 0x2698, 0x622D, 0x28E0, 0x622E, 0x1158, 0x6230, 0x12B7,
+ 0x6232, 0x13D5, 0x6233, 0x14D1, 0x6234, 0x13D6, 0x6236, 0x02D2,
+ 0x623A, 0x188D, 0x623D, 0x1992, 0x623E, 0x05D3, 0x623F, 0x05D2,
+ 0x6240, 0x05D4, 0x6241, 0x072F, 0x6242, 0x1AEC, 0x6243, 0x1AED,
+ 0x6246, 0x1CA1, 0x6247, 0x08C2, 0x6248, 0x0A99, 0x6249, 0x0C59,
+ 0x624A, 0x214B, 0x624B, 0x02D3, 0x624D, 0x0291, 0x624E, 0x02D4,
+ 0x6250, 0x17A9, 0x6251, 0x0345, 0x6252, 0x0344, 0x6253, 0x0342,
+ 0x6254, 0x0343, 0x6258, 0x03D6, 0x6259, 0x17F2, 0x625A, 0x17F4,
+ 0x625B, 0x03D5, 0x625C, 0x17EC, 0x625E, 0x17ED, 0x6260, 0x17F3,
+ 0x6261, 0x17EF, 0x6262, 0x17F1, 0x6263, 0x03D4, 0x6264, 0x17EE,
+ 0x6265, 0x17F5, 0x6266, 0x17F0, 0x626D, 0x04A9, 0x626E, 0x04B2,
+ 0x626F, 0x04B0, 0x6270, 0x1897, 0x6271, 0x1894, 0x6272, 0x189C,
+ 0x6273, 0x04AE, 0x6274, 0x189D, 0x6276, 0x04A7, 0x6277, 0x189A,
+ 0x6279, 0x04AD, 0x627A, 0x1896, 0x627B, 0x1895, 0x627C, 0x04AB,
+ 0x627D, 0x189B, 0x627E, 0x04AC, 0x627F, 0x05D5, 0x6280, 0x04A6,
+ 0x6281, 0x1898, 0x6283, 0x188E, 0x6284, 0x04A3, 0x6286, 0x04B6,
+ 0x6287, 0x1893, 0x6288, 0x1899, 0x6289, 0x04A8, 0x628A, 0x04AA,
+ 0x628C, 0x188F, 0x628E, 0x1890, 0x628F, 0x1891, 0x6291, 0x04B5,
+ 0x6292, 0x04AF, 0x6293, 0x04B4, 0x6294, 0x1892, 0x6295, 0x04B3,
+ 0x6296, 0x04A5, 0x6297, 0x04A4, 0x6298, 0x04B1, 0x62A8, 0x05E3,
+ 0x62A9, 0x199E, 0x62AA, 0x1997, 0x62AB, 0x05DE, 0x62AC, 0x05F1,
+ 0x62AD, 0x1993, 0x62AE, 0x199A, 0x62AF, 0x199C, 0x62B0, 0x199F,
+ 0x62B1, 0x05EC, 0x62B3, 0x199B, 0x62B4, 0x1994, 0x62B5, 0x05EA,
+ 0x62B6, 0x1998, 0x62B8, 0x19A0, 0x62B9, 0x05DB, 0x62BB, 0x199D,
+ 0x62BC, 0x05E5, 0x62BD, 0x05E4, 0x62BE, 0x1996, 0x62BF, 0x05D9,
+ 0x62C2, 0x05DA, 0x62C4, 0x05D8, 0x62C6, 0x05F0, 0x62C7, 0x05E8,
+ 0x62C8, 0x05E2, 0x62C9, 0x05D6, 0x62CA, 0x1999, 0x62CB, 0x05E1,
+ 0x62CC, 0x05D7, 0x62CD, 0x05E9, 0x62CE, 0x05F2, 0x62CF, 0x1AEE,
+ 0x62D0, 0x05E6, 0x62D1, 0x1995, 0x62D2, 0x05DC, 0x62D3, 0x05DF,
+ 0x62D4, 0x05E0, 0x62D6, 0x05EE, 0x62D7, 0x05EF, 0x62D8, 0x05ED,
+ 0x62D9, 0x05E7, 0x62DA, 0x05EB, 0x62DB, 0x05DD, 0x62DC, 0x0730,
+ 0x62EB, 0x1AF4, 0x62EC, 0x073C, 0x62ED, 0x0734, 0x62EE, 0x0736,
+ 0x62EF, 0x073B, 0x62F0, 0x1B00, 0x62F1, 0x0739, 0x62F2, 0x1CA2,
+ 0x62F3, 0x08C3, 0x62F4, 0x073E, 0x62F5, 0x1AF1, 0x62F6, 0x1AF9,
+ 0x62F7, 0x073A, 0x62F8, 0x1AF8, 0x62F9, 0x1AF5, 0x62FA, 0x1AFD,
+ 0x62FB, 0x1AFF, 0x62FC, 0x0733, 0x62FD, 0x0737, 0x62FE, 0x073D,
+ 0x62FF, 0x08C5, 0x6300, 0x1AFA, 0x6301, 0x0735, 0x6302, 0x0740,
+ 0x6303, 0x1AF3, 0x6307, 0x0738, 0x6308, 0x08C4, 0x6309, 0x0732,
+ 0x630B, 0x1AF0, 0x630C, 0x1AF7, 0x630D, 0x1AEF, 0x630E, 0x1AF2,
+ 0x630F, 0x1AF6, 0x6310, 0x1CA3, 0x6311, 0x073F, 0x6313, 0x1AFB,
+ 0x6314, 0x1AFC, 0x6315, 0x1AFE, 0x6316, 0x0731, 0x6328, 0x08D3,
+ 0x6329, 0x1CAF, 0x632A, 0x08D1, 0x632B, 0x08D2, 0x632C, 0x1CA5,
+ 0x632D, 0x1CB5, 0x632F, 0x08C8, 0x6332, 0x1EED, 0x6333, 0x1CB7,
+ 0x6334, 0x1CB1, 0x6336, 0x1CA8, 0x6338, 0x1CBA, 0x6339, 0x1CAB,
+ 0x633A, 0x08CE, 0x633B, 0x1F04, 0x633C, 0x1CAE, 0x633D, 0x08D0,
+ 0x633E, 0x08C7, 0x6340, 0x1CBC, 0x6341, 0x1CB0, 0x6342, 0x08CA,
+ 0x6343, 0x1CA9, 0x6344, 0x1CA6, 0x6345, 0x1CA7, 0x6346, 0x08CB,
+ 0x6347, 0x1CB6, 0x6348, 0x1CBD, 0x6349, 0x08CD, 0x634A, 0x1CAD,
+ 0x634B, 0x1CAC, 0x634C, 0x08D5, 0x634D, 0x08D4, 0x634E, 0x08C6,
+ 0x634F, 0x08CC, 0x6350, 0x08CF, 0x6351, 0x1CB9, 0x6354, 0x1CB3,
+ 0x6355, 0x08C9, 0x6356, 0x1CA4, 0x6357, 0x1CBB, 0x6358, 0x1CB2,
+ 0x6359, 0x1CB4, 0x635A, 0x1CB8, 0x6365, 0x1EEE, 0x6367, 0x0AA1,
+ 0x6368, 0x0AB5, 0x6369, 0x0AB4, 0x636B, 0x0AA9, 0x636D, 0x1F00,
+ 0x636E, 0x1EFC, 0x636F, 0x1EF9, 0x6370, 0x1F0B, 0x6371, 0x0AA4,
+ 0x6372, 0x0A9C, 0x6375, 0x1EFE, 0x6376, 0x0C69, 0x6377, 0x0AA0,
+ 0x6378, 0x1F06, 0x637A, 0x0AB6, 0x637B, 0x0AB3, 0x637C, 0x1F02,
+ 0x637D, 0x1EF1, 0x6380, 0x0AB2, 0x6381, 0x1F08, 0x6382, 0x1EF0,
+ 0x6383, 0x0AA7, 0x6384, 0x0AAB, 0x6385, 0x1F07, 0x6387, 0x1EFA,
+ 0x6388, 0x0AAC, 0x6389, 0x0AA6, 0x638A, 0x1EEF, 0x638C, 0x0C5B,
+ 0x638D, 0x1F0A, 0x638E, 0x1EF8, 0x638F, 0x0AB1, 0x6390, 0x1EFB,
+ 0x6391, 0x1F09, 0x6392, 0x0AB0, 0x6394, 0x214C, 0x6396, 0x0A9D,
+ 0x6397, 0x1EF6, 0x6398, 0x0AA2, 0x6399, 0x0AAD, 0x639B, 0x0AA8,
+ 0x639C, 0x1EFF, 0x639D, 0x1EF5, 0x639E, 0x1EF3, 0x639F, 0x1F05,
+ 0x63A0, 0x0A9A, 0x63A1, 0x0AAE, 0x63A2, 0x0A9E, 0x63A3, 0x0C5A,
+ 0x63A4, 0x1F03, 0x63A5, 0x0A9F, 0x63A7, 0x0A9B, 0x63A8, 0x0AAA,
+ 0x63A9, 0x0AA5, 0x63AA, 0x0AA3, 0x63AB, 0x1EF7, 0x63AC, 0x0AAF,
+ 0x63AD, 0x1EF4, 0x63AE, 0x1F01, 0x63AF, 0x1EFD, 0x63B0, 0x214E,
+ 0x63B1, 0x214D, 0x63BD, 0x1EF2, 0x63BE, 0x215E, 0x63C0, 0x0C5D,
+ 0x63C2, 0x2164, 0x63C3, 0x2153, 0x63C4, 0x2161, 0x63C5, 0x23E6,
+ 0x63C6, 0x0C60, 0x63C7, 0x2165, 0x63C8, 0x2168, 0x63C9, 0x0C5F,
+ 0x63CA, 0x2156, 0x63CB, 0x2167, 0x63CC, 0x2166, 0x63CD, 0x0C61,
+ 0x63CE, 0x214F, 0x63CF, 0x0C5C, 0x63D0, 0x0C64, 0x63D2, 0x0C62,
+ 0x63D3, 0x2163, 0x63D5, 0x2159, 0x63D6, 0x0C66, 0x63D7, 0x216A,
+ 0x63D8, 0x2162, 0x63D9, 0x216B, 0x63DA, 0x0C6E, 0x63DB, 0x0C6C,
+ 0x63DC, 0x2160, 0x63DD, 0x215F, 0x63DF, 0x215D, 0x63E0, 0x2157,
+ 0x63E1, 0x0C65, 0x63E3, 0x0C63, 0x63E4, 0x1CAA, 0x63E5, 0x2150,
+ 0x63E7, 0x2404, 0x63E8, 0x2151, 0x63E9, 0x0C5E, 0x63EA, 0x0C6B,
+ 0x63EB, 0x23E8, 0x63ED, 0x0C67, 0x63EE, 0x0C68, 0x63EF, 0x2152,
+ 0x63F0, 0x2169, 0x63F1, 0x23E7, 0x63F2, 0x215A, 0x63F3, 0x2155,
+ 0x63F4, 0x0C6A, 0x63F5, 0x215B, 0x63F6, 0x2158, 0x63F9, 0x0C6F,
+ 0x6406, 0x0E2A, 0x6409, 0x23EB, 0x640A, 0x23FE, 0x640B, 0x2403,
+ 0x640C, 0x23F7, 0x640D, 0x0E26, 0x640E, 0x2408, 0x640F, 0x0E23,
+ 0x6410, 0x23E9, 0x6412, 0x23EA, 0x6413, 0x0E1C, 0x6414, 0x0E25,
+ 0x6415, 0x23F1, 0x6416, 0x0E28, 0x6417, 0x0E29, 0x6418, 0x23F2,
+ 0x641A, 0x23FF, 0x641B, 0x2405, 0x641C, 0x0E24, 0x641E, 0x0E1E,
+ 0x641F, 0x23F0, 0x6420, 0x23EC, 0x6421, 0x2407, 0x6422, 0x23F5,
+ 0x6423, 0x23F6, 0x6424, 0x23ED, 0x6425, 0x2401, 0x6426, 0x23F8,
+ 0x6427, 0x2402, 0x6428, 0x23FA, 0x642A, 0x0E1F, 0x642B, 0x2699,
+ 0x642C, 0x0E22, 0x642D, 0x0E20, 0x642E, 0x2406, 0x642F, 0x23FD,
+ 0x6430, 0x23F9, 0x6433, 0x23EE, 0x6434, 0x0FE4, 0x6435, 0x23FC,
+ 0x6436, 0x0E27, 0x6437, 0x23F4, 0x6439, 0x23F3, 0x643D, 0x0E21,
+ 0x643E, 0x0E1D, 0x643F, 0x26AE, 0x6440, 0x2400, 0x6441, 0x23FB,
+ 0x6443, 0x23EF, 0x644B, 0x26A9, 0x644D, 0x269A, 0x644E, 0x26A5,
+ 0x6450, 0x26AC, 0x6451, 0x0FE2, 0x6452, 0x0C6D, 0x6453, 0x26AA,
+ 0x6454, 0x0FDD, 0x6458, 0x0FDC, 0x6459, 0x26B1, 0x645B, 0x269B,
+ 0x645C, 0x26A8, 0x645D, 0x269C, 0x645E, 0x26A7, 0x645F, 0x0FE0,
+ 0x6460, 0x26AB, 0x6461, 0x215C, 0x6465, 0x26B2, 0x6466, 0x26A3,
+ 0x6467, 0x0FE3, 0x6468, 0x28EE, 0x6469, 0x1159, 0x646B, 0x26B0,
+ 0x646C, 0x26AF, 0x646D, 0x0FE5, 0x646E, 0x28E1, 0x646F, 0x115A,
+ 0x6470, 0x28E2, 0x6472, 0x269F, 0x6473, 0x26A0, 0x6474, 0x269D,
+ 0x6475, 0x26A2, 0x6476, 0x269E, 0x6477, 0x26B3, 0x6478, 0x0FDF,
+ 0x6479, 0x115B, 0x647A, 0x0FE1, 0x647B, 0x0FE6, 0x647D, 0x26A1,
+ 0x647F, 0x26AD, 0x6482, 0x26A6, 0x6485, 0x28E5, 0x6487, 0x0FDB,
+ 0x6488, 0x115E, 0x6489, 0x2B54, 0x648A, 0x28EA, 0x648B, 0x28E9,
+ 0x648C, 0x28EB, 0x648F, 0x28E8, 0x6490, 0x115F, 0x6492, 0x1165,
+ 0x6493, 0x1162, 0x6495, 0x1163, 0x6496, 0x28E3, 0x6497, 0x28E6,
+ 0x6498, 0x28F0, 0x6499, 0x116B, 0x649A, 0x1169, 0x649C, 0x28E7,
+ 0x649D, 0x2154, 0x649E, 0x115C, 0x649F, 0x28ED, 0x64A0, 0x28E4,
+ 0x64A2, 0x116C, 0x64A3, 0x28EC, 0x64A4, 0x0FDE, 0x64A5, 0x1161,
+ 0x64A6, 0x26A4, 0x64A9, 0x1164, 0x64AB, 0x1168, 0x64AC, 0x116A,
+ 0x64AD, 0x1167, 0x64AE, 0x1166, 0x64B0, 0x1160, 0x64B1, 0x28EF,
+ 0x64B2, 0x115D, 0x64B3, 0x116D, 0x64BB, 0x12BB, 0x64BC, 0x12BC,
+ 0x64BD, 0x2B53, 0x64BE, 0x12C5, 0x64BF, 0x12C2, 0x64C1, 0x12B9,
+ 0x64C2, 0x12C0, 0x64C3, 0x2B55, 0x64C4, 0x12BE, 0x64C5, 0x12B8,
+ 0x64C7, 0x12BF, 0x64C9, 0x2B52, 0x64CA, 0x13D8, 0x64CB, 0x12BA,
+ 0x64CD, 0x12C1, 0x64CE, 0x13D7, 0x64CF, 0x2B51, 0x64D0, 0x2B50,
+ 0x64D2, 0x12C3, 0x64D4, 0x12C4, 0x64D6, 0x2B4F, 0x64D7, 0x2B4E,
+ 0x64D8, 0x13D9, 0x64D9, 0x2B58, 0x64DA, 0x12BD, 0x64DB, 0x2B56,
+ 0x64E0, 0x13DA, 0x64E2, 0x13DF, 0x64E3, 0x2D6A, 0x64E4, 0x2D6C,
+ 0x64E6, 0x13DC, 0x64E8, 0x2D6D, 0x64E9, 0x2D69, 0x64EB, 0x2D6B,
+ 0x64EC, 0x13DD, 0x64ED, 0x13E0, 0x64EF, 0x2D68, 0x64F0, 0x13DB,
+ 0x64F1, 0x13DE, 0x64F2, 0x14D3, 0x64F3, 0x2B57, 0x64F4, 0x14D2,
+ 0x64F7, 0x14D8, 0x64F8, 0x2F2B, 0x64FA, 0x14D6, 0x64FB, 0x14D7,
+ 0x64FC, 0x2F2E, 0x64FD, 0x2F2A, 0x64FE, 0x14D4, 0x64FF, 0x2F28,
+ 0x6500, 0x1582, 0x6501, 0x2F2C, 0x6503, 0x2F2D, 0x6504, 0x2F29,
+ 0x6506, 0x14D5, 0x6507, 0x3090, 0x6509, 0x3093, 0x650C, 0x3094,
+ 0x650D, 0x3092, 0x650E, 0x3095, 0x650F, 0x1583, 0x6510, 0x3091,
+ 0x6513, 0x31D7, 0x6514, 0x1617, 0x6515, 0x31D6, 0x6516, 0x31D5,
+ 0x6517, 0x31D4, 0x6518, 0x1616, 0x6519, 0x1618, 0x651B, 0x32D2,
+ 0x651C, 0x1673, 0x651D, 0x1672, 0x6520, 0x3382, 0x6521, 0x3381,
+ 0x6522, 0x3384, 0x6523, 0x16F9, 0x6524, 0x16C5, 0x6525, 0x341B,
+ 0x6526, 0x3383, 0x6529, 0x341A, 0x652A, 0x16FB, 0x652B, 0x16FA,
+ 0x652C, 0x1721, 0x652D, 0x3484, 0x652E, 0x34CA, 0x652F, 0x02D5,
+ 0x6532, 0x216C, 0x6533, 0x2B59, 0x6534, 0x022C, 0x6536, 0x03D7,
+ 0x6537, 0x17F6, 0x6538, 0x04B9, 0x6539, 0x04B7, 0x653B, 0x04B8,
+ 0x653D, 0x19A1, 0x653E, 0x05F3, 0x653F, 0x0741, 0x6541, 0x1B01,
+ 0x6543, 0x1B02, 0x6545, 0x0742, 0x6546, 0x1CBF, 0x6548, 0x08D6,
+ 0x6549, 0x08D7, 0x654A, 0x1CBE, 0x654F, 0x0ABD, 0x6551, 0x0AB9,
+ 0x6553, 0x1F0C, 0x6554, 0x0AC0, 0x6555, 0x0ABF, 0x6556, 0x0AB8,
+ 0x6557, 0x0ABB, 0x6558, 0x0ABE, 0x6559, 0x0ABA, 0x655C, 0x2170,
+ 0x655D, 0x0AB7, 0x655E, 0x0C70, 0x6562, 0x0C72, 0x6563, 0x0C73,
+ 0x6564, 0x216F, 0x6565, 0x2172, 0x6566, 0x0C71, 0x6567, 0x216D,
+ 0x6568, 0x2171, 0x656A, 0x216E, 0x656C, 0x0E2B, 0x656F, 0x2409,
+ 0x6572, 0x0FE7, 0x6573, 0x26B4, 0x6574, 0x12C6, 0x6575, 0x116E,
+ 0x6576, 0x28F1, 0x6577, 0x116F, 0x6578, 0x1170, 0x6579, 0x28F3,
+ 0x657A, 0x28F2, 0x657B, 0x28F4, 0x657C, 0x2B5B, 0x657F, 0x2B5A,
+ 0x6580, 0x2D6F, 0x6581, 0x2D6E, 0x6582, 0x13E1, 0x6583, 0x13E2,
+ 0x6584, 0x3096, 0x6587, 0x02D6, 0x658C, 0x2173, 0x6590, 0x0C75,
+ 0x6591, 0x0C74, 0x6592, 0x240A, 0x6594, 0x2F2F, 0x6595, 0x1674,
+ 0x6596, 0x341C, 0x6597, 0x02D7, 0x6599, 0x08D8, 0x659B, 0x0AC2,
+ 0x659C, 0x0AC1, 0x659D, 0x2174, 0x659E, 0x2175, 0x659F, 0x0E2C,
+ 0x65A0, 0x26B5, 0x65A1, 0x0FE8, 0x65A2, 0x2B5C, 0x65A4, 0x02D8,
+ 0x65A5, 0x0346, 0x65A7, 0x05F4, 0x65A8, 0x19A2, 0x65AA, 0x1B03,
+ 0x65AB, 0x0743, 0x65AC, 0x0AC3, 0x65AE, 0x2176, 0x65AF, 0x0C76,
+ 0x65B0, 0x0E2D, 0x65B2, 0x28F5, 0x65B3, 0x28F6, 0x65B6, 0x2D70,
+ 0x65B7, 0x14D9, 0x65B8, 0x34CB, 0x65B9, 0x02D9, 0x65BB, 0x19A3,
+ 0x65BC, 0x05F5, 0x65BD, 0x0744, 0x65BF, 0x1B04, 0x65C1, 0x08D9,
+ 0x65C2, 0x1CC3, 0x65C3, 0x1CC1, 0x65C4, 0x1CC2, 0x65C5, 0x08DA,
+ 0x65C6, 0x1CC0, 0x65CB, 0x0AC5, 0x65CC, 0x0AC6, 0x65CD, 0x1F0D,
+ 0x65CE, 0x0AC7, 0x65CF, 0x0AC4, 0x65D0, 0x2177, 0x65D2, 0x2178,
+ 0x65D3, 0x240B, 0x65D6, 0x0FEA, 0x65D7, 0x0FE9, 0x65DA, 0x2D71,
+ 0x65DB, 0x2F30, 0x65DD, 0x3098, 0x65DE, 0x3097, 0x65DF, 0x31D8,
+ 0x65E0, 0x022D, 0x65E1, 0x1789, 0x65E2, 0x0745, 0x65E5, 0x02DA,
+ 0x65E6, 0x0347, 0x65E8, 0x03D9, 0x65E9, 0x03D8, 0x65EC, 0x03DA,
+ 0x65ED, 0x03DB, 0x65EE, 0x17F8, 0x65EF, 0x17F7, 0x65F0, 0x189E,
+ 0x65F1, 0x04BA, 0x65F2, 0x18A1, 0x65F3, 0x18A0, 0x65F4, 0x189F,
+ 0x65F5, 0x18A2, 0x65FA, 0x05F6, 0x65FB, 0x19A9, 0x65FC, 0x19A5,
+ 0x65FD, 0x19AE, 0x6600, 0x05FD, 0x6602, 0x05FB, 0x6603, 0x19AA,
+ 0x6604, 0x19A6, 0x6605, 0x19AD, 0x6606, 0x05FA, 0x6607, 0x0601,
+ 0x6608, 0x19A8, 0x6609, 0x19A4, 0x660A, 0x0600, 0x660B, 0x19AB,
+ 0x660C, 0x05F9, 0x660D, 0x19AC, 0x660E, 0x05FC, 0x660F, 0x05FE,
+ 0x6610, 0x19B0, 0x6611, 0x19AF, 0x6612, 0x19A7, 0x6613, 0x05F8,
+ 0x6614, 0x05F7, 0x6615, 0x05FF, 0x661C, 0x1B09, 0x661D, 0x1B0F,
+ 0x661F, 0x074B, 0x6620, 0x0748, 0x6621, 0x1B06, 0x6622, 0x1B0B,
+ 0x6624, 0x074E, 0x6625, 0x0746, 0x6626, 0x1B0A, 0x6627, 0x0749,
+ 0x6628, 0x074C, 0x662B, 0x1B0D, 0x662D, 0x0747, 0x662E, 0x1B12,
+ 0x662F, 0x074A, 0x6631, 0x074D, 0x6632, 0x1B07, 0x6633, 0x1B0C,
+ 0x6634, 0x1B10, 0x6635, 0x1B08, 0x6636, 0x1B05, 0x6639, 0x1B11,
+ 0x663A, 0x1B0E, 0x6641, 0x08E2, 0x6642, 0x08DB, 0x6643, 0x08DE,
+ 0x6645, 0x08E1, 0x6647, 0x1CC6, 0x6649, 0x08DC, 0x664A, 0x1CC4,
+ 0x664C, 0x08E0, 0x664F, 0x08DD, 0x6651, 0x1CC7, 0x6652, 0x08DF,
+ 0x6659, 0x1F11, 0x665A, 0x0AC9, 0x665B, 0x1F10, 0x665C, 0x1F12,
+ 0x665D, 0x0AC8, 0x665E, 0x0ACD, 0x665F, 0x1CC5, 0x6661, 0x1F0F,
+ 0x6662, 0x1F13, 0x6664, 0x0ACA, 0x6665, 0x1F0E, 0x6666, 0x0ACC,
+ 0x6668, 0x0ACB, 0x666A, 0x217F, 0x666C, 0x217A, 0x666E, 0x0C77,
+ 0x666F, 0x0C7B, 0x6670, 0x0C78, 0x6671, 0x217D, 0x6672, 0x2180,
+ 0x6674, 0x0C79, 0x6676, 0x0C7A, 0x6677, 0x0C7F, 0x6678, 0x2414,
+ 0x6679, 0x217E, 0x667A, 0x0C7D, 0x667B, 0x217B, 0x667C, 0x2179,
+ 0x667E, 0x0C7E, 0x6680, 0x217C, 0x6684, 0x0E33, 0x6686, 0x240C,
+ 0x6687, 0x0E30, 0x6688, 0x0E31, 0x6689, 0x0E2F, 0x668A, 0x2411,
+ 0x668B, 0x2410, 0x668C, 0x240D, 0x668D, 0x0E35, 0x6690, 0x240F,
+ 0x6691, 0x0C7C, 0x6694, 0x2413, 0x6695, 0x240E, 0x6696, 0x0E32,
+ 0x6697, 0x0E2E, 0x6698, 0x0E34, 0x6699, 0x2412, 0x669D, 0x0FED,
+ 0x669F, 0x26B8, 0x66A0, 0x26B7, 0x66A1, 0x26B6, 0x66A2, 0x0FEB,
+ 0x66A8, 0x0FEC, 0x66A9, 0x28F9, 0x66AA, 0x28FC, 0x66AB, 0x1172,
+ 0x66AE, 0x1171, 0x66AF, 0x28FD, 0x66B0, 0x28F8, 0x66B1, 0x1174,
+ 0x66B2, 0x28FA, 0x66B4, 0x1173, 0x66B5, 0x28F7, 0x66B7, 0x28FB,
+ 0x66B8, 0x12CC, 0x66B9, 0x12C9, 0x66BA, 0x2B65, 0x66BB, 0x2B64,
+ 0x66BD, 0x2B63, 0x66BE, 0x2B5E, 0x66C0, 0x2B5F, 0x66C4, 0x12CA,
+ 0x66C6, 0x12C7, 0x66C7, 0x12CB, 0x66C8, 0x2B5D, 0x66C9, 0x12C8,
+ 0x66CA, 0x2B60, 0x66CB, 0x2B61, 0x66CC, 0x2B66, 0x66CF, 0x2B62,
+ 0x66D2, 0x2D72, 0x66D6, 0x13E4, 0x66D8, 0x2F33, 0x66D9, 0x13E3,
+ 0x66DA, 0x2F31, 0x66DB, 0x2F32, 0x66DC, 0x14DA, 0x66DD, 0x1585,
+ 0x66DE, 0x3099, 0x66E0, 0x1584, 0x66E3, 0x31DA, 0x66E4, 0x31DB,
+ 0x66E6, 0x1619, 0x66E8, 0x31D9, 0x66E9, 0x1675, 0x66EB, 0x341D,
+ 0x66EC, 0x16FC, 0x66ED, 0x3485, 0x66EE, 0x3486, 0x66F0, 0x02DB,
+ 0x66F2, 0x03DC, 0x66F3, 0x03DD, 0x66F4, 0x04BB, 0x66F6, 0x19B1,
+ 0x66F7, 0x074F, 0x66F8, 0x08E3, 0x66F9, 0x0ACE, 0x66FC, 0x0A1F,
+ 0x66FE, 0x0C80, 0x66FF, 0x0C81, 0x6700, 0x0BF0, 0x6701, 0x2181,
+ 0x6703, 0x0E36, 0x6704, 0x26BA, 0x6705, 0x26B9, 0x6708, 0x02DC,
+ 0x6709, 0x03DE, 0x670A, 0x19B2, 0x670B, 0x0603, 0x670D, 0x0602,
+ 0x670F, 0x1B13, 0x6710, 0x1B14, 0x6712, 0x1CC8, 0x6713, 0x1CC9,
+ 0x6714, 0x08E4, 0x6715, 0x08E5, 0x6717, 0x08E6, 0x6718, 0x1F14,
+ 0x671B, 0x0AD0, 0x671D, 0x0C83, 0x671F, 0x0C82, 0x6720, 0x2415,
+ 0x6721, 0x2522, 0x6722, 0x26BB, 0x6723, 0x2B67, 0x6726, 0x14DB,
+ 0x6727, 0x161A, 0x6728, 0x02DD, 0x672A, 0x034A, 0x672B, 0x034B,
+ 0x672C, 0x0349, 0x672D, 0x034C, 0x672E, 0x0348, 0x6731, 0x03E1,
+ 0x6733, 0x1800, 0x6734, 0x03E0, 0x6735, 0x03E2, 0x6738, 0x17FB,
+ 0x6739, 0x17FA, 0x673A, 0x17FD, 0x673B, 0x17FC, 0x673C, 0x17FF,
+ 0x673D, 0x03DF, 0x673E, 0x17F9, 0x673F, 0x17FE, 0x6745, 0x18A3,
+ 0x6746, 0x04C5, 0x6747, 0x18A4, 0x6748, 0x18A8, 0x6749, 0x04C4,
+ 0x674B, 0x18AC, 0x674C, 0x18A7, 0x674D, 0x18AA, 0x674E, 0x04BD,
+ 0x674F, 0x04BE, 0x6750, 0x04BF, 0x6751, 0x04C0, 0x6753, 0x04C7,
+ 0x6755, 0x18A6, 0x6756, 0x04C2, 0x6757, 0x04C8, 0x6759, 0x18A5,
+ 0x675A, 0x18AB, 0x675C, 0x04C1, 0x675D, 0x18A9, 0x675E, 0x04C3,
+ 0x675F, 0x04BC, 0x6760, 0x04C6, 0x676A, 0x0618, 0x676C, 0x19B4,
+ 0x676D, 0x0604, 0x676F, 0x060E, 0x6770, 0x060F, 0x6771, 0x0607,
+ 0x6772, 0x0619, 0x6773, 0x0609, 0x6774, 0x19BC, 0x6775, 0x0614,
+ 0x6776, 0x19B7, 0x6777, 0x060A, 0x6778, 0x19C6, 0x6779, 0x19C7,
+ 0x677A, 0x19BF, 0x677B, 0x19B8, 0x677C, 0x0617, 0x677D, 0x19C4,
+ 0x677E, 0x0612, 0x677F, 0x0610, 0x6781, 0x19C5, 0x6783, 0x19C3,
+ 0x6784, 0x19BB, 0x6785, 0x19B3, 0x6786, 0x19BA, 0x6787, 0x060B,
+ 0x6789, 0x0611, 0x678B, 0x0605, 0x678C, 0x19BE, 0x678D, 0x19BD,
+ 0x678E, 0x19B5, 0x6790, 0x0613, 0x6791, 0x19C1, 0x6792, 0x19B6,
+ 0x6793, 0x0616, 0x6794, 0x19C8, 0x6795, 0x0606, 0x6797, 0x060D,
+ 0x6798, 0x19B9, 0x6799, 0x19C2, 0x679A, 0x0615, 0x679C, 0x0608,
+ 0x679D, 0x060C, 0x679F, 0x19C0, 0x67AE, 0x1B34, 0x67AF, 0x0757,
+ 0x67B0, 0x0764, 0x67B2, 0x1B2F, 0x67B3, 0x1B25, 0x67B4, 0x075D,
+ 0x67B5, 0x1B23, 0x67B6, 0x0756, 0x67B7, 0x1B1E, 0x67B8, 0x0760,
+ 0x67B9, 0x1B2B, 0x67BA, 0x1B18, 0x67BB, 0x1B1A, 0x67C0, 0x1B1D,
+ 0x67C1, 0x1B15, 0x67C2, 0x1B2A, 0x67C3, 0x1B3A, 0x67C4, 0x075B,
+ 0x67C5, 0x1B1F, 0x67C6, 0x1B31, 0x67C8, 0x1B17, 0x67C9, 0x1B38,
+ 0x67CA, 0x1B39, 0x67CB, 0x1B3C, 0x67CC, 0x1B33, 0x67CD, 0x1B24,
+ 0x67CE, 0x1B2C, 0x67CF, 0x0761, 0x67D0, 0x0754, 0x67D1, 0x075C,
+ 0x67D2, 0x0768, 0x67D3, 0x0751, 0x67D4, 0x0753, 0x67D8, 0x1B1C,
+ 0x67D9, 0x0765, 0x67DA, 0x075E, 0x67DB, 0x1B36, 0x67DC, 0x1B19,
+ 0x67DD, 0x0767, 0x67DE, 0x0762, 0x67DF, 0x1B22, 0x67E2, 0x0766,
+ 0x67E3, 0x1B29, 0x67E4, 0x1B21, 0x67E5, 0x075F, 0x67E6, 0x1B35,
+ 0x67E7, 0x1B2D, 0x67E9, 0x0759, 0x67EA, 0x1B3B, 0x67EB, 0x1B20,
+ 0x67EC, 0x0755, 0x67ED, 0x1B32, 0x67EE, 0x1B28, 0x67EF, 0x075A,
+ 0x67F0, 0x1B2E, 0x67F1, 0x0752, 0x67F2, 0x1B16, 0x67F3, 0x0763,
+ 0x67F4, 0x08F5, 0x67F5, 0x0758, 0x67F6, 0x1B27, 0x67F7, 0x1B26,
+ 0x67F8, 0x1B1B, 0x67FA, 0x1B37, 0x67FC, 0x1B30, 0x67FF, 0x0750,
+ 0x6812, 0x1CDD, 0x6813, 0x08FC, 0x6814, 0x1CDE, 0x6816, 0x1CD2,
+ 0x6817, 0x08F1, 0x6818, 0x08FD, 0x681A, 0x1CCB, 0x681C, 0x1CD4,
+ 0x681D, 0x1CDC, 0x681F, 0x1CCA, 0x6820, 0x1CE5, 0x6821, 0x08E7,
+ 0x6825, 0x1CE4, 0x6826, 0x1CDF, 0x6828, 0x1CE0, 0x6829, 0x08EF,
+ 0x682A, 0x08FA, 0x682B, 0x1CD6, 0x682D, 0x1CD7, 0x682E, 0x1CE1,
+ 0x682F, 0x1CD8, 0x6831, 0x1CD3, 0x6832, 0x1CCD, 0x6833, 0x1CCE,
+ 0x6834, 0x1CDB, 0x6835, 0x1CD5, 0x6838, 0x08E8, 0x6839, 0x08EC,
+ 0x683A, 0x1CE3, 0x683B, 0x1CCF, 0x683C, 0x08F8, 0x683D, 0x08F4,
+ 0x6840, 0x08F7, 0x6841, 0x08FE, 0x6842, 0x08ED, 0x6843, 0x08F9,
+ 0x6844, 0x1CDA, 0x6845, 0x08FB, 0x6846, 0x08EA, 0x6848, 0x08E9,
+ 0x6849, 0x1CCC, 0x684B, 0x1CD0, 0x684C, 0x08F2, 0x684D, 0x1CE2,
+ 0x684E, 0x1CD9, 0x684F, 0x1CD1, 0x6850, 0x08F6, 0x6851, 0x08F3,
+ 0x6853, 0x08EB, 0x6854, 0x08EE, 0x686B, 0x1F29, 0x686D, 0x1F19,
+ 0x686E, 0x1F1A, 0x686F, 0x1F1E, 0x6871, 0x1F2D, 0x6872, 0x1F2A,
+ 0x6874, 0x1F23, 0x6875, 0x1F22, 0x6876, 0x0AD7, 0x6877, 0x1F26,
+ 0x6878, 0x1F35, 0x6879, 0x1F15, 0x687B, 0x1F36, 0x687C, 0x1F28,
+ 0x687D, 0x1F3A, 0x687E, 0x1F2E, 0x687F, 0x0AD6, 0x6880, 0x1F2C,
+ 0x6881, 0x0AD1, 0x6882, 0x0AE6, 0x6883, 0x0ADC, 0x6885, 0x0AE0,
+ 0x6886, 0x0ADF, 0x6887, 0x1F16, 0x6889, 0x1F33, 0x688A, 0x1F39,
+ 0x688B, 0x1F31, 0x688C, 0x1F38, 0x688F, 0x1F25, 0x6890, 0x1F17,
+ 0x6891, 0x1F37, 0x6892, 0x1F27, 0x6893, 0x0AD4, 0x6894, 0x0AE1,
+ 0x6896, 0x1F30, 0x6897, 0x0ADA, 0x689B, 0x1F2F, 0x689C, 0x1F18,
+ 0x689D, 0x0AE2, 0x689F, 0x0AE4, 0x68A0, 0x1F32, 0x68A1, 0x0AE5,
+ 0x68A2, 0x0AD3, 0x68A3, 0x1F1F, 0x68A4, 0x1F34, 0x68A7, 0x0AD9,
+ 0x68A8, 0x0AE3, 0x68A9, 0x1F21, 0x68AA, 0x1F2B, 0x68AB, 0x1F1C,
+ 0x68AC, 0x1F20, 0x68AD, 0x0ADE, 0x68AE, 0x1F1B, 0x68AF, 0x0AD2,
+ 0x68B0, 0x0ADB, 0x68B1, 0x0AD8, 0x68B2, 0x1F24, 0x68B3, 0x08F0,
+ 0x68B4, 0x2198, 0x68B5, 0x0AD5, 0x68C4, 0x0ADD, 0x68C6, 0x219B,
+ 0x68C7, 0x21B1, 0x68C8, 0x21A6, 0x68C9, 0x0C97, 0x68CB, 0x0C92,
+ 0x68CC, 0x2195, 0x68CD, 0x0C93, 0x68CE, 0x21A5, 0x68D0, 0x219E,
+ 0x68D1, 0x21AB, 0x68D2, 0x0C8F, 0x68D3, 0x2183, 0x68D4, 0x21AD,
+ 0x68D5, 0x0C85, 0x68D6, 0x218B, 0x68D7, 0x0C88, 0x68D8, 0x0C87,
+ 0x68DA, 0x0C98, 0x68DC, 0x2185, 0x68DD, 0x21A7, 0x68DE, 0x21A8,
+ 0x68DF, 0x0C8A, 0x68E0, 0x0C86, 0x68E1, 0x2193, 0x68E3, 0x0C91,
+ 0x68E4, 0x218E, 0x68E6, 0x21A9, 0x68E7, 0x0C8D, 0x68E8, 0x21A1,
+ 0x68E9, 0x21AE, 0x68EA, 0x2188, 0x68EB, 0x218D, 0x68EC, 0x2187,
+ 0x68EE, 0x0C8C, 0x68EF, 0x219A, 0x68F0, 0x242B, 0x68F1, 0x2189,
+ 0x68F2, 0x0C90, 0x68F3, 0x2192, 0x68F4, 0x21AA, 0x68F5, 0x0C8B,
+ 0x68F6, 0x218F, 0x68F7, 0x218C, 0x68F8, 0x219D, 0x68F9, 0x0C8E,
+ 0x68FA, 0x0C84, 0x68FB, 0x0C9A, 0x68FC, 0x21A0, 0x68FD, 0x219F,
+ 0x6904, 0x2184, 0x6905, 0x0C89, 0x6906, 0x21AC, 0x6907, 0x2194,
+ 0x6908, 0x2196, 0x690A, 0x21A3, 0x690B, 0x21A2, 0x690C, 0x2182,
+ 0x690D, 0x0C94, 0x690E, 0x0C96, 0x690F, 0x218A, 0x6910, 0x2191,
+ 0x6911, 0x2199, 0x6912, 0x0C95, 0x6913, 0x2190, 0x6914, 0x219C,
+ 0x6915, 0x21AF, 0x6917, 0x21A4, 0x6925, 0x21B0, 0x692A, 0x2186,
+ 0x692F, 0x243F, 0x6930, 0x0E3E, 0x6932, 0x243D, 0x6933, 0x2428,
+ 0x6934, 0x242D, 0x6935, 0x2426, 0x6937, 0x2439, 0x6938, 0x2418,
+ 0x6939, 0x241F, 0x693B, 0x2437, 0x693C, 0x2441, 0x693D, 0x2429,
+ 0x693F, 0x241C, 0x6940, 0x242F, 0x6941, 0x2434, 0x6942, 0x2420,
+ 0x6944, 0x2431, 0x6945, 0x241D, 0x6948, 0x2424, 0x6949, 0x2425,
+ 0x694A, 0x0E40, 0x694B, 0x2438, 0x694C, 0x2436, 0x694E, 0x2419,
+ 0x694F, 0x243B, 0x6951, 0x243C, 0x6952, 0x243E, 0x6953, 0x0E44,
+ 0x6954, 0x0E3C, 0x6956, 0x1F1D, 0x6957, 0x2421, 0x6958, 0x2433,
+ 0x6959, 0x2422, 0x695A, 0x0E39, 0x695B, 0x0E49, 0x695C, 0x243A,
+ 0x695D, 0x0E47, 0x695E, 0x0E43, 0x695F, 0x2417, 0x6960, 0x0E3B,
+ 0x6962, 0x241A, 0x6963, 0x0E48, 0x6965, 0x242A, 0x6966, 0x2416,
+ 0x6968, 0x0E41, 0x6969, 0x242E, 0x696A, 0x241E, 0x696B, 0x0E42,
+ 0x696C, 0x2427, 0x696D, 0x0E38, 0x696E, 0x0C99, 0x696F, 0x2430,
+ 0x6970, 0x2197, 0x6971, 0x241B, 0x6974, 0x2435, 0x6975, 0x0E3D,
+ 0x6976, 0x2432, 0x6977, 0x0E3A, 0x6978, 0x242C, 0x6979, 0x0E45,
+ 0x697A, 0x2423, 0x697B, 0x2440, 0x6982, 0x0E3F, 0x6983, 0x24AF,
+ 0x6986, 0x0E46, 0x698D, 0x26C9, 0x698E, 0x26C7, 0x6990, 0x26DD,
+ 0x6991, 0x26C5, 0x6993, 0x26D7, 0x6994, 0x0E37, 0x6995, 0x0FF0,
+ 0x6996, 0x26C1, 0x6997, 0x26DC, 0x6999, 0x26C6, 0x699A, 0x26D4,
+ 0x699B, 0x0FF5, 0x699C, 0x0FEE, 0x699E, 0x26DA, 0x69A0, 0x26BF,
+ 0x69A1, 0x26D9, 0x69A3, 0x1000, 0x69A4, 0x26D0, 0x69A5, 0x26E0,
+ 0x69A6, 0x0FFE, 0x69A7, 0x26C8, 0x69A8, 0x0FEF, 0x69A9, 0x26CA,
+ 0x69AA, 0x26D8, 0x69AB, 0x0FF8, 0x69AC, 0x26C3, 0x69AD, 0x0FFC,
+ 0x69AE, 0x0FF2, 0x69AF, 0x26CC, 0x69B0, 0x26C2, 0x69B1, 0x26BC,
+ 0x69B3, 0x26D6, 0x69B4, 0x0FF9, 0x69B5, 0x26DF, 0x69B6, 0x26BD,
+ 0x69B7, 0x0FF6, 0x69B9, 0x26D2, 0x69BB, 0x0FF7, 0x69BC, 0x26C4,
+ 0x69BD, 0x26CF, 0x69BE, 0x26CB, 0x69BF, 0x26CD, 0x69C1, 0x0FF1,
+ 0x69C2, 0x26DE, 0x69C3, 0x0FFF, 0x69C4, 0x26CE, 0x69C6, 0x26E1,
+ 0x69C9, 0x26BE, 0x69CA, 0x26D3, 0x69CB, 0x0FF4, 0x69CC, 0x0FFD,
+ 0x69CD, 0x0FFB, 0x69CE, 0x26C0, 0x69CF, 0x26D5, 0x69D0, 0x0FFA,
+ 0x69D3, 0x0FF3, 0x69D4, 0x26D1, 0x69D9, 0x26DB, 0x69E2, 0x2909,
+ 0x69E4, 0x2905, 0x69E5, 0x2901, 0x69E6, 0x2915, 0x69E7, 0x2912,
+ 0x69E8, 0x1177, 0x69EB, 0x2919, 0x69EC, 0x2908, 0x69ED, 0x1182,
+ 0x69EE, 0x290F, 0x69F1, 0x2904, 0x69F2, 0x290E, 0x69F3, 0x117F,
+ 0x69F4, 0x2922, 0x69F6, 0x291F, 0x69F7, 0x2911, 0x69F8, 0x2902,
+ 0x69FB, 0x2916, 0x69FC, 0x2918, 0x69FD, 0x117B, 0x69FE, 0x290C,
+ 0x69FF, 0x2907, 0x6A00, 0x28FE, 0x6A01, 0x1178, 0x6A02, 0x1180,
+ 0x6A04, 0x291B, 0x6A05, 0x1181, 0x6A06, 0x28FF, 0x6A07, 0x2921,
+ 0x6A08, 0x2914, 0x6A09, 0x291A, 0x6A0A, 0x117E, 0x6A0D, 0x2917,
+ 0x6A0F, 0x291E, 0x6A11, 0x1183, 0x6A13, 0x117D, 0x6A14, 0x2910,
+ 0x6A15, 0x2903, 0x6A16, 0x2923, 0x6A17, 0x2900, 0x6A18, 0x291C,
+ 0x6A19, 0x117A, 0x6A1B, 0x290A, 0x6A1D, 0x290B, 0x6A1E, 0x1179,
+ 0x6A1F, 0x1176, 0x6A20, 0x2906, 0x6A21, 0x117C, 0x6A23, 0x1175,
+ 0x6A25, 0x291D, 0x6A26, 0x2920, 0x6A27, 0x290D, 0x6A28, 0x2B74,
+ 0x6A32, 0x2B6C, 0x6A34, 0x2B68, 0x6A35, 0x12D9, 0x6A38, 0x12CE,
+ 0x6A39, 0x12D3, 0x6A3A, 0x12CF, 0x6A3B, 0x2B76, 0x6A3C, 0x2B81,
+ 0x6A3D, 0x12CD, 0x6A3E, 0x2B6E, 0x6A3F, 0x2B77, 0x6A40, 0x2913,
+ 0x6A41, 0x2B78, 0x6A44, 0x12D4, 0x6A46, 0x2B87, 0x6A47, 0x12D8,
+ 0x6A48, 0x12DB, 0x6A49, 0x2B6A, 0x6A4B, 0x12D7, 0x6A4D, 0x2B85,
+ 0x6A4E, 0x2B86, 0x6A4F, 0x2B7C, 0x6A50, 0x2B7B, 0x6A51, 0x2B73,
+ 0x6A54, 0x2B7D, 0x6A55, 0x2B84, 0x6A56, 0x2B83, 0x6A58, 0x12D2,
+ 0x6A59, 0x12D0, 0x6A5A, 0x2B75, 0x6A5B, 0x2B72, 0x6A5D, 0x2B6F,
+ 0x6A5E, 0x2B82, 0x6A5F, 0x12DA, 0x6A60, 0x2B80, 0x6A61, 0x12D6,
+ 0x6A62, 0x12D5, 0x6A64, 0x2B7A, 0x6A66, 0x2B69, 0x6A67, 0x2B6B,
+ 0x6A68, 0x2B6D, 0x6A69, 0x2B7F, 0x6A6A, 0x2B79, 0x6A6B, 0x12D1,
+ 0x6A6D, 0x2B70, 0x6A6F, 0x2B7E, 0x6A76, 0x2B71, 0x6A7E, 0x13EC,
+ 0x6A7F, 0x2D84, 0x6A80, 0x13E5, 0x6A81, 0x2D75, 0x6A83, 0x2D80,
+ 0x6A84, 0x13E7, 0x6A85, 0x2D87, 0x6A87, 0x2D7C, 0x6A89, 0x2D77,
+ 0x6A8C, 0x2D88, 0x6A8D, 0x2D73, 0x6A8E, 0x2D7E, 0x6A90, 0x13EE,
+ 0x6A91, 0x2D83, 0x6A92, 0x2D89, 0x6A93, 0x2D7D, 0x6A94, 0x13E6,
+ 0x6A95, 0x2D7F, 0x6A96, 0x2D74, 0x6A97, 0x13ED, 0x6A9A, 0x2D86,
+ 0x6A9B, 0x2D79, 0x6A9C, 0x13E9, 0x6A9E, 0x2D7B, 0x6A9F, 0x2D78,
+ 0x6AA0, 0x13EF, 0x6AA1, 0x2D7A, 0x6AA2, 0x13E8, 0x6AA3, 0x13EB,
+ 0x6AA4, 0x2D82, 0x6AA5, 0x2D76, 0x6AA6, 0x2D85, 0x6AA8, 0x2D81,
+ 0x6AAC, 0x14DD, 0x6AAD, 0x2F3E, 0x6AAE, 0x14E2, 0x6AAF, 0x14E3,
+ 0x6AB3, 0x14DC, 0x6AB4, 0x2F3D, 0x6AB6, 0x2F3A, 0x6AB7, 0x2F3B,
+ 0x6AB8, 0x14E0, 0x6AB9, 0x2F35, 0x6ABA, 0x2F39, 0x6ABB, 0x14DF,
+ 0x6ABD, 0x2F36, 0x6AC2, 0x14E1, 0x6AC3, 0x14DE, 0x6AC5, 0x2F34,
+ 0x6AC6, 0x2F38, 0x6AC7, 0x2F3C, 0x6ACB, 0x309F, 0x6ACC, 0x309C,
+ 0x6ACD, 0x30A5, 0x6ACF, 0x30A4, 0x6AD0, 0x30A2, 0x6AD1, 0x309D,
+ 0x6AD3, 0x1589, 0x6AD9, 0x309E, 0x6ADA, 0x1588, 0x6ADB, 0x13EA,
+ 0x6ADC, 0x30A1, 0x6ADD, 0x1587, 0x6ADE, 0x30A6, 0x6ADF, 0x30A0,
+ 0x6AE0, 0x309B, 0x6AE1, 0x2F37, 0x6AE5, 0x1586, 0x6AE7, 0x309A,
+ 0x6AE8, 0x31DF, 0x6AEA, 0x31DE, 0x6AEB, 0x30A3, 0x6AEC, 0x161B,
+ 0x6AEE, 0x31E2, 0x6AEF, 0x31E3, 0x6AF0, 0x31DD, 0x6AF1, 0x31E1,
+ 0x6AF3, 0x31DC, 0x6AF8, 0x32D6, 0x6AF9, 0x31E0, 0x6AFA, 0x1678,
+ 0x6AFB, 0x1676, 0x6AFC, 0x32D4, 0x6B00, 0x32D7, 0x6B02, 0x32D3,
+ 0x6B03, 0x32D5, 0x6B04, 0x1677, 0x6B08, 0x3386, 0x6B09, 0x3387,
+ 0x6B0A, 0x16C6, 0x6B0B, 0x3385, 0x6B0F, 0x3420, 0x6B10, 0x16FD,
+ 0x6B11, 0x341E, 0x6B12, 0x341F, 0x6B13, 0x3487, 0x6B16, 0x1743,
+ 0x6B17, 0x34CE, 0x6B18, 0x34CC, 0x6B19, 0x34CD, 0x6B1A, 0x34CF,
+ 0x6B1E, 0x3534, 0x6B20, 0x02DE, 0x6B21, 0x03E3, 0x6B23, 0x061A,
+ 0x6B25, 0x19C9, 0x6B28, 0x1B3D, 0x6B2C, 0x1CE6, 0x6B2D, 0x1CE8,
+ 0x6B2F, 0x1CE7, 0x6B31, 0x1CE9, 0x6B32, 0x0AE7, 0x6B33, 0x1F3C,
+ 0x6B34, 0x1CEA, 0x6B36, 0x1F3B, 0x6B37, 0x1F3D, 0x6B38, 0x1F3E,
+ 0x6B39, 0x21B2, 0x6B3A, 0x0C9C, 0x6B3B, 0x21B3, 0x6B3C, 0x21B5,
+ 0x6B3D, 0x0C9D, 0x6B3E, 0x0C9B, 0x6B3F, 0x21B4, 0x6B41, 0x2447,
+ 0x6B42, 0x2445, 0x6B43, 0x2444, 0x6B45, 0x2443, 0x6B46, 0x2442,
+ 0x6B47, 0x0E4A, 0x6B48, 0x2446, 0x6B49, 0x1001, 0x6B4A, 0x26E2,
+ 0x6B4B, 0x26E4, 0x6B4C, 0x1002, 0x6B4D, 0x26E3, 0x6B4E, 0x1185,
+ 0x6B50, 0x1184, 0x6B51, 0x2924, 0x6B54, 0x2B89, 0x6B55, 0x2B88,
+ 0x6B56, 0x2B8A, 0x6B59, 0x12DC, 0x6B5B, 0x2D8A, 0x6B5C, 0x13F0,
+ 0x6B5E, 0x2F3F, 0x6B5F, 0x14E4, 0x6B60, 0x30A7, 0x6B61, 0x16C7,
+ 0x6B62, 0x02DF, 0x6B63, 0x034D, 0x6B64, 0x03E4, 0x6B65, 0x04C9,
+ 0x6B66, 0x061B, 0x6B67, 0x061C, 0x6B6A, 0x0769, 0x6B6D, 0x1CEB,
+ 0x6B72, 0x0E4B, 0x6B76, 0x29A2, 0x6B77, 0x12DD, 0x6B78, 0x14E5,
+ 0x6B79, 0x02E0, 0x6B7B, 0x03E5, 0x6B7E, 0x19CB, 0x6B7F, 0x061D,
+ 0x6B80, 0x19CA, 0x6B82, 0x1B3E, 0x6B83, 0x076A, 0x6B84, 0x1B3F,
+ 0x6B86, 0x076B, 0x6B88, 0x1CED, 0x6B89, 0x0900, 0x6B8A, 0x08FF,
+ 0x6B8C, 0x1F43, 0x6B8D, 0x1F41, 0x6B8E, 0x1F42, 0x6B8F, 0x1F40,
+ 0x6B91, 0x1F3F, 0x6B94, 0x21B6, 0x6B95, 0x21B9, 0x6B96, 0x0C9F,
+ 0x6B97, 0x21B7, 0x6B98, 0x0C9E, 0x6B99, 0x21B8, 0x6B9B, 0x2448,
+ 0x6B9E, 0x26E5, 0x6B9F, 0x26E6, 0x6BA0, 0x26E7, 0x6BA2, 0x2927,
+ 0x6BA3, 0x2926, 0x6BA4, 0x1186, 0x6BA5, 0x2925, 0x6BA6, 0x2928,
+ 0x6BA7, 0x2B8B, 0x6BAA, 0x2B8C, 0x6BAB, 0x2B8D, 0x6BAD, 0x2D8B,
+ 0x6BAE, 0x13F1, 0x6BAF, 0x14E6, 0x6BB0, 0x30A8, 0x6BB2, 0x1679,
+ 0x6BB3, 0x178A, 0x6BB5, 0x076C, 0x6BB6, 0x1B40, 0x6BB7, 0x0901,
+ 0x6BBA, 0x0AE8, 0x6BBC, 0x0CA0, 0x6BBD, 0x21BA, 0x6BBF, 0x0E4D,
+ 0x6BC0, 0x0E4C, 0x6BC3, 0x26E8, 0x6BC4, 0x26E9, 0x6BC5, 0x1187,
+ 0x6BC6, 0x1188, 0x6BC7, 0x2B8F, 0x6BC8, 0x2B8E, 0x6BC9, 0x2F40,
+ 0x6BCA, 0x3421, 0x6BCB, 0x02E1, 0x6BCC, 0x178B, 0x6BCD, 0x034E,
+ 0x6BCF, 0x04CA, 0x6BD0, 0x18AD, 0x6BD2, 0x076D, 0x6BD3, 0x0E4E,
+ 0x6BD4, 0x02E2, 0x6BD6, 0x1B41, 0x6BD7, 0x076E, 0x6BD8, 0x1B42,
+ 0x6BDA, 0x13F2, 0x6BDB, 0x02E3, 0x6BDE, 0x19CC, 0x6BE0, 0x1B43,
+ 0x6BE2, 0x1CF2, 0x6BE3, 0x1CF1, 0x6BE4, 0x1CEF, 0x6BE6, 0x1CEE,
+ 0x6BE7, 0x1CF3, 0x6BE8, 0x1CF0, 0x6BEB, 0x0AE9, 0x6BEC, 0x0AEA,
+ 0x6BEF, 0x0CA1, 0x6BF0, 0x21BB, 0x6BF2, 0x21BC, 0x6BF3, 0x21BD,
+ 0x6BF7, 0x244C, 0x6BF8, 0x244D, 0x6BF9, 0x244B, 0x6BFB, 0x2449,
+ 0x6BFC, 0x244A, 0x6BFD, 0x0E4F, 0x6BFE, 0x26EA, 0x6BFF, 0x292B,
+ 0x6C00, 0x292A, 0x6C01, 0x2929, 0x6C02, 0x292C, 0x6C03, 0x2B91,
+ 0x6C04, 0x2B90, 0x6C05, 0x12DE, 0x6C06, 0x2B92, 0x6C08, 0x13F3,
+ 0x6C09, 0x2D8C, 0x6C0B, 0x2F41, 0x6C0C, 0x30A9, 0x6C0D, 0x3388,
+ 0x6C0F, 0x02E4, 0x6C10, 0x0350, 0x6C11, 0x034F, 0x6C13, 0x061E,
+ 0x6C14, 0x178C, 0x6C15, 0x17AA, 0x6C16, 0x03E6, 0x6C18, 0x1801,
+ 0x6C19, 0x18AE, 0x6C1A, 0x18AF, 0x6C1B, 0x061F, 0x6C1D, 0x19CD,
+ 0x6C1F, 0x076F, 0x6C20, 0x1B44, 0x6C21, 0x1B45, 0x6C23, 0x0902,
+ 0x6C24, 0x0906, 0x6C25, 0x1CF4, 0x6C26, 0x0905, 0x6C27, 0x0903,
+ 0x6C28, 0x0904, 0x6C2A, 0x1F44, 0x6C2B, 0x0AEB, 0x6C2C, 0x0CA4,
+ 0x6C2E, 0x0CA2, 0x6C2F, 0x0CA3, 0x6C30, 0x21BE, 0x6C33, 0x1003,
+ 0x6C34, 0x02E5, 0x6C36, 0x17AB, 0x6C38, 0x0351, 0x6C3B, 0x17AE,
+ 0x6C3E, 0x0354, 0x6C3F, 0x17AD, 0x6C40, 0x0353, 0x6C41, 0x0352,
+ 0x6C42, 0x04CB, 0x6C43, 0x17AC, 0x6C46, 0x1802, 0x6C4A, 0x1806,
+ 0x6C4B, 0x1808, 0x6C4C, 0x1809, 0x6C4D, 0x03F0, 0x6C4E, 0x03F1,
+ 0x6C4F, 0x1805, 0x6C50, 0x03EC, 0x6C52, 0x1803, 0x6C54, 0x1807,
+ 0x6C55, 0x03ED, 0x6C57, 0x03E8, 0x6C59, 0x03E9, 0x6C5B, 0x03EF,
+ 0x6C5C, 0x1804, 0x6C5D, 0x03E7, 0x6C5E, 0x04CC, 0x6C5F, 0x03EA,
+ 0x6C60, 0x03EB, 0x6C61, 0x03EE, 0x6C65, 0x18C0, 0x6C66, 0x18BE,
+ 0x6C67, 0x18B1, 0x6C68, 0x04D8, 0x6C69, 0x18B8, 0x6C6A, 0x04D3,
+ 0x6C6B, 0x18B2, 0x6C6D, 0x18BA, 0x6C6F, 0x18B7, 0x6C70, 0x04D6,
+ 0x6C71, 0x18B6, 0x6C72, 0x04DD, 0x6C73, 0x18BF, 0x6C74, 0x04DF,
+ 0x6C76, 0x04E1, 0x6C78, 0x18B0, 0x6C7A, 0x04D4, 0x6C7B, 0x18C1,
+ 0x6C7D, 0x04DB, 0x6C7E, 0x04DE, 0x6C80, 0x19E4, 0x6C81, 0x04CE,
+ 0x6C82, 0x04E5, 0x6C83, 0x04DC, 0x6C84, 0x18B3, 0x6C85, 0x04D1,
+ 0x6C86, 0x04E0, 0x6C87, 0x18BB, 0x6C88, 0x04CF, 0x6C89, 0x04D0,
+ 0x6C8A, 0x19E2, 0x6C8B, 0x18B4, 0x6C8C, 0x04D7, 0x6C8D, 0x04E2,
+ 0x6C8E, 0x18C2, 0x6C8F, 0x18B5, 0x6C90, 0x04D5, 0x6C92, 0x04DA,
+ 0x6C93, 0x19CE, 0x6C94, 0x04E3, 0x6C95, 0x18BC, 0x6C96, 0x04D9,
+ 0x6C98, 0x04E4, 0x6C99, 0x04CD, 0x6C9A, 0x18B9, 0x6C9B, 0x04D2,
+ 0x6C9C, 0x18BD, 0x6C9D, 0x19E3, 0x6CAB, 0x062B, 0x6CAC, 0x063B,
+ 0x6CAD, 0x19D5, 0x6CAE, 0x0632, 0x6CB0, 0x19EA, 0x6CB1, 0x0623,
+ 0x6CB3, 0x0626, 0x6CB4, 0x19E1, 0x6CB6, 0x19D3, 0x6CB7, 0x19D7,
+ 0x6CB8, 0x062E, 0x6CB9, 0x0630, 0x6CBA, 0x19DA, 0x6CBB, 0x0637,
+ 0x6CBC, 0x0629, 0x6CBD, 0x0627, 0x6CBE, 0x0628, 0x6CBF, 0x0636,
+ 0x6CC0, 0x19E6, 0x6CC1, 0x0631, 0x6CC2, 0x19D9, 0x6CC3, 0x19DB,
+ 0x6CC4, 0x062F, 0x6CC5, 0x0634, 0x6CC6, 0x19DC, 0x6CC7, 0x19E9,
+ 0x6CC9, 0x0770, 0x6CCA, 0x063A, 0x6CCC, 0x0624, 0x6CCD, 0x19E8,
+ 0x6CCF, 0x19EC, 0x6CD0, 0x19D8, 0x6CD1, 0x19EE, 0x6CD2, 0x19DF,
+ 0x6CD3, 0x062D, 0x6CD4, 0x19D4, 0x6CD5, 0x062C, 0x6CD6, 0x063E,
+ 0x6CD7, 0x0633, 0x6CD9, 0x19D2, 0x6CDA, 0x1B4E, 0x6CDB, 0x0639,
+ 0x6CDC, 0x063D, 0x6CDD, 0x19E0, 0x6CDE, 0x19E5, 0x6CE0, 0x063F,
+ 0x6CE1, 0x0638, 0x6CE2, 0x062A, 0x6CE3, 0x0620, 0x6CE5, 0x0625,
+ 0x6CE7, 0x19D6, 0x6CE8, 0x0621, 0x6CE9, 0x19ED, 0x6CEB, 0x19D0,
+ 0x6CEC, 0x19CF, 0x6CED, 0x19DD, 0x6CEE, 0x19D1, 0x6CEF, 0x063C,
+ 0x6CF0, 0x0907, 0x6CF1, 0x0635, 0x6CF2, 0x19DE, 0x6CF3, 0x0622,
+ 0x6CF5, 0x077F, 0x6CF9, 0x19EB, 0x6D00, 0x1B55, 0x6D01, 0x1B58,
+ 0x6D03, 0x1B5B, 0x6D04, 0x1B50, 0x6D07, 0x1B5E, 0x6D08, 0x1B61,
+ 0x6D09, 0x1B63, 0x6D0A, 0x1B4D, 0x6D0B, 0x0771, 0x6D0C, 0x0776,
+ 0x6D0D, 0x1CF9, 0x6D0E, 0x0786, 0x6D0F, 0x1B5C, 0x6D10, 0x1B64,
+ 0x6D11, 0x1B54, 0x6D12, 0x1B4C, 0x6D16, 0x1D14, 0x6D17, 0x0779,
+ 0x6D18, 0x1B59, 0x6D19, 0x1B51, 0x6D1A, 0x1B53, 0x6D1B, 0x077E,
+ 0x6D1D, 0x1B56, 0x6D1E, 0x0778, 0x6D1F, 0x1B49, 0x6D20, 0x1B5F,
+ 0x6D22, 0x1B62, 0x6D25, 0x0775, 0x6D27, 0x0781, 0x6D28, 0x1B46,
+ 0x6D29, 0x0783, 0x6D2A, 0x0773, 0x6D2B, 0x0787, 0x6D2C, 0x1B60,
+ 0x6D2D, 0x1B48, 0x6D2E, 0x0784, 0x6D2F, 0x1D0E, 0x6D30, 0x19E7,
+ 0x6D31, 0x0777, 0x6D32, 0x0772, 0x6D33, 0x1B4F, 0x6D34, 0x1B47,
+ 0x6D35, 0x0785, 0x6D36, 0x077D, 0x6D37, 0x1B5A, 0x6D38, 0x0782,
+ 0x6D39, 0x0780, 0x6D3A, 0x1B52, 0x6D3B, 0x077A, 0x6D3C, 0x1B4A,
+ 0x6D3D, 0x077B, 0x6D3E, 0x077C, 0x6D3F, 0x1B4B, 0x6D40, 0x1B5D,
+ 0x6D41, 0x0774, 0x6D42, 0x1B57, 0x6D58, 0x1CFC, 0x6D59, 0x090F,
+ 0x6D5A, 0x0914, 0x6D5E, 0x1D05, 0x6D5F, 0x1D0B, 0x6D60, 0x1D07,
+ 0x6D61, 0x1CFA, 0x6D62, 0x1CFD, 0x6D63, 0x1CF6, 0x6D64, 0x1CF7,
+ 0x6D65, 0x091B, 0x6D66, 0x090C, 0x6D67, 0x1D06, 0x6D68, 0x1D0F,
+ 0x6D69, 0x0916, 0x6D6A, 0x0908, 0x6D6C, 0x0911, 0x6D6D, 0x1CFE,
+ 0x6D6E, 0x0913, 0x6D6F, 0x1CFF, 0x6D70, 0x1D09, 0x6D74, 0x0915,
+ 0x6D75, 0x1D18, 0x6D76, 0x1CF8, 0x6D77, 0x090E, 0x6D78, 0x090D,
+ 0x6D79, 0x0919, 0x6D7A, 0x1CF5, 0x6D7B, 0x1D16, 0x6D7C, 0x1D0A,
+ 0x6D7D, 0x1D17, 0x6D7E, 0x1D11, 0x6D7F, 0x1D03, 0x6D80, 0x1D12,
+ 0x6D82, 0x1D0C, 0x6D83, 0x1D15, 0x6D84, 0x1D13, 0x6D85, 0x091A,
+ 0x6D86, 0x1D04, 0x6D87, 0x090B, 0x6D88, 0x090A, 0x6D89, 0x0912,
+ 0x6D8A, 0x0918, 0x6D8B, 0x1D10, 0x6D8C, 0x0917, 0x6D8D, 0x1D01,
+ 0x6D8E, 0x0AEC, 0x6D90, 0x1D19, 0x6D91, 0x1D00, 0x6D92, 0x1CFB,
+ 0x6D93, 0x0910, 0x6D94, 0x091C, 0x6D95, 0x0909, 0x6D97, 0x1D08,
+ 0x6D98, 0x1D0D, 0x6DAA, 0x0B0E, 0x6DAB, 0x1F46, 0x6DAC, 0x1F4A,
+ 0x6DAE, 0x0AFB, 0x6DAF, 0x0AF9, 0x6DB2, 0x0AF0, 0x6DB3, 0x1F48,
+ 0x6DB4, 0x1F47, 0x6DB5, 0x0B04, 0x6DB7, 0x1F4D, 0x6DB8, 0x0AFE,
+ 0x6DBA, 0x1F5F, 0x6DBB, 0x1F6B, 0x6DBC, 0x0AED, 0x6DBD, 0x1F5C,
+ 0x6DBE, 0x1F55, 0x6DBF, 0x0B10, 0x6DC0, 0x1F45, 0x6DC2, 0x1F61,
+ 0x6DC4, 0x0B0D, 0x6DC5, 0x0B01, 0x6DC6, 0x0B0C, 0x6DC7, 0x0AF7,
+ 0x6DC8, 0x1F51, 0x6DC9, 0x1F63, 0x6DCA, 0x1F5B, 0x6DCB, 0x0AF8,
+ 0x6DCC, 0x0AF2, 0x6DCD, 0x1F69, 0x6DCF, 0x1F62, 0x6DD0, 0x1F64,
+ 0x6DD1, 0x0AFA, 0x6DD2, 0x0B02, 0x6DD3, 0x1F66, 0x6DD4, 0x1F4F,
+ 0x6DD5, 0x1F60, 0x6DD6, 0x1F54, 0x6DD7, 0x1F68, 0x6DD8, 0x0B07,
+ 0x6DD9, 0x0AEF, 0x6DDA, 0x0B05, 0x6DDB, 0x1F59, 0x6DDC, 0x1F57,
+ 0x6DDD, 0x1F58, 0x6DDE, 0x0AFC, 0x6DDF, 0x1F53, 0x6DE0, 0x1F52,
+ 0x6DE1, 0x0AF1, 0x6DE2, 0x1F4C, 0x6DE3, 0x1F6A, 0x6DE4, 0x0AF3,
+ 0x6DE5, 0x1F56, 0x6DE6, 0x0B11, 0x6DE8, 0x0B0B, 0x6DE9, 0x1F4B,
+ 0x6DEA, 0x0B08, 0x6DEB, 0x0B06, 0x6DEC, 0x0B0F, 0x6DED, 0x1F5D,
+ 0x6DEE, 0x0B0A, 0x6DEF, 0x1D02, 0x6DF0, 0x1F5E, 0x6DF1, 0x0B09,
+ 0x6DF2, 0x1F65, 0x6DF3, 0x0AEE, 0x6DF4, 0x1F5A, 0x6DF5, 0x0B00,
+ 0x6DF6, 0x1F4E, 0x6DF7, 0x0AFF, 0x6DF9, 0x0AFD, 0x6DFA, 0x0AF5,
+ 0x6DFB, 0x0AF4, 0x6DFC, 0x21BF, 0x6DFD, 0x1F67, 0x6E00, 0x1F50,
+ 0x6E03, 0x21D4, 0x6E05, 0x0AF6, 0x6E19, 0x0CC1, 0x6E1A, 0x0B03,
+ 0x6E1B, 0x0CAF, 0x6E1C, 0x21CE, 0x6E1D, 0x0CBD, 0x6E1F, 0x21C2,
+ 0x6E20, 0x0CAC, 0x6E21, 0x0CA8, 0x6E22, 0x21E0, 0x6E23, 0x0CAE,
+ 0x6E24, 0x0CB2, 0x6E25, 0x0CAD, 0x6E26, 0x0CB6, 0x6E27, 0x21E4,
+ 0x6E28, 0x21DB, 0x6E2B, 0x21C9, 0x6E2C, 0x0CBB, 0x6E2D, 0x0CB5,
+ 0x6E2E, 0x21D5, 0x6E2F, 0x0CA5, 0x6E30, 0x21E1, 0x6E31, 0x21DA,
+ 0x6E32, 0x0CA9, 0x6E33, 0x21CF, 0x6E34, 0x0CB8, 0x6E35, 0x21EC,
+ 0x6E36, 0x21ED, 0x6E38, 0x0CA6, 0x6E39, 0x21DF, 0x6E3A, 0x0CBA,
+ 0x6E3B, 0x21D3, 0x6E3C, 0x21C5, 0x6E3D, 0x21C6, 0x6E3E, 0x0CBE,
+ 0x6E3F, 0x21CA, 0x6E40, 0x21D1, 0x6E41, 0x21CB, 0x6E43, 0x0CBC,
+ 0x6E44, 0x0CC4, 0x6E45, 0x21C7, 0x6E46, 0x21C0, 0x6E47, 0x21C1,
+ 0x6E49, 0x21C3, 0x6E4A, 0x0CAB, 0x6E4B, 0x21D0, 0x6E4D, 0x0CB9,
+ 0x6E4E, 0x0CC2, 0x6E51, 0x21D2, 0x6E52, 0x21EA, 0x6E53, 0x21E2,
+ 0x6E54, 0x0CA7, 0x6E55, 0x21E8, 0x6E56, 0x0CB3, 0x6E58, 0x0CB1,
+ 0x6E5A, 0x21EE, 0x6E5B, 0x0CB0, 0x6E5C, 0x21D8, 0x6E5D, 0x21CC,
+ 0x6E5E, 0x21D6, 0x6E5F, 0x0CC7, 0x6E60, 0x21DC, 0x6E61, 0x21D9,
+ 0x6E62, 0x21C8, 0x6E63, 0x0CC3, 0x6E64, 0x21E6, 0x6E65, 0x21E3,
+ 0x6E66, 0x21EB, 0x6E67, 0x0CAA, 0x6E68, 0x21D7, 0x6E69, 0x0CC6,
+ 0x6E6B, 0x21DE, 0x6E6E, 0x0CB4, 0x6E6F, 0x0CB7, 0x6E71, 0x21DD,
+ 0x6E72, 0x0CC5, 0x6E73, 0x21CD, 0x6E74, 0x1F49, 0x6E77, 0x21E7,
+ 0x6E78, 0x21E5, 0x6E79, 0x21E9, 0x6E88, 0x21C4, 0x6E89, 0x0CC0,
+ 0x6E8D, 0x246C, 0x6E8E, 0x246B, 0x6E8F, 0x2451, 0x6E90, 0x0E55,
+ 0x6E92, 0x246A, 0x6E93, 0x2454, 0x6E94, 0x2455, 0x6E96, 0x0E5F,
+ 0x6E97, 0x2473, 0x6E98, 0x0E5A, 0x6E99, 0x2469, 0x6E9B, 0x244E,
+ 0x6E9C, 0x0E60, 0x6E9D, 0x0E56, 0x6E9E, 0x245D, 0x6E9F, 0x2453,
+ 0x6EA0, 0x2456, 0x6EA1, 0x246E, 0x6EA2, 0x0E50, 0x6EA3, 0x2475,
+ 0x6EA4, 0x246D, 0x6EA5, 0x0E59, 0x6EA6, 0x2462, 0x6EA7, 0x0E64,
+ 0x6EAA, 0x0E63, 0x6EAB, 0x0E5D, 0x6EAE, 0x2474, 0x6EAF, 0x0E51,
+ 0x6EB0, 0x2460, 0x6EB1, 0x2457, 0x6EB2, 0x2464, 0x6EB3, 0x2470,
+ 0x6EB4, 0x0E65, 0x6EB6, 0x0E53, 0x6EB7, 0x245F, 0x6EB9, 0x2458,
+ 0x6EBA, 0x0E5C, 0x6EBC, 0x0E5B, 0x6EBD, 0x245B, 0x6EBE, 0x2465,
+ 0x6EBF, 0x246F, 0x6EC0, 0x2452, 0x6EC1, 0x245C, 0x6EC2, 0x0E54,
+ 0x6EC3, 0x2466, 0x6EC4, 0x0E61, 0x6EC5, 0x0E58, 0x6EC6, 0x2459,
+ 0x6EC7, 0x0E57, 0x6EC8, 0x2450, 0x6EC9, 0x245E, 0x6ECA, 0x2472,
+ 0x6ECB, 0x0CBF, 0x6ECC, 0x101F, 0x6ECD, 0x2461, 0x6ECE, 0x26EB,
+ 0x6ECF, 0x2463, 0x6ED0, 0x2471, 0x6ED1, 0x0E5E, 0x6ED2, 0x245A,
+ 0x6ED3, 0x0E52, 0x6ED4, 0x0E62, 0x6ED5, 0x119A, 0x6ED6, 0x244F,
+ 0x6ED8, 0x2468, 0x6EDC, 0x2467, 0x6EEB, 0x2707, 0x6EEC, 0x101C,
+ 0x6EED, 0x26FC, 0x6EEE, 0x2701, 0x6EEF, 0x1011, 0x6EF1, 0x26ED,
+ 0x6EF2, 0x101E, 0x6EF4, 0x1008, 0x6EF5, 0x26EC, 0x6EF6, 0x270D,
+ 0x6EF7, 0x1020, 0x6EF8, 0x26F0, 0x6EF9, 0x2700, 0x6EFB, 0x26F2,
+ 0x6EFC, 0x2710, 0x6EFD, 0x270C, 0x6EFE, 0x1006, 0x6EFF, 0x1010,
+ 0x6F00, 0x2946, 0x6F01, 0x101D, 0x6F02, 0x100E, 0x6F03, 0x26EE,
+ 0x6F05, 0x270B, 0x6F06, 0x1012, 0x6F07, 0x2708, 0x6F08, 0x2715,
+ 0x6F09, 0x26F4, 0x6F0A, 0x26FD, 0x6F0D, 0x2713, 0x6F0E, 0x2709,
+ 0x6F0F, 0x100D, 0x6F12, 0x26FB, 0x6F13, 0x1007, 0x6F14, 0x1005,
+ 0x6F15, 0x1017, 0x6F18, 0x26F9, 0x6F19, 0x26F6, 0x6F1A, 0x26F7,
+ 0x6F1C, 0x270F, 0x6F1E, 0x2714, 0x6F1F, 0x2712, 0x6F20, 0x100B,
+ 0x6F21, 0x2716, 0x6F22, 0x100F, 0x6F23, 0x1016, 0x6F25, 0x26EF,
+ 0x6F26, 0x292E, 0x6F27, 0x26F8, 0x6F29, 0x1009, 0x6F2A, 0x101B,
+ 0x6F2B, 0x1018, 0x6F2C, 0x100C, 0x6F2D, 0x2702, 0x6F2E, 0x26F3,
+ 0x6F2F, 0x1019, 0x6F30, 0x2704, 0x6F31, 0x1013, 0x6F32, 0x1015,
+ 0x6F33, 0x1004, 0x6F35, 0x2706, 0x6F36, 0x26FE, 0x6F37, 0x26F1,
+ 0x6F38, 0x1014, 0x6F39, 0x270E, 0x6F3A, 0x2711, 0x6F3B, 0x26FA,
+ 0x6F3C, 0x2705, 0x6F3E, 0x100A, 0x6F3F, 0x1189, 0x6F40, 0x2703,
+ 0x6F41, 0x292D, 0x6F43, 0x270A, 0x6F4E, 0x26F5, 0x6F4F, 0x2937,
+ 0x6F50, 0x2941, 0x6F51, 0x118C, 0x6F52, 0x2940, 0x6F53, 0x294C,
+ 0x6F54, 0x118E, 0x6F55, 0x293E, 0x6F57, 0x2942, 0x6F58, 0x1199,
+ 0x6F5A, 0x2939, 0x6F5B, 0x1191, 0x6F5D, 0x2945, 0x6F5E, 0x2B9A,
+ 0x6F5F, 0x119D, 0x6F60, 0x119C, 0x6F61, 0x2947, 0x6F62, 0x2936,
+ 0x6F63, 0x2951, 0x6F64, 0x1197, 0x6F66, 0x118D, 0x6F67, 0x294A,
+ 0x6F69, 0x294E, 0x6F6A, 0x2953, 0x6F6B, 0x2948, 0x6F6C, 0x293C,
+ 0x6F6D, 0x1190, 0x6F6E, 0x1193, 0x6F6F, 0x119B, 0x6F70, 0x1196,
+ 0x6F72, 0x293F, 0x6F73, 0x26FF, 0x6F76, 0x293B, 0x6F77, 0x2952,
+ 0x6F78, 0x1192, 0x6F7A, 0x1195, 0x6F7B, 0x2954, 0x6F7C, 0x118A,
+ 0x6F7D, 0x2949, 0x6F7E, 0x292F, 0x6F7F, 0x294F, 0x6F80, 0x13FC,
+ 0x6F82, 0x293D, 0x6F84, 0x118B, 0x6F85, 0x2938, 0x6F86, 0x118F,
+ 0x6F87, 0x2930, 0x6F88, 0x101A, 0x6F89, 0x2934, 0x6F8B, 0x294D,
+ 0x6F8C, 0x2935, 0x6F8D, 0x2933, 0x6F8E, 0x1194, 0x6F90, 0x294B,
+ 0x6F92, 0x2932, 0x6F93, 0x2944, 0x6F94, 0x2943, 0x6F95, 0x2950,
+ 0x6F96, 0x293A, 0x6F97, 0x1198, 0x6F9E, 0x2B9D, 0x6FA0, 0x12EB,
+ 0x6FA1, 0x12E1, 0x6FA2, 0x2BA9, 0x6FA3, 0x2B95, 0x6FA4, 0x12E3,
+ 0x6FA5, 0x2BA1, 0x6FA6, 0x12EA, 0x6FA7, 0x12E5, 0x6FA8, 0x2B9F,
+ 0x6FA9, 0x2D8E, 0x6FAA, 0x2BA5, 0x6FAB, 0x2BAB, 0x6FAC, 0x2BA4,
+ 0x6FAD, 0x2B93, 0x6FAE, 0x2BA2, 0x6FAF, 0x2BAD, 0x6FB0, 0x2BAF,
+ 0x6FB1, 0x12E0, 0x6FB2, 0x2BAE, 0x6FB3, 0x12E6, 0x6FB4, 0x12EC,
+ 0x6FB6, 0x12E9, 0x6FB8, 0x2BA8, 0x6FB9, 0x12E8, 0x6FBA, 0x2BA3,
+ 0x6FBC, 0x2B97, 0x6FBD, 0x2B9C, 0x6FBF, 0x2BA7, 0x6FC0, 0x12E7,
+ 0x6FC1, 0x12E4, 0x6FC2, 0x12DF, 0x6FC3, 0x12E2, 0x6FC4, 0x2B9B,
+ 0x6FC6, 0x2931, 0x6FC7, 0x2B96, 0x6FC8, 0x2B99, 0x6FC9, 0x2BAA,
+ 0x6FCA, 0x2B9E, 0x6FCB, 0x2B94, 0x6FCC, 0x2D8D, 0x6FCD, 0x2BAC,
+ 0x6FCE, 0x2B98, 0x6FCF, 0x2BA6, 0x6FD4, 0x2D90, 0x6FD5, 0x1400,
+ 0x6FD8, 0x13F4, 0x6FDB, 0x13F8, 0x6FDC, 0x2D92, 0x6FDD, 0x2D98,
+ 0x6FDE, 0x2D96, 0x6FDF, 0x13F6, 0x6FE0, 0x13F7, 0x6FE1, 0x13FE,
+ 0x6FE2, 0x2D99, 0x6FE3, 0x2D91, 0x6FE4, 0x13F9, 0x6FE6, 0x2D95,
+ 0x6FE7, 0x2D94, 0x6FE8, 0x2D9A, 0x6FE9, 0x13FF, 0x6FEB, 0x13FA,
+ 0x6FEC, 0x13FD, 0x6FED, 0x2D93, 0x6FEE, 0x1401, 0x6FEF, 0x13FB,
+ 0x6FF0, 0x1402, 0x6FF1, 0x13F5, 0x6FF2, 0x2D97, 0x6FF4, 0x2D8F,
+ 0x6FF7, 0x2F4E, 0x6FFA, 0x14EB, 0x6FFB, 0x2F4B, 0x6FFC, 0x2F4D,
+ 0x6FFE, 0x14E9, 0x6FFF, 0x2F49, 0x7000, 0x2F4A, 0x7001, 0x2F45,
+ 0x7004, 0x2BA0, 0x7005, 0x2F46, 0x7006, 0x14EA, 0x7007, 0x2F42,
+ 0x7009, 0x14E7, 0x700A, 0x2F4F, 0x700B, 0x14E8, 0x700C, 0x2F43,
+ 0x700D, 0x2F44, 0x700E, 0x2F48, 0x700F, 0x14ED, 0x7011, 0x14EC,
+ 0x7014, 0x2F47, 0x7015, 0x158F, 0x7016, 0x30AD, 0x7017, 0x30B3,
+ 0x7018, 0x1590, 0x7019, 0x30AA, 0x701A, 0x158D, 0x701B, 0x158A,
+ 0x701C, 0x30B5, 0x701D, 0x158E, 0x701F, 0x158B, 0x7020, 0x30AC,
+ 0x7021, 0x30AF, 0x7022, 0x30B0, 0x7023, 0x30B1, 0x7024, 0x30B4,
+ 0x7026, 0x2F4C, 0x7027, 0x30AB, 0x7028, 0x158C, 0x7029, 0x30B2,
+ 0x702A, 0x31EF, 0x702B, 0x30AE, 0x702F, 0x31E6, 0x7030, 0x161D,
+ 0x7031, 0x31E9, 0x7032, 0x161E, 0x7033, 0x31F2, 0x7034, 0x31E8,
+ 0x7035, 0x31E5, 0x7037, 0x31E7, 0x7038, 0x31EB, 0x7039, 0x31EE,
+ 0x703A, 0x31ED, 0x703B, 0x31F1, 0x703C, 0x31E4, 0x703E, 0x161C,
+ 0x703F, 0x31EC, 0x7040, 0x31F0, 0x7041, 0x31F3, 0x7042, 0x31EA,
+ 0x7043, 0x32D8, 0x7044, 0x32D9, 0x7045, 0x32DD, 0x7046, 0x32DE,
+ 0x7048, 0x32DB, 0x7049, 0x32DC, 0x704A, 0x32DA, 0x704C, 0x167A,
+ 0x7051, 0x16C8, 0x7052, 0x338C, 0x7055, 0x3389, 0x7056, 0x338A,
+ 0x7057, 0x338B, 0x7058, 0x16C9, 0x705A, 0x3423, 0x705B, 0x3422,
+ 0x705D, 0x348A, 0x705E, 0x1722, 0x705F, 0x3488, 0x7060, 0x348B,
+ 0x7061, 0x3489, 0x7062, 0x34D0, 0x7063, 0x1744, 0x7064, 0x1752,
+ 0x7065, 0x351C, 0x7066, 0x3506, 0x7068, 0x351B, 0x7069, 0x3547,
+ 0x706A, 0x3548, 0x706B, 0x02E6, 0x7070, 0x03F2, 0x7071, 0x180A,
+ 0x7074, 0x18C3, 0x7076, 0x04E6, 0x7078, 0x04E9, 0x707A, 0x18C4,
+ 0x707C, 0x04E7, 0x707D, 0x04E8, 0x7082, 0x19F7, 0x7083, 0x19F9,
+ 0x7084, 0x19F4, 0x7085, 0x19F1, 0x7086, 0x19F3, 0x708A, 0x0643,
+ 0x708E, 0x0641, 0x7091, 0x19F5, 0x7092, 0x0642, 0x7093, 0x19F2,
+ 0x7094, 0x19EF, 0x7095, 0x0640, 0x7096, 0x19F6, 0x7098, 0x19F0,
+ 0x7099, 0x0644, 0x709A, 0x19F8, 0x709F, 0x1B66, 0x70A1, 0x1B6A,
+ 0x70A4, 0x0790, 0x70A9, 0x1B6D, 0x70AB, 0x0788, 0x70AC, 0x078B,
+ 0x70AD, 0x078D, 0x70AE, 0x078F, 0x70AF, 0x078C, 0x70B0, 0x1B69,
+ 0x70B1, 0x1B68, 0x70B3, 0x078A, 0x70B4, 0x1B6B, 0x70B5, 0x1B6C,
+ 0x70B7, 0x1B65, 0x70B8, 0x078E, 0x70BA, 0x0789, 0x70BE, 0x1B67,
+ 0x70C5, 0x1D27, 0x70C6, 0x1D28, 0x70C7, 0x1D29, 0x70C8, 0x0921,
+ 0x70CA, 0x091D, 0x70CB, 0x1D1E, 0x70CD, 0x1D26, 0x70CE, 0x1D2B,
+ 0x70CF, 0x0922, 0x70D1, 0x1D1C, 0x70D2, 0x1D22, 0x70D3, 0x1D1B,
+ 0x70D4, 0x1D25, 0x70D7, 0x1D21, 0x70D8, 0x091E, 0x70D9, 0x0920,
+ 0x70DA, 0x1D2A, 0x70DC, 0x1D1A, 0x70DD, 0x1D1D, 0x70DE, 0x1D23,
+ 0x70E0, 0x1D24, 0x70E1, 0x1D2C, 0x70E2, 0x1D20, 0x70E4, 0x091F,
+ 0x70EF, 0x0B16, 0x70F0, 0x1F72, 0x70F3, 0x1F74, 0x70F4, 0x1F70,
+ 0x70F6, 0x1F7C, 0x70F7, 0x1F6E, 0x70F8, 0x1F7B, 0x70F9, 0x0B12,
+ 0x70FA, 0x1F6C, 0x70FB, 0x21F2, 0x70FC, 0x1F76, 0x70FD, 0x0B15,
+ 0x70FF, 0x1F77, 0x7100, 0x1F7A, 0x7102, 0x1F7E, 0x7104, 0x1F73,
+ 0x7106, 0x1F78, 0x7109, 0x0B13, 0x710A, 0x0B14, 0x710B, 0x1F7D,
+ 0x710C, 0x1F71, 0x710D, 0x1F6D, 0x710E, 0x1F7F, 0x7110, 0x1F75,
+ 0x7113, 0x1F79, 0x7117, 0x1F6F, 0x7119, 0x0CC8, 0x711A, 0x0CC9,
+ 0x711B, 0x21FC, 0x711C, 0x0CCF, 0x711E, 0x21F0, 0x711F, 0x21F9,
+ 0x7120, 0x21EF, 0x7121, 0x0CCC, 0x7122, 0x21F7, 0x7123, 0x21F5,
+ 0x7125, 0x21F6, 0x7126, 0x0CCA, 0x7128, 0x21FA, 0x712E, 0x21F3,
+ 0x712F, 0x21F1, 0x7130, 0x0CCB, 0x7131, 0x21F4, 0x7132, 0x21F8,
+ 0x7136, 0x0CCD, 0x713A, 0x21FB, 0x7141, 0x247B, 0x7142, 0x2482,
+ 0x7143, 0x2484, 0x7144, 0x248A, 0x7146, 0x0E72, 0x7147, 0x2476,
+ 0x7149, 0x0E6A, 0x714B, 0x2485, 0x714C, 0x0E6F, 0x714D, 0x248B,
+ 0x714E, 0x0E66, 0x7150, 0x2488, 0x7152, 0x2478, 0x7153, 0x2489,
+ 0x7154, 0x2477, 0x7156, 0x0E74, 0x7158, 0x2483, 0x7159, 0x0E67,
+ 0x715A, 0x248C, 0x715C, 0x0E6C, 0x715D, 0x247C, 0x715E, 0x0E71,
+ 0x715F, 0x2487, 0x7160, 0x247A, 0x7161, 0x2481, 0x7162, 0x247D,
+ 0x7163, 0x2479, 0x7164, 0x0E69, 0x7165, 0x0E70, 0x7166, 0x0E6E,
+ 0x7167, 0x0E6B, 0x7168, 0x0E73, 0x7169, 0x0E68, 0x716A, 0x2480,
+ 0x716C, 0x0E6D, 0x716E, 0x0CCE, 0x7170, 0x2486, 0x7172, 0x247E,
+ 0x7178, 0x247F, 0x717B, 0x271E, 0x717D, 0x1023, 0x7180, 0x271A,
+ 0x7181, 0x2720, 0x7182, 0x271C, 0x7184, 0x1025, 0x7185, 0x271B,
+ 0x7186, 0x271F, 0x7187, 0x2717, 0x7189, 0x2719, 0x718A, 0x1024,
+ 0x718F, 0x271D, 0x7190, 0x2718, 0x7192, 0x1026, 0x7194, 0x1021,
+ 0x7197, 0x2721, 0x7199, 0x1022, 0x719A, 0x295A, 0x719B, 0x2957,
+ 0x719C, 0x2963, 0x719D, 0x295D, 0x719E, 0x295F, 0x719F, 0x119E,
+ 0x71A0, 0x2959, 0x71A1, 0x2961, 0x71A4, 0x2960, 0x71A5, 0x295E,
+ 0x71A7, 0x2964, 0x71A8, 0x11A1, 0x71A9, 0x295B, 0x71AA, 0x2962,
+ 0x71AC, 0x119F, 0x71AF, 0x2956, 0x71B0, 0x2958, 0x71B1, 0x11A0,
+ 0x71B2, 0x2955, 0x71B3, 0x2965, 0x71B5, 0x295C, 0x71B8, 0x2BB3,
+ 0x71B9, 0x12F3, 0x71BC, 0x2BBE, 0x71BD, 0x2BBC, 0x71BE, 0x12ED,
+ 0x71BF, 0x2BB2, 0x71C0, 0x2BB5, 0x71C1, 0x2BB6, 0x71C2, 0x2BB1,
+ 0x71C3, 0x12F7, 0x71C4, 0x12F8, 0x71C5, 0x2BB0, 0x71C6, 0x2BBF,
+ 0x71C7, 0x2BBA, 0x71C8, 0x12F1, 0x71C9, 0x12EE, 0x71CA, 0x2BB9,
+ 0x71CB, 0x2BB7, 0x71CE, 0x12F4, 0x71CF, 0x2BBB, 0x71D0, 0x12EF,
+ 0x71D2, 0x12F0, 0x71D4, 0x2BB8, 0x71D5, 0x12F2, 0x71D6, 0x2BB4,
+ 0x71D8, 0x2BBD, 0x71D9, 0x12F5, 0x71DA, 0x2BC0, 0x71DB, 0x2BC1,
+ 0x71DC, 0x12F6, 0x71DF, 0x1404, 0x71E0, 0x140B, 0x71E1, 0x2D9B,
+ 0x71E2, 0x2DA1, 0x71E4, 0x2D9F, 0x71E5, 0x1407, 0x71E6, 0x1406,
+ 0x71E7, 0x1403, 0x71E8, 0x2D9D, 0x71EC, 0x1409, 0x71ED, 0x1408,
+ 0x71EE, 0x1405, 0x71F0, 0x2DA0, 0x71F1, 0x2D9C, 0x71F2, 0x2D9E,
+ 0x71F4, 0x140A, 0x71F8, 0x14F1, 0x71F9, 0x2F52, 0x71FB, 0x14EE,
+ 0x71FC, 0x14EF, 0x71FD, 0x2F54, 0x71FE, 0x14F0, 0x71FF, 0x2F51,
+ 0x7201, 0x2F50, 0x7202, 0x30B9, 0x7203, 0x2F53, 0x7205, 0x30BA,
+ 0x7206, 0x1591, 0x7207, 0x30B8, 0x720A, 0x30B7, 0x720C, 0x30B6,
+ 0x720D, 0x1592, 0x7210, 0x161F, 0x7213, 0x31F4, 0x7214, 0x31F5,
+ 0x7219, 0x32E1, 0x721A, 0x32E0, 0x721B, 0x167B, 0x721D, 0x32DF,
+ 0x721E, 0x338D, 0x721F, 0x338E, 0x7222, 0x3424, 0x7223, 0x348C,
+ 0x7226, 0x34D1, 0x7227, 0x3535, 0x7228, 0x1766, 0x7229, 0x3549,
+ 0x722A, 0x02E7, 0x722C, 0x0645, 0x722D, 0x0646, 0x7230, 0x0791,
+ 0x7235, 0x140C, 0x7236, 0x02E8, 0x7238, 0x0647, 0x7239, 0x0923,
+ 0x723A, 0x0E75, 0x723B, 0x02E9, 0x723D, 0x0B17, 0x723E, 0x1027,
+ 0x723F, 0x178D, 0x7241, 0x1B6E, 0x7242, 0x1D2D, 0x7244, 0x2722,
+ 0x7246, 0x140D, 0x7247, 0x02EA, 0x7248, 0x0648, 0x7249, 0x1B6F,
+ 0x724A, 0x1B70, 0x724B, 0x21FD, 0x724C, 0x0CD0, 0x724F, 0x248D,
+ 0x7252, 0x0E76, 0x7253, 0x2723, 0x7256, 0x11A2, 0x7258, 0x1593,
+ 0x7259, 0x02EB, 0x725A, 0x21FE, 0x725B, 0x02EC, 0x725D, 0x03F4,
+ 0x725E, 0x180B, 0x725F, 0x03F3, 0x7260, 0x04EC, 0x7261, 0x04EB,
+ 0x7262, 0x04EA, 0x7263, 0x18C5, 0x7267, 0x0649, 0x7269, 0x064A,
+ 0x726A, 0x19FA, 0x726C, 0x1B71, 0x726E, 0x1B74, 0x726F, 0x0793,
+ 0x7270, 0x1B72, 0x7272, 0x0792, 0x7273, 0x1B73, 0x7274, 0x0794,
+ 0x7276, 0x1D30, 0x7277, 0x1D2F, 0x7278, 0x1D2E, 0x7279, 0x0924,
+ 0x727B, 0x1F81, 0x727C, 0x1F82, 0x727D, 0x0B18, 0x727E, 0x1F80,
+ 0x727F, 0x1F83, 0x7280, 0x0CD2, 0x7281, 0x0B19, 0x7284, 0x0CD1,
+ 0x7285, 0x2202, 0x7286, 0x2201, 0x7288, 0x21FF, 0x7289, 0x2200,
+ 0x728B, 0x2203, 0x728C, 0x248F, 0x728D, 0x248E, 0x728E, 0x2492,
+ 0x7290, 0x2491, 0x7291, 0x2490, 0x7292, 0x1028, 0x7293, 0x2726,
+ 0x7295, 0x2725, 0x7296, 0x1029, 0x7297, 0x2724, 0x7298, 0x2966,
+ 0x729A, 0x2967, 0x729B, 0x11A3, 0x729D, 0x2BC2, 0x729E, 0x2BC3,
+ 0x72A1, 0x30BF, 0x72A2, 0x1594, 0x72A3, 0x30BE, 0x72A4, 0x30BD,
+ 0x72A5, 0x30BB, 0x72A6, 0x30BC, 0x72A7, 0x167C, 0x72A8, 0x31F6,
+ 0x72A9, 0x338F, 0x72AA, 0x34D2, 0x72AC, 0x02ED, 0x72AE, 0x17AF,
+ 0x72AF, 0x0355, 0x72B0, 0x17B0, 0x72B4, 0x180C, 0x72B5, 0x180D,
+ 0x72BA, 0x18CB, 0x72BD, 0x18C7, 0x72BF, 0x18C6, 0x72C0, 0x064B,
+ 0x72C1, 0x18CA, 0x72C2, 0x04EE, 0x72C3, 0x18C8, 0x72C4, 0x04ED,
+ 0x72C5, 0x18CC, 0x72C6, 0x18C9, 0x72C9, 0x19FE, 0x72CA, 0x1B75,
+ 0x72CB, 0x19FC, 0x72CC, 0x1A03, 0x72CE, 0x064C, 0x72D0, 0x064F,
+ 0x72D1, 0x1A04, 0x72D2, 0x1A00, 0x72D4, 0x1A01, 0x72D6, 0x19FB,
+ 0x72D7, 0x064E, 0x72D8, 0x19FD, 0x72D9, 0x064D, 0x72DA, 0x1A02,
+ 0x72DC, 0x19FF, 0x72DF, 0x1B79, 0x72E0, 0x0796, 0x72E1, 0x0797,
+ 0x72E3, 0x1B7C, 0x72E4, 0x1B76, 0x72E6, 0x1B7B, 0x72E8, 0x1B77,
+ 0x72E9, 0x0795, 0x72EA, 0x1B7A, 0x72EB, 0x1B78, 0x72F3, 0x1D36,
+ 0x72F4, 0x1D33, 0x72F6, 0x1D35, 0x72F7, 0x0929, 0x72F8, 0x0928,
+ 0x72F9, 0x0926, 0x72FA, 0x1D32, 0x72FB, 0x1D37, 0x72FC, 0x0925,
+ 0x72FD, 0x0927, 0x72FE, 0x1D34, 0x72FF, 0x1F8B, 0x7300, 0x1D31,
+ 0x7301, 0x1D38, 0x7307, 0x1F86, 0x7308, 0x1F8A, 0x730A, 0x1F89,
+ 0x730B, 0x2205, 0x730C, 0x2210, 0x730F, 0x1F8C, 0x7311, 0x1F87,
+ 0x7312, 0x2204, 0x7313, 0x0B1D, 0x7316, 0x0B1C, 0x7317, 0x1F85,
+ 0x7318, 0x1F88, 0x7319, 0x0B1E, 0x731B, 0x0B1B, 0x731C, 0x0B1A,
+ 0x731D, 0x1F84, 0x731E, 0x1F8D, 0x7322, 0x2207, 0x7323, 0x220E,
+ 0x7325, 0x0CD4, 0x7326, 0x220D, 0x7327, 0x220A, 0x7329, 0x0CD6,
+ 0x732D, 0x220C, 0x7330, 0x2206, 0x7331, 0x2208, 0x7332, 0x220B,
+ 0x7333, 0x2209, 0x7334, 0x0CD5, 0x7335, 0x220F, 0x7336, 0x0CD3,
+ 0x7337, 0x0E77, 0x733A, 0x2496, 0x733B, 0x2495, 0x733C, 0x2493,
+ 0x733E, 0x0E7A, 0x733F, 0x0E79, 0x7340, 0x2497, 0x7342, 0x2494,
+ 0x7343, 0x2727, 0x7344, 0x102A, 0x7345, 0x0E78, 0x7349, 0x2499,
+ 0x734A, 0x2498, 0x734C, 0x272A, 0x734D, 0x2728, 0x734E, 0x11A4,
+ 0x7350, 0x102B, 0x7351, 0x2729, 0x7352, 0x2969, 0x7357, 0x11A5,
+ 0x7358, 0x2968, 0x7359, 0x2971, 0x735A, 0x2970, 0x735B, 0x296E,
+ 0x735D, 0x296D, 0x735E, 0x296A, 0x735F, 0x296B, 0x7360, 0x296C,
+ 0x7361, 0x296F, 0x7362, 0x2972, 0x7365, 0x2BC8, 0x7366, 0x2BC5,
+ 0x7367, 0x2BC6, 0x7368, 0x12F9, 0x7369, 0x2BC4, 0x736A, 0x2BCA,
+ 0x736B, 0x2BC9, 0x736C, 0x2BC7, 0x736E, 0x2DA3, 0x736F, 0x2DA4,
+ 0x7370, 0x140E, 0x7372, 0x140F, 0x7373, 0x2DA2, 0x7375, 0x14F3,
+ 0x7376, 0x2F55, 0x7377, 0x14F2, 0x7378, 0x1595, 0x737A, 0x1596,
+ 0x737B, 0x1620, 0x737C, 0x31F8, 0x737D, 0x31F7, 0x737E, 0x32E2,
+ 0x737F, 0x3390, 0x7380, 0x16CA, 0x7381, 0x3426, 0x7382, 0x3425,
+ 0x7383, 0x3427, 0x7384, 0x0356, 0x7385, 0x1B7D, 0x7386, 0x092A,
+ 0x7387, 0x0B1F, 0x7388, 0x1F8E, 0x7389, 0x0357, 0x738A, 0x17B1,
+ 0x738B, 0x02EE, 0x738E, 0x180E, 0x7392, 0x18D1, 0x7393, 0x18CF,
+ 0x7394, 0x18D0, 0x7395, 0x18CD, 0x7396, 0x04EF, 0x7397, 0x18CE,
+ 0x739D, 0x1A0C, 0x739F, 0x0652, 0x73A0, 0x1A0A, 0x73A1, 0x1A06,
+ 0x73A2, 0x1A09, 0x73A4, 0x1A05, 0x73A5, 0x0654, 0x73A6, 0x1A08,
+ 0x73A8, 0x0651, 0x73A9, 0x0650, 0x73AB, 0x0653, 0x73AC, 0x1A0B,
+ 0x73AD, 0x1A07, 0x73B2, 0x079B, 0x73B3, 0x079E, 0x73B4, 0x1B85,
+ 0x73B5, 0x1B84, 0x73B6, 0x1B83, 0x73B7, 0x0798, 0x73B8, 0x1B8C,
+ 0x73B9, 0x1B82, 0x73BB, 0x079A, 0x73BC, 0x1D3D, 0x73BE, 0x1B89,
+ 0x73BF, 0x1B87, 0x73C0, 0x079D, 0x73C2, 0x1B7F, 0x73C3, 0x1B8A,
+ 0x73C5, 0x1B81, 0x73C6, 0x1B8B, 0x73C7, 0x1B88, 0x73C8, 0x1B80,
+ 0x73CA, 0x0799, 0x73CB, 0x1B8D, 0x73CC, 0x1B7E, 0x73CD, 0x079C,
+ 0x73D2, 0x1D42, 0x73D3, 0x1D39, 0x73D4, 0x1D44, 0x73D6, 0x1D3C,
+ 0x73D7, 0x1D47, 0x73D8, 0x1D48, 0x73D9, 0x1D3A, 0x73DA, 0x1D46,
+ 0x73DB, 0x1D43, 0x73DC, 0x1D41, 0x73DD, 0x1D45, 0x73DE, 0x0930,
+ 0x73E0, 0x092E, 0x73E3, 0x1D3F, 0x73E5, 0x1D3B, 0x73E7, 0x1D3E,
+ 0x73E8, 0x1D49, 0x73E9, 0x1D40, 0x73EA, 0x092F, 0x73EB, 0x1B86,
+ 0x73ED, 0x092B, 0x73EE, 0x092D, 0x73F4, 0x1F9C, 0x73F5, 0x1F91,
+ 0x73F6, 0x1F8F, 0x73F8, 0x1F90, 0x73FA, 0x1F97, 0x73FC, 0x1F98,
+ 0x73FD, 0x1F94, 0x73FE, 0x0B24, 0x73FF, 0x1F99, 0x7400, 0x1F96,
+ 0x7401, 0x1F93, 0x7403, 0x0B22, 0x7404, 0x1F92, 0x7405, 0x0B20,
+ 0x7406, 0x0B23, 0x7407, 0x1F95, 0x7408, 0x1F9D, 0x7409, 0x092C,
+ 0x740A, 0x0B21, 0x740B, 0x1F9B, 0x740C, 0x1F9A, 0x740D, 0x0B25,
+ 0x7416, 0x2215, 0x741A, 0x2216, 0x741B, 0x0CE0, 0x741D, 0x221C,
+ 0x7420, 0x221E, 0x7421, 0x2217, 0x7422, 0x0CDA, 0x7423, 0x221B,
+ 0x7424, 0x221A, 0x7425, 0x0CDB, 0x7426, 0x0CE1, 0x7428, 0x0CE2,
+ 0x7429, 0x221D, 0x742A, 0x0CD8, 0x742B, 0x2214, 0x742C, 0x2212,
+ 0x742D, 0x2218, 0x742E, 0x2211, 0x742F, 0x0CDF, 0x7430, 0x2213,
+ 0x7431, 0x2219, 0x7432, 0x221F, 0x7433, 0x0CD9, 0x7434, 0x0CDE,
+ 0x7435, 0x0CDC, 0x7436, 0x0CDD, 0x743A, 0x0CD7, 0x743F, 0x0E81,
+ 0x7440, 0x24A0, 0x7441, 0x0E80, 0x7442, 0x24A4, 0x7444, 0x249A,
+ 0x7446, 0x24A5, 0x744A, 0x249B, 0x744B, 0x249C, 0x744D, 0x24A6,
+ 0x744E, 0x24A3, 0x744F, 0x24A1, 0x7450, 0x24A2, 0x7451, 0x249E,
+ 0x7452, 0x249D, 0x7454, 0x24A7, 0x7455, 0x0E7D, 0x7457, 0x249F,
+ 0x7459, 0x0E82, 0x745A, 0x0E7C, 0x745B, 0x0E83, 0x745C, 0x0E84,
+ 0x745E, 0x0E7F, 0x745F, 0x0E7E, 0x7462, 0x272B, 0x7463, 0x102D,
+ 0x7464, 0x102C, 0x7467, 0x2730, 0x7469, 0x11A6, 0x746A, 0x102E,
+ 0x746D, 0x1030, 0x746E, 0x2731, 0x746F, 0x0E7B, 0x7470, 0x102F,
+ 0x7471, 0x272D, 0x7472, 0x272F, 0x7473, 0x272C, 0x7475, 0x272E,
+ 0x7479, 0x297C, 0x747C, 0x297B, 0x747D, 0x2978, 0x747E, 0x11A9,
+ 0x747F, 0x2BCB, 0x7480, 0x11AA, 0x7481, 0x2977, 0x7483, 0x11A8,
+ 0x7485, 0x2979, 0x7486, 0x2976, 0x7487, 0x2973, 0x7488, 0x297A,
+ 0x7489, 0x2974, 0x748A, 0x2975, 0x748B, 0x11A7, 0x7490, 0x2DA8,
+ 0x7492, 0x2BCF, 0x7494, 0x2BCE, 0x7495, 0x2BD0, 0x7497, 0x2DA5,
+ 0x7498, 0x12FC, 0x749A, 0x2BCC, 0x749C, 0x12FA, 0x749E, 0x12FE,
+ 0x749F, 0x12FD, 0x74A0, 0x2BCD, 0x74A1, 0x2BD1, 0x74A3, 0x12FB,
+ 0x74A5, 0x2DAC, 0x74A6, 0x1412, 0x74A7, 0x14F4, 0x74A8, 0x1413,
+ 0x74A9, 0x1410, 0x74AA, 0x2DA9, 0x74AB, 0x2DA7, 0x74AD, 0x2DAA,
+ 0x74AF, 0x2DAD, 0x74B0, 0x1411, 0x74B1, 0x2DAB, 0x74B2, 0x2DA6,
+ 0x74B5, 0x2F58, 0x74B6, 0x2F5B, 0x74B7, 0x30C2, 0x74B8, 0x2F56,
+ 0x74BA, 0x31F9, 0x74BB, 0x2F5C, 0x74BD, 0x1597, 0x74BE, 0x2F5A,
+ 0x74BF, 0x14F5, 0x74C0, 0x2F57, 0x74C1, 0x2F59, 0x74C2, 0x2F5D,
+ 0x74C3, 0x30C3, 0x74C5, 0x30C1, 0x74CA, 0x1598, 0x74CB, 0x30C0,
+ 0x74CF, 0x1621, 0x74D4, 0x167E, 0x74D5, 0x3392, 0x74D6, 0x167D,
+ 0x74D7, 0x3394, 0x74D8, 0x3391, 0x74D9, 0x3393, 0x74DA, 0x16FE,
+ 0x74DB, 0x348D, 0x74DC, 0x0358, 0x74DD, 0x1A0D, 0x74DE, 0x1D4A,
+ 0x74DF, 0x1D4B, 0x74E0, 0x0B26, 0x74E1, 0x24A8, 0x74E2, 0x12FF,
+ 0x74E3, 0x1599, 0x74E4, 0x16CB, 0x74E5, 0x348E, 0x74E6, 0x0359,
+ 0x74E8, 0x1A0E, 0x74E9, 0x0120, 0x74EC, 0x1B8E, 0x74EE, 0x1B8F,
+ 0x74F4, 0x1D4C, 0x74F5, 0x1D4D, 0x74F6, 0x0B27, 0x74F7, 0x0B28,
+ 0x74FB, 0x2220, 0x74FD, 0x24AB, 0x74FE, 0x24AA, 0x74FF, 0x24A9,
+ 0x7500, 0x2732, 0x7502, 0x2733, 0x7503, 0x2734, 0x7504, 0x1031,
+ 0x7507, 0x297E, 0x7508, 0x297D, 0x750B, 0x2BD2, 0x750C, 0x1300,
+ 0x750D, 0x1301, 0x750F, 0x2DB1, 0x7510, 0x2DAE, 0x7511, 0x2DAF,
+ 0x7512, 0x2DB0, 0x7513, 0x2F5F, 0x7514, 0x2F5E, 0x7515, 0x14F6,
+ 0x7516, 0x30C4, 0x7517, 0x32E3, 0x7518, 0x035A, 0x751A, 0x079F,
+ 0x751C, 0x0B29, 0x751D, 0x24AC, 0x751F, 0x035B, 0x7521, 0x1D4E,
+ 0x7522, 0x0B2A, 0x7525, 0x0CE3, 0x7526, 0x0CE4, 0x7528, 0x035C,
+ 0x7529, 0x035D, 0x752A, 0x180F, 0x752B, 0x04F1, 0x752C, 0x04F0,
+ 0x752D, 0x07A0, 0x752E, 0x1B90, 0x752F, 0x2221, 0x7530, 0x035E,
+ 0x7531, 0x035F, 0x7532, 0x0360, 0x7533, 0x0361, 0x7537, 0x04F2,
+ 0x7538, 0x04F3, 0x7539, 0x18D3, 0x753A, 0x18D2, 0x753D, 0x0655,
+ 0x753E, 0x1A11, 0x753F, 0x1A0F, 0x7540, 0x1A10, 0x7547, 0x1B91,
+ 0x7548, 0x1B92, 0x754B, 0x07A4, 0x754C, 0x07A2, 0x754E, 0x07A3,
+ 0x754F, 0x07A1, 0x7554, 0x0931, 0x7559, 0x0935, 0x755A, 0x0934,
+ 0x755B, 0x1D4F, 0x755C, 0x0933, 0x755D, 0x0932, 0x755F, 0x1D50,
+ 0x7562, 0x0B2D, 0x7563, 0x1F9F, 0x7564, 0x1F9E, 0x7565, 0x0B2B,
+ 0x7566, 0x0B2C, 0x756A, 0x0CE6, 0x756B, 0x0CE5, 0x756C, 0x2223,
+ 0x756F, 0x2222, 0x7570, 0x0B2E, 0x7576, 0x0E85, 0x7577, 0x24AE,
+ 0x7578, 0x0E86, 0x7579, 0x24AD, 0x757D, 0x2735, 0x757E, 0x297F,
+ 0x757F, 0x11AB, 0x7580, 0x2BD3, 0x7584, 0x2DB2, 0x7586, 0x159B,
+ 0x7587, 0x159A, 0x758A, 0x16CC, 0x758B, 0x0362, 0x758C, 0x1A12,
+ 0x758F, 0x0B2F, 0x7590, 0x2736, 0x7591, 0x1032, 0x7592, 0x022E,
+ 0x7594, 0x18D4, 0x7595, 0x18D5, 0x7598, 0x1A13, 0x7599, 0x0657,
+ 0x759A, 0x0658, 0x759D, 0x0656, 0x75A2, 0x07A8, 0x75A3, 0x07A9,
+ 0x75A4, 0x07A6, 0x75A5, 0x07A7, 0x75A7, 0x1B93, 0x75AA, 0x1B94,
+ 0x75AB, 0x07A5, 0x75B0, 0x1D51, 0x75B2, 0x0939, 0x75B3, 0x093A,
+ 0x75B5, 0x0B32, 0x75B6, 0x1D57, 0x75B8, 0x093F, 0x75B9, 0x093D,
+ 0x75BA, 0x1D58, 0x75BB, 0x1D53, 0x75BC, 0x093C, 0x75BD, 0x093B,
+ 0x75BE, 0x0936, 0x75BF, 0x1D56, 0x75C0, 0x1D55, 0x75C1, 0x1D52,
+ 0x75C2, 0x093E, 0x75C4, 0x1D54, 0x75C5, 0x0937, 0x75C7, 0x0938,
+ 0x75CA, 0x0B33, 0x75CB, 0x1FA3, 0x75CC, 0x1FA4, 0x75CD, 0x0B34,
+ 0x75CE, 0x1FA0, 0x75CF, 0x1FA2, 0x75D0, 0x1FA6, 0x75D1, 0x1FA5,
+ 0x75D2, 0x1FA1, 0x75D4, 0x0B30, 0x75D5, 0x0B31, 0x75D7, 0x222B,
+ 0x75D8, 0x0CEB, 0x75D9, 0x0CEA, 0x75DA, 0x2225, 0x75DB, 0x0CE8,
+ 0x75DD, 0x2228, 0x75DE, 0x0CEC, 0x75DF, 0x2229, 0x75E0, 0x0CED,
+ 0x75E1, 0x2226, 0x75E2, 0x0CE7, 0x75E3, 0x0CE9, 0x75E4, 0x222A,
+ 0x75E6, 0x2227, 0x75E7, 0x2224, 0x75ED, 0x24BB, 0x75EF, 0x24B0,
+ 0x75F0, 0x0E88, 0x75F1, 0x0E8B, 0x75F2, 0x0E8A, 0x75F3, 0x0E8F,
+ 0x75F4, 0x0E8E, 0x75F5, 0x24BC, 0x75F6, 0x24BA, 0x75F7, 0x24B3,
+ 0x75F8, 0x24B7, 0x75F9, 0x24B6, 0x75FA, 0x0E8C, 0x75FB, 0x24B9,
+ 0x75FC, 0x24B5, 0x75FD, 0x24BD, 0x75FE, 0x24B4, 0x75FF, 0x0E8D,
+ 0x7600, 0x0E87, 0x7601, 0x0E89, 0x7603, 0x24B2, 0x7608, 0x2738,
+ 0x7609, 0x1036, 0x760A, 0x273C, 0x760B, 0x1035, 0x760C, 0x2739,
+ 0x760D, 0x1034, 0x760F, 0x24B1, 0x7610, 0x24B8, 0x7611, 0x273B,
+ 0x7613, 0x1037, 0x7614, 0x273D, 0x7615, 0x273A, 0x7616, 0x2737,
+ 0x7619, 0x2982, 0x761A, 0x2986, 0x761B, 0x2988, 0x761C, 0x2984,
+ 0x761D, 0x2983, 0x761E, 0x2981, 0x761F, 0x11AE, 0x7620, 0x11AC,
+ 0x7621, 0x11B1, 0x7622, 0x11B2, 0x7623, 0x2985, 0x7624, 0x11AF,
+ 0x7625, 0x2980, 0x7626, 0x11B0, 0x7627, 0x1033, 0x7628, 0x2987,
+ 0x7629, 0x11AD, 0x762D, 0x2BD5, 0x762F, 0x2BD4, 0x7630, 0x2BDC,
+ 0x7631, 0x2BD6, 0x7632, 0x2BDB, 0x7633, 0x2BD8, 0x7634, 0x1302,
+ 0x7635, 0x2BDA, 0x7638, 0x1303, 0x763A, 0x1304, 0x763C, 0x2BD9,
+ 0x763D, 0x2BD7, 0x7642, 0x1415, 0x7643, 0x2DB3, 0x7646, 0x1414,
+ 0x7647, 0x2DB6, 0x7648, 0x2DB4, 0x7649, 0x2DB5, 0x764C, 0x1416,
+ 0x7650, 0x2F63, 0x7652, 0x14F9, 0x7653, 0x2F64, 0x7656, 0x14F7,
+ 0x7657, 0x2F65, 0x7658, 0x14F8, 0x7659, 0x2F62, 0x765A, 0x2F66,
+ 0x765C, 0x2F60, 0x765F, 0x159C, 0x7660, 0x30C5, 0x7661, 0x159D,
+ 0x7662, 0x1622, 0x7664, 0x2F61, 0x7665, 0x1623, 0x7669, 0x167F,
+ 0x766A, 0x32E4, 0x766C, 0x16CE, 0x766D, 0x3395, 0x766E, 0x16CD,
+ 0x7670, 0x3428, 0x7671, 0x1723, 0x7672, 0x1724, 0x7675, 0x3543,
+ 0x7676, 0x022F, 0x7678, 0x07AA, 0x7679, 0x1B95, 0x767B, 0x0CEE,
+ 0x767C, 0x0CEF, 0x767D, 0x0363, 0x767E, 0x03F5, 0x767F, 0x1810,
+ 0x7681, 0x18D6, 0x7682, 0x04F4, 0x7684, 0x0659, 0x7686, 0x07AB,
+ 0x7687, 0x07AC, 0x7688, 0x07AD, 0x7689, 0x1FA8, 0x768A, 0x1D59,
+ 0x768B, 0x0940, 0x768E, 0x0B35, 0x768F, 0x1FA7, 0x7692, 0x222D,
+ 0x7693, 0x0CF1, 0x7695, 0x222C, 0x7696, 0x0CF0, 0x7699, 0x24BE,
+ 0x769A, 0x11B3, 0x769B, 0x298C, 0x769C, 0x2989, 0x769D, 0x298A,
+ 0x769E, 0x298B, 0x76A4, 0x2DB7, 0x76A6, 0x2F67, 0x76AA, 0x31FB,
+ 0x76AB, 0x31FA, 0x76AD, 0x3396, 0x76AE, 0x0364, 0x76AF, 0x1A14,
+ 0x76B0, 0x0941, 0x76B4, 0x0CF2, 0x76B5, 0x24BF, 0x76B8, 0x273E,
+ 0x76BA, 0x11B4, 0x76BB, 0x2BDD, 0x76BD, 0x2F68, 0x76BE, 0x31FC,
+ 0x76BF, 0x0365, 0x76C2, 0x065A, 0x76C3, 0x07B0, 0x76C4, 0x1B96,
+ 0x76C5, 0x07B1, 0x76C6, 0x07AF, 0x76C8, 0x07AE, 0x76C9, 0x1D5A,
+ 0x76CA, 0x0942, 0x76CD, 0x0943, 0x76CE, 0x0944, 0x76D2, 0x0B37,
+ 0x76D3, 0x1FA9, 0x76D4, 0x0B36, 0x76DA, 0x222E, 0x76DB, 0x0B38,
+ 0x76DC, 0x0CF3, 0x76DD, 0x24C0, 0x76DE, 0x0E90, 0x76DF, 0x0E91,
+ 0x76E1, 0x1038, 0x76E3, 0x1039, 0x76E4, 0x11B5, 0x76E5, 0x1306,
+ 0x76E6, 0x2BDE, 0x76E7, 0x1305, 0x76E9, 0x2DB8, 0x76EA, 0x1417,
+ 0x76EC, 0x2F69, 0x76ED, 0x31FD, 0x76EE, 0x0366, 0x76EF, 0x04F5,
+ 0x76F0, 0x1A17, 0x76F1, 0x1A16, 0x76F2, 0x065B, 0x76F3, 0x1A15,
+ 0x76F4, 0x065C, 0x76F5, 0x1A18, 0x76F7, 0x1B9C, 0x76F8, 0x07B4,
+ 0x76F9, 0x07B3, 0x76FA, 0x1B9E, 0x76FB, 0x1B9D, 0x76FC, 0x07B8,
+ 0x76FE, 0x07B7, 0x7701, 0x07B2, 0x7703, 0x1B98, 0x7704, 0x1B99,
+ 0x7705, 0x1B9A, 0x7707, 0x07B9, 0x7708, 0x1B97, 0x7709, 0x07B5,
+ 0x770A, 0x1B9B, 0x770B, 0x07B6, 0x7710, 0x1D5D, 0x7711, 0x1D61,
+ 0x7712, 0x1D5F, 0x7713, 0x1D5E, 0x7715, 0x1D62, 0x7719, 0x1D63,
+ 0x771A, 0x1D64, 0x771B, 0x1D5C, 0x771D, 0x1D5B, 0x771F, 0x0946,
+ 0x7720, 0x0947, 0x7722, 0x1D65, 0x7723, 0x1D60, 0x7725, 0x1FB2,
+ 0x7727, 0x1D66, 0x7728, 0x0948, 0x7729, 0x0945, 0x772D, 0x1FAC,
+ 0x772F, 0x1FAB, 0x7731, 0x1FAD, 0x7732, 0x1FAE, 0x7733, 0x1FB0,
+ 0x7734, 0x1FAF, 0x7735, 0x1FB4, 0x7736, 0x0B3C, 0x7737, 0x0B39,
+ 0x7738, 0x0B3D, 0x7739, 0x1FAA, 0x773A, 0x0B3E, 0x773B, 0x1FB3,
+ 0x773C, 0x0B3B, 0x773D, 0x1FB1, 0x773E, 0x0B3A, 0x7744, 0x2231,
+ 0x7745, 0x2233, 0x7746, 0x222F, 0x7747, 0x2230, 0x774A, 0x2234,
+ 0x774B, 0x2236, 0x774C, 0x2237, 0x774D, 0x2232, 0x774E, 0x2235,
+ 0x774F, 0x0CF4, 0x7752, 0x24C4, 0x7754, 0x24C9, 0x7755, 0x24C1,
+ 0x7756, 0x24C5, 0x7759, 0x24CA, 0x775A, 0x24C6, 0x775B, 0x0E92,
+ 0x775C, 0x0E9A, 0x775E, 0x0E95, 0x775F, 0x24C2, 0x7760, 0x24C3,
+ 0x7761, 0x103D, 0x7762, 0x0E9D, 0x7763, 0x0E96, 0x7765, 0x0E9B,
+ 0x7766, 0x0E94, 0x7767, 0x24C8, 0x7768, 0x0E9C, 0x7769, 0x24C7,
+ 0x776A, 0x0E98, 0x776B, 0x0E93, 0x776C, 0x0E99, 0x776D, 0x24CB,
+ 0x776E, 0x2743, 0x776F, 0x2745, 0x7779, 0x0E97, 0x777C, 0x2740,
+ 0x777D, 0x103B, 0x777E, 0x2746, 0x777F, 0x103C, 0x7780, 0x2744,
+ 0x7781, 0x273F, 0x7782, 0x2742, 0x7783, 0x2747, 0x7784, 0x103A,
+ 0x7785, 0x2741, 0x7787, 0x11B7, 0x7788, 0x2990, 0x7789, 0x298F,
+ 0x778B, 0x11BA, 0x778C, 0x11B8, 0x778D, 0x298D, 0x778E, 0x11B6,
+ 0x778F, 0x298E, 0x7791, 0x11B9, 0x7795, 0x2BE6, 0x7797, 0x2BE8,
+ 0x7799, 0x2BE7, 0x779A, 0x2BDF, 0x779B, 0x2BE3, 0x779C, 0x2BE2,
+ 0x779D, 0x2BE0, 0x779E, 0x1308, 0x779F, 0x1309, 0x77A0, 0x1307,
+ 0x77A1, 0x2BE1, 0x77A2, 0x2BE4, 0x77A3, 0x2BE5, 0x77A5, 0x130A,
+ 0x77A7, 0x141C, 0x77A8, 0x2DC0, 0x77AA, 0x1419, 0x77AB, 0x2DBA,
+ 0x77AC, 0x141B, 0x77AD, 0x141D, 0x77B0, 0x141A, 0x77B1, 0x2DBF,
+ 0x77B2, 0x2DBB, 0x77B3, 0x1418, 0x77B4, 0x2DBE, 0x77B5, 0x2DB9,
+ 0x77B6, 0x2DBD, 0x77B7, 0x2DBC, 0x77BA, 0x2F6B, 0x77BB, 0x14FC,
+ 0x77BC, 0x14FD, 0x77BD, 0x14FA, 0x77BF, 0x14FB, 0x77C2, 0x2F6A,
+ 0x77C4, 0x30C8, 0x77C7, 0x159E, 0x77C9, 0x30C6, 0x77CA, 0x30C7,
+ 0x77CC, 0x31FE, 0x77CD, 0x3201, 0x77CE, 0x31FF, 0x77CF, 0x3200,
+ 0x77D0, 0x32E5, 0x77D3, 0x1680, 0x77D4, 0x3429, 0x77D5, 0x348F,
+ 0x77D7, 0x1725, 0x77D8, 0x34D3, 0x77D9, 0x34D4, 0x77DA, 0x1753,
+ 0x77DB, 0x0367, 0x77DC, 0x07BA, 0x77DE, 0x2238, 0x77E0, 0x24CC,
+ 0x77E2, 0x0368, 0x77E3, 0x04F6, 0x77E5, 0x065D, 0x77E7, 0x1B9F,
+ 0x77E8, 0x1BA0, 0x77E9, 0x0949, 0x77EC, 0x2239, 0x77ED, 0x0CF5,
+ 0x77EE, 0x0E9E, 0x77EF, 0x141E, 0x77F0, 0x2DC1, 0x77F1, 0x30C9,
+ 0x77F2, 0x3202, 0x77F3, 0x0369, 0x77F7, 0x1A1E, 0x77F8, 0x1A19,
+ 0x77F9, 0x1A1B, 0x77FA, 0x1A1D, 0x77FB, 0x1A1C, 0x77FC, 0x1A1A,
+ 0x77FD, 0x065E, 0x7802, 0x07BB, 0x7803, 0x1BA9, 0x7805, 0x1BA4,
+ 0x7806, 0x1BA1, 0x7809, 0x1BA8, 0x780C, 0x07BD, 0x780D, 0x07BE,
+ 0x780E, 0x1BA7, 0x780F, 0x1BA6, 0x7810, 0x1BA5, 0x7811, 0x1BA2,
+ 0x7812, 0x1BA3, 0x7813, 0x1BAA, 0x7814, 0x07BC, 0x781D, 0x094D,
+ 0x781F, 0x0953, 0x7820, 0x0952, 0x7821, 0x1D6F, 0x7822, 0x1D69,
+ 0x7823, 0x1D67, 0x7825, 0x0950, 0x7826, 0x1FBB, 0x7827, 0x094B,
+ 0x7828, 0x1D6C, 0x7829, 0x1D70, 0x782A, 0x1D72, 0x782B, 0x1D6E,
+ 0x782C, 0x1D68, 0x782D, 0x0951, 0x782E, 0x1D6D, 0x782F, 0x1D6B,
+ 0x7830, 0x094A, 0x7831, 0x1D73, 0x7832, 0x0954, 0x7833, 0x1D71,
+ 0x7834, 0x094E, 0x7835, 0x1D6A, 0x7837, 0x094F, 0x7838, 0x094C,
+ 0x7843, 0x0B40, 0x7845, 0x1FBC, 0x7848, 0x1FB5, 0x7849, 0x1FB7,
+ 0x784A, 0x1FB9, 0x784C, 0x1FBA, 0x784D, 0x1FB8, 0x784E, 0x0B41,
+ 0x7850, 0x1FBD, 0x7852, 0x1FB6, 0x785C, 0x223D, 0x785D, 0x0CF6,
+ 0x785E, 0x2245, 0x7860, 0x223A, 0x7862, 0x2246, 0x7864, 0x223B,
+ 0x7865, 0x223C, 0x7868, 0x2244, 0x7869, 0x2243, 0x786A, 0x2240,
+ 0x786B, 0x0B3F, 0x786C, 0x0CF7, 0x786D, 0x223E, 0x786E, 0x2241,
+ 0x786F, 0x0CF8, 0x7870, 0x2242, 0x7871, 0x223F, 0x7879, 0x24D7,
+ 0x787B, 0x24DB, 0x787C, 0x0EA5, 0x787E, 0x274D, 0x787F, 0x0EA8,
+ 0x7880, 0x24D9, 0x7881, 0x36E8, 0x7883, 0x24D6, 0x7884, 0x24D1,
+ 0x7885, 0x24D3, 0x7886, 0x24D4, 0x7887, 0x24CD, 0x7889, 0x0EA4,
+ 0x788C, 0x0EA3, 0x788E, 0x0E9F, 0x788F, 0x24D0, 0x7891, 0x0EA6,
+ 0x7893, 0x0EA7, 0x7894, 0x24CF, 0x7895, 0x24D2, 0x7896, 0x24DA,
+ 0x7897, 0x0EA1, 0x7898, 0x0EA2, 0x7899, 0x24D8, 0x789A, 0x24CE,
+ 0x789E, 0x274F, 0x789F, 0x103F, 0x78A0, 0x2751, 0x78A1, 0x24D5,
+ 0x78A2, 0x2753, 0x78A3, 0x1043, 0x78A4, 0x2754, 0x78A5, 0x2750,
+ 0x78A7, 0x1040, 0x78A8, 0x274C, 0x78A9, 0x1042, 0x78AA, 0x2749,
+ 0x78AB, 0x274E, 0x78AC, 0x2752, 0x78AD, 0x274B, 0x78B0, 0x0EA0,
+ 0x78B2, 0x2748, 0x78B3, 0x1041, 0x78B4, 0x274A, 0x78BA, 0x11BD,
+ 0x78BB, 0x2992, 0x78BC, 0x11C1, 0x78BE, 0x11BF, 0x78C1, 0x103E,
+ 0x78C3, 0x2999, 0x78C4, 0x299A, 0x78C5, 0x11BC, 0x78C8, 0x2998,
+ 0x78C9, 0x299B, 0x78CA, 0x11BE, 0x78CB, 0x11BB, 0x78CC, 0x2994,
+ 0x78CD, 0x2991, 0x78CE, 0x2996, 0x78CF, 0x2993, 0x78D0, 0x11C2,
+ 0x78D1, 0x2995, 0x78D4, 0x2997, 0x78D5, 0x11C0, 0x78DA, 0x130C,
+ 0x78DB, 0x2BEF, 0x78DD, 0x2BE9, 0x78DE, 0x2BED, 0x78DF, 0x2BF3,
+ 0x78E0, 0x2BF4, 0x78E1, 0x2BF0, 0x78E2, 0x2BF1, 0x78E3, 0x2BEE,
+ 0x78E5, 0x2BEB, 0x78E7, 0x130E, 0x78E8, 0x130B, 0x78E9, 0x2BEA,
+ 0x78EA, 0x2BEC, 0x78EC, 0x130D, 0x78ED, 0x2BF2, 0x78EF, 0x1422,
+ 0x78F2, 0x2DC8, 0x78F3, 0x2DC2, 0x78F4, 0x1421, 0x78F7, 0x141F,
+ 0x78F9, 0x2DCA, 0x78FA, 0x1420, 0x78FB, 0x2DC5, 0x78FC, 0x2DC6,
+ 0x78FD, 0x2DC3, 0x78FE, 0x2DCB, 0x78FF, 0x2DC7, 0x7901, 0x1423,
+ 0x7902, 0x2DC4, 0x7904, 0x2DCC, 0x7905, 0x2DC9, 0x7909, 0x2F6F,
+ 0x790C, 0x2F6C, 0x790E, 0x14FE, 0x7910, 0x2F70, 0x7911, 0x2F72,
+ 0x7912, 0x2F71, 0x7913, 0x2F6D, 0x7914, 0x2F6E, 0x7917, 0x30CE,
+ 0x7919, 0x159F, 0x791B, 0x30CB, 0x791C, 0x30CD, 0x791D, 0x30CA,
+ 0x791E, 0x30CF, 0x7921, 0x30CC, 0x7923, 0x3204, 0x7924, 0x3207,
+ 0x7925, 0x3203, 0x7926, 0x1624, 0x7927, 0x3205, 0x7928, 0x3206,
+ 0x7929, 0x3208, 0x792A, 0x1625, 0x792B, 0x1627, 0x792C, 0x1626,
+ 0x792D, 0x32E6, 0x792F, 0x32E8, 0x7931, 0x32E7, 0x7935, 0x3397,
+ 0x7938, 0x3490, 0x7939, 0x34D5, 0x793A, 0x036A, 0x793D, 0x18D7,
+ 0x793E, 0x065F, 0x793F, 0x1A20, 0x7940, 0x0660, 0x7941, 0x0661,
+ 0x7942, 0x1A1F, 0x7944, 0x1BAF, 0x7945, 0x1BAE, 0x7946, 0x07BF,
+ 0x7947, 0x07C2, 0x7948, 0x07C1, 0x7949, 0x07C0, 0x794A, 0x1BAB,
+ 0x794B, 0x1BAD, 0x794C, 0x1BAC, 0x794F, 0x1D76, 0x7950, 0x0956,
+ 0x7951, 0x1D7A, 0x7952, 0x1D79, 0x7953, 0x1D78, 0x7954, 0x1D74,
+ 0x7955, 0x0955, 0x7956, 0x0959, 0x7957, 0x095C, 0x795A, 0x095D,
+ 0x795B, 0x1D75, 0x795C, 0x1D77, 0x795D, 0x095B, 0x795E, 0x095A,
+ 0x795F, 0x0958, 0x7960, 0x0957, 0x7961, 0x1FC4, 0x7963, 0x1FC2,
+ 0x7964, 0x1FBE, 0x7965, 0x0B42, 0x7967, 0x1FBF, 0x7968, 0x0B43,
+ 0x7969, 0x1FC0, 0x796A, 0x1FC1, 0x796B, 0x1FC3, 0x796D, 0x0B44,
+ 0x7970, 0x224A, 0x7972, 0x2249, 0x7973, 0x2248, 0x7974, 0x2247,
+ 0x7979, 0x24DF, 0x797A, 0x0EA9, 0x797C, 0x24DC, 0x797D, 0x24DE,
+ 0x797F, 0x0EAA, 0x7981, 0x0EAB, 0x7982, 0x24DD, 0x7988, 0x275D,
+ 0x798A, 0x2756, 0x798B, 0x2757, 0x798D, 0x1046, 0x798E, 0x1044,
+ 0x798F, 0x1045, 0x7990, 0x275F, 0x7992, 0x275E, 0x7993, 0x275B,
+ 0x7994, 0x275A, 0x7995, 0x2759, 0x7996, 0x2758, 0x7997, 0x275C,
+ 0x7998, 0x2755, 0x799A, 0x299C, 0x799B, 0x29A1, 0x799C, 0x299F,
+ 0x79A0, 0x299E, 0x79A1, 0x299D, 0x79A2, 0x29A0, 0x79A4, 0x2BF5,
+ 0x79A6, 0x130F, 0x79A7, 0x1424, 0x79A8, 0x2DCE, 0x79AA, 0x1425,
+ 0x79AB, 0x2DCD, 0x79AC, 0x2F74, 0x79AD, 0x2F73, 0x79AE, 0x14FF,
+ 0x79B0, 0x30D0, 0x79B1, 0x15A0, 0x79B2, 0x3209, 0x79B3, 0x16CF,
+ 0x79B4, 0x3398, 0x79B6, 0x3492, 0x79B7, 0x3491, 0x79B8, 0x17B2,
+ 0x79B9, 0x07C3, 0x79BA, 0x07C4, 0x79BB, 0x1FC5, 0x79BD, 0x0EAD,
+ 0x79BE, 0x036B, 0x79BF, 0x04F9, 0x79C0, 0x04F8, 0x79C1, 0x04F7,
+ 0x79C5, 0x1A21, 0x79C8, 0x0663, 0x79C9, 0x0662, 0x79CB, 0x07C7,
+ 0x79CD, 0x1BB1, 0x79CE, 0x1BB4, 0x79CF, 0x1BB2, 0x79D1, 0x07C5,
+ 0x79D2, 0x07C6, 0x79D5, 0x1BB0, 0x79D6, 0x1BB3, 0x79D8, 0x0964,
+ 0x79DC, 0x1D81, 0x79DD, 0x1D83, 0x79DE, 0x1D82, 0x79DF, 0x0961,
+ 0x79E0, 0x1D7D, 0x79E3, 0x095F, 0x79E4, 0x095E, 0x79E6, 0x0962,
+ 0x79E7, 0x0960, 0x79E9, 0x0963, 0x79EA, 0x1D80, 0x79EB, 0x1D7B,
+ 0x79EC, 0x1D7C, 0x79ED, 0x1D7F, 0x79EE, 0x1D7E, 0x79F6, 0x1FC8,
+ 0x79F7, 0x1FC9, 0x79F8, 0x1FC7, 0x79FA, 0x1FC6, 0x79FB, 0x0B45,
+ 0x7A00, 0x0CFD, 0x7A02, 0x224B, 0x7A03, 0x224D, 0x7A04, 0x224F,
+ 0x7A05, 0x0CFC, 0x7A08, 0x0CFA, 0x7A0A, 0x224C, 0x7A0B, 0x0CFB,
+ 0x7A0C, 0x224E, 0x7A0D, 0x0CF9, 0x7A10, 0x24E9, 0x7A11, 0x24E0,
+ 0x7A12, 0x24E3, 0x7A13, 0x24E7, 0x7A14, 0x0EB1, 0x7A15, 0x24E5,
+ 0x7A17, 0x24E4, 0x7A18, 0x24E1, 0x7A19, 0x24E2, 0x7A1A, 0x0EAF,
+ 0x7A1B, 0x24E8, 0x7A1C, 0x0EAE, 0x7A1E, 0x0EB3, 0x7A1F, 0x0EB2,
+ 0x7A20, 0x0EB0, 0x7A22, 0x24E6, 0x7A26, 0x2765, 0x7A28, 0x2764,
+ 0x7A2B, 0x2760, 0x7A2E, 0x1047, 0x7A2F, 0x2763, 0x7A30, 0x2762,
+ 0x7A31, 0x1048, 0x7A37, 0x11C7, 0x7A39, 0x29A3, 0x7A3B, 0x11C8,
+ 0x7A3C, 0x11C4, 0x7A3D, 0x11C6, 0x7A3F, 0x11C3, 0x7A40, 0x11C5,
+ 0x7A44, 0x2BF6, 0x7A46, 0x1312, 0x7A47, 0x2BF8, 0x7A48, 0x2BF7,
+ 0x7A4A, 0x2761, 0x7A4B, 0x1314, 0x7A4C, 0x1313, 0x7A4D, 0x1310,
+ 0x7A4E, 0x1311, 0x7A54, 0x2DD3, 0x7A56, 0x2DD1, 0x7A57, 0x1426,
+ 0x7A58, 0x2DD2, 0x7A5A, 0x2DD4, 0x7A5B, 0x2DD0, 0x7A5C, 0x2DCF,
+ 0x7A5F, 0x2F75, 0x7A60, 0x1502, 0x7A61, 0x1500, 0x7A62, 0x1501,
+ 0x7A67, 0x30D1, 0x7A68, 0x30D2, 0x7A69, 0x15A2, 0x7A6B, 0x15A1,
+ 0x7A6C, 0x320B, 0x7A6D, 0x320C, 0x7A6E, 0x320A, 0x7A70, 0x3399,
+ 0x7A71, 0x339A, 0x7A74, 0x036C, 0x7A75, 0x1811, 0x7A76, 0x04FA,
+ 0x7A78, 0x1A22, 0x7A79, 0x0665, 0x7A7A, 0x0664, 0x7A7B, 0x1A23,
+ 0x7A7E, 0x1BB6, 0x7A7F, 0x07C8, 0x7A80, 0x1BB5, 0x7A81, 0x07C9,
+ 0x7A84, 0x0965, 0x7A85, 0x1D86, 0x7A86, 0x1D84, 0x7A87, 0x1D8A,
+ 0x7A88, 0x0966, 0x7A89, 0x1D85, 0x7A8A, 0x1D89, 0x7A8B, 0x1D87,
+ 0x7A8C, 0x1D88, 0x7A8F, 0x1FCA, 0x7A90, 0x1FCC, 0x7A92, 0x0B46,
+ 0x7A94, 0x1FCB, 0x7A95, 0x0B47, 0x7A96, 0x0D00, 0x7A97, 0x0CFF,
+ 0x7A98, 0x0CFE, 0x7A99, 0x2250, 0x7A9E, 0x24EC, 0x7A9F, 0x0EB4,
+ 0x7AA0, 0x0EB5, 0x7AA2, 0x24EB, 0x7AA3, 0x24EA, 0x7AA8, 0x2766,
+ 0x7AA9, 0x104A, 0x7AAA, 0x1049, 0x7AAB, 0x2767, 0x7AAC, 0x2768,
+ 0x7AAE, 0x11CA, 0x7AAF, 0x11C9, 0x7AB1, 0x2BFC, 0x7AB2, 0x29A4,
+ 0x7AB3, 0x29A6, 0x7AB4, 0x29A5, 0x7AB5, 0x2BFB, 0x7AB6, 0x2BF9,
+ 0x7AB7, 0x2BFD, 0x7AB8, 0x2BFA, 0x7ABA, 0x1315, 0x7ABE, 0x2DD5,
+ 0x7ABF, 0x1427, 0x7AC0, 0x2DD6, 0x7AC1, 0x2DD7, 0x7AC4, 0x1503,
+ 0x7AC5, 0x1504, 0x7AC7, 0x1628, 0x7ACA, 0x16FF, 0x7ACB, 0x036D,
+ 0x7AD1, 0x1BB7, 0x7AD8, 0x1D8B, 0x7AD9, 0x0967, 0x7ADF, 0x0BDE,
+ 0x7AE0, 0x0BDD, 0x7AE3, 0x0D02, 0x7AE4, 0x2252, 0x7AE5, 0x0D01,
+ 0x7AE6, 0x2251, 0x7AEB, 0x24ED, 0x7AED, 0x104B, 0x7AEE, 0x2769,
+ 0x7AEF, 0x104C, 0x7AF6, 0x1629, 0x7AF7, 0x320D, 0x7AF9, 0x03F6,
+ 0x7AFA, 0x0666, 0x7AFB, 0x1A24, 0x7AFD, 0x07CB, 0x7AFF, 0x07CA,
+ 0x7B00, 0x1BB8, 0x7B01, 0x1BB9, 0x7B04, 0x1D8D, 0x7B05, 0x1D8F,
+ 0x7B06, 0x0968, 0x7B08, 0x1D91, 0x7B09, 0x1D94, 0x7B0A, 0x1D92,
+ 0x7B0E, 0x1D93, 0x7B0F, 0x1D90, 0x7B10, 0x1D8C, 0x7B11, 0x0969,
+ 0x7B12, 0x1D95, 0x7B13, 0x1D8E, 0x7B18, 0x1FD5, 0x7B19, 0x0B4D,
+ 0x7B1A, 0x1FDE, 0x7B1B, 0x0B4A, 0x7B1D, 0x1FD7, 0x7B1E, 0x0B4E,
+ 0x7B20, 0x0B48, 0x7B22, 0x1FD2, 0x7B23, 0x1FDF, 0x7B24, 0x1FD3,
+ 0x7B25, 0x1FD0, 0x7B26, 0x0B4C, 0x7B28, 0x0B49, 0x7B2A, 0x1FD6,
+ 0x7B2B, 0x1FD9, 0x7B2C, 0x0B4B, 0x7B2D, 0x1FDA, 0x7B2E, 0x0B4F,
+ 0x7B2F, 0x1FDB, 0x7B30, 0x1FD1, 0x7B31, 0x1FD8, 0x7B32, 0x1FDC,
+ 0x7B33, 0x1FD4, 0x7B34, 0x1FCF, 0x7B35, 0x1FCD, 0x7B38, 0x1FDD,
+ 0x7B3B, 0x1FCE, 0x7B40, 0x2259, 0x7B44, 0x2255, 0x7B45, 0x225B,
+ 0x7B46, 0x0D05, 0x7B47, 0x2254, 0x7B48, 0x2256, 0x7B49, 0x0D03,
+ 0x7B4A, 0x2253, 0x7B4B, 0x0D0A, 0x7B4C, 0x2257, 0x7B4D, 0x0D09,
+ 0x7B4E, 0x2258, 0x7B4F, 0x0D0B, 0x7B50, 0x0D06, 0x7B51, 0x0D0C,
+ 0x7B52, 0x0D07, 0x7B54, 0x0D08, 0x7B56, 0x0D04, 0x7B58, 0x225A,
+ 0x7B60, 0x0EB8, 0x7B61, 0x24F8, 0x7B63, 0x24FB, 0x7B64, 0x24EF,
+ 0x7B65, 0x24F4, 0x7B66, 0x24EE, 0x7B67, 0x0EBA, 0x7B69, 0x24F2,
+ 0x7B6D, 0x24F0, 0x7B6E, 0x0EB9, 0x7B70, 0x24F7, 0x7B71, 0x24F6,
+ 0x7B72, 0x24F3, 0x7B73, 0x24F5, 0x7B74, 0x24F1, 0x7B75, 0x1050,
+ 0x7B76, 0x24FA, 0x7B77, 0x0EB6, 0x7B78, 0x24F9, 0x7B82, 0x2779,
+ 0x7B84, 0x1057, 0x7B85, 0x2774, 0x7B87, 0x1056, 0x7B88, 0x276A,
+ 0x7B8A, 0x276C, 0x7B8B, 0x104F, 0x7B8C, 0x2771, 0x7B8D, 0x2770,
+ 0x7B8E, 0x2773, 0x7B8F, 0x1054, 0x7B90, 0x276E, 0x7B91, 0x276D,
+ 0x7B94, 0x1053, 0x7B95, 0x104E, 0x7B96, 0x276F, 0x7B97, 0x1051,
+ 0x7B98, 0x2775, 0x7B99, 0x2777, 0x7B9B, 0x2772, 0x7B9C, 0x276B,
+ 0x7B9D, 0x1052, 0x7BA0, 0x11D2, 0x7BA1, 0x104D, 0x7BA4, 0x2778,
+ 0x7BAC, 0x29AA, 0x7BAD, 0x11CB, 0x7BAF, 0x29AC, 0x7BB1, 0x11CC,
+ 0x7BB4, 0x11CE, 0x7BB5, 0x29AF, 0x7BB7, 0x29A7, 0x7BB8, 0x1055,
+ 0x7BB9, 0x29AD, 0x7BBE, 0x29A9, 0x7BC0, 0x0EB7, 0x7BC1, 0x11D1,
+ 0x7BC4, 0x11CD, 0x7BC6, 0x11CF, 0x7BC7, 0x11D0, 0x7BC9, 0x1318,
+ 0x7BCA, 0x29AE, 0x7BCB, 0x29A8, 0x7BCC, 0x11D3, 0x7BCE, 0x29AB,
+ 0x7BD4, 0x2C07, 0x7BD5, 0x2C02, 0x7BD8, 0x2C0C, 0x7BD9, 0x1316,
+ 0x7BDA, 0x2C04, 0x7BDB, 0x131A, 0x7BDC, 0x2C0A, 0x7BDD, 0x2C01,
+ 0x7BDE, 0x2BFE, 0x7BDF, 0x2C0D, 0x7BE0, 0x142D, 0x7BE1, 0x131B,
+ 0x7BE2, 0x2C09, 0x7BE3, 0x2BFF, 0x7BE4, 0x1319, 0x7BE5, 0x2C03,
+ 0x7BE6, 0x131D, 0x7BE7, 0x2C00, 0x7BE8, 0x2C05, 0x7BE9, 0x131C,
+ 0x7BEA, 0x2C08, 0x7BEB, 0x2C0B, 0x7BF0, 0x2DE9, 0x7BF1, 0x2DEA,
+ 0x7BF2, 0x2DDA, 0x7BF3, 0x2DE1, 0x7BF4, 0x2DDF, 0x7BF7, 0x142B,
+ 0x7BF8, 0x2DE6, 0x7BF9, 0x2C06, 0x7BFB, 0x2DDD, 0x7BFD, 0x2DE7,
+ 0x7BFE, 0x142A, 0x7BFF, 0x2DDC, 0x7C00, 0x2DDB, 0x7C01, 0x2DE5,
+ 0x7C02, 0x2DE2, 0x7C03, 0x2DE4, 0x7C05, 0x2DD8, 0x7C06, 0x2DE8,
+ 0x7C07, 0x1428, 0x7C09, 0x2DE3, 0x7C0A, 0x2DEC, 0x7C0B, 0x2DE0,
+ 0x7C0C, 0x142C, 0x7C0D, 0x1429, 0x7C0E, 0x2DDE, 0x7C0F, 0x2DD9,
+ 0x7C10, 0x2DEB, 0x7C11, 0x1317, 0x7C19, 0x2F78, 0x7C1C, 0x2F76,
+ 0x7C1D, 0x2F7C, 0x7C1E, 0x1508, 0x7C1F, 0x2F7A, 0x7C20, 0x2F79,
+ 0x7C21, 0x150A, 0x7C22, 0x2F7F, 0x7C23, 0x1509, 0x7C25, 0x2F80,
+ 0x7C26, 0x2F7D, 0x7C27, 0x1506, 0x7C28, 0x2F7E, 0x7C29, 0x2F77,
+ 0x7C2A, 0x1507, 0x7C2B, 0x1505, 0x7C2C, 0x30D6, 0x7C2D, 0x2F7B,
+ 0x7C30, 0x2F81, 0x7C33, 0x30D3, 0x7C37, 0x15A7, 0x7C38, 0x15A5,
+ 0x7C39, 0x30D5, 0x7C3B, 0x30D7, 0x7C3C, 0x30D4, 0x7C3D, 0x15A6,
+ 0x7C3E, 0x15A3, 0x7C3F, 0x15A4, 0x7C40, 0x15A8, 0x7C43, 0x162B,
+ 0x7C45, 0x3212, 0x7C47, 0x3211, 0x7C48, 0x320F, 0x7C49, 0x320E,
+ 0x7C4A, 0x3210, 0x7C4C, 0x162A, 0x7C4D, 0x162C, 0x7C50, 0x1681,
+ 0x7C53, 0x32EA, 0x7C54, 0x32E9, 0x7C57, 0x339B, 0x7C59, 0x339D,
+ 0x7C5A, 0x339F, 0x7C5B, 0x339E, 0x7C5C, 0x339C, 0x7C5F, 0x16D1,
+ 0x7C60, 0x16D0, 0x7C63, 0x1701, 0x7C64, 0x1700, 0x7C65, 0x1702,
+ 0x7C66, 0x342B, 0x7C67, 0x342A, 0x7C69, 0x34D6, 0x7C6A, 0x3493,
+ 0x7C6B, 0x34D7, 0x7C6C, 0x1745, 0x7C6E, 0x1746, 0x7C6F, 0x3507,
+ 0x7C72, 0x176B, 0x7C73, 0x03F7, 0x7C75, 0x1A25, 0x7C78, 0x1BBB,
+ 0x7C79, 0x1BBC, 0x7C7A, 0x1BBA, 0x7C7D, 0x07CC, 0x7C7F, 0x1BBD,
+ 0x7C80, 0x1BBE, 0x7C81, 0x1BBF, 0x7C84, 0x1D96, 0x7C85, 0x1D9C,
+ 0x7C88, 0x1D9A, 0x7C89, 0x096A, 0x7C8A, 0x1D98, 0x7C8C, 0x1D99,
+ 0x7C8D, 0x1D9B, 0x7C91, 0x1D97, 0x7C92, 0x0B50, 0x7C94, 0x1FE0,
+ 0x7C95, 0x0B52, 0x7C96, 0x1FE2, 0x7C97, 0x0B51, 0x7C98, 0x1FE1,
+ 0x7C9E, 0x225D, 0x7C9F, 0x0D0D, 0x7CA1, 0x225F, 0x7CA2, 0x225C,
+ 0x7CA3, 0x1FE3, 0x7CA5, 0x0D0E, 0x7CA7, 0x36ED, 0x7CA8, 0x225E,
+ 0x7CAF, 0x24FE, 0x7CB1, 0x0EBB, 0x7CB2, 0x24FC, 0x7CB3, 0x0EBC,
+ 0x7CB4, 0x24FD, 0x7CB5, 0x0EBD, 0x7CB9, 0x1058, 0x7CBA, 0x277D,
+ 0x7CBB, 0x277A, 0x7CBC, 0x277C, 0x7CBD, 0x1059, 0x7CBE, 0x105A,
+ 0x7CBF, 0x277B, 0x7CC5, 0x29B0, 0x7CC8, 0x29B1, 0x7CCA, 0x11D4,
+ 0x7CCB, 0x29B3, 0x7CCC, 0x29B2, 0x7CCE, 0x0121, 0x7CD0, 0x2C11,
+ 0x7CD1, 0x2C12, 0x7CD2, 0x2C0E, 0x7CD4, 0x2C0F, 0x7CD5, 0x131E,
+ 0x7CD6, 0x131F, 0x7CD7, 0x2C10, 0x7CD9, 0x1433, 0x7CDC, 0x142F,
+ 0x7CDD, 0x1434, 0x7CDE, 0x1430, 0x7CDF, 0x1432, 0x7CE0, 0x142E,
+ 0x7CE2, 0x1431, 0x7CE7, 0x150B, 0x7CE8, 0x2DED, 0x7CEA, 0x30D9,
+ 0x7CEC, 0x30D8, 0x7CEE, 0x3213, 0x7CEF, 0x162D, 0x7CF0, 0x162E,
+ 0x7CF1, 0x33A1, 0x7CF2, 0x32EB, 0x7CF4, 0x33A0, 0x7CF6, 0x34D8,
+ 0x7CF7, 0x351D, 0x7CF8, 0x03F8, 0x7CFB, 0x04FB, 0x7CFD, 0x1A26,
+ 0x7CFE, 0x0667, 0x7D00, 0x07CF, 0x7D01, 0x1BC2, 0x7D02, 0x07CD,
+ 0x7D03, 0x1BC0, 0x7D04, 0x07D2, 0x7D05, 0x07CE, 0x7D06, 0x07D3,
+ 0x7D07, 0x07D1, 0x7D08, 0x1BC1, 0x7D09, 0x07D0, 0x7D0A, 0x096E,
+ 0x7D0B, 0x096D, 0x7D0C, 0x1DA7, 0x7D0D, 0x0976, 0x7D0E, 0x1DA0,
+ 0x7D0F, 0x1DA6, 0x7D10, 0x0972, 0x7D11, 0x1D9F, 0x7D12, 0x1DA5,
+ 0x7D13, 0x1DA3, 0x7D14, 0x0971, 0x7D15, 0x0973, 0x7D16, 0x1DA2,
+ 0x7D17, 0x096C, 0x7D18, 0x1DA1, 0x7D19, 0x0977, 0x7D1A, 0x0974,
+ 0x7D1B, 0x0978, 0x7D1C, 0x0975, 0x7D1D, 0x1D9E, 0x7D1E, 0x1D9D,
+ 0x7D1F, 0x1DA4, 0x7D20, 0x096F, 0x7D21, 0x096B, 0x7D22, 0x0970,
+ 0x7D28, 0x1FF2, 0x7D29, 0x1FEB, 0x7D2B, 0x0D13, 0x7D2C, 0x1FEA,
+ 0x7D2E, 0x0B56, 0x7D2F, 0x0B5D, 0x7D30, 0x0B5A, 0x7D31, 0x0B60,
+ 0x7D32, 0x0B5F, 0x7D33, 0x0B5B, 0x7D35, 0x1FE4, 0x7D36, 0x1FE7,
+ 0x7D38, 0x1FE6, 0x7D39, 0x0B57, 0x7D3A, 0x1FE8, 0x7D3B, 0x1FF1,
+ 0x7D3C, 0x0B58, 0x7D3D, 0x1FE5, 0x7D3E, 0x1FEE, 0x7D3F, 0x1FEF,
+ 0x7D40, 0x0B59, 0x7D41, 0x1FEC, 0x7D42, 0x0B5E, 0x7D43, 0x0B54,
+ 0x7D44, 0x0B5C, 0x7D45, 0x1FE9, 0x7D46, 0x0B53, 0x7D47, 0x1FED,
+ 0x7D4A, 0x1FF0, 0x7D4E, 0x2270, 0x7D4F, 0x2267, 0x7D50, 0x0D10,
+ 0x7D51, 0x226E, 0x7D52, 0x226B, 0x7D53, 0x2263, 0x7D54, 0x226C,
+ 0x7D55, 0x0D12, 0x7D56, 0x2264, 0x7D58, 0x2260, 0x7D5B, 0x0EC3,
+ 0x7D5C, 0x2269, 0x7D5E, 0x0D0F, 0x7D5F, 0x226F, 0x7D61, 0x0D16,
+ 0x7D62, 0x0D18, 0x7D63, 0x2262, 0x7D66, 0x0D17, 0x7D67, 0x2265,
+ 0x7D68, 0x0D11, 0x7D69, 0x226D, 0x7D6A, 0x2266, 0x7D6B, 0x226A,
+ 0x7D6D, 0x2268, 0x7D6E, 0x0D14, 0x7D6F, 0x2261, 0x7D70, 0x0D19,
+ 0x7D71, 0x0B55, 0x7D72, 0x0D15, 0x7D73, 0x0D1A, 0x7D79, 0x0EBF,
+ 0x7D7A, 0x2505, 0x7D7B, 0x2507, 0x7D7C, 0x2509, 0x7D7D, 0x250D,
+ 0x7D7F, 0x2503, 0x7D80, 0x2501, 0x7D81, 0x0EC1, 0x7D83, 0x2508,
+ 0x7D84, 0x250C, 0x7D85, 0x2504, 0x7D86, 0x2500, 0x7D88, 0x24FF,
+ 0x7D8C, 0x250A, 0x7D8D, 0x2502, 0x7D8E, 0x2506, 0x7D8F, 0x0EC2,
+ 0x7D91, 0x0EC0, 0x7D92, 0x250E, 0x7D93, 0x0EBE, 0x7D94, 0x250B,
+ 0x7D96, 0x278E, 0x7D9C, 0x105D, 0x7D9D, 0x2786, 0x7D9E, 0x11E1,
+ 0x7D9F, 0x2790, 0x7DA0, 0x1060, 0x7DA1, 0x2794, 0x7DA2, 0x1066,
+ 0x7DA3, 0x2781, 0x7DA6, 0x2791, 0x7DA7, 0x277E, 0x7DA9, 0x2793,
+ 0x7DAA, 0x2782, 0x7DAC, 0x106D, 0x7DAD, 0x106A, 0x7DAE, 0x2792,
+ 0x7DAF, 0x278C, 0x7DB0, 0x105C, 0x7DB1, 0x1064, 0x7DB2, 0x1063,
+ 0x7DB4, 0x1062, 0x7DB5, 0x1068, 0x7DB7, 0x277F, 0x7DB8, 0x1069,
+ 0x7DB9, 0x278D, 0x7DBA, 0x1065, 0x7DBB, 0x105B, 0x7DBC, 0x278F,
+ 0x7DBD, 0x105E, 0x7DBE, 0x105F, 0x7DBF, 0x1067, 0x7DC0, 0x2784,
+ 0x7DC1, 0x2783, 0x7DC2, 0x2780, 0x7DC4, 0x2788, 0x7DC5, 0x2785,
+ 0x7DC6, 0x2789, 0x7DC7, 0x106C, 0x7DC9, 0x2795, 0x7DCA, 0x1061,
+ 0x7DCB, 0x278A, 0x7DCC, 0x278B, 0x7DCE, 0x2787, 0x7DD2, 0x106B,
+ 0x7DD7, 0x29B8, 0x7DD8, 0x11D9, 0x7DD9, 0x11E2, 0x7DDA, 0x11DE,
+ 0x7DDB, 0x29B5, 0x7DDD, 0x11DB, 0x7DDE, 0x11DF, 0x7DDF, 0x29C1,
+ 0x7DE0, 0x11D5, 0x7DE1, 0x29B9, 0x7DE3, 0x11DD, 0x7DE6, 0x29BC,
+ 0x7DE7, 0x29B7, 0x7DE8, 0x11DC, 0x7DE9, 0x11E0, 0x7DEA, 0x29B6,
+ 0x7DEC, 0x11DA, 0x7DEE, 0x29C0, 0x7DEF, 0x11D7, 0x7DF0, 0x29BF,
+ 0x7DF1, 0x29BE, 0x7DF2, 0x11E3, 0x7DF3, 0x28C8, 0x7DF4, 0x11D6,
+ 0x7DF6, 0x29BD, 0x7DF7, 0x29B4, 0x7DF9, 0x11E4, 0x7DFA, 0x29BB,
+ 0x7DFB, 0x11D8, 0x7E03, 0x29BA, 0x7E08, 0x1322, 0x7E09, 0x1327,
+ 0x7E0A, 0x1320, 0x7E0B, 0x2C1F, 0x7E0C, 0x2C16, 0x7E0D, 0x2C22,
+ 0x7E0E, 0x2C1A, 0x7E0F, 0x2C20, 0x7E10, 0x1328, 0x7E11, 0x1321,
+ 0x7E12, 0x2C13, 0x7E13, 0x2C19, 0x7E14, 0x2C23, 0x7E15, 0x2C1C,
+ 0x7E16, 0x2C21, 0x7E17, 0x2C15, 0x7E1A, 0x2C1D, 0x7E1B, 0x1323,
+ 0x7E1C, 0x2C1B, 0x7E1D, 0x1326, 0x7E1E, 0x1325, 0x7E1F, 0x2C17,
+ 0x7E20, 0x2C18, 0x7E21, 0x2C14, 0x7E22, 0x2C1E, 0x7E23, 0x1324,
+ 0x7E24, 0x2C25, 0x7E25, 0x2C24, 0x7E29, 0x2DF8, 0x7E2A, 0x2DF4,
+ 0x7E2B, 0x143B, 0x7E2D, 0x2DEE, 0x7E2E, 0x1435, 0x7E2F, 0x1445,
+ 0x7E30, 0x2DFA, 0x7E31, 0x143D, 0x7E32, 0x1439, 0x7E33, 0x2DF1,
+ 0x7E34, 0x1440, 0x7E35, 0x1443, 0x7E36, 0x2DFC, 0x7E37, 0x1438,
+ 0x7E38, 0x2DF3, 0x7E39, 0x1441, 0x7E3A, 0x2DFE, 0x7E3B, 0x2DFB,
+ 0x7E3C, 0x2DEF, 0x7E3D, 0x143C, 0x7E3E, 0x1436, 0x7E3F, 0x1444,
+ 0x7E40, 0x2DF6, 0x7E41, 0x143F, 0x7E42, 0x2DF0, 0x7E43, 0x143A,
+ 0x7E44, 0x2DFD, 0x7E45, 0x143E, 0x7E46, 0x1437, 0x7E47, 0x2DF7,
+ 0x7E48, 0x1442, 0x7E49, 0x2DF5, 0x7E4C, 0x2DF9, 0x7E50, 0x2F83,
+ 0x7E51, 0x2F89, 0x7E52, 0x1511, 0x7E53, 0x2F8C, 0x7E54, 0x150C,
+ 0x7E55, 0x150D, 0x7E56, 0x2F84, 0x7E57, 0x2F8B, 0x7E58, 0x2F86,
+ 0x7E59, 0x1512, 0x7E5A, 0x150F, 0x7E5C, 0x2F82, 0x7E5E, 0x150E,
+ 0x7E5F, 0x2F88, 0x7E60, 0x2F8A, 0x7E61, 0x1510, 0x7E62, 0x2F87,
+ 0x7E63, 0x2F85, 0x7E68, 0x30E3, 0x7E69, 0x15AC, 0x7E6A, 0x15AD,
+ 0x7E6B, 0x15A9, 0x7E6D, 0x15AA, 0x7E6F, 0x30DF, 0x7E70, 0x30DD,
+ 0x7E72, 0x30E1, 0x7E73, 0x15AE, 0x7E74, 0x30E2, 0x7E75, 0x30DB,
+ 0x7E76, 0x30DA, 0x7E77, 0x30DE, 0x7E78, 0x30DC, 0x7E79, 0x15AB,
+ 0x7E7A, 0x30E0, 0x7E7B, 0x3214, 0x7E7C, 0x1631, 0x7E7D, 0x1630,
+ 0x7E7E, 0x3215, 0x7E80, 0x3217, 0x7E81, 0x3216, 0x7E82, 0x1632,
+ 0x7E86, 0x32F0, 0x7E87, 0x32ED, 0x7E88, 0x32EE, 0x7E8A, 0x32EC,
+ 0x7E8B, 0x32EF, 0x7E8C, 0x1683, 0x7E8D, 0x32F1, 0x7E8F, 0x1682,
+ 0x7E91, 0x33A2, 0x7E93, 0x1703, 0x7E94, 0x1705, 0x7E95, 0x342C,
+ 0x7E96, 0x1704, 0x7E97, 0x3494, 0x7E98, 0x34DA, 0x7E99, 0x34DC,
+ 0x7E9A, 0x34D9, 0x7E9B, 0x34DB, 0x7E9C, 0x1759, 0x7F36, 0x03F9,
+ 0x7F38, 0x07D4, 0x7F39, 0x1D1F, 0x7F3A, 0x0979, 0x7F3D, 0x0B61,
+ 0x7F3E, 0x2271, 0x7F3F, 0x2272, 0x7F43, 0x2C26, 0x7F44, 0x1446,
+ 0x7F45, 0x2DFF, 0x7F48, 0x1513, 0x7F4A, 0x30E5, 0x7F4B, 0x30E4,
+ 0x7F4C, 0x1633, 0x7F4D, 0x32F2, 0x7F4F, 0x33A3, 0x7F50, 0x1726,
+ 0x7F51, 0x1812, 0x7F54, 0x0668, 0x7F55, 0x04FC, 0x7F58, 0x1BC3,
+ 0x7F5B, 0x1DAD, 0x7F5C, 0x1DA8, 0x7F5D, 0x1DAC, 0x7F5E, 0x1DAA,
+ 0x7F5F, 0x097A, 0x7F60, 0x1DAB, 0x7F61, 0x1DA9, 0x7F63, 0x1FF3,
+ 0x7F65, 0x2273, 0x7F66, 0x2274, 0x7F67, 0x2511, 0x7F68, 0x2512,
+ 0x7F69, 0x0EC5, 0x7F6A, 0x0EC6, 0x7F6B, 0x2510, 0x7F6C, 0x2513,
+ 0x7F6D, 0x250F, 0x7F6E, 0x0EC4, 0x7F70, 0x106E, 0x7F72, 0x0EC7,
+ 0x7F73, 0x2796, 0x7F75, 0x11E5, 0x7F76, 0x29C2, 0x7F77, 0x11E6,
+ 0x7F79, 0x1329, 0x7F7A, 0x2C29, 0x7F7B, 0x2C27, 0x7F7C, 0x2C28,
+ 0x7F7D, 0x2E02, 0x7F7E, 0x2E01, 0x7F7F, 0x2E00, 0x7F83, 0x30E6,
+ 0x7F85, 0x15AF, 0x7F86, 0x30E7, 0x7F87, 0x33A4, 0x7F88, 0x1727,
+ 0x7F89, 0x3495, 0x7F8A, 0x03FA, 0x7F8B, 0x066A, 0x7F8C, 0x0669,
+ 0x7F8D, 0x1BC5, 0x7F8E, 0x07D5, 0x7F91, 0x1BC4, 0x7F92, 0x1DAF,
+ 0x7F94, 0x097B, 0x7F95, 0x1FF4, 0x7F96, 0x1DAE, 0x7F9A, 0x0B63,
+ 0x7F9B, 0x1FF7, 0x7F9C, 0x1FF5, 0x7F9D, 0x1FF6, 0x7F9E, 0x0B62,
+ 0x7FA0, 0x2276, 0x7FA1, 0x2277, 0x7FA2, 0x2275, 0x7FA4, 0x0ECA,
+ 0x7FA5, 0x2515, 0x7FA6, 0x2514, 0x7FA7, 0x2516, 0x7FA8, 0x0EC9,
+ 0x7FA9, 0x0EC8, 0x7FAC, 0x29C3, 0x7FAD, 0x29C5, 0x7FAF, 0x11E7,
+ 0x7FB0, 0x29C4, 0x7FB1, 0x2C2A, 0x7FB2, 0x132A, 0x7FB3, 0x2F8E,
+ 0x7FB5, 0x2F8D, 0x7FB6, 0x15B0, 0x7FB7, 0x30E8, 0x7FB8, 0x15B2,
+ 0x7FB9, 0x15B1, 0x7FBA, 0x3218, 0x7FBB, 0x32F3, 0x7FBC, 0x1684,
+ 0x7FBD, 0x03FB, 0x7FBE, 0x1BC6, 0x7FBF, 0x07D6, 0x7FC0, 0x1DB2,
+ 0x7FC1, 0x097D, 0x7FC2, 0x1DB1, 0x7FC3, 0x1DB0, 0x7FC5, 0x097C,
+ 0x7FC7, 0x1FFD, 0x7FC9, 0x1FFF, 0x7FCA, 0x1FF8, 0x7FCB, 0x1FF9,
+ 0x7FCC, 0x0B64, 0x7FCD, 0x1FFA, 0x7FCE, 0x0B65, 0x7FCF, 0x1FFE,
+ 0x7FD0, 0x1FFB, 0x7FD1, 0x1FFC, 0x7FD2, 0x0B66, 0x7FD4, 0x0D1C,
+ 0x7FD5, 0x0D1D, 0x7FD7, 0x2278, 0x7FDB, 0x2517, 0x7FDC, 0x2518,
+ 0x7FDE, 0x279A, 0x7FDF, 0x1071, 0x7FE0, 0x106F, 0x7FE1, 0x1070,
+ 0x7FE2, 0x2797, 0x7FE3, 0x2798, 0x7FE5, 0x2799, 0x7FE6, 0x29CA,
+ 0x7FE8, 0x29CB, 0x7FE9, 0x11E8, 0x7FEA, 0x29C8, 0x7FEB, 0x29C7,
+ 0x7FEC, 0x29C9, 0x7FED, 0x29C6, 0x7FEE, 0x132D, 0x7FEF, 0x2C2B,
+ 0x7FF0, 0x132B, 0x7FF1, 0x132C, 0x7FF2, 0x2E04, 0x7FF3, 0x1447,
+ 0x7FF4, 0x2E03, 0x7FF5, 0x2EFF, 0x7FF7, 0x2F8F, 0x7FF8, 0x2F90,
+ 0x7FF9, 0x1514, 0x7FFB, 0x1515, 0x7FFC, 0x1448, 0x7FFD, 0x30E9,
+ 0x7FFE, 0x30EA, 0x7FFF, 0x3219, 0x8000, 0x1634, 0x8001, 0x03FC,
+ 0x8003, 0x03FD, 0x8004, 0x097F, 0x8005, 0x066B, 0x8006, 0x097E,
+ 0x8007, 0x1BC7, 0x800B, 0x0D1E, 0x800C, 0x03FE, 0x800D, 0x07D8,
+ 0x800E, 0x1BC8, 0x800F, 0x1BC9, 0x8010, 0x07D7, 0x8011, 0x07D9,
+ 0x8012, 0x03FF, 0x8014, 0x1BCA, 0x8015, 0x0981, 0x8016, 0x1DB3,
+ 0x8017, 0x0983, 0x8018, 0x0980, 0x8019, 0x0982, 0x801B, 0x2002,
+ 0x801C, 0x0B67, 0x801E, 0x2001, 0x801F, 0x2000, 0x8021, 0x2519,
+ 0x8024, 0x279B, 0x8026, 0x11E9, 0x8028, 0x132E, 0x8029, 0x2C2D,
+ 0x802A, 0x2C2C, 0x802C, 0x2E05, 0x8030, 0x32F4, 0x8033, 0x0400,
+ 0x8034, 0x18D8, 0x8035, 0x1A27, 0x8036, 0x07DA, 0x8037, 0x1BCB,
+ 0x8039, 0x1DB5, 0x803D, 0x0984, 0x803E, 0x1DB4, 0x803F, 0x0985,
+ 0x8043, 0x2004, 0x8046, 0x0B69, 0x8047, 0x2003, 0x8048, 0x2005,
+ 0x804A, 0x0B68, 0x804F, 0x227A, 0x8050, 0x227B, 0x8051, 0x2279,
+ 0x8052, 0x0D1F, 0x8056, 0x0ECB, 0x8058, 0x0ECC, 0x805A, 0x1073,
+ 0x805C, 0x279D, 0x805D, 0x279C, 0x805E, 0x1072, 0x8064, 0x29CC,
+ 0x8067, 0x29CD, 0x806C, 0x2C2E, 0x806F, 0x144C, 0x8070, 0x144B,
+ 0x8071, 0x1449, 0x8072, 0x144A, 0x8073, 0x144D, 0x8075, 0x2F91,
+ 0x8076, 0x1517, 0x8077, 0x1516, 0x8078, 0x30EB, 0x8079, 0x321A,
+ 0x807D, 0x16D3, 0x807E, 0x16D2, 0x807F, 0x0401, 0x8082, 0x1CEC,
+ 0x8084, 0x0ECE, 0x8085, 0x0D20, 0x8086, 0x0ECD, 0x8087, 0x1074,
+ 0x8089, 0x0402, 0x808A, 0x17B3, 0x808B, 0x0403, 0x808C, 0x0404,
+ 0x808F, 0x1A28, 0x8090, 0x18DB, 0x8092, 0x18DC, 0x8093, 0x04FE,
+ 0x8095, 0x18D9, 0x8096, 0x04FD, 0x8098, 0x0500, 0x8099, 0x18DA,
+ 0x809A, 0x0502, 0x809B, 0x0501, 0x809C, 0x18DD, 0x809D, 0x04FF,
+ 0x80A1, 0x0670, 0x80A2, 0x066E, 0x80A3, 0x1A2A, 0x80A5, 0x066D,
+ 0x80A9, 0x0672, 0x80AA, 0x0674, 0x80AB, 0x0671, 0x80AD, 0x1A2D,
+ 0x80AE, 0x1A29, 0x80AF, 0x0675, 0x80B1, 0x066F, 0x80B2, 0x0503,
+ 0x80B4, 0x0673, 0x80B5, 0x1A2C, 0x80B8, 0x1A2B, 0x80BA, 0x066C,
+ 0x80C2, 0x1BD1, 0x80C3, 0x07DE, 0x80C4, 0x07DF, 0x80C5, 0x1BD3,
+ 0x80C7, 0x1BCD, 0x80C8, 0x1BD0, 0x80C9, 0x1BD9, 0x80CA, 0x1BD7,
+ 0x80CC, 0x07E0, 0x80CD, 0x1BDD, 0x80CE, 0x07E3, 0x80CF, 0x1BDA,
+ 0x80D0, 0x1BD2, 0x80D1, 0x1BCF, 0x80D4, 0x227D, 0x80D5, 0x1BD8,
+ 0x80D6, 0x07DB, 0x80D7, 0x1BDB, 0x80D8, 0x1BCC, 0x80D9, 0x1BD5,
+ 0x80DA, 0x07DD, 0x80DB, 0x07E2, 0x80DC, 0x1BD6, 0x80DD, 0x07E6,
+ 0x80DE, 0x07E4, 0x80E0, 0x1BCE, 0x80E1, 0x07E1, 0x80E3, 0x1BD4,
+ 0x80E4, 0x07E5, 0x80E5, 0x07DC, 0x80E6, 0x1BDC, 0x80ED, 0x098A,
+ 0x80EF, 0x0993, 0x80F0, 0x0988, 0x80F1, 0x0986, 0x80F2, 0x1DB7,
+ 0x80F3, 0x098E, 0x80F4, 0x098B, 0x80F5, 0x1DB9, 0x80F8, 0x098D,
+ 0x80F9, 0x1DB8, 0x80FA, 0x1DB6, 0x80FB, 0x1DBB, 0x80FC, 0x0992,
+ 0x80FD, 0x0990, 0x80FE, 0x227C, 0x8100, 0x1DBC, 0x8101, 0x1DBA,
+ 0x8102, 0x0987, 0x8105, 0x0989, 0x8106, 0x098C, 0x8108, 0x098F,
+ 0x810A, 0x0991, 0x8115, 0x200F, 0x8116, 0x0B6B, 0x8118, 0x2006,
+ 0x8119, 0x2008, 0x811B, 0x2009, 0x811D, 0x2011, 0x811E, 0x200D,
+ 0x811F, 0x200B, 0x8121, 0x200E, 0x8122, 0x2012, 0x8123, 0x0B6C,
+ 0x8124, 0x0B70, 0x8125, 0x2007, 0x8127, 0x2010, 0x8129, 0x0B6E,
+ 0x812B, 0x0B6D, 0x812C, 0x200C, 0x812D, 0x200A, 0x812F, 0x0B6A,
+ 0x8130, 0x0B6F, 0x8139, 0x0D26, 0x813A, 0x2285, 0x813D, 0x2283,
+ 0x813E, 0x0D28, 0x8143, 0x227E, 0x8144, 0x2527, 0x8146, 0x0D27,
+ 0x8147, 0x2282, 0x814A, 0x227F, 0x814B, 0x0D23, 0x814C, 0x0D29,
+ 0x814D, 0x2284, 0x814E, 0x0D25, 0x814F, 0x2281, 0x8150, 0x1075,
+ 0x8151, 0x0D24, 0x8152, 0x2280, 0x8153, 0x0D2A, 0x8154, 0x0D22,
+ 0x8155, 0x0D21, 0x815B, 0x251F, 0x815C, 0x251D, 0x815E, 0x2523,
+ 0x8160, 0x251B, 0x8161, 0x2528, 0x8162, 0x2520, 0x8164, 0x251A,
+ 0x8165, 0x0ED2, 0x8166, 0x0ED8, 0x8167, 0x2525, 0x8169, 0x251E,
+ 0x816B, 0x0ED5, 0x816E, 0x0ED3, 0x816F, 0x2526, 0x8170, 0x0ED0,
+ 0x8171, 0x0ECF, 0x8172, 0x2521, 0x8173, 0x0ED4, 0x8174, 0x0D2B,
+ 0x8176, 0x2524, 0x8177, 0x251C, 0x8178, 0x0ED1, 0x8179, 0x0ED6,
+ 0x817A, 0x0ED7, 0x817F, 0x107A, 0x8180, 0x1076, 0x8182, 0x107B,
+ 0x8183, 0x27A0, 0x8186, 0x279F, 0x8187, 0x27A1, 0x8188, 0x1078,
+ 0x8189, 0x279E, 0x818A, 0x1079, 0x818B, 0x27A4, 0x818C, 0x27A3,
+ 0x818D, 0x27A2, 0x818F, 0x1077, 0x8195, 0x29D1, 0x8197, 0x29D4,
+ 0x8198, 0x11EF, 0x8199, 0x29D3, 0x819A, 0x11EE, 0x819B, 0x11EA,
+ 0x819C, 0x11EB, 0x819D, 0x11EC, 0x819E, 0x29D0, 0x819F, 0x29CF,
+ 0x81A0, 0x11ED, 0x81A2, 0x29D2, 0x81A3, 0x29CE, 0x81A6, 0x2C30,
+ 0x81A7, 0x2C3A, 0x81A8, 0x1331, 0x81A9, 0x1330, 0x81AB, 0x2C34,
+ 0x81AC, 0x2C36, 0x81AE, 0x2C31, 0x81B0, 0x2C35, 0x81B1, 0x2C2F,
+ 0x81B2, 0x2C38, 0x81B3, 0x132F, 0x81B4, 0x2C37, 0x81B5, 0x2C33,
+ 0x81B7, 0x2C39, 0x81B9, 0x2C32, 0x81BA, 0x1450, 0x81BB, 0x2E06,
+ 0x81BC, 0x2E0C, 0x81BD, 0x1454, 0x81BE, 0x1456, 0x81BF, 0x1453,
+ 0x81C0, 0x1452, 0x81C2, 0x1451, 0x81C3, 0x144F, 0x81C4, 0x2E07,
+ 0x81C5, 0x2E0A, 0x81C6, 0x144E, 0x81C7, 0x2E0B, 0x81C9, 0x1455,
+ 0x81CA, 0x2E09, 0x81CC, 0x2E08, 0x81CD, 0x1518, 0x81CF, 0x1519,
+ 0x81D0, 0x2F94, 0x81D1, 0x2F92, 0x81D2, 0x2F93, 0x81D5, 0x30ED,
+ 0x81D7, 0x30EC, 0x81D8, 0x15B3, 0x81D9, 0x321C, 0x81DA, 0x1635,
+ 0x81DB, 0x321B, 0x81DD, 0x32F5, 0x81DE, 0x33A5, 0x81DF, 0x16D4,
+ 0x81E0, 0x34DD, 0x81E1, 0x34DE, 0x81E2, 0x1706, 0x81E3, 0x0405,
+ 0x81E5, 0x0676, 0x81E6, 0x2286, 0x81E7, 0x107C, 0x81E8, 0x1457,
+ 0x81E9, 0x2E0D, 0x81EA, 0x0406, 0x81EC, 0x0995, 0x81ED, 0x0994,
+ 0x81EE, 0x2287, 0x81F2, 0x2C3B, 0x81F3, 0x0407, 0x81F4, 0x07E7,
+ 0x81F7, 0x2288, 0x81F8, 0x2289, 0x81F9, 0x228A, 0x81FA, 0x107D,
+ 0x81FB, 0x1332, 0x81FC, 0x0408, 0x81FE, 0x0677, 0x81FF, 0x1BDE,
+ 0x8200, 0x0996, 0x8201, 0x1DBD, 0x8202, 0x0B71, 0x8204, 0x228B,
+ 0x8205, 0x0ED9, 0x8207, 0x107E, 0x8208, 0x1333, 0x8209, 0x1458,
+ 0x820A, 0x151A, 0x820B, 0x30EE, 0x820C, 0x0409, 0x820D, 0x0678,
+ 0x8210, 0x0997, 0x8211, 0x2013, 0x8212, 0x0D2C, 0x8214, 0x107F,
+ 0x8215, 0x27A5, 0x8216, 0x29D5, 0x821B, 0x040A, 0x821C, 0x0D2D,
+ 0x821D, 0x2529, 0x821E, 0x1080, 0x821F, 0x040B, 0x8220, 0x1A2E,
+ 0x8221, 0x1BDF, 0x8222, 0x07E8, 0x8225, 0x1DBF, 0x8228, 0x099A,
+ 0x822A, 0x0998, 0x822B, 0x0999, 0x822C, 0x099B, 0x822F, 0x1DBE,
+ 0x8232, 0x2018, 0x8233, 0x2015, 0x8234, 0x2017, 0x8235, 0x0B72,
+ 0x8236, 0x0B74, 0x8237, 0x0B73, 0x8238, 0x2014, 0x8239, 0x0B75,
+ 0x823A, 0x2016, 0x823C, 0x228C, 0x823D, 0x228D, 0x823F, 0x228E,
+ 0x8240, 0x252C, 0x8242, 0x252D, 0x8244, 0x252B, 0x8245, 0x252E,
+ 0x8247, 0x0EDA, 0x8249, 0x252A, 0x824B, 0x1081, 0x824E, 0x29DA,
+ 0x824F, 0x29D6, 0x8250, 0x29D9, 0x8251, 0x29DB, 0x8252, 0x29D8,
+ 0x8253, 0x29D7, 0x8255, 0x2C3C, 0x8256, 0x2C3D, 0x8257, 0x2C3E,
+ 0x8258, 0x1334, 0x8259, 0x1335, 0x825A, 0x2E0F, 0x825B, 0x2E0E,
+ 0x825C, 0x2E10, 0x825E, 0x2F96, 0x825F, 0x2F95, 0x8261, 0x30F0,
+ 0x8263, 0x30F1, 0x8264, 0x30EF, 0x8266, 0x1636, 0x8268, 0x321D,
+ 0x8269, 0x321E, 0x826B, 0x33A6, 0x826C, 0x342D, 0x826D, 0x3496,
+ 0x826E, 0x040C, 0x826F, 0x0504, 0x8271, 0x1459, 0x8272, 0x040D,
+ 0x8274, 0x2019, 0x8275, 0x228F, 0x8277, 0x172E, 0x8278, 0x1813,
+ 0x827C, 0x1814, 0x827D, 0x1816, 0x827E, 0x040E, 0x827F, 0x1817,
+ 0x8280, 0x1815, 0x8283, 0x18E5, 0x8284, 0x18E6, 0x8285, 0x18E0,
+ 0x828A, 0x18E4, 0x828B, 0x0506, 0x828D, 0x0507, 0x828E, 0x18E1,
+ 0x828F, 0x18DF, 0x8290, 0x18DE, 0x8291, 0x18E2, 0x8292, 0x0505,
+ 0x8293, 0x18E3, 0x8294, 0x1BE0, 0x8298, 0x1A33, 0x8299, 0x067B,
+ 0x829A, 0x1A32, 0x829B, 0x1A34, 0x829D, 0x067A, 0x829E, 0x1A39,
+ 0x829F, 0x067E, 0x82A0, 0x1A2F, 0x82A1, 0x1A3D, 0x82A2, 0x1A43,
+ 0x82A3, 0x0685, 0x82A4, 0x1A40, 0x82A5, 0x0682, 0x82A7, 0x1A36,
+ 0x82A8, 0x1A3C, 0x82A9, 0x1A3E, 0x82AB, 0x1A31, 0x82AC, 0x0681,
+ 0x82AD, 0x067C, 0x82AE, 0x1A37, 0x82AF, 0x0683, 0x82B0, 0x0686,
+ 0x82B1, 0x0680, 0x82B3, 0x0679, 0x82B4, 0x1A3B, 0x82B5, 0x1A35,
+ 0x82B6, 0x1A42, 0x82B7, 0x0688, 0x82B8, 0x0684, 0x82B9, 0x067F,
+ 0x82BA, 0x1A3A, 0x82BB, 0x099C, 0x82BC, 0x1A38, 0x82BD, 0x067D,
+ 0x82BE, 0x0687, 0x82C0, 0x1A30, 0x82C2, 0x1A3F, 0x82C3, 0x1A41,
+ 0x82D1, 0x07F9, 0x82D2, 0x07F3, 0x82D3, 0x07FB, 0x82D4, 0x07F8,
+ 0x82D5, 0x1BE7, 0x82D6, 0x1BEA, 0x82D7, 0x07F4, 0x82D9, 0x1BE1,
+ 0x82DB, 0x07ED, 0x82DC, 0x07F7, 0x82DE, 0x07FA, 0x82DF, 0x07FC,
+ 0x82E0, 0x1BF6, 0x82E1, 0x1BED, 0x82E3, 0x07EC, 0x82E4, 0x1BF5,
+ 0x82E5, 0x07F0, 0x82E6, 0x07EE, 0x82E7, 0x07E9, 0x82E8, 0x1BE5,
+ 0x82EA, 0x1BF4, 0x82EB, 0x1BE9, 0x82EC, 0x1BEC, 0x82ED, 0x1BF9,
+ 0x82EF, 0x07FD, 0x82F0, 0x1BF3, 0x82F1, 0x07F5, 0x82F2, 0x1BEE,
+ 0x82F3, 0x1BF8, 0x82F4, 0x1BEB, 0x82F5, 0x1BEF, 0x82F6, 0x1BF2,
+ 0x82F9, 0x1BE3, 0x82FA, 0x1BF7, 0x82FB, 0x1BF1, 0x82FE, 0x1BE2,
+ 0x8300, 0x1BE6, 0x8301, 0x07F6, 0x8302, 0x07F1, 0x8303, 0x07EA,
+ 0x8304, 0x07EF, 0x8305, 0x07EB, 0x8306, 0x07FE, 0x8307, 0x1BE4,
+ 0x8308, 0x1DD0, 0x8309, 0x07F2, 0x830C, 0x1BF0, 0x830D, 0x1A7D,
+ 0x8316, 0x1DD3, 0x8317, 0x09AA, 0x8319, 0x1DC3, 0x831B, 0x1DCE,
+ 0x831C, 0x1DCA, 0x831E, 0x1DDD, 0x8320, 0x1DD5, 0x8322, 0x1DCB,
+ 0x8324, 0x1DD4, 0x8325, 0x1DC5, 0x8326, 0x1DC9, 0x8327, 0x1DE0,
+ 0x8328, 0x09AD, 0x8329, 0x1DD8, 0x832A, 0x1DCF, 0x832B, 0x099D,
+ 0x832C, 0x1DDE, 0x832D, 0x1DC1, 0x832F, 0x1DD7, 0x8331, 0x09AC,
+ 0x8332, 0x09A7, 0x8333, 0x1DC0, 0x8334, 0x09A5, 0x8335, 0x09A4,
+ 0x8336, 0x09A9, 0x8337, 0x1DD6, 0x8338, 0x09A1, 0x8339, 0x09A8,
+ 0x833A, 0x1BE8, 0x833B, 0x2290, 0x833C, 0x1DD1, 0x833F, 0x1DC7,
+ 0x8340, 0x09AB, 0x8341, 0x1DC8, 0x8342, 0x1DCC, 0x8343, 0x09AE,
+ 0x8344, 0x1DC2, 0x8345, 0x1DDA, 0x8347, 0x1DD9, 0x8348, 0x1DE1,
+ 0x8349, 0x09A3, 0x834A, 0x09A0, 0x834B, 0x1DDF, 0x834C, 0x1DDB,
+ 0x834D, 0x1DD2, 0x834E, 0x1DCD, 0x834F, 0x09A6, 0x8350, 0x09A2,
+ 0x8351, 0x1DC4, 0x8352, 0x099E, 0x8353, 0x1DDC, 0x8354, 0x099F,
+ 0x8356, 0x1DC6, 0x8373, 0x201F, 0x8374, 0x2021, 0x8375, 0x2026,
+ 0x8376, 0x203A, 0x8377, 0x0B83, 0x8378, 0x0B79, 0x837A, 0x201E,
+ 0x837B, 0x0B84, 0x837C, 0x0B85, 0x837D, 0x2029, 0x837E, 0x2030,
+ 0x837F, 0x2036, 0x8381, 0x2023, 0x8383, 0x202A, 0x8386, 0x0B86,
+ 0x8387, 0x2038, 0x8388, 0x2033, 0x8389, 0x0B81, 0x838A, 0x0B7F,
+ 0x838B, 0x202F, 0x838C, 0x202B, 0x838D, 0x201D, 0x838E, 0x0B76,
+ 0x838F, 0x2022, 0x8390, 0x201A, 0x8392, 0x0B7E, 0x8393, 0x0B80,
+ 0x8394, 0x2027, 0x8395, 0x2024, 0x8396, 0x0B7B, 0x8397, 0x2034,
+ 0x8398, 0x0B78, 0x8399, 0x2025, 0x839A, 0x22B9, 0x839B, 0x202D,
+ 0x839D, 0x202C, 0x839E, 0x0B77, 0x83A0, 0x0B82, 0x83A2, 0x0B7A,
+ 0x83A3, 0x201B, 0x83A4, 0x2020, 0x83A5, 0x2031, 0x83A6, 0x2037,
+ 0x83A7, 0x0B87, 0x83A8, 0x201C, 0x83A9, 0x2028, 0x83AA, 0x202E,
+ 0x83AB, 0x0B7D, 0x83AE, 0x2039, 0x83AF, 0x2032, 0x83B0, 0x2035,
+ 0x83BD, 0x0B7C, 0x83BF, 0x22A0, 0x83C0, 0x2294, 0x83C1, 0x0D35,
+ 0x83C2, 0x22B1, 0x83C3, 0x22BA, 0x83C4, 0x22BD, 0x83C5, 0x0D33,
+ 0x83C6, 0x229C, 0x83C7, 0x22B5, 0x83C8, 0x229D, 0x83C9, 0x22AB,
+ 0x83CA, 0x0D40, 0x83CB, 0x22A7, 0x83CC, 0x0D3D, 0x83CE, 0x22A8,
+ 0x83CF, 0x2291, 0x83D1, 0x22B6, 0x83D4, 0x0D46, 0x83D5, 0x22B3,
+ 0x83D6, 0x22A9, 0x83D7, 0x22BF, 0x83D8, 0x22A4, 0x83D9, 0x254E,
+ 0x83DB, 0x22C2, 0x83DC, 0x0D44, 0x83DD, 0x22A2, 0x83DE, 0x22AE,
+ 0x83DF, 0x0D47, 0x83E0, 0x0D32, 0x83E1, 0x22A6, 0x83E2, 0x22C0,
+ 0x83E3, 0x229F, 0x83E4, 0x2298, 0x83E5, 0x22A3, 0x83E7, 0x2297,
+ 0x83E8, 0x2295, 0x83E9, 0x0D2E, 0x83EA, 0x22B7, 0x83EB, 0x229E,
+ 0x83EC, 0x22BB, 0x83EE, 0x22BC, 0x83EF, 0x0D36, 0x83F0, 0x0D3B,
+ 0x83F1, 0x0D37, 0x83F2, 0x0D3F, 0x83F3, 0x22B2, 0x83F4, 0x0D38,
+ 0x83F5, 0x22AA, 0x83F6, 0x229A, 0x83F8, 0x0D30, 0x83F9, 0x2292,
+ 0x83FA, 0x22B4, 0x83FB, 0x22BE, 0x83FC, 0x2299, 0x83FD, 0x0D3E,
+ 0x83FE, 0x22C3, 0x83FF, 0x22A5, 0x8401, 0x22A1, 0x8403, 0x0D2F,
+ 0x8404, 0x0D43, 0x8406, 0x22B0, 0x8407, 0x0D45, 0x8409, 0x22AC,
+ 0x840A, 0x0D3A, 0x840B, 0x0D34, 0x840C, 0x0D3C, 0x840D, 0x0D31,
+ 0x840E, 0x0D42, 0x840F, 0x22AD, 0x8410, 0x229B, 0x8411, 0x22AF,
+ 0x8412, 0x2296, 0x8413, 0x22B8, 0x841B, 0x22C1, 0x8423, 0x2293,
+ 0x8429, 0x254D, 0x842B, 0x2563, 0x842C, 0x0EAC, 0x842D, 0x2552,
+ 0x842F, 0x2550, 0x8430, 0x253B, 0x8431, 0x0EDE, 0x8432, 0x254B,
+ 0x8433, 0x255F, 0x8434, 0x2547, 0x8435, 0x0EE6, 0x8436, 0x255E,
+ 0x8437, 0x2545, 0x8438, 0x0D41, 0x8439, 0x2555, 0x843A, 0x2546,
+ 0x843B, 0x255C, 0x843C, 0x0EE5, 0x843D, 0x0EDD, 0x843F, 0x2530,
+ 0x8440, 0x2538, 0x8442, 0x2551, 0x8443, 0x2549, 0x8444, 0x2562,
+ 0x8445, 0x254C, 0x8446, 0x0EEB, 0x8447, 0x255D, 0x8449, 0x0EE2,
+ 0x844B, 0x254F, 0x844C, 0x2557, 0x844D, 0x253C, 0x844E, 0x2556,
+ 0x8450, 0x2567, 0x8451, 0x2537, 0x8452, 0x2558, 0x8454, 0x2565,
+ 0x8456, 0x2531, 0x8457, 0x0D39, 0x8459, 0x253F, 0x845A, 0x253E,
+ 0x845B, 0x0EE4, 0x845D, 0x2542, 0x845E, 0x2544, 0x845F, 0x2553,
+ 0x8460, 0x2564, 0x8461, 0x0EE7, 0x8463, 0x0EE8, 0x8465, 0x2536,
+ 0x8466, 0x0EE0, 0x8467, 0x253A, 0x8468, 0x2560, 0x8469, 0x0EE9,
+ 0x846B, 0x0EE1, 0x846C, 0x0EE3, 0x846D, 0x0EEA, 0x846E, 0x2566,
+ 0x846F, 0x2559, 0x8470, 0x2554, 0x8473, 0x2541, 0x8474, 0x2540,
+ 0x8475, 0x0EDF, 0x8476, 0x2532, 0x8477, 0x0EDC, 0x8478, 0x254A,
+ 0x8479, 0x2533, 0x847A, 0x2548, 0x847D, 0x253D, 0x847E, 0x2561,
+ 0x8482, 0x0EDB, 0x8486, 0x2539, 0x848D, 0x2535, 0x848E, 0x255B,
+ 0x848F, 0x2534, 0x8490, 0x108E, 0x8491, 0x27CD, 0x8494, 0x27BC,
+ 0x8497, 0x27A6, 0x8498, 0x27C4, 0x8499, 0x1086, 0x849A, 0x27B5,
+ 0x849B, 0x27BF, 0x849C, 0x1089, 0x849D, 0x27B8, 0x849E, 0x1087,
+ 0x849F, 0x27A9, 0x84A0, 0x27C7, 0x84A1, 0x27A8, 0x84A2, 0x27BB,
+ 0x84A4, 0x27A7, 0x84A7, 0x27B9, 0x84A8, 0x27C2, 0x84A9, 0x27C0,
+ 0x84AA, 0x27B4, 0x84AB, 0x27AF, 0x84AC, 0x27AD, 0x84AE, 0x27AE,
+ 0x84AF, 0x27C1, 0x84B0, 0x27CC, 0x84B1, 0x27B6, 0x84B2, 0x1088,
+ 0x84B4, 0x27B1, 0x84B6, 0x27C5, 0x84B8, 0x108B, 0x84B9, 0x27B0,
+ 0x84BA, 0x27AA, 0x84BB, 0x27BA, 0x84BC, 0x108F, 0x84BF, 0x1083,
+ 0x84C0, 0x108C, 0x84C1, 0x27B2, 0x84C2, 0x27AC, 0x84C4, 0x1085,
+ 0x84C5, 0x255A, 0x84C6, 0x1084, 0x84C7, 0x27BD, 0x84C9, 0x1082,
+ 0x84CA, 0x1091, 0x84CB, 0x108A, 0x84CC, 0x27BE, 0x84CD, 0x27B3,
+ 0x84CE, 0x27AB, 0x84CF, 0x27C6, 0x84D0, 0x27B7, 0x84D1, 0x1090,
+ 0x84D2, 0x27CA, 0x84D3, 0x108D, 0x84D4, 0x27C9, 0x84D6, 0x27C3,
+ 0x84D7, 0x27C8, 0x84DB, 0x27CB, 0x84E7, 0x2A03, 0x84E8, 0x2A04,
+ 0x84E9, 0x29F7, 0x84EA, 0x29F6, 0x84EB, 0x29F2, 0x84EC, 0x11FB,
+ 0x84EE, 0x11F3, 0x84EF, 0x2A06, 0x84F0, 0x2A05, 0x84F1, 0x252F,
+ 0x84F2, 0x29EF, 0x84F3, 0x29F3, 0x84F4, 0x29ED, 0x84F6, 0x2A00,
+ 0x84F7, 0x29F1, 0x84F9, 0x2A07, 0x84FA, 0x29EA, 0x84FB, 0x29E8,
+ 0x84FC, 0x29F4, 0x84FD, 0x29FE, 0x84FE, 0x29F9, 0x84FF, 0x11FD,
+ 0x8500, 0x29DF, 0x8502, 0x29FD, 0x8506, 0x11FE, 0x8507, 0x2543,
+ 0x8508, 0x29EB, 0x8509, 0x29E2, 0x850A, 0x29E5, 0x850B, 0x2A0B,
+ 0x850C, 0x29EC, 0x850D, 0x29E3, 0x850E, 0x29E1, 0x850F, 0x29DE,
+ 0x8511, 0x11F7, 0x8512, 0x29F5, 0x8513, 0x11F6, 0x8514, 0x11FA,
+ 0x8515, 0x29F0, 0x8516, 0x29F8, 0x8517, 0x11F0, 0x8518, 0x2A08,
+ 0x8519, 0x2A0C, 0x851A, 0x11F2, 0x851C, 0x29E7, 0x851D, 0x29FB,
+ 0x851E, 0x29FF, 0x851F, 0x29E4, 0x8520, 0x2A09, 0x8521, 0x11F9,
+ 0x8523, 0x11F8, 0x8524, 0x29DC, 0x8525, 0x11FC, 0x8526, 0x2A02,
+ 0x8527, 0x29E6, 0x8528, 0x29FA, 0x8529, 0x29E0, 0x852A, 0x29EE,
+ 0x852B, 0x29E9, 0x852C, 0x11F4, 0x852D, 0x11F5, 0x852E, 0x29FC,
+ 0x852F, 0x2A0D, 0x8530, 0x2A0A, 0x8531, 0x2A01, 0x853B, 0x29DD,
+ 0x853D, 0x11F1, 0x853E, 0x2C4F, 0x8540, 0x2C46, 0x8541, 0x2C49,
+ 0x8543, 0x133B, 0x8544, 0x2C4B, 0x8545, 0x2C40, 0x8546, 0x2C47,
+ 0x8547, 0x2C4D, 0x8548, 0x1338, 0x8549, 0x133C, 0x854A, 0x1336,
+ 0x854D, 0x2C42, 0x854E, 0x2C52, 0x8551, 0x2C4C, 0x8553, 0x2C43,
+ 0x8554, 0x2C5B, 0x8555, 0x2C55, 0x8556, 0x2C3F, 0x8557, 0x2E23,
+ 0x8558, 0x2C45, 0x8559, 0x1337, 0x855B, 0x2C50, 0x855D, 0x2C5A,
+ 0x855E, 0x133F, 0x8560, 0x2C57, 0x8561, 0x2C44, 0x8562, 0x2C4A,
+ 0x8563, 0x2C4E, 0x8564, 0x2C48, 0x8565, 0x2C5C, 0x8566, 0x2C59,
+ 0x8567, 0x2C56, 0x8568, 0x1339, 0x8569, 0x133A, 0x856A, 0x133E,
+ 0x856B, 0x2C41, 0x856C, 0x2C5D, 0x856D, 0x133D, 0x856E, 0x2C53,
+ 0x8571, 0x2C51, 0x8575, 0x2C54, 0x8576, 0x2E30, 0x8577, 0x2E1D,
+ 0x8578, 0x2E22, 0x8579, 0x2E2F, 0x857A, 0x2E21, 0x857B, 0x2E19,
+ 0x857C, 0x2E1E, 0x857E, 0x145C, 0x8580, 0x2E12, 0x8581, 0x2E2A,
+ 0x8582, 0x2E2C, 0x8583, 0x2E11, 0x8584, 0x145B, 0x8585, 0x2E2E,
+ 0x8586, 0x2E26, 0x8587, 0x1462, 0x8588, 0x2E2D, 0x8589, 0x2E1F,
+ 0x858A, 0x1464, 0x858B, 0x2E17, 0x858C, 0x2C58, 0x858D, 0x2E27,
+ 0x858E, 0x2E24, 0x858F, 0x2E13, 0x8590, 0x2E32, 0x8591, 0x145E,
+ 0x8594, 0x145F, 0x8595, 0x2E15, 0x8596, 0x2E25, 0x8598, 0x2E31,
+ 0x8599, 0x2E28, 0x859A, 0x2E1B, 0x859B, 0x1461, 0x859C, 0x145D,
+ 0x859D, 0x2E29, 0x859E, 0x2E1C, 0x859F, 0x2E33, 0x85A0, 0x2E16,
+ 0x85A1, 0x2E20, 0x85A2, 0x2E2B, 0x85A3, 0x2E18, 0x85A4, 0x2E1A,
+ 0x85A6, 0x1465, 0x85A7, 0x2E14, 0x85A8, 0x1463, 0x85A9, 0x151C,
+ 0x85AA, 0x145A, 0x85AF, 0x1460, 0x85B0, 0x1520, 0x85B1, 0x2FA6,
+ 0x85B3, 0x2F9C, 0x85B4, 0x2F97, 0x85B5, 0x2F9D, 0x85B6, 0x2FA7,
+ 0x85B7, 0x2FAB, 0x85B8, 0x2FAA, 0x85B9, 0x1522, 0x85BA, 0x1521,
+ 0x85BD, 0x2F9E, 0x85BE, 0x2FAC, 0x85BF, 0x2FA1, 0x85C0, 0x2F99,
+ 0x85C2, 0x2F9B, 0x85C3, 0x2F9A, 0x85C4, 0x2FA0, 0x85C5, 0x2FA5,
+ 0x85C6, 0x2F98, 0x85C7, 0x2F9F, 0x85C8, 0x2FA4, 0x85C9, 0x151F,
+ 0x85CB, 0x2FA2, 0x85CD, 0x151D, 0x85CE, 0x2FA3, 0x85CF, 0x151B,
+ 0x85D0, 0x151E, 0x85D1, 0x3101, 0x85D2, 0x2FA8, 0x85D5, 0x15B7,
+ 0x85D7, 0x30F9, 0x85D8, 0x30FD, 0x85D9, 0x30F5, 0x85DA, 0x30F8,
+ 0x85DC, 0x3100, 0x85DD, 0x15B5, 0x85DE, 0x3105, 0x85DF, 0x30FE,
+ 0x85E1, 0x30F6, 0x85E2, 0x3106, 0x85E3, 0x30FF, 0x85E4, 0x15B8,
+ 0x85E5, 0x15B9, 0x85E6, 0x3103, 0x85E8, 0x30F7, 0x85E9, 0x15B4,
+ 0x85EA, 0x15B6, 0x85EB, 0x30F2, 0x85EC, 0x30FA, 0x85ED, 0x30F4,
+ 0x85EF, 0x3104, 0x85F0, 0x3102, 0x85F1, 0x30F3, 0x85F2, 0x30FB,
+ 0x85F6, 0x3225, 0x85F7, 0x15BA, 0x85F8, 0x30FC, 0x85F9, 0x1638,
+ 0x85FA, 0x163A, 0x85FB, 0x1637, 0x85FD, 0x322A, 0x85FE, 0x3222,
+ 0x85FF, 0x3220, 0x8600, 0x3224, 0x8601, 0x3221, 0x8604, 0x3226,
+ 0x8605, 0x3228, 0x8606, 0x163B, 0x8607, 0x163D, 0x8609, 0x3227,
+ 0x860A, 0x163E, 0x860B, 0x163C, 0x860C, 0x3229, 0x8611, 0x1639,
+ 0x8617, 0x1685, 0x8618, 0x32F6, 0x8619, 0x32FC, 0x861A, 0x1687,
+ 0x861B, 0x3223, 0x861C, 0x32FB, 0x861E, 0x3302, 0x861F, 0x32F9,
+ 0x8620, 0x3300, 0x8621, 0x32FF, 0x8622, 0x321F, 0x8623, 0x32FA,
+ 0x8624, 0x2FA9, 0x8625, 0x3303, 0x8626, 0x32F8, 0x8627, 0x32FD,
+ 0x8629, 0x3301, 0x862A, 0x32F7, 0x862C, 0x33AA, 0x862D, 0x1686,
+ 0x862E, 0x32FE, 0x8631, 0x3432, 0x8632, 0x33AB, 0x8633, 0x33A9,
+ 0x8634, 0x33A7, 0x8635, 0x33A8, 0x8636, 0x33AC, 0x8638, 0x1707,
+ 0x8639, 0x3430, 0x863A, 0x342E, 0x863B, 0x3433, 0x863C, 0x3431,
+ 0x863E, 0x3434, 0x863F, 0x1708, 0x8640, 0x342F, 0x8643, 0x3497,
+ 0x8646, 0x34DF, 0x8647, 0x34E0, 0x8648, 0x34E1, 0x864B, 0x353E,
+ 0x864C, 0x3536, 0x864D, 0x1818, 0x864E, 0x0689, 0x8650, 0x07FF,
+ 0x8652, 0x1DE3, 0x8653, 0x1DE2, 0x8654, 0x09AF, 0x8655, 0x0B88,
+ 0x8656, 0x203C, 0x8659, 0x203B, 0x865B, 0x0D48, 0x865C, 0x0EED,
+ 0x865E, 0x0EEC, 0x865F, 0x0EEE, 0x8661, 0x27CE, 0x8662, 0x2A0E,
+ 0x8663, 0x2C5E, 0x8664, 0x2C60, 0x8665, 0x2C5F, 0x8667, 0x1466,
+ 0x8668, 0x2E34, 0x8669, 0x2FAD, 0x866A, 0x351E, 0x866B, 0x040F,
+ 0x866D, 0x1A46, 0x866E, 0x1A47, 0x866F, 0x1A45, 0x8670, 0x1A44,
+ 0x8671, 0x068A, 0x8673, 0x1BFD, 0x8674, 0x1BFB, 0x8677, 0x1BFA,
+ 0x8679, 0x0800, 0x867A, 0x0802, 0x867B, 0x0801, 0x867C, 0x1BFC,
+ 0x8685, 0x1DEF, 0x8686, 0x1DEC, 0x8687, 0x1DEA, 0x868A, 0x09B0,
+ 0x868B, 0x1DED, 0x868C, 0x09B5, 0x868D, 0x1DE7, 0x868E, 0x1DF6,
+ 0x8690, 0x1DF8, 0x8691, 0x1DE8, 0x8693, 0x09B2, 0x8694, 0x1DF9,
+ 0x8695, 0x1DF4, 0x8696, 0x1DE6, 0x8697, 0x1DEB, 0x8698, 0x1DF5,
+ 0x8699, 0x1DF1, 0x869A, 0x1DEE, 0x869C, 0x09B7, 0x869D, 0x1DF7,
+ 0x869E, 0x1DE9, 0x86A1, 0x1DF2, 0x86A2, 0x1DE4, 0x86A3, 0x09B6,
+ 0x86A4, 0x09B3, 0x86A5, 0x1DF0, 0x86A7, 0x1DF3, 0x86A8, 0x1DE5,
+ 0x86A9, 0x09B4, 0x86AA, 0x09B1, 0x86AF, 0x0B92, 0x86B0, 0x2043,
+ 0x86B1, 0x0B91, 0x86B3, 0x2046, 0x86B4, 0x2049, 0x86B5, 0x0B8E,
+ 0x86B6, 0x0B8C, 0x86B7, 0x203E, 0x86B8, 0x2047, 0x86B9, 0x2045,
+ 0x86BA, 0x2042, 0x86BB, 0x204A, 0x86BC, 0x204B, 0x86BD, 0x204D,
+ 0x86BE, 0x204E, 0x86BF, 0x203D, 0x86C0, 0x0B8B, 0x86C1, 0x2040,
+ 0x86C2, 0x203F, 0x86C3, 0x204C, 0x86C4, 0x0B8D, 0x86C5, 0x2041,
+ 0x86C6, 0x0B8F, 0x86C7, 0x0B8A, 0x86C8, 0x2044, 0x86C9, 0x0B93,
+ 0x86CB, 0x0B90, 0x86CC, 0x2048, 0x86D0, 0x0D4F, 0x86D1, 0x22D2,
+ 0x86D3, 0x22C7, 0x86D4, 0x0D4C, 0x86D6, 0x256D, 0x86D7, 0x22D0,
+ 0x86D8, 0x22C4, 0x86D9, 0x0D4A, 0x86DA, 0x22C9, 0x86DB, 0x0D4D,
+ 0x86DC, 0x22CD, 0x86DD, 0x22CB, 0x86DE, 0x0D50, 0x86DF, 0x0D49,
+ 0x86E2, 0x22C5, 0x86E3, 0x22C8, 0x86E4, 0x0D4E, 0x86E6, 0x22C6,
+ 0x86E8, 0x22D1, 0x86E9, 0x22CF, 0x86EA, 0x22CA, 0x86EB, 0x22CC,
+ 0x86EC, 0x22CE, 0x86ED, 0x0D4B, 0x86F5, 0x256E, 0x86F6, 0x2574,
+ 0x86F7, 0x256A, 0x86F8, 0x2570, 0x86F9, 0x0EEF, 0x86FA, 0x256C,
+ 0x86FB, 0x0EF5, 0x86FE, 0x0EF4, 0x8700, 0x0EF3, 0x8701, 0x2573,
+ 0x8702, 0x0EF6, 0x8703, 0x0EF7, 0x8704, 0x2569, 0x8705, 0x2576,
+ 0x8706, 0x0EF8, 0x8707, 0x0EF2, 0x8708, 0x0EF1, 0x8709, 0x2572,
+ 0x870A, 0x0EF9, 0x870B, 0x2568, 0x870C, 0x256B, 0x870D, 0x2575,
+ 0x870E, 0x2571, 0x8711, 0x27EE, 0x8712, 0x27E3, 0x8713, 0x0EF0,
+ 0x8718, 0x1098, 0x8719, 0x27D7, 0x871A, 0x27EC, 0x871B, 0x27D8,
+ 0x871C, 0x1093, 0x871E, 0x27D5, 0x8720, 0x27DE, 0x8721, 0x27D6,
+ 0x8722, 0x1095, 0x8723, 0x27D0, 0x8724, 0x27EB, 0x8725, 0x1096,
+ 0x8726, 0x27E8, 0x8727, 0x27E9, 0x8728, 0x27D1, 0x8729, 0x109B,
+ 0x872A, 0x27E0, 0x872C, 0x27DA, 0x872D, 0x27E1, 0x872E, 0x27D4,
+ 0x8730, 0x27ED, 0x8731, 0x27E5, 0x8732, 0x27DF, 0x8733, 0x27CF,
+ 0x8734, 0x1097, 0x8735, 0x27E6, 0x8737, 0x109A, 0x8738, 0x27EA,
+ 0x873A, 0x27E4, 0x873B, 0x1094, 0x873C, 0x27E2, 0x873E, 0x27DC,
+ 0x873F, 0x1092, 0x8740, 0x27D3, 0x8741, 0x27DB, 0x8742, 0x27E7,
+ 0x8743, 0x27D9, 0x8746, 0x27DD, 0x874C, 0x1208, 0x874D, 0x256F,
+ 0x874E, 0x2A20, 0x874F, 0x2A29, 0x8750, 0x2A1F, 0x8751, 0x2A1B,
+ 0x8752, 0x2A18, 0x8753, 0x1209, 0x8754, 0x2A16, 0x8755, 0x1099,
+ 0x8756, 0x2A0F, 0x8757, 0x1207, 0x8758, 0x2A15, 0x8759, 0x1206,
+ 0x875A, 0x2A1A, 0x875B, 0x2A17, 0x875C, 0x2A27, 0x875D, 0x2A22,
+ 0x875E, 0x2A1C, 0x875F, 0x2A21, 0x8760, 0x1202, 0x8761, 0x2A19,
+ 0x8762, 0x2A2C, 0x8763, 0x2A10, 0x8764, 0x2A11, 0x8765, 0x2A28,
+ 0x8766, 0x1203, 0x8767, 0x2A2D, 0x8768, 0x1205, 0x8769, 0x2A2E,
+ 0x876A, 0x2A1E, 0x876B, 0x27D2, 0x876C, 0x2A24, 0x876D, 0x2A1D,
+ 0x876E, 0x2A26, 0x876F, 0x2A23, 0x8773, 0x2A14, 0x8774, 0x1200,
+ 0x8775, 0x2A2B, 0x8776, 0x1201, 0x8777, 0x2A12, 0x8778, 0x1204,
+ 0x8779, 0x2C6B, 0x877A, 0x2A25, 0x877B, 0x2A2A, 0x8781, 0x2C68,
+ 0x8782, 0x11FF, 0x8783, 0x1340, 0x8784, 0x2C72, 0x8785, 0x2C6E,
+ 0x8787, 0x2C6C, 0x8788, 0x2C67, 0x8789, 0x2C76, 0x878D, 0x1344,
+ 0x878F, 0x2C63, 0x8790, 0x2C6F, 0x8791, 0x2C70, 0x8792, 0x2C66,
+ 0x8793, 0x2C65, 0x8794, 0x2C73, 0x8796, 0x2C69, 0x8797, 0x2C64,
+ 0x8798, 0x2C6A, 0x879A, 0x2C75, 0x879B, 0x2C62, 0x879C, 0x2C74,
+ 0x879D, 0x2C71, 0x879E, 0x1342, 0x879F, 0x1341, 0x87A2, 0x1343,
+ 0x87A3, 0x2C6D, 0x87A4, 0x2C61, 0x87AA, 0x2E36, 0x87AB, 0x146C,
+ 0x87AC, 0x2E3A, 0x87AD, 0x2E37, 0x87AE, 0x2E3E, 0x87AF, 0x2E44,
+ 0x87B0, 0x2E39, 0x87B2, 0x2E4D, 0x87B3, 0x1469, 0x87B4, 0x2E47,
+ 0x87B5, 0x2E3C, 0x87B6, 0x2E48, 0x87B7, 0x2E43, 0x87B8, 0x2E4A,
+ 0x87B9, 0x2E3B, 0x87BA, 0x146E, 0x87BB, 0x146D, 0x87BC, 0x2E3D,
+ 0x87BD, 0x2E4B, 0x87BE, 0x2E35, 0x87BF, 0x2E49, 0x87C0, 0x1467,
+ 0x87C2, 0x2E41, 0x87C3, 0x2E40, 0x87C4, 0x2E45, 0x87C5, 0x2E38,
+ 0x87C6, 0x146B, 0x87C8, 0x146F, 0x87C9, 0x2E3F, 0x87CA, 0x2E46,
+ 0x87CB, 0x1470, 0x87CC, 0x2E42, 0x87D1, 0x1468, 0x87D2, 0x146A,
+ 0x87D3, 0x2FBA, 0x87D4, 0x2FB8, 0x87D7, 0x2FBE, 0x87D8, 0x2FBC,
+ 0x87D9, 0x2FBF, 0x87DB, 0x2FB1, 0x87DC, 0x2FB9, 0x87DD, 0x2FC3,
+ 0x87DE, 0x2E4C, 0x87DF, 0x2FB5, 0x87E0, 0x1526, 0x87E1, 0x2A13,
+ 0x87E2, 0x2FB0, 0x87E3, 0x2FBD, 0x87E4, 0x2FB7, 0x87E5, 0x2FB4,
+ 0x87E6, 0x2FAF, 0x87E7, 0x2FAE, 0x87E8, 0x2FC2, 0x87EA, 0x2FB3,
+ 0x87EB, 0x2FB2, 0x87EC, 0x1524, 0x87ED, 0x2FBB, 0x87EF, 0x1523,
+ 0x87F2, 0x1525, 0x87F3, 0x2FB6, 0x87F4, 0x2FC1, 0x87F6, 0x310A,
+ 0x87F7, 0x310B, 0x87F9, 0x15BE, 0x87FA, 0x3108, 0x87FB, 0x15BB,
+ 0x87FC, 0x3110, 0x87FE, 0x15BF, 0x87FF, 0x3112, 0x8800, 0x3107,
+ 0x8801, 0x2FC0, 0x8802, 0x3114, 0x8803, 0x3109, 0x8805, 0x15BC,
+ 0x8806, 0x310F, 0x8808, 0x3111, 0x8809, 0x310C, 0x880A, 0x3113,
+ 0x880B, 0x310E, 0x880C, 0x310D, 0x880D, 0x15BD, 0x8810, 0x322C,
+ 0x8811, 0x322D, 0x8813, 0x322F, 0x8814, 0x163F, 0x8815, 0x1640,
+ 0x8816, 0x3230, 0x8817, 0x322E, 0x8819, 0x322B, 0x881B, 0x3306,
+ 0x881C, 0x3309, 0x881D, 0x3305, 0x881F, 0x168B, 0x8820, 0x3307,
+ 0x8821, 0x168A, 0x8822, 0x1689, 0x8823, 0x1688, 0x8824, 0x3308,
+ 0x8825, 0x33B1, 0x8826, 0x33AF, 0x8828, 0x33AE, 0x8829, 0x3304,
+ 0x882A, 0x33B0, 0x882B, 0x330A, 0x882C, 0x33AD, 0x882E, 0x3437,
+ 0x882F, 0x3415, 0x8830, 0x3435, 0x8831, 0x1709, 0x8832, 0x3436,
+ 0x8833, 0x3438, 0x8835, 0x349A, 0x8836, 0x1728, 0x8837, 0x3499,
+ 0x8838, 0x3498, 0x8839, 0x1729, 0x883B, 0x1747, 0x883C, 0x3508,
+ 0x883D, 0x3520, 0x883E, 0x351F, 0x883F, 0x3521, 0x8840, 0x0410,
+ 0x8841, 0x1BFE, 0x8843, 0x1DFA, 0x8844, 0x1DFB, 0x8848, 0x22D3,
+ 0x884A, 0x330B, 0x884B, 0x349B, 0x884C, 0x0411, 0x884D, 0x0803,
+ 0x884E, 0x1BFF, 0x8852, 0x204F, 0x8853, 0x0B94, 0x8855, 0x22D5,
+ 0x8856, 0x22D4, 0x8857, 0x0D51, 0x8859, 0x0EFA, 0x885A, 0x2A2F,
+ 0x885B, 0x120A, 0x885D, 0x120B, 0x8861, 0x1345, 0x8862, 0x172A,
+ 0x8863, 0x0412, 0x8867, 0x1C00, 0x8868, 0x068C, 0x8869, 0x1C02,
+ 0x886A, 0x1C01, 0x886B, 0x0804, 0x886D, 0x1DFC, 0x886F, 0x1E03,
+ 0x8870, 0x09B8, 0x8871, 0x1E01, 0x8872, 0x1DFF, 0x8874, 0x1E06,
+ 0x8875, 0x1DFD, 0x8876, 0x1DFE, 0x8877, 0x09B9, 0x8879, 0x09BD,
+ 0x887C, 0x1E07, 0x887D, 0x09BC, 0x887E, 0x1E05, 0x887F, 0x1E02,
+ 0x8880, 0x1E00, 0x8881, 0x09BA, 0x8882, 0x09BB, 0x8883, 0x1E04,
+ 0x8888, 0x0B96, 0x8889, 0x2050, 0x888B, 0x0B9B, 0x888C, 0x2060,
+ 0x888D, 0x0B9A, 0x888E, 0x2062, 0x8891, 0x2056, 0x8892, 0x0B98,
+ 0x8893, 0x2061, 0x8895, 0x2051, 0x8896, 0x0B99, 0x8897, 0x205D,
+ 0x8898, 0x2059, 0x8899, 0x205B, 0x889A, 0x2055, 0x889B, 0x205C,
+ 0x889E, 0x0B95, 0x889F, 0x2058, 0x88A1, 0x2057, 0x88A2, 0x2053,
+ 0x88A4, 0x205E, 0x88A7, 0x205A, 0x88A8, 0x2052, 0x88AA, 0x2054,
+ 0x88AB, 0x0B97, 0x88AC, 0x205F, 0x88B1, 0x0D54, 0x88B2, 0x22E0,
+ 0x88B6, 0x22DC, 0x88B7, 0x22DE, 0x88B8, 0x22D9, 0x88B9, 0x22D8,
+ 0x88BA, 0x22D6, 0x88BC, 0x22DD, 0x88BD, 0x22DF, 0x88BE, 0x22DB,
+ 0x88C0, 0x22DA, 0x88C1, 0x0D52, 0x88C2, 0x0D53, 0x88C9, 0x22E2,
+ 0x88CA, 0x0F02, 0x88CB, 0x2578, 0x88CC, 0x257E, 0x88CD, 0x2579,
+ 0x88CE, 0x257A, 0x88CF, 0x36EA, 0x88D0, 0x257F, 0x88D2, 0x0F04,
+ 0x88D4, 0x0EFC, 0x88D5, 0x0F03, 0x88D6, 0x2577, 0x88D7, 0x22D7,
+ 0x88D8, 0x0EFF, 0x88D9, 0x0EFD, 0x88DA, 0x257D, 0x88DB, 0x257C,
+ 0x88DC, 0x0EFE, 0x88DD, 0x0F00, 0x88DE, 0x257B, 0x88DF, 0x0EFB,
+ 0x88E1, 0x0F01, 0x88E7, 0x27F0, 0x88E8, 0x10A2, 0x88EB, 0x27FB,
+ 0x88EC, 0x27FA, 0x88EE, 0x27F5, 0x88EF, 0x10A4, 0x88F0, 0x27F9,
+ 0x88F1, 0x27F1, 0x88F2, 0x27F2, 0x88F3, 0x109C, 0x88F4, 0x109E,
+ 0x88F6, 0x27F7, 0x88F7, 0x27EF, 0x88F8, 0x10A0, 0x88F9, 0x109F,
+ 0x88FA, 0x27F3, 0x88FB, 0x27F8, 0x88FC, 0x27F6, 0x88FD, 0x10A1,
+ 0x88FE, 0x27F4, 0x8901, 0x22E1, 0x8902, 0x109D, 0x8905, 0x2A30,
+ 0x8906, 0x2A37, 0x8907, 0x120D, 0x8909, 0x2A3B, 0x890A, 0x1211,
+ 0x890B, 0x2A33, 0x890C, 0x2A31, 0x890E, 0x2A3A, 0x8910, 0x120C,
+ 0x8911, 0x2A39, 0x8912, 0x120E, 0x8913, 0x120F, 0x8914, 0x2A32,
+ 0x8915, 0x1210, 0x8916, 0x2A38, 0x8917, 0x2A34, 0x8918, 0x2A35,
+ 0x8919, 0x2A36, 0x891A, 0x10A3, 0x891E, 0x2C77, 0x891F, 0x2C83,
+ 0x8921, 0x134A, 0x8922, 0x2C7E, 0x8923, 0x2C80, 0x8925, 0x1348,
+ 0x8926, 0x2C78, 0x8927, 0x2C7C, 0x8929, 0x2C7F, 0x892A, 0x1346,
+ 0x892B, 0x1349, 0x892C, 0x2C82, 0x892D, 0x2C7A, 0x892E, 0x2C7B,
+ 0x892F, 0x2C81, 0x8930, 0x2C79, 0x8931, 0x2C7D, 0x8932, 0x1347,
+ 0x8933, 0x2E4F, 0x8935, 0x2E4E, 0x8936, 0x1472, 0x8937, 0x2E54,
+ 0x8938, 0x1474, 0x893B, 0x1471, 0x893C, 0x2E50, 0x893D, 0x1475,
+ 0x893E, 0x2E51, 0x8941, 0x2E52, 0x8942, 0x2E55, 0x8944, 0x1473,
+ 0x8946, 0x2FC8, 0x8949, 0x2FCB, 0x894B, 0x2FC5, 0x894C, 0x2FC7,
+ 0x894F, 0x2FC6, 0x8950, 0x2FC9, 0x8951, 0x2FCA, 0x8952, 0x2E53,
+ 0x8953, 0x2FC4, 0x8956, 0x15C2, 0x8957, 0x3118, 0x8958, 0x311B,
+ 0x8959, 0x311D, 0x895A, 0x3116, 0x895B, 0x3117, 0x895C, 0x311A,
+ 0x895D, 0x311C, 0x895E, 0x15C3, 0x895F, 0x15C1, 0x8960, 0x15C0,
+ 0x8961, 0x3119, 0x8962, 0x3115, 0x8963, 0x3231, 0x8964, 0x1641,
+ 0x8966, 0x3232, 0x8969, 0x330D, 0x896A, 0x168C, 0x896B, 0x330F,
+ 0x896C, 0x168D, 0x896D, 0x330C, 0x896E, 0x330E, 0x896F, 0x16D6,
+ 0x8971, 0x33B2, 0x8972, 0x16D5, 0x8973, 0x343B, 0x8974, 0x343A,
+ 0x8976, 0x3439, 0x8979, 0x34E2, 0x897A, 0x34E3, 0x897B, 0x34E5,
+ 0x897C, 0x34E4, 0x897E, 0x1819, 0x897F, 0x0413, 0x8981, 0x0805,
+ 0x8982, 0x2063, 0x8983, 0x0D55, 0x8985, 0x2580, 0x8986, 0x1527,
+ 0x8988, 0x311E, 0x898B, 0x0508, 0x898F, 0x0B9D, 0x8993, 0x0B9C,
+ 0x8995, 0x22E3, 0x8996, 0x0D56, 0x8997, 0x22E5, 0x8998, 0x22E4,
+ 0x899B, 0x2581, 0x899C, 0x0F05, 0x899D, 0x27FC, 0x899E, 0x27FF,
+ 0x899F, 0x27FE, 0x89A1, 0x27FD, 0x89A2, 0x2A3C, 0x89A3, 0x2A3E,
+ 0x89A4, 0x2A3D, 0x89A6, 0x134C, 0x89AA, 0x134B, 0x89AC, 0x1476,
+ 0x89AD, 0x2E56, 0x89AE, 0x2E58, 0x89AF, 0x2E57, 0x89B2, 0x1528,
+ 0x89B6, 0x3120, 0x89B7, 0x311F, 0x89B9, 0x3233, 0x89BA, 0x1642,
+ 0x89BD, 0x168E, 0x89BE, 0x33B4, 0x89BF, 0x33B3, 0x89C0, 0x1748,
+ 0x89D2, 0x0509, 0x89D3, 0x1C03, 0x89D4, 0x0806, 0x89D5, 0x2066,
+ 0x89D6, 0x2064, 0x89D9, 0x2065, 0x89DA, 0x22E7, 0x89DB, 0x22E8,
+ 0x89DC, 0x2588, 0x89DD, 0x22E6, 0x89DF, 0x2582, 0x89E0, 0x2586,
+ 0x89E1, 0x2585, 0x89E2, 0x2587, 0x89E3, 0x0F06, 0x89E4, 0x2584,
+ 0x89E5, 0x2583, 0x89E6, 0x2589, 0x89E8, 0x2802, 0x89E9, 0x2800,
+ 0x89EB, 0x2801, 0x89EC, 0x2A41, 0x89ED, 0x2A3F, 0x89F0, 0x2A40,
+ 0x89F1, 0x2C84, 0x89F2, 0x2E59, 0x89F3, 0x2E5A, 0x89F4, 0x1529,
+ 0x89F6, 0x3121, 0x89F7, 0x3234, 0x89F8, 0x1643, 0x89FA, 0x3310,
+ 0x89FB, 0x33B5, 0x89FC, 0x16D7, 0x89FE, 0x343C, 0x89FF, 0x34E6,
+ 0x8A00, 0x050A, 0x8A02, 0x0808, 0x8A03, 0x0809, 0x8A04, 0x1C04,
+ 0x8A07, 0x1C05, 0x8A08, 0x0807, 0x8A0A, 0x09C3, 0x8A0C, 0x09C1,
+ 0x8A0E, 0x09C0, 0x8A0F, 0x09C7, 0x8A10, 0x09BF, 0x8A11, 0x09C8,
+ 0x8A12, 0x1E08, 0x8A13, 0x09C5, 0x8A15, 0x09C2, 0x8A16, 0x09C6,
+ 0x8A17, 0x09C4, 0x8A18, 0x09BE, 0x8A1B, 0x0BA5, 0x8A1D, 0x0B9F,
+ 0x8A1E, 0x206A, 0x8A1F, 0x0BA4, 0x8A22, 0x0BA6, 0x8A23, 0x0BA0,
+ 0x8A25, 0x0BA1, 0x8A27, 0x2068, 0x8A2A, 0x0B9E, 0x8A2C, 0x2069,
+ 0x8A2D, 0x0BA3, 0x8A30, 0x2067, 0x8A31, 0x0BA2, 0x8A34, 0x0D61,
+ 0x8A36, 0x0D63, 0x8A39, 0x22EB, 0x8A3A, 0x0D62, 0x8A3B, 0x0D57,
+ 0x8A3C, 0x0D5B, 0x8A3E, 0x0F19, 0x8A3F, 0x258E, 0x8A40, 0x22ED,
+ 0x8A41, 0x0D5C, 0x8A44, 0x22F0, 0x8A45, 0x22F1, 0x8A46, 0x0D60,
+ 0x8A48, 0x22F3, 0x8A4A, 0x22F5, 0x8A4C, 0x22F6, 0x8A4D, 0x22EA,
+ 0x8A4E, 0x22E9, 0x8A4F, 0x22F7, 0x8A50, 0x0D5F, 0x8A51, 0x22F4,
+ 0x8A52, 0x22F2, 0x8A54, 0x0D5D, 0x8A55, 0x0D59, 0x8A56, 0x0D64,
+ 0x8A57, 0x22EE, 0x8A58, 0x22EF, 0x8A59, 0x22EC, 0x8A5B, 0x0D5E,
+ 0x8A5E, 0x0D5A, 0x8A60, 0x0D58, 0x8A61, 0x258D, 0x8A62, 0x0F14,
+ 0x8A63, 0x0F0F, 0x8A66, 0x0F0A, 0x8A68, 0x0F1A, 0x8A69, 0x0F0B,
+ 0x8A6B, 0x0F07, 0x8A6C, 0x0F16, 0x8A6D, 0x0F13, 0x8A6E, 0x0F15,
+ 0x8A70, 0x0F0C, 0x8A71, 0x0F11, 0x8A72, 0x0F08, 0x8A73, 0x0F09,
+ 0x8A74, 0x2595, 0x8A75, 0x2592, 0x8A76, 0x258A, 0x8A77, 0x258F,
+ 0x8A79, 0x0F17, 0x8A7A, 0x2596, 0x8A7B, 0x0F18, 0x8A7C, 0x0F0E,
+ 0x8A7F, 0x258C, 0x8A81, 0x2594, 0x8A82, 0x2590, 0x8A83, 0x2593,
+ 0x8A84, 0x2591, 0x8A85, 0x0F12, 0x8A86, 0x258B, 0x8A87, 0x0F0D,
+ 0x8A8B, 0x2805, 0x8A8C, 0x10A6, 0x8A8D, 0x10A9, 0x8A8F, 0x2807,
+ 0x8A91, 0x10B1, 0x8A92, 0x2806, 0x8A93, 0x10AB, 0x8A95, 0x1216,
+ 0x8A96, 0x2808, 0x8A98, 0x10B0, 0x8A99, 0x2804, 0x8A9A, 0x10B2,
+ 0x8A9E, 0x10A7, 0x8AA0, 0x0F10, 0x8AA1, 0x10AA, 0x8AA3, 0x10A8,
+ 0x8AA4, 0x10AC, 0x8AA5, 0x10AE, 0x8AA6, 0x10A5, 0x8AA7, 0x10B3,
+ 0x8AA8, 0x10AF, 0x8AAA, 0x10AD, 0x8AAB, 0x2803, 0x8AB0, 0x121D,
+ 0x8AB2, 0x1219, 0x8AB6, 0x1220, 0x8AB8, 0x2A44, 0x8AB9, 0x1221,
+ 0x8ABA, 0x2A50, 0x8ABB, 0x2A49, 0x8ABC, 0x1212, 0x8ABD, 0x2A51,
+ 0x8ABE, 0x2A4B, 0x8ABF, 0x121C, 0x8AC0, 0x2A4C, 0x8AC2, 0x121B,
+ 0x8AC3, 0x2A4F, 0x8AC4, 0x1215, 0x8AC5, 0x2A4D, 0x8AC6, 0x2A43,
+ 0x8AC7, 0x1214, 0x8AC8, 0x2C8F, 0x8AC9, 0x121A, 0x8ACB, 0x1217,
+ 0x8ACD, 0x121F, 0x8ACF, 0x2A42, 0x8AD1, 0x2A46, 0x8AD2, 0x1213,
+ 0x8AD3, 0x2A45, 0x8AD4, 0x2A47, 0x8AD5, 0x2A48, 0x8AD6, 0x121E,
+ 0x8AD7, 0x2A4A, 0x8AD8, 0x2A4E, 0x8AD9, 0x2A52, 0x8ADB, 0x1222,
+ 0x8ADC, 0x1352, 0x8ADD, 0x2C8A, 0x8ADE, 0x2C90, 0x8ADF, 0x2C8D,
+ 0x8AE0, 0x2C85, 0x8AE1, 0x2C91, 0x8AE2, 0x2C86, 0x8AE4, 0x2C8C,
+ 0x8AE6, 0x134D, 0x8AE7, 0x1353, 0x8AE8, 0x2C92, 0x8AEB, 0x134F,
+ 0x8AED, 0x1359, 0x8AEE, 0x1354, 0x8AEF, 0x2C94, 0x8AF0, 0x2C8E,
+ 0x8AF1, 0x1350, 0x8AF2, 0x2C87, 0x8AF3, 0x135A, 0x8AF4, 0x2C88,
+ 0x8AF5, 0x2C89, 0x8AF6, 0x135B, 0x8AF7, 0x1358, 0x8AF8, 0x1218,
+ 0x8AFA, 0x134E, 0x8AFB, 0x2C95, 0x8AFC, 0x135C, 0x8AFE, 0x1355,
+ 0x8AFF, 0x2C93, 0x8B00, 0x1351, 0x8B01, 0x1356, 0x8B02, 0x1357,
+ 0x8B04, 0x147E, 0x8B05, 0x2E5F, 0x8B06, 0x2E68, 0x8B07, 0x2E65,
+ 0x8B08, 0x2E67, 0x8B0A, 0x147B, 0x8B0B, 0x2E60, 0x8B0D, 0x2E66,
+ 0x8B0E, 0x1477, 0x8B0F, 0x2E62, 0x8B10, 0x147F, 0x8B11, 0x2E5E,
+ 0x8B12, 0x2E63, 0x8B13, 0x2E6A, 0x8B14, 0x2C8B, 0x8B15, 0x2E64,
+ 0x8B16, 0x2E5D, 0x8B17, 0x1478, 0x8B18, 0x2E5C, 0x8B19, 0x1479,
+ 0x8B1A, 0x2E6B, 0x8B1B, 0x147A, 0x8B1C, 0x2E69, 0x8B1D, 0x147D,
+ 0x8B1E, 0x2E5B, 0x8B20, 0x147C, 0x8B22, 0x2E61, 0x8B23, 0x2FCE,
+ 0x8B24, 0x2FDC, 0x8B25, 0x2FD7, 0x8B26, 0x2FD9, 0x8B27, 0x2FCD,
+ 0x8B28, 0x152A, 0x8B2A, 0x2FCC, 0x8B2B, 0x152D, 0x8B2C, 0x152C,
+ 0x8B2E, 0x2FDB, 0x8B2F, 0x2FD3, 0x8B30, 0x2FD0, 0x8B31, 0x2FD6,
+ 0x8B33, 0x2FCF, 0x8B35, 0x2FD1, 0x8B36, 0x2FDA, 0x8B37, 0x2FD8,
+ 0x8B39, 0x152B, 0x8B3A, 0x2FDF, 0x8B3B, 0x2FDD, 0x8B3C, 0x2FD4,
+ 0x8B3D, 0x2FDE, 0x8B3E, 0x2FD5, 0x8B40, 0x3125, 0x8B41, 0x15C4,
+ 0x8B42, 0x312C, 0x8B45, 0x3313, 0x8B46, 0x15CB, 0x8B47, 0x2FD2,
+ 0x8B48, 0x3123, 0x8B49, 0x15C7, 0x8B4A, 0x3124, 0x8B4B, 0x3129,
+ 0x8B4E, 0x15C9, 0x8B4F, 0x15CA, 0x8B50, 0x3122, 0x8B51, 0x312B,
+ 0x8B52, 0x312D, 0x8B53, 0x3126, 0x8B54, 0x3128, 0x8B55, 0x312A,
+ 0x8B56, 0x3127, 0x8B57, 0x312E, 0x8B58, 0x15C6, 0x8B59, 0x15CC,
+ 0x8B5A, 0x15C8, 0x8B5C, 0x15C5, 0x8B5D, 0x3237, 0x8B5F, 0x1648,
+ 0x8B60, 0x3235, 0x8B63, 0x3239, 0x8B65, 0x323A, 0x8B66, 0x1646,
+ 0x8B67, 0x323B, 0x8B68, 0x3238, 0x8B6A, 0x3236, 0x8B6B, 0x1649,
+ 0x8B6C, 0x1645, 0x8B6D, 0x323C, 0x8B6F, 0x1647, 0x8B70, 0x1644,
+ 0x8B74, 0x168F, 0x8B77, 0x1690, 0x8B78, 0x3312, 0x8B79, 0x3311,
+ 0x8B7A, 0x3314, 0x8B7B, 0x3315, 0x8B7D, 0x1691, 0x8B7E, 0x33B6,
+ 0x8B7F, 0x33BB, 0x8B80, 0x16D8, 0x8B82, 0x33B8, 0x8B84, 0x33B7,
+ 0x8B85, 0x33BA, 0x8B86, 0x33B9, 0x8B88, 0x3440, 0x8B8A, 0x170A,
+ 0x8B8B, 0x343F, 0x8B8C, 0x343D, 0x8B8E, 0x343E, 0x8B92, 0x172C,
+ 0x8B93, 0x172B, 0x8B94, 0x349C, 0x8B95, 0x349D, 0x8B96, 0x172D,
+ 0x8B98, 0x34E7, 0x8B99, 0x34E8, 0x8B9A, 0x1754, 0x8B9C, 0x175A,
+ 0x8B9E, 0x3522, 0x8B9F, 0x353F, 0x8C37, 0x050B, 0x8C39, 0x206B,
+ 0x8C3B, 0x206C, 0x8C3C, 0x2597, 0x8C3D, 0x2809, 0x8C3E, 0x2A53,
+ 0x8C3F, 0x1481, 0x8C41, 0x1480, 0x8C42, 0x2FE0, 0x8C43, 0x312F,
+ 0x8C45, 0x3441, 0x8C46, 0x050C, 0x8C47, 0x1E09, 0x8C48, 0x09C9,
+ 0x8C49, 0x0BA7, 0x8C4A, 0x2599, 0x8C4B, 0x2598, 0x8C4C, 0x1223,
+ 0x8C4D, 0x2A54, 0x8C4E, 0x1224, 0x8C4F, 0x2E6C, 0x8C50, 0x152E,
+ 0x8C54, 0x1763, 0x8C55, 0x050D, 0x8C56, 0x1A48, 0x8C57, 0x1E0A,
+ 0x8C5A, 0x0BA8, 0x8C5C, 0x206D, 0x8C5D, 0x206E, 0x8C5F, 0x22F8,
+ 0x8C61, 0x0D65, 0x8C62, 0x0F1B, 0x8C64, 0x259B, 0x8C65, 0x259A,
+ 0x8C66, 0x259C, 0x8C68, 0x280A, 0x8C69, 0x280B, 0x8C6A, 0x10B4,
+ 0x8C6B, 0x135D, 0x8C6C, 0x1225, 0x8C6D, 0x135E, 0x8C6F, 0x2E70,
+ 0x8C70, 0x2E6D, 0x8C71, 0x2E6F, 0x8C72, 0x2E6E, 0x8C73, 0x1482,
+ 0x8C75, 0x2FE1, 0x8C76, 0x3131, 0x8C77, 0x3130, 0x8C78, 0x18E7,
+ 0x8C79, 0x09CB, 0x8C7A, 0x09CA, 0x8C7B, 0x1E0B, 0x8C7D, 0x206F,
+ 0x8C80, 0x22FA, 0x8C81, 0x22F9, 0x8C82, 0x0D66, 0x8C84, 0x259E,
+ 0x8C85, 0x259F, 0x8C86, 0x259D, 0x8C89, 0x0F1D, 0x8C8A, 0x0F1C,
+ 0x8C8C, 0x10B6, 0x8C8D, 0x10B5, 0x8C8F, 0x2A55, 0x8C90, 0x2C98,
+ 0x8C91, 0x2C96, 0x8C92, 0x2C97, 0x8C93, 0x135F, 0x8C94, 0x2E72,
+ 0x8C95, 0x2E71, 0x8C97, 0x2FE4, 0x8C98, 0x2FE3, 0x8C99, 0x2FE2,
+ 0x8C9A, 0x3132, 0x8C9C, 0x3523, 0x8C9D, 0x050E, 0x8C9E, 0x080A,
+ 0x8CA0, 0x080B, 0x8CA1, 0x09CC, 0x8CA2, 0x09CD, 0x8CA3, 0x1E0D,
+ 0x8CA4, 0x1E0C, 0x8CA5, 0x2070, 0x8CA7, 0x0BAE, 0x8CA8, 0x0BAC,
+ 0x8CA9, 0x0BA9, 0x8CAA, 0x0BAD, 0x8CAB, 0x0BAB, 0x8CAC, 0x0BAA,
+ 0x8CAF, 0x0D67, 0x8CB0, 0x22FD, 0x8CB2, 0x0F22, 0x8CB3, 0x0D69,
+ 0x8CB4, 0x0D6E, 0x8CB5, 0x22FF, 0x8CB6, 0x0D70, 0x8CB7, 0x0D6F,
+ 0x8CB8, 0x0D72, 0x8CB9, 0x22FE, 0x8CBA, 0x22FB, 0x8CBB, 0x0D6C,
+ 0x8CBC, 0x0D68, 0x8CBD, 0x0D6A, 0x8CBE, 0x22FC, 0x8CBF, 0x0D71,
+ 0x8CC0, 0x0D6D, 0x8CC1, 0x0D6B, 0x8CC2, 0x0F24, 0x8CC3, 0x0F23,
+ 0x8CC4, 0x0F21, 0x8CC5, 0x0F25, 0x8CC7, 0x0F1F, 0x8CC8, 0x0F20,
+ 0x8CCA, 0x0F1E, 0x8CCC, 0x25A0, 0x8CCF, 0x280D, 0x8CD1, 0x10B8,
+ 0x8CD2, 0x10B9, 0x8CD3, 0x10B7, 0x8CD5, 0x280C, 0x8CD7, 0x280E,
+ 0x8CD9, 0x2A58, 0x8CDA, 0x2A5A, 0x8CDC, 0x122E, 0x8CDD, 0x2A5B,
+ 0x8CDE, 0x1227, 0x8CDF, 0x2A57, 0x8CE0, 0x1226, 0x8CE1, 0x1230,
+ 0x8CE2, 0x122C, 0x8CE3, 0x122D, 0x8CE4, 0x1229, 0x8CE5, 0x2A56,
+ 0x8CE6, 0x1228, 0x8CE7, 0x2A5C, 0x8CE8, 0x2A59, 0x8CEA, 0x122F,
+ 0x8CEC, 0x122A, 0x8CED, 0x122B, 0x8CEE, 0x2C9A, 0x8CF0, 0x2C9C,
+ 0x8CF1, 0x2C9B, 0x8CF3, 0x2C9D, 0x8CF4, 0x1360, 0x8CF5, 0x2C99,
+ 0x8CF8, 0x1486, 0x8CF9, 0x2E73, 0x8CFA, 0x1483, 0x8CFB, 0x1487,
+ 0x8CFC, 0x1485, 0x8CFD, 0x1484, 0x8CFE, 0x2FE5, 0x8D00, 0x2FE8,
+ 0x8D02, 0x2FE7, 0x8D04, 0x2FE6, 0x8D05, 0x152F, 0x8D06, 0x3133,
+ 0x8D07, 0x3134, 0x8D08, 0x15CD, 0x8D09, 0x3135, 0x8D0A, 0x15CE,
+ 0x8D0D, 0x164B, 0x8D0F, 0x164A, 0x8D10, 0x3316, 0x8D13, 0x1692,
+ 0x8D14, 0x3317, 0x8D15, 0x33BC, 0x8D16, 0x16D9, 0x8D17, 0x16DA,
+ 0x8D19, 0x3442, 0x8D1B, 0x172F, 0x8D64, 0x050F, 0x8D66, 0x0BB0,
+ 0x8D67, 0x0BAF, 0x8D68, 0x25A1, 0x8D69, 0x25A2, 0x8D6B, 0x10BA,
+ 0x8D6C, 0x2C9E, 0x8D6D, 0x1231, 0x8D6E, 0x2C9F, 0x8D6F, 0x2E74,
+ 0x8D70, 0x0510, 0x8D72, 0x1C06, 0x8D73, 0x080D, 0x8D74, 0x080C,
+ 0x8D76, 0x1E0E, 0x8D77, 0x09CE, 0x8D78, 0x1E0F, 0x8D79, 0x2073,
+ 0x8D7B, 0x2072, 0x8D7D, 0x2071, 0x8D80, 0x2301, 0x8D81, 0x0D75,
+ 0x8D84, 0x2300, 0x8D85, 0x0D74, 0x8D89, 0x2302, 0x8D8A, 0x0D73,
+ 0x8D8C, 0x25A4, 0x8D8D, 0x25A7, 0x8D8E, 0x25A5, 0x8D8F, 0x25A6,
+ 0x8D90, 0x25AA, 0x8D91, 0x25A3, 0x8D92, 0x25AB, 0x8D93, 0x25A8,
+ 0x8D94, 0x25A9, 0x8D95, 0x10BC, 0x8D96, 0x280F, 0x8D99, 0x10BB,
+ 0x8D9B, 0x2A60, 0x8D9C, 0x2A5E, 0x8D9F, 0x1232, 0x8DA0, 0x2A5D,
+ 0x8DA1, 0x2A5F, 0x8DA3, 0x1233, 0x8DA5, 0x2CA0, 0x8DA7, 0x2CA1,
+ 0x8DA8, 0x1488, 0x8DAA, 0x3137, 0x8DAB, 0x3139, 0x8DAC, 0x3136,
+ 0x8DAD, 0x3138, 0x8DAE, 0x323D, 0x8DAF, 0x3318, 0x8DB2, 0x3509,
+ 0x8DB3, 0x0511, 0x8DB4, 0x080E, 0x8DB5, 0x1E10, 0x8DB6, 0x1E12,
+ 0x8DB7, 0x1E11, 0x8DB9, 0x2076, 0x8DBA, 0x0BB2, 0x8DBC, 0x2074,
+ 0x8DBE, 0x0BB1, 0x8DBF, 0x2077, 0x8DC1, 0x2078, 0x8DC2, 0x2075,
+ 0x8DC5, 0x230E, 0x8DC6, 0x0D7D, 0x8DC7, 0x2306, 0x8DC8, 0x230C,
+ 0x8DCB, 0x0D78, 0x8DCC, 0x0D7B, 0x8DCD, 0x2305, 0x8DCE, 0x0D76,
+ 0x8DCF, 0x2309, 0x8DD0, 0x25B1, 0x8DD1, 0x0D7A, 0x8DD3, 0x2304,
+ 0x8DD5, 0x230A, 0x8DD6, 0x2307, 0x8DD7, 0x230D, 0x8DD8, 0x2303,
+ 0x8DD9, 0x230B, 0x8DDA, 0x0D79, 0x8DDB, 0x0D7C, 0x8DDC, 0x2308,
+ 0x8DDD, 0x0D77, 0x8DDF, 0x0F27, 0x8DE0, 0x25AD, 0x8DE1, 0x0F26,
+ 0x8DE2, 0x25B4, 0x8DE3, 0x25B3, 0x8DE4, 0x0F2D, 0x8DE6, 0x0F2E,
+ 0x8DE7, 0x25B5, 0x8DE8, 0x0F28, 0x8DE9, 0x25B2, 0x8DEA, 0x0F2C,
+ 0x8DEB, 0x25B7, 0x8DEC, 0x25AE, 0x8DEE, 0x25B0, 0x8DEF, 0x0F29,
+ 0x8DF0, 0x25AC, 0x8DF1, 0x25AF, 0x8DF2, 0x25B6, 0x8DF3, 0x0F2A,
+ 0x8DF4, 0x25B8, 0x8DFA, 0x0F2B, 0x8DFC, 0x10BD, 0x8DFD, 0x2814,
+ 0x8DFE, 0x281A, 0x8DFF, 0x2812, 0x8E00, 0x281B, 0x8E02, 0x2811,
+ 0x8E03, 0x2816, 0x8E04, 0x281C, 0x8E05, 0x2819, 0x8E06, 0x2818,
+ 0x8E07, 0x2817, 0x8E09, 0x2810, 0x8E0A, 0x2815, 0x8E0D, 0x2813,
+ 0x8E0F, 0x1238, 0x8E10, 0x1235, 0x8E11, 0x2A69, 0x8E12, 0x2A6E,
+ 0x8E13, 0x2A70, 0x8E14, 0x2A6D, 0x8E15, 0x2A66, 0x8E16, 0x2A68,
+ 0x8E17, 0x2A72, 0x8E18, 0x2A6F, 0x8E19, 0x2A6A, 0x8E1A, 0x2A73,
+ 0x8E1B, 0x2A67, 0x8E1C, 0x2A71, 0x8E1D, 0x1236, 0x8E1E, 0x123C,
+ 0x8E1F, 0x123A, 0x8E20, 0x2A61, 0x8E21, 0x123B, 0x8E22, 0x1237,
+ 0x8E23, 0x2A62, 0x8E24, 0x2A64, 0x8E25, 0x2A63, 0x8E26, 0x2A6B,
+ 0x8E27, 0x2A6C, 0x8E29, 0x1239, 0x8E2B, 0x1234, 0x8E2E, 0x2A65,
+ 0x8E30, 0x2CAB, 0x8E31, 0x1362, 0x8E33, 0x2CA2, 0x8E34, 0x1363,
+ 0x8E35, 0x1366, 0x8E36, 0x2CA7, 0x8E38, 0x2CA4, 0x8E39, 0x1365,
+ 0x8E3C, 0x2CA8, 0x8E3D, 0x2CA9, 0x8E3E, 0x2CA3, 0x8E3F, 0x2CAC,
+ 0x8E40, 0x2CA5, 0x8E41, 0x2CAA, 0x8E42, 0x1364, 0x8E44, 0x1361,
+ 0x8E45, 0x2CA6, 0x8E47, 0x2E7A, 0x8E48, 0x148B, 0x8E49, 0x1489,
+ 0x8E4A, 0x148C, 0x8E4B, 0x148A, 0x8E4C, 0x2E79, 0x8E4D, 0x2E76,
+ 0x8E4E, 0x2E75, 0x8E50, 0x2E78, 0x8E53, 0x2E77, 0x8E54, 0x2FF6,
+ 0x8E55, 0x1535, 0x8E56, 0x2FED, 0x8E57, 0x2FEC, 0x8E59, 0x1530,
+ 0x8E5A, 0x2FF2, 0x8E5B, 0x2FF1, 0x8E5C, 0x2FE9, 0x8E5D, 0x2FF4,
+ 0x8E5E, 0x2FEE, 0x8E5F, 0x1534, 0x8E60, 0x2FEB, 0x8E61, 0x2FF3,
+ 0x8E62, 0x2FEA, 0x8E63, 0x1531, 0x8E64, 0x1533, 0x8E65, 0x2FEF,
+ 0x8E66, 0x1532, 0x8E67, 0x2FF0, 0x8E69, 0x2FF5, 0x8E6A, 0x313D,
+ 0x8E6C, 0x15D3, 0x8E6D, 0x313A, 0x8E6F, 0x313E, 0x8E72, 0x15D0,
+ 0x8E73, 0x313C, 0x8E74, 0x15D5, 0x8E76, 0x15D2, 0x8E78, 0x313B,
+ 0x8E7A, 0x15D4, 0x8E7B, 0x313F, 0x8E7C, 0x15CF, 0x8E81, 0x164D,
+ 0x8E82, 0x164F, 0x8E84, 0x3240, 0x8E85, 0x164E, 0x8E86, 0x323E,
+ 0x8E87, 0x15D1, 0x8E88, 0x323F, 0x8E89, 0x164C, 0x8E8A, 0x1693,
+ 0x8E8B, 0x1695, 0x8E8C, 0x331A, 0x8E8D, 0x1694, 0x8E8E, 0x3319,
+ 0x8E90, 0x33C1, 0x8E91, 0x16DB, 0x8E92, 0x33C0, 0x8E93, 0x16DC,
+ 0x8E94, 0x33BE, 0x8E95, 0x33BD, 0x8E96, 0x33C2, 0x8E97, 0x33C3,
+ 0x8E98, 0x3443, 0x8E9A, 0x33BF, 0x8E9D, 0x34A1, 0x8E9E, 0x349E,
+ 0x8E9F, 0x349F, 0x8EA0, 0x34A0, 0x8EA1, 0x1749, 0x8EA3, 0x34EB,
+ 0x8EA4, 0x34EA, 0x8EA5, 0x34E9, 0x8EA6, 0x350A, 0x8EA8, 0x3537,
+ 0x8EA9, 0x3524, 0x8EAA, 0x175B, 0x8EAB, 0x0512, 0x8EAC, 0x09CF,
+ 0x8EB2, 0x0F2F, 0x8EBA, 0x123D, 0x8EBD, 0x2CAD, 0x8EC0, 0x1536,
+ 0x8EC2, 0x3140, 0x8EC9, 0x3525, 0x8ECA, 0x0513, 0x8ECB, 0x068D,
+ 0x8ECC, 0x0810, 0x8ECD, 0x080F, 0x8ECF, 0x09D2, 0x8ED1, 0x1E13,
+ 0x8ED2, 0x09D0, 0x8ED3, 0x1E14, 0x8ED4, 0x09D1, 0x8ED7, 0x207D,
+ 0x8ED8, 0x2079, 0x8EDB, 0x0BB3, 0x8EDC, 0x207C, 0x8EDD, 0x207B,
+ 0x8EDE, 0x207A, 0x8EDF, 0x0BB4, 0x8EE0, 0x207E, 0x8EE1, 0x207F,
+ 0x8EE5, 0x2315, 0x8EE6, 0x2313, 0x8EE7, 0x2317, 0x8EE8, 0x2318,
+ 0x8EE9, 0x231E, 0x8EEB, 0x231A, 0x8EEC, 0x231C, 0x8EEE, 0x2314,
+ 0x8EEF, 0x230F, 0x8EF1, 0x231B, 0x8EF4, 0x231D, 0x8EF5, 0x2316,
+ 0x8EF6, 0x2319, 0x8EF7, 0x2310, 0x8EF8, 0x0D7F, 0x8EF9, 0x2312,
+ 0x8EFA, 0x2311, 0x8EFB, 0x0D7E, 0x8EFC, 0x0D80, 0x8EFE, 0x0F32,
+ 0x8EFF, 0x25BA, 0x8F00, 0x25BC, 0x8F01, 0x25BB, 0x8F02, 0x25C0,
+ 0x8F03, 0x0F30, 0x8F05, 0x25BD, 0x8F06, 0x25B9, 0x8F07, 0x25BE,
+ 0x8F08, 0x25BF, 0x8F09, 0x0F31, 0x8F0A, 0x0F33, 0x8F0B, 0x25C1,
+ 0x8F0D, 0x2820, 0x8F0E, 0x281F, 0x8F10, 0x281D, 0x8F11, 0x281E,
+ 0x8F12, 0x10BF, 0x8F13, 0x10C1, 0x8F14, 0x10BE, 0x8F15, 0x10C0,
+ 0x8F16, 0x2A7A, 0x8F17, 0x2A7B, 0x8F18, 0x2A76, 0x8F1A, 0x2A77,
+ 0x8F1B, 0x123F, 0x8F1C, 0x1244, 0x8F1D, 0x123E, 0x8F1E, 0x1245,
+ 0x8F1F, 0x1240, 0x8F20, 0x2A78, 0x8F23, 0x2A79, 0x8F24, 0x2A75,
+ 0x8F25, 0x1246, 0x8F26, 0x1242, 0x8F29, 0x1241, 0x8F2A, 0x1243,
+ 0x8F2C, 0x2A74, 0x8F2E, 0x2CAF, 0x8F2F, 0x1368, 0x8F32, 0x2CB1,
+ 0x8F33, 0x136A, 0x8F34, 0x2CB4, 0x8F35, 0x2CB0, 0x8F36, 0x2CAE,
+ 0x8F37, 0x2CB3, 0x8F38, 0x1369, 0x8F39, 0x2CB2, 0x8F3B, 0x1367,
+ 0x8F3E, 0x148E, 0x8F3F, 0x1491, 0x8F40, 0x2E7C, 0x8F42, 0x148F,
+ 0x8F43, 0x2E7B, 0x8F44, 0x148D, 0x8F45, 0x1490, 0x8F46, 0x2FF7,
+ 0x8F47, 0x2FF8, 0x8F48, 0x2FF9, 0x8F49, 0x1537, 0x8F4B, 0x2FFA,
+ 0x8F4D, 0x1538, 0x8F4E, 0x15D7, 0x8F4F, 0x3143, 0x8F50, 0x3144,
+ 0x8F51, 0x3142, 0x8F52, 0x3141, 0x8F53, 0x3145, 0x8F54, 0x15D6,
+ 0x8F55, 0x3244, 0x8F56, 0x3242, 0x8F57, 0x3243, 0x8F58, 0x3245,
+ 0x8F59, 0x3241, 0x8F5A, 0x3246, 0x8F5B, 0x331C, 0x8F5D, 0x331D,
+ 0x8F5E, 0x331B, 0x8F5F, 0x1696, 0x8F60, 0x33C4, 0x8F61, 0x16DD,
+ 0x8F62, 0x33C5, 0x8F63, 0x3445, 0x8F64, 0x3444, 0x8F9B, 0x0514,
+ 0x8F9C, 0x0D81, 0x8F9F, 0x0F34, 0x8FA3, 0x10C2, 0x8FA6, 0x136C,
+ 0x8FA8, 0x136B, 0x8FAD, 0x15D8, 0x8FAE, 0x162F, 0x8FAF, 0x1697,
+ 0x8FB0, 0x0515, 0x8FB1, 0x09D3, 0x8FB2, 0x0F35, 0x8FB4, 0x3146,
+ 0x8FB5, 0x0230, 0x8FBF, 0x18E9, 0x8FC2, 0x0516, 0x8FC4, 0x0519,
+ 0x8FC5, 0x0518, 0x8FC6, 0x0517, 0x8FC9, 0x18E8, 0x8FCB, 0x1A4A,
+ 0x8FCD, 0x1A4C, 0x8FCE, 0x068E, 0x8FD1, 0x0690, 0x8FD2, 0x1A49,
+ 0x8FD3, 0x1A4B, 0x8FD4, 0x068F, 0x8FD5, 0x1A4E, 0x8FD6, 0x1A4D,
+ 0x8FD7, 0x1A4F, 0x8FE0, 0x1C0A, 0x8FE1, 0x1C08, 0x8FE2, 0x0813,
+ 0x8FE3, 0x1C07, 0x8FE4, 0x0818, 0x8FE5, 0x0815, 0x8FE6, 0x0812,
+ 0x8FE8, 0x0819, 0x8FEA, 0x0814, 0x8FEB, 0x0817, 0x8FED, 0x0816,
+ 0x8FEE, 0x1C09, 0x8FF0, 0x0811, 0x8FF4, 0x09D9, 0x8FF5, 0x1E16,
+ 0x8FF6, 0x1E1C, 0x8FF7, 0x09D6, 0x8FF8, 0x09DD, 0x8FFA, 0x09D8,
+ 0x8FFB, 0x1E19, 0x8FFC, 0x1E1B, 0x8FFD, 0x09DB, 0x8FFE, 0x1E15,
+ 0x8FFF, 0x1E18, 0x9000, 0x09D7, 0x9001, 0x09D4, 0x9002, 0x1E17,
+ 0x9003, 0x09DA, 0x9004, 0x1E1A, 0x9005, 0x09DC, 0x9006, 0x09D5,
+ 0x900B, 0x2081, 0x900C, 0x2084, 0x900D, 0x0BB6, 0x900F, 0x0BC0,
+ 0x9010, 0x0BBC, 0x9011, 0x2082, 0x9014, 0x0BC4, 0x9015, 0x0BBD,
+ 0x9016, 0x0BC2, 0x9017, 0x0BB8, 0x9019, 0x0BB5, 0x901A, 0x0BB7,
+ 0x901B, 0x0BC3, 0x901C, 0x2083, 0x901D, 0x0BBB, 0x901E, 0x0BBE,
+ 0x901F, 0x0BBA, 0x9020, 0x0BBF, 0x9021, 0x2085, 0x9022, 0x0BC1,
+ 0x9023, 0x0BB9, 0x9024, 0x2080, 0x902D, 0x231F, 0x902E, 0x0D82,
+ 0x902F, 0x2321, 0x9031, 0x0D84, 0x9032, 0x0D86, 0x9034, 0x2320,
+ 0x9035, 0x0D83, 0x9036, 0x0D87, 0x9038, 0x0D85, 0x903C, 0x0F3B,
+ 0x903D, 0x25C6, 0x903E, 0x0F43, 0x903F, 0x25C3, 0x9041, 0x0F44,
+ 0x9042, 0x0F39, 0x9044, 0x25C4, 0x9047, 0x0F3E, 0x9049, 0x25C5,
+ 0x904A, 0x0F37, 0x904B, 0x0F36, 0x904D, 0x0F41, 0x904E, 0x0F40,
+ 0x904F, 0x0F3F, 0x9050, 0x0F3D, 0x9051, 0x0F42, 0x9052, 0x25C2,
+ 0x9053, 0x0F38, 0x9054, 0x0F3A, 0x9055, 0x0F3C, 0x9058, 0x10C4,
+ 0x9059, 0x10C7, 0x905B, 0x10CB, 0x905C, 0x10C5, 0x905D, 0x10CA,
+ 0x905E, 0x10C8, 0x9060, 0x10C3, 0x9062, 0x10C9, 0x9063, 0x10C6,
+ 0x9067, 0x2A7F, 0x9068, 0x1249, 0x9069, 0x1247, 0x906B, 0x2A80,
+ 0x906D, 0x124A, 0x906E, 0x1248, 0x906F, 0x2A7E, 0x9070, 0x2A7D,
+ 0x9072, 0x1370, 0x9073, 0x2A7C, 0x9074, 0x136E, 0x9075, 0x136D,
+ 0x9076, 0x2CB5, 0x9077, 0x124B, 0x9078, 0x136F, 0x9079, 0x2CB6,
+ 0x907A, 0x1372, 0x907B, 0x2CB7, 0x907C, 0x1371, 0x907D, 0x1493,
+ 0x907E, 0x2E7E, 0x907F, 0x1492, 0x9080, 0x1497, 0x9081, 0x1495,
+ 0x9082, 0x1496, 0x9083, 0x153A, 0x9084, 0x1494, 0x9085, 0x2E7D,
+ 0x9086, 0x2CB8, 0x9087, 0x1539, 0x9088, 0x153B, 0x908A, 0x15D9,
+ 0x908B, 0x15DA, 0x908D, 0x3247, 0x908F, 0x170C, 0x9090, 0x170B,
+ 0x9091, 0x051B, 0x9094, 0x181E, 0x9095, 0x09DE, 0x9097, 0x181B,
+ 0x9098, 0x181C, 0x9099, 0x181A, 0x909B, 0x181D, 0x909E, 0x18ED,
+ 0x909F, 0x18EA, 0x90A0, 0x18EF, 0x90A1, 0x18EB, 0x90A2, 0x051C,
+ 0x90A3, 0x051F, 0x90A5, 0x18EC, 0x90A6, 0x051E, 0x90A7, 0x18EE,
+ 0x90AA, 0x051D, 0x90AF, 0x1A52, 0x90B0, 0x1A54, 0x90B1, 0x0693,
+ 0x90B2, 0x1A50, 0x90B3, 0x1A53, 0x90B4, 0x1A51, 0x90B5, 0x0691,
+ 0x90B6, 0x0694, 0x90B8, 0x0692, 0x90BD, 0x1C0C, 0x90BE, 0x1C10,
+ 0x90BF, 0x1C0D, 0x90C1, 0x081C, 0x90C3, 0x081D, 0x90C5, 0x1C0F,
+ 0x90C7, 0x1C11, 0x90C8, 0x1C13, 0x90CA, 0x081A, 0x90CB, 0x1C12,
+ 0x90CE, 0x081B, 0x90D4, 0x208C, 0x90D5, 0x1C0E, 0x90D6, 0x1E1D,
+ 0x90D7, 0x1E26, 0x90D8, 0x1E24, 0x90D9, 0x1E1F, 0x90DA, 0x1E20,
+ 0x90DB, 0x1E25, 0x90DC, 0x1E27, 0x90DD, 0x09E0, 0x90DF, 0x1E22,
+ 0x90E0, 0x1E1E, 0x90E1, 0x09DF, 0x90E2, 0x09E1, 0x90E3, 0x1E21,
+ 0x90E4, 0x1E28, 0x90E5, 0x1E23, 0x90E8, 0x0BC5, 0x90E9, 0x208F,
+ 0x90EA, 0x2087, 0x90EB, 0x208D, 0x90EC, 0x208E, 0x90ED, 0x0BC6,
+ 0x90EF, 0x2086, 0x90F0, 0x2088, 0x90F1, 0x1C0B, 0x90F2, 0x208A,
+ 0x90F3, 0x208B, 0x90F4, 0x2089, 0x90F5, 0x0D89, 0x90F9, 0x2328,
+ 0x90FA, 0x2CB9, 0x90FB, 0x2329, 0x90FC, 0x2326, 0x90FD, 0x0BC7,
+ 0x90FE, 0x0D8B, 0x90FF, 0x2325, 0x9100, 0x232B, 0x9101, 0x232A,
+ 0x9102, 0x0D88, 0x9103, 0x232E, 0x9104, 0x2324, 0x9105, 0x232D,
+ 0x9106, 0x2322, 0x9107, 0x232C, 0x9108, 0x2327, 0x9109, 0x0D8A,
+ 0x910B, 0x25CD, 0x910D, 0x25C8, 0x910E, 0x25CE, 0x910F, 0x25C9,
+ 0x9110, 0x25C7, 0x9111, 0x25CA, 0x9112, 0x0F45, 0x9114, 0x25CC,
+ 0x9116, 0x25CB, 0x9117, 0x0F46, 0x9118, 0x10CD, 0x9119, 0x10CC,
+ 0x911A, 0x2827, 0x911B, 0x282A, 0x911C, 0x2822, 0x911D, 0x2826,
+ 0x911E, 0x10CE, 0x911F, 0x2825, 0x9120, 0x2823, 0x9121, 0x2829,
+ 0x9122, 0x2824, 0x9123, 0x2821, 0x9124, 0x2828, 0x9126, 0x2A86,
+ 0x9127, 0x124E, 0x9128, 0x2FFB, 0x9129, 0x2A83, 0x912A, 0x2A84,
+ 0x912B, 0x2A82, 0x912C, 0x2323, 0x912D, 0x124D, 0x912E, 0x2A87,
+ 0x912F, 0x2A81, 0x9130, 0x124C, 0x9131, 0x124F, 0x9132, 0x2A85,
+ 0x9133, 0x2CBA, 0x9134, 0x1373, 0x9135, 0x2CBB, 0x9136, 0x2CBC,
+ 0x9138, 0x2E7F, 0x9139, 0x1498, 0x913A, 0x2FFC, 0x913B, 0x2FFD,
+ 0x913E, 0x2FFE, 0x913F, 0x3148, 0x9140, 0x3147, 0x9141, 0x3249,
+ 0x9143, 0x3248, 0x9144, 0x331F, 0x9145, 0x3320, 0x9146, 0x331E,
+ 0x9147, 0x33C6, 0x9148, 0x16DE, 0x9149, 0x0520, 0x914A, 0x081F,
+ 0x914B, 0x081E, 0x914C, 0x09E4, 0x914D, 0x09E3, 0x914E, 0x1E2A,
+ 0x914F, 0x1E2B, 0x9150, 0x1E29, 0x9152, 0x09E2, 0x9153, 0x2093,
+ 0x9155, 0x2094, 0x9156, 0x2090, 0x9157, 0x0BC8, 0x9158, 0x2091,
+ 0x915A, 0x2092, 0x915F, 0x2331, 0x9160, 0x2333, 0x9161, 0x232F,
+ 0x9162, 0x2332, 0x9163, 0x0D8C, 0x9164, 0x2330, 0x9165, 0x0D8D,
+ 0x9168, 0x23E2, 0x9169, 0x0F49, 0x916A, 0x0F48, 0x916C, 0x0F47,
+ 0x916E, 0x25CF, 0x916F, 0x25D0, 0x9172, 0x282C, 0x9173, 0x282E,
+ 0x9174, 0x10D2, 0x9175, 0x10CF, 0x9177, 0x10D1, 0x9178, 0x10D0,
+ 0x9179, 0x282D, 0x917A, 0x282B, 0x9180, 0x2A8E, 0x9181, 0x2A8B,
+ 0x9182, 0x2A8C, 0x9183, 0x1253, 0x9184, 0x2A8D, 0x9185, 0x2A88,
+ 0x9186, 0x2A89, 0x9187, 0x1250, 0x9189, 0x1251, 0x918A, 0x2A8A,
+ 0x918B, 0x1252, 0x918D, 0x2CC0, 0x918F, 0x2CC1, 0x9190, 0x2CBE,
+ 0x9191, 0x2CBF, 0x9192, 0x1374, 0x9193, 0x2CBD, 0x9199, 0x2E83,
+ 0x919A, 0x2E80, 0x919B, 0x2E82, 0x919C, 0x149B, 0x919D, 0x2E86,
+ 0x919E, 0x149A, 0x919F, 0x2E84, 0x91A0, 0x2E87, 0x91A1, 0x2E85,
+ 0x91A2, 0x2E81, 0x91A3, 0x1499, 0x91A5, 0x3000, 0x91A7, 0x3001,
+ 0x91A8, 0x2FFF, 0x91AA, 0x3003, 0x91AB, 0x153C, 0x91AC, 0x153D,
+ 0x91AD, 0x314A, 0x91AE, 0x15DC, 0x91AF, 0x3002, 0x91B0, 0x3149,
+ 0x91B1, 0x15DB, 0x91B2, 0x324C, 0x91B3, 0x324D, 0x91B4, 0x1650,
+ 0x91B5, 0x324B, 0x91B7, 0x324A, 0x91B9, 0x3321, 0x91BA, 0x1698,
+ 0x91BC, 0x3446, 0x91BD, 0x34A3, 0x91BE, 0x34A2, 0x91C0, 0x1730,
+ 0x91C1, 0x174A, 0x91C2, 0x34A4, 0x91C3, 0x350B, 0x91C5, 0x175C,
+ 0x91C6, 0x0521, 0x91C7, 0x0695, 0x91C9, 0x0F4A, 0x91CB, 0x1651,
+ 0x91CC, 0x0522, 0x91CD, 0x0820, 0x91CE, 0x0BC9, 0x91CF, 0x0D8E,
+ 0x91D0, 0x153E, 0x91D1, 0x0696, 0x91D3, 0x1C15, 0x91D4, 0x1C14,
+ 0x91D5, 0x1E2C, 0x91D7, 0x09E7, 0x91D8, 0x09E5, 0x91D9, 0x09E9,
+ 0x91DA, 0x1E2E, 0x91DC, 0x09E8, 0x91DD, 0x09E6, 0x91E2, 0x1E2D,
+ 0x91E3, 0x0BCC, 0x91E4, 0x209A, 0x91E6, 0x0BCB, 0x91E7, 0x0BCD,
+ 0x91E8, 0x209F, 0x91E9, 0x0BCF, 0x91EA, 0x209C, 0x91EB, 0x209D,
+ 0x91EC, 0x2095, 0x91ED, 0x0BCE, 0x91EE, 0x20A0, 0x91F1, 0x2097,
+ 0x91F3, 0x2098, 0x91F4, 0x2096, 0x91F5, 0x0BCA, 0x91F7, 0x209E,
+ 0x91F8, 0x2099, 0x91F9, 0x209B, 0x91FD, 0x233F, 0x91FF, 0x233E,
+ 0x9200, 0x233C, 0x9201, 0x2334, 0x9202, 0x2343, 0x9203, 0x2337,
+ 0x9204, 0x2341, 0x9205, 0x2348, 0x9206, 0x2340, 0x9207, 0x0D96,
+ 0x9209, 0x0D92, 0x920A, 0x2335, 0x920C, 0x233B, 0x920D, 0x0D94,
+ 0x920F, 0x233A, 0x9210, 0x0D95, 0x9211, 0x0D97, 0x9212, 0x233D,
+ 0x9214, 0x0D8F, 0x9215, 0x0D90, 0x9216, 0x2349, 0x9217, 0x2347,
+ 0x9219, 0x2346, 0x921A, 0x2338, 0x921C, 0x2344, 0x921E, 0x0D93,
+ 0x9223, 0x0D91, 0x9224, 0x2345, 0x9225, 0x2336, 0x9226, 0x2339,
+ 0x9227, 0x2342, 0x922D, 0x2851, 0x922E, 0x25DA, 0x9230, 0x25D3,
+ 0x9231, 0x25E6, 0x9232, 0x25EF, 0x9233, 0x25D6, 0x9234, 0x0F55,
+ 0x9236, 0x25E3, 0x9237, 0x0F4B, 0x9238, 0x0F4D, 0x9239, 0x0F59,
+ 0x923A, 0x25D4, 0x923D, 0x0F4E, 0x923E, 0x0F50, 0x923F, 0x0F5A,
+ 0x9240, 0x0F4F, 0x9245, 0x0F58, 0x9246, 0x25DC, 0x9248, 0x25D1,
+ 0x9249, 0x0F56, 0x924A, 0x25DB, 0x924B, 0x0F52, 0x924C, 0x25ED,
+ 0x924D, 0x0F57, 0x924E, 0x25EB, 0x924F, 0x25DF, 0x9250, 0x25E9,
+ 0x9251, 0x0F54, 0x9252, 0x25D2, 0x9253, 0x25EC, 0x9254, 0x25E7,
+ 0x9256, 0x25EE, 0x9257, 0x0F4C, 0x925A, 0x0F5B, 0x925B, 0x0F51,
+ 0x925E, 0x25D8, 0x9260, 0x25E0, 0x9261, 0x25E4, 0x9263, 0x25E8,
+ 0x9264, 0x0F53, 0x9265, 0x25D7, 0x9266, 0x25D5, 0x9267, 0x25E1,
+ 0x926C, 0x25DE, 0x926D, 0x25DD, 0x926F, 0x25E2, 0x9270, 0x25E5,
+ 0x9272, 0x25EA, 0x9276, 0x2831, 0x9278, 0x10D3, 0x9279, 0x283B,
+ 0x927A, 0x2833, 0x927B, 0x10D9, 0x927C, 0x10DD, 0x927D, 0x2844,
+ 0x927E, 0x284C, 0x927F, 0x283D, 0x9280, 0x10D5, 0x9282, 0x2841,
+ 0x9283, 0x25D9, 0x9285, 0x10D6, 0x9286, 0x2848, 0x9287, 0x284D,
+ 0x9288, 0x2845, 0x928A, 0x2847, 0x928B, 0x2850, 0x928C, 0x2849,
+ 0x928D, 0x2837, 0x928E, 0x2840, 0x9291, 0x10DE, 0x9293, 0x10DA,
+ 0x9294, 0x2835, 0x9295, 0x2842, 0x9296, 0x10D8, 0x9297, 0x283C,
+ 0x9298, 0x10D7, 0x9299, 0x284A, 0x929A, 0x2839, 0x929B, 0x2832,
+ 0x929C, 0x10DB, 0x929D, 0x284F, 0x92A0, 0x2834, 0x92A1, 0x2846,
+ 0x92A2, 0x2843, 0x92A3, 0x283E, 0x92A4, 0x2830, 0x92A5, 0x282F,
+ 0x92A6, 0x2838, 0x92A7, 0x284B, 0x92A8, 0x10DC, 0x92A9, 0x284E,
+ 0x92AA, 0x2836, 0x92AB, 0x283A, 0x92AC, 0x10D4, 0x92B2, 0x125F,
+ 0x92B3, 0x125A, 0x92B4, 0x2AB0, 0x92B5, 0x2AAC, 0x92B6, 0x2A94,
+ 0x92B7, 0x1256, 0x92B9, 0x36E9, 0x92BB, 0x1255, 0x92BC, 0x125B,
+ 0x92C0, 0x2A92, 0x92C1, 0x1259, 0x92C2, 0x2A9E, 0x92C3, 0x2A90,
+ 0x92C4, 0x2A91, 0x92C5, 0x1254, 0x92C6, 0x2AAF, 0x92C7, 0x125D,
+ 0x92C8, 0x2AA1, 0x92C9, 0x2AA6, 0x92CA, 0x2AA0, 0x92CB, 0x2CD3,
+ 0x92CC, 0x2A9C, 0x92CD, 0x2AA4, 0x92CE, 0x2AA2, 0x92CF, 0x2A95,
+ 0x92D0, 0x2A8F, 0x92D1, 0x2AAA, 0x92D2, 0x125C, 0x92D3, 0x2AAB,
+ 0x92D5, 0x2AA5, 0x92D7, 0x2A9A, 0x92D8, 0x2A98, 0x92D9, 0x2A93,
+ 0x92DD, 0x2A9B, 0x92DE, 0x2AA8, 0x92DF, 0x2A97, 0x92E0, 0x2AA7,
+ 0x92E1, 0x2AAD, 0x92E4, 0x1258, 0x92E6, 0x2AA3, 0x92E7, 0x2AA9,
+ 0x92E8, 0x2A9F, 0x92E9, 0x2A99, 0x92EA, 0x1257, 0x92EE, 0x283F,
+ 0x92EF, 0x2A9D, 0x92F0, 0x125E, 0x92F1, 0x2A96, 0x92F7, 0x2CD8,
+ 0x92F8, 0x1377, 0x92F9, 0x2CD7, 0x92FA, 0x2CD5, 0x92FB, 0x2CE7,
+ 0x92FC, 0x137B, 0x92FE, 0x2CE4, 0x92FF, 0x2CDC, 0x9300, 0x2CE6,
+ 0x9301, 0x2CCE, 0x9302, 0x2CDA, 0x9304, 0x137D, 0x9306, 0x2CC6,
+ 0x9308, 0x2CC4, 0x9309, 0x2CE5, 0x930B, 0x2CE3, 0x930C, 0x2CE2,
+ 0x930D, 0x2CD2, 0x930E, 0x2CD1, 0x930F, 0x2CC7, 0x9310, 0x137F,
+ 0x9312, 0x2CCD, 0x9313, 0x2CD6, 0x9314, 0x2CE1, 0x9315, 0x1382,
+ 0x9316, 0x2CE8, 0x9318, 0x14A3, 0x9319, 0x1384, 0x931A, 0x137E,
+ 0x931B, 0x2CCB, 0x931D, 0x2CD4, 0x931E, 0x2CC3, 0x931F, 0x2CC5,
+ 0x9320, 0x1375, 0x9321, 0x1381, 0x9322, 0x137A, 0x9323, 0x2CCC,
+ 0x9324, 0x2CDB, 0x9325, 0x2AAE, 0x9326, 0x1380, 0x9327, 0x2CC2,
+ 0x9328, 0x149E, 0x9329, 0x2CDD, 0x932A, 0x2CE0, 0x932B, 0x137C,
+ 0x932D, 0x2CD0, 0x932E, 0x1383, 0x932F, 0x1379, 0x9333, 0x1378,
+ 0x9334, 0x2CD9, 0x9335, 0x2CDF, 0x9336, 0x1376, 0x9338, 0x2CC9,
+ 0x9339, 0x2CDE, 0x933C, 0x2CCA, 0x9346, 0x2CCF, 0x9347, 0x2E8D,
+ 0x9349, 0x2E92, 0x934A, 0x14A0, 0x934B, 0x14A2, 0x934C, 0x2E98,
+ 0x934D, 0x149C, 0x934E, 0x2EA6, 0x934F, 0x2E9E, 0x9350, 0x2E93,
+ 0x9351, 0x2E94, 0x9352, 0x2E9D, 0x9354, 0x14A9, 0x9355, 0x2E9C,
+ 0x9356, 0x2E8C, 0x9357, 0x2E9B, 0x9358, 0x2E8F, 0x9359, 0x2EA7,
+ 0x935A, 0x14A8, 0x935B, 0x14A6, 0x935C, 0x2E90, 0x935E, 0x2EA3,
+ 0x9360, 0x2E95, 0x9361, 0x2EA2, 0x9363, 0x2EA4, 0x9364, 0x2E8B,
+ 0x9365, 0x14A1, 0x9367, 0x2EA5, 0x936A, 0x2E99, 0x936C, 0x14A5,
+ 0x936D, 0x2E96, 0x9370, 0x14A7, 0x9371, 0x2E9F, 0x9375, 0x149F,
+ 0x9376, 0x2E91, 0x9377, 0x2EA0, 0x9379, 0x2E9A, 0x937A, 0x2CC8,
+ 0x937B, 0x2EA1, 0x937C, 0x2E8E, 0x937E, 0x14A4, 0x9380, 0x3014,
+ 0x9382, 0x149D, 0x9383, 0x2E89, 0x9388, 0x3011, 0x9389, 0x300A,
+ 0x938A, 0x1540, 0x938C, 0x3005, 0x938D, 0x3015, 0x938E, 0x300C,
+ 0x938F, 0x2E97, 0x9391, 0x3017, 0x9392, 0x3006, 0x9394, 0x153F,
+ 0x9395, 0x3010, 0x9396, 0x1541, 0x9397, 0x1549, 0x9398, 0x1547,
+ 0x9399, 0x3012, 0x939A, 0x1548, 0x939B, 0x3008, 0x939D, 0x3009,
+ 0x939E, 0x300E, 0x939F, 0x3013, 0x93A1, 0x2E88, 0x93A2, 0x1542,
+ 0x93A3, 0x301C, 0x93A4, 0x3019, 0x93A5, 0x3160, 0x93A6, 0x300F,
+ 0x93A7, 0x300B, 0x93A8, 0x301A, 0x93A9, 0x3155, 0x93AA, 0x300D,
+ 0x93AC, 0x1545, 0x93AE, 0x1544, 0x93AF, 0x2E8A, 0x93B0, 0x1546,
+ 0x93B1, 0x3016, 0x93B2, 0x3018, 0x93B3, 0x1543, 0x93B4, 0x301B,
+ 0x93B5, 0x3004, 0x93B7, 0x3007, 0x93C0, 0x315E, 0x93C2, 0x314E,
+ 0x93C3, 0x15E0, 0x93C4, 0x315C, 0x93C7, 0x314C, 0x93C8, 0x15E1,
+ 0x93CA, 0x3157, 0x93CC, 0x3153, 0x93CD, 0x15E6, 0x93CE, 0x315D,
+ 0x93CF, 0x314D, 0x93D0, 0x3150, 0x93D1, 0x15DE, 0x93D2, 0x315F,
+ 0x93D4, 0x3158, 0x93D5, 0x315B, 0x93D6, 0x15E4, 0x93D7, 0x15E9,
+ 0x93D8, 0x15E7, 0x93D9, 0x3154, 0x93DA, 0x314F, 0x93DC, 0x15E2,
+ 0x93DD, 0x15E3, 0x93DE, 0x314B, 0x93DF, 0x15DF, 0x93E1, 0x15DD,
+ 0x93E2, 0x15E5, 0x93E3, 0x315A, 0x93E4, 0x15E8, 0x93E6, 0x3156,
+ 0x93E7, 0x3161, 0x93E8, 0x15EA, 0x93EC, 0x3152, 0x93EE, 0x3159,
+ 0x93F5, 0x325A, 0x93F6, 0x3269, 0x93F7, 0x325C, 0x93F8, 0x3263,
+ 0x93F9, 0x3151, 0x93FA, 0x3261, 0x93FB, 0x3250, 0x93FC, 0x3267,
+ 0x93FD, 0x1654, 0x93FE, 0x3254, 0x93FF, 0x3266, 0x9400, 0x325B,
+ 0x9403, 0x1653, 0x9406, 0x326B, 0x9407, 0x325D, 0x9409, 0x3262,
+ 0x940A, 0x3265, 0x940B, 0x324E, 0x940C, 0x3268, 0x940D, 0x3259,
+ 0x940E, 0x325E, 0x940F, 0x3252, 0x9410, 0x3256, 0x9411, 0x326A,
+ 0x9412, 0x3260, 0x9413, 0x324F, 0x9414, 0x3253, 0x9415, 0x3255,
+ 0x9416, 0x325F, 0x9418, 0x1652, 0x9419, 0x3258, 0x9420, 0x3251,
+ 0x9428, 0x3257, 0x9429, 0x3325, 0x942A, 0x3329, 0x942B, 0x169F,
+ 0x942C, 0x332B, 0x942E, 0x1699, 0x9430, 0x3327, 0x9431, 0x332D,
+ 0x9432, 0x169E, 0x9433, 0x169A, 0x9435, 0x169B, 0x9436, 0x3324,
+ 0x9437, 0x332A, 0x9438, 0x169D, 0x9439, 0x3328, 0x943A, 0x169C,
+ 0x943B, 0x3323, 0x943C, 0x3264, 0x943D, 0x3326, 0x943F, 0x3322,
+ 0x9440, 0x332C, 0x9444, 0x16DF, 0x9445, 0x33CD, 0x9446, 0x33D0,
+ 0x9447, 0x33CC, 0x9448, 0x33CE, 0x9449, 0x33CF, 0x944A, 0x33C9,
+ 0x944B, 0x33CA, 0x944C, 0x33C7, 0x944F, 0x33CB, 0x9450, 0x33C8,
+ 0x9451, 0x16E0, 0x9452, 0x16E1, 0x9455, 0x3448, 0x9457, 0x344A,
+ 0x945D, 0x3449, 0x945E, 0x344B, 0x9460, 0x170E, 0x9462, 0x3447,
+ 0x9463, 0x170D, 0x9464, 0x170F, 0x9468, 0x34A6, 0x9469, 0x34A7,
+ 0x946A, 0x1731, 0x946B, 0x34A5, 0x946D, 0x34ED, 0x946E, 0x34EC,
+ 0x946F, 0x34EE, 0x9470, 0x174C, 0x9471, 0x34EF, 0x9472, 0x174B,
+ 0x9473, 0x34F0, 0x9474, 0x350C, 0x9475, 0x350F, 0x9476, 0x350E,
+ 0x9477, 0x1755, 0x9478, 0x350D, 0x947C, 0x175F, 0x947D, 0x175D,
+ 0x947E, 0x175E, 0x947F, 0x1764, 0x9480, 0x3539, 0x9481, 0x353A,
+ 0x9482, 0x3538, 0x9483, 0x3540, 0x9577, 0x0697, 0x957A, 0x20A1,
+ 0x957B, 0x234A, 0x957C, 0x2AB1, 0x957D, 0x3162, 0x9580, 0x0698,
+ 0x9582, 0x0821, 0x9583, 0x09EA, 0x9586, 0x20A2, 0x9588, 0x20A3,
+ 0x9589, 0x0BD0, 0x958B, 0x0D9A, 0x958C, 0x234C, 0x958D, 0x234B,
+ 0x958E, 0x0D9E, 0x958F, 0x0D99, 0x9590, 0x234D, 0x9591, 0x0D9B,
+ 0x9592, 0x0D9D, 0x9593, 0x0D9C, 0x9594, 0x0D98, 0x9598, 0x0F5C,
+ 0x959B, 0x25F3, 0x959C, 0x25F1, 0x959E, 0x25F2, 0x959F, 0x25F0,
+ 0x95A1, 0x10DF, 0x95A3, 0x10E2, 0x95A4, 0x10E4, 0x95A5, 0x10E3,
+ 0x95A8, 0x10E0, 0x95A9, 0x10E1, 0x95AB, 0x2AB3, 0x95AC, 0x2AB2,
+ 0x95AD, 0x1260, 0x95AE, 0x2AB4, 0x95B0, 0x2AB5, 0x95B1, 0x1261,
+ 0x95B5, 0x2CF0, 0x95B6, 0x2CEE, 0x95B7, 0x2EAD, 0x95B9, 0x2CEC,
+ 0x95BA, 0x2CED, 0x95BB, 0x1385, 0x95BC, 0x2CE9, 0x95BD, 0x2CF1,
+ 0x95BE, 0x2CEB, 0x95BF, 0x2CEF, 0x95C0, 0x2EA9, 0x95C3, 0x2EAB,
+ 0x95C5, 0x2EAC, 0x95C6, 0x14AE, 0x95C7, 0x2EA8, 0x95C8, 0x14AD,
+ 0x95C9, 0x2EAA, 0x95CA, 0x14AA, 0x95CB, 0x14AB, 0x95CC, 0x14AC,
+ 0x95CD, 0x2CEA, 0x95D0, 0x154C, 0x95D1, 0x301F, 0x95D2, 0x301D,
+ 0x95D3, 0x301E, 0x95D4, 0x154A, 0x95D5, 0x154D, 0x95D6, 0x154B,
+ 0x95DA, 0x3163, 0x95DB, 0x3164, 0x95DC, 0x15EB, 0x95DE, 0x326C,
+ 0x95DF, 0x326E, 0x95E0, 0x326D, 0x95E1, 0x1655, 0x95E2, 0x16A0,
+ 0x95E3, 0x3330, 0x95E4, 0x332F, 0x95E5, 0x332E, 0x961C, 0x0699,
+ 0x961E, 0x17B4, 0x9620, 0x1821, 0x9621, 0x0414, 0x9622, 0x181F,
+ 0x9623, 0x1822, 0x9624, 0x1820, 0x9628, 0x18F1, 0x962A, 0x0526,
+ 0x962C, 0x0527, 0x962D, 0x18F3, 0x962E, 0x0524, 0x962F, 0x18F2,
+ 0x9630, 0x18F0, 0x9631, 0x0525, 0x9632, 0x0523, 0x9639, 0x1A55,
+ 0x963A, 0x1A58, 0x963B, 0x069C, 0x963C, 0x1A57, 0x963D, 0x1A56,
+ 0x963F, 0x069B, 0x9640, 0x069A, 0x9642, 0x069E, 0x9643, 0x1A59,
+ 0x9644, 0x069D, 0x964A, 0x1C1A, 0x964B, 0x0823, 0x964C, 0x0824,
+ 0x964D, 0x0825, 0x964E, 0x1C1B, 0x964F, 0x1C17, 0x9650, 0x0822,
+ 0x9651, 0x1C18, 0x9653, 0x1C19, 0x9654, 0x1C16, 0x9658, 0x09F1,
+ 0x965B, 0x09EE, 0x965C, 0x1E2F, 0x965D, 0x09EF, 0x965E, 0x09F2,
+ 0x965F, 0x1E30, 0x9661, 0x09ED, 0x9662, 0x09EB, 0x9663, 0x09EC,
+ 0x9664, 0x09F0, 0x966A, 0x0BD1, 0x966B, 0x20A6, 0x966C, 0x0BD9,
+ 0x966D, 0x20A5, 0x966F, 0x20A8, 0x9670, 0x0BD5, 0x9671, 0x20A7,
+ 0x9672, 0x0DA6, 0x9673, 0x0BD3, 0x9674, 0x0BD6, 0x9675, 0x0BD2,
+ 0x9676, 0x0BD7, 0x9677, 0x0BD8, 0x9678, 0x0BD4, 0x967C, 0x20A4,
+ 0x967D, 0x0DA2, 0x967E, 0x234F, 0x9680, 0x2353, 0x9683, 0x2352,
+ 0x9684, 0x0DA7, 0x9685, 0x0DA3, 0x9686, 0x0DA4, 0x9687, 0x234E,
+ 0x9688, 0x2350, 0x9689, 0x2351, 0x968A, 0x0D9F, 0x968B, 0x0DA1,
+ 0x968D, 0x0DA5, 0x968E, 0x0DA0, 0x9691, 0x25F6, 0x9692, 0x25F4,
+ 0x9693, 0x25F5, 0x9694, 0x0F5E, 0x9695, 0x0F5F, 0x9697, 0x25F7,
+ 0x9698, 0x0F5D, 0x9699, 0x10E5, 0x969B, 0x10E7, 0x969C, 0x10E6,
+ 0x969E, 0x2852, 0x96A1, 0x2853, 0x96A2, 0x2AB7, 0x96A4, 0x2AB6,
+ 0x96A7, 0x1386, 0x96A8, 0x1387, 0x96A9, 0x2CF2, 0x96AA, 0x1388,
+ 0x96AC, 0x2EB0, 0x96AE, 0x2EAE, 0x96B0, 0x2EAF, 0x96B1, 0x14AF,
+ 0x96B3, 0x3020, 0x96B4, 0x15EC, 0x96B6, 0x0231, 0x96B8, 0x14B0,
+ 0x96B9, 0x069F, 0x96BB, 0x09F3, 0x96BC, 0x1E31, 0x96BF, 0x20A9,
+ 0x96C0, 0x0BDA, 0x96C1, 0x0DA8, 0x96C2, 0x2354, 0x96C3, 0x2356,
+ 0x96C4, 0x0DAA, 0x96C5, 0x0DA9, 0x96C6, 0x0DAB, 0x96C7, 0x0DAC,
+ 0x96C8, 0x2355, 0x96C9, 0x0F62, 0x96CA, 0x0F63, 0x96CB, 0x0F61,
+ 0x96CC, 0x10E8, 0x96CD, 0x0F60, 0x96CE, 0x25F8, 0x96D2, 0x10E9,
+ 0x96D3, 0x2AB8, 0x96D4, 0x2CF3, 0x96D5, 0x1389, 0x96D6, 0x14B1,
+ 0x96D7, 0x3021, 0x96D8, 0x3025, 0x96D9, 0x1550, 0x96DA, 0x3022,
+ 0x96DB, 0x1551, 0x96DC, 0x154F, 0x96DD, 0x3026, 0x96DE, 0x1552,
+ 0x96DF, 0x3024, 0x96E1, 0x3165, 0x96E2, 0x154E, 0x96E3, 0x15ED,
+ 0x96E5, 0x34A8, 0x96E8, 0x06A0, 0x96E9, 0x0BDC, 0x96EA, 0x0BDB,
+ 0x96EF, 0x0DAD, 0x96F0, 0x2358, 0x96F1, 0x2357, 0x96F2, 0x0DAE,
+ 0x96F5, 0x25FC, 0x96F6, 0x0F67, 0x96F7, 0x0F64, 0x96F8, 0x25FB,
+ 0x96F9, 0x0F66, 0x96FA, 0x25F9, 0x96FB, 0x0F65, 0x96FD, 0x25FA,
+ 0x96FF, 0x2854, 0x9700, 0x10EA, 0x9702, 0x2ABB, 0x9704, 0x1262,
+ 0x9705, 0x2AB9, 0x9706, 0x1263, 0x9707, 0x1264, 0x9708, 0x2ABA,
+ 0x9709, 0x1265, 0x970B, 0x2CF4, 0x970D, 0x138D, 0x970E, 0x138A,
+ 0x970F, 0x138F, 0x9710, 0x2CF6, 0x9711, 0x138B, 0x9712, 0x2CF5,
+ 0x9713, 0x138E, 0x9716, 0x138C, 0x9718, 0x2EB3, 0x9719, 0x2EB5,
+ 0x971C, 0x14B2, 0x971D, 0x2EB4, 0x971E, 0x14B3, 0x971F, 0x2EB2,
+ 0x9720, 0x2EB1, 0x9722, 0x3028, 0x9723, 0x3027, 0x9724, 0x1553,
+ 0x9725, 0x3029, 0x9726, 0x316A, 0x9727, 0x15EF, 0x9728, 0x3169,
+ 0x9729, 0x3166, 0x972A, 0x15EE, 0x972B, 0x3167, 0x972C, 0x3168,
+ 0x972E, 0x326F, 0x972F, 0x3270, 0x9730, 0x1656, 0x9732, 0x16A3,
+ 0x9735, 0x3331, 0x9738, 0x16A1, 0x9739, 0x16A2, 0x973A, 0x3332,
+ 0x973D, 0x16E2, 0x973E, 0x16E3, 0x973F, 0x33D1, 0x9742, 0x1732,
+ 0x9743, 0x34AA, 0x9744, 0x1734, 0x9746, 0x34A9, 0x9747, 0x34AB,
+ 0x9748, 0x1733, 0x9749, 0x34F1, 0x974B, 0x3526, 0x9752, 0x06A1,
+ 0x9756, 0x0F68, 0x9758, 0x2855, 0x975A, 0x2ABC, 0x975B, 0x1390,
+ 0x975C, 0x1391, 0x975E, 0x06A2, 0x9760, 0x1266, 0x9761, 0x15F0,
+ 0x9762, 0x0826, 0x9766, 0x1392, 0x9768, 0x1710, 0x9769, 0x0827,
+ 0x976A, 0x20AA, 0x976C, 0x2359, 0x976E, 0x235B, 0x9770, 0x235A,
+ 0x9772, 0x2600, 0x9773, 0x25FD, 0x9774, 0x0F69, 0x9776, 0x0F6A,
+ 0x9777, 0x25FE, 0x9778, 0x25FF, 0x977A, 0x2857, 0x977B, 0x285C,
+ 0x977C, 0x10EB, 0x977D, 0x2856, 0x977E, 0x2858, 0x977F, 0x285F,
+ 0x9780, 0x285A, 0x9781, 0x285E, 0x9782, 0x285B, 0x9783, 0x2859,
+ 0x9784, 0x285D, 0x9785, 0x10EC, 0x9788, 0x2ABF, 0x978A, 0x2ABD,
+ 0x978B, 0x1268, 0x978D, 0x1267, 0x978E, 0x2ABE, 0x978F, 0x1269,
+ 0x9794, 0x2CF9, 0x9797, 0x2CF8, 0x9798, 0x1393, 0x9799, 0x2CF7,
+ 0x979A, 0x2EB6, 0x979C, 0x2EB8, 0x979D, 0x2EBA, 0x979E, 0x2EB9,
+ 0x97A0, 0x14B4, 0x97A1, 0x2EB7, 0x97A2, 0x3030, 0x97A3, 0x1554,
+ 0x97A4, 0x302E, 0x97A5, 0x3031, 0x97A6, 0x1555, 0x97A8, 0x302C,
+ 0x97AA, 0x302F, 0x97AB, 0x302D, 0x97AC, 0x302A, 0x97AD, 0x1556,
+ 0x97AE, 0x302B, 0x97B3, 0x316B, 0x97B6, 0x316D, 0x97B7, 0x316C,
+ 0x97B9, 0x3271, 0x97BB, 0x3272, 0x97BF, 0x3333, 0x97C1, 0x16E5,
+ 0x97C3, 0x16E4, 0x97C4, 0x344C, 0x97C5, 0x344D, 0x97C6, 0x1735,
+ 0x97C7, 0x34AC, 0x97C9, 0x1756, 0x97CB, 0x0828, 0x97CC, 0x0DAF,
+ 0x97CD, 0x2861, 0x97CE, 0x2860, 0x97CF, 0x2AC1, 0x97D0, 0x2AC0,
+ 0x97D3, 0x14B5, 0x97D4, 0x2EBC, 0x97D5, 0x2EBB, 0x97D6, 0x3034,
+ 0x97D7, 0x3032, 0x97D8, 0x3035, 0x97D9, 0x3033, 0x97DC, 0x15F1,
+ 0x97DD, 0x316E, 0x97DE, 0x316F, 0x97DF, 0x3170, 0x97E1, 0x3334,
+ 0x97E3, 0x33D2, 0x97E5, 0x34AD, 0x97ED, 0x0829, 0x97F0, 0x2CFA,
+ 0x97F1, 0x2EBD, 0x97F3, 0x082A, 0x97F6, 0x10ED, 0x97F8, 0x2CFB,
+ 0x97F9, 0x1557, 0x97FA, 0x3036, 0x97FB, 0x15F2, 0x97FD, 0x3273,
+ 0x97FE, 0x3274, 0x97FF, 0x16A4, 0x9800, 0x344E, 0x9801, 0x082B,
+ 0x9802, 0x0BDF, 0x9803, 0x0BE0, 0x9804, 0x20AB, 0x9805, 0x0DB0,
+ 0x9806, 0x0DB1, 0x9807, 0x235C, 0x9808, 0x0DB2, 0x980A, 0x0F6E,
+ 0x980C, 0x0F70, 0x980D, 0x2602, 0x980E, 0x2603, 0x980F, 0x2601,
+ 0x9810, 0x0F6B, 0x9811, 0x0F6C, 0x9812, 0x0F6F, 0x9813, 0x0F6D,
+ 0x9816, 0x2862, 0x9817, 0x10EE, 0x9818, 0x10EF, 0x981B, 0x2AC8,
+ 0x981C, 0x126C, 0x981D, 0x2AC3, 0x981E, 0x2AC2, 0x9820, 0x2AC7,
+ 0x9821, 0x126A, 0x9824, 0x139A, 0x9826, 0x2AC4, 0x9827, 0x2AC9,
+ 0x9828, 0x2AC6, 0x9829, 0x2AC5, 0x982B, 0x126B, 0x982D, 0x1398,
+ 0x982F, 0x2CFD, 0x9830, 0x1394, 0x9832, 0x2CFE, 0x9835, 0x2CFC,
+ 0x9837, 0x1397, 0x9838, 0x1395, 0x9839, 0x1399, 0x983B, 0x1396,
+ 0x9841, 0x2EBE, 0x9843, 0x2EC3, 0x9844, 0x2EBF, 0x9845, 0x2EC2,
+ 0x9846, 0x14B6, 0x9848, 0x2DF2, 0x9849, 0x2EC1, 0x984A, 0x2EC0,
+ 0x984C, 0x155A, 0x984D, 0x1558, 0x984E, 0x155B, 0x984F, 0x1559,
+ 0x9850, 0x3037, 0x9851, 0x3038, 0x9852, 0x3039, 0x9853, 0x155C,
+ 0x9857, 0x3174, 0x9858, 0x15F4, 0x9859, 0x3172, 0x985B, 0x15F5,
+ 0x985C, 0x3171, 0x985D, 0x3173, 0x985E, 0x15F3, 0x985F, 0x3278,
+ 0x9860, 0x3275, 0x9862, 0x3276, 0x9863, 0x3277, 0x9864, 0x3335,
+ 0x9865, 0x16A6, 0x9867, 0x16A5, 0x9869, 0x33D4, 0x986A, 0x33D3,
+ 0x986B, 0x16E6, 0x986F, 0x1711, 0x9870, 0x1736, 0x9871, 0x174D,
+ 0x9872, 0x34F2, 0x9873, 0x3527, 0x9874, 0x3528, 0x98A8, 0x082C,
+ 0x98A9, 0x235D, 0x98AC, 0x2604, 0x98AD, 0x2863, 0x98AE, 0x2864,
+ 0x98AF, 0x10F0, 0x98B1, 0x10F1, 0x98B2, 0x2ACA, 0x98B3, 0x126D,
+ 0x98B6, 0x14B7, 0x98B8, 0x303A, 0x98BA, 0x155D, 0x98BB, 0x3177,
+ 0x98BC, 0x15F6, 0x98BD, 0x3176, 0x98BE, 0x3178, 0x98BF, 0x3175,
+ 0x98C0, 0x3338, 0x98C1, 0x3279, 0x98C2, 0x327A, 0x98C4, 0x1657,
+ 0x98C6, 0x3337, 0x98C9, 0x3336, 0x98CB, 0x33D5, 0x98CC, 0x3529,
+ 0x98DB, 0x082D, 0x98DF, 0x082E, 0x98E2, 0x09F4, 0x98E3, 0x1E32,
+ 0x98E5, 0x20AC, 0x98E7, 0x0DB3, 0x98E9, 0x0DB6, 0x98EA, 0x0DB4,
+ 0x98EB, 0x235E, 0x98ED, 0x0DB8, 0x98EF, 0x0DB5, 0x98F2, 0x0DB7,
+ 0x98F4, 0x0F72, 0x98F6, 0x2605, 0x98F9, 0x2606, 0x98FA, 0x2ACC,
+ 0x98FC, 0x0F71, 0x98FD, 0x0F73, 0x98FE, 0x0F74, 0x9900, 0x2866,
+ 0x9902, 0x2865, 0x9903, 0x10F2, 0x9905, 0x10F3, 0x9907, 0x2867,
+ 0x9908, 0x2ACB, 0x9909, 0x10F5, 0x990A, 0x126E, 0x990C, 0x10F4,
+ 0x9910, 0x139B, 0x9911, 0x2ACD, 0x9912, 0x1270, 0x9913, 0x126F,
+ 0x9914, 0x2ACE, 0x9915, 0x2AD1, 0x9916, 0x2ACF, 0x9917, 0x2AD0,
+ 0x9918, 0x1271, 0x991A, 0x13A0, 0x991B, 0x139E, 0x991E, 0x139D,
+ 0x991F, 0x2D00, 0x9921, 0x139F, 0x9924, 0x2CFF, 0x9925, 0x2EC4,
+ 0x9927, 0x2D01, 0x9928, 0x139C, 0x9929, 0x2D02, 0x992A, 0x2EC7,
+ 0x992B, 0x2EC5, 0x992C, 0x2EC6, 0x992D, 0x2ECB, 0x992E, 0x1561,
+ 0x992F, 0x2ECA, 0x9930, 0x2ECD, 0x9931, 0x2ECC, 0x9932, 0x2EC9,
+ 0x9933, 0x2EC8, 0x9935, 0x14B8, 0x993A, 0x303D, 0x993C, 0x303C,
+ 0x993D, 0x1560, 0x993E, 0x155E, 0x993F, 0x155F, 0x9941, 0x303B,
+ 0x9943, 0x317B, 0x9945, 0x15F7, 0x9947, 0x317A, 0x9948, 0x3179,
+ 0x9949, 0x15F8, 0x994B, 0x327F, 0x994C, 0x327E, 0x994E, 0x327C,
+ 0x9950, 0x327B, 0x9951, 0x1659, 0x9952, 0x1658, 0x9953, 0x3280,
+ 0x9954, 0x33D6, 0x9955, 0x16E7, 0x9956, 0x333A, 0x9957, 0x16A7,
+ 0x9958, 0x3339, 0x9959, 0x327D, 0x995B, 0x33D7, 0x995C, 0x1712,
+ 0x995E, 0x174E, 0x995F, 0x34F3, 0x9961, 0x352A, 0x9996, 0x082F,
+ 0x9997, 0x20AD, 0x9998, 0x2ECE, 0x9999, 0x0830, 0x999C, 0x2869,
+ 0x999D, 0x2868, 0x999E, 0x2D03, 0x99A1, 0x2ED0, 0x99A3, 0x2ECF,
+ 0x99A5, 0x1562, 0x99A6, 0x317C, 0x99A7, 0x317D, 0x99A8, 0x165A,
+ 0x99AB, 0x352B, 0x99AC, 0x09F5, 0x99AD, 0x0DBA, 0x99AE, 0x0DB9,
+ 0x99AF, 0x2607, 0x99B0, 0x2609, 0x99B1, 0x0F76, 0x99B2, 0x2608,
+ 0x99B3, 0x0F75, 0x99B4, 0x0F77, 0x99B5, 0x260A, 0x99B9, 0x286B,
+ 0x99BA, 0x286D, 0x99BB, 0x286C, 0x99BD, 0x286F, 0x99C1, 0x10F6,
+ 0x99C2, 0x286E, 0x99C3, 0x286A, 0x99C7, 0x2870, 0x99C9, 0x2AD8,
+ 0x99CB, 0x2ADB, 0x99CC, 0x2ADD, 0x99CD, 0x2AD3, 0x99CE, 0x2AD7,
+ 0x99CF, 0x2AD4, 0x99D0, 0x1273, 0x99D1, 0x1276, 0x99D2, 0x1278,
+ 0x99D3, 0x2AD5, 0x99D4, 0x2AD6, 0x99D5, 0x1277, 0x99D6, 0x2AD9,
+ 0x99D7, 0x2ADC, 0x99D8, 0x2ADA, 0x99D9, 0x1279, 0x99DB, 0x1275,
+ 0x99DC, 0x2AD2, 0x99DD, 0x1272, 0x99DF, 0x1274, 0x99E2, 0x13A2,
+ 0x99E3, 0x2D09, 0x99E4, 0x2D07, 0x99E5, 0x2D06, 0x99E7, 0x2D0C,
+ 0x99E9, 0x2D0B, 0x99EA, 0x2D0A, 0x99EC, 0x2D05, 0x99ED, 0x13A1,
+ 0x99EE, 0x2D04, 0x99F0, 0x2D08, 0x99F1, 0x13A3, 0x99F4, 0x2ED3,
+ 0x99F6, 0x2ED7, 0x99F7, 0x2ED4, 0x99F8, 0x2ED6, 0x99F9, 0x2ED5,
+ 0x99FA, 0x2ED2, 0x99FB, 0x2ED8, 0x99FC, 0x2EDB, 0x99FD, 0x2ED9,
+ 0x99FE, 0x2EDA, 0x99FF, 0x14BA, 0x9A01, 0x14B9, 0x9A02, 0x2ED1,
+ 0x9A03, 0x2EDC, 0x9A04, 0x3042, 0x9A05, 0x3045, 0x9A06, 0x3047,
+ 0x9A07, 0x3046, 0x9A09, 0x3040, 0x9A0A, 0x3044, 0x9A0B, 0x303F,
+ 0x9A0D, 0x3041, 0x9A0E, 0x1563, 0x9A0F, 0x303E, 0x9A11, 0x3043,
+ 0x9A14, 0x318A, 0x9A15, 0x317F, 0x9A16, 0x15F9, 0x9A19, 0x15FA,
+ 0x9A1A, 0x317E, 0x9A1B, 0x3183, 0x9A1C, 0x3189, 0x9A1D, 0x3181,
+ 0x9A1E, 0x3188, 0x9A20, 0x3185, 0x9A22, 0x3184, 0x9A23, 0x3187,
+ 0x9A24, 0x3182, 0x9A25, 0x3180, 0x9A27, 0x3186, 0x9A29, 0x3287,
+ 0x9A2A, 0x3285, 0x9A2B, 0x165B, 0x9A2C, 0x3284, 0x9A2D, 0x328A,
+ 0x9A2E, 0x3288, 0x9A30, 0x165C, 0x9A31, 0x3283, 0x9A32, 0x3281,
+ 0x9A34, 0x3282, 0x9A35, 0x165E, 0x9A36, 0x3286, 0x9A37, 0x165D,
+ 0x9A38, 0x3289, 0x9A39, 0x333B, 0x9A3A, 0x3341, 0x9A3D, 0x333C,
+ 0x9A3E, 0x16AB, 0x9A3F, 0x3342, 0x9A40, 0x16AA, 0x9A41, 0x3340,
+ 0x9A42, 0x333F, 0x9A43, 0x16A9, 0x9A44, 0x333E, 0x9A45, 0x16A8,
+ 0x9A46, 0x333D, 0x9A48, 0x33DD, 0x9A49, 0x33DF, 0x9A4A, 0x33DE,
+ 0x9A4C, 0x33DB, 0x9A4D, 0x16E9, 0x9A4E, 0x33D8, 0x9A4F, 0x33DC,
+ 0x9A50, 0x33E1, 0x9A52, 0x33E0, 0x9A53, 0x33D9, 0x9A54, 0x33DA,
+ 0x9A55, 0x16E8, 0x9A56, 0x344F, 0x9A57, 0x1715, 0x9A59, 0x3450,
+ 0x9A5A, 0x1713, 0x9A5B, 0x1714, 0x9A5E, 0x34AE, 0x9A5F, 0x1737,
+ 0x9A60, 0x3510, 0x9A62, 0x1757, 0x9A64, 0x352C, 0x9A65, 0x1758,
+ 0x9A66, 0x352D, 0x9A67, 0x352E, 0x9A68, 0x353C, 0x9A69, 0x353B,
+ 0x9A6A, 0x1767, 0x9A6B, 0x3544, 0x9AA8, 0x09F6, 0x9AAB, 0x260C,
+ 0x9AAD, 0x260B, 0x9AAF, 0x10F7, 0x9AB0, 0x10F8, 0x9AB1, 0x2871,
+ 0x9AB3, 0x2ADE, 0x9AB4, 0x2D0F, 0x9AB7, 0x127A, 0x9AB8, 0x13A4,
+ 0x9AB9, 0x2D0D, 0x9ABB, 0x2D10, 0x9ABC, 0x13A5, 0x9ABE, 0x2EDD,
+ 0x9ABF, 0x2D0E, 0x9AC0, 0x3048, 0x9AC1, 0x1564, 0x9AC2, 0x318B,
+ 0x9AC6, 0x328D, 0x9AC7, 0x328B, 0x9ACA, 0x328C, 0x9ACD, 0x3343,
+ 0x9ACF, 0x16AC, 0x9AD0, 0x33E2, 0x9AD1, 0x1718, 0x9AD2, 0x16EA,
+ 0x9AD3, 0x1716, 0x9AD4, 0x1717, 0x9AD5, 0x34AF, 0x9AD6, 0x174F,
+ 0x9AD8, 0x09F7, 0x9ADC, 0x3049, 0x9ADF, 0x1E33, 0x9AE1, 0x0F78,
+ 0x9AE3, 0x2872, 0x9AE6, 0x10F9, 0x9AE7, 0x2873, 0x9AEB, 0x2AE0,
+ 0x9AEC, 0x2ADF, 0x9AED, 0x13A7, 0x9AEE, 0x127B, 0x9AEF, 0x127C,
+ 0x9AF1, 0x2AE3, 0x9AF2, 0x2AE2, 0x9AF3, 0x2AE1, 0x9AF6, 0x2D11,
+ 0x9AF7, 0x2D14, 0x9AF9, 0x2D13, 0x9AFA, 0x2D12, 0x9AFB, 0x13A6,
+ 0x9AFC, 0x2EE1, 0x9AFD, 0x2EDF, 0x9AFE, 0x2EDE, 0x9B01, 0x2EE0,
+ 0x9B03, 0x1565, 0x9B04, 0x304B, 0x9B05, 0x304C, 0x9B06, 0x1566,
+ 0x9B08, 0x304A, 0x9B0A, 0x318D, 0x9B0B, 0x318C, 0x9B0C, 0x318F,
+ 0x9B0D, 0x15FB, 0x9B0E, 0x318E, 0x9B10, 0x328E, 0x9B11, 0x3290,
+ 0x9B12, 0x328F, 0x9B15, 0x3344, 0x9B16, 0x3347, 0x9B17, 0x3345,
+ 0x9B18, 0x3346, 0x9B19, 0x33E3, 0x9B1A, 0x16EB, 0x9B1E, 0x3451,
+ 0x9B1F, 0x3452, 0x9B20, 0x3453, 0x9B22, 0x1738, 0x9B23, 0x1750,
+ 0x9B24, 0x352F, 0x9B25, 0x09F8, 0x9B27, 0x127D, 0x9B28, 0x13A8,
+ 0x9B29, 0x304D, 0x9B2B, 0x33E4, 0x9B2E, 0x3511, 0x9B2F, 0x1E34,
+ 0x9B31, 0x1768, 0x9B32, 0x09F9, 0x9B33, 0x2D15, 0x9B35, 0x304E,
+ 0x9B37, 0x3190, 0x9B3A, 0x3348, 0x9B3B, 0x33E5, 0x9B3C, 0x09FA,
+ 0x9B3E, 0x2874, 0x9B3F, 0x2875, 0x9B41, 0x10FA, 0x9B42, 0x10FB,
+ 0x9B43, 0x2AE5, 0x9B44, 0x127F, 0x9B45, 0x127E, 0x9B46, 0x2AE4,
+ 0x9B48, 0x2EE2, 0x9B4A, 0x304F, 0x9B4B, 0x3051, 0x9B4C, 0x3050,
+ 0x9B4D, 0x1569, 0x9B4E, 0x1568, 0x9B4F, 0x1567, 0x9B51, 0x16AE,
+ 0x9B52, 0x3349, 0x9B54, 0x16AD, 0x9B55, 0x33E7, 0x9B56, 0x33E6,
+ 0x9B58, 0x1739, 0x9B59, 0x34B0, 0x9B5A, 0x0BE1, 0x9B5B, 0x260D,
+ 0x9B5F, 0x2878, 0x9B60, 0x2876, 0x9B61, 0x2877, 0x9B64, 0x2AEE,
+ 0x9B66, 0x2AE9, 0x9B67, 0x2AE6, 0x9B68, 0x2AED, 0x9B6C, 0x2AEF,
+ 0x9B6F, 0x1281, 0x9B70, 0x2AEC, 0x9B71, 0x2AE8, 0x9B74, 0x2AE7,
+ 0x9B75, 0x2AEB, 0x9B76, 0x2AEA, 0x9B77, 0x1280, 0x9B7A, 0x2D20,
+ 0x9B7B, 0x2D1B, 0x9B7C, 0x2D19, 0x9B7D, 0x2D22, 0x9B7E, 0x2D1A,
+ 0x9B80, 0x2D16, 0x9B82, 0x2D1C, 0x9B85, 0x2D17, 0x9B86, 0x2EEB,
+ 0x9B87, 0x2D18, 0x9B88, 0x2D23, 0x9B90, 0x2D1F, 0x9B91, 0x13A9,
+ 0x9B92, 0x2D1E, 0x9B93, 0x2D1D, 0x9B95, 0x2D21, 0x9B9A, 0x2EE3,
+ 0x9B9B, 0x2EE6, 0x9B9E, 0x2EE5, 0x9BA0, 0x2EED, 0x9BA1, 0x2EE8,
+ 0x9BA2, 0x2EEC, 0x9BA4, 0x2EEA, 0x9BA5, 0x2EE9, 0x9BA6, 0x2EE7,
+ 0x9BA8, 0x2EE4, 0x9BAA, 0x14BD, 0x9BAB, 0x14BC, 0x9BAD, 0x14BE,
+ 0x9BAE, 0x14BB, 0x9BAF, 0x2EEE, 0x9BB5, 0x3057, 0x9BB6, 0x305A,
+ 0x9BB8, 0x3058, 0x9BB9, 0x305C, 0x9BBD, 0x305D, 0x9BBF, 0x3055,
+ 0x9BC0, 0x156E, 0x9BC1, 0x3056, 0x9BC3, 0x3054, 0x9BC4, 0x305B,
+ 0x9BC6, 0x3053, 0x9BC7, 0x3052, 0x9BC8, 0x156D, 0x9BC9, 0x156B,
+ 0x9BCA, 0x156A, 0x9BD3, 0x3059, 0x9BD4, 0x3199, 0x9BD5, 0x319F,
+ 0x9BD6, 0x15FE, 0x9BD7, 0x319A, 0x9BD9, 0x319D, 0x9BDA, 0x31A1,
+ 0x9BDB, 0x15FF, 0x9BDC, 0x319C, 0x9BDE, 0x3194, 0x9BE0, 0x3193,
+ 0x9BE1, 0x31A0, 0x9BE2, 0x3197, 0x9BE4, 0x3195, 0x9BE5, 0x319E,
+ 0x9BE6, 0x3196, 0x9BE7, 0x15FD, 0x9BE8, 0x15FC, 0x9BEA, 0x3191,
+ 0x9BEB, 0x3192, 0x9BEC, 0x319B, 0x9BF0, 0x3198, 0x9BF7, 0x3293,
+ 0x9BF8, 0x3296, 0x9BFD, 0x156C, 0x9C05, 0x3294, 0x9C06, 0x329A,
+ 0x9C07, 0x3298, 0x9C08, 0x3292, 0x9C09, 0x329D, 0x9C0B, 0x3291,
+ 0x9C0D, 0x1660, 0x9C0E, 0x3299, 0x9C12, 0x3295, 0x9C13, 0x165F,
+ 0x9C14, 0x329C, 0x9C17, 0x329B, 0x9C1C, 0x334C, 0x9C1D, 0x334B,
+ 0x9C21, 0x3352, 0x9C23, 0x334E, 0x9C24, 0x3351, 0x9C25, 0x16B0,
+ 0x9C28, 0x334F, 0x9C29, 0x3350, 0x9C2B, 0x334A, 0x9C2C, 0x334D,
+ 0x9C2D, 0x16AF, 0x9C31, 0x16ED, 0x9C32, 0x33F2, 0x9C33, 0x33ED,
+ 0x9C34, 0x33F1, 0x9C36, 0x33F4, 0x9C37, 0x33F0, 0x9C39, 0x33EC,
+ 0x9C3B, 0x16EF, 0x9C3C, 0x33EF, 0x9C3D, 0x33F3, 0x9C3E, 0x16EE,
+ 0x9C3F, 0x33EA, 0x9C40, 0x3297, 0x9C41, 0x33EE, 0x9C44, 0x33EB,
+ 0x9C46, 0x33E8, 0x9C48, 0x33E9, 0x9C49, 0x16EC, 0x9C4A, 0x3457,
+ 0x9C4B, 0x3459, 0x9C4C, 0x345C, 0x9C4D, 0x3458, 0x9C4E, 0x345D,
+ 0x9C50, 0x3456, 0x9C52, 0x3454, 0x9C54, 0x1719, 0x9C55, 0x345A,
+ 0x9C56, 0x171B, 0x9C57, 0x171A, 0x9C58, 0x3455, 0x9C59, 0x345B,
+ 0x9C5E, 0x34B5, 0x9C5F, 0x173A, 0x9C60, 0x34B6, 0x9C62, 0x34B4,
+ 0x9C63, 0x34B1, 0x9C66, 0x34B3, 0x9C67, 0x34B2, 0x9C68, 0x34F4,
+ 0x9C6D, 0x34F6, 0x9C6E, 0x34F5, 0x9C71, 0x3514, 0x9C73, 0x3513,
+ 0x9C74, 0x3512, 0x9C75, 0x3515, 0x9C77, 0x1760, 0x9C78, 0x1761,
+ 0x9C79, 0x3541, 0x9C7A, 0x3545, 0x9CE5, 0x0BE2, 0x9CE6, 0x235F,
+ 0x9CE7, 0x2610, 0x9CE9, 0x0F79, 0x9CEA, 0x260E, 0x9CED, 0x260F,
+ 0x9CF1, 0x2879, 0x9CF2, 0x287A, 0x9CF3, 0x10FE, 0x9CF4, 0x10FC,
+ 0x9CF5, 0x287B, 0x9CF6, 0x10FD, 0x9CF7, 0x2AF4, 0x9CF9, 0x2AF7,
+ 0x9CFA, 0x2AF1, 0x9CFB, 0x2AF8, 0x9CFC, 0x2AF0, 0x9CFD, 0x2AF2,
+ 0x9CFF, 0x2AF3, 0x9D00, 0x2AF6, 0x9D03, 0x1284, 0x9D04, 0x2AFB,
+ 0x9D05, 0x2AFA, 0x9D06, 0x1282, 0x9D07, 0x2AF5, 0x9D08, 0x2AF9,
+ 0x9D09, 0x1283, 0x9D10, 0x2D2D, 0x9D12, 0x13AE, 0x9D14, 0x2D28,
+ 0x9D15, 0x13AA, 0x9D17, 0x2D25, 0x9D18, 0x2D2B, 0x9D19, 0x2D2E,
+ 0x9D1B, 0x13AF, 0x9D1D, 0x2D2A, 0x9D1E, 0x2D27, 0x9D1F, 0x2D2F,
+ 0x9D20, 0x2D26, 0x9D22, 0x2D2C, 0x9D23, 0x13AB, 0x9D25, 0x2D24,
+ 0x9D26, 0x13AC, 0x9D28, 0x13AD, 0x9D29, 0x2D29, 0x9D2D, 0x2F00,
+ 0x9D2E, 0x2EF3, 0x9D2F, 0x2EF4, 0x9D30, 0x2EF7, 0x9D31, 0x2EF5,
+ 0x9D33, 0x2EEF, 0x9D36, 0x2EF2, 0x9D37, 0x2EFC, 0x9D38, 0x2EF6,
+ 0x9D3B, 0x14BF, 0x9D3D, 0x2EFE, 0x9D3E, 0x2EFB, 0x9D3F, 0x14C0,
+ 0x9D40, 0x2EFD, 0x9D41, 0x2EF0, 0x9D42, 0x2EF9, 0x9D43, 0x2EFA,
+ 0x9D45, 0x2EF8, 0x9D4A, 0x3061, 0x9D4B, 0x3063, 0x9D4C, 0x3066,
+ 0x9D4F, 0x3060, 0x9D51, 0x156F, 0x9D52, 0x3068, 0x9D53, 0x305F,
+ 0x9D54, 0x3069, 0x9D56, 0x3065, 0x9D57, 0x3067, 0x9D58, 0x306B,
+ 0x9D59, 0x3064, 0x9D5A, 0x306C, 0x9D5B, 0x3062, 0x9D5C, 0x305E,
+ 0x9D5D, 0x1570, 0x9D5F, 0x306A, 0x9D60, 0x1571, 0x9D61, 0x1601,
+ 0x9D67, 0x2EF1, 0x9D68, 0x31BB, 0x9D69, 0x31B2, 0x9D6A, 0x1603,
+ 0x9D6B, 0x31AE, 0x9D6C, 0x1604, 0x9D6F, 0x31B7, 0x9D70, 0x31B1,
+ 0x9D71, 0x31A7, 0x9D72, 0x1602, 0x9D73, 0x31B4, 0x9D74, 0x31AF,
+ 0x9D75, 0x31B0, 0x9D77, 0x31A2, 0x9D78, 0x31A9, 0x9D79, 0x31B8,
+ 0x9D7B, 0x31B5, 0x9D7D, 0x31AD, 0x9D7F, 0x31B9, 0x9D80, 0x31A8,
+ 0x9D81, 0x31A3, 0x9D82, 0x31B6, 0x9D84, 0x31A5, 0x9D85, 0x31B3,
+ 0x9D86, 0x31AA, 0x9D87, 0x31BA, 0x9D88, 0x31A6, 0x9D89, 0x1600,
+ 0x9D8A, 0x31A4, 0x9D8B, 0x31AB, 0x9D8C, 0x31AC, 0x9D90, 0x32A4,
+ 0x9D92, 0x32A2, 0x9D94, 0x32A7, 0x9D96, 0x32B3, 0x9D97, 0x32AA,
+ 0x9D98, 0x32A3, 0x9D99, 0x329F, 0x9D9A, 0x32AC, 0x9D9B, 0x32A5,
+ 0x9D9C, 0x32A8, 0x9D9D, 0x32A1, 0x9D9E, 0x32AF, 0x9D9F, 0x329E,
+ 0x9DA0, 0x32A6, 0x9DA1, 0x32AB, 0x9DA2, 0x32AD, 0x9DA3, 0x32B0,
+ 0x9DA4, 0x32A0, 0x9DA6, 0x32B4, 0x9DA7, 0x32B5, 0x9DA8, 0x32AE,
+ 0x9DA9, 0x32B2, 0x9DAA, 0x32A9, 0x9DAC, 0x3362, 0x9DAD, 0x3365,
+ 0x9DAF, 0x16B1, 0x9DB1, 0x3364, 0x9DB2, 0x3369, 0x9DB3, 0x3367,
+ 0x9DB4, 0x16B2, 0x9DB5, 0x335E, 0x9DB6, 0x3354, 0x9DB7, 0x3353,
+ 0x9DB8, 0x16B4, 0x9DB9, 0x3360, 0x9DBA, 0x3361, 0x9DBB, 0x335D,
+ 0x9DBC, 0x3355, 0x9DBE, 0x335A, 0x9DBF, 0x32B1, 0x9DC1, 0x3356,
+ 0x9DC2, 0x16B3, 0x9DC3, 0x335C, 0x9DC5, 0x335B, 0x9DC7, 0x3357,
+ 0x9DC8, 0x3363, 0x9DCA, 0x3358, 0x9DCB, 0x33F9, 0x9DCC, 0x3366,
+ 0x9DCD, 0x3368, 0x9DCE, 0x335F, 0x9DCF, 0x3359, 0x9DD0, 0x33FA,
+ 0x9DD1, 0x33FC, 0x9DD2, 0x33F6, 0x9DD3, 0x16F0, 0x9DD5, 0x3403,
+ 0x9DD6, 0x3401, 0x9DD7, 0x16F1, 0x9DD8, 0x3400, 0x9DD9, 0x33FF,
+ 0x9DDA, 0x33F8, 0x9DDB, 0x33F5, 0x9DDC, 0x33FB, 0x9DDD, 0x3404,
+ 0x9DDE, 0x33F7, 0x9DDF, 0x33FD, 0x9DE1, 0x3466, 0x9DE2, 0x346B,
+ 0x9DE3, 0x3461, 0x9DE4, 0x3464, 0x9DE5, 0x171C, 0x9DE6, 0x3468,
+ 0x9DE8, 0x346F, 0x9DE9, 0x33FE, 0x9DEB, 0x3462, 0x9DEC, 0x346C,
+ 0x9DED, 0x3470, 0x9DEE, 0x3467, 0x9DEF, 0x3460, 0x9DF0, 0x346A,
+ 0x9DF2, 0x3469, 0x9DF3, 0x346E, 0x9DF4, 0x346D, 0x9DF5, 0x3402,
+ 0x9DF6, 0x3465, 0x9DF7, 0x345F, 0x9DF8, 0x3463, 0x9DF9, 0x173B,
+ 0x9DFA, 0x173C, 0x9DFB, 0x345E, 0x9DFD, 0x34C1, 0x9DFE, 0x34B8,
+ 0x9DFF, 0x34C0, 0x9E00, 0x34BD, 0x9E01, 0x34BE, 0x9E02, 0x34B7,
+ 0x9E03, 0x34BA, 0x9E04, 0x34C2, 0x9E05, 0x34BC, 0x9E06, 0x34BB,
+ 0x9E07, 0x34B9, 0x9E09, 0x34BF, 0x9E0B, 0x34F7, 0x9E0D, 0x34F8,
+ 0x9E0F, 0x34FA, 0x9E10, 0x34F9, 0x9E11, 0x34FC, 0x9E12, 0x34FB,
+ 0x9E13, 0x3517, 0x9E14, 0x3516, 0x9E15, 0x3530, 0x9E17, 0x3531,
+ 0x9E19, 0x353D, 0x9E1A, 0x1765, 0x9E1B, 0x1769, 0x9E1D, 0x3546,
+ 0x9E1E, 0x176A, 0x9E75, 0x0BE3, 0x9E79, 0x1661, 0x9E7A, 0x336A,
+ 0x9E7C, 0x173D, 0x9E7D, 0x173E, 0x9E7F, 0x0BE4, 0x9E80, 0x2611,
+ 0x9E82, 0x0F7A, 0x9E83, 0x2AFC, 0x9E86, 0x2D31, 0x9E87, 0x2D32,
+ 0x9E88, 0x2D30, 0x9E89, 0x2F02, 0x9E8A, 0x2F01, 0x9E8B, 0x14C1,
+ 0x9E8C, 0x306E, 0x9E8D, 0x2F03, 0x9E8E, 0x306D, 0x9E91, 0x31BD,
+ 0x9E92, 0x1605, 0x9E93, 0x1607, 0x9E94, 0x31BC, 0x9E97, 0x1606,
+ 0x9E99, 0x32B6, 0x9E9A, 0x32B8, 0x9E9B, 0x32B7, 0x9E9C, 0x336B,
+ 0x9E9D, 0x16B5, 0x9E9F, 0x171D, 0x9EA0, 0x34C3, 0x9EA1, 0x34FD,
+ 0x9EA4, 0x354A, 0x9EA5, 0x0BE5, 0x9EA7, 0x287C, 0x9EA9, 0x1285,
+ 0x9EAD, 0x2D34, 0x9EAE, 0x2D33, 0x9EB0, 0x2F04, 0x9EB4, 0x1608,
+ 0x9EB5, 0x1662, 0x9EB6, 0x3405, 0x9EB7, 0x3542, 0x9EBB, 0x0BE6,
+ 0x9EBC, 0x10FF, 0x9EBE, 0x1286, 0x9EC0, 0x31BE, 0x9EC2, 0x3471,
+ 0x9EC3, 0x0DBB, 0x9EC8, 0x2F05, 0x9ECC, 0x1751, 0x9ECD, 0x0DBC,
+ 0x9ECE, 0x1287, 0x9ECF, 0x14C2, 0x9ED0, 0x3472, 0x9ED1, 0x0DBD,
+ 0x9ED3, 0x2AFD, 0x9ED4, 0x13B1, 0x9ED5, 0x2D35, 0x9ED6, 0x2D36,
+ 0x9ED8, 0x13B0, 0x9EDA, 0x2F06, 0x9EDB, 0x14C6, 0x9EDC, 0x14C4,
+ 0x9EDD, 0x14C5, 0x9EDE, 0x14C3, 0x9EDF, 0x306F, 0x9EE0, 0x1572,
+ 0x9EE4, 0x32BA, 0x9EE5, 0x32B9, 0x9EE6, 0x32BC, 0x9EE7, 0x32BB,
+ 0x9EE8, 0x1663, 0x9EEB, 0x336C, 0x9EED, 0x336E, 0x9EEE, 0x336D,
+ 0x9EEF, 0x16B6, 0x9EF0, 0x3406, 0x9EF2, 0x3473, 0x9EF3, 0x3474,
+ 0x9EF4, 0x171E, 0x9EF5, 0x34FE, 0x9EF6, 0x3518, 0x9EF7, 0x1762,
+ 0x9EF9, 0x2360, 0x9EFA, 0x2D37, 0x9EFB, 0x2F07, 0x9EFC, 0x31BF,
+ 0x9EFD, 0x2612, 0x9EFF, 0x2F08, 0x9F00, 0x3071, 0x9F01, 0x3070,
+ 0x9F06, 0x3475, 0x9F07, 0x173F, 0x9F09, 0x34FF, 0x9F0A, 0x3519,
+ 0x9F0E, 0x0F7B, 0x9F0F, 0x2AFE, 0x9F10, 0x2AFF, 0x9F12, 0x2D38,
+ 0x9F13, 0x0F7C, 0x9F15, 0x1573, 0x9F16, 0x3072, 0x9F18, 0x3370,
+ 0x9F19, 0x16B7, 0x9F1A, 0x3371, 0x9F1B, 0x336F, 0x9F1C, 0x3476,
+ 0x9F1E, 0x34C4, 0x9F20, 0x0F7D, 0x9F22, 0x2F0B, 0x9F23, 0x2F0A,
+ 0x9F24, 0x2F09, 0x9F25, 0x3073, 0x9F28, 0x3077, 0x9F29, 0x3076,
+ 0x9F2A, 0x3075, 0x9F2B, 0x3074, 0x9F2C, 0x1574, 0x9F2D, 0x31C0,
+ 0x9F2E, 0x32BE, 0x9F2F, 0x1664, 0x9F30, 0x32BD, 0x9F31, 0x3372,
+ 0x9F32, 0x3409, 0x9F33, 0x3408, 0x9F34, 0x16F2, 0x9F35, 0x3407,
+ 0x9F36, 0x3479, 0x9F37, 0x3478, 0x9F38, 0x3477, 0x9F3B, 0x1100,
+ 0x9F3D, 0x2D39, 0x9F3E, 0x14C7, 0x9F40, 0x31C1, 0x9F41, 0x31C2,
+ 0x9F42, 0x340A, 0x9F43, 0x347A, 0x9F46, 0x34C5, 0x9F47, 0x3500,
+ 0x9F48, 0x3532, 0x9F49, 0x354C, 0x9F4A, 0x1101, 0x9F4B, 0x14C8,
+ 0x9F4C, 0x3078, 0x9F4D, 0x31C3, 0x9F4E, 0x3373, 0x9F4F, 0x347B,
+ 0x9F52, 0x1289, 0x9F54, 0x2F0C, 0x9F55, 0x3079, 0x9F56, 0x31C4,
+ 0x9F57, 0x31C5, 0x9F58, 0x31C6, 0x9F59, 0x32C3, 0x9F5B, 0x32BF,
+ 0x9F5C, 0x16B8, 0x9F5D, 0x32C2, 0x9F5E, 0x32C1, 0x9F5F, 0x1665,
+ 0x9F60, 0x32C0, 0x9F61, 0x1667, 0x9F63, 0x1666, 0x9F64, 0x3375,
+ 0x9F65, 0x3374, 0x9F66, 0x16B9, 0x9F67, 0x16BA, 0x9F6A, 0x16F4,
+ 0x9F6B, 0x340B, 0x9F6C, 0x16F3, 0x9F6E, 0x347E, 0x9F6F, 0x347F,
+ 0x9F70, 0x347D, 0x9F71, 0x347C, 0x9F72, 0x1741, 0x9F74, 0x34C6,
+ 0x9F75, 0x34C7, 0x9F76, 0x34C8, 0x9F77, 0x1740, 0x9F78, 0x3501,
+ 0x9F79, 0x3504, 0x9F7A, 0x3503, 0x9F7B, 0x3502, 0x9F7E, 0x354B,
+ 0x9F8D, 0x13B2, 0x9F90, 0x157C, 0x9F91, 0x32C4, 0x9F92, 0x3376,
+ 0x9F94, 0x16F5, 0x9F95, 0x340C, 0x9F98, 0x354D, 0x9F9C, 0x13B3,
+ 0x9FA0, 0x2F0D, 0x9FA2, 0x340D, 0x9FA4, 0x351A, 0xE01F, 0x083A,
+ 0xE026, 0x09FD, 0xE05B, 0x030D, 0xE063, 0x016B, 0xE073, 0x0860,
+ 0xE0F3, 0x0C23, 0xE12E, 0x17E4, 0xE149, 0x212F, 0xE191, 0x115F,
+ 0xE1BA, 0x0C79, 0xE1C9, 0x04C3, 0xE22C, 0x18BD, 0xE22D, 0x0CBD,
+ 0xE230, 0x0CA5, 0xE266, 0x0CCE, 0xE2A3, 0x0E84, 0xE2BC, 0x0120,
+ 0xE2EF, 0x1BA8, 0xE33A, 0x1055, 0xE340, 0x2DE8, 0xE34F, 0x0121,
+ 0xE35A, 0x106B, 0xE363, 0x1326, 0xE37C, 0x066B, 0xE37F, 0x132E,
+ 0xE3C5, 0x0D35, 0xE3D7, 0x27C2, 0xE3DC, 0x22AD, 0xE417, 0x134C,
+ 0xE44A, 0x09CE, 0xE478, 0x0BC7, 0xE485, 0x36E9, 0xE4C5, 0x1391,
+ 0xE4DA, 0x16A4, 0xE545, 0x3072, 0xE5D2, 0x0119, 0xE5D3, 0x011A,
+ 0xE5D4, 0x011C, 0xE5D5, 0x011B, 0xE5F4, 0x297C, 0xE6C6, 0x1D06,
+ 0xE727, 0x29A1, 0xE7D3, 0x181B, 0xE893, 0x2B24, 0xEB40, 0x2F50,
+ 0xEB42, 0x1725, 0xEB45, 0x32ED, 0xEB6E, 0x2AD9, 0xEB86, 0x1C14,
+ 0xEB9E, 0x12E9, 0xEBA9, 0x2CAE, 0xEBBA, 0x1A64, 0xEBC9, 0x1404,
+ 0xEBCF, 0x2324, 0xEBD2, 0x346A, 0xEBDE, 0x2291, 0xEC01, 0x1787,
+ 0xEC02, 0x095F, 0xEC15, 0x1E99, 0xEC5B, 0x25C1, 0xEC5E, 0x0D0C,
+ 0xECA6, 0x05E6, 0xED28, 0x0728, 0xED6E, 0x24B6, 0xED7C, 0x1806,
+ 0xED9E, 0x3511, 0xEDE7, 0x0F82, 0xEE52, 0x05F2, 0xEE98, 0x247D,
+ 0xF6B1, 0x01FA, 0xF6B2, 0x01FB, 0xF6B3, 0x01FC, 0xF6B4, 0x01FD,
+ 0xF6B5, 0x01FE, 0xF6B6, 0x01FF, 0xF6B7, 0x0200, 0xF6B8, 0x0201,
+ 0xF6B9, 0x0202, 0xF6BA, 0x0203, 0xF6BB, 0x0204, 0xF6BC, 0x0205,
+ 0xF6BD, 0x0206, 0xF6BE, 0x0207, 0xF6BF, 0x0208, 0xF6C0, 0x0209,
+ 0xF6C1, 0x020A, 0xF6C2, 0x020B, 0xF6C3, 0x020C, 0xF6C4, 0x020D,
+ 0xF6C5, 0x020E, 0xF6C6, 0x020F, 0xF6C7, 0x0210, 0xF6C8, 0x0211,
+ 0xF6C9, 0x0212, 0xF6CA, 0x0213, 0xF6CB, 0x0214, 0xF6CC, 0x0215,
+ 0xF6CD, 0x0216, 0xF6CE, 0x0217, 0xF6CF, 0x0219, 0xF6D0, 0x021A,
+ 0xF6D1, 0x021B, 0xF6D2, 0x021C, 0xF6D3, 0x021D, 0xF6D4, 0x021E,
+ 0xF6D5, 0x021F, 0xF6D6, 0x0220, 0xF6D7, 0x0221, 0xF6D8, 0x0222,
+ 0xF6D9, 0x0223, 0xF6DA, 0x0224, 0xF6DB, 0x0225, 0xF6DC, 0x0226,
+ 0xF6DD, 0x0227, 0xF6DE, 0x0228, 0xF6E0, 0x022A, 0xF6E1, 0x022B,
+ 0xF6E2, 0x022C, 0xF6E4, 0x022E, 0xF6E6, 0x0230, 0xF6E8, 0x35B3,
+ 0xF6E9, 0x35B4, 0xF6EA, 0x35B5, 0xF6EB, 0x35B6, 0xF6EC, 0x35B7,
+ 0xF6ED, 0x35B8, 0xF6F0, 0x35BA, 0xF6F1, 0x35BB, 0xF6F2, 0x35BC,
+ 0xF6F3, 0x35BD, 0xF6F4, 0x35BE, 0xF6F5, 0x35BF, 0xF6F6, 0x35C0,
+ 0xF6F7, 0x35C1, 0xF6F8, 0x35C2, 0xF6F9, 0x35C3, 0xF6FA, 0x35C4,
+ 0xF6FB, 0x35C5, 0xF6FC, 0x35C6, 0xF6FD, 0x35C7, 0xF6FE, 0x35C8,
+ 0xF6FF, 0x35C9, 0xF700, 0x35CA, 0xF701, 0x35CB, 0xF702, 0x35CC,
+ 0xF703, 0x35CD, 0xF704, 0x35CE, 0xF705, 0x35CF, 0xF706, 0x35D0,
+ 0xF707, 0x35D1, 0xF708, 0x35D2, 0xF709, 0x35D3, 0xF70A, 0x35D4,
+ 0xF70B, 0x35D5, 0xF70C, 0x35D6, 0xF70D, 0x35D7, 0xF70E, 0x35D8,
+ 0xF70F, 0x35D9, 0xF710, 0x35DA, 0xF711, 0x35DB, 0xF712, 0x35DC,
+ 0xF713, 0x35DD, 0xF714, 0x35DE, 0xF715, 0x35DF, 0xF716, 0x35E0,
+ 0xF717, 0x35E1, 0xF718, 0x35E2, 0xF719, 0x35E3, 0xF71A, 0x35E4,
+ 0xF71B, 0x35E5, 0xF71C, 0x35E6, 0xF71D, 0x35E7, 0xF71E, 0x35E8,
+ 0xF71F, 0x35E9, 0xF720, 0x35EA, 0xF721, 0x35EB, 0xF722, 0x35EC,
+ 0xF723, 0x35ED, 0xF724, 0x35EE, 0xF725, 0x35EF, 0xF726, 0x35F0,
+ 0xF727, 0x35F1, 0xF728, 0x35F2, 0xF729, 0x35F3, 0xF72A, 0x35F4,
+ 0xF72B, 0x35F5, 0xF72C, 0x35F6, 0xF72D, 0x35F7, 0xF72E, 0x35F8,
+ 0xF72F, 0x35F9, 0xF730, 0x35FA, 0xF731, 0x35FB, 0xF732, 0x35FC,
+ 0xF733, 0x35FD, 0xF734, 0x35FE, 0xF735, 0x35FF, 0xF736, 0x3600,
+ 0xF737, 0x3601, 0xF738, 0x3602, 0xF739, 0x3603, 0xF73A, 0x3604,
+ 0xF73B, 0x3605, 0xF73C, 0x3606, 0xF73D, 0x3607, 0xF73E, 0x3608,
+ 0xF73F, 0x3609, 0xF740, 0x360A, 0xF741, 0x360B, 0xF742, 0x360C,
+ 0xF743, 0x360D, 0xF744, 0x360E, 0xF745, 0x360F, 0xF746, 0x3610,
+ 0xF747, 0x3611, 0xF748, 0x3612, 0xF749, 0x3613, 0xF74A, 0x3614,
+ 0xF74B, 0x3615, 0xF74C, 0x3616, 0xF74D, 0x3617, 0xF74E, 0x3618,
+ 0xF74F, 0x3619, 0xF750, 0x361A, 0xF751, 0x361B, 0xF752, 0x361C,
+ 0xF753, 0x361D, 0xF754, 0x361E, 0xF755, 0x361F, 0xF756, 0x3620,
+ 0xF757, 0x3621, 0xF758, 0x3622, 0xF759, 0x3623, 0xF75A, 0x3624,
+ 0xF75B, 0x3625, 0xF75C, 0x3626, 0xF75D, 0x3627, 0xF75E, 0x3628,
+ 0xF75F, 0x3629, 0xF760, 0x362A, 0xF761, 0x362B, 0xF762, 0x362C,
+ 0xF763, 0x362D, 0xF764, 0x362E, 0xF765, 0x362F, 0xF766, 0x3630,
+ 0xF767, 0x3631, 0xF768, 0x3632, 0xF769, 0x3633, 0xF76A, 0x3634,
+ 0xF76B, 0x3635, 0xF76C, 0x3636, 0xF76D, 0x3637, 0xF76E, 0x3638,
+ 0xF76F, 0x3639, 0xF770, 0x363A, 0xF771, 0x363B, 0xF772, 0x363C,
+ 0xF773, 0x363D, 0xF774, 0x363E, 0xF775, 0x363F, 0xF776, 0x3640,
+ 0xF777, 0x3641, 0xF778, 0x3642, 0xF779, 0x3643, 0xF77A, 0x3644,
+ 0xF77B, 0x3645, 0xF77C, 0x3646, 0xF77D, 0x3647, 0xF77E, 0x3648,
+ 0xF77F, 0x3649, 0xF780, 0x364A, 0xF781, 0x364B, 0xF782, 0x364C,
+ 0xF783, 0x364D, 0xF784, 0x364E, 0xF785, 0x364F, 0xF786, 0x3650,
+ 0xF787, 0x3651, 0xF788, 0x3652, 0xF789, 0x3653, 0xF78A, 0x3654,
+ 0xF78B, 0x3655, 0xF78C, 0x3656, 0xF78D, 0x3657, 0xF78E, 0x3658,
+ 0xF78F, 0x3659, 0xF790, 0x365A, 0xF791, 0x365B, 0xF792, 0x365C,
+ 0xF793, 0x365D, 0xF794, 0x365E, 0xF795, 0x365F, 0xF796, 0x3660,
+ 0xF797, 0x3661, 0xF798, 0x3662, 0xF799, 0x3663, 0xF79A, 0x3664,
+ 0xF79B, 0x3665, 0xF79C, 0x3666, 0xF79D, 0x3667, 0xF79E, 0x3668,
+ 0xF79F, 0x3669, 0xF7A0, 0x366A, 0xF7A1, 0x366B, 0xF7A2, 0x366C,
+ 0xF7A3, 0x366D, 0xF7A4, 0x366E, 0xF7A5, 0x366F, 0xF7A6, 0x3670,
+ 0xF7A7, 0x3671, 0xF7A8, 0x3672, 0xF7A9, 0x3673, 0xF7AA, 0x3674,
+ 0xF7AB, 0x3675, 0xF7AC, 0x3676, 0xF7AD, 0x3677, 0xF7AE, 0x3678,
+ 0xF7AF, 0x3679, 0xF7B0, 0x367A, 0xF7B1, 0x367B, 0xF7B2, 0x367C,
+ 0xF7B3, 0x367D, 0xF7B4, 0x367E, 0xF7B5, 0x367F, 0xF7B6, 0x3680,
+ 0xF7B7, 0x3681, 0xF7B8, 0x3682, 0xF7B9, 0x3683, 0xF7BA, 0x3684,
+ 0xF7BB, 0x3685, 0xF7BC, 0x3686, 0xF7BD, 0x3687, 0xF7BE, 0x3688,
+ 0xF7BF, 0x3689, 0xF7C0, 0x368A, 0xF7C1, 0x368B, 0xF7C2, 0x368C,
+ 0xF7C3, 0x368D, 0xF7C4, 0x368E, 0xF7C5, 0x368F, 0xF7C6, 0x3690,
+ 0xF7C7, 0x3691, 0xF7C8, 0x3692, 0xF7C9, 0x3693, 0xF7CA, 0x3694,
+ 0xF7CB, 0x3695, 0xF7CC, 0x3696, 0xF7CD, 0x3697, 0xF7CE, 0x3698,
+ 0xF7CF, 0x3699, 0xF7D0, 0x369A, 0xF7D1, 0x369B, 0xF7D2, 0x369C,
+ 0xF7D3, 0x369D, 0xF7D4, 0x369E, 0xF7D5, 0x369F, 0xF7D6, 0x36A0,
+ 0xF7D7, 0x36A1, 0xF7D8, 0x36A2, 0xF7D9, 0x36A3, 0xF7DA, 0x36A4,
+ 0xF7DB, 0x36A5, 0xF7DC, 0x36A6, 0xF7DD, 0x36A7, 0xF7DE, 0x36A8,
+ 0xF7DF, 0x36A9, 0xF7E0, 0x36AA, 0xF7E1, 0x36AB, 0xF7E2, 0x36AC,
+ 0xF7E3, 0x36AD, 0xF7E4, 0x36AE, 0xF7E5, 0x36AF, 0xF7E6, 0x36B0,
+ 0xF7E7, 0x36B1, 0xF7E8, 0x36B2, 0xF7E9, 0x36B3, 0xF7EA, 0x36B4,
+ 0xF7EB, 0x36B5, 0xF7EC, 0x36B6, 0xF7ED, 0x36B7, 0xF7EE, 0x36B8,
+ 0xF817, 0x36E1, 0xF818, 0x36E2, 0xF819, 0x36E3, 0xF81A, 0x36E4,
+ 0xF81B, 0x36E5, 0xF81C, 0x36E6, 0xF81D, 0x36E7, 0xFA0C, 0x0274,
+ 0xFA0D, 0x2381, 0xFE30, 0x006D, 0xFE31, 0x007A, 0xFE33, 0x35AF,
+ 0xFE34, 0x35B1, 0xFE35, 0x0082, 0xFE36, 0x0083, 0xFE37, 0x0086,
+ 0xFE38, 0x0087, 0xFE39, 0x008A, 0xFE3A, 0x008B, 0xFE3B, 0x008E,
+ 0xFE3C, 0x008F, 0xFE3D, 0x0092, 0xFE3E, 0x0093, 0xFE3F, 0x0096,
+ 0xFE40, 0x0097, 0xFE41, 0x009A, 0xFE42, 0x009B, 0xFE43, 0x009E,
+ 0xFE44, 0x009F, 0xFE49, 0x00C7, 0xFE4A, 0x00C8, 0xFE4B, 0x00CB,
+ 0xFE4C, 0x00CC, 0xFE4D, 0x00C9, 0xFE4E, 0x00CA, 0xFE4F, 0x35B2,
+ 0xFE50, 0x0070, 0xFE51, 0x0071, 0xFE52, 0x0072, 0xFE54, 0x0074,
+ 0xFE55, 0x0075, 0xFE56, 0x0076, 0xFE57, 0x0077, 0xFE59, 0x00A0,
+ 0xFE5A, 0x00A1, 0xFE5B, 0x00A2, 0xFE5C, 0x00A3, 0xFE5D, 0x00A4,
+ 0xFE5E, 0x00A5, 0xFE5F, 0x00CD, 0xFE60, 0x00CE, 0xFE61, 0x00CF,
+ 0xFE62, 0x00DF, 0xFE63, 0x00E0, 0xFE64, 0x00E1, 0xFE65, 0x00E2,
+ 0xFE66, 0x00E3, 0xFE68, 0x0102, 0xFE69, 0x010C, 0xFE6A, 0x010D,
+ 0xFE6B, 0x010E, 0xFF01, 0x006C, 0xFF02, 0x36E4, 0xFF03, 0x00AE,
+ 0xFF04, 0x0103, 0xFF05, 0x0108, 0xFF06, 0x00AF, 0xFF07, 0x36E3,
+ 0xFF08, 0x0080, 0xFF09, 0x0081, 0xFF0A, 0x00B0, 0xFF0B, 0x00D0,
+ 0xFF0C, 0x0064, 0xFF0D, 0x00D1, 0xFF0E, 0x0067, 0xFF0F, 0x0101,
+ 0xFF10, 0x014D, 0xFF11, 0x014E, 0xFF12, 0x014F, 0xFF13, 0x0150,
+ 0xFF14, 0x0151, 0xFF15, 0x0152, 0xFF16, 0x0153, 0xFF17, 0x0154,
+ 0xFF18, 0x0155, 0xFF19, 0x0156, 0xFF1A, 0x006A, 0xFF1B, 0x0069,
+ 0xFF1C, 0x00D6, 0xFF1D, 0x00D8, 0xFF1E, 0x00D7, 0xFF1F, 0x006B,
+ 0xFF20, 0x0109, 0xFF21, 0x016D, 0xFF22, 0x016E, 0xFF23, 0x016F,
+ 0xFF24, 0x0170, 0xFF25, 0x0171, 0xFF26, 0x0172, 0xFF27, 0x0173,
+ 0xFF28, 0x0174, 0xFF29, 0x0175, 0xFF2A, 0x0176, 0xFF2B, 0x0177,
+ 0xFF2C, 0x0178, 0xFF2D, 0x0179, 0xFF2E, 0x017A, 0xFF2F, 0x017B,
+ 0xFF30, 0x017C, 0xFF31, 0x017D, 0xFF32, 0x017E, 0xFF33, 0x017F,
+ 0xFF34, 0x0180, 0xFF35, 0x0181, 0xFF36, 0x0182, 0xFF37, 0x0183,
+ 0xFF38, 0x0184, 0xFF39, 0x0185, 0xFF3A, 0x0186, 0xFF3B, 0x35BE,
+ 0xFF3C, 0x0102, 0xFF3D, 0x35BF, 0xFF3E, 0x35B4, 0xFF3F, 0x00C5,
+ 0xFF41, 0x0187, 0xFF42, 0x0188, 0xFF43, 0x0189, 0xFF44, 0x018A,
+ 0xFF45, 0x018B, 0xFF46, 0x018C, 0xFF47, 0x018D, 0xFF48, 0x018E,
+ 0xFF49, 0x018F, 0xFF4A, 0x0190, 0xFF4B, 0x0191, 0xFF4C, 0x0192,
+ 0xFF4D, 0x0193, 0xFF4E, 0x0194, 0xFF4F, 0x0195, 0xFF50, 0x0196,
+ 0xFF51, 0x0197, 0xFF52, 0x0198, 0xFF53, 0x0199, 0xFF54, 0x019A,
+ 0xFF55, 0x019B, 0xFF56, 0x019C, 0xFF57, 0x019D, 0xFF58, 0x019E,
+ 0xFF59, 0x019F, 0xFF5A, 0x01A0, 0xFF5B, 0x0084, 0xFF5C, 0x0078,
+ 0xFF5D, 0x0085, 0xFF5E, 0x00E4, 0xFF64, 0x0071, 0xFFE0, 0x0106,
+ 0xFFE1, 0x0107, 0xFFE2, 0x36E1, 0xFFE3, 0x00C4, 0xFFE4, 0x36E2,
+ 0xFFE5, 0x0104,
+};
+extern const unsigned short g_FXCMAP_UniCNS_UTF16_H_0_DWord[3 * 3] = {
+ 0xD840, 0xDC8A, 0x36B2, 0xD840, 0xDCCC, 0x36B0, 0xD85D, 0xDE07, 0x36B8,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/GB1/GB-EUC-H_0.cpp b/core/src/fpdfapi/fpdf_cmaps/GB1/GB-EUC-H_0.cpp
index f216f8a769..d5472f8693 100644
--- a/core/src/fpdfapi/fpdf_cmaps/GB1/GB-EUC-H_0.cpp
+++ b/core/src/fpdfapi/fpdf_cmaps/GB1/GB-EUC-H_0.cpp
@@ -1,38 +1,38 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-extern const unsigned short g_FXCMAP_GB_EUC_H_0[90 * 3] = {
- 0x0020, 0x0020, 0x1E24, 0x0021, 0x007E, 0x032E, 0xA1A1, 0xA1FE, 0x0060,
- 0xA2B1, 0xA2E2, 0x00BE, 0xA2E5, 0xA2EE, 0x00F0, 0xA2F1, 0xA2FC, 0x00FA,
- 0xA3A1, 0xA3FE, 0x0106, 0xA4A1, 0xA4F3, 0x0164, 0xA5A1, 0xA5F6, 0x01B7,
- 0xA6A1, 0xA6B8, 0x020D, 0xA6C1, 0xA6F5, 0x0225, 0xA7A1, 0xA7C1, 0x025A,
- 0xA7D1, 0xA7F1, 0x027B, 0xA8A1, 0xA8C0, 0x029C, 0xA8C5, 0xA8EA, 0x02BC,
- 0xA9A4, 0xA9EF, 0x02E2, 0xAAA1, 0xAAFE, 0x032E, 0xABA1, 0xABC0, 0x038C,
- 0xB0A1, 0xB0FE, 0x03AC, 0xB1A1, 0xB1FE, 0x040A, 0xB2A1, 0xB2FE, 0x0468,
- 0xB3A1, 0xB3FE, 0x04C6, 0xB4A1, 0xB4FE, 0x0524, 0xB5A1, 0xB5FE, 0x0582,
- 0xB6A1, 0xB6FE, 0x05E0, 0xB7A1, 0xB7FE, 0x063E, 0xB8A1, 0xB8FE, 0x069C,
- 0xB9A1, 0xB9FE, 0x06FA, 0xBAA1, 0xBAFE, 0x0758, 0xBBA1, 0xBBFE, 0x07B6,
- 0xBCA1, 0xBCFE, 0x0814, 0xBDA1, 0xBDFE, 0x0872, 0xBEA1, 0xBEFE, 0x08D0,
- 0xBFA1, 0xBFFE, 0x092E, 0xC0A1, 0xC0FE, 0x098C, 0xC1A1, 0xC1FE, 0x09EA,
- 0xC2A1, 0xC2FE, 0x0A48, 0xC3A1, 0xC3FE, 0x0AA6, 0xC4A1, 0xC4FE, 0x0B04,
- 0xC5A1, 0xC5FE, 0x0B62, 0xC6A1, 0xC6FE, 0x0BC0, 0xC7A1, 0xC7FE, 0x0C1E,
- 0xC8A1, 0xC8FE, 0x0C7C, 0xC9A1, 0xC9FE, 0x0CDA, 0xCAA1, 0xCAFE, 0x0D38,
- 0xCBA1, 0xCBFE, 0x0D96, 0xCCA1, 0xCCFE, 0x0DF4, 0xCDA1, 0xCDFE, 0x0E52,
- 0xCEA1, 0xCEFE, 0x0EB0, 0xCFA1, 0xCFFE, 0x0F0E, 0xD0A1, 0xD0FE, 0x0F6C,
- 0xD1A1, 0xD1FE, 0x0FCA, 0xD2A1, 0xD2FE, 0x1028, 0xD3A1, 0xD3FE, 0x1086,
- 0xD4A1, 0xD4FE, 0x10E4, 0xD5A1, 0xD5FE, 0x1142, 0xD6A1, 0xD6FE, 0x11A0,
- 0xD7A1, 0xD7F9, 0x11FE, 0xD8A1, 0xD8FE, 0x1257, 0xD9A1, 0xD9FE, 0x12B5,
- 0xDAA1, 0xDAFE, 0x1313, 0xDBA1, 0xDBFE, 0x1371, 0xDCA1, 0xDCFE, 0x13CF,
- 0xDDA1, 0xDDFE, 0x142D, 0xDEA1, 0xDEFE, 0x148B, 0xDFA1, 0xDFFE, 0x14E9,
- 0xE0A1, 0xE0FE, 0x1547, 0xE1A1, 0xE1FE, 0x15A5, 0xE2A1, 0xE2FE, 0x1603,
- 0xE3A1, 0xE3FE, 0x1661, 0xE4A1, 0xE4FE, 0x16BF, 0xE5A1, 0xE5FE, 0x171D,
- 0xE6A1, 0xE6FE, 0x177B, 0xE7A1, 0xE7FE, 0x17D9, 0xE8A1, 0xE8FE, 0x1837,
- 0xE9A1, 0xE9FE, 0x1895, 0xEAA1, 0xEAFE, 0x18F3, 0xEBA1, 0xEBFE, 0x1951,
- 0xECA1, 0xECFE, 0x19AF, 0xEDA1, 0xEDFE, 0x1A0D, 0xEEA1, 0xEEFE, 0x1A6B,
- 0xEFA1, 0xEFFE, 0x1AC9, 0xF0A1, 0xF0FE, 0x1B27, 0xF1A1, 0xF1FE, 0x1B85,
- 0xF2A1, 0xF2FE, 0x1BE3, 0xF3A1, 0xF3FE, 0x1C41, 0xF4A1, 0xF4FE, 0x1C9F,
- 0xF5A1, 0xF5FE, 0x1CFD, 0xF6A1, 0xF6FE, 0x1D5B, 0xF7A1, 0xF7FE, 0x1DB9,
-};
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_GB_EUC_H_0[90 * 3] = {
+ 0x0020, 0x0020, 0x1E24, 0x0021, 0x007E, 0x032E, 0xA1A1, 0xA1FE, 0x0060,
+ 0xA2B1, 0xA2E2, 0x00BE, 0xA2E5, 0xA2EE, 0x00F0, 0xA2F1, 0xA2FC, 0x00FA,
+ 0xA3A1, 0xA3FE, 0x0106, 0xA4A1, 0xA4F3, 0x0164, 0xA5A1, 0xA5F6, 0x01B7,
+ 0xA6A1, 0xA6B8, 0x020D, 0xA6C1, 0xA6F5, 0x0225, 0xA7A1, 0xA7C1, 0x025A,
+ 0xA7D1, 0xA7F1, 0x027B, 0xA8A1, 0xA8C0, 0x029C, 0xA8C5, 0xA8EA, 0x02BC,
+ 0xA9A4, 0xA9EF, 0x02E2, 0xAAA1, 0xAAFE, 0x032E, 0xABA1, 0xABC0, 0x038C,
+ 0xB0A1, 0xB0FE, 0x03AC, 0xB1A1, 0xB1FE, 0x040A, 0xB2A1, 0xB2FE, 0x0468,
+ 0xB3A1, 0xB3FE, 0x04C6, 0xB4A1, 0xB4FE, 0x0524, 0xB5A1, 0xB5FE, 0x0582,
+ 0xB6A1, 0xB6FE, 0x05E0, 0xB7A1, 0xB7FE, 0x063E, 0xB8A1, 0xB8FE, 0x069C,
+ 0xB9A1, 0xB9FE, 0x06FA, 0xBAA1, 0xBAFE, 0x0758, 0xBBA1, 0xBBFE, 0x07B6,
+ 0xBCA1, 0xBCFE, 0x0814, 0xBDA1, 0xBDFE, 0x0872, 0xBEA1, 0xBEFE, 0x08D0,
+ 0xBFA1, 0xBFFE, 0x092E, 0xC0A1, 0xC0FE, 0x098C, 0xC1A1, 0xC1FE, 0x09EA,
+ 0xC2A1, 0xC2FE, 0x0A48, 0xC3A1, 0xC3FE, 0x0AA6, 0xC4A1, 0xC4FE, 0x0B04,
+ 0xC5A1, 0xC5FE, 0x0B62, 0xC6A1, 0xC6FE, 0x0BC0, 0xC7A1, 0xC7FE, 0x0C1E,
+ 0xC8A1, 0xC8FE, 0x0C7C, 0xC9A1, 0xC9FE, 0x0CDA, 0xCAA1, 0xCAFE, 0x0D38,
+ 0xCBA1, 0xCBFE, 0x0D96, 0xCCA1, 0xCCFE, 0x0DF4, 0xCDA1, 0xCDFE, 0x0E52,
+ 0xCEA1, 0xCEFE, 0x0EB0, 0xCFA1, 0xCFFE, 0x0F0E, 0xD0A1, 0xD0FE, 0x0F6C,
+ 0xD1A1, 0xD1FE, 0x0FCA, 0xD2A1, 0xD2FE, 0x1028, 0xD3A1, 0xD3FE, 0x1086,
+ 0xD4A1, 0xD4FE, 0x10E4, 0xD5A1, 0xD5FE, 0x1142, 0xD6A1, 0xD6FE, 0x11A0,
+ 0xD7A1, 0xD7F9, 0x11FE, 0xD8A1, 0xD8FE, 0x1257, 0xD9A1, 0xD9FE, 0x12B5,
+ 0xDAA1, 0xDAFE, 0x1313, 0xDBA1, 0xDBFE, 0x1371, 0xDCA1, 0xDCFE, 0x13CF,
+ 0xDDA1, 0xDDFE, 0x142D, 0xDEA1, 0xDEFE, 0x148B, 0xDFA1, 0xDFFE, 0x14E9,
+ 0xE0A1, 0xE0FE, 0x1547, 0xE1A1, 0xE1FE, 0x15A5, 0xE2A1, 0xE2FE, 0x1603,
+ 0xE3A1, 0xE3FE, 0x1661, 0xE4A1, 0xE4FE, 0x16BF, 0xE5A1, 0xE5FE, 0x171D,
+ 0xE6A1, 0xE6FE, 0x177B, 0xE7A1, 0xE7FE, 0x17D9, 0xE8A1, 0xE8FE, 0x1837,
+ 0xE9A1, 0xE9FE, 0x1895, 0xEAA1, 0xEAFE, 0x18F3, 0xEBA1, 0xEBFE, 0x1951,
+ 0xECA1, 0xECFE, 0x19AF, 0xEDA1, 0xEDFE, 0x1A0D, 0xEEA1, 0xEEFE, 0x1A6B,
+ 0xEFA1, 0xEFFE, 0x1AC9, 0xF0A1, 0xF0FE, 0x1B27, 0xF1A1, 0xF1FE, 0x1B85,
+ 0xF2A1, 0xF2FE, 0x1BE3, 0xF3A1, 0xF3FE, 0x1C41, 0xF4A1, 0xF4FE, 0x1C9F,
+ 0xF5A1, 0xF5FE, 0x1CFD, 0xF6A1, 0xF6FE, 0x1D5B, 0xF7A1, 0xF7FE, 0x1DB9,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/GB1/GB-EUC-V_0.cpp b/core/src/fpdfapi/fpdf_cmaps/GB1/GB-EUC-V_0.cpp
index d71cd351fb..bf2bd459ec 100644
--- a/core/src/fpdfapi/fpdf_cmaps/GB1/GB-EUC-V_0.cpp
+++ b/core/src/fpdfapi/fpdf_cmaps/GB1/GB-EUC-V_0.cpp
@@ -1,15 +1,15 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-extern const unsigned short g_FXCMAP_GB_EUC_V_0[20 * 3] = {
- 0xA1A2, 0xA1A2, 0x023F, 0xA1A3, 0xA1A3, 0x023E, 0xA1AA, 0xA1AA, 0x0256,
- 0xA1AB, 0xA1AC, 0x1E18, 0xA1AD, 0xA1AD, 0x0257, 0xA1B2, 0xA1BF, 0x0246,
- 0xA1FE, 0xA1FE, 0x1E1A, 0xA3A1, 0xA3A1, 0x0242, 0xA3A8, 0xA3A9, 0x0244,
- 0xA3AC, 0xA3AC, 0x023D, 0xA3AE, 0xA3AE, 0x1E1B, 0xA3BA, 0xA3BB, 0x0240,
- 0xA3BD, 0xA3BD, 0x1E1C, 0xA3BF, 0xA3BF, 0x0243, 0xA3DB, 0xA3DB, 0x1E1D,
- 0xA3DD, 0xA3DD, 0x1E1E, 0xA3DF, 0xA3DF, 0x0258, 0xA3FB, 0xA3FB, 0x0254,
- 0xA3FD, 0xA3FD, 0x0255, 0xA3FE, 0xA3FE, 0x1E1F,
-};
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_GB_EUC_V_0[20 * 3] = {
+ 0xA1A2, 0xA1A2, 0x023F, 0xA1A3, 0xA1A3, 0x023E, 0xA1AA, 0xA1AA, 0x0256,
+ 0xA1AB, 0xA1AC, 0x1E18, 0xA1AD, 0xA1AD, 0x0257, 0xA1B2, 0xA1BF, 0x0246,
+ 0xA1FE, 0xA1FE, 0x1E1A, 0xA3A1, 0xA3A1, 0x0242, 0xA3A8, 0xA3A9, 0x0244,
+ 0xA3AC, 0xA3AC, 0x023D, 0xA3AE, 0xA3AE, 0x1E1B, 0xA3BA, 0xA3BB, 0x0240,
+ 0xA3BD, 0xA3BD, 0x1E1C, 0xA3BF, 0xA3BF, 0x0243, 0xA3DB, 0xA3DB, 0x1E1D,
+ 0xA3DD, 0xA3DD, 0x1E1E, 0xA3DF, 0xA3DF, 0x0258, 0xA3FB, 0xA3FB, 0x0254,
+ 0xA3FD, 0xA3FD, 0x0255, 0xA3FE, 0xA3FE, 0x1E1F,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/GB1/GBK-EUC-H_2.cpp b/core/src/fpdfapi/fpdf_cmaps/GB1/GBK-EUC-H_2.cpp
index c7c486b9a4..3f3874f3a3 100644
--- a/core/src/fpdfapi/fpdf_cmaps/GB1/GBK-EUC-H_2.cpp
+++ b/core/src/fpdfapi/fpdf_cmaps/GB1/GBK-EUC-H_2.cpp
@@ -1,1365 +1,1365 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-extern const unsigned short g_FXCMAP_GBK_EUC_H_2[4071 * 3] = {
- 0x0020, 0x0020, 0x1E24, 0x0021, 0x007E, 0x032E, 0x8140, 0x8178, 0x2758,
- 0x8179, 0x8179, 0x2059, 0x817A, 0x817E, 0x2791, 0x8180, 0x8185, 0x2796,
- 0x8186, 0x8186, 0x21F1, 0x8187, 0x81EC, 0x279C, 0x81ED, 0x81ED, 0x1FF2,
- 0x81EE, 0x81F5, 0x2802, 0x81F6, 0x81F6, 0x205D, 0x81F7, 0x81FE, 0x280A,
- 0x8240, 0x8252, 0x2812, 0x8253, 0x8253, 0x269C, 0x8254, 0x8261, 0x2825,
- 0x8262, 0x8262, 0x21B5, 0x8263, 0x8273, 0x2833, 0x8274, 0x8274, 0x22CC,
- 0x8275, 0x8279, 0x2844, 0x827A, 0x827A, 0x2016, 0x827B, 0x827C, 0x2849,
- 0x827D, 0x827D, 0x1E62, 0x827E, 0x827E, 0x284B, 0x8280, 0x8280, 0x1F20,
- 0x8281, 0x8282, 0x284C, 0x8283, 0x8283, 0x207F, 0x8284, 0x828F, 0x284E,
- 0x8290, 0x8290, 0x205C, 0x8291, 0x82A4, 0x285A, 0x82A5, 0x82A5, 0x2194,
- 0x82A6, 0x82C7, 0x286E, 0x82C8, 0x82C8, 0x1E65, 0x82C9, 0x82C9, 0x2281,
- 0x82CA, 0x82E0, 0x2890, 0x82E1, 0x82E1, 0x22CD, 0x82E2, 0x82E2, 0x28A7,
- 0x82E3, 0x82E3, 0x210A, 0x82E4, 0x82E4, 0x1E3E, 0x82E5, 0x82EC, 0x28A8,
- 0x82ED, 0x82ED, 0x267F, 0x82EE, 0x82F1, 0x28B0, 0x82F2, 0x82F2, 0x222E,
- 0x82F3, 0x82F6, 0x28B4, 0x82F7, 0x82F7, 0x1E96, 0x82F8, 0x82F8, 0x22CB,
- 0x82F9, 0x82F9, 0x226C, 0x82FA, 0x82FA, 0x28B8, 0x82FB, 0x82FB, 0x2117,
- 0x82FC, 0x82FE, 0x28B9, 0x8340, 0x8340, 0x28BC, 0x8341, 0x8341, 0x20E8,
- 0x8342, 0x8344, 0x28BD, 0x8345, 0x8345, 0x22D4, 0x8346, 0x8347, 0x28C0,
- 0x8348, 0x8348, 0x1FB9, 0x8349, 0x834B, 0x28C2, 0x834C, 0x834C, 0x22D8,
- 0x834D, 0x8352, 0x28C5, 0x8353, 0x8353, 0x20DF, 0x8354, 0x8356, 0x28CB,
- 0x8357, 0x8357, 0x20C2, 0x8358, 0x835D, 0x28CE, 0x835E, 0x835E, 0x2195,
- 0x835F, 0x8364, 0x28D4, 0x8365, 0x8365, 0x1FAC, 0x8366, 0x8366, 0x22D3,
- 0x8367, 0x8371, 0x28DA, 0x8372, 0x8372, 0x1F81, 0x8373, 0x8377, 0x28E5,
- 0x8378, 0x8378, 0x2210, 0x8379, 0x8379, 0x28EA, 0x837A, 0x837A, 0x22CF,
- 0x837B, 0x837B, 0x28EB, 0x837C, 0x837C, 0x2213, 0x837D, 0x837D, 0x28EC,
- 0x837E, 0x837E, 0x1FE4, 0x8380, 0x8380, 0x1F90, 0x8381, 0x8385, 0x28ED,
- 0x8386, 0x8386, 0x22D6, 0x8387, 0x8388, 0x28F2, 0x8389, 0x8389, 0x22D0,
- 0x838A, 0x838A, 0x22CE, 0x838B, 0x838C, 0x28F4, 0x838D, 0x838D, 0x2681,
- 0x838E, 0x8393, 0x28F6, 0x8394, 0x8394, 0x1E76, 0x8395, 0x839D, 0x28FC,
- 0x839E, 0x839E, 0x2231, 0x839F, 0x83A5, 0x2905, 0x83A6, 0x83A6, 0x1E93,
- 0x83A7, 0x83AA, 0x290C, 0x83AB, 0x83AB, 0x22D2, 0x83AC, 0x83AD, 0x2910,
- 0x83AE, 0x83AE, 0x22D7, 0x83AF, 0x83AF, 0x22D5, 0x83B0, 0x83B0, 0x22D1,
- 0x83B1, 0x83B9, 0x2912, 0x83BA, 0x83BA, 0x1EE5, 0x83BB, 0x83C8, 0x291B,
- 0x83C9, 0x83C9, 0x2025, 0x83CA, 0x83F5, 0x2929, 0x83F6, 0x83F6, 0x1ECF,
- 0x83F7, 0x83FE, 0x2955, 0x8440, 0x844F, 0x295D, 0x8450, 0x8450, 0x1FD9,
- 0x8451, 0x8470, 0x296D, 0x8471, 0x8471, 0x22C8, 0x8472, 0x8473, 0x298D,
- 0x8474, 0x8474, 0x2263, 0x8475, 0x8476, 0x298F, 0x8477, 0x8477, 0x2683,
- 0x8478, 0x847E, 0x2991, 0x8480, 0x8481, 0x2998, 0x8482, 0x8482, 0x1F17,
- 0x8483, 0x848D, 0x299A, 0x848E, 0x848E, 0x1F2B, 0x848F, 0x8491, 0x29A5,
- 0x8492, 0x8492, 0x22CA, 0x8493, 0x8493, 0x1E99, 0x8494, 0x849C, 0x29A8,
- 0x849D, 0x849D, 0x1F4F, 0x849E, 0x84A0, 0x29B1, 0x84A1, 0x84A1, 0x1FCF,
- 0x84A2, 0x84A2, 0x2036, 0x84A3, 0x84A3, 0x1F3A, 0x84A4, 0x84A4, 0x29B4,
- 0x84A5, 0x84A5, 0x22C9, 0x84A6, 0x84A6, 0x1F99, 0x84A7, 0x84A8, 0x29B5,
- 0x84A9, 0x84A9, 0x1F75, 0x84AA, 0x84C4, 0x29B7, 0x84C5, 0x84C5, 0x1FBE,
- 0x84C6, 0x84D2, 0x29D2, 0x84D3, 0x84D3, 0x1ECD, 0x84D4, 0x84D4, 0x29DF,
- 0x84D5, 0x84D5, 0x21A9, 0x84D6, 0x84D6, 0x29E0, 0x84D7, 0x84D7, 0x21E6,
- 0x84D8, 0x84D8, 0x29E1, 0x84D9, 0x84D9, 0x2127, 0x84DA, 0x84DA, 0x2003,
- 0x84DB, 0x84DC, 0x29E2, 0x84DD, 0x84DD, 0x2132, 0x84DE, 0x84E9, 0x29E4,
- 0x84EA, 0x84EA, 0x2323, 0x84EB, 0x84ED, 0x29F0, 0x84EE, 0x84EE, 0x2011,
- 0x84EF, 0x84F0, 0x29F3, 0x84F1, 0x84F1, 0x20F5, 0x84F2, 0x84FE, 0x29F5,
- 0x8540, 0x8550, 0x2A02, 0x8551, 0x8551, 0x22C5, 0x8552, 0x8552, 0x1F5E,
- 0x8553, 0x8553, 0x2A13, 0x8554, 0x8554, 0x22C6, 0x8555, 0x855D, 0x2A14,
- 0x855E, 0x855E, 0x20EF, 0x855F, 0x8565, 0x2A1D, 0x8566, 0x8566, 0x21D0,
- 0x8567, 0x857E, 0x2A24, 0x8580, 0x8586, 0x2A3C, 0x8587, 0x8587, 0x22C1,
- 0x8588, 0x858A, 0x2A43, 0x858B, 0x858B, 0x1E64, 0x858C, 0x8591, 0x2A46,
- 0x8592, 0x8592, 0x21F9, 0x8593, 0x8595, 0x2A4C, 0x8596, 0x8596, 0x2010,
- 0x8597, 0x8597, 0x2A4F, 0x8598, 0x8598, 0x22C2, 0x8599, 0x85A1, 0x2A50,
- 0x85A2, 0x85A2, 0x1E5A, 0x85A3, 0x85B1, 0x2A59, 0x85B2, 0x85B2, 0x1EA2,
- 0x85B3, 0x85FE, 0x2A68, 0x8640, 0x8649, 0x2AB4, 0x864A, 0x864A, 0x236D,
- 0x864B, 0x8653, 0x2ABE, 0x8654, 0x8654, 0x2247, 0x8655, 0x8667, 0x2AC7,
- 0x8668, 0x8668, 0x236C, 0x8669, 0x867E, 0x2ADA, 0x8680, 0x8695, 0x2AF0,
- 0x8696, 0x8696, 0x219C, 0x8697, 0x8698, 0x2B06, 0x8699, 0x8699, 0x20C9,
- 0x869A, 0x86A0, 0x2B08, 0x86A1, 0x86A1, 0x21F0, 0x86A2, 0x86C9, 0x2B0F,
- 0x86CA, 0x86CA, 0x210B, 0x86CB, 0x86CB, 0x2B37, 0x86CC, 0x86CC, 0x20DE,
- 0x86CD, 0x86CD, 0x2B38, 0x86CE, 0x86CE, 0x1EAA, 0x86CF, 0x86D0, 0x2B39,
- 0x86D1, 0x86D1, 0x222C, 0x86D2, 0x86DB, 0x2B3B, 0x86DC, 0x86DC, 0x20D8,
- 0x86DD, 0x86DD, 0x22C0, 0x86DE, 0x86E0, 0x2B45, 0x86E1, 0x86E1, 0x206F,
- 0x86E2, 0x86E7, 0x2B48, 0x86E8, 0x86E8, 0x21A1, 0x86E9, 0x86ED, 0x2B4E,
- 0x86EE, 0x86EE, 0x2379, 0x86EF, 0x86F3, 0x2B53, 0x86F4, 0x86F4, 0x2372,
- 0x86F5, 0x86FE, 0x2B58, 0x8740, 0x8740, 0x216A, 0x8741, 0x8743, 0x2B62,
- 0x8744, 0x8744, 0x237C, 0x8745, 0x8748, 0x2B65, 0x8749, 0x8749, 0x20B0,
- 0x874A, 0x874A, 0x2B69, 0x874B, 0x874B, 0x237A, 0x874C, 0x874C, 0x1E74,
- 0x874D, 0x874E, 0x2B6A, 0x874F, 0x874F, 0x2377, 0x8750, 0x8756, 0x2B6C,
- 0x8757, 0x8757, 0x1F4C, 0x8758, 0x8759, 0x2B73, 0x875A, 0x875A, 0x2378,
- 0x875B, 0x875B, 0x21CF, 0x875C, 0x875C, 0x2368, 0x875D, 0x875D, 0x2B75,
- 0x875E, 0x875E, 0x2371, 0x875F, 0x875F, 0x2B76, 0x8760, 0x8760, 0x2369,
- 0x8761, 0x8765, 0x2B77, 0x8766, 0x8766, 0x2674, 0x8767, 0x8779, 0x2B7C,
- 0x877A, 0x877A, 0x236F, 0x877B, 0x877C, 0x2B8F, 0x877D, 0x877D, 0x2370,
- 0x877E, 0x877E, 0x2B91, 0x8780, 0x8780, 0x2B92, 0x8781, 0x8781, 0x2376,
- 0x8782, 0x8782, 0x2373, 0x8783, 0x8785, 0x2B93, 0x8786, 0x8786, 0x237F,
- 0x8787, 0x8787, 0x2B96, 0x8788, 0x8788, 0x2374, 0x8789, 0x8789, 0x2B97,
- 0x878A, 0x878A, 0x20B5, 0x878B, 0x878C, 0x2B98, 0x878D, 0x878D, 0x1EDB,
- 0x878E, 0x878E, 0x2672, 0x878F, 0x8792, 0x2B9A, 0x8793, 0x8793, 0x236E,
- 0x8794, 0x8797, 0x2B9E, 0x8798, 0x8798, 0x21B7, 0x8799, 0x879C, 0x2BA2,
- 0x879D, 0x879D, 0x2375, 0x879E, 0x87A2, 0x2BA6, 0x87A3, 0x87A3, 0x2382,
- 0x87A4, 0x87A6, 0x2BAB, 0x87A7, 0x87A7, 0x209E, 0x87A8, 0x87B2, 0x2BAE,
- 0x87B3, 0x87B3, 0x236B, 0x87B4, 0x87B4, 0x2BB9, 0x87B5, 0x87B5, 0x2039,
- 0x87B6, 0x87BA, 0x2BBA, 0x87BB, 0x87BB, 0x269F, 0x87BC, 0x87BE, 0x2BBF,
- 0x87BF, 0x87BF, 0x237D, 0x87C0, 0x87C0, 0x21F5, 0x87C1, 0x87C1, 0x2BC2,
- 0x87C2, 0x87C2, 0x2381, 0x87C3, 0x87C9, 0x2BC3, 0x87CA, 0x87CA, 0x237B,
- 0x87CB, 0x87CB, 0x237E, 0x87CC, 0x87CC, 0x21CC, 0x87CD, 0x87CE, 0x2BCA,
- 0x87CF, 0x87CF, 0x22DB, 0x87D0, 0x87D1, 0x2BCC, 0x87D2, 0x87D2, 0x236A,
- 0x87D3, 0x87D3, 0x2689, 0x87D4, 0x87D4, 0x2BCE, 0x87D5, 0x87D5, 0x2697,
- 0x87D6, 0x87D9, 0x2BCF, 0x87DA, 0x87DA, 0x22A1, 0x87DB, 0x87F6, 0x2BD3,
- 0x87F7, 0x87F7, 0x2383, 0x87F8, 0x87F8, 0x1F3D, 0x87F9, 0x87F9, 0x2BEF,
- 0x87FA, 0x87FA, 0x218F, 0x87FB, 0x87FE, 0x2BF0, 0x8840, 0x8840, 0x2246,
- 0x8841, 0x8841, 0x2248, 0x8842, 0x8843, 0x2BF4, 0x8844, 0x8844, 0x217E,
- 0x8845, 0x8845, 0x2BF6, 0x8846, 0x8846, 0x2180, 0x8847, 0x887E, 0x2BF7,
- 0x8880, 0x88B9, 0x2C2F, 0x88BA, 0x88BA, 0x232A, 0x88BB, 0x88CB, 0x2C69,
- 0x88CC, 0x88CC, 0x228B, 0x88CD, 0x88D3, 0x2C7A, 0x88D4, 0x88D4, 0x1F85,
- 0x88D5, 0x88D6, 0x2C81, 0x88D7, 0x88D7, 0x2325, 0x88D8, 0x88DE, 0x2C83,
- 0x88DF, 0x88DF, 0x232C, 0x88E0, 0x88E4, 0x2C8A, 0x88E5, 0x88E5, 0x232E,
- 0x88E6, 0x88F1, 0x2C8F, 0x88F2, 0x88F2, 0x2205, 0x88F3, 0x88F3, 0x1E38,
- 0x88F4, 0x88F5, 0x2C9B, 0x88F6, 0x88F6, 0x1E73, 0x88F7, 0x88FE, 0x2C9D,
- 0x8940, 0x894A, 0x2CA5, 0x894B, 0x894B, 0x1FE3, 0x894C, 0x894C, 0x2339,
- 0x894D, 0x894D, 0x2CB0, 0x894E, 0x894E, 0x232B, 0x894F, 0x894F, 0x2CB1,
- 0x8950, 0x8950, 0x232D, 0x8951, 0x8953, 0x2CB2, 0x8954, 0x8954, 0x217F,
- 0x8955, 0x895C, 0x2CB5, 0x895D, 0x895D, 0x21A7, 0x895E, 0x895E, 0x2CBD,
- 0x895F, 0x895F, 0x232F, 0x8960, 0x896C, 0x2CBE, 0x896D, 0x896D, 0x1E7D,
- 0x896E, 0x8970, 0x2CCB, 0x8971, 0x8971, 0x20D6, 0x8972, 0x897B, 0x2CCE,
- 0x897C, 0x897C, 0x1EC2, 0x897D, 0x897E, 0x2CD8, 0x8980, 0x898A, 0x2CDA,
- 0x898B, 0x898B, 0x22B2, 0x898C, 0x8998, 0x2CE5, 0x8999, 0x8999, 0x1EDF,
- 0x899A, 0x899D, 0x2CF2, 0x899E, 0x899E, 0x1EF9, 0x899F, 0x89A5, 0x2CF6,
- 0x89A6, 0x89A6, 0x20D9, 0x89A7, 0x89A7, 0x2CFD, 0x89A8, 0x89A8, 0x1FDD,
- 0x89A9, 0x89AE, 0x2CFE, 0x89AF, 0x89AF, 0x2167, 0x89B0, 0x89B9, 0x2D04,
- 0x89BA, 0x89BA, 0x21ED, 0x89BB, 0x89BD, 0x2D0E, 0x89BE, 0x89BE, 0x2007,
- 0x89BF, 0x89BF, 0x2326, 0x89C0, 0x89C0, 0x2329, 0x89C1, 0x89C3, 0x2D11,
- 0x89C4, 0x89C4, 0x1F52, 0x89C5, 0x89C5, 0x203B, 0x89C6, 0x89C6, 0x2328,
- 0x89C7, 0x89C7, 0x2D14, 0x89C8, 0x89C8, 0x2327, 0x89C9, 0x89CD, 0x2D15,
- 0x89CE, 0x89CE, 0x1E2B, 0x89CF, 0x89D0, 0x2D1A, 0x89D1, 0x89D1, 0x22AE,
- 0x89D2, 0x89D7, 0x2D1C, 0x89D8, 0x89D8, 0x1F49, 0x89D9, 0x89DA, 0x2D22,
- 0x89DB, 0x89DB, 0x2138, 0x89DC, 0x89F3, 0x2D24, 0x89F4, 0x89F4, 0x2081,
- 0x89F5, 0x89FE, 0x2D3C, 0x8A40, 0x8A40, 0x2D46, 0x8A41, 0x8A41, 0x1F7C,
- 0x8A42, 0x8A58, 0x2D47, 0x8A59, 0x8A59, 0x235B, 0x8A5A, 0x8A5A, 0x1EDE,
- 0x8A5B, 0x8A5B, 0x2D5E, 0x8A5C, 0x8A5C, 0x1FA2, 0x8A5D, 0x8A5D, 0x2D5F,
- 0x8A5E, 0x8A5E, 0x1EFA, 0x8A5F, 0x8A78, 0x2D60, 0x8A79, 0x8A79, 0x22AD,
- 0x8A7A, 0x8A7E, 0x2D7A, 0x8A80, 0x8AE3, 0x2D7F, 0x8AE4, 0x8AE4, 0x203F,
- 0x8AE5, 0x8AFE, 0x2DE3, 0x8B40, 0x8B43, 0x2DFD, 0x8B44, 0x8B44, 0x1F0E,
- 0x8B45, 0x8B48, 0x2E01, 0x8B49, 0x8B49, 0x23F9, 0x8B4A, 0x8B79, 0x2E05,
- 0x8B7A, 0x8B7A, 0x23FC, 0x8B7B, 0x8B7E, 0x2E35, 0x8B80, 0x8B8B, 0x2E39,
- 0x8B8C, 0x8B8C, 0x2069, 0x8B8D, 0x8B9D, 0x2E45, 0x8B9E, 0x8B9E, 0x23F7,
- 0x8B9F, 0x8BB2, 0x2E56, 0x8BB3, 0x8BB3, 0x23F6, 0x8BB4, 0x8BB8, 0x2E6A,
- 0x8BB9, 0x8BB9, 0x23FD, 0x8BBA, 0x8BBD, 0x2E6F, 0x8BBE, 0x8BBE, 0x23F8,
- 0x8BBF, 0x8BC5, 0x2E73, 0x8BC6, 0x8BC6, 0x23FA, 0x8BC7, 0x8BC7, 0x2E7A,
- 0x8BC8, 0x8BC8, 0x23FE, 0x8BC9, 0x8BC9, 0x1FA8, 0x8BCA, 0x8BD3, 0x2E7B,
- 0x8BD4, 0x8BD4, 0x2401, 0x8BD5, 0x8BDB, 0x2E85, 0x8BDC, 0x8BDC, 0x23FF,
- 0x8BDD, 0x8BE4, 0x2E8C, 0x8BE5, 0x8BE5, 0x2400, 0x8BE6, 0x8BEA, 0x2E94,
- 0x8BEB, 0x8BEB, 0x2221, 0x8BEC, 0x8BEF, 0x2E99, 0x8BF0, 0x8BF0, 0x2122,
- 0x8BF1, 0x8BFE, 0x2E9D, 0x8C40, 0x8C43, 0x2EAB, 0x8C44, 0x8C44, 0x23FB,
- 0x8C45, 0x8C4E, 0x2EAF, 0x8C4F, 0x8C4F, 0x215A, 0x8C50, 0x8C56, 0x2EB9,
- 0x8C57, 0x8C57, 0x21E5, 0x8C58, 0x8C5B, 0x2EC0, 0x8C5C, 0x8C5C, 0x2057,
- 0x8C5D, 0x8C7E, 0x2EC4, 0x8C80, 0x8C8A, 0x2EE6, 0x8C8B, 0x8C8B, 0x20E5,
- 0x8C8C, 0x8C8C, 0x2EF1, 0x8C8D, 0x8C8D, 0x212F, 0x8C8E, 0x8C8E, 0x20A3,
- 0x8C8F, 0x8C8F, 0x2121, 0x8C90, 0x8C90, 0x2EF2, 0x8C91, 0x8C91, 0x21D4,
- 0x8C92, 0x8C92, 0x1FE5, 0x8C93, 0x8C98, 0x2EF3, 0x8C99, 0x8C99, 0x1E8A,
- 0x8C9A, 0x8C9A, 0x1E37, 0x8C9B, 0x8CA1, 0x2EF9, 0x8CA2, 0x8CA2, 0x1F9E,
- 0x8CA3, 0x8CA3, 0x22A6, 0x8CA4, 0x8CA4, 0x21E8, 0x8CA5, 0x8CA5, 0x2F00,
- 0x8CA6, 0x8CA6, 0x1EDA, 0x8CA7, 0x8CA7, 0x1EB9, 0x8CA8, 0x8CBF, 0x2F01,
- 0x8CC0, 0x8CC0, 0x235C, 0x8CC1, 0x8CD1, 0x2F19, 0x8CD2, 0x8CD2, 0x2050,
- 0x8CD3, 0x8CD3, 0x1E67, 0x8CD4, 0x8CD4, 0x2F2A, 0x8CD5, 0x8CD5, 0x23F4,
- 0x8CD6, 0x8CD8, 0x2F2B, 0x8CD9, 0x8CD9, 0x213E, 0x8CDA, 0x8CF8, 0x2F2E,
- 0x8CF9, 0x8CF9, 0x1F16, 0x8CFA, 0x8CFE, 0x2F4D, 0x8D40, 0x8D72, 0x2F52,
- 0x8D73, 0x8D73, 0x2389, 0x8D74, 0x8D74, 0x2F85, 0x8D75, 0x8D75, 0x1EB7,
- 0x8D76, 0x8D7A, 0x2F86, 0x8D7B, 0x8D7B, 0x21B4, 0x8D7C, 0x8D7E, 0x2F8B,
- 0x8D80, 0x8D87, 0x2F8E, 0x8D88, 0x8D88, 0x238F, 0x8D89, 0x8D8E, 0x2F96,
- 0x8D8F, 0x8D8F, 0x1F1A, 0x8D90, 0x8D9D, 0x2F9C, 0x8D9E, 0x8D9E, 0x238B,
- 0x8D9F, 0x8DB8, 0x2FAA, 0x8DB9, 0x8DB9, 0x238A, 0x8DBA, 0x8DE1, 0x2FC4,
- 0x8DE2, 0x8DE2, 0x2391, 0x8DE3, 0x8DE3, 0x2FEC, 0x8DE4, 0x8DE4, 0x2271,
- 0x8DE5, 0x8DE6, 0x2FED, 0x8DE7, 0x8DE7, 0x2388, 0x8DE8, 0x8DF6, 0x2FEF,
- 0x8DF7, 0x8DF7, 0x238E, 0x8DF8, 0x8DFD, 0x2FFE, 0x8DFE, 0x8DFE, 0x238D,
- 0x8E40, 0x8E45, 0x3004, 0x8E46, 0x8E46, 0x238C, 0x8E47, 0x8E55, 0x300A,
- 0x8E56, 0x8E56, 0x2390, 0x8E57, 0x8E57, 0x3019, 0x8E58, 0x8E58, 0x2033,
- 0x8E59, 0x8E59, 0x301A, 0x8E5A, 0x8E5A, 0x223C, 0x8E5B, 0x8E67, 0x301B,
- 0x8E68, 0x8E68, 0x1FE9, 0x8E69, 0x8E6D, 0x3028, 0x8E6E, 0x8E6E, 0x2055,
- 0x8E6F, 0x8E6F, 0x302D, 0x8E70, 0x8E70, 0x2392, 0x8E71, 0x8E7E, 0x302E,
- 0x8E80, 0x8E80, 0x2324, 0x8E81, 0x8E9A, 0x303C, 0x8E9B, 0x8E9B, 0x2143,
- 0x8E9C, 0x8E9E, 0x3056, 0x8E9F, 0x8E9F, 0x2129, 0x8EA0, 0x8EA3, 0x3059,
- 0x8EA4, 0x8EA4, 0x2277, 0x8EA5, 0x8EA6, 0x305D, 0x8EA7, 0x8EA7, 0x1EA7,
- 0x8EA8, 0x8EAB, 0x305F, 0x8EAC, 0x8EAC, 0x2285, 0x8EAD, 0x8EAD, 0x3063,
- 0x8EAE, 0x8EAE, 0x2384, 0x8EAF, 0x8EBC, 0x3064, 0x8EBD, 0x8EBD, 0x2387,
- 0x8EBE, 0x8EBE, 0x2386, 0x8EBF, 0x8EC2, 0x3072, 0x8EC3, 0x8EC3, 0x2290,
- 0x8EC4, 0x8EC4, 0x3076, 0x8EC5, 0x8EC5, 0x1E44, 0x8EC6, 0x8ECC, 0x3077,
- 0x8ECD, 0x8ECD, 0x1E32, 0x8ECE, 0x8ECE, 0x2385, 0x8ECF, 0x8ED5, 0x307E,
- 0x8ED6, 0x8ED6, 0x1F13, 0x8ED7, 0x8ED7, 0x1F73, 0x8ED8, 0x8EEB, 0x3085,
- 0x8EEC, 0x8EEC, 0x1FE0, 0x8EED, 0x8EFE, 0x3099, 0x8F40, 0x8F51, 0x30AB,
- 0x8F52, 0x8F52, 0x2087, 0x8F53, 0x8F53, 0x1E78, 0x8F54, 0x8F54, 0x23AE,
- 0x8F55, 0x8F55, 0x1EF6, 0x8F56, 0x8F56, 0x1F31, 0x8F57, 0x8F5C, 0x30BD,
- 0x8F5D, 0x8F5D, 0x2045, 0x8F5E, 0x8F63, 0x30C3, 0x8F64, 0x8F64, 0x2178,
- 0x8F65, 0x8F7E, 0x30C9, 0x8F80, 0x8F85, 0x30E3, 0x8F86, 0x8F86, 0x23F5,
- 0x8F87, 0x8F87, 0x30E9, 0x8F88, 0x8F88, 0x2275, 0x8F89, 0x8F94, 0x30EA,
- 0x8F95, 0x8F95, 0x266E, 0x8F96, 0x8F96, 0x30F6, 0x8F97, 0x8F97, 0x1EB0,
- 0x8F98, 0x8F9A, 0x30F7, 0x8F9B, 0x8F9B, 0x2083, 0x8F9C, 0x8F9C, 0x30FA,
- 0x8F9D, 0x8F9D, 0x2188, 0x8F9E, 0x8FA0, 0x30FB, 0x8FA1, 0x8FA1, 0x267C,
- 0x8FA2, 0x8FBC, 0x30FE, 0x8FBD, 0x8FBD, 0x1FC5, 0x8FBE, 0x8FC3, 0x3119,
- 0x8FC4, 0x8FC4, 0x1EA1, 0x8FC5, 0x8FC5, 0x311F, 0x8FC6, 0x8FC6, 0x2393,
- 0x8FC7, 0x8FCC, 0x3120, 0x8FCD, 0x8FCD, 0x1F0B, 0x8FCE, 0x8FD7, 0x3126,
- 0x8FD8, 0x8FD8, 0x1E7C, 0x8FD9, 0x8FFE, 0x3130, 0x9040, 0x907E, 0x3156,
- 0x9080, 0x909C, 0x3195, 0x909D, 0x909D, 0x23B4, 0x909E, 0x909E, 0x207E,
- 0x909F, 0x90B9, 0x31B2, 0x90BA, 0x90BA, 0x1EE3, 0x90BB, 0x90BF, 0x31CD,
- 0x90C0, 0x90C0, 0x2095, 0x90C1, 0x90C1, 0x23BB, 0x90C2, 0x90C4, 0x31D2,
- 0x90C5, 0x90C5, 0x23B9, 0x90C6, 0x90DA, 0x31D5, 0x90DB, 0x90DB, 0x1E28,
- 0x90DC, 0x90DC, 0x23BD, 0x90DD, 0x90EC, 0x31EA, 0x90ED, 0x90ED, 0x23B5,
- 0x90EE, 0x90EF, 0x31FA, 0x90F0, 0x90F0, 0x23BA, 0x90F1, 0x90F6, 0x31FC,
- 0x90F7, 0x90F7, 0x23B3, 0x90F8, 0x90FE, 0x3202, 0x9140, 0x9141, 0x3209,
- 0x9142, 0x9142, 0x2162, 0x9143, 0x914A, 0x320B, 0x914B, 0x914B, 0x1E5E,
- 0x914C, 0x914C, 0x3213, 0x914D, 0x914D, 0x1E5D, 0x914E, 0x9150, 0x3214,
- 0x9151, 0x9151, 0x23B7, 0x9152, 0x9153, 0x3217, 0x9154, 0x9154, 0x1F2F,
- 0x9155, 0x9155, 0x24DF, 0x9156, 0x9158, 0x3219, 0x9159, 0x9159, 0x23B2,
- 0x915A, 0x915A, 0x214E, 0x915B, 0x915C, 0x321C, 0x915D, 0x915D, 0x2052,
- 0x915E, 0x9160, 0x321E, 0x9161, 0x9161, 0x23BC, 0x9162, 0x9162, 0x3221,
- 0x9163, 0x9163, 0x20EB, 0x9164, 0x916D, 0x3222, 0x916E, 0x916E, 0x2232,
- 0x916F, 0x9175, 0x322C, 0x9176, 0x9176, 0x1E3F, 0x9177, 0x9179, 0x3233,
- 0x917A, 0x917A, 0x201B, 0x917B, 0x917B, 0x20BC, 0x917C, 0x917C, 0x23BE,
- 0x917D, 0x917E, 0x3236, 0x9180, 0x9183, 0x3238, 0x9184, 0x9184, 0x1EAE,
- 0x9185, 0x918C, 0x323C, 0x918D, 0x918D, 0x1EFB, 0x918E, 0x9190, 0x3244,
- 0x9191, 0x9191, 0x2089, 0x9192, 0x9192, 0x3247, 0x9193, 0x9193, 0x23B1,
- 0x9194, 0x9196, 0x3248, 0x9197, 0x9197, 0x21C4, 0x9198, 0x919A, 0x324B,
- 0x919B, 0x919B, 0x2214, 0x919C, 0x91A8, 0x324E, 0x91A9, 0x91A9, 0x1FDE,
- 0x91AA, 0x91AA, 0x2223, 0x91AB, 0x91AB, 0x23B6, 0x91AC, 0x91B9, 0x325B,
- 0x91BA, 0x91BA, 0x268C, 0x91BB, 0x91BB, 0x24DE, 0x91BC, 0x91BE, 0x3269,
- 0x91BF, 0x91BF, 0x24E0, 0x91C0, 0x91C2, 0x326C, 0x91C3, 0x91C3, 0x23B8,
- 0x91C4, 0x91CC, 0x326F, 0x91CD, 0x91CD, 0x1E81, 0x91CE, 0x91CF, 0x3278,
- 0x91D0, 0x91D0, 0x1FFE, 0x91D1, 0x91D1, 0x1F51, 0x91D2, 0x91D2, 0x21E1,
- 0x91D3, 0x91D3, 0x327A, 0x91D4, 0x91D4, 0x23B0, 0x91D5, 0x91D5, 0x327B,
- 0x91D6, 0x91D6, 0x1FCE, 0x91D7, 0x91D7, 0x327C, 0x91D8, 0x91D8, 0x211E,
- 0x91D9, 0x91D9, 0x2021, 0x91DA, 0x91DE, 0x327D, 0x91DF, 0x91DF, 0x24E1,
- 0x91E0, 0x91E1, 0x3282, 0x91E2, 0x91E2, 0x24A3, 0x91E3, 0x91E9, 0x3284,
- 0x91EA, 0x91EA, 0x24A4, 0x91EB, 0x91EF, 0x328B, 0x91F0, 0x91F0, 0x2273,
- 0x91F1, 0x91F1, 0x3290, 0x91F2, 0x91F2, 0x21B0, 0x91F3, 0x91FE, 0x3291,
- 0x9240, 0x927E, 0x329D, 0x9280, 0x92B5, 0x32DC, 0x92B6, 0x92B6, 0x21D1,
- 0x92B7, 0x92CD, 0x3312, 0x92CE, 0x92CE, 0x211C, 0x92CF, 0x92CF, 0x3329,
- 0x92D0, 0x92D0, 0x235D, 0x92D1, 0x92D3, 0x332A, 0x92D4, 0x92D4, 0x2682,
- 0x92D5, 0x92DE, 0x332D, 0x92DF, 0x92DF, 0x210D, 0x92E0, 0x92E0, 0x205A,
- 0x92E1, 0x92FD, 0x3337, 0x92FE, 0x92FE, 0x1F8D, 0x9340, 0x934F, 0x3354,
- 0x9350, 0x9350, 0x21FF, 0x9351, 0x935C, 0x3364, 0x935D, 0x935D, 0x1F58,
- 0x935E, 0x936F, 0x3370, 0x9370, 0x9370, 0x215B, 0x9371, 0x9375, 0x3382,
- 0x9376, 0x9376, 0x1EB6, 0x9377, 0x937E, 0x3387, 0x9380, 0x938B, 0x338F,
- 0x938C, 0x938C, 0x20DB, 0x938D, 0x939C, 0x339B, 0x939D, 0x939D, 0x2360,
- 0x939E, 0x93A4, 0x33AB, 0x93A5, 0x93A5, 0x2361, 0x93A6, 0x93A6, 0x33B2,
- 0x93A7, 0x93A7, 0x2040, 0x93A8, 0x93B3, 0x33B3, 0x93B4, 0x93B4, 0x228E,
- 0x93B5, 0x93B7, 0x33BF, 0x93B8, 0x93B8, 0x1FDF, 0x93B9, 0x93BA, 0x33C2,
- 0x93BB, 0x93BB, 0x235E, 0x93BC, 0x93BC, 0x33C4, 0x93BD, 0x93BD, 0x1E6A,
- 0x93BE, 0x93C5, 0x33C5, 0x93C6, 0x93C6, 0x2002, 0x93C7, 0x93CE, 0x33CD,
- 0x93CF, 0x93CF, 0x2093, 0x93D0, 0x93D6, 0x33D5, 0x93D7, 0x93D7, 0x235F,
- 0x93D8, 0x93DA, 0x33DC, 0x93DB, 0x93DB, 0x1EAC, 0x93DC, 0x93DC, 0x1E54,
- 0x93DD, 0x93E0, 0x33DF, 0x93E1, 0x93E1, 0x1F08, 0x93E2, 0x93E3, 0x33E3,
- 0x93E4, 0x93E4, 0x20C0, 0x93E5, 0x93E5, 0x2362, 0x93E6, 0x93E8, 0x33E5,
- 0x93E9, 0x93E9, 0x2160, 0x93EA, 0x93EA, 0x33E8, 0x93EB, 0x93EB, 0x219D,
- 0x93EC, 0x93EC, 0x1F8E, 0x93ED, 0x93ED, 0x222D, 0x93EE, 0x93EE, 0x33E9,
- 0x93EF, 0x93EF, 0x2047, 0x93F0, 0x93F0, 0x33EA, 0x93F1, 0x93F1, 0x2262,
- 0x93F2, 0x93F3, 0x33EB, 0x93F4, 0x93F4, 0x1F67, 0x93F5, 0x93F5, 0x1EB2,
- 0x93F6, 0x93F9, 0x33ED, 0x93FA, 0x93FA, 0x1EA9, 0x93FB, 0x93FD, 0x33F1,
- 0x93FE, 0x93FE, 0x1FCC, 0x9440, 0x9443, 0x33F4, 0x9444, 0x9444, 0x1F72,
- 0x9445, 0x944C, 0x33F8, 0x944D, 0x944D, 0x2098, 0x944E, 0x944F, 0x3400,
- 0x9450, 0x9450, 0x1E52, 0x9451, 0x9451, 0x20A4, 0x9452, 0x9452, 0x1F1C,
- 0x9453, 0x9453, 0x228F, 0x9454, 0x9454, 0x3402, 0x9455, 0x9455, 0x1FED,
- 0x9456, 0x9457, 0x3403, 0x9458, 0x9458, 0x2365, 0x9459, 0x945A, 0x3405,
- 0x945B, 0x945B, 0x1E2D, 0x945C, 0x945C, 0x2152, 0x945D, 0x945D, 0x2366,
- 0x945E, 0x945E, 0x3407, 0x945F, 0x945F, 0x20FA, 0x9460, 0x9463, 0x3408,
- 0x9464, 0x9464, 0x2363, 0x9465, 0x9465, 0x340C, 0x9466, 0x9466, 0x209A,
- 0x9467, 0x946D, 0x340D, 0x946E, 0x946E, 0x203C, 0x946F, 0x9471, 0x3414,
- 0x9472, 0x9472, 0x1FF6, 0x9473, 0x9473, 0x3417, 0x9474, 0x9474, 0x2364,
- 0x9475, 0x9475, 0x3418, 0x9476, 0x9476, 0x1E69, 0x9477, 0x9477, 0x3419,
- 0x9478, 0x9478, 0x2367, 0x9479, 0x9479, 0x341A, 0x947A, 0x947A, 0x211D,
- 0x947B, 0x947E, 0x341B, 0x9480, 0x9480, 0x2259, 0x9481, 0x9481, 0x2056,
- 0x9482, 0x9482, 0x2163, 0x9483, 0x9486, 0x341F, 0x9487, 0x9487, 0x1FA9,
- 0x9488, 0x9488, 0x1FFC, 0x9489, 0x94A0, 0x3423, 0x94A1, 0x94A1, 0x1E2E,
- 0x94A2, 0x94B2, 0x343B, 0x94B3, 0x94B3, 0x1EBC, 0x94B4, 0x94B4, 0x344C,
- 0x94B5, 0x94B5, 0x2142, 0x94B6, 0x94BE, 0x344D, 0x94BF, 0x94BF, 0x201E,
- 0x94C0, 0x94C0, 0x1E43, 0x94C1, 0x94CB, 0x3456, 0x94CC, 0x94CC, 0x24D4,
- 0x94CD, 0x94D7, 0x3461, 0x94D8, 0x94D8, 0x226F, 0x94D9, 0x94DF, 0x346C,
- 0x94E0, 0x94E0, 0x1ED7, 0x94E1, 0x94FE, 0x3473, 0x9540, 0x9571, 0x3491,
- 0x9572, 0x9572, 0x212D, 0x9573, 0x957E, 0x34C3, 0x9580, 0x9582, 0x34CF,
- 0x9583, 0x9583, 0x229B, 0x9584, 0x959D, 0x34D2, 0x959E, 0x959E, 0x2256,
- 0x959F, 0x959F, 0x24A8, 0x95A0, 0x95B2, 0x34EC, 0x95B3, 0x95B3, 0x1E79,
- 0x95B4, 0x95B9, 0x34FF, 0x95BA, 0x95BA, 0x225A, 0x95BB, 0x95CE, 0x3505,
- 0x95CF, 0x95CF, 0x24A7, 0x95D0, 0x95D0, 0x3519, 0x95D1, 0x95D1, 0x2686,
- 0x95D2, 0x95D2, 0x24A6, 0x95D3, 0x95D3, 0x351A, 0x95D4, 0x95D4, 0x21CE,
- 0x95D5, 0x95E0, 0x351B, 0x95E1, 0x95E1, 0x24A9, 0x95E2, 0x95E6, 0x3527,
- 0x95E7, 0x95E7, 0x1FE7, 0x95E8, 0x95F0, 0x352C, 0x95F1, 0x95F1, 0x2112,
- 0x95F2, 0x95F7, 0x3535, 0x95F8, 0x95F8, 0x213C, 0x95F9, 0x95FD, 0x353B,
- 0x95FE, 0x95FE, 0x1F5C, 0x9640, 0x9655, 0x3540, 0x9656, 0x9656, 0x24C4,
- 0x9657, 0x967B, 0x3556, 0x967C, 0x967C, 0x1ECC, 0x967D, 0x967E, 0x357B,
- 0x9680, 0x96FE, 0x357D, 0x9740, 0x9766, 0x35FC, 0x9767, 0x9767, 0x246A,
- 0x9768, 0x976B, 0x3623, 0x976C, 0x976C, 0x2175, 0x976D, 0x976D, 0x3627,
- 0x976E, 0x976E, 0x246D, 0x976F, 0x977E, 0x3628, 0x9780, 0x9795, 0x3638,
- 0x9796, 0x9796, 0x246B, 0x9797, 0x9797, 0x225F, 0x9798, 0x979C, 0x364E,
- 0x979D, 0x979D, 0x1ECE, 0x979E, 0x97A2, 0x3653, 0x97A3, 0x97A3, 0x2272,
- 0x97A4, 0x97BE, 0x3658, 0x97BF, 0x97BF, 0x2473, 0x97C0, 0x97ED, 0x3673,
- 0x97EE, 0x97EE, 0x21FE, 0x97EF, 0x97F6, 0x36A1, 0x97F7, 0x97F7, 0x1EFE,
- 0x97F8, 0x97FE, 0x36A9, 0x9840, 0x9844, 0x36B0, 0x9845, 0x9845, 0x2475,
- 0x9846, 0x9848, 0x36B5, 0x9849, 0x9849, 0x220A, 0x984A, 0x984E, 0x36B8,
- 0x984F, 0x984F, 0x1F6F, 0x9850, 0x9870, 0x36BD, 0x9871, 0x9871, 0x2468,
- 0x9872, 0x9872, 0x36DE, 0x9873, 0x9873, 0x2100, 0x9874, 0x987E, 0x36DF,
- 0x9880, 0x9880, 0x36EA, 0x9881, 0x9881, 0x2476, 0x9882, 0x988A, 0x36EB,
- 0x988B, 0x988B, 0x1F27, 0x988C, 0x988C, 0x20D7, 0x988D, 0x989F, 0x36F4,
- 0x98A0, 0x98A0, 0x247C, 0x98A1, 0x98A9, 0x3707, 0x98AA, 0x98AA, 0x1FA1,
- 0x98AB, 0x98B5, 0x3710, 0x98B6, 0x98B6, 0x22AA, 0x98B7, 0x98B7, 0x2005,
- 0x98B8, 0x98B9, 0x371B, 0x98BA, 0x98BA, 0x246C, 0x98BB, 0x98C6, 0x371D,
- 0x98C7, 0x98C7, 0x203E, 0x98C8, 0x98CA, 0x3729, 0x98CB, 0x98CB, 0x1E4C,
- 0x98CC, 0x98CF, 0x372C, 0x98D0, 0x98D0, 0x213A, 0x98D1, 0x98D2, 0x3730,
- 0x98D3, 0x98D3, 0x2204, 0x98D4, 0x98E2, 0x3732, 0x98E3, 0x98E3, 0x20C3,
- 0x98E4, 0x98E4, 0x2140, 0x98E5, 0x98E5, 0x2477, 0x98E6, 0x98EE, 0x3741,
- 0x98EF, 0x98EF, 0x2474, 0x98F0, 0x98F1, 0x374A, 0x98F2, 0x98F2, 0x20DD,
- 0x98F3, 0x98FE, 0x374C, 0x9940, 0x9942, 0x3758, 0x9943, 0x9943, 0x1F68,
- 0x9944, 0x9944, 0x375B, 0x9945, 0x9945, 0x2185, 0x9946, 0x9965, 0x375C,
- 0x9966, 0x9966, 0x2472, 0x9967, 0x996D, 0x377C, 0x996E, 0x996E, 0x1EB5,
- 0x996F, 0x9974, 0x3783, 0x9975, 0x9975, 0x2478, 0x9976, 0x9979, 0x3789,
- 0x997A, 0x997A, 0x1F8B, 0x997B, 0x997B, 0x2484, 0x997C, 0x997E, 0x378D,
- 0x9980, 0x9984, 0x3790, 0x9985, 0x9985, 0x2699, 0x9986, 0x9988, 0x3795,
- 0x9989, 0x9989, 0x2482, 0x998A, 0x998D, 0x3798, 0x998E, 0x998E, 0x20A1,
- 0x998F, 0x9990, 0x379C, 0x9991, 0x9991, 0x1F92, 0x9992, 0x9998, 0x379E,
- 0x9999, 0x9999, 0x1F38, 0x999A, 0x99A8, 0x37A5, 0x99A9, 0x99A9, 0x2485,
- 0x99AA, 0x99AF, 0x37B4, 0x99B0, 0x99B0, 0x2480, 0x99B1, 0x99B1, 0x246E,
- 0x99B2, 0x99B2, 0x37BA, 0x99B3, 0x99B3, 0x247B, 0x99B4, 0x99B4, 0x2486,
- 0x99B5, 0x99B5, 0x2471, 0x99B6, 0x99BC, 0x37BB, 0x99BD, 0x99BD, 0x2483,
- 0x99BE, 0x99BE, 0x2470, 0x99BF, 0x99BF, 0x37C2, 0x99C0, 0x99C0, 0x2469,
- 0x99C1, 0x99C1, 0x37C3, 0x99C2, 0x99C2, 0x247F, 0x99C3, 0x99C8, 0x37C4,
- 0x99C9, 0x99C9, 0x246F, 0x99CA, 0x99CD, 0x37CA, 0x99CE, 0x99CE, 0x2481,
- 0x99CF, 0x99D0, 0x37CE, 0x99D1, 0x99D1, 0x2220, 0x99D2, 0x99D9, 0x37D0,
- 0x99DA, 0x99DA, 0x1FF5, 0x99DB, 0x99DF, 0x37D8, 0x99E0, 0x99E0, 0x20F4,
- 0x99E1, 0x99E4, 0x37DD, 0x99E5, 0x99E5, 0x247D, 0x99E6, 0x99E7, 0x37E1,
- 0x99E8, 0x99E8, 0x2479, 0x99E9, 0x99EB, 0x37E3, 0x99EC, 0x99EC, 0x247E,
- 0x99ED, 0x99F3, 0x37E6, 0x99F4, 0x99F4, 0x247A, 0x99F5, 0x99FE, 0x37ED,
- 0x9A40, 0x9A49, 0x37F7, 0x9A4A, 0x9A4A, 0x20E3, 0x9A4B, 0x9A56, 0x3801,
- 0x9A57, 0x9A57, 0x20AD, 0x9A58, 0x9A64, 0x380D, 0x9A65, 0x9A65, 0x24CB,
- 0x9A66, 0x9A66, 0x381A, 0x9A67, 0x9A67, 0x1F53, 0x9A68, 0x9A70, 0x381B,
- 0x9A71, 0x9A71, 0x2159, 0x9A72, 0x9A75, 0x3824, 0x9A76, 0x9A76, 0x2013,
- 0x9A77, 0x9A77, 0x1F33, 0x9A78, 0x9A7E, 0x3828, 0x9A80, 0x9A87, 0x382F,
- 0x9A88, 0x9A88, 0x1E5C, 0x9A89, 0x9A8B, 0x3837, 0x9A8C, 0x9A8C, 0x2488,
- 0x9A8D, 0x9A90, 0x383A, 0x9A91, 0x9A91, 0x2487, 0x9A92, 0x9A96, 0x383E,
- 0x9A97, 0x9A97, 0x248A, 0x9A98, 0x9A99, 0x3843, 0x9A9A, 0x9A9A, 0x2489,
- 0x9A9B, 0x9A9B, 0x248B, 0x9A9C, 0x9A9D, 0x3845, 0x9A9E, 0x9A9E, 0x1F83,
- 0x9A9F, 0x9AA1, 0x3847, 0x9AA2, 0x9AA2, 0x210F, 0x9AA3, 0x9AA3, 0x1FDB,
- 0x9AA4, 0x9AA9, 0x384A, 0x9AAA, 0x9AAA, 0x20AF, 0x9AAB, 0x9ACF, 0x3850,
- 0x9AD0, 0x9AD0, 0x24C0, 0x9AD1, 0x9AD5, 0x3875, 0x9AD6, 0x9AD6, 0x226D,
- 0x9AD7, 0x9AD9, 0x387A, 0x9ADA, 0x9ADA, 0x24C1, 0x9ADB, 0x9AE1, 0x387D,
- 0x9AE2, 0x9AE2, 0x20CA, 0x9AE3, 0x9AE3, 0x3884, 0x9AE4, 0x9AE4, 0x20E7,
- 0x9AE5, 0x9AE5, 0x24C2, 0x9AE6, 0x9AFE, 0x3885, 0x9B40, 0x9B7E, 0x389E,
- 0x9B80, 0x9BD0, 0x38DD, 0x9BD1, 0x9BD1, 0x23DC, 0x9BD2, 0x9BDB, 0x392E,
- 0x9BDC, 0x9BDC, 0x23DB, 0x9BDD, 0x9BFE, 0x3938, 0x9C40, 0x9C52, 0x395A,
- 0x9C53, 0x9C53, 0x205E, 0x9C54, 0x9C58, 0x396D, 0x9C59, 0x9C59, 0x2244,
- 0x9C5A, 0x9C5A, 0x23E2, 0x9C5B, 0x9C5B, 0x3972, 0x9C5C, 0x9C5C, 0x20D4,
- 0x9C5D, 0x9C74, 0x3973, 0x9C75, 0x9C75, 0x219F, 0x9C76, 0x9C78, 0x398B,
- 0x9C79, 0x9C79, 0x1E66, 0x9C7A, 0x9C7E, 0x398E, 0x9C80, 0x9C85, 0x3993,
- 0x9C86, 0x9C86, 0x1F63, 0x9C87, 0x9C9C, 0x3999, 0x9C9D, 0x9C9D, 0x23DD,
- 0x9C9E, 0x9CAA, 0x39AF, 0x9CAB, 0x9CAB, 0x216B, 0x9CAC, 0x9CC9, 0x39BC,
- 0x9CCA, 0x9CCA, 0x22B5, 0x9CCB, 0x9CCE, 0x39DA, 0x9CCF, 0x9CCF, 0x1F26,
- 0x9CD0, 0x9CE5, 0x39DE, 0x9CE6, 0x9CE6, 0x1E63, 0x9CE7, 0x9CE7, 0x2088,
- 0x9CE8, 0x9CEB, 0x39F4, 0x9CEC, 0x9CEC, 0x1EBD, 0x9CED, 0x9CED, 0x39F8,
- 0x9CEE, 0x9CEE, 0x2341, 0x9CEF, 0x9CFA, 0x39F9, 0x9CFB, 0x9CFB, 0x1F4B,
- 0x9CFC, 0x9CFD, 0x3A05, 0x9CFE, 0x9CFE, 0x2292, 0x9D40, 0x9D41, 0x3A07,
- 0x9D42, 0x9D42, 0x2124, 0x9D43, 0x9D45, 0x3A09, 0x9D46, 0x9D46, 0x2048,
- 0x9D47, 0x9D47, 0x23E0, 0x9D48, 0x9D4C, 0x3A0C, 0x9D4D, 0x9D4D, 0x2077,
- 0x9D4E, 0x9D4E, 0x3A11, 0x9D4F, 0x9D4F, 0x223A, 0x9D50, 0x9D60, 0x3A12,
- 0x9D61, 0x9D61, 0x20B1, 0x9D62, 0x9D67, 0x3A23, 0x9D68, 0x9D68, 0x1F41,
- 0x9D69, 0x9D69, 0x201C, 0x9D6A, 0x9D6D, 0x3A29, 0x9D6E, 0x9D6E, 0x22B8,
- 0x9D6F, 0x9D70, 0x3A2D, 0x9D71, 0x9D71, 0x2276, 0x9D72, 0x9D74, 0x3A2F,
- 0x9D75, 0x9D75, 0x1F9B, 0x9D76, 0x9D7A, 0x3A32, 0x9D7B, 0x9D7B, 0x1F9F,
- 0x9D7C, 0x9D7C, 0x3A37, 0x9D7D, 0x9D7D, 0x25CA, 0x9D7E, 0x9D7E, 0x3A38,
- 0x9D80, 0x9D89, 0x3A39, 0x9D8A, 0x9D8A, 0x20BE, 0x9D8B, 0x9D8C, 0x3A43,
- 0x9D8D, 0x9D8D, 0x1FB4, 0x9D8E, 0x9D90, 0x3A45, 0x9D91, 0x9D91, 0x23D7,
- 0x9D92, 0x9D98, 0x3A48, 0x9D99, 0x9D99, 0x2105, 0x9D9A, 0x9DA0, 0x3A4F,
- 0x9DA1, 0x9DA1, 0x23E1, 0x9DA2, 0x9DA2, 0x1FEC, 0x9DA3, 0x9DA6, 0x3A56,
- 0x9DA7, 0x9DA7, 0x23EA, 0x9DA8, 0x9DAB, 0x3A5A, 0x9DAC, 0x9DAC, 0x23E3,
- 0x9DAD, 0x9DAD, 0x210E, 0x9DAE, 0x9DB1, 0x3A5E, 0x9DB2, 0x9DB2, 0x1FA6,
- 0x9DB3, 0x9DB3, 0x2004, 0x9DB4, 0x9DBD, 0x3A62, 0x9DBE, 0x9DBE, 0x1F9D,
- 0x9DBF, 0x9DC5, 0x3A6C, 0x9DC6, 0x9DC6, 0x23E5, 0x9DC7, 0x9DC8, 0x3A73,
- 0x9DC9, 0x9DC9, 0x2264, 0x9DCA, 0x9DCC, 0x3A75, 0x9DCD, 0x9DCD, 0x24E2,
- 0x9DCE, 0x9DD1, 0x3A78, 0x9DD2, 0x9DD2, 0x23DE, 0x9DD3, 0x9DD4, 0x3A7C,
- 0x9DD5, 0x9DD5, 0x1EC4, 0x9DD6, 0x9DE0, 0x3A7E, 0x9DE1, 0x9DE1, 0x22B6,
- 0x9DE2, 0x9DE2, 0x20A9, 0x9DE3, 0x9DF0, 0x3A89, 0x9DF1, 0x9DF1, 0x212B,
- 0x9DF2, 0x9DF3, 0x3A97, 0x9DF4, 0x9DF4, 0x20A5, 0x9DF5, 0x9DF6, 0x3A99,
- 0x9DF7, 0x9DF7, 0x268B, 0x9DF8, 0x9DF9, 0x3A9B, 0x9DFA, 0x9DFA, 0x1F76,
- 0x9DFB, 0x9DFC, 0x3A9D, 0x9DFD, 0x9DFD, 0x216D, 0x9DFE, 0x9DFE, 0x3A9F,
- 0x9E40, 0x9E44, 0x3AA0, 0x9E45, 0x9E45, 0x2001, 0x9E46, 0x9E47, 0x3AA5,
- 0x9E48, 0x9E48, 0x2191, 0x9E49, 0x9E49, 0x1E50, 0x9E4A, 0x9E51, 0x3AA7,
- 0x9E52, 0x9E52, 0x1F9C, 0x9E53, 0x9E53, 0x3AAF, 0x9E54, 0x9E54, 0x23DA,
- 0x9E55, 0x9E55, 0x3AB0, 0x9E56, 0x9E56, 0x2053, 0x9E57, 0x9E5C, 0x3AB1,
- 0x9E5D, 0x9E5D, 0x23E9, 0x9E5E, 0x9E5E, 0x23E4, 0x9E5F, 0x9E60, 0x3AB7,
- 0x9E61, 0x9E61, 0x21D5, 0x9E62, 0x9E62, 0x3AB9, 0x9E63, 0x9E63, 0x23E6,
- 0x9E64, 0x9E66, 0x3ABA, 0x9E67, 0x9E67, 0x23DF, 0x9E68, 0x9E6B, 0x3ABD,
- 0x9E6C, 0x9E6C, 0x1E4F, 0x9E6D, 0x9E6E, 0x3AC1, 0x9E6F, 0x9E6F, 0x23D9,
- 0x9E70, 0x9E71, 0x3AC3, 0x9E72, 0x9E72, 0x2014, 0x9E73, 0x9E73, 0x3AC5,
- 0x9E74, 0x9E74, 0x23EC, 0x9E75, 0x9E75, 0x23EB, 0x9E76, 0x9E7A, 0x3AC6,
- 0x9E7B, 0x9E7B, 0x23D8, 0x9E7C, 0x9E7C, 0x23EE, 0x9E7D, 0x9E7E, 0x3ACB,
- 0x9E80, 0x9E84, 0x3ACD, 0x9E85, 0x9E85, 0x268E, 0x9E86, 0x9E86, 0x3AD2,
- 0x9E87, 0x9E87, 0x23ED, 0x9E88, 0x9E90, 0x3AD3, 0x9E91, 0x9E91, 0x1FFA,
- 0x9E92, 0x9E95, 0x3ADC, 0x9E96, 0x9E96, 0x23D6, 0x9E97, 0x9E97, 0x23E8,
- 0x9E98, 0x9EA1, 0x3AE0, 0x9EA2, 0x9EA2, 0x2106, 0x9EA3, 0x9EA5, 0x3AEA,
- 0x9EA6, 0x9EA6, 0x200B, 0x9EA7, 0x9EA8, 0x3AED, 0x9EA9, 0x9EA9, 0x2166,
- 0x9EAA, 0x9EAD, 0x3AEF, 0x9EAE, 0x9EAE, 0x23EF, 0x9EAF, 0x9EB2, 0x3AF3,
- 0x9EB3, 0x9EB3, 0x2189, 0x9EB4, 0x9EB4, 0x2058, 0x9EB5, 0x9EB6, 0x3AF7,
- 0x9EB7, 0x9EB7, 0x23E7, 0x9EB8, 0x9EF4, 0x3AF9, 0x9EF5, 0x9EF5, 0x21A3,
- 0x9EF6, 0x9EFE, 0x3B36, 0x9F40, 0x9F4D, 0x3B3F, 0x9F4E, 0x9F4E, 0x217A,
- 0x9F4F, 0x9F6E, 0x3B4D, 0x9F6F, 0x9F6F, 0x21A5, 0x9F70, 0x9F7E, 0x3B6D,
- 0x9F80, 0x9F91, 0x3B7C, 0x9F92, 0x9F92, 0x2022, 0x9F93, 0x9F97, 0x3B8E,
- 0x9F98, 0x9F98, 0x24D6, 0x9F99, 0x9FA5, 0x3B93, 0x9FA6, 0x9FA6, 0x233A,
- 0x9FA7, 0x9FA8, 0x3BA0, 0x9FA9, 0x9FA9, 0x1EEE, 0x9FAA, 0x9FAB, 0x3BA2,
- 0x9FAC, 0x9FAC, 0x24D5, 0x9FAD, 0x9FC8, 0x3BA4, 0x9FC9, 0x9FC9, 0x2228,
- 0x9FCA, 0x9FCC, 0x3BC0, 0x9FCD, 0x9FCD, 0x24D7, 0x9FCE, 0x9FE0, 0x3BC3,
- 0x9FE1, 0x9FE1, 0x20FC, 0x9FE2, 0x9FEA, 0x3BD6, 0x9FEB, 0x9FEB, 0x1E87,
- 0x9FEC, 0x9FED, 0x3BDF, 0x9FEE, 0x9FEE, 0x24D8, 0x9FEF, 0x9FF3, 0x3BE1,
- 0x9FF4, 0x9FF4, 0x1EBA, 0x9FF5, 0x9FFC, 0x3BE6, 0x9FFD, 0x9FFD, 0x2119,
- 0x9FFE, 0x9FFE, 0x3BEE, 0xA040, 0xA042, 0x3BEF, 0xA043, 0xA043, 0x216C,
- 0xA044, 0xA045, 0x3BF2, 0xA046, 0xA046, 0x24D9, 0xA047, 0xA048, 0x3BF4,
- 0xA049, 0xA049, 0x2227, 0xA04A, 0xA04D, 0x3BF6, 0xA04E, 0xA04E, 0x1E5F,
- 0xA04F, 0xA053, 0x3BFA, 0xA054, 0xA054, 0x229F, 0xA055, 0xA059, 0x3BFF,
- 0xA05A, 0xA05A, 0x1F5D, 0xA05B, 0xA060, 0x3C04, 0xA061, 0xA061, 0x1FBC,
- 0xA062, 0xA062, 0x3C0A, 0xA063, 0xA063, 0x24DA, 0xA064, 0xA070, 0x3C0B,
- 0xA071, 0xA071, 0x2149, 0xA072, 0xA073, 0x3C18, 0xA074, 0xA074, 0x2046,
- 0xA075, 0xA07E, 0x3C1A, 0xA080, 0xA080, 0x2000, 0xA081, 0xA090, 0x3C24,
- 0xA091, 0xA091, 0x2190, 0xA092, 0xA093, 0x3C34, 0xA094, 0xA094, 0x2208,
- 0xA095, 0xA095, 0x3C36, 0xA096, 0xA096, 0x1EE6, 0xA097, 0xA0A8, 0x3C37,
- 0xA0A9, 0xA0A9, 0x24C3, 0xA0AA, 0xA0BE, 0x3C49, 0xA0BF, 0xA0BF, 0x20CC,
- 0xA0C0, 0xA0CD, 0x3C5E, 0xA0CE, 0xA0CE, 0x2340, 0xA0CF, 0xA0D8, 0x3C6C,
- 0xA0D9, 0xA0D9, 0x1ED1, 0xA0DA, 0xA0DD, 0x3C76, 0xA0DE, 0xA0DE, 0x21AC,
- 0xA0DF, 0xA0ED, 0x3C7A, 0xA0EE, 0xA0EE, 0x22AF, 0xA0EF, 0xA0FE, 0x3C89,
- 0xA1A1, 0xA1FE, 0x0060, 0xA2A1, 0xA2AA, 0x26A9, 0xA2B1, 0xA2E2, 0x00BE,
- 0xA2E5, 0xA2EE, 0x00F0, 0xA2F1, 0xA2FC, 0x00FA, 0xA3A1, 0xA3FE, 0x0106,
- 0xA4A1, 0xA4F3, 0x0164, 0xA5A1, 0xA5F6, 0x01B7, 0xA6A1, 0xA6B8, 0x020D,
- 0xA6C1, 0xA6F5, 0x0225, 0xA7A1, 0xA7C1, 0x025A, 0xA7D1, 0xA7F1, 0x027B,
- 0xA840, 0xA87E, 0x26B3, 0xA880, 0xA895, 0x26F2, 0xA8A1, 0xA8C0, 0x029C,
- 0xA8C5, 0xA8EA, 0x02BC, 0xA940, 0xA957, 0x2708, 0xA959, 0xA95A, 0x2720,
- 0xA95C, 0xA95C, 0x2722, 0xA960, 0xA97E, 0x2723, 0xA980, 0xA995, 0x2742,
- 0xA996, 0xA996, 0x1E17, 0xA9A4, 0xA9EF, 0x02E2, 0xAA40, 0xAA4C, 0x3C99,
- 0xAA4D, 0xAA4D, 0x21B6, 0xAA4E, 0xAA4E, 0x1E3D, 0xAA4F, 0xAA70, 0x3CA6,
- 0xAA71, 0xAA71, 0x2235, 0xAA72, 0xAA72, 0x3CC8, 0xAA73, 0xAA73, 0x2397,
- 0xAA74, 0xAA76, 0x3CC9, 0xAA77, 0xAA77, 0x2395, 0xAA78, 0xAA79, 0x3CCC,
- 0xAA7A, 0xAA7A, 0x223F, 0xAA7B, 0xAA7B, 0x212A, 0xAA7C, 0xAA7E, 0x3CCE,
- 0xAA80, 0xAA99, 0x3CD1, 0xAA9A, 0xAA9A, 0x1ED2, 0xAA9B, 0xAA9B, 0x3CEB,
- 0xAA9C, 0xAA9C, 0x2396, 0xAA9D, 0xAA9D, 0x2398, 0xAA9E, 0xAA9E, 0x3CEC,
- 0xAA9F, 0xAA9F, 0x20A2, 0xAAA0, 0xAAA0, 0x3CED, 0xAAA1, 0xAAFE, 0x032E,
- 0xAB40, 0xAB40, 0x1F64, 0xAB41, 0xAB42, 0x3CEE, 0xAB43, 0xAB43, 0x202B,
- 0xAB44, 0xAB44, 0x3CF0, 0xAB45, 0xAB45, 0x2394, 0xAB46, 0xAB46, 0x2139,
- 0xAB47, 0xAB47, 0x3CF1, 0xAB48, 0xAB48, 0x215F, 0xAB49, 0xAB49, 0x21C1,
- 0xAB4A, 0xAB4A, 0x239A, 0xAB4B, 0xAB4C, 0x3CF2, 0xAB4D, 0xAB4D, 0x2399,
- 0xAB4E, 0xAB7E, 0x3CF4, 0xAB80, 0xABA0, 0x3D25, 0xABA1, 0xABC0, 0x038C,
- 0xAC40, 0xAC45, 0x3D46, 0xAC46, 0xAC46, 0x21C0, 0xAC47, 0xAC70, 0x3D4C,
- 0xAC71, 0xAC71, 0x2460, 0xAC72, 0xAC7B, 0x3D76, 0xAC7C, 0xAC7C, 0x245C,
- 0xAC7D, 0xAC7E, 0x3D80, 0xAC80, 0xAC8C, 0x3D82, 0xAC8D, 0xAC8D, 0x215D,
- 0xAC8E, 0xAC92, 0x3D8F, 0xAC93, 0xAC93, 0x2225, 0xAC94, 0xAC94, 0x206A,
- 0xAC95, 0xACA0, 0x3D94, 0xAD40, 0xAD48, 0x3DA0, 0xAD49, 0xAD49, 0x2461,
- 0xAD4A, 0xAD5D, 0x3DA9, 0xAD5E, 0xAD5E, 0x245B, 0xAD5F, 0xAD60, 0x3DBD,
- 0xAD61, 0xAD61, 0x2462, 0xAD62, 0xAD67, 0x3DBF, 0xAD68, 0xAD68, 0x1F54,
- 0xAD69, 0xAD73, 0x3DC5, 0xAD74, 0xAD74, 0x245F, 0xAD75, 0xAD7E, 0x3DD0,
- 0xAD80, 0xAD81, 0x3DDA, 0xAD82, 0xAD82, 0x20EC, 0xAD83, 0xAD86, 0x3DDC,
- 0xAD87, 0xAD87, 0x245D, 0xAD88, 0xAD8A, 0x3DE0, 0xAD8B, 0xAD8B, 0x2463,
- 0xAD8C, 0xAD90, 0x3DE3, 0xAD91, 0xAD91, 0x2464, 0xAD92, 0xADA0, 0x3DE8,
- 0xAE40, 0xAE53, 0x3DF7, 0xAE54, 0xAE54, 0x24A5, 0xAE55, 0xAE61, 0x3E0B,
- 0xAE62, 0xAE62, 0x1E70, 0xAE63, 0xAE7E, 0x3E18, 0xAE80, 0xAE80, 0x208F,
- 0xAE81, 0xAE84, 0x3E34, 0xAE85, 0xAE85, 0x1E42, 0xAE86, 0xAE8A, 0x3E38,
- 0xAE8B, 0xAE8B, 0x1F4E, 0xAE8C, 0xAE93, 0x3E3D, 0xAE94, 0xAE94, 0x1EB1,
- 0xAE95, 0xAE9F, 0x3E45, 0xAEA0, 0xAEA0, 0x1E8B, 0xAF40, 0xAF63, 0x3E50,
- 0xAF64, 0xAF64, 0x1FC6, 0xAF65, 0xAF7A, 0x3E74, 0xAF7B, 0xAF7B, 0x25AE,
- 0xAF7C, 0xAF7E, 0x3E8A, 0xAF80, 0xAF81, 0x3E8D, 0xAF82, 0xAF82, 0x1F01,
- 0xAF83, 0xAF83, 0x2200, 0xAF84, 0xAF8D, 0x3E8F, 0xAF8E, 0xAF8E, 0x25B2,
- 0xAF8F, 0xAF8F, 0x1E97, 0xAF90, 0xAF90, 0x3E99, 0xAF91, 0xAF91, 0x20AB,
- 0xAF92, 0xAF9B, 0x3E9A, 0xAF9C, 0xAF9C, 0x25B3, 0xAF9D, 0xAF9E, 0x3EA4,
- 0xAF9F, 0xAF9F, 0x2028, 0xAFA0, 0xAFA0, 0x3EA6, 0xB040, 0xB040, 0x3EA7,
- 0xB041, 0xB042, 0x25AF, 0xB043, 0xB043, 0x3EA8, 0xB044, 0xB044, 0x25B1,
- 0xB045, 0xB04E, 0x3EA9, 0xB04F, 0xB04F, 0x25AC, 0xB050, 0xB053, 0x3EB3,
- 0xB054, 0xB054, 0x1E4E, 0xB055, 0xB056, 0x3EB7, 0xB057, 0xB057, 0x2202,
- 0xB058, 0xB058, 0x25AB, 0xB059, 0xB059, 0x2286, 0xB05A, 0xB05A, 0x3EB9,
- 0xB05B, 0xB05B, 0x25AD, 0xB05C, 0xB05C, 0x3EBA, 0xB05D, 0xB05D, 0x25B6,
- 0xB05E, 0xB05E, 0x3EBB, 0xB05F, 0xB05F, 0x21E3, 0xB060, 0xB061, 0x25B4,
- 0xB062, 0xB062, 0x222F, 0xB063, 0xB063, 0x2165, 0xB064, 0xB064, 0x25B7,
- 0xB065, 0xB06B, 0x3EBC, 0xB06C, 0xB06C, 0x1EE9, 0xB06D, 0xB07C, 0x3EC3,
- 0xB07D, 0xB07D, 0x1E25, 0xB07E, 0xB07E, 0x3ED3, 0xB080, 0xB096, 0x3ED4,
- 0xB097, 0xB097, 0x25C0, 0xB098, 0xB098, 0x3EEB, 0xB099, 0xB099, 0x229A,
- 0xB09A, 0xB0A0, 0x3EEC, 0xB0A1, 0xB0FE, 0x03AC, 0xB140, 0xB14A, 0x3EF3,
- 0xB14B, 0xB14B, 0x226E, 0xB14C, 0xB14C, 0x3EFE, 0xB14D, 0xB14D, 0x1FBD,
- 0xB14E, 0xB14E, 0x3EFF, 0xB14F, 0xB14F, 0x1F84, 0xB150, 0xB150, 0x20B2,
- 0xB151, 0xB151, 0x3F00, 0xB152, 0xB152, 0x2043, 0xB153, 0xB17E, 0x3F01,
- 0xB180, 0xB196, 0x3F2D, 0xB197, 0xB197, 0x2684, 0xB198, 0xB1A0, 0x3F44,
- 0xB1A1, 0xB1FE, 0x040A, 0xB240, 0xB240, 0x3F4D, 0xB241, 0xB241, 0x24EF,
- 0xB242, 0xB266, 0x3F4E, 0xB267, 0xB267, 0x24EE, 0xB268, 0xB26C, 0x3F73,
- 0xB26D, 0xB26D, 0x2074, 0xB26E, 0xB273, 0x3F78, 0xB274, 0xB274, 0x2687,
- 0xB275, 0xB27E, 0x3F7E, 0xB280, 0xB280, 0x24F0, 0xB281, 0xB288, 0x3F88,
- 0xB289, 0xB289, 0x268D, 0xB28A, 0xB299, 0x3F90, 0xB29A, 0xB29A, 0x22A0,
- 0xB29B, 0xB2A0, 0x3FA0, 0xB2A1, 0xB2FE, 0x0468, 0xB340, 0xB342, 0x3FA6,
- 0xB343, 0xB343, 0x1FAB, 0xB344, 0xB36F, 0x3FA9, 0xB370, 0xB370, 0x26A8,
- 0xB371, 0xB37E, 0x3FD5, 0xB380, 0xB387, 0x3FE3, 0xB388, 0xB388, 0x24E9,
- 0xB389, 0xB38B, 0x3FEB, 0xB38C, 0xB38C, 0x24E5, 0xB38D, 0xB38D, 0x3FEE,
- 0xB38E, 0xB38E, 0x21FA, 0xB38F, 0xB3A0, 0x3FEF, 0xB3A1, 0xB3FE, 0x04C6,
- 0xB440, 0xB453, 0x4001, 0xB454, 0xB454, 0x2148, 0xB455, 0xB457, 0x4015,
- 0xB458, 0xB458, 0x24E4, 0xB459, 0xB45D, 0x4018, 0xB45E, 0xB45E, 0x24E6,
- 0xB45F, 0xB45F, 0x20F7, 0xB460, 0xB460, 0x401D, 0xB461, 0xB461, 0x206B,
- 0xB462, 0xB474, 0x401E, 0xB475, 0xB475, 0x22A7, 0xB476, 0xB47D, 0x4031,
- 0xB47E, 0xB47E, 0x24EC, 0xB480, 0xB482, 0x4039, 0xB483, 0xB483, 0x24EB,
- 0xB484, 0xB488, 0x403C, 0xB489, 0xB489, 0x24E3, 0xB48A, 0xB492, 0x4041,
- 0xB493, 0xB493, 0x24EA, 0xB494, 0xB4A0, 0x404A, 0xB4A1, 0xB4FE, 0x0524,
- 0xB540, 0xB540, 0x4057, 0xB541, 0xB541, 0x1E92, 0xB542, 0xB54A, 0x4058,
- 0xB54B, 0xB54B, 0x1E27, 0xB54C, 0xB555, 0x4061, 0xB556, 0xB556, 0x1FE6,
- 0xB557, 0xB559, 0x406B, 0xB55A, 0xB55A, 0x24E7, 0xB55B, 0xB55B, 0x2012,
- 0xB55C, 0xB55C, 0x1EEC, 0xB55D, 0xB560, 0x406E, 0xB561, 0xB561, 0x24E8,
- 0xB562, 0xB57E, 0x4072, 0xB580, 0xB59B, 0x408F, 0xB59C, 0xB59C, 0x1F66,
- 0xB59D, 0xB59D, 0x24DC, 0xB59E, 0xB5A0, 0x40AB, 0xB5A1, 0xB5FE, 0x0582,
- 0xB640, 0xB651, 0x40AE, 0xB652, 0xB652, 0x26A2, 0xB653, 0xB654, 0x40C0,
- 0xB655, 0xB655, 0x24DD, 0xB656, 0xB658, 0x40C2, 0xB659, 0xB659, 0x200E,
- 0xB65A, 0xB65A, 0x40C5, 0xB65B, 0xB65B, 0x24DB, 0xB65C, 0xB65C, 0x1EB8,
- 0xB65D, 0xB67E, 0x40C6, 0xB680, 0xB6A0, 0x40E8, 0xB6A1, 0xB6FE, 0x05E0,
- 0xB740, 0xB74D, 0x4109, 0xB74E, 0xB74E, 0x2295, 0xB74F, 0xB750, 0x4117,
- 0xB751, 0xB751, 0x1E80, 0xB752, 0xB758, 0x4119, 0xB759, 0xB759, 0x2677,
- 0xB75A, 0xB763, 0x4120, 0xB764, 0xB764, 0x2624, 0xB765, 0xB765, 0x1F69,
- 0xB766, 0xB766, 0x222B, 0xB767, 0xB776, 0x412A, 0xB777, 0xB777, 0x257F,
- 0xB778, 0xB778, 0x1F5B, 0xB779, 0xB77E, 0x413A, 0xB780, 0xB780, 0x219B,
- 0xB781, 0xB781, 0x4140, 0xB782, 0xB782, 0x267D, 0xB783, 0xB7A0, 0x4141,
- 0xB7A1, 0xB7FE, 0x063E, 0xB840, 0xB842, 0x415F, 0xB843, 0xB843, 0x21A0,
- 0xB844, 0xB844, 0x2186, 0xB845, 0xB845, 0x4162, 0xB846, 0xB846, 0x20ED,
- 0xB847, 0xB84C, 0x4163, 0xB84D, 0xB84D, 0x25B9, 0xB84E, 0xB850, 0x4169,
- 0xB851, 0xB851, 0x1FEA, 0xB852, 0xB859, 0x416C, 0xB85A, 0xB85A, 0x1EA4,
- 0xB85B, 0xB85B, 0x20E1, 0xB85C, 0xB85C, 0x4174, 0xB85D, 0xB85D, 0x25B8,
- 0xB85E, 0xB85E, 0x2260, 0xB85F, 0xB85F, 0x4175, 0xB860, 0xB860, 0x20E2,
- 0xB861, 0xB876, 0x4176, 0xB877, 0xB877, 0x2141, 0xB878, 0xB87E, 0x418C,
- 0xB880, 0xB881, 0x4193, 0xB882, 0xB882, 0x1FC7, 0xB883, 0xB8A0, 0x4195,
- 0xB8A1, 0xB8FE, 0x069C, 0xB940, 0xB94F, 0x41B3, 0xB950, 0xB950, 0x1E41,
- 0xB951, 0xB960, 0x41C3, 0xB961, 0xB961, 0x25E4, 0xB962, 0xB97A, 0x41D3,
- 0xB97B, 0xB97B, 0x1F86, 0xB97C, 0xB97E, 0x41EC, 0xB980, 0xB99C, 0x41EF,
- 0xB99D, 0xB99D, 0x1FB3, 0xB99E, 0xB99F, 0x420C, 0xB9A0, 0xB9A0, 0x1EEF,
- 0xB9A1, 0xB9FE, 0x06FA, 0xBA40, 0xBA41, 0x420E, 0xBA42, 0xBA42, 0x22A4,
- 0xBA43, 0xBA43, 0x4210, 0xBA44, 0xBA44, 0x25E8, 0xBA45, 0xBA55, 0x4211,
- 0xBA56, 0xBA56, 0x25E3, 0xBA57, 0xBA58, 0x4222, 0xBA59, 0xBA59, 0x2111,
- 0xBA5A, 0xBA5F, 0x4224, 0xBA60, 0xBA60, 0x25E6, 0xBA61, 0xBA69, 0x422A,
- 0xBA6A, 0xBA6A, 0x25E7, 0xBA6B, 0xBA73, 0x4233, 0xBA74, 0xBA74, 0x2041,
- 0xBA75, 0xBA7E, 0x423C, 0xBA80, 0xBA83, 0x4246, 0xBA84, 0xBA84, 0x25EA,
- 0xBA85, 0xBA85, 0x424A, 0xBA86, 0xBA86, 0x1F8F, 0xBA87, 0xBA87, 0x424B,
- 0xBA88, 0xBA88, 0x25EC, 0xBA89, 0xBA8C, 0x424C, 0xBA8D, 0xBA8D, 0x25EB,
- 0xBA8E, 0xBA9D, 0x4250, 0xBA9E, 0xBA9E, 0x20D0, 0xBA9F, 0xBA9F, 0x201D,
- 0xBAA0, 0xBAA0, 0x4260, 0xBAA1, 0xBAFE, 0x0758, 0xBB40, 0xBB40, 0x1FF7,
- 0xBB41, 0xBB48, 0x4261, 0xBB49, 0xBB49, 0x1E8D, 0xBB4A, 0xBB57, 0x4269,
- 0xBB58, 0xBB58, 0x25E9, 0xBB59, 0xBB5A, 0x4277, 0xBB5B, 0xBB5B, 0x25EE,
- 0xBB5C, 0xBB5C, 0x203A, 0xBB5D, 0xBB5F, 0x4279, 0xBB60, 0xBB60, 0x2693,
- 0xBB61, 0xBB64, 0x427C, 0xBB65, 0xBB65, 0x25E5, 0xBB66, 0xBB66, 0x25ED,
- 0xBB67, 0xBB67, 0x4280, 0xBB68, 0xBB68, 0x2009, 0xBB69, 0xBB69, 0x4281,
- 0xBB6A, 0xBB6A, 0x2065, 0xBB6B, 0xBB6D, 0x4282, 0xBB6E, 0xBB6E, 0x26A3,
- 0xBB6F, 0xBB7E, 0x4285, 0xBB80, 0xBBA0, 0x4295, 0xBBA1, 0xBBFE, 0x07B6,
- 0xBC40, 0xBC51, 0x42B6, 0xBC52, 0xBC52, 0x25F5, 0xBC53, 0xBC53, 0x1EFC,
- 0xBC54, 0xBC59, 0x42C8, 0xBC5A, 0xBC5A, 0x2024, 0xBC5B, 0xBC60, 0x42CE,
- 0xBC61, 0xBC61, 0x269B, 0xBC62, 0xBC62, 0x42D4, 0xBC63, 0xBC63, 0x25F3,
- 0xBC64, 0xBC64, 0x42D5, 0xBC65, 0xBC65, 0x22D9, 0xBC66, 0xBC66, 0x42D6,
- 0xBC67, 0xBC67, 0x25F4, 0xBC68, 0xBC68, 0x42D7, 0xBC69, 0xBC69, 0x241B,
- 0xBC6A, 0xBC6C, 0x42D8, 0xBC6D, 0xBC6D, 0x1FC8, 0xBC6E, 0xBC6E, 0x42DB,
- 0xBC6F, 0xBC6F, 0x1F7B, 0xBC70, 0xBC70, 0x42DC, 0xBC71, 0xBC71, 0x241D,
- 0xBC72, 0xBC72, 0x42DD, 0xBC73, 0xBC73, 0x224C, 0xBC74, 0xBC74, 0x1F48,
- 0xBC75, 0xBC75, 0x241C, 0xBC76, 0xBC77, 0x241E, 0xBC78, 0xBC78, 0x20FF,
- 0xBC79, 0xBC79, 0x219A, 0xBC7A, 0xBC7A, 0x42DE, 0xBC7B, 0xBC7B, 0x2091,
- 0xBC7C, 0xBC7D, 0x42DF, 0xBC7E, 0xBC7E, 0x20A7, 0xBC80, 0xBC81, 0x42E1,
- 0xBC82, 0xBC82, 0x2423, 0xBC83, 0xBC83, 0x1E9B, 0xBC84, 0xBC84, 0x2422,
- 0xBC85, 0xBC85, 0x42E3, 0xBC86, 0xBC86, 0x2110, 0xBC87, 0xBC87, 0x42E4,
- 0xBC88, 0xBC88, 0x228D, 0xBC89, 0xBC89, 0x1F71, 0xBC8A, 0xBC8A, 0x1EF8,
- 0xBC8B, 0xBC8B, 0x2421, 0xBC8C, 0xBC8E, 0x42E5, 0xBC8F, 0xBC8F, 0x1EF3,
- 0xBC90, 0xBC99, 0x42E8, 0xBC9A, 0xBC9A, 0x21B1, 0xBC9B, 0xBC9B, 0x2426,
- 0xBC9C, 0xBC9C, 0x2425, 0xBC9D, 0xBC9D, 0x2120, 0xBC9E, 0xBCA0, 0x42F2,
- 0xBCA1, 0xBCFE, 0x0814, 0xBD40, 0xBD41, 0x42F5, 0xBD42, 0xBD42, 0x211A,
- 0xBD43, 0xBD43, 0x2424, 0xBD44, 0xBD44, 0x42F7, 0xBD45, 0xBD45, 0x2428,
- 0xBD46, 0xBD47, 0x42F8, 0xBD48, 0xBD48, 0x242A, 0xBD49, 0xBD49, 0x2429,
- 0xBD4A, 0xBD4A, 0x42FA, 0xBD4B, 0xBD4B, 0x2294, 0xBD4C, 0xBD4C, 0x42FB,
- 0xBD4D, 0xBD4D, 0x22BE, 0xBD4E, 0xBD4E, 0x42FC, 0xBD4F, 0xBD4F, 0x1E31,
- 0xBD50, 0xBD56, 0x42FD, 0xBD57, 0xBD57, 0x242C, 0xBD58, 0xBD58, 0x4304,
- 0xBD59, 0xBD59, 0x1FB5, 0xBD5A, 0xBD65, 0x4305, 0xBD66, 0xBD66, 0x242B,
- 0xBD67, 0xBD67, 0x1FAF, 0xBD68, 0xBD69, 0x4311, 0xBD6A, 0xBD6A, 0x2068,
- 0xBD6B, 0xBD6B, 0x21E4, 0xBD6C, 0xBD6E, 0x4313, 0xBD6F, 0xBD6F, 0x1F21,
- 0xBD70, 0xBD70, 0x4316, 0xBD71, 0xBD71, 0x2101, 0xBD72, 0xBD78, 0x4317,
- 0xBD79, 0xBD79, 0x217C, 0xBD7A, 0xBD7A, 0x214A, 0xBD7B, 0xBD7B, 0x242D,
- 0xBD7C, 0xBD7D, 0x431E, 0xBD7E, 0xBD7E, 0x1FD4, 0xBD80, 0xBD80, 0x4320,
- 0xBD81, 0xBD81, 0x1FD1, 0xBD82, 0xBD88, 0x4321, 0xBD89, 0xBD89, 0x1E33,
- 0xBD8A, 0xBD8A, 0x4328, 0xBD8B, 0xBD8B, 0x242F, 0xBD8C, 0xBD8D, 0x4329,
- 0xBD8E, 0xBD8E, 0x242E, 0xBD8F, 0xBD8F, 0x432B, 0xBD90, 0xBD90, 0x2430,
- 0xBD91, 0xBD91, 0x21DB, 0xBD92, 0xBD96, 0x432C, 0xBD97, 0xBD97, 0x2158,
- 0xBD98, 0xBD9A, 0x4331, 0xBD9B, 0xBD9B, 0x1FC2, 0xBD9C, 0xBDA0, 0x4334,
- 0xBDA1, 0xBDFE, 0x0872, 0xBE40, 0xBE42, 0x4339, 0xBE43, 0xBE43, 0x22B9,
- 0xBE44, 0xBE44, 0x433C, 0xBE45, 0xBE45, 0x2436, 0xBE46, 0xBE48, 0x433D,
- 0xBE49, 0xBE49, 0x1E8E, 0xBE4A, 0xBE4A, 0x2439, 0xBE4B, 0xBE50, 0x4340,
- 0xBE51, 0xBE51, 0x21C5, 0xBE52, 0xBE52, 0x2437, 0xBE53, 0xBE53, 0x2192,
- 0xBE54, 0xBE54, 0x4346, 0xBE55, 0xBE55, 0x243A, 0xBE56, 0xBE56, 0x1F19,
- 0xBE57, 0xBE57, 0x218C, 0xBE58, 0xBE58, 0x1E40, 0xBE59, 0xBE59, 0x22B3,
- 0xBE5A, 0xBE5C, 0x4347, 0xBE5D, 0xBE5D, 0x205F, 0xBE5E, 0xBE5E, 0x2438,
- 0xBE5F, 0xBE5F, 0x2432, 0xBE60, 0xBE60, 0x2274, 0xBE61, 0xBE61, 0x434A,
- 0xBE62, 0xBE62, 0x1E9C, 0xBE63, 0xBE63, 0x2431, 0xBE64, 0xBE64, 0x2085,
- 0xBE65, 0xBE68, 0x434B, 0xBE69, 0xBE69, 0x2435, 0xBE6A, 0xBE6B, 0x434F,
- 0xBE6C, 0xBE6C, 0x243B, 0xBE6D, 0xBE6E, 0x4351, 0xBE6F, 0xBE6F, 0x1FB7,
- 0xBE70, 0xBE70, 0x2433, 0xBE71, 0xBE75, 0x4353, 0xBE76, 0xBE76, 0x2054,
- 0xBE77, 0xBE77, 0x21DE, 0xBE78, 0xBE78, 0x4358, 0xBE79, 0xBE79, 0x2434,
- 0xBE7A, 0xBE7B, 0x4359, 0xBE7C, 0xBE7C, 0x243D, 0xBE7D, 0xBE7D, 0x1F89,
- 0xBE7E, 0xBE7E, 0x243C, 0xBE80, 0xBE82, 0x435B, 0xBE83, 0xBE83, 0x1F6E,
- 0xBE84, 0xBE84, 0x1ED8, 0xBE85, 0xBE85, 0x435E, 0xBE86, 0xBE86, 0x1EBF,
- 0xBE87, 0xBE87, 0x2445, 0xBE88, 0xBE88, 0x435F, 0xBE89, 0xBE89, 0x2249,
- 0xBE8A, 0xBE8B, 0x4360, 0xBE8C, 0xBE8C, 0x2441, 0xBE8D, 0xBE8D, 0x4362,
- 0xBE8E, 0xBE8E, 0x1E47, 0xBE8F, 0xBE8F, 0x1F56, 0xBE90, 0xBE91, 0x4363,
- 0xBE92, 0xBE92, 0x2086, 0xBE93, 0xBE94, 0x4365, 0xBE95, 0xBE95, 0x2196,
- 0xBE96, 0xBE96, 0x4367, 0xBE97, 0xBE97, 0x2443, 0xBE98, 0xBE98, 0x243F,
- 0xBE99, 0xBE99, 0x4368, 0xBE9A, 0xBE9A, 0x2023, 0xBE9B, 0xBE9B, 0x4369,
- 0xBE9C, 0xBE9C, 0x2442, 0xBE9D, 0xBE9E, 0x436A, 0xBE9F, 0xBE9F, 0x243E,
- 0xBEA0, 0xBEA0, 0x436C, 0xBEA1, 0xBEFE, 0x08D0, 0xBF40, 0xBF40, 0x26A6,
- 0xBF41, 0xBF4C, 0x436D, 0xBF4D, 0xBF4D, 0x234E, 0xBF4E, 0xBF4E, 0x2446,
- 0xBF4F, 0xBF4F, 0x244B, 0xBF50, 0xBF50, 0x2444, 0xBF51, 0xBF54, 0x4379,
- 0xBF55, 0xBF55, 0x2427, 0xBF56, 0xBF56, 0x244C, 0xBF57, 0xBF5F, 0x437D,
- 0xBF60, 0xBF60, 0x1F0F, 0xBF61, 0xBF61, 0x4386, 0xBF62, 0xBF62, 0x2447,
- 0xBF63, 0xBF63, 0x2449, 0xBF64, 0xBF64, 0x2448, 0xBF65, 0xBF67, 0x4387,
- 0xBF68, 0xBF68, 0x21C2, 0xBF69, 0xBF6B, 0x438A, 0xBF6C, 0xBF6C, 0x216E,
- 0xBF6D, 0xBF6F, 0x438D, 0xBF70, 0xBF70, 0x1F03, 0xBF71, 0xBF71, 0x4390,
- 0xBF72, 0xBF72, 0x244A, 0xBF73, 0xBF73, 0x215C, 0xBF74, 0xBF75, 0x4391,
- 0xBF76, 0xBF76, 0x22BB, 0xBF77, 0xBF77, 0x2450, 0xBF78, 0xBF78, 0x4393,
- 0xBF79, 0xBF79, 0x2694, 0xBF7A, 0xBF7A, 0x244F, 0xBF7B, 0xBF7B, 0x25F6,
- 0xBF7C, 0xBF7C, 0x2051, 0xBF7D, 0xBF7D, 0x4394, 0xBF7E, 0xBF7E, 0x244E,
- 0xBF80, 0xBF81, 0x4395, 0xBF82, 0xBF82, 0x22BA, 0xBF83, 0xBF83, 0x1F6D,
- 0xBF84, 0xBF88, 0x4397, 0xBF89, 0xBF89, 0x2452, 0xBF8A, 0xBF8A, 0x2451,
- 0xBF8B, 0xBF94, 0x439C, 0xBF95, 0xBF95, 0x2455, 0xBF96, 0xBF96, 0x43A6,
- 0xBF97, 0xBF97, 0x2289, 0xBF98, 0xBF98, 0x2116, 0xBF99, 0xBF9C, 0x43A7,
- 0xBF9D, 0xBF9D, 0x2454, 0xBF9E, 0xBFA0, 0x43AB, 0xBFA1, 0xBFFE, 0x092E,
- 0xC040, 0xC040, 0x20FB, 0xC041, 0xC043, 0x43AE, 0xC044, 0xC044, 0x2440,
- 0xC045, 0xC04A, 0x43B1, 0xC04B, 0xC04B, 0x2126, 0xC04C, 0xC04C, 0x1F61,
- 0xC04D, 0xC04D, 0x269D, 0xC04E, 0xC04E, 0x43B7, 0xC04F, 0xC04F, 0x1F8A,
- 0xC050, 0xC050, 0x2456, 0xC051, 0xC051, 0x2459, 0xC052, 0xC052, 0x2458,
- 0xC053, 0xC054, 0x43B8, 0xC055, 0xC055, 0x1FAE, 0xC056, 0xC05A, 0x43BA,
- 0xC05B, 0xC05B, 0x221A, 0xC05C, 0xC05D, 0x43BF, 0xC05E, 0xC05E, 0x1F7A,
- 0xC05F, 0xC05F, 0x244D, 0xC060, 0xC060, 0x2457, 0xC061, 0xC068, 0x43C1,
- 0xC069, 0xC069, 0x2453, 0xC06A, 0xC06A, 0x43C9, 0xC06B, 0xC06B, 0x2420,
- 0xC06C, 0xC06C, 0x43CA, 0xC06D, 0xC06D, 0x21DF, 0xC06E, 0xC06E, 0x2685,
- 0xC06F, 0xC06F, 0x43CB, 0xC070, 0xC070, 0x1E6E, 0xC071, 0xC073, 0x43CC,
- 0xC074, 0xC074, 0x2224, 0xC075, 0xC075, 0x2670, 0xC076, 0xC076, 0x43CF,
- 0xC077, 0xC077, 0x21BA, 0xC078, 0xC078, 0x43D0, 0xC079, 0xC079, 0x245A,
- 0xC07A, 0xC07B, 0x43D1, 0xC07C, 0xC07C, 0x1FFF, 0xC07D, 0xC07E, 0x43D3,
- 0xC080, 0xC09A, 0x43D5, 0xC09B, 0xC09B, 0x25E2, 0xC09C, 0xC09C, 0x43F0,
- 0xC09D, 0xC09D, 0x269A, 0xC09E, 0xC0A0, 0x43F1, 0xC0A1, 0xC0FE, 0x098C,
- 0xC140, 0xC14F, 0x43F4, 0xC150, 0xC150, 0x1EEA, 0xC151, 0xC153, 0x4404,
- 0xC154, 0xC154, 0x1E2C, 0xC155, 0xC15E, 0x4407, 0xC15F, 0xC15F, 0x2062,
- 0xC160, 0xC160, 0x24F1, 0xC161, 0xC161, 0x4411, 0xC162, 0xC162, 0x24F2,
- 0xC163, 0xC174, 0x4412, 0xC175, 0xC175, 0x25F2, 0xC176, 0xC177, 0x4424,
- 0xC178, 0xC178, 0x2215, 0xC179, 0xC17E, 0x4426, 0xC180, 0xC194, 0x442C,
- 0xC195, 0xC195, 0x21AE, 0xC196, 0xC1A0, 0x4441, 0xC1A1, 0xC1FE, 0x09EA,
- 0xC240, 0xC24D, 0x444C, 0xC24E, 0xC24E, 0x20E0, 0xC24F, 0xC264, 0x445A,
- 0xC265, 0xC265, 0x25C2, 0xC266, 0xC266, 0x4470, 0xC267, 0xC267, 0x25C1,
- 0xC268, 0xC27C, 0x4471, 0xC27D, 0xC27D, 0x2128, 0xC27E, 0xC27E, 0x4486,
- 0xC280, 0xC283, 0x4487, 0xC284, 0xC284, 0x2199, 0xC285, 0xC292, 0x448B,
- 0xC293, 0xC293, 0x2017, 0xC294, 0xC294, 0x1EA0, 0xC295, 0xC295, 0x2125,
- 0xC296, 0xC296, 0x214D, 0xC297, 0xC297, 0x4499, 0xC298, 0xC298, 0x25C4,
- 0xC299, 0xC299, 0x209D, 0xC29A, 0xC29A, 0x228A, 0xC29B, 0xC29B, 0x449A,
- 0xC29C, 0xC29C, 0x25C3, 0xC29D, 0xC29F, 0x449B, 0xC2A0, 0xC2A0, 0x2179,
- 0xC2A1, 0xC2FE, 0x0A48, 0xC340, 0xC340, 0x2038, 0xC341, 0xC342, 0x449E,
- 0xC343, 0xC343, 0x2155, 0xC344, 0xC37A, 0x44A0, 0xC37B, 0xC37B, 0x21D2,
- 0xC37C, 0xC37E, 0x44D7, 0xC380, 0xC383, 0x44DA, 0xC384, 0xC384, 0x24C7,
- 0xC385, 0xC39A, 0x44DE, 0xC39B, 0xC39B, 0x2279, 0xC39C, 0xC3A0, 0x44F4,
- 0xC3A1, 0xC3FE, 0x0AA6, 0xC440, 0xC448, 0x44F9, 0xC449, 0xC449, 0x2123,
- 0xC44A, 0xC44B, 0x4502, 0xC44C, 0xC44C, 0x24C5, 0xC44D, 0xC453, 0x4504,
- 0xC454, 0xC454, 0x24C9, 0xC455, 0xC457, 0x450B, 0xC458, 0xC458, 0x2094,
- 0xC459, 0xC45A, 0x450E, 0xC45B, 0xC45B, 0x2296, 0xC45C, 0xC462, 0x4510,
- 0xC463, 0xC463, 0x1E77, 0xC464, 0xC476, 0x4517, 0xC477, 0xC477, 0x1F06,
- 0xC478, 0xC479, 0x452A, 0xC47A, 0xC47A, 0x1FA5, 0xC47B, 0xC47E, 0x452C,
- 0xC480, 0xC480, 0x4530, 0xC481, 0xC481, 0x2099, 0xC482, 0xC490, 0x4531,
- 0xC491, 0xC491, 0x1EAD, 0xC492, 0xC492, 0x24C8, 0xC493, 0xC493, 0x20A8,
- 0xC494, 0xC497, 0x4540, 0xC498, 0xC498, 0x201F, 0xC499, 0xC499, 0x4544,
- 0xC49A, 0xC49A, 0x20C5, 0xC49B, 0xC49B, 0x4545, 0xC49C, 0xC49C, 0x24CA,
- 0xC49D, 0xC4A0, 0x4546, 0xC4A1, 0xC4FE, 0x0B04, 0xC540, 0xC543, 0x454A,
- 0xC544, 0xC544, 0x1FF0, 0xC545, 0xC545, 0x454E, 0xC546, 0xC546, 0x24C6,
- 0xC547, 0xC54A, 0x454F, 0xC54B, 0xC54B, 0x225D, 0xC54C, 0xC54C, 0x22DE,
- 0xC54D, 0xC551, 0x4553, 0xC552, 0xC552, 0x202C, 0xC553, 0xC55E, 0x4558,
- 0xC55F, 0xC55F, 0x2161, 0xC560, 0xC562, 0x4564, 0xC563, 0xC563, 0x223B,
- 0xC564, 0xC564, 0x21D9, 0xC565, 0xC565, 0x1FCB, 0xC566, 0xC566, 0x1FC9,
- 0xC567, 0xC57E, 0x4567, 0xC580, 0xC592, 0x457F, 0xC593, 0xC593, 0x1E61,
- 0xC594, 0xC59B, 0x4592, 0xC59C, 0xC59C, 0x25EF, 0xC59D, 0xC59D, 0x459A,
- 0xC59E, 0xC59E, 0x1F98, 0xC59F, 0xC5A0, 0x459B, 0xC5A1, 0xC5FE, 0x0B62,
- 0xC640, 0xC640, 0x459D, 0xC641, 0xC641, 0x25F0, 0xC642, 0xC643, 0x459E,
- 0xC644, 0xC644, 0x1F88, 0xC645, 0xC646, 0x45A0, 0xC647, 0xC647, 0x21F8,
- 0xC648, 0xC662, 0x45A2, 0xC663, 0xC663, 0x2322, 0xC664, 0xC671, 0x45BD,
- 0xC672, 0xC672, 0x2336, 0xC673, 0xC67E, 0x45CB, 0xC680, 0xC6A0, 0x45D7,
- 0xC6A1, 0xC6FE, 0x0BC0, 0xC740, 0xC765, 0x45F8, 0xC766, 0xC766, 0x22AB,
- 0xC767, 0xC76E, 0x461E, 0xC76F, 0xC76F, 0x1FBF, 0xC770, 0xC775, 0x4626,
- 0xC776, 0xC776, 0x1F7D, 0xC777, 0xC77A, 0x462C, 0xC77B, 0xC77B, 0x2333,
- 0xC77C, 0xC77E, 0x4630, 0xC780, 0xC7A0, 0x4633, 0xC7A1, 0xC7FE, 0x0C1E,
- 0xC840, 0xC840, 0x4654, 0xC841, 0xC841, 0x1F4D, 0xC842, 0xC84E, 0x4655,
- 0xC84F, 0xC84F, 0x2334, 0xC850, 0xC851, 0x4662, 0xC852, 0xC852, 0x1FF1,
- 0xC853, 0xC865, 0x4664, 0xC866, 0xC866, 0x218B, 0xC867, 0xC86D, 0x4677,
- 0xC86E, 0xC86E, 0x2349, 0xC86F, 0xC87D, 0x467E, 0xC87E, 0xC87E, 0x220B,
- 0xC880, 0xC886, 0x468D, 0xC887, 0xC887, 0x2346, 0xC888, 0xC891, 0x4694,
- 0xC892, 0xC892, 0x2347, 0xC893, 0xC893, 0x469E, 0xC894, 0xC894, 0x2193,
- 0xC895, 0xC898, 0x469F, 0xC899, 0xC899, 0x26A1, 0xC89A, 0xC89C, 0x46A3,
- 0xC89D, 0xC89D, 0x1F62, 0xC89E, 0xC8A0, 0x46A6, 0xC8A1, 0xC8FE, 0x0C7C,
- 0xC940, 0xC94E, 0x46A9, 0xC94F, 0xC94F, 0x234D, 0xC950, 0xC950, 0x2348,
- 0xC951, 0xC96D, 0x46B8, 0xC96E, 0xC96E, 0x1E60, 0xC96F, 0xC96F, 0x46D5,
- 0xC970, 0xC970, 0x2345, 0xC971, 0xC976, 0x46D6, 0xC977, 0xC977, 0x1F12,
- 0xC978, 0xC97E, 0x46DC, 0xC980, 0xC98E, 0x46E3, 0xC98F, 0xC98F, 0x2018,
- 0xC990, 0xC990, 0x2335, 0xC991, 0xC99B, 0x46F2, 0xC99C, 0xC99C, 0x233C,
- 0xC99D, 0xC9A0, 0x46FD, 0xC9A1, 0xC9FE, 0x0CDA, 0xCA40, 0xCA4D, 0x4701,
- 0xCA4E, 0xCA4E, 0x266F, 0xCA4F, 0xCA55, 0x470F, 0xCA56, 0xCA56, 0x2351,
- 0xCA57, 0xCA58, 0x4716, 0xCA59, 0xCA59, 0x1FA0, 0xCA5A, 0xCA5B, 0x4718,
- 0xCA5C, 0xCA5C, 0x2338, 0xCA5D, 0xCA60, 0x471A, 0xCA61, 0xCA61, 0x221B,
- 0xCA62, 0xCA6D, 0x471E, 0xCA6E, 0xCA6E, 0x2342, 0xCA6F, 0xCA71, 0x472A,
- 0xCA72, 0xCA72, 0x234F, 0xCA73, 0xCA76, 0x472D, 0xCA77, 0xCA77, 0x233D,
- 0xCA78, 0xCA7A, 0x4731, 0xCA7B, 0xCA7B, 0x2344, 0xCA7C, 0xCA7C, 0x2331,
- 0xCA7D, 0xCA7D, 0x4734, 0xCA7E, 0xCA7E, 0x234B, 0xCA80, 0xCA80, 0x4735,
- 0xCA81, 0xCA81, 0x233B, 0xCA82, 0xCA88, 0x4736, 0xCA89, 0xCA89, 0x2350,
- 0xCA8A, 0xCA8D, 0x473D, 0xCA8E, 0xCA8E, 0x1EB4, 0xCA8F, 0xCA8F, 0x21A6,
- 0xCA90, 0xCA91, 0x4741, 0xCA92, 0xCA92, 0x21CB, 0xCA93, 0xCA99, 0x4743,
- 0xCA9A, 0xCA9A, 0x2355, 0xCA9B, 0xCAA0, 0x474A, 0xCAA1, 0xCAFE, 0x0D38,
- 0xCB40, 0xCB42, 0x4750, 0xCB43, 0xCB43, 0x233E, 0xCB44, 0xCB44, 0x4753,
- 0xCB45, 0xCB45, 0x1F74, 0xCB46, 0xCB46, 0x4754, 0xCB47, 0xCB47, 0x2330,
- 0xCB48, 0xCB4A, 0x4755, 0xCB4B, 0xCB4B, 0x2680, 0xCB4C, 0xCB4D, 0x4758,
- 0xCB4E, 0xCB4E, 0x20DA, 0xCB4F, 0xCB56, 0x475A, 0xCB57, 0xCB57, 0x234A,
- 0xCB58, 0xCB5C, 0x4762, 0xCB5D, 0xCB5D, 0x1F91, 0xCB5E, 0xCB5E, 0x4767,
- 0xCB5F, 0xCB5F, 0x2107, 0xCB60, 0xCB69, 0x4768, 0xCB6A, 0xCB6A, 0x233F,
- 0xCB6B, 0xCB7A, 0x4772, 0xCB7B, 0xCB7B, 0x1FF4, 0xCB7C, 0xCB7C, 0x2343,
- 0xCB7D, 0xCB7E, 0x4782, 0xCB80, 0xCB86, 0x4784, 0xCB87, 0xCB87, 0x2212,
- 0xCB88, 0xCB8D, 0x478B, 0xCB8E, 0xCB8E, 0x2207, 0xCB8F, 0xCB91, 0x4791,
- 0xCB92, 0xCB92, 0x2359, 0xCB93, 0xCB9B, 0x4794, 0xCB9C, 0xCB9C, 0x2254,
- 0xCB9D, 0xCB9D, 0x479D, 0xCB9E, 0xCB9E, 0x2332, 0xCB9F, 0xCBA0, 0x479E,
- 0xCBA1, 0xCBFE, 0x0D96, 0xCC40, 0xCC40, 0x1E26, 0xCC41, 0xCC41, 0x2357,
- 0xCC42, 0xCC48, 0x47A0, 0xCC49, 0xCC49, 0x2358, 0xCC4A, 0xCC4A, 0x2042,
- 0xCC4B, 0xCC4B, 0x2153, 0xCC4C, 0xCC4E, 0x47A7, 0xCC4F, 0xCC4F, 0x20BB,
- 0xCC50, 0xCC5B, 0x47AA, 0xCC5C, 0xCC5C, 0x235A, 0xCC5D, 0xCC5F, 0x47B6,
- 0xCC60, 0xCC60, 0x2356, 0xCC61, 0xCC63, 0x47B9, 0xCC64, 0xCC64, 0x2337,
- 0xCC65, 0xCC6C, 0x47BC, 0xCC6D, 0xCC6D, 0x1FF9, 0xCC6E, 0xCC78, 0x47C4,
- 0xCC79, 0xCC79, 0x2353, 0xCC7A, 0xCC7C, 0x47CF, 0xCC7D, 0xCC7D, 0x2061,
- 0xCC7E, 0xCC7E, 0x47D2, 0xCC80, 0xCC8D, 0x47D3, 0xCC8E, 0xCC8E, 0x1E95,
- 0xCC8F, 0xCC93, 0x47E1, 0xCC94, 0xCC94, 0x2049, 0xCC95, 0xCC95, 0x47E6,
- 0xCC96, 0xCC96, 0x1F42, 0xCC97, 0xCC9C, 0x47E7, 0xCC9D, 0xCC9D, 0x1FE8,
- 0xCC9E, 0xCCA0, 0x47ED, 0xCCA1, 0xCCFE, 0x0DF4, 0xCD40, 0xCD7E, 0x47F0,
- 0xCD80, 0xCD8F, 0x482F, 0xCD90, 0xCD90, 0x25DA, 0xCD91, 0xCD97, 0x483F,
- 0xCD98, 0xCD98, 0x25D7, 0xCD99, 0xCDA0, 0x4846, 0xCDA1, 0xCDFE, 0x0E52,
- 0xCE40, 0xCE66, 0x484E, 0xCE67, 0xCE67, 0x212E, 0xCE68, 0xCE71, 0x4875,
- 0xCE72, 0xCE72, 0x21B2, 0xCE73, 0xCE7E, 0x487F, 0xCE80, 0xCE80, 0x488B,
- 0xCE81, 0xCE81, 0x219E, 0xCE82, 0xCE86, 0x488C, 0xCE87, 0xCE87, 0x25DC,
- 0xCE88, 0xCE9A, 0x4891, 0xCE9B, 0xCE9B, 0x206C, 0xCE9C, 0xCE9D, 0x48A4,
- 0xCE9E, 0xCE9E, 0x2226, 0xCE9F, 0xCEA0, 0x48A6, 0xCEA1, 0xCEFE, 0x0EB0,
- 0xCF40, 0xCF4D, 0x48A8, 0xCF4E, 0xCF4E, 0x25E0, 0xCF4F, 0xCF54, 0x48B6,
- 0xCF55, 0xCF55, 0x227B, 0xCF56, 0xCF57, 0x48BC, 0xCF58, 0xCF58, 0x25DE,
- 0xCF59, 0xCF5B, 0x48BE, 0xCF5C, 0xCF5C, 0x25E1, 0xCF5D, 0xCF6B, 0x48C1,
- 0xCF6C, 0xCF6C, 0x25D5, 0xCF6D, 0xCF72, 0x48D0, 0xCF73, 0xCF73, 0x1E6B,
- 0xCF74, 0xCF74, 0x48D6, 0xCF75, 0xCF75, 0x25DB, 0xCF76, 0xCF77, 0x48D7,
- 0xCF78, 0xCF78, 0x1E89, 0xCF79, 0xCF7B, 0x48D9, 0xCF7C, 0xCF7C, 0x25D9,
- 0xCF7D, 0xCF7E, 0x48DC, 0xCF80, 0xCF80, 0x48DE, 0xCF81, 0xCF81, 0x2211,
- 0xCF82, 0xCF88, 0x48DF, 0xCF89, 0xCF89, 0x2229, 0xCF8A, 0xCF8A, 0x25D6,
- 0xCF8B, 0xCF92, 0x48E6, 0xCF93, 0xCF93, 0x25DD, 0xCF94, 0xCF94, 0x25DF,
- 0xCF95, 0xCF9D, 0x48EE, 0xCF9E, 0xCF9E, 0x1FEF, 0xCF9F, 0xCF9F, 0x48F7,
- 0xCFA0, 0xCFA0, 0x25D8, 0xCFA1, 0xCFFE, 0x0F0E, 0xD040, 0xD04C, 0x48F8,
- 0xD04D, 0xD04D, 0x1F29, 0xD04E, 0xD050, 0x4905, 0xD051, 0xD051, 0x1E5B,
- 0xD052, 0xD054, 0x4908, 0xD055, 0xD055, 0x2076, 0xD056, 0xD05B, 0x490B,
- 0xD05C, 0xD05C, 0x2297, 0xD05D, 0xD05F, 0x4911, 0xD060, 0xD060, 0x2690,
- 0xD061, 0xD066, 0x4914, 0xD067, 0xD067, 0x213F, 0xD068, 0xD06B, 0x491A,
- 0xD06C, 0xD06C, 0x2198, 0xD06D, 0xD06D, 0x491E, 0xD06E, 0xD06E, 0x1E88,
- 0xD06F, 0xD07C, 0x491F, 0xD07D, 0xD07D, 0x228C, 0xD07E, 0xD07E, 0x492D,
- 0xD080, 0xD0A0, 0x492E, 0xD0A1, 0xD0FE, 0x0F6C, 0xD140, 0xD154, 0x494F,
- 0xD155, 0xD155, 0x25F1, 0xD156, 0xD158, 0x4964, 0xD159, 0xD159, 0x200C,
- 0xD15A, 0xD160, 0x4967, 0xD161, 0xD161, 0x1E58, 0xD162, 0xD162, 0x22AC,
- 0xD163, 0xD174, 0x496E, 0xD175, 0xD175, 0x26A7, 0xD176, 0xD17C, 0x4980,
- 0xD17D, 0xD17D, 0x2676, 0xD17E, 0xD17E, 0x4987, 0xD180, 0xD19C, 0x4988,
- 0xD19D, 0xD19D, 0x1FE1, 0xD19E, 0xD19E, 0x25BB, 0xD19F, 0xD1A0, 0x49A5,
- 0xD1A1, 0xD1FE, 0x0FCA, 0xD240, 0xD240, 0x25BE, 0xD241, 0xD242, 0x49A7,
- 0xD243, 0xD243, 0x22DD, 0xD244, 0xD24C, 0x49A9, 0xD24D, 0xD24D, 0x25BD,
- 0xD24E, 0xD25B, 0x49B2, 0xD25C, 0xD25C, 0x1E2A, 0xD25D, 0xD262, 0x49C0,
- 0xD263, 0xD263, 0x25BC, 0xD264, 0xD264, 0x25BA, 0xD265, 0xD267, 0x49C6,
- 0xD268, 0xD268, 0x25BF, 0xD269, 0xD26C, 0x49C9, 0xD26D, 0xD26D, 0x2187,
- 0xD26E, 0xD26E, 0x49CD, 0xD26F, 0xD26F, 0x266B, 0xD270, 0xD271, 0x49CE,
- 0xD272, 0xD272, 0x1E7F, 0xD273, 0xD274, 0x49D0, 0xD275, 0xD275, 0x21AD,
- 0xD276, 0xD27E, 0x49D2, 0xD280, 0xD289, 0x49DB, 0xD28A, 0xD28A, 0x1F96,
- 0xD28B, 0xD28D, 0x49E5, 0xD28E, 0xD28E, 0x1F32, 0xD28F, 0xD291, 0x49E8,
- 0xD292, 0xD292, 0x2084, 0xD293, 0xD294, 0x49EB, 0xD295, 0xD295, 0x2136,
- 0xD296, 0xD296, 0x49ED, 0xD297, 0xD297, 0x24B8, 0xD298, 0xD29F, 0x49EE,
- 0xD2A0, 0xD2A0, 0x24BA, 0xD2A1, 0xD2FE, 0x1028, 0xD340, 0xD343, 0x49F6,
- 0xD344, 0xD344, 0x24BC, 0xD345, 0xD347, 0x49FA, 0xD348, 0xD348, 0x20E4,
- 0xD349, 0xD349, 0x49FD, 0xD34A, 0xD34A, 0x24B9, 0xD34B, 0xD34C, 0x49FE,
- 0xD34D, 0xD34D, 0x24BD, 0xD34E, 0xD34F, 0x4A00, 0xD350, 0xD350, 0x24BE,
- 0xD351, 0xD354, 0x4A02, 0xD355, 0xD355, 0x24BF, 0xD356, 0xD357, 0x4A06,
- 0xD358, 0xD358, 0x1FD2, 0xD359, 0xD35A, 0x4A08, 0xD35B, 0xD35B, 0x1FFD,
- 0xD35C, 0xD35C, 0x4A0A, 0xD35D, 0xD35D, 0x24BB, 0xD35E, 0xD35E, 0x1F2D,
- 0xD35F, 0xD377, 0x4A0B, 0xD378, 0xD378, 0x2609, 0xD379, 0xD379, 0x4A24,
- 0xD37A, 0xD37A, 0x260A, 0xD37B, 0xD37B, 0x4A25, 0xD37C, 0xD37C, 0x1E94,
- 0xD37D, 0xD37E, 0x4A26, 0xD380, 0xD384, 0x4A28, 0xD385, 0xD385, 0x22DF,
- 0xD386, 0xD386, 0x1ECB, 0xD387, 0xD387, 0x1F0D, 0xD388, 0xD38A, 0x4A2D,
- 0xD38B, 0xD38B, 0x1F77, 0xD38C, 0xD38C, 0x4A30, 0xD38D, 0xD38D, 0x21EB,
- 0xD38E, 0xD38E, 0x4A31, 0xD38F, 0xD38F, 0x22E1, 0xD390, 0xD390, 0x4A32,
- 0xD391, 0xD391, 0x216F, 0xD392, 0xD392, 0x4A33, 0xD393, 0xD393, 0x22E0,
- 0xD394, 0xD395, 0x4A34, 0xD396, 0xD396, 0x21EA, 0xD397, 0xD397, 0x4A36,
- 0xD398, 0xD398, 0x22E2, 0xD399, 0xD399, 0x20CB, 0xD39A, 0xD39A, 0x4A37,
- 0xD39B, 0xD39B, 0x1F78, 0xD39C, 0xD39D, 0x4A38, 0xD39E, 0xD39E, 0x1EE2,
- 0xD39F, 0xD39F, 0x4A3A, 0xD3A0, 0xD3A0, 0x21F2, 0xD3A1, 0xD3FE, 0x1086,
- 0xD440, 0xD440, 0x4A3B, 0xD441, 0xD441, 0x2150, 0xD442, 0xD444, 0x4A3C,
- 0xD445, 0xD445, 0x1FD3, 0xD446, 0xD446, 0x4A3F, 0xD447, 0xD447, 0x22E5,
- 0xD448, 0xD44B, 0x4A40, 0xD44C, 0xD44C, 0x1EF2, 0xD44D, 0xD44E, 0x4A44,
- 0xD44F, 0xD44F, 0x211F, 0xD450, 0xD452, 0x4A46, 0xD453, 0xD453, 0x21DD,
- 0xD454, 0xD455, 0x4A49, 0xD456, 0xD456, 0x2154, 0xD457, 0xD457, 0x4A4B,
- 0xD458, 0xD458, 0x22E7, 0xD459, 0xD45B, 0x4A4C, 0xD45C, 0xD45C, 0x2282,
- 0xD45D, 0xD461, 0x4A4F, 0xD462, 0xD462, 0x22E6, 0xD463, 0xD466, 0x4A54,
- 0xD467, 0xD467, 0x22E8, 0xD468, 0xD46D, 0x4A58, 0xD46E, 0xD46E, 0x22E4,
- 0xD46F, 0xD46F, 0x4A5E, 0xD470, 0xD470, 0x226A, 0xD471, 0xD471, 0x4A5F,
- 0xD472, 0xD472, 0x22EB, 0xD473, 0xD473, 0x4A60, 0xD474, 0xD474, 0x22E9,
- 0xD475, 0xD475, 0x20BD, 0xD476, 0xD477, 0x4A61, 0xD478, 0xD478, 0x22EA,
- 0xD479, 0xD47A, 0x4A63, 0xD47B, 0xD47B, 0x22BD, 0xD47C, 0xD47D, 0x4A65,
- 0xD47E, 0xD47E, 0x1E9E, 0xD480, 0xD481, 0x4A67, 0xD482, 0xD482, 0x22F6,
- 0xD483, 0xD483, 0x21E7, 0xD484, 0xD484, 0x2216, 0xD485, 0xD486, 0x4A69,
- 0xD487, 0xD487, 0x2137, 0xD488, 0xD489, 0x4A6B, 0xD48A, 0xD48A, 0x212C,
- 0xD48B, 0xD48B, 0x4A6D, 0xD48C, 0xD48C, 0x1E68, 0xD48D, 0xD48D, 0x22F2,
- 0xD48E, 0xD48E, 0x1F37, 0xD48F, 0xD48F, 0x22F3, 0xD490, 0xD490, 0x4A6E,
- 0xD491, 0xD491, 0x22EF, 0xD492, 0xD492, 0x1F50, 0xD493, 0xD493, 0x1F10,
- 0xD494, 0xD494, 0x21C8, 0xD495, 0xD495, 0x4A6F, 0xD496, 0xD496, 0x22F1,
- 0xD497, 0xD49B, 0x4A70, 0xD49C, 0xD49C, 0x22F0, 0xD49D, 0xD49E, 0x4A75,
- 0xD49F, 0xD49F, 0x22EE, 0xD4A0, 0xD4A0, 0x4A77, 0xD4A1, 0xD4FE, 0x10E4,
- 0xD540, 0xD542, 0x4A78, 0xD543, 0xD543, 0x22ED, 0xD544, 0xD544, 0x229E,
- 0xD545, 0xD545, 0x22EC, 0xD546, 0xD546, 0x1FE2, 0xD547, 0xD549, 0x4A7B,
- 0xD54A, 0xD54A, 0x20FE, 0xD54B, 0xD54D, 0x4A7E, 0xD54E, 0xD54F, 0x22F9,
- 0xD550, 0xD550, 0x4A81, 0xD551, 0xD551, 0x1EAF, 0xD552, 0xD553, 0x4A82,
- 0xD554, 0xD554, 0x2236, 0xD555, 0xD555, 0x4A84, 0xD556, 0xD556, 0x22F7,
- 0xD557, 0xD559, 0x4A85, 0xD55A, 0xD55A, 0x223D, 0xD55B, 0xD55B, 0x4A88,
- 0xD55C, 0xD55C, 0x1E82, 0xD55D, 0xD55D, 0x1FB6, 0xD55E, 0xD55E, 0x4A89,
- 0xD55F, 0xD55F, 0x21A4, 0xD560, 0xD560, 0x21AA, 0xD561, 0xD561, 0x22F8,
- 0xD562, 0xD562, 0x2151, 0xD563, 0xD563, 0x4A8A, 0xD564, 0xD564, 0x1F60,
- 0xD565, 0xD567, 0x4A8B, 0xD568, 0xD568, 0x2147, 0xD569, 0xD56B, 0x4A8E,
- 0xD56C, 0xD56C, 0x2145, 0xD56D, 0xD56D, 0x4A91, 0xD56E, 0xD56E, 0x1FDC,
- 0xD56F, 0xD571, 0x4A92, 0xD572, 0xD572, 0x2301, 0xD573, 0xD574, 0x4A95,
- 0xD575, 0xD575, 0x1EF5, 0xD576, 0xD577, 0x4A97, 0xD578, 0xD578, 0x2218,
- 0xD579, 0xD57A, 0x4A99, 0xD57B, 0xD57B, 0x1EC6, 0xD57C, 0xD57D, 0x4A9B,
- 0xD57E, 0xD57E, 0x2300, 0xD580, 0xD580, 0x4A9D, 0xD581, 0xD581, 0x22B4,
- 0xD582, 0xD583, 0x4A9E, 0xD584, 0xD584, 0x2169, 0xD585, 0xD585, 0x4AA0,
- 0xD586, 0xD586, 0x22FD, 0xD587, 0xD587, 0x4AA1, 0xD588, 0xD588, 0x20EA,
- 0xD589, 0xD589, 0x4AA2, 0xD58A, 0xD58A, 0x22F4, 0xD58B, 0xD58B, 0x4AA3,
- 0xD58C, 0xD58C, 0x22FB, 0xD58D, 0xD58D, 0x4AA4, 0xD58E, 0xD58E, 0x22FC,
- 0xD58F, 0xD58F, 0x2027, 0xD590, 0xD592, 0x4AA5, 0xD593, 0xD593, 0x2060,
- 0xD594, 0xD594, 0x22FF, 0xD595, 0xD597, 0x4AA8, 0xD598, 0xD598, 0x22FE,
- 0xD599, 0xD599, 0x1EC7, 0xD59A, 0xD59A, 0x4AAB, 0xD59B, 0xD59B, 0x230C,
- 0xD59C, 0xD59E, 0x4AAC, 0xD59F, 0xD59F, 0x22F5, 0xD5A0, 0xD5A0, 0x4AAF,
- 0xD5A1, 0xD5FE, 0x1142, 0xD640, 0xD640, 0x2306, 0xD641, 0xD641, 0x4AB0,
- 0xD642, 0xD642, 0x230A, 0xD643, 0xD643, 0x21D3, 0xD644, 0xD646, 0x4AB1,
- 0xD647, 0xD647, 0x2303, 0xD648, 0xD648, 0x4AB4, 0xD649, 0xD649, 0x2307,
- 0xD64A, 0xD64A, 0x230B, 0xD64B, 0xD64C, 0x4AB5, 0xD64D, 0xD64D, 0x1F5F,
- 0xD64E, 0xD64E, 0x4AB7, 0xD64F, 0xD64F, 0x2309, 0xD650, 0xD651, 0x4AB8,
- 0xD652, 0xD652, 0x2302, 0xD653, 0xD653, 0x1F04, 0xD654, 0xD654, 0x229D,
- 0xD655, 0xD655, 0x4ABA, 0xD656, 0xD656, 0x21FB, 0xD657, 0xD657, 0x4ABB,
- 0xD658, 0xD658, 0x2308, 0xD659, 0xD659, 0x4ABC, 0xD65A, 0xD65A, 0x20AC,
- 0xD65B, 0xD65B, 0x4ABD, 0xD65C, 0xD65C, 0x208E, 0xD65D, 0xD65D, 0x2305,
- 0xD65E, 0xD65E, 0x2197, 0xD65F, 0xD65F, 0x4ABE, 0xD660, 0xD660, 0x2171,
- 0xD661, 0xD661, 0x2298, 0xD662, 0xD664, 0x4ABF, 0xD665, 0xD665, 0x1F57,
- 0xD666, 0xD668, 0x4AC2, 0xD669, 0xD669, 0x2082, 0xD66A, 0xD66A, 0x4AC5,
- 0xD66B, 0xD66B, 0x2311, 0xD66C, 0xD66E, 0x4AC6, 0xD66F, 0xD66F, 0x2304,
- 0xD670, 0xD670, 0x4AC9, 0xD671, 0xD671, 0x230F, 0xD672, 0xD672, 0x1E35,
- 0xD673, 0xD673, 0x4ACA, 0xD674, 0xD674, 0x20D1, 0xD675, 0xD675, 0x2310,
- 0xD676, 0xD676, 0x1FA3, 0xD677, 0xD677, 0x4ACB, 0xD678, 0xD678, 0x21D6,
- 0xD679, 0xD67B, 0x4ACC, 0xD67C, 0xD67C, 0x2206, 0xD67D, 0xD67E, 0x4ACF,
- 0xD680, 0xD682, 0x4AD1, 0xD683, 0xD683, 0x230D, 0xD684, 0xD685, 0x4AD4,
- 0xD686, 0xD686, 0x2312, 0xD687, 0xD687, 0x208D, 0xD688, 0xD688, 0x2313,
- 0xD689, 0xD68D, 0x4AD6, 0xD68E, 0xD68E, 0x22E3, 0xD68F, 0xD693, 0x4ADB,
- 0xD694, 0xD694, 0x1FBA, 0xD695, 0xD698, 0x4AE0, 0xD699, 0xD699, 0x2078,
- 0xD69A, 0xD6A0, 0x4AE4, 0xD6A1, 0xD6FE, 0x11A0, 0xD740, 0xD742, 0x4AEB,
- 0xD743, 0xD743, 0x2288, 0xD744, 0xD747, 0x4AEE, 0xD748, 0xD748, 0x2316,
- 0xD749, 0xD749, 0x1F6B, 0xD74A, 0xD74F, 0x4AF2, 0xD750, 0xD750, 0x2314,
- 0xD751, 0xD751, 0x4AF8, 0xD752, 0xD752, 0x2130, 0xD753, 0xD753, 0x2315,
- 0xD754, 0xD754, 0x2168, 0xD755, 0xD755, 0x4AF9, 0xD756, 0xD756, 0x20C4,
- 0xD757, 0xD763, 0x4AFA, 0xD764, 0xD764, 0x2318, 0xD765, 0xD766, 0x4B07,
- 0xD767, 0xD767, 0x2219, 0xD768, 0xD768, 0x2217, 0xD769, 0xD76B, 0x4B09,
- 0xD76C, 0xD76C, 0x20D5, 0xD76D, 0xD76E, 0x4B0C, 0xD76F, 0xD76F, 0x1F4A,
- 0xD770, 0xD774, 0x4B0E, 0xD775, 0xD775, 0x2240, 0xD776, 0xD777, 0x4B13,
- 0xD778, 0xD778, 0x1ED3, 0xD779, 0xD77E, 0x4B15, 0xD780, 0xD782, 0x4B1B,
- 0xD783, 0xD783, 0x1E49, 0xD784, 0xD786, 0x4B1E, 0xD787, 0xD787, 0x261B,
- 0xD788, 0xD78A, 0x4B21, 0xD78B, 0xD78B, 0x1E6D, 0xD78C, 0xD78C, 0x20F8,
- 0xD78D, 0xD78D, 0x4B24, 0xD78E, 0xD78E, 0x1FFB, 0xD78F, 0xD78F, 0x2319,
- 0xD790, 0xD794, 0x4B25, 0xD795, 0xD795, 0x230E, 0xD796, 0xD796, 0x4B2A,
- 0xD797, 0xD797, 0x2317, 0xD798, 0xD7A0, 0x4B2B, 0xD7A1, 0xD7F9, 0x11FE,
- 0xD840, 0xD84C, 0x4B34, 0xD84D, 0xD84D, 0x20C8, 0xD84E, 0xD852, 0x4B41,
- 0xD853, 0xD853, 0x1EFD, 0xD854, 0xD87E, 0x4B46, 0xD880, 0xD88F, 0x4B71,
- 0xD890, 0xD890, 0x1E3B, 0xD891, 0xD891, 0x227F, 0xD892, 0xD892, 0x4B81,
- 0xD893, 0xD893, 0x1F0C, 0xD894, 0xD894, 0x1E59, 0xD895, 0xD895, 0x1F24,
- 0xD896, 0xD899, 0x4B82, 0xD89A, 0xD89A, 0x20BA, 0xD89B, 0xD89B, 0x1F65,
- 0xD89C, 0xD89C, 0x1EF0, 0xD89D, 0xD89D, 0x2164, 0xD89E, 0xD89E, 0x1F30,
- 0xD89F, 0xD89F, 0x2261, 0xD8A0, 0xD8A0, 0x4B86, 0xD8A1, 0xD8FE, 0x1257,
- 0xD940, 0xD940, 0x4B87, 0xD941, 0xD941, 0x22A2, 0xD942, 0xD942, 0x24AB,
- 0xD943, 0xD943, 0x4B88, 0xD944, 0xD944, 0x24AF, 0xD945, 0xD945, 0x1EE8,
- 0xD946, 0xD946, 0x1F39, 0xD947, 0xD947, 0x4B89, 0xD948, 0xD948, 0x1E48,
- 0xD949, 0xD949, 0x2070, 0xD94A, 0xD94A, 0x1EA8, 0xD94B, 0xD94B, 0x4B8A,
- 0xD94C, 0xD94C, 0x24AC, 0xD94D, 0xD94D, 0x1EF7, 0xD94E, 0xD94E, 0x2176,
- 0xD94F, 0xD94F, 0x24AD, 0xD950, 0xD950, 0x4B8B, 0xD951, 0xD951, 0x207B,
- 0xD952, 0xD952, 0x1F45, 0xD953, 0xD953, 0x24AA, 0xD954, 0xD954, 0x204B,
- 0xD955, 0xD955, 0x202F, 0xD956, 0xD956, 0x1F5A, 0xD957, 0xD957, 0x24B0,
- 0xD958, 0xD958, 0x4B8C, 0xD959, 0xD959, 0x22B7, 0xD95A, 0xD95A, 0x1F7F,
- 0xD95B, 0xD95B, 0x4B8D, 0xD95C, 0xD95C, 0x2265, 0xD95D, 0xD962, 0x4B8E,
- 0xD963, 0xD963, 0x24B2, 0xD964, 0xD964, 0x211B, 0xD965, 0xD965, 0x1E51,
- 0xD966, 0xD966, 0x4B94, 0xD967, 0xD967, 0x24B4, 0xD968, 0xD96B, 0x4B95,
- 0xD96C, 0xD96C, 0x24B3, 0xD96D, 0xD96D, 0x4B99, 0xD96E, 0xD96E, 0x1E9F,
- 0xD96F, 0xD96F, 0x4B9A, 0xD970, 0xD970, 0x2118, 0xD971, 0xD971, 0x4B9B,
- 0xD972, 0xD972, 0x20B4, 0xD973, 0xD973, 0x23AF, 0xD974, 0xD974, 0x21BB,
- 0xD975, 0xD975, 0x2072, 0xD976, 0xD976, 0x1F95, 0xD977, 0xD977, 0x4B9C,
- 0xD978, 0xD978, 0x1F0A, 0xD979, 0xD979, 0x24B6, 0xD97A, 0xD97B, 0x4B9D,
- 0xD97C, 0xD97C, 0x2291, 0xD97D, 0xD97D, 0x24B5, 0xD97E, 0xD97E, 0x2278,
- 0xD980, 0xD980, 0x1ED4, 0xD981, 0xD986, 0x4B9F, 0xD987, 0xD987, 0x1FF3,
- 0xD988, 0xD98C, 0x4BA5, 0xD98D, 0xD98D, 0x22A9, 0xD98E, 0xD98E, 0x24B7,
- 0xD98F, 0xD98F, 0x1F28, 0xD990, 0xD990, 0x2109, 0xD991, 0xD991, 0x22C7,
- 0xD992, 0xD996, 0x4BAA, 0xD997, 0xD997, 0x24AE, 0xD998, 0xD998, 0x22B1,
- 0xD999, 0xD99A, 0x4BAF, 0xD99B, 0xD99B, 0x2266, 0xD99C, 0xD99C, 0x4BB1,
- 0xD99D, 0xD99D, 0x225B, 0xD99E, 0xD99E, 0x22C4, 0xD99F, 0xD99F, 0x4BB2,
- 0xD9A0, 0xD9A0, 0x2115, 0xD9A1, 0xD9FE, 0x12B5, 0xDA40, 0xDA40, 0x4BB3,
- 0xDA41, 0xDA41, 0x222A, 0xDA42, 0xDA42, 0x24B1, 0xDA43, 0xDA47, 0x4BB4,
- 0xDA48, 0xDA48, 0x213D, 0xDA49, 0xDA4C, 0x4BB9, 0xDA4D, 0xDA4D, 0x1F15,
- 0xDA4E, 0xDA4E, 0x225C, 0xDA4F, 0xDA72, 0x4BBD, 0xDA73, 0xDA73, 0x1F14,
- 0xDA74, 0xDA76, 0x4BE1, 0xDA77, 0xDA77, 0x227A, 0xDA78, 0xDA7E, 0x4BE4,
- 0xDA80, 0xDA84, 0x4BEB, 0xDA85, 0xDA85, 0x20EE, 0xDA86, 0xDA8D, 0x4BF0,
- 0xDA8E, 0xDA8E, 0x25F8, 0xDA8F, 0xDAA0, 0x4BF8, 0xDAA1, 0xDAFE, 0x1313,
- 0xDB40, 0xDB5F, 0x4C0A, 0xDB60, 0xDB60, 0x1F94, 0xDB61, 0xDB77, 0x4C2A,
- 0xDB78, 0xDB78, 0x2230, 0xDB79, 0xDB7E, 0x4C41, 0xDB80, 0xDB83, 0x4C47,
- 0xDB84, 0xDB84, 0x25FD, 0xDB85, 0xDB8A, 0x4C4B, 0xDB8B, 0xDB8B, 0x2600,
- 0xDB8C, 0xDB97, 0x4C51, 0xDB98, 0xDB98, 0x2606, 0xDB99, 0xDBA0, 0x4C5D,
- 0xDBA1, 0xDBFE, 0x1371, 0xDC40, 0xDC44, 0x4C65, 0xDC45, 0xDC45, 0x25FF,
- 0xDC46, 0xDC4E, 0x4C6A, 0xDC4F, 0xDC4F, 0x25FC, 0xDC50, 0xDC50, 0x1E8C,
- 0xDC51, 0xDC51, 0x2602, 0xDC52, 0xDC52, 0x4C73, 0xDC53, 0xDC53, 0x224D,
- 0xDC54, 0xDC54, 0x4C74, 0xDC55, 0xDC55, 0x2604, 0xDC56, 0xDC56, 0x25FE,
- 0xDC57, 0xDC57, 0x2603, 0xDC58, 0xDC5C, 0x4C75, 0xDC5D, 0xDC5D, 0x2601,
- 0xDC5E, 0xDC61, 0x4C7A, 0xDC62, 0xDC62, 0x2605, 0xDC63, 0xDC65, 0x4C7E,
- 0xDC66, 0xDC66, 0x1EA3, 0xDC67, 0xDC67, 0x2608, 0xDC68, 0xDC6A, 0x4C81,
- 0xDC6B, 0xDC6B, 0x2607, 0xDC6C, 0xDC7B, 0x4C84, 0xDC7C, 0xDC7C, 0x20F0,
- 0xDC7D, 0xDC7E, 0x4C94, 0xDC80, 0xDC86, 0x4C96, 0xDC87, 0xDC87, 0x1E7B,
- 0xDC88, 0xDC88, 0x2267, 0xDC89, 0xDC89, 0x1F36, 0xDC8A, 0xDC8A, 0x1FD6,
- 0xDC8B, 0xDC8D, 0x4C9D, 0xDC8E, 0xDC8E, 0x21E0, 0xDC8F, 0xDC8F, 0x4CA0,
- 0xDC90, 0xDC90, 0x248C, 0xDC91, 0xDC96, 0x4CA1, 0xDC97, 0xDC97, 0x248D,
- 0xDC98, 0xDC9A, 0x4CA7, 0xDC9B, 0xDC9B, 0x2102, 0xDC9C, 0xDC9F, 0x4CAA,
- 0xDCA0, 0xDCA0, 0x2494, 0xDCA1, 0xDCFE, 0x13CF, 0xDD40, 0xDD45, 0x4CAE,
- 0xDD46, 0xDD46, 0x2493, 0xDD47, 0xDD4C, 0x4CB4, 0xDD4D, 0xDD4D, 0x248E,
- 0xDD4E, 0xDD52, 0x4CBA, 0xDD53, 0xDD53, 0x2299, 0xDD54, 0xDD54, 0x2491,
- 0xDD55, 0xDD55, 0x2496, 0xDD56, 0xDD56, 0x248F, 0xDD57, 0xDD57, 0x2492,
- 0xDD58, 0xDD58, 0x4CBF, 0xDD59, 0xDD59, 0x2497, 0xDD5A, 0xDD5D, 0x4CC0,
- 0xDD5E, 0xDD5E, 0x1FB1, 0xDD5F, 0xDD5F, 0x4CC4, 0xDD60, 0xDD60, 0x249A,
- 0xDD61, 0xDD61, 0x4CC5, 0xDD62, 0xDD62, 0x2499, 0xDD63, 0xDD63, 0x4CC6,
- 0xDD64, 0xDD64, 0x2258, 0xDD65, 0xDD65, 0x2498, 0xDD66, 0xDD6C, 0x4CC7,
- 0xDD6D, 0xDD6D, 0x249B, 0xDD6E, 0xDD6E, 0x4CCE, 0xDD6F, 0xDD6F, 0x1F09,
- 0xDD70, 0xDD70, 0x20E6, 0xDD71, 0xDD75, 0x4CCF, 0xDD76, 0xDD76, 0x2026,
- 0xDD77, 0xDD77, 0x249F, 0xDD78, 0xDD78, 0x1F59, 0xDD79, 0xDD7A, 0x249D,
- 0xDD7B, 0xDD7E, 0x4CD4, 0xDD80, 0xDD80, 0x4CD8, 0xDD81, 0xDD81, 0x1F3B,
- 0xDD82, 0xDD82, 0x249C, 0xDD83, 0xDD84, 0x4CD9, 0xDD85, 0xDD85, 0x1E3A,
- 0xDD86, 0xDD86, 0x205B, 0xDD87, 0xDD8A, 0x4CDB, 0xDD8B, 0xDD8B, 0x1F70,
- 0xDD8C, 0xDD8E, 0x4CDF, 0xDD8F, 0xDD8F, 0x24A0, 0xDD90, 0xDD93, 0x4CE2,
- 0xDD94, 0xDD94, 0x213B, 0xDD95, 0xDD96, 0x4CE6, 0xDD97, 0xDD97, 0x1F07,
- 0xDD98, 0xDD99, 0x4CE8, 0xDD9A, 0xDD9A, 0x2270, 0xDD9B, 0xDD9B, 0x2237,
- 0xDD9C, 0xDD9D, 0x4CEA, 0xDD9E, 0xDD9E, 0x24D2, 0xDD9F, 0xDD9F, 0x4CEC,
- 0xDDA0, 0xDDA0, 0x21B3, 0xDDA1, 0xDDFE, 0x142D, 0xDE40, 0xDE40, 0x2245,
- 0xDE41, 0xDE41, 0x24A1, 0xDE42, 0xDE43, 0x4CED, 0xDE44, 0xDE44, 0x22A8,
- 0xDE45, 0xDE47, 0x4CEF, 0xDE48, 0xDE48, 0x227C, 0xDE49, 0xDE49, 0x1FB0,
- 0xDE4A, 0xDE4E, 0x4CF2, 0xDE4F, 0xDE4F, 0x24A2, 0xDE50, 0xDE59, 0x4CF7,
- 0xDE5A, 0xDE5A, 0x1F46, 0xDE5B, 0xDE5B, 0x4D01, 0xDE5C, 0xDE5C, 0x2380,
- 0xDE5D, 0xDE5D, 0x2495, 0xDE5E, 0xDE5E, 0x4D02, 0xDE5F, 0xDE5F, 0x2490,
- 0xDE60, 0xDE6A, 0x4D03, 0xDE6B, 0xDE6B, 0x1E30, 0xDE6C, 0xDE6E, 0x4D0E,
- 0xDE6F, 0xDE6F, 0x1E9D, 0xDE70, 0xDE70, 0x1E4B, 0xDE71, 0xDE71, 0x1E4A,
- 0xDE72, 0xDE72, 0x20AA, 0xDE73, 0xDE7E, 0x4D11, 0xDE80, 0xDE91, 0x4D1D,
- 0xDE92, 0xDE92, 0x267B, 0xDE93, 0xDE9E, 0x4D2F, 0xDE9F, 0xDE9F, 0x23F2,
- 0xDEA0, 0xDEA0, 0x4D3B, 0xDEA1, 0xDEFE, 0x148B, 0xDF40, 0xDF40, 0x227E,
- 0xDF41, 0xDF41, 0x4D3C, 0xDF42, 0xDF42, 0x2019, 0xDF43, 0xDF4C, 0x4D3D,
- 0xDF4D, 0xDF4D, 0x1FBB, 0xDF4E, 0xDF5B, 0x4D47, 0xDF5C, 0xDF5C, 0x2253,
- 0xDF5D, 0xDF5D, 0x4D55, 0xDF5E, 0xDF5E, 0x1F3E, 0xDF5F, 0xDF5F, 0x1EA6,
- 0xDF60, 0xDF60, 0x218E, 0xDF61, 0xDF63, 0x4D56, 0xDF64, 0xDF64, 0x21EC,
- 0xDF65, 0xDF65, 0x4D59, 0xDF66, 0xDF66, 0x1EBE, 0xDF67, 0xDF67, 0x4D5A,
- 0xDF68, 0xDF68, 0x224A, 0xDF69, 0xDF6C, 0x4D5B, 0xDF6D, 0xDF6D, 0x2133,
- 0xDF6E, 0xDF73, 0x4D5F, 0xDF74, 0xDF74, 0x1E84, 0xDF75, 0xDF76, 0x4D65,
- 0xDF77, 0xDF77, 0x20CF, 0xDF78, 0xDF78, 0x21E2, 0xDF79, 0xDF79, 0x4D67,
- 0xDF7A, 0xDF7A, 0x220F, 0xDF7B, 0xDF7B, 0x4D68, 0xDF7C, 0xDF7C, 0x2029,
- 0xDF7D, 0xDF7D, 0x4D69, 0xDF7E, 0xDF7E, 0x2073, 0xDF80, 0xDF80, 0x1F55,
- 0xDF81, 0xDF82, 0x4D6A, 0xDF83, 0xDF83, 0x23F1, 0xDF84, 0xDF84, 0x4D6C,
- 0xDF85, 0xDF85, 0x1E46, 0xDF86, 0xDF88, 0x4D6D, 0xDF89, 0xDF89, 0x2063,
- 0xDF8A, 0xDF8A, 0x23F3, 0xDF8B, 0xDFA0, 0x4D70, 0xDFA1, 0xDFFE, 0x14E9,
- 0xE040, 0xE04F, 0x4D86, 0xE050, 0xE050, 0x231E, 0xE051, 0xE05C, 0x4D96,
- 0xE05D, 0xE05D, 0x2233, 0xE05E, 0xE068, 0x4DA2, 0xE069, 0xE069, 0x2320,
- 0xE06A, 0xE06B, 0x4DAD, 0xE06C, 0xE06C, 0x21C7, 0xE06D, 0xE074, 0x4DAF,
- 0xE075, 0xE075, 0x22BC, 0xE076, 0xE076, 0x4DB7, 0xE077, 0xE077, 0x231C,
- 0xE078, 0xE078, 0x4DB8, 0xE079, 0xE079, 0x2251, 0xE07A, 0xE07E, 0x4DB9,
- 0xE080, 0xE086, 0x4DBE, 0xE087, 0xE087, 0x1EBB, 0xE088, 0xE08C, 0x4DC5,
- 0xE08D, 0xE08D, 0x2287, 0xE08E, 0xE08E, 0x4DCA, 0xE08F, 0xE08F, 0x202D,
- 0xE090, 0xE090, 0x1EAB, 0xE091, 0xE091, 0x4DCB, 0xE092, 0xE092, 0x231D,
- 0xE093, 0xE093, 0x4DCC, 0xE094, 0xE094, 0x231F, 0xE095, 0xE096, 0x4DCD,
- 0xE097, 0xE097, 0x231B, 0xE098, 0xE0A0, 0x4DCF, 0xE0A1, 0xE0FE, 0x1547,
- 0xE140, 0xE141, 0x4DD8, 0xE142, 0xE142, 0x2321, 0xE143, 0xE163, 0x4DDA,
- 0xE164, 0xE164, 0x2255, 0xE165, 0xE167, 0x4DFB, 0xE168, 0xE168, 0x1E8F,
- 0xE169, 0xE173, 0x4DFE, 0xE174, 0xE174, 0x220C, 0xE175, 0xE175, 0x1FA4,
- 0xE176, 0xE17E, 0x4E09, 0xE180, 0xE183, 0x4E12, 0xE184, 0xE184, 0x209B,
- 0xE185, 0xE185, 0x21D8, 0xE186, 0xE186, 0x4E16, 0xE187, 0xE187, 0x25FA,
- 0xE188, 0xE188, 0x4E17, 0xE189, 0xE189, 0x25F9, 0xE18A, 0xE18B, 0x4E18,
- 0xE18C, 0xE18C, 0x2134, 0xE18D, 0xE18D, 0x4E1A, 0xE18E, 0xE190, 0x24F3,
- 0xE191, 0xE191, 0x24F8, 0xE192, 0xE192, 0x4E1B, 0xE193, 0xE193, 0x24F7,
- 0xE194, 0xE194, 0x1EC8, 0xE195, 0xE195, 0x24F6, 0xE196, 0xE197, 0x4E1C,
- 0xE198, 0xE198, 0x2280, 0xE199, 0xE19D, 0x4E1E, 0xE19E, 0xE19E, 0x1EC5,
- 0xE19F, 0xE19F, 0x24FB, 0xE1A0, 0xE1A0, 0x4E23, 0xE1A1, 0xE1FE, 0x15A5,
- 0xE240, 0xE240, 0x4E24, 0xE241, 0xE241, 0x24FA, 0xE242, 0xE242, 0x4E25,
- 0xE243, 0xE243, 0x1EED, 0xE244, 0xE24E, 0x4E26, 0xE24F, 0xE24F, 0x24FD,
- 0xE250, 0xE250, 0x4E31, 0xE251, 0xE251, 0x24F9, 0xE252, 0xE252, 0x4E32,
- 0xE253, 0xE253, 0x24FE, 0xE254, 0xE254, 0x20CD, 0xE255, 0xE259, 0x4E33,
- 0xE25A, 0xE25A, 0x2508, 0xE25B, 0xE25B, 0x2504, 0xE25C, 0xE25D, 0x4E38,
- 0xE25E, 0xE25E, 0x2506, 0xE25F, 0xE261, 0x4E3A, 0xE262, 0xE262, 0x24FF,
- 0xE263, 0xE263, 0x2090, 0xE264, 0xE266, 0x4E3D, 0xE267, 0xE267, 0x1EDD,
- 0xE268, 0xE268, 0x1F25, 0xE269, 0xE269, 0x4E40, 0xE26A, 0xE26A, 0x2503,
- 0xE26B, 0xE26B, 0x2502, 0xE26C, 0xE26D, 0x4E41, 0xE26E, 0xE26E, 0x1E7A,
- 0xE26F, 0xE26F, 0x20A6, 0xE270, 0xE277, 0x4E43, 0xE278, 0xE278, 0x1FD5,
- 0xE279, 0xE27C, 0x4E4B, 0xE27D, 0xE27D, 0x1F11, 0xE27E, 0xE27E, 0x4E4F,
- 0xE280, 0xE280, 0x2507, 0xE281, 0xE281, 0x2500, 0xE282, 0xE282, 0x2505,
- 0xE283, 0xE288, 0x4E50, 0xE289, 0xE289, 0x2519, 0xE28A, 0xE28A, 0x4E56,
- 0xE28B, 0xE28B, 0x2515, 0xE28C, 0xE28D, 0x4E57, 0xE28E, 0xE28E, 0x250C,
- 0xE28F, 0xE28F, 0x2031, 0xE290, 0xE291, 0x4E59, 0xE292, 0xE292, 0x250B,
- 0xE293, 0xE293, 0x250F, 0xE294, 0xE294, 0x251A, 0xE295, 0xE295, 0x2509,
- 0xE296, 0xE297, 0x4E5B, 0xE298, 0xE298, 0x250E, 0xE299, 0xE299, 0x2234,
- 0xE29A, 0xE29A, 0x2513, 0xE29B, 0xE29B, 0x1F80, 0xE29C, 0xE29F, 0x4E5D,
- 0xE2A0, 0xE2A0, 0x2501, 0xE2A1, 0xE2FE, 0x1603, 0xE340, 0xE341, 0x4E61,
- 0xE342, 0xE342, 0x2517, 0xE343, 0xE343, 0x2516, 0xE344, 0xE346, 0x4E63,
- 0xE347, 0xE347, 0x2518, 0xE348, 0xE34A, 0x4E66, 0xE34B, 0xE34B, 0x1E56,
- 0xE34C, 0xE34E, 0x4E69, 0xE34F, 0xE34F, 0x250D, 0xE350, 0xE350, 0x4E6C,
- 0xE351, 0xE351, 0x20D3, 0xE352, 0xE353, 0x4E6D, 0xE354, 0xE354, 0x207A,
- 0xE355, 0xE355, 0x20CE, 0xE356, 0xE357, 0x4E6F, 0xE358, 0xE358, 0x2510,
- 0xE359, 0xE35B, 0x4E71, 0xE35C, 0xE35C, 0x1E55, 0xE35D, 0xE35F, 0x4E74,
- 0xE360, 0xE360, 0x250A, 0xE361, 0xE365, 0x4E77, 0xE366, 0xE367, 0x2511,
- 0xE368, 0xE370, 0x4E7C, 0xE371, 0xE371, 0x1FAA, 0xE372, 0xE372, 0x4E85,
- 0xE373, 0xE373, 0x251E, 0xE374, 0xE374, 0x1F1F, 0xE375, 0xE377, 0x4E86,
- 0xE378, 0xE378, 0x252D, 0xE379, 0xE379, 0x221D, 0xE37A, 0xE37B, 0x4E89,
- 0xE37C, 0xE37C, 0x2532, 0xE37D, 0xE37D, 0x4E8B, 0xE37E, 0xE37E, 0x217B,
- 0xE380, 0xE389, 0x4E8C, 0xE38A, 0xE38A, 0x21AF, 0xE38B, 0xE38B, 0x4E96,
- 0xE38C, 0xE38C, 0x252C, 0xE38D, 0xE38E, 0x4E97, 0xE38F, 0xE38F, 0x2528,
- 0xE390, 0xE390, 0x4E99, 0xE391, 0xE391, 0x208C, 0xE392, 0xE392, 0x4E9A,
- 0xE393, 0xE393, 0x252F, 0xE394, 0xE394, 0x4E9B, 0xE395, 0xE395, 0x21BC,
- 0xE396, 0xE398, 0x4E9C, 0xE399, 0xE399, 0x251D, 0xE39A, 0xE39B, 0x4E9F,
- 0xE39C, 0xE39C, 0x2535, 0xE39D, 0xE39D, 0x4EA1, 0xE39E, 0xE39E, 0x220D,
- 0xE39F, 0xE39F, 0x2526, 0xE3A0, 0xE3A0, 0x4EA2, 0xE3A1, 0xE3FE, 0x1661,
- 0xE440, 0xE440, 0x2534, 0xE441, 0xE441, 0x252A, 0xE442, 0xE442, 0x251F,
- 0xE443, 0xE443, 0x2531, 0xE444, 0xE444, 0x251C, 0xE445, 0xE447, 0x4EA3,
- 0xE448, 0xE448, 0x2525, 0xE449, 0xE44D, 0x4EA6, 0xE44E, 0xE44E, 0x21CD,
- 0xE44F, 0xE44F, 0x4EAB, 0xE450, 0xE450, 0x21DA, 0xE451, 0xE451, 0x4EAC,
- 0xE452, 0xE452, 0x2172, 0xE453, 0xE453, 0x253E, 0xE454, 0xE457, 0x4EAD,
- 0xE458, 0xE458, 0x204F, 0xE459, 0xE459, 0x4EB1, 0xE45A, 0xE45A, 0x2543,
- 0xE45B, 0xE45B, 0x4EB2, 0xE45C, 0xE45C, 0x21D7, 0xE45D, 0xE45D, 0x4EB3,
- 0xE45E, 0xE45E, 0x1E3C, 0xE45F, 0xE461, 0x4EB4, 0xE462, 0xE462, 0x2529,
- 0xE463, 0xE464, 0x4EB7, 0xE465, 0xE465, 0x2521, 0xE466, 0xE467, 0x4EB9,
- 0xE468, 0xE468, 0x1EFF, 0xE469, 0xE472, 0x4EBB, 0xE473, 0xE473, 0x253F,
- 0xE474, 0xE474, 0x4EC5, 0xE475, 0xE475, 0x2544, 0xE476, 0xE478, 0x4EC6,
- 0xE479, 0xE479, 0x2523, 0xE47A, 0xE47A, 0x1E90, 0xE47B, 0xE47B, 0x253A,
- 0xE47C, 0xE47C, 0x2545, 0xE47D, 0xE47D, 0x4EC9, 0xE47E, 0xE47E, 0x253D,
- 0xE480, 0xE480, 0x4ECA, 0xE481, 0xE481, 0x20C1, 0xE482, 0xE483, 0x4ECB,
- 0xE484, 0xE484, 0x2103, 0xE485, 0xE485, 0x2520, 0xE486, 0xE486, 0x253C,
- 0xE487, 0xE487, 0x253B, 0xE488, 0xE488, 0x2538, 0xE489, 0xE48C, 0x4ECD,
- 0xE48D, 0xE48D, 0x2540, 0xE48E, 0xE48E, 0x4ED1, 0xE48F, 0xE48F, 0x1FCD,
- 0xE490, 0xE492, 0x4ED2, 0xE493, 0xE493, 0x1F18, 0xE494, 0xE497, 0x4ED5,
- 0xE498, 0xE498, 0x254B, 0xE499, 0xE49C, 0x4ED9, 0xE49D, 0xE49D, 0x2547,
- 0xE49E, 0xE49F, 0x254F, 0xE4A0, 0xE4A0, 0x4EDD, 0xE4A1, 0xE4FE, 0x16BF,
- 0xE540, 0xE545, 0x4EDE, 0xE546, 0xE546, 0x22B0, 0xE547, 0xE547, 0x4EE4,
- 0xE548, 0xE548, 0x2546, 0xE549, 0xE54A, 0x4EE5, 0xE54B, 0xE54B, 0x254C,
- 0xE54C, 0xE54D, 0x4EE7, 0xE54E, 0xE54E, 0x1E9A, 0xE54F, 0xE54F, 0x2552,
- 0xE550, 0xE550, 0x2530, 0xE551, 0xE551, 0x2549, 0xE552, 0xE554, 0x4EE9,
- 0xE555, 0xE555, 0x2551, 0xE556, 0xE556, 0x1ECA, 0xE557, 0xE557, 0x4EEC,
- 0xE558, 0xE558, 0x20D2, 0xE559, 0xE55B, 0x4EED, 0xE55C, 0xE55C, 0x1FB8,
- 0xE55D, 0xE55D, 0x4EF0, 0xE55E, 0xE55E, 0x2079, 0xE55F, 0xE560, 0x4EF1,
- 0xE561, 0xE561, 0x21AB, 0xE562, 0xE563, 0x4EF3, 0xE564, 0xE564, 0x254D,
- 0xE565, 0xE565, 0x1EA5, 0xE566, 0xE567, 0x4EF5, 0xE568, 0xE568, 0x204C,
- 0xE569, 0xE569, 0x2080, 0xE56A, 0xE56B, 0x4EF7, 0xE56C, 0xE56C, 0x266D,
- 0xE56D, 0xE56D, 0x4EF9, 0xE56E, 0xE56E, 0x2537, 0xE56F, 0xE574, 0x4EFA,
- 0xE575, 0xE575, 0x254A, 0xE576, 0xE576, 0x21B8, 0xE577, 0xE577, 0x4F00,
- 0xE578, 0xE578, 0x254E, 0xE579, 0xE57A, 0x4F01, 0xE57B, 0xE57B, 0x24FC,
- 0xE57C, 0xE57C, 0x2554, 0xE57D, 0xE57E, 0x4F03, 0xE580, 0xE580, 0x4F05,
- 0xE581, 0xE581, 0x1F3C, 0xE582, 0xE582, 0x4F06, 0xE583, 0xE583, 0x1ED5,
- 0xE584, 0xE589, 0x4F07, 0xE58A, 0xE58A, 0x2556, 0xE58B, 0xE58D, 0x4F0D,
- 0xE58E, 0xE58E, 0x2268, 0xE58F, 0xE590, 0x4F10, 0xE591, 0xE591, 0x1ED6,
- 0xE592, 0xE599, 0x4F12, 0xE59A, 0xE59A, 0x2557, 0xE59B, 0xE59B, 0x2553,
- 0xE59C, 0xE59E, 0x4F1A, 0xE59F, 0xE59F, 0x2548, 0xE5A0, 0xE5A0, 0x4F1D,
- 0xE5A1, 0xE5FE, 0x171D, 0xE640, 0xE640, 0x20DC, 0xE641, 0xE643, 0x4F1E,
- 0xE644, 0xE644, 0x2559, 0xE645, 0xE648, 0x4F21, 0xE649, 0xE649, 0x1F97,
- 0xE64A, 0xE64A, 0x2555, 0xE64B, 0xE64D, 0x4F25, 0xE64E, 0xE64E, 0x227D,
- 0xE64F, 0xE651, 0x4F28, 0xE652, 0xE652, 0x257E, 0xE653, 0xE655, 0x4F2B,
- 0xE656, 0xE656, 0x207C, 0xE657, 0xE657, 0x4F2E, 0xE658, 0xE658, 0x255A,
- 0xE659, 0xE65A, 0x4F2F, 0xE65B, 0xE65B, 0x255E, 0xE65C, 0xE65D, 0x4F31,
- 0xE65E, 0xE65E, 0x1E34, 0xE65F, 0xE668, 0x4F33, 0xE669, 0xE669, 0x215E,
- 0xE66A, 0xE66A, 0x4F3D, 0xE66B, 0xE66B, 0x2560, 0xE66C, 0xE674, 0x4F3E,
- 0xE675, 0xE675, 0x21A2, 0xE676, 0xE676, 0x2354, 0xE677, 0xE678, 0x4F47,
- 0xE679, 0xE679, 0x2563, 0xE67A, 0xE67A, 0x2527, 0xE67B, 0xE67B, 0x4F49,
- 0xE67C, 0xE67C, 0x252E, 0xE67D, 0xE67D, 0x2558, 0xE67E, 0xE67E, 0x4F4A,
- 0xE680, 0xE680, 0x1F1B, 0xE681, 0xE681, 0x4F4B, 0xE682, 0xE682, 0x2283,
- 0xE683, 0xE683, 0x4F4C, 0xE684, 0xE684, 0x2564, 0xE685, 0xE686, 0x4F4D,
- 0xE687, 0xE687, 0x20A0, 0xE688, 0xE688, 0x4F4F, 0xE689, 0xE689, 0x2565,
- 0xE68A, 0xE68B, 0x4F50, 0xE68C, 0xE68C, 0x2561, 0xE68D, 0xE692, 0x4F52,
- 0xE693, 0xE693, 0x2562, 0xE694, 0xE696, 0x4F58, 0xE697, 0xE697, 0x256C,
- 0xE698, 0xE69A, 0x4F5B, 0xE69B, 0xE69B, 0x256D, 0xE69C, 0xE69C, 0x2020,
- 0xE69D, 0xE69E, 0x4F5E, 0xE69F, 0xE69F, 0x255F, 0xE6A0, 0xE6A0, 0x256A,
- 0xE6A1, 0xE6FE, 0x177B, 0xE740, 0xE742, 0x4F60, 0xE743, 0xE743, 0x256E,
- 0xE744, 0xE747, 0x4F63, 0xE748, 0xE748, 0x2539, 0xE749, 0xE749, 0x255C,
- 0xE74A, 0xE74C, 0x4F67, 0xE74D, 0xE74E, 0x2568, 0xE74F, 0xE74F, 0x256B,
- 0xE750, 0xE750, 0x1E6F, 0xE751, 0xE751, 0x4F6A, 0xE752, 0xE752, 0x1FC4,
- 0xE753, 0xE753, 0x2567, 0xE754, 0xE754, 0x4F6B, 0xE755, 0xE755, 0x255B,
- 0xE756, 0xE758, 0x4F6C, 0xE759, 0xE759, 0x261D, 0xE75A, 0xE765, 0x4F6F,
- 0xE766, 0xE766, 0x252B, 0xE767, 0xE767, 0x4F7B, 0xE768, 0xE768, 0x2571,
- 0xE769, 0xE769, 0x4F7C, 0xE76A, 0xE76A, 0x2577, 0xE76B, 0xE773, 0x4F7D,
- 0xE774, 0xE774, 0x2522, 0xE775, 0xE77B, 0x4F86, 0xE77C, 0xE77C, 0x2533,
- 0xE77D, 0xE77E, 0x4F8D, 0xE780, 0xE781, 0x4F8F, 0xE782, 0xE782, 0x202A,
- 0xE783, 0xE783, 0x4F91, 0xE784, 0xE784, 0x2536, 0xE785, 0xE785, 0x2573,
- 0xE786, 0xE786, 0x256F, 0xE787, 0xE789, 0x4F92, 0xE78A, 0xE78A, 0x2293,
- 0xE78B, 0xE78B, 0x2578, 0xE78C, 0xE78E, 0x4F95, 0xE78F, 0xE78F, 0x2570,
- 0xE790, 0xE791, 0x4F98, 0xE792, 0xE792, 0x2575, 0xE793, 0xE797, 0x4F9A,
- 0xE798, 0xE799, 0x2541, 0xE79A, 0xE79A, 0x255D, 0xE79B, 0xE79F, 0x4F9F,
- 0xE7A0, 0xE7A0, 0x201A, 0xE7A1, 0xE7FE, 0x17D9, 0xE840, 0xE842, 0x4FA4,
- 0xE843, 0xE843, 0x257A, 0xE844, 0xE844, 0x2006, 0xE845, 0xE845, 0x4FA7,
- 0xE846, 0xE846, 0x2177, 0xE847, 0xE848, 0x4FA8, 0xE849, 0xE849, 0x251B,
- 0xE84A, 0xE84A, 0x4FAA, 0xE84B, 0xE84B, 0x2524, 0xE84C, 0xE84E, 0x4FAB,
- 0xE84F, 0xE84F, 0x257B, 0xE850, 0xE853, 0x4FAE, 0xE854, 0xE854, 0x22A3,
- 0xE855, 0xE859, 0x4FB2, 0xE85A, 0xE85A, 0x2579, 0xE85B, 0xE85B, 0x4FB7,
- 0xE85C, 0xE85C, 0x2566, 0xE85D, 0xE861, 0x4FB8, 0xE862, 0xE862, 0x1F93,
- 0xE863, 0xE863, 0x4FBD, 0xE864, 0xE864, 0x257C, 0xE865, 0xE86F, 0x4FBE,
- 0xE870, 0xE870, 0x2514, 0xE871, 0xE872, 0x4FC9, 0xE873, 0xE873, 0x257D,
- 0xE874, 0xE874, 0x4FCB, 0xE875, 0xE875, 0x2572, 0xE876, 0xE87B, 0x4FCC,
- 0xE87C, 0xE87C, 0x2574, 0xE87D, 0xE87E, 0x4FD2, 0xE880, 0xE880, 0x224E,
- 0xE881, 0xE881, 0x4FD4, 0xE882, 0xE882, 0x21C6, 0xE883, 0xE886, 0x4FD5,
- 0xE887, 0xE887, 0x209F, 0xE888, 0xE888, 0x4FD9, 0xE889, 0xE889, 0x2576,
- 0xE88A, 0xE88B, 0x4FDA, 0xE88C, 0xE88C, 0x2064, 0xE88D, 0xE88D, 0x22BF,
- 0xE88E, 0xE88E, 0x261C, 0xE88F, 0xE88F, 0x225E, 0xE890, 0xE8A0, 0x4FDC,
- 0xE8A1, 0xE8FE, 0x1837, 0xE940, 0xE94B, 0x4FED, 0xE94C, 0xE94C, 0x1E75,
- 0xE94D, 0xE953, 0x4FF9, 0xE954, 0xE954, 0x207D, 0xE955, 0xE955, 0x5000,
- 0xE956, 0xE956, 0x23BF, 0xE957, 0xE957, 0x2113, 0xE958, 0xE959, 0x5001,
- 0xE95A, 0xE95A, 0x23C0, 0xE95B, 0xE95C, 0x5003, 0xE95D, 0xE95D, 0x1E45,
- 0xE95E, 0xE95E, 0x5005, 0xE95F, 0xE95F, 0x1FD8, 0xE960, 0xE960, 0x23C4,
- 0xE961, 0xE961, 0x5006, 0xE962, 0xE962, 0x23C2, 0xE963, 0xE963, 0x2104,
- 0xE964, 0xE964, 0x5007, 0xE965, 0xE965, 0x21BD, 0xE966, 0xE966, 0x5008,
- 0xE967, 0xE967, 0x1F87, 0xE968, 0xE968, 0x23C3, 0xE969, 0xE96B, 0x5009,
- 0xE96C, 0xE96C, 0x2269, 0xE96D, 0xE974, 0x500C, 0xE975, 0xE975, 0x1F43,
- 0xE976, 0xE976, 0x5014, 0xE977, 0xE977, 0x1F1E, 0xE978, 0xE978, 0x2679,
- 0xE979, 0xE979, 0x1EEB, 0xE97A, 0xE97B, 0x5015, 0xE97C, 0xE97C, 0x1F35,
- 0xE97D, 0xE97D, 0x208A, 0xE97E, 0xE97E, 0x5017, 0xE980, 0xE980, 0x23C7,
- 0xE981, 0xE981, 0x23C9, 0xE982, 0xE982, 0x23C6, 0xE983, 0xE986, 0x5018,
- 0xE987, 0xE987, 0x224F, 0xE988, 0xE98A, 0x501C, 0xE98B, 0xE98B, 0x23CB,
- 0xE98C, 0xE98D, 0x501F, 0xE98E, 0xE98E, 0x21F3, 0xE98F, 0xE98F, 0x5021,
- 0xE990, 0xE990, 0x21F7, 0xE991, 0xE991, 0x23CF, 0xE992, 0xE992, 0x23CE,
- 0xE993, 0xE993, 0x23CA, 0xE994, 0xE994, 0x23CD, 0xE995, 0xE997, 0x5022,
- 0xE998, 0xE998, 0x23D0, 0xE999, 0xE99A, 0x5025, 0xE99B, 0xE99B, 0x266C,
- 0xE99C, 0xE99C, 0x5027, 0xE99D, 0xE99D, 0x23C1, 0xE99E, 0xE99E, 0x5028,
- 0xE99F, 0xE99F, 0x1FEE, 0xE9A0, 0xE9A0, 0x23D1, 0xE9A1, 0xE9FE, 0x1895,
- 0xEA40, 0xEA40, 0x1FF8, 0xEA41, 0xEA43, 0x5029, 0xEA44, 0xEA44, 0x23D3,
- 0xEA45, 0xEA47, 0x502C, 0xEA48, 0xEA48, 0x23D2, 0xEA49, 0xEA49, 0x23D4,
- 0xEA4A, 0xEA4A, 0x1E98, 0xEA4B, 0xEA4F, 0x502F, 0xEA50, 0xEA50, 0x1F2C,
- 0xEA51, 0xEA51, 0x5034, 0xEA52, 0xEA52, 0x23D5, 0xEA53, 0xEA54, 0x5035,
- 0xEA55, 0xEA55, 0x1E71, 0xEA56, 0xEA56, 0x2691, 0xEA57, 0xEA58, 0x5037,
- 0xEA59, 0xEA59, 0x23C5, 0xEA5A, 0xEA7E, 0x5039, 0xEA80, 0xEA80, 0x231A,
- 0xEA81, 0xEA83, 0x505E, 0xEA84, 0xEA84, 0x2114, 0xEA85, 0xEA86, 0x5061,
- 0xEA87, 0xEA87, 0x2284, 0xEA88, 0xEA8D, 0x5063, 0xEA8E, 0xEA8E, 0x221C,
- 0xEA8F, 0xEA8F, 0x5069, 0xEA90, 0xEA90, 0x1E7E, 0xEA91, 0xEA91, 0x204D,
- 0xEA92, 0xEA95, 0x506A, 0xEA96, 0xEA96, 0x2201, 0xEA97, 0xEA9F, 0x506E,
- 0xEAA0, 0xEAA0, 0x1ED9, 0xEAA1, 0xEAFE, 0x18F3, 0xEB40, 0xEB40, 0x5077,
- 0xEB41, 0xEB41, 0x1FB2, 0xEB42, 0xEB44, 0x5078, 0xEB45, 0xEB45, 0x2252,
- 0xEB46, 0xEB47, 0x507B, 0xEB48, 0xEB48, 0x1F79, 0xEB49, 0xEB52, 0x507D,
- 0xEB53, 0xEB53, 0x2157, 0xEB54, 0xEB54, 0x5087, 0xEB55, 0xEB55, 0x21BF,
- 0xEB56, 0xEB5A, 0x5088, 0xEB5B, 0xEB5B, 0x221F, 0xEB5C, 0xEB5C, 0x508D,
- 0xEB5D, 0xEB5D, 0x203D, 0xEB5E, 0xEB5F, 0x508E, 0xEB60, 0xEB60, 0x2015,
- 0xEB61, 0xEB61, 0x5090, 0xEB62, 0xEB62, 0x26A5, 0xEB63, 0xEB6C, 0x5091,
- 0xEB6D, 0xEB6D, 0x2156, 0xEB6E, 0xEB6F, 0x509B, 0xEB70, 0xEB70, 0x2144,
- 0xEB71, 0xEB71, 0x509D, 0xEB72, 0xEB72, 0x1E91, 0xEB73, 0xEB73, 0x2257,
- 0xEB74, 0xEB77, 0x509E, 0xEB78, 0xEB78, 0x200A, 0xEB79, 0xEB79, 0x2092,
- 0xEB7A, 0xEB7E, 0x50A2, 0xEB80, 0xEB84, 0x50A7, 0xEB85, 0xEB85, 0x2250,
- 0xEB86, 0xEB89, 0x50AC, 0xEB8A, 0xEB8A, 0x1EC3, 0xEB8B, 0xEBA0, 0x50B0,
- 0xEBA1, 0xEBFE, 0x1951, 0xEC40, 0xEC45, 0x50C6, 0xEC46, 0xEC46, 0x21A8,
- 0xEC47, 0xEC55, 0x50CC, 0xEC56, 0xEC56, 0x260D, 0xEC57, 0xEC59, 0x50DB,
- 0xEC5A, 0xEC5A, 0x260C, 0xEC5B, 0xEC5B, 0x50DE, 0xEC5C, 0xEC5C, 0x260E,
- 0xEC5D, 0xEC5F, 0x50DF, 0xEC60, 0xEC60, 0x2032, 0xEC61, 0xEC6D, 0x50E2,
- 0xEC6E, 0xEC6E, 0x260B, 0xEC6F, 0xEC75, 0x50EF, 0xEC76, 0xEC76, 0x22C3,
- 0xEC77, 0xEC7E, 0x50F6, 0xEC80, 0xEC95, 0x50FE, 0xEC96, 0xEC96, 0x1F23,
- 0xEC97, 0xECA0, 0x5114, 0xECA1, 0xECFE, 0x19AF, 0xED40, 0xED45, 0x511E,
- 0xED46, 0xED46, 0x2695, 0xED47, 0xED57, 0x5124, 0xED58, 0xED58, 0x265E,
- 0xED59, 0xED5D, 0x5135, 0xED5E, 0xED5E, 0x265D, 0xED5F, 0xED60, 0x513A,
- 0xED61, 0xED61, 0x2692, 0xED62, 0xED63, 0x513C, 0xED64, 0xED64, 0x265F,
- 0xED65, 0xED65, 0x513E, 0xED66, 0xED66, 0x218D, 0xED67, 0xED67, 0x20FD,
- 0xED68, 0xED6D, 0x513F, 0xED6E, 0xED6E, 0x1F40, 0xED6F, 0xED73, 0x5145,
- 0xED74, 0xED74, 0x2465, 0xED75, 0xED76, 0x514A, 0xED77, 0xED77, 0x2467,
- 0xED78, 0xED78, 0x514C, 0xED79, 0xED79, 0x2466, 0xED7A, 0xED7E, 0x514D,
- 0xED80, 0xED90, 0x5152, 0xED91, 0xED91, 0x21C9, 0xED92, 0xED92, 0x5163,
- 0xED93, 0xED93, 0x2209, 0xED94, 0xED94, 0x1EC9, 0xED95, 0xED95, 0x20E9,
- 0xED96, 0xED96, 0x5164, 0xED97, 0xED97, 0x21CA, 0xED98, 0xED98, 0x2146,
- 0xED99, 0xED99, 0x25C5, 0xED9A, 0xED9A, 0x21DC, 0xED9B, 0xED9B, 0x5165,
- 0xED9C, 0xED9C, 0x245E, 0xED9D, 0xED9D, 0x5166, 0xED9E, 0xED9E, 0x214F,
- 0xED9F, 0xED9F, 0x5167, 0xEDA0, 0xEDA0, 0x25C6, 0xEDA1, 0xEDFE, 0x1A0D,
- 0xEE40, 0xEE40, 0x25C7, 0xEE41, 0xEE41, 0x2241, 0xEE42, 0xEE42, 0x218A,
- 0xEE43, 0xEE43, 0x1E2F, 0xEE44, 0xEE44, 0x1EDC, 0xEE45, 0xEE47, 0x5168,
- 0xEE48, 0xEE48, 0x20BF, 0xEE49, 0xEE49, 0x2034, 0xEE4A, 0xEE4C, 0x516B,
- 0xEE4D, 0xEE4D, 0x25C9, 0xEE4E, 0xEE51, 0x516E, 0xEE52, 0xEE52, 0x25C8,
- 0xEE53, 0xEE54, 0x5172, 0xEE55, 0xEE55, 0x220E, 0xEE56, 0xEE56, 0x5174,
- 0xEE57, 0xEE57, 0x25CB, 0xEE58, 0xEE5D, 0x5175, 0xEE5E, 0xEE5E, 0x217D,
- 0xEE5F, 0xEE60, 0x517B, 0xEE61, 0xEE61, 0x1F7E, 0xEE62, 0xEE67, 0x517D,
- 0xEE68, 0xEE68, 0x25CC, 0xEE69, 0xEE69, 0x1FC3, 0xEE6A, 0xEE6B, 0x5183,
- 0xEE6C, 0xEE6C, 0x20B9, 0xEE6D, 0xEE6D, 0x5185, 0xEE6E, 0xEE6E, 0x2181,
- 0xEE6F, 0xEE76, 0x5186, 0xEE77, 0xEE77, 0x1FDA, 0xEE78, 0xEE7C, 0x518E,
- 0xEE7D, 0xEE7D, 0x2173, 0xEE7E, 0xEE7E, 0x1EE1, 0xEE80, 0xEE80, 0x25CD,
- 0xEE81, 0xEE84, 0x5193, 0xEE85, 0xEE85, 0x25CE, 0xEE86, 0xEE86, 0x21F6,
- 0xEE87, 0xEE89, 0x5197, 0xEE8A, 0xEE8A, 0x224B, 0xEE8B, 0xEE8B, 0x25D1,
- 0xEE8C, 0xEE8C, 0x519A, 0xEE8D, 0xEE8D, 0x1EC0, 0xEE8E, 0xEE8F, 0x519B,
- 0xEE90, 0xEE90, 0x2008, 0xEE91, 0xEE93, 0x519D, 0xEE94, 0xEE94, 0x25D0,
- 0xEE95, 0xEE96, 0x51A0, 0xEE97, 0xEE97, 0x25D2, 0xEE98, 0xEE98, 0x51A2,
- 0xEE99, 0xEE99, 0x1F2A, 0xEE9A, 0xEE9C, 0x51A3, 0xEE9D, 0xEE9D, 0x1E72,
- 0xEE9E, 0xEE9E, 0x25D3, 0xEE9F, 0xEEA0, 0x51A6, 0xEEA1, 0xEEFE, 0x1A6B,
- 0xEF40, 0xEF40, 0x21BE, 0xEF41, 0xEF41, 0x25D4, 0xEF42, 0xEF42, 0x2044,
- 0xEF43, 0xEF43, 0x51A8, 0xEF44, 0xEF44, 0x25CF, 0xEF45, 0xEF45, 0x20F3,
- 0xEF46, 0xEF4B, 0x51A9, 0xEF4C, 0xEF4C, 0x1F00, 0xEF4D, 0xEF51, 0x51AF,
- 0xEF52, 0xEF53, 0x24CC, 0xEF54, 0xEF54, 0x51B4, 0xEF55, 0xEF55, 0x2698,
- 0xEF56, 0xEF56, 0x51B5, 0xEF57, 0xEF57, 0x2678, 0xEF58, 0xEF59, 0x51B6,
- 0xEF5A, 0xEF5A, 0x24CE, 0xEF5B, 0xEF5F, 0x51B8, 0xEF60, 0xEF60, 0x24CF,
- 0xEF61, 0xEF67, 0x51BD, 0xEF68, 0xEF68, 0x20B8, 0xEF69, 0xEF69, 0x51C4,
- 0xEF6A, 0xEF6A, 0x24D0, 0xEF6B, 0xEF6B, 0x51C5, 0xEF6C, 0xEF6C, 0x24D1,
- 0xEF6D, 0xEF76, 0x51C6, 0xEF77, 0xEF77, 0x1EF4, 0xEF78, 0xEF79, 0x51D0,
- 0xEF7A, 0xEF7A, 0x239B, 0xEF7B, 0xEF7B, 0x51D2, 0xEF7C, 0xEF7C, 0x267E,
- 0xEF7D, 0xEF7E, 0x51D3, 0xEF80, 0xEF81, 0x51D5, 0xEF82, 0xEF82, 0x239D,
- 0xEF83, 0xEF84, 0x239F, 0xEF85, 0xEF85, 0x51D7, 0xEF86, 0xEF86, 0x23A1,
- 0xEF87, 0xEF87, 0x51D8, 0xEF88, 0xEF88, 0x1EF1, 0xEF89, 0xEF8A, 0x51D9,
- 0xEF8B, 0xEF8B, 0x221E, 0xEF8C, 0xEF8C, 0x51DB, 0xEF8D, 0xEF8D, 0x23A2,
- 0xEF8E, 0xEF94, 0x51DC, 0xEF95, 0xEF95, 0x214B, 0xEF96, 0xEF96, 0x1E36,
- 0xEF97, 0xEF97, 0x2135, 0xEF98, 0xEF9B, 0x51E3, 0xEF9C, 0xEF9C, 0x1FAD,
- 0xEF9D, 0xEF9D, 0x51E7, 0xEF9E, 0xEF9E, 0x1E53, 0xEF9F, 0xEFA0, 0x51E8,
- 0xEFA1, 0xEFFE, 0x1AC9, 0xF040, 0xF040, 0x51EA, 0xF041, 0xF041, 0x23A3,
- 0xF042, 0xF042, 0x2203, 0xF043, 0xF043, 0x51EB, 0xF044, 0xF044, 0x1EE7,
- 0xF045, 0xF046, 0x51EC, 0xF047, 0xF047, 0x23A4, 0xF048, 0xF048, 0x2097,
- 0xF049, 0xF049, 0x1EE4, 0xF04A, 0xF04D, 0x51EE, 0xF04E, 0xF04E, 0x2238,
- 0xF04F, 0xF050, 0x51F2, 0xF051, 0xF051, 0x23A5, 0xF052, 0xF053, 0x51F4,
- 0xF054, 0xF054, 0x1F9A, 0xF055, 0xF056, 0x51F6, 0xF057, 0xF057, 0x21C3,
- 0xF058, 0xF05D, 0x51F8, 0xF05E, 0xF05E, 0x1F2E, 0xF05F, 0xF067, 0x51FE,
- 0xF068, 0xF068, 0x239C, 0xF069, 0xF06B, 0x5207, 0xF06C, 0xF06C, 0x23A6,
- 0xF06D, 0xF070, 0x520A, 0xF071, 0xF071, 0x239E, 0xF072, 0xF072, 0x520E,
- 0xF073, 0xF073, 0x2035, 0xF074, 0xF074, 0x23A7, 0xF075, 0xF077, 0x520F,
- 0xF078, 0xF078, 0x23A8, 0xF079, 0xF079, 0x5212, 0xF07A, 0xF07A, 0x2075,
- 0xF07B, 0xF07C, 0x5213, 0xF07D, 0xF07E, 0x23A9, 0xF080, 0xF080, 0x23AB,
- 0xF081, 0xF081, 0x1FEB, 0xF082, 0xF082, 0x23AC, 0xF083, 0xF086, 0x5215,
- 0xF087, 0xF087, 0x1F6A, 0xF088, 0xF088, 0x20F9, 0xF089, 0xF08A, 0x5219,
- 0xF08B, 0xF08B, 0x2666, 0xF08C, 0xF08F, 0x521B, 0xF090, 0xF090, 0x2667,
- 0xF091, 0xF091, 0x521F, 0xF092, 0xF092, 0x1E6C, 0xF093, 0xF095, 0x5220,
- 0xF096, 0xF096, 0x23AD, 0xF097, 0xF0A0, 0x5223, 0xF0A1, 0xF0FE, 0x1B27,
- 0xF140, 0xF151, 0x522D, 0xF152, 0xF152, 0x206D, 0xF153, 0xF153, 0x2242,
- 0xF154, 0xF154, 0x1F02, 0xF155, 0xF156, 0x523F, 0xF157, 0xF157, 0x2183,
- 0xF158, 0xF158, 0x5241, 0xF159, 0xF159, 0x1E85, 0xF15A, 0xF15A, 0x21E9,
- 0xF15B, 0xF166, 0x5242, 0xF167, 0xF167, 0x1E57, 0xF168, 0xF175, 0x524E,
- 0xF176, 0xF176, 0x22A5, 0xF177, 0xF177, 0x2407, 0xF178, 0xF178, 0x1FCA,
- 0xF179, 0xF179, 0x525C, 0xF17A, 0xF17A, 0x2402, 0xF17B, 0xF17B, 0x1F82,
- 0xF17C, 0xF17D, 0x525D, 0xF17E, 0xF17E, 0x2408, 0xF180, 0xF180, 0x2404,
- 0xF181, 0xF181, 0x525F, 0xF182, 0xF182, 0x2131, 0xF183, 0xF183, 0x5260,
- 0xF184, 0xF184, 0x2184, 0xF185, 0xF185, 0x5261, 0xF186, 0xF186, 0x2403,
- 0xF187, 0xF187, 0x5262, 0xF188, 0xF188, 0x206E, 0xF189, 0xF189, 0x240B,
- 0xF18A, 0xF193, 0x5263, 0xF194, 0xF194, 0x1F3F, 0xF195, 0xF197, 0x526D,
- 0xF198, 0xF198, 0x2067, 0xF199, 0xF1A0, 0x5270, 0xF1A1, 0xF1FE, 0x1B85,
- 0xF240, 0xF244, 0x5278, 0xF245, 0xF245, 0x1FD7, 0xF246, 0xF246, 0x527D,
- 0xF247, 0xF247, 0x1E83, 0xF248, 0xF24A, 0x527E, 0xF24B, 0xF24B, 0x240F,
- 0xF24C, 0xF252, 0x5281, 0xF253, 0xF253, 0x240E, 0xF254, 0xF254, 0x20C7,
- 0xF255, 0xF255, 0x240D, 0xF256, 0xF25B, 0x5288, 0xF25C, 0xF25C, 0x2412,
- 0xF25D, 0xF25E, 0x528E, 0xF25F, 0xF25F, 0x20B7, 0xF260, 0xF270, 0x5290,
- 0xF271, 0xF271, 0x23F0, 0xF272, 0xF272, 0x52A1, 0xF273, 0xF273, 0x2411,
- 0xF274, 0xF274, 0x2414, 0xF275, 0xF275, 0x52A2, 0xF276, 0xF276, 0x2170,
- 0xF277, 0xF27B, 0x52A3, 0xF27C, 0xF27C, 0x2405, 0xF27D, 0xF27D, 0x210C,
- 0xF27E, 0xF27E, 0x2415, 0xF280, 0xF284, 0x52A8, 0xF285, 0xF285, 0x2066,
- 0xF286, 0xF286, 0x52AD, 0xF287, 0xF287, 0x2352, 0xF288, 0xF288, 0x2413,
- 0xF289, 0xF289, 0x2410, 0xF28A, 0xF28B, 0x2416, 0xF28C, 0xF28C, 0x20F1,
- 0xF28D, 0xF290, 0x52AE, 0xF291, 0xF291, 0x240A, 0xF292, 0xF293, 0x52B2,
- 0xF294, 0xF294, 0x2409, 0xF295, 0xF295, 0x52B4, 0xF296, 0xF296, 0x2418,
- 0xF297, 0xF29B, 0x52B5, 0xF29C, 0xF29C, 0x1FA7, 0xF29D, 0xF29D, 0x52BA,
- 0xF29E, 0xF29E, 0x21FC, 0xF29F, 0xF2A0, 0x52BB, 0xF2A1, 0xF2FE, 0x1BE3,
- 0xF340, 0xF340, 0x1FC1, 0xF341, 0xF341, 0x2406, 0xF342, 0xF344, 0x52BD,
- 0xF345, 0xF345, 0x229C, 0xF346, 0xF347, 0x52C0, 0xF348, 0xF348, 0x204E,
- 0xF349, 0xF349, 0x52C2, 0xF34A, 0xF34A, 0x241A, 0xF34B, 0xF34B, 0x2419,
- 0xF34C, 0xF34F, 0x52C3, 0xF350, 0xF350, 0x240C, 0xF351, 0xF360, 0x52C7,
- 0xF361, 0xF361, 0x1E29, 0xF362, 0xF373, 0x52D7, 0xF374, 0xF374, 0x2661,
- 0xF375, 0xF375, 0x52E9, 0xF376, 0xF376, 0x26A4, 0xF377, 0xF377, 0x2174,
- 0xF378, 0xF378, 0x2663, 0xF379, 0xF379, 0x2662, 0xF37A, 0xF37E, 0x52EA,
- 0xF380, 0xF38B, 0x52EF, 0xF38C, 0xF38C, 0x2675, 0xF38D, 0xF39F, 0x52FB,
- 0xF3A0, 0xF3A0, 0x214C, 0xF3A1, 0xF3FE, 0x1C41, 0xF440, 0xF444, 0x530E,
- 0xF445, 0xF445, 0x267A, 0xF446, 0xF44F, 0x5313, 0xF450, 0xF450, 0x26A0,
- 0xF451, 0xF456, 0x531D, 0xF457, 0xF457, 0x2668, 0xF458, 0xF458, 0x5323,
- 0xF459, 0xF459, 0x1ED0, 0xF45A, 0xF45A, 0x5324, 0xF45B, 0xF45B, 0x2096,
- 0xF45C, 0xF45C, 0x5325, 0xF45D, 0xF45D, 0x23CC, 0xF45E, 0xF461, 0x5326,
- 0xF462, 0xF462, 0x23C8, 0xF463, 0xF463, 0x532A, 0xF464, 0xF464, 0x223E,
- 0xF465, 0xF474, 0x532B, 0xF475, 0xF475, 0x2665, 0xF476, 0xF47B, 0x533B,
- 0xF47C, 0xF47C, 0x2664, 0xF47D, 0xF47D, 0x5341, 0xF47E, 0xF47E, 0x2239,
- 0xF480, 0xF493, 0x5342, 0xF494, 0xF494, 0x204A, 0xF495, 0xF498, 0x5356,
- 0xF499, 0xF499, 0x261F, 0xF49A, 0xF49B, 0x535A, 0xF49C, 0xF49C, 0x261E,
- 0xF49D, 0xF4A0, 0x535C, 0xF4A1, 0xF4FE, 0x1C9F, 0xF540, 0xF544, 0x5360,
- 0xF545, 0xF545, 0x2620, 0xF546, 0xF546, 0x5365, 0xF547, 0xF547, 0x2621,
- 0xF548, 0xF551, 0x5366, 0xF552, 0xF552, 0x2622, 0xF553, 0xF553, 0x5370,
- 0xF554, 0xF554, 0x2627, 0xF555, 0xF555, 0x1E39, 0xF556, 0xF556, 0x2625,
- 0xF557, 0xF55D, 0x5371, 0xF55E, 0xF55E, 0x2629, 0xF55F, 0xF560, 0x5378,
- 0xF561, 0xF561, 0x262E, 0xF562, 0xF562, 0x262B, 0xF563, 0xF56D, 0x537A,
- 0xF56E, 0xF56E, 0x262A, 0xF56F, 0xF56F, 0x262D, 0xF570, 0xF570, 0x5385,
- 0xF571, 0xF571, 0x2628, 0xF572, 0xF572, 0x21B9, 0xF573, 0xF57E, 0x5386,
- 0xF580, 0xF584, 0x5392, 0xF585, 0xF585, 0x2636, 0xF586, 0xF586, 0x2630,
- 0xF587, 0xF58B, 0x5397, 0xF58C, 0xF58C, 0x2638, 0xF58D, 0xF58D, 0x539C,
- 0xF58E, 0xF58E, 0x200D, 0xF58F, 0xF58F, 0x2637, 0xF590, 0xF598, 0x539D,
- 0xF599, 0xF599, 0x2645, 0xF59A, 0xF59A, 0x53A6, 0xF59B, 0xF59B, 0x263A,
- 0xF59C, 0xF59F, 0x53A7, 0xF5A0, 0xF5A0, 0x2643, 0xF5A1, 0xF5FE, 0x1CFD,
- 0xF640, 0xF640, 0x53AB, 0xF641, 0xF641, 0x2640, 0xF642, 0xF644, 0x53AC,
- 0xF645, 0xF645, 0x263D, 0xF646, 0xF646, 0x2641, 0xF647, 0xF647, 0x53AF,
- 0xF648, 0xF648, 0x263E, 0xF649, 0xF64A, 0x53B0, 0xF64B, 0xF64B, 0x263F,
- 0xF64C, 0xF64C, 0x1FC0, 0xF64D, 0xF64D, 0x53B2, 0xF64E, 0xF64F, 0x263B,
- 0xF650, 0xF653, 0x53B3, 0xF654, 0xF654, 0x2642, 0xF655, 0xF657, 0x53B7,
- 0xF658, 0xF658, 0x2644, 0xF659, 0xF660, 0x53BA, 0xF661, 0xF661, 0x2639,
- 0xF662, 0xF662, 0x53C2, 0xF663, 0xF663, 0x264C, 0xF664, 0xF66B, 0x53C3,
- 0xF66C, 0xF66C, 0x2647, 0xF66D, 0xF66D, 0x264B, 0xF66E, 0xF670, 0x53CB,
- 0xF671, 0xF671, 0x2649, 0xF672, 0xF673, 0x53CE, 0xF674, 0xF674, 0x2648,
- 0xF675, 0xF675, 0x53D0, 0xF676, 0xF676, 0x264A, 0xF677, 0xF677, 0x2108,
- 0xF678, 0xF67E, 0x53D1, 0xF680, 0xF684, 0x53D8, 0xF685, 0xF685, 0x264D,
- 0xF686, 0xF687, 0x53DD, 0xF688, 0xF688, 0x2634, 0xF689, 0xF689, 0x53DF,
- 0xF68A, 0xF68A, 0x2651, 0xF68B, 0xF68C, 0x53E0, 0xF68D, 0xF68D, 0x2650,
- 0xF68E, 0xF68E, 0x2652, 0xF68F, 0xF691, 0x53E2, 0xF692, 0xF692, 0x264F,
- 0xF693, 0xF695, 0x53E5, 0xF696, 0xF696, 0x2632, 0xF697, 0xF697, 0x264E,
- 0xF698, 0xF698, 0x2653, 0xF699, 0xF699, 0x53E8, 0xF69A, 0xF69A, 0x2657,
- 0xF69B, 0xF69B, 0x53E9, 0xF69C, 0xF69C, 0x2635, 0xF69D, 0xF69D, 0x53EA,
- 0xF69E, 0xF69E, 0x2633, 0xF69F, 0xF69F, 0x53EB, 0xF6A0, 0xF6A0, 0x2656,
- 0xF6A1, 0xF6FE, 0x1D5B, 0xF740, 0xF741, 0x53EC, 0xF742, 0xF742, 0x2654,
- 0xF743, 0xF748, 0x53EE, 0xF749, 0xF749, 0x2658, 0xF74A, 0xF74B, 0x53F4,
- 0xF74C, 0xF74C, 0x2655, 0xF74D, 0xF74D, 0x1E4D, 0xF74E, 0xF755, 0x53F6,
- 0xF756, 0xF756, 0x265B, 0xF757, 0xF757, 0x53FE, 0xF758, 0xF758, 0x265A,
- 0xF759, 0xF759, 0x53FF, 0xF75A, 0xF75A, 0x2659, 0xF75B, 0xF75B, 0x202E,
- 0xF75C, 0xF75C, 0x262F, 0xF75D, 0xF760, 0x5400, 0xF761, 0xF761, 0x2646,
- 0xF762, 0xF762, 0x5404, 0xF763, 0xF763, 0x2626, 0xF764, 0xF76A, 0x5405,
- 0xF76B, 0xF76B, 0x265C, 0xF76C, 0xF770, 0x540C, 0xF771, 0xF771, 0x262C,
- 0xF772, 0xF77B, 0x5411, 0xF77C, 0xF77C, 0x2623, 0xF77D, 0xF77D, 0x541B,
- 0xF77E, 0xF77E, 0x2631, 0xF780, 0xF7A0, 0x541C, 0xF7A1, 0xF7FE, 0x1DB9,
- 0xF840, 0xF841, 0x543D, 0xF842, 0xF842, 0x209C, 0xF843, 0xF845, 0x543F,
- 0xF846, 0xF846, 0x2580, 0xF847, 0xF848, 0x5442, 0xF849, 0xF849, 0x22DC,
- 0xF84A, 0xF84F, 0x5444, 0xF850, 0xF850, 0x1F05, 0xF851, 0xF851, 0x208B,
- 0xF852, 0xF852, 0x544A, 0xF853, 0xF853, 0x2581, 0xF854, 0xF862, 0x544B,
- 0xF863, 0xF863, 0x2583, 0xF864, 0xF864, 0x2582, 0xF865, 0xF865, 0x545A,
- 0xF866, 0xF866, 0x21EE, 0xF867, 0xF871, 0x545B, 0xF872, 0xF872, 0x2182,
- 0xF873, 0xF877, 0x5466, 0xF878, 0xF878, 0x2243, 0xF879, 0xF879, 0x546B,
- 0xF87A, 0xF87A, 0x2587, 0xF87B, 0xF87B, 0x546C, 0xF87C, 0xF87C, 0x2588,
- 0xF87D, 0xF87E, 0x546D, 0xF880, 0xF880, 0x546F, 0xF881, 0xF881, 0x2584,
- 0xF882, 0xF883, 0x5470, 0xF884, 0xF884, 0x21FD, 0xF885, 0xF885, 0x5472,
- 0xF886, 0xF886, 0x21EF, 0xF887, 0xF88C, 0x5473, 0xF88D, 0xF88D, 0x258A,
- 0xF88E, 0xF88E, 0x258C, 0xF88F, 0xF898, 0x5479, 0xF899, 0xF899, 0x1F47,
- 0xF89A, 0xF89C, 0x5483, 0xF89D, 0xF89D, 0x1F1D, 0xF89E, 0xF89F, 0x5486,
- 0xF8A0, 0xF8A0, 0x258D, 0xF940, 0xF94D, 0x5488, 0xF94E, 0xF94E, 0x1FD0,
- 0xF94F, 0xF94F, 0x2592, 0xF950, 0xF950, 0x258F, 0xF951, 0xF958, 0x5496,
- 0xF959, 0xF959, 0x2594, 0xF95A, 0xF95A, 0x1EE0, 0xF95B, 0xF95C, 0x549E,
- 0xF95D, 0xF95D, 0x2591, 0xF95E, 0xF95E, 0x2595, 0xF95F, 0xF966, 0x54A0,
- 0xF967, 0xF967, 0x2597, 0xF968, 0xF968, 0x54A8, 0xF969, 0xF969, 0x20B6,
- 0xF96A, 0xF96B, 0x54A9, 0xF96C, 0xF96C, 0x2598, 0xF96D, 0xF96E, 0x54AB,
- 0xF96F, 0xF96F, 0x20F6, 0xF970, 0xF97E, 0x54AD, 0xF980, 0xF984, 0x54BC,
- 0xF985, 0xF985, 0x2585, 0xF986, 0xF986, 0x54C1, 0xF987, 0xF987, 0x2599,
- 0xF988, 0xF990, 0x54C2, 0xF991, 0xF991, 0x2596, 0xF992, 0xF995, 0x54CB,
- 0xF996, 0xF996, 0x259A, 0xF997, 0xF997, 0x54CF, 0xF998, 0xF998, 0x259B,
- 0xF999, 0xF9A0, 0x54D0, 0xFA40, 0xFA41, 0x54D8, 0xFA42, 0xFA42, 0x259D,
- 0xFA43, 0xFA45, 0x54DA, 0xFA46, 0xFA46, 0x259E, 0xFA47, 0xFA4B, 0x54DD,
- 0xFA4C, 0xFA4C, 0x234C, 0xFA4D, 0xFA50, 0x54E2, 0xFA51, 0xFA51, 0x1F44,
- 0xFA52, 0xFA57, 0x54E6, 0xFA58, 0xFA58, 0x2660, 0xFA59, 0xFA59, 0x25A0,
- 0xFA5A, 0xFA5C, 0x54EC, 0xFA5D, 0xFA5D, 0x259C, 0xFA5E, 0xFA5E, 0x54EF,
- 0xFA5F, 0xFA5F, 0x259F, 0xFA60, 0xFA60, 0x54F0, 0xFA61, 0xFA61, 0x1F6C,
- 0xFA62, 0xFA6F, 0x54F1, 0xFA70, 0xFA70, 0x25A2, 0xFA71, 0xFA73, 0x54FF,
- 0xFA74, 0xFA74, 0x20AE, 0xFA75, 0xFA75, 0x5502, 0xFA76, 0xFA76, 0x258B,
- 0xFA77, 0xFA77, 0x25A3, 0xFA78, 0xFA7E, 0x5503, 0xFA80, 0xFA82, 0x550A,
- 0xFA83, 0xFA83, 0x2589, 0xFA84, 0xFA84, 0x25A5, 0xFA85, 0xFA8C, 0x550D,
- 0xFA8D, 0xFA8D, 0x25A4, 0xFA8E, 0xFA8F, 0x5515, 0xFA90, 0xFA90, 0x25A6,
- 0xFA91, 0xFA91, 0x2593, 0xFA92, 0xFA95, 0x5517, 0xFA96, 0xFA96, 0x25A7,
- 0xFA97, 0xFA97, 0x2222, 0xFA98, 0xFA98, 0x25A9, 0xFA99, 0xFAA0, 0x551B,
- 0xFB40, 0xFB48, 0x5523, 0xFB49, 0xFB49, 0x25A8, 0xFB4A, 0xFB51, 0x552C,
- 0xFB52, 0xFB52, 0x2586, 0xFB53, 0xFB56, 0x5534, 0xFB57, 0xFB57, 0x25A1,
- 0xFB58, 0xFB58, 0x25AA, 0xFB59, 0xFB59, 0x5538, 0xFB5A, 0xFB5A, 0x2590,
- 0xFB5B, 0xFB5B, 0x258E, 0xFB5C, 0xFB74, 0x5539, 0xFB75, 0xFB75, 0x2688,
- 0xFB76, 0xFB78, 0x5552, 0xFB79, 0xFB79, 0x269E, 0xFB7A, 0xFB7A, 0x25FB,
- 0xFB7B, 0xFB7B, 0x5555, 0xFB7C, 0xFB7C, 0x1F8C, 0xFB7D, 0xFB7D, 0x21F4,
- 0xFB7E, 0xFB7E, 0x5556, 0xFB80, 0xFB8F, 0x5557, 0xFB90, 0xFB90, 0x200F,
- 0xFB91, 0xFB9B, 0x5567, 0xFB9C, 0xFB9C, 0x2071, 0xFB9D, 0xFB9E, 0x5572,
- 0xFB9F, 0xFB9F, 0x25F7, 0xFBA0, 0xFBA0, 0x5574, 0xFC40, 0xFC43, 0x5575,
- 0xFC44, 0xFC44, 0x2696, 0xFC45, 0xFC48, 0x5579, 0xFC49, 0xFC49, 0x268F,
- 0xFC4A, 0xFC59, 0x557D, 0xFC5A, 0xFC5A, 0x22DA, 0xFC5B, 0xFC62, 0x558D,
- 0xFC63, 0xFC63, 0x1EC1, 0xFC64, 0xFC67, 0x5595, 0xFC68, 0xFC68, 0x1EB3,
- 0xFC69, 0xFC6E, 0x5599, 0xFC6F, 0xFC6F, 0x266A, 0xFC70, 0xFC70, 0x559F,
- 0xFC71, 0xFC71, 0x268A, 0xFC72, 0xFC73, 0x55A0, 0xFC74, 0xFC74, 0x2669,
- 0xFC75, 0xFC76, 0x55A2, 0xFC77, 0xFC78, 0x2618, 0xFC79, 0xFC7E, 0x55A4,
- 0xFC80, 0xFC82, 0x55AA, 0xFC83, 0xFC83, 0x261A, 0xFC84, 0xFC89, 0x55AD,
- 0xFC8A, 0xFC8A, 0x2673, 0xFC8B, 0xFCA0, 0x55B3, 0xFD40, 0xFD51, 0x55C9,
- 0xFD52, 0xFD52, 0x20C6, 0xFD53, 0xFD53, 0x226B, 0xFD54, 0xFD56, 0x55DB,
- 0xFD57, 0xFD57, 0x24D3, 0xFD58, 0xFD58, 0x1E86, 0xFD59, 0xFD59, 0x55DE,
- 0xFD5A, 0xFD5A, 0x260F, 0xFD5B, 0xFD5E, 0x55DF, 0xFD5F, 0xFD5F, 0x2611,
- 0xFD60, 0xFD61, 0x55E3, 0xFD62, 0xFD62, 0x2613, 0xFD63, 0xFD64, 0x55E5,
- 0xFD65, 0xFD65, 0x2610, 0xFD66, 0xFD66, 0x2612, 0xFD67, 0xFD67, 0x2030,
- 0xFD68, 0xFD68, 0x55E7, 0xFD69, 0xFD69, 0x2671, 0xFD6A, 0xFD6B, 0x55E8,
- 0xFD6C, 0xFD6C, 0x2614, 0xFD6D, 0xFD6F, 0x55EA, 0xFD70, 0xFD70, 0x2616,
- 0xFD71, 0xFD71, 0x55ED, 0xFD72, 0xFD72, 0x2615, 0xFD73, 0xFD77, 0x55EE,
- 0xFD78, 0xFD78, 0x20F2, 0xFD79, 0xFD7C, 0x55F3, 0xFD7D, 0xFD7D, 0x2617,
- 0xFD7E, 0xFD7E, 0x55F7, 0xFD80, 0xFD87, 0x55F8, 0xFD88, 0xFD88, 0x2037,
- 0xFD89, 0xFD8A, 0x5600, 0xFD8B, 0xFD8B, 0x20B3, 0xFD8C, 0xFD8E, 0x5602,
- 0xFD8F, 0xFD8F, 0x1F22, 0xFD90, 0xFD90, 0x24ED, 0xFD91, 0xFD93, 0x5605,
- 0xFD94, 0xFD94, 0x1F34, 0xFD95, 0xFD9C, 0x5608, 0xFD9D, 0xFD9D, 0x0A02,
- 0xFD9E, 0xFD9E, 0x40D3, 0xFD9F, 0xFD9F, 0x200C, 0xFDA0, 0xFDA0, 0x5083,
- 0xFE40, 0xFE40, 0x1259, 0xFE41, 0xFE7E, 0x5610, 0xFE80, 0xFEA0, 0x564E,
-};
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_GBK_EUC_H_2[4071 * 3] = {
+ 0x0020, 0x0020, 0x1E24, 0x0021, 0x007E, 0x032E, 0x8140, 0x8178, 0x2758,
+ 0x8179, 0x8179, 0x2059, 0x817A, 0x817E, 0x2791, 0x8180, 0x8185, 0x2796,
+ 0x8186, 0x8186, 0x21F1, 0x8187, 0x81EC, 0x279C, 0x81ED, 0x81ED, 0x1FF2,
+ 0x81EE, 0x81F5, 0x2802, 0x81F6, 0x81F6, 0x205D, 0x81F7, 0x81FE, 0x280A,
+ 0x8240, 0x8252, 0x2812, 0x8253, 0x8253, 0x269C, 0x8254, 0x8261, 0x2825,
+ 0x8262, 0x8262, 0x21B5, 0x8263, 0x8273, 0x2833, 0x8274, 0x8274, 0x22CC,
+ 0x8275, 0x8279, 0x2844, 0x827A, 0x827A, 0x2016, 0x827B, 0x827C, 0x2849,
+ 0x827D, 0x827D, 0x1E62, 0x827E, 0x827E, 0x284B, 0x8280, 0x8280, 0x1F20,
+ 0x8281, 0x8282, 0x284C, 0x8283, 0x8283, 0x207F, 0x8284, 0x828F, 0x284E,
+ 0x8290, 0x8290, 0x205C, 0x8291, 0x82A4, 0x285A, 0x82A5, 0x82A5, 0x2194,
+ 0x82A6, 0x82C7, 0x286E, 0x82C8, 0x82C8, 0x1E65, 0x82C9, 0x82C9, 0x2281,
+ 0x82CA, 0x82E0, 0x2890, 0x82E1, 0x82E1, 0x22CD, 0x82E2, 0x82E2, 0x28A7,
+ 0x82E3, 0x82E3, 0x210A, 0x82E4, 0x82E4, 0x1E3E, 0x82E5, 0x82EC, 0x28A8,
+ 0x82ED, 0x82ED, 0x267F, 0x82EE, 0x82F1, 0x28B0, 0x82F2, 0x82F2, 0x222E,
+ 0x82F3, 0x82F6, 0x28B4, 0x82F7, 0x82F7, 0x1E96, 0x82F8, 0x82F8, 0x22CB,
+ 0x82F9, 0x82F9, 0x226C, 0x82FA, 0x82FA, 0x28B8, 0x82FB, 0x82FB, 0x2117,
+ 0x82FC, 0x82FE, 0x28B9, 0x8340, 0x8340, 0x28BC, 0x8341, 0x8341, 0x20E8,
+ 0x8342, 0x8344, 0x28BD, 0x8345, 0x8345, 0x22D4, 0x8346, 0x8347, 0x28C0,
+ 0x8348, 0x8348, 0x1FB9, 0x8349, 0x834B, 0x28C2, 0x834C, 0x834C, 0x22D8,
+ 0x834D, 0x8352, 0x28C5, 0x8353, 0x8353, 0x20DF, 0x8354, 0x8356, 0x28CB,
+ 0x8357, 0x8357, 0x20C2, 0x8358, 0x835D, 0x28CE, 0x835E, 0x835E, 0x2195,
+ 0x835F, 0x8364, 0x28D4, 0x8365, 0x8365, 0x1FAC, 0x8366, 0x8366, 0x22D3,
+ 0x8367, 0x8371, 0x28DA, 0x8372, 0x8372, 0x1F81, 0x8373, 0x8377, 0x28E5,
+ 0x8378, 0x8378, 0x2210, 0x8379, 0x8379, 0x28EA, 0x837A, 0x837A, 0x22CF,
+ 0x837B, 0x837B, 0x28EB, 0x837C, 0x837C, 0x2213, 0x837D, 0x837D, 0x28EC,
+ 0x837E, 0x837E, 0x1FE4, 0x8380, 0x8380, 0x1F90, 0x8381, 0x8385, 0x28ED,
+ 0x8386, 0x8386, 0x22D6, 0x8387, 0x8388, 0x28F2, 0x8389, 0x8389, 0x22D0,
+ 0x838A, 0x838A, 0x22CE, 0x838B, 0x838C, 0x28F4, 0x838D, 0x838D, 0x2681,
+ 0x838E, 0x8393, 0x28F6, 0x8394, 0x8394, 0x1E76, 0x8395, 0x839D, 0x28FC,
+ 0x839E, 0x839E, 0x2231, 0x839F, 0x83A5, 0x2905, 0x83A6, 0x83A6, 0x1E93,
+ 0x83A7, 0x83AA, 0x290C, 0x83AB, 0x83AB, 0x22D2, 0x83AC, 0x83AD, 0x2910,
+ 0x83AE, 0x83AE, 0x22D7, 0x83AF, 0x83AF, 0x22D5, 0x83B0, 0x83B0, 0x22D1,
+ 0x83B1, 0x83B9, 0x2912, 0x83BA, 0x83BA, 0x1EE5, 0x83BB, 0x83C8, 0x291B,
+ 0x83C9, 0x83C9, 0x2025, 0x83CA, 0x83F5, 0x2929, 0x83F6, 0x83F6, 0x1ECF,
+ 0x83F7, 0x83FE, 0x2955, 0x8440, 0x844F, 0x295D, 0x8450, 0x8450, 0x1FD9,
+ 0x8451, 0x8470, 0x296D, 0x8471, 0x8471, 0x22C8, 0x8472, 0x8473, 0x298D,
+ 0x8474, 0x8474, 0x2263, 0x8475, 0x8476, 0x298F, 0x8477, 0x8477, 0x2683,
+ 0x8478, 0x847E, 0x2991, 0x8480, 0x8481, 0x2998, 0x8482, 0x8482, 0x1F17,
+ 0x8483, 0x848D, 0x299A, 0x848E, 0x848E, 0x1F2B, 0x848F, 0x8491, 0x29A5,
+ 0x8492, 0x8492, 0x22CA, 0x8493, 0x8493, 0x1E99, 0x8494, 0x849C, 0x29A8,
+ 0x849D, 0x849D, 0x1F4F, 0x849E, 0x84A0, 0x29B1, 0x84A1, 0x84A1, 0x1FCF,
+ 0x84A2, 0x84A2, 0x2036, 0x84A3, 0x84A3, 0x1F3A, 0x84A4, 0x84A4, 0x29B4,
+ 0x84A5, 0x84A5, 0x22C9, 0x84A6, 0x84A6, 0x1F99, 0x84A7, 0x84A8, 0x29B5,
+ 0x84A9, 0x84A9, 0x1F75, 0x84AA, 0x84C4, 0x29B7, 0x84C5, 0x84C5, 0x1FBE,
+ 0x84C6, 0x84D2, 0x29D2, 0x84D3, 0x84D3, 0x1ECD, 0x84D4, 0x84D4, 0x29DF,
+ 0x84D5, 0x84D5, 0x21A9, 0x84D6, 0x84D6, 0x29E0, 0x84D7, 0x84D7, 0x21E6,
+ 0x84D8, 0x84D8, 0x29E1, 0x84D9, 0x84D9, 0x2127, 0x84DA, 0x84DA, 0x2003,
+ 0x84DB, 0x84DC, 0x29E2, 0x84DD, 0x84DD, 0x2132, 0x84DE, 0x84E9, 0x29E4,
+ 0x84EA, 0x84EA, 0x2323, 0x84EB, 0x84ED, 0x29F0, 0x84EE, 0x84EE, 0x2011,
+ 0x84EF, 0x84F0, 0x29F3, 0x84F1, 0x84F1, 0x20F5, 0x84F2, 0x84FE, 0x29F5,
+ 0x8540, 0x8550, 0x2A02, 0x8551, 0x8551, 0x22C5, 0x8552, 0x8552, 0x1F5E,
+ 0x8553, 0x8553, 0x2A13, 0x8554, 0x8554, 0x22C6, 0x8555, 0x855D, 0x2A14,
+ 0x855E, 0x855E, 0x20EF, 0x855F, 0x8565, 0x2A1D, 0x8566, 0x8566, 0x21D0,
+ 0x8567, 0x857E, 0x2A24, 0x8580, 0x8586, 0x2A3C, 0x8587, 0x8587, 0x22C1,
+ 0x8588, 0x858A, 0x2A43, 0x858B, 0x858B, 0x1E64, 0x858C, 0x8591, 0x2A46,
+ 0x8592, 0x8592, 0x21F9, 0x8593, 0x8595, 0x2A4C, 0x8596, 0x8596, 0x2010,
+ 0x8597, 0x8597, 0x2A4F, 0x8598, 0x8598, 0x22C2, 0x8599, 0x85A1, 0x2A50,
+ 0x85A2, 0x85A2, 0x1E5A, 0x85A3, 0x85B1, 0x2A59, 0x85B2, 0x85B2, 0x1EA2,
+ 0x85B3, 0x85FE, 0x2A68, 0x8640, 0x8649, 0x2AB4, 0x864A, 0x864A, 0x236D,
+ 0x864B, 0x8653, 0x2ABE, 0x8654, 0x8654, 0x2247, 0x8655, 0x8667, 0x2AC7,
+ 0x8668, 0x8668, 0x236C, 0x8669, 0x867E, 0x2ADA, 0x8680, 0x8695, 0x2AF0,
+ 0x8696, 0x8696, 0x219C, 0x8697, 0x8698, 0x2B06, 0x8699, 0x8699, 0x20C9,
+ 0x869A, 0x86A0, 0x2B08, 0x86A1, 0x86A1, 0x21F0, 0x86A2, 0x86C9, 0x2B0F,
+ 0x86CA, 0x86CA, 0x210B, 0x86CB, 0x86CB, 0x2B37, 0x86CC, 0x86CC, 0x20DE,
+ 0x86CD, 0x86CD, 0x2B38, 0x86CE, 0x86CE, 0x1EAA, 0x86CF, 0x86D0, 0x2B39,
+ 0x86D1, 0x86D1, 0x222C, 0x86D2, 0x86DB, 0x2B3B, 0x86DC, 0x86DC, 0x20D8,
+ 0x86DD, 0x86DD, 0x22C0, 0x86DE, 0x86E0, 0x2B45, 0x86E1, 0x86E1, 0x206F,
+ 0x86E2, 0x86E7, 0x2B48, 0x86E8, 0x86E8, 0x21A1, 0x86E9, 0x86ED, 0x2B4E,
+ 0x86EE, 0x86EE, 0x2379, 0x86EF, 0x86F3, 0x2B53, 0x86F4, 0x86F4, 0x2372,
+ 0x86F5, 0x86FE, 0x2B58, 0x8740, 0x8740, 0x216A, 0x8741, 0x8743, 0x2B62,
+ 0x8744, 0x8744, 0x237C, 0x8745, 0x8748, 0x2B65, 0x8749, 0x8749, 0x20B0,
+ 0x874A, 0x874A, 0x2B69, 0x874B, 0x874B, 0x237A, 0x874C, 0x874C, 0x1E74,
+ 0x874D, 0x874E, 0x2B6A, 0x874F, 0x874F, 0x2377, 0x8750, 0x8756, 0x2B6C,
+ 0x8757, 0x8757, 0x1F4C, 0x8758, 0x8759, 0x2B73, 0x875A, 0x875A, 0x2378,
+ 0x875B, 0x875B, 0x21CF, 0x875C, 0x875C, 0x2368, 0x875D, 0x875D, 0x2B75,
+ 0x875E, 0x875E, 0x2371, 0x875F, 0x875F, 0x2B76, 0x8760, 0x8760, 0x2369,
+ 0x8761, 0x8765, 0x2B77, 0x8766, 0x8766, 0x2674, 0x8767, 0x8779, 0x2B7C,
+ 0x877A, 0x877A, 0x236F, 0x877B, 0x877C, 0x2B8F, 0x877D, 0x877D, 0x2370,
+ 0x877E, 0x877E, 0x2B91, 0x8780, 0x8780, 0x2B92, 0x8781, 0x8781, 0x2376,
+ 0x8782, 0x8782, 0x2373, 0x8783, 0x8785, 0x2B93, 0x8786, 0x8786, 0x237F,
+ 0x8787, 0x8787, 0x2B96, 0x8788, 0x8788, 0x2374, 0x8789, 0x8789, 0x2B97,
+ 0x878A, 0x878A, 0x20B5, 0x878B, 0x878C, 0x2B98, 0x878D, 0x878D, 0x1EDB,
+ 0x878E, 0x878E, 0x2672, 0x878F, 0x8792, 0x2B9A, 0x8793, 0x8793, 0x236E,
+ 0x8794, 0x8797, 0x2B9E, 0x8798, 0x8798, 0x21B7, 0x8799, 0x879C, 0x2BA2,
+ 0x879D, 0x879D, 0x2375, 0x879E, 0x87A2, 0x2BA6, 0x87A3, 0x87A3, 0x2382,
+ 0x87A4, 0x87A6, 0x2BAB, 0x87A7, 0x87A7, 0x209E, 0x87A8, 0x87B2, 0x2BAE,
+ 0x87B3, 0x87B3, 0x236B, 0x87B4, 0x87B4, 0x2BB9, 0x87B5, 0x87B5, 0x2039,
+ 0x87B6, 0x87BA, 0x2BBA, 0x87BB, 0x87BB, 0x269F, 0x87BC, 0x87BE, 0x2BBF,
+ 0x87BF, 0x87BF, 0x237D, 0x87C0, 0x87C0, 0x21F5, 0x87C1, 0x87C1, 0x2BC2,
+ 0x87C2, 0x87C2, 0x2381, 0x87C3, 0x87C9, 0x2BC3, 0x87CA, 0x87CA, 0x237B,
+ 0x87CB, 0x87CB, 0x237E, 0x87CC, 0x87CC, 0x21CC, 0x87CD, 0x87CE, 0x2BCA,
+ 0x87CF, 0x87CF, 0x22DB, 0x87D0, 0x87D1, 0x2BCC, 0x87D2, 0x87D2, 0x236A,
+ 0x87D3, 0x87D3, 0x2689, 0x87D4, 0x87D4, 0x2BCE, 0x87D5, 0x87D5, 0x2697,
+ 0x87D6, 0x87D9, 0x2BCF, 0x87DA, 0x87DA, 0x22A1, 0x87DB, 0x87F6, 0x2BD3,
+ 0x87F7, 0x87F7, 0x2383, 0x87F8, 0x87F8, 0x1F3D, 0x87F9, 0x87F9, 0x2BEF,
+ 0x87FA, 0x87FA, 0x218F, 0x87FB, 0x87FE, 0x2BF0, 0x8840, 0x8840, 0x2246,
+ 0x8841, 0x8841, 0x2248, 0x8842, 0x8843, 0x2BF4, 0x8844, 0x8844, 0x217E,
+ 0x8845, 0x8845, 0x2BF6, 0x8846, 0x8846, 0x2180, 0x8847, 0x887E, 0x2BF7,
+ 0x8880, 0x88B9, 0x2C2F, 0x88BA, 0x88BA, 0x232A, 0x88BB, 0x88CB, 0x2C69,
+ 0x88CC, 0x88CC, 0x228B, 0x88CD, 0x88D3, 0x2C7A, 0x88D4, 0x88D4, 0x1F85,
+ 0x88D5, 0x88D6, 0x2C81, 0x88D7, 0x88D7, 0x2325, 0x88D8, 0x88DE, 0x2C83,
+ 0x88DF, 0x88DF, 0x232C, 0x88E0, 0x88E4, 0x2C8A, 0x88E5, 0x88E5, 0x232E,
+ 0x88E6, 0x88F1, 0x2C8F, 0x88F2, 0x88F2, 0x2205, 0x88F3, 0x88F3, 0x1E38,
+ 0x88F4, 0x88F5, 0x2C9B, 0x88F6, 0x88F6, 0x1E73, 0x88F7, 0x88FE, 0x2C9D,
+ 0x8940, 0x894A, 0x2CA5, 0x894B, 0x894B, 0x1FE3, 0x894C, 0x894C, 0x2339,
+ 0x894D, 0x894D, 0x2CB0, 0x894E, 0x894E, 0x232B, 0x894F, 0x894F, 0x2CB1,
+ 0x8950, 0x8950, 0x232D, 0x8951, 0x8953, 0x2CB2, 0x8954, 0x8954, 0x217F,
+ 0x8955, 0x895C, 0x2CB5, 0x895D, 0x895D, 0x21A7, 0x895E, 0x895E, 0x2CBD,
+ 0x895F, 0x895F, 0x232F, 0x8960, 0x896C, 0x2CBE, 0x896D, 0x896D, 0x1E7D,
+ 0x896E, 0x8970, 0x2CCB, 0x8971, 0x8971, 0x20D6, 0x8972, 0x897B, 0x2CCE,
+ 0x897C, 0x897C, 0x1EC2, 0x897D, 0x897E, 0x2CD8, 0x8980, 0x898A, 0x2CDA,
+ 0x898B, 0x898B, 0x22B2, 0x898C, 0x8998, 0x2CE5, 0x8999, 0x8999, 0x1EDF,
+ 0x899A, 0x899D, 0x2CF2, 0x899E, 0x899E, 0x1EF9, 0x899F, 0x89A5, 0x2CF6,
+ 0x89A6, 0x89A6, 0x20D9, 0x89A7, 0x89A7, 0x2CFD, 0x89A8, 0x89A8, 0x1FDD,
+ 0x89A9, 0x89AE, 0x2CFE, 0x89AF, 0x89AF, 0x2167, 0x89B0, 0x89B9, 0x2D04,
+ 0x89BA, 0x89BA, 0x21ED, 0x89BB, 0x89BD, 0x2D0E, 0x89BE, 0x89BE, 0x2007,
+ 0x89BF, 0x89BF, 0x2326, 0x89C0, 0x89C0, 0x2329, 0x89C1, 0x89C3, 0x2D11,
+ 0x89C4, 0x89C4, 0x1F52, 0x89C5, 0x89C5, 0x203B, 0x89C6, 0x89C6, 0x2328,
+ 0x89C7, 0x89C7, 0x2D14, 0x89C8, 0x89C8, 0x2327, 0x89C9, 0x89CD, 0x2D15,
+ 0x89CE, 0x89CE, 0x1E2B, 0x89CF, 0x89D0, 0x2D1A, 0x89D1, 0x89D1, 0x22AE,
+ 0x89D2, 0x89D7, 0x2D1C, 0x89D8, 0x89D8, 0x1F49, 0x89D9, 0x89DA, 0x2D22,
+ 0x89DB, 0x89DB, 0x2138, 0x89DC, 0x89F3, 0x2D24, 0x89F4, 0x89F4, 0x2081,
+ 0x89F5, 0x89FE, 0x2D3C, 0x8A40, 0x8A40, 0x2D46, 0x8A41, 0x8A41, 0x1F7C,
+ 0x8A42, 0x8A58, 0x2D47, 0x8A59, 0x8A59, 0x235B, 0x8A5A, 0x8A5A, 0x1EDE,
+ 0x8A5B, 0x8A5B, 0x2D5E, 0x8A5C, 0x8A5C, 0x1FA2, 0x8A5D, 0x8A5D, 0x2D5F,
+ 0x8A5E, 0x8A5E, 0x1EFA, 0x8A5F, 0x8A78, 0x2D60, 0x8A79, 0x8A79, 0x22AD,
+ 0x8A7A, 0x8A7E, 0x2D7A, 0x8A80, 0x8AE3, 0x2D7F, 0x8AE4, 0x8AE4, 0x203F,
+ 0x8AE5, 0x8AFE, 0x2DE3, 0x8B40, 0x8B43, 0x2DFD, 0x8B44, 0x8B44, 0x1F0E,
+ 0x8B45, 0x8B48, 0x2E01, 0x8B49, 0x8B49, 0x23F9, 0x8B4A, 0x8B79, 0x2E05,
+ 0x8B7A, 0x8B7A, 0x23FC, 0x8B7B, 0x8B7E, 0x2E35, 0x8B80, 0x8B8B, 0x2E39,
+ 0x8B8C, 0x8B8C, 0x2069, 0x8B8D, 0x8B9D, 0x2E45, 0x8B9E, 0x8B9E, 0x23F7,
+ 0x8B9F, 0x8BB2, 0x2E56, 0x8BB3, 0x8BB3, 0x23F6, 0x8BB4, 0x8BB8, 0x2E6A,
+ 0x8BB9, 0x8BB9, 0x23FD, 0x8BBA, 0x8BBD, 0x2E6F, 0x8BBE, 0x8BBE, 0x23F8,
+ 0x8BBF, 0x8BC5, 0x2E73, 0x8BC6, 0x8BC6, 0x23FA, 0x8BC7, 0x8BC7, 0x2E7A,
+ 0x8BC8, 0x8BC8, 0x23FE, 0x8BC9, 0x8BC9, 0x1FA8, 0x8BCA, 0x8BD3, 0x2E7B,
+ 0x8BD4, 0x8BD4, 0x2401, 0x8BD5, 0x8BDB, 0x2E85, 0x8BDC, 0x8BDC, 0x23FF,
+ 0x8BDD, 0x8BE4, 0x2E8C, 0x8BE5, 0x8BE5, 0x2400, 0x8BE6, 0x8BEA, 0x2E94,
+ 0x8BEB, 0x8BEB, 0x2221, 0x8BEC, 0x8BEF, 0x2E99, 0x8BF0, 0x8BF0, 0x2122,
+ 0x8BF1, 0x8BFE, 0x2E9D, 0x8C40, 0x8C43, 0x2EAB, 0x8C44, 0x8C44, 0x23FB,
+ 0x8C45, 0x8C4E, 0x2EAF, 0x8C4F, 0x8C4F, 0x215A, 0x8C50, 0x8C56, 0x2EB9,
+ 0x8C57, 0x8C57, 0x21E5, 0x8C58, 0x8C5B, 0x2EC0, 0x8C5C, 0x8C5C, 0x2057,
+ 0x8C5D, 0x8C7E, 0x2EC4, 0x8C80, 0x8C8A, 0x2EE6, 0x8C8B, 0x8C8B, 0x20E5,
+ 0x8C8C, 0x8C8C, 0x2EF1, 0x8C8D, 0x8C8D, 0x212F, 0x8C8E, 0x8C8E, 0x20A3,
+ 0x8C8F, 0x8C8F, 0x2121, 0x8C90, 0x8C90, 0x2EF2, 0x8C91, 0x8C91, 0x21D4,
+ 0x8C92, 0x8C92, 0x1FE5, 0x8C93, 0x8C98, 0x2EF3, 0x8C99, 0x8C99, 0x1E8A,
+ 0x8C9A, 0x8C9A, 0x1E37, 0x8C9B, 0x8CA1, 0x2EF9, 0x8CA2, 0x8CA2, 0x1F9E,
+ 0x8CA3, 0x8CA3, 0x22A6, 0x8CA4, 0x8CA4, 0x21E8, 0x8CA5, 0x8CA5, 0x2F00,
+ 0x8CA6, 0x8CA6, 0x1EDA, 0x8CA7, 0x8CA7, 0x1EB9, 0x8CA8, 0x8CBF, 0x2F01,
+ 0x8CC0, 0x8CC0, 0x235C, 0x8CC1, 0x8CD1, 0x2F19, 0x8CD2, 0x8CD2, 0x2050,
+ 0x8CD3, 0x8CD3, 0x1E67, 0x8CD4, 0x8CD4, 0x2F2A, 0x8CD5, 0x8CD5, 0x23F4,
+ 0x8CD6, 0x8CD8, 0x2F2B, 0x8CD9, 0x8CD9, 0x213E, 0x8CDA, 0x8CF8, 0x2F2E,
+ 0x8CF9, 0x8CF9, 0x1F16, 0x8CFA, 0x8CFE, 0x2F4D, 0x8D40, 0x8D72, 0x2F52,
+ 0x8D73, 0x8D73, 0x2389, 0x8D74, 0x8D74, 0x2F85, 0x8D75, 0x8D75, 0x1EB7,
+ 0x8D76, 0x8D7A, 0x2F86, 0x8D7B, 0x8D7B, 0x21B4, 0x8D7C, 0x8D7E, 0x2F8B,
+ 0x8D80, 0x8D87, 0x2F8E, 0x8D88, 0x8D88, 0x238F, 0x8D89, 0x8D8E, 0x2F96,
+ 0x8D8F, 0x8D8F, 0x1F1A, 0x8D90, 0x8D9D, 0x2F9C, 0x8D9E, 0x8D9E, 0x238B,
+ 0x8D9F, 0x8DB8, 0x2FAA, 0x8DB9, 0x8DB9, 0x238A, 0x8DBA, 0x8DE1, 0x2FC4,
+ 0x8DE2, 0x8DE2, 0x2391, 0x8DE3, 0x8DE3, 0x2FEC, 0x8DE4, 0x8DE4, 0x2271,
+ 0x8DE5, 0x8DE6, 0x2FED, 0x8DE7, 0x8DE7, 0x2388, 0x8DE8, 0x8DF6, 0x2FEF,
+ 0x8DF7, 0x8DF7, 0x238E, 0x8DF8, 0x8DFD, 0x2FFE, 0x8DFE, 0x8DFE, 0x238D,
+ 0x8E40, 0x8E45, 0x3004, 0x8E46, 0x8E46, 0x238C, 0x8E47, 0x8E55, 0x300A,
+ 0x8E56, 0x8E56, 0x2390, 0x8E57, 0x8E57, 0x3019, 0x8E58, 0x8E58, 0x2033,
+ 0x8E59, 0x8E59, 0x301A, 0x8E5A, 0x8E5A, 0x223C, 0x8E5B, 0x8E67, 0x301B,
+ 0x8E68, 0x8E68, 0x1FE9, 0x8E69, 0x8E6D, 0x3028, 0x8E6E, 0x8E6E, 0x2055,
+ 0x8E6F, 0x8E6F, 0x302D, 0x8E70, 0x8E70, 0x2392, 0x8E71, 0x8E7E, 0x302E,
+ 0x8E80, 0x8E80, 0x2324, 0x8E81, 0x8E9A, 0x303C, 0x8E9B, 0x8E9B, 0x2143,
+ 0x8E9C, 0x8E9E, 0x3056, 0x8E9F, 0x8E9F, 0x2129, 0x8EA0, 0x8EA3, 0x3059,
+ 0x8EA4, 0x8EA4, 0x2277, 0x8EA5, 0x8EA6, 0x305D, 0x8EA7, 0x8EA7, 0x1EA7,
+ 0x8EA8, 0x8EAB, 0x305F, 0x8EAC, 0x8EAC, 0x2285, 0x8EAD, 0x8EAD, 0x3063,
+ 0x8EAE, 0x8EAE, 0x2384, 0x8EAF, 0x8EBC, 0x3064, 0x8EBD, 0x8EBD, 0x2387,
+ 0x8EBE, 0x8EBE, 0x2386, 0x8EBF, 0x8EC2, 0x3072, 0x8EC3, 0x8EC3, 0x2290,
+ 0x8EC4, 0x8EC4, 0x3076, 0x8EC5, 0x8EC5, 0x1E44, 0x8EC6, 0x8ECC, 0x3077,
+ 0x8ECD, 0x8ECD, 0x1E32, 0x8ECE, 0x8ECE, 0x2385, 0x8ECF, 0x8ED5, 0x307E,
+ 0x8ED6, 0x8ED6, 0x1F13, 0x8ED7, 0x8ED7, 0x1F73, 0x8ED8, 0x8EEB, 0x3085,
+ 0x8EEC, 0x8EEC, 0x1FE0, 0x8EED, 0x8EFE, 0x3099, 0x8F40, 0x8F51, 0x30AB,
+ 0x8F52, 0x8F52, 0x2087, 0x8F53, 0x8F53, 0x1E78, 0x8F54, 0x8F54, 0x23AE,
+ 0x8F55, 0x8F55, 0x1EF6, 0x8F56, 0x8F56, 0x1F31, 0x8F57, 0x8F5C, 0x30BD,
+ 0x8F5D, 0x8F5D, 0x2045, 0x8F5E, 0x8F63, 0x30C3, 0x8F64, 0x8F64, 0x2178,
+ 0x8F65, 0x8F7E, 0x30C9, 0x8F80, 0x8F85, 0x30E3, 0x8F86, 0x8F86, 0x23F5,
+ 0x8F87, 0x8F87, 0x30E9, 0x8F88, 0x8F88, 0x2275, 0x8F89, 0x8F94, 0x30EA,
+ 0x8F95, 0x8F95, 0x266E, 0x8F96, 0x8F96, 0x30F6, 0x8F97, 0x8F97, 0x1EB0,
+ 0x8F98, 0x8F9A, 0x30F7, 0x8F9B, 0x8F9B, 0x2083, 0x8F9C, 0x8F9C, 0x30FA,
+ 0x8F9D, 0x8F9D, 0x2188, 0x8F9E, 0x8FA0, 0x30FB, 0x8FA1, 0x8FA1, 0x267C,
+ 0x8FA2, 0x8FBC, 0x30FE, 0x8FBD, 0x8FBD, 0x1FC5, 0x8FBE, 0x8FC3, 0x3119,
+ 0x8FC4, 0x8FC4, 0x1EA1, 0x8FC5, 0x8FC5, 0x311F, 0x8FC6, 0x8FC6, 0x2393,
+ 0x8FC7, 0x8FCC, 0x3120, 0x8FCD, 0x8FCD, 0x1F0B, 0x8FCE, 0x8FD7, 0x3126,
+ 0x8FD8, 0x8FD8, 0x1E7C, 0x8FD9, 0x8FFE, 0x3130, 0x9040, 0x907E, 0x3156,
+ 0x9080, 0x909C, 0x3195, 0x909D, 0x909D, 0x23B4, 0x909E, 0x909E, 0x207E,
+ 0x909F, 0x90B9, 0x31B2, 0x90BA, 0x90BA, 0x1EE3, 0x90BB, 0x90BF, 0x31CD,
+ 0x90C0, 0x90C0, 0x2095, 0x90C1, 0x90C1, 0x23BB, 0x90C2, 0x90C4, 0x31D2,
+ 0x90C5, 0x90C5, 0x23B9, 0x90C6, 0x90DA, 0x31D5, 0x90DB, 0x90DB, 0x1E28,
+ 0x90DC, 0x90DC, 0x23BD, 0x90DD, 0x90EC, 0x31EA, 0x90ED, 0x90ED, 0x23B5,
+ 0x90EE, 0x90EF, 0x31FA, 0x90F0, 0x90F0, 0x23BA, 0x90F1, 0x90F6, 0x31FC,
+ 0x90F7, 0x90F7, 0x23B3, 0x90F8, 0x90FE, 0x3202, 0x9140, 0x9141, 0x3209,
+ 0x9142, 0x9142, 0x2162, 0x9143, 0x914A, 0x320B, 0x914B, 0x914B, 0x1E5E,
+ 0x914C, 0x914C, 0x3213, 0x914D, 0x914D, 0x1E5D, 0x914E, 0x9150, 0x3214,
+ 0x9151, 0x9151, 0x23B7, 0x9152, 0x9153, 0x3217, 0x9154, 0x9154, 0x1F2F,
+ 0x9155, 0x9155, 0x24DF, 0x9156, 0x9158, 0x3219, 0x9159, 0x9159, 0x23B2,
+ 0x915A, 0x915A, 0x214E, 0x915B, 0x915C, 0x321C, 0x915D, 0x915D, 0x2052,
+ 0x915E, 0x9160, 0x321E, 0x9161, 0x9161, 0x23BC, 0x9162, 0x9162, 0x3221,
+ 0x9163, 0x9163, 0x20EB, 0x9164, 0x916D, 0x3222, 0x916E, 0x916E, 0x2232,
+ 0x916F, 0x9175, 0x322C, 0x9176, 0x9176, 0x1E3F, 0x9177, 0x9179, 0x3233,
+ 0x917A, 0x917A, 0x201B, 0x917B, 0x917B, 0x20BC, 0x917C, 0x917C, 0x23BE,
+ 0x917D, 0x917E, 0x3236, 0x9180, 0x9183, 0x3238, 0x9184, 0x9184, 0x1EAE,
+ 0x9185, 0x918C, 0x323C, 0x918D, 0x918D, 0x1EFB, 0x918E, 0x9190, 0x3244,
+ 0x9191, 0x9191, 0x2089, 0x9192, 0x9192, 0x3247, 0x9193, 0x9193, 0x23B1,
+ 0x9194, 0x9196, 0x3248, 0x9197, 0x9197, 0x21C4, 0x9198, 0x919A, 0x324B,
+ 0x919B, 0x919B, 0x2214, 0x919C, 0x91A8, 0x324E, 0x91A9, 0x91A9, 0x1FDE,
+ 0x91AA, 0x91AA, 0x2223, 0x91AB, 0x91AB, 0x23B6, 0x91AC, 0x91B9, 0x325B,
+ 0x91BA, 0x91BA, 0x268C, 0x91BB, 0x91BB, 0x24DE, 0x91BC, 0x91BE, 0x3269,
+ 0x91BF, 0x91BF, 0x24E0, 0x91C0, 0x91C2, 0x326C, 0x91C3, 0x91C3, 0x23B8,
+ 0x91C4, 0x91CC, 0x326F, 0x91CD, 0x91CD, 0x1E81, 0x91CE, 0x91CF, 0x3278,
+ 0x91D0, 0x91D0, 0x1FFE, 0x91D1, 0x91D1, 0x1F51, 0x91D2, 0x91D2, 0x21E1,
+ 0x91D3, 0x91D3, 0x327A, 0x91D4, 0x91D4, 0x23B0, 0x91D5, 0x91D5, 0x327B,
+ 0x91D6, 0x91D6, 0x1FCE, 0x91D7, 0x91D7, 0x327C, 0x91D8, 0x91D8, 0x211E,
+ 0x91D9, 0x91D9, 0x2021, 0x91DA, 0x91DE, 0x327D, 0x91DF, 0x91DF, 0x24E1,
+ 0x91E0, 0x91E1, 0x3282, 0x91E2, 0x91E2, 0x24A3, 0x91E3, 0x91E9, 0x3284,
+ 0x91EA, 0x91EA, 0x24A4, 0x91EB, 0x91EF, 0x328B, 0x91F0, 0x91F0, 0x2273,
+ 0x91F1, 0x91F1, 0x3290, 0x91F2, 0x91F2, 0x21B0, 0x91F3, 0x91FE, 0x3291,
+ 0x9240, 0x927E, 0x329D, 0x9280, 0x92B5, 0x32DC, 0x92B6, 0x92B6, 0x21D1,
+ 0x92B7, 0x92CD, 0x3312, 0x92CE, 0x92CE, 0x211C, 0x92CF, 0x92CF, 0x3329,
+ 0x92D0, 0x92D0, 0x235D, 0x92D1, 0x92D3, 0x332A, 0x92D4, 0x92D4, 0x2682,
+ 0x92D5, 0x92DE, 0x332D, 0x92DF, 0x92DF, 0x210D, 0x92E0, 0x92E0, 0x205A,
+ 0x92E1, 0x92FD, 0x3337, 0x92FE, 0x92FE, 0x1F8D, 0x9340, 0x934F, 0x3354,
+ 0x9350, 0x9350, 0x21FF, 0x9351, 0x935C, 0x3364, 0x935D, 0x935D, 0x1F58,
+ 0x935E, 0x936F, 0x3370, 0x9370, 0x9370, 0x215B, 0x9371, 0x9375, 0x3382,
+ 0x9376, 0x9376, 0x1EB6, 0x9377, 0x937E, 0x3387, 0x9380, 0x938B, 0x338F,
+ 0x938C, 0x938C, 0x20DB, 0x938D, 0x939C, 0x339B, 0x939D, 0x939D, 0x2360,
+ 0x939E, 0x93A4, 0x33AB, 0x93A5, 0x93A5, 0x2361, 0x93A6, 0x93A6, 0x33B2,
+ 0x93A7, 0x93A7, 0x2040, 0x93A8, 0x93B3, 0x33B3, 0x93B4, 0x93B4, 0x228E,
+ 0x93B5, 0x93B7, 0x33BF, 0x93B8, 0x93B8, 0x1FDF, 0x93B9, 0x93BA, 0x33C2,
+ 0x93BB, 0x93BB, 0x235E, 0x93BC, 0x93BC, 0x33C4, 0x93BD, 0x93BD, 0x1E6A,
+ 0x93BE, 0x93C5, 0x33C5, 0x93C6, 0x93C6, 0x2002, 0x93C7, 0x93CE, 0x33CD,
+ 0x93CF, 0x93CF, 0x2093, 0x93D0, 0x93D6, 0x33D5, 0x93D7, 0x93D7, 0x235F,
+ 0x93D8, 0x93DA, 0x33DC, 0x93DB, 0x93DB, 0x1EAC, 0x93DC, 0x93DC, 0x1E54,
+ 0x93DD, 0x93E0, 0x33DF, 0x93E1, 0x93E1, 0x1F08, 0x93E2, 0x93E3, 0x33E3,
+ 0x93E4, 0x93E4, 0x20C0, 0x93E5, 0x93E5, 0x2362, 0x93E6, 0x93E8, 0x33E5,
+ 0x93E9, 0x93E9, 0x2160, 0x93EA, 0x93EA, 0x33E8, 0x93EB, 0x93EB, 0x219D,
+ 0x93EC, 0x93EC, 0x1F8E, 0x93ED, 0x93ED, 0x222D, 0x93EE, 0x93EE, 0x33E9,
+ 0x93EF, 0x93EF, 0x2047, 0x93F0, 0x93F0, 0x33EA, 0x93F1, 0x93F1, 0x2262,
+ 0x93F2, 0x93F3, 0x33EB, 0x93F4, 0x93F4, 0x1F67, 0x93F5, 0x93F5, 0x1EB2,
+ 0x93F6, 0x93F9, 0x33ED, 0x93FA, 0x93FA, 0x1EA9, 0x93FB, 0x93FD, 0x33F1,
+ 0x93FE, 0x93FE, 0x1FCC, 0x9440, 0x9443, 0x33F4, 0x9444, 0x9444, 0x1F72,
+ 0x9445, 0x944C, 0x33F8, 0x944D, 0x944D, 0x2098, 0x944E, 0x944F, 0x3400,
+ 0x9450, 0x9450, 0x1E52, 0x9451, 0x9451, 0x20A4, 0x9452, 0x9452, 0x1F1C,
+ 0x9453, 0x9453, 0x228F, 0x9454, 0x9454, 0x3402, 0x9455, 0x9455, 0x1FED,
+ 0x9456, 0x9457, 0x3403, 0x9458, 0x9458, 0x2365, 0x9459, 0x945A, 0x3405,
+ 0x945B, 0x945B, 0x1E2D, 0x945C, 0x945C, 0x2152, 0x945D, 0x945D, 0x2366,
+ 0x945E, 0x945E, 0x3407, 0x945F, 0x945F, 0x20FA, 0x9460, 0x9463, 0x3408,
+ 0x9464, 0x9464, 0x2363, 0x9465, 0x9465, 0x340C, 0x9466, 0x9466, 0x209A,
+ 0x9467, 0x946D, 0x340D, 0x946E, 0x946E, 0x203C, 0x946F, 0x9471, 0x3414,
+ 0x9472, 0x9472, 0x1FF6, 0x9473, 0x9473, 0x3417, 0x9474, 0x9474, 0x2364,
+ 0x9475, 0x9475, 0x3418, 0x9476, 0x9476, 0x1E69, 0x9477, 0x9477, 0x3419,
+ 0x9478, 0x9478, 0x2367, 0x9479, 0x9479, 0x341A, 0x947A, 0x947A, 0x211D,
+ 0x947B, 0x947E, 0x341B, 0x9480, 0x9480, 0x2259, 0x9481, 0x9481, 0x2056,
+ 0x9482, 0x9482, 0x2163, 0x9483, 0x9486, 0x341F, 0x9487, 0x9487, 0x1FA9,
+ 0x9488, 0x9488, 0x1FFC, 0x9489, 0x94A0, 0x3423, 0x94A1, 0x94A1, 0x1E2E,
+ 0x94A2, 0x94B2, 0x343B, 0x94B3, 0x94B3, 0x1EBC, 0x94B4, 0x94B4, 0x344C,
+ 0x94B5, 0x94B5, 0x2142, 0x94B6, 0x94BE, 0x344D, 0x94BF, 0x94BF, 0x201E,
+ 0x94C0, 0x94C0, 0x1E43, 0x94C1, 0x94CB, 0x3456, 0x94CC, 0x94CC, 0x24D4,
+ 0x94CD, 0x94D7, 0x3461, 0x94D8, 0x94D8, 0x226F, 0x94D9, 0x94DF, 0x346C,
+ 0x94E0, 0x94E0, 0x1ED7, 0x94E1, 0x94FE, 0x3473, 0x9540, 0x9571, 0x3491,
+ 0x9572, 0x9572, 0x212D, 0x9573, 0x957E, 0x34C3, 0x9580, 0x9582, 0x34CF,
+ 0x9583, 0x9583, 0x229B, 0x9584, 0x959D, 0x34D2, 0x959E, 0x959E, 0x2256,
+ 0x959F, 0x959F, 0x24A8, 0x95A0, 0x95B2, 0x34EC, 0x95B3, 0x95B3, 0x1E79,
+ 0x95B4, 0x95B9, 0x34FF, 0x95BA, 0x95BA, 0x225A, 0x95BB, 0x95CE, 0x3505,
+ 0x95CF, 0x95CF, 0x24A7, 0x95D0, 0x95D0, 0x3519, 0x95D1, 0x95D1, 0x2686,
+ 0x95D2, 0x95D2, 0x24A6, 0x95D3, 0x95D3, 0x351A, 0x95D4, 0x95D4, 0x21CE,
+ 0x95D5, 0x95E0, 0x351B, 0x95E1, 0x95E1, 0x24A9, 0x95E2, 0x95E6, 0x3527,
+ 0x95E7, 0x95E7, 0x1FE7, 0x95E8, 0x95F0, 0x352C, 0x95F1, 0x95F1, 0x2112,
+ 0x95F2, 0x95F7, 0x3535, 0x95F8, 0x95F8, 0x213C, 0x95F9, 0x95FD, 0x353B,
+ 0x95FE, 0x95FE, 0x1F5C, 0x9640, 0x9655, 0x3540, 0x9656, 0x9656, 0x24C4,
+ 0x9657, 0x967B, 0x3556, 0x967C, 0x967C, 0x1ECC, 0x967D, 0x967E, 0x357B,
+ 0x9680, 0x96FE, 0x357D, 0x9740, 0x9766, 0x35FC, 0x9767, 0x9767, 0x246A,
+ 0x9768, 0x976B, 0x3623, 0x976C, 0x976C, 0x2175, 0x976D, 0x976D, 0x3627,
+ 0x976E, 0x976E, 0x246D, 0x976F, 0x977E, 0x3628, 0x9780, 0x9795, 0x3638,
+ 0x9796, 0x9796, 0x246B, 0x9797, 0x9797, 0x225F, 0x9798, 0x979C, 0x364E,
+ 0x979D, 0x979D, 0x1ECE, 0x979E, 0x97A2, 0x3653, 0x97A3, 0x97A3, 0x2272,
+ 0x97A4, 0x97BE, 0x3658, 0x97BF, 0x97BF, 0x2473, 0x97C0, 0x97ED, 0x3673,
+ 0x97EE, 0x97EE, 0x21FE, 0x97EF, 0x97F6, 0x36A1, 0x97F7, 0x97F7, 0x1EFE,
+ 0x97F8, 0x97FE, 0x36A9, 0x9840, 0x9844, 0x36B0, 0x9845, 0x9845, 0x2475,
+ 0x9846, 0x9848, 0x36B5, 0x9849, 0x9849, 0x220A, 0x984A, 0x984E, 0x36B8,
+ 0x984F, 0x984F, 0x1F6F, 0x9850, 0x9870, 0x36BD, 0x9871, 0x9871, 0x2468,
+ 0x9872, 0x9872, 0x36DE, 0x9873, 0x9873, 0x2100, 0x9874, 0x987E, 0x36DF,
+ 0x9880, 0x9880, 0x36EA, 0x9881, 0x9881, 0x2476, 0x9882, 0x988A, 0x36EB,
+ 0x988B, 0x988B, 0x1F27, 0x988C, 0x988C, 0x20D7, 0x988D, 0x989F, 0x36F4,
+ 0x98A0, 0x98A0, 0x247C, 0x98A1, 0x98A9, 0x3707, 0x98AA, 0x98AA, 0x1FA1,
+ 0x98AB, 0x98B5, 0x3710, 0x98B6, 0x98B6, 0x22AA, 0x98B7, 0x98B7, 0x2005,
+ 0x98B8, 0x98B9, 0x371B, 0x98BA, 0x98BA, 0x246C, 0x98BB, 0x98C6, 0x371D,
+ 0x98C7, 0x98C7, 0x203E, 0x98C8, 0x98CA, 0x3729, 0x98CB, 0x98CB, 0x1E4C,
+ 0x98CC, 0x98CF, 0x372C, 0x98D0, 0x98D0, 0x213A, 0x98D1, 0x98D2, 0x3730,
+ 0x98D3, 0x98D3, 0x2204, 0x98D4, 0x98E2, 0x3732, 0x98E3, 0x98E3, 0x20C3,
+ 0x98E4, 0x98E4, 0x2140, 0x98E5, 0x98E5, 0x2477, 0x98E6, 0x98EE, 0x3741,
+ 0x98EF, 0x98EF, 0x2474, 0x98F0, 0x98F1, 0x374A, 0x98F2, 0x98F2, 0x20DD,
+ 0x98F3, 0x98FE, 0x374C, 0x9940, 0x9942, 0x3758, 0x9943, 0x9943, 0x1F68,
+ 0x9944, 0x9944, 0x375B, 0x9945, 0x9945, 0x2185, 0x9946, 0x9965, 0x375C,
+ 0x9966, 0x9966, 0x2472, 0x9967, 0x996D, 0x377C, 0x996E, 0x996E, 0x1EB5,
+ 0x996F, 0x9974, 0x3783, 0x9975, 0x9975, 0x2478, 0x9976, 0x9979, 0x3789,
+ 0x997A, 0x997A, 0x1F8B, 0x997B, 0x997B, 0x2484, 0x997C, 0x997E, 0x378D,
+ 0x9980, 0x9984, 0x3790, 0x9985, 0x9985, 0x2699, 0x9986, 0x9988, 0x3795,
+ 0x9989, 0x9989, 0x2482, 0x998A, 0x998D, 0x3798, 0x998E, 0x998E, 0x20A1,
+ 0x998F, 0x9990, 0x379C, 0x9991, 0x9991, 0x1F92, 0x9992, 0x9998, 0x379E,
+ 0x9999, 0x9999, 0x1F38, 0x999A, 0x99A8, 0x37A5, 0x99A9, 0x99A9, 0x2485,
+ 0x99AA, 0x99AF, 0x37B4, 0x99B0, 0x99B0, 0x2480, 0x99B1, 0x99B1, 0x246E,
+ 0x99B2, 0x99B2, 0x37BA, 0x99B3, 0x99B3, 0x247B, 0x99B4, 0x99B4, 0x2486,
+ 0x99B5, 0x99B5, 0x2471, 0x99B6, 0x99BC, 0x37BB, 0x99BD, 0x99BD, 0x2483,
+ 0x99BE, 0x99BE, 0x2470, 0x99BF, 0x99BF, 0x37C2, 0x99C0, 0x99C0, 0x2469,
+ 0x99C1, 0x99C1, 0x37C3, 0x99C2, 0x99C2, 0x247F, 0x99C3, 0x99C8, 0x37C4,
+ 0x99C9, 0x99C9, 0x246F, 0x99CA, 0x99CD, 0x37CA, 0x99CE, 0x99CE, 0x2481,
+ 0x99CF, 0x99D0, 0x37CE, 0x99D1, 0x99D1, 0x2220, 0x99D2, 0x99D9, 0x37D0,
+ 0x99DA, 0x99DA, 0x1FF5, 0x99DB, 0x99DF, 0x37D8, 0x99E0, 0x99E0, 0x20F4,
+ 0x99E1, 0x99E4, 0x37DD, 0x99E5, 0x99E5, 0x247D, 0x99E6, 0x99E7, 0x37E1,
+ 0x99E8, 0x99E8, 0x2479, 0x99E9, 0x99EB, 0x37E3, 0x99EC, 0x99EC, 0x247E,
+ 0x99ED, 0x99F3, 0x37E6, 0x99F4, 0x99F4, 0x247A, 0x99F5, 0x99FE, 0x37ED,
+ 0x9A40, 0x9A49, 0x37F7, 0x9A4A, 0x9A4A, 0x20E3, 0x9A4B, 0x9A56, 0x3801,
+ 0x9A57, 0x9A57, 0x20AD, 0x9A58, 0x9A64, 0x380D, 0x9A65, 0x9A65, 0x24CB,
+ 0x9A66, 0x9A66, 0x381A, 0x9A67, 0x9A67, 0x1F53, 0x9A68, 0x9A70, 0x381B,
+ 0x9A71, 0x9A71, 0x2159, 0x9A72, 0x9A75, 0x3824, 0x9A76, 0x9A76, 0x2013,
+ 0x9A77, 0x9A77, 0x1F33, 0x9A78, 0x9A7E, 0x3828, 0x9A80, 0x9A87, 0x382F,
+ 0x9A88, 0x9A88, 0x1E5C, 0x9A89, 0x9A8B, 0x3837, 0x9A8C, 0x9A8C, 0x2488,
+ 0x9A8D, 0x9A90, 0x383A, 0x9A91, 0x9A91, 0x2487, 0x9A92, 0x9A96, 0x383E,
+ 0x9A97, 0x9A97, 0x248A, 0x9A98, 0x9A99, 0x3843, 0x9A9A, 0x9A9A, 0x2489,
+ 0x9A9B, 0x9A9B, 0x248B, 0x9A9C, 0x9A9D, 0x3845, 0x9A9E, 0x9A9E, 0x1F83,
+ 0x9A9F, 0x9AA1, 0x3847, 0x9AA2, 0x9AA2, 0x210F, 0x9AA3, 0x9AA3, 0x1FDB,
+ 0x9AA4, 0x9AA9, 0x384A, 0x9AAA, 0x9AAA, 0x20AF, 0x9AAB, 0x9ACF, 0x3850,
+ 0x9AD0, 0x9AD0, 0x24C0, 0x9AD1, 0x9AD5, 0x3875, 0x9AD6, 0x9AD6, 0x226D,
+ 0x9AD7, 0x9AD9, 0x387A, 0x9ADA, 0x9ADA, 0x24C1, 0x9ADB, 0x9AE1, 0x387D,
+ 0x9AE2, 0x9AE2, 0x20CA, 0x9AE3, 0x9AE3, 0x3884, 0x9AE4, 0x9AE4, 0x20E7,
+ 0x9AE5, 0x9AE5, 0x24C2, 0x9AE6, 0x9AFE, 0x3885, 0x9B40, 0x9B7E, 0x389E,
+ 0x9B80, 0x9BD0, 0x38DD, 0x9BD1, 0x9BD1, 0x23DC, 0x9BD2, 0x9BDB, 0x392E,
+ 0x9BDC, 0x9BDC, 0x23DB, 0x9BDD, 0x9BFE, 0x3938, 0x9C40, 0x9C52, 0x395A,
+ 0x9C53, 0x9C53, 0x205E, 0x9C54, 0x9C58, 0x396D, 0x9C59, 0x9C59, 0x2244,
+ 0x9C5A, 0x9C5A, 0x23E2, 0x9C5B, 0x9C5B, 0x3972, 0x9C5C, 0x9C5C, 0x20D4,
+ 0x9C5D, 0x9C74, 0x3973, 0x9C75, 0x9C75, 0x219F, 0x9C76, 0x9C78, 0x398B,
+ 0x9C79, 0x9C79, 0x1E66, 0x9C7A, 0x9C7E, 0x398E, 0x9C80, 0x9C85, 0x3993,
+ 0x9C86, 0x9C86, 0x1F63, 0x9C87, 0x9C9C, 0x3999, 0x9C9D, 0x9C9D, 0x23DD,
+ 0x9C9E, 0x9CAA, 0x39AF, 0x9CAB, 0x9CAB, 0x216B, 0x9CAC, 0x9CC9, 0x39BC,
+ 0x9CCA, 0x9CCA, 0x22B5, 0x9CCB, 0x9CCE, 0x39DA, 0x9CCF, 0x9CCF, 0x1F26,
+ 0x9CD0, 0x9CE5, 0x39DE, 0x9CE6, 0x9CE6, 0x1E63, 0x9CE7, 0x9CE7, 0x2088,
+ 0x9CE8, 0x9CEB, 0x39F4, 0x9CEC, 0x9CEC, 0x1EBD, 0x9CED, 0x9CED, 0x39F8,
+ 0x9CEE, 0x9CEE, 0x2341, 0x9CEF, 0x9CFA, 0x39F9, 0x9CFB, 0x9CFB, 0x1F4B,
+ 0x9CFC, 0x9CFD, 0x3A05, 0x9CFE, 0x9CFE, 0x2292, 0x9D40, 0x9D41, 0x3A07,
+ 0x9D42, 0x9D42, 0x2124, 0x9D43, 0x9D45, 0x3A09, 0x9D46, 0x9D46, 0x2048,
+ 0x9D47, 0x9D47, 0x23E0, 0x9D48, 0x9D4C, 0x3A0C, 0x9D4D, 0x9D4D, 0x2077,
+ 0x9D4E, 0x9D4E, 0x3A11, 0x9D4F, 0x9D4F, 0x223A, 0x9D50, 0x9D60, 0x3A12,
+ 0x9D61, 0x9D61, 0x20B1, 0x9D62, 0x9D67, 0x3A23, 0x9D68, 0x9D68, 0x1F41,
+ 0x9D69, 0x9D69, 0x201C, 0x9D6A, 0x9D6D, 0x3A29, 0x9D6E, 0x9D6E, 0x22B8,
+ 0x9D6F, 0x9D70, 0x3A2D, 0x9D71, 0x9D71, 0x2276, 0x9D72, 0x9D74, 0x3A2F,
+ 0x9D75, 0x9D75, 0x1F9B, 0x9D76, 0x9D7A, 0x3A32, 0x9D7B, 0x9D7B, 0x1F9F,
+ 0x9D7C, 0x9D7C, 0x3A37, 0x9D7D, 0x9D7D, 0x25CA, 0x9D7E, 0x9D7E, 0x3A38,
+ 0x9D80, 0x9D89, 0x3A39, 0x9D8A, 0x9D8A, 0x20BE, 0x9D8B, 0x9D8C, 0x3A43,
+ 0x9D8D, 0x9D8D, 0x1FB4, 0x9D8E, 0x9D90, 0x3A45, 0x9D91, 0x9D91, 0x23D7,
+ 0x9D92, 0x9D98, 0x3A48, 0x9D99, 0x9D99, 0x2105, 0x9D9A, 0x9DA0, 0x3A4F,
+ 0x9DA1, 0x9DA1, 0x23E1, 0x9DA2, 0x9DA2, 0x1FEC, 0x9DA3, 0x9DA6, 0x3A56,
+ 0x9DA7, 0x9DA7, 0x23EA, 0x9DA8, 0x9DAB, 0x3A5A, 0x9DAC, 0x9DAC, 0x23E3,
+ 0x9DAD, 0x9DAD, 0x210E, 0x9DAE, 0x9DB1, 0x3A5E, 0x9DB2, 0x9DB2, 0x1FA6,
+ 0x9DB3, 0x9DB3, 0x2004, 0x9DB4, 0x9DBD, 0x3A62, 0x9DBE, 0x9DBE, 0x1F9D,
+ 0x9DBF, 0x9DC5, 0x3A6C, 0x9DC6, 0x9DC6, 0x23E5, 0x9DC7, 0x9DC8, 0x3A73,
+ 0x9DC9, 0x9DC9, 0x2264, 0x9DCA, 0x9DCC, 0x3A75, 0x9DCD, 0x9DCD, 0x24E2,
+ 0x9DCE, 0x9DD1, 0x3A78, 0x9DD2, 0x9DD2, 0x23DE, 0x9DD3, 0x9DD4, 0x3A7C,
+ 0x9DD5, 0x9DD5, 0x1EC4, 0x9DD6, 0x9DE0, 0x3A7E, 0x9DE1, 0x9DE1, 0x22B6,
+ 0x9DE2, 0x9DE2, 0x20A9, 0x9DE3, 0x9DF0, 0x3A89, 0x9DF1, 0x9DF1, 0x212B,
+ 0x9DF2, 0x9DF3, 0x3A97, 0x9DF4, 0x9DF4, 0x20A5, 0x9DF5, 0x9DF6, 0x3A99,
+ 0x9DF7, 0x9DF7, 0x268B, 0x9DF8, 0x9DF9, 0x3A9B, 0x9DFA, 0x9DFA, 0x1F76,
+ 0x9DFB, 0x9DFC, 0x3A9D, 0x9DFD, 0x9DFD, 0x216D, 0x9DFE, 0x9DFE, 0x3A9F,
+ 0x9E40, 0x9E44, 0x3AA0, 0x9E45, 0x9E45, 0x2001, 0x9E46, 0x9E47, 0x3AA5,
+ 0x9E48, 0x9E48, 0x2191, 0x9E49, 0x9E49, 0x1E50, 0x9E4A, 0x9E51, 0x3AA7,
+ 0x9E52, 0x9E52, 0x1F9C, 0x9E53, 0x9E53, 0x3AAF, 0x9E54, 0x9E54, 0x23DA,
+ 0x9E55, 0x9E55, 0x3AB0, 0x9E56, 0x9E56, 0x2053, 0x9E57, 0x9E5C, 0x3AB1,
+ 0x9E5D, 0x9E5D, 0x23E9, 0x9E5E, 0x9E5E, 0x23E4, 0x9E5F, 0x9E60, 0x3AB7,
+ 0x9E61, 0x9E61, 0x21D5, 0x9E62, 0x9E62, 0x3AB9, 0x9E63, 0x9E63, 0x23E6,
+ 0x9E64, 0x9E66, 0x3ABA, 0x9E67, 0x9E67, 0x23DF, 0x9E68, 0x9E6B, 0x3ABD,
+ 0x9E6C, 0x9E6C, 0x1E4F, 0x9E6D, 0x9E6E, 0x3AC1, 0x9E6F, 0x9E6F, 0x23D9,
+ 0x9E70, 0x9E71, 0x3AC3, 0x9E72, 0x9E72, 0x2014, 0x9E73, 0x9E73, 0x3AC5,
+ 0x9E74, 0x9E74, 0x23EC, 0x9E75, 0x9E75, 0x23EB, 0x9E76, 0x9E7A, 0x3AC6,
+ 0x9E7B, 0x9E7B, 0x23D8, 0x9E7C, 0x9E7C, 0x23EE, 0x9E7D, 0x9E7E, 0x3ACB,
+ 0x9E80, 0x9E84, 0x3ACD, 0x9E85, 0x9E85, 0x268E, 0x9E86, 0x9E86, 0x3AD2,
+ 0x9E87, 0x9E87, 0x23ED, 0x9E88, 0x9E90, 0x3AD3, 0x9E91, 0x9E91, 0x1FFA,
+ 0x9E92, 0x9E95, 0x3ADC, 0x9E96, 0x9E96, 0x23D6, 0x9E97, 0x9E97, 0x23E8,
+ 0x9E98, 0x9EA1, 0x3AE0, 0x9EA2, 0x9EA2, 0x2106, 0x9EA3, 0x9EA5, 0x3AEA,
+ 0x9EA6, 0x9EA6, 0x200B, 0x9EA7, 0x9EA8, 0x3AED, 0x9EA9, 0x9EA9, 0x2166,
+ 0x9EAA, 0x9EAD, 0x3AEF, 0x9EAE, 0x9EAE, 0x23EF, 0x9EAF, 0x9EB2, 0x3AF3,
+ 0x9EB3, 0x9EB3, 0x2189, 0x9EB4, 0x9EB4, 0x2058, 0x9EB5, 0x9EB6, 0x3AF7,
+ 0x9EB7, 0x9EB7, 0x23E7, 0x9EB8, 0x9EF4, 0x3AF9, 0x9EF5, 0x9EF5, 0x21A3,
+ 0x9EF6, 0x9EFE, 0x3B36, 0x9F40, 0x9F4D, 0x3B3F, 0x9F4E, 0x9F4E, 0x217A,
+ 0x9F4F, 0x9F6E, 0x3B4D, 0x9F6F, 0x9F6F, 0x21A5, 0x9F70, 0x9F7E, 0x3B6D,
+ 0x9F80, 0x9F91, 0x3B7C, 0x9F92, 0x9F92, 0x2022, 0x9F93, 0x9F97, 0x3B8E,
+ 0x9F98, 0x9F98, 0x24D6, 0x9F99, 0x9FA5, 0x3B93, 0x9FA6, 0x9FA6, 0x233A,
+ 0x9FA7, 0x9FA8, 0x3BA0, 0x9FA9, 0x9FA9, 0x1EEE, 0x9FAA, 0x9FAB, 0x3BA2,
+ 0x9FAC, 0x9FAC, 0x24D5, 0x9FAD, 0x9FC8, 0x3BA4, 0x9FC9, 0x9FC9, 0x2228,
+ 0x9FCA, 0x9FCC, 0x3BC0, 0x9FCD, 0x9FCD, 0x24D7, 0x9FCE, 0x9FE0, 0x3BC3,
+ 0x9FE1, 0x9FE1, 0x20FC, 0x9FE2, 0x9FEA, 0x3BD6, 0x9FEB, 0x9FEB, 0x1E87,
+ 0x9FEC, 0x9FED, 0x3BDF, 0x9FEE, 0x9FEE, 0x24D8, 0x9FEF, 0x9FF3, 0x3BE1,
+ 0x9FF4, 0x9FF4, 0x1EBA, 0x9FF5, 0x9FFC, 0x3BE6, 0x9FFD, 0x9FFD, 0x2119,
+ 0x9FFE, 0x9FFE, 0x3BEE, 0xA040, 0xA042, 0x3BEF, 0xA043, 0xA043, 0x216C,
+ 0xA044, 0xA045, 0x3BF2, 0xA046, 0xA046, 0x24D9, 0xA047, 0xA048, 0x3BF4,
+ 0xA049, 0xA049, 0x2227, 0xA04A, 0xA04D, 0x3BF6, 0xA04E, 0xA04E, 0x1E5F,
+ 0xA04F, 0xA053, 0x3BFA, 0xA054, 0xA054, 0x229F, 0xA055, 0xA059, 0x3BFF,
+ 0xA05A, 0xA05A, 0x1F5D, 0xA05B, 0xA060, 0x3C04, 0xA061, 0xA061, 0x1FBC,
+ 0xA062, 0xA062, 0x3C0A, 0xA063, 0xA063, 0x24DA, 0xA064, 0xA070, 0x3C0B,
+ 0xA071, 0xA071, 0x2149, 0xA072, 0xA073, 0x3C18, 0xA074, 0xA074, 0x2046,
+ 0xA075, 0xA07E, 0x3C1A, 0xA080, 0xA080, 0x2000, 0xA081, 0xA090, 0x3C24,
+ 0xA091, 0xA091, 0x2190, 0xA092, 0xA093, 0x3C34, 0xA094, 0xA094, 0x2208,
+ 0xA095, 0xA095, 0x3C36, 0xA096, 0xA096, 0x1EE6, 0xA097, 0xA0A8, 0x3C37,
+ 0xA0A9, 0xA0A9, 0x24C3, 0xA0AA, 0xA0BE, 0x3C49, 0xA0BF, 0xA0BF, 0x20CC,
+ 0xA0C0, 0xA0CD, 0x3C5E, 0xA0CE, 0xA0CE, 0x2340, 0xA0CF, 0xA0D8, 0x3C6C,
+ 0xA0D9, 0xA0D9, 0x1ED1, 0xA0DA, 0xA0DD, 0x3C76, 0xA0DE, 0xA0DE, 0x21AC,
+ 0xA0DF, 0xA0ED, 0x3C7A, 0xA0EE, 0xA0EE, 0x22AF, 0xA0EF, 0xA0FE, 0x3C89,
+ 0xA1A1, 0xA1FE, 0x0060, 0xA2A1, 0xA2AA, 0x26A9, 0xA2B1, 0xA2E2, 0x00BE,
+ 0xA2E5, 0xA2EE, 0x00F0, 0xA2F1, 0xA2FC, 0x00FA, 0xA3A1, 0xA3FE, 0x0106,
+ 0xA4A1, 0xA4F3, 0x0164, 0xA5A1, 0xA5F6, 0x01B7, 0xA6A1, 0xA6B8, 0x020D,
+ 0xA6C1, 0xA6F5, 0x0225, 0xA7A1, 0xA7C1, 0x025A, 0xA7D1, 0xA7F1, 0x027B,
+ 0xA840, 0xA87E, 0x26B3, 0xA880, 0xA895, 0x26F2, 0xA8A1, 0xA8C0, 0x029C,
+ 0xA8C5, 0xA8EA, 0x02BC, 0xA940, 0xA957, 0x2708, 0xA959, 0xA95A, 0x2720,
+ 0xA95C, 0xA95C, 0x2722, 0xA960, 0xA97E, 0x2723, 0xA980, 0xA995, 0x2742,
+ 0xA996, 0xA996, 0x1E17, 0xA9A4, 0xA9EF, 0x02E2, 0xAA40, 0xAA4C, 0x3C99,
+ 0xAA4D, 0xAA4D, 0x21B6, 0xAA4E, 0xAA4E, 0x1E3D, 0xAA4F, 0xAA70, 0x3CA6,
+ 0xAA71, 0xAA71, 0x2235, 0xAA72, 0xAA72, 0x3CC8, 0xAA73, 0xAA73, 0x2397,
+ 0xAA74, 0xAA76, 0x3CC9, 0xAA77, 0xAA77, 0x2395, 0xAA78, 0xAA79, 0x3CCC,
+ 0xAA7A, 0xAA7A, 0x223F, 0xAA7B, 0xAA7B, 0x212A, 0xAA7C, 0xAA7E, 0x3CCE,
+ 0xAA80, 0xAA99, 0x3CD1, 0xAA9A, 0xAA9A, 0x1ED2, 0xAA9B, 0xAA9B, 0x3CEB,
+ 0xAA9C, 0xAA9C, 0x2396, 0xAA9D, 0xAA9D, 0x2398, 0xAA9E, 0xAA9E, 0x3CEC,
+ 0xAA9F, 0xAA9F, 0x20A2, 0xAAA0, 0xAAA0, 0x3CED, 0xAAA1, 0xAAFE, 0x032E,
+ 0xAB40, 0xAB40, 0x1F64, 0xAB41, 0xAB42, 0x3CEE, 0xAB43, 0xAB43, 0x202B,
+ 0xAB44, 0xAB44, 0x3CF0, 0xAB45, 0xAB45, 0x2394, 0xAB46, 0xAB46, 0x2139,
+ 0xAB47, 0xAB47, 0x3CF1, 0xAB48, 0xAB48, 0x215F, 0xAB49, 0xAB49, 0x21C1,
+ 0xAB4A, 0xAB4A, 0x239A, 0xAB4B, 0xAB4C, 0x3CF2, 0xAB4D, 0xAB4D, 0x2399,
+ 0xAB4E, 0xAB7E, 0x3CF4, 0xAB80, 0xABA0, 0x3D25, 0xABA1, 0xABC0, 0x038C,
+ 0xAC40, 0xAC45, 0x3D46, 0xAC46, 0xAC46, 0x21C0, 0xAC47, 0xAC70, 0x3D4C,
+ 0xAC71, 0xAC71, 0x2460, 0xAC72, 0xAC7B, 0x3D76, 0xAC7C, 0xAC7C, 0x245C,
+ 0xAC7D, 0xAC7E, 0x3D80, 0xAC80, 0xAC8C, 0x3D82, 0xAC8D, 0xAC8D, 0x215D,
+ 0xAC8E, 0xAC92, 0x3D8F, 0xAC93, 0xAC93, 0x2225, 0xAC94, 0xAC94, 0x206A,
+ 0xAC95, 0xACA0, 0x3D94, 0xAD40, 0xAD48, 0x3DA0, 0xAD49, 0xAD49, 0x2461,
+ 0xAD4A, 0xAD5D, 0x3DA9, 0xAD5E, 0xAD5E, 0x245B, 0xAD5F, 0xAD60, 0x3DBD,
+ 0xAD61, 0xAD61, 0x2462, 0xAD62, 0xAD67, 0x3DBF, 0xAD68, 0xAD68, 0x1F54,
+ 0xAD69, 0xAD73, 0x3DC5, 0xAD74, 0xAD74, 0x245F, 0xAD75, 0xAD7E, 0x3DD0,
+ 0xAD80, 0xAD81, 0x3DDA, 0xAD82, 0xAD82, 0x20EC, 0xAD83, 0xAD86, 0x3DDC,
+ 0xAD87, 0xAD87, 0x245D, 0xAD88, 0xAD8A, 0x3DE0, 0xAD8B, 0xAD8B, 0x2463,
+ 0xAD8C, 0xAD90, 0x3DE3, 0xAD91, 0xAD91, 0x2464, 0xAD92, 0xADA0, 0x3DE8,
+ 0xAE40, 0xAE53, 0x3DF7, 0xAE54, 0xAE54, 0x24A5, 0xAE55, 0xAE61, 0x3E0B,
+ 0xAE62, 0xAE62, 0x1E70, 0xAE63, 0xAE7E, 0x3E18, 0xAE80, 0xAE80, 0x208F,
+ 0xAE81, 0xAE84, 0x3E34, 0xAE85, 0xAE85, 0x1E42, 0xAE86, 0xAE8A, 0x3E38,
+ 0xAE8B, 0xAE8B, 0x1F4E, 0xAE8C, 0xAE93, 0x3E3D, 0xAE94, 0xAE94, 0x1EB1,
+ 0xAE95, 0xAE9F, 0x3E45, 0xAEA0, 0xAEA0, 0x1E8B, 0xAF40, 0xAF63, 0x3E50,
+ 0xAF64, 0xAF64, 0x1FC6, 0xAF65, 0xAF7A, 0x3E74, 0xAF7B, 0xAF7B, 0x25AE,
+ 0xAF7C, 0xAF7E, 0x3E8A, 0xAF80, 0xAF81, 0x3E8D, 0xAF82, 0xAF82, 0x1F01,
+ 0xAF83, 0xAF83, 0x2200, 0xAF84, 0xAF8D, 0x3E8F, 0xAF8E, 0xAF8E, 0x25B2,
+ 0xAF8F, 0xAF8F, 0x1E97, 0xAF90, 0xAF90, 0x3E99, 0xAF91, 0xAF91, 0x20AB,
+ 0xAF92, 0xAF9B, 0x3E9A, 0xAF9C, 0xAF9C, 0x25B3, 0xAF9D, 0xAF9E, 0x3EA4,
+ 0xAF9F, 0xAF9F, 0x2028, 0xAFA0, 0xAFA0, 0x3EA6, 0xB040, 0xB040, 0x3EA7,
+ 0xB041, 0xB042, 0x25AF, 0xB043, 0xB043, 0x3EA8, 0xB044, 0xB044, 0x25B1,
+ 0xB045, 0xB04E, 0x3EA9, 0xB04F, 0xB04F, 0x25AC, 0xB050, 0xB053, 0x3EB3,
+ 0xB054, 0xB054, 0x1E4E, 0xB055, 0xB056, 0x3EB7, 0xB057, 0xB057, 0x2202,
+ 0xB058, 0xB058, 0x25AB, 0xB059, 0xB059, 0x2286, 0xB05A, 0xB05A, 0x3EB9,
+ 0xB05B, 0xB05B, 0x25AD, 0xB05C, 0xB05C, 0x3EBA, 0xB05D, 0xB05D, 0x25B6,
+ 0xB05E, 0xB05E, 0x3EBB, 0xB05F, 0xB05F, 0x21E3, 0xB060, 0xB061, 0x25B4,
+ 0xB062, 0xB062, 0x222F, 0xB063, 0xB063, 0x2165, 0xB064, 0xB064, 0x25B7,
+ 0xB065, 0xB06B, 0x3EBC, 0xB06C, 0xB06C, 0x1EE9, 0xB06D, 0xB07C, 0x3EC3,
+ 0xB07D, 0xB07D, 0x1E25, 0xB07E, 0xB07E, 0x3ED3, 0xB080, 0xB096, 0x3ED4,
+ 0xB097, 0xB097, 0x25C0, 0xB098, 0xB098, 0x3EEB, 0xB099, 0xB099, 0x229A,
+ 0xB09A, 0xB0A0, 0x3EEC, 0xB0A1, 0xB0FE, 0x03AC, 0xB140, 0xB14A, 0x3EF3,
+ 0xB14B, 0xB14B, 0x226E, 0xB14C, 0xB14C, 0x3EFE, 0xB14D, 0xB14D, 0x1FBD,
+ 0xB14E, 0xB14E, 0x3EFF, 0xB14F, 0xB14F, 0x1F84, 0xB150, 0xB150, 0x20B2,
+ 0xB151, 0xB151, 0x3F00, 0xB152, 0xB152, 0x2043, 0xB153, 0xB17E, 0x3F01,
+ 0xB180, 0xB196, 0x3F2D, 0xB197, 0xB197, 0x2684, 0xB198, 0xB1A0, 0x3F44,
+ 0xB1A1, 0xB1FE, 0x040A, 0xB240, 0xB240, 0x3F4D, 0xB241, 0xB241, 0x24EF,
+ 0xB242, 0xB266, 0x3F4E, 0xB267, 0xB267, 0x24EE, 0xB268, 0xB26C, 0x3F73,
+ 0xB26D, 0xB26D, 0x2074, 0xB26E, 0xB273, 0x3F78, 0xB274, 0xB274, 0x2687,
+ 0xB275, 0xB27E, 0x3F7E, 0xB280, 0xB280, 0x24F0, 0xB281, 0xB288, 0x3F88,
+ 0xB289, 0xB289, 0x268D, 0xB28A, 0xB299, 0x3F90, 0xB29A, 0xB29A, 0x22A0,
+ 0xB29B, 0xB2A0, 0x3FA0, 0xB2A1, 0xB2FE, 0x0468, 0xB340, 0xB342, 0x3FA6,
+ 0xB343, 0xB343, 0x1FAB, 0xB344, 0xB36F, 0x3FA9, 0xB370, 0xB370, 0x26A8,
+ 0xB371, 0xB37E, 0x3FD5, 0xB380, 0xB387, 0x3FE3, 0xB388, 0xB388, 0x24E9,
+ 0xB389, 0xB38B, 0x3FEB, 0xB38C, 0xB38C, 0x24E5, 0xB38D, 0xB38D, 0x3FEE,
+ 0xB38E, 0xB38E, 0x21FA, 0xB38F, 0xB3A0, 0x3FEF, 0xB3A1, 0xB3FE, 0x04C6,
+ 0xB440, 0xB453, 0x4001, 0xB454, 0xB454, 0x2148, 0xB455, 0xB457, 0x4015,
+ 0xB458, 0xB458, 0x24E4, 0xB459, 0xB45D, 0x4018, 0xB45E, 0xB45E, 0x24E6,
+ 0xB45F, 0xB45F, 0x20F7, 0xB460, 0xB460, 0x401D, 0xB461, 0xB461, 0x206B,
+ 0xB462, 0xB474, 0x401E, 0xB475, 0xB475, 0x22A7, 0xB476, 0xB47D, 0x4031,
+ 0xB47E, 0xB47E, 0x24EC, 0xB480, 0xB482, 0x4039, 0xB483, 0xB483, 0x24EB,
+ 0xB484, 0xB488, 0x403C, 0xB489, 0xB489, 0x24E3, 0xB48A, 0xB492, 0x4041,
+ 0xB493, 0xB493, 0x24EA, 0xB494, 0xB4A0, 0x404A, 0xB4A1, 0xB4FE, 0x0524,
+ 0xB540, 0xB540, 0x4057, 0xB541, 0xB541, 0x1E92, 0xB542, 0xB54A, 0x4058,
+ 0xB54B, 0xB54B, 0x1E27, 0xB54C, 0xB555, 0x4061, 0xB556, 0xB556, 0x1FE6,
+ 0xB557, 0xB559, 0x406B, 0xB55A, 0xB55A, 0x24E7, 0xB55B, 0xB55B, 0x2012,
+ 0xB55C, 0xB55C, 0x1EEC, 0xB55D, 0xB560, 0x406E, 0xB561, 0xB561, 0x24E8,
+ 0xB562, 0xB57E, 0x4072, 0xB580, 0xB59B, 0x408F, 0xB59C, 0xB59C, 0x1F66,
+ 0xB59D, 0xB59D, 0x24DC, 0xB59E, 0xB5A0, 0x40AB, 0xB5A1, 0xB5FE, 0x0582,
+ 0xB640, 0xB651, 0x40AE, 0xB652, 0xB652, 0x26A2, 0xB653, 0xB654, 0x40C0,
+ 0xB655, 0xB655, 0x24DD, 0xB656, 0xB658, 0x40C2, 0xB659, 0xB659, 0x200E,
+ 0xB65A, 0xB65A, 0x40C5, 0xB65B, 0xB65B, 0x24DB, 0xB65C, 0xB65C, 0x1EB8,
+ 0xB65D, 0xB67E, 0x40C6, 0xB680, 0xB6A0, 0x40E8, 0xB6A1, 0xB6FE, 0x05E0,
+ 0xB740, 0xB74D, 0x4109, 0xB74E, 0xB74E, 0x2295, 0xB74F, 0xB750, 0x4117,
+ 0xB751, 0xB751, 0x1E80, 0xB752, 0xB758, 0x4119, 0xB759, 0xB759, 0x2677,
+ 0xB75A, 0xB763, 0x4120, 0xB764, 0xB764, 0x2624, 0xB765, 0xB765, 0x1F69,
+ 0xB766, 0xB766, 0x222B, 0xB767, 0xB776, 0x412A, 0xB777, 0xB777, 0x257F,
+ 0xB778, 0xB778, 0x1F5B, 0xB779, 0xB77E, 0x413A, 0xB780, 0xB780, 0x219B,
+ 0xB781, 0xB781, 0x4140, 0xB782, 0xB782, 0x267D, 0xB783, 0xB7A0, 0x4141,
+ 0xB7A1, 0xB7FE, 0x063E, 0xB840, 0xB842, 0x415F, 0xB843, 0xB843, 0x21A0,
+ 0xB844, 0xB844, 0x2186, 0xB845, 0xB845, 0x4162, 0xB846, 0xB846, 0x20ED,
+ 0xB847, 0xB84C, 0x4163, 0xB84D, 0xB84D, 0x25B9, 0xB84E, 0xB850, 0x4169,
+ 0xB851, 0xB851, 0x1FEA, 0xB852, 0xB859, 0x416C, 0xB85A, 0xB85A, 0x1EA4,
+ 0xB85B, 0xB85B, 0x20E1, 0xB85C, 0xB85C, 0x4174, 0xB85D, 0xB85D, 0x25B8,
+ 0xB85E, 0xB85E, 0x2260, 0xB85F, 0xB85F, 0x4175, 0xB860, 0xB860, 0x20E2,
+ 0xB861, 0xB876, 0x4176, 0xB877, 0xB877, 0x2141, 0xB878, 0xB87E, 0x418C,
+ 0xB880, 0xB881, 0x4193, 0xB882, 0xB882, 0x1FC7, 0xB883, 0xB8A0, 0x4195,
+ 0xB8A1, 0xB8FE, 0x069C, 0xB940, 0xB94F, 0x41B3, 0xB950, 0xB950, 0x1E41,
+ 0xB951, 0xB960, 0x41C3, 0xB961, 0xB961, 0x25E4, 0xB962, 0xB97A, 0x41D3,
+ 0xB97B, 0xB97B, 0x1F86, 0xB97C, 0xB97E, 0x41EC, 0xB980, 0xB99C, 0x41EF,
+ 0xB99D, 0xB99D, 0x1FB3, 0xB99E, 0xB99F, 0x420C, 0xB9A0, 0xB9A0, 0x1EEF,
+ 0xB9A1, 0xB9FE, 0x06FA, 0xBA40, 0xBA41, 0x420E, 0xBA42, 0xBA42, 0x22A4,
+ 0xBA43, 0xBA43, 0x4210, 0xBA44, 0xBA44, 0x25E8, 0xBA45, 0xBA55, 0x4211,
+ 0xBA56, 0xBA56, 0x25E3, 0xBA57, 0xBA58, 0x4222, 0xBA59, 0xBA59, 0x2111,
+ 0xBA5A, 0xBA5F, 0x4224, 0xBA60, 0xBA60, 0x25E6, 0xBA61, 0xBA69, 0x422A,
+ 0xBA6A, 0xBA6A, 0x25E7, 0xBA6B, 0xBA73, 0x4233, 0xBA74, 0xBA74, 0x2041,
+ 0xBA75, 0xBA7E, 0x423C, 0xBA80, 0xBA83, 0x4246, 0xBA84, 0xBA84, 0x25EA,
+ 0xBA85, 0xBA85, 0x424A, 0xBA86, 0xBA86, 0x1F8F, 0xBA87, 0xBA87, 0x424B,
+ 0xBA88, 0xBA88, 0x25EC, 0xBA89, 0xBA8C, 0x424C, 0xBA8D, 0xBA8D, 0x25EB,
+ 0xBA8E, 0xBA9D, 0x4250, 0xBA9E, 0xBA9E, 0x20D0, 0xBA9F, 0xBA9F, 0x201D,
+ 0xBAA0, 0xBAA0, 0x4260, 0xBAA1, 0xBAFE, 0x0758, 0xBB40, 0xBB40, 0x1FF7,
+ 0xBB41, 0xBB48, 0x4261, 0xBB49, 0xBB49, 0x1E8D, 0xBB4A, 0xBB57, 0x4269,
+ 0xBB58, 0xBB58, 0x25E9, 0xBB59, 0xBB5A, 0x4277, 0xBB5B, 0xBB5B, 0x25EE,
+ 0xBB5C, 0xBB5C, 0x203A, 0xBB5D, 0xBB5F, 0x4279, 0xBB60, 0xBB60, 0x2693,
+ 0xBB61, 0xBB64, 0x427C, 0xBB65, 0xBB65, 0x25E5, 0xBB66, 0xBB66, 0x25ED,
+ 0xBB67, 0xBB67, 0x4280, 0xBB68, 0xBB68, 0x2009, 0xBB69, 0xBB69, 0x4281,
+ 0xBB6A, 0xBB6A, 0x2065, 0xBB6B, 0xBB6D, 0x4282, 0xBB6E, 0xBB6E, 0x26A3,
+ 0xBB6F, 0xBB7E, 0x4285, 0xBB80, 0xBBA0, 0x4295, 0xBBA1, 0xBBFE, 0x07B6,
+ 0xBC40, 0xBC51, 0x42B6, 0xBC52, 0xBC52, 0x25F5, 0xBC53, 0xBC53, 0x1EFC,
+ 0xBC54, 0xBC59, 0x42C8, 0xBC5A, 0xBC5A, 0x2024, 0xBC5B, 0xBC60, 0x42CE,
+ 0xBC61, 0xBC61, 0x269B, 0xBC62, 0xBC62, 0x42D4, 0xBC63, 0xBC63, 0x25F3,
+ 0xBC64, 0xBC64, 0x42D5, 0xBC65, 0xBC65, 0x22D9, 0xBC66, 0xBC66, 0x42D6,
+ 0xBC67, 0xBC67, 0x25F4, 0xBC68, 0xBC68, 0x42D7, 0xBC69, 0xBC69, 0x241B,
+ 0xBC6A, 0xBC6C, 0x42D8, 0xBC6D, 0xBC6D, 0x1FC8, 0xBC6E, 0xBC6E, 0x42DB,
+ 0xBC6F, 0xBC6F, 0x1F7B, 0xBC70, 0xBC70, 0x42DC, 0xBC71, 0xBC71, 0x241D,
+ 0xBC72, 0xBC72, 0x42DD, 0xBC73, 0xBC73, 0x224C, 0xBC74, 0xBC74, 0x1F48,
+ 0xBC75, 0xBC75, 0x241C, 0xBC76, 0xBC77, 0x241E, 0xBC78, 0xBC78, 0x20FF,
+ 0xBC79, 0xBC79, 0x219A, 0xBC7A, 0xBC7A, 0x42DE, 0xBC7B, 0xBC7B, 0x2091,
+ 0xBC7C, 0xBC7D, 0x42DF, 0xBC7E, 0xBC7E, 0x20A7, 0xBC80, 0xBC81, 0x42E1,
+ 0xBC82, 0xBC82, 0x2423, 0xBC83, 0xBC83, 0x1E9B, 0xBC84, 0xBC84, 0x2422,
+ 0xBC85, 0xBC85, 0x42E3, 0xBC86, 0xBC86, 0x2110, 0xBC87, 0xBC87, 0x42E4,
+ 0xBC88, 0xBC88, 0x228D, 0xBC89, 0xBC89, 0x1F71, 0xBC8A, 0xBC8A, 0x1EF8,
+ 0xBC8B, 0xBC8B, 0x2421, 0xBC8C, 0xBC8E, 0x42E5, 0xBC8F, 0xBC8F, 0x1EF3,
+ 0xBC90, 0xBC99, 0x42E8, 0xBC9A, 0xBC9A, 0x21B1, 0xBC9B, 0xBC9B, 0x2426,
+ 0xBC9C, 0xBC9C, 0x2425, 0xBC9D, 0xBC9D, 0x2120, 0xBC9E, 0xBCA0, 0x42F2,
+ 0xBCA1, 0xBCFE, 0x0814, 0xBD40, 0xBD41, 0x42F5, 0xBD42, 0xBD42, 0x211A,
+ 0xBD43, 0xBD43, 0x2424, 0xBD44, 0xBD44, 0x42F7, 0xBD45, 0xBD45, 0x2428,
+ 0xBD46, 0xBD47, 0x42F8, 0xBD48, 0xBD48, 0x242A, 0xBD49, 0xBD49, 0x2429,
+ 0xBD4A, 0xBD4A, 0x42FA, 0xBD4B, 0xBD4B, 0x2294, 0xBD4C, 0xBD4C, 0x42FB,
+ 0xBD4D, 0xBD4D, 0x22BE, 0xBD4E, 0xBD4E, 0x42FC, 0xBD4F, 0xBD4F, 0x1E31,
+ 0xBD50, 0xBD56, 0x42FD, 0xBD57, 0xBD57, 0x242C, 0xBD58, 0xBD58, 0x4304,
+ 0xBD59, 0xBD59, 0x1FB5, 0xBD5A, 0xBD65, 0x4305, 0xBD66, 0xBD66, 0x242B,
+ 0xBD67, 0xBD67, 0x1FAF, 0xBD68, 0xBD69, 0x4311, 0xBD6A, 0xBD6A, 0x2068,
+ 0xBD6B, 0xBD6B, 0x21E4, 0xBD6C, 0xBD6E, 0x4313, 0xBD6F, 0xBD6F, 0x1F21,
+ 0xBD70, 0xBD70, 0x4316, 0xBD71, 0xBD71, 0x2101, 0xBD72, 0xBD78, 0x4317,
+ 0xBD79, 0xBD79, 0x217C, 0xBD7A, 0xBD7A, 0x214A, 0xBD7B, 0xBD7B, 0x242D,
+ 0xBD7C, 0xBD7D, 0x431E, 0xBD7E, 0xBD7E, 0x1FD4, 0xBD80, 0xBD80, 0x4320,
+ 0xBD81, 0xBD81, 0x1FD1, 0xBD82, 0xBD88, 0x4321, 0xBD89, 0xBD89, 0x1E33,
+ 0xBD8A, 0xBD8A, 0x4328, 0xBD8B, 0xBD8B, 0x242F, 0xBD8C, 0xBD8D, 0x4329,
+ 0xBD8E, 0xBD8E, 0x242E, 0xBD8F, 0xBD8F, 0x432B, 0xBD90, 0xBD90, 0x2430,
+ 0xBD91, 0xBD91, 0x21DB, 0xBD92, 0xBD96, 0x432C, 0xBD97, 0xBD97, 0x2158,
+ 0xBD98, 0xBD9A, 0x4331, 0xBD9B, 0xBD9B, 0x1FC2, 0xBD9C, 0xBDA0, 0x4334,
+ 0xBDA1, 0xBDFE, 0x0872, 0xBE40, 0xBE42, 0x4339, 0xBE43, 0xBE43, 0x22B9,
+ 0xBE44, 0xBE44, 0x433C, 0xBE45, 0xBE45, 0x2436, 0xBE46, 0xBE48, 0x433D,
+ 0xBE49, 0xBE49, 0x1E8E, 0xBE4A, 0xBE4A, 0x2439, 0xBE4B, 0xBE50, 0x4340,
+ 0xBE51, 0xBE51, 0x21C5, 0xBE52, 0xBE52, 0x2437, 0xBE53, 0xBE53, 0x2192,
+ 0xBE54, 0xBE54, 0x4346, 0xBE55, 0xBE55, 0x243A, 0xBE56, 0xBE56, 0x1F19,
+ 0xBE57, 0xBE57, 0x218C, 0xBE58, 0xBE58, 0x1E40, 0xBE59, 0xBE59, 0x22B3,
+ 0xBE5A, 0xBE5C, 0x4347, 0xBE5D, 0xBE5D, 0x205F, 0xBE5E, 0xBE5E, 0x2438,
+ 0xBE5F, 0xBE5F, 0x2432, 0xBE60, 0xBE60, 0x2274, 0xBE61, 0xBE61, 0x434A,
+ 0xBE62, 0xBE62, 0x1E9C, 0xBE63, 0xBE63, 0x2431, 0xBE64, 0xBE64, 0x2085,
+ 0xBE65, 0xBE68, 0x434B, 0xBE69, 0xBE69, 0x2435, 0xBE6A, 0xBE6B, 0x434F,
+ 0xBE6C, 0xBE6C, 0x243B, 0xBE6D, 0xBE6E, 0x4351, 0xBE6F, 0xBE6F, 0x1FB7,
+ 0xBE70, 0xBE70, 0x2433, 0xBE71, 0xBE75, 0x4353, 0xBE76, 0xBE76, 0x2054,
+ 0xBE77, 0xBE77, 0x21DE, 0xBE78, 0xBE78, 0x4358, 0xBE79, 0xBE79, 0x2434,
+ 0xBE7A, 0xBE7B, 0x4359, 0xBE7C, 0xBE7C, 0x243D, 0xBE7D, 0xBE7D, 0x1F89,
+ 0xBE7E, 0xBE7E, 0x243C, 0xBE80, 0xBE82, 0x435B, 0xBE83, 0xBE83, 0x1F6E,
+ 0xBE84, 0xBE84, 0x1ED8, 0xBE85, 0xBE85, 0x435E, 0xBE86, 0xBE86, 0x1EBF,
+ 0xBE87, 0xBE87, 0x2445, 0xBE88, 0xBE88, 0x435F, 0xBE89, 0xBE89, 0x2249,
+ 0xBE8A, 0xBE8B, 0x4360, 0xBE8C, 0xBE8C, 0x2441, 0xBE8D, 0xBE8D, 0x4362,
+ 0xBE8E, 0xBE8E, 0x1E47, 0xBE8F, 0xBE8F, 0x1F56, 0xBE90, 0xBE91, 0x4363,
+ 0xBE92, 0xBE92, 0x2086, 0xBE93, 0xBE94, 0x4365, 0xBE95, 0xBE95, 0x2196,
+ 0xBE96, 0xBE96, 0x4367, 0xBE97, 0xBE97, 0x2443, 0xBE98, 0xBE98, 0x243F,
+ 0xBE99, 0xBE99, 0x4368, 0xBE9A, 0xBE9A, 0x2023, 0xBE9B, 0xBE9B, 0x4369,
+ 0xBE9C, 0xBE9C, 0x2442, 0xBE9D, 0xBE9E, 0x436A, 0xBE9F, 0xBE9F, 0x243E,
+ 0xBEA0, 0xBEA0, 0x436C, 0xBEA1, 0xBEFE, 0x08D0, 0xBF40, 0xBF40, 0x26A6,
+ 0xBF41, 0xBF4C, 0x436D, 0xBF4D, 0xBF4D, 0x234E, 0xBF4E, 0xBF4E, 0x2446,
+ 0xBF4F, 0xBF4F, 0x244B, 0xBF50, 0xBF50, 0x2444, 0xBF51, 0xBF54, 0x4379,
+ 0xBF55, 0xBF55, 0x2427, 0xBF56, 0xBF56, 0x244C, 0xBF57, 0xBF5F, 0x437D,
+ 0xBF60, 0xBF60, 0x1F0F, 0xBF61, 0xBF61, 0x4386, 0xBF62, 0xBF62, 0x2447,
+ 0xBF63, 0xBF63, 0x2449, 0xBF64, 0xBF64, 0x2448, 0xBF65, 0xBF67, 0x4387,
+ 0xBF68, 0xBF68, 0x21C2, 0xBF69, 0xBF6B, 0x438A, 0xBF6C, 0xBF6C, 0x216E,
+ 0xBF6D, 0xBF6F, 0x438D, 0xBF70, 0xBF70, 0x1F03, 0xBF71, 0xBF71, 0x4390,
+ 0xBF72, 0xBF72, 0x244A, 0xBF73, 0xBF73, 0x215C, 0xBF74, 0xBF75, 0x4391,
+ 0xBF76, 0xBF76, 0x22BB, 0xBF77, 0xBF77, 0x2450, 0xBF78, 0xBF78, 0x4393,
+ 0xBF79, 0xBF79, 0x2694, 0xBF7A, 0xBF7A, 0x244F, 0xBF7B, 0xBF7B, 0x25F6,
+ 0xBF7C, 0xBF7C, 0x2051, 0xBF7D, 0xBF7D, 0x4394, 0xBF7E, 0xBF7E, 0x244E,
+ 0xBF80, 0xBF81, 0x4395, 0xBF82, 0xBF82, 0x22BA, 0xBF83, 0xBF83, 0x1F6D,
+ 0xBF84, 0xBF88, 0x4397, 0xBF89, 0xBF89, 0x2452, 0xBF8A, 0xBF8A, 0x2451,
+ 0xBF8B, 0xBF94, 0x439C, 0xBF95, 0xBF95, 0x2455, 0xBF96, 0xBF96, 0x43A6,
+ 0xBF97, 0xBF97, 0x2289, 0xBF98, 0xBF98, 0x2116, 0xBF99, 0xBF9C, 0x43A7,
+ 0xBF9D, 0xBF9D, 0x2454, 0xBF9E, 0xBFA0, 0x43AB, 0xBFA1, 0xBFFE, 0x092E,
+ 0xC040, 0xC040, 0x20FB, 0xC041, 0xC043, 0x43AE, 0xC044, 0xC044, 0x2440,
+ 0xC045, 0xC04A, 0x43B1, 0xC04B, 0xC04B, 0x2126, 0xC04C, 0xC04C, 0x1F61,
+ 0xC04D, 0xC04D, 0x269D, 0xC04E, 0xC04E, 0x43B7, 0xC04F, 0xC04F, 0x1F8A,
+ 0xC050, 0xC050, 0x2456, 0xC051, 0xC051, 0x2459, 0xC052, 0xC052, 0x2458,
+ 0xC053, 0xC054, 0x43B8, 0xC055, 0xC055, 0x1FAE, 0xC056, 0xC05A, 0x43BA,
+ 0xC05B, 0xC05B, 0x221A, 0xC05C, 0xC05D, 0x43BF, 0xC05E, 0xC05E, 0x1F7A,
+ 0xC05F, 0xC05F, 0x244D, 0xC060, 0xC060, 0x2457, 0xC061, 0xC068, 0x43C1,
+ 0xC069, 0xC069, 0x2453, 0xC06A, 0xC06A, 0x43C9, 0xC06B, 0xC06B, 0x2420,
+ 0xC06C, 0xC06C, 0x43CA, 0xC06D, 0xC06D, 0x21DF, 0xC06E, 0xC06E, 0x2685,
+ 0xC06F, 0xC06F, 0x43CB, 0xC070, 0xC070, 0x1E6E, 0xC071, 0xC073, 0x43CC,
+ 0xC074, 0xC074, 0x2224, 0xC075, 0xC075, 0x2670, 0xC076, 0xC076, 0x43CF,
+ 0xC077, 0xC077, 0x21BA, 0xC078, 0xC078, 0x43D0, 0xC079, 0xC079, 0x245A,
+ 0xC07A, 0xC07B, 0x43D1, 0xC07C, 0xC07C, 0x1FFF, 0xC07D, 0xC07E, 0x43D3,
+ 0xC080, 0xC09A, 0x43D5, 0xC09B, 0xC09B, 0x25E2, 0xC09C, 0xC09C, 0x43F0,
+ 0xC09D, 0xC09D, 0x269A, 0xC09E, 0xC0A0, 0x43F1, 0xC0A1, 0xC0FE, 0x098C,
+ 0xC140, 0xC14F, 0x43F4, 0xC150, 0xC150, 0x1EEA, 0xC151, 0xC153, 0x4404,
+ 0xC154, 0xC154, 0x1E2C, 0xC155, 0xC15E, 0x4407, 0xC15F, 0xC15F, 0x2062,
+ 0xC160, 0xC160, 0x24F1, 0xC161, 0xC161, 0x4411, 0xC162, 0xC162, 0x24F2,
+ 0xC163, 0xC174, 0x4412, 0xC175, 0xC175, 0x25F2, 0xC176, 0xC177, 0x4424,
+ 0xC178, 0xC178, 0x2215, 0xC179, 0xC17E, 0x4426, 0xC180, 0xC194, 0x442C,
+ 0xC195, 0xC195, 0x21AE, 0xC196, 0xC1A0, 0x4441, 0xC1A1, 0xC1FE, 0x09EA,
+ 0xC240, 0xC24D, 0x444C, 0xC24E, 0xC24E, 0x20E0, 0xC24F, 0xC264, 0x445A,
+ 0xC265, 0xC265, 0x25C2, 0xC266, 0xC266, 0x4470, 0xC267, 0xC267, 0x25C1,
+ 0xC268, 0xC27C, 0x4471, 0xC27D, 0xC27D, 0x2128, 0xC27E, 0xC27E, 0x4486,
+ 0xC280, 0xC283, 0x4487, 0xC284, 0xC284, 0x2199, 0xC285, 0xC292, 0x448B,
+ 0xC293, 0xC293, 0x2017, 0xC294, 0xC294, 0x1EA0, 0xC295, 0xC295, 0x2125,
+ 0xC296, 0xC296, 0x214D, 0xC297, 0xC297, 0x4499, 0xC298, 0xC298, 0x25C4,
+ 0xC299, 0xC299, 0x209D, 0xC29A, 0xC29A, 0x228A, 0xC29B, 0xC29B, 0x449A,
+ 0xC29C, 0xC29C, 0x25C3, 0xC29D, 0xC29F, 0x449B, 0xC2A0, 0xC2A0, 0x2179,
+ 0xC2A1, 0xC2FE, 0x0A48, 0xC340, 0xC340, 0x2038, 0xC341, 0xC342, 0x449E,
+ 0xC343, 0xC343, 0x2155, 0xC344, 0xC37A, 0x44A0, 0xC37B, 0xC37B, 0x21D2,
+ 0xC37C, 0xC37E, 0x44D7, 0xC380, 0xC383, 0x44DA, 0xC384, 0xC384, 0x24C7,
+ 0xC385, 0xC39A, 0x44DE, 0xC39B, 0xC39B, 0x2279, 0xC39C, 0xC3A0, 0x44F4,
+ 0xC3A1, 0xC3FE, 0x0AA6, 0xC440, 0xC448, 0x44F9, 0xC449, 0xC449, 0x2123,
+ 0xC44A, 0xC44B, 0x4502, 0xC44C, 0xC44C, 0x24C5, 0xC44D, 0xC453, 0x4504,
+ 0xC454, 0xC454, 0x24C9, 0xC455, 0xC457, 0x450B, 0xC458, 0xC458, 0x2094,
+ 0xC459, 0xC45A, 0x450E, 0xC45B, 0xC45B, 0x2296, 0xC45C, 0xC462, 0x4510,
+ 0xC463, 0xC463, 0x1E77, 0xC464, 0xC476, 0x4517, 0xC477, 0xC477, 0x1F06,
+ 0xC478, 0xC479, 0x452A, 0xC47A, 0xC47A, 0x1FA5, 0xC47B, 0xC47E, 0x452C,
+ 0xC480, 0xC480, 0x4530, 0xC481, 0xC481, 0x2099, 0xC482, 0xC490, 0x4531,
+ 0xC491, 0xC491, 0x1EAD, 0xC492, 0xC492, 0x24C8, 0xC493, 0xC493, 0x20A8,
+ 0xC494, 0xC497, 0x4540, 0xC498, 0xC498, 0x201F, 0xC499, 0xC499, 0x4544,
+ 0xC49A, 0xC49A, 0x20C5, 0xC49B, 0xC49B, 0x4545, 0xC49C, 0xC49C, 0x24CA,
+ 0xC49D, 0xC4A0, 0x4546, 0xC4A1, 0xC4FE, 0x0B04, 0xC540, 0xC543, 0x454A,
+ 0xC544, 0xC544, 0x1FF0, 0xC545, 0xC545, 0x454E, 0xC546, 0xC546, 0x24C6,
+ 0xC547, 0xC54A, 0x454F, 0xC54B, 0xC54B, 0x225D, 0xC54C, 0xC54C, 0x22DE,
+ 0xC54D, 0xC551, 0x4553, 0xC552, 0xC552, 0x202C, 0xC553, 0xC55E, 0x4558,
+ 0xC55F, 0xC55F, 0x2161, 0xC560, 0xC562, 0x4564, 0xC563, 0xC563, 0x223B,
+ 0xC564, 0xC564, 0x21D9, 0xC565, 0xC565, 0x1FCB, 0xC566, 0xC566, 0x1FC9,
+ 0xC567, 0xC57E, 0x4567, 0xC580, 0xC592, 0x457F, 0xC593, 0xC593, 0x1E61,
+ 0xC594, 0xC59B, 0x4592, 0xC59C, 0xC59C, 0x25EF, 0xC59D, 0xC59D, 0x459A,
+ 0xC59E, 0xC59E, 0x1F98, 0xC59F, 0xC5A0, 0x459B, 0xC5A1, 0xC5FE, 0x0B62,
+ 0xC640, 0xC640, 0x459D, 0xC641, 0xC641, 0x25F0, 0xC642, 0xC643, 0x459E,
+ 0xC644, 0xC644, 0x1F88, 0xC645, 0xC646, 0x45A0, 0xC647, 0xC647, 0x21F8,
+ 0xC648, 0xC662, 0x45A2, 0xC663, 0xC663, 0x2322, 0xC664, 0xC671, 0x45BD,
+ 0xC672, 0xC672, 0x2336, 0xC673, 0xC67E, 0x45CB, 0xC680, 0xC6A0, 0x45D7,
+ 0xC6A1, 0xC6FE, 0x0BC0, 0xC740, 0xC765, 0x45F8, 0xC766, 0xC766, 0x22AB,
+ 0xC767, 0xC76E, 0x461E, 0xC76F, 0xC76F, 0x1FBF, 0xC770, 0xC775, 0x4626,
+ 0xC776, 0xC776, 0x1F7D, 0xC777, 0xC77A, 0x462C, 0xC77B, 0xC77B, 0x2333,
+ 0xC77C, 0xC77E, 0x4630, 0xC780, 0xC7A0, 0x4633, 0xC7A1, 0xC7FE, 0x0C1E,
+ 0xC840, 0xC840, 0x4654, 0xC841, 0xC841, 0x1F4D, 0xC842, 0xC84E, 0x4655,
+ 0xC84F, 0xC84F, 0x2334, 0xC850, 0xC851, 0x4662, 0xC852, 0xC852, 0x1FF1,
+ 0xC853, 0xC865, 0x4664, 0xC866, 0xC866, 0x218B, 0xC867, 0xC86D, 0x4677,
+ 0xC86E, 0xC86E, 0x2349, 0xC86F, 0xC87D, 0x467E, 0xC87E, 0xC87E, 0x220B,
+ 0xC880, 0xC886, 0x468D, 0xC887, 0xC887, 0x2346, 0xC888, 0xC891, 0x4694,
+ 0xC892, 0xC892, 0x2347, 0xC893, 0xC893, 0x469E, 0xC894, 0xC894, 0x2193,
+ 0xC895, 0xC898, 0x469F, 0xC899, 0xC899, 0x26A1, 0xC89A, 0xC89C, 0x46A3,
+ 0xC89D, 0xC89D, 0x1F62, 0xC89E, 0xC8A0, 0x46A6, 0xC8A1, 0xC8FE, 0x0C7C,
+ 0xC940, 0xC94E, 0x46A9, 0xC94F, 0xC94F, 0x234D, 0xC950, 0xC950, 0x2348,
+ 0xC951, 0xC96D, 0x46B8, 0xC96E, 0xC96E, 0x1E60, 0xC96F, 0xC96F, 0x46D5,
+ 0xC970, 0xC970, 0x2345, 0xC971, 0xC976, 0x46D6, 0xC977, 0xC977, 0x1F12,
+ 0xC978, 0xC97E, 0x46DC, 0xC980, 0xC98E, 0x46E3, 0xC98F, 0xC98F, 0x2018,
+ 0xC990, 0xC990, 0x2335, 0xC991, 0xC99B, 0x46F2, 0xC99C, 0xC99C, 0x233C,
+ 0xC99D, 0xC9A0, 0x46FD, 0xC9A1, 0xC9FE, 0x0CDA, 0xCA40, 0xCA4D, 0x4701,
+ 0xCA4E, 0xCA4E, 0x266F, 0xCA4F, 0xCA55, 0x470F, 0xCA56, 0xCA56, 0x2351,
+ 0xCA57, 0xCA58, 0x4716, 0xCA59, 0xCA59, 0x1FA0, 0xCA5A, 0xCA5B, 0x4718,
+ 0xCA5C, 0xCA5C, 0x2338, 0xCA5D, 0xCA60, 0x471A, 0xCA61, 0xCA61, 0x221B,
+ 0xCA62, 0xCA6D, 0x471E, 0xCA6E, 0xCA6E, 0x2342, 0xCA6F, 0xCA71, 0x472A,
+ 0xCA72, 0xCA72, 0x234F, 0xCA73, 0xCA76, 0x472D, 0xCA77, 0xCA77, 0x233D,
+ 0xCA78, 0xCA7A, 0x4731, 0xCA7B, 0xCA7B, 0x2344, 0xCA7C, 0xCA7C, 0x2331,
+ 0xCA7D, 0xCA7D, 0x4734, 0xCA7E, 0xCA7E, 0x234B, 0xCA80, 0xCA80, 0x4735,
+ 0xCA81, 0xCA81, 0x233B, 0xCA82, 0xCA88, 0x4736, 0xCA89, 0xCA89, 0x2350,
+ 0xCA8A, 0xCA8D, 0x473D, 0xCA8E, 0xCA8E, 0x1EB4, 0xCA8F, 0xCA8F, 0x21A6,
+ 0xCA90, 0xCA91, 0x4741, 0xCA92, 0xCA92, 0x21CB, 0xCA93, 0xCA99, 0x4743,
+ 0xCA9A, 0xCA9A, 0x2355, 0xCA9B, 0xCAA0, 0x474A, 0xCAA1, 0xCAFE, 0x0D38,
+ 0xCB40, 0xCB42, 0x4750, 0xCB43, 0xCB43, 0x233E, 0xCB44, 0xCB44, 0x4753,
+ 0xCB45, 0xCB45, 0x1F74, 0xCB46, 0xCB46, 0x4754, 0xCB47, 0xCB47, 0x2330,
+ 0xCB48, 0xCB4A, 0x4755, 0xCB4B, 0xCB4B, 0x2680, 0xCB4C, 0xCB4D, 0x4758,
+ 0xCB4E, 0xCB4E, 0x20DA, 0xCB4F, 0xCB56, 0x475A, 0xCB57, 0xCB57, 0x234A,
+ 0xCB58, 0xCB5C, 0x4762, 0xCB5D, 0xCB5D, 0x1F91, 0xCB5E, 0xCB5E, 0x4767,
+ 0xCB5F, 0xCB5F, 0x2107, 0xCB60, 0xCB69, 0x4768, 0xCB6A, 0xCB6A, 0x233F,
+ 0xCB6B, 0xCB7A, 0x4772, 0xCB7B, 0xCB7B, 0x1FF4, 0xCB7C, 0xCB7C, 0x2343,
+ 0xCB7D, 0xCB7E, 0x4782, 0xCB80, 0xCB86, 0x4784, 0xCB87, 0xCB87, 0x2212,
+ 0xCB88, 0xCB8D, 0x478B, 0xCB8E, 0xCB8E, 0x2207, 0xCB8F, 0xCB91, 0x4791,
+ 0xCB92, 0xCB92, 0x2359, 0xCB93, 0xCB9B, 0x4794, 0xCB9C, 0xCB9C, 0x2254,
+ 0xCB9D, 0xCB9D, 0x479D, 0xCB9E, 0xCB9E, 0x2332, 0xCB9F, 0xCBA0, 0x479E,
+ 0xCBA1, 0xCBFE, 0x0D96, 0xCC40, 0xCC40, 0x1E26, 0xCC41, 0xCC41, 0x2357,
+ 0xCC42, 0xCC48, 0x47A0, 0xCC49, 0xCC49, 0x2358, 0xCC4A, 0xCC4A, 0x2042,
+ 0xCC4B, 0xCC4B, 0x2153, 0xCC4C, 0xCC4E, 0x47A7, 0xCC4F, 0xCC4F, 0x20BB,
+ 0xCC50, 0xCC5B, 0x47AA, 0xCC5C, 0xCC5C, 0x235A, 0xCC5D, 0xCC5F, 0x47B6,
+ 0xCC60, 0xCC60, 0x2356, 0xCC61, 0xCC63, 0x47B9, 0xCC64, 0xCC64, 0x2337,
+ 0xCC65, 0xCC6C, 0x47BC, 0xCC6D, 0xCC6D, 0x1FF9, 0xCC6E, 0xCC78, 0x47C4,
+ 0xCC79, 0xCC79, 0x2353, 0xCC7A, 0xCC7C, 0x47CF, 0xCC7D, 0xCC7D, 0x2061,
+ 0xCC7E, 0xCC7E, 0x47D2, 0xCC80, 0xCC8D, 0x47D3, 0xCC8E, 0xCC8E, 0x1E95,
+ 0xCC8F, 0xCC93, 0x47E1, 0xCC94, 0xCC94, 0x2049, 0xCC95, 0xCC95, 0x47E6,
+ 0xCC96, 0xCC96, 0x1F42, 0xCC97, 0xCC9C, 0x47E7, 0xCC9D, 0xCC9D, 0x1FE8,
+ 0xCC9E, 0xCCA0, 0x47ED, 0xCCA1, 0xCCFE, 0x0DF4, 0xCD40, 0xCD7E, 0x47F0,
+ 0xCD80, 0xCD8F, 0x482F, 0xCD90, 0xCD90, 0x25DA, 0xCD91, 0xCD97, 0x483F,
+ 0xCD98, 0xCD98, 0x25D7, 0xCD99, 0xCDA0, 0x4846, 0xCDA1, 0xCDFE, 0x0E52,
+ 0xCE40, 0xCE66, 0x484E, 0xCE67, 0xCE67, 0x212E, 0xCE68, 0xCE71, 0x4875,
+ 0xCE72, 0xCE72, 0x21B2, 0xCE73, 0xCE7E, 0x487F, 0xCE80, 0xCE80, 0x488B,
+ 0xCE81, 0xCE81, 0x219E, 0xCE82, 0xCE86, 0x488C, 0xCE87, 0xCE87, 0x25DC,
+ 0xCE88, 0xCE9A, 0x4891, 0xCE9B, 0xCE9B, 0x206C, 0xCE9C, 0xCE9D, 0x48A4,
+ 0xCE9E, 0xCE9E, 0x2226, 0xCE9F, 0xCEA0, 0x48A6, 0xCEA1, 0xCEFE, 0x0EB0,
+ 0xCF40, 0xCF4D, 0x48A8, 0xCF4E, 0xCF4E, 0x25E0, 0xCF4F, 0xCF54, 0x48B6,
+ 0xCF55, 0xCF55, 0x227B, 0xCF56, 0xCF57, 0x48BC, 0xCF58, 0xCF58, 0x25DE,
+ 0xCF59, 0xCF5B, 0x48BE, 0xCF5C, 0xCF5C, 0x25E1, 0xCF5D, 0xCF6B, 0x48C1,
+ 0xCF6C, 0xCF6C, 0x25D5, 0xCF6D, 0xCF72, 0x48D0, 0xCF73, 0xCF73, 0x1E6B,
+ 0xCF74, 0xCF74, 0x48D6, 0xCF75, 0xCF75, 0x25DB, 0xCF76, 0xCF77, 0x48D7,
+ 0xCF78, 0xCF78, 0x1E89, 0xCF79, 0xCF7B, 0x48D9, 0xCF7C, 0xCF7C, 0x25D9,
+ 0xCF7D, 0xCF7E, 0x48DC, 0xCF80, 0xCF80, 0x48DE, 0xCF81, 0xCF81, 0x2211,
+ 0xCF82, 0xCF88, 0x48DF, 0xCF89, 0xCF89, 0x2229, 0xCF8A, 0xCF8A, 0x25D6,
+ 0xCF8B, 0xCF92, 0x48E6, 0xCF93, 0xCF93, 0x25DD, 0xCF94, 0xCF94, 0x25DF,
+ 0xCF95, 0xCF9D, 0x48EE, 0xCF9E, 0xCF9E, 0x1FEF, 0xCF9F, 0xCF9F, 0x48F7,
+ 0xCFA0, 0xCFA0, 0x25D8, 0xCFA1, 0xCFFE, 0x0F0E, 0xD040, 0xD04C, 0x48F8,
+ 0xD04D, 0xD04D, 0x1F29, 0xD04E, 0xD050, 0x4905, 0xD051, 0xD051, 0x1E5B,
+ 0xD052, 0xD054, 0x4908, 0xD055, 0xD055, 0x2076, 0xD056, 0xD05B, 0x490B,
+ 0xD05C, 0xD05C, 0x2297, 0xD05D, 0xD05F, 0x4911, 0xD060, 0xD060, 0x2690,
+ 0xD061, 0xD066, 0x4914, 0xD067, 0xD067, 0x213F, 0xD068, 0xD06B, 0x491A,
+ 0xD06C, 0xD06C, 0x2198, 0xD06D, 0xD06D, 0x491E, 0xD06E, 0xD06E, 0x1E88,
+ 0xD06F, 0xD07C, 0x491F, 0xD07D, 0xD07D, 0x228C, 0xD07E, 0xD07E, 0x492D,
+ 0xD080, 0xD0A0, 0x492E, 0xD0A1, 0xD0FE, 0x0F6C, 0xD140, 0xD154, 0x494F,
+ 0xD155, 0xD155, 0x25F1, 0xD156, 0xD158, 0x4964, 0xD159, 0xD159, 0x200C,
+ 0xD15A, 0xD160, 0x4967, 0xD161, 0xD161, 0x1E58, 0xD162, 0xD162, 0x22AC,
+ 0xD163, 0xD174, 0x496E, 0xD175, 0xD175, 0x26A7, 0xD176, 0xD17C, 0x4980,
+ 0xD17D, 0xD17D, 0x2676, 0xD17E, 0xD17E, 0x4987, 0xD180, 0xD19C, 0x4988,
+ 0xD19D, 0xD19D, 0x1FE1, 0xD19E, 0xD19E, 0x25BB, 0xD19F, 0xD1A0, 0x49A5,
+ 0xD1A1, 0xD1FE, 0x0FCA, 0xD240, 0xD240, 0x25BE, 0xD241, 0xD242, 0x49A7,
+ 0xD243, 0xD243, 0x22DD, 0xD244, 0xD24C, 0x49A9, 0xD24D, 0xD24D, 0x25BD,
+ 0xD24E, 0xD25B, 0x49B2, 0xD25C, 0xD25C, 0x1E2A, 0xD25D, 0xD262, 0x49C0,
+ 0xD263, 0xD263, 0x25BC, 0xD264, 0xD264, 0x25BA, 0xD265, 0xD267, 0x49C6,
+ 0xD268, 0xD268, 0x25BF, 0xD269, 0xD26C, 0x49C9, 0xD26D, 0xD26D, 0x2187,
+ 0xD26E, 0xD26E, 0x49CD, 0xD26F, 0xD26F, 0x266B, 0xD270, 0xD271, 0x49CE,
+ 0xD272, 0xD272, 0x1E7F, 0xD273, 0xD274, 0x49D0, 0xD275, 0xD275, 0x21AD,
+ 0xD276, 0xD27E, 0x49D2, 0xD280, 0xD289, 0x49DB, 0xD28A, 0xD28A, 0x1F96,
+ 0xD28B, 0xD28D, 0x49E5, 0xD28E, 0xD28E, 0x1F32, 0xD28F, 0xD291, 0x49E8,
+ 0xD292, 0xD292, 0x2084, 0xD293, 0xD294, 0x49EB, 0xD295, 0xD295, 0x2136,
+ 0xD296, 0xD296, 0x49ED, 0xD297, 0xD297, 0x24B8, 0xD298, 0xD29F, 0x49EE,
+ 0xD2A0, 0xD2A0, 0x24BA, 0xD2A1, 0xD2FE, 0x1028, 0xD340, 0xD343, 0x49F6,
+ 0xD344, 0xD344, 0x24BC, 0xD345, 0xD347, 0x49FA, 0xD348, 0xD348, 0x20E4,
+ 0xD349, 0xD349, 0x49FD, 0xD34A, 0xD34A, 0x24B9, 0xD34B, 0xD34C, 0x49FE,
+ 0xD34D, 0xD34D, 0x24BD, 0xD34E, 0xD34F, 0x4A00, 0xD350, 0xD350, 0x24BE,
+ 0xD351, 0xD354, 0x4A02, 0xD355, 0xD355, 0x24BF, 0xD356, 0xD357, 0x4A06,
+ 0xD358, 0xD358, 0x1FD2, 0xD359, 0xD35A, 0x4A08, 0xD35B, 0xD35B, 0x1FFD,
+ 0xD35C, 0xD35C, 0x4A0A, 0xD35D, 0xD35D, 0x24BB, 0xD35E, 0xD35E, 0x1F2D,
+ 0xD35F, 0xD377, 0x4A0B, 0xD378, 0xD378, 0x2609, 0xD379, 0xD379, 0x4A24,
+ 0xD37A, 0xD37A, 0x260A, 0xD37B, 0xD37B, 0x4A25, 0xD37C, 0xD37C, 0x1E94,
+ 0xD37D, 0xD37E, 0x4A26, 0xD380, 0xD384, 0x4A28, 0xD385, 0xD385, 0x22DF,
+ 0xD386, 0xD386, 0x1ECB, 0xD387, 0xD387, 0x1F0D, 0xD388, 0xD38A, 0x4A2D,
+ 0xD38B, 0xD38B, 0x1F77, 0xD38C, 0xD38C, 0x4A30, 0xD38D, 0xD38D, 0x21EB,
+ 0xD38E, 0xD38E, 0x4A31, 0xD38F, 0xD38F, 0x22E1, 0xD390, 0xD390, 0x4A32,
+ 0xD391, 0xD391, 0x216F, 0xD392, 0xD392, 0x4A33, 0xD393, 0xD393, 0x22E0,
+ 0xD394, 0xD395, 0x4A34, 0xD396, 0xD396, 0x21EA, 0xD397, 0xD397, 0x4A36,
+ 0xD398, 0xD398, 0x22E2, 0xD399, 0xD399, 0x20CB, 0xD39A, 0xD39A, 0x4A37,
+ 0xD39B, 0xD39B, 0x1F78, 0xD39C, 0xD39D, 0x4A38, 0xD39E, 0xD39E, 0x1EE2,
+ 0xD39F, 0xD39F, 0x4A3A, 0xD3A0, 0xD3A0, 0x21F2, 0xD3A1, 0xD3FE, 0x1086,
+ 0xD440, 0xD440, 0x4A3B, 0xD441, 0xD441, 0x2150, 0xD442, 0xD444, 0x4A3C,
+ 0xD445, 0xD445, 0x1FD3, 0xD446, 0xD446, 0x4A3F, 0xD447, 0xD447, 0x22E5,
+ 0xD448, 0xD44B, 0x4A40, 0xD44C, 0xD44C, 0x1EF2, 0xD44D, 0xD44E, 0x4A44,
+ 0xD44F, 0xD44F, 0x211F, 0xD450, 0xD452, 0x4A46, 0xD453, 0xD453, 0x21DD,
+ 0xD454, 0xD455, 0x4A49, 0xD456, 0xD456, 0x2154, 0xD457, 0xD457, 0x4A4B,
+ 0xD458, 0xD458, 0x22E7, 0xD459, 0xD45B, 0x4A4C, 0xD45C, 0xD45C, 0x2282,
+ 0xD45D, 0xD461, 0x4A4F, 0xD462, 0xD462, 0x22E6, 0xD463, 0xD466, 0x4A54,
+ 0xD467, 0xD467, 0x22E8, 0xD468, 0xD46D, 0x4A58, 0xD46E, 0xD46E, 0x22E4,
+ 0xD46F, 0xD46F, 0x4A5E, 0xD470, 0xD470, 0x226A, 0xD471, 0xD471, 0x4A5F,
+ 0xD472, 0xD472, 0x22EB, 0xD473, 0xD473, 0x4A60, 0xD474, 0xD474, 0x22E9,
+ 0xD475, 0xD475, 0x20BD, 0xD476, 0xD477, 0x4A61, 0xD478, 0xD478, 0x22EA,
+ 0xD479, 0xD47A, 0x4A63, 0xD47B, 0xD47B, 0x22BD, 0xD47C, 0xD47D, 0x4A65,
+ 0xD47E, 0xD47E, 0x1E9E, 0xD480, 0xD481, 0x4A67, 0xD482, 0xD482, 0x22F6,
+ 0xD483, 0xD483, 0x21E7, 0xD484, 0xD484, 0x2216, 0xD485, 0xD486, 0x4A69,
+ 0xD487, 0xD487, 0x2137, 0xD488, 0xD489, 0x4A6B, 0xD48A, 0xD48A, 0x212C,
+ 0xD48B, 0xD48B, 0x4A6D, 0xD48C, 0xD48C, 0x1E68, 0xD48D, 0xD48D, 0x22F2,
+ 0xD48E, 0xD48E, 0x1F37, 0xD48F, 0xD48F, 0x22F3, 0xD490, 0xD490, 0x4A6E,
+ 0xD491, 0xD491, 0x22EF, 0xD492, 0xD492, 0x1F50, 0xD493, 0xD493, 0x1F10,
+ 0xD494, 0xD494, 0x21C8, 0xD495, 0xD495, 0x4A6F, 0xD496, 0xD496, 0x22F1,
+ 0xD497, 0xD49B, 0x4A70, 0xD49C, 0xD49C, 0x22F0, 0xD49D, 0xD49E, 0x4A75,
+ 0xD49F, 0xD49F, 0x22EE, 0xD4A0, 0xD4A0, 0x4A77, 0xD4A1, 0xD4FE, 0x10E4,
+ 0xD540, 0xD542, 0x4A78, 0xD543, 0xD543, 0x22ED, 0xD544, 0xD544, 0x229E,
+ 0xD545, 0xD545, 0x22EC, 0xD546, 0xD546, 0x1FE2, 0xD547, 0xD549, 0x4A7B,
+ 0xD54A, 0xD54A, 0x20FE, 0xD54B, 0xD54D, 0x4A7E, 0xD54E, 0xD54F, 0x22F9,
+ 0xD550, 0xD550, 0x4A81, 0xD551, 0xD551, 0x1EAF, 0xD552, 0xD553, 0x4A82,
+ 0xD554, 0xD554, 0x2236, 0xD555, 0xD555, 0x4A84, 0xD556, 0xD556, 0x22F7,
+ 0xD557, 0xD559, 0x4A85, 0xD55A, 0xD55A, 0x223D, 0xD55B, 0xD55B, 0x4A88,
+ 0xD55C, 0xD55C, 0x1E82, 0xD55D, 0xD55D, 0x1FB6, 0xD55E, 0xD55E, 0x4A89,
+ 0xD55F, 0xD55F, 0x21A4, 0xD560, 0xD560, 0x21AA, 0xD561, 0xD561, 0x22F8,
+ 0xD562, 0xD562, 0x2151, 0xD563, 0xD563, 0x4A8A, 0xD564, 0xD564, 0x1F60,
+ 0xD565, 0xD567, 0x4A8B, 0xD568, 0xD568, 0x2147, 0xD569, 0xD56B, 0x4A8E,
+ 0xD56C, 0xD56C, 0x2145, 0xD56D, 0xD56D, 0x4A91, 0xD56E, 0xD56E, 0x1FDC,
+ 0xD56F, 0xD571, 0x4A92, 0xD572, 0xD572, 0x2301, 0xD573, 0xD574, 0x4A95,
+ 0xD575, 0xD575, 0x1EF5, 0xD576, 0xD577, 0x4A97, 0xD578, 0xD578, 0x2218,
+ 0xD579, 0xD57A, 0x4A99, 0xD57B, 0xD57B, 0x1EC6, 0xD57C, 0xD57D, 0x4A9B,
+ 0xD57E, 0xD57E, 0x2300, 0xD580, 0xD580, 0x4A9D, 0xD581, 0xD581, 0x22B4,
+ 0xD582, 0xD583, 0x4A9E, 0xD584, 0xD584, 0x2169, 0xD585, 0xD585, 0x4AA0,
+ 0xD586, 0xD586, 0x22FD, 0xD587, 0xD587, 0x4AA1, 0xD588, 0xD588, 0x20EA,
+ 0xD589, 0xD589, 0x4AA2, 0xD58A, 0xD58A, 0x22F4, 0xD58B, 0xD58B, 0x4AA3,
+ 0xD58C, 0xD58C, 0x22FB, 0xD58D, 0xD58D, 0x4AA4, 0xD58E, 0xD58E, 0x22FC,
+ 0xD58F, 0xD58F, 0x2027, 0xD590, 0xD592, 0x4AA5, 0xD593, 0xD593, 0x2060,
+ 0xD594, 0xD594, 0x22FF, 0xD595, 0xD597, 0x4AA8, 0xD598, 0xD598, 0x22FE,
+ 0xD599, 0xD599, 0x1EC7, 0xD59A, 0xD59A, 0x4AAB, 0xD59B, 0xD59B, 0x230C,
+ 0xD59C, 0xD59E, 0x4AAC, 0xD59F, 0xD59F, 0x22F5, 0xD5A0, 0xD5A0, 0x4AAF,
+ 0xD5A1, 0xD5FE, 0x1142, 0xD640, 0xD640, 0x2306, 0xD641, 0xD641, 0x4AB0,
+ 0xD642, 0xD642, 0x230A, 0xD643, 0xD643, 0x21D3, 0xD644, 0xD646, 0x4AB1,
+ 0xD647, 0xD647, 0x2303, 0xD648, 0xD648, 0x4AB4, 0xD649, 0xD649, 0x2307,
+ 0xD64A, 0xD64A, 0x230B, 0xD64B, 0xD64C, 0x4AB5, 0xD64D, 0xD64D, 0x1F5F,
+ 0xD64E, 0xD64E, 0x4AB7, 0xD64F, 0xD64F, 0x2309, 0xD650, 0xD651, 0x4AB8,
+ 0xD652, 0xD652, 0x2302, 0xD653, 0xD653, 0x1F04, 0xD654, 0xD654, 0x229D,
+ 0xD655, 0xD655, 0x4ABA, 0xD656, 0xD656, 0x21FB, 0xD657, 0xD657, 0x4ABB,
+ 0xD658, 0xD658, 0x2308, 0xD659, 0xD659, 0x4ABC, 0xD65A, 0xD65A, 0x20AC,
+ 0xD65B, 0xD65B, 0x4ABD, 0xD65C, 0xD65C, 0x208E, 0xD65D, 0xD65D, 0x2305,
+ 0xD65E, 0xD65E, 0x2197, 0xD65F, 0xD65F, 0x4ABE, 0xD660, 0xD660, 0x2171,
+ 0xD661, 0xD661, 0x2298, 0xD662, 0xD664, 0x4ABF, 0xD665, 0xD665, 0x1F57,
+ 0xD666, 0xD668, 0x4AC2, 0xD669, 0xD669, 0x2082, 0xD66A, 0xD66A, 0x4AC5,
+ 0xD66B, 0xD66B, 0x2311, 0xD66C, 0xD66E, 0x4AC6, 0xD66F, 0xD66F, 0x2304,
+ 0xD670, 0xD670, 0x4AC9, 0xD671, 0xD671, 0x230F, 0xD672, 0xD672, 0x1E35,
+ 0xD673, 0xD673, 0x4ACA, 0xD674, 0xD674, 0x20D1, 0xD675, 0xD675, 0x2310,
+ 0xD676, 0xD676, 0x1FA3, 0xD677, 0xD677, 0x4ACB, 0xD678, 0xD678, 0x21D6,
+ 0xD679, 0xD67B, 0x4ACC, 0xD67C, 0xD67C, 0x2206, 0xD67D, 0xD67E, 0x4ACF,
+ 0xD680, 0xD682, 0x4AD1, 0xD683, 0xD683, 0x230D, 0xD684, 0xD685, 0x4AD4,
+ 0xD686, 0xD686, 0x2312, 0xD687, 0xD687, 0x208D, 0xD688, 0xD688, 0x2313,
+ 0xD689, 0xD68D, 0x4AD6, 0xD68E, 0xD68E, 0x22E3, 0xD68F, 0xD693, 0x4ADB,
+ 0xD694, 0xD694, 0x1FBA, 0xD695, 0xD698, 0x4AE0, 0xD699, 0xD699, 0x2078,
+ 0xD69A, 0xD6A0, 0x4AE4, 0xD6A1, 0xD6FE, 0x11A0, 0xD740, 0xD742, 0x4AEB,
+ 0xD743, 0xD743, 0x2288, 0xD744, 0xD747, 0x4AEE, 0xD748, 0xD748, 0x2316,
+ 0xD749, 0xD749, 0x1F6B, 0xD74A, 0xD74F, 0x4AF2, 0xD750, 0xD750, 0x2314,
+ 0xD751, 0xD751, 0x4AF8, 0xD752, 0xD752, 0x2130, 0xD753, 0xD753, 0x2315,
+ 0xD754, 0xD754, 0x2168, 0xD755, 0xD755, 0x4AF9, 0xD756, 0xD756, 0x20C4,
+ 0xD757, 0xD763, 0x4AFA, 0xD764, 0xD764, 0x2318, 0xD765, 0xD766, 0x4B07,
+ 0xD767, 0xD767, 0x2219, 0xD768, 0xD768, 0x2217, 0xD769, 0xD76B, 0x4B09,
+ 0xD76C, 0xD76C, 0x20D5, 0xD76D, 0xD76E, 0x4B0C, 0xD76F, 0xD76F, 0x1F4A,
+ 0xD770, 0xD774, 0x4B0E, 0xD775, 0xD775, 0x2240, 0xD776, 0xD777, 0x4B13,
+ 0xD778, 0xD778, 0x1ED3, 0xD779, 0xD77E, 0x4B15, 0xD780, 0xD782, 0x4B1B,
+ 0xD783, 0xD783, 0x1E49, 0xD784, 0xD786, 0x4B1E, 0xD787, 0xD787, 0x261B,
+ 0xD788, 0xD78A, 0x4B21, 0xD78B, 0xD78B, 0x1E6D, 0xD78C, 0xD78C, 0x20F8,
+ 0xD78D, 0xD78D, 0x4B24, 0xD78E, 0xD78E, 0x1FFB, 0xD78F, 0xD78F, 0x2319,
+ 0xD790, 0xD794, 0x4B25, 0xD795, 0xD795, 0x230E, 0xD796, 0xD796, 0x4B2A,
+ 0xD797, 0xD797, 0x2317, 0xD798, 0xD7A0, 0x4B2B, 0xD7A1, 0xD7F9, 0x11FE,
+ 0xD840, 0xD84C, 0x4B34, 0xD84D, 0xD84D, 0x20C8, 0xD84E, 0xD852, 0x4B41,
+ 0xD853, 0xD853, 0x1EFD, 0xD854, 0xD87E, 0x4B46, 0xD880, 0xD88F, 0x4B71,
+ 0xD890, 0xD890, 0x1E3B, 0xD891, 0xD891, 0x227F, 0xD892, 0xD892, 0x4B81,
+ 0xD893, 0xD893, 0x1F0C, 0xD894, 0xD894, 0x1E59, 0xD895, 0xD895, 0x1F24,
+ 0xD896, 0xD899, 0x4B82, 0xD89A, 0xD89A, 0x20BA, 0xD89B, 0xD89B, 0x1F65,
+ 0xD89C, 0xD89C, 0x1EF0, 0xD89D, 0xD89D, 0x2164, 0xD89E, 0xD89E, 0x1F30,
+ 0xD89F, 0xD89F, 0x2261, 0xD8A0, 0xD8A0, 0x4B86, 0xD8A1, 0xD8FE, 0x1257,
+ 0xD940, 0xD940, 0x4B87, 0xD941, 0xD941, 0x22A2, 0xD942, 0xD942, 0x24AB,
+ 0xD943, 0xD943, 0x4B88, 0xD944, 0xD944, 0x24AF, 0xD945, 0xD945, 0x1EE8,
+ 0xD946, 0xD946, 0x1F39, 0xD947, 0xD947, 0x4B89, 0xD948, 0xD948, 0x1E48,
+ 0xD949, 0xD949, 0x2070, 0xD94A, 0xD94A, 0x1EA8, 0xD94B, 0xD94B, 0x4B8A,
+ 0xD94C, 0xD94C, 0x24AC, 0xD94D, 0xD94D, 0x1EF7, 0xD94E, 0xD94E, 0x2176,
+ 0xD94F, 0xD94F, 0x24AD, 0xD950, 0xD950, 0x4B8B, 0xD951, 0xD951, 0x207B,
+ 0xD952, 0xD952, 0x1F45, 0xD953, 0xD953, 0x24AA, 0xD954, 0xD954, 0x204B,
+ 0xD955, 0xD955, 0x202F, 0xD956, 0xD956, 0x1F5A, 0xD957, 0xD957, 0x24B0,
+ 0xD958, 0xD958, 0x4B8C, 0xD959, 0xD959, 0x22B7, 0xD95A, 0xD95A, 0x1F7F,
+ 0xD95B, 0xD95B, 0x4B8D, 0xD95C, 0xD95C, 0x2265, 0xD95D, 0xD962, 0x4B8E,
+ 0xD963, 0xD963, 0x24B2, 0xD964, 0xD964, 0x211B, 0xD965, 0xD965, 0x1E51,
+ 0xD966, 0xD966, 0x4B94, 0xD967, 0xD967, 0x24B4, 0xD968, 0xD96B, 0x4B95,
+ 0xD96C, 0xD96C, 0x24B3, 0xD96D, 0xD96D, 0x4B99, 0xD96E, 0xD96E, 0x1E9F,
+ 0xD96F, 0xD96F, 0x4B9A, 0xD970, 0xD970, 0x2118, 0xD971, 0xD971, 0x4B9B,
+ 0xD972, 0xD972, 0x20B4, 0xD973, 0xD973, 0x23AF, 0xD974, 0xD974, 0x21BB,
+ 0xD975, 0xD975, 0x2072, 0xD976, 0xD976, 0x1F95, 0xD977, 0xD977, 0x4B9C,
+ 0xD978, 0xD978, 0x1F0A, 0xD979, 0xD979, 0x24B6, 0xD97A, 0xD97B, 0x4B9D,
+ 0xD97C, 0xD97C, 0x2291, 0xD97D, 0xD97D, 0x24B5, 0xD97E, 0xD97E, 0x2278,
+ 0xD980, 0xD980, 0x1ED4, 0xD981, 0xD986, 0x4B9F, 0xD987, 0xD987, 0x1FF3,
+ 0xD988, 0xD98C, 0x4BA5, 0xD98D, 0xD98D, 0x22A9, 0xD98E, 0xD98E, 0x24B7,
+ 0xD98F, 0xD98F, 0x1F28, 0xD990, 0xD990, 0x2109, 0xD991, 0xD991, 0x22C7,
+ 0xD992, 0xD996, 0x4BAA, 0xD997, 0xD997, 0x24AE, 0xD998, 0xD998, 0x22B1,
+ 0xD999, 0xD99A, 0x4BAF, 0xD99B, 0xD99B, 0x2266, 0xD99C, 0xD99C, 0x4BB1,
+ 0xD99D, 0xD99D, 0x225B, 0xD99E, 0xD99E, 0x22C4, 0xD99F, 0xD99F, 0x4BB2,
+ 0xD9A0, 0xD9A0, 0x2115, 0xD9A1, 0xD9FE, 0x12B5, 0xDA40, 0xDA40, 0x4BB3,
+ 0xDA41, 0xDA41, 0x222A, 0xDA42, 0xDA42, 0x24B1, 0xDA43, 0xDA47, 0x4BB4,
+ 0xDA48, 0xDA48, 0x213D, 0xDA49, 0xDA4C, 0x4BB9, 0xDA4D, 0xDA4D, 0x1F15,
+ 0xDA4E, 0xDA4E, 0x225C, 0xDA4F, 0xDA72, 0x4BBD, 0xDA73, 0xDA73, 0x1F14,
+ 0xDA74, 0xDA76, 0x4BE1, 0xDA77, 0xDA77, 0x227A, 0xDA78, 0xDA7E, 0x4BE4,
+ 0xDA80, 0xDA84, 0x4BEB, 0xDA85, 0xDA85, 0x20EE, 0xDA86, 0xDA8D, 0x4BF0,
+ 0xDA8E, 0xDA8E, 0x25F8, 0xDA8F, 0xDAA0, 0x4BF8, 0xDAA1, 0xDAFE, 0x1313,
+ 0xDB40, 0xDB5F, 0x4C0A, 0xDB60, 0xDB60, 0x1F94, 0xDB61, 0xDB77, 0x4C2A,
+ 0xDB78, 0xDB78, 0x2230, 0xDB79, 0xDB7E, 0x4C41, 0xDB80, 0xDB83, 0x4C47,
+ 0xDB84, 0xDB84, 0x25FD, 0xDB85, 0xDB8A, 0x4C4B, 0xDB8B, 0xDB8B, 0x2600,
+ 0xDB8C, 0xDB97, 0x4C51, 0xDB98, 0xDB98, 0x2606, 0xDB99, 0xDBA0, 0x4C5D,
+ 0xDBA1, 0xDBFE, 0x1371, 0xDC40, 0xDC44, 0x4C65, 0xDC45, 0xDC45, 0x25FF,
+ 0xDC46, 0xDC4E, 0x4C6A, 0xDC4F, 0xDC4F, 0x25FC, 0xDC50, 0xDC50, 0x1E8C,
+ 0xDC51, 0xDC51, 0x2602, 0xDC52, 0xDC52, 0x4C73, 0xDC53, 0xDC53, 0x224D,
+ 0xDC54, 0xDC54, 0x4C74, 0xDC55, 0xDC55, 0x2604, 0xDC56, 0xDC56, 0x25FE,
+ 0xDC57, 0xDC57, 0x2603, 0xDC58, 0xDC5C, 0x4C75, 0xDC5D, 0xDC5D, 0x2601,
+ 0xDC5E, 0xDC61, 0x4C7A, 0xDC62, 0xDC62, 0x2605, 0xDC63, 0xDC65, 0x4C7E,
+ 0xDC66, 0xDC66, 0x1EA3, 0xDC67, 0xDC67, 0x2608, 0xDC68, 0xDC6A, 0x4C81,
+ 0xDC6B, 0xDC6B, 0x2607, 0xDC6C, 0xDC7B, 0x4C84, 0xDC7C, 0xDC7C, 0x20F0,
+ 0xDC7D, 0xDC7E, 0x4C94, 0xDC80, 0xDC86, 0x4C96, 0xDC87, 0xDC87, 0x1E7B,
+ 0xDC88, 0xDC88, 0x2267, 0xDC89, 0xDC89, 0x1F36, 0xDC8A, 0xDC8A, 0x1FD6,
+ 0xDC8B, 0xDC8D, 0x4C9D, 0xDC8E, 0xDC8E, 0x21E0, 0xDC8F, 0xDC8F, 0x4CA0,
+ 0xDC90, 0xDC90, 0x248C, 0xDC91, 0xDC96, 0x4CA1, 0xDC97, 0xDC97, 0x248D,
+ 0xDC98, 0xDC9A, 0x4CA7, 0xDC9B, 0xDC9B, 0x2102, 0xDC9C, 0xDC9F, 0x4CAA,
+ 0xDCA0, 0xDCA0, 0x2494, 0xDCA1, 0xDCFE, 0x13CF, 0xDD40, 0xDD45, 0x4CAE,
+ 0xDD46, 0xDD46, 0x2493, 0xDD47, 0xDD4C, 0x4CB4, 0xDD4D, 0xDD4D, 0x248E,
+ 0xDD4E, 0xDD52, 0x4CBA, 0xDD53, 0xDD53, 0x2299, 0xDD54, 0xDD54, 0x2491,
+ 0xDD55, 0xDD55, 0x2496, 0xDD56, 0xDD56, 0x248F, 0xDD57, 0xDD57, 0x2492,
+ 0xDD58, 0xDD58, 0x4CBF, 0xDD59, 0xDD59, 0x2497, 0xDD5A, 0xDD5D, 0x4CC0,
+ 0xDD5E, 0xDD5E, 0x1FB1, 0xDD5F, 0xDD5F, 0x4CC4, 0xDD60, 0xDD60, 0x249A,
+ 0xDD61, 0xDD61, 0x4CC5, 0xDD62, 0xDD62, 0x2499, 0xDD63, 0xDD63, 0x4CC6,
+ 0xDD64, 0xDD64, 0x2258, 0xDD65, 0xDD65, 0x2498, 0xDD66, 0xDD6C, 0x4CC7,
+ 0xDD6D, 0xDD6D, 0x249B, 0xDD6E, 0xDD6E, 0x4CCE, 0xDD6F, 0xDD6F, 0x1F09,
+ 0xDD70, 0xDD70, 0x20E6, 0xDD71, 0xDD75, 0x4CCF, 0xDD76, 0xDD76, 0x2026,
+ 0xDD77, 0xDD77, 0x249F, 0xDD78, 0xDD78, 0x1F59, 0xDD79, 0xDD7A, 0x249D,
+ 0xDD7B, 0xDD7E, 0x4CD4, 0xDD80, 0xDD80, 0x4CD8, 0xDD81, 0xDD81, 0x1F3B,
+ 0xDD82, 0xDD82, 0x249C, 0xDD83, 0xDD84, 0x4CD9, 0xDD85, 0xDD85, 0x1E3A,
+ 0xDD86, 0xDD86, 0x205B, 0xDD87, 0xDD8A, 0x4CDB, 0xDD8B, 0xDD8B, 0x1F70,
+ 0xDD8C, 0xDD8E, 0x4CDF, 0xDD8F, 0xDD8F, 0x24A0, 0xDD90, 0xDD93, 0x4CE2,
+ 0xDD94, 0xDD94, 0x213B, 0xDD95, 0xDD96, 0x4CE6, 0xDD97, 0xDD97, 0x1F07,
+ 0xDD98, 0xDD99, 0x4CE8, 0xDD9A, 0xDD9A, 0x2270, 0xDD9B, 0xDD9B, 0x2237,
+ 0xDD9C, 0xDD9D, 0x4CEA, 0xDD9E, 0xDD9E, 0x24D2, 0xDD9F, 0xDD9F, 0x4CEC,
+ 0xDDA0, 0xDDA0, 0x21B3, 0xDDA1, 0xDDFE, 0x142D, 0xDE40, 0xDE40, 0x2245,
+ 0xDE41, 0xDE41, 0x24A1, 0xDE42, 0xDE43, 0x4CED, 0xDE44, 0xDE44, 0x22A8,
+ 0xDE45, 0xDE47, 0x4CEF, 0xDE48, 0xDE48, 0x227C, 0xDE49, 0xDE49, 0x1FB0,
+ 0xDE4A, 0xDE4E, 0x4CF2, 0xDE4F, 0xDE4F, 0x24A2, 0xDE50, 0xDE59, 0x4CF7,
+ 0xDE5A, 0xDE5A, 0x1F46, 0xDE5B, 0xDE5B, 0x4D01, 0xDE5C, 0xDE5C, 0x2380,
+ 0xDE5D, 0xDE5D, 0x2495, 0xDE5E, 0xDE5E, 0x4D02, 0xDE5F, 0xDE5F, 0x2490,
+ 0xDE60, 0xDE6A, 0x4D03, 0xDE6B, 0xDE6B, 0x1E30, 0xDE6C, 0xDE6E, 0x4D0E,
+ 0xDE6F, 0xDE6F, 0x1E9D, 0xDE70, 0xDE70, 0x1E4B, 0xDE71, 0xDE71, 0x1E4A,
+ 0xDE72, 0xDE72, 0x20AA, 0xDE73, 0xDE7E, 0x4D11, 0xDE80, 0xDE91, 0x4D1D,
+ 0xDE92, 0xDE92, 0x267B, 0xDE93, 0xDE9E, 0x4D2F, 0xDE9F, 0xDE9F, 0x23F2,
+ 0xDEA0, 0xDEA0, 0x4D3B, 0xDEA1, 0xDEFE, 0x148B, 0xDF40, 0xDF40, 0x227E,
+ 0xDF41, 0xDF41, 0x4D3C, 0xDF42, 0xDF42, 0x2019, 0xDF43, 0xDF4C, 0x4D3D,
+ 0xDF4D, 0xDF4D, 0x1FBB, 0xDF4E, 0xDF5B, 0x4D47, 0xDF5C, 0xDF5C, 0x2253,
+ 0xDF5D, 0xDF5D, 0x4D55, 0xDF5E, 0xDF5E, 0x1F3E, 0xDF5F, 0xDF5F, 0x1EA6,
+ 0xDF60, 0xDF60, 0x218E, 0xDF61, 0xDF63, 0x4D56, 0xDF64, 0xDF64, 0x21EC,
+ 0xDF65, 0xDF65, 0x4D59, 0xDF66, 0xDF66, 0x1EBE, 0xDF67, 0xDF67, 0x4D5A,
+ 0xDF68, 0xDF68, 0x224A, 0xDF69, 0xDF6C, 0x4D5B, 0xDF6D, 0xDF6D, 0x2133,
+ 0xDF6E, 0xDF73, 0x4D5F, 0xDF74, 0xDF74, 0x1E84, 0xDF75, 0xDF76, 0x4D65,
+ 0xDF77, 0xDF77, 0x20CF, 0xDF78, 0xDF78, 0x21E2, 0xDF79, 0xDF79, 0x4D67,
+ 0xDF7A, 0xDF7A, 0x220F, 0xDF7B, 0xDF7B, 0x4D68, 0xDF7C, 0xDF7C, 0x2029,
+ 0xDF7D, 0xDF7D, 0x4D69, 0xDF7E, 0xDF7E, 0x2073, 0xDF80, 0xDF80, 0x1F55,
+ 0xDF81, 0xDF82, 0x4D6A, 0xDF83, 0xDF83, 0x23F1, 0xDF84, 0xDF84, 0x4D6C,
+ 0xDF85, 0xDF85, 0x1E46, 0xDF86, 0xDF88, 0x4D6D, 0xDF89, 0xDF89, 0x2063,
+ 0xDF8A, 0xDF8A, 0x23F3, 0xDF8B, 0xDFA0, 0x4D70, 0xDFA1, 0xDFFE, 0x14E9,
+ 0xE040, 0xE04F, 0x4D86, 0xE050, 0xE050, 0x231E, 0xE051, 0xE05C, 0x4D96,
+ 0xE05D, 0xE05D, 0x2233, 0xE05E, 0xE068, 0x4DA2, 0xE069, 0xE069, 0x2320,
+ 0xE06A, 0xE06B, 0x4DAD, 0xE06C, 0xE06C, 0x21C7, 0xE06D, 0xE074, 0x4DAF,
+ 0xE075, 0xE075, 0x22BC, 0xE076, 0xE076, 0x4DB7, 0xE077, 0xE077, 0x231C,
+ 0xE078, 0xE078, 0x4DB8, 0xE079, 0xE079, 0x2251, 0xE07A, 0xE07E, 0x4DB9,
+ 0xE080, 0xE086, 0x4DBE, 0xE087, 0xE087, 0x1EBB, 0xE088, 0xE08C, 0x4DC5,
+ 0xE08D, 0xE08D, 0x2287, 0xE08E, 0xE08E, 0x4DCA, 0xE08F, 0xE08F, 0x202D,
+ 0xE090, 0xE090, 0x1EAB, 0xE091, 0xE091, 0x4DCB, 0xE092, 0xE092, 0x231D,
+ 0xE093, 0xE093, 0x4DCC, 0xE094, 0xE094, 0x231F, 0xE095, 0xE096, 0x4DCD,
+ 0xE097, 0xE097, 0x231B, 0xE098, 0xE0A0, 0x4DCF, 0xE0A1, 0xE0FE, 0x1547,
+ 0xE140, 0xE141, 0x4DD8, 0xE142, 0xE142, 0x2321, 0xE143, 0xE163, 0x4DDA,
+ 0xE164, 0xE164, 0x2255, 0xE165, 0xE167, 0x4DFB, 0xE168, 0xE168, 0x1E8F,
+ 0xE169, 0xE173, 0x4DFE, 0xE174, 0xE174, 0x220C, 0xE175, 0xE175, 0x1FA4,
+ 0xE176, 0xE17E, 0x4E09, 0xE180, 0xE183, 0x4E12, 0xE184, 0xE184, 0x209B,
+ 0xE185, 0xE185, 0x21D8, 0xE186, 0xE186, 0x4E16, 0xE187, 0xE187, 0x25FA,
+ 0xE188, 0xE188, 0x4E17, 0xE189, 0xE189, 0x25F9, 0xE18A, 0xE18B, 0x4E18,
+ 0xE18C, 0xE18C, 0x2134, 0xE18D, 0xE18D, 0x4E1A, 0xE18E, 0xE190, 0x24F3,
+ 0xE191, 0xE191, 0x24F8, 0xE192, 0xE192, 0x4E1B, 0xE193, 0xE193, 0x24F7,
+ 0xE194, 0xE194, 0x1EC8, 0xE195, 0xE195, 0x24F6, 0xE196, 0xE197, 0x4E1C,
+ 0xE198, 0xE198, 0x2280, 0xE199, 0xE19D, 0x4E1E, 0xE19E, 0xE19E, 0x1EC5,
+ 0xE19F, 0xE19F, 0x24FB, 0xE1A0, 0xE1A0, 0x4E23, 0xE1A1, 0xE1FE, 0x15A5,
+ 0xE240, 0xE240, 0x4E24, 0xE241, 0xE241, 0x24FA, 0xE242, 0xE242, 0x4E25,
+ 0xE243, 0xE243, 0x1EED, 0xE244, 0xE24E, 0x4E26, 0xE24F, 0xE24F, 0x24FD,
+ 0xE250, 0xE250, 0x4E31, 0xE251, 0xE251, 0x24F9, 0xE252, 0xE252, 0x4E32,
+ 0xE253, 0xE253, 0x24FE, 0xE254, 0xE254, 0x20CD, 0xE255, 0xE259, 0x4E33,
+ 0xE25A, 0xE25A, 0x2508, 0xE25B, 0xE25B, 0x2504, 0xE25C, 0xE25D, 0x4E38,
+ 0xE25E, 0xE25E, 0x2506, 0xE25F, 0xE261, 0x4E3A, 0xE262, 0xE262, 0x24FF,
+ 0xE263, 0xE263, 0x2090, 0xE264, 0xE266, 0x4E3D, 0xE267, 0xE267, 0x1EDD,
+ 0xE268, 0xE268, 0x1F25, 0xE269, 0xE269, 0x4E40, 0xE26A, 0xE26A, 0x2503,
+ 0xE26B, 0xE26B, 0x2502, 0xE26C, 0xE26D, 0x4E41, 0xE26E, 0xE26E, 0x1E7A,
+ 0xE26F, 0xE26F, 0x20A6, 0xE270, 0xE277, 0x4E43, 0xE278, 0xE278, 0x1FD5,
+ 0xE279, 0xE27C, 0x4E4B, 0xE27D, 0xE27D, 0x1F11, 0xE27E, 0xE27E, 0x4E4F,
+ 0xE280, 0xE280, 0x2507, 0xE281, 0xE281, 0x2500, 0xE282, 0xE282, 0x2505,
+ 0xE283, 0xE288, 0x4E50, 0xE289, 0xE289, 0x2519, 0xE28A, 0xE28A, 0x4E56,
+ 0xE28B, 0xE28B, 0x2515, 0xE28C, 0xE28D, 0x4E57, 0xE28E, 0xE28E, 0x250C,
+ 0xE28F, 0xE28F, 0x2031, 0xE290, 0xE291, 0x4E59, 0xE292, 0xE292, 0x250B,
+ 0xE293, 0xE293, 0x250F, 0xE294, 0xE294, 0x251A, 0xE295, 0xE295, 0x2509,
+ 0xE296, 0xE297, 0x4E5B, 0xE298, 0xE298, 0x250E, 0xE299, 0xE299, 0x2234,
+ 0xE29A, 0xE29A, 0x2513, 0xE29B, 0xE29B, 0x1F80, 0xE29C, 0xE29F, 0x4E5D,
+ 0xE2A0, 0xE2A0, 0x2501, 0xE2A1, 0xE2FE, 0x1603, 0xE340, 0xE341, 0x4E61,
+ 0xE342, 0xE342, 0x2517, 0xE343, 0xE343, 0x2516, 0xE344, 0xE346, 0x4E63,
+ 0xE347, 0xE347, 0x2518, 0xE348, 0xE34A, 0x4E66, 0xE34B, 0xE34B, 0x1E56,
+ 0xE34C, 0xE34E, 0x4E69, 0xE34F, 0xE34F, 0x250D, 0xE350, 0xE350, 0x4E6C,
+ 0xE351, 0xE351, 0x20D3, 0xE352, 0xE353, 0x4E6D, 0xE354, 0xE354, 0x207A,
+ 0xE355, 0xE355, 0x20CE, 0xE356, 0xE357, 0x4E6F, 0xE358, 0xE358, 0x2510,
+ 0xE359, 0xE35B, 0x4E71, 0xE35C, 0xE35C, 0x1E55, 0xE35D, 0xE35F, 0x4E74,
+ 0xE360, 0xE360, 0x250A, 0xE361, 0xE365, 0x4E77, 0xE366, 0xE367, 0x2511,
+ 0xE368, 0xE370, 0x4E7C, 0xE371, 0xE371, 0x1FAA, 0xE372, 0xE372, 0x4E85,
+ 0xE373, 0xE373, 0x251E, 0xE374, 0xE374, 0x1F1F, 0xE375, 0xE377, 0x4E86,
+ 0xE378, 0xE378, 0x252D, 0xE379, 0xE379, 0x221D, 0xE37A, 0xE37B, 0x4E89,
+ 0xE37C, 0xE37C, 0x2532, 0xE37D, 0xE37D, 0x4E8B, 0xE37E, 0xE37E, 0x217B,
+ 0xE380, 0xE389, 0x4E8C, 0xE38A, 0xE38A, 0x21AF, 0xE38B, 0xE38B, 0x4E96,
+ 0xE38C, 0xE38C, 0x252C, 0xE38D, 0xE38E, 0x4E97, 0xE38F, 0xE38F, 0x2528,
+ 0xE390, 0xE390, 0x4E99, 0xE391, 0xE391, 0x208C, 0xE392, 0xE392, 0x4E9A,
+ 0xE393, 0xE393, 0x252F, 0xE394, 0xE394, 0x4E9B, 0xE395, 0xE395, 0x21BC,
+ 0xE396, 0xE398, 0x4E9C, 0xE399, 0xE399, 0x251D, 0xE39A, 0xE39B, 0x4E9F,
+ 0xE39C, 0xE39C, 0x2535, 0xE39D, 0xE39D, 0x4EA1, 0xE39E, 0xE39E, 0x220D,
+ 0xE39F, 0xE39F, 0x2526, 0xE3A0, 0xE3A0, 0x4EA2, 0xE3A1, 0xE3FE, 0x1661,
+ 0xE440, 0xE440, 0x2534, 0xE441, 0xE441, 0x252A, 0xE442, 0xE442, 0x251F,
+ 0xE443, 0xE443, 0x2531, 0xE444, 0xE444, 0x251C, 0xE445, 0xE447, 0x4EA3,
+ 0xE448, 0xE448, 0x2525, 0xE449, 0xE44D, 0x4EA6, 0xE44E, 0xE44E, 0x21CD,
+ 0xE44F, 0xE44F, 0x4EAB, 0xE450, 0xE450, 0x21DA, 0xE451, 0xE451, 0x4EAC,
+ 0xE452, 0xE452, 0x2172, 0xE453, 0xE453, 0x253E, 0xE454, 0xE457, 0x4EAD,
+ 0xE458, 0xE458, 0x204F, 0xE459, 0xE459, 0x4EB1, 0xE45A, 0xE45A, 0x2543,
+ 0xE45B, 0xE45B, 0x4EB2, 0xE45C, 0xE45C, 0x21D7, 0xE45D, 0xE45D, 0x4EB3,
+ 0xE45E, 0xE45E, 0x1E3C, 0xE45F, 0xE461, 0x4EB4, 0xE462, 0xE462, 0x2529,
+ 0xE463, 0xE464, 0x4EB7, 0xE465, 0xE465, 0x2521, 0xE466, 0xE467, 0x4EB9,
+ 0xE468, 0xE468, 0x1EFF, 0xE469, 0xE472, 0x4EBB, 0xE473, 0xE473, 0x253F,
+ 0xE474, 0xE474, 0x4EC5, 0xE475, 0xE475, 0x2544, 0xE476, 0xE478, 0x4EC6,
+ 0xE479, 0xE479, 0x2523, 0xE47A, 0xE47A, 0x1E90, 0xE47B, 0xE47B, 0x253A,
+ 0xE47C, 0xE47C, 0x2545, 0xE47D, 0xE47D, 0x4EC9, 0xE47E, 0xE47E, 0x253D,
+ 0xE480, 0xE480, 0x4ECA, 0xE481, 0xE481, 0x20C1, 0xE482, 0xE483, 0x4ECB,
+ 0xE484, 0xE484, 0x2103, 0xE485, 0xE485, 0x2520, 0xE486, 0xE486, 0x253C,
+ 0xE487, 0xE487, 0x253B, 0xE488, 0xE488, 0x2538, 0xE489, 0xE48C, 0x4ECD,
+ 0xE48D, 0xE48D, 0x2540, 0xE48E, 0xE48E, 0x4ED1, 0xE48F, 0xE48F, 0x1FCD,
+ 0xE490, 0xE492, 0x4ED2, 0xE493, 0xE493, 0x1F18, 0xE494, 0xE497, 0x4ED5,
+ 0xE498, 0xE498, 0x254B, 0xE499, 0xE49C, 0x4ED9, 0xE49D, 0xE49D, 0x2547,
+ 0xE49E, 0xE49F, 0x254F, 0xE4A0, 0xE4A0, 0x4EDD, 0xE4A1, 0xE4FE, 0x16BF,
+ 0xE540, 0xE545, 0x4EDE, 0xE546, 0xE546, 0x22B0, 0xE547, 0xE547, 0x4EE4,
+ 0xE548, 0xE548, 0x2546, 0xE549, 0xE54A, 0x4EE5, 0xE54B, 0xE54B, 0x254C,
+ 0xE54C, 0xE54D, 0x4EE7, 0xE54E, 0xE54E, 0x1E9A, 0xE54F, 0xE54F, 0x2552,
+ 0xE550, 0xE550, 0x2530, 0xE551, 0xE551, 0x2549, 0xE552, 0xE554, 0x4EE9,
+ 0xE555, 0xE555, 0x2551, 0xE556, 0xE556, 0x1ECA, 0xE557, 0xE557, 0x4EEC,
+ 0xE558, 0xE558, 0x20D2, 0xE559, 0xE55B, 0x4EED, 0xE55C, 0xE55C, 0x1FB8,
+ 0xE55D, 0xE55D, 0x4EF0, 0xE55E, 0xE55E, 0x2079, 0xE55F, 0xE560, 0x4EF1,
+ 0xE561, 0xE561, 0x21AB, 0xE562, 0xE563, 0x4EF3, 0xE564, 0xE564, 0x254D,
+ 0xE565, 0xE565, 0x1EA5, 0xE566, 0xE567, 0x4EF5, 0xE568, 0xE568, 0x204C,
+ 0xE569, 0xE569, 0x2080, 0xE56A, 0xE56B, 0x4EF7, 0xE56C, 0xE56C, 0x266D,
+ 0xE56D, 0xE56D, 0x4EF9, 0xE56E, 0xE56E, 0x2537, 0xE56F, 0xE574, 0x4EFA,
+ 0xE575, 0xE575, 0x254A, 0xE576, 0xE576, 0x21B8, 0xE577, 0xE577, 0x4F00,
+ 0xE578, 0xE578, 0x254E, 0xE579, 0xE57A, 0x4F01, 0xE57B, 0xE57B, 0x24FC,
+ 0xE57C, 0xE57C, 0x2554, 0xE57D, 0xE57E, 0x4F03, 0xE580, 0xE580, 0x4F05,
+ 0xE581, 0xE581, 0x1F3C, 0xE582, 0xE582, 0x4F06, 0xE583, 0xE583, 0x1ED5,
+ 0xE584, 0xE589, 0x4F07, 0xE58A, 0xE58A, 0x2556, 0xE58B, 0xE58D, 0x4F0D,
+ 0xE58E, 0xE58E, 0x2268, 0xE58F, 0xE590, 0x4F10, 0xE591, 0xE591, 0x1ED6,
+ 0xE592, 0xE599, 0x4F12, 0xE59A, 0xE59A, 0x2557, 0xE59B, 0xE59B, 0x2553,
+ 0xE59C, 0xE59E, 0x4F1A, 0xE59F, 0xE59F, 0x2548, 0xE5A0, 0xE5A0, 0x4F1D,
+ 0xE5A1, 0xE5FE, 0x171D, 0xE640, 0xE640, 0x20DC, 0xE641, 0xE643, 0x4F1E,
+ 0xE644, 0xE644, 0x2559, 0xE645, 0xE648, 0x4F21, 0xE649, 0xE649, 0x1F97,
+ 0xE64A, 0xE64A, 0x2555, 0xE64B, 0xE64D, 0x4F25, 0xE64E, 0xE64E, 0x227D,
+ 0xE64F, 0xE651, 0x4F28, 0xE652, 0xE652, 0x257E, 0xE653, 0xE655, 0x4F2B,
+ 0xE656, 0xE656, 0x207C, 0xE657, 0xE657, 0x4F2E, 0xE658, 0xE658, 0x255A,
+ 0xE659, 0xE65A, 0x4F2F, 0xE65B, 0xE65B, 0x255E, 0xE65C, 0xE65D, 0x4F31,
+ 0xE65E, 0xE65E, 0x1E34, 0xE65F, 0xE668, 0x4F33, 0xE669, 0xE669, 0x215E,
+ 0xE66A, 0xE66A, 0x4F3D, 0xE66B, 0xE66B, 0x2560, 0xE66C, 0xE674, 0x4F3E,
+ 0xE675, 0xE675, 0x21A2, 0xE676, 0xE676, 0x2354, 0xE677, 0xE678, 0x4F47,
+ 0xE679, 0xE679, 0x2563, 0xE67A, 0xE67A, 0x2527, 0xE67B, 0xE67B, 0x4F49,
+ 0xE67C, 0xE67C, 0x252E, 0xE67D, 0xE67D, 0x2558, 0xE67E, 0xE67E, 0x4F4A,
+ 0xE680, 0xE680, 0x1F1B, 0xE681, 0xE681, 0x4F4B, 0xE682, 0xE682, 0x2283,
+ 0xE683, 0xE683, 0x4F4C, 0xE684, 0xE684, 0x2564, 0xE685, 0xE686, 0x4F4D,
+ 0xE687, 0xE687, 0x20A0, 0xE688, 0xE688, 0x4F4F, 0xE689, 0xE689, 0x2565,
+ 0xE68A, 0xE68B, 0x4F50, 0xE68C, 0xE68C, 0x2561, 0xE68D, 0xE692, 0x4F52,
+ 0xE693, 0xE693, 0x2562, 0xE694, 0xE696, 0x4F58, 0xE697, 0xE697, 0x256C,
+ 0xE698, 0xE69A, 0x4F5B, 0xE69B, 0xE69B, 0x256D, 0xE69C, 0xE69C, 0x2020,
+ 0xE69D, 0xE69E, 0x4F5E, 0xE69F, 0xE69F, 0x255F, 0xE6A0, 0xE6A0, 0x256A,
+ 0xE6A1, 0xE6FE, 0x177B, 0xE740, 0xE742, 0x4F60, 0xE743, 0xE743, 0x256E,
+ 0xE744, 0xE747, 0x4F63, 0xE748, 0xE748, 0x2539, 0xE749, 0xE749, 0x255C,
+ 0xE74A, 0xE74C, 0x4F67, 0xE74D, 0xE74E, 0x2568, 0xE74F, 0xE74F, 0x256B,
+ 0xE750, 0xE750, 0x1E6F, 0xE751, 0xE751, 0x4F6A, 0xE752, 0xE752, 0x1FC4,
+ 0xE753, 0xE753, 0x2567, 0xE754, 0xE754, 0x4F6B, 0xE755, 0xE755, 0x255B,
+ 0xE756, 0xE758, 0x4F6C, 0xE759, 0xE759, 0x261D, 0xE75A, 0xE765, 0x4F6F,
+ 0xE766, 0xE766, 0x252B, 0xE767, 0xE767, 0x4F7B, 0xE768, 0xE768, 0x2571,
+ 0xE769, 0xE769, 0x4F7C, 0xE76A, 0xE76A, 0x2577, 0xE76B, 0xE773, 0x4F7D,
+ 0xE774, 0xE774, 0x2522, 0xE775, 0xE77B, 0x4F86, 0xE77C, 0xE77C, 0x2533,
+ 0xE77D, 0xE77E, 0x4F8D, 0xE780, 0xE781, 0x4F8F, 0xE782, 0xE782, 0x202A,
+ 0xE783, 0xE783, 0x4F91, 0xE784, 0xE784, 0x2536, 0xE785, 0xE785, 0x2573,
+ 0xE786, 0xE786, 0x256F, 0xE787, 0xE789, 0x4F92, 0xE78A, 0xE78A, 0x2293,
+ 0xE78B, 0xE78B, 0x2578, 0xE78C, 0xE78E, 0x4F95, 0xE78F, 0xE78F, 0x2570,
+ 0xE790, 0xE791, 0x4F98, 0xE792, 0xE792, 0x2575, 0xE793, 0xE797, 0x4F9A,
+ 0xE798, 0xE799, 0x2541, 0xE79A, 0xE79A, 0x255D, 0xE79B, 0xE79F, 0x4F9F,
+ 0xE7A0, 0xE7A0, 0x201A, 0xE7A1, 0xE7FE, 0x17D9, 0xE840, 0xE842, 0x4FA4,
+ 0xE843, 0xE843, 0x257A, 0xE844, 0xE844, 0x2006, 0xE845, 0xE845, 0x4FA7,
+ 0xE846, 0xE846, 0x2177, 0xE847, 0xE848, 0x4FA8, 0xE849, 0xE849, 0x251B,
+ 0xE84A, 0xE84A, 0x4FAA, 0xE84B, 0xE84B, 0x2524, 0xE84C, 0xE84E, 0x4FAB,
+ 0xE84F, 0xE84F, 0x257B, 0xE850, 0xE853, 0x4FAE, 0xE854, 0xE854, 0x22A3,
+ 0xE855, 0xE859, 0x4FB2, 0xE85A, 0xE85A, 0x2579, 0xE85B, 0xE85B, 0x4FB7,
+ 0xE85C, 0xE85C, 0x2566, 0xE85D, 0xE861, 0x4FB8, 0xE862, 0xE862, 0x1F93,
+ 0xE863, 0xE863, 0x4FBD, 0xE864, 0xE864, 0x257C, 0xE865, 0xE86F, 0x4FBE,
+ 0xE870, 0xE870, 0x2514, 0xE871, 0xE872, 0x4FC9, 0xE873, 0xE873, 0x257D,
+ 0xE874, 0xE874, 0x4FCB, 0xE875, 0xE875, 0x2572, 0xE876, 0xE87B, 0x4FCC,
+ 0xE87C, 0xE87C, 0x2574, 0xE87D, 0xE87E, 0x4FD2, 0xE880, 0xE880, 0x224E,
+ 0xE881, 0xE881, 0x4FD4, 0xE882, 0xE882, 0x21C6, 0xE883, 0xE886, 0x4FD5,
+ 0xE887, 0xE887, 0x209F, 0xE888, 0xE888, 0x4FD9, 0xE889, 0xE889, 0x2576,
+ 0xE88A, 0xE88B, 0x4FDA, 0xE88C, 0xE88C, 0x2064, 0xE88D, 0xE88D, 0x22BF,
+ 0xE88E, 0xE88E, 0x261C, 0xE88F, 0xE88F, 0x225E, 0xE890, 0xE8A0, 0x4FDC,
+ 0xE8A1, 0xE8FE, 0x1837, 0xE940, 0xE94B, 0x4FED, 0xE94C, 0xE94C, 0x1E75,
+ 0xE94D, 0xE953, 0x4FF9, 0xE954, 0xE954, 0x207D, 0xE955, 0xE955, 0x5000,
+ 0xE956, 0xE956, 0x23BF, 0xE957, 0xE957, 0x2113, 0xE958, 0xE959, 0x5001,
+ 0xE95A, 0xE95A, 0x23C0, 0xE95B, 0xE95C, 0x5003, 0xE95D, 0xE95D, 0x1E45,
+ 0xE95E, 0xE95E, 0x5005, 0xE95F, 0xE95F, 0x1FD8, 0xE960, 0xE960, 0x23C4,
+ 0xE961, 0xE961, 0x5006, 0xE962, 0xE962, 0x23C2, 0xE963, 0xE963, 0x2104,
+ 0xE964, 0xE964, 0x5007, 0xE965, 0xE965, 0x21BD, 0xE966, 0xE966, 0x5008,
+ 0xE967, 0xE967, 0x1F87, 0xE968, 0xE968, 0x23C3, 0xE969, 0xE96B, 0x5009,
+ 0xE96C, 0xE96C, 0x2269, 0xE96D, 0xE974, 0x500C, 0xE975, 0xE975, 0x1F43,
+ 0xE976, 0xE976, 0x5014, 0xE977, 0xE977, 0x1F1E, 0xE978, 0xE978, 0x2679,
+ 0xE979, 0xE979, 0x1EEB, 0xE97A, 0xE97B, 0x5015, 0xE97C, 0xE97C, 0x1F35,
+ 0xE97D, 0xE97D, 0x208A, 0xE97E, 0xE97E, 0x5017, 0xE980, 0xE980, 0x23C7,
+ 0xE981, 0xE981, 0x23C9, 0xE982, 0xE982, 0x23C6, 0xE983, 0xE986, 0x5018,
+ 0xE987, 0xE987, 0x224F, 0xE988, 0xE98A, 0x501C, 0xE98B, 0xE98B, 0x23CB,
+ 0xE98C, 0xE98D, 0x501F, 0xE98E, 0xE98E, 0x21F3, 0xE98F, 0xE98F, 0x5021,
+ 0xE990, 0xE990, 0x21F7, 0xE991, 0xE991, 0x23CF, 0xE992, 0xE992, 0x23CE,
+ 0xE993, 0xE993, 0x23CA, 0xE994, 0xE994, 0x23CD, 0xE995, 0xE997, 0x5022,
+ 0xE998, 0xE998, 0x23D0, 0xE999, 0xE99A, 0x5025, 0xE99B, 0xE99B, 0x266C,
+ 0xE99C, 0xE99C, 0x5027, 0xE99D, 0xE99D, 0x23C1, 0xE99E, 0xE99E, 0x5028,
+ 0xE99F, 0xE99F, 0x1FEE, 0xE9A0, 0xE9A0, 0x23D1, 0xE9A1, 0xE9FE, 0x1895,
+ 0xEA40, 0xEA40, 0x1FF8, 0xEA41, 0xEA43, 0x5029, 0xEA44, 0xEA44, 0x23D3,
+ 0xEA45, 0xEA47, 0x502C, 0xEA48, 0xEA48, 0x23D2, 0xEA49, 0xEA49, 0x23D4,
+ 0xEA4A, 0xEA4A, 0x1E98, 0xEA4B, 0xEA4F, 0x502F, 0xEA50, 0xEA50, 0x1F2C,
+ 0xEA51, 0xEA51, 0x5034, 0xEA52, 0xEA52, 0x23D5, 0xEA53, 0xEA54, 0x5035,
+ 0xEA55, 0xEA55, 0x1E71, 0xEA56, 0xEA56, 0x2691, 0xEA57, 0xEA58, 0x5037,
+ 0xEA59, 0xEA59, 0x23C5, 0xEA5A, 0xEA7E, 0x5039, 0xEA80, 0xEA80, 0x231A,
+ 0xEA81, 0xEA83, 0x505E, 0xEA84, 0xEA84, 0x2114, 0xEA85, 0xEA86, 0x5061,
+ 0xEA87, 0xEA87, 0x2284, 0xEA88, 0xEA8D, 0x5063, 0xEA8E, 0xEA8E, 0x221C,
+ 0xEA8F, 0xEA8F, 0x5069, 0xEA90, 0xEA90, 0x1E7E, 0xEA91, 0xEA91, 0x204D,
+ 0xEA92, 0xEA95, 0x506A, 0xEA96, 0xEA96, 0x2201, 0xEA97, 0xEA9F, 0x506E,
+ 0xEAA0, 0xEAA0, 0x1ED9, 0xEAA1, 0xEAFE, 0x18F3, 0xEB40, 0xEB40, 0x5077,
+ 0xEB41, 0xEB41, 0x1FB2, 0xEB42, 0xEB44, 0x5078, 0xEB45, 0xEB45, 0x2252,
+ 0xEB46, 0xEB47, 0x507B, 0xEB48, 0xEB48, 0x1F79, 0xEB49, 0xEB52, 0x507D,
+ 0xEB53, 0xEB53, 0x2157, 0xEB54, 0xEB54, 0x5087, 0xEB55, 0xEB55, 0x21BF,
+ 0xEB56, 0xEB5A, 0x5088, 0xEB5B, 0xEB5B, 0x221F, 0xEB5C, 0xEB5C, 0x508D,
+ 0xEB5D, 0xEB5D, 0x203D, 0xEB5E, 0xEB5F, 0x508E, 0xEB60, 0xEB60, 0x2015,
+ 0xEB61, 0xEB61, 0x5090, 0xEB62, 0xEB62, 0x26A5, 0xEB63, 0xEB6C, 0x5091,
+ 0xEB6D, 0xEB6D, 0x2156, 0xEB6E, 0xEB6F, 0x509B, 0xEB70, 0xEB70, 0x2144,
+ 0xEB71, 0xEB71, 0x509D, 0xEB72, 0xEB72, 0x1E91, 0xEB73, 0xEB73, 0x2257,
+ 0xEB74, 0xEB77, 0x509E, 0xEB78, 0xEB78, 0x200A, 0xEB79, 0xEB79, 0x2092,
+ 0xEB7A, 0xEB7E, 0x50A2, 0xEB80, 0xEB84, 0x50A7, 0xEB85, 0xEB85, 0x2250,
+ 0xEB86, 0xEB89, 0x50AC, 0xEB8A, 0xEB8A, 0x1EC3, 0xEB8B, 0xEBA0, 0x50B0,
+ 0xEBA1, 0xEBFE, 0x1951, 0xEC40, 0xEC45, 0x50C6, 0xEC46, 0xEC46, 0x21A8,
+ 0xEC47, 0xEC55, 0x50CC, 0xEC56, 0xEC56, 0x260D, 0xEC57, 0xEC59, 0x50DB,
+ 0xEC5A, 0xEC5A, 0x260C, 0xEC5B, 0xEC5B, 0x50DE, 0xEC5C, 0xEC5C, 0x260E,
+ 0xEC5D, 0xEC5F, 0x50DF, 0xEC60, 0xEC60, 0x2032, 0xEC61, 0xEC6D, 0x50E2,
+ 0xEC6E, 0xEC6E, 0x260B, 0xEC6F, 0xEC75, 0x50EF, 0xEC76, 0xEC76, 0x22C3,
+ 0xEC77, 0xEC7E, 0x50F6, 0xEC80, 0xEC95, 0x50FE, 0xEC96, 0xEC96, 0x1F23,
+ 0xEC97, 0xECA0, 0x5114, 0xECA1, 0xECFE, 0x19AF, 0xED40, 0xED45, 0x511E,
+ 0xED46, 0xED46, 0x2695, 0xED47, 0xED57, 0x5124, 0xED58, 0xED58, 0x265E,
+ 0xED59, 0xED5D, 0x5135, 0xED5E, 0xED5E, 0x265D, 0xED5F, 0xED60, 0x513A,
+ 0xED61, 0xED61, 0x2692, 0xED62, 0xED63, 0x513C, 0xED64, 0xED64, 0x265F,
+ 0xED65, 0xED65, 0x513E, 0xED66, 0xED66, 0x218D, 0xED67, 0xED67, 0x20FD,
+ 0xED68, 0xED6D, 0x513F, 0xED6E, 0xED6E, 0x1F40, 0xED6F, 0xED73, 0x5145,
+ 0xED74, 0xED74, 0x2465, 0xED75, 0xED76, 0x514A, 0xED77, 0xED77, 0x2467,
+ 0xED78, 0xED78, 0x514C, 0xED79, 0xED79, 0x2466, 0xED7A, 0xED7E, 0x514D,
+ 0xED80, 0xED90, 0x5152, 0xED91, 0xED91, 0x21C9, 0xED92, 0xED92, 0x5163,
+ 0xED93, 0xED93, 0x2209, 0xED94, 0xED94, 0x1EC9, 0xED95, 0xED95, 0x20E9,
+ 0xED96, 0xED96, 0x5164, 0xED97, 0xED97, 0x21CA, 0xED98, 0xED98, 0x2146,
+ 0xED99, 0xED99, 0x25C5, 0xED9A, 0xED9A, 0x21DC, 0xED9B, 0xED9B, 0x5165,
+ 0xED9C, 0xED9C, 0x245E, 0xED9D, 0xED9D, 0x5166, 0xED9E, 0xED9E, 0x214F,
+ 0xED9F, 0xED9F, 0x5167, 0xEDA0, 0xEDA0, 0x25C6, 0xEDA1, 0xEDFE, 0x1A0D,
+ 0xEE40, 0xEE40, 0x25C7, 0xEE41, 0xEE41, 0x2241, 0xEE42, 0xEE42, 0x218A,
+ 0xEE43, 0xEE43, 0x1E2F, 0xEE44, 0xEE44, 0x1EDC, 0xEE45, 0xEE47, 0x5168,
+ 0xEE48, 0xEE48, 0x20BF, 0xEE49, 0xEE49, 0x2034, 0xEE4A, 0xEE4C, 0x516B,
+ 0xEE4D, 0xEE4D, 0x25C9, 0xEE4E, 0xEE51, 0x516E, 0xEE52, 0xEE52, 0x25C8,
+ 0xEE53, 0xEE54, 0x5172, 0xEE55, 0xEE55, 0x220E, 0xEE56, 0xEE56, 0x5174,
+ 0xEE57, 0xEE57, 0x25CB, 0xEE58, 0xEE5D, 0x5175, 0xEE5E, 0xEE5E, 0x217D,
+ 0xEE5F, 0xEE60, 0x517B, 0xEE61, 0xEE61, 0x1F7E, 0xEE62, 0xEE67, 0x517D,
+ 0xEE68, 0xEE68, 0x25CC, 0xEE69, 0xEE69, 0x1FC3, 0xEE6A, 0xEE6B, 0x5183,
+ 0xEE6C, 0xEE6C, 0x20B9, 0xEE6D, 0xEE6D, 0x5185, 0xEE6E, 0xEE6E, 0x2181,
+ 0xEE6F, 0xEE76, 0x5186, 0xEE77, 0xEE77, 0x1FDA, 0xEE78, 0xEE7C, 0x518E,
+ 0xEE7D, 0xEE7D, 0x2173, 0xEE7E, 0xEE7E, 0x1EE1, 0xEE80, 0xEE80, 0x25CD,
+ 0xEE81, 0xEE84, 0x5193, 0xEE85, 0xEE85, 0x25CE, 0xEE86, 0xEE86, 0x21F6,
+ 0xEE87, 0xEE89, 0x5197, 0xEE8A, 0xEE8A, 0x224B, 0xEE8B, 0xEE8B, 0x25D1,
+ 0xEE8C, 0xEE8C, 0x519A, 0xEE8D, 0xEE8D, 0x1EC0, 0xEE8E, 0xEE8F, 0x519B,
+ 0xEE90, 0xEE90, 0x2008, 0xEE91, 0xEE93, 0x519D, 0xEE94, 0xEE94, 0x25D0,
+ 0xEE95, 0xEE96, 0x51A0, 0xEE97, 0xEE97, 0x25D2, 0xEE98, 0xEE98, 0x51A2,
+ 0xEE99, 0xEE99, 0x1F2A, 0xEE9A, 0xEE9C, 0x51A3, 0xEE9D, 0xEE9D, 0x1E72,
+ 0xEE9E, 0xEE9E, 0x25D3, 0xEE9F, 0xEEA0, 0x51A6, 0xEEA1, 0xEEFE, 0x1A6B,
+ 0xEF40, 0xEF40, 0x21BE, 0xEF41, 0xEF41, 0x25D4, 0xEF42, 0xEF42, 0x2044,
+ 0xEF43, 0xEF43, 0x51A8, 0xEF44, 0xEF44, 0x25CF, 0xEF45, 0xEF45, 0x20F3,
+ 0xEF46, 0xEF4B, 0x51A9, 0xEF4C, 0xEF4C, 0x1F00, 0xEF4D, 0xEF51, 0x51AF,
+ 0xEF52, 0xEF53, 0x24CC, 0xEF54, 0xEF54, 0x51B4, 0xEF55, 0xEF55, 0x2698,
+ 0xEF56, 0xEF56, 0x51B5, 0xEF57, 0xEF57, 0x2678, 0xEF58, 0xEF59, 0x51B6,
+ 0xEF5A, 0xEF5A, 0x24CE, 0xEF5B, 0xEF5F, 0x51B8, 0xEF60, 0xEF60, 0x24CF,
+ 0xEF61, 0xEF67, 0x51BD, 0xEF68, 0xEF68, 0x20B8, 0xEF69, 0xEF69, 0x51C4,
+ 0xEF6A, 0xEF6A, 0x24D0, 0xEF6B, 0xEF6B, 0x51C5, 0xEF6C, 0xEF6C, 0x24D1,
+ 0xEF6D, 0xEF76, 0x51C6, 0xEF77, 0xEF77, 0x1EF4, 0xEF78, 0xEF79, 0x51D0,
+ 0xEF7A, 0xEF7A, 0x239B, 0xEF7B, 0xEF7B, 0x51D2, 0xEF7C, 0xEF7C, 0x267E,
+ 0xEF7D, 0xEF7E, 0x51D3, 0xEF80, 0xEF81, 0x51D5, 0xEF82, 0xEF82, 0x239D,
+ 0xEF83, 0xEF84, 0x239F, 0xEF85, 0xEF85, 0x51D7, 0xEF86, 0xEF86, 0x23A1,
+ 0xEF87, 0xEF87, 0x51D8, 0xEF88, 0xEF88, 0x1EF1, 0xEF89, 0xEF8A, 0x51D9,
+ 0xEF8B, 0xEF8B, 0x221E, 0xEF8C, 0xEF8C, 0x51DB, 0xEF8D, 0xEF8D, 0x23A2,
+ 0xEF8E, 0xEF94, 0x51DC, 0xEF95, 0xEF95, 0x214B, 0xEF96, 0xEF96, 0x1E36,
+ 0xEF97, 0xEF97, 0x2135, 0xEF98, 0xEF9B, 0x51E3, 0xEF9C, 0xEF9C, 0x1FAD,
+ 0xEF9D, 0xEF9D, 0x51E7, 0xEF9E, 0xEF9E, 0x1E53, 0xEF9F, 0xEFA0, 0x51E8,
+ 0xEFA1, 0xEFFE, 0x1AC9, 0xF040, 0xF040, 0x51EA, 0xF041, 0xF041, 0x23A3,
+ 0xF042, 0xF042, 0x2203, 0xF043, 0xF043, 0x51EB, 0xF044, 0xF044, 0x1EE7,
+ 0xF045, 0xF046, 0x51EC, 0xF047, 0xF047, 0x23A4, 0xF048, 0xF048, 0x2097,
+ 0xF049, 0xF049, 0x1EE4, 0xF04A, 0xF04D, 0x51EE, 0xF04E, 0xF04E, 0x2238,
+ 0xF04F, 0xF050, 0x51F2, 0xF051, 0xF051, 0x23A5, 0xF052, 0xF053, 0x51F4,
+ 0xF054, 0xF054, 0x1F9A, 0xF055, 0xF056, 0x51F6, 0xF057, 0xF057, 0x21C3,
+ 0xF058, 0xF05D, 0x51F8, 0xF05E, 0xF05E, 0x1F2E, 0xF05F, 0xF067, 0x51FE,
+ 0xF068, 0xF068, 0x239C, 0xF069, 0xF06B, 0x5207, 0xF06C, 0xF06C, 0x23A6,
+ 0xF06D, 0xF070, 0x520A, 0xF071, 0xF071, 0x239E, 0xF072, 0xF072, 0x520E,
+ 0xF073, 0xF073, 0x2035, 0xF074, 0xF074, 0x23A7, 0xF075, 0xF077, 0x520F,
+ 0xF078, 0xF078, 0x23A8, 0xF079, 0xF079, 0x5212, 0xF07A, 0xF07A, 0x2075,
+ 0xF07B, 0xF07C, 0x5213, 0xF07D, 0xF07E, 0x23A9, 0xF080, 0xF080, 0x23AB,
+ 0xF081, 0xF081, 0x1FEB, 0xF082, 0xF082, 0x23AC, 0xF083, 0xF086, 0x5215,
+ 0xF087, 0xF087, 0x1F6A, 0xF088, 0xF088, 0x20F9, 0xF089, 0xF08A, 0x5219,
+ 0xF08B, 0xF08B, 0x2666, 0xF08C, 0xF08F, 0x521B, 0xF090, 0xF090, 0x2667,
+ 0xF091, 0xF091, 0x521F, 0xF092, 0xF092, 0x1E6C, 0xF093, 0xF095, 0x5220,
+ 0xF096, 0xF096, 0x23AD, 0xF097, 0xF0A0, 0x5223, 0xF0A1, 0xF0FE, 0x1B27,
+ 0xF140, 0xF151, 0x522D, 0xF152, 0xF152, 0x206D, 0xF153, 0xF153, 0x2242,
+ 0xF154, 0xF154, 0x1F02, 0xF155, 0xF156, 0x523F, 0xF157, 0xF157, 0x2183,
+ 0xF158, 0xF158, 0x5241, 0xF159, 0xF159, 0x1E85, 0xF15A, 0xF15A, 0x21E9,
+ 0xF15B, 0xF166, 0x5242, 0xF167, 0xF167, 0x1E57, 0xF168, 0xF175, 0x524E,
+ 0xF176, 0xF176, 0x22A5, 0xF177, 0xF177, 0x2407, 0xF178, 0xF178, 0x1FCA,
+ 0xF179, 0xF179, 0x525C, 0xF17A, 0xF17A, 0x2402, 0xF17B, 0xF17B, 0x1F82,
+ 0xF17C, 0xF17D, 0x525D, 0xF17E, 0xF17E, 0x2408, 0xF180, 0xF180, 0x2404,
+ 0xF181, 0xF181, 0x525F, 0xF182, 0xF182, 0x2131, 0xF183, 0xF183, 0x5260,
+ 0xF184, 0xF184, 0x2184, 0xF185, 0xF185, 0x5261, 0xF186, 0xF186, 0x2403,
+ 0xF187, 0xF187, 0x5262, 0xF188, 0xF188, 0x206E, 0xF189, 0xF189, 0x240B,
+ 0xF18A, 0xF193, 0x5263, 0xF194, 0xF194, 0x1F3F, 0xF195, 0xF197, 0x526D,
+ 0xF198, 0xF198, 0x2067, 0xF199, 0xF1A0, 0x5270, 0xF1A1, 0xF1FE, 0x1B85,
+ 0xF240, 0xF244, 0x5278, 0xF245, 0xF245, 0x1FD7, 0xF246, 0xF246, 0x527D,
+ 0xF247, 0xF247, 0x1E83, 0xF248, 0xF24A, 0x527E, 0xF24B, 0xF24B, 0x240F,
+ 0xF24C, 0xF252, 0x5281, 0xF253, 0xF253, 0x240E, 0xF254, 0xF254, 0x20C7,
+ 0xF255, 0xF255, 0x240D, 0xF256, 0xF25B, 0x5288, 0xF25C, 0xF25C, 0x2412,
+ 0xF25D, 0xF25E, 0x528E, 0xF25F, 0xF25F, 0x20B7, 0xF260, 0xF270, 0x5290,
+ 0xF271, 0xF271, 0x23F0, 0xF272, 0xF272, 0x52A1, 0xF273, 0xF273, 0x2411,
+ 0xF274, 0xF274, 0x2414, 0xF275, 0xF275, 0x52A2, 0xF276, 0xF276, 0x2170,
+ 0xF277, 0xF27B, 0x52A3, 0xF27C, 0xF27C, 0x2405, 0xF27D, 0xF27D, 0x210C,
+ 0xF27E, 0xF27E, 0x2415, 0xF280, 0xF284, 0x52A8, 0xF285, 0xF285, 0x2066,
+ 0xF286, 0xF286, 0x52AD, 0xF287, 0xF287, 0x2352, 0xF288, 0xF288, 0x2413,
+ 0xF289, 0xF289, 0x2410, 0xF28A, 0xF28B, 0x2416, 0xF28C, 0xF28C, 0x20F1,
+ 0xF28D, 0xF290, 0x52AE, 0xF291, 0xF291, 0x240A, 0xF292, 0xF293, 0x52B2,
+ 0xF294, 0xF294, 0x2409, 0xF295, 0xF295, 0x52B4, 0xF296, 0xF296, 0x2418,
+ 0xF297, 0xF29B, 0x52B5, 0xF29C, 0xF29C, 0x1FA7, 0xF29D, 0xF29D, 0x52BA,
+ 0xF29E, 0xF29E, 0x21FC, 0xF29F, 0xF2A0, 0x52BB, 0xF2A1, 0xF2FE, 0x1BE3,
+ 0xF340, 0xF340, 0x1FC1, 0xF341, 0xF341, 0x2406, 0xF342, 0xF344, 0x52BD,
+ 0xF345, 0xF345, 0x229C, 0xF346, 0xF347, 0x52C0, 0xF348, 0xF348, 0x204E,
+ 0xF349, 0xF349, 0x52C2, 0xF34A, 0xF34A, 0x241A, 0xF34B, 0xF34B, 0x2419,
+ 0xF34C, 0xF34F, 0x52C3, 0xF350, 0xF350, 0x240C, 0xF351, 0xF360, 0x52C7,
+ 0xF361, 0xF361, 0x1E29, 0xF362, 0xF373, 0x52D7, 0xF374, 0xF374, 0x2661,
+ 0xF375, 0xF375, 0x52E9, 0xF376, 0xF376, 0x26A4, 0xF377, 0xF377, 0x2174,
+ 0xF378, 0xF378, 0x2663, 0xF379, 0xF379, 0x2662, 0xF37A, 0xF37E, 0x52EA,
+ 0xF380, 0xF38B, 0x52EF, 0xF38C, 0xF38C, 0x2675, 0xF38D, 0xF39F, 0x52FB,
+ 0xF3A0, 0xF3A0, 0x214C, 0xF3A1, 0xF3FE, 0x1C41, 0xF440, 0xF444, 0x530E,
+ 0xF445, 0xF445, 0x267A, 0xF446, 0xF44F, 0x5313, 0xF450, 0xF450, 0x26A0,
+ 0xF451, 0xF456, 0x531D, 0xF457, 0xF457, 0x2668, 0xF458, 0xF458, 0x5323,
+ 0xF459, 0xF459, 0x1ED0, 0xF45A, 0xF45A, 0x5324, 0xF45B, 0xF45B, 0x2096,
+ 0xF45C, 0xF45C, 0x5325, 0xF45D, 0xF45D, 0x23CC, 0xF45E, 0xF461, 0x5326,
+ 0xF462, 0xF462, 0x23C8, 0xF463, 0xF463, 0x532A, 0xF464, 0xF464, 0x223E,
+ 0xF465, 0xF474, 0x532B, 0xF475, 0xF475, 0x2665, 0xF476, 0xF47B, 0x533B,
+ 0xF47C, 0xF47C, 0x2664, 0xF47D, 0xF47D, 0x5341, 0xF47E, 0xF47E, 0x2239,
+ 0xF480, 0xF493, 0x5342, 0xF494, 0xF494, 0x204A, 0xF495, 0xF498, 0x5356,
+ 0xF499, 0xF499, 0x261F, 0xF49A, 0xF49B, 0x535A, 0xF49C, 0xF49C, 0x261E,
+ 0xF49D, 0xF4A0, 0x535C, 0xF4A1, 0xF4FE, 0x1C9F, 0xF540, 0xF544, 0x5360,
+ 0xF545, 0xF545, 0x2620, 0xF546, 0xF546, 0x5365, 0xF547, 0xF547, 0x2621,
+ 0xF548, 0xF551, 0x5366, 0xF552, 0xF552, 0x2622, 0xF553, 0xF553, 0x5370,
+ 0xF554, 0xF554, 0x2627, 0xF555, 0xF555, 0x1E39, 0xF556, 0xF556, 0x2625,
+ 0xF557, 0xF55D, 0x5371, 0xF55E, 0xF55E, 0x2629, 0xF55F, 0xF560, 0x5378,
+ 0xF561, 0xF561, 0x262E, 0xF562, 0xF562, 0x262B, 0xF563, 0xF56D, 0x537A,
+ 0xF56E, 0xF56E, 0x262A, 0xF56F, 0xF56F, 0x262D, 0xF570, 0xF570, 0x5385,
+ 0xF571, 0xF571, 0x2628, 0xF572, 0xF572, 0x21B9, 0xF573, 0xF57E, 0x5386,
+ 0xF580, 0xF584, 0x5392, 0xF585, 0xF585, 0x2636, 0xF586, 0xF586, 0x2630,
+ 0xF587, 0xF58B, 0x5397, 0xF58C, 0xF58C, 0x2638, 0xF58D, 0xF58D, 0x539C,
+ 0xF58E, 0xF58E, 0x200D, 0xF58F, 0xF58F, 0x2637, 0xF590, 0xF598, 0x539D,
+ 0xF599, 0xF599, 0x2645, 0xF59A, 0xF59A, 0x53A6, 0xF59B, 0xF59B, 0x263A,
+ 0xF59C, 0xF59F, 0x53A7, 0xF5A0, 0xF5A0, 0x2643, 0xF5A1, 0xF5FE, 0x1CFD,
+ 0xF640, 0xF640, 0x53AB, 0xF641, 0xF641, 0x2640, 0xF642, 0xF644, 0x53AC,
+ 0xF645, 0xF645, 0x263D, 0xF646, 0xF646, 0x2641, 0xF647, 0xF647, 0x53AF,
+ 0xF648, 0xF648, 0x263E, 0xF649, 0xF64A, 0x53B0, 0xF64B, 0xF64B, 0x263F,
+ 0xF64C, 0xF64C, 0x1FC0, 0xF64D, 0xF64D, 0x53B2, 0xF64E, 0xF64F, 0x263B,
+ 0xF650, 0xF653, 0x53B3, 0xF654, 0xF654, 0x2642, 0xF655, 0xF657, 0x53B7,
+ 0xF658, 0xF658, 0x2644, 0xF659, 0xF660, 0x53BA, 0xF661, 0xF661, 0x2639,
+ 0xF662, 0xF662, 0x53C2, 0xF663, 0xF663, 0x264C, 0xF664, 0xF66B, 0x53C3,
+ 0xF66C, 0xF66C, 0x2647, 0xF66D, 0xF66D, 0x264B, 0xF66E, 0xF670, 0x53CB,
+ 0xF671, 0xF671, 0x2649, 0xF672, 0xF673, 0x53CE, 0xF674, 0xF674, 0x2648,
+ 0xF675, 0xF675, 0x53D0, 0xF676, 0xF676, 0x264A, 0xF677, 0xF677, 0x2108,
+ 0xF678, 0xF67E, 0x53D1, 0xF680, 0xF684, 0x53D8, 0xF685, 0xF685, 0x264D,
+ 0xF686, 0xF687, 0x53DD, 0xF688, 0xF688, 0x2634, 0xF689, 0xF689, 0x53DF,
+ 0xF68A, 0xF68A, 0x2651, 0xF68B, 0xF68C, 0x53E0, 0xF68D, 0xF68D, 0x2650,
+ 0xF68E, 0xF68E, 0x2652, 0xF68F, 0xF691, 0x53E2, 0xF692, 0xF692, 0x264F,
+ 0xF693, 0xF695, 0x53E5, 0xF696, 0xF696, 0x2632, 0xF697, 0xF697, 0x264E,
+ 0xF698, 0xF698, 0x2653, 0xF699, 0xF699, 0x53E8, 0xF69A, 0xF69A, 0x2657,
+ 0xF69B, 0xF69B, 0x53E9, 0xF69C, 0xF69C, 0x2635, 0xF69D, 0xF69D, 0x53EA,
+ 0xF69E, 0xF69E, 0x2633, 0xF69F, 0xF69F, 0x53EB, 0xF6A0, 0xF6A0, 0x2656,
+ 0xF6A1, 0xF6FE, 0x1D5B, 0xF740, 0xF741, 0x53EC, 0xF742, 0xF742, 0x2654,
+ 0xF743, 0xF748, 0x53EE, 0xF749, 0xF749, 0x2658, 0xF74A, 0xF74B, 0x53F4,
+ 0xF74C, 0xF74C, 0x2655, 0xF74D, 0xF74D, 0x1E4D, 0xF74E, 0xF755, 0x53F6,
+ 0xF756, 0xF756, 0x265B, 0xF757, 0xF757, 0x53FE, 0xF758, 0xF758, 0x265A,
+ 0xF759, 0xF759, 0x53FF, 0xF75A, 0xF75A, 0x2659, 0xF75B, 0xF75B, 0x202E,
+ 0xF75C, 0xF75C, 0x262F, 0xF75D, 0xF760, 0x5400, 0xF761, 0xF761, 0x2646,
+ 0xF762, 0xF762, 0x5404, 0xF763, 0xF763, 0x2626, 0xF764, 0xF76A, 0x5405,
+ 0xF76B, 0xF76B, 0x265C, 0xF76C, 0xF770, 0x540C, 0xF771, 0xF771, 0x262C,
+ 0xF772, 0xF77B, 0x5411, 0xF77C, 0xF77C, 0x2623, 0xF77D, 0xF77D, 0x541B,
+ 0xF77E, 0xF77E, 0x2631, 0xF780, 0xF7A0, 0x541C, 0xF7A1, 0xF7FE, 0x1DB9,
+ 0xF840, 0xF841, 0x543D, 0xF842, 0xF842, 0x209C, 0xF843, 0xF845, 0x543F,
+ 0xF846, 0xF846, 0x2580, 0xF847, 0xF848, 0x5442, 0xF849, 0xF849, 0x22DC,
+ 0xF84A, 0xF84F, 0x5444, 0xF850, 0xF850, 0x1F05, 0xF851, 0xF851, 0x208B,
+ 0xF852, 0xF852, 0x544A, 0xF853, 0xF853, 0x2581, 0xF854, 0xF862, 0x544B,
+ 0xF863, 0xF863, 0x2583, 0xF864, 0xF864, 0x2582, 0xF865, 0xF865, 0x545A,
+ 0xF866, 0xF866, 0x21EE, 0xF867, 0xF871, 0x545B, 0xF872, 0xF872, 0x2182,
+ 0xF873, 0xF877, 0x5466, 0xF878, 0xF878, 0x2243, 0xF879, 0xF879, 0x546B,
+ 0xF87A, 0xF87A, 0x2587, 0xF87B, 0xF87B, 0x546C, 0xF87C, 0xF87C, 0x2588,
+ 0xF87D, 0xF87E, 0x546D, 0xF880, 0xF880, 0x546F, 0xF881, 0xF881, 0x2584,
+ 0xF882, 0xF883, 0x5470, 0xF884, 0xF884, 0x21FD, 0xF885, 0xF885, 0x5472,
+ 0xF886, 0xF886, 0x21EF, 0xF887, 0xF88C, 0x5473, 0xF88D, 0xF88D, 0x258A,
+ 0xF88E, 0xF88E, 0x258C, 0xF88F, 0xF898, 0x5479, 0xF899, 0xF899, 0x1F47,
+ 0xF89A, 0xF89C, 0x5483, 0xF89D, 0xF89D, 0x1F1D, 0xF89E, 0xF89F, 0x5486,
+ 0xF8A0, 0xF8A0, 0x258D, 0xF940, 0xF94D, 0x5488, 0xF94E, 0xF94E, 0x1FD0,
+ 0xF94F, 0xF94F, 0x2592, 0xF950, 0xF950, 0x258F, 0xF951, 0xF958, 0x5496,
+ 0xF959, 0xF959, 0x2594, 0xF95A, 0xF95A, 0x1EE0, 0xF95B, 0xF95C, 0x549E,
+ 0xF95D, 0xF95D, 0x2591, 0xF95E, 0xF95E, 0x2595, 0xF95F, 0xF966, 0x54A0,
+ 0xF967, 0xF967, 0x2597, 0xF968, 0xF968, 0x54A8, 0xF969, 0xF969, 0x20B6,
+ 0xF96A, 0xF96B, 0x54A9, 0xF96C, 0xF96C, 0x2598, 0xF96D, 0xF96E, 0x54AB,
+ 0xF96F, 0xF96F, 0x20F6, 0xF970, 0xF97E, 0x54AD, 0xF980, 0xF984, 0x54BC,
+ 0xF985, 0xF985, 0x2585, 0xF986, 0xF986, 0x54C1, 0xF987, 0xF987, 0x2599,
+ 0xF988, 0xF990, 0x54C2, 0xF991, 0xF991, 0x2596, 0xF992, 0xF995, 0x54CB,
+ 0xF996, 0xF996, 0x259A, 0xF997, 0xF997, 0x54CF, 0xF998, 0xF998, 0x259B,
+ 0xF999, 0xF9A0, 0x54D0, 0xFA40, 0xFA41, 0x54D8, 0xFA42, 0xFA42, 0x259D,
+ 0xFA43, 0xFA45, 0x54DA, 0xFA46, 0xFA46, 0x259E, 0xFA47, 0xFA4B, 0x54DD,
+ 0xFA4C, 0xFA4C, 0x234C, 0xFA4D, 0xFA50, 0x54E2, 0xFA51, 0xFA51, 0x1F44,
+ 0xFA52, 0xFA57, 0x54E6, 0xFA58, 0xFA58, 0x2660, 0xFA59, 0xFA59, 0x25A0,
+ 0xFA5A, 0xFA5C, 0x54EC, 0xFA5D, 0xFA5D, 0x259C, 0xFA5E, 0xFA5E, 0x54EF,
+ 0xFA5F, 0xFA5F, 0x259F, 0xFA60, 0xFA60, 0x54F0, 0xFA61, 0xFA61, 0x1F6C,
+ 0xFA62, 0xFA6F, 0x54F1, 0xFA70, 0xFA70, 0x25A2, 0xFA71, 0xFA73, 0x54FF,
+ 0xFA74, 0xFA74, 0x20AE, 0xFA75, 0xFA75, 0x5502, 0xFA76, 0xFA76, 0x258B,
+ 0xFA77, 0xFA77, 0x25A3, 0xFA78, 0xFA7E, 0x5503, 0xFA80, 0xFA82, 0x550A,
+ 0xFA83, 0xFA83, 0x2589, 0xFA84, 0xFA84, 0x25A5, 0xFA85, 0xFA8C, 0x550D,
+ 0xFA8D, 0xFA8D, 0x25A4, 0xFA8E, 0xFA8F, 0x5515, 0xFA90, 0xFA90, 0x25A6,
+ 0xFA91, 0xFA91, 0x2593, 0xFA92, 0xFA95, 0x5517, 0xFA96, 0xFA96, 0x25A7,
+ 0xFA97, 0xFA97, 0x2222, 0xFA98, 0xFA98, 0x25A9, 0xFA99, 0xFAA0, 0x551B,
+ 0xFB40, 0xFB48, 0x5523, 0xFB49, 0xFB49, 0x25A8, 0xFB4A, 0xFB51, 0x552C,
+ 0xFB52, 0xFB52, 0x2586, 0xFB53, 0xFB56, 0x5534, 0xFB57, 0xFB57, 0x25A1,
+ 0xFB58, 0xFB58, 0x25AA, 0xFB59, 0xFB59, 0x5538, 0xFB5A, 0xFB5A, 0x2590,
+ 0xFB5B, 0xFB5B, 0x258E, 0xFB5C, 0xFB74, 0x5539, 0xFB75, 0xFB75, 0x2688,
+ 0xFB76, 0xFB78, 0x5552, 0xFB79, 0xFB79, 0x269E, 0xFB7A, 0xFB7A, 0x25FB,
+ 0xFB7B, 0xFB7B, 0x5555, 0xFB7C, 0xFB7C, 0x1F8C, 0xFB7D, 0xFB7D, 0x21F4,
+ 0xFB7E, 0xFB7E, 0x5556, 0xFB80, 0xFB8F, 0x5557, 0xFB90, 0xFB90, 0x200F,
+ 0xFB91, 0xFB9B, 0x5567, 0xFB9C, 0xFB9C, 0x2071, 0xFB9D, 0xFB9E, 0x5572,
+ 0xFB9F, 0xFB9F, 0x25F7, 0xFBA0, 0xFBA0, 0x5574, 0xFC40, 0xFC43, 0x5575,
+ 0xFC44, 0xFC44, 0x2696, 0xFC45, 0xFC48, 0x5579, 0xFC49, 0xFC49, 0x268F,
+ 0xFC4A, 0xFC59, 0x557D, 0xFC5A, 0xFC5A, 0x22DA, 0xFC5B, 0xFC62, 0x558D,
+ 0xFC63, 0xFC63, 0x1EC1, 0xFC64, 0xFC67, 0x5595, 0xFC68, 0xFC68, 0x1EB3,
+ 0xFC69, 0xFC6E, 0x5599, 0xFC6F, 0xFC6F, 0x266A, 0xFC70, 0xFC70, 0x559F,
+ 0xFC71, 0xFC71, 0x268A, 0xFC72, 0xFC73, 0x55A0, 0xFC74, 0xFC74, 0x2669,
+ 0xFC75, 0xFC76, 0x55A2, 0xFC77, 0xFC78, 0x2618, 0xFC79, 0xFC7E, 0x55A4,
+ 0xFC80, 0xFC82, 0x55AA, 0xFC83, 0xFC83, 0x261A, 0xFC84, 0xFC89, 0x55AD,
+ 0xFC8A, 0xFC8A, 0x2673, 0xFC8B, 0xFCA0, 0x55B3, 0xFD40, 0xFD51, 0x55C9,
+ 0xFD52, 0xFD52, 0x20C6, 0xFD53, 0xFD53, 0x226B, 0xFD54, 0xFD56, 0x55DB,
+ 0xFD57, 0xFD57, 0x24D3, 0xFD58, 0xFD58, 0x1E86, 0xFD59, 0xFD59, 0x55DE,
+ 0xFD5A, 0xFD5A, 0x260F, 0xFD5B, 0xFD5E, 0x55DF, 0xFD5F, 0xFD5F, 0x2611,
+ 0xFD60, 0xFD61, 0x55E3, 0xFD62, 0xFD62, 0x2613, 0xFD63, 0xFD64, 0x55E5,
+ 0xFD65, 0xFD65, 0x2610, 0xFD66, 0xFD66, 0x2612, 0xFD67, 0xFD67, 0x2030,
+ 0xFD68, 0xFD68, 0x55E7, 0xFD69, 0xFD69, 0x2671, 0xFD6A, 0xFD6B, 0x55E8,
+ 0xFD6C, 0xFD6C, 0x2614, 0xFD6D, 0xFD6F, 0x55EA, 0xFD70, 0xFD70, 0x2616,
+ 0xFD71, 0xFD71, 0x55ED, 0xFD72, 0xFD72, 0x2615, 0xFD73, 0xFD77, 0x55EE,
+ 0xFD78, 0xFD78, 0x20F2, 0xFD79, 0xFD7C, 0x55F3, 0xFD7D, 0xFD7D, 0x2617,
+ 0xFD7E, 0xFD7E, 0x55F7, 0xFD80, 0xFD87, 0x55F8, 0xFD88, 0xFD88, 0x2037,
+ 0xFD89, 0xFD8A, 0x5600, 0xFD8B, 0xFD8B, 0x20B3, 0xFD8C, 0xFD8E, 0x5602,
+ 0xFD8F, 0xFD8F, 0x1F22, 0xFD90, 0xFD90, 0x24ED, 0xFD91, 0xFD93, 0x5605,
+ 0xFD94, 0xFD94, 0x1F34, 0xFD95, 0xFD9C, 0x5608, 0xFD9D, 0xFD9D, 0x0A02,
+ 0xFD9E, 0xFD9E, 0x40D3, 0xFD9F, 0xFD9F, 0x200C, 0xFDA0, 0xFDA0, 0x5083,
+ 0xFE40, 0xFE40, 0x1259, 0xFE41, 0xFE7E, 0x5610, 0xFE80, 0xFEA0, 0x564E,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/GB1/GBKp-EUC-H_2.cpp b/core/src/fpdfapi/fpdf_cmaps/GB1/GBKp-EUC-H_2.cpp
index ebb16594da..226c950240 100644
--- a/core/src/fpdfapi/fpdf_cmaps/GB1/GBKp-EUC-H_2.cpp
+++ b/core/src/fpdfapi/fpdf_cmaps/GB1/GBKp-EUC-H_2.cpp
@@ -1,1365 +1,1365 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-extern const unsigned short g_FXCMAP_GBKp_EUC_H_2[4070 * 3] = {
- 0x0020, 0x007E, 0x0001, 0x8140, 0x8178, 0x2758, 0x8179, 0x8179, 0x2059,
- 0x817A, 0x817E, 0x2791, 0x8180, 0x8185, 0x2796, 0x8186, 0x8186, 0x21F1,
- 0x8187, 0x81EC, 0x279C, 0x81ED, 0x81ED, 0x1FF2, 0x81EE, 0x81F5, 0x2802,
- 0x81F6, 0x81F6, 0x205D, 0x81F7, 0x81FE, 0x280A, 0x8240, 0x8252, 0x2812,
- 0x8253, 0x8253, 0x269C, 0x8254, 0x8261, 0x2825, 0x8262, 0x8262, 0x21B5,
- 0x8263, 0x8273, 0x2833, 0x8274, 0x8274, 0x22CC, 0x8275, 0x8279, 0x2844,
- 0x827A, 0x827A, 0x2016, 0x827B, 0x827C, 0x2849, 0x827D, 0x827D, 0x1E62,
- 0x827E, 0x827E, 0x284B, 0x8280, 0x8280, 0x1F20, 0x8281, 0x8282, 0x284C,
- 0x8283, 0x8283, 0x207F, 0x8284, 0x828F, 0x284E, 0x8290, 0x8290, 0x205C,
- 0x8291, 0x82A4, 0x285A, 0x82A5, 0x82A5, 0x2194, 0x82A6, 0x82C7, 0x286E,
- 0x82C8, 0x82C8, 0x1E65, 0x82C9, 0x82C9, 0x2281, 0x82CA, 0x82E0, 0x2890,
- 0x82E1, 0x82E1, 0x22CD, 0x82E2, 0x82E2, 0x28A7, 0x82E3, 0x82E3, 0x210A,
- 0x82E4, 0x82E4, 0x1E3E, 0x82E5, 0x82EC, 0x28A8, 0x82ED, 0x82ED, 0x267F,
- 0x82EE, 0x82F1, 0x28B0, 0x82F2, 0x82F2, 0x222E, 0x82F3, 0x82F6, 0x28B4,
- 0x82F7, 0x82F7, 0x1E96, 0x82F8, 0x82F8, 0x22CB, 0x82F9, 0x82F9, 0x226C,
- 0x82FA, 0x82FA, 0x28B8, 0x82FB, 0x82FB, 0x2117, 0x82FC, 0x82FE, 0x28B9,
- 0x8340, 0x8340, 0x28BC, 0x8341, 0x8341, 0x20E8, 0x8342, 0x8344, 0x28BD,
- 0x8345, 0x8345, 0x22D4, 0x8346, 0x8347, 0x28C0, 0x8348, 0x8348, 0x1FB9,
- 0x8349, 0x834B, 0x28C2, 0x834C, 0x834C, 0x22D8, 0x834D, 0x8352, 0x28C5,
- 0x8353, 0x8353, 0x20DF, 0x8354, 0x8356, 0x28CB, 0x8357, 0x8357, 0x20C2,
- 0x8358, 0x835D, 0x28CE, 0x835E, 0x835E, 0x2195, 0x835F, 0x8364, 0x28D4,
- 0x8365, 0x8365, 0x1FAC, 0x8366, 0x8366, 0x22D3, 0x8367, 0x8371, 0x28DA,
- 0x8372, 0x8372, 0x1F81, 0x8373, 0x8377, 0x28E5, 0x8378, 0x8378, 0x2210,
- 0x8379, 0x8379, 0x28EA, 0x837A, 0x837A, 0x22CF, 0x837B, 0x837B, 0x28EB,
- 0x837C, 0x837C, 0x2213, 0x837D, 0x837D, 0x28EC, 0x837E, 0x837E, 0x1FE4,
- 0x8380, 0x8380, 0x1F90, 0x8381, 0x8385, 0x28ED, 0x8386, 0x8386, 0x22D6,
- 0x8387, 0x8388, 0x28F2, 0x8389, 0x8389, 0x22D0, 0x838A, 0x838A, 0x22CE,
- 0x838B, 0x838C, 0x28F4, 0x838D, 0x838D, 0x2681, 0x838E, 0x8393, 0x28F6,
- 0x8394, 0x8394, 0x1E76, 0x8395, 0x839D, 0x28FC, 0x839E, 0x839E, 0x2231,
- 0x839F, 0x83A5, 0x2905, 0x83A6, 0x83A6, 0x1E93, 0x83A7, 0x83AA, 0x290C,
- 0x83AB, 0x83AB, 0x22D2, 0x83AC, 0x83AD, 0x2910, 0x83AE, 0x83AE, 0x22D7,
- 0x83AF, 0x83AF, 0x22D5, 0x83B0, 0x83B0, 0x22D1, 0x83B1, 0x83B9, 0x2912,
- 0x83BA, 0x83BA, 0x1EE5, 0x83BB, 0x83C8, 0x291B, 0x83C9, 0x83C9, 0x2025,
- 0x83CA, 0x83F5, 0x2929, 0x83F6, 0x83F6, 0x1ECF, 0x83F7, 0x83FE, 0x2955,
- 0x8440, 0x844F, 0x295D, 0x8450, 0x8450, 0x1FD9, 0x8451, 0x8470, 0x296D,
- 0x8471, 0x8471, 0x22C8, 0x8472, 0x8473, 0x298D, 0x8474, 0x8474, 0x2263,
- 0x8475, 0x8476, 0x298F, 0x8477, 0x8477, 0x2683, 0x8478, 0x847E, 0x2991,
- 0x8480, 0x8481, 0x2998, 0x8482, 0x8482, 0x1F17, 0x8483, 0x848D, 0x299A,
- 0x848E, 0x848E, 0x1F2B, 0x848F, 0x8491, 0x29A5, 0x8492, 0x8492, 0x22CA,
- 0x8493, 0x8493, 0x1E99, 0x8494, 0x849C, 0x29A8, 0x849D, 0x849D, 0x1F4F,
- 0x849E, 0x84A0, 0x29B1, 0x84A1, 0x84A1, 0x1FCF, 0x84A2, 0x84A2, 0x2036,
- 0x84A3, 0x84A3, 0x1F3A, 0x84A4, 0x84A4, 0x29B4, 0x84A5, 0x84A5, 0x22C9,
- 0x84A6, 0x84A6, 0x1F99, 0x84A7, 0x84A8, 0x29B5, 0x84A9, 0x84A9, 0x1F75,
- 0x84AA, 0x84C4, 0x29B7, 0x84C5, 0x84C5, 0x1FBE, 0x84C6, 0x84D2, 0x29D2,
- 0x84D3, 0x84D3, 0x1ECD, 0x84D4, 0x84D4, 0x29DF, 0x84D5, 0x84D5, 0x21A9,
- 0x84D6, 0x84D6, 0x29E0, 0x84D7, 0x84D7, 0x21E6, 0x84D8, 0x84D8, 0x29E1,
- 0x84D9, 0x84D9, 0x2127, 0x84DA, 0x84DA, 0x2003, 0x84DB, 0x84DC, 0x29E2,
- 0x84DD, 0x84DD, 0x2132, 0x84DE, 0x84E9, 0x29E4, 0x84EA, 0x84EA, 0x2323,
- 0x84EB, 0x84ED, 0x29F0, 0x84EE, 0x84EE, 0x2011, 0x84EF, 0x84F0, 0x29F3,
- 0x84F1, 0x84F1, 0x20F5, 0x84F2, 0x84FE, 0x29F5, 0x8540, 0x8550, 0x2A02,
- 0x8551, 0x8551, 0x22C5, 0x8552, 0x8552, 0x1F5E, 0x8553, 0x8553, 0x2A13,
- 0x8554, 0x8554, 0x22C6, 0x8555, 0x855D, 0x2A14, 0x855E, 0x855E, 0x20EF,
- 0x855F, 0x8565, 0x2A1D, 0x8566, 0x8566, 0x21D0, 0x8567, 0x857E, 0x2A24,
- 0x8580, 0x8586, 0x2A3C, 0x8587, 0x8587, 0x22C1, 0x8588, 0x858A, 0x2A43,
- 0x858B, 0x858B, 0x1E64, 0x858C, 0x8591, 0x2A46, 0x8592, 0x8592, 0x21F9,
- 0x8593, 0x8595, 0x2A4C, 0x8596, 0x8596, 0x2010, 0x8597, 0x8597, 0x2A4F,
- 0x8598, 0x8598, 0x22C2, 0x8599, 0x85A1, 0x2A50, 0x85A2, 0x85A2, 0x1E5A,
- 0x85A3, 0x85B1, 0x2A59, 0x85B2, 0x85B2, 0x1EA2, 0x85B3, 0x85FE, 0x2A68,
- 0x8640, 0x8649, 0x2AB4, 0x864A, 0x864A, 0x236D, 0x864B, 0x8653, 0x2ABE,
- 0x8654, 0x8654, 0x2247, 0x8655, 0x8667, 0x2AC7, 0x8668, 0x8668, 0x236C,
- 0x8669, 0x867E, 0x2ADA, 0x8680, 0x8695, 0x2AF0, 0x8696, 0x8696, 0x219C,
- 0x8697, 0x8698, 0x2B06, 0x8699, 0x8699, 0x20C9, 0x869A, 0x86A0, 0x2B08,
- 0x86A1, 0x86A1, 0x21F0, 0x86A2, 0x86C9, 0x2B0F, 0x86CA, 0x86CA, 0x210B,
- 0x86CB, 0x86CB, 0x2B37, 0x86CC, 0x86CC, 0x20DE, 0x86CD, 0x86CD, 0x2B38,
- 0x86CE, 0x86CE, 0x1EAA, 0x86CF, 0x86D0, 0x2B39, 0x86D1, 0x86D1, 0x222C,
- 0x86D2, 0x86DB, 0x2B3B, 0x86DC, 0x86DC, 0x20D8, 0x86DD, 0x86DD, 0x22C0,
- 0x86DE, 0x86E0, 0x2B45, 0x86E1, 0x86E1, 0x206F, 0x86E2, 0x86E7, 0x2B48,
- 0x86E8, 0x86E8, 0x21A1, 0x86E9, 0x86ED, 0x2B4E, 0x86EE, 0x86EE, 0x2379,
- 0x86EF, 0x86F3, 0x2B53, 0x86F4, 0x86F4, 0x2372, 0x86F5, 0x86FE, 0x2B58,
- 0x8740, 0x8740, 0x216A, 0x8741, 0x8743, 0x2B62, 0x8744, 0x8744, 0x237C,
- 0x8745, 0x8748, 0x2B65, 0x8749, 0x8749, 0x20B0, 0x874A, 0x874A, 0x2B69,
- 0x874B, 0x874B, 0x237A, 0x874C, 0x874C, 0x1E74, 0x874D, 0x874E, 0x2B6A,
- 0x874F, 0x874F, 0x2377, 0x8750, 0x8756, 0x2B6C, 0x8757, 0x8757, 0x1F4C,
- 0x8758, 0x8759, 0x2B73, 0x875A, 0x875A, 0x2378, 0x875B, 0x875B, 0x21CF,
- 0x875C, 0x875C, 0x2368, 0x875D, 0x875D, 0x2B75, 0x875E, 0x875E, 0x2371,
- 0x875F, 0x875F, 0x2B76, 0x8760, 0x8760, 0x2369, 0x8761, 0x8765, 0x2B77,
- 0x8766, 0x8766, 0x2674, 0x8767, 0x8779, 0x2B7C, 0x877A, 0x877A, 0x236F,
- 0x877B, 0x877C, 0x2B8F, 0x877D, 0x877D, 0x2370, 0x877E, 0x877E, 0x2B91,
- 0x8780, 0x8780, 0x2B92, 0x8781, 0x8781, 0x2376, 0x8782, 0x8782, 0x2373,
- 0x8783, 0x8785, 0x2B93, 0x8786, 0x8786, 0x237F, 0x8787, 0x8787, 0x2B96,
- 0x8788, 0x8788, 0x2374, 0x8789, 0x8789, 0x2B97, 0x878A, 0x878A, 0x20B5,
- 0x878B, 0x878C, 0x2B98, 0x878D, 0x878D, 0x1EDB, 0x878E, 0x878E, 0x2672,
- 0x878F, 0x8792, 0x2B9A, 0x8793, 0x8793, 0x236E, 0x8794, 0x8797, 0x2B9E,
- 0x8798, 0x8798, 0x21B7, 0x8799, 0x879C, 0x2BA2, 0x879D, 0x879D, 0x2375,
- 0x879E, 0x87A2, 0x2BA6, 0x87A3, 0x87A3, 0x2382, 0x87A4, 0x87A6, 0x2BAB,
- 0x87A7, 0x87A7, 0x209E, 0x87A8, 0x87B2, 0x2BAE, 0x87B3, 0x87B3, 0x236B,
- 0x87B4, 0x87B4, 0x2BB9, 0x87B5, 0x87B5, 0x2039, 0x87B6, 0x87BA, 0x2BBA,
- 0x87BB, 0x87BB, 0x269F, 0x87BC, 0x87BE, 0x2BBF, 0x87BF, 0x87BF, 0x237D,
- 0x87C0, 0x87C0, 0x21F5, 0x87C1, 0x87C1, 0x2BC2, 0x87C2, 0x87C2, 0x2381,
- 0x87C3, 0x87C9, 0x2BC3, 0x87CA, 0x87CA, 0x237B, 0x87CB, 0x87CB, 0x237E,
- 0x87CC, 0x87CC, 0x21CC, 0x87CD, 0x87CE, 0x2BCA, 0x87CF, 0x87CF, 0x22DB,
- 0x87D0, 0x87D1, 0x2BCC, 0x87D2, 0x87D2, 0x236A, 0x87D3, 0x87D3, 0x2689,
- 0x87D4, 0x87D4, 0x2BCE, 0x87D5, 0x87D5, 0x2697, 0x87D6, 0x87D9, 0x2BCF,
- 0x87DA, 0x87DA, 0x22A1, 0x87DB, 0x87F6, 0x2BD3, 0x87F7, 0x87F7, 0x2383,
- 0x87F8, 0x87F8, 0x1F3D, 0x87F9, 0x87F9, 0x2BEF, 0x87FA, 0x87FA, 0x218F,
- 0x87FB, 0x87FE, 0x2BF0, 0x8840, 0x8840, 0x2246, 0x8841, 0x8841, 0x2248,
- 0x8842, 0x8843, 0x2BF4, 0x8844, 0x8844, 0x217E, 0x8845, 0x8845, 0x2BF6,
- 0x8846, 0x8846, 0x2180, 0x8847, 0x887E, 0x2BF7, 0x8880, 0x88B9, 0x2C2F,
- 0x88BA, 0x88BA, 0x232A, 0x88BB, 0x88CB, 0x2C69, 0x88CC, 0x88CC, 0x228B,
- 0x88CD, 0x88D3, 0x2C7A, 0x88D4, 0x88D4, 0x1F85, 0x88D5, 0x88D6, 0x2C81,
- 0x88D7, 0x88D7, 0x2325, 0x88D8, 0x88DE, 0x2C83, 0x88DF, 0x88DF, 0x232C,
- 0x88E0, 0x88E4, 0x2C8A, 0x88E5, 0x88E5, 0x232E, 0x88E6, 0x88F1, 0x2C8F,
- 0x88F2, 0x88F2, 0x2205, 0x88F3, 0x88F3, 0x1E38, 0x88F4, 0x88F5, 0x2C9B,
- 0x88F6, 0x88F6, 0x1E73, 0x88F7, 0x88FE, 0x2C9D, 0x8940, 0x894A, 0x2CA5,
- 0x894B, 0x894B, 0x1FE3, 0x894C, 0x894C, 0x2339, 0x894D, 0x894D, 0x2CB0,
- 0x894E, 0x894E, 0x232B, 0x894F, 0x894F, 0x2CB1, 0x8950, 0x8950, 0x232D,
- 0x8951, 0x8953, 0x2CB2, 0x8954, 0x8954, 0x217F, 0x8955, 0x895C, 0x2CB5,
- 0x895D, 0x895D, 0x21A7, 0x895E, 0x895E, 0x2CBD, 0x895F, 0x895F, 0x232F,
- 0x8960, 0x896C, 0x2CBE, 0x896D, 0x896D, 0x1E7D, 0x896E, 0x8970, 0x2CCB,
- 0x8971, 0x8971, 0x20D6, 0x8972, 0x897B, 0x2CCE, 0x897C, 0x897C, 0x1EC2,
- 0x897D, 0x897E, 0x2CD8, 0x8980, 0x898A, 0x2CDA, 0x898B, 0x898B, 0x22B2,
- 0x898C, 0x8998, 0x2CE5, 0x8999, 0x8999, 0x1EDF, 0x899A, 0x899D, 0x2CF2,
- 0x899E, 0x899E, 0x1EF9, 0x899F, 0x89A5, 0x2CF6, 0x89A6, 0x89A6, 0x20D9,
- 0x89A7, 0x89A7, 0x2CFD, 0x89A8, 0x89A8, 0x1FDD, 0x89A9, 0x89AE, 0x2CFE,
- 0x89AF, 0x89AF, 0x2167, 0x89B0, 0x89B9, 0x2D04, 0x89BA, 0x89BA, 0x21ED,
- 0x89BB, 0x89BD, 0x2D0E, 0x89BE, 0x89BE, 0x2007, 0x89BF, 0x89BF, 0x2326,
- 0x89C0, 0x89C0, 0x2329, 0x89C1, 0x89C3, 0x2D11, 0x89C4, 0x89C4, 0x1F52,
- 0x89C5, 0x89C5, 0x203B, 0x89C6, 0x89C6, 0x2328, 0x89C7, 0x89C7, 0x2D14,
- 0x89C8, 0x89C8, 0x2327, 0x89C9, 0x89CD, 0x2D15, 0x89CE, 0x89CE, 0x1E2B,
- 0x89CF, 0x89D0, 0x2D1A, 0x89D1, 0x89D1, 0x22AE, 0x89D2, 0x89D7, 0x2D1C,
- 0x89D8, 0x89D8, 0x1F49, 0x89D9, 0x89DA, 0x2D22, 0x89DB, 0x89DB, 0x2138,
- 0x89DC, 0x89F3, 0x2D24, 0x89F4, 0x89F4, 0x2081, 0x89F5, 0x89FE, 0x2D3C,
- 0x8A40, 0x8A40, 0x2D46, 0x8A41, 0x8A41, 0x1F7C, 0x8A42, 0x8A58, 0x2D47,
- 0x8A59, 0x8A59, 0x235B, 0x8A5A, 0x8A5A, 0x1EDE, 0x8A5B, 0x8A5B, 0x2D5E,
- 0x8A5C, 0x8A5C, 0x1FA2, 0x8A5D, 0x8A5D, 0x2D5F, 0x8A5E, 0x8A5E, 0x1EFA,
- 0x8A5F, 0x8A78, 0x2D60, 0x8A79, 0x8A79, 0x22AD, 0x8A7A, 0x8A7E, 0x2D7A,
- 0x8A80, 0x8AE3, 0x2D7F, 0x8AE4, 0x8AE4, 0x203F, 0x8AE5, 0x8AFE, 0x2DE3,
- 0x8B40, 0x8B43, 0x2DFD, 0x8B44, 0x8B44, 0x1F0E, 0x8B45, 0x8B48, 0x2E01,
- 0x8B49, 0x8B49, 0x23F9, 0x8B4A, 0x8B79, 0x2E05, 0x8B7A, 0x8B7A, 0x23FC,
- 0x8B7B, 0x8B7E, 0x2E35, 0x8B80, 0x8B8B, 0x2E39, 0x8B8C, 0x8B8C, 0x2069,
- 0x8B8D, 0x8B9D, 0x2E45, 0x8B9E, 0x8B9E, 0x23F7, 0x8B9F, 0x8BB2, 0x2E56,
- 0x8BB3, 0x8BB3, 0x23F6, 0x8BB4, 0x8BB8, 0x2E6A, 0x8BB9, 0x8BB9, 0x23FD,
- 0x8BBA, 0x8BBD, 0x2E6F, 0x8BBE, 0x8BBE, 0x23F8, 0x8BBF, 0x8BC5, 0x2E73,
- 0x8BC6, 0x8BC6, 0x23FA, 0x8BC7, 0x8BC7, 0x2E7A, 0x8BC8, 0x8BC8, 0x23FE,
- 0x8BC9, 0x8BC9, 0x1FA8, 0x8BCA, 0x8BD3, 0x2E7B, 0x8BD4, 0x8BD4, 0x2401,
- 0x8BD5, 0x8BDB, 0x2E85, 0x8BDC, 0x8BDC, 0x23FF, 0x8BDD, 0x8BE4, 0x2E8C,
- 0x8BE5, 0x8BE5, 0x2400, 0x8BE6, 0x8BEA, 0x2E94, 0x8BEB, 0x8BEB, 0x2221,
- 0x8BEC, 0x8BEF, 0x2E99, 0x8BF0, 0x8BF0, 0x2122, 0x8BF1, 0x8BFE, 0x2E9D,
- 0x8C40, 0x8C43, 0x2EAB, 0x8C44, 0x8C44, 0x23FB, 0x8C45, 0x8C4E, 0x2EAF,
- 0x8C4F, 0x8C4F, 0x215A, 0x8C50, 0x8C56, 0x2EB9, 0x8C57, 0x8C57, 0x21E5,
- 0x8C58, 0x8C5B, 0x2EC0, 0x8C5C, 0x8C5C, 0x2057, 0x8C5D, 0x8C7E, 0x2EC4,
- 0x8C80, 0x8C8A, 0x2EE6, 0x8C8B, 0x8C8B, 0x20E5, 0x8C8C, 0x8C8C, 0x2EF1,
- 0x8C8D, 0x8C8D, 0x212F, 0x8C8E, 0x8C8E, 0x20A3, 0x8C8F, 0x8C8F, 0x2121,
- 0x8C90, 0x8C90, 0x2EF2, 0x8C91, 0x8C91, 0x21D4, 0x8C92, 0x8C92, 0x1FE5,
- 0x8C93, 0x8C98, 0x2EF3, 0x8C99, 0x8C99, 0x1E8A, 0x8C9A, 0x8C9A, 0x1E37,
- 0x8C9B, 0x8CA1, 0x2EF9, 0x8CA2, 0x8CA2, 0x1F9E, 0x8CA3, 0x8CA3, 0x22A6,
- 0x8CA4, 0x8CA4, 0x21E8, 0x8CA5, 0x8CA5, 0x2F00, 0x8CA6, 0x8CA6, 0x1EDA,
- 0x8CA7, 0x8CA7, 0x1EB9, 0x8CA8, 0x8CBF, 0x2F01, 0x8CC0, 0x8CC0, 0x235C,
- 0x8CC1, 0x8CD1, 0x2F19, 0x8CD2, 0x8CD2, 0x2050, 0x8CD3, 0x8CD3, 0x1E67,
- 0x8CD4, 0x8CD4, 0x2F2A, 0x8CD5, 0x8CD5, 0x23F4, 0x8CD6, 0x8CD8, 0x2F2B,
- 0x8CD9, 0x8CD9, 0x213E, 0x8CDA, 0x8CF8, 0x2F2E, 0x8CF9, 0x8CF9, 0x1F16,
- 0x8CFA, 0x8CFE, 0x2F4D, 0x8D40, 0x8D72, 0x2F52, 0x8D73, 0x8D73, 0x2389,
- 0x8D74, 0x8D74, 0x2F85, 0x8D75, 0x8D75, 0x1EB7, 0x8D76, 0x8D7A, 0x2F86,
- 0x8D7B, 0x8D7B, 0x21B4, 0x8D7C, 0x8D7E, 0x2F8B, 0x8D80, 0x8D87, 0x2F8E,
- 0x8D88, 0x8D88, 0x238F, 0x8D89, 0x8D8E, 0x2F96, 0x8D8F, 0x8D8F, 0x1F1A,
- 0x8D90, 0x8D9D, 0x2F9C, 0x8D9E, 0x8D9E, 0x238B, 0x8D9F, 0x8DB8, 0x2FAA,
- 0x8DB9, 0x8DB9, 0x238A, 0x8DBA, 0x8DE1, 0x2FC4, 0x8DE2, 0x8DE2, 0x2391,
- 0x8DE3, 0x8DE3, 0x2FEC, 0x8DE4, 0x8DE4, 0x2271, 0x8DE5, 0x8DE6, 0x2FED,
- 0x8DE7, 0x8DE7, 0x2388, 0x8DE8, 0x8DF6, 0x2FEF, 0x8DF7, 0x8DF7, 0x238E,
- 0x8DF8, 0x8DFD, 0x2FFE, 0x8DFE, 0x8DFE, 0x238D, 0x8E40, 0x8E45, 0x3004,
- 0x8E46, 0x8E46, 0x238C, 0x8E47, 0x8E55, 0x300A, 0x8E56, 0x8E56, 0x2390,
- 0x8E57, 0x8E57, 0x3019, 0x8E58, 0x8E58, 0x2033, 0x8E59, 0x8E59, 0x301A,
- 0x8E5A, 0x8E5A, 0x223C, 0x8E5B, 0x8E67, 0x301B, 0x8E68, 0x8E68, 0x1FE9,
- 0x8E69, 0x8E6D, 0x3028, 0x8E6E, 0x8E6E, 0x2055, 0x8E6F, 0x8E6F, 0x302D,
- 0x8E70, 0x8E70, 0x2392, 0x8E71, 0x8E7E, 0x302E, 0x8E80, 0x8E80, 0x2324,
- 0x8E81, 0x8E9A, 0x303C, 0x8E9B, 0x8E9B, 0x2143, 0x8E9C, 0x8E9E, 0x3056,
- 0x8E9F, 0x8E9F, 0x2129, 0x8EA0, 0x8EA3, 0x3059, 0x8EA4, 0x8EA4, 0x2277,
- 0x8EA5, 0x8EA6, 0x305D, 0x8EA7, 0x8EA7, 0x1EA7, 0x8EA8, 0x8EAB, 0x305F,
- 0x8EAC, 0x8EAC, 0x2285, 0x8EAD, 0x8EAD, 0x3063, 0x8EAE, 0x8EAE, 0x2384,
- 0x8EAF, 0x8EBC, 0x3064, 0x8EBD, 0x8EBD, 0x2387, 0x8EBE, 0x8EBE, 0x2386,
- 0x8EBF, 0x8EC2, 0x3072, 0x8EC3, 0x8EC3, 0x2290, 0x8EC4, 0x8EC4, 0x3076,
- 0x8EC5, 0x8EC5, 0x1E44, 0x8EC6, 0x8ECC, 0x3077, 0x8ECD, 0x8ECD, 0x1E32,
- 0x8ECE, 0x8ECE, 0x2385, 0x8ECF, 0x8ED5, 0x307E, 0x8ED6, 0x8ED6, 0x1F13,
- 0x8ED7, 0x8ED7, 0x1F73, 0x8ED8, 0x8EEB, 0x3085, 0x8EEC, 0x8EEC, 0x1FE0,
- 0x8EED, 0x8EFE, 0x3099, 0x8F40, 0x8F51, 0x30AB, 0x8F52, 0x8F52, 0x2087,
- 0x8F53, 0x8F53, 0x1E78, 0x8F54, 0x8F54, 0x23AE, 0x8F55, 0x8F55, 0x1EF6,
- 0x8F56, 0x8F56, 0x1F31, 0x8F57, 0x8F5C, 0x30BD, 0x8F5D, 0x8F5D, 0x2045,
- 0x8F5E, 0x8F63, 0x30C3, 0x8F64, 0x8F64, 0x2178, 0x8F65, 0x8F7E, 0x30C9,
- 0x8F80, 0x8F85, 0x30E3, 0x8F86, 0x8F86, 0x23F5, 0x8F87, 0x8F87, 0x30E9,
- 0x8F88, 0x8F88, 0x2275, 0x8F89, 0x8F94, 0x30EA, 0x8F95, 0x8F95, 0x266E,
- 0x8F96, 0x8F96, 0x30F6, 0x8F97, 0x8F97, 0x1EB0, 0x8F98, 0x8F9A, 0x30F7,
- 0x8F9B, 0x8F9B, 0x2083, 0x8F9C, 0x8F9C, 0x30FA, 0x8F9D, 0x8F9D, 0x2188,
- 0x8F9E, 0x8FA0, 0x30FB, 0x8FA1, 0x8FA1, 0x267C, 0x8FA2, 0x8FBC, 0x30FE,
- 0x8FBD, 0x8FBD, 0x1FC5, 0x8FBE, 0x8FC3, 0x3119, 0x8FC4, 0x8FC4, 0x1EA1,
- 0x8FC5, 0x8FC5, 0x311F, 0x8FC6, 0x8FC6, 0x2393, 0x8FC7, 0x8FCC, 0x3120,
- 0x8FCD, 0x8FCD, 0x1F0B, 0x8FCE, 0x8FD7, 0x3126, 0x8FD8, 0x8FD8, 0x1E7C,
- 0x8FD9, 0x8FFE, 0x3130, 0x9040, 0x907E, 0x3156, 0x9080, 0x909C, 0x3195,
- 0x909D, 0x909D, 0x23B4, 0x909E, 0x909E, 0x207E, 0x909F, 0x90B9, 0x31B2,
- 0x90BA, 0x90BA, 0x1EE3, 0x90BB, 0x90BF, 0x31CD, 0x90C0, 0x90C0, 0x2095,
- 0x90C1, 0x90C1, 0x23BB, 0x90C2, 0x90C4, 0x31D2, 0x90C5, 0x90C5, 0x23B9,
- 0x90C6, 0x90DA, 0x31D5, 0x90DB, 0x90DB, 0x1E28, 0x90DC, 0x90DC, 0x23BD,
- 0x90DD, 0x90EC, 0x31EA, 0x90ED, 0x90ED, 0x23B5, 0x90EE, 0x90EF, 0x31FA,
- 0x90F0, 0x90F0, 0x23BA, 0x90F1, 0x90F6, 0x31FC, 0x90F7, 0x90F7, 0x23B3,
- 0x90F8, 0x90FE, 0x3202, 0x9140, 0x9141, 0x3209, 0x9142, 0x9142, 0x2162,
- 0x9143, 0x914A, 0x320B, 0x914B, 0x914B, 0x1E5E, 0x914C, 0x914C, 0x3213,
- 0x914D, 0x914D, 0x1E5D, 0x914E, 0x9150, 0x3214, 0x9151, 0x9151, 0x23B7,
- 0x9152, 0x9153, 0x3217, 0x9154, 0x9154, 0x1F2F, 0x9155, 0x9155, 0x24DF,
- 0x9156, 0x9158, 0x3219, 0x9159, 0x9159, 0x23B2, 0x915A, 0x915A, 0x214E,
- 0x915B, 0x915C, 0x321C, 0x915D, 0x915D, 0x2052, 0x915E, 0x9160, 0x321E,
- 0x9161, 0x9161, 0x23BC, 0x9162, 0x9162, 0x3221, 0x9163, 0x9163, 0x20EB,
- 0x9164, 0x916D, 0x3222, 0x916E, 0x916E, 0x2232, 0x916F, 0x9175, 0x322C,
- 0x9176, 0x9176, 0x1E3F, 0x9177, 0x9179, 0x3233, 0x917A, 0x917A, 0x201B,
- 0x917B, 0x917B, 0x20BC, 0x917C, 0x917C, 0x23BE, 0x917D, 0x917E, 0x3236,
- 0x9180, 0x9183, 0x3238, 0x9184, 0x9184, 0x1EAE, 0x9185, 0x918C, 0x323C,
- 0x918D, 0x918D, 0x1EFB, 0x918E, 0x9190, 0x3244, 0x9191, 0x9191, 0x2089,
- 0x9192, 0x9192, 0x3247, 0x9193, 0x9193, 0x23B1, 0x9194, 0x9196, 0x3248,
- 0x9197, 0x9197, 0x21C4, 0x9198, 0x919A, 0x324B, 0x919B, 0x919B, 0x2214,
- 0x919C, 0x91A8, 0x324E, 0x91A9, 0x91A9, 0x1FDE, 0x91AA, 0x91AA, 0x2223,
- 0x91AB, 0x91AB, 0x23B6, 0x91AC, 0x91B9, 0x325B, 0x91BA, 0x91BA, 0x268C,
- 0x91BB, 0x91BB, 0x24DE, 0x91BC, 0x91BE, 0x3269, 0x91BF, 0x91BF, 0x24E0,
- 0x91C0, 0x91C2, 0x326C, 0x91C3, 0x91C3, 0x23B8, 0x91C4, 0x91CC, 0x326F,
- 0x91CD, 0x91CD, 0x1E81, 0x91CE, 0x91CF, 0x3278, 0x91D0, 0x91D0, 0x1FFE,
- 0x91D1, 0x91D1, 0x1F51, 0x91D2, 0x91D2, 0x21E1, 0x91D3, 0x91D3, 0x327A,
- 0x91D4, 0x91D4, 0x23B0, 0x91D5, 0x91D5, 0x327B, 0x91D6, 0x91D6, 0x1FCE,
- 0x91D7, 0x91D7, 0x327C, 0x91D8, 0x91D8, 0x211E, 0x91D9, 0x91D9, 0x2021,
- 0x91DA, 0x91DE, 0x327D, 0x91DF, 0x91DF, 0x24E1, 0x91E0, 0x91E1, 0x3282,
- 0x91E2, 0x91E2, 0x24A3, 0x91E3, 0x91E9, 0x3284, 0x91EA, 0x91EA, 0x24A4,
- 0x91EB, 0x91EF, 0x328B, 0x91F0, 0x91F0, 0x2273, 0x91F1, 0x91F1, 0x3290,
- 0x91F2, 0x91F2, 0x21B0, 0x91F3, 0x91FE, 0x3291, 0x9240, 0x927E, 0x329D,
- 0x9280, 0x92B5, 0x32DC, 0x92B6, 0x92B6, 0x21D1, 0x92B7, 0x92CD, 0x3312,
- 0x92CE, 0x92CE, 0x211C, 0x92CF, 0x92CF, 0x3329, 0x92D0, 0x92D0, 0x235D,
- 0x92D1, 0x92D3, 0x332A, 0x92D4, 0x92D4, 0x2682, 0x92D5, 0x92DE, 0x332D,
- 0x92DF, 0x92DF, 0x210D, 0x92E0, 0x92E0, 0x205A, 0x92E1, 0x92FD, 0x3337,
- 0x92FE, 0x92FE, 0x1F8D, 0x9340, 0x934F, 0x3354, 0x9350, 0x9350, 0x21FF,
- 0x9351, 0x935C, 0x3364, 0x935D, 0x935D, 0x1F58, 0x935E, 0x936F, 0x3370,
- 0x9370, 0x9370, 0x215B, 0x9371, 0x9375, 0x3382, 0x9376, 0x9376, 0x1EB6,
- 0x9377, 0x937E, 0x3387, 0x9380, 0x938B, 0x338F, 0x938C, 0x938C, 0x20DB,
- 0x938D, 0x939C, 0x339B, 0x939D, 0x939D, 0x2360, 0x939E, 0x93A4, 0x33AB,
- 0x93A5, 0x93A5, 0x2361, 0x93A6, 0x93A6, 0x33B2, 0x93A7, 0x93A7, 0x2040,
- 0x93A8, 0x93B3, 0x33B3, 0x93B4, 0x93B4, 0x228E, 0x93B5, 0x93B7, 0x33BF,
- 0x93B8, 0x93B8, 0x1FDF, 0x93B9, 0x93BA, 0x33C2, 0x93BB, 0x93BB, 0x235E,
- 0x93BC, 0x93BC, 0x33C4, 0x93BD, 0x93BD, 0x1E6A, 0x93BE, 0x93C5, 0x33C5,
- 0x93C6, 0x93C6, 0x2002, 0x93C7, 0x93CE, 0x33CD, 0x93CF, 0x93CF, 0x2093,
- 0x93D0, 0x93D6, 0x33D5, 0x93D7, 0x93D7, 0x235F, 0x93D8, 0x93DA, 0x33DC,
- 0x93DB, 0x93DB, 0x1EAC, 0x93DC, 0x93DC, 0x1E54, 0x93DD, 0x93E0, 0x33DF,
- 0x93E1, 0x93E1, 0x1F08, 0x93E2, 0x93E3, 0x33E3, 0x93E4, 0x93E4, 0x20C0,
- 0x93E5, 0x93E5, 0x2362, 0x93E6, 0x93E8, 0x33E5, 0x93E9, 0x93E9, 0x2160,
- 0x93EA, 0x93EA, 0x33E8, 0x93EB, 0x93EB, 0x219D, 0x93EC, 0x93EC, 0x1F8E,
- 0x93ED, 0x93ED, 0x222D, 0x93EE, 0x93EE, 0x33E9, 0x93EF, 0x93EF, 0x2047,
- 0x93F0, 0x93F0, 0x33EA, 0x93F1, 0x93F1, 0x2262, 0x93F2, 0x93F3, 0x33EB,
- 0x93F4, 0x93F4, 0x1F67, 0x93F5, 0x93F5, 0x1EB2, 0x93F6, 0x93F9, 0x33ED,
- 0x93FA, 0x93FA, 0x1EA9, 0x93FB, 0x93FD, 0x33F1, 0x93FE, 0x93FE, 0x1FCC,
- 0x9440, 0x9443, 0x33F4, 0x9444, 0x9444, 0x1F72, 0x9445, 0x944C, 0x33F8,
- 0x944D, 0x944D, 0x2098, 0x944E, 0x944F, 0x3400, 0x9450, 0x9450, 0x1E52,
- 0x9451, 0x9451, 0x20A4, 0x9452, 0x9452, 0x1F1C, 0x9453, 0x9453, 0x228F,
- 0x9454, 0x9454, 0x3402, 0x9455, 0x9455, 0x1FED, 0x9456, 0x9457, 0x3403,
- 0x9458, 0x9458, 0x2365, 0x9459, 0x945A, 0x3405, 0x945B, 0x945B, 0x1E2D,
- 0x945C, 0x945C, 0x2152, 0x945D, 0x945D, 0x2366, 0x945E, 0x945E, 0x3407,
- 0x945F, 0x945F, 0x20FA, 0x9460, 0x9463, 0x3408, 0x9464, 0x9464, 0x2363,
- 0x9465, 0x9465, 0x340C, 0x9466, 0x9466, 0x209A, 0x9467, 0x946D, 0x340D,
- 0x946E, 0x946E, 0x203C, 0x946F, 0x9471, 0x3414, 0x9472, 0x9472, 0x1FF6,
- 0x9473, 0x9473, 0x3417, 0x9474, 0x9474, 0x2364, 0x9475, 0x9475, 0x3418,
- 0x9476, 0x9476, 0x1E69, 0x9477, 0x9477, 0x3419, 0x9478, 0x9478, 0x2367,
- 0x9479, 0x9479, 0x341A, 0x947A, 0x947A, 0x211D, 0x947B, 0x947E, 0x341B,
- 0x9480, 0x9480, 0x2259, 0x9481, 0x9481, 0x2056, 0x9482, 0x9482, 0x2163,
- 0x9483, 0x9486, 0x341F, 0x9487, 0x9487, 0x1FA9, 0x9488, 0x9488, 0x1FFC,
- 0x9489, 0x94A0, 0x3423, 0x94A1, 0x94A1, 0x1E2E, 0x94A2, 0x94B2, 0x343B,
- 0x94B3, 0x94B3, 0x1EBC, 0x94B4, 0x94B4, 0x344C, 0x94B5, 0x94B5, 0x2142,
- 0x94B6, 0x94BE, 0x344D, 0x94BF, 0x94BF, 0x201E, 0x94C0, 0x94C0, 0x1E43,
- 0x94C1, 0x94CB, 0x3456, 0x94CC, 0x94CC, 0x24D4, 0x94CD, 0x94D7, 0x3461,
- 0x94D8, 0x94D8, 0x226F, 0x94D9, 0x94DF, 0x346C, 0x94E0, 0x94E0, 0x1ED7,
- 0x94E1, 0x94FE, 0x3473, 0x9540, 0x9571, 0x3491, 0x9572, 0x9572, 0x212D,
- 0x9573, 0x957E, 0x34C3, 0x9580, 0x9582, 0x34CF, 0x9583, 0x9583, 0x229B,
- 0x9584, 0x959D, 0x34D2, 0x959E, 0x959E, 0x2256, 0x959F, 0x959F, 0x24A8,
- 0x95A0, 0x95B2, 0x34EC, 0x95B3, 0x95B3, 0x1E79, 0x95B4, 0x95B9, 0x34FF,
- 0x95BA, 0x95BA, 0x225A, 0x95BB, 0x95CE, 0x3505, 0x95CF, 0x95CF, 0x24A7,
- 0x95D0, 0x95D0, 0x3519, 0x95D1, 0x95D1, 0x2686, 0x95D2, 0x95D2, 0x24A6,
- 0x95D3, 0x95D3, 0x351A, 0x95D4, 0x95D4, 0x21CE, 0x95D5, 0x95E0, 0x351B,
- 0x95E1, 0x95E1, 0x24A9, 0x95E2, 0x95E6, 0x3527, 0x95E7, 0x95E7, 0x1FE7,
- 0x95E8, 0x95F0, 0x352C, 0x95F1, 0x95F1, 0x2112, 0x95F2, 0x95F7, 0x3535,
- 0x95F8, 0x95F8, 0x213C, 0x95F9, 0x95FD, 0x353B, 0x95FE, 0x95FE, 0x1F5C,
- 0x9640, 0x9655, 0x3540, 0x9656, 0x9656, 0x24C4, 0x9657, 0x967B, 0x3556,
- 0x967C, 0x967C, 0x1ECC, 0x967D, 0x967E, 0x357B, 0x9680, 0x96FE, 0x357D,
- 0x9740, 0x9766, 0x35FC, 0x9767, 0x9767, 0x246A, 0x9768, 0x976B, 0x3623,
- 0x976C, 0x976C, 0x2175, 0x976D, 0x976D, 0x3627, 0x976E, 0x976E, 0x246D,
- 0x976F, 0x977E, 0x3628, 0x9780, 0x9795, 0x3638, 0x9796, 0x9796, 0x246B,
- 0x9797, 0x9797, 0x225F, 0x9798, 0x979C, 0x364E, 0x979D, 0x979D, 0x1ECE,
- 0x979E, 0x97A2, 0x3653, 0x97A3, 0x97A3, 0x2272, 0x97A4, 0x97BE, 0x3658,
- 0x97BF, 0x97BF, 0x2473, 0x97C0, 0x97ED, 0x3673, 0x97EE, 0x97EE, 0x21FE,
- 0x97EF, 0x97F6, 0x36A1, 0x97F7, 0x97F7, 0x1EFE, 0x97F8, 0x97FE, 0x36A9,
- 0x9840, 0x9844, 0x36B0, 0x9845, 0x9845, 0x2475, 0x9846, 0x9848, 0x36B5,
- 0x9849, 0x9849, 0x220A, 0x984A, 0x984E, 0x36B8, 0x984F, 0x984F, 0x1F6F,
- 0x9850, 0x9870, 0x36BD, 0x9871, 0x9871, 0x2468, 0x9872, 0x9872, 0x36DE,
- 0x9873, 0x9873, 0x2100, 0x9874, 0x987E, 0x36DF, 0x9880, 0x9880, 0x36EA,
- 0x9881, 0x9881, 0x2476, 0x9882, 0x988A, 0x36EB, 0x988B, 0x988B, 0x1F27,
- 0x988C, 0x988C, 0x20D7, 0x988D, 0x989F, 0x36F4, 0x98A0, 0x98A0, 0x247C,
- 0x98A1, 0x98A9, 0x3707, 0x98AA, 0x98AA, 0x1FA1, 0x98AB, 0x98B5, 0x3710,
- 0x98B6, 0x98B6, 0x22AA, 0x98B7, 0x98B7, 0x2005, 0x98B8, 0x98B9, 0x371B,
- 0x98BA, 0x98BA, 0x246C, 0x98BB, 0x98C6, 0x371D, 0x98C7, 0x98C7, 0x203E,
- 0x98C8, 0x98CA, 0x3729, 0x98CB, 0x98CB, 0x1E4C, 0x98CC, 0x98CF, 0x372C,
- 0x98D0, 0x98D0, 0x213A, 0x98D1, 0x98D2, 0x3730, 0x98D3, 0x98D3, 0x2204,
- 0x98D4, 0x98E2, 0x3732, 0x98E3, 0x98E3, 0x20C3, 0x98E4, 0x98E4, 0x2140,
- 0x98E5, 0x98E5, 0x2477, 0x98E6, 0x98EE, 0x3741, 0x98EF, 0x98EF, 0x2474,
- 0x98F0, 0x98F1, 0x374A, 0x98F2, 0x98F2, 0x20DD, 0x98F3, 0x98FE, 0x374C,
- 0x9940, 0x9942, 0x3758, 0x9943, 0x9943, 0x1F68, 0x9944, 0x9944, 0x375B,
- 0x9945, 0x9945, 0x2185, 0x9946, 0x9965, 0x375C, 0x9966, 0x9966, 0x2472,
- 0x9967, 0x996D, 0x377C, 0x996E, 0x996E, 0x1EB5, 0x996F, 0x9974, 0x3783,
- 0x9975, 0x9975, 0x2478, 0x9976, 0x9979, 0x3789, 0x997A, 0x997A, 0x1F8B,
- 0x997B, 0x997B, 0x2484, 0x997C, 0x997E, 0x378D, 0x9980, 0x9984, 0x3790,
- 0x9985, 0x9985, 0x2699, 0x9986, 0x9988, 0x3795, 0x9989, 0x9989, 0x2482,
- 0x998A, 0x998D, 0x3798, 0x998E, 0x998E, 0x20A1, 0x998F, 0x9990, 0x379C,
- 0x9991, 0x9991, 0x1F92, 0x9992, 0x9998, 0x379E, 0x9999, 0x9999, 0x1F38,
- 0x999A, 0x99A8, 0x37A5, 0x99A9, 0x99A9, 0x2485, 0x99AA, 0x99AF, 0x37B4,
- 0x99B0, 0x99B0, 0x2480, 0x99B1, 0x99B1, 0x246E, 0x99B2, 0x99B2, 0x37BA,
- 0x99B3, 0x99B3, 0x247B, 0x99B4, 0x99B4, 0x2486, 0x99B5, 0x99B5, 0x2471,
- 0x99B6, 0x99BC, 0x37BB, 0x99BD, 0x99BD, 0x2483, 0x99BE, 0x99BE, 0x2470,
- 0x99BF, 0x99BF, 0x37C2, 0x99C0, 0x99C0, 0x2469, 0x99C1, 0x99C1, 0x37C3,
- 0x99C2, 0x99C2, 0x247F, 0x99C3, 0x99C8, 0x37C4, 0x99C9, 0x99C9, 0x246F,
- 0x99CA, 0x99CD, 0x37CA, 0x99CE, 0x99CE, 0x2481, 0x99CF, 0x99D0, 0x37CE,
- 0x99D1, 0x99D1, 0x2220, 0x99D2, 0x99D9, 0x37D0, 0x99DA, 0x99DA, 0x1FF5,
- 0x99DB, 0x99DF, 0x37D8, 0x99E0, 0x99E0, 0x20F4, 0x99E1, 0x99E4, 0x37DD,
- 0x99E5, 0x99E5, 0x247D, 0x99E6, 0x99E7, 0x37E1, 0x99E8, 0x99E8, 0x2479,
- 0x99E9, 0x99EB, 0x37E3, 0x99EC, 0x99EC, 0x247E, 0x99ED, 0x99F3, 0x37E6,
- 0x99F4, 0x99F4, 0x247A, 0x99F5, 0x99FE, 0x37ED, 0x9A40, 0x9A49, 0x37F7,
- 0x9A4A, 0x9A4A, 0x20E3, 0x9A4B, 0x9A56, 0x3801, 0x9A57, 0x9A57, 0x20AD,
- 0x9A58, 0x9A64, 0x380D, 0x9A65, 0x9A65, 0x24CB, 0x9A66, 0x9A66, 0x381A,
- 0x9A67, 0x9A67, 0x1F53, 0x9A68, 0x9A70, 0x381B, 0x9A71, 0x9A71, 0x2159,
- 0x9A72, 0x9A75, 0x3824, 0x9A76, 0x9A76, 0x2013, 0x9A77, 0x9A77, 0x1F33,
- 0x9A78, 0x9A7E, 0x3828, 0x9A80, 0x9A87, 0x382F, 0x9A88, 0x9A88, 0x1E5C,
- 0x9A89, 0x9A8B, 0x3837, 0x9A8C, 0x9A8C, 0x2488, 0x9A8D, 0x9A90, 0x383A,
- 0x9A91, 0x9A91, 0x2487, 0x9A92, 0x9A96, 0x383E, 0x9A97, 0x9A97, 0x248A,
- 0x9A98, 0x9A99, 0x3843, 0x9A9A, 0x9A9A, 0x2489, 0x9A9B, 0x9A9B, 0x248B,
- 0x9A9C, 0x9A9D, 0x3845, 0x9A9E, 0x9A9E, 0x1F83, 0x9A9F, 0x9AA1, 0x3847,
- 0x9AA2, 0x9AA2, 0x210F, 0x9AA3, 0x9AA3, 0x1FDB, 0x9AA4, 0x9AA9, 0x384A,
- 0x9AAA, 0x9AAA, 0x20AF, 0x9AAB, 0x9ACF, 0x3850, 0x9AD0, 0x9AD0, 0x24C0,
- 0x9AD1, 0x9AD5, 0x3875, 0x9AD6, 0x9AD6, 0x226D, 0x9AD7, 0x9AD9, 0x387A,
- 0x9ADA, 0x9ADA, 0x24C1, 0x9ADB, 0x9AE1, 0x387D, 0x9AE2, 0x9AE2, 0x20CA,
- 0x9AE3, 0x9AE3, 0x3884, 0x9AE4, 0x9AE4, 0x20E7, 0x9AE5, 0x9AE5, 0x24C2,
- 0x9AE6, 0x9AFE, 0x3885, 0x9B40, 0x9B7E, 0x389E, 0x9B80, 0x9BD0, 0x38DD,
- 0x9BD1, 0x9BD1, 0x23DC, 0x9BD2, 0x9BDB, 0x392E, 0x9BDC, 0x9BDC, 0x23DB,
- 0x9BDD, 0x9BFE, 0x3938, 0x9C40, 0x9C52, 0x395A, 0x9C53, 0x9C53, 0x205E,
- 0x9C54, 0x9C58, 0x396D, 0x9C59, 0x9C59, 0x2244, 0x9C5A, 0x9C5A, 0x23E2,
- 0x9C5B, 0x9C5B, 0x3972, 0x9C5C, 0x9C5C, 0x20D4, 0x9C5D, 0x9C74, 0x3973,
- 0x9C75, 0x9C75, 0x219F, 0x9C76, 0x9C78, 0x398B, 0x9C79, 0x9C79, 0x1E66,
- 0x9C7A, 0x9C7E, 0x398E, 0x9C80, 0x9C85, 0x3993, 0x9C86, 0x9C86, 0x1F63,
- 0x9C87, 0x9C9C, 0x3999, 0x9C9D, 0x9C9D, 0x23DD, 0x9C9E, 0x9CAA, 0x39AF,
- 0x9CAB, 0x9CAB, 0x216B, 0x9CAC, 0x9CC9, 0x39BC, 0x9CCA, 0x9CCA, 0x22B5,
- 0x9CCB, 0x9CCE, 0x39DA, 0x9CCF, 0x9CCF, 0x1F26, 0x9CD0, 0x9CE5, 0x39DE,
- 0x9CE6, 0x9CE6, 0x1E63, 0x9CE7, 0x9CE7, 0x2088, 0x9CE8, 0x9CEB, 0x39F4,
- 0x9CEC, 0x9CEC, 0x1EBD, 0x9CED, 0x9CED, 0x39F8, 0x9CEE, 0x9CEE, 0x2341,
- 0x9CEF, 0x9CFA, 0x39F9, 0x9CFB, 0x9CFB, 0x1F4B, 0x9CFC, 0x9CFD, 0x3A05,
- 0x9CFE, 0x9CFE, 0x2292, 0x9D40, 0x9D41, 0x3A07, 0x9D42, 0x9D42, 0x2124,
- 0x9D43, 0x9D45, 0x3A09, 0x9D46, 0x9D46, 0x2048, 0x9D47, 0x9D47, 0x23E0,
- 0x9D48, 0x9D4C, 0x3A0C, 0x9D4D, 0x9D4D, 0x2077, 0x9D4E, 0x9D4E, 0x3A11,
- 0x9D4F, 0x9D4F, 0x223A, 0x9D50, 0x9D60, 0x3A12, 0x9D61, 0x9D61, 0x20B1,
- 0x9D62, 0x9D67, 0x3A23, 0x9D68, 0x9D68, 0x1F41, 0x9D69, 0x9D69, 0x201C,
- 0x9D6A, 0x9D6D, 0x3A29, 0x9D6E, 0x9D6E, 0x22B8, 0x9D6F, 0x9D70, 0x3A2D,
- 0x9D71, 0x9D71, 0x2276, 0x9D72, 0x9D74, 0x3A2F, 0x9D75, 0x9D75, 0x1F9B,
- 0x9D76, 0x9D7A, 0x3A32, 0x9D7B, 0x9D7B, 0x1F9F, 0x9D7C, 0x9D7C, 0x3A37,
- 0x9D7D, 0x9D7D, 0x25CA, 0x9D7E, 0x9D7E, 0x3A38, 0x9D80, 0x9D89, 0x3A39,
- 0x9D8A, 0x9D8A, 0x20BE, 0x9D8B, 0x9D8C, 0x3A43, 0x9D8D, 0x9D8D, 0x1FB4,
- 0x9D8E, 0x9D90, 0x3A45, 0x9D91, 0x9D91, 0x23D7, 0x9D92, 0x9D98, 0x3A48,
- 0x9D99, 0x9D99, 0x2105, 0x9D9A, 0x9DA0, 0x3A4F, 0x9DA1, 0x9DA1, 0x23E1,
- 0x9DA2, 0x9DA2, 0x1FEC, 0x9DA3, 0x9DA6, 0x3A56, 0x9DA7, 0x9DA7, 0x23EA,
- 0x9DA8, 0x9DAB, 0x3A5A, 0x9DAC, 0x9DAC, 0x23E3, 0x9DAD, 0x9DAD, 0x210E,
- 0x9DAE, 0x9DB1, 0x3A5E, 0x9DB2, 0x9DB2, 0x1FA6, 0x9DB3, 0x9DB3, 0x2004,
- 0x9DB4, 0x9DBD, 0x3A62, 0x9DBE, 0x9DBE, 0x1F9D, 0x9DBF, 0x9DC5, 0x3A6C,
- 0x9DC6, 0x9DC6, 0x23E5, 0x9DC7, 0x9DC8, 0x3A73, 0x9DC9, 0x9DC9, 0x2264,
- 0x9DCA, 0x9DCC, 0x3A75, 0x9DCD, 0x9DCD, 0x24E2, 0x9DCE, 0x9DD1, 0x3A78,
- 0x9DD2, 0x9DD2, 0x23DE, 0x9DD3, 0x9DD4, 0x3A7C, 0x9DD5, 0x9DD5, 0x1EC4,
- 0x9DD6, 0x9DE0, 0x3A7E, 0x9DE1, 0x9DE1, 0x22B6, 0x9DE2, 0x9DE2, 0x20A9,
- 0x9DE3, 0x9DF0, 0x3A89, 0x9DF1, 0x9DF1, 0x212B, 0x9DF2, 0x9DF3, 0x3A97,
- 0x9DF4, 0x9DF4, 0x20A5, 0x9DF5, 0x9DF6, 0x3A99, 0x9DF7, 0x9DF7, 0x268B,
- 0x9DF8, 0x9DF9, 0x3A9B, 0x9DFA, 0x9DFA, 0x1F76, 0x9DFB, 0x9DFC, 0x3A9D,
- 0x9DFD, 0x9DFD, 0x216D, 0x9DFE, 0x9DFE, 0x3A9F, 0x9E40, 0x9E44, 0x3AA0,
- 0x9E45, 0x9E45, 0x2001, 0x9E46, 0x9E47, 0x3AA5, 0x9E48, 0x9E48, 0x2191,
- 0x9E49, 0x9E49, 0x1E50, 0x9E4A, 0x9E51, 0x3AA7, 0x9E52, 0x9E52, 0x1F9C,
- 0x9E53, 0x9E53, 0x3AAF, 0x9E54, 0x9E54, 0x23DA, 0x9E55, 0x9E55, 0x3AB0,
- 0x9E56, 0x9E56, 0x2053, 0x9E57, 0x9E5C, 0x3AB1, 0x9E5D, 0x9E5D, 0x23E9,
- 0x9E5E, 0x9E5E, 0x23E4, 0x9E5F, 0x9E60, 0x3AB7, 0x9E61, 0x9E61, 0x21D5,
- 0x9E62, 0x9E62, 0x3AB9, 0x9E63, 0x9E63, 0x23E6, 0x9E64, 0x9E66, 0x3ABA,
- 0x9E67, 0x9E67, 0x23DF, 0x9E68, 0x9E6B, 0x3ABD, 0x9E6C, 0x9E6C, 0x1E4F,
- 0x9E6D, 0x9E6E, 0x3AC1, 0x9E6F, 0x9E6F, 0x23D9, 0x9E70, 0x9E71, 0x3AC3,
- 0x9E72, 0x9E72, 0x2014, 0x9E73, 0x9E73, 0x3AC5, 0x9E74, 0x9E74, 0x23EC,
- 0x9E75, 0x9E75, 0x23EB, 0x9E76, 0x9E7A, 0x3AC6, 0x9E7B, 0x9E7B, 0x23D8,
- 0x9E7C, 0x9E7C, 0x23EE, 0x9E7D, 0x9E7E, 0x3ACB, 0x9E80, 0x9E84, 0x3ACD,
- 0x9E85, 0x9E85, 0x268E, 0x9E86, 0x9E86, 0x3AD2, 0x9E87, 0x9E87, 0x23ED,
- 0x9E88, 0x9E90, 0x3AD3, 0x9E91, 0x9E91, 0x1FFA, 0x9E92, 0x9E95, 0x3ADC,
- 0x9E96, 0x9E96, 0x23D6, 0x9E97, 0x9E97, 0x23E8, 0x9E98, 0x9EA1, 0x3AE0,
- 0x9EA2, 0x9EA2, 0x2106, 0x9EA3, 0x9EA5, 0x3AEA, 0x9EA6, 0x9EA6, 0x200B,
- 0x9EA7, 0x9EA8, 0x3AED, 0x9EA9, 0x9EA9, 0x2166, 0x9EAA, 0x9EAD, 0x3AEF,
- 0x9EAE, 0x9EAE, 0x23EF, 0x9EAF, 0x9EB2, 0x3AF3, 0x9EB3, 0x9EB3, 0x2189,
- 0x9EB4, 0x9EB4, 0x2058, 0x9EB5, 0x9EB6, 0x3AF7, 0x9EB7, 0x9EB7, 0x23E7,
- 0x9EB8, 0x9EF4, 0x3AF9, 0x9EF5, 0x9EF5, 0x21A3, 0x9EF6, 0x9EFE, 0x3B36,
- 0x9F40, 0x9F4D, 0x3B3F, 0x9F4E, 0x9F4E, 0x217A, 0x9F4F, 0x9F6E, 0x3B4D,
- 0x9F6F, 0x9F6F, 0x21A5, 0x9F70, 0x9F7E, 0x3B6D, 0x9F80, 0x9F91, 0x3B7C,
- 0x9F92, 0x9F92, 0x2022, 0x9F93, 0x9F97, 0x3B8E, 0x9F98, 0x9F98, 0x24D6,
- 0x9F99, 0x9FA5, 0x3B93, 0x9FA6, 0x9FA6, 0x233A, 0x9FA7, 0x9FA8, 0x3BA0,
- 0x9FA9, 0x9FA9, 0x1EEE, 0x9FAA, 0x9FAB, 0x3BA2, 0x9FAC, 0x9FAC, 0x24D5,
- 0x9FAD, 0x9FC8, 0x3BA4, 0x9FC9, 0x9FC9, 0x2228, 0x9FCA, 0x9FCC, 0x3BC0,
- 0x9FCD, 0x9FCD, 0x24D7, 0x9FCE, 0x9FE0, 0x3BC3, 0x9FE1, 0x9FE1, 0x20FC,
- 0x9FE2, 0x9FEA, 0x3BD6, 0x9FEB, 0x9FEB, 0x1E87, 0x9FEC, 0x9FED, 0x3BDF,
- 0x9FEE, 0x9FEE, 0x24D8, 0x9FEF, 0x9FF3, 0x3BE1, 0x9FF4, 0x9FF4, 0x1EBA,
- 0x9FF5, 0x9FFC, 0x3BE6, 0x9FFD, 0x9FFD, 0x2119, 0x9FFE, 0x9FFE, 0x3BEE,
- 0xA040, 0xA042, 0x3BEF, 0xA043, 0xA043, 0x216C, 0xA044, 0xA045, 0x3BF2,
- 0xA046, 0xA046, 0x24D9, 0xA047, 0xA048, 0x3BF4, 0xA049, 0xA049, 0x2227,
- 0xA04A, 0xA04D, 0x3BF6, 0xA04E, 0xA04E, 0x1E5F, 0xA04F, 0xA053, 0x3BFA,
- 0xA054, 0xA054, 0x229F, 0xA055, 0xA059, 0x3BFF, 0xA05A, 0xA05A, 0x1F5D,
- 0xA05B, 0xA060, 0x3C04, 0xA061, 0xA061, 0x1FBC, 0xA062, 0xA062, 0x3C0A,
- 0xA063, 0xA063, 0x24DA, 0xA064, 0xA070, 0x3C0B, 0xA071, 0xA071, 0x2149,
- 0xA072, 0xA073, 0x3C18, 0xA074, 0xA074, 0x2046, 0xA075, 0xA07E, 0x3C1A,
- 0xA080, 0xA080, 0x2000, 0xA081, 0xA090, 0x3C24, 0xA091, 0xA091, 0x2190,
- 0xA092, 0xA093, 0x3C34, 0xA094, 0xA094, 0x2208, 0xA095, 0xA095, 0x3C36,
- 0xA096, 0xA096, 0x1EE6, 0xA097, 0xA0A8, 0x3C37, 0xA0A9, 0xA0A9, 0x24C3,
- 0xA0AA, 0xA0BE, 0x3C49, 0xA0BF, 0xA0BF, 0x20CC, 0xA0C0, 0xA0CD, 0x3C5E,
- 0xA0CE, 0xA0CE, 0x2340, 0xA0CF, 0xA0D8, 0x3C6C, 0xA0D9, 0xA0D9, 0x1ED1,
- 0xA0DA, 0xA0DD, 0x3C76, 0xA0DE, 0xA0DE, 0x21AC, 0xA0DF, 0xA0ED, 0x3C7A,
- 0xA0EE, 0xA0EE, 0x22AF, 0xA0EF, 0xA0FE, 0x3C89, 0xA1A1, 0xA1FE, 0x0060,
- 0xA2A1, 0xA2AA, 0x26A9, 0xA2B1, 0xA2E2, 0x00BE, 0xA2E5, 0xA2EE, 0x00F0,
- 0xA2F1, 0xA2FC, 0x00FA, 0xA3A1, 0xA3FE, 0x0106, 0xA4A1, 0xA4F3, 0x0164,
- 0xA5A1, 0xA5F6, 0x01B7, 0xA6A1, 0xA6B8, 0x020D, 0xA6C1, 0xA6F5, 0x0225,
- 0xA7A1, 0xA7C1, 0x025A, 0xA7D1, 0xA7F1, 0x027B, 0xA840, 0xA87E, 0x26B3,
- 0xA880, 0xA895, 0x26F2, 0xA8A1, 0xA8C0, 0x029C, 0xA8C5, 0xA8EA, 0x02BC,
- 0xA940, 0xA957, 0x2708, 0xA959, 0xA95A, 0x2720, 0xA95C, 0xA95C, 0x2722,
- 0xA960, 0xA97E, 0x2723, 0xA980, 0xA995, 0x2742, 0xA996, 0xA996, 0x1E17,
- 0xA9A4, 0xA9EF, 0x02E2, 0xAA40, 0xAA4C, 0x3C99, 0xAA4D, 0xAA4D, 0x21B6,
- 0xAA4E, 0xAA4E, 0x1E3D, 0xAA4F, 0xAA70, 0x3CA6, 0xAA71, 0xAA71, 0x2235,
- 0xAA72, 0xAA72, 0x3CC8, 0xAA73, 0xAA73, 0x2397, 0xAA74, 0xAA76, 0x3CC9,
- 0xAA77, 0xAA77, 0x2395, 0xAA78, 0xAA79, 0x3CCC, 0xAA7A, 0xAA7A, 0x223F,
- 0xAA7B, 0xAA7B, 0x212A, 0xAA7C, 0xAA7E, 0x3CCE, 0xAA80, 0xAA99, 0x3CD1,
- 0xAA9A, 0xAA9A, 0x1ED2, 0xAA9B, 0xAA9B, 0x3CEB, 0xAA9C, 0xAA9C, 0x2396,
- 0xAA9D, 0xAA9D, 0x2398, 0xAA9E, 0xAA9E, 0x3CEC, 0xAA9F, 0xAA9F, 0x20A2,
- 0xAAA0, 0xAAA0, 0x3CED, 0xAAA1, 0xAAFE, 0x032E, 0xAB40, 0xAB40, 0x1F64,
- 0xAB41, 0xAB42, 0x3CEE, 0xAB43, 0xAB43, 0x202B, 0xAB44, 0xAB44, 0x3CF0,
- 0xAB45, 0xAB45, 0x2394, 0xAB46, 0xAB46, 0x2139, 0xAB47, 0xAB47, 0x3CF1,
- 0xAB48, 0xAB48, 0x215F, 0xAB49, 0xAB49, 0x21C1, 0xAB4A, 0xAB4A, 0x239A,
- 0xAB4B, 0xAB4C, 0x3CF2, 0xAB4D, 0xAB4D, 0x2399, 0xAB4E, 0xAB7E, 0x3CF4,
- 0xAB80, 0xABA0, 0x3D25, 0xABA1, 0xABC0, 0x038C, 0xAC40, 0xAC45, 0x3D46,
- 0xAC46, 0xAC46, 0x21C0, 0xAC47, 0xAC70, 0x3D4C, 0xAC71, 0xAC71, 0x2460,
- 0xAC72, 0xAC7B, 0x3D76, 0xAC7C, 0xAC7C, 0x245C, 0xAC7D, 0xAC7E, 0x3D80,
- 0xAC80, 0xAC8C, 0x3D82, 0xAC8D, 0xAC8D, 0x215D, 0xAC8E, 0xAC92, 0x3D8F,
- 0xAC93, 0xAC93, 0x2225, 0xAC94, 0xAC94, 0x206A, 0xAC95, 0xACA0, 0x3D94,
- 0xAD40, 0xAD48, 0x3DA0, 0xAD49, 0xAD49, 0x2461, 0xAD4A, 0xAD5D, 0x3DA9,
- 0xAD5E, 0xAD5E, 0x245B, 0xAD5F, 0xAD60, 0x3DBD, 0xAD61, 0xAD61, 0x2462,
- 0xAD62, 0xAD67, 0x3DBF, 0xAD68, 0xAD68, 0x1F54, 0xAD69, 0xAD73, 0x3DC5,
- 0xAD74, 0xAD74, 0x245F, 0xAD75, 0xAD7E, 0x3DD0, 0xAD80, 0xAD81, 0x3DDA,
- 0xAD82, 0xAD82, 0x20EC, 0xAD83, 0xAD86, 0x3DDC, 0xAD87, 0xAD87, 0x245D,
- 0xAD88, 0xAD8A, 0x3DE0, 0xAD8B, 0xAD8B, 0x2463, 0xAD8C, 0xAD90, 0x3DE3,
- 0xAD91, 0xAD91, 0x2464, 0xAD92, 0xADA0, 0x3DE8, 0xAE40, 0xAE53, 0x3DF7,
- 0xAE54, 0xAE54, 0x24A5, 0xAE55, 0xAE61, 0x3E0B, 0xAE62, 0xAE62, 0x1E70,
- 0xAE63, 0xAE7E, 0x3E18, 0xAE80, 0xAE80, 0x208F, 0xAE81, 0xAE84, 0x3E34,
- 0xAE85, 0xAE85, 0x1E42, 0xAE86, 0xAE8A, 0x3E38, 0xAE8B, 0xAE8B, 0x1F4E,
- 0xAE8C, 0xAE93, 0x3E3D, 0xAE94, 0xAE94, 0x1EB1, 0xAE95, 0xAE9F, 0x3E45,
- 0xAEA0, 0xAEA0, 0x1E8B, 0xAF40, 0xAF63, 0x3E50, 0xAF64, 0xAF64, 0x1FC6,
- 0xAF65, 0xAF7A, 0x3E74, 0xAF7B, 0xAF7B, 0x25AE, 0xAF7C, 0xAF7E, 0x3E8A,
- 0xAF80, 0xAF81, 0x3E8D, 0xAF82, 0xAF82, 0x1F01, 0xAF83, 0xAF83, 0x2200,
- 0xAF84, 0xAF8D, 0x3E8F, 0xAF8E, 0xAF8E, 0x25B2, 0xAF8F, 0xAF8F, 0x1E97,
- 0xAF90, 0xAF90, 0x3E99, 0xAF91, 0xAF91, 0x20AB, 0xAF92, 0xAF9B, 0x3E9A,
- 0xAF9C, 0xAF9C, 0x25B3, 0xAF9D, 0xAF9E, 0x3EA4, 0xAF9F, 0xAF9F, 0x2028,
- 0xAFA0, 0xAFA0, 0x3EA6, 0xB040, 0xB040, 0x3EA7, 0xB041, 0xB042, 0x25AF,
- 0xB043, 0xB043, 0x3EA8, 0xB044, 0xB044, 0x25B1, 0xB045, 0xB04E, 0x3EA9,
- 0xB04F, 0xB04F, 0x25AC, 0xB050, 0xB053, 0x3EB3, 0xB054, 0xB054, 0x1E4E,
- 0xB055, 0xB056, 0x3EB7, 0xB057, 0xB057, 0x2202, 0xB058, 0xB058, 0x25AB,
- 0xB059, 0xB059, 0x2286, 0xB05A, 0xB05A, 0x3EB9, 0xB05B, 0xB05B, 0x25AD,
- 0xB05C, 0xB05C, 0x3EBA, 0xB05D, 0xB05D, 0x25B6, 0xB05E, 0xB05E, 0x3EBB,
- 0xB05F, 0xB05F, 0x21E3, 0xB060, 0xB061, 0x25B4, 0xB062, 0xB062, 0x222F,
- 0xB063, 0xB063, 0x2165, 0xB064, 0xB064, 0x25B7, 0xB065, 0xB06B, 0x3EBC,
- 0xB06C, 0xB06C, 0x1EE9, 0xB06D, 0xB07C, 0x3EC3, 0xB07D, 0xB07D, 0x1E25,
- 0xB07E, 0xB07E, 0x3ED3, 0xB080, 0xB096, 0x3ED4, 0xB097, 0xB097, 0x25C0,
- 0xB098, 0xB098, 0x3EEB, 0xB099, 0xB099, 0x229A, 0xB09A, 0xB0A0, 0x3EEC,
- 0xB0A1, 0xB0FE, 0x03AC, 0xB140, 0xB14A, 0x3EF3, 0xB14B, 0xB14B, 0x226E,
- 0xB14C, 0xB14C, 0x3EFE, 0xB14D, 0xB14D, 0x1FBD, 0xB14E, 0xB14E, 0x3EFF,
- 0xB14F, 0xB14F, 0x1F84, 0xB150, 0xB150, 0x20B2, 0xB151, 0xB151, 0x3F00,
- 0xB152, 0xB152, 0x2043, 0xB153, 0xB17E, 0x3F01, 0xB180, 0xB196, 0x3F2D,
- 0xB197, 0xB197, 0x2684, 0xB198, 0xB1A0, 0x3F44, 0xB1A1, 0xB1FE, 0x040A,
- 0xB240, 0xB240, 0x3F4D, 0xB241, 0xB241, 0x24EF, 0xB242, 0xB266, 0x3F4E,
- 0xB267, 0xB267, 0x24EE, 0xB268, 0xB26C, 0x3F73, 0xB26D, 0xB26D, 0x2074,
- 0xB26E, 0xB273, 0x3F78, 0xB274, 0xB274, 0x2687, 0xB275, 0xB27E, 0x3F7E,
- 0xB280, 0xB280, 0x24F0, 0xB281, 0xB288, 0x3F88, 0xB289, 0xB289, 0x268D,
- 0xB28A, 0xB299, 0x3F90, 0xB29A, 0xB29A, 0x22A0, 0xB29B, 0xB2A0, 0x3FA0,
- 0xB2A1, 0xB2FE, 0x0468, 0xB340, 0xB342, 0x3FA6, 0xB343, 0xB343, 0x1FAB,
- 0xB344, 0xB36F, 0x3FA9, 0xB370, 0xB370, 0x26A8, 0xB371, 0xB37E, 0x3FD5,
- 0xB380, 0xB387, 0x3FE3, 0xB388, 0xB388, 0x24E9, 0xB389, 0xB38B, 0x3FEB,
- 0xB38C, 0xB38C, 0x24E5, 0xB38D, 0xB38D, 0x3FEE, 0xB38E, 0xB38E, 0x21FA,
- 0xB38F, 0xB3A0, 0x3FEF, 0xB3A1, 0xB3FE, 0x04C6, 0xB440, 0xB453, 0x4001,
- 0xB454, 0xB454, 0x2148, 0xB455, 0xB457, 0x4015, 0xB458, 0xB458, 0x24E4,
- 0xB459, 0xB45D, 0x4018, 0xB45E, 0xB45E, 0x24E6, 0xB45F, 0xB45F, 0x20F7,
- 0xB460, 0xB460, 0x401D, 0xB461, 0xB461, 0x206B, 0xB462, 0xB474, 0x401E,
- 0xB475, 0xB475, 0x22A7, 0xB476, 0xB47D, 0x4031, 0xB47E, 0xB47E, 0x24EC,
- 0xB480, 0xB482, 0x4039, 0xB483, 0xB483, 0x24EB, 0xB484, 0xB488, 0x403C,
- 0xB489, 0xB489, 0x24E3, 0xB48A, 0xB492, 0x4041, 0xB493, 0xB493, 0x24EA,
- 0xB494, 0xB4A0, 0x404A, 0xB4A1, 0xB4FE, 0x0524, 0xB540, 0xB540, 0x4057,
- 0xB541, 0xB541, 0x1E92, 0xB542, 0xB54A, 0x4058, 0xB54B, 0xB54B, 0x1E27,
- 0xB54C, 0xB555, 0x4061, 0xB556, 0xB556, 0x1FE6, 0xB557, 0xB559, 0x406B,
- 0xB55A, 0xB55A, 0x24E7, 0xB55B, 0xB55B, 0x2012, 0xB55C, 0xB55C, 0x1EEC,
- 0xB55D, 0xB560, 0x406E, 0xB561, 0xB561, 0x24E8, 0xB562, 0xB57E, 0x4072,
- 0xB580, 0xB59B, 0x408F, 0xB59C, 0xB59C, 0x1F66, 0xB59D, 0xB59D, 0x24DC,
- 0xB59E, 0xB5A0, 0x40AB, 0xB5A1, 0xB5FE, 0x0582, 0xB640, 0xB651, 0x40AE,
- 0xB652, 0xB652, 0x26A2, 0xB653, 0xB654, 0x40C0, 0xB655, 0xB655, 0x24DD,
- 0xB656, 0xB658, 0x40C2, 0xB659, 0xB659, 0x200E, 0xB65A, 0xB65A, 0x40C5,
- 0xB65B, 0xB65B, 0x24DB, 0xB65C, 0xB65C, 0x1EB8, 0xB65D, 0xB67E, 0x40C6,
- 0xB680, 0xB6A0, 0x40E8, 0xB6A1, 0xB6FE, 0x05E0, 0xB740, 0xB74D, 0x4109,
- 0xB74E, 0xB74E, 0x2295, 0xB74F, 0xB750, 0x4117, 0xB751, 0xB751, 0x1E80,
- 0xB752, 0xB758, 0x4119, 0xB759, 0xB759, 0x2677, 0xB75A, 0xB763, 0x4120,
- 0xB764, 0xB764, 0x2624, 0xB765, 0xB765, 0x1F69, 0xB766, 0xB766, 0x222B,
- 0xB767, 0xB776, 0x412A, 0xB777, 0xB777, 0x257F, 0xB778, 0xB778, 0x1F5B,
- 0xB779, 0xB77E, 0x413A, 0xB780, 0xB780, 0x219B, 0xB781, 0xB781, 0x4140,
- 0xB782, 0xB782, 0x267D, 0xB783, 0xB7A0, 0x4141, 0xB7A1, 0xB7FE, 0x063E,
- 0xB840, 0xB842, 0x415F, 0xB843, 0xB843, 0x21A0, 0xB844, 0xB844, 0x2186,
- 0xB845, 0xB845, 0x4162, 0xB846, 0xB846, 0x20ED, 0xB847, 0xB84C, 0x4163,
- 0xB84D, 0xB84D, 0x25B9, 0xB84E, 0xB850, 0x4169, 0xB851, 0xB851, 0x1FEA,
- 0xB852, 0xB859, 0x416C, 0xB85A, 0xB85A, 0x1EA4, 0xB85B, 0xB85B, 0x20E1,
- 0xB85C, 0xB85C, 0x4174, 0xB85D, 0xB85D, 0x25B8, 0xB85E, 0xB85E, 0x2260,
- 0xB85F, 0xB85F, 0x4175, 0xB860, 0xB860, 0x20E2, 0xB861, 0xB876, 0x4176,
- 0xB877, 0xB877, 0x2141, 0xB878, 0xB87E, 0x418C, 0xB880, 0xB881, 0x4193,
- 0xB882, 0xB882, 0x1FC7, 0xB883, 0xB8A0, 0x4195, 0xB8A1, 0xB8FE, 0x069C,
- 0xB940, 0xB94F, 0x41B3, 0xB950, 0xB950, 0x1E41, 0xB951, 0xB960, 0x41C3,
- 0xB961, 0xB961, 0x25E4, 0xB962, 0xB97A, 0x41D3, 0xB97B, 0xB97B, 0x1F86,
- 0xB97C, 0xB97E, 0x41EC, 0xB980, 0xB99C, 0x41EF, 0xB99D, 0xB99D, 0x1FB3,
- 0xB99E, 0xB99F, 0x420C, 0xB9A0, 0xB9A0, 0x1EEF, 0xB9A1, 0xB9FE, 0x06FA,
- 0xBA40, 0xBA41, 0x420E, 0xBA42, 0xBA42, 0x22A4, 0xBA43, 0xBA43, 0x4210,
- 0xBA44, 0xBA44, 0x25E8, 0xBA45, 0xBA55, 0x4211, 0xBA56, 0xBA56, 0x25E3,
- 0xBA57, 0xBA58, 0x4222, 0xBA59, 0xBA59, 0x2111, 0xBA5A, 0xBA5F, 0x4224,
- 0xBA60, 0xBA60, 0x25E6, 0xBA61, 0xBA69, 0x422A, 0xBA6A, 0xBA6A, 0x25E7,
- 0xBA6B, 0xBA73, 0x4233, 0xBA74, 0xBA74, 0x2041, 0xBA75, 0xBA7E, 0x423C,
- 0xBA80, 0xBA83, 0x4246, 0xBA84, 0xBA84, 0x25EA, 0xBA85, 0xBA85, 0x424A,
- 0xBA86, 0xBA86, 0x1F8F, 0xBA87, 0xBA87, 0x424B, 0xBA88, 0xBA88, 0x25EC,
- 0xBA89, 0xBA8C, 0x424C, 0xBA8D, 0xBA8D, 0x25EB, 0xBA8E, 0xBA9D, 0x4250,
- 0xBA9E, 0xBA9E, 0x20D0, 0xBA9F, 0xBA9F, 0x201D, 0xBAA0, 0xBAA0, 0x4260,
- 0xBAA1, 0xBAFE, 0x0758, 0xBB40, 0xBB40, 0x1FF7, 0xBB41, 0xBB48, 0x4261,
- 0xBB49, 0xBB49, 0x1E8D, 0xBB4A, 0xBB57, 0x4269, 0xBB58, 0xBB58, 0x25E9,
- 0xBB59, 0xBB5A, 0x4277, 0xBB5B, 0xBB5B, 0x25EE, 0xBB5C, 0xBB5C, 0x203A,
- 0xBB5D, 0xBB5F, 0x4279, 0xBB60, 0xBB60, 0x2693, 0xBB61, 0xBB64, 0x427C,
- 0xBB65, 0xBB65, 0x25E5, 0xBB66, 0xBB66, 0x25ED, 0xBB67, 0xBB67, 0x4280,
- 0xBB68, 0xBB68, 0x2009, 0xBB69, 0xBB69, 0x4281, 0xBB6A, 0xBB6A, 0x2065,
- 0xBB6B, 0xBB6D, 0x4282, 0xBB6E, 0xBB6E, 0x26A3, 0xBB6F, 0xBB7E, 0x4285,
- 0xBB80, 0xBBA0, 0x4295, 0xBBA1, 0xBBFE, 0x07B6, 0xBC40, 0xBC51, 0x42B6,
- 0xBC52, 0xBC52, 0x25F5, 0xBC53, 0xBC53, 0x1EFC, 0xBC54, 0xBC59, 0x42C8,
- 0xBC5A, 0xBC5A, 0x2024, 0xBC5B, 0xBC60, 0x42CE, 0xBC61, 0xBC61, 0x269B,
- 0xBC62, 0xBC62, 0x42D4, 0xBC63, 0xBC63, 0x25F3, 0xBC64, 0xBC64, 0x42D5,
- 0xBC65, 0xBC65, 0x22D9, 0xBC66, 0xBC66, 0x42D6, 0xBC67, 0xBC67, 0x25F4,
- 0xBC68, 0xBC68, 0x42D7, 0xBC69, 0xBC69, 0x241B, 0xBC6A, 0xBC6C, 0x42D8,
- 0xBC6D, 0xBC6D, 0x1FC8, 0xBC6E, 0xBC6E, 0x42DB, 0xBC6F, 0xBC6F, 0x1F7B,
- 0xBC70, 0xBC70, 0x42DC, 0xBC71, 0xBC71, 0x241D, 0xBC72, 0xBC72, 0x42DD,
- 0xBC73, 0xBC73, 0x224C, 0xBC74, 0xBC74, 0x1F48, 0xBC75, 0xBC75, 0x241C,
- 0xBC76, 0xBC77, 0x241E, 0xBC78, 0xBC78, 0x20FF, 0xBC79, 0xBC79, 0x219A,
- 0xBC7A, 0xBC7A, 0x42DE, 0xBC7B, 0xBC7B, 0x2091, 0xBC7C, 0xBC7D, 0x42DF,
- 0xBC7E, 0xBC7E, 0x20A7, 0xBC80, 0xBC81, 0x42E1, 0xBC82, 0xBC82, 0x2423,
- 0xBC83, 0xBC83, 0x1E9B, 0xBC84, 0xBC84, 0x2422, 0xBC85, 0xBC85, 0x42E3,
- 0xBC86, 0xBC86, 0x2110, 0xBC87, 0xBC87, 0x42E4, 0xBC88, 0xBC88, 0x228D,
- 0xBC89, 0xBC89, 0x1F71, 0xBC8A, 0xBC8A, 0x1EF8, 0xBC8B, 0xBC8B, 0x2421,
- 0xBC8C, 0xBC8E, 0x42E5, 0xBC8F, 0xBC8F, 0x1EF3, 0xBC90, 0xBC99, 0x42E8,
- 0xBC9A, 0xBC9A, 0x21B1, 0xBC9B, 0xBC9B, 0x2426, 0xBC9C, 0xBC9C, 0x2425,
- 0xBC9D, 0xBC9D, 0x2120, 0xBC9E, 0xBCA0, 0x42F2, 0xBCA1, 0xBCFE, 0x0814,
- 0xBD40, 0xBD41, 0x42F5, 0xBD42, 0xBD42, 0x211A, 0xBD43, 0xBD43, 0x2424,
- 0xBD44, 0xBD44, 0x42F7, 0xBD45, 0xBD45, 0x2428, 0xBD46, 0xBD47, 0x42F8,
- 0xBD48, 0xBD48, 0x242A, 0xBD49, 0xBD49, 0x2429, 0xBD4A, 0xBD4A, 0x42FA,
- 0xBD4B, 0xBD4B, 0x2294, 0xBD4C, 0xBD4C, 0x42FB, 0xBD4D, 0xBD4D, 0x22BE,
- 0xBD4E, 0xBD4E, 0x42FC, 0xBD4F, 0xBD4F, 0x1E31, 0xBD50, 0xBD56, 0x42FD,
- 0xBD57, 0xBD57, 0x242C, 0xBD58, 0xBD58, 0x4304, 0xBD59, 0xBD59, 0x1FB5,
- 0xBD5A, 0xBD65, 0x4305, 0xBD66, 0xBD66, 0x242B, 0xBD67, 0xBD67, 0x1FAF,
- 0xBD68, 0xBD69, 0x4311, 0xBD6A, 0xBD6A, 0x2068, 0xBD6B, 0xBD6B, 0x21E4,
- 0xBD6C, 0xBD6E, 0x4313, 0xBD6F, 0xBD6F, 0x1F21, 0xBD70, 0xBD70, 0x4316,
- 0xBD71, 0xBD71, 0x2101, 0xBD72, 0xBD78, 0x4317, 0xBD79, 0xBD79, 0x217C,
- 0xBD7A, 0xBD7A, 0x214A, 0xBD7B, 0xBD7B, 0x242D, 0xBD7C, 0xBD7D, 0x431E,
- 0xBD7E, 0xBD7E, 0x1FD4, 0xBD80, 0xBD80, 0x4320, 0xBD81, 0xBD81, 0x1FD1,
- 0xBD82, 0xBD88, 0x4321, 0xBD89, 0xBD89, 0x1E33, 0xBD8A, 0xBD8A, 0x4328,
- 0xBD8B, 0xBD8B, 0x242F, 0xBD8C, 0xBD8D, 0x4329, 0xBD8E, 0xBD8E, 0x242E,
- 0xBD8F, 0xBD8F, 0x432B, 0xBD90, 0xBD90, 0x2430, 0xBD91, 0xBD91, 0x21DB,
- 0xBD92, 0xBD96, 0x432C, 0xBD97, 0xBD97, 0x2158, 0xBD98, 0xBD9A, 0x4331,
- 0xBD9B, 0xBD9B, 0x1FC2, 0xBD9C, 0xBDA0, 0x4334, 0xBDA1, 0xBDFE, 0x0872,
- 0xBE40, 0xBE42, 0x4339, 0xBE43, 0xBE43, 0x22B9, 0xBE44, 0xBE44, 0x433C,
- 0xBE45, 0xBE45, 0x2436, 0xBE46, 0xBE48, 0x433D, 0xBE49, 0xBE49, 0x1E8E,
- 0xBE4A, 0xBE4A, 0x2439, 0xBE4B, 0xBE50, 0x4340, 0xBE51, 0xBE51, 0x21C5,
- 0xBE52, 0xBE52, 0x2437, 0xBE53, 0xBE53, 0x2192, 0xBE54, 0xBE54, 0x4346,
- 0xBE55, 0xBE55, 0x243A, 0xBE56, 0xBE56, 0x1F19, 0xBE57, 0xBE57, 0x218C,
- 0xBE58, 0xBE58, 0x1E40, 0xBE59, 0xBE59, 0x22B3, 0xBE5A, 0xBE5C, 0x4347,
- 0xBE5D, 0xBE5D, 0x205F, 0xBE5E, 0xBE5E, 0x2438, 0xBE5F, 0xBE5F, 0x2432,
- 0xBE60, 0xBE60, 0x2274, 0xBE61, 0xBE61, 0x434A, 0xBE62, 0xBE62, 0x1E9C,
- 0xBE63, 0xBE63, 0x2431, 0xBE64, 0xBE64, 0x2085, 0xBE65, 0xBE68, 0x434B,
- 0xBE69, 0xBE69, 0x2435, 0xBE6A, 0xBE6B, 0x434F, 0xBE6C, 0xBE6C, 0x243B,
- 0xBE6D, 0xBE6E, 0x4351, 0xBE6F, 0xBE6F, 0x1FB7, 0xBE70, 0xBE70, 0x2433,
- 0xBE71, 0xBE75, 0x4353, 0xBE76, 0xBE76, 0x2054, 0xBE77, 0xBE77, 0x21DE,
- 0xBE78, 0xBE78, 0x4358, 0xBE79, 0xBE79, 0x2434, 0xBE7A, 0xBE7B, 0x4359,
- 0xBE7C, 0xBE7C, 0x243D, 0xBE7D, 0xBE7D, 0x1F89, 0xBE7E, 0xBE7E, 0x243C,
- 0xBE80, 0xBE82, 0x435B, 0xBE83, 0xBE83, 0x1F6E, 0xBE84, 0xBE84, 0x1ED8,
- 0xBE85, 0xBE85, 0x435E, 0xBE86, 0xBE86, 0x1EBF, 0xBE87, 0xBE87, 0x2445,
- 0xBE88, 0xBE88, 0x435F, 0xBE89, 0xBE89, 0x2249, 0xBE8A, 0xBE8B, 0x4360,
- 0xBE8C, 0xBE8C, 0x2441, 0xBE8D, 0xBE8D, 0x4362, 0xBE8E, 0xBE8E, 0x1E47,
- 0xBE8F, 0xBE8F, 0x1F56, 0xBE90, 0xBE91, 0x4363, 0xBE92, 0xBE92, 0x2086,
- 0xBE93, 0xBE94, 0x4365, 0xBE95, 0xBE95, 0x2196, 0xBE96, 0xBE96, 0x4367,
- 0xBE97, 0xBE97, 0x2443, 0xBE98, 0xBE98, 0x243F, 0xBE99, 0xBE99, 0x4368,
- 0xBE9A, 0xBE9A, 0x2023, 0xBE9B, 0xBE9B, 0x4369, 0xBE9C, 0xBE9C, 0x2442,
- 0xBE9D, 0xBE9E, 0x436A, 0xBE9F, 0xBE9F, 0x243E, 0xBEA0, 0xBEA0, 0x436C,
- 0xBEA1, 0xBEFE, 0x08D0, 0xBF40, 0xBF40, 0x26A6, 0xBF41, 0xBF4C, 0x436D,
- 0xBF4D, 0xBF4D, 0x234E, 0xBF4E, 0xBF4E, 0x2446, 0xBF4F, 0xBF4F, 0x244B,
- 0xBF50, 0xBF50, 0x2444, 0xBF51, 0xBF54, 0x4379, 0xBF55, 0xBF55, 0x2427,
- 0xBF56, 0xBF56, 0x244C, 0xBF57, 0xBF5F, 0x437D, 0xBF60, 0xBF60, 0x1F0F,
- 0xBF61, 0xBF61, 0x4386, 0xBF62, 0xBF62, 0x2447, 0xBF63, 0xBF63, 0x2449,
- 0xBF64, 0xBF64, 0x2448, 0xBF65, 0xBF67, 0x4387, 0xBF68, 0xBF68, 0x21C2,
- 0xBF69, 0xBF6B, 0x438A, 0xBF6C, 0xBF6C, 0x216E, 0xBF6D, 0xBF6F, 0x438D,
- 0xBF70, 0xBF70, 0x1F03, 0xBF71, 0xBF71, 0x4390, 0xBF72, 0xBF72, 0x244A,
- 0xBF73, 0xBF73, 0x215C, 0xBF74, 0xBF75, 0x4391, 0xBF76, 0xBF76, 0x22BB,
- 0xBF77, 0xBF77, 0x2450, 0xBF78, 0xBF78, 0x4393, 0xBF79, 0xBF79, 0x2694,
- 0xBF7A, 0xBF7A, 0x244F, 0xBF7B, 0xBF7B, 0x25F6, 0xBF7C, 0xBF7C, 0x2051,
- 0xBF7D, 0xBF7D, 0x4394, 0xBF7E, 0xBF7E, 0x244E, 0xBF80, 0xBF81, 0x4395,
- 0xBF82, 0xBF82, 0x22BA, 0xBF83, 0xBF83, 0x1F6D, 0xBF84, 0xBF88, 0x4397,
- 0xBF89, 0xBF89, 0x2452, 0xBF8A, 0xBF8A, 0x2451, 0xBF8B, 0xBF94, 0x439C,
- 0xBF95, 0xBF95, 0x2455, 0xBF96, 0xBF96, 0x43A6, 0xBF97, 0xBF97, 0x2289,
- 0xBF98, 0xBF98, 0x2116, 0xBF99, 0xBF9C, 0x43A7, 0xBF9D, 0xBF9D, 0x2454,
- 0xBF9E, 0xBFA0, 0x43AB, 0xBFA1, 0xBFFE, 0x092E, 0xC040, 0xC040, 0x20FB,
- 0xC041, 0xC043, 0x43AE, 0xC044, 0xC044, 0x2440, 0xC045, 0xC04A, 0x43B1,
- 0xC04B, 0xC04B, 0x2126, 0xC04C, 0xC04C, 0x1F61, 0xC04D, 0xC04D, 0x269D,
- 0xC04E, 0xC04E, 0x43B7, 0xC04F, 0xC04F, 0x1F8A, 0xC050, 0xC050, 0x2456,
- 0xC051, 0xC051, 0x2459, 0xC052, 0xC052, 0x2458, 0xC053, 0xC054, 0x43B8,
- 0xC055, 0xC055, 0x1FAE, 0xC056, 0xC05A, 0x43BA, 0xC05B, 0xC05B, 0x221A,
- 0xC05C, 0xC05D, 0x43BF, 0xC05E, 0xC05E, 0x1F7A, 0xC05F, 0xC05F, 0x244D,
- 0xC060, 0xC060, 0x2457, 0xC061, 0xC068, 0x43C1, 0xC069, 0xC069, 0x2453,
- 0xC06A, 0xC06A, 0x43C9, 0xC06B, 0xC06B, 0x2420, 0xC06C, 0xC06C, 0x43CA,
- 0xC06D, 0xC06D, 0x21DF, 0xC06E, 0xC06E, 0x2685, 0xC06F, 0xC06F, 0x43CB,
- 0xC070, 0xC070, 0x1E6E, 0xC071, 0xC073, 0x43CC, 0xC074, 0xC074, 0x2224,
- 0xC075, 0xC075, 0x2670, 0xC076, 0xC076, 0x43CF, 0xC077, 0xC077, 0x21BA,
- 0xC078, 0xC078, 0x43D0, 0xC079, 0xC079, 0x245A, 0xC07A, 0xC07B, 0x43D1,
- 0xC07C, 0xC07C, 0x1FFF, 0xC07D, 0xC07E, 0x43D3, 0xC080, 0xC09A, 0x43D5,
- 0xC09B, 0xC09B, 0x25E2, 0xC09C, 0xC09C, 0x43F0, 0xC09D, 0xC09D, 0x269A,
- 0xC09E, 0xC0A0, 0x43F1, 0xC0A1, 0xC0FE, 0x098C, 0xC140, 0xC14F, 0x43F4,
- 0xC150, 0xC150, 0x1EEA, 0xC151, 0xC153, 0x4404, 0xC154, 0xC154, 0x1E2C,
- 0xC155, 0xC15E, 0x4407, 0xC15F, 0xC15F, 0x2062, 0xC160, 0xC160, 0x24F1,
- 0xC161, 0xC161, 0x4411, 0xC162, 0xC162, 0x24F2, 0xC163, 0xC174, 0x4412,
- 0xC175, 0xC175, 0x25F2, 0xC176, 0xC177, 0x4424, 0xC178, 0xC178, 0x2215,
- 0xC179, 0xC17E, 0x4426, 0xC180, 0xC194, 0x442C, 0xC195, 0xC195, 0x21AE,
- 0xC196, 0xC1A0, 0x4441, 0xC1A1, 0xC1FE, 0x09EA, 0xC240, 0xC24D, 0x444C,
- 0xC24E, 0xC24E, 0x20E0, 0xC24F, 0xC264, 0x445A, 0xC265, 0xC265, 0x25C2,
- 0xC266, 0xC266, 0x4470, 0xC267, 0xC267, 0x25C1, 0xC268, 0xC27C, 0x4471,
- 0xC27D, 0xC27D, 0x2128, 0xC27E, 0xC27E, 0x4486, 0xC280, 0xC283, 0x4487,
- 0xC284, 0xC284, 0x2199, 0xC285, 0xC292, 0x448B, 0xC293, 0xC293, 0x2017,
- 0xC294, 0xC294, 0x1EA0, 0xC295, 0xC295, 0x2125, 0xC296, 0xC296, 0x214D,
- 0xC297, 0xC297, 0x4499, 0xC298, 0xC298, 0x25C4, 0xC299, 0xC299, 0x209D,
- 0xC29A, 0xC29A, 0x228A, 0xC29B, 0xC29B, 0x449A, 0xC29C, 0xC29C, 0x25C3,
- 0xC29D, 0xC29F, 0x449B, 0xC2A0, 0xC2A0, 0x2179, 0xC2A1, 0xC2FE, 0x0A48,
- 0xC340, 0xC340, 0x2038, 0xC341, 0xC342, 0x449E, 0xC343, 0xC343, 0x2155,
- 0xC344, 0xC37A, 0x44A0, 0xC37B, 0xC37B, 0x21D2, 0xC37C, 0xC37E, 0x44D7,
- 0xC380, 0xC383, 0x44DA, 0xC384, 0xC384, 0x24C7, 0xC385, 0xC39A, 0x44DE,
- 0xC39B, 0xC39B, 0x2279, 0xC39C, 0xC3A0, 0x44F4, 0xC3A1, 0xC3FE, 0x0AA6,
- 0xC440, 0xC448, 0x44F9, 0xC449, 0xC449, 0x2123, 0xC44A, 0xC44B, 0x4502,
- 0xC44C, 0xC44C, 0x24C5, 0xC44D, 0xC453, 0x4504, 0xC454, 0xC454, 0x24C9,
- 0xC455, 0xC457, 0x450B, 0xC458, 0xC458, 0x2094, 0xC459, 0xC45A, 0x450E,
- 0xC45B, 0xC45B, 0x2296, 0xC45C, 0xC462, 0x4510, 0xC463, 0xC463, 0x1E77,
- 0xC464, 0xC476, 0x4517, 0xC477, 0xC477, 0x1F06, 0xC478, 0xC479, 0x452A,
- 0xC47A, 0xC47A, 0x1FA5, 0xC47B, 0xC47E, 0x452C, 0xC480, 0xC480, 0x4530,
- 0xC481, 0xC481, 0x2099, 0xC482, 0xC490, 0x4531, 0xC491, 0xC491, 0x1EAD,
- 0xC492, 0xC492, 0x24C8, 0xC493, 0xC493, 0x20A8, 0xC494, 0xC497, 0x4540,
- 0xC498, 0xC498, 0x201F, 0xC499, 0xC499, 0x4544, 0xC49A, 0xC49A, 0x20C5,
- 0xC49B, 0xC49B, 0x4545, 0xC49C, 0xC49C, 0x24CA, 0xC49D, 0xC4A0, 0x4546,
- 0xC4A1, 0xC4FE, 0x0B04, 0xC540, 0xC543, 0x454A, 0xC544, 0xC544, 0x1FF0,
- 0xC545, 0xC545, 0x454E, 0xC546, 0xC546, 0x24C6, 0xC547, 0xC54A, 0x454F,
- 0xC54B, 0xC54B, 0x225D, 0xC54C, 0xC54C, 0x22DE, 0xC54D, 0xC551, 0x4553,
- 0xC552, 0xC552, 0x202C, 0xC553, 0xC55E, 0x4558, 0xC55F, 0xC55F, 0x2161,
- 0xC560, 0xC562, 0x4564, 0xC563, 0xC563, 0x223B, 0xC564, 0xC564, 0x21D9,
- 0xC565, 0xC565, 0x1FCB, 0xC566, 0xC566, 0x1FC9, 0xC567, 0xC57E, 0x4567,
- 0xC580, 0xC592, 0x457F, 0xC593, 0xC593, 0x1E61, 0xC594, 0xC59B, 0x4592,
- 0xC59C, 0xC59C, 0x25EF, 0xC59D, 0xC59D, 0x459A, 0xC59E, 0xC59E, 0x1F98,
- 0xC59F, 0xC5A0, 0x459B, 0xC5A1, 0xC5FE, 0x0B62, 0xC640, 0xC640, 0x459D,
- 0xC641, 0xC641, 0x25F0, 0xC642, 0xC643, 0x459E, 0xC644, 0xC644, 0x1F88,
- 0xC645, 0xC646, 0x45A0, 0xC647, 0xC647, 0x21F8, 0xC648, 0xC662, 0x45A2,
- 0xC663, 0xC663, 0x2322, 0xC664, 0xC671, 0x45BD, 0xC672, 0xC672, 0x2336,
- 0xC673, 0xC67E, 0x45CB, 0xC680, 0xC6A0, 0x45D7, 0xC6A1, 0xC6FE, 0x0BC0,
- 0xC740, 0xC765, 0x45F8, 0xC766, 0xC766, 0x22AB, 0xC767, 0xC76E, 0x461E,
- 0xC76F, 0xC76F, 0x1FBF, 0xC770, 0xC775, 0x4626, 0xC776, 0xC776, 0x1F7D,
- 0xC777, 0xC77A, 0x462C, 0xC77B, 0xC77B, 0x2333, 0xC77C, 0xC77E, 0x4630,
- 0xC780, 0xC7A0, 0x4633, 0xC7A1, 0xC7FE, 0x0C1E, 0xC840, 0xC840, 0x4654,
- 0xC841, 0xC841, 0x1F4D, 0xC842, 0xC84E, 0x4655, 0xC84F, 0xC84F, 0x2334,
- 0xC850, 0xC851, 0x4662, 0xC852, 0xC852, 0x1FF1, 0xC853, 0xC865, 0x4664,
- 0xC866, 0xC866, 0x218B, 0xC867, 0xC86D, 0x4677, 0xC86E, 0xC86E, 0x2349,
- 0xC86F, 0xC87D, 0x467E, 0xC87E, 0xC87E, 0x220B, 0xC880, 0xC886, 0x468D,
- 0xC887, 0xC887, 0x2346, 0xC888, 0xC891, 0x4694, 0xC892, 0xC892, 0x2347,
- 0xC893, 0xC893, 0x469E, 0xC894, 0xC894, 0x2193, 0xC895, 0xC898, 0x469F,
- 0xC899, 0xC899, 0x26A1, 0xC89A, 0xC89C, 0x46A3, 0xC89D, 0xC89D, 0x1F62,
- 0xC89E, 0xC8A0, 0x46A6, 0xC8A1, 0xC8FE, 0x0C7C, 0xC940, 0xC94E, 0x46A9,
- 0xC94F, 0xC94F, 0x234D, 0xC950, 0xC950, 0x2348, 0xC951, 0xC96D, 0x46B8,
- 0xC96E, 0xC96E, 0x1E60, 0xC96F, 0xC96F, 0x46D5, 0xC970, 0xC970, 0x2345,
- 0xC971, 0xC976, 0x46D6, 0xC977, 0xC977, 0x1F12, 0xC978, 0xC97E, 0x46DC,
- 0xC980, 0xC98E, 0x46E3, 0xC98F, 0xC98F, 0x2018, 0xC990, 0xC990, 0x2335,
- 0xC991, 0xC99B, 0x46F2, 0xC99C, 0xC99C, 0x233C, 0xC99D, 0xC9A0, 0x46FD,
- 0xC9A1, 0xC9FE, 0x0CDA, 0xCA40, 0xCA4D, 0x4701, 0xCA4E, 0xCA4E, 0x266F,
- 0xCA4F, 0xCA55, 0x470F, 0xCA56, 0xCA56, 0x2351, 0xCA57, 0xCA58, 0x4716,
- 0xCA59, 0xCA59, 0x1FA0, 0xCA5A, 0xCA5B, 0x4718, 0xCA5C, 0xCA5C, 0x2338,
- 0xCA5D, 0xCA60, 0x471A, 0xCA61, 0xCA61, 0x221B, 0xCA62, 0xCA6D, 0x471E,
- 0xCA6E, 0xCA6E, 0x2342, 0xCA6F, 0xCA71, 0x472A, 0xCA72, 0xCA72, 0x234F,
- 0xCA73, 0xCA76, 0x472D, 0xCA77, 0xCA77, 0x233D, 0xCA78, 0xCA7A, 0x4731,
- 0xCA7B, 0xCA7B, 0x2344, 0xCA7C, 0xCA7C, 0x2331, 0xCA7D, 0xCA7D, 0x4734,
- 0xCA7E, 0xCA7E, 0x234B, 0xCA80, 0xCA80, 0x4735, 0xCA81, 0xCA81, 0x233B,
- 0xCA82, 0xCA88, 0x4736, 0xCA89, 0xCA89, 0x2350, 0xCA8A, 0xCA8D, 0x473D,
- 0xCA8E, 0xCA8E, 0x1EB4, 0xCA8F, 0xCA8F, 0x21A6, 0xCA90, 0xCA91, 0x4741,
- 0xCA92, 0xCA92, 0x21CB, 0xCA93, 0xCA99, 0x4743, 0xCA9A, 0xCA9A, 0x2355,
- 0xCA9B, 0xCAA0, 0x474A, 0xCAA1, 0xCAFE, 0x0D38, 0xCB40, 0xCB42, 0x4750,
- 0xCB43, 0xCB43, 0x233E, 0xCB44, 0xCB44, 0x4753, 0xCB45, 0xCB45, 0x1F74,
- 0xCB46, 0xCB46, 0x4754, 0xCB47, 0xCB47, 0x2330, 0xCB48, 0xCB4A, 0x4755,
- 0xCB4B, 0xCB4B, 0x2680, 0xCB4C, 0xCB4D, 0x4758, 0xCB4E, 0xCB4E, 0x20DA,
- 0xCB4F, 0xCB56, 0x475A, 0xCB57, 0xCB57, 0x234A, 0xCB58, 0xCB5C, 0x4762,
- 0xCB5D, 0xCB5D, 0x1F91, 0xCB5E, 0xCB5E, 0x4767, 0xCB5F, 0xCB5F, 0x2107,
- 0xCB60, 0xCB69, 0x4768, 0xCB6A, 0xCB6A, 0x233F, 0xCB6B, 0xCB7A, 0x4772,
- 0xCB7B, 0xCB7B, 0x1FF4, 0xCB7C, 0xCB7C, 0x2343, 0xCB7D, 0xCB7E, 0x4782,
- 0xCB80, 0xCB86, 0x4784, 0xCB87, 0xCB87, 0x2212, 0xCB88, 0xCB8D, 0x478B,
- 0xCB8E, 0xCB8E, 0x2207, 0xCB8F, 0xCB91, 0x4791, 0xCB92, 0xCB92, 0x2359,
- 0xCB93, 0xCB9B, 0x4794, 0xCB9C, 0xCB9C, 0x2254, 0xCB9D, 0xCB9D, 0x479D,
- 0xCB9E, 0xCB9E, 0x2332, 0xCB9F, 0xCBA0, 0x479E, 0xCBA1, 0xCBFE, 0x0D96,
- 0xCC40, 0xCC40, 0x1E26, 0xCC41, 0xCC41, 0x2357, 0xCC42, 0xCC48, 0x47A0,
- 0xCC49, 0xCC49, 0x2358, 0xCC4A, 0xCC4A, 0x2042, 0xCC4B, 0xCC4B, 0x2153,
- 0xCC4C, 0xCC4E, 0x47A7, 0xCC4F, 0xCC4F, 0x20BB, 0xCC50, 0xCC5B, 0x47AA,
- 0xCC5C, 0xCC5C, 0x235A, 0xCC5D, 0xCC5F, 0x47B6, 0xCC60, 0xCC60, 0x2356,
- 0xCC61, 0xCC63, 0x47B9, 0xCC64, 0xCC64, 0x2337, 0xCC65, 0xCC6C, 0x47BC,
- 0xCC6D, 0xCC6D, 0x1FF9, 0xCC6E, 0xCC78, 0x47C4, 0xCC79, 0xCC79, 0x2353,
- 0xCC7A, 0xCC7C, 0x47CF, 0xCC7D, 0xCC7D, 0x2061, 0xCC7E, 0xCC7E, 0x47D2,
- 0xCC80, 0xCC8D, 0x47D3, 0xCC8E, 0xCC8E, 0x1E95, 0xCC8F, 0xCC93, 0x47E1,
- 0xCC94, 0xCC94, 0x2049, 0xCC95, 0xCC95, 0x47E6, 0xCC96, 0xCC96, 0x1F42,
- 0xCC97, 0xCC9C, 0x47E7, 0xCC9D, 0xCC9D, 0x1FE8, 0xCC9E, 0xCCA0, 0x47ED,
- 0xCCA1, 0xCCFE, 0x0DF4, 0xCD40, 0xCD7E, 0x47F0, 0xCD80, 0xCD8F, 0x482F,
- 0xCD90, 0xCD90, 0x25DA, 0xCD91, 0xCD97, 0x483F, 0xCD98, 0xCD98, 0x25D7,
- 0xCD99, 0xCDA0, 0x4846, 0xCDA1, 0xCDFE, 0x0E52, 0xCE40, 0xCE66, 0x484E,
- 0xCE67, 0xCE67, 0x212E, 0xCE68, 0xCE71, 0x4875, 0xCE72, 0xCE72, 0x21B2,
- 0xCE73, 0xCE7E, 0x487F, 0xCE80, 0xCE80, 0x488B, 0xCE81, 0xCE81, 0x219E,
- 0xCE82, 0xCE86, 0x488C, 0xCE87, 0xCE87, 0x25DC, 0xCE88, 0xCE9A, 0x4891,
- 0xCE9B, 0xCE9B, 0x206C, 0xCE9C, 0xCE9D, 0x48A4, 0xCE9E, 0xCE9E, 0x2226,
- 0xCE9F, 0xCEA0, 0x48A6, 0xCEA1, 0xCEFE, 0x0EB0, 0xCF40, 0xCF4D, 0x48A8,
- 0xCF4E, 0xCF4E, 0x25E0, 0xCF4F, 0xCF54, 0x48B6, 0xCF55, 0xCF55, 0x227B,
- 0xCF56, 0xCF57, 0x48BC, 0xCF58, 0xCF58, 0x25DE, 0xCF59, 0xCF5B, 0x48BE,
- 0xCF5C, 0xCF5C, 0x25E1, 0xCF5D, 0xCF6B, 0x48C1, 0xCF6C, 0xCF6C, 0x25D5,
- 0xCF6D, 0xCF72, 0x48D0, 0xCF73, 0xCF73, 0x1E6B, 0xCF74, 0xCF74, 0x48D6,
- 0xCF75, 0xCF75, 0x25DB, 0xCF76, 0xCF77, 0x48D7, 0xCF78, 0xCF78, 0x1E89,
- 0xCF79, 0xCF7B, 0x48D9, 0xCF7C, 0xCF7C, 0x25D9, 0xCF7D, 0xCF7E, 0x48DC,
- 0xCF80, 0xCF80, 0x48DE, 0xCF81, 0xCF81, 0x2211, 0xCF82, 0xCF88, 0x48DF,
- 0xCF89, 0xCF89, 0x2229, 0xCF8A, 0xCF8A, 0x25D6, 0xCF8B, 0xCF92, 0x48E6,
- 0xCF93, 0xCF93, 0x25DD, 0xCF94, 0xCF94, 0x25DF, 0xCF95, 0xCF9D, 0x48EE,
- 0xCF9E, 0xCF9E, 0x1FEF, 0xCF9F, 0xCF9F, 0x48F7, 0xCFA0, 0xCFA0, 0x25D8,
- 0xCFA1, 0xCFFE, 0x0F0E, 0xD040, 0xD04C, 0x48F8, 0xD04D, 0xD04D, 0x1F29,
- 0xD04E, 0xD050, 0x4905, 0xD051, 0xD051, 0x1E5B, 0xD052, 0xD054, 0x4908,
- 0xD055, 0xD055, 0x2076, 0xD056, 0xD05B, 0x490B, 0xD05C, 0xD05C, 0x2297,
- 0xD05D, 0xD05F, 0x4911, 0xD060, 0xD060, 0x2690, 0xD061, 0xD066, 0x4914,
- 0xD067, 0xD067, 0x213F, 0xD068, 0xD06B, 0x491A, 0xD06C, 0xD06C, 0x2198,
- 0xD06D, 0xD06D, 0x491E, 0xD06E, 0xD06E, 0x1E88, 0xD06F, 0xD07C, 0x491F,
- 0xD07D, 0xD07D, 0x228C, 0xD07E, 0xD07E, 0x492D, 0xD080, 0xD0A0, 0x492E,
- 0xD0A1, 0xD0FE, 0x0F6C, 0xD140, 0xD154, 0x494F, 0xD155, 0xD155, 0x25F1,
- 0xD156, 0xD158, 0x4964, 0xD159, 0xD159, 0x200C, 0xD15A, 0xD160, 0x4967,
- 0xD161, 0xD161, 0x1E58, 0xD162, 0xD162, 0x22AC, 0xD163, 0xD174, 0x496E,
- 0xD175, 0xD175, 0x26A7, 0xD176, 0xD17C, 0x4980, 0xD17D, 0xD17D, 0x2676,
- 0xD17E, 0xD17E, 0x4987, 0xD180, 0xD19C, 0x4988, 0xD19D, 0xD19D, 0x1FE1,
- 0xD19E, 0xD19E, 0x25BB, 0xD19F, 0xD1A0, 0x49A5, 0xD1A1, 0xD1FE, 0x0FCA,
- 0xD240, 0xD240, 0x25BE, 0xD241, 0xD242, 0x49A7, 0xD243, 0xD243, 0x22DD,
- 0xD244, 0xD24C, 0x49A9, 0xD24D, 0xD24D, 0x25BD, 0xD24E, 0xD25B, 0x49B2,
- 0xD25C, 0xD25C, 0x1E2A, 0xD25D, 0xD262, 0x49C0, 0xD263, 0xD263, 0x25BC,
- 0xD264, 0xD264, 0x25BA, 0xD265, 0xD267, 0x49C6, 0xD268, 0xD268, 0x25BF,
- 0xD269, 0xD26C, 0x49C9, 0xD26D, 0xD26D, 0x2187, 0xD26E, 0xD26E, 0x49CD,
- 0xD26F, 0xD26F, 0x266B, 0xD270, 0xD271, 0x49CE, 0xD272, 0xD272, 0x1E7F,
- 0xD273, 0xD274, 0x49D0, 0xD275, 0xD275, 0x21AD, 0xD276, 0xD27E, 0x49D2,
- 0xD280, 0xD289, 0x49DB, 0xD28A, 0xD28A, 0x1F96, 0xD28B, 0xD28D, 0x49E5,
- 0xD28E, 0xD28E, 0x1F32, 0xD28F, 0xD291, 0x49E8, 0xD292, 0xD292, 0x2084,
- 0xD293, 0xD294, 0x49EB, 0xD295, 0xD295, 0x2136, 0xD296, 0xD296, 0x49ED,
- 0xD297, 0xD297, 0x24B8, 0xD298, 0xD29F, 0x49EE, 0xD2A0, 0xD2A0, 0x24BA,
- 0xD2A1, 0xD2FE, 0x1028, 0xD340, 0xD343, 0x49F6, 0xD344, 0xD344, 0x24BC,
- 0xD345, 0xD347, 0x49FA, 0xD348, 0xD348, 0x20E4, 0xD349, 0xD349, 0x49FD,
- 0xD34A, 0xD34A, 0x24B9, 0xD34B, 0xD34C, 0x49FE, 0xD34D, 0xD34D, 0x24BD,
- 0xD34E, 0xD34F, 0x4A00, 0xD350, 0xD350, 0x24BE, 0xD351, 0xD354, 0x4A02,
- 0xD355, 0xD355, 0x24BF, 0xD356, 0xD357, 0x4A06, 0xD358, 0xD358, 0x1FD2,
- 0xD359, 0xD35A, 0x4A08, 0xD35B, 0xD35B, 0x1FFD, 0xD35C, 0xD35C, 0x4A0A,
- 0xD35D, 0xD35D, 0x24BB, 0xD35E, 0xD35E, 0x1F2D, 0xD35F, 0xD377, 0x4A0B,
- 0xD378, 0xD378, 0x2609, 0xD379, 0xD379, 0x4A24, 0xD37A, 0xD37A, 0x260A,
- 0xD37B, 0xD37B, 0x4A25, 0xD37C, 0xD37C, 0x1E94, 0xD37D, 0xD37E, 0x4A26,
- 0xD380, 0xD384, 0x4A28, 0xD385, 0xD385, 0x22DF, 0xD386, 0xD386, 0x1ECB,
- 0xD387, 0xD387, 0x1F0D, 0xD388, 0xD38A, 0x4A2D, 0xD38B, 0xD38B, 0x1F77,
- 0xD38C, 0xD38C, 0x4A30, 0xD38D, 0xD38D, 0x21EB, 0xD38E, 0xD38E, 0x4A31,
- 0xD38F, 0xD38F, 0x22E1, 0xD390, 0xD390, 0x4A32, 0xD391, 0xD391, 0x216F,
- 0xD392, 0xD392, 0x4A33, 0xD393, 0xD393, 0x22E0, 0xD394, 0xD395, 0x4A34,
- 0xD396, 0xD396, 0x21EA, 0xD397, 0xD397, 0x4A36, 0xD398, 0xD398, 0x22E2,
- 0xD399, 0xD399, 0x20CB, 0xD39A, 0xD39A, 0x4A37, 0xD39B, 0xD39B, 0x1F78,
- 0xD39C, 0xD39D, 0x4A38, 0xD39E, 0xD39E, 0x1EE2, 0xD39F, 0xD39F, 0x4A3A,
- 0xD3A0, 0xD3A0, 0x21F2, 0xD3A1, 0xD3FE, 0x1086, 0xD440, 0xD440, 0x4A3B,
- 0xD441, 0xD441, 0x2150, 0xD442, 0xD444, 0x4A3C, 0xD445, 0xD445, 0x1FD3,
- 0xD446, 0xD446, 0x4A3F, 0xD447, 0xD447, 0x22E5, 0xD448, 0xD44B, 0x4A40,
- 0xD44C, 0xD44C, 0x1EF2, 0xD44D, 0xD44E, 0x4A44, 0xD44F, 0xD44F, 0x211F,
- 0xD450, 0xD452, 0x4A46, 0xD453, 0xD453, 0x21DD, 0xD454, 0xD455, 0x4A49,
- 0xD456, 0xD456, 0x2154, 0xD457, 0xD457, 0x4A4B, 0xD458, 0xD458, 0x22E7,
- 0xD459, 0xD45B, 0x4A4C, 0xD45C, 0xD45C, 0x2282, 0xD45D, 0xD461, 0x4A4F,
- 0xD462, 0xD462, 0x22E6, 0xD463, 0xD466, 0x4A54, 0xD467, 0xD467, 0x22E8,
- 0xD468, 0xD46D, 0x4A58, 0xD46E, 0xD46E, 0x22E4, 0xD46F, 0xD46F, 0x4A5E,
- 0xD470, 0xD470, 0x226A, 0xD471, 0xD471, 0x4A5F, 0xD472, 0xD472, 0x22EB,
- 0xD473, 0xD473, 0x4A60, 0xD474, 0xD474, 0x22E9, 0xD475, 0xD475, 0x20BD,
- 0xD476, 0xD477, 0x4A61, 0xD478, 0xD478, 0x22EA, 0xD479, 0xD47A, 0x4A63,
- 0xD47B, 0xD47B, 0x22BD, 0xD47C, 0xD47D, 0x4A65, 0xD47E, 0xD47E, 0x1E9E,
- 0xD480, 0xD481, 0x4A67, 0xD482, 0xD482, 0x22F6, 0xD483, 0xD483, 0x21E7,
- 0xD484, 0xD484, 0x2216, 0xD485, 0xD486, 0x4A69, 0xD487, 0xD487, 0x2137,
- 0xD488, 0xD489, 0x4A6B, 0xD48A, 0xD48A, 0x212C, 0xD48B, 0xD48B, 0x4A6D,
- 0xD48C, 0xD48C, 0x1E68, 0xD48D, 0xD48D, 0x22F2, 0xD48E, 0xD48E, 0x1F37,
- 0xD48F, 0xD48F, 0x22F3, 0xD490, 0xD490, 0x4A6E, 0xD491, 0xD491, 0x22EF,
- 0xD492, 0xD492, 0x1F50, 0xD493, 0xD493, 0x1F10, 0xD494, 0xD494, 0x21C8,
- 0xD495, 0xD495, 0x4A6F, 0xD496, 0xD496, 0x22F1, 0xD497, 0xD49B, 0x4A70,
- 0xD49C, 0xD49C, 0x22F0, 0xD49D, 0xD49E, 0x4A75, 0xD49F, 0xD49F, 0x22EE,
- 0xD4A0, 0xD4A0, 0x4A77, 0xD4A1, 0xD4FE, 0x10E4, 0xD540, 0xD542, 0x4A78,
- 0xD543, 0xD543, 0x22ED, 0xD544, 0xD544, 0x229E, 0xD545, 0xD545, 0x22EC,
- 0xD546, 0xD546, 0x1FE2, 0xD547, 0xD549, 0x4A7B, 0xD54A, 0xD54A, 0x20FE,
- 0xD54B, 0xD54D, 0x4A7E, 0xD54E, 0xD54F, 0x22F9, 0xD550, 0xD550, 0x4A81,
- 0xD551, 0xD551, 0x1EAF, 0xD552, 0xD553, 0x4A82, 0xD554, 0xD554, 0x2236,
- 0xD555, 0xD555, 0x4A84, 0xD556, 0xD556, 0x22F7, 0xD557, 0xD559, 0x4A85,
- 0xD55A, 0xD55A, 0x223D, 0xD55B, 0xD55B, 0x4A88, 0xD55C, 0xD55C, 0x1E82,
- 0xD55D, 0xD55D, 0x1FB6, 0xD55E, 0xD55E, 0x4A89, 0xD55F, 0xD55F, 0x21A4,
- 0xD560, 0xD560, 0x21AA, 0xD561, 0xD561, 0x22F8, 0xD562, 0xD562, 0x2151,
- 0xD563, 0xD563, 0x4A8A, 0xD564, 0xD564, 0x1F60, 0xD565, 0xD567, 0x4A8B,
- 0xD568, 0xD568, 0x2147, 0xD569, 0xD56B, 0x4A8E, 0xD56C, 0xD56C, 0x2145,
- 0xD56D, 0xD56D, 0x4A91, 0xD56E, 0xD56E, 0x1FDC, 0xD56F, 0xD571, 0x4A92,
- 0xD572, 0xD572, 0x2301, 0xD573, 0xD574, 0x4A95, 0xD575, 0xD575, 0x1EF5,
- 0xD576, 0xD577, 0x4A97, 0xD578, 0xD578, 0x2218, 0xD579, 0xD57A, 0x4A99,
- 0xD57B, 0xD57B, 0x1EC6, 0xD57C, 0xD57D, 0x4A9B, 0xD57E, 0xD57E, 0x2300,
- 0xD580, 0xD580, 0x4A9D, 0xD581, 0xD581, 0x22B4, 0xD582, 0xD583, 0x4A9E,
- 0xD584, 0xD584, 0x2169, 0xD585, 0xD585, 0x4AA0, 0xD586, 0xD586, 0x22FD,
- 0xD587, 0xD587, 0x4AA1, 0xD588, 0xD588, 0x20EA, 0xD589, 0xD589, 0x4AA2,
- 0xD58A, 0xD58A, 0x22F4, 0xD58B, 0xD58B, 0x4AA3, 0xD58C, 0xD58C, 0x22FB,
- 0xD58D, 0xD58D, 0x4AA4, 0xD58E, 0xD58E, 0x22FC, 0xD58F, 0xD58F, 0x2027,
- 0xD590, 0xD592, 0x4AA5, 0xD593, 0xD593, 0x2060, 0xD594, 0xD594, 0x22FF,
- 0xD595, 0xD597, 0x4AA8, 0xD598, 0xD598, 0x22FE, 0xD599, 0xD599, 0x1EC7,
- 0xD59A, 0xD59A, 0x4AAB, 0xD59B, 0xD59B, 0x230C, 0xD59C, 0xD59E, 0x4AAC,
- 0xD59F, 0xD59F, 0x22F5, 0xD5A0, 0xD5A0, 0x4AAF, 0xD5A1, 0xD5FE, 0x1142,
- 0xD640, 0xD640, 0x2306, 0xD641, 0xD641, 0x4AB0, 0xD642, 0xD642, 0x230A,
- 0xD643, 0xD643, 0x21D3, 0xD644, 0xD646, 0x4AB1, 0xD647, 0xD647, 0x2303,
- 0xD648, 0xD648, 0x4AB4, 0xD649, 0xD649, 0x2307, 0xD64A, 0xD64A, 0x230B,
- 0xD64B, 0xD64C, 0x4AB5, 0xD64D, 0xD64D, 0x1F5F, 0xD64E, 0xD64E, 0x4AB7,
- 0xD64F, 0xD64F, 0x2309, 0xD650, 0xD651, 0x4AB8, 0xD652, 0xD652, 0x2302,
- 0xD653, 0xD653, 0x1F04, 0xD654, 0xD654, 0x229D, 0xD655, 0xD655, 0x4ABA,
- 0xD656, 0xD656, 0x21FB, 0xD657, 0xD657, 0x4ABB, 0xD658, 0xD658, 0x2308,
- 0xD659, 0xD659, 0x4ABC, 0xD65A, 0xD65A, 0x20AC, 0xD65B, 0xD65B, 0x4ABD,
- 0xD65C, 0xD65C, 0x208E, 0xD65D, 0xD65D, 0x2305, 0xD65E, 0xD65E, 0x2197,
- 0xD65F, 0xD65F, 0x4ABE, 0xD660, 0xD660, 0x2171, 0xD661, 0xD661, 0x2298,
- 0xD662, 0xD664, 0x4ABF, 0xD665, 0xD665, 0x1F57, 0xD666, 0xD668, 0x4AC2,
- 0xD669, 0xD669, 0x2082, 0xD66A, 0xD66A, 0x4AC5, 0xD66B, 0xD66B, 0x2311,
- 0xD66C, 0xD66E, 0x4AC6, 0xD66F, 0xD66F, 0x2304, 0xD670, 0xD670, 0x4AC9,
- 0xD671, 0xD671, 0x230F, 0xD672, 0xD672, 0x1E35, 0xD673, 0xD673, 0x4ACA,
- 0xD674, 0xD674, 0x20D1, 0xD675, 0xD675, 0x2310, 0xD676, 0xD676, 0x1FA3,
- 0xD677, 0xD677, 0x4ACB, 0xD678, 0xD678, 0x21D6, 0xD679, 0xD67B, 0x4ACC,
- 0xD67C, 0xD67C, 0x2206, 0xD67D, 0xD67E, 0x4ACF, 0xD680, 0xD682, 0x4AD1,
- 0xD683, 0xD683, 0x230D, 0xD684, 0xD685, 0x4AD4, 0xD686, 0xD686, 0x2312,
- 0xD687, 0xD687, 0x208D, 0xD688, 0xD688, 0x2313, 0xD689, 0xD68D, 0x4AD6,
- 0xD68E, 0xD68E, 0x22E3, 0xD68F, 0xD693, 0x4ADB, 0xD694, 0xD694, 0x1FBA,
- 0xD695, 0xD698, 0x4AE0, 0xD699, 0xD699, 0x2078, 0xD69A, 0xD6A0, 0x4AE4,
- 0xD6A1, 0xD6FE, 0x11A0, 0xD740, 0xD742, 0x4AEB, 0xD743, 0xD743, 0x2288,
- 0xD744, 0xD747, 0x4AEE, 0xD748, 0xD748, 0x2316, 0xD749, 0xD749, 0x1F6B,
- 0xD74A, 0xD74F, 0x4AF2, 0xD750, 0xD750, 0x2314, 0xD751, 0xD751, 0x4AF8,
- 0xD752, 0xD752, 0x2130, 0xD753, 0xD753, 0x2315, 0xD754, 0xD754, 0x2168,
- 0xD755, 0xD755, 0x4AF9, 0xD756, 0xD756, 0x20C4, 0xD757, 0xD763, 0x4AFA,
- 0xD764, 0xD764, 0x2318, 0xD765, 0xD766, 0x4B07, 0xD767, 0xD767, 0x2219,
- 0xD768, 0xD768, 0x2217, 0xD769, 0xD76B, 0x4B09, 0xD76C, 0xD76C, 0x20D5,
- 0xD76D, 0xD76E, 0x4B0C, 0xD76F, 0xD76F, 0x1F4A, 0xD770, 0xD774, 0x4B0E,
- 0xD775, 0xD775, 0x2240, 0xD776, 0xD777, 0x4B13, 0xD778, 0xD778, 0x1ED3,
- 0xD779, 0xD77E, 0x4B15, 0xD780, 0xD782, 0x4B1B, 0xD783, 0xD783, 0x1E49,
- 0xD784, 0xD786, 0x4B1E, 0xD787, 0xD787, 0x261B, 0xD788, 0xD78A, 0x4B21,
- 0xD78B, 0xD78B, 0x1E6D, 0xD78C, 0xD78C, 0x20F8, 0xD78D, 0xD78D, 0x4B24,
- 0xD78E, 0xD78E, 0x1FFB, 0xD78F, 0xD78F, 0x2319, 0xD790, 0xD794, 0x4B25,
- 0xD795, 0xD795, 0x230E, 0xD796, 0xD796, 0x4B2A, 0xD797, 0xD797, 0x2317,
- 0xD798, 0xD7A0, 0x4B2B, 0xD7A1, 0xD7F9, 0x11FE, 0xD840, 0xD84C, 0x4B34,
- 0xD84D, 0xD84D, 0x20C8, 0xD84E, 0xD852, 0x4B41, 0xD853, 0xD853, 0x1EFD,
- 0xD854, 0xD87E, 0x4B46, 0xD880, 0xD88F, 0x4B71, 0xD890, 0xD890, 0x1E3B,
- 0xD891, 0xD891, 0x227F, 0xD892, 0xD892, 0x4B81, 0xD893, 0xD893, 0x1F0C,
- 0xD894, 0xD894, 0x1E59, 0xD895, 0xD895, 0x1F24, 0xD896, 0xD899, 0x4B82,
- 0xD89A, 0xD89A, 0x20BA, 0xD89B, 0xD89B, 0x1F65, 0xD89C, 0xD89C, 0x1EF0,
- 0xD89D, 0xD89D, 0x2164, 0xD89E, 0xD89E, 0x1F30, 0xD89F, 0xD89F, 0x2261,
- 0xD8A0, 0xD8A0, 0x4B86, 0xD8A1, 0xD8FE, 0x1257, 0xD940, 0xD940, 0x4B87,
- 0xD941, 0xD941, 0x22A2, 0xD942, 0xD942, 0x24AB, 0xD943, 0xD943, 0x4B88,
- 0xD944, 0xD944, 0x24AF, 0xD945, 0xD945, 0x1EE8, 0xD946, 0xD946, 0x1F39,
- 0xD947, 0xD947, 0x4B89, 0xD948, 0xD948, 0x1E48, 0xD949, 0xD949, 0x2070,
- 0xD94A, 0xD94A, 0x1EA8, 0xD94B, 0xD94B, 0x4B8A, 0xD94C, 0xD94C, 0x24AC,
- 0xD94D, 0xD94D, 0x1EF7, 0xD94E, 0xD94E, 0x2176, 0xD94F, 0xD94F, 0x24AD,
- 0xD950, 0xD950, 0x4B8B, 0xD951, 0xD951, 0x207B, 0xD952, 0xD952, 0x1F45,
- 0xD953, 0xD953, 0x24AA, 0xD954, 0xD954, 0x204B, 0xD955, 0xD955, 0x202F,
- 0xD956, 0xD956, 0x1F5A, 0xD957, 0xD957, 0x24B0, 0xD958, 0xD958, 0x4B8C,
- 0xD959, 0xD959, 0x22B7, 0xD95A, 0xD95A, 0x1F7F, 0xD95B, 0xD95B, 0x4B8D,
- 0xD95C, 0xD95C, 0x2265, 0xD95D, 0xD962, 0x4B8E, 0xD963, 0xD963, 0x24B2,
- 0xD964, 0xD964, 0x211B, 0xD965, 0xD965, 0x1E51, 0xD966, 0xD966, 0x4B94,
- 0xD967, 0xD967, 0x24B4, 0xD968, 0xD96B, 0x4B95, 0xD96C, 0xD96C, 0x24B3,
- 0xD96D, 0xD96D, 0x4B99, 0xD96E, 0xD96E, 0x1E9F, 0xD96F, 0xD96F, 0x4B9A,
- 0xD970, 0xD970, 0x2118, 0xD971, 0xD971, 0x4B9B, 0xD972, 0xD972, 0x20B4,
- 0xD973, 0xD973, 0x23AF, 0xD974, 0xD974, 0x21BB, 0xD975, 0xD975, 0x2072,
- 0xD976, 0xD976, 0x1F95, 0xD977, 0xD977, 0x4B9C, 0xD978, 0xD978, 0x1F0A,
- 0xD979, 0xD979, 0x24B6, 0xD97A, 0xD97B, 0x4B9D, 0xD97C, 0xD97C, 0x2291,
- 0xD97D, 0xD97D, 0x24B5, 0xD97E, 0xD97E, 0x2278, 0xD980, 0xD980, 0x1ED4,
- 0xD981, 0xD986, 0x4B9F, 0xD987, 0xD987, 0x1FF3, 0xD988, 0xD98C, 0x4BA5,
- 0xD98D, 0xD98D, 0x22A9, 0xD98E, 0xD98E, 0x24B7, 0xD98F, 0xD98F, 0x1F28,
- 0xD990, 0xD990, 0x2109, 0xD991, 0xD991, 0x22C7, 0xD992, 0xD996, 0x4BAA,
- 0xD997, 0xD997, 0x24AE, 0xD998, 0xD998, 0x22B1, 0xD999, 0xD99A, 0x4BAF,
- 0xD99B, 0xD99B, 0x2266, 0xD99C, 0xD99C, 0x4BB1, 0xD99D, 0xD99D, 0x225B,
- 0xD99E, 0xD99E, 0x22C4, 0xD99F, 0xD99F, 0x4BB2, 0xD9A0, 0xD9A0, 0x2115,
- 0xD9A1, 0xD9FE, 0x12B5, 0xDA40, 0xDA40, 0x4BB3, 0xDA41, 0xDA41, 0x222A,
- 0xDA42, 0xDA42, 0x24B1, 0xDA43, 0xDA47, 0x4BB4, 0xDA48, 0xDA48, 0x213D,
- 0xDA49, 0xDA4C, 0x4BB9, 0xDA4D, 0xDA4D, 0x1F15, 0xDA4E, 0xDA4E, 0x225C,
- 0xDA4F, 0xDA72, 0x4BBD, 0xDA73, 0xDA73, 0x1F14, 0xDA74, 0xDA76, 0x4BE1,
- 0xDA77, 0xDA77, 0x227A, 0xDA78, 0xDA7E, 0x4BE4, 0xDA80, 0xDA84, 0x4BEB,
- 0xDA85, 0xDA85, 0x20EE, 0xDA86, 0xDA8D, 0x4BF0, 0xDA8E, 0xDA8E, 0x25F8,
- 0xDA8F, 0xDAA0, 0x4BF8, 0xDAA1, 0xDAFE, 0x1313, 0xDB40, 0xDB5F, 0x4C0A,
- 0xDB60, 0xDB60, 0x1F94, 0xDB61, 0xDB77, 0x4C2A, 0xDB78, 0xDB78, 0x2230,
- 0xDB79, 0xDB7E, 0x4C41, 0xDB80, 0xDB83, 0x4C47, 0xDB84, 0xDB84, 0x25FD,
- 0xDB85, 0xDB8A, 0x4C4B, 0xDB8B, 0xDB8B, 0x2600, 0xDB8C, 0xDB97, 0x4C51,
- 0xDB98, 0xDB98, 0x2606, 0xDB99, 0xDBA0, 0x4C5D, 0xDBA1, 0xDBFE, 0x1371,
- 0xDC40, 0xDC44, 0x4C65, 0xDC45, 0xDC45, 0x25FF, 0xDC46, 0xDC4E, 0x4C6A,
- 0xDC4F, 0xDC4F, 0x25FC, 0xDC50, 0xDC50, 0x1E8C, 0xDC51, 0xDC51, 0x2602,
- 0xDC52, 0xDC52, 0x4C73, 0xDC53, 0xDC53, 0x224D, 0xDC54, 0xDC54, 0x4C74,
- 0xDC55, 0xDC55, 0x2604, 0xDC56, 0xDC56, 0x25FE, 0xDC57, 0xDC57, 0x2603,
- 0xDC58, 0xDC5C, 0x4C75, 0xDC5D, 0xDC5D, 0x2601, 0xDC5E, 0xDC61, 0x4C7A,
- 0xDC62, 0xDC62, 0x2605, 0xDC63, 0xDC65, 0x4C7E, 0xDC66, 0xDC66, 0x1EA3,
- 0xDC67, 0xDC67, 0x2608, 0xDC68, 0xDC6A, 0x4C81, 0xDC6B, 0xDC6B, 0x2607,
- 0xDC6C, 0xDC7B, 0x4C84, 0xDC7C, 0xDC7C, 0x20F0, 0xDC7D, 0xDC7E, 0x4C94,
- 0xDC80, 0xDC86, 0x4C96, 0xDC87, 0xDC87, 0x1E7B, 0xDC88, 0xDC88, 0x2267,
- 0xDC89, 0xDC89, 0x1F36, 0xDC8A, 0xDC8A, 0x1FD6, 0xDC8B, 0xDC8D, 0x4C9D,
- 0xDC8E, 0xDC8E, 0x21E0, 0xDC8F, 0xDC8F, 0x4CA0, 0xDC90, 0xDC90, 0x248C,
- 0xDC91, 0xDC96, 0x4CA1, 0xDC97, 0xDC97, 0x248D, 0xDC98, 0xDC9A, 0x4CA7,
- 0xDC9B, 0xDC9B, 0x2102, 0xDC9C, 0xDC9F, 0x4CAA, 0xDCA0, 0xDCA0, 0x2494,
- 0xDCA1, 0xDCFE, 0x13CF, 0xDD40, 0xDD45, 0x4CAE, 0xDD46, 0xDD46, 0x2493,
- 0xDD47, 0xDD4C, 0x4CB4, 0xDD4D, 0xDD4D, 0x248E, 0xDD4E, 0xDD52, 0x4CBA,
- 0xDD53, 0xDD53, 0x2299, 0xDD54, 0xDD54, 0x2491, 0xDD55, 0xDD55, 0x2496,
- 0xDD56, 0xDD56, 0x248F, 0xDD57, 0xDD57, 0x2492, 0xDD58, 0xDD58, 0x4CBF,
- 0xDD59, 0xDD59, 0x2497, 0xDD5A, 0xDD5D, 0x4CC0, 0xDD5E, 0xDD5E, 0x1FB1,
- 0xDD5F, 0xDD5F, 0x4CC4, 0xDD60, 0xDD60, 0x249A, 0xDD61, 0xDD61, 0x4CC5,
- 0xDD62, 0xDD62, 0x2499, 0xDD63, 0xDD63, 0x4CC6, 0xDD64, 0xDD64, 0x2258,
- 0xDD65, 0xDD65, 0x2498, 0xDD66, 0xDD6C, 0x4CC7, 0xDD6D, 0xDD6D, 0x249B,
- 0xDD6E, 0xDD6E, 0x4CCE, 0xDD6F, 0xDD6F, 0x1F09, 0xDD70, 0xDD70, 0x20E6,
- 0xDD71, 0xDD75, 0x4CCF, 0xDD76, 0xDD76, 0x2026, 0xDD77, 0xDD77, 0x249F,
- 0xDD78, 0xDD78, 0x1F59, 0xDD79, 0xDD7A, 0x249D, 0xDD7B, 0xDD7E, 0x4CD4,
- 0xDD80, 0xDD80, 0x4CD8, 0xDD81, 0xDD81, 0x1F3B, 0xDD82, 0xDD82, 0x249C,
- 0xDD83, 0xDD84, 0x4CD9, 0xDD85, 0xDD85, 0x1E3A, 0xDD86, 0xDD86, 0x205B,
- 0xDD87, 0xDD8A, 0x4CDB, 0xDD8B, 0xDD8B, 0x1F70, 0xDD8C, 0xDD8E, 0x4CDF,
- 0xDD8F, 0xDD8F, 0x24A0, 0xDD90, 0xDD93, 0x4CE2, 0xDD94, 0xDD94, 0x213B,
- 0xDD95, 0xDD96, 0x4CE6, 0xDD97, 0xDD97, 0x1F07, 0xDD98, 0xDD99, 0x4CE8,
- 0xDD9A, 0xDD9A, 0x2270, 0xDD9B, 0xDD9B, 0x2237, 0xDD9C, 0xDD9D, 0x4CEA,
- 0xDD9E, 0xDD9E, 0x24D2, 0xDD9F, 0xDD9F, 0x4CEC, 0xDDA0, 0xDDA0, 0x21B3,
- 0xDDA1, 0xDDFE, 0x142D, 0xDE40, 0xDE40, 0x2245, 0xDE41, 0xDE41, 0x24A1,
- 0xDE42, 0xDE43, 0x4CED, 0xDE44, 0xDE44, 0x22A8, 0xDE45, 0xDE47, 0x4CEF,
- 0xDE48, 0xDE48, 0x227C, 0xDE49, 0xDE49, 0x1FB0, 0xDE4A, 0xDE4E, 0x4CF2,
- 0xDE4F, 0xDE4F, 0x24A2, 0xDE50, 0xDE59, 0x4CF7, 0xDE5A, 0xDE5A, 0x1F46,
- 0xDE5B, 0xDE5B, 0x4D01, 0xDE5C, 0xDE5C, 0x2380, 0xDE5D, 0xDE5D, 0x2495,
- 0xDE5E, 0xDE5E, 0x4D02, 0xDE5F, 0xDE5F, 0x2490, 0xDE60, 0xDE6A, 0x4D03,
- 0xDE6B, 0xDE6B, 0x1E30, 0xDE6C, 0xDE6E, 0x4D0E, 0xDE6F, 0xDE6F, 0x1E9D,
- 0xDE70, 0xDE70, 0x1E4B, 0xDE71, 0xDE71, 0x1E4A, 0xDE72, 0xDE72, 0x20AA,
- 0xDE73, 0xDE7E, 0x4D11, 0xDE80, 0xDE91, 0x4D1D, 0xDE92, 0xDE92, 0x267B,
- 0xDE93, 0xDE9E, 0x4D2F, 0xDE9F, 0xDE9F, 0x23F2, 0xDEA0, 0xDEA0, 0x4D3B,
- 0xDEA1, 0xDEFE, 0x148B, 0xDF40, 0xDF40, 0x227E, 0xDF41, 0xDF41, 0x4D3C,
- 0xDF42, 0xDF42, 0x2019, 0xDF43, 0xDF4C, 0x4D3D, 0xDF4D, 0xDF4D, 0x1FBB,
- 0xDF4E, 0xDF5B, 0x4D47, 0xDF5C, 0xDF5C, 0x2253, 0xDF5D, 0xDF5D, 0x4D55,
- 0xDF5E, 0xDF5E, 0x1F3E, 0xDF5F, 0xDF5F, 0x1EA6, 0xDF60, 0xDF60, 0x218E,
- 0xDF61, 0xDF63, 0x4D56, 0xDF64, 0xDF64, 0x21EC, 0xDF65, 0xDF65, 0x4D59,
- 0xDF66, 0xDF66, 0x1EBE, 0xDF67, 0xDF67, 0x4D5A, 0xDF68, 0xDF68, 0x224A,
- 0xDF69, 0xDF6C, 0x4D5B, 0xDF6D, 0xDF6D, 0x2133, 0xDF6E, 0xDF73, 0x4D5F,
- 0xDF74, 0xDF74, 0x1E84, 0xDF75, 0xDF76, 0x4D65, 0xDF77, 0xDF77, 0x20CF,
- 0xDF78, 0xDF78, 0x21E2, 0xDF79, 0xDF79, 0x4D67, 0xDF7A, 0xDF7A, 0x220F,
- 0xDF7B, 0xDF7B, 0x4D68, 0xDF7C, 0xDF7C, 0x2029, 0xDF7D, 0xDF7D, 0x4D69,
- 0xDF7E, 0xDF7E, 0x2073, 0xDF80, 0xDF80, 0x1F55, 0xDF81, 0xDF82, 0x4D6A,
- 0xDF83, 0xDF83, 0x23F1, 0xDF84, 0xDF84, 0x4D6C, 0xDF85, 0xDF85, 0x1E46,
- 0xDF86, 0xDF88, 0x4D6D, 0xDF89, 0xDF89, 0x2063, 0xDF8A, 0xDF8A, 0x23F3,
- 0xDF8B, 0xDFA0, 0x4D70, 0xDFA1, 0xDFFE, 0x14E9, 0xE040, 0xE04F, 0x4D86,
- 0xE050, 0xE050, 0x231E, 0xE051, 0xE05C, 0x4D96, 0xE05D, 0xE05D, 0x2233,
- 0xE05E, 0xE068, 0x4DA2, 0xE069, 0xE069, 0x2320, 0xE06A, 0xE06B, 0x4DAD,
- 0xE06C, 0xE06C, 0x21C7, 0xE06D, 0xE074, 0x4DAF, 0xE075, 0xE075, 0x22BC,
- 0xE076, 0xE076, 0x4DB7, 0xE077, 0xE077, 0x231C, 0xE078, 0xE078, 0x4DB8,
- 0xE079, 0xE079, 0x2251, 0xE07A, 0xE07E, 0x4DB9, 0xE080, 0xE086, 0x4DBE,
- 0xE087, 0xE087, 0x1EBB, 0xE088, 0xE08C, 0x4DC5, 0xE08D, 0xE08D, 0x2287,
- 0xE08E, 0xE08E, 0x4DCA, 0xE08F, 0xE08F, 0x202D, 0xE090, 0xE090, 0x1EAB,
- 0xE091, 0xE091, 0x4DCB, 0xE092, 0xE092, 0x231D, 0xE093, 0xE093, 0x4DCC,
- 0xE094, 0xE094, 0x231F, 0xE095, 0xE096, 0x4DCD, 0xE097, 0xE097, 0x231B,
- 0xE098, 0xE0A0, 0x4DCF, 0xE0A1, 0xE0FE, 0x1547, 0xE140, 0xE141, 0x4DD8,
- 0xE142, 0xE142, 0x2321, 0xE143, 0xE163, 0x4DDA, 0xE164, 0xE164, 0x2255,
- 0xE165, 0xE167, 0x4DFB, 0xE168, 0xE168, 0x1E8F, 0xE169, 0xE173, 0x4DFE,
- 0xE174, 0xE174, 0x220C, 0xE175, 0xE175, 0x1FA4, 0xE176, 0xE17E, 0x4E09,
- 0xE180, 0xE183, 0x4E12, 0xE184, 0xE184, 0x209B, 0xE185, 0xE185, 0x21D8,
- 0xE186, 0xE186, 0x4E16, 0xE187, 0xE187, 0x25FA, 0xE188, 0xE188, 0x4E17,
- 0xE189, 0xE189, 0x25F9, 0xE18A, 0xE18B, 0x4E18, 0xE18C, 0xE18C, 0x2134,
- 0xE18D, 0xE18D, 0x4E1A, 0xE18E, 0xE190, 0x24F3, 0xE191, 0xE191, 0x24F8,
- 0xE192, 0xE192, 0x4E1B, 0xE193, 0xE193, 0x24F7, 0xE194, 0xE194, 0x1EC8,
- 0xE195, 0xE195, 0x24F6, 0xE196, 0xE197, 0x4E1C, 0xE198, 0xE198, 0x2280,
- 0xE199, 0xE19D, 0x4E1E, 0xE19E, 0xE19E, 0x1EC5, 0xE19F, 0xE19F, 0x24FB,
- 0xE1A0, 0xE1A0, 0x4E23, 0xE1A1, 0xE1FE, 0x15A5, 0xE240, 0xE240, 0x4E24,
- 0xE241, 0xE241, 0x24FA, 0xE242, 0xE242, 0x4E25, 0xE243, 0xE243, 0x1EED,
- 0xE244, 0xE24E, 0x4E26, 0xE24F, 0xE24F, 0x24FD, 0xE250, 0xE250, 0x4E31,
- 0xE251, 0xE251, 0x24F9, 0xE252, 0xE252, 0x4E32, 0xE253, 0xE253, 0x24FE,
- 0xE254, 0xE254, 0x20CD, 0xE255, 0xE259, 0x4E33, 0xE25A, 0xE25A, 0x2508,
- 0xE25B, 0xE25B, 0x2504, 0xE25C, 0xE25D, 0x4E38, 0xE25E, 0xE25E, 0x2506,
- 0xE25F, 0xE261, 0x4E3A, 0xE262, 0xE262, 0x24FF, 0xE263, 0xE263, 0x2090,
- 0xE264, 0xE266, 0x4E3D, 0xE267, 0xE267, 0x1EDD, 0xE268, 0xE268, 0x1F25,
- 0xE269, 0xE269, 0x4E40, 0xE26A, 0xE26A, 0x2503, 0xE26B, 0xE26B, 0x2502,
- 0xE26C, 0xE26D, 0x4E41, 0xE26E, 0xE26E, 0x1E7A, 0xE26F, 0xE26F, 0x20A6,
- 0xE270, 0xE277, 0x4E43, 0xE278, 0xE278, 0x1FD5, 0xE279, 0xE27C, 0x4E4B,
- 0xE27D, 0xE27D, 0x1F11, 0xE27E, 0xE27E, 0x4E4F, 0xE280, 0xE280, 0x2507,
- 0xE281, 0xE281, 0x2500, 0xE282, 0xE282, 0x2505, 0xE283, 0xE288, 0x4E50,
- 0xE289, 0xE289, 0x2519, 0xE28A, 0xE28A, 0x4E56, 0xE28B, 0xE28B, 0x2515,
- 0xE28C, 0xE28D, 0x4E57, 0xE28E, 0xE28E, 0x250C, 0xE28F, 0xE28F, 0x2031,
- 0xE290, 0xE291, 0x4E59, 0xE292, 0xE292, 0x250B, 0xE293, 0xE293, 0x250F,
- 0xE294, 0xE294, 0x251A, 0xE295, 0xE295, 0x2509, 0xE296, 0xE297, 0x4E5B,
- 0xE298, 0xE298, 0x250E, 0xE299, 0xE299, 0x2234, 0xE29A, 0xE29A, 0x2513,
- 0xE29B, 0xE29B, 0x1F80, 0xE29C, 0xE29F, 0x4E5D, 0xE2A0, 0xE2A0, 0x2501,
- 0xE2A1, 0xE2FE, 0x1603, 0xE340, 0xE341, 0x4E61, 0xE342, 0xE342, 0x2517,
- 0xE343, 0xE343, 0x2516, 0xE344, 0xE346, 0x4E63, 0xE347, 0xE347, 0x2518,
- 0xE348, 0xE34A, 0x4E66, 0xE34B, 0xE34B, 0x1E56, 0xE34C, 0xE34E, 0x4E69,
- 0xE34F, 0xE34F, 0x250D, 0xE350, 0xE350, 0x4E6C, 0xE351, 0xE351, 0x20D3,
- 0xE352, 0xE353, 0x4E6D, 0xE354, 0xE354, 0x207A, 0xE355, 0xE355, 0x20CE,
- 0xE356, 0xE357, 0x4E6F, 0xE358, 0xE358, 0x2510, 0xE359, 0xE35B, 0x4E71,
- 0xE35C, 0xE35C, 0x1E55, 0xE35D, 0xE35F, 0x4E74, 0xE360, 0xE360, 0x250A,
- 0xE361, 0xE365, 0x4E77, 0xE366, 0xE367, 0x2511, 0xE368, 0xE370, 0x4E7C,
- 0xE371, 0xE371, 0x1FAA, 0xE372, 0xE372, 0x4E85, 0xE373, 0xE373, 0x251E,
- 0xE374, 0xE374, 0x1F1F, 0xE375, 0xE377, 0x4E86, 0xE378, 0xE378, 0x252D,
- 0xE379, 0xE379, 0x221D, 0xE37A, 0xE37B, 0x4E89, 0xE37C, 0xE37C, 0x2532,
- 0xE37D, 0xE37D, 0x4E8B, 0xE37E, 0xE37E, 0x217B, 0xE380, 0xE389, 0x4E8C,
- 0xE38A, 0xE38A, 0x21AF, 0xE38B, 0xE38B, 0x4E96, 0xE38C, 0xE38C, 0x252C,
- 0xE38D, 0xE38E, 0x4E97, 0xE38F, 0xE38F, 0x2528, 0xE390, 0xE390, 0x4E99,
- 0xE391, 0xE391, 0x208C, 0xE392, 0xE392, 0x4E9A, 0xE393, 0xE393, 0x252F,
- 0xE394, 0xE394, 0x4E9B, 0xE395, 0xE395, 0x21BC, 0xE396, 0xE398, 0x4E9C,
- 0xE399, 0xE399, 0x251D, 0xE39A, 0xE39B, 0x4E9F, 0xE39C, 0xE39C, 0x2535,
- 0xE39D, 0xE39D, 0x4EA1, 0xE39E, 0xE39E, 0x220D, 0xE39F, 0xE39F, 0x2526,
- 0xE3A0, 0xE3A0, 0x4EA2, 0xE3A1, 0xE3FE, 0x1661, 0xE440, 0xE440, 0x2534,
- 0xE441, 0xE441, 0x252A, 0xE442, 0xE442, 0x251F, 0xE443, 0xE443, 0x2531,
- 0xE444, 0xE444, 0x251C, 0xE445, 0xE447, 0x4EA3, 0xE448, 0xE448, 0x2525,
- 0xE449, 0xE44D, 0x4EA6, 0xE44E, 0xE44E, 0x21CD, 0xE44F, 0xE44F, 0x4EAB,
- 0xE450, 0xE450, 0x21DA, 0xE451, 0xE451, 0x4EAC, 0xE452, 0xE452, 0x2172,
- 0xE453, 0xE453, 0x253E, 0xE454, 0xE457, 0x4EAD, 0xE458, 0xE458, 0x204F,
- 0xE459, 0xE459, 0x4EB1, 0xE45A, 0xE45A, 0x2543, 0xE45B, 0xE45B, 0x4EB2,
- 0xE45C, 0xE45C, 0x21D7, 0xE45D, 0xE45D, 0x4EB3, 0xE45E, 0xE45E, 0x1E3C,
- 0xE45F, 0xE461, 0x4EB4, 0xE462, 0xE462, 0x2529, 0xE463, 0xE464, 0x4EB7,
- 0xE465, 0xE465, 0x2521, 0xE466, 0xE467, 0x4EB9, 0xE468, 0xE468, 0x1EFF,
- 0xE469, 0xE472, 0x4EBB, 0xE473, 0xE473, 0x253F, 0xE474, 0xE474, 0x4EC5,
- 0xE475, 0xE475, 0x2544, 0xE476, 0xE478, 0x4EC6, 0xE479, 0xE479, 0x2523,
- 0xE47A, 0xE47A, 0x1E90, 0xE47B, 0xE47B, 0x253A, 0xE47C, 0xE47C, 0x2545,
- 0xE47D, 0xE47D, 0x4EC9, 0xE47E, 0xE47E, 0x253D, 0xE480, 0xE480, 0x4ECA,
- 0xE481, 0xE481, 0x20C1, 0xE482, 0xE483, 0x4ECB, 0xE484, 0xE484, 0x2103,
- 0xE485, 0xE485, 0x2520, 0xE486, 0xE486, 0x253C, 0xE487, 0xE487, 0x253B,
- 0xE488, 0xE488, 0x2538, 0xE489, 0xE48C, 0x4ECD, 0xE48D, 0xE48D, 0x2540,
- 0xE48E, 0xE48E, 0x4ED1, 0xE48F, 0xE48F, 0x1FCD, 0xE490, 0xE492, 0x4ED2,
- 0xE493, 0xE493, 0x1F18, 0xE494, 0xE497, 0x4ED5, 0xE498, 0xE498, 0x254B,
- 0xE499, 0xE49C, 0x4ED9, 0xE49D, 0xE49D, 0x2547, 0xE49E, 0xE49F, 0x254F,
- 0xE4A0, 0xE4A0, 0x4EDD, 0xE4A1, 0xE4FE, 0x16BF, 0xE540, 0xE545, 0x4EDE,
- 0xE546, 0xE546, 0x22B0, 0xE547, 0xE547, 0x4EE4, 0xE548, 0xE548, 0x2546,
- 0xE549, 0xE54A, 0x4EE5, 0xE54B, 0xE54B, 0x254C, 0xE54C, 0xE54D, 0x4EE7,
- 0xE54E, 0xE54E, 0x1E9A, 0xE54F, 0xE54F, 0x2552, 0xE550, 0xE550, 0x2530,
- 0xE551, 0xE551, 0x2549, 0xE552, 0xE554, 0x4EE9, 0xE555, 0xE555, 0x2551,
- 0xE556, 0xE556, 0x1ECA, 0xE557, 0xE557, 0x4EEC, 0xE558, 0xE558, 0x20D2,
- 0xE559, 0xE55B, 0x4EED, 0xE55C, 0xE55C, 0x1FB8, 0xE55D, 0xE55D, 0x4EF0,
- 0xE55E, 0xE55E, 0x2079, 0xE55F, 0xE560, 0x4EF1, 0xE561, 0xE561, 0x21AB,
- 0xE562, 0xE563, 0x4EF3, 0xE564, 0xE564, 0x254D, 0xE565, 0xE565, 0x1EA5,
- 0xE566, 0xE567, 0x4EF5, 0xE568, 0xE568, 0x204C, 0xE569, 0xE569, 0x2080,
- 0xE56A, 0xE56B, 0x4EF7, 0xE56C, 0xE56C, 0x266D, 0xE56D, 0xE56D, 0x4EF9,
- 0xE56E, 0xE56E, 0x2537, 0xE56F, 0xE574, 0x4EFA, 0xE575, 0xE575, 0x254A,
- 0xE576, 0xE576, 0x21B8, 0xE577, 0xE577, 0x4F00, 0xE578, 0xE578, 0x254E,
- 0xE579, 0xE57A, 0x4F01, 0xE57B, 0xE57B, 0x24FC, 0xE57C, 0xE57C, 0x2554,
- 0xE57D, 0xE57E, 0x4F03, 0xE580, 0xE580, 0x4F05, 0xE581, 0xE581, 0x1F3C,
- 0xE582, 0xE582, 0x4F06, 0xE583, 0xE583, 0x1ED5, 0xE584, 0xE589, 0x4F07,
- 0xE58A, 0xE58A, 0x2556, 0xE58B, 0xE58D, 0x4F0D, 0xE58E, 0xE58E, 0x2268,
- 0xE58F, 0xE590, 0x4F10, 0xE591, 0xE591, 0x1ED6, 0xE592, 0xE599, 0x4F12,
- 0xE59A, 0xE59A, 0x2557, 0xE59B, 0xE59B, 0x2553, 0xE59C, 0xE59E, 0x4F1A,
- 0xE59F, 0xE59F, 0x2548, 0xE5A0, 0xE5A0, 0x4F1D, 0xE5A1, 0xE5FE, 0x171D,
- 0xE640, 0xE640, 0x20DC, 0xE641, 0xE643, 0x4F1E, 0xE644, 0xE644, 0x2559,
- 0xE645, 0xE648, 0x4F21, 0xE649, 0xE649, 0x1F97, 0xE64A, 0xE64A, 0x2555,
- 0xE64B, 0xE64D, 0x4F25, 0xE64E, 0xE64E, 0x227D, 0xE64F, 0xE651, 0x4F28,
- 0xE652, 0xE652, 0x257E, 0xE653, 0xE655, 0x4F2B, 0xE656, 0xE656, 0x207C,
- 0xE657, 0xE657, 0x4F2E, 0xE658, 0xE658, 0x255A, 0xE659, 0xE65A, 0x4F2F,
- 0xE65B, 0xE65B, 0x255E, 0xE65C, 0xE65D, 0x4F31, 0xE65E, 0xE65E, 0x1E34,
- 0xE65F, 0xE668, 0x4F33, 0xE669, 0xE669, 0x215E, 0xE66A, 0xE66A, 0x4F3D,
- 0xE66B, 0xE66B, 0x2560, 0xE66C, 0xE674, 0x4F3E, 0xE675, 0xE675, 0x21A2,
- 0xE676, 0xE676, 0x2354, 0xE677, 0xE678, 0x4F47, 0xE679, 0xE679, 0x2563,
- 0xE67A, 0xE67A, 0x2527, 0xE67B, 0xE67B, 0x4F49, 0xE67C, 0xE67C, 0x252E,
- 0xE67D, 0xE67D, 0x2558, 0xE67E, 0xE67E, 0x4F4A, 0xE680, 0xE680, 0x1F1B,
- 0xE681, 0xE681, 0x4F4B, 0xE682, 0xE682, 0x2283, 0xE683, 0xE683, 0x4F4C,
- 0xE684, 0xE684, 0x2564, 0xE685, 0xE686, 0x4F4D, 0xE687, 0xE687, 0x20A0,
- 0xE688, 0xE688, 0x4F4F, 0xE689, 0xE689, 0x2565, 0xE68A, 0xE68B, 0x4F50,
- 0xE68C, 0xE68C, 0x2561, 0xE68D, 0xE692, 0x4F52, 0xE693, 0xE693, 0x2562,
- 0xE694, 0xE696, 0x4F58, 0xE697, 0xE697, 0x256C, 0xE698, 0xE69A, 0x4F5B,
- 0xE69B, 0xE69B, 0x256D, 0xE69C, 0xE69C, 0x2020, 0xE69D, 0xE69E, 0x4F5E,
- 0xE69F, 0xE69F, 0x255F, 0xE6A0, 0xE6A0, 0x256A, 0xE6A1, 0xE6FE, 0x177B,
- 0xE740, 0xE742, 0x4F60, 0xE743, 0xE743, 0x256E, 0xE744, 0xE747, 0x4F63,
- 0xE748, 0xE748, 0x2539, 0xE749, 0xE749, 0x255C, 0xE74A, 0xE74C, 0x4F67,
- 0xE74D, 0xE74E, 0x2568, 0xE74F, 0xE74F, 0x256B, 0xE750, 0xE750, 0x1E6F,
- 0xE751, 0xE751, 0x4F6A, 0xE752, 0xE752, 0x1FC4, 0xE753, 0xE753, 0x2567,
- 0xE754, 0xE754, 0x4F6B, 0xE755, 0xE755, 0x255B, 0xE756, 0xE758, 0x4F6C,
- 0xE759, 0xE759, 0x261D, 0xE75A, 0xE765, 0x4F6F, 0xE766, 0xE766, 0x252B,
- 0xE767, 0xE767, 0x4F7B, 0xE768, 0xE768, 0x2571, 0xE769, 0xE769, 0x4F7C,
- 0xE76A, 0xE76A, 0x2577, 0xE76B, 0xE773, 0x4F7D, 0xE774, 0xE774, 0x2522,
- 0xE775, 0xE77B, 0x4F86, 0xE77C, 0xE77C, 0x2533, 0xE77D, 0xE77E, 0x4F8D,
- 0xE780, 0xE781, 0x4F8F, 0xE782, 0xE782, 0x202A, 0xE783, 0xE783, 0x4F91,
- 0xE784, 0xE784, 0x2536, 0xE785, 0xE785, 0x2573, 0xE786, 0xE786, 0x256F,
- 0xE787, 0xE789, 0x4F92, 0xE78A, 0xE78A, 0x2293, 0xE78B, 0xE78B, 0x2578,
- 0xE78C, 0xE78E, 0x4F95, 0xE78F, 0xE78F, 0x2570, 0xE790, 0xE791, 0x4F98,
- 0xE792, 0xE792, 0x2575, 0xE793, 0xE797, 0x4F9A, 0xE798, 0xE799, 0x2541,
- 0xE79A, 0xE79A, 0x255D, 0xE79B, 0xE79F, 0x4F9F, 0xE7A0, 0xE7A0, 0x201A,
- 0xE7A1, 0xE7FE, 0x17D9, 0xE840, 0xE842, 0x4FA4, 0xE843, 0xE843, 0x257A,
- 0xE844, 0xE844, 0x2006, 0xE845, 0xE845, 0x4FA7, 0xE846, 0xE846, 0x2177,
- 0xE847, 0xE848, 0x4FA8, 0xE849, 0xE849, 0x251B, 0xE84A, 0xE84A, 0x4FAA,
- 0xE84B, 0xE84B, 0x2524, 0xE84C, 0xE84E, 0x4FAB, 0xE84F, 0xE84F, 0x257B,
- 0xE850, 0xE853, 0x4FAE, 0xE854, 0xE854, 0x22A3, 0xE855, 0xE859, 0x4FB2,
- 0xE85A, 0xE85A, 0x2579, 0xE85B, 0xE85B, 0x4FB7, 0xE85C, 0xE85C, 0x2566,
- 0xE85D, 0xE861, 0x4FB8, 0xE862, 0xE862, 0x1F93, 0xE863, 0xE863, 0x4FBD,
- 0xE864, 0xE864, 0x257C, 0xE865, 0xE86F, 0x4FBE, 0xE870, 0xE870, 0x2514,
- 0xE871, 0xE872, 0x4FC9, 0xE873, 0xE873, 0x257D, 0xE874, 0xE874, 0x4FCB,
- 0xE875, 0xE875, 0x2572, 0xE876, 0xE87B, 0x4FCC, 0xE87C, 0xE87C, 0x2574,
- 0xE87D, 0xE87E, 0x4FD2, 0xE880, 0xE880, 0x224E, 0xE881, 0xE881, 0x4FD4,
- 0xE882, 0xE882, 0x21C6, 0xE883, 0xE886, 0x4FD5, 0xE887, 0xE887, 0x209F,
- 0xE888, 0xE888, 0x4FD9, 0xE889, 0xE889, 0x2576, 0xE88A, 0xE88B, 0x4FDA,
- 0xE88C, 0xE88C, 0x2064, 0xE88D, 0xE88D, 0x22BF, 0xE88E, 0xE88E, 0x261C,
- 0xE88F, 0xE88F, 0x225E, 0xE890, 0xE8A0, 0x4FDC, 0xE8A1, 0xE8FE, 0x1837,
- 0xE940, 0xE94B, 0x4FED, 0xE94C, 0xE94C, 0x1E75, 0xE94D, 0xE953, 0x4FF9,
- 0xE954, 0xE954, 0x207D, 0xE955, 0xE955, 0x5000, 0xE956, 0xE956, 0x23BF,
- 0xE957, 0xE957, 0x2113, 0xE958, 0xE959, 0x5001, 0xE95A, 0xE95A, 0x23C0,
- 0xE95B, 0xE95C, 0x5003, 0xE95D, 0xE95D, 0x1E45, 0xE95E, 0xE95E, 0x5005,
- 0xE95F, 0xE95F, 0x1FD8, 0xE960, 0xE960, 0x23C4, 0xE961, 0xE961, 0x5006,
- 0xE962, 0xE962, 0x23C2, 0xE963, 0xE963, 0x2104, 0xE964, 0xE964, 0x5007,
- 0xE965, 0xE965, 0x21BD, 0xE966, 0xE966, 0x5008, 0xE967, 0xE967, 0x1F87,
- 0xE968, 0xE968, 0x23C3, 0xE969, 0xE96B, 0x5009, 0xE96C, 0xE96C, 0x2269,
- 0xE96D, 0xE974, 0x500C, 0xE975, 0xE975, 0x1F43, 0xE976, 0xE976, 0x5014,
- 0xE977, 0xE977, 0x1F1E, 0xE978, 0xE978, 0x2679, 0xE979, 0xE979, 0x1EEB,
- 0xE97A, 0xE97B, 0x5015, 0xE97C, 0xE97C, 0x1F35, 0xE97D, 0xE97D, 0x208A,
- 0xE97E, 0xE97E, 0x5017, 0xE980, 0xE980, 0x23C7, 0xE981, 0xE981, 0x23C9,
- 0xE982, 0xE982, 0x23C6, 0xE983, 0xE986, 0x5018, 0xE987, 0xE987, 0x224F,
- 0xE988, 0xE98A, 0x501C, 0xE98B, 0xE98B, 0x23CB, 0xE98C, 0xE98D, 0x501F,
- 0xE98E, 0xE98E, 0x21F3, 0xE98F, 0xE98F, 0x5021, 0xE990, 0xE990, 0x21F7,
- 0xE991, 0xE991, 0x23CF, 0xE992, 0xE992, 0x23CE, 0xE993, 0xE993, 0x23CA,
- 0xE994, 0xE994, 0x23CD, 0xE995, 0xE997, 0x5022, 0xE998, 0xE998, 0x23D0,
- 0xE999, 0xE99A, 0x5025, 0xE99B, 0xE99B, 0x266C, 0xE99C, 0xE99C, 0x5027,
- 0xE99D, 0xE99D, 0x23C1, 0xE99E, 0xE99E, 0x5028, 0xE99F, 0xE99F, 0x1FEE,
- 0xE9A0, 0xE9A0, 0x23D1, 0xE9A1, 0xE9FE, 0x1895, 0xEA40, 0xEA40, 0x1FF8,
- 0xEA41, 0xEA43, 0x5029, 0xEA44, 0xEA44, 0x23D3, 0xEA45, 0xEA47, 0x502C,
- 0xEA48, 0xEA48, 0x23D2, 0xEA49, 0xEA49, 0x23D4, 0xEA4A, 0xEA4A, 0x1E98,
- 0xEA4B, 0xEA4F, 0x502F, 0xEA50, 0xEA50, 0x1F2C, 0xEA51, 0xEA51, 0x5034,
- 0xEA52, 0xEA52, 0x23D5, 0xEA53, 0xEA54, 0x5035, 0xEA55, 0xEA55, 0x1E71,
- 0xEA56, 0xEA56, 0x2691, 0xEA57, 0xEA58, 0x5037, 0xEA59, 0xEA59, 0x23C5,
- 0xEA5A, 0xEA7E, 0x5039, 0xEA80, 0xEA80, 0x231A, 0xEA81, 0xEA83, 0x505E,
- 0xEA84, 0xEA84, 0x2114, 0xEA85, 0xEA86, 0x5061, 0xEA87, 0xEA87, 0x2284,
- 0xEA88, 0xEA8D, 0x5063, 0xEA8E, 0xEA8E, 0x221C, 0xEA8F, 0xEA8F, 0x5069,
- 0xEA90, 0xEA90, 0x1E7E, 0xEA91, 0xEA91, 0x204D, 0xEA92, 0xEA95, 0x506A,
- 0xEA96, 0xEA96, 0x2201, 0xEA97, 0xEA9F, 0x506E, 0xEAA0, 0xEAA0, 0x1ED9,
- 0xEAA1, 0xEAFE, 0x18F3, 0xEB40, 0xEB40, 0x5077, 0xEB41, 0xEB41, 0x1FB2,
- 0xEB42, 0xEB44, 0x5078, 0xEB45, 0xEB45, 0x2252, 0xEB46, 0xEB47, 0x507B,
- 0xEB48, 0xEB48, 0x1F79, 0xEB49, 0xEB52, 0x507D, 0xEB53, 0xEB53, 0x2157,
- 0xEB54, 0xEB54, 0x5087, 0xEB55, 0xEB55, 0x21BF, 0xEB56, 0xEB5A, 0x5088,
- 0xEB5B, 0xEB5B, 0x221F, 0xEB5C, 0xEB5C, 0x508D, 0xEB5D, 0xEB5D, 0x203D,
- 0xEB5E, 0xEB5F, 0x508E, 0xEB60, 0xEB60, 0x2015, 0xEB61, 0xEB61, 0x5090,
- 0xEB62, 0xEB62, 0x26A5, 0xEB63, 0xEB6C, 0x5091, 0xEB6D, 0xEB6D, 0x2156,
- 0xEB6E, 0xEB6F, 0x509B, 0xEB70, 0xEB70, 0x2144, 0xEB71, 0xEB71, 0x509D,
- 0xEB72, 0xEB72, 0x1E91, 0xEB73, 0xEB73, 0x2257, 0xEB74, 0xEB77, 0x509E,
- 0xEB78, 0xEB78, 0x200A, 0xEB79, 0xEB79, 0x2092, 0xEB7A, 0xEB7E, 0x50A2,
- 0xEB80, 0xEB84, 0x50A7, 0xEB85, 0xEB85, 0x2250, 0xEB86, 0xEB89, 0x50AC,
- 0xEB8A, 0xEB8A, 0x1EC3, 0xEB8B, 0xEBA0, 0x50B0, 0xEBA1, 0xEBFE, 0x1951,
- 0xEC40, 0xEC45, 0x50C6, 0xEC46, 0xEC46, 0x21A8, 0xEC47, 0xEC55, 0x50CC,
- 0xEC56, 0xEC56, 0x260D, 0xEC57, 0xEC59, 0x50DB, 0xEC5A, 0xEC5A, 0x260C,
- 0xEC5B, 0xEC5B, 0x50DE, 0xEC5C, 0xEC5C, 0x260E, 0xEC5D, 0xEC5F, 0x50DF,
- 0xEC60, 0xEC60, 0x2032, 0xEC61, 0xEC6D, 0x50E2, 0xEC6E, 0xEC6E, 0x260B,
- 0xEC6F, 0xEC75, 0x50EF, 0xEC76, 0xEC76, 0x22C3, 0xEC77, 0xEC7E, 0x50F6,
- 0xEC80, 0xEC95, 0x50FE, 0xEC96, 0xEC96, 0x1F23, 0xEC97, 0xECA0, 0x5114,
- 0xECA1, 0xECFE, 0x19AF, 0xED40, 0xED45, 0x511E, 0xED46, 0xED46, 0x2695,
- 0xED47, 0xED57, 0x5124, 0xED58, 0xED58, 0x265E, 0xED59, 0xED5D, 0x5135,
- 0xED5E, 0xED5E, 0x265D, 0xED5F, 0xED60, 0x513A, 0xED61, 0xED61, 0x2692,
- 0xED62, 0xED63, 0x513C, 0xED64, 0xED64, 0x265F, 0xED65, 0xED65, 0x513E,
- 0xED66, 0xED66, 0x218D, 0xED67, 0xED67, 0x20FD, 0xED68, 0xED6D, 0x513F,
- 0xED6E, 0xED6E, 0x1F40, 0xED6F, 0xED73, 0x5145, 0xED74, 0xED74, 0x2465,
- 0xED75, 0xED76, 0x514A, 0xED77, 0xED77, 0x2467, 0xED78, 0xED78, 0x514C,
- 0xED79, 0xED79, 0x2466, 0xED7A, 0xED7E, 0x514D, 0xED80, 0xED90, 0x5152,
- 0xED91, 0xED91, 0x21C9, 0xED92, 0xED92, 0x5163, 0xED93, 0xED93, 0x2209,
- 0xED94, 0xED94, 0x1EC9, 0xED95, 0xED95, 0x20E9, 0xED96, 0xED96, 0x5164,
- 0xED97, 0xED97, 0x21CA, 0xED98, 0xED98, 0x2146, 0xED99, 0xED99, 0x25C5,
- 0xED9A, 0xED9A, 0x21DC, 0xED9B, 0xED9B, 0x5165, 0xED9C, 0xED9C, 0x245E,
- 0xED9D, 0xED9D, 0x5166, 0xED9E, 0xED9E, 0x214F, 0xED9F, 0xED9F, 0x5167,
- 0xEDA0, 0xEDA0, 0x25C6, 0xEDA1, 0xEDFE, 0x1A0D, 0xEE40, 0xEE40, 0x25C7,
- 0xEE41, 0xEE41, 0x2241, 0xEE42, 0xEE42, 0x218A, 0xEE43, 0xEE43, 0x1E2F,
- 0xEE44, 0xEE44, 0x1EDC, 0xEE45, 0xEE47, 0x5168, 0xEE48, 0xEE48, 0x20BF,
- 0xEE49, 0xEE49, 0x2034, 0xEE4A, 0xEE4C, 0x516B, 0xEE4D, 0xEE4D, 0x25C9,
- 0xEE4E, 0xEE51, 0x516E, 0xEE52, 0xEE52, 0x25C8, 0xEE53, 0xEE54, 0x5172,
- 0xEE55, 0xEE55, 0x220E, 0xEE56, 0xEE56, 0x5174, 0xEE57, 0xEE57, 0x25CB,
- 0xEE58, 0xEE5D, 0x5175, 0xEE5E, 0xEE5E, 0x217D, 0xEE5F, 0xEE60, 0x517B,
- 0xEE61, 0xEE61, 0x1F7E, 0xEE62, 0xEE67, 0x517D, 0xEE68, 0xEE68, 0x25CC,
- 0xEE69, 0xEE69, 0x1FC3, 0xEE6A, 0xEE6B, 0x5183, 0xEE6C, 0xEE6C, 0x20B9,
- 0xEE6D, 0xEE6D, 0x5185, 0xEE6E, 0xEE6E, 0x2181, 0xEE6F, 0xEE76, 0x5186,
- 0xEE77, 0xEE77, 0x1FDA, 0xEE78, 0xEE7C, 0x518E, 0xEE7D, 0xEE7D, 0x2173,
- 0xEE7E, 0xEE7E, 0x1EE1, 0xEE80, 0xEE80, 0x25CD, 0xEE81, 0xEE84, 0x5193,
- 0xEE85, 0xEE85, 0x25CE, 0xEE86, 0xEE86, 0x21F6, 0xEE87, 0xEE89, 0x5197,
- 0xEE8A, 0xEE8A, 0x224B, 0xEE8B, 0xEE8B, 0x25D1, 0xEE8C, 0xEE8C, 0x519A,
- 0xEE8D, 0xEE8D, 0x1EC0, 0xEE8E, 0xEE8F, 0x519B, 0xEE90, 0xEE90, 0x2008,
- 0xEE91, 0xEE93, 0x519D, 0xEE94, 0xEE94, 0x25D0, 0xEE95, 0xEE96, 0x51A0,
- 0xEE97, 0xEE97, 0x25D2, 0xEE98, 0xEE98, 0x51A2, 0xEE99, 0xEE99, 0x1F2A,
- 0xEE9A, 0xEE9C, 0x51A3, 0xEE9D, 0xEE9D, 0x1E72, 0xEE9E, 0xEE9E, 0x25D3,
- 0xEE9F, 0xEEA0, 0x51A6, 0xEEA1, 0xEEFE, 0x1A6B, 0xEF40, 0xEF40, 0x21BE,
- 0xEF41, 0xEF41, 0x25D4, 0xEF42, 0xEF42, 0x2044, 0xEF43, 0xEF43, 0x51A8,
- 0xEF44, 0xEF44, 0x25CF, 0xEF45, 0xEF45, 0x20F3, 0xEF46, 0xEF4B, 0x51A9,
- 0xEF4C, 0xEF4C, 0x1F00, 0xEF4D, 0xEF51, 0x51AF, 0xEF52, 0xEF53, 0x24CC,
- 0xEF54, 0xEF54, 0x51B4, 0xEF55, 0xEF55, 0x2698, 0xEF56, 0xEF56, 0x51B5,
- 0xEF57, 0xEF57, 0x2678, 0xEF58, 0xEF59, 0x51B6, 0xEF5A, 0xEF5A, 0x24CE,
- 0xEF5B, 0xEF5F, 0x51B8, 0xEF60, 0xEF60, 0x24CF, 0xEF61, 0xEF67, 0x51BD,
- 0xEF68, 0xEF68, 0x20B8, 0xEF69, 0xEF69, 0x51C4, 0xEF6A, 0xEF6A, 0x24D0,
- 0xEF6B, 0xEF6B, 0x51C5, 0xEF6C, 0xEF6C, 0x24D1, 0xEF6D, 0xEF76, 0x51C6,
- 0xEF77, 0xEF77, 0x1EF4, 0xEF78, 0xEF79, 0x51D0, 0xEF7A, 0xEF7A, 0x239B,
- 0xEF7B, 0xEF7B, 0x51D2, 0xEF7C, 0xEF7C, 0x267E, 0xEF7D, 0xEF7E, 0x51D3,
- 0xEF80, 0xEF81, 0x51D5, 0xEF82, 0xEF82, 0x239D, 0xEF83, 0xEF84, 0x239F,
- 0xEF85, 0xEF85, 0x51D7, 0xEF86, 0xEF86, 0x23A1, 0xEF87, 0xEF87, 0x51D8,
- 0xEF88, 0xEF88, 0x1EF1, 0xEF89, 0xEF8A, 0x51D9, 0xEF8B, 0xEF8B, 0x221E,
- 0xEF8C, 0xEF8C, 0x51DB, 0xEF8D, 0xEF8D, 0x23A2, 0xEF8E, 0xEF94, 0x51DC,
- 0xEF95, 0xEF95, 0x214B, 0xEF96, 0xEF96, 0x1E36, 0xEF97, 0xEF97, 0x2135,
- 0xEF98, 0xEF9B, 0x51E3, 0xEF9C, 0xEF9C, 0x1FAD, 0xEF9D, 0xEF9D, 0x51E7,
- 0xEF9E, 0xEF9E, 0x1E53, 0xEF9F, 0xEFA0, 0x51E8, 0xEFA1, 0xEFFE, 0x1AC9,
- 0xF040, 0xF040, 0x51EA, 0xF041, 0xF041, 0x23A3, 0xF042, 0xF042, 0x2203,
- 0xF043, 0xF043, 0x51EB, 0xF044, 0xF044, 0x1EE7, 0xF045, 0xF046, 0x51EC,
- 0xF047, 0xF047, 0x23A4, 0xF048, 0xF048, 0x2097, 0xF049, 0xF049, 0x1EE4,
- 0xF04A, 0xF04D, 0x51EE, 0xF04E, 0xF04E, 0x2238, 0xF04F, 0xF050, 0x51F2,
- 0xF051, 0xF051, 0x23A5, 0xF052, 0xF053, 0x51F4, 0xF054, 0xF054, 0x1F9A,
- 0xF055, 0xF056, 0x51F6, 0xF057, 0xF057, 0x21C3, 0xF058, 0xF05D, 0x51F8,
- 0xF05E, 0xF05E, 0x1F2E, 0xF05F, 0xF067, 0x51FE, 0xF068, 0xF068, 0x239C,
- 0xF069, 0xF06B, 0x5207, 0xF06C, 0xF06C, 0x23A6, 0xF06D, 0xF070, 0x520A,
- 0xF071, 0xF071, 0x239E, 0xF072, 0xF072, 0x520E, 0xF073, 0xF073, 0x2035,
- 0xF074, 0xF074, 0x23A7, 0xF075, 0xF077, 0x520F, 0xF078, 0xF078, 0x23A8,
- 0xF079, 0xF079, 0x5212, 0xF07A, 0xF07A, 0x2075, 0xF07B, 0xF07C, 0x5213,
- 0xF07D, 0xF07E, 0x23A9, 0xF080, 0xF080, 0x23AB, 0xF081, 0xF081, 0x1FEB,
- 0xF082, 0xF082, 0x23AC, 0xF083, 0xF086, 0x5215, 0xF087, 0xF087, 0x1F6A,
- 0xF088, 0xF088, 0x20F9, 0xF089, 0xF08A, 0x5219, 0xF08B, 0xF08B, 0x2666,
- 0xF08C, 0xF08F, 0x521B, 0xF090, 0xF090, 0x2667, 0xF091, 0xF091, 0x521F,
- 0xF092, 0xF092, 0x1E6C, 0xF093, 0xF095, 0x5220, 0xF096, 0xF096, 0x23AD,
- 0xF097, 0xF0A0, 0x5223, 0xF0A1, 0xF0FE, 0x1B27, 0xF140, 0xF151, 0x522D,
- 0xF152, 0xF152, 0x206D, 0xF153, 0xF153, 0x2242, 0xF154, 0xF154, 0x1F02,
- 0xF155, 0xF156, 0x523F, 0xF157, 0xF157, 0x2183, 0xF158, 0xF158, 0x5241,
- 0xF159, 0xF159, 0x1E85, 0xF15A, 0xF15A, 0x21E9, 0xF15B, 0xF166, 0x5242,
- 0xF167, 0xF167, 0x1E57, 0xF168, 0xF175, 0x524E, 0xF176, 0xF176, 0x22A5,
- 0xF177, 0xF177, 0x2407, 0xF178, 0xF178, 0x1FCA, 0xF179, 0xF179, 0x525C,
- 0xF17A, 0xF17A, 0x2402, 0xF17B, 0xF17B, 0x1F82, 0xF17C, 0xF17D, 0x525D,
- 0xF17E, 0xF17E, 0x2408, 0xF180, 0xF180, 0x2404, 0xF181, 0xF181, 0x525F,
- 0xF182, 0xF182, 0x2131, 0xF183, 0xF183, 0x5260, 0xF184, 0xF184, 0x2184,
- 0xF185, 0xF185, 0x5261, 0xF186, 0xF186, 0x2403, 0xF187, 0xF187, 0x5262,
- 0xF188, 0xF188, 0x206E, 0xF189, 0xF189, 0x240B, 0xF18A, 0xF193, 0x5263,
- 0xF194, 0xF194, 0x1F3F, 0xF195, 0xF197, 0x526D, 0xF198, 0xF198, 0x2067,
- 0xF199, 0xF1A0, 0x5270, 0xF1A1, 0xF1FE, 0x1B85, 0xF240, 0xF244, 0x5278,
- 0xF245, 0xF245, 0x1FD7, 0xF246, 0xF246, 0x527D, 0xF247, 0xF247, 0x1E83,
- 0xF248, 0xF24A, 0x527E, 0xF24B, 0xF24B, 0x240F, 0xF24C, 0xF252, 0x5281,
- 0xF253, 0xF253, 0x240E, 0xF254, 0xF254, 0x20C7, 0xF255, 0xF255, 0x240D,
- 0xF256, 0xF25B, 0x5288, 0xF25C, 0xF25C, 0x2412, 0xF25D, 0xF25E, 0x528E,
- 0xF25F, 0xF25F, 0x20B7, 0xF260, 0xF270, 0x5290, 0xF271, 0xF271, 0x23F0,
- 0xF272, 0xF272, 0x52A1, 0xF273, 0xF273, 0x2411, 0xF274, 0xF274, 0x2414,
- 0xF275, 0xF275, 0x52A2, 0xF276, 0xF276, 0x2170, 0xF277, 0xF27B, 0x52A3,
- 0xF27C, 0xF27C, 0x2405, 0xF27D, 0xF27D, 0x210C, 0xF27E, 0xF27E, 0x2415,
- 0xF280, 0xF284, 0x52A8, 0xF285, 0xF285, 0x2066, 0xF286, 0xF286, 0x52AD,
- 0xF287, 0xF287, 0x2352, 0xF288, 0xF288, 0x2413, 0xF289, 0xF289, 0x2410,
- 0xF28A, 0xF28B, 0x2416, 0xF28C, 0xF28C, 0x20F1, 0xF28D, 0xF290, 0x52AE,
- 0xF291, 0xF291, 0x240A, 0xF292, 0xF293, 0x52B2, 0xF294, 0xF294, 0x2409,
- 0xF295, 0xF295, 0x52B4, 0xF296, 0xF296, 0x2418, 0xF297, 0xF29B, 0x52B5,
- 0xF29C, 0xF29C, 0x1FA7, 0xF29D, 0xF29D, 0x52BA, 0xF29E, 0xF29E, 0x21FC,
- 0xF29F, 0xF2A0, 0x52BB, 0xF2A1, 0xF2FE, 0x1BE3, 0xF340, 0xF340, 0x1FC1,
- 0xF341, 0xF341, 0x2406, 0xF342, 0xF344, 0x52BD, 0xF345, 0xF345, 0x229C,
- 0xF346, 0xF347, 0x52C0, 0xF348, 0xF348, 0x204E, 0xF349, 0xF349, 0x52C2,
- 0xF34A, 0xF34A, 0x241A, 0xF34B, 0xF34B, 0x2419, 0xF34C, 0xF34F, 0x52C3,
- 0xF350, 0xF350, 0x240C, 0xF351, 0xF360, 0x52C7, 0xF361, 0xF361, 0x1E29,
- 0xF362, 0xF373, 0x52D7, 0xF374, 0xF374, 0x2661, 0xF375, 0xF375, 0x52E9,
- 0xF376, 0xF376, 0x26A4, 0xF377, 0xF377, 0x2174, 0xF378, 0xF378, 0x2663,
- 0xF379, 0xF379, 0x2662, 0xF37A, 0xF37E, 0x52EA, 0xF380, 0xF38B, 0x52EF,
- 0xF38C, 0xF38C, 0x2675, 0xF38D, 0xF39F, 0x52FB, 0xF3A0, 0xF3A0, 0x214C,
- 0xF3A1, 0xF3FE, 0x1C41, 0xF440, 0xF444, 0x530E, 0xF445, 0xF445, 0x267A,
- 0xF446, 0xF44F, 0x5313, 0xF450, 0xF450, 0x26A0, 0xF451, 0xF456, 0x531D,
- 0xF457, 0xF457, 0x2668, 0xF458, 0xF458, 0x5323, 0xF459, 0xF459, 0x1ED0,
- 0xF45A, 0xF45A, 0x5324, 0xF45B, 0xF45B, 0x2096, 0xF45C, 0xF45C, 0x5325,
- 0xF45D, 0xF45D, 0x23CC, 0xF45E, 0xF461, 0x5326, 0xF462, 0xF462, 0x23C8,
- 0xF463, 0xF463, 0x532A, 0xF464, 0xF464, 0x223E, 0xF465, 0xF474, 0x532B,
- 0xF475, 0xF475, 0x2665, 0xF476, 0xF47B, 0x533B, 0xF47C, 0xF47C, 0x2664,
- 0xF47D, 0xF47D, 0x5341, 0xF47E, 0xF47E, 0x2239, 0xF480, 0xF493, 0x5342,
- 0xF494, 0xF494, 0x204A, 0xF495, 0xF498, 0x5356, 0xF499, 0xF499, 0x261F,
- 0xF49A, 0xF49B, 0x535A, 0xF49C, 0xF49C, 0x261E, 0xF49D, 0xF4A0, 0x535C,
- 0xF4A1, 0xF4FE, 0x1C9F, 0xF540, 0xF544, 0x5360, 0xF545, 0xF545, 0x2620,
- 0xF546, 0xF546, 0x5365, 0xF547, 0xF547, 0x2621, 0xF548, 0xF551, 0x5366,
- 0xF552, 0xF552, 0x2622, 0xF553, 0xF553, 0x5370, 0xF554, 0xF554, 0x2627,
- 0xF555, 0xF555, 0x1E39, 0xF556, 0xF556, 0x2625, 0xF557, 0xF55D, 0x5371,
- 0xF55E, 0xF55E, 0x2629, 0xF55F, 0xF560, 0x5378, 0xF561, 0xF561, 0x262E,
- 0xF562, 0xF562, 0x262B, 0xF563, 0xF56D, 0x537A, 0xF56E, 0xF56E, 0x262A,
- 0xF56F, 0xF56F, 0x262D, 0xF570, 0xF570, 0x5385, 0xF571, 0xF571, 0x2628,
- 0xF572, 0xF572, 0x21B9, 0xF573, 0xF57E, 0x5386, 0xF580, 0xF584, 0x5392,
- 0xF585, 0xF585, 0x2636, 0xF586, 0xF586, 0x2630, 0xF587, 0xF58B, 0x5397,
- 0xF58C, 0xF58C, 0x2638, 0xF58D, 0xF58D, 0x539C, 0xF58E, 0xF58E, 0x200D,
- 0xF58F, 0xF58F, 0x2637, 0xF590, 0xF598, 0x539D, 0xF599, 0xF599, 0x2645,
- 0xF59A, 0xF59A, 0x53A6, 0xF59B, 0xF59B, 0x263A, 0xF59C, 0xF59F, 0x53A7,
- 0xF5A0, 0xF5A0, 0x2643, 0xF5A1, 0xF5FE, 0x1CFD, 0xF640, 0xF640, 0x53AB,
- 0xF641, 0xF641, 0x2640, 0xF642, 0xF644, 0x53AC, 0xF645, 0xF645, 0x263D,
- 0xF646, 0xF646, 0x2641, 0xF647, 0xF647, 0x53AF, 0xF648, 0xF648, 0x263E,
- 0xF649, 0xF64A, 0x53B0, 0xF64B, 0xF64B, 0x263F, 0xF64C, 0xF64C, 0x1FC0,
- 0xF64D, 0xF64D, 0x53B2, 0xF64E, 0xF64F, 0x263B, 0xF650, 0xF653, 0x53B3,
- 0xF654, 0xF654, 0x2642, 0xF655, 0xF657, 0x53B7, 0xF658, 0xF658, 0x2644,
- 0xF659, 0xF660, 0x53BA, 0xF661, 0xF661, 0x2639, 0xF662, 0xF662, 0x53C2,
- 0xF663, 0xF663, 0x264C, 0xF664, 0xF66B, 0x53C3, 0xF66C, 0xF66C, 0x2647,
- 0xF66D, 0xF66D, 0x264B, 0xF66E, 0xF670, 0x53CB, 0xF671, 0xF671, 0x2649,
- 0xF672, 0xF673, 0x53CE, 0xF674, 0xF674, 0x2648, 0xF675, 0xF675, 0x53D0,
- 0xF676, 0xF676, 0x264A, 0xF677, 0xF677, 0x2108, 0xF678, 0xF67E, 0x53D1,
- 0xF680, 0xF684, 0x53D8, 0xF685, 0xF685, 0x264D, 0xF686, 0xF687, 0x53DD,
- 0xF688, 0xF688, 0x2634, 0xF689, 0xF689, 0x53DF, 0xF68A, 0xF68A, 0x2651,
- 0xF68B, 0xF68C, 0x53E0, 0xF68D, 0xF68D, 0x2650, 0xF68E, 0xF68E, 0x2652,
- 0xF68F, 0xF691, 0x53E2, 0xF692, 0xF692, 0x264F, 0xF693, 0xF695, 0x53E5,
- 0xF696, 0xF696, 0x2632, 0xF697, 0xF697, 0x264E, 0xF698, 0xF698, 0x2653,
- 0xF699, 0xF699, 0x53E8, 0xF69A, 0xF69A, 0x2657, 0xF69B, 0xF69B, 0x53E9,
- 0xF69C, 0xF69C, 0x2635, 0xF69D, 0xF69D, 0x53EA, 0xF69E, 0xF69E, 0x2633,
- 0xF69F, 0xF69F, 0x53EB, 0xF6A0, 0xF6A0, 0x2656, 0xF6A1, 0xF6FE, 0x1D5B,
- 0xF740, 0xF741, 0x53EC, 0xF742, 0xF742, 0x2654, 0xF743, 0xF748, 0x53EE,
- 0xF749, 0xF749, 0x2658, 0xF74A, 0xF74B, 0x53F4, 0xF74C, 0xF74C, 0x2655,
- 0xF74D, 0xF74D, 0x1E4D, 0xF74E, 0xF755, 0x53F6, 0xF756, 0xF756, 0x265B,
- 0xF757, 0xF757, 0x53FE, 0xF758, 0xF758, 0x265A, 0xF759, 0xF759, 0x53FF,
- 0xF75A, 0xF75A, 0x2659, 0xF75B, 0xF75B, 0x202E, 0xF75C, 0xF75C, 0x262F,
- 0xF75D, 0xF760, 0x5400, 0xF761, 0xF761, 0x2646, 0xF762, 0xF762, 0x5404,
- 0xF763, 0xF763, 0x2626, 0xF764, 0xF76A, 0x5405, 0xF76B, 0xF76B, 0x265C,
- 0xF76C, 0xF770, 0x540C, 0xF771, 0xF771, 0x262C, 0xF772, 0xF77B, 0x5411,
- 0xF77C, 0xF77C, 0x2623, 0xF77D, 0xF77D, 0x541B, 0xF77E, 0xF77E, 0x2631,
- 0xF780, 0xF7A0, 0x541C, 0xF7A1, 0xF7FE, 0x1DB9, 0xF840, 0xF841, 0x543D,
- 0xF842, 0xF842, 0x209C, 0xF843, 0xF845, 0x543F, 0xF846, 0xF846, 0x2580,
- 0xF847, 0xF848, 0x5442, 0xF849, 0xF849, 0x22DC, 0xF84A, 0xF84F, 0x5444,
- 0xF850, 0xF850, 0x1F05, 0xF851, 0xF851, 0x208B, 0xF852, 0xF852, 0x544A,
- 0xF853, 0xF853, 0x2581, 0xF854, 0xF862, 0x544B, 0xF863, 0xF863, 0x2583,
- 0xF864, 0xF864, 0x2582, 0xF865, 0xF865, 0x545A, 0xF866, 0xF866, 0x21EE,
- 0xF867, 0xF871, 0x545B, 0xF872, 0xF872, 0x2182, 0xF873, 0xF877, 0x5466,
- 0xF878, 0xF878, 0x2243, 0xF879, 0xF879, 0x546B, 0xF87A, 0xF87A, 0x2587,
- 0xF87B, 0xF87B, 0x546C, 0xF87C, 0xF87C, 0x2588, 0xF87D, 0xF87E, 0x546D,
- 0xF880, 0xF880, 0x546F, 0xF881, 0xF881, 0x2584, 0xF882, 0xF883, 0x5470,
- 0xF884, 0xF884, 0x21FD, 0xF885, 0xF885, 0x5472, 0xF886, 0xF886, 0x21EF,
- 0xF887, 0xF88C, 0x5473, 0xF88D, 0xF88D, 0x258A, 0xF88E, 0xF88E, 0x258C,
- 0xF88F, 0xF898, 0x5479, 0xF899, 0xF899, 0x1F47, 0xF89A, 0xF89C, 0x5483,
- 0xF89D, 0xF89D, 0x1F1D, 0xF89E, 0xF89F, 0x5486, 0xF8A0, 0xF8A0, 0x258D,
- 0xF940, 0xF94D, 0x5488, 0xF94E, 0xF94E, 0x1FD0, 0xF94F, 0xF94F, 0x2592,
- 0xF950, 0xF950, 0x258F, 0xF951, 0xF958, 0x5496, 0xF959, 0xF959, 0x2594,
- 0xF95A, 0xF95A, 0x1EE0, 0xF95B, 0xF95C, 0x549E, 0xF95D, 0xF95D, 0x2591,
- 0xF95E, 0xF95E, 0x2595, 0xF95F, 0xF966, 0x54A0, 0xF967, 0xF967, 0x2597,
- 0xF968, 0xF968, 0x54A8, 0xF969, 0xF969, 0x20B6, 0xF96A, 0xF96B, 0x54A9,
- 0xF96C, 0xF96C, 0x2598, 0xF96D, 0xF96E, 0x54AB, 0xF96F, 0xF96F, 0x20F6,
- 0xF970, 0xF97E, 0x54AD, 0xF980, 0xF984, 0x54BC, 0xF985, 0xF985, 0x2585,
- 0xF986, 0xF986, 0x54C1, 0xF987, 0xF987, 0x2599, 0xF988, 0xF990, 0x54C2,
- 0xF991, 0xF991, 0x2596, 0xF992, 0xF995, 0x54CB, 0xF996, 0xF996, 0x259A,
- 0xF997, 0xF997, 0x54CF, 0xF998, 0xF998, 0x259B, 0xF999, 0xF9A0, 0x54D0,
- 0xFA40, 0xFA41, 0x54D8, 0xFA42, 0xFA42, 0x259D, 0xFA43, 0xFA45, 0x54DA,
- 0xFA46, 0xFA46, 0x259E, 0xFA47, 0xFA4B, 0x54DD, 0xFA4C, 0xFA4C, 0x234C,
- 0xFA4D, 0xFA50, 0x54E2, 0xFA51, 0xFA51, 0x1F44, 0xFA52, 0xFA57, 0x54E6,
- 0xFA58, 0xFA58, 0x2660, 0xFA59, 0xFA59, 0x25A0, 0xFA5A, 0xFA5C, 0x54EC,
- 0xFA5D, 0xFA5D, 0x259C, 0xFA5E, 0xFA5E, 0x54EF, 0xFA5F, 0xFA5F, 0x259F,
- 0xFA60, 0xFA60, 0x54F0, 0xFA61, 0xFA61, 0x1F6C, 0xFA62, 0xFA6F, 0x54F1,
- 0xFA70, 0xFA70, 0x25A2, 0xFA71, 0xFA73, 0x54FF, 0xFA74, 0xFA74, 0x20AE,
- 0xFA75, 0xFA75, 0x5502, 0xFA76, 0xFA76, 0x258B, 0xFA77, 0xFA77, 0x25A3,
- 0xFA78, 0xFA7E, 0x5503, 0xFA80, 0xFA82, 0x550A, 0xFA83, 0xFA83, 0x2589,
- 0xFA84, 0xFA84, 0x25A5, 0xFA85, 0xFA8C, 0x550D, 0xFA8D, 0xFA8D, 0x25A4,
- 0xFA8E, 0xFA8F, 0x5515, 0xFA90, 0xFA90, 0x25A6, 0xFA91, 0xFA91, 0x2593,
- 0xFA92, 0xFA95, 0x5517, 0xFA96, 0xFA96, 0x25A7, 0xFA97, 0xFA97, 0x2222,
- 0xFA98, 0xFA98, 0x25A9, 0xFA99, 0xFAA0, 0x551B, 0xFB40, 0xFB48, 0x5523,
- 0xFB49, 0xFB49, 0x25A8, 0xFB4A, 0xFB51, 0x552C, 0xFB52, 0xFB52, 0x2586,
- 0xFB53, 0xFB56, 0x5534, 0xFB57, 0xFB57, 0x25A1, 0xFB58, 0xFB58, 0x25AA,
- 0xFB59, 0xFB59, 0x5538, 0xFB5A, 0xFB5A, 0x2590, 0xFB5B, 0xFB5B, 0x258E,
- 0xFB5C, 0xFB74, 0x5539, 0xFB75, 0xFB75, 0x2688, 0xFB76, 0xFB78, 0x5552,
- 0xFB79, 0xFB79, 0x269E, 0xFB7A, 0xFB7A, 0x25FB, 0xFB7B, 0xFB7B, 0x5555,
- 0xFB7C, 0xFB7C, 0x1F8C, 0xFB7D, 0xFB7D, 0x21F4, 0xFB7E, 0xFB7E, 0x5556,
- 0xFB80, 0xFB8F, 0x5557, 0xFB90, 0xFB90, 0x200F, 0xFB91, 0xFB9B, 0x5567,
- 0xFB9C, 0xFB9C, 0x2071, 0xFB9D, 0xFB9E, 0x5572, 0xFB9F, 0xFB9F, 0x25F7,
- 0xFBA0, 0xFBA0, 0x5574, 0xFC40, 0xFC43, 0x5575, 0xFC44, 0xFC44, 0x2696,
- 0xFC45, 0xFC48, 0x5579, 0xFC49, 0xFC49, 0x268F, 0xFC4A, 0xFC59, 0x557D,
- 0xFC5A, 0xFC5A, 0x22DA, 0xFC5B, 0xFC62, 0x558D, 0xFC63, 0xFC63, 0x1EC1,
- 0xFC64, 0xFC67, 0x5595, 0xFC68, 0xFC68, 0x1EB3, 0xFC69, 0xFC6E, 0x5599,
- 0xFC6F, 0xFC6F, 0x266A, 0xFC70, 0xFC70, 0x559F, 0xFC71, 0xFC71, 0x268A,
- 0xFC72, 0xFC73, 0x55A0, 0xFC74, 0xFC74, 0x2669, 0xFC75, 0xFC76, 0x55A2,
- 0xFC77, 0xFC78, 0x2618, 0xFC79, 0xFC7E, 0x55A4, 0xFC80, 0xFC82, 0x55AA,
- 0xFC83, 0xFC83, 0x261A, 0xFC84, 0xFC89, 0x55AD, 0xFC8A, 0xFC8A, 0x2673,
- 0xFC8B, 0xFCA0, 0x55B3, 0xFD40, 0xFD51, 0x55C9, 0xFD52, 0xFD52, 0x20C6,
- 0xFD53, 0xFD53, 0x226B, 0xFD54, 0xFD56, 0x55DB, 0xFD57, 0xFD57, 0x24D3,
- 0xFD58, 0xFD58, 0x1E86, 0xFD59, 0xFD59, 0x55DE, 0xFD5A, 0xFD5A, 0x260F,
- 0xFD5B, 0xFD5E, 0x55DF, 0xFD5F, 0xFD5F, 0x2611, 0xFD60, 0xFD61, 0x55E3,
- 0xFD62, 0xFD62, 0x2613, 0xFD63, 0xFD64, 0x55E5, 0xFD65, 0xFD65, 0x2610,
- 0xFD66, 0xFD66, 0x2612, 0xFD67, 0xFD67, 0x2030, 0xFD68, 0xFD68, 0x55E7,
- 0xFD69, 0xFD69, 0x2671, 0xFD6A, 0xFD6B, 0x55E8, 0xFD6C, 0xFD6C, 0x2614,
- 0xFD6D, 0xFD6F, 0x55EA, 0xFD70, 0xFD70, 0x2616, 0xFD71, 0xFD71, 0x55ED,
- 0xFD72, 0xFD72, 0x2615, 0xFD73, 0xFD77, 0x55EE, 0xFD78, 0xFD78, 0x20F2,
- 0xFD79, 0xFD7C, 0x55F3, 0xFD7D, 0xFD7D, 0x2617, 0xFD7E, 0xFD7E, 0x55F7,
- 0xFD80, 0xFD87, 0x55F8, 0xFD88, 0xFD88, 0x2037, 0xFD89, 0xFD8A, 0x5600,
- 0xFD8B, 0xFD8B, 0x20B3, 0xFD8C, 0xFD8E, 0x5602, 0xFD8F, 0xFD8F, 0x1F22,
- 0xFD90, 0xFD90, 0x24ED, 0xFD91, 0xFD93, 0x5605, 0xFD94, 0xFD94, 0x1F34,
- 0xFD95, 0xFD9C, 0x5608, 0xFD9D, 0xFD9D, 0x0A02, 0xFD9E, 0xFD9E, 0x40D3,
- 0xFD9F, 0xFD9F, 0x200C, 0xFDA0, 0xFDA0, 0x5083, 0xFE40, 0xFE40, 0x1259,
- 0xFE41, 0xFE7E, 0x5610, 0xFE80, 0xFEA0, 0x564E,
-};
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_GBKp_EUC_H_2[4070 * 3] = {
+ 0x0020, 0x007E, 0x0001, 0x8140, 0x8178, 0x2758, 0x8179, 0x8179, 0x2059,
+ 0x817A, 0x817E, 0x2791, 0x8180, 0x8185, 0x2796, 0x8186, 0x8186, 0x21F1,
+ 0x8187, 0x81EC, 0x279C, 0x81ED, 0x81ED, 0x1FF2, 0x81EE, 0x81F5, 0x2802,
+ 0x81F6, 0x81F6, 0x205D, 0x81F7, 0x81FE, 0x280A, 0x8240, 0x8252, 0x2812,
+ 0x8253, 0x8253, 0x269C, 0x8254, 0x8261, 0x2825, 0x8262, 0x8262, 0x21B5,
+ 0x8263, 0x8273, 0x2833, 0x8274, 0x8274, 0x22CC, 0x8275, 0x8279, 0x2844,
+ 0x827A, 0x827A, 0x2016, 0x827B, 0x827C, 0x2849, 0x827D, 0x827D, 0x1E62,
+ 0x827E, 0x827E, 0x284B, 0x8280, 0x8280, 0x1F20, 0x8281, 0x8282, 0x284C,
+ 0x8283, 0x8283, 0x207F, 0x8284, 0x828F, 0x284E, 0x8290, 0x8290, 0x205C,
+ 0x8291, 0x82A4, 0x285A, 0x82A5, 0x82A5, 0x2194, 0x82A6, 0x82C7, 0x286E,
+ 0x82C8, 0x82C8, 0x1E65, 0x82C9, 0x82C9, 0x2281, 0x82CA, 0x82E0, 0x2890,
+ 0x82E1, 0x82E1, 0x22CD, 0x82E2, 0x82E2, 0x28A7, 0x82E3, 0x82E3, 0x210A,
+ 0x82E4, 0x82E4, 0x1E3E, 0x82E5, 0x82EC, 0x28A8, 0x82ED, 0x82ED, 0x267F,
+ 0x82EE, 0x82F1, 0x28B0, 0x82F2, 0x82F2, 0x222E, 0x82F3, 0x82F6, 0x28B4,
+ 0x82F7, 0x82F7, 0x1E96, 0x82F8, 0x82F8, 0x22CB, 0x82F9, 0x82F9, 0x226C,
+ 0x82FA, 0x82FA, 0x28B8, 0x82FB, 0x82FB, 0x2117, 0x82FC, 0x82FE, 0x28B9,
+ 0x8340, 0x8340, 0x28BC, 0x8341, 0x8341, 0x20E8, 0x8342, 0x8344, 0x28BD,
+ 0x8345, 0x8345, 0x22D4, 0x8346, 0x8347, 0x28C0, 0x8348, 0x8348, 0x1FB9,
+ 0x8349, 0x834B, 0x28C2, 0x834C, 0x834C, 0x22D8, 0x834D, 0x8352, 0x28C5,
+ 0x8353, 0x8353, 0x20DF, 0x8354, 0x8356, 0x28CB, 0x8357, 0x8357, 0x20C2,
+ 0x8358, 0x835D, 0x28CE, 0x835E, 0x835E, 0x2195, 0x835F, 0x8364, 0x28D4,
+ 0x8365, 0x8365, 0x1FAC, 0x8366, 0x8366, 0x22D3, 0x8367, 0x8371, 0x28DA,
+ 0x8372, 0x8372, 0x1F81, 0x8373, 0x8377, 0x28E5, 0x8378, 0x8378, 0x2210,
+ 0x8379, 0x8379, 0x28EA, 0x837A, 0x837A, 0x22CF, 0x837B, 0x837B, 0x28EB,
+ 0x837C, 0x837C, 0x2213, 0x837D, 0x837D, 0x28EC, 0x837E, 0x837E, 0x1FE4,
+ 0x8380, 0x8380, 0x1F90, 0x8381, 0x8385, 0x28ED, 0x8386, 0x8386, 0x22D6,
+ 0x8387, 0x8388, 0x28F2, 0x8389, 0x8389, 0x22D0, 0x838A, 0x838A, 0x22CE,
+ 0x838B, 0x838C, 0x28F4, 0x838D, 0x838D, 0x2681, 0x838E, 0x8393, 0x28F6,
+ 0x8394, 0x8394, 0x1E76, 0x8395, 0x839D, 0x28FC, 0x839E, 0x839E, 0x2231,
+ 0x839F, 0x83A5, 0x2905, 0x83A6, 0x83A6, 0x1E93, 0x83A7, 0x83AA, 0x290C,
+ 0x83AB, 0x83AB, 0x22D2, 0x83AC, 0x83AD, 0x2910, 0x83AE, 0x83AE, 0x22D7,
+ 0x83AF, 0x83AF, 0x22D5, 0x83B0, 0x83B0, 0x22D1, 0x83B1, 0x83B9, 0x2912,
+ 0x83BA, 0x83BA, 0x1EE5, 0x83BB, 0x83C8, 0x291B, 0x83C9, 0x83C9, 0x2025,
+ 0x83CA, 0x83F5, 0x2929, 0x83F6, 0x83F6, 0x1ECF, 0x83F7, 0x83FE, 0x2955,
+ 0x8440, 0x844F, 0x295D, 0x8450, 0x8450, 0x1FD9, 0x8451, 0x8470, 0x296D,
+ 0x8471, 0x8471, 0x22C8, 0x8472, 0x8473, 0x298D, 0x8474, 0x8474, 0x2263,
+ 0x8475, 0x8476, 0x298F, 0x8477, 0x8477, 0x2683, 0x8478, 0x847E, 0x2991,
+ 0x8480, 0x8481, 0x2998, 0x8482, 0x8482, 0x1F17, 0x8483, 0x848D, 0x299A,
+ 0x848E, 0x848E, 0x1F2B, 0x848F, 0x8491, 0x29A5, 0x8492, 0x8492, 0x22CA,
+ 0x8493, 0x8493, 0x1E99, 0x8494, 0x849C, 0x29A8, 0x849D, 0x849D, 0x1F4F,
+ 0x849E, 0x84A0, 0x29B1, 0x84A1, 0x84A1, 0x1FCF, 0x84A2, 0x84A2, 0x2036,
+ 0x84A3, 0x84A3, 0x1F3A, 0x84A4, 0x84A4, 0x29B4, 0x84A5, 0x84A5, 0x22C9,
+ 0x84A6, 0x84A6, 0x1F99, 0x84A7, 0x84A8, 0x29B5, 0x84A9, 0x84A9, 0x1F75,
+ 0x84AA, 0x84C4, 0x29B7, 0x84C5, 0x84C5, 0x1FBE, 0x84C6, 0x84D2, 0x29D2,
+ 0x84D3, 0x84D3, 0x1ECD, 0x84D4, 0x84D4, 0x29DF, 0x84D5, 0x84D5, 0x21A9,
+ 0x84D6, 0x84D6, 0x29E0, 0x84D7, 0x84D7, 0x21E6, 0x84D8, 0x84D8, 0x29E1,
+ 0x84D9, 0x84D9, 0x2127, 0x84DA, 0x84DA, 0x2003, 0x84DB, 0x84DC, 0x29E2,
+ 0x84DD, 0x84DD, 0x2132, 0x84DE, 0x84E9, 0x29E4, 0x84EA, 0x84EA, 0x2323,
+ 0x84EB, 0x84ED, 0x29F0, 0x84EE, 0x84EE, 0x2011, 0x84EF, 0x84F0, 0x29F3,
+ 0x84F1, 0x84F1, 0x20F5, 0x84F2, 0x84FE, 0x29F5, 0x8540, 0x8550, 0x2A02,
+ 0x8551, 0x8551, 0x22C5, 0x8552, 0x8552, 0x1F5E, 0x8553, 0x8553, 0x2A13,
+ 0x8554, 0x8554, 0x22C6, 0x8555, 0x855D, 0x2A14, 0x855E, 0x855E, 0x20EF,
+ 0x855F, 0x8565, 0x2A1D, 0x8566, 0x8566, 0x21D0, 0x8567, 0x857E, 0x2A24,
+ 0x8580, 0x8586, 0x2A3C, 0x8587, 0x8587, 0x22C1, 0x8588, 0x858A, 0x2A43,
+ 0x858B, 0x858B, 0x1E64, 0x858C, 0x8591, 0x2A46, 0x8592, 0x8592, 0x21F9,
+ 0x8593, 0x8595, 0x2A4C, 0x8596, 0x8596, 0x2010, 0x8597, 0x8597, 0x2A4F,
+ 0x8598, 0x8598, 0x22C2, 0x8599, 0x85A1, 0x2A50, 0x85A2, 0x85A2, 0x1E5A,
+ 0x85A3, 0x85B1, 0x2A59, 0x85B2, 0x85B2, 0x1EA2, 0x85B3, 0x85FE, 0x2A68,
+ 0x8640, 0x8649, 0x2AB4, 0x864A, 0x864A, 0x236D, 0x864B, 0x8653, 0x2ABE,
+ 0x8654, 0x8654, 0x2247, 0x8655, 0x8667, 0x2AC7, 0x8668, 0x8668, 0x236C,
+ 0x8669, 0x867E, 0x2ADA, 0x8680, 0x8695, 0x2AF0, 0x8696, 0x8696, 0x219C,
+ 0x8697, 0x8698, 0x2B06, 0x8699, 0x8699, 0x20C9, 0x869A, 0x86A0, 0x2B08,
+ 0x86A1, 0x86A1, 0x21F0, 0x86A2, 0x86C9, 0x2B0F, 0x86CA, 0x86CA, 0x210B,
+ 0x86CB, 0x86CB, 0x2B37, 0x86CC, 0x86CC, 0x20DE, 0x86CD, 0x86CD, 0x2B38,
+ 0x86CE, 0x86CE, 0x1EAA, 0x86CF, 0x86D0, 0x2B39, 0x86D1, 0x86D1, 0x222C,
+ 0x86D2, 0x86DB, 0x2B3B, 0x86DC, 0x86DC, 0x20D8, 0x86DD, 0x86DD, 0x22C0,
+ 0x86DE, 0x86E0, 0x2B45, 0x86E1, 0x86E1, 0x206F, 0x86E2, 0x86E7, 0x2B48,
+ 0x86E8, 0x86E8, 0x21A1, 0x86E9, 0x86ED, 0x2B4E, 0x86EE, 0x86EE, 0x2379,
+ 0x86EF, 0x86F3, 0x2B53, 0x86F4, 0x86F4, 0x2372, 0x86F5, 0x86FE, 0x2B58,
+ 0x8740, 0x8740, 0x216A, 0x8741, 0x8743, 0x2B62, 0x8744, 0x8744, 0x237C,
+ 0x8745, 0x8748, 0x2B65, 0x8749, 0x8749, 0x20B0, 0x874A, 0x874A, 0x2B69,
+ 0x874B, 0x874B, 0x237A, 0x874C, 0x874C, 0x1E74, 0x874D, 0x874E, 0x2B6A,
+ 0x874F, 0x874F, 0x2377, 0x8750, 0x8756, 0x2B6C, 0x8757, 0x8757, 0x1F4C,
+ 0x8758, 0x8759, 0x2B73, 0x875A, 0x875A, 0x2378, 0x875B, 0x875B, 0x21CF,
+ 0x875C, 0x875C, 0x2368, 0x875D, 0x875D, 0x2B75, 0x875E, 0x875E, 0x2371,
+ 0x875F, 0x875F, 0x2B76, 0x8760, 0x8760, 0x2369, 0x8761, 0x8765, 0x2B77,
+ 0x8766, 0x8766, 0x2674, 0x8767, 0x8779, 0x2B7C, 0x877A, 0x877A, 0x236F,
+ 0x877B, 0x877C, 0x2B8F, 0x877D, 0x877D, 0x2370, 0x877E, 0x877E, 0x2B91,
+ 0x8780, 0x8780, 0x2B92, 0x8781, 0x8781, 0x2376, 0x8782, 0x8782, 0x2373,
+ 0x8783, 0x8785, 0x2B93, 0x8786, 0x8786, 0x237F, 0x8787, 0x8787, 0x2B96,
+ 0x8788, 0x8788, 0x2374, 0x8789, 0x8789, 0x2B97, 0x878A, 0x878A, 0x20B5,
+ 0x878B, 0x878C, 0x2B98, 0x878D, 0x878D, 0x1EDB, 0x878E, 0x878E, 0x2672,
+ 0x878F, 0x8792, 0x2B9A, 0x8793, 0x8793, 0x236E, 0x8794, 0x8797, 0x2B9E,
+ 0x8798, 0x8798, 0x21B7, 0x8799, 0x879C, 0x2BA2, 0x879D, 0x879D, 0x2375,
+ 0x879E, 0x87A2, 0x2BA6, 0x87A3, 0x87A3, 0x2382, 0x87A4, 0x87A6, 0x2BAB,
+ 0x87A7, 0x87A7, 0x209E, 0x87A8, 0x87B2, 0x2BAE, 0x87B3, 0x87B3, 0x236B,
+ 0x87B4, 0x87B4, 0x2BB9, 0x87B5, 0x87B5, 0x2039, 0x87B6, 0x87BA, 0x2BBA,
+ 0x87BB, 0x87BB, 0x269F, 0x87BC, 0x87BE, 0x2BBF, 0x87BF, 0x87BF, 0x237D,
+ 0x87C0, 0x87C0, 0x21F5, 0x87C1, 0x87C1, 0x2BC2, 0x87C2, 0x87C2, 0x2381,
+ 0x87C3, 0x87C9, 0x2BC3, 0x87CA, 0x87CA, 0x237B, 0x87CB, 0x87CB, 0x237E,
+ 0x87CC, 0x87CC, 0x21CC, 0x87CD, 0x87CE, 0x2BCA, 0x87CF, 0x87CF, 0x22DB,
+ 0x87D0, 0x87D1, 0x2BCC, 0x87D2, 0x87D2, 0x236A, 0x87D3, 0x87D3, 0x2689,
+ 0x87D4, 0x87D4, 0x2BCE, 0x87D5, 0x87D5, 0x2697, 0x87D6, 0x87D9, 0x2BCF,
+ 0x87DA, 0x87DA, 0x22A1, 0x87DB, 0x87F6, 0x2BD3, 0x87F7, 0x87F7, 0x2383,
+ 0x87F8, 0x87F8, 0x1F3D, 0x87F9, 0x87F9, 0x2BEF, 0x87FA, 0x87FA, 0x218F,
+ 0x87FB, 0x87FE, 0x2BF0, 0x8840, 0x8840, 0x2246, 0x8841, 0x8841, 0x2248,
+ 0x8842, 0x8843, 0x2BF4, 0x8844, 0x8844, 0x217E, 0x8845, 0x8845, 0x2BF6,
+ 0x8846, 0x8846, 0x2180, 0x8847, 0x887E, 0x2BF7, 0x8880, 0x88B9, 0x2C2F,
+ 0x88BA, 0x88BA, 0x232A, 0x88BB, 0x88CB, 0x2C69, 0x88CC, 0x88CC, 0x228B,
+ 0x88CD, 0x88D3, 0x2C7A, 0x88D4, 0x88D4, 0x1F85, 0x88D5, 0x88D6, 0x2C81,
+ 0x88D7, 0x88D7, 0x2325, 0x88D8, 0x88DE, 0x2C83, 0x88DF, 0x88DF, 0x232C,
+ 0x88E0, 0x88E4, 0x2C8A, 0x88E5, 0x88E5, 0x232E, 0x88E6, 0x88F1, 0x2C8F,
+ 0x88F2, 0x88F2, 0x2205, 0x88F3, 0x88F3, 0x1E38, 0x88F4, 0x88F5, 0x2C9B,
+ 0x88F6, 0x88F6, 0x1E73, 0x88F7, 0x88FE, 0x2C9D, 0x8940, 0x894A, 0x2CA5,
+ 0x894B, 0x894B, 0x1FE3, 0x894C, 0x894C, 0x2339, 0x894D, 0x894D, 0x2CB0,
+ 0x894E, 0x894E, 0x232B, 0x894F, 0x894F, 0x2CB1, 0x8950, 0x8950, 0x232D,
+ 0x8951, 0x8953, 0x2CB2, 0x8954, 0x8954, 0x217F, 0x8955, 0x895C, 0x2CB5,
+ 0x895D, 0x895D, 0x21A7, 0x895E, 0x895E, 0x2CBD, 0x895F, 0x895F, 0x232F,
+ 0x8960, 0x896C, 0x2CBE, 0x896D, 0x896D, 0x1E7D, 0x896E, 0x8970, 0x2CCB,
+ 0x8971, 0x8971, 0x20D6, 0x8972, 0x897B, 0x2CCE, 0x897C, 0x897C, 0x1EC2,
+ 0x897D, 0x897E, 0x2CD8, 0x8980, 0x898A, 0x2CDA, 0x898B, 0x898B, 0x22B2,
+ 0x898C, 0x8998, 0x2CE5, 0x8999, 0x8999, 0x1EDF, 0x899A, 0x899D, 0x2CF2,
+ 0x899E, 0x899E, 0x1EF9, 0x899F, 0x89A5, 0x2CF6, 0x89A6, 0x89A6, 0x20D9,
+ 0x89A7, 0x89A7, 0x2CFD, 0x89A8, 0x89A8, 0x1FDD, 0x89A9, 0x89AE, 0x2CFE,
+ 0x89AF, 0x89AF, 0x2167, 0x89B0, 0x89B9, 0x2D04, 0x89BA, 0x89BA, 0x21ED,
+ 0x89BB, 0x89BD, 0x2D0E, 0x89BE, 0x89BE, 0x2007, 0x89BF, 0x89BF, 0x2326,
+ 0x89C0, 0x89C0, 0x2329, 0x89C1, 0x89C3, 0x2D11, 0x89C4, 0x89C4, 0x1F52,
+ 0x89C5, 0x89C5, 0x203B, 0x89C6, 0x89C6, 0x2328, 0x89C7, 0x89C7, 0x2D14,
+ 0x89C8, 0x89C8, 0x2327, 0x89C9, 0x89CD, 0x2D15, 0x89CE, 0x89CE, 0x1E2B,
+ 0x89CF, 0x89D0, 0x2D1A, 0x89D1, 0x89D1, 0x22AE, 0x89D2, 0x89D7, 0x2D1C,
+ 0x89D8, 0x89D8, 0x1F49, 0x89D9, 0x89DA, 0x2D22, 0x89DB, 0x89DB, 0x2138,
+ 0x89DC, 0x89F3, 0x2D24, 0x89F4, 0x89F4, 0x2081, 0x89F5, 0x89FE, 0x2D3C,
+ 0x8A40, 0x8A40, 0x2D46, 0x8A41, 0x8A41, 0x1F7C, 0x8A42, 0x8A58, 0x2D47,
+ 0x8A59, 0x8A59, 0x235B, 0x8A5A, 0x8A5A, 0x1EDE, 0x8A5B, 0x8A5B, 0x2D5E,
+ 0x8A5C, 0x8A5C, 0x1FA2, 0x8A5D, 0x8A5D, 0x2D5F, 0x8A5E, 0x8A5E, 0x1EFA,
+ 0x8A5F, 0x8A78, 0x2D60, 0x8A79, 0x8A79, 0x22AD, 0x8A7A, 0x8A7E, 0x2D7A,
+ 0x8A80, 0x8AE3, 0x2D7F, 0x8AE4, 0x8AE4, 0x203F, 0x8AE5, 0x8AFE, 0x2DE3,
+ 0x8B40, 0x8B43, 0x2DFD, 0x8B44, 0x8B44, 0x1F0E, 0x8B45, 0x8B48, 0x2E01,
+ 0x8B49, 0x8B49, 0x23F9, 0x8B4A, 0x8B79, 0x2E05, 0x8B7A, 0x8B7A, 0x23FC,
+ 0x8B7B, 0x8B7E, 0x2E35, 0x8B80, 0x8B8B, 0x2E39, 0x8B8C, 0x8B8C, 0x2069,
+ 0x8B8D, 0x8B9D, 0x2E45, 0x8B9E, 0x8B9E, 0x23F7, 0x8B9F, 0x8BB2, 0x2E56,
+ 0x8BB3, 0x8BB3, 0x23F6, 0x8BB4, 0x8BB8, 0x2E6A, 0x8BB9, 0x8BB9, 0x23FD,
+ 0x8BBA, 0x8BBD, 0x2E6F, 0x8BBE, 0x8BBE, 0x23F8, 0x8BBF, 0x8BC5, 0x2E73,
+ 0x8BC6, 0x8BC6, 0x23FA, 0x8BC7, 0x8BC7, 0x2E7A, 0x8BC8, 0x8BC8, 0x23FE,
+ 0x8BC9, 0x8BC9, 0x1FA8, 0x8BCA, 0x8BD3, 0x2E7B, 0x8BD4, 0x8BD4, 0x2401,
+ 0x8BD5, 0x8BDB, 0x2E85, 0x8BDC, 0x8BDC, 0x23FF, 0x8BDD, 0x8BE4, 0x2E8C,
+ 0x8BE5, 0x8BE5, 0x2400, 0x8BE6, 0x8BEA, 0x2E94, 0x8BEB, 0x8BEB, 0x2221,
+ 0x8BEC, 0x8BEF, 0x2E99, 0x8BF0, 0x8BF0, 0x2122, 0x8BF1, 0x8BFE, 0x2E9D,
+ 0x8C40, 0x8C43, 0x2EAB, 0x8C44, 0x8C44, 0x23FB, 0x8C45, 0x8C4E, 0x2EAF,
+ 0x8C4F, 0x8C4F, 0x215A, 0x8C50, 0x8C56, 0x2EB9, 0x8C57, 0x8C57, 0x21E5,
+ 0x8C58, 0x8C5B, 0x2EC0, 0x8C5C, 0x8C5C, 0x2057, 0x8C5D, 0x8C7E, 0x2EC4,
+ 0x8C80, 0x8C8A, 0x2EE6, 0x8C8B, 0x8C8B, 0x20E5, 0x8C8C, 0x8C8C, 0x2EF1,
+ 0x8C8D, 0x8C8D, 0x212F, 0x8C8E, 0x8C8E, 0x20A3, 0x8C8F, 0x8C8F, 0x2121,
+ 0x8C90, 0x8C90, 0x2EF2, 0x8C91, 0x8C91, 0x21D4, 0x8C92, 0x8C92, 0x1FE5,
+ 0x8C93, 0x8C98, 0x2EF3, 0x8C99, 0x8C99, 0x1E8A, 0x8C9A, 0x8C9A, 0x1E37,
+ 0x8C9B, 0x8CA1, 0x2EF9, 0x8CA2, 0x8CA2, 0x1F9E, 0x8CA3, 0x8CA3, 0x22A6,
+ 0x8CA4, 0x8CA4, 0x21E8, 0x8CA5, 0x8CA5, 0x2F00, 0x8CA6, 0x8CA6, 0x1EDA,
+ 0x8CA7, 0x8CA7, 0x1EB9, 0x8CA8, 0x8CBF, 0x2F01, 0x8CC0, 0x8CC0, 0x235C,
+ 0x8CC1, 0x8CD1, 0x2F19, 0x8CD2, 0x8CD2, 0x2050, 0x8CD3, 0x8CD3, 0x1E67,
+ 0x8CD4, 0x8CD4, 0x2F2A, 0x8CD5, 0x8CD5, 0x23F4, 0x8CD6, 0x8CD8, 0x2F2B,
+ 0x8CD9, 0x8CD9, 0x213E, 0x8CDA, 0x8CF8, 0x2F2E, 0x8CF9, 0x8CF9, 0x1F16,
+ 0x8CFA, 0x8CFE, 0x2F4D, 0x8D40, 0x8D72, 0x2F52, 0x8D73, 0x8D73, 0x2389,
+ 0x8D74, 0x8D74, 0x2F85, 0x8D75, 0x8D75, 0x1EB7, 0x8D76, 0x8D7A, 0x2F86,
+ 0x8D7B, 0x8D7B, 0x21B4, 0x8D7C, 0x8D7E, 0x2F8B, 0x8D80, 0x8D87, 0x2F8E,
+ 0x8D88, 0x8D88, 0x238F, 0x8D89, 0x8D8E, 0x2F96, 0x8D8F, 0x8D8F, 0x1F1A,
+ 0x8D90, 0x8D9D, 0x2F9C, 0x8D9E, 0x8D9E, 0x238B, 0x8D9F, 0x8DB8, 0x2FAA,
+ 0x8DB9, 0x8DB9, 0x238A, 0x8DBA, 0x8DE1, 0x2FC4, 0x8DE2, 0x8DE2, 0x2391,
+ 0x8DE3, 0x8DE3, 0x2FEC, 0x8DE4, 0x8DE4, 0x2271, 0x8DE5, 0x8DE6, 0x2FED,
+ 0x8DE7, 0x8DE7, 0x2388, 0x8DE8, 0x8DF6, 0x2FEF, 0x8DF7, 0x8DF7, 0x238E,
+ 0x8DF8, 0x8DFD, 0x2FFE, 0x8DFE, 0x8DFE, 0x238D, 0x8E40, 0x8E45, 0x3004,
+ 0x8E46, 0x8E46, 0x238C, 0x8E47, 0x8E55, 0x300A, 0x8E56, 0x8E56, 0x2390,
+ 0x8E57, 0x8E57, 0x3019, 0x8E58, 0x8E58, 0x2033, 0x8E59, 0x8E59, 0x301A,
+ 0x8E5A, 0x8E5A, 0x223C, 0x8E5B, 0x8E67, 0x301B, 0x8E68, 0x8E68, 0x1FE9,
+ 0x8E69, 0x8E6D, 0x3028, 0x8E6E, 0x8E6E, 0x2055, 0x8E6F, 0x8E6F, 0x302D,
+ 0x8E70, 0x8E70, 0x2392, 0x8E71, 0x8E7E, 0x302E, 0x8E80, 0x8E80, 0x2324,
+ 0x8E81, 0x8E9A, 0x303C, 0x8E9B, 0x8E9B, 0x2143, 0x8E9C, 0x8E9E, 0x3056,
+ 0x8E9F, 0x8E9F, 0x2129, 0x8EA0, 0x8EA3, 0x3059, 0x8EA4, 0x8EA4, 0x2277,
+ 0x8EA5, 0x8EA6, 0x305D, 0x8EA7, 0x8EA7, 0x1EA7, 0x8EA8, 0x8EAB, 0x305F,
+ 0x8EAC, 0x8EAC, 0x2285, 0x8EAD, 0x8EAD, 0x3063, 0x8EAE, 0x8EAE, 0x2384,
+ 0x8EAF, 0x8EBC, 0x3064, 0x8EBD, 0x8EBD, 0x2387, 0x8EBE, 0x8EBE, 0x2386,
+ 0x8EBF, 0x8EC2, 0x3072, 0x8EC3, 0x8EC3, 0x2290, 0x8EC4, 0x8EC4, 0x3076,
+ 0x8EC5, 0x8EC5, 0x1E44, 0x8EC6, 0x8ECC, 0x3077, 0x8ECD, 0x8ECD, 0x1E32,
+ 0x8ECE, 0x8ECE, 0x2385, 0x8ECF, 0x8ED5, 0x307E, 0x8ED6, 0x8ED6, 0x1F13,
+ 0x8ED7, 0x8ED7, 0x1F73, 0x8ED8, 0x8EEB, 0x3085, 0x8EEC, 0x8EEC, 0x1FE0,
+ 0x8EED, 0x8EFE, 0x3099, 0x8F40, 0x8F51, 0x30AB, 0x8F52, 0x8F52, 0x2087,
+ 0x8F53, 0x8F53, 0x1E78, 0x8F54, 0x8F54, 0x23AE, 0x8F55, 0x8F55, 0x1EF6,
+ 0x8F56, 0x8F56, 0x1F31, 0x8F57, 0x8F5C, 0x30BD, 0x8F5D, 0x8F5D, 0x2045,
+ 0x8F5E, 0x8F63, 0x30C3, 0x8F64, 0x8F64, 0x2178, 0x8F65, 0x8F7E, 0x30C9,
+ 0x8F80, 0x8F85, 0x30E3, 0x8F86, 0x8F86, 0x23F5, 0x8F87, 0x8F87, 0x30E9,
+ 0x8F88, 0x8F88, 0x2275, 0x8F89, 0x8F94, 0x30EA, 0x8F95, 0x8F95, 0x266E,
+ 0x8F96, 0x8F96, 0x30F6, 0x8F97, 0x8F97, 0x1EB0, 0x8F98, 0x8F9A, 0x30F7,
+ 0x8F9B, 0x8F9B, 0x2083, 0x8F9C, 0x8F9C, 0x30FA, 0x8F9D, 0x8F9D, 0x2188,
+ 0x8F9E, 0x8FA0, 0x30FB, 0x8FA1, 0x8FA1, 0x267C, 0x8FA2, 0x8FBC, 0x30FE,
+ 0x8FBD, 0x8FBD, 0x1FC5, 0x8FBE, 0x8FC3, 0x3119, 0x8FC4, 0x8FC4, 0x1EA1,
+ 0x8FC5, 0x8FC5, 0x311F, 0x8FC6, 0x8FC6, 0x2393, 0x8FC7, 0x8FCC, 0x3120,
+ 0x8FCD, 0x8FCD, 0x1F0B, 0x8FCE, 0x8FD7, 0x3126, 0x8FD8, 0x8FD8, 0x1E7C,
+ 0x8FD9, 0x8FFE, 0x3130, 0x9040, 0x907E, 0x3156, 0x9080, 0x909C, 0x3195,
+ 0x909D, 0x909D, 0x23B4, 0x909E, 0x909E, 0x207E, 0x909F, 0x90B9, 0x31B2,
+ 0x90BA, 0x90BA, 0x1EE3, 0x90BB, 0x90BF, 0x31CD, 0x90C0, 0x90C0, 0x2095,
+ 0x90C1, 0x90C1, 0x23BB, 0x90C2, 0x90C4, 0x31D2, 0x90C5, 0x90C5, 0x23B9,
+ 0x90C6, 0x90DA, 0x31D5, 0x90DB, 0x90DB, 0x1E28, 0x90DC, 0x90DC, 0x23BD,
+ 0x90DD, 0x90EC, 0x31EA, 0x90ED, 0x90ED, 0x23B5, 0x90EE, 0x90EF, 0x31FA,
+ 0x90F0, 0x90F0, 0x23BA, 0x90F1, 0x90F6, 0x31FC, 0x90F7, 0x90F7, 0x23B3,
+ 0x90F8, 0x90FE, 0x3202, 0x9140, 0x9141, 0x3209, 0x9142, 0x9142, 0x2162,
+ 0x9143, 0x914A, 0x320B, 0x914B, 0x914B, 0x1E5E, 0x914C, 0x914C, 0x3213,
+ 0x914D, 0x914D, 0x1E5D, 0x914E, 0x9150, 0x3214, 0x9151, 0x9151, 0x23B7,
+ 0x9152, 0x9153, 0x3217, 0x9154, 0x9154, 0x1F2F, 0x9155, 0x9155, 0x24DF,
+ 0x9156, 0x9158, 0x3219, 0x9159, 0x9159, 0x23B2, 0x915A, 0x915A, 0x214E,
+ 0x915B, 0x915C, 0x321C, 0x915D, 0x915D, 0x2052, 0x915E, 0x9160, 0x321E,
+ 0x9161, 0x9161, 0x23BC, 0x9162, 0x9162, 0x3221, 0x9163, 0x9163, 0x20EB,
+ 0x9164, 0x916D, 0x3222, 0x916E, 0x916E, 0x2232, 0x916F, 0x9175, 0x322C,
+ 0x9176, 0x9176, 0x1E3F, 0x9177, 0x9179, 0x3233, 0x917A, 0x917A, 0x201B,
+ 0x917B, 0x917B, 0x20BC, 0x917C, 0x917C, 0x23BE, 0x917D, 0x917E, 0x3236,
+ 0x9180, 0x9183, 0x3238, 0x9184, 0x9184, 0x1EAE, 0x9185, 0x918C, 0x323C,
+ 0x918D, 0x918D, 0x1EFB, 0x918E, 0x9190, 0x3244, 0x9191, 0x9191, 0x2089,
+ 0x9192, 0x9192, 0x3247, 0x9193, 0x9193, 0x23B1, 0x9194, 0x9196, 0x3248,
+ 0x9197, 0x9197, 0x21C4, 0x9198, 0x919A, 0x324B, 0x919B, 0x919B, 0x2214,
+ 0x919C, 0x91A8, 0x324E, 0x91A9, 0x91A9, 0x1FDE, 0x91AA, 0x91AA, 0x2223,
+ 0x91AB, 0x91AB, 0x23B6, 0x91AC, 0x91B9, 0x325B, 0x91BA, 0x91BA, 0x268C,
+ 0x91BB, 0x91BB, 0x24DE, 0x91BC, 0x91BE, 0x3269, 0x91BF, 0x91BF, 0x24E0,
+ 0x91C0, 0x91C2, 0x326C, 0x91C3, 0x91C3, 0x23B8, 0x91C4, 0x91CC, 0x326F,
+ 0x91CD, 0x91CD, 0x1E81, 0x91CE, 0x91CF, 0x3278, 0x91D0, 0x91D0, 0x1FFE,
+ 0x91D1, 0x91D1, 0x1F51, 0x91D2, 0x91D2, 0x21E1, 0x91D3, 0x91D3, 0x327A,
+ 0x91D4, 0x91D4, 0x23B0, 0x91D5, 0x91D5, 0x327B, 0x91D6, 0x91D6, 0x1FCE,
+ 0x91D7, 0x91D7, 0x327C, 0x91D8, 0x91D8, 0x211E, 0x91D9, 0x91D9, 0x2021,
+ 0x91DA, 0x91DE, 0x327D, 0x91DF, 0x91DF, 0x24E1, 0x91E0, 0x91E1, 0x3282,
+ 0x91E2, 0x91E2, 0x24A3, 0x91E3, 0x91E9, 0x3284, 0x91EA, 0x91EA, 0x24A4,
+ 0x91EB, 0x91EF, 0x328B, 0x91F0, 0x91F0, 0x2273, 0x91F1, 0x91F1, 0x3290,
+ 0x91F2, 0x91F2, 0x21B0, 0x91F3, 0x91FE, 0x3291, 0x9240, 0x927E, 0x329D,
+ 0x9280, 0x92B5, 0x32DC, 0x92B6, 0x92B6, 0x21D1, 0x92B7, 0x92CD, 0x3312,
+ 0x92CE, 0x92CE, 0x211C, 0x92CF, 0x92CF, 0x3329, 0x92D0, 0x92D0, 0x235D,
+ 0x92D1, 0x92D3, 0x332A, 0x92D4, 0x92D4, 0x2682, 0x92D5, 0x92DE, 0x332D,
+ 0x92DF, 0x92DF, 0x210D, 0x92E0, 0x92E0, 0x205A, 0x92E1, 0x92FD, 0x3337,
+ 0x92FE, 0x92FE, 0x1F8D, 0x9340, 0x934F, 0x3354, 0x9350, 0x9350, 0x21FF,
+ 0x9351, 0x935C, 0x3364, 0x935D, 0x935D, 0x1F58, 0x935E, 0x936F, 0x3370,
+ 0x9370, 0x9370, 0x215B, 0x9371, 0x9375, 0x3382, 0x9376, 0x9376, 0x1EB6,
+ 0x9377, 0x937E, 0x3387, 0x9380, 0x938B, 0x338F, 0x938C, 0x938C, 0x20DB,
+ 0x938D, 0x939C, 0x339B, 0x939D, 0x939D, 0x2360, 0x939E, 0x93A4, 0x33AB,
+ 0x93A5, 0x93A5, 0x2361, 0x93A6, 0x93A6, 0x33B2, 0x93A7, 0x93A7, 0x2040,
+ 0x93A8, 0x93B3, 0x33B3, 0x93B4, 0x93B4, 0x228E, 0x93B5, 0x93B7, 0x33BF,
+ 0x93B8, 0x93B8, 0x1FDF, 0x93B9, 0x93BA, 0x33C2, 0x93BB, 0x93BB, 0x235E,
+ 0x93BC, 0x93BC, 0x33C4, 0x93BD, 0x93BD, 0x1E6A, 0x93BE, 0x93C5, 0x33C5,
+ 0x93C6, 0x93C6, 0x2002, 0x93C7, 0x93CE, 0x33CD, 0x93CF, 0x93CF, 0x2093,
+ 0x93D0, 0x93D6, 0x33D5, 0x93D7, 0x93D7, 0x235F, 0x93D8, 0x93DA, 0x33DC,
+ 0x93DB, 0x93DB, 0x1EAC, 0x93DC, 0x93DC, 0x1E54, 0x93DD, 0x93E0, 0x33DF,
+ 0x93E1, 0x93E1, 0x1F08, 0x93E2, 0x93E3, 0x33E3, 0x93E4, 0x93E4, 0x20C0,
+ 0x93E5, 0x93E5, 0x2362, 0x93E6, 0x93E8, 0x33E5, 0x93E9, 0x93E9, 0x2160,
+ 0x93EA, 0x93EA, 0x33E8, 0x93EB, 0x93EB, 0x219D, 0x93EC, 0x93EC, 0x1F8E,
+ 0x93ED, 0x93ED, 0x222D, 0x93EE, 0x93EE, 0x33E9, 0x93EF, 0x93EF, 0x2047,
+ 0x93F0, 0x93F0, 0x33EA, 0x93F1, 0x93F1, 0x2262, 0x93F2, 0x93F3, 0x33EB,
+ 0x93F4, 0x93F4, 0x1F67, 0x93F5, 0x93F5, 0x1EB2, 0x93F6, 0x93F9, 0x33ED,
+ 0x93FA, 0x93FA, 0x1EA9, 0x93FB, 0x93FD, 0x33F1, 0x93FE, 0x93FE, 0x1FCC,
+ 0x9440, 0x9443, 0x33F4, 0x9444, 0x9444, 0x1F72, 0x9445, 0x944C, 0x33F8,
+ 0x944D, 0x944D, 0x2098, 0x944E, 0x944F, 0x3400, 0x9450, 0x9450, 0x1E52,
+ 0x9451, 0x9451, 0x20A4, 0x9452, 0x9452, 0x1F1C, 0x9453, 0x9453, 0x228F,
+ 0x9454, 0x9454, 0x3402, 0x9455, 0x9455, 0x1FED, 0x9456, 0x9457, 0x3403,
+ 0x9458, 0x9458, 0x2365, 0x9459, 0x945A, 0x3405, 0x945B, 0x945B, 0x1E2D,
+ 0x945C, 0x945C, 0x2152, 0x945D, 0x945D, 0x2366, 0x945E, 0x945E, 0x3407,
+ 0x945F, 0x945F, 0x20FA, 0x9460, 0x9463, 0x3408, 0x9464, 0x9464, 0x2363,
+ 0x9465, 0x9465, 0x340C, 0x9466, 0x9466, 0x209A, 0x9467, 0x946D, 0x340D,
+ 0x946E, 0x946E, 0x203C, 0x946F, 0x9471, 0x3414, 0x9472, 0x9472, 0x1FF6,
+ 0x9473, 0x9473, 0x3417, 0x9474, 0x9474, 0x2364, 0x9475, 0x9475, 0x3418,
+ 0x9476, 0x9476, 0x1E69, 0x9477, 0x9477, 0x3419, 0x9478, 0x9478, 0x2367,
+ 0x9479, 0x9479, 0x341A, 0x947A, 0x947A, 0x211D, 0x947B, 0x947E, 0x341B,
+ 0x9480, 0x9480, 0x2259, 0x9481, 0x9481, 0x2056, 0x9482, 0x9482, 0x2163,
+ 0x9483, 0x9486, 0x341F, 0x9487, 0x9487, 0x1FA9, 0x9488, 0x9488, 0x1FFC,
+ 0x9489, 0x94A0, 0x3423, 0x94A1, 0x94A1, 0x1E2E, 0x94A2, 0x94B2, 0x343B,
+ 0x94B3, 0x94B3, 0x1EBC, 0x94B4, 0x94B4, 0x344C, 0x94B5, 0x94B5, 0x2142,
+ 0x94B6, 0x94BE, 0x344D, 0x94BF, 0x94BF, 0x201E, 0x94C0, 0x94C0, 0x1E43,
+ 0x94C1, 0x94CB, 0x3456, 0x94CC, 0x94CC, 0x24D4, 0x94CD, 0x94D7, 0x3461,
+ 0x94D8, 0x94D8, 0x226F, 0x94D9, 0x94DF, 0x346C, 0x94E0, 0x94E0, 0x1ED7,
+ 0x94E1, 0x94FE, 0x3473, 0x9540, 0x9571, 0x3491, 0x9572, 0x9572, 0x212D,
+ 0x9573, 0x957E, 0x34C3, 0x9580, 0x9582, 0x34CF, 0x9583, 0x9583, 0x229B,
+ 0x9584, 0x959D, 0x34D2, 0x959E, 0x959E, 0x2256, 0x959F, 0x959F, 0x24A8,
+ 0x95A0, 0x95B2, 0x34EC, 0x95B3, 0x95B3, 0x1E79, 0x95B4, 0x95B9, 0x34FF,
+ 0x95BA, 0x95BA, 0x225A, 0x95BB, 0x95CE, 0x3505, 0x95CF, 0x95CF, 0x24A7,
+ 0x95D0, 0x95D0, 0x3519, 0x95D1, 0x95D1, 0x2686, 0x95D2, 0x95D2, 0x24A6,
+ 0x95D3, 0x95D3, 0x351A, 0x95D4, 0x95D4, 0x21CE, 0x95D5, 0x95E0, 0x351B,
+ 0x95E1, 0x95E1, 0x24A9, 0x95E2, 0x95E6, 0x3527, 0x95E7, 0x95E7, 0x1FE7,
+ 0x95E8, 0x95F0, 0x352C, 0x95F1, 0x95F1, 0x2112, 0x95F2, 0x95F7, 0x3535,
+ 0x95F8, 0x95F8, 0x213C, 0x95F9, 0x95FD, 0x353B, 0x95FE, 0x95FE, 0x1F5C,
+ 0x9640, 0x9655, 0x3540, 0x9656, 0x9656, 0x24C4, 0x9657, 0x967B, 0x3556,
+ 0x967C, 0x967C, 0x1ECC, 0x967D, 0x967E, 0x357B, 0x9680, 0x96FE, 0x357D,
+ 0x9740, 0x9766, 0x35FC, 0x9767, 0x9767, 0x246A, 0x9768, 0x976B, 0x3623,
+ 0x976C, 0x976C, 0x2175, 0x976D, 0x976D, 0x3627, 0x976E, 0x976E, 0x246D,
+ 0x976F, 0x977E, 0x3628, 0x9780, 0x9795, 0x3638, 0x9796, 0x9796, 0x246B,
+ 0x9797, 0x9797, 0x225F, 0x9798, 0x979C, 0x364E, 0x979D, 0x979D, 0x1ECE,
+ 0x979E, 0x97A2, 0x3653, 0x97A3, 0x97A3, 0x2272, 0x97A4, 0x97BE, 0x3658,
+ 0x97BF, 0x97BF, 0x2473, 0x97C0, 0x97ED, 0x3673, 0x97EE, 0x97EE, 0x21FE,
+ 0x97EF, 0x97F6, 0x36A1, 0x97F7, 0x97F7, 0x1EFE, 0x97F8, 0x97FE, 0x36A9,
+ 0x9840, 0x9844, 0x36B0, 0x9845, 0x9845, 0x2475, 0x9846, 0x9848, 0x36B5,
+ 0x9849, 0x9849, 0x220A, 0x984A, 0x984E, 0x36B8, 0x984F, 0x984F, 0x1F6F,
+ 0x9850, 0x9870, 0x36BD, 0x9871, 0x9871, 0x2468, 0x9872, 0x9872, 0x36DE,
+ 0x9873, 0x9873, 0x2100, 0x9874, 0x987E, 0x36DF, 0x9880, 0x9880, 0x36EA,
+ 0x9881, 0x9881, 0x2476, 0x9882, 0x988A, 0x36EB, 0x988B, 0x988B, 0x1F27,
+ 0x988C, 0x988C, 0x20D7, 0x988D, 0x989F, 0x36F4, 0x98A0, 0x98A0, 0x247C,
+ 0x98A1, 0x98A9, 0x3707, 0x98AA, 0x98AA, 0x1FA1, 0x98AB, 0x98B5, 0x3710,
+ 0x98B6, 0x98B6, 0x22AA, 0x98B7, 0x98B7, 0x2005, 0x98B8, 0x98B9, 0x371B,
+ 0x98BA, 0x98BA, 0x246C, 0x98BB, 0x98C6, 0x371D, 0x98C7, 0x98C7, 0x203E,
+ 0x98C8, 0x98CA, 0x3729, 0x98CB, 0x98CB, 0x1E4C, 0x98CC, 0x98CF, 0x372C,
+ 0x98D0, 0x98D0, 0x213A, 0x98D1, 0x98D2, 0x3730, 0x98D3, 0x98D3, 0x2204,
+ 0x98D4, 0x98E2, 0x3732, 0x98E3, 0x98E3, 0x20C3, 0x98E4, 0x98E4, 0x2140,
+ 0x98E5, 0x98E5, 0x2477, 0x98E6, 0x98EE, 0x3741, 0x98EF, 0x98EF, 0x2474,
+ 0x98F0, 0x98F1, 0x374A, 0x98F2, 0x98F2, 0x20DD, 0x98F3, 0x98FE, 0x374C,
+ 0x9940, 0x9942, 0x3758, 0x9943, 0x9943, 0x1F68, 0x9944, 0x9944, 0x375B,
+ 0x9945, 0x9945, 0x2185, 0x9946, 0x9965, 0x375C, 0x9966, 0x9966, 0x2472,
+ 0x9967, 0x996D, 0x377C, 0x996E, 0x996E, 0x1EB5, 0x996F, 0x9974, 0x3783,
+ 0x9975, 0x9975, 0x2478, 0x9976, 0x9979, 0x3789, 0x997A, 0x997A, 0x1F8B,
+ 0x997B, 0x997B, 0x2484, 0x997C, 0x997E, 0x378D, 0x9980, 0x9984, 0x3790,
+ 0x9985, 0x9985, 0x2699, 0x9986, 0x9988, 0x3795, 0x9989, 0x9989, 0x2482,
+ 0x998A, 0x998D, 0x3798, 0x998E, 0x998E, 0x20A1, 0x998F, 0x9990, 0x379C,
+ 0x9991, 0x9991, 0x1F92, 0x9992, 0x9998, 0x379E, 0x9999, 0x9999, 0x1F38,
+ 0x999A, 0x99A8, 0x37A5, 0x99A9, 0x99A9, 0x2485, 0x99AA, 0x99AF, 0x37B4,
+ 0x99B0, 0x99B0, 0x2480, 0x99B1, 0x99B1, 0x246E, 0x99B2, 0x99B2, 0x37BA,
+ 0x99B3, 0x99B3, 0x247B, 0x99B4, 0x99B4, 0x2486, 0x99B5, 0x99B5, 0x2471,
+ 0x99B6, 0x99BC, 0x37BB, 0x99BD, 0x99BD, 0x2483, 0x99BE, 0x99BE, 0x2470,
+ 0x99BF, 0x99BF, 0x37C2, 0x99C0, 0x99C0, 0x2469, 0x99C1, 0x99C1, 0x37C3,
+ 0x99C2, 0x99C2, 0x247F, 0x99C3, 0x99C8, 0x37C4, 0x99C9, 0x99C9, 0x246F,
+ 0x99CA, 0x99CD, 0x37CA, 0x99CE, 0x99CE, 0x2481, 0x99CF, 0x99D0, 0x37CE,
+ 0x99D1, 0x99D1, 0x2220, 0x99D2, 0x99D9, 0x37D0, 0x99DA, 0x99DA, 0x1FF5,
+ 0x99DB, 0x99DF, 0x37D8, 0x99E0, 0x99E0, 0x20F4, 0x99E1, 0x99E4, 0x37DD,
+ 0x99E5, 0x99E5, 0x247D, 0x99E6, 0x99E7, 0x37E1, 0x99E8, 0x99E8, 0x2479,
+ 0x99E9, 0x99EB, 0x37E3, 0x99EC, 0x99EC, 0x247E, 0x99ED, 0x99F3, 0x37E6,
+ 0x99F4, 0x99F4, 0x247A, 0x99F5, 0x99FE, 0x37ED, 0x9A40, 0x9A49, 0x37F7,
+ 0x9A4A, 0x9A4A, 0x20E3, 0x9A4B, 0x9A56, 0x3801, 0x9A57, 0x9A57, 0x20AD,
+ 0x9A58, 0x9A64, 0x380D, 0x9A65, 0x9A65, 0x24CB, 0x9A66, 0x9A66, 0x381A,
+ 0x9A67, 0x9A67, 0x1F53, 0x9A68, 0x9A70, 0x381B, 0x9A71, 0x9A71, 0x2159,
+ 0x9A72, 0x9A75, 0x3824, 0x9A76, 0x9A76, 0x2013, 0x9A77, 0x9A77, 0x1F33,
+ 0x9A78, 0x9A7E, 0x3828, 0x9A80, 0x9A87, 0x382F, 0x9A88, 0x9A88, 0x1E5C,
+ 0x9A89, 0x9A8B, 0x3837, 0x9A8C, 0x9A8C, 0x2488, 0x9A8D, 0x9A90, 0x383A,
+ 0x9A91, 0x9A91, 0x2487, 0x9A92, 0x9A96, 0x383E, 0x9A97, 0x9A97, 0x248A,
+ 0x9A98, 0x9A99, 0x3843, 0x9A9A, 0x9A9A, 0x2489, 0x9A9B, 0x9A9B, 0x248B,
+ 0x9A9C, 0x9A9D, 0x3845, 0x9A9E, 0x9A9E, 0x1F83, 0x9A9F, 0x9AA1, 0x3847,
+ 0x9AA2, 0x9AA2, 0x210F, 0x9AA3, 0x9AA3, 0x1FDB, 0x9AA4, 0x9AA9, 0x384A,
+ 0x9AAA, 0x9AAA, 0x20AF, 0x9AAB, 0x9ACF, 0x3850, 0x9AD0, 0x9AD0, 0x24C0,
+ 0x9AD1, 0x9AD5, 0x3875, 0x9AD6, 0x9AD6, 0x226D, 0x9AD7, 0x9AD9, 0x387A,
+ 0x9ADA, 0x9ADA, 0x24C1, 0x9ADB, 0x9AE1, 0x387D, 0x9AE2, 0x9AE2, 0x20CA,
+ 0x9AE3, 0x9AE3, 0x3884, 0x9AE4, 0x9AE4, 0x20E7, 0x9AE5, 0x9AE5, 0x24C2,
+ 0x9AE6, 0x9AFE, 0x3885, 0x9B40, 0x9B7E, 0x389E, 0x9B80, 0x9BD0, 0x38DD,
+ 0x9BD1, 0x9BD1, 0x23DC, 0x9BD2, 0x9BDB, 0x392E, 0x9BDC, 0x9BDC, 0x23DB,
+ 0x9BDD, 0x9BFE, 0x3938, 0x9C40, 0x9C52, 0x395A, 0x9C53, 0x9C53, 0x205E,
+ 0x9C54, 0x9C58, 0x396D, 0x9C59, 0x9C59, 0x2244, 0x9C5A, 0x9C5A, 0x23E2,
+ 0x9C5B, 0x9C5B, 0x3972, 0x9C5C, 0x9C5C, 0x20D4, 0x9C5D, 0x9C74, 0x3973,
+ 0x9C75, 0x9C75, 0x219F, 0x9C76, 0x9C78, 0x398B, 0x9C79, 0x9C79, 0x1E66,
+ 0x9C7A, 0x9C7E, 0x398E, 0x9C80, 0x9C85, 0x3993, 0x9C86, 0x9C86, 0x1F63,
+ 0x9C87, 0x9C9C, 0x3999, 0x9C9D, 0x9C9D, 0x23DD, 0x9C9E, 0x9CAA, 0x39AF,
+ 0x9CAB, 0x9CAB, 0x216B, 0x9CAC, 0x9CC9, 0x39BC, 0x9CCA, 0x9CCA, 0x22B5,
+ 0x9CCB, 0x9CCE, 0x39DA, 0x9CCF, 0x9CCF, 0x1F26, 0x9CD0, 0x9CE5, 0x39DE,
+ 0x9CE6, 0x9CE6, 0x1E63, 0x9CE7, 0x9CE7, 0x2088, 0x9CE8, 0x9CEB, 0x39F4,
+ 0x9CEC, 0x9CEC, 0x1EBD, 0x9CED, 0x9CED, 0x39F8, 0x9CEE, 0x9CEE, 0x2341,
+ 0x9CEF, 0x9CFA, 0x39F9, 0x9CFB, 0x9CFB, 0x1F4B, 0x9CFC, 0x9CFD, 0x3A05,
+ 0x9CFE, 0x9CFE, 0x2292, 0x9D40, 0x9D41, 0x3A07, 0x9D42, 0x9D42, 0x2124,
+ 0x9D43, 0x9D45, 0x3A09, 0x9D46, 0x9D46, 0x2048, 0x9D47, 0x9D47, 0x23E0,
+ 0x9D48, 0x9D4C, 0x3A0C, 0x9D4D, 0x9D4D, 0x2077, 0x9D4E, 0x9D4E, 0x3A11,
+ 0x9D4F, 0x9D4F, 0x223A, 0x9D50, 0x9D60, 0x3A12, 0x9D61, 0x9D61, 0x20B1,
+ 0x9D62, 0x9D67, 0x3A23, 0x9D68, 0x9D68, 0x1F41, 0x9D69, 0x9D69, 0x201C,
+ 0x9D6A, 0x9D6D, 0x3A29, 0x9D6E, 0x9D6E, 0x22B8, 0x9D6F, 0x9D70, 0x3A2D,
+ 0x9D71, 0x9D71, 0x2276, 0x9D72, 0x9D74, 0x3A2F, 0x9D75, 0x9D75, 0x1F9B,
+ 0x9D76, 0x9D7A, 0x3A32, 0x9D7B, 0x9D7B, 0x1F9F, 0x9D7C, 0x9D7C, 0x3A37,
+ 0x9D7D, 0x9D7D, 0x25CA, 0x9D7E, 0x9D7E, 0x3A38, 0x9D80, 0x9D89, 0x3A39,
+ 0x9D8A, 0x9D8A, 0x20BE, 0x9D8B, 0x9D8C, 0x3A43, 0x9D8D, 0x9D8D, 0x1FB4,
+ 0x9D8E, 0x9D90, 0x3A45, 0x9D91, 0x9D91, 0x23D7, 0x9D92, 0x9D98, 0x3A48,
+ 0x9D99, 0x9D99, 0x2105, 0x9D9A, 0x9DA0, 0x3A4F, 0x9DA1, 0x9DA1, 0x23E1,
+ 0x9DA2, 0x9DA2, 0x1FEC, 0x9DA3, 0x9DA6, 0x3A56, 0x9DA7, 0x9DA7, 0x23EA,
+ 0x9DA8, 0x9DAB, 0x3A5A, 0x9DAC, 0x9DAC, 0x23E3, 0x9DAD, 0x9DAD, 0x210E,
+ 0x9DAE, 0x9DB1, 0x3A5E, 0x9DB2, 0x9DB2, 0x1FA6, 0x9DB3, 0x9DB3, 0x2004,
+ 0x9DB4, 0x9DBD, 0x3A62, 0x9DBE, 0x9DBE, 0x1F9D, 0x9DBF, 0x9DC5, 0x3A6C,
+ 0x9DC6, 0x9DC6, 0x23E5, 0x9DC7, 0x9DC8, 0x3A73, 0x9DC9, 0x9DC9, 0x2264,
+ 0x9DCA, 0x9DCC, 0x3A75, 0x9DCD, 0x9DCD, 0x24E2, 0x9DCE, 0x9DD1, 0x3A78,
+ 0x9DD2, 0x9DD2, 0x23DE, 0x9DD3, 0x9DD4, 0x3A7C, 0x9DD5, 0x9DD5, 0x1EC4,
+ 0x9DD6, 0x9DE0, 0x3A7E, 0x9DE1, 0x9DE1, 0x22B6, 0x9DE2, 0x9DE2, 0x20A9,
+ 0x9DE3, 0x9DF0, 0x3A89, 0x9DF1, 0x9DF1, 0x212B, 0x9DF2, 0x9DF3, 0x3A97,
+ 0x9DF4, 0x9DF4, 0x20A5, 0x9DF5, 0x9DF6, 0x3A99, 0x9DF7, 0x9DF7, 0x268B,
+ 0x9DF8, 0x9DF9, 0x3A9B, 0x9DFA, 0x9DFA, 0x1F76, 0x9DFB, 0x9DFC, 0x3A9D,
+ 0x9DFD, 0x9DFD, 0x216D, 0x9DFE, 0x9DFE, 0x3A9F, 0x9E40, 0x9E44, 0x3AA0,
+ 0x9E45, 0x9E45, 0x2001, 0x9E46, 0x9E47, 0x3AA5, 0x9E48, 0x9E48, 0x2191,
+ 0x9E49, 0x9E49, 0x1E50, 0x9E4A, 0x9E51, 0x3AA7, 0x9E52, 0x9E52, 0x1F9C,
+ 0x9E53, 0x9E53, 0x3AAF, 0x9E54, 0x9E54, 0x23DA, 0x9E55, 0x9E55, 0x3AB0,
+ 0x9E56, 0x9E56, 0x2053, 0x9E57, 0x9E5C, 0x3AB1, 0x9E5D, 0x9E5D, 0x23E9,
+ 0x9E5E, 0x9E5E, 0x23E4, 0x9E5F, 0x9E60, 0x3AB7, 0x9E61, 0x9E61, 0x21D5,
+ 0x9E62, 0x9E62, 0x3AB9, 0x9E63, 0x9E63, 0x23E6, 0x9E64, 0x9E66, 0x3ABA,
+ 0x9E67, 0x9E67, 0x23DF, 0x9E68, 0x9E6B, 0x3ABD, 0x9E6C, 0x9E6C, 0x1E4F,
+ 0x9E6D, 0x9E6E, 0x3AC1, 0x9E6F, 0x9E6F, 0x23D9, 0x9E70, 0x9E71, 0x3AC3,
+ 0x9E72, 0x9E72, 0x2014, 0x9E73, 0x9E73, 0x3AC5, 0x9E74, 0x9E74, 0x23EC,
+ 0x9E75, 0x9E75, 0x23EB, 0x9E76, 0x9E7A, 0x3AC6, 0x9E7B, 0x9E7B, 0x23D8,
+ 0x9E7C, 0x9E7C, 0x23EE, 0x9E7D, 0x9E7E, 0x3ACB, 0x9E80, 0x9E84, 0x3ACD,
+ 0x9E85, 0x9E85, 0x268E, 0x9E86, 0x9E86, 0x3AD2, 0x9E87, 0x9E87, 0x23ED,
+ 0x9E88, 0x9E90, 0x3AD3, 0x9E91, 0x9E91, 0x1FFA, 0x9E92, 0x9E95, 0x3ADC,
+ 0x9E96, 0x9E96, 0x23D6, 0x9E97, 0x9E97, 0x23E8, 0x9E98, 0x9EA1, 0x3AE0,
+ 0x9EA2, 0x9EA2, 0x2106, 0x9EA3, 0x9EA5, 0x3AEA, 0x9EA6, 0x9EA6, 0x200B,
+ 0x9EA7, 0x9EA8, 0x3AED, 0x9EA9, 0x9EA9, 0x2166, 0x9EAA, 0x9EAD, 0x3AEF,
+ 0x9EAE, 0x9EAE, 0x23EF, 0x9EAF, 0x9EB2, 0x3AF3, 0x9EB3, 0x9EB3, 0x2189,
+ 0x9EB4, 0x9EB4, 0x2058, 0x9EB5, 0x9EB6, 0x3AF7, 0x9EB7, 0x9EB7, 0x23E7,
+ 0x9EB8, 0x9EF4, 0x3AF9, 0x9EF5, 0x9EF5, 0x21A3, 0x9EF6, 0x9EFE, 0x3B36,
+ 0x9F40, 0x9F4D, 0x3B3F, 0x9F4E, 0x9F4E, 0x217A, 0x9F4F, 0x9F6E, 0x3B4D,
+ 0x9F6F, 0x9F6F, 0x21A5, 0x9F70, 0x9F7E, 0x3B6D, 0x9F80, 0x9F91, 0x3B7C,
+ 0x9F92, 0x9F92, 0x2022, 0x9F93, 0x9F97, 0x3B8E, 0x9F98, 0x9F98, 0x24D6,
+ 0x9F99, 0x9FA5, 0x3B93, 0x9FA6, 0x9FA6, 0x233A, 0x9FA7, 0x9FA8, 0x3BA0,
+ 0x9FA9, 0x9FA9, 0x1EEE, 0x9FAA, 0x9FAB, 0x3BA2, 0x9FAC, 0x9FAC, 0x24D5,
+ 0x9FAD, 0x9FC8, 0x3BA4, 0x9FC9, 0x9FC9, 0x2228, 0x9FCA, 0x9FCC, 0x3BC0,
+ 0x9FCD, 0x9FCD, 0x24D7, 0x9FCE, 0x9FE0, 0x3BC3, 0x9FE1, 0x9FE1, 0x20FC,
+ 0x9FE2, 0x9FEA, 0x3BD6, 0x9FEB, 0x9FEB, 0x1E87, 0x9FEC, 0x9FED, 0x3BDF,
+ 0x9FEE, 0x9FEE, 0x24D8, 0x9FEF, 0x9FF3, 0x3BE1, 0x9FF4, 0x9FF4, 0x1EBA,
+ 0x9FF5, 0x9FFC, 0x3BE6, 0x9FFD, 0x9FFD, 0x2119, 0x9FFE, 0x9FFE, 0x3BEE,
+ 0xA040, 0xA042, 0x3BEF, 0xA043, 0xA043, 0x216C, 0xA044, 0xA045, 0x3BF2,
+ 0xA046, 0xA046, 0x24D9, 0xA047, 0xA048, 0x3BF4, 0xA049, 0xA049, 0x2227,
+ 0xA04A, 0xA04D, 0x3BF6, 0xA04E, 0xA04E, 0x1E5F, 0xA04F, 0xA053, 0x3BFA,
+ 0xA054, 0xA054, 0x229F, 0xA055, 0xA059, 0x3BFF, 0xA05A, 0xA05A, 0x1F5D,
+ 0xA05B, 0xA060, 0x3C04, 0xA061, 0xA061, 0x1FBC, 0xA062, 0xA062, 0x3C0A,
+ 0xA063, 0xA063, 0x24DA, 0xA064, 0xA070, 0x3C0B, 0xA071, 0xA071, 0x2149,
+ 0xA072, 0xA073, 0x3C18, 0xA074, 0xA074, 0x2046, 0xA075, 0xA07E, 0x3C1A,
+ 0xA080, 0xA080, 0x2000, 0xA081, 0xA090, 0x3C24, 0xA091, 0xA091, 0x2190,
+ 0xA092, 0xA093, 0x3C34, 0xA094, 0xA094, 0x2208, 0xA095, 0xA095, 0x3C36,
+ 0xA096, 0xA096, 0x1EE6, 0xA097, 0xA0A8, 0x3C37, 0xA0A9, 0xA0A9, 0x24C3,
+ 0xA0AA, 0xA0BE, 0x3C49, 0xA0BF, 0xA0BF, 0x20CC, 0xA0C0, 0xA0CD, 0x3C5E,
+ 0xA0CE, 0xA0CE, 0x2340, 0xA0CF, 0xA0D8, 0x3C6C, 0xA0D9, 0xA0D9, 0x1ED1,
+ 0xA0DA, 0xA0DD, 0x3C76, 0xA0DE, 0xA0DE, 0x21AC, 0xA0DF, 0xA0ED, 0x3C7A,
+ 0xA0EE, 0xA0EE, 0x22AF, 0xA0EF, 0xA0FE, 0x3C89, 0xA1A1, 0xA1FE, 0x0060,
+ 0xA2A1, 0xA2AA, 0x26A9, 0xA2B1, 0xA2E2, 0x00BE, 0xA2E5, 0xA2EE, 0x00F0,
+ 0xA2F1, 0xA2FC, 0x00FA, 0xA3A1, 0xA3FE, 0x0106, 0xA4A1, 0xA4F3, 0x0164,
+ 0xA5A1, 0xA5F6, 0x01B7, 0xA6A1, 0xA6B8, 0x020D, 0xA6C1, 0xA6F5, 0x0225,
+ 0xA7A1, 0xA7C1, 0x025A, 0xA7D1, 0xA7F1, 0x027B, 0xA840, 0xA87E, 0x26B3,
+ 0xA880, 0xA895, 0x26F2, 0xA8A1, 0xA8C0, 0x029C, 0xA8C5, 0xA8EA, 0x02BC,
+ 0xA940, 0xA957, 0x2708, 0xA959, 0xA95A, 0x2720, 0xA95C, 0xA95C, 0x2722,
+ 0xA960, 0xA97E, 0x2723, 0xA980, 0xA995, 0x2742, 0xA996, 0xA996, 0x1E17,
+ 0xA9A4, 0xA9EF, 0x02E2, 0xAA40, 0xAA4C, 0x3C99, 0xAA4D, 0xAA4D, 0x21B6,
+ 0xAA4E, 0xAA4E, 0x1E3D, 0xAA4F, 0xAA70, 0x3CA6, 0xAA71, 0xAA71, 0x2235,
+ 0xAA72, 0xAA72, 0x3CC8, 0xAA73, 0xAA73, 0x2397, 0xAA74, 0xAA76, 0x3CC9,
+ 0xAA77, 0xAA77, 0x2395, 0xAA78, 0xAA79, 0x3CCC, 0xAA7A, 0xAA7A, 0x223F,
+ 0xAA7B, 0xAA7B, 0x212A, 0xAA7C, 0xAA7E, 0x3CCE, 0xAA80, 0xAA99, 0x3CD1,
+ 0xAA9A, 0xAA9A, 0x1ED2, 0xAA9B, 0xAA9B, 0x3CEB, 0xAA9C, 0xAA9C, 0x2396,
+ 0xAA9D, 0xAA9D, 0x2398, 0xAA9E, 0xAA9E, 0x3CEC, 0xAA9F, 0xAA9F, 0x20A2,
+ 0xAAA0, 0xAAA0, 0x3CED, 0xAAA1, 0xAAFE, 0x032E, 0xAB40, 0xAB40, 0x1F64,
+ 0xAB41, 0xAB42, 0x3CEE, 0xAB43, 0xAB43, 0x202B, 0xAB44, 0xAB44, 0x3CF0,
+ 0xAB45, 0xAB45, 0x2394, 0xAB46, 0xAB46, 0x2139, 0xAB47, 0xAB47, 0x3CF1,
+ 0xAB48, 0xAB48, 0x215F, 0xAB49, 0xAB49, 0x21C1, 0xAB4A, 0xAB4A, 0x239A,
+ 0xAB4B, 0xAB4C, 0x3CF2, 0xAB4D, 0xAB4D, 0x2399, 0xAB4E, 0xAB7E, 0x3CF4,
+ 0xAB80, 0xABA0, 0x3D25, 0xABA1, 0xABC0, 0x038C, 0xAC40, 0xAC45, 0x3D46,
+ 0xAC46, 0xAC46, 0x21C0, 0xAC47, 0xAC70, 0x3D4C, 0xAC71, 0xAC71, 0x2460,
+ 0xAC72, 0xAC7B, 0x3D76, 0xAC7C, 0xAC7C, 0x245C, 0xAC7D, 0xAC7E, 0x3D80,
+ 0xAC80, 0xAC8C, 0x3D82, 0xAC8D, 0xAC8D, 0x215D, 0xAC8E, 0xAC92, 0x3D8F,
+ 0xAC93, 0xAC93, 0x2225, 0xAC94, 0xAC94, 0x206A, 0xAC95, 0xACA0, 0x3D94,
+ 0xAD40, 0xAD48, 0x3DA0, 0xAD49, 0xAD49, 0x2461, 0xAD4A, 0xAD5D, 0x3DA9,
+ 0xAD5E, 0xAD5E, 0x245B, 0xAD5F, 0xAD60, 0x3DBD, 0xAD61, 0xAD61, 0x2462,
+ 0xAD62, 0xAD67, 0x3DBF, 0xAD68, 0xAD68, 0x1F54, 0xAD69, 0xAD73, 0x3DC5,
+ 0xAD74, 0xAD74, 0x245F, 0xAD75, 0xAD7E, 0x3DD0, 0xAD80, 0xAD81, 0x3DDA,
+ 0xAD82, 0xAD82, 0x20EC, 0xAD83, 0xAD86, 0x3DDC, 0xAD87, 0xAD87, 0x245D,
+ 0xAD88, 0xAD8A, 0x3DE0, 0xAD8B, 0xAD8B, 0x2463, 0xAD8C, 0xAD90, 0x3DE3,
+ 0xAD91, 0xAD91, 0x2464, 0xAD92, 0xADA0, 0x3DE8, 0xAE40, 0xAE53, 0x3DF7,
+ 0xAE54, 0xAE54, 0x24A5, 0xAE55, 0xAE61, 0x3E0B, 0xAE62, 0xAE62, 0x1E70,
+ 0xAE63, 0xAE7E, 0x3E18, 0xAE80, 0xAE80, 0x208F, 0xAE81, 0xAE84, 0x3E34,
+ 0xAE85, 0xAE85, 0x1E42, 0xAE86, 0xAE8A, 0x3E38, 0xAE8B, 0xAE8B, 0x1F4E,
+ 0xAE8C, 0xAE93, 0x3E3D, 0xAE94, 0xAE94, 0x1EB1, 0xAE95, 0xAE9F, 0x3E45,
+ 0xAEA0, 0xAEA0, 0x1E8B, 0xAF40, 0xAF63, 0x3E50, 0xAF64, 0xAF64, 0x1FC6,
+ 0xAF65, 0xAF7A, 0x3E74, 0xAF7B, 0xAF7B, 0x25AE, 0xAF7C, 0xAF7E, 0x3E8A,
+ 0xAF80, 0xAF81, 0x3E8D, 0xAF82, 0xAF82, 0x1F01, 0xAF83, 0xAF83, 0x2200,
+ 0xAF84, 0xAF8D, 0x3E8F, 0xAF8E, 0xAF8E, 0x25B2, 0xAF8F, 0xAF8F, 0x1E97,
+ 0xAF90, 0xAF90, 0x3E99, 0xAF91, 0xAF91, 0x20AB, 0xAF92, 0xAF9B, 0x3E9A,
+ 0xAF9C, 0xAF9C, 0x25B3, 0xAF9D, 0xAF9E, 0x3EA4, 0xAF9F, 0xAF9F, 0x2028,
+ 0xAFA0, 0xAFA0, 0x3EA6, 0xB040, 0xB040, 0x3EA7, 0xB041, 0xB042, 0x25AF,
+ 0xB043, 0xB043, 0x3EA8, 0xB044, 0xB044, 0x25B1, 0xB045, 0xB04E, 0x3EA9,
+ 0xB04F, 0xB04F, 0x25AC, 0xB050, 0xB053, 0x3EB3, 0xB054, 0xB054, 0x1E4E,
+ 0xB055, 0xB056, 0x3EB7, 0xB057, 0xB057, 0x2202, 0xB058, 0xB058, 0x25AB,
+ 0xB059, 0xB059, 0x2286, 0xB05A, 0xB05A, 0x3EB9, 0xB05B, 0xB05B, 0x25AD,
+ 0xB05C, 0xB05C, 0x3EBA, 0xB05D, 0xB05D, 0x25B6, 0xB05E, 0xB05E, 0x3EBB,
+ 0xB05F, 0xB05F, 0x21E3, 0xB060, 0xB061, 0x25B4, 0xB062, 0xB062, 0x222F,
+ 0xB063, 0xB063, 0x2165, 0xB064, 0xB064, 0x25B7, 0xB065, 0xB06B, 0x3EBC,
+ 0xB06C, 0xB06C, 0x1EE9, 0xB06D, 0xB07C, 0x3EC3, 0xB07D, 0xB07D, 0x1E25,
+ 0xB07E, 0xB07E, 0x3ED3, 0xB080, 0xB096, 0x3ED4, 0xB097, 0xB097, 0x25C0,
+ 0xB098, 0xB098, 0x3EEB, 0xB099, 0xB099, 0x229A, 0xB09A, 0xB0A0, 0x3EEC,
+ 0xB0A1, 0xB0FE, 0x03AC, 0xB140, 0xB14A, 0x3EF3, 0xB14B, 0xB14B, 0x226E,
+ 0xB14C, 0xB14C, 0x3EFE, 0xB14D, 0xB14D, 0x1FBD, 0xB14E, 0xB14E, 0x3EFF,
+ 0xB14F, 0xB14F, 0x1F84, 0xB150, 0xB150, 0x20B2, 0xB151, 0xB151, 0x3F00,
+ 0xB152, 0xB152, 0x2043, 0xB153, 0xB17E, 0x3F01, 0xB180, 0xB196, 0x3F2D,
+ 0xB197, 0xB197, 0x2684, 0xB198, 0xB1A0, 0x3F44, 0xB1A1, 0xB1FE, 0x040A,
+ 0xB240, 0xB240, 0x3F4D, 0xB241, 0xB241, 0x24EF, 0xB242, 0xB266, 0x3F4E,
+ 0xB267, 0xB267, 0x24EE, 0xB268, 0xB26C, 0x3F73, 0xB26D, 0xB26D, 0x2074,
+ 0xB26E, 0xB273, 0x3F78, 0xB274, 0xB274, 0x2687, 0xB275, 0xB27E, 0x3F7E,
+ 0xB280, 0xB280, 0x24F0, 0xB281, 0xB288, 0x3F88, 0xB289, 0xB289, 0x268D,
+ 0xB28A, 0xB299, 0x3F90, 0xB29A, 0xB29A, 0x22A0, 0xB29B, 0xB2A0, 0x3FA0,
+ 0xB2A1, 0xB2FE, 0x0468, 0xB340, 0xB342, 0x3FA6, 0xB343, 0xB343, 0x1FAB,
+ 0xB344, 0xB36F, 0x3FA9, 0xB370, 0xB370, 0x26A8, 0xB371, 0xB37E, 0x3FD5,
+ 0xB380, 0xB387, 0x3FE3, 0xB388, 0xB388, 0x24E9, 0xB389, 0xB38B, 0x3FEB,
+ 0xB38C, 0xB38C, 0x24E5, 0xB38D, 0xB38D, 0x3FEE, 0xB38E, 0xB38E, 0x21FA,
+ 0xB38F, 0xB3A0, 0x3FEF, 0xB3A1, 0xB3FE, 0x04C6, 0xB440, 0xB453, 0x4001,
+ 0xB454, 0xB454, 0x2148, 0xB455, 0xB457, 0x4015, 0xB458, 0xB458, 0x24E4,
+ 0xB459, 0xB45D, 0x4018, 0xB45E, 0xB45E, 0x24E6, 0xB45F, 0xB45F, 0x20F7,
+ 0xB460, 0xB460, 0x401D, 0xB461, 0xB461, 0x206B, 0xB462, 0xB474, 0x401E,
+ 0xB475, 0xB475, 0x22A7, 0xB476, 0xB47D, 0x4031, 0xB47E, 0xB47E, 0x24EC,
+ 0xB480, 0xB482, 0x4039, 0xB483, 0xB483, 0x24EB, 0xB484, 0xB488, 0x403C,
+ 0xB489, 0xB489, 0x24E3, 0xB48A, 0xB492, 0x4041, 0xB493, 0xB493, 0x24EA,
+ 0xB494, 0xB4A0, 0x404A, 0xB4A1, 0xB4FE, 0x0524, 0xB540, 0xB540, 0x4057,
+ 0xB541, 0xB541, 0x1E92, 0xB542, 0xB54A, 0x4058, 0xB54B, 0xB54B, 0x1E27,
+ 0xB54C, 0xB555, 0x4061, 0xB556, 0xB556, 0x1FE6, 0xB557, 0xB559, 0x406B,
+ 0xB55A, 0xB55A, 0x24E7, 0xB55B, 0xB55B, 0x2012, 0xB55C, 0xB55C, 0x1EEC,
+ 0xB55D, 0xB560, 0x406E, 0xB561, 0xB561, 0x24E8, 0xB562, 0xB57E, 0x4072,
+ 0xB580, 0xB59B, 0x408F, 0xB59C, 0xB59C, 0x1F66, 0xB59D, 0xB59D, 0x24DC,
+ 0xB59E, 0xB5A0, 0x40AB, 0xB5A1, 0xB5FE, 0x0582, 0xB640, 0xB651, 0x40AE,
+ 0xB652, 0xB652, 0x26A2, 0xB653, 0xB654, 0x40C0, 0xB655, 0xB655, 0x24DD,
+ 0xB656, 0xB658, 0x40C2, 0xB659, 0xB659, 0x200E, 0xB65A, 0xB65A, 0x40C5,
+ 0xB65B, 0xB65B, 0x24DB, 0xB65C, 0xB65C, 0x1EB8, 0xB65D, 0xB67E, 0x40C6,
+ 0xB680, 0xB6A0, 0x40E8, 0xB6A1, 0xB6FE, 0x05E0, 0xB740, 0xB74D, 0x4109,
+ 0xB74E, 0xB74E, 0x2295, 0xB74F, 0xB750, 0x4117, 0xB751, 0xB751, 0x1E80,
+ 0xB752, 0xB758, 0x4119, 0xB759, 0xB759, 0x2677, 0xB75A, 0xB763, 0x4120,
+ 0xB764, 0xB764, 0x2624, 0xB765, 0xB765, 0x1F69, 0xB766, 0xB766, 0x222B,
+ 0xB767, 0xB776, 0x412A, 0xB777, 0xB777, 0x257F, 0xB778, 0xB778, 0x1F5B,
+ 0xB779, 0xB77E, 0x413A, 0xB780, 0xB780, 0x219B, 0xB781, 0xB781, 0x4140,
+ 0xB782, 0xB782, 0x267D, 0xB783, 0xB7A0, 0x4141, 0xB7A1, 0xB7FE, 0x063E,
+ 0xB840, 0xB842, 0x415F, 0xB843, 0xB843, 0x21A0, 0xB844, 0xB844, 0x2186,
+ 0xB845, 0xB845, 0x4162, 0xB846, 0xB846, 0x20ED, 0xB847, 0xB84C, 0x4163,
+ 0xB84D, 0xB84D, 0x25B9, 0xB84E, 0xB850, 0x4169, 0xB851, 0xB851, 0x1FEA,
+ 0xB852, 0xB859, 0x416C, 0xB85A, 0xB85A, 0x1EA4, 0xB85B, 0xB85B, 0x20E1,
+ 0xB85C, 0xB85C, 0x4174, 0xB85D, 0xB85D, 0x25B8, 0xB85E, 0xB85E, 0x2260,
+ 0xB85F, 0xB85F, 0x4175, 0xB860, 0xB860, 0x20E2, 0xB861, 0xB876, 0x4176,
+ 0xB877, 0xB877, 0x2141, 0xB878, 0xB87E, 0x418C, 0xB880, 0xB881, 0x4193,
+ 0xB882, 0xB882, 0x1FC7, 0xB883, 0xB8A0, 0x4195, 0xB8A1, 0xB8FE, 0x069C,
+ 0xB940, 0xB94F, 0x41B3, 0xB950, 0xB950, 0x1E41, 0xB951, 0xB960, 0x41C3,
+ 0xB961, 0xB961, 0x25E4, 0xB962, 0xB97A, 0x41D3, 0xB97B, 0xB97B, 0x1F86,
+ 0xB97C, 0xB97E, 0x41EC, 0xB980, 0xB99C, 0x41EF, 0xB99D, 0xB99D, 0x1FB3,
+ 0xB99E, 0xB99F, 0x420C, 0xB9A0, 0xB9A0, 0x1EEF, 0xB9A1, 0xB9FE, 0x06FA,
+ 0xBA40, 0xBA41, 0x420E, 0xBA42, 0xBA42, 0x22A4, 0xBA43, 0xBA43, 0x4210,
+ 0xBA44, 0xBA44, 0x25E8, 0xBA45, 0xBA55, 0x4211, 0xBA56, 0xBA56, 0x25E3,
+ 0xBA57, 0xBA58, 0x4222, 0xBA59, 0xBA59, 0x2111, 0xBA5A, 0xBA5F, 0x4224,
+ 0xBA60, 0xBA60, 0x25E6, 0xBA61, 0xBA69, 0x422A, 0xBA6A, 0xBA6A, 0x25E7,
+ 0xBA6B, 0xBA73, 0x4233, 0xBA74, 0xBA74, 0x2041, 0xBA75, 0xBA7E, 0x423C,
+ 0xBA80, 0xBA83, 0x4246, 0xBA84, 0xBA84, 0x25EA, 0xBA85, 0xBA85, 0x424A,
+ 0xBA86, 0xBA86, 0x1F8F, 0xBA87, 0xBA87, 0x424B, 0xBA88, 0xBA88, 0x25EC,
+ 0xBA89, 0xBA8C, 0x424C, 0xBA8D, 0xBA8D, 0x25EB, 0xBA8E, 0xBA9D, 0x4250,
+ 0xBA9E, 0xBA9E, 0x20D0, 0xBA9F, 0xBA9F, 0x201D, 0xBAA0, 0xBAA0, 0x4260,
+ 0xBAA1, 0xBAFE, 0x0758, 0xBB40, 0xBB40, 0x1FF7, 0xBB41, 0xBB48, 0x4261,
+ 0xBB49, 0xBB49, 0x1E8D, 0xBB4A, 0xBB57, 0x4269, 0xBB58, 0xBB58, 0x25E9,
+ 0xBB59, 0xBB5A, 0x4277, 0xBB5B, 0xBB5B, 0x25EE, 0xBB5C, 0xBB5C, 0x203A,
+ 0xBB5D, 0xBB5F, 0x4279, 0xBB60, 0xBB60, 0x2693, 0xBB61, 0xBB64, 0x427C,
+ 0xBB65, 0xBB65, 0x25E5, 0xBB66, 0xBB66, 0x25ED, 0xBB67, 0xBB67, 0x4280,
+ 0xBB68, 0xBB68, 0x2009, 0xBB69, 0xBB69, 0x4281, 0xBB6A, 0xBB6A, 0x2065,
+ 0xBB6B, 0xBB6D, 0x4282, 0xBB6E, 0xBB6E, 0x26A3, 0xBB6F, 0xBB7E, 0x4285,
+ 0xBB80, 0xBBA0, 0x4295, 0xBBA1, 0xBBFE, 0x07B6, 0xBC40, 0xBC51, 0x42B6,
+ 0xBC52, 0xBC52, 0x25F5, 0xBC53, 0xBC53, 0x1EFC, 0xBC54, 0xBC59, 0x42C8,
+ 0xBC5A, 0xBC5A, 0x2024, 0xBC5B, 0xBC60, 0x42CE, 0xBC61, 0xBC61, 0x269B,
+ 0xBC62, 0xBC62, 0x42D4, 0xBC63, 0xBC63, 0x25F3, 0xBC64, 0xBC64, 0x42D5,
+ 0xBC65, 0xBC65, 0x22D9, 0xBC66, 0xBC66, 0x42D6, 0xBC67, 0xBC67, 0x25F4,
+ 0xBC68, 0xBC68, 0x42D7, 0xBC69, 0xBC69, 0x241B, 0xBC6A, 0xBC6C, 0x42D8,
+ 0xBC6D, 0xBC6D, 0x1FC8, 0xBC6E, 0xBC6E, 0x42DB, 0xBC6F, 0xBC6F, 0x1F7B,
+ 0xBC70, 0xBC70, 0x42DC, 0xBC71, 0xBC71, 0x241D, 0xBC72, 0xBC72, 0x42DD,
+ 0xBC73, 0xBC73, 0x224C, 0xBC74, 0xBC74, 0x1F48, 0xBC75, 0xBC75, 0x241C,
+ 0xBC76, 0xBC77, 0x241E, 0xBC78, 0xBC78, 0x20FF, 0xBC79, 0xBC79, 0x219A,
+ 0xBC7A, 0xBC7A, 0x42DE, 0xBC7B, 0xBC7B, 0x2091, 0xBC7C, 0xBC7D, 0x42DF,
+ 0xBC7E, 0xBC7E, 0x20A7, 0xBC80, 0xBC81, 0x42E1, 0xBC82, 0xBC82, 0x2423,
+ 0xBC83, 0xBC83, 0x1E9B, 0xBC84, 0xBC84, 0x2422, 0xBC85, 0xBC85, 0x42E3,
+ 0xBC86, 0xBC86, 0x2110, 0xBC87, 0xBC87, 0x42E4, 0xBC88, 0xBC88, 0x228D,
+ 0xBC89, 0xBC89, 0x1F71, 0xBC8A, 0xBC8A, 0x1EF8, 0xBC8B, 0xBC8B, 0x2421,
+ 0xBC8C, 0xBC8E, 0x42E5, 0xBC8F, 0xBC8F, 0x1EF3, 0xBC90, 0xBC99, 0x42E8,
+ 0xBC9A, 0xBC9A, 0x21B1, 0xBC9B, 0xBC9B, 0x2426, 0xBC9C, 0xBC9C, 0x2425,
+ 0xBC9D, 0xBC9D, 0x2120, 0xBC9E, 0xBCA0, 0x42F2, 0xBCA1, 0xBCFE, 0x0814,
+ 0xBD40, 0xBD41, 0x42F5, 0xBD42, 0xBD42, 0x211A, 0xBD43, 0xBD43, 0x2424,
+ 0xBD44, 0xBD44, 0x42F7, 0xBD45, 0xBD45, 0x2428, 0xBD46, 0xBD47, 0x42F8,
+ 0xBD48, 0xBD48, 0x242A, 0xBD49, 0xBD49, 0x2429, 0xBD4A, 0xBD4A, 0x42FA,
+ 0xBD4B, 0xBD4B, 0x2294, 0xBD4C, 0xBD4C, 0x42FB, 0xBD4D, 0xBD4D, 0x22BE,
+ 0xBD4E, 0xBD4E, 0x42FC, 0xBD4F, 0xBD4F, 0x1E31, 0xBD50, 0xBD56, 0x42FD,
+ 0xBD57, 0xBD57, 0x242C, 0xBD58, 0xBD58, 0x4304, 0xBD59, 0xBD59, 0x1FB5,
+ 0xBD5A, 0xBD65, 0x4305, 0xBD66, 0xBD66, 0x242B, 0xBD67, 0xBD67, 0x1FAF,
+ 0xBD68, 0xBD69, 0x4311, 0xBD6A, 0xBD6A, 0x2068, 0xBD6B, 0xBD6B, 0x21E4,
+ 0xBD6C, 0xBD6E, 0x4313, 0xBD6F, 0xBD6F, 0x1F21, 0xBD70, 0xBD70, 0x4316,
+ 0xBD71, 0xBD71, 0x2101, 0xBD72, 0xBD78, 0x4317, 0xBD79, 0xBD79, 0x217C,
+ 0xBD7A, 0xBD7A, 0x214A, 0xBD7B, 0xBD7B, 0x242D, 0xBD7C, 0xBD7D, 0x431E,
+ 0xBD7E, 0xBD7E, 0x1FD4, 0xBD80, 0xBD80, 0x4320, 0xBD81, 0xBD81, 0x1FD1,
+ 0xBD82, 0xBD88, 0x4321, 0xBD89, 0xBD89, 0x1E33, 0xBD8A, 0xBD8A, 0x4328,
+ 0xBD8B, 0xBD8B, 0x242F, 0xBD8C, 0xBD8D, 0x4329, 0xBD8E, 0xBD8E, 0x242E,
+ 0xBD8F, 0xBD8F, 0x432B, 0xBD90, 0xBD90, 0x2430, 0xBD91, 0xBD91, 0x21DB,
+ 0xBD92, 0xBD96, 0x432C, 0xBD97, 0xBD97, 0x2158, 0xBD98, 0xBD9A, 0x4331,
+ 0xBD9B, 0xBD9B, 0x1FC2, 0xBD9C, 0xBDA0, 0x4334, 0xBDA1, 0xBDFE, 0x0872,
+ 0xBE40, 0xBE42, 0x4339, 0xBE43, 0xBE43, 0x22B9, 0xBE44, 0xBE44, 0x433C,
+ 0xBE45, 0xBE45, 0x2436, 0xBE46, 0xBE48, 0x433D, 0xBE49, 0xBE49, 0x1E8E,
+ 0xBE4A, 0xBE4A, 0x2439, 0xBE4B, 0xBE50, 0x4340, 0xBE51, 0xBE51, 0x21C5,
+ 0xBE52, 0xBE52, 0x2437, 0xBE53, 0xBE53, 0x2192, 0xBE54, 0xBE54, 0x4346,
+ 0xBE55, 0xBE55, 0x243A, 0xBE56, 0xBE56, 0x1F19, 0xBE57, 0xBE57, 0x218C,
+ 0xBE58, 0xBE58, 0x1E40, 0xBE59, 0xBE59, 0x22B3, 0xBE5A, 0xBE5C, 0x4347,
+ 0xBE5D, 0xBE5D, 0x205F, 0xBE5E, 0xBE5E, 0x2438, 0xBE5F, 0xBE5F, 0x2432,
+ 0xBE60, 0xBE60, 0x2274, 0xBE61, 0xBE61, 0x434A, 0xBE62, 0xBE62, 0x1E9C,
+ 0xBE63, 0xBE63, 0x2431, 0xBE64, 0xBE64, 0x2085, 0xBE65, 0xBE68, 0x434B,
+ 0xBE69, 0xBE69, 0x2435, 0xBE6A, 0xBE6B, 0x434F, 0xBE6C, 0xBE6C, 0x243B,
+ 0xBE6D, 0xBE6E, 0x4351, 0xBE6F, 0xBE6F, 0x1FB7, 0xBE70, 0xBE70, 0x2433,
+ 0xBE71, 0xBE75, 0x4353, 0xBE76, 0xBE76, 0x2054, 0xBE77, 0xBE77, 0x21DE,
+ 0xBE78, 0xBE78, 0x4358, 0xBE79, 0xBE79, 0x2434, 0xBE7A, 0xBE7B, 0x4359,
+ 0xBE7C, 0xBE7C, 0x243D, 0xBE7D, 0xBE7D, 0x1F89, 0xBE7E, 0xBE7E, 0x243C,
+ 0xBE80, 0xBE82, 0x435B, 0xBE83, 0xBE83, 0x1F6E, 0xBE84, 0xBE84, 0x1ED8,
+ 0xBE85, 0xBE85, 0x435E, 0xBE86, 0xBE86, 0x1EBF, 0xBE87, 0xBE87, 0x2445,
+ 0xBE88, 0xBE88, 0x435F, 0xBE89, 0xBE89, 0x2249, 0xBE8A, 0xBE8B, 0x4360,
+ 0xBE8C, 0xBE8C, 0x2441, 0xBE8D, 0xBE8D, 0x4362, 0xBE8E, 0xBE8E, 0x1E47,
+ 0xBE8F, 0xBE8F, 0x1F56, 0xBE90, 0xBE91, 0x4363, 0xBE92, 0xBE92, 0x2086,
+ 0xBE93, 0xBE94, 0x4365, 0xBE95, 0xBE95, 0x2196, 0xBE96, 0xBE96, 0x4367,
+ 0xBE97, 0xBE97, 0x2443, 0xBE98, 0xBE98, 0x243F, 0xBE99, 0xBE99, 0x4368,
+ 0xBE9A, 0xBE9A, 0x2023, 0xBE9B, 0xBE9B, 0x4369, 0xBE9C, 0xBE9C, 0x2442,
+ 0xBE9D, 0xBE9E, 0x436A, 0xBE9F, 0xBE9F, 0x243E, 0xBEA0, 0xBEA0, 0x436C,
+ 0xBEA1, 0xBEFE, 0x08D0, 0xBF40, 0xBF40, 0x26A6, 0xBF41, 0xBF4C, 0x436D,
+ 0xBF4D, 0xBF4D, 0x234E, 0xBF4E, 0xBF4E, 0x2446, 0xBF4F, 0xBF4F, 0x244B,
+ 0xBF50, 0xBF50, 0x2444, 0xBF51, 0xBF54, 0x4379, 0xBF55, 0xBF55, 0x2427,
+ 0xBF56, 0xBF56, 0x244C, 0xBF57, 0xBF5F, 0x437D, 0xBF60, 0xBF60, 0x1F0F,
+ 0xBF61, 0xBF61, 0x4386, 0xBF62, 0xBF62, 0x2447, 0xBF63, 0xBF63, 0x2449,
+ 0xBF64, 0xBF64, 0x2448, 0xBF65, 0xBF67, 0x4387, 0xBF68, 0xBF68, 0x21C2,
+ 0xBF69, 0xBF6B, 0x438A, 0xBF6C, 0xBF6C, 0x216E, 0xBF6D, 0xBF6F, 0x438D,
+ 0xBF70, 0xBF70, 0x1F03, 0xBF71, 0xBF71, 0x4390, 0xBF72, 0xBF72, 0x244A,
+ 0xBF73, 0xBF73, 0x215C, 0xBF74, 0xBF75, 0x4391, 0xBF76, 0xBF76, 0x22BB,
+ 0xBF77, 0xBF77, 0x2450, 0xBF78, 0xBF78, 0x4393, 0xBF79, 0xBF79, 0x2694,
+ 0xBF7A, 0xBF7A, 0x244F, 0xBF7B, 0xBF7B, 0x25F6, 0xBF7C, 0xBF7C, 0x2051,
+ 0xBF7D, 0xBF7D, 0x4394, 0xBF7E, 0xBF7E, 0x244E, 0xBF80, 0xBF81, 0x4395,
+ 0xBF82, 0xBF82, 0x22BA, 0xBF83, 0xBF83, 0x1F6D, 0xBF84, 0xBF88, 0x4397,
+ 0xBF89, 0xBF89, 0x2452, 0xBF8A, 0xBF8A, 0x2451, 0xBF8B, 0xBF94, 0x439C,
+ 0xBF95, 0xBF95, 0x2455, 0xBF96, 0xBF96, 0x43A6, 0xBF97, 0xBF97, 0x2289,
+ 0xBF98, 0xBF98, 0x2116, 0xBF99, 0xBF9C, 0x43A7, 0xBF9D, 0xBF9D, 0x2454,
+ 0xBF9E, 0xBFA0, 0x43AB, 0xBFA1, 0xBFFE, 0x092E, 0xC040, 0xC040, 0x20FB,
+ 0xC041, 0xC043, 0x43AE, 0xC044, 0xC044, 0x2440, 0xC045, 0xC04A, 0x43B1,
+ 0xC04B, 0xC04B, 0x2126, 0xC04C, 0xC04C, 0x1F61, 0xC04D, 0xC04D, 0x269D,
+ 0xC04E, 0xC04E, 0x43B7, 0xC04F, 0xC04F, 0x1F8A, 0xC050, 0xC050, 0x2456,
+ 0xC051, 0xC051, 0x2459, 0xC052, 0xC052, 0x2458, 0xC053, 0xC054, 0x43B8,
+ 0xC055, 0xC055, 0x1FAE, 0xC056, 0xC05A, 0x43BA, 0xC05B, 0xC05B, 0x221A,
+ 0xC05C, 0xC05D, 0x43BF, 0xC05E, 0xC05E, 0x1F7A, 0xC05F, 0xC05F, 0x244D,
+ 0xC060, 0xC060, 0x2457, 0xC061, 0xC068, 0x43C1, 0xC069, 0xC069, 0x2453,
+ 0xC06A, 0xC06A, 0x43C9, 0xC06B, 0xC06B, 0x2420, 0xC06C, 0xC06C, 0x43CA,
+ 0xC06D, 0xC06D, 0x21DF, 0xC06E, 0xC06E, 0x2685, 0xC06F, 0xC06F, 0x43CB,
+ 0xC070, 0xC070, 0x1E6E, 0xC071, 0xC073, 0x43CC, 0xC074, 0xC074, 0x2224,
+ 0xC075, 0xC075, 0x2670, 0xC076, 0xC076, 0x43CF, 0xC077, 0xC077, 0x21BA,
+ 0xC078, 0xC078, 0x43D0, 0xC079, 0xC079, 0x245A, 0xC07A, 0xC07B, 0x43D1,
+ 0xC07C, 0xC07C, 0x1FFF, 0xC07D, 0xC07E, 0x43D3, 0xC080, 0xC09A, 0x43D5,
+ 0xC09B, 0xC09B, 0x25E2, 0xC09C, 0xC09C, 0x43F0, 0xC09D, 0xC09D, 0x269A,
+ 0xC09E, 0xC0A0, 0x43F1, 0xC0A1, 0xC0FE, 0x098C, 0xC140, 0xC14F, 0x43F4,
+ 0xC150, 0xC150, 0x1EEA, 0xC151, 0xC153, 0x4404, 0xC154, 0xC154, 0x1E2C,
+ 0xC155, 0xC15E, 0x4407, 0xC15F, 0xC15F, 0x2062, 0xC160, 0xC160, 0x24F1,
+ 0xC161, 0xC161, 0x4411, 0xC162, 0xC162, 0x24F2, 0xC163, 0xC174, 0x4412,
+ 0xC175, 0xC175, 0x25F2, 0xC176, 0xC177, 0x4424, 0xC178, 0xC178, 0x2215,
+ 0xC179, 0xC17E, 0x4426, 0xC180, 0xC194, 0x442C, 0xC195, 0xC195, 0x21AE,
+ 0xC196, 0xC1A0, 0x4441, 0xC1A1, 0xC1FE, 0x09EA, 0xC240, 0xC24D, 0x444C,
+ 0xC24E, 0xC24E, 0x20E0, 0xC24F, 0xC264, 0x445A, 0xC265, 0xC265, 0x25C2,
+ 0xC266, 0xC266, 0x4470, 0xC267, 0xC267, 0x25C1, 0xC268, 0xC27C, 0x4471,
+ 0xC27D, 0xC27D, 0x2128, 0xC27E, 0xC27E, 0x4486, 0xC280, 0xC283, 0x4487,
+ 0xC284, 0xC284, 0x2199, 0xC285, 0xC292, 0x448B, 0xC293, 0xC293, 0x2017,
+ 0xC294, 0xC294, 0x1EA0, 0xC295, 0xC295, 0x2125, 0xC296, 0xC296, 0x214D,
+ 0xC297, 0xC297, 0x4499, 0xC298, 0xC298, 0x25C4, 0xC299, 0xC299, 0x209D,
+ 0xC29A, 0xC29A, 0x228A, 0xC29B, 0xC29B, 0x449A, 0xC29C, 0xC29C, 0x25C3,
+ 0xC29D, 0xC29F, 0x449B, 0xC2A0, 0xC2A0, 0x2179, 0xC2A1, 0xC2FE, 0x0A48,
+ 0xC340, 0xC340, 0x2038, 0xC341, 0xC342, 0x449E, 0xC343, 0xC343, 0x2155,
+ 0xC344, 0xC37A, 0x44A0, 0xC37B, 0xC37B, 0x21D2, 0xC37C, 0xC37E, 0x44D7,
+ 0xC380, 0xC383, 0x44DA, 0xC384, 0xC384, 0x24C7, 0xC385, 0xC39A, 0x44DE,
+ 0xC39B, 0xC39B, 0x2279, 0xC39C, 0xC3A0, 0x44F4, 0xC3A1, 0xC3FE, 0x0AA6,
+ 0xC440, 0xC448, 0x44F9, 0xC449, 0xC449, 0x2123, 0xC44A, 0xC44B, 0x4502,
+ 0xC44C, 0xC44C, 0x24C5, 0xC44D, 0xC453, 0x4504, 0xC454, 0xC454, 0x24C9,
+ 0xC455, 0xC457, 0x450B, 0xC458, 0xC458, 0x2094, 0xC459, 0xC45A, 0x450E,
+ 0xC45B, 0xC45B, 0x2296, 0xC45C, 0xC462, 0x4510, 0xC463, 0xC463, 0x1E77,
+ 0xC464, 0xC476, 0x4517, 0xC477, 0xC477, 0x1F06, 0xC478, 0xC479, 0x452A,
+ 0xC47A, 0xC47A, 0x1FA5, 0xC47B, 0xC47E, 0x452C, 0xC480, 0xC480, 0x4530,
+ 0xC481, 0xC481, 0x2099, 0xC482, 0xC490, 0x4531, 0xC491, 0xC491, 0x1EAD,
+ 0xC492, 0xC492, 0x24C8, 0xC493, 0xC493, 0x20A8, 0xC494, 0xC497, 0x4540,
+ 0xC498, 0xC498, 0x201F, 0xC499, 0xC499, 0x4544, 0xC49A, 0xC49A, 0x20C5,
+ 0xC49B, 0xC49B, 0x4545, 0xC49C, 0xC49C, 0x24CA, 0xC49D, 0xC4A0, 0x4546,
+ 0xC4A1, 0xC4FE, 0x0B04, 0xC540, 0xC543, 0x454A, 0xC544, 0xC544, 0x1FF0,
+ 0xC545, 0xC545, 0x454E, 0xC546, 0xC546, 0x24C6, 0xC547, 0xC54A, 0x454F,
+ 0xC54B, 0xC54B, 0x225D, 0xC54C, 0xC54C, 0x22DE, 0xC54D, 0xC551, 0x4553,
+ 0xC552, 0xC552, 0x202C, 0xC553, 0xC55E, 0x4558, 0xC55F, 0xC55F, 0x2161,
+ 0xC560, 0xC562, 0x4564, 0xC563, 0xC563, 0x223B, 0xC564, 0xC564, 0x21D9,
+ 0xC565, 0xC565, 0x1FCB, 0xC566, 0xC566, 0x1FC9, 0xC567, 0xC57E, 0x4567,
+ 0xC580, 0xC592, 0x457F, 0xC593, 0xC593, 0x1E61, 0xC594, 0xC59B, 0x4592,
+ 0xC59C, 0xC59C, 0x25EF, 0xC59D, 0xC59D, 0x459A, 0xC59E, 0xC59E, 0x1F98,
+ 0xC59F, 0xC5A0, 0x459B, 0xC5A1, 0xC5FE, 0x0B62, 0xC640, 0xC640, 0x459D,
+ 0xC641, 0xC641, 0x25F0, 0xC642, 0xC643, 0x459E, 0xC644, 0xC644, 0x1F88,
+ 0xC645, 0xC646, 0x45A0, 0xC647, 0xC647, 0x21F8, 0xC648, 0xC662, 0x45A2,
+ 0xC663, 0xC663, 0x2322, 0xC664, 0xC671, 0x45BD, 0xC672, 0xC672, 0x2336,
+ 0xC673, 0xC67E, 0x45CB, 0xC680, 0xC6A0, 0x45D7, 0xC6A1, 0xC6FE, 0x0BC0,
+ 0xC740, 0xC765, 0x45F8, 0xC766, 0xC766, 0x22AB, 0xC767, 0xC76E, 0x461E,
+ 0xC76F, 0xC76F, 0x1FBF, 0xC770, 0xC775, 0x4626, 0xC776, 0xC776, 0x1F7D,
+ 0xC777, 0xC77A, 0x462C, 0xC77B, 0xC77B, 0x2333, 0xC77C, 0xC77E, 0x4630,
+ 0xC780, 0xC7A0, 0x4633, 0xC7A1, 0xC7FE, 0x0C1E, 0xC840, 0xC840, 0x4654,
+ 0xC841, 0xC841, 0x1F4D, 0xC842, 0xC84E, 0x4655, 0xC84F, 0xC84F, 0x2334,
+ 0xC850, 0xC851, 0x4662, 0xC852, 0xC852, 0x1FF1, 0xC853, 0xC865, 0x4664,
+ 0xC866, 0xC866, 0x218B, 0xC867, 0xC86D, 0x4677, 0xC86E, 0xC86E, 0x2349,
+ 0xC86F, 0xC87D, 0x467E, 0xC87E, 0xC87E, 0x220B, 0xC880, 0xC886, 0x468D,
+ 0xC887, 0xC887, 0x2346, 0xC888, 0xC891, 0x4694, 0xC892, 0xC892, 0x2347,
+ 0xC893, 0xC893, 0x469E, 0xC894, 0xC894, 0x2193, 0xC895, 0xC898, 0x469F,
+ 0xC899, 0xC899, 0x26A1, 0xC89A, 0xC89C, 0x46A3, 0xC89D, 0xC89D, 0x1F62,
+ 0xC89E, 0xC8A0, 0x46A6, 0xC8A1, 0xC8FE, 0x0C7C, 0xC940, 0xC94E, 0x46A9,
+ 0xC94F, 0xC94F, 0x234D, 0xC950, 0xC950, 0x2348, 0xC951, 0xC96D, 0x46B8,
+ 0xC96E, 0xC96E, 0x1E60, 0xC96F, 0xC96F, 0x46D5, 0xC970, 0xC970, 0x2345,
+ 0xC971, 0xC976, 0x46D6, 0xC977, 0xC977, 0x1F12, 0xC978, 0xC97E, 0x46DC,
+ 0xC980, 0xC98E, 0x46E3, 0xC98F, 0xC98F, 0x2018, 0xC990, 0xC990, 0x2335,
+ 0xC991, 0xC99B, 0x46F2, 0xC99C, 0xC99C, 0x233C, 0xC99D, 0xC9A0, 0x46FD,
+ 0xC9A1, 0xC9FE, 0x0CDA, 0xCA40, 0xCA4D, 0x4701, 0xCA4E, 0xCA4E, 0x266F,
+ 0xCA4F, 0xCA55, 0x470F, 0xCA56, 0xCA56, 0x2351, 0xCA57, 0xCA58, 0x4716,
+ 0xCA59, 0xCA59, 0x1FA0, 0xCA5A, 0xCA5B, 0x4718, 0xCA5C, 0xCA5C, 0x2338,
+ 0xCA5D, 0xCA60, 0x471A, 0xCA61, 0xCA61, 0x221B, 0xCA62, 0xCA6D, 0x471E,
+ 0xCA6E, 0xCA6E, 0x2342, 0xCA6F, 0xCA71, 0x472A, 0xCA72, 0xCA72, 0x234F,
+ 0xCA73, 0xCA76, 0x472D, 0xCA77, 0xCA77, 0x233D, 0xCA78, 0xCA7A, 0x4731,
+ 0xCA7B, 0xCA7B, 0x2344, 0xCA7C, 0xCA7C, 0x2331, 0xCA7D, 0xCA7D, 0x4734,
+ 0xCA7E, 0xCA7E, 0x234B, 0xCA80, 0xCA80, 0x4735, 0xCA81, 0xCA81, 0x233B,
+ 0xCA82, 0xCA88, 0x4736, 0xCA89, 0xCA89, 0x2350, 0xCA8A, 0xCA8D, 0x473D,
+ 0xCA8E, 0xCA8E, 0x1EB4, 0xCA8F, 0xCA8F, 0x21A6, 0xCA90, 0xCA91, 0x4741,
+ 0xCA92, 0xCA92, 0x21CB, 0xCA93, 0xCA99, 0x4743, 0xCA9A, 0xCA9A, 0x2355,
+ 0xCA9B, 0xCAA0, 0x474A, 0xCAA1, 0xCAFE, 0x0D38, 0xCB40, 0xCB42, 0x4750,
+ 0xCB43, 0xCB43, 0x233E, 0xCB44, 0xCB44, 0x4753, 0xCB45, 0xCB45, 0x1F74,
+ 0xCB46, 0xCB46, 0x4754, 0xCB47, 0xCB47, 0x2330, 0xCB48, 0xCB4A, 0x4755,
+ 0xCB4B, 0xCB4B, 0x2680, 0xCB4C, 0xCB4D, 0x4758, 0xCB4E, 0xCB4E, 0x20DA,
+ 0xCB4F, 0xCB56, 0x475A, 0xCB57, 0xCB57, 0x234A, 0xCB58, 0xCB5C, 0x4762,
+ 0xCB5D, 0xCB5D, 0x1F91, 0xCB5E, 0xCB5E, 0x4767, 0xCB5F, 0xCB5F, 0x2107,
+ 0xCB60, 0xCB69, 0x4768, 0xCB6A, 0xCB6A, 0x233F, 0xCB6B, 0xCB7A, 0x4772,
+ 0xCB7B, 0xCB7B, 0x1FF4, 0xCB7C, 0xCB7C, 0x2343, 0xCB7D, 0xCB7E, 0x4782,
+ 0xCB80, 0xCB86, 0x4784, 0xCB87, 0xCB87, 0x2212, 0xCB88, 0xCB8D, 0x478B,
+ 0xCB8E, 0xCB8E, 0x2207, 0xCB8F, 0xCB91, 0x4791, 0xCB92, 0xCB92, 0x2359,
+ 0xCB93, 0xCB9B, 0x4794, 0xCB9C, 0xCB9C, 0x2254, 0xCB9D, 0xCB9D, 0x479D,
+ 0xCB9E, 0xCB9E, 0x2332, 0xCB9F, 0xCBA0, 0x479E, 0xCBA1, 0xCBFE, 0x0D96,
+ 0xCC40, 0xCC40, 0x1E26, 0xCC41, 0xCC41, 0x2357, 0xCC42, 0xCC48, 0x47A0,
+ 0xCC49, 0xCC49, 0x2358, 0xCC4A, 0xCC4A, 0x2042, 0xCC4B, 0xCC4B, 0x2153,
+ 0xCC4C, 0xCC4E, 0x47A7, 0xCC4F, 0xCC4F, 0x20BB, 0xCC50, 0xCC5B, 0x47AA,
+ 0xCC5C, 0xCC5C, 0x235A, 0xCC5D, 0xCC5F, 0x47B6, 0xCC60, 0xCC60, 0x2356,
+ 0xCC61, 0xCC63, 0x47B9, 0xCC64, 0xCC64, 0x2337, 0xCC65, 0xCC6C, 0x47BC,
+ 0xCC6D, 0xCC6D, 0x1FF9, 0xCC6E, 0xCC78, 0x47C4, 0xCC79, 0xCC79, 0x2353,
+ 0xCC7A, 0xCC7C, 0x47CF, 0xCC7D, 0xCC7D, 0x2061, 0xCC7E, 0xCC7E, 0x47D2,
+ 0xCC80, 0xCC8D, 0x47D3, 0xCC8E, 0xCC8E, 0x1E95, 0xCC8F, 0xCC93, 0x47E1,
+ 0xCC94, 0xCC94, 0x2049, 0xCC95, 0xCC95, 0x47E6, 0xCC96, 0xCC96, 0x1F42,
+ 0xCC97, 0xCC9C, 0x47E7, 0xCC9D, 0xCC9D, 0x1FE8, 0xCC9E, 0xCCA0, 0x47ED,
+ 0xCCA1, 0xCCFE, 0x0DF4, 0xCD40, 0xCD7E, 0x47F0, 0xCD80, 0xCD8F, 0x482F,
+ 0xCD90, 0xCD90, 0x25DA, 0xCD91, 0xCD97, 0x483F, 0xCD98, 0xCD98, 0x25D7,
+ 0xCD99, 0xCDA0, 0x4846, 0xCDA1, 0xCDFE, 0x0E52, 0xCE40, 0xCE66, 0x484E,
+ 0xCE67, 0xCE67, 0x212E, 0xCE68, 0xCE71, 0x4875, 0xCE72, 0xCE72, 0x21B2,
+ 0xCE73, 0xCE7E, 0x487F, 0xCE80, 0xCE80, 0x488B, 0xCE81, 0xCE81, 0x219E,
+ 0xCE82, 0xCE86, 0x488C, 0xCE87, 0xCE87, 0x25DC, 0xCE88, 0xCE9A, 0x4891,
+ 0xCE9B, 0xCE9B, 0x206C, 0xCE9C, 0xCE9D, 0x48A4, 0xCE9E, 0xCE9E, 0x2226,
+ 0xCE9F, 0xCEA0, 0x48A6, 0xCEA1, 0xCEFE, 0x0EB0, 0xCF40, 0xCF4D, 0x48A8,
+ 0xCF4E, 0xCF4E, 0x25E0, 0xCF4F, 0xCF54, 0x48B6, 0xCF55, 0xCF55, 0x227B,
+ 0xCF56, 0xCF57, 0x48BC, 0xCF58, 0xCF58, 0x25DE, 0xCF59, 0xCF5B, 0x48BE,
+ 0xCF5C, 0xCF5C, 0x25E1, 0xCF5D, 0xCF6B, 0x48C1, 0xCF6C, 0xCF6C, 0x25D5,
+ 0xCF6D, 0xCF72, 0x48D0, 0xCF73, 0xCF73, 0x1E6B, 0xCF74, 0xCF74, 0x48D6,
+ 0xCF75, 0xCF75, 0x25DB, 0xCF76, 0xCF77, 0x48D7, 0xCF78, 0xCF78, 0x1E89,
+ 0xCF79, 0xCF7B, 0x48D9, 0xCF7C, 0xCF7C, 0x25D9, 0xCF7D, 0xCF7E, 0x48DC,
+ 0xCF80, 0xCF80, 0x48DE, 0xCF81, 0xCF81, 0x2211, 0xCF82, 0xCF88, 0x48DF,
+ 0xCF89, 0xCF89, 0x2229, 0xCF8A, 0xCF8A, 0x25D6, 0xCF8B, 0xCF92, 0x48E6,
+ 0xCF93, 0xCF93, 0x25DD, 0xCF94, 0xCF94, 0x25DF, 0xCF95, 0xCF9D, 0x48EE,
+ 0xCF9E, 0xCF9E, 0x1FEF, 0xCF9F, 0xCF9F, 0x48F7, 0xCFA0, 0xCFA0, 0x25D8,
+ 0xCFA1, 0xCFFE, 0x0F0E, 0xD040, 0xD04C, 0x48F8, 0xD04D, 0xD04D, 0x1F29,
+ 0xD04E, 0xD050, 0x4905, 0xD051, 0xD051, 0x1E5B, 0xD052, 0xD054, 0x4908,
+ 0xD055, 0xD055, 0x2076, 0xD056, 0xD05B, 0x490B, 0xD05C, 0xD05C, 0x2297,
+ 0xD05D, 0xD05F, 0x4911, 0xD060, 0xD060, 0x2690, 0xD061, 0xD066, 0x4914,
+ 0xD067, 0xD067, 0x213F, 0xD068, 0xD06B, 0x491A, 0xD06C, 0xD06C, 0x2198,
+ 0xD06D, 0xD06D, 0x491E, 0xD06E, 0xD06E, 0x1E88, 0xD06F, 0xD07C, 0x491F,
+ 0xD07D, 0xD07D, 0x228C, 0xD07E, 0xD07E, 0x492D, 0xD080, 0xD0A0, 0x492E,
+ 0xD0A1, 0xD0FE, 0x0F6C, 0xD140, 0xD154, 0x494F, 0xD155, 0xD155, 0x25F1,
+ 0xD156, 0xD158, 0x4964, 0xD159, 0xD159, 0x200C, 0xD15A, 0xD160, 0x4967,
+ 0xD161, 0xD161, 0x1E58, 0xD162, 0xD162, 0x22AC, 0xD163, 0xD174, 0x496E,
+ 0xD175, 0xD175, 0x26A7, 0xD176, 0xD17C, 0x4980, 0xD17D, 0xD17D, 0x2676,
+ 0xD17E, 0xD17E, 0x4987, 0xD180, 0xD19C, 0x4988, 0xD19D, 0xD19D, 0x1FE1,
+ 0xD19E, 0xD19E, 0x25BB, 0xD19F, 0xD1A0, 0x49A5, 0xD1A1, 0xD1FE, 0x0FCA,
+ 0xD240, 0xD240, 0x25BE, 0xD241, 0xD242, 0x49A7, 0xD243, 0xD243, 0x22DD,
+ 0xD244, 0xD24C, 0x49A9, 0xD24D, 0xD24D, 0x25BD, 0xD24E, 0xD25B, 0x49B2,
+ 0xD25C, 0xD25C, 0x1E2A, 0xD25D, 0xD262, 0x49C0, 0xD263, 0xD263, 0x25BC,
+ 0xD264, 0xD264, 0x25BA, 0xD265, 0xD267, 0x49C6, 0xD268, 0xD268, 0x25BF,
+ 0xD269, 0xD26C, 0x49C9, 0xD26D, 0xD26D, 0x2187, 0xD26E, 0xD26E, 0x49CD,
+ 0xD26F, 0xD26F, 0x266B, 0xD270, 0xD271, 0x49CE, 0xD272, 0xD272, 0x1E7F,
+ 0xD273, 0xD274, 0x49D0, 0xD275, 0xD275, 0x21AD, 0xD276, 0xD27E, 0x49D2,
+ 0xD280, 0xD289, 0x49DB, 0xD28A, 0xD28A, 0x1F96, 0xD28B, 0xD28D, 0x49E5,
+ 0xD28E, 0xD28E, 0x1F32, 0xD28F, 0xD291, 0x49E8, 0xD292, 0xD292, 0x2084,
+ 0xD293, 0xD294, 0x49EB, 0xD295, 0xD295, 0x2136, 0xD296, 0xD296, 0x49ED,
+ 0xD297, 0xD297, 0x24B8, 0xD298, 0xD29F, 0x49EE, 0xD2A0, 0xD2A0, 0x24BA,
+ 0xD2A1, 0xD2FE, 0x1028, 0xD340, 0xD343, 0x49F6, 0xD344, 0xD344, 0x24BC,
+ 0xD345, 0xD347, 0x49FA, 0xD348, 0xD348, 0x20E4, 0xD349, 0xD349, 0x49FD,
+ 0xD34A, 0xD34A, 0x24B9, 0xD34B, 0xD34C, 0x49FE, 0xD34D, 0xD34D, 0x24BD,
+ 0xD34E, 0xD34F, 0x4A00, 0xD350, 0xD350, 0x24BE, 0xD351, 0xD354, 0x4A02,
+ 0xD355, 0xD355, 0x24BF, 0xD356, 0xD357, 0x4A06, 0xD358, 0xD358, 0x1FD2,
+ 0xD359, 0xD35A, 0x4A08, 0xD35B, 0xD35B, 0x1FFD, 0xD35C, 0xD35C, 0x4A0A,
+ 0xD35D, 0xD35D, 0x24BB, 0xD35E, 0xD35E, 0x1F2D, 0xD35F, 0xD377, 0x4A0B,
+ 0xD378, 0xD378, 0x2609, 0xD379, 0xD379, 0x4A24, 0xD37A, 0xD37A, 0x260A,
+ 0xD37B, 0xD37B, 0x4A25, 0xD37C, 0xD37C, 0x1E94, 0xD37D, 0xD37E, 0x4A26,
+ 0xD380, 0xD384, 0x4A28, 0xD385, 0xD385, 0x22DF, 0xD386, 0xD386, 0x1ECB,
+ 0xD387, 0xD387, 0x1F0D, 0xD388, 0xD38A, 0x4A2D, 0xD38B, 0xD38B, 0x1F77,
+ 0xD38C, 0xD38C, 0x4A30, 0xD38D, 0xD38D, 0x21EB, 0xD38E, 0xD38E, 0x4A31,
+ 0xD38F, 0xD38F, 0x22E1, 0xD390, 0xD390, 0x4A32, 0xD391, 0xD391, 0x216F,
+ 0xD392, 0xD392, 0x4A33, 0xD393, 0xD393, 0x22E0, 0xD394, 0xD395, 0x4A34,
+ 0xD396, 0xD396, 0x21EA, 0xD397, 0xD397, 0x4A36, 0xD398, 0xD398, 0x22E2,
+ 0xD399, 0xD399, 0x20CB, 0xD39A, 0xD39A, 0x4A37, 0xD39B, 0xD39B, 0x1F78,
+ 0xD39C, 0xD39D, 0x4A38, 0xD39E, 0xD39E, 0x1EE2, 0xD39F, 0xD39F, 0x4A3A,
+ 0xD3A0, 0xD3A0, 0x21F2, 0xD3A1, 0xD3FE, 0x1086, 0xD440, 0xD440, 0x4A3B,
+ 0xD441, 0xD441, 0x2150, 0xD442, 0xD444, 0x4A3C, 0xD445, 0xD445, 0x1FD3,
+ 0xD446, 0xD446, 0x4A3F, 0xD447, 0xD447, 0x22E5, 0xD448, 0xD44B, 0x4A40,
+ 0xD44C, 0xD44C, 0x1EF2, 0xD44D, 0xD44E, 0x4A44, 0xD44F, 0xD44F, 0x211F,
+ 0xD450, 0xD452, 0x4A46, 0xD453, 0xD453, 0x21DD, 0xD454, 0xD455, 0x4A49,
+ 0xD456, 0xD456, 0x2154, 0xD457, 0xD457, 0x4A4B, 0xD458, 0xD458, 0x22E7,
+ 0xD459, 0xD45B, 0x4A4C, 0xD45C, 0xD45C, 0x2282, 0xD45D, 0xD461, 0x4A4F,
+ 0xD462, 0xD462, 0x22E6, 0xD463, 0xD466, 0x4A54, 0xD467, 0xD467, 0x22E8,
+ 0xD468, 0xD46D, 0x4A58, 0xD46E, 0xD46E, 0x22E4, 0xD46F, 0xD46F, 0x4A5E,
+ 0xD470, 0xD470, 0x226A, 0xD471, 0xD471, 0x4A5F, 0xD472, 0xD472, 0x22EB,
+ 0xD473, 0xD473, 0x4A60, 0xD474, 0xD474, 0x22E9, 0xD475, 0xD475, 0x20BD,
+ 0xD476, 0xD477, 0x4A61, 0xD478, 0xD478, 0x22EA, 0xD479, 0xD47A, 0x4A63,
+ 0xD47B, 0xD47B, 0x22BD, 0xD47C, 0xD47D, 0x4A65, 0xD47E, 0xD47E, 0x1E9E,
+ 0xD480, 0xD481, 0x4A67, 0xD482, 0xD482, 0x22F6, 0xD483, 0xD483, 0x21E7,
+ 0xD484, 0xD484, 0x2216, 0xD485, 0xD486, 0x4A69, 0xD487, 0xD487, 0x2137,
+ 0xD488, 0xD489, 0x4A6B, 0xD48A, 0xD48A, 0x212C, 0xD48B, 0xD48B, 0x4A6D,
+ 0xD48C, 0xD48C, 0x1E68, 0xD48D, 0xD48D, 0x22F2, 0xD48E, 0xD48E, 0x1F37,
+ 0xD48F, 0xD48F, 0x22F3, 0xD490, 0xD490, 0x4A6E, 0xD491, 0xD491, 0x22EF,
+ 0xD492, 0xD492, 0x1F50, 0xD493, 0xD493, 0x1F10, 0xD494, 0xD494, 0x21C8,
+ 0xD495, 0xD495, 0x4A6F, 0xD496, 0xD496, 0x22F1, 0xD497, 0xD49B, 0x4A70,
+ 0xD49C, 0xD49C, 0x22F0, 0xD49D, 0xD49E, 0x4A75, 0xD49F, 0xD49F, 0x22EE,
+ 0xD4A0, 0xD4A0, 0x4A77, 0xD4A1, 0xD4FE, 0x10E4, 0xD540, 0xD542, 0x4A78,
+ 0xD543, 0xD543, 0x22ED, 0xD544, 0xD544, 0x229E, 0xD545, 0xD545, 0x22EC,
+ 0xD546, 0xD546, 0x1FE2, 0xD547, 0xD549, 0x4A7B, 0xD54A, 0xD54A, 0x20FE,
+ 0xD54B, 0xD54D, 0x4A7E, 0xD54E, 0xD54F, 0x22F9, 0xD550, 0xD550, 0x4A81,
+ 0xD551, 0xD551, 0x1EAF, 0xD552, 0xD553, 0x4A82, 0xD554, 0xD554, 0x2236,
+ 0xD555, 0xD555, 0x4A84, 0xD556, 0xD556, 0x22F7, 0xD557, 0xD559, 0x4A85,
+ 0xD55A, 0xD55A, 0x223D, 0xD55B, 0xD55B, 0x4A88, 0xD55C, 0xD55C, 0x1E82,
+ 0xD55D, 0xD55D, 0x1FB6, 0xD55E, 0xD55E, 0x4A89, 0xD55F, 0xD55F, 0x21A4,
+ 0xD560, 0xD560, 0x21AA, 0xD561, 0xD561, 0x22F8, 0xD562, 0xD562, 0x2151,
+ 0xD563, 0xD563, 0x4A8A, 0xD564, 0xD564, 0x1F60, 0xD565, 0xD567, 0x4A8B,
+ 0xD568, 0xD568, 0x2147, 0xD569, 0xD56B, 0x4A8E, 0xD56C, 0xD56C, 0x2145,
+ 0xD56D, 0xD56D, 0x4A91, 0xD56E, 0xD56E, 0x1FDC, 0xD56F, 0xD571, 0x4A92,
+ 0xD572, 0xD572, 0x2301, 0xD573, 0xD574, 0x4A95, 0xD575, 0xD575, 0x1EF5,
+ 0xD576, 0xD577, 0x4A97, 0xD578, 0xD578, 0x2218, 0xD579, 0xD57A, 0x4A99,
+ 0xD57B, 0xD57B, 0x1EC6, 0xD57C, 0xD57D, 0x4A9B, 0xD57E, 0xD57E, 0x2300,
+ 0xD580, 0xD580, 0x4A9D, 0xD581, 0xD581, 0x22B4, 0xD582, 0xD583, 0x4A9E,
+ 0xD584, 0xD584, 0x2169, 0xD585, 0xD585, 0x4AA0, 0xD586, 0xD586, 0x22FD,
+ 0xD587, 0xD587, 0x4AA1, 0xD588, 0xD588, 0x20EA, 0xD589, 0xD589, 0x4AA2,
+ 0xD58A, 0xD58A, 0x22F4, 0xD58B, 0xD58B, 0x4AA3, 0xD58C, 0xD58C, 0x22FB,
+ 0xD58D, 0xD58D, 0x4AA4, 0xD58E, 0xD58E, 0x22FC, 0xD58F, 0xD58F, 0x2027,
+ 0xD590, 0xD592, 0x4AA5, 0xD593, 0xD593, 0x2060, 0xD594, 0xD594, 0x22FF,
+ 0xD595, 0xD597, 0x4AA8, 0xD598, 0xD598, 0x22FE, 0xD599, 0xD599, 0x1EC7,
+ 0xD59A, 0xD59A, 0x4AAB, 0xD59B, 0xD59B, 0x230C, 0xD59C, 0xD59E, 0x4AAC,
+ 0xD59F, 0xD59F, 0x22F5, 0xD5A0, 0xD5A0, 0x4AAF, 0xD5A1, 0xD5FE, 0x1142,
+ 0xD640, 0xD640, 0x2306, 0xD641, 0xD641, 0x4AB0, 0xD642, 0xD642, 0x230A,
+ 0xD643, 0xD643, 0x21D3, 0xD644, 0xD646, 0x4AB1, 0xD647, 0xD647, 0x2303,
+ 0xD648, 0xD648, 0x4AB4, 0xD649, 0xD649, 0x2307, 0xD64A, 0xD64A, 0x230B,
+ 0xD64B, 0xD64C, 0x4AB5, 0xD64D, 0xD64D, 0x1F5F, 0xD64E, 0xD64E, 0x4AB7,
+ 0xD64F, 0xD64F, 0x2309, 0xD650, 0xD651, 0x4AB8, 0xD652, 0xD652, 0x2302,
+ 0xD653, 0xD653, 0x1F04, 0xD654, 0xD654, 0x229D, 0xD655, 0xD655, 0x4ABA,
+ 0xD656, 0xD656, 0x21FB, 0xD657, 0xD657, 0x4ABB, 0xD658, 0xD658, 0x2308,
+ 0xD659, 0xD659, 0x4ABC, 0xD65A, 0xD65A, 0x20AC, 0xD65B, 0xD65B, 0x4ABD,
+ 0xD65C, 0xD65C, 0x208E, 0xD65D, 0xD65D, 0x2305, 0xD65E, 0xD65E, 0x2197,
+ 0xD65F, 0xD65F, 0x4ABE, 0xD660, 0xD660, 0x2171, 0xD661, 0xD661, 0x2298,
+ 0xD662, 0xD664, 0x4ABF, 0xD665, 0xD665, 0x1F57, 0xD666, 0xD668, 0x4AC2,
+ 0xD669, 0xD669, 0x2082, 0xD66A, 0xD66A, 0x4AC5, 0xD66B, 0xD66B, 0x2311,
+ 0xD66C, 0xD66E, 0x4AC6, 0xD66F, 0xD66F, 0x2304, 0xD670, 0xD670, 0x4AC9,
+ 0xD671, 0xD671, 0x230F, 0xD672, 0xD672, 0x1E35, 0xD673, 0xD673, 0x4ACA,
+ 0xD674, 0xD674, 0x20D1, 0xD675, 0xD675, 0x2310, 0xD676, 0xD676, 0x1FA3,
+ 0xD677, 0xD677, 0x4ACB, 0xD678, 0xD678, 0x21D6, 0xD679, 0xD67B, 0x4ACC,
+ 0xD67C, 0xD67C, 0x2206, 0xD67D, 0xD67E, 0x4ACF, 0xD680, 0xD682, 0x4AD1,
+ 0xD683, 0xD683, 0x230D, 0xD684, 0xD685, 0x4AD4, 0xD686, 0xD686, 0x2312,
+ 0xD687, 0xD687, 0x208D, 0xD688, 0xD688, 0x2313, 0xD689, 0xD68D, 0x4AD6,
+ 0xD68E, 0xD68E, 0x22E3, 0xD68F, 0xD693, 0x4ADB, 0xD694, 0xD694, 0x1FBA,
+ 0xD695, 0xD698, 0x4AE0, 0xD699, 0xD699, 0x2078, 0xD69A, 0xD6A0, 0x4AE4,
+ 0xD6A1, 0xD6FE, 0x11A0, 0xD740, 0xD742, 0x4AEB, 0xD743, 0xD743, 0x2288,
+ 0xD744, 0xD747, 0x4AEE, 0xD748, 0xD748, 0x2316, 0xD749, 0xD749, 0x1F6B,
+ 0xD74A, 0xD74F, 0x4AF2, 0xD750, 0xD750, 0x2314, 0xD751, 0xD751, 0x4AF8,
+ 0xD752, 0xD752, 0x2130, 0xD753, 0xD753, 0x2315, 0xD754, 0xD754, 0x2168,
+ 0xD755, 0xD755, 0x4AF9, 0xD756, 0xD756, 0x20C4, 0xD757, 0xD763, 0x4AFA,
+ 0xD764, 0xD764, 0x2318, 0xD765, 0xD766, 0x4B07, 0xD767, 0xD767, 0x2219,
+ 0xD768, 0xD768, 0x2217, 0xD769, 0xD76B, 0x4B09, 0xD76C, 0xD76C, 0x20D5,
+ 0xD76D, 0xD76E, 0x4B0C, 0xD76F, 0xD76F, 0x1F4A, 0xD770, 0xD774, 0x4B0E,
+ 0xD775, 0xD775, 0x2240, 0xD776, 0xD777, 0x4B13, 0xD778, 0xD778, 0x1ED3,
+ 0xD779, 0xD77E, 0x4B15, 0xD780, 0xD782, 0x4B1B, 0xD783, 0xD783, 0x1E49,
+ 0xD784, 0xD786, 0x4B1E, 0xD787, 0xD787, 0x261B, 0xD788, 0xD78A, 0x4B21,
+ 0xD78B, 0xD78B, 0x1E6D, 0xD78C, 0xD78C, 0x20F8, 0xD78D, 0xD78D, 0x4B24,
+ 0xD78E, 0xD78E, 0x1FFB, 0xD78F, 0xD78F, 0x2319, 0xD790, 0xD794, 0x4B25,
+ 0xD795, 0xD795, 0x230E, 0xD796, 0xD796, 0x4B2A, 0xD797, 0xD797, 0x2317,
+ 0xD798, 0xD7A0, 0x4B2B, 0xD7A1, 0xD7F9, 0x11FE, 0xD840, 0xD84C, 0x4B34,
+ 0xD84D, 0xD84D, 0x20C8, 0xD84E, 0xD852, 0x4B41, 0xD853, 0xD853, 0x1EFD,
+ 0xD854, 0xD87E, 0x4B46, 0xD880, 0xD88F, 0x4B71, 0xD890, 0xD890, 0x1E3B,
+ 0xD891, 0xD891, 0x227F, 0xD892, 0xD892, 0x4B81, 0xD893, 0xD893, 0x1F0C,
+ 0xD894, 0xD894, 0x1E59, 0xD895, 0xD895, 0x1F24, 0xD896, 0xD899, 0x4B82,
+ 0xD89A, 0xD89A, 0x20BA, 0xD89B, 0xD89B, 0x1F65, 0xD89C, 0xD89C, 0x1EF0,
+ 0xD89D, 0xD89D, 0x2164, 0xD89E, 0xD89E, 0x1F30, 0xD89F, 0xD89F, 0x2261,
+ 0xD8A0, 0xD8A0, 0x4B86, 0xD8A1, 0xD8FE, 0x1257, 0xD940, 0xD940, 0x4B87,
+ 0xD941, 0xD941, 0x22A2, 0xD942, 0xD942, 0x24AB, 0xD943, 0xD943, 0x4B88,
+ 0xD944, 0xD944, 0x24AF, 0xD945, 0xD945, 0x1EE8, 0xD946, 0xD946, 0x1F39,
+ 0xD947, 0xD947, 0x4B89, 0xD948, 0xD948, 0x1E48, 0xD949, 0xD949, 0x2070,
+ 0xD94A, 0xD94A, 0x1EA8, 0xD94B, 0xD94B, 0x4B8A, 0xD94C, 0xD94C, 0x24AC,
+ 0xD94D, 0xD94D, 0x1EF7, 0xD94E, 0xD94E, 0x2176, 0xD94F, 0xD94F, 0x24AD,
+ 0xD950, 0xD950, 0x4B8B, 0xD951, 0xD951, 0x207B, 0xD952, 0xD952, 0x1F45,
+ 0xD953, 0xD953, 0x24AA, 0xD954, 0xD954, 0x204B, 0xD955, 0xD955, 0x202F,
+ 0xD956, 0xD956, 0x1F5A, 0xD957, 0xD957, 0x24B0, 0xD958, 0xD958, 0x4B8C,
+ 0xD959, 0xD959, 0x22B7, 0xD95A, 0xD95A, 0x1F7F, 0xD95B, 0xD95B, 0x4B8D,
+ 0xD95C, 0xD95C, 0x2265, 0xD95D, 0xD962, 0x4B8E, 0xD963, 0xD963, 0x24B2,
+ 0xD964, 0xD964, 0x211B, 0xD965, 0xD965, 0x1E51, 0xD966, 0xD966, 0x4B94,
+ 0xD967, 0xD967, 0x24B4, 0xD968, 0xD96B, 0x4B95, 0xD96C, 0xD96C, 0x24B3,
+ 0xD96D, 0xD96D, 0x4B99, 0xD96E, 0xD96E, 0x1E9F, 0xD96F, 0xD96F, 0x4B9A,
+ 0xD970, 0xD970, 0x2118, 0xD971, 0xD971, 0x4B9B, 0xD972, 0xD972, 0x20B4,
+ 0xD973, 0xD973, 0x23AF, 0xD974, 0xD974, 0x21BB, 0xD975, 0xD975, 0x2072,
+ 0xD976, 0xD976, 0x1F95, 0xD977, 0xD977, 0x4B9C, 0xD978, 0xD978, 0x1F0A,
+ 0xD979, 0xD979, 0x24B6, 0xD97A, 0xD97B, 0x4B9D, 0xD97C, 0xD97C, 0x2291,
+ 0xD97D, 0xD97D, 0x24B5, 0xD97E, 0xD97E, 0x2278, 0xD980, 0xD980, 0x1ED4,
+ 0xD981, 0xD986, 0x4B9F, 0xD987, 0xD987, 0x1FF3, 0xD988, 0xD98C, 0x4BA5,
+ 0xD98D, 0xD98D, 0x22A9, 0xD98E, 0xD98E, 0x24B7, 0xD98F, 0xD98F, 0x1F28,
+ 0xD990, 0xD990, 0x2109, 0xD991, 0xD991, 0x22C7, 0xD992, 0xD996, 0x4BAA,
+ 0xD997, 0xD997, 0x24AE, 0xD998, 0xD998, 0x22B1, 0xD999, 0xD99A, 0x4BAF,
+ 0xD99B, 0xD99B, 0x2266, 0xD99C, 0xD99C, 0x4BB1, 0xD99D, 0xD99D, 0x225B,
+ 0xD99E, 0xD99E, 0x22C4, 0xD99F, 0xD99F, 0x4BB2, 0xD9A0, 0xD9A0, 0x2115,
+ 0xD9A1, 0xD9FE, 0x12B5, 0xDA40, 0xDA40, 0x4BB3, 0xDA41, 0xDA41, 0x222A,
+ 0xDA42, 0xDA42, 0x24B1, 0xDA43, 0xDA47, 0x4BB4, 0xDA48, 0xDA48, 0x213D,
+ 0xDA49, 0xDA4C, 0x4BB9, 0xDA4D, 0xDA4D, 0x1F15, 0xDA4E, 0xDA4E, 0x225C,
+ 0xDA4F, 0xDA72, 0x4BBD, 0xDA73, 0xDA73, 0x1F14, 0xDA74, 0xDA76, 0x4BE1,
+ 0xDA77, 0xDA77, 0x227A, 0xDA78, 0xDA7E, 0x4BE4, 0xDA80, 0xDA84, 0x4BEB,
+ 0xDA85, 0xDA85, 0x20EE, 0xDA86, 0xDA8D, 0x4BF0, 0xDA8E, 0xDA8E, 0x25F8,
+ 0xDA8F, 0xDAA0, 0x4BF8, 0xDAA1, 0xDAFE, 0x1313, 0xDB40, 0xDB5F, 0x4C0A,
+ 0xDB60, 0xDB60, 0x1F94, 0xDB61, 0xDB77, 0x4C2A, 0xDB78, 0xDB78, 0x2230,
+ 0xDB79, 0xDB7E, 0x4C41, 0xDB80, 0xDB83, 0x4C47, 0xDB84, 0xDB84, 0x25FD,
+ 0xDB85, 0xDB8A, 0x4C4B, 0xDB8B, 0xDB8B, 0x2600, 0xDB8C, 0xDB97, 0x4C51,
+ 0xDB98, 0xDB98, 0x2606, 0xDB99, 0xDBA0, 0x4C5D, 0xDBA1, 0xDBFE, 0x1371,
+ 0xDC40, 0xDC44, 0x4C65, 0xDC45, 0xDC45, 0x25FF, 0xDC46, 0xDC4E, 0x4C6A,
+ 0xDC4F, 0xDC4F, 0x25FC, 0xDC50, 0xDC50, 0x1E8C, 0xDC51, 0xDC51, 0x2602,
+ 0xDC52, 0xDC52, 0x4C73, 0xDC53, 0xDC53, 0x224D, 0xDC54, 0xDC54, 0x4C74,
+ 0xDC55, 0xDC55, 0x2604, 0xDC56, 0xDC56, 0x25FE, 0xDC57, 0xDC57, 0x2603,
+ 0xDC58, 0xDC5C, 0x4C75, 0xDC5D, 0xDC5D, 0x2601, 0xDC5E, 0xDC61, 0x4C7A,
+ 0xDC62, 0xDC62, 0x2605, 0xDC63, 0xDC65, 0x4C7E, 0xDC66, 0xDC66, 0x1EA3,
+ 0xDC67, 0xDC67, 0x2608, 0xDC68, 0xDC6A, 0x4C81, 0xDC6B, 0xDC6B, 0x2607,
+ 0xDC6C, 0xDC7B, 0x4C84, 0xDC7C, 0xDC7C, 0x20F0, 0xDC7D, 0xDC7E, 0x4C94,
+ 0xDC80, 0xDC86, 0x4C96, 0xDC87, 0xDC87, 0x1E7B, 0xDC88, 0xDC88, 0x2267,
+ 0xDC89, 0xDC89, 0x1F36, 0xDC8A, 0xDC8A, 0x1FD6, 0xDC8B, 0xDC8D, 0x4C9D,
+ 0xDC8E, 0xDC8E, 0x21E0, 0xDC8F, 0xDC8F, 0x4CA0, 0xDC90, 0xDC90, 0x248C,
+ 0xDC91, 0xDC96, 0x4CA1, 0xDC97, 0xDC97, 0x248D, 0xDC98, 0xDC9A, 0x4CA7,
+ 0xDC9B, 0xDC9B, 0x2102, 0xDC9C, 0xDC9F, 0x4CAA, 0xDCA0, 0xDCA0, 0x2494,
+ 0xDCA1, 0xDCFE, 0x13CF, 0xDD40, 0xDD45, 0x4CAE, 0xDD46, 0xDD46, 0x2493,
+ 0xDD47, 0xDD4C, 0x4CB4, 0xDD4D, 0xDD4D, 0x248E, 0xDD4E, 0xDD52, 0x4CBA,
+ 0xDD53, 0xDD53, 0x2299, 0xDD54, 0xDD54, 0x2491, 0xDD55, 0xDD55, 0x2496,
+ 0xDD56, 0xDD56, 0x248F, 0xDD57, 0xDD57, 0x2492, 0xDD58, 0xDD58, 0x4CBF,
+ 0xDD59, 0xDD59, 0x2497, 0xDD5A, 0xDD5D, 0x4CC0, 0xDD5E, 0xDD5E, 0x1FB1,
+ 0xDD5F, 0xDD5F, 0x4CC4, 0xDD60, 0xDD60, 0x249A, 0xDD61, 0xDD61, 0x4CC5,
+ 0xDD62, 0xDD62, 0x2499, 0xDD63, 0xDD63, 0x4CC6, 0xDD64, 0xDD64, 0x2258,
+ 0xDD65, 0xDD65, 0x2498, 0xDD66, 0xDD6C, 0x4CC7, 0xDD6D, 0xDD6D, 0x249B,
+ 0xDD6E, 0xDD6E, 0x4CCE, 0xDD6F, 0xDD6F, 0x1F09, 0xDD70, 0xDD70, 0x20E6,
+ 0xDD71, 0xDD75, 0x4CCF, 0xDD76, 0xDD76, 0x2026, 0xDD77, 0xDD77, 0x249F,
+ 0xDD78, 0xDD78, 0x1F59, 0xDD79, 0xDD7A, 0x249D, 0xDD7B, 0xDD7E, 0x4CD4,
+ 0xDD80, 0xDD80, 0x4CD8, 0xDD81, 0xDD81, 0x1F3B, 0xDD82, 0xDD82, 0x249C,
+ 0xDD83, 0xDD84, 0x4CD9, 0xDD85, 0xDD85, 0x1E3A, 0xDD86, 0xDD86, 0x205B,
+ 0xDD87, 0xDD8A, 0x4CDB, 0xDD8B, 0xDD8B, 0x1F70, 0xDD8C, 0xDD8E, 0x4CDF,
+ 0xDD8F, 0xDD8F, 0x24A0, 0xDD90, 0xDD93, 0x4CE2, 0xDD94, 0xDD94, 0x213B,
+ 0xDD95, 0xDD96, 0x4CE6, 0xDD97, 0xDD97, 0x1F07, 0xDD98, 0xDD99, 0x4CE8,
+ 0xDD9A, 0xDD9A, 0x2270, 0xDD9B, 0xDD9B, 0x2237, 0xDD9C, 0xDD9D, 0x4CEA,
+ 0xDD9E, 0xDD9E, 0x24D2, 0xDD9F, 0xDD9F, 0x4CEC, 0xDDA0, 0xDDA0, 0x21B3,
+ 0xDDA1, 0xDDFE, 0x142D, 0xDE40, 0xDE40, 0x2245, 0xDE41, 0xDE41, 0x24A1,
+ 0xDE42, 0xDE43, 0x4CED, 0xDE44, 0xDE44, 0x22A8, 0xDE45, 0xDE47, 0x4CEF,
+ 0xDE48, 0xDE48, 0x227C, 0xDE49, 0xDE49, 0x1FB0, 0xDE4A, 0xDE4E, 0x4CF2,
+ 0xDE4F, 0xDE4F, 0x24A2, 0xDE50, 0xDE59, 0x4CF7, 0xDE5A, 0xDE5A, 0x1F46,
+ 0xDE5B, 0xDE5B, 0x4D01, 0xDE5C, 0xDE5C, 0x2380, 0xDE5D, 0xDE5D, 0x2495,
+ 0xDE5E, 0xDE5E, 0x4D02, 0xDE5F, 0xDE5F, 0x2490, 0xDE60, 0xDE6A, 0x4D03,
+ 0xDE6B, 0xDE6B, 0x1E30, 0xDE6C, 0xDE6E, 0x4D0E, 0xDE6F, 0xDE6F, 0x1E9D,
+ 0xDE70, 0xDE70, 0x1E4B, 0xDE71, 0xDE71, 0x1E4A, 0xDE72, 0xDE72, 0x20AA,
+ 0xDE73, 0xDE7E, 0x4D11, 0xDE80, 0xDE91, 0x4D1D, 0xDE92, 0xDE92, 0x267B,
+ 0xDE93, 0xDE9E, 0x4D2F, 0xDE9F, 0xDE9F, 0x23F2, 0xDEA0, 0xDEA0, 0x4D3B,
+ 0xDEA1, 0xDEFE, 0x148B, 0xDF40, 0xDF40, 0x227E, 0xDF41, 0xDF41, 0x4D3C,
+ 0xDF42, 0xDF42, 0x2019, 0xDF43, 0xDF4C, 0x4D3D, 0xDF4D, 0xDF4D, 0x1FBB,
+ 0xDF4E, 0xDF5B, 0x4D47, 0xDF5C, 0xDF5C, 0x2253, 0xDF5D, 0xDF5D, 0x4D55,
+ 0xDF5E, 0xDF5E, 0x1F3E, 0xDF5F, 0xDF5F, 0x1EA6, 0xDF60, 0xDF60, 0x218E,
+ 0xDF61, 0xDF63, 0x4D56, 0xDF64, 0xDF64, 0x21EC, 0xDF65, 0xDF65, 0x4D59,
+ 0xDF66, 0xDF66, 0x1EBE, 0xDF67, 0xDF67, 0x4D5A, 0xDF68, 0xDF68, 0x224A,
+ 0xDF69, 0xDF6C, 0x4D5B, 0xDF6D, 0xDF6D, 0x2133, 0xDF6E, 0xDF73, 0x4D5F,
+ 0xDF74, 0xDF74, 0x1E84, 0xDF75, 0xDF76, 0x4D65, 0xDF77, 0xDF77, 0x20CF,
+ 0xDF78, 0xDF78, 0x21E2, 0xDF79, 0xDF79, 0x4D67, 0xDF7A, 0xDF7A, 0x220F,
+ 0xDF7B, 0xDF7B, 0x4D68, 0xDF7C, 0xDF7C, 0x2029, 0xDF7D, 0xDF7D, 0x4D69,
+ 0xDF7E, 0xDF7E, 0x2073, 0xDF80, 0xDF80, 0x1F55, 0xDF81, 0xDF82, 0x4D6A,
+ 0xDF83, 0xDF83, 0x23F1, 0xDF84, 0xDF84, 0x4D6C, 0xDF85, 0xDF85, 0x1E46,
+ 0xDF86, 0xDF88, 0x4D6D, 0xDF89, 0xDF89, 0x2063, 0xDF8A, 0xDF8A, 0x23F3,
+ 0xDF8B, 0xDFA0, 0x4D70, 0xDFA1, 0xDFFE, 0x14E9, 0xE040, 0xE04F, 0x4D86,
+ 0xE050, 0xE050, 0x231E, 0xE051, 0xE05C, 0x4D96, 0xE05D, 0xE05D, 0x2233,
+ 0xE05E, 0xE068, 0x4DA2, 0xE069, 0xE069, 0x2320, 0xE06A, 0xE06B, 0x4DAD,
+ 0xE06C, 0xE06C, 0x21C7, 0xE06D, 0xE074, 0x4DAF, 0xE075, 0xE075, 0x22BC,
+ 0xE076, 0xE076, 0x4DB7, 0xE077, 0xE077, 0x231C, 0xE078, 0xE078, 0x4DB8,
+ 0xE079, 0xE079, 0x2251, 0xE07A, 0xE07E, 0x4DB9, 0xE080, 0xE086, 0x4DBE,
+ 0xE087, 0xE087, 0x1EBB, 0xE088, 0xE08C, 0x4DC5, 0xE08D, 0xE08D, 0x2287,
+ 0xE08E, 0xE08E, 0x4DCA, 0xE08F, 0xE08F, 0x202D, 0xE090, 0xE090, 0x1EAB,
+ 0xE091, 0xE091, 0x4DCB, 0xE092, 0xE092, 0x231D, 0xE093, 0xE093, 0x4DCC,
+ 0xE094, 0xE094, 0x231F, 0xE095, 0xE096, 0x4DCD, 0xE097, 0xE097, 0x231B,
+ 0xE098, 0xE0A0, 0x4DCF, 0xE0A1, 0xE0FE, 0x1547, 0xE140, 0xE141, 0x4DD8,
+ 0xE142, 0xE142, 0x2321, 0xE143, 0xE163, 0x4DDA, 0xE164, 0xE164, 0x2255,
+ 0xE165, 0xE167, 0x4DFB, 0xE168, 0xE168, 0x1E8F, 0xE169, 0xE173, 0x4DFE,
+ 0xE174, 0xE174, 0x220C, 0xE175, 0xE175, 0x1FA4, 0xE176, 0xE17E, 0x4E09,
+ 0xE180, 0xE183, 0x4E12, 0xE184, 0xE184, 0x209B, 0xE185, 0xE185, 0x21D8,
+ 0xE186, 0xE186, 0x4E16, 0xE187, 0xE187, 0x25FA, 0xE188, 0xE188, 0x4E17,
+ 0xE189, 0xE189, 0x25F9, 0xE18A, 0xE18B, 0x4E18, 0xE18C, 0xE18C, 0x2134,
+ 0xE18D, 0xE18D, 0x4E1A, 0xE18E, 0xE190, 0x24F3, 0xE191, 0xE191, 0x24F8,
+ 0xE192, 0xE192, 0x4E1B, 0xE193, 0xE193, 0x24F7, 0xE194, 0xE194, 0x1EC8,
+ 0xE195, 0xE195, 0x24F6, 0xE196, 0xE197, 0x4E1C, 0xE198, 0xE198, 0x2280,
+ 0xE199, 0xE19D, 0x4E1E, 0xE19E, 0xE19E, 0x1EC5, 0xE19F, 0xE19F, 0x24FB,
+ 0xE1A0, 0xE1A0, 0x4E23, 0xE1A1, 0xE1FE, 0x15A5, 0xE240, 0xE240, 0x4E24,
+ 0xE241, 0xE241, 0x24FA, 0xE242, 0xE242, 0x4E25, 0xE243, 0xE243, 0x1EED,
+ 0xE244, 0xE24E, 0x4E26, 0xE24F, 0xE24F, 0x24FD, 0xE250, 0xE250, 0x4E31,
+ 0xE251, 0xE251, 0x24F9, 0xE252, 0xE252, 0x4E32, 0xE253, 0xE253, 0x24FE,
+ 0xE254, 0xE254, 0x20CD, 0xE255, 0xE259, 0x4E33, 0xE25A, 0xE25A, 0x2508,
+ 0xE25B, 0xE25B, 0x2504, 0xE25C, 0xE25D, 0x4E38, 0xE25E, 0xE25E, 0x2506,
+ 0xE25F, 0xE261, 0x4E3A, 0xE262, 0xE262, 0x24FF, 0xE263, 0xE263, 0x2090,
+ 0xE264, 0xE266, 0x4E3D, 0xE267, 0xE267, 0x1EDD, 0xE268, 0xE268, 0x1F25,
+ 0xE269, 0xE269, 0x4E40, 0xE26A, 0xE26A, 0x2503, 0xE26B, 0xE26B, 0x2502,
+ 0xE26C, 0xE26D, 0x4E41, 0xE26E, 0xE26E, 0x1E7A, 0xE26F, 0xE26F, 0x20A6,
+ 0xE270, 0xE277, 0x4E43, 0xE278, 0xE278, 0x1FD5, 0xE279, 0xE27C, 0x4E4B,
+ 0xE27D, 0xE27D, 0x1F11, 0xE27E, 0xE27E, 0x4E4F, 0xE280, 0xE280, 0x2507,
+ 0xE281, 0xE281, 0x2500, 0xE282, 0xE282, 0x2505, 0xE283, 0xE288, 0x4E50,
+ 0xE289, 0xE289, 0x2519, 0xE28A, 0xE28A, 0x4E56, 0xE28B, 0xE28B, 0x2515,
+ 0xE28C, 0xE28D, 0x4E57, 0xE28E, 0xE28E, 0x250C, 0xE28F, 0xE28F, 0x2031,
+ 0xE290, 0xE291, 0x4E59, 0xE292, 0xE292, 0x250B, 0xE293, 0xE293, 0x250F,
+ 0xE294, 0xE294, 0x251A, 0xE295, 0xE295, 0x2509, 0xE296, 0xE297, 0x4E5B,
+ 0xE298, 0xE298, 0x250E, 0xE299, 0xE299, 0x2234, 0xE29A, 0xE29A, 0x2513,
+ 0xE29B, 0xE29B, 0x1F80, 0xE29C, 0xE29F, 0x4E5D, 0xE2A0, 0xE2A0, 0x2501,
+ 0xE2A1, 0xE2FE, 0x1603, 0xE340, 0xE341, 0x4E61, 0xE342, 0xE342, 0x2517,
+ 0xE343, 0xE343, 0x2516, 0xE344, 0xE346, 0x4E63, 0xE347, 0xE347, 0x2518,
+ 0xE348, 0xE34A, 0x4E66, 0xE34B, 0xE34B, 0x1E56, 0xE34C, 0xE34E, 0x4E69,
+ 0xE34F, 0xE34F, 0x250D, 0xE350, 0xE350, 0x4E6C, 0xE351, 0xE351, 0x20D3,
+ 0xE352, 0xE353, 0x4E6D, 0xE354, 0xE354, 0x207A, 0xE355, 0xE355, 0x20CE,
+ 0xE356, 0xE357, 0x4E6F, 0xE358, 0xE358, 0x2510, 0xE359, 0xE35B, 0x4E71,
+ 0xE35C, 0xE35C, 0x1E55, 0xE35D, 0xE35F, 0x4E74, 0xE360, 0xE360, 0x250A,
+ 0xE361, 0xE365, 0x4E77, 0xE366, 0xE367, 0x2511, 0xE368, 0xE370, 0x4E7C,
+ 0xE371, 0xE371, 0x1FAA, 0xE372, 0xE372, 0x4E85, 0xE373, 0xE373, 0x251E,
+ 0xE374, 0xE374, 0x1F1F, 0xE375, 0xE377, 0x4E86, 0xE378, 0xE378, 0x252D,
+ 0xE379, 0xE379, 0x221D, 0xE37A, 0xE37B, 0x4E89, 0xE37C, 0xE37C, 0x2532,
+ 0xE37D, 0xE37D, 0x4E8B, 0xE37E, 0xE37E, 0x217B, 0xE380, 0xE389, 0x4E8C,
+ 0xE38A, 0xE38A, 0x21AF, 0xE38B, 0xE38B, 0x4E96, 0xE38C, 0xE38C, 0x252C,
+ 0xE38D, 0xE38E, 0x4E97, 0xE38F, 0xE38F, 0x2528, 0xE390, 0xE390, 0x4E99,
+ 0xE391, 0xE391, 0x208C, 0xE392, 0xE392, 0x4E9A, 0xE393, 0xE393, 0x252F,
+ 0xE394, 0xE394, 0x4E9B, 0xE395, 0xE395, 0x21BC, 0xE396, 0xE398, 0x4E9C,
+ 0xE399, 0xE399, 0x251D, 0xE39A, 0xE39B, 0x4E9F, 0xE39C, 0xE39C, 0x2535,
+ 0xE39D, 0xE39D, 0x4EA1, 0xE39E, 0xE39E, 0x220D, 0xE39F, 0xE39F, 0x2526,
+ 0xE3A0, 0xE3A0, 0x4EA2, 0xE3A1, 0xE3FE, 0x1661, 0xE440, 0xE440, 0x2534,
+ 0xE441, 0xE441, 0x252A, 0xE442, 0xE442, 0x251F, 0xE443, 0xE443, 0x2531,
+ 0xE444, 0xE444, 0x251C, 0xE445, 0xE447, 0x4EA3, 0xE448, 0xE448, 0x2525,
+ 0xE449, 0xE44D, 0x4EA6, 0xE44E, 0xE44E, 0x21CD, 0xE44F, 0xE44F, 0x4EAB,
+ 0xE450, 0xE450, 0x21DA, 0xE451, 0xE451, 0x4EAC, 0xE452, 0xE452, 0x2172,
+ 0xE453, 0xE453, 0x253E, 0xE454, 0xE457, 0x4EAD, 0xE458, 0xE458, 0x204F,
+ 0xE459, 0xE459, 0x4EB1, 0xE45A, 0xE45A, 0x2543, 0xE45B, 0xE45B, 0x4EB2,
+ 0xE45C, 0xE45C, 0x21D7, 0xE45D, 0xE45D, 0x4EB3, 0xE45E, 0xE45E, 0x1E3C,
+ 0xE45F, 0xE461, 0x4EB4, 0xE462, 0xE462, 0x2529, 0xE463, 0xE464, 0x4EB7,
+ 0xE465, 0xE465, 0x2521, 0xE466, 0xE467, 0x4EB9, 0xE468, 0xE468, 0x1EFF,
+ 0xE469, 0xE472, 0x4EBB, 0xE473, 0xE473, 0x253F, 0xE474, 0xE474, 0x4EC5,
+ 0xE475, 0xE475, 0x2544, 0xE476, 0xE478, 0x4EC6, 0xE479, 0xE479, 0x2523,
+ 0xE47A, 0xE47A, 0x1E90, 0xE47B, 0xE47B, 0x253A, 0xE47C, 0xE47C, 0x2545,
+ 0xE47D, 0xE47D, 0x4EC9, 0xE47E, 0xE47E, 0x253D, 0xE480, 0xE480, 0x4ECA,
+ 0xE481, 0xE481, 0x20C1, 0xE482, 0xE483, 0x4ECB, 0xE484, 0xE484, 0x2103,
+ 0xE485, 0xE485, 0x2520, 0xE486, 0xE486, 0x253C, 0xE487, 0xE487, 0x253B,
+ 0xE488, 0xE488, 0x2538, 0xE489, 0xE48C, 0x4ECD, 0xE48D, 0xE48D, 0x2540,
+ 0xE48E, 0xE48E, 0x4ED1, 0xE48F, 0xE48F, 0x1FCD, 0xE490, 0xE492, 0x4ED2,
+ 0xE493, 0xE493, 0x1F18, 0xE494, 0xE497, 0x4ED5, 0xE498, 0xE498, 0x254B,
+ 0xE499, 0xE49C, 0x4ED9, 0xE49D, 0xE49D, 0x2547, 0xE49E, 0xE49F, 0x254F,
+ 0xE4A0, 0xE4A0, 0x4EDD, 0xE4A1, 0xE4FE, 0x16BF, 0xE540, 0xE545, 0x4EDE,
+ 0xE546, 0xE546, 0x22B0, 0xE547, 0xE547, 0x4EE4, 0xE548, 0xE548, 0x2546,
+ 0xE549, 0xE54A, 0x4EE5, 0xE54B, 0xE54B, 0x254C, 0xE54C, 0xE54D, 0x4EE7,
+ 0xE54E, 0xE54E, 0x1E9A, 0xE54F, 0xE54F, 0x2552, 0xE550, 0xE550, 0x2530,
+ 0xE551, 0xE551, 0x2549, 0xE552, 0xE554, 0x4EE9, 0xE555, 0xE555, 0x2551,
+ 0xE556, 0xE556, 0x1ECA, 0xE557, 0xE557, 0x4EEC, 0xE558, 0xE558, 0x20D2,
+ 0xE559, 0xE55B, 0x4EED, 0xE55C, 0xE55C, 0x1FB8, 0xE55D, 0xE55D, 0x4EF0,
+ 0xE55E, 0xE55E, 0x2079, 0xE55F, 0xE560, 0x4EF1, 0xE561, 0xE561, 0x21AB,
+ 0xE562, 0xE563, 0x4EF3, 0xE564, 0xE564, 0x254D, 0xE565, 0xE565, 0x1EA5,
+ 0xE566, 0xE567, 0x4EF5, 0xE568, 0xE568, 0x204C, 0xE569, 0xE569, 0x2080,
+ 0xE56A, 0xE56B, 0x4EF7, 0xE56C, 0xE56C, 0x266D, 0xE56D, 0xE56D, 0x4EF9,
+ 0xE56E, 0xE56E, 0x2537, 0xE56F, 0xE574, 0x4EFA, 0xE575, 0xE575, 0x254A,
+ 0xE576, 0xE576, 0x21B8, 0xE577, 0xE577, 0x4F00, 0xE578, 0xE578, 0x254E,
+ 0xE579, 0xE57A, 0x4F01, 0xE57B, 0xE57B, 0x24FC, 0xE57C, 0xE57C, 0x2554,
+ 0xE57D, 0xE57E, 0x4F03, 0xE580, 0xE580, 0x4F05, 0xE581, 0xE581, 0x1F3C,
+ 0xE582, 0xE582, 0x4F06, 0xE583, 0xE583, 0x1ED5, 0xE584, 0xE589, 0x4F07,
+ 0xE58A, 0xE58A, 0x2556, 0xE58B, 0xE58D, 0x4F0D, 0xE58E, 0xE58E, 0x2268,
+ 0xE58F, 0xE590, 0x4F10, 0xE591, 0xE591, 0x1ED6, 0xE592, 0xE599, 0x4F12,
+ 0xE59A, 0xE59A, 0x2557, 0xE59B, 0xE59B, 0x2553, 0xE59C, 0xE59E, 0x4F1A,
+ 0xE59F, 0xE59F, 0x2548, 0xE5A0, 0xE5A0, 0x4F1D, 0xE5A1, 0xE5FE, 0x171D,
+ 0xE640, 0xE640, 0x20DC, 0xE641, 0xE643, 0x4F1E, 0xE644, 0xE644, 0x2559,
+ 0xE645, 0xE648, 0x4F21, 0xE649, 0xE649, 0x1F97, 0xE64A, 0xE64A, 0x2555,
+ 0xE64B, 0xE64D, 0x4F25, 0xE64E, 0xE64E, 0x227D, 0xE64F, 0xE651, 0x4F28,
+ 0xE652, 0xE652, 0x257E, 0xE653, 0xE655, 0x4F2B, 0xE656, 0xE656, 0x207C,
+ 0xE657, 0xE657, 0x4F2E, 0xE658, 0xE658, 0x255A, 0xE659, 0xE65A, 0x4F2F,
+ 0xE65B, 0xE65B, 0x255E, 0xE65C, 0xE65D, 0x4F31, 0xE65E, 0xE65E, 0x1E34,
+ 0xE65F, 0xE668, 0x4F33, 0xE669, 0xE669, 0x215E, 0xE66A, 0xE66A, 0x4F3D,
+ 0xE66B, 0xE66B, 0x2560, 0xE66C, 0xE674, 0x4F3E, 0xE675, 0xE675, 0x21A2,
+ 0xE676, 0xE676, 0x2354, 0xE677, 0xE678, 0x4F47, 0xE679, 0xE679, 0x2563,
+ 0xE67A, 0xE67A, 0x2527, 0xE67B, 0xE67B, 0x4F49, 0xE67C, 0xE67C, 0x252E,
+ 0xE67D, 0xE67D, 0x2558, 0xE67E, 0xE67E, 0x4F4A, 0xE680, 0xE680, 0x1F1B,
+ 0xE681, 0xE681, 0x4F4B, 0xE682, 0xE682, 0x2283, 0xE683, 0xE683, 0x4F4C,
+ 0xE684, 0xE684, 0x2564, 0xE685, 0xE686, 0x4F4D, 0xE687, 0xE687, 0x20A0,
+ 0xE688, 0xE688, 0x4F4F, 0xE689, 0xE689, 0x2565, 0xE68A, 0xE68B, 0x4F50,
+ 0xE68C, 0xE68C, 0x2561, 0xE68D, 0xE692, 0x4F52, 0xE693, 0xE693, 0x2562,
+ 0xE694, 0xE696, 0x4F58, 0xE697, 0xE697, 0x256C, 0xE698, 0xE69A, 0x4F5B,
+ 0xE69B, 0xE69B, 0x256D, 0xE69C, 0xE69C, 0x2020, 0xE69D, 0xE69E, 0x4F5E,
+ 0xE69F, 0xE69F, 0x255F, 0xE6A0, 0xE6A0, 0x256A, 0xE6A1, 0xE6FE, 0x177B,
+ 0xE740, 0xE742, 0x4F60, 0xE743, 0xE743, 0x256E, 0xE744, 0xE747, 0x4F63,
+ 0xE748, 0xE748, 0x2539, 0xE749, 0xE749, 0x255C, 0xE74A, 0xE74C, 0x4F67,
+ 0xE74D, 0xE74E, 0x2568, 0xE74F, 0xE74F, 0x256B, 0xE750, 0xE750, 0x1E6F,
+ 0xE751, 0xE751, 0x4F6A, 0xE752, 0xE752, 0x1FC4, 0xE753, 0xE753, 0x2567,
+ 0xE754, 0xE754, 0x4F6B, 0xE755, 0xE755, 0x255B, 0xE756, 0xE758, 0x4F6C,
+ 0xE759, 0xE759, 0x261D, 0xE75A, 0xE765, 0x4F6F, 0xE766, 0xE766, 0x252B,
+ 0xE767, 0xE767, 0x4F7B, 0xE768, 0xE768, 0x2571, 0xE769, 0xE769, 0x4F7C,
+ 0xE76A, 0xE76A, 0x2577, 0xE76B, 0xE773, 0x4F7D, 0xE774, 0xE774, 0x2522,
+ 0xE775, 0xE77B, 0x4F86, 0xE77C, 0xE77C, 0x2533, 0xE77D, 0xE77E, 0x4F8D,
+ 0xE780, 0xE781, 0x4F8F, 0xE782, 0xE782, 0x202A, 0xE783, 0xE783, 0x4F91,
+ 0xE784, 0xE784, 0x2536, 0xE785, 0xE785, 0x2573, 0xE786, 0xE786, 0x256F,
+ 0xE787, 0xE789, 0x4F92, 0xE78A, 0xE78A, 0x2293, 0xE78B, 0xE78B, 0x2578,
+ 0xE78C, 0xE78E, 0x4F95, 0xE78F, 0xE78F, 0x2570, 0xE790, 0xE791, 0x4F98,
+ 0xE792, 0xE792, 0x2575, 0xE793, 0xE797, 0x4F9A, 0xE798, 0xE799, 0x2541,
+ 0xE79A, 0xE79A, 0x255D, 0xE79B, 0xE79F, 0x4F9F, 0xE7A0, 0xE7A0, 0x201A,
+ 0xE7A1, 0xE7FE, 0x17D9, 0xE840, 0xE842, 0x4FA4, 0xE843, 0xE843, 0x257A,
+ 0xE844, 0xE844, 0x2006, 0xE845, 0xE845, 0x4FA7, 0xE846, 0xE846, 0x2177,
+ 0xE847, 0xE848, 0x4FA8, 0xE849, 0xE849, 0x251B, 0xE84A, 0xE84A, 0x4FAA,
+ 0xE84B, 0xE84B, 0x2524, 0xE84C, 0xE84E, 0x4FAB, 0xE84F, 0xE84F, 0x257B,
+ 0xE850, 0xE853, 0x4FAE, 0xE854, 0xE854, 0x22A3, 0xE855, 0xE859, 0x4FB2,
+ 0xE85A, 0xE85A, 0x2579, 0xE85B, 0xE85B, 0x4FB7, 0xE85C, 0xE85C, 0x2566,
+ 0xE85D, 0xE861, 0x4FB8, 0xE862, 0xE862, 0x1F93, 0xE863, 0xE863, 0x4FBD,
+ 0xE864, 0xE864, 0x257C, 0xE865, 0xE86F, 0x4FBE, 0xE870, 0xE870, 0x2514,
+ 0xE871, 0xE872, 0x4FC9, 0xE873, 0xE873, 0x257D, 0xE874, 0xE874, 0x4FCB,
+ 0xE875, 0xE875, 0x2572, 0xE876, 0xE87B, 0x4FCC, 0xE87C, 0xE87C, 0x2574,
+ 0xE87D, 0xE87E, 0x4FD2, 0xE880, 0xE880, 0x224E, 0xE881, 0xE881, 0x4FD4,
+ 0xE882, 0xE882, 0x21C6, 0xE883, 0xE886, 0x4FD5, 0xE887, 0xE887, 0x209F,
+ 0xE888, 0xE888, 0x4FD9, 0xE889, 0xE889, 0x2576, 0xE88A, 0xE88B, 0x4FDA,
+ 0xE88C, 0xE88C, 0x2064, 0xE88D, 0xE88D, 0x22BF, 0xE88E, 0xE88E, 0x261C,
+ 0xE88F, 0xE88F, 0x225E, 0xE890, 0xE8A0, 0x4FDC, 0xE8A1, 0xE8FE, 0x1837,
+ 0xE940, 0xE94B, 0x4FED, 0xE94C, 0xE94C, 0x1E75, 0xE94D, 0xE953, 0x4FF9,
+ 0xE954, 0xE954, 0x207D, 0xE955, 0xE955, 0x5000, 0xE956, 0xE956, 0x23BF,
+ 0xE957, 0xE957, 0x2113, 0xE958, 0xE959, 0x5001, 0xE95A, 0xE95A, 0x23C0,
+ 0xE95B, 0xE95C, 0x5003, 0xE95D, 0xE95D, 0x1E45, 0xE95E, 0xE95E, 0x5005,
+ 0xE95F, 0xE95F, 0x1FD8, 0xE960, 0xE960, 0x23C4, 0xE961, 0xE961, 0x5006,
+ 0xE962, 0xE962, 0x23C2, 0xE963, 0xE963, 0x2104, 0xE964, 0xE964, 0x5007,
+ 0xE965, 0xE965, 0x21BD, 0xE966, 0xE966, 0x5008, 0xE967, 0xE967, 0x1F87,
+ 0xE968, 0xE968, 0x23C3, 0xE969, 0xE96B, 0x5009, 0xE96C, 0xE96C, 0x2269,
+ 0xE96D, 0xE974, 0x500C, 0xE975, 0xE975, 0x1F43, 0xE976, 0xE976, 0x5014,
+ 0xE977, 0xE977, 0x1F1E, 0xE978, 0xE978, 0x2679, 0xE979, 0xE979, 0x1EEB,
+ 0xE97A, 0xE97B, 0x5015, 0xE97C, 0xE97C, 0x1F35, 0xE97D, 0xE97D, 0x208A,
+ 0xE97E, 0xE97E, 0x5017, 0xE980, 0xE980, 0x23C7, 0xE981, 0xE981, 0x23C9,
+ 0xE982, 0xE982, 0x23C6, 0xE983, 0xE986, 0x5018, 0xE987, 0xE987, 0x224F,
+ 0xE988, 0xE98A, 0x501C, 0xE98B, 0xE98B, 0x23CB, 0xE98C, 0xE98D, 0x501F,
+ 0xE98E, 0xE98E, 0x21F3, 0xE98F, 0xE98F, 0x5021, 0xE990, 0xE990, 0x21F7,
+ 0xE991, 0xE991, 0x23CF, 0xE992, 0xE992, 0x23CE, 0xE993, 0xE993, 0x23CA,
+ 0xE994, 0xE994, 0x23CD, 0xE995, 0xE997, 0x5022, 0xE998, 0xE998, 0x23D0,
+ 0xE999, 0xE99A, 0x5025, 0xE99B, 0xE99B, 0x266C, 0xE99C, 0xE99C, 0x5027,
+ 0xE99D, 0xE99D, 0x23C1, 0xE99E, 0xE99E, 0x5028, 0xE99F, 0xE99F, 0x1FEE,
+ 0xE9A0, 0xE9A0, 0x23D1, 0xE9A1, 0xE9FE, 0x1895, 0xEA40, 0xEA40, 0x1FF8,
+ 0xEA41, 0xEA43, 0x5029, 0xEA44, 0xEA44, 0x23D3, 0xEA45, 0xEA47, 0x502C,
+ 0xEA48, 0xEA48, 0x23D2, 0xEA49, 0xEA49, 0x23D4, 0xEA4A, 0xEA4A, 0x1E98,
+ 0xEA4B, 0xEA4F, 0x502F, 0xEA50, 0xEA50, 0x1F2C, 0xEA51, 0xEA51, 0x5034,
+ 0xEA52, 0xEA52, 0x23D5, 0xEA53, 0xEA54, 0x5035, 0xEA55, 0xEA55, 0x1E71,
+ 0xEA56, 0xEA56, 0x2691, 0xEA57, 0xEA58, 0x5037, 0xEA59, 0xEA59, 0x23C5,
+ 0xEA5A, 0xEA7E, 0x5039, 0xEA80, 0xEA80, 0x231A, 0xEA81, 0xEA83, 0x505E,
+ 0xEA84, 0xEA84, 0x2114, 0xEA85, 0xEA86, 0x5061, 0xEA87, 0xEA87, 0x2284,
+ 0xEA88, 0xEA8D, 0x5063, 0xEA8E, 0xEA8E, 0x221C, 0xEA8F, 0xEA8F, 0x5069,
+ 0xEA90, 0xEA90, 0x1E7E, 0xEA91, 0xEA91, 0x204D, 0xEA92, 0xEA95, 0x506A,
+ 0xEA96, 0xEA96, 0x2201, 0xEA97, 0xEA9F, 0x506E, 0xEAA0, 0xEAA0, 0x1ED9,
+ 0xEAA1, 0xEAFE, 0x18F3, 0xEB40, 0xEB40, 0x5077, 0xEB41, 0xEB41, 0x1FB2,
+ 0xEB42, 0xEB44, 0x5078, 0xEB45, 0xEB45, 0x2252, 0xEB46, 0xEB47, 0x507B,
+ 0xEB48, 0xEB48, 0x1F79, 0xEB49, 0xEB52, 0x507D, 0xEB53, 0xEB53, 0x2157,
+ 0xEB54, 0xEB54, 0x5087, 0xEB55, 0xEB55, 0x21BF, 0xEB56, 0xEB5A, 0x5088,
+ 0xEB5B, 0xEB5B, 0x221F, 0xEB5C, 0xEB5C, 0x508D, 0xEB5D, 0xEB5D, 0x203D,
+ 0xEB5E, 0xEB5F, 0x508E, 0xEB60, 0xEB60, 0x2015, 0xEB61, 0xEB61, 0x5090,
+ 0xEB62, 0xEB62, 0x26A5, 0xEB63, 0xEB6C, 0x5091, 0xEB6D, 0xEB6D, 0x2156,
+ 0xEB6E, 0xEB6F, 0x509B, 0xEB70, 0xEB70, 0x2144, 0xEB71, 0xEB71, 0x509D,
+ 0xEB72, 0xEB72, 0x1E91, 0xEB73, 0xEB73, 0x2257, 0xEB74, 0xEB77, 0x509E,
+ 0xEB78, 0xEB78, 0x200A, 0xEB79, 0xEB79, 0x2092, 0xEB7A, 0xEB7E, 0x50A2,
+ 0xEB80, 0xEB84, 0x50A7, 0xEB85, 0xEB85, 0x2250, 0xEB86, 0xEB89, 0x50AC,
+ 0xEB8A, 0xEB8A, 0x1EC3, 0xEB8B, 0xEBA0, 0x50B0, 0xEBA1, 0xEBFE, 0x1951,
+ 0xEC40, 0xEC45, 0x50C6, 0xEC46, 0xEC46, 0x21A8, 0xEC47, 0xEC55, 0x50CC,
+ 0xEC56, 0xEC56, 0x260D, 0xEC57, 0xEC59, 0x50DB, 0xEC5A, 0xEC5A, 0x260C,
+ 0xEC5B, 0xEC5B, 0x50DE, 0xEC5C, 0xEC5C, 0x260E, 0xEC5D, 0xEC5F, 0x50DF,
+ 0xEC60, 0xEC60, 0x2032, 0xEC61, 0xEC6D, 0x50E2, 0xEC6E, 0xEC6E, 0x260B,
+ 0xEC6F, 0xEC75, 0x50EF, 0xEC76, 0xEC76, 0x22C3, 0xEC77, 0xEC7E, 0x50F6,
+ 0xEC80, 0xEC95, 0x50FE, 0xEC96, 0xEC96, 0x1F23, 0xEC97, 0xECA0, 0x5114,
+ 0xECA1, 0xECFE, 0x19AF, 0xED40, 0xED45, 0x511E, 0xED46, 0xED46, 0x2695,
+ 0xED47, 0xED57, 0x5124, 0xED58, 0xED58, 0x265E, 0xED59, 0xED5D, 0x5135,
+ 0xED5E, 0xED5E, 0x265D, 0xED5F, 0xED60, 0x513A, 0xED61, 0xED61, 0x2692,
+ 0xED62, 0xED63, 0x513C, 0xED64, 0xED64, 0x265F, 0xED65, 0xED65, 0x513E,
+ 0xED66, 0xED66, 0x218D, 0xED67, 0xED67, 0x20FD, 0xED68, 0xED6D, 0x513F,
+ 0xED6E, 0xED6E, 0x1F40, 0xED6F, 0xED73, 0x5145, 0xED74, 0xED74, 0x2465,
+ 0xED75, 0xED76, 0x514A, 0xED77, 0xED77, 0x2467, 0xED78, 0xED78, 0x514C,
+ 0xED79, 0xED79, 0x2466, 0xED7A, 0xED7E, 0x514D, 0xED80, 0xED90, 0x5152,
+ 0xED91, 0xED91, 0x21C9, 0xED92, 0xED92, 0x5163, 0xED93, 0xED93, 0x2209,
+ 0xED94, 0xED94, 0x1EC9, 0xED95, 0xED95, 0x20E9, 0xED96, 0xED96, 0x5164,
+ 0xED97, 0xED97, 0x21CA, 0xED98, 0xED98, 0x2146, 0xED99, 0xED99, 0x25C5,
+ 0xED9A, 0xED9A, 0x21DC, 0xED9B, 0xED9B, 0x5165, 0xED9C, 0xED9C, 0x245E,
+ 0xED9D, 0xED9D, 0x5166, 0xED9E, 0xED9E, 0x214F, 0xED9F, 0xED9F, 0x5167,
+ 0xEDA0, 0xEDA0, 0x25C6, 0xEDA1, 0xEDFE, 0x1A0D, 0xEE40, 0xEE40, 0x25C7,
+ 0xEE41, 0xEE41, 0x2241, 0xEE42, 0xEE42, 0x218A, 0xEE43, 0xEE43, 0x1E2F,
+ 0xEE44, 0xEE44, 0x1EDC, 0xEE45, 0xEE47, 0x5168, 0xEE48, 0xEE48, 0x20BF,
+ 0xEE49, 0xEE49, 0x2034, 0xEE4A, 0xEE4C, 0x516B, 0xEE4D, 0xEE4D, 0x25C9,
+ 0xEE4E, 0xEE51, 0x516E, 0xEE52, 0xEE52, 0x25C8, 0xEE53, 0xEE54, 0x5172,
+ 0xEE55, 0xEE55, 0x220E, 0xEE56, 0xEE56, 0x5174, 0xEE57, 0xEE57, 0x25CB,
+ 0xEE58, 0xEE5D, 0x5175, 0xEE5E, 0xEE5E, 0x217D, 0xEE5F, 0xEE60, 0x517B,
+ 0xEE61, 0xEE61, 0x1F7E, 0xEE62, 0xEE67, 0x517D, 0xEE68, 0xEE68, 0x25CC,
+ 0xEE69, 0xEE69, 0x1FC3, 0xEE6A, 0xEE6B, 0x5183, 0xEE6C, 0xEE6C, 0x20B9,
+ 0xEE6D, 0xEE6D, 0x5185, 0xEE6E, 0xEE6E, 0x2181, 0xEE6F, 0xEE76, 0x5186,
+ 0xEE77, 0xEE77, 0x1FDA, 0xEE78, 0xEE7C, 0x518E, 0xEE7D, 0xEE7D, 0x2173,
+ 0xEE7E, 0xEE7E, 0x1EE1, 0xEE80, 0xEE80, 0x25CD, 0xEE81, 0xEE84, 0x5193,
+ 0xEE85, 0xEE85, 0x25CE, 0xEE86, 0xEE86, 0x21F6, 0xEE87, 0xEE89, 0x5197,
+ 0xEE8A, 0xEE8A, 0x224B, 0xEE8B, 0xEE8B, 0x25D1, 0xEE8C, 0xEE8C, 0x519A,
+ 0xEE8D, 0xEE8D, 0x1EC0, 0xEE8E, 0xEE8F, 0x519B, 0xEE90, 0xEE90, 0x2008,
+ 0xEE91, 0xEE93, 0x519D, 0xEE94, 0xEE94, 0x25D0, 0xEE95, 0xEE96, 0x51A0,
+ 0xEE97, 0xEE97, 0x25D2, 0xEE98, 0xEE98, 0x51A2, 0xEE99, 0xEE99, 0x1F2A,
+ 0xEE9A, 0xEE9C, 0x51A3, 0xEE9D, 0xEE9D, 0x1E72, 0xEE9E, 0xEE9E, 0x25D3,
+ 0xEE9F, 0xEEA0, 0x51A6, 0xEEA1, 0xEEFE, 0x1A6B, 0xEF40, 0xEF40, 0x21BE,
+ 0xEF41, 0xEF41, 0x25D4, 0xEF42, 0xEF42, 0x2044, 0xEF43, 0xEF43, 0x51A8,
+ 0xEF44, 0xEF44, 0x25CF, 0xEF45, 0xEF45, 0x20F3, 0xEF46, 0xEF4B, 0x51A9,
+ 0xEF4C, 0xEF4C, 0x1F00, 0xEF4D, 0xEF51, 0x51AF, 0xEF52, 0xEF53, 0x24CC,
+ 0xEF54, 0xEF54, 0x51B4, 0xEF55, 0xEF55, 0x2698, 0xEF56, 0xEF56, 0x51B5,
+ 0xEF57, 0xEF57, 0x2678, 0xEF58, 0xEF59, 0x51B6, 0xEF5A, 0xEF5A, 0x24CE,
+ 0xEF5B, 0xEF5F, 0x51B8, 0xEF60, 0xEF60, 0x24CF, 0xEF61, 0xEF67, 0x51BD,
+ 0xEF68, 0xEF68, 0x20B8, 0xEF69, 0xEF69, 0x51C4, 0xEF6A, 0xEF6A, 0x24D0,
+ 0xEF6B, 0xEF6B, 0x51C5, 0xEF6C, 0xEF6C, 0x24D1, 0xEF6D, 0xEF76, 0x51C6,
+ 0xEF77, 0xEF77, 0x1EF4, 0xEF78, 0xEF79, 0x51D0, 0xEF7A, 0xEF7A, 0x239B,
+ 0xEF7B, 0xEF7B, 0x51D2, 0xEF7C, 0xEF7C, 0x267E, 0xEF7D, 0xEF7E, 0x51D3,
+ 0xEF80, 0xEF81, 0x51D5, 0xEF82, 0xEF82, 0x239D, 0xEF83, 0xEF84, 0x239F,
+ 0xEF85, 0xEF85, 0x51D7, 0xEF86, 0xEF86, 0x23A1, 0xEF87, 0xEF87, 0x51D8,
+ 0xEF88, 0xEF88, 0x1EF1, 0xEF89, 0xEF8A, 0x51D9, 0xEF8B, 0xEF8B, 0x221E,
+ 0xEF8C, 0xEF8C, 0x51DB, 0xEF8D, 0xEF8D, 0x23A2, 0xEF8E, 0xEF94, 0x51DC,
+ 0xEF95, 0xEF95, 0x214B, 0xEF96, 0xEF96, 0x1E36, 0xEF97, 0xEF97, 0x2135,
+ 0xEF98, 0xEF9B, 0x51E3, 0xEF9C, 0xEF9C, 0x1FAD, 0xEF9D, 0xEF9D, 0x51E7,
+ 0xEF9E, 0xEF9E, 0x1E53, 0xEF9F, 0xEFA0, 0x51E8, 0xEFA1, 0xEFFE, 0x1AC9,
+ 0xF040, 0xF040, 0x51EA, 0xF041, 0xF041, 0x23A3, 0xF042, 0xF042, 0x2203,
+ 0xF043, 0xF043, 0x51EB, 0xF044, 0xF044, 0x1EE7, 0xF045, 0xF046, 0x51EC,
+ 0xF047, 0xF047, 0x23A4, 0xF048, 0xF048, 0x2097, 0xF049, 0xF049, 0x1EE4,
+ 0xF04A, 0xF04D, 0x51EE, 0xF04E, 0xF04E, 0x2238, 0xF04F, 0xF050, 0x51F2,
+ 0xF051, 0xF051, 0x23A5, 0xF052, 0xF053, 0x51F4, 0xF054, 0xF054, 0x1F9A,
+ 0xF055, 0xF056, 0x51F6, 0xF057, 0xF057, 0x21C3, 0xF058, 0xF05D, 0x51F8,
+ 0xF05E, 0xF05E, 0x1F2E, 0xF05F, 0xF067, 0x51FE, 0xF068, 0xF068, 0x239C,
+ 0xF069, 0xF06B, 0x5207, 0xF06C, 0xF06C, 0x23A6, 0xF06D, 0xF070, 0x520A,
+ 0xF071, 0xF071, 0x239E, 0xF072, 0xF072, 0x520E, 0xF073, 0xF073, 0x2035,
+ 0xF074, 0xF074, 0x23A7, 0xF075, 0xF077, 0x520F, 0xF078, 0xF078, 0x23A8,
+ 0xF079, 0xF079, 0x5212, 0xF07A, 0xF07A, 0x2075, 0xF07B, 0xF07C, 0x5213,
+ 0xF07D, 0xF07E, 0x23A9, 0xF080, 0xF080, 0x23AB, 0xF081, 0xF081, 0x1FEB,
+ 0xF082, 0xF082, 0x23AC, 0xF083, 0xF086, 0x5215, 0xF087, 0xF087, 0x1F6A,
+ 0xF088, 0xF088, 0x20F9, 0xF089, 0xF08A, 0x5219, 0xF08B, 0xF08B, 0x2666,
+ 0xF08C, 0xF08F, 0x521B, 0xF090, 0xF090, 0x2667, 0xF091, 0xF091, 0x521F,
+ 0xF092, 0xF092, 0x1E6C, 0xF093, 0xF095, 0x5220, 0xF096, 0xF096, 0x23AD,
+ 0xF097, 0xF0A0, 0x5223, 0xF0A1, 0xF0FE, 0x1B27, 0xF140, 0xF151, 0x522D,
+ 0xF152, 0xF152, 0x206D, 0xF153, 0xF153, 0x2242, 0xF154, 0xF154, 0x1F02,
+ 0xF155, 0xF156, 0x523F, 0xF157, 0xF157, 0x2183, 0xF158, 0xF158, 0x5241,
+ 0xF159, 0xF159, 0x1E85, 0xF15A, 0xF15A, 0x21E9, 0xF15B, 0xF166, 0x5242,
+ 0xF167, 0xF167, 0x1E57, 0xF168, 0xF175, 0x524E, 0xF176, 0xF176, 0x22A5,
+ 0xF177, 0xF177, 0x2407, 0xF178, 0xF178, 0x1FCA, 0xF179, 0xF179, 0x525C,
+ 0xF17A, 0xF17A, 0x2402, 0xF17B, 0xF17B, 0x1F82, 0xF17C, 0xF17D, 0x525D,
+ 0xF17E, 0xF17E, 0x2408, 0xF180, 0xF180, 0x2404, 0xF181, 0xF181, 0x525F,
+ 0xF182, 0xF182, 0x2131, 0xF183, 0xF183, 0x5260, 0xF184, 0xF184, 0x2184,
+ 0xF185, 0xF185, 0x5261, 0xF186, 0xF186, 0x2403, 0xF187, 0xF187, 0x5262,
+ 0xF188, 0xF188, 0x206E, 0xF189, 0xF189, 0x240B, 0xF18A, 0xF193, 0x5263,
+ 0xF194, 0xF194, 0x1F3F, 0xF195, 0xF197, 0x526D, 0xF198, 0xF198, 0x2067,
+ 0xF199, 0xF1A0, 0x5270, 0xF1A1, 0xF1FE, 0x1B85, 0xF240, 0xF244, 0x5278,
+ 0xF245, 0xF245, 0x1FD7, 0xF246, 0xF246, 0x527D, 0xF247, 0xF247, 0x1E83,
+ 0xF248, 0xF24A, 0x527E, 0xF24B, 0xF24B, 0x240F, 0xF24C, 0xF252, 0x5281,
+ 0xF253, 0xF253, 0x240E, 0xF254, 0xF254, 0x20C7, 0xF255, 0xF255, 0x240D,
+ 0xF256, 0xF25B, 0x5288, 0xF25C, 0xF25C, 0x2412, 0xF25D, 0xF25E, 0x528E,
+ 0xF25F, 0xF25F, 0x20B7, 0xF260, 0xF270, 0x5290, 0xF271, 0xF271, 0x23F0,
+ 0xF272, 0xF272, 0x52A1, 0xF273, 0xF273, 0x2411, 0xF274, 0xF274, 0x2414,
+ 0xF275, 0xF275, 0x52A2, 0xF276, 0xF276, 0x2170, 0xF277, 0xF27B, 0x52A3,
+ 0xF27C, 0xF27C, 0x2405, 0xF27D, 0xF27D, 0x210C, 0xF27E, 0xF27E, 0x2415,
+ 0xF280, 0xF284, 0x52A8, 0xF285, 0xF285, 0x2066, 0xF286, 0xF286, 0x52AD,
+ 0xF287, 0xF287, 0x2352, 0xF288, 0xF288, 0x2413, 0xF289, 0xF289, 0x2410,
+ 0xF28A, 0xF28B, 0x2416, 0xF28C, 0xF28C, 0x20F1, 0xF28D, 0xF290, 0x52AE,
+ 0xF291, 0xF291, 0x240A, 0xF292, 0xF293, 0x52B2, 0xF294, 0xF294, 0x2409,
+ 0xF295, 0xF295, 0x52B4, 0xF296, 0xF296, 0x2418, 0xF297, 0xF29B, 0x52B5,
+ 0xF29C, 0xF29C, 0x1FA7, 0xF29D, 0xF29D, 0x52BA, 0xF29E, 0xF29E, 0x21FC,
+ 0xF29F, 0xF2A0, 0x52BB, 0xF2A1, 0xF2FE, 0x1BE3, 0xF340, 0xF340, 0x1FC1,
+ 0xF341, 0xF341, 0x2406, 0xF342, 0xF344, 0x52BD, 0xF345, 0xF345, 0x229C,
+ 0xF346, 0xF347, 0x52C0, 0xF348, 0xF348, 0x204E, 0xF349, 0xF349, 0x52C2,
+ 0xF34A, 0xF34A, 0x241A, 0xF34B, 0xF34B, 0x2419, 0xF34C, 0xF34F, 0x52C3,
+ 0xF350, 0xF350, 0x240C, 0xF351, 0xF360, 0x52C7, 0xF361, 0xF361, 0x1E29,
+ 0xF362, 0xF373, 0x52D7, 0xF374, 0xF374, 0x2661, 0xF375, 0xF375, 0x52E9,
+ 0xF376, 0xF376, 0x26A4, 0xF377, 0xF377, 0x2174, 0xF378, 0xF378, 0x2663,
+ 0xF379, 0xF379, 0x2662, 0xF37A, 0xF37E, 0x52EA, 0xF380, 0xF38B, 0x52EF,
+ 0xF38C, 0xF38C, 0x2675, 0xF38D, 0xF39F, 0x52FB, 0xF3A0, 0xF3A0, 0x214C,
+ 0xF3A1, 0xF3FE, 0x1C41, 0xF440, 0xF444, 0x530E, 0xF445, 0xF445, 0x267A,
+ 0xF446, 0xF44F, 0x5313, 0xF450, 0xF450, 0x26A0, 0xF451, 0xF456, 0x531D,
+ 0xF457, 0xF457, 0x2668, 0xF458, 0xF458, 0x5323, 0xF459, 0xF459, 0x1ED0,
+ 0xF45A, 0xF45A, 0x5324, 0xF45B, 0xF45B, 0x2096, 0xF45C, 0xF45C, 0x5325,
+ 0xF45D, 0xF45D, 0x23CC, 0xF45E, 0xF461, 0x5326, 0xF462, 0xF462, 0x23C8,
+ 0xF463, 0xF463, 0x532A, 0xF464, 0xF464, 0x223E, 0xF465, 0xF474, 0x532B,
+ 0xF475, 0xF475, 0x2665, 0xF476, 0xF47B, 0x533B, 0xF47C, 0xF47C, 0x2664,
+ 0xF47D, 0xF47D, 0x5341, 0xF47E, 0xF47E, 0x2239, 0xF480, 0xF493, 0x5342,
+ 0xF494, 0xF494, 0x204A, 0xF495, 0xF498, 0x5356, 0xF499, 0xF499, 0x261F,
+ 0xF49A, 0xF49B, 0x535A, 0xF49C, 0xF49C, 0x261E, 0xF49D, 0xF4A0, 0x535C,
+ 0xF4A1, 0xF4FE, 0x1C9F, 0xF540, 0xF544, 0x5360, 0xF545, 0xF545, 0x2620,
+ 0xF546, 0xF546, 0x5365, 0xF547, 0xF547, 0x2621, 0xF548, 0xF551, 0x5366,
+ 0xF552, 0xF552, 0x2622, 0xF553, 0xF553, 0x5370, 0xF554, 0xF554, 0x2627,
+ 0xF555, 0xF555, 0x1E39, 0xF556, 0xF556, 0x2625, 0xF557, 0xF55D, 0x5371,
+ 0xF55E, 0xF55E, 0x2629, 0xF55F, 0xF560, 0x5378, 0xF561, 0xF561, 0x262E,
+ 0xF562, 0xF562, 0x262B, 0xF563, 0xF56D, 0x537A, 0xF56E, 0xF56E, 0x262A,
+ 0xF56F, 0xF56F, 0x262D, 0xF570, 0xF570, 0x5385, 0xF571, 0xF571, 0x2628,
+ 0xF572, 0xF572, 0x21B9, 0xF573, 0xF57E, 0x5386, 0xF580, 0xF584, 0x5392,
+ 0xF585, 0xF585, 0x2636, 0xF586, 0xF586, 0x2630, 0xF587, 0xF58B, 0x5397,
+ 0xF58C, 0xF58C, 0x2638, 0xF58D, 0xF58D, 0x539C, 0xF58E, 0xF58E, 0x200D,
+ 0xF58F, 0xF58F, 0x2637, 0xF590, 0xF598, 0x539D, 0xF599, 0xF599, 0x2645,
+ 0xF59A, 0xF59A, 0x53A6, 0xF59B, 0xF59B, 0x263A, 0xF59C, 0xF59F, 0x53A7,
+ 0xF5A0, 0xF5A0, 0x2643, 0xF5A1, 0xF5FE, 0x1CFD, 0xF640, 0xF640, 0x53AB,
+ 0xF641, 0xF641, 0x2640, 0xF642, 0xF644, 0x53AC, 0xF645, 0xF645, 0x263D,
+ 0xF646, 0xF646, 0x2641, 0xF647, 0xF647, 0x53AF, 0xF648, 0xF648, 0x263E,
+ 0xF649, 0xF64A, 0x53B0, 0xF64B, 0xF64B, 0x263F, 0xF64C, 0xF64C, 0x1FC0,
+ 0xF64D, 0xF64D, 0x53B2, 0xF64E, 0xF64F, 0x263B, 0xF650, 0xF653, 0x53B3,
+ 0xF654, 0xF654, 0x2642, 0xF655, 0xF657, 0x53B7, 0xF658, 0xF658, 0x2644,
+ 0xF659, 0xF660, 0x53BA, 0xF661, 0xF661, 0x2639, 0xF662, 0xF662, 0x53C2,
+ 0xF663, 0xF663, 0x264C, 0xF664, 0xF66B, 0x53C3, 0xF66C, 0xF66C, 0x2647,
+ 0xF66D, 0xF66D, 0x264B, 0xF66E, 0xF670, 0x53CB, 0xF671, 0xF671, 0x2649,
+ 0xF672, 0xF673, 0x53CE, 0xF674, 0xF674, 0x2648, 0xF675, 0xF675, 0x53D0,
+ 0xF676, 0xF676, 0x264A, 0xF677, 0xF677, 0x2108, 0xF678, 0xF67E, 0x53D1,
+ 0xF680, 0xF684, 0x53D8, 0xF685, 0xF685, 0x264D, 0xF686, 0xF687, 0x53DD,
+ 0xF688, 0xF688, 0x2634, 0xF689, 0xF689, 0x53DF, 0xF68A, 0xF68A, 0x2651,
+ 0xF68B, 0xF68C, 0x53E0, 0xF68D, 0xF68D, 0x2650, 0xF68E, 0xF68E, 0x2652,
+ 0xF68F, 0xF691, 0x53E2, 0xF692, 0xF692, 0x264F, 0xF693, 0xF695, 0x53E5,
+ 0xF696, 0xF696, 0x2632, 0xF697, 0xF697, 0x264E, 0xF698, 0xF698, 0x2653,
+ 0xF699, 0xF699, 0x53E8, 0xF69A, 0xF69A, 0x2657, 0xF69B, 0xF69B, 0x53E9,
+ 0xF69C, 0xF69C, 0x2635, 0xF69D, 0xF69D, 0x53EA, 0xF69E, 0xF69E, 0x2633,
+ 0xF69F, 0xF69F, 0x53EB, 0xF6A0, 0xF6A0, 0x2656, 0xF6A1, 0xF6FE, 0x1D5B,
+ 0xF740, 0xF741, 0x53EC, 0xF742, 0xF742, 0x2654, 0xF743, 0xF748, 0x53EE,
+ 0xF749, 0xF749, 0x2658, 0xF74A, 0xF74B, 0x53F4, 0xF74C, 0xF74C, 0x2655,
+ 0xF74D, 0xF74D, 0x1E4D, 0xF74E, 0xF755, 0x53F6, 0xF756, 0xF756, 0x265B,
+ 0xF757, 0xF757, 0x53FE, 0xF758, 0xF758, 0x265A, 0xF759, 0xF759, 0x53FF,
+ 0xF75A, 0xF75A, 0x2659, 0xF75B, 0xF75B, 0x202E, 0xF75C, 0xF75C, 0x262F,
+ 0xF75D, 0xF760, 0x5400, 0xF761, 0xF761, 0x2646, 0xF762, 0xF762, 0x5404,
+ 0xF763, 0xF763, 0x2626, 0xF764, 0xF76A, 0x5405, 0xF76B, 0xF76B, 0x265C,
+ 0xF76C, 0xF770, 0x540C, 0xF771, 0xF771, 0x262C, 0xF772, 0xF77B, 0x5411,
+ 0xF77C, 0xF77C, 0x2623, 0xF77D, 0xF77D, 0x541B, 0xF77E, 0xF77E, 0x2631,
+ 0xF780, 0xF7A0, 0x541C, 0xF7A1, 0xF7FE, 0x1DB9, 0xF840, 0xF841, 0x543D,
+ 0xF842, 0xF842, 0x209C, 0xF843, 0xF845, 0x543F, 0xF846, 0xF846, 0x2580,
+ 0xF847, 0xF848, 0x5442, 0xF849, 0xF849, 0x22DC, 0xF84A, 0xF84F, 0x5444,
+ 0xF850, 0xF850, 0x1F05, 0xF851, 0xF851, 0x208B, 0xF852, 0xF852, 0x544A,
+ 0xF853, 0xF853, 0x2581, 0xF854, 0xF862, 0x544B, 0xF863, 0xF863, 0x2583,
+ 0xF864, 0xF864, 0x2582, 0xF865, 0xF865, 0x545A, 0xF866, 0xF866, 0x21EE,
+ 0xF867, 0xF871, 0x545B, 0xF872, 0xF872, 0x2182, 0xF873, 0xF877, 0x5466,
+ 0xF878, 0xF878, 0x2243, 0xF879, 0xF879, 0x546B, 0xF87A, 0xF87A, 0x2587,
+ 0xF87B, 0xF87B, 0x546C, 0xF87C, 0xF87C, 0x2588, 0xF87D, 0xF87E, 0x546D,
+ 0xF880, 0xF880, 0x546F, 0xF881, 0xF881, 0x2584, 0xF882, 0xF883, 0x5470,
+ 0xF884, 0xF884, 0x21FD, 0xF885, 0xF885, 0x5472, 0xF886, 0xF886, 0x21EF,
+ 0xF887, 0xF88C, 0x5473, 0xF88D, 0xF88D, 0x258A, 0xF88E, 0xF88E, 0x258C,
+ 0xF88F, 0xF898, 0x5479, 0xF899, 0xF899, 0x1F47, 0xF89A, 0xF89C, 0x5483,
+ 0xF89D, 0xF89D, 0x1F1D, 0xF89E, 0xF89F, 0x5486, 0xF8A0, 0xF8A0, 0x258D,
+ 0xF940, 0xF94D, 0x5488, 0xF94E, 0xF94E, 0x1FD0, 0xF94F, 0xF94F, 0x2592,
+ 0xF950, 0xF950, 0x258F, 0xF951, 0xF958, 0x5496, 0xF959, 0xF959, 0x2594,
+ 0xF95A, 0xF95A, 0x1EE0, 0xF95B, 0xF95C, 0x549E, 0xF95D, 0xF95D, 0x2591,
+ 0xF95E, 0xF95E, 0x2595, 0xF95F, 0xF966, 0x54A0, 0xF967, 0xF967, 0x2597,
+ 0xF968, 0xF968, 0x54A8, 0xF969, 0xF969, 0x20B6, 0xF96A, 0xF96B, 0x54A9,
+ 0xF96C, 0xF96C, 0x2598, 0xF96D, 0xF96E, 0x54AB, 0xF96F, 0xF96F, 0x20F6,
+ 0xF970, 0xF97E, 0x54AD, 0xF980, 0xF984, 0x54BC, 0xF985, 0xF985, 0x2585,
+ 0xF986, 0xF986, 0x54C1, 0xF987, 0xF987, 0x2599, 0xF988, 0xF990, 0x54C2,
+ 0xF991, 0xF991, 0x2596, 0xF992, 0xF995, 0x54CB, 0xF996, 0xF996, 0x259A,
+ 0xF997, 0xF997, 0x54CF, 0xF998, 0xF998, 0x259B, 0xF999, 0xF9A0, 0x54D0,
+ 0xFA40, 0xFA41, 0x54D8, 0xFA42, 0xFA42, 0x259D, 0xFA43, 0xFA45, 0x54DA,
+ 0xFA46, 0xFA46, 0x259E, 0xFA47, 0xFA4B, 0x54DD, 0xFA4C, 0xFA4C, 0x234C,
+ 0xFA4D, 0xFA50, 0x54E2, 0xFA51, 0xFA51, 0x1F44, 0xFA52, 0xFA57, 0x54E6,
+ 0xFA58, 0xFA58, 0x2660, 0xFA59, 0xFA59, 0x25A0, 0xFA5A, 0xFA5C, 0x54EC,
+ 0xFA5D, 0xFA5D, 0x259C, 0xFA5E, 0xFA5E, 0x54EF, 0xFA5F, 0xFA5F, 0x259F,
+ 0xFA60, 0xFA60, 0x54F0, 0xFA61, 0xFA61, 0x1F6C, 0xFA62, 0xFA6F, 0x54F1,
+ 0xFA70, 0xFA70, 0x25A2, 0xFA71, 0xFA73, 0x54FF, 0xFA74, 0xFA74, 0x20AE,
+ 0xFA75, 0xFA75, 0x5502, 0xFA76, 0xFA76, 0x258B, 0xFA77, 0xFA77, 0x25A3,
+ 0xFA78, 0xFA7E, 0x5503, 0xFA80, 0xFA82, 0x550A, 0xFA83, 0xFA83, 0x2589,
+ 0xFA84, 0xFA84, 0x25A5, 0xFA85, 0xFA8C, 0x550D, 0xFA8D, 0xFA8D, 0x25A4,
+ 0xFA8E, 0xFA8F, 0x5515, 0xFA90, 0xFA90, 0x25A6, 0xFA91, 0xFA91, 0x2593,
+ 0xFA92, 0xFA95, 0x5517, 0xFA96, 0xFA96, 0x25A7, 0xFA97, 0xFA97, 0x2222,
+ 0xFA98, 0xFA98, 0x25A9, 0xFA99, 0xFAA0, 0x551B, 0xFB40, 0xFB48, 0x5523,
+ 0xFB49, 0xFB49, 0x25A8, 0xFB4A, 0xFB51, 0x552C, 0xFB52, 0xFB52, 0x2586,
+ 0xFB53, 0xFB56, 0x5534, 0xFB57, 0xFB57, 0x25A1, 0xFB58, 0xFB58, 0x25AA,
+ 0xFB59, 0xFB59, 0x5538, 0xFB5A, 0xFB5A, 0x2590, 0xFB5B, 0xFB5B, 0x258E,
+ 0xFB5C, 0xFB74, 0x5539, 0xFB75, 0xFB75, 0x2688, 0xFB76, 0xFB78, 0x5552,
+ 0xFB79, 0xFB79, 0x269E, 0xFB7A, 0xFB7A, 0x25FB, 0xFB7B, 0xFB7B, 0x5555,
+ 0xFB7C, 0xFB7C, 0x1F8C, 0xFB7D, 0xFB7D, 0x21F4, 0xFB7E, 0xFB7E, 0x5556,
+ 0xFB80, 0xFB8F, 0x5557, 0xFB90, 0xFB90, 0x200F, 0xFB91, 0xFB9B, 0x5567,
+ 0xFB9C, 0xFB9C, 0x2071, 0xFB9D, 0xFB9E, 0x5572, 0xFB9F, 0xFB9F, 0x25F7,
+ 0xFBA0, 0xFBA0, 0x5574, 0xFC40, 0xFC43, 0x5575, 0xFC44, 0xFC44, 0x2696,
+ 0xFC45, 0xFC48, 0x5579, 0xFC49, 0xFC49, 0x268F, 0xFC4A, 0xFC59, 0x557D,
+ 0xFC5A, 0xFC5A, 0x22DA, 0xFC5B, 0xFC62, 0x558D, 0xFC63, 0xFC63, 0x1EC1,
+ 0xFC64, 0xFC67, 0x5595, 0xFC68, 0xFC68, 0x1EB3, 0xFC69, 0xFC6E, 0x5599,
+ 0xFC6F, 0xFC6F, 0x266A, 0xFC70, 0xFC70, 0x559F, 0xFC71, 0xFC71, 0x268A,
+ 0xFC72, 0xFC73, 0x55A0, 0xFC74, 0xFC74, 0x2669, 0xFC75, 0xFC76, 0x55A2,
+ 0xFC77, 0xFC78, 0x2618, 0xFC79, 0xFC7E, 0x55A4, 0xFC80, 0xFC82, 0x55AA,
+ 0xFC83, 0xFC83, 0x261A, 0xFC84, 0xFC89, 0x55AD, 0xFC8A, 0xFC8A, 0x2673,
+ 0xFC8B, 0xFCA0, 0x55B3, 0xFD40, 0xFD51, 0x55C9, 0xFD52, 0xFD52, 0x20C6,
+ 0xFD53, 0xFD53, 0x226B, 0xFD54, 0xFD56, 0x55DB, 0xFD57, 0xFD57, 0x24D3,
+ 0xFD58, 0xFD58, 0x1E86, 0xFD59, 0xFD59, 0x55DE, 0xFD5A, 0xFD5A, 0x260F,
+ 0xFD5B, 0xFD5E, 0x55DF, 0xFD5F, 0xFD5F, 0x2611, 0xFD60, 0xFD61, 0x55E3,
+ 0xFD62, 0xFD62, 0x2613, 0xFD63, 0xFD64, 0x55E5, 0xFD65, 0xFD65, 0x2610,
+ 0xFD66, 0xFD66, 0x2612, 0xFD67, 0xFD67, 0x2030, 0xFD68, 0xFD68, 0x55E7,
+ 0xFD69, 0xFD69, 0x2671, 0xFD6A, 0xFD6B, 0x55E8, 0xFD6C, 0xFD6C, 0x2614,
+ 0xFD6D, 0xFD6F, 0x55EA, 0xFD70, 0xFD70, 0x2616, 0xFD71, 0xFD71, 0x55ED,
+ 0xFD72, 0xFD72, 0x2615, 0xFD73, 0xFD77, 0x55EE, 0xFD78, 0xFD78, 0x20F2,
+ 0xFD79, 0xFD7C, 0x55F3, 0xFD7D, 0xFD7D, 0x2617, 0xFD7E, 0xFD7E, 0x55F7,
+ 0xFD80, 0xFD87, 0x55F8, 0xFD88, 0xFD88, 0x2037, 0xFD89, 0xFD8A, 0x5600,
+ 0xFD8B, 0xFD8B, 0x20B3, 0xFD8C, 0xFD8E, 0x5602, 0xFD8F, 0xFD8F, 0x1F22,
+ 0xFD90, 0xFD90, 0x24ED, 0xFD91, 0xFD93, 0x5605, 0xFD94, 0xFD94, 0x1F34,
+ 0xFD95, 0xFD9C, 0x5608, 0xFD9D, 0xFD9D, 0x0A02, 0xFD9E, 0xFD9E, 0x40D3,
+ 0xFD9F, 0xFD9F, 0x200C, 0xFDA0, 0xFDA0, 0x5083, 0xFE40, 0xFE40, 0x1259,
+ 0xFE41, 0xFE7E, 0x5610, 0xFE80, 0xFEA0, 0x564E,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/GB1/GBpc-EUC-H_0.cpp b/core/src/fpdfapi/fpdf_cmaps/GB1/GBpc-EUC-H_0.cpp
index 1b3e072a6c..7d1c91fa89 100644
--- a/core/src/fpdfapi/fpdf_cmaps/GB1/GBpc-EUC-H_0.cpp
+++ b/core/src/fpdfapi/fpdf_cmaps/GB1/GBpc-EUC-H_0.cpp
@@ -1,39 +1,39 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-extern const unsigned short g_FXCMAP_GBpc_EUC_H_0[91 * 3] = {
- 0x0020, 0x007E, 0x0001, 0x0080, 0x0080, 0x1E20, 0x00FD, 0x00FF, 0x1E21,
- 0xA1A1, 0xA1FE, 0x0060, 0xA2B1, 0xA2E2, 0x00BE, 0xA2E5, 0xA2EE, 0x00F0,
- 0xA2F1, 0xA2FC, 0x00FA, 0xA3A1, 0xA3FE, 0x0106, 0xA4A1, 0xA4F3, 0x0164,
- 0xA5A1, 0xA5F6, 0x01B7, 0xA6A1, 0xA6B8, 0x020D, 0xA6C1, 0xA6F5, 0x0225,
- 0xA7A1, 0xA7C1, 0x025A, 0xA7D1, 0xA7F1, 0x027B, 0xA8A1, 0xA8C0, 0x029C,
- 0xA8C5, 0xA8EA, 0x02BC, 0xA9A4, 0xA9EF, 0x02E2, 0xAAA1, 0xAAFE, 0x032E,
- 0xABA1, 0xABC0, 0x038C, 0xB0A1, 0xB0FE, 0x03AC, 0xB1A1, 0xB1FE, 0x040A,
- 0xB2A1, 0xB2FE, 0x0468, 0xB3A1, 0xB3FE, 0x04C6, 0xB4A1, 0xB4FE, 0x0524,
- 0xB5A1, 0xB5FE, 0x0582, 0xB6A1, 0xB6FE, 0x05E0, 0xB7A1, 0xB7FE, 0x063E,
- 0xB8A1, 0xB8FE, 0x069C, 0xB9A1, 0xB9FE, 0x06FA, 0xBAA1, 0xBAFE, 0x0758,
- 0xBBA1, 0xBBFE, 0x07B6, 0xBCA1, 0xBCFE, 0x0814, 0xBDA1, 0xBDFE, 0x0872,
- 0xBEA1, 0xBEFE, 0x08D0, 0xBFA1, 0xBFFE, 0x092E, 0xC0A1, 0xC0FE, 0x098C,
- 0xC1A1, 0xC1FE, 0x09EA, 0xC2A1, 0xC2FE, 0x0A48, 0xC3A1, 0xC3FE, 0x0AA6,
- 0xC4A1, 0xC4FE, 0x0B04, 0xC5A1, 0xC5FE, 0x0B62, 0xC6A1, 0xC6FE, 0x0BC0,
- 0xC7A1, 0xC7FE, 0x0C1E, 0xC8A1, 0xC8FE, 0x0C7C, 0xC9A1, 0xC9FE, 0x0CDA,
- 0xCAA1, 0xCAFE, 0x0D38, 0xCBA1, 0xCBFE, 0x0D96, 0xCCA1, 0xCCFE, 0x0DF4,
- 0xCDA1, 0xCDFE, 0x0E52, 0xCEA1, 0xCEFE, 0x0EB0, 0xCFA1, 0xCFFE, 0x0F0E,
- 0xD0A1, 0xD0FE, 0x0F6C, 0xD1A1, 0xD1FE, 0x0FCA, 0xD2A1, 0xD2FE, 0x1028,
- 0xD3A1, 0xD3FE, 0x1086, 0xD4A1, 0xD4FE, 0x10E4, 0xD5A1, 0xD5FE, 0x1142,
- 0xD6A1, 0xD6FE, 0x11A0, 0xD7A1, 0xD7F9, 0x11FE, 0xD8A1, 0xD8FE, 0x1257,
- 0xD9A1, 0xD9FE, 0x12B5, 0xDAA1, 0xDAFE, 0x1313, 0xDBA1, 0xDBFE, 0x1371,
- 0xDCA1, 0xDCFE, 0x13CF, 0xDDA1, 0xDDFE, 0x142D, 0xDEA1, 0xDEFE, 0x148B,
- 0xDFA1, 0xDFFE, 0x14E9, 0xE0A1, 0xE0FE, 0x1547, 0xE1A1, 0xE1FE, 0x15A5,
- 0xE2A1, 0xE2FE, 0x1603, 0xE3A1, 0xE3FE, 0x1661, 0xE4A1, 0xE4FE, 0x16BF,
- 0xE5A1, 0xE5FE, 0x171D, 0xE6A1, 0xE6FE, 0x177B, 0xE7A1, 0xE7FE, 0x17D9,
- 0xE8A1, 0xE8FE, 0x1837, 0xE9A1, 0xE9FE, 0x1895, 0xEAA1, 0xEAFE, 0x18F3,
- 0xEBA1, 0xEBFE, 0x1951, 0xECA1, 0xECFE, 0x19AF, 0xEDA1, 0xEDFE, 0x1A0D,
- 0xEEA1, 0xEEFE, 0x1A6B, 0xEFA1, 0xEFFE, 0x1AC9, 0xF0A1, 0xF0FE, 0x1B27,
- 0xF1A1, 0xF1FE, 0x1B85, 0xF2A1, 0xF2FE, 0x1BE3, 0xF3A1, 0xF3FE, 0x1C41,
- 0xF4A1, 0xF4FE, 0x1C9F, 0xF5A1, 0xF5FE, 0x1CFD, 0xF6A1, 0xF6FE, 0x1D5B,
- 0xF7A1, 0xF7FE, 0x1DB9,
-};
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_GBpc_EUC_H_0[91 * 3] = {
+ 0x0020, 0x007E, 0x0001, 0x0080, 0x0080, 0x1E20, 0x00FD, 0x00FF, 0x1E21,
+ 0xA1A1, 0xA1FE, 0x0060, 0xA2B1, 0xA2E2, 0x00BE, 0xA2E5, 0xA2EE, 0x00F0,
+ 0xA2F1, 0xA2FC, 0x00FA, 0xA3A1, 0xA3FE, 0x0106, 0xA4A1, 0xA4F3, 0x0164,
+ 0xA5A1, 0xA5F6, 0x01B7, 0xA6A1, 0xA6B8, 0x020D, 0xA6C1, 0xA6F5, 0x0225,
+ 0xA7A1, 0xA7C1, 0x025A, 0xA7D1, 0xA7F1, 0x027B, 0xA8A1, 0xA8C0, 0x029C,
+ 0xA8C5, 0xA8EA, 0x02BC, 0xA9A4, 0xA9EF, 0x02E2, 0xAAA1, 0xAAFE, 0x032E,
+ 0xABA1, 0xABC0, 0x038C, 0xB0A1, 0xB0FE, 0x03AC, 0xB1A1, 0xB1FE, 0x040A,
+ 0xB2A1, 0xB2FE, 0x0468, 0xB3A1, 0xB3FE, 0x04C6, 0xB4A1, 0xB4FE, 0x0524,
+ 0xB5A1, 0xB5FE, 0x0582, 0xB6A1, 0xB6FE, 0x05E0, 0xB7A1, 0xB7FE, 0x063E,
+ 0xB8A1, 0xB8FE, 0x069C, 0xB9A1, 0xB9FE, 0x06FA, 0xBAA1, 0xBAFE, 0x0758,
+ 0xBBA1, 0xBBFE, 0x07B6, 0xBCA1, 0xBCFE, 0x0814, 0xBDA1, 0xBDFE, 0x0872,
+ 0xBEA1, 0xBEFE, 0x08D0, 0xBFA1, 0xBFFE, 0x092E, 0xC0A1, 0xC0FE, 0x098C,
+ 0xC1A1, 0xC1FE, 0x09EA, 0xC2A1, 0xC2FE, 0x0A48, 0xC3A1, 0xC3FE, 0x0AA6,
+ 0xC4A1, 0xC4FE, 0x0B04, 0xC5A1, 0xC5FE, 0x0B62, 0xC6A1, 0xC6FE, 0x0BC0,
+ 0xC7A1, 0xC7FE, 0x0C1E, 0xC8A1, 0xC8FE, 0x0C7C, 0xC9A1, 0xC9FE, 0x0CDA,
+ 0xCAA1, 0xCAFE, 0x0D38, 0xCBA1, 0xCBFE, 0x0D96, 0xCCA1, 0xCCFE, 0x0DF4,
+ 0xCDA1, 0xCDFE, 0x0E52, 0xCEA1, 0xCEFE, 0x0EB0, 0xCFA1, 0xCFFE, 0x0F0E,
+ 0xD0A1, 0xD0FE, 0x0F6C, 0xD1A1, 0xD1FE, 0x0FCA, 0xD2A1, 0xD2FE, 0x1028,
+ 0xD3A1, 0xD3FE, 0x1086, 0xD4A1, 0xD4FE, 0x10E4, 0xD5A1, 0xD5FE, 0x1142,
+ 0xD6A1, 0xD6FE, 0x11A0, 0xD7A1, 0xD7F9, 0x11FE, 0xD8A1, 0xD8FE, 0x1257,
+ 0xD9A1, 0xD9FE, 0x12B5, 0xDAA1, 0xDAFE, 0x1313, 0xDBA1, 0xDBFE, 0x1371,
+ 0xDCA1, 0xDCFE, 0x13CF, 0xDDA1, 0xDDFE, 0x142D, 0xDEA1, 0xDEFE, 0x148B,
+ 0xDFA1, 0xDFFE, 0x14E9, 0xE0A1, 0xE0FE, 0x1547, 0xE1A1, 0xE1FE, 0x15A5,
+ 0xE2A1, 0xE2FE, 0x1603, 0xE3A1, 0xE3FE, 0x1661, 0xE4A1, 0xE4FE, 0x16BF,
+ 0xE5A1, 0xE5FE, 0x171D, 0xE6A1, 0xE6FE, 0x177B, 0xE7A1, 0xE7FE, 0x17D9,
+ 0xE8A1, 0xE8FE, 0x1837, 0xE9A1, 0xE9FE, 0x1895, 0xEAA1, 0xEAFE, 0x18F3,
+ 0xEBA1, 0xEBFE, 0x1951, 0xECA1, 0xECFE, 0x19AF, 0xEDA1, 0xEDFE, 0x1A0D,
+ 0xEEA1, 0xEEFE, 0x1A6B, 0xEFA1, 0xEFFE, 0x1AC9, 0xF0A1, 0xF0FE, 0x1B27,
+ 0xF1A1, 0xF1FE, 0x1B85, 0xF2A1, 0xF2FE, 0x1BE3, 0xF3A1, 0xF3FE, 0x1C41,
+ 0xF4A1, 0xF4FE, 0x1C9F, 0xF5A1, 0xF5FE, 0x1CFD, 0xF6A1, 0xF6FE, 0x1D5B,
+ 0xF7A1, 0xF7FE, 0x1DB9,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/GB1/GBpc-EUC-V_0.cpp b/core/src/fpdfapi/fpdf_cmaps/GB1/GBpc-EUC-V_0.cpp
index be469f2eea..325ec224bd 100644
--- a/core/src/fpdfapi/fpdf_cmaps/GB1/GBpc-EUC-V_0.cpp
+++ b/core/src/fpdfapi/fpdf_cmaps/GB1/GBpc-EUC-V_0.cpp
@@ -1,15 +1,15 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-extern const unsigned short g_FXCMAP_GBpc_EUC_V_0[20 * 3] = {
- 0xA1A2, 0xA1A2, 0x023F, 0xA1A3, 0xA1A3, 0x023E, 0xA1AA, 0xA1AA, 0x0256,
- 0xA1AB, 0xA1AC, 0x1E18, 0xA1AD, 0xA1AD, 0x0257, 0xA1B2, 0xA1BF, 0x0246,
- 0xA1FE, 0xA1FE, 0x1E1A, 0xA3A1, 0xA3A1, 0x0242, 0xA3A8, 0xA3A9, 0x0244,
- 0xA3AC, 0xA3AC, 0x023D, 0xA3AE, 0xA3AE, 0x1E1B, 0xA3BA, 0xA3BB, 0x0240,
- 0xA3BD, 0xA3BD, 0x1E1C, 0xA3BF, 0xA3BF, 0x0243, 0xA3DB, 0xA3DB, 0x1E1D,
- 0xA3DD, 0xA3DD, 0x1E1E, 0xA3DF, 0xA3DF, 0x0258, 0xA3FB, 0xA3FB, 0x0254,
- 0xA3FD, 0xA3FD, 0x0255, 0xA3FE, 0xA3FE, 0x1E1F,
-};
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_GBpc_EUC_V_0[20 * 3] = {
+ 0xA1A2, 0xA1A2, 0x023F, 0xA1A3, 0xA1A3, 0x023E, 0xA1AA, 0xA1AA, 0x0256,
+ 0xA1AB, 0xA1AC, 0x1E18, 0xA1AD, 0xA1AD, 0x0257, 0xA1B2, 0xA1BF, 0x0246,
+ 0xA1FE, 0xA1FE, 0x1E1A, 0xA3A1, 0xA3A1, 0x0242, 0xA3A8, 0xA3A9, 0x0244,
+ 0xA3AC, 0xA3AC, 0x023D, 0xA3AE, 0xA3AE, 0x1E1B, 0xA3BA, 0xA3BB, 0x0240,
+ 0xA3BD, 0xA3BD, 0x1E1C, 0xA3BF, 0xA3BF, 0x0243, 0xA3DB, 0xA3DB, 0x1E1D,
+ 0xA3DD, 0xA3DD, 0x1E1E, 0xA3DF, 0xA3DF, 0x0258, 0xA3FB, 0xA3FB, 0x0254,
+ 0xA3FD, 0xA3FD, 0x0255, 0xA3FE, 0xA3FE, 0x1E1F,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/GB1/UniGB-UCS2-H_4.cpp b/core/src/fpdfapi/fpdf_cmaps/GB1/UniGB-UCS2-H_4.cpp
index 30003729df..d12e815dc9 100644
--- a/core/src/fpdfapi/fpdf_cmaps/GB1/UniGB-UCS2-H_4.cpp
+++ b/core/src/fpdfapi/fpdf_cmaps/GB1/UniGB-UCS2-H_4.cpp
@@ -1,4617 +1,4617 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-extern const unsigned short g_FXCMAP_UniGB_UCS2_H_4[13825 * 3] = {
- 0x0020, 0x007E, 0x0001, 0x00A4, 0x00A4, 0x00A7, 0x00A5, 0x00A5, 0x5752,
- 0x00A7, 0x00A7, 0x00AB, 0x00A8, 0x00A8, 0x0066, 0x00B0, 0x00B0, 0x00A2,
- 0x00B1, 0x00B1, 0x007F, 0x00D7, 0x00D7, 0x0080, 0x00E0, 0x00E0, 0x029F,
- 0x00E1, 0x00E1, 0x029D, 0x00E8, 0x00E8, 0x02A3, 0x00E9, 0x00E9, 0x02A1,
- 0x00EA, 0x00EA, 0x02B5, 0x00EC, 0x00EC, 0x02A7, 0x00ED, 0x00ED, 0x02A5,
- 0x00F2, 0x00F2, 0x02AB, 0x00F3, 0x00F3, 0x02A9, 0x00F7, 0x00F7, 0x0081,
- 0x00F9, 0x00F9, 0x02AF, 0x00FA, 0x00FA, 0x02AD, 0x00FC, 0x00FC, 0x02B4,
- 0x0101, 0x0101, 0x029C, 0x0113, 0x0113, 0x02A0, 0x011B, 0x011B, 0x02A2,
- 0x012B, 0x012B, 0x02A4, 0x014D, 0x014D, 0x02A8, 0x016B, 0x016B, 0x02AC,
- 0x01CE, 0x01CE, 0x029E, 0x01D0, 0x01D0, 0x02A6, 0x01D2, 0x01D2, 0x02AA,
- 0x01D4, 0x01D4, 0x02AE, 0x01D6, 0x01D6, 0x02B0, 0x01D8, 0x01D8, 0x02B1,
- 0x01DA, 0x01DA, 0x02B2, 0x01DC, 0x01DC, 0x02B3, 0x01F9, 0x01F9, 0x02BA,
- 0x02C7, 0x02C7, 0x0065, 0x02C9, 0x02C9, 0x0064, 0x02CA, 0x02CB, 0x26B3,
- 0x02D9, 0x02D9, 0x26B5, 0x0391, 0x03A1, 0x020D, 0x03A3, 0x03A9, 0x021E,
- 0x03B1, 0x03C1, 0x0225, 0x03C3, 0x03C9, 0x0236, 0x0401, 0x0401, 0x0260,
- 0x0410, 0x0415, 0x025A, 0x0416, 0x0435, 0x0261, 0x0436, 0x044F, 0x0282,
- 0x0451, 0x0451, 0x0281, 0x1E3F, 0x1E3F, 0x02B7, 0x2010, 0x2010, 0x2722,
- 0x2013, 0x2013, 0x26B6, 0x2014, 0x2014, 0x0069, 0x2015, 0x2015, 0x26B7,
- 0x2016, 0x2016, 0x006B, 0x2018, 0x2019, 0x006D, 0x201C, 0x201D, 0x006F,
- 0x2025, 0x2025, 0x26B8, 0x2026, 0x2026, 0x006C, 0x2030, 0x2030, 0x00AA,
- 0x2032, 0x2033, 0x00A3, 0x2035, 0x2035, 0x26B9, 0x203B, 0x203B, 0x00B8,
- 0x20AC, 0x20AC, 0x5751, 0x2103, 0x2103, 0x00A5, 0x2105, 0x2105, 0x26BA,
- 0x2109, 0x2109, 0x26BB, 0x2116, 0x2116, 0x00AC, 0x2121, 0x2121, 0x2720,
- 0x2160, 0x216B, 0x00FA, 0x2170, 0x2179, 0x26A9, 0x2190, 0x2191, 0x00BA,
- 0x2192, 0x2192, 0x00B9, 0x2193, 0x2193, 0x00BC, 0x2196, 0x2199, 0x26BC,
- 0x2208, 0x2208, 0x0089, 0x220F, 0x220F, 0x0086, 0x2211, 0x2211, 0x0085,
- 0x2215, 0x2215, 0x26C0, 0x221A, 0x221A, 0x008B, 0x221D, 0x221D, 0x0097,
- 0x221E, 0x221E, 0x009D, 0x221F, 0x221F, 0x26C1, 0x2220, 0x2220, 0x008E,
- 0x2223, 0x2223, 0x26C2, 0x2225, 0x2225, 0x008D, 0x2227, 0x2228, 0x0083,
- 0x2229, 0x2229, 0x0088, 0x222A, 0x222A, 0x0087, 0x222B, 0x222B, 0x0091,
- 0x222E, 0x222E, 0x0092, 0x2234, 0x2234, 0x009F, 0x2235, 0x2235, 0x009E,
- 0x2236, 0x2236, 0x0082, 0x2237, 0x2237, 0x008A, 0x223D, 0x223D, 0x0096,
- 0x2248, 0x2248, 0x0095, 0x224C, 0x224C, 0x0094, 0x2252, 0x2252, 0x26C3,
- 0x2260, 0x2260, 0x0098, 0x2261, 0x2261, 0x0093, 0x2264, 0x2265, 0x009B,
- 0x2266, 0x2267, 0x26C4, 0x226E, 0x226F, 0x0099, 0x2295, 0x2295, 0x2704,
- 0x2299, 0x2299, 0x0090, 0x22A5, 0x22A5, 0x008C, 0x22BF, 0x22BF, 0x26C6,
- 0x22EF, 0x22EF, 0x006C, 0x2312, 0x2312, 0x008F, 0x2460, 0x2469, 0x00E6,
- 0x2474, 0x2487, 0x00D2, 0x2488, 0x249B, 0x00BE, 0x2500, 0x254B, 0x02E2,
- 0x2550, 0x2573, 0x26C7, 0x2581, 0x258F, 0x26EB, 0x2593, 0x2595, 0x26FA,
- 0x25A0, 0x25A0, 0x00B5, 0x25A1, 0x25A1, 0x00B4, 0x25B2, 0x25B2, 0x00B7,
- 0x25B3, 0x25B3, 0x00B6, 0x25BC, 0x25BD, 0x26FD, 0x25C6, 0x25C6, 0x00B3,
- 0x25C7, 0x25C7, 0x00B2, 0x25CB, 0x25CB, 0x00AF, 0x25CE, 0x25CE, 0x00B1,
- 0x25CF, 0x25CF, 0x00B0, 0x25E2, 0x25E5, 0x26FF, 0x2605, 0x2605, 0x00AE,
- 0x2606, 0x2606, 0x00AD, 0x2609, 0x2609, 0x2703, 0x2640, 0x2640, 0x00A1,
- 0x2642, 0x2642, 0x00A0, 0x2E80, 0x2E80, 0x579C, 0x2E81, 0x2E81, 0x561F,
- 0x2E82, 0x2E83, 0x579D, 0x2E84, 0x2E84, 0x5623, 0x2E85, 0x2E87, 0x579F,
- 0x2E88, 0x2E88, 0x5626, 0x2E89, 0x2E8A, 0x57A2, 0x2E8B, 0x2E8B, 0x5627,
- 0x2E8C, 0x2E8C, 0x562C, 0x2E8D, 0x2E96, 0x57A4, 0x2E97, 0x2E97, 0x562D,
- 0x2E98, 0x2E99, 0x57AE, 0x2E9B, 0x2EA6, 0x57B0, 0x2EA7, 0x2EA7, 0x563A,
- 0x2EA8, 0x2EA9, 0x57BC, 0x2EAA, 0x2EAA, 0x563D, 0x2EAB, 0x2EAD, 0x57BE,
- 0x2EAE, 0x2EAE, 0x5640, 0x2EAF, 0x2EB2, 0x57C1, 0x2EB3, 0x2EB3, 0x5642,
- 0x2EB4, 0x2EB5, 0x57C5, 0x2EB6, 0x2EB7, 0x5643, 0x2EB8, 0x2EBA, 0x57C7,
- 0x2EBB, 0x2EBB, 0x5648, 0x2EBC, 0x2EC9, 0x57CA, 0x2ECA, 0x2ECA, 0x5652,
- 0x2ECB, 0x2EF3, 0x57D8, 0x2F00, 0x2F00, 0x1042, 0x2F01, 0x2F01, 0x1263,
- 0x2F02, 0x2F02, 0x1272, 0x2F03, 0x2F03, 0x1265, 0x2F04, 0x2F04, 0x1059,
- 0x2F05, 0x2F05, 0x2793, 0x2F06, 0x2F06, 0x063D, 0x2F07, 0x2F07, 0x1303,
- 0x2F08, 0x2F08, 0x0CA6, 0x2F09, 0x2F09, 0x0638, 0x2F0A, 0x2F0A, 0x0CC6,
- 0x2F0B, 0x2F0B, 0x03D6, 0x2F0C, 0x2F0C, 0x129D, 0x2F0D, 0x2F0D, 0x1314,
- 0x2F0E, 0x2F0E, 0x130F, 0x2F0F, 0x2F0F, 0x082B, 0x2F10, 0x2F10, 0x1399,
- 0x2F11, 0x2F11, 0x0597, 0x2F12, 0x2F12, 0x09EF, 0x2F13, 0x2F13, 0x12FC,
- 0x2F14, 0x2F14, 0x1266, 0x2F15, 0x2F15, 0x1284, 0x2F16, 0x2F16, 0x2A1A,
- 0x2F17, 0x2F17, 0x0D45, 0x2F18, 0x2F18, 0x047E, 0x2F19, 0x2F19, 0x1352,
- 0x2F1A, 0x2F1A, 0x04CC, 0x2F1B, 0x2F1B, 0x139C, 0x2F1C, 0x2F1C, 0x10BB,
- 0x2F1D, 0x2F1D, 0x0967, 0x2F1E, 0x2F1E, 0x1593, 0x2F1F, 0x2F1F, 0x0E72,
- 0x2F20, 0x2F20, 0x0D56, 0x2F21, 0x2F21, 0x161C, 0x2F22, 0x2F22, 0x2D2D,
- 0x2F23, 0x2F23, 0x0F13, 0x2F24, 0x2F24, 0x0576, 0x2F25, 0x2F25, 0x0B6F,
- 0x2F26, 0x2F26, 0x1230, 0x2F27, 0x2F27, 0x172E, 0x2F28, 0x2F28, 0x056A,
- 0x2F29, 0x2F29, 0x0F6C, 0x2F2A, 0x2F2A, 0x14B6, 0x2F2B, 0x2F2B, 0x0D43,
- 0x2F2C, 0x2F2C, 0x1774, 0x2F2D, 0x2F2D, 0x0CF6, 0x2F2E, 0x2F2E, 0x1815,
- 0x2F2F, 0x2F2F, 0x06FD, 0x2F30, 0x2F30, 0x082D, 0x2F31, 0x2F31, 0x08BE,
- 0x2F32, 0x2F32, 0x06C4, 0x2F33, 0x2F33, 0x1813, 0x2F34, 0x2F34, 0x073C,
- 0x2F35, 0x2F35, 0x1398, 0x2F36, 0x2F36, 0x14AD, 0x2F37, 0x2F37, 0x14F6,
- 0x2F38, 0x2F38, 0x0706, 0x2F39, 0x2F39, 0x1762, 0x2F3A, 0x2F3A, 0x15EE,
- 0x2F3B, 0x2F3B, 0x15E0, 0x2F3C, 0x2F3C, 0x0F8F, 0x2F3D, 0x2F3D, 0x06E5,
- 0x2F3E, 0x2F3E, 0x3292, 0x2F3F, 0x2F3F, 0x0D6D, 0x2F40, 0x2F40, 0x11A6,
- 0x2F41, 0x2F41, 0x1909, 0x2F42, 0x2F42, 0x0ED3, 0x2F43, 0x2F43, 0x05F6,
- 0x2F44, 0x2F44, 0x08C0, 0x2F45, 0x2F45, 0x065A, 0x2F46, 0x2F46, 0x0EED,
- 0x2F47, 0x2F47, 0x0CB0, 0x2F48, 0x2F48, 0x10FE, 0x2F49, 0x2F49, 0x1105,
- 0x2F4A, 0x2F4A, 0x0B21, 0x2F4B, 0x2F4B, 0x0C34, 0x2F4C, 0x2F4C, 0x11B8,
- 0x2F4D, 0x2F4D, 0x0578, 0x2F4E, 0x2F4E, 0x19BD, 0x2F4F, 0x2F4F, 0x0EF2,
- 0x2F50, 0x2F50, 0x0431, 0x2F51, 0x2F51, 0x0AB0, 0x2F52, 0x2F52, 0x0D66,
- 0x2F53, 0x2F53, 0x0C17, 0x2F54, 0x2F54, 0x0DA3, 0x2F55, 0x2F55, 0x0805,
- 0x2F56, 0x2F56, 0x1203, 0x2F57, 0x2F57, 0x06B3, 0x2F58, 0x2F58, 0x1269,
- 0x2F59, 0x2F59, 0x169D, 0x2F5A, 0x2F5A, 0x0BCB, 0x2F5B, 0x2F5B, 0x0FE9,
- 0x2F5C, 0x2F5C, 0x0B64, 0x2F5D, 0x2F5D, 0x0C89, 0x2F5E, 0x2F5E, 0x0FC9,
- 0x2F5F, 0x2F5F, 0x10D6, 0x2F60, 0x2F60, 0x0728, 0x2F61, 0x2F61, 0x0E90,
- 0x2F62, 0x2F62, 0x06C5, 0x2F63, 0x2F63, 0x0D33, 0x2F64, 0x2F64, 0x10A8,
- 0x2F65, 0x2F65, 0x0E42, 0x2F66, 0x2F66, 0x1BC6, 0x2F67, 0x2F67, 0x1B60,
- 0x2F68, 0x2F68, 0x3EBF, 0x2F69, 0x2F69, 0x03E2, 0x2F6A, 0x2F6A, 0x0BC3,
- 0x2F6B, 0x2F6B, 0x0AF8, 0x2F6C, 0x2F6C, 0x0B22, 0x2F6D, 0x2F6D, 0x0AB1,
- 0x2F6E, 0x2F6E, 0x0D4F, 0x2F6F, 0x2F6F, 0x0D46, 0x2F70, 0x2F70, 0x0D55,
- 0x2F71, 0x2F71, 0x40CB, 0x2F72, 0x2F72, 0x0783, 0x2F73, 0x2F73, 0x0FD1,
- 0x2F74, 0x2F74, 0x09EB, 0x2F75, 0x2F75, 0x11F0, 0x2F76, 0x2F76, 0x0ADC,
- 0x2F77, 0x2F77, 0x1CE7, 0x2F78, 0x2F78, 0x1C5E, 0x2F79, 0x2F79, 0x0EA9,
- 0x2F7A, 0x2F7A, 0x101B, 0x2F7B, 0x2F7B, 0x10D5, 0x2F7C, 0x2F7C, 0x09BA,
- 0x2F7D, 0x2F7D, 0x0637, 0x2F7E, 0x2F7E, 0x1BCB, 0x2F7F, 0x2F7F, 0x0639,
- 0x2F80, 0x2F80, 0x1A1E, 0x2F81, 0x2F81, 0x0CBD, 0x2F82, 0x2F82, 0x04E1,
- 0x2F83, 0x2F83, 0x1231, 0x2F84, 0x2F84, 0x11C0, 0x2F85, 0x2F85, 0x08F9,
- 0x2F86, 0x2F86, 0x0D19, 0x2F87, 0x2F87, 0x1618, 0x2F88, 0x2F88, 0x11DA,
- 0x2F89, 0x2F89, 0x1CDC, 0x2F8A, 0x2F8A, 0x0CE4, 0x2F8B, 0x2F8B, 0x45A2,
- 0x2F8C, 0x2F8C, 0x1BF0, 0x2F8D, 0x2F8D, 0x050B, 0x2F8E, 0x2F8E, 0x0FD3,
- 0x2F8F, 0x2F8F, 0x0F9B, 0x2F90, 0x2F90, 0x1049, 0x2F91, 0x2F91, 0x49DC,
- 0x2F92, 0x2F92, 0x1F96, 0x2F93, 0x2F93, 0x0898, 0x2F94, 0x2F94, 0x0FFD,
- 0x2F95, 0x2F95, 0x0721, 0x2F96, 0x2F96, 0x05F8, 0x2F97, 0x2F97, 0x1D15,
- 0x2F98, 0x2F98, 0x1D50, 0x2F99, 0x2F99, 0x1E3B, 0x2F9A, 0x2F9A, 0x0505,
- 0x2F9B, 0x2F9B, 0x123C, 0x2F9C, 0x2F9C, 0x1240, 0x2F9D, 0x2F9D, 0x0D26,
- 0x2F9E, 0x2F9E, 0x1E7B, 0x2F9F, 0x2F9F, 0x0F8C, 0x2FA0, 0x2FA0, 0x04E2,
- 0x2FA1, 0x2FA1, 0x4D13, 0x2FA2, 0x2FA2, 0x105F, 0x2FA3, 0x2FA3, 0x10B4,
- 0x2FA4, 0x2FA4, 0x4E18, 0x2FA5, 0x2FA5, 0x09DA, 0x2FA6, 0x2FA6, 0x08C1,
- 0x2FA7, 0x2FA7, 0x1E75, 0x2FA8, 0x2FA8, 0x207D, 0x2FA9, 0x2FA9, 0x06B2,
- 0x2FAA, 0x2FAA, 0x09EE, 0x2FAB, 0x2FAB, 0x1D79, 0x2FAC, 0x2FAC, 0x10CF,
- 0x2FAD, 0x2FAD, 0x50EA, 0x2FAE, 0x2FAE, 0x0664, 0x2FAF, 0x2FAF, 0x0AEB,
- 0x2FB0, 0x2FB0, 0x06EA, 0x2FB1, 0x2FB1, 0x218D, 0x2FB2, 0x2FB2, 0x08F1,
- 0x2FB3, 0x2FB3, 0x107B, 0x2FB4, 0x2FB4, 0x2209, 0x2FB5, 0x2FB5, 0x1F00,
- 0x2FB6, 0x2FB6, 0x1EF4, 0x2FB7, 0x2FB7, 0x0D4A, 0x2FB8, 0x2FB8, 0x0D6E,
- 0x2FB9, 0x2FB9, 0x0F50, 0x2FBA, 0x2FBA, 0x206D, 0x2FBB, 0x2FBB, 0x0720,
- 0x2FBC, 0x2FBC, 0x06DA, 0x2FBD, 0x2FBD, 0x1DEC, 0x2FBE, 0x2FBE, 0x1ED0,
- 0x2FBF, 0x2FBF, 0x139B, 0x2FC0, 0x2FC0, 0x1260, 0x2FC1, 0x2FC1, 0x0746,
- 0x2FC2, 0x2FC2, 0x2239, 0x2FC3, 0x2FC3, 0x209C, 0x2FC4, 0x2FC4, 0x2688,
- 0x2FC5, 0x2FC5, 0x0A60, 0x2FC6, 0x2FC6, 0x2071, 0x2FC7, 0x2FC7, 0x0A90,
- 0x2FC8, 0x2FC8, 0x5586, 0x2FC9, 0x2FC9, 0x0D89, 0x2FCA, 0x2FCA, 0x0791,
- 0x2FCB, 0x2FCB, 0x1A55, 0x2FCC, 0x2FCC, 0x2618, 0x2FCD, 0x2FCD, 0x05E5,
- 0x2FCE, 0x2FCE, 0x071D, 0x2FCF, 0x2FCF, 0x0D8A, 0x2FD0, 0x2FD0, 0x0430,
- 0x2FD1, 0x2FD1, 0x20C6, 0x2FD2, 0x2FD2, 0x1E86, 0x2FD3, 0x2FD3, 0x2037,
- 0x2FD4, 0x2FD4, 0x1F34, 0x2FD5, 0x2FD5, 0x12F3, 0x2FF0, 0x2FFB, 0x274C,
- 0x3000, 0x3002, 0x0060, 0x3003, 0x3003, 0x0067, 0x3005, 0x3005, 0x0068,
- 0x3006, 0x3006, 0x2728, 0x3007, 0x3007, 0x1E17, 0x3008, 0x300F, 0x0073,
- 0x3010, 0x3011, 0x007D, 0x3012, 0x3012, 0x2705, 0x3013, 0x3013, 0x00BD,
- 0x3014, 0x3015, 0x0071, 0x3016, 0x3017, 0x007B, 0x301D, 0x301E, 0x2706,
- 0x3021, 0x3029, 0x2708, 0x3033, 0x3035, 0x577B, 0x3038, 0x303A, 0x577E,
- 0x303E, 0x303E, 0x274B, 0x303F, 0x303F, 0x5755, 0x3041, 0x3093, 0x0164,
- 0x3094, 0x3094, 0x5767, 0x309B, 0x309C, 0x2724, 0x309D, 0x309E, 0x2729,
- 0x30A1, 0x30F6, 0x01B7, 0x30F7, 0x30FA, 0x5776, 0x30FB, 0x30FB, 0x0063,
- 0x30FC, 0x30FC, 0x2723, 0x30FD, 0x30FE, 0x2726, 0x3105, 0x3129, 0x02BC,
- 0x312A, 0x312C, 0x5781, 0x31A0, 0x31B7, 0x5784, 0x3220, 0x3229, 0x00F0,
- 0x3231, 0x3231, 0x2721, 0x32A3, 0x32A3, 0x2711, 0x338E, 0x338F, 0x2712,
- 0x339C, 0x339E, 0x2714, 0x33A1, 0x33A1, 0x2717, 0x33C4, 0x33C4, 0x2718,
- 0x33CE, 0x33CE, 0x2719, 0x33D1, 0x33D2, 0x271A, 0x33D5, 0x33D5, 0x271C,
- 0x3400, 0x3446, 0x5801, 0x3447, 0x3447, 0x5625, 0x3448, 0x3472, 0x5848,
- 0x3473, 0x3473, 0x5624, 0x3474, 0x34FF, 0x5873, 0x3500, 0x359D, 0x58FF,
- 0x359E, 0x359E, 0x5629, 0x359F, 0x35FF, 0x599D, 0x3600, 0x360D, 0x59FE,
- 0x360E, 0x360E, 0x562B, 0x360F, 0x3619, 0x5A0C, 0x361A, 0x361A, 0x562A,
- 0x361B, 0x36FF, 0x5A17, 0x3700, 0x37FF, 0x5AFC, 0x3800, 0x38FF, 0x5BFC,
- 0x3900, 0x3917, 0x5CFC, 0x3918, 0x3918, 0x562F, 0x3919, 0x396D, 0x5D14,
- 0x396E, 0x396E, 0x562E, 0x396F, 0x39CE, 0x5D69, 0x39CF, 0x39CF, 0x5631,
- 0x39D0, 0x39D0, 0x5634, 0x39D1, 0x39DE, 0x5DC9, 0x39DF, 0x39DF, 0x5632,
- 0x39E0, 0x39FF, 0x5DD7, 0x3A00, 0x3A72, 0x5DF7, 0x3A73, 0x3A73, 0x5633,
- 0x3A74, 0x3AFF, 0x5E6A, 0x3B00, 0x3B4D, 0x5EF6, 0x3B4E, 0x3B4E, 0x5637,
- 0x3B4F, 0x3BFF, 0x5F44, 0x3C00, 0x3C6D, 0x5FF5, 0x3C6E, 0x3C6E, 0x5638,
- 0x3C6F, 0x3CDF, 0x6063, 0x3CE0, 0x3CE0, 0x5639, 0x3CE1, 0x3CFF, 0x60D4,
- 0x3D00, 0x3DFF, 0x60F3, 0x3E00, 0x3EFF, 0x61F3, 0x3F00, 0x3FFF, 0x62F3,
- 0x4000, 0x4055, 0x63F3, 0x4056, 0x4056, 0x563E, 0x4057, 0x40FF, 0x6449,
- 0x4100, 0x415E, 0x64F2, 0x415F, 0x415F, 0x563F, 0x4160, 0x41FF, 0x6551,
- 0x4200, 0x42FF, 0x65F1, 0x4300, 0x4336, 0x66F1, 0x4337, 0x4337, 0x5641,
- 0x4338, 0x43AB, 0x6728, 0x43AC, 0x43AC, 0x5647, 0x43AD, 0x43B0, 0x679C,
- 0x43B1, 0x43B1, 0x5646, 0x43B2, 0x43DC, 0x67A0, 0x43DD, 0x43DD, 0x5649,
- 0x43DE, 0x43FF, 0x67CB, 0x4400, 0x44D5, 0x67ED, 0x44D6, 0x44D6, 0x564A,
- 0x44D7, 0x44FF, 0x68C3, 0x4500, 0x45FF, 0x68EC, 0x4600, 0x464B, 0x69EC,
- 0x464C, 0x464C, 0x564C, 0x464D, 0x4660, 0x6A38, 0x4661, 0x4661, 0x564B,
- 0x4662, 0x46FF, 0x6A4C, 0x4700, 0x4722, 0x6AEA, 0x4723, 0x4723, 0x564E,
- 0x4724, 0x4728, 0x6B0D, 0x4729, 0x4729, 0x564F, 0x472A, 0x477B, 0x6B12,
- 0x477C, 0x477C, 0x5650, 0x477D, 0x478C, 0x6B64, 0x478D, 0x478D, 0x5651,
- 0x478E, 0x47FF, 0x6B74, 0x4800, 0x48FF, 0x6BE6, 0x4900, 0x4946, 0x6CE6,
- 0x4947, 0x4947, 0x5653, 0x4948, 0x4979, 0x6D2D, 0x497A, 0x497A, 0x5654,
- 0x497B, 0x497C, 0x6D5F, 0x497D, 0x497D, 0x5655, 0x497E, 0x4981, 0x6D61,
- 0x4982, 0x4983, 0x5656, 0x4984, 0x4984, 0x6D65, 0x4985, 0x4986, 0x5658,
- 0x4987, 0x499A, 0x6D66, 0x499B, 0x499B, 0x565B, 0x499C, 0x499E, 0x6D7A,
- 0x499F, 0x499F, 0x565A, 0x49A0, 0x49B5, 0x6D7D, 0x49B6, 0x49B6, 0x565D,
- 0x49B7, 0x49B7, 0x565C, 0x49B8, 0x49FF, 0x6D93, 0x4A00, 0x4AFF, 0x6DDB,
- 0x4B00, 0x4BFF, 0x6EDB, 0x4C00, 0x4C76, 0x6FDB, 0x4C77, 0x4C77, 0x5664,
- 0x4C78, 0x4C9E, 0x7052, 0x4C9F, 0x4CA1, 0x5661, 0x4CA2, 0x4CA2, 0x5665,
- 0x4CA3, 0x4CA3, 0x5660, 0x4CA4, 0x4CFF, 0x7079, 0x4D00, 0x4D12, 0x70D5,
- 0x4D13, 0x4D19, 0x5666, 0x4D1A, 0x4DAD, 0x70E8, 0x4DAE, 0x4DAE, 0x566D,
- 0x4DAF, 0x4DB5, 0x717C, 0x4E00, 0x4E00, 0x1042, 0x4E01, 0x4E01, 0x05E0,
- 0x4E02, 0x4E02, 0x2758, 0x4E03, 0x4E03, 0x0BFE, 0x4E04, 0x4E06, 0x2759,
- 0x4E07, 0x4E07, 0x0EA3, 0x4E08, 0x4E08, 0x116A, 0x4E09, 0x4E09, 0x0CD8,
- 0x4E0A, 0x4E0A, 0x0D08, 0x4E0B, 0x4E0B, 0x0F2F, 0x4E0C, 0x4E0C, 0x1258,
- 0x4E0D, 0x4E0D, 0x0482, 0x4E0E, 0x4E0E, 0x10D0, 0x4E0F, 0x4E0F, 0x275C,
- 0x4E10, 0x4E10, 0x125A, 0x4E11, 0x4E11, 0x0518, 0x4E12, 0x4E12, 0x275D,
- 0x4E13, 0x4E13, 0x1205, 0x4E14, 0x4E14, 0x0C4F, 0x4E15, 0x4E15, 0x125D,
- 0x4E16, 0x4E16, 0x0D57, 0x4E17, 0x4E17, 0x275E, 0x4E18, 0x4E18, 0x0C6D,
- 0x4E19, 0x4E19, 0x0464, 0x4E1A, 0x4E1A, 0x103C, 0x4E1B, 0x4E1B, 0x0557,
- 0x4E1C, 0x4E1C, 0x05EA, 0x4E1D, 0x4E1D, 0x0DB4, 0x4E1E, 0x4E1E, 0x125F,
- 0x4E1F, 0x4E21, 0x275F, 0x4E22, 0x4E22, 0x05E9, 0x4E23, 0x4E23, 0x2762,
- 0x4E24, 0x4E24, 0x0A06, 0x4E25, 0x4E25, 0x0FF8, 0x4E26, 0x4E26, 0x2763,
- 0x4E27, 0x4E27, 0x0CDE, 0x4E28, 0x4E28, 0x1263, 0x4E29, 0x4E29, 0x2764,
- 0x4E2A, 0x4E2A, 0x06F1, 0x4E2B, 0x4E2B, 0x0FE7, 0x4E2C, 0x4E2C, 0x169C,
- 0x4E2D, 0x4E2D, 0x11CF, 0x4E2E, 0x4E2F, 0x2765, 0x4E30, 0x4E30, 0x067E,
- 0x4E31, 0x4E31, 0x2767, 0x4E32, 0x4E32, 0x0531, 0x4E33, 0x4E33, 0x2768,
- 0x4E34, 0x4E34, 0x0A22, 0x4E35, 0x4E35, 0x2769, 0x4E36, 0x4E36, 0x1272,
- 0x4E37, 0x4E37, 0x276A, 0x4E38, 0x4E38, 0x0E99, 0x4E39, 0x4E39, 0x0585,
- 0x4E3A, 0x4E3A, 0x0EB9, 0x4E3B, 0x4E3B, 0x11F6, 0x4E3C, 0x4E3C, 0x276B,
- 0x4E3D, 0x4E3D, 0x09E1, 0x4E3E, 0x4E3E, 0x0908, 0x4E3F, 0x4E3F, 0x1265,
- 0x4E40, 0x4E42, 0x276C, 0x4E43, 0x4E43, 0x0B2E, 0x4E44, 0x4E44, 0x276F,
- 0x4E45, 0x4E45, 0x08F2, 0x4E46, 0x4E46, 0x2770, 0x4E47, 0x4E47, 0x1267,
- 0x4E48, 0x4E48, 0x0AB9, 0x4E49, 0x4E49, 0x106C, 0x4E4A, 0x4E4A, 0x2771,
- 0x4E4B, 0x4E4B, 0x11AD, 0x4E4C, 0x4E4C, 0x0EE9, 0x4E4D, 0x4E4D, 0x1148,
- 0x4E4E, 0x4E4E, 0x07AC, 0x4E4F, 0x4E4F, 0x0643, 0x4E50, 0x4E50, 0x09C1,
- 0x4E51, 0x4E51, 0x2772, 0x4E52, 0x4E52, 0x0BD8, 0x4E53, 0x4E53, 0x0B93,
- 0x4E54, 0x4E54, 0x0C44, 0x4E55, 0x4E55, 0x2773, 0x4E56, 0x4E56, 0x072D,
- 0x4E57, 0x4E57, 0x2774, 0x4E58, 0x4E58, 0x04F0, 0x4E59, 0x4E59, 0x1059,
- 0x4E5A, 0x4E5B, 0x2775, 0x4E5C, 0x4E5C, 0x1275, 0x4E5D, 0x4E5D, 0x08F4,
- 0x4E5E, 0x4E5E, 0x0C11, 0x4E5F, 0x4E5F, 0x1039, 0x4E60, 0x4E60, 0x0F1D,
- 0x4E61, 0x4E61, 0x0F54, 0x4E62, 0x4E65, 0x2777, 0x4E66, 0x4E66, 0x0D80,
- 0x4E67, 0x4E68, 0x277B, 0x4E69, 0x4E69, 0x1276, 0x4E6A, 0x4E6F, 0x277D,
- 0x4E70, 0x4E70, 0x0A99, 0x4E71, 0x4E71, 0x0A79, 0x4E72, 0x4E72, 0x2783,
- 0x4E73, 0x4E73, 0x0CC4, 0x4E74, 0x4E7D, 0x2784, 0x4E7E, 0x4E7E, 0x0C29,
- 0x4E7F, 0x4E81, 0x278E, 0x4E82, 0x4E82, 0x2059, 0x4E83, 0x4E85, 0x2791,
- 0x4E86, 0x4E86, 0x0A14, 0x4E87, 0x4E87, 0x2794, 0x4E88, 0x4E88, 0x10CD,
- 0x4E89, 0x4E89, 0x119A, 0x4E8A, 0x4E8A, 0x2795, 0x4E8B, 0x4E8B, 0x0D59,
- 0x4E8C, 0x4E8C, 0x063D, 0x4E8D, 0x4E8D, 0x1257, 0x4E8E, 0x4E8E, 0x10BF,
- 0x4E8F, 0x4E8F, 0x0984, 0x4E90, 0x4E90, 0x2796, 0x4E91, 0x4E91, 0x1109,
- 0x4E92, 0x4E92, 0x07BA, 0x4E93, 0x4E93, 0x1277, 0x4E94, 0x4E94, 0x0EF4,
- 0x4E95, 0x4E95, 0x08DD, 0x4E96, 0x4E97, 0x2797, 0x4E98, 0x4E98, 0x125E,
- 0x4E99, 0x4E99, 0x2799, 0x4E9A, 0x4E9A, 0x0FF0, 0x4E9B, 0x4E9B, 0x0F74,
- 0x4E9C, 0x4E9D, 0x279A, 0x4E9E, 0x4E9E, 0x21F1, 0x4E9F, 0x4E9F, 0x1273,
- 0x4EA0, 0x4EA0, 0x1303, 0x4EA1, 0x4EA1, 0x0EA7, 0x4EA2, 0x4EA2, 0x0947,
- 0x4EA3, 0x4EA3, 0x279C, 0x4EA4, 0x4EA4, 0x088C, 0x4EA5, 0x4EA5, 0x075C,
- 0x4EA6, 0x4EA6, 0x1067, 0x4EA7, 0x4EA7, 0x04C1, 0x4EA8, 0x4EA8, 0x0797,
- 0x4EA9, 0x4EA9, 0x0B19, 0x4EAA, 0x4EAA, 0x279D, 0x4EAB, 0x4EAB, 0x0F5A,
- 0x4EAC, 0x4EAC, 0x08D8, 0x4EAD, 0x4EAD, 0x0E55, 0x4EAE, 0x4EAE, 0x0A0A,
- 0x4EAF, 0x4EB1, 0x279E, 0x4EB2, 0x4EB2, 0x0C54, 0x4EB3, 0x4EB3, 0x1305,
- 0x4EB4, 0x4EB4, 0x27A1, 0x4EB5, 0x4EB5, 0x1308, 0x4EB6, 0x4EB9, 0x27A2,
- 0x4EBA, 0x4EBA, 0x0CA6, 0x4EBB, 0x4EBB, 0x129F, 0x4EBC, 0x4EBE, 0x27A6,
- 0x4EBF, 0x4EBF, 0x1061, 0x4EC0, 0x4EC0, 0x0D49, 0x4EC1, 0x4EC1, 0x0CA5,
- 0x4EC2, 0x4EC2, 0x12A2, 0x4EC3, 0x4EC3, 0x12A0, 0x4EC4, 0x4EC4, 0x127C,
- 0x4EC5, 0x4EC5, 0x08C7, 0x4EC6, 0x4EC6, 0x0BEC, 0x4EC7, 0x4EC7, 0x0515,
- 0x4EC8, 0x4EC8, 0x27A9, 0x4EC9, 0x4EC9, 0x12A1, 0x4ECA, 0x4ECA, 0x08C2,
- 0x4ECB, 0x4ECB, 0x08BA, 0x4ECC, 0x4ECC, 0x27AA, 0x4ECD, 0x4ECD, 0x0CAF,
- 0x4ECE, 0x4ECE, 0x0556, 0x4ECF, 0x4ED0, 0x27AB, 0x4ED1, 0x4ED1, 0x0A7F,
- 0x4ED2, 0x4ED2, 0x27AD, 0x4ED3, 0x4ED3, 0x049D, 0x4ED4, 0x4ED4, 0x122D,
- 0x4ED5, 0x4ED5, 0x0D62, 0x4ED6, 0x4ED6, 0x0DF0, 0x4ED7, 0x4ED7, 0x116D,
- 0x4ED8, 0x4ED8, 0x06B1, 0x4ED9, 0x4ED9, 0x0F36, 0x4EDA, 0x4EDC, 0x27AE,
- 0x4EDD, 0x4EDD, 0x12EE, 0x4EDE, 0x4EDE, 0x12A6, 0x4EDF, 0x4EDF, 0x0C27,
- 0x4EE0, 0x4EE0, 0x27B1, 0x4EE1, 0x4EE1, 0x12A4, 0x4EE2, 0x4EE2, 0x27B2,
- 0x4EE3, 0x4EE3, 0x057D, 0x4EE4, 0x4EE4, 0x0A37, 0x4EE5, 0x4EE5, 0x105B,
- 0x4EE6, 0x4EE7, 0x27B3, 0x4EE8, 0x4EE8, 0x12A3, 0x4EE9, 0x4EE9, 0x27B5,
- 0x4EEA, 0x4EEA, 0x104E, 0x4EEB, 0x4EEB, 0x12A5, 0x4EEC, 0x4EEC, 0x0ACC,
- 0x4EED, 0x4EEF, 0x27B6, 0x4EF0, 0x4EF0, 0x101F, 0x4EF1, 0x4EF1, 0x27B9,
- 0x4EF2, 0x4EF2, 0x11D8, 0x4EF3, 0x4EF3, 0x12A8, 0x4EF4, 0x4EF4, 0x27BA,
- 0x4EF5, 0x4EF5, 0x12AB, 0x4EF6, 0x4EF6, 0x0871, 0x4EF7, 0x4EF7, 0x084E,
- 0x4EF8, 0x4EFA, 0x27BB, 0x4EFB, 0x4EFB, 0x0CA9, 0x4EFC, 0x4EFC, 0x27BE,
- 0x4EFD, 0x4EFD, 0x067A, 0x4EFE, 0x4EFE, 0x27BF, 0x4EFF, 0x4EFF, 0x065F,
- 0x4F00, 0x4F00, 0x27C0, 0x4F01, 0x4F01, 0x0C12, 0x4F02, 0x4F08, 0x27C1,
- 0x4F09, 0x4F09, 0x12AE, 0x4F0A, 0x4F0A, 0x1048, 0x4F0B, 0x4F0C, 0x27C8,
- 0x4F0D, 0x4F0D, 0x0EF8, 0x4F0E, 0x4F0E, 0x0832, 0x4F0F, 0x4F0F, 0x0699,
- 0x4F10, 0x4F10, 0x0642, 0x4F11, 0x4F11, 0x0FA8, 0x4F12, 0x4F16, 0x27CA,
- 0x4F17, 0x4F17, 0x11D9, 0x4F18, 0x4F18, 0x10AA, 0x4F19, 0x4F19, 0x0804,
- 0x4F1A, 0x4F1A, 0x07F6, 0x4F1B, 0x4F1B, 0x12A7, 0x4F1C, 0x4F1D, 0x27CF,
- 0x4F1E, 0x4F1E, 0x0CDA, 0x4F1F, 0x4F1F, 0x0EBF, 0x4F20, 0x4F20, 0x052E,
- 0x4F21, 0x4F21, 0x27D1, 0x4F22, 0x4F22, 0x12A9, 0x4F23, 0x4F23, 0x27D2,
- 0x4F24, 0x4F24, 0x0D04, 0x4F25, 0x4F25, 0x12AC, 0x4F26, 0x4F26, 0x0A7E,
- 0x4F27, 0x4F27, 0x12AD, 0x4F28, 0x4F29, 0x27D3, 0x4F2A, 0x4F2A, 0x0EC0,
- 0x4F2B, 0x4F2B, 0x12AF, 0x4F2C, 0x4F2E, 0x27D5, 0x4F2F, 0x4F2F, 0x0475,
- 0x4F30, 0x4F30, 0x0719, 0x4F31, 0x4F31, 0x27D8, 0x4F32, 0x4F32, 0x12B7,
- 0x4F33, 0x4F33, 0x27D9, 0x4F34, 0x4F34, 0x03F4, 0x4F35, 0x4F35, 0x27DA,
- 0x4F36, 0x4F36, 0x0A2F, 0x4F37, 0x4F37, 0x27DB, 0x4F38, 0x4F38, 0x0D25,
- 0x4F39, 0x4F39, 0x27DC, 0x4F3A, 0x4F3A, 0x0DBA, 0x4F3B, 0x4F3B, 0x27DD,
- 0x4F3C, 0x4F3C, 0x0DBB, 0x4F3D, 0x4F3D, 0x12B8, 0x4F3E, 0x4F42, 0x27DE,
- 0x4F43, 0x4F43, 0x05C9, 0x4F44, 0x4F45, 0x27E3, 0x4F46, 0x4F46, 0x058C,
- 0x4F47, 0x4F4C, 0x27E5, 0x4F4D, 0x4F4D, 0x0ECA, 0x4F4E, 0x4F4E, 0x05AE,
- 0x4F4F, 0x4F4F, 0x11FE, 0x4F50, 0x4F50, 0x1251, 0x4F51, 0x4F51, 0x10B8,
- 0x4F52, 0x4F52, 0x27EB, 0x4F53, 0x4F53, 0x0E38, 0x4F54, 0x4F54, 0x27EC,
- 0x4F55, 0x4F55, 0x0785, 0x4F56, 0x4F56, 0x27ED, 0x4F57, 0x4F57, 0x12B6,
- 0x4F58, 0x4F58, 0x12F0, 0x4F59, 0x4F59, 0x10C5, 0x4F5A, 0x4F5A, 0x12B3,
- 0x4F5B, 0x4F5B, 0x068D, 0x4F5C, 0x4F5C, 0x1254, 0x4F5D, 0x4F5D, 0x12B4,
- 0x4F5E, 0x4F5E, 0x12B0, 0x4F5F, 0x4F5F, 0x12B5, 0x4F60, 0x4F60, 0x0B46,
- 0x4F61, 0x4F62, 0x27EE, 0x4F63, 0x4F63, 0x109B, 0x4F64, 0x4F64, 0x12AA,
- 0x4F65, 0x4F65, 0x12F1, 0x4F66, 0x4F66, 0x27F0, 0x4F67, 0x4F67, 0x12B1,
- 0x4F68, 0x4F68, 0x27F1, 0x4F69, 0x4F69, 0x0BA6, 0x4F6A, 0x4F6B, 0x27F2,
- 0x4F6C, 0x4F6C, 0x09BB, 0x4F6D, 0x4F6E, 0x27F4, 0x4F6F, 0x4F6F, 0x1019,
- 0x4F70, 0x4F70, 0x03E6, 0x4F71, 0x4F72, 0x27F6, 0x4F73, 0x4F73, 0x0844,
- 0x4F74, 0x4F74, 0x12BA, 0x4F75, 0x4F75, 0x27F8, 0x4F76, 0x4F76, 0x12B9,
- 0x4F77, 0x4F7A, 0x27F9, 0x4F7B, 0x4F7B, 0x12C0, 0x4F7C, 0x4F7C, 0x12C2,
- 0x4F7D, 0x4F7D, 0x27FD, 0x4F7E, 0x4F7E, 0x12BF, 0x4F7F, 0x4F7F, 0x0D50,
- 0x4F80, 0x4F82, 0x27FE, 0x4F83, 0x4F83, 0x12BD, 0x4F84, 0x4F84, 0x11B5,
- 0x4F85, 0x4F85, 0x2801, 0x4F86, 0x4F86, 0x1FF2, 0x4F87, 0x4F87, 0x2802,
- 0x4F88, 0x4F88, 0x0503, 0x4F89, 0x4F89, 0x12BC, 0x4F8A, 0x4F8A, 0x2803,
- 0x4F8B, 0x4F8B, 0x09E8, 0x4F8C, 0x4F8C, 0x2804, 0x4F8D, 0x4F8D, 0x0D63,
- 0x4F8E, 0x4F8E, 0x2805, 0x4F8F, 0x4F8F, 0x12BE, 0x4F90, 0x4F90, 0x2806,
- 0x4F91, 0x4F91, 0x12BB, 0x4F92, 0x4F93, 0x2807, 0x4F94, 0x4F94, 0x12C4,
- 0x4F95, 0x4F95, 0x2809, 0x4F96, 0x4F96, 0x205D, 0x4F97, 0x4F97, 0x05F0,
- 0x4F98, 0x4F9A, 0x280A, 0x4F9B, 0x4F9B, 0x0702, 0x4F9C, 0x4F9C, 0x280D,
- 0x4F9D, 0x4F9D, 0x1047, 0x4F9E, 0x4F9F, 0x280E, 0x4FA0, 0x4FA0, 0x0F2D,
- 0x4FA1, 0x4FA2, 0x2810, 0x4FA3, 0x4FA3, 0x0A69, 0x4FA4, 0x4FA4, 0x2812,
- 0x4FA5, 0x4FA5, 0x0895, 0x4FA6, 0x4FA6, 0x118D, 0x4FA7, 0x4FA7, 0x04A7,
- 0x4FA8, 0x4FA8, 0x0C45, 0x4FA9, 0x4FA9, 0x0978, 0x4FAA, 0x4FAA, 0x12C1,
- 0x4FAB, 0x4FAB, 0x2813, 0x4FAC, 0x4FAC, 0x12C3, 0x4FAD, 0x4FAD, 0x2814,
- 0x4FAE, 0x4FAE, 0x0EF9, 0x4FAF, 0x4FAF, 0x07A5, 0x4FB0, 0x4FB4, 0x2815,
- 0x4FB5, 0x4FB5, 0x0C53, 0x4FB6, 0x4FBE, 0x281A, 0x4FBF, 0x4FBF, 0x044C,
- 0x4FC0, 0x4FC1, 0x2823, 0x4FC2, 0x4FC2, 0x269C, 0x4FC3, 0x4FC3, 0x055C,
- 0x4FC4, 0x4FC4, 0x062C, 0x4FC5, 0x4FC5, 0x12C8, 0x4FC6, 0x4FC9, 0x2825,
- 0x4FCA, 0x4FCA, 0x092E, 0x4FCB, 0x4FCD, 0x2829, 0x4FCE, 0x4FCE, 0x12F2,
- 0x4FCF, 0x4FCF, 0x0C4B, 0x4FD0, 0x4FD0, 0x09E9, 0x4FD1, 0x4FD1, 0x12CC,
- 0x4FD2, 0x4FD6, 0x282C, 0x4FD7, 0x4FD7, 0x0DCC, 0x4FD8, 0x4FD8, 0x069A,
- 0x4FD9, 0x4FD9, 0x2831, 0x4FDA, 0x4FDA, 0x12C9, 0x4FDB, 0x4FDB, 0x2832,
- 0x4FDC, 0x4FDC, 0x12CB, 0x4FDD, 0x4FDD, 0x040C, 0x4FDE, 0x4FDE, 0x10C6,
- 0x4FDF, 0x4FDF, 0x12CD, 0x4FE0, 0x4FE0, 0x21B5, 0x4FE1, 0x4FE1, 0x0F90,
- 0x4FE2, 0x4FE2, 0x2833, 0x4FE3, 0x4FE3, 0x12CA, 0x4FE4, 0x4FE5, 0x2834,
- 0x4FE6, 0x4FE6, 0x12C5, 0x4FE7, 0x4FE7, 0x2836, 0x4FE8, 0x4FE8, 0x12C6,
- 0x4FE9, 0x4FE9, 0x09F2, 0x4FEA, 0x4FEA, 0x12C7, 0x4FEB, 0x4FEC, 0x2837,
- 0x4FED, 0x4FED, 0x0866, 0x4FEE, 0x4FEE, 0x0FA9, 0x4FEF, 0x4FEF, 0x06A4,
- 0x4FF0, 0x4FF0, 0x2839, 0x4FF1, 0x4FF1, 0x0912, 0x4FF2, 0x4FF2, 0x283A,
- 0x4FF3, 0x4FF3, 0x12D1, 0x4FF4, 0x4FF7, 0x283B, 0x4FF8, 0x4FF8, 0x12CE,
- 0x4FF9, 0x4FF9, 0x283F, 0x4FFA, 0x4FFA, 0x03BE, 0x4FFB, 0x4FFD, 0x2840,
- 0x4FFE, 0x4FFE, 0x12D6, 0x4FFF, 0x4FFF, 0x2843, 0x5000, 0x5000, 0x22CC,
- 0x5001, 0x5005, 0x2844, 0x5006, 0x5006, 0x2016, 0x5007, 0x5008, 0x2849,
- 0x5009, 0x5009, 0x1E62, 0x500A, 0x500A, 0x284B, 0x500B, 0x500B, 0x1F20,
- 0x500C, 0x500C, 0x12D8, 0x500D, 0x500D, 0x041F, 0x500E, 0x500E, 0x284C,
- 0x500F, 0x500F, 0x12D3, 0x5010, 0x5010, 0x284D, 0x5011, 0x5011, 0x207F,
- 0x5012, 0x5012, 0x059A, 0x5013, 0x5013, 0x284E, 0x5014, 0x5014, 0x0922,
- 0x5015, 0x5017, 0x284F, 0x5018, 0x5018, 0x0E1B, 0x5019, 0x5019, 0x07A9,
- 0x501A, 0x501A, 0x1057, 0x501B, 0x501B, 0x2852, 0x501C, 0x501C, 0x12D7,
- 0x501D, 0x501E, 0x2853, 0x501F, 0x501F, 0x08B9, 0x5020, 0x5020, 0x2855,
- 0x5021, 0x5021, 0x04D0, 0x5022, 0x5024, 0x2856, 0x5025, 0x5025, 0x12D9,
- 0x5026, 0x5026, 0x091A, 0x5027, 0x5027, 0x2859, 0x5028, 0x5028, 0x12DA,
- 0x5029, 0x5029, 0x12CF, 0x502A, 0x502A, 0x0B42, 0x502B, 0x502B, 0x205C,
- 0x502C, 0x502C, 0x12D2, 0x502D, 0x502D, 0x12D5, 0x502E, 0x502E, 0x12D4,
- 0x502F, 0x5039, 0x285A, 0x503A, 0x503A, 0x114F, 0x503B, 0x503B, 0x2865,
- 0x503C, 0x503C, 0x11B4, 0x503D, 0x503D, 0x2866, 0x503E, 0x503E, 0x0C60,
- 0x503F, 0x5042, 0x2867, 0x5043, 0x5043, 0x12DC, 0x5044, 0x5046, 0x286B,
- 0x5047, 0x5047, 0x084C, 0x5048, 0x5048, 0x12DE, 0x5049, 0x5049, 0x2194,
- 0x504A, 0x504B, 0x286E, 0x504C, 0x504C, 0x12D0, 0x504D, 0x504D, 0x2870,
- 0x504E, 0x504E, 0x12DF, 0x504F, 0x504F, 0x0BCA, 0x5050, 0x5054, 0x2871,
- 0x5055, 0x5055, 0x12DD, 0x5056, 0x5059, 0x2876, 0x505A, 0x505A, 0x1253,
- 0x505B, 0x505B, 0x287A, 0x505C, 0x505C, 0x0E54, 0x505D, 0x5064, 0x287B,
- 0x5065, 0x5065, 0x0872, 0x5066, 0x506B, 0x2883, 0x506C, 0x506C, 0x12E0,
- 0x506D, 0x5073, 0x2889, 0x5074, 0x5074, 0x1E65, 0x5075, 0x5075, 0x2281,
- 0x5076, 0x5076, 0x0B7D, 0x5077, 0x5077, 0x0E66, 0x5078, 0x507A, 0x2890,
- 0x507B, 0x507B, 0x12E1, 0x507C, 0x507D, 0x2893, 0x507E, 0x507E, 0x12DB,
- 0x507F, 0x507F, 0x04CA, 0x5080, 0x5080, 0x098B, 0x5081, 0x5084, 0x2895,
- 0x5085, 0x5085, 0x06B0, 0x5086, 0x5087, 0x2899, 0x5088, 0x5088, 0x09E7,
- 0x5089, 0x508C, 0x289B, 0x508D, 0x508D, 0x0403, 0x508E, 0x5095, 0x289F,
- 0x5096, 0x5096, 0x22CD, 0x5097, 0x5097, 0x28A7, 0x5098, 0x5098, 0x210A,
- 0x5099, 0x5099, 0x1E3E, 0x509A, 0x50A1, 0x28A8, 0x50A2, 0x50A2, 0x267F,
- 0x50A3, 0x50A3, 0x0579, 0x50A4, 0x50A4, 0x28B0, 0x50A5, 0x50A5, 0x12E2,
- 0x50A6, 0x50A6, 0x28B1, 0x50A7, 0x50A7, 0x12E3, 0x50A8, 0x50A8, 0x0525,
- 0x50A9, 0x50A9, 0x12E4, 0x50AA, 0x50AB, 0x28B2, 0x50AC, 0x50AC, 0x0562,
- 0x50AD, 0x50AD, 0x222E, 0x50AE, 0x50B1, 0x28B4, 0x50B2, 0x50B2, 0x03CC,
- 0x50B3, 0x50B3, 0x1E96, 0x50B4, 0x50B4, 0x22CB, 0x50B5, 0x50B5, 0x226C,
- 0x50B6, 0x50B6, 0x28B8, 0x50B7, 0x50B7, 0x2117, 0x50B8, 0x50B9, 0x28B9,
- 0x50BA, 0x50BA, 0x12E5, 0x50BB, 0x50BB, 0x0CEE, 0x50BC, 0x50BD, 0x28BB,
- 0x50BE, 0x50BE, 0x20E8, 0x50BF, 0x50C1, 0x28BD, 0x50C2, 0x50C2, 0x22D4,
- 0x50C3, 0x50C4, 0x28C0, 0x50C5, 0x50C5, 0x1FB9, 0x50C6, 0x50C8, 0x28C2,
- 0x50C9, 0x50C9, 0x22D8, 0x50CA, 0x50CE, 0x28C5, 0x50CF, 0x50CF, 0x0F5E,
- 0x50D0, 0x50D0, 0x28CA, 0x50D1, 0x50D1, 0x20DF, 0x50D2, 0x50D4, 0x28CB,
- 0x50D5, 0x50D5, 0x20C2, 0x50D6, 0x50D6, 0x12E6, 0x50D7, 0x50D9, 0x28CE,
- 0x50DA, 0x50DA, 0x0A0E, 0x50DB, 0x50DD, 0x28D1, 0x50DE, 0x50DE, 0x2195,
- 0x50DF, 0x50E4, 0x28D4, 0x50E5, 0x50E5, 0x1FAC, 0x50E6, 0x50E6, 0x12EA,
- 0x50E7, 0x50E7, 0x0CE7, 0x50E8, 0x50E8, 0x22D3, 0x50E9, 0x50EB, 0x28DA,
- 0x50EC, 0x50EC, 0x12E9, 0x50ED, 0x50ED, 0x12E8, 0x50EE, 0x50EE, 0x12EB,
- 0x50EF, 0x50F2, 0x28DD, 0x50F3, 0x50F3, 0x0DD0, 0x50F4, 0x50F4, 0x28E1,
- 0x50F5, 0x50F5, 0x087A, 0x50F6, 0x50F8, 0x28E2, 0x50F9, 0x50F9, 0x1F81,
- 0x50FA, 0x50FA, 0x28E5, 0x50FB, 0x50FB, 0x0BC6, 0x50FC, 0x50FF, 0x28E6,
- 0x5100, 0x5100, 0x2210, 0x5101, 0x5101, 0x28EA, 0x5102, 0x5102, 0x22CF,
- 0x5103, 0x5103, 0x28EB, 0x5104, 0x5104, 0x2213, 0x5105, 0x5105, 0x28EC,
- 0x5106, 0x5106, 0x12E7, 0x5107, 0x5107, 0x12EC, 0x5108, 0x5108, 0x1FE4,
- 0x5109, 0x5109, 0x1F90, 0x510A, 0x510A, 0x28ED, 0x510B, 0x510B, 0x12ED,
- 0x510C, 0x510F, 0x28EE, 0x5110, 0x5110, 0x22D6, 0x5111, 0x5111, 0x28F2,
- 0x5112, 0x5112, 0x0CC0, 0x5113, 0x5113, 0x28F3, 0x5114, 0x5114, 0x22D0,
- 0x5115, 0x5115, 0x22CE, 0x5116, 0x5117, 0x28F4, 0x5118, 0x5118, 0x2681,
- 0x5119, 0x511E, 0x28F6, 0x511F, 0x511F, 0x1E76, 0x5120, 0x5120, 0x28FC,
- 0x5121, 0x5121, 0x09C7, 0x5122, 0x5129, 0x28FD, 0x512A, 0x512A, 0x2231,
- 0x512B, 0x5131, 0x2905, 0x5132, 0x5132, 0x1E93, 0x5133, 0x5136, 0x290C,
- 0x5137, 0x5137, 0x22D2, 0x5138, 0x5139, 0x2910, 0x513A, 0x513A, 0x22D7,
- 0x513B, 0x513B, 0x22D5, 0x513C, 0x513C, 0x22D1, 0x513D, 0x513E, 0x2912,
- 0x513F, 0x513F, 0x0638, 0x5140, 0x5140, 0x1259, 0x5141, 0x5141, 0x110D,
- 0x5142, 0x5142, 0x2914, 0x5143, 0x5143, 0x10ED, 0x5144, 0x5144, 0x0FA1,
- 0x5145, 0x5145, 0x0509, 0x5146, 0x5146, 0x1178, 0x5147, 0x5147, 0x2915,
- 0x5148, 0x5148, 0x0F35, 0x5149, 0x5149, 0x073B, 0x514A, 0x514A, 0x2916,
- 0x514B, 0x514B, 0x0958, 0x514C, 0x514C, 0x2917, 0x514D, 0x514D, 0x0AE7,
- 0x514E, 0x5150, 0x2918, 0x5151, 0x5151, 0x0611, 0x5152, 0x5152, 0x1EE5,
- 0x5153, 0x5153, 0x291B, 0x5154, 0x5154, 0x0E74, 0x5155, 0x5155, 0x1302,
- 0x5156, 0x5156, 0x1304, 0x5157, 0x5159, 0x291C, 0x515A, 0x515A, 0x0594,
- 0x515B, 0x515B, 0x291F, 0x515C, 0x515C, 0x05F4, 0x515D, 0x5161, 0x2920,
- 0x5162, 0x5162, 0x08D3, 0x5163, 0x5164, 0x2925, 0x5165, 0x5165, 0x0CC6,
- 0x5166, 0x5167, 0x2927, 0x5168, 0x5168, 0x0C86, 0x5169, 0x5169, 0x2025,
- 0x516A, 0x516A, 0x2929, 0x516B, 0x516B, 0x03D6, 0x516C, 0x516C, 0x0704,
- 0x516D, 0x516D, 0x0A42, 0x516E, 0x516E, 0x12F6, 0x516F, 0x516F, 0x292A,
- 0x5170, 0x5170, 0x09A7, 0x5171, 0x5171, 0x070B, 0x5172, 0x5172, 0x292B,
- 0x5173, 0x5173, 0x0731, 0x5174, 0x5174, 0x0F96, 0x5175, 0x5175, 0x0461,
- 0x5176, 0x5176, 0x0C03, 0x5177, 0x5177, 0x090E, 0x5178, 0x5178, 0x05C5,
- 0x5179, 0x5179, 0x1225, 0x517A, 0x517A, 0x292C, 0x517B, 0x517B, 0x1021,
- 0x517C, 0x517C, 0x0859, 0x517D, 0x517D, 0x0D75, 0x517E, 0x517F, 0x292D,
- 0x5180, 0x5180, 0x0830, 0x5181, 0x5181, 0x12FA, 0x5182, 0x5182, 0x129D,
- 0x5183, 0x5184, 0x292F, 0x5185, 0x5185, 0x0B3D, 0x5186, 0x5187, 0x2931,
- 0x5188, 0x5188, 0x06CF, 0x5189, 0x5189, 0x0C98, 0x518A, 0x518B, 0x2933,
- 0x518C, 0x518C, 0x04A8, 0x518D, 0x518D, 0x111C, 0x518E, 0x5191, 0x2935,
- 0x5192, 0x5192, 0x0AB5, 0x5193, 0x5194, 0x2939, 0x5195, 0x5195, 0x0AE6,
- 0x5196, 0x5196, 0x1314, 0x5197, 0x5197, 0x0CBA, 0x5198, 0x5198, 0x293B,
- 0x5199, 0x5199, 0x0F7F, 0x519A, 0x519A, 0x293C, 0x519B, 0x519B, 0x092B,
- 0x519C, 0x519C, 0x0B6A, 0x519D, 0x519F, 0x293D, 0x51A0, 0x51A0, 0x0733,
- 0x51A1, 0x51A1, 0x2940, 0x51A2, 0x51A2, 0x1315, 0x51A3, 0x51A3, 0x2941,
- 0x51A4, 0x51A4, 0x10EC, 0x51A5, 0x51A5, 0x1316, 0x51A6, 0x51AA, 0x2942,
- 0x51AB, 0x51AB, 0x130F, 0x51AC, 0x51AC, 0x05EB, 0x51AD, 0x51AE, 0x2947,
- 0x51AF, 0x51AF, 0x0688, 0x51B0, 0x51B0, 0x0462, 0x51B1, 0x51B1, 0x1310,
- 0x51B2, 0x51B2, 0x050A, 0x51B3, 0x51B3, 0x0925, 0x51B4, 0x51B4, 0x2949,
- 0x51B5, 0x51B5, 0x0983, 0x51B6, 0x51B6, 0x1038, 0x51B7, 0x51B7, 0x09CF,
- 0x51B8, 0x51BA, 0x294A, 0x51BB, 0x51BB, 0x05F2, 0x51BC, 0x51BC, 0x1312,
- 0x51BD, 0x51BD, 0x1311, 0x51BE, 0x51BF, 0x294D, 0x51C0, 0x51C0, 0x08EA,
- 0x51C1, 0x51C3, 0x294F, 0x51C4, 0x51C4, 0x0BFF, 0x51C5, 0x51C5, 0x2952,
- 0x51C6, 0x51C6, 0x1219, 0x51C7, 0x51C7, 0x1313, 0x51C8, 0x51C8, 0x2953,
- 0x51C9, 0x51C9, 0x0A02, 0x51CA, 0x51CA, 0x2954, 0x51CB, 0x51CB, 0x05D3,
- 0x51CC, 0x51CC, 0x0A31, 0x51CD, 0x51CD, 0x1ECF, 0x51CE, 0x51CE, 0x2955,
- 0x51CF, 0x51CF, 0x0868, 0x51D0, 0x51D0, 0x2956, 0x51D1, 0x51D1, 0x0558,
- 0x51D2, 0x51DA, 0x2957, 0x51DB, 0x51DB, 0x0A26, 0x51DC, 0x51DC, 0x2960,
- 0x51DD, 0x51DD, 0x0B60, 0x51DE, 0x51DF, 0x2961, 0x51E0, 0x51E0, 0x082B,
- 0x51E1, 0x51E1, 0x064F, 0x51E2, 0x51E3, 0x2963, 0x51E4, 0x51E4, 0x068C,
- 0x51E5, 0x51EA, 0x2965, 0x51EB, 0x51EB, 0x1300, 0x51EC, 0x51EC, 0x296B,
- 0x51ED, 0x51ED, 0x0BDD, 0x51EE, 0x51EE, 0x296C, 0x51EF, 0x51EF, 0x093A,
- 0x51F0, 0x51F0, 0x07E0, 0x51F1, 0x51F1, 0x1FD9, 0x51F2, 0x51F2, 0x296D,
- 0x51F3, 0x51F3, 0x05AB, 0x51F4, 0x51F4, 0x296E, 0x51F5, 0x51F5, 0x1399,
- 0x51F6, 0x51F6, 0x0FA2, 0x51F7, 0x51F7, 0x296F, 0x51F8, 0x51F8, 0x0E6A,
- 0x51F9, 0x51F9, 0x03C7, 0x51FA, 0x51FA, 0x051B, 0x51FB, 0x51FB, 0x080C,
- 0x51FC, 0x51FC, 0x139A, 0x51FD, 0x51FD, 0x0766, 0x51FE, 0x51FE, 0x2970,
- 0x51FF, 0x51FF, 0x1127, 0x5200, 0x5200, 0x0597, 0x5201, 0x5201, 0x05D4,
- 0x5202, 0x5202, 0x128C, 0x5203, 0x5203, 0x0CAB, 0x5204, 0x5205, 0x2971,
- 0x5206, 0x5206, 0x0673, 0x5207, 0x5207, 0x0C4D, 0x5208, 0x5208, 0x128D,
- 0x5209, 0x5209, 0x2973, 0x520A, 0x520A, 0x093C, 0x520B, 0x520C, 0x2974,
- 0x520D, 0x520D, 0x138B, 0x520E, 0x520E, 0x128E, 0x520F, 0x5210, 0x2976,
- 0x5211, 0x5211, 0x0F97, 0x5212, 0x5212, 0x07C3, 0x5213, 0x5215, 0x2978,
- 0x5216, 0x5216, 0x196E, 0x5217, 0x5217, 0x0A19, 0x5218, 0x5218, 0x0A3E,
- 0x5219, 0x5219, 0x1135, 0x521A, 0x521A, 0x06D0, 0x521B, 0x521B, 0x0537,
- 0x521C, 0x521C, 0x297B, 0x521D, 0x521D, 0x051A, 0x521E, 0x521F, 0x297C,
- 0x5220, 0x5220, 0x0CF7, 0x5221, 0x5223, 0x297E, 0x5224, 0x5224, 0x0B91,
- 0x5225, 0x5227, 0x2981, 0x5228, 0x5228, 0x0B9A, 0x5229, 0x5229, 0x09E6,
- 0x522A, 0x522A, 0x2984, 0x522B, 0x522B, 0x0459, 0x522C, 0x522C, 0x2985,
- 0x522D, 0x522D, 0x128F, 0x522E, 0x522E, 0x0727, 0x522F, 0x522F, 0x2986,
- 0x5230, 0x5230, 0x059E, 0x5231, 0x5232, 0x2987, 0x5233, 0x5233, 0x1290,
- 0x5234, 0x5235, 0x2989, 0x5236, 0x5236, 0x11C5, 0x5237, 0x5237, 0x0D97,
- 0x5238, 0x5238, 0x0C8A, 0x5239, 0x5239, 0x0CEB, 0x523A, 0x523A, 0x054F,
- 0x523B, 0x523B, 0x0959, 0x523C, 0x523C, 0x298B, 0x523D, 0x523D, 0x074D,
- 0x523E, 0x523E, 0x298C, 0x523F, 0x5240, 0x1291, 0x5241, 0x5241, 0x0626,
- 0x5242, 0x5242, 0x0834, 0x5243, 0x5243, 0x0E3D, 0x5244, 0x5244, 0x22C8,
- 0x5245, 0x5246, 0x298D, 0x5247, 0x5247, 0x2263, 0x5248, 0x5249, 0x298F,
- 0x524A, 0x524A, 0x0F64, 0x524B, 0x524B, 0x2683, 0x524C, 0x524C, 0x1293,
- 0x524D, 0x524D, 0x0C2D, 0x524E, 0x524F, 0x2991, 0x5250, 0x5250, 0x0729,
- 0x5251, 0x5251, 0x0874, 0x5252, 0x5253, 0x2993, 0x5254, 0x5254, 0x0E31,
- 0x5255, 0x5255, 0x2995, 0x5256, 0x5256, 0x0BE9, 0x5257, 0x525A, 0x2996,
- 0x525B, 0x525B, 0x1F17, 0x525C, 0x525C, 0x1296, 0x525D, 0x525D, 0x299A,
- 0x525E, 0x525E, 0x1294, 0x525F, 0x5260, 0x299B, 0x5261, 0x5261, 0x1295,
- 0x5262, 0x5264, 0x299D, 0x5265, 0x5265, 0x0409, 0x5266, 0x5266, 0x29A0,
- 0x5267, 0x5267, 0x0916, 0x5268, 0x5268, 0x29A1, 0x5269, 0x5269, 0x0D3A,
- 0x526A, 0x526A, 0x0867, 0x526B, 0x526D, 0x29A2, 0x526E, 0x526E, 0x1F2B,
- 0x526F, 0x526F, 0x06AC, 0x5270, 0x5271, 0x29A5, 0x5272, 0x5272, 0x06E9,
- 0x5273, 0x5273, 0x29A7, 0x5274, 0x5274, 0x22CA, 0x5275, 0x5275, 0x1E99,
- 0x5276, 0x527C, 0x29A8, 0x527D, 0x527D, 0x1298, 0x527E, 0x527E, 0x29AF,
- 0x527F, 0x527F, 0x089C, 0x5280, 0x5280, 0x29B0, 0x5281, 0x5281, 0x129A,
- 0x5282, 0x5282, 0x1299, 0x5283, 0x5283, 0x1F4F, 0x5284, 0x5286, 0x29B1,
- 0x5287, 0x5287, 0x1FCF, 0x5288, 0x5288, 0x0BBD, 0x5289, 0x5289, 0x2036,
- 0x528A, 0x528A, 0x1F3A, 0x528B, 0x528B, 0x29B4, 0x528C, 0x528C, 0x22C9,
- 0x528D, 0x528D, 0x1F99, 0x528E, 0x528F, 0x29B5, 0x5290, 0x5290, 0x129B,
- 0x5291, 0x5291, 0x1F75, 0x5292, 0x5292, 0x29B7, 0x5293, 0x5293, 0x129C,
- 0x5294, 0x529A, 0x29B8, 0x529B, 0x529B, 0x09EF, 0x529C, 0x529C, 0x29BF,
- 0x529D, 0x529D, 0x0C8B, 0x529E, 0x529E, 0x03F7, 0x529F, 0x529F, 0x06FF,
- 0x52A0, 0x52A0, 0x0846, 0x52A1, 0x52A1, 0x0F00, 0x52A2, 0x52A2, 0x138D,
- 0x52A3, 0x52A3, 0x0A1C, 0x52A4, 0x52A7, 0x29C0, 0x52A8, 0x52A8, 0x05EE,
- 0x52A9, 0x52A9, 0x11F9, 0x52AA, 0x52AA, 0x0B6D, 0x52AB, 0x52AB, 0x08AA,
- 0x52AC, 0x52AD, 0x138E, 0x52AE, 0x52B0, 0x29C4, 0x52B1, 0x52B1, 0x09E3,
- 0x52B2, 0x52B2, 0x08D1, 0x52B3, 0x52B3, 0x09B8, 0x52B4, 0x52BD, 0x29C7,
- 0x52BE, 0x52BE, 0x1390, 0x52BF, 0x52BF, 0x0D5D, 0x52C0, 0x52C0, 0x29D1,
- 0x52C1, 0x52C1, 0x1FBE, 0x52C2, 0x52C2, 0x29D2, 0x52C3, 0x52C3, 0x0471,
- 0x52C4, 0x52C6, 0x29D3, 0x52C7, 0x52C7, 0x10A7, 0x52C8, 0x52C8, 0x29D6,
- 0x52C9, 0x52C9, 0x0AE8, 0x52CA, 0x52CA, 0x29D7, 0x52CB, 0x52CB, 0x0FD4,
- 0x52CC, 0x52CF, 0x29D8, 0x52D0, 0x52D0, 0x1392, 0x52D1, 0x52D1, 0x29DC,
- 0x52D2, 0x52D2, 0x09C0, 0x52D3, 0x52D4, 0x29DD, 0x52D5, 0x52D5, 0x1ECD,
- 0x52D6, 0x52D6, 0x1393, 0x52D7, 0x52D7, 0x29DF, 0x52D8, 0x52D8, 0x093E,
- 0x52D9, 0x52D9, 0x21A9, 0x52DA, 0x52DA, 0x29E0, 0x52DB, 0x52DB, 0x21E6,
- 0x52DC, 0x52DC, 0x29E1, 0x52DD, 0x52DD, 0x2127, 0x52DE, 0x52DE, 0x2003,
- 0x52DF, 0x52DF, 0x0B1F, 0x52E0, 0x52E1, 0x29E2, 0x52E2, 0x52E2, 0x2132,
- 0x52E3, 0x52E3, 0x29E4, 0x52E4, 0x52E4, 0x0C57, 0x52E5, 0x52EF, 0x29E5,
- 0x52F0, 0x52F0, 0x1394, 0x52F1, 0x52F1, 0x2323, 0x52F2, 0x52F4, 0x29F0,
- 0x52F5, 0x52F5, 0x2011, 0x52F6, 0x52F7, 0x29F3, 0x52F8, 0x52F8, 0x20F5,
- 0x52F9, 0x52F9, 0x12FC, 0x52FA, 0x52FA, 0x0D10, 0x52FB, 0x52FD, 0x29F5,
- 0x52FE, 0x52FE, 0x070D, 0x52FF, 0x52FF, 0x0EFF, 0x5300, 0x5300, 0x110B,
- 0x5301, 0x5304, 0x29F8, 0x5305, 0x5305, 0x0407, 0x5306, 0x5306, 0x0555,
- 0x5307, 0x5307, 0x29FC, 0x5308, 0x5308, 0x0FA4, 0x5309, 0x530C, 0x29FD,
- 0x530D, 0x530D, 0x12FD, 0x530E, 0x530E, 0x2A01, 0x530F, 0x530F, 0x14B5,
- 0x5310, 0x5310, 0x12FF, 0x5311, 0x5314, 0x2A02, 0x5315, 0x5315, 0x1266,
- 0x5316, 0x5316, 0x07C4, 0x5317, 0x5317, 0x041A, 0x5318, 0x5318, 0x2A06,
- 0x5319, 0x5319, 0x04FC, 0x531A, 0x531A, 0x1284, 0x531B, 0x531C, 0x2A07,
- 0x531D, 0x531D, 0x1114, 0x531E, 0x531F, 0x2A09, 0x5320, 0x5320, 0x0884,
- 0x5321, 0x5321, 0x097C, 0x5322, 0x5322, 0x2A0B, 0x5323, 0x5323, 0x0F28,
- 0x5324, 0x5325, 0x2A0C, 0x5326, 0x5326, 0x1286, 0x5327, 0x5329, 0x2A0E,
- 0x532A, 0x532A, 0x0668, 0x532B, 0x532C, 0x2A11, 0x532D, 0x532D, 0x22C5,
- 0x532E, 0x532E, 0x1287, 0x532F, 0x532F, 0x1F5E, 0x5330, 0x5330, 0x2A13,
- 0x5331, 0x5331, 0x22C6, 0x5332, 0x5338, 0x2A14, 0x5339, 0x5339, 0x0BC4,
- 0x533A, 0x533A, 0x0C75, 0x533B, 0x533B, 0x1044, 0x533C, 0x533D, 0x2A1B,
- 0x533E, 0x533E, 0x1288, 0x533F, 0x533F, 0x0B47, 0x5340, 0x5340, 0x20EF,
- 0x5341, 0x5341, 0x0D45, 0x5342, 0x5342, 0x2A1D, 0x5343, 0x5343, 0x0C24,
- 0x5344, 0x5344, 0x2A1E, 0x5345, 0x5345, 0x125C, 0x5346, 0x5346, 0x2A1F,
- 0x5347, 0x5347, 0x0D36, 0x5348, 0x5348, 0x0EF6, 0x5349, 0x5349, 0x07F1,
- 0x534A, 0x534A, 0x03F6, 0x534B, 0x534D, 0x2A20, 0x534E, 0x534E, 0x07BF,
- 0x534F, 0x534F, 0x0F78, 0x5350, 0x5350, 0x2A23, 0x5351, 0x5351, 0x0419,
- 0x5352, 0x5352, 0x1241, 0x5353, 0x5353, 0x121C, 0x5354, 0x5354, 0x21D0,
- 0x5355, 0x5355, 0x0586, 0x5356, 0x5356, 0x0A9B, 0x5357, 0x5357, 0x0B32,
- 0x5358, 0x5359, 0x2A24, 0x535A, 0x535A, 0x0470, 0x535B, 0x535B, 0x2A26,
- 0x535C, 0x535C, 0x047E, 0x535D, 0x535D, 0x2A27, 0x535E, 0x535E, 0x044E,
- 0x535F, 0x535F, 0x14FA, 0x5360, 0x5360, 0x115D, 0x5361, 0x5361, 0x0935,
- 0x5362, 0x5362, 0x0A53, 0x5363, 0x5363, 0x128B, 0x5364, 0x5364, 0x0A58,
- 0x5365, 0x5365, 0x2A28, 0x5366, 0x5366, 0x128A, 0x5367, 0x5367, 0x0EE3,
- 0x5368, 0x5368, 0x2A29, 0x5369, 0x5369, 0x1352, 0x536A, 0x536A, 0x2A2A,
- 0x536B, 0x536B, 0x0ECF, 0x536C, 0x536D, 0x2A2B, 0x536E, 0x536E, 0x126A,
- 0x536F, 0x536F, 0x0AB3, 0x5370, 0x5370, 0x1086, 0x5371, 0x5371, 0x0EB2,
- 0x5372, 0x5372, 0x2A2D, 0x5373, 0x5373, 0x0827, 0x5374, 0x5374, 0x0C8F,
- 0x5375, 0x5375, 0x0A78, 0x5376, 0x5376, 0x2A2E, 0x5377, 0x5377, 0x091C,
- 0x5378, 0x5378, 0x0F81, 0x5379, 0x5379, 0x2A2F, 0x537A, 0x537A, 0x1353,
- 0x537B, 0x537E, 0x2A30, 0x537F, 0x537F, 0x0C61, 0x5380, 0x5381, 0x2A34,
- 0x5382, 0x5382, 0x04CC, 0x5383, 0x5383, 0x2A36, 0x5384, 0x5384, 0x0631,
- 0x5385, 0x5385, 0x0E4F, 0x5386, 0x5386, 0x09E5, 0x5387, 0x5388, 0x2A37,
- 0x5389, 0x5389, 0x09E2, 0x538A, 0x538A, 0x2A39, 0x538B, 0x538B, 0x0FE2,
- 0x538C, 0x538C, 0x100A, 0x538D, 0x538D, 0x127D, 0x538E, 0x5394, 0x2A3A,
- 0x5395, 0x5395, 0x04A5, 0x5396, 0x5397, 0x2A41, 0x5398, 0x5398, 0x09D0,
- 0x5399, 0x5399, 0x22C1, 0x539A, 0x539A, 0x07A8, 0x539B, 0x539C, 0x2A43,
- 0x539D, 0x539D, 0x127E, 0x539E, 0x539E, 0x2A45, 0x539F, 0x539F, 0x10F0,
- 0x53A0, 0x53A0, 0x1E64, 0x53A1, 0x53A1, 0x2A46, 0x53A2, 0x53A2, 0x0F4E,
- 0x53A3, 0x53A3, 0x127F, 0x53A4, 0x53A4, 0x2A47, 0x53A5, 0x53A5, 0x1280,
- 0x53A6, 0x53A6, 0x0F30, 0x53A7, 0x53A7, 0x2A48, 0x53A8, 0x53A8, 0x051D,
- 0x53A9, 0x53A9, 0x08F6, 0x53AA, 0x53AC, 0x2A49, 0x53AD, 0x53AD, 0x21F9,
- 0x53AE, 0x53AE, 0x1281, 0x53AF, 0x53B1, 0x2A4C, 0x53B2, 0x53B2, 0x2010,
- 0x53B3, 0x53B3, 0x2A4F, 0x53B4, 0x53B4, 0x22C2, 0x53B5, 0x53B5, 0x2A50,
- 0x53B6, 0x53B6, 0x139C, 0x53B7, 0x53BA, 0x2A51, 0x53BB, 0x53BB, 0x0C80,
- 0x53BC, 0x53BE, 0x2A55, 0x53BF, 0x53BF, 0x0F45, 0x53C0, 0x53C0, 0x2A58,
- 0x53C1, 0x53C1, 0x0CD9, 0x53C2, 0x53C2, 0x0495, 0x53C3, 0x53C3, 0x1E5A,
- 0x53C4, 0x53C7, 0x2A59, 0x53C8, 0x53C8, 0x10BB, 0x53C9, 0x53C9, 0x04AD,
- 0x53CA, 0x53CA, 0x0823, 0x53CB, 0x53CB, 0x10B6, 0x53CC, 0x53CC, 0x0DA0,
- 0x53CD, 0x53CD, 0x0651, 0x53CE, 0x53D0, 0x2A5D, 0x53D1, 0x53D1, 0x063F,
- 0x53D2, 0x53D3, 0x2A60, 0x53D4, 0x53D4, 0x0D7C, 0x53D5, 0x53D5, 0x2A62,
- 0x53D6, 0x53D6, 0x0C7C, 0x53D7, 0x53D7, 0x0D73, 0x53D8, 0x53D8, 0x044D,
- 0x53D9, 0x53D9, 0x0FBB, 0x53DA, 0x53DA, 0x2A63, 0x53DB, 0x53DB, 0x0B92,
- 0x53DC, 0x53DE, 0x2A64, 0x53DF, 0x53DF, 0x1395, 0x53E0, 0x53E0, 0x05DF,
- 0x53E1, 0x53E1, 0x2A67, 0x53E2, 0x53E2, 0x1EA2, 0x53E3, 0x53E3, 0x0967,
- 0x53E4, 0x53E4, 0x071E, 0x53E5, 0x53E5, 0x0913, 0x53E6, 0x53E6, 0x0A36,
- 0x53E7, 0x53E7, 0x2A68, 0x53E8, 0x53E8, 0x14FE, 0x53E9, 0x53E9, 0x14FD,
- 0x53EA, 0x53EA, 0x11BA, 0x53EB, 0x53EB, 0x08A1, 0x53EC, 0x53EC, 0x117A,
- 0x53ED, 0x53ED, 0x03D3, 0x53EE, 0x53EE, 0x05E2, 0x53EF, 0x53EF, 0x0956,
- 0x53F0, 0x53F0, 0x0DFB, 0x53F1, 0x53F1, 0x14FB, 0x53F2, 0x53F2, 0x0D4E,
- 0x53F3, 0x53F3, 0x10B7, 0x53F4, 0x53F4, 0x2A69, 0x53F5, 0x53F5, 0x1285,
- 0x53F6, 0x53F6, 0x103D, 0x53F7, 0x53F7, 0x077C, 0x53F8, 0x53F8, 0x0DB3,
- 0x53F9, 0x53F9, 0x0E11, 0x53FA, 0x53FA, 0x2A6A, 0x53FB, 0x53FB, 0x14FF,
- 0x53FC, 0x53FC, 0x05D1, 0x53FD, 0x53FD, 0x14FC, 0x53FE, 0x53FF, 0x2A6B,
- 0x5400, 0x5400, 0x2A6D, 0x5401, 0x5401, 0x10DA, 0x5402, 0x5402, 0x2A6E,
- 0x5403, 0x5403, 0x04F9, 0x5404, 0x5404, 0x06F2, 0x5405, 0x5405, 0x2A6F,
- 0x5406, 0x5406, 0x1502, 0x5407, 0x5407, 0x2A70, 0x5408, 0x5408, 0x0786,
- 0x5409, 0x5409, 0x081D, 0x540A, 0x540A, 0x05D6, 0x540B, 0x540B, 0x2A71,
- 0x540C, 0x540C, 0x0E5D, 0x540D, 0x540D, 0x0B00, 0x540E, 0x540E, 0x07AA,
- 0x540F, 0x540F, 0x09DF, 0x5410, 0x5410, 0x0E73, 0x5411, 0x5411, 0x0F5F,
- 0x5412, 0x5412, 0x1500, 0x5413, 0x5413, 0x0F32, 0x5414, 0x5414, 0x2A72,
- 0x5415, 0x5415, 0x0A67, 0x5416, 0x5416, 0x1501, 0x5417, 0x5417, 0x0A97,
- 0x5418, 0x541A, 0x2A73, 0x541B, 0x541B, 0x092C, 0x541C, 0x541C, 0x2A76,
- 0x541D, 0x541D, 0x0A28, 0x541E, 0x541E, 0x0E7D, 0x541F, 0x541F, 0x107E,
- 0x5420, 0x5420, 0x066A, 0x5421, 0x5421, 0x1509, 0x5422, 0x5422, 0x2A77,
- 0x5423, 0x5423, 0x150C, 0x5424, 0x5425, 0x2A78, 0x5426, 0x5426, 0x068E,
- 0x5427, 0x5427, 0x03D4, 0x5428, 0x5428, 0x0615, 0x5429, 0x5429, 0x0671,
- 0x542A, 0x542A, 0x2A7A, 0x542B, 0x542B, 0x0763, 0x542C, 0x542C, 0x0E50,
- 0x542D, 0x542D, 0x0961, 0x542E, 0x542E, 0x0DA6, 0x542F, 0x542F, 0x0C13,
- 0x5430, 0x5430, 0x2A7B, 0x5431, 0x5431, 0x11A7, 0x5432, 0x5432, 0x150D,
- 0x5433, 0x5433, 0x2A7C, 0x5434, 0x5434, 0x0EF1, 0x5435, 0x5435, 0x04D8,
- 0x5436, 0x5437, 0x2A7D, 0x5438, 0x5438, 0x0F0B, 0x5439, 0x5439, 0x0538,
- 0x543A, 0x543A, 0x2A7F, 0x543B, 0x543B, 0x0ED6, 0x543C, 0x543C, 0x07A7,
- 0x543D, 0x543D, 0x2A80, 0x543E, 0x543E, 0x0EF0, 0x543F, 0x543F, 0x2A81,
- 0x5440, 0x5440, 0x0FE6, 0x5441, 0x5442, 0x2A82, 0x5443, 0x5443, 0x1508,
- 0x5444, 0x5445, 0x2A84, 0x5446, 0x5446, 0x0577, 0x5447, 0x5447, 0x2A86,
- 0x5448, 0x5448, 0x04EF, 0x5449, 0x5449, 0x2A87, 0x544A, 0x544A, 0x06E1,
- 0x544B, 0x544B, 0x1503, 0x544C, 0x544F, 0x2A88, 0x5450, 0x5450, 0x0B28,
- 0x5451, 0x5451, 0x2A8C, 0x5452, 0x5454, 0x1504, 0x5455, 0x5455, 0x0B7C,
- 0x5456, 0x5456, 0x1507, 0x5457, 0x5457, 0x150A, 0x5458, 0x5458, 0x10F4,
- 0x5459, 0x5459, 0x150B, 0x545A, 0x545A, 0x2A8D, 0x545B, 0x545B, 0x0C37,
- 0x545C, 0x545C, 0x0EE7, 0x545D, 0x5461, 0x2A8E, 0x5462, 0x5462, 0x0B3B,
- 0x5463, 0x5463, 0x2A93, 0x5464, 0x5464, 0x1512, 0x5465, 0x5465, 0x2A94,
- 0x5466, 0x5466, 0x1517, 0x5467, 0x5467, 0x2A95, 0x5468, 0x5468, 0x11DB,
- 0x5469, 0x5470, 0x2A96, 0x5471, 0x5471, 0x1511, 0x5472, 0x5472, 0x1522,
- 0x5473, 0x5473, 0x0EC5, 0x5474, 0x5474, 0x2A9E, 0x5475, 0x5475, 0x077E,
- 0x5476, 0x5476, 0x1516, 0x5477, 0x5477, 0x1510, 0x5478, 0x5478, 0x0B9F,
- 0x5479, 0x547A, 0x2A9F, 0x547B, 0x547B, 0x0D24, 0x547C, 0x547C, 0x07AB,
- 0x547D, 0x547D, 0x0B01, 0x547E, 0x547F, 0x2AA1, 0x5480, 0x5480, 0x0906,
- 0x5481, 0x5481, 0x2AA3, 0x5482, 0x5482, 0x150E, 0x5483, 0x5483, 0x2AA4,
- 0x5484, 0x5484, 0x1515, 0x5485, 0x5485, 0x2AA5, 0x5486, 0x5486, 0x0B99,
- 0x5487, 0x548A, 0x2AA6, 0x548B, 0x548B, 0x1147, 0x548C, 0x548C, 0x0784,
- 0x548D, 0x548D, 0x2AAA, 0x548E, 0x548E, 0x08FB, 0x548F, 0x548F, 0x10A2,
- 0x5490, 0x5490, 0x06BB, 0x5491, 0x5491, 0x2AAB, 0x5492, 0x5492, 0x11E3,
- 0x5493, 0x5493, 0x2AAC, 0x5494, 0x5494, 0x150F, 0x5495, 0x5495, 0x0717,
- 0x5496, 0x5496, 0x0934, 0x5497, 0x5498, 0x2AAD, 0x5499, 0x5499, 0x0A45,
- 0x549A, 0x549B, 0x1513, 0x549C, 0x549C, 0x2AAF, 0x549D, 0x549D, 0x1518,
- 0x549E, 0x54A2, 0x2AB0, 0x54A3, 0x54A3, 0x1523, 0x54A4, 0x54A4, 0x152D,
- 0x54A5, 0x54A5, 0x2AB5, 0x54A6, 0x54A6, 0x151F, 0x54A7, 0x54A7, 0x151E,
- 0x54A8, 0x54A8, 0x1226, 0x54A9, 0x54AA, 0x152B, 0x54AB, 0x54AB, 0x1767,
- 0x54AC, 0x54AC, 0x102E, 0x54AD, 0x54AD, 0x151A, 0x54AE, 0x54AE, 0x2AB6,
- 0x54AF, 0x54AF, 0x0936, 0x54B0, 0x54B0, 0x2AB7, 0x54B1, 0x54B1, 0x111E,
- 0x54B2, 0x54B2, 0x2AB8, 0x54B3, 0x54B3, 0x0955, 0x54B4, 0x54B4, 0x151C,
- 0x54B5, 0x54B7, 0x2AB9, 0x54B8, 0x54B8, 0x0F39, 0x54B9, 0x54BA, 0x2ABC,
- 0x54BB, 0x54BB, 0x1525, 0x54BC, 0x54BC, 0x236D, 0x54BD, 0x54BD, 0x0FF3,
- 0x54BE, 0x54BE, 0x2ABE, 0x54BF, 0x54BF, 0x1526, 0x54C0, 0x54C0, 0x03B2,
- 0x54C1, 0x54C1, 0x0BD6, 0x54C2, 0x54C2, 0x151B, 0x54C3, 0x54C3, 0x2ABF,
- 0x54C4, 0x54C4, 0x079C, 0x54C5, 0x54C5, 0x2AC0, 0x54C6, 0x54C6, 0x061E,
- 0x54C7, 0x54C7, 0x0E8C, 0x54C8, 0x54C8, 0x0757, 0x54C9, 0x54C9, 0x1118,
- 0x54CA, 0x54CB, 0x2AC1, 0x54CC, 0x54CC, 0x1527, 0x54CD, 0x54CD, 0x0F59,
- 0x54CE, 0x54CE, 0x03B0, 0x54CF, 0x54CF, 0x152F, 0x54D0, 0x54D0, 0x1519,
- 0x54D1, 0x54D1, 0x0FEF, 0x54D2, 0x54D2, 0x151D, 0x54D3, 0x54D4, 0x1520,
- 0x54D5, 0x54D5, 0x1524, 0x54D6, 0x54D6, 0x2AC3, 0x54D7, 0x54D7, 0x07BE,
- 0x54D8, 0x54D8, 0x2AC4, 0x54D9, 0x54DA, 0x1528, 0x54DB, 0x54DB, 0x2AC5,
- 0x54DC, 0x54DC, 0x152A, 0x54DD, 0x54DD, 0x152E, 0x54DE, 0x54DE, 0x1530,
- 0x54DF, 0x54DF, 0x1099, 0x54E0, 0x54E0, 0x2AC6, 0x54E1, 0x54E1, 0x2247,
- 0x54E2, 0x54E4, 0x2AC7, 0x54E5, 0x54E5, 0x06E2, 0x54E6, 0x54E6, 0x0B77,
- 0x54E7, 0x54E7, 0x1532, 0x54E8, 0x54E8, 0x0D13, 0x54E9, 0x54E9, 0x09F1,
- 0x54EA, 0x54EA, 0x0B27, 0x54EB, 0x54EC, 0x2ACA, 0x54ED, 0x54ED, 0x096B,
- 0x54EE, 0x54EE, 0x0F65, 0x54EF, 0x54F1, 0x2ACC, 0x54F2, 0x54F2, 0x117D,
- 0x54F3, 0x54F3, 0x1536, 0x54F4, 0x54F9, 0x2ACF, 0x54FA, 0x54FA, 0x047F,
- 0x54FB, 0x54FB, 0x2AD5, 0x54FC, 0x54FC, 0x0796, 0x54FD, 0x54FD, 0x1534,
- 0x54FE, 0x54FE, 0x2AD6, 0x54FF, 0x54FF, 0x1391, 0x5500, 0x5500, 0x2AD7,
- 0x5501, 0x5501, 0x100D, 0x5502, 0x5503, 0x2AD8, 0x5504, 0x5504, 0x236C,
- 0x5505, 0x5505, 0x2ADA, 0x5506, 0x5506, 0x0DE9, 0x5507, 0x5507, 0x0540,
- 0x5508, 0x5508, 0x2ADB, 0x5509, 0x5509, 0x03B1, 0x550A, 0x550E, 0x2ADC,
- 0x550F, 0x550F, 0x1539, 0x5510, 0x5510, 0x0E19, 0x5511, 0x5511, 0x153A,
- 0x5512, 0x5513, 0x2AE1, 0x5514, 0x5514, 0x1535, 0x5515, 0x551A, 0x2AE3,
- 0x551B, 0x551B, 0x1531, 0x551C, 0x551F, 0x2AE9, 0x5520, 0x5520, 0x1533,
- 0x5521, 0x5521, 0x2AED, 0x5522, 0x5523, 0x1537, 0x5524, 0x5524, 0x07D2,
- 0x5525, 0x5526, 0x2AEE, 0x5527, 0x5527, 0x153B, 0x5528, 0x5529, 0x2AF0,
- 0x552A, 0x552A, 0x153C, 0x552B, 0x552B, 0x2AF2, 0x552C, 0x552C, 0x07B8,
- 0x552D, 0x552D, 0x2AF3, 0x552E, 0x552E, 0x0D72, 0x552F, 0x552F, 0x0EB7,
- 0x5530, 0x5530, 0x154D, 0x5531, 0x5531, 0x04CF, 0x5532, 0x5532, 0x2AF4,
- 0x5533, 0x5533, 0x154C, 0x5534, 0x5536, 0x2AF5, 0x5537, 0x5537, 0x1547,
- 0x5538, 0x553B, 0x2AF8, 0x553C, 0x553C, 0x1546, 0x553D, 0x553D, 0x2AFC,
- 0x553E, 0x553E, 0x0E8A, 0x553F, 0x553F, 0x1544, 0x5540, 0x5540, 0x2AFD,
- 0x5541, 0x5541, 0x1542, 0x5542, 0x5542, 0x2AFE, 0x5543, 0x5543, 0x095D,
- 0x5544, 0x5544, 0x1221, 0x5545, 0x5545, 0x2AFF, 0x5546, 0x5546, 0x0D05,
- 0x5547, 0x5548, 0x2B00, 0x5549, 0x5549, 0x1540, 0x554A, 0x554A, 0x03AC,
- 0x554B, 0x554E, 0x2B02, 0x554F, 0x554F, 0x219C, 0x5550, 0x5550, 0x1545,
- 0x5551, 0x5552, 0x2B06, 0x5553, 0x5553, 0x20C9, 0x5554, 0x5554, 0x2B08,
- 0x5555, 0x5555, 0x1543, 0x5556, 0x5556, 0x1548, 0x5557, 0x555B, 0x2B09,
- 0x555C, 0x555C, 0x154E, 0x555D, 0x555D, 0x2B0E, 0x555E, 0x555E, 0x21F0,
- 0x555F, 0x5560, 0x2B0F, 0x5561, 0x5561, 0x0665, 0x5562, 0x5563, 0x2B11,
- 0x5564, 0x5564, 0x0BC0, 0x5565, 0x5565, 0x0CEF, 0x5566, 0x5566, 0x099D,
- 0x5567, 0x5567, 0x153D, 0x5568, 0x5569, 0x2B13, 0x556A, 0x556A, 0x0B7F,
- 0x556B, 0x556B, 0x2B15, 0x556C, 0x556C, 0x127A, 0x556D, 0x556D, 0x1541,
- 0x556E, 0x556E, 0x0B59, 0x556F, 0x5574, 0x2B16, 0x5575, 0x5577, 0x1549,
- 0x5578, 0x5578, 0x0F70, 0x5579, 0x557A, 0x2B1C, 0x557B, 0x557B, 0x155A,
- 0x557C, 0x557C, 0x0E37, 0x557D, 0x557D, 0x2B1E, 0x557E, 0x557E, 0x1557,
- 0x557F, 0x557F, 0x2B1F, 0x5580, 0x5580, 0x0933, 0x5581, 0x5581, 0x1555,
- 0x5582, 0x5582, 0x0EC8, 0x5583, 0x5583, 0x1551, 0x5584, 0x5584, 0x0CFF,
- 0x5585, 0x5586, 0x2B20, 0x5587, 0x5587, 0x0999, 0x5588, 0x5588, 0x1554,
- 0x5589, 0x5589, 0x07A4, 0x558A, 0x558A, 0x0767, 0x558B, 0x558B, 0x154F,
- 0x558C, 0x558E, 0x2B22, 0x558F, 0x558F, 0x153E, 0x5590, 0x5590, 0x2B25,
- 0x5591, 0x5591, 0x1559, 0x5592, 0x5593, 0x2B26, 0x5594, 0x5594, 0x155E,
- 0x5595, 0x5597, 0x2B28, 0x5598, 0x5598, 0x0530, 0x5599, 0x5599, 0x155F,
- 0x559A, 0x559B, 0x2B2B, 0x559C, 0x559C, 0x0F1F, 0x559D, 0x559D, 0x077F,
- 0x559E, 0x559E, 0x2B2D, 0x559F, 0x559F, 0x1556, 0x55A0, 0x55A6, 0x2B2E,
- 0x55A7, 0x55A7, 0x0FC5, 0x55A8, 0x55A9, 0x2B35, 0x55AA, 0x55AA, 0x210B,
- 0x55AB, 0x55AB, 0x2B37, 0x55AC, 0x55AC, 0x20DE, 0x55AD, 0x55AD, 0x2B38,
- 0x55AE, 0x55AE, 0x1EAA, 0x55AF, 0x55B0, 0x2B39, 0x55B1, 0x55B1, 0x1552,
- 0x55B2, 0x55B2, 0x222C, 0x55B3, 0x55B3, 0x113E, 0x55B4, 0x55B4, 0x2B3B,
- 0x55B5, 0x55B5, 0x153F, 0x55B6, 0x55B6, 0x2B3C, 0x55B7, 0x55B7, 0x0BA8,
- 0x55B8, 0x55B8, 0x2B3D, 0x55B9, 0x55B9, 0x1553, 0x55BA, 0x55BA, 0x2B3E,
- 0x55BB, 0x55BB, 0x10DC, 0x55BC, 0x55BC, 0x2B3F, 0x55BD, 0x55BE, 0x155C,
- 0x55BF, 0x55C3, 0x2B40, 0x55C4, 0x55C4, 0x156A, 0x55C5, 0x55C5, 0x0FAC,
- 0x55C6, 0x55C6, 0x20D8, 0x55C7, 0x55C7, 0x22C0, 0x55C8, 0x55C8, 0x2B45,
- 0x55C9, 0x55C9, 0x1562, 0x55CA, 0x55CB, 0x2B46, 0x55CC, 0x55CD, 0x156F,
- 0x55CE, 0x55CE, 0x206F, 0x55CF, 0x55D0, 0x2B48, 0x55D1, 0x55D1, 0x1564,
- 0x55D2, 0x55D2, 0x1550, 0x55D3, 0x55D3, 0x0CDD, 0x55D4, 0x55D4, 0x1567,
- 0x55D5, 0x55D5, 0x2B4A, 0x55D6, 0x55D6, 0x1558, 0x55D7, 0x55D9, 0x2B4B,
- 0x55DA, 0x55DA, 0x21A1, 0x55DB, 0x55DB, 0x2B4E, 0x55DC, 0x55DC, 0x0D5F,
- 0x55DD, 0x55DD, 0x1569, 0x55DE, 0x55DE, 0x2B4F, 0x55DF, 0x55DF, 0x155B,
- 0x55E0, 0x55E0, 0x2B50, 0x55E1, 0x55E1, 0x0EDA, 0x55E2, 0x55E2, 0x2B51,
- 0x55E3, 0x55E3, 0x0DB8, 0x55E4, 0x55E4, 0x1573, 0x55E5, 0x55E5, 0x156C,
- 0x55E6, 0x55E6, 0x1568, 0x55E7, 0x55E7, 0x2B52, 0x55E8, 0x55E8, 0x1571,
- 0x55E9, 0x55E9, 0x2379, 0x55EA, 0x55EA, 0x1560, 0x55EB, 0x55EC, 0x1565,
- 0x55ED, 0x55EE, 0x2B53, 0x55EF, 0x55EF, 0x156B, 0x55F0, 0x55F1, 0x2B55,
- 0x55F2, 0x55F3, 0x156D, 0x55F4, 0x55F4, 0x2B57, 0x55F5, 0x55F5, 0x1572,
- 0x55F6, 0x55F6, 0x2372, 0x55F7, 0x55F7, 0x1561, 0x55F8, 0x55FC, 0x2B58,
- 0x55FD, 0x55FD, 0x0DC9, 0x55FE, 0x55FE, 0x157B, 0x55FF, 0x55FF, 0x2B5D,
- 0x5600, 0x5600, 0x157C, 0x5601, 0x5601, 0x1578, 0x5602, 0x5605, 0x2B5E,
- 0x5606, 0x5606, 0x216A, 0x5607, 0x5607, 0x2B62, 0x5608, 0x5608, 0x1576,
- 0x5609, 0x5609, 0x0841, 0x560A, 0x560B, 0x2B63, 0x560C, 0x560C, 0x1577,
- 0x560D, 0x560D, 0x237C, 0x560E, 0x560E, 0x06BD, 0x560F, 0x560F, 0x127B,
- 0x5610, 0x5613, 0x2B65, 0x5614, 0x5614, 0x20B0, 0x5615, 0x5615, 0x2B69,
- 0x5616, 0x5616, 0x237A, 0x5617, 0x5617, 0x1E74, 0x5618, 0x5618, 0x0FB5,
- 0x5619, 0x561A, 0x2B6A, 0x561B, 0x561B, 0x0A96, 0x561C, 0x561C, 0x2377,
- 0x561D, 0x561D, 0x2B6C, 0x561E, 0x561E, 0x1575, 0x561F, 0x561F, 0x1563,
- 0x5620, 0x5622, 0x2B6D, 0x5623, 0x5623, 0x157A, 0x5624, 0x5624, 0x1579,
- 0x5625, 0x5626, 0x2B70, 0x5627, 0x5627, 0x157D, 0x5628, 0x5628, 0x2B72,
- 0x5629, 0x5629, 0x1F4C, 0x562A, 0x562B, 0x2B73, 0x562C, 0x562C, 0x1582,
- 0x562D, 0x562D, 0x157E, 0x562E, 0x562E, 0x2378, 0x562F, 0x562F, 0x21CF,
- 0x5630, 0x5630, 0x2368, 0x5631, 0x5631, 0x11F5, 0x5632, 0x5632, 0x04D5,
- 0x5633, 0x5633, 0x2B75, 0x5634, 0x5634, 0x1249, 0x5635, 0x5635, 0x2371,
- 0x5636, 0x5636, 0x0DB0, 0x5637, 0x5637, 0x2B76, 0x5638, 0x5638, 0x2369,
- 0x5639, 0x5639, 0x1580, 0x563A, 0x563A, 0x2B77, 0x563B, 0x563B, 0x0F0A,
- 0x563C, 0x563E, 0x2B78, 0x563F, 0x563F, 0x0790, 0x5640, 0x5640, 0x2B7B,
- 0x5641, 0x5641, 0x2674, 0x5642, 0x564B, 0x2B7C, 0x564C, 0x564C, 0x1587,
- 0x564D, 0x564D, 0x1583, 0x564E, 0x564E, 0x1034, 0x564F, 0x5653, 0x2B86,
- 0x5654, 0x5654, 0x1588, 0x5655, 0x5656, 0x2B8B, 0x5657, 0x5657, 0x1581,
- 0x5658, 0x5658, 0x157F, 0x5659, 0x5659, 0x1585, 0x565A, 0x565B, 0x2B8D,
- 0x565C, 0x565C, 0x1586, 0x565D, 0x565D, 0x236F, 0x565E, 0x565F, 0x2B8F,
- 0x5660, 0x5660, 0x2370, 0x5661, 0x5661, 0x2B91, 0x5662, 0x5662, 0x1584,
- 0x5663, 0x5663, 0x2B92, 0x5664, 0x5664, 0x158A, 0x5665, 0x5665, 0x2376,
- 0x5666, 0x5666, 0x2373, 0x5667, 0x5667, 0x2B93, 0x5668, 0x5668, 0x0C16,
- 0x5669, 0x5669, 0x1262, 0x566A, 0x566A, 0x112E, 0x566B, 0x566B, 0x158C,
- 0x566C, 0x566C, 0x0D60, 0x566D, 0x566E, 0x2B94, 0x566F, 0x566F, 0x237F,
- 0x5670, 0x5670, 0x2B96, 0x5671, 0x5671, 0x158B, 0x5672, 0x5672, 0x2374,
- 0x5673, 0x5673, 0x2B97, 0x5674, 0x5674, 0x20B5, 0x5675, 0x5675, 0x2B98,
- 0x5676, 0x5676, 0x06BC, 0x5677, 0x5677, 0x2B99, 0x5678, 0x5678, 0x1EDB,
- 0x5679, 0x5679, 0x2672, 0x567A, 0x567A, 0x2B9A, 0x567B, 0x567C, 0x158D,
- 0x567D, 0x567F, 0x2B9B, 0x5680, 0x5680, 0x236E, 0x5681, 0x5684, 0x2B9E,
- 0x5685, 0x5685, 0x158F, 0x5686, 0x5686, 0x1589, 0x5687, 0x5687, 0x21B7,
- 0x5688, 0x568B, 0x2BA2, 0x568C, 0x568C, 0x2375, 0x568D, 0x568D, 0x2BA6,
- 0x568E, 0x568E, 0x0776, 0x568F, 0x568F, 0x0E3A, 0x5690, 0x5692, 0x2BA7,
- 0x5693, 0x5693, 0x1590, 0x5694, 0x5694, 0x2BAA, 0x5695, 0x5695, 0x2382,
- 0x5696, 0x5698, 0x2BAB, 0x5699, 0x5699, 0x209E, 0x569A, 0x56A2, 0x2BAE,
- 0x56A3, 0x56A3, 0x0F66, 0x56A4, 0x56A5, 0x2BB7, 0x56A6, 0x56A6, 0x236B,
- 0x56A7, 0x56A7, 0x2BB9, 0x56A8, 0x56A8, 0x2039, 0x56A9, 0x56AD, 0x2BBA,
- 0x56AE, 0x56AE, 0x269F, 0x56AF, 0x56AF, 0x1591, 0x56B0, 0x56B2, 0x2BBF,
- 0x56B3, 0x56B3, 0x237D, 0x56B4, 0x56B4, 0x21F5, 0x56B5, 0x56B5, 0x2BC2,
- 0x56B6, 0x56B6, 0x2381, 0x56B7, 0x56B7, 0x0C9D, 0x56B8, 0x56BB, 0x2BC3,
- 0x56BC, 0x56BC, 0x0891, 0x56BD, 0x56BF, 0x2BC7, 0x56C0, 0x56C0, 0x237B,
- 0x56C1, 0x56C1, 0x237E, 0x56C2, 0x56C2, 0x21CC, 0x56C3, 0x56C4, 0x2BCA,
- 0x56C5, 0x56C5, 0x22DB, 0x56C6, 0x56C7, 0x2BCC, 0x56C8, 0x56C8, 0x236A,
- 0x56C9, 0x56C9, 0x2689, 0x56CA, 0x56CA, 0x0B35, 0x56CB, 0x56CB, 0x2BCE,
- 0x56CC, 0x56CC, 0x2697, 0x56CD, 0x56D0, 0x2BCF, 0x56D1, 0x56D1, 0x22A1,
- 0x56D2, 0x56D3, 0x2BD3, 0x56D4, 0x56D4, 0x1592, 0x56D5, 0x56D6, 0x2BD5,
- 0x56D7, 0x56D7, 0x1593, 0x56D8, 0x56D9, 0x2BD7, 0x56DA, 0x56DA, 0x0C71,
- 0x56DB, 0x56DB, 0x0DB9, 0x56DC, 0x56DC, 0x2BD9, 0x56DD, 0x56DD, 0x1594,
- 0x56DE, 0x56DE, 0x07ED, 0x56DF, 0x56DF, 0x126C, 0x56E0, 0x56E0, 0x1079,
- 0x56E1, 0x56E1, 0x1595, 0x56E2, 0x56E2, 0x0E76, 0x56E3, 0x56E3, 0x2BDA,
- 0x56E4, 0x56E4, 0x0619, 0x56E5, 0x56EA, 0x2BDB, 0x56EB, 0x56EB, 0x1597,
- 0x56EC, 0x56EC, 0x2BE1, 0x56ED, 0x56ED, 0x10F3, 0x56EE, 0x56EF, 0x2BE2,
- 0x56F0, 0x56F0, 0x0992, 0x56F1, 0x56F1, 0x0554, 0x56F2, 0x56F3, 0x2BE4,
- 0x56F4, 0x56F4, 0x0EB6, 0x56F5, 0x56F5, 0x1596, 0x56F6, 0x56F8, 0x2BE6,
- 0x56F9, 0x56F9, 0x1598, 0x56FA, 0x56FA, 0x0725, 0x56FB, 0x56FC, 0x2BE9,
- 0x56FD, 0x56FD, 0x0753, 0x56FE, 0x56FE, 0x0E6D, 0x56FF, 0x56FF, 0x1599,
- 0x5700, 0x5702, 0x2BEB, 0x5703, 0x5703, 0x0BF3, 0x5704, 0x5704, 0x159A,
- 0x5705, 0x5705, 0x2BEE, 0x5706, 0x5706, 0x10F5, 0x5707, 0x5707, 0x2383,
- 0x5708, 0x5708, 0x0C81, 0x5709, 0x5709, 0x159C, 0x570A, 0x570A, 0x159B,
- 0x570B, 0x570B, 0x1F3D, 0x570C, 0x570C, 0x2BEF, 0x570D, 0x570D, 0x218F,
- 0x570E, 0x5711, 0x2BF0, 0x5712, 0x5712, 0x2246, 0x5713, 0x5713, 0x2248,
- 0x5714, 0x5715, 0x2BF4, 0x5716, 0x5716, 0x217E, 0x5717, 0x5717, 0x2BF6,
- 0x5718, 0x5718, 0x2180, 0x5719, 0x571B, 0x2BF7, 0x571C, 0x571C, 0x159D,
- 0x571D, 0x571E, 0x2BFA, 0x571F, 0x571F, 0x0E72, 0x5720, 0x5722, 0x2BFC,
- 0x5723, 0x5723, 0x0D3C, 0x5724, 0x5727, 0x2BFF, 0x5728, 0x5728, 0x111D,
- 0x5729, 0x5729, 0x13A7, 0x572A, 0x572A, 0x13A9, 0x572B, 0x572B, 0x2C03,
- 0x572C, 0x572C, 0x13A8, 0x572D, 0x572D, 0x0740, 0x572E, 0x572F, 0x13AC,
- 0x5730, 0x5730, 0x05B9, 0x5731, 0x5732, 0x2C04, 0x5733, 0x5733, 0x13AA,
- 0x5734, 0x5738, 0x2C06, 0x5739, 0x5739, 0x13AB, 0x573A, 0x573A, 0x04C6,
- 0x573B, 0x573B, 0x13AF, 0x573C, 0x573D, 0x2C0B, 0x573E, 0x573E, 0x080D,
- 0x573F, 0x573F, 0x2C0D, 0x5740, 0x5740, 0x11B6, 0x5741, 0x5741, 0x2C0E,
- 0x5742, 0x5742, 0x13B0, 0x5743, 0x5746, 0x2C0F, 0x5747, 0x5747, 0x0928,
- 0x5748, 0x5749, 0x2C13, 0x574A, 0x574A, 0x0658, 0x574B, 0x574B, 0x2C15,
- 0x574C, 0x574C, 0x13A0, 0x574D, 0x574D, 0x0E01, 0x574E, 0x574E, 0x093F,
- 0x574F, 0x574F, 0x07CA, 0x5750, 0x5750, 0x1255, 0x5751, 0x5751, 0x0960,
- 0x5752, 0x5756, 0x2C16, 0x5757, 0x5757, 0x0976, 0x5758, 0x5759, 0x2C1B,
- 0x575A, 0x575A, 0x0854, 0x575B, 0x575B, 0x0E06, 0x575C, 0x575C, 0x13AE,
- 0x575D, 0x575D, 0x03DE, 0x575E, 0x575E, 0x0EFA, 0x575F, 0x575F, 0x0675,
- 0x5760, 0x5760, 0x1216, 0x5761, 0x5761, 0x0BE1, 0x5762, 0x5763, 0x2C1D,
- 0x5764, 0x5764, 0x098F, 0x5765, 0x5765, 0x2C1F, 0x5766, 0x5766, 0x0E0C,
- 0x5767, 0x5767, 0x2C20, 0x5768, 0x5768, 0x13B7, 0x5769, 0x5769, 0x13B1,
- 0x576A, 0x576A, 0x0BD9, 0x576B, 0x576B, 0x13B3, 0x576C, 0x576C, 0x2C21,
- 0x576D, 0x576D, 0x13B8, 0x576E, 0x576E, 0x2C22, 0x576F, 0x576F, 0x0BB8,
- 0x5770, 0x5772, 0x2C23, 0x5773, 0x5773, 0x13BA, 0x5774, 0x5775, 0x2C26,
- 0x5776, 0x5776, 0x13B9, 0x5777, 0x5777, 0x094D, 0x5778, 0x577A, 0x2C28,
- 0x577B, 0x577B, 0x13B6, 0x577C, 0x577C, 0x13B5, 0x577D, 0x5781, 0x2C2B,
- 0x5782, 0x5782, 0x053C, 0x5783, 0x5783, 0x0997, 0x5784, 0x5784, 0x0A49,
- 0x5785, 0x5785, 0x13B2, 0x5786, 0x5786, 0x13B4, 0x5787, 0x578A, 0x2C30,
- 0x578B, 0x578B, 0x0F98, 0x578C, 0x578C, 0x13BD, 0x578D, 0x5791, 0x2C34,
- 0x5792, 0x5792, 0x09C8, 0x5793, 0x5793, 0x13C2, 0x5794, 0x579A, 0x2C39,
- 0x579B, 0x579B, 0x0621, 0x579C, 0x579F, 0x2C40, 0x57A0, 0x57A0, 0x13C3,
- 0x57A1, 0x57A1, 0x13A2, 0x57A2, 0x57A2, 0x0711, 0x57A3, 0x57A3, 0x10EE,
- 0x57A4, 0x57A4, 0x13BC, 0x57A5, 0x57A5, 0x2C44, 0x57A6, 0x57A6, 0x095E,
- 0x57A7, 0x57A7, 0x13C0, 0x57A8, 0x57A8, 0x2C45, 0x57A9, 0x57A9, 0x13A1,
- 0x57AA, 0x57AA, 0x2C46, 0x57AB, 0x57AB, 0x05C7, 0x57AC, 0x57AC, 0x2C47,
- 0x57AD, 0x57AD, 0x13BB, 0x57AE, 0x57AE, 0x0972, 0x57AF, 0x57B1, 0x2C48,
- 0x57B2, 0x57B2, 0x13BE, 0x57B3, 0x57B3, 0x2C4B, 0x57B4, 0x57B4, 0x13C1,
- 0x57B5, 0x57B7, 0x2C4C, 0x57B8, 0x57B8, 0x13C9, 0x57B9, 0x57C1, 0x2C4F,
- 0x57C2, 0x57C2, 0x06FA, 0x57C3, 0x57C3, 0x03AE, 0x57C4, 0x57CA, 0x2C58,
- 0x57CB, 0x57CB, 0x0A98, 0x57CC, 0x57CD, 0x2C5F, 0x57CE, 0x57CE, 0x04EC,
- 0x57CF, 0x57CF, 0x13BF, 0x57D0, 0x57D1, 0x2C61, 0x57D2, 0x57D2, 0x13C8,
- 0x57D3, 0x57D3, 0x2C63, 0x57D4, 0x57D4, 0x0BF1, 0x57D5, 0x57D5, 0x13C4,
- 0x57D6, 0x57D7, 0x2C64, 0x57D8, 0x57D8, 0x13C5, 0x57D9, 0x57D9, 0x13C7,
- 0x57DA, 0x57DA, 0x13C6, 0x57DB, 0x57DC, 0x2C66, 0x57DD, 0x57DD, 0x13CE,
- 0x57DE, 0x57DE, 0x2C68, 0x57DF, 0x57DF, 0x10D7, 0x57E0, 0x57E0, 0x0481,
- 0x57E1, 0x57E1, 0x232A, 0x57E2, 0x57E3, 0x2C69, 0x57E4, 0x57E4, 0x13CD,
- 0x57E5, 0x57EC, 0x2C6B, 0x57ED, 0x57ED, 0x13D2, 0x57EE, 0x57EE, 0x2C73,
- 0x57EF, 0x57EF, 0x13CB, 0x57F0, 0x57F3, 0x2C74, 0x57F4, 0x57F4, 0x13CA,
- 0x57F5, 0x57F6, 0x2C78, 0x57F7, 0x57F7, 0x228B, 0x57F8, 0x57F8, 0x13CC,
- 0x57F9, 0x57F9, 0x0BA1, 0x57FA, 0x57FA, 0x080E, 0x57FB, 0x57FC, 0x2C7A,
- 0x57FD, 0x57FD, 0x13D1, 0x57FE, 0x57FF, 0x2C7C, 0x5800, 0x5800, 0x13D3,
- 0x5801, 0x5801, 0x2C7E, 0x5802, 0x5802, 0x0E16, 0x5803, 0x5804, 0x2C7F,
- 0x5805, 0x5805, 0x1F85, 0x5806, 0x5806, 0x0610, 0x5807, 0x5807, 0x144C,
- 0x5808, 0x5809, 0x2C81, 0x580A, 0x580A, 0x2325, 0x580B, 0x580B, 0x13CF,
- 0x580C, 0x580C, 0x2C83, 0x580D, 0x580D, 0x13D0, 0x580E, 0x5810, 0x2C84,
- 0x5811, 0x5811, 0x0C32, 0x5812, 0x5814, 0x2C87, 0x5815, 0x5815, 0x0628,
- 0x5816, 0x5816, 0x232C, 0x5817, 0x5818, 0x2C8A, 0x5819, 0x5819, 0x13D5,
- 0x581A, 0x581C, 0x2C8C, 0x581D, 0x581D, 0x232E, 0x581E, 0x581E, 0x13D4,
- 0x581F, 0x581F, 0x2C8F, 0x5820, 0x5820, 0x13D7, 0x5821, 0x5821, 0x040D,
- 0x5822, 0x5823, 0x2C90, 0x5824, 0x5824, 0x05AD, 0x5825, 0x5829, 0x2C92,
- 0x582A, 0x582A, 0x093D, 0x582B, 0x582E, 0x2C97, 0x582F, 0x582F, 0x2205,
- 0x5830, 0x5830, 0x1008, 0x5831, 0x5831, 0x1E38, 0x5832, 0x5833, 0x2C9B,
- 0x5834, 0x5834, 0x1E73, 0x5835, 0x5835, 0x0601, 0x5836, 0x5843, 0x2C9D,
- 0x5844, 0x5844, 0x13D6, 0x5845, 0x5849, 0x2CAB, 0x584A, 0x584A, 0x1FE3,
- 0x584B, 0x584B, 0x2339, 0x584C, 0x584C, 0x0DEF, 0x584D, 0x584D, 0x19A3,
- 0x584E, 0x584E, 0x2CB0, 0x584F, 0x584F, 0x232B, 0x5850, 0x5850, 0x2CB1,
- 0x5851, 0x5851, 0x0DD1, 0x5852, 0x5852, 0x232D, 0x5853, 0x5853, 0x2CB2,
- 0x5854, 0x5854, 0x0DF3, 0x5855, 0x5856, 0x2CB3, 0x5857, 0x5857, 0x217F,
- 0x5858, 0x5858, 0x0E14, 0x5859, 0x585D, 0x2CB5, 0x585E, 0x585E, 0x0CD6,
- 0x585F, 0x5861, 0x2CBA, 0x5862, 0x5862, 0x21A7, 0x5863, 0x5863, 0x2CBD,
- 0x5864, 0x5864, 0x232F, 0x5865, 0x5865, 0x13D8, 0x5866, 0x586A, 0x2CBE,
- 0x586B, 0x586B, 0x0E41, 0x586C, 0x586C, 0x13D9, 0x586D, 0x5874, 0x2CC3,
- 0x5875, 0x5875, 0x1E7D, 0x5876, 0x5878, 0x2CCB, 0x5879, 0x5879, 0x20D6,
- 0x587A, 0x587D, 0x2CCE, 0x587E, 0x587E, 0x13A3, 0x587F, 0x587F, 0x2CD2,
- 0x5880, 0x5880, 0x13DD, 0x5881, 0x5881, 0x13DA, 0x5882, 0x5882, 0x2CD3,
- 0x5883, 0x5883, 0x08E2, 0x5884, 0x5884, 0x2CD4, 0x5885, 0x5885, 0x0D92,
- 0x5886, 0x5888, 0x2CD5, 0x5889, 0x5889, 0x13DB, 0x588A, 0x588A, 0x1EC2,
- 0x588B, 0x5891, 0x2CD8, 0x5892, 0x5892, 0x0D03, 0x5893, 0x5893, 0x0B1C,
- 0x5894, 0x5898, 0x2CDF, 0x5899, 0x5899, 0x0C3A, 0x589A, 0x589A, 0x13DC,
- 0x589B, 0x589B, 0x2CE4, 0x589C, 0x589C, 0x22B2, 0x589D, 0x589D, 0x2CE5,
- 0x589E, 0x589E, 0x1139, 0x589F, 0x589F, 0x0FB1, 0x58A0, 0x58A7, 0x2CE6,
- 0x58A8, 0x58A8, 0x0B0E, 0x58A9, 0x58A9, 0x0614, 0x58AA, 0x58AD, 0x2CEE,
- 0x58AE, 0x58AE, 0x1EDF, 0x58AF, 0x58B2, 0x2CF2, 0x58B3, 0x58B3, 0x1EF9,
- 0x58B4, 0x58BA, 0x2CF6, 0x58BB, 0x58BB, 0x20D9, 0x58BC, 0x58BC, 0x13A4,
- 0x58BD, 0x58BD, 0x2CFD, 0x58BE, 0x58BE, 0x1FDD, 0x58BF, 0x58C0, 0x2CFE,
- 0x58C1, 0x58C1, 0x0443, 0x58C2, 0x58C4, 0x2D00, 0x58C5, 0x58C5, 0x13A5,
- 0x58C6, 0x58C6, 0x2D03, 0x58C7, 0x58C7, 0x2167, 0x58C8, 0x58D0, 0x2D04,
- 0x58D1, 0x58D1, 0x13A6, 0x58D2, 0x58D2, 0x2D0D, 0x58D3, 0x58D3, 0x21ED,
- 0x58D4, 0x58D4, 0x2D0E, 0x58D5, 0x58D5, 0x0775, 0x58D6, 0x58D7, 0x2D0F,
- 0x58D8, 0x58D8, 0x2007, 0x58D9, 0x58D9, 0x2326, 0x58DA, 0x58DA, 0x2329,
- 0x58DB, 0x58DD, 0x2D11, 0x58DE, 0x58DE, 0x1F52, 0x58DF, 0x58DF, 0x203B,
- 0x58E0, 0x58E0, 0x2328, 0x58E1, 0x58E1, 0x2D14, 0x58E2, 0x58E2, 0x2327,
- 0x58E3, 0x58E3, 0x2D15, 0x58E4, 0x58E4, 0x0C9B, 0x58E5, 0x58E8, 0x2D16,
- 0x58E9, 0x58E9, 0x1E2B, 0x58EA, 0x58EA, 0x2D1A, 0x58EB, 0x58EB, 0x0D56,
- 0x58EC, 0x58EC, 0x0CA4, 0x58ED, 0x58ED, 0x2D1B, 0x58EE, 0x58EE, 0x1210,
- 0x58EF, 0x58EF, 0x22AE, 0x58F0, 0x58F0, 0x0D32, 0x58F1, 0x58F2, 0x2D1C,
- 0x58F3, 0x58F3, 0x0954, 0x58F4, 0x58F5, 0x2D1E, 0x58F6, 0x58F6, 0x07AF,
- 0x58F7, 0x58F8, 0x2D20, 0x58F9, 0x58F9, 0x1043, 0x58FA, 0x58FA, 0x1F49,
- 0x58FB, 0x58FC, 0x2D22, 0x58FD, 0x58FD, 0x2138, 0x58FE, 0x58FF, 0x2D24,
- 0x5900, 0x5901, 0x2D26, 0x5902, 0x5902, 0x161C, 0x5903, 0x5903, 0x2D28,
- 0x5904, 0x5904, 0x0529, 0x5905, 0x5906, 0x2D29, 0x5907, 0x5907, 0x0421,
- 0x5908, 0x590C, 0x2D2B, 0x590D, 0x590D, 0x06AF, 0x590E, 0x590E, 0x2D30,
- 0x590F, 0x590F, 0x0F31, 0x5910, 0x5913, 0x2D31, 0x5914, 0x5914, 0x12FB,
- 0x5915, 0x5915, 0x0F13, 0x5916, 0x5916, 0x0E93, 0x5917, 0x5918, 0x2D35,
- 0x5919, 0x5919, 0x1301, 0x591A, 0x591A, 0x061F, 0x591B, 0x591B, 0x2D37,
- 0x591C, 0x591C, 0x1040, 0x591D, 0x591E, 0x2D38, 0x591F, 0x591F, 0x0714,
- 0x5920, 0x5921, 0x2D3A, 0x5922, 0x5922, 0x2081, 0x5923, 0x5923, 0x2D3C,
- 0x5924, 0x5924, 0x161B, 0x5925, 0x5925, 0x1619, 0x5926, 0x5926, 0x2D3D,
- 0x5927, 0x5927, 0x0576, 0x5928, 0x5928, 0x2D3E, 0x5929, 0x5929, 0x0E3F,
- 0x592A, 0x592A, 0x0DFE, 0x592B, 0x592B, 0x068F, 0x592C, 0x592C, 0x2D3F,
- 0x592D, 0x592D, 0x1268, 0x592E, 0x592E, 0x1014, 0x592F, 0x592F, 0x0772,
- 0x5930, 0x5930, 0x2D40, 0x5931, 0x5931, 0x0D3E, 0x5932, 0x5933, 0x2D41,
- 0x5934, 0x5934, 0x0E68, 0x5935, 0x5936, 0x2D43, 0x5937, 0x5937, 0x104B,
- 0x5938, 0x5938, 0x0971, 0x5939, 0x5939, 0x0843, 0x593A, 0x593A, 0x0620,
- 0x593B, 0x593B, 0x2D45, 0x593C, 0x593C, 0x14AF, 0x593D, 0x593D, 0x2D46,
- 0x593E, 0x593E, 0x1F7C, 0x593F, 0x5940, 0x2D47, 0x5941, 0x5941, 0x14B0,
- 0x5942, 0x5942, 0x138C, 0x5943, 0x5943, 0x2D49, 0x5944, 0x5944, 0x1002,
- 0x5945, 0x5946, 0x2D4A, 0x5947, 0x5947, 0x0C05, 0x5948, 0x5948, 0x0B31,
- 0x5949, 0x5949, 0x068B, 0x594A, 0x594A, 0x2D4C, 0x594B, 0x594B, 0x0679,
- 0x594C, 0x594D, 0x2D4D, 0x594E, 0x594E, 0x0989, 0x594F, 0x594F, 0x123D,
- 0x5950, 0x5950, 0x2D4F, 0x5951, 0x5951, 0x0C14, 0x5952, 0x5953, 0x2D50,
- 0x5954, 0x5954, 0x0425, 0x5955, 0x5955, 0x14B2, 0x5956, 0x5956, 0x0882,
- 0x5957, 0x5957, 0x0E2A, 0x5958, 0x5958, 0x14B4, 0x5959, 0x5959, 0x2D52,
- 0x595A, 0x595A, 0x14B3, 0x595B, 0x595F, 0x2D53, 0x5960, 0x5960, 0x05CD,
- 0x5961, 0x5961, 0x2D58, 0x5962, 0x5962, 0x0D16, 0x5963, 0x5964, 0x2D59,
- 0x5965, 0x5965, 0x03CD, 0x5966, 0x5968, 0x2D5B, 0x5969, 0x5969, 0x235B,
- 0x596A, 0x596A, 0x1EDE, 0x596B, 0x596B, 0x2D5E, 0x596C, 0x596C, 0x1FA2,
- 0x596D, 0x596D, 0x2D5F, 0x596E, 0x596E, 0x1EFA, 0x596F, 0x5972, 0x2D60,
- 0x5973, 0x5973, 0x0B6F, 0x5974, 0x5974, 0x0B6C, 0x5975, 0x5975, 0x2D64,
- 0x5976, 0x5976, 0x0B2F, 0x5977, 0x5977, 0x2D65, 0x5978, 0x5978, 0x085C,
- 0x5979, 0x5979, 0x0DF2, 0x597A, 0x597C, 0x2D66, 0x597D, 0x597D, 0x077A,
- 0x597E, 0x5980, 0x2D69, 0x5981, 0x5981, 0x1775, 0x5982, 0x5982, 0x0CC2,
- 0x5983, 0x5983, 0x1776, 0x5984, 0x5984, 0x0EAE, 0x5985, 0x5985, 0x2D6C,
- 0x5986, 0x5986, 0x120E, 0x5987, 0x5987, 0x06B9, 0x5988, 0x5988, 0x0A8F,
- 0x5989, 0x5989, 0x2D6D, 0x598A, 0x598A, 0x0CAC, 0x598B, 0x598C, 0x2D6E,
- 0x598D, 0x598D, 0x1777, 0x598E, 0x5991, 0x2D70, 0x5992, 0x5992, 0x0609,
- 0x5993, 0x5993, 0x083E, 0x5994, 0x5995, 0x2D74, 0x5996, 0x5996, 0x1026,
- 0x5997, 0x5997, 0x177B, 0x5998, 0x5998, 0x2D76, 0x5999, 0x5999, 0x0AF3,
- 0x599A, 0x599C, 0x2D77, 0x599D, 0x599D, 0x22AD, 0x599E, 0x599E, 0x177E,
- 0x599F, 0x59A2, 0x2D7A, 0x59A3, 0x59A3, 0x177A, 0x59A4, 0x59A4, 0x177F,
- 0x59A5, 0x59A5, 0x0E88, 0x59A6, 0x59A7, 0x2D7E, 0x59A8, 0x59A8, 0x065E,
- 0x59A9, 0x59AA, 0x1778, 0x59AB, 0x59AB, 0x177D, 0x59AC, 0x59AD, 0x2D80,
- 0x59AE, 0x59AE, 0x0B40, 0x59AF, 0x59AF, 0x1782, 0x59B0, 0x59B1, 0x2D82,
- 0x59B2, 0x59B2, 0x1781, 0x59B3, 0x59B8, 0x2D84, 0x59B9, 0x59B9, 0x0AC8,
- 0x59BA, 0x59BA, 0x2D8A, 0x59BB, 0x59BB, 0x0BFD, 0x59BC, 0x59BD, 0x2D8B,
- 0x59BE, 0x59BE, 0x1784, 0x59BF, 0x59C5, 0x2D8D, 0x59C6, 0x59C6, 0x0B1A,
- 0x59C7, 0x59C9, 0x2D94, 0x59CA, 0x59CA, 0x177C, 0x59CB, 0x59CB, 0x0D53,
- 0x59CC, 0x59CF, 0x2D97, 0x59D0, 0x59D0, 0x08B4, 0x59D1, 0x59D1, 0x071C,
- 0x59D2, 0x59D2, 0x1780, 0x59D3, 0x59D3, 0x0FA0, 0x59D4, 0x59D4, 0x0EBE,
- 0x59D5, 0x59D6, 0x2D9B, 0x59D7, 0x59D7, 0x1783, 0x59D8, 0x59D8, 0x178A,
- 0x59D9, 0x59D9, 0x2D9D, 0x59DA, 0x59DA, 0x102D, 0x59DB, 0x59DB, 0x2D9E,
- 0x59DC, 0x59DC, 0x087B, 0x59DD, 0x59DD, 0x1787, 0x59DE, 0x59E2, 0x2D9F,
- 0x59E3, 0x59E3, 0x1789, 0x59E4, 0x59E4, 0x2DA4, 0x59E5, 0x59E5, 0x09BC,
- 0x59E6, 0x59E7, 0x2DA5, 0x59E8, 0x59E8, 0x1053, 0x59E9, 0x59EB, 0x2DA7,
- 0x59EC, 0x59EC, 0x081A, 0x59ED, 0x59F8, 0x2DAA, 0x59F9, 0x59F9, 0x178B,
- 0x59FA, 0x59FA, 0x2DB6, 0x59FB, 0x59FB, 0x107D, 0x59FC, 0x59FE, 0x2DB7,
- 0x59FF, 0x59FF, 0x1228, 0x5A00, 0x5A00, 0x2DBA, 0x5A01, 0x5A01, 0x0EAF,
- 0x5A02, 0x5A02, 0x2DBB, 0x5A03, 0x5A03, 0x0E8F, 0x5A04, 0x5A04, 0x0A4D,
- 0x5A05, 0x5A06, 0x1785, 0x5A07, 0x5A07, 0x0890, 0x5A08, 0x5A08, 0x1788,
- 0x5A09, 0x5A09, 0x178D, 0x5A0A, 0x5A0B, 0x2DBC, 0x5A0C, 0x5A0C, 0x178C,
- 0x5A0D, 0x5A10, 0x2DBE, 0x5A11, 0x5A11, 0x1790, 0x5A12, 0x5A12, 0x2DC2,
- 0x5A13, 0x5A13, 0x1792, 0x5A14, 0x5A17, 0x2DC3, 0x5A18, 0x5A18, 0x0B52,
- 0x5A19, 0x5A1B, 0x2DC7, 0x5A1C, 0x5A1C, 0x0B2B, 0x5A1D, 0x5A1E, 0x2DCA,
- 0x5A1F, 0x5A1F, 0x0919, 0x5A20, 0x5A20, 0x0D28, 0x5A21, 0x5A22, 0x2DCC,
- 0x5A23, 0x5A23, 0x1791, 0x5A24, 0x5A24, 0x2DCE, 0x5A25, 0x5A25, 0x062F,
- 0x5A26, 0x5A28, 0x2DCF, 0x5A29, 0x5A29, 0x0AE9, 0x5A2A, 0x5A30, 0x2DD2,
- 0x5A31, 0x5A31, 0x10CE, 0x5A32, 0x5A32, 0x178E, 0x5A33, 0x5A33, 0x2DD9,
- 0x5A34, 0x5A34, 0x178F, 0x5A35, 0x5A35, 0x2DDA, 0x5A36, 0x5A36, 0x0C7D,
- 0x5A37, 0x5A3B, 0x2DDB, 0x5A3C, 0x5A3C, 0x1797, 0x5A3D, 0x5A3F, 0x2DE0,
- 0x5A40, 0x5A40, 0x1793, 0x5A41, 0x5A41, 0x203F, 0x5A42, 0x5A45, 0x2DE3,
- 0x5A46, 0x5A46, 0x0BE4, 0x5A47, 0x5A48, 0x2DE7, 0x5A49, 0x5A49, 0x0EA2,
- 0x5A4A, 0x5A4A, 0x1795, 0x5A4B, 0x5A54, 0x2DE9, 0x5A55, 0x5A55, 0x1796,
- 0x5A56, 0x5A59, 0x2DF3, 0x5A5A, 0x5A5A, 0x07FE, 0x5A5B, 0x5A61, 0x2DF7,
- 0x5A62, 0x5A62, 0x1798, 0x5A63, 0x5A65, 0x2DFE, 0x5A66, 0x5A66, 0x1F0E,
- 0x5A67, 0x5A67, 0x1794, 0x5A68, 0x5A69, 0x2E01, 0x5A6A, 0x5A6A, 0x09A2,
- 0x5A6B, 0x5A6C, 0x2E03, 0x5A6D, 0x5A6D, 0x23F9, 0x5A6E, 0x5A73, 0x2E05,
- 0x5A74, 0x5A74, 0x1089, 0x5A75, 0x5A75, 0x1799, 0x5A76, 0x5A76, 0x0D2D,
- 0x5A77, 0x5A77, 0x179D, 0x5A78, 0x5A79, 0x2E0B, 0x5A7A, 0x5A7A, 0x179E,
- 0x5A7B, 0x5A7E, 0x2E0D, 0x5A7F, 0x5A7F, 0x0FC1, 0x5A80, 0x5A91, 0x2E11,
- 0x5A92, 0x5A92, 0x0AC2, 0x5A93, 0x5A99, 0x2E23, 0x5A9A, 0x5A9A, 0x0AC9,
- 0x5A9B, 0x5A9B, 0x179C, 0x5A9C, 0x5AA6, 0x2E2A, 0x5AA7, 0x5AA7, 0x23FC,
- 0x5AA8, 0x5AA9, 0x2E35, 0x5AAA, 0x5AAA, 0x179B, 0x5AAB, 0x5AB1, 0x2E37,
- 0x5AB2, 0x5AB2, 0x17A1, 0x5AB3, 0x5AB3, 0x0F1E, 0x5AB4, 0x5AB4, 0x2E3E,
- 0x5AB5, 0x5AB5, 0x19A4, 0x5AB6, 0x5AB7, 0x2E3F, 0x5AB8, 0x5AB8, 0x17A4,
- 0x5AB9, 0x5ABC, 0x2E41, 0x5ABD, 0x5ABD, 0x2069, 0x5ABE, 0x5ABE, 0x179F,
- 0x5ABF, 0x5AC0, 0x2E45, 0x5AC1, 0x5AC1, 0x0851, 0x5AC2, 0x5AC2, 0x0CE2,
- 0x5AC3, 0x5AC8, 0x2E47, 0x5AC9, 0x5AC9, 0x0828, 0x5ACA, 0x5ACB, 0x2E4D,
- 0x5ACC, 0x5ACC, 0x0F40, 0x5ACD, 0x5AD1, 0x2E4F, 0x5AD2, 0x5AD2, 0x17A2,
- 0x5AD3, 0x5AD3, 0x2E54, 0x5AD4, 0x5AD4, 0x17A3, 0x5AD5, 0x5AD5, 0x2E55,
- 0x5AD6, 0x5AD6, 0x17A8, 0x5AD7, 0x5AD7, 0x23F7, 0x5AD8, 0x5AD8, 0x17AA,
- 0x5AD9, 0x5ADB, 0x2E56, 0x5ADC, 0x5ADC, 0x17AB, 0x5ADD, 0x5ADF, 0x2E59,
- 0x5AE0, 0x5AE0, 0x17A5, 0x5AE1, 0x5AE1, 0x05B6, 0x5AE2, 0x5AE2, 0x2E5C,
- 0x5AE3, 0x5AE3, 0x17A6, 0x5AE4, 0x5AE5, 0x2E5D, 0x5AE6, 0x5AE6, 0x17A9,
- 0x5AE7, 0x5AE8, 0x2E5F, 0x5AE9, 0x5AE9, 0x0B3E, 0x5AEA, 0x5AEA, 0x2E61,
- 0x5AEB, 0x5AEB, 0x17A0, 0x5AEC, 0x5AF0, 0x2E62, 0x5AF1, 0x5AF1, 0x17A7,
- 0x5AF2, 0x5AF4, 0x2E67, 0x5AF5, 0x5AF5, 0x23F6, 0x5AF6, 0x5AFA, 0x2E6A,
- 0x5AFB, 0x5AFB, 0x23FD, 0x5AFC, 0x5AFF, 0x2E6F, 0x5B00, 0x5B00, 0x23F8,
- 0x5B01, 0x5B07, 0x2E73, 0x5B08, 0x5B08, 0x23FA, 0x5B09, 0x5B09, 0x17AC,
- 0x5B0A, 0x5B0A, 0x2E7A, 0x5B0B, 0x5B0B, 0x23FE, 0x5B0C, 0x5B0C, 0x1FA8,
- 0x5B0D, 0x5B15, 0x2E7B, 0x5B16, 0x5B16, 0x17AE, 0x5B17, 0x5B17, 0x17AD,
- 0x5B18, 0x5B18, 0x2E84, 0x5B19, 0x5B19, 0x2401, 0x5B1A, 0x5B20, 0x2E85,
- 0x5B21, 0x5B21, 0x23FF, 0x5B22, 0x5B29, 0x2E8C, 0x5B2A, 0x5B2A, 0x2400,
- 0x5B2B, 0x5B2F, 0x2E94, 0x5B30, 0x5B30, 0x2221, 0x5B31, 0x5B31, 0x2E99,
- 0x5B32, 0x5B32, 0x17AF, 0x5B33, 0x5B33, 0x2E9A, 0x5B34, 0x5B34, 0x130C,
- 0x5B35, 0x5B36, 0x2E9B, 0x5B37, 0x5B37, 0x17B0, 0x5B38, 0x5B38, 0x2122,
- 0x5B39, 0x5B3F, 0x2E9D, 0x5B40, 0x5B40, 0x17B1, 0x5B41, 0x5B4B, 0x2EA4,
- 0x5B4C, 0x5B4C, 0x23FB, 0x5B4D, 0x5B4F, 0x2EAF, 0x5B50, 0x5B50, 0x1230,
- 0x5B51, 0x5B51, 0x17B7, 0x5B52, 0x5B52, 0x2EB2, 0x5B53, 0x5B53, 0x17B8,
- 0x5B54, 0x5B54, 0x0964, 0x5B55, 0x5B55, 0x1113, 0x5B56, 0x5B56, 0x2EB3,
- 0x5B57, 0x5B57, 0x1233, 0x5B58, 0x5B58, 0x0569, 0x5B59, 0x5B59, 0x0DE4,
- 0x5B5A, 0x5B5A, 0x17B4, 0x5B5B, 0x5B5B, 0x1279, 0x5B5C, 0x5B5C, 0x122B,
- 0x5B5D, 0x5B5D, 0x0F6D, 0x5B5E, 0x5B5E, 0x2EB4, 0x5B5F, 0x5B5F, 0x0AD4,
- 0x5B60, 0x5B61, 0x2EB5, 0x5B62, 0x5B62, 0x17B9, 0x5B63, 0x5B63, 0x0831,
- 0x5B64, 0x5B64, 0x071B, 0x5B65, 0x5B65, 0x17B5, 0x5B66, 0x5B66, 0x0FD0,
- 0x5B67, 0x5B68, 0x2EB7, 0x5B69, 0x5B69, 0x0759, 0x5B6A, 0x5B6A, 0x0A76,
- 0x5B6B, 0x5B6B, 0x215A, 0x5B6C, 0x5B6C, 0x1261, 0x5B6D, 0x5B6F, 0x2EB9,
- 0x5B70, 0x5B70, 0x0D82, 0x5B71, 0x5B71, 0x176A, 0x5B72, 0x5B72, 0x2EBC,
- 0x5B73, 0x5B73, 0x17B6, 0x5B74, 0x5B74, 0x2EBD, 0x5B75, 0x5B75, 0x0692,
- 0x5B76, 0x5B77, 0x2EBE, 0x5B78, 0x5B78, 0x21E5, 0x5B79, 0x5B79, 0x2EC0,
- 0x5B7A, 0x5B7A, 0x0CC1, 0x5B7B, 0x5B7C, 0x2EC1, 0x5B7D, 0x5B7D, 0x0B58,
- 0x5B7E, 0x5B7E, 0x2EC3, 0x5B7F, 0x5B7F, 0x2057, 0x5B80, 0x5B80, 0x172E,
- 0x5B81, 0x5B81, 0x0B61, 0x5B82, 0x5B82, 0x2EC4, 0x5B83, 0x5B83, 0x0DF1,
- 0x5B84, 0x5B84, 0x172F, 0x5B85, 0x5B85, 0x114D, 0x5B86, 0x5B86, 0x2EC5,
- 0x5B87, 0x5B87, 0x10D3, 0x5B88, 0x5B88, 0x0D6F, 0x5B89, 0x5B89, 0x03BD,
- 0x5B8A, 0x5B8A, 0x2EC6, 0x5B8B, 0x5B8B, 0x0DC3, 0x5B8C, 0x5B8C, 0x0E9B,
- 0x5B8D, 0x5B8E, 0x2EC7, 0x5B8F, 0x5B8F, 0x07A1, 0x5B90, 0x5B92, 0x2EC9,
- 0x5B93, 0x5B93, 0x1731, 0x5B94, 0x5B94, 0x2ECC, 0x5B95, 0x5B95, 0x1730,
- 0x5B96, 0x5B96, 0x2ECD, 0x5B97, 0x5B97, 0x1237, 0x5B98, 0x5B98, 0x0732,
- 0x5B99, 0x5B99, 0x11E5, 0x5B9A, 0x5B9A, 0x05E7, 0x5B9B, 0x5B9B, 0x0EA1,
- 0x5B9C, 0x5B9C, 0x1052, 0x5B9D, 0x5B9D, 0x040F, 0x5B9E, 0x5B9E, 0x0D4C,
- 0x5B9F, 0x5B9F, 0x2ECE, 0x5BA0, 0x5BA0, 0x050D, 0x5BA1, 0x5BA1, 0x0D2C,
- 0x5BA2, 0x5BA2, 0x095A, 0x5BA3, 0x5BA3, 0x0FC6, 0x5BA4, 0x5BA4, 0x0D69,
- 0x5BA5, 0x5BA5, 0x1732, 0x5BA6, 0x5BA6, 0x07D7, 0x5BA7, 0x5BA9, 0x2ECF,
- 0x5BAA, 0x5BAA, 0x0F49, 0x5BAB, 0x5BAB, 0x0705, 0x5BAC, 0x5BAF, 0x2ED2,
- 0x5BB0, 0x5BB0, 0x111A, 0x5BB1, 0x5BB2, 0x2ED6, 0x5BB3, 0x5BB3, 0x075D,
- 0x5BB4, 0x5BB4, 0x1010, 0x5BB5, 0x5BB5, 0x0F69, 0x5BB6, 0x5BB6, 0x0845,
- 0x5BB7, 0x5BB7, 0x2ED8, 0x5BB8, 0x5BB8, 0x1733, 0x5BB9, 0x5BB9, 0x0CB8,
- 0x5BBA, 0x5BBC, 0x2ED9, 0x5BBD, 0x5BBD, 0x097A, 0x5BBE, 0x5BBE, 0x045F,
- 0x5BBF, 0x5BBF, 0x0DD3, 0x5BC0, 0x5BC1, 0x2EDC, 0x5BC2, 0x5BC2, 0x0838,
- 0x5BC3, 0x5BC3, 0x2EDE, 0x5BC4, 0x5BC4, 0x0837, 0x5BC5, 0x5BC5, 0x1081,
- 0x5BC6, 0x5BC6, 0x0AE1, 0x5BC7, 0x5BC7, 0x0969, 0x5BC8, 0x5BCB, 0x2EDF,
- 0x5BCC, 0x5BCC, 0x06B6, 0x5BCD, 0x5BCF, 0x2EE3, 0x5BD0, 0x5BD0, 0x0AC7,
- 0x5BD1, 0x5BD1, 0x2EE6, 0x5BD2, 0x5BD2, 0x0765, 0x5BD3, 0x5BD3, 0x10E5,
- 0x5BD4, 0x5BDC, 0x2EE7, 0x5BDD, 0x5BDD, 0x0C5B, 0x5BDE, 0x5BDE, 0x0B12,
- 0x5BDF, 0x5BDF, 0x04B3, 0x5BE0, 0x5BE0, 0x2EF0, 0x5BE1, 0x5BE1, 0x072A,
- 0x5BE2, 0x5BE2, 0x20E5, 0x5BE3, 0x5BE3, 0x2EF1, 0x5BE4, 0x5BE4, 0x1737,
- 0x5BE5, 0x5BE5, 0x0A11, 0x5BE6, 0x5BE6, 0x212F, 0x5BE7, 0x5BE7, 0x20A3,
- 0x5BE8, 0x5BE8, 0x1150, 0x5BE9, 0x5BE9, 0x2121, 0x5BEA, 0x5BEA, 0x2EF2,
- 0x5BEB, 0x5BEB, 0x21D4, 0x5BEC, 0x5BEC, 0x1FE5, 0x5BED, 0x5BED, 0x2EF3,
- 0x5BEE, 0x5BEE, 0x1738, 0x5BEF, 0x5BEF, 0x2EF4, 0x5BF0, 0x5BF0, 0x173A,
- 0x5BF1, 0x5BF4, 0x2EF5, 0x5BF5, 0x5BF5, 0x1E8A, 0x5BF6, 0x5BF6, 0x1E37,
- 0x5BF7, 0x5BF7, 0x2EF9, 0x5BF8, 0x5BF8, 0x056A, 0x5BF9, 0x5BF9, 0x0613,
- 0x5BFA, 0x5BFA, 0x0DB7, 0x5BFB, 0x5BFB, 0x0FD9, 0x5BFC, 0x5BFC, 0x059D,
- 0x5BFD, 0x5BFE, 0x2EFA, 0x5BFF, 0x5BFF, 0x0D70, 0x5C00, 0x5C00, 0x2EFC,
- 0x5C01, 0x5C01, 0x067F, 0x5C02, 0x5C03, 0x2EFD, 0x5C04, 0x5C04, 0x0D1D,
- 0x5C05, 0x5C05, 0x2EFF, 0x5C06, 0x5C06, 0x087C, 0x5C07, 0x5C07, 0x1F9E,
- 0x5C08, 0x5C08, 0x22A6, 0x5C09, 0x5C09, 0x0ECD, 0x5C0A, 0x5C0A, 0x124D,
- 0x5C0B, 0x5C0B, 0x21E8, 0x5C0C, 0x5C0C, 0x2F00, 0x5C0D, 0x5C0D, 0x1EDA,
- 0x5C0E, 0x5C0E, 0x1EB9, 0x5C0F, 0x5C0F, 0x0F6C, 0x5C10, 0x5C10, 0x2F01,
- 0x5C11, 0x5C11, 0x0D12, 0x5C12, 0x5C13, 0x2F02, 0x5C14, 0x5C14, 0x063A,
- 0x5C15, 0x5C15, 0x17B2, 0x5C16, 0x5C16, 0x0855, 0x5C17, 0x5C17, 0x2F04,
- 0x5C18, 0x5C18, 0x04E3, 0x5C19, 0x5C19, 0x2F05, 0x5C1A, 0x5C1A, 0x0D09,
- 0x5C1B, 0x5C1B, 0x2F06, 0x5C1C, 0x5C1C, 0x17B3, 0x5C1D, 0x5C1D, 0x04C7,
- 0x5C1E, 0x5C21, 0x2F07, 0x5C22, 0x5C22, 0x14B6, 0x5C23, 0x5C23, 0x2F0B,
- 0x5C24, 0x5C24, 0x10AD, 0x5C25, 0x5C25, 0x14B7, 0x5C26, 0x5C26, 0x2F0C,
- 0x5C27, 0x5C27, 0x1029, 0x5C28, 0x5C2B, 0x2F0D, 0x5C2C, 0x5C2C, 0x14B8,
- 0x5C2D, 0x5C30, 0x2F11, 0x5C31, 0x5C31, 0x08FC, 0x5C32, 0x5C33, 0x2F15,
- 0x5C34, 0x5C34, 0x14B9, 0x5C35, 0x5C36, 0x2F17, 0x5C37, 0x5C37, 0x235C,
- 0x5C38, 0x5C38, 0x0D43, 0x5C39, 0x5C39, 0x1083, 0x5C3A, 0x5C3A, 0x0504,
- 0x5C3B, 0x5C3B, 0x1766, 0x5C3C, 0x5C3C, 0x0B44, 0x5C3D, 0x5C3D, 0x08D0,
- 0x5C3E, 0x5C3E, 0x0EC1, 0x5C3F, 0x5C3F, 0x0B55, 0x5C40, 0x5C40, 0x0905,
- 0x5C41, 0x5C41, 0x0BC7, 0x5C42, 0x5C42, 0x04AA, 0x5C43, 0x5C44, 0x2F19,
- 0x5C45, 0x5C45, 0x0902, 0x5C46, 0x5C47, 0x2F1B, 0x5C48, 0x5C48, 0x0C79,
- 0x5C49, 0x5C49, 0x0E3E, 0x5C4A, 0x5C4A, 0x08BD, 0x5C4B, 0x5C4B, 0x0EEC,
- 0x5C4C, 0x5C4D, 0x2F1D, 0x5C4E, 0x5C4E, 0x0D51, 0x5C4F, 0x5C4F, 0x0BE0,
- 0x5C50, 0x5C50, 0x1768, 0x5C51, 0x5C51, 0x0F87, 0x5C52, 0x5C54, 0x2F1F,
- 0x5C55, 0x5C55, 0x115A, 0x5C56, 0x5C58, 0x2F22, 0x5C59, 0x5C59, 0x1769,
- 0x5C5A, 0x5C5D, 0x2F25, 0x5C5E, 0x5C5E, 0x0D8B, 0x5C5F, 0x5C5F, 0x2F29,
- 0x5C60, 0x5C60, 0x0E71, 0x5C61, 0x5C61, 0x0A6C, 0x5C62, 0x5C62, 0x2050,
- 0x5C63, 0x5C63, 0x176B, 0x5C64, 0x5C64, 0x1E67, 0x5C65, 0x5C65, 0x0A6B,
- 0x5C66, 0x5C66, 0x176C, 0x5C67, 0x5C67, 0x2F2A, 0x5C68, 0x5C68, 0x23F4,
- 0x5C69, 0x5C6B, 0x2F2B, 0x5C6C, 0x5C6C, 0x213E, 0x5C6D, 0x5C6D, 0x2F2E,
- 0x5C6E, 0x5C6E, 0x1774, 0x5C6F, 0x5C6F, 0x0E7E, 0x5C70, 0x5C70, 0x2F2F,
- 0x5C71, 0x5C71, 0x0CF6, 0x5C72, 0x5C78, 0x2F30, 0x5C79, 0x5C79, 0x1060,
- 0x5C7A, 0x5C7A, 0x15AC, 0x5C7B, 0x5C7E, 0x2F37, 0x5C7F, 0x5C7F, 0x10D1,
- 0x5C80, 0x5C80, 0x2F3B, 0x5C81, 0x5C81, 0x0DDF, 0x5C82, 0x5C82, 0x0C10,
- 0x5C83, 0x5C87, 0x2F3C, 0x5C88, 0x5C88, 0x15B0, 0x5C89, 0x5C8B, 0x2F41,
- 0x5C8C, 0x5C8C, 0x15AB, 0x5C8D, 0x5C8D, 0x15AD, 0x5C8E, 0x5C8F, 0x2F44,
- 0x5C90, 0x5C90, 0x15AE, 0x5C91, 0x5C91, 0x15B3, 0x5C92, 0x5C93, 0x2F46,
- 0x5C94, 0x5C94, 0x04B4, 0x5C95, 0x5C95, 0x2F48, 0x5C96, 0x5C96, 0x15AF,
- 0x5C97, 0x5C97, 0x06D5, 0x5C98, 0x5C99, 0x15B1, 0x5C9A, 0x5C9A, 0x15B4,
- 0x5C9B, 0x5C9B, 0x059B, 0x5C9C, 0x5C9C, 0x15B5, 0x5C9D, 0x5CA0, 0x2F49,
- 0x5CA1, 0x5CA1, 0x1F16, 0x5CA2, 0x5CA2, 0x15B7, 0x5CA3, 0x5CA3, 0x15BC,
- 0x5CA4, 0x5CA8, 0x2F4D, 0x5CA9, 0x5CA9, 0x0FFB, 0x5CAA, 0x5CAA, 0x2F52,
- 0x5CAB, 0x5CAB, 0x15BA, 0x5CAC, 0x5CAC, 0x15B9, 0x5CAD, 0x5CAD, 0x0A34,
- 0x5CAE, 0x5CB0, 0x2F53, 0x5CB1, 0x5CB1, 0x15BB, 0x5CB2, 0x5CB2, 0x2F56,
- 0x5CB3, 0x5CB3, 0x1103, 0x5CB4, 0x5CB4, 0x2F57, 0x5CB5, 0x5CB5, 0x15B6,
- 0x5CB6, 0x5CB6, 0x2F58, 0x5CB7, 0x5CB7, 0x15BE, 0x5CB8, 0x5CB8, 0x03C1,
- 0x5CB9, 0x5CBC, 0x2F59, 0x5CBD, 0x5CBD, 0x15B8, 0x5CBE, 0x5CBE, 0x2F5D,
- 0x5CBF, 0x5CBF, 0x0986, 0x5CC0, 0x5CC0, 0x2F5E, 0x5CC1, 0x5CC1, 0x15BD,
- 0x5CC2, 0x5CC3, 0x2F5F, 0x5CC4, 0x5CC4, 0x15BF, 0x5CC5, 0x5CCA, 0x2F61,
- 0x5CCB, 0x5CCB, 0x15C2, 0x5CCC, 0x5CD1, 0x2F67, 0x5CD2, 0x5CD2, 0x15C0,
- 0x5CD3, 0x5CD8, 0x2F6D, 0x5CD9, 0x5CD9, 0x11C4, 0x5CDA, 0x5CE0, 0x2F73,
- 0x5CE1, 0x5CE1, 0x0F2C, 0x5CE2, 0x5CE3, 0x2F7A, 0x5CE4, 0x5CE4, 0x15C1,
- 0x5CE5, 0x5CE5, 0x15C3, 0x5CE6, 0x5CE6, 0x0A74, 0x5CE7, 0x5CE7, 0x2F7C,
- 0x5CE8, 0x5CE8, 0x062A, 0x5CE9, 0x5CE9, 0x2F7D, 0x5CEA, 0x5CEA, 0x10DD,
- 0x5CEB, 0x5CEC, 0x2F7E, 0x5CED, 0x5CED, 0x0C4A, 0x5CEE, 0x5CEF, 0x2F80,
- 0x5CF0, 0x5CF0, 0x0682, 0x5CF1, 0x5CF3, 0x2F82, 0x5CF4, 0x5CF4, 0x2389,
- 0x5CF5, 0x5CF5, 0x2F85, 0x5CF6, 0x5CF6, 0x1EB7, 0x5CF7, 0x5CFA, 0x2F86,
- 0x5CFB, 0x5CFB, 0x092D, 0x5CFC, 0x5CFC, 0x2F8A, 0x5CFD, 0x5CFD, 0x21B4,
- 0x5CFE, 0x5CFF, 0x2F8B, 0x5D00, 0x5D01, 0x2F8D, 0x5D02, 0x5D03, 0x15C4,
- 0x5D04, 0x5D05, 0x2F8F, 0x5D06, 0x5D06, 0x15CB, 0x5D07, 0x5D07, 0x050C,
- 0x5D08, 0x5D0C, 0x2F91, 0x5D0D, 0x5D0D, 0x238F, 0x5D0E, 0x5D0E, 0x0C08,
- 0x5D0F, 0x5D13, 0x2F96, 0x5D14, 0x5D14, 0x0561, 0x5D15, 0x5D15, 0x2F9B,
- 0x5D16, 0x5D16, 0x0FEB, 0x5D17, 0x5D17, 0x1F1A, 0x5D18, 0x5D1A, 0x2F9C,
- 0x5D1B, 0x5D1B, 0x15CC, 0x5D1C, 0x5D1D, 0x2F9F, 0x5D1E, 0x5D1E, 0x15CA,
- 0x5D1F, 0x5D23, 0x2FA1, 0x5D24, 0x5D24, 0x15C9, 0x5D25, 0x5D25, 0x2FA6,
- 0x5D26, 0x5D26, 0x15C7, 0x5D27, 0x5D27, 0x15C6, 0x5D28, 0x5D28, 0x2FA7,
- 0x5D29, 0x5D29, 0x0429, 0x5D2A, 0x5D2B, 0x2FA8, 0x5D2C, 0x5D2C, 0x238B,
- 0x5D2D, 0x5D2D, 0x1159, 0x5D2E, 0x5D2E, 0x15C8, 0x5D2F, 0x5D33, 0x2FAA,
- 0x5D34, 0x5D34, 0x15CF, 0x5D35, 0x5D3C, 0x2FAF, 0x5D3D, 0x5D3D, 0x15D0,
- 0x5D3E, 0x5D3E, 0x15CE, 0x5D3F, 0x5D46, 0x2FB7, 0x5D47, 0x5D47, 0x1B22,
- 0x5D48, 0x5D49, 0x2FBF, 0x5D4A, 0x5D4A, 0x15D7, 0x5D4B, 0x5D4B, 0x15D6,
- 0x5D4C, 0x5D4C, 0x0C33, 0x5D4D, 0x5D4F, 0x2FC1, 0x5D50, 0x5D50, 0x238A,
- 0x5D51, 0x5D57, 0x2FC4, 0x5D58, 0x5D58, 0x15CD, 0x5D59, 0x5D5A, 0x2FCB,
- 0x5D5B, 0x5D5B, 0x15D2, 0x5D5C, 0x5D5C, 0x2FCD, 0x5D5D, 0x5D5D, 0x15D4,
- 0x5D5E, 0x5D68, 0x2FCE, 0x5D69, 0x5D69, 0x15D8, 0x5D6A, 0x5D6A, 0x2FD9,
- 0x5D6B, 0x5D6B, 0x15D5, 0x5D6C, 0x5D6C, 0x15D1, 0x5D6D, 0x5D6E, 0x2FDA,
- 0x5D6F, 0x5D6F, 0x15D3, 0x5D70, 0x5D73, 0x2FDC, 0x5D74, 0x5D74, 0x15D9,
- 0x5D75, 0x5D80, 0x2FE0, 0x5D81, 0x5D81, 0x2391, 0x5D82, 0x5D82, 0x15DA,
- 0x5D83, 0x5D83, 0x2FEC, 0x5D84, 0x5D84, 0x2271, 0x5D85, 0x5D86, 0x2FED,
- 0x5D87, 0x5D87, 0x2388, 0x5D88, 0x5D96, 0x2FEF, 0x5D97, 0x5D97, 0x238E,
- 0x5D98, 0x5D98, 0x2FFE, 0x5D99, 0x5D99, 0x15DB, 0x5D9A, 0x5D9C, 0x2FFF,
- 0x5D9D, 0x5D9D, 0x15DC, 0x5D9E, 0x5D9F, 0x3002, 0x5DA0, 0x5DA0, 0x238D,
- 0x5DA1, 0x5DA6, 0x3004, 0x5DA7, 0x5DA7, 0x238C, 0x5DA8, 0x5DB6, 0x300A,
- 0x5DB7, 0x5DB7, 0x15DE, 0x5DB8, 0x5DB8, 0x2390, 0x5DB9, 0x5DB9, 0x3019,
- 0x5DBA, 0x5DBA, 0x2033, 0x5DBB, 0x5DBB, 0x301A, 0x5DBC, 0x5DBC, 0x223C,
- 0x5DBD, 0x5DC4, 0x301B, 0x5DC5, 0x5DC5, 0x15DF, 0x5DC6, 0x5DCA, 0x3023,
- 0x5DCB, 0x5DCB, 0x1FE9, 0x5DCC, 0x5DCC, 0x3028, 0x5DCD, 0x5DCD, 0x0EB0,
- 0x5DCE, 0x5DD1, 0x3029, 0x5DD2, 0x5DD2, 0x2055, 0x5DD3, 0x5DD3, 0x302D,
- 0x5DD4, 0x5DD4, 0x2392, 0x5DD5, 0x5DDA, 0x302E, 0x5DDB, 0x5DDB, 0x1815,
- 0x5DDC, 0x5DDC, 0x3034, 0x5DDD, 0x5DDD, 0x052B, 0x5DDE, 0x5DDE, 0x11DC,
- 0x5DDF, 0x5DE0, 0x3035, 0x5DE1, 0x5DE1, 0x0FDB, 0x5DE2, 0x5DE2, 0x04D7,
- 0x5DE3, 0x5DE4, 0x3037, 0x5DE5, 0x5DE5, 0x06FD, 0x5DE6, 0x5DE6, 0x1250,
- 0x5DE7, 0x5DE7, 0x0C46, 0x5DE8, 0x5DE8, 0x090D, 0x5DE9, 0x5DE9, 0x0707,
- 0x5DEA, 0x5DEA, 0x3039, 0x5DEB, 0x5DEB, 0x0EE6, 0x5DEC, 0x5DED, 0x303A,
- 0x5DEE, 0x5DEE, 0x04B5, 0x5DEF, 0x5DEF, 0x139F, 0x5DF0, 0x5DF0, 0x2324,
- 0x5DF1, 0x5DF1, 0x082D, 0x5DF2, 0x5DF2, 0x1058, 0x5DF3, 0x5DF3, 0x0DBD,
- 0x5DF4, 0x5DF4, 0x03D8, 0x5DF5, 0x5DF6, 0x303C, 0x5DF7, 0x5DF7, 0x0F5C,
- 0x5DF8, 0x5DFC, 0x303E, 0x5DFD, 0x5DFD, 0x12F7, 0x5DFE, 0x5DFE, 0x08BE,
- 0x5DFF, 0x5DFF, 0x3043, 0x5E00, 0x5E00, 0x3044, 0x5E01, 0x5E01, 0x043B,
- 0x5E02, 0x5E02, 0x0D67, 0x5E03, 0x5E03, 0x0483, 0x5E04, 0x5E04, 0x3045,
- 0x5E05, 0x5E05, 0x0D9C, 0x5E06, 0x5E06, 0x0648, 0x5E07, 0x5E07, 0x3046,
- 0x5E08, 0x5E08, 0x0D3D, 0x5E09, 0x5E0B, 0x3047, 0x5E0C, 0x5E0C, 0x0F10,
- 0x5E0D, 0x5E0E, 0x304A, 0x5E0F, 0x5E0F, 0x159E, 0x5E10, 0x5E10, 0x116B,
- 0x5E11, 0x5E11, 0x15A1, 0x5E12, 0x5E13, 0x304C, 0x5E14, 0x5E14, 0x15A0,
- 0x5E15, 0x5E15, 0x0B82, 0x5E16, 0x5E16, 0x0E4E, 0x5E17, 0x5E17, 0x304E,
- 0x5E18, 0x5E18, 0x09FA, 0x5E19, 0x5E19, 0x159F, 0x5E1A, 0x5E1A, 0x11E2,
- 0x5E1B, 0x5E1B, 0x0476, 0x5E1C, 0x5E1C, 0x11C3, 0x5E1D, 0x5E1D, 0x05BC,
- 0x5E1E, 0x5E24, 0x304F, 0x5E25, 0x5E25, 0x2143, 0x5E26, 0x5E26, 0x057B,
- 0x5E27, 0x5E27, 0x11A0, 0x5E28, 0x5E2A, 0x3056, 0x5E2B, 0x5E2B, 0x2129,
- 0x5E2C, 0x5E2C, 0x3059, 0x5E2D, 0x5E2D, 0x0F1C, 0x5E2E, 0x5E2E, 0x03FA,
- 0x5E2F, 0x5E30, 0x305A, 0x5E31, 0x5E31, 0x15A2, 0x5E32, 0x5E32, 0x305C,
- 0x5E33, 0x5E33, 0x2277, 0x5E34, 0x5E35, 0x305D, 0x5E36, 0x5E36, 0x1EA7,
- 0x5E37, 0x5E37, 0x15A5, 0x5E38, 0x5E38, 0x04C8, 0x5E39, 0x5E3A, 0x305F,
- 0x5E3B, 0x5E3C, 0x15A3, 0x5E3D, 0x5E3D, 0x0AB6, 0x5E3E, 0x5E3F, 0x3061,
- 0x5E40, 0x5E40, 0x2285, 0x5E41, 0x5E41, 0x3063, 0x5E42, 0x5E42, 0x0AE2,
- 0x5E43, 0x5E43, 0x2384, 0x5E44, 0x5E44, 0x15A6, 0x5E45, 0x5E45, 0x0696,
- 0x5E46, 0x5E4B, 0x3064, 0x5E4C, 0x5E4C, 0x07E4, 0x5E4D, 0x5E53, 0x306A,
- 0x5E54, 0x5E54, 0x15A7, 0x5E55, 0x5E55, 0x0B1E, 0x5E56, 0x5E56, 0x3071,
- 0x5E57, 0x5E57, 0x2387, 0x5E58, 0x5E58, 0x2386, 0x5E59, 0x5E5A, 0x3072,
- 0x5E5B, 0x5E5B, 0x15A8, 0x5E5C, 0x5E5D, 0x3074, 0x5E5E, 0x5E5E, 0x15A9,
- 0x5E5F, 0x5E5F, 0x2290, 0x5E60, 0x5E60, 0x3076, 0x5E61, 0x5E61, 0x15AA,
- 0x5E62, 0x5E62, 0x0534, 0x5E63, 0x5E63, 0x1E44, 0x5E64, 0x5E6A, 0x3077,
- 0x5E6B, 0x5E6B, 0x1E32, 0x5E6C, 0x5E6C, 0x2385, 0x5E6D, 0x5E71, 0x307E,
- 0x5E72, 0x5E72, 0x06C4, 0x5E73, 0x5E73, 0x0BDC, 0x5E74, 0x5E74, 0x0B4D,
- 0x5E75, 0x5E75, 0x3083, 0x5E76, 0x5E76, 0x0469, 0x5E77, 0x5E77, 0x3084,
- 0x5E78, 0x5E78, 0x0F9D, 0x5E79, 0x5E79, 0x1F13, 0x5E7A, 0x5E7A, 0x1813,
- 0x5E7B, 0x5E7B, 0x07D8, 0x5E7C, 0x5E7C, 0x10BC, 0x5E7D, 0x5E7D, 0x10A9,
- 0x5E7E, 0x5E7E, 0x1F73, 0x5E7F, 0x5E7F, 0x073C, 0x5E80, 0x5E80, 0x1631,
- 0x5E81, 0x5E83, 0x3085, 0x5E84, 0x5E84, 0x120C, 0x5E85, 0x5E85, 0x3088,
- 0x5E86, 0x5E86, 0x0C69, 0x5E87, 0x5E87, 0x043C, 0x5E88, 0x5E89, 0x3089,
- 0x5E8A, 0x5E8A, 0x0535, 0x5E8B, 0x5E8B, 0x1633, 0x5E8C, 0x5E8E, 0x308B,
- 0x5E8F, 0x5E8F, 0x0FBD, 0x5E90, 0x5E90, 0x0A55, 0x5E91, 0x5E91, 0x1632,
- 0x5E92, 0x5E92, 0x308E, 0x5E93, 0x5E93, 0x096F, 0x5E94, 0x5E94, 0x108B,
- 0x5E95, 0x5E95, 0x05B8, 0x5E96, 0x5E96, 0x1634, 0x5E97, 0x5E97, 0x05CB,
- 0x5E98, 0x5E98, 0x308F, 0x5E99, 0x5E99, 0x0AF2, 0x5E9A, 0x5E9A, 0x06F8,
- 0x5E9B, 0x5E9B, 0x3090, 0x5E9C, 0x5E9C, 0x06A9, 0x5E9D, 0x5E9D, 0x3091,
- 0x5E9E, 0x5E9E, 0x0B94, 0x5E9F, 0x5E9F, 0x066C, 0x5EA0, 0x5EA0, 0x1636,
- 0x5EA1, 0x5EA4, 0x3092, 0x5EA5, 0x5EA5, 0x1635, 0x5EA6, 0x5EA6, 0x0607,
- 0x5EA7, 0x5EA7, 0x1256, 0x5EA8, 0x5EAA, 0x3096, 0x5EAB, 0x5EAB, 0x1FE0,
- 0x5EAC, 0x5EAC, 0x3099, 0x5EAD, 0x5EAD, 0x0E56, 0x5EAE, 0x5EB2, 0x309A,
- 0x5EB3, 0x5EB3, 0x163A, 0x5EB4, 0x5EB4, 0x309F, 0x5EB5, 0x5EB5, 0x1638,
- 0x5EB6, 0x5EB6, 0x0D93, 0x5EB7, 0x5EB7, 0x0942, 0x5EB8, 0x5EB8, 0x109E,
- 0x5EB9, 0x5EB9, 0x1637, 0x5EBA, 0x5EBD, 0x30A0, 0x5EBE, 0x5EBE, 0x1639,
- 0x5EBF, 0x5EC8, 0x30A4, 0x5EC9, 0x5EC9, 0x09F7, 0x5ECA, 0x5ECA, 0x09B3,
- 0x5ECB, 0x5ED0, 0x30AE, 0x5ED1, 0x5ED1, 0x163D, 0x5ED2, 0x5ED2, 0x163C,
- 0x5ED3, 0x5ED3, 0x0995, 0x5ED4, 0x5ED5, 0x30B4, 0x5ED6, 0x5ED6, 0x0A17,
- 0x5ED7, 0x5EDA, 0x30B6, 0x5EDB, 0x5EDB, 0x163E, 0x5EDC, 0x5EDE, 0x30BA,
- 0x5EDF, 0x5EDF, 0x2087, 0x5EE0, 0x5EE0, 0x1E78, 0x5EE1, 0x5EE1, 0x23AE,
- 0x5EE2, 0x5EE2, 0x1EF6, 0x5EE3, 0x5EE3, 0x1F31, 0x5EE4, 0x5EE7, 0x30BD,
- 0x5EE8, 0x5EE8, 0x163F, 0x5EE9, 0x5EE9, 0x30C1, 0x5EEA, 0x5EEA, 0x1640,
- 0x5EEB, 0x5EEB, 0x30C2, 0x5EEC, 0x5EEC, 0x2045, 0x5EED, 0x5EF2, 0x30C3,
- 0x5EF3, 0x5EF3, 0x2178, 0x5EF4, 0x5EF4, 0x1398, 0x5EF5, 0x5EF5, 0x30C9,
- 0x5EF6, 0x5EF6, 0x0FFC, 0x5EF7, 0x5EF7, 0x0E53, 0x5EF8, 0x5EF9, 0x30CA,
- 0x5EFA, 0x5EFA, 0x0879, 0x5EFB, 0x5EFD, 0x30CC, 0x5EFE, 0x5EFE, 0x14AD,
- 0x5EFF, 0x5EFF, 0x125B, 0x5F00, 0x5F00, 0x0937, 0x5F01, 0x5F01, 0x139D,
- 0x5F02, 0x5F02, 0x1073, 0x5F03, 0x5F03, 0x0C19, 0x5F04, 0x5F04, 0x0B6B,
- 0x5F05, 0x5F07, 0x30CF, 0x5F08, 0x5F08, 0x14AE, 0x5F09, 0x5F09, 0x30D2,
- 0x5F0A, 0x5F0A, 0x0440, 0x5F0B, 0x5F0B, 0x14F6, 0x5F0C, 0x5F0E, 0x30D3,
- 0x5F0F, 0x5F0F, 0x0D54, 0x5F10, 0x5F10, 0x30D6, 0x5F11, 0x5F11, 0x14F9,
- 0x5F12, 0x5F12, 0x30D7, 0x5F13, 0x5F13, 0x0706, 0x5F14, 0x5F14, 0x30D8,
- 0x5F15, 0x5F15, 0x1084, 0x5F16, 0x5F16, 0x30D9, 0x5F17, 0x5F17, 0x06A0,
- 0x5F18, 0x5F18, 0x07A2, 0x5F19, 0x5F1A, 0x30DA, 0x5F1B, 0x5F1B, 0x04FF,
- 0x5F1C, 0x5F1E, 0x30DC, 0x5F1F, 0x5F1F, 0x05BD, 0x5F20, 0x5F20, 0x1166,
- 0x5F21, 0x5F24, 0x30DF, 0x5F25, 0x5F25, 0x0ADB, 0x5F26, 0x5F26, 0x0F3F,
- 0x5F27, 0x5F27, 0x07B6, 0x5F28, 0x5F28, 0x30E3, 0x5F29, 0x5F29, 0x176F,
- 0x5F2A, 0x5F2A, 0x176E, 0x5F2B, 0x5F2C, 0x30E4, 0x5F2D, 0x5F2D, 0x1770,
- 0x5F2E, 0x5F2E, 0x30E6, 0x5F2F, 0x5F2F, 0x0E95, 0x5F30, 0x5F30, 0x30E7,
- 0x5F31, 0x5F31, 0x0CD0, 0x5F32, 0x5F32, 0x30E8, 0x5F33, 0x5F33, 0x23F5,
- 0x5F34, 0x5F34, 0x30E9, 0x5F35, 0x5F35, 0x2275, 0x5F36, 0x5F38, 0x30EA,
- 0x5F39, 0x5F39, 0x0590, 0x5F3A, 0x5F3A, 0x0C3C, 0x5F3B, 0x5F3B, 0x30ED,
- 0x5F3C, 0x5F3C, 0x1772, 0x5F3D, 0x5F3F, 0x30EE, 0x5F40, 0x5F40, 0x19BE,
- 0x5F41, 0x5F45, 0x30F1, 0x5F46, 0x5F46, 0x266E, 0x5F47, 0x5F47, 0x30F6,
- 0x5F48, 0x5F48, 0x1EB0, 0x5F49, 0x5F4B, 0x30F7, 0x5F4C, 0x5F4C, 0x2083,
- 0x5F4D, 0x5F4D, 0x30FA, 0x5F4E, 0x5F4E, 0x2188, 0x5F4F, 0x5F4F, 0x30FB,
- 0x5F50, 0x5F50, 0x1762, 0x5F51, 0x5F51, 0x30FC, 0x5F52, 0x5F52, 0x0742,
- 0x5F53, 0x5F53, 0x0592, 0x5F54, 0x5F54, 0x30FD, 0x5F55, 0x5F55, 0x0A63,
- 0x5F56, 0x5F56, 0x1764, 0x5F57, 0x5F57, 0x1763, 0x5F58, 0x5F58, 0x1765,
- 0x5F59, 0x5F59, 0x267C, 0x5F5A, 0x5F5C, 0x30FE, 0x5F5D, 0x5F5D, 0x1054,
- 0x5F5E, 0x5F60, 0x3101, 0x5F61, 0x5F61, 0x15EE, 0x5F62, 0x5F62, 0x0F99,
- 0x5F63, 0x5F63, 0x3104, 0x5F64, 0x5F64, 0x0E5F, 0x5F65, 0x5F65, 0x3105,
- 0x5F66, 0x5F66, 0x100E, 0x5F67, 0x5F68, 0x3106, 0x5F69, 0x5F69, 0x0491,
- 0x5F6A, 0x5F6A, 0x0454, 0x5F6B, 0x5F6B, 0x3108, 0x5F6C, 0x5F6C, 0x045B,
- 0x5F6D, 0x5F6D, 0x0BAE, 0x5F6E, 0x5F6F, 0x3109, 0x5F70, 0x5F70, 0x1164,
- 0x5F71, 0x5F71, 0x1095, 0x5F72, 0x5F72, 0x310B, 0x5F73, 0x5F73, 0x15E0,
- 0x5F74, 0x5F76, 0x310C, 0x5F77, 0x5F77, 0x15E1, 0x5F78, 0x5F78, 0x310F,
- 0x5F79, 0x5F79, 0x1062, 0x5F7A, 0x5F7A, 0x3110, 0x5F7B, 0x5F7B, 0x04DE,
- 0x5F7C, 0x5F7C, 0x0434, 0x5F7D, 0x5F7F, 0x3111, 0x5F80, 0x5F80, 0x0EAA,
- 0x5F81, 0x5F81, 0x1198, 0x5F82, 0x5F82, 0x15E2, 0x5F83, 0x5F83, 0x3114,
- 0x5F84, 0x5F84, 0x08E5, 0x5F85, 0x5F85, 0x0580, 0x5F86, 0x5F86, 0x3115,
- 0x5F87, 0x5F87, 0x15E3, 0x5F88, 0x5F88, 0x0793, 0x5F89, 0x5F89, 0x15E4,
- 0x5F8A, 0x5F8A, 0x07C7, 0x5F8B, 0x5F8B, 0x0A70, 0x5F8C, 0x5F8C, 0x15E5,
- 0x5F8D, 0x5F8F, 0x3116, 0x5F90, 0x5F90, 0x0FB7, 0x5F91, 0x5F91, 0x1FC5,
- 0x5F92, 0x5F92, 0x0E6E, 0x5F93, 0x5F94, 0x3119, 0x5F95, 0x5F95, 0x15E6,
- 0x5F96, 0x5F96, 0x311B, 0x5F97, 0x5F97, 0x05A4, 0x5F98, 0x5F98, 0x0B88,
- 0x5F99, 0x5F99, 0x15E7, 0x5F9A, 0x5F9B, 0x311C, 0x5F9C, 0x5F9C, 0x15E8,
- 0x5F9D, 0x5F9D, 0x311E, 0x5F9E, 0x5F9E, 0x1EA1, 0x5F9F, 0x5F9F, 0x311F,
- 0x5FA0, 0x5FA0, 0x2393, 0x5FA1, 0x5FA1, 0x10DE, 0x5FA2, 0x5FA7, 0x3120,
- 0x5FA8, 0x5FA8, 0x15E9, 0x5FA9, 0x5FA9, 0x1F0B, 0x5FAA, 0x5FAA, 0x0FD6,
- 0x5FAB, 0x5FAC, 0x3126, 0x5FAD, 0x5FAD, 0x15EA, 0x5FAE, 0x5FAE, 0x0EB1,
- 0x5FAF, 0x5FB4, 0x3128, 0x5FB5, 0x5FB5, 0x15EB, 0x5FB6, 0x5FB6, 0x312E,
- 0x5FB7, 0x5FB7, 0x05A3, 0x5FB8, 0x5FB8, 0x312F, 0x5FB9, 0x5FB9, 0x1E7C,
- 0x5FBA, 0x5FBB, 0x3130, 0x5FBC, 0x5FBC, 0x15EC, 0x5FBD, 0x5FBD, 0x07EA,
- 0x5FBE, 0x5FC2, 0x3132, 0x5FC3, 0x5FC3, 0x0F8F, 0x5FC4, 0x5FC4, 0x1642,
- 0x5FC5, 0x5FC5, 0x0441, 0x5FC6, 0x5FC6, 0x106B, 0x5FC7, 0x5FC8, 0x3137,
- 0x5FC9, 0x5FC9, 0x1643, 0x5FCA, 0x5FCB, 0x3139, 0x5FCC, 0x5FCC, 0x083C,
- 0x5FCD, 0x5FCD, 0x0CA7, 0x5FCE, 0x5FCE, 0x313B, 0x5FCF, 0x5FCF, 0x1645,
- 0x5FD0, 0x5FD0, 0x1A0C, 0x5FD1, 0x5FD1, 0x1A0B, 0x5FD2, 0x5FD2, 0x14F7,
- 0x5FD3, 0x5FD5, 0x313C, 0x5FD6, 0x5FD6, 0x1644, 0x5FD7, 0x5FD7, 0x11BD,
- 0x5FD8, 0x5FD8, 0x0EAD, 0x5FD9, 0x5FD9, 0x0AAB, 0x5FDA, 0x5FDC, 0x313F,
- 0x5FDD, 0x5FDD, 0x1683, 0x5FDE, 0x5FDF, 0x3142, 0x5FE0, 0x5FE0, 0x11D1,
- 0x5FE1, 0x5FE1, 0x1649, 0x5FE2, 0x5FE3, 0x3144, 0x5FE4, 0x5FE4, 0x164A,
- 0x5FE5, 0x5FE6, 0x3146, 0x5FE7, 0x5FE7, 0x10AC, 0x5FE8, 0x5FE9, 0x3148,
- 0x5FEA, 0x5FEA, 0x164E, 0x5FEB, 0x5FEB, 0x0979, 0x5FEC, 0x5FEC, 0x314A,
- 0x5FED, 0x5FED, 0x164F, 0x5FEE, 0x5FEE, 0x1647, 0x5FEF, 0x5FF0, 0x314B,
- 0x5FF1, 0x5FF1, 0x04E5, 0x5FF2, 0x5FF4, 0x314D, 0x5FF5, 0x5FF5, 0x0B51,
- 0x5FF6, 0x5FF7, 0x3150, 0x5FF8, 0x5FF8, 0x1650, 0x5FF9, 0x5FFA, 0x3152,
- 0x5FFB, 0x5FFB, 0x0F8E, 0x5FFC, 0x5FFC, 0x3154, 0x5FFD, 0x5FFD, 0x07AD,
- 0x5FFE, 0x5FFE, 0x164B, 0x5FFF, 0x5FFF, 0x067B, 0x6000, 0x6000, 0x07C8,
- 0x6001, 0x6001, 0x0DFF, 0x6002, 0x6002, 0x0DC0, 0x6003, 0x6003, 0x1646,
- 0x6004, 0x6004, 0x1648, 0x6005, 0x6006, 0x164C, 0x6007, 0x6009, 0x3155,
- 0x600A, 0x600A, 0x1659, 0x600B, 0x600C, 0x3158, 0x600D, 0x600D, 0x1656,
- 0x600E, 0x600E, 0x1138, 0x600F, 0x600F, 0x1655, 0x6010, 0x6011, 0x315A,
- 0x6012, 0x6012, 0x0B6E, 0x6013, 0x6013, 0x315C, 0x6014, 0x6014, 0x119B,
- 0x6015, 0x6015, 0x0B83, 0x6016, 0x6016, 0x0487, 0x6017, 0x6018, 0x315D,
- 0x6019, 0x6019, 0x1651, 0x601A, 0x601A, 0x315F, 0x601B, 0x601B, 0x1654,
- 0x601C, 0x601C, 0x09F8, 0x601D, 0x601D, 0x0DB1, 0x601E, 0x601F, 0x3160,
- 0x6020, 0x6020, 0x0582, 0x6021, 0x6021, 0x165B, 0x6022, 0x6024, 0x3162,
- 0x6025, 0x6025, 0x0824, 0x6026, 0x6026, 0x1653, 0x6027, 0x6027, 0x0F9F,
- 0x6028, 0x6028, 0x10FC, 0x6029, 0x6029, 0x1657, 0x602A, 0x602A, 0x072F,
- 0x602B, 0x602B, 0x1658, 0x602C, 0x602E, 0x3165, 0x602F, 0x602F, 0x0C50,
- 0x6030, 0x6034, 0x3168, 0x6035, 0x6035, 0x1652, 0x6036, 0x603A, 0x316D,
- 0x603B, 0x603B, 0x1239, 0x603C, 0x603C, 0x1A0D, 0x603D, 0x603E, 0x3172,
- 0x603F, 0x603F, 0x165A, 0x6040, 0x6040, 0x3174, 0x6041, 0x6041, 0x1A11,
- 0x6042, 0x6042, 0x1660, 0x6043, 0x6043, 0x0D68, 0x6044, 0x604A, 0x3175,
- 0x604B, 0x604B, 0x09FE, 0x604C, 0x604C, 0x317C, 0x604D, 0x604D, 0x07E5,
- 0x604E, 0x604F, 0x317D, 0x6050, 0x6050, 0x0963, 0x6051, 0x6051, 0x317F,
- 0x6052, 0x6052, 0x079A, 0x6053, 0x6054, 0x3180, 0x6055, 0x6055, 0x0D96,
- 0x6056, 0x6058, 0x3182, 0x6059, 0x6059, 0x1A12, 0x605A, 0x605A, 0x1A0F,
- 0x605B, 0x605C, 0x3185, 0x605D, 0x605D, 0x1A0E, 0x605E, 0x6061, 0x3187,
- 0x6062, 0x6062, 0x07EB, 0x6063, 0x6063, 0x1A13, 0x6064, 0x6064, 0x0FBF,
- 0x6065, 0x6066, 0x318B, 0x6067, 0x6067, 0x1A10, 0x6068, 0x6068, 0x0795,
- 0x6069, 0x6069, 0x0636, 0x606A, 0x606A, 0x1661, 0x606B, 0x606B, 0x05F1,
- 0x606C, 0x606C, 0x0E44, 0x606D, 0x606D, 0x0700, 0x606E, 0x606E, 0x318D,
- 0x606F, 0x606F, 0x0F0F, 0x6070, 0x6070, 0x0C1E, 0x6071, 0x6072, 0x318E,
- 0x6073, 0x6073, 0x095F, 0x6074, 0x6075, 0x3190, 0x6076, 0x6076, 0x0630,
- 0x6077, 0x6077, 0x3192, 0x6078, 0x6079, 0x165C, 0x607A, 0x607A, 0x165F,
- 0x607B, 0x607B, 0x165E, 0x607C, 0x607C, 0x0B38, 0x607D, 0x607D, 0x1662,
- 0x607E, 0x607E, 0x3193, 0x607F, 0x607F, 0x10A6, 0x6080, 0x6082, 0x3194,
- 0x6083, 0x6083, 0x1667, 0x6084, 0x6084, 0x0C41, 0x6085, 0x6088, 0x3197,
- 0x6089, 0x6089, 0x0F11, 0x608A, 0x608B, 0x319B, 0x608C, 0x608C, 0x1669,
- 0x608D, 0x608D, 0x076E, 0x608E, 0x6091, 0x319D, 0x6092, 0x6092, 0x1668,
- 0x6093, 0x6093, 0x31A1, 0x6094, 0x6094, 0x07EF, 0x6095, 0x6095, 0x31A2,
- 0x6096, 0x6096, 0x1663, 0x6097, 0x6099, 0x31A3, 0x609A, 0x609A, 0x1664,
- 0x609B, 0x609B, 0x166A, 0x609C, 0x609C, 0x31A6, 0x609D, 0x609D, 0x1666,
- 0x609E, 0x609E, 0x31A7, 0x609F, 0x609F, 0x0F01, 0x60A0, 0x60A0, 0x10AB,
- 0x60A1, 0x60A2, 0x31A8, 0x60A3, 0x60A3, 0x07D1, 0x60A4, 0x60A5, 0x31AA,
- 0x60A6, 0x60A6, 0x1106, 0x60A7, 0x60A7, 0x31AC, 0x60A8, 0x60A8, 0x0B5D,
- 0x60A9, 0x60AA, 0x31AD, 0x60AB, 0x60AB, 0x1A14, 0x60AC, 0x60AC, 0x0FC7,
- 0x60AD, 0x60AD, 0x1665, 0x60AE, 0x60AE, 0x31AF, 0x60AF, 0x60AF, 0x0AFA,
- 0x60B0, 0x60B0, 0x31B0, 0x60B1, 0x60B1, 0x166D, 0x60B2, 0x60B2, 0x0418,
- 0x60B3, 0x60B3, 0x31B1, 0x60B4, 0x60B4, 0x1672, 0x60B5, 0x60B5, 0x23B4,
- 0x60B6, 0x60B6, 0x207E, 0x60B7, 0x60B7, 0x31B2, 0x60B8, 0x60B8, 0x0835,
- 0x60B9, 0x60BA, 0x31B3, 0x60BB, 0x60BB, 0x166C, 0x60BC, 0x60BC, 0x05A0,
- 0x60BD, 0x60C4, 0x31B5, 0x60C5, 0x60C5, 0x0C66, 0x60C6, 0x60C6, 0x1670,
- 0x60C7, 0x60C9, 0x31BD, 0x60CA, 0x60CA, 0x08D9, 0x60CB, 0x60CB, 0x0EA0,
- 0x60CC, 0x60D0, 0x31C0, 0x60D1, 0x60D1, 0x0808, 0x60D2, 0x60D4, 0x31C5,
- 0x60D5, 0x60D5, 0x0E3B, 0x60D6, 0x60D7, 0x31C8, 0x60D8, 0x60D8, 0x166F,
- 0x60D9, 0x60D9, 0x31CA, 0x60DA, 0x60DA, 0x1671, 0x60DB, 0x60DB, 0x31CB,
- 0x60DC, 0x60DC, 0x0F14, 0x60DD, 0x60DD, 0x166E, 0x60DE, 0x60DE, 0x31CC,
- 0x60DF, 0x60DF, 0x0EB8, 0x60E0, 0x60E0, 0x07F2, 0x60E1, 0x60E1, 0x1EE3,
- 0x60E2, 0x60E5, 0x31CD, 0x60E6, 0x60E6, 0x05CC, 0x60E7, 0x60E7, 0x0914,
- 0x60E8, 0x60E8, 0x0499, 0x60E9, 0x60E9, 0x04F2, 0x60EA, 0x60EA, 0x31D1,
- 0x60EB, 0x60EB, 0x0422, 0x60EC, 0x60EC, 0x166B, 0x60ED, 0x60ED, 0x0498,
- 0x60EE, 0x60EE, 0x058D, 0x60EF, 0x60EF, 0x0738, 0x60F0, 0x60F0, 0x0627,
- 0x60F1, 0x60F1, 0x2095, 0x60F2, 0x60F2, 0x23BB, 0x60F3, 0x60F3, 0x0F58,
- 0x60F4, 0x60F4, 0x1677, 0x60F5, 0x60F5, 0x31D2, 0x60F6, 0x60F6, 0x07E1,
- 0x60F7, 0x60F8, 0x31D3, 0x60F9, 0x60F9, 0x0CA2, 0x60FA, 0x60FA, 0x0F95,
- 0x60FB, 0x60FB, 0x23B9, 0x60FC, 0x60FF, 0x31D5, 0x6100, 0x6100, 0x1678,
- 0x6101, 0x6101, 0x0513, 0x6102, 0x6105, 0x31D9, 0x6106, 0x6106, 0x1A15,
- 0x6107, 0x6107, 0x31DD, 0x6108, 0x6108, 0x10DF, 0x6109, 0x6109, 0x10C9,
- 0x610A, 0x610C, 0x31DE, 0x610D, 0x610D, 0x1A16, 0x610E, 0x610E, 0x1679,
- 0x610F, 0x610F, 0x1069, 0x6110, 0x6114, 0x31E1, 0x6115, 0x6115, 0x1675,
- 0x6116, 0x6119, 0x31E6, 0x611A, 0x611A, 0x10C3, 0x611B, 0x611B, 0x1E28,
- 0x611C, 0x611C, 0x23BD, 0x611D, 0x611E, 0x31EA, 0x611F, 0x611F, 0x06CB,
- 0x6120, 0x6120, 0x1673, 0x6121, 0x6122, 0x31EC, 0x6123, 0x6123, 0x1676,
- 0x6124, 0x6124, 0x067C, 0x6125, 0x6125, 0x31EE, 0x6126, 0x6126, 0x1674,
- 0x6127, 0x6127, 0x098D, 0x6128, 0x612A, 0x31EF, 0x612B, 0x612B, 0x167A,
- 0x612C, 0x6133, 0x31F2, 0x6134, 0x6134, 0x23B5, 0x6135, 0x6136, 0x31FA,
- 0x6137, 0x6137, 0x23BA, 0x6138, 0x613D, 0x31FC, 0x613E, 0x613E, 0x23B3,
- 0x613F, 0x613F, 0x10FB, 0x6140, 0x6147, 0x3202, 0x6148, 0x6148, 0x054B,
- 0x6149, 0x6149, 0x320A, 0x614A, 0x614A, 0x167B, 0x614B, 0x614B, 0x2162,
- 0x614C, 0x614C, 0x07DA, 0x614D, 0x614D, 0x320B, 0x614E, 0x614E, 0x0D30,
- 0x614F, 0x6150, 0x320C, 0x6151, 0x6151, 0x0D1E, 0x6152, 0x6154, 0x320E,
- 0x6155, 0x6155, 0x0B20, 0x6156, 0x6157, 0x3211, 0x6158, 0x6158, 0x1E5E,
- 0x6159, 0x6159, 0x3213, 0x615A, 0x615A, 0x1E5D, 0x615B, 0x615C, 0x3214,
- 0x615D, 0x615D, 0x1A17, 0x615E, 0x615E, 0x3216, 0x615F, 0x615F, 0x23B7,
- 0x6160, 0x6161, 0x3217, 0x6162, 0x6162, 0x0AA4, 0x6163, 0x6163, 0x1F2F,
- 0x6164, 0x6164, 0x24DF, 0x6165, 0x6166, 0x3219, 0x6167, 0x6167, 0x07F0,
- 0x6168, 0x6168, 0x093B, 0x6169, 0x6169, 0x321B, 0x616A, 0x616A, 0x23B2,
- 0x616B, 0x616B, 0x214E, 0x616C, 0x616D, 0x321C, 0x616E, 0x616E, 0x2052,
- 0x616F, 0x616F, 0x321E, 0x6170, 0x6170, 0x0ECE, 0x6171, 0x6172, 0x321F,
- 0x6173, 0x6173, 0x23BC, 0x6174, 0x6174, 0x3221, 0x6175, 0x6175, 0x167C,
- 0x6176, 0x6176, 0x20EB, 0x6177, 0x6177, 0x0943, 0x6178, 0x6181, 0x3222,
- 0x6182, 0x6182, 0x2232, 0x6183, 0x6189, 0x322C, 0x618A, 0x618A, 0x1E3F,
- 0x618B, 0x618B, 0x0458, 0x618C, 0x618D, 0x3233, 0x618E, 0x618E, 0x113A,
- 0x618F, 0x618F, 0x3235, 0x6190, 0x6190, 0x201B, 0x6191, 0x6191, 0x20BC,
- 0x6192, 0x6192, 0x23BE, 0x6193, 0x6193, 0x3236, 0x6194, 0x6194, 0x167E,
- 0x6195, 0x6199, 0x3237, 0x619A, 0x619A, 0x1EAE, 0x619B, 0x619C, 0x323C,
- 0x619D, 0x619D, 0x1A19, 0x619E, 0x61A3, 0x323E, 0x61A4, 0x61A4, 0x1EFB,
- 0x61A5, 0x61A6, 0x3244, 0x61A7, 0x61A7, 0x167F, 0x61A8, 0x61A8, 0x0760,
- 0x61A9, 0x61A9, 0x1A18, 0x61AA, 0x61AA, 0x3246, 0x61AB, 0x61AB, 0x2089,
- 0x61AC, 0x61AC, 0x167D, 0x61AD, 0x61AD, 0x3247, 0x61AE, 0x61AE, 0x23B1,
- 0x61AF, 0x61B1, 0x3248, 0x61B2, 0x61B2, 0x21C4, 0x61B3, 0x61B5, 0x324B,
- 0x61B6, 0x61B6, 0x2214, 0x61B7, 0x61B7, 0x1680, 0x61B8, 0x61BD, 0x324E,
- 0x61BE, 0x61BE, 0x076D, 0x61BF, 0x61C1, 0x3254, 0x61C2, 0x61C2, 0x05ED,
- 0x61C3, 0x61C6, 0x3257, 0x61C7, 0x61C7, 0x1FDE, 0x61C8, 0x61C8, 0x0F83,
- 0x61C9, 0x61C9, 0x2223, 0x61CA, 0x61CA, 0x03CE, 0x61CB, 0x61CB, 0x1A1A,
- 0x61CC, 0x61CC, 0x23B6, 0x61CD, 0x61D0, 0x325B, 0x61D1, 0x61D1, 0x1A1B,
- 0x61D2, 0x61D2, 0x09AC, 0x61D3, 0x61D3, 0x325F, 0x61D4, 0x61D4, 0x1681,
- 0x61D5, 0x61DD, 0x3260, 0x61DE, 0x61DE, 0x268C, 0x61DF, 0x61DF, 0x24DE,
- 0x61E0, 0x61E2, 0x3269, 0x61E3, 0x61E3, 0x24E0, 0x61E4, 0x61E5, 0x326C,
- 0x61E6, 0x61E6, 0x0B74, 0x61E7, 0x61E7, 0x326E, 0x61E8, 0x61E8, 0x23B8,
- 0x61E9, 0x61F1, 0x326F, 0x61F2, 0x61F2, 0x1E81, 0x61F3, 0x61F4, 0x3278,
- 0x61F5, 0x61F5, 0x1682, 0x61F6, 0x61F6, 0x1FFE, 0x61F7, 0x61F7, 0x1F51,
- 0x61F8, 0x61F8, 0x21E1, 0x61F9, 0x61F9, 0x327A, 0x61FA, 0x61FA, 0x23B0,
- 0x61FB, 0x61FB, 0x327B, 0x61FC, 0x61FC, 0x1FCE, 0x61FD, 0x61FD, 0x327C,
- 0x61FE, 0x61FE, 0x211E, 0x61FF, 0x61FF, 0x13E0, 0x6200, 0x6200, 0x2021,
- 0x6201, 0x6205, 0x327D, 0x6206, 0x6206, 0x1A1C, 0x6207, 0x6207, 0x24E1,
- 0x6208, 0x6208, 0x06E5, 0x6209, 0x6209, 0x3282, 0x620A, 0x620A, 0x0EFB,
- 0x620B, 0x620B, 0x18F9, 0x620C, 0x620C, 0x0FB2, 0x620D, 0x620D, 0x0D90,
- 0x620E, 0x620E, 0x0CB1, 0x620F, 0x620F, 0x0F24, 0x6210, 0x6210, 0x04EE,
- 0x6211, 0x6211, 0x0EE1, 0x6212, 0x6212, 0x08B5, 0x6213, 0x6213, 0x3283,
- 0x6214, 0x6214, 0x24A3, 0x6215, 0x6215, 0x169E, 0x6216, 0x6216, 0x0807,
- 0x6217, 0x6217, 0x18FA, 0x6218, 0x6218, 0x115E, 0x6219, 0x6219, 0x3284,
- 0x621A, 0x621A, 0x0BFC, 0x621B, 0x621B, 0x18FB, 0x621C, 0x621E, 0x3285,
- 0x621F, 0x621F, 0x18FC, 0x6220, 0x6220, 0x3288, 0x6221, 0x6221, 0x18FE,
- 0x6222, 0x6222, 0x18FD, 0x6223, 0x6223, 0x3289, 0x6224, 0x6224, 0x1900,
- 0x6225, 0x6225, 0x18FF, 0x6226, 0x6226, 0x328A, 0x6227, 0x6227, 0x24A4,
- 0x6228, 0x6229, 0x328B, 0x622A, 0x622A, 0x08A9, 0x622B, 0x622B, 0x328D,
- 0x622C, 0x622C, 0x1901, 0x622D, 0x622D, 0x328E, 0x622E, 0x622E, 0x0A65,
- 0x622F, 0x622F, 0x328F, 0x6230, 0x6230, 0x2273, 0x6231, 0x6231, 0x3290,
- 0x6232, 0x6232, 0x21B0, 0x6233, 0x6233, 0x0544, 0x6234, 0x6234, 0x057A,
- 0x6235, 0x6236, 0x3291, 0x6237, 0x6237, 0x07BC, 0x6238, 0x623C, 0x3293,
- 0x623D, 0x623D, 0x19F4, 0x623E, 0x623E, 0x19F3, 0x623F, 0x623F, 0x065C,
- 0x6240, 0x6240, 0x0DEE, 0x6241, 0x6241, 0x044B, 0x6242, 0x6242, 0x3298,
- 0x6243, 0x6243, 0x19F5, 0x6244, 0x6246, 0x3299, 0x6247, 0x6247, 0x0D01,
- 0x6248, 0x6249, 0x19F6, 0x624A, 0x624A, 0x329C, 0x624B, 0x624B, 0x0D6D,
- 0x624C, 0x624C, 0x14BA, 0x624D, 0x624D, 0x048C, 0x624E, 0x624E, 0x113D,
- 0x624F, 0x6250, 0x329D, 0x6251, 0x6251, 0x0BEA, 0x6252, 0x6252, 0x03D2,
- 0x6253, 0x6253, 0x0575, 0x6254, 0x6254, 0x0CAE, 0x6255, 0x6257, 0x329F,
- 0x6258, 0x6258, 0x0E81, 0x6259, 0x625A, 0x32A2, 0x625B, 0x625B, 0x0945,
- 0x625C, 0x6262, 0x32A4, 0x6263, 0x6263, 0x0968, 0x6264, 0x6265, 0x32AB,
- 0x6266, 0x6266, 0x0C21, 0x6267, 0x6267, 0x11B3, 0x6268, 0x6268, 0x32AD,
- 0x6269, 0x6269, 0x0994, 0x626A, 0x626A, 0x14BB, 0x626B, 0x626B, 0x0CE1,
- 0x626C, 0x626C, 0x1018, 0x626D, 0x626D, 0x0B65, 0x626E, 0x626E, 0x03F2,
- 0x626F, 0x626F, 0x04DB, 0x6270, 0x6270, 0x0CA0, 0x6271, 0x6272, 0x32AE,
- 0x6273, 0x6273, 0x03ED, 0x6274, 0x6275, 0x32B0, 0x6276, 0x6276, 0x0693,
- 0x6277, 0x6278, 0x32B2, 0x6279, 0x6279, 0x0BBB, 0x627A, 0x627B, 0x32B4,
- 0x627C, 0x627C, 0x0632, 0x627D, 0x627D, 0x32B6, 0x627E, 0x627E, 0x1173,
- 0x627F, 0x627F, 0x04F5, 0x6280, 0x6280, 0x082F, 0x6281, 0x6283, 0x32B7,
- 0x6284, 0x6284, 0x04D2, 0x6285, 0x6288, 0x32BA, 0x6289, 0x6289, 0x0920,
- 0x628A, 0x628A, 0x03DC, 0x628B, 0x6290, 0x32BE, 0x6291, 0x6291, 0x105D,
- 0x6292, 0x6292, 0x0D7A, 0x6293, 0x6293, 0x1202, 0x6294, 0x6294, 0x32C4,
- 0x6295, 0x6295, 0x0E67, 0x6296, 0x6296, 0x05F5, 0x6297, 0x6297, 0x0946,
- 0x6298, 0x6298, 0x117C, 0x6299, 0x6299, 0x32C5, 0x629A, 0x629A, 0x06A2,
- 0x629B, 0x629B, 0x0B98, 0x629C, 0x629E, 0x32C6, 0x629F, 0x629F, 0x14BC,
- 0x62A0, 0x62A0, 0x0966, 0x62A1, 0x62A1, 0x0A7C, 0x62A2, 0x62A2, 0x0C3D,
- 0x62A3, 0x62A3, 0x32C9, 0x62A4, 0x62A4, 0x07B9, 0x62A5, 0x62A5, 0x0411,
- 0x62A6, 0x62A7, 0x32CA, 0x62A8, 0x62A8, 0x0BAB, 0x62A9, 0x62AA, 0x32CC,
- 0x62AB, 0x62AB, 0x0BBC, 0x62AC, 0x62AC, 0x0DFA, 0x62AD, 0x62B0, 0x32CE,
- 0x62B1, 0x62B1, 0x0410, 0x62B2, 0x62B4, 0x32D2, 0x62B5, 0x62B5, 0x05B7,
- 0x62B6, 0x62B8, 0x32D5, 0x62B9, 0x62B9, 0x0B0B, 0x62BA, 0x62BA, 0x32D8,
- 0x62BB, 0x62BB, 0x14BD, 0x62BC, 0x62BC, 0x0FE3, 0x62BD, 0x62BD, 0x050E,
- 0x62BE, 0x62BE, 0x32D9, 0x62BF, 0x62BF, 0x0AF7, 0x62C0, 0x62C1, 0x32DA,
- 0x62C2, 0x62C2, 0x0694, 0x62C3, 0x62C3, 0x32DC, 0x62C4, 0x62C4, 0x11F3,
- 0x62C5, 0x62C5, 0x0584, 0x62C6, 0x62C6, 0x04B7, 0x62C7, 0x62C7, 0x0B17,
- 0x62C8, 0x62C8, 0x0B4C, 0x62C9, 0x62C9, 0x0998, 0x62CA, 0x62CA, 0x14BE,
- 0x62CB, 0x62CB, 0x32DD, 0x62CC, 0x62CC, 0x03F3, 0x62CD, 0x62CD, 0x0B85,
- 0x62CE, 0x62CE, 0x0A29, 0x62CF, 0x62CF, 0x32DE, 0x62D0, 0x62D0, 0x072E,
- 0x62D1, 0x62D1, 0x32DF, 0x62D2, 0x62D2, 0x090B, 0x62D3, 0x62D3, 0x0E89,
- 0x62D4, 0x62D4, 0x03D9, 0x62D5, 0x62D5, 0x32E0, 0x62D6, 0x62D6, 0x0E80,
- 0x62D7, 0x62D7, 0x14C0, 0x62D8, 0x62D8, 0x08FF, 0x62D9, 0x62D9, 0x121B,
- 0x62DA, 0x62DA, 0x14BF, 0x62DB, 0x62DB, 0x1171, 0x62DC, 0x62DC, 0x03E8,
- 0x62DD, 0x62DE, 0x32E1, 0x62DF, 0x62DF, 0x0B45, 0x62E0, 0x62E1, 0x32E3,
- 0x62E2, 0x62E2, 0x0A4A, 0x62E3, 0x62E3, 0x0863, 0x62E4, 0x62E4, 0x32E5,
- 0x62E5, 0x62E5, 0x109A, 0x62E6, 0x62E6, 0x09A4, 0x62E7, 0x62E7, 0x0B62,
- 0x62E8, 0x62E8, 0x046D, 0x62E9, 0x62E9, 0x1134, 0x62EA, 0x62EB, 0x32E6,
- 0x62EC, 0x62EC, 0x0993, 0x62ED, 0x62ED, 0x0D5A, 0x62EE, 0x62EE, 0x14C1,
- 0x62EF, 0x62EF, 0x119D, 0x62F0, 0x62F0, 0x32E8, 0x62F1, 0x62F1, 0x0709,
- 0x62F2, 0x62F2, 0x32E9, 0x62F3, 0x62F3, 0x0C88, 0x62F4, 0x62F4, 0x0D9E,
- 0x62F5, 0x62F5, 0x32EA, 0x62F6, 0x62F6, 0x14C3, 0x62F7, 0x62F7, 0x094A,
- 0x62F8, 0x62FB, 0x32EB, 0x62FC, 0x62FC, 0x0BD3, 0x62FD, 0x62FD, 0x1204,
- 0x62FE, 0x62FE, 0x0D47, 0x62FF, 0x62FF, 0x0B26, 0x6300, 0x6300, 0x32EF,
- 0x6301, 0x6301, 0x04FB, 0x6302, 0x6302, 0x072B, 0x6303, 0x6306, 0x32F0,
- 0x6307, 0x6307, 0x11B7, 0x6308, 0x6308, 0x194E, 0x6309, 0x6309, 0x03BF,
- 0x630A, 0x630D, 0x32F4, 0x630E, 0x630E, 0x0973, 0x630F, 0x6310, 0x32F8,
- 0x6311, 0x6311, 0x0E47, 0x6312, 0x6315, 0x32FA, 0x6316, 0x6316, 0x0E8B,
- 0x6317, 0x6319, 0x32FE, 0x631A, 0x631A, 0x11BE, 0x631B, 0x631B, 0x0A75,
- 0x631C, 0x631C, 0x3301, 0x631D, 0x631D, 0x0EDD, 0x631E, 0x631E, 0x0DF5,
- 0x631F, 0x631F, 0x0F79, 0x6320, 0x6320, 0x0B36, 0x6321, 0x6321, 0x0593,
- 0x6322, 0x6322, 0x14C2, 0x6323, 0x6323, 0x1196, 0x6324, 0x6324, 0x082A,
- 0x6325, 0x6325, 0x07E8, 0x6326, 0x6327, 0x3302, 0x6328, 0x6328, 0x03AF,
- 0x6329, 0x6329, 0x3304, 0x632A, 0x632A, 0x0B73, 0x632B, 0x632B, 0x056F,
- 0x632C, 0x632E, 0x3305, 0x632F, 0x632F, 0x1192, 0x6330, 0x6331, 0x3308,
- 0x6332, 0x6332, 0x194F, 0x6333, 0x6338, 0x330A, 0x6339, 0x6339, 0x14C4,
- 0x633A, 0x633A, 0x0E57, 0x633B, 0x633C, 0x3310, 0x633D, 0x633D, 0x0E9D,
- 0x633E, 0x633E, 0x21D1, 0x633F, 0x6341, 0x3312, 0x6342, 0x6342, 0x0EF5,
- 0x6343, 0x6343, 0x14C6, 0x6344, 0x6344, 0x3315, 0x6345, 0x6345, 0x0E62,
- 0x6346, 0x6346, 0x0991, 0x6347, 0x6348, 0x3316, 0x6349, 0x6349, 0x121A,
- 0x634A, 0x634A, 0x3318, 0x634B, 0x634B, 0x14C5, 0x634C, 0x634C, 0x03D1,
- 0x634D, 0x634D, 0x076B, 0x634E, 0x634E, 0x0D0C, 0x634F, 0x634F, 0x0B56,
- 0x6350, 0x6350, 0x0917, 0x6351, 0x6354, 0x3319, 0x6355, 0x6355, 0x047D,
- 0x6356, 0x635D, 0x331D, 0x635E, 0x635E, 0x09B7, 0x635F, 0x635F, 0x0DE5,
- 0x6360, 0x6360, 0x3325, 0x6361, 0x6361, 0x0864, 0x6362, 0x6362, 0x07D0,
- 0x6363, 0x6363, 0x0598, 0x6364, 0x6366, 0x3326, 0x6367, 0x6367, 0x0BB6,
- 0x6368, 0x6368, 0x211C, 0x6369, 0x6369, 0x14D0, 0x636A, 0x636A, 0x3329,
- 0x636B, 0x636B, 0x235D, 0x636C, 0x636C, 0x332A, 0x636D, 0x636D, 0x14CD,
- 0x636E, 0x636E, 0x090C, 0x636F, 0x6370, 0x332B, 0x6371, 0x6371, 0x14C9,
- 0x6372, 0x6372, 0x2682, 0x6373, 0x6375, 0x332D, 0x6376, 0x6376, 0x053A,
- 0x6377, 0x6377, 0x08AE, 0x6378, 0x6379, 0x3330, 0x637A, 0x637A, 0x14CA,
- 0x637B, 0x637B, 0x0B50, 0x637C, 0x637F, 0x3332, 0x6380, 0x6380, 0x0F33,
- 0x6381, 0x6381, 0x3336, 0x6382, 0x6382, 0x05C1, 0x6383, 0x6383, 0x210D,
- 0x6384, 0x6384, 0x205A, 0x6385, 0x6386, 0x3337, 0x6387, 0x6387, 0x061D,
- 0x6388, 0x6388, 0x0D71, 0x6389, 0x6389, 0x05D5, 0x638A, 0x638A, 0x14CF,
- 0x638B, 0x638B, 0x3339, 0x638C, 0x638C, 0x1167, 0x638D, 0x638D, 0x333A,
- 0x638E, 0x638E, 0x14CB, 0x638F, 0x638F, 0x0E20, 0x6390, 0x6390, 0x0C1D,
- 0x6391, 0x6391, 0x333B, 0x6392, 0x6392, 0x0B86, 0x6393, 0x6395, 0x333C,
- 0x6396, 0x6396, 0x103B, 0x6397, 0x6397, 0x333F, 0x6398, 0x6398, 0x0921,
- 0x6399, 0x639F, 0x3340, 0x63A0, 0x63A0, 0x0A7A, 0x63A1, 0x63A1, 0x3347,
- 0x63A2, 0x63A2, 0x0E10, 0x63A3, 0x63A3, 0x04DD, 0x63A4, 0x63A4, 0x3348,
- 0x63A5, 0x63A5, 0x08A4, 0x63A6, 0x63A6, 0x3349, 0x63A7, 0x63A7, 0x0965,
- 0x63A8, 0x63A8, 0x0E77, 0x63A9, 0x63A9, 0x1003, 0x63AA, 0x63AA, 0x056E,
- 0x63AB, 0x63AB, 0x334A, 0x63AC, 0x63AC, 0x14CE, 0x63AD, 0x63AD, 0x14C7,
- 0x63AE, 0x63AE, 0x14D1, 0x63AF, 0x63AF, 0x334B, 0x63B0, 0x63B0, 0x1950,
- 0x63B1, 0x63B2, 0x334C, 0x63B3, 0x63B3, 0x0A57, 0x63B4, 0x63B4, 0x14CC,
- 0x63B5, 0x63B6, 0x334E, 0x63B7, 0x63B7, 0x11BF, 0x63B8, 0x63B8, 0x0588,
- 0x63B9, 0x63B9, 0x3350, 0x63BA, 0x63BA, 0x04BB, 0x63BB, 0x63BB, 0x3351,
- 0x63BC, 0x63BC, 0x14D2, 0x63BD, 0x63BD, 0x3352, 0x63BE, 0x63BE, 0x14DC,
- 0x63BF, 0x63BF, 0x3353, 0x63C0, 0x63C0, 0x1F8D, 0x63C1, 0x63C3, 0x3354,
- 0x63C4, 0x63C4, 0x14D7, 0x63C5, 0x63C5, 0x3357, 0x63C6, 0x63C6, 0x14DB,
- 0x63C7, 0x63C8, 0x3358, 0x63C9, 0x63C9, 0x0CBB, 0x63CA, 0x63CC, 0x335A,
- 0x63CD, 0x63CD, 0x123E, 0x63CE, 0x63CE, 0x14D9, 0x63CF, 0x63CF, 0x0AED,
- 0x63D0, 0x63D0, 0x0E34, 0x63D1, 0x63D1, 0x335D, 0x63D2, 0x63D2, 0x04AC,
- 0x63D3, 0x63D5, 0x335E, 0x63D6, 0x63D6, 0x1045, 0x63D7, 0x63D9, 0x3361,
- 0x63DA, 0x63DA, 0x21FF, 0x63DB, 0x63DD, 0x3364, 0x63DE, 0x63DE, 0x14D8,
- 0x63DF, 0x63DF, 0x3367, 0x63E0, 0x63E0, 0x14D5, 0x63E1, 0x63E1, 0x0EE4,
- 0x63E2, 0x63E2, 0x3368, 0x63E3, 0x63E3, 0x052A, 0x63E4, 0x63E8, 0x3369,
- 0x63E9, 0x63E9, 0x0938, 0x63EA, 0x63EA, 0x08ED, 0x63EB, 0x63EC, 0x336E,
- 0x63ED, 0x63ED, 0x08A3, 0x63EE, 0x63EE, 0x1F58, 0x63EF, 0x63F1, 0x3370,
- 0x63F2, 0x63F2, 0x14D3, 0x63F3, 0x63F3, 0x3373, 0x63F4, 0x63F4, 0x10F1,
- 0x63F5, 0x63F5, 0x3374, 0x63F6, 0x63F6, 0x14C8, 0x63F7, 0x63F7, 0x3375,
- 0x63F8, 0x63F8, 0x14D4, 0x63F9, 0x63FC, 0x3376, 0x63FD, 0x63FD, 0x09AA,
- 0x63FE, 0x63FE, 0x337A, 0x63FF, 0x63FF, 0x14D6, 0x6400, 0x6400, 0x04BA,
- 0x6401, 0x6401, 0x06E4, 0x6402, 0x6402, 0x0A4E, 0x6403, 0x6404, 0x337B,
- 0x6405, 0x6405, 0x0892, 0x6406, 0x640A, 0x337D, 0x640B, 0x640B, 0x14DF,
- 0x640C, 0x640C, 0x14E2, 0x640D, 0x640D, 0x215B, 0x640E, 0x640E, 0x3382,
- 0x640F, 0x640F, 0x0472, 0x6410, 0x6410, 0x0527, 0x6411, 0x6412, 0x3383,
- 0x6413, 0x6413, 0x056D, 0x6414, 0x6414, 0x0CDF, 0x6415, 0x6416, 0x3385,
- 0x6417, 0x6417, 0x1EB6, 0x6418, 0x641A, 0x3387, 0x641B, 0x641B, 0x14E0,
- 0x641C, 0x641C, 0x0DC6, 0x641D, 0x641D, 0x338A, 0x641E, 0x641E, 0x06DE,
- 0x641F, 0x641F, 0x338B, 0x6420, 0x6420, 0x14E1, 0x6421, 0x6421, 0x14E4,
- 0x6422, 0x6425, 0x338C, 0x6426, 0x6426, 0x14E3, 0x6427, 0x6429, 0x3390,
- 0x642A, 0x642A, 0x0E15, 0x642B, 0x642B, 0x3393, 0x642C, 0x642C, 0x03EC,
- 0x642D, 0x642D, 0x0571, 0x642E, 0x6433, 0x3394, 0x6434, 0x6434, 0x1736,
- 0x6435, 0x6435, 0x339A, 0x6436, 0x6436, 0x20DB, 0x6437, 0x6439, 0x339B,
- 0x643A, 0x643A, 0x0F7A, 0x643B, 0x643C, 0x339E, 0x643D, 0x643D, 0x04B2,
- 0x643E, 0x643E, 0x33A0, 0x643F, 0x643F, 0x1951, 0x6440, 0x6440, 0x33A1,
- 0x6441, 0x6441, 0x14DE, 0x6442, 0x6443, 0x33A2, 0x6444, 0x6444, 0x0D1C,
- 0x6445, 0x6445, 0x14DD, 0x6446, 0x6446, 0x03E5, 0x6447, 0x6447, 0x1028,
- 0x6448, 0x6448, 0x0460, 0x6449, 0x6449, 0x33A4, 0x644A, 0x644A, 0x0E02,
- 0x644B, 0x6450, 0x33A5, 0x6451, 0x6451, 0x2360, 0x6452, 0x6452, 0x14DA,
- 0x6453, 0x6453, 0x33AB, 0x6454, 0x6454, 0x0D99, 0x6455, 0x6457, 0x33AC,
- 0x6458, 0x6458, 0x114B, 0x6459, 0x645B, 0x33AF, 0x645C, 0x645C, 0x2361,
- 0x645D, 0x645D, 0x33B2, 0x645E, 0x645E, 0x14E5, 0x645F, 0x645F, 0x2040,
- 0x6460, 0x6466, 0x33B3, 0x6467, 0x6467, 0x0560, 0x6468, 0x6468, 0x33BA,
- 0x6469, 0x6469, 0x0B09, 0x646A, 0x646C, 0x33BB, 0x646D, 0x646D, 0x14E7,
- 0x646E, 0x646E, 0x33BE, 0x646F, 0x646F, 0x228E, 0x6470, 0x6472, 0x33BF,
- 0x6473, 0x6473, 0x1FDF, 0x6474, 0x6475, 0x33C2, 0x6476, 0x6476, 0x235E,
- 0x6477, 0x6477, 0x33C4, 0x6478, 0x6479, 0x0B03, 0x647A, 0x647A, 0x14E9,
- 0x647B, 0x647B, 0x1E6A, 0x647C, 0x6481, 0x33C5, 0x6482, 0x6482, 0x0A15,
- 0x6483, 0x6483, 0x33CB, 0x6484, 0x6484, 0x14E6, 0x6485, 0x6485, 0x091E,
- 0x6486, 0x6486, 0x33CC, 0x6487, 0x6487, 0x0BD1, 0x6488, 0x6488, 0x2002,
- 0x6489, 0x6490, 0x33CD, 0x6491, 0x6491, 0x04EA, 0x6492, 0x6492, 0x0CD1,
- 0x6493, 0x6493, 0x2093, 0x6494, 0x6494, 0x33D5, 0x6495, 0x6495, 0x0DAF,
- 0x6496, 0x6496, 0x14E8, 0x6497, 0x6498, 0x33D6, 0x6499, 0x6499, 0x14EC,
- 0x649A, 0x649D, 0x33D8, 0x649E, 0x649E, 0x120F, 0x649F, 0x649F, 0x235F,
- 0x64A0, 0x64A2, 0x33DC, 0x64A3, 0x64A3, 0x1EAC, 0x64A4, 0x64A4, 0x04DC,
- 0x64A5, 0x64A5, 0x1E54, 0x64A6, 0x64A8, 0x33DF, 0x64A9, 0x64A9, 0x0A0C,
- 0x64AA, 0x64AA, 0x33E2, 0x64AB, 0x64AB, 0x1F08, 0x64AC, 0x64AC, 0x0C48,
- 0x64AD, 0x64AD, 0x046C, 0x64AE, 0x64AE, 0x056C, 0x64AF, 0x64AF, 0x33E3,
- 0x64B0, 0x64B0, 0x1208, 0x64B1, 0x64B1, 0x33E4, 0x64B2, 0x64B2, 0x20C0,
- 0x64B3, 0x64B3, 0x2362, 0x64B4, 0x64B4, 0x33E5, 0x64B5, 0x64B5, 0x0B4F,
- 0x64B6, 0x64B6, 0x33E6, 0x64B7, 0x64B8, 0x14EA, 0x64B9, 0x64B9, 0x33E7,
- 0x64BA, 0x64BA, 0x14ED, 0x64BB, 0x64BB, 0x2160, 0x64BC, 0x64BC, 0x076A,
- 0x64BD, 0x64BD, 0x33E8, 0x64BE, 0x64BE, 0x219D, 0x64BF, 0x64BF, 0x1F8E,
- 0x64C0, 0x64C0, 0x14EE, 0x64C1, 0x64C1, 0x222D, 0x64C2, 0x64C2, 0x09C9,
- 0x64C3, 0x64C3, 0x33E9, 0x64C4, 0x64C4, 0x2047, 0x64C5, 0x64C5, 0x0CFC,
- 0x64C6, 0x64C6, 0x33EA, 0x64C7, 0x64C7, 0x2262, 0x64C8, 0x64C9, 0x33EB,
- 0x64CA, 0x64CA, 0x1F67, 0x64CB, 0x64CB, 0x1EB2, 0x64CC, 0x64CC, 0x33ED,
- 0x64CD, 0x64CD, 0x04A0, 0x64CE, 0x64CE, 0x0C63, 0x64CF, 0x64CF, 0x33EE,
- 0x64D0, 0x64D0, 0x14EF, 0x64D1, 0x64D1, 0x33EF, 0x64D2, 0x64D2, 0x0C59,
- 0x64D3, 0x64D3, 0x33F0, 0x64D4, 0x64D4, 0x1EA9, 0x64D5, 0x64D6, 0x33F1,
- 0x64D7, 0x64D7, 0x14F0, 0x64D8, 0x64D8, 0x1952, 0x64D9, 0x64D9, 0x33F3,
- 0x64DA, 0x64DA, 0x1FCC, 0x64DB, 0x64DD, 0x33F4, 0x64DE, 0x64DE, 0x0DC8,
- 0x64DF, 0x64DF, 0x33F7, 0x64E0, 0x64E0, 0x1F72, 0x64E1, 0x64E1, 0x33F8,
- 0x64E2, 0x64E2, 0x14F2, 0x64E3, 0x64E3, 0x33F9, 0x64E4, 0x64E4, 0x14F1,
- 0x64E5, 0x64E5, 0x33FA, 0x64E6, 0x64E6, 0x0488, 0x64E7, 0x64EB, 0x33FB,
- 0x64EC, 0x64EC, 0x2098, 0x64ED, 0x64EE, 0x3400, 0x64EF, 0x64EF, 0x1E52,
- 0x64F0, 0x64F0, 0x20A4, 0x64F1, 0x64F1, 0x1F1C, 0x64F2, 0x64F2, 0x228F,
- 0x64F3, 0x64F3, 0x3402, 0x64F4, 0x64F4, 0x1FED, 0x64F5, 0x64F6, 0x3403,
- 0x64F7, 0x64F7, 0x2365, 0x64F8, 0x64F9, 0x3405, 0x64FA, 0x64FA, 0x1E2D,
- 0x64FB, 0x64FB, 0x2152, 0x64FC, 0x64FC, 0x2366, 0x64FD, 0x64FD, 0x3407,
- 0x64FE, 0x64FE, 0x20FA, 0x64FF, 0x64FF, 0x3408, 0x6500, 0x6500, 0x0B8B,
- 0x6501, 0x6503, 0x3409, 0x6504, 0x6504, 0x2363, 0x6505, 0x6505, 0x340C,
- 0x6506, 0x6506, 0x209A, 0x6507, 0x6508, 0x340D, 0x6509, 0x6509, 0x14F3,
- 0x650A, 0x650E, 0x340F, 0x650F, 0x650F, 0x203C, 0x6510, 0x6511, 0x3414,
- 0x6512, 0x6512, 0x111F, 0x6513, 0x6513, 0x3416, 0x6514, 0x6514, 0x1FF6,
- 0x6515, 0x6515, 0x3417, 0x6516, 0x6516, 0x2364, 0x6517, 0x6517, 0x3418,
- 0x6518, 0x6518, 0x0C9C, 0x6519, 0x6519, 0x1E69, 0x651A, 0x651A, 0x3419,
- 0x651B, 0x651B, 0x2367, 0x651C, 0x651C, 0x341A, 0x651D, 0x651D, 0x211D,
- 0x651E, 0x6521, 0x341B, 0x6522, 0x6522, 0x2259, 0x6523, 0x6523, 0x2056,
- 0x6524, 0x6524, 0x2163, 0x6525, 0x6525, 0x14F4, 0x6526, 0x6529, 0x341F,
- 0x652A, 0x652A, 0x1FA9, 0x652B, 0x652B, 0x091F, 0x652C, 0x652C, 0x1FFC,
- 0x652D, 0x652D, 0x3423, 0x652E, 0x652E, 0x14F5, 0x652F, 0x652F, 0x11A6,
- 0x6530, 0x6533, 0x3424, 0x6534, 0x6534, 0x1909, 0x6535, 0x6535, 0x1966,
- 0x6536, 0x6536, 0x0D6C, 0x6537, 0x6537, 0x3428, 0x6538, 0x6538, 0x12B2,
- 0x6539, 0x6539, 0x06BF, 0x653A, 0x653A, 0x3429, 0x653B, 0x653B, 0x06FE,
- 0x653C, 0x653D, 0x342A, 0x653E, 0x653E, 0x0662, 0x653F, 0x653F, 0x119F,
- 0x6540, 0x6544, 0x342C, 0x6545, 0x6545, 0x0723, 0x6546, 0x6547, 0x3431,
- 0x6548, 0x6548, 0x0F72, 0x6549, 0x6549, 0x1CCB, 0x654A, 0x654B, 0x3433,
- 0x654C, 0x654C, 0x05B1, 0x654D, 0x654E, 0x3435, 0x654F, 0x654F, 0x0AF9,
- 0x6550, 0x6550, 0x3437, 0x6551, 0x6551, 0x08F7, 0x6552, 0x6554, 0x3438,
- 0x6555, 0x6555, 0x1967, 0x6556, 0x6556, 0x03C8, 0x6557, 0x6557, 0x1E2E,
- 0x6558, 0x6558, 0x343B, 0x6559, 0x6559, 0x089D, 0x655A, 0x655A, 0x343C,
- 0x655B, 0x655B, 0x09FB, 0x655C, 0x655C, 0x343D, 0x655D, 0x655D, 0x043F,
- 0x655E, 0x655E, 0x04CD, 0x655F, 0x6561, 0x343E, 0x6562, 0x6562, 0x06CD,
- 0x6563, 0x6563, 0x0CDB, 0x6564, 0x6565, 0x3441, 0x6566, 0x6566, 0x0617,
- 0x6567, 0x656A, 0x3443, 0x656B, 0x656B, 0x1968, 0x656C, 0x656C, 0x08E3,
- 0x656D, 0x656F, 0x3447, 0x6570, 0x6570, 0x0D94, 0x6571, 0x6571, 0x344A,
- 0x6572, 0x6572, 0x0C40, 0x6573, 0x6573, 0x344B, 0x6574, 0x6574, 0x119C,
- 0x6575, 0x6575, 0x1EBC, 0x6576, 0x6576, 0x344C, 0x6577, 0x6577, 0x0690,
- 0x6578, 0x6578, 0x2142, 0x6579, 0x6581, 0x344D, 0x6582, 0x6582, 0x201E,
- 0x6583, 0x6583, 0x1E43, 0x6584, 0x6586, 0x3456, 0x6587, 0x6587, 0x0ED3,
- 0x6588, 0x658A, 0x3459, 0x658B, 0x658B, 0x114C, 0x658C, 0x658C, 0x045C,
- 0x658D, 0x658F, 0x345C, 0x6590, 0x6590, 0x19C1, 0x6591, 0x6591, 0x03EA,
- 0x6592, 0x6592, 0x345F, 0x6593, 0x6593, 0x19C3, 0x6594, 0x6594, 0x3460,
- 0x6595, 0x6595, 0x24D4, 0x6596, 0x6596, 0x3461, 0x6597, 0x6597, 0x05F6,
- 0x6598, 0x6598, 0x3462, 0x6599, 0x6599, 0x0A18, 0x659A, 0x659A, 0x3463,
- 0x659B, 0x659B, 0x1D56, 0x659C, 0x659C, 0x0F7C, 0x659D, 0x659E, 0x3464,
- 0x659F, 0x659F, 0x1186, 0x65A0, 0x65A0, 0x3466, 0x65A1, 0x65A1, 0x0EE2,
- 0x65A2, 0x65A3, 0x3467, 0x65A4, 0x65A4, 0x08C0, 0x65A5, 0x65A5, 0x0507,
- 0x65A6, 0x65A6, 0x3469, 0x65A7, 0x65A7, 0x06A6, 0x65A8, 0x65A8, 0x346A,
- 0x65A9, 0x65A9, 0x1157, 0x65AA, 0x65AA, 0x346B, 0x65AB, 0x65AB, 0x1A29,
- 0x65AC, 0x65AC, 0x226F, 0x65AD, 0x65AD, 0x060E, 0x65AE, 0x65AE, 0x346C,
- 0x65AF, 0x65AF, 0x0DAE, 0x65B0, 0x65B0, 0x0F8D, 0x65B1, 0x65B6, 0x346D,
- 0x65B7, 0x65B7, 0x1ED7, 0x65B8, 0x65B8, 0x3473, 0x65B9, 0x65B9, 0x065A,
- 0x65BA, 0x65BB, 0x3474, 0x65BC, 0x65BC, 0x19C4, 0x65BD, 0x65BD, 0x0D40,
- 0x65BE, 0x65C0, 0x3476, 0x65C1, 0x65C1, 0x0B95, 0x65C2, 0x65C2, 0x3479,
- 0x65C3, 0x65C3, 0x19C7, 0x65C4, 0x65C4, 0x19C6, 0x65C5, 0x65C5, 0x0A6A,
- 0x65C6, 0x65C6, 0x19C5, 0x65C7, 0x65CA, 0x347A, 0x65CB, 0x65CB, 0x0FC8,
- 0x65CC, 0x65CC, 0x19C8, 0x65CD, 0x65CD, 0x347E, 0x65CE, 0x65CE, 0x19C9,
- 0x65CF, 0x65CF, 0x1242, 0x65D0, 0x65D1, 0x347F, 0x65D2, 0x65D2, 0x19CA,
- 0x65D3, 0x65D5, 0x3481, 0x65D6, 0x65D6, 0x19CB, 0x65D7, 0x65D7, 0x0C0B,
- 0x65D8, 0x65DF, 0x3484, 0x65E0, 0x65E0, 0x0EED, 0x65E1, 0x65E1, 0x348C,
- 0x65E2, 0x65E2, 0x083B, 0x65E3, 0x65E4, 0x348D, 0x65E5, 0x65E5, 0x0CB0,
- 0x65E6, 0x65E6, 0x058A, 0x65E7, 0x65E7, 0x08F8, 0x65E8, 0x65E8, 0x11BB,
- 0x65E9, 0x65E9, 0x112A, 0x65EA, 0x65EB, 0x348F, 0x65EC, 0x65EC, 0x0FD7,
- 0x65ED, 0x65ED, 0x0FBC, 0x65EE, 0x65F0, 0x190A, 0x65F1, 0x65F1, 0x076C,
- 0x65F2, 0x65F5, 0x3491, 0x65F6, 0x65F6, 0x0D48, 0x65F7, 0x65F7, 0x0982,
- 0x65F8, 0x65F9, 0x3495, 0x65FA, 0x65FA, 0x0EAB, 0x65FB, 0x65FF, 0x3497,
- 0x6600, 0x6600, 0x1912, 0x6601, 0x6601, 0x349C, 0x6602, 0x6602, 0x03C5,
- 0x6603, 0x6603, 0x1910, 0x6604, 0x6605, 0x349D, 0x6606, 0x6606, 0x0990,
- 0x6607, 0x6609, 0x349F, 0x660A, 0x660A, 0x190D, 0x660B, 0x660B, 0x34A2,
- 0x660C, 0x660C, 0x04C4, 0x660D, 0x660D, 0x34A3, 0x660E, 0x660E, 0x0AFC,
- 0x660F, 0x660F, 0x07FD, 0x6610, 0x6612, 0x34A4, 0x6613, 0x6613, 0x105E,
- 0x6614, 0x6614, 0x0F03, 0x6615, 0x6615, 0x1911, 0x6616, 0x6618, 0x34A7,
- 0x6619, 0x6619, 0x190E, 0x661A, 0x661C, 0x34AA, 0x661D, 0x661D, 0x1915,
- 0x661E, 0x661E, 0x34AD, 0x661F, 0x661F, 0x0F92, 0x6620, 0x6620, 0x1098,
- 0x6621, 0x6624, 0x34AE, 0x6625, 0x6625, 0x053D, 0x6626, 0x6626, 0x34B2,
- 0x6627, 0x6627, 0x0AC6, 0x6628, 0x6628, 0x124F, 0x6629, 0x662C, 0x34B3,
- 0x662D, 0x662D, 0x1172, 0x662E, 0x662E, 0x34B7, 0x662F, 0x662F, 0x0D5E,
- 0x6630, 0x6630, 0x34B8, 0x6631, 0x6631, 0x1917, 0x6632, 0x6633, 0x34B9,
- 0x6634, 0x6634, 0x1916, 0x6635, 0x6635, 0x1919, 0x6636, 0x6636, 0x1918,
- 0x6637, 0x663B, 0x34BB, 0x663C, 0x663C, 0x11E6, 0x663D, 0x663D, 0x34C0,
- 0x663E, 0x663E, 0x0F41, 0x663F, 0x6640, 0x34C1, 0x6641, 0x6641, 0x191D,
- 0x6642, 0x6642, 0x212D, 0x6643, 0x6643, 0x07E3, 0x6644, 0x664A, 0x34C3,
- 0x664B, 0x664B, 0x08CB, 0x664C, 0x664C, 0x0D07, 0x664D, 0x664E, 0x34CA,
- 0x664F, 0x664F, 0x191E, 0x6650, 0x6651, 0x34CC, 0x6652, 0x6652, 0x0CF2,
- 0x6653, 0x6653, 0x0F6B, 0x6654, 0x6654, 0x191C, 0x6655, 0x6655, 0x1111,
- 0x6656, 0x6656, 0x191F, 0x6657, 0x6657, 0x1921, 0x6658, 0x6659, 0x34CE,
- 0x665A, 0x665A, 0x0E9E, 0x665B, 0x665C, 0x34D0, 0x665D, 0x665D, 0x229B,
- 0x665E, 0x665E, 0x34D2, 0x665F, 0x665F, 0x191B, 0x6660, 0x6660, 0x34D3,
- 0x6661, 0x6661, 0x1920, 0x6662, 0x6663, 0x34D4, 0x6664, 0x6664, 0x0EFD,
- 0x6665, 0x6665, 0x34D6, 0x6666, 0x6666, 0x07F3, 0x6667, 0x6667, 0x34D7,
- 0x6668, 0x6668, 0x04E4, 0x6669, 0x666D, 0x34D8, 0x666E, 0x666E, 0x0BF4,
- 0x666F, 0x666F, 0x08DF, 0x6670, 0x6670, 0x0F09, 0x6671, 0x6673, 0x34DD,
- 0x6674, 0x6674, 0x0C64, 0x6675, 0x6675, 0x34E0, 0x6676, 0x6676, 0x08D6,
- 0x6677, 0x6677, 0x1922, 0x6678, 0x6679, 0x34E1, 0x667A, 0x667A, 0x11C6,
- 0x667B, 0x667D, 0x34E3, 0x667E, 0x667E, 0x0A09, 0x667F, 0x6681, 0x34E6,
- 0x6682, 0x6682, 0x1120, 0x6683, 0x6683, 0x34E9, 0x6684, 0x6684, 0x1923,
- 0x6685, 0x6686, 0x34EA, 0x6687, 0x6687, 0x0F2B, 0x6688, 0x6688, 0x2256,
- 0x6689, 0x6689, 0x24A8, 0x668A, 0x668B, 0x34EC, 0x668C, 0x668C, 0x1924,
- 0x668D, 0x6690, 0x34EE, 0x6691, 0x6691, 0x0D85, 0x6692, 0x6695, 0x34F2,
- 0x6696, 0x6696, 0x0B70, 0x6697, 0x6697, 0x03C0, 0x6698, 0x669C, 0x34F6,
- 0x669D, 0x669D, 0x1926, 0x669E, 0x66A1, 0x34FB, 0x66A2, 0x66A2, 0x1E79,
- 0x66A3, 0x66A6, 0x34FF, 0x66A7, 0x66A7, 0x1925, 0x66A8, 0x66A8, 0x1CDD,
- 0x66A9, 0x66AA, 0x3503, 0x66AB, 0x66AB, 0x225A, 0x66AC, 0x66AD, 0x3505,
- 0x66AE, 0x66AE, 0x0B1D, 0x66AF, 0x66B3, 0x3507, 0x66B4, 0x66B4, 0x0412,
- 0x66B5, 0x66B8, 0x350C, 0x66B9, 0x66B9, 0x175B, 0x66BA, 0x66BD, 0x3510,
- 0x66BE, 0x66BE, 0x1927, 0x66BF, 0x66C3, 0x3514, 0x66C4, 0x66C4, 0x24A7,
- 0x66C5, 0x66C5, 0x3519, 0x66C6, 0x66C6, 0x2686, 0x66C7, 0x66C7, 0x24A6,
- 0x66C8, 0x66C8, 0x351A, 0x66C9, 0x66C9, 0x21CE, 0x66CA, 0x66D5, 0x351B,
- 0x66D6, 0x66D6, 0x24A9, 0x66D7, 0x66D8, 0x3527, 0x66D9, 0x66D9, 0x0D86,
- 0x66DA, 0x66DA, 0x3529, 0x66DB, 0x66DC, 0x1928, 0x66DD, 0x66DD, 0x0BF7,
- 0x66DE, 0x66DF, 0x352A, 0x66E0, 0x66E0, 0x1FE7, 0x66E1, 0x66E5, 0x352C,
- 0x66E6, 0x66E6, 0x192A, 0x66E7, 0x66E8, 0x3531, 0x66E9, 0x66E9, 0x192B,
- 0x66EA, 0x66EB, 0x3533, 0x66EC, 0x66EC, 0x2112, 0x66ED, 0x66EF, 0x3535,
- 0x66F0, 0x66F0, 0x10FE, 0x66F1, 0x66F1, 0x3538, 0x66F2, 0x66F2, 0x0C77,
- 0x66F3, 0x66F3, 0x103E, 0x66F4, 0x66F4, 0x06F7, 0x66F5, 0x66F6, 0x3539,
- 0x66F7, 0x66F7, 0x1914, 0x66F8, 0x66F8, 0x213C, 0x66F9, 0x66F9, 0x04A3,
- 0x66FA, 0x66FB, 0x353B, 0x66FC, 0x66FC, 0x0AA3, 0x66FD, 0x66FD, 0x353D,
- 0x66FE, 0x66FE, 0x113B, 0x66FF, 0x66FF, 0x0E39, 0x6700, 0x6700, 0x124B,
- 0x6701, 0x6702, 0x353E, 0x6703, 0x6703, 0x1F5C, 0x6704, 0x6707, 0x3540,
- 0x6708, 0x6708, 0x1105, 0x6709, 0x6709, 0x10B5, 0x670A, 0x670A, 0x1973,
- 0x670B, 0x670B, 0x0BB4, 0x670C, 0x670C, 0x3544, 0x670D, 0x670D, 0x069B,
- 0x670E, 0x670F, 0x3545, 0x6710, 0x6710, 0x1984, 0x6711, 0x6713, 0x3547,
- 0x6714, 0x6714, 0x0DAC, 0x6715, 0x6715, 0x198E, 0x6716, 0x6716, 0x354A,
- 0x6717, 0x6717, 0x09B5, 0x6718, 0x671A, 0x354B, 0x671B, 0x671B, 0x0EAC,
- 0x671C, 0x671C, 0x354E, 0x671D, 0x671D, 0x04D4, 0x671E, 0x671E, 0x354F,
- 0x671F, 0x671F, 0x0BF9, 0x6720, 0x6725, 0x3550, 0x6726, 0x6726, 0x19AC,
- 0x6727, 0x6727, 0x24C4, 0x6728, 0x6728, 0x0B21, 0x6729, 0x6729, 0x3556,
- 0x672A, 0x672A, 0x0EC3, 0x672B, 0x672B, 0x0B0C, 0x672C, 0x672C, 0x0427,
- 0x672D, 0x672D, 0x1140, 0x672E, 0x672E, 0x3557, 0x672F, 0x672F, 0x0D8C,
- 0x6730, 0x6730, 0x3558, 0x6731, 0x6731, 0x11EB, 0x6732, 0x6733, 0x3559,
- 0x6734, 0x6734, 0x0BF2, 0x6735, 0x6735, 0x0623, 0x6736, 0x6739, 0x355B,
- 0x673A, 0x673A, 0x080F, 0x673B, 0x673C, 0x355F, 0x673D, 0x673D, 0x0FAB,
- 0x673E, 0x673F, 0x3561, 0x6740, 0x6740, 0x0CEA, 0x6741, 0x6741, 0x3563,
- 0x6742, 0x6742, 0x1116, 0x6743, 0x6743, 0x0C83, 0x6744, 0x6745, 0x3564,
- 0x6746, 0x6746, 0x06C6, 0x6747, 0x6747, 0x3566, 0x6748, 0x6748, 0x1854,
- 0x6749, 0x6749, 0x0CF5, 0x674A, 0x674B, 0x3567, 0x674C, 0x674C, 0x1851,
- 0x674D, 0x674D, 0x3569, 0x674E, 0x674E, 0x09D9, 0x674F, 0x674F, 0x0F9E,
- 0x6750, 0x6750, 0x048B, 0x6751, 0x6751, 0x0568, 0x6752, 0x6752, 0x356A,
- 0x6753, 0x6753, 0x1852, 0x6754, 0x6755, 0x356B, 0x6756, 0x6756, 0x1169,
- 0x6757, 0x675B, 0x356D, 0x675C, 0x675C, 0x0604, 0x675D, 0x675D, 0x3572,
- 0x675E, 0x675E, 0x1853, 0x675F, 0x675F, 0x0D8F, 0x6760, 0x6760, 0x06D7,
- 0x6761, 0x6761, 0x0E48, 0x6762, 0x6764, 0x3573, 0x6765, 0x6765, 0x099F,
- 0x6766, 0x6767, 0x3576, 0x6768, 0x6768, 0x1017, 0x6769, 0x6769, 0x1855,
- 0x676A, 0x676A, 0x1858, 0x676B, 0x676C, 0x3578, 0x676D, 0x676D, 0x0773,
- 0x676E, 0x676E, 0x357A, 0x676F, 0x676F, 0x0416, 0x6770, 0x6770, 0x08AD,
- 0x6771, 0x6771, 0x1ECC, 0x6772, 0x6772, 0x190F, 0x6773, 0x6773, 0x1859,
- 0x6774, 0x6774, 0x357B, 0x6775, 0x6775, 0x185C, 0x6776, 0x6776, 0x357C,
- 0x6777, 0x6777, 0x1861, 0x6778, 0x677B, 0x357D, 0x677C, 0x677C, 0x1862,
- 0x677D, 0x677D, 0x3581, 0x677E, 0x677E, 0x0DBE, 0x677F, 0x677F, 0x03F0,
- 0x6780, 0x6780, 0x3582, 0x6781, 0x6781, 0x081E, 0x6782, 0x6783, 0x3583,
- 0x6784, 0x6784, 0x0712, 0x6785, 0x6786, 0x3585, 0x6787, 0x6787, 0x1857,
- 0x6788, 0x6788, 0x3587, 0x6789, 0x6789, 0x0EA8, 0x678A, 0x678A, 0x3588,
- 0x678B, 0x678B, 0x1860, 0x678C, 0x678F, 0x3589, 0x6790, 0x6790, 0x0F05,
- 0x6791, 0x6794, 0x358D, 0x6795, 0x6795, 0x118E, 0x6796, 0x6796, 0x3591,
- 0x6797, 0x6797, 0x0A1F, 0x6798, 0x6798, 0x185A, 0x6799, 0x6799, 0x3592,
- 0x679A, 0x679A, 0x0ABB, 0x679B, 0x679B, 0x3593, 0x679C, 0x679C, 0x0754,
- 0x679D, 0x679D, 0x11A5, 0x679E, 0x679E, 0x185E, 0x679F, 0x67A1, 0x3594,
- 0x67A2, 0x67A2, 0x0D77, 0x67A3, 0x67A3, 0x1129, 0x67A4, 0x67A4, 0x3597,
- 0x67A5, 0x67A5, 0x1856, 0x67A6, 0x67A6, 0x3598, 0x67A7, 0x67A7, 0x185B,
- 0x67A8, 0x67A8, 0x185D, 0x67A9, 0x67A9, 0x3599, 0x67AA, 0x67AA, 0x0C36,
- 0x67AB, 0x67AB, 0x0680, 0x67AC, 0x67AC, 0x359A, 0x67AD, 0x67AD, 0x185F,
- 0x67AE, 0x67AE, 0x359B, 0x67AF, 0x67AF, 0x096A, 0x67B0, 0x67B0, 0x1868,
- 0x67B1, 0x67B2, 0x359C, 0x67B3, 0x67B3, 0x186D, 0x67B4, 0x67B4, 0x359E,
- 0x67B5, 0x67B5, 0x186B, 0x67B6, 0x67B6, 0x084F, 0x67B7, 0x67B7, 0x0842,
- 0x67B8, 0x67B8, 0x1871, 0x67B9, 0x67C0, 0x359F, 0x67C1, 0x67C1, 0x1874,
- 0x67C2, 0x67C2, 0x35A7, 0x67C3, 0x67C3, 0x1870, 0x67C4, 0x67C4, 0x0463,
- 0x67C5, 0x67CE, 0x35A8, 0x67CF, 0x67CF, 0x03E3, 0x67D0, 0x67D0, 0x0B16,
- 0x67D1, 0x67D1, 0x06C7, 0x67D2, 0x67D2, 0x0C01, 0x67D3, 0x67D3, 0x0C99,
- 0x67D4, 0x67D4, 0x0CBC, 0x67D5, 0x67D7, 0x35B2, 0x67D8, 0x67D8, 0x1865,
- 0x67D9, 0x67D9, 0x186A, 0x67DA, 0x67DA, 0x186C, 0x67DB, 0x67DB, 0x35B5,
- 0x67DC, 0x67DC, 0x074A, 0x67DD, 0x67DD, 0x186E, 0x67DE, 0x67DE, 0x1252,
- 0x67DF, 0x67DF, 0x35B6, 0x67E0, 0x67E0, 0x0B5E, 0x67E1, 0x67E1, 0x35B7,
- 0x67E2, 0x67E2, 0x1872, 0x67E3, 0x67E4, 0x35B8, 0x67E5, 0x67E5, 0x04B0,
- 0x67E6, 0x67E8, 0x35BA, 0x67E9, 0x67E9, 0x1867, 0x67EA, 0x67EB, 0x35BD,
- 0x67EC, 0x67EC, 0x0860, 0x67ED, 0x67EE, 0x35BF, 0x67EF, 0x67EF, 0x094F,
- 0x67F0, 0x67F0, 0x1863, 0x67F1, 0x67F1, 0x11F8, 0x67F2, 0x67F2, 0x35C1,
- 0x67F3, 0x67F3, 0x0A41, 0x67F4, 0x67F4, 0x04B8, 0x67F5, 0x67FC, 0x35C2,
- 0x67FD, 0x67FD, 0x1875, 0x67FE, 0x67FE, 0x35CA, 0x67FF, 0x67FF, 0x0D58,
- 0x6800, 0x6800, 0x186F, 0x6801, 0x6804, 0x35CB, 0x6805, 0x6805, 0x1145,
- 0x6806, 0x6806, 0x35CF, 0x6807, 0x6807, 0x0453, 0x6808, 0x6808, 0x115C,
- 0x6809, 0x6809, 0x1864, 0x680A, 0x680A, 0x1866, 0x680B, 0x680B, 0x05EF,
- 0x680C, 0x680C, 0x1869, 0x680D, 0x680D, 0x35D0, 0x680E, 0x680E, 0x1873,
- 0x680F, 0x680F, 0x09A3, 0x6810, 0x6810, 0x35D1, 0x6811, 0x6811, 0x0D8E,
- 0x6812, 0x6812, 0x35D2, 0x6813, 0x6813, 0x0D9D, 0x6814, 0x6815, 0x35D3,
- 0x6816, 0x6816, 0x0BFB, 0x6817, 0x6817, 0x09E0, 0x6818, 0x681C, 0x35D5,
- 0x681D, 0x681D, 0x187F, 0x681E, 0x6820, 0x35DA, 0x6821, 0x6821, 0x0F6E,
- 0x6822, 0x6828, 0x35DD, 0x6829, 0x6829, 0x1888, 0x682A, 0x682A, 0x11E9,
- 0x682B, 0x6831, 0x35E4, 0x6832, 0x6833, 0x1876, 0x6834, 0x6836, 0x35EB,
- 0x6837, 0x6837, 0x1022, 0x6838, 0x6838, 0x0782, 0x6839, 0x6839, 0x06F4,
- 0x683A, 0x683B, 0x35EE, 0x683C, 0x683C, 0x06EC, 0x683D, 0x683D, 0x1117,
- 0x683E, 0x683E, 0x1885, 0x683F, 0x683F, 0x35F0, 0x6840, 0x6840, 0x1884,
- 0x6841, 0x6841, 0x1882, 0x6842, 0x6842, 0x0749, 0x6843, 0x6843, 0x0E25,
- 0x6844, 0x6844, 0x187C, 0x6845, 0x6845, 0x0EB5, 0x6846, 0x6846, 0x097F,
- 0x6847, 0x6847, 0x35F1, 0x6848, 0x6848, 0x03C3, 0x6849, 0x6849, 0x1887,
- 0x684A, 0x684A, 0x1886, 0x684B, 0x684B, 0x35F2, 0x684C, 0x684C, 0x121D,
- 0x684D, 0x684D, 0x35F3, 0x684E, 0x684E, 0x187A, 0x684F, 0x684F, 0x35F4,
- 0x6850, 0x6850, 0x0E5A, 0x6851, 0x6851, 0x0CDC, 0x6852, 0x6852, 0x35F5,
- 0x6853, 0x6853, 0x07CD, 0x6854, 0x6854, 0x08AC, 0x6855, 0x6855, 0x1880,
- 0x6856, 0x685F, 0x35F6, 0x6860, 0x6861, 0x1878, 0x6862, 0x6862, 0x187B,
- 0x6863, 0x6863, 0x0596, 0x6864, 0x6864, 0x187D, 0x6865, 0x6865, 0x0C42,
- 0x6866, 0x6866, 0x1881, 0x6867, 0x6867, 0x1883, 0x6868, 0x6868, 0x0881,
- 0x6869, 0x6869, 0x120B, 0x686A, 0x686A, 0x3600, 0x686B, 0x686B, 0x188E,
- 0x686C, 0x6873, 0x3601, 0x6874, 0x6874, 0x188B, 0x6875, 0x6875, 0x3609,
- 0x6876, 0x6876, 0x0E61, 0x6877, 0x6877, 0x188C, 0x6878, 0x6880, 0x360A,
- 0x6881, 0x6881, 0x0A03, 0x6882, 0x6882, 0x3613, 0x6883, 0x6883, 0x187E,
- 0x6884, 0x6884, 0x3614, 0x6885, 0x6885, 0x0ABC, 0x6886, 0x6886, 0x03FB,
- 0x6887, 0x688E, 0x3615, 0x688F, 0x688F, 0x188A, 0x6890, 0x6892, 0x361D,
- 0x6893, 0x6893, 0x188D, 0x6894, 0x6896, 0x3620, 0x6897, 0x6897, 0x06FC,
- 0x6898, 0x6898, 0x246A, 0x6899, 0x689C, 0x3623, 0x689D, 0x689D, 0x2175,
- 0x689E, 0x689E, 0x3627, 0x689F, 0x689F, 0x246D, 0x68A0, 0x68A1, 0x3628,
- 0x68A2, 0x68A2, 0x0D0B, 0x68A3, 0x68A5, 0x362A, 0x68A6, 0x68A6, 0x0AD3,
- 0x68A7, 0x68A7, 0x0EEF, 0x68A8, 0x68A8, 0x09D1, 0x68A9, 0x68AC, 0x362D,
- 0x68AD, 0x68AD, 0x0DE8, 0x68AE, 0x68AE, 0x3631, 0x68AF, 0x68AF, 0x0E30,
- 0x68B0, 0x68B0, 0x0F80, 0x68B1, 0x68B2, 0x3632, 0x68B3, 0x68B3, 0x0D78,
- 0x68B4, 0x68B4, 0x3634, 0x68B5, 0x68B5, 0x1889, 0x68B6, 0x68BF, 0x3635,
- 0x68C0, 0x68C0, 0x085F, 0x68C1, 0x68C1, 0x363F, 0x68C2, 0x68C2, 0x188F,
- 0x68C3, 0x68C8, 0x3640, 0x68C9, 0x68C9, 0x0AE3, 0x68CA, 0x68CA, 0x3646,
- 0x68CB, 0x68CB, 0x0C04, 0x68CC, 0x68CC, 0x3647, 0x68CD, 0x68CD, 0x0750,
- 0x68CE, 0x68D1, 0x3648, 0x68D2, 0x68D2, 0x03FF, 0x68D3, 0x68D4, 0x364C,
- 0x68D5, 0x68D5, 0x1235, 0x68D6, 0x68D6, 0x246B, 0x68D7, 0x68D7, 0x225F,
- 0x68D8, 0x68D8, 0x081F, 0x68D9, 0x68D9, 0x364E, 0x68DA, 0x68DA, 0x0BB0,
- 0x68DB, 0x68DE, 0x364F, 0x68DF, 0x68DF, 0x1ECE, 0x68E0, 0x68E0, 0x0E17,
- 0x68E1, 0x68E2, 0x3653, 0x68E3, 0x68E3, 0x189A, 0x68E4, 0x68E6, 0x3655,
- 0x68E7, 0x68E7, 0x2272, 0x68E8, 0x68ED, 0x3658, 0x68EE, 0x68EE, 0x0CE6,
- 0x68EF, 0x68EF, 0x365E, 0x68F0, 0x68F0, 0x1896, 0x68F1, 0x68F1, 0x09CD,
- 0x68F2, 0x68F4, 0x365F, 0x68F5, 0x68F5, 0x0950, 0x68F6, 0x68F8, 0x3662,
- 0x68F9, 0x68F9, 0x1894, 0x68FA, 0x68FA, 0x0730, 0x68FB, 0x68FB, 0x3665,
- 0x68FC, 0x68FC, 0x1891, 0x68FD, 0x68FF, 0x3666, 0x6900, 0x6900, 0x3669,
- 0x6901, 0x6901, 0x1898, 0x6902, 0x6904, 0x366A, 0x6905, 0x6905, 0x1055,
- 0x6906, 0x690A, 0x366D, 0x690B, 0x690B, 0x1897, 0x690C, 0x690C, 0x3672,
- 0x690D, 0x690D, 0x11B1, 0x690E, 0x690E, 0x1212, 0x690F, 0x690F, 0x2473,
- 0x6910, 0x6910, 0x189B, 0x6911, 0x6911, 0x3673, 0x6912, 0x6912, 0x0888,
- 0x6913, 0x691E, 0x3674, 0x691F, 0x6920, 0x1892, 0x6921, 0x6923, 0x3680,
- 0x6924, 0x6924, 0x1895, 0x6925, 0x692C, 0x3683, 0x692D, 0x692D, 0x0E87,
- 0x692E, 0x692F, 0x368B, 0x6930, 0x6930, 0x1033, 0x6931, 0x6933, 0x368D,
- 0x6934, 0x6934, 0x18A6, 0x6935, 0x6938, 0x3690, 0x6939, 0x6939, 0x189D,
- 0x693A, 0x693C, 0x3694, 0x693D, 0x693D, 0x052D, 0x693E, 0x693E, 0x3697,
- 0x693F, 0x693F, 0x053E, 0x6940, 0x6941, 0x3698, 0x6942, 0x6942, 0x189F,
- 0x6943, 0x6949, 0x369A, 0x694A, 0x694A, 0x21FE, 0x694B, 0x6952, 0x36A1,
- 0x6953, 0x6953, 0x1EFE, 0x6954, 0x6954, 0x0F73, 0x6955, 0x6956, 0x36A9,
- 0x6957, 0x6957, 0x1899, 0x6958, 0x6959, 0x36AB, 0x695A, 0x695A, 0x0523,
- 0x695B, 0x695C, 0x36AD, 0x695D, 0x695D, 0x18A0, 0x695E, 0x695E, 0x09CE,
- 0x695F, 0x695F, 0x36AF, 0x6960, 0x6960, 0x189E, 0x6961, 0x6962, 0x36B0,
- 0x6963, 0x6963, 0x18AD, 0x6964, 0x6965, 0x36B2, 0x6966, 0x6966, 0x18AC,
- 0x6967, 0x6967, 0x36B4, 0x6968, 0x6968, 0x2475, 0x6969, 0x696A, 0x36B5,
- 0x696B, 0x696B, 0x18A2, 0x696C, 0x696C, 0x36B7, 0x696D, 0x696D, 0x220A,
- 0x696E, 0x696E, 0x1890, 0x696F, 0x6970, 0x36B8, 0x6971, 0x6971, 0x189C,
- 0x6972, 0x6974, 0x36BA, 0x6975, 0x6975, 0x1F6F, 0x6976, 0x6976, 0x36BD,
- 0x6977, 0x6977, 0x0939, 0x6978, 0x6978, 0x18A5, 0x6979, 0x6979, 0x18AE,
- 0x697A, 0x697B, 0x36BE, 0x697C, 0x697C, 0x0A4C, 0x697D, 0x697F, 0x36C0,
- 0x6980, 0x6980, 0x18A3, 0x6981, 0x6981, 0x36C3, 0x6982, 0x6982, 0x06C0,
- 0x6983, 0x6983, 0x36C4, 0x6984, 0x6984, 0x18A1, 0x6985, 0x6985, 0x36C5,
- 0x6986, 0x6986, 0x10C1, 0x6987, 0x6988, 0x18A8, 0x6989, 0x6989, 0x18AB,
- 0x698A, 0x698C, 0x36C6, 0x698D, 0x698D, 0x18BB, 0x698E, 0x6993, 0x36C9,
- 0x6994, 0x6994, 0x09B1, 0x6995, 0x6995, 0x18B9, 0x6996, 0x6997, 0x36CF,
- 0x6998, 0x6998, 0x18A4, 0x6999, 0x699A, 0x36D1, 0x699B, 0x699B, 0x18AF,
- 0x699C, 0x699C, 0x03FC, 0x699D, 0x69A6, 0x36D3, 0x69A7, 0x69A7, 0x18B0,
- 0x69A8, 0x69A8, 0x1146, 0x69A9, 0x69A9, 0x36DD, 0x69AA, 0x69AA, 0x2468,
- 0x69AB, 0x69AB, 0x18B2, 0x69AC, 0x69AC, 0x36DE, 0x69AD, 0x69AD, 0x18B3,
- 0x69AE, 0x69AE, 0x2100, 0x69AF, 0x69B0, 0x36DF, 0x69B1, 0x69B1, 0x18B5,
- 0x69B2, 0x69B3, 0x36E1, 0x69B4, 0x69B4, 0x0A3A, 0x69B5, 0x69B6, 0x36E3,
- 0x69B7, 0x69B7, 0x0C91, 0x69B8, 0x69BA, 0x36E5, 0x69BB, 0x69BB, 0x18B1,
- 0x69BC, 0x69BE, 0x36E8, 0x69BF, 0x69BF, 0x2476, 0x69C0, 0x69C0, 0x36EB,
- 0x69C1, 0x69C1, 0x18B6, 0x69C2, 0x69C9, 0x36EC, 0x69CA, 0x69CA, 0x18B7,
- 0x69CB, 0x69CB, 0x1F27, 0x69CC, 0x69CC, 0x18A7, 0x69CD, 0x69CD, 0x20D7,
- 0x69CE, 0x69CE, 0x18AA, 0x69CF, 0x69CF, 0x36F4, 0x69D0, 0x69D0, 0x07C6,
- 0x69D1, 0x69D3, 0x36F5, 0x69D4, 0x69D4, 0x18B4, 0x69D5, 0x69DA, 0x36F8,
- 0x69DB, 0x69DB, 0x086A, 0x69DC, 0x69DE, 0x36FE, 0x69DF, 0x69DF, 0x18B8,
- 0x69E0, 0x69E0, 0x18BA, 0x69E1, 0x69E6, 0x3701, 0x69E7, 0x69E7, 0x247C,
- 0x69E8, 0x69EC, 0x3707, 0x69ED, 0x69ED, 0x18BE, 0x69EE, 0x69F1, 0x370C,
- 0x69F2, 0x69F2, 0x18C2, 0x69F3, 0x69F3, 0x1FA1, 0x69F4, 0x69FC, 0x3710,
- 0x69FD, 0x69FD, 0x04A2, 0x69FE, 0x69FE, 0x3719, 0x69FF, 0x69FF, 0x18BC,
- 0x6A00, 0x6A00, 0x371A, 0x6A01, 0x6A01, 0x22AA, 0x6A02, 0x6A02, 0x2005,
- 0x6A03, 0x6A04, 0x371B, 0x6A05, 0x6A05, 0x246C, 0x6A06, 0x6A09, 0x371D,
- 0x6A0A, 0x6A0A, 0x064B, 0x6A0B, 0x6A12, 0x3721, 0x6A13, 0x6A13, 0x203E,
- 0x6A14, 0x6A16, 0x3729, 0x6A17, 0x6A18, 0x18BF, 0x6A19, 0x6A19, 0x1E4C,
- 0x6A1A, 0x6A1D, 0x372C, 0x6A1E, 0x6A1E, 0x213A, 0x6A1F, 0x6A1F, 0x1162,
- 0x6A20, 0x6A20, 0x3730, 0x6A21, 0x6A21, 0x0B06, 0x6A22, 0x6A22, 0x3731,
- 0x6A23, 0x6A23, 0x2204, 0x6A24, 0x6A27, 0x3732, 0x6A28, 0x6A28, 0x18CC,
- 0x6A29, 0x6A29, 0x3736, 0x6A2A, 0x6A2A, 0x0798, 0x6A2B, 0x6A2E, 0x3737,
- 0x6A2F, 0x6A2F, 0x18BD, 0x6A30, 0x6A30, 0x373B, 0x6A31, 0x6A31, 0x1088,
- 0x6A32, 0x6A34, 0x373C, 0x6A35, 0x6A35, 0x18C8, 0x6A36, 0x6A37, 0x373F,
- 0x6A38, 0x6A38, 0x20C3, 0x6A39, 0x6A39, 0x2140, 0x6A3A, 0x6A3A, 0x2477,
- 0x6A3B, 0x6A3C, 0x3741, 0x6A3D, 0x6A3D, 0x18CB, 0x6A3E, 0x6A3E, 0x18C4,
- 0x6A3F, 0x6A43, 0x3743, 0x6A44, 0x6A44, 0x18C3, 0x6A45, 0x6A46, 0x3748,
- 0x6A47, 0x6A47, 0x0C3E, 0x6A48, 0x6A48, 0x2474, 0x6A49, 0x6A4A, 0x374A,
- 0x6A4B, 0x6A4B, 0x20DD, 0x6A4C, 0x6A4F, 0x374C, 0x6A50, 0x6A50, 0x18C6,
- 0x6A51, 0x6A57, 0x3750, 0x6A58, 0x6A58, 0x18CD, 0x6A59, 0x6A59, 0x04ED,
- 0x6A5A, 0x6A5A, 0x3757, 0x6A5B, 0x6A5B, 0x18C7, 0x6A5C, 0x6A5E, 0x3758,
- 0x6A5F, 0x6A5F, 0x1F68, 0x6A60, 0x6A60, 0x375B, 0x6A61, 0x6A61, 0x0F5D,
- 0x6A62, 0x6A62, 0x2185, 0x6A63, 0x6A64, 0x375C, 0x6A65, 0x6A65, 0x18C1,
- 0x6A66, 0x6A70, 0x375E, 0x6A71, 0x6A71, 0x051C, 0x6A72, 0x6A78, 0x3769,
- 0x6A79, 0x6A79, 0x18CA, 0x6A7A, 0x6A7B, 0x3770, 0x6A7C, 0x6A7C, 0x18CE,
- 0x6A7D, 0x6A7F, 0x3772, 0x6A80, 0x6A80, 0x0E07, 0x6A81, 0x6A83, 0x3775,
- 0x6A84, 0x6A84, 0x0F1A, 0x6A85, 0x6A88, 0x3778, 0x6A89, 0x6A89, 0x2472,
- 0x6A8A, 0x6A8D, 0x377C, 0x6A8E, 0x6A8E, 0x18C9, 0x6A8F, 0x6A8F, 0x3780,
- 0x6A90, 0x6A90, 0x18D0, 0x6A91, 0x6A91, 0x18CF, 0x6A92, 0x6A93, 0x3781,
- 0x6A94, 0x6A94, 0x1EB5, 0x6A95, 0x6A96, 0x3783, 0x6A97, 0x6A97, 0x18D2,
- 0x6A98, 0x6A9B, 0x3785, 0x6A9C, 0x6A9C, 0x2478, 0x6A9D, 0x6A9F, 0x3789,
- 0x6AA0, 0x6AA0, 0x18C5, 0x6AA1, 0x6AA1, 0x378C, 0x6AA2, 0x6AA2, 0x1F8B,
- 0x6AA3, 0x6AA3, 0x2484, 0x6AA4, 0x6AA8, 0x378D, 0x6AA9, 0x6AA9, 0x18D1,
- 0x6AAA, 0x6AAA, 0x3792, 0x6AAB, 0x6AAB, 0x18D3, 0x6AAC, 0x6AAC, 0x0ACF,
- 0x6AAD, 0x6AAE, 0x3793, 0x6AAF, 0x6AAF, 0x2699, 0x6AB0, 0x6AB2, 0x3795,
- 0x6AB3, 0x6AB3, 0x2482, 0x6AB4, 0x6AB7, 0x3798, 0x6AB8, 0x6AB8, 0x20A1,
- 0x6AB9, 0x6ABA, 0x379C, 0x6ABB, 0x6ABB, 0x1F92, 0x6ABC, 0x6AC2, 0x379E,
- 0x6AC3, 0x6AC3, 0x1F38, 0x6AC4, 0x6AD2, 0x37A5, 0x6AD3, 0x6AD3, 0x2485,
- 0x6AD4, 0x6AD9, 0x37B4, 0x6ADA, 0x6ADA, 0x2480, 0x6ADB, 0x6ADB, 0x246E,
- 0x6ADC, 0x6ADC, 0x37BA, 0x6ADD, 0x6ADD, 0x247B, 0x6ADE, 0x6ADE, 0x2486,
- 0x6ADF, 0x6ADF, 0x2471, 0x6AE0, 0x6AE6, 0x37BB, 0x6AE7, 0x6AE7, 0x2483,
- 0x6AE8, 0x6AE8, 0x2470, 0x6AE9, 0x6AE9, 0x37C2, 0x6AEA, 0x6AEA, 0x2469,
- 0x6AEB, 0x6AEB, 0x37C3, 0x6AEC, 0x6AEC, 0x247F, 0x6AED, 0x6AF2, 0x37C4,
- 0x6AF3, 0x6AF3, 0x246F, 0x6AF4, 0x6AF7, 0x37CA, 0x6AF8, 0x6AF8, 0x2481,
- 0x6AF9, 0x6AFA, 0x37CE, 0x6AFB, 0x6AFB, 0x2220, 0x6AFC, 0x6AFF, 0x37D0,
- 0x6B00, 0x6B03, 0x37D4, 0x6B04, 0x6B04, 0x1FF5, 0x6B05, 0x6B09, 0x37D8,
- 0x6B0A, 0x6B0A, 0x20F4, 0x6B0B, 0x6B0E, 0x37DD, 0x6B0F, 0x6B0F, 0x247D,
- 0x6B10, 0x6B11, 0x37E1, 0x6B12, 0x6B12, 0x2479, 0x6B13, 0x6B15, 0x37E3,
- 0x6B16, 0x6B16, 0x247E, 0x6B17, 0x6B1D, 0x37E6, 0x6B1E, 0x6B1E, 0x247A,
- 0x6B1F, 0x6B1F, 0x37ED, 0x6B20, 0x6B20, 0x0C34, 0x6B21, 0x6B21, 0x0551,
- 0x6B22, 0x6B22, 0x07CB, 0x6B23, 0x6B23, 0x0F8B, 0x6B24, 0x6B24, 0x19B1,
- 0x6B25, 0x6B26, 0x37EE, 0x6B27, 0x6B27, 0x0B78, 0x6B28, 0x6B31, 0x37F0,
- 0x6B32, 0x6B32, 0x10E0, 0x6B33, 0x6B36, 0x37FA, 0x6B37, 0x6B37, 0x19B2,
- 0x6B38, 0x6B38, 0x37FE, 0x6B39, 0x6B39, 0x19B3, 0x6B3A, 0x6B3A, 0x0BFA,
- 0x6B3B, 0x6B3C, 0x37FF, 0x6B3D, 0x6B3D, 0x20E3, 0x6B3E, 0x6B3E, 0x097B,
- 0x6B3F, 0x6B42, 0x3801, 0x6B43, 0x6B43, 0x19B4, 0x6B44, 0x6B45, 0x3805,
- 0x6B46, 0x6B46, 0x19B5, 0x6B47, 0x6B47, 0x0F75, 0x6B48, 0x6B48, 0x3807,
- 0x6B49, 0x6B49, 0x0C35, 0x6B4A, 0x6B4B, 0x3808, 0x6B4C, 0x6B4C, 0x06E3,
- 0x6B4D, 0x6B4F, 0x380A, 0x6B50, 0x6B50, 0x20AD, 0x6B51, 0x6B58, 0x380D,
- 0x6B59, 0x6B59, 0x19B6, 0x6B5A, 0x6B5E, 0x3815, 0x6B5F, 0x6B5F, 0x24CB,
- 0x6B60, 0x6B60, 0x381A, 0x6B61, 0x6B61, 0x1F53, 0x6B62, 0x6B62, 0x11B8,
- 0x6B63, 0x6B63, 0x119E, 0x6B64, 0x6B64, 0x054E, 0x6B65, 0x6B65, 0x0484,
- 0x6B66, 0x6B66, 0x0EF3, 0x6B67, 0x6B67, 0x0C06, 0x6B68, 0x6B69, 0x381B,
- 0x6B6A, 0x6B6A, 0x0E92, 0x6B6B, 0x6B71, 0x381D, 0x6B72, 0x6B72, 0x2159,
- 0x6B73, 0x6B76, 0x3824, 0x6B77, 0x6B77, 0x2013, 0x6B78, 0x6B78, 0x1F33,
- 0x6B79, 0x6B79, 0x0578, 0x6B7A, 0x6B7A, 0x3828, 0x6B7B, 0x6B7B, 0x0DB5,
- 0x6B7C, 0x6B7C, 0x0852, 0x6B7D, 0x6B80, 0x3829, 0x6B81, 0x6B82, 0x18D6,
- 0x6B83, 0x6B83, 0x1013, 0x6B84, 0x6B84, 0x18D9, 0x6B85, 0x6B85, 0x382D,
- 0x6B86, 0x6B86, 0x057C, 0x6B87, 0x6B87, 0x18D8, 0x6B88, 0x6B88, 0x382E,
- 0x6B89, 0x6B89, 0x0FDC, 0x6B8A, 0x6B8A, 0x0D79, 0x6B8B, 0x6B8B, 0x0497,
- 0x6B8C, 0x6B8C, 0x382F, 0x6B8D, 0x6B8D, 0x18DC, 0x6B8E, 0x6B91, 0x3830,
- 0x6B92, 0x6B93, 0x18DA, 0x6B94, 0x6B95, 0x3834, 0x6B96, 0x6B96, 0x11B2,
- 0x6B97, 0x6B97, 0x3836, 0x6B98, 0x6B98, 0x1E5C, 0x6B99, 0x6B99, 0x3837,
- 0x6B9A, 0x6B9B, 0x18DD, 0x6B9C, 0x6B9D, 0x3838, 0x6B9E, 0x6B9E, 0x2488,
- 0x6B9F, 0x6BA0, 0x383A, 0x6BA1, 0x6BA1, 0x18DF, 0x6BA2, 0x6BA3, 0x383C,
- 0x6BA4, 0x6BA4, 0x2487, 0x6BA5, 0x6BA9, 0x383E, 0x6BAA, 0x6BAA, 0x18E0,
- 0x6BAB, 0x6BAB, 0x248A, 0x6BAC, 0x6BAD, 0x3843, 0x6BAE, 0x6BAE, 0x2489,
- 0x6BAF, 0x6BAF, 0x248B, 0x6BB0, 0x6BB1, 0x3845, 0x6BB2, 0x6BB2, 0x1F83,
- 0x6BB3, 0x6BB3, 0x19BD, 0x6BB4, 0x6BB4, 0x0B7A, 0x6BB5, 0x6BB5, 0x060D,
- 0x6BB6, 0x6BB6, 0x3847, 0x6BB7, 0x6BB7, 0x107A, 0x6BB8, 0x6BB9, 0x3848,
- 0x6BBA, 0x6BBA, 0x210F, 0x6BBB, 0x6BBB, 0x1FDB, 0x6BBC, 0x6BBE, 0x384A,
- 0x6BBF, 0x6BBF, 0x05CF, 0x6BC0, 0x6BC0, 0x384D, 0x6BC1, 0x6BC1, 0x07EE,
- 0x6BC2, 0x6BC2, 0x19BF, 0x6BC3, 0x6BC4, 0x384E, 0x6BC5, 0x6BC5, 0x106A,
- 0x6BC6, 0x6BC6, 0x20AF, 0x6BC7, 0x6BCA, 0x3850, 0x6BCB, 0x6BCB, 0x0EF2,
- 0x6BCC, 0x6BCC, 0x3854, 0x6BCD, 0x6BCD, 0x0B1B, 0x6BCE, 0x6BCE, 0x3855,
- 0x6BCF, 0x6BCF, 0x0AC4, 0x6BD0, 0x6BD1, 0x3856, 0x6BD2, 0x6BD2, 0x05FD,
- 0x6BD3, 0x6BD3, 0x126F, 0x6BD4, 0x6BD4, 0x0431, 0x6BD5, 0x6BD5, 0x0438,
- 0x6BD6, 0x6BD6, 0x043A, 0x6BD7, 0x6BD7, 0x0BBF, 0x6BD8, 0x6BD8, 0x3858,
- 0x6BD9, 0x6BD9, 0x0439, 0x6BDA, 0x6BDA, 0x3859, 0x6BDB, 0x6BDB, 0x0AB0,
- 0x6BDC, 0x6BE0, 0x385A, 0x6BE1, 0x6BE1, 0x1152, 0x6BE2, 0x6BE9, 0x385F,
- 0x6BEA, 0x6BEA, 0x1954, 0x6BEB, 0x6BEB, 0x0778, 0x6BEC, 0x6BEE, 0x3867,
- 0x6BEF, 0x6BEF, 0x0E0D, 0x6BF0, 0x6BF2, 0x386A, 0x6BF3, 0x6BF3, 0x1955,
- 0x6BF4, 0x6BF4, 0x386D, 0x6BF5, 0x6BF5, 0x1957, 0x6BF6, 0x6BF8, 0x386E,
- 0x6BF9, 0x6BF9, 0x1958, 0x6BFA, 0x6BFC, 0x3871, 0x6BFD, 0x6BFD, 0x1956,
- 0x6BFE, 0x6BFE, 0x3874, 0x6BFF, 0x6BFF, 0x24C0, 0x6C00, 0x6C04, 0x3875,
- 0x6C05, 0x6C05, 0x1959, 0x6C06, 0x6C06, 0x195B, 0x6C07, 0x6C07, 0x195A,
- 0x6C08, 0x6C08, 0x226D, 0x6C09, 0x6C0B, 0x387A, 0x6C0C, 0x6C0C, 0x24C1,
- 0x6C0D, 0x6C0D, 0x195C, 0x6C0E, 0x6C0E, 0x387D, 0x6C0F, 0x6C0F, 0x0D66,
- 0x6C10, 0x6C10, 0x126B, 0x6C11, 0x6C11, 0x0AF6, 0x6C12, 0x6C12, 0x387E,
- 0x6C13, 0x6C13, 0x0AAA, 0x6C14, 0x6C14, 0x0C17, 0x6C15, 0x6C15, 0x195D,
- 0x6C16, 0x6C16, 0x0B2D, 0x6C17, 0x6C17, 0x387F, 0x6C18, 0x6C1A, 0x195E,
- 0x6C1B, 0x6C1B, 0x0672, 0x6C1C, 0x6C1E, 0x3880, 0x6C1F, 0x6C1F, 0x0697,
- 0x6C20, 0x6C20, 0x3883, 0x6C21, 0x6C21, 0x1961, 0x6C22, 0x6C22, 0x0C5F,
- 0x6C23, 0x6C23, 0x20CA, 0x6C24, 0x6C24, 0x1963, 0x6C25, 0x6C25, 0x3884,
- 0x6C26, 0x6C26, 0x075B, 0x6C27, 0x6C27, 0x101E, 0x6C28, 0x6C28, 0x03BC,
- 0x6C29, 0x6C29, 0x1962, 0x6C2A, 0x6C2A, 0x1964, 0x6C2B, 0x6C2B, 0x20E7,
- 0x6C2C, 0x6C2C, 0x24C2, 0x6C2D, 0x6C2D, 0x3885, 0x6C2E, 0x6C2E, 0x058B,
- 0x6C2F, 0x6C2F, 0x0A6F, 0x6C30, 0x6C30, 0x0C65, 0x6C31, 0x6C31, 0x3886,
- 0x6C32, 0x6C32, 0x1965, 0x6C33, 0x6C33, 0x3887, 0x6C34, 0x6C34, 0x0DA3,
- 0x6C35, 0x6C35, 0x169F, 0x6C36, 0x6C37, 0x3888, 0x6C38, 0x6C38, 0x10A5,
- 0x6C39, 0x6C3C, 0x388A, 0x6C3D, 0x6C3D, 0x12EF, 0x6C3E, 0x6C3F, 0x388E,
- 0x6C40, 0x6C40, 0x0E52, 0x6C41, 0x6C41, 0x11AC, 0x6C42, 0x6C42, 0x0C70,
- 0x6C43, 0x6C45, 0x3890, 0x6C46, 0x6C46, 0x12F4, 0x6C47, 0x6C47, 0x07F8,
- 0x6C48, 0x6C48, 0x3893, 0x6C49, 0x6C49, 0x0771, 0x6C4A, 0x6C4A, 0x16A2,
- 0x6C4B, 0x6C4F, 0x3894, 0x6C50, 0x6C50, 0x0F18, 0x6C51, 0x6C53, 0x3899,
- 0x6C54, 0x6C54, 0x16A0, 0x6C55, 0x6C55, 0x0D00, 0x6C56, 0x6C56, 0x389C,
- 0x6C57, 0x6C57, 0x0770, 0x6C58, 0x6C5A, 0x389D, 0x6C5B, 0x6C5B, 0x0FDD,
- 0x6C5C, 0x6C5C, 0x16A1, 0x6C5D, 0x6C5D, 0x0CC5, 0x6C5E, 0x6C5E, 0x0708,
- 0x6C5F, 0x6C5F, 0x087E, 0x6C60, 0x6C60, 0x04FD, 0x6C61, 0x6C61, 0x0EEA,
- 0x6C62, 0x6C63, 0x38A0, 0x6C64, 0x6C64, 0x0E13, 0x6C65, 0x6C67, 0x38A2,
- 0x6C68, 0x6C69, 0x16A8, 0x6C6A, 0x6C6A, 0x0EA5, 0x6C6B, 0x6C6F, 0x38A5,
- 0x6C70, 0x6C70, 0x0E00, 0x6C71, 0x6C71, 0x38AA, 0x6C72, 0x6C72, 0x0826,
- 0x6C73, 0x6C73, 0x38AB, 0x6C74, 0x6C74, 0x16AA, 0x6C75, 0x6C75, 0x38AC,
- 0x6C76, 0x6C76, 0x16AB, 0x6C77, 0x6C78, 0x38AD, 0x6C79, 0x6C79, 0x0FA5,
- 0x6C7A, 0x6C7C, 0x38AF, 0x6C7D, 0x6C7D, 0x0C1A, 0x6C7E, 0x6C7E, 0x0677,
- 0x6C7F, 0x6C80, 0x38B2, 0x6C81, 0x6C81, 0x0C5C, 0x6C82, 0x6C82, 0x1051,
- 0x6C83, 0x6C83, 0x0EE5, 0x6C84, 0x6C84, 0x38B4, 0x6C85, 0x6C85, 0x16A4,
- 0x6C86, 0x6C86, 0x16AC, 0x6C87, 0x6C87, 0x38B5, 0x6C88, 0x6C88, 0x0D2B,
- 0x6C89, 0x6C89, 0x04E6, 0x6C8A, 0x6C8B, 0x38B6, 0x6C8C, 0x6C8C, 0x16A7,
- 0x6C8D, 0x6C8E, 0x38B8, 0x6C8F, 0x6C8F, 0x0C02, 0x6C90, 0x6C90, 0x16A5,
- 0x6C91, 0x6C92, 0x38BA, 0x6C93, 0x6C93, 0x1A1F, 0x6C94, 0x6C94, 0x16A6,
- 0x6C95, 0x6C98, 0x38BC, 0x6C99, 0x6C99, 0x0CEC, 0x6C9A, 0x6C9A, 0x38C0,
- 0x6C9B, 0x6C9B, 0x0BA7, 0x6C9C, 0x6C9E, 0x38C1, 0x6C9F, 0x6C9F, 0x070E,
- 0x6CA0, 0x6CA0, 0x38C4, 0x6CA1, 0x6CA1, 0x0AC0, 0x6CA2, 0x6CA2, 0x38C5,
- 0x6CA3, 0x6CA3, 0x16A3, 0x6CA4, 0x6CA4, 0x0B7E, 0x6CA5, 0x6CA5, 0x09ED,
- 0x6CA6, 0x6CA6, 0x0A80, 0x6CA7, 0x6CA7, 0x049E, 0x6CA8, 0x6CA8, 0x38C6,
- 0x6CA9, 0x6CA9, 0x16AD, 0x6CAA, 0x6CAA, 0x07BB, 0x6CAB, 0x6CAB, 0x0B10,
- 0x6CAC, 0x6CAC, 0x38C7, 0x6CAD, 0x6CAD, 0x16B0, 0x6CAE, 0x6CAE, 0x0909,
- 0x6CAF, 0x6CB0, 0x38C8, 0x6CB1, 0x6CB1, 0x16BB, 0x6CB2, 0x6CB2, 0x16B5,
- 0x6CB3, 0x6CB3, 0x078A, 0x6CB4, 0x6CB7, 0x38CA, 0x6CB8, 0x6CB8, 0x066D,
- 0x6CB9, 0x6CB9, 0x10B2, 0x6CBA, 0x6CBA, 0x38CE, 0x6CBB, 0x6CBB, 0x11CD,
- 0x6CBC, 0x6CBC, 0x1174, 0x6CBD, 0x6CBD, 0x071A, 0x6CBE, 0x6CBE, 0x1155,
- 0x6CBF, 0x6CBF, 0x1001, 0x6CC0, 0x6CC3, 0x38CF, 0x6CC4, 0x6CC4, 0x0F84,
- 0x6CC5, 0x6CC5, 0x0C73, 0x6CC6, 0x6CC8, 0x38D3, 0x6CC9, 0x6CC9, 0x0C85,
- 0x6CCA, 0x6CCA, 0x047B, 0x6CCB, 0x6CCB, 0x38D6, 0x6CCC, 0x6CCC, 0x0ADF,
- 0x6CCD, 0x6CCF, 0x38D7, 0x6CD0, 0x6CD0, 0x16AE, 0x6CD1, 0x6CD2, 0x38DA,
- 0x6CD3, 0x6CD3, 0x16BC, 0x6CD4, 0x6CD4, 0x16AF, 0x6CD5, 0x6CD5, 0x0645,
- 0x6CD6, 0x6CD6, 0x16B7, 0x6CD7, 0x6CD7, 0x16B4, 0x6CD8, 0x6CDA, 0x38DC,
- 0x6CDB, 0x6CDB, 0x0657, 0x6CDC, 0x6CDD, 0x38DF, 0x6CDE, 0x6CDE, 0x0B63,
- 0x6CDF, 0x6CDF, 0x38E1, 0x6CE0, 0x6CE0, 0x16B6, 0x6CE1, 0x6CE1, 0x0B9E,
- 0x6CE2, 0x6CE2, 0x046F, 0x6CE3, 0x6CE3, 0x0C1B, 0x6CE4, 0x6CE4, 0x38E2,
- 0x6CE5, 0x6CE5, 0x0B43, 0x6CE6, 0x6CE7, 0x38E3, 0x6CE8, 0x6CE8, 0x11FF,
- 0x6CE9, 0x6CE9, 0x38E5, 0x6CEA, 0x6CEA, 0x09CC, 0x6CEB, 0x6CEB, 0x16B9,
- 0x6CEC, 0x6CED, 0x38E6, 0x6CEE, 0x6CEE, 0x16BA, 0x6CEF, 0x6CEF, 0x16BD,
- 0x6CF0, 0x6CF0, 0x0DFC, 0x6CF1, 0x6CF1, 0x16B3, 0x6CF2, 0x6CF2, 0x38E8,
- 0x6CF3, 0x6CF3, 0x10A3, 0x6CF4, 0x6CF4, 0x38E9, 0x6CF5, 0x6CF5, 0x042C,
- 0x6CF6, 0x6CF6, 0x1A20, 0x6CF7, 0x6CF8, 0x16B1, 0x6CF9, 0x6CF9, 0x38EA,
- 0x6CFA, 0x6CFA, 0x16B8, 0x6CFB, 0x6CFB, 0x0F85, 0x6CFC, 0x6CFC, 0x0BE2,
- 0x6CFD, 0x6CFD, 0x1136, 0x6CFE, 0x6CFE, 0x16BE, 0x6CFF, 0x6CFF, 0x38EB,
- 0x6D00, 0x6D00, 0x38EC, 0x6D01, 0x6D01, 0x08B1, 0x6D02, 0x6D03, 0x38ED,
- 0x6D04, 0x6D04, 0x16C5, 0x6D05, 0x6D06, 0x38EF, 0x6D07, 0x6D07, 0x16C4,
- 0x6D08, 0x6D0A, 0x38F1, 0x6D0B, 0x6D0B, 0x101C, 0x6D0C, 0x6D0C, 0x16C1,
- 0x6D0D, 0x6D0D, 0x38F4, 0x6D0E, 0x6D0E, 0x16C7, 0x6D0F, 0x6D11, 0x38F5,
- 0x6D12, 0x6D12, 0x0CD2, 0x6D13, 0x6D16, 0x38F8, 0x6D17, 0x6D17, 0x0F21,
- 0x6D18, 0x6D18, 0x38FC, 0x6D19, 0x6D19, 0x16C6, 0x6D1A, 0x6D1A, 0x16CC,
- 0x6D1B, 0x6D1B, 0x0A8C, 0x6D1C, 0x6D1D, 0x38FD, 0x6D1E, 0x6D1E, 0x05F3,
- 0x6D1F, 0x6D24, 0x38FF, 0x6D25, 0x6D25, 0x08C3, 0x6D26, 0x6D26, 0x3905,
- 0x6D27, 0x6D27, 0x16C0, 0x6D28, 0x6D29, 0x3906, 0x6D2A, 0x6D2A, 0x07A0,
- 0x6D2B, 0x6D2B, 0x16C8, 0x6D2C, 0x6D2D, 0x3908, 0x6D2E, 0x6D2E, 0x16CA,
- 0x6D2F, 0x6D30, 0x390A, 0x6D31, 0x6D31, 0x063C, 0x6D32, 0x6D32, 0x11DD,
- 0x6D33, 0x6D33, 0x16D0, 0x6D34, 0x6D34, 0x390C, 0x6D35, 0x6D35, 0x16CB,
- 0x6D36, 0x6D38, 0x390D, 0x6D39, 0x6D39, 0x16BF, 0x6D3A, 0x6D3A, 0x3910,
- 0x6D3B, 0x6D3B, 0x0803, 0x6D3C, 0x6D3C, 0x0E8E, 0x6D3D, 0x6D3D, 0x0C1F,
- 0x6D3E, 0x6D3E, 0x0B8A, 0x6D3F, 0x6D40, 0x3911, 0x6D41, 0x6D41, 0x0A40,
- 0x6D42, 0x6D42, 0x3913, 0x6D43, 0x6D43, 0x16C2, 0x6D44, 0x6D44, 0x3914,
- 0x6D45, 0x6D45, 0x0C30, 0x6D46, 0x6D46, 0x087D, 0x6D47, 0x6D47, 0x088E,
- 0x6D48, 0x6D48, 0x16C3, 0x6D49, 0x6D49, 0x3915, 0x6D4A, 0x6D4A, 0x1224,
- 0x6D4B, 0x6D4B, 0x04A9, 0x6D4C, 0x6D4C, 0x3916, 0x6D4D, 0x6D4D, 0x16C9,
- 0x6D4E, 0x6D4E, 0x0836, 0x6D4F, 0x6D4F, 0x16CD, 0x6D50, 0x6D50, 0x3917,
- 0x6D51, 0x6D51, 0x0800, 0x6D52, 0x6D52, 0x16CE, 0x6D53, 0x6D53, 0x0B69,
- 0x6D54, 0x6D54, 0x16CF, 0x6D55, 0x6D58, 0x3918, 0x6D59, 0x6D59, 0x1184,
- 0x6D5A, 0x6D5A, 0x0930, 0x6D5B, 0x6D5B, 0x391C, 0x6D5C, 0x6D5C, 0x16D8,
- 0x6D5D, 0x6D5D, 0x391D, 0x6D5E, 0x6D5E, 0x16D5, 0x6D5F, 0x6D5F, 0x391E,
- 0x6D60, 0x6D60, 0x16D9, 0x6D61, 0x6D62, 0x391F, 0x6D63, 0x6D63, 0x16DB,
- 0x6D64, 0x6D65, 0x3921, 0x6D66, 0x6D66, 0x0BF5, 0x6D67, 0x6D68, 0x3923,
- 0x6D69, 0x6D69, 0x077D, 0x6D6A, 0x6D6A, 0x09B6, 0x6D6B, 0x6D6D, 0x3925,
- 0x6D6E, 0x6D6E, 0x069C, 0x6D6F, 0x6D6F, 0x16D2, 0x6D70, 0x6D73, 0x3928,
- 0x6D74, 0x6D74, 0x10E4, 0x6D75, 0x6D76, 0x392C, 0x6D77, 0x6D77, 0x075A,
- 0x6D78, 0x6D78, 0x08CF, 0x6D79, 0x6D79, 0x23DC, 0x6D7A, 0x6D7B, 0x392E,
- 0x6D7C, 0x6D7C, 0x16DA, 0x6D7D, 0x6D81, 0x3930, 0x6D82, 0x6D82, 0x0E70,
- 0x6D83, 0x6D84, 0x3935, 0x6D85, 0x6D85, 0x0B5C, 0x6D86, 0x6D86, 0x3937,
- 0x6D87, 0x6D87, 0x23DB, 0x6D88, 0x6D88, 0x0F68, 0x6D89, 0x6D89, 0x0D1F,
- 0x6D8A, 0x6D8B, 0x3938, 0x6D8C, 0x6D8C, 0x10A4, 0x6D8D, 0x6D8D, 0x393A,
- 0x6D8E, 0x6D8E, 0x0F3E, 0x6D8F, 0x6D90, 0x393B, 0x6D91, 0x6D91, 0x16D1,
- 0x6D92, 0x6D92, 0x393D, 0x6D93, 0x6D94, 0x16D6, 0x6D95, 0x6D95, 0x0E3C,
- 0x6D96, 0x6D9A, 0x393E, 0x6D9B, 0x6D9B, 0x0E21, 0x6D9C, 0x6D9C, 0x3943,
- 0x6D9D, 0x6D9D, 0x09BF, 0x6D9E, 0x6D9E, 0x16D3, 0x6D9F, 0x6D9F, 0x09F9,
- 0x6DA0, 0x6DA0, 0x16D4, 0x6DA1, 0x6DA1, 0x0EDF, 0x6DA2, 0x6DA2, 0x3944,
- 0x6DA3, 0x6DA3, 0x07D6, 0x6DA4, 0x6DA4, 0x05B4, 0x6DA5, 0x6DA5, 0x3945,
- 0x6DA6, 0x6DA6, 0x0CCE, 0x6DA7, 0x6DA7, 0x0878, 0x6DA8, 0x6DA8, 0x1168,
- 0x6DA9, 0x6DA9, 0x0CE5, 0x6DAA, 0x6DAA, 0x069D, 0x6DAB, 0x6DAB, 0x16E8,
- 0x6DAC, 0x6DAD, 0x3946, 0x6DAE, 0x6DAE, 0x16EA, 0x6DAF, 0x6DAF, 0x0FED,
- 0x6DB0, 0x6DB1, 0x3948, 0x6DB2, 0x6DB2, 0x1041, 0x6DB3, 0x6DB4, 0x394A,
- 0x6DB5, 0x6DB5, 0x0764, 0x6DB6, 0x6DB7, 0x394C, 0x6DB8, 0x6DB8, 0x078B,
- 0x6DB9, 0x6DBE, 0x394E, 0x6DBF, 0x6DBF, 0x16E1, 0x6DC0, 0x6DC0, 0x05CE,
- 0x6DC1, 0x6DC3, 0x3954, 0x6DC4, 0x6DC4, 0x122A, 0x6DC5, 0x6DC5, 0x16DE,
- 0x6DC6, 0x6DC6, 0x0F6A, 0x6DC7, 0x6DC7, 0x16DD, 0x6DC8, 0x6DCA, 0x3957,
- 0x6DCB, 0x6DCB, 0x0A25, 0x6DCC, 0x6DCC, 0x0E1D, 0x6DCD, 0x6DD0, 0x395A,
- 0x6DD1, 0x6DD1, 0x0D7E, 0x6DD2, 0x6DD5, 0x395E, 0x6DD6, 0x6DD6, 0x0B3A,
- 0x6DD7, 0x6DD7, 0x3962, 0x6DD8, 0x6DD8, 0x0E27, 0x6DD9, 0x6DD9, 0x16E6,
- 0x6DDA, 0x6DDC, 0x3963, 0x6DDD, 0x6DDD, 0x16E5, 0x6DDE, 0x6DDE, 0x16DF,
- 0x6DDF, 0x6DDF, 0x3966, 0x6DE0, 0x6DE0, 0x16E2, 0x6DE1, 0x6DE1, 0x058E,
- 0x6DE2, 0x6DE3, 0x3967, 0x6DE4, 0x6DE4, 0x10BE, 0x6DE5, 0x6DE5, 0x3969,
- 0x6DE6, 0x6DE6, 0x16E4, 0x6DE7, 0x6DE9, 0x396A, 0x6DEA, 0x6DEA, 0x205E,
- 0x6DEB, 0x6DEB, 0x1080, 0x6DEC, 0x6DEC, 0x0566, 0x6DED, 0x6DED, 0x396D,
- 0x6DEE, 0x6DEE, 0x07C9, 0x6DEF, 0x6DF0, 0x396E, 0x6DF1, 0x6DF1, 0x0D27,
- 0x6DF2, 0x6DF2, 0x3970, 0x6DF3, 0x6DF3, 0x0541, 0x6DF4, 0x6DF4, 0x3971,
- 0x6DF5, 0x6DF5, 0x2244, 0x6DF6, 0x6DF6, 0x23E2, 0x6DF7, 0x6DF7, 0x0801,
- 0x6DF8, 0x6DF8, 0x3972, 0x6DF9, 0x6DF9, 0x0FF6, 0x6DFA, 0x6DFA, 0x20D4,
- 0x6DFB, 0x6DFB, 0x0E40, 0x6DFC, 0x6DFC, 0x1A21, 0x6DFD, 0x6DFF, 0x3973,
- 0x6E00, 0x6E04, 0x3976, 0x6E05, 0x6E05, 0x0C62, 0x6E06, 0x6E09, 0x397B,
- 0x6E0A, 0x6E0A, 0x10EB, 0x6E0B, 0x6E0B, 0x397F, 0x6E0C, 0x6E0C, 0x16E9,
- 0x6E0D, 0x6E0D, 0x1232, 0x6E0E, 0x6E0E, 0x16E0, 0x6E0F, 0x6E0F, 0x3980,
- 0x6E10, 0x6E10, 0x0876, 0x6E11, 0x6E11, 0x16E3, 0x6E12, 0x6E13, 0x3981,
- 0x6E14, 0x6E14, 0x10CB, 0x6E15, 0x6E15, 0x3983, 0x6E16, 0x6E16, 0x16E7,
- 0x6E17, 0x6E17, 0x0D31, 0x6E18, 0x6E19, 0x3984, 0x6E1A, 0x6E1A, 0x16DC,
- 0x6E1B, 0x6E1C, 0x3986, 0x6E1D, 0x6E1D, 0x10CA, 0x6E1E, 0x6E1F, 0x3988,
- 0x6E20, 0x6E20, 0x0C7B, 0x6E21, 0x6E21, 0x0608, 0x6E22, 0x6E22, 0x398A,
- 0x6E23, 0x6E23, 0x113F, 0x6E24, 0x6E24, 0x047A, 0x6E25, 0x6E25, 0x16F5,
- 0x6E26, 0x6E26, 0x219F, 0x6E27, 0x6E28, 0x398B, 0x6E29, 0x6E29, 0x0ED1,
- 0x6E2A, 0x6E2A, 0x398D, 0x6E2B, 0x6E2B, 0x16EB, 0x6E2C, 0x6E2C, 0x1E66,
- 0x6E2D, 0x6E2D, 0x0ECB, 0x6E2E, 0x6E2E, 0x398E, 0x6E2F, 0x6E2F, 0x06D6,
- 0x6E30, 0x6E31, 0x398F, 0x6E32, 0x6E32, 0x16F4, 0x6E33, 0x6E33, 0x3991,
- 0x6E34, 0x6E34, 0x0957, 0x6E35, 0x6E37, 0x3992, 0x6E38, 0x6E38, 0x10B3,
- 0x6E39, 0x6E39, 0x3995, 0x6E3A, 0x6E3A, 0x0AF1, 0x6E3B, 0x6E3D, 0x3996,
- 0x6E3E, 0x6E3E, 0x1F63, 0x6E3F, 0x6E42, 0x3999, 0x6E43, 0x6E43, 0x0B89,
- 0x6E44, 0x6E44, 0x16F6, 0x6E45, 0x6E4C, 0x399D, 0x6E4D, 0x6E4D, 0x0E75,
- 0x6E4E, 0x6E4E, 0x16ED, 0x6E4F, 0x6E52, 0x39A5, 0x6E53, 0x6E54, 0x16F2,
- 0x6E55, 0x6E55, 0x39A9, 0x6E56, 0x6E56, 0x07B5, 0x6E57, 0x6E57, 0x39AA,
- 0x6E58, 0x6E58, 0x0F53, 0x6E59, 0x6E5A, 0x39AB, 0x6E5B, 0x6E5B, 0x1160,
- 0x6E5C, 0x6E5D, 0x39AD, 0x6E5E, 0x6E5E, 0x23DD, 0x6E5F, 0x6E5F, 0x16F0,
- 0x6E60, 0x6E6A, 0x39AF, 0x6E6B, 0x6E6B, 0x16EE, 0x6E6C, 0x6E6D, 0x39BA,
- 0x6E6E, 0x6E6E, 0x16EC, 0x6E6F, 0x6E6F, 0x216B, 0x6E70, 0x6E7D, 0x39BC,
- 0x6E7E, 0x6E7E, 0x0E96, 0x6E7F, 0x6E7F, 0x0D41, 0x6E80, 0x6E82, 0x39CA,
- 0x6E83, 0x6E83, 0x098E, 0x6E84, 0x6E84, 0x39CD, 0x6E85, 0x6E85, 0x0877,
- 0x6E86, 0x6E86, 0x16F1, 0x6E87, 0x6E88, 0x39CE, 0x6E89, 0x6E89, 0x06C3,
- 0x6E8A, 0x6E8E, 0x39D0, 0x6E8F, 0x6E8F, 0x1705, 0x6E90, 0x6E90, 0x10F7,
- 0x6E91, 0x6E95, 0x39D5, 0x6E96, 0x6E96, 0x22B5, 0x6E97, 0x6E97, 0x39DA,
- 0x6E98, 0x6E98, 0x16F9, 0x6E99, 0x6E9B, 0x39DB, 0x6E9C, 0x6E9C, 0x0A38,
- 0x6E9D, 0x6E9D, 0x1F26, 0x6E9E, 0x6E9E, 0x39DE, 0x6E9F, 0x6E9F, 0x1707,
- 0x6EA0, 0x6EA1, 0x39DF, 0x6EA2, 0x6EA2, 0x106E, 0x6EA3, 0x6EA4, 0x39E1,
- 0x6EA5, 0x6EA5, 0x16FD, 0x6EA6, 0x6EA6, 0x39E3, 0x6EA7, 0x6EA7, 0x16FE,
- 0x6EA8, 0x6EA9, 0x39E4, 0x6EAA, 0x6EAA, 0x0F17, 0x6EAB, 0x6EAE, 0x39E6,
- 0x6EAF, 0x6EAF, 0x0DD2, 0x6EB0, 0x6EB0, 0x39EA, 0x6EB1, 0x6EB1, 0x16F8,
- 0x6EB2, 0x6EB2, 0x16EF, 0x6EB3, 0x6EB3, 0x39EB, 0x6EB4, 0x6EB4, 0x1703,
- 0x6EB5, 0x6EB5, 0x39EC, 0x6EB6, 0x6EB6, 0x0CB7, 0x6EB7, 0x6EB7, 0x1701,
- 0x6EB8, 0x6EB9, 0x39ED, 0x6EBA, 0x6EBA, 0x0B4A, 0x6EBB, 0x6EBB, 0x1700,
- 0x6EBC, 0x6EBC, 0x39EF, 0x6EBD, 0x6EBD, 0x16FF, 0x6EBE, 0x6EC0, 0x39F0,
- 0x6EC1, 0x6EC1, 0x0521, 0x6EC2, 0x6EC2, 0x1706, 0x6EC3, 0x6EC3, 0x39F3,
- 0x6EC4, 0x6EC4, 0x1E63, 0x6EC5, 0x6EC5, 0x2088, 0x6EC6, 0x6EC6, 0x39F4,
- 0x6EC7, 0x6EC7, 0x05C2, 0x6EC8, 0x6ECA, 0x39F5, 0x6ECB, 0x6ECB, 0x1229,
- 0x6ECC, 0x6ECC, 0x1EBD, 0x6ECD, 0x6ECD, 0x39F8, 0x6ECE, 0x6ECE, 0x2341,
- 0x6ECF, 0x6ECF, 0x1704, 0x6ED0, 0x6ED0, 0x39F9, 0x6ED1, 0x6ED1, 0x07C1,
- 0x6ED2, 0x6ED2, 0x39FA, 0x6ED3, 0x6ED3, 0x122F, 0x6ED4, 0x6ED4, 0x0E22,
- 0x6ED5, 0x6ED5, 0x19A8, 0x6ED6, 0x6ED6, 0x39FB, 0x6ED7, 0x6ED7, 0x1702,
- 0x6ED8, 0x6ED9, 0x39FC, 0x6EDA, 0x6EDA, 0x074F, 0x6EDB, 0x6EDD, 0x39FE,
- 0x6EDE, 0x6EDE, 0x11CC, 0x6EDF, 0x6EDF, 0x16F7, 0x6EE0, 0x6EE0, 0x16FA,
- 0x6EE1, 0x6EE1, 0x0AA1, 0x6EE2, 0x6EE2, 0x16FC, 0x6EE3, 0x6EE3, 0x3A01,
- 0x6EE4, 0x6EE4, 0x0A72, 0x6EE5, 0x6EE5, 0x09AF, 0x6EE6, 0x6EE6, 0x0A77,
- 0x6EE7, 0x6EE7, 0x3A02, 0x6EE8, 0x6EE8, 0x045E, 0x6EE9, 0x6EE9, 0x0E05,
- 0x6EEA, 0x6EEB, 0x3A03, 0x6EEC, 0x6EEC, 0x1F4B, 0x6EED, 0x6EEE, 0x3A05,
- 0x6EEF, 0x6EEF, 0x2292, 0x6EF0, 0x6EF1, 0x3A07, 0x6EF2, 0x6EF2, 0x2124,
- 0x6EF3, 0x6EF3, 0x3A09, 0x6EF4, 0x6EF4, 0x05AF, 0x6EF5, 0x6EF6, 0x3A0A,
- 0x6EF7, 0x6EF7, 0x2048, 0x6EF8, 0x6EF8, 0x23E0, 0x6EF9, 0x6EF9, 0x170D,
- 0x6EFA, 0x6EFE, 0x3A0C, 0x6EFF, 0x6EFF, 0x2077, 0x6F00, 0x6F00, 0x3A11,
- 0x6F01, 0x6F01, 0x223A, 0x6F02, 0x6F02, 0x0BCE, 0x6F03, 0x6F05, 0x3A12,
- 0x6F06, 0x6F06, 0x0C00, 0x6F07, 0x6F08, 0x3A15, 0x6F09, 0x6F09, 0x1713,
- 0x6F0A, 0x6F0E, 0x3A17, 0x6F0F, 0x6F0F, 0x0A50, 0x6F10, 0x6F12, 0x3A1C,
- 0x6F13, 0x6F13, 0x09D7, 0x6F14, 0x6F14, 0x1006, 0x6F15, 0x6F15, 0x170C,
- 0x6F16, 0x6F19, 0x3A1F, 0x6F1A, 0x6F1A, 0x20B1, 0x6F1B, 0x6F1F, 0x3A23,
- 0x6F20, 0x6F20, 0x0B11, 0x6F21, 0x6F21, 0x3A28, 0x6F22, 0x6F22, 0x1F41,
- 0x6F23, 0x6F23, 0x201C, 0x6F24, 0x6F24, 0x170B, 0x6F25, 0x6F28, 0x3A29,
- 0x6F29, 0x6F29, 0x1714, 0x6F2A, 0x6F2A, 0x1712, 0x6F2B, 0x6F2B, 0x0AA5,
- 0x6F2C, 0x6F2C, 0x22B8, 0x6F2D, 0x6F2D, 0x16FB, 0x6F2E, 0x6F2E, 0x3A2D,
- 0x6F2F, 0x6F2F, 0x170E, 0x6F30, 0x6F30, 0x3A2E, 0x6F31, 0x6F31, 0x0D95,
- 0x6F32, 0x6F32, 0x2276, 0x6F33, 0x6F33, 0x1165, 0x6F34, 0x6F35, 0x3A2F,
- 0x6F36, 0x6F36, 0x170F, 0x6F37, 0x6F37, 0x3A31, 0x6F38, 0x6F38, 0x1F9B,
- 0x6F39, 0x6F3D, 0x3A32, 0x6F3E, 0x6F3E, 0x1023, 0x6F3F, 0x6F3F, 0x1F9F,
- 0x6F40, 0x6F40, 0x3A37, 0x6F41, 0x6F41, 0x25CA, 0x6F42, 0x6F45, 0x3A38,
- 0x6F46, 0x6F47, 0x1709, 0x6F48, 0x6F4A, 0x3A3C, 0x6F4B, 0x6F4B, 0x1710,
- 0x6F4C, 0x6F4C, 0x3A3F, 0x6F4D, 0x6F4D, 0x0EBA, 0x6F4E, 0x6F50, 0x3A40,
- 0x6F51, 0x6F51, 0x20BE, 0x6F52, 0x6F53, 0x3A43, 0x6F54, 0x6F54, 0x1FB4,
- 0x6F55, 0x6F57, 0x3A45, 0x6F58, 0x6F58, 0x0B8C, 0x6F59, 0x6F59, 0x23D7,
- 0x6F5A, 0x6F5B, 0x3A48, 0x6F5C, 0x6F5C, 0x0C2E, 0x6F5D, 0x6F5D, 0x3A4A,
- 0x6F5E, 0x6F5E, 0x0A61, 0x6F5F, 0x6F61, 0x3A4B, 0x6F62, 0x6F62, 0x1708,
- 0x6F63, 0x6F63, 0x3A4E, 0x6F64, 0x6F64, 0x2105, 0x6F65, 0x6F65, 0x3A4F,
- 0x6F66, 0x6F66, 0x0A13, 0x6F67, 0x6F6C, 0x3A50, 0x6F6D, 0x6F6D, 0x0E09,
- 0x6F6E, 0x6F6E, 0x04D6, 0x6F6F, 0x6F6F, 0x23E1, 0x6F70, 0x6F70, 0x1FEC,
- 0x6F71, 0x6F71, 0x3A56, 0x6F72, 0x6F72, 0x1719, 0x6F73, 0x6F73, 0x3A57,
- 0x6F74, 0x6F74, 0x1711, 0x6F75, 0x6F76, 0x3A58, 0x6F77, 0x6F77, 0x23EA,
- 0x6F78, 0x6F78, 0x1718, 0x6F79, 0x6F79, 0x3A5A, 0x6F7A, 0x6F7A, 0x171B,
- 0x6F7B, 0x6F7B, 0x3A5B, 0x6F7C, 0x6F7C, 0x171A, 0x6F7D, 0x6F7E, 0x3A5C,
- 0x6F7F, 0x6F7F, 0x23E3, 0x6F80, 0x6F80, 0x210E, 0x6F81, 0x6F83, 0x3A5E,
- 0x6F84, 0x6F84, 0x04F3, 0x6F85, 0x6F85, 0x3A61, 0x6F86, 0x6F86, 0x1FA6,
- 0x6F87, 0x6F87, 0x2004, 0x6F88, 0x6F88, 0x04DF, 0x6F89, 0x6F89, 0x1715,
- 0x6F8A, 0x6F8B, 0x3A62, 0x6F8C, 0x6F8C, 0x1717, 0x6F8D, 0x6F8D, 0x1716,
- 0x6F8E, 0x6F8E, 0x0BAD, 0x6F8F, 0x6F96, 0x3A64, 0x6F97, 0x6F97, 0x1F9D,
- 0x6F98, 0x6F9B, 0x3A6C, 0x6F9C, 0x6F9C, 0x09A8, 0x6F9D, 0x6F9F, 0x3A70,
- 0x6FA0, 0x6FA0, 0x23E5, 0x6FA1, 0x6FA1, 0x112B, 0x6FA2, 0x6FA3, 0x3A73,
- 0x6FA4, 0x6FA4, 0x2264, 0x6FA5, 0x6FA6, 0x3A75, 0x6FA7, 0x6FA7, 0x171E,
- 0x6FA8, 0x6FA8, 0x3A77, 0x6FA9, 0x6FA9, 0x24E2, 0x6FAA, 0x6FAD, 0x3A78,
- 0x6FAE, 0x6FAE, 0x23DE, 0x6FAF, 0x6FB0, 0x3A7C, 0x6FB1, 0x6FB1, 0x1EC4,
- 0x6FB2, 0x6FB2, 0x3A7E, 0x6FB3, 0x6FB3, 0x03CF, 0x6FB4, 0x6FB5, 0x3A7F,
- 0x6FB6, 0x6FB6, 0x1720, 0x6FB7, 0x6FB8, 0x3A81, 0x6FB9, 0x6FB9, 0x171F,
- 0x6FBA, 0x6FBF, 0x3A83, 0x6FC0, 0x6FC0, 0x0817, 0x6FC1, 0x6FC1, 0x22B6,
- 0x6FC2, 0x6FC2, 0x1721, 0x6FC3, 0x6FC3, 0x20A9, 0x6FC4, 0x6FC8, 0x3A89,
- 0x6FC9, 0x6FC9, 0x171D, 0x6FCA, 0x6FD0, 0x3A8E, 0x6FD1, 0x6FD1, 0x171C,
- 0x6FD2, 0x6FD2, 0x045D, 0x6FD3, 0x6FD4, 0x3A95, 0x6FD5, 0x6FD5, 0x212B,
- 0x6FD6, 0x6FD7, 0x3A97, 0x6FD8, 0x6FD8, 0x20A5, 0x6FD9, 0x6FDA, 0x3A99,
- 0x6FDB, 0x6FDB, 0x268B, 0x6FDC, 0x6FDD, 0x3A9B, 0x6FDE, 0x6FDE, 0x1724,
- 0x6FDF, 0x6FDF, 0x1F76, 0x6FE0, 0x6FE0, 0x1725, 0x6FE1, 0x6FE1, 0x1722,
- 0x6FE2, 0x6FE3, 0x3A9D, 0x6FE4, 0x6FE4, 0x216D, 0x6FE5, 0x6FEA, 0x3A9F,
- 0x6FEB, 0x6FEB, 0x2001, 0x6FEC, 0x6FED, 0x3AA5, 0x6FEE, 0x6FEE, 0x1723,
- 0x6FEF, 0x6FEF, 0x1726, 0x6FF0, 0x6FF0, 0x2191, 0x6FF1, 0x6FF1, 0x1E50,
- 0x6FF2, 0x6FF9, 0x3AA7, 0x6FFA, 0x6FFA, 0x1F9C, 0x6FFB, 0x6FFB, 0x3AAF,
- 0x6FFC, 0x6FFC, 0x23DA, 0x6FFD, 0x6FFD, 0x3AB0, 0x6FFE, 0x6FFE, 0x2053,
- 0x6FFF, 0x6FFF, 0x3AB1, 0x7000, 0x7004, 0x3AB2, 0x7005, 0x7005, 0x23E9,
- 0x7006, 0x7006, 0x23E4, 0x7007, 0x7008, 0x3AB7, 0x7009, 0x7009, 0x21D5,
- 0x700A, 0x700A, 0x3AB9, 0x700B, 0x700B, 0x23E6, 0x700C, 0x700E, 0x3ABA,
- 0x700F, 0x700F, 0x23DF, 0x7010, 0x7010, 0x3ABD, 0x7011, 0x7011, 0x0BF8,
- 0x7012, 0x7014, 0x3ABE, 0x7015, 0x7015, 0x1E4F, 0x7016, 0x7017, 0x3AC1,
- 0x7018, 0x7018, 0x23D9, 0x7019, 0x7019, 0x3AC3, 0x701A, 0x701A, 0x1727,
- 0x701B, 0x701B, 0x1729, 0x701C, 0x701C, 0x3AC4, 0x701D, 0x701D, 0x2014,
- 0x701E, 0x701E, 0x3AC5, 0x701F, 0x701F, 0x23EC, 0x7020, 0x7020, 0x23EB,
- 0x7021, 0x7022, 0x3AC6, 0x7023, 0x7023, 0x1728, 0x7024, 0x7026, 0x3AC8,
- 0x7027, 0x7027, 0x23D8, 0x7028, 0x7028, 0x23EE, 0x7029, 0x702F, 0x3ACB,
- 0x7030, 0x7030, 0x268E, 0x7031, 0x7031, 0x3AD2, 0x7032, 0x7032, 0x23ED,
- 0x7033, 0x7034, 0x3AD3, 0x7035, 0x7035, 0x172B, 0x7036, 0x7038, 0x3AD5,
- 0x7039, 0x7039, 0x172A, 0x703A, 0x703D, 0x3AD8, 0x703E, 0x703E, 0x1FFA,
- 0x703F, 0x7042, 0x3ADC, 0x7043, 0x7043, 0x23D6, 0x7044, 0x7044, 0x23E8,
- 0x7045, 0x704B, 0x3AE0, 0x704C, 0x704C, 0x0739, 0x704D, 0x704E, 0x3AE7,
- 0x704F, 0x704F, 0x172C, 0x7050, 0x7050, 0x3AE9, 0x7051, 0x7051, 0x2106,
- 0x7052, 0x7054, 0x3AEA, 0x7055, 0x7055, 0x200B, 0x7056, 0x7057, 0x3AED,
- 0x7058, 0x7058, 0x2166, 0x7059, 0x705C, 0x3AEF, 0x705D, 0x705D, 0x23EF,
- 0x705E, 0x705E, 0x172D, 0x705F, 0x7062, 0x3AF3, 0x7063, 0x7063, 0x2189,
- 0x7064, 0x7064, 0x2058, 0x7065, 0x7066, 0x3AF7, 0x7067, 0x7067, 0x23E7,
- 0x7068, 0x706A, 0x3AF9, 0x706B, 0x706B, 0x0805, 0x706C, 0x706C, 0x19EF,
- 0x706D, 0x706D, 0x0AF5, 0x706E, 0x706E, 0x3AFC, 0x706F, 0x706F, 0x05A7,
- 0x7070, 0x7070, 0x07E7, 0x7071, 0x7074, 0x3AFD, 0x7075, 0x7075, 0x0A32,
- 0x7076, 0x7076, 0x1131, 0x7077, 0x7077, 0x3B01, 0x7078, 0x7078, 0x08F3,
- 0x7079, 0x707B, 0x3B02, 0x707C, 0x707C, 0x1223, 0x707D, 0x707D, 0x3B05,
- 0x707E, 0x707E, 0x1119, 0x707F, 0x707F, 0x049A, 0x7080, 0x7080, 0x19CC,
- 0x7081, 0x7084, 0x3B06, 0x7085, 0x7085, 0x1913, 0x7086, 0x7088, 0x3B0A,
- 0x7089, 0x7089, 0x0A56, 0x708A, 0x708A, 0x0539, 0x708B, 0x708D, 0x3B0D,
- 0x708E, 0x708E, 0x1000, 0x708F, 0x7091, 0x3B10, 0x7092, 0x7092, 0x04D9,
- 0x7093, 0x7093, 0x3B13, 0x7094, 0x7094, 0x0C8D, 0x7095, 0x7095, 0x0948,
- 0x7096, 0x7096, 0x19CE, 0x7097, 0x7098, 0x3B14, 0x7099, 0x7099, 0x11CA,
- 0x709A, 0x709B, 0x3B16, 0x709C, 0x709C, 0x19CD, 0x709D, 0x709D, 0x19CF,
- 0x709E, 0x70AA, 0x3B18, 0x70AB, 0x70AB, 0x19D3, 0x70AC, 0x70AC, 0x0915,
- 0x70AD, 0x70AD, 0x0E12, 0x70AE, 0x70AE, 0x0B9B, 0x70AF, 0x70AF, 0x08EB,
- 0x70B0, 0x70B0, 0x3B25, 0x70B1, 0x70B1, 0x19D4, 0x70B2, 0x70B2, 0x3B26,
- 0x70B3, 0x70B3, 0x0467, 0x70B4, 0x70B6, 0x3B27, 0x70B7, 0x70B7, 0x19D2,
- 0x70B8, 0x70B8, 0x1149, 0x70B9, 0x70B9, 0x05C4, 0x70BA, 0x70BA, 0x3B2A,
- 0x70BB, 0x70BB, 0x19D0, 0x70BC, 0x70BC, 0x09FF, 0x70BD, 0x70BD, 0x0508,
- 0x70BE, 0x70BF, 0x3B2B, 0x70C0, 0x70C0, 0x19D1, 0x70C1, 0x70C1, 0x0DAD,
- 0x70C2, 0x70C2, 0x09AE, 0x70C3, 0x70C3, 0x0E51, 0x70C4, 0x70C7, 0x3B2D,
- 0x70C8, 0x70C8, 0x0A1B, 0x70C9, 0x70C9, 0x3B31, 0x70CA, 0x70CA, 0x19D6,
- 0x70CB, 0x70CE, 0x3B32, 0x70CF, 0x70CF, 0x21A3, 0x70D0, 0x70D7, 0x3B36,
- 0x70D8, 0x70D8, 0x079D, 0x70D9, 0x70D9, 0x09BE, 0x70DA, 0x70DA, 0x3B3E,
- 0x70DB, 0x70DB, 0x11F1, 0x70DC, 0x70DE, 0x3B3F, 0x70DF, 0x70DF, 0x0FF5,
- 0x70E0, 0x70E3, 0x3B42, 0x70E4, 0x70E4, 0x094B, 0x70E5, 0x70E5, 0x3B46,
- 0x70E6, 0x70E6, 0x0650, 0x70E7, 0x70E7, 0x0D0E, 0x70E8, 0x70E8, 0x19D5,
- 0x70E9, 0x70E9, 0x07F7, 0x70EA, 0x70EA, 0x3B47, 0x70EB, 0x70EB, 0x0E1F,
- 0x70EC, 0x70EC, 0x08CE, 0x70ED, 0x70ED, 0x0CA3, 0x70EE, 0x70EE, 0x3B48,
- 0x70EF, 0x70EF, 0x0F16, 0x70F0, 0x70F3, 0x3B49, 0x70F4, 0x70F4, 0x217A,
- 0x70F5, 0x70F6, 0x3B4D, 0x70F7, 0x70F7, 0x0E9A, 0x70F8, 0x70F8, 0x3B4F,
- 0x70F9, 0x70F9, 0x0BAC, 0x70FA, 0x70FC, 0x3B50, 0x70FD, 0x70FD, 0x0686,
- 0x70FE, 0x70FF, 0x3B53, 0x7100, 0x7108, 0x3B55, 0x7109, 0x7109, 0x0FF2,
- 0x710A, 0x710A, 0x076F, 0x710B, 0x710F, 0x3B5E, 0x7110, 0x7110, 0x19D7,
- 0x7111, 0x7112, 0x3B63, 0x7113, 0x7113, 0x19D8, 0x7114, 0x7114, 0x3B65,
- 0x7115, 0x7115, 0x07D5, 0x7116, 0x7116, 0x19D9, 0x7117, 0x7117, 0x3B66,
- 0x7118, 0x7118, 0x19F0, 0x7119, 0x7119, 0x0423, 0x711A, 0x711A, 0x0676,
- 0x711B, 0x7120, 0x3B67, 0x7121, 0x7121, 0x21A5, 0x7122, 0x7125, 0x3B6D,
- 0x7126, 0x7126, 0x088A, 0x7127, 0x712E, 0x3B71, 0x712F, 0x712F, 0x19DA,
- 0x7130, 0x7130, 0x100F, 0x7131, 0x7131, 0x19DB, 0x7132, 0x7135, 0x3B79,
- 0x7136, 0x7136, 0x0C96, 0x7137, 0x7144, 0x3B7D, 0x7145, 0x7145, 0x19DF,
- 0x7146, 0x7148, 0x3B8B, 0x7149, 0x7149, 0x2022, 0x714A, 0x714A, 0x19E1,
- 0x714B, 0x714B, 0x3B8E, 0x714C, 0x714C, 0x07E2, 0x714D, 0x714D, 0x3B8F,
- 0x714E, 0x714E, 0x0858, 0x714F, 0x7151, 0x3B90, 0x7152, 0x7152, 0x24D6,
- 0x7153, 0x715B, 0x3B93, 0x715C, 0x715C, 0x19DD, 0x715D, 0x715D, 0x3B9C,
- 0x715E, 0x715E, 0x0CF0, 0x715F, 0x7161, 0x3B9D, 0x7162, 0x7162, 0x233A,
- 0x7163, 0x7163, 0x3BA0, 0x7164, 0x7164, 0x0ABF, 0x7165, 0x7165, 0x3BA1,
- 0x7166, 0x7166, 0x19F1, 0x7167, 0x7167, 0x1176, 0x7168, 0x7168, 0x19DE,
- 0x7169, 0x7169, 0x1EEE, 0x716A, 0x716B, 0x3BA2, 0x716C, 0x716C, 0x24D5,
- 0x716D, 0x716D, 0x3BA4, 0x716E, 0x716E, 0x11F2, 0x716F, 0x7171, 0x3BA5,
- 0x7172, 0x7172, 0x19E0, 0x7173, 0x7173, 0x19DC, 0x7174, 0x7177, 0x3BA8,
- 0x7178, 0x7178, 0x19E2, 0x7179, 0x7179, 0x3BAC, 0x717A, 0x717A, 0x19E3,
- 0x717B, 0x717C, 0x3BAD, 0x717D, 0x717D, 0x0CF8, 0x717E, 0x7183, 0x3BAF,
- 0x7184, 0x7184, 0x0F15, 0x7185, 0x7189, 0x3BB5, 0x718A, 0x718A, 0x0FA7,
- 0x718B, 0x718E, 0x3BBA, 0x718F, 0x718F, 0x0FD5, 0x7190, 0x7191, 0x3BBE,
- 0x7192, 0x7192, 0x2228, 0x7193, 0x7193, 0x3BC0, 0x7194, 0x7194, 0x0CB6,
- 0x7195, 0x7196, 0x3BC1, 0x7197, 0x7197, 0x24D7, 0x7198, 0x7198, 0x19E4,
- 0x7199, 0x7199, 0x0F04, 0x719A, 0x719E, 0x3BC3, 0x719F, 0x719F, 0x0D83,
- 0x71A0, 0x71A0, 0x19E8, 0x71A1, 0x71A7, 0x3BC8, 0x71A8, 0x71A8, 0x19E7,
- 0x71A9, 0x71AB, 0x3BCF, 0x71AC, 0x71AC, 0x03C9, 0x71AD, 0x71B0, 0x3BD2,
- 0x71B1, 0x71B1, 0x20FC, 0x71B2, 0x71B2, 0x3BD6, 0x71B3, 0x71B3, 0x19E5,
- 0x71B4, 0x71B4, 0x3BD7, 0x71B5, 0x71B5, 0x19E6, 0x71B6, 0x71B8, 0x3BD8,
- 0x71B9, 0x71B9, 0x19F2, 0x71BA, 0x71BD, 0x3BDB, 0x71BE, 0x71BE, 0x1E87,
- 0x71BF, 0x71C0, 0x3BDF, 0x71C1, 0x71C1, 0x24D8, 0x71C2, 0x71C2, 0x3BE1,
- 0x71C3, 0x71C3, 0x0C97, 0x71C4, 0x71C7, 0x3BE2, 0x71C8, 0x71C8, 0x1EBA,
- 0x71C9, 0x71CD, 0x3BE6, 0x71CE, 0x71CE, 0x0A10, 0x71CF, 0x71D1, 0x3BEB,
- 0x71D2, 0x71D2, 0x2119, 0x71D3, 0x71D3, 0x3BEE, 0x71D4, 0x71D4, 0x19EA,
- 0x71D5, 0x71D5, 0x1009, 0x71D6, 0x71D8, 0x3BEF, 0x71D9, 0x71D9, 0x216C,
- 0x71DA, 0x71DB, 0x3BF2, 0x71DC, 0x71DC, 0x24D9, 0x71DD, 0x71DE, 0x3BF4,
- 0x71DF, 0x71DF, 0x2227, 0x71E0, 0x71E0, 0x19E9, 0x71E1, 0x71E4, 0x3BF6,
- 0x71E5, 0x71E5, 0x1132, 0x71E6, 0x71E6, 0x1E5F, 0x71E7, 0x71E7, 0x19EB,
- 0x71E8, 0x71EC, 0x3BFA, 0x71ED, 0x71ED, 0x229F, 0x71EE, 0x71EE, 0x1396,
- 0x71EF, 0x71F3, 0x3BFF, 0x71F4, 0x71F4, 0x1F5D, 0x71F5, 0x71F8, 0x3C04,
- 0x71F9, 0x71F9, 0x19EC, 0x71FA, 0x71FB, 0x3C08, 0x71FC, 0x71FC, 0x1FBC,
- 0x71FD, 0x71FD, 0x3C0A, 0x71FE, 0x71FE, 0x24DA, 0x71FF, 0x71FF, 0x3C0B,
- 0x7200, 0x7205, 0x3C0C, 0x7206, 0x7206, 0x0415, 0x7207, 0x720C, 0x3C12,
- 0x720D, 0x720D, 0x2149, 0x720E, 0x720F, 0x3C18, 0x7210, 0x7210, 0x2046,
- 0x7211, 0x721A, 0x3C1A, 0x721B, 0x721B, 0x2000, 0x721C, 0x721C, 0x3C24,
- 0x721D, 0x721D, 0x19ED, 0x721E, 0x7227, 0x3C25, 0x7228, 0x7228, 0x19EE,
- 0x7229, 0x7229, 0x3C2F, 0x722A, 0x722A, 0x1203, 0x722B, 0x722B, 0x3C30,
- 0x722C, 0x722C, 0x0B81, 0x722D, 0x722F, 0x3C31, 0x7230, 0x7230, 0x196C,
- 0x7231, 0x7231, 0x03B9, 0x7232, 0x7232, 0x2190, 0x7233, 0x7234, 0x3C34,
- 0x7235, 0x7235, 0x0923, 0x7236, 0x7236, 0x06B3, 0x7237, 0x7237, 0x1036,
- 0x7238, 0x7238, 0x03E1, 0x7239, 0x7239, 0x05DA, 0x723A, 0x723A, 0x2208,
- 0x723B, 0x723B, 0x1269, 0x723C, 0x723C, 0x3C36, 0x723D, 0x723D, 0x0DA1,
- 0x723E, 0x723E, 0x1EE6, 0x723F, 0x723F, 0x169D, 0x7240, 0x7246, 0x3C37,
- 0x7247, 0x7247, 0x0BCB, 0x7248, 0x7248, 0x03F1, 0x7249, 0x724B, 0x3C3E,
- 0x724C, 0x724C, 0x0B87, 0x724D, 0x724D, 0x1969, 0x724E, 0x7251, 0x3C41,
- 0x7252, 0x7252, 0x196A, 0x7253, 0x7255, 0x3C45, 0x7256, 0x7256, 0x196B,
- 0x7257, 0x7257, 0x3C48, 0x7258, 0x7258, 0x24C3, 0x7259, 0x7259, 0x0FE9,
- 0x725A, 0x725A, 0x3C49, 0x725B, 0x725B, 0x0B64, 0x725C, 0x725C, 0x3C4A,
- 0x725D, 0x725D, 0x1944, 0x725E, 0x725E, 0x3C4B, 0x725F, 0x725F, 0x0B15,
- 0x7260, 0x7260, 0x3C4C, 0x7261, 0x7261, 0x0B18, 0x7262, 0x7262, 0x09B9,
- 0x7263, 0x7265, 0x3C4D, 0x7266, 0x7266, 0x1945, 0x7267, 0x7267, 0x0B24,
- 0x7268, 0x7268, 0x3C50, 0x7269, 0x7269, 0x0EFE, 0x726A, 0x726D, 0x3C51,
- 0x726E, 0x726E, 0x1942, 0x726F, 0x726F, 0x1946, 0x7270, 0x7271, 0x3C55,
- 0x7272, 0x7272, 0x0D35, 0x7273, 0x7274, 0x3C57, 0x7275, 0x7275, 0x0C20,
- 0x7276, 0x7278, 0x3C59, 0x7279, 0x7279, 0x0E2B, 0x727A, 0x727A, 0x0F0D,
- 0x727B, 0x727C, 0x3C5C, 0x727D, 0x727D, 0x20CC, 0x727E, 0x727F, 0x1947,
- 0x7280, 0x7280, 0x0F19, 0x7281, 0x7281, 0x09D2, 0x7282, 0x7283, 0x3C5E,
- 0x7284, 0x7284, 0x1949, 0x7285, 0x7289, 0x3C60, 0x728A, 0x728A, 0x05FE,
- 0x728B, 0x728B, 0x194A, 0x728C, 0x728C, 0x3C65, 0x728D, 0x728D, 0x194B,
- 0x728E, 0x728E, 0x3C66, 0x728F, 0x728F, 0x194C, 0x7290, 0x7291, 0x3C67,
- 0x7292, 0x7292, 0x194D, 0x7293, 0x7295, 0x3C69, 0x7296, 0x7296, 0x2340,
- 0x7297, 0x729E, 0x3C6C, 0x729F, 0x729F, 0x1943, 0x72A0, 0x72A1, 0x3C74,
- 0x72A2, 0x72A2, 0x1ED1, 0x72A3, 0x72A6, 0x3C76, 0x72A7, 0x72A7, 0x21AC,
- 0x72A8, 0x72AB, 0x3C7A, 0x72AC, 0x72AC, 0x0C89, 0x72AD, 0x72AD, 0x15EF,
- 0x72AE, 0x72AE, 0x3C7E, 0x72AF, 0x72AF, 0x0655, 0x72B0, 0x72B0, 0x15F0,
- 0x72B1, 0x72B3, 0x3C7F, 0x72B4, 0x72B4, 0x15F1, 0x72B5, 0x72B5, 0x3C82,
- 0x72B6, 0x72B6, 0x1211, 0x72B7, 0x72B8, 0x15F2, 0x72B9, 0x72B9, 0x10B1,
- 0x72BA, 0x72BF, 0x3C83, 0x72C0, 0x72C0, 0x22AF, 0x72C1, 0x72C1, 0x15F5,
- 0x72C2, 0x72C2, 0x097E, 0x72C3, 0x72C3, 0x15F4, 0x72C4, 0x72C4, 0x05B3,
- 0x72C5, 0x72C7, 0x3C89, 0x72C8, 0x72C8, 0x0420, 0x72C9, 0x72CC, 0x3C8C,
- 0x72CD, 0x72CD, 0x15F7, 0x72CE, 0x72CE, 0x15F6, 0x72CF, 0x72CF, 0x3C90,
- 0x72D0, 0x72D0, 0x07B3, 0x72D1, 0x72D1, 0x3C91, 0x72D2, 0x72D2, 0x15F8,
- 0x72D3, 0x72D6, 0x3C92, 0x72D7, 0x72D7, 0x0710, 0x72D8, 0x72D8, 0x3C96,
- 0x72D9, 0x72D9, 0x0900, 0x72DA, 0x72DD, 0x3C97, 0x72DE, 0x72DE, 0x0B5F,
- 0x72DF, 0x72DF, 0x3C9B, 0x72E0, 0x72E0, 0x0794, 0x72E1, 0x72E1, 0x0897,
- 0x72E2, 0x72E7, 0x3C9C, 0x72E8, 0x72E8, 0x15F9, 0x72E9, 0x72E9, 0x15FB,
- 0x72EA, 0x72EB, 0x3CA2, 0x72EC, 0x72EC, 0x05FF, 0x72ED, 0x72ED, 0x0F2E,
- 0x72EE, 0x72EE, 0x0D3F, 0x72EF, 0x72EF, 0x15FA, 0x72F0, 0x72F0, 0x1199,
- 0x72F1, 0x72F1, 0x10E1, 0x72F2, 0x72F2, 0x15FC, 0x72F3, 0x72F3, 0x1600,
- 0x72F4, 0x72F4, 0x15FD, 0x72F5, 0x72F6, 0x3CA4, 0x72F7, 0x72F7, 0x15FE,
- 0x72F8, 0x72F8, 0x09D5, 0x72F9, 0x72F9, 0x21B6, 0x72FA, 0x72FB, 0x1602,
- 0x72FC, 0x72FC, 0x09B2, 0x72FD, 0x72FD, 0x1E3D, 0x72FE, 0x72FF, 0x3CA6,
- 0x7300, 0x7300, 0x3CA8, 0x7301, 0x7301, 0x15FF, 0x7302, 0x7302, 0x3CA9,
- 0x7303, 0x7303, 0x1601, 0x7304, 0x7309, 0x3CAA, 0x730A, 0x730A, 0x1607,
- 0x730B, 0x730D, 0x3CB0, 0x730E, 0x730E, 0x0A1D, 0x730F, 0x7312, 0x3CB3,
- 0x7313, 0x7313, 0x1605, 0x7314, 0x7314, 0x3CB7, 0x7315, 0x7315, 0x160A,
- 0x7316, 0x7316, 0x04C5, 0x7317, 0x7317, 0x1604, 0x7318, 0x731A, 0x3CB8,
- 0x731B, 0x731B, 0x0AD2, 0x731C, 0x731C, 0x0489, 0x731D, 0x731D, 0x1609,
- 0x731E, 0x731E, 0x1608, 0x731F, 0x7320, 0x3CBB, 0x7321, 0x7321, 0x1606,
- 0x7322, 0x7322, 0x160B, 0x7323, 0x7324, 0x3CBD, 0x7325, 0x7325, 0x160D,
- 0x7326, 0x7328, 0x3CBF, 0x7329, 0x7329, 0x0F94, 0x732A, 0x732A, 0x11EC,
- 0x732B, 0x732B, 0x0AAD, 0x732C, 0x732C, 0x160E, 0x732D, 0x732D, 0x3CC2,
- 0x732E, 0x732E, 0x0F44, 0x732F, 0x7330, 0x3CC3, 0x7331, 0x7331, 0x1610,
- 0x7332, 0x7333, 0x3CC5, 0x7334, 0x7334, 0x07A6, 0x7335, 0x7335, 0x3CC7,
- 0x7336, 0x7336, 0x2235, 0x7337, 0x7337, 0x18D4, 0x7338, 0x7338, 0x160F,
- 0x7339, 0x7339, 0x160C, 0x733A, 0x733A, 0x3CC8, 0x733B, 0x733B, 0x2397,
- 0x733C, 0x733D, 0x3CC9, 0x733E, 0x733E, 0x07C0, 0x733F, 0x733F, 0x10F6,
- 0x7340, 0x7340, 0x3CCB, 0x7341, 0x7341, 0x2395, 0x7342, 0x7343, 0x3CCC,
- 0x7344, 0x7344, 0x223F, 0x7345, 0x7345, 0x212A, 0x7346, 0x734C, 0x3CCE,
- 0x734D, 0x734D, 0x1612, 0x734E, 0x734F, 0x3CD5, 0x7350, 0x7350, 0x1611,
- 0x7351, 0x7351, 0x3CD7, 0x7352, 0x7352, 0x18D5, 0x7353, 0x7356, 0x3CD8,
- 0x7357, 0x7357, 0x1613, 0x7358, 0x735F, 0x3CDC, 0x7360, 0x7360, 0x1614,
- 0x7361, 0x7367, 0x3CE4, 0x7368, 0x7368, 0x1ED2, 0x7369, 0x7369, 0x3CEB,
- 0x736A, 0x736A, 0x2396, 0x736B, 0x736B, 0x2398, 0x736C, 0x736C, 0x1615,
- 0x736D, 0x736D, 0x0DF4, 0x736E, 0x736E, 0x3CEC, 0x736F, 0x736F, 0x1616,
- 0x7370, 0x7370, 0x20A2, 0x7371, 0x7371, 0x3CED, 0x7372, 0x7372, 0x1F64,
- 0x7373, 0x7374, 0x3CEE, 0x7375, 0x7375, 0x202B, 0x7376, 0x7376, 0x3CF0,
- 0x7377, 0x7377, 0x2394, 0x7378, 0x7378, 0x2139, 0x7379, 0x7379, 0x3CF1,
- 0x737A, 0x737A, 0x215F, 0x737B, 0x737B, 0x21C1, 0x737C, 0x737C, 0x239A,
- 0x737D, 0x737D, 0x3CF2, 0x737E, 0x737E, 0x1617, 0x737F, 0x737F, 0x3CF3,
- 0x7380, 0x7380, 0x2399, 0x7381, 0x7383, 0x3CF4, 0x7384, 0x7384, 0x0FC9,
- 0x7385, 0x7386, 0x3CF7, 0x7387, 0x7387, 0x0A71, 0x7388, 0x7388, 0x3CF9,
- 0x7389, 0x7389, 0x10D6, 0x738A, 0x738A, 0x3CFA, 0x738B, 0x738B, 0x0EA6,
- 0x738C, 0x738D, 0x3CFB, 0x738E, 0x738E, 0x1818, 0x738F, 0x7390, 0x3CFD,
- 0x7391, 0x7391, 0x1819, 0x7392, 0x7395, 0x3CFF, 0x7396, 0x7396, 0x08F0,
- 0x7397, 0x739A, 0x3D03, 0x739B, 0x739B, 0x0A91, 0x739C, 0x739E, 0x3D07,
- 0x739F, 0x739F, 0x181C, 0x73A0, 0x73A1, 0x3D0A, 0x73A2, 0x73A2, 0x181B,
- 0x73A3, 0x73A8, 0x3D0C, 0x73A9, 0x73A9, 0x0E97, 0x73AA, 0x73AA, 0x3D12,
- 0x73AB, 0x73AB, 0x0ABA, 0x73AC, 0x73AD, 0x3D13, 0x73AE, 0x73AE, 0x181A,
- 0x73AF, 0x73AF, 0x07CC, 0x73B0, 0x73B0, 0x0F43, 0x73B1, 0x73B1, 0x3D15,
- 0x73B2, 0x73B2, 0x0A2A, 0x73B3, 0x73B3, 0x1821, 0x73B4, 0x73B6, 0x3D16,
- 0x73B7, 0x73B7, 0x1820, 0x73B8, 0x73B9, 0x3D19, 0x73BA, 0x73BA, 0x182C,
- 0x73BB, 0x73BB, 0x046A, 0x73BC, 0x73BF, 0x3D1B, 0x73C0, 0x73C0, 0x1822,
- 0x73C1, 0x73C1, 0x3D1F, 0x73C2, 0x73C2, 0x181E, 0x73C3, 0x73C7, 0x3D20,
- 0x73C8, 0x73C8, 0x1824, 0x73C9, 0x73C9, 0x1823, 0x73CA, 0x73CA, 0x0CF3,
- 0x73CB, 0x73CC, 0x3D25, 0x73CD, 0x73CD, 0x1185, 0x73CE, 0x73CE, 0x3D27,
- 0x73CF, 0x73CF, 0x181D, 0x73D0, 0x73D0, 0x0646, 0x73D1, 0x73D1, 0x181F,
- 0x73D2, 0x73D8, 0x3D28, 0x73D9, 0x73D9, 0x1826, 0x73DA, 0x73DD, 0x3D2F,
- 0x73DE, 0x73DE, 0x182B, 0x73DF, 0x73DF, 0x3D33, 0x73E0, 0x73E0, 0x11E8,
- 0x73E1, 0x73E4, 0x3D34, 0x73E5, 0x73E5, 0x1825, 0x73E6, 0x73E6, 0x3D38,
- 0x73E7, 0x73E7, 0x182A, 0x73E8, 0x73E8, 0x3D39, 0x73E9, 0x73E9, 0x1829,
- 0x73EA, 0x73EC, 0x3D3A, 0x73ED, 0x73ED, 0x03EB, 0x73EE, 0x73F1, 0x3D3D,
- 0x73F2, 0x73F2, 0x182D, 0x73F3, 0x73FD, 0x3D41, 0x73FE, 0x73FE, 0x21C0,
- 0x73FF, 0x73FF, 0x3D4C, 0x7400, 0x7402, 0x3D4D, 0x7403, 0x7403, 0x0C6F,
- 0x7404, 0x7404, 0x3D50, 0x7405, 0x7405, 0x09B0, 0x7406, 0x7406, 0x09D8,
- 0x7407, 0x7408, 0x3D51, 0x7409, 0x7409, 0x0A39, 0x740A, 0x740A, 0x1828,
- 0x740B, 0x740E, 0x3D53, 0x740F, 0x740F, 0x182E, 0x7410, 0x7410, 0x0DEB,
- 0x7411, 0x7419, 0x3D57, 0x741A, 0x741A, 0x1838, 0x741B, 0x741B, 0x1837,
- 0x741C, 0x7421, 0x3D60, 0x7422, 0x7422, 0x121E, 0x7423, 0x7424, 0x3D66,
- 0x7425, 0x7425, 0x1832, 0x7426, 0x7426, 0x1831, 0x7427, 0x7427, 0x3D68,
- 0x7428, 0x7428, 0x1833, 0x7429, 0x7429, 0x3D69, 0x742A, 0x742A, 0x182F,
- 0x742B, 0x742B, 0x3D6A, 0x742C, 0x742C, 0x1836, 0x742D, 0x742D, 0x3D6B,
- 0x742E, 0x742E, 0x1835, 0x742F, 0x742F, 0x3D6C, 0x7430, 0x7430, 0x1834,
- 0x7431, 0x7432, 0x3D6D, 0x7433, 0x7433, 0x0A1E, 0x7434, 0x7434, 0x0C56,
- 0x7435, 0x7435, 0x0BBE, 0x7436, 0x7436, 0x0B84, 0x7437, 0x743B, 0x3D6F,
- 0x743C, 0x743C, 0x0C6A, 0x743D, 0x743E, 0x3D74, 0x743F, 0x743F, 0x2460,
- 0x7440, 0x7440, 0x3D76, 0x7441, 0x7441, 0x1839, 0x7442, 0x744A, 0x3D77,
- 0x744B, 0x744B, 0x245C, 0x744C, 0x7454, 0x3D80, 0x7455, 0x7455, 0x183C,
- 0x7456, 0x7456, 0x3D89, 0x7457, 0x7457, 0x183B, 0x7458, 0x7458, 0x3D8A,
- 0x7459, 0x7459, 0x183D, 0x745A, 0x745A, 0x07AE, 0x745B, 0x745B, 0x1830,
- 0x745C, 0x745C, 0x183A, 0x745D, 0x745D, 0x3D8B, 0x745E, 0x745E, 0x0CCB,
- 0x745F, 0x745F, 0x0CE3, 0x7460, 0x7462, 0x3D8C, 0x7463, 0x7463, 0x215D,
- 0x7464, 0x7468, 0x3D8F, 0x7469, 0x7469, 0x2225, 0x746A, 0x746A, 0x206A,
- 0x746B, 0x746C, 0x3D94, 0x746D, 0x746D, 0x183F, 0x746E, 0x746F, 0x3D96,
- 0x7470, 0x7470, 0x073E, 0x7471, 0x7475, 0x3D98, 0x7476, 0x7476, 0x1027,
- 0x7477, 0x7477, 0x183E, 0x7478, 0x747D, 0x3D9D, 0x747E, 0x747E, 0x1840,
- 0x747F, 0x747F, 0x3DA3, 0x7480, 0x7481, 0x1843, 0x7482, 0x7482, 0x3DA4,
- 0x7483, 0x7483, 0x09F0, 0x7484, 0x7486, 0x3DA5, 0x7487, 0x7487, 0x1845,
- 0x7488, 0x7488, 0x3DA8, 0x7489, 0x7489, 0x2461, 0x748A, 0x748A, 0x3DA9,
- 0x748B, 0x748B, 0x1846, 0x748C, 0x748D, 0x3DAA, 0x748E, 0x748E, 0x1842,
- 0x748F, 0x748F, 0x3DAC, 0x7490, 0x7490, 0x184A, 0x7491, 0x749B, 0x3DAD,
- 0x749C, 0x749C, 0x1841, 0x749D, 0x749D, 0x3DB8, 0x749E, 0x749E, 0x1847,
- 0x749F, 0x74A2, 0x3DB9, 0x74A3, 0x74A3, 0x245B, 0x74A4, 0x74A5, 0x3DBD,
- 0x74A6, 0x74A6, 0x2462, 0x74A7, 0x74A7, 0x184B, 0x74A8, 0x74A9, 0x1848,
- 0x74AA, 0x74AF, 0x3DBF, 0x74B0, 0x74B0, 0x1F54, 0x74B1, 0x74B9, 0x3DC5,
- 0x74BA, 0x74BA, 0x184D, 0x74BB, 0x74BC, 0x3DCE, 0x74BD, 0x74BD, 0x245F,
- 0x74BE, 0x74C9, 0x3DD0, 0x74CA, 0x74CA, 0x20EC, 0x74CB, 0x74CE, 0x3DDC,
- 0x74CF, 0x74CF, 0x245D, 0x74D0, 0x74D1, 0x3DE0, 0x74D2, 0x74D2, 0x184C,
- 0x74D3, 0x74D3, 0x3DE2, 0x74D4, 0x74D4, 0x2463, 0x74D5, 0x74D9, 0x3DE3,
- 0x74DA, 0x74DA, 0x2464, 0x74DB, 0x74DB, 0x3DE8, 0x74DC, 0x74DC, 0x0728,
- 0x74DD, 0x74DD, 0x3DE9, 0x74DE, 0x74DE, 0x1B32, 0x74DF, 0x74DF, 0x3DEA,
- 0x74E0, 0x74E0, 0x1B33, 0x74E1, 0x74E1, 0x3DEB, 0x74E2, 0x74E2, 0x0BCF,
- 0x74E3, 0x74E3, 0x03F5, 0x74E4, 0x74E4, 0x0C9A, 0x74E5, 0x74E5, 0x3DEC,
- 0x74E6, 0x74E6, 0x0E90, 0x74E7, 0x74ED, 0x3DED, 0x74EE, 0x74EE, 0x0EDC,
- 0x74EF, 0x74EF, 0x1903, 0x74F0, 0x74F3, 0x3DF4, 0x74F4, 0x74F4, 0x1904,
- 0x74F5, 0x74F5, 0x3DF8, 0x74F6, 0x74F6, 0x0BDE, 0x74F7, 0x74F7, 0x054C,
- 0x74F8, 0x74FE, 0x3DF9, 0x74FF, 0x74FF, 0x1905, 0x7500, 0x7503, 0x3E00,
- 0x7504, 0x7504, 0x1188, 0x7505, 0x750B, 0x3E04, 0x750C, 0x750C, 0x24A5,
- 0x750D, 0x750D, 0x1485, 0x750E, 0x750E, 0x3E0B, 0x750F, 0x750F, 0x1906,
- 0x7510, 0x7510, 0x3E0C, 0x7511, 0x7511, 0x1907, 0x7512, 0x7512, 0x3E0D,
- 0x7513, 0x7513, 0x1908, 0x7514, 0x7517, 0x3E0E, 0x7518, 0x7518, 0x06C5,
- 0x7519, 0x7519, 0x14F8, 0x751A, 0x751A, 0x0D2E, 0x751B, 0x751B, 0x3E12,
- 0x751C, 0x751C, 0x0E43, 0x751D, 0x751E, 0x3E13, 0x751F, 0x751F, 0x0D33,
- 0x7520, 0x7522, 0x3E15, 0x7523, 0x7523, 0x1E70, 0x7524, 0x7524, 0x3E18,
- 0x7525, 0x7525, 0x0D34, 0x7526, 0x7527, 0x3E19, 0x7528, 0x7528, 0x10A8,
- 0x7529, 0x7529, 0x0D9B, 0x752A, 0x752A, 0x3E1B, 0x752B, 0x752B, 0x06A1,
- 0x752C, 0x752C, 0x1B34, 0x752D, 0x752D, 0x042B, 0x752E, 0x752E, 0x3E1C,
- 0x752F, 0x752F, 0x1734, 0x7530, 0x7530, 0x0E42, 0x7531, 0x7531, 0x10AE,
- 0x7532, 0x7532, 0x084A, 0x7533, 0x7533, 0x0D23, 0x7534, 0x7534, 0x3E1D,
- 0x7535, 0x7535, 0x05C8, 0x7536, 0x7536, 0x3E1E, 0x7537, 0x7537, 0x0B33,
- 0x7538, 0x7538, 0x05CA, 0x7539, 0x7539, 0x3E1F, 0x753A, 0x753A, 0x1A78,
- 0x753B, 0x753B, 0x07C2, 0x753C, 0x753D, 0x3E20, 0x753E, 0x753E, 0x1816,
- 0x753F, 0x753F, 0x3E22, 0x7540, 0x7540, 0x1A79, 0x7541, 0x7544, 0x3E23,
- 0x7545, 0x7545, 0x04CE, 0x7546, 0x7547, 0x3E27, 0x7548, 0x7548, 0x1A7C,
- 0x7549, 0x754A, 0x3E29, 0x754B, 0x754B, 0x1A7B, 0x754C, 0x754C, 0x08B8,
- 0x754D, 0x754D, 0x3E2B, 0x754E, 0x754E, 0x1A7A, 0x754F, 0x754F, 0x0EC6,
- 0x7550, 0x7553, 0x3E2C, 0x7554, 0x7554, 0x0B90, 0x7555, 0x7558, 0x3E30,
- 0x7559, 0x7559, 0x0A3D, 0x755A, 0x755A, 0x139E, 0x755B, 0x755B, 0x1A7D,
- 0x755C, 0x755C, 0x0FBE, 0x755D, 0x755D, 0x208F, 0x755E, 0x7561, 0x3E34,
- 0x7562, 0x7562, 0x1E42, 0x7563, 0x7564, 0x3E38, 0x7565, 0x7565, 0x0A7B,
- 0x7566, 0x7566, 0x0C07, 0x7567, 0x7569, 0x3E3A, 0x756A, 0x756A, 0x0649,
- 0x756B, 0x756B, 0x1F4E, 0x756C, 0x7571, 0x3E3D, 0x7572, 0x7572, 0x1A7E,
- 0x7573, 0x7573, 0x3E43, 0x7574, 0x7574, 0x0510, 0x7575, 0x7575, 0x3E44,
- 0x7576, 0x7576, 0x1EB1, 0x7577, 0x7577, 0x3E45, 0x7578, 0x7578, 0x0810,
- 0x7579, 0x7579, 0x1A7F, 0x757A, 0x757E, 0x3E46, 0x757F, 0x757F, 0x1814,
- 0x7580, 0x7582, 0x3E4B, 0x7583, 0x7583, 0x1A80, 0x7584, 0x7585, 0x3E4E,
- 0x7586, 0x7586, 0x087F, 0x7587, 0x7587, 0x1E8B, 0x7588, 0x758A, 0x3E50,
- 0x758B, 0x758B, 0x1BC6, 0x758C, 0x758E, 0x3E53, 0x758F, 0x758F, 0x0D7F,
- 0x7590, 0x7590, 0x3E56, 0x7591, 0x7591, 0x1050, 0x7592, 0x7592, 0x1B60,
- 0x7593, 0x7593, 0x3E57, 0x7594, 0x7594, 0x1B61, 0x7595, 0x7595, 0x3E58,
- 0x7596, 0x7596, 0x1B62, 0x7597, 0x7597, 0x0A0F, 0x7598, 0x7598, 0x3E59,
- 0x7599, 0x7599, 0x06E8, 0x759A, 0x759A, 0x08FD, 0x759B, 0x759C, 0x3E5A,
- 0x759D, 0x759D, 0x1B64, 0x759E, 0x759E, 0x3E5C, 0x759F, 0x759F, 0x0B72,
- 0x75A0, 0x75A0, 0x1B63, 0x75A1, 0x75A1, 0x101A, 0x75A2, 0x75A2, 0x3E5D,
- 0x75A3, 0x75A3, 0x1B66, 0x75A4, 0x75A4, 0x03D7, 0x75A5, 0x75A5, 0x08BB,
- 0x75A6, 0x75AA, 0x3E5E, 0x75AB, 0x75AB, 0x1066, 0x75AC, 0x75AC, 0x1B65,
- 0x75AD, 0x75AD, 0x3E63, 0x75AE, 0x75AE, 0x0532, 0x75AF, 0x75AF, 0x0685,
- 0x75B0, 0x75B0, 0x1B6C, 0x75B1, 0x75B1, 0x1B6B, 0x75B2, 0x75B2, 0x0BC2,
- 0x75B3, 0x75B4, 0x1B67, 0x75B5, 0x75B5, 0x0546, 0x75B6, 0x75B7, 0x3E64,
- 0x75B8, 0x75B8, 0x1B69, 0x75B9, 0x75B9, 0x118F, 0x75BA, 0x75BB, 0x3E66,
- 0x75BC, 0x75BC, 0x0E2E, 0x75BD, 0x75BD, 0x0901, 0x75BE, 0x75BE, 0x0825,
- 0x75BF, 0x75C1, 0x3E68, 0x75C2, 0x75C2, 0x1B6E, 0x75C3, 0x75C3, 0x1B6D,
- 0x75C4, 0x75C4, 0x1B6A, 0x75C5, 0x75C5, 0x0468, 0x75C6, 0x75C6, 0x3E6B,
- 0x75C7, 0x75C7, 0x11A1, 0x75C8, 0x75C8, 0x109D, 0x75C9, 0x75C9, 0x08E6,
- 0x75CA, 0x75CA, 0x0C87, 0x75CB, 0x75CC, 0x3E6C, 0x75CD, 0x75CD, 0x1B70,
- 0x75CE, 0x75D1, 0x3E6E, 0x75D2, 0x75D2, 0x1020, 0x75D3, 0x75D3, 0x3E72,
- 0x75D4, 0x75D4, 0x11CB, 0x75D5, 0x75D5, 0x0792, 0x75D6, 0x75D6, 0x1B6F,
- 0x75D7, 0x75D7, 0x3E73, 0x75D8, 0x75D8, 0x05FA, 0x75D9, 0x75D9, 0x1FC6,
- 0x75DA, 0x75DA, 0x3E74, 0x75DB, 0x75DB, 0x0E65, 0x75DC, 0x75DD, 0x3E75,
- 0x75DE, 0x75DE, 0x0BC5, 0x75DF, 0x75E1, 0x3E77, 0x75E2, 0x75E2, 0x09EA,
- 0x75E3, 0x75E3, 0x1B71, 0x75E4, 0x75E4, 0x1B74, 0x75E5, 0x75E5, 0x3E7A,
- 0x75E6, 0x75E6, 0x1B73, 0x75E7, 0x75E7, 0x1B76, 0x75E8, 0x75E8, 0x1B72,
- 0x75E9, 0x75E9, 0x3E7B, 0x75EA, 0x75EA, 0x07D3, 0x75EB, 0x75EB, 0x1B75,
- 0x75EC, 0x75EF, 0x3E7C, 0x75F0, 0x75F0, 0x0E08, 0x75F1, 0x75F1, 0x1B78,
- 0x75F2, 0x75F3, 0x3E80, 0x75F4, 0x75F4, 0x04FA, 0x75F5, 0x75F8, 0x3E82,
- 0x75F9, 0x75F9, 0x043D, 0x75FA, 0x75FB, 0x3E86, 0x75FC, 0x75FC, 0x1B79,
- 0x75FD, 0x75FE, 0x3E88, 0x75FF, 0x75FF, 0x1B7A, 0x7600, 0x7600, 0x1B7C,
- 0x7601, 0x7601, 0x0564, 0x7602, 0x7602, 0x25AE, 0x7603, 0x7603, 0x1B77,
- 0x7604, 0x7604, 0x3E8A, 0x7605, 0x7605, 0x1B7D, 0x7606, 0x7609, 0x3E8B,
- 0x760A, 0x760A, 0x1B80, 0x760B, 0x760B, 0x1F01, 0x760C, 0x760C, 0x1B7E,
- 0x760D, 0x760D, 0x2200, 0x760E, 0x760F, 0x3E8F, 0x7610, 0x7610, 0x1B7B,
- 0x7611, 0x7614, 0x3E91, 0x7615, 0x7615, 0x1B83, 0x7616, 0x7616, 0x3E95,
- 0x7617, 0x7617, 0x1B7F, 0x7618, 0x7618, 0x1B82, 0x7619, 0x7619, 0x1B84,
- 0x761A, 0x761A, 0x3E96, 0x761B, 0x761B, 0x1B85, 0x761C, 0x761D, 0x3E97,
- 0x761E, 0x761E, 0x25B2, 0x761F, 0x761F, 0x0ED0, 0x7620, 0x7620, 0x1B88,
- 0x7621, 0x7621, 0x1E97, 0x7622, 0x7622, 0x1B87, 0x7623, 0x7623, 0x3E99,
- 0x7624, 0x7624, 0x0A3F, 0x7625, 0x7625, 0x1B81, 0x7626, 0x7626, 0x0D74,
- 0x7627, 0x7627, 0x20AB, 0x7628, 0x7628, 0x3E9A, 0x7629, 0x7629, 0x0574,
- 0x762A, 0x762A, 0x045A, 0x762B, 0x762B, 0x0E04, 0x762C, 0x762C, 0x3E9B,
- 0x762D, 0x762D, 0x1B8A, 0x762E, 0x762F, 0x3E9C, 0x7630, 0x7630, 0x1B8B,
- 0x7631, 0x7632, 0x3E9E, 0x7633, 0x7633, 0x1B90, 0x7634, 0x7634, 0x116F,
- 0x7635, 0x7635, 0x1B8D, 0x7636, 0x7637, 0x3EA0, 0x7638, 0x7638, 0x0C8E,
- 0x7639, 0x763A, 0x3EA2, 0x763B, 0x763B, 0x25B3, 0x763C, 0x763C, 0x1B86,
- 0x763D, 0x763D, 0x3EA4, 0x763E, 0x763E, 0x1B8F, 0x763F, 0x763F, 0x1B8C,
- 0x7640, 0x7640, 0x1B89, 0x7641, 0x7641, 0x3EA5, 0x7642, 0x7642, 0x2028,
- 0x7643, 0x7643, 0x1B8E, 0x7644, 0x7645, 0x3EA6, 0x7646, 0x7647, 0x25AF,
- 0x7648, 0x7648, 0x3EA8, 0x7649, 0x7649, 0x25B1, 0x764A, 0x764B, 0x3EA9,
- 0x764C, 0x764C, 0x03B4, 0x764D, 0x764D, 0x1B91, 0x764E, 0x7653, 0x3EAB,
- 0x7654, 0x7654, 0x1B93, 0x7655, 0x7655, 0x3EB1, 0x7656, 0x7656, 0x1B95,
- 0x7657, 0x7657, 0x3EB2, 0x7658, 0x7658, 0x25AC, 0x7659, 0x765B, 0x3EB3,
- 0x765C, 0x765C, 0x1B94, 0x765D, 0x765D, 0x3EB6, 0x765E, 0x765E, 0x1B92,
- 0x765F, 0x765F, 0x1E4E, 0x7660, 0x7661, 0x3EB7, 0x7662, 0x7662, 0x2202,
- 0x7663, 0x7663, 0x0FCB, 0x7664, 0x7664, 0x25AB, 0x7665, 0x7665, 0x2286,
- 0x7666, 0x7666, 0x3EB9, 0x7667, 0x7667, 0x25AD, 0x7668, 0x7668, 0x3EBA,
- 0x7669, 0x7669, 0x25B6, 0x766A, 0x766A, 0x3EBB, 0x766B, 0x766B, 0x1B96,
- 0x766C, 0x766C, 0x21E3, 0x766D, 0x766E, 0x25B4, 0x766F, 0x766F, 0x1B97,
- 0x7670, 0x7670, 0x222F, 0x7671, 0x7671, 0x2165, 0x7672, 0x7672, 0x25B7,
- 0x7673, 0x7677, 0x3EBC, 0x7678, 0x7678, 0x0748, 0x7679, 0x767A, 0x3EC1,
- 0x767B, 0x767B, 0x05A8, 0x767C, 0x767C, 0x1EE9, 0x767D, 0x767D, 0x03E2,
- 0x767E, 0x767E, 0x03E4, 0x767F, 0x7681, 0x3EC3, 0x7682, 0x7682, 0x1130,
- 0x7683, 0x7683, 0x3EC6, 0x7684, 0x7684, 0x05A5, 0x7685, 0x7685, 0x3EC7,
- 0x7686, 0x7686, 0x08A5, 0x7687, 0x7687, 0x07DF, 0x7688, 0x7688, 0x1B2D,
- 0x7689, 0x768A, 0x3EC8, 0x768B, 0x768B, 0x06D9, 0x768C, 0x768D, 0x3ECA,
- 0x768E, 0x768E, 0x1B2E, 0x768F, 0x7690, 0x3ECC, 0x7691, 0x7691, 0x03B3,
- 0x7692, 0x7692, 0x3ECE, 0x7693, 0x7693, 0x1B2F, 0x7694, 0x7695, 0x3ECF,
- 0x7696, 0x7696, 0x0E9F, 0x7697, 0x7698, 0x3ED1, 0x7699, 0x7699, 0x1B30,
- 0x769A, 0x769A, 0x1E25, 0x769B, 0x76A3, 0x3ED3, 0x76A4, 0x76A4, 0x1B31,
- 0x76A5, 0x76AD, 0x3EDC, 0x76AE, 0x76AE, 0x0BC3, 0x76AF, 0x76B0, 0x3EE5,
- 0x76B1, 0x76B1, 0x11E4, 0x76B2, 0x76B2, 0x1BC8, 0x76B3, 0x76B3, 0x3EE7,
- 0x76B4, 0x76B4, 0x1BC9, 0x76B5, 0x76B7, 0x3EE8, 0x76B8, 0x76B8, 0x25C0,
- 0x76B9, 0x76B9, 0x3EEB, 0x76BA, 0x76BA, 0x229A, 0x76BB, 0x76BE, 0x3EEC,
- 0x76BF, 0x76BF, 0x0AF8, 0x76C0, 0x76C1, 0x3EF0, 0x76C2, 0x76C2, 0x10C0,
- 0x76C3, 0x76C4, 0x3EF2, 0x76C5, 0x76C5, 0x11D0, 0x76C6, 0x76C6, 0x0BA9,
- 0x76C7, 0x76C7, 0x3EF4, 0x76C8, 0x76C8, 0x1094, 0x76C9, 0x76C9, 0x3EF5,
- 0x76CA, 0x76CA, 0x106D, 0x76CB, 0x76CC, 0x3EF6, 0x76CD, 0x76CD, 0x1A8B,
- 0x76CE, 0x76CE, 0x03C6, 0x76CF, 0x76CF, 0x1156, 0x76D0, 0x76D0, 0x0FF7,
- 0x76D1, 0x76D1, 0x0853, 0x76D2, 0x76D2, 0x0787, 0x76D3, 0x76D3, 0x3EF8,
- 0x76D4, 0x76D4, 0x0985, 0x76D5, 0x76D5, 0x3EF9, 0x76D6, 0x76D6, 0x06C2,
- 0x76D7, 0x76D7, 0x05A2, 0x76D8, 0x76D8, 0x0B8D, 0x76D9, 0x76DA, 0x3EFA,
- 0x76DB, 0x76DB, 0x0D39, 0x76DC, 0x76DD, 0x3EFC, 0x76DE, 0x76DE, 0x226E,
- 0x76DF, 0x76DF, 0x0AD0, 0x76E0, 0x76E0, 0x3EFE, 0x76E1, 0x76E1, 0x1FBD,
- 0x76E2, 0x76E2, 0x3EFF, 0x76E3, 0x76E3, 0x1F84, 0x76E4, 0x76E4, 0x20B2,
- 0x76E5, 0x76E5, 0x1A8C, 0x76E6, 0x76E6, 0x3F00, 0x76E7, 0x76E7, 0x2043,
- 0x76E8, 0x76ED, 0x3F01, 0x76EE, 0x76EE, 0x0B22, 0x76EF, 0x76EF, 0x05E1,
- 0x76F0, 0x76F0, 0x3F07, 0x76F1, 0x76F1, 0x1A58, 0x76F2, 0x76F2, 0x0AA9,
- 0x76F3, 0x76F3, 0x3F08, 0x76F4, 0x76F4, 0x11B0, 0x76F5, 0x76F7, 0x3F09,
- 0x76F8, 0x76F8, 0x0F4D, 0x76F9, 0x76F9, 0x1A5B, 0x76FA, 0x76FB, 0x3F0C,
- 0x76FC, 0x76FC, 0x0B8F, 0x76FD, 0x76FD, 0x3F0E, 0x76FE, 0x76FE, 0x061B,
- 0x76FF, 0x76FF, 0x3F0F, 0x7700, 0x7700, 0x3F10, 0x7701, 0x7701, 0x0D38,
- 0x7702, 0x7703, 0x3F11, 0x7704, 0x7704, 0x1A59, 0x7705, 0x7706, 0x3F13,
- 0x7707, 0x7708, 0x1A5C, 0x7709, 0x7709, 0x0AC1, 0x770A, 0x770A, 0x3F15,
- 0x770B, 0x770B, 0x0941, 0x770C, 0x770C, 0x3F16, 0x770D, 0x770D, 0x1A5A,
- 0x770E, 0x7718, 0x3F17, 0x7719, 0x7719, 0x1A60, 0x771A, 0x771A, 0x1A5E,
- 0x771B, 0x771E, 0x3F22, 0x771F, 0x771F, 0x1187, 0x7720, 0x7720, 0x0AE4,
- 0x7721, 0x7721, 0x3F26, 0x7722, 0x7722, 0x1A5F, 0x7723, 0x7725, 0x3F27,
- 0x7726, 0x7726, 0x1A62, 0x7727, 0x7727, 0x3F2A, 0x7728, 0x7728, 0x1144,
- 0x7729, 0x7729, 0x0FCC, 0x772A, 0x772C, 0x3F2B, 0x772D, 0x772D, 0x1A61,
- 0x772E, 0x772E, 0x3F2E, 0x772F, 0x772F, 0x0AD5, 0x7730, 0x7734, 0x3F2F,
- 0x7735, 0x7735, 0x1A63, 0x7736, 0x7736, 0x0981, 0x7737, 0x7737, 0x091B,
- 0x7738, 0x7738, 0x1A64, 0x7739, 0x7739, 0x3F34, 0x773A, 0x773A, 0x0E4A,
- 0x773B, 0x773B, 0x3F35, 0x773C, 0x773C, 0x1004, 0x773D, 0x773F, 0x3F36,
- 0x7740, 0x7740, 0x1222, 0x7741, 0x7741, 0x1197, 0x7742, 0x7742, 0x3F39,
- 0x7743, 0x7743, 0x1A68, 0x7744, 0x7746, 0x3F3A, 0x7747, 0x7747, 0x1A67,
- 0x7748, 0x774E, 0x3F3D, 0x774F, 0x774F, 0x2684, 0x7750, 0x7751, 0x1A65,
- 0x7752, 0x7759, 0x3F44, 0x775A, 0x775A, 0x1A69, 0x775B, 0x775B, 0x08D5,
- 0x775C, 0x775D, 0x3F4C, 0x775E, 0x775E, 0x24EF, 0x775F, 0x7760, 0x3F4E,
- 0x7761, 0x7761, 0x0DA4, 0x7762, 0x7762, 0x1A6B, 0x7763, 0x7763, 0x05FC,
- 0x7764, 0x7764, 0x3F50, 0x7765, 0x7765, 0x1A6C, 0x7766, 0x7766, 0x0B23,
- 0x7767, 0x7767, 0x3F51, 0x7768, 0x7768, 0x1A6A, 0x7769, 0x776A, 0x3F52,
- 0x776B, 0x776B, 0x08AF, 0x776C, 0x776C, 0x048E, 0x776D, 0x7778, 0x3F54,
- 0x7779, 0x7779, 0x0602, 0x777A, 0x777C, 0x3F60, 0x777D, 0x777D, 0x1A6F,
- 0x777E, 0x777E, 0x1270, 0x777F, 0x777F, 0x1A6D, 0x7780, 0x7780, 0x1A70,
- 0x7781, 0x7783, 0x3F63, 0x7784, 0x7784, 0x0AEE, 0x7785, 0x7785, 0x0517,
- 0x7786, 0x778B, 0x3F66, 0x778C, 0x778C, 0x1A71, 0x778D, 0x778D, 0x1A6E,
- 0x778E, 0x778E, 0x0F26, 0x778F, 0x7790, 0x3F6C, 0x7791, 0x7791, 0x1A72,
- 0x7792, 0x7792, 0x0A9E, 0x7793, 0x7797, 0x3F6E, 0x7798, 0x7798, 0x24EE,
- 0x7799, 0x779D, 0x3F73, 0x779E, 0x779E, 0x2074, 0x779F, 0x77A0, 0x1A73,
- 0x77A1, 0x77A1, 0x3F78, 0x77A2, 0x77A2, 0x1495, 0x77A3, 0x77A4, 0x3F79,
- 0x77A5, 0x77A5, 0x0BD2, 0x77A6, 0x77A6, 0x3F7B, 0x77A7, 0x77A7, 0x0C43,
- 0x77A8, 0x77A8, 0x3F7C, 0x77A9, 0x77A9, 0x11F4, 0x77AA, 0x77AA, 0x05AA,
- 0x77AB, 0x77AB, 0x3F7D, 0x77AC, 0x77AC, 0x0DA7, 0x77AD, 0x77AD, 0x2687,
- 0x77AE, 0x77AF, 0x3F7E, 0x77B0, 0x77B0, 0x1A75, 0x77B1, 0x77B2, 0x3F80,
- 0x77B3, 0x77B3, 0x0E5C, 0x77B4, 0x77B4, 0x3F82, 0x77B5, 0x77B5, 0x1A76,
- 0x77B6, 0x77BA, 0x3F83, 0x77BB, 0x77BB, 0x1151, 0x77BC, 0x77BC, 0x24F0,
- 0x77BD, 0x77BD, 0x1A77, 0x77BE, 0x77BE, 0x3F88, 0x77BF, 0x77BF, 0x1D7E,
- 0x77C0, 0x77C6, 0x3F89, 0x77C7, 0x77C7, 0x268D, 0x77C8, 0x77CC, 0x3F90,
- 0x77CD, 0x77CD, 0x1397, 0x77CE, 0x77D6, 0x3F95, 0x77D7, 0x77D7, 0x0526,
- 0x77D8, 0x77D9, 0x3F9E, 0x77DA, 0x77DA, 0x22A0, 0x77DB, 0x77DB, 0x0AB1,
- 0x77DC, 0x77DC, 0x1BCA, 0x77DD, 0x77E1, 0x3FA0, 0x77E2, 0x77E2, 0x0D4F,
- 0x77E3, 0x77E3, 0x105A, 0x77E4, 0x77E4, 0x3FA5, 0x77E5, 0x77E5, 0x11A9,
- 0x77E6, 0x77E6, 0x3FA6, 0x77E7, 0x77E7, 0x1B1A, 0x77E8, 0x77E8, 0x3FA7,
- 0x77E9, 0x77E9, 0x0907, 0x77EA, 0x77EA, 0x3FA8, 0x77EB, 0x77EB, 0x0894,
- 0x77EC, 0x77EC, 0x1B1B, 0x77ED, 0x77ED, 0x060B, 0x77EE, 0x77EE, 0x03B6,
- 0x77EF, 0x77EF, 0x1FAB, 0x77F0, 0x77F2, 0x3FA9, 0x77F3, 0x77F3, 0x0D46,
- 0x77F4, 0x77F5, 0x3FAC, 0x77F6, 0x77F6, 0x1A22, 0x77F7, 0x77F7, 0x3FAE,
- 0x77F8, 0x77F8, 0x1A23, 0x77F9, 0x77FC, 0x3FAF, 0x77FD, 0x77FD, 0x0F08,
- 0x77FE, 0x77FE, 0x064C, 0x77FF, 0x77FF, 0x0980, 0x7800, 0x7800, 0x1A24,
- 0x7801, 0x7801, 0x0A92, 0x7802, 0x7802, 0x0CE9, 0x7803, 0x7808, 0x3FB3,
- 0x7809, 0x7809, 0x1A25, 0x780A, 0x780B, 0x3FB9, 0x780C, 0x780C, 0x0C15,
- 0x780D, 0x780D, 0x0940, 0x780E, 0x7810, 0x3FBB, 0x7811, 0x7811, 0x1A28,
- 0x7812, 0x7812, 0x0BB9, 0x7813, 0x7813, 0x3FBE, 0x7814, 0x7814, 0x0FF9,
- 0x7815, 0x7815, 0x3FBF, 0x7816, 0x7816, 0x1206, 0x7817, 0x7818, 0x1A26,
- 0x7819, 0x7819, 0x3FC0, 0x781A, 0x781A, 0x100B, 0x781B, 0x781B, 0x3FC1,
- 0x781C, 0x781D, 0x1A2B, 0x781E, 0x781E, 0x3FC2, 0x781F, 0x781F, 0x1A30,
- 0x7820, 0x7822, 0x3FC3, 0x7823, 0x7823, 0x1A34, 0x7824, 0x7824, 0x3FC6,
- 0x7825, 0x7825, 0x1A32, 0x7826, 0x7826, 0x1A3A, 0x7827, 0x7827, 0x1189,
- 0x7828, 0x7828, 0x3FC7, 0x7829, 0x7829, 0x1A35, 0x782A, 0x782B, 0x3FC8,
- 0x782C, 0x782C, 0x1A33, 0x782D, 0x782D, 0x1A2A, 0x782E, 0x782F, 0x3FCA,
- 0x7830, 0x7830, 0x0BAA, 0x7831, 0x7833, 0x3FCC, 0x7834, 0x7834, 0x0BE5,
- 0x7835, 0x7836, 0x3FCF, 0x7837, 0x7837, 0x0D22, 0x7838, 0x7838, 0x1115,
- 0x7839, 0x783B, 0x1A2D, 0x783C, 0x783C, 0x1A31, 0x783D, 0x783D, 0x3FD1,
- 0x783E, 0x783E, 0x09E4, 0x783F, 0x783F, 0x3FD2, 0x7840, 0x7840, 0x0524,
- 0x7841, 0x7842, 0x3FD3, 0x7843, 0x7843, 0x26A8, 0x7844, 0x7844, 0x3FD5,
- 0x7845, 0x7845, 0x0741, 0x7846, 0x7846, 0x3FD6, 0x7847, 0x7847, 0x1A3C,
- 0x7848, 0x784B, 0x3FD7, 0x784C, 0x784C, 0x1A3D, 0x784D, 0x784D, 0x3FDB,
- 0x784E, 0x784E, 0x1A36, 0x784F, 0x784F, 0x3FDC, 0x7850, 0x7850, 0x1A3B,
- 0x7851, 0x7851, 0x3FDD, 0x7852, 0x7852, 0x0F07, 0x7853, 0x7854, 0x3FDE,
- 0x7855, 0x7855, 0x0DAB, 0x7856, 0x7857, 0x1A38, 0x7858, 0x785C, 0x3FE0,
- 0x785D, 0x785D, 0x0F62, 0x785E, 0x7863, 0x3FE5, 0x7864, 0x7864, 0x24E9,
- 0x7865, 0x7867, 0x3FEB, 0x7868, 0x7868, 0x24E5, 0x7869, 0x7869, 0x3FEE,
- 0x786A, 0x786A, 0x1A3E, 0x786B, 0x786B, 0x0A3B, 0x786C, 0x786C, 0x1097,
- 0x786D, 0x786D, 0x1A37, 0x786E, 0x786E, 0x0C92, 0x786F, 0x786F, 0x21FA,
- 0x7870, 0x7876, 0x3FEF, 0x7877, 0x7877, 0x0862, 0x7878, 0x787B, 0x3FF6,
- 0x787C, 0x787C, 0x0BB1, 0x787D, 0x7886, 0x3FFA, 0x7887, 0x7887, 0x1A42,
- 0x7888, 0x7888, 0x4004, 0x7889, 0x7889, 0x05D0, 0x788A, 0x788B, 0x4005,
- 0x788C, 0x788C, 0x0A5C, 0x788D, 0x788D, 0x03B8, 0x788E, 0x788E, 0x0DDE,
- 0x788F, 0x7890, 0x4007, 0x7891, 0x7891, 0x0417, 0x7892, 0x7892, 0x4009,
- 0x7893, 0x7893, 0x1A40, 0x7894, 0x7896, 0x400A, 0x7897, 0x7897, 0x0E9C,
- 0x7898, 0x7898, 0x05C3, 0x7899, 0x7899, 0x400D, 0x789A, 0x789A, 0x1A41,
- 0x789B, 0x789B, 0x1A3F, 0x789C, 0x789C, 0x1A43, 0x789D, 0x789E, 0x400E,
- 0x789F, 0x789F, 0x05DB, 0x78A0, 0x78A0, 0x4010, 0x78A1, 0x78A1, 0x1A44,
- 0x78A2, 0x78A2, 0x4011, 0x78A3, 0x78A3, 0x1A45, 0x78A4, 0x78A4, 0x4012,
- 0x78A5, 0x78A5, 0x1A48, 0x78A6, 0x78A6, 0x4013, 0x78A7, 0x78A7, 0x0435,
- 0x78A8, 0x78A8, 0x4014, 0x78A9, 0x78A9, 0x2148, 0x78AA, 0x78AC, 0x4015,
- 0x78AD, 0x78AD, 0x24E4, 0x78AE, 0x78AF, 0x4018, 0x78B0, 0x78B0, 0x0BB7,
- 0x78B1, 0x78B1, 0x0861, 0x78B2, 0x78B2, 0x1A46, 0x78B3, 0x78B3, 0x0E0F,
- 0x78B4, 0x78B4, 0x04B1, 0x78B5, 0x78B7, 0x401A, 0x78B8, 0x78B8, 0x24E6,
- 0x78B9, 0x78B9, 0x1A47, 0x78BA, 0x78BA, 0x20F7, 0x78BB, 0x78BB, 0x401D,
- 0x78BC, 0x78BC, 0x206B, 0x78BD, 0x78BD, 0x401E, 0x78BE, 0x78BE, 0x0B4E,
- 0x78BF, 0x78C0, 0x401F, 0x78C1, 0x78C1, 0x0548, 0x78C2, 0x78C4, 0x4021,
- 0x78C5, 0x78C5, 0x0400, 0x78C6, 0x78C8, 0x4024, 0x78C9, 0x78C9, 0x1A4B,
- 0x78CA, 0x78CA, 0x09C5, 0x78CB, 0x78CB, 0x056B, 0x78CC, 0x78CF, 0x4027,
- 0x78D0, 0x78D0, 0x0B8E, 0x78D1, 0x78D3, 0x402B, 0x78D4, 0x78D4, 0x1A49,
- 0x78D5, 0x78D5, 0x0951, 0x78D6, 0x78D8, 0x402E, 0x78D9, 0x78D9, 0x1A4A,
- 0x78DA, 0x78DA, 0x22A7, 0x78DB, 0x78E2, 0x4031, 0x78E3, 0x78E3, 0x24EC,
- 0x78E4, 0x78E6, 0x4039, 0x78E7, 0x78E7, 0x24EB, 0x78E8, 0x78E8, 0x0B08,
- 0x78E9, 0x78EB, 0x403C, 0x78EC, 0x78EC, 0x1A4C, 0x78ED, 0x78EE, 0x403F,
- 0x78EF, 0x78EF, 0x24E3, 0x78F0, 0x78F1, 0x4041, 0x78F2, 0x78F2, 0x1A4D,
- 0x78F3, 0x78F3, 0x4043, 0x78F4, 0x78F4, 0x1A4F, 0x78F5, 0x78F6, 0x4044,
- 0x78F7, 0x78F7, 0x0A20, 0x78F8, 0x78F9, 0x4046, 0x78FA, 0x78FA, 0x07DC,
- 0x78FB, 0x78FC, 0x4048, 0x78FD, 0x78FD, 0x24EA, 0x78FE, 0x78FF, 0x404A,
- 0x7900, 0x7900, 0x404C, 0x7901, 0x7901, 0x0889, 0x7902, 0x7904, 0x404D,
- 0x7905, 0x7905, 0x1A4E, 0x7906, 0x790D, 0x4050, 0x790E, 0x790E, 0x1E92,
- 0x790F, 0x7912, 0x4058, 0x7913, 0x7913, 0x1A50, 0x7914, 0x7918, 0x405C,
- 0x7919, 0x7919, 0x1E27, 0x791A, 0x791D, 0x4061, 0x791E, 0x791E, 0x1A52,
- 0x791F, 0x7923, 0x4065, 0x7924, 0x7924, 0x1A51, 0x7925, 0x7925, 0x406A,
- 0x7926, 0x7926, 0x1FE6, 0x7927, 0x7929, 0x406B, 0x792A, 0x792A, 0x24E7,
- 0x792B, 0x792B, 0x2012, 0x792C, 0x792C, 0x1EEC, 0x792D, 0x7930, 0x406E,
- 0x7931, 0x7931, 0x24E8, 0x7932, 0x7933, 0x4072, 0x7934, 0x7934, 0x1A53,
- 0x7935, 0x7939, 0x4074, 0x793A, 0x793A, 0x0D55, 0x793B, 0x793B, 0x19F8,
- 0x793C, 0x793C, 0x09DC, 0x793D, 0x793D, 0x4079, 0x793E, 0x793E, 0x0D20,
- 0x793F, 0x793F, 0x407A, 0x7940, 0x7940, 0x19F9, 0x7941, 0x7941, 0x0C0D,
- 0x7942, 0x7945, 0x407B, 0x7946, 0x7946, 0x19FA, 0x7947, 0x7947, 0x407F,
- 0x7948, 0x7948, 0x0C0C, 0x7949, 0x7949, 0x19FB, 0x794A, 0x7952, 0x4080,
- 0x7953, 0x7953, 0x19FE, 0x7954, 0x7955, 0x4089, 0x7956, 0x7956, 0x1243,
- 0x7957, 0x7957, 0x1A01, 0x7958, 0x7959, 0x408B, 0x795A, 0x795A, 0x19FF,
- 0x795B, 0x795C, 0x19FC, 0x795D, 0x795D, 0x1200, 0x795E, 0x795E, 0x0D2A,
- 0x795F, 0x795F, 0x0DE3, 0x7960, 0x7960, 0x1A02, 0x7961, 0x7961, 0x408D,
- 0x7962, 0x7962, 0x1A00, 0x7963, 0x7964, 0x408E, 0x7965, 0x7965, 0x0F56,
- 0x7966, 0x7966, 0x4090, 0x7967, 0x7967, 0x1A04, 0x7968, 0x7968, 0x0BD0,
- 0x7969, 0x796C, 0x4091, 0x796D, 0x796D, 0x0833, 0x796E, 0x796E, 0x4095,
- 0x796F, 0x796F, 0x1A03, 0x7970, 0x7976, 0x4096, 0x7977, 0x7977, 0x059C,
- 0x7978, 0x7978, 0x080B, 0x7979, 0x7979, 0x409D, 0x797A, 0x797A, 0x1A05,
- 0x797B, 0x797F, 0x409E, 0x7980, 0x7980, 0x130B, 0x7981, 0x7981, 0x08CC,
- 0x7982, 0x7983, 0x40A3, 0x7984, 0x7984, 0x0A62, 0x7985, 0x7985, 0x1A06,
- 0x7986, 0x7989, 0x40A5, 0x798A, 0x798A, 0x1A07, 0x798B, 0x798C, 0x40A9,
- 0x798D, 0x798D, 0x1F66, 0x798E, 0x798E, 0x24DC, 0x798F, 0x798F, 0x069E,
- 0x7990, 0x7999, 0x40AB, 0x799A, 0x799A, 0x1A08, 0x799B, 0x79A5, 0x40B5,
- 0x79A6, 0x79A6, 0x26A2, 0x79A7, 0x79A7, 0x1A09, 0x79A8, 0x79A9, 0x40C0,
- 0x79AA, 0x79AA, 0x24DD, 0x79AB, 0x79AD, 0x40C2, 0x79AE, 0x79AE, 0x200E,
- 0x79AF, 0x79AF, 0x40C5, 0x79B0, 0x79B0, 0x24DB, 0x79B1, 0x79B1, 0x1EB8,
- 0x79B2, 0x79B2, 0x40C6, 0x79B3, 0x79B3, 0x1A0A, 0x79B4, 0x79B8, 0x40C7,
- 0x79B9, 0x79B9, 0x10D2, 0x79BA, 0x79BA, 0x1264, 0x79BB, 0x79BB, 0x09D6,
- 0x79BC, 0x79BC, 0x40CC, 0x79BD, 0x79BD, 0x0C5A, 0x79BE, 0x79BE, 0x0783,
- 0x79BF, 0x79BF, 0x40CD, 0x79C0, 0x79C0, 0x0FAE, 0x79C1, 0x79C1, 0x0DB2,
- 0x79C2, 0x79C2, 0x40CE, 0x79C3, 0x79C3, 0x0E6B, 0x79C4, 0x79C5, 0x40CF,
- 0x79C6, 0x79C6, 0x06CC, 0x79C7, 0x79C8, 0x40D1, 0x79C9, 0x79C9, 0x0465,
- 0x79CA, 0x79CA, 0x40D3, 0x79CB, 0x79CB, 0x0C6C, 0x79CC, 0x79CC, 0x40D4,
- 0x79CD, 0x79CD, 0x11D5, 0x79CE, 0x79D0, 0x40D5, 0x79D1, 0x79D1, 0x0953,
- 0x79D2, 0x79D2, 0x0AF0, 0x79D3, 0x79D4, 0x40D8, 0x79D5, 0x79D5, 0x1B1D,
- 0x79D6, 0x79D7, 0x40DA, 0x79D8, 0x79D8, 0x0ADD, 0x79D9, 0x79DE, 0x40DC,
- 0x79DF, 0x79DF, 0x123F, 0x79E0, 0x79E2, 0x40E2, 0x79E3, 0x79E3, 0x1B1F,
- 0x79E4, 0x79E4, 0x04F8, 0x79E5, 0x79E5, 0x40E5, 0x79E6, 0x79E6, 0x0C55,
- 0x79E7, 0x79E7, 0x1016, 0x79E8, 0x79E8, 0x40E6, 0x79E9, 0x79E9, 0x11C7,
- 0x79EA, 0x79EA, 0x40E7, 0x79EB, 0x79EB, 0x1B20, 0x79EC, 0x79EC, 0x40E8,
- 0x79ED, 0x79ED, 0x1B1E, 0x79EE, 0x79EE, 0x40E9, 0x79EF, 0x79EF, 0x0812,
- 0x79F0, 0x79F0, 0x04EB, 0x79F1, 0x79F7, 0x40EA, 0x79F8, 0x79F8, 0x08A6,
- 0x79F9, 0x79FA, 0x40F1, 0x79FB, 0x79FB, 0x104D, 0x79FC, 0x79FC, 0x40F3,
- 0x79FD, 0x79FD, 0x07F5, 0x79FE, 0x79FF, 0x40F4, 0x7A00, 0x7A00, 0x0F0E,
- 0x7A01, 0x7A01, 0x40F6, 0x7A02, 0x7A02, 0x1B24, 0x7A03, 0x7A03, 0x1B23,
- 0x7A04, 0x7A05, 0x40F7, 0x7A06, 0x7A06, 0x1B21, 0x7A07, 0x7A0A, 0x40F9,
- 0x7A0B, 0x7A0B, 0x04F1, 0x7A0C, 0x7A0C, 0x40FD, 0x7A0D, 0x7A0D, 0x0D0D,
- 0x7A0E, 0x7A0E, 0x0DA5, 0x7A0F, 0x7A13, 0x40FE, 0x7A14, 0x7A14, 0x1B26,
- 0x7A15, 0x7A16, 0x4103, 0x7A17, 0x7A17, 0x03E9, 0x7A18, 0x7A19, 0x4105,
- 0x7A1A, 0x7A1A, 0x11C8, 0x7A1B, 0x7A1D, 0x4107, 0x7A1E, 0x7A1E, 0x1B25,
- 0x7A1F, 0x7A1F, 0x410A, 0x7A20, 0x7A20, 0x0512, 0x7A21, 0x7A22, 0x410B,
- 0x7A23, 0x7A23, 0x1D8F, 0x7A24, 0x7A2D, 0x410D, 0x7A2E, 0x7A2E, 0x2295,
- 0x7A2F, 0x7A30, 0x4117, 0x7A31, 0x7A31, 0x1E80, 0x7A32, 0x7A32, 0x4119,
- 0x7A33, 0x7A33, 0x0ED7, 0x7A34, 0x7A36, 0x411A, 0x7A37, 0x7A37, 0x1B28,
- 0x7A38, 0x7A38, 0x411D, 0x7A39, 0x7A39, 0x1B27, 0x7A3A, 0x7A3A, 0x411E,
- 0x7A3B, 0x7A3B, 0x059F, 0x7A3C, 0x7A3C, 0x084D, 0x7A3D, 0x7A3D, 0x0811,
- 0x7A3E, 0x7A3E, 0x411F, 0x7A3F, 0x7A3F, 0x06E0, 0x7A40, 0x7A40, 0x2677,
- 0x7A41, 0x7A45, 0x4120, 0x7A46, 0x7A46, 0x0B25, 0x7A47, 0x7A4B, 0x4125,
- 0x7A4C, 0x7A4C, 0x2624, 0x7A4D, 0x7A4D, 0x1F69, 0x7A4E, 0x7A4E, 0x222B,
- 0x7A4F, 0x7A50, 0x412A, 0x7A51, 0x7A51, 0x1B29, 0x7A52, 0x7A56, 0x412C,
- 0x7A57, 0x7A57, 0x0DE0, 0x7A58, 0x7A60, 0x4131, 0x7A61, 0x7A61, 0x257F,
- 0x7A62, 0x7A62, 0x1F5B, 0x7A63, 0x7A68, 0x413A, 0x7A69, 0x7A69, 0x219B,
- 0x7A6A, 0x7A6A, 0x4140, 0x7A6B, 0x7A6B, 0x267D, 0x7A6C, 0x7A6F, 0x4141,
- 0x7A70, 0x7A70, 0x1B2C, 0x7A71, 0x7A73, 0x4145, 0x7A74, 0x7A74, 0x0FD1,
- 0x7A75, 0x7A75, 0x4148, 0x7A76, 0x7A76, 0x08EE, 0x7A77, 0x7A77, 0x0C6B,
- 0x7A78, 0x7A79, 0x1B9A, 0x7A7A, 0x7A7A, 0x0962, 0x7A7B, 0x7A7E, 0x4149,
- 0x7A7F, 0x7A7F, 0x052C, 0x7A80, 0x7A80, 0x1B9C, 0x7A81, 0x7A81, 0x0E6C,
- 0x7A82, 0x7A82, 0x414D, 0x7A83, 0x7A83, 0x0C51, 0x7A84, 0x7A84, 0x114E,
- 0x7A85, 0x7A85, 0x414E, 0x7A86, 0x7A86, 0x1B9D, 0x7A87, 0x7A87, 0x414F,
- 0x7A88, 0x7A88, 0x1B9E, 0x7A89, 0x7A8C, 0x4150, 0x7A8D, 0x7A8D, 0x0C4C,
- 0x7A8E, 0x7A90, 0x4154, 0x7A91, 0x7A91, 0x102B, 0x7A92, 0x7A92, 0x11CE,
- 0x7A93, 0x7A94, 0x4157, 0x7A95, 0x7A95, 0x1B9F, 0x7A96, 0x7A96, 0x08A2,
- 0x7A97, 0x7A97, 0x0533, 0x7A98, 0x7A98, 0x08EC, 0x7A99, 0x7A9B, 0x4159,
- 0x7A9C, 0x7A9C, 0x055F, 0x7A9D, 0x7A9D, 0x0EE0, 0x7A9E, 0x7A9E, 0x415C,
- 0x7A9F, 0x7A9F, 0x096C, 0x7AA0, 0x7AA0, 0x1BA1, 0x7AA1, 0x7AA4, 0x415D,
- 0x7AA5, 0x7AA5, 0x0987, 0x7AA6, 0x7AA6, 0x1BA0, 0x7AA7, 0x7AA7, 0x4161,
- 0x7AA8, 0x7AA8, 0x1BA3, 0x7AA9, 0x7AA9, 0x21A0, 0x7AAA, 0x7AAA, 0x2186,
- 0x7AAB, 0x7AAB, 0x4162, 0x7AAC, 0x7AAC, 0x1BA2, 0x7AAD, 0x7AAD, 0x1BA4,
- 0x7AAE, 0x7AAE, 0x20ED, 0x7AAF, 0x7AB2, 0x4163, 0x7AB3, 0x7AB3, 0x1BA5,
- 0x7AB4, 0x7AB5, 0x4167, 0x7AB6, 0x7AB6, 0x25B9, 0x7AB7, 0x7AB9, 0x4169,
- 0x7ABA, 0x7ABA, 0x1FEA, 0x7ABB, 0x7ABE, 0x416C, 0x7ABF, 0x7ABF, 0x0A47,
- 0x7AC0, 0x7AC3, 0x4170, 0x7AC4, 0x7AC4, 0x1EA4, 0x7AC5, 0x7AC5, 0x20E1,
- 0x7AC6, 0x7AC6, 0x4174, 0x7AC7, 0x7AC7, 0x25B8, 0x7AC8, 0x7AC8, 0x2260,
- 0x7AC9, 0x7AC9, 0x4175, 0x7ACA, 0x7ACA, 0x20E2, 0x7ACB, 0x7ACB, 0x09EB,
- 0x7ACC, 0x7AD5, 0x4176, 0x7AD6, 0x7AD6, 0x0D91, 0x7AD7, 0x7AD8, 0x4180,
- 0x7AD9, 0x7AD9, 0x115F, 0x7ADA, 0x7ADD, 0x4182, 0x7ADE, 0x7ADE, 0x08E9,
- 0x7ADF, 0x7ADF, 0x08E8, 0x7AE0, 0x7AE0, 0x1163, 0x7AE1, 0x7AE2, 0x4186,
- 0x7AE3, 0x7AE3, 0x092F, 0x7AE4, 0x7AE4, 0x4188, 0x7AE5, 0x7AE5, 0x0E60,
- 0x7AE6, 0x7AE6, 0x1B99, 0x7AE7, 0x7AE9, 0x4189, 0x7AEA, 0x7AEA, 0x2141,
- 0x7AEB, 0x7AEC, 0x418C, 0x7AED, 0x7AED, 0x08B0, 0x7AEE, 0x7AEE, 0x418E,
- 0x7AEF, 0x7AEF, 0x060A, 0x7AF0, 0x7AF5, 0x418F, 0x7AF6, 0x7AF6, 0x1FC7,
- 0x7AF7, 0x7AF8, 0x4195, 0x7AF9, 0x7AF9, 0x11F0, 0x7AFA, 0x7AFA, 0x1C63,
- 0x7AFB, 0x7AFC, 0x4197, 0x7AFD, 0x7AFD, 0x1C64, 0x7AFE, 0x7AFE, 0x4199,
- 0x7AFF, 0x7AFF, 0x06C8, 0x7B00, 0x7B02, 0x419A, 0x7B03, 0x7B04, 0x1C66,
- 0x7B05, 0x7B05, 0x419D, 0x7B06, 0x7B06, 0x03D5, 0x7B07, 0x7B07, 0x419E,
- 0x7B08, 0x7B08, 0x1C65, 0x7B09, 0x7B09, 0x419F, 0x7B0A, 0x7B0A, 0x1C69,
- 0x7B0B, 0x7B0B, 0x0DE6, 0x7B0C, 0x7B0E, 0x41A0, 0x7B0F, 0x7B0F, 0x1C6B,
- 0x7B10, 0x7B10, 0x41A3, 0x7B11, 0x7B11, 0x0F71, 0x7B12, 0x7B13, 0x41A4,
- 0x7B14, 0x7B14, 0x0433, 0x7B15, 0x7B15, 0x1C68, 0x7B16, 0x7B18, 0x41A6,
- 0x7B19, 0x7B19, 0x1C6F, 0x7B1A, 0x7B1A, 0x41A9, 0x7B1B, 0x7B1B, 0x05B2,
- 0x7B1C, 0x7B1D, 0x41AA, 0x7B1E, 0x7B1E, 0x1C77, 0x7B1F, 0x7B1F, 0x41AC,
- 0x7B20, 0x7B20, 0x1C72, 0x7B21, 0x7B23, 0x41AD, 0x7B24, 0x7B24, 0x1C74,
- 0x7B25, 0x7B25, 0x1C73, 0x7B26, 0x7B26, 0x0698, 0x7B27, 0x7B27, 0x41B0,
- 0x7B28, 0x7B28, 0x0428, 0x7B29, 0x7B29, 0x41B1, 0x7B2A, 0x7B2A, 0x1C6E,
- 0x7B2B, 0x7B2B, 0x1C6A, 0x7B2C, 0x7B2C, 0x05BB, 0x7B2D, 0x7B2D, 0x41B2,
- 0x7B2E, 0x7B2E, 0x1C70, 0x7B2F, 0x7B30, 0x41B3, 0x7B31, 0x7B31, 0x1C71,
- 0x7B32, 0x7B32, 0x41B5, 0x7B33, 0x7B33, 0x1C75, 0x7B34, 0x7B37, 0x41B6,
- 0x7B38, 0x7B38, 0x1C6D, 0x7B39, 0x7B39, 0x41BA, 0x7B3A, 0x7B3A, 0x0856,
- 0x7B3B, 0x7B3B, 0x41BB, 0x7B3C, 0x7B3C, 0x0A46, 0x7B3D, 0x7B3D, 0x41BC,
- 0x7B3E, 0x7B3E, 0x1C76, 0x7B3F, 0x7B44, 0x41BD, 0x7B45, 0x7B45, 0x1C7A,
- 0x7B46, 0x7B46, 0x1E41, 0x7B47, 0x7B47, 0x1C6C, 0x7B48, 0x7B48, 0x41C3,
- 0x7B49, 0x7B49, 0x05A9, 0x7B4A, 0x7B4A, 0x41C4, 0x7B4B, 0x7B4B, 0x08BF,
- 0x7B4C, 0x7B4C, 0x1C7C, 0x7B4D, 0x7B4E, 0x41C5, 0x7B4F, 0x7B4F, 0x0641,
- 0x7B50, 0x7B50, 0x097D, 0x7B51, 0x7B51, 0x11FD, 0x7B52, 0x7B52, 0x0E63,
- 0x7B53, 0x7B53, 0x41C7, 0x7B54, 0x7B54, 0x0573, 0x7B55, 0x7B55, 0x41C8,
- 0x7B56, 0x7B56, 0x04A6, 0x7B57, 0x7B57, 0x41C9, 0x7B58, 0x7B58, 0x1C78,
- 0x7B59, 0x7B59, 0x41CA, 0x7B5A, 0x7B5A, 0x1C79, 0x7B5B, 0x7B5B, 0x0CF1,
- 0x7B5C, 0x7B5C, 0x41CB, 0x7B5D, 0x7B5D, 0x1C7D, 0x7B5E, 0x7B5F, 0x41CC,
- 0x7B60, 0x7B60, 0x1C7E, 0x7B61, 0x7B61, 0x41CE, 0x7B62, 0x7B62, 0x1C81,
- 0x7B63, 0x7B66, 0x41CF, 0x7B67, 0x7B67, 0x25E4, 0x7B68, 0x7B6D, 0x41D3,
- 0x7B6E, 0x7B6E, 0x1C7F, 0x7B6F, 0x7B70, 0x41D9, 0x7B71, 0x7B71, 0x1C83,
- 0x7B72, 0x7B72, 0x1C82, 0x7B73, 0x7B74, 0x41DB, 0x7B75, 0x7B75, 0x1C7B,
- 0x7B76, 0x7B76, 0x41DD, 0x7B77, 0x7B77, 0x0977, 0x7B78, 0x7B78, 0x41DE,
- 0x7B79, 0x7B79, 0x0514, 0x7B7A, 0x7B7A, 0x41DF, 0x7B7B, 0x7B7B, 0x1C80,
- 0x7B7C, 0x7B7D, 0x41E0, 0x7B7E, 0x7B7E, 0x0C26, 0x7B7F, 0x7B7F, 0x41E2,
- 0x7B80, 0x7B80, 0x0865, 0x7B81, 0x7B84, 0x41E3, 0x7B85, 0x7B85, 0x1C8B,
- 0x7B86, 0x7B8A, 0x41E7, 0x7B8B, 0x7B8B, 0x1F86, 0x7B8C, 0x7B8C, 0x41EC,
- 0x7B8D, 0x7B8D, 0x0718, 0x7B8E, 0x7B8F, 0x41ED, 0x7B90, 0x7B90, 0x1C84,
- 0x7B91, 0x7B93, 0x41EF, 0x7B94, 0x7B94, 0x0474, 0x7B95, 0x7B95, 0x0813,
- 0x7B96, 0x7B96, 0x41F2, 0x7B97, 0x7B97, 0x0DD8, 0x7B98, 0x7B9B, 0x41F3,
- 0x7B9C, 0x7B9C, 0x1C8D, 0x7B9D, 0x7B9D, 0x1C89, 0x7B9E, 0x7BA0, 0x41F7,
- 0x7BA1, 0x7BA1, 0x0735, 0x7BA2, 0x7BA2, 0x1C8E, 0x7BA3, 0x7BA5, 0x41FA,
- 0x7BA6, 0x7BA7, 0x1C85, 0x7BA8, 0x7BA8, 0x1C8A, 0x7BA9, 0x7BA9, 0x0A88,
- 0x7BAA, 0x7BAA, 0x1C8C, 0x7BAB, 0x7BAB, 0x1C8F, 0x7BAC, 0x7BAC, 0x1C88,
- 0x7BAD, 0x7BAD, 0x0870, 0x7BAE, 0x7BB0, 0x41FD, 0x7BB1, 0x7BB1, 0x0F51,
- 0x7BB2, 0x7BB3, 0x4200, 0x7BB4, 0x7BB4, 0x1C90, 0x7BB5, 0x7BB7, 0x4202,
- 0x7BB8, 0x7BB8, 0x1C87, 0x7BB9, 0x7BBF, 0x4205, 0x7BC0, 0x7BC0, 0x1FB3,
- 0x7BC1, 0x7BC1, 0x1C92, 0x7BC2, 0x7BC3, 0x420C, 0x7BC4, 0x7BC4, 0x1EEF,
- 0x7BC5, 0x7BC5, 0x420E, 0x7BC6, 0x7BC6, 0x120A, 0x7BC7, 0x7BC7, 0x0BC9,
- 0x7BC8, 0x7BC8, 0x420F, 0x7BC9, 0x7BC9, 0x22A4, 0x7BCA, 0x7BCA, 0x4210,
- 0x7BCB, 0x7BCB, 0x25E8, 0x7BCC, 0x7BCC, 0x1C93, 0x7BCD, 0x7BD0, 0x4211,
- 0x7BD1, 0x7BD1, 0x1C91, 0x7BD2, 0x7BD2, 0x4215, 0x7BD3, 0x7BD3, 0x0A4F,
- 0x7BD4, 0x7BD8, 0x4216, 0x7BD9, 0x7BD9, 0x06D8, 0x7BDA, 0x7BDA, 0x1C95,
- 0x7BDB, 0x7BDC, 0x421B, 0x7BDD, 0x7BDD, 0x1C94, 0x7BDE, 0x7BE0, 0x421D,
- 0x7BE1, 0x7BE1, 0x055E, 0x7BE2, 0x7BE3, 0x4220, 0x7BE4, 0x7BE4, 0x25E3,
- 0x7BE5, 0x7BE6, 0x1C96, 0x7BE7, 0x7BE8, 0x4222, 0x7BE9, 0x7BE9, 0x2111,
- 0x7BEA, 0x7BEA, 0x1C98, 0x7BEB, 0x7BED, 0x4224, 0x7BEE, 0x7BEE, 0x09A5,
- 0x7BEF, 0x7BF0, 0x4227, 0x7BF1, 0x7BF1, 0x09D4, 0x7BF2, 0x7BF2, 0x4229,
- 0x7BF3, 0x7BF3, 0x25E6, 0x7BF4, 0x7BF6, 0x422A, 0x7BF7, 0x7BF7, 0x0BB2,
- 0x7BF8, 0x7BFB, 0x422D, 0x7BFC, 0x7BFC, 0x1C9B, 0x7BFD, 0x7BFD, 0x4231,
- 0x7BFE, 0x7BFE, 0x1C9A, 0x7BFF, 0x7BFF, 0x4232, 0x7C00, 0x7C00, 0x25E7,
- 0x7C01, 0x7C06, 0x4233, 0x7C07, 0x7C07, 0x055B, 0x7C08, 0x7C0A, 0x4239,
- 0x7C0B, 0x7C0B, 0x1C9E, 0x7C0C, 0x7C0C, 0x1C99, 0x7C0D, 0x7C0D, 0x2041,
- 0x7C0E, 0x7C0E, 0x423C, 0x7C0F, 0x7C0F, 0x1C9C, 0x7C10, 0x7C15, 0x423D,
- 0x7C16, 0x7C16, 0x1C9D, 0x7C17, 0x7C1D, 0x4243, 0x7C1E, 0x7C1E, 0x25EA,
- 0x7C1F, 0x7C1F, 0x1C9F, 0x7C20, 0x7C20, 0x424A, 0x7C21, 0x7C21, 0x1F8F,
- 0x7C22, 0x7C22, 0x424B, 0x7C23, 0x7C23, 0x25EC, 0x7C24, 0x7C25, 0x424C,
- 0x7C26, 0x7C26, 0x1CA1, 0x7C27, 0x7C27, 0x07DE, 0x7C28, 0x7C29, 0x424E,
- 0x7C2A, 0x7C2A, 0x1CA0, 0x7C2B, 0x7C2B, 0x25EB, 0x7C2C, 0x7C37, 0x4250,
- 0x7C38, 0x7C38, 0x1CA2, 0x7C39, 0x7C3C, 0x425C, 0x7C3D, 0x7C3D, 0x20D0,
- 0x7C3E, 0x7C3E, 0x201D, 0x7C3F, 0x7C3F, 0x0485, 0x7C40, 0x7C40, 0x1CA4,
- 0x7C41, 0x7C41, 0x1CA3, 0x7C42, 0x7C42, 0x4260, 0x7C43, 0x7C43, 0x1FF7,
- 0x7C44, 0x7C4B, 0x4261, 0x7C4C, 0x7C4C, 0x1E8D, 0x7C4D, 0x7C4D, 0x0821,
- 0x7C4E, 0x7C5B, 0x4269, 0x7C5C, 0x7C5C, 0x25E9, 0x7C5D, 0x7C5E, 0x4277,
- 0x7C5F, 0x7C5F, 0x25EE, 0x7C60, 0x7C60, 0x203A, 0x7C61, 0x7C63, 0x4279,
- 0x7C64, 0x7C64, 0x2693, 0x7C65, 0x7C68, 0x427C, 0x7C69, 0x7C69, 0x25E5,
- 0x7C6A, 0x7C6A, 0x25ED, 0x7C6B, 0x7C6B, 0x4280, 0x7C6C, 0x7C6C, 0x2009,
- 0x7C6D, 0x7C6D, 0x4281, 0x7C6E, 0x7C6E, 0x2065, 0x7C6F, 0x7C71, 0x4282,
- 0x7C72, 0x7C72, 0x26A3, 0x7C73, 0x7C73, 0x0ADC, 0x7C74, 0x7C74, 0x12F5,
- 0x7C75, 0x7C7A, 0x4285, 0x7C7B, 0x7C7B, 0x09CB, 0x7C7C, 0x7C7C, 0x1CCA,
- 0x7C7D, 0x7C7D, 0x122E, 0x7C7E, 0x7C88, 0x428B, 0x7C89, 0x7C89, 0x0678,
- 0x7C8A, 0x7C90, 0x4296, 0x7C91, 0x7C91, 0x1CCC, 0x7C92, 0x7C92, 0x09EC,
- 0x7C93, 0x7C94, 0x429D, 0x7C95, 0x7C95, 0x0BE8, 0x7C96, 0x7C96, 0x429F,
- 0x7C97, 0x7C97, 0x0559, 0x7C98, 0x7C98, 0x1154, 0x7C99, 0x7C9B, 0x42A0,
- 0x7C9C, 0x7C9C, 0x1CCE, 0x7C9D, 0x7C9D, 0x1CCD, 0x7C9E, 0x7C9E, 0x1CCF,
- 0x7C9F, 0x7C9F, 0x0DCF, 0x7CA0, 0x7CA1, 0x42A3, 0x7CA2, 0x7CA2, 0x1CD0,
- 0x7CA3, 0x7CA3, 0x42A5, 0x7CA4, 0x7CA4, 0x1104, 0x7CA5, 0x7CA5, 0x11DF,
- 0x7CA6, 0x7CA9, 0x42A6, 0x7CAA, 0x7CAA, 0x067D, 0x7CAB, 0x7CAD, 0x42AA,
- 0x7CAE, 0x7CAE, 0x0A01, 0x7CAF, 0x7CB0, 0x42AD, 0x7CB1, 0x7CB1, 0x0A04,
- 0x7CB2, 0x7CB2, 0x1CD1, 0x7CB3, 0x7CB3, 0x08DB, 0x7CB4, 0x7CB8, 0x42AF,
- 0x7CB9, 0x7CB9, 0x0565, 0x7CBA, 0x7CBB, 0x42B4, 0x7CBC, 0x7CBD, 0x1CD2,
- 0x7CBE, 0x7CBE, 0x08DA, 0x7CBF, 0x7CC0, 0x42B6, 0x7CC1, 0x7CC1, 0x1CD4,
- 0x7CC2, 0x7CC4, 0x42B8, 0x7CC5, 0x7CC5, 0x1CD9, 0x7CC6, 0x7CC6, 0x42BB,
- 0x7CC7, 0x7CC7, 0x1CD5, 0x7CC8, 0x7CC8, 0x1CD8, 0x7CC9, 0x7CC9, 0x42BC,
- 0x7CCA, 0x7CCA, 0x07B4, 0x7CCB, 0x7CCB, 0x42BD, 0x7CCC, 0x7CCD, 0x1CD6,
- 0x7CCE, 0x7CD4, 0x42BE, 0x7CD5, 0x7CD5, 0x06DD, 0x7CD6, 0x7CD6, 0x0E1A,
- 0x7CD7, 0x7CD7, 0x1CDA, 0x7CD8, 0x7CD8, 0x42C5, 0x7CD9, 0x7CD9, 0x04A1,
- 0x7CDA, 0x7CDB, 0x42C6, 0x7CDC, 0x7CDC, 0x0AD8, 0x7CDD, 0x7CDD, 0x25F5,
- 0x7CDE, 0x7CDE, 0x1EFC, 0x7CDF, 0x7CDF, 0x1126, 0x7CE0, 0x7CE0, 0x0944,
- 0x7CE1, 0x7CE6, 0x42C8, 0x7CE7, 0x7CE7, 0x2024, 0x7CE8, 0x7CE8, 0x1CDB,
- 0x7CE9, 0x7CEE, 0x42CE, 0x7CEF, 0x7CEF, 0x0B75, 0x7CF0, 0x7CF0, 0x269B,
- 0x7CF1, 0x7CF1, 0x42D4, 0x7CF2, 0x7CF2, 0x25F3, 0x7CF3, 0x7CF3, 0x42D5,
- 0x7CF4, 0x7CF4, 0x22D9, 0x7CF5, 0x7CF5, 0x42D6, 0x7CF6, 0x7CF6, 0x25F4,
- 0x7CF7, 0x7CF7, 0x42D7, 0x7CF8, 0x7CF8, 0x1CE7, 0x7CF9, 0x7CF9, 0x241B,
- 0x7CFA, 0x7CFA, 0x42D8, 0x7CFB, 0x7CFB, 0x0F22, 0x7CFC, 0x7CFD, 0x42D9,
- 0x7CFE, 0x7CFE, 0x1FC8, 0x7CFF, 0x7CFF, 0x42DB, 0x7D00, 0x7D00, 0x1F7B,
- 0x7D01, 0x7D01, 0x42DC, 0x7D02, 0x7D02, 0x241D, 0x7D03, 0x7D03, 0x42DD,
- 0x7D04, 0x7D04, 0x224C, 0x7D05, 0x7D05, 0x1F48, 0x7D06, 0x7D06, 0x241C,
- 0x7D07, 0x7D08, 0x241E, 0x7D09, 0x7D09, 0x20FF, 0x7D0A, 0x7D0A, 0x0ED8,
- 0x7D0B, 0x7D0B, 0x219A, 0x7D0C, 0x7D0C, 0x42DE, 0x7D0D, 0x7D0D, 0x2091,
- 0x7D0E, 0x7D0F, 0x42DF, 0x7D10, 0x7D10, 0x20A7, 0x7D11, 0x7D12, 0x42E1,
- 0x7D13, 0x7D13, 0x2423, 0x7D14, 0x7D14, 0x1E9B, 0x7D15, 0x7D15, 0x2422,
- 0x7D16, 0x7D16, 0x42E3, 0x7D17, 0x7D17, 0x2110, 0x7D18, 0x7D18, 0x42E4,
- 0x7D19, 0x7D19, 0x228D, 0x7D1A, 0x7D1A, 0x1F71, 0x7D1B, 0x7D1B, 0x1EF8,
- 0x7D1C, 0x7D1C, 0x2421, 0x7D1D, 0x7D1F, 0x42E5, 0x7D20, 0x7D20, 0x0DCD,
- 0x7D21, 0x7D21, 0x1EF3, 0x7D22, 0x7D22, 0x0DEC, 0x7D23, 0x7D26, 0x42E8,
- 0x7D27, 0x7D27, 0x08C5, 0x7D28, 0x7D2A, 0x42EC, 0x7D2B, 0x7D2B, 0x122C,
- 0x7D2C, 0x7D2E, 0x42EF, 0x7D2F, 0x7D2F, 0x09C6, 0x7D30, 0x7D30, 0x21B1,
- 0x7D31, 0x7D31, 0x2426, 0x7D32, 0x7D32, 0x2425, 0x7D33, 0x7D33, 0x2120,
- 0x7D34, 0x7D38, 0x42F2, 0x7D39, 0x7D39, 0x211A, 0x7D3A, 0x7D3A, 0x2424,
- 0x7D3B, 0x7D3B, 0x42F7, 0x7D3C, 0x7D3C, 0x2428, 0x7D3D, 0x7D3E, 0x42F8,
- 0x7D3F, 0x7D3F, 0x242A, 0x7D40, 0x7D40, 0x2429, 0x7D41, 0x7D41, 0x42FA,
- 0x7D42, 0x7D42, 0x2294, 0x7D43, 0x7D43, 0x42FB, 0x7D44, 0x7D44, 0x22BE,
- 0x7D45, 0x7D45, 0x42FC, 0x7D46, 0x7D46, 0x1E31, 0x7D47, 0x7D4D, 0x42FD,
- 0x7D4E, 0x7D4E, 0x242C, 0x7D4F, 0x7D4F, 0x4304, 0x7D50, 0x7D50, 0x1FB5,
- 0x7D51, 0x7D5C, 0x4305, 0x7D5D, 0x7D5D, 0x242B, 0x7D5E, 0x7D5E, 0x1FAF,
- 0x7D5F, 0x7D60, 0x4311, 0x7D61, 0x7D61, 0x2068, 0x7D62, 0x7D62, 0x21E4,
- 0x7D63, 0x7D65, 0x4313, 0x7D66, 0x7D66, 0x1F21, 0x7D67, 0x7D67, 0x4316,
- 0x7D68, 0x7D68, 0x2101, 0x7D69, 0x7D6D, 0x4317, 0x7D6E, 0x7D6E, 0x0FC0,
- 0x7D6F, 0x7D70, 0x431C, 0x7D71, 0x7D71, 0x217C, 0x7D72, 0x7D72, 0x214A,
- 0x7D73, 0x7D73, 0x242D, 0x7D74, 0x7D75, 0x431E, 0x7D76, 0x7D76, 0x1FD4,
- 0x7D77, 0x7D77, 0x1CE8, 0x7D78, 0x7D78, 0x4320, 0x7D79, 0x7D79, 0x1FD1,
- 0x7D7A, 0x7D80, 0x4321, 0x7D81, 0x7D81, 0x1E33, 0x7D82, 0x7D82, 0x4328,
- 0x7D83, 0x7D83, 0x242F, 0x7D84, 0x7D85, 0x4329, 0x7D86, 0x7D86, 0x242E,
- 0x7D87, 0x7D87, 0x432B, 0x7D88, 0x7D88, 0x2430, 0x7D89, 0x7D89, 0x21DB,
- 0x7D8A, 0x7D8E, 0x432C, 0x7D8F, 0x7D8F, 0x2158, 0x7D90, 0x7D92, 0x4331,
- 0x7D93, 0x7D93, 0x1FC2, 0x7D94, 0x7D9B, 0x4334, 0x7D9C, 0x7D9C, 0x22B9,
- 0x7D9D, 0x7D9D, 0x433C, 0x7D9E, 0x7D9E, 0x2436, 0x7D9F, 0x7DA1, 0x433D,
- 0x7DA2, 0x7DA2, 0x1E8E, 0x7DA3, 0x7DA3, 0x2439, 0x7DA4, 0x7DA5, 0x4340,
- 0x7DA6, 0x7DA6, 0x1CE9, 0x7DA7, 0x7DAA, 0x4342, 0x7DAB, 0x7DAB, 0x21C5,
- 0x7DAC, 0x7DAC, 0x2437, 0x7DAD, 0x7DAD, 0x2192, 0x7DAE, 0x7DAE, 0x1CEA,
- 0x7DAF, 0x7DAF, 0x4346, 0x7DB0, 0x7DB0, 0x243A, 0x7DB1, 0x7DB1, 0x1F19,
- 0x7DB2, 0x7DB2, 0x218C, 0x7DB3, 0x7DB3, 0x1E40, 0x7DB4, 0x7DB4, 0x22B3,
- 0x7DB5, 0x7DB7, 0x4347, 0x7DB8, 0x7DB8, 0x205F, 0x7DB9, 0x7DB9, 0x2438,
- 0x7DBA, 0x7DBA, 0x2432, 0x7DBB, 0x7DBB, 0x2274, 0x7DBC, 0x7DBC, 0x434A,
- 0x7DBD, 0x7DBD, 0x1E9C, 0x7DBE, 0x7DBE, 0x2431, 0x7DBF, 0x7DBF, 0x2085,
- 0x7DC0, 0x7DC3, 0x434B, 0x7DC4, 0x7DC4, 0x2435, 0x7DC5, 0x7DC6, 0x434F,
- 0x7DC7, 0x7DC7, 0x243B, 0x7DC8, 0x7DC9, 0x4351, 0x7DCA, 0x7DCA, 0x1FB7,
- 0x7DCB, 0x7DCB, 0x2433, 0x7DCC, 0x7DD0, 0x4353, 0x7DD1, 0x7DD1, 0x2054,
- 0x7DD2, 0x7DD2, 0x21DE, 0x7DD3, 0x7DD3, 0x4358, 0x7DD4, 0x7DD4, 0x2434,
- 0x7DD5, 0x7DD6, 0x4359, 0x7DD7, 0x7DD7, 0x243D, 0x7DD8, 0x7DD8, 0x1F89,
- 0x7DD9, 0x7DD9, 0x243C, 0x7DDA, 0x7DDC, 0x435B, 0x7DDD, 0x7DDD, 0x1F6E,
- 0x7DDE, 0x7DDE, 0x1ED8, 0x7DDF, 0x7DDF, 0x435E, 0x7DE0, 0x7DE0, 0x1EBF,
- 0x7DE1, 0x7DE1, 0x2445, 0x7DE2, 0x7DE2, 0x435F, 0x7DE3, 0x7DE3, 0x2249,
- 0x7DE4, 0x7DE5, 0x4360, 0x7DE6, 0x7DE6, 0x2441, 0x7DE7, 0x7DE7, 0x4362,
- 0x7DE8, 0x7DE8, 0x1E47, 0x7DE9, 0x7DE9, 0x1F56, 0x7DEA, 0x7DEB, 0x4363,
- 0x7DEC, 0x7DEC, 0x2086, 0x7DED, 0x7DEE, 0x4365, 0x7DEF, 0x7DEF, 0x2196,
- 0x7DF0, 0x7DF0, 0x4367, 0x7DF1, 0x7DF1, 0x2443, 0x7DF2, 0x7DF2, 0x243F,
- 0x7DF3, 0x7DF3, 0x4368, 0x7DF4, 0x7DF4, 0x2023, 0x7DF5, 0x7DF5, 0x4369,
- 0x7DF6, 0x7DF6, 0x2442, 0x7DF7, 0x7DF8, 0x436A, 0x7DF9, 0x7DF9, 0x243E,
- 0x7DFA, 0x7DFA, 0x436C, 0x7DFB, 0x7DFB, 0x26A6, 0x7DFC, 0x7DFF, 0x436D,
- 0x7E00, 0x7E07, 0x4371, 0x7E08, 0x7E08, 0x234E, 0x7E09, 0x7E09, 0x2446,
- 0x7E0A, 0x7E0A, 0x244B, 0x7E0B, 0x7E0B, 0x2444, 0x7E0C, 0x7E0F, 0x4379,
- 0x7E10, 0x7E10, 0x2427, 0x7E11, 0x7E11, 0x244C, 0x7E12, 0x7E1A, 0x437D,
- 0x7E1B, 0x7E1B, 0x1F0F, 0x7E1C, 0x7E1C, 0x4386, 0x7E1D, 0x7E1D, 0x2447,
- 0x7E1E, 0x7E1E, 0x2449, 0x7E1F, 0x7E1F, 0x2448, 0x7E20, 0x7E22, 0x4387,
- 0x7E23, 0x7E23, 0x21C2, 0x7E24, 0x7E26, 0x438A, 0x7E27, 0x7E27, 0x216E,
- 0x7E28, 0x7E2A, 0x438D, 0x7E2B, 0x7E2B, 0x1F03, 0x7E2C, 0x7E2C, 0x4390,
- 0x7E2D, 0x7E2D, 0x244A, 0x7E2E, 0x7E2E, 0x215C, 0x7E2F, 0x7E30, 0x4391,
- 0x7E31, 0x7E31, 0x22BB, 0x7E32, 0x7E32, 0x2450, 0x7E33, 0x7E33, 0x4393,
- 0x7E34, 0x7E34, 0x2694, 0x7E35, 0x7E35, 0x244F, 0x7E36, 0x7E36, 0x25F6,
- 0x7E37, 0x7E37, 0x2051, 0x7E38, 0x7E38, 0x4394, 0x7E39, 0x7E39, 0x244E,
- 0x7E3A, 0x7E3A, 0x4395, 0x7E3B, 0x7E3B, 0x1DFB, 0x7E3C, 0x7E3C, 0x4396,
- 0x7E3D, 0x7E3D, 0x22BA, 0x7E3E, 0x7E3E, 0x1F6D, 0x7E3F, 0x7E40, 0x4397,
- 0x7E41, 0x7E41, 0x064E, 0x7E42, 0x7E44, 0x4399, 0x7E45, 0x7E45, 0x2452,
- 0x7E46, 0x7E46, 0x2451, 0x7E47, 0x7E47, 0x1CEB, 0x7E48, 0x7E51, 0x439C,
- 0x7E52, 0x7E52, 0x2455, 0x7E53, 0x7E53, 0x43A6, 0x7E54, 0x7E54, 0x2289,
- 0x7E55, 0x7E55, 0x2116, 0x7E56, 0x7E59, 0x43A7, 0x7E5A, 0x7E5A, 0x2454,
- 0x7E5B, 0x7E5D, 0x43AB, 0x7E5E, 0x7E5E, 0x20FB, 0x7E5F, 0x7E61, 0x43AE,
- 0x7E62, 0x7E62, 0x2440, 0x7E63, 0x7E68, 0x43B1, 0x7E69, 0x7E69, 0x2126,
- 0x7E6A, 0x7E6A, 0x1F61, 0x7E6B, 0x7E6B, 0x269D, 0x7E6C, 0x7E6C, 0x43B7,
- 0x7E6D, 0x7E6D, 0x1F8A, 0x7E6E, 0x7E6E, 0x2456, 0x7E6F, 0x7E6F, 0x2459,
- 0x7E70, 0x7E70, 0x2458, 0x7E71, 0x7E72, 0x43B8, 0x7E73, 0x7E73, 0x1FAE,
- 0x7E74, 0x7E78, 0x43BA, 0x7E79, 0x7E79, 0x221A, 0x7E7A, 0x7E7B, 0x43BF,
- 0x7E7C, 0x7E7C, 0x1F7A, 0x7E7D, 0x7E7D, 0x244D, 0x7E7E, 0x7E7E, 0x2457,
- 0x7E7F, 0x7E81, 0x43C1, 0x7E82, 0x7E82, 0x1248, 0x7E83, 0x7E87, 0x43C4,
- 0x7E88, 0x7E88, 0x2453, 0x7E89, 0x7E89, 0x43C9, 0x7E8A, 0x7E8A, 0x2420,
- 0x7E8B, 0x7E8B, 0x43CA, 0x7E8C, 0x7E8C, 0x21DF, 0x7E8D, 0x7E8D, 0x2685,
- 0x7E8E, 0x7E8E, 0x43CB, 0x7E8F, 0x7E8F, 0x1E6E, 0x7E90, 0x7E92, 0x43CC,
- 0x7E93, 0x7E93, 0x2224, 0x7E94, 0x7E94, 0x2670, 0x7E95, 0x7E95, 0x43CF,
- 0x7E96, 0x7E96, 0x21BA, 0x7E97, 0x7E97, 0x43D0, 0x7E98, 0x7E98, 0x245A,
- 0x7E99, 0x7E9A, 0x43D1, 0x7E9B, 0x7E9B, 0x1CEC, 0x7E9C, 0x7E9C, 0x1FFF,
- 0x7E9D, 0x7E9E, 0x43D3, 0x7E9F, 0x7E9F, 0x17D3, 0x7EA0, 0x7EA0, 0x08EF,
- 0x7EA1, 0x7EA1, 0x17D4, 0x7EA2, 0x7EA2, 0x07A3, 0x7EA3, 0x7EA3, 0x17D5,
- 0x7EA4, 0x7EA4, 0x0F38, 0x7EA5, 0x7EA5, 0x17D6, 0x7EA6, 0x7EA6, 0x10FF,
- 0x7EA7, 0x7EA7, 0x0829, 0x7EA8, 0x7EA9, 0x17D7, 0x7EAA, 0x7EAA, 0x0840,
- 0x7EAB, 0x7EAB, 0x0CAD, 0x7EAC, 0x7EAC, 0x0EC2, 0x7EAD, 0x7EAD, 0x17D9,
- 0x7EAE, 0x7EAE, 0x43D5, 0x7EAF, 0x7EAF, 0x0542, 0x7EB0, 0x7EB0, 0x17DA,
- 0x7EB1, 0x7EB1, 0x0CED, 0x7EB2, 0x7EB2, 0x06D4, 0x7EB3, 0x7EB3, 0x0B2C,
- 0x7EB4, 0x7EB4, 0x43D6, 0x7EB5, 0x7EB5, 0x123A, 0x7EB6, 0x7EB6, 0x0A81,
- 0x7EB7, 0x7EB7, 0x0674, 0x7EB8, 0x7EB8, 0x11BC, 0x7EB9, 0x7EB9, 0x0ED5,
- 0x7EBA, 0x7EBA, 0x0661, 0x7EBB, 0x7EBC, 0x43D7, 0x7EBD, 0x7EBD, 0x0B67,
- 0x7EBE, 0x7EBE, 0x17DB, 0x7EBF, 0x7EBF, 0x0F4C, 0x7EC0, 0x7EC2, 0x17DC,
- 0x7EC3, 0x7EC3, 0x0A00, 0x7EC4, 0x7EC4, 0x1246, 0x7EC5, 0x7EC5, 0x0D29,
- 0x7EC6, 0x7EC6, 0x0F25, 0x7EC7, 0x7EC7, 0x11AE, 0x7EC8, 0x7EC8, 0x11D4,
- 0x7EC9, 0x7EC9, 0x17DF, 0x7ECA, 0x7ECA, 0x03F8, 0x7ECB, 0x7ECC, 0x17E0,
- 0x7ECD, 0x7ECD, 0x0D15, 0x7ECE, 0x7ECE, 0x1076, 0x7ECF, 0x7ECF, 0x08DC,
- 0x7ED0, 0x7ED0, 0x17E2, 0x7ED1, 0x7ED1, 0x03FE, 0x7ED2, 0x7ED2, 0x0CB9,
- 0x7ED3, 0x7ED3, 0x08B2, 0x7ED4, 0x7ED4, 0x17E3, 0x7ED5, 0x7ED5, 0x0CA1,
- 0x7ED6, 0x7ED6, 0x43D9, 0x7ED7, 0x7ED7, 0x17E4, 0x7ED8, 0x7ED8, 0x07FB,
- 0x7ED9, 0x7ED9, 0x06F3, 0x7EDA, 0x7EDA, 0x0FCD, 0x7EDB, 0x7EDB, 0x17E5,
- 0x7EDC, 0x7EDC, 0x0A8E, 0x7EDD, 0x7EDD, 0x0927, 0x7EDE, 0x7EDE, 0x089B,
- 0x7EDF, 0x7EDF, 0x0E64, 0x7EE0, 0x7EE1, 0x17E6, 0x7EE2, 0x7EE2, 0x091D,
- 0x7EE3, 0x7EE3, 0x0FB0, 0x7EE4, 0x7EE4, 0x43DA, 0x7EE5, 0x7EE5, 0x0DDC,
- 0x7EE6, 0x7EE6, 0x0E23, 0x7EE7, 0x7EE7, 0x083F, 0x7EE8, 0x7EE8, 0x17E8,
- 0x7EE9, 0x7EE9, 0x081B, 0x7EEA, 0x7EEA, 0x0FC2, 0x7EEB, 0x7EEB, 0x17E9,
- 0x7EEC, 0x7EEC, 0x43DB, 0x7EED, 0x7EED, 0x0FC3, 0x7EEE, 0x7EEF, 0x17EA,
- 0x7EF0, 0x7EF0, 0x0545, 0x7EF1, 0x7EF2, 0x17EC, 0x7EF3, 0x7EF3, 0x0D37,
- 0x7EF4, 0x7EF4, 0x0EBB, 0x7EF5, 0x7EF5, 0x0AE5, 0x7EF6, 0x7EF6, 0x17EF,
- 0x7EF7, 0x7EF7, 0x042A, 0x7EF8, 0x7EF8, 0x0516, 0x7EF9, 0x7EF9, 0x43DC,
- 0x7EFA, 0x7EFB, 0x17F0, 0x7EFC, 0x7EFC, 0x1238, 0x7EFD, 0x7EFD, 0x1161,
- 0x7EFE, 0x7EFE, 0x17F2, 0x7EFF, 0x7EFF, 0x0A73, 0x7F00, 0x7F00, 0x1217,
- 0x7F01, 0x7F03, 0x17F3, 0x7F04, 0x7F04, 0x085D, 0x7F05, 0x7F05, 0x0AEA,
- 0x7F06, 0x7F06, 0x09AD, 0x7F07, 0x7F08, 0x17F6, 0x7F09, 0x7F09, 0x081C,
- 0x7F0A, 0x7F0A, 0x43DD, 0x7F0B, 0x7F0C, 0x17F8, 0x7F0D, 0x7F0D, 0x17EE,
- 0x7F0E, 0x7F0E, 0x060F, 0x7F0F, 0x7F0F, 0x17FA, 0x7F10, 0x7F10, 0x43DE,
- 0x7F11, 0x7F12, 0x17FB, 0x7F13, 0x7F13, 0x07CF, 0x7F14, 0x7F14, 0x05BF,
- 0x7F15, 0x7F15, 0x0A6D, 0x7F16, 0x7F16, 0x0449, 0x7F17, 0x7F17, 0x17FD,
- 0x7F18, 0x7F18, 0x10F8, 0x7F19, 0x7F19, 0x17FE, 0x7F1A, 0x7F1A, 0x06BA,
- 0x7F1B, 0x7F1B, 0x1800, 0x7F1C, 0x7F1C, 0x17FF, 0x7F1D, 0x7F1D, 0x0689,
- 0x7F1E, 0x7F1E, 0x43DF, 0x7F1F, 0x7F1F, 0x1801, 0x7F20, 0x7F20, 0x04BF,
- 0x7F21, 0x7F27, 0x1802, 0x7F28, 0x7F28, 0x108C, 0x7F29, 0x7F29, 0x0DEA,
- 0x7F2A, 0x7F2D, 0x1809, 0x7F2E, 0x7F2E, 0x0D02, 0x7F2F, 0x7F33, 0x180D,
- 0x7F34, 0x7F34, 0x089A, 0x7F35, 0x7F35, 0x1812, 0x7F36, 0x7F36, 0x1C5E,
- 0x7F37, 0x7F37, 0x43E0, 0x7F38, 0x7F38, 0x06D2, 0x7F39, 0x7F39, 0x43E1,
- 0x7F3A, 0x7F3A, 0x0C8C, 0x7F3B, 0x7F41, 0x43E2, 0x7F42, 0x7F42, 0x1C5F,
- 0x7F43, 0x7F43, 0x43E9, 0x7F44, 0x7F45, 0x1C60, 0x7F46, 0x7F4B, 0x43EA,
- 0x7F4C, 0x7F4C, 0x25E2, 0x7F4D, 0x7F4D, 0x43F0, 0x7F4E, 0x7F4E, 0x269A,
- 0x7F4F, 0x7F4F, 0x43F1, 0x7F50, 0x7F50, 0x0737, 0x7F51, 0x7F51, 0x0EA9,
- 0x7F52, 0x7F53, 0x43F2, 0x7F54, 0x7F54, 0x129E, 0x7F55, 0x7F55, 0x0768,
- 0x7F56, 0x7F56, 0x43F4, 0x7F57, 0x7F57, 0x0A85, 0x7F58, 0x7F58, 0x1A81,
- 0x7F59, 0x7F59, 0x43F5, 0x7F5A, 0x7F5A, 0x0640, 0x7F5B, 0x7F5E, 0x43F6,
- 0x7F5F, 0x7F5F, 0x1A83, 0x7F60, 0x7F60, 0x43FA, 0x7F61, 0x7F61, 0x1A82,
- 0x7F62, 0x7F62, 0x03E0, 0x7F63, 0x7F67, 0x43FB, 0x7F68, 0x7F68, 0x1A85,
- 0x7F69, 0x7F69, 0x1177, 0x7F6A, 0x7F6A, 0x124C, 0x7F6B, 0x7F6D, 0x4400,
- 0x7F6E, 0x7F6E, 0x11C2, 0x7F6F, 0x7F6F, 0x4403, 0x7F70, 0x7F70, 0x1EEA,
- 0x7F71, 0x7F71, 0x1A87, 0x7F72, 0x7F72, 0x0D87, 0x7F73, 0x7F73, 0x4404,
- 0x7F74, 0x7F74, 0x1A86, 0x7F75, 0x7F76, 0x4405, 0x7F77, 0x7F77, 0x1E2C,
- 0x7F78, 0x7F78, 0x4407, 0x7F79, 0x7F79, 0x1A88, 0x7F7A, 0x7F7D, 0x4408,
- 0x7F7E, 0x7F7E, 0x1A8A, 0x7F7F, 0x7F80, 0x440C, 0x7F81, 0x7F81, 0x1A89,
- 0x7F82, 0x7F84, 0x440E, 0x7F85, 0x7F85, 0x2062, 0x7F86, 0x7F86, 0x24F1,
- 0x7F87, 0x7F87, 0x4411, 0x7F88, 0x7F88, 0x24F2, 0x7F89, 0x7F89, 0x4412,
- 0x7F8A, 0x7F8A, 0x101B, 0x7F8B, 0x7F8B, 0x4413, 0x7F8C, 0x7F8C, 0x0C39,
- 0x7F8D, 0x7F8D, 0x4414, 0x7F8E, 0x7F8E, 0x0AC5, 0x7F8F, 0x7F93, 0x4415,
- 0x7F94, 0x7F94, 0x06DC, 0x7F95, 0x7F99, 0x441A, 0x7F9A, 0x7F9A, 0x0A30,
- 0x7F9B, 0x7F9C, 0x441F, 0x7F9D, 0x7F9D, 0x1CC4, 0x7F9E, 0x7F9E, 0x0FAA,
- 0x7F9F, 0x7F9F, 0x1CC5, 0x7FA0, 0x7FA0, 0x4421, 0x7FA1, 0x7FA1, 0x0F48,
- 0x7FA2, 0x7FA3, 0x4422, 0x7FA4, 0x7FA4, 0x0C95, 0x7FA5, 0x7FA5, 0x25F2,
- 0x7FA6, 0x7FA6, 0x4424, 0x7FA7, 0x7FA7, 0x1CC6, 0x7FA8, 0x7FA8, 0x4425,
- 0x7FA9, 0x7FA9, 0x2215, 0x7FAA, 0x7FAE, 0x4426, 0x7FAF, 0x7FB0, 0x1CC7,
- 0x7FB1, 0x7FB1, 0x442B, 0x7FB2, 0x7FB2, 0x1CC9, 0x7FB3, 0x7FB7, 0x442C,
- 0x7FB8, 0x7FB8, 0x130E, 0x7FB9, 0x7FB9, 0x06F9, 0x7FBA, 0x7FBB, 0x4431,
- 0x7FBC, 0x7FBC, 0x176D, 0x7FBD, 0x7FBD, 0x10D5, 0x7FBE, 0x7FBE, 0x4433,
- 0x7FBF, 0x7FBF, 0x1CDE, 0x7FC0, 0x7FC0, 0x4434, 0x7FC1, 0x7FC1, 0x0EDB,
- 0x7FC2, 0x7FC4, 0x4435, 0x7FC5, 0x7FC5, 0x0506, 0x7FC6, 0x7FC9, 0x4438,
- 0x7FCA, 0x7FCA, 0x1B98, 0x7FCB, 0x7FCB, 0x443C, 0x7FCC, 0x7FCC, 0x1075,
- 0x7FCD, 0x7FCD, 0x443D, 0x7FCE, 0x7FCE, 0x1CDF, 0x7FCF, 0x7FD1, 0x443E,
- 0x7FD2, 0x7FD2, 0x21AE, 0x7FD3, 0x7FD3, 0x4441, 0x7FD4, 0x7FD4, 0x0F55,
- 0x7FD5, 0x7FD5, 0x1CE0, 0x7FD6, 0x7FD7, 0x4442, 0x7FD8, 0x7FD8, 0x0C49,
- 0x7FD9, 0x7FDE, 0x4444, 0x7FDF, 0x7FDF, 0x05B5, 0x7FE0, 0x7FE0, 0x0567,
- 0x7FE1, 0x7FE1, 0x1CE2, 0x7FE2, 0x7FE4, 0x444A, 0x7FE5, 0x7FE5, 0x1CE1,
- 0x7FE6, 0x7FE6, 0x1CE3, 0x7FE7, 0x7FE8, 0x444D, 0x7FE9, 0x7FE9, 0x1CE4,
- 0x7FEA, 0x7FED, 0x444F, 0x7FEE, 0x7FEE, 0x1CE5, 0x7FEF, 0x7FEF, 0x4453,
- 0x7FF0, 0x7FF0, 0x0769, 0x7FF1, 0x7FF1, 0x03CA, 0x7FF2, 0x7FF2, 0x4454,
- 0x7FF3, 0x7FF3, 0x1CE6, 0x7FF4, 0x7FF8, 0x4455, 0x7FF9, 0x7FF9, 0x20E0,
- 0x7FFA, 0x7FFA, 0x445A, 0x7FFB, 0x7FFB, 0x064A, 0x7FFC, 0x7FFC, 0x1074,
- 0x7FFD, 0x7FFF, 0x445B, 0x8000, 0x8000, 0x1032, 0x8001, 0x8001, 0x09BA,
- 0x8002, 0x8002, 0x445E, 0x8003, 0x8003, 0x0949, 0x8004, 0x8004, 0x1953,
- 0x8005, 0x8005, 0x1180, 0x8006, 0x8006, 0x191A, 0x8007, 0x800A, 0x445F,
- 0x800B, 0x800B, 0x1BD7, 0x800C, 0x800C, 0x0637, 0x800D, 0x800D, 0x0D98,
- 0x800E, 0x800F, 0x4463, 0x8010, 0x8010, 0x0B30, 0x8011, 0x8011, 0x4465,
- 0x8012, 0x8012, 0x1BCB, 0x8013, 0x8013, 0x4466, 0x8014, 0x8014, 0x1BCC,
- 0x8015, 0x8015, 0x06F6, 0x8016, 0x8016, 0x1BCD, 0x8017, 0x8017, 0x077B,
- 0x8018, 0x8018, 0x1108, 0x8019, 0x8019, 0x03DD, 0x801A, 0x801B, 0x4467,
- 0x801C, 0x801C, 0x1BCE, 0x801D, 0x801F, 0x4469, 0x8020, 0x8020, 0x1BCF,
- 0x8021, 0x8021, 0x446C, 0x8022, 0x8022, 0x1BD0, 0x8023, 0x8024, 0x446D,
- 0x8025, 0x8027, 0x1BD1, 0x8028, 0x8028, 0x1BD5, 0x8029, 0x8029, 0x1BD4,
- 0x802A, 0x802A, 0x0B96, 0x802B, 0x802B, 0x446F, 0x802C, 0x802C, 0x25C2,
- 0x802D, 0x802D, 0x4470, 0x802E, 0x802E, 0x25C1, 0x802F, 0x8030, 0x4471,
- 0x8031, 0x8031, 0x1BD6, 0x8032, 0x8032, 0x4473, 0x8033, 0x8033, 0x0639,
- 0x8034, 0x8034, 0x4474, 0x8035, 0x8035, 0x1BD8, 0x8036, 0x8036, 0x1035,
- 0x8037, 0x8037, 0x14B1, 0x8038, 0x8038, 0x0DBF, 0x8039, 0x803A, 0x4475,
- 0x803B, 0x803B, 0x0501, 0x803C, 0x803C, 0x4477, 0x803D, 0x803D, 0x0583,
- 0x803E, 0x803E, 0x4478, 0x803F, 0x803F, 0x06FB, 0x8040, 0x8041, 0x4479,
- 0x8042, 0x8042, 0x0B57, 0x8043, 0x8043, 0x1BD9, 0x8044, 0x8045, 0x447B,
- 0x8046, 0x8046, 0x1BDA, 0x8047, 0x8049, 0x447D, 0x804A, 0x804A, 0x0A0D,
- 0x804B, 0x804B, 0x0A44, 0x804C, 0x804C, 0x11AF, 0x804D, 0x804D, 0x1BDB,
- 0x804E, 0x8051, 0x4480, 0x8052, 0x8052, 0x1BDC, 0x8053, 0x8053, 0x4484,
- 0x8054, 0x8054, 0x09F3, 0x8055, 0x8055, 0x4485, 0x8056, 0x8056, 0x2128,
- 0x8057, 0x8057, 0x4486, 0x8058, 0x8058, 0x0BD7, 0x8059, 0x8059, 0x4487,
- 0x805A, 0x805A, 0x090A, 0x805B, 0x805D, 0x4488, 0x805E, 0x805E, 0x2199,
- 0x805F, 0x8068, 0x448B, 0x8069, 0x8069, 0x1BDD, 0x806A, 0x806A, 0x0552,
- 0x806B, 0x806E, 0x4495, 0x806F, 0x806F, 0x2017, 0x8070, 0x8070, 0x1EA0,
- 0x8071, 0x8071, 0x1BDE, 0x8072, 0x8072, 0x2125, 0x8073, 0x8073, 0x214D,
- 0x8074, 0x8074, 0x4499, 0x8075, 0x8075, 0x25C4, 0x8076, 0x8076, 0x209D,
- 0x8077, 0x8077, 0x228A, 0x8078, 0x8078, 0x449A, 0x8079, 0x8079, 0x25C3,
- 0x807A, 0x807C, 0x449B, 0x807D, 0x807D, 0x2179, 0x807E, 0x807E, 0x2038,
- 0x807F, 0x807F, 0x1A1E, 0x8080, 0x8080, 0x1A1D, 0x8081, 0x8082, 0x449E,
- 0x8083, 0x8083, 0x0DD5, 0x8084, 0x8084, 0x1065, 0x8085, 0x8085, 0x2155,
- 0x8086, 0x8086, 0x0DB6, 0x8087, 0x8087, 0x1179, 0x8088, 0x8088, 0x44A0,
- 0x8089, 0x8089, 0x0CBD, 0x808A, 0x808A, 0x44A1, 0x808B, 0x808B, 0x09CA,
- 0x808C, 0x808C, 0x0814, 0x808D, 0x8092, 0x44A2, 0x8093, 0x8093, 0x1971,
- 0x8094, 0x8095, 0x44A8, 0x8096, 0x8096, 0x0F6F, 0x8097, 0x8097, 0x44AA,
- 0x8098, 0x8098, 0x11E1, 0x8099, 0x8099, 0x44AB, 0x809A, 0x809A, 0x0606,
- 0x809B, 0x809B, 0x06D3, 0x809C, 0x809C, 0x1970, 0x809D, 0x809D, 0x06C9,
- 0x809E, 0x809E, 0x44AC, 0x809F, 0x809F, 0x196F, 0x80A0, 0x80A0, 0x04CB,
- 0x80A1, 0x80A1, 0x0722, 0x80A2, 0x80A2, 0x11AA, 0x80A3, 0x80A3, 0x44AD,
- 0x80A4, 0x80A4, 0x0691, 0x80A5, 0x80A5, 0x0667, 0x80A6, 0x80A8, 0x44AE,
- 0x80A9, 0x80A9, 0x085A, 0x80AA, 0x80AA, 0x065B, 0x80AB, 0x80AB, 0x1976,
- 0x80AC, 0x80AC, 0x44B1, 0x80AD, 0x80AD, 0x1977, 0x80AE, 0x80AE, 0x03C4,
- 0x80AF, 0x80AF, 0x095C, 0x80B0, 0x80B0, 0x44B2, 0x80B1, 0x80B1, 0x1975,
- 0x80B2, 0x80B2, 0x10E2, 0x80B3, 0x80B3, 0x44B3, 0x80B4, 0x80B4, 0x1978,
- 0x80B5, 0x80B6, 0x44B4, 0x80B7, 0x80B7, 0x1979, 0x80B8, 0x80B9, 0x44B6,
- 0x80BA, 0x80BA, 0x066B, 0x80BB, 0x80BB, 0x44B8, 0x80BC, 0x80BC, 0x1972,
- 0x80BD, 0x80BD, 0x1974, 0x80BE, 0x80BE, 0x0D2F, 0x80BF, 0x80BF, 0x11D6,
- 0x80C0, 0x80C0, 0x116E, 0x80C1, 0x80C1, 0x0F7D, 0x80C2, 0x80C2, 0x197F,
- 0x80C3, 0x80C3, 0x0EC7, 0x80C4, 0x80C4, 0x1980, 0x80C5, 0x80C5, 0x44B9,
- 0x80C6, 0x80C6, 0x0589, 0x80C7, 0x80CB, 0x44BA, 0x80CC, 0x80CC, 0x041C,
- 0x80CD, 0x80CD, 0x1982, 0x80CE, 0x80CE, 0x0DF8, 0x80CF, 0x80D5, 0x44BF,
- 0x80D6, 0x80D6, 0x0B97, 0x80D7, 0x80D7, 0x1983, 0x80D8, 0x80D8, 0x44C6,
- 0x80D9, 0x80D9, 0x1981, 0x80DA, 0x80DA, 0x0BA0, 0x80DB, 0x80DB, 0x197E,
- 0x80DC, 0x80DC, 0x0D3B, 0x80DD, 0x80DD, 0x1985, 0x80DE, 0x80DE, 0x0406,
- 0x80DF, 0x80E0, 0x44C7, 0x80E1, 0x80E1, 0x07B1, 0x80E2, 0x80E3, 0x44C9,
- 0x80E4, 0x80E4, 0x126D, 0x80E5, 0x80E5, 0x1BC7, 0x80E6, 0x80E6, 0x44CB,
- 0x80E7, 0x80EA, 0x197A, 0x80EB, 0x80EB, 0x1986, 0x80EC, 0x80EC, 0x179A,
- 0x80ED, 0x80ED, 0x1989, 0x80EE, 0x80EE, 0x44CC, 0x80EF, 0x80EF, 0x0975,
- 0x80F0, 0x80F0, 0x104F, 0x80F1, 0x80F1, 0x1987, 0x80F2, 0x80F2, 0x198C,
- 0x80F3, 0x80F3, 0x06E7, 0x80F4, 0x80F4, 0x1988, 0x80F5, 0x80F5, 0x44CD,
- 0x80F6, 0x80F6, 0x088B, 0x80F7, 0x80F7, 0x44CE, 0x80F8, 0x80F8, 0x0FA3,
- 0x80F9, 0x80F9, 0x44CF, 0x80FA, 0x80FA, 0x03C2, 0x80FB, 0x80FB, 0x44D0,
- 0x80FC, 0x80FC, 0x198D, 0x80FD, 0x80FD, 0x0B3F, 0x80FE, 0x80FF, 0x44D1,
- 0x8100, 0x8101, 0x44D3, 0x8102, 0x8102, 0x11AB, 0x8103, 0x8104, 0x44D5,
- 0x8105, 0x8105, 0x21D2, 0x8106, 0x8106, 0x0563, 0x8107, 0x8108, 0x44D7,
- 0x8109, 0x8109, 0x0A9D, 0x810A, 0x810A, 0x082C, 0x810B, 0x810C, 0x44D9,
- 0x810D, 0x810E, 0x198A, 0x810F, 0x810F, 0x1123, 0x8110, 0x8110, 0x0C09,
- 0x8111, 0x8111, 0x0B37, 0x8112, 0x8112, 0x198F, 0x8113, 0x8113, 0x0B68,
- 0x8114, 0x8114, 0x1309, 0x8115, 0x8115, 0x44DB, 0x8116, 0x8116, 0x0478,
- 0x8117, 0x8117, 0x44DC, 0x8118, 0x8118, 0x1994, 0x8119, 0x8119, 0x44DD,
- 0x811A, 0x811A, 0x0896, 0x811B, 0x811B, 0x24C7, 0x811C, 0x811D, 0x44DE,
- 0x811E, 0x811E, 0x1992, 0x811F, 0x812B, 0x44E0, 0x812C, 0x812C, 0x1993,
- 0x812D, 0x812E, 0x44ED, 0x812F, 0x812F, 0x06A7, 0x8130, 0x8130, 0x44EF,
- 0x8131, 0x8131, 0x0E82, 0x8132, 0x8132, 0x1995, 0x8133, 0x8135, 0x44F0,
- 0x8136, 0x8136, 0x1991, 0x8137, 0x8137, 0x44F3, 0x8138, 0x8138, 0x09FC,
- 0x8139, 0x8139, 0x2279, 0x813A, 0x813D, 0x44F4, 0x813E, 0x813E, 0x0BC1,
- 0x813F, 0x8145, 0x44F8, 0x8146, 0x8146, 0x0E46, 0x8147, 0x8147, 0x44FF,
- 0x8148, 0x8148, 0x1996, 0x8149, 0x8149, 0x4500, 0x814A, 0x814A, 0x099B,
- 0x814B, 0x814B, 0x103F, 0x814C, 0x814C, 0x1997, 0x814D, 0x814D, 0x4501,
- 0x814E, 0x814E, 0x2123, 0x814F, 0x814F, 0x4502, 0x8150, 0x8150, 0x06AA,
- 0x8151, 0x8151, 0x06A8, 0x8152, 0x8152, 0x4503, 0x8153, 0x8153, 0x1998,
- 0x8154, 0x8154, 0x0C38, 0x8155, 0x8155, 0x0EA4, 0x8156, 0x8156, 0x24C5,
- 0x8157, 0x8158, 0x4504, 0x8159, 0x815A, 0x199A, 0x815B, 0x815F, 0x4506,
- 0x8160, 0x8160, 0x199D, 0x8161, 0x8161, 0x24C9, 0x8162, 0x8164, 0x450B,
- 0x8165, 0x8165, 0x0F93, 0x8166, 0x8166, 0x2094, 0x8167, 0x8167, 0x19A2,
- 0x8168, 0x8168, 0x450E, 0x8169, 0x8169, 0x199E, 0x816A, 0x816A, 0x450F,
- 0x816B, 0x816B, 0x2296, 0x816C, 0x816C, 0x4510, 0x816D, 0x816D, 0x19A1,
- 0x816E, 0x816E, 0x0CD4, 0x816F, 0x816F, 0x4511, 0x8170, 0x8170, 0x1025,
- 0x8171, 0x8171, 0x199C, 0x8172, 0x8173, 0x4512, 0x8174, 0x8174, 0x1999,
- 0x8175, 0x8177, 0x4514, 0x8178, 0x8178, 0x1E77, 0x8179, 0x8179, 0x06B4,
- 0x817A, 0x817A, 0x0F46, 0x817B, 0x817B, 0x0B48, 0x817C, 0x817D, 0x199F,
- 0x817E, 0x817E, 0x0E2D, 0x817F, 0x817F, 0x0E79, 0x8180, 0x8180, 0x03FD,
- 0x8181, 0x8181, 0x4517, 0x8182, 0x8182, 0x19A6, 0x8183, 0x8187, 0x4518,
- 0x8188, 0x8188, 0x19A5, 0x8189, 0x8189, 0x451D, 0x818A, 0x818A, 0x0479,
- 0x818B, 0x818E, 0x451E, 0x818F, 0x818F, 0x06DB, 0x8190, 0x8190, 0x4522,
- 0x8191, 0x8191, 0x19A7, 0x8192, 0x8197, 0x4523, 0x8198, 0x8198, 0x0455,
- 0x8199, 0x8199, 0x4529, 0x819A, 0x819A, 0x1F06, 0x819B, 0x819B, 0x0E18,
- 0x819C, 0x819C, 0x0B07, 0x819D, 0x819D, 0x0F12, 0x819E, 0x819F, 0x452A,
- 0x81A0, 0x81A0, 0x1FA5, 0x81A1, 0x81A2, 0x452C, 0x81A3, 0x81A3, 0x19A9,
- 0x81A4, 0x81A5, 0x452E, 0x81A6, 0x81A6, 0x19B0, 0x81A7, 0x81A7, 0x4530,
- 0x81A8, 0x81A8, 0x0BB3, 0x81A9, 0x81A9, 0x2099, 0x81AA, 0x81AA, 0x19AA,
- 0x81AB, 0x81B2, 0x4531, 0x81B3, 0x81B3, 0x0CFE, 0x81B4, 0x81B9, 0x4539,
- 0x81BA, 0x81BA, 0x1641, 0x81BB, 0x81BB, 0x19AE, 0x81BC, 0x81BC, 0x453F,
- 0x81BD, 0x81BD, 0x1EAD, 0x81BE, 0x81BE, 0x24C8, 0x81BF, 0x81BF, 0x20A8,
- 0x81C0, 0x81C0, 0x0E7F, 0x81C1, 0x81C1, 0x19AF, 0x81C2, 0x81C2, 0x0444,
- 0x81C3, 0x81C3, 0x109C, 0x81C4, 0x81C5, 0x4540, 0x81C6, 0x81C6, 0x1063,
- 0x81C7, 0x81C8, 0x4542, 0x81C9, 0x81C9, 0x201F, 0x81CA, 0x81CA, 0x19AD,
- 0x81CB, 0x81CB, 0x4544, 0x81CC, 0x81CC, 0x19AB, 0x81CD, 0x81CD, 0x20C5,
- 0x81CE, 0x81CE, 0x4545, 0x81CF, 0x81CF, 0x24CA, 0x81D0, 0x81D7, 0x4546,
- 0x81D8, 0x81D8, 0x1FF0, 0x81D9, 0x81D9, 0x454E, 0x81DA, 0x81DA, 0x24C6,
- 0x81DB, 0x81DE, 0x454F, 0x81DF, 0x81DF, 0x225D, 0x81E0, 0x81E0, 0x22DE,
- 0x81E1, 0x81E2, 0x4553, 0x81E3, 0x81E3, 0x04E1, 0x81E4, 0x81E6, 0x4555,
- 0x81E7, 0x81E7, 0x1902, 0x81E8, 0x81E8, 0x202C, 0x81E9, 0x81E9, 0x4558,
- 0x81EA, 0x81EA, 0x1231, 0x81EB, 0x81EB, 0x4559, 0x81EC, 0x81EC, 0x1CA9,
- 0x81ED, 0x81ED, 0x0519, 0x81EE, 0x81F2, 0x455A, 0x81F3, 0x81F4, 0x11C0,
- 0x81F5, 0x81F9, 0x455F, 0x81FA, 0x81FA, 0x2161, 0x81FB, 0x81FB, 0x118A,
- 0x81FC, 0x81FC, 0x08F9, 0x81FD, 0x81FD, 0x4564, 0x81FE, 0x81FE, 0x1CA5,
- 0x81FF, 0x81FF, 0x4565, 0x8200, 0x8200, 0x102F, 0x8201, 0x8202, 0x1CA6,
- 0x8203, 0x8203, 0x4566, 0x8204, 0x8204, 0x1CA8, 0x8205, 0x8205, 0x08FA,
- 0x8206, 0x8206, 0x10C4, 0x8207, 0x8207, 0x223B, 0x8208, 0x8208, 0x21D9,
- 0x8209, 0x8209, 0x1FCB, 0x820A, 0x820A, 0x1FC9, 0x820B, 0x820B, 0x4567,
- 0x820C, 0x820D, 0x0D19, 0x820E, 0x820F, 0x4568, 0x8210, 0x8210, 0x1C62,
- 0x8211, 0x8211, 0x456A, 0x8212, 0x8212, 0x0D7D, 0x8213, 0x8213, 0x456B,
- 0x8214, 0x8214, 0x0E45, 0x8215, 0x821A, 0x456C, 0x821B, 0x821B, 0x1618,
- 0x821C, 0x821C, 0x0DA9, 0x821D, 0x821D, 0x4572, 0x821E, 0x821E, 0x0EF7,
- 0x821F, 0x821F, 0x11DA, 0x8220, 0x8220, 0x4573, 0x8221, 0x8223, 0x1CAB,
- 0x8224, 0x8227, 0x4574, 0x8228, 0x8228, 0x1CB0, 0x8229, 0x8229, 0x4578,
- 0x822A, 0x822A, 0x0774, 0x822B, 0x822B, 0x1CB1, 0x822C, 0x822C, 0x03EE,
- 0x822D, 0x822D, 0x1CAE, 0x822E, 0x822E, 0x4579, 0x822F, 0x822F, 0x1CAF,
- 0x8230, 0x8230, 0x0873, 0x8231, 0x8231, 0x049C, 0x8232, 0x8232, 0x457A,
- 0x8233, 0x8234, 0x1CB4, 0x8235, 0x8235, 0x0625, 0x8236, 0x8236, 0x0477,
- 0x8237, 0x8237, 0x0F3C, 0x8238, 0x8238, 0x1CB2, 0x8239, 0x8239, 0x052F,
- 0x823A, 0x823A, 0x457B, 0x823B, 0x823B, 0x1CB3, 0x823C, 0x823D, 0x457C,
- 0x823E, 0x823E, 0x1CB6, 0x823F, 0x8243, 0x457E, 0x8244, 0x8244, 0x1CB7,
- 0x8245, 0x8246, 0x4583, 0x8247, 0x8247, 0x0E58, 0x8248, 0x8248, 0x4585,
- 0x8249, 0x8249, 0x1CB8, 0x824A, 0x824A, 0x4586, 0x824B, 0x824B, 0x1CB9,
- 0x824C, 0x824E, 0x4587, 0x824F, 0x824F, 0x1CBA, 0x8250, 0x8257, 0x458A,
- 0x8258, 0x8258, 0x0DC7, 0x8259, 0x8259, 0x1E61, 0x825A, 0x825A, 0x1CBB,
- 0x825B, 0x825E, 0x4592, 0x825F, 0x825F, 0x1CBC, 0x8260, 0x8263, 0x4596,
- 0x8264, 0x8264, 0x25EF, 0x8265, 0x8265, 0x459A, 0x8266, 0x8266, 0x1F98,
- 0x8267, 0x8267, 0x459B, 0x8268, 0x8268, 0x1CBD, 0x8269, 0x826A, 0x459C,
- 0x826B, 0x826B, 0x25F0, 0x826C, 0x826D, 0x459E, 0x826E, 0x826E, 0x1CDC,
- 0x826F, 0x826F, 0x0A05, 0x8270, 0x8270, 0x085B, 0x8271, 0x8271, 0x1F88,
- 0x8272, 0x8272, 0x0CE4, 0x8273, 0x8273, 0x1007, 0x8274, 0x8274, 0x1771,
- 0x8275, 0x8276, 0x45A0, 0x8277, 0x8277, 0x21F8, 0x8278, 0x8278, 0x45A2,
- 0x8279, 0x8279, 0x13E1, 0x827A, 0x827A, 0x105C, 0x827B, 0x827C, 0x45A3,
- 0x827D, 0x827D, 0x13E2, 0x827E, 0x827E, 0x03B7, 0x827F, 0x827F, 0x13E3,
- 0x8280, 0x8281, 0x45A5, 0x8282, 0x8282, 0x08AB, 0x8283, 0x8283, 0x45A7,
- 0x8284, 0x8284, 0x13E7, 0x8285, 0x8287, 0x45A8, 0x8288, 0x8288, 0x1278,
- 0x8289, 0x8289, 0x45AB, 0x828A, 0x828A, 0x13E5, 0x828B, 0x828B, 0x10D8,
- 0x828C, 0x828C, 0x45AC, 0x828D, 0x828D, 0x0D0F, 0x828E, 0x828E, 0x13E8,
- 0x828F, 0x828F, 0x13E4, 0x8290, 0x8290, 0x45AD, 0x8291, 0x8291, 0x13E9,
- 0x8292, 0x8292, 0x0AA7, 0x8293, 0x8296, 0x45AE, 0x8297, 0x8297, 0x13EA,
- 0x8298, 0x8298, 0x13F3, 0x8299, 0x8299, 0x13EB, 0x829A, 0x829B, 0x45B2,
- 0x829C, 0x829C, 0x0EEE, 0x829D, 0x829D, 0x11A4, 0x829E, 0x829E, 0x45B4,
- 0x829F, 0x829F, 0x13FD, 0x82A0, 0x82A0, 0x45B5, 0x82A1, 0x82A1, 0x13FB,
- 0x82A2, 0x82A3, 0x45B6, 0x82A4, 0x82A4, 0x1400, 0x82A5, 0x82A5, 0x08B7,
- 0x82A6, 0x82A6, 0x0A52, 0x82A7, 0x82A7, 0x45B8, 0x82A8, 0x82A8, 0x13E6,
- 0x82A9, 0x82A9, 0x13F9, 0x82AA, 0x82AA, 0x13FC, 0x82AB, 0x82AB, 0x13EC,
- 0x82AC, 0x82AC, 0x066F, 0x82AD, 0x82AD, 0x03D0, 0x82AE, 0x82AE, 0x13F5,
- 0x82AF, 0x82AF, 0x0F89, 0x82B0, 0x82B0, 0x13EF, 0x82B1, 0x82B1, 0x07BD,
- 0x82B2, 0x82B2, 0x45B9, 0x82B3, 0x82B3, 0x0659, 0x82B4, 0x82B4, 0x13FA,
- 0x82B5, 0x82B6, 0x45BA, 0x82B7, 0x82B7, 0x13F4, 0x82B8, 0x82B8, 0x13ED,
- 0x82B9, 0x82B9, 0x0C58, 0x82BA, 0x82BA, 0x45BC, 0x82BB, 0x82BB, 0x2322,
- 0x82BC, 0x82BC, 0x45BD, 0x82BD, 0x82BD, 0x0FE8, 0x82BE, 0x82BE, 0x13EE,
- 0x82BF, 0x82C0, 0x45BE, 0x82C1, 0x82C1, 0x13F8, 0x82C2, 0x82C3, 0x45C0,
- 0x82C4, 0x82C4, 0x13FE, 0x82C5, 0x82C6, 0x45C2, 0x82C7, 0x82C7, 0x0EBC,
- 0x82C8, 0x82C8, 0x13F0, 0x82C9, 0x82C9, 0x45C4, 0x82CA, 0x82CA, 0x13F1,
- 0x82CB, 0x82CC, 0x13F6, 0x82CD, 0x82CD, 0x049B, 0x82CE, 0x82CE, 0x13FF,
- 0x82CF, 0x82CF, 0x0DCA, 0x82D0, 0x82D0, 0x45C5, 0x82D1, 0x82D1, 0x10FA,
- 0x82D2, 0x82D2, 0x1409, 0x82D3, 0x82D3, 0x140D, 0x82D4, 0x82D4, 0x0DF9,
- 0x82D5, 0x82D5, 0x1414, 0x82D6, 0x82D6, 0x45C6, 0x82D7, 0x82D7, 0x0AEC,
- 0x82D8, 0x82D8, 0x140A, 0x82D9, 0x82DA, 0x45C7, 0x82DB, 0x82DB, 0x094E,
- 0x82DC, 0x82DC, 0x1407, 0x82DD, 0x82DD, 0x45C9, 0x82DE, 0x82DE, 0x0405,
- 0x82DF, 0x82DF, 0x070F, 0x82E0, 0x82E0, 0x1413, 0x82E1, 0x82E1, 0x1401,
- 0x82E2, 0x82E2, 0x45CA, 0x82E3, 0x82E3, 0x13F2, 0x82E4, 0x82E4, 0x1404,
- 0x82E5, 0x82E5, 0x0CCF, 0x82E6, 0x82E6, 0x096D, 0x82E7, 0x82E7, 0x2336,
- 0x82E8, 0x82EA, 0x45CB, 0x82EB, 0x82EB, 0x0CF4, 0x82EC, 0x82EE, 0x45CE,
- 0x82EF, 0x82EF, 0x0426, 0x82F0, 0x82F0, 0x45D1, 0x82F1, 0x82F1, 0x1087,
- 0x82F2, 0x82F3, 0x45D2, 0x82F4, 0x82F4, 0x1408, 0x82F5, 0x82F6, 0x45D4,
- 0x82F7, 0x82F7, 0x1403, 0x82F8, 0x82F8, 0x45D6, 0x82F9, 0x82F9, 0x0BDA,
- 0x82FA, 0x82FA, 0x45D7, 0x82FB, 0x82FB, 0x140C, 0x82FC, 0x82FF, 0x45D8,
- 0x8300, 0x8300, 0x45DC, 0x8301, 0x8301, 0x121F, 0x8302, 0x8302, 0x0AB4,
- 0x8303, 0x8303, 0x0653, 0x8304, 0x8304, 0x0C4E, 0x8305, 0x8305, 0x0AAE,
- 0x8306, 0x8306, 0x1410, 0x8307, 0x8307, 0x1406, 0x8308, 0x8308, 0x1419,
- 0x8309, 0x8309, 0x1402, 0x830A, 0x830B, 0x45DD, 0x830C, 0x830C, 0x140B,
- 0x830D, 0x830D, 0x45DF, 0x830E, 0x830E, 0x08D4, 0x830F, 0x830F, 0x1405,
- 0x8310, 0x8310, 0x45E0, 0x8311, 0x8311, 0x140E, 0x8312, 0x8313, 0x45E1,
- 0x8314, 0x8315, 0x1411, 0x8316, 0x8316, 0x45E3, 0x8317, 0x8317, 0x1426,
- 0x8318, 0x8319, 0x45E4, 0x831A, 0x831A, 0x140F, 0x831B, 0x831B, 0x142E,
- 0x831C, 0x831C, 0x1415, 0x831D, 0x8326, 0x45E6, 0x8327, 0x8327, 0x085E,
- 0x8328, 0x8328, 0x0547, 0x8329, 0x832A, 0x45F0, 0x832B, 0x832B, 0x0AA8,
- 0x832C, 0x832C, 0x04AE, 0x832D, 0x832D, 0x1428, 0x832E, 0x832E, 0x45F2,
- 0x832F, 0x832F, 0x1420, 0x8330, 0x8330, 0x45F3, 0x8331, 0x8331, 0x141D,
- 0x8332, 0x8332, 0x45F4, 0x8333, 0x8333, 0x142A, 0x8334, 0x8334, 0x141C,
- 0x8335, 0x8335, 0x1077, 0x8336, 0x8336, 0x04AF, 0x8337, 0x8337, 0x45F5,
- 0x8338, 0x8338, 0x0CB2, 0x8339, 0x8339, 0x0CBE, 0x833A, 0x833A, 0x1429,
- 0x833B, 0x833B, 0x45F6, 0x833C, 0x833C, 0x141B, 0x833D, 0x833F, 0x45F7,
- 0x8340, 0x8340, 0x1425, 0x8341, 0x8342, 0x45FA, 0x8343, 0x8343, 0x1423,
- 0x8344, 0x8345, 0x45FC, 0x8346, 0x8346, 0x08D2, 0x8347, 0x8347, 0x1422,
- 0x8348, 0x8348, 0x45FE, 0x8349, 0x8349, 0x04A4, 0x834A, 0x834E, 0x45FF,
- 0x834F, 0x834F, 0x1421, 0x8350, 0x8350, 0x0869, 0x8351, 0x8351, 0x1416,
- 0x8352, 0x8352, 0x07D9, 0x8353, 0x8353, 0x4604, 0x8354, 0x8354, 0x09DE,
- 0x8355, 0x8359, 0x4605, 0x835A, 0x835A, 0x0847, 0x835B, 0x835C, 0x1417,
- 0x835D, 0x835D, 0x460A, 0x835E, 0x835E, 0x141F, 0x835F, 0x835F, 0x1424,
- 0x8360, 0x8360, 0x1427, 0x8361, 0x8361, 0x0595, 0x8362, 0x8362, 0x460B,
- 0x8363, 0x8363, 0x0CB4, 0x8364, 0x8364, 0x07FC, 0x8365, 0x8365, 0x142C,
- 0x8366, 0x8366, 0x142B, 0x8367, 0x8367, 0x1090, 0x8368, 0x8368, 0x142D,
- 0x8369, 0x8369, 0x142F, 0x836A, 0x836A, 0x1431, 0x836B, 0x836B, 0x1078,
- 0x836C, 0x836C, 0x1430, 0x836D, 0x836E, 0x1432, 0x836F, 0x836F, 0x1030,
- 0x8370, 0x8376, 0x460C, 0x8377, 0x8377, 0x0780, 0x8378, 0x8378, 0x1435,
- 0x8379, 0x837A, 0x4613, 0x837B, 0x837B, 0x1442, 0x837C, 0x837C, 0x143D,
- 0x837D, 0x837D, 0x1440, 0x837E, 0x8384, 0x4615, 0x8385, 0x8385, 0x143C,
- 0x8386, 0x8386, 0x0BED, 0x8387, 0x8388, 0x461C, 0x8389, 0x8389, 0x09DD,
- 0x838A, 0x838A, 0x22AB, 0x838B, 0x838D, 0x461E, 0x838E, 0x838E, 0x0CE8,
- 0x838F, 0x8391, 0x4621, 0x8392, 0x8392, 0x141A, 0x8393, 0x8393, 0x143A,
- 0x8394, 0x8395, 0x4624, 0x8396, 0x8396, 0x1FBF, 0x8397, 0x8397, 0x4626,
- 0x8398, 0x8398, 0x1443, 0x8399, 0x839A, 0x4627, 0x839B, 0x839B, 0x141E,
- 0x839C, 0x839C, 0x143B, 0x839D, 0x839D, 0x4629, 0x839E, 0x839E, 0x1444,
- 0x839F, 0x839F, 0x462A, 0x83A0, 0x83A0, 0x1438, 0x83A1, 0x83A1, 0x462B,
- 0x83A2, 0x83A2, 0x1F7D, 0x83A3, 0x83A6, 0x462C, 0x83A7, 0x83A7, 0x2333,
- 0x83A8, 0x83A8, 0x1445, 0x83A9, 0x83A9, 0x143F, 0x83AA, 0x83AA, 0x1439,
- 0x83AB, 0x83AB, 0x0B0D, 0x83AC, 0x83AF, 0x4630, 0x83B0, 0x83B0, 0x1434,
- 0x83B1, 0x83B1, 0x099E, 0x83B2, 0x83B2, 0x09F4, 0x83B3, 0x83B4, 0x1436,
- 0x83B5, 0x83B5, 0x4634, 0x83B6, 0x83B6, 0x143E, 0x83B7, 0x83B7, 0x0806,
- 0x83B8, 0x83B8, 0x1441, 0x83B9, 0x83B9, 0x108D, 0x83BA, 0x83BA, 0x1446,
- 0x83BB, 0x83BB, 0x4635, 0x83BC, 0x83BC, 0x1447, 0x83BD, 0x83BD, 0x0AAC,
- 0x83BE, 0x83BF, 0x4636, 0x83C0, 0x83C0, 0x145E, 0x83C1, 0x83C1, 0x1448,
- 0x83C2, 0x83C4, 0x4638, 0x83C5, 0x83C5, 0x145D, 0x83C6, 0x83C6, 0x463B,
- 0x83C7, 0x83C7, 0x0716, 0x83C8, 0x83C9, 0x463C, 0x83CA, 0x83CA, 0x0904,
- 0x83CB, 0x83CB, 0x463E, 0x83CC, 0x83CC, 0x0929, 0x83CD, 0x83CE, 0x463F,
- 0x83CF, 0x83CF, 0x0781, 0x83D0, 0x83D3, 0x4641, 0x83D4, 0x83D4, 0x1456,
- 0x83D5, 0x83D5, 0x4645, 0x83D6, 0x83D6, 0x1451, 0x83D7, 0x83D7, 0x4646,
- 0x83D8, 0x83D8, 0x144B, 0x83D9, 0x83DB, 0x4647, 0x83DC, 0x83DC, 0x0492,
- 0x83DD, 0x83DD, 0x144F, 0x83DE, 0x83DE, 0x464A, 0x83DF, 0x83DF, 0x1457,
- 0x83E0, 0x83E0, 0x046B, 0x83E1, 0x83E1, 0x1461, 0x83E2, 0x83E4, 0x464B,
- 0x83E5, 0x83E5, 0x144A, 0x83E6, 0x83E8, 0x464E, 0x83E9, 0x83E9, 0x0BEF,
- 0x83EA, 0x83EA, 0x145C, 0x83EB, 0x83EE, 0x4651, 0x83EF, 0x83EF, 0x1F4D,
- 0x83F0, 0x83F0, 0x1460, 0x83F1, 0x83F1, 0x0A2B, 0x83F2, 0x83F2, 0x0663,
- 0x83F3, 0x83F7, 0x4655, 0x83F8, 0x83F9, 0x145A, 0x83FA, 0x83FC, 0x465A,
- 0x83FD, 0x83FD, 0x1450, 0x83FE, 0x83FF, 0x465D, 0x8400, 0x8400, 0x465F,
- 0x8401, 0x8401, 0x1449, 0x8402, 0x8402, 0x4660, 0x8403, 0x8403, 0x1459,
- 0x8404, 0x8404, 0x0E24, 0x8405, 0x8405, 0x4661, 0x8406, 0x8406, 0x1455,
- 0x8407, 0x8407, 0x2334, 0x8408, 0x8409, 0x4662, 0x840A, 0x840A, 0x1FF1,
- 0x840B, 0x840B, 0x144E, 0x840C, 0x840C, 0x0ACD, 0x840D, 0x840D, 0x0BDB,
- 0x840E, 0x840E, 0x0EBD, 0x840F, 0x840F, 0x1458, 0x8410, 0x8410, 0x4664,
- 0x8411, 0x8411, 0x1454, 0x8412, 0x8417, 0x4665, 0x8418, 0x8418, 0x144D,
- 0x8419, 0x841B, 0x466B, 0x841C, 0x841C, 0x1452, 0x841D, 0x841D, 0x0A83,
- 0x841E, 0x8423, 0x466E, 0x8424, 0x8425, 0x108E, 0x8426, 0x8426, 0x145F,
- 0x8427, 0x8427, 0x0F61, 0x8428, 0x8428, 0x0CD3, 0x8429, 0x842B, 0x4674,
- 0x842C, 0x842C, 0x218B, 0x842D, 0x8430, 0x4677, 0x8431, 0x8431, 0x1472,
- 0x8432, 0x8434, 0x467B, 0x8435, 0x8435, 0x2349, 0x8436, 0x8437, 0x467E,
- 0x8438, 0x8438, 0x1453, 0x8439, 0x843B, 0x4680, 0x843C, 0x843C, 0x146C,
- 0x843D, 0x843D, 0x0A8B, 0x843E, 0x8445, 0x4683, 0x8446, 0x8446, 0x146D,
- 0x8447, 0x8448, 0x468B, 0x8449, 0x8449, 0x220B, 0x844A, 0x8450, 0x468D,
- 0x8451, 0x8451, 0x1463, 0x8452, 0x8452, 0x2346, 0x8453, 0x8456, 0x4694,
- 0x8457, 0x8457, 0x11F7, 0x8458, 0x8458, 0x4698, 0x8459, 0x8459, 0x1465,
- 0x845A, 0x845A, 0x1464, 0x845B, 0x845B, 0x06EB, 0x845C, 0x845C, 0x1462,
- 0x845D, 0x8460, 0x4699, 0x8461, 0x8461, 0x0BEE, 0x8462, 0x8462, 0x469D,
- 0x8463, 0x8463, 0x05EC, 0x8464, 0x8464, 0x2347, 0x8465, 0x8465, 0x469E,
- 0x8466, 0x8466, 0x2193, 0x8467, 0x8468, 0x469F, 0x8469, 0x8469, 0x146E,
- 0x846A, 0x846A, 0x46A1, 0x846B, 0x846B, 0x07B0, 0x846C, 0x846C, 0x1124,
- 0x846D, 0x846D, 0x1473, 0x846E, 0x846E, 0x46A2, 0x846F, 0x846F, 0x26A1,
- 0x8470, 0x8470, 0x46A3, 0x8471, 0x8471, 0x0553, 0x8472, 0x8472, 0x46A4,
- 0x8473, 0x8473, 0x1466, 0x8474, 0x8474, 0x46A5, 0x8475, 0x8475, 0x0988,
- 0x8476, 0x8476, 0x146F, 0x8477, 0x8477, 0x1F62, 0x8478, 0x8478, 0x146B,
- 0x8479, 0x8479, 0x46A6, 0x847A, 0x847A, 0x1469, 0x847B, 0x8481, 0x46A7,
- 0x8482, 0x8482, 0x05BA, 0x8483, 0x8486, 0x46AE, 0x8487, 0x8488, 0x1467,
- 0x8489, 0x8489, 0x146A, 0x848A, 0x848A, 0x46B2, 0x848B, 0x848B, 0x0880,
- 0x848C, 0x848C, 0x1470, 0x848D, 0x848D, 0x46B3, 0x848E, 0x848E, 0x1471,
- 0x848F, 0x8492, 0x46B4, 0x8493, 0x8493, 0x234D, 0x8494, 0x8494, 0x2348,
- 0x8495, 0x8496, 0x46B8, 0x8497, 0x8497, 0x1481, 0x8498, 0x8498, 0x46BA,
- 0x8499, 0x8499, 0x0ACE, 0x849A, 0x849B, 0x46BB, 0x849C, 0x849C, 0x0DD7,
- 0x849D, 0x84A0, 0x46BD, 0x84A1, 0x84A1, 0x147E, 0x84A2, 0x84AE, 0x46C1,
- 0x84AF, 0x84AF, 0x1297, 0x84B0, 0x84B1, 0x46CE, 0x84B2, 0x84B2, 0x0BF0,
- 0x84B3, 0x84B3, 0x46D0, 0x84B4, 0x84B4, 0x1480, 0x84B5, 0x84B7, 0x46D1,
- 0x84B8, 0x84B8, 0x1195, 0x84B9, 0x84B9, 0x147F, 0x84BA, 0x84BA, 0x147C,
- 0x84BB, 0x84BB, 0x46D4, 0x84BC, 0x84BC, 0x1E60, 0x84BD, 0x84BD, 0x1478,
- 0x84BE, 0x84BE, 0x46D5, 0x84BF, 0x84BF, 0x147B, 0x84C0, 0x84C0, 0x2345,
- 0x84C1, 0x84C1, 0x1474, 0x84C2, 0x84C3, 0x46D6, 0x84C4, 0x84C4, 0x0FB9,
- 0x84C5, 0x84C8, 0x46D8, 0x84C9, 0x84C9, 0x0CB3, 0x84CA, 0x84CA, 0x147A,
- 0x84CB, 0x84CB, 0x1F12, 0x84CC, 0x84CC, 0x46DC, 0x84CD, 0x84CD, 0x1475,
- 0x84CE, 0x84CF, 0x46DD, 0x84D0, 0x84D0, 0x1476, 0x84D1, 0x84D1, 0x0DE7,
- 0x84D2, 0x84D2, 0x46DF, 0x84D3, 0x84D3, 0x1479, 0x84D4, 0x84D5, 0x46E0,
- 0x84D6, 0x84D6, 0x0436, 0x84D7, 0x84DC, 0x46E2, 0x84DD, 0x84DD, 0x09A1,
- 0x84DE, 0x84DE, 0x46E8, 0x84DF, 0x84DF, 0x082E, 0x84E0, 0x84E0, 0x147D,
- 0x84E1, 0x84E2, 0x46E9, 0x84E3, 0x84E3, 0x1483, 0x84E4, 0x84E4, 0x46EB,
- 0x84E5, 0x84E5, 0x1482, 0x84E6, 0x84E6, 0x1477, 0x84E7, 0x84EB, 0x46EC,
- 0x84EC, 0x84EC, 0x0BAF, 0x84ED, 0x84ED, 0x46F1, 0x84EE, 0x84EE, 0x2018,
- 0x84EF, 0x84EF, 0x2335, 0x84F0, 0x84F0, 0x1487, 0x84F1, 0x84FB, 0x46F2,
- 0x84FC, 0x84FC, 0x148E, 0x84FD, 0x84FD, 0x233C, 0x84FE, 0x84FE, 0x46FD,
- 0x84FF, 0x84FF, 0x148D, 0x8500, 0x850B, 0x46FE, 0x850C, 0x850C, 0x1484,
- 0x850D, 0x8510, 0x470A, 0x8511, 0x8511, 0x0AF4, 0x8512, 0x8512, 0x470E,
- 0x8513, 0x8513, 0x0AA2, 0x8514, 0x8514, 0x266F, 0x8515, 0x8516, 0x470F,
- 0x8517, 0x8517, 0x1182, 0x8518, 0x8519, 0x4711, 0x851A, 0x851A, 0x0EC4,
- 0x851B, 0x851D, 0x4713, 0x851E, 0x851E, 0x2351, 0x851F, 0x851F, 0x1489,
- 0x8520, 0x8520, 0x4716, 0x8521, 0x8521, 0x0493, 0x8522, 0x8522, 0x4717,
- 0x8523, 0x8523, 0x1FA0, 0x8524, 0x8525, 0x4718, 0x8526, 0x8526, 0x2338,
- 0x8527, 0x852A, 0x471A, 0x852B, 0x852B, 0x0B4B, 0x852C, 0x852C, 0x0D76,
- 0x852D, 0x852D, 0x221B, 0x852E, 0x8536, 0x471E, 0x8537, 0x8537, 0x0C3B,
- 0x8538, 0x8538, 0x1486, 0x8539, 0x8539, 0x1488, 0x853A, 0x853A, 0x148A,
- 0x853B, 0x853B, 0x148C, 0x853C, 0x853C, 0x03B5, 0x853D, 0x853D, 0x0437,
- 0x853E, 0x8540, 0x4727, 0x8541, 0x8541, 0x2342, 0x8542, 0x8542, 0x472A,
- 0x8543, 0x8543, 0x1496, 0x8544, 0x8545, 0x472B, 0x8546, 0x8546, 0x234F,
- 0x8547, 0x8547, 0x472D, 0x8548, 0x8548, 0x1490, 0x8549, 0x8549, 0x0887,
- 0x854A, 0x854A, 0x0CCA, 0x854B, 0x854D, 0x472E, 0x854E, 0x854E, 0x233D,
- 0x854F, 0x8551, 0x4731, 0x8552, 0x8552, 0x2344, 0x8553, 0x8553, 0x2331,
- 0x8554, 0x8554, 0x4734, 0x8555, 0x8555, 0x234B, 0x8556, 0x8556, 0x148B,
- 0x8557, 0x8557, 0x4735, 0x8558, 0x8558, 0x233B, 0x8559, 0x8559, 0x148F,
- 0x855A, 0x855D, 0x4736, 0x855E, 0x855E, 0x1493, 0x855F, 0x8561, 0x473A,
- 0x8562, 0x8562, 0x2350, 0x8563, 0x8563, 0x473D, 0x8564, 0x8564, 0x1492,
- 0x8565, 0x8567, 0x473E, 0x8568, 0x8568, 0x1491, 0x8569, 0x8569, 0x1EB4,
- 0x856A, 0x856A, 0x21A6, 0x856B, 0x856C, 0x4741, 0x856D, 0x856D, 0x21CB,
- 0x856E, 0x8571, 0x4743, 0x8572, 0x8572, 0x1497, 0x8573, 0x8573, 0x4747,
- 0x8574, 0x8574, 0x110F, 0x8575, 0x8576, 0x4748, 0x8577, 0x8577, 0x2355,
- 0x8578, 0x8578, 0x474A, 0x8579, 0x8579, 0x149D, 0x857A, 0x857A, 0x1494,
- 0x857B, 0x857B, 0x1498, 0x857C, 0x857D, 0x474B, 0x857E, 0x857E, 0x09C4,
- 0x857F, 0x8583, 0x474D, 0x8584, 0x8584, 0x040A, 0x8585, 0x8585, 0x14A0,
- 0x8586, 0x8586, 0x4752, 0x8587, 0x8587, 0x149B, 0x8588, 0x8588, 0x233E,
- 0x8589, 0x8589, 0x4753, 0x858A, 0x858A, 0x1F74, 0x858B, 0x858B, 0x4754,
- 0x858C, 0x858C, 0x2330, 0x858D, 0x858E, 0x4755, 0x858F, 0x858F, 0x149C,
- 0x8590, 0x8590, 0x4757, 0x8591, 0x8591, 0x2680, 0x8592, 0x8593, 0x4758,
- 0x8594, 0x8594, 0x20DA, 0x8595, 0x859A, 0x475A, 0x859B, 0x859B, 0x0FCF,
- 0x859C, 0x859C, 0x149F, 0x859D, 0x859E, 0x4760, 0x859F, 0x859F, 0x234A,
- 0x85A0, 0x85A3, 0x4762, 0x85A4, 0x85A4, 0x1499, 0x85A5, 0x85A5, 0x4766,
- 0x85A6, 0x85A6, 0x1F91, 0x85A7, 0x85A7, 0x4767, 0x85A8, 0x85A8, 0x149A,
- 0x85A9, 0x85A9, 0x2107, 0x85AA, 0x85AA, 0x0F88, 0x85AB, 0x85AD, 0x4768,
- 0x85AE, 0x85AE, 0x149E, 0x85AF, 0x85AF, 0x0D84, 0x85B0, 0x85B0, 0x14A3,
- 0x85B1, 0x85B6, 0x476B, 0x85B7, 0x85B7, 0x14A2, 0x85B8, 0x85B8, 0x4771,
- 0x85B9, 0x85B9, 0x14A1, 0x85BA, 0x85BA, 0x233F, 0x85BB, 0x85C0, 0x4772,
- 0x85C1, 0x85C1, 0x14A5, 0x85C2, 0x85C8, 0x4778, 0x85C9, 0x85C9, 0x08B6,
- 0x85CA, 0x85CC, 0x477F, 0x85CD, 0x85CD, 0x1FF4, 0x85CE, 0x85CE, 0x2343,
- 0x85CF, 0x85CF, 0x049F, 0x85D0, 0x85D0, 0x0AEF, 0x85D1, 0x85D2, 0x4782,
- 0x85D3, 0x85D3, 0x14A4, 0x85D4, 0x85D4, 0x4784, 0x85D5, 0x85D5, 0x0B7B,
- 0x85D6, 0x85DB, 0x4785, 0x85DC, 0x85DC, 0x14A6, 0x85DD, 0x85DD, 0x2212,
- 0x85DE, 0x85E3, 0x478B, 0x85E4, 0x85E4, 0x0E2C, 0x85E5, 0x85E5, 0x2207,
- 0x85E6, 0x85E8, 0x4791, 0x85E9, 0x85E9, 0x0647, 0x85EA, 0x85EA, 0x2359,
- 0x85EB, 0x85F3, 0x4794, 0x85F4, 0x85F4, 0x2254, 0x85F5, 0x85F5, 0x479D,
- 0x85F6, 0x85F6, 0x2332, 0x85F7, 0x85F8, 0x479E, 0x85F9, 0x85F9, 0x1E26,
- 0x85FA, 0x85FA, 0x2357, 0x85FB, 0x85FB, 0x1128, 0x85FC, 0x85FE, 0x47A0,
- 0x85FF, 0x85FF, 0x14A7, 0x8600, 0x8603, 0x47A3, 0x8604, 0x8604, 0x2358,
- 0x8605, 0x8605, 0x14A9, 0x8606, 0x8606, 0x2042, 0x8607, 0x8607, 0x2153,
- 0x8608, 0x860A, 0x47A7, 0x860B, 0x860B, 0x20BB, 0x860C, 0x8610, 0x47AA,
- 0x8611, 0x8611, 0x0B05, 0x8612, 0x8615, 0x47AF, 0x8616, 0x8616, 0x14AB,
- 0x8617, 0x8619, 0x47B3, 0x861A, 0x861A, 0x235A, 0x861B, 0x861D, 0x47B6,
- 0x861E, 0x861E, 0x2356, 0x861F, 0x8621, 0x47B9, 0x8622, 0x8622, 0x2337,
- 0x8623, 0x8626, 0x47BC, 0x8627, 0x8627, 0x14A8, 0x8628, 0x8628, 0x47C0,
- 0x8629, 0x8629, 0x14AA, 0x862A, 0x862C, 0x47C1, 0x862D, 0x862D, 0x1FF9,
- 0x862E, 0x8637, 0x47C4, 0x8638, 0x8638, 0x115B, 0x8639, 0x8639, 0x47CE,
- 0x863A, 0x863A, 0x2353, 0x863B, 0x863B, 0x47CF, 0x863C, 0x863C, 0x14AC,
- 0x863D, 0x863E, 0x47D0, 0x863F, 0x863F, 0x2061, 0x8640, 0x864C, 0x47D2,
- 0x864D, 0x864D, 0x1BF0, 0x864E, 0x864E, 0x07B7, 0x864F, 0x864F, 0x0A59,
- 0x8650, 0x8650, 0x0B71, 0x8651, 0x8651, 0x0A6E, 0x8652, 0x8653, 0x47DF,
- 0x8654, 0x8654, 0x1BF1, 0x8655, 0x8655, 0x1E95, 0x8656, 0x8659, 0x47E1,
- 0x865A, 0x865A, 0x0FB4, 0x865B, 0x865B, 0x47E5, 0x865C, 0x865C, 0x2049,
- 0x865D, 0x865D, 0x47E6, 0x865E, 0x865E, 0x10C2, 0x865F, 0x865F, 0x1F42,
- 0x8660, 0x8661, 0x47E7, 0x8662, 0x8662, 0x196D, 0x8663, 0x8666, 0x47E9,
- 0x8667, 0x8667, 0x1FE8, 0x8668, 0x866A, 0x47ED, 0x866B, 0x866B, 0x050B,
- 0x866C, 0x866C, 0x1BF2, 0x866D, 0x866D, 0x47F0, 0x866E, 0x866E, 0x1BF3,
- 0x866F, 0x8670, 0x47F1, 0x8671, 0x8671, 0x0D44, 0x8672, 0x8678, 0x47F3,
- 0x8679, 0x8679, 0x079E, 0x867A, 0x867A, 0x1BF5, 0x867B, 0x867B, 0x1BF7,
- 0x867C, 0x867C, 0x1BF6, 0x867D, 0x867D, 0x0DD9, 0x867E, 0x867E, 0x0F27,
- 0x867F, 0x867F, 0x1BF4, 0x8680, 0x8680, 0x0D4B, 0x8681, 0x8681, 0x1056,
- 0x8682, 0x8682, 0x0A93, 0x8683, 0x8689, 0x47FA, 0x868A, 0x868A, 0x0ED2,
- 0x868B, 0x868B, 0x1BFA, 0x868C, 0x868C, 0x0401, 0x868D, 0x868D, 0x1BF9,
- 0x868E, 0x8692, 0x4801, 0x8693, 0x8693, 0x1C00, 0x8694, 0x8694, 0x4806,
- 0x8695, 0x8695, 0x0496, 0x8696, 0x869B, 0x4807, 0x869C, 0x869C, 0x0FEA,
- 0x869D, 0x869D, 0x1BFC, 0x869E, 0x86A2, 0x480D, 0x86A3, 0x86A3, 0x1BFE,
- 0x86A4, 0x86A4, 0x112C, 0x86A5, 0x86A6, 0x4812, 0x86A7, 0x86A7, 0x1BFD,
- 0x86A8, 0x86A8, 0x1BF8, 0x86A9, 0x86A9, 0x1C01, 0x86AA, 0x86AA, 0x1BFF,
- 0x86AB, 0x86AB, 0x4814, 0x86AC, 0x86AC, 0x1BFB, 0x86AD, 0x86AE, 0x4815,
- 0x86AF, 0x86AF, 0x1C09, 0x86B0, 0x86B0, 0x1C06, 0x86B1, 0x86B1, 0x1C08,
- 0x86B2, 0x86B3, 0x4817, 0x86B4, 0x86B4, 0x1C0C, 0x86B5, 0x86B5, 0x1C04,
- 0x86B6, 0x86B6, 0x1C02, 0x86B7, 0x86B9, 0x4819, 0x86BA, 0x86BA, 0x1C07,
- 0x86BB, 0x86BF, 0x481C, 0x86C0, 0x86C0, 0x11FA, 0x86C1, 0x86C3, 0x4821,
- 0x86C4, 0x86C4, 0x1C03, 0x86C5, 0x86C5, 0x4824, 0x86C6, 0x86C6, 0x0C76,
- 0x86C7, 0x86C7, 0x0D18, 0x86C8, 0x86C8, 0x4825, 0x86C9, 0x86C9, 0x1C0A,
- 0x86CA, 0x86CA, 0x071F, 0x86CB, 0x86CB, 0x0591, 0x86CC, 0x86CD, 0x4826,
- 0x86CE, 0x86CE, 0x1C05, 0x86CF, 0x86CF, 0x1C0B, 0x86D0, 0x86D0, 0x1C12,
- 0x86D1, 0x86D1, 0x1C18, 0x86D2, 0x86D3, 0x4828, 0x86D4, 0x86D4, 0x07EC,
- 0x86D5, 0x86D7, 0x482A, 0x86D8, 0x86D8, 0x1C17, 0x86D9, 0x86D9, 0x0E8D,
- 0x86DA, 0x86DA, 0x482D, 0x86DB, 0x86DB, 0x11EA, 0x86DC, 0x86DD, 0x482E,
- 0x86DE, 0x86DE, 0x1C14, 0x86DF, 0x86DF, 0x1C16, 0x86E0, 0x86E3, 0x4830,
- 0x86E4, 0x86E4, 0x06ED, 0x86E5, 0x86E8, 0x4834, 0x86E9, 0x86E9, 0x1C0D,
- 0x86EA, 0x86EC, 0x4838, 0x86ED, 0x86ED, 0x1C10, 0x86EE, 0x86EE, 0x0AA0,
- 0x86EF, 0x86EF, 0x483B, 0x86F0, 0x86F0, 0x117E, 0x86F1, 0x86F2, 0x1C0E,
- 0x86F3, 0x86F3, 0x1C11, 0x86F4, 0x86F4, 0x1C15, 0x86F5, 0x86F7, 0x483C,
- 0x86F8, 0x86F8, 0x1C1B, 0x86F9, 0x86F9, 0x10A1, 0x86FA, 0x86FA, 0x25DA,
- 0x86FB, 0x86FD, 0x483F, 0x86FE, 0x86FE, 0x0629, 0x86FF, 0x86FF, 0x4842,
- 0x8700, 0x8700, 0x0D88, 0x8701, 0x8701, 0x4843, 0x8702, 0x8702, 0x0681,
- 0x8703, 0x8703, 0x1C19, 0x8704, 0x8705, 0x4844, 0x8706, 0x8706, 0x25D7,
- 0x8707, 0x8707, 0x1C1A, 0x8708, 0x8708, 0x1C1C, 0x8709, 0x8709, 0x1C1F,
- 0x870A, 0x870A, 0x1C1D, 0x870B, 0x870C, 0x4846, 0x870D, 0x870D, 0x1C1E,
- 0x870E, 0x8711, 0x4848, 0x8712, 0x8712, 0x0FFA, 0x8713, 0x8713, 0x1C13,
- 0x8714, 0x8714, 0x484C, 0x8715, 0x8715, 0x0E7A, 0x8716, 0x8716, 0x484D,
- 0x8717, 0x8717, 0x0EDE, 0x8718, 0x8718, 0x11A8, 0x8719, 0x8719, 0x484E,
- 0x871A, 0x871A, 0x1C25, 0x871B, 0x871B, 0x484F, 0x871C, 0x871C, 0x0AE0,
- 0x871D, 0x871D, 0x4850, 0x871E, 0x871E, 0x1C22, 0x871F, 0x8720, 0x4851,
- 0x8721, 0x8721, 0x099A, 0x8722, 0x8722, 0x1C2E, 0x8723, 0x8723, 0x1C20,
- 0x8724, 0x8724, 0x4853, 0x8725, 0x8725, 0x1C23, 0x8726, 0x8728, 0x4854,
- 0x8729, 0x8729, 0x1C2A, 0x872A, 0x872D, 0x4857, 0x872E, 0x872E, 0x1C24,
- 0x872F, 0x8730, 0x485B, 0x8731, 0x8731, 0x1C29, 0x8732, 0x8733, 0x485D,
- 0x8734, 0x8734, 0x1C28, 0x8735, 0x8736, 0x485F, 0x8737, 0x8737, 0x1C2B,
- 0x8738, 0x873A, 0x4861, 0x873B, 0x873B, 0x1C21, 0x873C, 0x873D, 0x4864,
- 0x873E, 0x873E, 0x1C26, 0x873F, 0x873F, 0x1C2C, 0x8740, 0x8746, 0x4866,
- 0x8747, 0x8747, 0x1091, 0x8748, 0x8748, 0x1C27, 0x8749, 0x8749, 0x04BC,
- 0x874A, 0x874B, 0x486D, 0x874C, 0x874C, 0x1C34, 0x874D, 0x874D, 0x486F,
- 0x874E, 0x874E, 0x0F76, 0x874F, 0x8752, 0x4870, 0x8753, 0x8753, 0x1C37,
- 0x8754, 0x8754, 0x4874, 0x8755, 0x8755, 0x212E, 0x8756, 0x8756, 0x4875,
- 0x8757, 0x8757, 0x07DD, 0x8758, 0x8758, 0x4876, 0x8759, 0x8759, 0x1C3B,
- 0x875A, 0x875F, 0x4877, 0x8760, 0x8760, 0x1C32, 0x8761, 0x8762, 0x487D,
- 0x8763, 0x8763, 0x1C38, 0x8764, 0x8764, 0x1C3A, 0x8765, 0x8765, 0x1C3C,
- 0x8766, 0x8766, 0x21B2, 0x8767, 0x876D, 0x487F, 0x876E, 0x876E, 0x1C35,
- 0x876F, 0x876F, 0x4886, 0x8770, 0x8770, 0x1C33, 0x8771, 0x8773, 0x4887,
- 0x8774, 0x8774, 0x07B2, 0x8775, 0x8775, 0x488A, 0x8776, 0x8776, 0x05DC,
- 0x8777, 0x8777, 0x488B, 0x8778, 0x8778, 0x219E, 0x8779, 0x877A, 0x488C,
- 0x877B, 0x877B, 0x1C31, 0x877C, 0x877C, 0x1C39, 0x877D, 0x877E, 0x1C2F,
- 0x877F, 0x8781, 0x488E, 0x8782, 0x8782, 0x1C2D, 0x8783, 0x8783, 0x1C46,
- 0x8784, 0x8784, 0x25DC, 0x8785, 0x8785, 0x1C43, 0x8786, 0x8787, 0x4891,
- 0x8788, 0x8788, 0x1C42, 0x8789, 0x878A, 0x4893, 0x878B, 0x878B, 0x1C36,
- 0x878C, 0x878C, 0x4895, 0x878D, 0x878D, 0x0CB5, 0x878E, 0x8792, 0x4896,
- 0x8793, 0x8793, 0x1C3D, 0x8794, 0x8796, 0x489B, 0x8797, 0x8797, 0x1C45,
- 0x8798, 0x879D, 0x489E, 0x879E, 0x879E, 0x206C, 0x879F, 0x879F, 0x0AFD,
- 0x87A0, 0x87A1, 0x48A4, 0x87A2, 0x87A2, 0x2226, 0x87A3, 0x87A7, 0x48A6,
- 0x87A8, 0x87A8, 0x1C3F, 0x87A9, 0x87AA, 0x48AB, 0x87AB, 0x87AB, 0x1C47,
- 0x87AC, 0x87AC, 0x1C49, 0x87AD, 0x87AD, 0x1C44, 0x87AE, 0x87AE, 0x48AD,
- 0x87AF, 0x87AF, 0x1C3E, 0x87B0, 0x87B2, 0x48AE, 0x87B3, 0x87B3, 0x1C4B,
- 0x87B4, 0x87B4, 0x48B1, 0x87B5, 0x87B5, 0x1C4A, 0x87B6, 0x87B9, 0x48B2,
- 0x87BA, 0x87BA, 0x0A84, 0x87BB, 0x87BB, 0x25E0, 0x87BC, 0x87BC, 0x48B6,
- 0x87BD, 0x87BD, 0x1C4E, 0x87BE, 0x87BF, 0x48B7, 0x87C0, 0x87C0, 0x1C50,
- 0x87C1, 0x87C3, 0x48B9, 0x87C4, 0x87C4, 0x227B, 0x87C5, 0x87C5, 0x48BC,
- 0x87C6, 0x87C6, 0x1C41, 0x87C7, 0x87C7, 0x48BD, 0x87C8, 0x87C8, 0x25DE,
- 0x87C9, 0x87C9, 0x48BE, 0x87CA, 0x87CA, 0x1C51, 0x87CB, 0x87CB, 0x1C4C,
- 0x87CC, 0x87CD, 0x48BF, 0x87CE, 0x87CE, 0x25E1, 0x87CF, 0x87D0, 0x48C1,
- 0x87D1, 0x87D1, 0x1C4F, 0x87D2, 0x87D2, 0x1C40, 0x87D3, 0x87D3, 0x1C4D,
- 0x87D4, 0x87DA, 0x48C3, 0x87DB, 0x87DB, 0x1C52, 0x87DC, 0x87DF, 0x48CA,
- 0x87E0, 0x87E0, 0x1C54, 0x87E1, 0x87E2, 0x48CE, 0x87E3, 0x87E3, 0x25D5,
- 0x87E4, 0x87E4, 0x48D0, 0x87E5, 0x87E5, 0x1C48, 0x87E6, 0x87E9, 0x48D1,
- 0x87EA, 0x87EA, 0x1C53, 0x87EB, 0x87EB, 0x48D5, 0x87EC, 0x87EC, 0x1E6B,
- 0x87ED, 0x87ED, 0x48D6, 0x87EE, 0x87EE, 0x1C55, 0x87EF, 0x87EF, 0x25DB,
- 0x87F0, 0x87F1, 0x48D7, 0x87F2, 0x87F2, 0x1E89, 0x87F3, 0x87F5, 0x48D9,
- 0x87F6, 0x87F6, 0x25D9, 0x87F7, 0x87F8, 0x48DC, 0x87F9, 0x87F9, 0x0F82,
- 0x87FA, 0x87FA, 0x48DE, 0x87FB, 0x87FB, 0x2211, 0x87FC, 0x87FD, 0x48DF,
- 0x87FE, 0x87FE, 0x1C58, 0x87FF, 0x87FF, 0x48E1, 0x8800, 0x8802, 0x48E2,
- 0x8803, 0x8803, 0x130D, 0x8804, 0x8804, 0x48E5, 0x8805, 0x8805, 0x2229,
- 0x8806, 0x8806, 0x25D6, 0x8807, 0x8809, 0x48E6, 0x880A, 0x880A, 0x1C59,
- 0x880B, 0x880F, 0x48E9, 0x8810, 0x8810, 0x25DD, 0x8811, 0x8811, 0x25DF,
- 0x8812, 0x8812, 0x48EE, 0x8813, 0x8813, 0x1C57, 0x8814, 0x8814, 0x48EF,
- 0x8815, 0x8815, 0x0CBF, 0x8816, 0x8816, 0x1C56, 0x8817, 0x881A, 0x48F0,
- 0x881B, 0x881B, 0x1C5A, 0x881C, 0x881E, 0x48F4, 0x881F, 0x881F, 0x1FEF,
- 0x8820, 0x8820, 0x48F7, 0x8821, 0x8821, 0x1C5B, 0x8822, 0x8822, 0x0543,
- 0x8823, 0x8823, 0x25D8, 0x8824, 0x8830, 0x48F8, 0x8831, 0x8831, 0x1F29,
- 0x8832, 0x8832, 0x1A8D, 0x8833, 0x8835, 0x4905, 0x8836, 0x8836, 0x1E5B,
- 0x8837, 0x8838, 0x4908, 0x8839, 0x8839, 0x1C5C, 0x883A, 0x883A, 0x490A,
- 0x883B, 0x883B, 0x2076, 0x883C, 0x883C, 0x1C5D, 0x883D, 0x883F, 0x490B,
- 0x8840, 0x8840, 0x0FD3, 0x8841, 0x8843, 0x490E, 0x8844, 0x8844, 0x1CAA,
- 0x8845, 0x8845, 0x0F91, 0x8846, 0x8846, 0x2297, 0x8847, 0x8849, 0x4911,
- 0x884A, 0x884A, 0x2690, 0x884B, 0x884B, 0x4914, 0x884C, 0x884C, 0x0F9B,
- 0x884D, 0x884D, 0x1005, 0x884E, 0x8852, 0x4915, 0x8853, 0x8853, 0x213F,
- 0x8854, 0x8854, 0x0F3B, 0x8855, 0x8856, 0x491A, 0x8857, 0x8857, 0x08A7,
- 0x8858, 0x8858, 0x491C, 0x8859, 0x8859, 0x0FEC, 0x885A, 0x885A, 0x491D,
- 0x885B, 0x885B, 0x2198, 0x885C, 0x885C, 0x491E, 0x885D, 0x885D, 0x1E88,
- 0x885E, 0x8860, 0x491F, 0x8861, 0x8861, 0x0799, 0x8862, 0x8862, 0x15ED,
- 0x8863, 0x8863, 0x1049, 0x8864, 0x8864, 0x1BA6, 0x8865, 0x8865, 0x0480,
- 0x8866, 0x8867, 0x4922, 0x8868, 0x8868, 0x0456, 0x8869, 0x8869, 0x1BA7,
- 0x886A, 0x886A, 0x4924, 0x886B, 0x886B, 0x0CF9, 0x886C, 0x886C, 0x04E9,
- 0x886D, 0x886D, 0x4925, 0x886E, 0x886E, 0x1306, 0x886F, 0x886F, 0x4926,
- 0x8870, 0x8870, 0x0D9A, 0x8871, 0x8871, 0x4927, 0x8872, 0x8872, 0x1BA8,
- 0x8873, 0x8876, 0x4928, 0x8877, 0x8877, 0x11D3, 0x8878, 0x8878, 0x492C,
- 0x8879, 0x8879, 0x228C, 0x887A, 0x887C, 0x492D, 0x887D, 0x887D, 0x1BA9,
- 0x887E, 0x887E, 0x1CBE, 0x887F, 0x887F, 0x1BAA, 0x8880, 0x8880, 0x4930,
- 0x8881, 0x8881, 0x10EF, 0x8882, 0x8882, 0x1BAB, 0x8883, 0x8883, 0x4931,
- 0x8884, 0x8884, 0x03CB, 0x8885, 0x8885, 0x1CBF, 0x8886, 0x8887, 0x4932,
- 0x8888, 0x8888, 0x1CC0, 0x8889, 0x888A, 0x4934, 0x888B, 0x888B, 0x057F,
- 0x888C, 0x888C, 0x4936, 0x888D, 0x888D, 0x0B9C, 0x888E, 0x8891, 0x4937,
- 0x8892, 0x8892, 0x0E0E, 0x8893, 0x8895, 0x493B, 0x8896, 0x8896, 0x0FAF,
- 0x8897, 0x889B, 0x493E, 0x889C, 0x889C, 0x0E91, 0x889D, 0x88A1, 0x4943,
- 0x88A2, 0x88A2, 0x1BAC, 0x88A3, 0x88A3, 0x4948, 0x88A4, 0x88A4, 0x1307,
- 0x88A5, 0x88AA, 0x4949, 0x88AB, 0x88AB, 0x0424, 0x88AC, 0x88AC, 0x494F,
- 0x88AD, 0x88AD, 0x0F1B, 0x88AE, 0x88B0, 0x4950, 0x88B1, 0x88B1, 0x069F,
- 0x88B2, 0x88B6, 0x4953, 0x88B7, 0x88B7, 0x1BAE, 0x88B8, 0x88BB, 0x4958,
- 0x88BC, 0x88BC, 0x1BAF, 0x88BD, 0x88C0, 0x495C, 0x88C1, 0x88C1, 0x048A,
- 0x88C2, 0x88C2, 0x0A1A, 0x88C3, 0x88C4, 0x4960, 0x88C5, 0x88C5, 0x120D,
- 0x88C6, 0x88C6, 0x1BAD, 0x88C7, 0x88C8, 0x4962, 0x88C9, 0x88C9, 0x1BB0,
- 0x88CA, 0x88CA, 0x25F1, 0x88CB, 0x88CD, 0x4964, 0x88CE, 0x88CE, 0x1BB2,
- 0x88CF, 0x88CF, 0x200C, 0x88D0, 0x88D1, 0x4967, 0x88D2, 0x88D2, 0x130A,
- 0x88D3, 0x88D3, 0x4969, 0x88D4, 0x88D4, 0x1068, 0x88D5, 0x88D5, 0x10E6,
- 0x88D6, 0x88D7, 0x496A, 0x88D8, 0x88D8, 0x1CC1, 0x88D9, 0x88D9, 0x0C94,
- 0x88DA, 0x88DB, 0x496C, 0x88DC, 0x88DC, 0x1E58, 0x88DD, 0x88DD, 0x22AC,
- 0x88DE, 0x88DE, 0x496E, 0x88DF, 0x88DF, 0x1CC2, 0x88E0, 0x88E1, 0x496F,
- 0x88E2, 0x88E2, 0x1BB1, 0x88E3, 0x88E3, 0x1BB3, 0x88E4, 0x88E4, 0x0970,
- 0x88E5, 0x88E5, 0x1BB4, 0x88E6, 0x88E7, 0x4971, 0x88E8, 0x88E8, 0x1BB8,
- 0x88E9, 0x88EF, 0x4973, 0x88F0, 0x88F0, 0x1BBA, 0x88F1, 0x88F1, 0x1BB5,
- 0x88F2, 0x88F2, 0x497A, 0x88F3, 0x88F3, 0x0D0A, 0x88F4, 0x88F4, 0x0BA2,
- 0x88F5, 0x88F7, 0x497B, 0x88F8, 0x88F8, 0x0A8A, 0x88F9, 0x88F9, 0x0755,
- 0x88FA, 0x88FB, 0x497E, 0x88FC, 0x88FC, 0x1BB7, 0x88FD, 0x88FD, 0x26A7,
- 0x88FE, 0x88FE, 0x1BB9, 0x88FF, 0x88FF, 0x4980, 0x8900, 0x8901, 0x4981,
- 0x8902, 0x8902, 0x072C, 0x8903, 0x8906, 0x4983, 0x8907, 0x8907, 0x2676,
- 0x8908, 0x8909, 0x4987, 0x890A, 0x890A, 0x1BBF, 0x890B, 0x890F, 0x4989,
- 0x8910, 0x8910, 0x078D, 0x8911, 0x8911, 0x498E, 0x8912, 0x8912, 0x0408,
- 0x8913, 0x8913, 0x1BBD, 0x8914, 0x8918, 0x498F, 0x8919, 0x8919, 0x1BBC,
- 0x891A, 0x891A, 0x1BB6, 0x891B, 0x891B, 0x1BBE, 0x891C, 0x8920, 0x4994,
- 0x8921, 0x8921, 0x1BBB, 0x8922, 0x8924, 0x4999, 0x8925, 0x8925, 0x0CC7,
- 0x8926, 0x8929, 0x499C, 0x892A, 0x892A, 0x0E7B, 0x892B, 0x892B, 0x1BC1,
- 0x892C, 0x892F, 0x49A0, 0x8930, 0x8930, 0x1739, 0x8931, 0x8931, 0x49A4,
- 0x8932, 0x8932, 0x1FE1, 0x8933, 0x8933, 0x25BB, 0x8934, 0x8934, 0x1BC0,
- 0x8935, 0x8935, 0x49A5, 0x8936, 0x8936, 0x1BC2, 0x8937, 0x8937, 0x49A6,
- 0x8938, 0x8938, 0x25BE, 0x8939, 0x893A, 0x49A7, 0x893B, 0x893B, 0x22DD,
- 0x893C, 0x8940, 0x49A9, 0x8941, 0x8941, 0x1BC3, 0x8942, 0x8943, 0x49AE,
- 0x8944, 0x8944, 0x0F52, 0x8945, 0x8946, 0x49B0, 0x8947, 0x8947, 0x25BD,
- 0x8948, 0x8955, 0x49B2, 0x8956, 0x8956, 0x1E2A, 0x8957, 0x895C, 0x49C0,
- 0x895D, 0x895D, 0x25BC, 0x895E, 0x895E, 0x1CC3, 0x895F, 0x895F, 0x08C4,
- 0x8960, 0x8960, 0x25BA, 0x8961, 0x8963, 0x49C6, 0x8964, 0x8964, 0x25BF,
- 0x8965, 0x8965, 0x49C9, 0x8966, 0x8966, 0x1BC4, 0x8967, 0x8969, 0x49CA,
- 0x896A, 0x896A, 0x2187, 0x896B, 0x896B, 0x49CD, 0x896C, 0x896C, 0x266B,
- 0x896D, 0x896E, 0x49CE, 0x896F, 0x896F, 0x1E7F, 0x8970, 0x8971, 0x49D0,
- 0x8972, 0x8972, 0x21AD, 0x8973, 0x897A, 0x49D2, 0x897B, 0x897B, 0x1BC5,
- 0x897C, 0x897E, 0x49DA, 0x897F, 0x897F, 0x0F06, 0x8980, 0x8980, 0x49DD,
- 0x8981, 0x8981, 0x1031, 0x8982, 0x8982, 0x49DE, 0x8983, 0x8983, 0x1BDF,
- 0x8984, 0x8985, 0x49DF, 0x8986, 0x8986, 0x06AD, 0x8987, 0x898A, 0x49E1,
- 0x898B, 0x898B, 0x1F96, 0x898C, 0x898E, 0x49E5, 0x898F, 0x898F, 0x1F32,
- 0x8990, 0x8992, 0x49E8, 0x8993, 0x8993, 0x2084, 0x8994, 0x8995, 0x49EB,
- 0x8996, 0x8996, 0x2136, 0x8997, 0x8997, 0x49ED, 0x8998, 0x8998, 0x24B8,
- 0x8999, 0x89A0, 0x49EE, 0x89A1, 0x89A1, 0x24BA, 0x89A2, 0x89A5, 0x49F6,
- 0x89A6, 0x89A6, 0x24BC, 0x89A7, 0x89A9, 0x49FA, 0x89AA, 0x89AA, 0x20E4,
- 0x89AB, 0x89AB, 0x49FD, 0x89AC, 0x89AC, 0x24B9, 0x89AD, 0x89AE, 0x49FE,
- 0x89AF, 0x89AF, 0x24BD, 0x89B0, 0x89B1, 0x4A00, 0x89B2, 0x89B2, 0x24BE,
- 0x89B3, 0x89B6, 0x4A02, 0x89B7, 0x89B7, 0x24BF, 0x89B8, 0x89B9, 0x4A06,
- 0x89BA, 0x89BA, 0x1FD2, 0x89BB, 0x89BC, 0x4A08, 0x89BD, 0x89BD, 0x1FFD,
- 0x89BE, 0x89BE, 0x4A0A, 0x89BF, 0x89BF, 0x24BB, 0x89C0, 0x89C0, 0x1F2D,
- 0x89C1, 0x89C1, 0x086E, 0x89C2, 0x89C2, 0x0734, 0x89C3, 0x89C3, 0x4A0B,
- 0x89C4, 0x89C4, 0x073F, 0x89C5, 0x89C5, 0x0ADE, 0x89C6, 0x89C6, 0x0D6A,
- 0x89C7, 0x89C7, 0x193A, 0x89C8, 0x89C8, 0x09AB, 0x89C9, 0x89C9, 0x0924,
- 0x89CA, 0x89CC, 0x193B, 0x89CD, 0x89CD, 0x4A0C, 0x89CE, 0x89D1, 0x193E,
- 0x89D2, 0x89D2, 0x0898, 0x89D3, 0x89D5, 0x4A0D, 0x89D6, 0x89D6, 0x1D57,
- 0x89D7, 0x89D9, 0x4A10, 0x89DA, 0x89DA, 0x1D59, 0x89DB, 0x89DB, 0x4A13,
- 0x89DC, 0x89DC, 0x1D5A, 0x89DD, 0x89DD, 0x4A14, 0x89DE, 0x89DE, 0x1D58,
- 0x89DF, 0x89E2, 0x4A15, 0x89E3, 0x89E3, 0x08B3, 0x89E4, 0x89E4, 0x4A19,
- 0x89E5, 0x89E5, 0x1D5B, 0x89E6, 0x89E6, 0x0528, 0x89E7, 0x89EA, 0x4A1A,
- 0x89EB, 0x89EB, 0x1D5C, 0x89EC, 0x89EE, 0x4A1E, 0x89EF, 0x89EF, 0x1D5D,
- 0x89F0, 0x89F2, 0x4A21, 0x89F3, 0x89F3, 0x19C0, 0x89F4, 0x89F4, 0x2609,
- 0x89F5, 0x89F5, 0x4A24, 0x89F6, 0x89F6, 0x260A, 0x89F7, 0x89F7, 0x4A25,
- 0x89F8, 0x89F8, 0x1E94, 0x89F9, 0x89FF, 0x4A26, 0x8A00, 0x8A00, 0x0FFD,
- 0x8A01, 0x8A01, 0x22DF, 0x8A02, 0x8A02, 0x1ECB, 0x8A03, 0x8A03, 0x1F0D,
- 0x8A04, 0x8A06, 0x4A2D, 0x8A07, 0x8A07, 0x12FE, 0x8A08, 0x8A08, 0x1F77,
- 0x8A09, 0x8A09, 0x4A30, 0x8A0A, 0x8A0A, 0x21EB, 0x8A0B, 0x8A0B, 0x4A31,
- 0x8A0C, 0x8A0C, 0x22E1, 0x8A0D, 0x8A0D, 0x4A32, 0x8A0E, 0x8A0E, 0x216F,
- 0x8A0F, 0x8A0F, 0x4A33, 0x8A10, 0x8A10, 0x22E0, 0x8A11, 0x8A12, 0x4A34,
- 0x8A13, 0x8A13, 0x21EA, 0x8A14, 0x8A14, 0x4A36, 0x8A15, 0x8A15, 0x22E2,
- 0x8A16, 0x8A16, 0x20CB, 0x8A17, 0x8A17, 0x4A37, 0x8A18, 0x8A18, 0x1F78,
- 0x8A19, 0x8A1A, 0x4A38, 0x8A1B, 0x8A1B, 0x1EE2, 0x8A1C, 0x8A1C, 0x4A3A,
- 0x8A1D, 0x8A1D, 0x21F2, 0x8A1E, 0x8A1E, 0x4A3B, 0x8A1F, 0x8A1F, 0x2150,
- 0x8A20, 0x8A22, 0x4A3C, 0x8A23, 0x8A23, 0x1FD3, 0x8A24, 0x8A24, 0x4A3F,
- 0x8A25, 0x8A25, 0x22E5, 0x8A26, 0x8A29, 0x4A40, 0x8A2A, 0x8A2A, 0x1EF2,
- 0x8A2B, 0x8A2C, 0x4A44, 0x8A2D, 0x8A2D, 0x211F, 0x8A2E, 0x8A30, 0x4A46,
- 0x8A31, 0x8A31, 0x21DD, 0x8A32, 0x8A33, 0x4A49, 0x8A34, 0x8A34, 0x2154,
- 0x8A35, 0x8A35, 0x4A4B, 0x8A36, 0x8A36, 0x22E7, 0x8A37, 0x8A39, 0x4A4C,
- 0x8A3A, 0x8A3A, 0x2282, 0x8A3B, 0x8A3D, 0x4A4F, 0x8A3E, 0x8A3E, 0x1D5E,
- 0x8A3F, 0x8A40, 0x4A52, 0x8A41, 0x8A41, 0x22E6, 0x8A42, 0x8A45, 0x4A54,
- 0x8A46, 0x8A46, 0x22E8, 0x8A47, 0x8A47, 0x4A58, 0x8A48, 0x8A48, 0x1A84,
- 0x8A49, 0x8A4D, 0x4A59, 0x8A4E, 0x8A4E, 0x22E4, 0x8A4F, 0x8A4F, 0x4A5E,
- 0x8A50, 0x8A50, 0x226A, 0x8A51, 0x8A51, 0x4A5F, 0x8A52, 0x8A52, 0x22EB,
- 0x8A53, 0x8A53, 0x4A60, 0x8A54, 0x8A54, 0x22E9, 0x8A55, 0x8A55, 0x20BD,
- 0x8A56, 0x8A57, 0x4A61, 0x8A58, 0x8A58, 0x22EA, 0x8A59, 0x8A5A, 0x4A63,
- 0x8A5B, 0x8A5B, 0x22BD, 0x8A5C, 0x8A5D, 0x4A65, 0x8A5E, 0x8A5E, 0x1E9E,
- 0x8A5F, 0x8A60, 0x4A67, 0x8A61, 0x8A61, 0x22F6, 0x8A62, 0x8A62, 0x21E7,
- 0x8A63, 0x8A63, 0x2216, 0x8A64, 0x8A65, 0x4A69, 0x8A66, 0x8A66, 0x2137,
- 0x8A67, 0x8A68, 0x4A6B, 0x8A69, 0x8A69, 0x212C, 0x8A6A, 0x8A6A, 0x4A6D,
- 0x8A6B, 0x8A6B, 0x1E68, 0x8A6C, 0x8A6C, 0x22F2, 0x8A6D, 0x8A6D, 0x1F37,
- 0x8A6E, 0x8A6E, 0x22F3, 0x8A6F, 0x8A6F, 0x4A6E, 0x8A70, 0x8A70, 0x22EF,
- 0x8A71, 0x8A71, 0x1F50, 0x8A72, 0x8A72, 0x1F10, 0x8A73, 0x8A73, 0x21C8,
- 0x8A74, 0x8A74, 0x4A6F, 0x8A75, 0x8A75, 0x22F1, 0x8A76, 0x8A78, 0x4A70,
- 0x8A79, 0x8A79, 0x1153, 0x8A7A, 0x8A7B, 0x4A73, 0x8A7C, 0x8A7C, 0x22F0,
- 0x8A7D, 0x8A7E, 0x4A75, 0x8A7F, 0x8A7F, 0x22EE, 0x8A80, 0x8A83, 0x4A77,
- 0x8A84, 0x8A84, 0x22ED, 0x8A85, 0x8A85, 0x229E, 0x8A86, 0x8A86, 0x22EC,
- 0x8A87, 0x8A87, 0x1FE2, 0x8A88, 0x8A88, 0x4A7B, 0x8A89, 0x8A89, 0x10E3,
- 0x8A8A, 0x8A8A, 0x0E2F, 0x8A8B, 0x8A8C, 0x4A7C, 0x8A8D, 0x8A8D, 0x20FE,
- 0x8A8E, 0x8A90, 0x4A7E, 0x8A91, 0x8A92, 0x22F9, 0x8A93, 0x8A93, 0x0D5B,
- 0x8A94, 0x8A94, 0x4A81, 0x8A95, 0x8A95, 0x1EAF, 0x8A96, 0x8A97, 0x4A82,
- 0x8A98, 0x8A98, 0x2236, 0x8A99, 0x8A99, 0x4A84, 0x8A9A, 0x8A9A, 0x22F7,
- 0x8A9B, 0x8A9D, 0x4A85, 0x8A9E, 0x8A9E, 0x223D, 0x8A9F, 0x8A9F, 0x4A88,
- 0x8AA0, 0x8AA0, 0x1E82, 0x8AA1, 0x8AA1, 0x1FB6, 0x8AA2, 0x8AA2, 0x4A89,
- 0x8AA3, 0x8AA3, 0x21A4, 0x8AA4, 0x8AA4, 0x21AA, 0x8AA5, 0x8AA5, 0x22F8,
- 0x8AA6, 0x8AA6, 0x2151, 0x8AA7, 0x8AA7, 0x4A8A, 0x8AA8, 0x8AA8, 0x1F60,
- 0x8AA9, 0x8AAB, 0x4A8B, 0x8AAC, 0x8AAC, 0x2147, 0x8AAD, 0x8AAF, 0x4A8E,
- 0x8AB0, 0x8AB0, 0x2145, 0x8AB1, 0x8AB1, 0x4A91, 0x8AB2, 0x8AB2, 0x1FDC,
- 0x8AB3, 0x8AB5, 0x4A92, 0x8AB6, 0x8AB6, 0x2301, 0x8AB7, 0x8AB8, 0x4A95,
- 0x8AB9, 0x8AB9, 0x1EF5, 0x8ABA, 0x8ABB, 0x4A97, 0x8ABC, 0x8ABC, 0x2218,
- 0x8ABD, 0x8ABE, 0x4A99, 0x8ABF, 0x8ABF, 0x1EC6, 0x8AC0, 0x8AC1, 0x4A9B,
- 0x8AC2, 0x8AC2, 0x2300, 0x8AC3, 0x8AC3, 0x4A9D, 0x8AC4, 0x8AC4, 0x22B4,
- 0x8AC5, 0x8AC6, 0x4A9E, 0x8AC7, 0x8AC7, 0x2169, 0x8AC8, 0x8AC8, 0x4AA0,
- 0x8AC9, 0x8AC9, 0x22FD, 0x8ACA, 0x8ACA, 0x4AA1, 0x8ACB, 0x8ACB, 0x20EA,
- 0x8ACC, 0x8ACC, 0x4AA2, 0x8ACD, 0x8ACD, 0x22F4, 0x8ACE, 0x8ACE, 0x4AA3,
- 0x8ACF, 0x8ACF, 0x22FB, 0x8AD0, 0x8AD0, 0x4AA4, 0x8AD1, 0x8AD1, 0x22FC,
- 0x8AD2, 0x8AD2, 0x2027, 0x8AD3, 0x8AD5, 0x4AA5, 0x8AD6, 0x8AD6, 0x2060,
- 0x8AD7, 0x8AD7, 0x22FF, 0x8AD8, 0x8ADA, 0x4AA8, 0x8ADB, 0x8ADB, 0x22FE,
- 0x8ADC, 0x8ADC, 0x1EC7, 0x8ADD, 0x8ADD, 0x4AAB, 0x8ADE, 0x8ADE, 0x230C,
- 0x8ADF, 0x8AE1, 0x4AAC, 0x8AE2, 0x8AE2, 0x22F5, 0x8AE3, 0x8AE3, 0x4AAF,
- 0x8AE4, 0x8AE4, 0x2306, 0x8AE5, 0x8AE5, 0x4AB0, 0x8AE6, 0x8AE6, 0x230A,
- 0x8AE7, 0x8AE7, 0x21D3, 0x8AE8, 0x8AEA, 0x4AB1, 0x8AEB, 0x8AEB, 0x2303,
- 0x8AEC, 0x8AEC, 0x4AB4, 0x8AED, 0x8AED, 0x2307, 0x8AEE, 0x8AEE, 0x230B,
- 0x8AEF, 0x8AF0, 0x4AB5, 0x8AF1, 0x8AF1, 0x1F5F, 0x8AF2, 0x8AF2, 0x4AB7,
- 0x8AF3, 0x8AF3, 0x2309, 0x8AF4, 0x8AF5, 0x4AB8, 0x8AF6, 0x8AF6, 0x2302,
- 0x8AF7, 0x8AF7, 0x1F04, 0x8AF8, 0x8AF8, 0x229D, 0x8AF9, 0x8AF9, 0x4ABA,
- 0x8AFA, 0x8AFA, 0x21FB, 0x8AFB, 0x8AFB, 0x4ABB, 0x8AFC, 0x8AFC, 0x2308,
- 0x8AFD, 0x8AFD, 0x4ABC, 0x8AFE, 0x8AFE, 0x20AC, 0x8AFF, 0x8AFF, 0x4ABD,
- 0x8B00, 0x8B00, 0x208E, 0x8B01, 0x8B01, 0x2305, 0x8B02, 0x8B02, 0x2197,
- 0x8B03, 0x8B03, 0x4ABE, 0x8B04, 0x8B04, 0x2171, 0x8B05, 0x8B05, 0x2298,
- 0x8B06, 0x8B06, 0x4ABF, 0x8B07, 0x8B07, 0x173C, 0x8B08, 0x8B09, 0x4AC0,
- 0x8B0A, 0x8B0A, 0x1F57, 0x8B0B, 0x8B0D, 0x4AC2, 0x8B0E, 0x8B0E, 0x2082,
- 0x8B0F, 0x8B0F, 0x4AC5, 0x8B10, 0x8B10, 0x2311, 0x8B11, 0x8B13, 0x4AC6,
- 0x8B14, 0x8B14, 0x2304, 0x8B15, 0x8B15, 0x4AC9, 0x8B16, 0x8B16, 0x230F,
- 0x8B17, 0x8B17, 0x1E35, 0x8B18, 0x8B18, 0x4ACA, 0x8B19, 0x8B19, 0x20D1,
- 0x8B1A, 0x8B1A, 0x2310, 0x8B1B, 0x8B1B, 0x1FA3, 0x8B1C, 0x8B1C, 0x4ACB,
- 0x8B1D, 0x8B1D, 0x21D6, 0x8B1E, 0x8B20, 0x4ACC, 0x8B21, 0x8B21, 0x2206,
- 0x8B22, 0x8B25, 0x4ACF, 0x8B26, 0x8B26, 0x1D5F, 0x8B27, 0x8B27, 0x4AD3,
- 0x8B28, 0x8B28, 0x230D, 0x8B29, 0x8B2A, 0x4AD4, 0x8B2B, 0x8B2B, 0x2312,
- 0x8B2C, 0x8B2C, 0x208D, 0x8B2D, 0x8B2D, 0x2313, 0x8B2E, 0x8B32, 0x4AD6,
- 0x8B33, 0x8B33, 0x22E3, 0x8B34, 0x8B38, 0x4ADB, 0x8B39, 0x8B39, 0x1FBA,
- 0x8B3A, 0x8B3D, 0x4AE0, 0x8B3E, 0x8B3E, 0x2078, 0x8B3F, 0x8B48, 0x4AE4,
- 0x8B49, 0x8B49, 0x2288, 0x8B4A, 0x8B4D, 0x4AEE, 0x8B4E, 0x8B4E, 0x2316,
- 0x8B4F, 0x8B4F, 0x1F6B, 0x8B50, 0x8B55, 0x4AF2, 0x8B56, 0x8B56, 0x2314,
- 0x8B57, 0x8B57, 0x4AF8, 0x8B58, 0x8B58, 0x2130, 0x8B59, 0x8B59, 0x2315,
- 0x8B5A, 0x8B5A, 0x2168, 0x8B5B, 0x8B5B, 0x4AF9, 0x8B5C, 0x8B5C, 0x20C4,
- 0x8B5D, 0x8B65, 0x4AFA, 0x8B66, 0x8B66, 0x08DE, 0x8B67, 0x8B6A, 0x4B03,
- 0x8B6B, 0x8B6B, 0x2318, 0x8B6C, 0x8B6C, 0x0BC8, 0x8B6D, 0x8B6E, 0x4B07,
- 0x8B6F, 0x8B6F, 0x2219, 0x8B70, 0x8B70, 0x2217, 0x8B71, 0x8B73, 0x4B09,
- 0x8B74, 0x8B74, 0x20D5, 0x8B75, 0x8B76, 0x4B0C, 0x8B77, 0x8B77, 0x1F4A,
- 0x8B78, 0x8B7C, 0x4B0E, 0x8B7D, 0x8B7D, 0x2240, 0x8B7E, 0x8B7F, 0x4B13,
- 0x8B80, 0x8B80, 0x1ED3, 0x8B81, 0x8B89, 0x4B15, 0x8B8A, 0x8B8A, 0x1E49,
- 0x8B8B, 0x8B8D, 0x4B1E, 0x8B8E, 0x8B8E, 0x261B, 0x8B8F, 0x8B91, 0x4B21,
- 0x8B92, 0x8B92, 0x1E6D, 0x8B93, 0x8B93, 0x20F8, 0x8B94, 0x8B94, 0x4B24,
- 0x8B95, 0x8B95, 0x1FFB, 0x8B96, 0x8B96, 0x2319, 0x8B97, 0x8B9B, 0x4B25,
- 0x8B9C, 0x8B9C, 0x230E, 0x8B9D, 0x8B9D, 0x4B2A, 0x8B9E, 0x8B9E, 0x2317,
- 0x8B9F, 0x8B9F, 0x4B2B, 0x8BA0, 0x8BA0, 0x1317, 0x8BA1, 0x8BA1, 0x0839,
- 0x8BA2, 0x8BA2, 0x05E8, 0x8BA3, 0x8BA3, 0x06B7, 0x8BA4, 0x8BA4, 0x0CAA,
- 0x8BA5, 0x8BA5, 0x0818, 0x8BA6, 0x8BA7, 0x1318, 0x8BA8, 0x8BA8, 0x0E29,
- 0x8BA9, 0x8BA9, 0x0C9E, 0x8BAA, 0x8BAA, 0x131A, 0x8BAB, 0x8BAB, 0x0C1C,
- 0x8BAC, 0x8BAC, 0x4B2C, 0x8BAD, 0x8BAD, 0x0FDE, 0x8BAE, 0x8BAE, 0x1070,
- 0x8BAF, 0x8BAF, 0x0FDF, 0x8BB0, 0x8BB0, 0x083A, 0x8BB1, 0x8BB1, 0x4B2D,
- 0x8BB2, 0x8BB2, 0x0883, 0x8BB3, 0x8BB3, 0x07F9, 0x8BB4, 0x8BB5, 0x131B,
- 0x8BB6, 0x8BB6, 0x0FF1, 0x8BB7, 0x8BB7, 0x131D, 0x8BB8, 0x8BB8, 0x0FB8,
- 0x8BB9, 0x8BB9, 0x062E, 0x8BBA, 0x8BBA, 0x0A82, 0x8BBB, 0x8BBB, 0x4B2E,
- 0x8BBC, 0x8BBC, 0x0DC4, 0x8BBD, 0x8BBD, 0x068A, 0x8BBE, 0x8BBE, 0x0D21,
- 0x8BBF, 0x8BBF, 0x0660, 0x8BC0, 0x8BC0, 0x0926, 0x8BC1, 0x8BC1, 0x11A3,
- 0x8BC2, 0x8BC3, 0x131E, 0x8BC4, 0x8BC4, 0x0BDF, 0x8BC5, 0x8BC5, 0x1244,
- 0x8BC6, 0x8BC6, 0x0D4D, 0x8BC7, 0x8BC7, 0x4B2F, 0x8BC8, 0x8BC8, 0x114A,
- 0x8BC9, 0x8BC9, 0x0DD4, 0x8BCA, 0x8BCA, 0x1190, 0x8BCB, 0x8BCB, 0x1320,
- 0x8BCC, 0x8BCC, 0x11DE, 0x8BCD, 0x8BCD, 0x054D, 0x8BCE, 0x8BCE, 0x1322,
- 0x8BCF, 0x8BCF, 0x1321, 0x8BD0, 0x8BD0, 0x4B30, 0x8BD1, 0x8BD1, 0x1072,
- 0x8BD2, 0x8BD4, 0x1323, 0x8BD5, 0x8BD5, 0x0D6B, 0x8BD6, 0x8BD6, 0x1326,
- 0x8BD7, 0x8BD7, 0x0D42, 0x8BD8, 0x8BD9, 0x1327, 0x8BDA, 0x8BDA, 0x04F4,
- 0x8BDB, 0x8BDB, 0x11EE, 0x8BDC, 0x8BDC, 0x1329, 0x8BDD, 0x8BDD, 0x07C5,
- 0x8BDE, 0x8BDE, 0x058F, 0x8BDF, 0x8BE0, 0x132A, 0x8BE1, 0x8BE1, 0x0747,
- 0x8BE2, 0x8BE2, 0x0FD8, 0x8BE3, 0x8BE3, 0x106F, 0x8BE4, 0x8BE4, 0x132C,
- 0x8BE5, 0x8BE5, 0x06BE, 0x8BE6, 0x8BE6, 0x0F57, 0x8BE7, 0x8BE7, 0x04B6,
- 0x8BE8, 0x8BE9, 0x132D, 0x8BEA, 0x8BEA, 0x4B31, 0x8BEB, 0x8BEB, 0x08BC,
- 0x8BEC, 0x8BEC, 0x0EEB, 0x8BED, 0x8BED, 0x10D4, 0x8BEE, 0x8BEE, 0x132F,
- 0x8BEF, 0x8BEF, 0x0F02, 0x8BF0, 0x8BF0, 0x1330, 0x8BF1, 0x8BF1, 0x10BA,
- 0x8BF2, 0x8BF2, 0x07FA, 0x8BF3, 0x8BF3, 0x1331, 0x8BF4, 0x8BF4, 0x0DAA,
- 0x8BF5, 0x8BF5, 0x0DC5, 0x8BF6, 0x8BF6, 0x1332, 0x8BF7, 0x8BF7, 0x0C68,
- 0x8BF8, 0x8BF8, 0x11ED, 0x8BF9, 0x8BF9, 0x1333, 0x8BFA, 0x8BFA, 0x0B76,
- 0x8BFB, 0x8BFB, 0x0600, 0x8BFC, 0x8BFC, 0x1334, 0x8BFD, 0x8BFD, 0x0669,
- 0x8BFE, 0x8BFE, 0x095B, 0x8BFF, 0x8BFF, 0x1335, 0x8C00, 0x8C00, 0x1336,
- 0x8C01, 0x8C01, 0x0DA2, 0x8C02, 0x8C02, 0x1337, 0x8C03, 0x8C03, 0x05D8,
- 0x8C04, 0x8C04, 0x1338, 0x8C05, 0x8C05, 0x0A0B, 0x8C06, 0x8C06, 0x1218,
- 0x8C07, 0x8C07, 0x1339, 0x8C08, 0x8C08, 0x0E0B, 0x8C09, 0x8C09, 0x4B32,
- 0x8C0A, 0x8C0A, 0x1071, 0x8C0B, 0x8C0B, 0x0B14, 0x8C0C, 0x8C0C, 0x133A,
- 0x8C0D, 0x8C0D, 0x05DE, 0x8C0E, 0x8C0E, 0x07E6, 0x8C0F, 0x8C0F, 0x133B,
- 0x8C10, 0x8C10, 0x0F7E, 0x8C11, 0x8C12, 0x133C, 0x8C13, 0x8C13, 0x0ECC,
- 0x8C14, 0x8C16, 0x133E, 0x8C17, 0x8C17, 0x04BE, 0x8C18, 0x8C18, 0x1343,
- 0x8C19, 0x8C19, 0x1341, 0x8C1A, 0x8C1A, 0x1011, 0x8C1B, 0x8C1B, 0x1342,
- 0x8C1C, 0x8C1C, 0x0ADA, 0x8C1D, 0x8C1D, 0x1344, 0x8C1E, 0x8C1E, 0x4B33,
- 0x8C1F, 0x8C21, 0x1345, 0x8C22, 0x8C22, 0x0F86, 0x8C23, 0x8C23, 0x102C,
- 0x8C24, 0x8C24, 0x0404, 0x8C25, 0x8C25, 0x1348, 0x8C26, 0x8C26, 0x0C28,
- 0x8C27, 0x8C27, 0x1349, 0x8C28, 0x8C28, 0x08C8, 0x8C29, 0x8C29, 0x0AA6,
- 0x8C2A, 0x8C2B, 0x134A, 0x8C2C, 0x8C2C, 0x0B02, 0x8C2D, 0x8C2D, 0x0E0A,
- 0x8C2E, 0x8C2F, 0x134C, 0x8C30, 0x8C30, 0x09A9, 0x8C31, 0x8C31, 0x0BF6,
- 0x8C32, 0x8C33, 0x134E, 0x8C34, 0x8C34, 0x0C31, 0x8C35, 0x8C36, 0x1350,
- 0x8C37, 0x8C37, 0x0721, 0x8C38, 0x8C40, 0x4B34, 0x8C41, 0x8C41, 0x0802,
- 0x8C42, 0x8C45, 0x4B3D, 0x8C46, 0x8C46, 0x05F8, 0x8C47, 0x8C47, 0x1CF6,
- 0x8C48, 0x8C48, 0x20C8, 0x8C49, 0x8C49, 0x1CF7, 0x8C4A, 0x8C4B, 0x4B41,
- 0x8C4C, 0x8C4C, 0x0E94, 0x8C4D, 0x8C4F, 0x4B43, 0x8C50, 0x8C50, 0x1EFD,
- 0x8C51, 0x8C54, 0x4B46, 0x8C55, 0x8C55, 0x1D15, 0x8C56, 0x8C59, 0x4B4A,
- 0x8C5A, 0x8C5A, 0x1990, 0x8C5B, 0x8C60, 0x4B4E, 0x8C61, 0x8C61, 0x0F60,
- 0x8C62, 0x8C62, 0x07D4, 0x8C63, 0x8C69, 0x4B54, 0x8C6A, 0x8C6A, 0x0777,
- 0x8C6B, 0x8C6B, 0x10E8, 0x8C6C, 0x8C72, 0x4B5B, 0x8C73, 0x8C73, 0x15DD,
- 0x8C74, 0x8C77, 0x4B62, 0x8C78, 0x8C78, 0x1D50, 0x8C79, 0x8C79, 0x0413,
- 0x8C7A, 0x8C7A, 0x04B9, 0x8C7B, 0x8C81, 0x4B66, 0x8C82, 0x8C82, 0x1D51,
- 0x8C83, 0x8C84, 0x4B6D, 0x8C85, 0x8C85, 0x1D53, 0x8C86, 0x8C88, 0x4B6F,
- 0x8C89, 0x8C89, 0x0788, 0x8C8A, 0x8C8A, 0x1D52, 0x8C8B, 0x8C8B, 0x4B72,
- 0x8C8C, 0x8C8C, 0x0AB7, 0x8C8D, 0x8C93, 0x4B73, 0x8C94, 0x8C94, 0x1D55,
- 0x8C95, 0x8C97, 0x4B7A, 0x8C98, 0x8C98, 0x1D54, 0x8C99, 0x8C9C, 0x4B7D,
- 0x8C9D, 0x8C9D, 0x1E3B, 0x8C9E, 0x8C9E, 0x227F, 0x8C9F, 0x8C9F, 0x4B81,
- 0x8CA0, 0x8CA0, 0x1F0C, 0x8CA1, 0x8CA1, 0x1E59, 0x8CA2, 0x8CA2, 0x1F24,
- 0x8CA3, 0x8CA6, 0x4B82, 0x8CA7, 0x8CA7, 0x20BA, 0x8CA8, 0x8CA8, 0x1F65,
- 0x8CA9, 0x8CA9, 0x1EF0, 0x8CAA, 0x8CAA, 0x2164, 0x8CAB, 0x8CAB, 0x1F30,
- 0x8CAC, 0x8CAC, 0x2261, 0x8CAD, 0x8CAE, 0x4B86, 0x8CAF, 0x8CAF, 0x22A2,
- 0x8CB0, 0x8CB0, 0x24AB, 0x8CB1, 0x8CB1, 0x4B88, 0x8CB2, 0x8CB2, 0x24AF,
- 0x8CB3, 0x8CB3, 0x1EE8, 0x8CB4, 0x8CB4, 0x1F39, 0x8CB5, 0x8CB5, 0x4B89,
- 0x8CB6, 0x8CB6, 0x1E48, 0x8CB7, 0x8CB7, 0x2070, 0x8CB8, 0x8CB8, 0x1EA8,
- 0x8CB9, 0x8CB9, 0x4B8A, 0x8CBA, 0x8CBA, 0x24AC, 0x8CBB, 0x8CBB, 0x1EF7,
- 0x8CBC, 0x8CBC, 0x2176, 0x8CBD, 0x8CBD, 0x24AD, 0x8CBE, 0x8CBE, 0x4B8B,
- 0x8CBF, 0x8CBF, 0x207B, 0x8CC0, 0x8CC0, 0x1F45, 0x8CC1, 0x8CC1, 0x24AA,
- 0x8CC2, 0x8CC2, 0x204B, 0x8CC3, 0x8CC3, 0x202F, 0x8CC4, 0x8CC4, 0x1F5A,
- 0x8CC5, 0x8CC5, 0x24B0, 0x8CC6, 0x8CC6, 0x4B8C, 0x8CC7, 0x8CC7, 0x22B7,
- 0x8CC8, 0x8CC8, 0x1F7F, 0x8CC9, 0x8CC9, 0x4B8D, 0x8CCA, 0x8CCA, 0x2265,
- 0x8CCB, 0x8CD0, 0x4B8E, 0x8CD1, 0x8CD1, 0x24B2, 0x8CD2, 0x8CD2, 0x211B,
- 0x8CD3, 0x8CD3, 0x1E51, 0x8CD4, 0x8CD4, 0x4B94, 0x8CD5, 0x8CD5, 0x24B4,
- 0x8CD6, 0x8CD9, 0x4B95, 0x8CDA, 0x8CDA, 0x24B3, 0x8CDB, 0x8CDB, 0x4B99,
- 0x8CDC, 0x8CDC, 0x1E9F, 0x8CDD, 0x8CDD, 0x4B9A, 0x8CDE, 0x8CDE, 0x2118,
- 0x8CDF, 0x8CDF, 0x4B9B, 0x8CE0, 0x8CE0, 0x20B4, 0x8CE1, 0x8CE1, 0x23AF,
- 0x8CE2, 0x8CE2, 0x21BB, 0x8CE3, 0x8CE3, 0x2072, 0x8CE4, 0x8CE4, 0x1F95,
- 0x8CE5, 0x8CE5, 0x4B9C, 0x8CE6, 0x8CE6, 0x1F0A, 0x8CE7, 0x8CE7, 0x24B6,
- 0x8CE8, 0x8CE9, 0x4B9D, 0x8CEA, 0x8CEA, 0x2291, 0x8CEB, 0x8CEB, 0x24B5,
- 0x8CEC, 0x8CEC, 0x2278, 0x8CED, 0x8CED, 0x1ED4, 0x8CEE, 0x8CF3, 0x4B9F,
- 0x8CF4, 0x8CF4, 0x1FF3, 0x8CF5, 0x8CF9, 0x4BA5, 0x8CFA, 0x8CFA, 0x22A9,
- 0x8CFB, 0x8CFB, 0x24B7, 0x8CFC, 0x8CFC, 0x1F28, 0x8CFD, 0x8CFD, 0x2109,
- 0x8CFE, 0x8CFE, 0x22C7, 0x8CFF, 0x8CFF, 0x4BAA, 0x8D00, 0x8D03, 0x4BAB,
- 0x8D04, 0x8D04, 0x24AE, 0x8D05, 0x8D05, 0x22B1, 0x8D06, 0x8D07, 0x4BAF,
- 0x8D08, 0x8D08, 0x2266, 0x8D09, 0x8D09, 0x4BB1, 0x8D0A, 0x8D0A, 0x225B,
- 0x8D0B, 0x8D0B, 0x22C4, 0x8D0C, 0x8D0C, 0x4BB2, 0x8D0D, 0x8D0D, 0x2115,
- 0x8D0E, 0x8D0E, 0x4BB3, 0x8D0F, 0x8D0F, 0x222A, 0x8D10, 0x8D10, 0x24B1,
- 0x8D11, 0x8D15, 0x4BB4, 0x8D16, 0x8D16, 0x213D, 0x8D17, 0x8D1A, 0x4BB9,
- 0x8D1B, 0x8D1B, 0x1F15, 0x8D1C, 0x8D1C, 0x225C, 0x8D1D, 0x8D1D, 0x041D,
- 0x8D1E, 0x8D1E, 0x118B, 0x8D1F, 0x8D1F, 0x06B5, 0x8D20, 0x8D20, 0x4BBD,
- 0x8D21, 0x8D21, 0x070A, 0x8D22, 0x8D22, 0x048D, 0x8D23, 0x8D23, 0x1133,
- 0x8D24, 0x8D24, 0x0F3A, 0x8D25, 0x8D25, 0x03E7, 0x8D26, 0x8D26, 0x116C,
- 0x8D27, 0x8D27, 0x080A, 0x8D28, 0x8D28, 0x11C9, 0x8D29, 0x8D29, 0x0654,
- 0x8D2A, 0x8D2A, 0x0E03, 0x8D2B, 0x8D2B, 0x0BD5, 0x8D2C, 0x8D2C, 0x044A,
- 0x8D2D, 0x8D2D, 0x0713, 0x8D2E, 0x8D2E, 0x11FB, 0x8D2F, 0x8D2F, 0x073A,
- 0x8D30, 0x8D30, 0x063E, 0x8D31, 0x8D31, 0x086D, 0x8D32, 0x8D33, 0x192C,
- 0x8D34, 0x8D34, 0x0E4C, 0x8D35, 0x8D35, 0x074C, 0x8D36, 0x8D36, 0x192E,
- 0x8D37, 0x8D37, 0x057E, 0x8D38, 0x8D38, 0x0AB8, 0x8D39, 0x8D39, 0x066E,
- 0x8D3A, 0x8D3A, 0x078F, 0x8D3B, 0x8D3B, 0x192F, 0x8D3C, 0x8D3C, 0x1137,
- 0x8D3D, 0x8D3D, 0x1930, 0x8D3E, 0x8D3E, 0x0849, 0x8D3F, 0x8D3F, 0x07F4,
- 0x8D40, 0x8D40, 0x1931, 0x8D41, 0x8D41, 0x0A27, 0x8D42, 0x8D42, 0x0A5F,
- 0x8D43, 0x8D43, 0x1122, 0x8D44, 0x8D44, 0x1227, 0x8D45, 0x8D46, 0x1932,
- 0x8D47, 0x8D47, 0x1936, 0x8D48, 0x8D49, 0x1934, 0x8D4A, 0x8D4A, 0x0D17,
- 0x8D4B, 0x8D4B, 0x06AE, 0x8D4C, 0x8D4C, 0x0603, 0x8D4D, 0x8D4D, 0x1937,
- 0x8D4E, 0x8D4E, 0x0D81, 0x8D4F, 0x8D4F, 0x0D06, 0x8D50, 0x8D50, 0x0550,
- 0x8D51, 0x8D52, 0x4BBE, 0x8D53, 0x8D53, 0x163B, 0x8D54, 0x8D54, 0x0BA3,
- 0x8D55, 0x8D55, 0x1938, 0x8D56, 0x8D56, 0x09A0, 0x8D57, 0x8D57, 0x4BC0,
- 0x8D58, 0x8D58, 0x1215, 0x8D59, 0x8D59, 0x1939, 0x8D5A, 0x8D5A, 0x1209,
- 0x8D5B, 0x8D5B, 0x0CD7, 0x8D5C, 0x8D5C, 0x1289, 0x8D5D, 0x8D5D, 0x1283,
- 0x8D5E, 0x8D5E, 0x1121, 0x8D5F, 0x8D5F, 0x4BC1, 0x8D60, 0x8D60, 0x113C,
- 0x8D61, 0x8D61, 0x0CFD, 0x8D62, 0x8D62, 0x1093, 0x8D63, 0x8D63, 0x06CE,
- 0x8D64, 0x8D64, 0x0505, 0x8D65, 0x8D65, 0x4BC2, 0x8D66, 0x8D66, 0x0D1B,
- 0x8D67, 0x8D67, 0x1CF4, 0x8D68, 0x8D6A, 0x4BC3, 0x8D6B, 0x8D6B, 0x078C,
- 0x8D6C, 0x8D6C, 0x4BC6, 0x8D6D, 0x8D6D, 0x1CF5, 0x8D6E, 0x8D6F, 0x4BC7,
- 0x8D70, 0x8D70, 0x123C, 0x8D71, 0x8D72, 0x4BC9, 0x8D73, 0x8D73, 0x1CEF,
- 0x8D74, 0x8D74, 0x06AB, 0x8D75, 0x8D75, 0x1175, 0x8D76, 0x8D76, 0x06CA,
- 0x8D77, 0x8D77, 0x0C0F, 0x8D78, 0x8D80, 0x4BCB, 0x8D81, 0x8D81, 0x04E8,
- 0x8D82, 0x8D83, 0x4BD4, 0x8D84, 0x8D84, 0x1CF0, 0x8D85, 0x8D85, 0x04D1,
- 0x8D86, 0x8D89, 0x4BD6, 0x8D8A, 0x8D8A, 0x1100, 0x8D8B, 0x8D8B, 0x0C74,
- 0x8D8C, 0x8D90, 0x4BDA, 0x8D91, 0x8D91, 0x1CF2, 0x8D92, 0x8D93, 0x4BDF,
- 0x8D94, 0x8D94, 0x1CF1, 0x8D95, 0x8D95, 0x1F14, 0x8D96, 0x8D98, 0x4BE1,
- 0x8D99, 0x8D99, 0x227A, 0x8D9A, 0x8D9E, 0x4BE4, 0x8D9F, 0x8D9F, 0x0E1E,
- 0x8DA0, 0x8DA2, 0x4BE9, 0x8DA3, 0x8DA3, 0x0C7F, 0x8DA4, 0x8DA7, 0x4BEC,
- 0x8DA8, 0x8DA8, 0x20EE, 0x8DA9, 0x8DB0, 0x4BF0, 0x8DB1, 0x8DB1, 0x1CF3,
- 0x8DB2, 0x8DB2, 0x25F8, 0x8DB3, 0x8DB3, 0x1240, 0x8DB4, 0x8DB4, 0x0B80,
- 0x8DB5, 0x8DB5, 0x1D1C, 0x8DB6, 0x8DB7, 0x4BF8, 0x8DB8, 0x8DB8, 0x1D17,
- 0x8DB9, 0x8DB9, 0x4BFA, 0x8DBA, 0x8DBA, 0x1D1F, 0x8DBB, 0x8DBB, 0x4BFB,
- 0x8DBC, 0x8DBC, 0x1D1E, 0x8DBD, 0x8DBD, 0x4BFC, 0x8DBE, 0x8DBE, 0x11B9,
- 0x8DBF, 0x8DBF, 0x1D1D, 0x8DC0, 0x8DC2, 0x4BFD, 0x8DC3, 0x8DC3, 0x1101,
- 0x8DC4, 0x8DC4, 0x1D20, 0x8DC5, 0x8DC5, 0x4C00, 0x8DC6, 0x8DC6, 0x1D28,
- 0x8DC7, 0x8DCA, 0x4C01, 0x8DCB, 0x8DCB, 0x03DA, 0x8DCC, 0x8DCC, 0x05D9,
- 0x8DCD, 0x8DCD, 0x4C05, 0x8DCE, 0x8DCF, 0x1D25, 0x8DD0, 0x8DD0, 0x4C06,
- 0x8DD1, 0x8DD1, 0x0B9D, 0x8DD2, 0x8DD5, 0x4C07, 0x8DD6, 0x8DD7, 0x1D21,
- 0x8DD8, 0x8DD9, 0x4C0B, 0x8DDA, 0x8DDA, 0x1D23, 0x8DDB, 0x8DDB, 0x1D27,
- 0x8DDC, 0x8DDC, 0x4C0D, 0x8DDD, 0x8DDD, 0x090F, 0x8DDE, 0x8DDE, 0x1D24,
- 0x8DDF, 0x8DDF, 0x06F5, 0x8DE0, 0x8DE2, 0x4C0E, 0x8DE3, 0x8DE3, 0x1D2C,
- 0x8DE4, 0x8DE4, 0x1D2F, 0x8DE5, 0x8DE7, 0x4C11, 0x8DE8, 0x8DE8, 0x0974,
- 0x8DE9, 0x8DE9, 0x4C14, 0x8DEA, 0x8DEA, 0x074B, 0x8DEB, 0x8DEB, 0x1D18,
- 0x8DEC, 0x8DEC, 0x1D29, 0x8DED, 0x8DEE, 0x4C15, 0x8DEF, 0x8DEF, 0x0A5E,
- 0x8DF0, 0x8DF2, 0x4C17, 0x8DF3, 0x8DF3, 0x0E4B, 0x8DF4, 0x8DF4, 0x4C1A,
- 0x8DF5, 0x8DF5, 0x086C, 0x8DF6, 0x8DF6, 0x4C1B, 0x8DF7, 0x8DF8, 0x1D2A,
- 0x8DF9, 0x8DF9, 0x1D2D, 0x8DFA, 0x8DFA, 0x0624, 0x8DFB, 0x8DFB, 0x1D2E,
- 0x8DFC, 0x8DFC, 0x4C1C, 0x8DFD, 0x8DFD, 0x1D31, 0x8DFE, 0x8DFF, 0x4C1D,
- 0x8E00, 0x8E04, 0x4C1F, 0x8E05, 0x8E05, 0x1D19, 0x8E06, 0x8E08, 0x4C24,
- 0x8E09, 0x8E09, 0x1D30, 0x8E0A, 0x8E0A, 0x10A0, 0x8E0B, 0x8E0B, 0x4C27,
- 0x8E0C, 0x8E0C, 0x0511, 0x8E0D, 0x8E0E, 0x4C28, 0x8E0F, 0x8E0F, 0x0DF7,
- 0x8E10, 0x8E10, 0x1F94, 0x8E11, 0x8E13, 0x4C2A, 0x8E14, 0x8E14, 0x1D32,
- 0x8E15, 0x8E1C, 0x4C2D, 0x8E1D, 0x8E1D, 0x1D33, 0x8E1E, 0x8E1E, 0x0910,
- 0x8E1F, 0x8E1F, 0x1D34, 0x8E20, 0x8E21, 0x4C35, 0x8E22, 0x8E22, 0x0E32,
- 0x8E23, 0x8E23, 0x1D37, 0x8E24, 0x8E28, 0x4C37, 0x8E29, 0x8E29, 0x048F,
- 0x8E2A, 0x8E2A, 0x1236, 0x8E2B, 0x8E2B, 0x4C3C, 0x8E2C, 0x8E2C, 0x1D35,
- 0x8E2D, 0x8E2D, 0x4C3D, 0x8E2E, 0x8E2E, 0x1D36, 0x8E2F, 0x8E2F, 0x1D38,
- 0x8E30, 0x8E30, 0x4C3E, 0x8E31, 0x8E31, 0x1D3E, 0x8E32, 0x8E33, 0x4C3F,
- 0x8E34, 0x8E34, 0x2230, 0x8E35, 0x8E35, 0x1D3C, 0x8E36, 0x8E38, 0x4C41,
- 0x8E39, 0x8E39, 0x1D3B, 0x8E3A, 0x8E3A, 0x1D39, 0x8E3B, 0x8E3C, 0x4C44,
- 0x8E3D, 0x8E3D, 0x1D3D, 0x8E3E, 0x8E3F, 0x4C46, 0x8E40, 0x8E40, 0x1D3A,
- 0x8E41, 0x8E42, 0x1D40, 0x8E43, 0x8E43, 0x4C48, 0x8E44, 0x8E44, 0x0E36,
- 0x8E45, 0x8E46, 0x4C49, 0x8E47, 0x8E47, 0x173B, 0x8E48, 0x8E48, 0x0599,
- 0x8E49, 0x8E49, 0x1D3F, 0x8E4A, 0x8E4A, 0x1D44, 0x8E4B, 0x8E4B, 0x0DF6,
- 0x8E4C, 0x8E4C, 0x25FD, 0x8E4D, 0x8E50, 0x4C4B, 0x8E51, 0x8E52, 0x1D42,
- 0x8E53, 0x8E54, 0x4C4F, 0x8E55, 0x8E55, 0x2600, 0x8E56, 0x8E58, 0x4C51,
- 0x8E59, 0x8E59, 0x1D1A, 0x8E5A, 0x8E62, 0x4C54, 0x8E63, 0x8E63, 0x2606,
- 0x8E64, 0x8E65, 0x4C5D, 0x8E66, 0x8E66, 0x042D, 0x8E67, 0x8E68, 0x4C5F,
- 0x8E69, 0x8E69, 0x1D1B, 0x8E6A, 0x8E6B, 0x4C61, 0x8E6C, 0x8E6C, 0x05A6,
- 0x8E6D, 0x8E6D, 0x04AB, 0x8E6E, 0x8E6E, 0x4C63, 0x8E6F, 0x8E6F, 0x1D48,
- 0x8E70, 0x8E70, 0x1D45, 0x8E71, 0x8E71, 0x4C64, 0x8E72, 0x8E72, 0x0616,
- 0x8E73, 0x8E73, 0x4C65, 0x8E74, 0x8E74, 0x1D49, 0x8E75, 0x8E75, 0x4C66,
- 0x8E76, 0x8E76, 0x1D46, 0x8E77, 0x8E79, 0x4C67, 0x8E7A, 0x8E7A, 0x25FF,
- 0x8E7B, 0x8E7B, 0x4C6A, 0x8E7C, 0x8E7C, 0x1D47, 0x8E7D, 0x8E7E, 0x4C6B,
- 0x8E7F, 0x8E7F, 0x055D, 0x8E80, 0x8E80, 0x4C6D, 0x8E81, 0x8E81, 0x112D,
- 0x8E82, 0x8E84, 0x4C6E, 0x8E85, 0x8E85, 0x1D4A, 0x8E86, 0x8E86, 0x4C71,
- 0x8E87, 0x8E87, 0x051E, 0x8E88, 0x8E88, 0x4C72, 0x8E89, 0x8E89, 0x25FC,
- 0x8E8A, 0x8E8A, 0x1E8C, 0x8E8B, 0x8E8B, 0x2602, 0x8E8C, 0x8E8C, 0x4C73,
- 0x8E8D, 0x8E8D, 0x224D, 0x8E8E, 0x8E8E, 0x4C74, 0x8E8F, 0x8E8F, 0x1D4B,
- 0x8E90, 0x8E90, 0x1D4D, 0x8E91, 0x8E91, 0x2604, 0x8E92, 0x8E92, 0x25FE,
- 0x8E93, 0x8E93, 0x2603, 0x8E94, 0x8E94, 0x1D4C, 0x8E95, 0x8E99, 0x4C75,
- 0x8E9A, 0x8E9A, 0x2601, 0x8E9B, 0x8E9B, 0x4C7A, 0x8E9C, 0x8E9C, 0x1D4E,
- 0x8E9D, 0x8E9D, 0x4C7B, 0x8E9E, 0x8E9E, 0x1D4F, 0x8E9F, 0x8EA0, 0x4C7C,
- 0x8EA1, 0x8EA1, 0x2605, 0x8EA2, 0x8EA4, 0x4C7E, 0x8EA5, 0x8EA5, 0x1EA3,
- 0x8EA6, 0x8EA6, 0x2608, 0x8EA7, 0x8EA9, 0x4C81, 0x8EAA, 0x8EAA, 0x2607,
- 0x8EAB, 0x8EAB, 0x0D26, 0x8EAC, 0x8EAC, 0x0703, 0x8EAD, 0x8EAE, 0x4C84,
- 0x8EAF, 0x8EAF, 0x0C78, 0x8EB0, 0x8EB1, 0x4C86, 0x8EB2, 0x8EB2, 0x0622,
- 0x8EB3, 0x8EB9, 0x4C88, 0x8EBA, 0x8EBA, 0x0E1C, 0x8EBB, 0x8EBF, 0x4C8F,
- 0x8EC0, 0x8EC0, 0x20F0, 0x8EC1, 0x8EC9, 0x4C94, 0x8ECA, 0x8ECA, 0x1E7B,
- 0x8ECB, 0x8ECB, 0x2267, 0x8ECC, 0x8ECC, 0x1F36, 0x8ECD, 0x8ECD, 0x1FD6,
- 0x8ECE, 0x8ECE, 0x18F8, 0x8ECF, 0x8ED1, 0x4C9D, 0x8ED2, 0x8ED2, 0x21E0,
- 0x8ED3, 0x8ED3, 0x4CA0, 0x8ED4, 0x8ED4, 0x248C, 0x8ED5, 0x8EDA, 0x4CA1,
- 0x8EDB, 0x8EDB, 0x248D, 0x8EDC, 0x8EDE, 0x4CA7, 0x8EDF, 0x8EDF, 0x2102,
- 0x8EE0, 0x8EE3, 0x4CAA, 0x8EE4, 0x8EE4, 0x2494, 0x8EE5, 0x8EEA, 0x4CAE,
- 0x8EEB, 0x8EEB, 0x2493, 0x8EEC, 0x8EF1, 0x4CB4, 0x8EF2, 0x8EF2, 0x248E,
- 0x8EF3, 0x8EF7, 0x4CBA, 0x8EF8, 0x8EF8, 0x2299, 0x8EF9, 0x8EF9, 0x2491,
- 0x8EFA, 0x8EFA, 0x2496, 0x8EFB, 0x8EFB, 0x248F, 0x8EFC, 0x8EFC, 0x2492,
- 0x8EFD, 0x8EFD, 0x4CBF, 0x8EFE, 0x8EFE, 0x2497, 0x8EFF, 0x8EFF, 0x4CC0,
- 0x8F00, 0x8F02, 0x4CC1, 0x8F03, 0x8F03, 0x1FB1, 0x8F04, 0x8F04, 0x4CC4,
- 0x8F05, 0x8F05, 0x249A, 0x8F06, 0x8F06, 0x4CC5, 0x8F07, 0x8F07, 0x2499,
- 0x8F08, 0x8F08, 0x4CC6, 0x8F09, 0x8F09, 0x2258, 0x8F0A, 0x8F0A, 0x2498,
- 0x8F0B, 0x8F11, 0x4CC7, 0x8F12, 0x8F12, 0x249B, 0x8F13, 0x8F13, 0x4CCE,
- 0x8F14, 0x8F14, 0x1F09, 0x8F15, 0x8F15, 0x20E6, 0x8F16, 0x8F1A, 0x4CCF,
- 0x8F1B, 0x8F1B, 0x2026, 0x8F1C, 0x8F1C, 0x249F, 0x8F1D, 0x8F1D, 0x1F59,
- 0x8F1E, 0x8F1F, 0x249D, 0x8F20, 0x8F24, 0x4CD4, 0x8F25, 0x8F25, 0x1F3B,
- 0x8F26, 0x8F26, 0x249C, 0x8F27, 0x8F28, 0x4CD9, 0x8F29, 0x8F29, 0x1E3A,
- 0x8F2A, 0x8F2A, 0x205B, 0x8F2B, 0x8F2E, 0x4CDB, 0x8F2F, 0x8F2F, 0x1F70,
- 0x8F30, 0x8F32, 0x4CDF, 0x8F33, 0x8F33, 0x24A0, 0x8F34, 0x8F37, 0x4CE2,
- 0x8F38, 0x8F38, 0x213B, 0x8F39, 0x8F3A, 0x4CE6, 0x8F3B, 0x8F3B, 0x1F07,
- 0x8F3C, 0x8F3D, 0x4CE8, 0x8F3E, 0x8F3E, 0x2270, 0x8F3F, 0x8F3F, 0x2237,
- 0x8F40, 0x8F41, 0x4CEA, 0x8F42, 0x8F42, 0x24D2, 0x8F43, 0x8F43, 0x4CEC,
- 0x8F44, 0x8F44, 0x21B3, 0x8F45, 0x8F45, 0x2245, 0x8F46, 0x8F46, 0x24A1,
- 0x8F47, 0x8F48, 0x4CED, 0x8F49, 0x8F49, 0x22A8, 0x8F4A, 0x8F4C, 0x4CEF,
- 0x8F4D, 0x8F4D, 0x227C, 0x8F4E, 0x8F4E, 0x1FB0, 0x8F4F, 0x8F53, 0x4CF2,
- 0x8F54, 0x8F54, 0x24A2, 0x8F55, 0x8F5E, 0x4CF7, 0x8F5F, 0x8F5F, 0x1F46,
- 0x8F60, 0x8F60, 0x4D01, 0x8F61, 0x8F61, 0x2380, 0x8F62, 0x8F62, 0x2495,
- 0x8F63, 0x8F63, 0x4D02, 0x8F64, 0x8F64, 0x2490, 0x8F65, 0x8F65, 0x4D03,
- 0x8F66, 0x8F66, 0x04DA, 0x8F67, 0x8F67, 0x1141, 0x8F68, 0x8F68, 0x0745,
- 0x8F69, 0x8F69, 0x0FC4, 0x8F6A, 0x8F6A, 0x4D04, 0x8F6B, 0x8F6B, 0x18E1,
- 0x8F6C, 0x8F6C, 0x1207, 0x8F6D, 0x8F6D, 0x18E2, 0x8F6E, 0x8F6E, 0x0A7D,
- 0x8F6F, 0x8F6F, 0x0CC8, 0x8F70, 0x8F70, 0x079B, 0x8F71, 0x8F73, 0x18E3,
- 0x8F74, 0x8F74, 0x11E0, 0x8F75, 0x8F76, 0x18E6, 0x8F77, 0x8F77, 0x18E9,
- 0x8F78, 0x8F78, 0x18E8, 0x8F79, 0x8F7A, 0x18EA, 0x8F7B, 0x8F7B, 0x0C5E,
- 0x8F7C, 0x8F7C, 0x18EC, 0x8F7D, 0x8F7D, 0x111B, 0x8F7E, 0x8F7E, 0x18ED,
- 0x8F7F, 0x8F7F, 0x089F, 0x8F80, 0x8F80, 0x4D05, 0x8F81, 0x8F82, 0x18EE,
- 0x8F83, 0x8F83, 0x08A0, 0x8F84, 0x8F84, 0x18F0, 0x8F85, 0x8F85, 0x06A3,
- 0x8F86, 0x8F86, 0x0A07, 0x8F87, 0x8F87, 0x18F1, 0x8F88, 0x8F88, 0x041B,
- 0x8F89, 0x8F89, 0x07E9, 0x8F8A, 0x8F8A, 0x074E, 0x8F8B, 0x8F8B, 0x18F2,
- 0x8F8C, 0x8F8C, 0x4D06, 0x8F8D, 0x8F8F, 0x18F3, 0x8F90, 0x8F90, 0x0695,
- 0x8F91, 0x8F91, 0x0820, 0x8F92, 0x8F92, 0x4D07, 0x8F93, 0x8F93, 0x0D7B,
- 0x8F94, 0x8F94, 0x1574, 0x8F95, 0x8F95, 0x10F2, 0x8F96, 0x8F96, 0x0F2A,
- 0x8F97, 0x8F97, 0x1158, 0x8F98, 0x8F98, 0x18F6, 0x8F99, 0x8F99, 0x117F,
- 0x8F9A, 0x8F9A, 0x18F7, 0x8F9B, 0x8F9B, 0x0F8C, 0x8F9C, 0x8F9C, 0x0715,
- 0x8F9D, 0x8F9D, 0x4D08, 0x8F9E, 0x8F9E, 0x054A, 0x8F9F, 0x8F9F, 0x0442,
- 0x8FA0, 0x8FA2, 0x4D09, 0x8FA3, 0x8FA3, 0x099C, 0x8FA4, 0x8FA5, 0x4D0C,
- 0x8FA6, 0x8FA6, 0x1E30, 0x8FA7, 0x8FA7, 0x4D0E, 0x8FA8, 0x8FA9, 0x044F,
- 0x8FAA, 0x8FAA, 0x4D0F, 0x8FAB, 0x8FAB, 0x0451, 0x8FAC, 0x8FAC, 0x4D10,
- 0x8FAD, 0x8FAD, 0x1E9D, 0x8FAE, 0x8FAE, 0x1E4B, 0x8FAF, 0x8FAF, 0x1E4A,
- 0x8FB0, 0x8FB0, 0x04E2, 0x8FB1, 0x8FB1, 0x0CC3, 0x8FB2, 0x8FB2, 0x20AA,
- 0x8FB3, 0x8FB5, 0x4D11, 0x8FB6, 0x8FB6, 0x173D, 0x8FB7, 0x8FB8, 0x4D14,
- 0x8FB9, 0x8FB9, 0x0448, 0x8FBA, 0x8FBC, 0x4D16, 0x8FBD, 0x8FBD, 0x0A12,
- 0x8FBE, 0x8FBE, 0x0572, 0x8FBF, 0x8FC0, 0x4D19, 0x8FC1, 0x8FC1, 0x0C25,
- 0x8FC2, 0x8FC2, 0x10BD, 0x8FC3, 0x8FC3, 0x4D1B, 0x8FC4, 0x8FC4, 0x0C18,
- 0x8FC5, 0x8FC5, 0x0FE1, 0x8FC6, 0x8FC6, 0x4D1C, 0x8FC7, 0x8FC7, 0x0756,
- 0x8FC8, 0x8FC8, 0x0A9C, 0x8FC9, 0x8FCD, 0x4D1D, 0x8FCE, 0x8FCE, 0x1092,
- 0x8FCF, 0x8FCF, 0x4D22, 0x8FD0, 0x8FD0, 0x110E, 0x8FD1, 0x8FD1, 0x08CD,
- 0x8FD2, 0x8FD2, 0x4D23, 0x8FD3, 0x8FD3, 0x173E, 0x8FD4, 0x8FD4, 0x0652,
- 0x8FD5, 0x8FD5, 0x173F, 0x8FD6, 0x8FD7, 0x4D24, 0x8FD8, 0x8FD8, 0x07CE,
- 0x8FD9, 0x8FD9, 0x1183, 0x8FDA, 0x8FDA, 0x4D26, 0x8FDB, 0x8FDB, 0x08C9,
- 0x8FDC, 0x8FDC, 0x10F9, 0x8FDD, 0x8FDD, 0x0EB4, 0x8FDE, 0x8FDE, 0x09F5,
- 0x8FDF, 0x8FDF, 0x04FE, 0x8FE0, 0x8FE1, 0x4D27, 0x8FE2, 0x8FE2, 0x0E49,
- 0x8FE3, 0x8FE3, 0x4D29, 0x8FE4, 0x8FE4, 0x1742, 0x8FE5, 0x8FE5, 0x1740,
- 0x8FE6, 0x8FE6, 0x1744, 0x8FE7, 0x8FE7, 0x4D2A, 0x8FE8, 0x8FE8, 0x1746,
- 0x8FE9, 0x8FE9, 0x1743, 0x8FEA, 0x8FEA, 0x05B0, 0x8FEB, 0x8FEB, 0x0BE7,
- 0x8FEC, 0x8FEC, 0x4D2B, 0x8FED, 0x8FED, 0x05DD, 0x8FEE, 0x8FEE, 0x1741,
- 0x8FEF, 0x8FEF, 0x4D2C, 0x8FF0, 0x8FF0, 0x0D8D, 0x8FF1, 0x8FF2, 0x4D2D,
- 0x8FF3, 0x8FF3, 0x1745, 0x8FF4, 0x8FF4, 0x267B, 0x8FF5, 0x8FF6, 0x4D2F,
- 0x8FF7, 0x8FF7, 0x0AD9, 0x8FF8, 0x8FF8, 0x042E, 0x8FF9, 0x8FF9, 0x0816,
- 0x8FFA, 0x8FFC, 0x4D31, 0x8FFD, 0x8FFD, 0x1214, 0x8FFE, 0x8FFF, 0x4D34,
- 0x9000, 0x9000, 0x0E7C, 0x9001, 0x9001, 0x0DC2, 0x9002, 0x9002, 0x0D61,
- 0x9003, 0x9003, 0x0E26, 0x9004, 0x9004, 0x1748, 0x9005, 0x9005, 0x1747,
- 0x9006, 0x9006, 0x0B49, 0x9007, 0x9008, 0x4D36, 0x9009, 0x9009, 0x0FCA,
- 0x900A, 0x900A, 0x0FE0, 0x900B, 0x900B, 0x1749, 0x900C, 0x900C, 0x4D38,
- 0x900D, 0x900D, 0x174C, 0x900E, 0x900E, 0x4D39, 0x900F, 0x900F, 0x0E69,
- 0x9010, 0x9010, 0x11EF, 0x9011, 0x9011, 0x174B, 0x9012, 0x9012, 0x05BE,
- 0x9013, 0x9013, 0x4D3A, 0x9014, 0x9014, 0x0E6F, 0x9015, 0x9015, 0x23F2,
- 0x9016, 0x9016, 0x174D, 0x9017, 0x9017, 0x05F9, 0x9018, 0x9018, 0x4D3B,
- 0x9019, 0x9019, 0x227E, 0x901A, 0x901A, 0x0E59, 0x901B, 0x901B, 0x073D,
- 0x901C, 0x901C, 0x4D3C, 0x901D, 0x901D, 0x0D5C, 0x901E, 0x901E, 0x04F6,
- 0x901F, 0x901F, 0x0DCE, 0x9020, 0x9020, 0x112F, 0x9021, 0x9021, 0x174E,
- 0x9022, 0x9022, 0x0687, 0x9023, 0x9023, 0x2019, 0x9024, 0x9025, 0x4D3D,
- 0x9026, 0x9026, 0x174A, 0x9027, 0x902C, 0x4D3F, 0x902D, 0x902D, 0x1751,
- 0x902E, 0x902E, 0x0581, 0x902F, 0x902F, 0x1752, 0x9030, 0x9031, 0x4D45,
- 0x9032, 0x9032, 0x1FBB, 0x9033, 0x9034, 0x4D47, 0x9035, 0x9036, 0x174F,
- 0x9037, 0x9037, 0x4D49, 0x9038, 0x9038, 0x1064, 0x9039, 0x903A, 0x4D4A,
- 0x903B, 0x903B, 0x0A86, 0x903C, 0x903C, 0x042F, 0x903D, 0x903D, 0x4D4C,
- 0x903E, 0x903E, 0x10C7, 0x903F, 0x9040, 0x4D4D, 0x9041, 0x9041, 0x061C,
- 0x9042, 0x9042, 0x0DE1, 0x9043, 0x9043, 0x4D4F, 0x9044, 0x9044, 0x1753,
- 0x9045, 0x9046, 0x4D50, 0x9047, 0x9047, 0x10DB, 0x9048, 0x904A, 0x4D52,
- 0x904B, 0x904B, 0x2253, 0x904C, 0x904C, 0x4D55, 0x904D, 0x904D, 0x0452,
- 0x904E, 0x904E, 0x1F3E, 0x904F, 0x904F, 0x0633, 0x9050, 0x9050, 0x1756,
- 0x9051, 0x9052, 0x1754, 0x9053, 0x9053, 0x05A1, 0x9054, 0x9054, 0x1EA6,
- 0x9055, 0x9055, 0x218E, 0x9056, 0x9056, 0x4D56, 0x9057, 0x9057, 0x104C,
- 0x9058, 0x9058, 0x1758, 0x9059, 0x905A, 0x4D57, 0x905B, 0x905B, 0x175A,
- 0x905C, 0x905C, 0x21EC, 0x905D, 0x905D, 0x4D59, 0x905E, 0x905E, 0x1EBE,
- 0x905F, 0x905F, 0x4D5A, 0x9060, 0x9060, 0x224A, 0x9061, 0x9061, 0x4D5B,
- 0x9062, 0x9062, 0x1759, 0x9063, 0x9063, 0x0C2F, 0x9064, 0x9064, 0x4D5C,
- 0x9065, 0x9065, 0x102A, 0x9066, 0x9067, 0x4D5D, 0x9068, 0x9068, 0x1757,
- 0x9069, 0x9069, 0x2133, 0x906A, 0x906C, 0x4D5F, 0x906D, 0x906D, 0x1125,
- 0x906E, 0x906E, 0x117B, 0x906F, 0x9071, 0x4D62, 0x9072, 0x9072, 0x1E84,
- 0x9073, 0x9073, 0x4D65, 0x9074, 0x9074, 0x175C, 0x9075, 0x9075, 0x124E,
- 0x9076, 0x9076, 0x4D66, 0x9077, 0x9077, 0x20CF, 0x9078, 0x9078, 0x21E2,
- 0x9079, 0x9079, 0x4D67, 0x907A, 0x907A, 0x220F, 0x907B, 0x907B, 0x4D68,
- 0x907C, 0x907C, 0x2029, 0x907D, 0x907D, 0x175D, 0x907E, 0x907E, 0x4D69,
- 0x907F, 0x907F, 0x0445, 0x9080, 0x9080, 0x1024, 0x9081, 0x9081, 0x2073,
- 0x9082, 0x9082, 0x175E, 0x9083, 0x9083, 0x1760, 0x9084, 0x9084, 0x1F55,
- 0x9085, 0x9086, 0x4D6A, 0x9087, 0x9087, 0x23F1, 0x9088, 0x9088, 0x175F,
- 0x9089, 0x9089, 0x4D6C, 0x908A, 0x908A, 0x1E46, 0x908B, 0x908B, 0x1761,
- 0x908C, 0x908E, 0x4D6D, 0x908F, 0x908F, 0x2063, 0x9090, 0x9090, 0x23F3,
- 0x9091, 0x9091, 0x105F, 0x9092, 0x9092, 0x4D70, 0x9093, 0x9093, 0x05AC,
- 0x9094, 0x9094, 0x4D71, 0x9095, 0x9095, 0x1817, 0x9096, 0x9096, 0x4D72,
- 0x9097, 0x9097, 0x1367, 0x9098, 0x9098, 0x4D73, 0x9099, 0x9099, 0x136A,
- 0x909A, 0x909A, 0x4D74, 0x909B, 0x909B, 0x1368, 0x909C, 0x909C, 0x4D75,
- 0x909D, 0x909D, 0x1369, 0x909E, 0x90A0, 0x4D76, 0x90A1, 0x90A1, 0x136C,
- 0x90A2, 0x90A2, 0x0F9A, 0x90A3, 0x90A3, 0x0B2A, 0x90A4, 0x90A5, 0x4D79,
- 0x90A6, 0x90A6, 0x03F9, 0x90A7, 0x90A9, 0x4D7B, 0x90AA, 0x90AA, 0x0F7B,
- 0x90AB, 0x90AB, 0x4D7E, 0x90AC, 0x90AC, 0x136B, 0x90AD, 0x90AD, 0x4D7F,
- 0x90AE, 0x90AE, 0x10AF, 0x90AF, 0x90AF, 0x0761, 0x90B0, 0x90B0, 0x1372,
- 0x90B1, 0x90B1, 0x0C6E, 0x90B2, 0x90B2, 0x4D80, 0x90B3, 0x90B3, 0x136E,
- 0x90B4, 0x90B4, 0x136D, 0x90B5, 0x90B5, 0x0D14, 0x90B6, 0x90B6, 0x136F,
- 0x90B7, 0x90B7, 0x4D81, 0x90B8, 0x90B8, 0x1371, 0x90B9, 0x90B9, 0x123B,
- 0x90BA, 0x90BA, 0x1370, 0x90BB, 0x90BB, 0x0A23, 0x90BC, 0x90BD, 0x4D82,
- 0x90BE, 0x90BE, 0x1375, 0x90BF, 0x90C0, 0x4D84, 0x90C1, 0x90C1, 0x10D9,
- 0x90C2, 0x90C3, 0x4D86, 0x90C4, 0x90C4, 0x1377, 0x90C5, 0x90C5, 0x1374,
- 0x90C6, 0x90C6, 0x4D88, 0x90C7, 0x90C7, 0x1378, 0x90C8, 0x90C9, 0x4D89,
- 0x90CA, 0x90CA, 0x088D, 0x90CB, 0x90CD, 0x4D8B, 0x90CE, 0x90CE, 0x09B4,
- 0x90CF, 0x90CF, 0x1373, 0x90D0, 0x90D0, 0x1376, 0x90D1, 0x90D1, 0x11A2,
- 0x90D2, 0x90D2, 0x4D8E, 0x90D3, 0x90D3, 0x1379, 0x90D4, 0x90D6, 0x4D8F,
- 0x90D7, 0x90D7, 0x137D, 0x90D8, 0x90DA, 0x4D92, 0x90DB, 0x90DB, 0x137E,
- 0x90DC, 0x90DC, 0x137C, 0x90DD, 0x90DD, 0x0779, 0x90DE, 0x90DE, 0x4D95,
- 0x90DF, 0x90DF, 0x231E, 0x90E0, 0x90E0, 0x4D96, 0x90E1, 0x90E1, 0x0931,
- 0x90E2, 0x90E2, 0x137B, 0x90E3, 0x90E5, 0x4D97, 0x90E6, 0x90E6, 0x137A,
- 0x90E7, 0x90E7, 0x110A, 0x90E8, 0x90E8, 0x0486, 0x90E9, 0x90EA, 0x4D9A,
- 0x90EB, 0x90EB, 0x137F, 0x90EC, 0x90EC, 0x4D9C, 0x90ED, 0x90ED, 0x0752,
- 0x90EE, 0x90EE, 0x4D9D, 0x90EF, 0x90EF, 0x1380, 0x90F0, 0x90F3, 0x4D9E,
- 0x90F4, 0x90F4, 0x04E0, 0x90F5, 0x90F5, 0x2233, 0x90F6, 0x90F7, 0x4DA2,
- 0x90F8, 0x90F8, 0x0587, 0x90F9, 0x90FC, 0x4DA4, 0x90FD, 0x90FD, 0x05FB,
- 0x90FE, 0x90FE, 0x1381, 0x90FF, 0x90FF, 0x4DA8, 0x9100, 0x9101, 0x4DA9,
- 0x9102, 0x9102, 0x0634, 0x9103, 0x9103, 0x4DAB, 0x9104, 0x9104, 0x1382,
- 0x9105, 0x9105, 0x4DAC, 0x9106, 0x9106, 0x2320, 0x9107, 0x9108, 0x4DAD,
- 0x9109, 0x9109, 0x21C7, 0x910A, 0x9111, 0x4DAF, 0x9112, 0x9112, 0x22BC,
- 0x9113, 0x9113, 0x4DB7, 0x9114, 0x9114, 0x231C, 0x9115, 0x9115, 0x4DB8,
- 0x9116, 0x9116, 0x2251, 0x9117, 0x9118, 0x4DB9, 0x9119, 0x9119, 0x0432,
- 0x911A, 0x911D, 0x4DBB, 0x911E, 0x911E, 0x1384, 0x911F, 0x9121, 0x4DBF,
- 0x9122, 0x9122, 0x1383, 0x9123, 0x9123, 0x1385, 0x9124, 0x9126, 0x4DC2,
- 0x9127, 0x9127, 0x1EBB, 0x9128, 0x912C, 0x4DC5, 0x912D, 0x912D, 0x2287,
- 0x912E, 0x912E, 0x4DCA, 0x912F, 0x912F, 0x1387, 0x9130, 0x9130, 0x202D,
- 0x9131, 0x9131, 0x1386, 0x9132, 0x9132, 0x1EAB, 0x9133, 0x9133, 0x4DCB,
- 0x9134, 0x9134, 0x231D, 0x9135, 0x9135, 0x4DCC, 0x9136, 0x9136, 0x231F,
- 0x9137, 0x9138, 0x4DCD, 0x9139, 0x9139, 0x1388, 0x913A, 0x913A, 0x231B,
- 0x913B, 0x9142, 0x4DCF, 0x9143, 0x9143, 0x1389, 0x9144, 0x9145, 0x4DD7,
- 0x9146, 0x9146, 0x138A, 0x9147, 0x9147, 0x4DD9, 0x9148, 0x9148, 0x2321,
- 0x9149, 0x9149, 0x10B4, 0x914A, 0x914A, 0x1CF8, 0x914B, 0x914B, 0x0C72,
- 0x914C, 0x914C, 0x1220, 0x914D, 0x914D, 0x0BA5, 0x914E, 0x914F, 0x1CFA,
- 0x9150, 0x9150, 0x1CF9, 0x9151, 0x9151, 0x4DDA, 0x9152, 0x9152, 0x08F5,
- 0x9153, 0x9156, 0x4DDB, 0x9157, 0x9157, 0x0FBA, 0x9158, 0x9159, 0x4DDF,
- 0x915A, 0x915A, 0x0670, 0x915B, 0x915C, 0x4DE1, 0x915D, 0x915D, 0x1110,
- 0x915E, 0x915E, 0x0DFD, 0x915F, 0x9160, 0x4DE3, 0x9161, 0x9161, 0x1CFE,
- 0x9162, 0x9162, 0x1CFD, 0x9163, 0x9163, 0x075F, 0x9164, 0x9164, 0x1CFC,
- 0x9165, 0x9165, 0x0DCB, 0x9166, 0x9168, 0x4DE5, 0x9169, 0x9169, 0x1D00,
- 0x916A, 0x916A, 0x09BD, 0x916B, 0x916B, 0x4DE8, 0x916C, 0x916C, 0x050F,
- 0x916D, 0x916D, 0x4DE9, 0x916E, 0x916E, 0x0E5B, 0x916F, 0x916F, 0x1D01,
- 0x9170, 0x9170, 0x1CFF, 0x9171, 0x9171, 0x0885, 0x9172, 0x9172, 0x1D04,
- 0x9173, 0x9173, 0x4DEA, 0x9174, 0x9174, 0x1D05, 0x9175, 0x9175, 0x089E,
- 0x9176, 0x9176, 0x0ABD, 0x9177, 0x9177, 0x096E, 0x9178, 0x9178, 0x0DD6,
- 0x9179, 0x9179, 0x1D06, 0x917A, 0x917C, 0x4DEB, 0x917D, 0x917E, 0x1D02,
- 0x917F, 0x917F, 0x0B53, 0x9180, 0x9184, 0x4DEE, 0x9185, 0x9185, 0x1D08,
- 0x9186, 0x9186, 0x4DF3, 0x9187, 0x9187, 0x053F, 0x9188, 0x9188, 0x4DF4,
- 0x9189, 0x9189, 0x124A, 0x918A, 0x918A, 0x4DF5, 0x918B, 0x918B, 0x055A,
- 0x918C, 0x918C, 0x1D07, 0x918D, 0x918D, 0x1D0A, 0x918E, 0x918F, 0x4DF6,
- 0x9190, 0x9190, 0x1D09, 0x9191, 0x9191, 0x1D0B, 0x9192, 0x9192, 0x0F9C,
- 0x9193, 0x9195, 0x4DF8, 0x9196, 0x9196, 0x2255, 0x9197, 0x9199, 0x4DFB,
- 0x919A, 0x919A, 0x0AD6, 0x919B, 0x919B, 0x0C84, 0x919C, 0x919C, 0x1E8F,
- 0x919D, 0x91A1, 0x4DFE, 0x91A2, 0x91A3, 0x1D0C, 0x91A4, 0x91A9, 0x4E03,
- 0x91AA, 0x91AA, 0x1D0E, 0x91AB, 0x91AB, 0x220C, 0x91AC, 0x91AC, 0x1FA4,
- 0x91AD, 0x91AF, 0x1D0F, 0x91B0, 0x91B3, 0x4E09, 0x91B4, 0x91B4, 0x1D13,
- 0x91B5, 0x91B5, 0x1D12, 0x91B6, 0x91B9, 0x4E0D, 0x91BA, 0x91BA, 0x1D14,
- 0x91BB, 0x91BF, 0x4E11, 0x91C0, 0x91C0, 0x209B, 0x91C1, 0x91C1, 0x21D8,
- 0x91C2, 0x91C2, 0x4E16, 0x91C3, 0x91C3, 0x25FA, 0x91C4, 0x91C4, 0x4E17,
- 0x91C5, 0x91C5, 0x25F9, 0x91C6, 0x91C6, 0x4E18, 0x91C7, 0x91C7, 0x0490,
- 0x91C8, 0x91C8, 0x4E19, 0x91C9, 0x91C9, 0x10B9, 0x91CA, 0x91CA, 0x0D64,
- 0x91CB, 0x91CB, 0x2134, 0x91CC, 0x91CC, 0x09DA, 0x91CD, 0x91CD, 0x11D7,
- 0x91CE, 0x91CE, 0x1037, 0x91CF, 0x91CF, 0x0A08, 0x91D0, 0x91D0, 0x4E1A,
- 0x91D1, 0x91D1, 0x08C1, 0x91D2, 0x91D4, 0x24F3, 0x91D5, 0x91D5, 0x24F8,
- 0x91D6, 0x91D6, 0x4E1B, 0x91D7, 0x91D7, 0x24F7, 0x91D8, 0x91D8, 0x1EC8,
- 0x91D9, 0x91D9, 0x24F6, 0x91DA, 0x91DB, 0x4E1C, 0x91DC, 0x91DC, 0x06A5,
- 0x91DD, 0x91DD, 0x2280, 0x91DE, 0x91E2, 0x4E1E, 0x91E3, 0x91E3, 0x1EC5,
- 0x91E4, 0x91E4, 0x24FB, 0x91E5, 0x91E6, 0x4E23, 0x91E7, 0x91E7, 0x24FA,
- 0x91E8, 0x91E8, 0x4E25, 0x91E9, 0x91E9, 0x1EED, 0x91EA, 0x91F4, 0x4E26,
- 0x91F5, 0x91F5, 0x24FD, 0x91F6, 0x91F6, 0x4E31, 0x91F7, 0x91F7, 0x24F9,
- 0x91F8, 0x91F8, 0x4E32, 0x91F9, 0x91F9, 0x24FE, 0x91FA, 0x91FA, 0x20CD,
- 0x91FB, 0x91FF, 0x4E33, 0x9200, 0x9200, 0x2508, 0x9201, 0x9201, 0x2504,
- 0x9202, 0x9203, 0x4E38, 0x9204, 0x9204, 0x2506, 0x9205, 0x9207, 0x4E3A,
- 0x9208, 0x9208, 0x24FF, 0x9209, 0x9209, 0x2090, 0x920A, 0x920C, 0x4E3D,
- 0x920D, 0x920D, 0x1EDD, 0x920E, 0x920E, 0x1F25, 0x920F, 0x920F, 0x4E40,
- 0x9210, 0x9210, 0x2503, 0x9211, 0x9211, 0x2502, 0x9212, 0x9213, 0x4E41,
- 0x9214, 0x9214, 0x1E7A, 0x9215, 0x9215, 0x20A6, 0x9216, 0x921D, 0x4E43,
- 0x921E, 0x921E, 0x1FD5, 0x921F, 0x9222, 0x4E4B, 0x9223, 0x9223, 0x1F11,
- 0x9224, 0x9224, 0x4E4F, 0x9225, 0x9225, 0x2507, 0x9226, 0x9226, 0x2500,
- 0x9227, 0x9227, 0x2505, 0x9228, 0x922D, 0x4E50, 0x922E, 0x922E, 0x2519,
- 0x922F, 0x922F, 0x4E56, 0x9230, 0x9230, 0x2515, 0x9231, 0x9232, 0x4E57,
- 0x9233, 0x9233, 0x250C, 0x9234, 0x9234, 0x2031, 0x9235, 0x9236, 0x4E59,
- 0x9237, 0x9237, 0x250B, 0x9238, 0x9238, 0x250F, 0x9239, 0x9239, 0x251A,
- 0x923A, 0x923A, 0x2509, 0x923B, 0x923C, 0x4E5B, 0x923D, 0x923D, 0x250E,
- 0x923E, 0x923E, 0x2234, 0x923F, 0x923F, 0x2513, 0x9240, 0x9240, 0x1F80,
- 0x9241, 0x9244, 0x4E5D, 0x9245, 0x9245, 0x2501, 0x9246, 0x9247, 0x4E61,
- 0x9248, 0x9248, 0x2517, 0x9249, 0x9249, 0x2516, 0x924A, 0x924C, 0x4E63,
- 0x924D, 0x924D, 0x2518, 0x924E, 0x9250, 0x4E66, 0x9251, 0x9251, 0x1E56,
- 0x9252, 0x9254, 0x4E69, 0x9255, 0x9255, 0x250D, 0x9256, 0x9256, 0x4E6C,
- 0x9257, 0x9257, 0x20D3, 0x9258, 0x9259, 0x4E6D, 0x925A, 0x925A, 0x207A,
- 0x925B, 0x925B, 0x20CE, 0x925C, 0x925D, 0x4E6F, 0x925E, 0x925E, 0x2510,
- 0x925F, 0x9261, 0x4E71, 0x9262, 0x9262, 0x1E55, 0x9263, 0x9265, 0x4E74,
- 0x9266, 0x9266, 0x250A, 0x9267, 0x926B, 0x4E77, 0x926C, 0x926D, 0x2511,
- 0x926E, 0x9273, 0x4E7C, 0x9274, 0x9274, 0x086B, 0x9275, 0x9277, 0x4E82,
- 0x9278, 0x9278, 0x1FAA, 0x9279, 0x9279, 0x4E85, 0x927A, 0x927A, 0x251E,
- 0x927B, 0x927B, 0x1F1F, 0x927C, 0x927E, 0x4E86, 0x927F, 0x927F, 0x252D,
- 0x9280, 0x9280, 0x221D, 0x9281, 0x9282, 0x4E89, 0x9283, 0x9283, 0x2532,
- 0x9284, 0x9284, 0x4E8B, 0x9285, 0x9285, 0x217B, 0x9286, 0x928D, 0x4E8C,
- 0x928E, 0x928E, 0x1D80, 0x928F, 0x9290, 0x4E94, 0x9291, 0x9291, 0x21AF,
- 0x9292, 0x9292, 0x4E96, 0x9293, 0x9293, 0x252C, 0x9294, 0x9295, 0x4E97,
- 0x9296, 0x9296, 0x2528, 0x9297, 0x9297, 0x4E99, 0x9298, 0x9298, 0x208C,
- 0x9299, 0x9299, 0x4E9A, 0x929A, 0x929A, 0x252F, 0x929B, 0x929B, 0x4E9B,
- 0x929C, 0x929C, 0x21BC, 0x929D, 0x929F, 0x4E9C, 0x92A0, 0x92A0, 0x251D,
- 0x92A1, 0x92A2, 0x4E9F, 0x92A3, 0x92A3, 0x2535, 0x92A4, 0x92A4, 0x4EA1,
- 0x92A5, 0x92A5, 0x220D, 0x92A6, 0x92A6, 0x2526, 0x92A7, 0x92A7, 0x4EA2,
- 0x92A8, 0x92A8, 0x2534, 0x92A9, 0x92A9, 0x252A, 0x92AA, 0x92AA, 0x251F,
- 0x92AB, 0x92AB, 0x2531, 0x92AC, 0x92AC, 0x251C, 0x92AD, 0x92AD, 0x4EA3,
- 0x92AE, 0x92AE, 0x1D81, 0x92AF, 0x92B0, 0x4EA4, 0x92B1, 0x92B1, 0x2525,
- 0x92B2, 0x92B6, 0x4EA6, 0x92B7, 0x92B7, 0x21CD, 0x92B8, 0x92B8, 0x4EAB,
- 0x92B9, 0x92B9, 0x21DA, 0x92BA, 0x92BA, 0x4EAC, 0x92BB, 0x92BB, 0x2172,
- 0x92BC, 0x92BC, 0x253E, 0x92BD, 0x92C0, 0x4EAD, 0x92C1, 0x92C1, 0x204F,
- 0x92C2, 0x92C2, 0x4EB1, 0x92C3, 0x92C3, 0x2543, 0x92C4, 0x92C4, 0x4EB2,
- 0x92C5, 0x92C5, 0x21D7, 0x92C6, 0x92C6, 0x4EB3, 0x92C7, 0x92C7, 0x1E3C,
- 0x92C8, 0x92C8, 0x1D82, 0x92C9, 0x92CB, 0x4EB4, 0x92CC, 0x92CC, 0x2529,
- 0x92CD, 0x92CE, 0x4EB7, 0x92CF, 0x92CF, 0x2521, 0x92D0, 0x92D1, 0x4EB9,
- 0x92D2, 0x92D2, 0x1EFF, 0x92D3, 0x92DC, 0x4EBB, 0x92DD, 0x92DD, 0x253F,
- 0x92DE, 0x92DE, 0x4EC5, 0x92DF, 0x92DF, 0x2544, 0x92E0, 0x92E2, 0x4EC6,
- 0x92E3, 0x92E3, 0x2523, 0x92E4, 0x92E4, 0x1E90, 0x92E5, 0x92E5, 0x253A,
- 0x92E6, 0x92E6, 0x2545, 0x92E7, 0x92E7, 0x4EC9, 0x92E8, 0x92E8, 0x253D,
- 0x92E9, 0x92E9, 0x4ECA, 0x92EA, 0x92EA, 0x20C1, 0x92EB, 0x92EC, 0x4ECB,
- 0x92ED, 0x92ED, 0x2103, 0x92EE, 0x92EE, 0x2520, 0x92EF, 0x92EF, 0x253C,
- 0x92F0, 0x92F0, 0x253B, 0x92F1, 0x92F1, 0x2538, 0x92F2, 0x92F5, 0x4ECD,
- 0x92F6, 0x92F6, 0x2540, 0x92F7, 0x92F7, 0x4ED1, 0x92F8, 0x92F8, 0x1FCD,
- 0x92F9, 0x92FB, 0x4ED2, 0x92FC, 0x92FC, 0x1F18, 0x92FD, 0x92FF, 0x4ED5,
- 0x9300, 0x9300, 0x4ED8, 0x9301, 0x9301, 0x254B, 0x9302, 0x9305, 0x4ED9,
- 0x9306, 0x9306, 0x2547, 0x9307, 0x9308, 0x254F, 0x9309, 0x930F, 0x4EDD,
- 0x9310, 0x9310, 0x22B0, 0x9311, 0x9311, 0x4EE4, 0x9312, 0x9312, 0x2546,
- 0x9313, 0x9314, 0x4EE5, 0x9315, 0x9315, 0x254C, 0x9316, 0x9317, 0x4EE7,
- 0x9318, 0x9318, 0x1E9A, 0x9319, 0x9319, 0x2552, 0x931A, 0x931A, 0x2530,
- 0x931B, 0x931B, 0x2549, 0x931C, 0x931E, 0x4EE9, 0x931F, 0x931F, 0x2551,
- 0x9320, 0x9320, 0x1ECA, 0x9321, 0x9321, 0x4EEC, 0x9322, 0x9322, 0x20D2,
- 0x9323, 0x9325, 0x4EED, 0x9326, 0x9326, 0x1FB8, 0x9327, 0x9327, 0x4EF0,
- 0x9328, 0x9328, 0x2079, 0x9329, 0x932A, 0x4EF1, 0x932B, 0x932B, 0x21AB,
- 0x932C, 0x932D, 0x4EF3, 0x932E, 0x932E, 0x254D, 0x932F, 0x932F, 0x1EA5,
- 0x9330, 0x9331, 0x4EF5, 0x9332, 0x9332, 0x204C, 0x9333, 0x9333, 0x2080,
- 0x9334, 0x9335, 0x4EF7, 0x9336, 0x9336, 0x266D, 0x9337, 0x9337, 0x4EF9,
- 0x9338, 0x9338, 0x2537, 0x9339, 0x933D, 0x4EFA, 0x933E, 0x933E, 0x1D83,
- 0x933F, 0x933F, 0x4EFF, 0x9340, 0x9340, 0x254A, 0x9341, 0x9341, 0x21B8,
- 0x9342, 0x9342, 0x4F00, 0x9343, 0x9343, 0x254E, 0x9344, 0x9345, 0x4F01,
- 0x9346, 0x9346, 0x24FC, 0x9347, 0x9347, 0x2554, 0x9348, 0x934A, 0x4F03,
- 0x934B, 0x934B, 0x1F3C, 0x934C, 0x934C, 0x4F06, 0x934D, 0x934D, 0x1ED5,
- 0x934E, 0x9353, 0x4F07, 0x9354, 0x9354, 0x2556, 0x9355, 0x9357, 0x4F0D,
- 0x9358, 0x9358, 0x2268, 0x9359, 0x935A, 0x4F10, 0x935B, 0x935B, 0x1ED6,
- 0x935C, 0x9363, 0x4F12, 0x9364, 0x9364, 0x2557, 0x9365, 0x9365, 0x2553,
- 0x9366, 0x9368, 0x4F1A, 0x9369, 0x9369, 0x2548, 0x936A, 0x936A, 0x1D84,
- 0x936B, 0x936B, 0x4F1D, 0x936C, 0x936C, 0x20DC, 0x936D, 0x936F, 0x4F1E,
- 0x9370, 0x9370, 0x2559, 0x9371, 0x9374, 0x4F21, 0x9375, 0x9375, 0x1F97,
- 0x9376, 0x9376, 0x2555, 0x9377, 0x9379, 0x4F25, 0x937A, 0x937A, 0x227D,
- 0x937B, 0x937D, 0x4F28, 0x937E, 0x937E, 0x257E, 0x937F, 0x9381, 0x4F2B,
- 0x9382, 0x9382, 0x207C, 0x9383, 0x9383, 0x4F2E, 0x9384, 0x9384, 0x255A,
- 0x9385, 0x9386, 0x4F2F, 0x9387, 0x9387, 0x255E, 0x9388, 0x9389, 0x4F31,
- 0x938A, 0x938A, 0x1E34, 0x938B, 0x938E, 0x4F33, 0x938F, 0x938F, 0x1D86,
- 0x9390, 0x9395, 0x4F37, 0x9396, 0x9396, 0x215E, 0x9397, 0x9397, 0x4F3D,
- 0x9398, 0x9398, 0x2560, 0x9399, 0x93A1, 0x4F3E, 0x93A2, 0x93A2, 0x21A2,
- 0x93A3, 0x93A3, 0x2354, 0x93A4, 0x93A5, 0x4F47, 0x93A6, 0x93A6, 0x2563,
- 0x93A7, 0x93A7, 0x2527, 0x93A8, 0x93A8, 0x4F49, 0x93A9, 0x93A9, 0x252E,
- 0x93AA, 0x93AA, 0x2558, 0x93AB, 0x93AB, 0x4F4A, 0x93AC, 0x93AC, 0x1F1B,
- 0x93AD, 0x93AD, 0x4F4B, 0x93AE, 0x93AE, 0x2283, 0x93AF, 0x93AF, 0x4F4C,
- 0x93B0, 0x93B0, 0x2564, 0x93B1, 0x93B2, 0x4F4D, 0x93B3, 0x93B3, 0x20A0,
- 0x93B4, 0x93B4, 0x4F4F, 0x93B5, 0x93B5, 0x2565, 0x93B6, 0x93B7, 0x4F50,
- 0x93B8, 0x93B8, 0x2561, 0x93B9, 0x93BE, 0x4F52, 0x93BF, 0x93BF, 0x2562,
- 0x93C0, 0x93C2, 0x4F58, 0x93C3, 0x93C3, 0x256C, 0x93C4, 0x93C6, 0x4F5B,
- 0x93C7, 0x93C7, 0x256D, 0x93C8, 0x93C8, 0x2020, 0x93C9, 0x93C9, 0x4F5E,
- 0x93CA, 0x93CA, 0x1D85, 0x93CB, 0x93CB, 0x4F5F, 0x93CC, 0x93CC, 0x255F,
- 0x93CD, 0x93CD, 0x256A, 0x93CE, 0x93D0, 0x4F60, 0x93D1, 0x93D1, 0x256E,
- 0x93D2, 0x93D5, 0x4F63, 0x93D6, 0x93D6, 0x1E01, 0x93D7, 0x93D7, 0x2539,
- 0x93D8, 0x93D8, 0x255C, 0x93D9, 0x93DB, 0x4F67, 0x93DC, 0x93DD, 0x2568,
- 0x93DE, 0x93DE, 0x256B, 0x93DF, 0x93DF, 0x1E6F, 0x93E0, 0x93E0, 0x4F6A,
- 0x93E1, 0x93E1, 0x1FC4, 0x93E2, 0x93E2, 0x2567, 0x93E3, 0x93E3, 0x4F6B,
- 0x93E4, 0x93E4, 0x255B, 0x93E5, 0x93E7, 0x4F6C, 0x93E8, 0x93E8, 0x261D,
- 0x93E9, 0x93F4, 0x4F6F, 0x93F5, 0x93F5, 0x252B, 0x93F6, 0x93F6, 0x4F7B,
- 0x93F7, 0x93F7, 0x2571, 0x93F8, 0x93F8, 0x4F7C, 0x93F9, 0x93F9, 0x2577,
- 0x93FA, 0x93FF, 0x4F7D, 0x9400, 0x9402, 0x4F83, 0x9403, 0x9403, 0x2522,
- 0x9404, 0x940A, 0x4F86, 0x940B, 0x940B, 0x2533, 0x940C, 0x940F, 0x4F8D,
- 0x9410, 0x9410, 0x202A, 0x9411, 0x9411, 0x4F91, 0x9412, 0x9412, 0x2536,
- 0x9413, 0x9413, 0x2573, 0x9414, 0x9414, 0x256F, 0x9415, 0x9417, 0x4F92,
- 0x9418, 0x9418, 0x2293, 0x9419, 0x9419, 0x2578, 0x941A, 0x941C, 0x4F95,
- 0x941D, 0x941D, 0x2570, 0x941E, 0x941F, 0x4F98, 0x9420, 0x9420, 0x2575,
- 0x9421, 0x9425, 0x4F9A, 0x9426, 0x9427, 0x2541, 0x9428, 0x9428, 0x255D,
- 0x9429, 0x942D, 0x4F9F, 0x942E, 0x942E, 0x201A, 0x942F, 0x9431, 0x4FA4,
- 0x9432, 0x9432, 0x257A, 0x9433, 0x9433, 0x2006, 0x9434, 0x9434, 0x4FA7,
- 0x9435, 0x9435, 0x2177, 0x9436, 0x9437, 0x4FA8, 0x9438, 0x9438, 0x251B,
- 0x9439, 0x9439, 0x4FAA, 0x943A, 0x943A, 0x2524, 0x943B, 0x943D, 0x4FAB,
- 0x943E, 0x943E, 0x1D87, 0x943F, 0x943F, 0x257B, 0x9440, 0x9443, 0x4FAE,
- 0x9444, 0x9444, 0x22A3, 0x9445, 0x9449, 0x4FB2, 0x944A, 0x944A, 0x2579,
- 0x944B, 0x944B, 0x4FB7, 0x944C, 0x944C, 0x2566, 0x944D, 0x9451, 0x4FB8,
- 0x9452, 0x9452, 0x1F93, 0x9453, 0x9453, 0x4FBD, 0x9454, 0x9454, 0x257C,
- 0x9455, 0x945F, 0x4FBE, 0x9460, 0x9460, 0x2514, 0x9461, 0x9462, 0x4FC9,
- 0x9463, 0x9463, 0x257D, 0x9464, 0x9464, 0x4FCB, 0x9465, 0x9465, 0x2572,
- 0x9466, 0x946A, 0x4FCC, 0x946B, 0x946B, 0x1D88, 0x946C, 0x946C, 0x4FD1,
- 0x946D, 0x946D, 0x2574, 0x946E, 0x946F, 0x4FD2, 0x9470, 0x9470, 0x224E,
- 0x9471, 0x9471, 0x4FD4, 0x9472, 0x9472, 0x21C6, 0x9473, 0x9476, 0x4FD5,
- 0x9477, 0x9477, 0x209F, 0x9478, 0x9478, 0x4FD9, 0x9479, 0x9479, 0x2576,
- 0x947A, 0x947B, 0x4FDA, 0x947C, 0x947C, 0x2064, 0x947D, 0x947D, 0x22BF,
- 0x947E, 0x947E, 0x261C, 0x947F, 0x947F, 0x225E, 0x9480, 0x9484, 0x4FDC,
- 0x9485, 0x9487, 0x1A8E, 0x9488, 0x9488, 0x118C, 0x9489, 0x9489, 0x05E3,
- 0x948A, 0x948A, 0x1A92, 0x948B, 0x948B, 0x1A91, 0x948C, 0x948D, 0x1A93,
- 0x948E, 0x948E, 0x0C22, 0x948F, 0x9490, 0x1A95, 0x9491, 0x9491, 0x4FE1,
- 0x9492, 0x9492, 0x064D, 0x9493, 0x9493, 0x05D7, 0x9494, 0x9494, 0x1A97,
- 0x9495, 0x9495, 0x1A99, 0x9496, 0x9496, 0x4FE2, 0x9497, 0x9497, 0x1A98,
- 0x9498, 0x9498, 0x4FE3, 0x9499, 0x9499, 0x06C1, 0x949A, 0x949C, 0x1A9A,
- 0x949D, 0x949D, 0x061A, 0x949E, 0x949E, 0x04D3, 0x949F, 0x949F, 0x11D2,
- 0x94A0, 0x94A0, 0x0B29, 0x94A1, 0x94A1, 0x041E, 0x94A2, 0x94A2, 0x06D1,
- 0x94A3, 0x94A4, 0x1A9D, 0x94A5, 0x94A5, 0x1102, 0x94A6, 0x94A6, 0x0C52,
- 0x94A7, 0x94A7, 0x092A, 0x94A8, 0x94A8, 0x0EE8, 0x94A9, 0x94A9, 0x070C,
- 0x94AA, 0x94AA, 0x1AA0, 0x94AB, 0x94AB, 0x1A9F, 0x94AC, 0x94AC, 0x1AA2,
- 0x94AD, 0x94AD, 0x1AA1, 0x94AE, 0x94AE, 0x0B66, 0x94AF, 0x94B0, 0x1AA3,
- 0x94B1, 0x94B1, 0x0C2B, 0x94B2, 0x94B2, 0x1AA5, 0x94B3, 0x94B3, 0x0C2C,
- 0x94B4, 0x94B4, 0x1AA6, 0x94B5, 0x94B5, 0x046E, 0x94B6, 0x94BA, 0x1AA7,
- 0x94BB, 0x94BB, 0x1247, 0x94BC, 0x94BD, 0x1AAC, 0x94BE, 0x94BE, 0x084B,
- 0x94BF, 0x94BF, 0x1AAE, 0x94C0, 0x94C0, 0x10B0, 0x94C1, 0x94C1, 0x0E4D,
- 0x94C2, 0x94C2, 0x0473, 0x94C3, 0x94C3, 0x0A2E, 0x94C4, 0x94C4, 0x1AAF,
- 0x94C5, 0x94C5, 0x0C23, 0x94C6, 0x94C6, 0x0AB2, 0x94C7, 0x94C7, 0x4FE4,
- 0x94C8, 0x94CE, 0x1AB0, 0x94CF, 0x94CF, 0x4FE5, 0x94D0, 0x94D2, 0x1AB7,
- 0x94D3, 0x94D4, 0x4FE6, 0x94D5, 0x94D7, 0x1ABA, 0x94D8, 0x94D8, 0x1ABE,
- 0x94D9, 0x94D9, 0x1ABD, 0x94DA, 0x94DA, 0x4FE8, 0x94DB, 0x94DB, 0x1ABF,
- 0x94DC, 0x94DC, 0x0E5E, 0x94DD, 0x94DD, 0x0A68, 0x94DE, 0x94E0, 0x1AC0,
- 0x94E1, 0x94E1, 0x1142, 0x94E2, 0x94E2, 0x1AC3, 0x94E3, 0x94E3, 0x0F20,
- 0x94E4, 0x94E5, 0x1AC4, 0x94E6, 0x94E6, 0x4FE9, 0x94E7, 0x94E8, 0x1AC6,
- 0x94E9, 0x94E9, 0x1AC9, 0x94EA, 0x94EA, 0x1AC8, 0x94EB, 0x94EB, 0x1ACA,
- 0x94EC, 0x94EC, 0x06F0, 0x94ED, 0x94ED, 0x0AFF, 0x94EE, 0x94EF, 0x1ACB,
- 0x94F0, 0x94F0, 0x0893, 0x94F1, 0x94F1, 0x1046, 0x94F2, 0x94F2, 0x04C0,
- 0x94F3, 0x94F5, 0x1ACD, 0x94F6, 0x94F6, 0x107F, 0x94F7, 0x94F7, 0x1AD0,
- 0x94F8, 0x94F8, 0x11FC, 0x94F9, 0x94F9, 0x1AD1, 0x94FA, 0x94FA, 0x0BEB,
- 0x94FB, 0x94FB, 0x4FEA, 0x94FC, 0x94FD, 0x1AD2, 0x94FE, 0x94FE, 0x09FD,
- 0x94FF, 0x94FF, 0x1AD4, 0x9500, 0x9500, 0x0F67, 0x9501, 0x9501, 0x0DED,
- 0x9502, 0x9502, 0x1AD6, 0x9503, 0x9503, 0x1AD5, 0x9504, 0x9504, 0x051F,
- 0x9505, 0x9505, 0x0751, 0x9506, 0x9507, 0x1AD7, 0x9508, 0x9508, 0x0FAD,
- 0x9509, 0x950A, 0x1AD9, 0x950B, 0x950B, 0x0683, 0x950C, 0x950C, 0x0F8A,
- 0x950D, 0x950F, 0x1ADB, 0x9510, 0x9510, 0x0CCC, 0x9511, 0x9511, 0x0E33,
- 0x9512, 0x9516, 0x1ADE, 0x9517, 0x9517, 0x1181, 0x9518, 0x9518, 0x1AE3,
- 0x9519, 0x9519, 0x0570, 0x951A, 0x951A, 0x0AAF, 0x951B, 0x951B, 0x1AE4,
- 0x951C, 0x951C, 0x4FEB, 0x951D, 0x951F, 0x1AE5, 0x9520, 0x9520, 0x4FEC,
- 0x9521, 0x9521, 0x0F0C, 0x9522, 0x9522, 0x1AE8, 0x9523, 0x9523, 0x0A87,
- 0x9524, 0x9524, 0x053B, 0x9525, 0x9525, 0x1213, 0x9526, 0x9526, 0x08C6,
- 0x9527, 0x9527, 0x4FED, 0x9528, 0x9528, 0x0F34, 0x9529, 0x9529, 0x1AEB,
- 0x952A, 0x952B, 0x1AE9, 0x952C, 0x952C, 0x1AEC, 0x952D, 0x952D, 0x05E6,
- 0x952E, 0x952E, 0x086F, 0x952F, 0x952F, 0x0911, 0x9530, 0x9530, 0x0AD1,
- 0x9531, 0x9532, 0x1AED, 0x9533, 0x9533, 0x4FEE, 0x9534, 0x9534, 0x1AEF,
- 0x9535, 0x9535, 0x1AF7, 0x9536, 0x9538, 0x1AF0, 0x9539, 0x9539, 0x0C3F,
- 0x953A, 0x953A, 0x1B19, 0x953B, 0x953B, 0x060C, 0x953C, 0x953C, 0x1AF3,
- 0x953D, 0x953D, 0x4FEF, 0x953E, 0x953F, 0x1AF4, 0x9540, 0x9540, 0x0605,
- 0x9541, 0x9541, 0x0AC3, 0x9542, 0x9542, 0x1AF6, 0x9543, 0x9543, 0x4FF0,
- 0x9544, 0x9546, 0x1AF8, 0x9547, 0x9547, 0x1193, 0x9548, 0x9548, 0x4FF1,
- 0x9549, 0x9549, 0x1AFB, 0x954A, 0x954A, 0x0B5A, 0x954B, 0x954B, 0x4FF2,
- 0x954C, 0x954C, 0x1AFC, 0x954D, 0x954D, 0x0B5B, 0x954E, 0x954F, 0x1AFD,
- 0x9550, 0x9550, 0x06DF, 0x9551, 0x9551, 0x0402, 0x9552, 0x9554, 0x1AFF,
- 0x9555, 0x9555, 0x4FF3, 0x9556, 0x9559, 0x1B02, 0x955A, 0x955A, 0x4FF4,
- 0x955B, 0x955B, 0x1B06, 0x955C, 0x955C, 0x08E4, 0x955D, 0x955D, 0x1B09,
- 0x955E, 0x955F, 0x1B07, 0x9560, 0x9560, 0x4FF5, 0x9561, 0x9562, 0x1B0A,
- 0x9563, 0x9563, 0x0A16, 0x9564, 0x956C, 0x1B0C, 0x956D, 0x956D, 0x09C3,
- 0x956E, 0x956E, 0x4FF6, 0x956F, 0x956F, 0x1B15, 0x9570, 0x9570, 0x09F6,
- 0x9571, 0x9573, 0x1B16, 0x9574, 0x9575, 0x4FF7, 0x9576, 0x9576, 0x0F4F,
- 0x9577, 0x9577, 0x1E75, 0x9578, 0x957E, 0x4FF9, 0x957F, 0x957F, 0x04C9,
- 0x9580, 0x9580, 0x207D, 0x9581, 0x9581, 0x5000, 0x9582, 0x9582, 0x23BF,
- 0x9583, 0x9583, 0x2113, 0x9584, 0x9585, 0x5001, 0x9586, 0x9586, 0x23C0,
- 0x9587, 0x9588, 0x5003, 0x9589, 0x9589, 0x1E45, 0x958A, 0x958A, 0x5005,
- 0x958B, 0x958B, 0x1FD8, 0x958C, 0x958C, 0x23C4, 0x958D, 0x958D, 0x5006,
- 0x958E, 0x958E, 0x23C2, 0x958F, 0x958F, 0x2104, 0x9590, 0x9590, 0x5007,
- 0x9591, 0x9591, 0x21BD, 0x9592, 0x9592, 0x5008, 0x9593, 0x9593, 0x1F87,
- 0x9594, 0x9594, 0x23C3, 0x9595, 0x9597, 0x5009, 0x9598, 0x9598, 0x2269,
- 0x9599, 0x95A0, 0x500C, 0x95A1, 0x95A1, 0x1F43, 0x95A2, 0x95A2, 0x5014,
- 0x95A3, 0x95A3, 0x1F1E, 0x95A4, 0x95A4, 0x2679, 0x95A5, 0x95A5, 0x1EEB,
- 0x95A6, 0x95A7, 0x5015, 0x95A8, 0x95A8, 0x1F35, 0x95A9, 0x95A9, 0x208A,
- 0x95AA, 0x95AA, 0x5017, 0x95AB, 0x95AB, 0x23C7, 0x95AC, 0x95AC, 0x23C9,
- 0x95AD, 0x95AD, 0x23C6, 0x95AE, 0x95B1, 0x5018, 0x95B2, 0x95B2, 0x224F,
- 0x95B3, 0x95B5, 0x501C, 0x95B6, 0x95B6, 0x23CB, 0x95B7, 0x95B8, 0x501F,
- 0x95B9, 0x95B9, 0x21F3, 0x95BA, 0x95BA, 0x5021, 0x95BB, 0x95BB, 0x21F7,
- 0x95BC, 0x95BC, 0x23CF, 0x95BD, 0x95BD, 0x23CE, 0x95BE, 0x95BE, 0x23CA,
- 0x95BF, 0x95BF, 0x23CD, 0x95C0, 0x95C2, 0x5022, 0x95C3, 0x95C3, 0x23D0,
- 0x95C4, 0x95C5, 0x5025, 0x95C6, 0x95C6, 0x266C, 0x95C7, 0x95C7, 0x5027,
- 0x95C8, 0x95C8, 0x23C1, 0x95C9, 0x95C9, 0x5028, 0x95CA, 0x95CA, 0x1FEE,
- 0x95CB, 0x95CB, 0x23D1, 0x95CC, 0x95CC, 0x1FF8, 0x95CD, 0x95CF, 0x5029,
- 0x95D0, 0x95D0, 0x23D3, 0x95D1, 0x95D3, 0x502C, 0x95D4, 0x95D4, 0x23D2,
- 0x95D5, 0x95D5, 0x23D4, 0x95D6, 0x95D6, 0x1E98, 0x95D7, 0x95DB, 0x502F,
- 0x95DC, 0x95DC, 0x1F2C, 0x95DD, 0x95DD, 0x5034, 0x95DE, 0x95DE, 0x23D5,
- 0x95DF, 0x95E0, 0x5035, 0x95E1, 0x95E1, 0x1E71, 0x95E2, 0x95E2, 0x2691,
- 0x95E3, 0x95E4, 0x5037, 0x95E5, 0x95E5, 0x23C5, 0x95E6, 0x95E7, 0x5039,
- 0x95E8, 0x95E8, 0x0ACA, 0x95E9, 0x95E9, 0x1685, 0x95EA, 0x95EA, 0x0CFA,
- 0x95EB, 0x95EB, 0x1686, 0x95EC, 0x95EC, 0x503B, 0x95ED, 0x95ED, 0x043E,
- 0x95EE, 0x95EE, 0x0ED9, 0x95EF, 0x95EF, 0x0536, 0x95F0, 0x95F0, 0x0CCD,
- 0x95F1, 0x95F1, 0x1687, 0x95F2, 0x95F2, 0x0F3D, 0x95F3, 0x95F3, 0x1688,
- 0x95F4, 0x95F4, 0x0857, 0x95F5, 0x95F6, 0x1689, 0x95F7, 0x95F7, 0x0ACB,
- 0x95F8, 0x95F8, 0x1143, 0x95F9, 0x95F9, 0x0B39, 0x95FA, 0x95FA, 0x0744,
- 0x95FB, 0x95FB, 0x0ED4, 0x95FC, 0x95FC, 0x168B, 0x95FD, 0x95FD, 0x0AFB,
- 0x95FE, 0x95FE, 0x168C, 0x95FF, 0x95FF, 0x503C, 0x9600, 0x9600, 0x0644,
- 0x9601, 0x9601, 0x06EE, 0x9602, 0x9602, 0x0789, 0x9603, 0x9604, 0x168D,
- 0x9605, 0x9605, 0x1107, 0x9606, 0x9606, 0x168F, 0x9607, 0x9607, 0x503D,
- 0x9608, 0x9608, 0x1690, 0x9609, 0x9609, 0x0FF4, 0x960A, 0x960D, 0x1691,
- 0x960E, 0x960E, 0x0FFF, 0x960F, 0x960F, 0x1695, 0x9610, 0x9610, 0x04C2,
- 0x9611, 0x9611, 0x09A6, 0x9612, 0x9612, 0x1696, 0x9613, 0x9613, 0x503E,
- 0x9614, 0x9614, 0x0996, 0x9615, 0x9617, 0x1697, 0x9618, 0x9618, 0x503F,
- 0x9619, 0x961A, 0x169A, 0x961B, 0x961B, 0x5040, 0x961C, 0x961C, 0x06B2,
- 0x961D, 0x961D, 0x1354, 0x961E, 0x961E, 0x5041, 0x961F, 0x961F, 0x0612,
- 0x9620, 0x9620, 0x5042, 0x9621, 0x9621, 0x1356, 0x9622, 0x9622, 0x1355,
- 0x9623, 0x9629, 0x5043, 0x962A, 0x962A, 0x1358, 0x962B, 0x962D, 0x504A,
- 0x962E, 0x962E, 0x0CC9, 0x962F, 0x9630, 0x504D, 0x9631, 0x9631, 0x1357,
- 0x9632, 0x9632, 0x065D, 0x9633, 0x9633, 0x101D, 0x9634, 0x9634, 0x107C,
- 0x9635, 0x9635, 0x1194, 0x9636, 0x9636, 0x08A8, 0x9637, 0x963A, 0x504F,
- 0x963B, 0x963B, 0x1245, 0x963C, 0x963C, 0x135A, 0x963D, 0x963D, 0x1359,
- 0x963E, 0x963E, 0x5053, 0x963F, 0x963F, 0x03AD, 0x9640, 0x9640, 0x0E84,
- 0x9641, 0x9641, 0x5054, 0x9642, 0x9642, 0x135B, 0x9643, 0x9643, 0x5055,
- 0x9644, 0x9644, 0x06B8, 0x9645, 0x9645, 0x083D, 0x9646, 0x9646, 0x0A64,
- 0x9647, 0x9647, 0x0A4B, 0x9648, 0x9648, 0x04E7, 0x9649, 0x9649, 0x135C,
- 0x964A, 0x964A, 0x5056, 0x964B, 0x964B, 0x0A51, 0x964C, 0x964C, 0x0B13,
- 0x964D, 0x964D, 0x0886, 0x964E, 0x964F, 0x5057, 0x9650, 0x9650, 0x0F4B,
- 0x9651, 0x9653, 0x5059, 0x9654, 0x9654, 0x135D, 0x9655, 0x9655, 0x0CFB,
- 0x9656, 0x9657, 0x505C, 0x9658, 0x9658, 0x231A, 0x9659, 0x965A, 0x505E,
- 0x965B, 0x965B, 0x0446, 0x965C, 0x965C, 0x5060, 0x965D, 0x965D, 0x2114,
- 0x965E, 0x965E, 0x5061, 0x965F, 0x965F, 0x135E, 0x9660, 0x9660, 0x5062,
- 0x9661, 0x9661, 0x05F7, 0x9662, 0x9662, 0x10FD, 0x9663, 0x9663, 0x2284,
- 0x9664, 0x9664, 0x0522, 0x9665, 0x9666, 0x5063, 0x9667, 0x9667, 0x135F,
- 0x9668, 0x9668, 0x110C, 0x9669, 0x9669, 0x0F42, 0x966A, 0x966A, 0x0BA4,
- 0x966B, 0x966B, 0x5065, 0x966C, 0x966C, 0x1360, 0x966D, 0x966F, 0x5066,
- 0x9670, 0x9670, 0x221C, 0x9671, 0x9671, 0x5069, 0x9672, 0x9672, 0x1361,
- 0x9673, 0x9673, 0x1E7E, 0x9674, 0x9674, 0x1362, 0x9675, 0x9675, 0x0A33,
- 0x9676, 0x9676, 0x0E28, 0x9677, 0x9677, 0x0F4A, 0x9678, 0x9678, 0x204D,
- 0x9679, 0x967C, 0x506A, 0x967D, 0x967D, 0x2201, 0x967E, 0x9684, 0x506E,
- 0x9685, 0x9685, 0x10CC, 0x9686, 0x9686, 0x0A48, 0x9687, 0x9687, 0x5075,
- 0x9688, 0x9688, 0x1363, 0x9689, 0x9689, 0x5076, 0x968A, 0x968A, 0x1ED9,
- 0x968B, 0x968B, 0x0DDA, 0x968C, 0x968C, 0x5077, 0x968D, 0x968D, 0x1364,
- 0x968E, 0x968E, 0x1FB2, 0x968F, 0x968F, 0x0DDB, 0x9690, 0x9690, 0x1085,
- 0x9691, 0x9693, 0x5078, 0x9694, 0x9694, 0x06EF, 0x9695, 0x9695, 0x2252,
- 0x9696, 0x9696, 0x507B, 0x9697, 0x9697, 0x1365, 0x9698, 0x9698, 0x03BA,
- 0x9699, 0x9699, 0x0F23, 0x969A, 0x969A, 0x507C, 0x969B, 0x969B, 0x1F79,
- 0x969C, 0x969C, 0x1170, 0x969D, 0x96A6, 0x507D, 0x96A7, 0x96A7, 0x0DE2,
- 0x96A8, 0x96A8, 0x2157, 0x96A9, 0x96A9, 0x5087, 0x96AA, 0x96AA, 0x21BF,
- 0x96AB, 0x96AF, 0x5088, 0x96B0, 0x96B0, 0x1366, 0x96B1, 0x96B1, 0x221F,
- 0x96B2, 0x96B2, 0x508D, 0x96B3, 0x96B3, 0x1684, 0x96B4, 0x96B4, 0x203D,
- 0x96B5, 0x96B5, 0x508E, 0x96B6, 0x96B6, 0x09EE, 0x96B7, 0x96B7, 0x508F,
- 0x96B8, 0x96B8, 0x2015, 0x96B9, 0x96B9, 0x1D79, 0x96BA, 0x96BA, 0x5090,
- 0x96BB, 0x96BB, 0x26A5, 0x96BC, 0x96BD, 0x1D7A, 0x96BE, 0x96BE, 0x0B34,
- 0x96BF, 0x96BF, 0x5091, 0x96C0, 0x96C0, 0x0C93, 0x96C1, 0x96C1, 0x100C,
- 0x96C2, 0x96C3, 0x5092, 0x96C4, 0x96C4, 0x0FA6, 0x96C5, 0x96C5, 0x0FEE,
- 0x96C6, 0x96C6, 0x0822, 0x96C7, 0x96C7, 0x0726, 0x96C8, 0x96C8, 0x5094,
- 0x96C9, 0x96C9, 0x1B1C, 0x96CA, 0x96CB, 0x5095, 0x96CC, 0x96CC, 0x0549,
- 0x96CD, 0x96CD, 0x109F, 0x96CE, 0x96CE, 0x1D7C, 0x96CF, 0x96CF, 0x0520,
- 0x96D0, 0x96D1, 0x5097, 0x96D2, 0x96D2, 0x1D7D, 0x96D3, 0x96D4, 0x5099,
- 0x96D5, 0x96D5, 0x05D2, 0x96D6, 0x96D6, 0x2156, 0x96D7, 0x96D8, 0x509B,
- 0x96D9, 0x96D9, 0x2144, 0x96DA, 0x96DA, 0x509D, 0x96DB, 0x96DB, 0x1E91,
- 0x96DC, 0x96DC, 0x2257, 0x96DD, 0x96DF, 0x509E, 0x96E0, 0x96E0, 0x1D7F,
- 0x96E1, 0x96E1, 0x50A1, 0x96E2, 0x96E2, 0x200A, 0x96E3, 0x96E3, 0x2092,
- 0x96E4, 0x96E7, 0x50A2, 0x96E8, 0x96E8, 0x10CF, 0x96E9, 0x96E9, 0x1D61,
- 0x96EA, 0x96EA, 0x0FD2, 0x96EB, 0x96EE, 0x50A6, 0x96EF, 0x96EF, 0x1D63,
- 0x96F0, 0x96F1, 0x50AA, 0x96F2, 0x96F2, 0x2250, 0x96F3, 0x96F3, 0x1D62,
- 0x96F4, 0x96F5, 0x50AC, 0x96F6, 0x96F6, 0x0A2C, 0x96F7, 0x96F7, 0x09C2,
- 0x96F8, 0x96F8, 0x50AE, 0x96F9, 0x96F9, 0x040B, 0x96FA, 0x96FA, 0x50AF,
- 0x96FB, 0x96FB, 0x1EC3, 0x96FC, 0x96FD, 0x50B0, 0x96FE, 0x96FE, 0x0EFC,
- 0x96FF, 0x96FF, 0x50B2, 0x9700, 0x9700, 0x0FB3, 0x9701, 0x9701, 0x1D65,
- 0x9702, 0x9703, 0x50B3, 0x9704, 0x9704, 0x0F63, 0x9705, 0x9705, 0x50B5,
- 0x9706, 0x9706, 0x1D64, 0x9707, 0x9707, 0x1191, 0x9708, 0x9708, 0x1D66,
- 0x9709, 0x9709, 0x0ABE, 0x970A, 0x970C, 0x50B6, 0x970D, 0x970D, 0x0809,
- 0x970E, 0x970E, 0x1D68, 0x970F, 0x970F, 0x1D67, 0x9710, 0x9712, 0x50B9,
- 0x9713, 0x9713, 0x0B41, 0x9714, 0x9715, 0x50BC, 0x9716, 0x9716, 0x0A21,
- 0x9717, 0x971B, 0x50BE, 0x971C, 0x971C, 0x0D9F, 0x971D, 0x971D, 0x50C3,
- 0x971E, 0x971E, 0x0F29, 0x971F, 0x9726, 0x50C4, 0x9727, 0x9727, 0x21A8,
- 0x9728, 0x9729, 0x50CC, 0x972A, 0x972A, 0x1D69, 0x972B, 0x972C, 0x50CE,
- 0x972D, 0x972D, 0x1D6A, 0x972E, 0x972F, 0x50D0, 0x9730, 0x9730, 0x1D6B,
- 0x9731, 0x9731, 0x50D2, 0x9732, 0x9732, 0x0A5D, 0x9733, 0x9737, 0x50D3,
- 0x9738, 0x9738, 0x03DF, 0x9739, 0x9739, 0x0BBA, 0x973A, 0x973C, 0x50D8,
- 0x973D, 0x973D, 0x260D, 0x973E, 0x973E, 0x1D6C, 0x973F, 0x9741, 0x50DB,
- 0x9742, 0x9742, 0x260C, 0x9743, 0x9743, 0x50DE, 0x9744, 0x9744, 0x260E,
- 0x9745, 0x9747, 0x50DF, 0x9748, 0x9748, 0x2032, 0x9749, 0x9751, 0x50E2,
- 0x9752, 0x9752, 0x0C5D, 0x9753, 0x9753, 0x1D60, 0x9754, 0x9755, 0x50EB,
- 0x9756, 0x9756, 0x08E7, 0x9757, 0x9758, 0x50ED, 0x9759, 0x9759, 0x08E1,
- 0x975A, 0x975A, 0x260B, 0x975B, 0x975B, 0x05C6, 0x975C, 0x975D, 0x50EF,
- 0x975E, 0x975E, 0x0664, 0x975F, 0x975F, 0x50F1, 0x9760, 0x9760, 0x094C,
- 0x9761, 0x9761, 0x0AD7, 0x9762, 0x9762, 0x0AEB, 0x9763, 0x9764, 0x50F2,
- 0x9765, 0x9765, 0x1282, 0x9766, 0x9767, 0x50F4, 0x9768, 0x9768, 0x22C3,
- 0x9769, 0x9769, 0x06EA, 0x976A, 0x9772, 0x50F6, 0x9773, 0x9773, 0x08CA,
- 0x9774, 0x9774, 0x0FCE, 0x9775, 0x9775, 0x50FF, 0x9776, 0x9776, 0x03DB,
- 0x9777, 0x977B, 0x5100, 0x977C, 0x977C, 0x1DC8, 0x977D, 0x9784, 0x5105,
- 0x9785, 0x9785, 0x1DC9, 0x9786, 0x978A, 0x510D, 0x978B, 0x978B, 0x0F77,
- 0x978C, 0x978C, 0x5112, 0x978D, 0x978D, 0x03BB, 0x978E, 0x978E, 0x5113,
- 0x978F, 0x978F, 0x1F23, 0x9790, 0x9790, 0x5114, 0x9791, 0x9792, 0x1DCA,
- 0x9793, 0x9793, 0x5115, 0x9794, 0x9794, 0x1DCC, 0x9795, 0x9797, 0x5116,
- 0x9798, 0x9798, 0x0C47, 0x9799, 0x979F, 0x5119, 0x97A0, 0x97A0, 0x08FE,
- 0x97A1, 0x97A2, 0x5120, 0x97A3, 0x97A3, 0x1DCF, 0x97A4, 0x97A5, 0x5122,
- 0x97A6, 0x97A6, 0x2695, 0x97A7, 0x97AA, 0x5124, 0x97AB, 0x97AB, 0x1DCE,
- 0x97AC, 0x97AC, 0x5128, 0x97AD, 0x97AD, 0x0447, 0x97AE, 0x97AE, 0x5129,
- 0x97AF, 0x97AF, 0x1DCD, 0x97B0, 0x97B1, 0x512A, 0x97B2, 0x97B2, 0x1DD0,
- 0x97B3, 0x97B3, 0x512C, 0x97B4, 0x97B4, 0x1DD1, 0x97B5, 0x97BC, 0x512D,
- 0x97BD, 0x97BD, 0x265E, 0x97BE, 0x97C2, 0x5135, 0x97C3, 0x97C3, 0x265D,
- 0x97C4, 0x97C5, 0x513A, 0x97C6, 0x97C6, 0x2692, 0x97C7, 0x97C8, 0x513C,
- 0x97C9, 0x97C9, 0x265F, 0x97CA, 0x97CA, 0x513E, 0x97CB, 0x97CB, 0x218D,
- 0x97CC, 0x97CC, 0x20FD, 0x97CD, 0x97D2, 0x513F, 0x97D3, 0x97D3, 0x1F40,
- 0x97D4, 0x97D8, 0x5145, 0x97D9, 0x97D9, 0x2465, 0x97DA, 0x97DB, 0x514A,
- 0x97DC, 0x97DC, 0x2467, 0x97DD, 0x97DD, 0x514C, 0x97DE, 0x97DE, 0x2466,
- 0x97DF, 0x97E5, 0x514D, 0x97E6, 0x97E6, 0x0EB3, 0x97E7, 0x97E7, 0x0CA8,
- 0x97E8, 0x97E8, 0x5154, 0x97E9, 0x97E9, 0x0762, 0x97EA, 0x97EC, 0x184E,
- 0x97ED, 0x97ED, 0x08F1, 0x97EE, 0x97F2, 0x5155, 0x97F3, 0x97F3, 0x107B,
- 0x97F4, 0x97F4, 0x515A, 0x97F5, 0x97F5, 0x1112, 0x97F6, 0x97F6, 0x0D11,
- 0x97F7, 0x97FE, 0x515B, 0x97FF, 0x97FF, 0x21C9, 0x9800, 0x9800, 0x5163,
- 0x9801, 0x9801, 0x2209, 0x9802, 0x9802, 0x1EC9, 0x9803, 0x9803, 0x20E9,
- 0x9804, 0x9804, 0x5164, 0x9805, 0x9805, 0x21CA, 0x9806, 0x9806, 0x2146,
- 0x9807, 0x9807, 0x25C5, 0x9808, 0x9808, 0x21DC, 0x9809, 0x9809, 0x5165,
- 0x980A, 0x980A, 0x245E, 0x980B, 0x980B, 0x5166, 0x980C, 0x980C, 0x214F,
- 0x980D, 0x980D, 0x5167, 0x980E, 0x980F, 0x25C6, 0x9810, 0x9810, 0x2241,
- 0x9811, 0x9811, 0x218A, 0x9812, 0x9812, 0x1E2F, 0x9813, 0x9813, 0x1EDC,
- 0x9814, 0x9816, 0x5168, 0x9817, 0x9817, 0x20BF, 0x9818, 0x9818, 0x2034,
- 0x9819, 0x981B, 0x516B, 0x981C, 0x981C, 0x25C9, 0x981D, 0x9820, 0x516E,
- 0x9821, 0x9821, 0x25C8, 0x9822, 0x9823, 0x5172, 0x9824, 0x9824, 0x220E,
- 0x9825, 0x9825, 0x5174, 0x9826, 0x9826, 0x25CB, 0x9827, 0x982C, 0x5175,
- 0x982D, 0x982D, 0x217D, 0x982E, 0x982F, 0x517B, 0x9830, 0x9830, 0x1F7E,
- 0x9831, 0x9836, 0x517D, 0x9837, 0x9837, 0x25CC, 0x9838, 0x9838, 0x1FC3,
- 0x9839, 0x983A, 0x5183, 0x983B, 0x983B, 0x20B9, 0x983C, 0x983C, 0x5185,
- 0x983D, 0x983D, 0x2181, 0x983E, 0x9845, 0x5186, 0x9846, 0x9846, 0x1FDA,
- 0x9847, 0x984B, 0x518E, 0x984C, 0x984C, 0x2173, 0x984D, 0x984D, 0x1EE1,
- 0x984E, 0x984E, 0x25CD, 0x984F, 0x9852, 0x5193, 0x9853, 0x9853, 0x25CE,
- 0x9854, 0x9854, 0x21F6, 0x9855, 0x9857, 0x5197, 0x9858, 0x9858, 0x224B,
- 0x9859, 0x9859, 0x25D1, 0x985A, 0x985A, 0x519A, 0x985B, 0x985B, 0x1EC0,
- 0x985C, 0x985D, 0x519B, 0x985E, 0x985E, 0x2008, 0x985F, 0x9861, 0x519D,
- 0x9862, 0x9862, 0x25D0, 0x9863, 0x9864, 0x51A0, 0x9865, 0x9865, 0x25D2,
- 0x9866, 0x9866, 0x51A2, 0x9867, 0x9867, 0x1F2A, 0x9868, 0x986A, 0x51A3,
- 0x986B, 0x986B, 0x1E72, 0x986C, 0x986C, 0x25D3, 0x986D, 0x986E, 0x51A6,
- 0x986F, 0x986F, 0x21BE, 0x9870, 0x9870, 0x25D4, 0x9871, 0x9871, 0x2044,
- 0x9872, 0x9872, 0x51A8, 0x9873, 0x9873, 0x25CF, 0x9874, 0x9874, 0x20F3,
- 0x9875, 0x9875, 0x103A, 0x9876, 0x9876, 0x05E4, 0x9877, 0x9877, 0x0C67,
- 0x9878, 0x9878, 0x1BE0, 0x9879, 0x9879, 0x0F5B, 0x987A, 0x987A, 0x0DA8,
- 0x987B, 0x987B, 0x0FB6, 0x987C, 0x987C, 0x1827, 0x987D, 0x987D, 0x0E98,
- 0x987E, 0x987E, 0x0724, 0x987F, 0x987F, 0x0618, 0x9880, 0x9880, 0x1BE1,
- 0x9881, 0x9881, 0x03EF, 0x9882, 0x9882, 0x0DC1, 0x9883, 0x9883, 0x1BE2,
- 0x9884, 0x9884, 0x10E7, 0x9885, 0x9885, 0x0A54, 0x9886, 0x9886, 0x0A35,
- 0x9887, 0x9887, 0x0BE3, 0x9888, 0x9888, 0x08E0, 0x9889, 0x9889, 0x1BE3,
- 0x988A, 0x988A, 0x0848, 0x988B, 0x988B, 0x51A9, 0x988C, 0x988D, 0x1BE4,
- 0x988E, 0x988E, 0x51AA, 0x988F, 0x988F, 0x1BE6, 0x9890, 0x9890, 0x104A,
- 0x9891, 0x9891, 0x0BD4, 0x9892, 0x9892, 0x51AB, 0x9893, 0x9893, 0x0E78,
- 0x9894, 0x9894, 0x1BE7, 0x9895, 0x9895, 0x51AC, 0x9896, 0x9896, 0x1096,
- 0x9897, 0x9897, 0x0952, 0x9898, 0x9898, 0x0E35, 0x9899, 0x9899, 0x51AD,
- 0x989A, 0x989B, 0x1BE8, 0x989C, 0x989C, 0x0FFE, 0x989D, 0x989D, 0x062D,
- 0x989E, 0x989F, 0x1BEA, 0x98A0, 0x98A0, 0x05C0, 0x98A1, 0x98A2, 0x1BEC,
- 0x98A3, 0x98A3, 0x51AE, 0x98A4, 0x98A4, 0x04C3, 0x98A5, 0x98A6, 0x1BEE,
- 0x98A7, 0x98A7, 0x0C82, 0x98A8, 0x98A8, 0x1F00, 0x98A9, 0x98AD, 0x51AF,
- 0x98AE, 0x98AF, 0x24CC, 0x98B0, 0x98B0, 0x51B4, 0x98B1, 0x98B1, 0x2698,
- 0x98B2, 0x98B2, 0x51B5, 0x98B3, 0x98B3, 0x2678, 0x98B4, 0x98B5, 0x51B6,
- 0x98B6, 0x98B6, 0x24CE, 0x98B7, 0x98BB, 0x51B8, 0x98BC, 0x98BC, 0x24CF,
- 0x98BD, 0x98C3, 0x51BD, 0x98C4, 0x98C4, 0x20B8, 0x98C5, 0x98C5, 0x51C4,
- 0x98C6, 0x98C6, 0x24D0, 0x98C7, 0x98C7, 0x51C5, 0x98C8, 0x98C8, 0x24D1,
- 0x98C9, 0x98CD, 0x51C6, 0x98CE, 0x98CE, 0x0684, 0x98CF, 0x98D0, 0x51CB,
- 0x98D1, 0x98D3, 0x19B7, 0x98D4, 0x98D4, 0x51CD, 0x98D5, 0x98D5, 0x19BA,
- 0x98D6, 0x98D7, 0x51CE, 0x98D8, 0x98D8, 0x0BCD, 0x98D9, 0x98DA, 0x19BB,
- 0x98DB, 0x98DB, 0x1EF4, 0x98DC, 0x98DD, 0x51D0, 0x98DE, 0x98DE, 0x0666,
- 0x98DF, 0x98DF, 0x0D4A, 0x98E0, 0x98E0, 0x239B, 0x98E1, 0x98E1, 0x51D2,
- 0x98E2, 0x98E2, 0x267E, 0x98E3, 0x98E6, 0x51D3, 0x98E7, 0x98E7, 0x161A,
- 0x98E8, 0x98E8, 0x1DE7, 0x98E9, 0x98E9, 0x239D, 0x98EA, 0x98EB, 0x239F,
- 0x98EC, 0x98EC, 0x51D7, 0x98ED, 0x98ED, 0x23A1, 0x98EE, 0x98EE, 0x51D8,
- 0x98EF, 0x98EF, 0x1EF1, 0x98F0, 0x98F1, 0x51D9, 0x98F2, 0x98F2, 0x221E,
- 0x98F3, 0x98F3, 0x51DB, 0x98F4, 0x98F4, 0x23A2, 0x98F5, 0x98FB, 0x51DC,
- 0x98FC, 0x98FC, 0x214B, 0x98FD, 0x98FD, 0x1E36, 0x98FE, 0x98FE, 0x2135,
- 0x98FF, 0x98FF, 0x51E3, 0x9900, 0x9902, 0x51E4, 0x9903, 0x9903, 0x1FAD,
- 0x9904, 0x9904, 0x51E7, 0x9905, 0x9905, 0x1E53, 0x9906, 0x9908, 0x51E8,
- 0x9909, 0x9909, 0x23A3, 0x990A, 0x990A, 0x2203, 0x990B, 0x990B, 0x51EB,
- 0x990C, 0x990C, 0x1EE7, 0x990D, 0x990D, 0x1DE8, 0x990E, 0x990F, 0x51EC,
- 0x9910, 0x9910, 0x0494, 0x9911, 0x9911, 0x23A4, 0x9912, 0x9912, 0x2097,
- 0x9913, 0x9913, 0x1EE4, 0x9914, 0x9917, 0x51EE, 0x9918, 0x9918, 0x2238,
- 0x9919, 0x991A, 0x51F2, 0x991B, 0x991B, 0x23A5, 0x991C, 0x991D, 0x51F4,
- 0x991E, 0x991E, 0x1F9A, 0x991F, 0x9920, 0x51F6, 0x9921, 0x9921, 0x21C3,
- 0x9922, 0x9927, 0x51F8, 0x9928, 0x9928, 0x1F2E, 0x9929, 0x992D, 0x51FE,
- 0x992E, 0x992E, 0x1DE9, 0x992F, 0x9932, 0x5203, 0x9933, 0x9933, 0x239C,
- 0x9934, 0x9936, 0x5207, 0x9937, 0x9937, 0x23A6, 0x9938, 0x993B, 0x520A,
- 0x993C, 0x993C, 0x239E, 0x993D, 0x993D, 0x520E, 0x993E, 0x993E, 0x2035,
- 0x993F, 0x993F, 0x23A7, 0x9940, 0x9942, 0x520F, 0x9943, 0x9943, 0x23A8,
- 0x9944, 0x9944, 0x5212, 0x9945, 0x9945, 0x2075, 0x9946, 0x9947, 0x5213,
- 0x9948, 0x994A, 0x23A9, 0x994B, 0x994B, 0x1FEB, 0x994C, 0x994C, 0x23AC,
- 0x994D, 0x9950, 0x5215, 0x9951, 0x9951, 0x1F6A, 0x9952, 0x9952, 0x20F9,
- 0x9953, 0x9953, 0x5219, 0x9954, 0x9954, 0x1DEB, 0x9955, 0x9955, 0x1DEA,
- 0x9956, 0x9956, 0x521A, 0x9957, 0x9957, 0x2666, 0x9958, 0x995B, 0x521B,
- 0x995C, 0x995C, 0x2667, 0x995D, 0x995D, 0x521F, 0x995E, 0x995E, 0x1E6C,
- 0x995F, 0x9961, 0x5220, 0x9962, 0x9962, 0x23AD, 0x9963, 0x9963, 0x161D,
- 0x9964, 0x9964, 0x5223, 0x9965, 0x9965, 0x0815, 0x9966, 0x9966, 0x5224,
- 0x9967, 0x996C, 0x161E, 0x996D, 0x996D, 0x0656, 0x996E, 0x996E, 0x1082,
- 0x996F, 0x996F, 0x0875, 0x9970, 0x9970, 0x0D65, 0x9971, 0x9971, 0x040E,
- 0x9972, 0x9972, 0x0DBC, 0x9973, 0x9973, 0x5225, 0x9974, 0x9974, 0x1624,
- 0x9975, 0x9975, 0x063B, 0x9976, 0x9976, 0x0C9F, 0x9977, 0x9977, 0x1625,
- 0x9978, 0x9979, 0x5226, 0x997A, 0x997A, 0x0899, 0x997B, 0x997B, 0x5228,
- 0x997C, 0x997C, 0x0466, 0x997D, 0x997D, 0x1626, 0x997E, 0x997E, 0x5229,
- 0x997F, 0x997F, 0x0635, 0x9980, 0x9980, 0x1627, 0x9981, 0x9981, 0x0B3C,
- 0x9982, 0x9983, 0x522A, 0x9984, 0x9984, 0x1628, 0x9985, 0x9985, 0x0F47,
- 0x9986, 0x9986, 0x0736, 0x9987, 0x9987, 0x1629, 0x9988, 0x9988, 0x098C,
- 0x9989, 0x9989, 0x522C, 0x998A, 0x998A, 0x162A, 0x998B, 0x998B, 0x04BD,
- 0x998C, 0x998C, 0x522D, 0x998D, 0x998D, 0x162B, 0x998E, 0x998E, 0x522E,
- 0x998F, 0x998F, 0x0A3C, 0x9990, 0x9991, 0x162C, 0x9992, 0x9992, 0x0A9F,
- 0x9993, 0x9995, 0x162E, 0x9996, 0x9996, 0x0D6E, 0x9997, 0x9997, 0x126E,
- 0x9998, 0x9998, 0x12F9, 0x9999, 0x9999, 0x0F50, 0x999A, 0x99A4, 0x522F,
- 0x99A5, 0x99A5, 0x1B2B, 0x99A6, 0x99A7, 0x523A, 0x99A8, 0x99A8, 0x13DE,
- 0x99A9, 0x99AB, 0x523C, 0x99AC, 0x99AC, 0x206D, 0x99AD, 0x99AD, 0x2242,
- 0x99AE, 0x99AE, 0x1F02, 0x99AF, 0x99B0, 0x523F, 0x99B1, 0x99B1, 0x2183,
- 0x99B2, 0x99B2, 0x5241, 0x99B3, 0x99B3, 0x1E85, 0x99B4, 0x99B4, 0x21E9,
- 0x99B5, 0x99C0, 0x5242, 0x99C1, 0x99C1, 0x1E57, 0x99C2, 0x99CF, 0x524E,
- 0x99D0, 0x99D0, 0x22A5, 0x99D1, 0x99D1, 0x2407, 0x99D2, 0x99D2, 0x1FCA,
- 0x99D3, 0x99D3, 0x525C, 0x99D4, 0x99D4, 0x2402, 0x99D5, 0x99D5, 0x1F82,
- 0x99D6, 0x99D7, 0x525D, 0x99D8, 0x99D8, 0x2408, 0x99D9, 0x99D9, 0x2404,
- 0x99DA, 0x99DA, 0x525F, 0x99DB, 0x99DB, 0x2131, 0x99DC, 0x99DC, 0x5260,
- 0x99DD, 0x99DD, 0x2184, 0x99DE, 0x99DE, 0x5261, 0x99DF, 0x99DF, 0x2403,
- 0x99E0, 0x99E0, 0x5262, 0x99E1, 0x99E1, 0x206E, 0x99E2, 0x99E2, 0x240B,
- 0x99E3, 0x99EC, 0x5263, 0x99ED, 0x99ED, 0x1F3F, 0x99EE, 0x99F0, 0x526D,
- 0x99F1, 0x99F1, 0x2067, 0x99F2, 0x99FE, 0x5270, 0x99FF, 0x99FF, 0x1FD7,
- 0x9A00, 0x9A00, 0x527D, 0x9A01, 0x9A01, 0x1E83, 0x9A02, 0x9A04, 0x527E,
- 0x9A05, 0x9A05, 0x240F, 0x9A06, 0x9A0C, 0x5281, 0x9A0D, 0x9A0D, 0x240E,
- 0x9A0E, 0x9A0E, 0x20C7, 0x9A0F, 0x9A0F, 0x240D, 0x9A10, 0x9A15, 0x5288,
- 0x9A16, 0x9A16, 0x2412, 0x9A17, 0x9A18, 0x528E, 0x9A19, 0x9A19, 0x20B7,
- 0x9A1A, 0x9A2A, 0x5290, 0x9A2B, 0x9A2B, 0x23F0, 0x9A2C, 0x9A2C, 0x52A1,
- 0x9A2D, 0x9A2D, 0x2411, 0x9A2E, 0x9A2E, 0x2414, 0x9A2F, 0x9A2F, 0x52A2,
- 0x9A30, 0x9A30, 0x2170, 0x9A31, 0x9A35, 0x52A3, 0x9A36, 0x9A36, 0x2405,
- 0x9A37, 0x9A37, 0x210C, 0x9A38, 0x9A38, 0x2415, 0x9A39, 0x9A3D, 0x52A8,
- 0x9A3E, 0x9A3E, 0x2066, 0x9A3F, 0x9A3F, 0x52AD, 0x9A40, 0x9A40, 0x2352,
- 0x9A41, 0x9A41, 0x2413, 0x9A42, 0x9A42, 0x2410, 0x9A43, 0x9A44, 0x2416,
- 0x9A45, 0x9A45, 0x20F1, 0x9A46, 0x9A49, 0x52AE, 0x9A4A, 0x9A4A, 0x240A,
- 0x9A4B, 0x9A4C, 0x52B2, 0x9A4D, 0x9A4D, 0x2409, 0x9A4E, 0x9A4E, 0x52B4,
- 0x9A4F, 0x9A4F, 0x2418, 0x9A50, 0x9A54, 0x52B5, 0x9A55, 0x9A55, 0x1FA7,
- 0x9A56, 0x9A56, 0x52BA, 0x9A57, 0x9A57, 0x21FC, 0x9A58, 0x9A59, 0x52BB,
- 0x9A5A, 0x9A5A, 0x1FC1, 0x9A5B, 0x9A5B, 0x2406, 0x9A5C, 0x9A5E, 0x52BD,
- 0x9A5F, 0x9A5F, 0x229C, 0x9A60, 0x9A61, 0x52C0, 0x9A62, 0x9A62, 0x204E,
- 0x9A63, 0x9A63, 0x52C2, 0x9A64, 0x9A64, 0x241A, 0x9A65, 0x9A65, 0x2419,
- 0x9A66, 0x9A69, 0x52C3, 0x9A6A, 0x9A6A, 0x240C, 0x9A6B, 0x9A6B, 0x52C7,
- 0x9A6C, 0x9A6C, 0x0A94, 0x9A6D, 0x9A6D, 0x10E9, 0x9A6E, 0x9A6E, 0x0E85,
- 0x9A6F, 0x9A6F, 0x0FDA, 0x9A70, 0x9A70, 0x0500, 0x9A71, 0x9A71, 0x0C7A,
- 0x9A72, 0x9A72, 0x52C8, 0x9A73, 0x9A73, 0x047C, 0x9A74, 0x9A74, 0x0A66,
- 0x9A75, 0x9A75, 0x17BA, 0x9A76, 0x9A76, 0x0D52, 0x9A77, 0x9A78, 0x17BB,
- 0x9A79, 0x9A79, 0x0903, 0x9A7A, 0x9A7A, 0x17BD, 0x9A7B, 0x9A7B, 0x1201,
- 0x9A7C, 0x9A7C, 0x0E86, 0x9A7D, 0x9A7D, 0x17BF, 0x9A7E, 0x9A7E, 0x0850,
- 0x9A7F, 0x9A7F, 0x17BE, 0x9A80, 0x9A81, 0x17C0, 0x9A82, 0x9A82, 0x0A95,
- 0x9A83, 0x9A83, 0x52C9, 0x9A84, 0x9A84, 0x088F, 0x9A85, 0x9A85, 0x17C2,
- 0x9A86, 0x9A86, 0x0A8D, 0x9A87, 0x9A87, 0x075E, 0x9A88, 0x9A88, 0x17C3,
- 0x9A89, 0x9A89, 0x52CA, 0x9A8A, 0x9A8A, 0x17C4, 0x9A8B, 0x9A8B, 0x04F7,
- 0x9A8C, 0x9A8C, 0x1012, 0x9A8D, 0x9A8E, 0x52CB, 0x9A8F, 0x9A8F, 0x0932,
- 0x9A90, 0x9A90, 0x17C5, 0x9A91, 0x9A91, 0x0C0E, 0x9A92, 0x9A93, 0x17C6,
- 0x9A94, 0x9A95, 0x52CD, 0x9A96, 0x9A96, 0x17C8, 0x9A97, 0x9A97, 0x0BCC,
- 0x9A98, 0x9A98, 0x17C9, 0x9A99, 0x9A99, 0x52CF, 0x9A9A, 0x9A9A, 0x0CE0,
- 0x9A9B, 0x9A9D, 0x17CA, 0x9A9E, 0x9A9E, 0x1735, 0x9A9F, 0x9AA0, 0x17CD,
- 0x9AA1, 0x9AA1, 0x0A89, 0x9AA2, 0x9AA3, 0x17CF, 0x9AA4, 0x9AA4, 0x11E7,
- 0x9AA5, 0x9AA5, 0x17D1, 0x9AA6, 0x9AA6, 0x52D0, 0x9AA7, 0x9AA7, 0x17D2,
- 0x9AA8, 0x9AA8, 0x0720, 0x9AA9, 0x9AAE, 0x52D1, 0x9AAF, 0x9AAF, 0x1E29,
- 0x9AB0, 0x9AB0, 0x1DD3, 0x9AB1, 0x9AB1, 0x1DD2, 0x9AB2, 0x9AB5, 0x52D7,
- 0x9AB6, 0x9AB6, 0x1DD6, 0x9AB7, 0x9AB7, 0x1DD4, 0x9AB8, 0x9AB8, 0x0758,
- 0x9AB9, 0x9AB9, 0x52DB, 0x9ABA, 0x9ABA, 0x1DD7, 0x9ABB, 0x9ABB, 0x52DC,
- 0x9ABC, 0x9ABC, 0x1DD8, 0x9ABD, 0x9ABF, 0x52DD, 0x9AC0, 0x9AC0, 0x1DDA,
- 0x9AC1, 0x9AC1, 0x1DD9, 0x9AC2, 0x9AC2, 0x1DDC, 0x9AC3, 0x9AC4, 0x52E0,
- 0x9AC5, 0x9AC5, 0x1DDB, 0x9AC6, 0x9ACA, 0x52E2, 0x9ACB, 0x9ACC, 0x1DDD,
- 0x9ACD, 0x9ACE, 0x52E7, 0x9ACF, 0x9ACF, 0x2661, 0x9AD0, 0x9AD0, 0x52E9,
- 0x9AD1, 0x9AD1, 0x1DDF, 0x9AD2, 0x9AD2, 0x26A4, 0x9AD3, 0x9AD3, 0x0DDD,
- 0x9AD4, 0x9AD4, 0x2174, 0x9AD5, 0x9AD5, 0x2663, 0x9AD6, 0x9AD6, 0x2662,
- 0x9AD7, 0x9AD7, 0x52EA, 0x9AD8, 0x9AD8, 0x06DA, 0x9AD9, 0x9ADE, 0x52EB,
- 0x9ADF, 0x9ADF, 0x1DEC, 0x9AE0, 0x9AE0, 0x52F1, 0x9AE1, 0x9AE1, 0x1DED,
- 0x9AE2, 0x9AE5, 0x52F2, 0x9AE6, 0x9AE6, 0x1DEE, 0x9AE7, 0x9AEA, 0x52F6,
- 0x9AEB, 0x9AEB, 0x1DF0, 0x9AEC, 0x9AEC, 0x52FA, 0x9AED, 0x9AED, 0x1DF2,
- 0x9AEE, 0x9AEE, 0x2675, 0x9AEF, 0x9AEF, 0x1DEF, 0x9AF0, 0x9AF8, 0x52FB,
- 0x9AF9, 0x9AF9, 0x1DF3, 0x9AFA, 0x9AFA, 0x5304, 0x9AFB, 0x9AFB, 0x1DF1,
- 0x9AFC, 0x9AFF, 0x5305, 0x9B00, 0x9B02, 0x5309, 0x9B03, 0x9B03, 0x1234,
- 0x9B04, 0x9B05, 0x530C, 0x9B06, 0x9B06, 0x214C, 0x9B07, 0x9B07, 0x530E,
- 0x9B08, 0x9B08, 0x1DF4, 0x9B09, 0x9B0C, 0x530F, 0x9B0D, 0x9B0D, 0x267A,
- 0x9B0E, 0x9B0E, 0x5313, 0x9B0F, 0x9B0F, 0x1DF5, 0x9B10, 0x9B12, 0x5314,
- 0x9B13, 0x9B13, 0x1DF6, 0x9B14, 0x9B19, 0x5317, 0x9B1A, 0x9B1A, 0x26A0,
- 0x9B1B, 0x9B1E, 0x531D, 0x9B1F, 0x9B1F, 0x1DF7, 0x9B20, 0x9B21, 0x5321,
- 0x9B22, 0x9B22, 0x2668, 0x9B23, 0x9B23, 0x1DF8, 0x9B24, 0x9B24, 0x5323,
- 0x9B25, 0x9B25, 0x1ED0, 0x9B26, 0x9B26, 0x5324, 0x9B27, 0x9B27, 0x2096,
- 0x9B28, 0x9B28, 0x5325, 0x9B29, 0x9B29, 0x23CC, 0x9B2A, 0x9B2D, 0x5326,
- 0x9B2E, 0x9B2E, 0x23C8, 0x9B2F, 0x9B2F, 0x139B, 0x9B30, 0x9B30, 0x532A,
- 0x9B31, 0x9B31, 0x223E, 0x9B32, 0x9B32, 0x1260, 0x9B33, 0x9B3A, 0x532B,
- 0x9B3B, 0x9B3B, 0x1773, 0x9B3C, 0x9B3C, 0x0746, 0x9B3D, 0x9B40, 0x5333,
- 0x9B41, 0x9B41, 0x098A, 0x9B42, 0x9B42, 0x07FF, 0x9B43, 0x9B43, 0x1DE1,
- 0x9B44, 0x9B44, 0x0BE6, 0x9B45, 0x9B45, 0x1DE0, 0x9B46, 0x9B46, 0x5337,
- 0x9B47, 0x9B47, 0x1DE2, 0x9B48, 0x9B48, 0x1DE4, 0x9B49, 0x9B49, 0x1DE3,
- 0x9B4A, 0x9B4C, 0x5338, 0x9B4D, 0x9B4D, 0x1DE5, 0x9B4E, 0x9B4E, 0x2665,
- 0x9B4F, 0x9B4F, 0x0EC9, 0x9B50, 0x9B50, 0x533B, 0x9B51, 0x9B51, 0x1DE6,
- 0x9B52, 0x9B53, 0x533C, 0x9B54, 0x9B54, 0x0B0A, 0x9B55, 0x9B57, 0x533E,
- 0x9B58, 0x9B58, 0x2664, 0x9B59, 0x9B59, 0x5341, 0x9B5A, 0x9B5A, 0x2239,
- 0x9B5B, 0x9B6E, 0x5342, 0x9B6F, 0x9B6F, 0x204A, 0x9B70, 0x9B73, 0x5356,
- 0x9B74, 0x9B74, 0x261F, 0x9B75, 0x9B76, 0x535A, 0x9B77, 0x9B77, 0x261E,
- 0x9B78, 0x9B80, 0x535C, 0x9B81, 0x9B81, 0x2620, 0x9B82, 0x9B82, 0x5365,
- 0x9B83, 0x9B83, 0x2621, 0x9B84, 0x9B8D, 0x5366, 0x9B8E, 0x9B8E, 0x2622,
- 0x9B8F, 0x9B8F, 0x5370, 0x9B90, 0x9B90, 0x2627, 0x9B91, 0x9B91, 0x1E39,
- 0x9B92, 0x9B92, 0x2625, 0x9B93, 0x9B99, 0x5371, 0x9B9A, 0x9B9A, 0x2629,
- 0x9B9B, 0x9B9C, 0x5378, 0x9B9D, 0x9B9D, 0x262E, 0x9B9E, 0x9B9E, 0x262B,
- 0x9B9F, 0x9BA9, 0x537A, 0x9BAA, 0x9BAA, 0x262A, 0x9BAB, 0x9BAB, 0x262D,
- 0x9BAC, 0x9BAC, 0x5385, 0x9BAD, 0x9BAD, 0x2628, 0x9BAE, 0x9BAE, 0x21B9,
- 0x9BAF, 0x9BBF, 0x5386, 0x9BC0, 0x9BC0, 0x2636, 0x9BC1, 0x9BC1, 0x2630,
- 0x9BC2, 0x9BC6, 0x5397, 0x9BC7, 0x9BC7, 0x2638, 0x9BC8, 0x9BC8, 0x539C,
- 0x9BC9, 0x9BC9, 0x200D, 0x9BCA, 0x9BCA, 0x2637, 0x9BCB, 0x9BD3, 0x539D,
- 0x9BD4, 0x9BD4, 0x2645, 0x9BD5, 0x9BD5, 0x53A6, 0x9BD6, 0x9BD6, 0x263A,
- 0x9BD7, 0x9BDA, 0x53A7, 0x9BDB, 0x9BDB, 0x2643, 0x9BDC, 0x9BDC, 0x53AB,
- 0x9BDD, 0x9BDD, 0x2640, 0x9BDE, 0x9BE0, 0x53AC, 0x9BE1, 0x9BE1, 0x263D,
- 0x9BE2, 0x9BE2, 0x2641, 0x9BE3, 0x9BE3, 0x53AF, 0x9BE4, 0x9BE4, 0x263E,
- 0x9BE5, 0x9BE6, 0x53B0, 0x9BE7, 0x9BE7, 0x263F, 0x9BE8, 0x9BE8, 0x1FC0,
- 0x9BE9, 0x9BE9, 0x53B2, 0x9BEA, 0x9BEB, 0x263B, 0x9BEC, 0x9BEF, 0x53B3,
- 0x9BF0, 0x9BF0, 0x2642, 0x9BF1, 0x9BF3, 0x53B7, 0x9BF4, 0x9BF4, 0x2644,
- 0x9BF5, 0x9BFC, 0x53BA, 0x9BFD, 0x9BFD, 0x2639, 0x9BFE, 0x9BFE, 0x53C2,
- 0x9BFF, 0x9BFF, 0x264C, 0x9C00, 0x9C07, 0x53C3, 0x9C08, 0x9C08, 0x2647,
- 0x9C09, 0x9C09, 0x264B, 0x9C0A, 0x9C0C, 0x53CB, 0x9C0D, 0x9C0D, 0x2649,
- 0x9C0E, 0x9C0F, 0x53CE, 0x9C10, 0x9C10, 0x2648, 0x9C11, 0x9C11, 0x53D0,
- 0x9C12, 0x9C12, 0x264A, 0x9C13, 0x9C13, 0x2108, 0x9C14, 0x9C1F, 0x53D1,
- 0x9C20, 0x9C20, 0x264D, 0x9C21, 0x9C22, 0x53DD, 0x9C23, 0x9C23, 0x2634,
- 0x9C24, 0x9C24, 0x53DF, 0x9C25, 0x9C25, 0x2651, 0x9C26, 0x9C27, 0x53E0,
- 0x9C28, 0x9C28, 0x2650, 0x9C29, 0x9C29, 0x2652, 0x9C2A, 0x9C2C, 0x53E2,
- 0x9C2D, 0x9C2D, 0x264F, 0x9C2E, 0x9C30, 0x53E5, 0x9C31, 0x9C31, 0x2632,
- 0x9C32, 0x9C32, 0x264E, 0x9C33, 0x9C33, 0x2653, 0x9C34, 0x9C34, 0x53E8,
- 0x9C35, 0x9C35, 0x2657, 0x9C36, 0x9C36, 0x53E9, 0x9C37, 0x9C37, 0x2635,
- 0x9C38, 0x9C38, 0x53EA, 0x9C39, 0x9C39, 0x2633, 0x9C3A, 0x9C3A, 0x53EB,
- 0x9C3B, 0x9C3B, 0x2656, 0x9C3C, 0x9C3D, 0x53EC, 0x9C3E, 0x9C3E, 0x2654,
- 0x9C3F, 0x9C44, 0x53EE, 0x9C45, 0x9C45, 0x2658, 0x9C46, 0x9C47, 0x53F4,
- 0x9C48, 0x9C48, 0x2655, 0x9C49, 0x9C49, 0x1E4D, 0x9C4A, 0x9C51, 0x53F6,
- 0x9C52, 0x9C52, 0x265B, 0x9C53, 0x9C53, 0x53FE, 0x9C54, 0x9C54, 0x265A,
- 0x9C55, 0x9C55, 0x53FF, 0x9C56, 0x9C56, 0x2659, 0x9C57, 0x9C57, 0x202E,
- 0x9C58, 0x9C58, 0x262F, 0x9C59, 0x9C5C, 0x5400, 0x9C5D, 0x9C5D, 0x2646,
- 0x9C5E, 0x9C5E, 0x5404, 0x9C5F, 0x9C5F, 0x2626, 0x9C60, 0x9C66, 0x5405,
- 0x9C67, 0x9C67, 0x265C, 0x9C68, 0x9C6C, 0x540C, 0x9C6D, 0x9C6D, 0x262C,
- 0x9C6E, 0x9C77, 0x5411, 0x9C78, 0x9C78, 0x2623, 0x9C79, 0x9C79, 0x541B,
- 0x9C7A, 0x9C7A, 0x2631, 0x9C7B, 0x9C7B, 0x541C, 0x9C7C, 0x9C7C, 0x10C8,
- 0x9C7D, 0x9C7E, 0x541D, 0x9C7F, 0x9C7F, 0x1D89, 0x9C80, 0x9C80, 0x541F,
- 0x9C81, 0x9C81, 0x0A5A, 0x9C82, 0x9C82, 0x1D8A, 0x9C83, 0x9C84, 0x5420,
- 0x9C85, 0x9C88, 0x1D8B, 0x9C89, 0x9C8A, 0x5422, 0x9C8B, 0x9C8B, 0x1D90,
- 0x9C8C, 0x9C8C, 0x5424, 0x9C8D, 0x9C8D, 0x0414, 0x9C8E, 0x9C8E, 0x1D91,
- 0x9C8F, 0x9C8F, 0x5425, 0x9C90, 0x9C92, 0x1D92, 0x9C93, 0x9C93, 0x5426,
- 0x9C94, 0x9C95, 0x1D95, 0x9C96, 0x9C99, 0x5427, 0x9C9A, 0x9C9B, 0x1D97,
- 0x9C9C, 0x9C9C, 0x0F37, 0x9C9D, 0x9C9D, 0x542B, 0x9C9E, 0x9CA3, 0x1D99,
- 0x9CA4, 0x9CA4, 0x09DB, 0x9CA5, 0x9CA9, 0x1D9F, 0x9CAA, 0x9CAA, 0x542C,
- 0x9CAB, 0x9CAB, 0x1DA4, 0x9CAC, 0x9CAC, 0x542D, 0x9CAD, 0x9CAE, 0x1DA5,
- 0x9CAF, 0x9CAF, 0x542E, 0x9CB0, 0x9CB7, 0x1DA7, 0x9CB8, 0x9CB8, 0x08D7,
- 0x9CB9, 0x9CB9, 0x542F, 0x9CBA, 0x9CBD, 0x1DAF, 0x9CBE, 0x9CC2, 0x5430,
- 0x9CC3, 0x9CC3, 0x0CD5, 0x9CC4, 0x9CC7, 0x1DB3, 0x9CC8, 0x9CC9, 0x5435,
- 0x9CCA, 0x9CD0, 0x1DB7, 0x9CD1, 0x9CD2, 0x5437, 0x9CD3, 0x9CD5, 0x1DBE,
- 0x9CD6, 0x9CD6, 0x0457, 0x9CD7, 0x9CD9, 0x1DC1, 0x9CDA, 0x9CDB, 0x5439,
- 0x9CDC, 0x9CDD, 0x1DC4, 0x9CDE, 0x9CDE, 0x0A24, 0x9CDF, 0x9CDF, 0x1DC6,
- 0x9CE0, 0x9CE1, 0x543B, 0x9CE2, 0x9CE2, 0x1DC7, 0x9CE3, 0x9CE4, 0x543D,
- 0x9CE5, 0x9CE5, 0x209C, 0x9CE6, 0x9CE8, 0x543F, 0x9CE9, 0x9CE9, 0x2580,
- 0x9CEA, 0x9CEB, 0x5442, 0x9CEC, 0x9CEC, 0x22DC, 0x9CED, 0x9CF2, 0x5444,
- 0x9CF3, 0x9CF3, 0x1F05, 0x9CF4, 0x9CF4, 0x208B, 0x9CF5, 0x9CF5, 0x544A,
- 0x9CF6, 0x9CF6, 0x2581, 0x9CF7, 0x9CFF, 0x544B, 0x9D00, 0x9D05, 0x5454,
- 0x9D06, 0x9D06, 0x2583, 0x9D07, 0x9D07, 0x2582, 0x9D08, 0x9D08, 0x545A,
- 0x9D09, 0x9D09, 0x21EE, 0x9D0A, 0x9D14, 0x545B, 0x9D15, 0x9D15, 0x2182,
- 0x9D16, 0x9D1A, 0x5466, 0x9D1B, 0x9D1B, 0x2243, 0x9D1C, 0x9D1C, 0x546B,
- 0x9D1D, 0x9D1D, 0x2587, 0x9D1E, 0x9D1E, 0x546C, 0x9D1F, 0x9D1F, 0x2588,
- 0x9D20, 0x9D22, 0x546D, 0x9D23, 0x9D23, 0x2584, 0x9D24, 0x9D25, 0x5470,
- 0x9D26, 0x9D26, 0x21FD, 0x9D27, 0x9D27, 0x5472, 0x9D28, 0x9D28, 0x21EF,
- 0x9D29, 0x9D2E, 0x5473, 0x9D2F, 0x9D2F, 0x258A, 0x9D30, 0x9D30, 0x258C,
- 0x9D31, 0x9D3A, 0x5479, 0x9D3B, 0x9D3B, 0x1F47, 0x9D3C, 0x9D3E, 0x5483,
- 0x9D3F, 0x9D3F, 0x1F1D, 0x9D40, 0x9D41, 0x5486, 0x9D42, 0x9D42, 0x258D,
- 0x9D43, 0x9D50, 0x5488, 0x9D51, 0x9D51, 0x1FD0, 0x9D52, 0x9D52, 0x2592,
- 0x9D53, 0x9D53, 0x258F, 0x9D54, 0x9D5B, 0x5496, 0x9D5C, 0x9D5C, 0x2594,
- 0x9D5D, 0x9D5D, 0x1EE0, 0x9D5E, 0x9D5F, 0x549E, 0x9D60, 0x9D60, 0x2591,
- 0x9D61, 0x9D61, 0x2595, 0x9D62, 0x9D69, 0x54A0, 0x9D6A, 0x9D6A, 0x2597,
- 0x9D6B, 0x9D6B, 0x54A8, 0x9D6C, 0x9D6C, 0x20B6, 0x9D6D, 0x9D6E, 0x54A9,
- 0x9D6F, 0x9D6F, 0x2598, 0x9D70, 0x9D71, 0x54AB, 0x9D72, 0x9D72, 0x20F6,
- 0x9D73, 0x9D86, 0x54AD, 0x9D87, 0x9D87, 0x2585, 0x9D88, 0x9D88, 0x54C1,
- 0x9D89, 0x9D89, 0x2599, 0x9D8A, 0x9D92, 0x54C2, 0x9D93, 0x9D93, 0x2596,
- 0x9D94, 0x9D97, 0x54CB, 0x9D98, 0x9D98, 0x259A, 0x9D99, 0x9D99, 0x54CF,
- 0x9D9A, 0x9D9A, 0x259B, 0x9D9B, 0x9DA4, 0x54D0, 0x9DA5, 0x9DA5, 0x259D,
- 0x9DA6, 0x9DA8, 0x54DA, 0x9DA9, 0x9DA9, 0x259E, 0x9DAA, 0x9DAE, 0x54DD,
- 0x9DAF, 0x9DAF, 0x234C, 0x9DB0, 0x9DB3, 0x54E2, 0x9DB4, 0x9DB4, 0x1F44,
- 0x9DB5, 0x9DBA, 0x54E6, 0x9DBB, 0x9DBB, 0x2660, 0x9DBC, 0x9DBC, 0x25A0,
- 0x9DBD, 0x9DBF, 0x54EC, 0x9DC0, 0x9DC0, 0x259C, 0x9DC1, 0x9DC1, 0x54EF,
- 0x9DC2, 0x9DC2, 0x259F, 0x9DC3, 0x9DC3, 0x54F0, 0x9DC4, 0x9DC4, 0x1F6C,
- 0x9DC5, 0x9DD2, 0x54F1, 0x9DD3, 0x9DD3, 0x25A2, 0x9DD4, 0x9DD6, 0x54FF,
- 0x9DD7, 0x9DD7, 0x20AE, 0x9DD8, 0x9DD8, 0x5502, 0x9DD9, 0x9DD9, 0x258B,
- 0x9DDA, 0x9DDA, 0x25A3, 0x9DDB, 0x9DE4, 0x5503, 0x9DE5, 0x9DE5, 0x2589,
- 0x9DE6, 0x9DE6, 0x25A5, 0x9DE7, 0x9DEE, 0x550D, 0x9DEF, 0x9DEF, 0x25A4,
- 0x9DF0, 0x9DF1, 0x5515, 0x9DF2, 0x9DF2, 0x25A6, 0x9DF3, 0x9DF3, 0x2593,
- 0x9DF4, 0x9DF7, 0x5517, 0x9DF8, 0x9DF8, 0x25A7, 0x9DF9, 0x9DF9, 0x2222,
- 0x9DFA, 0x9DFA, 0x25A9, 0x9DFB, 0x9DFF, 0x551B, 0x9E00, 0x9E0B, 0x5520,
- 0x9E0C, 0x9E0C, 0x25A8, 0x9E0D, 0x9E14, 0x552C, 0x9E15, 0x9E15, 0x2586,
- 0x9E16, 0x9E19, 0x5534, 0x9E1A, 0x9E1A, 0x25A1, 0x9E1B, 0x9E1B, 0x25AA,
- 0x9E1C, 0x9E1C, 0x5538, 0x9E1D, 0x9E1D, 0x2590, 0x9E1E, 0x9E1E, 0x258E,
- 0x9E1F, 0x9E1F, 0x0B54, 0x9E20, 0x9E20, 0x1B35, 0x9E21, 0x9E21, 0x0819,
- 0x9E22, 0x9E22, 0x1B36, 0x9E23, 0x9E23, 0x0AFE, 0x9E24, 0x9E24, 0x5539,
- 0x9E25, 0x9E25, 0x0B79, 0x9E26, 0x9E26, 0x0FE4, 0x9E27, 0x9E27, 0x553A,
- 0x9E28, 0x9E2C, 0x1B37, 0x9E2D, 0x9E2D, 0x0FE5, 0x9E2E, 0x9E2E, 0x553B,
- 0x9E2F, 0x9E2F, 0x1015, 0x9E30, 0x9E30, 0x553C, 0x9E31, 0x9E31, 0x1B3D,
- 0x9E32, 0x9E32, 0x1B3C, 0x9E33, 0x9E33, 0x10EA, 0x9E34, 0x9E34, 0x553D,
- 0x9E35, 0x9E35, 0x0E83, 0x9E36, 0x9E36, 0x1B3E, 0x9E37, 0x9E37, 0x1B40,
- 0x9E38, 0x9E38, 0x1B3F, 0x9E39, 0x9E3A, 0x1B41, 0x9E3B, 0x9E3C, 0x553E,
- 0x9E3D, 0x9E3D, 0x06E6, 0x9E3E, 0x9E3E, 0x1B43, 0x9E3F, 0x9E3F, 0x079F,
- 0x9E40, 0x9E40, 0x5540, 0x9E41, 0x9E42, 0x1B44, 0x9E43, 0x9E43, 0x0918,
- 0x9E44, 0x9E44, 0x1B46, 0x9E45, 0x9E45, 0x062B, 0x9E46, 0x9E49, 0x1B47,
- 0x9E4A, 0x9E4A, 0x0C90, 0x9E4B, 0x9E4C, 0x1B4B, 0x9E4D, 0x9E4D, 0x5541,
- 0x9E4E, 0x9E4E, 0x1B4D, 0x9E4F, 0x9E4F, 0x0BB5, 0x9E50, 0x9E50, 0x5542,
- 0x9E51, 0x9E51, 0x1B4E, 0x9E52, 0x9E54, 0x5543, 0x9E55, 0x9E55, 0x1B4F,
- 0x9E56, 0x9E56, 0x5546, 0x9E57, 0x9E57, 0x1B50, 0x9E58, 0x9E58, 0x1DD5,
- 0x9E59, 0x9E59, 0x5547, 0x9E5A, 0x9E5C, 0x1B51, 0x9E5D, 0x9E5D, 0x5548,
- 0x9E5E, 0x9E5E, 0x1B54, 0x9E5F, 0x9E62, 0x5549, 0x9E63, 0x9E63, 0x1B55,
- 0x9E64, 0x9E64, 0x078E, 0x9E65, 0x9E65, 0x554D, 0x9E66, 0x9E6C, 0x1B56,
- 0x9E6D, 0x9E6D, 0x1B5E, 0x9E6E, 0x9E6F, 0x554E, 0x9E70, 0x9E70, 0x108A,
- 0x9E71, 0x9E71, 0x1B5D, 0x9E72, 0x9E72, 0x5550, 0x9E73, 0x9E73, 0x1B5F,
- 0x9E74, 0x9E74, 0x5551, 0x9E75, 0x9E75, 0x2688, 0x9E76, 0x9E78, 0x5552,
- 0x9E79, 0x9E79, 0x269E, 0x9E7A, 0x9E7A, 0x25FB, 0x9E7B, 0x9E7B, 0x5555,
- 0x9E7C, 0x9E7C, 0x1F8C, 0x9E7D, 0x9E7D, 0x21F4, 0x9E7E, 0x9E7E, 0x1D16,
- 0x9E7F, 0x9E7F, 0x0A60, 0x9E80, 0x9E81, 0x5556, 0x9E82, 0x9E82, 0x1DFC,
- 0x9E83, 0x9E86, 0x5558, 0x9E87, 0x9E88, 0x1DFD, 0x9E89, 0x9E8A, 0x555C,
- 0x9E8B, 0x9E8B, 0x1DFF, 0x9E8C, 0x9E91, 0x555E, 0x9E92, 0x9E92, 0x1E00,
- 0x9E93, 0x9E93, 0x0A5B, 0x9E94, 0x9E96, 0x5564, 0x9E97, 0x9E97, 0x200F,
- 0x9E98, 0x9E9C, 0x5567, 0x9E9D, 0x9E9D, 0x1E02, 0x9E9E, 0x9E9E, 0x556C,
- 0x9E9F, 0x9E9F, 0x1E03, 0x9EA0, 0x9EA4, 0x556D, 0x9EA5, 0x9EA5, 0x2071,
- 0x9EA6, 0x9EA6, 0x0A9A, 0x9EA7, 0x9EA8, 0x5572, 0x9EA9, 0x9EA9, 0x25F7,
- 0x9EAA, 0x9EAE, 0x5574, 0x9EAF, 0x9EAF, 0x2696, 0x9EB0, 0x9EB3, 0x5579,
- 0x9EB4, 0x9EB4, 0x1CEE, 0x9EB5, 0x9EB5, 0x268F, 0x9EB6, 0x9EB7, 0x557D,
- 0x9EB8, 0x9EB8, 0x1CED, 0x9EB9, 0x9EBA, 0x557F, 0x9EBB, 0x9EBB, 0x0A90,
- 0x9EBC, 0x9EBC, 0x5581, 0x9EBD, 0x9EBE, 0x1DF9, 0x9EBF, 0x9EC3, 0x5582,
- 0x9EC4, 0x9EC4, 0x07DB, 0x9EC5, 0x9EC8, 0x5587, 0x9EC9, 0x9EC9, 0x12F8,
- 0x9ECA, 0x9ECB, 0x558B, 0x9ECC, 0x9ECC, 0x22DA, 0x9ECD, 0x9ECD, 0x0D89,
- 0x9ECE, 0x9ECE, 0x09D3, 0x9ECF, 0x9ECF, 0x1B2A, 0x9ED0, 0x9ED0, 0x558D,
- 0x9ED1, 0x9ED1, 0x0791, 0x9ED2, 0x9ED3, 0x558E, 0x9ED4, 0x9ED4, 0x0C2A,
- 0x9ED5, 0x9ED7, 0x5590, 0x9ED8, 0x9ED8, 0x0B0F, 0x9ED9, 0x9EDA, 0x5593,
- 0x9EDB, 0x9EDD, 0x1E04, 0x9EDE, 0x9EDE, 0x1EC1, 0x9EDF, 0x9EDF, 0x1E08,
- 0x9EE0, 0x9EE0, 0x1E07, 0x9EE1, 0x9EE1, 0x5595, 0x9EE2, 0x9EE2, 0x1E09,
- 0x9EE3, 0x9EE4, 0x5596, 0x9EE5, 0x9EE5, 0x1E0C, 0x9EE6, 0x9EE6, 0x5598,
- 0x9EE7, 0x9EE7, 0x1E0B, 0x9EE8, 0x9EE8, 0x1EB3, 0x9EE9, 0x9EE9, 0x1E0A,
- 0x9EEA, 0x9EEA, 0x1E0D, 0x9EEB, 0x9EEE, 0x5599, 0x9EEF, 0x9EEF, 0x1E0E,
- 0x9EF0, 0x9EF1, 0x559D, 0x9EF2, 0x9EF2, 0x266A, 0x9EF3, 0x9EF3, 0x559F,
- 0x9EF4, 0x9EF4, 0x268A, 0x9EF5, 0x9EF6, 0x55A0, 0x9EF7, 0x9EF7, 0x2669,
- 0x9EF8, 0x9EF8, 0x55A2, 0x9EF9, 0x9EF9, 0x1A55, 0x9EFA, 0x9EFA, 0x55A3,
- 0x9EFB, 0x9EFC, 0x1A56, 0x9EFD, 0x9EFD, 0x2618, 0x9EFE, 0x9EFE, 0x1D76,
- 0x9EFF, 0x9EFF, 0x2619, 0x9F00, 0x9F08, 0x55A4, 0x9F09, 0x9F09, 0x261A,
- 0x9F0A, 0x9F0A, 0x55AD, 0x9F0B, 0x9F0B, 0x1D77, 0x9F0C, 0x9F0C, 0x55AE,
- 0x9F0D, 0x9F0D, 0x1D78, 0x9F0E, 0x9F0E, 0x05E5, 0x9F0F, 0x9F0F, 0x55AF,
- 0x9F10, 0x9F10, 0x1274, 0x9F11, 0x9F12, 0x55B0, 0x9F13, 0x9F13, 0x071D,
- 0x9F14, 0x9F14, 0x55B2, 0x9F15, 0x9F15, 0x2673, 0x9F16, 0x9F16, 0x55B3,
- 0x9F17, 0x9F17, 0x1271, 0x9F18, 0x9F18, 0x55B4, 0x9F19, 0x9F19, 0x13DF,
- 0x9F1A, 0x9F1F, 0x55B5, 0x9F20, 0x9F20, 0x0D8A, 0x9F21, 0x9F21, 0x55BB,
- 0x9F22, 0x9F22, 0x1E0F, 0x9F23, 0x9F2B, 0x55BC, 0x9F2C, 0x9F2C, 0x1E10,
- 0x9F2D, 0x9F2E, 0x55C5, 0x9F2F, 0x9F2F, 0x1E11, 0x9F30, 0x9F36, 0x55C7,
- 0x9F37, 0x9F37, 0x1E13, 0x9F38, 0x9F38, 0x55CE, 0x9F39, 0x9F39, 0x1E12,
- 0x9F3A, 0x9F3A, 0x55CF, 0x9F3B, 0x9F3B, 0x0430, 0x9F3C, 0x9F3C, 0x55D0,
- 0x9F3D, 0x9F3E, 0x1E14, 0x9F3F, 0x9F43, 0x55D1, 0x9F44, 0x9F44, 0x1E16,
- 0x9F45, 0x9F49, 0x55D6, 0x9F4A, 0x9F4A, 0x20C6, 0x9F4B, 0x9F4B, 0x226B,
- 0x9F4C, 0x9F4E, 0x55DB, 0x9F4F, 0x9F4F, 0x24D3, 0x9F50, 0x9F50, 0x0C0A,
- 0x9F51, 0x9F51, 0x19C2, 0x9F52, 0x9F52, 0x1E86, 0x9F53, 0x9F53, 0x55DE,
- 0x9F54, 0x9F54, 0x260F, 0x9F55, 0x9F58, 0x55DF, 0x9F59, 0x9F59, 0x2611,
- 0x9F5A, 0x9F5B, 0x55E3, 0x9F5C, 0x9F5C, 0x2613, 0x9F5D, 0x9F5E, 0x55E5,
- 0x9F5F, 0x9F5F, 0x2610, 0x9F60, 0x9F60, 0x2612, 0x9F61, 0x9F61, 0x2030,
- 0x9F62, 0x9F62, 0x55E7, 0x9F63, 0x9F63, 0x2671, 0x9F64, 0x9F65, 0x55E8,
- 0x9F66, 0x9F66, 0x2614, 0x9F67, 0x9F69, 0x55EA, 0x9F6A, 0x9F6A, 0x2616,
- 0x9F6B, 0x9F6B, 0x55ED, 0x9F6C, 0x9F6C, 0x2615, 0x9F6D, 0x9F71, 0x55EE,
- 0x9F72, 0x9F72, 0x20F2, 0x9F73, 0x9F76, 0x55F3, 0x9F77, 0x9F77, 0x2617,
- 0x9F78, 0x9F7E, 0x55F7, 0x9F7F, 0x9F7F, 0x0502, 0x9F80, 0x9F80, 0x1D6D,
- 0x9F81, 0x9F82, 0x55FE, 0x9F83, 0x9F83, 0x1D6E, 0x9F84, 0x9F84, 0x0A2D,
- 0x9F85, 0x9F8A, 0x1D6F, 0x9F8B, 0x9F8B, 0x0C7E, 0x9F8C, 0x9F8C, 0x1D75,
- 0x9F8D, 0x9F8D, 0x2037, 0x9F8E, 0x9F8F, 0x5600, 0x9F90, 0x9F90, 0x20B3,
- 0x9F91, 0x9F93, 0x5602, 0x9F94, 0x9F94, 0x1F22, 0x9F95, 0x9F95, 0x24ED,
- 0x9F96, 0x9F98, 0x5605, 0x9F99, 0x9F99, 0x0A43, 0x9F9A, 0x9F9A, 0x0701,
- 0x9F9B, 0x9F9B, 0x1A54, 0x9F9C, 0x9F9C, 0x1F34, 0x9F9D, 0x9F9E, 0x5608,
- 0x9F9F, 0x9F9F, 0x0743, 0x9FA0, 0x9FA0, 0x12F3, 0x9FA1, 0x9FA5, 0x560A,
- 0xE816, 0xE818, 0x5620, 0xE81E, 0xE81E, 0x5628, 0xE826, 0xE826, 0x5630,
- 0xE82B, 0xE82C, 0x5635, 0xE831, 0xE832, 0x563B, 0xE83B, 0xE83B, 0x5645,
- 0xE843, 0xE843, 0x564D, 0xE854, 0xE855, 0x565E, 0xE864, 0xE864, 0x566E,
- 0xF92C, 0xF92C, 0x560F, 0xFA0D, 0xFA0F, 0x5610, 0xFA11, 0xFA11, 0x5613,
- 0xFA13, 0xFA14, 0x5614, 0xFA18, 0xFA18, 0x5616, 0xFA1F, 0xFA21, 0x5617,
- 0xFA23, 0xFA24, 0x561A, 0xFA27, 0xFA29, 0x561C, 0xFE30, 0xFE30, 0x271D,
- 0xFE49, 0xFE52, 0x272B, 0xFE54, 0xFE57, 0x2735, 0xFE59, 0xFE66, 0x2739,
- 0xFE68, 0xFE6B, 0x2747, 0xFF01, 0xFF03, 0x0106, 0xFF04, 0xFF04, 0x00A6,
- 0xFF05, 0xFF5D, 0x010A, 0xFF5E, 0xFF5E, 0x006A, 0xFFE0, 0xFFE1, 0x00A8,
- 0xFFE2, 0xFFE2, 0x271E, 0xFFE3, 0xFFE3, 0x0163, 0xFFE4, 0xFFE4, 0x271F,
- 0xFFE5, 0xFFE5, 0x0109,
-};
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_UniGB_UCS2_H_4[13825 * 3] = {
+ 0x0020, 0x007E, 0x0001, 0x00A4, 0x00A4, 0x00A7, 0x00A5, 0x00A5, 0x5752,
+ 0x00A7, 0x00A7, 0x00AB, 0x00A8, 0x00A8, 0x0066, 0x00B0, 0x00B0, 0x00A2,
+ 0x00B1, 0x00B1, 0x007F, 0x00D7, 0x00D7, 0x0080, 0x00E0, 0x00E0, 0x029F,
+ 0x00E1, 0x00E1, 0x029D, 0x00E8, 0x00E8, 0x02A3, 0x00E9, 0x00E9, 0x02A1,
+ 0x00EA, 0x00EA, 0x02B5, 0x00EC, 0x00EC, 0x02A7, 0x00ED, 0x00ED, 0x02A5,
+ 0x00F2, 0x00F2, 0x02AB, 0x00F3, 0x00F3, 0x02A9, 0x00F7, 0x00F7, 0x0081,
+ 0x00F9, 0x00F9, 0x02AF, 0x00FA, 0x00FA, 0x02AD, 0x00FC, 0x00FC, 0x02B4,
+ 0x0101, 0x0101, 0x029C, 0x0113, 0x0113, 0x02A0, 0x011B, 0x011B, 0x02A2,
+ 0x012B, 0x012B, 0x02A4, 0x014D, 0x014D, 0x02A8, 0x016B, 0x016B, 0x02AC,
+ 0x01CE, 0x01CE, 0x029E, 0x01D0, 0x01D0, 0x02A6, 0x01D2, 0x01D2, 0x02AA,
+ 0x01D4, 0x01D4, 0x02AE, 0x01D6, 0x01D6, 0x02B0, 0x01D8, 0x01D8, 0x02B1,
+ 0x01DA, 0x01DA, 0x02B2, 0x01DC, 0x01DC, 0x02B3, 0x01F9, 0x01F9, 0x02BA,
+ 0x02C7, 0x02C7, 0x0065, 0x02C9, 0x02C9, 0x0064, 0x02CA, 0x02CB, 0x26B3,
+ 0x02D9, 0x02D9, 0x26B5, 0x0391, 0x03A1, 0x020D, 0x03A3, 0x03A9, 0x021E,
+ 0x03B1, 0x03C1, 0x0225, 0x03C3, 0x03C9, 0x0236, 0x0401, 0x0401, 0x0260,
+ 0x0410, 0x0415, 0x025A, 0x0416, 0x0435, 0x0261, 0x0436, 0x044F, 0x0282,
+ 0x0451, 0x0451, 0x0281, 0x1E3F, 0x1E3F, 0x02B7, 0x2010, 0x2010, 0x2722,
+ 0x2013, 0x2013, 0x26B6, 0x2014, 0x2014, 0x0069, 0x2015, 0x2015, 0x26B7,
+ 0x2016, 0x2016, 0x006B, 0x2018, 0x2019, 0x006D, 0x201C, 0x201D, 0x006F,
+ 0x2025, 0x2025, 0x26B8, 0x2026, 0x2026, 0x006C, 0x2030, 0x2030, 0x00AA,
+ 0x2032, 0x2033, 0x00A3, 0x2035, 0x2035, 0x26B9, 0x203B, 0x203B, 0x00B8,
+ 0x20AC, 0x20AC, 0x5751, 0x2103, 0x2103, 0x00A5, 0x2105, 0x2105, 0x26BA,
+ 0x2109, 0x2109, 0x26BB, 0x2116, 0x2116, 0x00AC, 0x2121, 0x2121, 0x2720,
+ 0x2160, 0x216B, 0x00FA, 0x2170, 0x2179, 0x26A9, 0x2190, 0x2191, 0x00BA,
+ 0x2192, 0x2192, 0x00B9, 0x2193, 0x2193, 0x00BC, 0x2196, 0x2199, 0x26BC,
+ 0x2208, 0x2208, 0x0089, 0x220F, 0x220F, 0x0086, 0x2211, 0x2211, 0x0085,
+ 0x2215, 0x2215, 0x26C0, 0x221A, 0x221A, 0x008B, 0x221D, 0x221D, 0x0097,
+ 0x221E, 0x221E, 0x009D, 0x221F, 0x221F, 0x26C1, 0x2220, 0x2220, 0x008E,
+ 0x2223, 0x2223, 0x26C2, 0x2225, 0x2225, 0x008D, 0x2227, 0x2228, 0x0083,
+ 0x2229, 0x2229, 0x0088, 0x222A, 0x222A, 0x0087, 0x222B, 0x222B, 0x0091,
+ 0x222E, 0x222E, 0x0092, 0x2234, 0x2234, 0x009F, 0x2235, 0x2235, 0x009E,
+ 0x2236, 0x2236, 0x0082, 0x2237, 0x2237, 0x008A, 0x223D, 0x223D, 0x0096,
+ 0x2248, 0x2248, 0x0095, 0x224C, 0x224C, 0x0094, 0x2252, 0x2252, 0x26C3,
+ 0x2260, 0x2260, 0x0098, 0x2261, 0x2261, 0x0093, 0x2264, 0x2265, 0x009B,
+ 0x2266, 0x2267, 0x26C4, 0x226E, 0x226F, 0x0099, 0x2295, 0x2295, 0x2704,
+ 0x2299, 0x2299, 0x0090, 0x22A5, 0x22A5, 0x008C, 0x22BF, 0x22BF, 0x26C6,
+ 0x22EF, 0x22EF, 0x006C, 0x2312, 0x2312, 0x008F, 0x2460, 0x2469, 0x00E6,
+ 0x2474, 0x2487, 0x00D2, 0x2488, 0x249B, 0x00BE, 0x2500, 0x254B, 0x02E2,
+ 0x2550, 0x2573, 0x26C7, 0x2581, 0x258F, 0x26EB, 0x2593, 0x2595, 0x26FA,
+ 0x25A0, 0x25A0, 0x00B5, 0x25A1, 0x25A1, 0x00B4, 0x25B2, 0x25B2, 0x00B7,
+ 0x25B3, 0x25B3, 0x00B6, 0x25BC, 0x25BD, 0x26FD, 0x25C6, 0x25C6, 0x00B3,
+ 0x25C7, 0x25C7, 0x00B2, 0x25CB, 0x25CB, 0x00AF, 0x25CE, 0x25CE, 0x00B1,
+ 0x25CF, 0x25CF, 0x00B0, 0x25E2, 0x25E5, 0x26FF, 0x2605, 0x2605, 0x00AE,
+ 0x2606, 0x2606, 0x00AD, 0x2609, 0x2609, 0x2703, 0x2640, 0x2640, 0x00A1,
+ 0x2642, 0x2642, 0x00A0, 0x2E80, 0x2E80, 0x579C, 0x2E81, 0x2E81, 0x561F,
+ 0x2E82, 0x2E83, 0x579D, 0x2E84, 0x2E84, 0x5623, 0x2E85, 0x2E87, 0x579F,
+ 0x2E88, 0x2E88, 0x5626, 0x2E89, 0x2E8A, 0x57A2, 0x2E8B, 0x2E8B, 0x5627,
+ 0x2E8C, 0x2E8C, 0x562C, 0x2E8D, 0x2E96, 0x57A4, 0x2E97, 0x2E97, 0x562D,
+ 0x2E98, 0x2E99, 0x57AE, 0x2E9B, 0x2EA6, 0x57B0, 0x2EA7, 0x2EA7, 0x563A,
+ 0x2EA8, 0x2EA9, 0x57BC, 0x2EAA, 0x2EAA, 0x563D, 0x2EAB, 0x2EAD, 0x57BE,
+ 0x2EAE, 0x2EAE, 0x5640, 0x2EAF, 0x2EB2, 0x57C1, 0x2EB3, 0x2EB3, 0x5642,
+ 0x2EB4, 0x2EB5, 0x57C5, 0x2EB6, 0x2EB7, 0x5643, 0x2EB8, 0x2EBA, 0x57C7,
+ 0x2EBB, 0x2EBB, 0x5648, 0x2EBC, 0x2EC9, 0x57CA, 0x2ECA, 0x2ECA, 0x5652,
+ 0x2ECB, 0x2EF3, 0x57D8, 0x2F00, 0x2F00, 0x1042, 0x2F01, 0x2F01, 0x1263,
+ 0x2F02, 0x2F02, 0x1272, 0x2F03, 0x2F03, 0x1265, 0x2F04, 0x2F04, 0x1059,
+ 0x2F05, 0x2F05, 0x2793, 0x2F06, 0x2F06, 0x063D, 0x2F07, 0x2F07, 0x1303,
+ 0x2F08, 0x2F08, 0x0CA6, 0x2F09, 0x2F09, 0x0638, 0x2F0A, 0x2F0A, 0x0CC6,
+ 0x2F0B, 0x2F0B, 0x03D6, 0x2F0C, 0x2F0C, 0x129D, 0x2F0D, 0x2F0D, 0x1314,
+ 0x2F0E, 0x2F0E, 0x130F, 0x2F0F, 0x2F0F, 0x082B, 0x2F10, 0x2F10, 0x1399,
+ 0x2F11, 0x2F11, 0x0597, 0x2F12, 0x2F12, 0x09EF, 0x2F13, 0x2F13, 0x12FC,
+ 0x2F14, 0x2F14, 0x1266, 0x2F15, 0x2F15, 0x1284, 0x2F16, 0x2F16, 0x2A1A,
+ 0x2F17, 0x2F17, 0x0D45, 0x2F18, 0x2F18, 0x047E, 0x2F19, 0x2F19, 0x1352,
+ 0x2F1A, 0x2F1A, 0x04CC, 0x2F1B, 0x2F1B, 0x139C, 0x2F1C, 0x2F1C, 0x10BB,
+ 0x2F1D, 0x2F1D, 0x0967, 0x2F1E, 0x2F1E, 0x1593, 0x2F1F, 0x2F1F, 0x0E72,
+ 0x2F20, 0x2F20, 0x0D56, 0x2F21, 0x2F21, 0x161C, 0x2F22, 0x2F22, 0x2D2D,
+ 0x2F23, 0x2F23, 0x0F13, 0x2F24, 0x2F24, 0x0576, 0x2F25, 0x2F25, 0x0B6F,
+ 0x2F26, 0x2F26, 0x1230, 0x2F27, 0x2F27, 0x172E, 0x2F28, 0x2F28, 0x056A,
+ 0x2F29, 0x2F29, 0x0F6C, 0x2F2A, 0x2F2A, 0x14B6, 0x2F2B, 0x2F2B, 0x0D43,
+ 0x2F2C, 0x2F2C, 0x1774, 0x2F2D, 0x2F2D, 0x0CF6, 0x2F2E, 0x2F2E, 0x1815,
+ 0x2F2F, 0x2F2F, 0x06FD, 0x2F30, 0x2F30, 0x082D, 0x2F31, 0x2F31, 0x08BE,
+ 0x2F32, 0x2F32, 0x06C4, 0x2F33, 0x2F33, 0x1813, 0x2F34, 0x2F34, 0x073C,
+ 0x2F35, 0x2F35, 0x1398, 0x2F36, 0x2F36, 0x14AD, 0x2F37, 0x2F37, 0x14F6,
+ 0x2F38, 0x2F38, 0x0706, 0x2F39, 0x2F39, 0x1762, 0x2F3A, 0x2F3A, 0x15EE,
+ 0x2F3B, 0x2F3B, 0x15E0, 0x2F3C, 0x2F3C, 0x0F8F, 0x2F3D, 0x2F3D, 0x06E5,
+ 0x2F3E, 0x2F3E, 0x3292, 0x2F3F, 0x2F3F, 0x0D6D, 0x2F40, 0x2F40, 0x11A6,
+ 0x2F41, 0x2F41, 0x1909, 0x2F42, 0x2F42, 0x0ED3, 0x2F43, 0x2F43, 0x05F6,
+ 0x2F44, 0x2F44, 0x08C0, 0x2F45, 0x2F45, 0x065A, 0x2F46, 0x2F46, 0x0EED,
+ 0x2F47, 0x2F47, 0x0CB0, 0x2F48, 0x2F48, 0x10FE, 0x2F49, 0x2F49, 0x1105,
+ 0x2F4A, 0x2F4A, 0x0B21, 0x2F4B, 0x2F4B, 0x0C34, 0x2F4C, 0x2F4C, 0x11B8,
+ 0x2F4D, 0x2F4D, 0x0578, 0x2F4E, 0x2F4E, 0x19BD, 0x2F4F, 0x2F4F, 0x0EF2,
+ 0x2F50, 0x2F50, 0x0431, 0x2F51, 0x2F51, 0x0AB0, 0x2F52, 0x2F52, 0x0D66,
+ 0x2F53, 0x2F53, 0x0C17, 0x2F54, 0x2F54, 0x0DA3, 0x2F55, 0x2F55, 0x0805,
+ 0x2F56, 0x2F56, 0x1203, 0x2F57, 0x2F57, 0x06B3, 0x2F58, 0x2F58, 0x1269,
+ 0x2F59, 0x2F59, 0x169D, 0x2F5A, 0x2F5A, 0x0BCB, 0x2F5B, 0x2F5B, 0x0FE9,
+ 0x2F5C, 0x2F5C, 0x0B64, 0x2F5D, 0x2F5D, 0x0C89, 0x2F5E, 0x2F5E, 0x0FC9,
+ 0x2F5F, 0x2F5F, 0x10D6, 0x2F60, 0x2F60, 0x0728, 0x2F61, 0x2F61, 0x0E90,
+ 0x2F62, 0x2F62, 0x06C5, 0x2F63, 0x2F63, 0x0D33, 0x2F64, 0x2F64, 0x10A8,
+ 0x2F65, 0x2F65, 0x0E42, 0x2F66, 0x2F66, 0x1BC6, 0x2F67, 0x2F67, 0x1B60,
+ 0x2F68, 0x2F68, 0x3EBF, 0x2F69, 0x2F69, 0x03E2, 0x2F6A, 0x2F6A, 0x0BC3,
+ 0x2F6B, 0x2F6B, 0x0AF8, 0x2F6C, 0x2F6C, 0x0B22, 0x2F6D, 0x2F6D, 0x0AB1,
+ 0x2F6E, 0x2F6E, 0x0D4F, 0x2F6F, 0x2F6F, 0x0D46, 0x2F70, 0x2F70, 0x0D55,
+ 0x2F71, 0x2F71, 0x40CB, 0x2F72, 0x2F72, 0x0783, 0x2F73, 0x2F73, 0x0FD1,
+ 0x2F74, 0x2F74, 0x09EB, 0x2F75, 0x2F75, 0x11F0, 0x2F76, 0x2F76, 0x0ADC,
+ 0x2F77, 0x2F77, 0x1CE7, 0x2F78, 0x2F78, 0x1C5E, 0x2F79, 0x2F79, 0x0EA9,
+ 0x2F7A, 0x2F7A, 0x101B, 0x2F7B, 0x2F7B, 0x10D5, 0x2F7C, 0x2F7C, 0x09BA,
+ 0x2F7D, 0x2F7D, 0x0637, 0x2F7E, 0x2F7E, 0x1BCB, 0x2F7F, 0x2F7F, 0x0639,
+ 0x2F80, 0x2F80, 0x1A1E, 0x2F81, 0x2F81, 0x0CBD, 0x2F82, 0x2F82, 0x04E1,
+ 0x2F83, 0x2F83, 0x1231, 0x2F84, 0x2F84, 0x11C0, 0x2F85, 0x2F85, 0x08F9,
+ 0x2F86, 0x2F86, 0x0D19, 0x2F87, 0x2F87, 0x1618, 0x2F88, 0x2F88, 0x11DA,
+ 0x2F89, 0x2F89, 0x1CDC, 0x2F8A, 0x2F8A, 0x0CE4, 0x2F8B, 0x2F8B, 0x45A2,
+ 0x2F8C, 0x2F8C, 0x1BF0, 0x2F8D, 0x2F8D, 0x050B, 0x2F8E, 0x2F8E, 0x0FD3,
+ 0x2F8F, 0x2F8F, 0x0F9B, 0x2F90, 0x2F90, 0x1049, 0x2F91, 0x2F91, 0x49DC,
+ 0x2F92, 0x2F92, 0x1F96, 0x2F93, 0x2F93, 0x0898, 0x2F94, 0x2F94, 0x0FFD,
+ 0x2F95, 0x2F95, 0x0721, 0x2F96, 0x2F96, 0x05F8, 0x2F97, 0x2F97, 0x1D15,
+ 0x2F98, 0x2F98, 0x1D50, 0x2F99, 0x2F99, 0x1E3B, 0x2F9A, 0x2F9A, 0x0505,
+ 0x2F9B, 0x2F9B, 0x123C, 0x2F9C, 0x2F9C, 0x1240, 0x2F9D, 0x2F9D, 0x0D26,
+ 0x2F9E, 0x2F9E, 0x1E7B, 0x2F9F, 0x2F9F, 0x0F8C, 0x2FA0, 0x2FA0, 0x04E2,
+ 0x2FA1, 0x2FA1, 0x4D13, 0x2FA2, 0x2FA2, 0x105F, 0x2FA3, 0x2FA3, 0x10B4,
+ 0x2FA4, 0x2FA4, 0x4E18, 0x2FA5, 0x2FA5, 0x09DA, 0x2FA6, 0x2FA6, 0x08C1,
+ 0x2FA7, 0x2FA7, 0x1E75, 0x2FA8, 0x2FA8, 0x207D, 0x2FA9, 0x2FA9, 0x06B2,
+ 0x2FAA, 0x2FAA, 0x09EE, 0x2FAB, 0x2FAB, 0x1D79, 0x2FAC, 0x2FAC, 0x10CF,
+ 0x2FAD, 0x2FAD, 0x50EA, 0x2FAE, 0x2FAE, 0x0664, 0x2FAF, 0x2FAF, 0x0AEB,
+ 0x2FB0, 0x2FB0, 0x06EA, 0x2FB1, 0x2FB1, 0x218D, 0x2FB2, 0x2FB2, 0x08F1,
+ 0x2FB3, 0x2FB3, 0x107B, 0x2FB4, 0x2FB4, 0x2209, 0x2FB5, 0x2FB5, 0x1F00,
+ 0x2FB6, 0x2FB6, 0x1EF4, 0x2FB7, 0x2FB7, 0x0D4A, 0x2FB8, 0x2FB8, 0x0D6E,
+ 0x2FB9, 0x2FB9, 0x0F50, 0x2FBA, 0x2FBA, 0x206D, 0x2FBB, 0x2FBB, 0x0720,
+ 0x2FBC, 0x2FBC, 0x06DA, 0x2FBD, 0x2FBD, 0x1DEC, 0x2FBE, 0x2FBE, 0x1ED0,
+ 0x2FBF, 0x2FBF, 0x139B, 0x2FC0, 0x2FC0, 0x1260, 0x2FC1, 0x2FC1, 0x0746,
+ 0x2FC2, 0x2FC2, 0x2239, 0x2FC3, 0x2FC3, 0x209C, 0x2FC4, 0x2FC4, 0x2688,
+ 0x2FC5, 0x2FC5, 0x0A60, 0x2FC6, 0x2FC6, 0x2071, 0x2FC7, 0x2FC7, 0x0A90,
+ 0x2FC8, 0x2FC8, 0x5586, 0x2FC9, 0x2FC9, 0x0D89, 0x2FCA, 0x2FCA, 0x0791,
+ 0x2FCB, 0x2FCB, 0x1A55, 0x2FCC, 0x2FCC, 0x2618, 0x2FCD, 0x2FCD, 0x05E5,
+ 0x2FCE, 0x2FCE, 0x071D, 0x2FCF, 0x2FCF, 0x0D8A, 0x2FD0, 0x2FD0, 0x0430,
+ 0x2FD1, 0x2FD1, 0x20C6, 0x2FD2, 0x2FD2, 0x1E86, 0x2FD3, 0x2FD3, 0x2037,
+ 0x2FD4, 0x2FD4, 0x1F34, 0x2FD5, 0x2FD5, 0x12F3, 0x2FF0, 0x2FFB, 0x274C,
+ 0x3000, 0x3002, 0x0060, 0x3003, 0x3003, 0x0067, 0x3005, 0x3005, 0x0068,
+ 0x3006, 0x3006, 0x2728, 0x3007, 0x3007, 0x1E17, 0x3008, 0x300F, 0x0073,
+ 0x3010, 0x3011, 0x007D, 0x3012, 0x3012, 0x2705, 0x3013, 0x3013, 0x00BD,
+ 0x3014, 0x3015, 0x0071, 0x3016, 0x3017, 0x007B, 0x301D, 0x301E, 0x2706,
+ 0x3021, 0x3029, 0x2708, 0x3033, 0x3035, 0x577B, 0x3038, 0x303A, 0x577E,
+ 0x303E, 0x303E, 0x274B, 0x303F, 0x303F, 0x5755, 0x3041, 0x3093, 0x0164,
+ 0x3094, 0x3094, 0x5767, 0x309B, 0x309C, 0x2724, 0x309D, 0x309E, 0x2729,
+ 0x30A1, 0x30F6, 0x01B7, 0x30F7, 0x30FA, 0x5776, 0x30FB, 0x30FB, 0x0063,
+ 0x30FC, 0x30FC, 0x2723, 0x30FD, 0x30FE, 0x2726, 0x3105, 0x3129, 0x02BC,
+ 0x312A, 0x312C, 0x5781, 0x31A0, 0x31B7, 0x5784, 0x3220, 0x3229, 0x00F0,
+ 0x3231, 0x3231, 0x2721, 0x32A3, 0x32A3, 0x2711, 0x338E, 0x338F, 0x2712,
+ 0x339C, 0x339E, 0x2714, 0x33A1, 0x33A1, 0x2717, 0x33C4, 0x33C4, 0x2718,
+ 0x33CE, 0x33CE, 0x2719, 0x33D1, 0x33D2, 0x271A, 0x33D5, 0x33D5, 0x271C,
+ 0x3400, 0x3446, 0x5801, 0x3447, 0x3447, 0x5625, 0x3448, 0x3472, 0x5848,
+ 0x3473, 0x3473, 0x5624, 0x3474, 0x34FF, 0x5873, 0x3500, 0x359D, 0x58FF,
+ 0x359E, 0x359E, 0x5629, 0x359F, 0x35FF, 0x599D, 0x3600, 0x360D, 0x59FE,
+ 0x360E, 0x360E, 0x562B, 0x360F, 0x3619, 0x5A0C, 0x361A, 0x361A, 0x562A,
+ 0x361B, 0x36FF, 0x5A17, 0x3700, 0x37FF, 0x5AFC, 0x3800, 0x38FF, 0x5BFC,
+ 0x3900, 0x3917, 0x5CFC, 0x3918, 0x3918, 0x562F, 0x3919, 0x396D, 0x5D14,
+ 0x396E, 0x396E, 0x562E, 0x396F, 0x39CE, 0x5D69, 0x39CF, 0x39CF, 0x5631,
+ 0x39D0, 0x39D0, 0x5634, 0x39D1, 0x39DE, 0x5DC9, 0x39DF, 0x39DF, 0x5632,
+ 0x39E0, 0x39FF, 0x5DD7, 0x3A00, 0x3A72, 0x5DF7, 0x3A73, 0x3A73, 0x5633,
+ 0x3A74, 0x3AFF, 0x5E6A, 0x3B00, 0x3B4D, 0x5EF6, 0x3B4E, 0x3B4E, 0x5637,
+ 0x3B4F, 0x3BFF, 0x5F44, 0x3C00, 0x3C6D, 0x5FF5, 0x3C6E, 0x3C6E, 0x5638,
+ 0x3C6F, 0x3CDF, 0x6063, 0x3CE0, 0x3CE0, 0x5639, 0x3CE1, 0x3CFF, 0x60D4,
+ 0x3D00, 0x3DFF, 0x60F3, 0x3E00, 0x3EFF, 0x61F3, 0x3F00, 0x3FFF, 0x62F3,
+ 0x4000, 0x4055, 0x63F3, 0x4056, 0x4056, 0x563E, 0x4057, 0x40FF, 0x6449,
+ 0x4100, 0x415E, 0x64F2, 0x415F, 0x415F, 0x563F, 0x4160, 0x41FF, 0x6551,
+ 0x4200, 0x42FF, 0x65F1, 0x4300, 0x4336, 0x66F1, 0x4337, 0x4337, 0x5641,
+ 0x4338, 0x43AB, 0x6728, 0x43AC, 0x43AC, 0x5647, 0x43AD, 0x43B0, 0x679C,
+ 0x43B1, 0x43B1, 0x5646, 0x43B2, 0x43DC, 0x67A0, 0x43DD, 0x43DD, 0x5649,
+ 0x43DE, 0x43FF, 0x67CB, 0x4400, 0x44D5, 0x67ED, 0x44D6, 0x44D6, 0x564A,
+ 0x44D7, 0x44FF, 0x68C3, 0x4500, 0x45FF, 0x68EC, 0x4600, 0x464B, 0x69EC,
+ 0x464C, 0x464C, 0x564C, 0x464D, 0x4660, 0x6A38, 0x4661, 0x4661, 0x564B,
+ 0x4662, 0x46FF, 0x6A4C, 0x4700, 0x4722, 0x6AEA, 0x4723, 0x4723, 0x564E,
+ 0x4724, 0x4728, 0x6B0D, 0x4729, 0x4729, 0x564F, 0x472A, 0x477B, 0x6B12,
+ 0x477C, 0x477C, 0x5650, 0x477D, 0x478C, 0x6B64, 0x478D, 0x478D, 0x5651,
+ 0x478E, 0x47FF, 0x6B74, 0x4800, 0x48FF, 0x6BE6, 0x4900, 0x4946, 0x6CE6,
+ 0x4947, 0x4947, 0x5653, 0x4948, 0x4979, 0x6D2D, 0x497A, 0x497A, 0x5654,
+ 0x497B, 0x497C, 0x6D5F, 0x497D, 0x497D, 0x5655, 0x497E, 0x4981, 0x6D61,
+ 0x4982, 0x4983, 0x5656, 0x4984, 0x4984, 0x6D65, 0x4985, 0x4986, 0x5658,
+ 0x4987, 0x499A, 0x6D66, 0x499B, 0x499B, 0x565B, 0x499C, 0x499E, 0x6D7A,
+ 0x499F, 0x499F, 0x565A, 0x49A0, 0x49B5, 0x6D7D, 0x49B6, 0x49B6, 0x565D,
+ 0x49B7, 0x49B7, 0x565C, 0x49B8, 0x49FF, 0x6D93, 0x4A00, 0x4AFF, 0x6DDB,
+ 0x4B00, 0x4BFF, 0x6EDB, 0x4C00, 0x4C76, 0x6FDB, 0x4C77, 0x4C77, 0x5664,
+ 0x4C78, 0x4C9E, 0x7052, 0x4C9F, 0x4CA1, 0x5661, 0x4CA2, 0x4CA2, 0x5665,
+ 0x4CA3, 0x4CA3, 0x5660, 0x4CA4, 0x4CFF, 0x7079, 0x4D00, 0x4D12, 0x70D5,
+ 0x4D13, 0x4D19, 0x5666, 0x4D1A, 0x4DAD, 0x70E8, 0x4DAE, 0x4DAE, 0x566D,
+ 0x4DAF, 0x4DB5, 0x717C, 0x4E00, 0x4E00, 0x1042, 0x4E01, 0x4E01, 0x05E0,
+ 0x4E02, 0x4E02, 0x2758, 0x4E03, 0x4E03, 0x0BFE, 0x4E04, 0x4E06, 0x2759,
+ 0x4E07, 0x4E07, 0x0EA3, 0x4E08, 0x4E08, 0x116A, 0x4E09, 0x4E09, 0x0CD8,
+ 0x4E0A, 0x4E0A, 0x0D08, 0x4E0B, 0x4E0B, 0x0F2F, 0x4E0C, 0x4E0C, 0x1258,
+ 0x4E0D, 0x4E0D, 0x0482, 0x4E0E, 0x4E0E, 0x10D0, 0x4E0F, 0x4E0F, 0x275C,
+ 0x4E10, 0x4E10, 0x125A, 0x4E11, 0x4E11, 0x0518, 0x4E12, 0x4E12, 0x275D,
+ 0x4E13, 0x4E13, 0x1205, 0x4E14, 0x4E14, 0x0C4F, 0x4E15, 0x4E15, 0x125D,
+ 0x4E16, 0x4E16, 0x0D57, 0x4E17, 0x4E17, 0x275E, 0x4E18, 0x4E18, 0x0C6D,
+ 0x4E19, 0x4E19, 0x0464, 0x4E1A, 0x4E1A, 0x103C, 0x4E1B, 0x4E1B, 0x0557,
+ 0x4E1C, 0x4E1C, 0x05EA, 0x4E1D, 0x4E1D, 0x0DB4, 0x4E1E, 0x4E1E, 0x125F,
+ 0x4E1F, 0x4E21, 0x275F, 0x4E22, 0x4E22, 0x05E9, 0x4E23, 0x4E23, 0x2762,
+ 0x4E24, 0x4E24, 0x0A06, 0x4E25, 0x4E25, 0x0FF8, 0x4E26, 0x4E26, 0x2763,
+ 0x4E27, 0x4E27, 0x0CDE, 0x4E28, 0x4E28, 0x1263, 0x4E29, 0x4E29, 0x2764,
+ 0x4E2A, 0x4E2A, 0x06F1, 0x4E2B, 0x4E2B, 0x0FE7, 0x4E2C, 0x4E2C, 0x169C,
+ 0x4E2D, 0x4E2D, 0x11CF, 0x4E2E, 0x4E2F, 0x2765, 0x4E30, 0x4E30, 0x067E,
+ 0x4E31, 0x4E31, 0x2767, 0x4E32, 0x4E32, 0x0531, 0x4E33, 0x4E33, 0x2768,
+ 0x4E34, 0x4E34, 0x0A22, 0x4E35, 0x4E35, 0x2769, 0x4E36, 0x4E36, 0x1272,
+ 0x4E37, 0x4E37, 0x276A, 0x4E38, 0x4E38, 0x0E99, 0x4E39, 0x4E39, 0x0585,
+ 0x4E3A, 0x4E3A, 0x0EB9, 0x4E3B, 0x4E3B, 0x11F6, 0x4E3C, 0x4E3C, 0x276B,
+ 0x4E3D, 0x4E3D, 0x09E1, 0x4E3E, 0x4E3E, 0x0908, 0x4E3F, 0x4E3F, 0x1265,
+ 0x4E40, 0x4E42, 0x276C, 0x4E43, 0x4E43, 0x0B2E, 0x4E44, 0x4E44, 0x276F,
+ 0x4E45, 0x4E45, 0x08F2, 0x4E46, 0x4E46, 0x2770, 0x4E47, 0x4E47, 0x1267,
+ 0x4E48, 0x4E48, 0x0AB9, 0x4E49, 0x4E49, 0x106C, 0x4E4A, 0x4E4A, 0x2771,
+ 0x4E4B, 0x4E4B, 0x11AD, 0x4E4C, 0x4E4C, 0x0EE9, 0x4E4D, 0x4E4D, 0x1148,
+ 0x4E4E, 0x4E4E, 0x07AC, 0x4E4F, 0x4E4F, 0x0643, 0x4E50, 0x4E50, 0x09C1,
+ 0x4E51, 0x4E51, 0x2772, 0x4E52, 0x4E52, 0x0BD8, 0x4E53, 0x4E53, 0x0B93,
+ 0x4E54, 0x4E54, 0x0C44, 0x4E55, 0x4E55, 0x2773, 0x4E56, 0x4E56, 0x072D,
+ 0x4E57, 0x4E57, 0x2774, 0x4E58, 0x4E58, 0x04F0, 0x4E59, 0x4E59, 0x1059,
+ 0x4E5A, 0x4E5B, 0x2775, 0x4E5C, 0x4E5C, 0x1275, 0x4E5D, 0x4E5D, 0x08F4,
+ 0x4E5E, 0x4E5E, 0x0C11, 0x4E5F, 0x4E5F, 0x1039, 0x4E60, 0x4E60, 0x0F1D,
+ 0x4E61, 0x4E61, 0x0F54, 0x4E62, 0x4E65, 0x2777, 0x4E66, 0x4E66, 0x0D80,
+ 0x4E67, 0x4E68, 0x277B, 0x4E69, 0x4E69, 0x1276, 0x4E6A, 0x4E6F, 0x277D,
+ 0x4E70, 0x4E70, 0x0A99, 0x4E71, 0x4E71, 0x0A79, 0x4E72, 0x4E72, 0x2783,
+ 0x4E73, 0x4E73, 0x0CC4, 0x4E74, 0x4E7D, 0x2784, 0x4E7E, 0x4E7E, 0x0C29,
+ 0x4E7F, 0x4E81, 0x278E, 0x4E82, 0x4E82, 0x2059, 0x4E83, 0x4E85, 0x2791,
+ 0x4E86, 0x4E86, 0x0A14, 0x4E87, 0x4E87, 0x2794, 0x4E88, 0x4E88, 0x10CD,
+ 0x4E89, 0x4E89, 0x119A, 0x4E8A, 0x4E8A, 0x2795, 0x4E8B, 0x4E8B, 0x0D59,
+ 0x4E8C, 0x4E8C, 0x063D, 0x4E8D, 0x4E8D, 0x1257, 0x4E8E, 0x4E8E, 0x10BF,
+ 0x4E8F, 0x4E8F, 0x0984, 0x4E90, 0x4E90, 0x2796, 0x4E91, 0x4E91, 0x1109,
+ 0x4E92, 0x4E92, 0x07BA, 0x4E93, 0x4E93, 0x1277, 0x4E94, 0x4E94, 0x0EF4,
+ 0x4E95, 0x4E95, 0x08DD, 0x4E96, 0x4E97, 0x2797, 0x4E98, 0x4E98, 0x125E,
+ 0x4E99, 0x4E99, 0x2799, 0x4E9A, 0x4E9A, 0x0FF0, 0x4E9B, 0x4E9B, 0x0F74,
+ 0x4E9C, 0x4E9D, 0x279A, 0x4E9E, 0x4E9E, 0x21F1, 0x4E9F, 0x4E9F, 0x1273,
+ 0x4EA0, 0x4EA0, 0x1303, 0x4EA1, 0x4EA1, 0x0EA7, 0x4EA2, 0x4EA2, 0x0947,
+ 0x4EA3, 0x4EA3, 0x279C, 0x4EA4, 0x4EA4, 0x088C, 0x4EA5, 0x4EA5, 0x075C,
+ 0x4EA6, 0x4EA6, 0x1067, 0x4EA7, 0x4EA7, 0x04C1, 0x4EA8, 0x4EA8, 0x0797,
+ 0x4EA9, 0x4EA9, 0x0B19, 0x4EAA, 0x4EAA, 0x279D, 0x4EAB, 0x4EAB, 0x0F5A,
+ 0x4EAC, 0x4EAC, 0x08D8, 0x4EAD, 0x4EAD, 0x0E55, 0x4EAE, 0x4EAE, 0x0A0A,
+ 0x4EAF, 0x4EB1, 0x279E, 0x4EB2, 0x4EB2, 0x0C54, 0x4EB3, 0x4EB3, 0x1305,
+ 0x4EB4, 0x4EB4, 0x27A1, 0x4EB5, 0x4EB5, 0x1308, 0x4EB6, 0x4EB9, 0x27A2,
+ 0x4EBA, 0x4EBA, 0x0CA6, 0x4EBB, 0x4EBB, 0x129F, 0x4EBC, 0x4EBE, 0x27A6,
+ 0x4EBF, 0x4EBF, 0x1061, 0x4EC0, 0x4EC0, 0x0D49, 0x4EC1, 0x4EC1, 0x0CA5,
+ 0x4EC2, 0x4EC2, 0x12A2, 0x4EC3, 0x4EC3, 0x12A0, 0x4EC4, 0x4EC4, 0x127C,
+ 0x4EC5, 0x4EC5, 0x08C7, 0x4EC6, 0x4EC6, 0x0BEC, 0x4EC7, 0x4EC7, 0x0515,
+ 0x4EC8, 0x4EC8, 0x27A9, 0x4EC9, 0x4EC9, 0x12A1, 0x4ECA, 0x4ECA, 0x08C2,
+ 0x4ECB, 0x4ECB, 0x08BA, 0x4ECC, 0x4ECC, 0x27AA, 0x4ECD, 0x4ECD, 0x0CAF,
+ 0x4ECE, 0x4ECE, 0x0556, 0x4ECF, 0x4ED0, 0x27AB, 0x4ED1, 0x4ED1, 0x0A7F,
+ 0x4ED2, 0x4ED2, 0x27AD, 0x4ED3, 0x4ED3, 0x049D, 0x4ED4, 0x4ED4, 0x122D,
+ 0x4ED5, 0x4ED5, 0x0D62, 0x4ED6, 0x4ED6, 0x0DF0, 0x4ED7, 0x4ED7, 0x116D,
+ 0x4ED8, 0x4ED8, 0x06B1, 0x4ED9, 0x4ED9, 0x0F36, 0x4EDA, 0x4EDC, 0x27AE,
+ 0x4EDD, 0x4EDD, 0x12EE, 0x4EDE, 0x4EDE, 0x12A6, 0x4EDF, 0x4EDF, 0x0C27,
+ 0x4EE0, 0x4EE0, 0x27B1, 0x4EE1, 0x4EE1, 0x12A4, 0x4EE2, 0x4EE2, 0x27B2,
+ 0x4EE3, 0x4EE3, 0x057D, 0x4EE4, 0x4EE4, 0x0A37, 0x4EE5, 0x4EE5, 0x105B,
+ 0x4EE6, 0x4EE7, 0x27B3, 0x4EE8, 0x4EE8, 0x12A3, 0x4EE9, 0x4EE9, 0x27B5,
+ 0x4EEA, 0x4EEA, 0x104E, 0x4EEB, 0x4EEB, 0x12A5, 0x4EEC, 0x4EEC, 0x0ACC,
+ 0x4EED, 0x4EEF, 0x27B6, 0x4EF0, 0x4EF0, 0x101F, 0x4EF1, 0x4EF1, 0x27B9,
+ 0x4EF2, 0x4EF2, 0x11D8, 0x4EF3, 0x4EF3, 0x12A8, 0x4EF4, 0x4EF4, 0x27BA,
+ 0x4EF5, 0x4EF5, 0x12AB, 0x4EF6, 0x4EF6, 0x0871, 0x4EF7, 0x4EF7, 0x084E,
+ 0x4EF8, 0x4EFA, 0x27BB, 0x4EFB, 0x4EFB, 0x0CA9, 0x4EFC, 0x4EFC, 0x27BE,
+ 0x4EFD, 0x4EFD, 0x067A, 0x4EFE, 0x4EFE, 0x27BF, 0x4EFF, 0x4EFF, 0x065F,
+ 0x4F00, 0x4F00, 0x27C0, 0x4F01, 0x4F01, 0x0C12, 0x4F02, 0x4F08, 0x27C1,
+ 0x4F09, 0x4F09, 0x12AE, 0x4F0A, 0x4F0A, 0x1048, 0x4F0B, 0x4F0C, 0x27C8,
+ 0x4F0D, 0x4F0D, 0x0EF8, 0x4F0E, 0x4F0E, 0x0832, 0x4F0F, 0x4F0F, 0x0699,
+ 0x4F10, 0x4F10, 0x0642, 0x4F11, 0x4F11, 0x0FA8, 0x4F12, 0x4F16, 0x27CA,
+ 0x4F17, 0x4F17, 0x11D9, 0x4F18, 0x4F18, 0x10AA, 0x4F19, 0x4F19, 0x0804,
+ 0x4F1A, 0x4F1A, 0x07F6, 0x4F1B, 0x4F1B, 0x12A7, 0x4F1C, 0x4F1D, 0x27CF,
+ 0x4F1E, 0x4F1E, 0x0CDA, 0x4F1F, 0x4F1F, 0x0EBF, 0x4F20, 0x4F20, 0x052E,
+ 0x4F21, 0x4F21, 0x27D1, 0x4F22, 0x4F22, 0x12A9, 0x4F23, 0x4F23, 0x27D2,
+ 0x4F24, 0x4F24, 0x0D04, 0x4F25, 0x4F25, 0x12AC, 0x4F26, 0x4F26, 0x0A7E,
+ 0x4F27, 0x4F27, 0x12AD, 0x4F28, 0x4F29, 0x27D3, 0x4F2A, 0x4F2A, 0x0EC0,
+ 0x4F2B, 0x4F2B, 0x12AF, 0x4F2C, 0x4F2E, 0x27D5, 0x4F2F, 0x4F2F, 0x0475,
+ 0x4F30, 0x4F30, 0x0719, 0x4F31, 0x4F31, 0x27D8, 0x4F32, 0x4F32, 0x12B7,
+ 0x4F33, 0x4F33, 0x27D9, 0x4F34, 0x4F34, 0x03F4, 0x4F35, 0x4F35, 0x27DA,
+ 0x4F36, 0x4F36, 0x0A2F, 0x4F37, 0x4F37, 0x27DB, 0x4F38, 0x4F38, 0x0D25,
+ 0x4F39, 0x4F39, 0x27DC, 0x4F3A, 0x4F3A, 0x0DBA, 0x4F3B, 0x4F3B, 0x27DD,
+ 0x4F3C, 0x4F3C, 0x0DBB, 0x4F3D, 0x4F3D, 0x12B8, 0x4F3E, 0x4F42, 0x27DE,
+ 0x4F43, 0x4F43, 0x05C9, 0x4F44, 0x4F45, 0x27E3, 0x4F46, 0x4F46, 0x058C,
+ 0x4F47, 0x4F4C, 0x27E5, 0x4F4D, 0x4F4D, 0x0ECA, 0x4F4E, 0x4F4E, 0x05AE,
+ 0x4F4F, 0x4F4F, 0x11FE, 0x4F50, 0x4F50, 0x1251, 0x4F51, 0x4F51, 0x10B8,
+ 0x4F52, 0x4F52, 0x27EB, 0x4F53, 0x4F53, 0x0E38, 0x4F54, 0x4F54, 0x27EC,
+ 0x4F55, 0x4F55, 0x0785, 0x4F56, 0x4F56, 0x27ED, 0x4F57, 0x4F57, 0x12B6,
+ 0x4F58, 0x4F58, 0x12F0, 0x4F59, 0x4F59, 0x10C5, 0x4F5A, 0x4F5A, 0x12B3,
+ 0x4F5B, 0x4F5B, 0x068D, 0x4F5C, 0x4F5C, 0x1254, 0x4F5D, 0x4F5D, 0x12B4,
+ 0x4F5E, 0x4F5E, 0x12B0, 0x4F5F, 0x4F5F, 0x12B5, 0x4F60, 0x4F60, 0x0B46,
+ 0x4F61, 0x4F62, 0x27EE, 0x4F63, 0x4F63, 0x109B, 0x4F64, 0x4F64, 0x12AA,
+ 0x4F65, 0x4F65, 0x12F1, 0x4F66, 0x4F66, 0x27F0, 0x4F67, 0x4F67, 0x12B1,
+ 0x4F68, 0x4F68, 0x27F1, 0x4F69, 0x4F69, 0x0BA6, 0x4F6A, 0x4F6B, 0x27F2,
+ 0x4F6C, 0x4F6C, 0x09BB, 0x4F6D, 0x4F6E, 0x27F4, 0x4F6F, 0x4F6F, 0x1019,
+ 0x4F70, 0x4F70, 0x03E6, 0x4F71, 0x4F72, 0x27F6, 0x4F73, 0x4F73, 0x0844,
+ 0x4F74, 0x4F74, 0x12BA, 0x4F75, 0x4F75, 0x27F8, 0x4F76, 0x4F76, 0x12B9,
+ 0x4F77, 0x4F7A, 0x27F9, 0x4F7B, 0x4F7B, 0x12C0, 0x4F7C, 0x4F7C, 0x12C2,
+ 0x4F7D, 0x4F7D, 0x27FD, 0x4F7E, 0x4F7E, 0x12BF, 0x4F7F, 0x4F7F, 0x0D50,
+ 0x4F80, 0x4F82, 0x27FE, 0x4F83, 0x4F83, 0x12BD, 0x4F84, 0x4F84, 0x11B5,
+ 0x4F85, 0x4F85, 0x2801, 0x4F86, 0x4F86, 0x1FF2, 0x4F87, 0x4F87, 0x2802,
+ 0x4F88, 0x4F88, 0x0503, 0x4F89, 0x4F89, 0x12BC, 0x4F8A, 0x4F8A, 0x2803,
+ 0x4F8B, 0x4F8B, 0x09E8, 0x4F8C, 0x4F8C, 0x2804, 0x4F8D, 0x4F8D, 0x0D63,
+ 0x4F8E, 0x4F8E, 0x2805, 0x4F8F, 0x4F8F, 0x12BE, 0x4F90, 0x4F90, 0x2806,
+ 0x4F91, 0x4F91, 0x12BB, 0x4F92, 0x4F93, 0x2807, 0x4F94, 0x4F94, 0x12C4,
+ 0x4F95, 0x4F95, 0x2809, 0x4F96, 0x4F96, 0x205D, 0x4F97, 0x4F97, 0x05F0,
+ 0x4F98, 0x4F9A, 0x280A, 0x4F9B, 0x4F9B, 0x0702, 0x4F9C, 0x4F9C, 0x280D,
+ 0x4F9D, 0x4F9D, 0x1047, 0x4F9E, 0x4F9F, 0x280E, 0x4FA0, 0x4FA0, 0x0F2D,
+ 0x4FA1, 0x4FA2, 0x2810, 0x4FA3, 0x4FA3, 0x0A69, 0x4FA4, 0x4FA4, 0x2812,
+ 0x4FA5, 0x4FA5, 0x0895, 0x4FA6, 0x4FA6, 0x118D, 0x4FA7, 0x4FA7, 0x04A7,
+ 0x4FA8, 0x4FA8, 0x0C45, 0x4FA9, 0x4FA9, 0x0978, 0x4FAA, 0x4FAA, 0x12C1,
+ 0x4FAB, 0x4FAB, 0x2813, 0x4FAC, 0x4FAC, 0x12C3, 0x4FAD, 0x4FAD, 0x2814,
+ 0x4FAE, 0x4FAE, 0x0EF9, 0x4FAF, 0x4FAF, 0x07A5, 0x4FB0, 0x4FB4, 0x2815,
+ 0x4FB5, 0x4FB5, 0x0C53, 0x4FB6, 0x4FBE, 0x281A, 0x4FBF, 0x4FBF, 0x044C,
+ 0x4FC0, 0x4FC1, 0x2823, 0x4FC2, 0x4FC2, 0x269C, 0x4FC3, 0x4FC3, 0x055C,
+ 0x4FC4, 0x4FC4, 0x062C, 0x4FC5, 0x4FC5, 0x12C8, 0x4FC6, 0x4FC9, 0x2825,
+ 0x4FCA, 0x4FCA, 0x092E, 0x4FCB, 0x4FCD, 0x2829, 0x4FCE, 0x4FCE, 0x12F2,
+ 0x4FCF, 0x4FCF, 0x0C4B, 0x4FD0, 0x4FD0, 0x09E9, 0x4FD1, 0x4FD1, 0x12CC,
+ 0x4FD2, 0x4FD6, 0x282C, 0x4FD7, 0x4FD7, 0x0DCC, 0x4FD8, 0x4FD8, 0x069A,
+ 0x4FD9, 0x4FD9, 0x2831, 0x4FDA, 0x4FDA, 0x12C9, 0x4FDB, 0x4FDB, 0x2832,
+ 0x4FDC, 0x4FDC, 0x12CB, 0x4FDD, 0x4FDD, 0x040C, 0x4FDE, 0x4FDE, 0x10C6,
+ 0x4FDF, 0x4FDF, 0x12CD, 0x4FE0, 0x4FE0, 0x21B5, 0x4FE1, 0x4FE1, 0x0F90,
+ 0x4FE2, 0x4FE2, 0x2833, 0x4FE3, 0x4FE3, 0x12CA, 0x4FE4, 0x4FE5, 0x2834,
+ 0x4FE6, 0x4FE6, 0x12C5, 0x4FE7, 0x4FE7, 0x2836, 0x4FE8, 0x4FE8, 0x12C6,
+ 0x4FE9, 0x4FE9, 0x09F2, 0x4FEA, 0x4FEA, 0x12C7, 0x4FEB, 0x4FEC, 0x2837,
+ 0x4FED, 0x4FED, 0x0866, 0x4FEE, 0x4FEE, 0x0FA9, 0x4FEF, 0x4FEF, 0x06A4,
+ 0x4FF0, 0x4FF0, 0x2839, 0x4FF1, 0x4FF1, 0x0912, 0x4FF2, 0x4FF2, 0x283A,
+ 0x4FF3, 0x4FF3, 0x12D1, 0x4FF4, 0x4FF7, 0x283B, 0x4FF8, 0x4FF8, 0x12CE,
+ 0x4FF9, 0x4FF9, 0x283F, 0x4FFA, 0x4FFA, 0x03BE, 0x4FFB, 0x4FFD, 0x2840,
+ 0x4FFE, 0x4FFE, 0x12D6, 0x4FFF, 0x4FFF, 0x2843, 0x5000, 0x5000, 0x22CC,
+ 0x5001, 0x5005, 0x2844, 0x5006, 0x5006, 0x2016, 0x5007, 0x5008, 0x2849,
+ 0x5009, 0x5009, 0x1E62, 0x500A, 0x500A, 0x284B, 0x500B, 0x500B, 0x1F20,
+ 0x500C, 0x500C, 0x12D8, 0x500D, 0x500D, 0x041F, 0x500E, 0x500E, 0x284C,
+ 0x500F, 0x500F, 0x12D3, 0x5010, 0x5010, 0x284D, 0x5011, 0x5011, 0x207F,
+ 0x5012, 0x5012, 0x059A, 0x5013, 0x5013, 0x284E, 0x5014, 0x5014, 0x0922,
+ 0x5015, 0x5017, 0x284F, 0x5018, 0x5018, 0x0E1B, 0x5019, 0x5019, 0x07A9,
+ 0x501A, 0x501A, 0x1057, 0x501B, 0x501B, 0x2852, 0x501C, 0x501C, 0x12D7,
+ 0x501D, 0x501E, 0x2853, 0x501F, 0x501F, 0x08B9, 0x5020, 0x5020, 0x2855,
+ 0x5021, 0x5021, 0x04D0, 0x5022, 0x5024, 0x2856, 0x5025, 0x5025, 0x12D9,
+ 0x5026, 0x5026, 0x091A, 0x5027, 0x5027, 0x2859, 0x5028, 0x5028, 0x12DA,
+ 0x5029, 0x5029, 0x12CF, 0x502A, 0x502A, 0x0B42, 0x502B, 0x502B, 0x205C,
+ 0x502C, 0x502C, 0x12D2, 0x502D, 0x502D, 0x12D5, 0x502E, 0x502E, 0x12D4,
+ 0x502F, 0x5039, 0x285A, 0x503A, 0x503A, 0x114F, 0x503B, 0x503B, 0x2865,
+ 0x503C, 0x503C, 0x11B4, 0x503D, 0x503D, 0x2866, 0x503E, 0x503E, 0x0C60,
+ 0x503F, 0x5042, 0x2867, 0x5043, 0x5043, 0x12DC, 0x5044, 0x5046, 0x286B,
+ 0x5047, 0x5047, 0x084C, 0x5048, 0x5048, 0x12DE, 0x5049, 0x5049, 0x2194,
+ 0x504A, 0x504B, 0x286E, 0x504C, 0x504C, 0x12D0, 0x504D, 0x504D, 0x2870,
+ 0x504E, 0x504E, 0x12DF, 0x504F, 0x504F, 0x0BCA, 0x5050, 0x5054, 0x2871,
+ 0x5055, 0x5055, 0x12DD, 0x5056, 0x5059, 0x2876, 0x505A, 0x505A, 0x1253,
+ 0x505B, 0x505B, 0x287A, 0x505C, 0x505C, 0x0E54, 0x505D, 0x5064, 0x287B,
+ 0x5065, 0x5065, 0x0872, 0x5066, 0x506B, 0x2883, 0x506C, 0x506C, 0x12E0,
+ 0x506D, 0x5073, 0x2889, 0x5074, 0x5074, 0x1E65, 0x5075, 0x5075, 0x2281,
+ 0x5076, 0x5076, 0x0B7D, 0x5077, 0x5077, 0x0E66, 0x5078, 0x507A, 0x2890,
+ 0x507B, 0x507B, 0x12E1, 0x507C, 0x507D, 0x2893, 0x507E, 0x507E, 0x12DB,
+ 0x507F, 0x507F, 0x04CA, 0x5080, 0x5080, 0x098B, 0x5081, 0x5084, 0x2895,
+ 0x5085, 0x5085, 0x06B0, 0x5086, 0x5087, 0x2899, 0x5088, 0x5088, 0x09E7,
+ 0x5089, 0x508C, 0x289B, 0x508D, 0x508D, 0x0403, 0x508E, 0x5095, 0x289F,
+ 0x5096, 0x5096, 0x22CD, 0x5097, 0x5097, 0x28A7, 0x5098, 0x5098, 0x210A,
+ 0x5099, 0x5099, 0x1E3E, 0x509A, 0x50A1, 0x28A8, 0x50A2, 0x50A2, 0x267F,
+ 0x50A3, 0x50A3, 0x0579, 0x50A4, 0x50A4, 0x28B0, 0x50A5, 0x50A5, 0x12E2,
+ 0x50A6, 0x50A6, 0x28B1, 0x50A7, 0x50A7, 0x12E3, 0x50A8, 0x50A8, 0x0525,
+ 0x50A9, 0x50A9, 0x12E4, 0x50AA, 0x50AB, 0x28B2, 0x50AC, 0x50AC, 0x0562,
+ 0x50AD, 0x50AD, 0x222E, 0x50AE, 0x50B1, 0x28B4, 0x50B2, 0x50B2, 0x03CC,
+ 0x50B3, 0x50B3, 0x1E96, 0x50B4, 0x50B4, 0x22CB, 0x50B5, 0x50B5, 0x226C,
+ 0x50B6, 0x50B6, 0x28B8, 0x50B7, 0x50B7, 0x2117, 0x50B8, 0x50B9, 0x28B9,
+ 0x50BA, 0x50BA, 0x12E5, 0x50BB, 0x50BB, 0x0CEE, 0x50BC, 0x50BD, 0x28BB,
+ 0x50BE, 0x50BE, 0x20E8, 0x50BF, 0x50C1, 0x28BD, 0x50C2, 0x50C2, 0x22D4,
+ 0x50C3, 0x50C4, 0x28C0, 0x50C5, 0x50C5, 0x1FB9, 0x50C6, 0x50C8, 0x28C2,
+ 0x50C9, 0x50C9, 0x22D8, 0x50CA, 0x50CE, 0x28C5, 0x50CF, 0x50CF, 0x0F5E,
+ 0x50D0, 0x50D0, 0x28CA, 0x50D1, 0x50D1, 0x20DF, 0x50D2, 0x50D4, 0x28CB,
+ 0x50D5, 0x50D5, 0x20C2, 0x50D6, 0x50D6, 0x12E6, 0x50D7, 0x50D9, 0x28CE,
+ 0x50DA, 0x50DA, 0x0A0E, 0x50DB, 0x50DD, 0x28D1, 0x50DE, 0x50DE, 0x2195,
+ 0x50DF, 0x50E4, 0x28D4, 0x50E5, 0x50E5, 0x1FAC, 0x50E6, 0x50E6, 0x12EA,
+ 0x50E7, 0x50E7, 0x0CE7, 0x50E8, 0x50E8, 0x22D3, 0x50E9, 0x50EB, 0x28DA,
+ 0x50EC, 0x50EC, 0x12E9, 0x50ED, 0x50ED, 0x12E8, 0x50EE, 0x50EE, 0x12EB,
+ 0x50EF, 0x50F2, 0x28DD, 0x50F3, 0x50F3, 0x0DD0, 0x50F4, 0x50F4, 0x28E1,
+ 0x50F5, 0x50F5, 0x087A, 0x50F6, 0x50F8, 0x28E2, 0x50F9, 0x50F9, 0x1F81,
+ 0x50FA, 0x50FA, 0x28E5, 0x50FB, 0x50FB, 0x0BC6, 0x50FC, 0x50FF, 0x28E6,
+ 0x5100, 0x5100, 0x2210, 0x5101, 0x5101, 0x28EA, 0x5102, 0x5102, 0x22CF,
+ 0x5103, 0x5103, 0x28EB, 0x5104, 0x5104, 0x2213, 0x5105, 0x5105, 0x28EC,
+ 0x5106, 0x5106, 0x12E7, 0x5107, 0x5107, 0x12EC, 0x5108, 0x5108, 0x1FE4,
+ 0x5109, 0x5109, 0x1F90, 0x510A, 0x510A, 0x28ED, 0x510B, 0x510B, 0x12ED,
+ 0x510C, 0x510F, 0x28EE, 0x5110, 0x5110, 0x22D6, 0x5111, 0x5111, 0x28F2,
+ 0x5112, 0x5112, 0x0CC0, 0x5113, 0x5113, 0x28F3, 0x5114, 0x5114, 0x22D0,
+ 0x5115, 0x5115, 0x22CE, 0x5116, 0x5117, 0x28F4, 0x5118, 0x5118, 0x2681,
+ 0x5119, 0x511E, 0x28F6, 0x511F, 0x511F, 0x1E76, 0x5120, 0x5120, 0x28FC,
+ 0x5121, 0x5121, 0x09C7, 0x5122, 0x5129, 0x28FD, 0x512A, 0x512A, 0x2231,
+ 0x512B, 0x5131, 0x2905, 0x5132, 0x5132, 0x1E93, 0x5133, 0x5136, 0x290C,
+ 0x5137, 0x5137, 0x22D2, 0x5138, 0x5139, 0x2910, 0x513A, 0x513A, 0x22D7,
+ 0x513B, 0x513B, 0x22D5, 0x513C, 0x513C, 0x22D1, 0x513D, 0x513E, 0x2912,
+ 0x513F, 0x513F, 0x0638, 0x5140, 0x5140, 0x1259, 0x5141, 0x5141, 0x110D,
+ 0x5142, 0x5142, 0x2914, 0x5143, 0x5143, 0x10ED, 0x5144, 0x5144, 0x0FA1,
+ 0x5145, 0x5145, 0x0509, 0x5146, 0x5146, 0x1178, 0x5147, 0x5147, 0x2915,
+ 0x5148, 0x5148, 0x0F35, 0x5149, 0x5149, 0x073B, 0x514A, 0x514A, 0x2916,
+ 0x514B, 0x514B, 0x0958, 0x514C, 0x514C, 0x2917, 0x514D, 0x514D, 0x0AE7,
+ 0x514E, 0x5150, 0x2918, 0x5151, 0x5151, 0x0611, 0x5152, 0x5152, 0x1EE5,
+ 0x5153, 0x5153, 0x291B, 0x5154, 0x5154, 0x0E74, 0x5155, 0x5155, 0x1302,
+ 0x5156, 0x5156, 0x1304, 0x5157, 0x5159, 0x291C, 0x515A, 0x515A, 0x0594,
+ 0x515B, 0x515B, 0x291F, 0x515C, 0x515C, 0x05F4, 0x515D, 0x5161, 0x2920,
+ 0x5162, 0x5162, 0x08D3, 0x5163, 0x5164, 0x2925, 0x5165, 0x5165, 0x0CC6,
+ 0x5166, 0x5167, 0x2927, 0x5168, 0x5168, 0x0C86, 0x5169, 0x5169, 0x2025,
+ 0x516A, 0x516A, 0x2929, 0x516B, 0x516B, 0x03D6, 0x516C, 0x516C, 0x0704,
+ 0x516D, 0x516D, 0x0A42, 0x516E, 0x516E, 0x12F6, 0x516F, 0x516F, 0x292A,
+ 0x5170, 0x5170, 0x09A7, 0x5171, 0x5171, 0x070B, 0x5172, 0x5172, 0x292B,
+ 0x5173, 0x5173, 0x0731, 0x5174, 0x5174, 0x0F96, 0x5175, 0x5175, 0x0461,
+ 0x5176, 0x5176, 0x0C03, 0x5177, 0x5177, 0x090E, 0x5178, 0x5178, 0x05C5,
+ 0x5179, 0x5179, 0x1225, 0x517A, 0x517A, 0x292C, 0x517B, 0x517B, 0x1021,
+ 0x517C, 0x517C, 0x0859, 0x517D, 0x517D, 0x0D75, 0x517E, 0x517F, 0x292D,
+ 0x5180, 0x5180, 0x0830, 0x5181, 0x5181, 0x12FA, 0x5182, 0x5182, 0x129D,
+ 0x5183, 0x5184, 0x292F, 0x5185, 0x5185, 0x0B3D, 0x5186, 0x5187, 0x2931,
+ 0x5188, 0x5188, 0x06CF, 0x5189, 0x5189, 0x0C98, 0x518A, 0x518B, 0x2933,
+ 0x518C, 0x518C, 0x04A8, 0x518D, 0x518D, 0x111C, 0x518E, 0x5191, 0x2935,
+ 0x5192, 0x5192, 0x0AB5, 0x5193, 0x5194, 0x2939, 0x5195, 0x5195, 0x0AE6,
+ 0x5196, 0x5196, 0x1314, 0x5197, 0x5197, 0x0CBA, 0x5198, 0x5198, 0x293B,
+ 0x5199, 0x5199, 0x0F7F, 0x519A, 0x519A, 0x293C, 0x519B, 0x519B, 0x092B,
+ 0x519C, 0x519C, 0x0B6A, 0x519D, 0x519F, 0x293D, 0x51A0, 0x51A0, 0x0733,
+ 0x51A1, 0x51A1, 0x2940, 0x51A2, 0x51A2, 0x1315, 0x51A3, 0x51A3, 0x2941,
+ 0x51A4, 0x51A4, 0x10EC, 0x51A5, 0x51A5, 0x1316, 0x51A6, 0x51AA, 0x2942,
+ 0x51AB, 0x51AB, 0x130F, 0x51AC, 0x51AC, 0x05EB, 0x51AD, 0x51AE, 0x2947,
+ 0x51AF, 0x51AF, 0x0688, 0x51B0, 0x51B0, 0x0462, 0x51B1, 0x51B1, 0x1310,
+ 0x51B2, 0x51B2, 0x050A, 0x51B3, 0x51B3, 0x0925, 0x51B4, 0x51B4, 0x2949,
+ 0x51B5, 0x51B5, 0x0983, 0x51B6, 0x51B6, 0x1038, 0x51B7, 0x51B7, 0x09CF,
+ 0x51B8, 0x51BA, 0x294A, 0x51BB, 0x51BB, 0x05F2, 0x51BC, 0x51BC, 0x1312,
+ 0x51BD, 0x51BD, 0x1311, 0x51BE, 0x51BF, 0x294D, 0x51C0, 0x51C0, 0x08EA,
+ 0x51C1, 0x51C3, 0x294F, 0x51C4, 0x51C4, 0x0BFF, 0x51C5, 0x51C5, 0x2952,
+ 0x51C6, 0x51C6, 0x1219, 0x51C7, 0x51C7, 0x1313, 0x51C8, 0x51C8, 0x2953,
+ 0x51C9, 0x51C9, 0x0A02, 0x51CA, 0x51CA, 0x2954, 0x51CB, 0x51CB, 0x05D3,
+ 0x51CC, 0x51CC, 0x0A31, 0x51CD, 0x51CD, 0x1ECF, 0x51CE, 0x51CE, 0x2955,
+ 0x51CF, 0x51CF, 0x0868, 0x51D0, 0x51D0, 0x2956, 0x51D1, 0x51D1, 0x0558,
+ 0x51D2, 0x51DA, 0x2957, 0x51DB, 0x51DB, 0x0A26, 0x51DC, 0x51DC, 0x2960,
+ 0x51DD, 0x51DD, 0x0B60, 0x51DE, 0x51DF, 0x2961, 0x51E0, 0x51E0, 0x082B,
+ 0x51E1, 0x51E1, 0x064F, 0x51E2, 0x51E3, 0x2963, 0x51E4, 0x51E4, 0x068C,
+ 0x51E5, 0x51EA, 0x2965, 0x51EB, 0x51EB, 0x1300, 0x51EC, 0x51EC, 0x296B,
+ 0x51ED, 0x51ED, 0x0BDD, 0x51EE, 0x51EE, 0x296C, 0x51EF, 0x51EF, 0x093A,
+ 0x51F0, 0x51F0, 0x07E0, 0x51F1, 0x51F1, 0x1FD9, 0x51F2, 0x51F2, 0x296D,
+ 0x51F3, 0x51F3, 0x05AB, 0x51F4, 0x51F4, 0x296E, 0x51F5, 0x51F5, 0x1399,
+ 0x51F6, 0x51F6, 0x0FA2, 0x51F7, 0x51F7, 0x296F, 0x51F8, 0x51F8, 0x0E6A,
+ 0x51F9, 0x51F9, 0x03C7, 0x51FA, 0x51FA, 0x051B, 0x51FB, 0x51FB, 0x080C,
+ 0x51FC, 0x51FC, 0x139A, 0x51FD, 0x51FD, 0x0766, 0x51FE, 0x51FE, 0x2970,
+ 0x51FF, 0x51FF, 0x1127, 0x5200, 0x5200, 0x0597, 0x5201, 0x5201, 0x05D4,
+ 0x5202, 0x5202, 0x128C, 0x5203, 0x5203, 0x0CAB, 0x5204, 0x5205, 0x2971,
+ 0x5206, 0x5206, 0x0673, 0x5207, 0x5207, 0x0C4D, 0x5208, 0x5208, 0x128D,
+ 0x5209, 0x5209, 0x2973, 0x520A, 0x520A, 0x093C, 0x520B, 0x520C, 0x2974,
+ 0x520D, 0x520D, 0x138B, 0x520E, 0x520E, 0x128E, 0x520F, 0x5210, 0x2976,
+ 0x5211, 0x5211, 0x0F97, 0x5212, 0x5212, 0x07C3, 0x5213, 0x5215, 0x2978,
+ 0x5216, 0x5216, 0x196E, 0x5217, 0x5217, 0x0A19, 0x5218, 0x5218, 0x0A3E,
+ 0x5219, 0x5219, 0x1135, 0x521A, 0x521A, 0x06D0, 0x521B, 0x521B, 0x0537,
+ 0x521C, 0x521C, 0x297B, 0x521D, 0x521D, 0x051A, 0x521E, 0x521F, 0x297C,
+ 0x5220, 0x5220, 0x0CF7, 0x5221, 0x5223, 0x297E, 0x5224, 0x5224, 0x0B91,
+ 0x5225, 0x5227, 0x2981, 0x5228, 0x5228, 0x0B9A, 0x5229, 0x5229, 0x09E6,
+ 0x522A, 0x522A, 0x2984, 0x522B, 0x522B, 0x0459, 0x522C, 0x522C, 0x2985,
+ 0x522D, 0x522D, 0x128F, 0x522E, 0x522E, 0x0727, 0x522F, 0x522F, 0x2986,
+ 0x5230, 0x5230, 0x059E, 0x5231, 0x5232, 0x2987, 0x5233, 0x5233, 0x1290,
+ 0x5234, 0x5235, 0x2989, 0x5236, 0x5236, 0x11C5, 0x5237, 0x5237, 0x0D97,
+ 0x5238, 0x5238, 0x0C8A, 0x5239, 0x5239, 0x0CEB, 0x523A, 0x523A, 0x054F,
+ 0x523B, 0x523B, 0x0959, 0x523C, 0x523C, 0x298B, 0x523D, 0x523D, 0x074D,
+ 0x523E, 0x523E, 0x298C, 0x523F, 0x5240, 0x1291, 0x5241, 0x5241, 0x0626,
+ 0x5242, 0x5242, 0x0834, 0x5243, 0x5243, 0x0E3D, 0x5244, 0x5244, 0x22C8,
+ 0x5245, 0x5246, 0x298D, 0x5247, 0x5247, 0x2263, 0x5248, 0x5249, 0x298F,
+ 0x524A, 0x524A, 0x0F64, 0x524B, 0x524B, 0x2683, 0x524C, 0x524C, 0x1293,
+ 0x524D, 0x524D, 0x0C2D, 0x524E, 0x524F, 0x2991, 0x5250, 0x5250, 0x0729,
+ 0x5251, 0x5251, 0x0874, 0x5252, 0x5253, 0x2993, 0x5254, 0x5254, 0x0E31,
+ 0x5255, 0x5255, 0x2995, 0x5256, 0x5256, 0x0BE9, 0x5257, 0x525A, 0x2996,
+ 0x525B, 0x525B, 0x1F17, 0x525C, 0x525C, 0x1296, 0x525D, 0x525D, 0x299A,
+ 0x525E, 0x525E, 0x1294, 0x525F, 0x5260, 0x299B, 0x5261, 0x5261, 0x1295,
+ 0x5262, 0x5264, 0x299D, 0x5265, 0x5265, 0x0409, 0x5266, 0x5266, 0x29A0,
+ 0x5267, 0x5267, 0x0916, 0x5268, 0x5268, 0x29A1, 0x5269, 0x5269, 0x0D3A,
+ 0x526A, 0x526A, 0x0867, 0x526B, 0x526D, 0x29A2, 0x526E, 0x526E, 0x1F2B,
+ 0x526F, 0x526F, 0x06AC, 0x5270, 0x5271, 0x29A5, 0x5272, 0x5272, 0x06E9,
+ 0x5273, 0x5273, 0x29A7, 0x5274, 0x5274, 0x22CA, 0x5275, 0x5275, 0x1E99,
+ 0x5276, 0x527C, 0x29A8, 0x527D, 0x527D, 0x1298, 0x527E, 0x527E, 0x29AF,
+ 0x527F, 0x527F, 0x089C, 0x5280, 0x5280, 0x29B0, 0x5281, 0x5281, 0x129A,
+ 0x5282, 0x5282, 0x1299, 0x5283, 0x5283, 0x1F4F, 0x5284, 0x5286, 0x29B1,
+ 0x5287, 0x5287, 0x1FCF, 0x5288, 0x5288, 0x0BBD, 0x5289, 0x5289, 0x2036,
+ 0x528A, 0x528A, 0x1F3A, 0x528B, 0x528B, 0x29B4, 0x528C, 0x528C, 0x22C9,
+ 0x528D, 0x528D, 0x1F99, 0x528E, 0x528F, 0x29B5, 0x5290, 0x5290, 0x129B,
+ 0x5291, 0x5291, 0x1F75, 0x5292, 0x5292, 0x29B7, 0x5293, 0x5293, 0x129C,
+ 0x5294, 0x529A, 0x29B8, 0x529B, 0x529B, 0x09EF, 0x529C, 0x529C, 0x29BF,
+ 0x529D, 0x529D, 0x0C8B, 0x529E, 0x529E, 0x03F7, 0x529F, 0x529F, 0x06FF,
+ 0x52A0, 0x52A0, 0x0846, 0x52A1, 0x52A1, 0x0F00, 0x52A2, 0x52A2, 0x138D,
+ 0x52A3, 0x52A3, 0x0A1C, 0x52A4, 0x52A7, 0x29C0, 0x52A8, 0x52A8, 0x05EE,
+ 0x52A9, 0x52A9, 0x11F9, 0x52AA, 0x52AA, 0x0B6D, 0x52AB, 0x52AB, 0x08AA,
+ 0x52AC, 0x52AD, 0x138E, 0x52AE, 0x52B0, 0x29C4, 0x52B1, 0x52B1, 0x09E3,
+ 0x52B2, 0x52B2, 0x08D1, 0x52B3, 0x52B3, 0x09B8, 0x52B4, 0x52BD, 0x29C7,
+ 0x52BE, 0x52BE, 0x1390, 0x52BF, 0x52BF, 0x0D5D, 0x52C0, 0x52C0, 0x29D1,
+ 0x52C1, 0x52C1, 0x1FBE, 0x52C2, 0x52C2, 0x29D2, 0x52C3, 0x52C3, 0x0471,
+ 0x52C4, 0x52C6, 0x29D3, 0x52C7, 0x52C7, 0x10A7, 0x52C8, 0x52C8, 0x29D6,
+ 0x52C9, 0x52C9, 0x0AE8, 0x52CA, 0x52CA, 0x29D7, 0x52CB, 0x52CB, 0x0FD4,
+ 0x52CC, 0x52CF, 0x29D8, 0x52D0, 0x52D0, 0x1392, 0x52D1, 0x52D1, 0x29DC,
+ 0x52D2, 0x52D2, 0x09C0, 0x52D3, 0x52D4, 0x29DD, 0x52D5, 0x52D5, 0x1ECD,
+ 0x52D6, 0x52D6, 0x1393, 0x52D7, 0x52D7, 0x29DF, 0x52D8, 0x52D8, 0x093E,
+ 0x52D9, 0x52D9, 0x21A9, 0x52DA, 0x52DA, 0x29E0, 0x52DB, 0x52DB, 0x21E6,
+ 0x52DC, 0x52DC, 0x29E1, 0x52DD, 0x52DD, 0x2127, 0x52DE, 0x52DE, 0x2003,
+ 0x52DF, 0x52DF, 0x0B1F, 0x52E0, 0x52E1, 0x29E2, 0x52E2, 0x52E2, 0x2132,
+ 0x52E3, 0x52E3, 0x29E4, 0x52E4, 0x52E4, 0x0C57, 0x52E5, 0x52EF, 0x29E5,
+ 0x52F0, 0x52F0, 0x1394, 0x52F1, 0x52F1, 0x2323, 0x52F2, 0x52F4, 0x29F0,
+ 0x52F5, 0x52F5, 0x2011, 0x52F6, 0x52F7, 0x29F3, 0x52F8, 0x52F8, 0x20F5,
+ 0x52F9, 0x52F9, 0x12FC, 0x52FA, 0x52FA, 0x0D10, 0x52FB, 0x52FD, 0x29F5,
+ 0x52FE, 0x52FE, 0x070D, 0x52FF, 0x52FF, 0x0EFF, 0x5300, 0x5300, 0x110B,
+ 0x5301, 0x5304, 0x29F8, 0x5305, 0x5305, 0x0407, 0x5306, 0x5306, 0x0555,
+ 0x5307, 0x5307, 0x29FC, 0x5308, 0x5308, 0x0FA4, 0x5309, 0x530C, 0x29FD,
+ 0x530D, 0x530D, 0x12FD, 0x530E, 0x530E, 0x2A01, 0x530F, 0x530F, 0x14B5,
+ 0x5310, 0x5310, 0x12FF, 0x5311, 0x5314, 0x2A02, 0x5315, 0x5315, 0x1266,
+ 0x5316, 0x5316, 0x07C4, 0x5317, 0x5317, 0x041A, 0x5318, 0x5318, 0x2A06,
+ 0x5319, 0x5319, 0x04FC, 0x531A, 0x531A, 0x1284, 0x531B, 0x531C, 0x2A07,
+ 0x531D, 0x531D, 0x1114, 0x531E, 0x531F, 0x2A09, 0x5320, 0x5320, 0x0884,
+ 0x5321, 0x5321, 0x097C, 0x5322, 0x5322, 0x2A0B, 0x5323, 0x5323, 0x0F28,
+ 0x5324, 0x5325, 0x2A0C, 0x5326, 0x5326, 0x1286, 0x5327, 0x5329, 0x2A0E,
+ 0x532A, 0x532A, 0x0668, 0x532B, 0x532C, 0x2A11, 0x532D, 0x532D, 0x22C5,
+ 0x532E, 0x532E, 0x1287, 0x532F, 0x532F, 0x1F5E, 0x5330, 0x5330, 0x2A13,
+ 0x5331, 0x5331, 0x22C6, 0x5332, 0x5338, 0x2A14, 0x5339, 0x5339, 0x0BC4,
+ 0x533A, 0x533A, 0x0C75, 0x533B, 0x533B, 0x1044, 0x533C, 0x533D, 0x2A1B,
+ 0x533E, 0x533E, 0x1288, 0x533F, 0x533F, 0x0B47, 0x5340, 0x5340, 0x20EF,
+ 0x5341, 0x5341, 0x0D45, 0x5342, 0x5342, 0x2A1D, 0x5343, 0x5343, 0x0C24,
+ 0x5344, 0x5344, 0x2A1E, 0x5345, 0x5345, 0x125C, 0x5346, 0x5346, 0x2A1F,
+ 0x5347, 0x5347, 0x0D36, 0x5348, 0x5348, 0x0EF6, 0x5349, 0x5349, 0x07F1,
+ 0x534A, 0x534A, 0x03F6, 0x534B, 0x534D, 0x2A20, 0x534E, 0x534E, 0x07BF,
+ 0x534F, 0x534F, 0x0F78, 0x5350, 0x5350, 0x2A23, 0x5351, 0x5351, 0x0419,
+ 0x5352, 0x5352, 0x1241, 0x5353, 0x5353, 0x121C, 0x5354, 0x5354, 0x21D0,
+ 0x5355, 0x5355, 0x0586, 0x5356, 0x5356, 0x0A9B, 0x5357, 0x5357, 0x0B32,
+ 0x5358, 0x5359, 0x2A24, 0x535A, 0x535A, 0x0470, 0x535B, 0x535B, 0x2A26,
+ 0x535C, 0x535C, 0x047E, 0x535D, 0x535D, 0x2A27, 0x535E, 0x535E, 0x044E,
+ 0x535F, 0x535F, 0x14FA, 0x5360, 0x5360, 0x115D, 0x5361, 0x5361, 0x0935,
+ 0x5362, 0x5362, 0x0A53, 0x5363, 0x5363, 0x128B, 0x5364, 0x5364, 0x0A58,
+ 0x5365, 0x5365, 0x2A28, 0x5366, 0x5366, 0x128A, 0x5367, 0x5367, 0x0EE3,
+ 0x5368, 0x5368, 0x2A29, 0x5369, 0x5369, 0x1352, 0x536A, 0x536A, 0x2A2A,
+ 0x536B, 0x536B, 0x0ECF, 0x536C, 0x536D, 0x2A2B, 0x536E, 0x536E, 0x126A,
+ 0x536F, 0x536F, 0x0AB3, 0x5370, 0x5370, 0x1086, 0x5371, 0x5371, 0x0EB2,
+ 0x5372, 0x5372, 0x2A2D, 0x5373, 0x5373, 0x0827, 0x5374, 0x5374, 0x0C8F,
+ 0x5375, 0x5375, 0x0A78, 0x5376, 0x5376, 0x2A2E, 0x5377, 0x5377, 0x091C,
+ 0x5378, 0x5378, 0x0F81, 0x5379, 0x5379, 0x2A2F, 0x537A, 0x537A, 0x1353,
+ 0x537B, 0x537E, 0x2A30, 0x537F, 0x537F, 0x0C61, 0x5380, 0x5381, 0x2A34,
+ 0x5382, 0x5382, 0x04CC, 0x5383, 0x5383, 0x2A36, 0x5384, 0x5384, 0x0631,
+ 0x5385, 0x5385, 0x0E4F, 0x5386, 0x5386, 0x09E5, 0x5387, 0x5388, 0x2A37,
+ 0x5389, 0x5389, 0x09E2, 0x538A, 0x538A, 0x2A39, 0x538B, 0x538B, 0x0FE2,
+ 0x538C, 0x538C, 0x100A, 0x538D, 0x538D, 0x127D, 0x538E, 0x5394, 0x2A3A,
+ 0x5395, 0x5395, 0x04A5, 0x5396, 0x5397, 0x2A41, 0x5398, 0x5398, 0x09D0,
+ 0x5399, 0x5399, 0x22C1, 0x539A, 0x539A, 0x07A8, 0x539B, 0x539C, 0x2A43,
+ 0x539D, 0x539D, 0x127E, 0x539E, 0x539E, 0x2A45, 0x539F, 0x539F, 0x10F0,
+ 0x53A0, 0x53A0, 0x1E64, 0x53A1, 0x53A1, 0x2A46, 0x53A2, 0x53A2, 0x0F4E,
+ 0x53A3, 0x53A3, 0x127F, 0x53A4, 0x53A4, 0x2A47, 0x53A5, 0x53A5, 0x1280,
+ 0x53A6, 0x53A6, 0x0F30, 0x53A7, 0x53A7, 0x2A48, 0x53A8, 0x53A8, 0x051D,
+ 0x53A9, 0x53A9, 0x08F6, 0x53AA, 0x53AC, 0x2A49, 0x53AD, 0x53AD, 0x21F9,
+ 0x53AE, 0x53AE, 0x1281, 0x53AF, 0x53B1, 0x2A4C, 0x53B2, 0x53B2, 0x2010,
+ 0x53B3, 0x53B3, 0x2A4F, 0x53B4, 0x53B4, 0x22C2, 0x53B5, 0x53B5, 0x2A50,
+ 0x53B6, 0x53B6, 0x139C, 0x53B7, 0x53BA, 0x2A51, 0x53BB, 0x53BB, 0x0C80,
+ 0x53BC, 0x53BE, 0x2A55, 0x53BF, 0x53BF, 0x0F45, 0x53C0, 0x53C0, 0x2A58,
+ 0x53C1, 0x53C1, 0x0CD9, 0x53C2, 0x53C2, 0x0495, 0x53C3, 0x53C3, 0x1E5A,
+ 0x53C4, 0x53C7, 0x2A59, 0x53C8, 0x53C8, 0x10BB, 0x53C9, 0x53C9, 0x04AD,
+ 0x53CA, 0x53CA, 0x0823, 0x53CB, 0x53CB, 0x10B6, 0x53CC, 0x53CC, 0x0DA0,
+ 0x53CD, 0x53CD, 0x0651, 0x53CE, 0x53D0, 0x2A5D, 0x53D1, 0x53D1, 0x063F,
+ 0x53D2, 0x53D3, 0x2A60, 0x53D4, 0x53D4, 0x0D7C, 0x53D5, 0x53D5, 0x2A62,
+ 0x53D6, 0x53D6, 0x0C7C, 0x53D7, 0x53D7, 0x0D73, 0x53D8, 0x53D8, 0x044D,
+ 0x53D9, 0x53D9, 0x0FBB, 0x53DA, 0x53DA, 0x2A63, 0x53DB, 0x53DB, 0x0B92,
+ 0x53DC, 0x53DE, 0x2A64, 0x53DF, 0x53DF, 0x1395, 0x53E0, 0x53E0, 0x05DF,
+ 0x53E1, 0x53E1, 0x2A67, 0x53E2, 0x53E2, 0x1EA2, 0x53E3, 0x53E3, 0x0967,
+ 0x53E4, 0x53E4, 0x071E, 0x53E5, 0x53E5, 0x0913, 0x53E6, 0x53E6, 0x0A36,
+ 0x53E7, 0x53E7, 0x2A68, 0x53E8, 0x53E8, 0x14FE, 0x53E9, 0x53E9, 0x14FD,
+ 0x53EA, 0x53EA, 0x11BA, 0x53EB, 0x53EB, 0x08A1, 0x53EC, 0x53EC, 0x117A,
+ 0x53ED, 0x53ED, 0x03D3, 0x53EE, 0x53EE, 0x05E2, 0x53EF, 0x53EF, 0x0956,
+ 0x53F0, 0x53F0, 0x0DFB, 0x53F1, 0x53F1, 0x14FB, 0x53F2, 0x53F2, 0x0D4E,
+ 0x53F3, 0x53F3, 0x10B7, 0x53F4, 0x53F4, 0x2A69, 0x53F5, 0x53F5, 0x1285,
+ 0x53F6, 0x53F6, 0x103D, 0x53F7, 0x53F7, 0x077C, 0x53F8, 0x53F8, 0x0DB3,
+ 0x53F9, 0x53F9, 0x0E11, 0x53FA, 0x53FA, 0x2A6A, 0x53FB, 0x53FB, 0x14FF,
+ 0x53FC, 0x53FC, 0x05D1, 0x53FD, 0x53FD, 0x14FC, 0x53FE, 0x53FF, 0x2A6B,
+ 0x5400, 0x5400, 0x2A6D, 0x5401, 0x5401, 0x10DA, 0x5402, 0x5402, 0x2A6E,
+ 0x5403, 0x5403, 0x04F9, 0x5404, 0x5404, 0x06F2, 0x5405, 0x5405, 0x2A6F,
+ 0x5406, 0x5406, 0x1502, 0x5407, 0x5407, 0x2A70, 0x5408, 0x5408, 0x0786,
+ 0x5409, 0x5409, 0x081D, 0x540A, 0x540A, 0x05D6, 0x540B, 0x540B, 0x2A71,
+ 0x540C, 0x540C, 0x0E5D, 0x540D, 0x540D, 0x0B00, 0x540E, 0x540E, 0x07AA,
+ 0x540F, 0x540F, 0x09DF, 0x5410, 0x5410, 0x0E73, 0x5411, 0x5411, 0x0F5F,
+ 0x5412, 0x5412, 0x1500, 0x5413, 0x5413, 0x0F32, 0x5414, 0x5414, 0x2A72,
+ 0x5415, 0x5415, 0x0A67, 0x5416, 0x5416, 0x1501, 0x5417, 0x5417, 0x0A97,
+ 0x5418, 0x541A, 0x2A73, 0x541B, 0x541B, 0x092C, 0x541C, 0x541C, 0x2A76,
+ 0x541D, 0x541D, 0x0A28, 0x541E, 0x541E, 0x0E7D, 0x541F, 0x541F, 0x107E,
+ 0x5420, 0x5420, 0x066A, 0x5421, 0x5421, 0x1509, 0x5422, 0x5422, 0x2A77,
+ 0x5423, 0x5423, 0x150C, 0x5424, 0x5425, 0x2A78, 0x5426, 0x5426, 0x068E,
+ 0x5427, 0x5427, 0x03D4, 0x5428, 0x5428, 0x0615, 0x5429, 0x5429, 0x0671,
+ 0x542A, 0x542A, 0x2A7A, 0x542B, 0x542B, 0x0763, 0x542C, 0x542C, 0x0E50,
+ 0x542D, 0x542D, 0x0961, 0x542E, 0x542E, 0x0DA6, 0x542F, 0x542F, 0x0C13,
+ 0x5430, 0x5430, 0x2A7B, 0x5431, 0x5431, 0x11A7, 0x5432, 0x5432, 0x150D,
+ 0x5433, 0x5433, 0x2A7C, 0x5434, 0x5434, 0x0EF1, 0x5435, 0x5435, 0x04D8,
+ 0x5436, 0x5437, 0x2A7D, 0x5438, 0x5438, 0x0F0B, 0x5439, 0x5439, 0x0538,
+ 0x543A, 0x543A, 0x2A7F, 0x543B, 0x543B, 0x0ED6, 0x543C, 0x543C, 0x07A7,
+ 0x543D, 0x543D, 0x2A80, 0x543E, 0x543E, 0x0EF0, 0x543F, 0x543F, 0x2A81,
+ 0x5440, 0x5440, 0x0FE6, 0x5441, 0x5442, 0x2A82, 0x5443, 0x5443, 0x1508,
+ 0x5444, 0x5445, 0x2A84, 0x5446, 0x5446, 0x0577, 0x5447, 0x5447, 0x2A86,
+ 0x5448, 0x5448, 0x04EF, 0x5449, 0x5449, 0x2A87, 0x544A, 0x544A, 0x06E1,
+ 0x544B, 0x544B, 0x1503, 0x544C, 0x544F, 0x2A88, 0x5450, 0x5450, 0x0B28,
+ 0x5451, 0x5451, 0x2A8C, 0x5452, 0x5454, 0x1504, 0x5455, 0x5455, 0x0B7C,
+ 0x5456, 0x5456, 0x1507, 0x5457, 0x5457, 0x150A, 0x5458, 0x5458, 0x10F4,
+ 0x5459, 0x5459, 0x150B, 0x545A, 0x545A, 0x2A8D, 0x545B, 0x545B, 0x0C37,
+ 0x545C, 0x545C, 0x0EE7, 0x545D, 0x5461, 0x2A8E, 0x5462, 0x5462, 0x0B3B,
+ 0x5463, 0x5463, 0x2A93, 0x5464, 0x5464, 0x1512, 0x5465, 0x5465, 0x2A94,
+ 0x5466, 0x5466, 0x1517, 0x5467, 0x5467, 0x2A95, 0x5468, 0x5468, 0x11DB,
+ 0x5469, 0x5470, 0x2A96, 0x5471, 0x5471, 0x1511, 0x5472, 0x5472, 0x1522,
+ 0x5473, 0x5473, 0x0EC5, 0x5474, 0x5474, 0x2A9E, 0x5475, 0x5475, 0x077E,
+ 0x5476, 0x5476, 0x1516, 0x5477, 0x5477, 0x1510, 0x5478, 0x5478, 0x0B9F,
+ 0x5479, 0x547A, 0x2A9F, 0x547B, 0x547B, 0x0D24, 0x547C, 0x547C, 0x07AB,
+ 0x547D, 0x547D, 0x0B01, 0x547E, 0x547F, 0x2AA1, 0x5480, 0x5480, 0x0906,
+ 0x5481, 0x5481, 0x2AA3, 0x5482, 0x5482, 0x150E, 0x5483, 0x5483, 0x2AA4,
+ 0x5484, 0x5484, 0x1515, 0x5485, 0x5485, 0x2AA5, 0x5486, 0x5486, 0x0B99,
+ 0x5487, 0x548A, 0x2AA6, 0x548B, 0x548B, 0x1147, 0x548C, 0x548C, 0x0784,
+ 0x548D, 0x548D, 0x2AAA, 0x548E, 0x548E, 0x08FB, 0x548F, 0x548F, 0x10A2,
+ 0x5490, 0x5490, 0x06BB, 0x5491, 0x5491, 0x2AAB, 0x5492, 0x5492, 0x11E3,
+ 0x5493, 0x5493, 0x2AAC, 0x5494, 0x5494, 0x150F, 0x5495, 0x5495, 0x0717,
+ 0x5496, 0x5496, 0x0934, 0x5497, 0x5498, 0x2AAD, 0x5499, 0x5499, 0x0A45,
+ 0x549A, 0x549B, 0x1513, 0x549C, 0x549C, 0x2AAF, 0x549D, 0x549D, 0x1518,
+ 0x549E, 0x54A2, 0x2AB0, 0x54A3, 0x54A3, 0x1523, 0x54A4, 0x54A4, 0x152D,
+ 0x54A5, 0x54A5, 0x2AB5, 0x54A6, 0x54A6, 0x151F, 0x54A7, 0x54A7, 0x151E,
+ 0x54A8, 0x54A8, 0x1226, 0x54A9, 0x54AA, 0x152B, 0x54AB, 0x54AB, 0x1767,
+ 0x54AC, 0x54AC, 0x102E, 0x54AD, 0x54AD, 0x151A, 0x54AE, 0x54AE, 0x2AB6,
+ 0x54AF, 0x54AF, 0x0936, 0x54B0, 0x54B0, 0x2AB7, 0x54B1, 0x54B1, 0x111E,
+ 0x54B2, 0x54B2, 0x2AB8, 0x54B3, 0x54B3, 0x0955, 0x54B4, 0x54B4, 0x151C,
+ 0x54B5, 0x54B7, 0x2AB9, 0x54B8, 0x54B8, 0x0F39, 0x54B9, 0x54BA, 0x2ABC,
+ 0x54BB, 0x54BB, 0x1525, 0x54BC, 0x54BC, 0x236D, 0x54BD, 0x54BD, 0x0FF3,
+ 0x54BE, 0x54BE, 0x2ABE, 0x54BF, 0x54BF, 0x1526, 0x54C0, 0x54C0, 0x03B2,
+ 0x54C1, 0x54C1, 0x0BD6, 0x54C2, 0x54C2, 0x151B, 0x54C3, 0x54C3, 0x2ABF,
+ 0x54C4, 0x54C4, 0x079C, 0x54C5, 0x54C5, 0x2AC0, 0x54C6, 0x54C6, 0x061E,
+ 0x54C7, 0x54C7, 0x0E8C, 0x54C8, 0x54C8, 0x0757, 0x54C9, 0x54C9, 0x1118,
+ 0x54CA, 0x54CB, 0x2AC1, 0x54CC, 0x54CC, 0x1527, 0x54CD, 0x54CD, 0x0F59,
+ 0x54CE, 0x54CE, 0x03B0, 0x54CF, 0x54CF, 0x152F, 0x54D0, 0x54D0, 0x1519,
+ 0x54D1, 0x54D1, 0x0FEF, 0x54D2, 0x54D2, 0x151D, 0x54D3, 0x54D4, 0x1520,
+ 0x54D5, 0x54D5, 0x1524, 0x54D6, 0x54D6, 0x2AC3, 0x54D7, 0x54D7, 0x07BE,
+ 0x54D8, 0x54D8, 0x2AC4, 0x54D9, 0x54DA, 0x1528, 0x54DB, 0x54DB, 0x2AC5,
+ 0x54DC, 0x54DC, 0x152A, 0x54DD, 0x54DD, 0x152E, 0x54DE, 0x54DE, 0x1530,
+ 0x54DF, 0x54DF, 0x1099, 0x54E0, 0x54E0, 0x2AC6, 0x54E1, 0x54E1, 0x2247,
+ 0x54E2, 0x54E4, 0x2AC7, 0x54E5, 0x54E5, 0x06E2, 0x54E6, 0x54E6, 0x0B77,
+ 0x54E7, 0x54E7, 0x1532, 0x54E8, 0x54E8, 0x0D13, 0x54E9, 0x54E9, 0x09F1,
+ 0x54EA, 0x54EA, 0x0B27, 0x54EB, 0x54EC, 0x2ACA, 0x54ED, 0x54ED, 0x096B,
+ 0x54EE, 0x54EE, 0x0F65, 0x54EF, 0x54F1, 0x2ACC, 0x54F2, 0x54F2, 0x117D,
+ 0x54F3, 0x54F3, 0x1536, 0x54F4, 0x54F9, 0x2ACF, 0x54FA, 0x54FA, 0x047F,
+ 0x54FB, 0x54FB, 0x2AD5, 0x54FC, 0x54FC, 0x0796, 0x54FD, 0x54FD, 0x1534,
+ 0x54FE, 0x54FE, 0x2AD6, 0x54FF, 0x54FF, 0x1391, 0x5500, 0x5500, 0x2AD7,
+ 0x5501, 0x5501, 0x100D, 0x5502, 0x5503, 0x2AD8, 0x5504, 0x5504, 0x236C,
+ 0x5505, 0x5505, 0x2ADA, 0x5506, 0x5506, 0x0DE9, 0x5507, 0x5507, 0x0540,
+ 0x5508, 0x5508, 0x2ADB, 0x5509, 0x5509, 0x03B1, 0x550A, 0x550E, 0x2ADC,
+ 0x550F, 0x550F, 0x1539, 0x5510, 0x5510, 0x0E19, 0x5511, 0x5511, 0x153A,
+ 0x5512, 0x5513, 0x2AE1, 0x5514, 0x5514, 0x1535, 0x5515, 0x551A, 0x2AE3,
+ 0x551B, 0x551B, 0x1531, 0x551C, 0x551F, 0x2AE9, 0x5520, 0x5520, 0x1533,
+ 0x5521, 0x5521, 0x2AED, 0x5522, 0x5523, 0x1537, 0x5524, 0x5524, 0x07D2,
+ 0x5525, 0x5526, 0x2AEE, 0x5527, 0x5527, 0x153B, 0x5528, 0x5529, 0x2AF0,
+ 0x552A, 0x552A, 0x153C, 0x552B, 0x552B, 0x2AF2, 0x552C, 0x552C, 0x07B8,
+ 0x552D, 0x552D, 0x2AF3, 0x552E, 0x552E, 0x0D72, 0x552F, 0x552F, 0x0EB7,
+ 0x5530, 0x5530, 0x154D, 0x5531, 0x5531, 0x04CF, 0x5532, 0x5532, 0x2AF4,
+ 0x5533, 0x5533, 0x154C, 0x5534, 0x5536, 0x2AF5, 0x5537, 0x5537, 0x1547,
+ 0x5538, 0x553B, 0x2AF8, 0x553C, 0x553C, 0x1546, 0x553D, 0x553D, 0x2AFC,
+ 0x553E, 0x553E, 0x0E8A, 0x553F, 0x553F, 0x1544, 0x5540, 0x5540, 0x2AFD,
+ 0x5541, 0x5541, 0x1542, 0x5542, 0x5542, 0x2AFE, 0x5543, 0x5543, 0x095D,
+ 0x5544, 0x5544, 0x1221, 0x5545, 0x5545, 0x2AFF, 0x5546, 0x5546, 0x0D05,
+ 0x5547, 0x5548, 0x2B00, 0x5549, 0x5549, 0x1540, 0x554A, 0x554A, 0x03AC,
+ 0x554B, 0x554E, 0x2B02, 0x554F, 0x554F, 0x219C, 0x5550, 0x5550, 0x1545,
+ 0x5551, 0x5552, 0x2B06, 0x5553, 0x5553, 0x20C9, 0x5554, 0x5554, 0x2B08,
+ 0x5555, 0x5555, 0x1543, 0x5556, 0x5556, 0x1548, 0x5557, 0x555B, 0x2B09,
+ 0x555C, 0x555C, 0x154E, 0x555D, 0x555D, 0x2B0E, 0x555E, 0x555E, 0x21F0,
+ 0x555F, 0x5560, 0x2B0F, 0x5561, 0x5561, 0x0665, 0x5562, 0x5563, 0x2B11,
+ 0x5564, 0x5564, 0x0BC0, 0x5565, 0x5565, 0x0CEF, 0x5566, 0x5566, 0x099D,
+ 0x5567, 0x5567, 0x153D, 0x5568, 0x5569, 0x2B13, 0x556A, 0x556A, 0x0B7F,
+ 0x556B, 0x556B, 0x2B15, 0x556C, 0x556C, 0x127A, 0x556D, 0x556D, 0x1541,
+ 0x556E, 0x556E, 0x0B59, 0x556F, 0x5574, 0x2B16, 0x5575, 0x5577, 0x1549,
+ 0x5578, 0x5578, 0x0F70, 0x5579, 0x557A, 0x2B1C, 0x557B, 0x557B, 0x155A,
+ 0x557C, 0x557C, 0x0E37, 0x557D, 0x557D, 0x2B1E, 0x557E, 0x557E, 0x1557,
+ 0x557F, 0x557F, 0x2B1F, 0x5580, 0x5580, 0x0933, 0x5581, 0x5581, 0x1555,
+ 0x5582, 0x5582, 0x0EC8, 0x5583, 0x5583, 0x1551, 0x5584, 0x5584, 0x0CFF,
+ 0x5585, 0x5586, 0x2B20, 0x5587, 0x5587, 0x0999, 0x5588, 0x5588, 0x1554,
+ 0x5589, 0x5589, 0x07A4, 0x558A, 0x558A, 0x0767, 0x558B, 0x558B, 0x154F,
+ 0x558C, 0x558E, 0x2B22, 0x558F, 0x558F, 0x153E, 0x5590, 0x5590, 0x2B25,
+ 0x5591, 0x5591, 0x1559, 0x5592, 0x5593, 0x2B26, 0x5594, 0x5594, 0x155E,
+ 0x5595, 0x5597, 0x2B28, 0x5598, 0x5598, 0x0530, 0x5599, 0x5599, 0x155F,
+ 0x559A, 0x559B, 0x2B2B, 0x559C, 0x559C, 0x0F1F, 0x559D, 0x559D, 0x077F,
+ 0x559E, 0x559E, 0x2B2D, 0x559F, 0x559F, 0x1556, 0x55A0, 0x55A6, 0x2B2E,
+ 0x55A7, 0x55A7, 0x0FC5, 0x55A8, 0x55A9, 0x2B35, 0x55AA, 0x55AA, 0x210B,
+ 0x55AB, 0x55AB, 0x2B37, 0x55AC, 0x55AC, 0x20DE, 0x55AD, 0x55AD, 0x2B38,
+ 0x55AE, 0x55AE, 0x1EAA, 0x55AF, 0x55B0, 0x2B39, 0x55B1, 0x55B1, 0x1552,
+ 0x55B2, 0x55B2, 0x222C, 0x55B3, 0x55B3, 0x113E, 0x55B4, 0x55B4, 0x2B3B,
+ 0x55B5, 0x55B5, 0x153F, 0x55B6, 0x55B6, 0x2B3C, 0x55B7, 0x55B7, 0x0BA8,
+ 0x55B8, 0x55B8, 0x2B3D, 0x55B9, 0x55B9, 0x1553, 0x55BA, 0x55BA, 0x2B3E,
+ 0x55BB, 0x55BB, 0x10DC, 0x55BC, 0x55BC, 0x2B3F, 0x55BD, 0x55BE, 0x155C,
+ 0x55BF, 0x55C3, 0x2B40, 0x55C4, 0x55C4, 0x156A, 0x55C5, 0x55C5, 0x0FAC,
+ 0x55C6, 0x55C6, 0x20D8, 0x55C7, 0x55C7, 0x22C0, 0x55C8, 0x55C8, 0x2B45,
+ 0x55C9, 0x55C9, 0x1562, 0x55CA, 0x55CB, 0x2B46, 0x55CC, 0x55CD, 0x156F,
+ 0x55CE, 0x55CE, 0x206F, 0x55CF, 0x55D0, 0x2B48, 0x55D1, 0x55D1, 0x1564,
+ 0x55D2, 0x55D2, 0x1550, 0x55D3, 0x55D3, 0x0CDD, 0x55D4, 0x55D4, 0x1567,
+ 0x55D5, 0x55D5, 0x2B4A, 0x55D6, 0x55D6, 0x1558, 0x55D7, 0x55D9, 0x2B4B,
+ 0x55DA, 0x55DA, 0x21A1, 0x55DB, 0x55DB, 0x2B4E, 0x55DC, 0x55DC, 0x0D5F,
+ 0x55DD, 0x55DD, 0x1569, 0x55DE, 0x55DE, 0x2B4F, 0x55DF, 0x55DF, 0x155B,
+ 0x55E0, 0x55E0, 0x2B50, 0x55E1, 0x55E1, 0x0EDA, 0x55E2, 0x55E2, 0x2B51,
+ 0x55E3, 0x55E3, 0x0DB8, 0x55E4, 0x55E4, 0x1573, 0x55E5, 0x55E5, 0x156C,
+ 0x55E6, 0x55E6, 0x1568, 0x55E7, 0x55E7, 0x2B52, 0x55E8, 0x55E8, 0x1571,
+ 0x55E9, 0x55E9, 0x2379, 0x55EA, 0x55EA, 0x1560, 0x55EB, 0x55EC, 0x1565,
+ 0x55ED, 0x55EE, 0x2B53, 0x55EF, 0x55EF, 0x156B, 0x55F0, 0x55F1, 0x2B55,
+ 0x55F2, 0x55F3, 0x156D, 0x55F4, 0x55F4, 0x2B57, 0x55F5, 0x55F5, 0x1572,
+ 0x55F6, 0x55F6, 0x2372, 0x55F7, 0x55F7, 0x1561, 0x55F8, 0x55FC, 0x2B58,
+ 0x55FD, 0x55FD, 0x0DC9, 0x55FE, 0x55FE, 0x157B, 0x55FF, 0x55FF, 0x2B5D,
+ 0x5600, 0x5600, 0x157C, 0x5601, 0x5601, 0x1578, 0x5602, 0x5605, 0x2B5E,
+ 0x5606, 0x5606, 0x216A, 0x5607, 0x5607, 0x2B62, 0x5608, 0x5608, 0x1576,
+ 0x5609, 0x5609, 0x0841, 0x560A, 0x560B, 0x2B63, 0x560C, 0x560C, 0x1577,
+ 0x560D, 0x560D, 0x237C, 0x560E, 0x560E, 0x06BD, 0x560F, 0x560F, 0x127B,
+ 0x5610, 0x5613, 0x2B65, 0x5614, 0x5614, 0x20B0, 0x5615, 0x5615, 0x2B69,
+ 0x5616, 0x5616, 0x237A, 0x5617, 0x5617, 0x1E74, 0x5618, 0x5618, 0x0FB5,
+ 0x5619, 0x561A, 0x2B6A, 0x561B, 0x561B, 0x0A96, 0x561C, 0x561C, 0x2377,
+ 0x561D, 0x561D, 0x2B6C, 0x561E, 0x561E, 0x1575, 0x561F, 0x561F, 0x1563,
+ 0x5620, 0x5622, 0x2B6D, 0x5623, 0x5623, 0x157A, 0x5624, 0x5624, 0x1579,
+ 0x5625, 0x5626, 0x2B70, 0x5627, 0x5627, 0x157D, 0x5628, 0x5628, 0x2B72,
+ 0x5629, 0x5629, 0x1F4C, 0x562A, 0x562B, 0x2B73, 0x562C, 0x562C, 0x1582,
+ 0x562D, 0x562D, 0x157E, 0x562E, 0x562E, 0x2378, 0x562F, 0x562F, 0x21CF,
+ 0x5630, 0x5630, 0x2368, 0x5631, 0x5631, 0x11F5, 0x5632, 0x5632, 0x04D5,
+ 0x5633, 0x5633, 0x2B75, 0x5634, 0x5634, 0x1249, 0x5635, 0x5635, 0x2371,
+ 0x5636, 0x5636, 0x0DB0, 0x5637, 0x5637, 0x2B76, 0x5638, 0x5638, 0x2369,
+ 0x5639, 0x5639, 0x1580, 0x563A, 0x563A, 0x2B77, 0x563B, 0x563B, 0x0F0A,
+ 0x563C, 0x563E, 0x2B78, 0x563F, 0x563F, 0x0790, 0x5640, 0x5640, 0x2B7B,
+ 0x5641, 0x5641, 0x2674, 0x5642, 0x564B, 0x2B7C, 0x564C, 0x564C, 0x1587,
+ 0x564D, 0x564D, 0x1583, 0x564E, 0x564E, 0x1034, 0x564F, 0x5653, 0x2B86,
+ 0x5654, 0x5654, 0x1588, 0x5655, 0x5656, 0x2B8B, 0x5657, 0x5657, 0x1581,
+ 0x5658, 0x5658, 0x157F, 0x5659, 0x5659, 0x1585, 0x565A, 0x565B, 0x2B8D,
+ 0x565C, 0x565C, 0x1586, 0x565D, 0x565D, 0x236F, 0x565E, 0x565F, 0x2B8F,
+ 0x5660, 0x5660, 0x2370, 0x5661, 0x5661, 0x2B91, 0x5662, 0x5662, 0x1584,
+ 0x5663, 0x5663, 0x2B92, 0x5664, 0x5664, 0x158A, 0x5665, 0x5665, 0x2376,
+ 0x5666, 0x5666, 0x2373, 0x5667, 0x5667, 0x2B93, 0x5668, 0x5668, 0x0C16,
+ 0x5669, 0x5669, 0x1262, 0x566A, 0x566A, 0x112E, 0x566B, 0x566B, 0x158C,
+ 0x566C, 0x566C, 0x0D60, 0x566D, 0x566E, 0x2B94, 0x566F, 0x566F, 0x237F,
+ 0x5670, 0x5670, 0x2B96, 0x5671, 0x5671, 0x158B, 0x5672, 0x5672, 0x2374,
+ 0x5673, 0x5673, 0x2B97, 0x5674, 0x5674, 0x20B5, 0x5675, 0x5675, 0x2B98,
+ 0x5676, 0x5676, 0x06BC, 0x5677, 0x5677, 0x2B99, 0x5678, 0x5678, 0x1EDB,
+ 0x5679, 0x5679, 0x2672, 0x567A, 0x567A, 0x2B9A, 0x567B, 0x567C, 0x158D,
+ 0x567D, 0x567F, 0x2B9B, 0x5680, 0x5680, 0x236E, 0x5681, 0x5684, 0x2B9E,
+ 0x5685, 0x5685, 0x158F, 0x5686, 0x5686, 0x1589, 0x5687, 0x5687, 0x21B7,
+ 0x5688, 0x568B, 0x2BA2, 0x568C, 0x568C, 0x2375, 0x568D, 0x568D, 0x2BA6,
+ 0x568E, 0x568E, 0x0776, 0x568F, 0x568F, 0x0E3A, 0x5690, 0x5692, 0x2BA7,
+ 0x5693, 0x5693, 0x1590, 0x5694, 0x5694, 0x2BAA, 0x5695, 0x5695, 0x2382,
+ 0x5696, 0x5698, 0x2BAB, 0x5699, 0x5699, 0x209E, 0x569A, 0x56A2, 0x2BAE,
+ 0x56A3, 0x56A3, 0x0F66, 0x56A4, 0x56A5, 0x2BB7, 0x56A6, 0x56A6, 0x236B,
+ 0x56A7, 0x56A7, 0x2BB9, 0x56A8, 0x56A8, 0x2039, 0x56A9, 0x56AD, 0x2BBA,
+ 0x56AE, 0x56AE, 0x269F, 0x56AF, 0x56AF, 0x1591, 0x56B0, 0x56B2, 0x2BBF,
+ 0x56B3, 0x56B3, 0x237D, 0x56B4, 0x56B4, 0x21F5, 0x56B5, 0x56B5, 0x2BC2,
+ 0x56B6, 0x56B6, 0x2381, 0x56B7, 0x56B7, 0x0C9D, 0x56B8, 0x56BB, 0x2BC3,
+ 0x56BC, 0x56BC, 0x0891, 0x56BD, 0x56BF, 0x2BC7, 0x56C0, 0x56C0, 0x237B,
+ 0x56C1, 0x56C1, 0x237E, 0x56C2, 0x56C2, 0x21CC, 0x56C3, 0x56C4, 0x2BCA,
+ 0x56C5, 0x56C5, 0x22DB, 0x56C6, 0x56C7, 0x2BCC, 0x56C8, 0x56C8, 0x236A,
+ 0x56C9, 0x56C9, 0x2689, 0x56CA, 0x56CA, 0x0B35, 0x56CB, 0x56CB, 0x2BCE,
+ 0x56CC, 0x56CC, 0x2697, 0x56CD, 0x56D0, 0x2BCF, 0x56D1, 0x56D1, 0x22A1,
+ 0x56D2, 0x56D3, 0x2BD3, 0x56D4, 0x56D4, 0x1592, 0x56D5, 0x56D6, 0x2BD5,
+ 0x56D7, 0x56D7, 0x1593, 0x56D8, 0x56D9, 0x2BD7, 0x56DA, 0x56DA, 0x0C71,
+ 0x56DB, 0x56DB, 0x0DB9, 0x56DC, 0x56DC, 0x2BD9, 0x56DD, 0x56DD, 0x1594,
+ 0x56DE, 0x56DE, 0x07ED, 0x56DF, 0x56DF, 0x126C, 0x56E0, 0x56E0, 0x1079,
+ 0x56E1, 0x56E1, 0x1595, 0x56E2, 0x56E2, 0x0E76, 0x56E3, 0x56E3, 0x2BDA,
+ 0x56E4, 0x56E4, 0x0619, 0x56E5, 0x56EA, 0x2BDB, 0x56EB, 0x56EB, 0x1597,
+ 0x56EC, 0x56EC, 0x2BE1, 0x56ED, 0x56ED, 0x10F3, 0x56EE, 0x56EF, 0x2BE2,
+ 0x56F0, 0x56F0, 0x0992, 0x56F1, 0x56F1, 0x0554, 0x56F2, 0x56F3, 0x2BE4,
+ 0x56F4, 0x56F4, 0x0EB6, 0x56F5, 0x56F5, 0x1596, 0x56F6, 0x56F8, 0x2BE6,
+ 0x56F9, 0x56F9, 0x1598, 0x56FA, 0x56FA, 0x0725, 0x56FB, 0x56FC, 0x2BE9,
+ 0x56FD, 0x56FD, 0x0753, 0x56FE, 0x56FE, 0x0E6D, 0x56FF, 0x56FF, 0x1599,
+ 0x5700, 0x5702, 0x2BEB, 0x5703, 0x5703, 0x0BF3, 0x5704, 0x5704, 0x159A,
+ 0x5705, 0x5705, 0x2BEE, 0x5706, 0x5706, 0x10F5, 0x5707, 0x5707, 0x2383,
+ 0x5708, 0x5708, 0x0C81, 0x5709, 0x5709, 0x159C, 0x570A, 0x570A, 0x159B,
+ 0x570B, 0x570B, 0x1F3D, 0x570C, 0x570C, 0x2BEF, 0x570D, 0x570D, 0x218F,
+ 0x570E, 0x5711, 0x2BF0, 0x5712, 0x5712, 0x2246, 0x5713, 0x5713, 0x2248,
+ 0x5714, 0x5715, 0x2BF4, 0x5716, 0x5716, 0x217E, 0x5717, 0x5717, 0x2BF6,
+ 0x5718, 0x5718, 0x2180, 0x5719, 0x571B, 0x2BF7, 0x571C, 0x571C, 0x159D,
+ 0x571D, 0x571E, 0x2BFA, 0x571F, 0x571F, 0x0E72, 0x5720, 0x5722, 0x2BFC,
+ 0x5723, 0x5723, 0x0D3C, 0x5724, 0x5727, 0x2BFF, 0x5728, 0x5728, 0x111D,
+ 0x5729, 0x5729, 0x13A7, 0x572A, 0x572A, 0x13A9, 0x572B, 0x572B, 0x2C03,
+ 0x572C, 0x572C, 0x13A8, 0x572D, 0x572D, 0x0740, 0x572E, 0x572F, 0x13AC,
+ 0x5730, 0x5730, 0x05B9, 0x5731, 0x5732, 0x2C04, 0x5733, 0x5733, 0x13AA,
+ 0x5734, 0x5738, 0x2C06, 0x5739, 0x5739, 0x13AB, 0x573A, 0x573A, 0x04C6,
+ 0x573B, 0x573B, 0x13AF, 0x573C, 0x573D, 0x2C0B, 0x573E, 0x573E, 0x080D,
+ 0x573F, 0x573F, 0x2C0D, 0x5740, 0x5740, 0x11B6, 0x5741, 0x5741, 0x2C0E,
+ 0x5742, 0x5742, 0x13B0, 0x5743, 0x5746, 0x2C0F, 0x5747, 0x5747, 0x0928,
+ 0x5748, 0x5749, 0x2C13, 0x574A, 0x574A, 0x0658, 0x574B, 0x574B, 0x2C15,
+ 0x574C, 0x574C, 0x13A0, 0x574D, 0x574D, 0x0E01, 0x574E, 0x574E, 0x093F,
+ 0x574F, 0x574F, 0x07CA, 0x5750, 0x5750, 0x1255, 0x5751, 0x5751, 0x0960,
+ 0x5752, 0x5756, 0x2C16, 0x5757, 0x5757, 0x0976, 0x5758, 0x5759, 0x2C1B,
+ 0x575A, 0x575A, 0x0854, 0x575B, 0x575B, 0x0E06, 0x575C, 0x575C, 0x13AE,
+ 0x575D, 0x575D, 0x03DE, 0x575E, 0x575E, 0x0EFA, 0x575F, 0x575F, 0x0675,
+ 0x5760, 0x5760, 0x1216, 0x5761, 0x5761, 0x0BE1, 0x5762, 0x5763, 0x2C1D,
+ 0x5764, 0x5764, 0x098F, 0x5765, 0x5765, 0x2C1F, 0x5766, 0x5766, 0x0E0C,
+ 0x5767, 0x5767, 0x2C20, 0x5768, 0x5768, 0x13B7, 0x5769, 0x5769, 0x13B1,
+ 0x576A, 0x576A, 0x0BD9, 0x576B, 0x576B, 0x13B3, 0x576C, 0x576C, 0x2C21,
+ 0x576D, 0x576D, 0x13B8, 0x576E, 0x576E, 0x2C22, 0x576F, 0x576F, 0x0BB8,
+ 0x5770, 0x5772, 0x2C23, 0x5773, 0x5773, 0x13BA, 0x5774, 0x5775, 0x2C26,
+ 0x5776, 0x5776, 0x13B9, 0x5777, 0x5777, 0x094D, 0x5778, 0x577A, 0x2C28,
+ 0x577B, 0x577B, 0x13B6, 0x577C, 0x577C, 0x13B5, 0x577D, 0x5781, 0x2C2B,
+ 0x5782, 0x5782, 0x053C, 0x5783, 0x5783, 0x0997, 0x5784, 0x5784, 0x0A49,
+ 0x5785, 0x5785, 0x13B2, 0x5786, 0x5786, 0x13B4, 0x5787, 0x578A, 0x2C30,
+ 0x578B, 0x578B, 0x0F98, 0x578C, 0x578C, 0x13BD, 0x578D, 0x5791, 0x2C34,
+ 0x5792, 0x5792, 0x09C8, 0x5793, 0x5793, 0x13C2, 0x5794, 0x579A, 0x2C39,
+ 0x579B, 0x579B, 0x0621, 0x579C, 0x579F, 0x2C40, 0x57A0, 0x57A0, 0x13C3,
+ 0x57A1, 0x57A1, 0x13A2, 0x57A2, 0x57A2, 0x0711, 0x57A3, 0x57A3, 0x10EE,
+ 0x57A4, 0x57A4, 0x13BC, 0x57A5, 0x57A5, 0x2C44, 0x57A6, 0x57A6, 0x095E,
+ 0x57A7, 0x57A7, 0x13C0, 0x57A8, 0x57A8, 0x2C45, 0x57A9, 0x57A9, 0x13A1,
+ 0x57AA, 0x57AA, 0x2C46, 0x57AB, 0x57AB, 0x05C7, 0x57AC, 0x57AC, 0x2C47,
+ 0x57AD, 0x57AD, 0x13BB, 0x57AE, 0x57AE, 0x0972, 0x57AF, 0x57B1, 0x2C48,
+ 0x57B2, 0x57B2, 0x13BE, 0x57B3, 0x57B3, 0x2C4B, 0x57B4, 0x57B4, 0x13C1,
+ 0x57B5, 0x57B7, 0x2C4C, 0x57B8, 0x57B8, 0x13C9, 0x57B9, 0x57C1, 0x2C4F,
+ 0x57C2, 0x57C2, 0x06FA, 0x57C3, 0x57C3, 0x03AE, 0x57C4, 0x57CA, 0x2C58,
+ 0x57CB, 0x57CB, 0x0A98, 0x57CC, 0x57CD, 0x2C5F, 0x57CE, 0x57CE, 0x04EC,
+ 0x57CF, 0x57CF, 0x13BF, 0x57D0, 0x57D1, 0x2C61, 0x57D2, 0x57D2, 0x13C8,
+ 0x57D3, 0x57D3, 0x2C63, 0x57D4, 0x57D4, 0x0BF1, 0x57D5, 0x57D5, 0x13C4,
+ 0x57D6, 0x57D7, 0x2C64, 0x57D8, 0x57D8, 0x13C5, 0x57D9, 0x57D9, 0x13C7,
+ 0x57DA, 0x57DA, 0x13C6, 0x57DB, 0x57DC, 0x2C66, 0x57DD, 0x57DD, 0x13CE,
+ 0x57DE, 0x57DE, 0x2C68, 0x57DF, 0x57DF, 0x10D7, 0x57E0, 0x57E0, 0x0481,
+ 0x57E1, 0x57E1, 0x232A, 0x57E2, 0x57E3, 0x2C69, 0x57E4, 0x57E4, 0x13CD,
+ 0x57E5, 0x57EC, 0x2C6B, 0x57ED, 0x57ED, 0x13D2, 0x57EE, 0x57EE, 0x2C73,
+ 0x57EF, 0x57EF, 0x13CB, 0x57F0, 0x57F3, 0x2C74, 0x57F4, 0x57F4, 0x13CA,
+ 0x57F5, 0x57F6, 0x2C78, 0x57F7, 0x57F7, 0x228B, 0x57F8, 0x57F8, 0x13CC,
+ 0x57F9, 0x57F9, 0x0BA1, 0x57FA, 0x57FA, 0x080E, 0x57FB, 0x57FC, 0x2C7A,
+ 0x57FD, 0x57FD, 0x13D1, 0x57FE, 0x57FF, 0x2C7C, 0x5800, 0x5800, 0x13D3,
+ 0x5801, 0x5801, 0x2C7E, 0x5802, 0x5802, 0x0E16, 0x5803, 0x5804, 0x2C7F,
+ 0x5805, 0x5805, 0x1F85, 0x5806, 0x5806, 0x0610, 0x5807, 0x5807, 0x144C,
+ 0x5808, 0x5809, 0x2C81, 0x580A, 0x580A, 0x2325, 0x580B, 0x580B, 0x13CF,
+ 0x580C, 0x580C, 0x2C83, 0x580D, 0x580D, 0x13D0, 0x580E, 0x5810, 0x2C84,
+ 0x5811, 0x5811, 0x0C32, 0x5812, 0x5814, 0x2C87, 0x5815, 0x5815, 0x0628,
+ 0x5816, 0x5816, 0x232C, 0x5817, 0x5818, 0x2C8A, 0x5819, 0x5819, 0x13D5,
+ 0x581A, 0x581C, 0x2C8C, 0x581D, 0x581D, 0x232E, 0x581E, 0x581E, 0x13D4,
+ 0x581F, 0x581F, 0x2C8F, 0x5820, 0x5820, 0x13D7, 0x5821, 0x5821, 0x040D,
+ 0x5822, 0x5823, 0x2C90, 0x5824, 0x5824, 0x05AD, 0x5825, 0x5829, 0x2C92,
+ 0x582A, 0x582A, 0x093D, 0x582B, 0x582E, 0x2C97, 0x582F, 0x582F, 0x2205,
+ 0x5830, 0x5830, 0x1008, 0x5831, 0x5831, 0x1E38, 0x5832, 0x5833, 0x2C9B,
+ 0x5834, 0x5834, 0x1E73, 0x5835, 0x5835, 0x0601, 0x5836, 0x5843, 0x2C9D,
+ 0x5844, 0x5844, 0x13D6, 0x5845, 0x5849, 0x2CAB, 0x584A, 0x584A, 0x1FE3,
+ 0x584B, 0x584B, 0x2339, 0x584C, 0x584C, 0x0DEF, 0x584D, 0x584D, 0x19A3,
+ 0x584E, 0x584E, 0x2CB0, 0x584F, 0x584F, 0x232B, 0x5850, 0x5850, 0x2CB1,
+ 0x5851, 0x5851, 0x0DD1, 0x5852, 0x5852, 0x232D, 0x5853, 0x5853, 0x2CB2,
+ 0x5854, 0x5854, 0x0DF3, 0x5855, 0x5856, 0x2CB3, 0x5857, 0x5857, 0x217F,
+ 0x5858, 0x5858, 0x0E14, 0x5859, 0x585D, 0x2CB5, 0x585E, 0x585E, 0x0CD6,
+ 0x585F, 0x5861, 0x2CBA, 0x5862, 0x5862, 0x21A7, 0x5863, 0x5863, 0x2CBD,
+ 0x5864, 0x5864, 0x232F, 0x5865, 0x5865, 0x13D8, 0x5866, 0x586A, 0x2CBE,
+ 0x586B, 0x586B, 0x0E41, 0x586C, 0x586C, 0x13D9, 0x586D, 0x5874, 0x2CC3,
+ 0x5875, 0x5875, 0x1E7D, 0x5876, 0x5878, 0x2CCB, 0x5879, 0x5879, 0x20D6,
+ 0x587A, 0x587D, 0x2CCE, 0x587E, 0x587E, 0x13A3, 0x587F, 0x587F, 0x2CD2,
+ 0x5880, 0x5880, 0x13DD, 0x5881, 0x5881, 0x13DA, 0x5882, 0x5882, 0x2CD3,
+ 0x5883, 0x5883, 0x08E2, 0x5884, 0x5884, 0x2CD4, 0x5885, 0x5885, 0x0D92,
+ 0x5886, 0x5888, 0x2CD5, 0x5889, 0x5889, 0x13DB, 0x588A, 0x588A, 0x1EC2,
+ 0x588B, 0x5891, 0x2CD8, 0x5892, 0x5892, 0x0D03, 0x5893, 0x5893, 0x0B1C,
+ 0x5894, 0x5898, 0x2CDF, 0x5899, 0x5899, 0x0C3A, 0x589A, 0x589A, 0x13DC,
+ 0x589B, 0x589B, 0x2CE4, 0x589C, 0x589C, 0x22B2, 0x589D, 0x589D, 0x2CE5,
+ 0x589E, 0x589E, 0x1139, 0x589F, 0x589F, 0x0FB1, 0x58A0, 0x58A7, 0x2CE6,
+ 0x58A8, 0x58A8, 0x0B0E, 0x58A9, 0x58A9, 0x0614, 0x58AA, 0x58AD, 0x2CEE,
+ 0x58AE, 0x58AE, 0x1EDF, 0x58AF, 0x58B2, 0x2CF2, 0x58B3, 0x58B3, 0x1EF9,
+ 0x58B4, 0x58BA, 0x2CF6, 0x58BB, 0x58BB, 0x20D9, 0x58BC, 0x58BC, 0x13A4,
+ 0x58BD, 0x58BD, 0x2CFD, 0x58BE, 0x58BE, 0x1FDD, 0x58BF, 0x58C0, 0x2CFE,
+ 0x58C1, 0x58C1, 0x0443, 0x58C2, 0x58C4, 0x2D00, 0x58C5, 0x58C5, 0x13A5,
+ 0x58C6, 0x58C6, 0x2D03, 0x58C7, 0x58C7, 0x2167, 0x58C8, 0x58D0, 0x2D04,
+ 0x58D1, 0x58D1, 0x13A6, 0x58D2, 0x58D2, 0x2D0D, 0x58D3, 0x58D3, 0x21ED,
+ 0x58D4, 0x58D4, 0x2D0E, 0x58D5, 0x58D5, 0x0775, 0x58D6, 0x58D7, 0x2D0F,
+ 0x58D8, 0x58D8, 0x2007, 0x58D9, 0x58D9, 0x2326, 0x58DA, 0x58DA, 0x2329,
+ 0x58DB, 0x58DD, 0x2D11, 0x58DE, 0x58DE, 0x1F52, 0x58DF, 0x58DF, 0x203B,
+ 0x58E0, 0x58E0, 0x2328, 0x58E1, 0x58E1, 0x2D14, 0x58E2, 0x58E2, 0x2327,
+ 0x58E3, 0x58E3, 0x2D15, 0x58E4, 0x58E4, 0x0C9B, 0x58E5, 0x58E8, 0x2D16,
+ 0x58E9, 0x58E9, 0x1E2B, 0x58EA, 0x58EA, 0x2D1A, 0x58EB, 0x58EB, 0x0D56,
+ 0x58EC, 0x58EC, 0x0CA4, 0x58ED, 0x58ED, 0x2D1B, 0x58EE, 0x58EE, 0x1210,
+ 0x58EF, 0x58EF, 0x22AE, 0x58F0, 0x58F0, 0x0D32, 0x58F1, 0x58F2, 0x2D1C,
+ 0x58F3, 0x58F3, 0x0954, 0x58F4, 0x58F5, 0x2D1E, 0x58F6, 0x58F6, 0x07AF,
+ 0x58F7, 0x58F8, 0x2D20, 0x58F9, 0x58F9, 0x1043, 0x58FA, 0x58FA, 0x1F49,
+ 0x58FB, 0x58FC, 0x2D22, 0x58FD, 0x58FD, 0x2138, 0x58FE, 0x58FF, 0x2D24,
+ 0x5900, 0x5901, 0x2D26, 0x5902, 0x5902, 0x161C, 0x5903, 0x5903, 0x2D28,
+ 0x5904, 0x5904, 0x0529, 0x5905, 0x5906, 0x2D29, 0x5907, 0x5907, 0x0421,
+ 0x5908, 0x590C, 0x2D2B, 0x590D, 0x590D, 0x06AF, 0x590E, 0x590E, 0x2D30,
+ 0x590F, 0x590F, 0x0F31, 0x5910, 0x5913, 0x2D31, 0x5914, 0x5914, 0x12FB,
+ 0x5915, 0x5915, 0x0F13, 0x5916, 0x5916, 0x0E93, 0x5917, 0x5918, 0x2D35,
+ 0x5919, 0x5919, 0x1301, 0x591A, 0x591A, 0x061F, 0x591B, 0x591B, 0x2D37,
+ 0x591C, 0x591C, 0x1040, 0x591D, 0x591E, 0x2D38, 0x591F, 0x591F, 0x0714,
+ 0x5920, 0x5921, 0x2D3A, 0x5922, 0x5922, 0x2081, 0x5923, 0x5923, 0x2D3C,
+ 0x5924, 0x5924, 0x161B, 0x5925, 0x5925, 0x1619, 0x5926, 0x5926, 0x2D3D,
+ 0x5927, 0x5927, 0x0576, 0x5928, 0x5928, 0x2D3E, 0x5929, 0x5929, 0x0E3F,
+ 0x592A, 0x592A, 0x0DFE, 0x592B, 0x592B, 0x068F, 0x592C, 0x592C, 0x2D3F,
+ 0x592D, 0x592D, 0x1268, 0x592E, 0x592E, 0x1014, 0x592F, 0x592F, 0x0772,
+ 0x5930, 0x5930, 0x2D40, 0x5931, 0x5931, 0x0D3E, 0x5932, 0x5933, 0x2D41,
+ 0x5934, 0x5934, 0x0E68, 0x5935, 0x5936, 0x2D43, 0x5937, 0x5937, 0x104B,
+ 0x5938, 0x5938, 0x0971, 0x5939, 0x5939, 0x0843, 0x593A, 0x593A, 0x0620,
+ 0x593B, 0x593B, 0x2D45, 0x593C, 0x593C, 0x14AF, 0x593D, 0x593D, 0x2D46,
+ 0x593E, 0x593E, 0x1F7C, 0x593F, 0x5940, 0x2D47, 0x5941, 0x5941, 0x14B0,
+ 0x5942, 0x5942, 0x138C, 0x5943, 0x5943, 0x2D49, 0x5944, 0x5944, 0x1002,
+ 0x5945, 0x5946, 0x2D4A, 0x5947, 0x5947, 0x0C05, 0x5948, 0x5948, 0x0B31,
+ 0x5949, 0x5949, 0x068B, 0x594A, 0x594A, 0x2D4C, 0x594B, 0x594B, 0x0679,
+ 0x594C, 0x594D, 0x2D4D, 0x594E, 0x594E, 0x0989, 0x594F, 0x594F, 0x123D,
+ 0x5950, 0x5950, 0x2D4F, 0x5951, 0x5951, 0x0C14, 0x5952, 0x5953, 0x2D50,
+ 0x5954, 0x5954, 0x0425, 0x5955, 0x5955, 0x14B2, 0x5956, 0x5956, 0x0882,
+ 0x5957, 0x5957, 0x0E2A, 0x5958, 0x5958, 0x14B4, 0x5959, 0x5959, 0x2D52,
+ 0x595A, 0x595A, 0x14B3, 0x595B, 0x595F, 0x2D53, 0x5960, 0x5960, 0x05CD,
+ 0x5961, 0x5961, 0x2D58, 0x5962, 0x5962, 0x0D16, 0x5963, 0x5964, 0x2D59,
+ 0x5965, 0x5965, 0x03CD, 0x5966, 0x5968, 0x2D5B, 0x5969, 0x5969, 0x235B,
+ 0x596A, 0x596A, 0x1EDE, 0x596B, 0x596B, 0x2D5E, 0x596C, 0x596C, 0x1FA2,
+ 0x596D, 0x596D, 0x2D5F, 0x596E, 0x596E, 0x1EFA, 0x596F, 0x5972, 0x2D60,
+ 0x5973, 0x5973, 0x0B6F, 0x5974, 0x5974, 0x0B6C, 0x5975, 0x5975, 0x2D64,
+ 0x5976, 0x5976, 0x0B2F, 0x5977, 0x5977, 0x2D65, 0x5978, 0x5978, 0x085C,
+ 0x5979, 0x5979, 0x0DF2, 0x597A, 0x597C, 0x2D66, 0x597D, 0x597D, 0x077A,
+ 0x597E, 0x5980, 0x2D69, 0x5981, 0x5981, 0x1775, 0x5982, 0x5982, 0x0CC2,
+ 0x5983, 0x5983, 0x1776, 0x5984, 0x5984, 0x0EAE, 0x5985, 0x5985, 0x2D6C,
+ 0x5986, 0x5986, 0x120E, 0x5987, 0x5987, 0x06B9, 0x5988, 0x5988, 0x0A8F,
+ 0x5989, 0x5989, 0x2D6D, 0x598A, 0x598A, 0x0CAC, 0x598B, 0x598C, 0x2D6E,
+ 0x598D, 0x598D, 0x1777, 0x598E, 0x5991, 0x2D70, 0x5992, 0x5992, 0x0609,
+ 0x5993, 0x5993, 0x083E, 0x5994, 0x5995, 0x2D74, 0x5996, 0x5996, 0x1026,
+ 0x5997, 0x5997, 0x177B, 0x5998, 0x5998, 0x2D76, 0x5999, 0x5999, 0x0AF3,
+ 0x599A, 0x599C, 0x2D77, 0x599D, 0x599D, 0x22AD, 0x599E, 0x599E, 0x177E,
+ 0x599F, 0x59A2, 0x2D7A, 0x59A3, 0x59A3, 0x177A, 0x59A4, 0x59A4, 0x177F,
+ 0x59A5, 0x59A5, 0x0E88, 0x59A6, 0x59A7, 0x2D7E, 0x59A8, 0x59A8, 0x065E,
+ 0x59A9, 0x59AA, 0x1778, 0x59AB, 0x59AB, 0x177D, 0x59AC, 0x59AD, 0x2D80,
+ 0x59AE, 0x59AE, 0x0B40, 0x59AF, 0x59AF, 0x1782, 0x59B0, 0x59B1, 0x2D82,
+ 0x59B2, 0x59B2, 0x1781, 0x59B3, 0x59B8, 0x2D84, 0x59B9, 0x59B9, 0x0AC8,
+ 0x59BA, 0x59BA, 0x2D8A, 0x59BB, 0x59BB, 0x0BFD, 0x59BC, 0x59BD, 0x2D8B,
+ 0x59BE, 0x59BE, 0x1784, 0x59BF, 0x59C5, 0x2D8D, 0x59C6, 0x59C6, 0x0B1A,
+ 0x59C7, 0x59C9, 0x2D94, 0x59CA, 0x59CA, 0x177C, 0x59CB, 0x59CB, 0x0D53,
+ 0x59CC, 0x59CF, 0x2D97, 0x59D0, 0x59D0, 0x08B4, 0x59D1, 0x59D1, 0x071C,
+ 0x59D2, 0x59D2, 0x1780, 0x59D3, 0x59D3, 0x0FA0, 0x59D4, 0x59D4, 0x0EBE,
+ 0x59D5, 0x59D6, 0x2D9B, 0x59D7, 0x59D7, 0x1783, 0x59D8, 0x59D8, 0x178A,
+ 0x59D9, 0x59D9, 0x2D9D, 0x59DA, 0x59DA, 0x102D, 0x59DB, 0x59DB, 0x2D9E,
+ 0x59DC, 0x59DC, 0x087B, 0x59DD, 0x59DD, 0x1787, 0x59DE, 0x59E2, 0x2D9F,
+ 0x59E3, 0x59E3, 0x1789, 0x59E4, 0x59E4, 0x2DA4, 0x59E5, 0x59E5, 0x09BC,
+ 0x59E6, 0x59E7, 0x2DA5, 0x59E8, 0x59E8, 0x1053, 0x59E9, 0x59EB, 0x2DA7,
+ 0x59EC, 0x59EC, 0x081A, 0x59ED, 0x59F8, 0x2DAA, 0x59F9, 0x59F9, 0x178B,
+ 0x59FA, 0x59FA, 0x2DB6, 0x59FB, 0x59FB, 0x107D, 0x59FC, 0x59FE, 0x2DB7,
+ 0x59FF, 0x59FF, 0x1228, 0x5A00, 0x5A00, 0x2DBA, 0x5A01, 0x5A01, 0x0EAF,
+ 0x5A02, 0x5A02, 0x2DBB, 0x5A03, 0x5A03, 0x0E8F, 0x5A04, 0x5A04, 0x0A4D,
+ 0x5A05, 0x5A06, 0x1785, 0x5A07, 0x5A07, 0x0890, 0x5A08, 0x5A08, 0x1788,
+ 0x5A09, 0x5A09, 0x178D, 0x5A0A, 0x5A0B, 0x2DBC, 0x5A0C, 0x5A0C, 0x178C,
+ 0x5A0D, 0x5A10, 0x2DBE, 0x5A11, 0x5A11, 0x1790, 0x5A12, 0x5A12, 0x2DC2,
+ 0x5A13, 0x5A13, 0x1792, 0x5A14, 0x5A17, 0x2DC3, 0x5A18, 0x5A18, 0x0B52,
+ 0x5A19, 0x5A1B, 0x2DC7, 0x5A1C, 0x5A1C, 0x0B2B, 0x5A1D, 0x5A1E, 0x2DCA,
+ 0x5A1F, 0x5A1F, 0x0919, 0x5A20, 0x5A20, 0x0D28, 0x5A21, 0x5A22, 0x2DCC,
+ 0x5A23, 0x5A23, 0x1791, 0x5A24, 0x5A24, 0x2DCE, 0x5A25, 0x5A25, 0x062F,
+ 0x5A26, 0x5A28, 0x2DCF, 0x5A29, 0x5A29, 0x0AE9, 0x5A2A, 0x5A30, 0x2DD2,
+ 0x5A31, 0x5A31, 0x10CE, 0x5A32, 0x5A32, 0x178E, 0x5A33, 0x5A33, 0x2DD9,
+ 0x5A34, 0x5A34, 0x178F, 0x5A35, 0x5A35, 0x2DDA, 0x5A36, 0x5A36, 0x0C7D,
+ 0x5A37, 0x5A3B, 0x2DDB, 0x5A3C, 0x5A3C, 0x1797, 0x5A3D, 0x5A3F, 0x2DE0,
+ 0x5A40, 0x5A40, 0x1793, 0x5A41, 0x5A41, 0x203F, 0x5A42, 0x5A45, 0x2DE3,
+ 0x5A46, 0x5A46, 0x0BE4, 0x5A47, 0x5A48, 0x2DE7, 0x5A49, 0x5A49, 0x0EA2,
+ 0x5A4A, 0x5A4A, 0x1795, 0x5A4B, 0x5A54, 0x2DE9, 0x5A55, 0x5A55, 0x1796,
+ 0x5A56, 0x5A59, 0x2DF3, 0x5A5A, 0x5A5A, 0x07FE, 0x5A5B, 0x5A61, 0x2DF7,
+ 0x5A62, 0x5A62, 0x1798, 0x5A63, 0x5A65, 0x2DFE, 0x5A66, 0x5A66, 0x1F0E,
+ 0x5A67, 0x5A67, 0x1794, 0x5A68, 0x5A69, 0x2E01, 0x5A6A, 0x5A6A, 0x09A2,
+ 0x5A6B, 0x5A6C, 0x2E03, 0x5A6D, 0x5A6D, 0x23F9, 0x5A6E, 0x5A73, 0x2E05,
+ 0x5A74, 0x5A74, 0x1089, 0x5A75, 0x5A75, 0x1799, 0x5A76, 0x5A76, 0x0D2D,
+ 0x5A77, 0x5A77, 0x179D, 0x5A78, 0x5A79, 0x2E0B, 0x5A7A, 0x5A7A, 0x179E,
+ 0x5A7B, 0x5A7E, 0x2E0D, 0x5A7F, 0x5A7F, 0x0FC1, 0x5A80, 0x5A91, 0x2E11,
+ 0x5A92, 0x5A92, 0x0AC2, 0x5A93, 0x5A99, 0x2E23, 0x5A9A, 0x5A9A, 0x0AC9,
+ 0x5A9B, 0x5A9B, 0x179C, 0x5A9C, 0x5AA6, 0x2E2A, 0x5AA7, 0x5AA7, 0x23FC,
+ 0x5AA8, 0x5AA9, 0x2E35, 0x5AAA, 0x5AAA, 0x179B, 0x5AAB, 0x5AB1, 0x2E37,
+ 0x5AB2, 0x5AB2, 0x17A1, 0x5AB3, 0x5AB3, 0x0F1E, 0x5AB4, 0x5AB4, 0x2E3E,
+ 0x5AB5, 0x5AB5, 0x19A4, 0x5AB6, 0x5AB7, 0x2E3F, 0x5AB8, 0x5AB8, 0x17A4,
+ 0x5AB9, 0x5ABC, 0x2E41, 0x5ABD, 0x5ABD, 0x2069, 0x5ABE, 0x5ABE, 0x179F,
+ 0x5ABF, 0x5AC0, 0x2E45, 0x5AC1, 0x5AC1, 0x0851, 0x5AC2, 0x5AC2, 0x0CE2,
+ 0x5AC3, 0x5AC8, 0x2E47, 0x5AC9, 0x5AC9, 0x0828, 0x5ACA, 0x5ACB, 0x2E4D,
+ 0x5ACC, 0x5ACC, 0x0F40, 0x5ACD, 0x5AD1, 0x2E4F, 0x5AD2, 0x5AD2, 0x17A2,
+ 0x5AD3, 0x5AD3, 0x2E54, 0x5AD4, 0x5AD4, 0x17A3, 0x5AD5, 0x5AD5, 0x2E55,
+ 0x5AD6, 0x5AD6, 0x17A8, 0x5AD7, 0x5AD7, 0x23F7, 0x5AD8, 0x5AD8, 0x17AA,
+ 0x5AD9, 0x5ADB, 0x2E56, 0x5ADC, 0x5ADC, 0x17AB, 0x5ADD, 0x5ADF, 0x2E59,
+ 0x5AE0, 0x5AE0, 0x17A5, 0x5AE1, 0x5AE1, 0x05B6, 0x5AE2, 0x5AE2, 0x2E5C,
+ 0x5AE3, 0x5AE3, 0x17A6, 0x5AE4, 0x5AE5, 0x2E5D, 0x5AE6, 0x5AE6, 0x17A9,
+ 0x5AE7, 0x5AE8, 0x2E5F, 0x5AE9, 0x5AE9, 0x0B3E, 0x5AEA, 0x5AEA, 0x2E61,
+ 0x5AEB, 0x5AEB, 0x17A0, 0x5AEC, 0x5AF0, 0x2E62, 0x5AF1, 0x5AF1, 0x17A7,
+ 0x5AF2, 0x5AF4, 0x2E67, 0x5AF5, 0x5AF5, 0x23F6, 0x5AF6, 0x5AFA, 0x2E6A,
+ 0x5AFB, 0x5AFB, 0x23FD, 0x5AFC, 0x5AFF, 0x2E6F, 0x5B00, 0x5B00, 0x23F8,
+ 0x5B01, 0x5B07, 0x2E73, 0x5B08, 0x5B08, 0x23FA, 0x5B09, 0x5B09, 0x17AC,
+ 0x5B0A, 0x5B0A, 0x2E7A, 0x5B0B, 0x5B0B, 0x23FE, 0x5B0C, 0x5B0C, 0x1FA8,
+ 0x5B0D, 0x5B15, 0x2E7B, 0x5B16, 0x5B16, 0x17AE, 0x5B17, 0x5B17, 0x17AD,
+ 0x5B18, 0x5B18, 0x2E84, 0x5B19, 0x5B19, 0x2401, 0x5B1A, 0x5B20, 0x2E85,
+ 0x5B21, 0x5B21, 0x23FF, 0x5B22, 0x5B29, 0x2E8C, 0x5B2A, 0x5B2A, 0x2400,
+ 0x5B2B, 0x5B2F, 0x2E94, 0x5B30, 0x5B30, 0x2221, 0x5B31, 0x5B31, 0x2E99,
+ 0x5B32, 0x5B32, 0x17AF, 0x5B33, 0x5B33, 0x2E9A, 0x5B34, 0x5B34, 0x130C,
+ 0x5B35, 0x5B36, 0x2E9B, 0x5B37, 0x5B37, 0x17B0, 0x5B38, 0x5B38, 0x2122,
+ 0x5B39, 0x5B3F, 0x2E9D, 0x5B40, 0x5B40, 0x17B1, 0x5B41, 0x5B4B, 0x2EA4,
+ 0x5B4C, 0x5B4C, 0x23FB, 0x5B4D, 0x5B4F, 0x2EAF, 0x5B50, 0x5B50, 0x1230,
+ 0x5B51, 0x5B51, 0x17B7, 0x5B52, 0x5B52, 0x2EB2, 0x5B53, 0x5B53, 0x17B8,
+ 0x5B54, 0x5B54, 0x0964, 0x5B55, 0x5B55, 0x1113, 0x5B56, 0x5B56, 0x2EB3,
+ 0x5B57, 0x5B57, 0x1233, 0x5B58, 0x5B58, 0x0569, 0x5B59, 0x5B59, 0x0DE4,
+ 0x5B5A, 0x5B5A, 0x17B4, 0x5B5B, 0x5B5B, 0x1279, 0x5B5C, 0x5B5C, 0x122B,
+ 0x5B5D, 0x5B5D, 0x0F6D, 0x5B5E, 0x5B5E, 0x2EB4, 0x5B5F, 0x5B5F, 0x0AD4,
+ 0x5B60, 0x5B61, 0x2EB5, 0x5B62, 0x5B62, 0x17B9, 0x5B63, 0x5B63, 0x0831,
+ 0x5B64, 0x5B64, 0x071B, 0x5B65, 0x5B65, 0x17B5, 0x5B66, 0x5B66, 0x0FD0,
+ 0x5B67, 0x5B68, 0x2EB7, 0x5B69, 0x5B69, 0x0759, 0x5B6A, 0x5B6A, 0x0A76,
+ 0x5B6B, 0x5B6B, 0x215A, 0x5B6C, 0x5B6C, 0x1261, 0x5B6D, 0x5B6F, 0x2EB9,
+ 0x5B70, 0x5B70, 0x0D82, 0x5B71, 0x5B71, 0x176A, 0x5B72, 0x5B72, 0x2EBC,
+ 0x5B73, 0x5B73, 0x17B6, 0x5B74, 0x5B74, 0x2EBD, 0x5B75, 0x5B75, 0x0692,
+ 0x5B76, 0x5B77, 0x2EBE, 0x5B78, 0x5B78, 0x21E5, 0x5B79, 0x5B79, 0x2EC0,
+ 0x5B7A, 0x5B7A, 0x0CC1, 0x5B7B, 0x5B7C, 0x2EC1, 0x5B7D, 0x5B7D, 0x0B58,
+ 0x5B7E, 0x5B7E, 0x2EC3, 0x5B7F, 0x5B7F, 0x2057, 0x5B80, 0x5B80, 0x172E,
+ 0x5B81, 0x5B81, 0x0B61, 0x5B82, 0x5B82, 0x2EC4, 0x5B83, 0x5B83, 0x0DF1,
+ 0x5B84, 0x5B84, 0x172F, 0x5B85, 0x5B85, 0x114D, 0x5B86, 0x5B86, 0x2EC5,
+ 0x5B87, 0x5B87, 0x10D3, 0x5B88, 0x5B88, 0x0D6F, 0x5B89, 0x5B89, 0x03BD,
+ 0x5B8A, 0x5B8A, 0x2EC6, 0x5B8B, 0x5B8B, 0x0DC3, 0x5B8C, 0x5B8C, 0x0E9B,
+ 0x5B8D, 0x5B8E, 0x2EC7, 0x5B8F, 0x5B8F, 0x07A1, 0x5B90, 0x5B92, 0x2EC9,
+ 0x5B93, 0x5B93, 0x1731, 0x5B94, 0x5B94, 0x2ECC, 0x5B95, 0x5B95, 0x1730,
+ 0x5B96, 0x5B96, 0x2ECD, 0x5B97, 0x5B97, 0x1237, 0x5B98, 0x5B98, 0x0732,
+ 0x5B99, 0x5B99, 0x11E5, 0x5B9A, 0x5B9A, 0x05E7, 0x5B9B, 0x5B9B, 0x0EA1,
+ 0x5B9C, 0x5B9C, 0x1052, 0x5B9D, 0x5B9D, 0x040F, 0x5B9E, 0x5B9E, 0x0D4C,
+ 0x5B9F, 0x5B9F, 0x2ECE, 0x5BA0, 0x5BA0, 0x050D, 0x5BA1, 0x5BA1, 0x0D2C,
+ 0x5BA2, 0x5BA2, 0x095A, 0x5BA3, 0x5BA3, 0x0FC6, 0x5BA4, 0x5BA4, 0x0D69,
+ 0x5BA5, 0x5BA5, 0x1732, 0x5BA6, 0x5BA6, 0x07D7, 0x5BA7, 0x5BA9, 0x2ECF,
+ 0x5BAA, 0x5BAA, 0x0F49, 0x5BAB, 0x5BAB, 0x0705, 0x5BAC, 0x5BAF, 0x2ED2,
+ 0x5BB0, 0x5BB0, 0x111A, 0x5BB1, 0x5BB2, 0x2ED6, 0x5BB3, 0x5BB3, 0x075D,
+ 0x5BB4, 0x5BB4, 0x1010, 0x5BB5, 0x5BB5, 0x0F69, 0x5BB6, 0x5BB6, 0x0845,
+ 0x5BB7, 0x5BB7, 0x2ED8, 0x5BB8, 0x5BB8, 0x1733, 0x5BB9, 0x5BB9, 0x0CB8,
+ 0x5BBA, 0x5BBC, 0x2ED9, 0x5BBD, 0x5BBD, 0x097A, 0x5BBE, 0x5BBE, 0x045F,
+ 0x5BBF, 0x5BBF, 0x0DD3, 0x5BC0, 0x5BC1, 0x2EDC, 0x5BC2, 0x5BC2, 0x0838,
+ 0x5BC3, 0x5BC3, 0x2EDE, 0x5BC4, 0x5BC4, 0x0837, 0x5BC5, 0x5BC5, 0x1081,
+ 0x5BC6, 0x5BC6, 0x0AE1, 0x5BC7, 0x5BC7, 0x0969, 0x5BC8, 0x5BCB, 0x2EDF,
+ 0x5BCC, 0x5BCC, 0x06B6, 0x5BCD, 0x5BCF, 0x2EE3, 0x5BD0, 0x5BD0, 0x0AC7,
+ 0x5BD1, 0x5BD1, 0x2EE6, 0x5BD2, 0x5BD2, 0x0765, 0x5BD3, 0x5BD3, 0x10E5,
+ 0x5BD4, 0x5BDC, 0x2EE7, 0x5BDD, 0x5BDD, 0x0C5B, 0x5BDE, 0x5BDE, 0x0B12,
+ 0x5BDF, 0x5BDF, 0x04B3, 0x5BE0, 0x5BE0, 0x2EF0, 0x5BE1, 0x5BE1, 0x072A,
+ 0x5BE2, 0x5BE2, 0x20E5, 0x5BE3, 0x5BE3, 0x2EF1, 0x5BE4, 0x5BE4, 0x1737,
+ 0x5BE5, 0x5BE5, 0x0A11, 0x5BE6, 0x5BE6, 0x212F, 0x5BE7, 0x5BE7, 0x20A3,
+ 0x5BE8, 0x5BE8, 0x1150, 0x5BE9, 0x5BE9, 0x2121, 0x5BEA, 0x5BEA, 0x2EF2,
+ 0x5BEB, 0x5BEB, 0x21D4, 0x5BEC, 0x5BEC, 0x1FE5, 0x5BED, 0x5BED, 0x2EF3,
+ 0x5BEE, 0x5BEE, 0x1738, 0x5BEF, 0x5BEF, 0x2EF4, 0x5BF0, 0x5BF0, 0x173A,
+ 0x5BF1, 0x5BF4, 0x2EF5, 0x5BF5, 0x5BF5, 0x1E8A, 0x5BF6, 0x5BF6, 0x1E37,
+ 0x5BF7, 0x5BF7, 0x2EF9, 0x5BF8, 0x5BF8, 0x056A, 0x5BF9, 0x5BF9, 0x0613,
+ 0x5BFA, 0x5BFA, 0x0DB7, 0x5BFB, 0x5BFB, 0x0FD9, 0x5BFC, 0x5BFC, 0x059D,
+ 0x5BFD, 0x5BFE, 0x2EFA, 0x5BFF, 0x5BFF, 0x0D70, 0x5C00, 0x5C00, 0x2EFC,
+ 0x5C01, 0x5C01, 0x067F, 0x5C02, 0x5C03, 0x2EFD, 0x5C04, 0x5C04, 0x0D1D,
+ 0x5C05, 0x5C05, 0x2EFF, 0x5C06, 0x5C06, 0x087C, 0x5C07, 0x5C07, 0x1F9E,
+ 0x5C08, 0x5C08, 0x22A6, 0x5C09, 0x5C09, 0x0ECD, 0x5C0A, 0x5C0A, 0x124D,
+ 0x5C0B, 0x5C0B, 0x21E8, 0x5C0C, 0x5C0C, 0x2F00, 0x5C0D, 0x5C0D, 0x1EDA,
+ 0x5C0E, 0x5C0E, 0x1EB9, 0x5C0F, 0x5C0F, 0x0F6C, 0x5C10, 0x5C10, 0x2F01,
+ 0x5C11, 0x5C11, 0x0D12, 0x5C12, 0x5C13, 0x2F02, 0x5C14, 0x5C14, 0x063A,
+ 0x5C15, 0x5C15, 0x17B2, 0x5C16, 0x5C16, 0x0855, 0x5C17, 0x5C17, 0x2F04,
+ 0x5C18, 0x5C18, 0x04E3, 0x5C19, 0x5C19, 0x2F05, 0x5C1A, 0x5C1A, 0x0D09,
+ 0x5C1B, 0x5C1B, 0x2F06, 0x5C1C, 0x5C1C, 0x17B3, 0x5C1D, 0x5C1D, 0x04C7,
+ 0x5C1E, 0x5C21, 0x2F07, 0x5C22, 0x5C22, 0x14B6, 0x5C23, 0x5C23, 0x2F0B,
+ 0x5C24, 0x5C24, 0x10AD, 0x5C25, 0x5C25, 0x14B7, 0x5C26, 0x5C26, 0x2F0C,
+ 0x5C27, 0x5C27, 0x1029, 0x5C28, 0x5C2B, 0x2F0D, 0x5C2C, 0x5C2C, 0x14B8,
+ 0x5C2D, 0x5C30, 0x2F11, 0x5C31, 0x5C31, 0x08FC, 0x5C32, 0x5C33, 0x2F15,
+ 0x5C34, 0x5C34, 0x14B9, 0x5C35, 0x5C36, 0x2F17, 0x5C37, 0x5C37, 0x235C,
+ 0x5C38, 0x5C38, 0x0D43, 0x5C39, 0x5C39, 0x1083, 0x5C3A, 0x5C3A, 0x0504,
+ 0x5C3B, 0x5C3B, 0x1766, 0x5C3C, 0x5C3C, 0x0B44, 0x5C3D, 0x5C3D, 0x08D0,
+ 0x5C3E, 0x5C3E, 0x0EC1, 0x5C3F, 0x5C3F, 0x0B55, 0x5C40, 0x5C40, 0x0905,
+ 0x5C41, 0x5C41, 0x0BC7, 0x5C42, 0x5C42, 0x04AA, 0x5C43, 0x5C44, 0x2F19,
+ 0x5C45, 0x5C45, 0x0902, 0x5C46, 0x5C47, 0x2F1B, 0x5C48, 0x5C48, 0x0C79,
+ 0x5C49, 0x5C49, 0x0E3E, 0x5C4A, 0x5C4A, 0x08BD, 0x5C4B, 0x5C4B, 0x0EEC,
+ 0x5C4C, 0x5C4D, 0x2F1D, 0x5C4E, 0x5C4E, 0x0D51, 0x5C4F, 0x5C4F, 0x0BE0,
+ 0x5C50, 0x5C50, 0x1768, 0x5C51, 0x5C51, 0x0F87, 0x5C52, 0x5C54, 0x2F1F,
+ 0x5C55, 0x5C55, 0x115A, 0x5C56, 0x5C58, 0x2F22, 0x5C59, 0x5C59, 0x1769,
+ 0x5C5A, 0x5C5D, 0x2F25, 0x5C5E, 0x5C5E, 0x0D8B, 0x5C5F, 0x5C5F, 0x2F29,
+ 0x5C60, 0x5C60, 0x0E71, 0x5C61, 0x5C61, 0x0A6C, 0x5C62, 0x5C62, 0x2050,
+ 0x5C63, 0x5C63, 0x176B, 0x5C64, 0x5C64, 0x1E67, 0x5C65, 0x5C65, 0x0A6B,
+ 0x5C66, 0x5C66, 0x176C, 0x5C67, 0x5C67, 0x2F2A, 0x5C68, 0x5C68, 0x23F4,
+ 0x5C69, 0x5C6B, 0x2F2B, 0x5C6C, 0x5C6C, 0x213E, 0x5C6D, 0x5C6D, 0x2F2E,
+ 0x5C6E, 0x5C6E, 0x1774, 0x5C6F, 0x5C6F, 0x0E7E, 0x5C70, 0x5C70, 0x2F2F,
+ 0x5C71, 0x5C71, 0x0CF6, 0x5C72, 0x5C78, 0x2F30, 0x5C79, 0x5C79, 0x1060,
+ 0x5C7A, 0x5C7A, 0x15AC, 0x5C7B, 0x5C7E, 0x2F37, 0x5C7F, 0x5C7F, 0x10D1,
+ 0x5C80, 0x5C80, 0x2F3B, 0x5C81, 0x5C81, 0x0DDF, 0x5C82, 0x5C82, 0x0C10,
+ 0x5C83, 0x5C87, 0x2F3C, 0x5C88, 0x5C88, 0x15B0, 0x5C89, 0x5C8B, 0x2F41,
+ 0x5C8C, 0x5C8C, 0x15AB, 0x5C8D, 0x5C8D, 0x15AD, 0x5C8E, 0x5C8F, 0x2F44,
+ 0x5C90, 0x5C90, 0x15AE, 0x5C91, 0x5C91, 0x15B3, 0x5C92, 0x5C93, 0x2F46,
+ 0x5C94, 0x5C94, 0x04B4, 0x5C95, 0x5C95, 0x2F48, 0x5C96, 0x5C96, 0x15AF,
+ 0x5C97, 0x5C97, 0x06D5, 0x5C98, 0x5C99, 0x15B1, 0x5C9A, 0x5C9A, 0x15B4,
+ 0x5C9B, 0x5C9B, 0x059B, 0x5C9C, 0x5C9C, 0x15B5, 0x5C9D, 0x5CA0, 0x2F49,
+ 0x5CA1, 0x5CA1, 0x1F16, 0x5CA2, 0x5CA2, 0x15B7, 0x5CA3, 0x5CA3, 0x15BC,
+ 0x5CA4, 0x5CA8, 0x2F4D, 0x5CA9, 0x5CA9, 0x0FFB, 0x5CAA, 0x5CAA, 0x2F52,
+ 0x5CAB, 0x5CAB, 0x15BA, 0x5CAC, 0x5CAC, 0x15B9, 0x5CAD, 0x5CAD, 0x0A34,
+ 0x5CAE, 0x5CB0, 0x2F53, 0x5CB1, 0x5CB1, 0x15BB, 0x5CB2, 0x5CB2, 0x2F56,
+ 0x5CB3, 0x5CB3, 0x1103, 0x5CB4, 0x5CB4, 0x2F57, 0x5CB5, 0x5CB5, 0x15B6,
+ 0x5CB6, 0x5CB6, 0x2F58, 0x5CB7, 0x5CB7, 0x15BE, 0x5CB8, 0x5CB8, 0x03C1,
+ 0x5CB9, 0x5CBC, 0x2F59, 0x5CBD, 0x5CBD, 0x15B8, 0x5CBE, 0x5CBE, 0x2F5D,
+ 0x5CBF, 0x5CBF, 0x0986, 0x5CC0, 0x5CC0, 0x2F5E, 0x5CC1, 0x5CC1, 0x15BD,
+ 0x5CC2, 0x5CC3, 0x2F5F, 0x5CC4, 0x5CC4, 0x15BF, 0x5CC5, 0x5CCA, 0x2F61,
+ 0x5CCB, 0x5CCB, 0x15C2, 0x5CCC, 0x5CD1, 0x2F67, 0x5CD2, 0x5CD2, 0x15C0,
+ 0x5CD3, 0x5CD8, 0x2F6D, 0x5CD9, 0x5CD9, 0x11C4, 0x5CDA, 0x5CE0, 0x2F73,
+ 0x5CE1, 0x5CE1, 0x0F2C, 0x5CE2, 0x5CE3, 0x2F7A, 0x5CE4, 0x5CE4, 0x15C1,
+ 0x5CE5, 0x5CE5, 0x15C3, 0x5CE6, 0x5CE6, 0x0A74, 0x5CE7, 0x5CE7, 0x2F7C,
+ 0x5CE8, 0x5CE8, 0x062A, 0x5CE9, 0x5CE9, 0x2F7D, 0x5CEA, 0x5CEA, 0x10DD,
+ 0x5CEB, 0x5CEC, 0x2F7E, 0x5CED, 0x5CED, 0x0C4A, 0x5CEE, 0x5CEF, 0x2F80,
+ 0x5CF0, 0x5CF0, 0x0682, 0x5CF1, 0x5CF3, 0x2F82, 0x5CF4, 0x5CF4, 0x2389,
+ 0x5CF5, 0x5CF5, 0x2F85, 0x5CF6, 0x5CF6, 0x1EB7, 0x5CF7, 0x5CFA, 0x2F86,
+ 0x5CFB, 0x5CFB, 0x092D, 0x5CFC, 0x5CFC, 0x2F8A, 0x5CFD, 0x5CFD, 0x21B4,
+ 0x5CFE, 0x5CFF, 0x2F8B, 0x5D00, 0x5D01, 0x2F8D, 0x5D02, 0x5D03, 0x15C4,
+ 0x5D04, 0x5D05, 0x2F8F, 0x5D06, 0x5D06, 0x15CB, 0x5D07, 0x5D07, 0x050C,
+ 0x5D08, 0x5D0C, 0x2F91, 0x5D0D, 0x5D0D, 0x238F, 0x5D0E, 0x5D0E, 0x0C08,
+ 0x5D0F, 0x5D13, 0x2F96, 0x5D14, 0x5D14, 0x0561, 0x5D15, 0x5D15, 0x2F9B,
+ 0x5D16, 0x5D16, 0x0FEB, 0x5D17, 0x5D17, 0x1F1A, 0x5D18, 0x5D1A, 0x2F9C,
+ 0x5D1B, 0x5D1B, 0x15CC, 0x5D1C, 0x5D1D, 0x2F9F, 0x5D1E, 0x5D1E, 0x15CA,
+ 0x5D1F, 0x5D23, 0x2FA1, 0x5D24, 0x5D24, 0x15C9, 0x5D25, 0x5D25, 0x2FA6,
+ 0x5D26, 0x5D26, 0x15C7, 0x5D27, 0x5D27, 0x15C6, 0x5D28, 0x5D28, 0x2FA7,
+ 0x5D29, 0x5D29, 0x0429, 0x5D2A, 0x5D2B, 0x2FA8, 0x5D2C, 0x5D2C, 0x238B,
+ 0x5D2D, 0x5D2D, 0x1159, 0x5D2E, 0x5D2E, 0x15C8, 0x5D2F, 0x5D33, 0x2FAA,
+ 0x5D34, 0x5D34, 0x15CF, 0x5D35, 0x5D3C, 0x2FAF, 0x5D3D, 0x5D3D, 0x15D0,
+ 0x5D3E, 0x5D3E, 0x15CE, 0x5D3F, 0x5D46, 0x2FB7, 0x5D47, 0x5D47, 0x1B22,
+ 0x5D48, 0x5D49, 0x2FBF, 0x5D4A, 0x5D4A, 0x15D7, 0x5D4B, 0x5D4B, 0x15D6,
+ 0x5D4C, 0x5D4C, 0x0C33, 0x5D4D, 0x5D4F, 0x2FC1, 0x5D50, 0x5D50, 0x238A,
+ 0x5D51, 0x5D57, 0x2FC4, 0x5D58, 0x5D58, 0x15CD, 0x5D59, 0x5D5A, 0x2FCB,
+ 0x5D5B, 0x5D5B, 0x15D2, 0x5D5C, 0x5D5C, 0x2FCD, 0x5D5D, 0x5D5D, 0x15D4,
+ 0x5D5E, 0x5D68, 0x2FCE, 0x5D69, 0x5D69, 0x15D8, 0x5D6A, 0x5D6A, 0x2FD9,
+ 0x5D6B, 0x5D6B, 0x15D5, 0x5D6C, 0x5D6C, 0x15D1, 0x5D6D, 0x5D6E, 0x2FDA,
+ 0x5D6F, 0x5D6F, 0x15D3, 0x5D70, 0x5D73, 0x2FDC, 0x5D74, 0x5D74, 0x15D9,
+ 0x5D75, 0x5D80, 0x2FE0, 0x5D81, 0x5D81, 0x2391, 0x5D82, 0x5D82, 0x15DA,
+ 0x5D83, 0x5D83, 0x2FEC, 0x5D84, 0x5D84, 0x2271, 0x5D85, 0x5D86, 0x2FED,
+ 0x5D87, 0x5D87, 0x2388, 0x5D88, 0x5D96, 0x2FEF, 0x5D97, 0x5D97, 0x238E,
+ 0x5D98, 0x5D98, 0x2FFE, 0x5D99, 0x5D99, 0x15DB, 0x5D9A, 0x5D9C, 0x2FFF,
+ 0x5D9D, 0x5D9D, 0x15DC, 0x5D9E, 0x5D9F, 0x3002, 0x5DA0, 0x5DA0, 0x238D,
+ 0x5DA1, 0x5DA6, 0x3004, 0x5DA7, 0x5DA7, 0x238C, 0x5DA8, 0x5DB6, 0x300A,
+ 0x5DB7, 0x5DB7, 0x15DE, 0x5DB8, 0x5DB8, 0x2390, 0x5DB9, 0x5DB9, 0x3019,
+ 0x5DBA, 0x5DBA, 0x2033, 0x5DBB, 0x5DBB, 0x301A, 0x5DBC, 0x5DBC, 0x223C,
+ 0x5DBD, 0x5DC4, 0x301B, 0x5DC5, 0x5DC5, 0x15DF, 0x5DC6, 0x5DCA, 0x3023,
+ 0x5DCB, 0x5DCB, 0x1FE9, 0x5DCC, 0x5DCC, 0x3028, 0x5DCD, 0x5DCD, 0x0EB0,
+ 0x5DCE, 0x5DD1, 0x3029, 0x5DD2, 0x5DD2, 0x2055, 0x5DD3, 0x5DD3, 0x302D,
+ 0x5DD4, 0x5DD4, 0x2392, 0x5DD5, 0x5DDA, 0x302E, 0x5DDB, 0x5DDB, 0x1815,
+ 0x5DDC, 0x5DDC, 0x3034, 0x5DDD, 0x5DDD, 0x052B, 0x5DDE, 0x5DDE, 0x11DC,
+ 0x5DDF, 0x5DE0, 0x3035, 0x5DE1, 0x5DE1, 0x0FDB, 0x5DE2, 0x5DE2, 0x04D7,
+ 0x5DE3, 0x5DE4, 0x3037, 0x5DE5, 0x5DE5, 0x06FD, 0x5DE6, 0x5DE6, 0x1250,
+ 0x5DE7, 0x5DE7, 0x0C46, 0x5DE8, 0x5DE8, 0x090D, 0x5DE9, 0x5DE9, 0x0707,
+ 0x5DEA, 0x5DEA, 0x3039, 0x5DEB, 0x5DEB, 0x0EE6, 0x5DEC, 0x5DED, 0x303A,
+ 0x5DEE, 0x5DEE, 0x04B5, 0x5DEF, 0x5DEF, 0x139F, 0x5DF0, 0x5DF0, 0x2324,
+ 0x5DF1, 0x5DF1, 0x082D, 0x5DF2, 0x5DF2, 0x1058, 0x5DF3, 0x5DF3, 0x0DBD,
+ 0x5DF4, 0x5DF4, 0x03D8, 0x5DF5, 0x5DF6, 0x303C, 0x5DF7, 0x5DF7, 0x0F5C,
+ 0x5DF8, 0x5DFC, 0x303E, 0x5DFD, 0x5DFD, 0x12F7, 0x5DFE, 0x5DFE, 0x08BE,
+ 0x5DFF, 0x5DFF, 0x3043, 0x5E00, 0x5E00, 0x3044, 0x5E01, 0x5E01, 0x043B,
+ 0x5E02, 0x5E02, 0x0D67, 0x5E03, 0x5E03, 0x0483, 0x5E04, 0x5E04, 0x3045,
+ 0x5E05, 0x5E05, 0x0D9C, 0x5E06, 0x5E06, 0x0648, 0x5E07, 0x5E07, 0x3046,
+ 0x5E08, 0x5E08, 0x0D3D, 0x5E09, 0x5E0B, 0x3047, 0x5E0C, 0x5E0C, 0x0F10,
+ 0x5E0D, 0x5E0E, 0x304A, 0x5E0F, 0x5E0F, 0x159E, 0x5E10, 0x5E10, 0x116B,
+ 0x5E11, 0x5E11, 0x15A1, 0x5E12, 0x5E13, 0x304C, 0x5E14, 0x5E14, 0x15A0,
+ 0x5E15, 0x5E15, 0x0B82, 0x5E16, 0x5E16, 0x0E4E, 0x5E17, 0x5E17, 0x304E,
+ 0x5E18, 0x5E18, 0x09FA, 0x5E19, 0x5E19, 0x159F, 0x5E1A, 0x5E1A, 0x11E2,
+ 0x5E1B, 0x5E1B, 0x0476, 0x5E1C, 0x5E1C, 0x11C3, 0x5E1D, 0x5E1D, 0x05BC,
+ 0x5E1E, 0x5E24, 0x304F, 0x5E25, 0x5E25, 0x2143, 0x5E26, 0x5E26, 0x057B,
+ 0x5E27, 0x5E27, 0x11A0, 0x5E28, 0x5E2A, 0x3056, 0x5E2B, 0x5E2B, 0x2129,
+ 0x5E2C, 0x5E2C, 0x3059, 0x5E2D, 0x5E2D, 0x0F1C, 0x5E2E, 0x5E2E, 0x03FA,
+ 0x5E2F, 0x5E30, 0x305A, 0x5E31, 0x5E31, 0x15A2, 0x5E32, 0x5E32, 0x305C,
+ 0x5E33, 0x5E33, 0x2277, 0x5E34, 0x5E35, 0x305D, 0x5E36, 0x5E36, 0x1EA7,
+ 0x5E37, 0x5E37, 0x15A5, 0x5E38, 0x5E38, 0x04C8, 0x5E39, 0x5E3A, 0x305F,
+ 0x5E3B, 0x5E3C, 0x15A3, 0x5E3D, 0x5E3D, 0x0AB6, 0x5E3E, 0x5E3F, 0x3061,
+ 0x5E40, 0x5E40, 0x2285, 0x5E41, 0x5E41, 0x3063, 0x5E42, 0x5E42, 0x0AE2,
+ 0x5E43, 0x5E43, 0x2384, 0x5E44, 0x5E44, 0x15A6, 0x5E45, 0x5E45, 0x0696,
+ 0x5E46, 0x5E4B, 0x3064, 0x5E4C, 0x5E4C, 0x07E4, 0x5E4D, 0x5E53, 0x306A,
+ 0x5E54, 0x5E54, 0x15A7, 0x5E55, 0x5E55, 0x0B1E, 0x5E56, 0x5E56, 0x3071,
+ 0x5E57, 0x5E57, 0x2387, 0x5E58, 0x5E58, 0x2386, 0x5E59, 0x5E5A, 0x3072,
+ 0x5E5B, 0x5E5B, 0x15A8, 0x5E5C, 0x5E5D, 0x3074, 0x5E5E, 0x5E5E, 0x15A9,
+ 0x5E5F, 0x5E5F, 0x2290, 0x5E60, 0x5E60, 0x3076, 0x5E61, 0x5E61, 0x15AA,
+ 0x5E62, 0x5E62, 0x0534, 0x5E63, 0x5E63, 0x1E44, 0x5E64, 0x5E6A, 0x3077,
+ 0x5E6B, 0x5E6B, 0x1E32, 0x5E6C, 0x5E6C, 0x2385, 0x5E6D, 0x5E71, 0x307E,
+ 0x5E72, 0x5E72, 0x06C4, 0x5E73, 0x5E73, 0x0BDC, 0x5E74, 0x5E74, 0x0B4D,
+ 0x5E75, 0x5E75, 0x3083, 0x5E76, 0x5E76, 0x0469, 0x5E77, 0x5E77, 0x3084,
+ 0x5E78, 0x5E78, 0x0F9D, 0x5E79, 0x5E79, 0x1F13, 0x5E7A, 0x5E7A, 0x1813,
+ 0x5E7B, 0x5E7B, 0x07D8, 0x5E7C, 0x5E7C, 0x10BC, 0x5E7D, 0x5E7D, 0x10A9,
+ 0x5E7E, 0x5E7E, 0x1F73, 0x5E7F, 0x5E7F, 0x073C, 0x5E80, 0x5E80, 0x1631,
+ 0x5E81, 0x5E83, 0x3085, 0x5E84, 0x5E84, 0x120C, 0x5E85, 0x5E85, 0x3088,
+ 0x5E86, 0x5E86, 0x0C69, 0x5E87, 0x5E87, 0x043C, 0x5E88, 0x5E89, 0x3089,
+ 0x5E8A, 0x5E8A, 0x0535, 0x5E8B, 0x5E8B, 0x1633, 0x5E8C, 0x5E8E, 0x308B,
+ 0x5E8F, 0x5E8F, 0x0FBD, 0x5E90, 0x5E90, 0x0A55, 0x5E91, 0x5E91, 0x1632,
+ 0x5E92, 0x5E92, 0x308E, 0x5E93, 0x5E93, 0x096F, 0x5E94, 0x5E94, 0x108B,
+ 0x5E95, 0x5E95, 0x05B8, 0x5E96, 0x5E96, 0x1634, 0x5E97, 0x5E97, 0x05CB,
+ 0x5E98, 0x5E98, 0x308F, 0x5E99, 0x5E99, 0x0AF2, 0x5E9A, 0x5E9A, 0x06F8,
+ 0x5E9B, 0x5E9B, 0x3090, 0x5E9C, 0x5E9C, 0x06A9, 0x5E9D, 0x5E9D, 0x3091,
+ 0x5E9E, 0x5E9E, 0x0B94, 0x5E9F, 0x5E9F, 0x066C, 0x5EA0, 0x5EA0, 0x1636,
+ 0x5EA1, 0x5EA4, 0x3092, 0x5EA5, 0x5EA5, 0x1635, 0x5EA6, 0x5EA6, 0x0607,
+ 0x5EA7, 0x5EA7, 0x1256, 0x5EA8, 0x5EAA, 0x3096, 0x5EAB, 0x5EAB, 0x1FE0,
+ 0x5EAC, 0x5EAC, 0x3099, 0x5EAD, 0x5EAD, 0x0E56, 0x5EAE, 0x5EB2, 0x309A,
+ 0x5EB3, 0x5EB3, 0x163A, 0x5EB4, 0x5EB4, 0x309F, 0x5EB5, 0x5EB5, 0x1638,
+ 0x5EB6, 0x5EB6, 0x0D93, 0x5EB7, 0x5EB7, 0x0942, 0x5EB8, 0x5EB8, 0x109E,
+ 0x5EB9, 0x5EB9, 0x1637, 0x5EBA, 0x5EBD, 0x30A0, 0x5EBE, 0x5EBE, 0x1639,
+ 0x5EBF, 0x5EC8, 0x30A4, 0x5EC9, 0x5EC9, 0x09F7, 0x5ECA, 0x5ECA, 0x09B3,
+ 0x5ECB, 0x5ED0, 0x30AE, 0x5ED1, 0x5ED1, 0x163D, 0x5ED2, 0x5ED2, 0x163C,
+ 0x5ED3, 0x5ED3, 0x0995, 0x5ED4, 0x5ED5, 0x30B4, 0x5ED6, 0x5ED6, 0x0A17,
+ 0x5ED7, 0x5EDA, 0x30B6, 0x5EDB, 0x5EDB, 0x163E, 0x5EDC, 0x5EDE, 0x30BA,
+ 0x5EDF, 0x5EDF, 0x2087, 0x5EE0, 0x5EE0, 0x1E78, 0x5EE1, 0x5EE1, 0x23AE,
+ 0x5EE2, 0x5EE2, 0x1EF6, 0x5EE3, 0x5EE3, 0x1F31, 0x5EE4, 0x5EE7, 0x30BD,
+ 0x5EE8, 0x5EE8, 0x163F, 0x5EE9, 0x5EE9, 0x30C1, 0x5EEA, 0x5EEA, 0x1640,
+ 0x5EEB, 0x5EEB, 0x30C2, 0x5EEC, 0x5EEC, 0x2045, 0x5EED, 0x5EF2, 0x30C3,
+ 0x5EF3, 0x5EF3, 0x2178, 0x5EF4, 0x5EF4, 0x1398, 0x5EF5, 0x5EF5, 0x30C9,
+ 0x5EF6, 0x5EF6, 0x0FFC, 0x5EF7, 0x5EF7, 0x0E53, 0x5EF8, 0x5EF9, 0x30CA,
+ 0x5EFA, 0x5EFA, 0x0879, 0x5EFB, 0x5EFD, 0x30CC, 0x5EFE, 0x5EFE, 0x14AD,
+ 0x5EFF, 0x5EFF, 0x125B, 0x5F00, 0x5F00, 0x0937, 0x5F01, 0x5F01, 0x139D,
+ 0x5F02, 0x5F02, 0x1073, 0x5F03, 0x5F03, 0x0C19, 0x5F04, 0x5F04, 0x0B6B,
+ 0x5F05, 0x5F07, 0x30CF, 0x5F08, 0x5F08, 0x14AE, 0x5F09, 0x5F09, 0x30D2,
+ 0x5F0A, 0x5F0A, 0x0440, 0x5F0B, 0x5F0B, 0x14F6, 0x5F0C, 0x5F0E, 0x30D3,
+ 0x5F0F, 0x5F0F, 0x0D54, 0x5F10, 0x5F10, 0x30D6, 0x5F11, 0x5F11, 0x14F9,
+ 0x5F12, 0x5F12, 0x30D7, 0x5F13, 0x5F13, 0x0706, 0x5F14, 0x5F14, 0x30D8,
+ 0x5F15, 0x5F15, 0x1084, 0x5F16, 0x5F16, 0x30D9, 0x5F17, 0x5F17, 0x06A0,
+ 0x5F18, 0x5F18, 0x07A2, 0x5F19, 0x5F1A, 0x30DA, 0x5F1B, 0x5F1B, 0x04FF,
+ 0x5F1C, 0x5F1E, 0x30DC, 0x5F1F, 0x5F1F, 0x05BD, 0x5F20, 0x5F20, 0x1166,
+ 0x5F21, 0x5F24, 0x30DF, 0x5F25, 0x5F25, 0x0ADB, 0x5F26, 0x5F26, 0x0F3F,
+ 0x5F27, 0x5F27, 0x07B6, 0x5F28, 0x5F28, 0x30E3, 0x5F29, 0x5F29, 0x176F,
+ 0x5F2A, 0x5F2A, 0x176E, 0x5F2B, 0x5F2C, 0x30E4, 0x5F2D, 0x5F2D, 0x1770,
+ 0x5F2E, 0x5F2E, 0x30E6, 0x5F2F, 0x5F2F, 0x0E95, 0x5F30, 0x5F30, 0x30E7,
+ 0x5F31, 0x5F31, 0x0CD0, 0x5F32, 0x5F32, 0x30E8, 0x5F33, 0x5F33, 0x23F5,
+ 0x5F34, 0x5F34, 0x30E9, 0x5F35, 0x5F35, 0x2275, 0x5F36, 0x5F38, 0x30EA,
+ 0x5F39, 0x5F39, 0x0590, 0x5F3A, 0x5F3A, 0x0C3C, 0x5F3B, 0x5F3B, 0x30ED,
+ 0x5F3C, 0x5F3C, 0x1772, 0x5F3D, 0x5F3F, 0x30EE, 0x5F40, 0x5F40, 0x19BE,
+ 0x5F41, 0x5F45, 0x30F1, 0x5F46, 0x5F46, 0x266E, 0x5F47, 0x5F47, 0x30F6,
+ 0x5F48, 0x5F48, 0x1EB0, 0x5F49, 0x5F4B, 0x30F7, 0x5F4C, 0x5F4C, 0x2083,
+ 0x5F4D, 0x5F4D, 0x30FA, 0x5F4E, 0x5F4E, 0x2188, 0x5F4F, 0x5F4F, 0x30FB,
+ 0x5F50, 0x5F50, 0x1762, 0x5F51, 0x5F51, 0x30FC, 0x5F52, 0x5F52, 0x0742,
+ 0x5F53, 0x5F53, 0x0592, 0x5F54, 0x5F54, 0x30FD, 0x5F55, 0x5F55, 0x0A63,
+ 0x5F56, 0x5F56, 0x1764, 0x5F57, 0x5F57, 0x1763, 0x5F58, 0x5F58, 0x1765,
+ 0x5F59, 0x5F59, 0x267C, 0x5F5A, 0x5F5C, 0x30FE, 0x5F5D, 0x5F5D, 0x1054,
+ 0x5F5E, 0x5F60, 0x3101, 0x5F61, 0x5F61, 0x15EE, 0x5F62, 0x5F62, 0x0F99,
+ 0x5F63, 0x5F63, 0x3104, 0x5F64, 0x5F64, 0x0E5F, 0x5F65, 0x5F65, 0x3105,
+ 0x5F66, 0x5F66, 0x100E, 0x5F67, 0x5F68, 0x3106, 0x5F69, 0x5F69, 0x0491,
+ 0x5F6A, 0x5F6A, 0x0454, 0x5F6B, 0x5F6B, 0x3108, 0x5F6C, 0x5F6C, 0x045B,
+ 0x5F6D, 0x5F6D, 0x0BAE, 0x5F6E, 0x5F6F, 0x3109, 0x5F70, 0x5F70, 0x1164,
+ 0x5F71, 0x5F71, 0x1095, 0x5F72, 0x5F72, 0x310B, 0x5F73, 0x5F73, 0x15E0,
+ 0x5F74, 0x5F76, 0x310C, 0x5F77, 0x5F77, 0x15E1, 0x5F78, 0x5F78, 0x310F,
+ 0x5F79, 0x5F79, 0x1062, 0x5F7A, 0x5F7A, 0x3110, 0x5F7B, 0x5F7B, 0x04DE,
+ 0x5F7C, 0x5F7C, 0x0434, 0x5F7D, 0x5F7F, 0x3111, 0x5F80, 0x5F80, 0x0EAA,
+ 0x5F81, 0x5F81, 0x1198, 0x5F82, 0x5F82, 0x15E2, 0x5F83, 0x5F83, 0x3114,
+ 0x5F84, 0x5F84, 0x08E5, 0x5F85, 0x5F85, 0x0580, 0x5F86, 0x5F86, 0x3115,
+ 0x5F87, 0x5F87, 0x15E3, 0x5F88, 0x5F88, 0x0793, 0x5F89, 0x5F89, 0x15E4,
+ 0x5F8A, 0x5F8A, 0x07C7, 0x5F8B, 0x5F8B, 0x0A70, 0x5F8C, 0x5F8C, 0x15E5,
+ 0x5F8D, 0x5F8F, 0x3116, 0x5F90, 0x5F90, 0x0FB7, 0x5F91, 0x5F91, 0x1FC5,
+ 0x5F92, 0x5F92, 0x0E6E, 0x5F93, 0x5F94, 0x3119, 0x5F95, 0x5F95, 0x15E6,
+ 0x5F96, 0x5F96, 0x311B, 0x5F97, 0x5F97, 0x05A4, 0x5F98, 0x5F98, 0x0B88,
+ 0x5F99, 0x5F99, 0x15E7, 0x5F9A, 0x5F9B, 0x311C, 0x5F9C, 0x5F9C, 0x15E8,
+ 0x5F9D, 0x5F9D, 0x311E, 0x5F9E, 0x5F9E, 0x1EA1, 0x5F9F, 0x5F9F, 0x311F,
+ 0x5FA0, 0x5FA0, 0x2393, 0x5FA1, 0x5FA1, 0x10DE, 0x5FA2, 0x5FA7, 0x3120,
+ 0x5FA8, 0x5FA8, 0x15E9, 0x5FA9, 0x5FA9, 0x1F0B, 0x5FAA, 0x5FAA, 0x0FD6,
+ 0x5FAB, 0x5FAC, 0x3126, 0x5FAD, 0x5FAD, 0x15EA, 0x5FAE, 0x5FAE, 0x0EB1,
+ 0x5FAF, 0x5FB4, 0x3128, 0x5FB5, 0x5FB5, 0x15EB, 0x5FB6, 0x5FB6, 0x312E,
+ 0x5FB7, 0x5FB7, 0x05A3, 0x5FB8, 0x5FB8, 0x312F, 0x5FB9, 0x5FB9, 0x1E7C,
+ 0x5FBA, 0x5FBB, 0x3130, 0x5FBC, 0x5FBC, 0x15EC, 0x5FBD, 0x5FBD, 0x07EA,
+ 0x5FBE, 0x5FC2, 0x3132, 0x5FC3, 0x5FC3, 0x0F8F, 0x5FC4, 0x5FC4, 0x1642,
+ 0x5FC5, 0x5FC5, 0x0441, 0x5FC6, 0x5FC6, 0x106B, 0x5FC7, 0x5FC8, 0x3137,
+ 0x5FC9, 0x5FC9, 0x1643, 0x5FCA, 0x5FCB, 0x3139, 0x5FCC, 0x5FCC, 0x083C,
+ 0x5FCD, 0x5FCD, 0x0CA7, 0x5FCE, 0x5FCE, 0x313B, 0x5FCF, 0x5FCF, 0x1645,
+ 0x5FD0, 0x5FD0, 0x1A0C, 0x5FD1, 0x5FD1, 0x1A0B, 0x5FD2, 0x5FD2, 0x14F7,
+ 0x5FD3, 0x5FD5, 0x313C, 0x5FD6, 0x5FD6, 0x1644, 0x5FD7, 0x5FD7, 0x11BD,
+ 0x5FD8, 0x5FD8, 0x0EAD, 0x5FD9, 0x5FD9, 0x0AAB, 0x5FDA, 0x5FDC, 0x313F,
+ 0x5FDD, 0x5FDD, 0x1683, 0x5FDE, 0x5FDF, 0x3142, 0x5FE0, 0x5FE0, 0x11D1,
+ 0x5FE1, 0x5FE1, 0x1649, 0x5FE2, 0x5FE3, 0x3144, 0x5FE4, 0x5FE4, 0x164A,
+ 0x5FE5, 0x5FE6, 0x3146, 0x5FE7, 0x5FE7, 0x10AC, 0x5FE8, 0x5FE9, 0x3148,
+ 0x5FEA, 0x5FEA, 0x164E, 0x5FEB, 0x5FEB, 0x0979, 0x5FEC, 0x5FEC, 0x314A,
+ 0x5FED, 0x5FED, 0x164F, 0x5FEE, 0x5FEE, 0x1647, 0x5FEF, 0x5FF0, 0x314B,
+ 0x5FF1, 0x5FF1, 0x04E5, 0x5FF2, 0x5FF4, 0x314D, 0x5FF5, 0x5FF5, 0x0B51,
+ 0x5FF6, 0x5FF7, 0x3150, 0x5FF8, 0x5FF8, 0x1650, 0x5FF9, 0x5FFA, 0x3152,
+ 0x5FFB, 0x5FFB, 0x0F8E, 0x5FFC, 0x5FFC, 0x3154, 0x5FFD, 0x5FFD, 0x07AD,
+ 0x5FFE, 0x5FFE, 0x164B, 0x5FFF, 0x5FFF, 0x067B, 0x6000, 0x6000, 0x07C8,
+ 0x6001, 0x6001, 0x0DFF, 0x6002, 0x6002, 0x0DC0, 0x6003, 0x6003, 0x1646,
+ 0x6004, 0x6004, 0x1648, 0x6005, 0x6006, 0x164C, 0x6007, 0x6009, 0x3155,
+ 0x600A, 0x600A, 0x1659, 0x600B, 0x600C, 0x3158, 0x600D, 0x600D, 0x1656,
+ 0x600E, 0x600E, 0x1138, 0x600F, 0x600F, 0x1655, 0x6010, 0x6011, 0x315A,
+ 0x6012, 0x6012, 0x0B6E, 0x6013, 0x6013, 0x315C, 0x6014, 0x6014, 0x119B,
+ 0x6015, 0x6015, 0x0B83, 0x6016, 0x6016, 0x0487, 0x6017, 0x6018, 0x315D,
+ 0x6019, 0x6019, 0x1651, 0x601A, 0x601A, 0x315F, 0x601B, 0x601B, 0x1654,
+ 0x601C, 0x601C, 0x09F8, 0x601D, 0x601D, 0x0DB1, 0x601E, 0x601F, 0x3160,
+ 0x6020, 0x6020, 0x0582, 0x6021, 0x6021, 0x165B, 0x6022, 0x6024, 0x3162,
+ 0x6025, 0x6025, 0x0824, 0x6026, 0x6026, 0x1653, 0x6027, 0x6027, 0x0F9F,
+ 0x6028, 0x6028, 0x10FC, 0x6029, 0x6029, 0x1657, 0x602A, 0x602A, 0x072F,
+ 0x602B, 0x602B, 0x1658, 0x602C, 0x602E, 0x3165, 0x602F, 0x602F, 0x0C50,
+ 0x6030, 0x6034, 0x3168, 0x6035, 0x6035, 0x1652, 0x6036, 0x603A, 0x316D,
+ 0x603B, 0x603B, 0x1239, 0x603C, 0x603C, 0x1A0D, 0x603D, 0x603E, 0x3172,
+ 0x603F, 0x603F, 0x165A, 0x6040, 0x6040, 0x3174, 0x6041, 0x6041, 0x1A11,
+ 0x6042, 0x6042, 0x1660, 0x6043, 0x6043, 0x0D68, 0x6044, 0x604A, 0x3175,
+ 0x604B, 0x604B, 0x09FE, 0x604C, 0x604C, 0x317C, 0x604D, 0x604D, 0x07E5,
+ 0x604E, 0x604F, 0x317D, 0x6050, 0x6050, 0x0963, 0x6051, 0x6051, 0x317F,
+ 0x6052, 0x6052, 0x079A, 0x6053, 0x6054, 0x3180, 0x6055, 0x6055, 0x0D96,
+ 0x6056, 0x6058, 0x3182, 0x6059, 0x6059, 0x1A12, 0x605A, 0x605A, 0x1A0F,
+ 0x605B, 0x605C, 0x3185, 0x605D, 0x605D, 0x1A0E, 0x605E, 0x6061, 0x3187,
+ 0x6062, 0x6062, 0x07EB, 0x6063, 0x6063, 0x1A13, 0x6064, 0x6064, 0x0FBF,
+ 0x6065, 0x6066, 0x318B, 0x6067, 0x6067, 0x1A10, 0x6068, 0x6068, 0x0795,
+ 0x6069, 0x6069, 0x0636, 0x606A, 0x606A, 0x1661, 0x606B, 0x606B, 0x05F1,
+ 0x606C, 0x606C, 0x0E44, 0x606D, 0x606D, 0x0700, 0x606E, 0x606E, 0x318D,
+ 0x606F, 0x606F, 0x0F0F, 0x6070, 0x6070, 0x0C1E, 0x6071, 0x6072, 0x318E,
+ 0x6073, 0x6073, 0x095F, 0x6074, 0x6075, 0x3190, 0x6076, 0x6076, 0x0630,
+ 0x6077, 0x6077, 0x3192, 0x6078, 0x6079, 0x165C, 0x607A, 0x607A, 0x165F,
+ 0x607B, 0x607B, 0x165E, 0x607C, 0x607C, 0x0B38, 0x607D, 0x607D, 0x1662,
+ 0x607E, 0x607E, 0x3193, 0x607F, 0x607F, 0x10A6, 0x6080, 0x6082, 0x3194,
+ 0x6083, 0x6083, 0x1667, 0x6084, 0x6084, 0x0C41, 0x6085, 0x6088, 0x3197,
+ 0x6089, 0x6089, 0x0F11, 0x608A, 0x608B, 0x319B, 0x608C, 0x608C, 0x1669,
+ 0x608D, 0x608D, 0x076E, 0x608E, 0x6091, 0x319D, 0x6092, 0x6092, 0x1668,
+ 0x6093, 0x6093, 0x31A1, 0x6094, 0x6094, 0x07EF, 0x6095, 0x6095, 0x31A2,
+ 0x6096, 0x6096, 0x1663, 0x6097, 0x6099, 0x31A3, 0x609A, 0x609A, 0x1664,
+ 0x609B, 0x609B, 0x166A, 0x609C, 0x609C, 0x31A6, 0x609D, 0x609D, 0x1666,
+ 0x609E, 0x609E, 0x31A7, 0x609F, 0x609F, 0x0F01, 0x60A0, 0x60A0, 0x10AB,
+ 0x60A1, 0x60A2, 0x31A8, 0x60A3, 0x60A3, 0x07D1, 0x60A4, 0x60A5, 0x31AA,
+ 0x60A6, 0x60A6, 0x1106, 0x60A7, 0x60A7, 0x31AC, 0x60A8, 0x60A8, 0x0B5D,
+ 0x60A9, 0x60AA, 0x31AD, 0x60AB, 0x60AB, 0x1A14, 0x60AC, 0x60AC, 0x0FC7,
+ 0x60AD, 0x60AD, 0x1665, 0x60AE, 0x60AE, 0x31AF, 0x60AF, 0x60AF, 0x0AFA,
+ 0x60B0, 0x60B0, 0x31B0, 0x60B1, 0x60B1, 0x166D, 0x60B2, 0x60B2, 0x0418,
+ 0x60B3, 0x60B3, 0x31B1, 0x60B4, 0x60B4, 0x1672, 0x60B5, 0x60B5, 0x23B4,
+ 0x60B6, 0x60B6, 0x207E, 0x60B7, 0x60B7, 0x31B2, 0x60B8, 0x60B8, 0x0835,
+ 0x60B9, 0x60BA, 0x31B3, 0x60BB, 0x60BB, 0x166C, 0x60BC, 0x60BC, 0x05A0,
+ 0x60BD, 0x60C4, 0x31B5, 0x60C5, 0x60C5, 0x0C66, 0x60C6, 0x60C6, 0x1670,
+ 0x60C7, 0x60C9, 0x31BD, 0x60CA, 0x60CA, 0x08D9, 0x60CB, 0x60CB, 0x0EA0,
+ 0x60CC, 0x60D0, 0x31C0, 0x60D1, 0x60D1, 0x0808, 0x60D2, 0x60D4, 0x31C5,
+ 0x60D5, 0x60D5, 0x0E3B, 0x60D6, 0x60D7, 0x31C8, 0x60D8, 0x60D8, 0x166F,
+ 0x60D9, 0x60D9, 0x31CA, 0x60DA, 0x60DA, 0x1671, 0x60DB, 0x60DB, 0x31CB,
+ 0x60DC, 0x60DC, 0x0F14, 0x60DD, 0x60DD, 0x166E, 0x60DE, 0x60DE, 0x31CC,
+ 0x60DF, 0x60DF, 0x0EB8, 0x60E0, 0x60E0, 0x07F2, 0x60E1, 0x60E1, 0x1EE3,
+ 0x60E2, 0x60E5, 0x31CD, 0x60E6, 0x60E6, 0x05CC, 0x60E7, 0x60E7, 0x0914,
+ 0x60E8, 0x60E8, 0x0499, 0x60E9, 0x60E9, 0x04F2, 0x60EA, 0x60EA, 0x31D1,
+ 0x60EB, 0x60EB, 0x0422, 0x60EC, 0x60EC, 0x166B, 0x60ED, 0x60ED, 0x0498,
+ 0x60EE, 0x60EE, 0x058D, 0x60EF, 0x60EF, 0x0738, 0x60F0, 0x60F0, 0x0627,
+ 0x60F1, 0x60F1, 0x2095, 0x60F2, 0x60F2, 0x23BB, 0x60F3, 0x60F3, 0x0F58,
+ 0x60F4, 0x60F4, 0x1677, 0x60F5, 0x60F5, 0x31D2, 0x60F6, 0x60F6, 0x07E1,
+ 0x60F7, 0x60F8, 0x31D3, 0x60F9, 0x60F9, 0x0CA2, 0x60FA, 0x60FA, 0x0F95,
+ 0x60FB, 0x60FB, 0x23B9, 0x60FC, 0x60FF, 0x31D5, 0x6100, 0x6100, 0x1678,
+ 0x6101, 0x6101, 0x0513, 0x6102, 0x6105, 0x31D9, 0x6106, 0x6106, 0x1A15,
+ 0x6107, 0x6107, 0x31DD, 0x6108, 0x6108, 0x10DF, 0x6109, 0x6109, 0x10C9,
+ 0x610A, 0x610C, 0x31DE, 0x610D, 0x610D, 0x1A16, 0x610E, 0x610E, 0x1679,
+ 0x610F, 0x610F, 0x1069, 0x6110, 0x6114, 0x31E1, 0x6115, 0x6115, 0x1675,
+ 0x6116, 0x6119, 0x31E6, 0x611A, 0x611A, 0x10C3, 0x611B, 0x611B, 0x1E28,
+ 0x611C, 0x611C, 0x23BD, 0x611D, 0x611E, 0x31EA, 0x611F, 0x611F, 0x06CB,
+ 0x6120, 0x6120, 0x1673, 0x6121, 0x6122, 0x31EC, 0x6123, 0x6123, 0x1676,
+ 0x6124, 0x6124, 0x067C, 0x6125, 0x6125, 0x31EE, 0x6126, 0x6126, 0x1674,
+ 0x6127, 0x6127, 0x098D, 0x6128, 0x612A, 0x31EF, 0x612B, 0x612B, 0x167A,
+ 0x612C, 0x6133, 0x31F2, 0x6134, 0x6134, 0x23B5, 0x6135, 0x6136, 0x31FA,
+ 0x6137, 0x6137, 0x23BA, 0x6138, 0x613D, 0x31FC, 0x613E, 0x613E, 0x23B3,
+ 0x613F, 0x613F, 0x10FB, 0x6140, 0x6147, 0x3202, 0x6148, 0x6148, 0x054B,
+ 0x6149, 0x6149, 0x320A, 0x614A, 0x614A, 0x167B, 0x614B, 0x614B, 0x2162,
+ 0x614C, 0x614C, 0x07DA, 0x614D, 0x614D, 0x320B, 0x614E, 0x614E, 0x0D30,
+ 0x614F, 0x6150, 0x320C, 0x6151, 0x6151, 0x0D1E, 0x6152, 0x6154, 0x320E,
+ 0x6155, 0x6155, 0x0B20, 0x6156, 0x6157, 0x3211, 0x6158, 0x6158, 0x1E5E,
+ 0x6159, 0x6159, 0x3213, 0x615A, 0x615A, 0x1E5D, 0x615B, 0x615C, 0x3214,
+ 0x615D, 0x615D, 0x1A17, 0x615E, 0x615E, 0x3216, 0x615F, 0x615F, 0x23B7,
+ 0x6160, 0x6161, 0x3217, 0x6162, 0x6162, 0x0AA4, 0x6163, 0x6163, 0x1F2F,
+ 0x6164, 0x6164, 0x24DF, 0x6165, 0x6166, 0x3219, 0x6167, 0x6167, 0x07F0,
+ 0x6168, 0x6168, 0x093B, 0x6169, 0x6169, 0x321B, 0x616A, 0x616A, 0x23B2,
+ 0x616B, 0x616B, 0x214E, 0x616C, 0x616D, 0x321C, 0x616E, 0x616E, 0x2052,
+ 0x616F, 0x616F, 0x321E, 0x6170, 0x6170, 0x0ECE, 0x6171, 0x6172, 0x321F,
+ 0x6173, 0x6173, 0x23BC, 0x6174, 0x6174, 0x3221, 0x6175, 0x6175, 0x167C,
+ 0x6176, 0x6176, 0x20EB, 0x6177, 0x6177, 0x0943, 0x6178, 0x6181, 0x3222,
+ 0x6182, 0x6182, 0x2232, 0x6183, 0x6189, 0x322C, 0x618A, 0x618A, 0x1E3F,
+ 0x618B, 0x618B, 0x0458, 0x618C, 0x618D, 0x3233, 0x618E, 0x618E, 0x113A,
+ 0x618F, 0x618F, 0x3235, 0x6190, 0x6190, 0x201B, 0x6191, 0x6191, 0x20BC,
+ 0x6192, 0x6192, 0x23BE, 0x6193, 0x6193, 0x3236, 0x6194, 0x6194, 0x167E,
+ 0x6195, 0x6199, 0x3237, 0x619A, 0x619A, 0x1EAE, 0x619B, 0x619C, 0x323C,
+ 0x619D, 0x619D, 0x1A19, 0x619E, 0x61A3, 0x323E, 0x61A4, 0x61A4, 0x1EFB,
+ 0x61A5, 0x61A6, 0x3244, 0x61A7, 0x61A7, 0x167F, 0x61A8, 0x61A8, 0x0760,
+ 0x61A9, 0x61A9, 0x1A18, 0x61AA, 0x61AA, 0x3246, 0x61AB, 0x61AB, 0x2089,
+ 0x61AC, 0x61AC, 0x167D, 0x61AD, 0x61AD, 0x3247, 0x61AE, 0x61AE, 0x23B1,
+ 0x61AF, 0x61B1, 0x3248, 0x61B2, 0x61B2, 0x21C4, 0x61B3, 0x61B5, 0x324B,
+ 0x61B6, 0x61B6, 0x2214, 0x61B7, 0x61B7, 0x1680, 0x61B8, 0x61BD, 0x324E,
+ 0x61BE, 0x61BE, 0x076D, 0x61BF, 0x61C1, 0x3254, 0x61C2, 0x61C2, 0x05ED,
+ 0x61C3, 0x61C6, 0x3257, 0x61C7, 0x61C7, 0x1FDE, 0x61C8, 0x61C8, 0x0F83,
+ 0x61C9, 0x61C9, 0x2223, 0x61CA, 0x61CA, 0x03CE, 0x61CB, 0x61CB, 0x1A1A,
+ 0x61CC, 0x61CC, 0x23B6, 0x61CD, 0x61D0, 0x325B, 0x61D1, 0x61D1, 0x1A1B,
+ 0x61D2, 0x61D2, 0x09AC, 0x61D3, 0x61D3, 0x325F, 0x61D4, 0x61D4, 0x1681,
+ 0x61D5, 0x61DD, 0x3260, 0x61DE, 0x61DE, 0x268C, 0x61DF, 0x61DF, 0x24DE,
+ 0x61E0, 0x61E2, 0x3269, 0x61E3, 0x61E3, 0x24E0, 0x61E4, 0x61E5, 0x326C,
+ 0x61E6, 0x61E6, 0x0B74, 0x61E7, 0x61E7, 0x326E, 0x61E8, 0x61E8, 0x23B8,
+ 0x61E9, 0x61F1, 0x326F, 0x61F2, 0x61F2, 0x1E81, 0x61F3, 0x61F4, 0x3278,
+ 0x61F5, 0x61F5, 0x1682, 0x61F6, 0x61F6, 0x1FFE, 0x61F7, 0x61F7, 0x1F51,
+ 0x61F8, 0x61F8, 0x21E1, 0x61F9, 0x61F9, 0x327A, 0x61FA, 0x61FA, 0x23B0,
+ 0x61FB, 0x61FB, 0x327B, 0x61FC, 0x61FC, 0x1FCE, 0x61FD, 0x61FD, 0x327C,
+ 0x61FE, 0x61FE, 0x211E, 0x61FF, 0x61FF, 0x13E0, 0x6200, 0x6200, 0x2021,
+ 0x6201, 0x6205, 0x327D, 0x6206, 0x6206, 0x1A1C, 0x6207, 0x6207, 0x24E1,
+ 0x6208, 0x6208, 0x06E5, 0x6209, 0x6209, 0x3282, 0x620A, 0x620A, 0x0EFB,
+ 0x620B, 0x620B, 0x18F9, 0x620C, 0x620C, 0x0FB2, 0x620D, 0x620D, 0x0D90,
+ 0x620E, 0x620E, 0x0CB1, 0x620F, 0x620F, 0x0F24, 0x6210, 0x6210, 0x04EE,
+ 0x6211, 0x6211, 0x0EE1, 0x6212, 0x6212, 0x08B5, 0x6213, 0x6213, 0x3283,
+ 0x6214, 0x6214, 0x24A3, 0x6215, 0x6215, 0x169E, 0x6216, 0x6216, 0x0807,
+ 0x6217, 0x6217, 0x18FA, 0x6218, 0x6218, 0x115E, 0x6219, 0x6219, 0x3284,
+ 0x621A, 0x621A, 0x0BFC, 0x621B, 0x621B, 0x18FB, 0x621C, 0x621E, 0x3285,
+ 0x621F, 0x621F, 0x18FC, 0x6220, 0x6220, 0x3288, 0x6221, 0x6221, 0x18FE,
+ 0x6222, 0x6222, 0x18FD, 0x6223, 0x6223, 0x3289, 0x6224, 0x6224, 0x1900,
+ 0x6225, 0x6225, 0x18FF, 0x6226, 0x6226, 0x328A, 0x6227, 0x6227, 0x24A4,
+ 0x6228, 0x6229, 0x328B, 0x622A, 0x622A, 0x08A9, 0x622B, 0x622B, 0x328D,
+ 0x622C, 0x622C, 0x1901, 0x622D, 0x622D, 0x328E, 0x622E, 0x622E, 0x0A65,
+ 0x622F, 0x622F, 0x328F, 0x6230, 0x6230, 0x2273, 0x6231, 0x6231, 0x3290,
+ 0x6232, 0x6232, 0x21B0, 0x6233, 0x6233, 0x0544, 0x6234, 0x6234, 0x057A,
+ 0x6235, 0x6236, 0x3291, 0x6237, 0x6237, 0x07BC, 0x6238, 0x623C, 0x3293,
+ 0x623D, 0x623D, 0x19F4, 0x623E, 0x623E, 0x19F3, 0x623F, 0x623F, 0x065C,
+ 0x6240, 0x6240, 0x0DEE, 0x6241, 0x6241, 0x044B, 0x6242, 0x6242, 0x3298,
+ 0x6243, 0x6243, 0x19F5, 0x6244, 0x6246, 0x3299, 0x6247, 0x6247, 0x0D01,
+ 0x6248, 0x6249, 0x19F6, 0x624A, 0x624A, 0x329C, 0x624B, 0x624B, 0x0D6D,
+ 0x624C, 0x624C, 0x14BA, 0x624D, 0x624D, 0x048C, 0x624E, 0x624E, 0x113D,
+ 0x624F, 0x6250, 0x329D, 0x6251, 0x6251, 0x0BEA, 0x6252, 0x6252, 0x03D2,
+ 0x6253, 0x6253, 0x0575, 0x6254, 0x6254, 0x0CAE, 0x6255, 0x6257, 0x329F,
+ 0x6258, 0x6258, 0x0E81, 0x6259, 0x625A, 0x32A2, 0x625B, 0x625B, 0x0945,
+ 0x625C, 0x6262, 0x32A4, 0x6263, 0x6263, 0x0968, 0x6264, 0x6265, 0x32AB,
+ 0x6266, 0x6266, 0x0C21, 0x6267, 0x6267, 0x11B3, 0x6268, 0x6268, 0x32AD,
+ 0x6269, 0x6269, 0x0994, 0x626A, 0x626A, 0x14BB, 0x626B, 0x626B, 0x0CE1,
+ 0x626C, 0x626C, 0x1018, 0x626D, 0x626D, 0x0B65, 0x626E, 0x626E, 0x03F2,
+ 0x626F, 0x626F, 0x04DB, 0x6270, 0x6270, 0x0CA0, 0x6271, 0x6272, 0x32AE,
+ 0x6273, 0x6273, 0x03ED, 0x6274, 0x6275, 0x32B0, 0x6276, 0x6276, 0x0693,
+ 0x6277, 0x6278, 0x32B2, 0x6279, 0x6279, 0x0BBB, 0x627A, 0x627B, 0x32B4,
+ 0x627C, 0x627C, 0x0632, 0x627D, 0x627D, 0x32B6, 0x627E, 0x627E, 0x1173,
+ 0x627F, 0x627F, 0x04F5, 0x6280, 0x6280, 0x082F, 0x6281, 0x6283, 0x32B7,
+ 0x6284, 0x6284, 0x04D2, 0x6285, 0x6288, 0x32BA, 0x6289, 0x6289, 0x0920,
+ 0x628A, 0x628A, 0x03DC, 0x628B, 0x6290, 0x32BE, 0x6291, 0x6291, 0x105D,
+ 0x6292, 0x6292, 0x0D7A, 0x6293, 0x6293, 0x1202, 0x6294, 0x6294, 0x32C4,
+ 0x6295, 0x6295, 0x0E67, 0x6296, 0x6296, 0x05F5, 0x6297, 0x6297, 0x0946,
+ 0x6298, 0x6298, 0x117C, 0x6299, 0x6299, 0x32C5, 0x629A, 0x629A, 0x06A2,
+ 0x629B, 0x629B, 0x0B98, 0x629C, 0x629E, 0x32C6, 0x629F, 0x629F, 0x14BC,
+ 0x62A0, 0x62A0, 0x0966, 0x62A1, 0x62A1, 0x0A7C, 0x62A2, 0x62A2, 0x0C3D,
+ 0x62A3, 0x62A3, 0x32C9, 0x62A4, 0x62A4, 0x07B9, 0x62A5, 0x62A5, 0x0411,
+ 0x62A6, 0x62A7, 0x32CA, 0x62A8, 0x62A8, 0x0BAB, 0x62A9, 0x62AA, 0x32CC,
+ 0x62AB, 0x62AB, 0x0BBC, 0x62AC, 0x62AC, 0x0DFA, 0x62AD, 0x62B0, 0x32CE,
+ 0x62B1, 0x62B1, 0x0410, 0x62B2, 0x62B4, 0x32D2, 0x62B5, 0x62B5, 0x05B7,
+ 0x62B6, 0x62B8, 0x32D5, 0x62B9, 0x62B9, 0x0B0B, 0x62BA, 0x62BA, 0x32D8,
+ 0x62BB, 0x62BB, 0x14BD, 0x62BC, 0x62BC, 0x0FE3, 0x62BD, 0x62BD, 0x050E,
+ 0x62BE, 0x62BE, 0x32D9, 0x62BF, 0x62BF, 0x0AF7, 0x62C0, 0x62C1, 0x32DA,
+ 0x62C2, 0x62C2, 0x0694, 0x62C3, 0x62C3, 0x32DC, 0x62C4, 0x62C4, 0x11F3,
+ 0x62C5, 0x62C5, 0x0584, 0x62C6, 0x62C6, 0x04B7, 0x62C7, 0x62C7, 0x0B17,
+ 0x62C8, 0x62C8, 0x0B4C, 0x62C9, 0x62C9, 0x0998, 0x62CA, 0x62CA, 0x14BE,
+ 0x62CB, 0x62CB, 0x32DD, 0x62CC, 0x62CC, 0x03F3, 0x62CD, 0x62CD, 0x0B85,
+ 0x62CE, 0x62CE, 0x0A29, 0x62CF, 0x62CF, 0x32DE, 0x62D0, 0x62D0, 0x072E,
+ 0x62D1, 0x62D1, 0x32DF, 0x62D2, 0x62D2, 0x090B, 0x62D3, 0x62D3, 0x0E89,
+ 0x62D4, 0x62D4, 0x03D9, 0x62D5, 0x62D5, 0x32E0, 0x62D6, 0x62D6, 0x0E80,
+ 0x62D7, 0x62D7, 0x14C0, 0x62D8, 0x62D8, 0x08FF, 0x62D9, 0x62D9, 0x121B,
+ 0x62DA, 0x62DA, 0x14BF, 0x62DB, 0x62DB, 0x1171, 0x62DC, 0x62DC, 0x03E8,
+ 0x62DD, 0x62DE, 0x32E1, 0x62DF, 0x62DF, 0x0B45, 0x62E0, 0x62E1, 0x32E3,
+ 0x62E2, 0x62E2, 0x0A4A, 0x62E3, 0x62E3, 0x0863, 0x62E4, 0x62E4, 0x32E5,
+ 0x62E5, 0x62E5, 0x109A, 0x62E6, 0x62E6, 0x09A4, 0x62E7, 0x62E7, 0x0B62,
+ 0x62E8, 0x62E8, 0x046D, 0x62E9, 0x62E9, 0x1134, 0x62EA, 0x62EB, 0x32E6,
+ 0x62EC, 0x62EC, 0x0993, 0x62ED, 0x62ED, 0x0D5A, 0x62EE, 0x62EE, 0x14C1,
+ 0x62EF, 0x62EF, 0x119D, 0x62F0, 0x62F0, 0x32E8, 0x62F1, 0x62F1, 0x0709,
+ 0x62F2, 0x62F2, 0x32E9, 0x62F3, 0x62F3, 0x0C88, 0x62F4, 0x62F4, 0x0D9E,
+ 0x62F5, 0x62F5, 0x32EA, 0x62F6, 0x62F6, 0x14C3, 0x62F7, 0x62F7, 0x094A,
+ 0x62F8, 0x62FB, 0x32EB, 0x62FC, 0x62FC, 0x0BD3, 0x62FD, 0x62FD, 0x1204,
+ 0x62FE, 0x62FE, 0x0D47, 0x62FF, 0x62FF, 0x0B26, 0x6300, 0x6300, 0x32EF,
+ 0x6301, 0x6301, 0x04FB, 0x6302, 0x6302, 0x072B, 0x6303, 0x6306, 0x32F0,
+ 0x6307, 0x6307, 0x11B7, 0x6308, 0x6308, 0x194E, 0x6309, 0x6309, 0x03BF,
+ 0x630A, 0x630D, 0x32F4, 0x630E, 0x630E, 0x0973, 0x630F, 0x6310, 0x32F8,
+ 0x6311, 0x6311, 0x0E47, 0x6312, 0x6315, 0x32FA, 0x6316, 0x6316, 0x0E8B,
+ 0x6317, 0x6319, 0x32FE, 0x631A, 0x631A, 0x11BE, 0x631B, 0x631B, 0x0A75,
+ 0x631C, 0x631C, 0x3301, 0x631D, 0x631D, 0x0EDD, 0x631E, 0x631E, 0x0DF5,
+ 0x631F, 0x631F, 0x0F79, 0x6320, 0x6320, 0x0B36, 0x6321, 0x6321, 0x0593,
+ 0x6322, 0x6322, 0x14C2, 0x6323, 0x6323, 0x1196, 0x6324, 0x6324, 0x082A,
+ 0x6325, 0x6325, 0x07E8, 0x6326, 0x6327, 0x3302, 0x6328, 0x6328, 0x03AF,
+ 0x6329, 0x6329, 0x3304, 0x632A, 0x632A, 0x0B73, 0x632B, 0x632B, 0x056F,
+ 0x632C, 0x632E, 0x3305, 0x632F, 0x632F, 0x1192, 0x6330, 0x6331, 0x3308,
+ 0x6332, 0x6332, 0x194F, 0x6333, 0x6338, 0x330A, 0x6339, 0x6339, 0x14C4,
+ 0x633A, 0x633A, 0x0E57, 0x633B, 0x633C, 0x3310, 0x633D, 0x633D, 0x0E9D,
+ 0x633E, 0x633E, 0x21D1, 0x633F, 0x6341, 0x3312, 0x6342, 0x6342, 0x0EF5,
+ 0x6343, 0x6343, 0x14C6, 0x6344, 0x6344, 0x3315, 0x6345, 0x6345, 0x0E62,
+ 0x6346, 0x6346, 0x0991, 0x6347, 0x6348, 0x3316, 0x6349, 0x6349, 0x121A,
+ 0x634A, 0x634A, 0x3318, 0x634B, 0x634B, 0x14C5, 0x634C, 0x634C, 0x03D1,
+ 0x634D, 0x634D, 0x076B, 0x634E, 0x634E, 0x0D0C, 0x634F, 0x634F, 0x0B56,
+ 0x6350, 0x6350, 0x0917, 0x6351, 0x6354, 0x3319, 0x6355, 0x6355, 0x047D,
+ 0x6356, 0x635D, 0x331D, 0x635E, 0x635E, 0x09B7, 0x635F, 0x635F, 0x0DE5,
+ 0x6360, 0x6360, 0x3325, 0x6361, 0x6361, 0x0864, 0x6362, 0x6362, 0x07D0,
+ 0x6363, 0x6363, 0x0598, 0x6364, 0x6366, 0x3326, 0x6367, 0x6367, 0x0BB6,
+ 0x6368, 0x6368, 0x211C, 0x6369, 0x6369, 0x14D0, 0x636A, 0x636A, 0x3329,
+ 0x636B, 0x636B, 0x235D, 0x636C, 0x636C, 0x332A, 0x636D, 0x636D, 0x14CD,
+ 0x636E, 0x636E, 0x090C, 0x636F, 0x6370, 0x332B, 0x6371, 0x6371, 0x14C9,
+ 0x6372, 0x6372, 0x2682, 0x6373, 0x6375, 0x332D, 0x6376, 0x6376, 0x053A,
+ 0x6377, 0x6377, 0x08AE, 0x6378, 0x6379, 0x3330, 0x637A, 0x637A, 0x14CA,
+ 0x637B, 0x637B, 0x0B50, 0x637C, 0x637F, 0x3332, 0x6380, 0x6380, 0x0F33,
+ 0x6381, 0x6381, 0x3336, 0x6382, 0x6382, 0x05C1, 0x6383, 0x6383, 0x210D,
+ 0x6384, 0x6384, 0x205A, 0x6385, 0x6386, 0x3337, 0x6387, 0x6387, 0x061D,
+ 0x6388, 0x6388, 0x0D71, 0x6389, 0x6389, 0x05D5, 0x638A, 0x638A, 0x14CF,
+ 0x638B, 0x638B, 0x3339, 0x638C, 0x638C, 0x1167, 0x638D, 0x638D, 0x333A,
+ 0x638E, 0x638E, 0x14CB, 0x638F, 0x638F, 0x0E20, 0x6390, 0x6390, 0x0C1D,
+ 0x6391, 0x6391, 0x333B, 0x6392, 0x6392, 0x0B86, 0x6393, 0x6395, 0x333C,
+ 0x6396, 0x6396, 0x103B, 0x6397, 0x6397, 0x333F, 0x6398, 0x6398, 0x0921,
+ 0x6399, 0x639F, 0x3340, 0x63A0, 0x63A0, 0x0A7A, 0x63A1, 0x63A1, 0x3347,
+ 0x63A2, 0x63A2, 0x0E10, 0x63A3, 0x63A3, 0x04DD, 0x63A4, 0x63A4, 0x3348,
+ 0x63A5, 0x63A5, 0x08A4, 0x63A6, 0x63A6, 0x3349, 0x63A7, 0x63A7, 0x0965,
+ 0x63A8, 0x63A8, 0x0E77, 0x63A9, 0x63A9, 0x1003, 0x63AA, 0x63AA, 0x056E,
+ 0x63AB, 0x63AB, 0x334A, 0x63AC, 0x63AC, 0x14CE, 0x63AD, 0x63AD, 0x14C7,
+ 0x63AE, 0x63AE, 0x14D1, 0x63AF, 0x63AF, 0x334B, 0x63B0, 0x63B0, 0x1950,
+ 0x63B1, 0x63B2, 0x334C, 0x63B3, 0x63B3, 0x0A57, 0x63B4, 0x63B4, 0x14CC,
+ 0x63B5, 0x63B6, 0x334E, 0x63B7, 0x63B7, 0x11BF, 0x63B8, 0x63B8, 0x0588,
+ 0x63B9, 0x63B9, 0x3350, 0x63BA, 0x63BA, 0x04BB, 0x63BB, 0x63BB, 0x3351,
+ 0x63BC, 0x63BC, 0x14D2, 0x63BD, 0x63BD, 0x3352, 0x63BE, 0x63BE, 0x14DC,
+ 0x63BF, 0x63BF, 0x3353, 0x63C0, 0x63C0, 0x1F8D, 0x63C1, 0x63C3, 0x3354,
+ 0x63C4, 0x63C4, 0x14D7, 0x63C5, 0x63C5, 0x3357, 0x63C6, 0x63C6, 0x14DB,
+ 0x63C7, 0x63C8, 0x3358, 0x63C9, 0x63C9, 0x0CBB, 0x63CA, 0x63CC, 0x335A,
+ 0x63CD, 0x63CD, 0x123E, 0x63CE, 0x63CE, 0x14D9, 0x63CF, 0x63CF, 0x0AED,
+ 0x63D0, 0x63D0, 0x0E34, 0x63D1, 0x63D1, 0x335D, 0x63D2, 0x63D2, 0x04AC,
+ 0x63D3, 0x63D5, 0x335E, 0x63D6, 0x63D6, 0x1045, 0x63D7, 0x63D9, 0x3361,
+ 0x63DA, 0x63DA, 0x21FF, 0x63DB, 0x63DD, 0x3364, 0x63DE, 0x63DE, 0x14D8,
+ 0x63DF, 0x63DF, 0x3367, 0x63E0, 0x63E0, 0x14D5, 0x63E1, 0x63E1, 0x0EE4,
+ 0x63E2, 0x63E2, 0x3368, 0x63E3, 0x63E3, 0x052A, 0x63E4, 0x63E8, 0x3369,
+ 0x63E9, 0x63E9, 0x0938, 0x63EA, 0x63EA, 0x08ED, 0x63EB, 0x63EC, 0x336E,
+ 0x63ED, 0x63ED, 0x08A3, 0x63EE, 0x63EE, 0x1F58, 0x63EF, 0x63F1, 0x3370,
+ 0x63F2, 0x63F2, 0x14D3, 0x63F3, 0x63F3, 0x3373, 0x63F4, 0x63F4, 0x10F1,
+ 0x63F5, 0x63F5, 0x3374, 0x63F6, 0x63F6, 0x14C8, 0x63F7, 0x63F7, 0x3375,
+ 0x63F8, 0x63F8, 0x14D4, 0x63F9, 0x63FC, 0x3376, 0x63FD, 0x63FD, 0x09AA,
+ 0x63FE, 0x63FE, 0x337A, 0x63FF, 0x63FF, 0x14D6, 0x6400, 0x6400, 0x04BA,
+ 0x6401, 0x6401, 0x06E4, 0x6402, 0x6402, 0x0A4E, 0x6403, 0x6404, 0x337B,
+ 0x6405, 0x6405, 0x0892, 0x6406, 0x640A, 0x337D, 0x640B, 0x640B, 0x14DF,
+ 0x640C, 0x640C, 0x14E2, 0x640D, 0x640D, 0x215B, 0x640E, 0x640E, 0x3382,
+ 0x640F, 0x640F, 0x0472, 0x6410, 0x6410, 0x0527, 0x6411, 0x6412, 0x3383,
+ 0x6413, 0x6413, 0x056D, 0x6414, 0x6414, 0x0CDF, 0x6415, 0x6416, 0x3385,
+ 0x6417, 0x6417, 0x1EB6, 0x6418, 0x641A, 0x3387, 0x641B, 0x641B, 0x14E0,
+ 0x641C, 0x641C, 0x0DC6, 0x641D, 0x641D, 0x338A, 0x641E, 0x641E, 0x06DE,
+ 0x641F, 0x641F, 0x338B, 0x6420, 0x6420, 0x14E1, 0x6421, 0x6421, 0x14E4,
+ 0x6422, 0x6425, 0x338C, 0x6426, 0x6426, 0x14E3, 0x6427, 0x6429, 0x3390,
+ 0x642A, 0x642A, 0x0E15, 0x642B, 0x642B, 0x3393, 0x642C, 0x642C, 0x03EC,
+ 0x642D, 0x642D, 0x0571, 0x642E, 0x6433, 0x3394, 0x6434, 0x6434, 0x1736,
+ 0x6435, 0x6435, 0x339A, 0x6436, 0x6436, 0x20DB, 0x6437, 0x6439, 0x339B,
+ 0x643A, 0x643A, 0x0F7A, 0x643B, 0x643C, 0x339E, 0x643D, 0x643D, 0x04B2,
+ 0x643E, 0x643E, 0x33A0, 0x643F, 0x643F, 0x1951, 0x6440, 0x6440, 0x33A1,
+ 0x6441, 0x6441, 0x14DE, 0x6442, 0x6443, 0x33A2, 0x6444, 0x6444, 0x0D1C,
+ 0x6445, 0x6445, 0x14DD, 0x6446, 0x6446, 0x03E5, 0x6447, 0x6447, 0x1028,
+ 0x6448, 0x6448, 0x0460, 0x6449, 0x6449, 0x33A4, 0x644A, 0x644A, 0x0E02,
+ 0x644B, 0x6450, 0x33A5, 0x6451, 0x6451, 0x2360, 0x6452, 0x6452, 0x14DA,
+ 0x6453, 0x6453, 0x33AB, 0x6454, 0x6454, 0x0D99, 0x6455, 0x6457, 0x33AC,
+ 0x6458, 0x6458, 0x114B, 0x6459, 0x645B, 0x33AF, 0x645C, 0x645C, 0x2361,
+ 0x645D, 0x645D, 0x33B2, 0x645E, 0x645E, 0x14E5, 0x645F, 0x645F, 0x2040,
+ 0x6460, 0x6466, 0x33B3, 0x6467, 0x6467, 0x0560, 0x6468, 0x6468, 0x33BA,
+ 0x6469, 0x6469, 0x0B09, 0x646A, 0x646C, 0x33BB, 0x646D, 0x646D, 0x14E7,
+ 0x646E, 0x646E, 0x33BE, 0x646F, 0x646F, 0x228E, 0x6470, 0x6472, 0x33BF,
+ 0x6473, 0x6473, 0x1FDF, 0x6474, 0x6475, 0x33C2, 0x6476, 0x6476, 0x235E,
+ 0x6477, 0x6477, 0x33C4, 0x6478, 0x6479, 0x0B03, 0x647A, 0x647A, 0x14E9,
+ 0x647B, 0x647B, 0x1E6A, 0x647C, 0x6481, 0x33C5, 0x6482, 0x6482, 0x0A15,
+ 0x6483, 0x6483, 0x33CB, 0x6484, 0x6484, 0x14E6, 0x6485, 0x6485, 0x091E,
+ 0x6486, 0x6486, 0x33CC, 0x6487, 0x6487, 0x0BD1, 0x6488, 0x6488, 0x2002,
+ 0x6489, 0x6490, 0x33CD, 0x6491, 0x6491, 0x04EA, 0x6492, 0x6492, 0x0CD1,
+ 0x6493, 0x6493, 0x2093, 0x6494, 0x6494, 0x33D5, 0x6495, 0x6495, 0x0DAF,
+ 0x6496, 0x6496, 0x14E8, 0x6497, 0x6498, 0x33D6, 0x6499, 0x6499, 0x14EC,
+ 0x649A, 0x649D, 0x33D8, 0x649E, 0x649E, 0x120F, 0x649F, 0x649F, 0x235F,
+ 0x64A0, 0x64A2, 0x33DC, 0x64A3, 0x64A3, 0x1EAC, 0x64A4, 0x64A4, 0x04DC,
+ 0x64A5, 0x64A5, 0x1E54, 0x64A6, 0x64A8, 0x33DF, 0x64A9, 0x64A9, 0x0A0C,
+ 0x64AA, 0x64AA, 0x33E2, 0x64AB, 0x64AB, 0x1F08, 0x64AC, 0x64AC, 0x0C48,
+ 0x64AD, 0x64AD, 0x046C, 0x64AE, 0x64AE, 0x056C, 0x64AF, 0x64AF, 0x33E3,
+ 0x64B0, 0x64B0, 0x1208, 0x64B1, 0x64B1, 0x33E4, 0x64B2, 0x64B2, 0x20C0,
+ 0x64B3, 0x64B3, 0x2362, 0x64B4, 0x64B4, 0x33E5, 0x64B5, 0x64B5, 0x0B4F,
+ 0x64B6, 0x64B6, 0x33E6, 0x64B7, 0x64B8, 0x14EA, 0x64B9, 0x64B9, 0x33E7,
+ 0x64BA, 0x64BA, 0x14ED, 0x64BB, 0x64BB, 0x2160, 0x64BC, 0x64BC, 0x076A,
+ 0x64BD, 0x64BD, 0x33E8, 0x64BE, 0x64BE, 0x219D, 0x64BF, 0x64BF, 0x1F8E,
+ 0x64C0, 0x64C0, 0x14EE, 0x64C1, 0x64C1, 0x222D, 0x64C2, 0x64C2, 0x09C9,
+ 0x64C3, 0x64C3, 0x33E9, 0x64C4, 0x64C4, 0x2047, 0x64C5, 0x64C5, 0x0CFC,
+ 0x64C6, 0x64C6, 0x33EA, 0x64C7, 0x64C7, 0x2262, 0x64C8, 0x64C9, 0x33EB,
+ 0x64CA, 0x64CA, 0x1F67, 0x64CB, 0x64CB, 0x1EB2, 0x64CC, 0x64CC, 0x33ED,
+ 0x64CD, 0x64CD, 0x04A0, 0x64CE, 0x64CE, 0x0C63, 0x64CF, 0x64CF, 0x33EE,
+ 0x64D0, 0x64D0, 0x14EF, 0x64D1, 0x64D1, 0x33EF, 0x64D2, 0x64D2, 0x0C59,
+ 0x64D3, 0x64D3, 0x33F0, 0x64D4, 0x64D4, 0x1EA9, 0x64D5, 0x64D6, 0x33F1,
+ 0x64D7, 0x64D7, 0x14F0, 0x64D8, 0x64D8, 0x1952, 0x64D9, 0x64D9, 0x33F3,
+ 0x64DA, 0x64DA, 0x1FCC, 0x64DB, 0x64DD, 0x33F4, 0x64DE, 0x64DE, 0x0DC8,
+ 0x64DF, 0x64DF, 0x33F7, 0x64E0, 0x64E0, 0x1F72, 0x64E1, 0x64E1, 0x33F8,
+ 0x64E2, 0x64E2, 0x14F2, 0x64E3, 0x64E3, 0x33F9, 0x64E4, 0x64E4, 0x14F1,
+ 0x64E5, 0x64E5, 0x33FA, 0x64E6, 0x64E6, 0x0488, 0x64E7, 0x64EB, 0x33FB,
+ 0x64EC, 0x64EC, 0x2098, 0x64ED, 0x64EE, 0x3400, 0x64EF, 0x64EF, 0x1E52,
+ 0x64F0, 0x64F0, 0x20A4, 0x64F1, 0x64F1, 0x1F1C, 0x64F2, 0x64F2, 0x228F,
+ 0x64F3, 0x64F3, 0x3402, 0x64F4, 0x64F4, 0x1FED, 0x64F5, 0x64F6, 0x3403,
+ 0x64F7, 0x64F7, 0x2365, 0x64F8, 0x64F9, 0x3405, 0x64FA, 0x64FA, 0x1E2D,
+ 0x64FB, 0x64FB, 0x2152, 0x64FC, 0x64FC, 0x2366, 0x64FD, 0x64FD, 0x3407,
+ 0x64FE, 0x64FE, 0x20FA, 0x64FF, 0x64FF, 0x3408, 0x6500, 0x6500, 0x0B8B,
+ 0x6501, 0x6503, 0x3409, 0x6504, 0x6504, 0x2363, 0x6505, 0x6505, 0x340C,
+ 0x6506, 0x6506, 0x209A, 0x6507, 0x6508, 0x340D, 0x6509, 0x6509, 0x14F3,
+ 0x650A, 0x650E, 0x340F, 0x650F, 0x650F, 0x203C, 0x6510, 0x6511, 0x3414,
+ 0x6512, 0x6512, 0x111F, 0x6513, 0x6513, 0x3416, 0x6514, 0x6514, 0x1FF6,
+ 0x6515, 0x6515, 0x3417, 0x6516, 0x6516, 0x2364, 0x6517, 0x6517, 0x3418,
+ 0x6518, 0x6518, 0x0C9C, 0x6519, 0x6519, 0x1E69, 0x651A, 0x651A, 0x3419,
+ 0x651B, 0x651B, 0x2367, 0x651C, 0x651C, 0x341A, 0x651D, 0x651D, 0x211D,
+ 0x651E, 0x6521, 0x341B, 0x6522, 0x6522, 0x2259, 0x6523, 0x6523, 0x2056,
+ 0x6524, 0x6524, 0x2163, 0x6525, 0x6525, 0x14F4, 0x6526, 0x6529, 0x341F,
+ 0x652A, 0x652A, 0x1FA9, 0x652B, 0x652B, 0x091F, 0x652C, 0x652C, 0x1FFC,
+ 0x652D, 0x652D, 0x3423, 0x652E, 0x652E, 0x14F5, 0x652F, 0x652F, 0x11A6,
+ 0x6530, 0x6533, 0x3424, 0x6534, 0x6534, 0x1909, 0x6535, 0x6535, 0x1966,
+ 0x6536, 0x6536, 0x0D6C, 0x6537, 0x6537, 0x3428, 0x6538, 0x6538, 0x12B2,
+ 0x6539, 0x6539, 0x06BF, 0x653A, 0x653A, 0x3429, 0x653B, 0x653B, 0x06FE,
+ 0x653C, 0x653D, 0x342A, 0x653E, 0x653E, 0x0662, 0x653F, 0x653F, 0x119F,
+ 0x6540, 0x6544, 0x342C, 0x6545, 0x6545, 0x0723, 0x6546, 0x6547, 0x3431,
+ 0x6548, 0x6548, 0x0F72, 0x6549, 0x6549, 0x1CCB, 0x654A, 0x654B, 0x3433,
+ 0x654C, 0x654C, 0x05B1, 0x654D, 0x654E, 0x3435, 0x654F, 0x654F, 0x0AF9,
+ 0x6550, 0x6550, 0x3437, 0x6551, 0x6551, 0x08F7, 0x6552, 0x6554, 0x3438,
+ 0x6555, 0x6555, 0x1967, 0x6556, 0x6556, 0x03C8, 0x6557, 0x6557, 0x1E2E,
+ 0x6558, 0x6558, 0x343B, 0x6559, 0x6559, 0x089D, 0x655A, 0x655A, 0x343C,
+ 0x655B, 0x655B, 0x09FB, 0x655C, 0x655C, 0x343D, 0x655D, 0x655D, 0x043F,
+ 0x655E, 0x655E, 0x04CD, 0x655F, 0x6561, 0x343E, 0x6562, 0x6562, 0x06CD,
+ 0x6563, 0x6563, 0x0CDB, 0x6564, 0x6565, 0x3441, 0x6566, 0x6566, 0x0617,
+ 0x6567, 0x656A, 0x3443, 0x656B, 0x656B, 0x1968, 0x656C, 0x656C, 0x08E3,
+ 0x656D, 0x656F, 0x3447, 0x6570, 0x6570, 0x0D94, 0x6571, 0x6571, 0x344A,
+ 0x6572, 0x6572, 0x0C40, 0x6573, 0x6573, 0x344B, 0x6574, 0x6574, 0x119C,
+ 0x6575, 0x6575, 0x1EBC, 0x6576, 0x6576, 0x344C, 0x6577, 0x6577, 0x0690,
+ 0x6578, 0x6578, 0x2142, 0x6579, 0x6581, 0x344D, 0x6582, 0x6582, 0x201E,
+ 0x6583, 0x6583, 0x1E43, 0x6584, 0x6586, 0x3456, 0x6587, 0x6587, 0x0ED3,
+ 0x6588, 0x658A, 0x3459, 0x658B, 0x658B, 0x114C, 0x658C, 0x658C, 0x045C,
+ 0x658D, 0x658F, 0x345C, 0x6590, 0x6590, 0x19C1, 0x6591, 0x6591, 0x03EA,
+ 0x6592, 0x6592, 0x345F, 0x6593, 0x6593, 0x19C3, 0x6594, 0x6594, 0x3460,
+ 0x6595, 0x6595, 0x24D4, 0x6596, 0x6596, 0x3461, 0x6597, 0x6597, 0x05F6,
+ 0x6598, 0x6598, 0x3462, 0x6599, 0x6599, 0x0A18, 0x659A, 0x659A, 0x3463,
+ 0x659B, 0x659B, 0x1D56, 0x659C, 0x659C, 0x0F7C, 0x659D, 0x659E, 0x3464,
+ 0x659F, 0x659F, 0x1186, 0x65A0, 0x65A0, 0x3466, 0x65A1, 0x65A1, 0x0EE2,
+ 0x65A2, 0x65A3, 0x3467, 0x65A4, 0x65A4, 0x08C0, 0x65A5, 0x65A5, 0x0507,
+ 0x65A6, 0x65A6, 0x3469, 0x65A7, 0x65A7, 0x06A6, 0x65A8, 0x65A8, 0x346A,
+ 0x65A9, 0x65A9, 0x1157, 0x65AA, 0x65AA, 0x346B, 0x65AB, 0x65AB, 0x1A29,
+ 0x65AC, 0x65AC, 0x226F, 0x65AD, 0x65AD, 0x060E, 0x65AE, 0x65AE, 0x346C,
+ 0x65AF, 0x65AF, 0x0DAE, 0x65B0, 0x65B0, 0x0F8D, 0x65B1, 0x65B6, 0x346D,
+ 0x65B7, 0x65B7, 0x1ED7, 0x65B8, 0x65B8, 0x3473, 0x65B9, 0x65B9, 0x065A,
+ 0x65BA, 0x65BB, 0x3474, 0x65BC, 0x65BC, 0x19C4, 0x65BD, 0x65BD, 0x0D40,
+ 0x65BE, 0x65C0, 0x3476, 0x65C1, 0x65C1, 0x0B95, 0x65C2, 0x65C2, 0x3479,
+ 0x65C3, 0x65C3, 0x19C7, 0x65C4, 0x65C4, 0x19C6, 0x65C5, 0x65C5, 0x0A6A,
+ 0x65C6, 0x65C6, 0x19C5, 0x65C7, 0x65CA, 0x347A, 0x65CB, 0x65CB, 0x0FC8,
+ 0x65CC, 0x65CC, 0x19C8, 0x65CD, 0x65CD, 0x347E, 0x65CE, 0x65CE, 0x19C9,
+ 0x65CF, 0x65CF, 0x1242, 0x65D0, 0x65D1, 0x347F, 0x65D2, 0x65D2, 0x19CA,
+ 0x65D3, 0x65D5, 0x3481, 0x65D6, 0x65D6, 0x19CB, 0x65D7, 0x65D7, 0x0C0B,
+ 0x65D8, 0x65DF, 0x3484, 0x65E0, 0x65E0, 0x0EED, 0x65E1, 0x65E1, 0x348C,
+ 0x65E2, 0x65E2, 0x083B, 0x65E3, 0x65E4, 0x348D, 0x65E5, 0x65E5, 0x0CB0,
+ 0x65E6, 0x65E6, 0x058A, 0x65E7, 0x65E7, 0x08F8, 0x65E8, 0x65E8, 0x11BB,
+ 0x65E9, 0x65E9, 0x112A, 0x65EA, 0x65EB, 0x348F, 0x65EC, 0x65EC, 0x0FD7,
+ 0x65ED, 0x65ED, 0x0FBC, 0x65EE, 0x65F0, 0x190A, 0x65F1, 0x65F1, 0x076C,
+ 0x65F2, 0x65F5, 0x3491, 0x65F6, 0x65F6, 0x0D48, 0x65F7, 0x65F7, 0x0982,
+ 0x65F8, 0x65F9, 0x3495, 0x65FA, 0x65FA, 0x0EAB, 0x65FB, 0x65FF, 0x3497,
+ 0x6600, 0x6600, 0x1912, 0x6601, 0x6601, 0x349C, 0x6602, 0x6602, 0x03C5,
+ 0x6603, 0x6603, 0x1910, 0x6604, 0x6605, 0x349D, 0x6606, 0x6606, 0x0990,
+ 0x6607, 0x6609, 0x349F, 0x660A, 0x660A, 0x190D, 0x660B, 0x660B, 0x34A2,
+ 0x660C, 0x660C, 0x04C4, 0x660D, 0x660D, 0x34A3, 0x660E, 0x660E, 0x0AFC,
+ 0x660F, 0x660F, 0x07FD, 0x6610, 0x6612, 0x34A4, 0x6613, 0x6613, 0x105E,
+ 0x6614, 0x6614, 0x0F03, 0x6615, 0x6615, 0x1911, 0x6616, 0x6618, 0x34A7,
+ 0x6619, 0x6619, 0x190E, 0x661A, 0x661C, 0x34AA, 0x661D, 0x661D, 0x1915,
+ 0x661E, 0x661E, 0x34AD, 0x661F, 0x661F, 0x0F92, 0x6620, 0x6620, 0x1098,
+ 0x6621, 0x6624, 0x34AE, 0x6625, 0x6625, 0x053D, 0x6626, 0x6626, 0x34B2,
+ 0x6627, 0x6627, 0x0AC6, 0x6628, 0x6628, 0x124F, 0x6629, 0x662C, 0x34B3,
+ 0x662D, 0x662D, 0x1172, 0x662E, 0x662E, 0x34B7, 0x662F, 0x662F, 0x0D5E,
+ 0x6630, 0x6630, 0x34B8, 0x6631, 0x6631, 0x1917, 0x6632, 0x6633, 0x34B9,
+ 0x6634, 0x6634, 0x1916, 0x6635, 0x6635, 0x1919, 0x6636, 0x6636, 0x1918,
+ 0x6637, 0x663B, 0x34BB, 0x663C, 0x663C, 0x11E6, 0x663D, 0x663D, 0x34C0,
+ 0x663E, 0x663E, 0x0F41, 0x663F, 0x6640, 0x34C1, 0x6641, 0x6641, 0x191D,
+ 0x6642, 0x6642, 0x212D, 0x6643, 0x6643, 0x07E3, 0x6644, 0x664A, 0x34C3,
+ 0x664B, 0x664B, 0x08CB, 0x664C, 0x664C, 0x0D07, 0x664D, 0x664E, 0x34CA,
+ 0x664F, 0x664F, 0x191E, 0x6650, 0x6651, 0x34CC, 0x6652, 0x6652, 0x0CF2,
+ 0x6653, 0x6653, 0x0F6B, 0x6654, 0x6654, 0x191C, 0x6655, 0x6655, 0x1111,
+ 0x6656, 0x6656, 0x191F, 0x6657, 0x6657, 0x1921, 0x6658, 0x6659, 0x34CE,
+ 0x665A, 0x665A, 0x0E9E, 0x665B, 0x665C, 0x34D0, 0x665D, 0x665D, 0x229B,
+ 0x665E, 0x665E, 0x34D2, 0x665F, 0x665F, 0x191B, 0x6660, 0x6660, 0x34D3,
+ 0x6661, 0x6661, 0x1920, 0x6662, 0x6663, 0x34D4, 0x6664, 0x6664, 0x0EFD,
+ 0x6665, 0x6665, 0x34D6, 0x6666, 0x6666, 0x07F3, 0x6667, 0x6667, 0x34D7,
+ 0x6668, 0x6668, 0x04E4, 0x6669, 0x666D, 0x34D8, 0x666E, 0x666E, 0x0BF4,
+ 0x666F, 0x666F, 0x08DF, 0x6670, 0x6670, 0x0F09, 0x6671, 0x6673, 0x34DD,
+ 0x6674, 0x6674, 0x0C64, 0x6675, 0x6675, 0x34E0, 0x6676, 0x6676, 0x08D6,
+ 0x6677, 0x6677, 0x1922, 0x6678, 0x6679, 0x34E1, 0x667A, 0x667A, 0x11C6,
+ 0x667B, 0x667D, 0x34E3, 0x667E, 0x667E, 0x0A09, 0x667F, 0x6681, 0x34E6,
+ 0x6682, 0x6682, 0x1120, 0x6683, 0x6683, 0x34E9, 0x6684, 0x6684, 0x1923,
+ 0x6685, 0x6686, 0x34EA, 0x6687, 0x6687, 0x0F2B, 0x6688, 0x6688, 0x2256,
+ 0x6689, 0x6689, 0x24A8, 0x668A, 0x668B, 0x34EC, 0x668C, 0x668C, 0x1924,
+ 0x668D, 0x6690, 0x34EE, 0x6691, 0x6691, 0x0D85, 0x6692, 0x6695, 0x34F2,
+ 0x6696, 0x6696, 0x0B70, 0x6697, 0x6697, 0x03C0, 0x6698, 0x669C, 0x34F6,
+ 0x669D, 0x669D, 0x1926, 0x669E, 0x66A1, 0x34FB, 0x66A2, 0x66A2, 0x1E79,
+ 0x66A3, 0x66A6, 0x34FF, 0x66A7, 0x66A7, 0x1925, 0x66A8, 0x66A8, 0x1CDD,
+ 0x66A9, 0x66AA, 0x3503, 0x66AB, 0x66AB, 0x225A, 0x66AC, 0x66AD, 0x3505,
+ 0x66AE, 0x66AE, 0x0B1D, 0x66AF, 0x66B3, 0x3507, 0x66B4, 0x66B4, 0x0412,
+ 0x66B5, 0x66B8, 0x350C, 0x66B9, 0x66B9, 0x175B, 0x66BA, 0x66BD, 0x3510,
+ 0x66BE, 0x66BE, 0x1927, 0x66BF, 0x66C3, 0x3514, 0x66C4, 0x66C4, 0x24A7,
+ 0x66C5, 0x66C5, 0x3519, 0x66C6, 0x66C6, 0x2686, 0x66C7, 0x66C7, 0x24A6,
+ 0x66C8, 0x66C8, 0x351A, 0x66C9, 0x66C9, 0x21CE, 0x66CA, 0x66D5, 0x351B,
+ 0x66D6, 0x66D6, 0x24A9, 0x66D7, 0x66D8, 0x3527, 0x66D9, 0x66D9, 0x0D86,
+ 0x66DA, 0x66DA, 0x3529, 0x66DB, 0x66DC, 0x1928, 0x66DD, 0x66DD, 0x0BF7,
+ 0x66DE, 0x66DF, 0x352A, 0x66E0, 0x66E0, 0x1FE7, 0x66E1, 0x66E5, 0x352C,
+ 0x66E6, 0x66E6, 0x192A, 0x66E7, 0x66E8, 0x3531, 0x66E9, 0x66E9, 0x192B,
+ 0x66EA, 0x66EB, 0x3533, 0x66EC, 0x66EC, 0x2112, 0x66ED, 0x66EF, 0x3535,
+ 0x66F0, 0x66F0, 0x10FE, 0x66F1, 0x66F1, 0x3538, 0x66F2, 0x66F2, 0x0C77,
+ 0x66F3, 0x66F3, 0x103E, 0x66F4, 0x66F4, 0x06F7, 0x66F5, 0x66F6, 0x3539,
+ 0x66F7, 0x66F7, 0x1914, 0x66F8, 0x66F8, 0x213C, 0x66F9, 0x66F9, 0x04A3,
+ 0x66FA, 0x66FB, 0x353B, 0x66FC, 0x66FC, 0x0AA3, 0x66FD, 0x66FD, 0x353D,
+ 0x66FE, 0x66FE, 0x113B, 0x66FF, 0x66FF, 0x0E39, 0x6700, 0x6700, 0x124B,
+ 0x6701, 0x6702, 0x353E, 0x6703, 0x6703, 0x1F5C, 0x6704, 0x6707, 0x3540,
+ 0x6708, 0x6708, 0x1105, 0x6709, 0x6709, 0x10B5, 0x670A, 0x670A, 0x1973,
+ 0x670B, 0x670B, 0x0BB4, 0x670C, 0x670C, 0x3544, 0x670D, 0x670D, 0x069B,
+ 0x670E, 0x670F, 0x3545, 0x6710, 0x6710, 0x1984, 0x6711, 0x6713, 0x3547,
+ 0x6714, 0x6714, 0x0DAC, 0x6715, 0x6715, 0x198E, 0x6716, 0x6716, 0x354A,
+ 0x6717, 0x6717, 0x09B5, 0x6718, 0x671A, 0x354B, 0x671B, 0x671B, 0x0EAC,
+ 0x671C, 0x671C, 0x354E, 0x671D, 0x671D, 0x04D4, 0x671E, 0x671E, 0x354F,
+ 0x671F, 0x671F, 0x0BF9, 0x6720, 0x6725, 0x3550, 0x6726, 0x6726, 0x19AC,
+ 0x6727, 0x6727, 0x24C4, 0x6728, 0x6728, 0x0B21, 0x6729, 0x6729, 0x3556,
+ 0x672A, 0x672A, 0x0EC3, 0x672B, 0x672B, 0x0B0C, 0x672C, 0x672C, 0x0427,
+ 0x672D, 0x672D, 0x1140, 0x672E, 0x672E, 0x3557, 0x672F, 0x672F, 0x0D8C,
+ 0x6730, 0x6730, 0x3558, 0x6731, 0x6731, 0x11EB, 0x6732, 0x6733, 0x3559,
+ 0x6734, 0x6734, 0x0BF2, 0x6735, 0x6735, 0x0623, 0x6736, 0x6739, 0x355B,
+ 0x673A, 0x673A, 0x080F, 0x673B, 0x673C, 0x355F, 0x673D, 0x673D, 0x0FAB,
+ 0x673E, 0x673F, 0x3561, 0x6740, 0x6740, 0x0CEA, 0x6741, 0x6741, 0x3563,
+ 0x6742, 0x6742, 0x1116, 0x6743, 0x6743, 0x0C83, 0x6744, 0x6745, 0x3564,
+ 0x6746, 0x6746, 0x06C6, 0x6747, 0x6747, 0x3566, 0x6748, 0x6748, 0x1854,
+ 0x6749, 0x6749, 0x0CF5, 0x674A, 0x674B, 0x3567, 0x674C, 0x674C, 0x1851,
+ 0x674D, 0x674D, 0x3569, 0x674E, 0x674E, 0x09D9, 0x674F, 0x674F, 0x0F9E,
+ 0x6750, 0x6750, 0x048B, 0x6751, 0x6751, 0x0568, 0x6752, 0x6752, 0x356A,
+ 0x6753, 0x6753, 0x1852, 0x6754, 0x6755, 0x356B, 0x6756, 0x6756, 0x1169,
+ 0x6757, 0x675B, 0x356D, 0x675C, 0x675C, 0x0604, 0x675D, 0x675D, 0x3572,
+ 0x675E, 0x675E, 0x1853, 0x675F, 0x675F, 0x0D8F, 0x6760, 0x6760, 0x06D7,
+ 0x6761, 0x6761, 0x0E48, 0x6762, 0x6764, 0x3573, 0x6765, 0x6765, 0x099F,
+ 0x6766, 0x6767, 0x3576, 0x6768, 0x6768, 0x1017, 0x6769, 0x6769, 0x1855,
+ 0x676A, 0x676A, 0x1858, 0x676B, 0x676C, 0x3578, 0x676D, 0x676D, 0x0773,
+ 0x676E, 0x676E, 0x357A, 0x676F, 0x676F, 0x0416, 0x6770, 0x6770, 0x08AD,
+ 0x6771, 0x6771, 0x1ECC, 0x6772, 0x6772, 0x190F, 0x6773, 0x6773, 0x1859,
+ 0x6774, 0x6774, 0x357B, 0x6775, 0x6775, 0x185C, 0x6776, 0x6776, 0x357C,
+ 0x6777, 0x6777, 0x1861, 0x6778, 0x677B, 0x357D, 0x677C, 0x677C, 0x1862,
+ 0x677D, 0x677D, 0x3581, 0x677E, 0x677E, 0x0DBE, 0x677F, 0x677F, 0x03F0,
+ 0x6780, 0x6780, 0x3582, 0x6781, 0x6781, 0x081E, 0x6782, 0x6783, 0x3583,
+ 0x6784, 0x6784, 0x0712, 0x6785, 0x6786, 0x3585, 0x6787, 0x6787, 0x1857,
+ 0x6788, 0x6788, 0x3587, 0x6789, 0x6789, 0x0EA8, 0x678A, 0x678A, 0x3588,
+ 0x678B, 0x678B, 0x1860, 0x678C, 0x678F, 0x3589, 0x6790, 0x6790, 0x0F05,
+ 0x6791, 0x6794, 0x358D, 0x6795, 0x6795, 0x118E, 0x6796, 0x6796, 0x3591,
+ 0x6797, 0x6797, 0x0A1F, 0x6798, 0x6798, 0x185A, 0x6799, 0x6799, 0x3592,
+ 0x679A, 0x679A, 0x0ABB, 0x679B, 0x679B, 0x3593, 0x679C, 0x679C, 0x0754,
+ 0x679D, 0x679D, 0x11A5, 0x679E, 0x679E, 0x185E, 0x679F, 0x67A1, 0x3594,
+ 0x67A2, 0x67A2, 0x0D77, 0x67A3, 0x67A3, 0x1129, 0x67A4, 0x67A4, 0x3597,
+ 0x67A5, 0x67A5, 0x1856, 0x67A6, 0x67A6, 0x3598, 0x67A7, 0x67A7, 0x185B,
+ 0x67A8, 0x67A8, 0x185D, 0x67A9, 0x67A9, 0x3599, 0x67AA, 0x67AA, 0x0C36,
+ 0x67AB, 0x67AB, 0x0680, 0x67AC, 0x67AC, 0x359A, 0x67AD, 0x67AD, 0x185F,
+ 0x67AE, 0x67AE, 0x359B, 0x67AF, 0x67AF, 0x096A, 0x67B0, 0x67B0, 0x1868,
+ 0x67B1, 0x67B2, 0x359C, 0x67B3, 0x67B3, 0x186D, 0x67B4, 0x67B4, 0x359E,
+ 0x67B5, 0x67B5, 0x186B, 0x67B6, 0x67B6, 0x084F, 0x67B7, 0x67B7, 0x0842,
+ 0x67B8, 0x67B8, 0x1871, 0x67B9, 0x67C0, 0x359F, 0x67C1, 0x67C1, 0x1874,
+ 0x67C2, 0x67C2, 0x35A7, 0x67C3, 0x67C3, 0x1870, 0x67C4, 0x67C4, 0x0463,
+ 0x67C5, 0x67CE, 0x35A8, 0x67CF, 0x67CF, 0x03E3, 0x67D0, 0x67D0, 0x0B16,
+ 0x67D1, 0x67D1, 0x06C7, 0x67D2, 0x67D2, 0x0C01, 0x67D3, 0x67D3, 0x0C99,
+ 0x67D4, 0x67D4, 0x0CBC, 0x67D5, 0x67D7, 0x35B2, 0x67D8, 0x67D8, 0x1865,
+ 0x67D9, 0x67D9, 0x186A, 0x67DA, 0x67DA, 0x186C, 0x67DB, 0x67DB, 0x35B5,
+ 0x67DC, 0x67DC, 0x074A, 0x67DD, 0x67DD, 0x186E, 0x67DE, 0x67DE, 0x1252,
+ 0x67DF, 0x67DF, 0x35B6, 0x67E0, 0x67E0, 0x0B5E, 0x67E1, 0x67E1, 0x35B7,
+ 0x67E2, 0x67E2, 0x1872, 0x67E3, 0x67E4, 0x35B8, 0x67E5, 0x67E5, 0x04B0,
+ 0x67E6, 0x67E8, 0x35BA, 0x67E9, 0x67E9, 0x1867, 0x67EA, 0x67EB, 0x35BD,
+ 0x67EC, 0x67EC, 0x0860, 0x67ED, 0x67EE, 0x35BF, 0x67EF, 0x67EF, 0x094F,
+ 0x67F0, 0x67F0, 0x1863, 0x67F1, 0x67F1, 0x11F8, 0x67F2, 0x67F2, 0x35C1,
+ 0x67F3, 0x67F3, 0x0A41, 0x67F4, 0x67F4, 0x04B8, 0x67F5, 0x67FC, 0x35C2,
+ 0x67FD, 0x67FD, 0x1875, 0x67FE, 0x67FE, 0x35CA, 0x67FF, 0x67FF, 0x0D58,
+ 0x6800, 0x6800, 0x186F, 0x6801, 0x6804, 0x35CB, 0x6805, 0x6805, 0x1145,
+ 0x6806, 0x6806, 0x35CF, 0x6807, 0x6807, 0x0453, 0x6808, 0x6808, 0x115C,
+ 0x6809, 0x6809, 0x1864, 0x680A, 0x680A, 0x1866, 0x680B, 0x680B, 0x05EF,
+ 0x680C, 0x680C, 0x1869, 0x680D, 0x680D, 0x35D0, 0x680E, 0x680E, 0x1873,
+ 0x680F, 0x680F, 0x09A3, 0x6810, 0x6810, 0x35D1, 0x6811, 0x6811, 0x0D8E,
+ 0x6812, 0x6812, 0x35D2, 0x6813, 0x6813, 0x0D9D, 0x6814, 0x6815, 0x35D3,
+ 0x6816, 0x6816, 0x0BFB, 0x6817, 0x6817, 0x09E0, 0x6818, 0x681C, 0x35D5,
+ 0x681D, 0x681D, 0x187F, 0x681E, 0x6820, 0x35DA, 0x6821, 0x6821, 0x0F6E,
+ 0x6822, 0x6828, 0x35DD, 0x6829, 0x6829, 0x1888, 0x682A, 0x682A, 0x11E9,
+ 0x682B, 0x6831, 0x35E4, 0x6832, 0x6833, 0x1876, 0x6834, 0x6836, 0x35EB,
+ 0x6837, 0x6837, 0x1022, 0x6838, 0x6838, 0x0782, 0x6839, 0x6839, 0x06F4,
+ 0x683A, 0x683B, 0x35EE, 0x683C, 0x683C, 0x06EC, 0x683D, 0x683D, 0x1117,
+ 0x683E, 0x683E, 0x1885, 0x683F, 0x683F, 0x35F0, 0x6840, 0x6840, 0x1884,
+ 0x6841, 0x6841, 0x1882, 0x6842, 0x6842, 0x0749, 0x6843, 0x6843, 0x0E25,
+ 0x6844, 0x6844, 0x187C, 0x6845, 0x6845, 0x0EB5, 0x6846, 0x6846, 0x097F,
+ 0x6847, 0x6847, 0x35F1, 0x6848, 0x6848, 0x03C3, 0x6849, 0x6849, 0x1887,
+ 0x684A, 0x684A, 0x1886, 0x684B, 0x684B, 0x35F2, 0x684C, 0x684C, 0x121D,
+ 0x684D, 0x684D, 0x35F3, 0x684E, 0x684E, 0x187A, 0x684F, 0x684F, 0x35F4,
+ 0x6850, 0x6850, 0x0E5A, 0x6851, 0x6851, 0x0CDC, 0x6852, 0x6852, 0x35F5,
+ 0x6853, 0x6853, 0x07CD, 0x6854, 0x6854, 0x08AC, 0x6855, 0x6855, 0x1880,
+ 0x6856, 0x685F, 0x35F6, 0x6860, 0x6861, 0x1878, 0x6862, 0x6862, 0x187B,
+ 0x6863, 0x6863, 0x0596, 0x6864, 0x6864, 0x187D, 0x6865, 0x6865, 0x0C42,
+ 0x6866, 0x6866, 0x1881, 0x6867, 0x6867, 0x1883, 0x6868, 0x6868, 0x0881,
+ 0x6869, 0x6869, 0x120B, 0x686A, 0x686A, 0x3600, 0x686B, 0x686B, 0x188E,
+ 0x686C, 0x6873, 0x3601, 0x6874, 0x6874, 0x188B, 0x6875, 0x6875, 0x3609,
+ 0x6876, 0x6876, 0x0E61, 0x6877, 0x6877, 0x188C, 0x6878, 0x6880, 0x360A,
+ 0x6881, 0x6881, 0x0A03, 0x6882, 0x6882, 0x3613, 0x6883, 0x6883, 0x187E,
+ 0x6884, 0x6884, 0x3614, 0x6885, 0x6885, 0x0ABC, 0x6886, 0x6886, 0x03FB,
+ 0x6887, 0x688E, 0x3615, 0x688F, 0x688F, 0x188A, 0x6890, 0x6892, 0x361D,
+ 0x6893, 0x6893, 0x188D, 0x6894, 0x6896, 0x3620, 0x6897, 0x6897, 0x06FC,
+ 0x6898, 0x6898, 0x246A, 0x6899, 0x689C, 0x3623, 0x689D, 0x689D, 0x2175,
+ 0x689E, 0x689E, 0x3627, 0x689F, 0x689F, 0x246D, 0x68A0, 0x68A1, 0x3628,
+ 0x68A2, 0x68A2, 0x0D0B, 0x68A3, 0x68A5, 0x362A, 0x68A6, 0x68A6, 0x0AD3,
+ 0x68A7, 0x68A7, 0x0EEF, 0x68A8, 0x68A8, 0x09D1, 0x68A9, 0x68AC, 0x362D,
+ 0x68AD, 0x68AD, 0x0DE8, 0x68AE, 0x68AE, 0x3631, 0x68AF, 0x68AF, 0x0E30,
+ 0x68B0, 0x68B0, 0x0F80, 0x68B1, 0x68B2, 0x3632, 0x68B3, 0x68B3, 0x0D78,
+ 0x68B4, 0x68B4, 0x3634, 0x68B5, 0x68B5, 0x1889, 0x68B6, 0x68BF, 0x3635,
+ 0x68C0, 0x68C0, 0x085F, 0x68C1, 0x68C1, 0x363F, 0x68C2, 0x68C2, 0x188F,
+ 0x68C3, 0x68C8, 0x3640, 0x68C9, 0x68C9, 0x0AE3, 0x68CA, 0x68CA, 0x3646,
+ 0x68CB, 0x68CB, 0x0C04, 0x68CC, 0x68CC, 0x3647, 0x68CD, 0x68CD, 0x0750,
+ 0x68CE, 0x68D1, 0x3648, 0x68D2, 0x68D2, 0x03FF, 0x68D3, 0x68D4, 0x364C,
+ 0x68D5, 0x68D5, 0x1235, 0x68D6, 0x68D6, 0x246B, 0x68D7, 0x68D7, 0x225F,
+ 0x68D8, 0x68D8, 0x081F, 0x68D9, 0x68D9, 0x364E, 0x68DA, 0x68DA, 0x0BB0,
+ 0x68DB, 0x68DE, 0x364F, 0x68DF, 0x68DF, 0x1ECE, 0x68E0, 0x68E0, 0x0E17,
+ 0x68E1, 0x68E2, 0x3653, 0x68E3, 0x68E3, 0x189A, 0x68E4, 0x68E6, 0x3655,
+ 0x68E7, 0x68E7, 0x2272, 0x68E8, 0x68ED, 0x3658, 0x68EE, 0x68EE, 0x0CE6,
+ 0x68EF, 0x68EF, 0x365E, 0x68F0, 0x68F0, 0x1896, 0x68F1, 0x68F1, 0x09CD,
+ 0x68F2, 0x68F4, 0x365F, 0x68F5, 0x68F5, 0x0950, 0x68F6, 0x68F8, 0x3662,
+ 0x68F9, 0x68F9, 0x1894, 0x68FA, 0x68FA, 0x0730, 0x68FB, 0x68FB, 0x3665,
+ 0x68FC, 0x68FC, 0x1891, 0x68FD, 0x68FF, 0x3666, 0x6900, 0x6900, 0x3669,
+ 0x6901, 0x6901, 0x1898, 0x6902, 0x6904, 0x366A, 0x6905, 0x6905, 0x1055,
+ 0x6906, 0x690A, 0x366D, 0x690B, 0x690B, 0x1897, 0x690C, 0x690C, 0x3672,
+ 0x690D, 0x690D, 0x11B1, 0x690E, 0x690E, 0x1212, 0x690F, 0x690F, 0x2473,
+ 0x6910, 0x6910, 0x189B, 0x6911, 0x6911, 0x3673, 0x6912, 0x6912, 0x0888,
+ 0x6913, 0x691E, 0x3674, 0x691F, 0x6920, 0x1892, 0x6921, 0x6923, 0x3680,
+ 0x6924, 0x6924, 0x1895, 0x6925, 0x692C, 0x3683, 0x692D, 0x692D, 0x0E87,
+ 0x692E, 0x692F, 0x368B, 0x6930, 0x6930, 0x1033, 0x6931, 0x6933, 0x368D,
+ 0x6934, 0x6934, 0x18A6, 0x6935, 0x6938, 0x3690, 0x6939, 0x6939, 0x189D,
+ 0x693A, 0x693C, 0x3694, 0x693D, 0x693D, 0x052D, 0x693E, 0x693E, 0x3697,
+ 0x693F, 0x693F, 0x053E, 0x6940, 0x6941, 0x3698, 0x6942, 0x6942, 0x189F,
+ 0x6943, 0x6949, 0x369A, 0x694A, 0x694A, 0x21FE, 0x694B, 0x6952, 0x36A1,
+ 0x6953, 0x6953, 0x1EFE, 0x6954, 0x6954, 0x0F73, 0x6955, 0x6956, 0x36A9,
+ 0x6957, 0x6957, 0x1899, 0x6958, 0x6959, 0x36AB, 0x695A, 0x695A, 0x0523,
+ 0x695B, 0x695C, 0x36AD, 0x695D, 0x695D, 0x18A0, 0x695E, 0x695E, 0x09CE,
+ 0x695F, 0x695F, 0x36AF, 0x6960, 0x6960, 0x189E, 0x6961, 0x6962, 0x36B0,
+ 0x6963, 0x6963, 0x18AD, 0x6964, 0x6965, 0x36B2, 0x6966, 0x6966, 0x18AC,
+ 0x6967, 0x6967, 0x36B4, 0x6968, 0x6968, 0x2475, 0x6969, 0x696A, 0x36B5,
+ 0x696B, 0x696B, 0x18A2, 0x696C, 0x696C, 0x36B7, 0x696D, 0x696D, 0x220A,
+ 0x696E, 0x696E, 0x1890, 0x696F, 0x6970, 0x36B8, 0x6971, 0x6971, 0x189C,
+ 0x6972, 0x6974, 0x36BA, 0x6975, 0x6975, 0x1F6F, 0x6976, 0x6976, 0x36BD,
+ 0x6977, 0x6977, 0x0939, 0x6978, 0x6978, 0x18A5, 0x6979, 0x6979, 0x18AE,
+ 0x697A, 0x697B, 0x36BE, 0x697C, 0x697C, 0x0A4C, 0x697D, 0x697F, 0x36C0,
+ 0x6980, 0x6980, 0x18A3, 0x6981, 0x6981, 0x36C3, 0x6982, 0x6982, 0x06C0,
+ 0x6983, 0x6983, 0x36C4, 0x6984, 0x6984, 0x18A1, 0x6985, 0x6985, 0x36C5,
+ 0x6986, 0x6986, 0x10C1, 0x6987, 0x6988, 0x18A8, 0x6989, 0x6989, 0x18AB,
+ 0x698A, 0x698C, 0x36C6, 0x698D, 0x698D, 0x18BB, 0x698E, 0x6993, 0x36C9,
+ 0x6994, 0x6994, 0x09B1, 0x6995, 0x6995, 0x18B9, 0x6996, 0x6997, 0x36CF,
+ 0x6998, 0x6998, 0x18A4, 0x6999, 0x699A, 0x36D1, 0x699B, 0x699B, 0x18AF,
+ 0x699C, 0x699C, 0x03FC, 0x699D, 0x69A6, 0x36D3, 0x69A7, 0x69A7, 0x18B0,
+ 0x69A8, 0x69A8, 0x1146, 0x69A9, 0x69A9, 0x36DD, 0x69AA, 0x69AA, 0x2468,
+ 0x69AB, 0x69AB, 0x18B2, 0x69AC, 0x69AC, 0x36DE, 0x69AD, 0x69AD, 0x18B3,
+ 0x69AE, 0x69AE, 0x2100, 0x69AF, 0x69B0, 0x36DF, 0x69B1, 0x69B1, 0x18B5,
+ 0x69B2, 0x69B3, 0x36E1, 0x69B4, 0x69B4, 0x0A3A, 0x69B5, 0x69B6, 0x36E3,
+ 0x69B7, 0x69B7, 0x0C91, 0x69B8, 0x69BA, 0x36E5, 0x69BB, 0x69BB, 0x18B1,
+ 0x69BC, 0x69BE, 0x36E8, 0x69BF, 0x69BF, 0x2476, 0x69C0, 0x69C0, 0x36EB,
+ 0x69C1, 0x69C1, 0x18B6, 0x69C2, 0x69C9, 0x36EC, 0x69CA, 0x69CA, 0x18B7,
+ 0x69CB, 0x69CB, 0x1F27, 0x69CC, 0x69CC, 0x18A7, 0x69CD, 0x69CD, 0x20D7,
+ 0x69CE, 0x69CE, 0x18AA, 0x69CF, 0x69CF, 0x36F4, 0x69D0, 0x69D0, 0x07C6,
+ 0x69D1, 0x69D3, 0x36F5, 0x69D4, 0x69D4, 0x18B4, 0x69D5, 0x69DA, 0x36F8,
+ 0x69DB, 0x69DB, 0x086A, 0x69DC, 0x69DE, 0x36FE, 0x69DF, 0x69DF, 0x18B8,
+ 0x69E0, 0x69E0, 0x18BA, 0x69E1, 0x69E6, 0x3701, 0x69E7, 0x69E7, 0x247C,
+ 0x69E8, 0x69EC, 0x3707, 0x69ED, 0x69ED, 0x18BE, 0x69EE, 0x69F1, 0x370C,
+ 0x69F2, 0x69F2, 0x18C2, 0x69F3, 0x69F3, 0x1FA1, 0x69F4, 0x69FC, 0x3710,
+ 0x69FD, 0x69FD, 0x04A2, 0x69FE, 0x69FE, 0x3719, 0x69FF, 0x69FF, 0x18BC,
+ 0x6A00, 0x6A00, 0x371A, 0x6A01, 0x6A01, 0x22AA, 0x6A02, 0x6A02, 0x2005,
+ 0x6A03, 0x6A04, 0x371B, 0x6A05, 0x6A05, 0x246C, 0x6A06, 0x6A09, 0x371D,
+ 0x6A0A, 0x6A0A, 0x064B, 0x6A0B, 0x6A12, 0x3721, 0x6A13, 0x6A13, 0x203E,
+ 0x6A14, 0x6A16, 0x3729, 0x6A17, 0x6A18, 0x18BF, 0x6A19, 0x6A19, 0x1E4C,
+ 0x6A1A, 0x6A1D, 0x372C, 0x6A1E, 0x6A1E, 0x213A, 0x6A1F, 0x6A1F, 0x1162,
+ 0x6A20, 0x6A20, 0x3730, 0x6A21, 0x6A21, 0x0B06, 0x6A22, 0x6A22, 0x3731,
+ 0x6A23, 0x6A23, 0x2204, 0x6A24, 0x6A27, 0x3732, 0x6A28, 0x6A28, 0x18CC,
+ 0x6A29, 0x6A29, 0x3736, 0x6A2A, 0x6A2A, 0x0798, 0x6A2B, 0x6A2E, 0x3737,
+ 0x6A2F, 0x6A2F, 0x18BD, 0x6A30, 0x6A30, 0x373B, 0x6A31, 0x6A31, 0x1088,
+ 0x6A32, 0x6A34, 0x373C, 0x6A35, 0x6A35, 0x18C8, 0x6A36, 0x6A37, 0x373F,
+ 0x6A38, 0x6A38, 0x20C3, 0x6A39, 0x6A39, 0x2140, 0x6A3A, 0x6A3A, 0x2477,
+ 0x6A3B, 0x6A3C, 0x3741, 0x6A3D, 0x6A3D, 0x18CB, 0x6A3E, 0x6A3E, 0x18C4,
+ 0x6A3F, 0x6A43, 0x3743, 0x6A44, 0x6A44, 0x18C3, 0x6A45, 0x6A46, 0x3748,
+ 0x6A47, 0x6A47, 0x0C3E, 0x6A48, 0x6A48, 0x2474, 0x6A49, 0x6A4A, 0x374A,
+ 0x6A4B, 0x6A4B, 0x20DD, 0x6A4C, 0x6A4F, 0x374C, 0x6A50, 0x6A50, 0x18C6,
+ 0x6A51, 0x6A57, 0x3750, 0x6A58, 0x6A58, 0x18CD, 0x6A59, 0x6A59, 0x04ED,
+ 0x6A5A, 0x6A5A, 0x3757, 0x6A5B, 0x6A5B, 0x18C7, 0x6A5C, 0x6A5E, 0x3758,
+ 0x6A5F, 0x6A5F, 0x1F68, 0x6A60, 0x6A60, 0x375B, 0x6A61, 0x6A61, 0x0F5D,
+ 0x6A62, 0x6A62, 0x2185, 0x6A63, 0x6A64, 0x375C, 0x6A65, 0x6A65, 0x18C1,
+ 0x6A66, 0x6A70, 0x375E, 0x6A71, 0x6A71, 0x051C, 0x6A72, 0x6A78, 0x3769,
+ 0x6A79, 0x6A79, 0x18CA, 0x6A7A, 0x6A7B, 0x3770, 0x6A7C, 0x6A7C, 0x18CE,
+ 0x6A7D, 0x6A7F, 0x3772, 0x6A80, 0x6A80, 0x0E07, 0x6A81, 0x6A83, 0x3775,
+ 0x6A84, 0x6A84, 0x0F1A, 0x6A85, 0x6A88, 0x3778, 0x6A89, 0x6A89, 0x2472,
+ 0x6A8A, 0x6A8D, 0x377C, 0x6A8E, 0x6A8E, 0x18C9, 0x6A8F, 0x6A8F, 0x3780,
+ 0x6A90, 0x6A90, 0x18D0, 0x6A91, 0x6A91, 0x18CF, 0x6A92, 0x6A93, 0x3781,
+ 0x6A94, 0x6A94, 0x1EB5, 0x6A95, 0x6A96, 0x3783, 0x6A97, 0x6A97, 0x18D2,
+ 0x6A98, 0x6A9B, 0x3785, 0x6A9C, 0x6A9C, 0x2478, 0x6A9D, 0x6A9F, 0x3789,
+ 0x6AA0, 0x6AA0, 0x18C5, 0x6AA1, 0x6AA1, 0x378C, 0x6AA2, 0x6AA2, 0x1F8B,
+ 0x6AA3, 0x6AA3, 0x2484, 0x6AA4, 0x6AA8, 0x378D, 0x6AA9, 0x6AA9, 0x18D1,
+ 0x6AAA, 0x6AAA, 0x3792, 0x6AAB, 0x6AAB, 0x18D3, 0x6AAC, 0x6AAC, 0x0ACF,
+ 0x6AAD, 0x6AAE, 0x3793, 0x6AAF, 0x6AAF, 0x2699, 0x6AB0, 0x6AB2, 0x3795,
+ 0x6AB3, 0x6AB3, 0x2482, 0x6AB4, 0x6AB7, 0x3798, 0x6AB8, 0x6AB8, 0x20A1,
+ 0x6AB9, 0x6ABA, 0x379C, 0x6ABB, 0x6ABB, 0x1F92, 0x6ABC, 0x6AC2, 0x379E,
+ 0x6AC3, 0x6AC3, 0x1F38, 0x6AC4, 0x6AD2, 0x37A5, 0x6AD3, 0x6AD3, 0x2485,
+ 0x6AD4, 0x6AD9, 0x37B4, 0x6ADA, 0x6ADA, 0x2480, 0x6ADB, 0x6ADB, 0x246E,
+ 0x6ADC, 0x6ADC, 0x37BA, 0x6ADD, 0x6ADD, 0x247B, 0x6ADE, 0x6ADE, 0x2486,
+ 0x6ADF, 0x6ADF, 0x2471, 0x6AE0, 0x6AE6, 0x37BB, 0x6AE7, 0x6AE7, 0x2483,
+ 0x6AE8, 0x6AE8, 0x2470, 0x6AE9, 0x6AE9, 0x37C2, 0x6AEA, 0x6AEA, 0x2469,
+ 0x6AEB, 0x6AEB, 0x37C3, 0x6AEC, 0x6AEC, 0x247F, 0x6AED, 0x6AF2, 0x37C4,
+ 0x6AF3, 0x6AF3, 0x246F, 0x6AF4, 0x6AF7, 0x37CA, 0x6AF8, 0x6AF8, 0x2481,
+ 0x6AF9, 0x6AFA, 0x37CE, 0x6AFB, 0x6AFB, 0x2220, 0x6AFC, 0x6AFF, 0x37D0,
+ 0x6B00, 0x6B03, 0x37D4, 0x6B04, 0x6B04, 0x1FF5, 0x6B05, 0x6B09, 0x37D8,
+ 0x6B0A, 0x6B0A, 0x20F4, 0x6B0B, 0x6B0E, 0x37DD, 0x6B0F, 0x6B0F, 0x247D,
+ 0x6B10, 0x6B11, 0x37E1, 0x6B12, 0x6B12, 0x2479, 0x6B13, 0x6B15, 0x37E3,
+ 0x6B16, 0x6B16, 0x247E, 0x6B17, 0x6B1D, 0x37E6, 0x6B1E, 0x6B1E, 0x247A,
+ 0x6B1F, 0x6B1F, 0x37ED, 0x6B20, 0x6B20, 0x0C34, 0x6B21, 0x6B21, 0x0551,
+ 0x6B22, 0x6B22, 0x07CB, 0x6B23, 0x6B23, 0x0F8B, 0x6B24, 0x6B24, 0x19B1,
+ 0x6B25, 0x6B26, 0x37EE, 0x6B27, 0x6B27, 0x0B78, 0x6B28, 0x6B31, 0x37F0,
+ 0x6B32, 0x6B32, 0x10E0, 0x6B33, 0x6B36, 0x37FA, 0x6B37, 0x6B37, 0x19B2,
+ 0x6B38, 0x6B38, 0x37FE, 0x6B39, 0x6B39, 0x19B3, 0x6B3A, 0x6B3A, 0x0BFA,
+ 0x6B3B, 0x6B3C, 0x37FF, 0x6B3D, 0x6B3D, 0x20E3, 0x6B3E, 0x6B3E, 0x097B,
+ 0x6B3F, 0x6B42, 0x3801, 0x6B43, 0x6B43, 0x19B4, 0x6B44, 0x6B45, 0x3805,
+ 0x6B46, 0x6B46, 0x19B5, 0x6B47, 0x6B47, 0x0F75, 0x6B48, 0x6B48, 0x3807,
+ 0x6B49, 0x6B49, 0x0C35, 0x6B4A, 0x6B4B, 0x3808, 0x6B4C, 0x6B4C, 0x06E3,
+ 0x6B4D, 0x6B4F, 0x380A, 0x6B50, 0x6B50, 0x20AD, 0x6B51, 0x6B58, 0x380D,
+ 0x6B59, 0x6B59, 0x19B6, 0x6B5A, 0x6B5E, 0x3815, 0x6B5F, 0x6B5F, 0x24CB,
+ 0x6B60, 0x6B60, 0x381A, 0x6B61, 0x6B61, 0x1F53, 0x6B62, 0x6B62, 0x11B8,
+ 0x6B63, 0x6B63, 0x119E, 0x6B64, 0x6B64, 0x054E, 0x6B65, 0x6B65, 0x0484,
+ 0x6B66, 0x6B66, 0x0EF3, 0x6B67, 0x6B67, 0x0C06, 0x6B68, 0x6B69, 0x381B,
+ 0x6B6A, 0x6B6A, 0x0E92, 0x6B6B, 0x6B71, 0x381D, 0x6B72, 0x6B72, 0x2159,
+ 0x6B73, 0x6B76, 0x3824, 0x6B77, 0x6B77, 0x2013, 0x6B78, 0x6B78, 0x1F33,
+ 0x6B79, 0x6B79, 0x0578, 0x6B7A, 0x6B7A, 0x3828, 0x6B7B, 0x6B7B, 0x0DB5,
+ 0x6B7C, 0x6B7C, 0x0852, 0x6B7D, 0x6B80, 0x3829, 0x6B81, 0x6B82, 0x18D6,
+ 0x6B83, 0x6B83, 0x1013, 0x6B84, 0x6B84, 0x18D9, 0x6B85, 0x6B85, 0x382D,
+ 0x6B86, 0x6B86, 0x057C, 0x6B87, 0x6B87, 0x18D8, 0x6B88, 0x6B88, 0x382E,
+ 0x6B89, 0x6B89, 0x0FDC, 0x6B8A, 0x6B8A, 0x0D79, 0x6B8B, 0x6B8B, 0x0497,
+ 0x6B8C, 0x6B8C, 0x382F, 0x6B8D, 0x6B8D, 0x18DC, 0x6B8E, 0x6B91, 0x3830,
+ 0x6B92, 0x6B93, 0x18DA, 0x6B94, 0x6B95, 0x3834, 0x6B96, 0x6B96, 0x11B2,
+ 0x6B97, 0x6B97, 0x3836, 0x6B98, 0x6B98, 0x1E5C, 0x6B99, 0x6B99, 0x3837,
+ 0x6B9A, 0x6B9B, 0x18DD, 0x6B9C, 0x6B9D, 0x3838, 0x6B9E, 0x6B9E, 0x2488,
+ 0x6B9F, 0x6BA0, 0x383A, 0x6BA1, 0x6BA1, 0x18DF, 0x6BA2, 0x6BA3, 0x383C,
+ 0x6BA4, 0x6BA4, 0x2487, 0x6BA5, 0x6BA9, 0x383E, 0x6BAA, 0x6BAA, 0x18E0,
+ 0x6BAB, 0x6BAB, 0x248A, 0x6BAC, 0x6BAD, 0x3843, 0x6BAE, 0x6BAE, 0x2489,
+ 0x6BAF, 0x6BAF, 0x248B, 0x6BB0, 0x6BB1, 0x3845, 0x6BB2, 0x6BB2, 0x1F83,
+ 0x6BB3, 0x6BB3, 0x19BD, 0x6BB4, 0x6BB4, 0x0B7A, 0x6BB5, 0x6BB5, 0x060D,
+ 0x6BB6, 0x6BB6, 0x3847, 0x6BB7, 0x6BB7, 0x107A, 0x6BB8, 0x6BB9, 0x3848,
+ 0x6BBA, 0x6BBA, 0x210F, 0x6BBB, 0x6BBB, 0x1FDB, 0x6BBC, 0x6BBE, 0x384A,
+ 0x6BBF, 0x6BBF, 0x05CF, 0x6BC0, 0x6BC0, 0x384D, 0x6BC1, 0x6BC1, 0x07EE,
+ 0x6BC2, 0x6BC2, 0x19BF, 0x6BC3, 0x6BC4, 0x384E, 0x6BC5, 0x6BC5, 0x106A,
+ 0x6BC6, 0x6BC6, 0x20AF, 0x6BC7, 0x6BCA, 0x3850, 0x6BCB, 0x6BCB, 0x0EF2,
+ 0x6BCC, 0x6BCC, 0x3854, 0x6BCD, 0x6BCD, 0x0B1B, 0x6BCE, 0x6BCE, 0x3855,
+ 0x6BCF, 0x6BCF, 0x0AC4, 0x6BD0, 0x6BD1, 0x3856, 0x6BD2, 0x6BD2, 0x05FD,
+ 0x6BD3, 0x6BD3, 0x126F, 0x6BD4, 0x6BD4, 0x0431, 0x6BD5, 0x6BD5, 0x0438,
+ 0x6BD6, 0x6BD6, 0x043A, 0x6BD7, 0x6BD7, 0x0BBF, 0x6BD8, 0x6BD8, 0x3858,
+ 0x6BD9, 0x6BD9, 0x0439, 0x6BDA, 0x6BDA, 0x3859, 0x6BDB, 0x6BDB, 0x0AB0,
+ 0x6BDC, 0x6BE0, 0x385A, 0x6BE1, 0x6BE1, 0x1152, 0x6BE2, 0x6BE9, 0x385F,
+ 0x6BEA, 0x6BEA, 0x1954, 0x6BEB, 0x6BEB, 0x0778, 0x6BEC, 0x6BEE, 0x3867,
+ 0x6BEF, 0x6BEF, 0x0E0D, 0x6BF0, 0x6BF2, 0x386A, 0x6BF3, 0x6BF3, 0x1955,
+ 0x6BF4, 0x6BF4, 0x386D, 0x6BF5, 0x6BF5, 0x1957, 0x6BF6, 0x6BF8, 0x386E,
+ 0x6BF9, 0x6BF9, 0x1958, 0x6BFA, 0x6BFC, 0x3871, 0x6BFD, 0x6BFD, 0x1956,
+ 0x6BFE, 0x6BFE, 0x3874, 0x6BFF, 0x6BFF, 0x24C0, 0x6C00, 0x6C04, 0x3875,
+ 0x6C05, 0x6C05, 0x1959, 0x6C06, 0x6C06, 0x195B, 0x6C07, 0x6C07, 0x195A,
+ 0x6C08, 0x6C08, 0x226D, 0x6C09, 0x6C0B, 0x387A, 0x6C0C, 0x6C0C, 0x24C1,
+ 0x6C0D, 0x6C0D, 0x195C, 0x6C0E, 0x6C0E, 0x387D, 0x6C0F, 0x6C0F, 0x0D66,
+ 0x6C10, 0x6C10, 0x126B, 0x6C11, 0x6C11, 0x0AF6, 0x6C12, 0x6C12, 0x387E,
+ 0x6C13, 0x6C13, 0x0AAA, 0x6C14, 0x6C14, 0x0C17, 0x6C15, 0x6C15, 0x195D,
+ 0x6C16, 0x6C16, 0x0B2D, 0x6C17, 0x6C17, 0x387F, 0x6C18, 0x6C1A, 0x195E,
+ 0x6C1B, 0x6C1B, 0x0672, 0x6C1C, 0x6C1E, 0x3880, 0x6C1F, 0x6C1F, 0x0697,
+ 0x6C20, 0x6C20, 0x3883, 0x6C21, 0x6C21, 0x1961, 0x6C22, 0x6C22, 0x0C5F,
+ 0x6C23, 0x6C23, 0x20CA, 0x6C24, 0x6C24, 0x1963, 0x6C25, 0x6C25, 0x3884,
+ 0x6C26, 0x6C26, 0x075B, 0x6C27, 0x6C27, 0x101E, 0x6C28, 0x6C28, 0x03BC,
+ 0x6C29, 0x6C29, 0x1962, 0x6C2A, 0x6C2A, 0x1964, 0x6C2B, 0x6C2B, 0x20E7,
+ 0x6C2C, 0x6C2C, 0x24C2, 0x6C2D, 0x6C2D, 0x3885, 0x6C2E, 0x6C2E, 0x058B,
+ 0x6C2F, 0x6C2F, 0x0A6F, 0x6C30, 0x6C30, 0x0C65, 0x6C31, 0x6C31, 0x3886,
+ 0x6C32, 0x6C32, 0x1965, 0x6C33, 0x6C33, 0x3887, 0x6C34, 0x6C34, 0x0DA3,
+ 0x6C35, 0x6C35, 0x169F, 0x6C36, 0x6C37, 0x3888, 0x6C38, 0x6C38, 0x10A5,
+ 0x6C39, 0x6C3C, 0x388A, 0x6C3D, 0x6C3D, 0x12EF, 0x6C3E, 0x6C3F, 0x388E,
+ 0x6C40, 0x6C40, 0x0E52, 0x6C41, 0x6C41, 0x11AC, 0x6C42, 0x6C42, 0x0C70,
+ 0x6C43, 0x6C45, 0x3890, 0x6C46, 0x6C46, 0x12F4, 0x6C47, 0x6C47, 0x07F8,
+ 0x6C48, 0x6C48, 0x3893, 0x6C49, 0x6C49, 0x0771, 0x6C4A, 0x6C4A, 0x16A2,
+ 0x6C4B, 0x6C4F, 0x3894, 0x6C50, 0x6C50, 0x0F18, 0x6C51, 0x6C53, 0x3899,
+ 0x6C54, 0x6C54, 0x16A0, 0x6C55, 0x6C55, 0x0D00, 0x6C56, 0x6C56, 0x389C,
+ 0x6C57, 0x6C57, 0x0770, 0x6C58, 0x6C5A, 0x389D, 0x6C5B, 0x6C5B, 0x0FDD,
+ 0x6C5C, 0x6C5C, 0x16A1, 0x6C5D, 0x6C5D, 0x0CC5, 0x6C5E, 0x6C5E, 0x0708,
+ 0x6C5F, 0x6C5F, 0x087E, 0x6C60, 0x6C60, 0x04FD, 0x6C61, 0x6C61, 0x0EEA,
+ 0x6C62, 0x6C63, 0x38A0, 0x6C64, 0x6C64, 0x0E13, 0x6C65, 0x6C67, 0x38A2,
+ 0x6C68, 0x6C69, 0x16A8, 0x6C6A, 0x6C6A, 0x0EA5, 0x6C6B, 0x6C6F, 0x38A5,
+ 0x6C70, 0x6C70, 0x0E00, 0x6C71, 0x6C71, 0x38AA, 0x6C72, 0x6C72, 0x0826,
+ 0x6C73, 0x6C73, 0x38AB, 0x6C74, 0x6C74, 0x16AA, 0x6C75, 0x6C75, 0x38AC,
+ 0x6C76, 0x6C76, 0x16AB, 0x6C77, 0x6C78, 0x38AD, 0x6C79, 0x6C79, 0x0FA5,
+ 0x6C7A, 0x6C7C, 0x38AF, 0x6C7D, 0x6C7D, 0x0C1A, 0x6C7E, 0x6C7E, 0x0677,
+ 0x6C7F, 0x6C80, 0x38B2, 0x6C81, 0x6C81, 0x0C5C, 0x6C82, 0x6C82, 0x1051,
+ 0x6C83, 0x6C83, 0x0EE5, 0x6C84, 0x6C84, 0x38B4, 0x6C85, 0x6C85, 0x16A4,
+ 0x6C86, 0x6C86, 0x16AC, 0x6C87, 0x6C87, 0x38B5, 0x6C88, 0x6C88, 0x0D2B,
+ 0x6C89, 0x6C89, 0x04E6, 0x6C8A, 0x6C8B, 0x38B6, 0x6C8C, 0x6C8C, 0x16A7,
+ 0x6C8D, 0x6C8E, 0x38B8, 0x6C8F, 0x6C8F, 0x0C02, 0x6C90, 0x6C90, 0x16A5,
+ 0x6C91, 0x6C92, 0x38BA, 0x6C93, 0x6C93, 0x1A1F, 0x6C94, 0x6C94, 0x16A6,
+ 0x6C95, 0x6C98, 0x38BC, 0x6C99, 0x6C99, 0x0CEC, 0x6C9A, 0x6C9A, 0x38C0,
+ 0x6C9B, 0x6C9B, 0x0BA7, 0x6C9C, 0x6C9E, 0x38C1, 0x6C9F, 0x6C9F, 0x070E,
+ 0x6CA0, 0x6CA0, 0x38C4, 0x6CA1, 0x6CA1, 0x0AC0, 0x6CA2, 0x6CA2, 0x38C5,
+ 0x6CA3, 0x6CA3, 0x16A3, 0x6CA4, 0x6CA4, 0x0B7E, 0x6CA5, 0x6CA5, 0x09ED,
+ 0x6CA6, 0x6CA6, 0x0A80, 0x6CA7, 0x6CA7, 0x049E, 0x6CA8, 0x6CA8, 0x38C6,
+ 0x6CA9, 0x6CA9, 0x16AD, 0x6CAA, 0x6CAA, 0x07BB, 0x6CAB, 0x6CAB, 0x0B10,
+ 0x6CAC, 0x6CAC, 0x38C7, 0x6CAD, 0x6CAD, 0x16B0, 0x6CAE, 0x6CAE, 0x0909,
+ 0x6CAF, 0x6CB0, 0x38C8, 0x6CB1, 0x6CB1, 0x16BB, 0x6CB2, 0x6CB2, 0x16B5,
+ 0x6CB3, 0x6CB3, 0x078A, 0x6CB4, 0x6CB7, 0x38CA, 0x6CB8, 0x6CB8, 0x066D,
+ 0x6CB9, 0x6CB9, 0x10B2, 0x6CBA, 0x6CBA, 0x38CE, 0x6CBB, 0x6CBB, 0x11CD,
+ 0x6CBC, 0x6CBC, 0x1174, 0x6CBD, 0x6CBD, 0x071A, 0x6CBE, 0x6CBE, 0x1155,
+ 0x6CBF, 0x6CBF, 0x1001, 0x6CC0, 0x6CC3, 0x38CF, 0x6CC4, 0x6CC4, 0x0F84,
+ 0x6CC5, 0x6CC5, 0x0C73, 0x6CC6, 0x6CC8, 0x38D3, 0x6CC9, 0x6CC9, 0x0C85,
+ 0x6CCA, 0x6CCA, 0x047B, 0x6CCB, 0x6CCB, 0x38D6, 0x6CCC, 0x6CCC, 0x0ADF,
+ 0x6CCD, 0x6CCF, 0x38D7, 0x6CD0, 0x6CD0, 0x16AE, 0x6CD1, 0x6CD2, 0x38DA,
+ 0x6CD3, 0x6CD3, 0x16BC, 0x6CD4, 0x6CD4, 0x16AF, 0x6CD5, 0x6CD5, 0x0645,
+ 0x6CD6, 0x6CD6, 0x16B7, 0x6CD7, 0x6CD7, 0x16B4, 0x6CD8, 0x6CDA, 0x38DC,
+ 0x6CDB, 0x6CDB, 0x0657, 0x6CDC, 0x6CDD, 0x38DF, 0x6CDE, 0x6CDE, 0x0B63,
+ 0x6CDF, 0x6CDF, 0x38E1, 0x6CE0, 0x6CE0, 0x16B6, 0x6CE1, 0x6CE1, 0x0B9E,
+ 0x6CE2, 0x6CE2, 0x046F, 0x6CE3, 0x6CE3, 0x0C1B, 0x6CE4, 0x6CE4, 0x38E2,
+ 0x6CE5, 0x6CE5, 0x0B43, 0x6CE6, 0x6CE7, 0x38E3, 0x6CE8, 0x6CE8, 0x11FF,
+ 0x6CE9, 0x6CE9, 0x38E5, 0x6CEA, 0x6CEA, 0x09CC, 0x6CEB, 0x6CEB, 0x16B9,
+ 0x6CEC, 0x6CED, 0x38E6, 0x6CEE, 0x6CEE, 0x16BA, 0x6CEF, 0x6CEF, 0x16BD,
+ 0x6CF0, 0x6CF0, 0x0DFC, 0x6CF1, 0x6CF1, 0x16B3, 0x6CF2, 0x6CF2, 0x38E8,
+ 0x6CF3, 0x6CF3, 0x10A3, 0x6CF4, 0x6CF4, 0x38E9, 0x6CF5, 0x6CF5, 0x042C,
+ 0x6CF6, 0x6CF6, 0x1A20, 0x6CF7, 0x6CF8, 0x16B1, 0x6CF9, 0x6CF9, 0x38EA,
+ 0x6CFA, 0x6CFA, 0x16B8, 0x6CFB, 0x6CFB, 0x0F85, 0x6CFC, 0x6CFC, 0x0BE2,
+ 0x6CFD, 0x6CFD, 0x1136, 0x6CFE, 0x6CFE, 0x16BE, 0x6CFF, 0x6CFF, 0x38EB,
+ 0x6D00, 0x6D00, 0x38EC, 0x6D01, 0x6D01, 0x08B1, 0x6D02, 0x6D03, 0x38ED,
+ 0x6D04, 0x6D04, 0x16C5, 0x6D05, 0x6D06, 0x38EF, 0x6D07, 0x6D07, 0x16C4,
+ 0x6D08, 0x6D0A, 0x38F1, 0x6D0B, 0x6D0B, 0x101C, 0x6D0C, 0x6D0C, 0x16C1,
+ 0x6D0D, 0x6D0D, 0x38F4, 0x6D0E, 0x6D0E, 0x16C7, 0x6D0F, 0x6D11, 0x38F5,
+ 0x6D12, 0x6D12, 0x0CD2, 0x6D13, 0x6D16, 0x38F8, 0x6D17, 0x6D17, 0x0F21,
+ 0x6D18, 0x6D18, 0x38FC, 0x6D19, 0x6D19, 0x16C6, 0x6D1A, 0x6D1A, 0x16CC,
+ 0x6D1B, 0x6D1B, 0x0A8C, 0x6D1C, 0x6D1D, 0x38FD, 0x6D1E, 0x6D1E, 0x05F3,
+ 0x6D1F, 0x6D24, 0x38FF, 0x6D25, 0x6D25, 0x08C3, 0x6D26, 0x6D26, 0x3905,
+ 0x6D27, 0x6D27, 0x16C0, 0x6D28, 0x6D29, 0x3906, 0x6D2A, 0x6D2A, 0x07A0,
+ 0x6D2B, 0x6D2B, 0x16C8, 0x6D2C, 0x6D2D, 0x3908, 0x6D2E, 0x6D2E, 0x16CA,
+ 0x6D2F, 0x6D30, 0x390A, 0x6D31, 0x6D31, 0x063C, 0x6D32, 0x6D32, 0x11DD,
+ 0x6D33, 0x6D33, 0x16D0, 0x6D34, 0x6D34, 0x390C, 0x6D35, 0x6D35, 0x16CB,
+ 0x6D36, 0x6D38, 0x390D, 0x6D39, 0x6D39, 0x16BF, 0x6D3A, 0x6D3A, 0x3910,
+ 0x6D3B, 0x6D3B, 0x0803, 0x6D3C, 0x6D3C, 0x0E8E, 0x6D3D, 0x6D3D, 0x0C1F,
+ 0x6D3E, 0x6D3E, 0x0B8A, 0x6D3F, 0x6D40, 0x3911, 0x6D41, 0x6D41, 0x0A40,
+ 0x6D42, 0x6D42, 0x3913, 0x6D43, 0x6D43, 0x16C2, 0x6D44, 0x6D44, 0x3914,
+ 0x6D45, 0x6D45, 0x0C30, 0x6D46, 0x6D46, 0x087D, 0x6D47, 0x6D47, 0x088E,
+ 0x6D48, 0x6D48, 0x16C3, 0x6D49, 0x6D49, 0x3915, 0x6D4A, 0x6D4A, 0x1224,
+ 0x6D4B, 0x6D4B, 0x04A9, 0x6D4C, 0x6D4C, 0x3916, 0x6D4D, 0x6D4D, 0x16C9,
+ 0x6D4E, 0x6D4E, 0x0836, 0x6D4F, 0x6D4F, 0x16CD, 0x6D50, 0x6D50, 0x3917,
+ 0x6D51, 0x6D51, 0x0800, 0x6D52, 0x6D52, 0x16CE, 0x6D53, 0x6D53, 0x0B69,
+ 0x6D54, 0x6D54, 0x16CF, 0x6D55, 0x6D58, 0x3918, 0x6D59, 0x6D59, 0x1184,
+ 0x6D5A, 0x6D5A, 0x0930, 0x6D5B, 0x6D5B, 0x391C, 0x6D5C, 0x6D5C, 0x16D8,
+ 0x6D5D, 0x6D5D, 0x391D, 0x6D5E, 0x6D5E, 0x16D5, 0x6D5F, 0x6D5F, 0x391E,
+ 0x6D60, 0x6D60, 0x16D9, 0x6D61, 0x6D62, 0x391F, 0x6D63, 0x6D63, 0x16DB,
+ 0x6D64, 0x6D65, 0x3921, 0x6D66, 0x6D66, 0x0BF5, 0x6D67, 0x6D68, 0x3923,
+ 0x6D69, 0x6D69, 0x077D, 0x6D6A, 0x6D6A, 0x09B6, 0x6D6B, 0x6D6D, 0x3925,
+ 0x6D6E, 0x6D6E, 0x069C, 0x6D6F, 0x6D6F, 0x16D2, 0x6D70, 0x6D73, 0x3928,
+ 0x6D74, 0x6D74, 0x10E4, 0x6D75, 0x6D76, 0x392C, 0x6D77, 0x6D77, 0x075A,
+ 0x6D78, 0x6D78, 0x08CF, 0x6D79, 0x6D79, 0x23DC, 0x6D7A, 0x6D7B, 0x392E,
+ 0x6D7C, 0x6D7C, 0x16DA, 0x6D7D, 0x6D81, 0x3930, 0x6D82, 0x6D82, 0x0E70,
+ 0x6D83, 0x6D84, 0x3935, 0x6D85, 0x6D85, 0x0B5C, 0x6D86, 0x6D86, 0x3937,
+ 0x6D87, 0x6D87, 0x23DB, 0x6D88, 0x6D88, 0x0F68, 0x6D89, 0x6D89, 0x0D1F,
+ 0x6D8A, 0x6D8B, 0x3938, 0x6D8C, 0x6D8C, 0x10A4, 0x6D8D, 0x6D8D, 0x393A,
+ 0x6D8E, 0x6D8E, 0x0F3E, 0x6D8F, 0x6D90, 0x393B, 0x6D91, 0x6D91, 0x16D1,
+ 0x6D92, 0x6D92, 0x393D, 0x6D93, 0x6D94, 0x16D6, 0x6D95, 0x6D95, 0x0E3C,
+ 0x6D96, 0x6D9A, 0x393E, 0x6D9B, 0x6D9B, 0x0E21, 0x6D9C, 0x6D9C, 0x3943,
+ 0x6D9D, 0x6D9D, 0x09BF, 0x6D9E, 0x6D9E, 0x16D3, 0x6D9F, 0x6D9F, 0x09F9,
+ 0x6DA0, 0x6DA0, 0x16D4, 0x6DA1, 0x6DA1, 0x0EDF, 0x6DA2, 0x6DA2, 0x3944,
+ 0x6DA3, 0x6DA3, 0x07D6, 0x6DA4, 0x6DA4, 0x05B4, 0x6DA5, 0x6DA5, 0x3945,
+ 0x6DA6, 0x6DA6, 0x0CCE, 0x6DA7, 0x6DA7, 0x0878, 0x6DA8, 0x6DA8, 0x1168,
+ 0x6DA9, 0x6DA9, 0x0CE5, 0x6DAA, 0x6DAA, 0x069D, 0x6DAB, 0x6DAB, 0x16E8,
+ 0x6DAC, 0x6DAD, 0x3946, 0x6DAE, 0x6DAE, 0x16EA, 0x6DAF, 0x6DAF, 0x0FED,
+ 0x6DB0, 0x6DB1, 0x3948, 0x6DB2, 0x6DB2, 0x1041, 0x6DB3, 0x6DB4, 0x394A,
+ 0x6DB5, 0x6DB5, 0x0764, 0x6DB6, 0x6DB7, 0x394C, 0x6DB8, 0x6DB8, 0x078B,
+ 0x6DB9, 0x6DBE, 0x394E, 0x6DBF, 0x6DBF, 0x16E1, 0x6DC0, 0x6DC0, 0x05CE,
+ 0x6DC1, 0x6DC3, 0x3954, 0x6DC4, 0x6DC4, 0x122A, 0x6DC5, 0x6DC5, 0x16DE,
+ 0x6DC6, 0x6DC6, 0x0F6A, 0x6DC7, 0x6DC7, 0x16DD, 0x6DC8, 0x6DCA, 0x3957,
+ 0x6DCB, 0x6DCB, 0x0A25, 0x6DCC, 0x6DCC, 0x0E1D, 0x6DCD, 0x6DD0, 0x395A,
+ 0x6DD1, 0x6DD1, 0x0D7E, 0x6DD2, 0x6DD5, 0x395E, 0x6DD6, 0x6DD6, 0x0B3A,
+ 0x6DD7, 0x6DD7, 0x3962, 0x6DD8, 0x6DD8, 0x0E27, 0x6DD9, 0x6DD9, 0x16E6,
+ 0x6DDA, 0x6DDC, 0x3963, 0x6DDD, 0x6DDD, 0x16E5, 0x6DDE, 0x6DDE, 0x16DF,
+ 0x6DDF, 0x6DDF, 0x3966, 0x6DE0, 0x6DE0, 0x16E2, 0x6DE1, 0x6DE1, 0x058E,
+ 0x6DE2, 0x6DE3, 0x3967, 0x6DE4, 0x6DE4, 0x10BE, 0x6DE5, 0x6DE5, 0x3969,
+ 0x6DE6, 0x6DE6, 0x16E4, 0x6DE7, 0x6DE9, 0x396A, 0x6DEA, 0x6DEA, 0x205E,
+ 0x6DEB, 0x6DEB, 0x1080, 0x6DEC, 0x6DEC, 0x0566, 0x6DED, 0x6DED, 0x396D,
+ 0x6DEE, 0x6DEE, 0x07C9, 0x6DEF, 0x6DF0, 0x396E, 0x6DF1, 0x6DF1, 0x0D27,
+ 0x6DF2, 0x6DF2, 0x3970, 0x6DF3, 0x6DF3, 0x0541, 0x6DF4, 0x6DF4, 0x3971,
+ 0x6DF5, 0x6DF5, 0x2244, 0x6DF6, 0x6DF6, 0x23E2, 0x6DF7, 0x6DF7, 0x0801,
+ 0x6DF8, 0x6DF8, 0x3972, 0x6DF9, 0x6DF9, 0x0FF6, 0x6DFA, 0x6DFA, 0x20D4,
+ 0x6DFB, 0x6DFB, 0x0E40, 0x6DFC, 0x6DFC, 0x1A21, 0x6DFD, 0x6DFF, 0x3973,
+ 0x6E00, 0x6E04, 0x3976, 0x6E05, 0x6E05, 0x0C62, 0x6E06, 0x6E09, 0x397B,
+ 0x6E0A, 0x6E0A, 0x10EB, 0x6E0B, 0x6E0B, 0x397F, 0x6E0C, 0x6E0C, 0x16E9,
+ 0x6E0D, 0x6E0D, 0x1232, 0x6E0E, 0x6E0E, 0x16E0, 0x6E0F, 0x6E0F, 0x3980,
+ 0x6E10, 0x6E10, 0x0876, 0x6E11, 0x6E11, 0x16E3, 0x6E12, 0x6E13, 0x3981,
+ 0x6E14, 0x6E14, 0x10CB, 0x6E15, 0x6E15, 0x3983, 0x6E16, 0x6E16, 0x16E7,
+ 0x6E17, 0x6E17, 0x0D31, 0x6E18, 0x6E19, 0x3984, 0x6E1A, 0x6E1A, 0x16DC,
+ 0x6E1B, 0x6E1C, 0x3986, 0x6E1D, 0x6E1D, 0x10CA, 0x6E1E, 0x6E1F, 0x3988,
+ 0x6E20, 0x6E20, 0x0C7B, 0x6E21, 0x6E21, 0x0608, 0x6E22, 0x6E22, 0x398A,
+ 0x6E23, 0x6E23, 0x113F, 0x6E24, 0x6E24, 0x047A, 0x6E25, 0x6E25, 0x16F5,
+ 0x6E26, 0x6E26, 0x219F, 0x6E27, 0x6E28, 0x398B, 0x6E29, 0x6E29, 0x0ED1,
+ 0x6E2A, 0x6E2A, 0x398D, 0x6E2B, 0x6E2B, 0x16EB, 0x6E2C, 0x6E2C, 0x1E66,
+ 0x6E2D, 0x6E2D, 0x0ECB, 0x6E2E, 0x6E2E, 0x398E, 0x6E2F, 0x6E2F, 0x06D6,
+ 0x6E30, 0x6E31, 0x398F, 0x6E32, 0x6E32, 0x16F4, 0x6E33, 0x6E33, 0x3991,
+ 0x6E34, 0x6E34, 0x0957, 0x6E35, 0x6E37, 0x3992, 0x6E38, 0x6E38, 0x10B3,
+ 0x6E39, 0x6E39, 0x3995, 0x6E3A, 0x6E3A, 0x0AF1, 0x6E3B, 0x6E3D, 0x3996,
+ 0x6E3E, 0x6E3E, 0x1F63, 0x6E3F, 0x6E42, 0x3999, 0x6E43, 0x6E43, 0x0B89,
+ 0x6E44, 0x6E44, 0x16F6, 0x6E45, 0x6E4C, 0x399D, 0x6E4D, 0x6E4D, 0x0E75,
+ 0x6E4E, 0x6E4E, 0x16ED, 0x6E4F, 0x6E52, 0x39A5, 0x6E53, 0x6E54, 0x16F2,
+ 0x6E55, 0x6E55, 0x39A9, 0x6E56, 0x6E56, 0x07B5, 0x6E57, 0x6E57, 0x39AA,
+ 0x6E58, 0x6E58, 0x0F53, 0x6E59, 0x6E5A, 0x39AB, 0x6E5B, 0x6E5B, 0x1160,
+ 0x6E5C, 0x6E5D, 0x39AD, 0x6E5E, 0x6E5E, 0x23DD, 0x6E5F, 0x6E5F, 0x16F0,
+ 0x6E60, 0x6E6A, 0x39AF, 0x6E6B, 0x6E6B, 0x16EE, 0x6E6C, 0x6E6D, 0x39BA,
+ 0x6E6E, 0x6E6E, 0x16EC, 0x6E6F, 0x6E6F, 0x216B, 0x6E70, 0x6E7D, 0x39BC,
+ 0x6E7E, 0x6E7E, 0x0E96, 0x6E7F, 0x6E7F, 0x0D41, 0x6E80, 0x6E82, 0x39CA,
+ 0x6E83, 0x6E83, 0x098E, 0x6E84, 0x6E84, 0x39CD, 0x6E85, 0x6E85, 0x0877,
+ 0x6E86, 0x6E86, 0x16F1, 0x6E87, 0x6E88, 0x39CE, 0x6E89, 0x6E89, 0x06C3,
+ 0x6E8A, 0x6E8E, 0x39D0, 0x6E8F, 0x6E8F, 0x1705, 0x6E90, 0x6E90, 0x10F7,
+ 0x6E91, 0x6E95, 0x39D5, 0x6E96, 0x6E96, 0x22B5, 0x6E97, 0x6E97, 0x39DA,
+ 0x6E98, 0x6E98, 0x16F9, 0x6E99, 0x6E9B, 0x39DB, 0x6E9C, 0x6E9C, 0x0A38,
+ 0x6E9D, 0x6E9D, 0x1F26, 0x6E9E, 0x6E9E, 0x39DE, 0x6E9F, 0x6E9F, 0x1707,
+ 0x6EA0, 0x6EA1, 0x39DF, 0x6EA2, 0x6EA2, 0x106E, 0x6EA3, 0x6EA4, 0x39E1,
+ 0x6EA5, 0x6EA5, 0x16FD, 0x6EA6, 0x6EA6, 0x39E3, 0x6EA7, 0x6EA7, 0x16FE,
+ 0x6EA8, 0x6EA9, 0x39E4, 0x6EAA, 0x6EAA, 0x0F17, 0x6EAB, 0x6EAE, 0x39E6,
+ 0x6EAF, 0x6EAF, 0x0DD2, 0x6EB0, 0x6EB0, 0x39EA, 0x6EB1, 0x6EB1, 0x16F8,
+ 0x6EB2, 0x6EB2, 0x16EF, 0x6EB3, 0x6EB3, 0x39EB, 0x6EB4, 0x6EB4, 0x1703,
+ 0x6EB5, 0x6EB5, 0x39EC, 0x6EB6, 0x6EB6, 0x0CB7, 0x6EB7, 0x6EB7, 0x1701,
+ 0x6EB8, 0x6EB9, 0x39ED, 0x6EBA, 0x6EBA, 0x0B4A, 0x6EBB, 0x6EBB, 0x1700,
+ 0x6EBC, 0x6EBC, 0x39EF, 0x6EBD, 0x6EBD, 0x16FF, 0x6EBE, 0x6EC0, 0x39F0,
+ 0x6EC1, 0x6EC1, 0x0521, 0x6EC2, 0x6EC2, 0x1706, 0x6EC3, 0x6EC3, 0x39F3,
+ 0x6EC4, 0x6EC4, 0x1E63, 0x6EC5, 0x6EC5, 0x2088, 0x6EC6, 0x6EC6, 0x39F4,
+ 0x6EC7, 0x6EC7, 0x05C2, 0x6EC8, 0x6ECA, 0x39F5, 0x6ECB, 0x6ECB, 0x1229,
+ 0x6ECC, 0x6ECC, 0x1EBD, 0x6ECD, 0x6ECD, 0x39F8, 0x6ECE, 0x6ECE, 0x2341,
+ 0x6ECF, 0x6ECF, 0x1704, 0x6ED0, 0x6ED0, 0x39F9, 0x6ED1, 0x6ED1, 0x07C1,
+ 0x6ED2, 0x6ED2, 0x39FA, 0x6ED3, 0x6ED3, 0x122F, 0x6ED4, 0x6ED4, 0x0E22,
+ 0x6ED5, 0x6ED5, 0x19A8, 0x6ED6, 0x6ED6, 0x39FB, 0x6ED7, 0x6ED7, 0x1702,
+ 0x6ED8, 0x6ED9, 0x39FC, 0x6EDA, 0x6EDA, 0x074F, 0x6EDB, 0x6EDD, 0x39FE,
+ 0x6EDE, 0x6EDE, 0x11CC, 0x6EDF, 0x6EDF, 0x16F7, 0x6EE0, 0x6EE0, 0x16FA,
+ 0x6EE1, 0x6EE1, 0x0AA1, 0x6EE2, 0x6EE2, 0x16FC, 0x6EE3, 0x6EE3, 0x3A01,
+ 0x6EE4, 0x6EE4, 0x0A72, 0x6EE5, 0x6EE5, 0x09AF, 0x6EE6, 0x6EE6, 0x0A77,
+ 0x6EE7, 0x6EE7, 0x3A02, 0x6EE8, 0x6EE8, 0x045E, 0x6EE9, 0x6EE9, 0x0E05,
+ 0x6EEA, 0x6EEB, 0x3A03, 0x6EEC, 0x6EEC, 0x1F4B, 0x6EED, 0x6EEE, 0x3A05,
+ 0x6EEF, 0x6EEF, 0x2292, 0x6EF0, 0x6EF1, 0x3A07, 0x6EF2, 0x6EF2, 0x2124,
+ 0x6EF3, 0x6EF3, 0x3A09, 0x6EF4, 0x6EF4, 0x05AF, 0x6EF5, 0x6EF6, 0x3A0A,
+ 0x6EF7, 0x6EF7, 0x2048, 0x6EF8, 0x6EF8, 0x23E0, 0x6EF9, 0x6EF9, 0x170D,
+ 0x6EFA, 0x6EFE, 0x3A0C, 0x6EFF, 0x6EFF, 0x2077, 0x6F00, 0x6F00, 0x3A11,
+ 0x6F01, 0x6F01, 0x223A, 0x6F02, 0x6F02, 0x0BCE, 0x6F03, 0x6F05, 0x3A12,
+ 0x6F06, 0x6F06, 0x0C00, 0x6F07, 0x6F08, 0x3A15, 0x6F09, 0x6F09, 0x1713,
+ 0x6F0A, 0x6F0E, 0x3A17, 0x6F0F, 0x6F0F, 0x0A50, 0x6F10, 0x6F12, 0x3A1C,
+ 0x6F13, 0x6F13, 0x09D7, 0x6F14, 0x6F14, 0x1006, 0x6F15, 0x6F15, 0x170C,
+ 0x6F16, 0x6F19, 0x3A1F, 0x6F1A, 0x6F1A, 0x20B1, 0x6F1B, 0x6F1F, 0x3A23,
+ 0x6F20, 0x6F20, 0x0B11, 0x6F21, 0x6F21, 0x3A28, 0x6F22, 0x6F22, 0x1F41,
+ 0x6F23, 0x6F23, 0x201C, 0x6F24, 0x6F24, 0x170B, 0x6F25, 0x6F28, 0x3A29,
+ 0x6F29, 0x6F29, 0x1714, 0x6F2A, 0x6F2A, 0x1712, 0x6F2B, 0x6F2B, 0x0AA5,
+ 0x6F2C, 0x6F2C, 0x22B8, 0x6F2D, 0x6F2D, 0x16FB, 0x6F2E, 0x6F2E, 0x3A2D,
+ 0x6F2F, 0x6F2F, 0x170E, 0x6F30, 0x6F30, 0x3A2E, 0x6F31, 0x6F31, 0x0D95,
+ 0x6F32, 0x6F32, 0x2276, 0x6F33, 0x6F33, 0x1165, 0x6F34, 0x6F35, 0x3A2F,
+ 0x6F36, 0x6F36, 0x170F, 0x6F37, 0x6F37, 0x3A31, 0x6F38, 0x6F38, 0x1F9B,
+ 0x6F39, 0x6F3D, 0x3A32, 0x6F3E, 0x6F3E, 0x1023, 0x6F3F, 0x6F3F, 0x1F9F,
+ 0x6F40, 0x6F40, 0x3A37, 0x6F41, 0x6F41, 0x25CA, 0x6F42, 0x6F45, 0x3A38,
+ 0x6F46, 0x6F47, 0x1709, 0x6F48, 0x6F4A, 0x3A3C, 0x6F4B, 0x6F4B, 0x1710,
+ 0x6F4C, 0x6F4C, 0x3A3F, 0x6F4D, 0x6F4D, 0x0EBA, 0x6F4E, 0x6F50, 0x3A40,
+ 0x6F51, 0x6F51, 0x20BE, 0x6F52, 0x6F53, 0x3A43, 0x6F54, 0x6F54, 0x1FB4,
+ 0x6F55, 0x6F57, 0x3A45, 0x6F58, 0x6F58, 0x0B8C, 0x6F59, 0x6F59, 0x23D7,
+ 0x6F5A, 0x6F5B, 0x3A48, 0x6F5C, 0x6F5C, 0x0C2E, 0x6F5D, 0x6F5D, 0x3A4A,
+ 0x6F5E, 0x6F5E, 0x0A61, 0x6F5F, 0x6F61, 0x3A4B, 0x6F62, 0x6F62, 0x1708,
+ 0x6F63, 0x6F63, 0x3A4E, 0x6F64, 0x6F64, 0x2105, 0x6F65, 0x6F65, 0x3A4F,
+ 0x6F66, 0x6F66, 0x0A13, 0x6F67, 0x6F6C, 0x3A50, 0x6F6D, 0x6F6D, 0x0E09,
+ 0x6F6E, 0x6F6E, 0x04D6, 0x6F6F, 0x6F6F, 0x23E1, 0x6F70, 0x6F70, 0x1FEC,
+ 0x6F71, 0x6F71, 0x3A56, 0x6F72, 0x6F72, 0x1719, 0x6F73, 0x6F73, 0x3A57,
+ 0x6F74, 0x6F74, 0x1711, 0x6F75, 0x6F76, 0x3A58, 0x6F77, 0x6F77, 0x23EA,
+ 0x6F78, 0x6F78, 0x1718, 0x6F79, 0x6F79, 0x3A5A, 0x6F7A, 0x6F7A, 0x171B,
+ 0x6F7B, 0x6F7B, 0x3A5B, 0x6F7C, 0x6F7C, 0x171A, 0x6F7D, 0x6F7E, 0x3A5C,
+ 0x6F7F, 0x6F7F, 0x23E3, 0x6F80, 0x6F80, 0x210E, 0x6F81, 0x6F83, 0x3A5E,
+ 0x6F84, 0x6F84, 0x04F3, 0x6F85, 0x6F85, 0x3A61, 0x6F86, 0x6F86, 0x1FA6,
+ 0x6F87, 0x6F87, 0x2004, 0x6F88, 0x6F88, 0x04DF, 0x6F89, 0x6F89, 0x1715,
+ 0x6F8A, 0x6F8B, 0x3A62, 0x6F8C, 0x6F8C, 0x1717, 0x6F8D, 0x6F8D, 0x1716,
+ 0x6F8E, 0x6F8E, 0x0BAD, 0x6F8F, 0x6F96, 0x3A64, 0x6F97, 0x6F97, 0x1F9D,
+ 0x6F98, 0x6F9B, 0x3A6C, 0x6F9C, 0x6F9C, 0x09A8, 0x6F9D, 0x6F9F, 0x3A70,
+ 0x6FA0, 0x6FA0, 0x23E5, 0x6FA1, 0x6FA1, 0x112B, 0x6FA2, 0x6FA3, 0x3A73,
+ 0x6FA4, 0x6FA4, 0x2264, 0x6FA5, 0x6FA6, 0x3A75, 0x6FA7, 0x6FA7, 0x171E,
+ 0x6FA8, 0x6FA8, 0x3A77, 0x6FA9, 0x6FA9, 0x24E2, 0x6FAA, 0x6FAD, 0x3A78,
+ 0x6FAE, 0x6FAE, 0x23DE, 0x6FAF, 0x6FB0, 0x3A7C, 0x6FB1, 0x6FB1, 0x1EC4,
+ 0x6FB2, 0x6FB2, 0x3A7E, 0x6FB3, 0x6FB3, 0x03CF, 0x6FB4, 0x6FB5, 0x3A7F,
+ 0x6FB6, 0x6FB6, 0x1720, 0x6FB7, 0x6FB8, 0x3A81, 0x6FB9, 0x6FB9, 0x171F,
+ 0x6FBA, 0x6FBF, 0x3A83, 0x6FC0, 0x6FC0, 0x0817, 0x6FC1, 0x6FC1, 0x22B6,
+ 0x6FC2, 0x6FC2, 0x1721, 0x6FC3, 0x6FC3, 0x20A9, 0x6FC4, 0x6FC8, 0x3A89,
+ 0x6FC9, 0x6FC9, 0x171D, 0x6FCA, 0x6FD0, 0x3A8E, 0x6FD1, 0x6FD1, 0x171C,
+ 0x6FD2, 0x6FD2, 0x045D, 0x6FD3, 0x6FD4, 0x3A95, 0x6FD5, 0x6FD5, 0x212B,
+ 0x6FD6, 0x6FD7, 0x3A97, 0x6FD8, 0x6FD8, 0x20A5, 0x6FD9, 0x6FDA, 0x3A99,
+ 0x6FDB, 0x6FDB, 0x268B, 0x6FDC, 0x6FDD, 0x3A9B, 0x6FDE, 0x6FDE, 0x1724,
+ 0x6FDF, 0x6FDF, 0x1F76, 0x6FE0, 0x6FE0, 0x1725, 0x6FE1, 0x6FE1, 0x1722,
+ 0x6FE2, 0x6FE3, 0x3A9D, 0x6FE4, 0x6FE4, 0x216D, 0x6FE5, 0x6FEA, 0x3A9F,
+ 0x6FEB, 0x6FEB, 0x2001, 0x6FEC, 0x6FED, 0x3AA5, 0x6FEE, 0x6FEE, 0x1723,
+ 0x6FEF, 0x6FEF, 0x1726, 0x6FF0, 0x6FF0, 0x2191, 0x6FF1, 0x6FF1, 0x1E50,
+ 0x6FF2, 0x6FF9, 0x3AA7, 0x6FFA, 0x6FFA, 0x1F9C, 0x6FFB, 0x6FFB, 0x3AAF,
+ 0x6FFC, 0x6FFC, 0x23DA, 0x6FFD, 0x6FFD, 0x3AB0, 0x6FFE, 0x6FFE, 0x2053,
+ 0x6FFF, 0x6FFF, 0x3AB1, 0x7000, 0x7004, 0x3AB2, 0x7005, 0x7005, 0x23E9,
+ 0x7006, 0x7006, 0x23E4, 0x7007, 0x7008, 0x3AB7, 0x7009, 0x7009, 0x21D5,
+ 0x700A, 0x700A, 0x3AB9, 0x700B, 0x700B, 0x23E6, 0x700C, 0x700E, 0x3ABA,
+ 0x700F, 0x700F, 0x23DF, 0x7010, 0x7010, 0x3ABD, 0x7011, 0x7011, 0x0BF8,
+ 0x7012, 0x7014, 0x3ABE, 0x7015, 0x7015, 0x1E4F, 0x7016, 0x7017, 0x3AC1,
+ 0x7018, 0x7018, 0x23D9, 0x7019, 0x7019, 0x3AC3, 0x701A, 0x701A, 0x1727,
+ 0x701B, 0x701B, 0x1729, 0x701C, 0x701C, 0x3AC4, 0x701D, 0x701D, 0x2014,
+ 0x701E, 0x701E, 0x3AC5, 0x701F, 0x701F, 0x23EC, 0x7020, 0x7020, 0x23EB,
+ 0x7021, 0x7022, 0x3AC6, 0x7023, 0x7023, 0x1728, 0x7024, 0x7026, 0x3AC8,
+ 0x7027, 0x7027, 0x23D8, 0x7028, 0x7028, 0x23EE, 0x7029, 0x702F, 0x3ACB,
+ 0x7030, 0x7030, 0x268E, 0x7031, 0x7031, 0x3AD2, 0x7032, 0x7032, 0x23ED,
+ 0x7033, 0x7034, 0x3AD3, 0x7035, 0x7035, 0x172B, 0x7036, 0x7038, 0x3AD5,
+ 0x7039, 0x7039, 0x172A, 0x703A, 0x703D, 0x3AD8, 0x703E, 0x703E, 0x1FFA,
+ 0x703F, 0x7042, 0x3ADC, 0x7043, 0x7043, 0x23D6, 0x7044, 0x7044, 0x23E8,
+ 0x7045, 0x704B, 0x3AE0, 0x704C, 0x704C, 0x0739, 0x704D, 0x704E, 0x3AE7,
+ 0x704F, 0x704F, 0x172C, 0x7050, 0x7050, 0x3AE9, 0x7051, 0x7051, 0x2106,
+ 0x7052, 0x7054, 0x3AEA, 0x7055, 0x7055, 0x200B, 0x7056, 0x7057, 0x3AED,
+ 0x7058, 0x7058, 0x2166, 0x7059, 0x705C, 0x3AEF, 0x705D, 0x705D, 0x23EF,
+ 0x705E, 0x705E, 0x172D, 0x705F, 0x7062, 0x3AF3, 0x7063, 0x7063, 0x2189,
+ 0x7064, 0x7064, 0x2058, 0x7065, 0x7066, 0x3AF7, 0x7067, 0x7067, 0x23E7,
+ 0x7068, 0x706A, 0x3AF9, 0x706B, 0x706B, 0x0805, 0x706C, 0x706C, 0x19EF,
+ 0x706D, 0x706D, 0x0AF5, 0x706E, 0x706E, 0x3AFC, 0x706F, 0x706F, 0x05A7,
+ 0x7070, 0x7070, 0x07E7, 0x7071, 0x7074, 0x3AFD, 0x7075, 0x7075, 0x0A32,
+ 0x7076, 0x7076, 0x1131, 0x7077, 0x7077, 0x3B01, 0x7078, 0x7078, 0x08F3,
+ 0x7079, 0x707B, 0x3B02, 0x707C, 0x707C, 0x1223, 0x707D, 0x707D, 0x3B05,
+ 0x707E, 0x707E, 0x1119, 0x707F, 0x707F, 0x049A, 0x7080, 0x7080, 0x19CC,
+ 0x7081, 0x7084, 0x3B06, 0x7085, 0x7085, 0x1913, 0x7086, 0x7088, 0x3B0A,
+ 0x7089, 0x7089, 0x0A56, 0x708A, 0x708A, 0x0539, 0x708B, 0x708D, 0x3B0D,
+ 0x708E, 0x708E, 0x1000, 0x708F, 0x7091, 0x3B10, 0x7092, 0x7092, 0x04D9,
+ 0x7093, 0x7093, 0x3B13, 0x7094, 0x7094, 0x0C8D, 0x7095, 0x7095, 0x0948,
+ 0x7096, 0x7096, 0x19CE, 0x7097, 0x7098, 0x3B14, 0x7099, 0x7099, 0x11CA,
+ 0x709A, 0x709B, 0x3B16, 0x709C, 0x709C, 0x19CD, 0x709D, 0x709D, 0x19CF,
+ 0x709E, 0x70AA, 0x3B18, 0x70AB, 0x70AB, 0x19D3, 0x70AC, 0x70AC, 0x0915,
+ 0x70AD, 0x70AD, 0x0E12, 0x70AE, 0x70AE, 0x0B9B, 0x70AF, 0x70AF, 0x08EB,
+ 0x70B0, 0x70B0, 0x3B25, 0x70B1, 0x70B1, 0x19D4, 0x70B2, 0x70B2, 0x3B26,
+ 0x70B3, 0x70B3, 0x0467, 0x70B4, 0x70B6, 0x3B27, 0x70B7, 0x70B7, 0x19D2,
+ 0x70B8, 0x70B8, 0x1149, 0x70B9, 0x70B9, 0x05C4, 0x70BA, 0x70BA, 0x3B2A,
+ 0x70BB, 0x70BB, 0x19D0, 0x70BC, 0x70BC, 0x09FF, 0x70BD, 0x70BD, 0x0508,
+ 0x70BE, 0x70BF, 0x3B2B, 0x70C0, 0x70C0, 0x19D1, 0x70C1, 0x70C1, 0x0DAD,
+ 0x70C2, 0x70C2, 0x09AE, 0x70C3, 0x70C3, 0x0E51, 0x70C4, 0x70C7, 0x3B2D,
+ 0x70C8, 0x70C8, 0x0A1B, 0x70C9, 0x70C9, 0x3B31, 0x70CA, 0x70CA, 0x19D6,
+ 0x70CB, 0x70CE, 0x3B32, 0x70CF, 0x70CF, 0x21A3, 0x70D0, 0x70D7, 0x3B36,
+ 0x70D8, 0x70D8, 0x079D, 0x70D9, 0x70D9, 0x09BE, 0x70DA, 0x70DA, 0x3B3E,
+ 0x70DB, 0x70DB, 0x11F1, 0x70DC, 0x70DE, 0x3B3F, 0x70DF, 0x70DF, 0x0FF5,
+ 0x70E0, 0x70E3, 0x3B42, 0x70E4, 0x70E4, 0x094B, 0x70E5, 0x70E5, 0x3B46,
+ 0x70E6, 0x70E6, 0x0650, 0x70E7, 0x70E7, 0x0D0E, 0x70E8, 0x70E8, 0x19D5,
+ 0x70E9, 0x70E9, 0x07F7, 0x70EA, 0x70EA, 0x3B47, 0x70EB, 0x70EB, 0x0E1F,
+ 0x70EC, 0x70EC, 0x08CE, 0x70ED, 0x70ED, 0x0CA3, 0x70EE, 0x70EE, 0x3B48,
+ 0x70EF, 0x70EF, 0x0F16, 0x70F0, 0x70F3, 0x3B49, 0x70F4, 0x70F4, 0x217A,
+ 0x70F5, 0x70F6, 0x3B4D, 0x70F7, 0x70F7, 0x0E9A, 0x70F8, 0x70F8, 0x3B4F,
+ 0x70F9, 0x70F9, 0x0BAC, 0x70FA, 0x70FC, 0x3B50, 0x70FD, 0x70FD, 0x0686,
+ 0x70FE, 0x70FF, 0x3B53, 0x7100, 0x7108, 0x3B55, 0x7109, 0x7109, 0x0FF2,
+ 0x710A, 0x710A, 0x076F, 0x710B, 0x710F, 0x3B5E, 0x7110, 0x7110, 0x19D7,
+ 0x7111, 0x7112, 0x3B63, 0x7113, 0x7113, 0x19D8, 0x7114, 0x7114, 0x3B65,
+ 0x7115, 0x7115, 0x07D5, 0x7116, 0x7116, 0x19D9, 0x7117, 0x7117, 0x3B66,
+ 0x7118, 0x7118, 0x19F0, 0x7119, 0x7119, 0x0423, 0x711A, 0x711A, 0x0676,
+ 0x711B, 0x7120, 0x3B67, 0x7121, 0x7121, 0x21A5, 0x7122, 0x7125, 0x3B6D,
+ 0x7126, 0x7126, 0x088A, 0x7127, 0x712E, 0x3B71, 0x712F, 0x712F, 0x19DA,
+ 0x7130, 0x7130, 0x100F, 0x7131, 0x7131, 0x19DB, 0x7132, 0x7135, 0x3B79,
+ 0x7136, 0x7136, 0x0C96, 0x7137, 0x7144, 0x3B7D, 0x7145, 0x7145, 0x19DF,
+ 0x7146, 0x7148, 0x3B8B, 0x7149, 0x7149, 0x2022, 0x714A, 0x714A, 0x19E1,
+ 0x714B, 0x714B, 0x3B8E, 0x714C, 0x714C, 0x07E2, 0x714D, 0x714D, 0x3B8F,
+ 0x714E, 0x714E, 0x0858, 0x714F, 0x7151, 0x3B90, 0x7152, 0x7152, 0x24D6,
+ 0x7153, 0x715B, 0x3B93, 0x715C, 0x715C, 0x19DD, 0x715D, 0x715D, 0x3B9C,
+ 0x715E, 0x715E, 0x0CF0, 0x715F, 0x7161, 0x3B9D, 0x7162, 0x7162, 0x233A,
+ 0x7163, 0x7163, 0x3BA0, 0x7164, 0x7164, 0x0ABF, 0x7165, 0x7165, 0x3BA1,
+ 0x7166, 0x7166, 0x19F1, 0x7167, 0x7167, 0x1176, 0x7168, 0x7168, 0x19DE,
+ 0x7169, 0x7169, 0x1EEE, 0x716A, 0x716B, 0x3BA2, 0x716C, 0x716C, 0x24D5,
+ 0x716D, 0x716D, 0x3BA4, 0x716E, 0x716E, 0x11F2, 0x716F, 0x7171, 0x3BA5,
+ 0x7172, 0x7172, 0x19E0, 0x7173, 0x7173, 0x19DC, 0x7174, 0x7177, 0x3BA8,
+ 0x7178, 0x7178, 0x19E2, 0x7179, 0x7179, 0x3BAC, 0x717A, 0x717A, 0x19E3,
+ 0x717B, 0x717C, 0x3BAD, 0x717D, 0x717D, 0x0CF8, 0x717E, 0x7183, 0x3BAF,
+ 0x7184, 0x7184, 0x0F15, 0x7185, 0x7189, 0x3BB5, 0x718A, 0x718A, 0x0FA7,
+ 0x718B, 0x718E, 0x3BBA, 0x718F, 0x718F, 0x0FD5, 0x7190, 0x7191, 0x3BBE,
+ 0x7192, 0x7192, 0x2228, 0x7193, 0x7193, 0x3BC0, 0x7194, 0x7194, 0x0CB6,
+ 0x7195, 0x7196, 0x3BC1, 0x7197, 0x7197, 0x24D7, 0x7198, 0x7198, 0x19E4,
+ 0x7199, 0x7199, 0x0F04, 0x719A, 0x719E, 0x3BC3, 0x719F, 0x719F, 0x0D83,
+ 0x71A0, 0x71A0, 0x19E8, 0x71A1, 0x71A7, 0x3BC8, 0x71A8, 0x71A8, 0x19E7,
+ 0x71A9, 0x71AB, 0x3BCF, 0x71AC, 0x71AC, 0x03C9, 0x71AD, 0x71B0, 0x3BD2,
+ 0x71B1, 0x71B1, 0x20FC, 0x71B2, 0x71B2, 0x3BD6, 0x71B3, 0x71B3, 0x19E5,
+ 0x71B4, 0x71B4, 0x3BD7, 0x71B5, 0x71B5, 0x19E6, 0x71B6, 0x71B8, 0x3BD8,
+ 0x71B9, 0x71B9, 0x19F2, 0x71BA, 0x71BD, 0x3BDB, 0x71BE, 0x71BE, 0x1E87,
+ 0x71BF, 0x71C0, 0x3BDF, 0x71C1, 0x71C1, 0x24D8, 0x71C2, 0x71C2, 0x3BE1,
+ 0x71C3, 0x71C3, 0x0C97, 0x71C4, 0x71C7, 0x3BE2, 0x71C8, 0x71C8, 0x1EBA,
+ 0x71C9, 0x71CD, 0x3BE6, 0x71CE, 0x71CE, 0x0A10, 0x71CF, 0x71D1, 0x3BEB,
+ 0x71D2, 0x71D2, 0x2119, 0x71D3, 0x71D3, 0x3BEE, 0x71D4, 0x71D4, 0x19EA,
+ 0x71D5, 0x71D5, 0x1009, 0x71D6, 0x71D8, 0x3BEF, 0x71D9, 0x71D9, 0x216C,
+ 0x71DA, 0x71DB, 0x3BF2, 0x71DC, 0x71DC, 0x24D9, 0x71DD, 0x71DE, 0x3BF4,
+ 0x71DF, 0x71DF, 0x2227, 0x71E0, 0x71E0, 0x19E9, 0x71E1, 0x71E4, 0x3BF6,
+ 0x71E5, 0x71E5, 0x1132, 0x71E6, 0x71E6, 0x1E5F, 0x71E7, 0x71E7, 0x19EB,
+ 0x71E8, 0x71EC, 0x3BFA, 0x71ED, 0x71ED, 0x229F, 0x71EE, 0x71EE, 0x1396,
+ 0x71EF, 0x71F3, 0x3BFF, 0x71F4, 0x71F4, 0x1F5D, 0x71F5, 0x71F8, 0x3C04,
+ 0x71F9, 0x71F9, 0x19EC, 0x71FA, 0x71FB, 0x3C08, 0x71FC, 0x71FC, 0x1FBC,
+ 0x71FD, 0x71FD, 0x3C0A, 0x71FE, 0x71FE, 0x24DA, 0x71FF, 0x71FF, 0x3C0B,
+ 0x7200, 0x7205, 0x3C0C, 0x7206, 0x7206, 0x0415, 0x7207, 0x720C, 0x3C12,
+ 0x720D, 0x720D, 0x2149, 0x720E, 0x720F, 0x3C18, 0x7210, 0x7210, 0x2046,
+ 0x7211, 0x721A, 0x3C1A, 0x721B, 0x721B, 0x2000, 0x721C, 0x721C, 0x3C24,
+ 0x721D, 0x721D, 0x19ED, 0x721E, 0x7227, 0x3C25, 0x7228, 0x7228, 0x19EE,
+ 0x7229, 0x7229, 0x3C2F, 0x722A, 0x722A, 0x1203, 0x722B, 0x722B, 0x3C30,
+ 0x722C, 0x722C, 0x0B81, 0x722D, 0x722F, 0x3C31, 0x7230, 0x7230, 0x196C,
+ 0x7231, 0x7231, 0x03B9, 0x7232, 0x7232, 0x2190, 0x7233, 0x7234, 0x3C34,
+ 0x7235, 0x7235, 0x0923, 0x7236, 0x7236, 0x06B3, 0x7237, 0x7237, 0x1036,
+ 0x7238, 0x7238, 0x03E1, 0x7239, 0x7239, 0x05DA, 0x723A, 0x723A, 0x2208,
+ 0x723B, 0x723B, 0x1269, 0x723C, 0x723C, 0x3C36, 0x723D, 0x723D, 0x0DA1,
+ 0x723E, 0x723E, 0x1EE6, 0x723F, 0x723F, 0x169D, 0x7240, 0x7246, 0x3C37,
+ 0x7247, 0x7247, 0x0BCB, 0x7248, 0x7248, 0x03F1, 0x7249, 0x724B, 0x3C3E,
+ 0x724C, 0x724C, 0x0B87, 0x724D, 0x724D, 0x1969, 0x724E, 0x7251, 0x3C41,
+ 0x7252, 0x7252, 0x196A, 0x7253, 0x7255, 0x3C45, 0x7256, 0x7256, 0x196B,
+ 0x7257, 0x7257, 0x3C48, 0x7258, 0x7258, 0x24C3, 0x7259, 0x7259, 0x0FE9,
+ 0x725A, 0x725A, 0x3C49, 0x725B, 0x725B, 0x0B64, 0x725C, 0x725C, 0x3C4A,
+ 0x725D, 0x725D, 0x1944, 0x725E, 0x725E, 0x3C4B, 0x725F, 0x725F, 0x0B15,
+ 0x7260, 0x7260, 0x3C4C, 0x7261, 0x7261, 0x0B18, 0x7262, 0x7262, 0x09B9,
+ 0x7263, 0x7265, 0x3C4D, 0x7266, 0x7266, 0x1945, 0x7267, 0x7267, 0x0B24,
+ 0x7268, 0x7268, 0x3C50, 0x7269, 0x7269, 0x0EFE, 0x726A, 0x726D, 0x3C51,
+ 0x726E, 0x726E, 0x1942, 0x726F, 0x726F, 0x1946, 0x7270, 0x7271, 0x3C55,
+ 0x7272, 0x7272, 0x0D35, 0x7273, 0x7274, 0x3C57, 0x7275, 0x7275, 0x0C20,
+ 0x7276, 0x7278, 0x3C59, 0x7279, 0x7279, 0x0E2B, 0x727A, 0x727A, 0x0F0D,
+ 0x727B, 0x727C, 0x3C5C, 0x727D, 0x727D, 0x20CC, 0x727E, 0x727F, 0x1947,
+ 0x7280, 0x7280, 0x0F19, 0x7281, 0x7281, 0x09D2, 0x7282, 0x7283, 0x3C5E,
+ 0x7284, 0x7284, 0x1949, 0x7285, 0x7289, 0x3C60, 0x728A, 0x728A, 0x05FE,
+ 0x728B, 0x728B, 0x194A, 0x728C, 0x728C, 0x3C65, 0x728D, 0x728D, 0x194B,
+ 0x728E, 0x728E, 0x3C66, 0x728F, 0x728F, 0x194C, 0x7290, 0x7291, 0x3C67,
+ 0x7292, 0x7292, 0x194D, 0x7293, 0x7295, 0x3C69, 0x7296, 0x7296, 0x2340,
+ 0x7297, 0x729E, 0x3C6C, 0x729F, 0x729F, 0x1943, 0x72A0, 0x72A1, 0x3C74,
+ 0x72A2, 0x72A2, 0x1ED1, 0x72A3, 0x72A6, 0x3C76, 0x72A7, 0x72A7, 0x21AC,
+ 0x72A8, 0x72AB, 0x3C7A, 0x72AC, 0x72AC, 0x0C89, 0x72AD, 0x72AD, 0x15EF,
+ 0x72AE, 0x72AE, 0x3C7E, 0x72AF, 0x72AF, 0x0655, 0x72B0, 0x72B0, 0x15F0,
+ 0x72B1, 0x72B3, 0x3C7F, 0x72B4, 0x72B4, 0x15F1, 0x72B5, 0x72B5, 0x3C82,
+ 0x72B6, 0x72B6, 0x1211, 0x72B7, 0x72B8, 0x15F2, 0x72B9, 0x72B9, 0x10B1,
+ 0x72BA, 0x72BF, 0x3C83, 0x72C0, 0x72C0, 0x22AF, 0x72C1, 0x72C1, 0x15F5,
+ 0x72C2, 0x72C2, 0x097E, 0x72C3, 0x72C3, 0x15F4, 0x72C4, 0x72C4, 0x05B3,
+ 0x72C5, 0x72C7, 0x3C89, 0x72C8, 0x72C8, 0x0420, 0x72C9, 0x72CC, 0x3C8C,
+ 0x72CD, 0x72CD, 0x15F7, 0x72CE, 0x72CE, 0x15F6, 0x72CF, 0x72CF, 0x3C90,
+ 0x72D0, 0x72D0, 0x07B3, 0x72D1, 0x72D1, 0x3C91, 0x72D2, 0x72D2, 0x15F8,
+ 0x72D3, 0x72D6, 0x3C92, 0x72D7, 0x72D7, 0x0710, 0x72D8, 0x72D8, 0x3C96,
+ 0x72D9, 0x72D9, 0x0900, 0x72DA, 0x72DD, 0x3C97, 0x72DE, 0x72DE, 0x0B5F,
+ 0x72DF, 0x72DF, 0x3C9B, 0x72E0, 0x72E0, 0x0794, 0x72E1, 0x72E1, 0x0897,
+ 0x72E2, 0x72E7, 0x3C9C, 0x72E8, 0x72E8, 0x15F9, 0x72E9, 0x72E9, 0x15FB,
+ 0x72EA, 0x72EB, 0x3CA2, 0x72EC, 0x72EC, 0x05FF, 0x72ED, 0x72ED, 0x0F2E,
+ 0x72EE, 0x72EE, 0x0D3F, 0x72EF, 0x72EF, 0x15FA, 0x72F0, 0x72F0, 0x1199,
+ 0x72F1, 0x72F1, 0x10E1, 0x72F2, 0x72F2, 0x15FC, 0x72F3, 0x72F3, 0x1600,
+ 0x72F4, 0x72F4, 0x15FD, 0x72F5, 0x72F6, 0x3CA4, 0x72F7, 0x72F7, 0x15FE,
+ 0x72F8, 0x72F8, 0x09D5, 0x72F9, 0x72F9, 0x21B6, 0x72FA, 0x72FB, 0x1602,
+ 0x72FC, 0x72FC, 0x09B2, 0x72FD, 0x72FD, 0x1E3D, 0x72FE, 0x72FF, 0x3CA6,
+ 0x7300, 0x7300, 0x3CA8, 0x7301, 0x7301, 0x15FF, 0x7302, 0x7302, 0x3CA9,
+ 0x7303, 0x7303, 0x1601, 0x7304, 0x7309, 0x3CAA, 0x730A, 0x730A, 0x1607,
+ 0x730B, 0x730D, 0x3CB0, 0x730E, 0x730E, 0x0A1D, 0x730F, 0x7312, 0x3CB3,
+ 0x7313, 0x7313, 0x1605, 0x7314, 0x7314, 0x3CB7, 0x7315, 0x7315, 0x160A,
+ 0x7316, 0x7316, 0x04C5, 0x7317, 0x7317, 0x1604, 0x7318, 0x731A, 0x3CB8,
+ 0x731B, 0x731B, 0x0AD2, 0x731C, 0x731C, 0x0489, 0x731D, 0x731D, 0x1609,
+ 0x731E, 0x731E, 0x1608, 0x731F, 0x7320, 0x3CBB, 0x7321, 0x7321, 0x1606,
+ 0x7322, 0x7322, 0x160B, 0x7323, 0x7324, 0x3CBD, 0x7325, 0x7325, 0x160D,
+ 0x7326, 0x7328, 0x3CBF, 0x7329, 0x7329, 0x0F94, 0x732A, 0x732A, 0x11EC,
+ 0x732B, 0x732B, 0x0AAD, 0x732C, 0x732C, 0x160E, 0x732D, 0x732D, 0x3CC2,
+ 0x732E, 0x732E, 0x0F44, 0x732F, 0x7330, 0x3CC3, 0x7331, 0x7331, 0x1610,
+ 0x7332, 0x7333, 0x3CC5, 0x7334, 0x7334, 0x07A6, 0x7335, 0x7335, 0x3CC7,
+ 0x7336, 0x7336, 0x2235, 0x7337, 0x7337, 0x18D4, 0x7338, 0x7338, 0x160F,
+ 0x7339, 0x7339, 0x160C, 0x733A, 0x733A, 0x3CC8, 0x733B, 0x733B, 0x2397,
+ 0x733C, 0x733D, 0x3CC9, 0x733E, 0x733E, 0x07C0, 0x733F, 0x733F, 0x10F6,
+ 0x7340, 0x7340, 0x3CCB, 0x7341, 0x7341, 0x2395, 0x7342, 0x7343, 0x3CCC,
+ 0x7344, 0x7344, 0x223F, 0x7345, 0x7345, 0x212A, 0x7346, 0x734C, 0x3CCE,
+ 0x734D, 0x734D, 0x1612, 0x734E, 0x734F, 0x3CD5, 0x7350, 0x7350, 0x1611,
+ 0x7351, 0x7351, 0x3CD7, 0x7352, 0x7352, 0x18D5, 0x7353, 0x7356, 0x3CD8,
+ 0x7357, 0x7357, 0x1613, 0x7358, 0x735F, 0x3CDC, 0x7360, 0x7360, 0x1614,
+ 0x7361, 0x7367, 0x3CE4, 0x7368, 0x7368, 0x1ED2, 0x7369, 0x7369, 0x3CEB,
+ 0x736A, 0x736A, 0x2396, 0x736B, 0x736B, 0x2398, 0x736C, 0x736C, 0x1615,
+ 0x736D, 0x736D, 0x0DF4, 0x736E, 0x736E, 0x3CEC, 0x736F, 0x736F, 0x1616,
+ 0x7370, 0x7370, 0x20A2, 0x7371, 0x7371, 0x3CED, 0x7372, 0x7372, 0x1F64,
+ 0x7373, 0x7374, 0x3CEE, 0x7375, 0x7375, 0x202B, 0x7376, 0x7376, 0x3CF0,
+ 0x7377, 0x7377, 0x2394, 0x7378, 0x7378, 0x2139, 0x7379, 0x7379, 0x3CF1,
+ 0x737A, 0x737A, 0x215F, 0x737B, 0x737B, 0x21C1, 0x737C, 0x737C, 0x239A,
+ 0x737D, 0x737D, 0x3CF2, 0x737E, 0x737E, 0x1617, 0x737F, 0x737F, 0x3CF3,
+ 0x7380, 0x7380, 0x2399, 0x7381, 0x7383, 0x3CF4, 0x7384, 0x7384, 0x0FC9,
+ 0x7385, 0x7386, 0x3CF7, 0x7387, 0x7387, 0x0A71, 0x7388, 0x7388, 0x3CF9,
+ 0x7389, 0x7389, 0x10D6, 0x738A, 0x738A, 0x3CFA, 0x738B, 0x738B, 0x0EA6,
+ 0x738C, 0x738D, 0x3CFB, 0x738E, 0x738E, 0x1818, 0x738F, 0x7390, 0x3CFD,
+ 0x7391, 0x7391, 0x1819, 0x7392, 0x7395, 0x3CFF, 0x7396, 0x7396, 0x08F0,
+ 0x7397, 0x739A, 0x3D03, 0x739B, 0x739B, 0x0A91, 0x739C, 0x739E, 0x3D07,
+ 0x739F, 0x739F, 0x181C, 0x73A0, 0x73A1, 0x3D0A, 0x73A2, 0x73A2, 0x181B,
+ 0x73A3, 0x73A8, 0x3D0C, 0x73A9, 0x73A9, 0x0E97, 0x73AA, 0x73AA, 0x3D12,
+ 0x73AB, 0x73AB, 0x0ABA, 0x73AC, 0x73AD, 0x3D13, 0x73AE, 0x73AE, 0x181A,
+ 0x73AF, 0x73AF, 0x07CC, 0x73B0, 0x73B0, 0x0F43, 0x73B1, 0x73B1, 0x3D15,
+ 0x73B2, 0x73B2, 0x0A2A, 0x73B3, 0x73B3, 0x1821, 0x73B4, 0x73B6, 0x3D16,
+ 0x73B7, 0x73B7, 0x1820, 0x73B8, 0x73B9, 0x3D19, 0x73BA, 0x73BA, 0x182C,
+ 0x73BB, 0x73BB, 0x046A, 0x73BC, 0x73BF, 0x3D1B, 0x73C0, 0x73C0, 0x1822,
+ 0x73C1, 0x73C1, 0x3D1F, 0x73C2, 0x73C2, 0x181E, 0x73C3, 0x73C7, 0x3D20,
+ 0x73C8, 0x73C8, 0x1824, 0x73C9, 0x73C9, 0x1823, 0x73CA, 0x73CA, 0x0CF3,
+ 0x73CB, 0x73CC, 0x3D25, 0x73CD, 0x73CD, 0x1185, 0x73CE, 0x73CE, 0x3D27,
+ 0x73CF, 0x73CF, 0x181D, 0x73D0, 0x73D0, 0x0646, 0x73D1, 0x73D1, 0x181F,
+ 0x73D2, 0x73D8, 0x3D28, 0x73D9, 0x73D9, 0x1826, 0x73DA, 0x73DD, 0x3D2F,
+ 0x73DE, 0x73DE, 0x182B, 0x73DF, 0x73DF, 0x3D33, 0x73E0, 0x73E0, 0x11E8,
+ 0x73E1, 0x73E4, 0x3D34, 0x73E5, 0x73E5, 0x1825, 0x73E6, 0x73E6, 0x3D38,
+ 0x73E7, 0x73E7, 0x182A, 0x73E8, 0x73E8, 0x3D39, 0x73E9, 0x73E9, 0x1829,
+ 0x73EA, 0x73EC, 0x3D3A, 0x73ED, 0x73ED, 0x03EB, 0x73EE, 0x73F1, 0x3D3D,
+ 0x73F2, 0x73F2, 0x182D, 0x73F3, 0x73FD, 0x3D41, 0x73FE, 0x73FE, 0x21C0,
+ 0x73FF, 0x73FF, 0x3D4C, 0x7400, 0x7402, 0x3D4D, 0x7403, 0x7403, 0x0C6F,
+ 0x7404, 0x7404, 0x3D50, 0x7405, 0x7405, 0x09B0, 0x7406, 0x7406, 0x09D8,
+ 0x7407, 0x7408, 0x3D51, 0x7409, 0x7409, 0x0A39, 0x740A, 0x740A, 0x1828,
+ 0x740B, 0x740E, 0x3D53, 0x740F, 0x740F, 0x182E, 0x7410, 0x7410, 0x0DEB,
+ 0x7411, 0x7419, 0x3D57, 0x741A, 0x741A, 0x1838, 0x741B, 0x741B, 0x1837,
+ 0x741C, 0x7421, 0x3D60, 0x7422, 0x7422, 0x121E, 0x7423, 0x7424, 0x3D66,
+ 0x7425, 0x7425, 0x1832, 0x7426, 0x7426, 0x1831, 0x7427, 0x7427, 0x3D68,
+ 0x7428, 0x7428, 0x1833, 0x7429, 0x7429, 0x3D69, 0x742A, 0x742A, 0x182F,
+ 0x742B, 0x742B, 0x3D6A, 0x742C, 0x742C, 0x1836, 0x742D, 0x742D, 0x3D6B,
+ 0x742E, 0x742E, 0x1835, 0x742F, 0x742F, 0x3D6C, 0x7430, 0x7430, 0x1834,
+ 0x7431, 0x7432, 0x3D6D, 0x7433, 0x7433, 0x0A1E, 0x7434, 0x7434, 0x0C56,
+ 0x7435, 0x7435, 0x0BBE, 0x7436, 0x7436, 0x0B84, 0x7437, 0x743B, 0x3D6F,
+ 0x743C, 0x743C, 0x0C6A, 0x743D, 0x743E, 0x3D74, 0x743F, 0x743F, 0x2460,
+ 0x7440, 0x7440, 0x3D76, 0x7441, 0x7441, 0x1839, 0x7442, 0x744A, 0x3D77,
+ 0x744B, 0x744B, 0x245C, 0x744C, 0x7454, 0x3D80, 0x7455, 0x7455, 0x183C,
+ 0x7456, 0x7456, 0x3D89, 0x7457, 0x7457, 0x183B, 0x7458, 0x7458, 0x3D8A,
+ 0x7459, 0x7459, 0x183D, 0x745A, 0x745A, 0x07AE, 0x745B, 0x745B, 0x1830,
+ 0x745C, 0x745C, 0x183A, 0x745D, 0x745D, 0x3D8B, 0x745E, 0x745E, 0x0CCB,
+ 0x745F, 0x745F, 0x0CE3, 0x7460, 0x7462, 0x3D8C, 0x7463, 0x7463, 0x215D,
+ 0x7464, 0x7468, 0x3D8F, 0x7469, 0x7469, 0x2225, 0x746A, 0x746A, 0x206A,
+ 0x746B, 0x746C, 0x3D94, 0x746D, 0x746D, 0x183F, 0x746E, 0x746F, 0x3D96,
+ 0x7470, 0x7470, 0x073E, 0x7471, 0x7475, 0x3D98, 0x7476, 0x7476, 0x1027,
+ 0x7477, 0x7477, 0x183E, 0x7478, 0x747D, 0x3D9D, 0x747E, 0x747E, 0x1840,
+ 0x747F, 0x747F, 0x3DA3, 0x7480, 0x7481, 0x1843, 0x7482, 0x7482, 0x3DA4,
+ 0x7483, 0x7483, 0x09F0, 0x7484, 0x7486, 0x3DA5, 0x7487, 0x7487, 0x1845,
+ 0x7488, 0x7488, 0x3DA8, 0x7489, 0x7489, 0x2461, 0x748A, 0x748A, 0x3DA9,
+ 0x748B, 0x748B, 0x1846, 0x748C, 0x748D, 0x3DAA, 0x748E, 0x748E, 0x1842,
+ 0x748F, 0x748F, 0x3DAC, 0x7490, 0x7490, 0x184A, 0x7491, 0x749B, 0x3DAD,
+ 0x749C, 0x749C, 0x1841, 0x749D, 0x749D, 0x3DB8, 0x749E, 0x749E, 0x1847,
+ 0x749F, 0x74A2, 0x3DB9, 0x74A3, 0x74A3, 0x245B, 0x74A4, 0x74A5, 0x3DBD,
+ 0x74A6, 0x74A6, 0x2462, 0x74A7, 0x74A7, 0x184B, 0x74A8, 0x74A9, 0x1848,
+ 0x74AA, 0x74AF, 0x3DBF, 0x74B0, 0x74B0, 0x1F54, 0x74B1, 0x74B9, 0x3DC5,
+ 0x74BA, 0x74BA, 0x184D, 0x74BB, 0x74BC, 0x3DCE, 0x74BD, 0x74BD, 0x245F,
+ 0x74BE, 0x74C9, 0x3DD0, 0x74CA, 0x74CA, 0x20EC, 0x74CB, 0x74CE, 0x3DDC,
+ 0x74CF, 0x74CF, 0x245D, 0x74D0, 0x74D1, 0x3DE0, 0x74D2, 0x74D2, 0x184C,
+ 0x74D3, 0x74D3, 0x3DE2, 0x74D4, 0x74D4, 0x2463, 0x74D5, 0x74D9, 0x3DE3,
+ 0x74DA, 0x74DA, 0x2464, 0x74DB, 0x74DB, 0x3DE8, 0x74DC, 0x74DC, 0x0728,
+ 0x74DD, 0x74DD, 0x3DE9, 0x74DE, 0x74DE, 0x1B32, 0x74DF, 0x74DF, 0x3DEA,
+ 0x74E0, 0x74E0, 0x1B33, 0x74E1, 0x74E1, 0x3DEB, 0x74E2, 0x74E2, 0x0BCF,
+ 0x74E3, 0x74E3, 0x03F5, 0x74E4, 0x74E4, 0x0C9A, 0x74E5, 0x74E5, 0x3DEC,
+ 0x74E6, 0x74E6, 0x0E90, 0x74E7, 0x74ED, 0x3DED, 0x74EE, 0x74EE, 0x0EDC,
+ 0x74EF, 0x74EF, 0x1903, 0x74F0, 0x74F3, 0x3DF4, 0x74F4, 0x74F4, 0x1904,
+ 0x74F5, 0x74F5, 0x3DF8, 0x74F6, 0x74F6, 0x0BDE, 0x74F7, 0x74F7, 0x054C,
+ 0x74F8, 0x74FE, 0x3DF9, 0x74FF, 0x74FF, 0x1905, 0x7500, 0x7503, 0x3E00,
+ 0x7504, 0x7504, 0x1188, 0x7505, 0x750B, 0x3E04, 0x750C, 0x750C, 0x24A5,
+ 0x750D, 0x750D, 0x1485, 0x750E, 0x750E, 0x3E0B, 0x750F, 0x750F, 0x1906,
+ 0x7510, 0x7510, 0x3E0C, 0x7511, 0x7511, 0x1907, 0x7512, 0x7512, 0x3E0D,
+ 0x7513, 0x7513, 0x1908, 0x7514, 0x7517, 0x3E0E, 0x7518, 0x7518, 0x06C5,
+ 0x7519, 0x7519, 0x14F8, 0x751A, 0x751A, 0x0D2E, 0x751B, 0x751B, 0x3E12,
+ 0x751C, 0x751C, 0x0E43, 0x751D, 0x751E, 0x3E13, 0x751F, 0x751F, 0x0D33,
+ 0x7520, 0x7522, 0x3E15, 0x7523, 0x7523, 0x1E70, 0x7524, 0x7524, 0x3E18,
+ 0x7525, 0x7525, 0x0D34, 0x7526, 0x7527, 0x3E19, 0x7528, 0x7528, 0x10A8,
+ 0x7529, 0x7529, 0x0D9B, 0x752A, 0x752A, 0x3E1B, 0x752B, 0x752B, 0x06A1,
+ 0x752C, 0x752C, 0x1B34, 0x752D, 0x752D, 0x042B, 0x752E, 0x752E, 0x3E1C,
+ 0x752F, 0x752F, 0x1734, 0x7530, 0x7530, 0x0E42, 0x7531, 0x7531, 0x10AE,
+ 0x7532, 0x7532, 0x084A, 0x7533, 0x7533, 0x0D23, 0x7534, 0x7534, 0x3E1D,
+ 0x7535, 0x7535, 0x05C8, 0x7536, 0x7536, 0x3E1E, 0x7537, 0x7537, 0x0B33,
+ 0x7538, 0x7538, 0x05CA, 0x7539, 0x7539, 0x3E1F, 0x753A, 0x753A, 0x1A78,
+ 0x753B, 0x753B, 0x07C2, 0x753C, 0x753D, 0x3E20, 0x753E, 0x753E, 0x1816,
+ 0x753F, 0x753F, 0x3E22, 0x7540, 0x7540, 0x1A79, 0x7541, 0x7544, 0x3E23,
+ 0x7545, 0x7545, 0x04CE, 0x7546, 0x7547, 0x3E27, 0x7548, 0x7548, 0x1A7C,
+ 0x7549, 0x754A, 0x3E29, 0x754B, 0x754B, 0x1A7B, 0x754C, 0x754C, 0x08B8,
+ 0x754D, 0x754D, 0x3E2B, 0x754E, 0x754E, 0x1A7A, 0x754F, 0x754F, 0x0EC6,
+ 0x7550, 0x7553, 0x3E2C, 0x7554, 0x7554, 0x0B90, 0x7555, 0x7558, 0x3E30,
+ 0x7559, 0x7559, 0x0A3D, 0x755A, 0x755A, 0x139E, 0x755B, 0x755B, 0x1A7D,
+ 0x755C, 0x755C, 0x0FBE, 0x755D, 0x755D, 0x208F, 0x755E, 0x7561, 0x3E34,
+ 0x7562, 0x7562, 0x1E42, 0x7563, 0x7564, 0x3E38, 0x7565, 0x7565, 0x0A7B,
+ 0x7566, 0x7566, 0x0C07, 0x7567, 0x7569, 0x3E3A, 0x756A, 0x756A, 0x0649,
+ 0x756B, 0x756B, 0x1F4E, 0x756C, 0x7571, 0x3E3D, 0x7572, 0x7572, 0x1A7E,
+ 0x7573, 0x7573, 0x3E43, 0x7574, 0x7574, 0x0510, 0x7575, 0x7575, 0x3E44,
+ 0x7576, 0x7576, 0x1EB1, 0x7577, 0x7577, 0x3E45, 0x7578, 0x7578, 0x0810,
+ 0x7579, 0x7579, 0x1A7F, 0x757A, 0x757E, 0x3E46, 0x757F, 0x757F, 0x1814,
+ 0x7580, 0x7582, 0x3E4B, 0x7583, 0x7583, 0x1A80, 0x7584, 0x7585, 0x3E4E,
+ 0x7586, 0x7586, 0x087F, 0x7587, 0x7587, 0x1E8B, 0x7588, 0x758A, 0x3E50,
+ 0x758B, 0x758B, 0x1BC6, 0x758C, 0x758E, 0x3E53, 0x758F, 0x758F, 0x0D7F,
+ 0x7590, 0x7590, 0x3E56, 0x7591, 0x7591, 0x1050, 0x7592, 0x7592, 0x1B60,
+ 0x7593, 0x7593, 0x3E57, 0x7594, 0x7594, 0x1B61, 0x7595, 0x7595, 0x3E58,
+ 0x7596, 0x7596, 0x1B62, 0x7597, 0x7597, 0x0A0F, 0x7598, 0x7598, 0x3E59,
+ 0x7599, 0x7599, 0x06E8, 0x759A, 0x759A, 0x08FD, 0x759B, 0x759C, 0x3E5A,
+ 0x759D, 0x759D, 0x1B64, 0x759E, 0x759E, 0x3E5C, 0x759F, 0x759F, 0x0B72,
+ 0x75A0, 0x75A0, 0x1B63, 0x75A1, 0x75A1, 0x101A, 0x75A2, 0x75A2, 0x3E5D,
+ 0x75A3, 0x75A3, 0x1B66, 0x75A4, 0x75A4, 0x03D7, 0x75A5, 0x75A5, 0x08BB,
+ 0x75A6, 0x75AA, 0x3E5E, 0x75AB, 0x75AB, 0x1066, 0x75AC, 0x75AC, 0x1B65,
+ 0x75AD, 0x75AD, 0x3E63, 0x75AE, 0x75AE, 0x0532, 0x75AF, 0x75AF, 0x0685,
+ 0x75B0, 0x75B0, 0x1B6C, 0x75B1, 0x75B1, 0x1B6B, 0x75B2, 0x75B2, 0x0BC2,
+ 0x75B3, 0x75B4, 0x1B67, 0x75B5, 0x75B5, 0x0546, 0x75B6, 0x75B7, 0x3E64,
+ 0x75B8, 0x75B8, 0x1B69, 0x75B9, 0x75B9, 0x118F, 0x75BA, 0x75BB, 0x3E66,
+ 0x75BC, 0x75BC, 0x0E2E, 0x75BD, 0x75BD, 0x0901, 0x75BE, 0x75BE, 0x0825,
+ 0x75BF, 0x75C1, 0x3E68, 0x75C2, 0x75C2, 0x1B6E, 0x75C3, 0x75C3, 0x1B6D,
+ 0x75C4, 0x75C4, 0x1B6A, 0x75C5, 0x75C5, 0x0468, 0x75C6, 0x75C6, 0x3E6B,
+ 0x75C7, 0x75C7, 0x11A1, 0x75C8, 0x75C8, 0x109D, 0x75C9, 0x75C9, 0x08E6,
+ 0x75CA, 0x75CA, 0x0C87, 0x75CB, 0x75CC, 0x3E6C, 0x75CD, 0x75CD, 0x1B70,
+ 0x75CE, 0x75D1, 0x3E6E, 0x75D2, 0x75D2, 0x1020, 0x75D3, 0x75D3, 0x3E72,
+ 0x75D4, 0x75D4, 0x11CB, 0x75D5, 0x75D5, 0x0792, 0x75D6, 0x75D6, 0x1B6F,
+ 0x75D7, 0x75D7, 0x3E73, 0x75D8, 0x75D8, 0x05FA, 0x75D9, 0x75D9, 0x1FC6,
+ 0x75DA, 0x75DA, 0x3E74, 0x75DB, 0x75DB, 0x0E65, 0x75DC, 0x75DD, 0x3E75,
+ 0x75DE, 0x75DE, 0x0BC5, 0x75DF, 0x75E1, 0x3E77, 0x75E2, 0x75E2, 0x09EA,
+ 0x75E3, 0x75E3, 0x1B71, 0x75E4, 0x75E4, 0x1B74, 0x75E5, 0x75E5, 0x3E7A,
+ 0x75E6, 0x75E6, 0x1B73, 0x75E7, 0x75E7, 0x1B76, 0x75E8, 0x75E8, 0x1B72,
+ 0x75E9, 0x75E9, 0x3E7B, 0x75EA, 0x75EA, 0x07D3, 0x75EB, 0x75EB, 0x1B75,
+ 0x75EC, 0x75EF, 0x3E7C, 0x75F0, 0x75F0, 0x0E08, 0x75F1, 0x75F1, 0x1B78,
+ 0x75F2, 0x75F3, 0x3E80, 0x75F4, 0x75F4, 0x04FA, 0x75F5, 0x75F8, 0x3E82,
+ 0x75F9, 0x75F9, 0x043D, 0x75FA, 0x75FB, 0x3E86, 0x75FC, 0x75FC, 0x1B79,
+ 0x75FD, 0x75FE, 0x3E88, 0x75FF, 0x75FF, 0x1B7A, 0x7600, 0x7600, 0x1B7C,
+ 0x7601, 0x7601, 0x0564, 0x7602, 0x7602, 0x25AE, 0x7603, 0x7603, 0x1B77,
+ 0x7604, 0x7604, 0x3E8A, 0x7605, 0x7605, 0x1B7D, 0x7606, 0x7609, 0x3E8B,
+ 0x760A, 0x760A, 0x1B80, 0x760B, 0x760B, 0x1F01, 0x760C, 0x760C, 0x1B7E,
+ 0x760D, 0x760D, 0x2200, 0x760E, 0x760F, 0x3E8F, 0x7610, 0x7610, 0x1B7B,
+ 0x7611, 0x7614, 0x3E91, 0x7615, 0x7615, 0x1B83, 0x7616, 0x7616, 0x3E95,
+ 0x7617, 0x7617, 0x1B7F, 0x7618, 0x7618, 0x1B82, 0x7619, 0x7619, 0x1B84,
+ 0x761A, 0x761A, 0x3E96, 0x761B, 0x761B, 0x1B85, 0x761C, 0x761D, 0x3E97,
+ 0x761E, 0x761E, 0x25B2, 0x761F, 0x761F, 0x0ED0, 0x7620, 0x7620, 0x1B88,
+ 0x7621, 0x7621, 0x1E97, 0x7622, 0x7622, 0x1B87, 0x7623, 0x7623, 0x3E99,
+ 0x7624, 0x7624, 0x0A3F, 0x7625, 0x7625, 0x1B81, 0x7626, 0x7626, 0x0D74,
+ 0x7627, 0x7627, 0x20AB, 0x7628, 0x7628, 0x3E9A, 0x7629, 0x7629, 0x0574,
+ 0x762A, 0x762A, 0x045A, 0x762B, 0x762B, 0x0E04, 0x762C, 0x762C, 0x3E9B,
+ 0x762D, 0x762D, 0x1B8A, 0x762E, 0x762F, 0x3E9C, 0x7630, 0x7630, 0x1B8B,
+ 0x7631, 0x7632, 0x3E9E, 0x7633, 0x7633, 0x1B90, 0x7634, 0x7634, 0x116F,
+ 0x7635, 0x7635, 0x1B8D, 0x7636, 0x7637, 0x3EA0, 0x7638, 0x7638, 0x0C8E,
+ 0x7639, 0x763A, 0x3EA2, 0x763B, 0x763B, 0x25B3, 0x763C, 0x763C, 0x1B86,
+ 0x763D, 0x763D, 0x3EA4, 0x763E, 0x763E, 0x1B8F, 0x763F, 0x763F, 0x1B8C,
+ 0x7640, 0x7640, 0x1B89, 0x7641, 0x7641, 0x3EA5, 0x7642, 0x7642, 0x2028,
+ 0x7643, 0x7643, 0x1B8E, 0x7644, 0x7645, 0x3EA6, 0x7646, 0x7647, 0x25AF,
+ 0x7648, 0x7648, 0x3EA8, 0x7649, 0x7649, 0x25B1, 0x764A, 0x764B, 0x3EA9,
+ 0x764C, 0x764C, 0x03B4, 0x764D, 0x764D, 0x1B91, 0x764E, 0x7653, 0x3EAB,
+ 0x7654, 0x7654, 0x1B93, 0x7655, 0x7655, 0x3EB1, 0x7656, 0x7656, 0x1B95,
+ 0x7657, 0x7657, 0x3EB2, 0x7658, 0x7658, 0x25AC, 0x7659, 0x765B, 0x3EB3,
+ 0x765C, 0x765C, 0x1B94, 0x765D, 0x765D, 0x3EB6, 0x765E, 0x765E, 0x1B92,
+ 0x765F, 0x765F, 0x1E4E, 0x7660, 0x7661, 0x3EB7, 0x7662, 0x7662, 0x2202,
+ 0x7663, 0x7663, 0x0FCB, 0x7664, 0x7664, 0x25AB, 0x7665, 0x7665, 0x2286,
+ 0x7666, 0x7666, 0x3EB9, 0x7667, 0x7667, 0x25AD, 0x7668, 0x7668, 0x3EBA,
+ 0x7669, 0x7669, 0x25B6, 0x766A, 0x766A, 0x3EBB, 0x766B, 0x766B, 0x1B96,
+ 0x766C, 0x766C, 0x21E3, 0x766D, 0x766E, 0x25B4, 0x766F, 0x766F, 0x1B97,
+ 0x7670, 0x7670, 0x222F, 0x7671, 0x7671, 0x2165, 0x7672, 0x7672, 0x25B7,
+ 0x7673, 0x7677, 0x3EBC, 0x7678, 0x7678, 0x0748, 0x7679, 0x767A, 0x3EC1,
+ 0x767B, 0x767B, 0x05A8, 0x767C, 0x767C, 0x1EE9, 0x767D, 0x767D, 0x03E2,
+ 0x767E, 0x767E, 0x03E4, 0x767F, 0x7681, 0x3EC3, 0x7682, 0x7682, 0x1130,
+ 0x7683, 0x7683, 0x3EC6, 0x7684, 0x7684, 0x05A5, 0x7685, 0x7685, 0x3EC7,
+ 0x7686, 0x7686, 0x08A5, 0x7687, 0x7687, 0x07DF, 0x7688, 0x7688, 0x1B2D,
+ 0x7689, 0x768A, 0x3EC8, 0x768B, 0x768B, 0x06D9, 0x768C, 0x768D, 0x3ECA,
+ 0x768E, 0x768E, 0x1B2E, 0x768F, 0x7690, 0x3ECC, 0x7691, 0x7691, 0x03B3,
+ 0x7692, 0x7692, 0x3ECE, 0x7693, 0x7693, 0x1B2F, 0x7694, 0x7695, 0x3ECF,
+ 0x7696, 0x7696, 0x0E9F, 0x7697, 0x7698, 0x3ED1, 0x7699, 0x7699, 0x1B30,
+ 0x769A, 0x769A, 0x1E25, 0x769B, 0x76A3, 0x3ED3, 0x76A4, 0x76A4, 0x1B31,
+ 0x76A5, 0x76AD, 0x3EDC, 0x76AE, 0x76AE, 0x0BC3, 0x76AF, 0x76B0, 0x3EE5,
+ 0x76B1, 0x76B1, 0x11E4, 0x76B2, 0x76B2, 0x1BC8, 0x76B3, 0x76B3, 0x3EE7,
+ 0x76B4, 0x76B4, 0x1BC9, 0x76B5, 0x76B7, 0x3EE8, 0x76B8, 0x76B8, 0x25C0,
+ 0x76B9, 0x76B9, 0x3EEB, 0x76BA, 0x76BA, 0x229A, 0x76BB, 0x76BE, 0x3EEC,
+ 0x76BF, 0x76BF, 0x0AF8, 0x76C0, 0x76C1, 0x3EF0, 0x76C2, 0x76C2, 0x10C0,
+ 0x76C3, 0x76C4, 0x3EF2, 0x76C5, 0x76C5, 0x11D0, 0x76C6, 0x76C6, 0x0BA9,
+ 0x76C7, 0x76C7, 0x3EF4, 0x76C8, 0x76C8, 0x1094, 0x76C9, 0x76C9, 0x3EF5,
+ 0x76CA, 0x76CA, 0x106D, 0x76CB, 0x76CC, 0x3EF6, 0x76CD, 0x76CD, 0x1A8B,
+ 0x76CE, 0x76CE, 0x03C6, 0x76CF, 0x76CF, 0x1156, 0x76D0, 0x76D0, 0x0FF7,
+ 0x76D1, 0x76D1, 0x0853, 0x76D2, 0x76D2, 0x0787, 0x76D3, 0x76D3, 0x3EF8,
+ 0x76D4, 0x76D4, 0x0985, 0x76D5, 0x76D5, 0x3EF9, 0x76D6, 0x76D6, 0x06C2,
+ 0x76D7, 0x76D7, 0x05A2, 0x76D8, 0x76D8, 0x0B8D, 0x76D9, 0x76DA, 0x3EFA,
+ 0x76DB, 0x76DB, 0x0D39, 0x76DC, 0x76DD, 0x3EFC, 0x76DE, 0x76DE, 0x226E,
+ 0x76DF, 0x76DF, 0x0AD0, 0x76E0, 0x76E0, 0x3EFE, 0x76E1, 0x76E1, 0x1FBD,
+ 0x76E2, 0x76E2, 0x3EFF, 0x76E3, 0x76E3, 0x1F84, 0x76E4, 0x76E4, 0x20B2,
+ 0x76E5, 0x76E5, 0x1A8C, 0x76E6, 0x76E6, 0x3F00, 0x76E7, 0x76E7, 0x2043,
+ 0x76E8, 0x76ED, 0x3F01, 0x76EE, 0x76EE, 0x0B22, 0x76EF, 0x76EF, 0x05E1,
+ 0x76F0, 0x76F0, 0x3F07, 0x76F1, 0x76F1, 0x1A58, 0x76F2, 0x76F2, 0x0AA9,
+ 0x76F3, 0x76F3, 0x3F08, 0x76F4, 0x76F4, 0x11B0, 0x76F5, 0x76F7, 0x3F09,
+ 0x76F8, 0x76F8, 0x0F4D, 0x76F9, 0x76F9, 0x1A5B, 0x76FA, 0x76FB, 0x3F0C,
+ 0x76FC, 0x76FC, 0x0B8F, 0x76FD, 0x76FD, 0x3F0E, 0x76FE, 0x76FE, 0x061B,
+ 0x76FF, 0x76FF, 0x3F0F, 0x7700, 0x7700, 0x3F10, 0x7701, 0x7701, 0x0D38,
+ 0x7702, 0x7703, 0x3F11, 0x7704, 0x7704, 0x1A59, 0x7705, 0x7706, 0x3F13,
+ 0x7707, 0x7708, 0x1A5C, 0x7709, 0x7709, 0x0AC1, 0x770A, 0x770A, 0x3F15,
+ 0x770B, 0x770B, 0x0941, 0x770C, 0x770C, 0x3F16, 0x770D, 0x770D, 0x1A5A,
+ 0x770E, 0x7718, 0x3F17, 0x7719, 0x7719, 0x1A60, 0x771A, 0x771A, 0x1A5E,
+ 0x771B, 0x771E, 0x3F22, 0x771F, 0x771F, 0x1187, 0x7720, 0x7720, 0x0AE4,
+ 0x7721, 0x7721, 0x3F26, 0x7722, 0x7722, 0x1A5F, 0x7723, 0x7725, 0x3F27,
+ 0x7726, 0x7726, 0x1A62, 0x7727, 0x7727, 0x3F2A, 0x7728, 0x7728, 0x1144,
+ 0x7729, 0x7729, 0x0FCC, 0x772A, 0x772C, 0x3F2B, 0x772D, 0x772D, 0x1A61,
+ 0x772E, 0x772E, 0x3F2E, 0x772F, 0x772F, 0x0AD5, 0x7730, 0x7734, 0x3F2F,
+ 0x7735, 0x7735, 0x1A63, 0x7736, 0x7736, 0x0981, 0x7737, 0x7737, 0x091B,
+ 0x7738, 0x7738, 0x1A64, 0x7739, 0x7739, 0x3F34, 0x773A, 0x773A, 0x0E4A,
+ 0x773B, 0x773B, 0x3F35, 0x773C, 0x773C, 0x1004, 0x773D, 0x773F, 0x3F36,
+ 0x7740, 0x7740, 0x1222, 0x7741, 0x7741, 0x1197, 0x7742, 0x7742, 0x3F39,
+ 0x7743, 0x7743, 0x1A68, 0x7744, 0x7746, 0x3F3A, 0x7747, 0x7747, 0x1A67,
+ 0x7748, 0x774E, 0x3F3D, 0x774F, 0x774F, 0x2684, 0x7750, 0x7751, 0x1A65,
+ 0x7752, 0x7759, 0x3F44, 0x775A, 0x775A, 0x1A69, 0x775B, 0x775B, 0x08D5,
+ 0x775C, 0x775D, 0x3F4C, 0x775E, 0x775E, 0x24EF, 0x775F, 0x7760, 0x3F4E,
+ 0x7761, 0x7761, 0x0DA4, 0x7762, 0x7762, 0x1A6B, 0x7763, 0x7763, 0x05FC,
+ 0x7764, 0x7764, 0x3F50, 0x7765, 0x7765, 0x1A6C, 0x7766, 0x7766, 0x0B23,
+ 0x7767, 0x7767, 0x3F51, 0x7768, 0x7768, 0x1A6A, 0x7769, 0x776A, 0x3F52,
+ 0x776B, 0x776B, 0x08AF, 0x776C, 0x776C, 0x048E, 0x776D, 0x7778, 0x3F54,
+ 0x7779, 0x7779, 0x0602, 0x777A, 0x777C, 0x3F60, 0x777D, 0x777D, 0x1A6F,
+ 0x777E, 0x777E, 0x1270, 0x777F, 0x777F, 0x1A6D, 0x7780, 0x7780, 0x1A70,
+ 0x7781, 0x7783, 0x3F63, 0x7784, 0x7784, 0x0AEE, 0x7785, 0x7785, 0x0517,
+ 0x7786, 0x778B, 0x3F66, 0x778C, 0x778C, 0x1A71, 0x778D, 0x778D, 0x1A6E,
+ 0x778E, 0x778E, 0x0F26, 0x778F, 0x7790, 0x3F6C, 0x7791, 0x7791, 0x1A72,
+ 0x7792, 0x7792, 0x0A9E, 0x7793, 0x7797, 0x3F6E, 0x7798, 0x7798, 0x24EE,
+ 0x7799, 0x779D, 0x3F73, 0x779E, 0x779E, 0x2074, 0x779F, 0x77A0, 0x1A73,
+ 0x77A1, 0x77A1, 0x3F78, 0x77A2, 0x77A2, 0x1495, 0x77A3, 0x77A4, 0x3F79,
+ 0x77A5, 0x77A5, 0x0BD2, 0x77A6, 0x77A6, 0x3F7B, 0x77A7, 0x77A7, 0x0C43,
+ 0x77A8, 0x77A8, 0x3F7C, 0x77A9, 0x77A9, 0x11F4, 0x77AA, 0x77AA, 0x05AA,
+ 0x77AB, 0x77AB, 0x3F7D, 0x77AC, 0x77AC, 0x0DA7, 0x77AD, 0x77AD, 0x2687,
+ 0x77AE, 0x77AF, 0x3F7E, 0x77B0, 0x77B0, 0x1A75, 0x77B1, 0x77B2, 0x3F80,
+ 0x77B3, 0x77B3, 0x0E5C, 0x77B4, 0x77B4, 0x3F82, 0x77B5, 0x77B5, 0x1A76,
+ 0x77B6, 0x77BA, 0x3F83, 0x77BB, 0x77BB, 0x1151, 0x77BC, 0x77BC, 0x24F0,
+ 0x77BD, 0x77BD, 0x1A77, 0x77BE, 0x77BE, 0x3F88, 0x77BF, 0x77BF, 0x1D7E,
+ 0x77C0, 0x77C6, 0x3F89, 0x77C7, 0x77C7, 0x268D, 0x77C8, 0x77CC, 0x3F90,
+ 0x77CD, 0x77CD, 0x1397, 0x77CE, 0x77D6, 0x3F95, 0x77D7, 0x77D7, 0x0526,
+ 0x77D8, 0x77D9, 0x3F9E, 0x77DA, 0x77DA, 0x22A0, 0x77DB, 0x77DB, 0x0AB1,
+ 0x77DC, 0x77DC, 0x1BCA, 0x77DD, 0x77E1, 0x3FA0, 0x77E2, 0x77E2, 0x0D4F,
+ 0x77E3, 0x77E3, 0x105A, 0x77E4, 0x77E4, 0x3FA5, 0x77E5, 0x77E5, 0x11A9,
+ 0x77E6, 0x77E6, 0x3FA6, 0x77E7, 0x77E7, 0x1B1A, 0x77E8, 0x77E8, 0x3FA7,
+ 0x77E9, 0x77E9, 0x0907, 0x77EA, 0x77EA, 0x3FA8, 0x77EB, 0x77EB, 0x0894,
+ 0x77EC, 0x77EC, 0x1B1B, 0x77ED, 0x77ED, 0x060B, 0x77EE, 0x77EE, 0x03B6,
+ 0x77EF, 0x77EF, 0x1FAB, 0x77F0, 0x77F2, 0x3FA9, 0x77F3, 0x77F3, 0x0D46,
+ 0x77F4, 0x77F5, 0x3FAC, 0x77F6, 0x77F6, 0x1A22, 0x77F7, 0x77F7, 0x3FAE,
+ 0x77F8, 0x77F8, 0x1A23, 0x77F9, 0x77FC, 0x3FAF, 0x77FD, 0x77FD, 0x0F08,
+ 0x77FE, 0x77FE, 0x064C, 0x77FF, 0x77FF, 0x0980, 0x7800, 0x7800, 0x1A24,
+ 0x7801, 0x7801, 0x0A92, 0x7802, 0x7802, 0x0CE9, 0x7803, 0x7808, 0x3FB3,
+ 0x7809, 0x7809, 0x1A25, 0x780A, 0x780B, 0x3FB9, 0x780C, 0x780C, 0x0C15,
+ 0x780D, 0x780D, 0x0940, 0x780E, 0x7810, 0x3FBB, 0x7811, 0x7811, 0x1A28,
+ 0x7812, 0x7812, 0x0BB9, 0x7813, 0x7813, 0x3FBE, 0x7814, 0x7814, 0x0FF9,
+ 0x7815, 0x7815, 0x3FBF, 0x7816, 0x7816, 0x1206, 0x7817, 0x7818, 0x1A26,
+ 0x7819, 0x7819, 0x3FC0, 0x781A, 0x781A, 0x100B, 0x781B, 0x781B, 0x3FC1,
+ 0x781C, 0x781D, 0x1A2B, 0x781E, 0x781E, 0x3FC2, 0x781F, 0x781F, 0x1A30,
+ 0x7820, 0x7822, 0x3FC3, 0x7823, 0x7823, 0x1A34, 0x7824, 0x7824, 0x3FC6,
+ 0x7825, 0x7825, 0x1A32, 0x7826, 0x7826, 0x1A3A, 0x7827, 0x7827, 0x1189,
+ 0x7828, 0x7828, 0x3FC7, 0x7829, 0x7829, 0x1A35, 0x782A, 0x782B, 0x3FC8,
+ 0x782C, 0x782C, 0x1A33, 0x782D, 0x782D, 0x1A2A, 0x782E, 0x782F, 0x3FCA,
+ 0x7830, 0x7830, 0x0BAA, 0x7831, 0x7833, 0x3FCC, 0x7834, 0x7834, 0x0BE5,
+ 0x7835, 0x7836, 0x3FCF, 0x7837, 0x7837, 0x0D22, 0x7838, 0x7838, 0x1115,
+ 0x7839, 0x783B, 0x1A2D, 0x783C, 0x783C, 0x1A31, 0x783D, 0x783D, 0x3FD1,
+ 0x783E, 0x783E, 0x09E4, 0x783F, 0x783F, 0x3FD2, 0x7840, 0x7840, 0x0524,
+ 0x7841, 0x7842, 0x3FD3, 0x7843, 0x7843, 0x26A8, 0x7844, 0x7844, 0x3FD5,
+ 0x7845, 0x7845, 0x0741, 0x7846, 0x7846, 0x3FD6, 0x7847, 0x7847, 0x1A3C,
+ 0x7848, 0x784B, 0x3FD7, 0x784C, 0x784C, 0x1A3D, 0x784D, 0x784D, 0x3FDB,
+ 0x784E, 0x784E, 0x1A36, 0x784F, 0x784F, 0x3FDC, 0x7850, 0x7850, 0x1A3B,
+ 0x7851, 0x7851, 0x3FDD, 0x7852, 0x7852, 0x0F07, 0x7853, 0x7854, 0x3FDE,
+ 0x7855, 0x7855, 0x0DAB, 0x7856, 0x7857, 0x1A38, 0x7858, 0x785C, 0x3FE0,
+ 0x785D, 0x785D, 0x0F62, 0x785E, 0x7863, 0x3FE5, 0x7864, 0x7864, 0x24E9,
+ 0x7865, 0x7867, 0x3FEB, 0x7868, 0x7868, 0x24E5, 0x7869, 0x7869, 0x3FEE,
+ 0x786A, 0x786A, 0x1A3E, 0x786B, 0x786B, 0x0A3B, 0x786C, 0x786C, 0x1097,
+ 0x786D, 0x786D, 0x1A37, 0x786E, 0x786E, 0x0C92, 0x786F, 0x786F, 0x21FA,
+ 0x7870, 0x7876, 0x3FEF, 0x7877, 0x7877, 0x0862, 0x7878, 0x787B, 0x3FF6,
+ 0x787C, 0x787C, 0x0BB1, 0x787D, 0x7886, 0x3FFA, 0x7887, 0x7887, 0x1A42,
+ 0x7888, 0x7888, 0x4004, 0x7889, 0x7889, 0x05D0, 0x788A, 0x788B, 0x4005,
+ 0x788C, 0x788C, 0x0A5C, 0x788D, 0x788D, 0x03B8, 0x788E, 0x788E, 0x0DDE,
+ 0x788F, 0x7890, 0x4007, 0x7891, 0x7891, 0x0417, 0x7892, 0x7892, 0x4009,
+ 0x7893, 0x7893, 0x1A40, 0x7894, 0x7896, 0x400A, 0x7897, 0x7897, 0x0E9C,
+ 0x7898, 0x7898, 0x05C3, 0x7899, 0x7899, 0x400D, 0x789A, 0x789A, 0x1A41,
+ 0x789B, 0x789B, 0x1A3F, 0x789C, 0x789C, 0x1A43, 0x789D, 0x789E, 0x400E,
+ 0x789F, 0x789F, 0x05DB, 0x78A0, 0x78A0, 0x4010, 0x78A1, 0x78A1, 0x1A44,
+ 0x78A2, 0x78A2, 0x4011, 0x78A3, 0x78A3, 0x1A45, 0x78A4, 0x78A4, 0x4012,
+ 0x78A5, 0x78A5, 0x1A48, 0x78A6, 0x78A6, 0x4013, 0x78A7, 0x78A7, 0x0435,
+ 0x78A8, 0x78A8, 0x4014, 0x78A9, 0x78A9, 0x2148, 0x78AA, 0x78AC, 0x4015,
+ 0x78AD, 0x78AD, 0x24E4, 0x78AE, 0x78AF, 0x4018, 0x78B0, 0x78B0, 0x0BB7,
+ 0x78B1, 0x78B1, 0x0861, 0x78B2, 0x78B2, 0x1A46, 0x78B3, 0x78B3, 0x0E0F,
+ 0x78B4, 0x78B4, 0x04B1, 0x78B5, 0x78B7, 0x401A, 0x78B8, 0x78B8, 0x24E6,
+ 0x78B9, 0x78B9, 0x1A47, 0x78BA, 0x78BA, 0x20F7, 0x78BB, 0x78BB, 0x401D,
+ 0x78BC, 0x78BC, 0x206B, 0x78BD, 0x78BD, 0x401E, 0x78BE, 0x78BE, 0x0B4E,
+ 0x78BF, 0x78C0, 0x401F, 0x78C1, 0x78C1, 0x0548, 0x78C2, 0x78C4, 0x4021,
+ 0x78C5, 0x78C5, 0x0400, 0x78C6, 0x78C8, 0x4024, 0x78C9, 0x78C9, 0x1A4B,
+ 0x78CA, 0x78CA, 0x09C5, 0x78CB, 0x78CB, 0x056B, 0x78CC, 0x78CF, 0x4027,
+ 0x78D0, 0x78D0, 0x0B8E, 0x78D1, 0x78D3, 0x402B, 0x78D4, 0x78D4, 0x1A49,
+ 0x78D5, 0x78D5, 0x0951, 0x78D6, 0x78D8, 0x402E, 0x78D9, 0x78D9, 0x1A4A,
+ 0x78DA, 0x78DA, 0x22A7, 0x78DB, 0x78E2, 0x4031, 0x78E3, 0x78E3, 0x24EC,
+ 0x78E4, 0x78E6, 0x4039, 0x78E7, 0x78E7, 0x24EB, 0x78E8, 0x78E8, 0x0B08,
+ 0x78E9, 0x78EB, 0x403C, 0x78EC, 0x78EC, 0x1A4C, 0x78ED, 0x78EE, 0x403F,
+ 0x78EF, 0x78EF, 0x24E3, 0x78F0, 0x78F1, 0x4041, 0x78F2, 0x78F2, 0x1A4D,
+ 0x78F3, 0x78F3, 0x4043, 0x78F4, 0x78F4, 0x1A4F, 0x78F5, 0x78F6, 0x4044,
+ 0x78F7, 0x78F7, 0x0A20, 0x78F8, 0x78F9, 0x4046, 0x78FA, 0x78FA, 0x07DC,
+ 0x78FB, 0x78FC, 0x4048, 0x78FD, 0x78FD, 0x24EA, 0x78FE, 0x78FF, 0x404A,
+ 0x7900, 0x7900, 0x404C, 0x7901, 0x7901, 0x0889, 0x7902, 0x7904, 0x404D,
+ 0x7905, 0x7905, 0x1A4E, 0x7906, 0x790D, 0x4050, 0x790E, 0x790E, 0x1E92,
+ 0x790F, 0x7912, 0x4058, 0x7913, 0x7913, 0x1A50, 0x7914, 0x7918, 0x405C,
+ 0x7919, 0x7919, 0x1E27, 0x791A, 0x791D, 0x4061, 0x791E, 0x791E, 0x1A52,
+ 0x791F, 0x7923, 0x4065, 0x7924, 0x7924, 0x1A51, 0x7925, 0x7925, 0x406A,
+ 0x7926, 0x7926, 0x1FE6, 0x7927, 0x7929, 0x406B, 0x792A, 0x792A, 0x24E7,
+ 0x792B, 0x792B, 0x2012, 0x792C, 0x792C, 0x1EEC, 0x792D, 0x7930, 0x406E,
+ 0x7931, 0x7931, 0x24E8, 0x7932, 0x7933, 0x4072, 0x7934, 0x7934, 0x1A53,
+ 0x7935, 0x7939, 0x4074, 0x793A, 0x793A, 0x0D55, 0x793B, 0x793B, 0x19F8,
+ 0x793C, 0x793C, 0x09DC, 0x793D, 0x793D, 0x4079, 0x793E, 0x793E, 0x0D20,
+ 0x793F, 0x793F, 0x407A, 0x7940, 0x7940, 0x19F9, 0x7941, 0x7941, 0x0C0D,
+ 0x7942, 0x7945, 0x407B, 0x7946, 0x7946, 0x19FA, 0x7947, 0x7947, 0x407F,
+ 0x7948, 0x7948, 0x0C0C, 0x7949, 0x7949, 0x19FB, 0x794A, 0x7952, 0x4080,
+ 0x7953, 0x7953, 0x19FE, 0x7954, 0x7955, 0x4089, 0x7956, 0x7956, 0x1243,
+ 0x7957, 0x7957, 0x1A01, 0x7958, 0x7959, 0x408B, 0x795A, 0x795A, 0x19FF,
+ 0x795B, 0x795C, 0x19FC, 0x795D, 0x795D, 0x1200, 0x795E, 0x795E, 0x0D2A,
+ 0x795F, 0x795F, 0x0DE3, 0x7960, 0x7960, 0x1A02, 0x7961, 0x7961, 0x408D,
+ 0x7962, 0x7962, 0x1A00, 0x7963, 0x7964, 0x408E, 0x7965, 0x7965, 0x0F56,
+ 0x7966, 0x7966, 0x4090, 0x7967, 0x7967, 0x1A04, 0x7968, 0x7968, 0x0BD0,
+ 0x7969, 0x796C, 0x4091, 0x796D, 0x796D, 0x0833, 0x796E, 0x796E, 0x4095,
+ 0x796F, 0x796F, 0x1A03, 0x7970, 0x7976, 0x4096, 0x7977, 0x7977, 0x059C,
+ 0x7978, 0x7978, 0x080B, 0x7979, 0x7979, 0x409D, 0x797A, 0x797A, 0x1A05,
+ 0x797B, 0x797F, 0x409E, 0x7980, 0x7980, 0x130B, 0x7981, 0x7981, 0x08CC,
+ 0x7982, 0x7983, 0x40A3, 0x7984, 0x7984, 0x0A62, 0x7985, 0x7985, 0x1A06,
+ 0x7986, 0x7989, 0x40A5, 0x798A, 0x798A, 0x1A07, 0x798B, 0x798C, 0x40A9,
+ 0x798D, 0x798D, 0x1F66, 0x798E, 0x798E, 0x24DC, 0x798F, 0x798F, 0x069E,
+ 0x7990, 0x7999, 0x40AB, 0x799A, 0x799A, 0x1A08, 0x799B, 0x79A5, 0x40B5,
+ 0x79A6, 0x79A6, 0x26A2, 0x79A7, 0x79A7, 0x1A09, 0x79A8, 0x79A9, 0x40C0,
+ 0x79AA, 0x79AA, 0x24DD, 0x79AB, 0x79AD, 0x40C2, 0x79AE, 0x79AE, 0x200E,
+ 0x79AF, 0x79AF, 0x40C5, 0x79B0, 0x79B0, 0x24DB, 0x79B1, 0x79B1, 0x1EB8,
+ 0x79B2, 0x79B2, 0x40C6, 0x79B3, 0x79B3, 0x1A0A, 0x79B4, 0x79B8, 0x40C7,
+ 0x79B9, 0x79B9, 0x10D2, 0x79BA, 0x79BA, 0x1264, 0x79BB, 0x79BB, 0x09D6,
+ 0x79BC, 0x79BC, 0x40CC, 0x79BD, 0x79BD, 0x0C5A, 0x79BE, 0x79BE, 0x0783,
+ 0x79BF, 0x79BF, 0x40CD, 0x79C0, 0x79C0, 0x0FAE, 0x79C1, 0x79C1, 0x0DB2,
+ 0x79C2, 0x79C2, 0x40CE, 0x79C3, 0x79C3, 0x0E6B, 0x79C4, 0x79C5, 0x40CF,
+ 0x79C6, 0x79C6, 0x06CC, 0x79C7, 0x79C8, 0x40D1, 0x79C9, 0x79C9, 0x0465,
+ 0x79CA, 0x79CA, 0x40D3, 0x79CB, 0x79CB, 0x0C6C, 0x79CC, 0x79CC, 0x40D4,
+ 0x79CD, 0x79CD, 0x11D5, 0x79CE, 0x79D0, 0x40D5, 0x79D1, 0x79D1, 0x0953,
+ 0x79D2, 0x79D2, 0x0AF0, 0x79D3, 0x79D4, 0x40D8, 0x79D5, 0x79D5, 0x1B1D,
+ 0x79D6, 0x79D7, 0x40DA, 0x79D8, 0x79D8, 0x0ADD, 0x79D9, 0x79DE, 0x40DC,
+ 0x79DF, 0x79DF, 0x123F, 0x79E0, 0x79E2, 0x40E2, 0x79E3, 0x79E3, 0x1B1F,
+ 0x79E4, 0x79E4, 0x04F8, 0x79E5, 0x79E5, 0x40E5, 0x79E6, 0x79E6, 0x0C55,
+ 0x79E7, 0x79E7, 0x1016, 0x79E8, 0x79E8, 0x40E6, 0x79E9, 0x79E9, 0x11C7,
+ 0x79EA, 0x79EA, 0x40E7, 0x79EB, 0x79EB, 0x1B20, 0x79EC, 0x79EC, 0x40E8,
+ 0x79ED, 0x79ED, 0x1B1E, 0x79EE, 0x79EE, 0x40E9, 0x79EF, 0x79EF, 0x0812,
+ 0x79F0, 0x79F0, 0x04EB, 0x79F1, 0x79F7, 0x40EA, 0x79F8, 0x79F8, 0x08A6,
+ 0x79F9, 0x79FA, 0x40F1, 0x79FB, 0x79FB, 0x104D, 0x79FC, 0x79FC, 0x40F3,
+ 0x79FD, 0x79FD, 0x07F5, 0x79FE, 0x79FF, 0x40F4, 0x7A00, 0x7A00, 0x0F0E,
+ 0x7A01, 0x7A01, 0x40F6, 0x7A02, 0x7A02, 0x1B24, 0x7A03, 0x7A03, 0x1B23,
+ 0x7A04, 0x7A05, 0x40F7, 0x7A06, 0x7A06, 0x1B21, 0x7A07, 0x7A0A, 0x40F9,
+ 0x7A0B, 0x7A0B, 0x04F1, 0x7A0C, 0x7A0C, 0x40FD, 0x7A0D, 0x7A0D, 0x0D0D,
+ 0x7A0E, 0x7A0E, 0x0DA5, 0x7A0F, 0x7A13, 0x40FE, 0x7A14, 0x7A14, 0x1B26,
+ 0x7A15, 0x7A16, 0x4103, 0x7A17, 0x7A17, 0x03E9, 0x7A18, 0x7A19, 0x4105,
+ 0x7A1A, 0x7A1A, 0x11C8, 0x7A1B, 0x7A1D, 0x4107, 0x7A1E, 0x7A1E, 0x1B25,
+ 0x7A1F, 0x7A1F, 0x410A, 0x7A20, 0x7A20, 0x0512, 0x7A21, 0x7A22, 0x410B,
+ 0x7A23, 0x7A23, 0x1D8F, 0x7A24, 0x7A2D, 0x410D, 0x7A2E, 0x7A2E, 0x2295,
+ 0x7A2F, 0x7A30, 0x4117, 0x7A31, 0x7A31, 0x1E80, 0x7A32, 0x7A32, 0x4119,
+ 0x7A33, 0x7A33, 0x0ED7, 0x7A34, 0x7A36, 0x411A, 0x7A37, 0x7A37, 0x1B28,
+ 0x7A38, 0x7A38, 0x411D, 0x7A39, 0x7A39, 0x1B27, 0x7A3A, 0x7A3A, 0x411E,
+ 0x7A3B, 0x7A3B, 0x059F, 0x7A3C, 0x7A3C, 0x084D, 0x7A3D, 0x7A3D, 0x0811,
+ 0x7A3E, 0x7A3E, 0x411F, 0x7A3F, 0x7A3F, 0x06E0, 0x7A40, 0x7A40, 0x2677,
+ 0x7A41, 0x7A45, 0x4120, 0x7A46, 0x7A46, 0x0B25, 0x7A47, 0x7A4B, 0x4125,
+ 0x7A4C, 0x7A4C, 0x2624, 0x7A4D, 0x7A4D, 0x1F69, 0x7A4E, 0x7A4E, 0x222B,
+ 0x7A4F, 0x7A50, 0x412A, 0x7A51, 0x7A51, 0x1B29, 0x7A52, 0x7A56, 0x412C,
+ 0x7A57, 0x7A57, 0x0DE0, 0x7A58, 0x7A60, 0x4131, 0x7A61, 0x7A61, 0x257F,
+ 0x7A62, 0x7A62, 0x1F5B, 0x7A63, 0x7A68, 0x413A, 0x7A69, 0x7A69, 0x219B,
+ 0x7A6A, 0x7A6A, 0x4140, 0x7A6B, 0x7A6B, 0x267D, 0x7A6C, 0x7A6F, 0x4141,
+ 0x7A70, 0x7A70, 0x1B2C, 0x7A71, 0x7A73, 0x4145, 0x7A74, 0x7A74, 0x0FD1,
+ 0x7A75, 0x7A75, 0x4148, 0x7A76, 0x7A76, 0x08EE, 0x7A77, 0x7A77, 0x0C6B,
+ 0x7A78, 0x7A79, 0x1B9A, 0x7A7A, 0x7A7A, 0x0962, 0x7A7B, 0x7A7E, 0x4149,
+ 0x7A7F, 0x7A7F, 0x052C, 0x7A80, 0x7A80, 0x1B9C, 0x7A81, 0x7A81, 0x0E6C,
+ 0x7A82, 0x7A82, 0x414D, 0x7A83, 0x7A83, 0x0C51, 0x7A84, 0x7A84, 0x114E,
+ 0x7A85, 0x7A85, 0x414E, 0x7A86, 0x7A86, 0x1B9D, 0x7A87, 0x7A87, 0x414F,
+ 0x7A88, 0x7A88, 0x1B9E, 0x7A89, 0x7A8C, 0x4150, 0x7A8D, 0x7A8D, 0x0C4C,
+ 0x7A8E, 0x7A90, 0x4154, 0x7A91, 0x7A91, 0x102B, 0x7A92, 0x7A92, 0x11CE,
+ 0x7A93, 0x7A94, 0x4157, 0x7A95, 0x7A95, 0x1B9F, 0x7A96, 0x7A96, 0x08A2,
+ 0x7A97, 0x7A97, 0x0533, 0x7A98, 0x7A98, 0x08EC, 0x7A99, 0x7A9B, 0x4159,
+ 0x7A9C, 0x7A9C, 0x055F, 0x7A9D, 0x7A9D, 0x0EE0, 0x7A9E, 0x7A9E, 0x415C,
+ 0x7A9F, 0x7A9F, 0x096C, 0x7AA0, 0x7AA0, 0x1BA1, 0x7AA1, 0x7AA4, 0x415D,
+ 0x7AA5, 0x7AA5, 0x0987, 0x7AA6, 0x7AA6, 0x1BA0, 0x7AA7, 0x7AA7, 0x4161,
+ 0x7AA8, 0x7AA8, 0x1BA3, 0x7AA9, 0x7AA9, 0x21A0, 0x7AAA, 0x7AAA, 0x2186,
+ 0x7AAB, 0x7AAB, 0x4162, 0x7AAC, 0x7AAC, 0x1BA2, 0x7AAD, 0x7AAD, 0x1BA4,
+ 0x7AAE, 0x7AAE, 0x20ED, 0x7AAF, 0x7AB2, 0x4163, 0x7AB3, 0x7AB3, 0x1BA5,
+ 0x7AB4, 0x7AB5, 0x4167, 0x7AB6, 0x7AB6, 0x25B9, 0x7AB7, 0x7AB9, 0x4169,
+ 0x7ABA, 0x7ABA, 0x1FEA, 0x7ABB, 0x7ABE, 0x416C, 0x7ABF, 0x7ABF, 0x0A47,
+ 0x7AC0, 0x7AC3, 0x4170, 0x7AC4, 0x7AC4, 0x1EA4, 0x7AC5, 0x7AC5, 0x20E1,
+ 0x7AC6, 0x7AC6, 0x4174, 0x7AC7, 0x7AC7, 0x25B8, 0x7AC8, 0x7AC8, 0x2260,
+ 0x7AC9, 0x7AC9, 0x4175, 0x7ACA, 0x7ACA, 0x20E2, 0x7ACB, 0x7ACB, 0x09EB,
+ 0x7ACC, 0x7AD5, 0x4176, 0x7AD6, 0x7AD6, 0x0D91, 0x7AD7, 0x7AD8, 0x4180,
+ 0x7AD9, 0x7AD9, 0x115F, 0x7ADA, 0x7ADD, 0x4182, 0x7ADE, 0x7ADE, 0x08E9,
+ 0x7ADF, 0x7ADF, 0x08E8, 0x7AE0, 0x7AE0, 0x1163, 0x7AE1, 0x7AE2, 0x4186,
+ 0x7AE3, 0x7AE3, 0x092F, 0x7AE4, 0x7AE4, 0x4188, 0x7AE5, 0x7AE5, 0x0E60,
+ 0x7AE6, 0x7AE6, 0x1B99, 0x7AE7, 0x7AE9, 0x4189, 0x7AEA, 0x7AEA, 0x2141,
+ 0x7AEB, 0x7AEC, 0x418C, 0x7AED, 0x7AED, 0x08B0, 0x7AEE, 0x7AEE, 0x418E,
+ 0x7AEF, 0x7AEF, 0x060A, 0x7AF0, 0x7AF5, 0x418F, 0x7AF6, 0x7AF6, 0x1FC7,
+ 0x7AF7, 0x7AF8, 0x4195, 0x7AF9, 0x7AF9, 0x11F0, 0x7AFA, 0x7AFA, 0x1C63,
+ 0x7AFB, 0x7AFC, 0x4197, 0x7AFD, 0x7AFD, 0x1C64, 0x7AFE, 0x7AFE, 0x4199,
+ 0x7AFF, 0x7AFF, 0x06C8, 0x7B00, 0x7B02, 0x419A, 0x7B03, 0x7B04, 0x1C66,
+ 0x7B05, 0x7B05, 0x419D, 0x7B06, 0x7B06, 0x03D5, 0x7B07, 0x7B07, 0x419E,
+ 0x7B08, 0x7B08, 0x1C65, 0x7B09, 0x7B09, 0x419F, 0x7B0A, 0x7B0A, 0x1C69,
+ 0x7B0B, 0x7B0B, 0x0DE6, 0x7B0C, 0x7B0E, 0x41A0, 0x7B0F, 0x7B0F, 0x1C6B,
+ 0x7B10, 0x7B10, 0x41A3, 0x7B11, 0x7B11, 0x0F71, 0x7B12, 0x7B13, 0x41A4,
+ 0x7B14, 0x7B14, 0x0433, 0x7B15, 0x7B15, 0x1C68, 0x7B16, 0x7B18, 0x41A6,
+ 0x7B19, 0x7B19, 0x1C6F, 0x7B1A, 0x7B1A, 0x41A9, 0x7B1B, 0x7B1B, 0x05B2,
+ 0x7B1C, 0x7B1D, 0x41AA, 0x7B1E, 0x7B1E, 0x1C77, 0x7B1F, 0x7B1F, 0x41AC,
+ 0x7B20, 0x7B20, 0x1C72, 0x7B21, 0x7B23, 0x41AD, 0x7B24, 0x7B24, 0x1C74,
+ 0x7B25, 0x7B25, 0x1C73, 0x7B26, 0x7B26, 0x0698, 0x7B27, 0x7B27, 0x41B0,
+ 0x7B28, 0x7B28, 0x0428, 0x7B29, 0x7B29, 0x41B1, 0x7B2A, 0x7B2A, 0x1C6E,
+ 0x7B2B, 0x7B2B, 0x1C6A, 0x7B2C, 0x7B2C, 0x05BB, 0x7B2D, 0x7B2D, 0x41B2,
+ 0x7B2E, 0x7B2E, 0x1C70, 0x7B2F, 0x7B30, 0x41B3, 0x7B31, 0x7B31, 0x1C71,
+ 0x7B32, 0x7B32, 0x41B5, 0x7B33, 0x7B33, 0x1C75, 0x7B34, 0x7B37, 0x41B6,
+ 0x7B38, 0x7B38, 0x1C6D, 0x7B39, 0x7B39, 0x41BA, 0x7B3A, 0x7B3A, 0x0856,
+ 0x7B3B, 0x7B3B, 0x41BB, 0x7B3C, 0x7B3C, 0x0A46, 0x7B3D, 0x7B3D, 0x41BC,
+ 0x7B3E, 0x7B3E, 0x1C76, 0x7B3F, 0x7B44, 0x41BD, 0x7B45, 0x7B45, 0x1C7A,
+ 0x7B46, 0x7B46, 0x1E41, 0x7B47, 0x7B47, 0x1C6C, 0x7B48, 0x7B48, 0x41C3,
+ 0x7B49, 0x7B49, 0x05A9, 0x7B4A, 0x7B4A, 0x41C4, 0x7B4B, 0x7B4B, 0x08BF,
+ 0x7B4C, 0x7B4C, 0x1C7C, 0x7B4D, 0x7B4E, 0x41C5, 0x7B4F, 0x7B4F, 0x0641,
+ 0x7B50, 0x7B50, 0x097D, 0x7B51, 0x7B51, 0x11FD, 0x7B52, 0x7B52, 0x0E63,
+ 0x7B53, 0x7B53, 0x41C7, 0x7B54, 0x7B54, 0x0573, 0x7B55, 0x7B55, 0x41C8,
+ 0x7B56, 0x7B56, 0x04A6, 0x7B57, 0x7B57, 0x41C9, 0x7B58, 0x7B58, 0x1C78,
+ 0x7B59, 0x7B59, 0x41CA, 0x7B5A, 0x7B5A, 0x1C79, 0x7B5B, 0x7B5B, 0x0CF1,
+ 0x7B5C, 0x7B5C, 0x41CB, 0x7B5D, 0x7B5D, 0x1C7D, 0x7B5E, 0x7B5F, 0x41CC,
+ 0x7B60, 0x7B60, 0x1C7E, 0x7B61, 0x7B61, 0x41CE, 0x7B62, 0x7B62, 0x1C81,
+ 0x7B63, 0x7B66, 0x41CF, 0x7B67, 0x7B67, 0x25E4, 0x7B68, 0x7B6D, 0x41D3,
+ 0x7B6E, 0x7B6E, 0x1C7F, 0x7B6F, 0x7B70, 0x41D9, 0x7B71, 0x7B71, 0x1C83,
+ 0x7B72, 0x7B72, 0x1C82, 0x7B73, 0x7B74, 0x41DB, 0x7B75, 0x7B75, 0x1C7B,
+ 0x7B76, 0x7B76, 0x41DD, 0x7B77, 0x7B77, 0x0977, 0x7B78, 0x7B78, 0x41DE,
+ 0x7B79, 0x7B79, 0x0514, 0x7B7A, 0x7B7A, 0x41DF, 0x7B7B, 0x7B7B, 0x1C80,
+ 0x7B7C, 0x7B7D, 0x41E0, 0x7B7E, 0x7B7E, 0x0C26, 0x7B7F, 0x7B7F, 0x41E2,
+ 0x7B80, 0x7B80, 0x0865, 0x7B81, 0x7B84, 0x41E3, 0x7B85, 0x7B85, 0x1C8B,
+ 0x7B86, 0x7B8A, 0x41E7, 0x7B8B, 0x7B8B, 0x1F86, 0x7B8C, 0x7B8C, 0x41EC,
+ 0x7B8D, 0x7B8D, 0x0718, 0x7B8E, 0x7B8F, 0x41ED, 0x7B90, 0x7B90, 0x1C84,
+ 0x7B91, 0x7B93, 0x41EF, 0x7B94, 0x7B94, 0x0474, 0x7B95, 0x7B95, 0x0813,
+ 0x7B96, 0x7B96, 0x41F2, 0x7B97, 0x7B97, 0x0DD8, 0x7B98, 0x7B9B, 0x41F3,
+ 0x7B9C, 0x7B9C, 0x1C8D, 0x7B9D, 0x7B9D, 0x1C89, 0x7B9E, 0x7BA0, 0x41F7,
+ 0x7BA1, 0x7BA1, 0x0735, 0x7BA2, 0x7BA2, 0x1C8E, 0x7BA3, 0x7BA5, 0x41FA,
+ 0x7BA6, 0x7BA7, 0x1C85, 0x7BA8, 0x7BA8, 0x1C8A, 0x7BA9, 0x7BA9, 0x0A88,
+ 0x7BAA, 0x7BAA, 0x1C8C, 0x7BAB, 0x7BAB, 0x1C8F, 0x7BAC, 0x7BAC, 0x1C88,
+ 0x7BAD, 0x7BAD, 0x0870, 0x7BAE, 0x7BB0, 0x41FD, 0x7BB1, 0x7BB1, 0x0F51,
+ 0x7BB2, 0x7BB3, 0x4200, 0x7BB4, 0x7BB4, 0x1C90, 0x7BB5, 0x7BB7, 0x4202,
+ 0x7BB8, 0x7BB8, 0x1C87, 0x7BB9, 0x7BBF, 0x4205, 0x7BC0, 0x7BC0, 0x1FB3,
+ 0x7BC1, 0x7BC1, 0x1C92, 0x7BC2, 0x7BC3, 0x420C, 0x7BC4, 0x7BC4, 0x1EEF,
+ 0x7BC5, 0x7BC5, 0x420E, 0x7BC6, 0x7BC6, 0x120A, 0x7BC7, 0x7BC7, 0x0BC9,
+ 0x7BC8, 0x7BC8, 0x420F, 0x7BC9, 0x7BC9, 0x22A4, 0x7BCA, 0x7BCA, 0x4210,
+ 0x7BCB, 0x7BCB, 0x25E8, 0x7BCC, 0x7BCC, 0x1C93, 0x7BCD, 0x7BD0, 0x4211,
+ 0x7BD1, 0x7BD1, 0x1C91, 0x7BD2, 0x7BD2, 0x4215, 0x7BD3, 0x7BD3, 0x0A4F,
+ 0x7BD4, 0x7BD8, 0x4216, 0x7BD9, 0x7BD9, 0x06D8, 0x7BDA, 0x7BDA, 0x1C95,
+ 0x7BDB, 0x7BDC, 0x421B, 0x7BDD, 0x7BDD, 0x1C94, 0x7BDE, 0x7BE0, 0x421D,
+ 0x7BE1, 0x7BE1, 0x055E, 0x7BE2, 0x7BE3, 0x4220, 0x7BE4, 0x7BE4, 0x25E3,
+ 0x7BE5, 0x7BE6, 0x1C96, 0x7BE7, 0x7BE8, 0x4222, 0x7BE9, 0x7BE9, 0x2111,
+ 0x7BEA, 0x7BEA, 0x1C98, 0x7BEB, 0x7BED, 0x4224, 0x7BEE, 0x7BEE, 0x09A5,
+ 0x7BEF, 0x7BF0, 0x4227, 0x7BF1, 0x7BF1, 0x09D4, 0x7BF2, 0x7BF2, 0x4229,
+ 0x7BF3, 0x7BF3, 0x25E6, 0x7BF4, 0x7BF6, 0x422A, 0x7BF7, 0x7BF7, 0x0BB2,
+ 0x7BF8, 0x7BFB, 0x422D, 0x7BFC, 0x7BFC, 0x1C9B, 0x7BFD, 0x7BFD, 0x4231,
+ 0x7BFE, 0x7BFE, 0x1C9A, 0x7BFF, 0x7BFF, 0x4232, 0x7C00, 0x7C00, 0x25E7,
+ 0x7C01, 0x7C06, 0x4233, 0x7C07, 0x7C07, 0x055B, 0x7C08, 0x7C0A, 0x4239,
+ 0x7C0B, 0x7C0B, 0x1C9E, 0x7C0C, 0x7C0C, 0x1C99, 0x7C0D, 0x7C0D, 0x2041,
+ 0x7C0E, 0x7C0E, 0x423C, 0x7C0F, 0x7C0F, 0x1C9C, 0x7C10, 0x7C15, 0x423D,
+ 0x7C16, 0x7C16, 0x1C9D, 0x7C17, 0x7C1D, 0x4243, 0x7C1E, 0x7C1E, 0x25EA,
+ 0x7C1F, 0x7C1F, 0x1C9F, 0x7C20, 0x7C20, 0x424A, 0x7C21, 0x7C21, 0x1F8F,
+ 0x7C22, 0x7C22, 0x424B, 0x7C23, 0x7C23, 0x25EC, 0x7C24, 0x7C25, 0x424C,
+ 0x7C26, 0x7C26, 0x1CA1, 0x7C27, 0x7C27, 0x07DE, 0x7C28, 0x7C29, 0x424E,
+ 0x7C2A, 0x7C2A, 0x1CA0, 0x7C2B, 0x7C2B, 0x25EB, 0x7C2C, 0x7C37, 0x4250,
+ 0x7C38, 0x7C38, 0x1CA2, 0x7C39, 0x7C3C, 0x425C, 0x7C3D, 0x7C3D, 0x20D0,
+ 0x7C3E, 0x7C3E, 0x201D, 0x7C3F, 0x7C3F, 0x0485, 0x7C40, 0x7C40, 0x1CA4,
+ 0x7C41, 0x7C41, 0x1CA3, 0x7C42, 0x7C42, 0x4260, 0x7C43, 0x7C43, 0x1FF7,
+ 0x7C44, 0x7C4B, 0x4261, 0x7C4C, 0x7C4C, 0x1E8D, 0x7C4D, 0x7C4D, 0x0821,
+ 0x7C4E, 0x7C5B, 0x4269, 0x7C5C, 0x7C5C, 0x25E9, 0x7C5D, 0x7C5E, 0x4277,
+ 0x7C5F, 0x7C5F, 0x25EE, 0x7C60, 0x7C60, 0x203A, 0x7C61, 0x7C63, 0x4279,
+ 0x7C64, 0x7C64, 0x2693, 0x7C65, 0x7C68, 0x427C, 0x7C69, 0x7C69, 0x25E5,
+ 0x7C6A, 0x7C6A, 0x25ED, 0x7C6B, 0x7C6B, 0x4280, 0x7C6C, 0x7C6C, 0x2009,
+ 0x7C6D, 0x7C6D, 0x4281, 0x7C6E, 0x7C6E, 0x2065, 0x7C6F, 0x7C71, 0x4282,
+ 0x7C72, 0x7C72, 0x26A3, 0x7C73, 0x7C73, 0x0ADC, 0x7C74, 0x7C74, 0x12F5,
+ 0x7C75, 0x7C7A, 0x4285, 0x7C7B, 0x7C7B, 0x09CB, 0x7C7C, 0x7C7C, 0x1CCA,
+ 0x7C7D, 0x7C7D, 0x122E, 0x7C7E, 0x7C88, 0x428B, 0x7C89, 0x7C89, 0x0678,
+ 0x7C8A, 0x7C90, 0x4296, 0x7C91, 0x7C91, 0x1CCC, 0x7C92, 0x7C92, 0x09EC,
+ 0x7C93, 0x7C94, 0x429D, 0x7C95, 0x7C95, 0x0BE8, 0x7C96, 0x7C96, 0x429F,
+ 0x7C97, 0x7C97, 0x0559, 0x7C98, 0x7C98, 0x1154, 0x7C99, 0x7C9B, 0x42A0,
+ 0x7C9C, 0x7C9C, 0x1CCE, 0x7C9D, 0x7C9D, 0x1CCD, 0x7C9E, 0x7C9E, 0x1CCF,
+ 0x7C9F, 0x7C9F, 0x0DCF, 0x7CA0, 0x7CA1, 0x42A3, 0x7CA2, 0x7CA2, 0x1CD0,
+ 0x7CA3, 0x7CA3, 0x42A5, 0x7CA4, 0x7CA4, 0x1104, 0x7CA5, 0x7CA5, 0x11DF,
+ 0x7CA6, 0x7CA9, 0x42A6, 0x7CAA, 0x7CAA, 0x067D, 0x7CAB, 0x7CAD, 0x42AA,
+ 0x7CAE, 0x7CAE, 0x0A01, 0x7CAF, 0x7CB0, 0x42AD, 0x7CB1, 0x7CB1, 0x0A04,
+ 0x7CB2, 0x7CB2, 0x1CD1, 0x7CB3, 0x7CB3, 0x08DB, 0x7CB4, 0x7CB8, 0x42AF,
+ 0x7CB9, 0x7CB9, 0x0565, 0x7CBA, 0x7CBB, 0x42B4, 0x7CBC, 0x7CBD, 0x1CD2,
+ 0x7CBE, 0x7CBE, 0x08DA, 0x7CBF, 0x7CC0, 0x42B6, 0x7CC1, 0x7CC1, 0x1CD4,
+ 0x7CC2, 0x7CC4, 0x42B8, 0x7CC5, 0x7CC5, 0x1CD9, 0x7CC6, 0x7CC6, 0x42BB,
+ 0x7CC7, 0x7CC7, 0x1CD5, 0x7CC8, 0x7CC8, 0x1CD8, 0x7CC9, 0x7CC9, 0x42BC,
+ 0x7CCA, 0x7CCA, 0x07B4, 0x7CCB, 0x7CCB, 0x42BD, 0x7CCC, 0x7CCD, 0x1CD6,
+ 0x7CCE, 0x7CD4, 0x42BE, 0x7CD5, 0x7CD5, 0x06DD, 0x7CD6, 0x7CD6, 0x0E1A,
+ 0x7CD7, 0x7CD7, 0x1CDA, 0x7CD8, 0x7CD8, 0x42C5, 0x7CD9, 0x7CD9, 0x04A1,
+ 0x7CDA, 0x7CDB, 0x42C6, 0x7CDC, 0x7CDC, 0x0AD8, 0x7CDD, 0x7CDD, 0x25F5,
+ 0x7CDE, 0x7CDE, 0x1EFC, 0x7CDF, 0x7CDF, 0x1126, 0x7CE0, 0x7CE0, 0x0944,
+ 0x7CE1, 0x7CE6, 0x42C8, 0x7CE7, 0x7CE7, 0x2024, 0x7CE8, 0x7CE8, 0x1CDB,
+ 0x7CE9, 0x7CEE, 0x42CE, 0x7CEF, 0x7CEF, 0x0B75, 0x7CF0, 0x7CF0, 0x269B,
+ 0x7CF1, 0x7CF1, 0x42D4, 0x7CF2, 0x7CF2, 0x25F3, 0x7CF3, 0x7CF3, 0x42D5,
+ 0x7CF4, 0x7CF4, 0x22D9, 0x7CF5, 0x7CF5, 0x42D6, 0x7CF6, 0x7CF6, 0x25F4,
+ 0x7CF7, 0x7CF7, 0x42D7, 0x7CF8, 0x7CF8, 0x1CE7, 0x7CF9, 0x7CF9, 0x241B,
+ 0x7CFA, 0x7CFA, 0x42D8, 0x7CFB, 0x7CFB, 0x0F22, 0x7CFC, 0x7CFD, 0x42D9,
+ 0x7CFE, 0x7CFE, 0x1FC8, 0x7CFF, 0x7CFF, 0x42DB, 0x7D00, 0x7D00, 0x1F7B,
+ 0x7D01, 0x7D01, 0x42DC, 0x7D02, 0x7D02, 0x241D, 0x7D03, 0x7D03, 0x42DD,
+ 0x7D04, 0x7D04, 0x224C, 0x7D05, 0x7D05, 0x1F48, 0x7D06, 0x7D06, 0x241C,
+ 0x7D07, 0x7D08, 0x241E, 0x7D09, 0x7D09, 0x20FF, 0x7D0A, 0x7D0A, 0x0ED8,
+ 0x7D0B, 0x7D0B, 0x219A, 0x7D0C, 0x7D0C, 0x42DE, 0x7D0D, 0x7D0D, 0x2091,
+ 0x7D0E, 0x7D0F, 0x42DF, 0x7D10, 0x7D10, 0x20A7, 0x7D11, 0x7D12, 0x42E1,
+ 0x7D13, 0x7D13, 0x2423, 0x7D14, 0x7D14, 0x1E9B, 0x7D15, 0x7D15, 0x2422,
+ 0x7D16, 0x7D16, 0x42E3, 0x7D17, 0x7D17, 0x2110, 0x7D18, 0x7D18, 0x42E4,
+ 0x7D19, 0x7D19, 0x228D, 0x7D1A, 0x7D1A, 0x1F71, 0x7D1B, 0x7D1B, 0x1EF8,
+ 0x7D1C, 0x7D1C, 0x2421, 0x7D1D, 0x7D1F, 0x42E5, 0x7D20, 0x7D20, 0x0DCD,
+ 0x7D21, 0x7D21, 0x1EF3, 0x7D22, 0x7D22, 0x0DEC, 0x7D23, 0x7D26, 0x42E8,
+ 0x7D27, 0x7D27, 0x08C5, 0x7D28, 0x7D2A, 0x42EC, 0x7D2B, 0x7D2B, 0x122C,
+ 0x7D2C, 0x7D2E, 0x42EF, 0x7D2F, 0x7D2F, 0x09C6, 0x7D30, 0x7D30, 0x21B1,
+ 0x7D31, 0x7D31, 0x2426, 0x7D32, 0x7D32, 0x2425, 0x7D33, 0x7D33, 0x2120,
+ 0x7D34, 0x7D38, 0x42F2, 0x7D39, 0x7D39, 0x211A, 0x7D3A, 0x7D3A, 0x2424,
+ 0x7D3B, 0x7D3B, 0x42F7, 0x7D3C, 0x7D3C, 0x2428, 0x7D3D, 0x7D3E, 0x42F8,
+ 0x7D3F, 0x7D3F, 0x242A, 0x7D40, 0x7D40, 0x2429, 0x7D41, 0x7D41, 0x42FA,
+ 0x7D42, 0x7D42, 0x2294, 0x7D43, 0x7D43, 0x42FB, 0x7D44, 0x7D44, 0x22BE,
+ 0x7D45, 0x7D45, 0x42FC, 0x7D46, 0x7D46, 0x1E31, 0x7D47, 0x7D4D, 0x42FD,
+ 0x7D4E, 0x7D4E, 0x242C, 0x7D4F, 0x7D4F, 0x4304, 0x7D50, 0x7D50, 0x1FB5,
+ 0x7D51, 0x7D5C, 0x4305, 0x7D5D, 0x7D5D, 0x242B, 0x7D5E, 0x7D5E, 0x1FAF,
+ 0x7D5F, 0x7D60, 0x4311, 0x7D61, 0x7D61, 0x2068, 0x7D62, 0x7D62, 0x21E4,
+ 0x7D63, 0x7D65, 0x4313, 0x7D66, 0x7D66, 0x1F21, 0x7D67, 0x7D67, 0x4316,
+ 0x7D68, 0x7D68, 0x2101, 0x7D69, 0x7D6D, 0x4317, 0x7D6E, 0x7D6E, 0x0FC0,
+ 0x7D6F, 0x7D70, 0x431C, 0x7D71, 0x7D71, 0x217C, 0x7D72, 0x7D72, 0x214A,
+ 0x7D73, 0x7D73, 0x242D, 0x7D74, 0x7D75, 0x431E, 0x7D76, 0x7D76, 0x1FD4,
+ 0x7D77, 0x7D77, 0x1CE8, 0x7D78, 0x7D78, 0x4320, 0x7D79, 0x7D79, 0x1FD1,
+ 0x7D7A, 0x7D80, 0x4321, 0x7D81, 0x7D81, 0x1E33, 0x7D82, 0x7D82, 0x4328,
+ 0x7D83, 0x7D83, 0x242F, 0x7D84, 0x7D85, 0x4329, 0x7D86, 0x7D86, 0x242E,
+ 0x7D87, 0x7D87, 0x432B, 0x7D88, 0x7D88, 0x2430, 0x7D89, 0x7D89, 0x21DB,
+ 0x7D8A, 0x7D8E, 0x432C, 0x7D8F, 0x7D8F, 0x2158, 0x7D90, 0x7D92, 0x4331,
+ 0x7D93, 0x7D93, 0x1FC2, 0x7D94, 0x7D9B, 0x4334, 0x7D9C, 0x7D9C, 0x22B9,
+ 0x7D9D, 0x7D9D, 0x433C, 0x7D9E, 0x7D9E, 0x2436, 0x7D9F, 0x7DA1, 0x433D,
+ 0x7DA2, 0x7DA2, 0x1E8E, 0x7DA3, 0x7DA3, 0x2439, 0x7DA4, 0x7DA5, 0x4340,
+ 0x7DA6, 0x7DA6, 0x1CE9, 0x7DA7, 0x7DAA, 0x4342, 0x7DAB, 0x7DAB, 0x21C5,
+ 0x7DAC, 0x7DAC, 0x2437, 0x7DAD, 0x7DAD, 0x2192, 0x7DAE, 0x7DAE, 0x1CEA,
+ 0x7DAF, 0x7DAF, 0x4346, 0x7DB0, 0x7DB0, 0x243A, 0x7DB1, 0x7DB1, 0x1F19,
+ 0x7DB2, 0x7DB2, 0x218C, 0x7DB3, 0x7DB3, 0x1E40, 0x7DB4, 0x7DB4, 0x22B3,
+ 0x7DB5, 0x7DB7, 0x4347, 0x7DB8, 0x7DB8, 0x205F, 0x7DB9, 0x7DB9, 0x2438,
+ 0x7DBA, 0x7DBA, 0x2432, 0x7DBB, 0x7DBB, 0x2274, 0x7DBC, 0x7DBC, 0x434A,
+ 0x7DBD, 0x7DBD, 0x1E9C, 0x7DBE, 0x7DBE, 0x2431, 0x7DBF, 0x7DBF, 0x2085,
+ 0x7DC0, 0x7DC3, 0x434B, 0x7DC4, 0x7DC4, 0x2435, 0x7DC5, 0x7DC6, 0x434F,
+ 0x7DC7, 0x7DC7, 0x243B, 0x7DC8, 0x7DC9, 0x4351, 0x7DCA, 0x7DCA, 0x1FB7,
+ 0x7DCB, 0x7DCB, 0x2433, 0x7DCC, 0x7DD0, 0x4353, 0x7DD1, 0x7DD1, 0x2054,
+ 0x7DD2, 0x7DD2, 0x21DE, 0x7DD3, 0x7DD3, 0x4358, 0x7DD4, 0x7DD4, 0x2434,
+ 0x7DD5, 0x7DD6, 0x4359, 0x7DD7, 0x7DD7, 0x243D, 0x7DD8, 0x7DD8, 0x1F89,
+ 0x7DD9, 0x7DD9, 0x243C, 0x7DDA, 0x7DDC, 0x435B, 0x7DDD, 0x7DDD, 0x1F6E,
+ 0x7DDE, 0x7DDE, 0x1ED8, 0x7DDF, 0x7DDF, 0x435E, 0x7DE0, 0x7DE0, 0x1EBF,
+ 0x7DE1, 0x7DE1, 0x2445, 0x7DE2, 0x7DE2, 0x435F, 0x7DE3, 0x7DE3, 0x2249,
+ 0x7DE4, 0x7DE5, 0x4360, 0x7DE6, 0x7DE6, 0x2441, 0x7DE7, 0x7DE7, 0x4362,
+ 0x7DE8, 0x7DE8, 0x1E47, 0x7DE9, 0x7DE9, 0x1F56, 0x7DEA, 0x7DEB, 0x4363,
+ 0x7DEC, 0x7DEC, 0x2086, 0x7DED, 0x7DEE, 0x4365, 0x7DEF, 0x7DEF, 0x2196,
+ 0x7DF0, 0x7DF0, 0x4367, 0x7DF1, 0x7DF1, 0x2443, 0x7DF2, 0x7DF2, 0x243F,
+ 0x7DF3, 0x7DF3, 0x4368, 0x7DF4, 0x7DF4, 0x2023, 0x7DF5, 0x7DF5, 0x4369,
+ 0x7DF6, 0x7DF6, 0x2442, 0x7DF7, 0x7DF8, 0x436A, 0x7DF9, 0x7DF9, 0x243E,
+ 0x7DFA, 0x7DFA, 0x436C, 0x7DFB, 0x7DFB, 0x26A6, 0x7DFC, 0x7DFF, 0x436D,
+ 0x7E00, 0x7E07, 0x4371, 0x7E08, 0x7E08, 0x234E, 0x7E09, 0x7E09, 0x2446,
+ 0x7E0A, 0x7E0A, 0x244B, 0x7E0B, 0x7E0B, 0x2444, 0x7E0C, 0x7E0F, 0x4379,
+ 0x7E10, 0x7E10, 0x2427, 0x7E11, 0x7E11, 0x244C, 0x7E12, 0x7E1A, 0x437D,
+ 0x7E1B, 0x7E1B, 0x1F0F, 0x7E1C, 0x7E1C, 0x4386, 0x7E1D, 0x7E1D, 0x2447,
+ 0x7E1E, 0x7E1E, 0x2449, 0x7E1F, 0x7E1F, 0x2448, 0x7E20, 0x7E22, 0x4387,
+ 0x7E23, 0x7E23, 0x21C2, 0x7E24, 0x7E26, 0x438A, 0x7E27, 0x7E27, 0x216E,
+ 0x7E28, 0x7E2A, 0x438D, 0x7E2B, 0x7E2B, 0x1F03, 0x7E2C, 0x7E2C, 0x4390,
+ 0x7E2D, 0x7E2D, 0x244A, 0x7E2E, 0x7E2E, 0x215C, 0x7E2F, 0x7E30, 0x4391,
+ 0x7E31, 0x7E31, 0x22BB, 0x7E32, 0x7E32, 0x2450, 0x7E33, 0x7E33, 0x4393,
+ 0x7E34, 0x7E34, 0x2694, 0x7E35, 0x7E35, 0x244F, 0x7E36, 0x7E36, 0x25F6,
+ 0x7E37, 0x7E37, 0x2051, 0x7E38, 0x7E38, 0x4394, 0x7E39, 0x7E39, 0x244E,
+ 0x7E3A, 0x7E3A, 0x4395, 0x7E3B, 0x7E3B, 0x1DFB, 0x7E3C, 0x7E3C, 0x4396,
+ 0x7E3D, 0x7E3D, 0x22BA, 0x7E3E, 0x7E3E, 0x1F6D, 0x7E3F, 0x7E40, 0x4397,
+ 0x7E41, 0x7E41, 0x064E, 0x7E42, 0x7E44, 0x4399, 0x7E45, 0x7E45, 0x2452,
+ 0x7E46, 0x7E46, 0x2451, 0x7E47, 0x7E47, 0x1CEB, 0x7E48, 0x7E51, 0x439C,
+ 0x7E52, 0x7E52, 0x2455, 0x7E53, 0x7E53, 0x43A6, 0x7E54, 0x7E54, 0x2289,
+ 0x7E55, 0x7E55, 0x2116, 0x7E56, 0x7E59, 0x43A7, 0x7E5A, 0x7E5A, 0x2454,
+ 0x7E5B, 0x7E5D, 0x43AB, 0x7E5E, 0x7E5E, 0x20FB, 0x7E5F, 0x7E61, 0x43AE,
+ 0x7E62, 0x7E62, 0x2440, 0x7E63, 0x7E68, 0x43B1, 0x7E69, 0x7E69, 0x2126,
+ 0x7E6A, 0x7E6A, 0x1F61, 0x7E6B, 0x7E6B, 0x269D, 0x7E6C, 0x7E6C, 0x43B7,
+ 0x7E6D, 0x7E6D, 0x1F8A, 0x7E6E, 0x7E6E, 0x2456, 0x7E6F, 0x7E6F, 0x2459,
+ 0x7E70, 0x7E70, 0x2458, 0x7E71, 0x7E72, 0x43B8, 0x7E73, 0x7E73, 0x1FAE,
+ 0x7E74, 0x7E78, 0x43BA, 0x7E79, 0x7E79, 0x221A, 0x7E7A, 0x7E7B, 0x43BF,
+ 0x7E7C, 0x7E7C, 0x1F7A, 0x7E7D, 0x7E7D, 0x244D, 0x7E7E, 0x7E7E, 0x2457,
+ 0x7E7F, 0x7E81, 0x43C1, 0x7E82, 0x7E82, 0x1248, 0x7E83, 0x7E87, 0x43C4,
+ 0x7E88, 0x7E88, 0x2453, 0x7E89, 0x7E89, 0x43C9, 0x7E8A, 0x7E8A, 0x2420,
+ 0x7E8B, 0x7E8B, 0x43CA, 0x7E8C, 0x7E8C, 0x21DF, 0x7E8D, 0x7E8D, 0x2685,
+ 0x7E8E, 0x7E8E, 0x43CB, 0x7E8F, 0x7E8F, 0x1E6E, 0x7E90, 0x7E92, 0x43CC,
+ 0x7E93, 0x7E93, 0x2224, 0x7E94, 0x7E94, 0x2670, 0x7E95, 0x7E95, 0x43CF,
+ 0x7E96, 0x7E96, 0x21BA, 0x7E97, 0x7E97, 0x43D0, 0x7E98, 0x7E98, 0x245A,
+ 0x7E99, 0x7E9A, 0x43D1, 0x7E9B, 0x7E9B, 0x1CEC, 0x7E9C, 0x7E9C, 0x1FFF,
+ 0x7E9D, 0x7E9E, 0x43D3, 0x7E9F, 0x7E9F, 0x17D3, 0x7EA0, 0x7EA0, 0x08EF,
+ 0x7EA1, 0x7EA1, 0x17D4, 0x7EA2, 0x7EA2, 0x07A3, 0x7EA3, 0x7EA3, 0x17D5,
+ 0x7EA4, 0x7EA4, 0x0F38, 0x7EA5, 0x7EA5, 0x17D6, 0x7EA6, 0x7EA6, 0x10FF,
+ 0x7EA7, 0x7EA7, 0x0829, 0x7EA8, 0x7EA9, 0x17D7, 0x7EAA, 0x7EAA, 0x0840,
+ 0x7EAB, 0x7EAB, 0x0CAD, 0x7EAC, 0x7EAC, 0x0EC2, 0x7EAD, 0x7EAD, 0x17D9,
+ 0x7EAE, 0x7EAE, 0x43D5, 0x7EAF, 0x7EAF, 0x0542, 0x7EB0, 0x7EB0, 0x17DA,
+ 0x7EB1, 0x7EB1, 0x0CED, 0x7EB2, 0x7EB2, 0x06D4, 0x7EB3, 0x7EB3, 0x0B2C,
+ 0x7EB4, 0x7EB4, 0x43D6, 0x7EB5, 0x7EB5, 0x123A, 0x7EB6, 0x7EB6, 0x0A81,
+ 0x7EB7, 0x7EB7, 0x0674, 0x7EB8, 0x7EB8, 0x11BC, 0x7EB9, 0x7EB9, 0x0ED5,
+ 0x7EBA, 0x7EBA, 0x0661, 0x7EBB, 0x7EBC, 0x43D7, 0x7EBD, 0x7EBD, 0x0B67,
+ 0x7EBE, 0x7EBE, 0x17DB, 0x7EBF, 0x7EBF, 0x0F4C, 0x7EC0, 0x7EC2, 0x17DC,
+ 0x7EC3, 0x7EC3, 0x0A00, 0x7EC4, 0x7EC4, 0x1246, 0x7EC5, 0x7EC5, 0x0D29,
+ 0x7EC6, 0x7EC6, 0x0F25, 0x7EC7, 0x7EC7, 0x11AE, 0x7EC8, 0x7EC8, 0x11D4,
+ 0x7EC9, 0x7EC9, 0x17DF, 0x7ECA, 0x7ECA, 0x03F8, 0x7ECB, 0x7ECC, 0x17E0,
+ 0x7ECD, 0x7ECD, 0x0D15, 0x7ECE, 0x7ECE, 0x1076, 0x7ECF, 0x7ECF, 0x08DC,
+ 0x7ED0, 0x7ED0, 0x17E2, 0x7ED1, 0x7ED1, 0x03FE, 0x7ED2, 0x7ED2, 0x0CB9,
+ 0x7ED3, 0x7ED3, 0x08B2, 0x7ED4, 0x7ED4, 0x17E3, 0x7ED5, 0x7ED5, 0x0CA1,
+ 0x7ED6, 0x7ED6, 0x43D9, 0x7ED7, 0x7ED7, 0x17E4, 0x7ED8, 0x7ED8, 0x07FB,
+ 0x7ED9, 0x7ED9, 0x06F3, 0x7EDA, 0x7EDA, 0x0FCD, 0x7EDB, 0x7EDB, 0x17E5,
+ 0x7EDC, 0x7EDC, 0x0A8E, 0x7EDD, 0x7EDD, 0x0927, 0x7EDE, 0x7EDE, 0x089B,
+ 0x7EDF, 0x7EDF, 0x0E64, 0x7EE0, 0x7EE1, 0x17E6, 0x7EE2, 0x7EE2, 0x091D,
+ 0x7EE3, 0x7EE3, 0x0FB0, 0x7EE4, 0x7EE4, 0x43DA, 0x7EE5, 0x7EE5, 0x0DDC,
+ 0x7EE6, 0x7EE6, 0x0E23, 0x7EE7, 0x7EE7, 0x083F, 0x7EE8, 0x7EE8, 0x17E8,
+ 0x7EE9, 0x7EE9, 0x081B, 0x7EEA, 0x7EEA, 0x0FC2, 0x7EEB, 0x7EEB, 0x17E9,
+ 0x7EEC, 0x7EEC, 0x43DB, 0x7EED, 0x7EED, 0x0FC3, 0x7EEE, 0x7EEF, 0x17EA,
+ 0x7EF0, 0x7EF0, 0x0545, 0x7EF1, 0x7EF2, 0x17EC, 0x7EF3, 0x7EF3, 0x0D37,
+ 0x7EF4, 0x7EF4, 0x0EBB, 0x7EF5, 0x7EF5, 0x0AE5, 0x7EF6, 0x7EF6, 0x17EF,
+ 0x7EF7, 0x7EF7, 0x042A, 0x7EF8, 0x7EF8, 0x0516, 0x7EF9, 0x7EF9, 0x43DC,
+ 0x7EFA, 0x7EFB, 0x17F0, 0x7EFC, 0x7EFC, 0x1238, 0x7EFD, 0x7EFD, 0x1161,
+ 0x7EFE, 0x7EFE, 0x17F2, 0x7EFF, 0x7EFF, 0x0A73, 0x7F00, 0x7F00, 0x1217,
+ 0x7F01, 0x7F03, 0x17F3, 0x7F04, 0x7F04, 0x085D, 0x7F05, 0x7F05, 0x0AEA,
+ 0x7F06, 0x7F06, 0x09AD, 0x7F07, 0x7F08, 0x17F6, 0x7F09, 0x7F09, 0x081C,
+ 0x7F0A, 0x7F0A, 0x43DD, 0x7F0B, 0x7F0C, 0x17F8, 0x7F0D, 0x7F0D, 0x17EE,
+ 0x7F0E, 0x7F0E, 0x060F, 0x7F0F, 0x7F0F, 0x17FA, 0x7F10, 0x7F10, 0x43DE,
+ 0x7F11, 0x7F12, 0x17FB, 0x7F13, 0x7F13, 0x07CF, 0x7F14, 0x7F14, 0x05BF,
+ 0x7F15, 0x7F15, 0x0A6D, 0x7F16, 0x7F16, 0x0449, 0x7F17, 0x7F17, 0x17FD,
+ 0x7F18, 0x7F18, 0x10F8, 0x7F19, 0x7F19, 0x17FE, 0x7F1A, 0x7F1A, 0x06BA,
+ 0x7F1B, 0x7F1B, 0x1800, 0x7F1C, 0x7F1C, 0x17FF, 0x7F1D, 0x7F1D, 0x0689,
+ 0x7F1E, 0x7F1E, 0x43DF, 0x7F1F, 0x7F1F, 0x1801, 0x7F20, 0x7F20, 0x04BF,
+ 0x7F21, 0x7F27, 0x1802, 0x7F28, 0x7F28, 0x108C, 0x7F29, 0x7F29, 0x0DEA,
+ 0x7F2A, 0x7F2D, 0x1809, 0x7F2E, 0x7F2E, 0x0D02, 0x7F2F, 0x7F33, 0x180D,
+ 0x7F34, 0x7F34, 0x089A, 0x7F35, 0x7F35, 0x1812, 0x7F36, 0x7F36, 0x1C5E,
+ 0x7F37, 0x7F37, 0x43E0, 0x7F38, 0x7F38, 0x06D2, 0x7F39, 0x7F39, 0x43E1,
+ 0x7F3A, 0x7F3A, 0x0C8C, 0x7F3B, 0x7F41, 0x43E2, 0x7F42, 0x7F42, 0x1C5F,
+ 0x7F43, 0x7F43, 0x43E9, 0x7F44, 0x7F45, 0x1C60, 0x7F46, 0x7F4B, 0x43EA,
+ 0x7F4C, 0x7F4C, 0x25E2, 0x7F4D, 0x7F4D, 0x43F0, 0x7F4E, 0x7F4E, 0x269A,
+ 0x7F4F, 0x7F4F, 0x43F1, 0x7F50, 0x7F50, 0x0737, 0x7F51, 0x7F51, 0x0EA9,
+ 0x7F52, 0x7F53, 0x43F2, 0x7F54, 0x7F54, 0x129E, 0x7F55, 0x7F55, 0x0768,
+ 0x7F56, 0x7F56, 0x43F4, 0x7F57, 0x7F57, 0x0A85, 0x7F58, 0x7F58, 0x1A81,
+ 0x7F59, 0x7F59, 0x43F5, 0x7F5A, 0x7F5A, 0x0640, 0x7F5B, 0x7F5E, 0x43F6,
+ 0x7F5F, 0x7F5F, 0x1A83, 0x7F60, 0x7F60, 0x43FA, 0x7F61, 0x7F61, 0x1A82,
+ 0x7F62, 0x7F62, 0x03E0, 0x7F63, 0x7F67, 0x43FB, 0x7F68, 0x7F68, 0x1A85,
+ 0x7F69, 0x7F69, 0x1177, 0x7F6A, 0x7F6A, 0x124C, 0x7F6B, 0x7F6D, 0x4400,
+ 0x7F6E, 0x7F6E, 0x11C2, 0x7F6F, 0x7F6F, 0x4403, 0x7F70, 0x7F70, 0x1EEA,
+ 0x7F71, 0x7F71, 0x1A87, 0x7F72, 0x7F72, 0x0D87, 0x7F73, 0x7F73, 0x4404,
+ 0x7F74, 0x7F74, 0x1A86, 0x7F75, 0x7F76, 0x4405, 0x7F77, 0x7F77, 0x1E2C,
+ 0x7F78, 0x7F78, 0x4407, 0x7F79, 0x7F79, 0x1A88, 0x7F7A, 0x7F7D, 0x4408,
+ 0x7F7E, 0x7F7E, 0x1A8A, 0x7F7F, 0x7F80, 0x440C, 0x7F81, 0x7F81, 0x1A89,
+ 0x7F82, 0x7F84, 0x440E, 0x7F85, 0x7F85, 0x2062, 0x7F86, 0x7F86, 0x24F1,
+ 0x7F87, 0x7F87, 0x4411, 0x7F88, 0x7F88, 0x24F2, 0x7F89, 0x7F89, 0x4412,
+ 0x7F8A, 0x7F8A, 0x101B, 0x7F8B, 0x7F8B, 0x4413, 0x7F8C, 0x7F8C, 0x0C39,
+ 0x7F8D, 0x7F8D, 0x4414, 0x7F8E, 0x7F8E, 0x0AC5, 0x7F8F, 0x7F93, 0x4415,
+ 0x7F94, 0x7F94, 0x06DC, 0x7F95, 0x7F99, 0x441A, 0x7F9A, 0x7F9A, 0x0A30,
+ 0x7F9B, 0x7F9C, 0x441F, 0x7F9D, 0x7F9D, 0x1CC4, 0x7F9E, 0x7F9E, 0x0FAA,
+ 0x7F9F, 0x7F9F, 0x1CC5, 0x7FA0, 0x7FA0, 0x4421, 0x7FA1, 0x7FA1, 0x0F48,
+ 0x7FA2, 0x7FA3, 0x4422, 0x7FA4, 0x7FA4, 0x0C95, 0x7FA5, 0x7FA5, 0x25F2,
+ 0x7FA6, 0x7FA6, 0x4424, 0x7FA7, 0x7FA7, 0x1CC6, 0x7FA8, 0x7FA8, 0x4425,
+ 0x7FA9, 0x7FA9, 0x2215, 0x7FAA, 0x7FAE, 0x4426, 0x7FAF, 0x7FB0, 0x1CC7,
+ 0x7FB1, 0x7FB1, 0x442B, 0x7FB2, 0x7FB2, 0x1CC9, 0x7FB3, 0x7FB7, 0x442C,
+ 0x7FB8, 0x7FB8, 0x130E, 0x7FB9, 0x7FB9, 0x06F9, 0x7FBA, 0x7FBB, 0x4431,
+ 0x7FBC, 0x7FBC, 0x176D, 0x7FBD, 0x7FBD, 0x10D5, 0x7FBE, 0x7FBE, 0x4433,
+ 0x7FBF, 0x7FBF, 0x1CDE, 0x7FC0, 0x7FC0, 0x4434, 0x7FC1, 0x7FC1, 0x0EDB,
+ 0x7FC2, 0x7FC4, 0x4435, 0x7FC5, 0x7FC5, 0x0506, 0x7FC6, 0x7FC9, 0x4438,
+ 0x7FCA, 0x7FCA, 0x1B98, 0x7FCB, 0x7FCB, 0x443C, 0x7FCC, 0x7FCC, 0x1075,
+ 0x7FCD, 0x7FCD, 0x443D, 0x7FCE, 0x7FCE, 0x1CDF, 0x7FCF, 0x7FD1, 0x443E,
+ 0x7FD2, 0x7FD2, 0x21AE, 0x7FD3, 0x7FD3, 0x4441, 0x7FD4, 0x7FD4, 0x0F55,
+ 0x7FD5, 0x7FD5, 0x1CE0, 0x7FD6, 0x7FD7, 0x4442, 0x7FD8, 0x7FD8, 0x0C49,
+ 0x7FD9, 0x7FDE, 0x4444, 0x7FDF, 0x7FDF, 0x05B5, 0x7FE0, 0x7FE0, 0x0567,
+ 0x7FE1, 0x7FE1, 0x1CE2, 0x7FE2, 0x7FE4, 0x444A, 0x7FE5, 0x7FE5, 0x1CE1,
+ 0x7FE6, 0x7FE6, 0x1CE3, 0x7FE7, 0x7FE8, 0x444D, 0x7FE9, 0x7FE9, 0x1CE4,
+ 0x7FEA, 0x7FED, 0x444F, 0x7FEE, 0x7FEE, 0x1CE5, 0x7FEF, 0x7FEF, 0x4453,
+ 0x7FF0, 0x7FF0, 0x0769, 0x7FF1, 0x7FF1, 0x03CA, 0x7FF2, 0x7FF2, 0x4454,
+ 0x7FF3, 0x7FF3, 0x1CE6, 0x7FF4, 0x7FF8, 0x4455, 0x7FF9, 0x7FF9, 0x20E0,
+ 0x7FFA, 0x7FFA, 0x445A, 0x7FFB, 0x7FFB, 0x064A, 0x7FFC, 0x7FFC, 0x1074,
+ 0x7FFD, 0x7FFF, 0x445B, 0x8000, 0x8000, 0x1032, 0x8001, 0x8001, 0x09BA,
+ 0x8002, 0x8002, 0x445E, 0x8003, 0x8003, 0x0949, 0x8004, 0x8004, 0x1953,
+ 0x8005, 0x8005, 0x1180, 0x8006, 0x8006, 0x191A, 0x8007, 0x800A, 0x445F,
+ 0x800B, 0x800B, 0x1BD7, 0x800C, 0x800C, 0x0637, 0x800D, 0x800D, 0x0D98,
+ 0x800E, 0x800F, 0x4463, 0x8010, 0x8010, 0x0B30, 0x8011, 0x8011, 0x4465,
+ 0x8012, 0x8012, 0x1BCB, 0x8013, 0x8013, 0x4466, 0x8014, 0x8014, 0x1BCC,
+ 0x8015, 0x8015, 0x06F6, 0x8016, 0x8016, 0x1BCD, 0x8017, 0x8017, 0x077B,
+ 0x8018, 0x8018, 0x1108, 0x8019, 0x8019, 0x03DD, 0x801A, 0x801B, 0x4467,
+ 0x801C, 0x801C, 0x1BCE, 0x801D, 0x801F, 0x4469, 0x8020, 0x8020, 0x1BCF,
+ 0x8021, 0x8021, 0x446C, 0x8022, 0x8022, 0x1BD0, 0x8023, 0x8024, 0x446D,
+ 0x8025, 0x8027, 0x1BD1, 0x8028, 0x8028, 0x1BD5, 0x8029, 0x8029, 0x1BD4,
+ 0x802A, 0x802A, 0x0B96, 0x802B, 0x802B, 0x446F, 0x802C, 0x802C, 0x25C2,
+ 0x802D, 0x802D, 0x4470, 0x802E, 0x802E, 0x25C1, 0x802F, 0x8030, 0x4471,
+ 0x8031, 0x8031, 0x1BD6, 0x8032, 0x8032, 0x4473, 0x8033, 0x8033, 0x0639,
+ 0x8034, 0x8034, 0x4474, 0x8035, 0x8035, 0x1BD8, 0x8036, 0x8036, 0x1035,
+ 0x8037, 0x8037, 0x14B1, 0x8038, 0x8038, 0x0DBF, 0x8039, 0x803A, 0x4475,
+ 0x803B, 0x803B, 0x0501, 0x803C, 0x803C, 0x4477, 0x803D, 0x803D, 0x0583,
+ 0x803E, 0x803E, 0x4478, 0x803F, 0x803F, 0x06FB, 0x8040, 0x8041, 0x4479,
+ 0x8042, 0x8042, 0x0B57, 0x8043, 0x8043, 0x1BD9, 0x8044, 0x8045, 0x447B,
+ 0x8046, 0x8046, 0x1BDA, 0x8047, 0x8049, 0x447D, 0x804A, 0x804A, 0x0A0D,
+ 0x804B, 0x804B, 0x0A44, 0x804C, 0x804C, 0x11AF, 0x804D, 0x804D, 0x1BDB,
+ 0x804E, 0x8051, 0x4480, 0x8052, 0x8052, 0x1BDC, 0x8053, 0x8053, 0x4484,
+ 0x8054, 0x8054, 0x09F3, 0x8055, 0x8055, 0x4485, 0x8056, 0x8056, 0x2128,
+ 0x8057, 0x8057, 0x4486, 0x8058, 0x8058, 0x0BD7, 0x8059, 0x8059, 0x4487,
+ 0x805A, 0x805A, 0x090A, 0x805B, 0x805D, 0x4488, 0x805E, 0x805E, 0x2199,
+ 0x805F, 0x8068, 0x448B, 0x8069, 0x8069, 0x1BDD, 0x806A, 0x806A, 0x0552,
+ 0x806B, 0x806E, 0x4495, 0x806F, 0x806F, 0x2017, 0x8070, 0x8070, 0x1EA0,
+ 0x8071, 0x8071, 0x1BDE, 0x8072, 0x8072, 0x2125, 0x8073, 0x8073, 0x214D,
+ 0x8074, 0x8074, 0x4499, 0x8075, 0x8075, 0x25C4, 0x8076, 0x8076, 0x209D,
+ 0x8077, 0x8077, 0x228A, 0x8078, 0x8078, 0x449A, 0x8079, 0x8079, 0x25C3,
+ 0x807A, 0x807C, 0x449B, 0x807D, 0x807D, 0x2179, 0x807E, 0x807E, 0x2038,
+ 0x807F, 0x807F, 0x1A1E, 0x8080, 0x8080, 0x1A1D, 0x8081, 0x8082, 0x449E,
+ 0x8083, 0x8083, 0x0DD5, 0x8084, 0x8084, 0x1065, 0x8085, 0x8085, 0x2155,
+ 0x8086, 0x8086, 0x0DB6, 0x8087, 0x8087, 0x1179, 0x8088, 0x8088, 0x44A0,
+ 0x8089, 0x8089, 0x0CBD, 0x808A, 0x808A, 0x44A1, 0x808B, 0x808B, 0x09CA,
+ 0x808C, 0x808C, 0x0814, 0x808D, 0x8092, 0x44A2, 0x8093, 0x8093, 0x1971,
+ 0x8094, 0x8095, 0x44A8, 0x8096, 0x8096, 0x0F6F, 0x8097, 0x8097, 0x44AA,
+ 0x8098, 0x8098, 0x11E1, 0x8099, 0x8099, 0x44AB, 0x809A, 0x809A, 0x0606,
+ 0x809B, 0x809B, 0x06D3, 0x809C, 0x809C, 0x1970, 0x809D, 0x809D, 0x06C9,
+ 0x809E, 0x809E, 0x44AC, 0x809F, 0x809F, 0x196F, 0x80A0, 0x80A0, 0x04CB,
+ 0x80A1, 0x80A1, 0x0722, 0x80A2, 0x80A2, 0x11AA, 0x80A3, 0x80A3, 0x44AD,
+ 0x80A4, 0x80A4, 0x0691, 0x80A5, 0x80A5, 0x0667, 0x80A6, 0x80A8, 0x44AE,
+ 0x80A9, 0x80A9, 0x085A, 0x80AA, 0x80AA, 0x065B, 0x80AB, 0x80AB, 0x1976,
+ 0x80AC, 0x80AC, 0x44B1, 0x80AD, 0x80AD, 0x1977, 0x80AE, 0x80AE, 0x03C4,
+ 0x80AF, 0x80AF, 0x095C, 0x80B0, 0x80B0, 0x44B2, 0x80B1, 0x80B1, 0x1975,
+ 0x80B2, 0x80B2, 0x10E2, 0x80B3, 0x80B3, 0x44B3, 0x80B4, 0x80B4, 0x1978,
+ 0x80B5, 0x80B6, 0x44B4, 0x80B7, 0x80B7, 0x1979, 0x80B8, 0x80B9, 0x44B6,
+ 0x80BA, 0x80BA, 0x066B, 0x80BB, 0x80BB, 0x44B8, 0x80BC, 0x80BC, 0x1972,
+ 0x80BD, 0x80BD, 0x1974, 0x80BE, 0x80BE, 0x0D2F, 0x80BF, 0x80BF, 0x11D6,
+ 0x80C0, 0x80C0, 0x116E, 0x80C1, 0x80C1, 0x0F7D, 0x80C2, 0x80C2, 0x197F,
+ 0x80C3, 0x80C3, 0x0EC7, 0x80C4, 0x80C4, 0x1980, 0x80C5, 0x80C5, 0x44B9,
+ 0x80C6, 0x80C6, 0x0589, 0x80C7, 0x80CB, 0x44BA, 0x80CC, 0x80CC, 0x041C,
+ 0x80CD, 0x80CD, 0x1982, 0x80CE, 0x80CE, 0x0DF8, 0x80CF, 0x80D5, 0x44BF,
+ 0x80D6, 0x80D6, 0x0B97, 0x80D7, 0x80D7, 0x1983, 0x80D8, 0x80D8, 0x44C6,
+ 0x80D9, 0x80D9, 0x1981, 0x80DA, 0x80DA, 0x0BA0, 0x80DB, 0x80DB, 0x197E,
+ 0x80DC, 0x80DC, 0x0D3B, 0x80DD, 0x80DD, 0x1985, 0x80DE, 0x80DE, 0x0406,
+ 0x80DF, 0x80E0, 0x44C7, 0x80E1, 0x80E1, 0x07B1, 0x80E2, 0x80E3, 0x44C9,
+ 0x80E4, 0x80E4, 0x126D, 0x80E5, 0x80E5, 0x1BC7, 0x80E6, 0x80E6, 0x44CB,
+ 0x80E7, 0x80EA, 0x197A, 0x80EB, 0x80EB, 0x1986, 0x80EC, 0x80EC, 0x179A,
+ 0x80ED, 0x80ED, 0x1989, 0x80EE, 0x80EE, 0x44CC, 0x80EF, 0x80EF, 0x0975,
+ 0x80F0, 0x80F0, 0x104F, 0x80F1, 0x80F1, 0x1987, 0x80F2, 0x80F2, 0x198C,
+ 0x80F3, 0x80F3, 0x06E7, 0x80F4, 0x80F4, 0x1988, 0x80F5, 0x80F5, 0x44CD,
+ 0x80F6, 0x80F6, 0x088B, 0x80F7, 0x80F7, 0x44CE, 0x80F8, 0x80F8, 0x0FA3,
+ 0x80F9, 0x80F9, 0x44CF, 0x80FA, 0x80FA, 0x03C2, 0x80FB, 0x80FB, 0x44D0,
+ 0x80FC, 0x80FC, 0x198D, 0x80FD, 0x80FD, 0x0B3F, 0x80FE, 0x80FF, 0x44D1,
+ 0x8100, 0x8101, 0x44D3, 0x8102, 0x8102, 0x11AB, 0x8103, 0x8104, 0x44D5,
+ 0x8105, 0x8105, 0x21D2, 0x8106, 0x8106, 0x0563, 0x8107, 0x8108, 0x44D7,
+ 0x8109, 0x8109, 0x0A9D, 0x810A, 0x810A, 0x082C, 0x810B, 0x810C, 0x44D9,
+ 0x810D, 0x810E, 0x198A, 0x810F, 0x810F, 0x1123, 0x8110, 0x8110, 0x0C09,
+ 0x8111, 0x8111, 0x0B37, 0x8112, 0x8112, 0x198F, 0x8113, 0x8113, 0x0B68,
+ 0x8114, 0x8114, 0x1309, 0x8115, 0x8115, 0x44DB, 0x8116, 0x8116, 0x0478,
+ 0x8117, 0x8117, 0x44DC, 0x8118, 0x8118, 0x1994, 0x8119, 0x8119, 0x44DD,
+ 0x811A, 0x811A, 0x0896, 0x811B, 0x811B, 0x24C7, 0x811C, 0x811D, 0x44DE,
+ 0x811E, 0x811E, 0x1992, 0x811F, 0x812B, 0x44E0, 0x812C, 0x812C, 0x1993,
+ 0x812D, 0x812E, 0x44ED, 0x812F, 0x812F, 0x06A7, 0x8130, 0x8130, 0x44EF,
+ 0x8131, 0x8131, 0x0E82, 0x8132, 0x8132, 0x1995, 0x8133, 0x8135, 0x44F0,
+ 0x8136, 0x8136, 0x1991, 0x8137, 0x8137, 0x44F3, 0x8138, 0x8138, 0x09FC,
+ 0x8139, 0x8139, 0x2279, 0x813A, 0x813D, 0x44F4, 0x813E, 0x813E, 0x0BC1,
+ 0x813F, 0x8145, 0x44F8, 0x8146, 0x8146, 0x0E46, 0x8147, 0x8147, 0x44FF,
+ 0x8148, 0x8148, 0x1996, 0x8149, 0x8149, 0x4500, 0x814A, 0x814A, 0x099B,
+ 0x814B, 0x814B, 0x103F, 0x814C, 0x814C, 0x1997, 0x814D, 0x814D, 0x4501,
+ 0x814E, 0x814E, 0x2123, 0x814F, 0x814F, 0x4502, 0x8150, 0x8150, 0x06AA,
+ 0x8151, 0x8151, 0x06A8, 0x8152, 0x8152, 0x4503, 0x8153, 0x8153, 0x1998,
+ 0x8154, 0x8154, 0x0C38, 0x8155, 0x8155, 0x0EA4, 0x8156, 0x8156, 0x24C5,
+ 0x8157, 0x8158, 0x4504, 0x8159, 0x815A, 0x199A, 0x815B, 0x815F, 0x4506,
+ 0x8160, 0x8160, 0x199D, 0x8161, 0x8161, 0x24C9, 0x8162, 0x8164, 0x450B,
+ 0x8165, 0x8165, 0x0F93, 0x8166, 0x8166, 0x2094, 0x8167, 0x8167, 0x19A2,
+ 0x8168, 0x8168, 0x450E, 0x8169, 0x8169, 0x199E, 0x816A, 0x816A, 0x450F,
+ 0x816B, 0x816B, 0x2296, 0x816C, 0x816C, 0x4510, 0x816D, 0x816D, 0x19A1,
+ 0x816E, 0x816E, 0x0CD4, 0x816F, 0x816F, 0x4511, 0x8170, 0x8170, 0x1025,
+ 0x8171, 0x8171, 0x199C, 0x8172, 0x8173, 0x4512, 0x8174, 0x8174, 0x1999,
+ 0x8175, 0x8177, 0x4514, 0x8178, 0x8178, 0x1E77, 0x8179, 0x8179, 0x06B4,
+ 0x817A, 0x817A, 0x0F46, 0x817B, 0x817B, 0x0B48, 0x817C, 0x817D, 0x199F,
+ 0x817E, 0x817E, 0x0E2D, 0x817F, 0x817F, 0x0E79, 0x8180, 0x8180, 0x03FD,
+ 0x8181, 0x8181, 0x4517, 0x8182, 0x8182, 0x19A6, 0x8183, 0x8187, 0x4518,
+ 0x8188, 0x8188, 0x19A5, 0x8189, 0x8189, 0x451D, 0x818A, 0x818A, 0x0479,
+ 0x818B, 0x818E, 0x451E, 0x818F, 0x818F, 0x06DB, 0x8190, 0x8190, 0x4522,
+ 0x8191, 0x8191, 0x19A7, 0x8192, 0x8197, 0x4523, 0x8198, 0x8198, 0x0455,
+ 0x8199, 0x8199, 0x4529, 0x819A, 0x819A, 0x1F06, 0x819B, 0x819B, 0x0E18,
+ 0x819C, 0x819C, 0x0B07, 0x819D, 0x819D, 0x0F12, 0x819E, 0x819F, 0x452A,
+ 0x81A0, 0x81A0, 0x1FA5, 0x81A1, 0x81A2, 0x452C, 0x81A3, 0x81A3, 0x19A9,
+ 0x81A4, 0x81A5, 0x452E, 0x81A6, 0x81A6, 0x19B0, 0x81A7, 0x81A7, 0x4530,
+ 0x81A8, 0x81A8, 0x0BB3, 0x81A9, 0x81A9, 0x2099, 0x81AA, 0x81AA, 0x19AA,
+ 0x81AB, 0x81B2, 0x4531, 0x81B3, 0x81B3, 0x0CFE, 0x81B4, 0x81B9, 0x4539,
+ 0x81BA, 0x81BA, 0x1641, 0x81BB, 0x81BB, 0x19AE, 0x81BC, 0x81BC, 0x453F,
+ 0x81BD, 0x81BD, 0x1EAD, 0x81BE, 0x81BE, 0x24C8, 0x81BF, 0x81BF, 0x20A8,
+ 0x81C0, 0x81C0, 0x0E7F, 0x81C1, 0x81C1, 0x19AF, 0x81C2, 0x81C2, 0x0444,
+ 0x81C3, 0x81C3, 0x109C, 0x81C4, 0x81C5, 0x4540, 0x81C6, 0x81C6, 0x1063,
+ 0x81C7, 0x81C8, 0x4542, 0x81C9, 0x81C9, 0x201F, 0x81CA, 0x81CA, 0x19AD,
+ 0x81CB, 0x81CB, 0x4544, 0x81CC, 0x81CC, 0x19AB, 0x81CD, 0x81CD, 0x20C5,
+ 0x81CE, 0x81CE, 0x4545, 0x81CF, 0x81CF, 0x24CA, 0x81D0, 0x81D7, 0x4546,
+ 0x81D8, 0x81D8, 0x1FF0, 0x81D9, 0x81D9, 0x454E, 0x81DA, 0x81DA, 0x24C6,
+ 0x81DB, 0x81DE, 0x454F, 0x81DF, 0x81DF, 0x225D, 0x81E0, 0x81E0, 0x22DE,
+ 0x81E1, 0x81E2, 0x4553, 0x81E3, 0x81E3, 0x04E1, 0x81E4, 0x81E6, 0x4555,
+ 0x81E7, 0x81E7, 0x1902, 0x81E8, 0x81E8, 0x202C, 0x81E9, 0x81E9, 0x4558,
+ 0x81EA, 0x81EA, 0x1231, 0x81EB, 0x81EB, 0x4559, 0x81EC, 0x81EC, 0x1CA9,
+ 0x81ED, 0x81ED, 0x0519, 0x81EE, 0x81F2, 0x455A, 0x81F3, 0x81F4, 0x11C0,
+ 0x81F5, 0x81F9, 0x455F, 0x81FA, 0x81FA, 0x2161, 0x81FB, 0x81FB, 0x118A,
+ 0x81FC, 0x81FC, 0x08F9, 0x81FD, 0x81FD, 0x4564, 0x81FE, 0x81FE, 0x1CA5,
+ 0x81FF, 0x81FF, 0x4565, 0x8200, 0x8200, 0x102F, 0x8201, 0x8202, 0x1CA6,
+ 0x8203, 0x8203, 0x4566, 0x8204, 0x8204, 0x1CA8, 0x8205, 0x8205, 0x08FA,
+ 0x8206, 0x8206, 0x10C4, 0x8207, 0x8207, 0x223B, 0x8208, 0x8208, 0x21D9,
+ 0x8209, 0x8209, 0x1FCB, 0x820A, 0x820A, 0x1FC9, 0x820B, 0x820B, 0x4567,
+ 0x820C, 0x820D, 0x0D19, 0x820E, 0x820F, 0x4568, 0x8210, 0x8210, 0x1C62,
+ 0x8211, 0x8211, 0x456A, 0x8212, 0x8212, 0x0D7D, 0x8213, 0x8213, 0x456B,
+ 0x8214, 0x8214, 0x0E45, 0x8215, 0x821A, 0x456C, 0x821B, 0x821B, 0x1618,
+ 0x821C, 0x821C, 0x0DA9, 0x821D, 0x821D, 0x4572, 0x821E, 0x821E, 0x0EF7,
+ 0x821F, 0x821F, 0x11DA, 0x8220, 0x8220, 0x4573, 0x8221, 0x8223, 0x1CAB,
+ 0x8224, 0x8227, 0x4574, 0x8228, 0x8228, 0x1CB0, 0x8229, 0x8229, 0x4578,
+ 0x822A, 0x822A, 0x0774, 0x822B, 0x822B, 0x1CB1, 0x822C, 0x822C, 0x03EE,
+ 0x822D, 0x822D, 0x1CAE, 0x822E, 0x822E, 0x4579, 0x822F, 0x822F, 0x1CAF,
+ 0x8230, 0x8230, 0x0873, 0x8231, 0x8231, 0x049C, 0x8232, 0x8232, 0x457A,
+ 0x8233, 0x8234, 0x1CB4, 0x8235, 0x8235, 0x0625, 0x8236, 0x8236, 0x0477,
+ 0x8237, 0x8237, 0x0F3C, 0x8238, 0x8238, 0x1CB2, 0x8239, 0x8239, 0x052F,
+ 0x823A, 0x823A, 0x457B, 0x823B, 0x823B, 0x1CB3, 0x823C, 0x823D, 0x457C,
+ 0x823E, 0x823E, 0x1CB6, 0x823F, 0x8243, 0x457E, 0x8244, 0x8244, 0x1CB7,
+ 0x8245, 0x8246, 0x4583, 0x8247, 0x8247, 0x0E58, 0x8248, 0x8248, 0x4585,
+ 0x8249, 0x8249, 0x1CB8, 0x824A, 0x824A, 0x4586, 0x824B, 0x824B, 0x1CB9,
+ 0x824C, 0x824E, 0x4587, 0x824F, 0x824F, 0x1CBA, 0x8250, 0x8257, 0x458A,
+ 0x8258, 0x8258, 0x0DC7, 0x8259, 0x8259, 0x1E61, 0x825A, 0x825A, 0x1CBB,
+ 0x825B, 0x825E, 0x4592, 0x825F, 0x825F, 0x1CBC, 0x8260, 0x8263, 0x4596,
+ 0x8264, 0x8264, 0x25EF, 0x8265, 0x8265, 0x459A, 0x8266, 0x8266, 0x1F98,
+ 0x8267, 0x8267, 0x459B, 0x8268, 0x8268, 0x1CBD, 0x8269, 0x826A, 0x459C,
+ 0x826B, 0x826B, 0x25F0, 0x826C, 0x826D, 0x459E, 0x826E, 0x826E, 0x1CDC,
+ 0x826F, 0x826F, 0x0A05, 0x8270, 0x8270, 0x085B, 0x8271, 0x8271, 0x1F88,
+ 0x8272, 0x8272, 0x0CE4, 0x8273, 0x8273, 0x1007, 0x8274, 0x8274, 0x1771,
+ 0x8275, 0x8276, 0x45A0, 0x8277, 0x8277, 0x21F8, 0x8278, 0x8278, 0x45A2,
+ 0x8279, 0x8279, 0x13E1, 0x827A, 0x827A, 0x105C, 0x827B, 0x827C, 0x45A3,
+ 0x827D, 0x827D, 0x13E2, 0x827E, 0x827E, 0x03B7, 0x827F, 0x827F, 0x13E3,
+ 0x8280, 0x8281, 0x45A5, 0x8282, 0x8282, 0x08AB, 0x8283, 0x8283, 0x45A7,
+ 0x8284, 0x8284, 0x13E7, 0x8285, 0x8287, 0x45A8, 0x8288, 0x8288, 0x1278,
+ 0x8289, 0x8289, 0x45AB, 0x828A, 0x828A, 0x13E5, 0x828B, 0x828B, 0x10D8,
+ 0x828C, 0x828C, 0x45AC, 0x828D, 0x828D, 0x0D0F, 0x828E, 0x828E, 0x13E8,
+ 0x828F, 0x828F, 0x13E4, 0x8290, 0x8290, 0x45AD, 0x8291, 0x8291, 0x13E9,
+ 0x8292, 0x8292, 0x0AA7, 0x8293, 0x8296, 0x45AE, 0x8297, 0x8297, 0x13EA,
+ 0x8298, 0x8298, 0x13F3, 0x8299, 0x8299, 0x13EB, 0x829A, 0x829B, 0x45B2,
+ 0x829C, 0x829C, 0x0EEE, 0x829D, 0x829D, 0x11A4, 0x829E, 0x829E, 0x45B4,
+ 0x829F, 0x829F, 0x13FD, 0x82A0, 0x82A0, 0x45B5, 0x82A1, 0x82A1, 0x13FB,
+ 0x82A2, 0x82A3, 0x45B6, 0x82A4, 0x82A4, 0x1400, 0x82A5, 0x82A5, 0x08B7,
+ 0x82A6, 0x82A6, 0x0A52, 0x82A7, 0x82A7, 0x45B8, 0x82A8, 0x82A8, 0x13E6,
+ 0x82A9, 0x82A9, 0x13F9, 0x82AA, 0x82AA, 0x13FC, 0x82AB, 0x82AB, 0x13EC,
+ 0x82AC, 0x82AC, 0x066F, 0x82AD, 0x82AD, 0x03D0, 0x82AE, 0x82AE, 0x13F5,
+ 0x82AF, 0x82AF, 0x0F89, 0x82B0, 0x82B0, 0x13EF, 0x82B1, 0x82B1, 0x07BD,
+ 0x82B2, 0x82B2, 0x45B9, 0x82B3, 0x82B3, 0x0659, 0x82B4, 0x82B4, 0x13FA,
+ 0x82B5, 0x82B6, 0x45BA, 0x82B7, 0x82B7, 0x13F4, 0x82B8, 0x82B8, 0x13ED,
+ 0x82B9, 0x82B9, 0x0C58, 0x82BA, 0x82BA, 0x45BC, 0x82BB, 0x82BB, 0x2322,
+ 0x82BC, 0x82BC, 0x45BD, 0x82BD, 0x82BD, 0x0FE8, 0x82BE, 0x82BE, 0x13EE,
+ 0x82BF, 0x82C0, 0x45BE, 0x82C1, 0x82C1, 0x13F8, 0x82C2, 0x82C3, 0x45C0,
+ 0x82C4, 0x82C4, 0x13FE, 0x82C5, 0x82C6, 0x45C2, 0x82C7, 0x82C7, 0x0EBC,
+ 0x82C8, 0x82C8, 0x13F0, 0x82C9, 0x82C9, 0x45C4, 0x82CA, 0x82CA, 0x13F1,
+ 0x82CB, 0x82CC, 0x13F6, 0x82CD, 0x82CD, 0x049B, 0x82CE, 0x82CE, 0x13FF,
+ 0x82CF, 0x82CF, 0x0DCA, 0x82D0, 0x82D0, 0x45C5, 0x82D1, 0x82D1, 0x10FA,
+ 0x82D2, 0x82D2, 0x1409, 0x82D3, 0x82D3, 0x140D, 0x82D4, 0x82D4, 0x0DF9,
+ 0x82D5, 0x82D5, 0x1414, 0x82D6, 0x82D6, 0x45C6, 0x82D7, 0x82D7, 0x0AEC,
+ 0x82D8, 0x82D8, 0x140A, 0x82D9, 0x82DA, 0x45C7, 0x82DB, 0x82DB, 0x094E,
+ 0x82DC, 0x82DC, 0x1407, 0x82DD, 0x82DD, 0x45C9, 0x82DE, 0x82DE, 0x0405,
+ 0x82DF, 0x82DF, 0x070F, 0x82E0, 0x82E0, 0x1413, 0x82E1, 0x82E1, 0x1401,
+ 0x82E2, 0x82E2, 0x45CA, 0x82E3, 0x82E3, 0x13F2, 0x82E4, 0x82E4, 0x1404,
+ 0x82E5, 0x82E5, 0x0CCF, 0x82E6, 0x82E6, 0x096D, 0x82E7, 0x82E7, 0x2336,
+ 0x82E8, 0x82EA, 0x45CB, 0x82EB, 0x82EB, 0x0CF4, 0x82EC, 0x82EE, 0x45CE,
+ 0x82EF, 0x82EF, 0x0426, 0x82F0, 0x82F0, 0x45D1, 0x82F1, 0x82F1, 0x1087,
+ 0x82F2, 0x82F3, 0x45D2, 0x82F4, 0x82F4, 0x1408, 0x82F5, 0x82F6, 0x45D4,
+ 0x82F7, 0x82F7, 0x1403, 0x82F8, 0x82F8, 0x45D6, 0x82F9, 0x82F9, 0x0BDA,
+ 0x82FA, 0x82FA, 0x45D7, 0x82FB, 0x82FB, 0x140C, 0x82FC, 0x82FF, 0x45D8,
+ 0x8300, 0x8300, 0x45DC, 0x8301, 0x8301, 0x121F, 0x8302, 0x8302, 0x0AB4,
+ 0x8303, 0x8303, 0x0653, 0x8304, 0x8304, 0x0C4E, 0x8305, 0x8305, 0x0AAE,
+ 0x8306, 0x8306, 0x1410, 0x8307, 0x8307, 0x1406, 0x8308, 0x8308, 0x1419,
+ 0x8309, 0x8309, 0x1402, 0x830A, 0x830B, 0x45DD, 0x830C, 0x830C, 0x140B,
+ 0x830D, 0x830D, 0x45DF, 0x830E, 0x830E, 0x08D4, 0x830F, 0x830F, 0x1405,
+ 0x8310, 0x8310, 0x45E0, 0x8311, 0x8311, 0x140E, 0x8312, 0x8313, 0x45E1,
+ 0x8314, 0x8315, 0x1411, 0x8316, 0x8316, 0x45E3, 0x8317, 0x8317, 0x1426,
+ 0x8318, 0x8319, 0x45E4, 0x831A, 0x831A, 0x140F, 0x831B, 0x831B, 0x142E,
+ 0x831C, 0x831C, 0x1415, 0x831D, 0x8326, 0x45E6, 0x8327, 0x8327, 0x085E,
+ 0x8328, 0x8328, 0x0547, 0x8329, 0x832A, 0x45F0, 0x832B, 0x832B, 0x0AA8,
+ 0x832C, 0x832C, 0x04AE, 0x832D, 0x832D, 0x1428, 0x832E, 0x832E, 0x45F2,
+ 0x832F, 0x832F, 0x1420, 0x8330, 0x8330, 0x45F3, 0x8331, 0x8331, 0x141D,
+ 0x8332, 0x8332, 0x45F4, 0x8333, 0x8333, 0x142A, 0x8334, 0x8334, 0x141C,
+ 0x8335, 0x8335, 0x1077, 0x8336, 0x8336, 0x04AF, 0x8337, 0x8337, 0x45F5,
+ 0x8338, 0x8338, 0x0CB2, 0x8339, 0x8339, 0x0CBE, 0x833A, 0x833A, 0x1429,
+ 0x833B, 0x833B, 0x45F6, 0x833C, 0x833C, 0x141B, 0x833D, 0x833F, 0x45F7,
+ 0x8340, 0x8340, 0x1425, 0x8341, 0x8342, 0x45FA, 0x8343, 0x8343, 0x1423,
+ 0x8344, 0x8345, 0x45FC, 0x8346, 0x8346, 0x08D2, 0x8347, 0x8347, 0x1422,
+ 0x8348, 0x8348, 0x45FE, 0x8349, 0x8349, 0x04A4, 0x834A, 0x834E, 0x45FF,
+ 0x834F, 0x834F, 0x1421, 0x8350, 0x8350, 0x0869, 0x8351, 0x8351, 0x1416,
+ 0x8352, 0x8352, 0x07D9, 0x8353, 0x8353, 0x4604, 0x8354, 0x8354, 0x09DE,
+ 0x8355, 0x8359, 0x4605, 0x835A, 0x835A, 0x0847, 0x835B, 0x835C, 0x1417,
+ 0x835D, 0x835D, 0x460A, 0x835E, 0x835E, 0x141F, 0x835F, 0x835F, 0x1424,
+ 0x8360, 0x8360, 0x1427, 0x8361, 0x8361, 0x0595, 0x8362, 0x8362, 0x460B,
+ 0x8363, 0x8363, 0x0CB4, 0x8364, 0x8364, 0x07FC, 0x8365, 0x8365, 0x142C,
+ 0x8366, 0x8366, 0x142B, 0x8367, 0x8367, 0x1090, 0x8368, 0x8368, 0x142D,
+ 0x8369, 0x8369, 0x142F, 0x836A, 0x836A, 0x1431, 0x836B, 0x836B, 0x1078,
+ 0x836C, 0x836C, 0x1430, 0x836D, 0x836E, 0x1432, 0x836F, 0x836F, 0x1030,
+ 0x8370, 0x8376, 0x460C, 0x8377, 0x8377, 0x0780, 0x8378, 0x8378, 0x1435,
+ 0x8379, 0x837A, 0x4613, 0x837B, 0x837B, 0x1442, 0x837C, 0x837C, 0x143D,
+ 0x837D, 0x837D, 0x1440, 0x837E, 0x8384, 0x4615, 0x8385, 0x8385, 0x143C,
+ 0x8386, 0x8386, 0x0BED, 0x8387, 0x8388, 0x461C, 0x8389, 0x8389, 0x09DD,
+ 0x838A, 0x838A, 0x22AB, 0x838B, 0x838D, 0x461E, 0x838E, 0x838E, 0x0CE8,
+ 0x838F, 0x8391, 0x4621, 0x8392, 0x8392, 0x141A, 0x8393, 0x8393, 0x143A,
+ 0x8394, 0x8395, 0x4624, 0x8396, 0x8396, 0x1FBF, 0x8397, 0x8397, 0x4626,
+ 0x8398, 0x8398, 0x1443, 0x8399, 0x839A, 0x4627, 0x839B, 0x839B, 0x141E,
+ 0x839C, 0x839C, 0x143B, 0x839D, 0x839D, 0x4629, 0x839E, 0x839E, 0x1444,
+ 0x839F, 0x839F, 0x462A, 0x83A0, 0x83A0, 0x1438, 0x83A1, 0x83A1, 0x462B,
+ 0x83A2, 0x83A2, 0x1F7D, 0x83A3, 0x83A6, 0x462C, 0x83A7, 0x83A7, 0x2333,
+ 0x83A8, 0x83A8, 0x1445, 0x83A9, 0x83A9, 0x143F, 0x83AA, 0x83AA, 0x1439,
+ 0x83AB, 0x83AB, 0x0B0D, 0x83AC, 0x83AF, 0x4630, 0x83B0, 0x83B0, 0x1434,
+ 0x83B1, 0x83B1, 0x099E, 0x83B2, 0x83B2, 0x09F4, 0x83B3, 0x83B4, 0x1436,
+ 0x83B5, 0x83B5, 0x4634, 0x83B6, 0x83B6, 0x143E, 0x83B7, 0x83B7, 0x0806,
+ 0x83B8, 0x83B8, 0x1441, 0x83B9, 0x83B9, 0x108D, 0x83BA, 0x83BA, 0x1446,
+ 0x83BB, 0x83BB, 0x4635, 0x83BC, 0x83BC, 0x1447, 0x83BD, 0x83BD, 0x0AAC,
+ 0x83BE, 0x83BF, 0x4636, 0x83C0, 0x83C0, 0x145E, 0x83C1, 0x83C1, 0x1448,
+ 0x83C2, 0x83C4, 0x4638, 0x83C5, 0x83C5, 0x145D, 0x83C6, 0x83C6, 0x463B,
+ 0x83C7, 0x83C7, 0x0716, 0x83C8, 0x83C9, 0x463C, 0x83CA, 0x83CA, 0x0904,
+ 0x83CB, 0x83CB, 0x463E, 0x83CC, 0x83CC, 0x0929, 0x83CD, 0x83CE, 0x463F,
+ 0x83CF, 0x83CF, 0x0781, 0x83D0, 0x83D3, 0x4641, 0x83D4, 0x83D4, 0x1456,
+ 0x83D5, 0x83D5, 0x4645, 0x83D6, 0x83D6, 0x1451, 0x83D7, 0x83D7, 0x4646,
+ 0x83D8, 0x83D8, 0x144B, 0x83D9, 0x83DB, 0x4647, 0x83DC, 0x83DC, 0x0492,
+ 0x83DD, 0x83DD, 0x144F, 0x83DE, 0x83DE, 0x464A, 0x83DF, 0x83DF, 0x1457,
+ 0x83E0, 0x83E0, 0x046B, 0x83E1, 0x83E1, 0x1461, 0x83E2, 0x83E4, 0x464B,
+ 0x83E5, 0x83E5, 0x144A, 0x83E6, 0x83E8, 0x464E, 0x83E9, 0x83E9, 0x0BEF,
+ 0x83EA, 0x83EA, 0x145C, 0x83EB, 0x83EE, 0x4651, 0x83EF, 0x83EF, 0x1F4D,
+ 0x83F0, 0x83F0, 0x1460, 0x83F1, 0x83F1, 0x0A2B, 0x83F2, 0x83F2, 0x0663,
+ 0x83F3, 0x83F7, 0x4655, 0x83F8, 0x83F9, 0x145A, 0x83FA, 0x83FC, 0x465A,
+ 0x83FD, 0x83FD, 0x1450, 0x83FE, 0x83FF, 0x465D, 0x8400, 0x8400, 0x465F,
+ 0x8401, 0x8401, 0x1449, 0x8402, 0x8402, 0x4660, 0x8403, 0x8403, 0x1459,
+ 0x8404, 0x8404, 0x0E24, 0x8405, 0x8405, 0x4661, 0x8406, 0x8406, 0x1455,
+ 0x8407, 0x8407, 0x2334, 0x8408, 0x8409, 0x4662, 0x840A, 0x840A, 0x1FF1,
+ 0x840B, 0x840B, 0x144E, 0x840C, 0x840C, 0x0ACD, 0x840D, 0x840D, 0x0BDB,
+ 0x840E, 0x840E, 0x0EBD, 0x840F, 0x840F, 0x1458, 0x8410, 0x8410, 0x4664,
+ 0x8411, 0x8411, 0x1454, 0x8412, 0x8417, 0x4665, 0x8418, 0x8418, 0x144D,
+ 0x8419, 0x841B, 0x466B, 0x841C, 0x841C, 0x1452, 0x841D, 0x841D, 0x0A83,
+ 0x841E, 0x8423, 0x466E, 0x8424, 0x8425, 0x108E, 0x8426, 0x8426, 0x145F,
+ 0x8427, 0x8427, 0x0F61, 0x8428, 0x8428, 0x0CD3, 0x8429, 0x842B, 0x4674,
+ 0x842C, 0x842C, 0x218B, 0x842D, 0x8430, 0x4677, 0x8431, 0x8431, 0x1472,
+ 0x8432, 0x8434, 0x467B, 0x8435, 0x8435, 0x2349, 0x8436, 0x8437, 0x467E,
+ 0x8438, 0x8438, 0x1453, 0x8439, 0x843B, 0x4680, 0x843C, 0x843C, 0x146C,
+ 0x843D, 0x843D, 0x0A8B, 0x843E, 0x8445, 0x4683, 0x8446, 0x8446, 0x146D,
+ 0x8447, 0x8448, 0x468B, 0x8449, 0x8449, 0x220B, 0x844A, 0x8450, 0x468D,
+ 0x8451, 0x8451, 0x1463, 0x8452, 0x8452, 0x2346, 0x8453, 0x8456, 0x4694,
+ 0x8457, 0x8457, 0x11F7, 0x8458, 0x8458, 0x4698, 0x8459, 0x8459, 0x1465,
+ 0x845A, 0x845A, 0x1464, 0x845B, 0x845B, 0x06EB, 0x845C, 0x845C, 0x1462,
+ 0x845D, 0x8460, 0x4699, 0x8461, 0x8461, 0x0BEE, 0x8462, 0x8462, 0x469D,
+ 0x8463, 0x8463, 0x05EC, 0x8464, 0x8464, 0x2347, 0x8465, 0x8465, 0x469E,
+ 0x8466, 0x8466, 0x2193, 0x8467, 0x8468, 0x469F, 0x8469, 0x8469, 0x146E,
+ 0x846A, 0x846A, 0x46A1, 0x846B, 0x846B, 0x07B0, 0x846C, 0x846C, 0x1124,
+ 0x846D, 0x846D, 0x1473, 0x846E, 0x846E, 0x46A2, 0x846F, 0x846F, 0x26A1,
+ 0x8470, 0x8470, 0x46A3, 0x8471, 0x8471, 0x0553, 0x8472, 0x8472, 0x46A4,
+ 0x8473, 0x8473, 0x1466, 0x8474, 0x8474, 0x46A5, 0x8475, 0x8475, 0x0988,
+ 0x8476, 0x8476, 0x146F, 0x8477, 0x8477, 0x1F62, 0x8478, 0x8478, 0x146B,
+ 0x8479, 0x8479, 0x46A6, 0x847A, 0x847A, 0x1469, 0x847B, 0x8481, 0x46A7,
+ 0x8482, 0x8482, 0x05BA, 0x8483, 0x8486, 0x46AE, 0x8487, 0x8488, 0x1467,
+ 0x8489, 0x8489, 0x146A, 0x848A, 0x848A, 0x46B2, 0x848B, 0x848B, 0x0880,
+ 0x848C, 0x848C, 0x1470, 0x848D, 0x848D, 0x46B3, 0x848E, 0x848E, 0x1471,
+ 0x848F, 0x8492, 0x46B4, 0x8493, 0x8493, 0x234D, 0x8494, 0x8494, 0x2348,
+ 0x8495, 0x8496, 0x46B8, 0x8497, 0x8497, 0x1481, 0x8498, 0x8498, 0x46BA,
+ 0x8499, 0x8499, 0x0ACE, 0x849A, 0x849B, 0x46BB, 0x849C, 0x849C, 0x0DD7,
+ 0x849D, 0x84A0, 0x46BD, 0x84A1, 0x84A1, 0x147E, 0x84A2, 0x84AE, 0x46C1,
+ 0x84AF, 0x84AF, 0x1297, 0x84B0, 0x84B1, 0x46CE, 0x84B2, 0x84B2, 0x0BF0,
+ 0x84B3, 0x84B3, 0x46D0, 0x84B4, 0x84B4, 0x1480, 0x84B5, 0x84B7, 0x46D1,
+ 0x84B8, 0x84B8, 0x1195, 0x84B9, 0x84B9, 0x147F, 0x84BA, 0x84BA, 0x147C,
+ 0x84BB, 0x84BB, 0x46D4, 0x84BC, 0x84BC, 0x1E60, 0x84BD, 0x84BD, 0x1478,
+ 0x84BE, 0x84BE, 0x46D5, 0x84BF, 0x84BF, 0x147B, 0x84C0, 0x84C0, 0x2345,
+ 0x84C1, 0x84C1, 0x1474, 0x84C2, 0x84C3, 0x46D6, 0x84C4, 0x84C4, 0x0FB9,
+ 0x84C5, 0x84C8, 0x46D8, 0x84C9, 0x84C9, 0x0CB3, 0x84CA, 0x84CA, 0x147A,
+ 0x84CB, 0x84CB, 0x1F12, 0x84CC, 0x84CC, 0x46DC, 0x84CD, 0x84CD, 0x1475,
+ 0x84CE, 0x84CF, 0x46DD, 0x84D0, 0x84D0, 0x1476, 0x84D1, 0x84D1, 0x0DE7,
+ 0x84D2, 0x84D2, 0x46DF, 0x84D3, 0x84D3, 0x1479, 0x84D4, 0x84D5, 0x46E0,
+ 0x84D6, 0x84D6, 0x0436, 0x84D7, 0x84DC, 0x46E2, 0x84DD, 0x84DD, 0x09A1,
+ 0x84DE, 0x84DE, 0x46E8, 0x84DF, 0x84DF, 0x082E, 0x84E0, 0x84E0, 0x147D,
+ 0x84E1, 0x84E2, 0x46E9, 0x84E3, 0x84E3, 0x1483, 0x84E4, 0x84E4, 0x46EB,
+ 0x84E5, 0x84E5, 0x1482, 0x84E6, 0x84E6, 0x1477, 0x84E7, 0x84EB, 0x46EC,
+ 0x84EC, 0x84EC, 0x0BAF, 0x84ED, 0x84ED, 0x46F1, 0x84EE, 0x84EE, 0x2018,
+ 0x84EF, 0x84EF, 0x2335, 0x84F0, 0x84F0, 0x1487, 0x84F1, 0x84FB, 0x46F2,
+ 0x84FC, 0x84FC, 0x148E, 0x84FD, 0x84FD, 0x233C, 0x84FE, 0x84FE, 0x46FD,
+ 0x84FF, 0x84FF, 0x148D, 0x8500, 0x850B, 0x46FE, 0x850C, 0x850C, 0x1484,
+ 0x850D, 0x8510, 0x470A, 0x8511, 0x8511, 0x0AF4, 0x8512, 0x8512, 0x470E,
+ 0x8513, 0x8513, 0x0AA2, 0x8514, 0x8514, 0x266F, 0x8515, 0x8516, 0x470F,
+ 0x8517, 0x8517, 0x1182, 0x8518, 0x8519, 0x4711, 0x851A, 0x851A, 0x0EC4,
+ 0x851B, 0x851D, 0x4713, 0x851E, 0x851E, 0x2351, 0x851F, 0x851F, 0x1489,
+ 0x8520, 0x8520, 0x4716, 0x8521, 0x8521, 0x0493, 0x8522, 0x8522, 0x4717,
+ 0x8523, 0x8523, 0x1FA0, 0x8524, 0x8525, 0x4718, 0x8526, 0x8526, 0x2338,
+ 0x8527, 0x852A, 0x471A, 0x852B, 0x852B, 0x0B4B, 0x852C, 0x852C, 0x0D76,
+ 0x852D, 0x852D, 0x221B, 0x852E, 0x8536, 0x471E, 0x8537, 0x8537, 0x0C3B,
+ 0x8538, 0x8538, 0x1486, 0x8539, 0x8539, 0x1488, 0x853A, 0x853A, 0x148A,
+ 0x853B, 0x853B, 0x148C, 0x853C, 0x853C, 0x03B5, 0x853D, 0x853D, 0x0437,
+ 0x853E, 0x8540, 0x4727, 0x8541, 0x8541, 0x2342, 0x8542, 0x8542, 0x472A,
+ 0x8543, 0x8543, 0x1496, 0x8544, 0x8545, 0x472B, 0x8546, 0x8546, 0x234F,
+ 0x8547, 0x8547, 0x472D, 0x8548, 0x8548, 0x1490, 0x8549, 0x8549, 0x0887,
+ 0x854A, 0x854A, 0x0CCA, 0x854B, 0x854D, 0x472E, 0x854E, 0x854E, 0x233D,
+ 0x854F, 0x8551, 0x4731, 0x8552, 0x8552, 0x2344, 0x8553, 0x8553, 0x2331,
+ 0x8554, 0x8554, 0x4734, 0x8555, 0x8555, 0x234B, 0x8556, 0x8556, 0x148B,
+ 0x8557, 0x8557, 0x4735, 0x8558, 0x8558, 0x233B, 0x8559, 0x8559, 0x148F,
+ 0x855A, 0x855D, 0x4736, 0x855E, 0x855E, 0x1493, 0x855F, 0x8561, 0x473A,
+ 0x8562, 0x8562, 0x2350, 0x8563, 0x8563, 0x473D, 0x8564, 0x8564, 0x1492,
+ 0x8565, 0x8567, 0x473E, 0x8568, 0x8568, 0x1491, 0x8569, 0x8569, 0x1EB4,
+ 0x856A, 0x856A, 0x21A6, 0x856B, 0x856C, 0x4741, 0x856D, 0x856D, 0x21CB,
+ 0x856E, 0x8571, 0x4743, 0x8572, 0x8572, 0x1497, 0x8573, 0x8573, 0x4747,
+ 0x8574, 0x8574, 0x110F, 0x8575, 0x8576, 0x4748, 0x8577, 0x8577, 0x2355,
+ 0x8578, 0x8578, 0x474A, 0x8579, 0x8579, 0x149D, 0x857A, 0x857A, 0x1494,
+ 0x857B, 0x857B, 0x1498, 0x857C, 0x857D, 0x474B, 0x857E, 0x857E, 0x09C4,
+ 0x857F, 0x8583, 0x474D, 0x8584, 0x8584, 0x040A, 0x8585, 0x8585, 0x14A0,
+ 0x8586, 0x8586, 0x4752, 0x8587, 0x8587, 0x149B, 0x8588, 0x8588, 0x233E,
+ 0x8589, 0x8589, 0x4753, 0x858A, 0x858A, 0x1F74, 0x858B, 0x858B, 0x4754,
+ 0x858C, 0x858C, 0x2330, 0x858D, 0x858E, 0x4755, 0x858F, 0x858F, 0x149C,
+ 0x8590, 0x8590, 0x4757, 0x8591, 0x8591, 0x2680, 0x8592, 0x8593, 0x4758,
+ 0x8594, 0x8594, 0x20DA, 0x8595, 0x859A, 0x475A, 0x859B, 0x859B, 0x0FCF,
+ 0x859C, 0x859C, 0x149F, 0x859D, 0x859E, 0x4760, 0x859F, 0x859F, 0x234A,
+ 0x85A0, 0x85A3, 0x4762, 0x85A4, 0x85A4, 0x1499, 0x85A5, 0x85A5, 0x4766,
+ 0x85A6, 0x85A6, 0x1F91, 0x85A7, 0x85A7, 0x4767, 0x85A8, 0x85A8, 0x149A,
+ 0x85A9, 0x85A9, 0x2107, 0x85AA, 0x85AA, 0x0F88, 0x85AB, 0x85AD, 0x4768,
+ 0x85AE, 0x85AE, 0x149E, 0x85AF, 0x85AF, 0x0D84, 0x85B0, 0x85B0, 0x14A3,
+ 0x85B1, 0x85B6, 0x476B, 0x85B7, 0x85B7, 0x14A2, 0x85B8, 0x85B8, 0x4771,
+ 0x85B9, 0x85B9, 0x14A1, 0x85BA, 0x85BA, 0x233F, 0x85BB, 0x85C0, 0x4772,
+ 0x85C1, 0x85C1, 0x14A5, 0x85C2, 0x85C8, 0x4778, 0x85C9, 0x85C9, 0x08B6,
+ 0x85CA, 0x85CC, 0x477F, 0x85CD, 0x85CD, 0x1FF4, 0x85CE, 0x85CE, 0x2343,
+ 0x85CF, 0x85CF, 0x049F, 0x85D0, 0x85D0, 0x0AEF, 0x85D1, 0x85D2, 0x4782,
+ 0x85D3, 0x85D3, 0x14A4, 0x85D4, 0x85D4, 0x4784, 0x85D5, 0x85D5, 0x0B7B,
+ 0x85D6, 0x85DB, 0x4785, 0x85DC, 0x85DC, 0x14A6, 0x85DD, 0x85DD, 0x2212,
+ 0x85DE, 0x85E3, 0x478B, 0x85E4, 0x85E4, 0x0E2C, 0x85E5, 0x85E5, 0x2207,
+ 0x85E6, 0x85E8, 0x4791, 0x85E9, 0x85E9, 0x0647, 0x85EA, 0x85EA, 0x2359,
+ 0x85EB, 0x85F3, 0x4794, 0x85F4, 0x85F4, 0x2254, 0x85F5, 0x85F5, 0x479D,
+ 0x85F6, 0x85F6, 0x2332, 0x85F7, 0x85F8, 0x479E, 0x85F9, 0x85F9, 0x1E26,
+ 0x85FA, 0x85FA, 0x2357, 0x85FB, 0x85FB, 0x1128, 0x85FC, 0x85FE, 0x47A0,
+ 0x85FF, 0x85FF, 0x14A7, 0x8600, 0x8603, 0x47A3, 0x8604, 0x8604, 0x2358,
+ 0x8605, 0x8605, 0x14A9, 0x8606, 0x8606, 0x2042, 0x8607, 0x8607, 0x2153,
+ 0x8608, 0x860A, 0x47A7, 0x860B, 0x860B, 0x20BB, 0x860C, 0x8610, 0x47AA,
+ 0x8611, 0x8611, 0x0B05, 0x8612, 0x8615, 0x47AF, 0x8616, 0x8616, 0x14AB,
+ 0x8617, 0x8619, 0x47B3, 0x861A, 0x861A, 0x235A, 0x861B, 0x861D, 0x47B6,
+ 0x861E, 0x861E, 0x2356, 0x861F, 0x8621, 0x47B9, 0x8622, 0x8622, 0x2337,
+ 0x8623, 0x8626, 0x47BC, 0x8627, 0x8627, 0x14A8, 0x8628, 0x8628, 0x47C0,
+ 0x8629, 0x8629, 0x14AA, 0x862A, 0x862C, 0x47C1, 0x862D, 0x862D, 0x1FF9,
+ 0x862E, 0x8637, 0x47C4, 0x8638, 0x8638, 0x115B, 0x8639, 0x8639, 0x47CE,
+ 0x863A, 0x863A, 0x2353, 0x863B, 0x863B, 0x47CF, 0x863C, 0x863C, 0x14AC,
+ 0x863D, 0x863E, 0x47D0, 0x863F, 0x863F, 0x2061, 0x8640, 0x864C, 0x47D2,
+ 0x864D, 0x864D, 0x1BF0, 0x864E, 0x864E, 0x07B7, 0x864F, 0x864F, 0x0A59,
+ 0x8650, 0x8650, 0x0B71, 0x8651, 0x8651, 0x0A6E, 0x8652, 0x8653, 0x47DF,
+ 0x8654, 0x8654, 0x1BF1, 0x8655, 0x8655, 0x1E95, 0x8656, 0x8659, 0x47E1,
+ 0x865A, 0x865A, 0x0FB4, 0x865B, 0x865B, 0x47E5, 0x865C, 0x865C, 0x2049,
+ 0x865D, 0x865D, 0x47E6, 0x865E, 0x865E, 0x10C2, 0x865F, 0x865F, 0x1F42,
+ 0x8660, 0x8661, 0x47E7, 0x8662, 0x8662, 0x196D, 0x8663, 0x8666, 0x47E9,
+ 0x8667, 0x8667, 0x1FE8, 0x8668, 0x866A, 0x47ED, 0x866B, 0x866B, 0x050B,
+ 0x866C, 0x866C, 0x1BF2, 0x866D, 0x866D, 0x47F0, 0x866E, 0x866E, 0x1BF3,
+ 0x866F, 0x8670, 0x47F1, 0x8671, 0x8671, 0x0D44, 0x8672, 0x8678, 0x47F3,
+ 0x8679, 0x8679, 0x079E, 0x867A, 0x867A, 0x1BF5, 0x867B, 0x867B, 0x1BF7,
+ 0x867C, 0x867C, 0x1BF6, 0x867D, 0x867D, 0x0DD9, 0x867E, 0x867E, 0x0F27,
+ 0x867F, 0x867F, 0x1BF4, 0x8680, 0x8680, 0x0D4B, 0x8681, 0x8681, 0x1056,
+ 0x8682, 0x8682, 0x0A93, 0x8683, 0x8689, 0x47FA, 0x868A, 0x868A, 0x0ED2,
+ 0x868B, 0x868B, 0x1BFA, 0x868C, 0x868C, 0x0401, 0x868D, 0x868D, 0x1BF9,
+ 0x868E, 0x8692, 0x4801, 0x8693, 0x8693, 0x1C00, 0x8694, 0x8694, 0x4806,
+ 0x8695, 0x8695, 0x0496, 0x8696, 0x869B, 0x4807, 0x869C, 0x869C, 0x0FEA,
+ 0x869D, 0x869D, 0x1BFC, 0x869E, 0x86A2, 0x480D, 0x86A3, 0x86A3, 0x1BFE,
+ 0x86A4, 0x86A4, 0x112C, 0x86A5, 0x86A6, 0x4812, 0x86A7, 0x86A7, 0x1BFD,
+ 0x86A8, 0x86A8, 0x1BF8, 0x86A9, 0x86A9, 0x1C01, 0x86AA, 0x86AA, 0x1BFF,
+ 0x86AB, 0x86AB, 0x4814, 0x86AC, 0x86AC, 0x1BFB, 0x86AD, 0x86AE, 0x4815,
+ 0x86AF, 0x86AF, 0x1C09, 0x86B0, 0x86B0, 0x1C06, 0x86B1, 0x86B1, 0x1C08,
+ 0x86B2, 0x86B3, 0x4817, 0x86B4, 0x86B4, 0x1C0C, 0x86B5, 0x86B5, 0x1C04,
+ 0x86B6, 0x86B6, 0x1C02, 0x86B7, 0x86B9, 0x4819, 0x86BA, 0x86BA, 0x1C07,
+ 0x86BB, 0x86BF, 0x481C, 0x86C0, 0x86C0, 0x11FA, 0x86C1, 0x86C3, 0x4821,
+ 0x86C4, 0x86C4, 0x1C03, 0x86C5, 0x86C5, 0x4824, 0x86C6, 0x86C6, 0x0C76,
+ 0x86C7, 0x86C7, 0x0D18, 0x86C8, 0x86C8, 0x4825, 0x86C9, 0x86C9, 0x1C0A,
+ 0x86CA, 0x86CA, 0x071F, 0x86CB, 0x86CB, 0x0591, 0x86CC, 0x86CD, 0x4826,
+ 0x86CE, 0x86CE, 0x1C05, 0x86CF, 0x86CF, 0x1C0B, 0x86D0, 0x86D0, 0x1C12,
+ 0x86D1, 0x86D1, 0x1C18, 0x86D2, 0x86D3, 0x4828, 0x86D4, 0x86D4, 0x07EC,
+ 0x86D5, 0x86D7, 0x482A, 0x86D8, 0x86D8, 0x1C17, 0x86D9, 0x86D9, 0x0E8D,
+ 0x86DA, 0x86DA, 0x482D, 0x86DB, 0x86DB, 0x11EA, 0x86DC, 0x86DD, 0x482E,
+ 0x86DE, 0x86DE, 0x1C14, 0x86DF, 0x86DF, 0x1C16, 0x86E0, 0x86E3, 0x4830,
+ 0x86E4, 0x86E4, 0x06ED, 0x86E5, 0x86E8, 0x4834, 0x86E9, 0x86E9, 0x1C0D,
+ 0x86EA, 0x86EC, 0x4838, 0x86ED, 0x86ED, 0x1C10, 0x86EE, 0x86EE, 0x0AA0,
+ 0x86EF, 0x86EF, 0x483B, 0x86F0, 0x86F0, 0x117E, 0x86F1, 0x86F2, 0x1C0E,
+ 0x86F3, 0x86F3, 0x1C11, 0x86F4, 0x86F4, 0x1C15, 0x86F5, 0x86F7, 0x483C,
+ 0x86F8, 0x86F8, 0x1C1B, 0x86F9, 0x86F9, 0x10A1, 0x86FA, 0x86FA, 0x25DA,
+ 0x86FB, 0x86FD, 0x483F, 0x86FE, 0x86FE, 0x0629, 0x86FF, 0x86FF, 0x4842,
+ 0x8700, 0x8700, 0x0D88, 0x8701, 0x8701, 0x4843, 0x8702, 0x8702, 0x0681,
+ 0x8703, 0x8703, 0x1C19, 0x8704, 0x8705, 0x4844, 0x8706, 0x8706, 0x25D7,
+ 0x8707, 0x8707, 0x1C1A, 0x8708, 0x8708, 0x1C1C, 0x8709, 0x8709, 0x1C1F,
+ 0x870A, 0x870A, 0x1C1D, 0x870B, 0x870C, 0x4846, 0x870D, 0x870D, 0x1C1E,
+ 0x870E, 0x8711, 0x4848, 0x8712, 0x8712, 0x0FFA, 0x8713, 0x8713, 0x1C13,
+ 0x8714, 0x8714, 0x484C, 0x8715, 0x8715, 0x0E7A, 0x8716, 0x8716, 0x484D,
+ 0x8717, 0x8717, 0x0EDE, 0x8718, 0x8718, 0x11A8, 0x8719, 0x8719, 0x484E,
+ 0x871A, 0x871A, 0x1C25, 0x871B, 0x871B, 0x484F, 0x871C, 0x871C, 0x0AE0,
+ 0x871D, 0x871D, 0x4850, 0x871E, 0x871E, 0x1C22, 0x871F, 0x8720, 0x4851,
+ 0x8721, 0x8721, 0x099A, 0x8722, 0x8722, 0x1C2E, 0x8723, 0x8723, 0x1C20,
+ 0x8724, 0x8724, 0x4853, 0x8725, 0x8725, 0x1C23, 0x8726, 0x8728, 0x4854,
+ 0x8729, 0x8729, 0x1C2A, 0x872A, 0x872D, 0x4857, 0x872E, 0x872E, 0x1C24,
+ 0x872F, 0x8730, 0x485B, 0x8731, 0x8731, 0x1C29, 0x8732, 0x8733, 0x485D,
+ 0x8734, 0x8734, 0x1C28, 0x8735, 0x8736, 0x485F, 0x8737, 0x8737, 0x1C2B,
+ 0x8738, 0x873A, 0x4861, 0x873B, 0x873B, 0x1C21, 0x873C, 0x873D, 0x4864,
+ 0x873E, 0x873E, 0x1C26, 0x873F, 0x873F, 0x1C2C, 0x8740, 0x8746, 0x4866,
+ 0x8747, 0x8747, 0x1091, 0x8748, 0x8748, 0x1C27, 0x8749, 0x8749, 0x04BC,
+ 0x874A, 0x874B, 0x486D, 0x874C, 0x874C, 0x1C34, 0x874D, 0x874D, 0x486F,
+ 0x874E, 0x874E, 0x0F76, 0x874F, 0x8752, 0x4870, 0x8753, 0x8753, 0x1C37,
+ 0x8754, 0x8754, 0x4874, 0x8755, 0x8755, 0x212E, 0x8756, 0x8756, 0x4875,
+ 0x8757, 0x8757, 0x07DD, 0x8758, 0x8758, 0x4876, 0x8759, 0x8759, 0x1C3B,
+ 0x875A, 0x875F, 0x4877, 0x8760, 0x8760, 0x1C32, 0x8761, 0x8762, 0x487D,
+ 0x8763, 0x8763, 0x1C38, 0x8764, 0x8764, 0x1C3A, 0x8765, 0x8765, 0x1C3C,
+ 0x8766, 0x8766, 0x21B2, 0x8767, 0x876D, 0x487F, 0x876E, 0x876E, 0x1C35,
+ 0x876F, 0x876F, 0x4886, 0x8770, 0x8770, 0x1C33, 0x8771, 0x8773, 0x4887,
+ 0x8774, 0x8774, 0x07B2, 0x8775, 0x8775, 0x488A, 0x8776, 0x8776, 0x05DC,
+ 0x8777, 0x8777, 0x488B, 0x8778, 0x8778, 0x219E, 0x8779, 0x877A, 0x488C,
+ 0x877B, 0x877B, 0x1C31, 0x877C, 0x877C, 0x1C39, 0x877D, 0x877E, 0x1C2F,
+ 0x877F, 0x8781, 0x488E, 0x8782, 0x8782, 0x1C2D, 0x8783, 0x8783, 0x1C46,
+ 0x8784, 0x8784, 0x25DC, 0x8785, 0x8785, 0x1C43, 0x8786, 0x8787, 0x4891,
+ 0x8788, 0x8788, 0x1C42, 0x8789, 0x878A, 0x4893, 0x878B, 0x878B, 0x1C36,
+ 0x878C, 0x878C, 0x4895, 0x878D, 0x878D, 0x0CB5, 0x878E, 0x8792, 0x4896,
+ 0x8793, 0x8793, 0x1C3D, 0x8794, 0x8796, 0x489B, 0x8797, 0x8797, 0x1C45,
+ 0x8798, 0x879D, 0x489E, 0x879E, 0x879E, 0x206C, 0x879F, 0x879F, 0x0AFD,
+ 0x87A0, 0x87A1, 0x48A4, 0x87A2, 0x87A2, 0x2226, 0x87A3, 0x87A7, 0x48A6,
+ 0x87A8, 0x87A8, 0x1C3F, 0x87A9, 0x87AA, 0x48AB, 0x87AB, 0x87AB, 0x1C47,
+ 0x87AC, 0x87AC, 0x1C49, 0x87AD, 0x87AD, 0x1C44, 0x87AE, 0x87AE, 0x48AD,
+ 0x87AF, 0x87AF, 0x1C3E, 0x87B0, 0x87B2, 0x48AE, 0x87B3, 0x87B3, 0x1C4B,
+ 0x87B4, 0x87B4, 0x48B1, 0x87B5, 0x87B5, 0x1C4A, 0x87B6, 0x87B9, 0x48B2,
+ 0x87BA, 0x87BA, 0x0A84, 0x87BB, 0x87BB, 0x25E0, 0x87BC, 0x87BC, 0x48B6,
+ 0x87BD, 0x87BD, 0x1C4E, 0x87BE, 0x87BF, 0x48B7, 0x87C0, 0x87C0, 0x1C50,
+ 0x87C1, 0x87C3, 0x48B9, 0x87C4, 0x87C4, 0x227B, 0x87C5, 0x87C5, 0x48BC,
+ 0x87C6, 0x87C6, 0x1C41, 0x87C7, 0x87C7, 0x48BD, 0x87C8, 0x87C8, 0x25DE,
+ 0x87C9, 0x87C9, 0x48BE, 0x87CA, 0x87CA, 0x1C51, 0x87CB, 0x87CB, 0x1C4C,
+ 0x87CC, 0x87CD, 0x48BF, 0x87CE, 0x87CE, 0x25E1, 0x87CF, 0x87D0, 0x48C1,
+ 0x87D1, 0x87D1, 0x1C4F, 0x87D2, 0x87D2, 0x1C40, 0x87D3, 0x87D3, 0x1C4D,
+ 0x87D4, 0x87DA, 0x48C3, 0x87DB, 0x87DB, 0x1C52, 0x87DC, 0x87DF, 0x48CA,
+ 0x87E0, 0x87E0, 0x1C54, 0x87E1, 0x87E2, 0x48CE, 0x87E3, 0x87E3, 0x25D5,
+ 0x87E4, 0x87E4, 0x48D0, 0x87E5, 0x87E5, 0x1C48, 0x87E6, 0x87E9, 0x48D1,
+ 0x87EA, 0x87EA, 0x1C53, 0x87EB, 0x87EB, 0x48D5, 0x87EC, 0x87EC, 0x1E6B,
+ 0x87ED, 0x87ED, 0x48D6, 0x87EE, 0x87EE, 0x1C55, 0x87EF, 0x87EF, 0x25DB,
+ 0x87F0, 0x87F1, 0x48D7, 0x87F2, 0x87F2, 0x1E89, 0x87F3, 0x87F5, 0x48D9,
+ 0x87F6, 0x87F6, 0x25D9, 0x87F7, 0x87F8, 0x48DC, 0x87F9, 0x87F9, 0x0F82,
+ 0x87FA, 0x87FA, 0x48DE, 0x87FB, 0x87FB, 0x2211, 0x87FC, 0x87FD, 0x48DF,
+ 0x87FE, 0x87FE, 0x1C58, 0x87FF, 0x87FF, 0x48E1, 0x8800, 0x8802, 0x48E2,
+ 0x8803, 0x8803, 0x130D, 0x8804, 0x8804, 0x48E5, 0x8805, 0x8805, 0x2229,
+ 0x8806, 0x8806, 0x25D6, 0x8807, 0x8809, 0x48E6, 0x880A, 0x880A, 0x1C59,
+ 0x880B, 0x880F, 0x48E9, 0x8810, 0x8810, 0x25DD, 0x8811, 0x8811, 0x25DF,
+ 0x8812, 0x8812, 0x48EE, 0x8813, 0x8813, 0x1C57, 0x8814, 0x8814, 0x48EF,
+ 0x8815, 0x8815, 0x0CBF, 0x8816, 0x8816, 0x1C56, 0x8817, 0x881A, 0x48F0,
+ 0x881B, 0x881B, 0x1C5A, 0x881C, 0x881E, 0x48F4, 0x881F, 0x881F, 0x1FEF,
+ 0x8820, 0x8820, 0x48F7, 0x8821, 0x8821, 0x1C5B, 0x8822, 0x8822, 0x0543,
+ 0x8823, 0x8823, 0x25D8, 0x8824, 0x8830, 0x48F8, 0x8831, 0x8831, 0x1F29,
+ 0x8832, 0x8832, 0x1A8D, 0x8833, 0x8835, 0x4905, 0x8836, 0x8836, 0x1E5B,
+ 0x8837, 0x8838, 0x4908, 0x8839, 0x8839, 0x1C5C, 0x883A, 0x883A, 0x490A,
+ 0x883B, 0x883B, 0x2076, 0x883C, 0x883C, 0x1C5D, 0x883D, 0x883F, 0x490B,
+ 0x8840, 0x8840, 0x0FD3, 0x8841, 0x8843, 0x490E, 0x8844, 0x8844, 0x1CAA,
+ 0x8845, 0x8845, 0x0F91, 0x8846, 0x8846, 0x2297, 0x8847, 0x8849, 0x4911,
+ 0x884A, 0x884A, 0x2690, 0x884B, 0x884B, 0x4914, 0x884C, 0x884C, 0x0F9B,
+ 0x884D, 0x884D, 0x1005, 0x884E, 0x8852, 0x4915, 0x8853, 0x8853, 0x213F,
+ 0x8854, 0x8854, 0x0F3B, 0x8855, 0x8856, 0x491A, 0x8857, 0x8857, 0x08A7,
+ 0x8858, 0x8858, 0x491C, 0x8859, 0x8859, 0x0FEC, 0x885A, 0x885A, 0x491D,
+ 0x885B, 0x885B, 0x2198, 0x885C, 0x885C, 0x491E, 0x885D, 0x885D, 0x1E88,
+ 0x885E, 0x8860, 0x491F, 0x8861, 0x8861, 0x0799, 0x8862, 0x8862, 0x15ED,
+ 0x8863, 0x8863, 0x1049, 0x8864, 0x8864, 0x1BA6, 0x8865, 0x8865, 0x0480,
+ 0x8866, 0x8867, 0x4922, 0x8868, 0x8868, 0x0456, 0x8869, 0x8869, 0x1BA7,
+ 0x886A, 0x886A, 0x4924, 0x886B, 0x886B, 0x0CF9, 0x886C, 0x886C, 0x04E9,
+ 0x886D, 0x886D, 0x4925, 0x886E, 0x886E, 0x1306, 0x886F, 0x886F, 0x4926,
+ 0x8870, 0x8870, 0x0D9A, 0x8871, 0x8871, 0x4927, 0x8872, 0x8872, 0x1BA8,
+ 0x8873, 0x8876, 0x4928, 0x8877, 0x8877, 0x11D3, 0x8878, 0x8878, 0x492C,
+ 0x8879, 0x8879, 0x228C, 0x887A, 0x887C, 0x492D, 0x887D, 0x887D, 0x1BA9,
+ 0x887E, 0x887E, 0x1CBE, 0x887F, 0x887F, 0x1BAA, 0x8880, 0x8880, 0x4930,
+ 0x8881, 0x8881, 0x10EF, 0x8882, 0x8882, 0x1BAB, 0x8883, 0x8883, 0x4931,
+ 0x8884, 0x8884, 0x03CB, 0x8885, 0x8885, 0x1CBF, 0x8886, 0x8887, 0x4932,
+ 0x8888, 0x8888, 0x1CC0, 0x8889, 0x888A, 0x4934, 0x888B, 0x888B, 0x057F,
+ 0x888C, 0x888C, 0x4936, 0x888D, 0x888D, 0x0B9C, 0x888E, 0x8891, 0x4937,
+ 0x8892, 0x8892, 0x0E0E, 0x8893, 0x8895, 0x493B, 0x8896, 0x8896, 0x0FAF,
+ 0x8897, 0x889B, 0x493E, 0x889C, 0x889C, 0x0E91, 0x889D, 0x88A1, 0x4943,
+ 0x88A2, 0x88A2, 0x1BAC, 0x88A3, 0x88A3, 0x4948, 0x88A4, 0x88A4, 0x1307,
+ 0x88A5, 0x88AA, 0x4949, 0x88AB, 0x88AB, 0x0424, 0x88AC, 0x88AC, 0x494F,
+ 0x88AD, 0x88AD, 0x0F1B, 0x88AE, 0x88B0, 0x4950, 0x88B1, 0x88B1, 0x069F,
+ 0x88B2, 0x88B6, 0x4953, 0x88B7, 0x88B7, 0x1BAE, 0x88B8, 0x88BB, 0x4958,
+ 0x88BC, 0x88BC, 0x1BAF, 0x88BD, 0x88C0, 0x495C, 0x88C1, 0x88C1, 0x048A,
+ 0x88C2, 0x88C2, 0x0A1A, 0x88C3, 0x88C4, 0x4960, 0x88C5, 0x88C5, 0x120D,
+ 0x88C6, 0x88C6, 0x1BAD, 0x88C7, 0x88C8, 0x4962, 0x88C9, 0x88C9, 0x1BB0,
+ 0x88CA, 0x88CA, 0x25F1, 0x88CB, 0x88CD, 0x4964, 0x88CE, 0x88CE, 0x1BB2,
+ 0x88CF, 0x88CF, 0x200C, 0x88D0, 0x88D1, 0x4967, 0x88D2, 0x88D2, 0x130A,
+ 0x88D3, 0x88D3, 0x4969, 0x88D4, 0x88D4, 0x1068, 0x88D5, 0x88D5, 0x10E6,
+ 0x88D6, 0x88D7, 0x496A, 0x88D8, 0x88D8, 0x1CC1, 0x88D9, 0x88D9, 0x0C94,
+ 0x88DA, 0x88DB, 0x496C, 0x88DC, 0x88DC, 0x1E58, 0x88DD, 0x88DD, 0x22AC,
+ 0x88DE, 0x88DE, 0x496E, 0x88DF, 0x88DF, 0x1CC2, 0x88E0, 0x88E1, 0x496F,
+ 0x88E2, 0x88E2, 0x1BB1, 0x88E3, 0x88E3, 0x1BB3, 0x88E4, 0x88E4, 0x0970,
+ 0x88E5, 0x88E5, 0x1BB4, 0x88E6, 0x88E7, 0x4971, 0x88E8, 0x88E8, 0x1BB8,
+ 0x88E9, 0x88EF, 0x4973, 0x88F0, 0x88F0, 0x1BBA, 0x88F1, 0x88F1, 0x1BB5,
+ 0x88F2, 0x88F2, 0x497A, 0x88F3, 0x88F3, 0x0D0A, 0x88F4, 0x88F4, 0x0BA2,
+ 0x88F5, 0x88F7, 0x497B, 0x88F8, 0x88F8, 0x0A8A, 0x88F9, 0x88F9, 0x0755,
+ 0x88FA, 0x88FB, 0x497E, 0x88FC, 0x88FC, 0x1BB7, 0x88FD, 0x88FD, 0x26A7,
+ 0x88FE, 0x88FE, 0x1BB9, 0x88FF, 0x88FF, 0x4980, 0x8900, 0x8901, 0x4981,
+ 0x8902, 0x8902, 0x072C, 0x8903, 0x8906, 0x4983, 0x8907, 0x8907, 0x2676,
+ 0x8908, 0x8909, 0x4987, 0x890A, 0x890A, 0x1BBF, 0x890B, 0x890F, 0x4989,
+ 0x8910, 0x8910, 0x078D, 0x8911, 0x8911, 0x498E, 0x8912, 0x8912, 0x0408,
+ 0x8913, 0x8913, 0x1BBD, 0x8914, 0x8918, 0x498F, 0x8919, 0x8919, 0x1BBC,
+ 0x891A, 0x891A, 0x1BB6, 0x891B, 0x891B, 0x1BBE, 0x891C, 0x8920, 0x4994,
+ 0x8921, 0x8921, 0x1BBB, 0x8922, 0x8924, 0x4999, 0x8925, 0x8925, 0x0CC7,
+ 0x8926, 0x8929, 0x499C, 0x892A, 0x892A, 0x0E7B, 0x892B, 0x892B, 0x1BC1,
+ 0x892C, 0x892F, 0x49A0, 0x8930, 0x8930, 0x1739, 0x8931, 0x8931, 0x49A4,
+ 0x8932, 0x8932, 0x1FE1, 0x8933, 0x8933, 0x25BB, 0x8934, 0x8934, 0x1BC0,
+ 0x8935, 0x8935, 0x49A5, 0x8936, 0x8936, 0x1BC2, 0x8937, 0x8937, 0x49A6,
+ 0x8938, 0x8938, 0x25BE, 0x8939, 0x893A, 0x49A7, 0x893B, 0x893B, 0x22DD,
+ 0x893C, 0x8940, 0x49A9, 0x8941, 0x8941, 0x1BC3, 0x8942, 0x8943, 0x49AE,
+ 0x8944, 0x8944, 0x0F52, 0x8945, 0x8946, 0x49B0, 0x8947, 0x8947, 0x25BD,
+ 0x8948, 0x8955, 0x49B2, 0x8956, 0x8956, 0x1E2A, 0x8957, 0x895C, 0x49C0,
+ 0x895D, 0x895D, 0x25BC, 0x895E, 0x895E, 0x1CC3, 0x895F, 0x895F, 0x08C4,
+ 0x8960, 0x8960, 0x25BA, 0x8961, 0x8963, 0x49C6, 0x8964, 0x8964, 0x25BF,
+ 0x8965, 0x8965, 0x49C9, 0x8966, 0x8966, 0x1BC4, 0x8967, 0x8969, 0x49CA,
+ 0x896A, 0x896A, 0x2187, 0x896B, 0x896B, 0x49CD, 0x896C, 0x896C, 0x266B,
+ 0x896D, 0x896E, 0x49CE, 0x896F, 0x896F, 0x1E7F, 0x8970, 0x8971, 0x49D0,
+ 0x8972, 0x8972, 0x21AD, 0x8973, 0x897A, 0x49D2, 0x897B, 0x897B, 0x1BC5,
+ 0x897C, 0x897E, 0x49DA, 0x897F, 0x897F, 0x0F06, 0x8980, 0x8980, 0x49DD,
+ 0x8981, 0x8981, 0x1031, 0x8982, 0x8982, 0x49DE, 0x8983, 0x8983, 0x1BDF,
+ 0x8984, 0x8985, 0x49DF, 0x8986, 0x8986, 0x06AD, 0x8987, 0x898A, 0x49E1,
+ 0x898B, 0x898B, 0x1F96, 0x898C, 0x898E, 0x49E5, 0x898F, 0x898F, 0x1F32,
+ 0x8990, 0x8992, 0x49E8, 0x8993, 0x8993, 0x2084, 0x8994, 0x8995, 0x49EB,
+ 0x8996, 0x8996, 0x2136, 0x8997, 0x8997, 0x49ED, 0x8998, 0x8998, 0x24B8,
+ 0x8999, 0x89A0, 0x49EE, 0x89A1, 0x89A1, 0x24BA, 0x89A2, 0x89A5, 0x49F6,
+ 0x89A6, 0x89A6, 0x24BC, 0x89A7, 0x89A9, 0x49FA, 0x89AA, 0x89AA, 0x20E4,
+ 0x89AB, 0x89AB, 0x49FD, 0x89AC, 0x89AC, 0x24B9, 0x89AD, 0x89AE, 0x49FE,
+ 0x89AF, 0x89AF, 0x24BD, 0x89B0, 0x89B1, 0x4A00, 0x89B2, 0x89B2, 0x24BE,
+ 0x89B3, 0x89B6, 0x4A02, 0x89B7, 0x89B7, 0x24BF, 0x89B8, 0x89B9, 0x4A06,
+ 0x89BA, 0x89BA, 0x1FD2, 0x89BB, 0x89BC, 0x4A08, 0x89BD, 0x89BD, 0x1FFD,
+ 0x89BE, 0x89BE, 0x4A0A, 0x89BF, 0x89BF, 0x24BB, 0x89C0, 0x89C0, 0x1F2D,
+ 0x89C1, 0x89C1, 0x086E, 0x89C2, 0x89C2, 0x0734, 0x89C3, 0x89C3, 0x4A0B,
+ 0x89C4, 0x89C4, 0x073F, 0x89C5, 0x89C5, 0x0ADE, 0x89C6, 0x89C6, 0x0D6A,
+ 0x89C7, 0x89C7, 0x193A, 0x89C8, 0x89C8, 0x09AB, 0x89C9, 0x89C9, 0x0924,
+ 0x89CA, 0x89CC, 0x193B, 0x89CD, 0x89CD, 0x4A0C, 0x89CE, 0x89D1, 0x193E,
+ 0x89D2, 0x89D2, 0x0898, 0x89D3, 0x89D5, 0x4A0D, 0x89D6, 0x89D6, 0x1D57,
+ 0x89D7, 0x89D9, 0x4A10, 0x89DA, 0x89DA, 0x1D59, 0x89DB, 0x89DB, 0x4A13,
+ 0x89DC, 0x89DC, 0x1D5A, 0x89DD, 0x89DD, 0x4A14, 0x89DE, 0x89DE, 0x1D58,
+ 0x89DF, 0x89E2, 0x4A15, 0x89E3, 0x89E3, 0x08B3, 0x89E4, 0x89E4, 0x4A19,
+ 0x89E5, 0x89E5, 0x1D5B, 0x89E6, 0x89E6, 0x0528, 0x89E7, 0x89EA, 0x4A1A,
+ 0x89EB, 0x89EB, 0x1D5C, 0x89EC, 0x89EE, 0x4A1E, 0x89EF, 0x89EF, 0x1D5D,
+ 0x89F0, 0x89F2, 0x4A21, 0x89F3, 0x89F3, 0x19C0, 0x89F4, 0x89F4, 0x2609,
+ 0x89F5, 0x89F5, 0x4A24, 0x89F6, 0x89F6, 0x260A, 0x89F7, 0x89F7, 0x4A25,
+ 0x89F8, 0x89F8, 0x1E94, 0x89F9, 0x89FF, 0x4A26, 0x8A00, 0x8A00, 0x0FFD,
+ 0x8A01, 0x8A01, 0x22DF, 0x8A02, 0x8A02, 0x1ECB, 0x8A03, 0x8A03, 0x1F0D,
+ 0x8A04, 0x8A06, 0x4A2D, 0x8A07, 0x8A07, 0x12FE, 0x8A08, 0x8A08, 0x1F77,
+ 0x8A09, 0x8A09, 0x4A30, 0x8A0A, 0x8A0A, 0x21EB, 0x8A0B, 0x8A0B, 0x4A31,
+ 0x8A0C, 0x8A0C, 0x22E1, 0x8A0D, 0x8A0D, 0x4A32, 0x8A0E, 0x8A0E, 0x216F,
+ 0x8A0F, 0x8A0F, 0x4A33, 0x8A10, 0x8A10, 0x22E0, 0x8A11, 0x8A12, 0x4A34,
+ 0x8A13, 0x8A13, 0x21EA, 0x8A14, 0x8A14, 0x4A36, 0x8A15, 0x8A15, 0x22E2,
+ 0x8A16, 0x8A16, 0x20CB, 0x8A17, 0x8A17, 0x4A37, 0x8A18, 0x8A18, 0x1F78,
+ 0x8A19, 0x8A1A, 0x4A38, 0x8A1B, 0x8A1B, 0x1EE2, 0x8A1C, 0x8A1C, 0x4A3A,
+ 0x8A1D, 0x8A1D, 0x21F2, 0x8A1E, 0x8A1E, 0x4A3B, 0x8A1F, 0x8A1F, 0x2150,
+ 0x8A20, 0x8A22, 0x4A3C, 0x8A23, 0x8A23, 0x1FD3, 0x8A24, 0x8A24, 0x4A3F,
+ 0x8A25, 0x8A25, 0x22E5, 0x8A26, 0x8A29, 0x4A40, 0x8A2A, 0x8A2A, 0x1EF2,
+ 0x8A2B, 0x8A2C, 0x4A44, 0x8A2D, 0x8A2D, 0x211F, 0x8A2E, 0x8A30, 0x4A46,
+ 0x8A31, 0x8A31, 0x21DD, 0x8A32, 0x8A33, 0x4A49, 0x8A34, 0x8A34, 0x2154,
+ 0x8A35, 0x8A35, 0x4A4B, 0x8A36, 0x8A36, 0x22E7, 0x8A37, 0x8A39, 0x4A4C,
+ 0x8A3A, 0x8A3A, 0x2282, 0x8A3B, 0x8A3D, 0x4A4F, 0x8A3E, 0x8A3E, 0x1D5E,
+ 0x8A3F, 0x8A40, 0x4A52, 0x8A41, 0x8A41, 0x22E6, 0x8A42, 0x8A45, 0x4A54,
+ 0x8A46, 0x8A46, 0x22E8, 0x8A47, 0x8A47, 0x4A58, 0x8A48, 0x8A48, 0x1A84,
+ 0x8A49, 0x8A4D, 0x4A59, 0x8A4E, 0x8A4E, 0x22E4, 0x8A4F, 0x8A4F, 0x4A5E,
+ 0x8A50, 0x8A50, 0x226A, 0x8A51, 0x8A51, 0x4A5F, 0x8A52, 0x8A52, 0x22EB,
+ 0x8A53, 0x8A53, 0x4A60, 0x8A54, 0x8A54, 0x22E9, 0x8A55, 0x8A55, 0x20BD,
+ 0x8A56, 0x8A57, 0x4A61, 0x8A58, 0x8A58, 0x22EA, 0x8A59, 0x8A5A, 0x4A63,
+ 0x8A5B, 0x8A5B, 0x22BD, 0x8A5C, 0x8A5D, 0x4A65, 0x8A5E, 0x8A5E, 0x1E9E,
+ 0x8A5F, 0x8A60, 0x4A67, 0x8A61, 0x8A61, 0x22F6, 0x8A62, 0x8A62, 0x21E7,
+ 0x8A63, 0x8A63, 0x2216, 0x8A64, 0x8A65, 0x4A69, 0x8A66, 0x8A66, 0x2137,
+ 0x8A67, 0x8A68, 0x4A6B, 0x8A69, 0x8A69, 0x212C, 0x8A6A, 0x8A6A, 0x4A6D,
+ 0x8A6B, 0x8A6B, 0x1E68, 0x8A6C, 0x8A6C, 0x22F2, 0x8A6D, 0x8A6D, 0x1F37,
+ 0x8A6E, 0x8A6E, 0x22F3, 0x8A6F, 0x8A6F, 0x4A6E, 0x8A70, 0x8A70, 0x22EF,
+ 0x8A71, 0x8A71, 0x1F50, 0x8A72, 0x8A72, 0x1F10, 0x8A73, 0x8A73, 0x21C8,
+ 0x8A74, 0x8A74, 0x4A6F, 0x8A75, 0x8A75, 0x22F1, 0x8A76, 0x8A78, 0x4A70,
+ 0x8A79, 0x8A79, 0x1153, 0x8A7A, 0x8A7B, 0x4A73, 0x8A7C, 0x8A7C, 0x22F0,
+ 0x8A7D, 0x8A7E, 0x4A75, 0x8A7F, 0x8A7F, 0x22EE, 0x8A80, 0x8A83, 0x4A77,
+ 0x8A84, 0x8A84, 0x22ED, 0x8A85, 0x8A85, 0x229E, 0x8A86, 0x8A86, 0x22EC,
+ 0x8A87, 0x8A87, 0x1FE2, 0x8A88, 0x8A88, 0x4A7B, 0x8A89, 0x8A89, 0x10E3,
+ 0x8A8A, 0x8A8A, 0x0E2F, 0x8A8B, 0x8A8C, 0x4A7C, 0x8A8D, 0x8A8D, 0x20FE,
+ 0x8A8E, 0x8A90, 0x4A7E, 0x8A91, 0x8A92, 0x22F9, 0x8A93, 0x8A93, 0x0D5B,
+ 0x8A94, 0x8A94, 0x4A81, 0x8A95, 0x8A95, 0x1EAF, 0x8A96, 0x8A97, 0x4A82,
+ 0x8A98, 0x8A98, 0x2236, 0x8A99, 0x8A99, 0x4A84, 0x8A9A, 0x8A9A, 0x22F7,
+ 0x8A9B, 0x8A9D, 0x4A85, 0x8A9E, 0x8A9E, 0x223D, 0x8A9F, 0x8A9F, 0x4A88,
+ 0x8AA0, 0x8AA0, 0x1E82, 0x8AA1, 0x8AA1, 0x1FB6, 0x8AA2, 0x8AA2, 0x4A89,
+ 0x8AA3, 0x8AA3, 0x21A4, 0x8AA4, 0x8AA4, 0x21AA, 0x8AA5, 0x8AA5, 0x22F8,
+ 0x8AA6, 0x8AA6, 0x2151, 0x8AA7, 0x8AA7, 0x4A8A, 0x8AA8, 0x8AA8, 0x1F60,
+ 0x8AA9, 0x8AAB, 0x4A8B, 0x8AAC, 0x8AAC, 0x2147, 0x8AAD, 0x8AAF, 0x4A8E,
+ 0x8AB0, 0x8AB0, 0x2145, 0x8AB1, 0x8AB1, 0x4A91, 0x8AB2, 0x8AB2, 0x1FDC,
+ 0x8AB3, 0x8AB5, 0x4A92, 0x8AB6, 0x8AB6, 0x2301, 0x8AB7, 0x8AB8, 0x4A95,
+ 0x8AB9, 0x8AB9, 0x1EF5, 0x8ABA, 0x8ABB, 0x4A97, 0x8ABC, 0x8ABC, 0x2218,
+ 0x8ABD, 0x8ABE, 0x4A99, 0x8ABF, 0x8ABF, 0x1EC6, 0x8AC0, 0x8AC1, 0x4A9B,
+ 0x8AC2, 0x8AC2, 0x2300, 0x8AC3, 0x8AC3, 0x4A9D, 0x8AC4, 0x8AC4, 0x22B4,
+ 0x8AC5, 0x8AC6, 0x4A9E, 0x8AC7, 0x8AC7, 0x2169, 0x8AC8, 0x8AC8, 0x4AA0,
+ 0x8AC9, 0x8AC9, 0x22FD, 0x8ACA, 0x8ACA, 0x4AA1, 0x8ACB, 0x8ACB, 0x20EA,
+ 0x8ACC, 0x8ACC, 0x4AA2, 0x8ACD, 0x8ACD, 0x22F4, 0x8ACE, 0x8ACE, 0x4AA3,
+ 0x8ACF, 0x8ACF, 0x22FB, 0x8AD0, 0x8AD0, 0x4AA4, 0x8AD1, 0x8AD1, 0x22FC,
+ 0x8AD2, 0x8AD2, 0x2027, 0x8AD3, 0x8AD5, 0x4AA5, 0x8AD6, 0x8AD6, 0x2060,
+ 0x8AD7, 0x8AD7, 0x22FF, 0x8AD8, 0x8ADA, 0x4AA8, 0x8ADB, 0x8ADB, 0x22FE,
+ 0x8ADC, 0x8ADC, 0x1EC7, 0x8ADD, 0x8ADD, 0x4AAB, 0x8ADE, 0x8ADE, 0x230C,
+ 0x8ADF, 0x8AE1, 0x4AAC, 0x8AE2, 0x8AE2, 0x22F5, 0x8AE3, 0x8AE3, 0x4AAF,
+ 0x8AE4, 0x8AE4, 0x2306, 0x8AE5, 0x8AE5, 0x4AB0, 0x8AE6, 0x8AE6, 0x230A,
+ 0x8AE7, 0x8AE7, 0x21D3, 0x8AE8, 0x8AEA, 0x4AB1, 0x8AEB, 0x8AEB, 0x2303,
+ 0x8AEC, 0x8AEC, 0x4AB4, 0x8AED, 0x8AED, 0x2307, 0x8AEE, 0x8AEE, 0x230B,
+ 0x8AEF, 0x8AF0, 0x4AB5, 0x8AF1, 0x8AF1, 0x1F5F, 0x8AF2, 0x8AF2, 0x4AB7,
+ 0x8AF3, 0x8AF3, 0x2309, 0x8AF4, 0x8AF5, 0x4AB8, 0x8AF6, 0x8AF6, 0x2302,
+ 0x8AF7, 0x8AF7, 0x1F04, 0x8AF8, 0x8AF8, 0x229D, 0x8AF9, 0x8AF9, 0x4ABA,
+ 0x8AFA, 0x8AFA, 0x21FB, 0x8AFB, 0x8AFB, 0x4ABB, 0x8AFC, 0x8AFC, 0x2308,
+ 0x8AFD, 0x8AFD, 0x4ABC, 0x8AFE, 0x8AFE, 0x20AC, 0x8AFF, 0x8AFF, 0x4ABD,
+ 0x8B00, 0x8B00, 0x208E, 0x8B01, 0x8B01, 0x2305, 0x8B02, 0x8B02, 0x2197,
+ 0x8B03, 0x8B03, 0x4ABE, 0x8B04, 0x8B04, 0x2171, 0x8B05, 0x8B05, 0x2298,
+ 0x8B06, 0x8B06, 0x4ABF, 0x8B07, 0x8B07, 0x173C, 0x8B08, 0x8B09, 0x4AC0,
+ 0x8B0A, 0x8B0A, 0x1F57, 0x8B0B, 0x8B0D, 0x4AC2, 0x8B0E, 0x8B0E, 0x2082,
+ 0x8B0F, 0x8B0F, 0x4AC5, 0x8B10, 0x8B10, 0x2311, 0x8B11, 0x8B13, 0x4AC6,
+ 0x8B14, 0x8B14, 0x2304, 0x8B15, 0x8B15, 0x4AC9, 0x8B16, 0x8B16, 0x230F,
+ 0x8B17, 0x8B17, 0x1E35, 0x8B18, 0x8B18, 0x4ACA, 0x8B19, 0x8B19, 0x20D1,
+ 0x8B1A, 0x8B1A, 0x2310, 0x8B1B, 0x8B1B, 0x1FA3, 0x8B1C, 0x8B1C, 0x4ACB,
+ 0x8B1D, 0x8B1D, 0x21D6, 0x8B1E, 0x8B20, 0x4ACC, 0x8B21, 0x8B21, 0x2206,
+ 0x8B22, 0x8B25, 0x4ACF, 0x8B26, 0x8B26, 0x1D5F, 0x8B27, 0x8B27, 0x4AD3,
+ 0x8B28, 0x8B28, 0x230D, 0x8B29, 0x8B2A, 0x4AD4, 0x8B2B, 0x8B2B, 0x2312,
+ 0x8B2C, 0x8B2C, 0x208D, 0x8B2D, 0x8B2D, 0x2313, 0x8B2E, 0x8B32, 0x4AD6,
+ 0x8B33, 0x8B33, 0x22E3, 0x8B34, 0x8B38, 0x4ADB, 0x8B39, 0x8B39, 0x1FBA,
+ 0x8B3A, 0x8B3D, 0x4AE0, 0x8B3E, 0x8B3E, 0x2078, 0x8B3F, 0x8B48, 0x4AE4,
+ 0x8B49, 0x8B49, 0x2288, 0x8B4A, 0x8B4D, 0x4AEE, 0x8B4E, 0x8B4E, 0x2316,
+ 0x8B4F, 0x8B4F, 0x1F6B, 0x8B50, 0x8B55, 0x4AF2, 0x8B56, 0x8B56, 0x2314,
+ 0x8B57, 0x8B57, 0x4AF8, 0x8B58, 0x8B58, 0x2130, 0x8B59, 0x8B59, 0x2315,
+ 0x8B5A, 0x8B5A, 0x2168, 0x8B5B, 0x8B5B, 0x4AF9, 0x8B5C, 0x8B5C, 0x20C4,
+ 0x8B5D, 0x8B65, 0x4AFA, 0x8B66, 0x8B66, 0x08DE, 0x8B67, 0x8B6A, 0x4B03,
+ 0x8B6B, 0x8B6B, 0x2318, 0x8B6C, 0x8B6C, 0x0BC8, 0x8B6D, 0x8B6E, 0x4B07,
+ 0x8B6F, 0x8B6F, 0x2219, 0x8B70, 0x8B70, 0x2217, 0x8B71, 0x8B73, 0x4B09,
+ 0x8B74, 0x8B74, 0x20D5, 0x8B75, 0x8B76, 0x4B0C, 0x8B77, 0x8B77, 0x1F4A,
+ 0x8B78, 0x8B7C, 0x4B0E, 0x8B7D, 0x8B7D, 0x2240, 0x8B7E, 0x8B7F, 0x4B13,
+ 0x8B80, 0x8B80, 0x1ED3, 0x8B81, 0x8B89, 0x4B15, 0x8B8A, 0x8B8A, 0x1E49,
+ 0x8B8B, 0x8B8D, 0x4B1E, 0x8B8E, 0x8B8E, 0x261B, 0x8B8F, 0x8B91, 0x4B21,
+ 0x8B92, 0x8B92, 0x1E6D, 0x8B93, 0x8B93, 0x20F8, 0x8B94, 0x8B94, 0x4B24,
+ 0x8B95, 0x8B95, 0x1FFB, 0x8B96, 0x8B96, 0x2319, 0x8B97, 0x8B9B, 0x4B25,
+ 0x8B9C, 0x8B9C, 0x230E, 0x8B9D, 0x8B9D, 0x4B2A, 0x8B9E, 0x8B9E, 0x2317,
+ 0x8B9F, 0x8B9F, 0x4B2B, 0x8BA0, 0x8BA0, 0x1317, 0x8BA1, 0x8BA1, 0x0839,
+ 0x8BA2, 0x8BA2, 0x05E8, 0x8BA3, 0x8BA3, 0x06B7, 0x8BA4, 0x8BA4, 0x0CAA,
+ 0x8BA5, 0x8BA5, 0x0818, 0x8BA6, 0x8BA7, 0x1318, 0x8BA8, 0x8BA8, 0x0E29,
+ 0x8BA9, 0x8BA9, 0x0C9E, 0x8BAA, 0x8BAA, 0x131A, 0x8BAB, 0x8BAB, 0x0C1C,
+ 0x8BAC, 0x8BAC, 0x4B2C, 0x8BAD, 0x8BAD, 0x0FDE, 0x8BAE, 0x8BAE, 0x1070,
+ 0x8BAF, 0x8BAF, 0x0FDF, 0x8BB0, 0x8BB0, 0x083A, 0x8BB1, 0x8BB1, 0x4B2D,
+ 0x8BB2, 0x8BB2, 0x0883, 0x8BB3, 0x8BB3, 0x07F9, 0x8BB4, 0x8BB5, 0x131B,
+ 0x8BB6, 0x8BB6, 0x0FF1, 0x8BB7, 0x8BB7, 0x131D, 0x8BB8, 0x8BB8, 0x0FB8,
+ 0x8BB9, 0x8BB9, 0x062E, 0x8BBA, 0x8BBA, 0x0A82, 0x8BBB, 0x8BBB, 0x4B2E,
+ 0x8BBC, 0x8BBC, 0x0DC4, 0x8BBD, 0x8BBD, 0x068A, 0x8BBE, 0x8BBE, 0x0D21,
+ 0x8BBF, 0x8BBF, 0x0660, 0x8BC0, 0x8BC0, 0x0926, 0x8BC1, 0x8BC1, 0x11A3,
+ 0x8BC2, 0x8BC3, 0x131E, 0x8BC4, 0x8BC4, 0x0BDF, 0x8BC5, 0x8BC5, 0x1244,
+ 0x8BC6, 0x8BC6, 0x0D4D, 0x8BC7, 0x8BC7, 0x4B2F, 0x8BC8, 0x8BC8, 0x114A,
+ 0x8BC9, 0x8BC9, 0x0DD4, 0x8BCA, 0x8BCA, 0x1190, 0x8BCB, 0x8BCB, 0x1320,
+ 0x8BCC, 0x8BCC, 0x11DE, 0x8BCD, 0x8BCD, 0x054D, 0x8BCE, 0x8BCE, 0x1322,
+ 0x8BCF, 0x8BCF, 0x1321, 0x8BD0, 0x8BD0, 0x4B30, 0x8BD1, 0x8BD1, 0x1072,
+ 0x8BD2, 0x8BD4, 0x1323, 0x8BD5, 0x8BD5, 0x0D6B, 0x8BD6, 0x8BD6, 0x1326,
+ 0x8BD7, 0x8BD7, 0x0D42, 0x8BD8, 0x8BD9, 0x1327, 0x8BDA, 0x8BDA, 0x04F4,
+ 0x8BDB, 0x8BDB, 0x11EE, 0x8BDC, 0x8BDC, 0x1329, 0x8BDD, 0x8BDD, 0x07C5,
+ 0x8BDE, 0x8BDE, 0x058F, 0x8BDF, 0x8BE0, 0x132A, 0x8BE1, 0x8BE1, 0x0747,
+ 0x8BE2, 0x8BE2, 0x0FD8, 0x8BE3, 0x8BE3, 0x106F, 0x8BE4, 0x8BE4, 0x132C,
+ 0x8BE5, 0x8BE5, 0x06BE, 0x8BE6, 0x8BE6, 0x0F57, 0x8BE7, 0x8BE7, 0x04B6,
+ 0x8BE8, 0x8BE9, 0x132D, 0x8BEA, 0x8BEA, 0x4B31, 0x8BEB, 0x8BEB, 0x08BC,
+ 0x8BEC, 0x8BEC, 0x0EEB, 0x8BED, 0x8BED, 0x10D4, 0x8BEE, 0x8BEE, 0x132F,
+ 0x8BEF, 0x8BEF, 0x0F02, 0x8BF0, 0x8BF0, 0x1330, 0x8BF1, 0x8BF1, 0x10BA,
+ 0x8BF2, 0x8BF2, 0x07FA, 0x8BF3, 0x8BF3, 0x1331, 0x8BF4, 0x8BF4, 0x0DAA,
+ 0x8BF5, 0x8BF5, 0x0DC5, 0x8BF6, 0x8BF6, 0x1332, 0x8BF7, 0x8BF7, 0x0C68,
+ 0x8BF8, 0x8BF8, 0x11ED, 0x8BF9, 0x8BF9, 0x1333, 0x8BFA, 0x8BFA, 0x0B76,
+ 0x8BFB, 0x8BFB, 0x0600, 0x8BFC, 0x8BFC, 0x1334, 0x8BFD, 0x8BFD, 0x0669,
+ 0x8BFE, 0x8BFE, 0x095B, 0x8BFF, 0x8BFF, 0x1335, 0x8C00, 0x8C00, 0x1336,
+ 0x8C01, 0x8C01, 0x0DA2, 0x8C02, 0x8C02, 0x1337, 0x8C03, 0x8C03, 0x05D8,
+ 0x8C04, 0x8C04, 0x1338, 0x8C05, 0x8C05, 0x0A0B, 0x8C06, 0x8C06, 0x1218,
+ 0x8C07, 0x8C07, 0x1339, 0x8C08, 0x8C08, 0x0E0B, 0x8C09, 0x8C09, 0x4B32,
+ 0x8C0A, 0x8C0A, 0x1071, 0x8C0B, 0x8C0B, 0x0B14, 0x8C0C, 0x8C0C, 0x133A,
+ 0x8C0D, 0x8C0D, 0x05DE, 0x8C0E, 0x8C0E, 0x07E6, 0x8C0F, 0x8C0F, 0x133B,
+ 0x8C10, 0x8C10, 0x0F7E, 0x8C11, 0x8C12, 0x133C, 0x8C13, 0x8C13, 0x0ECC,
+ 0x8C14, 0x8C16, 0x133E, 0x8C17, 0x8C17, 0x04BE, 0x8C18, 0x8C18, 0x1343,
+ 0x8C19, 0x8C19, 0x1341, 0x8C1A, 0x8C1A, 0x1011, 0x8C1B, 0x8C1B, 0x1342,
+ 0x8C1C, 0x8C1C, 0x0ADA, 0x8C1D, 0x8C1D, 0x1344, 0x8C1E, 0x8C1E, 0x4B33,
+ 0x8C1F, 0x8C21, 0x1345, 0x8C22, 0x8C22, 0x0F86, 0x8C23, 0x8C23, 0x102C,
+ 0x8C24, 0x8C24, 0x0404, 0x8C25, 0x8C25, 0x1348, 0x8C26, 0x8C26, 0x0C28,
+ 0x8C27, 0x8C27, 0x1349, 0x8C28, 0x8C28, 0x08C8, 0x8C29, 0x8C29, 0x0AA6,
+ 0x8C2A, 0x8C2B, 0x134A, 0x8C2C, 0x8C2C, 0x0B02, 0x8C2D, 0x8C2D, 0x0E0A,
+ 0x8C2E, 0x8C2F, 0x134C, 0x8C30, 0x8C30, 0x09A9, 0x8C31, 0x8C31, 0x0BF6,
+ 0x8C32, 0x8C33, 0x134E, 0x8C34, 0x8C34, 0x0C31, 0x8C35, 0x8C36, 0x1350,
+ 0x8C37, 0x8C37, 0x0721, 0x8C38, 0x8C40, 0x4B34, 0x8C41, 0x8C41, 0x0802,
+ 0x8C42, 0x8C45, 0x4B3D, 0x8C46, 0x8C46, 0x05F8, 0x8C47, 0x8C47, 0x1CF6,
+ 0x8C48, 0x8C48, 0x20C8, 0x8C49, 0x8C49, 0x1CF7, 0x8C4A, 0x8C4B, 0x4B41,
+ 0x8C4C, 0x8C4C, 0x0E94, 0x8C4D, 0x8C4F, 0x4B43, 0x8C50, 0x8C50, 0x1EFD,
+ 0x8C51, 0x8C54, 0x4B46, 0x8C55, 0x8C55, 0x1D15, 0x8C56, 0x8C59, 0x4B4A,
+ 0x8C5A, 0x8C5A, 0x1990, 0x8C5B, 0x8C60, 0x4B4E, 0x8C61, 0x8C61, 0x0F60,
+ 0x8C62, 0x8C62, 0x07D4, 0x8C63, 0x8C69, 0x4B54, 0x8C6A, 0x8C6A, 0x0777,
+ 0x8C6B, 0x8C6B, 0x10E8, 0x8C6C, 0x8C72, 0x4B5B, 0x8C73, 0x8C73, 0x15DD,
+ 0x8C74, 0x8C77, 0x4B62, 0x8C78, 0x8C78, 0x1D50, 0x8C79, 0x8C79, 0x0413,
+ 0x8C7A, 0x8C7A, 0x04B9, 0x8C7B, 0x8C81, 0x4B66, 0x8C82, 0x8C82, 0x1D51,
+ 0x8C83, 0x8C84, 0x4B6D, 0x8C85, 0x8C85, 0x1D53, 0x8C86, 0x8C88, 0x4B6F,
+ 0x8C89, 0x8C89, 0x0788, 0x8C8A, 0x8C8A, 0x1D52, 0x8C8B, 0x8C8B, 0x4B72,
+ 0x8C8C, 0x8C8C, 0x0AB7, 0x8C8D, 0x8C93, 0x4B73, 0x8C94, 0x8C94, 0x1D55,
+ 0x8C95, 0x8C97, 0x4B7A, 0x8C98, 0x8C98, 0x1D54, 0x8C99, 0x8C9C, 0x4B7D,
+ 0x8C9D, 0x8C9D, 0x1E3B, 0x8C9E, 0x8C9E, 0x227F, 0x8C9F, 0x8C9F, 0x4B81,
+ 0x8CA0, 0x8CA0, 0x1F0C, 0x8CA1, 0x8CA1, 0x1E59, 0x8CA2, 0x8CA2, 0x1F24,
+ 0x8CA3, 0x8CA6, 0x4B82, 0x8CA7, 0x8CA7, 0x20BA, 0x8CA8, 0x8CA8, 0x1F65,
+ 0x8CA9, 0x8CA9, 0x1EF0, 0x8CAA, 0x8CAA, 0x2164, 0x8CAB, 0x8CAB, 0x1F30,
+ 0x8CAC, 0x8CAC, 0x2261, 0x8CAD, 0x8CAE, 0x4B86, 0x8CAF, 0x8CAF, 0x22A2,
+ 0x8CB0, 0x8CB0, 0x24AB, 0x8CB1, 0x8CB1, 0x4B88, 0x8CB2, 0x8CB2, 0x24AF,
+ 0x8CB3, 0x8CB3, 0x1EE8, 0x8CB4, 0x8CB4, 0x1F39, 0x8CB5, 0x8CB5, 0x4B89,
+ 0x8CB6, 0x8CB6, 0x1E48, 0x8CB7, 0x8CB7, 0x2070, 0x8CB8, 0x8CB8, 0x1EA8,
+ 0x8CB9, 0x8CB9, 0x4B8A, 0x8CBA, 0x8CBA, 0x24AC, 0x8CBB, 0x8CBB, 0x1EF7,
+ 0x8CBC, 0x8CBC, 0x2176, 0x8CBD, 0x8CBD, 0x24AD, 0x8CBE, 0x8CBE, 0x4B8B,
+ 0x8CBF, 0x8CBF, 0x207B, 0x8CC0, 0x8CC0, 0x1F45, 0x8CC1, 0x8CC1, 0x24AA,
+ 0x8CC2, 0x8CC2, 0x204B, 0x8CC3, 0x8CC3, 0x202F, 0x8CC4, 0x8CC4, 0x1F5A,
+ 0x8CC5, 0x8CC5, 0x24B0, 0x8CC6, 0x8CC6, 0x4B8C, 0x8CC7, 0x8CC7, 0x22B7,
+ 0x8CC8, 0x8CC8, 0x1F7F, 0x8CC9, 0x8CC9, 0x4B8D, 0x8CCA, 0x8CCA, 0x2265,
+ 0x8CCB, 0x8CD0, 0x4B8E, 0x8CD1, 0x8CD1, 0x24B2, 0x8CD2, 0x8CD2, 0x211B,
+ 0x8CD3, 0x8CD3, 0x1E51, 0x8CD4, 0x8CD4, 0x4B94, 0x8CD5, 0x8CD5, 0x24B4,
+ 0x8CD6, 0x8CD9, 0x4B95, 0x8CDA, 0x8CDA, 0x24B3, 0x8CDB, 0x8CDB, 0x4B99,
+ 0x8CDC, 0x8CDC, 0x1E9F, 0x8CDD, 0x8CDD, 0x4B9A, 0x8CDE, 0x8CDE, 0x2118,
+ 0x8CDF, 0x8CDF, 0x4B9B, 0x8CE0, 0x8CE0, 0x20B4, 0x8CE1, 0x8CE1, 0x23AF,
+ 0x8CE2, 0x8CE2, 0x21BB, 0x8CE3, 0x8CE3, 0x2072, 0x8CE4, 0x8CE4, 0x1F95,
+ 0x8CE5, 0x8CE5, 0x4B9C, 0x8CE6, 0x8CE6, 0x1F0A, 0x8CE7, 0x8CE7, 0x24B6,
+ 0x8CE8, 0x8CE9, 0x4B9D, 0x8CEA, 0x8CEA, 0x2291, 0x8CEB, 0x8CEB, 0x24B5,
+ 0x8CEC, 0x8CEC, 0x2278, 0x8CED, 0x8CED, 0x1ED4, 0x8CEE, 0x8CF3, 0x4B9F,
+ 0x8CF4, 0x8CF4, 0x1FF3, 0x8CF5, 0x8CF9, 0x4BA5, 0x8CFA, 0x8CFA, 0x22A9,
+ 0x8CFB, 0x8CFB, 0x24B7, 0x8CFC, 0x8CFC, 0x1F28, 0x8CFD, 0x8CFD, 0x2109,
+ 0x8CFE, 0x8CFE, 0x22C7, 0x8CFF, 0x8CFF, 0x4BAA, 0x8D00, 0x8D03, 0x4BAB,
+ 0x8D04, 0x8D04, 0x24AE, 0x8D05, 0x8D05, 0x22B1, 0x8D06, 0x8D07, 0x4BAF,
+ 0x8D08, 0x8D08, 0x2266, 0x8D09, 0x8D09, 0x4BB1, 0x8D0A, 0x8D0A, 0x225B,
+ 0x8D0B, 0x8D0B, 0x22C4, 0x8D0C, 0x8D0C, 0x4BB2, 0x8D0D, 0x8D0D, 0x2115,
+ 0x8D0E, 0x8D0E, 0x4BB3, 0x8D0F, 0x8D0F, 0x222A, 0x8D10, 0x8D10, 0x24B1,
+ 0x8D11, 0x8D15, 0x4BB4, 0x8D16, 0x8D16, 0x213D, 0x8D17, 0x8D1A, 0x4BB9,
+ 0x8D1B, 0x8D1B, 0x1F15, 0x8D1C, 0x8D1C, 0x225C, 0x8D1D, 0x8D1D, 0x041D,
+ 0x8D1E, 0x8D1E, 0x118B, 0x8D1F, 0x8D1F, 0x06B5, 0x8D20, 0x8D20, 0x4BBD,
+ 0x8D21, 0x8D21, 0x070A, 0x8D22, 0x8D22, 0x048D, 0x8D23, 0x8D23, 0x1133,
+ 0x8D24, 0x8D24, 0x0F3A, 0x8D25, 0x8D25, 0x03E7, 0x8D26, 0x8D26, 0x116C,
+ 0x8D27, 0x8D27, 0x080A, 0x8D28, 0x8D28, 0x11C9, 0x8D29, 0x8D29, 0x0654,
+ 0x8D2A, 0x8D2A, 0x0E03, 0x8D2B, 0x8D2B, 0x0BD5, 0x8D2C, 0x8D2C, 0x044A,
+ 0x8D2D, 0x8D2D, 0x0713, 0x8D2E, 0x8D2E, 0x11FB, 0x8D2F, 0x8D2F, 0x073A,
+ 0x8D30, 0x8D30, 0x063E, 0x8D31, 0x8D31, 0x086D, 0x8D32, 0x8D33, 0x192C,
+ 0x8D34, 0x8D34, 0x0E4C, 0x8D35, 0x8D35, 0x074C, 0x8D36, 0x8D36, 0x192E,
+ 0x8D37, 0x8D37, 0x057E, 0x8D38, 0x8D38, 0x0AB8, 0x8D39, 0x8D39, 0x066E,
+ 0x8D3A, 0x8D3A, 0x078F, 0x8D3B, 0x8D3B, 0x192F, 0x8D3C, 0x8D3C, 0x1137,
+ 0x8D3D, 0x8D3D, 0x1930, 0x8D3E, 0x8D3E, 0x0849, 0x8D3F, 0x8D3F, 0x07F4,
+ 0x8D40, 0x8D40, 0x1931, 0x8D41, 0x8D41, 0x0A27, 0x8D42, 0x8D42, 0x0A5F,
+ 0x8D43, 0x8D43, 0x1122, 0x8D44, 0x8D44, 0x1227, 0x8D45, 0x8D46, 0x1932,
+ 0x8D47, 0x8D47, 0x1936, 0x8D48, 0x8D49, 0x1934, 0x8D4A, 0x8D4A, 0x0D17,
+ 0x8D4B, 0x8D4B, 0x06AE, 0x8D4C, 0x8D4C, 0x0603, 0x8D4D, 0x8D4D, 0x1937,
+ 0x8D4E, 0x8D4E, 0x0D81, 0x8D4F, 0x8D4F, 0x0D06, 0x8D50, 0x8D50, 0x0550,
+ 0x8D51, 0x8D52, 0x4BBE, 0x8D53, 0x8D53, 0x163B, 0x8D54, 0x8D54, 0x0BA3,
+ 0x8D55, 0x8D55, 0x1938, 0x8D56, 0x8D56, 0x09A0, 0x8D57, 0x8D57, 0x4BC0,
+ 0x8D58, 0x8D58, 0x1215, 0x8D59, 0x8D59, 0x1939, 0x8D5A, 0x8D5A, 0x1209,
+ 0x8D5B, 0x8D5B, 0x0CD7, 0x8D5C, 0x8D5C, 0x1289, 0x8D5D, 0x8D5D, 0x1283,
+ 0x8D5E, 0x8D5E, 0x1121, 0x8D5F, 0x8D5F, 0x4BC1, 0x8D60, 0x8D60, 0x113C,
+ 0x8D61, 0x8D61, 0x0CFD, 0x8D62, 0x8D62, 0x1093, 0x8D63, 0x8D63, 0x06CE,
+ 0x8D64, 0x8D64, 0x0505, 0x8D65, 0x8D65, 0x4BC2, 0x8D66, 0x8D66, 0x0D1B,
+ 0x8D67, 0x8D67, 0x1CF4, 0x8D68, 0x8D6A, 0x4BC3, 0x8D6B, 0x8D6B, 0x078C,
+ 0x8D6C, 0x8D6C, 0x4BC6, 0x8D6D, 0x8D6D, 0x1CF5, 0x8D6E, 0x8D6F, 0x4BC7,
+ 0x8D70, 0x8D70, 0x123C, 0x8D71, 0x8D72, 0x4BC9, 0x8D73, 0x8D73, 0x1CEF,
+ 0x8D74, 0x8D74, 0x06AB, 0x8D75, 0x8D75, 0x1175, 0x8D76, 0x8D76, 0x06CA,
+ 0x8D77, 0x8D77, 0x0C0F, 0x8D78, 0x8D80, 0x4BCB, 0x8D81, 0x8D81, 0x04E8,
+ 0x8D82, 0x8D83, 0x4BD4, 0x8D84, 0x8D84, 0x1CF0, 0x8D85, 0x8D85, 0x04D1,
+ 0x8D86, 0x8D89, 0x4BD6, 0x8D8A, 0x8D8A, 0x1100, 0x8D8B, 0x8D8B, 0x0C74,
+ 0x8D8C, 0x8D90, 0x4BDA, 0x8D91, 0x8D91, 0x1CF2, 0x8D92, 0x8D93, 0x4BDF,
+ 0x8D94, 0x8D94, 0x1CF1, 0x8D95, 0x8D95, 0x1F14, 0x8D96, 0x8D98, 0x4BE1,
+ 0x8D99, 0x8D99, 0x227A, 0x8D9A, 0x8D9E, 0x4BE4, 0x8D9F, 0x8D9F, 0x0E1E,
+ 0x8DA0, 0x8DA2, 0x4BE9, 0x8DA3, 0x8DA3, 0x0C7F, 0x8DA4, 0x8DA7, 0x4BEC,
+ 0x8DA8, 0x8DA8, 0x20EE, 0x8DA9, 0x8DB0, 0x4BF0, 0x8DB1, 0x8DB1, 0x1CF3,
+ 0x8DB2, 0x8DB2, 0x25F8, 0x8DB3, 0x8DB3, 0x1240, 0x8DB4, 0x8DB4, 0x0B80,
+ 0x8DB5, 0x8DB5, 0x1D1C, 0x8DB6, 0x8DB7, 0x4BF8, 0x8DB8, 0x8DB8, 0x1D17,
+ 0x8DB9, 0x8DB9, 0x4BFA, 0x8DBA, 0x8DBA, 0x1D1F, 0x8DBB, 0x8DBB, 0x4BFB,
+ 0x8DBC, 0x8DBC, 0x1D1E, 0x8DBD, 0x8DBD, 0x4BFC, 0x8DBE, 0x8DBE, 0x11B9,
+ 0x8DBF, 0x8DBF, 0x1D1D, 0x8DC0, 0x8DC2, 0x4BFD, 0x8DC3, 0x8DC3, 0x1101,
+ 0x8DC4, 0x8DC4, 0x1D20, 0x8DC5, 0x8DC5, 0x4C00, 0x8DC6, 0x8DC6, 0x1D28,
+ 0x8DC7, 0x8DCA, 0x4C01, 0x8DCB, 0x8DCB, 0x03DA, 0x8DCC, 0x8DCC, 0x05D9,
+ 0x8DCD, 0x8DCD, 0x4C05, 0x8DCE, 0x8DCF, 0x1D25, 0x8DD0, 0x8DD0, 0x4C06,
+ 0x8DD1, 0x8DD1, 0x0B9D, 0x8DD2, 0x8DD5, 0x4C07, 0x8DD6, 0x8DD7, 0x1D21,
+ 0x8DD8, 0x8DD9, 0x4C0B, 0x8DDA, 0x8DDA, 0x1D23, 0x8DDB, 0x8DDB, 0x1D27,
+ 0x8DDC, 0x8DDC, 0x4C0D, 0x8DDD, 0x8DDD, 0x090F, 0x8DDE, 0x8DDE, 0x1D24,
+ 0x8DDF, 0x8DDF, 0x06F5, 0x8DE0, 0x8DE2, 0x4C0E, 0x8DE3, 0x8DE3, 0x1D2C,
+ 0x8DE4, 0x8DE4, 0x1D2F, 0x8DE5, 0x8DE7, 0x4C11, 0x8DE8, 0x8DE8, 0x0974,
+ 0x8DE9, 0x8DE9, 0x4C14, 0x8DEA, 0x8DEA, 0x074B, 0x8DEB, 0x8DEB, 0x1D18,
+ 0x8DEC, 0x8DEC, 0x1D29, 0x8DED, 0x8DEE, 0x4C15, 0x8DEF, 0x8DEF, 0x0A5E,
+ 0x8DF0, 0x8DF2, 0x4C17, 0x8DF3, 0x8DF3, 0x0E4B, 0x8DF4, 0x8DF4, 0x4C1A,
+ 0x8DF5, 0x8DF5, 0x086C, 0x8DF6, 0x8DF6, 0x4C1B, 0x8DF7, 0x8DF8, 0x1D2A,
+ 0x8DF9, 0x8DF9, 0x1D2D, 0x8DFA, 0x8DFA, 0x0624, 0x8DFB, 0x8DFB, 0x1D2E,
+ 0x8DFC, 0x8DFC, 0x4C1C, 0x8DFD, 0x8DFD, 0x1D31, 0x8DFE, 0x8DFF, 0x4C1D,
+ 0x8E00, 0x8E04, 0x4C1F, 0x8E05, 0x8E05, 0x1D19, 0x8E06, 0x8E08, 0x4C24,
+ 0x8E09, 0x8E09, 0x1D30, 0x8E0A, 0x8E0A, 0x10A0, 0x8E0B, 0x8E0B, 0x4C27,
+ 0x8E0C, 0x8E0C, 0x0511, 0x8E0D, 0x8E0E, 0x4C28, 0x8E0F, 0x8E0F, 0x0DF7,
+ 0x8E10, 0x8E10, 0x1F94, 0x8E11, 0x8E13, 0x4C2A, 0x8E14, 0x8E14, 0x1D32,
+ 0x8E15, 0x8E1C, 0x4C2D, 0x8E1D, 0x8E1D, 0x1D33, 0x8E1E, 0x8E1E, 0x0910,
+ 0x8E1F, 0x8E1F, 0x1D34, 0x8E20, 0x8E21, 0x4C35, 0x8E22, 0x8E22, 0x0E32,
+ 0x8E23, 0x8E23, 0x1D37, 0x8E24, 0x8E28, 0x4C37, 0x8E29, 0x8E29, 0x048F,
+ 0x8E2A, 0x8E2A, 0x1236, 0x8E2B, 0x8E2B, 0x4C3C, 0x8E2C, 0x8E2C, 0x1D35,
+ 0x8E2D, 0x8E2D, 0x4C3D, 0x8E2E, 0x8E2E, 0x1D36, 0x8E2F, 0x8E2F, 0x1D38,
+ 0x8E30, 0x8E30, 0x4C3E, 0x8E31, 0x8E31, 0x1D3E, 0x8E32, 0x8E33, 0x4C3F,
+ 0x8E34, 0x8E34, 0x2230, 0x8E35, 0x8E35, 0x1D3C, 0x8E36, 0x8E38, 0x4C41,
+ 0x8E39, 0x8E39, 0x1D3B, 0x8E3A, 0x8E3A, 0x1D39, 0x8E3B, 0x8E3C, 0x4C44,
+ 0x8E3D, 0x8E3D, 0x1D3D, 0x8E3E, 0x8E3F, 0x4C46, 0x8E40, 0x8E40, 0x1D3A,
+ 0x8E41, 0x8E42, 0x1D40, 0x8E43, 0x8E43, 0x4C48, 0x8E44, 0x8E44, 0x0E36,
+ 0x8E45, 0x8E46, 0x4C49, 0x8E47, 0x8E47, 0x173B, 0x8E48, 0x8E48, 0x0599,
+ 0x8E49, 0x8E49, 0x1D3F, 0x8E4A, 0x8E4A, 0x1D44, 0x8E4B, 0x8E4B, 0x0DF6,
+ 0x8E4C, 0x8E4C, 0x25FD, 0x8E4D, 0x8E50, 0x4C4B, 0x8E51, 0x8E52, 0x1D42,
+ 0x8E53, 0x8E54, 0x4C4F, 0x8E55, 0x8E55, 0x2600, 0x8E56, 0x8E58, 0x4C51,
+ 0x8E59, 0x8E59, 0x1D1A, 0x8E5A, 0x8E62, 0x4C54, 0x8E63, 0x8E63, 0x2606,
+ 0x8E64, 0x8E65, 0x4C5D, 0x8E66, 0x8E66, 0x042D, 0x8E67, 0x8E68, 0x4C5F,
+ 0x8E69, 0x8E69, 0x1D1B, 0x8E6A, 0x8E6B, 0x4C61, 0x8E6C, 0x8E6C, 0x05A6,
+ 0x8E6D, 0x8E6D, 0x04AB, 0x8E6E, 0x8E6E, 0x4C63, 0x8E6F, 0x8E6F, 0x1D48,
+ 0x8E70, 0x8E70, 0x1D45, 0x8E71, 0x8E71, 0x4C64, 0x8E72, 0x8E72, 0x0616,
+ 0x8E73, 0x8E73, 0x4C65, 0x8E74, 0x8E74, 0x1D49, 0x8E75, 0x8E75, 0x4C66,
+ 0x8E76, 0x8E76, 0x1D46, 0x8E77, 0x8E79, 0x4C67, 0x8E7A, 0x8E7A, 0x25FF,
+ 0x8E7B, 0x8E7B, 0x4C6A, 0x8E7C, 0x8E7C, 0x1D47, 0x8E7D, 0x8E7E, 0x4C6B,
+ 0x8E7F, 0x8E7F, 0x055D, 0x8E80, 0x8E80, 0x4C6D, 0x8E81, 0x8E81, 0x112D,
+ 0x8E82, 0x8E84, 0x4C6E, 0x8E85, 0x8E85, 0x1D4A, 0x8E86, 0x8E86, 0x4C71,
+ 0x8E87, 0x8E87, 0x051E, 0x8E88, 0x8E88, 0x4C72, 0x8E89, 0x8E89, 0x25FC,
+ 0x8E8A, 0x8E8A, 0x1E8C, 0x8E8B, 0x8E8B, 0x2602, 0x8E8C, 0x8E8C, 0x4C73,
+ 0x8E8D, 0x8E8D, 0x224D, 0x8E8E, 0x8E8E, 0x4C74, 0x8E8F, 0x8E8F, 0x1D4B,
+ 0x8E90, 0x8E90, 0x1D4D, 0x8E91, 0x8E91, 0x2604, 0x8E92, 0x8E92, 0x25FE,
+ 0x8E93, 0x8E93, 0x2603, 0x8E94, 0x8E94, 0x1D4C, 0x8E95, 0x8E99, 0x4C75,
+ 0x8E9A, 0x8E9A, 0x2601, 0x8E9B, 0x8E9B, 0x4C7A, 0x8E9C, 0x8E9C, 0x1D4E,
+ 0x8E9D, 0x8E9D, 0x4C7B, 0x8E9E, 0x8E9E, 0x1D4F, 0x8E9F, 0x8EA0, 0x4C7C,
+ 0x8EA1, 0x8EA1, 0x2605, 0x8EA2, 0x8EA4, 0x4C7E, 0x8EA5, 0x8EA5, 0x1EA3,
+ 0x8EA6, 0x8EA6, 0x2608, 0x8EA7, 0x8EA9, 0x4C81, 0x8EAA, 0x8EAA, 0x2607,
+ 0x8EAB, 0x8EAB, 0x0D26, 0x8EAC, 0x8EAC, 0x0703, 0x8EAD, 0x8EAE, 0x4C84,
+ 0x8EAF, 0x8EAF, 0x0C78, 0x8EB0, 0x8EB1, 0x4C86, 0x8EB2, 0x8EB2, 0x0622,
+ 0x8EB3, 0x8EB9, 0x4C88, 0x8EBA, 0x8EBA, 0x0E1C, 0x8EBB, 0x8EBF, 0x4C8F,
+ 0x8EC0, 0x8EC0, 0x20F0, 0x8EC1, 0x8EC9, 0x4C94, 0x8ECA, 0x8ECA, 0x1E7B,
+ 0x8ECB, 0x8ECB, 0x2267, 0x8ECC, 0x8ECC, 0x1F36, 0x8ECD, 0x8ECD, 0x1FD6,
+ 0x8ECE, 0x8ECE, 0x18F8, 0x8ECF, 0x8ED1, 0x4C9D, 0x8ED2, 0x8ED2, 0x21E0,
+ 0x8ED3, 0x8ED3, 0x4CA0, 0x8ED4, 0x8ED4, 0x248C, 0x8ED5, 0x8EDA, 0x4CA1,
+ 0x8EDB, 0x8EDB, 0x248D, 0x8EDC, 0x8EDE, 0x4CA7, 0x8EDF, 0x8EDF, 0x2102,
+ 0x8EE0, 0x8EE3, 0x4CAA, 0x8EE4, 0x8EE4, 0x2494, 0x8EE5, 0x8EEA, 0x4CAE,
+ 0x8EEB, 0x8EEB, 0x2493, 0x8EEC, 0x8EF1, 0x4CB4, 0x8EF2, 0x8EF2, 0x248E,
+ 0x8EF3, 0x8EF7, 0x4CBA, 0x8EF8, 0x8EF8, 0x2299, 0x8EF9, 0x8EF9, 0x2491,
+ 0x8EFA, 0x8EFA, 0x2496, 0x8EFB, 0x8EFB, 0x248F, 0x8EFC, 0x8EFC, 0x2492,
+ 0x8EFD, 0x8EFD, 0x4CBF, 0x8EFE, 0x8EFE, 0x2497, 0x8EFF, 0x8EFF, 0x4CC0,
+ 0x8F00, 0x8F02, 0x4CC1, 0x8F03, 0x8F03, 0x1FB1, 0x8F04, 0x8F04, 0x4CC4,
+ 0x8F05, 0x8F05, 0x249A, 0x8F06, 0x8F06, 0x4CC5, 0x8F07, 0x8F07, 0x2499,
+ 0x8F08, 0x8F08, 0x4CC6, 0x8F09, 0x8F09, 0x2258, 0x8F0A, 0x8F0A, 0x2498,
+ 0x8F0B, 0x8F11, 0x4CC7, 0x8F12, 0x8F12, 0x249B, 0x8F13, 0x8F13, 0x4CCE,
+ 0x8F14, 0x8F14, 0x1F09, 0x8F15, 0x8F15, 0x20E6, 0x8F16, 0x8F1A, 0x4CCF,
+ 0x8F1B, 0x8F1B, 0x2026, 0x8F1C, 0x8F1C, 0x249F, 0x8F1D, 0x8F1D, 0x1F59,
+ 0x8F1E, 0x8F1F, 0x249D, 0x8F20, 0x8F24, 0x4CD4, 0x8F25, 0x8F25, 0x1F3B,
+ 0x8F26, 0x8F26, 0x249C, 0x8F27, 0x8F28, 0x4CD9, 0x8F29, 0x8F29, 0x1E3A,
+ 0x8F2A, 0x8F2A, 0x205B, 0x8F2B, 0x8F2E, 0x4CDB, 0x8F2F, 0x8F2F, 0x1F70,
+ 0x8F30, 0x8F32, 0x4CDF, 0x8F33, 0x8F33, 0x24A0, 0x8F34, 0x8F37, 0x4CE2,
+ 0x8F38, 0x8F38, 0x213B, 0x8F39, 0x8F3A, 0x4CE6, 0x8F3B, 0x8F3B, 0x1F07,
+ 0x8F3C, 0x8F3D, 0x4CE8, 0x8F3E, 0x8F3E, 0x2270, 0x8F3F, 0x8F3F, 0x2237,
+ 0x8F40, 0x8F41, 0x4CEA, 0x8F42, 0x8F42, 0x24D2, 0x8F43, 0x8F43, 0x4CEC,
+ 0x8F44, 0x8F44, 0x21B3, 0x8F45, 0x8F45, 0x2245, 0x8F46, 0x8F46, 0x24A1,
+ 0x8F47, 0x8F48, 0x4CED, 0x8F49, 0x8F49, 0x22A8, 0x8F4A, 0x8F4C, 0x4CEF,
+ 0x8F4D, 0x8F4D, 0x227C, 0x8F4E, 0x8F4E, 0x1FB0, 0x8F4F, 0x8F53, 0x4CF2,
+ 0x8F54, 0x8F54, 0x24A2, 0x8F55, 0x8F5E, 0x4CF7, 0x8F5F, 0x8F5F, 0x1F46,
+ 0x8F60, 0x8F60, 0x4D01, 0x8F61, 0x8F61, 0x2380, 0x8F62, 0x8F62, 0x2495,
+ 0x8F63, 0x8F63, 0x4D02, 0x8F64, 0x8F64, 0x2490, 0x8F65, 0x8F65, 0x4D03,
+ 0x8F66, 0x8F66, 0x04DA, 0x8F67, 0x8F67, 0x1141, 0x8F68, 0x8F68, 0x0745,
+ 0x8F69, 0x8F69, 0x0FC4, 0x8F6A, 0x8F6A, 0x4D04, 0x8F6B, 0x8F6B, 0x18E1,
+ 0x8F6C, 0x8F6C, 0x1207, 0x8F6D, 0x8F6D, 0x18E2, 0x8F6E, 0x8F6E, 0x0A7D,
+ 0x8F6F, 0x8F6F, 0x0CC8, 0x8F70, 0x8F70, 0x079B, 0x8F71, 0x8F73, 0x18E3,
+ 0x8F74, 0x8F74, 0x11E0, 0x8F75, 0x8F76, 0x18E6, 0x8F77, 0x8F77, 0x18E9,
+ 0x8F78, 0x8F78, 0x18E8, 0x8F79, 0x8F7A, 0x18EA, 0x8F7B, 0x8F7B, 0x0C5E,
+ 0x8F7C, 0x8F7C, 0x18EC, 0x8F7D, 0x8F7D, 0x111B, 0x8F7E, 0x8F7E, 0x18ED,
+ 0x8F7F, 0x8F7F, 0x089F, 0x8F80, 0x8F80, 0x4D05, 0x8F81, 0x8F82, 0x18EE,
+ 0x8F83, 0x8F83, 0x08A0, 0x8F84, 0x8F84, 0x18F0, 0x8F85, 0x8F85, 0x06A3,
+ 0x8F86, 0x8F86, 0x0A07, 0x8F87, 0x8F87, 0x18F1, 0x8F88, 0x8F88, 0x041B,
+ 0x8F89, 0x8F89, 0x07E9, 0x8F8A, 0x8F8A, 0x074E, 0x8F8B, 0x8F8B, 0x18F2,
+ 0x8F8C, 0x8F8C, 0x4D06, 0x8F8D, 0x8F8F, 0x18F3, 0x8F90, 0x8F90, 0x0695,
+ 0x8F91, 0x8F91, 0x0820, 0x8F92, 0x8F92, 0x4D07, 0x8F93, 0x8F93, 0x0D7B,
+ 0x8F94, 0x8F94, 0x1574, 0x8F95, 0x8F95, 0x10F2, 0x8F96, 0x8F96, 0x0F2A,
+ 0x8F97, 0x8F97, 0x1158, 0x8F98, 0x8F98, 0x18F6, 0x8F99, 0x8F99, 0x117F,
+ 0x8F9A, 0x8F9A, 0x18F7, 0x8F9B, 0x8F9B, 0x0F8C, 0x8F9C, 0x8F9C, 0x0715,
+ 0x8F9D, 0x8F9D, 0x4D08, 0x8F9E, 0x8F9E, 0x054A, 0x8F9F, 0x8F9F, 0x0442,
+ 0x8FA0, 0x8FA2, 0x4D09, 0x8FA3, 0x8FA3, 0x099C, 0x8FA4, 0x8FA5, 0x4D0C,
+ 0x8FA6, 0x8FA6, 0x1E30, 0x8FA7, 0x8FA7, 0x4D0E, 0x8FA8, 0x8FA9, 0x044F,
+ 0x8FAA, 0x8FAA, 0x4D0F, 0x8FAB, 0x8FAB, 0x0451, 0x8FAC, 0x8FAC, 0x4D10,
+ 0x8FAD, 0x8FAD, 0x1E9D, 0x8FAE, 0x8FAE, 0x1E4B, 0x8FAF, 0x8FAF, 0x1E4A,
+ 0x8FB0, 0x8FB0, 0x04E2, 0x8FB1, 0x8FB1, 0x0CC3, 0x8FB2, 0x8FB2, 0x20AA,
+ 0x8FB3, 0x8FB5, 0x4D11, 0x8FB6, 0x8FB6, 0x173D, 0x8FB7, 0x8FB8, 0x4D14,
+ 0x8FB9, 0x8FB9, 0x0448, 0x8FBA, 0x8FBC, 0x4D16, 0x8FBD, 0x8FBD, 0x0A12,
+ 0x8FBE, 0x8FBE, 0x0572, 0x8FBF, 0x8FC0, 0x4D19, 0x8FC1, 0x8FC1, 0x0C25,
+ 0x8FC2, 0x8FC2, 0x10BD, 0x8FC3, 0x8FC3, 0x4D1B, 0x8FC4, 0x8FC4, 0x0C18,
+ 0x8FC5, 0x8FC5, 0x0FE1, 0x8FC6, 0x8FC6, 0x4D1C, 0x8FC7, 0x8FC7, 0x0756,
+ 0x8FC8, 0x8FC8, 0x0A9C, 0x8FC9, 0x8FCD, 0x4D1D, 0x8FCE, 0x8FCE, 0x1092,
+ 0x8FCF, 0x8FCF, 0x4D22, 0x8FD0, 0x8FD0, 0x110E, 0x8FD1, 0x8FD1, 0x08CD,
+ 0x8FD2, 0x8FD2, 0x4D23, 0x8FD3, 0x8FD3, 0x173E, 0x8FD4, 0x8FD4, 0x0652,
+ 0x8FD5, 0x8FD5, 0x173F, 0x8FD6, 0x8FD7, 0x4D24, 0x8FD8, 0x8FD8, 0x07CE,
+ 0x8FD9, 0x8FD9, 0x1183, 0x8FDA, 0x8FDA, 0x4D26, 0x8FDB, 0x8FDB, 0x08C9,
+ 0x8FDC, 0x8FDC, 0x10F9, 0x8FDD, 0x8FDD, 0x0EB4, 0x8FDE, 0x8FDE, 0x09F5,
+ 0x8FDF, 0x8FDF, 0x04FE, 0x8FE0, 0x8FE1, 0x4D27, 0x8FE2, 0x8FE2, 0x0E49,
+ 0x8FE3, 0x8FE3, 0x4D29, 0x8FE4, 0x8FE4, 0x1742, 0x8FE5, 0x8FE5, 0x1740,
+ 0x8FE6, 0x8FE6, 0x1744, 0x8FE7, 0x8FE7, 0x4D2A, 0x8FE8, 0x8FE8, 0x1746,
+ 0x8FE9, 0x8FE9, 0x1743, 0x8FEA, 0x8FEA, 0x05B0, 0x8FEB, 0x8FEB, 0x0BE7,
+ 0x8FEC, 0x8FEC, 0x4D2B, 0x8FED, 0x8FED, 0x05DD, 0x8FEE, 0x8FEE, 0x1741,
+ 0x8FEF, 0x8FEF, 0x4D2C, 0x8FF0, 0x8FF0, 0x0D8D, 0x8FF1, 0x8FF2, 0x4D2D,
+ 0x8FF3, 0x8FF3, 0x1745, 0x8FF4, 0x8FF4, 0x267B, 0x8FF5, 0x8FF6, 0x4D2F,
+ 0x8FF7, 0x8FF7, 0x0AD9, 0x8FF8, 0x8FF8, 0x042E, 0x8FF9, 0x8FF9, 0x0816,
+ 0x8FFA, 0x8FFC, 0x4D31, 0x8FFD, 0x8FFD, 0x1214, 0x8FFE, 0x8FFF, 0x4D34,
+ 0x9000, 0x9000, 0x0E7C, 0x9001, 0x9001, 0x0DC2, 0x9002, 0x9002, 0x0D61,
+ 0x9003, 0x9003, 0x0E26, 0x9004, 0x9004, 0x1748, 0x9005, 0x9005, 0x1747,
+ 0x9006, 0x9006, 0x0B49, 0x9007, 0x9008, 0x4D36, 0x9009, 0x9009, 0x0FCA,
+ 0x900A, 0x900A, 0x0FE0, 0x900B, 0x900B, 0x1749, 0x900C, 0x900C, 0x4D38,
+ 0x900D, 0x900D, 0x174C, 0x900E, 0x900E, 0x4D39, 0x900F, 0x900F, 0x0E69,
+ 0x9010, 0x9010, 0x11EF, 0x9011, 0x9011, 0x174B, 0x9012, 0x9012, 0x05BE,
+ 0x9013, 0x9013, 0x4D3A, 0x9014, 0x9014, 0x0E6F, 0x9015, 0x9015, 0x23F2,
+ 0x9016, 0x9016, 0x174D, 0x9017, 0x9017, 0x05F9, 0x9018, 0x9018, 0x4D3B,
+ 0x9019, 0x9019, 0x227E, 0x901A, 0x901A, 0x0E59, 0x901B, 0x901B, 0x073D,
+ 0x901C, 0x901C, 0x4D3C, 0x901D, 0x901D, 0x0D5C, 0x901E, 0x901E, 0x04F6,
+ 0x901F, 0x901F, 0x0DCE, 0x9020, 0x9020, 0x112F, 0x9021, 0x9021, 0x174E,
+ 0x9022, 0x9022, 0x0687, 0x9023, 0x9023, 0x2019, 0x9024, 0x9025, 0x4D3D,
+ 0x9026, 0x9026, 0x174A, 0x9027, 0x902C, 0x4D3F, 0x902D, 0x902D, 0x1751,
+ 0x902E, 0x902E, 0x0581, 0x902F, 0x902F, 0x1752, 0x9030, 0x9031, 0x4D45,
+ 0x9032, 0x9032, 0x1FBB, 0x9033, 0x9034, 0x4D47, 0x9035, 0x9036, 0x174F,
+ 0x9037, 0x9037, 0x4D49, 0x9038, 0x9038, 0x1064, 0x9039, 0x903A, 0x4D4A,
+ 0x903B, 0x903B, 0x0A86, 0x903C, 0x903C, 0x042F, 0x903D, 0x903D, 0x4D4C,
+ 0x903E, 0x903E, 0x10C7, 0x903F, 0x9040, 0x4D4D, 0x9041, 0x9041, 0x061C,
+ 0x9042, 0x9042, 0x0DE1, 0x9043, 0x9043, 0x4D4F, 0x9044, 0x9044, 0x1753,
+ 0x9045, 0x9046, 0x4D50, 0x9047, 0x9047, 0x10DB, 0x9048, 0x904A, 0x4D52,
+ 0x904B, 0x904B, 0x2253, 0x904C, 0x904C, 0x4D55, 0x904D, 0x904D, 0x0452,
+ 0x904E, 0x904E, 0x1F3E, 0x904F, 0x904F, 0x0633, 0x9050, 0x9050, 0x1756,
+ 0x9051, 0x9052, 0x1754, 0x9053, 0x9053, 0x05A1, 0x9054, 0x9054, 0x1EA6,
+ 0x9055, 0x9055, 0x218E, 0x9056, 0x9056, 0x4D56, 0x9057, 0x9057, 0x104C,
+ 0x9058, 0x9058, 0x1758, 0x9059, 0x905A, 0x4D57, 0x905B, 0x905B, 0x175A,
+ 0x905C, 0x905C, 0x21EC, 0x905D, 0x905D, 0x4D59, 0x905E, 0x905E, 0x1EBE,
+ 0x905F, 0x905F, 0x4D5A, 0x9060, 0x9060, 0x224A, 0x9061, 0x9061, 0x4D5B,
+ 0x9062, 0x9062, 0x1759, 0x9063, 0x9063, 0x0C2F, 0x9064, 0x9064, 0x4D5C,
+ 0x9065, 0x9065, 0x102A, 0x9066, 0x9067, 0x4D5D, 0x9068, 0x9068, 0x1757,
+ 0x9069, 0x9069, 0x2133, 0x906A, 0x906C, 0x4D5F, 0x906D, 0x906D, 0x1125,
+ 0x906E, 0x906E, 0x117B, 0x906F, 0x9071, 0x4D62, 0x9072, 0x9072, 0x1E84,
+ 0x9073, 0x9073, 0x4D65, 0x9074, 0x9074, 0x175C, 0x9075, 0x9075, 0x124E,
+ 0x9076, 0x9076, 0x4D66, 0x9077, 0x9077, 0x20CF, 0x9078, 0x9078, 0x21E2,
+ 0x9079, 0x9079, 0x4D67, 0x907A, 0x907A, 0x220F, 0x907B, 0x907B, 0x4D68,
+ 0x907C, 0x907C, 0x2029, 0x907D, 0x907D, 0x175D, 0x907E, 0x907E, 0x4D69,
+ 0x907F, 0x907F, 0x0445, 0x9080, 0x9080, 0x1024, 0x9081, 0x9081, 0x2073,
+ 0x9082, 0x9082, 0x175E, 0x9083, 0x9083, 0x1760, 0x9084, 0x9084, 0x1F55,
+ 0x9085, 0x9086, 0x4D6A, 0x9087, 0x9087, 0x23F1, 0x9088, 0x9088, 0x175F,
+ 0x9089, 0x9089, 0x4D6C, 0x908A, 0x908A, 0x1E46, 0x908B, 0x908B, 0x1761,
+ 0x908C, 0x908E, 0x4D6D, 0x908F, 0x908F, 0x2063, 0x9090, 0x9090, 0x23F3,
+ 0x9091, 0x9091, 0x105F, 0x9092, 0x9092, 0x4D70, 0x9093, 0x9093, 0x05AC,
+ 0x9094, 0x9094, 0x4D71, 0x9095, 0x9095, 0x1817, 0x9096, 0x9096, 0x4D72,
+ 0x9097, 0x9097, 0x1367, 0x9098, 0x9098, 0x4D73, 0x9099, 0x9099, 0x136A,
+ 0x909A, 0x909A, 0x4D74, 0x909B, 0x909B, 0x1368, 0x909C, 0x909C, 0x4D75,
+ 0x909D, 0x909D, 0x1369, 0x909E, 0x90A0, 0x4D76, 0x90A1, 0x90A1, 0x136C,
+ 0x90A2, 0x90A2, 0x0F9A, 0x90A3, 0x90A3, 0x0B2A, 0x90A4, 0x90A5, 0x4D79,
+ 0x90A6, 0x90A6, 0x03F9, 0x90A7, 0x90A9, 0x4D7B, 0x90AA, 0x90AA, 0x0F7B,
+ 0x90AB, 0x90AB, 0x4D7E, 0x90AC, 0x90AC, 0x136B, 0x90AD, 0x90AD, 0x4D7F,
+ 0x90AE, 0x90AE, 0x10AF, 0x90AF, 0x90AF, 0x0761, 0x90B0, 0x90B0, 0x1372,
+ 0x90B1, 0x90B1, 0x0C6E, 0x90B2, 0x90B2, 0x4D80, 0x90B3, 0x90B3, 0x136E,
+ 0x90B4, 0x90B4, 0x136D, 0x90B5, 0x90B5, 0x0D14, 0x90B6, 0x90B6, 0x136F,
+ 0x90B7, 0x90B7, 0x4D81, 0x90B8, 0x90B8, 0x1371, 0x90B9, 0x90B9, 0x123B,
+ 0x90BA, 0x90BA, 0x1370, 0x90BB, 0x90BB, 0x0A23, 0x90BC, 0x90BD, 0x4D82,
+ 0x90BE, 0x90BE, 0x1375, 0x90BF, 0x90C0, 0x4D84, 0x90C1, 0x90C1, 0x10D9,
+ 0x90C2, 0x90C3, 0x4D86, 0x90C4, 0x90C4, 0x1377, 0x90C5, 0x90C5, 0x1374,
+ 0x90C6, 0x90C6, 0x4D88, 0x90C7, 0x90C7, 0x1378, 0x90C8, 0x90C9, 0x4D89,
+ 0x90CA, 0x90CA, 0x088D, 0x90CB, 0x90CD, 0x4D8B, 0x90CE, 0x90CE, 0x09B4,
+ 0x90CF, 0x90CF, 0x1373, 0x90D0, 0x90D0, 0x1376, 0x90D1, 0x90D1, 0x11A2,
+ 0x90D2, 0x90D2, 0x4D8E, 0x90D3, 0x90D3, 0x1379, 0x90D4, 0x90D6, 0x4D8F,
+ 0x90D7, 0x90D7, 0x137D, 0x90D8, 0x90DA, 0x4D92, 0x90DB, 0x90DB, 0x137E,
+ 0x90DC, 0x90DC, 0x137C, 0x90DD, 0x90DD, 0x0779, 0x90DE, 0x90DE, 0x4D95,
+ 0x90DF, 0x90DF, 0x231E, 0x90E0, 0x90E0, 0x4D96, 0x90E1, 0x90E1, 0x0931,
+ 0x90E2, 0x90E2, 0x137B, 0x90E3, 0x90E5, 0x4D97, 0x90E6, 0x90E6, 0x137A,
+ 0x90E7, 0x90E7, 0x110A, 0x90E8, 0x90E8, 0x0486, 0x90E9, 0x90EA, 0x4D9A,
+ 0x90EB, 0x90EB, 0x137F, 0x90EC, 0x90EC, 0x4D9C, 0x90ED, 0x90ED, 0x0752,
+ 0x90EE, 0x90EE, 0x4D9D, 0x90EF, 0x90EF, 0x1380, 0x90F0, 0x90F3, 0x4D9E,
+ 0x90F4, 0x90F4, 0x04E0, 0x90F5, 0x90F5, 0x2233, 0x90F6, 0x90F7, 0x4DA2,
+ 0x90F8, 0x90F8, 0x0587, 0x90F9, 0x90FC, 0x4DA4, 0x90FD, 0x90FD, 0x05FB,
+ 0x90FE, 0x90FE, 0x1381, 0x90FF, 0x90FF, 0x4DA8, 0x9100, 0x9101, 0x4DA9,
+ 0x9102, 0x9102, 0x0634, 0x9103, 0x9103, 0x4DAB, 0x9104, 0x9104, 0x1382,
+ 0x9105, 0x9105, 0x4DAC, 0x9106, 0x9106, 0x2320, 0x9107, 0x9108, 0x4DAD,
+ 0x9109, 0x9109, 0x21C7, 0x910A, 0x9111, 0x4DAF, 0x9112, 0x9112, 0x22BC,
+ 0x9113, 0x9113, 0x4DB7, 0x9114, 0x9114, 0x231C, 0x9115, 0x9115, 0x4DB8,
+ 0x9116, 0x9116, 0x2251, 0x9117, 0x9118, 0x4DB9, 0x9119, 0x9119, 0x0432,
+ 0x911A, 0x911D, 0x4DBB, 0x911E, 0x911E, 0x1384, 0x911F, 0x9121, 0x4DBF,
+ 0x9122, 0x9122, 0x1383, 0x9123, 0x9123, 0x1385, 0x9124, 0x9126, 0x4DC2,
+ 0x9127, 0x9127, 0x1EBB, 0x9128, 0x912C, 0x4DC5, 0x912D, 0x912D, 0x2287,
+ 0x912E, 0x912E, 0x4DCA, 0x912F, 0x912F, 0x1387, 0x9130, 0x9130, 0x202D,
+ 0x9131, 0x9131, 0x1386, 0x9132, 0x9132, 0x1EAB, 0x9133, 0x9133, 0x4DCB,
+ 0x9134, 0x9134, 0x231D, 0x9135, 0x9135, 0x4DCC, 0x9136, 0x9136, 0x231F,
+ 0x9137, 0x9138, 0x4DCD, 0x9139, 0x9139, 0x1388, 0x913A, 0x913A, 0x231B,
+ 0x913B, 0x9142, 0x4DCF, 0x9143, 0x9143, 0x1389, 0x9144, 0x9145, 0x4DD7,
+ 0x9146, 0x9146, 0x138A, 0x9147, 0x9147, 0x4DD9, 0x9148, 0x9148, 0x2321,
+ 0x9149, 0x9149, 0x10B4, 0x914A, 0x914A, 0x1CF8, 0x914B, 0x914B, 0x0C72,
+ 0x914C, 0x914C, 0x1220, 0x914D, 0x914D, 0x0BA5, 0x914E, 0x914F, 0x1CFA,
+ 0x9150, 0x9150, 0x1CF9, 0x9151, 0x9151, 0x4DDA, 0x9152, 0x9152, 0x08F5,
+ 0x9153, 0x9156, 0x4DDB, 0x9157, 0x9157, 0x0FBA, 0x9158, 0x9159, 0x4DDF,
+ 0x915A, 0x915A, 0x0670, 0x915B, 0x915C, 0x4DE1, 0x915D, 0x915D, 0x1110,
+ 0x915E, 0x915E, 0x0DFD, 0x915F, 0x9160, 0x4DE3, 0x9161, 0x9161, 0x1CFE,
+ 0x9162, 0x9162, 0x1CFD, 0x9163, 0x9163, 0x075F, 0x9164, 0x9164, 0x1CFC,
+ 0x9165, 0x9165, 0x0DCB, 0x9166, 0x9168, 0x4DE5, 0x9169, 0x9169, 0x1D00,
+ 0x916A, 0x916A, 0x09BD, 0x916B, 0x916B, 0x4DE8, 0x916C, 0x916C, 0x050F,
+ 0x916D, 0x916D, 0x4DE9, 0x916E, 0x916E, 0x0E5B, 0x916F, 0x916F, 0x1D01,
+ 0x9170, 0x9170, 0x1CFF, 0x9171, 0x9171, 0x0885, 0x9172, 0x9172, 0x1D04,
+ 0x9173, 0x9173, 0x4DEA, 0x9174, 0x9174, 0x1D05, 0x9175, 0x9175, 0x089E,
+ 0x9176, 0x9176, 0x0ABD, 0x9177, 0x9177, 0x096E, 0x9178, 0x9178, 0x0DD6,
+ 0x9179, 0x9179, 0x1D06, 0x917A, 0x917C, 0x4DEB, 0x917D, 0x917E, 0x1D02,
+ 0x917F, 0x917F, 0x0B53, 0x9180, 0x9184, 0x4DEE, 0x9185, 0x9185, 0x1D08,
+ 0x9186, 0x9186, 0x4DF3, 0x9187, 0x9187, 0x053F, 0x9188, 0x9188, 0x4DF4,
+ 0x9189, 0x9189, 0x124A, 0x918A, 0x918A, 0x4DF5, 0x918B, 0x918B, 0x055A,
+ 0x918C, 0x918C, 0x1D07, 0x918D, 0x918D, 0x1D0A, 0x918E, 0x918F, 0x4DF6,
+ 0x9190, 0x9190, 0x1D09, 0x9191, 0x9191, 0x1D0B, 0x9192, 0x9192, 0x0F9C,
+ 0x9193, 0x9195, 0x4DF8, 0x9196, 0x9196, 0x2255, 0x9197, 0x9199, 0x4DFB,
+ 0x919A, 0x919A, 0x0AD6, 0x919B, 0x919B, 0x0C84, 0x919C, 0x919C, 0x1E8F,
+ 0x919D, 0x91A1, 0x4DFE, 0x91A2, 0x91A3, 0x1D0C, 0x91A4, 0x91A9, 0x4E03,
+ 0x91AA, 0x91AA, 0x1D0E, 0x91AB, 0x91AB, 0x220C, 0x91AC, 0x91AC, 0x1FA4,
+ 0x91AD, 0x91AF, 0x1D0F, 0x91B0, 0x91B3, 0x4E09, 0x91B4, 0x91B4, 0x1D13,
+ 0x91B5, 0x91B5, 0x1D12, 0x91B6, 0x91B9, 0x4E0D, 0x91BA, 0x91BA, 0x1D14,
+ 0x91BB, 0x91BF, 0x4E11, 0x91C0, 0x91C0, 0x209B, 0x91C1, 0x91C1, 0x21D8,
+ 0x91C2, 0x91C2, 0x4E16, 0x91C3, 0x91C3, 0x25FA, 0x91C4, 0x91C4, 0x4E17,
+ 0x91C5, 0x91C5, 0x25F9, 0x91C6, 0x91C6, 0x4E18, 0x91C7, 0x91C7, 0x0490,
+ 0x91C8, 0x91C8, 0x4E19, 0x91C9, 0x91C9, 0x10B9, 0x91CA, 0x91CA, 0x0D64,
+ 0x91CB, 0x91CB, 0x2134, 0x91CC, 0x91CC, 0x09DA, 0x91CD, 0x91CD, 0x11D7,
+ 0x91CE, 0x91CE, 0x1037, 0x91CF, 0x91CF, 0x0A08, 0x91D0, 0x91D0, 0x4E1A,
+ 0x91D1, 0x91D1, 0x08C1, 0x91D2, 0x91D4, 0x24F3, 0x91D5, 0x91D5, 0x24F8,
+ 0x91D6, 0x91D6, 0x4E1B, 0x91D7, 0x91D7, 0x24F7, 0x91D8, 0x91D8, 0x1EC8,
+ 0x91D9, 0x91D9, 0x24F6, 0x91DA, 0x91DB, 0x4E1C, 0x91DC, 0x91DC, 0x06A5,
+ 0x91DD, 0x91DD, 0x2280, 0x91DE, 0x91E2, 0x4E1E, 0x91E3, 0x91E3, 0x1EC5,
+ 0x91E4, 0x91E4, 0x24FB, 0x91E5, 0x91E6, 0x4E23, 0x91E7, 0x91E7, 0x24FA,
+ 0x91E8, 0x91E8, 0x4E25, 0x91E9, 0x91E9, 0x1EED, 0x91EA, 0x91F4, 0x4E26,
+ 0x91F5, 0x91F5, 0x24FD, 0x91F6, 0x91F6, 0x4E31, 0x91F7, 0x91F7, 0x24F9,
+ 0x91F8, 0x91F8, 0x4E32, 0x91F9, 0x91F9, 0x24FE, 0x91FA, 0x91FA, 0x20CD,
+ 0x91FB, 0x91FF, 0x4E33, 0x9200, 0x9200, 0x2508, 0x9201, 0x9201, 0x2504,
+ 0x9202, 0x9203, 0x4E38, 0x9204, 0x9204, 0x2506, 0x9205, 0x9207, 0x4E3A,
+ 0x9208, 0x9208, 0x24FF, 0x9209, 0x9209, 0x2090, 0x920A, 0x920C, 0x4E3D,
+ 0x920D, 0x920D, 0x1EDD, 0x920E, 0x920E, 0x1F25, 0x920F, 0x920F, 0x4E40,
+ 0x9210, 0x9210, 0x2503, 0x9211, 0x9211, 0x2502, 0x9212, 0x9213, 0x4E41,
+ 0x9214, 0x9214, 0x1E7A, 0x9215, 0x9215, 0x20A6, 0x9216, 0x921D, 0x4E43,
+ 0x921E, 0x921E, 0x1FD5, 0x921F, 0x9222, 0x4E4B, 0x9223, 0x9223, 0x1F11,
+ 0x9224, 0x9224, 0x4E4F, 0x9225, 0x9225, 0x2507, 0x9226, 0x9226, 0x2500,
+ 0x9227, 0x9227, 0x2505, 0x9228, 0x922D, 0x4E50, 0x922E, 0x922E, 0x2519,
+ 0x922F, 0x922F, 0x4E56, 0x9230, 0x9230, 0x2515, 0x9231, 0x9232, 0x4E57,
+ 0x9233, 0x9233, 0x250C, 0x9234, 0x9234, 0x2031, 0x9235, 0x9236, 0x4E59,
+ 0x9237, 0x9237, 0x250B, 0x9238, 0x9238, 0x250F, 0x9239, 0x9239, 0x251A,
+ 0x923A, 0x923A, 0x2509, 0x923B, 0x923C, 0x4E5B, 0x923D, 0x923D, 0x250E,
+ 0x923E, 0x923E, 0x2234, 0x923F, 0x923F, 0x2513, 0x9240, 0x9240, 0x1F80,
+ 0x9241, 0x9244, 0x4E5D, 0x9245, 0x9245, 0x2501, 0x9246, 0x9247, 0x4E61,
+ 0x9248, 0x9248, 0x2517, 0x9249, 0x9249, 0x2516, 0x924A, 0x924C, 0x4E63,
+ 0x924D, 0x924D, 0x2518, 0x924E, 0x9250, 0x4E66, 0x9251, 0x9251, 0x1E56,
+ 0x9252, 0x9254, 0x4E69, 0x9255, 0x9255, 0x250D, 0x9256, 0x9256, 0x4E6C,
+ 0x9257, 0x9257, 0x20D3, 0x9258, 0x9259, 0x4E6D, 0x925A, 0x925A, 0x207A,
+ 0x925B, 0x925B, 0x20CE, 0x925C, 0x925D, 0x4E6F, 0x925E, 0x925E, 0x2510,
+ 0x925F, 0x9261, 0x4E71, 0x9262, 0x9262, 0x1E55, 0x9263, 0x9265, 0x4E74,
+ 0x9266, 0x9266, 0x250A, 0x9267, 0x926B, 0x4E77, 0x926C, 0x926D, 0x2511,
+ 0x926E, 0x9273, 0x4E7C, 0x9274, 0x9274, 0x086B, 0x9275, 0x9277, 0x4E82,
+ 0x9278, 0x9278, 0x1FAA, 0x9279, 0x9279, 0x4E85, 0x927A, 0x927A, 0x251E,
+ 0x927B, 0x927B, 0x1F1F, 0x927C, 0x927E, 0x4E86, 0x927F, 0x927F, 0x252D,
+ 0x9280, 0x9280, 0x221D, 0x9281, 0x9282, 0x4E89, 0x9283, 0x9283, 0x2532,
+ 0x9284, 0x9284, 0x4E8B, 0x9285, 0x9285, 0x217B, 0x9286, 0x928D, 0x4E8C,
+ 0x928E, 0x928E, 0x1D80, 0x928F, 0x9290, 0x4E94, 0x9291, 0x9291, 0x21AF,
+ 0x9292, 0x9292, 0x4E96, 0x9293, 0x9293, 0x252C, 0x9294, 0x9295, 0x4E97,
+ 0x9296, 0x9296, 0x2528, 0x9297, 0x9297, 0x4E99, 0x9298, 0x9298, 0x208C,
+ 0x9299, 0x9299, 0x4E9A, 0x929A, 0x929A, 0x252F, 0x929B, 0x929B, 0x4E9B,
+ 0x929C, 0x929C, 0x21BC, 0x929D, 0x929F, 0x4E9C, 0x92A0, 0x92A0, 0x251D,
+ 0x92A1, 0x92A2, 0x4E9F, 0x92A3, 0x92A3, 0x2535, 0x92A4, 0x92A4, 0x4EA1,
+ 0x92A5, 0x92A5, 0x220D, 0x92A6, 0x92A6, 0x2526, 0x92A7, 0x92A7, 0x4EA2,
+ 0x92A8, 0x92A8, 0x2534, 0x92A9, 0x92A9, 0x252A, 0x92AA, 0x92AA, 0x251F,
+ 0x92AB, 0x92AB, 0x2531, 0x92AC, 0x92AC, 0x251C, 0x92AD, 0x92AD, 0x4EA3,
+ 0x92AE, 0x92AE, 0x1D81, 0x92AF, 0x92B0, 0x4EA4, 0x92B1, 0x92B1, 0x2525,
+ 0x92B2, 0x92B6, 0x4EA6, 0x92B7, 0x92B7, 0x21CD, 0x92B8, 0x92B8, 0x4EAB,
+ 0x92B9, 0x92B9, 0x21DA, 0x92BA, 0x92BA, 0x4EAC, 0x92BB, 0x92BB, 0x2172,
+ 0x92BC, 0x92BC, 0x253E, 0x92BD, 0x92C0, 0x4EAD, 0x92C1, 0x92C1, 0x204F,
+ 0x92C2, 0x92C2, 0x4EB1, 0x92C3, 0x92C3, 0x2543, 0x92C4, 0x92C4, 0x4EB2,
+ 0x92C5, 0x92C5, 0x21D7, 0x92C6, 0x92C6, 0x4EB3, 0x92C7, 0x92C7, 0x1E3C,
+ 0x92C8, 0x92C8, 0x1D82, 0x92C9, 0x92CB, 0x4EB4, 0x92CC, 0x92CC, 0x2529,
+ 0x92CD, 0x92CE, 0x4EB7, 0x92CF, 0x92CF, 0x2521, 0x92D0, 0x92D1, 0x4EB9,
+ 0x92D2, 0x92D2, 0x1EFF, 0x92D3, 0x92DC, 0x4EBB, 0x92DD, 0x92DD, 0x253F,
+ 0x92DE, 0x92DE, 0x4EC5, 0x92DF, 0x92DF, 0x2544, 0x92E0, 0x92E2, 0x4EC6,
+ 0x92E3, 0x92E3, 0x2523, 0x92E4, 0x92E4, 0x1E90, 0x92E5, 0x92E5, 0x253A,
+ 0x92E6, 0x92E6, 0x2545, 0x92E7, 0x92E7, 0x4EC9, 0x92E8, 0x92E8, 0x253D,
+ 0x92E9, 0x92E9, 0x4ECA, 0x92EA, 0x92EA, 0x20C1, 0x92EB, 0x92EC, 0x4ECB,
+ 0x92ED, 0x92ED, 0x2103, 0x92EE, 0x92EE, 0x2520, 0x92EF, 0x92EF, 0x253C,
+ 0x92F0, 0x92F0, 0x253B, 0x92F1, 0x92F1, 0x2538, 0x92F2, 0x92F5, 0x4ECD,
+ 0x92F6, 0x92F6, 0x2540, 0x92F7, 0x92F7, 0x4ED1, 0x92F8, 0x92F8, 0x1FCD,
+ 0x92F9, 0x92FB, 0x4ED2, 0x92FC, 0x92FC, 0x1F18, 0x92FD, 0x92FF, 0x4ED5,
+ 0x9300, 0x9300, 0x4ED8, 0x9301, 0x9301, 0x254B, 0x9302, 0x9305, 0x4ED9,
+ 0x9306, 0x9306, 0x2547, 0x9307, 0x9308, 0x254F, 0x9309, 0x930F, 0x4EDD,
+ 0x9310, 0x9310, 0x22B0, 0x9311, 0x9311, 0x4EE4, 0x9312, 0x9312, 0x2546,
+ 0x9313, 0x9314, 0x4EE5, 0x9315, 0x9315, 0x254C, 0x9316, 0x9317, 0x4EE7,
+ 0x9318, 0x9318, 0x1E9A, 0x9319, 0x9319, 0x2552, 0x931A, 0x931A, 0x2530,
+ 0x931B, 0x931B, 0x2549, 0x931C, 0x931E, 0x4EE9, 0x931F, 0x931F, 0x2551,
+ 0x9320, 0x9320, 0x1ECA, 0x9321, 0x9321, 0x4EEC, 0x9322, 0x9322, 0x20D2,
+ 0x9323, 0x9325, 0x4EED, 0x9326, 0x9326, 0x1FB8, 0x9327, 0x9327, 0x4EF0,
+ 0x9328, 0x9328, 0x2079, 0x9329, 0x932A, 0x4EF1, 0x932B, 0x932B, 0x21AB,
+ 0x932C, 0x932D, 0x4EF3, 0x932E, 0x932E, 0x254D, 0x932F, 0x932F, 0x1EA5,
+ 0x9330, 0x9331, 0x4EF5, 0x9332, 0x9332, 0x204C, 0x9333, 0x9333, 0x2080,
+ 0x9334, 0x9335, 0x4EF7, 0x9336, 0x9336, 0x266D, 0x9337, 0x9337, 0x4EF9,
+ 0x9338, 0x9338, 0x2537, 0x9339, 0x933D, 0x4EFA, 0x933E, 0x933E, 0x1D83,
+ 0x933F, 0x933F, 0x4EFF, 0x9340, 0x9340, 0x254A, 0x9341, 0x9341, 0x21B8,
+ 0x9342, 0x9342, 0x4F00, 0x9343, 0x9343, 0x254E, 0x9344, 0x9345, 0x4F01,
+ 0x9346, 0x9346, 0x24FC, 0x9347, 0x9347, 0x2554, 0x9348, 0x934A, 0x4F03,
+ 0x934B, 0x934B, 0x1F3C, 0x934C, 0x934C, 0x4F06, 0x934D, 0x934D, 0x1ED5,
+ 0x934E, 0x9353, 0x4F07, 0x9354, 0x9354, 0x2556, 0x9355, 0x9357, 0x4F0D,
+ 0x9358, 0x9358, 0x2268, 0x9359, 0x935A, 0x4F10, 0x935B, 0x935B, 0x1ED6,
+ 0x935C, 0x9363, 0x4F12, 0x9364, 0x9364, 0x2557, 0x9365, 0x9365, 0x2553,
+ 0x9366, 0x9368, 0x4F1A, 0x9369, 0x9369, 0x2548, 0x936A, 0x936A, 0x1D84,
+ 0x936B, 0x936B, 0x4F1D, 0x936C, 0x936C, 0x20DC, 0x936D, 0x936F, 0x4F1E,
+ 0x9370, 0x9370, 0x2559, 0x9371, 0x9374, 0x4F21, 0x9375, 0x9375, 0x1F97,
+ 0x9376, 0x9376, 0x2555, 0x9377, 0x9379, 0x4F25, 0x937A, 0x937A, 0x227D,
+ 0x937B, 0x937D, 0x4F28, 0x937E, 0x937E, 0x257E, 0x937F, 0x9381, 0x4F2B,
+ 0x9382, 0x9382, 0x207C, 0x9383, 0x9383, 0x4F2E, 0x9384, 0x9384, 0x255A,
+ 0x9385, 0x9386, 0x4F2F, 0x9387, 0x9387, 0x255E, 0x9388, 0x9389, 0x4F31,
+ 0x938A, 0x938A, 0x1E34, 0x938B, 0x938E, 0x4F33, 0x938F, 0x938F, 0x1D86,
+ 0x9390, 0x9395, 0x4F37, 0x9396, 0x9396, 0x215E, 0x9397, 0x9397, 0x4F3D,
+ 0x9398, 0x9398, 0x2560, 0x9399, 0x93A1, 0x4F3E, 0x93A2, 0x93A2, 0x21A2,
+ 0x93A3, 0x93A3, 0x2354, 0x93A4, 0x93A5, 0x4F47, 0x93A6, 0x93A6, 0x2563,
+ 0x93A7, 0x93A7, 0x2527, 0x93A8, 0x93A8, 0x4F49, 0x93A9, 0x93A9, 0x252E,
+ 0x93AA, 0x93AA, 0x2558, 0x93AB, 0x93AB, 0x4F4A, 0x93AC, 0x93AC, 0x1F1B,
+ 0x93AD, 0x93AD, 0x4F4B, 0x93AE, 0x93AE, 0x2283, 0x93AF, 0x93AF, 0x4F4C,
+ 0x93B0, 0x93B0, 0x2564, 0x93B1, 0x93B2, 0x4F4D, 0x93B3, 0x93B3, 0x20A0,
+ 0x93B4, 0x93B4, 0x4F4F, 0x93B5, 0x93B5, 0x2565, 0x93B6, 0x93B7, 0x4F50,
+ 0x93B8, 0x93B8, 0x2561, 0x93B9, 0x93BE, 0x4F52, 0x93BF, 0x93BF, 0x2562,
+ 0x93C0, 0x93C2, 0x4F58, 0x93C3, 0x93C3, 0x256C, 0x93C4, 0x93C6, 0x4F5B,
+ 0x93C7, 0x93C7, 0x256D, 0x93C8, 0x93C8, 0x2020, 0x93C9, 0x93C9, 0x4F5E,
+ 0x93CA, 0x93CA, 0x1D85, 0x93CB, 0x93CB, 0x4F5F, 0x93CC, 0x93CC, 0x255F,
+ 0x93CD, 0x93CD, 0x256A, 0x93CE, 0x93D0, 0x4F60, 0x93D1, 0x93D1, 0x256E,
+ 0x93D2, 0x93D5, 0x4F63, 0x93D6, 0x93D6, 0x1E01, 0x93D7, 0x93D7, 0x2539,
+ 0x93D8, 0x93D8, 0x255C, 0x93D9, 0x93DB, 0x4F67, 0x93DC, 0x93DD, 0x2568,
+ 0x93DE, 0x93DE, 0x256B, 0x93DF, 0x93DF, 0x1E6F, 0x93E0, 0x93E0, 0x4F6A,
+ 0x93E1, 0x93E1, 0x1FC4, 0x93E2, 0x93E2, 0x2567, 0x93E3, 0x93E3, 0x4F6B,
+ 0x93E4, 0x93E4, 0x255B, 0x93E5, 0x93E7, 0x4F6C, 0x93E8, 0x93E8, 0x261D,
+ 0x93E9, 0x93F4, 0x4F6F, 0x93F5, 0x93F5, 0x252B, 0x93F6, 0x93F6, 0x4F7B,
+ 0x93F7, 0x93F7, 0x2571, 0x93F8, 0x93F8, 0x4F7C, 0x93F9, 0x93F9, 0x2577,
+ 0x93FA, 0x93FF, 0x4F7D, 0x9400, 0x9402, 0x4F83, 0x9403, 0x9403, 0x2522,
+ 0x9404, 0x940A, 0x4F86, 0x940B, 0x940B, 0x2533, 0x940C, 0x940F, 0x4F8D,
+ 0x9410, 0x9410, 0x202A, 0x9411, 0x9411, 0x4F91, 0x9412, 0x9412, 0x2536,
+ 0x9413, 0x9413, 0x2573, 0x9414, 0x9414, 0x256F, 0x9415, 0x9417, 0x4F92,
+ 0x9418, 0x9418, 0x2293, 0x9419, 0x9419, 0x2578, 0x941A, 0x941C, 0x4F95,
+ 0x941D, 0x941D, 0x2570, 0x941E, 0x941F, 0x4F98, 0x9420, 0x9420, 0x2575,
+ 0x9421, 0x9425, 0x4F9A, 0x9426, 0x9427, 0x2541, 0x9428, 0x9428, 0x255D,
+ 0x9429, 0x942D, 0x4F9F, 0x942E, 0x942E, 0x201A, 0x942F, 0x9431, 0x4FA4,
+ 0x9432, 0x9432, 0x257A, 0x9433, 0x9433, 0x2006, 0x9434, 0x9434, 0x4FA7,
+ 0x9435, 0x9435, 0x2177, 0x9436, 0x9437, 0x4FA8, 0x9438, 0x9438, 0x251B,
+ 0x9439, 0x9439, 0x4FAA, 0x943A, 0x943A, 0x2524, 0x943B, 0x943D, 0x4FAB,
+ 0x943E, 0x943E, 0x1D87, 0x943F, 0x943F, 0x257B, 0x9440, 0x9443, 0x4FAE,
+ 0x9444, 0x9444, 0x22A3, 0x9445, 0x9449, 0x4FB2, 0x944A, 0x944A, 0x2579,
+ 0x944B, 0x944B, 0x4FB7, 0x944C, 0x944C, 0x2566, 0x944D, 0x9451, 0x4FB8,
+ 0x9452, 0x9452, 0x1F93, 0x9453, 0x9453, 0x4FBD, 0x9454, 0x9454, 0x257C,
+ 0x9455, 0x945F, 0x4FBE, 0x9460, 0x9460, 0x2514, 0x9461, 0x9462, 0x4FC9,
+ 0x9463, 0x9463, 0x257D, 0x9464, 0x9464, 0x4FCB, 0x9465, 0x9465, 0x2572,
+ 0x9466, 0x946A, 0x4FCC, 0x946B, 0x946B, 0x1D88, 0x946C, 0x946C, 0x4FD1,
+ 0x946D, 0x946D, 0x2574, 0x946E, 0x946F, 0x4FD2, 0x9470, 0x9470, 0x224E,
+ 0x9471, 0x9471, 0x4FD4, 0x9472, 0x9472, 0x21C6, 0x9473, 0x9476, 0x4FD5,
+ 0x9477, 0x9477, 0x209F, 0x9478, 0x9478, 0x4FD9, 0x9479, 0x9479, 0x2576,
+ 0x947A, 0x947B, 0x4FDA, 0x947C, 0x947C, 0x2064, 0x947D, 0x947D, 0x22BF,
+ 0x947E, 0x947E, 0x261C, 0x947F, 0x947F, 0x225E, 0x9480, 0x9484, 0x4FDC,
+ 0x9485, 0x9487, 0x1A8E, 0x9488, 0x9488, 0x118C, 0x9489, 0x9489, 0x05E3,
+ 0x948A, 0x948A, 0x1A92, 0x948B, 0x948B, 0x1A91, 0x948C, 0x948D, 0x1A93,
+ 0x948E, 0x948E, 0x0C22, 0x948F, 0x9490, 0x1A95, 0x9491, 0x9491, 0x4FE1,
+ 0x9492, 0x9492, 0x064D, 0x9493, 0x9493, 0x05D7, 0x9494, 0x9494, 0x1A97,
+ 0x9495, 0x9495, 0x1A99, 0x9496, 0x9496, 0x4FE2, 0x9497, 0x9497, 0x1A98,
+ 0x9498, 0x9498, 0x4FE3, 0x9499, 0x9499, 0x06C1, 0x949A, 0x949C, 0x1A9A,
+ 0x949D, 0x949D, 0x061A, 0x949E, 0x949E, 0x04D3, 0x949F, 0x949F, 0x11D2,
+ 0x94A0, 0x94A0, 0x0B29, 0x94A1, 0x94A1, 0x041E, 0x94A2, 0x94A2, 0x06D1,
+ 0x94A3, 0x94A4, 0x1A9D, 0x94A5, 0x94A5, 0x1102, 0x94A6, 0x94A6, 0x0C52,
+ 0x94A7, 0x94A7, 0x092A, 0x94A8, 0x94A8, 0x0EE8, 0x94A9, 0x94A9, 0x070C,
+ 0x94AA, 0x94AA, 0x1AA0, 0x94AB, 0x94AB, 0x1A9F, 0x94AC, 0x94AC, 0x1AA2,
+ 0x94AD, 0x94AD, 0x1AA1, 0x94AE, 0x94AE, 0x0B66, 0x94AF, 0x94B0, 0x1AA3,
+ 0x94B1, 0x94B1, 0x0C2B, 0x94B2, 0x94B2, 0x1AA5, 0x94B3, 0x94B3, 0x0C2C,
+ 0x94B4, 0x94B4, 0x1AA6, 0x94B5, 0x94B5, 0x046E, 0x94B6, 0x94BA, 0x1AA7,
+ 0x94BB, 0x94BB, 0x1247, 0x94BC, 0x94BD, 0x1AAC, 0x94BE, 0x94BE, 0x084B,
+ 0x94BF, 0x94BF, 0x1AAE, 0x94C0, 0x94C0, 0x10B0, 0x94C1, 0x94C1, 0x0E4D,
+ 0x94C2, 0x94C2, 0x0473, 0x94C3, 0x94C3, 0x0A2E, 0x94C4, 0x94C4, 0x1AAF,
+ 0x94C5, 0x94C5, 0x0C23, 0x94C6, 0x94C6, 0x0AB2, 0x94C7, 0x94C7, 0x4FE4,
+ 0x94C8, 0x94CE, 0x1AB0, 0x94CF, 0x94CF, 0x4FE5, 0x94D0, 0x94D2, 0x1AB7,
+ 0x94D3, 0x94D4, 0x4FE6, 0x94D5, 0x94D7, 0x1ABA, 0x94D8, 0x94D8, 0x1ABE,
+ 0x94D9, 0x94D9, 0x1ABD, 0x94DA, 0x94DA, 0x4FE8, 0x94DB, 0x94DB, 0x1ABF,
+ 0x94DC, 0x94DC, 0x0E5E, 0x94DD, 0x94DD, 0x0A68, 0x94DE, 0x94E0, 0x1AC0,
+ 0x94E1, 0x94E1, 0x1142, 0x94E2, 0x94E2, 0x1AC3, 0x94E3, 0x94E3, 0x0F20,
+ 0x94E4, 0x94E5, 0x1AC4, 0x94E6, 0x94E6, 0x4FE9, 0x94E7, 0x94E8, 0x1AC6,
+ 0x94E9, 0x94E9, 0x1AC9, 0x94EA, 0x94EA, 0x1AC8, 0x94EB, 0x94EB, 0x1ACA,
+ 0x94EC, 0x94EC, 0x06F0, 0x94ED, 0x94ED, 0x0AFF, 0x94EE, 0x94EF, 0x1ACB,
+ 0x94F0, 0x94F0, 0x0893, 0x94F1, 0x94F1, 0x1046, 0x94F2, 0x94F2, 0x04C0,
+ 0x94F3, 0x94F5, 0x1ACD, 0x94F6, 0x94F6, 0x107F, 0x94F7, 0x94F7, 0x1AD0,
+ 0x94F8, 0x94F8, 0x11FC, 0x94F9, 0x94F9, 0x1AD1, 0x94FA, 0x94FA, 0x0BEB,
+ 0x94FB, 0x94FB, 0x4FEA, 0x94FC, 0x94FD, 0x1AD2, 0x94FE, 0x94FE, 0x09FD,
+ 0x94FF, 0x94FF, 0x1AD4, 0x9500, 0x9500, 0x0F67, 0x9501, 0x9501, 0x0DED,
+ 0x9502, 0x9502, 0x1AD6, 0x9503, 0x9503, 0x1AD5, 0x9504, 0x9504, 0x051F,
+ 0x9505, 0x9505, 0x0751, 0x9506, 0x9507, 0x1AD7, 0x9508, 0x9508, 0x0FAD,
+ 0x9509, 0x950A, 0x1AD9, 0x950B, 0x950B, 0x0683, 0x950C, 0x950C, 0x0F8A,
+ 0x950D, 0x950F, 0x1ADB, 0x9510, 0x9510, 0x0CCC, 0x9511, 0x9511, 0x0E33,
+ 0x9512, 0x9516, 0x1ADE, 0x9517, 0x9517, 0x1181, 0x9518, 0x9518, 0x1AE3,
+ 0x9519, 0x9519, 0x0570, 0x951A, 0x951A, 0x0AAF, 0x951B, 0x951B, 0x1AE4,
+ 0x951C, 0x951C, 0x4FEB, 0x951D, 0x951F, 0x1AE5, 0x9520, 0x9520, 0x4FEC,
+ 0x9521, 0x9521, 0x0F0C, 0x9522, 0x9522, 0x1AE8, 0x9523, 0x9523, 0x0A87,
+ 0x9524, 0x9524, 0x053B, 0x9525, 0x9525, 0x1213, 0x9526, 0x9526, 0x08C6,
+ 0x9527, 0x9527, 0x4FED, 0x9528, 0x9528, 0x0F34, 0x9529, 0x9529, 0x1AEB,
+ 0x952A, 0x952B, 0x1AE9, 0x952C, 0x952C, 0x1AEC, 0x952D, 0x952D, 0x05E6,
+ 0x952E, 0x952E, 0x086F, 0x952F, 0x952F, 0x0911, 0x9530, 0x9530, 0x0AD1,
+ 0x9531, 0x9532, 0x1AED, 0x9533, 0x9533, 0x4FEE, 0x9534, 0x9534, 0x1AEF,
+ 0x9535, 0x9535, 0x1AF7, 0x9536, 0x9538, 0x1AF0, 0x9539, 0x9539, 0x0C3F,
+ 0x953A, 0x953A, 0x1B19, 0x953B, 0x953B, 0x060C, 0x953C, 0x953C, 0x1AF3,
+ 0x953D, 0x953D, 0x4FEF, 0x953E, 0x953F, 0x1AF4, 0x9540, 0x9540, 0x0605,
+ 0x9541, 0x9541, 0x0AC3, 0x9542, 0x9542, 0x1AF6, 0x9543, 0x9543, 0x4FF0,
+ 0x9544, 0x9546, 0x1AF8, 0x9547, 0x9547, 0x1193, 0x9548, 0x9548, 0x4FF1,
+ 0x9549, 0x9549, 0x1AFB, 0x954A, 0x954A, 0x0B5A, 0x954B, 0x954B, 0x4FF2,
+ 0x954C, 0x954C, 0x1AFC, 0x954D, 0x954D, 0x0B5B, 0x954E, 0x954F, 0x1AFD,
+ 0x9550, 0x9550, 0x06DF, 0x9551, 0x9551, 0x0402, 0x9552, 0x9554, 0x1AFF,
+ 0x9555, 0x9555, 0x4FF3, 0x9556, 0x9559, 0x1B02, 0x955A, 0x955A, 0x4FF4,
+ 0x955B, 0x955B, 0x1B06, 0x955C, 0x955C, 0x08E4, 0x955D, 0x955D, 0x1B09,
+ 0x955E, 0x955F, 0x1B07, 0x9560, 0x9560, 0x4FF5, 0x9561, 0x9562, 0x1B0A,
+ 0x9563, 0x9563, 0x0A16, 0x9564, 0x956C, 0x1B0C, 0x956D, 0x956D, 0x09C3,
+ 0x956E, 0x956E, 0x4FF6, 0x956F, 0x956F, 0x1B15, 0x9570, 0x9570, 0x09F6,
+ 0x9571, 0x9573, 0x1B16, 0x9574, 0x9575, 0x4FF7, 0x9576, 0x9576, 0x0F4F,
+ 0x9577, 0x9577, 0x1E75, 0x9578, 0x957E, 0x4FF9, 0x957F, 0x957F, 0x04C9,
+ 0x9580, 0x9580, 0x207D, 0x9581, 0x9581, 0x5000, 0x9582, 0x9582, 0x23BF,
+ 0x9583, 0x9583, 0x2113, 0x9584, 0x9585, 0x5001, 0x9586, 0x9586, 0x23C0,
+ 0x9587, 0x9588, 0x5003, 0x9589, 0x9589, 0x1E45, 0x958A, 0x958A, 0x5005,
+ 0x958B, 0x958B, 0x1FD8, 0x958C, 0x958C, 0x23C4, 0x958D, 0x958D, 0x5006,
+ 0x958E, 0x958E, 0x23C2, 0x958F, 0x958F, 0x2104, 0x9590, 0x9590, 0x5007,
+ 0x9591, 0x9591, 0x21BD, 0x9592, 0x9592, 0x5008, 0x9593, 0x9593, 0x1F87,
+ 0x9594, 0x9594, 0x23C3, 0x9595, 0x9597, 0x5009, 0x9598, 0x9598, 0x2269,
+ 0x9599, 0x95A0, 0x500C, 0x95A1, 0x95A1, 0x1F43, 0x95A2, 0x95A2, 0x5014,
+ 0x95A3, 0x95A3, 0x1F1E, 0x95A4, 0x95A4, 0x2679, 0x95A5, 0x95A5, 0x1EEB,
+ 0x95A6, 0x95A7, 0x5015, 0x95A8, 0x95A8, 0x1F35, 0x95A9, 0x95A9, 0x208A,
+ 0x95AA, 0x95AA, 0x5017, 0x95AB, 0x95AB, 0x23C7, 0x95AC, 0x95AC, 0x23C9,
+ 0x95AD, 0x95AD, 0x23C6, 0x95AE, 0x95B1, 0x5018, 0x95B2, 0x95B2, 0x224F,
+ 0x95B3, 0x95B5, 0x501C, 0x95B6, 0x95B6, 0x23CB, 0x95B7, 0x95B8, 0x501F,
+ 0x95B9, 0x95B9, 0x21F3, 0x95BA, 0x95BA, 0x5021, 0x95BB, 0x95BB, 0x21F7,
+ 0x95BC, 0x95BC, 0x23CF, 0x95BD, 0x95BD, 0x23CE, 0x95BE, 0x95BE, 0x23CA,
+ 0x95BF, 0x95BF, 0x23CD, 0x95C0, 0x95C2, 0x5022, 0x95C3, 0x95C3, 0x23D0,
+ 0x95C4, 0x95C5, 0x5025, 0x95C6, 0x95C6, 0x266C, 0x95C7, 0x95C7, 0x5027,
+ 0x95C8, 0x95C8, 0x23C1, 0x95C9, 0x95C9, 0x5028, 0x95CA, 0x95CA, 0x1FEE,
+ 0x95CB, 0x95CB, 0x23D1, 0x95CC, 0x95CC, 0x1FF8, 0x95CD, 0x95CF, 0x5029,
+ 0x95D0, 0x95D0, 0x23D3, 0x95D1, 0x95D3, 0x502C, 0x95D4, 0x95D4, 0x23D2,
+ 0x95D5, 0x95D5, 0x23D4, 0x95D6, 0x95D6, 0x1E98, 0x95D7, 0x95DB, 0x502F,
+ 0x95DC, 0x95DC, 0x1F2C, 0x95DD, 0x95DD, 0x5034, 0x95DE, 0x95DE, 0x23D5,
+ 0x95DF, 0x95E0, 0x5035, 0x95E1, 0x95E1, 0x1E71, 0x95E2, 0x95E2, 0x2691,
+ 0x95E3, 0x95E4, 0x5037, 0x95E5, 0x95E5, 0x23C5, 0x95E6, 0x95E7, 0x5039,
+ 0x95E8, 0x95E8, 0x0ACA, 0x95E9, 0x95E9, 0x1685, 0x95EA, 0x95EA, 0x0CFA,
+ 0x95EB, 0x95EB, 0x1686, 0x95EC, 0x95EC, 0x503B, 0x95ED, 0x95ED, 0x043E,
+ 0x95EE, 0x95EE, 0x0ED9, 0x95EF, 0x95EF, 0x0536, 0x95F0, 0x95F0, 0x0CCD,
+ 0x95F1, 0x95F1, 0x1687, 0x95F2, 0x95F2, 0x0F3D, 0x95F3, 0x95F3, 0x1688,
+ 0x95F4, 0x95F4, 0x0857, 0x95F5, 0x95F6, 0x1689, 0x95F7, 0x95F7, 0x0ACB,
+ 0x95F8, 0x95F8, 0x1143, 0x95F9, 0x95F9, 0x0B39, 0x95FA, 0x95FA, 0x0744,
+ 0x95FB, 0x95FB, 0x0ED4, 0x95FC, 0x95FC, 0x168B, 0x95FD, 0x95FD, 0x0AFB,
+ 0x95FE, 0x95FE, 0x168C, 0x95FF, 0x95FF, 0x503C, 0x9600, 0x9600, 0x0644,
+ 0x9601, 0x9601, 0x06EE, 0x9602, 0x9602, 0x0789, 0x9603, 0x9604, 0x168D,
+ 0x9605, 0x9605, 0x1107, 0x9606, 0x9606, 0x168F, 0x9607, 0x9607, 0x503D,
+ 0x9608, 0x9608, 0x1690, 0x9609, 0x9609, 0x0FF4, 0x960A, 0x960D, 0x1691,
+ 0x960E, 0x960E, 0x0FFF, 0x960F, 0x960F, 0x1695, 0x9610, 0x9610, 0x04C2,
+ 0x9611, 0x9611, 0x09A6, 0x9612, 0x9612, 0x1696, 0x9613, 0x9613, 0x503E,
+ 0x9614, 0x9614, 0x0996, 0x9615, 0x9617, 0x1697, 0x9618, 0x9618, 0x503F,
+ 0x9619, 0x961A, 0x169A, 0x961B, 0x961B, 0x5040, 0x961C, 0x961C, 0x06B2,
+ 0x961D, 0x961D, 0x1354, 0x961E, 0x961E, 0x5041, 0x961F, 0x961F, 0x0612,
+ 0x9620, 0x9620, 0x5042, 0x9621, 0x9621, 0x1356, 0x9622, 0x9622, 0x1355,
+ 0x9623, 0x9629, 0x5043, 0x962A, 0x962A, 0x1358, 0x962B, 0x962D, 0x504A,
+ 0x962E, 0x962E, 0x0CC9, 0x962F, 0x9630, 0x504D, 0x9631, 0x9631, 0x1357,
+ 0x9632, 0x9632, 0x065D, 0x9633, 0x9633, 0x101D, 0x9634, 0x9634, 0x107C,
+ 0x9635, 0x9635, 0x1194, 0x9636, 0x9636, 0x08A8, 0x9637, 0x963A, 0x504F,
+ 0x963B, 0x963B, 0x1245, 0x963C, 0x963C, 0x135A, 0x963D, 0x963D, 0x1359,
+ 0x963E, 0x963E, 0x5053, 0x963F, 0x963F, 0x03AD, 0x9640, 0x9640, 0x0E84,
+ 0x9641, 0x9641, 0x5054, 0x9642, 0x9642, 0x135B, 0x9643, 0x9643, 0x5055,
+ 0x9644, 0x9644, 0x06B8, 0x9645, 0x9645, 0x083D, 0x9646, 0x9646, 0x0A64,
+ 0x9647, 0x9647, 0x0A4B, 0x9648, 0x9648, 0x04E7, 0x9649, 0x9649, 0x135C,
+ 0x964A, 0x964A, 0x5056, 0x964B, 0x964B, 0x0A51, 0x964C, 0x964C, 0x0B13,
+ 0x964D, 0x964D, 0x0886, 0x964E, 0x964F, 0x5057, 0x9650, 0x9650, 0x0F4B,
+ 0x9651, 0x9653, 0x5059, 0x9654, 0x9654, 0x135D, 0x9655, 0x9655, 0x0CFB,
+ 0x9656, 0x9657, 0x505C, 0x9658, 0x9658, 0x231A, 0x9659, 0x965A, 0x505E,
+ 0x965B, 0x965B, 0x0446, 0x965C, 0x965C, 0x5060, 0x965D, 0x965D, 0x2114,
+ 0x965E, 0x965E, 0x5061, 0x965F, 0x965F, 0x135E, 0x9660, 0x9660, 0x5062,
+ 0x9661, 0x9661, 0x05F7, 0x9662, 0x9662, 0x10FD, 0x9663, 0x9663, 0x2284,
+ 0x9664, 0x9664, 0x0522, 0x9665, 0x9666, 0x5063, 0x9667, 0x9667, 0x135F,
+ 0x9668, 0x9668, 0x110C, 0x9669, 0x9669, 0x0F42, 0x966A, 0x966A, 0x0BA4,
+ 0x966B, 0x966B, 0x5065, 0x966C, 0x966C, 0x1360, 0x966D, 0x966F, 0x5066,
+ 0x9670, 0x9670, 0x221C, 0x9671, 0x9671, 0x5069, 0x9672, 0x9672, 0x1361,
+ 0x9673, 0x9673, 0x1E7E, 0x9674, 0x9674, 0x1362, 0x9675, 0x9675, 0x0A33,
+ 0x9676, 0x9676, 0x0E28, 0x9677, 0x9677, 0x0F4A, 0x9678, 0x9678, 0x204D,
+ 0x9679, 0x967C, 0x506A, 0x967D, 0x967D, 0x2201, 0x967E, 0x9684, 0x506E,
+ 0x9685, 0x9685, 0x10CC, 0x9686, 0x9686, 0x0A48, 0x9687, 0x9687, 0x5075,
+ 0x9688, 0x9688, 0x1363, 0x9689, 0x9689, 0x5076, 0x968A, 0x968A, 0x1ED9,
+ 0x968B, 0x968B, 0x0DDA, 0x968C, 0x968C, 0x5077, 0x968D, 0x968D, 0x1364,
+ 0x968E, 0x968E, 0x1FB2, 0x968F, 0x968F, 0x0DDB, 0x9690, 0x9690, 0x1085,
+ 0x9691, 0x9693, 0x5078, 0x9694, 0x9694, 0x06EF, 0x9695, 0x9695, 0x2252,
+ 0x9696, 0x9696, 0x507B, 0x9697, 0x9697, 0x1365, 0x9698, 0x9698, 0x03BA,
+ 0x9699, 0x9699, 0x0F23, 0x969A, 0x969A, 0x507C, 0x969B, 0x969B, 0x1F79,
+ 0x969C, 0x969C, 0x1170, 0x969D, 0x96A6, 0x507D, 0x96A7, 0x96A7, 0x0DE2,
+ 0x96A8, 0x96A8, 0x2157, 0x96A9, 0x96A9, 0x5087, 0x96AA, 0x96AA, 0x21BF,
+ 0x96AB, 0x96AF, 0x5088, 0x96B0, 0x96B0, 0x1366, 0x96B1, 0x96B1, 0x221F,
+ 0x96B2, 0x96B2, 0x508D, 0x96B3, 0x96B3, 0x1684, 0x96B4, 0x96B4, 0x203D,
+ 0x96B5, 0x96B5, 0x508E, 0x96B6, 0x96B6, 0x09EE, 0x96B7, 0x96B7, 0x508F,
+ 0x96B8, 0x96B8, 0x2015, 0x96B9, 0x96B9, 0x1D79, 0x96BA, 0x96BA, 0x5090,
+ 0x96BB, 0x96BB, 0x26A5, 0x96BC, 0x96BD, 0x1D7A, 0x96BE, 0x96BE, 0x0B34,
+ 0x96BF, 0x96BF, 0x5091, 0x96C0, 0x96C0, 0x0C93, 0x96C1, 0x96C1, 0x100C,
+ 0x96C2, 0x96C3, 0x5092, 0x96C4, 0x96C4, 0x0FA6, 0x96C5, 0x96C5, 0x0FEE,
+ 0x96C6, 0x96C6, 0x0822, 0x96C7, 0x96C7, 0x0726, 0x96C8, 0x96C8, 0x5094,
+ 0x96C9, 0x96C9, 0x1B1C, 0x96CA, 0x96CB, 0x5095, 0x96CC, 0x96CC, 0x0549,
+ 0x96CD, 0x96CD, 0x109F, 0x96CE, 0x96CE, 0x1D7C, 0x96CF, 0x96CF, 0x0520,
+ 0x96D0, 0x96D1, 0x5097, 0x96D2, 0x96D2, 0x1D7D, 0x96D3, 0x96D4, 0x5099,
+ 0x96D5, 0x96D5, 0x05D2, 0x96D6, 0x96D6, 0x2156, 0x96D7, 0x96D8, 0x509B,
+ 0x96D9, 0x96D9, 0x2144, 0x96DA, 0x96DA, 0x509D, 0x96DB, 0x96DB, 0x1E91,
+ 0x96DC, 0x96DC, 0x2257, 0x96DD, 0x96DF, 0x509E, 0x96E0, 0x96E0, 0x1D7F,
+ 0x96E1, 0x96E1, 0x50A1, 0x96E2, 0x96E2, 0x200A, 0x96E3, 0x96E3, 0x2092,
+ 0x96E4, 0x96E7, 0x50A2, 0x96E8, 0x96E8, 0x10CF, 0x96E9, 0x96E9, 0x1D61,
+ 0x96EA, 0x96EA, 0x0FD2, 0x96EB, 0x96EE, 0x50A6, 0x96EF, 0x96EF, 0x1D63,
+ 0x96F0, 0x96F1, 0x50AA, 0x96F2, 0x96F2, 0x2250, 0x96F3, 0x96F3, 0x1D62,
+ 0x96F4, 0x96F5, 0x50AC, 0x96F6, 0x96F6, 0x0A2C, 0x96F7, 0x96F7, 0x09C2,
+ 0x96F8, 0x96F8, 0x50AE, 0x96F9, 0x96F9, 0x040B, 0x96FA, 0x96FA, 0x50AF,
+ 0x96FB, 0x96FB, 0x1EC3, 0x96FC, 0x96FD, 0x50B0, 0x96FE, 0x96FE, 0x0EFC,
+ 0x96FF, 0x96FF, 0x50B2, 0x9700, 0x9700, 0x0FB3, 0x9701, 0x9701, 0x1D65,
+ 0x9702, 0x9703, 0x50B3, 0x9704, 0x9704, 0x0F63, 0x9705, 0x9705, 0x50B5,
+ 0x9706, 0x9706, 0x1D64, 0x9707, 0x9707, 0x1191, 0x9708, 0x9708, 0x1D66,
+ 0x9709, 0x9709, 0x0ABE, 0x970A, 0x970C, 0x50B6, 0x970D, 0x970D, 0x0809,
+ 0x970E, 0x970E, 0x1D68, 0x970F, 0x970F, 0x1D67, 0x9710, 0x9712, 0x50B9,
+ 0x9713, 0x9713, 0x0B41, 0x9714, 0x9715, 0x50BC, 0x9716, 0x9716, 0x0A21,
+ 0x9717, 0x971B, 0x50BE, 0x971C, 0x971C, 0x0D9F, 0x971D, 0x971D, 0x50C3,
+ 0x971E, 0x971E, 0x0F29, 0x971F, 0x9726, 0x50C4, 0x9727, 0x9727, 0x21A8,
+ 0x9728, 0x9729, 0x50CC, 0x972A, 0x972A, 0x1D69, 0x972B, 0x972C, 0x50CE,
+ 0x972D, 0x972D, 0x1D6A, 0x972E, 0x972F, 0x50D0, 0x9730, 0x9730, 0x1D6B,
+ 0x9731, 0x9731, 0x50D2, 0x9732, 0x9732, 0x0A5D, 0x9733, 0x9737, 0x50D3,
+ 0x9738, 0x9738, 0x03DF, 0x9739, 0x9739, 0x0BBA, 0x973A, 0x973C, 0x50D8,
+ 0x973D, 0x973D, 0x260D, 0x973E, 0x973E, 0x1D6C, 0x973F, 0x9741, 0x50DB,
+ 0x9742, 0x9742, 0x260C, 0x9743, 0x9743, 0x50DE, 0x9744, 0x9744, 0x260E,
+ 0x9745, 0x9747, 0x50DF, 0x9748, 0x9748, 0x2032, 0x9749, 0x9751, 0x50E2,
+ 0x9752, 0x9752, 0x0C5D, 0x9753, 0x9753, 0x1D60, 0x9754, 0x9755, 0x50EB,
+ 0x9756, 0x9756, 0x08E7, 0x9757, 0x9758, 0x50ED, 0x9759, 0x9759, 0x08E1,
+ 0x975A, 0x975A, 0x260B, 0x975B, 0x975B, 0x05C6, 0x975C, 0x975D, 0x50EF,
+ 0x975E, 0x975E, 0x0664, 0x975F, 0x975F, 0x50F1, 0x9760, 0x9760, 0x094C,
+ 0x9761, 0x9761, 0x0AD7, 0x9762, 0x9762, 0x0AEB, 0x9763, 0x9764, 0x50F2,
+ 0x9765, 0x9765, 0x1282, 0x9766, 0x9767, 0x50F4, 0x9768, 0x9768, 0x22C3,
+ 0x9769, 0x9769, 0x06EA, 0x976A, 0x9772, 0x50F6, 0x9773, 0x9773, 0x08CA,
+ 0x9774, 0x9774, 0x0FCE, 0x9775, 0x9775, 0x50FF, 0x9776, 0x9776, 0x03DB,
+ 0x9777, 0x977B, 0x5100, 0x977C, 0x977C, 0x1DC8, 0x977D, 0x9784, 0x5105,
+ 0x9785, 0x9785, 0x1DC9, 0x9786, 0x978A, 0x510D, 0x978B, 0x978B, 0x0F77,
+ 0x978C, 0x978C, 0x5112, 0x978D, 0x978D, 0x03BB, 0x978E, 0x978E, 0x5113,
+ 0x978F, 0x978F, 0x1F23, 0x9790, 0x9790, 0x5114, 0x9791, 0x9792, 0x1DCA,
+ 0x9793, 0x9793, 0x5115, 0x9794, 0x9794, 0x1DCC, 0x9795, 0x9797, 0x5116,
+ 0x9798, 0x9798, 0x0C47, 0x9799, 0x979F, 0x5119, 0x97A0, 0x97A0, 0x08FE,
+ 0x97A1, 0x97A2, 0x5120, 0x97A3, 0x97A3, 0x1DCF, 0x97A4, 0x97A5, 0x5122,
+ 0x97A6, 0x97A6, 0x2695, 0x97A7, 0x97AA, 0x5124, 0x97AB, 0x97AB, 0x1DCE,
+ 0x97AC, 0x97AC, 0x5128, 0x97AD, 0x97AD, 0x0447, 0x97AE, 0x97AE, 0x5129,
+ 0x97AF, 0x97AF, 0x1DCD, 0x97B0, 0x97B1, 0x512A, 0x97B2, 0x97B2, 0x1DD0,
+ 0x97B3, 0x97B3, 0x512C, 0x97B4, 0x97B4, 0x1DD1, 0x97B5, 0x97BC, 0x512D,
+ 0x97BD, 0x97BD, 0x265E, 0x97BE, 0x97C2, 0x5135, 0x97C3, 0x97C3, 0x265D,
+ 0x97C4, 0x97C5, 0x513A, 0x97C6, 0x97C6, 0x2692, 0x97C7, 0x97C8, 0x513C,
+ 0x97C9, 0x97C9, 0x265F, 0x97CA, 0x97CA, 0x513E, 0x97CB, 0x97CB, 0x218D,
+ 0x97CC, 0x97CC, 0x20FD, 0x97CD, 0x97D2, 0x513F, 0x97D3, 0x97D3, 0x1F40,
+ 0x97D4, 0x97D8, 0x5145, 0x97D9, 0x97D9, 0x2465, 0x97DA, 0x97DB, 0x514A,
+ 0x97DC, 0x97DC, 0x2467, 0x97DD, 0x97DD, 0x514C, 0x97DE, 0x97DE, 0x2466,
+ 0x97DF, 0x97E5, 0x514D, 0x97E6, 0x97E6, 0x0EB3, 0x97E7, 0x97E7, 0x0CA8,
+ 0x97E8, 0x97E8, 0x5154, 0x97E9, 0x97E9, 0x0762, 0x97EA, 0x97EC, 0x184E,
+ 0x97ED, 0x97ED, 0x08F1, 0x97EE, 0x97F2, 0x5155, 0x97F3, 0x97F3, 0x107B,
+ 0x97F4, 0x97F4, 0x515A, 0x97F5, 0x97F5, 0x1112, 0x97F6, 0x97F6, 0x0D11,
+ 0x97F7, 0x97FE, 0x515B, 0x97FF, 0x97FF, 0x21C9, 0x9800, 0x9800, 0x5163,
+ 0x9801, 0x9801, 0x2209, 0x9802, 0x9802, 0x1EC9, 0x9803, 0x9803, 0x20E9,
+ 0x9804, 0x9804, 0x5164, 0x9805, 0x9805, 0x21CA, 0x9806, 0x9806, 0x2146,
+ 0x9807, 0x9807, 0x25C5, 0x9808, 0x9808, 0x21DC, 0x9809, 0x9809, 0x5165,
+ 0x980A, 0x980A, 0x245E, 0x980B, 0x980B, 0x5166, 0x980C, 0x980C, 0x214F,
+ 0x980D, 0x980D, 0x5167, 0x980E, 0x980F, 0x25C6, 0x9810, 0x9810, 0x2241,
+ 0x9811, 0x9811, 0x218A, 0x9812, 0x9812, 0x1E2F, 0x9813, 0x9813, 0x1EDC,
+ 0x9814, 0x9816, 0x5168, 0x9817, 0x9817, 0x20BF, 0x9818, 0x9818, 0x2034,
+ 0x9819, 0x981B, 0x516B, 0x981C, 0x981C, 0x25C9, 0x981D, 0x9820, 0x516E,
+ 0x9821, 0x9821, 0x25C8, 0x9822, 0x9823, 0x5172, 0x9824, 0x9824, 0x220E,
+ 0x9825, 0x9825, 0x5174, 0x9826, 0x9826, 0x25CB, 0x9827, 0x982C, 0x5175,
+ 0x982D, 0x982D, 0x217D, 0x982E, 0x982F, 0x517B, 0x9830, 0x9830, 0x1F7E,
+ 0x9831, 0x9836, 0x517D, 0x9837, 0x9837, 0x25CC, 0x9838, 0x9838, 0x1FC3,
+ 0x9839, 0x983A, 0x5183, 0x983B, 0x983B, 0x20B9, 0x983C, 0x983C, 0x5185,
+ 0x983D, 0x983D, 0x2181, 0x983E, 0x9845, 0x5186, 0x9846, 0x9846, 0x1FDA,
+ 0x9847, 0x984B, 0x518E, 0x984C, 0x984C, 0x2173, 0x984D, 0x984D, 0x1EE1,
+ 0x984E, 0x984E, 0x25CD, 0x984F, 0x9852, 0x5193, 0x9853, 0x9853, 0x25CE,
+ 0x9854, 0x9854, 0x21F6, 0x9855, 0x9857, 0x5197, 0x9858, 0x9858, 0x224B,
+ 0x9859, 0x9859, 0x25D1, 0x985A, 0x985A, 0x519A, 0x985B, 0x985B, 0x1EC0,
+ 0x985C, 0x985D, 0x519B, 0x985E, 0x985E, 0x2008, 0x985F, 0x9861, 0x519D,
+ 0x9862, 0x9862, 0x25D0, 0x9863, 0x9864, 0x51A0, 0x9865, 0x9865, 0x25D2,
+ 0x9866, 0x9866, 0x51A2, 0x9867, 0x9867, 0x1F2A, 0x9868, 0x986A, 0x51A3,
+ 0x986B, 0x986B, 0x1E72, 0x986C, 0x986C, 0x25D3, 0x986D, 0x986E, 0x51A6,
+ 0x986F, 0x986F, 0x21BE, 0x9870, 0x9870, 0x25D4, 0x9871, 0x9871, 0x2044,
+ 0x9872, 0x9872, 0x51A8, 0x9873, 0x9873, 0x25CF, 0x9874, 0x9874, 0x20F3,
+ 0x9875, 0x9875, 0x103A, 0x9876, 0x9876, 0x05E4, 0x9877, 0x9877, 0x0C67,
+ 0x9878, 0x9878, 0x1BE0, 0x9879, 0x9879, 0x0F5B, 0x987A, 0x987A, 0x0DA8,
+ 0x987B, 0x987B, 0x0FB6, 0x987C, 0x987C, 0x1827, 0x987D, 0x987D, 0x0E98,
+ 0x987E, 0x987E, 0x0724, 0x987F, 0x987F, 0x0618, 0x9880, 0x9880, 0x1BE1,
+ 0x9881, 0x9881, 0x03EF, 0x9882, 0x9882, 0x0DC1, 0x9883, 0x9883, 0x1BE2,
+ 0x9884, 0x9884, 0x10E7, 0x9885, 0x9885, 0x0A54, 0x9886, 0x9886, 0x0A35,
+ 0x9887, 0x9887, 0x0BE3, 0x9888, 0x9888, 0x08E0, 0x9889, 0x9889, 0x1BE3,
+ 0x988A, 0x988A, 0x0848, 0x988B, 0x988B, 0x51A9, 0x988C, 0x988D, 0x1BE4,
+ 0x988E, 0x988E, 0x51AA, 0x988F, 0x988F, 0x1BE6, 0x9890, 0x9890, 0x104A,
+ 0x9891, 0x9891, 0x0BD4, 0x9892, 0x9892, 0x51AB, 0x9893, 0x9893, 0x0E78,
+ 0x9894, 0x9894, 0x1BE7, 0x9895, 0x9895, 0x51AC, 0x9896, 0x9896, 0x1096,
+ 0x9897, 0x9897, 0x0952, 0x9898, 0x9898, 0x0E35, 0x9899, 0x9899, 0x51AD,
+ 0x989A, 0x989B, 0x1BE8, 0x989C, 0x989C, 0x0FFE, 0x989D, 0x989D, 0x062D,
+ 0x989E, 0x989F, 0x1BEA, 0x98A0, 0x98A0, 0x05C0, 0x98A1, 0x98A2, 0x1BEC,
+ 0x98A3, 0x98A3, 0x51AE, 0x98A4, 0x98A4, 0x04C3, 0x98A5, 0x98A6, 0x1BEE,
+ 0x98A7, 0x98A7, 0x0C82, 0x98A8, 0x98A8, 0x1F00, 0x98A9, 0x98AD, 0x51AF,
+ 0x98AE, 0x98AF, 0x24CC, 0x98B0, 0x98B0, 0x51B4, 0x98B1, 0x98B1, 0x2698,
+ 0x98B2, 0x98B2, 0x51B5, 0x98B3, 0x98B3, 0x2678, 0x98B4, 0x98B5, 0x51B6,
+ 0x98B6, 0x98B6, 0x24CE, 0x98B7, 0x98BB, 0x51B8, 0x98BC, 0x98BC, 0x24CF,
+ 0x98BD, 0x98C3, 0x51BD, 0x98C4, 0x98C4, 0x20B8, 0x98C5, 0x98C5, 0x51C4,
+ 0x98C6, 0x98C6, 0x24D0, 0x98C7, 0x98C7, 0x51C5, 0x98C8, 0x98C8, 0x24D1,
+ 0x98C9, 0x98CD, 0x51C6, 0x98CE, 0x98CE, 0x0684, 0x98CF, 0x98D0, 0x51CB,
+ 0x98D1, 0x98D3, 0x19B7, 0x98D4, 0x98D4, 0x51CD, 0x98D5, 0x98D5, 0x19BA,
+ 0x98D6, 0x98D7, 0x51CE, 0x98D8, 0x98D8, 0x0BCD, 0x98D9, 0x98DA, 0x19BB,
+ 0x98DB, 0x98DB, 0x1EF4, 0x98DC, 0x98DD, 0x51D0, 0x98DE, 0x98DE, 0x0666,
+ 0x98DF, 0x98DF, 0x0D4A, 0x98E0, 0x98E0, 0x239B, 0x98E1, 0x98E1, 0x51D2,
+ 0x98E2, 0x98E2, 0x267E, 0x98E3, 0x98E6, 0x51D3, 0x98E7, 0x98E7, 0x161A,
+ 0x98E8, 0x98E8, 0x1DE7, 0x98E9, 0x98E9, 0x239D, 0x98EA, 0x98EB, 0x239F,
+ 0x98EC, 0x98EC, 0x51D7, 0x98ED, 0x98ED, 0x23A1, 0x98EE, 0x98EE, 0x51D8,
+ 0x98EF, 0x98EF, 0x1EF1, 0x98F0, 0x98F1, 0x51D9, 0x98F2, 0x98F2, 0x221E,
+ 0x98F3, 0x98F3, 0x51DB, 0x98F4, 0x98F4, 0x23A2, 0x98F5, 0x98FB, 0x51DC,
+ 0x98FC, 0x98FC, 0x214B, 0x98FD, 0x98FD, 0x1E36, 0x98FE, 0x98FE, 0x2135,
+ 0x98FF, 0x98FF, 0x51E3, 0x9900, 0x9902, 0x51E4, 0x9903, 0x9903, 0x1FAD,
+ 0x9904, 0x9904, 0x51E7, 0x9905, 0x9905, 0x1E53, 0x9906, 0x9908, 0x51E8,
+ 0x9909, 0x9909, 0x23A3, 0x990A, 0x990A, 0x2203, 0x990B, 0x990B, 0x51EB,
+ 0x990C, 0x990C, 0x1EE7, 0x990D, 0x990D, 0x1DE8, 0x990E, 0x990F, 0x51EC,
+ 0x9910, 0x9910, 0x0494, 0x9911, 0x9911, 0x23A4, 0x9912, 0x9912, 0x2097,
+ 0x9913, 0x9913, 0x1EE4, 0x9914, 0x9917, 0x51EE, 0x9918, 0x9918, 0x2238,
+ 0x9919, 0x991A, 0x51F2, 0x991B, 0x991B, 0x23A5, 0x991C, 0x991D, 0x51F4,
+ 0x991E, 0x991E, 0x1F9A, 0x991F, 0x9920, 0x51F6, 0x9921, 0x9921, 0x21C3,
+ 0x9922, 0x9927, 0x51F8, 0x9928, 0x9928, 0x1F2E, 0x9929, 0x992D, 0x51FE,
+ 0x992E, 0x992E, 0x1DE9, 0x992F, 0x9932, 0x5203, 0x9933, 0x9933, 0x239C,
+ 0x9934, 0x9936, 0x5207, 0x9937, 0x9937, 0x23A6, 0x9938, 0x993B, 0x520A,
+ 0x993C, 0x993C, 0x239E, 0x993D, 0x993D, 0x520E, 0x993E, 0x993E, 0x2035,
+ 0x993F, 0x993F, 0x23A7, 0x9940, 0x9942, 0x520F, 0x9943, 0x9943, 0x23A8,
+ 0x9944, 0x9944, 0x5212, 0x9945, 0x9945, 0x2075, 0x9946, 0x9947, 0x5213,
+ 0x9948, 0x994A, 0x23A9, 0x994B, 0x994B, 0x1FEB, 0x994C, 0x994C, 0x23AC,
+ 0x994D, 0x9950, 0x5215, 0x9951, 0x9951, 0x1F6A, 0x9952, 0x9952, 0x20F9,
+ 0x9953, 0x9953, 0x5219, 0x9954, 0x9954, 0x1DEB, 0x9955, 0x9955, 0x1DEA,
+ 0x9956, 0x9956, 0x521A, 0x9957, 0x9957, 0x2666, 0x9958, 0x995B, 0x521B,
+ 0x995C, 0x995C, 0x2667, 0x995D, 0x995D, 0x521F, 0x995E, 0x995E, 0x1E6C,
+ 0x995F, 0x9961, 0x5220, 0x9962, 0x9962, 0x23AD, 0x9963, 0x9963, 0x161D,
+ 0x9964, 0x9964, 0x5223, 0x9965, 0x9965, 0x0815, 0x9966, 0x9966, 0x5224,
+ 0x9967, 0x996C, 0x161E, 0x996D, 0x996D, 0x0656, 0x996E, 0x996E, 0x1082,
+ 0x996F, 0x996F, 0x0875, 0x9970, 0x9970, 0x0D65, 0x9971, 0x9971, 0x040E,
+ 0x9972, 0x9972, 0x0DBC, 0x9973, 0x9973, 0x5225, 0x9974, 0x9974, 0x1624,
+ 0x9975, 0x9975, 0x063B, 0x9976, 0x9976, 0x0C9F, 0x9977, 0x9977, 0x1625,
+ 0x9978, 0x9979, 0x5226, 0x997A, 0x997A, 0x0899, 0x997B, 0x997B, 0x5228,
+ 0x997C, 0x997C, 0x0466, 0x997D, 0x997D, 0x1626, 0x997E, 0x997E, 0x5229,
+ 0x997F, 0x997F, 0x0635, 0x9980, 0x9980, 0x1627, 0x9981, 0x9981, 0x0B3C,
+ 0x9982, 0x9983, 0x522A, 0x9984, 0x9984, 0x1628, 0x9985, 0x9985, 0x0F47,
+ 0x9986, 0x9986, 0x0736, 0x9987, 0x9987, 0x1629, 0x9988, 0x9988, 0x098C,
+ 0x9989, 0x9989, 0x522C, 0x998A, 0x998A, 0x162A, 0x998B, 0x998B, 0x04BD,
+ 0x998C, 0x998C, 0x522D, 0x998D, 0x998D, 0x162B, 0x998E, 0x998E, 0x522E,
+ 0x998F, 0x998F, 0x0A3C, 0x9990, 0x9991, 0x162C, 0x9992, 0x9992, 0x0A9F,
+ 0x9993, 0x9995, 0x162E, 0x9996, 0x9996, 0x0D6E, 0x9997, 0x9997, 0x126E,
+ 0x9998, 0x9998, 0x12F9, 0x9999, 0x9999, 0x0F50, 0x999A, 0x99A4, 0x522F,
+ 0x99A5, 0x99A5, 0x1B2B, 0x99A6, 0x99A7, 0x523A, 0x99A8, 0x99A8, 0x13DE,
+ 0x99A9, 0x99AB, 0x523C, 0x99AC, 0x99AC, 0x206D, 0x99AD, 0x99AD, 0x2242,
+ 0x99AE, 0x99AE, 0x1F02, 0x99AF, 0x99B0, 0x523F, 0x99B1, 0x99B1, 0x2183,
+ 0x99B2, 0x99B2, 0x5241, 0x99B3, 0x99B3, 0x1E85, 0x99B4, 0x99B4, 0x21E9,
+ 0x99B5, 0x99C0, 0x5242, 0x99C1, 0x99C1, 0x1E57, 0x99C2, 0x99CF, 0x524E,
+ 0x99D0, 0x99D0, 0x22A5, 0x99D1, 0x99D1, 0x2407, 0x99D2, 0x99D2, 0x1FCA,
+ 0x99D3, 0x99D3, 0x525C, 0x99D4, 0x99D4, 0x2402, 0x99D5, 0x99D5, 0x1F82,
+ 0x99D6, 0x99D7, 0x525D, 0x99D8, 0x99D8, 0x2408, 0x99D9, 0x99D9, 0x2404,
+ 0x99DA, 0x99DA, 0x525F, 0x99DB, 0x99DB, 0x2131, 0x99DC, 0x99DC, 0x5260,
+ 0x99DD, 0x99DD, 0x2184, 0x99DE, 0x99DE, 0x5261, 0x99DF, 0x99DF, 0x2403,
+ 0x99E0, 0x99E0, 0x5262, 0x99E1, 0x99E1, 0x206E, 0x99E2, 0x99E2, 0x240B,
+ 0x99E3, 0x99EC, 0x5263, 0x99ED, 0x99ED, 0x1F3F, 0x99EE, 0x99F0, 0x526D,
+ 0x99F1, 0x99F1, 0x2067, 0x99F2, 0x99FE, 0x5270, 0x99FF, 0x99FF, 0x1FD7,
+ 0x9A00, 0x9A00, 0x527D, 0x9A01, 0x9A01, 0x1E83, 0x9A02, 0x9A04, 0x527E,
+ 0x9A05, 0x9A05, 0x240F, 0x9A06, 0x9A0C, 0x5281, 0x9A0D, 0x9A0D, 0x240E,
+ 0x9A0E, 0x9A0E, 0x20C7, 0x9A0F, 0x9A0F, 0x240D, 0x9A10, 0x9A15, 0x5288,
+ 0x9A16, 0x9A16, 0x2412, 0x9A17, 0x9A18, 0x528E, 0x9A19, 0x9A19, 0x20B7,
+ 0x9A1A, 0x9A2A, 0x5290, 0x9A2B, 0x9A2B, 0x23F0, 0x9A2C, 0x9A2C, 0x52A1,
+ 0x9A2D, 0x9A2D, 0x2411, 0x9A2E, 0x9A2E, 0x2414, 0x9A2F, 0x9A2F, 0x52A2,
+ 0x9A30, 0x9A30, 0x2170, 0x9A31, 0x9A35, 0x52A3, 0x9A36, 0x9A36, 0x2405,
+ 0x9A37, 0x9A37, 0x210C, 0x9A38, 0x9A38, 0x2415, 0x9A39, 0x9A3D, 0x52A8,
+ 0x9A3E, 0x9A3E, 0x2066, 0x9A3F, 0x9A3F, 0x52AD, 0x9A40, 0x9A40, 0x2352,
+ 0x9A41, 0x9A41, 0x2413, 0x9A42, 0x9A42, 0x2410, 0x9A43, 0x9A44, 0x2416,
+ 0x9A45, 0x9A45, 0x20F1, 0x9A46, 0x9A49, 0x52AE, 0x9A4A, 0x9A4A, 0x240A,
+ 0x9A4B, 0x9A4C, 0x52B2, 0x9A4D, 0x9A4D, 0x2409, 0x9A4E, 0x9A4E, 0x52B4,
+ 0x9A4F, 0x9A4F, 0x2418, 0x9A50, 0x9A54, 0x52B5, 0x9A55, 0x9A55, 0x1FA7,
+ 0x9A56, 0x9A56, 0x52BA, 0x9A57, 0x9A57, 0x21FC, 0x9A58, 0x9A59, 0x52BB,
+ 0x9A5A, 0x9A5A, 0x1FC1, 0x9A5B, 0x9A5B, 0x2406, 0x9A5C, 0x9A5E, 0x52BD,
+ 0x9A5F, 0x9A5F, 0x229C, 0x9A60, 0x9A61, 0x52C0, 0x9A62, 0x9A62, 0x204E,
+ 0x9A63, 0x9A63, 0x52C2, 0x9A64, 0x9A64, 0x241A, 0x9A65, 0x9A65, 0x2419,
+ 0x9A66, 0x9A69, 0x52C3, 0x9A6A, 0x9A6A, 0x240C, 0x9A6B, 0x9A6B, 0x52C7,
+ 0x9A6C, 0x9A6C, 0x0A94, 0x9A6D, 0x9A6D, 0x10E9, 0x9A6E, 0x9A6E, 0x0E85,
+ 0x9A6F, 0x9A6F, 0x0FDA, 0x9A70, 0x9A70, 0x0500, 0x9A71, 0x9A71, 0x0C7A,
+ 0x9A72, 0x9A72, 0x52C8, 0x9A73, 0x9A73, 0x047C, 0x9A74, 0x9A74, 0x0A66,
+ 0x9A75, 0x9A75, 0x17BA, 0x9A76, 0x9A76, 0x0D52, 0x9A77, 0x9A78, 0x17BB,
+ 0x9A79, 0x9A79, 0x0903, 0x9A7A, 0x9A7A, 0x17BD, 0x9A7B, 0x9A7B, 0x1201,
+ 0x9A7C, 0x9A7C, 0x0E86, 0x9A7D, 0x9A7D, 0x17BF, 0x9A7E, 0x9A7E, 0x0850,
+ 0x9A7F, 0x9A7F, 0x17BE, 0x9A80, 0x9A81, 0x17C0, 0x9A82, 0x9A82, 0x0A95,
+ 0x9A83, 0x9A83, 0x52C9, 0x9A84, 0x9A84, 0x088F, 0x9A85, 0x9A85, 0x17C2,
+ 0x9A86, 0x9A86, 0x0A8D, 0x9A87, 0x9A87, 0x075E, 0x9A88, 0x9A88, 0x17C3,
+ 0x9A89, 0x9A89, 0x52CA, 0x9A8A, 0x9A8A, 0x17C4, 0x9A8B, 0x9A8B, 0x04F7,
+ 0x9A8C, 0x9A8C, 0x1012, 0x9A8D, 0x9A8E, 0x52CB, 0x9A8F, 0x9A8F, 0x0932,
+ 0x9A90, 0x9A90, 0x17C5, 0x9A91, 0x9A91, 0x0C0E, 0x9A92, 0x9A93, 0x17C6,
+ 0x9A94, 0x9A95, 0x52CD, 0x9A96, 0x9A96, 0x17C8, 0x9A97, 0x9A97, 0x0BCC,
+ 0x9A98, 0x9A98, 0x17C9, 0x9A99, 0x9A99, 0x52CF, 0x9A9A, 0x9A9A, 0x0CE0,
+ 0x9A9B, 0x9A9D, 0x17CA, 0x9A9E, 0x9A9E, 0x1735, 0x9A9F, 0x9AA0, 0x17CD,
+ 0x9AA1, 0x9AA1, 0x0A89, 0x9AA2, 0x9AA3, 0x17CF, 0x9AA4, 0x9AA4, 0x11E7,
+ 0x9AA5, 0x9AA5, 0x17D1, 0x9AA6, 0x9AA6, 0x52D0, 0x9AA7, 0x9AA7, 0x17D2,
+ 0x9AA8, 0x9AA8, 0x0720, 0x9AA9, 0x9AAE, 0x52D1, 0x9AAF, 0x9AAF, 0x1E29,
+ 0x9AB0, 0x9AB0, 0x1DD3, 0x9AB1, 0x9AB1, 0x1DD2, 0x9AB2, 0x9AB5, 0x52D7,
+ 0x9AB6, 0x9AB6, 0x1DD6, 0x9AB7, 0x9AB7, 0x1DD4, 0x9AB8, 0x9AB8, 0x0758,
+ 0x9AB9, 0x9AB9, 0x52DB, 0x9ABA, 0x9ABA, 0x1DD7, 0x9ABB, 0x9ABB, 0x52DC,
+ 0x9ABC, 0x9ABC, 0x1DD8, 0x9ABD, 0x9ABF, 0x52DD, 0x9AC0, 0x9AC0, 0x1DDA,
+ 0x9AC1, 0x9AC1, 0x1DD9, 0x9AC2, 0x9AC2, 0x1DDC, 0x9AC3, 0x9AC4, 0x52E0,
+ 0x9AC5, 0x9AC5, 0x1DDB, 0x9AC6, 0x9ACA, 0x52E2, 0x9ACB, 0x9ACC, 0x1DDD,
+ 0x9ACD, 0x9ACE, 0x52E7, 0x9ACF, 0x9ACF, 0x2661, 0x9AD0, 0x9AD0, 0x52E9,
+ 0x9AD1, 0x9AD1, 0x1DDF, 0x9AD2, 0x9AD2, 0x26A4, 0x9AD3, 0x9AD3, 0x0DDD,
+ 0x9AD4, 0x9AD4, 0x2174, 0x9AD5, 0x9AD5, 0x2663, 0x9AD6, 0x9AD6, 0x2662,
+ 0x9AD7, 0x9AD7, 0x52EA, 0x9AD8, 0x9AD8, 0x06DA, 0x9AD9, 0x9ADE, 0x52EB,
+ 0x9ADF, 0x9ADF, 0x1DEC, 0x9AE0, 0x9AE0, 0x52F1, 0x9AE1, 0x9AE1, 0x1DED,
+ 0x9AE2, 0x9AE5, 0x52F2, 0x9AE6, 0x9AE6, 0x1DEE, 0x9AE7, 0x9AEA, 0x52F6,
+ 0x9AEB, 0x9AEB, 0x1DF0, 0x9AEC, 0x9AEC, 0x52FA, 0x9AED, 0x9AED, 0x1DF2,
+ 0x9AEE, 0x9AEE, 0x2675, 0x9AEF, 0x9AEF, 0x1DEF, 0x9AF0, 0x9AF8, 0x52FB,
+ 0x9AF9, 0x9AF9, 0x1DF3, 0x9AFA, 0x9AFA, 0x5304, 0x9AFB, 0x9AFB, 0x1DF1,
+ 0x9AFC, 0x9AFF, 0x5305, 0x9B00, 0x9B02, 0x5309, 0x9B03, 0x9B03, 0x1234,
+ 0x9B04, 0x9B05, 0x530C, 0x9B06, 0x9B06, 0x214C, 0x9B07, 0x9B07, 0x530E,
+ 0x9B08, 0x9B08, 0x1DF4, 0x9B09, 0x9B0C, 0x530F, 0x9B0D, 0x9B0D, 0x267A,
+ 0x9B0E, 0x9B0E, 0x5313, 0x9B0F, 0x9B0F, 0x1DF5, 0x9B10, 0x9B12, 0x5314,
+ 0x9B13, 0x9B13, 0x1DF6, 0x9B14, 0x9B19, 0x5317, 0x9B1A, 0x9B1A, 0x26A0,
+ 0x9B1B, 0x9B1E, 0x531D, 0x9B1F, 0x9B1F, 0x1DF7, 0x9B20, 0x9B21, 0x5321,
+ 0x9B22, 0x9B22, 0x2668, 0x9B23, 0x9B23, 0x1DF8, 0x9B24, 0x9B24, 0x5323,
+ 0x9B25, 0x9B25, 0x1ED0, 0x9B26, 0x9B26, 0x5324, 0x9B27, 0x9B27, 0x2096,
+ 0x9B28, 0x9B28, 0x5325, 0x9B29, 0x9B29, 0x23CC, 0x9B2A, 0x9B2D, 0x5326,
+ 0x9B2E, 0x9B2E, 0x23C8, 0x9B2F, 0x9B2F, 0x139B, 0x9B30, 0x9B30, 0x532A,
+ 0x9B31, 0x9B31, 0x223E, 0x9B32, 0x9B32, 0x1260, 0x9B33, 0x9B3A, 0x532B,
+ 0x9B3B, 0x9B3B, 0x1773, 0x9B3C, 0x9B3C, 0x0746, 0x9B3D, 0x9B40, 0x5333,
+ 0x9B41, 0x9B41, 0x098A, 0x9B42, 0x9B42, 0x07FF, 0x9B43, 0x9B43, 0x1DE1,
+ 0x9B44, 0x9B44, 0x0BE6, 0x9B45, 0x9B45, 0x1DE0, 0x9B46, 0x9B46, 0x5337,
+ 0x9B47, 0x9B47, 0x1DE2, 0x9B48, 0x9B48, 0x1DE4, 0x9B49, 0x9B49, 0x1DE3,
+ 0x9B4A, 0x9B4C, 0x5338, 0x9B4D, 0x9B4D, 0x1DE5, 0x9B4E, 0x9B4E, 0x2665,
+ 0x9B4F, 0x9B4F, 0x0EC9, 0x9B50, 0x9B50, 0x533B, 0x9B51, 0x9B51, 0x1DE6,
+ 0x9B52, 0x9B53, 0x533C, 0x9B54, 0x9B54, 0x0B0A, 0x9B55, 0x9B57, 0x533E,
+ 0x9B58, 0x9B58, 0x2664, 0x9B59, 0x9B59, 0x5341, 0x9B5A, 0x9B5A, 0x2239,
+ 0x9B5B, 0x9B6E, 0x5342, 0x9B6F, 0x9B6F, 0x204A, 0x9B70, 0x9B73, 0x5356,
+ 0x9B74, 0x9B74, 0x261F, 0x9B75, 0x9B76, 0x535A, 0x9B77, 0x9B77, 0x261E,
+ 0x9B78, 0x9B80, 0x535C, 0x9B81, 0x9B81, 0x2620, 0x9B82, 0x9B82, 0x5365,
+ 0x9B83, 0x9B83, 0x2621, 0x9B84, 0x9B8D, 0x5366, 0x9B8E, 0x9B8E, 0x2622,
+ 0x9B8F, 0x9B8F, 0x5370, 0x9B90, 0x9B90, 0x2627, 0x9B91, 0x9B91, 0x1E39,
+ 0x9B92, 0x9B92, 0x2625, 0x9B93, 0x9B99, 0x5371, 0x9B9A, 0x9B9A, 0x2629,
+ 0x9B9B, 0x9B9C, 0x5378, 0x9B9D, 0x9B9D, 0x262E, 0x9B9E, 0x9B9E, 0x262B,
+ 0x9B9F, 0x9BA9, 0x537A, 0x9BAA, 0x9BAA, 0x262A, 0x9BAB, 0x9BAB, 0x262D,
+ 0x9BAC, 0x9BAC, 0x5385, 0x9BAD, 0x9BAD, 0x2628, 0x9BAE, 0x9BAE, 0x21B9,
+ 0x9BAF, 0x9BBF, 0x5386, 0x9BC0, 0x9BC0, 0x2636, 0x9BC1, 0x9BC1, 0x2630,
+ 0x9BC2, 0x9BC6, 0x5397, 0x9BC7, 0x9BC7, 0x2638, 0x9BC8, 0x9BC8, 0x539C,
+ 0x9BC9, 0x9BC9, 0x200D, 0x9BCA, 0x9BCA, 0x2637, 0x9BCB, 0x9BD3, 0x539D,
+ 0x9BD4, 0x9BD4, 0x2645, 0x9BD5, 0x9BD5, 0x53A6, 0x9BD6, 0x9BD6, 0x263A,
+ 0x9BD7, 0x9BDA, 0x53A7, 0x9BDB, 0x9BDB, 0x2643, 0x9BDC, 0x9BDC, 0x53AB,
+ 0x9BDD, 0x9BDD, 0x2640, 0x9BDE, 0x9BE0, 0x53AC, 0x9BE1, 0x9BE1, 0x263D,
+ 0x9BE2, 0x9BE2, 0x2641, 0x9BE3, 0x9BE3, 0x53AF, 0x9BE4, 0x9BE4, 0x263E,
+ 0x9BE5, 0x9BE6, 0x53B0, 0x9BE7, 0x9BE7, 0x263F, 0x9BE8, 0x9BE8, 0x1FC0,
+ 0x9BE9, 0x9BE9, 0x53B2, 0x9BEA, 0x9BEB, 0x263B, 0x9BEC, 0x9BEF, 0x53B3,
+ 0x9BF0, 0x9BF0, 0x2642, 0x9BF1, 0x9BF3, 0x53B7, 0x9BF4, 0x9BF4, 0x2644,
+ 0x9BF5, 0x9BFC, 0x53BA, 0x9BFD, 0x9BFD, 0x2639, 0x9BFE, 0x9BFE, 0x53C2,
+ 0x9BFF, 0x9BFF, 0x264C, 0x9C00, 0x9C07, 0x53C3, 0x9C08, 0x9C08, 0x2647,
+ 0x9C09, 0x9C09, 0x264B, 0x9C0A, 0x9C0C, 0x53CB, 0x9C0D, 0x9C0D, 0x2649,
+ 0x9C0E, 0x9C0F, 0x53CE, 0x9C10, 0x9C10, 0x2648, 0x9C11, 0x9C11, 0x53D0,
+ 0x9C12, 0x9C12, 0x264A, 0x9C13, 0x9C13, 0x2108, 0x9C14, 0x9C1F, 0x53D1,
+ 0x9C20, 0x9C20, 0x264D, 0x9C21, 0x9C22, 0x53DD, 0x9C23, 0x9C23, 0x2634,
+ 0x9C24, 0x9C24, 0x53DF, 0x9C25, 0x9C25, 0x2651, 0x9C26, 0x9C27, 0x53E0,
+ 0x9C28, 0x9C28, 0x2650, 0x9C29, 0x9C29, 0x2652, 0x9C2A, 0x9C2C, 0x53E2,
+ 0x9C2D, 0x9C2D, 0x264F, 0x9C2E, 0x9C30, 0x53E5, 0x9C31, 0x9C31, 0x2632,
+ 0x9C32, 0x9C32, 0x264E, 0x9C33, 0x9C33, 0x2653, 0x9C34, 0x9C34, 0x53E8,
+ 0x9C35, 0x9C35, 0x2657, 0x9C36, 0x9C36, 0x53E9, 0x9C37, 0x9C37, 0x2635,
+ 0x9C38, 0x9C38, 0x53EA, 0x9C39, 0x9C39, 0x2633, 0x9C3A, 0x9C3A, 0x53EB,
+ 0x9C3B, 0x9C3B, 0x2656, 0x9C3C, 0x9C3D, 0x53EC, 0x9C3E, 0x9C3E, 0x2654,
+ 0x9C3F, 0x9C44, 0x53EE, 0x9C45, 0x9C45, 0x2658, 0x9C46, 0x9C47, 0x53F4,
+ 0x9C48, 0x9C48, 0x2655, 0x9C49, 0x9C49, 0x1E4D, 0x9C4A, 0x9C51, 0x53F6,
+ 0x9C52, 0x9C52, 0x265B, 0x9C53, 0x9C53, 0x53FE, 0x9C54, 0x9C54, 0x265A,
+ 0x9C55, 0x9C55, 0x53FF, 0x9C56, 0x9C56, 0x2659, 0x9C57, 0x9C57, 0x202E,
+ 0x9C58, 0x9C58, 0x262F, 0x9C59, 0x9C5C, 0x5400, 0x9C5D, 0x9C5D, 0x2646,
+ 0x9C5E, 0x9C5E, 0x5404, 0x9C5F, 0x9C5F, 0x2626, 0x9C60, 0x9C66, 0x5405,
+ 0x9C67, 0x9C67, 0x265C, 0x9C68, 0x9C6C, 0x540C, 0x9C6D, 0x9C6D, 0x262C,
+ 0x9C6E, 0x9C77, 0x5411, 0x9C78, 0x9C78, 0x2623, 0x9C79, 0x9C79, 0x541B,
+ 0x9C7A, 0x9C7A, 0x2631, 0x9C7B, 0x9C7B, 0x541C, 0x9C7C, 0x9C7C, 0x10C8,
+ 0x9C7D, 0x9C7E, 0x541D, 0x9C7F, 0x9C7F, 0x1D89, 0x9C80, 0x9C80, 0x541F,
+ 0x9C81, 0x9C81, 0x0A5A, 0x9C82, 0x9C82, 0x1D8A, 0x9C83, 0x9C84, 0x5420,
+ 0x9C85, 0x9C88, 0x1D8B, 0x9C89, 0x9C8A, 0x5422, 0x9C8B, 0x9C8B, 0x1D90,
+ 0x9C8C, 0x9C8C, 0x5424, 0x9C8D, 0x9C8D, 0x0414, 0x9C8E, 0x9C8E, 0x1D91,
+ 0x9C8F, 0x9C8F, 0x5425, 0x9C90, 0x9C92, 0x1D92, 0x9C93, 0x9C93, 0x5426,
+ 0x9C94, 0x9C95, 0x1D95, 0x9C96, 0x9C99, 0x5427, 0x9C9A, 0x9C9B, 0x1D97,
+ 0x9C9C, 0x9C9C, 0x0F37, 0x9C9D, 0x9C9D, 0x542B, 0x9C9E, 0x9CA3, 0x1D99,
+ 0x9CA4, 0x9CA4, 0x09DB, 0x9CA5, 0x9CA9, 0x1D9F, 0x9CAA, 0x9CAA, 0x542C,
+ 0x9CAB, 0x9CAB, 0x1DA4, 0x9CAC, 0x9CAC, 0x542D, 0x9CAD, 0x9CAE, 0x1DA5,
+ 0x9CAF, 0x9CAF, 0x542E, 0x9CB0, 0x9CB7, 0x1DA7, 0x9CB8, 0x9CB8, 0x08D7,
+ 0x9CB9, 0x9CB9, 0x542F, 0x9CBA, 0x9CBD, 0x1DAF, 0x9CBE, 0x9CC2, 0x5430,
+ 0x9CC3, 0x9CC3, 0x0CD5, 0x9CC4, 0x9CC7, 0x1DB3, 0x9CC8, 0x9CC9, 0x5435,
+ 0x9CCA, 0x9CD0, 0x1DB7, 0x9CD1, 0x9CD2, 0x5437, 0x9CD3, 0x9CD5, 0x1DBE,
+ 0x9CD6, 0x9CD6, 0x0457, 0x9CD7, 0x9CD9, 0x1DC1, 0x9CDA, 0x9CDB, 0x5439,
+ 0x9CDC, 0x9CDD, 0x1DC4, 0x9CDE, 0x9CDE, 0x0A24, 0x9CDF, 0x9CDF, 0x1DC6,
+ 0x9CE0, 0x9CE1, 0x543B, 0x9CE2, 0x9CE2, 0x1DC7, 0x9CE3, 0x9CE4, 0x543D,
+ 0x9CE5, 0x9CE5, 0x209C, 0x9CE6, 0x9CE8, 0x543F, 0x9CE9, 0x9CE9, 0x2580,
+ 0x9CEA, 0x9CEB, 0x5442, 0x9CEC, 0x9CEC, 0x22DC, 0x9CED, 0x9CF2, 0x5444,
+ 0x9CF3, 0x9CF3, 0x1F05, 0x9CF4, 0x9CF4, 0x208B, 0x9CF5, 0x9CF5, 0x544A,
+ 0x9CF6, 0x9CF6, 0x2581, 0x9CF7, 0x9CFF, 0x544B, 0x9D00, 0x9D05, 0x5454,
+ 0x9D06, 0x9D06, 0x2583, 0x9D07, 0x9D07, 0x2582, 0x9D08, 0x9D08, 0x545A,
+ 0x9D09, 0x9D09, 0x21EE, 0x9D0A, 0x9D14, 0x545B, 0x9D15, 0x9D15, 0x2182,
+ 0x9D16, 0x9D1A, 0x5466, 0x9D1B, 0x9D1B, 0x2243, 0x9D1C, 0x9D1C, 0x546B,
+ 0x9D1D, 0x9D1D, 0x2587, 0x9D1E, 0x9D1E, 0x546C, 0x9D1F, 0x9D1F, 0x2588,
+ 0x9D20, 0x9D22, 0x546D, 0x9D23, 0x9D23, 0x2584, 0x9D24, 0x9D25, 0x5470,
+ 0x9D26, 0x9D26, 0x21FD, 0x9D27, 0x9D27, 0x5472, 0x9D28, 0x9D28, 0x21EF,
+ 0x9D29, 0x9D2E, 0x5473, 0x9D2F, 0x9D2F, 0x258A, 0x9D30, 0x9D30, 0x258C,
+ 0x9D31, 0x9D3A, 0x5479, 0x9D3B, 0x9D3B, 0x1F47, 0x9D3C, 0x9D3E, 0x5483,
+ 0x9D3F, 0x9D3F, 0x1F1D, 0x9D40, 0x9D41, 0x5486, 0x9D42, 0x9D42, 0x258D,
+ 0x9D43, 0x9D50, 0x5488, 0x9D51, 0x9D51, 0x1FD0, 0x9D52, 0x9D52, 0x2592,
+ 0x9D53, 0x9D53, 0x258F, 0x9D54, 0x9D5B, 0x5496, 0x9D5C, 0x9D5C, 0x2594,
+ 0x9D5D, 0x9D5D, 0x1EE0, 0x9D5E, 0x9D5F, 0x549E, 0x9D60, 0x9D60, 0x2591,
+ 0x9D61, 0x9D61, 0x2595, 0x9D62, 0x9D69, 0x54A0, 0x9D6A, 0x9D6A, 0x2597,
+ 0x9D6B, 0x9D6B, 0x54A8, 0x9D6C, 0x9D6C, 0x20B6, 0x9D6D, 0x9D6E, 0x54A9,
+ 0x9D6F, 0x9D6F, 0x2598, 0x9D70, 0x9D71, 0x54AB, 0x9D72, 0x9D72, 0x20F6,
+ 0x9D73, 0x9D86, 0x54AD, 0x9D87, 0x9D87, 0x2585, 0x9D88, 0x9D88, 0x54C1,
+ 0x9D89, 0x9D89, 0x2599, 0x9D8A, 0x9D92, 0x54C2, 0x9D93, 0x9D93, 0x2596,
+ 0x9D94, 0x9D97, 0x54CB, 0x9D98, 0x9D98, 0x259A, 0x9D99, 0x9D99, 0x54CF,
+ 0x9D9A, 0x9D9A, 0x259B, 0x9D9B, 0x9DA4, 0x54D0, 0x9DA5, 0x9DA5, 0x259D,
+ 0x9DA6, 0x9DA8, 0x54DA, 0x9DA9, 0x9DA9, 0x259E, 0x9DAA, 0x9DAE, 0x54DD,
+ 0x9DAF, 0x9DAF, 0x234C, 0x9DB0, 0x9DB3, 0x54E2, 0x9DB4, 0x9DB4, 0x1F44,
+ 0x9DB5, 0x9DBA, 0x54E6, 0x9DBB, 0x9DBB, 0x2660, 0x9DBC, 0x9DBC, 0x25A0,
+ 0x9DBD, 0x9DBF, 0x54EC, 0x9DC0, 0x9DC0, 0x259C, 0x9DC1, 0x9DC1, 0x54EF,
+ 0x9DC2, 0x9DC2, 0x259F, 0x9DC3, 0x9DC3, 0x54F0, 0x9DC4, 0x9DC4, 0x1F6C,
+ 0x9DC5, 0x9DD2, 0x54F1, 0x9DD3, 0x9DD3, 0x25A2, 0x9DD4, 0x9DD6, 0x54FF,
+ 0x9DD7, 0x9DD7, 0x20AE, 0x9DD8, 0x9DD8, 0x5502, 0x9DD9, 0x9DD9, 0x258B,
+ 0x9DDA, 0x9DDA, 0x25A3, 0x9DDB, 0x9DE4, 0x5503, 0x9DE5, 0x9DE5, 0x2589,
+ 0x9DE6, 0x9DE6, 0x25A5, 0x9DE7, 0x9DEE, 0x550D, 0x9DEF, 0x9DEF, 0x25A4,
+ 0x9DF0, 0x9DF1, 0x5515, 0x9DF2, 0x9DF2, 0x25A6, 0x9DF3, 0x9DF3, 0x2593,
+ 0x9DF4, 0x9DF7, 0x5517, 0x9DF8, 0x9DF8, 0x25A7, 0x9DF9, 0x9DF9, 0x2222,
+ 0x9DFA, 0x9DFA, 0x25A9, 0x9DFB, 0x9DFF, 0x551B, 0x9E00, 0x9E0B, 0x5520,
+ 0x9E0C, 0x9E0C, 0x25A8, 0x9E0D, 0x9E14, 0x552C, 0x9E15, 0x9E15, 0x2586,
+ 0x9E16, 0x9E19, 0x5534, 0x9E1A, 0x9E1A, 0x25A1, 0x9E1B, 0x9E1B, 0x25AA,
+ 0x9E1C, 0x9E1C, 0x5538, 0x9E1D, 0x9E1D, 0x2590, 0x9E1E, 0x9E1E, 0x258E,
+ 0x9E1F, 0x9E1F, 0x0B54, 0x9E20, 0x9E20, 0x1B35, 0x9E21, 0x9E21, 0x0819,
+ 0x9E22, 0x9E22, 0x1B36, 0x9E23, 0x9E23, 0x0AFE, 0x9E24, 0x9E24, 0x5539,
+ 0x9E25, 0x9E25, 0x0B79, 0x9E26, 0x9E26, 0x0FE4, 0x9E27, 0x9E27, 0x553A,
+ 0x9E28, 0x9E2C, 0x1B37, 0x9E2D, 0x9E2D, 0x0FE5, 0x9E2E, 0x9E2E, 0x553B,
+ 0x9E2F, 0x9E2F, 0x1015, 0x9E30, 0x9E30, 0x553C, 0x9E31, 0x9E31, 0x1B3D,
+ 0x9E32, 0x9E32, 0x1B3C, 0x9E33, 0x9E33, 0x10EA, 0x9E34, 0x9E34, 0x553D,
+ 0x9E35, 0x9E35, 0x0E83, 0x9E36, 0x9E36, 0x1B3E, 0x9E37, 0x9E37, 0x1B40,
+ 0x9E38, 0x9E38, 0x1B3F, 0x9E39, 0x9E3A, 0x1B41, 0x9E3B, 0x9E3C, 0x553E,
+ 0x9E3D, 0x9E3D, 0x06E6, 0x9E3E, 0x9E3E, 0x1B43, 0x9E3F, 0x9E3F, 0x079F,
+ 0x9E40, 0x9E40, 0x5540, 0x9E41, 0x9E42, 0x1B44, 0x9E43, 0x9E43, 0x0918,
+ 0x9E44, 0x9E44, 0x1B46, 0x9E45, 0x9E45, 0x062B, 0x9E46, 0x9E49, 0x1B47,
+ 0x9E4A, 0x9E4A, 0x0C90, 0x9E4B, 0x9E4C, 0x1B4B, 0x9E4D, 0x9E4D, 0x5541,
+ 0x9E4E, 0x9E4E, 0x1B4D, 0x9E4F, 0x9E4F, 0x0BB5, 0x9E50, 0x9E50, 0x5542,
+ 0x9E51, 0x9E51, 0x1B4E, 0x9E52, 0x9E54, 0x5543, 0x9E55, 0x9E55, 0x1B4F,
+ 0x9E56, 0x9E56, 0x5546, 0x9E57, 0x9E57, 0x1B50, 0x9E58, 0x9E58, 0x1DD5,
+ 0x9E59, 0x9E59, 0x5547, 0x9E5A, 0x9E5C, 0x1B51, 0x9E5D, 0x9E5D, 0x5548,
+ 0x9E5E, 0x9E5E, 0x1B54, 0x9E5F, 0x9E62, 0x5549, 0x9E63, 0x9E63, 0x1B55,
+ 0x9E64, 0x9E64, 0x078E, 0x9E65, 0x9E65, 0x554D, 0x9E66, 0x9E6C, 0x1B56,
+ 0x9E6D, 0x9E6D, 0x1B5E, 0x9E6E, 0x9E6F, 0x554E, 0x9E70, 0x9E70, 0x108A,
+ 0x9E71, 0x9E71, 0x1B5D, 0x9E72, 0x9E72, 0x5550, 0x9E73, 0x9E73, 0x1B5F,
+ 0x9E74, 0x9E74, 0x5551, 0x9E75, 0x9E75, 0x2688, 0x9E76, 0x9E78, 0x5552,
+ 0x9E79, 0x9E79, 0x269E, 0x9E7A, 0x9E7A, 0x25FB, 0x9E7B, 0x9E7B, 0x5555,
+ 0x9E7C, 0x9E7C, 0x1F8C, 0x9E7D, 0x9E7D, 0x21F4, 0x9E7E, 0x9E7E, 0x1D16,
+ 0x9E7F, 0x9E7F, 0x0A60, 0x9E80, 0x9E81, 0x5556, 0x9E82, 0x9E82, 0x1DFC,
+ 0x9E83, 0x9E86, 0x5558, 0x9E87, 0x9E88, 0x1DFD, 0x9E89, 0x9E8A, 0x555C,
+ 0x9E8B, 0x9E8B, 0x1DFF, 0x9E8C, 0x9E91, 0x555E, 0x9E92, 0x9E92, 0x1E00,
+ 0x9E93, 0x9E93, 0x0A5B, 0x9E94, 0x9E96, 0x5564, 0x9E97, 0x9E97, 0x200F,
+ 0x9E98, 0x9E9C, 0x5567, 0x9E9D, 0x9E9D, 0x1E02, 0x9E9E, 0x9E9E, 0x556C,
+ 0x9E9F, 0x9E9F, 0x1E03, 0x9EA0, 0x9EA4, 0x556D, 0x9EA5, 0x9EA5, 0x2071,
+ 0x9EA6, 0x9EA6, 0x0A9A, 0x9EA7, 0x9EA8, 0x5572, 0x9EA9, 0x9EA9, 0x25F7,
+ 0x9EAA, 0x9EAE, 0x5574, 0x9EAF, 0x9EAF, 0x2696, 0x9EB0, 0x9EB3, 0x5579,
+ 0x9EB4, 0x9EB4, 0x1CEE, 0x9EB5, 0x9EB5, 0x268F, 0x9EB6, 0x9EB7, 0x557D,
+ 0x9EB8, 0x9EB8, 0x1CED, 0x9EB9, 0x9EBA, 0x557F, 0x9EBB, 0x9EBB, 0x0A90,
+ 0x9EBC, 0x9EBC, 0x5581, 0x9EBD, 0x9EBE, 0x1DF9, 0x9EBF, 0x9EC3, 0x5582,
+ 0x9EC4, 0x9EC4, 0x07DB, 0x9EC5, 0x9EC8, 0x5587, 0x9EC9, 0x9EC9, 0x12F8,
+ 0x9ECA, 0x9ECB, 0x558B, 0x9ECC, 0x9ECC, 0x22DA, 0x9ECD, 0x9ECD, 0x0D89,
+ 0x9ECE, 0x9ECE, 0x09D3, 0x9ECF, 0x9ECF, 0x1B2A, 0x9ED0, 0x9ED0, 0x558D,
+ 0x9ED1, 0x9ED1, 0x0791, 0x9ED2, 0x9ED3, 0x558E, 0x9ED4, 0x9ED4, 0x0C2A,
+ 0x9ED5, 0x9ED7, 0x5590, 0x9ED8, 0x9ED8, 0x0B0F, 0x9ED9, 0x9EDA, 0x5593,
+ 0x9EDB, 0x9EDD, 0x1E04, 0x9EDE, 0x9EDE, 0x1EC1, 0x9EDF, 0x9EDF, 0x1E08,
+ 0x9EE0, 0x9EE0, 0x1E07, 0x9EE1, 0x9EE1, 0x5595, 0x9EE2, 0x9EE2, 0x1E09,
+ 0x9EE3, 0x9EE4, 0x5596, 0x9EE5, 0x9EE5, 0x1E0C, 0x9EE6, 0x9EE6, 0x5598,
+ 0x9EE7, 0x9EE7, 0x1E0B, 0x9EE8, 0x9EE8, 0x1EB3, 0x9EE9, 0x9EE9, 0x1E0A,
+ 0x9EEA, 0x9EEA, 0x1E0D, 0x9EEB, 0x9EEE, 0x5599, 0x9EEF, 0x9EEF, 0x1E0E,
+ 0x9EF0, 0x9EF1, 0x559D, 0x9EF2, 0x9EF2, 0x266A, 0x9EF3, 0x9EF3, 0x559F,
+ 0x9EF4, 0x9EF4, 0x268A, 0x9EF5, 0x9EF6, 0x55A0, 0x9EF7, 0x9EF7, 0x2669,
+ 0x9EF8, 0x9EF8, 0x55A2, 0x9EF9, 0x9EF9, 0x1A55, 0x9EFA, 0x9EFA, 0x55A3,
+ 0x9EFB, 0x9EFC, 0x1A56, 0x9EFD, 0x9EFD, 0x2618, 0x9EFE, 0x9EFE, 0x1D76,
+ 0x9EFF, 0x9EFF, 0x2619, 0x9F00, 0x9F08, 0x55A4, 0x9F09, 0x9F09, 0x261A,
+ 0x9F0A, 0x9F0A, 0x55AD, 0x9F0B, 0x9F0B, 0x1D77, 0x9F0C, 0x9F0C, 0x55AE,
+ 0x9F0D, 0x9F0D, 0x1D78, 0x9F0E, 0x9F0E, 0x05E5, 0x9F0F, 0x9F0F, 0x55AF,
+ 0x9F10, 0x9F10, 0x1274, 0x9F11, 0x9F12, 0x55B0, 0x9F13, 0x9F13, 0x071D,
+ 0x9F14, 0x9F14, 0x55B2, 0x9F15, 0x9F15, 0x2673, 0x9F16, 0x9F16, 0x55B3,
+ 0x9F17, 0x9F17, 0x1271, 0x9F18, 0x9F18, 0x55B4, 0x9F19, 0x9F19, 0x13DF,
+ 0x9F1A, 0x9F1F, 0x55B5, 0x9F20, 0x9F20, 0x0D8A, 0x9F21, 0x9F21, 0x55BB,
+ 0x9F22, 0x9F22, 0x1E0F, 0x9F23, 0x9F2B, 0x55BC, 0x9F2C, 0x9F2C, 0x1E10,
+ 0x9F2D, 0x9F2E, 0x55C5, 0x9F2F, 0x9F2F, 0x1E11, 0x9F30, 0x9F36, 0x55C7,
+ 0x9F37, 0x9F37, 0x1E13, 0x9F38, 0x9F38, 0x55CE, 0x9F39, 0x9F39, 0x1E12,
+ 0x9F3A, 0x9F3A, 0x55CF, 0x9F3B, 0x9F3B, 0x0430, 0x9F3C, 0x9F3C, 0x55D0,
+ 0x9F3D, 0x9F3E, 0x1E14, 0x9F3F, 0x9F43, 0x55D1, 0x9F44, 0x9F44, 0x1E16,
+ 0x9F45, 0x9F49, 0x55D6, 0x9F4A, 0x9F4A, 0x20C6, 0x9F4B, 0x9F4B, 0x226B,
+ 0x9F4C, 0x9F4E, 0x55DB, 0x9F4F, 0x9F4F, 0x24D3, 0x9F50, 0x9F50, 0x0C0A,
+ 0x9F51, 0x9F51, 0x19C2, 0x9F52, 0x9F52, 0x1E86, 0x9F53, 0x9F53, 0x55DE,
+ 0x9F54, 0x9F54, 0x260F, 0x9F55, 0x9F58, 0x55DF, 0x9F59, 0x9F59, 0x2611,
+ 0x9F5A, 0x9F5B, 0x55E3, 0x9F5C, 0x9F5C, 0x2613, 0x9F5D, 0x9F5E, 0x55E5,
+ 0x9F5F, 0x9F5F, 0x2610, 0x9F60, 0x9F60, 0x2612, 0x9F61, 0x9F61, 0x2030,
+ 0x9F62, 0x9F62, 0x55E7, 0x9F63, 0x9F63, 0x2671, 0x9F64, 0x9F65, 0x55E8,
+ 0x9F66, 0x9F66, 0x2614, 0x9F67, 0x9F69, 0x55EA, 0x9F6A, 0x9F6A, 0x2616,
+ 0x9F6B, 0x9F6B, 0x55ED, 0x9F6C, 0x9F6C, 0x2615, 0x9F6D, 0x9F71, 0x55EE,
+ 0x9F72, 0x9F72, 0x20F2, 0x9F73, 0x9F76, 0x55F3, 0x9F77, 0x9F77, 0x2617,
+ 0x9F78, 0x9F7E, 0x55F7, 0x9F7F, 0x9F7F, 0x0502, 0x9F80, 0x9F80, 0x1D6D,
+ 0x9F81, 0x9F82, 0x55FE, 0x9F83, 0x9F83, 0x1D6E, 0x9F84, 0x9F84, 0x0A2D,
+ 0x9F85, 0x9F8A, 0x1D6F, 0x9F8B, 0x9F8B, 0x0C7E, 0x9F8C, 0x9F8C, 0x1D75,
+ 0x9F8D, 0x9F8D, 0x2037, 0x9F8E, 0x9F8F, 0x5600, 0x9F90, 0x9F90, 0x20B3,
+ 0x9F91, 0x9F93, 0x5602, 0x9F94, 0x9F94, 0x1F22, 0x9F95, 0x9F95, 0x24ED,
+ 0x9F96, 0x9F98, 0x5605, 0x9F99, 0x9F99, 0x0A43, 0x9F9A, 0x9F9A, 0x0701,
+ 0x9F9B, 0x9F9B, 0x1A54, 0x9F9C, 0x9F9C, 0x1F34, 0x9F9D, 0x9F9E, 0x5608,
+ 0x9F9F, 0x9F9F, 0x0743, 0x9FA0, 0x9FA0, 0x12F3, 0x9FA1, 0x9FA5, 0x560A,
+ 0xE816, 0xE818, 0x5620, 0xE81E, 0xE81E, 0x5628, 0xE826, 0xE826, 0x5630,
+ 0xE82B, 0xE82C, 0x5635, 0xE831, 0xE832, 0x563B, 0xE83B, 0xE83B, 0x5645,
+ 0xE843, 0xE843, 0x564D, 0xE854, 0xE855, 0x565E, 0xE864, 0xE864, 0x566E,
+ 0xF92C, 0xF92C, 0x560F, 0xFA0D, 0xFA0F, 0x5610, 0xFA11, 0xFA11, 0x5613,
+ 0xFA13, 0xFA14, 0x5614, 0xFA18, 0xFA18, 0x5616, 0xFA1F, 0xFA21, 0x5617,
+ 0xFA23, 0xFA24, 0x561A, 0xFA27, 0xFA29, 0x561C, 0xFE30, 0xFE30, 0x271D,
+ 0xFE49, 0xFE52, 0x272B, 0xFE54, 0xFE57, 0x2735, 0xFE59, 0xFE66, 0x2739,
+ 0xFE68, 0xFE6B, 0x2747, 0xFF01, 0xFF03, 0x0106, 0xFF04, 0xFF04, 0x00A6,
+ 0xFF05, 0xFF5D, 0x010A, 0xFF5E, 0xFF5E, 0x006A, 0xFFE0, 0xFFE1, 0x00A8,
+ 0xFFE2, 0xFFE2, 0x271E, 0xFFE3, 0xFFE3, 0x0163, 0xFFE4, 0xFFE4, 0x271F,
+ 0xFFE5, 0xFFE5, 0x0109,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/Japan1/83pv-RKSJ-H_1.cpp b/core/src/fpdfapi/fpdf_cmaps/Japan1/83pv-RKSJ-H_1.cpp
index 9399e63115..6a8853735a 100644
--- a/core/src/fpdfapi/fpdf_cmaps/Japan1/83pv-RKSJ-H_1.cpp
+++ b/core/src/fpdfapi/fpdf_cmaps/Japan1/83pv-RKSJ-H_1.cpp
@@ -1,82 +1,82 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-extern const unsigned short g_FXCMAP_83pv_RKSJ_H_1[222 * 3] = {
- 0x0020, 0x007E, 0x0001, 0x0080, 0x0080, 0x0061, 0x00A0, 0x00DF, 0x0146,
- 0x00FD, 0x00FD, 0x0098, 0x00FE, 0x00FE, 0x00E4, 0x00FF, 0x00FF, 0x007C,
- 0x8140, 0x817E, 0x0279, 0x8180, 0x81AC, 0x02B8, 0x81B8, 0x81BF, 0x02E5,
- 0x81C8, 0x81CE, 0x02ED, 0x81DA, 0x81E8, 0x02F4, 0x81F0, 0x81F7, 0x0303,
- 0x81FC, 0x81FC, 0x030B, 0x824F, 0x8258, 0x030C, 0x8260, 0x8279, 0x0316,
- 0x8281, 0x829A, 0x0330, 0x829F, 0x82F1, 0x034A, 0x8340, 0x837E, 0x039D,
- 0x8380, 0x8396, 0x03DC, 0x839F, 0x83B6, 0x03F3, 0x83BF, 0x83D6, 0x040B,
- 0x8440, 0x8460, 0x0423, 0x8470, 0x847E, 0x0444, 0x8480, 0x8491, 0x0453,
- 0x849F, 0x849F, 0x1D37, 0x84A0, 0x84A0, 0x1D39, 0x84A1, 0x84A1, 0x1D43,
- 0x84A2, 0x84A2, 0x1D47, 0x84A3, 0x84A3, 0x1D4F, 0x84A4, 0x84A4, 0x1D4B,
- 0x84A5, 0x84A5, 0x1D53, 0x84A6, 0x84A6, 0x1D63, 0x84A7, 0x84A7, 0x1D5B,
- 0x84A8, 0x84A8, 0x1D6B, 0x84A9, 0x84A9, 0x1D73, 0x84AA, 0x84AA, 0x1D38,
- 0x84AB, 0x84AB, 0x1D3A, 0x84AC, 0x84AC, 0x1D46, 0x84AD, 0x84AD, 0x1D4A,
- 0x84AE, 0x84AE, 0x1D52, 0x84AF, 0x84AF, 0x1D4E, 0x84B0, 0x84B0, 0x1D5A,
- 0x84B1, 0x84B1, 0x1D6A, 0x84B2, 0x84B2, 0x1D62, 0x84B3, 0x84B3, 0x1D72,
- 0x84B4, 0x84B4, 0x1D82, 0x84B5, 0x84B5, 0x1D57, 0x84B6, 0x84B6, 0x1D66,
- 0x84B7, 0x84B7, 0x1D5F, 0x84B8, 0x84B8, 0x1D6E, 0x84B9, 0x84B9, 0x1D76,
- 0x84BA, 0x84BA, 0x1D54, 0x84BB, 0x84BB, 0x1D67, 0x84BC, 0x84BC, 0x1D5C,
- 0x84BD, 0x84BD, 0x1D6F, 0x84BE, 0x84BE, 0x1D79, 0x8540, 0x857E, 0x00E8,
- 0x8580, 0x8580, 0x0186, 0x8581, 0x859E, 0x0128, 0x859F, 0x85DD, 0x0147,
- 0x85DE, 0x85FC, 0x0187, 0x8640, 0x867E, 0x01A6, 0x8680, 0x8691, 0x01E5,
- 0x8692, 0x8692, 0x0127, 0x8693, 0x869E, 0x01F7, 0x86A2, 0x86ED, 0x1D37,
- 0x8740, 0x875D, 0x1D83, 0x875F, 0x8775, 0x1DA1, 0x8780, 0x878F, 0x1DB8,
- 0x8790, 0x8790, 0x02FA, 0x8791, 0x8791, 0x02F9, 0x8792, 0x8792, 0x0301,
- 0x8793, 0x8799, 0x1DC8, 0x879A, 0x879A, 0x0300, 0x879B, 0x879C, 0x1DCF,
- 0x889F, 0x88FC, 0x0465, 0x8940, 0x897E, 0x04C3, 0x8980, 0x89FC, 0x0502,
- 0x8A40, 0x8A7E, 0x057F, 0x8A80, 0x8AFC, 0x05BE, 0x8B40, 0x8B7E, 0x063B,
- 0x8B80, 0x8BFC, 0x067A, 0x8C40, 0x8C7E, 0x06F7, 0x8C80, 0x8CFC, 0x0736,
- 0x8D40, 0x8D7E, 0x07B3, 0x8D80, 0x8DFC, 0x07F2, 0x8E40, 0x8E7E, 0x086F,
- 0x8E80, 0x8EFC, 0x08AE, 0x8F40, 0x8F7E, 0x092B, 0x8F80, 0x8FFC, 0x096A,
- 0x9040, 0x907E, 0x09E7, 0x9080, 0x90FC, 0x0A26, 0x9140, 0x917E, 0x0AA3,
- 0x9180, 0x91FC, 0x0AE2, 0x9240, 0x927E, 0x0B5F, 0x9280, 0x92FC, 0x0B9E,
- 0x9340, 0x937E, 0x0C1B, 0x9380, 0x93FC, 0x0C5A, 0x9440, 0x947E, 0x0CD7,
- 0x9480, 0x94FC, 0x0D16, 0x9540, 0x957E, 0x0D93, 0x9580, 0x95FC, 0x0DD2,
- 0x9640, 0x967E, 0x0E4F, 0x9680, 0x96FC, 0x0E8E, 0x9740, 0x977E, 0x0F0B,
- 0x9780, 0x97FC, 0x0F4A, 0x9840, 0x9872, 0x0FC7, 0x989F, 0x98FC, 0x0FFA,
- 0x9940, 0x997E, 0x1058, 0x9980, 0x99FC, 0x1097, 0x9A40, 0x9A7E, 0x1114,
- 0x9A80, 0x9AFC, 0x1153, 0x9B40, 0x9B7E, 0x11D0, 0x9B80, 0x9BFC, 0x120F,
- 0x9C40, 0x9C7E, 0x128C, 0x9C80, 0x9CFC, 0x12CB, 0x9D40, 0x9D7E, 0x1348,
- 0x9D80, 0x9DFC, 0x1387, 0x9E40, 0x9E7E, 0x1404, 0x9E80, 0x9EFC, 0x1443,
- 0x9F40, 0x9F7E, 0x14C0, 0x9F80, 0x9FFC, 0x14FF, 0xE040, 0xE07E, 0x157C,
- 0xE080, 0xE0FC, 0x15BB, 0xE140, 0xE17E, 0x1638, 0xE180, 0xE1FC, 0x1677,
- 0xE240, 0xE27E, 0x16F4, 0xE280, 0xE2FC, 0x1733, 0xE340, 0xE37E, 0x17B0,
- 0xE380, 0xE3FC, 0x17EF, 0xE440, 0xE47E, 0x186C, 0xE480, 0xE4FC, 0x18AB,
- 0xE540, 0xE57E, 0x1928, 0xE580, 0xE5FC, 0x1967, 0xE640, 0xE67E, 0x19E4,
- 0xE680, 0xE6FC, 0x1A23, 0xE740, 0xE77E, 0x1AA0, 0xE780, 0xE7FC, 0x1ADF,
- 0xE840, 0xE87E, 0x1B5C, 0xE880, 0xE8FC, 0x1B9B, 0xE940, 0xE97E, 0x1C18,
- 0xE980, 0xE9FC, 0x1C57, 0xEA40, 0xEA7E, 0x1CD4, 0xEA80, 0xEAA2, 0x1D13,
- 0xEAA3, 0xEAA4, 0x205C, 0xEB40, 0xEB40, 0x0279, 0xEB41, 0xEB42, 0x1ECF,
- 0xEB43, 0xEB4F, 0x027C, 0xEB50, 0xEB51, 0x1ED1, 0xEB52, 0xEB5A, 0x028B,
- 0xEB5B, 0xEB5D, 0x1ED3, 0xEB5E, 0xEB5F, 0x0297, 0xEB60, 0xEB64, 0x1ED6,
- 0xEB65, 0xEB68, 0x029E, 0xEB69, 0xEB7A, 0x1EDB, 0xEB7B, 0xEB7E, 0x02B4,
- 0xEB80, 0xEB80, 0x02B8, 0xEB81, 0xEB81, 0x1EED, 0xEB82, 0xEBAC, 0x02BA,
- 0xEBB8, 0xEBBF, 0x02E5, 0xEBC8, 0xEBCE, 0x02ED, 0xEBDA, 0xEBE8, 0x02F4,
- 0xEBF0, 0xEBF7, 0x0303, 0xEBFC, 0xEBFC, 0x030B, 0xEC4F, 0xEC58, 0x030C,
- 0xEC60, 0xEC79, 0x0316, 0xEC81, 0xEC9A, 0x0330, 0xEC9F, 0xEC9F, 0x1EEE,
- 0xECA0, 0xECA0, 0x034B, 0xECA1, 0xECA1, 0x1EEF, 0xECA2, 0xECA2, 0x034D,
- 0xECA3, 0xECA3, 0x1EF0, 0xECA4, 0xECA4, 0x034F, 0xECA5, 0xECA5, 0x1EF1,
- 0xECA6, 0xECA6, 0x0351, 0xECA7, 0xECA7, 0x1EF2, 0xECA8, 0xECC0, 0x0353,
- 0xECC1, 0xECC1, 0x1EF3, 0xECC2, 0xECE0, 0x036D, 0xECE1, 0xECE1, 0x1EF4,
- 0xECE2, 0xECE2, 0x038D, 0xECE3, 0xECE3, 0x1EF5, 0xECE4, 0xECE4, 0x038F,
- 0xECE5, 0xECE5, 0x1EF6, 0xECE6, 0xECEB, 0x0391, 0xECEC, 0xECEC, 0x1EF7,
- 0xECED, 0xECF1, 0x0398, 0xED40, 0xED40, 0x1EF8, 0xED41, 0xED41, 0x039E,
- 0xED42, 0xED42, 0x1EF9, 0xED43, 0xED43, 0x03A0, 0xED44, 0xED44, 0x1EFA,
- 0xED45, 0xED45, 0x03A2, 0xED46, 0xED46, 0x1EFB, 0xED47, 0xED47, 0x03A4,
- 0xED48, 0xED48, 0x1EFC, 0xED49, 0xED61, 0x03A6, 0xED62, 0xED62, 0x1EFD,
- 0xED63, 0xED7E, 0x03C0, 0xED80, 0xED82, 0x03DC, 0xED83, 0xED83, 0x1EFE,
- 0xED84, 0xED84, 0x03E0, 0xED85, 0xED85, 0x1EFF, 0xED86, 0xED86, 0x03E2,
- 0xED87, 0xED87, 0x1F00, 0xED88, 0xED8D, 0x03E4, 0xED8E, 0xED8E, 0x1F01,
- 0xED8F, 0xED94, 0x03EB, 0xED95, 0xED96, 0x1F02, 0xED9F, 0xEDB6, 0x03F3,
- 0xEDBF, 0xEDD6, 0x040B, 0xEE40, 0xEE5D, 0x1D83, 0xEE5F, 0xEE6E, 0x1F04,
- 0xEE6F, 0xEE75, 0x1DB1, 0xEE80, 0xEE81, 0x1F14, 0xEE82, 0xEE8F, 0x1DBA,
- 0xEE90, 0xEE90, 0x02FA, 0xEE91, 0xEE91, 0x02F9, 0xEE92, 0xEE92, 0x0301,
- 0xEE93, 0xEE99, 0x1DC8, 0xEE9A, 0xEE9A, 0x0300, 0xEE9B, 0xEE9C, 0x1DCF,
-};
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_83pv_RKSJ_H_1[222 * 3] = {
+ 0x0020, 0x007E, 0x0001, 0x0080, 0x0080, 0x0061, 0x00A0, 0x00DF, 0x0146,
+ 0x00FD, 0x00FD, 0x0098, 0x00FE, 0x00FE, 0x00E4, 0x00FF, 0x00FF, 0x007C,
+ 0x8140, 0x817E, 0x0279, 0x8180, 0x81AC, 0x02B8, 0x81B8, 0x81BF, 0x02E5,
+ 0x81C8, 0x81CE, 0x02ED, 0x81DA, 0x81E8, 0x02F4, 0x81F0, 0x81F7, 0x0303,
+ 0x81FC, 0x81FC, 0x030B, 0x824F, 0x8258, 0x030C, 0x8260, 0x8279, 0x0316,
+ 0x8281, 0x829A, 0x0330, 0x829F, 0x82F1, 0x034A, 0x8340, 0x837E, 0x039D,
+ 0x8380, 0x8396, 0x03DC, 0x839F, 0x83B6, 0x03F3, 0x83BF, 0x83D6, 0x040B,
+ 0x8440, 0x8460, 0x0423, 0x8470, 0x847E, 0x0444, 0x8480, 0x8491, 0x0453,
+ 0x849F, 0x849F, 0x1D37, 0x84A0, 0x84A0, 0x1D39, 0x84A1, 0x84A1, 0x1D43,
+ 0x84A2, 0x84A2, 0x1D47, 0x84A3, 0x84A3, 0x1D4F, 0x84A4, 0x84A4, 0x1D4B,
+ 0x84A5, 0x84A5, 0x1D53, 0x84A6, 0x84A6, 0x1D63, 0x84A7, 0x84A7, 0x1D5B,
+ 0x84A8, 0x84A8, 0x1D6B, 0x84A9, 0x84A9, 0x1D73, 0x84AA, 0x84AA, 0x1D38,
+ 0x84AB, 0x84AB, 0x1D3A, 0x84AC, 0x84AC, 0x1D46, 0x84AD, 0x84AD, 0x1D4A,
+ 0x84AE, 0x84AE, 0x1D52, 0x84AF, 0x84AF, 0x1D4E, 0x84B0, 0x84B0, 0x1D5A,
+ 0x84B1, 0x84B1, 0x1D6A, 0x84B2, 0x84B2, 0x1D62, 0x84B3, 0x84B3, 0x1D72,
+ 0x84B4, 0x84B4, 0x1D82, 0x84B5, 0x84B5, 0x1D57, 0x84B6, 0x84B6, 0x1D66,
+ 0x84B7, 0x84B7, 0x1D5F, 0x84B8, 0x84B8, 0x1D6E, 0x84B9, 0x84B9, 0x1D76,
+ 0x84BA, 0x84BA, 0x1D54, 0x84BB, 0x84BB, 0x1D67, 0x84BC, 0x84BC, 0x1D5C,
+ 0x84BD, 0x84BD, 0x1D6F, 0x84BE, 0x84BE, 0x1D79, 0x8540, 0x857E, 0x00E8,
+ 0x8580, 0x8580, 0x0186, 0x8581, 0x859E, 0x0128, 0x859F, 0x85DD, 0x0147,
+ 0x85DE, 0x85FC, 0x0187, 0x8640, 0x867E, 0x01A6, 0x8680, 0x8691, 0x01E5,
+ 0x8692, 0x8692, 0x0127, 0x8693, 0x869E, 0x01F7, 0x86A2, 0x86ED, 0x1D37,
+ 0x8740, 0x875D, 0x1D83, 0x875F, 0x8775, 0x1DA1, 0x8780, 0x878F, 0x1DB8,
+ 0x8790, 0x8790, 0x02FA, 0x8791, 0x8791, 0x02F9, 0x8792, 0x8792, 0x0301,
+ 0x8793, 0x8799, 0x1DC8, 0x879A, 0x879A, 0x0300, 0x879B, 0x879C, 0x1DCF,
+ 0x889F, 0x88FC, 0x0465, 0x8940, 0x897E, 0x04C3, 0x8980, 0x89FC, 0x0502,
+ 0x8A40, 0x8A7E, 0x057F, 0x8A80, 0x8AFC, 0x05BE, 0x8B40, 0x8B7E, 0x063B,
+ 0x8B80, 0x8BFC, 0x067A, 0x8C40, 0x8C7E, 0x06F7, 0x8C80, 0x8CFC, 0x0736,
+ 0x8D40, 0x8D7E, 0x07B3, 0x8D80, 0x8DFC, 0x07F2, 0x8E40, 0x8E7E, 0x086F,
+ 0x8E80, 0x8EFC, 0x08AE, 0x8F40, 0x8F7E, 0x092B, 0x8F80, 0x8FFC, 0x096A,
+ 0x9040, 0x907E, 0x09E7, 0x9080, 0x90FC, 0x0A26, 0x9140, 0x917E, 0x0AA3,
+ 0x9180, 0x91FC, 0x0AE2, 0x9240, 0x927E, 0x0B5F, 0x9280, 0x92FC, 0x0B9E,
+ 0x9340, 0x937E, 0x0C1B, 0x9380, 0x93FC, 0x0C5A, 0x9440, 0x947E, 0x0CD7,
+ 0x9480, 0x94FC, 0x0D16, 0x9540, 0x957E, 0x0D93, 0x9580, 0x95FC, 0x0DD2,
+ 0x9640, 0x967E, 0x0E4F, 0x9680, 0x96FC, 0x0E8E, 0x9740, 0x977E, 0x0F0B,
+ 0x9780, 0x97FC, 0x0F4A, 0x9840, 0x9872, 0x0FC7, 0x989F, 0x98FC, 0x0FFA,
+ 0x9940, 0x997E, 0x1058, 0x9980, 0x99FC, 0x1097, 0x9A40, 0x9A7E, 0x1114,
+ 0x9A80, 0x9AFC, 0x1153, 0x9B40, 0x9B7E, 0x11D0, 0x9B80, 0x9BFC, 0x120F,
+ 0x9C40, 0x9C7E, 0x128C, 0x9C80, 0x9CFC, 0x12CB, 0x9D40, 0x9D7E, 0x1348,
+ 0x9D80, 0x9DFC, 0x1387, 0x9E40, 0x9E7E, 0x1404, 0x9E80, 0x9EFC, 0x1443,
+ 0x9F40, 0x9F7E, 0x14C0, 0x9F80, 0x9FFC, 0x14FF, 0xE040, 0xE07E, 0x157C,
+ 0xE080, 0xE0FC, 0x15BB, 0xE140, 0xE17E, 0x1638, 0xE180, 0xE1FC, 0x1677,
+ 0xE240, 0xE27E, 0x16F4, 0xE280, 0xE2FC, 0x1733, 0xE340, 0xE37E, 0x17B0,
+ 0xE380, 0xE3FC, 0x17EF, 0xE440, 0xE47E, 0x186C, 0xE480, 0xE4FC, 0x18AB,
+ 0xE540, 0xE57E, 0x1928, 0xE580, 0xE5FC, 0x1967, 0xE640, 0xE67E, 0x19E4,
+ 0xE680, 0xE6FC, 0x1A23, 0xE740, 0xE77E, 0x1AA0, 0xE780, 0xE7FC, 0x1ADF,
+ 0xE840, 0xE87E, 0x1B5C, 0xE880, 0xE8FC, 0x1B9B, 0xE940, 0xE97E, 0x1C18,
+ 0xE980, 0xE9FC, 0x1C57, 0xEA40, 0xEA7E, 0x1CD4, 0xEA80, 0xEAA2, 0x1D13,
+ 0xEAA3, 0xEAA4, 0x205C, 0xEB40, 0xEB40, 0x0279, 0xEB41, 0xEB42, 0x1ECF,
+ 0xEB43, 0xEB4F, 0x027C, 0xEB50, 0xEB51, 0x1ED1, 0xEB52, 0xEB5A, 0x028B,
+ 0xEB5B, 0xEB5D, 0x1ED3, 0xEB5E, 0xEB5F, 0x0297, 0xEB60, 0xEB64, 0x1ED6,
+ 0xEB65, 0xEB68, 0x029E, 0xEB69, 0xEB7A, 0x1EDB, 0xEB7B, 0xEB7E, 0x02B4,
+ 0xEB80, 0xEB80, 0x02B8, 0xEB81, 0xEB81, 0x1EED, 0xEB82, 0xEBAC, 0x02BA,
+ 0xEBB8, 0xEBBF, 0x02E5, 0xEBC8, 0xEBCE, 0x02ED, 0xEBDA, 0xEBE8, 0x02F4,
+ 0xEBF0, 0xEBF7, 0x0303, 0xEBFC, 0xEBFC, 0x030B, 0xEC4F, 0xEC58, 0x030C,
+ 0xEC60, 0xEC79, 0x0316, 0xEC81, 0xEC9A, 0x0330, 0xEC9F, 0xEC9F, 0x1EEE,
+ 0xECA0, 0xECA0, 0x034B, 0xECA1, 0xECA1, 0x1EEF, 0xECA2, 0xECA2, 0x034D,
+ 0xECA3, 0xECA3, 0x1EF0, 0xECA4, 0xECA4, 0x034F, 0xECA5, 0xECA5, 0x1EF1,
+ 0xECA6, 0xECA6, 0x0351, 0xECA7, 0xECA7, 0x1EF2, 0xECA8, 0xECC0, 0x0353,
+ 0xECC1, 0xECC1, 0x1EF3, 0xECC2, 0xECE0, 0x036D, 0xECE1, 0xECE1, 0x1EF4,
+ 0xECE2, 0xECE2, 0x038D, 0xECE3, 0xECE3, 0x1EF5, 0xECE4, 0xECE4, 0x038F,
+ 0xECE5, 0xECE5, 0x1EF6, 0xECE6, 0xECEB, 0x0391, 0xECEC, 0xECEC, 0x1EF7,
+ 0xECED, 0xECF1, 0x0398, 0xED40, 0xED40, 0x1EF8, 0xED41, 0xED41, 0x039E,
+ 0xED42, 0xED42, 0x1EF9, 0xED43, 0xED43, 0x03A0, 0xED44, 0xED44, 0x1EFA,
+ 0xED45, 0xED45, 0x03A2, 0xED46, 0xED46, 0x1EFB, 0xED47, 0xED47, 0x03A4,
+ 0xED48, 0xED48, 0x1EFC, 0xED49, 0xED61, 0x03A6, 0xED62, 0xED62, 0x1EFD,
+ 0xED63, 0xED7E, 0x03C0, 0xED80, 0xED82, 0x03DC, 0xED83, 0xED83, 0x1EFE,
+ 0xED84, 0xED84, 0x03E0, 0xED85, 0xED85, 0x1EFF, 0xED86, 0xED86, 0x03E2,
+ 0xED87, 0xED87, 0x1F00, 0xED88, 0xED8D, 0x03E4, 0xED8E, 0xED8E, 0x1F01,
+ 0xED8F, 0xED94, 0x03EB, 0xED95, 0xED96, 0x1F02, 0xED9F, 0xEDB6, 0x03F3,
+ 0xEDBF, 0xEDD6, 0x040B, 0xEE40, 0xEE5D, 0x1D83, 0xEE5F, 0xEE6E, 0x1F04,
+ 0xEE6F, 0xEE75, 0x1DB1, 0xEE80, 0xEE81, 0x1F14, 0xEE82, 0xEE8F, 0x1DBA,
+ 0xEE90, 0xEE90, 0x02FA, 0xEE91, 0xEE91, 0x02F9, 0xEE92, 0xEE92, 0x0301,
+ 0xEE93, 0xEE99, 0x1DC8, 0xEE9A, 0xEE9A, 0x0300, 0xEE9B, 0xEE9C, 0x1DCF,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/Japan1/90ms-RKSJ-H_2.cpp b/core/src/fpdfapi/fpdf_cmaps/Japan1/90ms-RKSJ-H_2.cpp
index f41ca62b92..1bc31d8794 100644
--- a/core/src/fpdfapi/fpdf_cmaps/Japan1/90ms-RKSJ-H_2.cpp
+++ b/core/src/fpdfapi/fpdf_cmaps/Japan1/90ms-RKSJ-H_2.cpp
@@ -1,65 +1,65 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-extern const unsigned short g_FXCMAP_90ms_RKSJ_H_2[171 * 3] = {
- 0x0020, 0x007D, 0x00E7, 0x007E, 0x007E, 0x0277, 0x00A0, 0x00DF, 0x0146,
- 0x8140, 0x817E, 0x0279, 0x8180, 0x81AC, 0x02B8, 0x81B8, 0x81BF, 0x02E5,
- 0x81C8, 0x81CE, 0x02ED, 0x81DA, 0x81E8, 0x02F4, 0x81F0, 0x81F7, 0x0303,
- 0x81FC, 0x81FC, 0x030B, 0x824F, 0x8258, 0x030C, 0x8260, 0x8279, 0x0316,
- 0x8281, 0x829A, 0x0330, 0x829F, 0x82F1, 0x034A, 0x8340, 0x837E, 0x039D,
- 0x8380, 0x8396, 0x03DC, 0x839F, 0x83B6, 0x03F3, 0x83BF, 0x83D6, 0x040B,
- 0x8440, 0x8460, 0x0423, 0x8470, 0x847E, 0x0444, 0x8480, 0x8491, 0x0453,
- 0x849F, 0x849F, 0x1D37, 0x84A0, 0x84A0, 0x1D39, 0x84A1, 0x84A1, 0x1D43,
- 0x84A2, 0x84A2, 0x1D47, 0x84A3, 0x84A3, 0x1D4F, 0x84A4, 0x84A4, 0x1D4B,
- 0x84A5, 0x84A5, 0x1D53, 0x84A6, 0x84A6, 0x1D63, 0x84A7, 0x84A7, 0x1D5B,
- 0x84A8, 0x84A8, 0x1D6B, 0x84A9, 0x84A9, 0x1D73, 0x84AA, 0x84AA, 0x1D38,
- 0x84AB, 0x84AB, 0x1D3A, 0x84AC, 0x84AC, 0x1D46, 0x84AD, 0x84AD, 0x1D4A,
- 0x84AE, 0x84AE, 0x1D52, 0x84AF, 0x84AF, 0x1D4E, 0x84B0, 0x84B0, 0x1D5A,
- 0x84B1, 0x84B1, 0x1D6A, 0x84B2, 0x84B2, 0x1D62, 0x84B3, 0x84B3, 0x1D72,
- 0x84B4, 0x84B4, 0x1D82, 0x84B5, 0x84B5, 0x1D57, 0x84B6, 0x84B6, 0x1D66,
- 0x84B7, 0x84B7, 0x1D5F, 0x84B8, 0x84B8, 0x1D6E, 0x84B9, 0x84B9, 0x1D76,
- 0x84BA, 0x84BA, 0x1D54, 0x84BB, 0x84BB, 0x1D67, 0x84BC, 0x84BC, 0x1D5C,
- 0x84BD, 0x84BD, 0x1D6F, 0x84BE, 0x84BE, 0x1D79, 0x8740, 0x875D, 0x1D83,
- 0x875F, 0x8760, 0x1DA1, 0x8761, 0x8761, 0x1F66, 0x8762, 0x8762, 0x1DA4,
- 0x8763, 0x8763, 0x1F68, 0x8764, 0x8764, 0x1DA6, 0x8765, 0x8765, 0x1F6A,
- 0x8766, 0x8767, 0x1DA8, 0x8768, 0x8768, 0x1F6C, 0x8769, 0x876A, 0x1DAB,
- 0x876B, 0x876B, 0x1F6B, 0x876C, 0x876D, 0x1DAE, 0x876E, 0x876E, 0x1F6F,
- 0x876F, 0x8775, 0x1DB1, 0x877E, 0x877E, 0x2083, 0x8780, 0x8783, 0x1DB8,
- 0x8784, 0x8784, 0x1F77, 0x8785, 0x878F, 0x1DBD, 0x8790, 0x8790, 0x02FA,
- 0x8791, 0x8791, 0x02F9, 0x8792, 0x8792, 0x0301, 0x8793, 0x8799, 0x1DC8,
- 0x879A, 0x879A, 0x0300, 0x879B, 0x879C, 0x1DCF, 0x889F, 0x88FC, 0x0465,
- 0x8940, 0x897E, 0x04C3, 0x8980, 0x89FC, 0x0502, 0x8A40, 0x8A7E, 0x057F,
- 0x8A80, 0x8AFC, 0x05BE, 0x8B40, 0x8B7E, 0x063B, 0x8B80, 0x8BFC, 0x067A,
- 0x8C40, 0x8C7E, 0x06F7, 0x8C80, 0x8CFC, 0x0736, 0x8D40, 0x8D7E, 0x07B3,
- 0x8D80, 0x8DFC, 0x07F2, 0x8E40, 0x8E7E, 0x086F, 0x8E80, 0x8EFC, 0x08AE,
- 0x8F40, 0x8F7E, 0x092B, 0x8F80, 0x8FFC, 0x096A, 0x9040, 0x907E, 0x09E7,
- 0x9080, 0x90FC, 0x0A26, 0x9140, 0x917E, 0x0AA3, 0x9180, 0x91FC, 0x0AE2,
- 0x9240, 0x927E, 0x0B5F, 0x9280, 0x92FC, 0x0B9E, 0x9340, 0x937E, 0x0C1B,
- 0x9380, 0x93FC, 0x0C5A, 0x9440, 0x947E, 0x0CD7, 0x9480, 0x94FC, 0x0D16,
- 0x9540, 0x957E, 0x0D93, 0x9580, 0x95FC, 0x0DD2, 0x9640, 0x967E, 0x0E4F,
- 0x9680, 0x96FC, 0x0E8E, 0x9740, 0x977E, 0x0F0B, 0x9780, 0x97FC, 0x0F4A,
- 0x9840, 0x9872, 0x0FC7, 0x989F, 0x98FC, 0x0FFA, 0x9940, 0x997E, 0x1058,
- 0x9980, 0x99FC, 0x1097, 0x9A40, 0x9A7E, 0x1114, 0x9A80, 0x9AFC, 0x1153,
- 0x9B40, 0x9B7E, 0x11D0, 0x9B80, 0x9BFC, 0x120F, 0x9C40, 0x9C7E, 0x128C,
- 0x9C80, 0x9CFC, 0x12CB, 0x9D40, 0x9D7E, 0x1348, 0x9D80, 0x9DFC, 0x1387,
- 0x9E40, 0x9E7E, 0x1404, 0x9E80, 0x9EFC, 0x1443, 0x9F40, 0x9F7E, 0x14C0,
- 0x9F80, 0x9FFC, 0x14FF, 0xE040, 0xE07E, 0x157C, 0xE080, 0xE0FC, 0x15BB,
- 0xE140, 0xE17E, 0x1638, 0xE180, 0xE1FC, 0x1677, 0xE240, 0xE27E, 0x16F4,
- 0xE280, 0xE2FC, 0x1733, 0xE340, 0xE37E, 0x17B0, 0xE380, 0xE3FC, 0x17EF,
- 0xE440, 0xE47E, 0x186C, 0xE480, 0xE4FC, 0x18AB, 0xE540, 0xE57E, 0x1928,
- 0xE580, 0xE5FC, 0x1967, 0xE640, 0xE67E, 0x19E4, 0xE680, 0xE6FC, 0x1A23,
- 0xE740, 0xE77E, 0x1AA0, 0xE780, 0xE7FC, 0x1ADF, 0xE840, 0xE87E, 0x1B5C,
- 0xE880, 0xE8FC, 0x1B9B, 0xE940, 0xE97E, 0x1C18, 0xE980, 0xE9FC, 0x1C57,
- 0xEA40, 0xEA7E, 0x1CD4, 0xEA80, 0xEAA2, 0x1D13, 0xEAA3, 0xEAA4, 0x205C,
- 0xED40, 0xED7E, 0x20A7, 0xED80, 0xEDB3, 0x20E6, 0xEDB4, 0xEDB4, 0x07C9,
- 0xEDB5, 0xEDFC, 0x211A, 0xEE40, 0xEE7E, 0x2162, 0xEE80, 0xEEEC, 0x21A1,
- 0xEEEF, 0xEEF8, 0x1F9C, 0xEEF9, 0xEEF9, 0x02EF, 0xEEFA, 0xEEFC, 0x1F45,
- 0xFA40, 0xFA49, 0x1F9C, 0xFA4A, 0xFA53, 0x1D97, 0xFA54, 0xFA54, 0x02EF,
- 0xFA55, 0xFA57, 0x1F45, 0xFA58, 0xFA58, 0x1DC2, 0xFA59, 0xFA59, 0x1DBA,
- 0xFA5A, 0xFA5A, 0x1F77, 0xFA5B, 0xFA5B, 0x0300, 0xFA5C, 0xFA7E, 0x20A7,
- 0xFA80, 0xFACF, 0x20CA, 0xFAD0, 0xFAD0, 0x07C9, 0xFAD1, 0xFAFC, 0x211A,
- 0xFB40, 0xFB7E, 0x2146, 0xFB80, 0xFBFC, 0x2185, 0xFC40, 0xFC4B, 0x2202,
-};
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_90ms_RKSJ_H_2[171 * 3] = {
+ 0x0020, 0x007D, 0x00E7, 0x007E, 0x007E, 0x0277, 0x00A0, 0x00DF, 0x0146,
+ 0x8140, 0x817E, 0x0279, 0x8180, 0x81AC, 0x02B8, 0x81B8, 0x81BF, 0x02E5,
+ 0x81C8, 0x81CE, 0x02ED, 0x81DA, 0x81E8, 0x02F4, 0x81F0, 0x81F7, 0x0303,
+ 0x81FC, 0x81FC, 0x030B, 0x824F, 0x8258, 0x030C, 0x8260, 0x8279, 0x0316,
+ 0x8281, 0x829A, 0x0330, 0x829F, 0x82F1, 0x034A, 0x8340, 0x837E, 0x039D,
+ 0x8380, 0x8396, 0x03DC, 0x839F, 0x83B6, 0x03F3, 0x83BF, 0x83D6, 0x040B,
+ 0x8440, 0x8460, 0x0423, 0x8470, 0x847E, 0x0444, 0x8480, 0x8491, 0x0453,
+ 0x849F, 0x849F, 0x1D37, 0x84A0, 0x84A0, 0x1D39, 0x84A1, 0x84A1, 0x1D43,
+ 0x84A2, 0x84A2, 0x1D47, 0x84A3, 0x84A3, 0x1D4F, 0x84A4, 0x84A4, 0x1D4B,
+ 0x84A5, 0x84A5, 0x1D53, 0x84A6, 0x84A6, 0x1D63, 0x84A7, 0x84A7, 0x1D5B,
+ 0x84A8, 0x84A8, 0x1D6B, 0x84A9, 0x84A9, 0x1D73, 0x84AA, 0x84AA, 0x1D38,
+ 0x84AB, 0x84AB, 0x1D3A, 0x84AC, 0x84AC, 0x1D46, 0x84AD, 0x84AD, 0x1D4A,
+ 0x84AE, 0x84AE, 0x1D52, 0x84AF, 0x84AF, 0x1D4E, 0x84B0, 0x84B0, 0x1D5A,
+ 0x84B1, 0x84B1, 0x1D6A, 0x84B2, 0x84B2, 0x1D62, 0x84B3, 0x84B3, 0x1D72,
+ 0x84B4, 0x84B4, 0x1D82, 0x84B5, 0x84B5, 0x1D57, 0x84B6, 0x84B6, 0x1D66,
+ 0x84B7, 0x84B7, 0x1D5F, 0x84B8, 0x84B8, 0x1D6E, 0x84B9, 0x84B9, 0x1D76,
+ 0x84BA, 0x84BA, 0x1D54, 0x84BB, 0x84BB, 0x1D67, 0x84BC, 0x84BC, 0x1D5C,
+ 0x84BD, 0x84BD, 0x1D6F, 0x84BE, 0x84BE, 0x1D79, 0x8740, 0x875D, 0x1D83,
+ 0x875F, 0x8760, 0x1DA1, 0x8761, 0x8761, 0x1F66, 0x8762, 0x8762, 0x1DA4,
+ 0x8763, 0x8763, 0x1F68, 0x8764, 0x8764, 0x1DA6, 0x8765, 0x8765, 0x1F6A,
+ 0x8766, 0x8767, 0x1DA8, 0x8768, 0x8768, 0x1F6C, 0x8769, 0x876A, 0x1DAB,
+ 0x876B, 0x876B, 0x1F6B, 0x876C, 0x876D, 0x1DAE, 0x876E, 0x876E, 0x1F6F,
+ 0x876F, 0x8775, 0x1DB1, 0x877E, 0x877E, 0x2083, 0x8780, 0x8783, 0x1DB8,
+ 0x8784, 0x8784, 0x1F77, 0x8785, 0x878F, 0x1DBD, 0x8790, 0x8790, 0x02FA,
+ 0x8791, 0x8791, 0x02F9, 0x8792, 0x8792, 0x0301, 0x8793, 0x8799, 0x1DC8,
+ 0x879A, 0x879A, 0x0300, 0x879B, 0x879C, 0x1DCF, 0x889F, 0x88FC, 0x0465,
+ 0x8940, 0x897E, 0x04C3, 0x8980, 0x89FC, 0x0502, 0x8A40, 0x8A7E, 0x057F,
+ 0x8A80, 0x8AFC, 0x05BE, 0x8B40, 0x8B7E, 0x063B, 0x8B80, 0x8BFC, 0x067A,
+ 0x8C40, 0x8C7E, 0x06F7, 0x8C80, 0x8CFC, 0x0736, 0x8D40, 0x8D7E, 0x07B3,
+ 0x8D80, 0x8DFC, 0x07F2, 0x8E40, 0x8E7E, 0x086F, 0x8E80, 0x8EFC, 0x08AE,
+ 0x8F40, 0x8F7E, 0x092B, 0x8F80, 0x8FFC, 0x096A, 0x9040, 0x907E, 0x09E7,
+ 0x9080, 0x90FC, 0x0A26, 0x9140, 0x917E, 0x0AA3, 0x9180, 0x91FC, 0x0AE2,
+ 0x9240, 0x927E, 0x0B5F, 0x9280, 0x92FC, 0x0B9E, 0x9340, 0x937E, 0x0C1B,
+ 0x9380, 0x93FC, 0x0C5A, 0x9440, 0x947E, 0x0CD7, 0x9480, 0x94FC, 0x0D16,
+ 0x9540, 0x957E, 0x0D93, 0x9580, 0x95FC, 0x0DD2, 0x9640, 0x967E, 0x0E4F,
+ 0x9680, 0x96FC, 0x0E8E, 0x9740, 0x977E, 0x0F0B, 0x9780, 0x97FC, 0x0F4A,
+ 0x9840, 0x9872, 0x0FC7, 0x989F, 0x98FC, 0x0FFA, 0x9940, 0x997E, 0x1058,
+ 0x9980, 0x99FC, 0x1097, 0x9A40, 0x9A7E, 0x1114, 0x9A80, 0x9AFC, 0x1153,
+ 0x9B40, 0x9B7E, 0x11D0, 0x9B80, 0x9BFC, 0x120F, 0x9C40, 0x9C7E, 0x128C,
+ 0x9C80, 0x9CFC, 0x12CB, 0x9D40, 0x9D7E, 0x1348, 0x9D80, 0x9DFC, 0x1387,
+ 0x9E40, 0x9E7E, 0x1404, 0x9E80, 0x9EFC, 0x1443, 0x9F40, 0x9F7E, 0x14C0,
+ 0x9F80, 0x9FFC, 0x14FF, 0xE040, 0xE07E, 0x157C, 0xE080, 0xE0FC, 0x15BB,
+ 0xE140, 0xE17E, 0x1638, 0xE180, 0xE1FC, 0x1677, 0xE240, 0xE27E, 0x16F4,
+ 0xE280, 0xE2FC, 0x1733, 0xE340, 0xE37E, 0x17B0, 0xE380, 0xE3FC, 0x17EF,
+ 0xE440, 0xE47E, 0x186C, 0xE480, 0xE4FC, 0x18AB, 0xE540, 0xE57E, 0x1928,
+ 0xE580, 0xE5FC, 0x1967, 0xE640, 0xE67E, 0x19E4, 0xE680, 0xE6FC, 0x1A23,
+ 0xE740, 0xE77E, 0x1AA0, 0xE780, 0xE7FC, 0x1ADF, 0xE840, 0xE87E, 0x1B5C,
+ 0xE880, 0xE8FC, 0x1B9B, 0xE940, 0xE97E, 0x1C18, 0xE980, 0xE9FC, 0x1C57,
+ 0xEA40, 0xEA7E, 0x1CD4, 0xEA80, 0xEAA2, 0x1D13, 0xEAA3, 0xEAA4, 0x205C,
+ 0xED40, 0xED7E, 0x20A7, 0xED80, 0xEDB3, 0x20E6, 0xEDB4, 0xEDB4, 0x07C9,
+ 0xEDB5, 0xEDFC, 0x211A, 0xEE40, 0xEE7E, 0x2162, 0xEE80, 0xEEEC, 0x21A1,
+ 0xEEEF, 0xEEF8, 0x1F9C, 0xEEF9, 0xEEF9, 0x02EF, 0xEEFA, 0xEEFC, 0x1F45,
+ 0xFA40, 0xFA49, 0x1F9C, 0xFA4A, 0xFA53, 0x1D97, 0xFA54, 0xFA54, 0x02EF,
+ 0xFA55, 0xFA57, 0x1F45, 0xFA58, 0xFA58, 0x1DC2, 0xFA59, 0xFA59, 0x1DBA,
+ 0xFA5A, 0xFA5A, 0x1F77, 0xFA5B, 0xFA5B, 0x0300, 0xFA5C, 0xFA7E, 0x20A7,
+ 0xFA80, 0xFACF, 0x20CA, 0xFAD0, 0xFAD0, 0x07C9, 0xFAD1, 0xFAFC, 0x211A,
+ 0xFB40, 0xFB7E, 0x2146, 0xFB80, 0xFBFC, 0x2185, 0xFC40, 0xFC4B, 0x2202,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/Japan1/90msp-RKSJ-H_2.cpp b/core/src/fpdfapi/fpdf_cmaps/Japan1/90msp-RKSJ-H_2.cpp
index d0d8c2d0f3..36ecb17a5e 100644
--- a/core/src/fpdfapi/fpdf_cmaps/Japan1/90msp-RKSJ-H_2.cpp
+++ b/core/src/fpdfapi/fpdf_cmaps/Japan1/90msp-RKSJ-H_2.cpp
@@ -1,65 +1,65 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-extern const unsigned short g_FXCMAP_90msp_RKSJ_H_2[170 * 3] = {
- 0x0020, 0x007E, 0x0001, 0x00A0, 0x00DF, 0x0146, 0x8140, 0x817E, 0x0279,
- 0x8180, 0x81AC, 0x02B8, 0x81B8, 0x81BF, 0x02E5, 0x81C8, 0x81CE, 0x02ED,
- 0x81DA, 0x81E8, 0x02F4, 0x81F0, 0x81F7, 0x0303, 0x81FC, 0x81FC, 0x030B,
- 0x824F, 0x8258, 0x030C, 0x8260, 0x8279, 0x0316, 0x8281, 0x829A, 0x0330,
- 0x829F, 0x82F1, 0x034A, 0x8340, 0x837E, 0x039D, 0x8380, 0x8396, 0x03DC,
- 0x839F, 0x83B6, 0x03F3, 0x83BF, 0x83D6, 0x040B, 0x8440, 0x8460, 0x0423,
- 0x8470, 0x847E, 0x0444, 0x8480, 0x8491, 0x0453, 0x849F, 0x849F, 0x1D37,
- 0x84A0, 0x84A0, 0x1D39, 0x84A1, 0x84A1, 0x1D43, 0x84A2, 0x84A2, 0x1D47,
- 0x84A3, 0x84A3, 0x1D4F, 0x84A4, 0x84A4, 0x1D4B, 0x84A5, 0x84A5, 0x1D53,
- 0x84A6, 0x84A6, 0x1D63, 0x84A7, 0x84A7, 0x1D5B, 0x84A8, 0x84A8, 0x1D6B,
- 0x84A9, 0x84A9, 0x1D73, 0x84AA, 0x84AA, 0x1D38, 0x84AB, 0x84AB, 0x1D3A,
- 0x84AC, 0x84AC, 0x1D46, 0x84AD, 0x84AD, 0x1D4A, 0x84AE, 0x84AE, 0x1D52,
- 0x84AF, 0x84AF, 0x1D4E, 0x84B0, 0x84B0, 0x1D5A, 0x84B1, 0x84B1, 0x1D6A,
- 0x84B2, 0x84B2, 0x1D62, 0x84B3, 0x84B3, 0x1D72, 0x84B4, 0x84B4, 0x1D82,
- 0x84B5, 0x84B5, 0x1D57, 0x84B6, 0x84B6, 0x1D66, 0x84B7, 0x84B7, 0x1D5F,
- 0x84B8, 0x84B8, 0x1D6E, 0x84B9, 0x84B9, 0x1D76, 0x84BA, 0x84BA, 0x1D54,
- 0x84BB, 0x84BB, 0x1D67, 0x84BC, 0x84BC, 0x1D5C, 0x84BD, 0x84BD, 0x1D6F,
- 0x84BE, 0x84BE, 0x1D79, 0x8740, 0x875D, 0x1D83, 0x875F, 0x8760, 0x1DA1,
- 0x8761, 0x8761, 0x1F66, 0x8762, 0x8762, 0x1DA4, 0x8763, 0x8763, 0x1F68,
- 0x8764, 0x8764, 0x1DA6, 0x8765, 0x8765, 0x1F6A, 0x8766, 0x8767, 0x1DA8,
- 0x8768, 0x8768, 0x1F6C, 0x8769, 0x876A, 0x1DAB, 0x876B, 0x876B, 0x1F6B,
- 0x876C, 0x876D, 0x1DAE, 0x876E, 0x876E, 0x1F6F, 0x876F, 0x8775, 0x1DB1,
- 0x877E, 0x877E, 0x2083, 0x8780, 0x8783, 0x1DB8, 0x8784, 0x8784, 0x1F77,
- 0x8785, 0x878F, 0x1DBD, 0x8790, 0x8790, 0x02FA, 0x8791, 0x8791, 0x02F9,
- 0x8792, 0x8792, 0x0301, 0x8793, 0x8799, 0x1DC8, 0x879A, 0x879A, 0x0300,
- 0x879B, 0x879C, 0x1DCF, 0x889F, 0x88FC, 0x0465, 0x8940, 0x897E, 0x04C3,
- 0x8980, 0x89FC, 0x0502, 0x8A40, 0x8A7E, 0x057F, 0x8A80, 0x8AFC, 0x05BE,
- 0x8B40, 0x8B7E, 0x063B, 0x8B80, 0x8BFC, 0x067A, 0x8C40, 0x8C7E, 0x06F7,
- 0x8C80, 0x8CFC, 0x0736, 0x8D40, 0x8D7E, 0x07B3, 0x8D80, 0x8DFC, 0x07F2,
- 0x8E40, 0x8E7E, 0x086F, 0x8E80, 0x8EFC, 0x08AE, 0x8F40, 0x8F7E, 0x092B,
- 0x8F80, 0x8FFC, 0x096A, 0x9040, 0x907E, 0x09E7, 0x9080, 0x90FC, 0x0A26,
- 0x9140, 0x917E, 0x0AA3, 0x9180, 0x91FC, 0x0AE2, 0x9240, 0x927E, 0x0B5F,
- 0x9280, 0x92FC, 0x0B9E, 0x9340, 0x937E, 0x0C1B, 0x9380, 0x93FC, 0x0C5A,
- 0x9440, 0x947E, 0x0CD7, 0x9480, 0x94FC, 0x0D16, 0x9540, 0x957E, 0x0D93,
- 0x9580, 0x95FC, 0x0DD2, 0x9640, 0x967E, 0x0E4F, 0x9680, 0x96FC, 0x0E8E,
- 0x9740, 0x977E, 0x0F0B, 0x9780, 0x97FC, 0x0F4A, 0x9840, 0x9872, 0x0FC7,
- 0x989F, 0x98FC, 0x0FFA, 0x9940, 0x997E, 0x1058, 0x9980, 0x99FC, 0x1097,
- 0x9A40, 0x9A7E, 0x1114, 0x9A80, 0x9AFC, 0x1153, 0x9B40, 0x9B7E, 0x11D0,
- 0x9B80, 0x9BFC, 0x120F, 0x9C40, 0x9C7E, 0x128C, 0x9C80, 0x9CFC, 0x12CB,
- 0x9D40, 0x9D7E, 0x1348, 0x9D80, 0x9DFC, 0x1387, 0x9E40, 0x9E7E, 0x1404,
- 0x9E80, 0x9EFC, 0x1443, 0x9F40, 0x9F7E, 0x14C0, 0x9F80, 0x9FFC, 0x14FF,
- 0xE040, 0xE07E, 0x157C, 0xE080, 0xE0FC, 0x15BB, 0xE140, 0xE17E, 0x1638,
- 0xE180, 0xE1FC, 0x1677, 0xE240, 0xE27E, 0x16F4, 0xE280, 0xE2FC, 0x1733,
- 0xE340, 0xE37E, 0x17B0, 0xE380, 0xE3FC, 0x17EF, 0xE440, 0xE47E, 0x186C,
- 0xE480, 0xE4FC, 0x18AB, 0xE540, 0xE57E, 0x1928, 0xE580, 0xE5FC, 0x1967,
- 0xE640, 0xE67E, 0x19E4, 0xE680, 0xE6FC, 0x1A23, 0xE740, 0xE77E, 0x1AA0,
- 0xE780, 0xE7FC, 0x1ADF, 0xE840, 0xE87E, 0x1B5C, 0xE880, 0xE8FC, 0x1B9B,
- 0xE940, 0xE97E, 0x1C18, 0xE980, 0xE9FC, 0x1C57, 0xEA40, 0xEA7E, 0x1CD4,
- 0xEA80, 0xEAA2, 0x1D13, 0xEAA3, 0xEAA4, 0x205C, 0xED40, 0xED7E, 0x20A7,
- 0xED80, 0xEDB3, 0x20E6, 0xEDB4, 0xEDB4, 0x07C9, 0xEDB5, 0xEDFC, 0x211A,
- 0xEE40, 0xEE7E, 0x2162, 0xEE80, 0xEEEC, 0x21A1, 0xEEEF, 0xEEF8, 0x1F9C,
- 0xEEF9, 0xEEF9, 0x02EF, 0xEEFA, 0xEEFC, 0x1F45, 0xFA40, 0xFA49, 0x1F9C,
- 0xFA4A, 0xFA53, 0x1D97, 0xFA54, 0xFA54, 0x02EF, 0xFA55, 0xFA57, 0x1F45,
- 0xFA58, 0xFA58, 0x1DC2, 0xFA59, 0xFA59, 0x1DBA, 0xFA5A, 0xFA5A, 0x1F77,
- 0xFA5B, 0xFA5B, 0x0300, 0xFA5C, 0xFA7E, 0x20A7, 0xFA80, 0xFACF, 0x20CA,
- 0xFAD0, 0xFAD0, 0x07C9, 0xFAD1, 0xFAFC, 0x211A, 0xFB40, 0xFB7E, 0x2146,
- 0xFB80, 0xFBFC, 0x2185, 0xFC40, 0xFC4B, 0x2202,
-};
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_90msp_RKSJ_H_2[170 * 3] = {
+ 0x0020, 0x007E, 0x0001, 0x00A0, 0x00DF, 0x0146, 0x8140, 0x817E, 0x0279,
+ 0x8180, 0x81AC, 0x02B8, 0x81B8, 0x81BF, 0x02E5, 0x81C8, 0x81CE, 0x02ED,
+ 0x81DA, 0x81E8, 0x02F4, 0x81F0, 0x81F7, 0x0303, 0x81FC, 0x81FC, 0x030B,
+ 0x824F, 0x8258, 0x030C, 0x8260, 0x8279, 0x0316, 0x8281, 0x829A, 0x0330,
+ 0x829F, 0x82F1, 0x034A, 0x8340, 0x837E, 0x039D, 0x8380, 0x8396, 0x03DC,
+ 0x839F, 0x83B6, 0x03F3, 0x83BF, 0x83D6, 0x040B, 0x8440, 0x8460, 0x0423,
+ 0x8470, 0x847E, 0x0444, 0x8480, 0x8491, 0x0453, 0x849F, 0x849F, 0x1D37,
+ 0x84A0, 0x84A0, 0x1D39, 0x84A1, 0x84A1, 0x1D43, 0x84A2, 0x84A2, 0x1D47,
+ 0x84A3, 0x84A3, 0x1D4F, 0x84A4, 0x84A4, 0x1D4B, 0x84A5, 0x84A5, 0x1D53,
+ 0x84A6, 0x84A6, 0x1D63, 0x84A7, 0x84A7, 0x1D5B, 0x84A8, 0x84A8, 0x1D6B,
+ 0x84A9, 0x84A9, 0x1D73, 0x84AA, 0x84AA, 0x1D38, 0x84AB, 0x84AB, 0x1D3A,
+ 0x84AC, 0x84AC, 0x1D46, 0x84AD, 0x84AD, 0x1D4A, 0x84AE, 0x84AE, 0x1D52,
+ 0x84AF, 0x84AF, 0x1D4E, 0x84B0, 0x84B0, 0x1D5A, 0x84B1, 0x84B1, 0x1D6A,
+ 0x84B2, 0x84B2, 0x1D62, 0x84B3, 0x84B3, 0x1D72, 0x84B4, 0x84B4, 0x1D82,
+ 0x84B5, 0x84B5, 0x1D57, 0x84B6, 0x84B6, 0x1D66, 0x84B7, 0x84B7, 0x1D5F,
+ 0x84B8, 0x84B8, 0x1D6E, 0x84B9, 0x84B9, 0x1D76, 0x84BA, 0x84BA, 0x1D54,
+ 0x84BB, 0x84BB, 0x1D67, 0x84BC, 0x84BC, 0x1D5C, 0x84BD, 0x84BD, 0x1D6F,
+ 0x84BE, 0x84BE, 0x1D79, 0x8740, 0x875D, 0x1D83, 0x875F, 0x8760, 0x1DA1,
+ 0x8761, 0x8761, 0x1F66, 0x8762, 0x8762, 0x1DA4, 0x8763, 0x8763, 0x1F68,
+ 0x8764, 0x8764, 0x1DA6, 0x8765, 0x8765, 0x1F6A, 0x8766, 0x8767, 0x1DA8,
+ 0x8768, 0x8768, 0x1F6C, 0x8769, 0x876A, 0x1DAB, 0x876B, 0x876B, 0x1F6B,
+ 0x876C, 0x876D, 0x1DAE, 0x876E, 0x876E, 0x1F6F, 0x876F, 0x8775, 0x1DB1,
+ 0x877E, 0x877E, 0x2083, 0x8780, 0x8783, 0x1DB8, 0x8784, 0x8784, 0x1F77,
+ 0x8785, 0x878F, 0x1DBD, 0x8790, 0x8790, 0x02FA, 0x8791, 0x8791, 0x02F9,
+ 0x8792, 0x8792, 0x0301, 0x8793, 0x8799, 0x1DC8, 0x879A, 0x879A, 0x0300,
+ 0x879B, 0x879C, 0x1DCF, 0x889F, 0x88FC, 0x0465, 0x8940, 0x897E, 0x04C3,
+ 0x8980, 0x89FC, 0x0502, 0x8A40, 0x8A7E, 0x057F, 0x8A80, 0x8AFC, 0x05BE,
+ 0x8B40, 0x8B7E, 0x063B, 0x8B80, 0x8BFC, 0x067A, 0x8C40, 0x8C7E, 0x06F7,
+ 0x8C80, 0x8CFC, 0x0736, 0x8D40, 0x8D7E, 0x07B3, 0x8D80, 0x8DFC, 0x07F2,
+ 0x8E40, 0x8E7E, 0x086F, 0x8E80, 0x8EFC, 0x08AE, 0x8F40, 0x8F7E, 0x092B,
+ 0x8F80, 0x8FFC, 0x096A, 0x9040, 0x907E, 0x09E7, 0x9080, 0x90FC, 0x0A26,
+ 0x9140, 0x917E, 0x0AA3, 0x9180, 0x91FC, 0x0AE2, 0x9240, 0x927E, 0x0B5F,
+ 0x9280, 0x92FC, 0x0B9E, 0x9340, 0x937E, 0x0C1B, 0x9380, 0x93FC, 0x0C5A,
+ 0x9440, 0x947E, 0x0CD7, 0x9480, 0x94FC, 0x0D16, 0x9540, 0x957E, 0x0D93,
+ 0x9580, 0x95FC, 0x0DD2, 0x9640, 0x967E, 0x0E4F, 0x9680, 0x96FC, 0x0E8E,
+ 0x9740, 0x977E, 0x0F0B, 0x9780, 0x97FC, 0x0F4A, 0x9840, 0x9872, 0x0FC7,
+ 0x989F, 0x98FC, 0x0FFA, 0x9940, 0x997E, 0x1058, 0x9980, 0x99FC, 0x1097,
+ 0x9A40, 0x9A7E, 0x1114, 0x9A80, 0x9AFC, 0x1153, 0x9B40, 0x9B7E, 0x11D0,
+ 0x9B80, 0x9BFC, 0x120F, 0x9C40, 0x9C7E, 0x128C, 0x9C80, 0x9CFC, 0x12CB,
+ 0x9D40, 0x9D7E, 0x1348, 0x9D80, 0x9DFC, 0x1387, 0x9E40, 0x9E7E, 0x1404,
+ 0x9E80, 0x9EFC, 0x1443, 0x9F40, 0x9F7E, 0x14C0, 0x9F80, 0x9FFC, 0x14FF,
+ 0xE040, 0xE07E, 0x157C, 0xE080, 0xE0FC, 0x15BB, 0xE140, 0xE17E, 0x1638,
+ 0xE180, 0xE1FC, 0x1677, 0xE240, 0xE27E, 0x16F4, 0xE280, 0xE2FC, 0x1733,
+ 0xE340, 0xE37E, 0x17B0, 0xE380, 0xE3FC, 0x17EF, 0xE440, 0xE47E, 0x186C,
+ 0xE480, 0xE4FC, 0x18AB, 0xE540, 0xE57E, 0x1928, 0xE580, 0xE5FC, 0x1967,
+ 0xE640, 0xE67E, 0x19E4, 0xE680, 0xE6FC, 0x1A23, 0xE740, 0xE77E, 0x1AA0,
+ 0xE780, 0xE7FC, 0x1ADF, 0xE840, 0xE87E, 0x1B5C, 0xE880, 0xE8FC, 0x1B9B,
+ 0xE940, 0xE97E, 0x1C18, 0xE980, 0xE9FC, 0x1C57, 0xEA40, 0xEA7E, 0x1CD4,
+ 0xEA80, 0xEAA2, 0x1D13, 0xEAA3, 0xEAA4, 0x205C, 0xED40, 0xED7E, 0x20A7,
+ 0xED80, 0xEDB3, 0x20E6, 0xEDB4, 0xEDB4, 0x07C9, 0xEDB5, 0xEDFC, 0x211A,
+ 0xEE40, 0xEE7E, 0x2162, 0xEE80, 0xEEEC, 0x21A1, 0xEEEF, 0xEEF8, 0x1F9C,
+ 0xEEF9, 0xEEF9, 0x02EF, 0xEEFA, 0xEEFC, 0x1F45, 0xFA40, 0xFA49, 0x1F9C,
+ 0xFA4A, 0xFA53, 0x1D97, 0xFA54, 0xFA54, 0x02EF, 0xFA55, 0xFA57, 0x1F45,
+ 0xFA58, 0xFA58, 0x1DC2, 0xFA59, 0xFA59, 0x1DBA, 0xFA5A, 0xFA5A, 0x1F77,
+ 0xFA5B, 0xFA5B, 0x0300, 0xFA5C, 0xFA7E, 0x20A7, 0xFA80, 0xFACF, 0x20CA,
+ 0xFAD0, 0xFAD0, 0x07C9, 0xFAD1, 0xFAFC, 0x211A, 0xFB40, 0xFB7E, 0x2146,
+ 0xFB80, 0xFBFC, 0x2185, 0xFC40, 0xFC4B, 0x2202,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/Japan1/90pv-RKSJ-H_1.cpp b/core/src/fpdfapi/fpdf_cmaps/Japan1/90pv-RKSJ-H_1.cpp
index 504d4dc3c7..19526bba3b 100644
--- a/core/src/fpdfapi/fpdf_cmaps/Japan1/90pv-RKSJ-H_1.cpp
+++ b/core/src/fpdfapi/fpdf_cmaps/Japan1/90pv-RKSJ-H_1.cpp
@@ -1,96 +1,96 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-extern const unsigned short g_FXCMAP_90pv_RKSJ_H_1[263 * 3] = {
- 0x0020, 0x007E, 0x0001, 0x0080, 0x0080, 0x0061, 0x00A0, 0x00DF, 0x0146,
- 0x00FD, 0x00FD, 0x0098, 0x00FE, 0x00FE, 0x00E4, 0x00FF, 0x00FF, 0x007C,
- 0x8140, 0x817E, 0x0279, 0x8180, 0x81AC, 0x02B8, 0x81B8, 0x81BF, 0x02E5,
- 0x81C8, 0x81CE, 0x02ED, 0x81DA, 0x81E8, 0x02F4, 0x81F0, 0x81F7, 0x0303,
- 0x81FC, 0x81FC, 0x030B, 0x824F, 0x8258, 0x030C, 0x8260, 0x8279, 0x0316,
- 0x8281, 0x829A, 0x0330, 0x829F, 0x82F1, 0x034A, 0x8340, 0x837E, 0x039D,
- 0x8380, 0x8396, 0x03DC, 0x839F, 0x83B6, 0x03F3, 0x83BF, 0x83D6, 0x040B,
- 0x8440, 0x8460, 0x0423, 0x8470, 0x847E, 0x0444, 0x8480, 0x8491, 0x0453,
- 0x849F, 0x849F, 0x1D37, 0x84A0, 0x84A0, 0x1D39, 0x84A1, 0x84A1, 0x1D43,
- 0x84A2, 0x84A2, 0x1D47, 0x84A3, 0x84A3, 0x1D4F, 0x84A4, 0x84A4, 0x1D4B,
- 0x84A5, 0x84A5, 0x1D53, 0x84A6, 0x84A6, 0x1D63, 0x84A7, 0x84A7, 0x1D5B,
- 0x84A8, 0x84A8, 0x1D6B, 0x84A9, 0x84A9, 0x1D73, 0x84AA, 0x84AA, 0x1D38,
- 0x84AB, 0x84AB, 0x1D3A, 0x84AC, 0x84AC, 0x1D46, 0x84AD, 0x84AD, 0x1D4A,
- 0x84AE, 0x84AE, 0x1D52, 0x84AF, 0x84AF, 0x1D4E, 0x84B0, 0x84B0, 0x1D5A,
- 0x84B1, 0x84B1, 0x1D6A, 0x84B2, 0x84B2, 0x1D62, 0x84B3, 0x84B3, 0x1D72,
- 0x84B4, 0x84B4, 0x1D82, 0x84B5, 0x84B5, 0x1D57, 0x84B6, 0x84B6, 0x1D66,
- 0x84B7, 0x84B7, 0x1D5F, 0x84B8, 0x84B8, 0x1D6E, 0x84B9, 0x84B9, 0x1D76,
- 0x84BA, 0x84BA, 0x1D54, 0x84BB, 0x84BB, 0x1D67, 0x84BC, 0x84BC, 0x1D5C,
- 0x84BD, 0x84BD, 0x1D6F, 0x84BE, 0x84BE, 0x1D79, 0x8540, 0x8553, 0x1D83,
- 0x855E, 0x8571, 0x1F87, 0x857C, 0x857E, 0x205E, 0x8580, 0x8585, 0x2061,
- 0x8591, 0x859A, 0x1F7D, 0x859F, 0x85A8, 0x1D97, 0x85A9, 0x85AA, 0x2021,
- 0x85AB, 0x85AD, 0x2067, 0x85B3, 0x85BC, 0x1F9C, 0x85BD, 0x85C1, 0x206A,
- 0x85DB, 0x85F4, 0x1FB0, 0x8640, 0x8640, 0x1DB1, 0x8641, 0x8641, 0x1FFA,
- 0x8642, 0x8642, 0x1DB2, 0x8643, 0x8643, 0x1F54, 0x8644, 0x8644, 0x1F56,
- 0x8645, 0x8645, 0x206F, 0x8646, 0x8646, 0x1DB7, 0x8647, 0x8647, 0x1F57,
- 0x8648, 0x8648, 0x1DB3, 0x8649, 0x8649, 0x1F55, 0x864A, 0x864A, 0x1DB4,
- 0x864B, 0x864B, 0x2070, 0x864C, 0x864D, 0x1DB5, 0x864E, 0x864E, 0x1F65,
- 0x864F, 0x8655, 0x1F58, 0x8656, 0x8656, 0x2071, 0x8657, 0x8657, 0x1F64,
- 0x8658, 0x8659, 0x1F62, 0x865A, 0x865C, 0x1F5F, 0x865D, 0x865D, 0x2072,
- 0x869B, 0x869D, 0x1DBA, 0x869E, 0x869E, 0x2073, 0x869F, 0x869F, 0x1F52,
- 0x86A0, 0x86A1, 0x1F50, 0x86A2, 0x86A2, 0x1F53, 0x86A3, 0x86A3, 0x2013,
- 0x86A4, 0x86A4, 0x2015, 0x86A5, 0x86A5, 0x2014, 0x86A6, 0x86A6, 0x2016,
- 0x86B3, 0x86B3, 0x1F7A, 0x86B4, 0x86B4, 0x1F78, 0x86B5, 0x86B5, 0x2074,
- 0x86C7, 0x86CA, 0x201B, 0x86CB, 0x86CE, 0x2075, 0x86CF, 0x86CF, 0x1F4E,
- 0x86D0, 0x86D0, 0x1F4D, 0x86D1, 0x86D1, 0x1F4C, 0x86D2, 0x86D2, 0x1F4B,
- 0x86D3, 0x86D6, 0x200E, 0x8740, 0x8746, 0x2005, 0x8747, 0x8747, 0x1FD6,
- 0x8748, 0x8748, 0x200C, 0x8749, 0x8749, 0x1FD1, 0x874A, 0x874A, 0x1FCA,
- 0x874B, 0x874B, 0x1DC4, 0x874C, 0x874C, 0x1FD7, 0x874D, 0x874D, 0x1DC2,
- 0x874E, 0x874E, 0x1FD2, 0x874F, 0x874F, 0x1FCD, 0x8750, 0x8750, 0x1DC3,
- 0x8751, 0x8751, 0x1FD5, 0x8752, 0x8752, 0x1FD3, 0x8753, 0x8753, 0x1FCF,
- 0x8754, 0x8754, 0x1FD4, 0x8755, 0x8755, 0x1FD0, 0x8756, 0x8757, 0x1FCB,
- 0x8758, 0x8758, 0x1FCE, 0x8791, 0x8792, 0x207D, 0x8793, 0x8797, 0x1DBD,
- 0x8798, 0x8798, 0x1FDA, 0x8799, 0x8799, 0x1FE5, 0x879A, 0x879A, 0x207F,
- 0x879B, 0x879B, 0x1FDE, 0x879C, 0x879C, 0x1FFF, 0x879D, 0x879D, 0x2080,
- 0x879E, 0x879E, 0x201F, 0x879F, 0x879F, 0x1DA1, 0x87A0, 0x87A0, 0x1F66,
- 0x87A1, 0x87A1, 0x1DA4, 0x87A2, 0x87A2, 0x1DA2, 0x87A3, 0x87A3, 0x1F67,
- 0x87A4, 0x87A4, 0x1FF7, 0x87A5, 0x87A6, 0x2087, 0x87A7, 0x87A7, 0x1F6A,
- 0x87A8, 0x87A8, 0x1DA8, 0x87A9, 0x87AA, 0x1F68, 0x87AB, 0x87AB, 0x1DA6,
- 0x87AC, 0x87AC, 0x1DA9, 0x87AD, 0x87AD, 0x1DAF, 0x87AE, 0x87AE, 0x1F6E,
- 0x87AF, 0x87AF, 0x1F6C, 0x87B0, 0x87B0, 0x1DAB, 0x87B1, 0x87B1, 0x1F6D,
- 0x87B2, 0x87B2, 0x1F6B, 0x87B3, 0x87B3, 0x1DAC, 0x87B4, 0x87B4, 0x1F6F,
- 0x87B5, 0x87B5, 0x1DAE, 0x87BD, 0x87BD, 0x1F70, 0x87BE, 0x87BF, 0x1F73,
- 0x87C0, 0x87C1, 0x1F71, 0x87E5, 0x87E7, 0x1DC5, 0x87E8, 0x87E8, 0x2083,
- 0x87FA, 0x87FA, 0x1F76, 0x87FB, 0x87FC, 0x2081, 0x8840, 0x8840, 0x1DC8,
- 0x8841, 0x8842, 0x1DCD, 0x8854, 0x8855, 0x1DB8, 0x8868, 0x8868, 0x1F16,
- 0x886A, 0x886D, 0x2079, 0x889F, 0x88FC, 0x0465, 0x8940, 0x897E, 0x04C3,
- 0x8980, 0x89FC, 0x0502, 0x8A40, 0x8A7E, 0x057F, 0x8A80, 0x8AFC, 0x05BE,
- 0x8B40, 0x8B7E, 0x063B, 0x8B80, 0x8BFC, 0x067A, 0x8C40, 0x8C7E, 0x06F7,
- 0x8C80, 0x8CFC, 0x0736, 0x8D40, 0x8D7E, 0x07B3, 0x8D80, 0x8DFC, 0x07F2,
- 0x8E40, 0x8E7E, 0x086F, 0x8E80, 0x8EFC, 0x08AE, 0x8F40, 0x8F7E, 0x092B,
- 0x8F80, 0x8FFC, 0x096A, 0x9040, 0x907E, 0x09E7, 0x9080, 0x90FC, 0x0A26,
- 0x9140, 0x917E, 0x0AA3, 0x9180, 0x91FC, 0x0AE2, 0x9240, 0x927E, 0x0B5F,
- 0x9280, 0x92FC, 0x0B9E, 0x9340, 0x937E, 0x0C1B, 0x9380, 0x93FC, 0x0C5A,
- 0x9440, 0x947E, 0x0CD7, 0x9480, 0x94FC, 0x0D16, 0x9540, 0x957E, 0x0D93,
- 0x9580, 0x95FC, 0x0DD2, 0x9640, 0x967E, 0x0E4F, 0x9680, 0x96FC, 0x0E8E,
- 0x9740, 0x977E, 0x0F0B, 0x9780, 0x97FC, 0x0F4A, 0x9840, 0x9872, 0x0FC7,
- 0x989F, 0x98FC, 0x0FFA, 0x9940, 0x997E, 0x1058, 0x9980, 0x99FC, 0x1097,
- 0x9A40, 0x9A7E, 0x1114, 0x9A80, 0x9AFC, 0x1153, 0x9B40, 0x9B7E, 0x11D0,
- 0x9B80, 0x9BFC, 0x120F, 0x9C40, 0x9C7E, 0x128C, 0x9C80, 0x9CFC, 0x12CB,
- 0x9D40, 0x9D7E, 0x1348, 0x9D80, 0x9DFC, 0x1387, 0x9E40, 0x9E7E, 0x1404,
- 0x9E80, 0x9EFC, 0x1443, 0x9F40, 0x9F7E, 0x14C0, 0x9F80, 0x9FFC, 0x14FF,
- 0xE040, 0xE07E, 0x157C, 0xE080, 0xE0FC, 0x15BB, 0xE140, 0xE17E, 0x1638,
- 0xE180, 0xE1FC, 0x1677, 0xE240, 0xE27E, 0x16F4, 0xE280, 0xE2FC, 0x1733,
- 0xE340, 0xE37E, 0x17B0, 0xE380, 0xE3FC, 0x17EF, 0xE440, 0xE47E, 0x186C,
- 0xE480, 0xE4FC, 0x18AB, 0xE540, 0xE57E, 0x1928, 0xE580, 0xE5FC, 0x1967,
- 0xE640, 0xE67E, 0x19E4, 0xE680, 0xE6FC, 0x1A23, 0xE740, 0xE77E, 0x1AA0,
- 0xE780, 0xE7FC, 0x1ADF, 0xE840, 0xE87E, 0x1B5C, 0xE880, 0xE8FC, 0x1B9B,
- 0xE940, 0xE97E, 0x1C18, 0xE980, 0xE9FC, 0x1C57, 0xEA40, 0xEA7E, 0x1CD4,
- 0xEA80, 0xEAA2, 0x1D13, 0xEAA3, 0xEAA4, 0x205C, 0xEB41, 0xEB42, 0x1ECF,
- 0xEB50, 0xEB51, 0x1ED1, 0xEB5B, 0xEB5D, 0x1ED3, 0xEB60, 0xEB64, 0x1ED6,
- 0xEB69, 0xEB7A, 0x1EDB, 0xEB81, 0xEB81, 0x1EED, 0xEC9F, 0xEC9F, 0x1EEE,
- 0xECA1, 0xECA1, 0x1EEF, 0xECA3, 0xECA3, 0x1EF0, 0xECA5, 0xECA5, 0x1EF1,
- 0xECA7, 0xECA7, 0x1EF2, 0xECC1, 0xECC1, 0x1EF3, 0xECE1, 0xECE1, 0x1EF4,
- 0xECE3, 0xECE3, 0x1EF5, 0xECE5, 0xECE5, 0x1EF6, 0xECEC, 0xECEC, 0x1EF7,
- 0xED40, 0xED40, 0x1EF8, 0xED42, 0xED42, 0x1EF9, 0xED44, 0xED44, 0x1EFA,
- 0xED46, 0xED46, 0x1EFB, 0xED48, 0xED48, 0x1EFC, 0xED62, 0xED62, 0x1EFD,
- 0xED83, 0xED83, 0x1EFE, 0xED85, 0xED85, 0x1EFF, 0xED87, 0xED87, 0x1F00,
- 0xED8E, 0xED8E, 0x1F01, 0xED95, 0xED96, 0x1F02,
-};
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_90pv_RKSJ_H_1[263 * 3] = {
+ 0x0020, 0x007E, 0x0001, 0x0080, 0x0080, 0x0061, 0x00A0, 0x00DF, 0x0146,
+ 0x00FD, 0x00FD, 0x0098, 0x00FE, 0x00FE, 0x00E4, 0x00FF, 0x00FF, 0x007C,
+ 0x8140, 0x817E, 0x0279, 0x8180, 0x81AC, 0x02B8, 0x81B8, 0x81BF, 0x02E5,
+ 0x81C8, 0x81CE, 0x02ED, 0x81DA, 0x81E8, 0x02F4, 0x81F0, 0x81F7, 0x0303,
+ 0x81FC, 0x81FC, 0x030B, 0x824F, 0x8258, 0x030C, 0x8260, 0x8279, 0x0316,
+ 0x8281, 0x829A, 0x0330, 0x829F, 0x82F1, 0x034A, 0x8340, 0x837E, 0x039D,
+ 0x8380, 0x8396, 0x03DC, 0x839F, 0x83B6, 0x03F3, 0x83BF, 0x83D6, 0x040B,
+ 0x8440, 0x8460, 0x0423, 0x8470, 0x847E, 0x0444, 0x8480, 0x8491, 0x0453,
+ 0x849F, 0x849F, 0x1D37, 0x84A0, 0x84A0, 0x1D39, 0x84A1, 0x84A1, 0x1D43,
+ 0x84A2, 0x84A2, 0x1D47, 0x84A3, 0x84A3, 0x1D4F, 0x84A4, 0x84A4, 0x1D4B,
+ 0x84A5, 0x84A5, 0x1D53, 0x84A6, 0x84A6, 0x1D63, 0x84A7, 0x84A7, 0x1D5B,
+ 0x84A8, 0x84A8, 0x1D6B, 0x84A9, 0x84A9, 0x1D73, 0x84AA, 0x84AA, 0x1D38,
+ 0x84AB, 0x84AB, 0x1D3A, 0x84AC, 0x84AC, 0x1D46, 0x84AD, 0x84AD, 0x1D4A,
+ 0x84AE, 0x84AE, 0x1D52, 0x84AF, 0x84AF, 0x1D4E, 0x84B0, 0x84B0, 0x1D5A,
+ 0x84B1, 0x84B1, 0x1D6A, 0x84B2, 0x84B2, 0x1D62, 0x84B3, 0x84B3, 0x1D72,
+ 0x84B4, 0x84B4, 0x1D82, 0x84B5, 0x84B5, 0x1D57, 0x84B6, 0x84B6, 0x1D66,
+ 0x84B7, 0x84B7, 0x1D5F, 0x84B8, 0x84B8, 0x1D6E, 0x84B9, 0x84B9, 0x1D76,
+ 0x84BA, 0x84BA, 0x1D54, 0x84BB, 0x84BB, 0x1D67, 0x84BC, 0x84BC, 0x1D5C,
+ 0x84BD, 0x84BD, 0x1D6F, 0x84BE, 0x84BE, 0x1D79, 0x8540, 0x8553, 0x1D83,
+ 0x855E, 0x8571, 0x1F87, 0x857C, 0x857E, 0x205E, 0x8580, 0x8585, 0x2061,
+ 0x8591, 0x859A, 0x1F7D, 0x859F, 0x85A8, 0x1D97, 0x85A9, 0x85AA, 0x2021,
+ 0x85AB, 0x85AD, 0x2067, 0x85B3, 0x85BC, 0x1F9C, 0x85BD, 0x85C1, 0x206A,
+ 0x85DB, 0x85F4, 0x1FB0, 0x8640, 0x8640, 0x1DB1, 0x8641, 0x8641, 0x1FFA,
+ 0x8642, 0x8642, 0x1DB2, 0x8643, 0x8643, 0x1F54, 0x8644, 0x8644, 0x1F56,
+ 0x8645, 0x8645, 0x206F, 0x8646, 0x8646, 0x1DB7, 0x8647, 0x8647, 0x1F57,
+ 0x8648, 0x8648, 0x1DB3, 0x8649, 0x8649, 0x1F55, 0x864A, 0x864A, 0x1DB4,
+ 0x864B, 0x864B, 0x2070, 0x864C, 0x864D, 0x1DB5, 0x864E, 0x864E, 0x1F65,
+ 0x864F, 0x8655, 0x1F58, 0x8656, 0x8656, 0x2071, 0x8657, 0x8657, 0x1F64,
+ 0x8658, 0x8659, 0x1F62, 0x865A, 0x865C, 0x1F5F, 0x865D, 0x865D, 0x2072,
+ 0x869B, 0x869D, 0x1DBA, 0x869E, 0x869E, 0x2073, 0x869F, 0x869F, 0x1F52,
+ 0x86A0, 0x86A1, 0x1F50, 0x86A2, 0x86A2, 0x1F53, 0x86A3, 0x86A3, 0x2013,
+ 0x86A4, 0x86A4, 0x2015, 0x86A5, 0x86A5, 0x2014, 0x86A6, 0x86A6, 0x2016,
+ 0x86B3, 0x86B3, 0x1F7A, 0x86B4, 0x86B4, 0x1F78, 0x86B5, 0x86B5, 0x2074,
+ 0x86C7, 0x86CA, 0x201B, 0x86CB, 0x86CE, 0x2075, 0x86CF, 0x86CF, 0x1F4E,
+ 0x86D0, 0x86D0, 0x1F4D, 0x86D1, 0x86D1, 0x1F4C, 0x86D2, 0x86D2, 0x1F4B,
+ 0x86D3, 0x86D6, 0x200E, 0x8740, 0x8746, 0x2005, 0x8747, 0x8747, 0x1FD6,
+ 0x8748, 0x8748, 0x200C, 0x8749, 0x8749, 0x1FD1, 0x874A, 0x874A, 0x1FCA,
+ 0x874B, 0x874B, 0x1DC4, 0x874C, 0x874C, 0x1FD7, 0x874D, 0x874D, 0x1DC2,
+ 0x874E, 0x874E, 0x1FD2, 0x874F, 0x874F, 0x1FCD, 0x8750, 0x8750, 0x1DC3,
+ 0x8751, 0x8751, 0x1FD5, 0x8752, 0x8752, 0x1FD3, 0x8753, 0x8753, 0x1FCF,
+ 0x8754, 0x8754, 0x1FD4, 0x8755, 0x8755, 0x1FD0, 0x8756, 0x8757, 0x1FCB,
+ 0x8758, 0x8758, 0x1FCE, 0x8791, 0x8792, 0x207D, 0x8793, 0x8797, 0x1DBD,
+ 0x8798, 0x8798, 0x1FDA, 0x8799, 0x8799, 0x1FE5, 0x879A, 0x879A, 0x207F,
+ 0x879B, 0x879B, 0x1FDE, 0x879C, 0x879C, 0x1FFF, 0x879D, 0x879D, 0x2080,
+ 0x879E, 0x879E, 0x201F, 0x879F, 0x879F, 0x1DA1, 0x87A0, 0x87A0, 0x1F66,
+ 0x87A1, 0x87A1, 0x1DA4, 0x87A2, 0x87A2, 0x1DA2, 0x87A3, 0x87A3, 0x1F67,
+ 0x87A4, 0x87A4, 0x1FF7, 0x87A5, 0x87A6, 0x2087, 0x87A7, 0x87A7, 0x1F6A,
+ 0x87A8, 0x87A8, 0x1DA8, 0x87A9, 0x87AA, 0x1F68, 0x87AB, 0x87AB, 0x1DA6,
+ 0x87AC, 0x87AC, 0x1DA9, 0x87AD, 0x87AD, 0x1DAF, 0x87AE, 0x87AE, 0x1F6E,
+ 0x87AF, 0x87AF, 0x1F6C, 0x87B0, 0x87B0, 0x1DAB, 0x87B1, 0x87B1, 0x1F6D,
+ 0x87B2, 0x87B2, 0x1F6B, 0x87B3, 0x87B3, 0x1DAC, 0x87B4, 0x87B4, 0x1F6F,
+ 0x87B5, 0x87B5, 0x1DAE, 0x87BD, 0x87BD, 0x1F70, 0x87BE, 0x87BF, 0x1F73,
+ 0x87C0, 0x87C1, 0x1F71, 0x87E5, 0x87E7, 0x1DC5, 0x87E8, 0x87E8, 0x2083,
+ 0x87FA, 0x87FA, 0x1F76, 0x87FB, 0x87FC, 0x2081, 0x8840, 0x8840, 0x1DC8,
+ 0x8841, 0x8842, 0x1DCD, 0x8854, 0x8855, 0x1DB8, 0x8868, 0x8868, 0x1F16,
+ 0x886A, 0x886D, 0x2079, 0x889F, 0x88FC, 0x0465, 0x8940, 0x897E, 0x04C3,
+ 0x8980, 0x89FC, 0x0502, 0x8A40, 0x8A7E, 0x057F, 0x8A80, 0x8AFC, 0x05BE,
+ 0x8B40, 0x8B7E, 0x063B, 0x8B80, 0x8BFC, 0x067A, 0x8C40, 0x8C7E, 0x06F7,
+ 0x8C80, 0x8CFC, 0x0736, 0x8D40, 0x8D7E, 0x07B3, 0x8D80, 0x8DFC, 0x07F2,
+ 0x8E40, 0x8E7E, 0x086F, 0x8E80, 0x8EFC, 0x08AE, 0x8F40, 0x8F7E, 0x092B,
+ 0x8F80, 0x8FFC, 0x096A, 0x9040, 0x907E, 0x09E7, 0x9080, 0x90FC, 0x0A26,
+ 0x9140, 0x917E, 0x0AA3, 0x9180, 0x91FC, 0x0AE2, 0x9240, 0x927E, 0x0B5F,
+ 0x9280, 0x92FC, 0x0B9E, 0x9340, 0x937E, 0x0C1B, 0x9380, 0x93FC, 0x0C5A,
+ 0x9440, 0x947E, 0x0CD7, 0x9480, 0x94FC, 0x0D16, 0x9540, 0x957E, 0x0D93,
+ 0x9580, 0x95FC, 0x0DD2, 0x9640, 0x967E, 0x0E4F, 0x9680, 0x96FC, 0x0E8E,
+ 0x9740, 0x977E, 0x0F0B, 0x9780, 0x97FC, 0x0F4A, 0x9840, 0x9872, 0x0FC7,
+ 0x989F, 0x98FC, 0x0FFA, 0x9940, 0x997E, 0x1058, 0x9980, 0x99FC, 0x1097,
+ 0x9A40, 0x9A7E, 0x1114, 0x9A80, 0x9AFC, 0x1153, 0x9B40, 0x9B7E, 0x11D0,
+ 0x9B80, 0x9BFC, 0x120F, 0x9C40, 0x9C7E, 0x128C, 0x9C80, 0x9CFC, 0x12CB,
+ 0x9D40, 0x9D7E, 0x1348, 0x9D80, 0x9DFC, 0x1387, 0x9E40, 0x9E7E, 0x1404,
+ 0x9E80, 0x9EFC, 0x1443, 0x9F40, 0x9F7E, 0x14C0, 0x9F80, 0x9FFC, 0x14FF,
+ 0xE040, 0xE07E, 0x157C, 0xE080, 0xE0FC, 0x15BB, 0xE140, 0xE17E, 0x1638,
+ 0xE180, 0xE1FC, 0x1677, 0xE240, 0xE27E, 0x16F4, 0xE280, 0xE2FC, 0x1733,
+ 0xE340, 0xE37E, 0x17B0, 0xE380, 0xE3FC, 0x17EF, 0xE440, 0xE47E, 0x186C,
+ 0xE480, 0xE4FC, 0x18AB, 0xE540, 0xE57E, 0x1928, 0xE580, 0xE5FC, 0x1967,
+ 0xE640, 0xE67E, 0x19E4, 0xE680, 0xE6FC, 0x1A23, 0xE740, 0xE77E, 0x1AA0,
+ 0xE780, 0xE7FC, 0x1ADF, 0xE840, 0xE87E, 0x1B5C, 0xE880, 0xE8FC, 0x1B9B,
+ 0xE940, 0xE97E, 0x1C18, 0xE980, 0xE9FC, 0x1C57, 0xEA40, 0xEA7E, 0x1CD4,
+ 0xEA80, 0xEAA2, 0x1D13, 0xEAA3, 0xEAA4, 0x205C, 0xEB41, 0xEB42, 0x1ECF,
+ 0xEB50, 0xEB51, 0x1ED1, 0xEB5B, 0xEB5D, 0x1ED3, 0xEB60, 0xEB64, 0x1ED6,
+ 0xEB69, 0xEB7A, 0x1EDB, 0xEB81, 0xEB81, 0x1EED, 0xEC9F, 0xEC9F, 0x1EEE,
+ 0xECA1, 0xECA1, 0x1EEF, 0xECA3, 0xECA3, 0x1EF0, 0xECA5, 0xECA5, 0x1EF1,
+ 0xECA7, 0xECA7, 0x1EF2, 0xECC1, 0xECC1, 0x1EF3, 0xECE1, 0xECE1, 0x1EF4,
+ 0xECE3, 0xECE3, 0x1EF5, 0xECE5, 0xECE5, 0x1EF6, 0xECEC, 0xECEC, 0x1EF7,
+ 0xED40, 0xED40, 0x1EF8, 0xED42, 0xED42, 0x1EF9, 0xED44, 0xED44, 0x1EFA,
+ 0xED46, 0xED46, 0x1EFB, 0xED48, 0xED48, 0x1EFC, 0xED62, 0xED62, 0x1EFD,
+ 0xED83, 0xED83, 0x1EFE, 0xED85, 0xED85, 0x1EFF, 0xED87, 0xED87, 0x1F00,
+ 0xED8E, 0xED8E, 0x1F01, 0xED95, 0xED96, 0x1F02,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/Japan1/Add-RKSJ-H_1.cpp b/core/src/fpdfapi/fpdf_cmaps/Japan1/Add-RKSJ-H_1.cpp
index fd580d50a1..848cb49964 100644
--- a/core/src/fpdfapi/fpdf_cmaps/Japan1/Add-RKSJ-H_1.cpp
+++ b/core/src/fpdfapi/fpdf_cmaps/Japan1/Add-RKSJ-H_1.cpp
@@ -1,220 +1,220 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-extern const unsigned short g_FXCMAP_Add_RKSJ_H_1[635 * 3] = {
- 0x0020, 0x007E, 0x00E7, 0x00A0, 0x00DF, 0x0146, 0x8140, 0x817E, 0x0279,
- 0x8180, 0x81AC, 0x02B8, 0x81B8, 0x81BF, 0x02E5, 0x81C8, 0x81CE, 0x02ED,
- 0x81DA, 0x81E8, 0x02F4, 0x81F0, 0x81F7, 0x0303, 0x81FC, 0x81FC, 0x030B,
- 0x824F, 0x8258, 0x030C, 0x8260, 0x8279, 0x0316, 0x8281, 0x829A, 0x0330,
- 0x829F, 0x82F1, 0x034A, 0x82F2, 0x82F4, 0x1F16, 0x8340, 0x837E, 0x039D,
- 0x8380, 0x8396, 0x03DC, 0x839F, 0x83B6, 0x03F3, 0x83BF, 0x83D6, 0x040B,
- 0x8440, 0x8460, 0x0423, 0x8470, 0x847E, 0x0444, 0x8480, 0x8491, 0x0453,
- 0x849F, 0x849F, 0x1D37, 0x84A0, 0x84A0, 0x1D39, 0x84A1, 0x84A1, 0x1D43,
- 0x84A2, 0x84A2, 0x1D47, 0x84A3, 0x84A3, 0x1D4F, 0x84A4, 0x84A4, 0x1D4B,
- 0x84A5, 0x84A5, 0x1D53, 0x84A6, 0x84A6, 0x1D63, 0x84A7, 0x84A7, 0x1D5B,
- 0x84A8, 0x84A8, 0x1D6B, 0x84A9, 0x84A9, 0x1D73, 0x84AA, 0x84AA, 0x1D38,
- 0x84AB, 0x84AB, 0x1D3A, 0x84AC, 0x84AC, 0x1D46, 0x84AD, 0x84AD, 0x1D4A,
- 0x84AE, 0x84AE, 0x1D52, 0x84AF, 0x84AF, 0x1D4E, 0x84B0, 0x84B0, 0x1D5A,
- 0x84B1, 0x84B1, 0x1D6A, 0x84B2, 0x84B2, 0x1D62, 0x84B3, 0x84B3, 0x1D72,
- 0x84B4, 0x84B4, 0x1D82, 0x84B5, 0x84B5, 0x1D57, 0x84B6, 0x84B6, 0x1D66,
- 0x84B7, 0x84B7, 0x1D5F, 0x84B8, 0x84B8, 0x1D6E, 0x84B9, 0x84B9, 0x1D76,
- 0x84BA, 0x84BA, 0x1D54, 0x84BB, 0x84BB, 0x1D67, 0x84BC, 0x84BC, 0x1D5C,
- 0x84BD, 0x84BD, 0x1D6F, 0x84BE, 0x84BE, 0x1D79, 0x889F, 0x889F, 0x0465,
- 0x88A0, 0x88A0, 0x1DD1, 0x88A1, 0x88AF, 0x0467, 0x88B0, 0x88B0, 0x1F19,
- 0x88B1, 0x88B8, 0x0477, 0x88B9, 0x88B9, 0x1DD2, 0x88BA, 0x88EB, 0x0480,
- 0x88EC, 0x88EC, 0x1DD3, 0x88ED, 0x88EE, 0x04B3, 0x88EF, 0x88EF, 0x1F1A,
- 0x88F0, 0x88F0, 0x04B6, 0x88F1, 0x88F1, 0x1DD4, 0x88F2, 0x88F9, 0x04B8,
- 0x88FA, 0x88FA, 0x1DD5, 0x88FB, 0x88FC, 0x04C1, 0x8940, 0x8948, 0x04C3,
- 0x8949, 0x8949, 0x1DD6, 0x894A, 0x8951, 0x04CD, 0x8952, 0x8952, 0x1F1B,
- 0x8953, 0x8953, 0x04D6, 0x8954, 0x8954, 0x1DD7, 0x8955, 0x8957, 0x04D8,
- 0x8958, 0x8958, 0x1F1C, 0x8959, 0x895B, 0x04DC, 0x895C, 0x895C, 0x1DDA,
- 0x895D, 0x8960, 0x04E0, 0x8961, 0x8961, 0x1DDB, 0x8962, 0x897E, 0x04E5,
- 0x8980, 0x898A, 0x0502, 0x898B, 0x898B, 0x1DDC, 0x898C, 0x89A5, 0x050E,
- 0x89A6, 0x89A6, 0x1DDD, 0x89A7, 0x89A7, 0x0529, 0x89A8, 0x89A8, 0x1DDE,
- 0x89A9, 0x89DD, 0x052B, 0x89DE, 0x89DE, 0x1DDF, 0x89DF, 0x89E4, 0x0561,
- 0x89E5, 0x89E5, 0x1F1D, 0x89E6, 0x89F7, 0x0568, 0x89F8, 0x89F8, 0x1DE0,
- 0x89F9, 0x89FC, 0x057B, 0x8A40, 0x8A40, 0x057F, 0x8A41, 0x8A41, 0x1DE2,
- 0x8A42, 0x8A7E, 0x0581, 0x8A80, 0x8A8A, 0x05BE, 0x8A8B, 0x8A8B, 0x1DE4,
- 0x8A8C, 0x8A92, 0x05CA, 0x8A93, 0x8A93, 0x1DE5, 0x8A94, 0x8A99, 0x05D2,
- 0x8A9A, 0x8A9A, 0x1DE6, 0x8A9B, 0x8ABF, 0x05D9, 0x8AC0, 0x8AC0, 0x1DE7,
- 0x8AC1, 0x8ACA, 0x05FF, 0x8ACB, 0x8ACB, 0x1DE8, 0x8ACC, 0x8AE2, 0x060A,
- 0x8AE3, 0x8AE3, 0x1DE9, 0x8AE4, 0x8AFC, 0x0622, 0x8B40, 0x8B49, 0x063B,
- 0x8B4A, 0x8B4A, 0x1DEA, 0x8B4B, 0x8B5E, 0x0646, 0x8B5F, 0x8B5F, 0x1DEB,
- 0x8B60, 0x8B7E, 0x065B, 0x8B80, 0x8B81, 0x067A, 0x8B82, 0x8B82, 0x1F1E,
- 0x8B83, 0x8B87, 0x067D, 0x8B88, 0x8B88, 0x1F1F, 0x8B89, 0x8B9F, 0x0683,
- 0x8BA0, 0x8BA0, 0x1DEC, 0x8BA1, 0x8BA7, 0x069B, 0x8BA8, 0x8BA8, 0x1DED,
- 0x8BA9, 0x8BBF, 0x06A3, 0x8BC0, 0x8BC0, 0x1F20, 0x8BC1, 0x8BCC, 0x06BB,
- 0x8BCD, 0x8BCD, 0x1DEE, 0x8BCE, 0x8BEA, 0x06C8, 0x8BEB, 0x8BEB, 0x1DEF,
- 0x8BEC, 0x8BF1, 0x06E6, 0x8BF2, 0x8BF2, 0x1DF0, 0x8BF3, 0x8BF8, 0x06ED,
- 0x8BF9, 0x8BF9, 0x1DF1, 0x8BFA, 0x8BFA, 0x06F4, 0x8BFB, 0x8BFB, 0x1DF2,
- 0x8BFC, 0x8BFC, 0x06F6, 0x8C40, 0x8C55, 0x06F7, 0x8C56, 0x8C56, 0x1DF4,
- 0x8C57, 0x8C70, 0x070E, 0x8C71, 0x8C71, 0x1DF7, 0x8C72, 0x8C7E, 0x0729,
- 0x8C80, 0x8C90, 0x0736, 0x8C91, 0x8C91, 0x1DFA, 0x8C92, 0x8C9C, 0x0748,
- 0x8C9D, 0x8C9D, 0x1F21, 0x8C9E, 0x8C9E, 0x1DFC, 0x8C9F, 0x8CB1, 0x0755,
- 0x8CB2, 0x8CB2, 0x1DFD, 0x8CB3, 0x8CBE, 0x0769, 0x8CBF, 0x8CBF, 0x1DFE,
- 0x8CC0, 0x8CFC, 0x0776, 0x8D40, 0x8D49, 0x07B3, 0x8D4A, 0x8D4A, 0x1DFF,
- 0x8D4B, 0x8D7E, 0x07BE, 0x8D80, 0x8D8C, 0x07F2, 0x8D8D, 0x8D8D, 0x1E02,
- 0x8D8E, 0x8D93, 0x0800, 0x8D94, 0x8D94, 0x1E03, 0x8D95, 0x8D98, 0x0807,
- 0x8D99, 0x8D99, 0x1E04, 0x8D9A, 0x8DD0, 0x080C, 0x8DD1, 0x8DD1, 0x1E05,
- 0x8DD2, 0x8DE4, 0x0844, 0x8DE5, 0x8DE5, 0x1E06, 0x8DE6, 0x8DF1, 0x0858,
- 0x8DF2, 0x8DF2, 0x1E07, 0x8DF3, 0x8DFC, 0x0865, 0x8E40, 0x8E45, 0x086F,
- 0x8E46, 0x8E46, 0x1E08, 0x8E47, 0x8E48, 0x0876, 0x8E49, 0x8E49, 0x1E09,
- 0x8E4A, 0x8E4A, 0x0879, 0x8E4B, 0x8E4B, 0x1E0A, 0x8E4C, 0x8E57, 0x087B,
- 0x8E58, 0x8E58, 0x1E0B, 0x8E59, 0x8E5F, 0x0888, 0x8E60, 0x8E60, 0x1F22,
- 0x8E61, 0x8E7E, 0x0890, 0x8E80, 0x8EC5, 0x08AE, 0x8EC6, 0x8EC6, 0x1E0D,
- 0x8EC7, 0x8EDA, 0x08F5, 0x8EDB, 0x8EDC, 0x1E0F, 0x8EDD, 0x8EFC, 0x090B,
- 0x8F40, 0x8F49, 0x092B, 0x8F4A, 0x8F4A, 0x1E11, 0x8F4B, 0x8F54, 0x0936,
- 0x8F55, 0x8F55, 0x1E12, 0x8F56, 0x8F7E, 0x0941, 0x8F80, 0x8F8B, 0x096A,
- 0x8F8C, 0x8F8C, 0x1E13, 0x8F8D, 0x8F91, 0x0977, 0x8F92, 0x8F93, 0x1E15,
- 0x8F94, 0x8FA2, 0x097E, 0x8FA3, 0x8FA3, 0x1E17, 0x8FA4, 0x8FB0, 0x098E,
- 0x8FB1, 0x8FB1, 0x1E18, 0x8FB2, 0x8FD2, 0x099C, 0x8FD3, 0x8FD3, 0x1E1A,
- 0x8FD4, 0x8FDC, 0x09BE, 0x8FDD, 0x8FDD, 0x1E1B, 0x8FDE, 0x8FE1, 0x09C8,
- 0x8FE2, 0x8FE2, 0x1E1C, 0x8FE3, 0x8FFC, 0x09CD, 0x9040, 0x9048, 0x09E7,
- 0x9049, 0x9049, 0x1E1D, 0x904A, 0x9077, 0x09F1, 0x9078, 0x9078, 0x1F23,
- 0x9079, 0x907E, 0x0A20, 0x9080, 0x9080, 0x1E1F, 0x9081, 0x909F, 0x0A27,
- 0x90A0, 0x90A0, 0x1E21, 0x90A1, 0x90E3, 0x0A47, 0x90E4, 0x90E4, 0x1E23,
- 0x90E5, 0x90EE, 0x0A8B, 0x90EF, 0x90EF, 0x1E24, 0x90F0, 0x90F6, 0x0A96,
- 0x90F7, 0x90F7, 0x1E26, 0x90F8, 0x90F8, 0x1F24, 0x90F9, 0x90F9, 0x0A9F,
- 0x90FA, 0x90FB, 0x1F25, 0x90FC, 0x90FC, 0x0AA2, 0x9140, 0x9145, 0x0AA3,
- 0x9146, 0x9146, 0x1E28, 0x9147, 0x9157, 0x0AAA, 0x9158, 0x9158, 0x1E29,
- 0x9159, 0x916A, 0x0ABC, 0x916B, 0x916B, 0x1E2A, 0x916C, 0x916D, 0x0ACF,
- 0x916E, 0x916E, 0x1E2B, 0x916F, 0x917D, 0x0AD2, 0x917E, 0x917E, 0x1E2C,
- 0x9180, 0x9188, 0x0AE2, 0x9189, 0x9189, 0x1E2D, 0x918A, 0x91B4, 0x0AEC,
- 0x91B5, 0x91B5, 0x1F27, 0x91B6, 0x91BA, 0x0B18, 0x91BB, 0x91BB, 0x1E2E,
- 0x91BC, 0x91CA, 0x0B1E, 0x91CB, 0x91CB, 0x1E2F, 0x91CC, 0x91D9, 0x0B2E,
- 0x91DA, 0x91DA, 0x1E30, 0x91DB, 0x91E0, 0x0B3D, 0x91E1, 0x91E1, 0x1E31,
- 0x91E2, 0x91EC, 0x0B44, 0x91ED, 0x91ED, 0x1E32, 0x91EE, 0x91FA, 0x0B50,
- 0x91FB, 0x91FB, 0x1E35, 0x91FC, 0x91FC, 0x0B5E, 0x9240, 0x9245, 0x0B5F,
- 0x9246, 0x9246, 0x1E36, 0x9247, 0x9247, 0x0B66, 0x9248, 0x9248, 0x1E37,
- 0x9249, 0x924B, 0x0B68, 0x924C, 0x924D, 0x1E39, 0x924E, 0x925B, 0x0B6D,
- 0x925C, 0x925C, 0x1E3B, 0x925D, 0x927E, 0x0B7C, 0x9280, 0x928F, 0x0B9E,
- 0x9290, 0x9290, 0x1E3C, 0x9291, 0x9294, 0x0BAF, 0x9295, 0x9295, 0x1E3D,
- 0x9296, 0x929B, 0x0BB4, 0x929C, 0x929C, 0x1E3E, 0x929D, 0x92BA, 0x0BBB,
- 0x92BB, 0x92BB, 0x1E3F, 0x92BC, 0x92C5, 0x0BDA, 0x92C6, 0x92C6, 0x1E40,
- 0x92C7, 0x92C7, 0x0BE5, 0x92C8, 0x92C8, 0x1E41, 0x92C9, 0x92CC, 0x0BE7,
- 0x92CD, 0x92CD, 0x1E43, 0x92CE, 0x92FC, 0x0BEC, 0x9340, 0x9340, 0x0C1B,
- 0x9341, 0x9341, 0x1E44, 0x9342, 0x9345, 0x0C1D, 0x9346, 0x9346, 0x1E45,
- 0x9347, 0x934C, 0x0C22, 0x934D, 0x934D, 0x1E46, 0x934E, 0x9354, 0x0C29,
- 0x9355, 0x9355, 0x1E47, 0x9356, 0x935D, 0x0C31, 0x935E, 0x935E, 0x1E48,
- 0x935F, 0x9366, 0x0C3A, 0x9367, 0x9367, 0x1E49, 0x9368, 0x9369, 0x0C43,
- 0x936A, 0x936A, 0x1E4A, 0x936B, 0x936F, 0x0C46, 0x9370, 0x9370, 0x1F28,
- 0x9371, 0x9371, 0x1E4C, 0x9372, 0x937E, 0x0C4D, 0x9380, 0x9383, 0x0C5A,
- 0x9384, 0x9384, 0x1E4D, 0x9385, 0x9397, 0x0C5F, 0x9398, 0x9398, 0x1E4E,
- 0x9399, 0x93BF, 0x0C73, 0x93C0, 0x93C0, 0x1E50, 0x93C1, 0x93D1, 0x0C9B,
- 0x93D2, 0x93D2, 0x1E51, 0x93D3, 0x93D8, 0x0CAD, 0x93D9, 0x93D9, 0x1E53,
- 0x93DA, 0x93E3, 0x0CB4, 0x93E4, 0x93E5, 0x1E56, 0x93E6, 0x93E7, 0x0CC0,
- 0x93E8, 0x93E8, 0x1E58, 0x93E9, 0x93F3, 0x0CC3, 0x93F4, 0x93F4, 0x1EC0,
- 0x93F5, 0x93FC, 0x0CCF, 0x9440, 0x9447, 0x0CD7, 0x9448, 0x9448, 0x1E59,
- 0x9449, 0x9449, 0x1F29, 0x944A, 0x9457, 0x0CE1, 0x9458, 0x9458, 0x1E5A,
- 0x9459, 0x9475, 0x0CF0, 0x9476, 0x9476, 0x1E5B, 0x9477, 0x947E, 0x0D0E,
- 0x9480, 0x9486, 0x0D16, 0x9487, 0x9487, 0x1E5C, 0x9488, 0x9488, 0x0D1E,
- 0x9489, 0x9489, 0x1E5D, 0x948A, 0x948C, 0x0D20, 0x948D, 0x948D, 0x1E5E,
- 0x948E, 0x94A1, 0x0D24, 0x94A2, 0x94A2, 0x1E5F, 0x94A3, 0x94AB, 0x0D39,
- 0x94AC, 0x94AC, 0x1E60, 0x94AD, 0x94AD, 0x0D43, 0x94AE, 0x94AE, 0x1E61,
- 0x94AF, 0x94BD, 0x0D45, 0x94BE, 0x94BE, 0x1F2A, 0x94BF, 0x94D1, 0x0D55,
- 0x94D2, 0x94D2, 0x1E62, 0x94D3, 0x94F2, 0x0D69, 0x94F3, 0x94F3, 0x1E64,
- 0x94F4, 0x94FC, 0x0D8A, 0x9540, 0x9540, 0x0D93, 0x9541, 0x9542, 0x1E65,
- 0x9543, 0x954D, 0x0D96, 0x954E, 0x954E, 0x1E67, 0x954F, 0x9550, 0x0DA2,
- 0x9551, 0x9551, 0x1E68, 0x9552, 0x9553, 0x0DA5, 0x9554, 0x9554, 0x1E69,
- 0x9555, 0x955E, 0x0DA8, 0x955F, 0x955F, 0x1E6A, 0x9560, 0x956C, 0x0DB3,
- 0x956D, 0x956D, 0x1E6B, 0x956E, 0x957E, 0x0DC1, 0x9580, 0x95C0, 0x0DD2,
- 0x95C1, 0x95C1, 0x1E6D, 0x95C2, 0x95CA, 0x0E14, 0x95CB, 0x95CB, 0x1E6E,
- 0x95CC, 0x95D0, 0x0E1E, 0x95D1, 0x95D1, 0x1F2B, 0x95D2, 0x95D7, 0x0E24,
- 0x95D8, 0x95D8, 0x1E6F, 0x95D9, 0x95F6, 0x0E2B, 0x95F7, 0x95F7, 0x1E70,
- 0x95F8, 0x95FC, 0x0E4A, 0x9640, 0x9647, 0x0E4F, 0x9648, 0x9648, 0x1E72,
- 0x9649, 0x9669, 0x0E58, 0x966A, 0x966A, 0x1E73, 0x966B, 0x967E, 0x0E7A,
- 0x9680, 0x968F, 0x0E8E, 0x9690, 0x9690, 0x1E74, 0x9691, 0x9697, 0x0E9F,
- 0x9698, 0x9698, 0x1F2C, 0x9699, 0x96CA, 0x0EA7, 0x96CB, 0x96CB, 0x1E75,
- 0x96CC, 0x96D6, 0x0EDA, 0x96D7, 0x96D7, 0x1E76, 0x96D8, 0x96DC, 0x0EE6,
- 0x96DD, 0x96DD, 0x1E77, 0x96DE, 0x96DF, 0x0EEC, 0x96E0, 0x96E0, 0x1E78,
- 0x96E1, 0x96F7, 0x0EEF, 0x96F8, 0x96F8, 0x1E79, 0x96F9, 0x96F9, 0x0F07,
- 0x96FA, 0x96FA, 0x1E7A, 0x96FB, 0x96FC, 0x0F09, 0x9740, 0x9750, 0x0F0B,
- 0x9751, 0x9751, 0x1E7C, 0x9752, 0x976E, 0x0F1D, 0x976F, 0x976F, 0x1E7D,
- 0x9770, 0x9772, 0x0F3B, 0x9773, 0x9773, 0x1E7E, 0x9774, 0x977E, 0x0F3F,
- 0x9780, 0x9788, 0x0F4A, 0x9789, 0x9789, 0x1E7F, 0x978A, 0x97F7, 0x0F54,
- 0x97F8, 0x97F9, 0x1E81, 0x97FA, 0x97FA, 0x1F2D, 0x97FB, 0x97FC, 0x0FC5,
- 0x9840, 0x9840, 0x1E83, 0x9841, 0x984F, 0x0FC8, 0x9850, 0x9850, 0x1E84,
- 0x9851, 0x9857, 0x0FD8, 0x9858, 0x9858, 0x1E85, 0x9859, 0x9872, 0x0FE0,
- 0x989F, 0x98FC, 0x0FFA, 0x9940, 0x9940, 0x1058, 0x9941, 0x9941, 0x1F2E,
- 0x9942, 0x995B, 0x105A, 0x995C, 0x995C, 0x1E86, 0x995D, 0x996B, 0x1075,
- 0x996C, 0x996C, 0x1E89, 0x996D, 0x997E, 0x1085, 0x9980, 0x99B5, 0x1097,
- 0x99B6, 0x99B6, 0x1F2F, 0x99B7, 0x99FC, 0x10CE, 0x9A40, 0x9A4E, 0x1114,
- 0x9A4F, 0x9A4F, 0x1E8A, 0x9A50, 0x9A58, 0x1124, 0x9A59, 0x9A59, 0x1E8B,
- 0x9A5A, 0x9A66, 0x112E, 0x9A67, 0x9A67, 0x1F30, 0x9A68, 0x9A7C, 0x113C,
- 0x9A7D, 0x9A7D, 0x1E8D, 0x9A7E, 0x9A7E, 0x1152, 0x9A80, 0x9A8A, 0x1153,
- 0x9A8B, 0x9A8B, 0x1E8E, 0x9A8C, 0x9A8C, 0x1F31, 0x9A8D, 0x9AC1, 0x1160,
- 0x9AC2, 0x9AC2, 0x1E8F, 0x9AC3, 0x9AC3, 0x1F32, 0x9AC4, 0x9AE9, 0x1197,
- 0x9AEA, 0x9AEA, 0x1F33, 0x9AEB, 0x9AFC, 0x11BE, 0x9B40, 0x9B5B, 0x11D0,
- 0x9B5C, 0x9B5C, 0x1E90, 0x9B5D, 0x9B7E, 0x11ED, 0x9B80, 0x9B82, 0x120F,
- 0x9B83, 0x9B83, 0x1E91, 0x9B84, 0x9B97, 0x1213, 0x9B98, 0x9B98, 0x1F34,
- 0x9B99, 0x9B9F, 0x1228, 0x9BA0, 0x9BA0, 0x1E92, 0x9BA1, 0x9BFA, 0x1230,
- 0x9BFB, 0x9BFC, 0x1F35, 0x9C40, 0x9C7E, 0x128C, 0x9C80, 0x9CA1, 0x12CB,
- 0x9CA2, 0x9CA2, 0x1E94, 0x9CA3, 0x9CFC, 0x12EE, 0x9D40, 0x9D46, 0x1348,
- 0x9D47, 0x9D47, 0x1F37, 0x9D48, 0x9D7E, 0x1350, 0x9D80, 0x9D80, 0x1E95,
- 0x9D81, 0x9D8B, 0x1388, 0x9D8C, 0x9D8C, 0x1E96, 0x9D8D, 0x9DB6, 0x1394,
- 0x9DB7, 0x9DB7, 0x1E97, 0x9DB8, 0x9DF7, 0x13BF, 0x9DF8, 0x9DF8, 0x1F38,
- 0x9DF9, 0x9DFC, 0x1400, 0x9E40, 0x9E63, 0x1404, 0x9E64, 0x9E64, 0x1E99,
- 0x9E65, 0x9E7E, 0x1429, 0x9E80, 0x9E8A, 0x1443, 0x9E8B, 0x9E8B, 0x1E9B,
- 0x9E8C, 0x9EFC, 0x144F, 0x9F40, 0x9F7E, 0x14C0, 0x9F80, 0x9F80, 0x14FF,
- 0x9F81, 0x9F81, 0x1F39, 0x9F82, 0x9FCD, 0x1501, 0x9FCE, 0x9FCE, 0x1E9D,
- 0x9FCF, 0x9FD3, 0x154E, 0x9FD4, 0x9FD4, 0x1F3A, 0x9FD5, 0x9FF3, 0x1554,
- 0x9FF4, 0x9FF4, 0x1F3B, 0x9FF5, 0x9FFC, 0x1574, 0xE040, 0xE07E, 0x157C,
- 0xE080, 0xE092, 0x15BB, 0xE093, 0xE093, 0x1E9E, 0xE094, 0xE0A3, 0x15CF,
- 0xE0A4, 0xE0A4, 0x1E9F, 0xE0A5, 0xE0DC, 0x15E0, 0xE0DD, 0xE0DD, 0x1EA0,
- 0xE0DE, 0xE0FC, 0x1619, 0xE140, 0xE149, 0x1638, 0xE14A, 0xE14A, 0x1EA1,
- 0xE14B, 0xE17E, 0x1643, 0xE180, 0xE1EC, 0x1677, 0xE1ED, 0xE1ED, 0x1EA5,
- 0xE1EE, 0xE1FC, 0x16E5, 0xE240, 0xE268, 0x16F4, 0xE269, 0xE269, 0x1EA6,
- 0xE26A, 0xE272, 0x171E, 0xE273, 0xE273, 0x1EA7, 0xE274, 0xE277, 0x1728,
- 0xE278, 0xE278, 0x1F3C, 0xE279, 0xE27E, 0x172D, 0xE280, 0xE2B6, 0x1733,
- 0xE2B7, 0xE2B7, 0x1EA8, 0xE2B8, 0xE2BD, 0x176B, 0xE2BE, 0xE2BE, 0x1F3D,
- 0xE2BF, 0xE2E1, 0x1772, 0xE2E2, 0xE2E2, 0x1EA9, 0xE2E3, 0xE2EB, 0x1796,
- 0xE2EC, 0xE2EC, 0x1EAA, 0xE2ED, 0xE2FC, 0x17A0, 0xE340, 0xE357, 0x17B0,
- 0xE358, 0xE358, 0x1EAB, 0xE359, 0xE359, 0x17C9, 0xE35A, 0xE35A, 0x1EAC,
- 0xE35B, 0xE364, 0x17CB, 0xE365, 0xE365, 0x1EAD, 0xE366, 0xE37E, 0x17D6,
- 0xE380, 0xE3C6, 0x17EF, 0xE3C7, 0xE3C7, 0x1F3E, 0xE3C8, 0xE3FC, 0x1837,
- 0xE440, 0xE47E, 0x186C, 0xE480, 0xE483, 0x18AB, 0xE484, 0xE484, 0x1EAF,
- 0xE485, 0xE488, 0x18B0, 0xE489, 0xE489, 0x1EB0, 0xE48A, 0xE491, 0x18B5,
- 0xE492, 0xE492, 0x1EB1, 0xE493, 0xE4B8, 0x18BE, 0xE4B9, 0xE4B9, 0x1EB3,
- 0xE4BA, 0xE4CA, 0x18E5, 0xE4CB, 0xE4CB, 0x1F3F, 0xE4CC, 0xE4FC, 0x18F7,
- 0xE540, 0xE57E, 0x1928, 0xE580, 0xE59D, 0x1967, 0xE59E, 0xE59E, 0x1F40,
- 0xE59F, 0xE5B9, 0x1986, 0xE5BA, 0xE5BB, 0x1F41, 0xE5BC, 0xE5EC, 0x19A3,
- 0xE5ED, 0xE5ED, 0x1EB8, 0xE5EE, 0xE5FC, 0x19D5, 0xE640, 0xE650, 0x19E4,
- 0xE651, 0xE651, 0x1EB9, 0xE652, 0xE67E, 0x19F6, 0xE680, 0xE685, 0x1A23,
- 0xE686, 0xE686, 0x1EBA, 0xE687, 0xE6E6, 0x1A2A, 0xE6E7, 0xE6E7, 0x1EBC,
- 0xE6E8, 0xE6FC, 0x1A8B, 0xE740, 0xE76C, 0x1AA0, 0xE76D, 0xE76D, 0x1EBE,
- 0xE76E, 0xE77E, 0x1ACE, 0xE780, 0xE7A6, 0x1ADF, 0xE7A7, 0xE7A7, 0x1EC1,
- 0xE7A8, 0xE7BA, 0x1B07, 0xE7BB, 0xE7BB, 0x1EC2, 0xE7BC, 0xE7FC, 0x1B1B,
- 0xE840, 0xE87E, 0x1B5C, 0xE880, 0xE8CE, 0x1B9B, 0xE8CF, 0xE8CF, 0x1EC7,
- 0xE8D0, 0xE8FC, 0x1BEB, 0xE940, 0xE977, 0x1C18, 0xE978, 0xE978, 0x1F43,
- 0xE979, 0xE97E, 0x1C51, 0xE980, 0xE9AA, 0x1C57, 0xE9AB, 0xE9AB, 0x1ECA,
- 0xE9AC, 0xE9B9, 0x1C83, 0xE9BA, 0xE9BA, 0x1ECB, 0xE9BB, 0xE9CB, 0x1C92,
- 0xE9CC, 0xE9CC, 0x1ECC, 0xE9CD, 0xE9FC, 0x1CA4, 0xEA40, 0xEA6F, 0x1CD4,
- 0xEA70, 0xEA70, 0x1ECD, 0xEA71, 0xEA71, 0x1F44, 0xEA72, 0xEA7E, 0x1D06,
- 0xEA80, 0xEA9C, 0x1D13, 0xEA9D, 0xEA9D, 0x1ECE, 0xEA9E, 0xEAA2, 0x1D31,
- 0xEAA3, 0xEAA4, 0x205C, 0xEC40, 0xEC42, 0x1F45, 0xEC46, 0xEC46, 0x1F48,
- 0xEC47, 0xEC47, 0x0300, 0xEC48, 0xEC48, 0x02FA, 0xEC49, 0xEC49, 0x02F9,
- 0xEC4D, 0xEC57, 0x1F49, 0xEC5B, 0xEC5D, 0x1DB1, 0xEC5E, 0xEC5E, 0x1F54,
- 0xEC5F, 0xEC5F, 0x1DB7, 0xEC60, 0xEC62, 0x1F55, 0xEC63, 0xEC65, 0x1DB4,
- 0xEC66, 0xEC6F, 0x1F58, 0xEC70, 0xEC70, 0x0303, 0xEC71, 0xEC71, 0x1F62,
- 0xEC72, 0xEC72, 0x0304, 0xEC73, 0xEC74, 0x1F63, 0xEC76, 0xEC76, 0x1F65,
- 0xEC78, 0xEC78, 0x1DA4, 0xEC79, 0xEC79, 0x1DA1, 0xEC7A, 0xEC7A, 0x1F66,
- 0xEC7B, 0xEC7B, 0x1DA2, 0xEC7C, 0xEC7E, 0x1F67, 0xEC80, 0xEC80, 0x1DA6,
- 0xEC81, 0xEC81, 0x1F6A, 0xEC82, 0xEC82, 0x1DA8, 0xEC83, 0xEC83, 0x1DAC,
- 0xEC84, 0xEC84, 0x1F6B, 0xEC85, 0xEC85, 0x1DAE, 0xEC86, 0xEC86, 0x1DAB,
- 0xEC87, 0xEC88, 0x1F6C, 0xEC89, 0xEC89, 0x1DAF, 0xEC8A, 0xEC90, 0x1F6E,
- 0xEC94, 0xEC99, 0x1F75, 0xEC9A, 0xEC9A, 0x1DBA, 0xEC9B, 0xEC9B, 0x1F7B,
- 0xEC9E, 0xEC9E, 0x1F7C, 0xECA7, 0xECB0, 0x1F7D, 0xECB2, 0xECC5, 0x1F87,
- 0xECC7, 0xECDA, 0x1D83, 0xECDB, 0xECDB, 0x1F9B, 0xECDC, 0xECE5, 0x1D97,
- 0xECE9, 0xECFC, 0x1F9C, 0xED40, 0xED59, 0x1FB0, 0xED64, 0xED64, 0x1F16,
- 0xED68, 0xED69, 0x1FCA, 0xED6A, 0xED6A, 0x1DC4, 0xED6B, 0xED6D, 0x1FCC,
- 0xED6E, 0xED6E, 0x1DC3, 0xED6F, 0xED73, 0x1FCF, 0xED74, 0xED74, 0x1DC2,
- 0xED75, 0xED78, 0x1FD4, 0xED7C, 0xED7E, 0x1FD8, 0xED80, 0xED8A, 0x1FDB,
- 0xED8F, 0xED9E, 0x1FE6, 0xEF40, 0xEF41, 0x1ECF, 0xEF42, 0xEF42, 0x204C,
- 0xEF43, 0xEF43, 0x2052, 0xEF44, 0xEF4D, 0x1ED1, 0xEF4E, 0xEF4E, 0x205A,
- 0xEF4F, 0xEF4F, 0x2053, 0xEF50, 0xEF50, 0x2058, 0xEF51, 0xEF51, 0x2055,
- 0xEF52, 0xEF63, 0x1EDB, 0xEF64, 0xEF79, 0x1EEE, 0xEF7A, 0xEF7B, 0x2048,
- 0xEF8D, 0xEF90, 0x02E0, 0xEF91, 0xEF94, 0x1FF6,
-};
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_Add_RKSJ_H_1[635 * 3] = {
+ 0x0020, 0x007E, 0x00E7, 0x00A0, 0x00DF, 0x0146, 0x8140, 0x817E, 0x0279,
+ 0x8180, 0x81AC, 0x02B8, 0x81B8, 0x81BF, 0x02E5, 0x81C8, 0x81CE, 0x02ED,
+ 0x81DA, 0x81E8, 0x02F4, 0x81F0, 0x81F7, 0x0303, 0x81FC, 0x81FC, 0x030B,
+ 0x824F, 0x8258, 0x030C, 0x8260, 0x8279, 0x0316, 0x8281, 0x829A, 0x0330,
+ 0x829F, 0x82F1, 0x034A, 0x82F2, 0x82F4, 0x1F16, 0x8340, 0x837E, 0x039D,
+ 0x8380, 0x8396, 0x03DC, 0x839F, 0x83B6, 0x03F3, 0x83BF, 0x83D6, 0x040B,
+ 0x8440, 0x8460, 0x0423, 0x8470, 0x847E, 0x0444, 0x8480, 0x8491, 0x0453,
+ 0x849F, 0x849F, 0x1D37, 0x84A0, 0x84A0, 0x1D39, 0x84A1, 0x84A1, 0x1D43,
+ 0x84A2, 0x84A2, 0x1D47, 0x84A3, 0x84A3, 0x1D4F, 0x84A4, 0x84A4, 0x1D4B,
+ 0x84A5, 0x84A5, 0x1D53, 0x84A6, 0x84A6, 0x1D63, 0x84A7, 0x84A7, 0x1D5B,
+ 0x84A8, 0x84A8, 0x1D6B, 0x84A9, 0x84A9, 0x1D73, 0x84AA, 0x84AA, 0x1D38,
+ 0x84AB, 0x84AB, 0x1D3A, 0x84AC, 0x84AC, 0x1D46, 0x84AD, 0x84AD, 0x1D4A,
+ 0x84AE, 0x84AE, 0x1D52, 0x84AF, 0x84AF, 0x1D4E, 0x84B0, 0x84B0, 0x1D5A,
+ 0x84B1, 0x84B1, 0x1D6A, 0x84B2, 0x84B2, 0x1D62, 0x84B3, 0x84B3, 0x1D72,
+ 0x84B4, 0x84B4, 0x1D82, 0x84B5, 0x84B5, 0x1D57, 0x84B6, 0x84B6, 0x1D66,
+ 0x84B7, 0x84B7, 0x1D5F, 0x84B8, 0x84B8, 0x1D6E, 0x84B9, 0x84B9, 0x1D76,
+ 0x84BA, 0x84BA, 0x1D54, 0x84BB, 0x84BB, 0x1D67, 0x84BC, 0x84BC, 0x1D5C,
+ 0x84BD, 0x84BD, 0x1D6F, 0x84BE, 0x84BE, 0x1D79, 0x889F, 0x889F, 0x0465,
+ 0x88A0, 0x88A0, 0x1DD1, 0x88A1, 0x88AF, 0x0467, 0x88B0, 0x88B0, 0x1F19,
+ 0x88B1, 0x88B8, 0x0477, 0x88B9, 0x88B9, 0x1DD2, 0x88BA, 0x88EB, 0x0480,
+ 0x88EC, 0x88EC, 0x1DD3, 0x88ED, 0x88EE, 0x04B3, 0x88EF, 0x88EF, 0x1F1A,
+ 0x88F0, 0x88F0, 0x04B6, 0x88F1, 0x88F1, 0x1DD4, 0x88F2, 0x88F9, 0x04B8,
+ 0x88FA, 0x88FA, 0x1DD5, 0x88FB, 0x88FC, 0x04C1, 0x8940, 0x8948, 0x04C3,
+ 0x8949, 0x8949, 0x1DD6, 0x894A, 0x8951, 0x04CD, 0x8952, 0x8952, 0x1F1B,
+ 0x8953, 0x8953, 0x04D6, 0x8954, 0x8954, 0x1DD7, 0x8955, 0x8957, 0x04D8,
+ 0x8958, 0x8958, 0x1F1C, 0x8959, 0x895B, 0x04DC, 0x895C, 0x895C, 0x1DDA,
+ 0x895D, 0x8960, 0x04E0, 0x8961, 0x8961, 0x1DDB, 0x8962, 0x897E, 0x04E5,
+ 0x8980, 0x898A, 0x0502, 0x898B, 0x898B, 0x1DDC, 0x898C, 0x89A5, 0x050E,
+ 0x89A6, 0x89A6, 0x1DDD, 0x89A7, 0x89A7, 0x0529, 0x89A8, 0x89A8, 0x1DDE,
+ 0x89A9, 0x89DD, 0x052B, 0x89DE, 0x89DE, 0x1DDF, 0x89DF, 0x89E4, 0x0561,
+ 0x89E5, 0x89E5, 0x1F1D, 0x89E6, 0x89F7, 0x0568, 0x89F8, 0x89F8, 0x1DE0,
+ 0x89F9, 0x89FC, 0x057B, 0x8A40, 0x8A40, 0x057F, 0x8A41, 0x8A41, 0x1DE2,
+ 0x8A42, 0x8A7E, 0x0581, 0x8A80, 0x8A8A, 0x05BE, 0x8A8B, 0x8A8B, 0x1DE4,
+ 0x8A8C, 0x8A92, 0x05CA, 0x8A93, 0x8A93, 0x1DE5, 0x8A94, 0x8A99, 0x05D2,
+ 0x8A9A, 0x8A9A, 0x1DE6, 0x8A9B, 0x8ABF, 0x05D9, 0x8AC0, 0x8AC0, 0x1DE7,
+ 0x8AC1, 0x8ACA, 0x05FF, 0x8ACB, 0x8ACB, 0x1DE8, 0x8ACC, 0x8AE2, 0x060A,
+ 0x8AE3, 0x8AE3, 0x1DE9, 0x8AE4, 0x8AFC, 0x0622, 0x8B40, 0x8B49, 0x063B,
+ 0x8B4A, 0x8B4A, 0x1DEA, 0x8B4B, 0x8B5E, 0x0646, 0x8B5F, 0x8B5F, 0x1DEB,
+ 0x8B60, 0x8B7E, 0x065B, 0x8B80, 0x8B81, 0x067A, 0x8B82, 0x8B82, 0x1F1E,
+ 0x8B83, 0x8B87, 0x067D, 0x8B88, 0x8B88, 0x1F1F, 0x8B89, 0x8B9F, 0x0683,
+ 0x8BA0, 0x8BA0, 0x1DEC, 0x8BA1, 0x8BA7, 0x069B, 0x8BA8, 0x8BA8, 0x1DED,
+ 0x8BA9, 0x8BBF, 0x06A3, 0x8BC0, 0x8BC0, 0x1F20, 0x8BC1, 0x8BCC, 0x06BB,
+ 0x8BCD, 0x8BCD, 0x1DEE, 0x8BCE, 0x8BEA, 0x06C8, 0x8BEB, 0x8BEB, 0x1DEF,
+ 0x8BEC, 0x8BF1, 0x06E6, 0x8BF2, 0x8BF2, 0x1DF0, 0x8BF3, 0x8BF8, 0x06ED,
+ 0x8BF9, 0x8BF9, 0x1DF1, 0x8BFA, 0x8BFA, 0x06F4, 0x8BFB, 0x8BFB, 0x1DF2,
+ 0x8BFC, 0x8BFC, 0x06F6, 0x8C40, 0x8C55, 0x06F7, 0x8C56, 0x8C56, 0x1DF4,
+ 0x8C57, 0x8C70, 0x070E, 0x8C71, 0x8C71, 0x1DF7, 0x8C72, 0x8C7E, 0x0729,
+ 0x8C80, 0x8C90, 0x0736, 0x8C91, 0x8C91, 0x1DFA, 0x8C92, 0x8C9C, 0x0748,
+ 0x8C9D, 0x8C9D, 0x1F21, 0x8C9E, 0x8C9E, 0x1DFC, 0x8C9F, 0x8CB1, 0x0755,
+ 0x8CB2, 0x8CB2, 0x1DFD, 0x8CB3, 0x8CBE, 0x0769, 0x8CBF, 0x8CBF, 0x1DFE,
+ 0x8CC0, 0x8CFC, 0x0776, 0x8D40, 0x8D49, 0x07B3, 0x8D4A, 0x8D4A, 0x1DFF,
+ 0x8D4B, 0x8D7E, 0x07BE, 0x8D80, 0x8D8C, 0x07F2, 0x8D8D, 0x8D8D, 0x1E02,
+ 0x8D8E, 0x8D93, 0x0800, 0x8D94, 0x8D94, 0x1E03, 0x8D95, 0x8D98, 0x0807,
+ 0x8D99, 0x8D99, 0x1E04, 0x8D9A, 0x8DD0, 0x080C, 0x8DD1, 0x8DD1, 0x1E05,
+ 0x8DD2, 0x8DE4, 0x0844, 0x8DE5, 0x8DE5, 0x1E06, 0x8DE6, 0x8DF1, 0x0858,
+ 0x8DF2, 0x8DF2, 0x1E07, 0x8DF3, 0x8DFC, 0x0865, 0x8E40, 0x8E45, 0x086F,
+ 0x8E46, 0x8E46, 0x1E08, 0x8E47, 0x8E48, 0x0876, 0x8E49, 0x8E49, 0x1E09,
+ 0x8E4A, 0x8E4A, 0x0879, 0x8E4B, 0x8E4B, 0x1E0A, 0x8E4C, 0x8E57, 0x087B,
+ 0x8E58, 0x8E58, 0x1E0B, 0x8E59, 0x8E5F, 0x0888, 0x8E60, 0x8E60, 0x1F22,
+ 0x8E61, 0x8E7E, 0x0890, 0x8E80, 0x8EC5, 0x08AE, 0x8EC6, 0x8EC6, 0x1E0D,
+ 0x8EC7, 0x8EDA, 0x08F5, 0x8EDB, 0x8EDC, 0x1E0F, 0x8EDD, 0x8EFC, 0x090B,
+ 0x8F40, 0x8F49, 0x092B, 0x8F4A, 0x8F4A, 0x1E11, 0x8F4B, 0x8F54, 0x0936,
+ 0x8F55, 0x8F55, 0x1E12, 0x8F56, 0x8F7E, 0x0941, 0x8F80, 0x8F8B, 0x096A,
+ 0x8F8C, 0x8F8C, 0x1E13, 0x8F8D, 0x8F91, 0x0977, 0x8F92, 0x8F93, 0x1E15,
+ 0x8F94, 0x8FA2, 0x097E, 0x8FA3, 0x8FA3, 0x1E17, 0x8FA4, 0x8FB0, 0x098E,
+ 0x8FB1, 0x8FB1, 0x1E18, 0x8FB2, 0x8FD2, 0x099C, 0x8FD3, 0x8FD3, 0x1E1A,
+ 0x8FD4, 0x8FDC, 0x09BE, 0x8FDD, 0x8FDD, 0x1E1B, 0x8FDE, 0x8FE1, 0x09C8,
+ 0x8FE2, 0x8FE2, 0x1E1C, 0x8FE3, 0x8FFC, 0x09CD, 0x9040, 0x9048, 0x09E7,
+ 0x9049, 0x9049, 0x1E1D, 0x904A, 0x9077, 0x09F1, 0x9078, 0x9078, 0x1F23,
+ 0x9079, 0x907E, 0x0A20, 0x9080, 0x9080, 0x1E1F, 0x9081, 0x909F, 0x0A27,
+ 0x90A0, 0x90A0, 0x1E21, 0x90A1, 0x90E3, 0x0A47, 0x90E4, 0x90E4, 0x1E23,
+ 0x90E5, 0x90EE, 0x0A8B, 0x90EF, 0x90EF, 0x1E24, 0x90F0, 0x90F6, 0x0A96,
+ 0x90F7, 0x90F7, 0x1E26, 0x90F8, 0x90F8, 0x1F24, 0x90F9, 0x90F9, 0x0A9F,
+ 0x90FA, 0x90FB, 0x1F25, 0x90FC, 0x90FC, 0x0AA2, 0x9140, 0x9145, 0x0AA3,
+ 0x9146, 0x9146, 0x1E28, 0x9147, 0x9157, 0x0AAA, 0x9158, 0x9158, 0x1E29,
+ 0x9159, 0x916A, 0x0ABC, 0x916B, 0x916B, 0x1E2A, 0x916C, 0x916D, 0x0ACF,
+ 0x916E, 0x916E, 0x1E2B, 0x916F, 0x917D, 0x0AD2, 0x917E, 0x917E, 0x1E2C,
+ 0x9180, 0x9188, 0x0AE2, 0x9189, 0x9189, 0x1E2D, 0x918A, 0x91B4, 0x0AEC,
+ 0x91B5, 0x91B5, 0x1F27, 0x91B6, 0x91BA, 0x0B18, 0x91BB, 0x91BB, 0x1E2E,
+ 0x91BC, 0x91CA, 0x0B1E, 0x91CB, 0x91CB, 0x1E2F, 0x91CC, 0x91D9, 0x0B2E,
+ 0x91DA, 0x91DA, 0x1E30, 0x91DB, 0x91E0, 0x0B3D, 0x91E1, 0x91E1, 0x1E31,
+ 0x91E2, 0x91EC, 0x0B44, 0x91ED, 0x91ED, 0x1E32, 0x91EE, 0x91FA, 0x0B50,
+ 0x91FB, 0x91FB, 0x1E35, 0x91FC, 0x91FC, 0x0B5E, 0x9240, 0x9245, 0x0B5F,
+ 0x9246, 0x9246, 0x1E36, 0x9247, 0x9247, 0x0B66, 0x9248, 0x9248, 0x1E37,
+ 0x9249, 0x924B, 0x0B68, 0x924C, 0x924D, 0x1E39, 0x924E, 0x925B, 0x0B6D,
+ 0x925C, 0x925C, 0x1E3B, 0x925D, 0x927E, 0x0B7C, 0x9280, 0x928F, 0x0B9E,
+ 0x9290, 0x9290, 0x1E3C, 0x9291, 0x9294, 0x0BAF, 0x9295, 0x9295, 0x1E3D,
+ 0x9296, 0x929B, 0x0BB4, 0x929C, 0x929C, 0x1E3E, 0x929D, 0x92BA, 0x0BBB,
+ 0x92BB, 0x92BB, 0x1E3F, 0x92BC, 0x92C5, 0x0BDA, 0x92C6, 0x92C6, 0x1E40,
+ 0x92C7, 0x92C7, 0x0BE5, 0x92C8, 0x92C8, 0x1E41, 0x92C9, 0x92CC, 0x0BE7,
+ 0x92CD, 0x92CD, 0x1E43, 0x92CE, 0x92FC, 0x0BEC, 0x9340, 0x9340, 0x0C1B,
+ 0x9341, 0x9341, 0x1E44, 0x9342, 0x9345, 0x0C1D, 0x9346, 0x9346, 0x1E45,
+ 0x9347, 0x934C, 0x0C22, 0x934D, 0x934D, 0x1E46, 0x934E, 0x9354, 0x0C29,
+ 0x9355, 0x9355, 0x1E47, 0x9356, 0x935D, 0x0C31, 0x935E, 0x935E, 0x1E48,
+ 0x935F, 0x9366, 0x0C3A, 0x9367, 0x9367, 0x1E49, 0x9368, 0x9369, 0x0C43,
+ 0x936A, 0x936A, 0x1E4A, 0x936B, 0x936F, 0x0C46, 0x9370, 0x9370, 0x1F28,
+ 0x9371, 0x9371, 0x1E4C, 0x9372, 0x937E, 0x0C4D, 0x9380, 0x9383, 0x0C5A,
+ 0x9384, 0x9384, 0x1E4D, 0x9385, 0x9397, 0x0C5F, 0x9398, 0x9398, 0x1E4E,
+ 0x9399, 0x93BF, 0x0C73, 0x93C0, 0x93C0, 0x1E50, 0x93C1, 0x93D1, 0x0C9B,
+ 0x93D2, 0x93D2, 0x1E51, 0x93D3, 0x93D8, 0x0CAD, 0x93D9, 0x93D9, 0x1E53,
+ 0x93DA, 0x93E3, 0x0CB4, 0x93E4, 0x93E5, 0x1E56, 0x93E6, 0x93E7, 0x0CC0,
+ 0x93E8, 0x93E8, 0x1E58, 0x93E9, 0x93F3, 0x0CC3, 0x93F4, 0x93F4, 0x1EC0,
+ 0x93F5, 0x93FC, 0x0CCF, 0x9440, 0x9447, 0x0CD7, 0x9448, 0x9448, 0x1E59,
+ 0x9449, 0x9449, 0x1F29, 0x944A, 0x9457, 0x0CE1, 0x9458, 0x9458, 0x1E5A,
+ 0x9459, 0x9475, 0x0CF0, 0x9476, 0x9476, 0x1E5B, 0x9477, 0x947E, 0x0D0E,
+ 0x9480, 0x9486, 0x0D16, 0x9487, 0x9487, 0x1E5C, 0x9488, 0x9488, 0x0D1E,
+ 0x9489, 0x9489, 0x1E5D, 0x948A, 0x948C, 0x0D20, 0x948D, 0x948D, 0x1E5E,
+ 0x948E, 0x94A1, 0x0D24, 0x94A2, 0x94A2, 0x1E5F, 0x94A3, 0x94AB, 0x0D39,
+ 0x94AC, 0x94AC, 0x1E60, 0x94AD, 0x94AD, 0x0D43, 0x94AE, 0x94AE, 0x1E61,
+ 0x94AF, 0x94BD, 0x0D45, 0x94BE, 0x94BE, 0x1F2A, 0x94BF, 0x94D1, 0x0D55,
+ 0x94D2, 0x94D2, 0x1E62, 0x94D3, 0x94F2, 0x0D69, 0x94F3, 0x94F3, 0x1E64,
+ 0x94F4, 0x94FC, 0x0D8A, 0x9540, 0x9540, 0x0D93, 0x9541, 0x9542, 0x1E65,
+ 0x9543, 0x954D, 0x0D96, 0x954E, 0x954E, 0x1E67, 0x954F, 0x9550, 0x0DA2,
+ 0x9551, 0x9551, 0x1E68, 0x9552, 0x9553, 0x0DA5, 0x9554, 0x9554, 0x1E69,
+ 0x9555, 0x955E, 0x0DA8, 0x955F, 0x955F, 0x1E6A, 0x9560, 0x956C, 0x0DB3,
+ 0x956D, 0x956D, 0x1E6B, 0x956E, 0x957E, 0x0DC1, 0x9580, 0x95C0, 0x0DD2,
+ 0x95C1, 0x95C1, 0x1E6D, 0x95C2, 0x95CA, 0x0E14, 0x95CB, 0x95CB, 0x1E6E,
+ 0x95CC, 0x95D0, 0x0E1E, 0x95D1, 0x95D1, 0x1F2B, 0x95D2, 0x95D7, 0x0E24,
+ 0x95D8, 0x95D8, 0x1E6F, 0x95D9, 0x95F6, 0x0E2B, 0x95F7, 0x95F7, 0x1E70,
+ 0x95F8, 0x95FC, 0x0E4A, 0x9640, 0x9647, 0x0E4F, 0x9648, 0x9648, 0x1E72,
+ 0x9649, 0x9669, 0x0E58, 0x966A, 0x966A, 0x1E73, 0x966B, 0x967E, 0x0E7A,
+ 0x9680, 0x968F, 0x0E8E, 0x9690, 0x9690, 0x1E74, 0x9691, 0x9697, 0x0E9F,
+ 0x9698, 0x9698, 0x1F2C, 0x9699, 0x96CA, 0x0EA7, 0x96CB, 0x96CB, 0x1E75,
+ 0x96CC, 0x96D6, 0x0EDA, 0x96D7, 0x96D7, 0x1E76, 0x96D8, 0x96DC, 0x0EE6,
+ 0x96DD, 0x96DD, 0x1E77, 0x96DE, 0x96DF, 0x0EEC, 0x96E0, 0x96E0, 0x1E78,
+ 0x96E1, 0x96F7, 0x0EEF, 0x96F8, 0x96F8, 0x1E79, 0x96F9, 0x96F9, 0x0F07,
+ 0x96FA, 0x96FA, 0x1E7A, 0x96FB, 0x96FC, 0x0F09, 0x9740, 0x9750, 0x0F0B,
+ 0x9751, 0x9751, 0x1E7C, 0x9752, 0x976E, 0x0F1D, 0x976F, 0x976F, 0x1E7D,
+ 0x9770, 0x9772, 0x0F3B, 0x9773, 0x9773, 0x1E7E, 0x9774, 0x977E, 0x0F3F,
+ 0x9780, 0x9788, 0x0F4A, 0x9789, 0x9789, 0x1E7F, 0x978A, 0x97F7, 0x0F54,
+ 0x97F8, 0x97F9, 0x1E81, 0x97FA, 0x97FA, 0x1F2D, 0x97FB, 0x97FC, 0x0FC5,
+ 0x9840, 0x9840, 0x1E83, 0x9841, 0x984F, 0x0FC8, 0x9850, 0x9850, 0x1E84,
+ 0x9851, 0x9857, 0x0FD8, 0x9858, 0x9858, 0x1E85, 0x9859, 0x9872, 0x0FE0,
+ 0x989F, 0x98FC, 0x0FFA, 0x9940, 0x9940, 0x1058, 0x9941, 0x9941, 0x1F2E,
+ 0x9942, 0x995B, 0x105A, 0x995C, 0x995C, 0x1E86, 0x995D, 0x996B, 0x1075,
+ 0x996C, 0x996C, 0x1E89, 0x996D, 0x997E, 0x1085, 0x9980, 0x99B5, 0x1097,
+ 0x99B6, 0x99B6, 0x1F2F, 0x99B7, 0x99FC, 0x10CE, 0x9A40, 0x9A4E, 0x1114,
+ 0x9A4F, 0x9A4F, 0x1E8A, 0x9A50, 0x9A58, 0x1124, 0x9A59, 0x9A59, 0x1E8B,
+ 0x9A5A, 0x9A66, 0x112E, 0x9A67, 0x9A67, 0x1F30, 0x9A68, 0x9A7C, 0x113C,
+ 0x9A7D, 0x9A7D, 0x1E8D, 0x9A7E, 0x9A7E, 0x1152, 0x9A80, 0x9A8A, 0x1153,
+ 0x9A8B, 0x9A8B, 0x1E8E, 0x9A8C, 0x9A8C, 0x1F31, 0x9A8D, 0x9AC1, 0x1160,
+ 0x9AC2, 0x9AC2, 0x1E8F, 0x9AC3, 0x9AC3, 0x1F32, 0x9AC4, 0x9AE9, 0x1197,
+ 0x9AEA, 0x9AEA, 0x1F33, 0x9AEB, 0x9AFC, 0x11BE, 0x9B40, 0x9B5B, 0x11D0,
+ 0x9B5C, 0x9B5C, 0x1E90, 0x9B5D, 0x9B7E, 0x11ED, 0x9B80, 0x9B82, 0x120F,
+ 0x9B83, 0x9B83, 0x1E91, 0x9B84, 0x9B97, 0x1213, 0x9B98, 0x9B98, 0x1F34,
+ 0x9B99, 0x9B9F, 0x1228, 0x9BA0, 0x9BA0, 0x1E92, 0x9BA1, 0x9BFA, 0x1230,
+ 0x9BFB, 0x9BFC, 0x1F35, 0x9C40, 0x9C7E, 0x128C, 0x9C80, 0x9CA1, 0x12CB,
+ 0x9CA2, 0x9CA2, 0x1E94, 0x9CA3, 0x9CFC, 0x12EE, 0x9D40, 0x9D46, 0x1348,
+ 0x9D47, 0x9D47, 0x1F37, 0x9D48, 0x9D7E, 0x1350, 0x9D80, 0x9D80, 0x1E95,
+ 0x9D81, 0x9D8B, 0x1388, 0x9D8C, 0x9D8C, 0x1E96, 0x9D8D, 0x9DB6, 0x1394,
+ 0x9DB7, 0x9DB7, 0x1E97, 0x9DB8, 0x9DF7, 0x13BF, 0x9DF8, 0x9DF8, 0x1F38,
+ 0x9DF9, 0x9DFC, 0x1400, 0x9E40, 0x9E63, 0x1404, 0x9E64, 0x9E64, 0x1E99,
+ 0x9E65, 0x9E7E, 0x1429, 0x9E80, 0x9E8A, 0x1443, 0x9E8B, 0x9E8B, 0x1E9B,
+ 0x9E8C, 0x9EFC, 0x144F, 0x9F40, 0x9F7E, 0x14C0, 0x9F80, 0x9F80, 0x14FF,
+ 0x9F81, 0x9F81, 0x1F39, 0x9F82, 0x9FCD, 0x1501, 0x9FCE, 0x9FCE, 0x1E9D,
+ 0x9FCF, 0x9FD3, 0x154E, 0x9FD4, 0x9FD4, 0x1F3A, 0x9FD5, 0x9FF3, 0x1554,
+ 0x9FF4, 0x9FF4, 0x1F3B, 0x9FF5, 0x9FFC, 0x1574, 0xE040, 0xE07E, 0x157C,
+ 0xE080, 0xE092, 0x15BB, 0xE093, 0xE093, 0x1E9E, 0xE094, 0xE0A3, 0x15CF,
+ 0xE0A4, 0xE0A4, 0x1E9F, 0xE0A5, 0xE0DC, 0x15E0, 0xE0DD, 0xE0DD, 0x1EA0,
+ 0xE0DE, 0xE0FC, 0x1619, 0xE140, 0xE149, 0x1638, 0xE14A, 0xE14A, 0x1EA1,
+ 0xE14B, 0xE17E, 0x1643, 0xE180, 0xE1EC, 0x1677, 0xE1ED, 0xE1ED, 0x1EA5,
+ 0xE1EE, 0xE1FC, 0x16E5, 0xE240, 0xE268, 0x16F4, 0xE269, 0xE269, 0x1EA6,
+ 0xE26A, 0xE272, 0x171E, 0xE273, 0xE273, 0x1EA7, 0xE274, 0xE277, 0x1728,
+ 0xE278, 0xE278, 0x1F3C, 0xE279, 0xE27E, 0x172D, 0xE280, 0xE2B6, 0x1733,
+ 0xE2B7, 0xE2B7, 0x1EA8, 0xE2B8, 0xE2BD, 0x176B, 0xE2BE, 0xE2BE, 0x1F3D,
+ 0xE2BF, 0xE2E1, 0x1772, 0xE2E2, 0xE2E2, 0x1EA9, 0xE2E3, 0xE2EB, 0x1796,
+ 0xE2EC, 0xE2EC, 0x1EAA, 0xE2ED, 0xE2FC, 0x17A0, 0xE340, 0xE357, 0x17B0,
+ 0xE358, 0xE358, 0x1EAB, 0xE359, 0xE359, 0x17C9, 0xE35A, 0xE35A, 0x1EAC,
+ 0xE35B, 0xE364, 0x17CB, 0xE365, 0xE365, 0x1EAD, 0xE366, 0xE37E, 0x17D6,
+ 0xE380, 0xE3C6, 0x17EF, 0xE3C7, 0xE3C7, 0x1F3E, 0xE3C8, 0xE3FC, 0x1837,
+ 0xE440, 0xE47E, 0x186C, 0xE480, 0xE483, 0x18AB, 0xE484, 0xE484, 0x1EAF,
+ 0xE485, 0xE488, 0x18B0, 0xE489, 0xE489, 0x1EB0, 0xE48A, 0xE491, 0x18B5,
+ 0xE492, 0xE492, 0x1EB1, 0xE493, 0xE4B8, 0x18BE, 0xE4B9, 0xE4B9, 0x1EB3,
+ 0xE4BA, 0xE4CA, 0x18E5, 0xE4CB, 0xE4CB, 0x1F3F, 0xE4CC, 0xE4FC, 0x18F7,
+ 0xE540, 0xE57E, 0x1928, 0xE580, 0xE59D, 0x1967, 0xE59E, 0xE59E, 0x1F40,
+ 0xE59F, 0xE5B9, 0x1986, 0xE5BA, 0xE5BB, 0x1F41, 0xE5BC, 0xE5EC, 0x19A3,
+ 0xE5ED, 0xE5ED, 0x1EB8, 0xE5EE, 0xE5FC, 0x19D5, 0xE640, 0xE650, 0x19E4,
+ 0xE651, 0xE651, 0x1EB9, 0xE652, 0xE67E, 0x19F6, 0xE680, 0xE685, 0x1A23,
+ 0xE686, 0xE686, 0x1EBA, 0xE687, 0xE6E6, 0x1A2A, 0xE6E7, 0xE6E7, 0x1EBC,
+ 0xE6E8, 0xE6FC, 0x1A8B, 0xE740, 0xE76C, 0x1AA0, 0xE76D, 0xE76D, 0x1EBE,
+ 0xE76E, 0xE77E, 0x1ACE, 0xE780, 0xE7A6, 0x1ADF, 0xE7A7, 0xE7A7, 0x1EC1,
+ 0xE7A8, 0xE7BA, 0x1B07, 0xE7BB, 0xE7BB, 0x1EC2, 0xE7BC, 0xE7FC, 0x1B1B,
+ 0xE840, 0xE87E, 0x1B5C, 0xE880, 0xE8CE, 0x1B9B, 0xE8CF, 0xE8CF, 0x1EC7,
+ 0xE8D0, 0xE8FC, 0x1BEB, 0xE940, 0xE977, 0x1C18, 0xE978, 0xE978, 0x1F43,
+ 0xE979, 0xE97E, 0x1C51, 0xE980, 0xE9AA, 0x1C57, 0xE9AB, 0xE9AB, 0x1ECA,
+ 0xE9AC, 0xE9B9, 0x1C83, 0xE9BA, 0xE9BA, 0x1ECB, 0xE9BB, 0xE9CB, 0x1C92,
+ 0xE9CC, 0xE9CC, 0x1ECC, 0xE9CD, 0xE9FC, 0x1CA4, 0xEA40, 0xEA6F, 0x1CD4,
+ 0xEA70, 0xEA70, 0x1ECD, 0xEA71, 0xEA71, 0x1F44, 0xEA72, 0xEA7E, 0x1D06,
+ 0xEA80, 0xEA9C, 0x1D13, 0xEA9D, 0xEA9D, 0x1ECE, 0xEA9E, 0xEAA2, 0x1D31,
+ 0xEAA3, 0xEAA4, 0x205C, 0xEC40, 0xEC42, 0x1F45, 0xEC46, 0xEC46, 0x1F48,
+ 0xEC47, 0xEC47, 0x0300, 0xEC48, 0xEC48, 0x02FA, 0xEC49, 0xEC49, 0x02F9,
+ 0xEC4D, 0xEC57, 0x1F49, 0xEC5B, 0xEC5D, 0x1DB1, 0xEC5E, 0xEC5E, 0x1F54,
+ 0xEC5F, 0xEC5F, 0x1DB7, 0xEC60, 0xEC62, 0x1F55, 0xEC63, 0xEC65, 0x1DB4,
+ 0xEC66, 0xEC6F, 0x1F58, 0xEC70, 0xEC70, 0x0303, 0xEC71, 0xEC71, 0x1F62,
+ 0xEC72, 0xEC72, 0x0304, 0xEC73, 0xEC74, 0x1F63, 0xEC76, 0xEC76, 0x1F65,
+ 0xEC78, 0xEC78, 0x1DA4, 0xEC79, 0xEC79, 0x1DA1, 0xEC7A, 0xEC7A, 0x1F66,
+ 0xEC7B, 0xEC7B, 0x1DA2, 0xEC7C, 0xEC7E, 0x1F67, 0xEC80, 0xEC80, 0x1DA6,
+ 0xEC81, 0xEC81, 0x1F6A, 0xEC82, 0xEC82, 0x1DA8, 0xEC83, 0xEC83, 0x1DAC,
+ 0xEC84, 0xEC84, 0x1F6B, 0xEC85, 0xEC85, 0x1DAE, 0xEC86, 0xEC86, 0x1DAB,
+ 0xEC87, 0xEC88, 0x1F6C, 0xEC89, 0xEC89, 0x1DAF, 0xEC8A, 0xEC90, 0x1F6E,
+ 0xEC94, 0xEC99, 0x1F75, 0xEC9A, 0xEC9A, 0x1DBA, 0xEC9B, 0xEC9B, 0x1F7B,
+ 0xEC9E, 0xEC9E, 0x1F7C, 0xECA7, 0xECB0, 0x1F7D, 0xECB2, 0xECC5, 0x1F87,
+ 0xECC7, 0xECDA, 0x1D83, 0xECDB, 0xECDB, 0x1F9B, 0xECDC, 0xECE5, 0x1D97,
+ 0xECE9, 0xECFC, 0x1F9C, 0xED40, 0xED59, 0x1FB0, 0xED64, 0xED64, 0x1F16,
+ 0xED68, 0xED69, 0x1FCA, 0xED6A, 0xED6A, 0x1DC4, 0xED6B, 0xED6D, 0x1FCC,
+ 0xED6E, 0xED6E, 0x1DC3, 0xED6F, 0xED73, 0x1FCF, 0xED74, 0xED74, 0x1DC2,
+ 0xED75, 0xED78, 0x1FD4, 0xED7C, 0xED7E, 0x1FD8, 0xED80, 0xED8A, 0x1FDB,
+ 0xED8F, 0xED9E, 0x1FE6, 0xEF40, 0xEF41, 0x1ECF, 0xEF42, 0xEF42, 0x204C,
+ 0xEF43, 0xEF43, 0x2052, 0xEF44, 0xEF4D, 0x1ED1, 0xEF4E, 0xEF4E, 0x205A,
+ 0xEF4F, 0xEF4F, 0x2053, 0xEF50, 0xEF50, 0x2058, 0xEF51, 0xEF51, 0x2055,
+ 0xEF52, 0xEF63, 0x1EDB, 0xEF64, 0xEF79, 0x1EEE, 0xEF7A, 0xEF7B, 0x2048,
+ 0xEF8D, 0xEF90, 0x02E0, 0xEF91, 0xEF94, 0x1FF6,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/Japan1/Add-RKSJ-V_1.cpp b/core/src/fpdfapi/fpdf_cmaps/Japan1/Add-RKSJ-V_1.cpp
index 8736184dbe..c855911293 100644
--- a/core/src/fpdfapi/fpdf_cmaps/Japan1/Add-RKSJ-V_1.cpp
+++ b/core/src/fpdfapi/fpdf_cmaps/Japan1/Add-RKSJ-V_1.cpp
@@ -1,27 +1,27 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-extern const unsigned short g_FXCMAP_Add_RKSJ_V_1[57 * 3] = {
- 0x8141, 0x8142, 0x1ECF, 0x8143, 0x8143, 0x204C, 0x8144, 0x8144, 0x2052,
- 0x8150, 0x8151, 0x1ED1, 0x815B, 0x815D, 0x1ED3, 0x8160, 0x8164, 0x1ED6,
- 0x8165, 0x8165, 0x205A, 0x8166, 0x8166, 0x2053, 0x8167, 0x8167, 0x2058,
- 0x8168, 0x8168, 0x2055, 0x8169, 0x817A, 0x1EDB, 0x829F, 0x829F, 0x1EEE,
- 0x82A1, 0x82A1, 0x1EEF, 0x82A3, 0x82A3, 0x1EF0, 0x82A5, 0x82A5, 0x1EF1,
- 0x82A7, 0x82A7, 0x1EF2, 0x82C1, 0x82C1, 0x1EF3, 0x82E1, 0x82E1, 0x1EF4,
- 0x82E3, 0x82E3, 0x1EF5, 0x82E5, 0x82E5, 0x1EF6, 0x82EC, 0x82EC, 0x1EF7,
- 0x82F3, 0x82F4, 0x2048, 0x8340, 0x8340, 0x1EF8, 0x8342, 0x8342, 0x1EF9,
- 0x8344, 0x8344, 0x1EFA, 0x8346, 0x8346, 0x1EFB, 0x8348, 0x8348, 0x1EFC,
- 0x8362, 0x8362, 0x1EFD, 0x8383, 0x8383, 0x1EFE, 0x8385, 0x8385, 0x1EFF,
- 0x8387, 0x8387, 0x1F00, 0x838E, 0x838E, 0x1F01, 0x8395, 0x8396, 0x1F02,
- 0xEC78, 0xEC78, 0x1F07, 0xEC79, 0xEC79, 0x1F04, 0xEC7A, 0xEC7A, 0x2089,
- 0xEC7B, 0xEC7B, 0x1F05, 0xEC7C, 0xEC7C, 0x208A, 0xEC7D, 0xEC7E, 0x2093,
- 0xEC80, 0xEC80, 0x1F09, 0xEC81, 0xEC81, 0x2092, 0xEC82, 0xEC82, 0x1F0B,
- 0xEC83, 0xEC83, 0x1F0F, 0xEC84, 0xEC84, 0x209C, 0xEC85, 0xEC85, 0x1F11,
- 0xEC86, 0xEC86, 0x1F0E, 0xEC87, 0xEC87, 0x2098, 0xEC88, 0xEC88, 0x209B,
- 0xEC89, 0xEC89, 0x1F12, 0xEC8A, 0xEC8A, 0x2097, 0xEC8B, 0xEC8C, 0x209D,
- 0xEC8D, 0xEC8D, 0x20A6, 0xEC8E, 0xEC8E, 0x20A5, 0xEC8F, 0xEC8F, 0x20A1,
- 0xEC90, 0xEC90, 0x20A4, 0xEC95, 0xEC95, 0x2084, 0xEF92, 0xEF92, 0x208D,
-};
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_Add_RKSJ_V_1[57 * 3] = {
+ 0x8141, 0x8142, 0x1ECF, 0x8143, 0x8143, 0x204C, 0x8144, 0x8144, 0x2052,
+ 0x8150, 0x8151, 0x1ED1, 0x815B, 0x815D, 0x1ED3, 0x8160, 0x8164, 0x1ED6,
+ 0x8165, 0x8165, 0x205A, 0x8166, 0x8166, 0x2053, 0x8167, 0x8167, 0x2058,
+ 0x8168, 0x8168, 0x2055, 0x8169, 0x817A, 0x1EDB, 0x829F, 0x829F, 0x1EEE,
+ 0x82A1, 0x82A1, 0x1EEF, 0x82A3, 0x82A3, 0x1EF0, 0x82A5, 0x82A5, 0x1EF1,
+ 0x82A7, 0x82A7, 0x1EF2, 0x82C1, 0x82C1, 0x1EF3, 0x82E1, 0x82E1, 0x1EF4,
+ 0x82E3, 0x82E3, 0x1EF5, 0x82E5, 0x82E5, 0x1EF6, 0x82EC, 0x82EC, 0x1EF7,
+ 0x82F3, 0x82F4, 0x2048, 0x8340, 0x8340, 0x1EF8, 0x8342, 0x8342, 0x1EF9,
+ 0x8344, 0x8344, 0x1EFA, 0x8346, 0x8346, 0x1EFB, 0x8348, 0x8348, 0x1EFC,
+ 0x8362, 0x8362, 0x1EFD, 0x8383, 0x8383, 0x1EFE, 0x8385, 0x8385, 0x1EFF,
+ 0x8387, 0x8387, 0x1F00, 0x838E, 0x838E, 0x1F01, 0x8395, 0x8396, 0x1F02,
+ 0xEC78, 0xEC78, 0x1F07, 0xEC79, 0xEC79, 0x1F04, 0xEC7A, 0xEC7A, 0x2089,
+ 0xEC7B, 0xEC7B, 0x1F05, 0xEC7C, 0xEC7C, 0x208A, 0xEC7D, 0xEC7E, 0x2093,
+ 0xEC80, 0xEC80, 0x1F09, 0xEC81, 0xEC81, 0x2092, 0xEC82, 0xEC82, 0x1F0B,
+ 0xEC83, 0xEC83, 0x1F0F, 0xEC84, 0xEC84, 0x209C, 0xEC85, 0xEC85, 0x1F11,
+ 0xEC86, 0xEC86, 0x1F0E, 0xEC87, 0xEC87, 0x2098, 0xEC88, 0xEC88, 0x209B,
+ 0xEC89, 0xEC89, 0x1F12, 0xEC8A, 0xEC8A, 0x2097, 0xEC8B, 0xEC8C, 0x209D,
+ 0xEC8D, 0xEC8D, 0x20A6, 0xEC8E, 0xEC8E, 0x20A5, 0xEC8F, 0xEC8F, 0x20A1,
+ 0xEC90, 0xEC90, 0x20A4, 0xEC95, 0xEC95, 0x2084, 0xEF92, 0xEF92, 0x208D,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/Japan1/Adobe-Japan1-UCS2_4.cpp b/core/src/fpdfapi/fpdf_cmaps/Japan1/Adobe-Japan1-UCS2_4.cpp
index e0080a1059..3454537273 100644
--- a/core/src/fpdfapi/fpdf_cmaps/Japan1/Adobe-Japan1-UCS2_4.cpp
+++ b/core/src/fpdfapi/fpdf_cmaps/Japan1/Adobe-Japan1-UCS2_4.cpp
@@ -1,1939 +1,1939 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-extern const unsigned short g_FXCMAP_Japan1CID2Unicode_4[15444] = {
- 0xFFFD, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026,
- 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E,
- 0x002F, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036,
- 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E,
- 0x003F, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046,
- 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E,
- 0x004F, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056,
- 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x00A5, 0x005D, 0x005E,
- 0x005F, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066,
- 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E,
- 0x006F, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076,
- 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x00A6, 0x007D, 0x0303,
- 0x02BC, 0x005C, 0x02BB, 0x007C, 0x007E, 0x00A1, 0x00A2, 0x00A3,
- 0x2044, 0x0192, 0x00A7, 0x00A4, 0x201C, 0x00AB, 0x2039, 0x203A,
- 0xFB01, 0xFB02, 0x2012, 0x2020, 0x2021, 0x00B7, 0x00B6, 0x2022,
- 0x201A, 0x201E, 0x201D, 0x00BB, 0x2026, 0x2030, 0x00BF, 0x0301,
- 0x0302, 0x00AF, 0x0306, 0x0307, 0x0308, 0x030A, 0x00B8, 0x030B,
- 0x0328, 0x030C, 0x0336, 0x00C6, 0x00AA, 0x0141, 0x00D8, 0x0152,
- 0x00BA, 0x00E6, 0x0131, 0x0142, 0x00F8, 0x0153, 0x00DF, 0x002D,
- 0x00A9, 0x00AC, 0x00AE, 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B5,
- 0x00B9, 0x00BC, 0x00BD, 0x00BE, 0x00C0, 0x00C1, 0x00C2, 0x00C3,
- 0x00C4, 0x00C5, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC,
- 0x00CD, 0x00CE, 0x00CF, 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4,
- 0x00D5, 0x00D6, 0x00D7, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD,
- 0x00DE, 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E7,
- 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,
- 0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7,
- 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF, 0x0160,
- 0x0178, 0x017D, 0x0305, 0x0161, 0x2122, 0x017E, 0x0030, 0x0020,
- 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028,
- 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, 0x0030,
- 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038,
- 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, 0x0040,
- 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048,
- 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050,
- 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058,
- 0x0059, 0x005A, 0x005B, 0x00A5, 0x005D, 0x005E, 0x005F, 0x0060,
- 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068,
- 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, 0x0070,
- 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078,
- 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x203E, 0xFF60, 0xFF61,
- 0xFF62, 0xFF63, 0xFF64, 0xFF65, 0xFF66, 0xFF67, 0xFF68, 0xFF69,
- 0xFF6A, 0xFF6B, 0xFF6C, 0xFF6D, 0xFF6E, 0xFF6F, 0xFF70, 0xFF71,
- 0xFF72, 0xFF73, 0xFF74, 0xFF75, 0xFF76, 0xFF77, 0xFF78, 0xFF79,
- 0xFF7A, 0xFF7B, 0xFF7C, 0xFF7D, 0xFF7E, 0xFF7F, 0xFF80, 0xFF81,
- 0xFF82, 0xFF83, 0xFF84, 0xFF85, 0xFF86, 0xFF87, 0xFF88, 0xFF89,
- 0xFF8A, 0xFF8B, 0xFF8C, 0xFF8D, 0xFF8E, 0xFF8F, 0xFF90, 0xFF91,
- 0xFF92, 0xFF93, 0xFF94, 0xFF95, 0xFF96, 0xFF97, 0xFF98, 0xFF99,
- 0xFF9A, 0xFF9B, 0xFF9C, 0xFF9D, 0xFF9E, 0xFF9F, 0xFF40, 0x30F0,
- 0x30F1, 0x30EE, 0x30AB, 0x30B1, 0x30F4, 0x30AC, 0x30AE, 0x30B0,
- 0x30B2, 0x30B4, 0x30B6, 0x30B8, 0x30BA, 0x30BC, 0x30BE, 0x30C0,
- 0x30C2, 0x30C5, 0x30C7, 0x30C9, 0x30D0, 0x30D1, 0x30D3, 0x30D4,
- 0x30D6, 0x30D7, 0x30D9, 0x30DA, 0x30DC, 0x30DD, 0xFF60, 0x301D,
- 0x301E, 0x2500, 0x2501, 0x2502, 0x2503, 0x2504, 0x2505, 0x2506,
- 0x2507, 0x2508, 0x2509, 0x250A, 0x250B, 0x250C, 0x250D, 0x250E,
- 0x250F, 0x2510, 0x2511, 0x2512, 0x2513, 0x2514, 0x2515, 0x2516,
- 0x2517, 0x2518, 0x2519, 0x251A, 0x251B, 0x251C, 0x251D, 0x251E,
- 0x251F, 0x2520, 0x2521, 0x2522, 0x2523, 0x2524, 0x2525, 0x2526,
- 0x2527, 0x2528, 0x2529, 0x252A, 0x252B, 0x252C, 0x252D, 0x252E,
- 0x252F, 0x2530, 0x2531, 0x2532, 0x2533, 0x2534, 0x2535, 0x2536,
- 0x2537, 0x2538, 0x2539, 0x253A, 0x253B, 0x253C, 0x253D, 0x253E,
- 0x253F, 0x2540, 0x2541, 0x2542, 0x2543, 0x2544, 0x2545, 0x2546,
- 0x2547, 0x2548, 0x2549, 0x254A, 0x254B, 0x2032, 0x00A8, 0x2036,
- 0x005B, 0x005D, 0x3008, 0x3009, 0x300A, 0x300B, 0x300E, 0x300F,
- 0x3010, 0x3011, 0x2012, 0xFF60, 0x3092, 0x3041, 0x3043, 0x3045,
- 0x3047, 0x3049, 0x3083, 0x3085, 0x3087, 0x3063, 0x3042, 0x3044,
- 0x3046, 0x3048, 0x304A, 0x304B, 0x304D, 0x304F, 0x3051, 0x3053,
- 0x3055, 0x3057, 0x3059, 0x305B, 0x305D, 0x305F, 0x3061, 0x3064,
- 0x3066, 0x3068, 0x306A, 0x306B, 0x306C, 0x306D, 0x306E, 0x306F,
- 0x3072, 0x3075, 0x3078, 0x307B, 0x307E, 0x307F, 0x3080, 0x3081,
- 0x3082, 0x3084, 0x3086, 0x3088, 0x3089, 0x308A, 0x308B, 0x308C,
- 0x308D, 0x308F, 0x3093, 0x3090, 0x3091, 0x308E, 0x304C, 0x304E,
- 0x3050, 0x3052, 0x3054, 0x3056, 0x3068, 0x305A, 0x305C, 0x305E,
- 0x3060, 0x3062, 0x3065, 0x3067, 0x3069, 0x3070, 0x3071, 0x3073,
- 0x3074, 0x3076, 0x3077, 0x3079, 0x307A, 0x307C, 0x307D, 0x00C4,
- 0x00F9, 0x00E9, 0x00ED, 0x00DF, 0x00E7, 0x00C7, 0x00D1, 0x00F1,
- 0x00A2, 0x00A3, 0x00F3, 0x00FA, 0x00A1, 0x00BF, 0x00BD, 0x00D6,
- 0x00DC, 0x00E4, 0x00EB, 0x00EF, 0x00F6, 0x00DC, 0x00E2, 0x00EA,
- 0x00EE, 0x00F4, 0x00FC, 0x00E0, 0x00E9, 0x25B2, 0x00E1, 0x007E,
- 0x0030, 0x3000, 0x3001, 0x3002, 0xFF0C, 0xFF0E, 0x30FB, 0xFF1A,
- 0xFF1B, 0xFF1F, 0xFF01, 0x309B, 0x309C, 0x00B4, 0xFF40, 0x00A8,
- 0xFF3E, 0x203E, 0xFF3F, 0x30FD, 0x30FE, 0x309D, 0x309E, 0x3003,
- 0x4EDD, 0x3005, 0x3006, 0x3007, 0x30FC, 0x2015, 0x2010, 0xFF0F,
- 0xFF3C, 0xFF5E, 0x2016, 0xFF5C, 0x2026, 0x2025, 0x2018, 0x2019,
- 0x201C, 0x201D, 0xFF08, 0xFF09, 0x3014, 0x3015, 0xFF3B, 0xFF3D,
- 0xFF5B, 0xFF5D, 0x3008, 0x3009, 0x300A, 0x300B, 0x300C, 0x300D,
- 0x300E, 0x300F, 0x3010, 0x3011, 0xFF0B, 0xFF0D, 0x00B1, 0x00D7,
- 0x00F7, 0xFF1D, 0x2260, 0xFF1C, 0xFF1E, 0x2266, 0x2267, 0x221E,
- 0x2234, 0x2642, 0x2640, 0x00B0, 0x2032, 0x2033, 0x2103, 0xFFE5,
- 0xFF04, 0x00A2, 0x00A3, 0xFF05, 0xFF03, 0xFF06, 0xFF0A, 0xFF20,
- 0x00A7, 0x2606, 0x2605, 0x25CB, 0x25CF, 0x25CE, 0x25C7, 0x25C6,
- 0x25A1, 0x25A0, 0x25B3, 0x25B2, 0x25BD, 0x25BC, 0x203B, 0x3012,
- 0x2192, 0x2190, 0x2191, 0x2193, 0x3013, 0x2208, 0x220B, 0x2286,
- 0x2287, 0x2282, 0x2283, 0x222A, 0x2229, 0x2227, 0x2228, 0x00AC,
- 0x21D2, 0x21D4, 0x2200, 0x2203, 0x2220, 0x22A5, 0x2312, 0x2202,
- 0x2207, 0x2261, 0x2252, 0x226A, 0x226B, 0x221A, 0x223D, 0x221D,
- 0x2235, 0x222B, 0x222C, 0x212B, 0x2030, 0x266F, 0x266D, 0x266A,
- 0x2020, 0x2021, 0x00B6, 0x25EF, 0xFF10, 0xFF11, 0xFF12, 0xFF13,
- 0xFF14, 0xFF15, 0xFF16, 0xFF17, 0xFF18, 0xFF19, 0xFF21, 0xFF22,
- 0xFF23, 0xFF24, 0xFF25, 0xFF26, 0xFF27, 0xFF28, 0xFF29, 0xFF2A,
- 0xFF2B, 0xFF2C, 0xFF2D, 0xFF2E, 0xFF2F, 0xFF30, 0xFF31, 0xFF32,
- 0xFF33, 0xFF34, 0xFF35, 0xFF36, 0xFF37, 0xFF38, 0xFF39, 0xFF3A,
- 0xFF41, 0xFF42, 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, 0xFF48,
- 0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F, 0xFF50,
- 0xFF51, 0xFF52, 0xFF53, 0xFF54, 0xFF55, 0xFF56, 0xFF57, 0xFF58,
- 0xFF59, 0xFF5A, 0x3041, 0x3042, 0x3043, 0x3044, 0x3045, 0x3046,
- 0x3047, 0x3048, 0x3049, 0x304A, 0x304B, 0x304C, 0x304D, 0x304E,
- 0x304F, 0x3050, 0x3051, 0x3052, 0x3053, 0x3054, 0x3055, 0x3056,
- 0x3057, 0x3058, 0x3059, 0x305A, 0x305B, 0x305C, 0x305D, 0x305E,
- 0x305F, 0x3060, 0x3061, 0x3062, 0x3063, 0x3064, 0x3065, 0x3066,
- 0x3067, 0x3068, 0x3069, 0x306A, 0x306B, 0x306C, 0x306D, 0x306E,
- 0x306F, 0x3070, 0x3071, 0x3072, 0x3073, 0x3074, 0x3075, 0x3076,
- 0x3077, 0x3078, 0x3079, 0x307A, 0x307B, 0x307C, 0x307D, 0x307E,
- 0x307F, 0x3080, 0x3081, 0x3082, 0x3083, 0x3084, 0x3085, 0x3086,
- 0x3087, 0x3088, 0x3089, 0x308A, 0x308B, 0x308C, 0x308D, 0x308E,
- 0x308F, 0x3090, 0x3091, 0x3092, 0x3093, 0x30A1, 0x30A2, 0x30A3,
- 0x30A4, 0x30A5, 0x30A6, 0x30A7, 0x30A8, 0x30A9, 0x30AA, 0x30AB,
- 0x30AC, 0x30AD, 0x30AE, 0x30AF, 0x30B0, 0x30B1, 0x30B2, 0x30B3,
- 0x30B4, 0x30B5, 0x30B6, 0x30B7, 0x30B8, 0x30B9, 0x30BA, 0x30BB,
- 0x30BC, 0x30BD, 0x30BE, 0x30BF, 0x30C0, 0x30C1, 0x30C2, 0x30C3,
- 0x30C4, 0x30C5, 0x30C6, 0x30C7, 0x30C8, 0x30C9, 0x30CA, 0x30CB,
- 0x30CC, 0x30CD, 0x30CE, 0x30CF, 0x30D0, 0x30D1, 0x30D2, 0x30D3,
- 0x30D4, 0x30D5, 0x30D6, 0x30D7, 0x30D8, 0x30D9, 0x30DA, 0x30DB,
- 0x30DC, 0x30DD, 0x30DE, 0x30DF, 0x30E0, 0x30E1, 0x30E2, 0x30E3,
- 0x30E4, 0x30E5, 0x30E6, 0x30E7, 0x30E8, 0x30E9, 0x30EA, 0x30EB,
- 0x30EC, 0x30ED, 0x30EE, 0x30EF, 0x30F0, 0x30F1, 0x30F2, 0x30F3,
- 0x30F4, 0x30F5, 0x30F6, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395,
- 0x0396, 0x0397, 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D,
- 0x039E, 0x039F, 0x03A0, 0x03A1, 0x03A3, 0x03A4, 0x03A5, 0x03A6,
- 0x03A7, 0x03A8, 0x03A9, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5,
- 0x03B6, 0x03B7, 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD,
- 0x03BE, 0x03BF, 0x03C0, 0x03C1, 0x03C3, 0x03C4, 0x03C5, 0x03C6,
- 0x03C7, 0x03C8, 0x03C9, 0x0410, 0x0411, 0x0412, 0x0413, 0x0414,
- 0x0415, 0x0401, 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, 0x041B,
- 0x041C, 0x041D, 0x041E, 0x041F, 0x0420, 0x0421, 0x0422, 0x0423,
- 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, 0x042B,
- 0x042C, 0x042D, 0x042E, 0x042F, 0x0430, 0x0431, 0x0432, 0x0433,
- 0x0434, 0x0435, 0x0451, 0x0436, 0x0437, 0x0438, 0x0439, 0x043A,
- 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, 0x0440, 0x0441, 0x0442,
- 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044A,
- 0x044B, 0x044C, 0x044D, 0x044E, 0x044F, 0x4E9C, 0x5516, 0x5A03,
- 0x963F, 0x54C0, 0x611B, 0x6328, 0x59F6, 0x9022, 0x8475, 0x831C,
- 0x7A50, 0x60AA, 0x63E1, 0x6E25, 0x65ED, 0x8466, 0x82A6, 0x9BF5,
- 0x6893, 0x5727, 0x65A1, 0x6271, 0x5B9B, 0x59D0, 0x867B, 0x98F4,
- 0x7D62, 0x7DBE, 0x9B8E, 0x6216, 0x7C9F, 0x88B7, 0x5B89, 0x5EB5,
- 0x6309, 0x6697, 0x6848, 0x95C7, 0x978D, 0x674F, 0x4EE5, 0x4F0A,
- 0x4F4D, 0x4F9D, 0x5049, 0x56F2, 0x5937, 0x59D4, 0x5A01, 0x5C09,
- 0x60DF, 0x610F, 0x6170, 0x6613, 0x6905, 0x70BA, 0x754F, 0x7570,
- 0x79FB, 0x7DAD, 0x7DEF, 0x80C3, 0x840E, 0x8863, 0x8B02, 0x9055,
- 0x907A, 0x533B, 0x4E95, 0x4EA5, 0x57DF, 0x80B2, 0x90C1, 0x78EF,
- 0x4E00, 0x58F1, 0x6EA2, 0x9038, 0x7A32, 0x8328, 0x828B, 0x9C2F,
- 0x5141, 0x5370, 0x54BD, 0x54E1, 0x56E0, 0x59FB, 0x5F15, 0x98F2,
- 0x6DEB, 0x80E4, 0x852D, 0x9662, 0x9670, 0x96A0, 0x97FB, 0x540B,
- 0x53F3, 0x5B87, 0x70CF, 0x7FBD, 0x8FC2, 0x96E8, 0x536F, 0x9D5C,
- 0x7ABA, 0x4E11, 0x7893, 0x81FC, 0x6E26, 0x5618, 0x5504, 0x6B1D,
- 0x851A, 0x9C3B, 0x59E5, 0x53A9, 0x6D66, 0x74DC, 0x958F, 0x5642,
- 0x4E91, 0x904B, 0x96F2, 0x834F, 0x990C, 0x53E1, 0x55B6, 0x5B30,
- 0x5F71, 0x6620, 0x66F3, 0x6804, 0x6C38, 0x6CF3, 0x6D29, 0x745B,
- 0x76C8, 0x7A4E, 0x9834, 0x82F1, 0x885B, 0x8A60, 0x92ED, 0x6DB2,
- 0x75AB, 0x76CA, 0x99C5, 0x60A6, 0x8B01, 0x8D8A, 0x95B2, 0x698E,
- 0x53AD, 0x5186, 0x5712, 0x5830, 0x5944, 0x5BB4, 0x5EF6, 0x6028,
- 0x63A9, 0x63F4, 0x6CBF, 0x6F14, 0x708E, 0x7114, 0x7159, 0x71D5,
- 0x733F, 0x7E01, 0x8276, 0x82D1, 0x8597, 0x9060, 0x925B, 0x9D1B,
- 0x5869, 0x65BC, 0x6C5A, 0x7525, 0x51F9, 0x592E, 0x5965, 0x5F80,
- 0x5FDC, 0x62BC, 0x65FA, 0x6A2A, 0x6B27, 0x6BB4, 0x738B, 0x7FC1,
- 0x8956, 0x9D2C, 0x9D0E, 0x9EC4, 0x5CA1, 0x6C96, 0x837B, 0x5104,
- 0x5C4B, 0x61B6, 0x81C6, 0x6876, 0x7261, 0x4E59, 0x4FFA, 0x5378,
- 0x6069, 0x6E29, 0x7A4F, 0x97F3, 0x4E0B, 0x5316, 0x4EEE, 0x4F55,
- 0x4F3D, 0x4FA1, 0x4F73, 0x52A0, 0x53EF, 0x5609, 0x590F, 0x5AC1,
- 0x5BB6, 0x5BE1, 0x79D1, 0x6687, 0x679C, 0x67B6, 0x6B4C, 0x6CB3,
- 0x706B, 0x73C2, 0x798D, 0x79BE, 0x7A3C, 0x7B87, 0x82B1, 0x82DB,
- 0x8304, 0x8377, 0x83EF, 0x83D3, 0x8766, 0x8AB2, 0x5629, 0x8CA8,
- 0x8FE6, 0x904E, 0x971E, 0x868A, 0x4FC4, 0x5CE8, 0x6211, 0x7259,
- 0x753B, 0x81E5, 0x82BD, 0x86FE, 0x8CC0, 0x96C5, 0x9913, 0x99D5,
- 0x4ECB, 0x4F1A, 0x89E3, 0x56DE, 0x584A, 0x58CA, 0x5EFB, 0x5FEB,
- 0x602A, 0x6094, 0x6062, 0x61D0, 0x6212, 0x62D0, 0x6539, 0x9B41,
- 0x6666, 0x68B0, 0x6D77, 0x7070, 0x754C, 0x7686, 0x7D75, 0x82A5,
- 0x87F9, 0x958B, 0x968E, 0x8C9D, 0x51F1, 0x52BE, 0x5916, 0x54B3,
- 0x5BB3, 0x5D16, 0x6168, 0x6982, 0x6DAF, 0x788D, 0x84CB, 0x8857,
- 0x8A72, 0x93A7, 0x9AB8, 0x6D6C, 0x99A8, 0x86D9, 0x57A3, 0x67FF,
- 0x86CE, 0x920E, 0x5283, 0x5687, 0x5404, 0x5ED3, 0x62E1, 0x64B9,
- 0x683C, 0x6838, 0x6BBB, 0x7372, 0x78BA, 0x7A6B, 0x899A, 0x89D2,
- 0x8D6B, 0x8F03, 0x90ED, 0x95A3, 0x9694, 0x9769, 0x5B66, 0x5CB3,
- 0x697D, 0x984D, 0x984E, 0x639B, 0x7B20, 0x6A2B, 0x6A7F, 0x68B6,
- 0x9C0D, 0x6F5F, 0x5272, 0x559D, 0x6070, 0x62EC, 0x6D3B, 0x6E07,
- 0x6ED1, 0x845B, 0x8910, 0x8F44, 0x4E14, 0x9C39, 0x53F6, 0x691B,
- 0x6A3A, 0x9784, 0x682A, 0x515C, 0x7AC3, 0x84B2, 0x91DC, 0x938C,
- 0x565B, 0x9D28, 0x6822, 0x8305, 0x8431, 0x7CA5, 0x5208, 0x82C5,
- 0x74E6, 0x4E7E, 0x4F83, 0x51A0, 0x5BD2, 0x520A, 0x52D8, 0x52E7,
- 0x5DFB, 0x559A, 0x582A, 0x59E6, 0x5B8C, 0x5B98, 0x5BDB, 0x5E72,
- 0x5E79, 0x60A3, 0x611F, 0x6163, 0x61BE, 0x63DB, 0x6562, 0x67D1,
- 0x6853, 0x68FA, 0x6B3E, 0x6B53, 0x6C57, 0x6F22, 0x6F97, 0x6F45,
- 0x74B0, 0x7518, 0x76E3, 0x770B, 0x7AFF, 0x7BA1, 0x7C21, 0x7DE9,
- 0x7F36, 0x7FF0, 0x809D, 0x8266, 0x839E, 0x89B3, 0x8ACC, 0x8CAB,
- 0x9084, 0x9451, 0x9593, 0x9591, 0x95A2, 0x9665, 0x97D3, 0x9928,
- 0x8218, 0x4E38, 0x542B, 0x5CB8, 0x5DCC, 0x73A9, 0x764C, 0x773C,
- 0x5CA9, 0x7FEB, 0x8D0B, 0x96C1, 0x9811, 0x9854, 0x9858, 0x4F01,
- 0x4F0E, 0x5371, 0x559C, 0x5668, 0x57FA, 0x5947, 0x5B09, 0x5BC4,
- 0x5C90, 0x5E0C, 0x5E7E, 0x5FCC, 0x63EE, 0x673A, 0x65D7, 0x65E2,
- 0x671F, 0x68CB, 0x68C4, 0x6A5F, 0x5E30, 0x6BC5, 0x6C17, 0x6C7D,
- 0x757F, 0x7948, 0x5B63, 0x7A00, 0x7D00, 0x5FBD, 0x898F, 0x8A18,
- 0x8CB4, 0x8D77, 0x8ECC, 0x8F1D, 0x98E2, 0x9A0E, 0x9B3C, 0x4E80,
- 0x507D, 0x5100, 0x5993, 0x5B9C, 0x622F, 0x6280, 0x64EC, 0x6B3A,
- 0x72A0, 0x7591, 0x7947, 0x7FA9, 0x87FB, 0x8ABC, 0x8B70, 0x63AC,
- 0x83CA, 0x97A0, 0x5409, 0x5403, 0x55AB, 0x6854, 0x6A58, 0x8A70,
- 0x7827, 0x6775, 0x9ECD, 0x5374, 0x5BA2, 0x811A, 0x8650, 0x9006,
- 0x4E18, 0x4E45, 0x4EC7, 0x4F11, 0x53CA, 0x5438, 0x5BAE, 0x5F13,
- 0x6025, 0x6551, 0x673D, 0x6C42, 0x6C72, 0x6CE3, 0x7078, 0x7403,
- 0x7A76, 0x7AAE, 0x7B08, 0x7D1A, 0x7CFE, 0x7D66, 0x65E7, 0x725B,
- 0x53BB, 0x5C45, 0x5DE8, 0x62D2, 0x62E0, 0x6319, 0x6E20, 0x865A,
- 0x8A31, 0x8DDD, 0x92F8, 0x6F01, 0x79A6, 0x9B5A, 0x4EA8, 0x4EAB,
- 0x4EAC, 0x4F9B, 0x4FA0, 0x50D1, 0x5147, 0x7AF6, 0x5171, 0x51F6,
- 0x5354, 0x5321, 0x537F, 0x53EB, 0x55AC, 0x5883, 0x5CE1, 0x5F37,
- 0x5F4A, 0x602F, 0x6050, 0x606D, 0x631F, 0x6559, 0x6A4B, 0x6CC1,
- 0x72C2, 0x72ED, 0x77EF, 0x80F8, 0x8105, 0x8208, 0x854E, 0x90F7,
- 0x93E1, 0x97FF, 0x9957, 0x9A5A, 0x4EF0, 0x51DD, 0x5C2D, 0x6681,
- 0x696D, 0x5C40, 0x66F2, 0x6975, 0x7389, 0x6850, 0x7C81, 0x50C5,
- 0x52E4, 0x5747, 0x5DFE, 0x9326, 0x65A4, 0x6B23, 0x6B3D, 0x7434,
- 0x7981, 0x79BD, 0x7B4B, 0x7DCA, 0x82B9, 0x83CC, 0x887F, 0x895F,
- 0x8B39, 0x8FD1, 0x91D1, 0x541F, 0x9280, 0x4E5D, 0x5036, 0x53E5,
- 0x533A, 0x72D7, 0x7396, 0x77E9, 0x82E6, 0x8EAF, 0x99C6, 0x99C8,
- 0x99D2, 0x5177, 0x611A, 0x865E, 0x55B0, 0x7A7A, 0x5076, 0x5BD3,
- 0x9047, 0x9685, 0x4E32, 0x6ADB, 0x91E7, 0x5C51, 0x5C48, 0x6398,
- 0x7A9F, 0x6C93, 0x9774, 0x8F61, 0x7AAA, 0x718A, 0x9688, 0x7C82,
- 0x6817, 0x7E70, 0x6851, 0x936C, 0x52F2, 0x541B, 0x85AB, 0x8A13,
- 0x7FA4, 0x8ECD, 0x90E1, 0x5366, 0x8888, 0x7941, 0x4FC2, 0x50BE,
- 0x5211, 0x5144, 0x5553, 0x572D, 0x73EA, 0x578B, 0x5951, 0x5F62,
- 0x5F84, 0x6075, 0x6176, 0x6167, 0x61A9, 0x63B2, 0x643A, 0x656C,
- 0x666F, 0x6842, 0x6E13, 0x7566, 0x7A3D, 0x7CFB, 0x7D4C, 0x7D99,
- 0x7E4B, 0x7F6B, 0x830E, 0x834A, 0x86CD, 0x8A08, 0x8A63, 0x8B66,
- 0x8EFD, 0x981A, 0x9D8F, 0x82B8, 0x8FCE, 0x9BE8, 0x5287, 0x621F,
- 0x6483, 0x6FC0, 0x9699, 0x6841, 0x5091, 0x6B20, 0x6C7A, 0x6F54,
- 0x7A74, 0x7D50, 0x8840, 0x8A23, 0x6708, 0x4EF6, 0x5039, 0x5026,
- 0x5065, 0x517C, 0x5238, 0x5263, 0x55A7, 0x570F, 0x5805, 0x5ACC,
- 0x5EFA, 0x61B2, 0x61F8, 0x62F3, 0x6372, 0x691C, 0x6A29, 0x727D,
- 0x72AC, 0x732E, 0x7814, 0x786F, 0x7D79, 0x770C, 0x80A9, 0x898B,
- 0x8B19, 0x8CE2, 0x8ED2, 0x9063, 0x9375, 0x967A, 0x9855, 0x9A13,
- 0x9E78, 0x5143, 0x539F, 0x53B3, 0x5E7B, 0x5F26, 0x6E1B, 0x6E90,
- 0x7384, 0x73FE, 0x7D43, 0x8237, 0x8A00, 0x8AFA, 0x9650, 0x4E4E,
- 0x500B, 0x53E4, 0x547C, 0x56FA, 0x59D1, 0x5B64, 0x5DF1, 0x5EAB,
- 0x5F27, 0x6238, 0x6545, 0x67AF, 0x6E56, 0x72D0, 0x7CCA, 0x88B4,
- 0x80A1, 0x80E1, 0x83F0, 0x864E, 0x8A87, 0x8DE8, 0x9237, 0x96C7,
- 0x9867, 0x9F13, 0x4E94, 0x4E92, 0x4F0D, 0x5348, 0x5449, 0x543E,
- 0x5A2F, 0x5F8C, 0x5FA1, 0x609F, 0x68A7, 0x6A8E, 0x745A, 0x7881,
- 0x8A9E, 0x8AA4, 0x8B77, 0x9190, 0x4E5E, 0x9BC9, 0x4EA4, 0x4F7C,
- 0x4FAF, 0x5019, 0x5016, 0x5149, 0x516C, 0x529F, 0x52B9, 0x52FE,
- 0x539A, 0x53E3, 0x5411, 0x540E, 0x5589, 0x5751, 0x57A2, 0x597D,
- 0x5B54, 0x5B5D, 0x5B8F, 0x5DE5, 0x5DE7, 0x5DF7, 0x5E78, 0x5E83,
- 0x5E9A, 0x5EB7, 0x5F18, 0x6052, 0x614C, 0x6297, 0x62D8, 0x63A7,
- 0x653B, 0x6602, 0x6643, 0x66F4, 0x676D, 0x6821, 0x6897, 0x69CB,
- 0x6C5F, 0x6D2A, 0x6D69, 0x6E2F, 0x6E9D, 0x7532, 0x7687, 0x786C,
- 0x7A3F, 0x7CE0, 0x7D05, 0x7D18, 0x7D5E, 0x7DB1, 0x8015, 0x8003,
- 0x80AF, 0x80B1, 0x8154, 0x818F, 0x822A, 0x8352, 0x884C, 0x8861,
- 0x8B1B, 0x8CA2, 0x8CFC, 0x90CA, 0x9175, 0x9271, 0x783F, 0x92FC,
- 0x95A4, 0x964D, 0x9805, 0x9999, 0x9AD8, 0x9D3B, 0x525B, 0x52AB,
- 0x53F7, 0x5408, 0x58D5, 0x62F7, 0x6FE0, 0x8C6A, 0x8F5F, 0x9EB9,
- 0x514B, 0x523B, 0x544A, 0x56FD, 0x7A40, 0x9177, 0x9D60, 0x9ED2,
- 0x7344, 0x6F09, 0x8170, 0x7511, 0x5FFD, 0x60DA, 0x9AA8, 0x72DB,
- 0x8FBC, 0x6B64, 0x9803, 0x4ECA, 0x56F0, 0x5764, 0x58BE, 0x5A5A,
- 0x6068, 0x61C7, 0x660F, 0x6606, 0x6839, 0x68B1, 0x6DF7, 0x75D5,
- 0x7D3A, 0x826E, 0x9B42, 0x4E9B, 0x4F50, 0x53C9, 0x5506, 0x5D6F,
- 0x5DE6, 0x5DEE, 0x67FB, 0x6C99, 0x7473, 0x7802, 0x8A50, 0x9396,
- 0x88DF, 0x5750, 0x5EA7, 0x632B, 0x50B5, 0x50AC, 0x518D, 0x6700,
- 0x54C9, 0x585E, 0x59BB, 0x5BB0, 0x5F69, 0x624D, 0x63A1, 0x683D,
- 0x6B73, 0x6E08, 0x707D, 0x91C7, 0x7280, 0x7815, 0x7826, 0x796D,
- 0x658E, 0x7D30, 0x83DC, 0x88C1, 0x8F09, 0x969B, 0x5264, 0x5728,
- 0x6750, 0x7F6A, 0x8CA1, 0x51B4, 0x5742, 0x962A, 0x583A, 0x698A,
- 0x80B4, 0x54B2, 0x5D0E, 0x57FC, 0x7895, 0x9DFA, 0x4F5C, 0x524A,
- 0x548B, 0x643E, 0x6628, 0x6714, 0x67F5, 0x7A84, 0x7B56, 0x7D22,
- 0x932F, 0x685C, 0x9BAD, 0x7B39, 0x5319, 0x518A, 0x5237, 0x5BDF,
- 0x62F6, 0x64AE, 0x64E6, 0x672D, 0x6BBA, 0x85A9, 0x96D1, 0x7690,
- 0x9BD6, 0x634C, 0x9306, 0x9BAB, 0x76BF, 0x6652, 0x4E09, 0x5098,
- 0x53C2, 0x5C71, 0x60E8, 0x6492, 0x6563, 0x685F, 0x71E6, 0x73CA,
- 0x7523, 0x7B97, 0x7E82, 0x8695, 0x8B83, 0x8CDB, 0x9178, 0x9910,
- 0x65AC, 0x66AB, 0x6B8B, 0x4ED5, 0x4ED4, 0x4F3A, 0x4F7F, 0x523A,
- 0x53F8, 0x53F2, 0x55E3, 0x56DB, 0x58EB, 0x59CB, 0x59C9, 0x59FF,
- 0x5B50, 0x5C4D, 0x5E02, 0x5E2B, 0x5FD7, 0x601D, 0x6307, 0x652F,
- 0x5B5C, 0x65AF, 0x65BD, 0x65E8, 0x679D, 0x6B62, 0x6B7B, 0x6C0F,
- 0x7345, 0x7949, 0x79C1, 0x7CF8, 0x7D19, 0x7D2B, 0x80A2, 0x8102,
- 0x81F3, 0x8996, 0x8A5E, 0x8A69, 0x8A66, 0x8A8C, 0x8AEE, 0x8CC7,
- 0x8CDC, 0x96CC, 0x98FC, 0x6B6F, 0x4E8B, 0x4F3C, 0x4F8D, 0x5150,
- 0x5B57, 0x5BFA, 0x6148, 0x6301, 0x6642, 0x6B21, 0x6ECB, 0x6CBB,
- 0x723E, 0x74BD, 0x75D4, 0x78C1, 0x793A, 0x800C, 0x8033, 0x81EA,
- 0x8494, 0x8F9E, 0x6C50, 0x9E7F, 0x5F0F, 0x8B58, 0x9D2B, 0x7AFA,
- 0x8EF8, 0x5B8D, 0x96EB, 0x4E03, 0x53F1, 0x57F7, 0x5931, 0x5AC9,
- 0x5BA4, 0x6089, 0x6E7F, 0x6F06, 0x75BE, 0x8CEA, 0x5B9F, 0x8500,
- 0x7BE0, 0x5072, 0x67F4, 0x829D, 0x5C61, 0x854A, 0x7E1E, 0x820E,
- 0x5199, 0x5C04, 0x6368, 0x8D66, 0x659C, 0x716E, 0x793E, 0x7D17,
- 0x8005, 0x8B1D, 0x8ECA, 0x906E, 0x86C7, 0x90AA, 0x501F, 0x52FA,
- 0x5C3A, 0x6753, 0x707C, 0x7235, 0x914C, 0x91C8, 0x932B, 0x82E5,
- 0x5BC2, 0x5F31, 0x60F9, 0x4E3B, 0x53D6, 0x5B88, 0x624B, 0x6731,
- 0x6B8A, 0x72E9, 0x73E0, 0x7A2E, 0x816B, 0x8DA3, 0x9152, 0x9996,
- 0x5112, 0x53D7, 0x546A, 0x5BFF, 0x6388, 0x6A39, 0x7DAC, 0x9700,
- 0x56DA, 0x53CE, 0x5468, 0x5B97, 0x5C31, 0x5DDE, 0x4FEE, 0x6101,
- 0x62FE, 0x6D32, 0x79C0, 0x79CB, 0x7D42, 0x7E4D, 0x7FD2, 0x81ED,
- 0x821F, 0x8490, 0x8846, 0x8972, 0x8B90, 0x8E74, 0x8F2F, 0x9031,
- 0x914B, 0x916C, 0x96C6, 0x919C, 0x4EC0, 0x4F4F, 0x5145, 0x5341,
- 0x5F93, 0x620E, 0x67D4, 0x6C41, 0x6E0B, 0x7363, 0x7E26, 0x91CD,
- 0x9283, 0x53D4, 0x5919, 0x5BBF, 0x6DD1, 0x795D, 0x7E2E, 0x7C9B,
- 0x587E, 0x719F, 0x51FA, 0x8853, 0x8FF0, 0x4FCA, 0x5CFB, 0x6625,
- 0x77AC, 0x7AE3, 0x821C, 0x99FF, 0x51C6, 0x5FAA, 0x65EC, 0x696F,
- 0x6B89, 0x6DF3, 0x6E96, 0x6F64, 0x76FE, 0x7D14, 0x5DE1, 0x9075,
- 0x9187, 0x9806, 0x51E6, 0x521D, 0x6240, 0x6691, 0x66D9, 0x6E1A,
- 0x5EB6, 0x7DD2, 0x7F72, 0x66F8, 0x85AF, 0x85F7, 0x8AF8, 0x52A9,
- 0x53D9, 0x5973, 0x5E8F, 0x5F90, 0x6055, 0x92E4, 0x9664, 0x50B7,
- 0x511F, 0x52DD, 0x5320, 0x5347, 0x53EC, 0x54E8, 0x5546, 0x5531,
- 0x5617, 0x5968, 0x59BE, 0x5A3C, 0x5BB5, 0x5C06, 0x5C0F, 0x5C11,
- 0x5C1A, 0x5E84, 0x5E8A, 0x5EE0, 0x5F70, 0x627F, 0x6284, 0x62DB,
- 0x638C, 0x6377, 0x6607, 0x660C, 0x662D, 0x6676, 0x677E, 0x68A2,
- 0x6A1F, 0x6A35, 0x6CBC, 0x6D88, 0x6E09, 0x6E58, 0x713C, 0x7126,
- 0x7167, 0x75C7, 0x7701, 0x785D, 0x7901, 0x7965, 0x79F0, 0x7AE0,
- 0x7B11, 0x7CA7, 0x7D39, 0x8096, 0x83D6, 0x848B, 0x8549, 0x885D,
- 0x88F3, 0x8A1F, 0x8A3C, 0x8A54, 0x8A73, 0x8C61, 0x8CDE, 0x91A4,
- 0x9266, 0x937E, 0x9418, 0x969C, 0x9798, 0x4E0A, 0x4E08, 0x4E1E,
- 0x4E57, 0x5197, 0x5270, 0x57CE, 0x5834, 0x58CC, 0x5B22, 0x5E38,
- 0x60C5, 0x64FE, 0x6761, 0x6756, 0x6D44, 0x72B6, 0x7573, 0x7A63,
- 0x84B8, 0x8B72, 0x91B8, 0x9320, 0x5631, 0x57F4, 0x98FE, 0x62ED,
- 0x690D, 0x6B96, 0x71ED, 0x7E54, 0x8077, 0x8272, 0x89E6, 0x98DF,
- 0x8755, 0x8FB1, 0x5C3B, 0x4F38, 0x4FE1, 0x4FB5, 0x5507, 0x5A20,
- 0x5BDD, 0x5BE9, 0x5FC3, 0x614E, 0x632F, 0x65B0, 0x664B, 0x68EE,
- 0x699B, 0x6D78, 0x6DF1, 0x7533, 0x75B9, 0x771F, 0x795E, 0x79E6,
- 0x7D33, 0x81E3, 0x82AF, 0x85AA, 0x89AA, 0x8A3A, 0x8EAB, 0x8F9B,
- 0x9032, 0x91DD, 0x9707, 0x4EBA, 0x4EC1, 0x5203, 0x5875, 0x58EC,
- 0x5C0B, 0x751A, 0x5C3D, 0x814E, 0x8A0A, 0x8FC5, 0x9663, 0x976D,
- 0x7B25, 0x8ACF, 0x9808, 0x9162, 0x56F3, 0x53A8, 0x9017, 0x5439,
- 0x5782, 0x5E25, 0x63A8, 0x6C34, 0x708A, 0x7761, 0x7C8B, 0x7FE0,
- 0x8870, 0x9042, 0x9154, 0x9310, 0x9318, 0x968F, 0x745E, 0x9AC4,
- 0x5D07, 0x5D69, 0x6570, 0x67A2, 0x8DA8, 0x96DB, 0x636E, 0x6749,
- 0x6919, 0x83C5, 0x9817, 0x96C0, 0x88FE, 0x6F84, 0x647A, 0x5BF8,
- 0x4E16, 0x702C, 0x755D, 0x662F, 0x51C4, 0x5236, 0x52E2, 0x59D3,
- 0x5F81, 0x6027, 0x6210, 0x653F, 0x6574, 0x661F, 0x6674, 0x68F2,
- 0x6816, 0x6B63, 0x6E05, 0x7272, 0x751F, 0x76DB, 0x7CBE, 0x8056,
- 0x58F0, 0x88FD, 0x897F, 0x8AA0, 0x8A93, 0x8ACB, 0x901D, 0x9192,
- 0x9752, 0x9759, 0x6589, 0x7A0E, 0x8106, 0x96BB, 0x5E2D, 0x60DC,
- 0x621A, 0x65A5, 0x6614, 0x6790, 0x77F3, 0x7A4D, 0x7C4D, 0x7E3E,
- 0x810A, 0x8CAC, 0x8D64, 0x8DE1, 0x8E5F, 0x78A9, 0x5207, 0x62D9,
- 0x63A5, 0x6442, 0x6298, 0x8A2D, 0x7A83, 0x7BC0, 0x8AAC, 0x96EA,
- 0x7D76, 0x820C, 0x8749, 0x4ED9, 0x5148, 0x5343, 0x5360, 0x5BA3,
- 0x5C02, 0x5C16, 0x5DDD, 0x6226, 0x6247, 0x64B0, 0x6813, 0x6834,
- 0x6CC9, 0x6D45, 0x6D17, 0x67D3, 0x6F5C, 0x714E, 0x717D, 0x65CB,
- 0x7A7F, 0x7BAD, 0x7DDA, 0x7E4A, 0x7FA8, 0x817A, 0x821B, 0x8239,
- 0x85A6, 0x8A6E, 0x8CCE, 0x8DF5, 0x9078, 0x9077, 0x92AD, 0x9291,
- 0x9583, 0x9BAE, 0x524D, 0x5584, 0x6F38, 0x7136, 0x5168, 0x7985,
- 0x7E55, 0x81B3, 0x7CCE, 0x564C, 0x5851, 0x5CA8, 0x63AA, 0x66FE,
- 0x66FD, 0x695A, 0x72D9, 0x758F, 0x758E, 0x790E, 0x7956, 0x79DF,
- 0x7C97, 0x7D20, 0x7D44, 0x8607, 0x8A34, 0x963B, 0x9061, 0x9F20,
- 0x50E7, 0x5275, 0x53CC, 0x53E2, 0x5009, 0x55AA, 0x58EE, 0x594F,
- 0x723D, 0x5B8B, 0x5C64, 0x531D, 0x60E3, 0x60F3, 0x635C, 0x6383,
- 0x633F, 0x63BB, 0x64CD, 0x65E9, 0x66F9, 0x5DE3, 0x69CD, 0x69FD,
- 0x6F15, 0x71E5, 0x4E89, 0x75E9, 0x76F8, 0x7A93, 0x7CDF, 0x7DCF,
- 0x7D9C, 0x8061, 0x8349, 0x8358, 0x846C, 0x84BC, 0x85FB, 0x88C5,
- 0x8D70, 0x9001, 0x906D, 0x9397, 0x971C, 0x9A12, 0x50CF, 0x5897,
- 0x618E, 0x81D3, 0x8535, 0x8D08, 0x9020, 0x4FC3, 0x5074, 0x5247,
- 0x5373, 0x606F, 0x6349, 0x675F, 0x6E2C, 0x8DB3, 0x901F, 0x4FD7,
- 0x5C5E, 0x8CCA, 0x65CF, 0x7D9A, 0x5352, 0x8896, 0x5176, 0x63C3,
- 0x5B58, 0x5B6B, 0x5C0A, 0x640D, 0x6751, 0x905C, 0x4ED6, 0x591A,
- 0x592A, 0x6C70, 0x8A51, 0x553E, 0x5815, 0x59A5, 0x60F0, 0x6253,
- 0x67C1, 0x8235, 0x6955, 0x9640, 0x99C4, 0x9A28, 0x4F53, 0x5806,
- 0x5BFE, 0x8010, 0x5CB1, 0x5E2F, 0x5F85, 0x6020, 0x614B, 0x6234,
- 0x66FF, 0x6CF0, 0x6EDE, 0x80CE, 0x817F, 0x82D4, 0x888B, 0x8CB8,
- 0x9000, 0x902E, 0x968A, 0x9EDB, 0x9BDB, 0x4EE3, 0x53F0, 0x5927,
- 0x7B2C, 0x918D, 0x984C, 0x9DF9, 0x6EDD, 0x7027, 0x5353, 0x5544,
- 0x5B85, 0x6258, 0x629E, 0x62D3, 0x6CA2, 0x6FEF, 0x7422, 0x8A17,
- 0x9438, 0x6FC1, 0x8AFE, 0x8338, 0x51E7, 0x86F8, 0x53EA, 0x53E9,
- 0x4F46, 0x9054, 0x8FB0, 0x596A, 0x8131, 0x5DFD, 0x7AEA, 0x8FBF,
- 0x68DA, 0x8C37, 0x72F8, 0x9C48, 0x6A3D, 0x8AB0, 0x4E39, 0x5358,
- 0x5606, 0x5766, 0x62C5, 0x63A2, 0x65E6, 0x6B4E, 0x6DE1, 0x6E5B,
- 0x70AD, 0x77ED, 0x7AEF, 0x7BAA, 0x7DBB, 0x803D, 0x80C6, 0x86CB,
- 0x8A95, 0x935B, 0x56E3, 0x58C7, 0x5F3E, 0x65AD, 0x6696, 0x6A80,
- 0x6BB5, 0x7537, 0x8AC7, 0x5024, 0x77E5, 0x5730, 0x5F1B, 0x6065,
- 0x667A, 0x6C60, 0x75F4, 0x7A1A, 0x7F6E, 0x81F4, 0x8718, 0x9045,
- 0x99B3, 0x7BC9, 0x755C, 0x7AF9, 0x7B51, 0x84C4, 0x9010, 0x79E9,
- 0x7A92, 0x8336, 0x5AE1, 0x7740, 0x4E2D, 0x4EF2, 0x5B99, 0x5FE0,
- 0x62BD, 0x663C, 0x67F1, 0x6CE8, 0x866B, 0x8877, 0x8A3B, 0x914E,
- 0x92F3, 0x99D0, 0x6A17, 0x7026, 0x732A, 0x82E7, 0x8457, 0x8CAF,
- 0x4E01, 0x5146, 0x51CB, 0x558B, 0x5BF5, 0x5E16, 0x5E33, 0x5E81,
- 0x5F14, 0x5F35, 0x5F6B, 0x5FB4, 0x61F2, 0x6311, 0x66A2, 0x671D,
- 0x6F6E, 0x7252, 0x753A, 0x773A, 0x8074, 0x8139, 0x8178, 0x8776,
- 0x8ABF, 0x8ADC, 0x8D85, 0x8DF3, 0x929A, 0x9577, 0x9802, 0x9CE5,
- 0x52C5, 0x6357, 0x76F4, 0x6715, 0x6C88, 0x73CD, 0x8CC3, 0x93AE,
- 0x9673, 0x6D25, 0x589C, 0x690E, 0x69CC, 0x8FFD, 0x939A, 0x75DB,
- 0x901A, 0x585A, 0x6802, 0x63B4, 0x69FB, 0x4F43, 0x6F2C, 0x67D8,
- 0x8FBB, 0x8526, 0x7DB4, 0x9354, 0x693F, 0x6F70, 0x576A, 0x58F7,
- 0x5B2C, 0x7D2C, 0x722A, 0x540A, 0x91E3, 0x9DB4, 0x4EAD, 0x4F4E,
- 0x505C, 0x5075, 0x5243, 0x8C9E, 0x5448, 0x5824, 0x5B9A, 0x5E1D,
- 0x5E95, 0x5EAD, 0x5EF7, 0x5F1F, 0x608C, 0x62B5, 0x633A, 0x63D0,
- 0x68AF, 0x6C40, 0x7887, 0x798E, 0x7A0B, 0x7DE0, 0x8247, 0x8A02,
- 0x8AE6, 0x8E44, 0x9013, 0x90B8, 0x912D, 0x91D8, 0x9F0E, 0x6CE5,
- 0x6458, 0x64E2, 0x6575, 0x6EF4, 0x7684, 0x7B1B, 0x9069, 0x93D1,
- 0x6EBA, 0x54F2, 0x5FB9, 0x64A4, 0x8F4D, 0x8FED, 0x9244, 0x5178,
- 0x586B, 0x5929, 0x5C55, 0x5E97, 0x6DFB, 0x7E8F, 0x751C, 0x8CBC,
- 0x8EE2, 0x985B, 0x70B9, 0x4F1D, 0x6BBF, 0x6FB1, 0x7530, 0x96FB,
- 0x514E, 0x5410, 0x5835, 0x5857, 0x59AC, 0x5C60, 0x5F92, 0x6597,
- 0x675C, 0x6E21, 0x767B, 0x83DF, 0x8CED, 0x9014, 0x90FD, 0x934D,
- 0x7825, 0x783A, 0x52AA, 0x5EA6, 0x571F, 0x5974, 0x6012, 0x5012,
- 0x515A, 0x51AC, 0x51CD, 0x5200, 0x5510, 0x5854, 0x5858, 0x5957,
- 0x5B95, 0x5CF6, 0x5D8B, 0x60BC, 0x6295, 0x642D, 0x6771, 0x6843,
- 0x68BC, 0x68DF, 0x76D7, 0x6DD8, 0x6E6F, 0x6D9B, 0x706F, 0x71C8,
- 0x5F53, 0x75D8, 0x7977, 0x7B49, 0x7B54, 0x7B52, 0x7CD6, 0x7D71,
- 0x5230, 0x8463, 0x8569, 0x85E4, 0x8A0E, 0x8B04, 0x8C46, 0x8E0F,
- 0x9003, 0x900F, 0x9419, 0x9676, 0x982D, 0x9A30, 0x95D8, 0x50CD,
- 0x52D5, 0x540C, 0x5802, 0x5C0E, 0x61A7, 0x649E, 0x6D1E, 0x77B3,
- 0x7AE5, 0x80F4, 0x8404, 0x9053, 0x9285, 0x5CE0, 0x9D07, 0x533F,
- 0x5F97, 0x5FB3, 0x6D9C, 0x7279, 0x7763, 0x79BF, 0x7BE4, 0x6BD2,
- 0x72EC, 0x8AAD, 0x6803, 0x6A61, 0x51F8, 0x7A81, 0x6934, 0x5C4A,
- 0x9CF6, 0x82EB, 0x5BC5, 0x9149, 0x701E, 0x5678, 0x5C6F, 0x60C7,
- 0x6566, 0x6C8C, 0x8C5A, 0x9041, 0x9813, 0x5451, 0x66C7, 0x920D,
- 0x5948, 0x90A3, 0x5185, 0x4E4D, 0x51EA, 0x8599, 0x8B0E, 0x7058,
- 0x637A, 0x934B, 0x6962, 0x99B4, 0x7E04, 0x7577, 0x5357, 0x6960,
- 0x8EDF, 0x96E3, 0x6C5D, 0x4E8C, 0x5C3C, 0x5F10, 0x8FE9, 0x5302,
- 0x8CD1, 0x8089, 0x8679, 0x5EFF, 0x65E5, 0x4E73, 0x5165, 0x5982,
- 0x5C3F, 0x97EE, 0x4EFB, 0x598A, 0x5FCD, 0x8A8D, 0x6FE1, 0x79B0,
- 0x7962, 0x5BE7, 0x8471, 0x732B, 0x71B1, 0x5E74, 0x5FF5, 0x637B,
- 0x649A, 0x71C3, 0x7C98, 0x4E43, 0x5EFC, 0x4E4B, 0x57DC, 0x56A2,
- 0x60A9, 0x6FC3, 0x7D0D, 0x80FD, 0x8133, 0x81BF, 0x8FB2, 0x8997,
- 0x86A4, 0x5DF4, 0x628A, 0x64AD, 0x8987, 0x6777, 0x6CE2, 0x6D3E,
- 0x7436, 0x7834, 0x5A46, 0x7F75, 0x82AD, 0x99AC, 0x4FF3, 0x5EC3,
- 0x62DD, 0x6392, 0x6557, 0x676F, 0x76C3, 0x724C, 0x80CC, 0x80BA,
- 0x8F29, 0x914D, 0x500D, 0x57F9, 0x5A92, 0x6885, 0x6973, 0x7164,
- 0x72FD, 0x8CB7, 0x58F2, 0x8CE0, 0x966A, 0x9019, 0x877F, 0x79E4,
- 0x77E7, 0x8429, 0x4F2F, 0x5265, 0x535A, 0x62CD, 0x67CF, 0x6CCA,
- 0x767D, 0x7B94, 0x7C95, 0x8236, 0x8584, 0x8FEB, 0x66DD, 0x6F20,
- 0x7206, 0x7E1B, 0x83AB, 0x99C1, 0x9EA6, 0x51FD, 0x7BB1, 0x7872,
- 0x7BB8, 0x8087, 0x7B48, 0x6AE8, 0x5E61, 0x808C, 0x7551, 0x7560,
- 0x516B, 0x9262, 0x6E8C, 0x767A, 0x9197, 0x9AEA, 0x4F10, 0x7F70,
- 0x629C, 0x7B4F, 0x95A5, 0x9CE9, 0x567A, 0x5859, 0x86E4, 0x96BC,
- 0x4F34, 0x5224, 0x534A, 0x53CD, 0x53DB, 0x5E06, 0x642C, 0x6591,
- 0x677F, 0x6C3E, 0x6C4E, 0x7248, 0x72AF, 0x73ED, 0x7554, 0x7E41,
- 0x822C, 0x85E9, 0x8CA9, 0x7BC4, 0x91C6, 0x7169, 0x9812, 0x98EF,
- 0x633D, 0x6669, 0x756A, 0x76E4, 0x78D0, 0x8543, 0x86EE, 0x532A,
- 0x5351, 0x5426, 0x5983, 0x5E87, 0x5F7C, 0x60B2, 0x6249, 0x6279,
- 0x62AB, 0x6590, 0x6BD4, 0x6CCC, 0x75B2, 0x76AE, 0x7891, 0x79D8,
- 0x7DCB, 0x7F77, 0x80A5, 0x88AB, 0x8AB9, 0x8CBB, 0x907F, 0x975E,
- 0x98DB, 0x6A0B, 0x7C38, 0x5099, 0x5C3E, 0x5FAE, 0x6787, 0x6BD8,
- 0x7435, 0x7709, 0x7F8E, 0x9F3B, 0x67CA, 0x7A17, 0x5339, 0x758B,
- 0x9AED, 0x5F66, 0x819D, 0x83F1, 0x8098, 0x5F3C, 0x5FC5, 0x7562,
- 0x7B46, 0x903C, 0x6867, 0x59EB, 0x5A9B, 0x7D10, 0x767E, 0x8B2C,
- 0x4FF5, 0x5F6A, 0x6A19, 0x6C37, 0x6F02, 0x74E2, 0x7968, 0x8868,
- 0x8A55, 0x8C79, 0x5EDF, 0x63CF, 0x75C5, 0x79D2, 0x82D7, 0x9328,
- 0x92F2, 0x849C, 0x86ED, 0x9C2D, 0x54C1, 0x5F6C, 0x658C, 0x6D5C,
- 0x7015, 0x8CA7, 0x8CD3, 0x983B, 0x654F, 0x74F6, 0x4E0D, 0x4ED8,
- 0x57E0, 0x592B, 0x5A66, 0x5BCC, 0x51A8, 0x5E03, 0x5E9C, 0x6016,
- 0x6276, 0x6577, 0x65A7, 0x666E, 0x6D6E, 0x7236, 0x7B26, 0x8150,
- 0x819A, 0x8299, 0x8B5C, 0x8CA0, 0x8CE6, 0x8D74, 0x961C, 0x9644,
- 0x4FAE, 0x64AB, 0x6B66, 0x821E, 0x8461, 0x856A, 0x90E8, 0x5C01,
- 0x6953, 0x98A8, 0x847A, 0x8557, 0x4F0F, 0x526F, 0x5FA9, 0x5E45,
- 0x670D, 0x798F, 0x8179, 0x8907, 0x8986, 0x6DF5, 0x5F17, 0x6255,
- 0x6CB8, 0x4ECF, 0x7269, 0x9B92, 0x5206, 0x543B, 0x5674, 0x58B3,
- 0x61A4, 0x626E, 0x711A, 0x596E, 0x7C89, 0x7CDE, 0x7D1B, 0x96F0,
- 0x6587, 0x805E, 0x4E19, 0x4F75, 0x5175, 0x5840, 0x5E63, 0x5E73,
- 0x5F0A, 0x67C4, 0x4E26, 0x853D, 0x9589, 0x965B, 0x7C73, 0x9801,
- 0x50FB, 0x58C1, 0x7656, 0x78A7, 0x5225, 0x77A5, 0x8511, 0x7B86,
- 0x504F, 0x5909, 0x7247, 0x7BC7, 0x7DE8, 0x8FBA, 0x8FD4, 0x904D,
- 0x4FBF, 0x52C9, 0x5A29, 0x5F01, 0x97AD, 0x4FDD, 0x8217, 0x92EA,
- 0x5703, 0x6355, 0x6B69, 0x752B, 0x88DC, 0x8F14, 0x7A42, 0x52DF,
- 0x5893, 0x6155, 0x620A, 0x66AE, 0x6BCD, 0x7C3F, 0x83E9, 0x5023,
- 0x4FF8, 0x5305, 0x5446, 0x5831, 0x5949, 0x5B9D, 0x5CF0, 0x5CEF,
- 0x5D29, 0x5E96, 0x62B1, 0x6367, 0x653E, 0x65B9, 0x670B, 0x6CD5,
- 0x6CE1, 0x70F9, 0x7832, 0x7E2B, 0x80DE, 0x82B3, 0x840C, 0x84EC,
- 0x8702, 0x8912, 0x8A2A, 0x8C4A, 0x90A6, 0x92D2, 0x98FD, 0x9CF3,
- 0x9D6C, 0x4E4F, 0x4EA1, 0x508D, 0x5256, 0x574A, 0x59A8, 0x5E3D,
- 0x5FD8, 0x5FD9, 0x623F, 0x66B4, 0x671B, 0x67D0, 0x68D2, 0x5192,
- 0x7D21, 0x80AA, 0x81A8, 0x8B00, 0x8C8C, 0x8CBF, 0x927E, 0x9632,
- 0x5420, 0x982C, 0x5317, 0x50D5, 0x535C, 0x58A8, 0x64B2, 0x6734,
- 0x7267, 0x7766, 0x7A46, 0x91E6, 0x52C3, 0x6CA1, 0x6B86, 0x5800,
- 0x5E4C, 0x5954, 0x672C, 0x7FFB, 0x51E1, 0x76C6, 0x6469, 0x78E8,
- 0x9B54, 0x9EBB, 0x57CB, 0x59B9, 0x6627, 0x679A, 0x6BCE, 0x54E9,
- 0x69D9, 0x5E55, 0x819C, 0x6795, 0x9BAA, 0x67FE, 0x9C52, 0x685D,
- 0x4EA6, 0x4FE3, 0x53C8, 0x62B9, 0x672B, 0x6CAB, 0x8FC4, 0x4FAD,
- 0x7E6D, 0x9EBF, 0x4E07, 0x6162, 0x6E80, 0x6F2B, 0x8513, 0x5473,
- 0x672A, 0x9B45, 0x5DF3, 0x7B95, 0x5CAC, 0x5BC6, 0x871C, 0x6E4A,
- 0x84D1, 0x7A14, 0x8108, 0x5999, 0x7C8D, 0x6C11, 0x7720, 0x52D9,
- 0x5922, 0x7121, 0x725F, 0x77DB, 0x9727, 0x9D61, 0x690B, 0x5A7F,
- 0x5A18, 0x51A5, 0x540D, 0x547D, 0x660E, 0x76DF, 0x8FF7, 0x9298,
- 0x9CF4, 0x59EA, 0x725D, 0x6EC5, 0x514D, 0x68C9, 0x7DBF, 0x7DEC,
- 0x9762, 0x9EBA, 0x6478, 0x6A21, 0x8302, 0x5984, 0x5B5F, 0x6BDB,
- 0x731B, 0x76F2, 0x7DB2, 0x8017, 0x8499, 0x5132, 0x6728, 0x9ED9,
- 0x76EE, 0x6762, 0x52FF, 0x9905, 0x5C24, 0x623B, 0x7C7E, 0x8CB0,
- 0x554F, 0x60B6, 0x7D0B, 0x9580, 0x5301, 0x4E5F, 0x51B6, 0x591C,
- 0x723A, 0x8036, 0x91CE, 0x5F25, 0x77E2, 0x5384, 0x5F79, 0x7D04,
- 0x85AC, 0x8A33, 0x8E8D, 0x9756, 0x67F3, 0x85AE, 0x9453, 0x6109,
- 0x6108, 0x6CB9, 0x7652, 0x8AED, 0x8F38, 0x552F, 0x4F51, 0x512A,
- 0x52C7, 0x53CB, 0x5BA5, 0x5E7D, 0x60A0, 0x6182, 0x63D6, 0x6709,
- 0x67DA, 0x6E67, 0x6D8C, 0x7336, 0x7337, 0x7531, 0x7950, 0x88D5,
- 0x8A98, 0x904A, 0x9091, 0x90F5, 0x96C4, 0x878D, 0x5915, 0x4E88,
- 0x4F59, 0x4E0E, 0x8A89, 0x8F3F, 0x9810, 0x50AD, 0x5E7C, 0x5996,
- 0x5BB9, 0x5EB8, 0x63DA, 0x63FA, 0x64C1, 0x66DC, 0x694A, 0x69D8,
- 0x6D0B, 0x6EB6, 0x7194, 0x7528, 0x7AAF, 0x7F8A, 0x8000, 0x8449,
- 0x84C9, 0x8981, 0x8B21, 0x8E0A, 0x9065, 0x967D, 0x990A, 0x617E,
- 0x6291, 0x6B32, 0x6C83, 0x6D74, 0x7FCC, 0x7FFC, 0x6DC0, 0x7F85,
- 0x87BA, 0x88F8, 0x6765, 0x83B1, 0x983C, 0x96F7, 0x6D1B, 0x7D61,
- 0x843D, 0x916A, 0x4E71, 0x5375, 0x5D50, 0x6B04, 0x6FEB, 0x85CD,
- 0x862D, 0x89A7, 0x5229, 0x540F, 0x5C65, 0x674E, 0x68A8, 0x7406,
- 0x7483, 0x75E2, 0x88CF, 0x88E1, 0x91CC, 0x96E2, 0x9678, 0x5F8B,
- 0x7387, 0x7ACB, 0x844E, 0x63A0, 0x7565, 0x5289, 0x6D41, 0x6E9C,
- 0x7409, 0x7559, 0x786B, 0x7C92, 0x9686, 0x7ADC, 0x9F8D, 0x4FB6,
- 0x616E, 0x65C5, 0x865C, 0x4E86, 0x4EAE, 0x50DA, 0x4E21, 0x51CC,
- 0x5BEE, 0x6599, 0x6881, 0x6DBC, 0x731F, 0x7642, 0x77AD, 0x7A1C,
- 0x7CE7, 0x826F, 0x8AD2, 0x907C, 0x91CF, 0x9675, 0x9818, 0x529B,
- 0x7DD1, 0x502B, 0x5398, 0x6797, 0x6DCB, 0x71D0, 0x7433, 0x81E8,
- 0x8F2A, 0x96A3, 0x9C57, 0x9E9F, 0x7460, 0x5841, 0x6D99, 0x7D2F,
- 0x985E, 0x4EE4, 0x4F36, 0x4F8B, 0x51B7, 0x52B1, 0x5DBA, 0x601C,
- 0x73B2, 0x793C, 0x82D3, 0x9234, 0x96B7, 0x96F6, 0x970A, 0x9E97,
- 0x9F62, 0x66A6, 0x6B74, 0x5217, 0x52A3, 0x70C8, 0x88C2, 0x5EC9,
- 0x604B, 0x6190, 0x6F23, 0x7149, 0x7C3E, 0x7DF4, 0x806F, 0x84EE,
- 0x9023, 0x932C, 0x5442, 0x9B6F, 0x6AD3, 0x7089, 0x8CC2, 0x8DEF,
- 0x9732, 0x52B4, 0x5A41, 0x5ECA, 0x5F04, 0x6717, 0x697C, 0x6994,
- 0x6D6A, 0x6F0F, 0x7262, 0x72FC, 0x7BED, 0x8001, 0x807E, 0x874B,
- 0x90CE, 0x516D, 0x9E93, 0x7984, 0x808B, 0x9332, 0x8AD6, 0x502D,
- 0x548C, 0x8A71, 0x6B6A, 0x8CC4, 0x8107, 0x60D1, 0x67A0, 0x9DF2,
- 0x4E99, 0x4E98, 0x9C10, 0x8A6B, 0x85C1, 0x8568, 0x6900, 0x6E7E,
- 0x7897, 0x8155, 0x5F0C, 0x4E10, 0x4E15, 0x4E2A, 0x4E31, 0x4E36,
- 0x4E3C, 0x4E3F, 0x4E42, 0x4E56, 0x4E58, 0x4E82, 0x4E85, 0x8C6B,
- 0x4E8A, 0x8212, 0x5F0D, 0x4E8E, 0x4E9E, 0x4E9F, 0x4EA0, 0x4EA2,
- 0x4EB0, 0x4EB3, 0x4EB6, 0x4ECE, 0x4ECD, 0x4EC4, 0x4EC6, 0x4EC2,
- 0x4ED7, 0x4EDE, 0x4EED, 0x4EDF, 0x4EF7, 0x4F09, 0x4F5A, 0x4F30,
- 0x4F5B, 0x4F5D, 0x4F57, 0x4F47, 0x4F76, 0x4F88, 0x4F8F, 0x4F98,
- 0x4F7B, 0x4F69, 0x4F70, 0x4F91, 0x4F6F, 0x4F86, 0x4F96, 0x5118,
- 0x4FD4, 0x4FDF, 0x4FCE, 0x4FD8, 0x4FDB, 0x4FD1, 0x4FDA, 0x4FD0,
- 0x4FE4, 0x4FE5, 0x501A, 0x5028, 0x5014, 0x502A, 0x5025, 0x5005,
- 0x4F1C, 0x4FF6, 0x5021, 0x5029, 0x502C, 0x4FFE, 0x4FEF, 0x5011,
- 0x5006, 0x5043, 0x5047, 0x6703, 0x5055, 0x5050, 0x5048, 0x505A,
- 0x5056, 0x506C, 0x5078, 0x5080, 0x509A, 0x5085, 0x50B4, 0x50B2,
- 0x50C9, 0x50CA, 0x50B3, 0x50C2, 0x50D6, 0x50DE, 0x50E5, 0x50ED,
- 0x50E3, 0x50EE, 0x50F9, 0x50F5, 0x5109, 0x5101, 0x5102, 0x5116,
- 0x5115, 0x5114, 0x511A, 0x5121, 0x513A, 0x5137, 0x513C, 0x513B,
- 0x513F, 0x5140, 0x5152, 0x514C, 0x5154, 0x5162, 0x7AF8, 0x5169,
- 0x516A, 0x516E, 0x5180, 0x5182, 0x56D8, 0x518C, 0x5189, 0x518F,
- 0x5191, 0x5193, 0x5195, 0x5196, 0x51A4, 0x51A6, 0x51A2, 0x51A9,
- 0x51AA, 0x51AB, 0x51B3, 0x51B1, 0x51B2, 0x51B0, 0x51B5, 0x51BD,
- 0x51C5, 0x51C9, 0x51DB, 0x51E0, 0x8655, 0x51E9, 0x51ED, 0x51F0,
- 0x51F5, 0x51FE, 0x5204, 0x520B, 0x5214, 0x520E, 0x5227, 0x522A,
- 0x522E, 0x5233, 0x5239, 0x524F, 0x5244, 0x524B, 0x524C, 0x525E,
- 0x5254, 0x526A, 0x5274, 0x5269, 0x5273, 0x527F, 0x527D, 0x528D,
- 0x5294, 0x5292, 0x5271, 0x5288, 0x5291, 0x8FA8, 0x8FA7, 0x52AC,
- 0x52AD, 0x52BC, 0x52B5, 0x52C1, 0x52CD, 0x52D7, 0x52DE, 0x52E3,
- 0x52E6, 0x98ED, 0x52E0, 0x52F3, 0x52F5, 0x52F8, 0x52F9, 0x5306,
- 0x5308, 0x7538, 0x530D, 0x5310, 0x530F, 0x5315, 0x531A, 0x5323,
- 0x532F, 0x5331, 0x5333, 0x5338, 0x5340, 0x5346, 0x5345, 0x4E17,
- 0x5349, 0x534D, 0x51D6, 0x535E, 0x5369, 0x536E, 0x5918, 0x537B,
- 0x5377, 0x5382, 0x5396, 0x53A0, 0x53A6, 0x53A5, 0x53AE, 0x53B0,
- 0x53B6, 0x53C3, 0x7C12, 0x96D9, 0x53DF, 0x66FC, 0x71EE, 0x53EE,
- 0x53E8, 0x53ED, 0x53FA, 0x5401, 0x543D, 0x5440, 0x542C, 0x542D,
- 0x543C, 0x542E, 0x5436, 0x5429, 0x541D, 0x544E, 0x548F, 0x5475,
- 0x548E, 0x545F, 0x5471, 0x5477, 0x5470, 0x5492, 0x547B, 0x5480,
- 0x5476, 0x5484, 0x5490, 0x5486, 0x54C7, 0x54A2, 0x54B8, 0x54A5,
- 0x54AC, 0x54C4, 0x54C8, 0x54A8, 0x54AB, 0x54C2, 0x54A4, 0x54BE,
- 0x54BC, 0x54D8, 0x54E5, 0x54E6, 0x550F, 0x5514, 0x54FD, 0x54EE,
- 0x54ED, 0x54FA, 0x54E2, 0x5539, 0x5540, 0x5563, 0x554C, 0x552E,
- 0x555C, 0x5545, 0x5556, 0x5557, 0x5538, 0x5533, 0x555D, 0x5599,
- 0x5580, 0x54AF, 0x558A, 0x559F, 0x557B, 0x557E, 0x5598, 0x559E,
- 0x55AE, 0x557C, 0x5583, 0x55A9, 0x5587, 0x55A8, 0x55DA, 0x55C5,
- 0x55DF, 0x55C4, 0x55DC, 0x55E4, 0x55D4, 0x5614, 0x55F7, 0x5616,
- 0x55FE, 0x55FD, 0x561B, 0x55F9, 0x564E, 0x5650, 0x71DF, 0x5634,
- 0x5636, 0x5632, 0x5638, 0x566B, 0x5664, 0x562F, 0x566C, 0x566A,
- 0x5686, 0x5680, 0x568A, 0x56A0, 0x5694, 0x568F, 0x56A5, 0x56AE,
- 0x56B6, 0x56B4, 0x56C2, 0x56BC, 0x56C1, 0x56C3, 0x56C0, 0x56C8,
- 0x56CE, 0x56D1, 0x56D3, 0x56D7, 0x56EE, 0x56F9, 0x5700, 0x56FF,
- 0x5704, 0x5709, 0x5708, 0x570B, 0x570D, 0x5713, 0x5718, 0x5716,
- 0x55C7, 0x571C, 0x5726, 0x5737, 0x5738, 0x574E, 0x573B, 0x5740,
- 0x574F, 0x5769, 0x57C0, 0x5788, 0x5761, 0x577F, 0x5789, 0x5793,
- 0x57A0, 0x57B3, 0x57A4, 0x57AA, 0x57B0, 0x57C3, 0x57C6, 0x57D4,
- 0x57D2, 0x57D3, 0x580A, 0x57D6, 0x57E3, 0x580B, 0x5819, 0x581D,
- 0x5872, 0x5821, 0x5862, 0x584B, 0x5870, 0x6BC0, 0x5852, 0x583D,
- 0x5879, 0x5885, 0x58B9, 0x589F, 0x58AB, 0x58BA, 0x58DE, 0x58BB,
- 0x58B8, 0x58AE, 0x58C5, 0x58D3, 0x58D1, 0x58D7, 0x58D9, 0x58D8,
- 0x58E5, 0x58DC, 0x58E4, 0x58DF, 0x58EF, 0x58FA, 0x58F9, 0x58FB,
- 0x58FC, 0x58FD, 0x5902, 0x590A, 0x5910, 0x591B, 0x68A6, 0x5925,
- 0x592C, 0x592D, 0x5932, 0x5938, 0x593E, 0x7AD2, 0x5955, 0x5950,
- 0x594E, 0x595A, 0x5958, 0x5962, 0x5960, 0x5967, 0x596C, 0x5969,
- 0x5978, 0x5981, 0x599D, 0x4F5E, 0x4FAB, 0x59A3, 0x59B2, 0x59C6,
- 0x59E8, 0x59DC, 0x598D, 0x59D9, 0x59DA, 0x5A25, 0x5A1F, 0x5A11,
- 0x5A1C, 0x5A09, 0x5A1A, 0x5A40, 0x5A6C, 0x5A49, 0x5A35, 0x5A36,
- 0x5A62, 0x5A6A, 0x5A9A, 0x5ABC, 0x5ABE, 0x5ACB, 0x5AC2, 0x5ABD,
- 0x5AE3, 0x5AD7, 0x5AE6, 0x5AE9, 0x5AD6, 0x5AFA, 0x5AFB, 0x5B0C,
- 0x5B0B, 0x5B16, 0x5B32, 0x5AD0, 0x5B2A, 0x5B36, 0x5B3E, 0x5B43,
- 0x5B45, 0x5B40, 0x5B51, 0x5B55, 0x5B5A, 0x5B5B, 0x5B65, 0x5B69,
- 0x5B70, 0x5B73, 0x5B75, 0x5B78, 0x6588, 0x5B7A, 0x5B80, 0x5B83,
- 0x5BA6, 0x5BB8, 0x5BC3, 0x5BC7, 0x5BC9, 0x5BD4, 0x5BD0, 0x5BE4,
- 0x5BE6, 0x5BE2, 0x5BDE, 0x5BE5, 0x5BEB, 0x5BF0, 0x5BF6, 0x5BF3,
- 0x5C05, 0x5C07, 0x5C08, 0x5C0D, 0x5C13, 0x5C20, 0x5C22, 0x5C28,
- 0x5C38, 0x5C39, 0x5C41, 0x5C46, 0x5C4E, 0x5C53, 0x5C50, 0x5C4F,
- 0x5B71, 0x5C6C, 0x5C6E, 0x4E62, 0x5C76, 0x5C79, 0x5C8C, 0x5C91,
- 0x5C94, 0x599B, 0x5CAB, 0x5CBB, 0x5CB6, 0x5CBC, 0x5CB7, 0x5CC5,
- 0x5CBE, 0x5CC7, 0x5CD9, 0x5CE9, 0x5CFD, 0x5CFA, 0x5CED, 0x5D8C,
- 0x5CEA, 0x5D0B, 0x5D15, 0x5D17, 0x5D5C, 0x5D1F, 0x5D1B, 0x5D11,
- 0x5D14, 0x5D22, 0x5D1A, 0x5D19, 0x5D18, 0x5D4C, 0x5D52, 0x5D4E,
- 0x5D4B, 0x5D6C, 0x5D73, 0x5D76, 0x5D87, 0x5D84, 0x5D82, 0x5DA2,
- 0x5D9D, 0x5DAC, 0x5DAE, 0x5DBD, 0x5D90, 0x5DB7, 0x5DBC, 0x5DC9,
- 0x5DCD, 0x5DD3, 0x5DD2, 0x5DD6, 0x5DDB, 0x5DEB, 0x5DF2, 0x5DF5,
- 0x5E0B, 0x5E1A, 0x5E19, 0x5E11, 0x5E1B, 0x5E36, 0x5E37, 0x5E44,
- 0x5E43, 0x5E40, 0x5E4E, 0x5E57, 0x5E54, 0x5E5F, 0x5E62, 0x5E64,
- 0x5E47, 0x5E75, 0x5E76, 0x5E7A, 0x9EBC, 0x5E7F, 0x5EA0, 0x5EC1,
- 0x5EC2, 0x5EC8, 0x5ED0, 0x5ECF, 0x5ED6, 0x5EE3, 0x5EDD, 0x5EDA,
- 0x5EDB, 0x5EE2, 0x5EE1, 0x5EE8, 0x5EE9, 0x5EEC, 0x5EF1, 0x5EF3,
- 0x5EF0, 0x5EF4, 0x5EF8, 0x5EFE, 0x5F03, 0x5F09, 0x5F5D, 0x5F5C,
- 0x5F0B, 0x5F11, 0x5F16, 0x5F29, 0x5F2D, 0x5F38, 0x5F41, 0x5F48,
- 0x5F4C, 0x5F4E, 0x5F2F, 0x5F51, 0x5F56, 0x5F57, 0x5F59, 0x5F61,
- 0x5F6D, 0x5F73, 0x5F77, 0x5F83, 0x5F82, 0x5F7F, 0x5F8A, 0x5F88,
- 0x5F91, 0x5F87, 0x5F9E, 0x5F99, 0x5F98, 0x5FA0, 0x5FA8, 0x5FAD,
- 0x5FBC, 0x5FD6, 0x5FFB, 0x5FE4, 0x5FF8, 0x5FF1, 0x5FDD, 0x60B3,
- 0x5FFF, 0x6021, 0x6060, 0x6019, 0x6010, 0x6029, 0x600E, 0x6031,
- 0x601B, 0x6015, 0x602B, 0x6026, 0x600F, 0x603A, 0x605A, 0x6041,
- 0x606A, 0x6077, 0x605F, 0x604A, 0x6046, 0x604D, 0x6063, 0x6043,
- 0x6064, 0x6042, 0x606C, 0x606B, 0x6059, 0x6081, 0x608D, 0x60E7,
- 0x6083, 0x609A, 0x6084, 0x609B, 0x6096, 0x6097, 0x6092, 0x60A7,
- 0x608B, 0x60E1, 0x60B8, 0x60E0, 0x60D3, 0x60B4, 0x5FF0, 0x60BD,
- 0x60C6, 0x60B5, 0x60D8, 0x614D, 0x6115, 0x6106, 0x60F6, 0x60F7,
- 0x6100, 0x60F4, 0x60FA, 0x6103, 0x6121, 0x60FB, 0x60F1, 0x610D,
- 0x610E, 0x6147, 0x613E, 0x6128, 0x6127, 0x614A, 0x613F, 0x613C,
- 0x612C, 0x6134, 0x613D, 0x6142, 0x6144, 0x6173, 0x6177, 0x6158,
- 0x6159, 0x615A, 0x616B, 0x6174, 0x616F, 0x6165, 0x6171, 0x615F,
- 0x615D, 0x6153, 0x6175, 0x6199, 0x6196, 0x6187, 0x61AC, 0x6194,
- 0x619A, 0x618A, 0x6191, 0x61AB, 0x61AE, 0x61CC, 0x61CA, 0x61C9,
- 0x61F7, 0x61C8, 0x61C3, 0x61C6, 0x61BA, 0x61CB, 0x7F79, 0x61CD,
- 0x61E6, 0x61E3, 0x61F6, 0x61FA, 0x61F4, 0x61FF, 0x61FD, 0x61FC,
- 0x61FE, 0x6200, 0x6208, 0x6209, 0x620D, 0x620C, 0x6214, 0x621B,
- 0x621E, 0x6221, 0x622A, 0x622E, 0x6230, 0x6232, 0x6233, 0x6241,
- 0x624E, 0x625E, 0x6263, 0x625B, 0x6260, 0x6268, 0x627C, 0x6282,
- 0x6289, 0x627E, 0x6292, 0x6293, 0x6296, 0x62D4, 0x6283, 0x6294,
- 0x62D7, 0x62D1, 0x62BB, 0x62CF, 0x62FF, 0x62C6, 0x64D4, 0x62C8,
- 0x62DC, 0x62CC, 0x62CA, 0x62C2, 0x62C7, 0x629B, 0x62C9, 0x630C,
- 0x62EE, 0x62F1, 0x6327, 0x6302, 0x6308, 0x62EF, 0x62F5, 0x6350,
- 0x633E, 0x634D, 0x641C, 0x634F, 0x6396, 0x638E, 0x6380, 0x63AB,
- 0x6376, 0x63A3, 0x638F, 0x6389, 0x639F, 0x63B5, 0x636B, 0x6369,
- 0x63BE, 0x63E9, 0x63C0, 0x63C6, 0x63E3, 0x63C9, 0x63D2, 0x63F6,
- 0x63C4, 0x6416, 0x6434, 0x6406, 0x6413, 0x6426, 0x6436, 0x651D,
- 0x6417, 0x6428, 0x640F, 0x6467, 0x646F, 0x6476, 0x644E, 0x652A,
- 0x6495, 0x6493, 0x64A5, 0x64A9, 0x6488, 0x64BC, 0x64DA, 0x64D2,
- 0x64C5, 0x64C7, 0x64BB, 0x64D8, 0x64C2, 0x64F1, 0x64E7, 0x8209,
- 0x64E0, 0x64E1, 0x62AC, 0x64E3, 0x64EF, 0x652C, 0x64F6, 0x64F4,
- 0x64F2, 0x64FA, 0x6500, 0x64FD, 0x6518, 0x651C, 0x6505, 0x6524,
- 0x6523, 0x652B, 0x6534, 0x6535, 0x6537, 0x6536, 0x6538, 0x754B,
- 0x6548, 0x6556, 0x6555, 0x654D, 0x6558, 0x655E, 0x655D, 0x6572,
- 0x6578, 0x6582, 0x6583, 0x8B8A, 0x659B, 0x659F, 0x65AB, 0x65B7,
- 0x65C3, 0x65C6, 0x65C1, 0x65C4, 0x65CC, 0x65D2, 0x65DB, 0x65D9,
- 0x65E0, 0x65E1, 0x65F1, 0x6772, 0x660A, 0x6603, 0x65FB, 0x6773,
- 0x6635, 0x6636, 0x6634, 0x661C, 0x664F, 0x6644, 0x6649, 0x6641,
- 0x665E, 0x665D, 0x6664, 0x6667, 0x6668, 0x665F, 0x6662, 0x6670,
- 0x6683, 0x6688, 0x668E, 0x6689, 0x6684, 0x6698, 0x669D, 0x66C1,
- 0x66B9, 0x66C9, 0x66BE, 0x66BC, 0x66C4, 0x66B8, 0x66D6, 0x66DA,
- 0x66E0, 0x663F, 0x66E6, 0x66E9, 0x66F0, 0x66F5, 0x66F7, 0x670F,
- 0x6716, 0x671E, 0x6726, 0x6727, 0x9738, 0x672E, 0x673F, 0x6736,
- 0x6741, 0x6738, 0x6737, 0x6746, 0x675E, 0x6760, 0x6759, 0x6763,
- 0x6764, 0x6789, 0x6770, 0x67A9, 0x677C, 0x676A, 0x678C, 0x678B,
- 0x67A6, 0x67A1, 0x6785, 0x67B7, 0x67EF, 0x67B4, 0x67EC, 0x67B3,
- 0x67E9, 0x67B8, 0x67E4, 0x67DE, 0x67DD, 0x67E2, 0x67EE, 0x67B9,
- 0x67CE, 0x67C6, 0x67E7, 0x6A9C, 0x681E, 0x6846, 0x6829, 0x6840,
- 0x684D, 0x6832, 0x684E, 0x68B3, 0x682B, 0x6859, 0x6863, 0x6877,
- 0x687F, 0x689F, 0x688F, 0x68AD, 0x6894, 0x689D, 0x689B, 0x6883,
- 0x6AAE, 0x68B9, 0x6874, 0x68B5, 0x68A0, 0x68BA, 0x690F, 0x688D,
- 0x687E, 0x6901, 0x68CA, 0x6908, 0x68D8, 0x6922, 0x6926, 0x68E1,
- 0x690C, 0x68CD, 0x68D4, 0x68E7, 0x68D5, 0x6936, 0x6912, 0x6904,
- 0x68D7, 0x68E3, 0x6925, 0x68F9, 0x68E0, 0x68EF, 0x6928, 0x692A,
- 0x691A, 0x6923, 0x6921, 0x68C6, 0x6979, 0x6977, 0x695C, 0x6978,
- 0x696B, 0x6954, 0x697E, 0x696E, 0x6939, 0x6974, 0x693D, 0x6959,
- 0x6930, 0x6961, 0x695E, 0x695D, 0x6981, 0x696A, 0x69B2, 0x69AE,
- 0x69D0, 0x69BF, 0x69C1, 0x69D3, 0x69BE, 0x69CE, 0x5BE8, 0x69CA,
- 0x69DD, 0x69BB, 0x69C3, 0x69A7, 0x6A2E, 0x6991, 0x69A0, 0x699C,
- 0x6995, 0x69B4, 0x69DE, 0x69E8, 0x6A02, 0x6A1B, 0x69FF, 0x6B0A,
- 0x69F9, 0x69F2, 0x69E7, 0x6A05, 0x69B1, 0x6A1E, 0x69ED, 0x6A14,
- 0x69EB, 0x6A0A, 0x6A12, 0x6AC1, 0x6A23, 0x6A13, 0x6A44, 0x6A0C,
- 0x6A72, 0x6A36, 0x6A78, 0x6A47, 0x6A62, 0x6A59, 0x6A66, 0x6A48,
- 0x6A38, 0x6A22, 0x6A90, 0x6A8D, 0x6AA0, 0x6A84, 0x6AA2, 0x6AA3,
- 0x6A97, 0x8617, 0x6ABB, 0x6AC3, 0x6AC2, 0x6AB8, 0x6AB3, 0x6AAC,
- 0x6ADE, 0x6AD1, 0x6ADF, 0x6AAA, 0x6ADA, 0x6AEA, 0x6AFB, 0x6B05,
- 0x8616, 0x6AFA, 0x6B12, 0x6B16, 0x9B31, 0x6B1F, 0x6B38, 0x6B37,
- 0x76DC, 0x6B39, 0x98EE, 0x6B47, 0x6B43, 0x6B49, 0x6B50, 0x6B59,
- 0x6B54, 0x6B5B, 0x6B5F, 0x6B61, 0x6B78, 0x6B79, 0x6B7F, 0x6B80,
- 0x6B84, 0x6B83, 0x6B8D, 0x6B98, 0x6B95, 0x6B9E, 0x6BA4, 0x6BAA,
- 0x6BAB, 0x6BAF, 0x6BB2, 0x6BB1, 0x6BB3, 0x6BB7, 0x6BBC, 0x6BC6,
- 0x6BCB, 0x6BD3, 0x6BDF, 0x6BEC, 0x6BEB, 0x6BF3, 0x6BEF, 0x9EBE,
- 0x6C08, 0x6C13, 0x6C14, 0x6C1B, 0x6C24, 0x6C23, 0x6C5E, 0x6C55,
- 0x6C62, 0x6C6A, 0x6C82, 0x6C8D, 0x6C9A, 0x6C81, 0x6C9B, 0x6C7E,
- 0x6C68, 0x6C73, 0x6C92, 0x6C90, 0x6CC4, 0x6CF1, 0x6CD3, 0x6CBD,
- 0x6CD7, 0x6CC5, 0x6CDD, 0x6CAE, 0x6CB1, 0x6CBE, 0x6CBA, 0x6CDB,
- 0x6CEF, 0x6CD9, 0x6CEA, 0x6D1F, 0x884D, 0x6D36, 0x6D2B, 0x6D3D,
- 0x6D38, 0x6D19, 0x6D35, 0x6D33, 0x6D12, 0x6D0C, 0x6D63, 0x6D93,
- 0x6D64, 0x6D5A, 0x6D79, 0x6D59, 0x6D8E, 0x6D95, 0x6FE4, 0x6D85,
- 0x6DF9, 0x6E15, 0x6E0A, 0x6DB5, 0x6DC7, 0x6DE6, 0x6DB8, 0x6DC6,
- 0x6DEC, 0x6DDE, 0x6DCC, 0x6DE8, 0x6DD2, 0x6DC5, 0x6DFA, 0x6DD9,
- 0x6DE4, 0x6DD5, 0x6DEA, 0x6DEE, 0x6E2D, 0x6E6E, 0x6E2E, 0x6E19,
- 0x6E72, 0x6E5F, 0x6E3E, 0x6E23, 0x6E6B, 0x6E2B, 0x6E76, 0x6E4D,
- 0x6E1F, 0x6E43, 0x6E3A, 0x6E4E, 0x6E24, 0x6EFF, 0x6E1D, 0x6E38,
- 0x6E82, 0x6EAA, 0x6E98, 0x6EC9, 0x6EB7, 0x6ED3, 0x6EBD, 0x6EAF,
- 0x6EC4, 0x6EB2, 0x6ED4, 0x6ED5, 0x6E8F, 0x6EA5, 0x6EC2, 0x6E9F,
- 0x6F41, 0x6F11, 0x704C, 0x6EEC, 0x6EF8, 0x6EFE, 0x6F3F, 0x6EF2,
- 0x6F31, 0x6EEF, 0x6F32, 0x6ECC, 0x6F3E, 0x6F13, 0x6EF7, 0x6F86,
- 0x6F7A, 0x6F78, 0x6F81, 0x6F80, 0x6F6F, 0x6F5B, 0x6FF3, 0x6F6D,
- 0x6F82, 0x6F7C, 0x6F58, 0x6F8E, 0x6F91, 0x6FC2, 0x6F66, 0x6FB3,
- 0x6FA3, 0x6FA1, 0x6FA4, 0x6FB9, 0x6FC6, 0x6FAA, 0x6FDF, 0x6FD5,
- 0x6FEC, 0x6FD4, 0x6FD8, 0x6FF1, 0x6FEE, 0x6FDB, 0x7009, 0x700B,
- 0x6FFA, 0x7011, 0x7001, 0x700F, 0x6FFE, 0x701B, 0x701A, 0x6F74,
- 0x701D, 0x7018, 0x701F, 0x7030, 0x703E, 0x7032, 0x7051, 0x7063,
- 0x7099, 0x7092, 0x70AF, 0x70F1, 0x70AC, 0x70B8, 0x70B3, 0x70AE,
- 0x70DF, 0x70CB, 0x70DD, 0x70D9, 0x7109, 0x70FD, 0x711C, 0x7119,
- 0x7165, 0x7155, 0x7188, 0x7166, 0x7162, 0x714C, 0x7156, 0x716C,
- 0x718F, 0x71FB, 0x7184, 0x7195, 0x71A8, 0x71AC, 0x71D7, 0x71B9,
- 0x71BE, 0x71D2, 0x71C9, 0x71D4, 0x71CE, 0x71E0, 0x71EC, 0x71E7,
- 0x71F5, 0x71FC, 0x71F9, 0x71FF, 0x720D, 0x7210, 0x721B, 0x7228,
- 0x722D, 0x722C, 0x7230, 0x7232, 0x723B, 0x723C, 0x723F, 0x7240,
- 0x7246, 0x724B, 0x7258, 0x7274, 0x727E, 0x7282, 0x7281, 0x7287,
- 0x7292, 0x7296, 0x72A2, 0x72A7, 0x72B9, 0x72B2, 0x72C3, 0x72C6,
- 0x72C4, 0x72CE, 0x72D2, 0x72E2, 0x72E0, 0x72E1, 0x72F9, 0x72F7,
- 0x500F, 0x7317, 0x730A, 0x731C, 0x7316, 0x731D, 0x7334, 0x732F,
- 0x7329, 0x7325, 0x733E, 0x734E, 0x734F, 0x9ED8, 0x7357, 0x736A,
- 0x7368, 0x7370, 0x7378, 0x7375, 0x737B, 0x737A, 0x73C8, 0x73B3,
- 0x73CE, 0x73BB, 0x73C0, 0x73E5, 0x73EE, 0x73DE, 0x74A2, 0x7405,
- 0x746F, 0x7425, 0x73F8, 0x7432, 0x743A, 0x7455, 0x743F, 0x745F,
- 0x7459, 0x7441, 0x745C, 0x7469, 0x7470, 0x7463, 0x746A, 0x7476,
- 0x747E, 0x748B, 0x749E, 0x74A7, 0x74CA, 0x74CF, 0x74D4, 0x73F1,
- 0x74E0, 0x74E3, 0x74E7, 0x74E9, 0x74EE, 0x74F2, 0x74F0, 0x74F1,
- 0x74F8, 0x74F7, 0x7504, 0x7503, 0x7505, 0x750C, 0x750E, 0x750D,
- 0x7515, 0x7513, 0x751E, 0x7526, 0x752C, 0x753C, 0x7544, 0x754D,
- 0x754A, 0x7549, 0x755B, 0x7546, 0x755A, 0x7569, 0x7564, 0x7567,
- 0x756B, 0x756D, 0x7578, 0x7576, 0x7586, 0x7587, 0x7574, 0x758A,
- 0x7589, 0x7582, 0x7594, 0x759A, 0x759D, 0x75A5, 0x75A3, 0x75C2,
- 0x75B3, 0x75C3, 0x75B5, 0x75BD, 0x75B8, 0x75BC, 0x75B1, 0x75CD,
- 0x75CA, 0x75D2, 0x75D9, 0x75E3, 0x75DE, 0x75FE, 0x75FF, 0x75FC,
- 0x7601, 0x75F0, 0x75FA, 0x75F2, 0x75F3, 0x760B, 0x760D, 0x7609,
- 0x761F, 0x7627, 0x7620, 0x7621, 0x7622, 0x7624, 0x7634, 0x7630,
- 0x763B, 0x7647, 0x7648, 0x7646, 0x765C, 0x7658, 0x7661, 0x7662,
- 0x7668, 0x7669, 0x766A, 0x7667, 0x766C, 0x7670, 0x7672, 0x7676,
- 0x7678, 0x767C, 0x7680, 0x7683, 0x7688, 0x768B, 0x768E, 0x7696,
- 0x7693, 0x7699, 0x769A, 0x76B0, 0x76B4, 0x76B8, 0x76B9, 0x76BA,
- 0x76C2, 0x76CD, 0x76D6, 0x76D2, 0x76DE, 0x76E1, 0x76E5, 0x76E7,
- 0x76EA, 0x862F, 0x76FB, 0x7708, 0x7707, 0x7704, 0x7729, 0x7724,
- 0x771E, 0x7725, 0x7726, 0x771B, 0x7737, 0x7738, 0x7747, 0x775A,
- 0x7768, 0x776B, 0x775B, 0x7765, 0x777F, 0x777E, 0x7779, 0x778E,
- 0x778B, 0x7791, 0x77A0, 0x779E, 0x77B0, 0x77B6, 0x77B9, 0x77BF,
- 0x77BC, 0x77BD, 0x77BB, 0x77C7, 0x77CD, 0x77D7, 0x77DA, 0x77DC,
- 0x77E3, 0x77EE, 0x77FC, 0x780C, 0x7812, 0x7926, 0x7820, 0x792A,
- 0x7845, 0x788E, 0x7874, 0x7886, 0x787C, 0x789A, 0x788C, 0x78A3,
- 0x78B5, 0x78AA, 0x78AF, 0x78D1, 0x78C6, 0x78CB, 0x78D4, 0x78BE,
- 0x78BC, 0x78C5, 0x78CA, 0x78EC, 0x78E7, 0x78DA, 0x78FD, 0x78F4,
- 0x7907, 0x7912, 0x7911, 0x7919, 0x792C, 0x792B, 0x7940, 0x7960,
- 0x7957, 0x795F, 0x795A, 0x7955, 0x7953, 0x797A, 0x797F, 0x798A,
- 0x799D, 0x79A7, 0x9F4B, 0x79AA, 0x79AE, 0x79B3, 0x79B9, 0x79BA,
- 0x79C9, 0x79D5, 0x79E7, 0x79EC, 0x79E1, 0x79E3, 0x7A08, 0x7A0D,
- 0x7A18, 0x7A19, 0x7A20, 0x7A1F, 0x7980, 0x7A31, 0x7A3B, 0x7A3E,
- 0x7A37, 0x7A43, 0x7A57, 0x7A49, 0x7A61, 0x7A62, 0x7A69, 0x9F9D,
- 0x7A70, 0x7A79, 0x7A7D, 0x7A88, 0x7A97, 0x7A95, 0x7A98, 0x7A96,
- 0x7AA9, 0x7AC8, 0x7AB0, 0x7AB6, 0x7AC5, 0x7AC4, 0x7ABF, 0x9083,
- 0x7AC7, 0x7ACA, 0x7ACD, 0x7ACF, 0x7AD5, 0x7AD3, 0x7AD9, 0x7ADA,
- 0x7ADD, 0x7AE1, 0x7AE2, 0x7AE6, 0x7AED, 0x7AF0, 0x7B02, 0x7B0F,
- 0x7B0A, 0x7B06, 0x7B33, 0x7B18, 0x7B19, 0x7B1E, 0x7B35, 0x7B28,
- 0x7B36, 0x7B50, 0x7B7A, 0x7B04, 0x7B4D, 0x7B0B, 0x7B4C, 0x7B45,
- 0x7B75, 0x7B65, 0x7B74, 0x7B67, 0x7B70, 0x7B71, 0x7B6C, 0x7B6E,
- 0x7B9D, 0x7B98, 0x7B9F, 0x7B8D, 0x7B9C, 0x7B9A, 0x7B8B, 0x7B92,
- 0x7B8F, 0x7B5D, 0x7B99, 0x7BCB, 0x7BC1, 0x7BCC, 0x7BCF, 0x7BB4,
- 0x7BC6, 0x7BDD, 0x7BE9, 0x7C11, 0x7C14, 0x7BE6, 0x7BE5, 0x7C60,
- 0x7C00, 0x7C07, 0x7C13, 0x7BF3, 0x7BF7, 0x7C17, 0x7C0D, 0x7BF6,
- 0x7C23, 0x7C27, 0x7C2A, 0x7C1F, 0x7C37, 0x7C2B, 0x7C3D, 0x7C4C,
- 0x7C43, 0x7C54, 0x7C4F, 0x7C40, 0x7C50, 0x7C58, 0x7C5F, 0x7C64,
- 0x7C56, 0x7C65, 0x7C6C, 0x7C75, 0x7C83, 0x7C90, 0x7CA4, 0x7CAD,
- 0x7CA2, 0x7CAB, 0x7CA1, 0x7CA8, 0x7CB3, 0x7CB2, 0x7CB1, 0x7CAE,
- 0x7CB9, 0x7CBD, 0x7CC0, 0x7CC5, 0x7CC2, 0x7CD8, 0x7CD2, 0x7CDC,
- 0x7CE2, 0x9B3B, 0x7CEF, 0x7CF2, 0x7CF4, 0x7CF6, 0x7CFA, 0x7D06,
- 0x7D02, 0x7D1C, 0x7D15, 0x7D0A, 0x7D45, 0x7D4B, 0x7D2E, 0x7D32,
- 0x7D3F, 0x7D35, 0x7D46, 0x7D73, 0x7D56, 0x7D4E, 0x7D72, 0x7D68,
- 0x7D6E, 0x7D4F, 0x7D63, 0x7D93, 0x7D89, 0x7D5B, 0x7D8F, 0x7D7D,
- 0x7D9B, 0x7DBA, 0x7DAE, 0x7DA3, 0x7DB5, 0x7DC7, 0x7DBD, 0x7DAB,
- 0x7E3D, 0x7DA2, 0x7DAF, 0x7DDC, 0x7DB8, 0x7D9F, 0x7DB0, 0x7DD8,
- 0x7DDD, 0x7DE4, 0x7DDE, 0x7DFB, 0x7DF2, 0x7DE1, 0x7E05, 0x7E0A,
- 0x7E23, 0x7E21, 0x7E12, 0x7E31, 0x7E1F, 0x7E09, 0x7E0B, 0x7E22,
- 0x7E46, 0x7E66, 0x7E3B, 0x7E35, 0x7E39, 0x7E43, 0x7E37, 0x7E32,
- 0x7E3A, 0x7E67, 0x7E5D, 0x7E56, 0x7E5E, 0x7E59, 0x7E5A, 0x7E79,
- 0x7E6A, 0x7E69, 0x7E7C, 0x7E7B, 0x7E83, 0x7DD5, 0x7E7D, 0x8FAE,
- 0x7E7F, 0x7E88, 0x7E89, 0x7E8C, 0x7E92, 0x7E90, 0x7E93, 0x7E94,
- 0x7E96, 0x7E8E, 0x7E9B, 0x7E9C, 0x7F38, 0x7F3A, 0x7F45, 0x7F4C,
- 0x7F4D, 0x7F4E, 0x7F50, 0x7F51, 0x7F55, 0x7F54, 0x7F58, 0x7F5F,
- 0x7F60, 0x7F68, 0x7F69, 0x7F67, 0x7F78, 0x7F82, 0x7F86, 0x7F83,
- 0x7F88, 0x7F87, 0x7F8C, 0x7F94, 0x7F9E, 0x7F9D, 0x7F9A, 0x7FA3,
- 0x7FAF, 0x7FB2, 0x7FB9, 0x7FAE, 0x7FB6, 0x7FB8, 0x8B71, 0x7FC5,
- 0x7FC6, 0x7FCA, 0x7FD5, 0x7FD4, 0x7FE1, 0x7FE6, 0x7FE9, 0x7FF3,
- 0x7FF9, 0x98DC, 0x8006, 0x8004, 0x800B, 0x8012, 0x8018, 0x8019,
- 0x801C, 0x8021, 0x8028, 0x803F, 0x803B, 0x804A, 0x8046, 0x8052,
- 0x8058, 0x805A, 0x805F, 0x8062, 0x8068, 0x8073, 0x8072, 0x8070,
- 0x8076, 0x8079, 0x807D, 0x807F, 0x8084, 0x8086, 0x8085, 0x809B,
- 0x8093, 0x809A, 0x80AD, 0x5190, 0x80AC, 0x80DB, 0x80E5, 0x80D9,
- 0x80DD, 0x80C4, 0x80DA, 0x80D6, 0x8109, 0x80EF, 0x80F1, 0x811B,
- 0x8129, 0x8123, 0x812F, 0x814B, 0x968B, 0x8146, 0x813E, 0x8153,
- 0x8151, 0x80FC, 0x8171, 0x816E, 0x8165, 0x8166, 0x8174, 0x8183,
- 0x8188, 0x818A, 0x8180, 0x8182, 0x81A0, 0x8195, 0x81A4, 0x81A3,
- 0x815F, 0x8193, 0x81A9, 0x81B0, 0x81B5, 0x81BE, 0x81B8, 0x81BD,
- 0x81C0, 0x81C2, 0x81BA, 0x81C9, 0x81CD, 0x81D1, 0x81D9, 0x81D8,
- 0x81C8, 0x81DA, 0x81DF, 0x81E0, 0x81E7, 0x81FA, 0x81FB, 0x81FE,
- 0x8201, 0x8202, 0x8205, 0x8207, 0x820A, 0x820D, 0x8210, 0x8216,
- 0x8229, 0x822B, 0x8238, 0x8233, 0x8240, 0x8259, 0x8258, 0x825D,
- 0x825A, 0x825F, 0x8264, 0x8262, 0x8268, 0x826A, 0x826B, 0x822E,
- 0x8271, 0x8277, 0x8278, 0x827E, 0x828D, 0x8292, 0x82AB, 0x829F,
- 0x82BB, 0x82AC, 0x82E1, 0x82E3, 0x82DF, 0x82D2, 0x82F4, 0x82F3,
- 0x82FA, 0x8393, 0x8303, 0x82FB, 0x82F9, 0x82DE, 0x8306, 0x82DC,
- 0x8309, 0x82D9, 0x8335, 0x8334, 0x8316, 0x8332, 0x8331, 0x8340,
- 0x8339, 0x8350, 0x8345, 0x832F, 0x832B, 0x8317, 0x8318, 0x8385,
- 0x839A, 0x83AA, 0x839F, 0x83A2, 0x8396, 0x8323, 0x838E, 0x8387,
- 0x838A, 0x837C, 0x83B5, 0x8373, 0x8375, 0x83A0, 0x8389, 0x83A8,
- 0x83F4, 0x8413, 0x83EB, 0x83CE, 0x83FD, 0x8403, 0x83D8, 0x840B,
- 0x83C1, 0x83F7, 0x8407, 0x83E0, 0x83F2, 0x840D, 0x8422, 0x8420,
- 0x83BD, 0x8438, 0x8506, 0x83FB, 0x846D, 0x842A, 0x843C, 0x855A,
- 0x8484, 0x8477, 0x846B, 0x84AD, 0x846E, 0x8482, 0x8469, 0x8446,
- 0x842C, 0x846F, 0x8479, 0x8435, 0x84CA, 0x8462, 0x84B9, 0x84BF,
- 0x849F, 0x84D9, 0x84CD, 0x84BB, 0x84DA, 0x84D0, 0x84C1, 0x84C6,
- 0x84D6, 0x84A1, 0x8521, 0x84FF, 0x84F4, 0x8517, 0x8518, 0x852C,
- 0x851F, 0x8515, 0x8514, 0x84FC, 0x8540, 0x8563, 0x8558, 0x8548,
- 0x8541, 0x8602, 0x854B, 0x8555, 0x8580, 0x85A4, 0x8588, 0x8591,
- 0x858A, 0x85A8, 0x856D, 0x8594, 0x859B, 0x85EA, 0x8587, 0x859C,
- 0x8577, 0x857E, 0x8590, 0x85C9, 0x85BA, 0x85CF, 0x85B9, 0x85D0,
- 0x85D5, 0x85DD, 0x85E5, 0x85DC, 0x85F9, 0x860A, 0x8613, 0x860B,
- 0x85FE, 0x85FA, 0x8606, 0x8622, 0x861A, 0x8630, 0x863F, 0x864D,
- 0x4E55, 0x8654, 0x865F, 0x8667, 0x8671, 0x8693, 0x86A3, 0x86A9,
- 0x86AA, 0x868B, 0x868C, 0x86B6, 0x86AF, 0x86C4, 0x86C6, 0x86B0,
- 0x86C9, 0x8823, 0x86AB, 0x86D4, 0x86DE, 0x86E9, 0x86EC, 0x86DF,
- 0x86DB, 0x86EF, 0x8712, 0x8706, 0x8708, 0x8700, 0x8703, 0x86FB,
- 0x8711, 0x8709, 0x870D, 0x86F9, 0x870A, 0x8734, 0x873F, 0x8737,
- 0x873B, 0x8725, 0x8729, 0x871A, 0x8760, 0x875F, 0x8778, 0x874C,
- 0x874E, 0x8774, 0x8757, 0x8768, 0x876E, 0x8759, 0x8753, 0x8763,
- 0x876A, 0x8805, 0x87A2, 0x879F, 0x8782, 0x87AF, 0x87CB, 0x87BD,
- 0x87C0, 0x87D0, 0x96D6, 0x87AB, 0x87C4, 0x87B3, 0x87C7, 0x87C6,
- 0x87BB, 0x87EF, 0x87F2, 0x87E0, 0x880F, 0x880D, 0x87FE, 0x87F6,
- 0x87F7, 0x880E, 0x87D2, 0x8811, 0x8816, 0x8815, 0x8822, 0x8821,
- 0x8831, 0x8836, 0x8839, 0x8827, 0x883B, 0x8844, 0x8842, 0x8852,
- 0x8859, 0x885E, 0x8862, 0x886B, 0x8881, 0x887E, 0x889E, 0x8875,
- 0x887D, 0x88B5, 0x8872, 0x8882, 0x8897, 0x8892, 0x88AE, 0x8899,
- 0x88A2, 0x888D, 0x88A4, 0x88B0, 0x88BF, 0x88B1, 0x88C3, 0x88C4,
- 0x88D4, 0x88D8, 0x88D9, 0x88DD, 0x88F9, 0x8902, 0x88FC, 0x88F4,
- 0x88E8, 0x88F2, 0x8904, 0x890C, 0x890A, 0x8913, 0x8943, 0x891E,
- 0x8925, 0x892A, 0x892B, 0x8941, 0x8944, 0x893B, 0x8936, 0x8938,
- 0x894C, 0x891D, 0x8960, 0x895E, 0x8966, 0x8964, 0x896D, 0x896A,
- 0x896F, 0x8974, 0x8977, 0x897E, 0x8983, 0x8988, 0x898A, 0x8993,
- 0x8998, 0x89A1, 0x89A9, 0x89A6, 0x89AC, 0x89AF, 0x89B2, 0x89BA,
- 0x89BD, 0x89BF, 0x89C0, 0x89DA, 0x89DC, 0x89DD, 0x89E7, 0x89F4,
- 0x89F8, 0x8A03, 0x8A16, 0x8A10, 0x8A0C, 0x8A1B, 0x8A1D, 0x8A25,
- 0x8A36, 0x8A41, 0x8A5B, 0x8A52, 0x8A46, 0x8A48, 0x8A7C, 0x8A6D,
- 0x8A6C, 0x8A62, 0x8A85, 0x8A82, 0x8A84, 0x8AA8, 0x8AA1, 0x8A91,
- 0x8AA5, 0x8AA6, 0x8A9A, 0x8AA3, 0x8AC4, 0x8ACD, 0x8AC2, 0x8ADA,
- 0x8AEB, 0x8AF3, 0x8AE7, 0x8AE4, 0x8AF1, 0x8B14, 0x8AE0, 0x8AE2,
- 0x8AF7, 0x8ADE, 0x8ADB, 0x8B0C, 0x8B07, 0x8B1A, 0x8AE1, 0x8B16,
- 0x8B10, 0x8B17, 0x8B20, 0x8B33, 0x97AB, 0x8B26, 0x8B2B, 0x8B3E,
- 0x8B28, 0x8B41, 0x8B4C, 0x8B4F, 0x8B4E, 0x8B49, 0x8B56, 0x8B5B,
- 0x8B5A, 0x8B6B, 0x8B5F, 0x8B6C, 0x8B6F, 0x8B74, 0x8B7D, 0x8B80,
- 0x8B8C, 0x8B8E, 0x8B92, 0x8B93, 0x8B96, 0x8B99, 0x8B9A, 0x8C3A,
- 0x8C41, 0x8C3F, 0x8C48, 0x8C4C, 0x8C4E, 0x8C50, 0x8C55, 0x8C62,
- 0x8C6C, 0x8C78, 0x8C7A, 0x8C82, 0x8C89, 0x8C85, 0x8C8A, 0x8C8D,
- 0x8C8E, 0x8C94, 0x8C7C, 0x8C98, 0x621D, 0x8CAD, 0x8CAA, 0x8CBD,
- 0x8CB2, 0x8CB3, 0x8CAE, 0x8CB6, 0x8CC8, 0x8CC1, 0x8CE4, 0x8CE3,
- 0x8CDA, 0x8CFD, 0x8CFA, 0x8CFB, 0x8D04, 0x8D05, 0x8D0A, 0x8D07,
- 0x8D0F, 0x8D0D, 0x8D10, 0x9F4E, 0x8D13, 0x8CCD, 0x8D14, 0x8D16,
- 0x8D67, 0x8D6D, 0x8D71, 0x8D73, 0x8D81, 0x8D99, 0x8DC2, 0x8DBE,
- 0x8DBA, 0x8DCF, 0x8DDA, 0x8DD6, 0x8DCC, 0x8DDB, 0x8DCB, 0x8DEA,
- 0x8DEB, 0x8DDF, 0x8DE3, 0x8DFC, 0x8E08, 0x8E09, 0x8DFF, 0x8E1D,
- 0x8E1E, 0x8E10, 0x8E1F, 0x8E42, 0x8E35, 0x8E30, 0x8E34, 0x8E4A,
- 0x8E47, 0x8E49, 0x8E4C, 0x8E50, 0x8E48, 0x8E59, 0x8E64, 0x8E60,
- 0x8E2A, 0x8E63, 0x8E55, 0x8E76, 0x8E72, 0x8E7C, 0x8E81, 0x8E87,
- 0x8E85, 0x8E84, 0x8E8B, 0x8E8A, 0x8E93, 0x8E91, 0x8E94, 0x8E99,
- 0x8EAA, 0x8EA1, 0x8EAC, 0x8EB0, 0x8EC6, 0x8EB1, 0x8EBE, 0x8EC5,
- 0x8EC8, 0x8ECB, 0x8EDB, 0x8EE3, 0x8EFC, 0x8EFB, 0x8EEB, 0x8EFE,
- 0x8F0A, 0x8F05, 0x8F15, 0x8F12, 0x8F19, 0x8F13, 0x8F1C, 0x8F1F,
- 0x8F1B, 0x8F0C, 0x8F26, 0x8F33, 0x8F3B, 0x8F39, 0x8F45, 0x8F42,
- 0x8F3E, 0x8F4C, 0x8F49, 0x8F46, 0x8F4E, 0x8F57, 0x8F5C, 0x8F62,
- 0x8F63, 0x8F64, 0x8F9C, 0x8F9F, 0x8FA3, 0x8FAD, 0x8FAF, 0x8FB7,
- 0x8FDA, 0x8FE5, 0x8FE2, 0x8FEA, 0x8FEF, 0x9087, 0x8FF4, 0x9005,
- 0x8FF9, 0x8FFA, 0x9011, 0x9015, 0x9021, 0x900D, 0x901E, 0x9016,
- 0x900B, 0x9027, 0x9036, 0x9035, 0x9039, 0x8FF8, 0x904F, 0x9050,
- 0x9051, 0x9052, 0x900E, 0x9049, 0x903E, 0x9056, 0x9058, 0x905E,
- 0x9068, 0x906F, 0x9076, 0x96A8, 0x9072, 0x9082, 0x907D, 0x9081,
- 0x9080, 0x908A, 0x9089, 0x908F, 0x90A8, 0x90AF, 0x90B1, 0x90B5,
- 0x90E2, 0x90E4, 0x6248, 0x90DB, 0x9102, 0x9112, 0x9119, 0x9132,
- 0x9130, 0x914A, 0x9156, 0x9158, 0x9163, 0x9165, 0x9169, 0x9173,
- 0x9172, 0x918B, 0x9189, 0x9182, 0x91A2, 0x91AB, 0x91AF, 0x91AA,
- 0x91B5, 0x91B4, 0x91BA, 0x91C0, 0x91C1, 0x91C9, 0x91CB, 0x91D0,
- 0x91D6, 0x91DF, 0x91E1, 0x91DB, 0x91FC, 0x91F5, 0x91F6, 0x921E,
- 0x91FF, 0x9214, 0x922C, 0x9215, 0x9211, 0x925E, 0x9257, 0x9245,
- 0x9249, 0x9264, 0x9248, 0x9295, 0x923F, 0x924B, 0x9250, 0x929C,
- 0x9296, 0x9293, 0x929B, 0x925A, 0x92CF, 0x92B9, 0x92B7, 0x92E9,
- 0x930F, 0x92FA, 0x9344, 0x932E, 0x9319, 0x9322, 0x931A, 0x9323,
- 0x933A, 0x9335, 0x933B, 0x935C, 0x9360, 0x937C, 0x936E, 0x9356,
- 0x93B0, 0x93AC, 0x93AD, 0x9394, 0x93B9, 0x93D6, 0x93D7, 0x93E8,
- 0x93E5, 0x93D8, 0x93C3, 0x93DD, 0x93D0, 0x93C8, 0x93E4, 0x941A,
- 0x9414, 0x9413, 0x9403, 0x9407, 0x9410, 0x9436, 0x942B, 0x9435,
- 0x9421, 0x943A, 0x9441, 0x9452, 0x9444, 0x945B, 0x9460, 0x9462,
- 0x945E, 0x946A, 0x9229, 0x9470, 0x9475, 0x9477, 0x947D, 0x945A,
- 0x947C, 0x947E, 0x9481, 0x947F, 0x9582, 0x9587, 0x958A, 0x9594,
- 0x9596, 0x9598, 0x9599, 0x95A0, 0x95A8, 0x95A7, 0x95AD, 0x95BC,
- 0x95BB, 0x95B9, 0x95BE, 0x95CA, 0x6FF6, 0x95C3, 0x95CD, 0x95CC,
- 0x95D5, 0x95D4, 0x95D6, 0x95DC, 0x95E1, 0x95E5, 0x95E2, 0x9621,
- 0x9628, 0x962E, 0x962F, 0x9642, 0x964C, 0x964F, 0x964B, 0x9677,
- 0x965C, 0x965E, 0x965D, 0x965F, 0x9666, 0x9672, 0x966C, 0x968D,
- 0x9698, 0x9695, 0x9697, 0x96AA, 0x96A7, 0x96B1, 0x96B2, 0x96B0,
- 0x96B4, 0x96B6, 0x96B8, 0x96B9, 0x96CE, 0x96CB, 0x96C9, 0x96CD,
- 0x894D, 0x96DC, 0x970D, 0x96D5, 0x96F9, 0x9704, 0x9706, 0x9708,
- 0x9713, 0x970E, 0x9711, 0x970F, 0x9716, 0x9719, 0x9724, 0x972A,
- 0x9730, 0x9739, 0x973D, 0x973E, 0x9744, 0x9746, 0x9748, 0x9742,
- 0x9749, 0x975C, 0x9760, 0x9764, 0x9766, 0x9768, 0x52D2, 0x976B,
- 0x9771, 0x9779, 0x9785, 0x977C, 0x9781, 0x977A, 0x9786, 0x978B,
- 0x978F, 0x9790, 0x979C, 0x97A8, 0x97A6, 0x97A3, 0x97B3, 0x97B4,
- 0x97C3, 0x97C6, 0x97C8, 0x97CB, 0x97DC, 0x97ED, 0x9F4F, 0x97F2,
- 0x7ADF, 0x97F6, 0x97F5, 0x980F, 0x980C, 0x9838, 0x9824, 0x9821,
- 0x9837, 0x983D, 0x9846, 0x984F, 0x984B, 0x986B, 0x986F, 0x9870,
- 0x9871, 0x9874, 0x9873, 0x98AA, 0x98AF, 0x98B1, 0x98B6, 0x98C4,
- 0x98C3, 0x98C6, 0x98E9, 0x98EB, 0x9903, 0x9909, 0x9912, 0x9914,
- 0x9918, 0x9921, 0x991D, 0x991E, 0x9924, 0x9920, 0x992C, 0x992E,
- 0x993D, 0x993E, 0x9942, 0x9949, 0x9945, 0x9950, 0x994B, 0x9951,
- 0x9952, 0x994C, 0x9955, 0x9997, 0x9998, 0x99A5, 0x99AD, 0x99AE,
- 0x99BC, 0x99DF, 0x99DB, 0x99DD, 0x99D8, 0x99D1, 0x99ED, 0x99EE,
- 0x99F1, 0x99F2, 0x99FB, 0x99F8, 0x9A01, 0x9A0F, 0x9A05, 0x99E2,
- 0x9A19, 0x9A2B, 0x9A37, 0x9A45, 0x9A42, 0x9A40, 0x9A43, 0x9A3E,
- 0x9A55, 0x9A4D, 0x9A5B, 0x9A57, 0x9A5F, 0x9A62, 0x9A65, 0x9A64,
- 0x9A69, 0x9A6B, 0x9A6A, 0x9AAD, 0x9AB0, 0x9ABC, 0x9AC0, 0x9ACF,
- 0x9AD1, 0x9AD3, 0x9AD4, 0x9ADE, 0x9ADF, 0x9AE2, 0x9AE3, 0x9AE6,
- 0x9AEF, 0x9AEB, 0x9AEE, 0x9AF4, 0x9AF1, 0x9AF7, 0x9AFB, 0x9B06,
- 0x9B18, 0x9B1A, 0x9B1F, 0x9B22, 0x9B23, 0x9B25, 0x9B27, 0x9B28,
- 0x9B29, 0x9B2A, 0x9B2E, 0x9B2F, 0x9B32, 0x9B44, 0x9B43, 0x9B4F,
- 0x9B4D, 0x9B4E, 0x9B51, 0x9B58, 0x9B74, 0x9B93, 0x9B83, 0x9B91,
- 0x9B96, 0x9B97, 0x9B9F, 0x9BA0, 0x9BA8, 0x9BB4, 0x9BC0, 0x9BCA,
- 0x9BB9, 0x9BC6, 0x9BCF, 0x9BD1, 0x9BD2, 0x9BE3, 0x9BE2, 0x9BE4,
- 0x9BD4, 0x9BE1, 0x9C3A, 0x9BF2, 0x9BF1, 0x9BF0, 0x9C15, 0x9C14,
- 0x9C09, 0x9C13, 0x9C0C, 0x9C06, 0x9C08, 0x9C12, 0x9C0A, 0x9C04,
- 0x9C2E, 0x9C1B, 0x9C25, 0x9C24, 0x9C21, 0x9C30, 0x9C47, 0x9C32,
- 0x9C46, 0x9C3E, 0x9C5A, 0x9C60, 0x9C67, 0x9C76, 0x9C78, 0x9CE7,
- 0x9CEC, 0x9CF0, 0x9D09, 0x9D08, 0x9CEB, 0x9D03, 0x9D06, 0x9D2A,
- 0x9D26, 0x9DAF, 0x9D23, 0x9D1F, 0x9D44, 0x9D15, 0x9D12, 0x9D41,
- 0x9D3F, 0x9D3E, 0x9D46, 0x9D48, 0x9D5D, 0x9D5E, 0x9D64, 0x9D51,
- 0x9D50, 0x9D59, 0x9D72, 0x9D89, 0x9D87, 0x9DAB, 0x9D6F, 0x9D7A,
- 0x9D9A, 0x9DA4, 0x9DA9, 0x9DB2, 0x9DC4, 0x9DC1, 0x9DBB, 0x9DB8,
- 0x9DBA, 0x9DC6, 0x9DCF, 0x9DC2, 0x9DD9, 0x9DD3, 0x9DF8, 0x9DE6,
- 0x9DED, 0x9DEF, 0x9DFD, 0x9E1A, 0x9E1B, 0x9E1E, 0x9E75, 0x9E79,
- 0x9E7D, 0x9E81, 0x9E88, 0x9E8B, 0x9E8C, 0x9E92, 0x9E95, 0x9E91,
- 0x9E9D, 0x9EA5, 0x9EA9, 0x9EB8, 0x9EAA, 0x9EAD, 0x9761, 0x9ECC,
- 0x9ECE, 0x9ECF, 0x9ED0, 0x9ED4, 0x9EDC, 0x9EDE, 0x9EDD, 0x9EE0,
- 0x9EE5, 0x9EE8, 0x9EEF, 0x9EF4, 0x9EF6, 0x9EF7, 0x9EF9, 0x9EFB,
- 0x9EFC, 0x9EFD, 0x9F07, 0x9F08, 0x76B7, 0x9F15, 0x9F21, 0x9F2C,
- 0x9F3E, 0x9F4A, 0x9F52, 0x9F54, 0x9F63, 0x9F5F, 0x9F60, 0x9F61,
- 0x9F66, 0x9F67, 0x9F6C, 0x9F6A, 0x9F77, 0x9F72, 0x9F76, 0x9F95,
- 0x9F9C, 0x9FA0, 0x582F, 0x69C7, 0x9059, 0x7464, 0x2642, 0x2500,
- 0x2501, 0x2502, 0x2503, 0x2504, 0x2505, 0x2506, 0x2507, 0x2508,
- 0x2509, 0x250A, 0x250B, 0x250C, 0x250D, 0x250E, 0x250F, 0x2510,
- 0x2511, 0x2512, 0x2513, 0x2514, 0x2515, 0x2516, 0x2517, 0x2518,
- 0x2519, 0x251A, 0x251B, 0x251C, 0x251D, 0x251E, 0x251F, 0x2520,
- 0x2521, 0x2522, 0x2523, 0x2524, 0x2525, 0x2526, 0x2527, 0x2528,
- 0x2529, 0x252A, 0x252B, 0x252C, 0x252D, 0x252E, 0x252F, 0x2530,
- 0x2531, 0x2532, 0x2533, 0x2534, 0x2535, 0x2536, 0x2537, 0x2538,
- 0x2539, 0x253A, 0x253B, 0x253C, 0x253D, 0x253E, 0x253F, 0x2540,
- 0x2541, 0x2542, 0x2543, 0x2544, 0x2545, 0x2546, 0x2547, 0x2548,
- 0x2549, 0x254A, 0x254B, 0x2460, 0x2461, 0x2462, 0x2463, 0x2464,
- 0x2465, 0x2466, 0x2467, 0x2468, 0x2469, 0x246A, 0x246B, 0x246C,
- 0x246D, 0x246E, 0x246F, 0x2470, 0x2471, 0x2472, 0x2473, 0x2160,
- 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168,
- 0x2169, 0x3349, 0x3314, 0x3322, 0x334D, 0x3318, 0x3327, 0x3303,
- 0x3336, 0x3351, 0x3357, 0x330D, 0x3326, 0x3323, 0x332B, 0x334A,
- 0x333B, 0x339C, 0x339D, 0x339E, 0x338E, 0x338F, 0x33C4, 0x33A1,
- 0x301D, 0x301F, 0x2116, 0x33CD, 0x2121, 0x32A4, 0x32A5, 0x32A6,
- 0x32A7, 0x32A8, 0x3231, 0x3232, 0x3239, 0x337E, 0x337D, 0x337C,
- 0x222E, 0x2211, 0x221A, 0x22A5, 0x2220, 0x221F, 0x22BF, 0x2229,
- 0x222A, 0x555E, 0x98F4, 0x6EA2, 0x9C2F, 0x6DEB, 0x8FC2, 0x6B1D,
- 0x53A9, 0x958F, 0x5642, 0x990C, 0x7130, 0x8956, 0x9DD7, 0x8FE6,
- 0x6062, 0x62D0, 0x6666, 0x559D, 0x845B, 0x9784, 0x5699, 0x6F97,
- 0x7FF0, 0x7FEB, 0x5FBD, 0x7947, 0x4FE0, 0x537F, 0x50C5, 0x8EC0,
- 0x55B0, 0x6ADB, 0x5C51, 0x9774, 0x7941, 0x6167, 0x7A3D, 0x7E6B,
- 0x834A, 0x9699, 0x5026, 0x5ACC, 0x6372, 0x9E7C, 0x8AFA, 0x5DF7,
- 0x663B, 0x6E9D, 0x9EB4, 0x9D60, 0x7511, 0x91C7, 0x698A, 0x6805,
- 0x85A9, 0x9BD6, 0x9306, 0x73CA, 0x53F1, 0x5C62, 0x906E, 0x6753,
- 0x707C, 0x7E61, 0x914B, 0x66D9, 0x6E1A, 0x85AF, 0x85F7, 0x54E8,
- 0x5EE0, 0x68A2, 0x8523, 0x91AC, 0x9798, 0x8755, 0x9771, 0x9017,
- 0x7FE0, 0x647A, 0x901D, 0x87EC, 0x64B0, 0x6813, 0x714E, 0x717D,
- 0x8A6E, 0x564C, 0x9061, 0x5275, 0x6414, 0x7626, 0x905C, 0x9A52,
- 0x817F, 0x9EDB, 0x5544, 0x6FEF, 0x7422, 0x86F8, 0x5DFD, 0x8FBF,
- 0x68DA, 0x9C48, 0x6A3D, 0x7C1E, 0x8A3B, 0x7026, 0x51CB, 0x6357,
- 0x69CC, 0x939A, 0x585A, 0x6451, 0x912D, 0x64E2, 0x6EBA, 0x5861,
- 0x985A, 0x5835, 0x5C60, 0x83DF, 0x8CED, 0x5858, 0x79B1, 0x9D07,
- 0x7006, 0x701E, 0x5678, 0x9041, 0x9813, 0x90A3, 0x8B0E, 0x7058,
- 0x6962, 0x79B0, 0x56CA, 0x724C, 0x9019, 0x79E4, 0x525D, 0x7BB8,
- 0x6F51, 0x91B1, 0x633D, 0x6249, 0x6A0B, 0x67CA, 0x7A17, 0x903C,
- 0x5A9B, 0x8B2C, 0x5EDF, 0x7015, 0x983B, 0x853D, 0x77A5, 0x5A29,
- 0x5E96, 0x6CE1, 0x84EC, 0x9830, 0x9C52, 0x9EB5, 0x5132, 0x9905,
- 0x7C7E, 0x9453, 0x6108, 0x7652, 0x7337, 0x7194, 0x8000, 0x840A,
- 0x907C, 0x6F23, 0x7149, 0x84EE, 0x6994, 0x881F, 0x5154, 0x5189,
- 0x5195, 0x51A4, 0x5539, 0x5533, 0x55E4, 0x5632, 0x56A5, 0x580B,
- 0x5ABE, 0x5BC3, 0x5C5B, 0x5E64, 0x6097, 0x6369, 0x6406, 0x6522,
- 0x6583, 0x67A6, 0x67B4, 0x689B, 0x688E, 0x6E6E, 0x71D7, 0x7228,
- 0x73CE, 0x7504, 0x750D, 0x7515, 0x7693, 0x787C, 0x7A31, 0x9F9D,
- 0x7B99, 0x7C90, 0x7CAE, 0x7D9B, 0x7DAE, 0x7D9F, 0x7FD4, 0x822E,
- 0x828D, 0x82D2, 0x8323, 0x8375, 0x8517, 0x853E, 0x8782, 0x87D2,
- 0x890A, 0x89AF, 0x8ADE, 0x8B41, 0x8DDA, 0x8E09, 0x8F13, 0x8FEA,
- 0x8FE9, 0x9058, 0x6248, 0x91C1, 0x95BB, 0x7762, 0x9724, 0x9760,
- 0x976D, 0x9824, 0x9B2E, 0x9B97, 0x9BF2, 0x9EAA, 0x9F9C, 0x3001,
- 0x3002, 0x203E, 0xFF3F, 0x30FC, 0x2015, 0x2010, 0x301C, 0x2016,
- 0xFF5C, 0x2026, 0x2025, 0xFF08, 0xFF09, 0x3014, 0x3015, 0xFF3B,
- 0xFF3D, 0xFF5B, 0xFF5D, 0x3008, 0x3009, 0x300A, 0x300B, 0x300C,
- 0x300D, 0x300E, 0x300F, 0x3010, 0x3011, 0xFF1D, 0x3041, 0x3043,
- 0x3045, 0x3047, 0x3049, 0x3063, 0x3083, 0x3085, 0x3087, 0x308E,
- 0x30A1, 0x30A3, 0x30A5, 0x30A7, 0x30A9, 0x30C3, 0x30E3, 0x30E5,
- 0x30E7, 0x30EE, 0x30F5, 0x30F6, 0x3349, 0x3314, 0x3322, 0x334D,
- 0x3318, 0x3327, 0x3303, 0x3336, 0x3351, 0x3357, 0x330D, 0x3326,
- 0x3323, 0x332B, 0x334A, 0x333B, 0x301D, 0x301E, 0x3094, 0x304B,
- 0x3051, 0x82A6, 0x8328, 0x5653, 0x53A9, 0x7259, 0x6C72, 0x7B08,
- 0x9957, 0x62F3, 0x9910, 0x976D, 0x717D, 0x7A7F, 0x7BAD, 0x63C3,
- 0x83DF, 0x7962, 0x53DB, 0x7BC7, 0x8FC4, 0x7C3E, 0x50CA, 0x5315,
- 0x55A9, 0x56AE, 0x5819, 0x591B, 0x5C28, 0x5ED0, 0x5ECF, 0x6241,
- 0x66C1, 0x6C08, 0x6E23, 0x6EEC, 0x7A97, 0x7BDD, 0x7FE9, 0x8422,
- 0x8759, 0x880E, 0x87D2, 0x9A19, 0x9EAD, 0xFFE4, 0xFF07, 0xFF02,
- 0x11A8, 0x25C1, 0x25B7, 0x21E9, 0x21E7, 0x21E6, 0x21E8, 0x25A2,
- 0x2667, 0x2661, 0x2664, 0x2662, 0x33A0, 0x33A2, 0x33A4, 0x33A5,
- 0x3397, 0x2113, 0x3398, 0x33B3, 0x33B2, 0x33B1, 0x33B0, 0x3385,
- 0x3386, 0x3387, 0x33CB, 0x3390, 0x33D4, 0x3396, 0x3322, 0x3316,
- 0x3318, 0x3315, 0x3303, 0x3323, 0x3357, 0x3342, 0x3339, 0x333B,
- 0x3300, 0x3331, 0x3347, 0x331E, 0x332A, 0x33CD, 0x337F, 0x2121,
- 0x260E, 0x3036, 0x3020, 0x00A9, 0x00AE, 0x0000, 0x2488, 0x2489,
- 0x248A, 0x248B, 0x248C, 0x248D, 0x248E, 0x248F, 0x2490, 0x2474,
- 0x2475, 0x2476, 0x2477, 0x2478, 0x2479, 0x247A, 0x247B, 0x247C,
- 0x247D, 0x247E, 0x247F, 0x2480, 0x2481, 0x2482, 0x2483, 0x2484,
- 0x2485, 0x2486, 0x2487, 0x3251, 0x2170, 0x2171, 0x2172, 0x2173,
- 0x2174, 0x2175, 0x2176, 0x2177, 0x2178, 0x2179, 0x3252, 0x3253,
- 0x3254, 0x3255, 0x3256, 0x3257, 0x3258, 0x3259, 0x325A, 0x325B,
- 0x249C, 0x249D, 0x249E, 0x249F, 0x24A0, 0x24A1, 0x24A2, 0x24A3,
- 0x24A4, 0x24A5, 0x24A6, 0x24A7, 0x24A8, 0x24A9, 0x24AA, 0x24AB,
- 0x24AC, 0x24AD, 0x24AE, 0x24AF, 0x24B0, 0x24B1, 0x24B2, 0x24B3,
- 0x24B4, 0x24B5, 0x3243, 0x323D, 0x323F, 0x3234, 0x3238, 0x3233,
- 0x323C, 0x3242, 0x323E, 0x3236, 0x3235, 0x323B, 0x3240, 0x323A,
- 0x32B0, 0x32AD, 0x32A9, 0x32AF, 0x3294, 0x32AA, 0x3298, 0x32AB,
- 0x3292, 0x3291, 0x3293, 0x32AC, 0x32AE, 0x3296, 0x23A9, 0x23A8,
- 0x23A7, 0xFE38, 0x23AD, 0x23AC, 0x23AB, 0xFE38, 0x23AB, 0x23AC,
- 0x23AD, 0xFE38, 0x23A7, 0x23A8, 0x23A9, 0xFE38, 0x33CC, 0x3305,
- 0x00BD, 0x00BC, 0x339F, 0x33A3, 0x33A6, 0xFFFD, 0xFFFD, 0x329E,
- 0x3388, 0x3389, 0x33C8, 0x222D, 0x5370, 0x3230, 0x322A, 0x322B,
- 0x322C, 0x322D, 0x322E, 0x322F, 0x3237, 0x3241, 0x27A1, 0x21E6,
- 0x21E7, 0x21E9, 0x25C9, 0x2660, 0x2665, 0x2663, 0x2666, 0x2600,
- 0x2601, 0x2602, 0x2603, 0x261E, 0x261C, 0x261D, 0x261F, 0x3299,
- 0x24EA, 0x216A, 0x216B, 0xFF10, 0xFF10, 0x3000, 0x2581, 0x2582,
- 0x2583, 0x2584, 0x2585, 0x2586, 0x2587, 0x2588, 0x258F, 0x258E,
- 0x258D, 0x258C, 0x258B, 0x258A, 0x2589, 0x2594, 0x2595, 0x256D,
- 0x256E, 0x2570, 0x256F, 0x2550, 0x255E, 0x256A, 0x2561, 0x25E2,
- 0x25E3, 0x25E5, 0x25E4, 0x25CF, 0x0ED0, 0x2571, 0x2572, 0x2573,
- 0x304B, 0x3051, 0x9022, 0x8FBB, 0xFF0C, 0x00B0, 0x3013, 0x309C,
- 0x309B, 0x02CF, 0xFF0E, 0x2018, 0x2019, 0x201C, 0x201D, 0x201C,
- 0x201E, 0x2018, 0x201A, 0x02BA, 0x51DC, 0x7199, 0x2776, 0x2777,
- 0x2778, 0x2779, 0x277A, 0x277B, 0x277C, 0x277D, 0x277E, 0x0000,
- 0x0000, 0x0000, 0x217A, 0x217B, 0x0000, 0x0000, 0x0000, 0x217F,
- 0x210A, 0x2109, 0x0000, 0x0000, 0x3004, 0x21C6, 0x21C4, 0x21C5,
- 0x0000, 0x30F7, 0x30F8, 0x30F9, 0x30FA, 0x5927, 0x5C0F, 0x329D,
- 0x63A7, 0x0000, 0x0000, 0x337B, 0x337F, 0x0000, 0x0000, 0x3333,
- 0x334E, 0x3322, 0x3316, 0x3305, 0x3305, 0x3305, 0x3333, 0x334E,
- 0x334E, 0x334E, 0x3303, 0x3318, 0x3315, 0x3339, 0x3339, 0x3339,
- 0x3357, 0x3342, 0x3342, 0x3342, 0x3323, 0x333B, 0x3300, 0x331E,
- 0x331E, 0x331E, 0x332A, 0x332A, 0x332A, 0x3347, 0x3331, 0x7E8A,
- 0x891C, 0x9348, 0x9288, 0x84DC, 0x4FC9, 0x70BB, 0x6631, 0x68C8,
- 0x92F9, 0x66FB, 0x5F45, 0x4E28, 0x4EE1, 0x4EFC, 0x4F00, 0x4F03,
- 0x4F39, 0x4F56, 0x4F92, 0x4F8A, 0x4F9A, 0x4F94, 0x4FCD, 0x5040,
- 0x5022, 0x4FFF, 0x501E, 0x5046, 0x5070, 0x5042, 0x5094, 0x50F4,
- 0x50D8, 0x514A, 0x5164, 0x519D, 0x51BE, 0x51EC, 0x5215, 0x529C,
- 0x52A6, 0x52C0, 0x52DB, 0x5300, 0x5307, 0x5324, 0x5372, 0x5393,
- 0x53B2, 0x53DD, 0xFA0E, 0x549C, 0x548A, 0x54A9, 0x54FF, 0x5586,
- 0x5759, 0x5765, 0x57AC, 0x57C8, 0x57C7, 0xFA0F, 0xFA10, 0x589E,
- 0x58B2, 0x590B, 0x5953, 0x595B, 0x595D, 0x5963, 0x59A4, 0x59BA,
- 0x5B56, 0x5BC0, 0x752F, 0x5BD8, 0x5BEC, 0x5C1E, 0x5CA6, 0x5CBA,
- 0x5CF5, 0x5D27, 0x5D53, 0xFA11, 0x5D42, 0x5D6D, 0x5DB8, 0x5DB9,
- 0x5DD0, 0x5F21, 0x5F34, 0x5F67, 0x5FB7, 0x5FDE, 0x605D, 0x6085,
- 0x608A, 0x60DE, 0x60D5, 0x6120, 0x60F2, 0x6111, 0x6137, 0x6130,
- 0x6198, 0x6213, 0x62A6, 0x63F5, 0x6460, 0x649D, 0x64CE, 0x654E,
- 0x6600, 0x6615, 0x6609, 0x662E, 0x661E, 0x6624, 0x6665, 0x6657,
- 0x6659, 0xFA12, 0x6673, 0x6699, 0x66A0, 0x66B2, 0x66BF, 0x66FA,
- 0x670E, 0xF929, 0x6766, 0x67BB, 0x6852, 0x67C0, 0x6801, 0x6844,
- 0x68CF, 0xFA13, 0x6968, 0xFA14, 0x6998, 0x69E2, 0x6A30, 0x6A6B,
- 0x6A46, 0x6A73, 0x6A7E, 0x6AE2, 0x6AE4, 0x6BD6, 0x6C3F, 0x6C5C,
- 0x6C86, 0x6C6F, 0x6CDA, 0x6D04, 0x6D87, 0x6D6F, 0x6D96, 0x6DAC,
- 0x6DCF, 0x6DF8, 0x6DF2, 0x6DFC, 0x6E39, 0x6E5C, 0x6E27, 0x6E3C,
- 0x6EBF, 0x6F88, 0x6FB5, 0x6FF5, 0x7005, 0x7007, 0x7028, 0x7085,
- 0x70AB, 0x710F, 0x7104, 0x715C, 0x7146, 0x7147, 0xFA15, 0x71C1,
- 0x71FE, 0x72B1, 0x72BE, 0x7324, 0xFA16, 0x7377, 0x73BD, 0x73C9,
- 0x73D6, 0x73E3, 0x73D2, 0x7407, 0x73F5, 0x7426, 0x742A, 0x7429,
- 0x742E, 0x7462, 0x7489, 0x749F, 0x7501, 0x756F, 0x7682, 0x769C,
- 0x769E, 0x769B, 0x76A6, 0xFA17, 0x7746, 0x52AF, 0x7821, 0x784E,
- 0x7864, 0x787A, 0x7930, 0xFA18, 0xFA19, 0xFA1A, 0x7994, 0xFA1B,
- 0x799B, 0x7AD1, 0x7AE7, 0xFA1C, 0x7AEB, 0x7B9E, 0xFA1D, 0x7D48,
- 0x7D5C, 0x7DB7, 0x7DA0, 0x7DD6, 0x7E52, 0x7F47, 0x7FA1, 0xFA1E,
- 0x8301, 0x8362, 0x837F, 0x83C7, 0x83F6, 0x8448, 0x84B4, 0x8553,
- 0x8559, 0x856B, 0xFA1F, 0x85B0, 0xFA20, 0xFA21, 0x8807, 0x88F5,
- 0x8A12, 0x8A37, 0x8A79, 0x8AA7, 0x8ABE, 0x8ADF, 0xFA22, 0x8AF6,
- 0x8B53, 0x8B7F, 0x8CF0, 0x8CF4, 0x8D12, 0x8D76, 0xFA23, 0x8ECF,
- 0xFA24, 0xFA25, 0x9067, 0x90DE, 0xFA26, 0x9115, 0x9127, 0x91DA,
- 0x91D7, 0x91DE, 0x91ED, 0x91EE, 0x91E4, 0x91E5, 0x9206, 0x9210,
- 0x920A, 0x923A, 0x9240, 0x923C, 0x924E, 0x9259, 0x9251, 0x9239,
- 0x9267, 0x92A7, 0x9277, 0x9278, 0x92E7, 0x92D7, 0x92D9, 0x92D0,
- 0xFA27, 0x92D5, 0x92E0, 0x92D3, 0x9325, 0x9321, 0x92FB, 0xFA28,
- 0x931E, 0x92FF, 0x931D, 0x9302, 0x9370, 0x9357, 0x93A4, 0x93C6,
- 0x93DE, 0x93F8, 0x9431, 0x9445, 0x9448, 0x9592, 0xF9DC, 0xFA29,
- 0x969D, 0x96AF, 0x9733, 0x973B, 0x9743, 0x974D, 0x974F, 0x9751,
- 0x9755, 0x9857, 0x9865, 0xFA2A, 0xFA2B, 0x9927, 0xFA2C, 0x999E,
- 0x9A4E, 0x9AD9, 0x9ADC, 0x9B75, 0x9B72, 0x9B8F, 0x9BB1, 0x9BBB,
- 0x9C00, 0x9D70, 0x9D6B, 0xFA2D, 0x9E19, 0x9ED1, 0x00AC, 0x005C,
- 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
- 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
- 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
- 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
- 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
- 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
- 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
- 0x0058, 0x0059, 0x005A, 0x005B, 0x00A5, 0x005D, 0x005E, 0x005F,
- 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
- 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
- 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
- 0x0078, 0x0079, 0x007A, 0x007B, 0x00A6, 0x007D, 0x0303, 0x02BC,
- 0x005C, 0x02BB, 0x007C, 0x007E, 0x00A1, 0x00A2, 0x00A3, 0x2044,
- 0x0192, 0x00A7, 0x00A4, 0x201C, 0x00AB, 0x2039, 0x203A, 0xFB01,
- 0xFB02, 0x2012, 0x2020, 0x2021, 0x00B7, 0x00B6, 0x2022, 0x201A,
- 0x201E, 0x201D, 0x00BB, 0x2026, 0x2030, 0x00BF, 0x0301, 0x0302,
- 0x00AF, 0x0306, 0x0307, 0x0308, 0x030A, 0x00B8, 0x030B, 0x0328,
- 0x030C, 0x0336, 0x00C6, 0x00AA, 0x0141, 0x00D8, 0x0152, 0x00BA,
- 0x00E6, 0x0131, 0x0142, 0x00F8, 0x0153, 0x00DF, 0x002D, 0x00A9,
- 0x00AC, 0x00AE, 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B5, 0x00B9,
- 0x00BC, 0x00BD, 0x00BE, 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4,
- 0x00C5, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD,
- 0x00CE, 0x00CF, 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5,
- 0x00D6, 0x00D7, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE,
- 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E7, 0x00E8,
- 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, 0x00F0,
- 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, 0x00F9,
- 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF, 0x0160, 0x0178,
- 0x017D, 0x0305, 0x0161, 0x2122, 0x017E, 0x0030, 0x2002, 0x0021,
- 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029,
- 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, 0x0030, 0x0031,
- 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039,
- 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, 0x0040, 0x0041,
- 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049,
- 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051,
- 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059,
- 0x005A, 0x005B, 0x00A5, 0x005D, 0x005E, 0x005F, 0x0060, 0x0061,
- 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069,
- 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, 0x0070, 0x0071,
- 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079,
- 0x007A, 0x007B, 0x007C, 0x007D, 0x203E, 0xFF40, 0x2032, 0x00A8,
- 0x2036, 0x00C4, 0x00F9, 0x00E9, 0x00ED, 0x00DF, 0x00E7, 0x00C7,
- 0x00D1, 0x00F1, 0x00A2, 0x00A3, 0x00F3, 0x00FA, 0x00A1, 0x00BF,
- 0x00BD, 0x00D6, 0x00DC, 0x00E4, 0x00EB, 0x00EF, 0x00F6, 0x00DC,
- 0x00E2, 0x00EA, 0x00EE, 0x00F4, 0x00FC, 0x00E0, 0x00E9, 0x00E1,
- 0x007E, 0x0030, 0x00AC, 0x005C, 0xFF60, 0xFF61, 0xFF62, 0xFF63,
- 0xFF64, 0xFF65, 0xFF66, 0xFF67, 0xFF68, 0xFF69, 0xFF6A, 0xFF6B,
- 0xFF6C, 0xFF6D, 0xFF6E, 0xFF6F, 0xFF70, 0xFF71, 0xFF72, 0xFF73,
- 0xFF74, 0xFF75, 0xFF76, 0xFF77, 0xFF78, 0xFF79, 0xFF7A, 0xFF7B,
- 0xFF7C, 0xFF7D, 0xFF7E, 0xFF7F, 0xFF80, 0xFF81, 0xFF82, 0xFF83,
- 0xFF84, 0xFF85, 0xFF86, 0xFF87, 0xFF88, 0xFF89, 0xFF8A, 0xFF8B,
- 0xFF8C, 0xFF8D, 0xFF8E, 0xFF8F, 0xFF90, 0xFF91, 0xFF92, 0xFF93,
- 0xFF94, 0xFF95, 0xFF96, 0xFF97, 0xFF98, 0xFF99, 0xFF9A, 0xFF9B,
- 0xFF9C, 0xFF9D, 0xFF9E, 0xFF9F, 0x30F0, 0x30F1, 0x30EE, 0x30AB,
- 0x30B1, 0x30F4, 0x30AC, 0x30AE, 0x30B0, 0x30B2, 0x30B4, 0x30B6,
- 0x30B8, 0x30BA, 0x30BC, 0x30BE, 0x30C0, 0x30C2, 0x30C5, 0x30C7,
- 0x30C9, 0x30D0, 0x30D1, 0x30D3, 0x30D4, 0x30D6, 0x30D7, 0x30D9,
- 0x30DA, 0x30DC, 0x30DD, 0xFF60, 0x3092, 0x3041, 0x3043, 0x3045,
- 0x3047, 0x3049, 0x3083, 0x3085, 0x3087, 0x3063, 0x3042, 0x3044,
- 0x3046, 0x3048, 0x304A, 0x304B, 0x304D, 0x304F, 0x3051, 0x3053,
- 0x3055, 0x3057, 0x3059, 0x305B, 0x305D, 0x305F, 0x3061, 0x3064,
- 0x3066, 0x3068, 0x306A, 0x306B, 0x306C, 0x306D, 0x306E, 0x306F,
- 0x3072, 0x3075, 0x3078, 0x307B, 0x307E, 0x307F, 0x3080, 0x3081,
- 0x3082, 0x3084, 0x3086, 0x3088, 0x3089, 0x308A, 0x308B, 0x308C,
- 0x308D, 0x308F, 0x3093, 0x3090, 0x3091, 0x308E, 0x304C, 0x304E,
- 0x3050, 0x3052, 0x3054, 0x3056, 0x3068, 0x305A, 0x305C, 0x305E,
- 0x3060, 0x3062, 0x3065, 0x3067, 0x3069, 0x3070, 0x3071, 0x3073,
- 0x3074, 0x3076, 0x3077, 0x3079, 0x307A, 0x307C, 0x307D, 0x301D,
- 0x301E, 0x005B, 0x005D, 0x3008, 0x3009, 0x300A, 0x300B, 0x300E,
- 0x300F, 0x3010, 0x3011, 0x2012, 0xFF60, 0x2500, 0x2501, 0x2502,
- 0x2503, 0x2504, 0x2505, 0x2506, 0x2507, 0x2508, 0x2509, 0x250A,
- 0x250B, 0x250C, 0x250D, 0x250E, 0x250F, 0x2510, 0x2511, 0x2512,
- 0x2513, 0x2514, 0x2515, 0x2516, 0x2517, 0x2518, 0x2519, 0x251A,
- 0x251B, 0x251C, 0x251D, 0x251E, 0x251F, 0x2520, 0x2521, 0x2522,
- 0x2523, 0x2524, 0x2525, 0x2526, 0x2527, 0x2528, 0x2529, 0x252A,
- 0x252B, 0x252C, 0x252D, 0x252E, 0x252F, 0x2530, 0x2531, 0x2532,
- 0x2533, 0x2534, 0x2535, 0x2536, 0x2537, 0x2538, 0x2539, 0x253A,
- 0x253B, 0x253C, 0x253D, 0x253E, 0x253F, 0x2540, 0x2541, 0x2542,
- 0x2543, 0x2544, 0x2545, 0x2546, 0x2547, 0x2548, 0x2549, 0x254A,
- 0x254B, 0x25B2, 0x20AC, 0x2126, 0x2032, 0x2033, 0xFB00, 0xFB03,
- 0xFB04, 0x0101, 0x012B, 0x016B, 0x0113, 0x014D, 0x0100, 0x012A,
- 0x016A, 0x0112, 0x014C, 0x215B, 0x215C, 0x215D, 0x215E, 0x2153,
- 0x2154, 0x2070, 0x2074, 0x2075, 0x2076, 0x2077, 0x2078, 0x2079,
- 0x2080, 0x2081, 0x2082, 0x2083, 0x2084, 0x2085, 0x2086, 0x2087,
- 0x2088, 0x2089, 0x01CD, 0x011A, 0x0000, 0x1EBC, 0x01CF, 0x0000,
- 0x0128, 0x01D1, 0x0000, 0x01D3, 0x016E, 0x0168, 0x01CE, 0x011B,
- 0x0000, 0x1EBD, 0x01D0, 0x0000, 0x0129, 0x01D2, 0x0000, 0x01D4,
- 0x016F, 0x0169, 0x0251, 0x0251, 0x0251, 0x01FD, 0x00E6, 0x0254,
- 0x0254, 0x0254, 0x0259, 0x0259, 0x0259, 0x025A, 0x025A, 0x025A,
- 0x025B, 0x025B, 0x025B, 0x006A, 0x014B, 0x0275, 0x028C, 0x028C,
- 0x028C, 0x0292, 0x0283, 0x02D0, 0x0020, 0x0021, 0x0022, 0x0023,
- 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B,
- 0x002C, 0x002D, 0x002E, 0x002F, 0x0030, 0x0031, 0x0032, 0x0033,
- 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B,
- 0x003C, 0x003D, 0x003E, 0x003F, 0x0040, 0x0041, 0x0042, 0x0043,
- 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B,
- 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052, 0x0053,
- 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B,
- 0x00A5, 0x005D, 0x005E, 0x005F, 0x0060, 0x0061, 0x0062, 0x0063,
- 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B,
- 0x006C, 0x006D, 0x006E, 0x006F, 0x0070, 0x0071, 0x0072, 0x0073,
- 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B,
- 0x00A6, 0x007D, 0x0303, 0x02BC, 0x005C, 0x02BB, 0x007C, 0x007E,
- 0x00A1, 0x00A2, 0x00A3, 0x2044, 0x0192, 0x00A7, 0x00A4, 0x201C,
- 0x00AB, 0x2039, 0x203A, 0xFB01, 0xFB02, 0x2012, 0x2020, 0x2021,
- 0x00B7, 0x00B6, 0x2022, 0x201A, 0x201E, 0x201D, 0x00BB, 0x2026,
- 0x2030, 0x00BF, 0x0301, 0x0302, 0x00AF, 0x0306, 0x0307, 0x0308,
- 0x030A, 0x00B8, 0x030B, 0x0328, 0x030C, 0x0336, 0x00C6, 0x00AA,
- 0x0141, 0x00D8, 0x0152, 0x00BA, 0x00E6, 0x0131, 0x0142, 0x00F8,
- 0x0153, 0x00DF, 0x002D, 0x00A9, 0x00AC, 0x00AE, 0x00B0, 0x00B1,
- 0x00B2, 0x00B3, 0x00B5, 0x00B9, 0x00BC, 0x00BD, 0x00BE, 0x00C0,
- 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C7, 0x00C8, 0x00C9,
- 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, 0x00D0, 0x00D1,
- 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, 0x00D9, 0x00DA,
- 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00E0, 0x00E1, 0x00E2, 0x00E3,
- 0x00E4, 0x00E5, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC,
- 0x00ED, 0x00EE, 0x00EF, 0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4,
- 0x00F5, 0x00F6, 0x00F7, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD,
- 0x00FE, 0x00FF, 0x0160, 0x0178, 0x017D, 0x0305, 0x0161, 0x2122,
- 0x017E, 0x0030, 0x20AC, 0x2126, 0x2032, 0x2033, 0xFB00, 0xFB03,
- 0xFB04, 0x0101, 0x012B, 0x016B, 0x0113, 0x014D, 0x0100, 0x012A,
- 0x016A, 0x0112, 0x014C, 0x215B, 0x215C, 0x215D, 0x215E, 0x2153,
- 0x2154, 0x2070, 0x2074, 0x2075, 0x2076, 0x2077, 0x2078, 0x2079,
- 0x2080, 0x2081, 0x2082, 0x2083, 0x2084, 0x2085, 0x2086, 0x2087,
- 0x2088, 0x2089, 0x01CD, 0x011A, 0x0000, 0x1EBC, 0x01CF, 0x0000,
- 0x0128, 0x01D1, 0x0000, 0x01D3, 0x016E, 0x0168, 0x01CE, 0x011B,
- 0x0000, 0x1EBD, 0x01D0, 0x0000, 0x0129, 0x01D2, 0x0000, 0x01D4,
- 0x016F, 0x0169, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035,
- 0x0036, 0x0037, 0x0038, 0x0039, 0x0336, 0x002D, 0x003D, 0x002C,
- 0x0028, 0x0029, 0x002E, 0x002F, 0x003A, 0x003B, 0x0030, 0x0031,
- 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039,
- 0x0336, 0x002D, 0x003D, 0x002C, 0x0028, 0x0029, 0x002E, 0x002F,
- 0x003A, 0x003B, 0x00B7, 0x20AC, 0x0000, 0x2153, 0x2154, 0x00BE,
- 0x2155, 0x2156, 0x2157, 0x2158, 0x2159, 0x215A, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x215B, 0x215C, 0x215D, 0x215E,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
- 0x0038, 0x0039, 0x0030, 0x2163, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2170, 0x2171,
- 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, 0x2177, 0x2178, 0x2179,
- 0x217A, 0x217B, 0x0000, 0x0000, 0x0000, 0x2160, 0x2161, 0x2162,
- 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, 0x216A,
- 0x216B, 0x0000, 0x0000, 0x0000, 0x0041, 0x0042, 0x0043, 0x0044,
- 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C,
- 0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054,
- 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x3042, 0x3044,
- 0x3046, 0x3048, 0x304A, 0x304B, 0x304D, 0x304F, 0x3051, 0x3053,
- 0x3055, 0x3057, 0x3059, 0x305B, 0x305D, 0x305F, 0x3061, 0x3064,
- 0x3066, 0x3068, 0x306A, 0x306B, 0x306C, 0x306D, 0x306E, 0x306F,
- 0x3072, 0x3075, 0x3078, 0x307B, 0x307E, 0x307F, 0x3080, 0x3081,
- 0x3082, 0x3084, 0x3086, 0x3088, 0x3089, 0x308A, 0x308B, 0x308C,
- 0x308D, 0x308F, 0x3090, 0x3091, 0x3092, 0x3093, 0x30A2, 0x30A4,
- 0x30A6, 0x30A8, 0x30AA, 0x30AB, 0x30AD, 0x30AF, 0x30B1, 0x30B3,
- 0x30B5, 0x30B7, 0x30B9, 0x30BB, 0x30BD, 0x30BF, 0x30C1, 0x30C4,
- 0x30C6, 0x30C8, 0x30CA, 0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF,
- 0x30D2, 0x30D5, 0x30D8, 0x30DB, 0x30DE, 0x30DF, 0x30E0, 0x30E1,
- 0x30E2, 0x30E4, 0x30E6, 0x30E8, 0x30E9, 0x30EA, 0x30EB, 0x30EC,
- 0x30ED, 0x30EF, 0x30F0, 0x30F1, 0x30F2, 0x30F3, 0x3220, 0x3221,
- 0x3222, 0x3223, 0x3224, 0x3225, 0x3226, 0x3227, 0x3228, 0x3229,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x55B6, 0x5408, 0x6CEB, 0x554F, 0x7B54, 0x4F8B,
- 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
- 0x0038, 0x0039, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035,
- 0x0036, 0x0037, 0x0038, 0x0039, 0x3063, 0x624D, 0x3007, 0x4E00,
- 0x4E8C, 0x4E09, 0x56DB, 0x4E94, 0x516D, 0x4E03, 0x516B, 0x4E5D,
- 0x5341, 0x3007, 0x4E00, 0x4E8C, 0x4E09, 0x56DB, 0x4E94, 0x516D,
- 0x4E03, 0x516B, 0x4E5D, 0x5341, 0x3007, 0x4E00, 0x4E8C, 0x4E09,
- 0x56DB, 0x4E94, 0x516D, 0x4E03, 0x516B, 0x4E5D, 0x3064, 0x624D,
- 0x4E00, 0x4E8C, 0x4E09, 0x56DB, 0x4E94, 0x516D, 0x4E03, 0x516B,
- 0x4E5D, 0x5341, 0x3007, 0x4E00, 0x4E8C, 0x4E09, 0x56DB, 0x4E94,
- 0x516D, 0x4E03, 0x516B, 0x4E5D, 0x5341, 0x30B3, 0x3063, 0x30C3,
- 0x30A9, 0x0000, 0x0000, 0x2460, 0x2461, 0x2462, 0x2463, 0x2464,
- 0x2465, 0x2466, 0x2467, 0x2468, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x24D0, 0x24D1, 0x24D2, 0x24D3, 0x24D4, 0x24D5, 0x24D6,
- 0x24D7, 0x24D8, 0x24D9, 0x24DA, 0x24DB, 0x24DC, 0x24DD, 0x24DE,
- 0x24DF, 0x24E0, 0x24E1, 0x24E2, 0x24E3, 0x24E4, 0x24E5, 0x24E6,
- 0x24E7, 0x24E8, 0x24E9, 0x24B6, 0x24B7, 0x24B8, 0x24B9, 0x24BA,
- 0x24BB, 0x24BC, 0x24BD, 0x24BE, 0x24BF, 0x24C0, 0x24C1, 0x24C2,
- 0x24C3, 0x24C4, 0x24C5, 0x24C6, 0x24C7, 0x24C8, 0x24C9, 0x24CA,
- 0x24CB, 0x24CC, 0x24CD, 0x24CE, 0x24CF, 0x3042, 0x3044, 0x3046,
- 0x3048, 0x304A, 0x304B, 0x304D, 0x304F, 0x3051, 0x3053, 0x3055,
- 0x3057, 0x3059, 0x305B, 0x305D, 0x305F, 0x3061, 0x3064, 0x3066,
- 0x3068, 0x306A, 0x306B, 0x306C, 0x306D, 0x306E, 0x306F, 0x3072,
- 0x3075, 0x3078, 0x307B, 0x307E, 0x307F, 0x3080, 0x3081, 0x3082,
- 0x3084, 0x3086, 0x3088, 0x3089, 0x308A, 0x308B, 0x308C, 0x308D,
- 0x308F, 0x3090, 0x3091, 0x3092, 0x3093, 0x32D0, 0x32D1, 0x32D2,
- 0x32D3, 0x32D4, 0x32D5, 0x32D6, 0x32D7, 0x32D8, 0x32D9, 0x32DA,
- 0x32DB, 0x32DC, 0x32DD, 0x32DE, 0x32DF, 0x32E0, 0x32E1, 0x32E2,
- 0x32E3, 0x32E4, 0x32E5, 0x32E6, 0x32E7, 0x32E8, 0x32E9, 0x32EA,
- 0x32EB, 0x32EC, 0x32ED, 0x32EE, 0x32EF, 0x32F0, 0x32F1, 0x32F2,
- 0x32F3, 0x32F4, 0x32F5, 0x32F6, 0x32F7, 0x32F8, 0x32F9, 0x32FA,
- 0x32FB, 0x32FC, 0x32FD, 0x32FE, 0x30F3, 0x3280, 0x3281, 0x3282,
- 0x3283, 0x3284, 0x3285, 0x3286, 0x3287, 0x3288, 0x3289, 0x3290,
- 0x328A, 0x328B, 0x328C, 0x328D, 0x328E, 0x328F, 0x8ABF, 0x329F,
- 0x526F, 0x6E1B, 0x6A19, 0x6B20, 0x57FA, 0x7981, 0x32A0, 0x32A1,
- 0x329B, 0x329A, 0x32A3, 0x32A2, 0x3297, 0x51FA, 0x329C, 0x3295,
- 0x6E08, 0x5897, 0x554F, 0x7B54, 0x4F8B, 0x96FB, 0x25CC, 0x0030,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0061, 0x0062, 0x0063,
- 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B,
- 0x006C, 0x006D, 0x006E, 0x006F, 0x0070, 0x0071, 0x0072, 0x0073,
- 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x0041,
- 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049,
- 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051,
- 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059,
- 0x005A, 0x3042, 0x3044, 0x3046, 0x3048, 0x304A, 0x304B, 0x304D,
- 0x304F, 0x3051, 0x3053, 0x3055, 0x3057, 0x3059, 0x305B, 0x305D,
- 0x305F, 0x3061, 0x3064, 0x3066, 0x3068, 0x306A, 0x306B, 0x306C,
- 0x306D, 0x306E, 0x306F, 0x3072, 0x3075, 0x3078, 0x307B, 0x307E,
- 0x307F, 0x3080, 0x3081, 0x3082, 0x3084, 0x3086, 0x3088, 0x3089,
- 0x308A, 0x308B, 0x308C, 0x308D, 0x308F, 0x3090, 0x3091, 0x3092,
- 0x3093, 0x30A2, 0x30A4, 0x30A6, 0x30A8, 0x30AA, 0x30AB, 0x30AD,
- 0x30AF, 0x30B1, 0x30B3, 0x30B5, 0x30B7, 0x30B9, 0x30BB, 0x30BD,
- 0x30BF, 0x30C1, 0x30C4, 0x30C6, 0x30C8, 0x30CA, 0x30CB, 0x30CC,
- 0x30CD, 0x30CE, 0x30CF, 0x30D2, 0x30D5, 0x30D8, 0x30DB, 0x30DE,
- 0x30DF, 0x30E0, 0x30E1, 0x30E2, 0x30E4, 0x30E6, 0x30E8, 0x30E9,
- 0x30EA, 0x30EB, 0x30EC, 0x30ED, 0x30EF, 0x30F0, 0x30F1, 0x30F2,
- 0x30F3, 0x65E5, 0x6708, 0x706B, 0x6C34, 0x6728, 0x91D1, 0x571F,
- 0x554F, 0x7B54, 0x4F8B, 0x25CF, 0x0030, 0x0000, 0x0031, 0x0000,
- 0x0032, 0x0000, 0x0033, 0x0000, 0x0034, 0x0000, 0x0035, 0x0000,
- 0x0036, 0x0000, 0x0037, 0x0000, 0x0038, 0x0000, 0x0039, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065,
- 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D,
- 0x006E, 0x006F, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075,
- 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x0041, 0x0042, 0x0043,
- 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B,
- 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052, 0x0053,
- 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x3042,
- 0x3044, 0x3046, 0x3048, 0x304A, 0x304B, 0x304D, 0x304F, 0x3051,
- 0x3053, 0x3055, 0x3057, 0x3059, 0x305B, 0x305D, 0x305F, 0x3061,
- 0x3064, 0x3066, 0x3068, 0x306A, 0x306B, 0x306C, 0x306D, 0x306E,
- 0x306F, 0x3072, 0x3075, 0x3078, 0x307B, 0x307E, 0x307F, 0x3080,
- 0x3081, 0x3082, 0x3084, 0x3086, 0x3088, 0x3089, 0x308A, 0x308B,
- 0x308C, 0x308D, 0x308F, 0x3090, 0x3091, 0x3092, 0x3093, 0x30A2,
- 0x30A4, 0x30A6, 0x30A8, 0x30AA, 0x30AB, 0x30AD, 0x30AF, 0x30B1,
- 0x30B3, 0x30B5, 0x30B7, 0x30B9, 0x30BB, 0x30BD, 0x30BF, 0x30C1,
- 0x30C4, 0x30C6, 0x30C8, 0x30CA, 0x30CB, 0x30CC, 0x30CD, 0x30CE,
- 0x30CF, 0x30D2, 0x30D5, 0x30D8, 0x30DB, 0x30DE, 0x30DF, 0x30E0,
- 0x30E1, 0x30E2, 0x30E4, 0x30E6, 0x30E8, 0x30E9, 0x30EA, 0x30EB,
- 0x30EC, 0x30ED, 0x30EF, 0x30F0, 0x30F1, 0x30F2, 0x30F3, 0x65E5,
- 0x6708, 0x706B, 0x6C34, 0x6728, 0x91D1, 0x571F, 0x8CA0, 0x52DD,
- 0x554F, 0x7B54, 0x4F8B, 0x25A1, 0x25A1, 0x0030, 0x0000, 0x0031,
- 0x0000, 0x0032, 0x0000, 0x0033, 0x0000, 0x0034, 0x0000, 0x0035,
- 0x0000, 0x0036, 0x0000, 0x0037, 0x0000, 0x0038, 0x0000, 0x0039,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0061, 0x0062, 0x0063, 0x0064,
- 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C,
- 0x006D, 0x006E, 0x006F, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074,
- 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x0041, 0x0042,
- 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A,
- 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052,
- 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A,
- 0x3042, 0x3044, 0x3046, 0x3048, 0x304A, 0x304B, 0x304D, 0x304F,
- 0x3051, 0x3053, 0x3055, 0x3057, 0x3059, 0x305B, 0x305D, 0x305F,
- 0x3061, 0x3064, 0x3066, 0x3068, 0x306A, 0x306B, 0x306C, 0x306D,
- 0x306E, 0x306F, 0x3072, 0x3075, 0x3078, 0x307B, 0x307E, 0x307F,
- 0x3080, 0x3081, 0x3082, 0x3084, 0x3086, 0x3088, 0x3089, 0x308A,
- 0x308B, 0x308C, 0x308D, 0x308F, 0x3090, 0x3091, 0x3092, 0x3093,
- 0x30A2, 0x30A4, 0x30A6, 0x30A8, 0x30AA, 0x30AB, 0x30AD, 0x30AF,
- 0x30B1, 0x30B3, 0x30B5, 0x30B7, 0x30B9, 0x30BB, 0x30BD, 0x30BF,
- 0x30C1, 0x30C4, 0x30C6, 0x30C8, 0x30CA, 0x30CB, 0x30CC, 0x30CD,
- 0x30CE, 0x30CF, 0x30D2, 0x30D5, 0x30D8, 0x30DB, 0x30DE, 0x30DF,
- 0x30E0, 0x30E1, 0x30E2, 0x30E4, 0x30E6, 0x30E8, 0x30E9, 0x30EA,
- 0x30EB, 0x30EC, 0x30ED, 0x30EF, 0x30F0, 0x30F1, 0x30F2, 0x30F3,
- 0x65E5, 0x6708, 0x706B, 0x6C34, 0x6728, 0x91D1, 0x571F, 0x554F,
- 0x7B54, 0x4F8B, 0x25A0, 0x0030, 0x0000, 0x0031, 0x0000, 0x0032,
- 0x0000, 0x0033, 0x0000, 0x0034, 0x0000, 0x0035, 0x0000, 0x0036,
- 0x0000, 0x0037, 0x0000, 0x0038, 0x0000, 0x0039, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066,
- 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E,
- 0x006F, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076,
- 0x0077, 0x0078, 0x0079, 0x007A, 0x0041, 0x0042, 0x0043, 0x0044,
- 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C,
- 0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054,
- 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x3042, 0x3044,
- 0x3046, 0x3048, 0x304A, 0x304B, 0x304D, 0x304F, 0x3051, 0x3053,
- 0x3055, 0x3057, 0x3059, 0x305B, 0x305D, 0x305F, 0x3061, 0x3064,
- 0x3066, 0x3068, 0x306A, 0x306B, 0x306C, 0x306D, 0x306E, 0x306F,
- 0x3072, 0x3075, 0x3078, 0x307B, 0x307E, 0x307F, 0x3080, 0x3081,
- 0x3082, 0x3084, 0x3086, 0x3088, 0x3089, 0x308A, 0x308B, 0x308C,
- 0x308D, 0x308F, 0x3090, 0x3091, 0x3092, 0x3093, 0x30A2, 0x30A4,
- 0x30A6, 0x30A8, 0x30AA, 0x30AB, 0x30AD, 0x30AF, 0x30B1, 0x30B3,
- 0x30B5, 0x30B7, 0x30B9, 0x30BB, 0x30BD, 0x30BF, 0x30C1, 0x30C4,
- 0x30C6, 0x30C8, 0x30CA, 0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF,
- 0x30D2, 0x30D5, 0x30D8, 0x30DB, 0x30DE, 0x30DF, 0x30E0, 0x30E1,
- 0x30E2, 0x30E4, 0x30E6, 0x30E8, 0x30E9, 0x30EA, 0x30EB, 0x30EC,
- 0x30ED, 0x30EF, 0x30F0, 0x30F1, 0x30F2, 0x30F3, 0x65E5, 0x6708,
- 0x706B, 0x6C34, 0x6728, 0x91D1, 0x571F, 0x554F, 0x7B54, 0x4F8B,
- 0x0030, 0x0000, 0x0031, 0x0000, 0x0032, 0x0000, 0x0033, 0x0000,
- 0x0034, 0x0000, 0x0035, 0x0000, 0x0036, 0x0000, 0x0037, 0x0000,
- 0x0038, 0x0000, 0x0039, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0061,
- 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069,
- 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, 0x0070, 0x0071,
- 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079,
- 0x007A, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
- 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
- 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
- 0x0058, 0x0059, 0x005A, 0x3042, 0x3044, 0x3046, 0x3048, 0x304A,
- 0x304B, 0x304D, 0x304F, 0x3051, 0x3053, 0x3055, 0x3057, 0x3059,
- 0x305B, 0x305D, 0x305F, 0x3061, 0x3064, 0x3066, 0x3068, 0x306A,
- 0x306B, 0x306C, 0x306D, 0x306E, 0x306F, 0x3072, 0x3075, 0x3078,
- 0x307B, 0x307E, 0x307F, 0x3080, 0x3081, 0x3082, 0x3084, 0x3086,
- 0x3088, 0x3089, 0x308A, 0x308B, 0x308C, 0x308D, 0x308F, 0x3090,
- 0x3091, 0x3092, 0x3093, 0x30A2, 0x30A4, 0x30A6, 0x30A8, 0x30AA,
- 0x30AB, 0x30AD, 0x30AF, 0x30B1, 0x30B3, 0x30B5, 0x30B7, 0x30B9,
- 0x30BB, 0x30BD, 0x30BF, 0x30C1, 0x30C4, 0x30C6, 0x30C8, 0x30CA,
- 0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF, 0x30D2, 0x30D5, 0x30D8,
- 0x30DB, 0x30DE, 0x30DF, 0x30E0, 0x30E1, 0x30E2, 0x30E4, 0x30E6,
- 0x30E8, 0x30E9, 0x30EA, 0x30EB, 0x30EC, 0x30ED, 0x30EF, 0x30F0,
- 0x30F1, 0x30F2, 0x30F3, 0x65E5, 0x6708, 0x706B, 0x6C34, 0x6728,
- 0x91D1, 0x571F, 0x554F, 0x7B54, 0x4F8B, 0x25A0, 0x33C2, 0x33CD,
- 0x2116, 0x0000, 0x33D8, 0x33DA, 0x2121, 0x2122, 0x0000, 0x2100,
- 0x33C2, 0x0000, 0x33C4, 0x2105, 0x3397, 0x3371, 0x3398, 0x2113,
- 0x338D, 0x339B, 0x3396, 0x0000, 0x0000, 0x33D7, 0x33D8, 0x0000,
- 0x0000, 0x0000, 0x3301, 0x3302, 0x3304, 0x3306, 0x0000, 0x3308,
- 0x0000, 0x3307, 0x330A, 0x0000, 0x3309, 0x0000, 0x330B, 0x0000,
- 0x330C, 0x330E, 0x330F, 0x3310, 0x3311, 0x3312, 0x3313, 0x0000,
- 0x3317, 0x0000, 0x3319, 0x0000, 0x331A, 0x331B, 0x331C, 0x331D,
- 0x331F, 0x3320, 0x3321, 0x3324, 0x0000, 0x3325, 0x0000, 0x0000,
- 0x3328, 0x3329, 0x0000, 0x332D, 0x0000, 0x0000, 0x332E, 0x332F,
- 0x3330, 0x3332, 0x0000, 0x0000, 0x3334, 0x3335, 0x333C, 0x0000,
- 0x0000, 0x0000, 0x3337, 0x0000, 0x3338, 0x333A, 0x333D, 0x3341,
- 0x333E, 0x333F, 0x3340, 0x3343, 0x3344, 0x3345, 0x3346, 0x3348,
- 0x334B, 0x334C, 0x334F, 0x3350, 0x0000, 0x0000, 0x3352, 0x3354,
- 0x0000, 0x0000, 0x3353, 0x3355, 0x3356, 0x0000, 0x3301, 0x3302,
- 0x3304, 0x3306, 0x0000, 0x3308, 0x0000, 0x3307, 0x330A, 0x0000,
- 0x3309, 0x0000, 0x330B, 0x0000, 0x330C, 0x330E, 0x330F, 0x3310,
- 0x3311, 0x3312, 0x3313, 0x0000, 0x3317, 0x0000, 0x3319, 0x0000,
- 0x331A, 0x331B, 0x331C, 0x331D, 0x331F, 0x3320, 0x3321, 0x3324,
- 0x0000, 0x3325, 0x0000, 0x0000, 0x3328, 0x3329, 0x0000, 0x332D,
- 0x0000, 0x0000, 0x332E, 0x332F, 0x3330, 0x3332, 0x0000, 0x0000,
- 0x3334, 0x3335, 0x333C, 0x0000, 0x0000, 0x0000, 0x3337, 0x0000,
- 0x3338, 0x333A, 0x333D, 0x3341, 0x333E, 0x333F, 0x3340, 0x3343,
- 0x3344, 0x3345, 0x3346, 0x3348, 0x334B, 0x334C, 0x334F, 0x3350,
- 0x0000, 0x0000, 0x3352, 0x3354, 0x0000, 0x0000, 0x3353, 0x3355,
- 0x3356, 0x337E, 0x337D, 0x337C, 0x337B, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x002D,
- 0x003D, 0x2103, 0x2640, 0x2642, 0x3013, 0x3012, 0x300C, 0x300D,
- 0x300E, 0x300F, 0x301A, 0x301B, 0x3018, 0x3019, 0xFF08, 0xFF09,
- 0x301D, 0x301E, 0x2018, 0x2019, 0x201C, 0x201D, 0x0027, 0x0022,
- 0x0000, 0x2135, 0x03D0, 0x220A, 0x210F, 0x00B5, 0x03C6, 0x03DB,
- 0x03D1, 0xFFFD, 0x2668, 0x2669, 0x266C, 0xFF1A, 0x00A9, 0x00A9,
- 0x00AE, 0x00AE, 0x303B, 0x303B, 0x3033, 0x3034, 0x3035, 0x203C,
- 0x2049, 0x0021, 0x203C, 0x2049, 0x244A, 0x0000, 0x2213, 0x2260,
- 0x2243, 0x2272, 0x2273, 0x300C, 0x300D, 0x300E, 0x300F, 0x301A,
- 0x301B, 0x3018, 0x3019, 0xFF5F, 0xFF60, 0x300C, 0x300D, 0x300E,
- 0x300F, 0x301A, 0x301B, 0x3018, 0x3019, 0xFF5F, 0xFF60, 0x239B,
- 0x239D, 0x239E, 0x23A0, 0x239D, 0x239B, 0x23A0, 0x239E, 0x23A1,
- 0x23A3, 0x23A4, 0x23A6, 0x23A3, 0x23A1, 0x23A6, 0x23A4, 0x23A1,
- 0x23A3, 0x23A4, 0x23A6, 0x23A3, 0x23A1, 0x23A6, 0x23A4, 0xFF5C,
- 0x2015, 0x301D, 0x301E, 0x2018, 0x2019, 0x2018, 0x2019, 0x2702,
- 0x2702, 0x2702, 0x2702, 0x303D, 0x3012, 0x309F, 0x534D, 0x2207,
- 0x2205, 0x22A0, 0x2296, 0x2298, 0x2295, 0x2297, 0x229E, 0x2295,
- 0x0021, 0x25B3, 0x25C0, 0x25B6, 0x21E6, 0x21E8, 0x21E7, 0x21E9,
- 0x21D0, 0x2194, 0x2198, 0x2199, 0x2196, 0x2197, 0x21CC, 0x21C6,
- 0x21C4, 0x21C5, 0x2190, 0x2192, 0x2191, 0x2193, 0x2194, 0x2195,
- 0x2504, 0x2506, 0x3030, 0x2307, 0x3030, 0x2307, 0x3030, 0x2307,
- 0x3030, 0x2307, 0x3030, 0x2307, 0x2740, 0x273F, 0x25A1, 0x25A0,
- 0x25A1, 0x25A1, 0x25A1, 0x25A1, 0x25A1, 0x25AB, 0x25A0, 0x25AA,
- 0x271A, 0x271A, 0x25C7, 0x25C6, 0x25C7, 0x25C7, 0x25C7, 0x25C7,
- 0x25C7, 0x25C6, 0x25C6, 0x25CE, 0x25C9, 0x25CB, 0x25E6, 0x25CF,
- 0x2022, 0x2756, 0x2756, 0x2756, 0x2756, 0x3008, 0x3009, 0x3008,
- 0x3009, 0x300A, 0x300B, 0x300A, 0x300B, 0x3053, 0x3053, 0x30B3,
- 0x30B3, 0x309D, 0x309E, 0x3041, 0x3042, 0x3043, 0x3044, 0x3045,
- 0x3046, 0x3047, 0x3048, 0x3049, 0x304A, 0x304B, 0x304B, 0x304C,
- 0x304D, 0x304E, 0x304F, 0x3050, 0x3051, 0x3051, 0x3052, 0x3053,
- 0x3053, 0x3054, 0x3055, 0x3056, 0x3057, 0x3058, 0x3059, 0x305A,
- 0x305B, 0x305C, 0x305D, 0x305E, 0x305F, 0x3060, 0x3061, 0x3062,
- 0x3063, 0x3064, 0x3065, 0x3066, 0x3067, 0x3068, 0x3069, 0x306A,
- 0x306B, 0x306C, 0x306D, 0x306E, 0x306F, 0x3070, 0x3071, 0x3072,
- 0x3073, 0x3074, 0x3075, 0x3076, 0x3077, 0x3078, 0x3079, 0x307A,
- 0x307B, 0x307C, 0x307D, 0x307E, 0x307F, 0x3080, 0x3081, 0x3082,
- 0x3083, 0x3084, 0x3085, 0x3086, 0x3087, 0x3088, 0x3089, 0x308A,
- 0x308B, 0x308C, 0x308D, 0x308E, 0x308F, 0x3090, 0x3091, 0x3092,
- 0x3093, 0x3094, 0x30FD, 0x30FE, 0x30FC, 0x30A1, 0x30A2, 0x30A3,
- 0x30A4, 0x30A5, 0x30A6, 0x30A7, 0x30A8, 0x30A9, 0x30AA, 0x30F5,
- 0x30AB, 0x30AC, 0x30AD, 0x30AE, 0x30AF, 0x30B0, 0x30F6, 0x30B1,
- 0x30B2, 0x30B3, 0x30B3, 0x30B4, 0x30B5, 0x30B6, 0x30B7, 0x30B8,
- 0x30B9, 0x30BA, 0x30BB, 0x30BC, 0x30BD, 0x30BE, 0x30BF, 0x30C0,
- 0x30C1, 0x30C2, 0x30C3, 0x30C4, 0x30C5, 0x30C6, 0x30C7, 0x30C8,
- 0x30C9, 0x30CA, 0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF, 0x30D0,
- 0x30D1, 0x30D2, 0x30D3, 0x30D4, 0x30D5, 0x30D6, 0x30D7, 0x30D8,
- 0x30D9, 0x30DA, 0x30DB, 0x30DC, 0x30DD, 0x30DE, 0x30DF, 0x30E0,
- 0x30E1, 0x30E2, 0x30E3, 0x30E4, 0x30E5, 0x30E6, 0x30E7, 0x30E8,
- 0x30E9, 0x30EA, 0x30EB, 0x30EC, 0x30ED, 0x30EE, 0x30EF, 0x30F0,
- 0x30F1, 0x30F2, 0x30F3, 0x30F4, 0x30F7, 0x30F8, 0x30F9, 0x30FA,
- 0x309D, 0x309E, 0x3041, 0x3042, 0x3043, 0x3044, 0x3045, 0x3046,
- 0x3047, 0x3048, 0x3049, 0x304A, 0x304B, 0x304B, 0x304C, 0x304D,
- 0x304E, 0x304F, 0x3050, 0x3051, 0x3051, 0x3052, 0x3053, 0x3053,
- 0x3054, 0x3055, 0x3056, 0x3057, 0x3058, 0x3059, 0x305A, 0x305B,
- 0x305C, 0x305D, 0x305E, 0x305F, 0x3060, 0x3061, 0x3062, 0x3063,
- 0x3064, 0x3065, 0x3066, 0x3067, 0x3068, 0x3069, 0x306A, 0x306B,
- 0x306C, 0x306D, 0x306E, 0x306F, 0x3070, 0x3071, 0x3072, 0x3073,
- 0x3074, 0x3075, 0x3076, 0x3077, 0x3078, 0x3079, 0x307A, 0x307B,
- 0x307C, 0x307D, 0x307E, 0x307F, 0x3080, 0x3081, 0x3082, 0x3083,
- 0x3084, 0x3085, 0x3086, 0x3087, 0x3088, 0x3089, 0x308A, 0x308B,
- 0x308C, 0x308D, 0x308E, 0x308F, 0x3090, 0x3091, 0x3092, 0x3093,
- 0x3094, 0x30FD, 0x30FE, 0x30FC, 0x30A1, 0x30A2, 0x30A3, 0x30A4,
- 0x30A5, 0x30A6, 0x30A7, 0x30A8, 0x30A9, 0x30AA, 0x30F5, 0x30AB,
- 0x30AC, 0x30AD, 0x30AE, 0x30AF, 0x30B0, 0x30F6, 0x30B1, 0x30B2,
- 0x30B3, 0x30B3, 0x30B4, 0x30B5, 0x30B6, 0x30B7, 0x30B8, 0x30B9,
- 0x30BA, 0x30BB, 0x30BC, 0x30BD, 0x30BE, 0x30BF, 0x30C0, 0x30C1,
- 0x30C2, 0x30C3, 0x30C4, 0x30C5, 0x30C6, 0x30C7, 0x30C8, 0x30C9,
- 0x30CA, 0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF, 0x30D0, 0x30D1,
- 0x30D2, 0x30D3, 0x30D4, 0x30D5, 0x30D6, 0x30D7, 0x30D8, 0x30D9,
- 0x30DA, 0x30DB, 0x30DC, 0x30DD, 0x30DE, 0x30DF, 0x30E0, 0x30E1,
- 0x30E2, 0x30E3, 0x30E4, 0x30E5, 0x30E6, 0x30E7, 0x30E8, 0x30E9,
- 0x30EA, 0x30EB, 0x30EC, 0x30ED, 0x30EE, 0x30EF, 0x30F0, 0x30F1,
- 0x30F2, 0x30F3, 0x30F4, 0x30F7, 0x30F8, 0x30F9, 0x30FA, 0x3001,
- 0x3002, 0x30FB, 0xFF0A, 0x203B, 0x25CB, 0x25CE, 0x25C9, 0x25B3,
- 0x25B2, 0x30FD, 0x30FE, 0x309D, 0x309E, 0xFF08, 0xFF09, 0x3014,
- 0x3015, 0xFF08, 0xFF09, 0x3014, 0x3015, 0x0030, 0x0031, 0x0032,
- 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x3041,
- 0x3042, 0x3043, 0x3044, 0x3045, 0x3046, 0x3047, 0x3048, 0x3049,
- 0x304A, 0x304B, 0x304B, 0x304C, 0x304D, 0x304E, 0x304F, 0x3050,
- 0x3051, 0x3051, 0x3052, 0x3053, 0x3054, 0x3055, 0x3056, 0x3057,
- 0x3058, 0x3059, 0x305A, 0x305B, 0x305C, 0x305D, 0x305E, 0x305F,
- 0x3060, 0x3061, 0x3062, 0x3063, 0x3064, 0x3065, 0x3066, 0x3067,
- 0x3068, 0x3069, 0x306A, 0x306B, 0x306C, 0x306D, 0x306E, 0x306F,
- 0x3070, 0x3071, 0x3072, 0x3073, 0x3074, 0x3075, 0x3076, 0x3077,
- 0x3078, 0x3079, 0x307A, 0x307B, 0x307C, 0x307D, 0x307E, 0x307F,
- 0x3080, 0x3081, 0x3082, 0x3083, 0x3084, 0x3085, 0x3086, 0x3087,
- 0x3088, 0x3089, 0x308A, 0x308B, 0x308C, 0x308D, 0x308E, 0x308F,
- 0x3090, 0x3091, 0x3092, 0x3093, 0x3094, 0x3041, 0x3043, 0x3045,
- 0x3047, 0x3049, 0x304B, 0x3051, 0x3063, 0x3083, 0x3085, 0x3087,
- 0x308E, 0x30A1, 0x30A2, 0x30A3, 0x30A4, 0x30A5, 0x30A6, 0x30A7,
- 0x30A8, 0x30A9, 0x30AA, 0x30AB, 0x30F5, 0x30AC, 0x30AD, 0x30AE,
- 0x30AF, 0x30B0, 0x30B1, 0x30F6, 0x30B2, 0x30B3, 0x30B4, 0x30B5,
- 0x30B6, 0x30B7, 0x30B8, 0x30B9, 0x30BA, 0x30BB, 0x30BC, 0x30BD,
- 0x30BE, 0x30BF, 0x30C0, 0x30C1, 0x30C2, 0x30C3, 0x30C4, 0x30C5,
- 0x30C6, 0x30C7, 0x30C8, 0x30C9, 0x30CA, 0x30CB, 0x30CC, 0x30CD,
- 0x30CE, 0x30CF, 0x30D0, 0x30D1, 0x30D2, 0x30D3, 0x30D4, 0x30D5,
- 0x30D6, 0x30D7, 0x30D8, 0x30D9, 0x30DA, 0x30DB, 0x30DC, 0x30DD,
- 0x30DE, 0x30DF, 0x30E0, 0x30E1, 0x30E2, 0x30E3, 0x30E4, 0x30E5,
- 0x30E6, 0x30E7, 0x30E8, 0x30E9, 0x30EA, 0x30EB, 0x30EC, 0x30ED,
- 0x30EE, 0x30EF, 0x30F0, 0x30F1, 0x30F2, 0x30F3, 0x30F4, 0x30A1,
- 0x30A3, 0x30A5, 0x30A7, 0x30A9, 0x30F5, 0x30F6, 0x30C3, 0x30E3,
- 0x30E5, 0x30E7, 0x30EE, 0x30FC, 0x30FC, 0x6CE8, 0x20AC, 0x2126,
- 0x2032, 0x2033, 0xFB00, 0xFB03, 0xFB04, 0x0101, 0x012B, 0x016B,
- 0x0113, 0x014D, 0x0100, 0x012A, 0x016A, 0x0112, 0x014C, 0x215B,
- 0x215C, 0x215D, 0x215E, 0x2153, 0x2154, 0x2070, 0x2074, 0x2075,
- 0x2076, 0x2077, 0x2078, 0x2079, 0x2080, 0x2081, 0x2082, 0x2083,
- 0x2084, 0x2085, 0x2086, 0x2087, 0x2088, 0x2089, 0x01CD, 0x011A,
- 0x0000, 0x1EBC, 0x01CF, 0x0000, 0x0128, 0x01D1, 0x0000, 0x01D3,
- 0x016E, 0x0168, 0x01CE, 0x011B, 0x0000, 0x1EBD, 0x01D0, 0x0000,
- 0x0129, 0x01D2, 0x0000, 0x01D4, 0x016F, 0x0169, 0x0251, 0x0251,
- 0x0251, 0x01FD, 0x00E6, 0x0254, 0x0254, 0x0254, 0x0259, 0x0259,
- 0x0259, 0x025A, 0x025A, 0x025A, 0x025B, 0x025B, 0x025B, 0x006A,
- 0x014B, 0x0275, 0x028C, 0x028C, 0x028C, 0x0292, 0x0283, 0x02D0,
- 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
- 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
- 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
- 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
- 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
- 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
- 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
- 0x0058, 0x0059, 0x005A, 0x005B, 0x00A5, 0x005D, 0x005E, 0x005F,
- 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
- 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
- 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
- 0x0078, 0x0079, 0x007A, 0x007B, 0x00A6, 0x007D, 0x0303, 0x02BC,
- 0x005C, 0x02BB, 0x007C, 0x007E, 0x00A1, 0x00A2, 0x00A3, 0x2044,
- 0x0192, 0x00A7, 0x00A4, 0x201C, 0x00AB, 0x2039, 0x203A, 0xFB01,
- 0xFB02, 0x2012, 0x2020, 0x2021, 0x00B7, 0x00B6, 0x2022, 0x201A,
- 0x201E, 0x201D, 0x00BB, 0x2026, 0x2030, 0x00BF, 0x0301, 0x0302,
- 0x00AF, 0x0306, 0x0307, 0x0308, 0x030A, 0x00B8, 0x030B, 0x0328,
- 0x030C, 0x0336, 0x00C6, 0x00AA, 0x0141, 0x00D8, 0x0152, 0x00BA,
- 0x00E6, 0x0131, 0x0142, 0x00F8, 0x0153, 0x00DF, 0x002D, 0x00A9,
- 0x00AC, 0x00AE, 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B5, 0x00B9,
- 0x00BC, 0x00BD, 0x00BE, 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4,
- 0x00C5, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD,
- 0x00CE, 0x00CF, 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5,
- 0x00D6, 0x00D7, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE,
- 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E7, 0x00E8,
- 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, 0x00F0,
- 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, 0x00F9,
- 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF, 0x0160, 0x0178,
- 0x017D, 0x0305, 0x0161, 0x2122, 0x017E, 0x0030, 0x20AC, 0x2126,
- 0x2032, 0x2033, 0xFB00, 0xFB03, 0xFB04, 0x0101, 0x012B, 0x016B,
- 0x0113, 0x014D, 0x0100, 0x012A, 0x016A, 0x0112, 0x014C, 0x215B,
- 0x215C, 0x215D, 0x215E, 0x2153, 0x2154, 0x2070, 0x2074, 0x2075,
- 0x2076, 0x2077, 0x2078, 0x2079, 0x2080, 0x2081, 0x2082, 0x2083,
- 0x2084, 0x2085, 0x2086, 0x2087, 0x2088, 0x2089, 0x01CD, 0x011A,
- 0x0000, 0x1EBC, 0x01CF, 0x0000, 0x0128, 0x01D1, 0x0000, 0x01D3,
- 0x016E, 0x0168, 0x01CE, 0x011B, 0x0000, 0x1EBD, 0x01D0, 0x0000,
- 0x0129, 0x01D2, 0x0000, 0x01D4, 0x016F, 0x0169, 0x0030, 0x0031,
- 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039,
- 0x0336, 0x002D, 0x003D, 0x002C, 0x0028, 0x0029, 0x002E, 0x002F,
- 0x003A, 0x003B, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035,
- 0x0036, 0x0037, 0x0038, 0x0039, 0x0336, 0x002D, 0x003D, 0x002C,
- 0x0028, 0x0029, 0x002E, 0x002F, 0x003A, 0x003B, 0x00B7, 0x002D,
- 0x003D, 0x2103, 0x2640, 0x2642, 0x3013, 0x3012, 0x300C, 0x300D,
- 0x300E, 0x300F, 0x301A, 0x301B, 0x3018, 0x3019, 0xFF08, 0xFF09,
- 0x301D, 0x301E, 0x2018, 0x2019, 0x201C, 0x201D, 0x0027, 0x0022,
- 0x9038, 0x8B01, 0x7DE3, 0x9EC3, 0x6EAB, 0x798D, 0x6094, 0x6D77,
- 0x6168, 0x6982, 0x6E34, 0x8910, 0x6F22, 0x5668, 0x65E2, 0x7948,
- 0x865B, 0x97FF, 0x52E4, 0x8B39, 0x63ED, 0x64CA, 0x784F, 0x7A40,
- 0x6BBA, 0x7949, 0x8996, 0x716E, 0x793E, 0x8005, 0x81ED, 0x795D,
- 0x6691, 0x7F72, 0x6D89, 0x72C0, 0x613C, 0x771E, 0x7BC0, 0x7956,
- 0x50E7, 0x5C64, 0x5DE2, 0x618E, 0x8D08, 0x537D, 0x5606, 0x8457,
- 0x5FB5, 0x61F2, 0x93AD, 0x798E, 0x9B2D, 0x7A81, 0x96E3, 0x6885,
- 0x7E41, 0x6669, 0x5351, 0x7891, 0x8CD3, 0x654F, 0x4FAE, 0x5002,
- 0x5840, 0x52C9, 0x6B65, 0x58A8, 0x6BCF, 0x514D, 0x623E, 0x7950,
- 0x6B04, 0x9686, 0x865C, 0x6DDA, 0x985E, 0x66C6, 0x6B77, 0x7DF4,
- 0x934A, 0x5ECA, 0x9304, 0x6982, 0x51B4, 0x634C, 0x86DB, 0x9089,
- 0x9022, 0x5049, 0x7DEF, 0x9055, 0x53A9, 0x990C, 0x885B, 0x5EF6,
- 0x6CBF, 0x925B, 0x7FC1, 0x82BD, 0x96C5, 0x5BB3, 0x6168, 0x6982,
- 0x6BBB, 0x6562, 0x8CAB, 0x5DCC, 0x9811, 0x5E30, 0x8ECC, 0x7AAE,
- 0x5747, 0x5091, 0x7A74, 0x5065, 0x5EFA, 0x9237, 0x6A8E, 0x4EA4,
- 0x516C, 0x66F4, 0x6821, 0x786C, 0x7D5E, 0x8003, 0x8CFC, 0x964D,
- 0x62F7, 0x7F6A, 0x4F7F, 0x53F2, 0x59C9, 0x8B1D, 0x90AA, 0x53CE,
- 0x8F2F, 0x67D4, 0x77AC, 0x821C, 0x696F, 0x677E, 0x8A1F, 0x4E08,
- 0x57F4, 0x690D, 0x8077, 0x89AA, 0x9042, 0x636E, 0x6442, 0x8239,
- 0x7DCF, 0x8061, 0x50CF, 0x8A95, 0x6065, 0x5146, 0x773A, 0x8074,
- 0x8DF3, 0x5EAD, 0x5EF7, 0x8247, 0x6843, 0x9003, 0x6D3E, 0x6392,
- 0x8F29, 0x73ED, 0x9812, 0x60B2, 0x6249, 0x6590, 0x7DCB, 0x8AB9,
- 0x8CA7, 0x7236, 0x847A, 0x5206, 0x5674, 0x61A4, 0x7C89, 0x7D1B,
- 0x96F0, 0x853D, 0x4FBF, 0x6367, 0x76C6, 0x685D, 0x8108, 0x8036,
- 0x7FFC, 0x540F, 0x96A3, 0x9E9F, 0x9E97, 0x806F, 0x807E, 0x6E7E,
- 0x5085, 0x5193, 0x51DB, 0x5315, 0x5340, 0x96D9, 0x55A9, 0x56C1,
- 0x570D, 0x58AB, 0x59DA, 0x5A36, 0x5ABE, 0x5D4E, 0x5D87, 0x5DC9,
- 0x5DD3, 0x5F2D, 0x5F98, 0x60D8, 0x613D, 0x61FE, 0x6268, 0x62CF,
- 0x651D, 0x640F, 0x64F2, 0x655D, 0x665F, 0x67A9, 0x67E7, 0x696B,
- 0x6930, 0x69A7, 0x6A44, 0x6A90, 0x6C08, 0x6C13, 0x6E23, 0x6F11,
- 0x6EFE, 0x6F3E, 0x71FF, 0x73E5, 0x7432, 0x745F, 0x74E0, 0x750C,
- 0x7672, 0x792A, 0x78D4, 0x79BA, 0x7A19, 0x7A95, 0x7CF2, 0x7D73,
- 0x7DDD, 0x7E35, 0x7FAE, 0x7FE1, 0x805A, 0x805F, 0x8073, 0x8070,
- 0x8076, 0x8153, 0x818A, 0x81B5, 0x81CD, 0x83F2, 0x8555, 0x85D5,
- 0x871A, 0x8836, 0x889E, 0x88D8, 0x88F4, 0x892B, 0x893B, 0x896A,
- 0x896F, 0x8A1D, 0x8D05, 0x8D0F, 0x9F4E, 0x8E91, 0x8EA1, 0x9052,
- 0x900E, 0x9130, 0x9156, 0x9158, 0x9165, 0x9173, 0x9172, 0x91A2,
- 0x91AF, 0x91AA, 0x91B4, 0x91BA, 0x9477, 0x9698, 0x973D, 0x9760,
- 0x9771, 0x980C, 0x9873, 0x98C3, 0x9A45, 0x9B4D, 0x9B58, 0x9BC6,
- 0x9BE1, 0x9BF1, 0x9D48, 0x9DCF, 0x9F08, 0x6271, 0x6697, 0x610F,
- 0x8863, 0x9055, 0x907A, 0x78EF, 0x54E1, 0x2ED7, 0x2EBD, 0x53A9,
- 0x74DC, 0x904B, 0x990C, 0x885E, 0x92B3, 0x95B1, 0x5EF6, 0x63F4,
- 0x6CBF, 0x7159, 0x9060, 0x925B, 0x65BC, 0x5F80, 0x7FC1, 0x5378,
- 0x97F3, 0x5316, 0x82B1, 0x83D3, 0x8CA8, 0x904E, 0x82BD, 0x96C5,
- 0x9913, 0x5EFB, 0x7070, 0x5BB3, 0x6168, 0x6168, 0x6168, 0x69EA,
- 0x6982, 0x676E, 0x89D2, 0x9694, 0x5272, 0x8F44, 0x938C, 0x82C5,
- 0x5BD2, 0x74B0, 0x7DE9, 0x7F36, 0x9084, 0x9592, 0x97D3, 0x8218,
- 0x5371, 0x559C, 0x3402, 0x3402, 0x5E7E, 0x65E3, 0x671F, 0x6A5F,
- 0x8D77, 0x98E2, 0x5409, 0x55AB, 0x8650, 0x9006, 0x53CA, 0x5438,
- 0x6025, 0x7D1A, 0x5DE8, 0x62D2, 0x8DDD, 0x9B5A, 0x9B5A, 0x537F,
- 0x5F3A, 0x6050, 0x69C1, 0x6A4B, 0x6A4B, 0x9115, 0x97FF, 0x9957,
- 0x6681, 0x2EA9, 0x8FD1, 0x5036, 0x77E9, 0x5177, 0x865E, 0x7A7A,
- 0x9047, 0x6ADB, 0x5553, 0x5951, 0x6075, 0x6167, 0x8FCE, 0x5091,
- 0x6F54, 0x7A74, 0x2EBC, 0x2EBC, 0x517C, 0x5238, 0x61B2, 0x6743,
- 0x80A9, 0x8B19, 0x9063, 0x539F, 0x8A01, 0x6236, 0x96C7, 0x9867,
- 0x5433, 0x5A1B, 0x8AA4, 0x5DE5, 0x614C, 0x6285, 0x63A7, 0x69CB,
- 0x6D69, 0x6E2F, 0x8015, 0x8154, 0x8352, 0x8B1B, 0x8CFC, 0x543F,
- 0x9177, 0x8170, 0x7511, 0x8FBC, 0x4ECA, 0x9396, 0x5EA7, 0x5F69,
- 0x63A1, 0x6B72, 0x83DC, 0x51B4, 0x54B2, 0x524A, 0x7522, 0x9910,
- 0x59FF, 0x59FF, 0x5DFF, 0x8AEE, 0x8AEE, 0x8CC7, 0x8CC7, 0x6B21,
- 0x6B21, 0x6ECB, 0x73BA, 0x53F1, 0x6368, 0x659C, 0x90AA, 0x52FA,
- 0x7235, 0x7235, 0x914C, 0x5F31, 0x4E3B, 0x53D7, 0x6388, 0x5468,
- 0x7D42, 0x7FD2, 0x8846, 0x9031, 0x4F4F, 0x8853, 0x8FF0, 0x5DE1,
- 0x9075, 0x9075, 0x6240, 0x66F8, 0x5973, 0x52DD, 0x5546, 0x5BB5,
- 0x5C06, 0x2E8C, 0x2E8D, 0x5C19, 0x6D88, 0x785D, 0x8096, 0x4E08,
- 0x5B82, 0x57CE, 0x60C5, 0x57F4, 0x98FE, 0x690D, 0x6B96, 0x98DF,
- 0x98E0, 0x2EDE, 0x378D, 0x4FB5, 0x2E97, 0x6D78, 0x771F, 0x9032,
- 0x4EBB, 0x4EBA, 0x5203, 0x5C0B, 0x8A0A, 0x8A0A, 0x8FC5, 0x8870,
- 0x9042, 0x351F, 0x52E2, 0x6210, 0x76DB, 0x8056, 0x8980, 0x8AA0,
- 0x8ACB, 0x975C, 0x975C, 0x7A05, 0x8106, 0x96BB, 0x7C4D, 0x7BC0,
- 0x8AAA, 0x96EA, 0x7D76, 0x6247, 0x6F98, 0x7FA1, 0x8239, 0x9078,
- 0x9077, 0x524D, 0x5168, 0x6383, 0x63F7, 0x7626, 0x8D70, 0x9001,
- 0x906D, 0x9020, 0x2ECA, 0x901F, 0x8CCA, 0x5C0A, 0x5C0A, 0x59A5,
- 0x6CF0, 0x9000, 0x902E, 0x968A, 0x9BDB, 0x5927, 0x3427, 0x7027,
- 0x9054, 0x812B, 0x4E39, 0x6B4E, 0x70AD, 0x8A95, 0x6696, 0x5024,
- 0x7F6E, 0x7BC9, 0x2EAE, 0x7B51, 0x9010, 0x67F1, 0x6CE8, 0x99D0,
- 0x5F6B, 0x5FB5, 0x61F2, 0x671D, 0x6F6E, 0x8ABF, 0x76F4, 0x6715,
- 0x6715, 0x589C, 0x8FFD, 0x901A, 0x576A, 0x91E3, 0x5448, 0x5E1D,
- 0x7A0B, 0x7684, 0x9069, 0x8FED, 0x6DFB, 0x514E, 0x9014, 0x783A,
- 0x5721, 0x571F, 0x51AC, 0x5510, 0x7CD6, 0x85E4, 0x8B04, 0x9003,
- 0x900F, 0x9A30, 0x5C0E, 0x9053, 0x5451, 0x3B88, 0x5167, 0x8089,
- 0x4E73, 0x5FCD, 0x8A8D, 0x5BE7, 0x7D0D, 0x8987, 0x6D3E, 0x80BA,
- 0x535A, 0x8584, 0x8FEB, 0x7E1B, 0x8087, 0x4E37, 0x6F51, 0x91B1,
- 0x4F34, 0x5224, 0x534A, 0x5E06, 0x7554, 0x6669, 0x8543, 0x907F,
- 0x5FAE, 0x9F3B, 0x5339, 0x2EAA, 0x5F65, 0x59EC, 0x59EB, 0x8A55,
- 0x5E99, 0x75C5, 0x5A66, 0x6577, 0x6D6E, 0x8CA0, 0x8CA0, 0x670D,
- 0x8986, 0x4E19, 0x5E63, 0x5E73, 0x5F0A, 0x8511, 0x504F, 0x7DE8,
- 0x8FD4, 0x904D, 0x7C3F, 0x5305, 0x5D29, 0x62B1, 0x670B, 0x7832,
- 0x7E2B, 0x80DE, 0x840C, 0x90A6, 0x90A6, 0x98FD, 0x9D6C, 0x4EA1,
- 0x5E3D, 0x5FD8, 0x5FD9, 0x623F, 0x671B, 0x671B, 0x5192, 0x6469,
- 0x7FFB, 0x51E1, 0x78E8, 0x9B54, 0x2FC7, 0x69D9, 0x685D, 0x4FE3,
- 0x53C8, 0x7E6D, 0x9EBF, 0x8108, 0x660E, 0x76DF, 0x8FF7, 0x5984,
- 0x52D0, 0x76F2, 0x8017, 0x623E, 0x7D0B, 0x9580, 0x7D04, 0x8E8D,
- 0x687A, 0x687A, 0x6801, 0x6109, 0x8AED, 0x8F38, 0x52C7, 0x6709,
- 0x7336, 0x7336, 0x7337, 0x88D5, 0x904A, 0x66DC, 0x2EB7, 0x8981,
- 0x990A, 0x7FCC, 0x7FFC, 0x8EB6, 0x862D, 0x7387, 0x9F8D, 0x9F8D,
- 0x65C5, 0x6881, 0x71D0, 0x96A3, 0x9C57, 0x9E9F, 0x7C7B, 0x5EC9,
- 0x6190, 0x9023, 0x6717, 0x8002, 0x8107, 0x50CA, 0x511A, 0x5154,
- 0x5195, 0x2E87, 0x528D, 0x52D7, 0x52F9, 0x5349, 0x353E, 0x53DF,
- 0x66FC, 0x5533, 0x55E4, 0x5455, 0x56C0, 0x5939, 0x5A1C, 0x5AC2,
- 0x5B73, 0x5BC3, 0x5C14, 0x37E2, 0x5CE6, 0x5E54, 0x4E48, 0x5EE3,
- 0x6097, 0x62D4, 0x62CC, 0x641C, 0x63C6, 0x6428, 0x8209, 0x631B,
- 0x665F, 0x665F, 0x6663, 0x66F5, 0x675E, 0x689D, 0x688D, 0x69F6,
- 0x6961, 0x5BE8, 0x5BE8, 0x69BB, 0x6BCC, 0x6F11, 0x6E17, 0x6F98,
- 0x6CAA, 0x6CAA, 0x701B, 0x7162, 0x723B, 0x4E2C, 0x731C, 0x74CA,
- 0x74EF, 0x7575, 0x75EC, 0x764E, 0x3FB1, 0x776A, 0x77A9, 0x7940,
- 0x7953, 0x7953, 0x9F4B, 0x79AE, 0x9083, 0x7B53, 0x7C11, 0x7C14,
- 0x4264, 0x7C50, 0x7C58, 0x7D46, 0x7D63, 0x7E22, 0x7E22, 0x7E48,
- 0x7E35, 0x7E43, 0x7E8C, 0x7F50, 0x7F51, 0x7F51, 0x7F51, 0x7FC5,
- 0x7FC6, 0x7FE9, 0x8141, 0x4453, 0x8258, 0x8279, 0x2EBF, 0x2EC0,
- 0x82E3, 0x5179, 0x83A2, 0x8420, 0x83BD, 0x84F4, 0x856D, 0x8587,
- 0x85F4, 0x4E55, 0x8737, 0x873B, 0x8805, 0x87BD, 0x867D, 0x8836,
- 0x8944, 0x88C6, 0x89BD, 0x8ADB, 0x8B3E, 0x8B5A, 0x8D73, 0x8D99,
- 0x8DCB, 0x8E34, 0x8E4A, 0x8FEF, 0x9087, 0x8FFA, 0x901E, 0x9035,
- 0x9050, 0x8FC8, 0x9081, 0x908A, 0x908A, 0x908A, 0x908A, 0x908A,
- 0x908A, 0x9089, 0x9089, 0x9089, 0x9089, 0x9089, 0x9089, 0x9089,
- 0x9089, 0x9089, 0x9089, 0x9089, 0x9089, 0x92CF, 0x93DD, 0x95BC,
- 0x9621, 0x96B2, 0x975C, 0x9839, 0x98EB, 0x9903, 0x9909, 0x9945,
- 0x9945, 0x994B, 0x9A08, 0x9A5F, 0x9A65, 0x9AEF, 0x9B18, 0x9BDF,
- 0x9D09, 0x9D08, 0x9EA5, 0x9ECC, 0x9F08, 0x9F4A, 0x9F63, 0x9F67,
- 0x9F6C, 0x7199, 0x7199, 0x891C, 0x68C8, 0x66FB, 0x5F45, 0x5300,
- 0x5389, 0x5953, 0xFA11, 0x6852, 0x6A73, 0x6D87, 0xFA15, 0x8A12,
- 0x4E04, 0x4E05, 0x4E1F, 0x4E2B, 0x4E2F, 0x4E30, 0x4E40, 0x4E41,
- 0x4E44, 0x4E5A, 0x4E7F, 0x4E8D, 0x4E96, 0x4EB9, 0x4ED0, 0x4EE0,
- 0x4EFD, 0x4EFF, 0x4F0B, 0x4F15, 0x4F60, 0x4F3B, 0x4F49, 0x4F54,
- 0x4F7A, 0x4F7D, 0x4F7E, 0x4F97, 0x4FBE, 0x4FCF, 0x4FFD, 0x5000,
- 0x5001, 0x5010, 0x501B, 0x5027, 0x502E, 0x5057, 0x5066, 0x506A,
- 0x503B, 0x508F, 0x5096, 0x509C, 0x50CC, 0x50E6, 0x50E9, 0x50EF,
- 0x5108, 0x510B, 0x5110, 0x511B, 0x511E, 0x515F, 0x51A1, 0x51BC,
- 0x51DE, 0x51EE, 0x51F4, 0x5201, 0x5202, 0x5213, 0x5249, 0x5261,
- 0x5266, 0x5293, 0x52C8, 0x52F0, 0x530A, 0x530B, 0x533E, 0x534C,
- 0x534B, 0x5361, 0x536C, 0x53AB, 0x53DA, 0x53E6, 0x53F5, 0x5427,
- 0x544D, 0x5466, 0x546B, 0x5474, 0x548D, 0x5496, 0x54A1, 0x54AD,
- 0x54B9, 0x54BF, 0x54C6, 0x54CD, 0x550E, 0x552B, 0x5535, 0x554A,
- 0x5560, 0x5561, 0x5588, 0x558E, 0x5608, 0x560E, 0x560F, 0x5637,
- 0x563F, 0x5649, 0x564B, 0x564F, 0x5666, 0x5669, 0x566F, 0x5671,
- 0x5672, 0x5695, 0x569A, 0x56AC, 0x56AD, 0x56B1, 0x56C9, 0x56DD,
- 0x56E4, 0x570A, 0x5715, 0x5723, 0x572F, 0x5733, 0x5734, 0x574C,
- 0x5770, 0x578C, 0x579C, 0x57B8, 0x57E6, 0x57ED, 0x57F5, 0x57F6,
- 0x57FF, 0x5809, 0x5820, 0x5832, 0x587C, 0x5880, 0x58A9, 0x58CE,
- 0x58D0, 0x58D4, 0x58DA, 0x58E9, 0x590C, 0x5924, 0x592F, 0x5961,
- 0x596D, 0x59CA, 0x59D2, 0x59DD, 0x59E3, 0x59E4, 0x5A04, 0x5A0C,
- 0x5A23, 0x5A47, 0x5A55, 0x5A63, 0x5A6D, 0x5A7E, 0x5A9E, 0x5AA7,
- 0x5AAC, 0x5AB3, 0x5AE0, 0x5B00, 0x5B19, 0x5B25, 0x5B2D, 0x5B41,
- 0x5B7C, 0x5B7E, 0x5B7F, 0x5B8A, 0x5C23, 0x5C2B, 0x5C30, 0x5C63,
- 0x5C69, 0x5C7C, 0x5CCB, 0x5CD2, 0x5CF4, 0x5D24, 0x5D26, 0x5D43,
- 0x5D46, 0x5D4A, 0x5D92, 0x5D94, 0x5D99, 0x5DA0, 0x5DD8, 0x5DE0,
- 0x5DF8, 0x5E00, 0x5E12, 0x5E14, 0x5E15, 0x5E18, 0x5E2E, 0x5E58,
- 0x5E6B, 0x5E6C, 0x5EA8, 0x5EAA, 0x5EBE, 0x5EBF, 0x5ECB, 0x5ED2,
- 0x5F07, 0x5F0E, 0x5F1C, 0x5F1D, 0x5F22, 0x5F28, 0x5F36, 0x5F3B,
- 0x5F40, 0x5F50, 0x5F58, 0x5F64, 0x5F89, 0x5F9C, 0x5FA7, 0x5FA4,
- 0x5FAF, 0x5FB8, 0x5FC4, 0x5FC9, 0x5FE1, 0x5FE9, 0x5FED, 0x5FFC,
- 0x6017, 0x601A, 0x6033, 0x6061, 0x607F, 0x609E, 0x60A4, 0x60B0,
- 0x60CB, 0x60DB, 0x60F8, 0x6112, 0x6113, 0x6114, 0x611C, 0x617C,
- 0x618D, 0x619F, 0x61A8, 0x61C2, 0x61DF, 0x6215, 0x6229, 0x6243,
- 0x6246, 0x624C, 0x6251, 0x6256, 0x62C4, 0x62FC, 0x630A, 0x630D,
- 0x6318, 0x6339, 0x6342, 0x6343, 0x6365, 0x6374, 0x637D, 0x6384,
- 0x6387, 0x6390, 0x639E, 0x63D1, 0x63DC, 0x6409, 0x6410, 0x6422,
- 0x6454, 0x645B, 0x646D, 0x647B, 0x64BE, 0x64BF, 0x64E5, 0x64F7,
- 0x64FB, 0x6504, 0x6516, 0x6519, 0x6547, 0x6567, 0x6581, 0x6585,
- 0x65C2, 0x65F0, 0x65F2, 0x662C, 0x664C, 0x665B, 0x665C, 0x6661,
- 0x666B, 0x6677, 0x66A4, 0x66C8, 0x66EC, 0x6705, 0x6713, 0x6733,
- 0x6748, 0x674C, 0x6776, 0x677B, 0x67B0, 0x67B2, 0x67F9, 0x67D7,
- 0x67D9, 0x67F0, 0x682C, 0x6830, 0x6831, 0x685B, 0x6872, 0x6875,
- 0x687A, 0x6884, 0x68A5, 0x68B2, 0x68D0, 0x68D6, 0x68E8, 0x68ED,
- 0x68F0, 0x68F1, 0x68FC, 0x6911, 0x6913, 0x6935, 0x693B, 0x6957,
- 0x6963, 0x6972, 0x697F, 0x6980, 0x69A6, 0x69AD, 0x69B7, 0x69D6,
- 0x69D7, 0x6A01, 0x6A0F, 0x6A15, 0x6A28, 0x6A34, 0x6A3E, 0x6A45,
- 0x6A50, 0x6A51, 0x6A56, 0x6A5B, 0x6A83, 0x6A89, 0x6A91, 0x6A9D,
- 0x6A9E, 0x6A9F, 0x6ADC, 0x6AE7, 0x6AEC, 0x6B1E, 0x6B24, 0x6B35,
- 0x6B46, 0x6B56, 0x6B60, 0x6B82, 0x6BBE, 0x6BE1, 0x6BF1, 0x6C10,
- 0x6C33, 0x6C35, 0x6C3A, 0x6C59, 0x6C76, 0x6C7B, 0x6C85, 0x6C95,
- 0x6C9C, 0x6CD0, 0x6CD4, 0x6CD6, 0x6CE0, 0x6CEB, 0x6CEC, 0x6CEE,
- 0x6D0A, 0x6D0E, 0x6D11, 0x6D2E, 0x6D57, 0x6D5E, 0x6D65, 0x6D82,
- 0x6DBF, 0x6DC4, 0x6DCA, 0x6DD6, 0x6DE9, 0x6E22, 0x6E51, 0x6EC7,
- 0x6ECA, 0x6ECE, 0x6EFD, 0x6F1A, 0x6F2A, 0x6F2F, 0x6F33, 0x6F5A,
- 0x6F5E, 0x6F62, 0x6F7D, 0x6F8B, 0x6F8D, 0x6F92, 0x6F94, 0x6F9A,
- 0x6FA7, 0x6FA8, 0x6FB6, 0x6FDA, 0x6FDE, 0x6FF9, 0x7039, 0x703C,
- 0x704A, 0x7054, 0x705D, 0x705E, 0x7064, 0x706C, 0x707E, 0x7081,
- 0x7095, 0x70B7, 0x70D3, 0x70D4, 0x70D8, 0x70DC, 0x7107, 0x7120,
- 0x7131, 0x714A, 0x7152, 0x7160, 0x7179, 0x7192, 0x71B3, 0x71CB,
- 0x71D3, 0x71D6, 0x7200, 0x721D, 0x722B, 0x7238, 0x7241, 0x7253,
- 0x7255, 0x7256, 0x725C, 0x728D, 0x72AD, 0x72B4, 0x72C7, 0x72FB,
- 0x7304, 0x7305, 0x7328, 0x7331, 0x7343, 0x736C, 0x737C, 0x7383,
- 0x7385, 0x7386, 0x7395, 0x739E, 0x739F, 0x73A0, 0x73A6, 0x73AB,
- 0x73B5, 0x73B7, 0x73BC, 0x73CF, 0x73D9, 0x73E9, 0x73F4, 0x73FD,
- 0x7404, 0x740A, 0x741A, 0x741B, 0x7424, 0x7428, 0x742C, 0x742F,
- 0x7430, 0x7431, 0x7439, 0x7444, 0x7447, 0x744B, 0x744D, 0x7451,
- 0x7457, 0x7466, 0x746B, 0x7471, 0x7480, 0x7485, 0x7486, 0x7487,
- 0x7490, 0x7498, 0x749C, 0x74A0, 0x74A3, 0x74A8, 0x74AB, 0x74B5,
- 0x74BF, 0x74C8, 0x74DA, 0x74DE, 0x754E, 0x7579, 0x7581, 0x7590,
- 0x7592, 0x7593, 0x75B4, 0x75E4, 0x75F9, 0x7600, 0x760A, 0x7615,
- 0x7616, 0x7619, 0x761E, 0x762D, 0x7635, 0x7643, 0x764B, 0x7665,
- 0x766D, 0x766F, 0x7671, 0x7674, 0x76A4, 0x76A5, 0x76C5, 0x76CC,
- 0x76EC, 0x76FC, 0x7734, 0x7736, 0x775C, 0x775F, 0x7760, 0x7772,
- 0x777D, 0x7795, 0x77AA, 0x77E6, 0x77F0, 0x77F4, 0x7806, 0x7822,
- 0x782D, 0x782E, 0x7830, 0x7835, 0x7868, 0x789E, 0x78C8, 0x78CC,
- 0x78CE, 0x78E4, 0x78E0, 0x78E1, 0x78F2, 0x78F7, 0x78FB, 0x7931,
- 0x7934, 0x793B, 0x793D, 0x7945, 0x795B, 0x795C, 0x798B, 0x7996,
- 0x7998, 0x79B8, 0x79BB, 0x79CA, 0x79DA, 0x7A03, 0x7A09, 0x7A11,
- 0x7A1E, 0x7A2D, 0x7A39, 0x7A45, 0x7A4C, 0x7A5D, 0x7A60, 0x7A6D,
- 0x7A78, 0x7AA0, 0x7AA3, 0x7AB3, 0x7ABB, 0x7ABC, 0x7AC6, 0x7B07,
- 0x7B14, 0x7B27, 0x7B31, 0x7B47, 0x7B4E, 0x7B60, 0x7B69, 0x7B6D,
- 0x7B72, 0x7B91, 0x7BAF, 0x7BD7, 0x7BD9, 0x7C0B, 0x7C0F, 0x7C20,
- 0x7C26, 0x7C31, 0x7C36, 0x7C51, 0x7C59, 0x7C67, 0x7C6E, 0x7C70,
- 0x7CBC, 0x7CBF, 0x7CC8, 0x7CC9, 0x7CD7, 0x7CD9, 0x7CDD, 0x7CEB,
- 0x7D07, 0x7D08, 0x7D09, 0x7D13, 0x7D1D, 0x7D23, 0x7D41, 0x7D53,
- 0x7D59, 0x7D5D, 0x7D7A, 0x7D86, 0x7D8B, 0x7D8C, 0x7DCC, 0x7DEB,
- 0x7DF1, 0x7DF9, 0x7E08, 0x7E11, 0x7E15, 0x7E20, 0x7E47, 0x7E62,
- 0x7E6E, 0x7E73, 0x7E8D, 0x7E91, 0x7E98, 0x7F44, 0x7F4F, 0x7F52,
- 0x7F53, 0x7F61, 0x7F91, 0x7FBF, 0x7FCE, 0x7FDF, 0x7FE5, 0x7FEC,
- 0x7FEE, 0x7FEF, 0x7FFA, 0x800E, 0x8011, 0x8014, 0x8024, 0x8026,
- 0x803A, 0x803C, 0x8060, 0x8071, 0x8075, 0x809E, 0x80A6, 0x80AB,
- 0x80D7, 0x80D8, 0x8116, 0x8118, 0x813A, 0x814A, 0x814C, 0x8181,
- 0x8184, 0x81B4, 0x81CF, 0x81F9, 0x8203, 0x8221, 0x8232, 0x8234,
- 0x8246, 0x824B, 0x824F, 0x828E, 0x82AE, 0x82B7, 0x82BE, 0x82C6,
- 0x82FE, 0x8343, 0x8351, 0x8355, 0x8386, 0x838D, 0x8392, 0x8398,
- 0x83A9, 0x83BF, 0x83C0, 0x83EA, 0x840F, 0x8411, 0x844A, 0x8476,
- 0x84A8, 0x84AF, 0x84C0, 0x84C2, 0x84F0, 0x84FD, 0x850C, 0x8534,
- 0x855E, 0x858F, 0x85B7, 0x85CE, 0x85AD, 0x8612, 0x8629, 0x8652,
- 0x8663, 0x866C, 0x866F, 0x867A, 0x868D, 0x8691, 0x8698, 0x86A7,
- 0x86A8, 0x86FA, 0x86FD, 0x870B, 0x8713, 0x8719, 0x871E, 0x8728,
- 0x873E, 0x8771, 0x8788, 0x8799, 0x87AC, 0x87AD, 0x87B5, 0x87D6,
- 0x87EB, 0x87ED, 0x8801, 0x8803, 0x8806, 0x880B, 0x8814, 0x881C,
- 0x8856, 0x885F, 0x8864, 0x8898, 0x88AA, 0x88BD, 0x88BE, 0x88CA,
- 0x88D2, 0x88DB, 0x88F0, 0x88F1, 0x8906, 0x8918, 0x8919, 0x891A,
- 0x8927, 0x8930, 0x893E, 0x897B, 0x89D4, 0x89D6, 0x89E5, 0x89F1,
- 0x8A07, 0x8A0F, 0x8A15, 0x8A22, 0x8A4E, 0x8A7F, 0x8AF4, 0x8B1F,
- 0x8B37, 0x8B43, 0x8B44, 0x8B54, 0x8B9C, 0x8B9E, 0x8C47, 0x8C54,
- 0x8C73, 0x8CA4, 0x8CD9, 0x8CE1, 0x8CF8, 0x8CFE, 0x8D1B, 0x8D69,
- 0x8D6C, 0x8D84, 0x8D8D, 0x8D95, 0x8DA6, 0x8DC6, 0x8DCE, 0x8DE4,
- 0x8DEC, 0x8E20, 0x8E4B, 0x8E6C, 0x8E70, 0x8E7A, 0x8E92, 0x8EAE,
- 0x8EB3, 0x8ED1, 0x8ED4, 0x8EF9, 0x8F17, 0x8F36, 0x8FA6, 0x8FB5,
- 0x8FB6, 0x8FC6, 0x8FE0, 0x8FE4, 0x8FF6, 0x9002, 0x902C, 0x9044,
- 0x9088, 0x9095, 0x9099, 0x909B, 0x90A2, 0x90B4, 0x90D7, 0x90DD,
- 0x90F4, 0x9117, 0x911C, 0x9131, 0x913A, 0x913D, 0x9148, 0x915B,
- 0x9161, 0x9164, 0x918E, 0x919E, 0x91A8, 0x91AD, 0x91AE, 0x91B2,
- 0x91BC, 0x91F0, 0x91F7, 0x91FB, 0x9207, 0x9228, 0x9233, 0x9238,
- 0x9243, 0x9247, 0x924F, 0x9260, 0x92C2, 0x92CB, 0x92CC, 0x92DF,
- 0x930D, 0x9315, 0x931F, 0x9327, 0x9347, 0x9352, 0x9365, 0x936A,
- 0x936D, 0x939B, 0x93BA, 0x93A9, 0x93C1, 0x93CA, 0x93E2, 0x93FA,
- 0x93FD, 0x940F, 0x9434, 0x943F, 0x9455, 0x946B, 0x9472, 0x9578,
- 0x95A6, 0x95A9, 0x95AB, 0x95B4, 0x95BD, 0x95DA, 0x961D, 0x9641,
- 0x9658, 0x9684, 0x96A4, 0x96A9, 0x96D2, 0x5DB2, 0x96DE, 0x96E9,
- 0x96F1, 0x9702, 0x9709, 0x975A, 0x9763, 0x976E, 0x9773, 0x979A,
- 0x97A2, 0x97B5, 0x97B6, 0x97D9, 0x97DE, 0x97F4, 0x980A, 0x980E,
- 0x981E, 0x9823, 0x982B, 0x983E, 0x9852, 0x9853, 0x9859, 0x986C,
- 0x98B8, 0x98BA, 0x98BF, 0x98C8, 0x98E5, 0x9932, 0x9933, 0x9940,
- 0x994D, 0x995C, 0x995F, 0x99B1, 0x99B9, 0x99BA, 0x99C9, 0x9A02,
- 0x9A16, 0x9A24, 0x9A27, 0x9A2D, 0x9A2E, 0x9A36, 0x9A38, 0x9A4A,
- 0x9A56, 0x9AB5, 0x9AB6, 0x9AF9, 0x9B03, 0x9B20, 0x9B33, 0x9B34,
- 0x9B73, 0x9B79, 0x9BA7, 0x9BC1, 0x9BC7, 0x9BD7, 0x9BE7, 0x9BEB,
- 0x9BF7, 0x9BFA, 0x9BFD, 0x9C0B, 0x9C27, 0x9C2A, 0x9C36, 0x9C41,
- 0x9C53, 0x9C63, 0x9C6A, 0x9C77, 0x9D02, 0x9D42, 0x9D47, 0x9D63,
- 0x9D69, 0x9D7C, 0x9D7E, 0x9D8D, 0x9DB1, 0x9DC3, 0x9DC7, 0x9DD6,
- 0x9DDF, 0x9DEB, 0x9DF4, 0x9E15, 0x9E1D, 0x9EA4, 0x9EA8, 0x9EAC,
- 0x9EE7, 0x9EEE, 0x9F10, 0x9F12, 0x9F17, 0x9F19, 0x9F2F, 0x9F37,
- 0x9F39, 0x9F41, 0x9F45, 0x9F57, 0x9F68, 0x9F71, 0x9F75, 0x9F90,
- 0x9F94, 0x9FA2, 0x4E30, 0x3405, 0x4F60, 0x5620, 0x5ECB, 0x2E95,
- 0x60A4, 0x69D7, 0x6B24, 0x6FF9, 0x6EE6, 0x71B3, 0x2EA4, 0x7AC6,
- 0x7F61, 0x8071, 0x809E, 0x2ECC, 0x91F0, 0x5DB2, 0x97DE, 0x4FD3,
- 0x50D9, 0x50F0, 0x51C3, 0x5676, 0x6A54, 0x6D01, 0x6DD0, 0x6E42,
- 0x6ED9, 0x73E4, 0x7421, 0x756C, 0x7851, 0x87F5, 0xFFFD, 0x73A8,
- 0x3AF3, 0x34DB, 0x440C, 0x3E8A, 0xFFFD, 0xFFFD, 0x4BE8, 0xFFFD,
- 0x3EDA, 0x3B22, 0xFFFD, 0x457A, 0x4093, 0xFFFD, 0x4665, 0x4103,
- 0x4293, 0x46AE, 0x3488, 0xFFFD,
-};
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_Japan1CID2Unicode_4[15444] = {
+ 0xFFFD, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026,
+ 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E,
+ 0x002F, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036,
+ 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E,
+ 0x003F, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046,
+ 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E,
+ 0x004F, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056,
+ 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x00A5, 0x005D, 0x005E,
+ 0x005F, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066,
+ 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E,
+ 0x006F, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076,
+ 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x00A6, 0x007D, 0x0303,
+ 0x02BC, 0x005C, 0x02BB, 0x007C, 0x007E, 0x00A1, 0x00A2, 0x00A3,
+ 0x2044, 0x0192, 0x00A7, 0x00A4, 0x201C, 0x00AB, 0x2039, 0x203A,
+ 0xFB01, 0xFB02, 0x2012, 0x2020, 0x2021, 0x00B7, 0x00B6, 0x2022,
+ 0x201A, 0x201E, 0x201D, 0x00BB, 0x2026, 0x2030, 0x00BF, 0x0301,
+ 0x0302, 0x00AF, 0x0306, 0x0307, 0x0308, 0x030A, 0x00B8, 0x030B,
+ 0x0328, 0x030C, 0x0336, 0x00C6, 0x00AA, 0x0141, 0x00D8, 0x0152,
+ 0x00BA, 0x00E6, 0x0131, 0x0142, 0x00F8, 0x0153, 0x00DF, 0x002D,
+ 0x00A9, 0x00AC, 0x00AE, 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B5,
+ 0x00B9, 0x00BC, 0x00BD, 0x00BE, 0x00C0, 0x00C1, 0x00C2, 0x00C3,
+ 0x00C4, 0x00C5, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC,
+ 0x00CD, 0x00CE, 0x00CF, 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4,
+ 0x00D5, 0x00D6, 0x00D7, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD,
+ 0x00DE, 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E7,
+ 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,
+ 0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7,
+ 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF, 0x0160,
+ 0x0178, 0x017D, 0x0305, 0x0161, 0x2122, 0x017E, 0x0030, 0x0020,
+ 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028,
+ 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, 0x0030,
+ 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038,
+ 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, 0x0040,
+ 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048,
+ 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050,
+ 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058,
+ 0x0059, 0x005A, 0x005B, 0x00A5, 0x005D, 0x005E, 0x005F, 0x0060,
+ 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068,
+ 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, 0x0070,
+ 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078,
+ 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x203E, 0xFF60, 0xFF61,
+ 0xFF62, 0xFF63, 0xFF64, 0xFF65, 0xFF66, 0xFF67, 0xFF68, 0xFF69,
+ 0xFF6A, 0xFF6B, 0xFF6C, 0xFF6D, 0xFF6E, 0xFF6F, 0xFF70, 0xFF71,
+ 0xFF72, 0xFF73, 0xFF74, 0xFF75, 0xFF76, 0xFF77, 0xFF78, 0xFF79,
+ 0xFF7A, 0xFF7B, 0xFF7C, 0xFF7D, 0xFF7E, 0xFF7F, 0xFF80, 0xFF81,
+ 0xFF82, 0xFF83, 0xFF84, 0xFF85, 0xFF86, 0xFF87, 0xFF88, 0xFF89,
+ 0xFF8A, 0xFF8B, 0xFF8C, 0xFF8D, 0xFF8E, 0xFF8F, 0xFF90, 0xFF91,
+ 0xFF92, 0xFF93, 0xFF94, 0xFF95, 0xFF96, 0xFF97, 0xFF98, 0xFF99,
+ 0xFF9A, 0xFF9B, 0xFF9C, 0xFF9D, 0xFF9E, 0xFF9F, 0xFF40, 0x30F0,
+ 0x30F1, 0x30EE, 0x30AB, 0x30B1, 0x30F4, 0x30AC, 0x30AE, 0x30B0,
+ 0x30B2, 0x30B4, 0x30B6, 0x30B8, 0x30BA, 0x30BC, 0x30BE, 0x30C0,
+ 0x30C2, 0x30C5, 0x30C7, 0x30C9, 0x30D0, 0x30D1, 0x30D3, 0x30D4,
+ 0x30D6, 0x30D7, 0x30D9, 0x30DA, 0x30DC, 0x30DD, 0xFF60, 0x301D,
+ 0x301E, 0x2500, 0x2501, 0x2502, 0x2503, 0x2504, 0x2505, 0x2506,
+ 0x2507, 0x2508, 0x2509, 0x250A, 0x250B, 0x250C, 0x250D, 0x250E,
+ 0x250F, 0x2510, 0x2511, 0x2512, 0x2513, 0x2514, 0x2515, 0x2516,
+ 0x2517, 0x2518, 0x2519, 0x251A, 0x251B, 0x251C, 0x251D, 0x251E,
+ 0x251F, 0x2520, 0x2521, 0x2522, 0x2523, 0x2524, 0x2525, 0x2526,
+ 0x2527, 0x2528, 0x2529, 0x252A, 0x252B, 0x252C, 0x252D, 0x252E,
+ 0x252F, 0x2530, 0x2531, 0x2532, 0x2533, 0x2534, 0x2535, 0x2536,
+ 0x2537, 0x2538, 0x2539, 0x253A, 0x253B, 0x253C, 0x253D, 0x253E,
+ 0x253F, 0x2540, 0x2541, 0x2542, 0x2543, 0x2544, 0x2545, 0x2546,
+ 0x2547, 0x2548, 0x2549, 0x254A, 0x254B, 0x2032, 0x00A8, 0x2036,
+ 0x005B, 0x005D, 0x3008, 0x3009, 0x300A, 0x300B, 0x300E, 0x300F,
+ 0x3010, 0x3011, 0x2012, 0xFF60, 0x3092, 0x3041, 0x3043, 0x3045,
+ 0x3047, 0x3049, 0x3083, 0x3085, 0x3087, 0x3063, 0x3042, 0x3044,
+ 0x3046, 0x3048, 0x304A, 0x304B, 0x304D, 0x304F, 0x3051, 0x3053,
+ 0x3055, 0x3057, 0x3059, 0x305B, 0x305D, 0x305F, 0x3061, 0x3064,
+ 0x3066, 0x3068, 0x306A, 0x306B, 0x306C, 0x306D, 0x306E, 0x306F,
+ 0x3072, 0x3075, 0x3078, 0x307B, 0x307E, 0x307F, 0x3080, 0x3081,
+ 0x3082, 0x3084, 0x3086, 0x3088, 0x3089, 0x308A, 0x308B, 0x308C,
+ 0x308D, 0x308F, 0x3093, 0x3090, 0x3091, 0x308E, 0x304C, 0x304E,
+ 0x3050, 0x3052, 0x3054, 0x3056, 0x3068, 0x305A, 0x305C, 0x305E,
+ 0x3060, 0x3062, 0x3065, 0x3067, 0x3069, 0x3070, 0x3071, 0x3073,
+ 0x3074, 0x3076, 0x3077, 0x3079, 0x307A, 0x307C, 0x307D, 0x00C4,
+ 0x00F9, 0x00E9, 0x00ED, 0x00DF, 0x00E7, 0x00C7, 0x00D1, 0x00F1,
+ 0x00A2, 0x00A3, 0x00F3, 0x00FA, 0x00A1, 0x00BF, 0x00BD, 0x00D6,
+ 0x00DC, 0x00E4, 0x00EB, 0x00EF, 0x00F6, 0x00DC, 0x00E2, 0x00EA,
+ 0x00EE, 0x00F4, 0x00FC, 0x00E0, 0x00E9, 0x25B2, 0x00E1, 0x007E,
+ 0x0030, 0x3000, 0x3001, 0x3002, 0xFF0C, 0xFF0E, 0x30FB, 0xFF1A,
+ 0xFF1B, 0xFF1F, 0xFF01, 0x309B, 0x309C, 0x00B4, 0xFF40, 0x00A8,
+ 0xFF3E, 0x203E, 0xFF3F, 0x30FD, 0x30FE, 0x309D, 0x309E, 0x3003,
+ 0x4EDD, 0x3005, 0x3006, 0x3007, 0x30FC, 0x2015, 0x2010, 0xFF0F,
+ 0xFF3C, 0xFF5E, 0x2016, 0xFF5C, 0x2026, 0x2025, 0x2018, 0x2019,
+ 0x201C, 0x201D, 0xFF08, 0xFF09, 0x3014, 0x3015, 0xFF3B, 0xFF3D,
+ 0xFF5B, 0xFF5D, 0x3008, 0x3009, 0x300A, 0x300B, 0x300C, 0x300D,
+ 0x300E, 0x300F, 0x3010, 0x3011, 0xFF0B, 0xFF0D, 0x00B1, 0x00D7,
+ 0x00F7, 0xFF1D, 0x2260, 0xFF1C, 0xFF1E, 0x2266, 0x2267, 0x221E,
+ 0x2234, 0x2642, 0x2640, 0x00B0, 0x2032, 0x2033, 0x2103, 0xFFE5,
+ 0xFF04, 0x00A2, 0x00A3, 0xFF05, 0xFF03, 0xFF06, 0xFF0A, 0xFF20,
+ 0x00A7, 0x2606, 0x2605, 0x25CB, 0x25CF, 0x25CE, 0x25C7, 0x25C6,
+ 0x25A1, 0x25A0, 0x25B3, 0x25B2, 0x25BD, 0x25BC, 0x203B, 0x3012,
+ 0x2192, 0x2190, 0x2191, 0x2193, 0x3013, 0x2208, 0x220B, 0x2286,
+ 0x2287, 0x2282, 0x2283, 0x222A, 0x2229, 0x2227, 0x2228, 0x00AC,
+ 0x21D2, 0x21D4, 0x2200, 0x2203, 0x2220, 0x22A5, 0x2312, 0x2202,
+ 0x2207, 0x2261, 0x2252, 0x226A, 0x226B, 0x221A, 0x223D, 0x221D,
+ 0x2235, 0x222B, 0x222C, 0x212B, 0x2030, 0x266F, 0x266D, 0x266A,
+ 0x2020, 0x2021, 0x00B6, 0x25EF, 0xFF10, 0xFF11, 0xFF12, 0xFF13,
+ 0xFF14, 0xFF15, 0xFF16, 0xFF17, 0xFF18, 0xFF19, 0xFF21, 0xFF22,
+ 0xFF23, 0xFF24, 0xFF25, 0xFF26, 0xFF27, 0xFF28, 0xFF29, 0xFF2A,
+ 0xFF2B, 0xFF2C, 0xFF2D, 0xFF2E, 0xFF2F, 0xFF30, 0xFF31, 0xFF32,
+ 0xFF33, 0xFF34, 0xFF35, 0xFF36, 0xFF37, 0xFF38, 0xFF39, 0xFF3A,
+ 0xFF41, 0xFF42, 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, 0xFF48,
+ 0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F, 0xFF50,
+ 0xFF51, 0xFF52, 0xFF53, 0xFF54, 0xFF55, 0xFF56, 0xFF57, 0xFF58,
+ 0xFF59, 0xFF5A, 0x3041, 0x3042, 0x3043, 0x3044, 0x3045, 0x3046,
+ 0x3047, 0x3048, 0x3049, 0x304A, 0x304B, 0x304C, 0x304D, 0x304E,
+ 0x304F, 0x3050, 0x3051, 0x3052, 0x3053, 0x3054, 0x3055, 0x3056,
+ 0x3057, 0x3058, 0x3059, 0x305A, 0x305B, 0x305C, 0x305D, 0x305E,
+ 0x305F, 0x3060, 0x3061, 0x3062, 0x3063, 0x3064, 0x3065, 0x3066,
+ 0x3067, 0x3068, 0x3069, 0x306A, 0x306B, 0x306C, 0x306D, 0x306E,
+ 0x306F, 0x3070, 0x3071, 0x3072, 0x3073, 0x3074, 0x3075, 0x3076,
+ 0x3077, 0x3078, 0x3079, 0x307A, 0x307B, 0x307C, 0x307D, 0x307E,
+ 0x307F, 0x3080, 0x3081, 0x3082, 0x3083, 0x3084, 0x3085, 0x3086,
+ 0x3087, 0x3088, 0x3089, 0x308A, 0x308B, 0x308C, 0x308D, 0x308E,
+ 0x308F, 0x3090, 0x3091, 0x3092, 0x3093, 0x30A1, 0x30A2, 0x30A3,
+ 0x30A4, 0x30A5, 0x30A6, 0x30A7, 0x30A8, 0x30A9, 0x30AA, 0x30AB,
+ 0x30AC, 0x30AD, 0x30AE, 0x30AF, 0x30B0, 0x30B1, 0x30B2, 0x30B3,
+ 0x30B4, 0x30B5, 0x30B6, 0x30B7, 0x30B8, 0x30B9, 0x30BA, 0x30BB,
+ 0x30BC, 0x30BD, 0x30BE, 0x30BF, 0x30C0, 0x30C1, 0x30C2, 0x30C3,
+ 0x30C4, 0x30C5, 0x30C6, 0x30C7, 0x30C8, 0x30C9, 0x30CA, 0x30CB,
+ 0x30CC, 0x30CD, 0x30CE, 0x30CF, 0x30D0, 0x30D1, 0x30D2, 0x30D3,
+ 0x30D4, 0x30D5, 0x30D6, 0x30D7, 0x30D8, 0x30D9, 0x30DA, 0x30DB,
+ 0x30DC, 0x30DD, 0x30DE, 0x30DF, 0x30E0, 0x30E1, 0x30E2, 0x30E3,
+ 0x30E4, 0x30E5, 0x30E6, 0x30E7, 0x30E8, 0x30E9, 0x30EA, 0x30EB,
+ 0x30EC, 0x30ED, 0x30EE, 0x30EF, 0x30F0, 0x30F1, 0x30F2, 0x30F3,
+ 0x30F4, 0x30F5, 0x30F6, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395,
+ 0x0396, 0x0397, 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D,
+ 0x039E, 0x039F, 0x03A0, 0x03A1, 0x03A3, 0x03A4, 0x03A5, 0x03A6,
+ 0x03A7, 0x03A8, 0x03A9, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5,
+ 0x03B6, 0x03B7, 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD,
+ 0x03BE, 0x03BF, 0x03C0, 0x03C1, 0x03C3, 0x03C4, 0x03C5, 0x03C6,
+ 0x03C7, 0x03C8, 0x03C9, 0x0410, 0x0411, 0x0412, 0x0413, 0x0414,
+ 0x0415, 0x0401, 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, 0x041B,
+ 0x041C, 0x041D, 0x041E, 0x041F, 0x0420, 0x0421, 0x0422, 0x0423,
+ 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, 0x042B,
+ 0x042C, 0x042D, 0x042E, 0x042F, 0x0430, 0x0431, 0x0432, 0x0433,
+ 0x0434, 0x0435, 0x0451, 0x0436, 0x0437, 0x0438, 0x0439, 0x043A,
+ 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, 0x0440, 0x0441, 0x0442,
+ 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044A,
+ 0x044B, 0x044C, 0x044D, 0x044E, 0x044F, 0x4E9C, 0x5516, 0x5A03,
+ 0x963F, 0x54C0, 0x611B, 0x6328, 0x59F6, 0x9022, 0x8475, 0x831C,
+ 0x7A50, 0x60AA, 0x63E1, 0x6E25, 0x65ED, 0x8466, 0x82A6, 0x9BF5,
+ 0x6893, 0x5727, 0x65A1, 0x6271, 0x5B9B, 0x59D0, 0x867B, 0x98F4,
+ 0x7D62, 0x7DBE, 0x9B8E, 0x6216, 0x7C9F, 0x88B7, 0x5B89, 0x5EB5,
+ 0x6309, 0x6697, 0x6848, 0x95C7, 0x978D, 0x674F, 0x4EE5, 0x4F0A,
+ 0x4F4D, 0x4F9D, 0x5049, 0x56F2, 0x5937, 0x59D4, 0x5A01, 0x5C09,
+ 0x60DF, 0x610F, 0x6170, 0x6613, 0x6905, 0x70BA, 0x754F, 0x7570,
+ 0x79FB, 0x7DAD, 0x7DEF, 0x80C3, 0x840E, 0x8863, 0x8B02, 0x9055,
+ 0x907A, 0x533B, 0x4E95, 0x4EA5, 0x57DF, 0x80B2, 0x90C1, 0x78EF,
+ 0x4E00, 0x58F1, 0x6EA2, 0x9038, 0x7A32, 0x8328, 0x828B, 0x9C2F,
+ 0x5141, 0x5370, 0x54BD, 0x54E1, 0x56E0, 0x59FB, 0x5F15, 0x98F2,
+ 0x6DEB, 0x80E4, 0x852D, 0x9662, 0x9670, 0x96A0, 0x97FB, 0x540B,
+ 0x53F3, 0x5B87, 0x70CF, 0x7FBD, 0x8FC2, 0x96E8, 0x536F, 0x9D5C,
+ 0x7ABA, 0x4E11, 0x7893, 0x81FC, 0x6E26, 0x5618, 0x5504, 0x6B1D,
+ 0x851A, 0x9C3B, 0x59E5, 0x53A9, 0x6D66, 0x74DC, 0x958F, 0x5642,
+ 0x4E91, 0x904B, 0x96F2, 0x834F, 0x990C, 0x53E1, 0x55B6, 0x5B30,
+ 0x5F71, 0x6620, 0x66F3, 0x6804, 0x6C38, 0x6CF3, 0x6D29, 0x745B,
+ 0x76C8, 0x7A4E, 0x9834, 0x82F1, 0x885B, 0x8A60, 0x92ED, 0x6DB2,
+ 0x75AB, 0x76CA, 0x99C5, 0x60A6, 0x8B01, 0x8D8A, 0x95B2, 0x698E,
+ 0x53AD, 0x5186, 0x5712, 0x5830, 0x5944, 0x5BB4, 0x5EF6, 0x6028,
+ 0x63A9, 0x63F4, 0x6CBF, 0x6F14, 0x708E, 0x7114, 0x7159, 0x71D5,
+ 0x733F, 0x7E01, 0x8276, 0x82D1, 0x8597, 0x9060, 0x925B, 0x9D1B,
+ 0x5869, 0x65BC, 0x6C5A, 0x7525, 0x51F9, 0x592E, 0x5965, 0x5F80,
+ 0x5FDC, 0x62BC, 0x65FA, 0x6A2A, 0x6B27, 0x6BB4, 0x738B, 0x7FC1,
+ 0x8956, 0x9D2C, 0x9D0E, 0x9EC4, 0x5CA1, 0x6C96, 0x837B, 0x5104,
+ 0x5C4B, 0x61B6, 0x81C6, 0x6876, 0x7261, 0x4E59, 0x4FFA, 0x5378,
+ 0x6069, 0x6E29, 0x7A4F, 0x97F3, 0x4E0B, 0x5316, 0x4EEE, 0x4F55,
+ 0x4F3D, 0x4FA1, 0x4F73, 0x52A0, 0x53EF, 0x5609, 0x590F, 0x5AC1,
+ 0x5BB6, 0x5BE1, 0x79D1, 0x6687, 0x679C, 0x67B6, 0x6B4C, 0x6CB3,
+ 0x706B, 0x73C2, 0x798D, 0x79BE, 0x7A3C, 0x7B87, 0x82B1, 0x82DB,
+ 0x8304, 0x8377, 0x83EF, 0x83D3, 0x8766, 0x8AB2, 0x5629, 0x8CA8,
+ 0x8FE6, 0x904E, 0x971E, 0x868A, 0x4FC4, 0x5CE8, 0x6211, 0x7259,
+ 0x753B, 0x81E5, 0x82BD, 0x86FE, 0x8CC0, 0x96C5, 0x9913, 0x99D5,
+ 0x4ECB, 0x4F1A, 0x89E3, 0x56DE, 0x584A, 0x58CA, 0x5EFB, 0x5FEB,
+ 0x602A, 0x6094, 0x6062, 0x61D0, 0x6212, 0x62D0, 0x6539, 0x9B41,
+ 0x6666, 0x68B0, 0x6D77, 0x7070, 0x754C, 0x7686, 0x7D75, 0x82A5,
+ 0x87F9, 0x958B, 0x968E, 0x8C9D, 0x51F1, 0x52BE, 0x5916, 0x54B3,
+ 0x5BB3, 0x5D16, 0x6168, 0x6982, 0x6DAF, 0x788D, 0x84CB, 0x8857,
+ 0x8A72, 0x93A7, 0x9AB8, 0x6D6C, 0x99A8, 0x86D9, 0x57A3, 0x67FF,
+ 0x86CE, 0x920E, 0x5283, 0x5687, 0x5404, 0x5ED3, 0x62E1, 0x64B9,
+ 0x683C, 0x6838, 0x6BBB, 0x7372, 0x78BA, 0x7A6B, 0x899A, 0x89D2,
+ 0x8D6B, 0x8F03, 0x90ED, 0x95A3, 0x9694, 0x9769, 0x5B66, 0x5CB3,
+ 0x697D, 0x984D, 0x984E, 0x639B, 0x7B20, 0x6A2B, 0x6A7F, 0x68B6,
+ 0x9C0D, 0x6F5F, 0x5272, 0x559D, 0x6070, 0x62EC, 0x6D3B, 0x6E07,
+ 0x6ED1, 0x845B, 0x8910, 0x8F44, 0x4E14, 0x9C39, 0x53F6, 0x691B,
+ 0x6A3A, 0x9784, 0x682A, 0x515C, 0x7AC3, 0x84B2, 0x91DC, 0x938C,
+ 0x565B, 0x9D28, 0x6822, 0x8305, 0x8431, 0x7CA5, 0x5208, 0x82C5,
+ 0x74E6, 0x4E7E, 0x4F83, 0x51A0, 0x5BD2, 0x520A, 0x52D8, 0x52E7,
+ 0x5DFB, 0x559A, 0x582A, 0x59E6, 0x5B8C, 0x5B98, 0x5BDB, 0x5E72,
+ 0x5E79, 0x60A3, 0x611F, 0x6163, 0x61BE, 0x63DB, 0x6562, 0x67D1,
+ 0x6853, 0x68FA, 0x6B3E, 0x6B53, 0x6C57, 0x6F22, 0x6F97, 0x6F45,
+ 0x74B0, 0x7518, 0x76E3, 0x770B, 0x7AFF, 0x7BA1, 0x7C21, 0x7DE9,
+ 0x7F36, 0x7FF0, 0x809D, 0x8266, 0x839E, 0x89B3, 0x8ACC, 0x8CAB,
+ 0x9084, 0x9451, 0x9593, 0x9591, 0x95A2, 0x9665, 0x97D3, 0x9928,
+ 0x8218, 0x4E38, 0x542B, 0x5CB8, 0x5DCC, 0x73A9, 0x764C, 0x773C,
+ 0x5CA9, 0x7FEB, 0x8D0B, 0x96C1, 0x9811, 0x9854, 0x9858, 0x4F01,
+ 0x4F0E, 0x5371, 0x559C, 0x5668, 0x57FA, 0x5947, 0x5B09, 0x5BC4,
+ 0x5C90, 0x5E0C, 0x5E7E, 0x5FCC, 0x63EE, 0x673A, 0x65D7, 0x65E2,
+ 0x671F, 0x68CB, 0x68C4, 0x6A5F, 0x5E30, 0x6BC5, 0x6C17, 0x6C7D,
+ 0x757F, 0x7948, 0x5B63, 0x7A00, 0x7D00, 0x5FBD, 0x898F, 0x8A18,
+ 0x8CB4, 0x8D77, 0x8ECC, 0x8F1D, 0x98E2, 0x9A0E, 0x9B3C, 0x4E80,
+ 0x507D, 0x5100, 0x5993, 0x5B9C, 0x622F, 0x6280, 0x64EC, 0x6B3A,
+ 0x72A0, 0x7591, 0x7947, 0x7FA9, 0x87FB, 0x8ABC, 0x8B70, 0x63AC,
+ 0x83CA, 0x97A0, 0x5409, 0x5403, 0x55AB, 0x6854, 0x6A58, 0x8A70,
+ 0x7827, 0x6775, 0x9ECD, 0x5374, 0x5BA2, 0x811A, 0x8650, 0x9006,
+ 0x4E18, 0x4E45, 0x4EC7, 0x4F11, 0x53CA, 0x5438, 0x5BAE, 0x5F13,
+ 0x6025, 0x6551, 0x673D, 0x6C42, 0x6C72, 0x6CE3, 0x7078, 0x7403,
+ 0x7A76, 0x7AAE, 0x7B08, 0x7D1A, 0x7CFE, 0x7D66, 0x65E7, 0x725B,
+ 0x53BB, 0x5C45, 0x5DE8, 0x62D2, 0x62E0, 0x6319, 0x6E20, 0x865A,
+ 0x8A31, 0x8DDD, 0x92F8, 0x6F01, 0x79A6, 0x9B5A, 0x4EA8, 0x4EAB,
+ 0x4EAC, 0x4F9B, 0x4FA0, 0x50D1, 0x5147, 0x7AF6, 0x5171, 0x51F6,
+ 0x5354, 0x5321, 0x537F, 0x53EB, 0x55AC, 0x5883, 0x5CE1, 0x5F37,
+ 0x5F4A, 0x602F, 0x6050, 0x606D, 0x631F, 0x6559, 0x6A4B, 0x6CC1,
+ 0x72C2, 0x72ED, 0x77EF, 0x80F8, 0x8105, 0x8208, 0x854E, 0x90F7,
+ 0x93E1, 0x97FF, 0x9957, 0x9A5A, 0x4EF0, 0x51DD, 0x5C2D, 0x6681,
+ 0x696D, 0x5C40, 0x66F2, 0x6975, 0x7389, 0x6850, 0x7C81, 0x50C5,
+ 0x52E4, 0x5747, 0x5DFE, 0x9326, 0x65A4, 0x6B23, 0x6B3D, 0x7434,
+ 0x7981, 0x79BD, 0x7B4B, 0x7DCA, 0x82B9, 0x83CC, 0x887F, 0x895F,
+ 0x8B39, 0x8FD1, 0x91D1, 0x541F, 0x9280, 0x4E5D, 0x5036, 0x53E5,
+ 0x533A, 0x72D7, 0x7396, 0x77E9, 0x82E6, 0x8EAF, 0x99C6, 0x99C8,
+ 0x99D2, 0x5177, 0x611A, 0x865E, 0x55B0, 0x7A7A, 0x5076, 0x5BD3,
+ 0x9047, 0x9685, 0x4E32, 0x6ADB, 0x91E7, 0x5C51, 0x5C48, 0x6398,
+ 0x7A9F, 0x6C93, 0x9774, 0x8F61, 0x7AAA, 0x718A, 0x9688, 0x7C82,
+ 0x6817, 0x7E70, 0x6851, 0x936C, 0x52F2, 0x541B, 0x85AB, 0x8A13,
+ 0x7FA4, 0x8ECD, 0x90E1, 0x5366, 0x8888, 0x7941, 0x4FC2, 0x50BE,
+ 0x5211, 0x5144, 0x5553, 0x572D, 0x73EA, 0x578B, 0x5951, 0x5F62,
+ 0x5F84, 0x6075, 0x6176, 0x6167, 0x61A9, 0x63B2, 0x643A, 0x656C,
+ 0x666F, 0x6842, 0x6E13, 0x7566, 0x7A3D, 0x7CFB, 0x7D4C, 0x7D99,
+ 0x7E4B, 0x7F6B, 0x830E, 0x834A, 0x86CD, 0x8A08, 0x8A63, 0x8B66,
+ 0x8EFD, 0x981A, 0x9D8F, 0x82B8, 0x8FCE, 0x9BE8, 0x5287, 0x621F,
+ 0x6483, 0x6FC0, 0x9699, 0x6841, 0x5091, 0x6B20, 0x6C7A, 0x6F54,
+ 0x7A74, 0x7D50, 0x8840, 0x8A23, 0x6708, 0x4EF6, 0x5039, 0x5026,
+ 0x5065, 0x517C, 0x5238, 0x5263, 0x55A7, 0x570F, 0x5805, 0x5ACC,
+ 0x5EFA, 0x61B2, 0x61F8, 0x62F3, 0x6372, 0x691C, 0x6A29, 0x727D,
+ 0x72AC, 0x732E, 0x7814, 0x786F, 0x7D79, 0x770C, 0x80A9, 0x898B,
+ 0x8B19, 0x8CE2, 0x8ED2, 0x9063, 0x9375, 0x967A, 0x9855, 0x9A13,
+ 0x9E78, 0x5143, 0x539F, 0x53B3, 0x5E7B, 0x5F26, 0x6E1B, 0x6E90,
+ 0x7384, 0x73FE, 0x7D43, 0x8237, 0x8A00, 0x8AFA, 0x9650, 0x4E4E,
+ 0x500B, 0x53E4, 0x547C, 0x56FA, 0x59D1, 0x5B64, 0x5DF1, 0x5EAB,
+ 0x5F27, 0x6238, 0x6545, 0x67AF, 0x6E56, 0x72D0, 0x7CCA, 0x88B4,
+ 0x80A1, 0x80E1, 0x83F0, 0x864E, 0x8A87, 0x8DE8, 0x9237, 0x96C7,
+ 0x9867, 0x9F13, 0x4E94, 0x4E92, 0x4F0D, 0x5348, 0x5449, 0x543E,
+ 0x5A2F, 0x5F8C, 0x5FA1, 0x609F, 0x68A7, 0x6A8E, 0x745A, 0x7881,
+ 0x8A9E, 0x8AA4, 0x8B77, 0x9190, 0x4E5E, 0x9BC9, 0x4EA4, 0x4F7C,
+ 0x4FAF, 0x5019, 0x5016, 0x5149, 0x516C, 0x529F, 0x52B9, 0x52FE,
+ 0x539A, 0x53E3, 0x5411, 0x540E, 0x5589, 0x5751, 0x57A2, 0x597D,
+ 0x5B54, 0x5B5D, 0x5B8F, 0x5DE5, 0x5DE7, 0x5DF7, 0x5E78, 0x5E83,
+ 0x5E9A, 0x5EB7, 0x5F18, 0x6052, 0x614C, 0x6297, 0x62D8, 0x63A7,
+ 0x653B, 0x6602, 0x6643, 0x66F4, 0x676D, 0x6821, 0x6897, 0x69CB,
+ 0x6C5F, 0x6D2A, 0x6D69, 0x6E2F, 0x6E9D, 0x7532, 0x7687, 0x786C,
+ 0x7A3F, 0x7CE0, 0x7D05, 0x7D18, 0x7D5E, 0x7DB1, 0x8015, 0x8003,
+ 0x80AF, 0x80B1, 0x8154, 0x818F, 0x822A, 0x8352, 0x884C, 0x8861,
+ 0x8B1B, 0x8CA2, 0x8CFC, 0x90CA, 0x9175, 0x9271, 0x783F, 0x92FC,
+ 0x95A4, 0x964D, 0x9805, 0x9999, 0x9AD8, 0x9D3B, 0x525B, 0x52AB,
+ 0x53F7, 0x5408, 0x58D5, 0x62F7, 0x6FE0, 0x8C6A, 0x8F5F, 0x9EB9,
+ 0x514B, 0x523B, 0x544A, 0x56FD, 0x7A40, 0x9177, 0x9D60, 0x9ED2,
+ 0x7344, 0x6F09, 0x8170, 0x7511, 0x5FFD, 0x60DA, 0x9AA8, 0x72DB,
+ 0x8FBC, 0x6B64, 0x9803, 0x4ECA, 0x56F0, 0x5764, 0x58BE, 0x5A5A,
+ 0x6068, 0x61C7, 0x660F, 0x6606, 0x6839, 0x68B1, 0x6DF7, 0x75D5,
+ 0x7D3A, 0x826E, 0x9B42, 0x4E9B, 0x4F50, 0x53C9, 0x5506, 0x5D6F,
+ 0x5DE6, 0x5DEE, 0x67FB, 0x6C99, 0x7473, 0x7802, 0x8A50, 0x9396,
+ 0x88DF, 0x5750, 0x5EA7, 0x632B, 0x50B5, 0x50AC, 0x518D, 0x6700,
+ 0x54C9, 0x585E, 0x59BB, 0x5BB0, 0x5F69, 0x624D, 0x63A1, 0x683D,
+ 0x6B73, 0x6E08, 0x707D, 0x91C7, 0x7280, 0x7815, 0x7826, 0x796D,
+ 0x658E, 0x7D30, 0x83DC, 0x88C1, 0x8F09, 0x969B, 0x5264, 0x5728,
+ 0x6750, 0x7F6A, 0x8CA1, 0x51B4, 0x5742, 0x962A, 0x583A, 0x698A,
+ 0x80B4, 0x54B2, 0x5D0E, 0x57FC, 0x7895, 0x9DFA, 0x4F5C, 0x524A,
+ 0x548B, 0x643E, 0x6628, 0x6714, 0x67F5, 0x7A84, 0x7B56, 0x7D22,
+ 0x932F, 0x685C, 0x9BAD, 0x7B39, 0x5319, 0x518A, 0x5237, 0x5BDF,
+ 0x62F6, 0x64AE, 0x64E6, 0x672D, 0x6BBA, 0x85A9, 0x96D1, 0x7690,
+ 0x9BD6, 0x634C, 0x9306, 0x9BAB, 0x76BF, 0x6652, 0x4E09, 0x5098,
+ 0x53C2, 0x5C71, 0x60E8, 0x6492, 0x6563, 0x685F, 0x71E6, 0x73CA,
+ 0x7523, 0x7B97, 0x7E82, 0x8695, 0x8B83, 0x8CDB, 0x9178, 0x9910,
+ 0x65AC, 0x66AB, 0x6B8B, 0x4ED5, 0x4ED4, 0x4F3A, 0x4F7F, 0x523A,
+ 0x53F8, 0x53F2, 0x55E3, 0x56DB, 0x58EB, 0x59CB, 0x59C9, 0x59FF,
+ 0x5B50, 0x5C4D, 0x5E02, 0x5E2B, 0x5FD7, 0x601D, 0x6307, 0x652F,
+ 0x5B5C, 0x65AF, 0x65BD, 0x65E8, 0x679D, 0x6B62, 0x6B7B, 0x6C0F,
+ 0x7345, 0x7949, 0x79C1, 0x7CF8, 0x7D19, 0x7D2B, 0x80A2, 0x8102,
+ 0x81F3, 0x8996, 0x8A5E, 0x8A69, 0x8A66, 0x8A8C, 0x8AEE, 0x8CC7,
+ 0x8CDC, 0x96CC, 0x98FC, 0x6B6F, 0x4E8B, 0x4F3C, 0x4F8D, 0x5150,
+ 0x5B57, 0x5BFA, 0x6148, 0x6301, 0x6642, 0x6B21, 0x6ECB, 0x6CBB,
+ 0x723E, 0x74BD, 0x75D4, 0x78C1, 0x793A, 0x800C, 0x8033, 0x81EA,
+ 0x8494, 0x8F9E, 0x6C50, 0x9E7F, 0x5F0F, 0x8B58, 0x9D2B, 0x7AFA,
+ 0x8EF8, 0x5B8D, 0x96EB, 0x4E03, 0x53F1, 0x57F7, 0x5931, 0x5AC9,
+ 0x5BA4, 0x6089, 0x6E7F, 0x6F06, 0x75BE, 0x8CEA, 0x5B9F, 0x8500,
+ 0x7BE0, 0x5072, 0x67F4, 0x829D, 0x5C61, 0x854A, 0x7E1E, 0x820E,
+ 0x5199, 0x5C04, 0x6368, 0x8D66, 0x659C, 0x716E, 0x793E, 0x7D17,
+ 0x8005, 0x8B1D, 0x8ECA, 0x906E, 0x86C7, 0x90AA, 0x501F, 0x52FA,
+ 0x5C3A, 0x6753, 0x707C, 0x7235, 0x914C, 0x91C8, 0x932B, 0x82E5,
+ 0x5BC2, 0x5F31, 0x60F9, 0x4E3B, 0x53D6, 0x5B88, 0x624B, 0x6731,
+ 0x6B8A, 0x72E9, 0x73E0, 0x7A2E, 0x816B, 0x8DA3, 0x9152, 0x9996,
+ 0x5112, 0x53D7, 0x546A, 0x5BFF, 0x6388, 0x6A39, 0x7DAC, 0x9700,
+ 0x56DA, 0x53CE, 0x5468, 0x5B97, 0x5C31, 0x5DDE, 0x4FEE, 0x6101,
+ 0x62FE, 0x6D32, 0x79C0, 0x79CB, 0x7D42, 0x7E4D, 0x7FD2, 0x81ED,
+ 0x821F, 0x8490, 0x8846, 0x8972, 0x8B90, 0x8E74, 0x8F2F, 0x9031,
+ 0x914B, 0x916C, 0x96C6, 0x919C, 0x4EC0, 0x4F4F, 0x5145, 0x5341,
+ 0x5F93, 0x620E, 0x67D4, 0x6C41, 0x6E0B, 0x7363, 0x7E26, 0x91CD,
+ 0x9283, 0x53D4, 0x5919, 0x5BBF, 0x6DD1, 0x795D, 0x7E2E, 0x7C9B,
+ 0x587E, 0x719F, 0x51FA, 0x8853, 0x8FF0, 0x4FCA, 0x5CFB, 0x6625,
+ 0x77AC, 0x7AE3, 0x821C, 0x99FF, 0x51C6, 0x5FAA, 0x65EC, 0x696F,
+ 0x6B89, 0x6DF3, 0x6E96, 0x6F64, 0x76FE, 0x7D14, 0x5DE1, 0x9075,
+ 0x9187, 0x9806, 0x51E6, 0x521D, 0x6240, 0x6691, 0x66D9, 0x6E1A,
+ 0x5EB6, 0x7DD2, 0x7F72, 0x66F8, 0x85AF, 0x85F7, 0x8AF8, 0x52A9,
+ 0x53D9, 0x5973, 0x5E8F, 0x5F90, 0x6055, 0x92E4, 0x9664, 0x50B7,
+ 0x511F, 0x52DD, 0x5320, 0x5347, 0x53EC, 0x54E8, 0x5546, 0x5531,
+ 0x5617, 0x5968, 0x59BE, 0x5A3C, 0x5BB5, 0x5C06, 0x5C0F, 0x5C11,
+ 0x5C1A, 0x5E84, 0x5E8A, 0x5EE0, 0x5F70, 0x627F, 0x6284, 0x62DB,
+ 0x638C, 0x6377, 0x6607, 0x660C, 0x662D, 0x6676, 0x677E, 0x68A2,
+ 0x6A1F, 0x6A35, 0x6CBC, 0x6D88, 0x6E09, 0x6E58, 0x713C, 0x7126,
+ 0x7167, 0x75C7, 0x7701, 0x785D, 0x7901, 0x7965, 0x79F0, 0x7AE0,
+ 0x7B11, 0x7CA7, 0x7D39, 0x8096, 0x83D6, 0x848B, 0x8549, 0x885D,
+ 0x88F3, 0x8A1F, 0x8A3C, 0x8A54, 0x8A73, 0x8C61, 0x8CDE, 0x91A4,
+ 0x9266, 0x937E, 0x9418, 0x969C, 0x9798, 0x4E0A, 0x4E08, 0x4E1E,
+ 0x4E57, 0x5197, 0x5270, 0x57CE, 0x5834, 0x58CC, 0x5B22, 0x5E38,
+ 0x60C5, 0x64FE, 0x6761, 0x6756, 0x6D44, 0x72B6, 0x7573, 0x7A63,
+ 0x84B8, 0x8B72, 0x91B8, 0x9320, 0x5631, 0x57F4, 0x98FE, 0x62ED,
+ 0x690D, 0x6B96, 0x71ED, 0x7E54, 0x8077, 0x8272, 0x89E6, 0x98DF,
+ 0x8755, 0x8FB1, 0x5C3B, 0x4F38, 0x4FE1, 0x4FB5, 0x5507, 0x5A20,
+ 0x5BDD, 0x5BE9, 0x5FC3, 0x614E, 0x632F, 0x65B0, 0x664B, 0x68EE,
+ 0x699B, 0x6D78, 0x6DF1, 0x7533, 0x75B9, 0x771F, 0x795E, 0x79E6,
+ 0x7D33, 0x81E3, 0x82AF, 0x85AA, 0x89AA, 0x8A3A, 0x8EAB, 0x8F9B,
+ 0x9032, 0x91DD, 0x9707, 0x4EBA, 0x4EC1, 0x5203, 0x5875, 0x58EC,
+ 0x5C0B, 0x751A, 0x5C3D, 0x814E, 0x8A0A, 0x8FC5, 0x9663, 0x976D,
+ 0x7B25, 0x8ACF, 0x9808, 0x9162, 0x56F3, 0x53A8, 0x9017, 0x5439,
+ 0x5782, 0x5E25, 0x63A8, 0x6C34, 0x708A, 0x7761, 0x7C8B, 0x7FE0,
+ 0x8870, 0x9042, 0x9154, 0x9310, 0x9318, 0x968F, 0x745E, 0x9AC4,
+ 0x5D07, 0x5D69, 0x6570, 0x67A2, 0x8DA8, 0x96DB, 0x636E, 0x6749,
+ 0x6919, 0x83C5, 0x9817, 0x96C0, 0x88FE, 0x6F84, 0x647A, 0x5BF8,
+ 0x4E16, 0x702C, 0x755D, 0x662F, 0x51C4, 0x5236, 0x52E2, 0x59D3,
+ 0x5F81, 0x6027, 0x6210, 0x653F, 0x6574, 0x661F, 0x6674, 0x68F2,
+ 0x6816, 0x6B63, 0x6E05, 0x7272, 0x751F, 0x76DB, 0x7CBE, 0x8056,
+ 0x58F0, 0x88FD, 0x897F, 0x8AA0, 0x8A93, 0x8ACB, 0x901D, 0x9192,
+ 0x9752, 0x9759, 0x6589, 0x7A0E, 0x8106, 0x96BB, 0x5E2D, 0x60DC,
+ 0x621A, 0x65A5, 0x6614, 0x6790, 0x77F3, 0x7A4D, 0x7C4D, 0x7E3E,
+ 0x810A, 0x8CAC, 0x8D64, 0x8DE1, 0x8E5F, 0x78A9, 0x5207, 0x62D9,
+ 0x63A5, 0x6442, 0x6298, 0x8A2D, 0x7A83, 0x7BC0, 0x8AAC, 0x96EA,
+ 0x7D76, 0x820C, 0x8749, 0x4ED9, 0x5148, 0x5343, 0x5360, 0x5BA3,
+ 0x5C02, 0x5C16, 0x5DDD, 0x6226, 0x6247, 0x64B0, 0x6813, 0x6834,
+ 0x6CC9, 0x6D45, 0x6D17, 0x67D3, 0x6F5C, 0x714E, 0x717D, 0x65CB,
+ 0x7A7F, 0x7BAD, 0x7DDA, 0x7E4A, 0x7FA8, 0x817A, 0x821B, 0x8239,
+ 0x85A6, 0x8A6E, 0x8CCE, 0x8DF5, 0x9078, 0x9077, 0x92AD, 0x9291,
+ 0x9583, 0x9BAE, 0x524D, 0x5584, 0x6F38, 0x7136, 0x5168, 0x7985,
+ 0x7E55, 0x81B3, 0x7CCE, 0x564C, 0x5851, 0x5CA8, 0x63AA, 0x66FE,
+ 0x66FD, 0x695A, 0x72D9, 0x758F, 0x758E, 0x790E, 0x7956, 0x79DF,
+ 0x7C97, 0x7D20, 0x7D44, 0x8607, 0x8A34, 0x963B, 0x9061, 0x9F20,
+ 0x50E7, 0x5275, 0x53CC, 0x53E2, 0x5009, 0x55AA, 0x58EE, 0x594F,
+ 0x723D, 0x5B8B, 0x5C64, 0x531D, 0x60E3, 0x60F3, 0x635C, 0x6383,
+ 0x633F, 0x63BB, 0x64CD, 0x65E9, 0x66F9, 0x5DE3, 0x69CD, 0x69FD,
+ 0x6F15, 0x71E5, 0x4E89, 0x75E9, 0x76F8, 0x7A93, 0x7CDF, 0x7DCF,
+ 0x7D9C, 0x8061, 0x8349, 0x8358, 0x846C, 0x84BC, 0x85FB, 0x88C5,
+ 0x8D70, 0x9001, 0x906D, 0x9397, 0x971C, 0x9A12, 0x50CF, 0x5897,
+ 0x618E, 0x81D3, 0x8535, 0x8D08, 0x9020, 0x4FC3, 0x5074, 0x5247,
+ 0x5373, 0x606F, 0x6349, 0x675F, 0x6E2C, 0x8DB3, 0x901F, 0x4FD7,
+ 0x5C5E, 0x8CCA, 0x65CF, 0x7D9A, 0x5352, 0x8896, 0x5176, 0x63C3,
+ 0x5B58, 0x5B6B, 0x5C0A, 0x640D, 0x6751, 0x905C, 0x4ED6, 0x591A,
+ 0x592A, 0x6C70, 0x8A51, 0x553E, 0x5815, 0x59A5, 0x60F0, 0x6253,
+ 0x67C1, 0x8235, 0x6955, 0x9640, 0x99C4, 0x9A28, 0x4F53, 0x5806,
+ 0x5BFE, 0x8010, 0x5CB1, 0x5E2F, 0x5F85, 0x6020, 0x614B, 0x6234,
+ 0x66FF, 0x6CF0, 0x6EDE, 0x80CE, 0x817F, 0x82D4, 0x888B, 0x8CB8,
+ 0x9000, 0x902E, 0x968A, 0x9EDB, 0x9BDB, 0x4EE3, 0x53F0, 0x5927,
+ 0x7B2C, 0x918D, 0x984C, 0x9DF9, 0x6EDD, 0x7027, 0x5353, 0x5544,
+ 0x5B85, 0x6258, 0x629E, 0x62D3, 0x6CA2, 0x6FEF, 0x7422, 0x8A17,
+ 0x9438, 0x6FC1, 0x8AFE, 0x8338, 0x51E7, 0x86F8, 0x53EA, 0x53E9,
+ 0x4F46, 0x9054, 0x8FB0, 0x596A, 0x8131, 0x5DFD, 0x7AEA, 0x8FBF,
+ 0x68DA, 0x8C37, 0x72F8, 0x9C48, 0x6A3D, 0x8AB0, 0x4E39, 0x5358,
+ 0x5606, 0x5766, 0x62C5, 0x63A2, 0x65E6, 0x6B4E, 0x6DE1, 0x6E5B,
+ 0x70AD, 0x77ED, 0x7AEF, 0x7BAA, 0x7DBB, 0x803D, 0x80C6, 0x86CB,
+ 0x8A95, 0x935B, 0x56E3, 0x58C7, 0x5F3E, 0x65AD, 0x6696, 0x6A80,
+ 0x6BB5, 0x7537, 0x8AC7, 0x5024, 0x77E5, 0x5730, 0x5F1B, 0x6065,
+ 0x667A, 0x6C60, 0x75F4, 0x7A1A, 0x7F6E, 0x81F4, 0x8718, 0x9045,
+ 0x99B3, 0x7BC9, 0x755C, 0x7AF9, 0x7B51, 0x84C4, 0x9010, 0x79E9,
+ 0x7A92, 0x8336, 0x5AE1, 0x7740, 0x4E2D, 0x4EF2, 0x5B99, 0x5FE0,
+ 0x62BD, 0x663C, 0x67F1, 0x6CE8, 0x866B, 0x8877, 0x8A3B, 0x914E,
+ 0x92F3, 0x99D0, 0x6A17, 0x7026, 0x732A, 0x82E7, 0x8457, 0x8CAF,
+ 0x4E01, 0x5146, 0x51CB, 0x558B, 0x5BF5, 0x5E16, 0x5E33, 0x5E81,
+ 0x5F14, 0x5F35, 0x5F6B, 0x5FB4, 0x61F2, 0x6311, 0x66A2, 0x671D,
+ 0x6F6E, 0x7252, 0x753A, 0x773A, 0x8074, 0x8139, 0x8178, 0x8776,
+ 0x8ABF, 0x8ADC, 0x8D85, 0x8DF3, 0x929A, 0x9577, 0x9802, 0x9CE5,
+ 0x52C5, 0x6357, 0x76F4, 0x6715, 0x6C88, 0x73CD, 0x8CC3, 0x93AE,
+ 0x9673, 0x6D25, 0x589C, 0x690E, 0x69CC, 0x8FFD, 0x939A, 0x75DB,
+ 0x901A, 0x585A, 0x6802, 0x63B4, 0x69FB, 0x4F43, 0x6F2C, 0x67D8,
+ 0x8FBB, 0x8526, 0x7DB4, 0x9354, 0x693F, 0x6F70, 0x576A, 0x58F7,
+ 0x5B2C, 0x7D2C, 0x722A, 0x540A, 0x91E3, 0x9DB4, 0x4EAD, 0x4F4E,
+ 0x505C, 0x5075, 0x5243, 0x8C9E, 0x5448, 0x5824, 0x5B9A, 0x5E1D,
+ 0x5E95, 0x5EAD, 0x5EF7, 0x5F1F, 0x608C, 0x62B5, 0x633A, 0x63D0,
+ 0x68AF, 0x6C40, 0x7887, 0x798E, 0x7A0B, 0x7DE0, 0x8247, 0x8A02,
+ 0x8AE6, 0x8E44, 0x9013, 0x90B8, 0x912D, 0x91D8, 0x9F0E, 0x6CE5,
+ 0x6458, 0x64E2, 0x6575, 0x6EF4, 0x7684, 0x7B1B, 0x9069, 0x93D1,
+ 0x6EBA, 0x54F2, 0x5FB9, 0x64A4, 0x8F4D, 0x8FED, 0x9244, 0x5178,
+ 0x586B, 0x5929, 0x5C55, 0x5E97, 0x6DFB, 0x7E8F, 0x751C, 0x8CBC,
+ 0x8EE2, 0x985B, 0x70B9, 0x4F1D, 0x6BBF, 0x6FB1, 0x7530, 0x96FB,
+ 0x514E, 0x5410, 0x5835, 0x5857, 0x59AC, 0x5C60, 0x5F92, 0x6597,
+ 0x675C, 0x6E21, 0x767B, 0x83DF, 0x8CED, 0x9014, 0x90FD, 0x934D,
+ 0x7825, 0x783A, 0x52AA, 0x5EA6, 0x571F, 0x5974, 0x6012, 0x5012,
+ 0x515A, 0x51AC, 0x51CD, 0x5200, 0x5510, 0x5854, 0x5858, 0x5957,
+ 0x5B95, 0x5CF6, 0x5D8B, 0x60BC, 0x6295, 0x642D, 0x6771, 0x6843,
+ 0x68BC, 0x68DF, 0x76D7, 0x6DD8, 0x6E6F, 0x6D9B, 0x706F, 0x71C8,
+ 0x5F53, 0x75D8, 0x7977, 0x7B49, 0x7B54, 0x7B52, 0x7CD6, 0x7D71,
+ 0x5230, 0x8463, 0x8569, 0x85E4, 0x8A0E, 0x8B04, 0x8C46, 0x8E0F,
+ 0x9003, 0x900F, 0x9419, 0x9676, 0x982D, 0x9A30, 0x95D8, 0x50CD,
+ 0x52D5, 0x540C, 0x5802, 0x5C0E, 0x61A7, 0x649E, 0x6D1E, 0x77B3,
+ 0x7AE5, 0x80F4, 0x8404, 0x9053, 0x9285, 0x5CE0, 0x9D07, 0x533F,
+ 0x5F97, 0x5FB3, 0x6D9C, 0x7279, 0x7763, 0x79BF, 0x7BE4, 0x6BD2,
+ 0x72EC, 0x8AAD, 0x6803, 0x6A61, 0x51F8, 0x7A81, 0x6934, 0x5C4A,
+ 0x9CF6, 0x82EB, 0x5BC5, 0x9149, 0x701E, 0x5678, 0x5C6F, 0x60C7,
+ 0x6566, 0x6C8C, 0x8C5A, 0x9041, 0x9813, 0x5451, 0x66C7, 0x920D,
+ 0x5948, 0x90A3, 0x5185, 0x4E4D, 0x51EA, 0x8599, 0x8B0E, 0x7058,
+ 0x637A, 0x934B, 0x6962, 0x99B4, 0x7E04, 0x7577, 0x5357, 0x6960,
+ 0x8EDF, 0x96E3, 0x6C5D, 0x4E8C, 0x5C3C, 0x5F10, 0x8FE9, 0x5302,
+ 0x8CD1, 0x8089, 0x8679, 0x5EFF, 0x65E5, 0x4E73, 0x5165, 0x5982,
+ 0x5C3F, 0x97EE, 0x4EFB, 0x598A, 0x5FCD, 0x8A8D, 0x6FE1, 0x79B0,
+ 0x7962, 0x5BE7, 0x8471, 0x732B, 0x71B1, 0x5E74, 0x5FF5, 0x637B,
+ 0x649A, 0x71C3, 0x7C98, 0x4E43, 0x5EFC, 0x4E4B, 0x57DC, 0x56A2,
+ 0x60A9, 0x6FC3, 0x7D0D, 0x80FD, 0x8133, 0x81BF, 0x8FB2, 0x8997,
+ 0x86A4, 0x5DF4, 0x628A, 0x64AD, 0x8987, 0x6777, 0x6CE2, 0x6D3E,
+ 0x7436, 0x7834, 0x5A46, 0x7F75, 0x82AD, 0x99AC, 0x4FF3, 0x5EC3,
+ 0x62DD, 0x6392, 0x6557, 0x676F, 0x76C3, 0x724C, 0x80CC, 0x80BA,
+ 0x8F29, 0x914D, 0x500D, 0x57F9, 0x5A92, 0x6885, 0x6973, 0x7164,
+ 0x72FD, 0x8CB7, 0x58F2, 0x8CE0, 0x966A, 0x9019, 0x877F, 0x79E4,
+ 0x77E7, 0x8429, 0x4F2F, 0x5265, 0x535A, 0x62CD, 0x67CF, 0x6CCA,
+ 0x767D, 0x7B94, 0x7C95, 0x8236, 0x8584, 0x8FEB, 0x66DD, 0x6F20,
+ 0x7206, 0x7E1B, 0x83AB, 0x99C1, 0x9EA6, 0x51FD, 0x7BB1, 0x7872,
+ 0x7BB8, 0x8087, 0x7B48, 0x6AE8, 0x5E61, 0x808C, 0x7551, 0x7560,
+ 0x516B, 0x9262, 0x6E8C, 0x767A, 0x9197, 0x9AEA, 0x4F10, 0x7F70,
+ 0x629C, 0x7B4F, 0x95A5, 0x9CE9, 0x567A, 0x5859, 0x86E4, 0x96BC,
+ 0x4F34, 0x5224, 0x534A, 0x53CD, 0x53DB, 0x5E06, 0x642C, 0x6591,
+ 0x677F, 0x6C3E, 0x6C4E, 0x7248, 0x72AF, 0x73ED, 0x7554, 0x7E41,
+ 0x822C, 0x85E9, 0x8CA9, 0x7BC4, 0x91C6, 0x7169, 0x9812, 0x98EF,
+ 0x633D, 0x6669, 0x756A, 0x76E4, 0x78D0, 0x8543, 0x86EE, 0x532A,
+ 0x5351, 0x5426, 0x5983, 0x5E87, 0x5F7C, 0x60B2, 0x6249, 0x6279,
+ 0x62AB, 0x6590, 0x6BD4, 0x6CCC, 0x75B2, 0x76AE, 0x7891, 0x79D8,
+ 0x7DCB, 0x7F77, 0x80A5, 0x88AB, 0x8AB9, 0x8CBB, 0x907F, 0x975E,
+ 0x98DB, 0x6A0B, 0x7C38, 0x5099, 0x5C3E, 0x5FAE, 0x6787, 0x6BD8,
+ 0x7435, 0x7709, 0x7F8E, 0x9F3B, 0x67CA, 0x7A17, 0x5339, 0x758B,
+ 0x9AED, 0x5F66, 0x819D, 0x83F1, 0x8098, 0x5F3C, 0x5FC5, 0x7562,
+ 0x7B46, 0x903C, 0x6867, 0x59EB, 0x5A9B, 0x7D10, 0x767E, 0x8B2C,
+ 0x4FF5, 0x5F6A, 0x6A19, 0x6C37, 0x6F02, 0x74E2, 0x7968, 0x8868,
+ 0x8A55, 0x8C79, 0x5EDF, 0x63CF, 0x75C5, 0x79D2, 0x82D7, 0x9328,
+ 0x92F2, 0x849C, 0x86ED, 0x9C2D, 0x54C1, 0x5F6C, 0x658C, 0x6D5C,
+ 0x7015, 0x8CA7, 0x8CD3, 0x983B, 0x654F, 0x74F6, 0x4E0D, 0x4ED8,
+ 0x57E0, 0x592B, 0x5A66, 0x5BCC, 0x51A8, 0x5E03, 0x5E9C, 0x6016,
+ 0x6276, 0x6577, 0x65A7, 0x666E, 0x6D6E, 0x7236, 0x7B26, 0x8150,
+ 0x819A, 0x8299, 0x8B5C, 0x8CA0, 0x8CE6, 0x8D74, 0x961C, 0x9644,
+ 0x4FAE, 0x64AB, 0x6B66, 0x821E, 0x8461, 0x856A, 0x90E8, 0x5C01,
+ 0x6953, 0x98A8, 0x847A, 0x8557, 0x4F0F, 0x526F, 0x5FA9, 0x5E45,
+ 0x670D, 0x798F, 0x8179, 0x8907, 0x8986, 0x6DF5, 0x5F17, 0x6255,
+ 0x6CB8, 0x4ECF, 0x7269, 0x9B92, 0x5206, 0x543B, 0x5674, 0x58B3,
+ 0x61A4, 0x626E, 0x711A, 0x596E, 0x7C89, 0x7CDE, 0x7D1B, 0x96F0,
+ 0x6587, 0x805E, 0x4E19, 0x4F75, 0x5175, 0x5840, 0x5E63, 0x5E73,
+ 0x5F0A, 0x67C4, 0x4E26, 0x853D, 0x9589, 0x965B, 0x7C73, 0x9801,
+ 0x50FB, 0x58C1, 0x7656, 0x78A7, 0x5225, 0x77A5, 0x8511, 0x7B86,
+ 0x504F, 0x5909, 0x7247, 0x7BC7, 0x7DE8, 0x8FBA, 0x8FD4, 0x904D,
+ 0x4FBF, 0x52C9, 0x5A29, 0x5F01, 0x97AD, 0x4FDD, 0x8217, 0x92EA,
+ 0x5703, 0x6355, 0x6B69, 0x752B, 0x88DC, 0x8F14, 0x7A42, 0x52DF,
+ 0x5893, 0x6155, 0x620A, 0x66AE, 0x6BCD, 0x7C3F, 0x83E9, 0x5023,
+ 0x4FF8, 0x5305, 0x5446, 0x5831, 0x5949, 0x5B9D, 0x5CF0, 0x5CEF,
+ 0x5D29, 0x5E96, 0x62B1, 0x6367, 0x653E, 0x65B9, 0x670B, 0x6CD5,
+ 0x6CE1, 0x70F9, 0x7832, 0x7E2B, 0x80DE, 0x82B3, 0x840C, 0x84EC,
+ 0x8702, 0x8912, 0x8A2A, 0x8C4A, 0x90A6, 0x92D2, 0x98FD, 0x9CF3,
+ 0x9D6C, 0x4E4F, 0x4EA1, 0x508D, 0x5256, 0x574A, 0x59A8, 0x5E3D,
+ 0x5FD8, 0x5FD9, 0x623F, 0x66B4, 0x671B, 0x67D0, 0x68D2, 0x5192,
+ 0x7D21, 0x80AA, 0x81A8, 0x8B00, 0x8C8C, 0x8CBF, 0x927E, 0x9632,
+ 0x5420, 0x982C, 0x5317, 0x50D5, 0x535C, 0x58A8, 0x64B2, 0x6734,
+ 0x7267, 0x7766, 0x7A46, 0x91E6, 0x52C3, 0x6CA1, 0x6B86, 0x5800,
+ 0x5E4C, 0x5954, 0x672C, 0x7FFB, 0x51E1, 0x76C6, 0x6469, 0x78E8,
+ 0x9B54, 0x9EBB, 0x57CB, 0x59B9, 0x6627, 0x679A, 0x6BCE, 0x54E9,
+ 0x69D9, 0x5E55, 0x819C, 0x6795, 0x9BAA, 0x67FE, 0x9C52, 0x685D,
+ 0x4EA6, 0x4FE3, 0x53C8, 0x62B9, 0x672B, 0x6CAB, 0x8FC4, 0x4FAD,
+ 0x7E6D, 0x9EBF, 0x4E07, 0x6162, 0x6E80, 0x6F2B, 0x8513, 0x5473,
+ 0x672A, 0x9B45, 0x5DF3, 0x7B95, 0x5CAC, 0x5BC6, 0x871C, 0x6E4A,
+ 0x84D1, 0x7A14, 0x8108, 0x5999, 0x7C8D, 0x6C11, 0x7720, 0x52D9,
+ 0x5922, 0x7121, 0x725F, 0x77DB, 0x9727, 0x9D61, 0x690B, 0x5A7F,
+ 0x5A18, 0x51A5, 0x540D, 0x547D, 0x660E, 0x76DF, 0x8FF7, 0x9298,
+ 0x9CF4, 0x59EA, 0x725D, 0x6EC5, 0x514D, 0x68C9, 0x7DBF, 0x7DEC,
+ 0x9762, 0x9EBA, 0x6478, 0x6A21, 0x8302, 0x5984, 0x5B5F, 0x6BDB,
+ 0x731B, 0x76F2, 0x7DB2, 0x8017, 0x8499, 0x5132, 0x6728, 0x9ED9,
+ 0x76EE, 0x6762, 0x52FF, 0x9905, 0x5C24, 0x623B, 0x7C7E, 0x8CB0,
+ 0x554F, 0x60B6, 0x7D0B, 0x9580, 0x5301, 0x4E5F, 0x51B6, 0x591C,
+ 0x723A, 0x8036, 0x91CE, 0x5F25, 0x77E2, 0x5384, 0x5F79, 0x7D04,
+ 0x85AC, 0x8A33, 0x8E8D, 0x9756, 0x67F3, 0x85AE, 0x9453, 0x6109,
+ 0x6108, 0x6CB9, 0x7652, 0x8AED, 0x8F38, 0x552F, 0x4F51, 0x512A,
+ 0x52C7, 0x53CB, 0x5BA5, 0x5E7D, 0x60A0, 0x6182, 0x63D6, 0x6709,
+ 0x67DA, 0x6E67, 0x6D8C, 0x7336, 0x7337, 0x7531, 0x7950, 0x88D5,
+ 0x8A98, 0x904A, 0x9091, 0x90F5, 0x96C4, 0x878D, 0x5915, 0x4E88,
+ 0x4F59, 0x4E0E, 0x8A89, 0x8F3F, 0x9810, 0x50AD, 0x5E7C, 0x5996,
+ 0x5BB9, 0x5EB8, 0x63DA, 0x63FA, 0x64C1, 0x66DC, 0x694A, 0x69D8,
+ 0x6D0B, 0x6EB6, 0x7194, 0x7528, 0x7AAF, 0x7F8A, 0x8000, 0x8449,
+ 0x84C9, 0x8981, 0x8B21, 0x8E0A, 0x9065, 0x967D, 0x990A, 0x617E,
+ 0x6291, 0x6B32, 0x6C83, 0x6D74, 0x7FCC, 0x7FFC, 0x6DC0, 0x7F85,
+ 0x87BA, 0x88F8, 0x6765, 0x83B1, 0x983C, 0x96F7, 0x6D1B, 0x7D61,
+ 0x843D, 0x916A, 0x4E71, 0x5375, 0x5D50, 0x6B04, 0x6FEB, 0x85CD,
+ 0x862D, 0x89A7, 0x5229, 0x540F, 0x5C65, 0x674E, 0x68A8, 0x7406,
+ 0x7483, 0x75E2, 0x88CF, 0x88E1, 0x91CC, 0x96E2, 0x9678, 0x5F8B,
+ 0x7387, 0x7ACB, 0x844E, 0x63A0, 0x7565, 0x5289, 0x6D41, 0x6E9C,
+ 0x7409, 0x7559, 0x786B, 0x7C92, 0x9686, 0x7ADC, 0x9F8D, 0x4FB6,
+ 0x616E, 0x65C5, 0x865C, 0x4E86, 0x4EAE, 0x50DA, 0x4E21, 0x51CC,
+ 0x5BEE, 0x6599, 0x6881, 0x6DBC, 0x731F, 0x7642, 0x77AD, 0x7A1C,
+ 0x7CE7, 0x826F, 0x8AD2, 0x907C, 0x91CF, 0x9675, 0x9818, 0x529B,
+ 0x7DD1, 0x502B, 0x5398, 0x6797, 0x6DCB, 0x71D0, 0x7433, 0x81E8,
+ 0x8F2A, 0x96A3, 0x9C57, 0x9E9F, 0x7460, 0x5841, 0x6D99, 0x7D2F,
+ 0x985E, 0x4EE4, 0x4F36, 0x4F8B, 0x51B7, 0x52B1, 0x5DBA, 0x601C,
+ 0x73B2, 0x793C, 0x82D3, 0x9234, 0x96B7, 0x96F6, 0x970A, 0x9E97,
+ 0x9F62, 0x66A6, 0x6B74, 0x5217, 0x52A3, 0x70C8, 0x88C2, 0x5EC9,
+ 0x604B, 0x6190, 0x6F23, 0x7149, 0x7C3E, 0x7DF4, 0x806F, 0x84EE,
+ 0x9023, 0x932C, 0x5442, 0x9B6F, 0x6AD3, 0x7089, 0x8CC2, 0x8DEF,
+ 0x9732, 0x52B4, 0x5A41, 0x5ECA, 0x5F04, 0x6717, 0x697C, 0x6994,
+ 0x6D6A, 0x6F0F, 0x7262, 0x72FC, 0x7BED, 0x8001, 0x807E, 0x874B,
+ 0x90CE, 0x516D, 0x9E93, 0x7984, 0x808B, 0x9332, 0x8AD6, 0x502D,
+ 0x548C, 0x8A71, 0x6B6A, 0x8CC4, 0x8107, 0x60D1, 0x67A0, 0x9DF2,
+ 0x4E99, 0x4E98, 0x9C10, 0x8A6B, 0x85C1, 0x8568, 0x6900, 0x6E7E,
+ 0x7897, 0x8155, 0x5F0C, 0x4E10, 0x4E15, 0x4E2A, 0x4E31, 0x4E36,
+ 0x4E3C, 0x4E3F, 0x4E42, 0x4E56, 0x4E58, 0x4E82, 0x4E85, 0x8C6B,
+ 0x4E8A, 0x8212, 0x5F0D, 0x4E8E, 0x4E9E, 0x4E9F, 0x4EA0, 0x4EA2,
+ 0x4EB0, 0x4EB3, 0x4EB6, 0x4ECE, 0x4ECD, 0x4EC4, 0x4EC6, 0x4EC2,
+ 0x4ED7, 0x4EDE, 0x4EED, 0x4EDF, 0x4EF7, 0x4F09, 0x4F5A, 0x4F30,
+ 0x4F5B, 0x4F5D, 0x4F57, 0x4F47, 0x4F76, 0x4F88, 0x4F8F, 0x4F98,
+ 0x4F7B, 0x4F69, 0x4F70, 0x4F91, 0x4F6F, 0x4F86, 0x4F96, 0x5118,
+ 0x4FD4, 0x4FDF, 0x4FCE, 0x4FD8, 0x4FDB, 0x4FD1, 0x4FDA, 0x4FD0,
+ 0x4FE4, 0x4FE5, 0x501A, 0x5028, 0x5014, 0x502A, 0x5025, 0x5005,
+ 0x4F1C, 0x4FF6, 0x5021, 0x5029, 0x502C, 0x4FFE, 0x4FEF, 0x5011,
+ 0x5006, 0x5043, 0x5047, 0x6703, 0x5055, 0x5050, 0x5048, 0x505A,
+ 0x5056, 0x506C, 0x5078, 0x5080, 0x509A, 0x5085, 0x50B4, 0x50B2,
+ 0x50C9, 0x50CA, 0x50B3, 0x50C2, 0x50D6, 0x50DE, 0x50E5, 0x50ED,
+ 0x50E3, 0x50EE, 0x50F9, 0x50F5, 0x5109, 0x5101, 0x5102, 0x5116,
+ 0x5115, 0x5114, 0x511A, 0x5121, 0x513A, 0x5137, 0x513C, 0x513B,
+ 0x513F, 0x5140, 0x5152, 0x514C, 0x5154, 0x5162, 0x7AF8, 0x5169,
+ 0x516A, 0x516E, 0x5180, 0x5182, 0x56D8, 0x518C, 0x5189, 0x518F,
+ 0x5191, 0x5193, 0x5195, 0x5196, 0x51A4, 0x51A6, 0x51A2, 0x51A9,
+ 0x51AA, 0x51AB, 0x51B3, 0x51B1, 0x51B2, 0x51B0, 0x51B5, 0x51BD,
+ 0x51C5, 0x51C9, 0x51DB, 0x51E0, 0x8655, 0x51E9, 0x51ED, 0x51F0,
+ 0x51F5, 0x51FE, 0x5204, 0x520B, 0x5214, 0x520E, 0x5227, 0x522A,
+ 0x522E, 0x5233, 0x5239, 0x524F, 0x5244, 0x524B, 0x524C, 0x525E,
+ 0x5254, 0x526A, 0x5274, 0x5269, 0x5273, 0x527F, 0x527D, 0x528D,
+ 0x5294, 0x5292, 0x5271, 0x5288, 0x5291, 0x8FA8, 0x8FA7, 0x52AC,
+ 0x52AD, 0x52BC, 0x52B5, 0x52C1, 0x52CD, 0x52D7, 0x52DE, 0x52E3,
+ 0x52E6, 0x98ED, 0x52E0, 0x52F3, 0x52F5, 0x52F8, 0x52F9, 0x5306,
+ 0x5308, 0x7538, 0x530D, 0x5310, 0x530F, 0x5315, 0x531A, 0x5323,
+ 0x532F, 0x5331, 0x5333, 0x5338, 0x5340, 0x5346, 0x5345, 0x4E17,
+ 0x5349, 0x534D, 0x51D6, 0x535E, 0x5369, 0x536E, 0x5918, 0x537B,
+ 0x5377, 0x5382, 0x5396, 0x53A0, 0x53A6, 0x53A5, 0x53AE, 0x53B0,
+ 0x53B6, 0x53C3, 0x7C12, 0x96D9, 0x53DF, 0x66FC, 0x71EE, 0x53EE,
+ 0x53E8, 0x53ED, 0x53FA, 0x5401, 0x543D, 0x5440, 0x542C, 0x542D,
+ 0x543C, 0x542E, 0x5436, 0x5429, 0x541D, 0x544E, 0x548F, 0x5475,
+ 0x548E, 0x545F, 0x5471, 0x5477, 0x5470, 0x5492, 0x547B, 0x5480,
+ 0x5476, 0x5484, 0x5490, 0x5486, 0x54C7, 0x54A2, 0x54B8, 0x54A5,
+ 0x54AC, 0x54C4, 0x54C8, 0x54A8, 0x54AB, 0x54C2, 0x54A4, 0x54BE,
+ 0x54BC, 0x54D8, 0x54E5, 0x54E6, 0x550F, 0x5514, 0x54FD, 0x54EE,
+ 0x54ED, 0x54FA, 0x54E2, 0x5539, 0x5540, 0x5563, 0x554C, 0x552E,
+ 0x555C, 0x5545, 0x5556, 0x5557, 0x5538, 0x5533, 0x555D, 0x5599,
+ 0x5580, 0x54AF, 0x558A, 0x559F, 0x557B, 0x557E, 0x5598, 0x559E,
+ 0x55AE, 0x557C, 0x5583, 0x55A9, 0x5587, 0x55A8, 0x55DA, 0x55C5,
+ 0x55DF, 0x55C4, 0x55DC, 0x55E4, 0x55D4, 0x5614, 0x55F7, 0x5616,
+ 0x55FE, 0x55FD, 0x561B, 0x55F9, 0x564E, 0x5650, 0x71DF, 0x5634,
+ 0x5636, 0x5632, 0x5638, 0x566B, 0x5664, 0x562F, 0x566C, 0x566A,
+ 0x5686, 0x5680, 0x568A, 0x56A0, 0x5694, 0x568F, 0x56A5, 0x56AE,
+ 0x56B6, 0x56B4, 0x56C2, 0x56BC, 0x56C1, 0x56C3, 0x56C0, 0x56C8,
+ 0x56CE, 0x56D1, 0x56D3, 0x56D7, 0x56EE, 0x56F9, 0x5700, 0x56FF,
+ 0x5704, 0x5709, 0x5708, 0x570B, 0x570D, 0x5713, 0x5718, 0x5716,
+ 0x55C7, 0x571C, 0x5726, 0x5737, 0x5738, 0x574E, 0x573B, 0x5740,
+ 0x574F, 0x5769, 0x57C0, 0x5788, 0x5761, 0x577F, 0x5789, 0x5793,
+ 0x57A0, 0x57B3, 0x57A4, 0x57AA, 0x57B0, 0x57C3, 0x57C6, 0x57D4,
+ 0x57D2, 0x57D3, 0x580A, 0x57D6, 0x57E3, 0x580B, 0x5819, 0x581D,
+ 0x5872, 0x5821, 0x5862, 0x584B, 0x5870, 0x6BC0, 0x5852, 0x583D,
+ 0x5879, 0x5885, 0x58B9, 0x589F, 0x58AB, 0x58BA, 0x58DE, 0x58BB,
+ 0x58B8, 0x58AE, 0x58C5, 0x58D3, 0x58D1, 0x58D7, 0x58D9, 0x58D8,
+ 0x58E5, 0x58DC, 0x58E4, 0x58DF, 0x58EF, 0x58FA, 0x58F9, 0x58FB,
+ 0x58FC, 0x58FD, 0x5902, 0x590A, 0x5910, 0x591B, 0x68A6, 0x5925,
+ 0x592C, 0x592D, 0x5932, 0x5938, 0x593E, 0x7AD2, 0x5955, 0x5950,
+ 0x594E, 0x595A, 0x5958, 0x5962, 0x5960, 0x5967, 0x596C, 0x5969,
+ 0x5978, 0x5981, 0x599D, 0x4F5E, 0x4FAB, 0x59A3, 0x59B2, 0x59C6,
+ 0x59E8, 0x59DC, 0x598D, 0x59D9, 0x59DA, 0x5A25, 0x5A1F, 0x5A11,
+ 0x5A1C, 0x5A09, 0x5A1A, 0x5A40, 0x5A6C, 0x5A49, 0x5A35, 0x5A36,
+ 0x5A62, 0x5A6A, 0x5A9A, 0x5ABC, 0x5ABE, 0x5ACB, 0x5AC2, 0x5ABD,
+ 0x5AE3, 0x5AD7, 0x5AE6, 0x5AE9, 0x5AD6, 0x5AFA, 0x5AFB, 0x5B0C,
+ 0x5B0B, 0x5B16, 0x5B32, 0x5AD0, 0x5B2A, 0x5B36, 0x5B3E, 0x5B43,
+ 0x5B45, 0x5B40, 0x5B51, 0x5B55, 0x5B5A, 0x5B5B, 0x5B65, 0x5B69,
+ 0x5B70, 0x5B73, 0x5B75, 0x5B78, 0x6588, 0x5B7A, 0x5B80, 0x5B83,
+ 0x5BA6, 0x5BB8, 0x5BC3, 0x5BC7, 0x5BC9, 0x5BD4, 0x5BD0, 0x5BE4,
+ 0x5BE6, 0x5BE2, 0x5BDE, 0x5BE5, 0x5BEB, 0x5BF0, 0x5BF6, 0x5BF3,
+ 0x5C05, 0x5C07, 0x5C08, 0x5C0D, 0x5C13, 0x5C20, 0x5C22, 0x5C28,
+ 0x5C38, 0x5C39, 0x5C41, 0x5C46, 0x5C4E, 0x5C53, 0x5C50, 0x5C4F,
+ 0x5B71, 0x5C6C, 0x5C6E, 0x4E62, 0x5C76, 0x5C79, 0x5C8C, 0x5C91,
+ 0x5C94, 0x599B, 0x5CAB, 0x5CBB, 0x5CB6, 0x5CBC, 0x5CB7, 0x5CC5,
+ 0x5CBE, 0x5CC7, 0x5CD9, 0x5CE9, 0x5CFD, 0x5CFA, 0x5CED, 0x5D8C,
+ 0x5CEA, 0x5D0B, 0x5D15, 0x5D17, 0x5D5C, 0x5D1F, 0x5D1B, 0x5D11,
+ 0x5D14, 0x5D22, 0x5D1A, 0x5D19, 0x5D18, 0x5D4C, 0x5D52, 0x5D4E,
+ 0x5D4B, 0x5D6C, 0x5D73, 0x5D76, 0x5D87, 0x5D84, 0x5D82, 0x5DA2,
+ 0x5D9D, 0x5DAC, 0x5DAE, 0x5DBD, 0x5D90, 0x5DB7, 0x5DBC, 0x5DC9,
+ 0x5DCD, 0x5DD3, 0x5DD2, 0x5DD6, 0x5DDB, 0x5DEB, 0x5DF2, 0x5DF5,
+ 0x5E0B, 0x5E1A, 0x5E19, 0x5E11, 0x5E1B, 0x5E36, 0x5E37, 0x5E44,
+ 0x5E43, 0x5E40, 0x5E4E, 0x5E57, 0x5E54, 0x5E5F, 0x5E62, 0x5E64,
+ 0x5E47, 0x5E75, 0x5E76, 0x5E7A, 0x9EBC, 0x5E7F, 0x5EA0, 0x5EC1,
+ 0x5EC2, 0x5EC8, 0x5ED0, 0x5ECF, 0x5ED6, 0x5EE3, 0x5EDD, 0x5EDA,
+ 0x5EDB, 0x5EE2, 0x5EE1, 0x5EE8, 0x5EE9, 0x5EEC, 0x5EF1, 0x5EF3,
+ 0x5EF0, 0x5EF4, 0x5EF8, 0x5EFE, 0x5F03, 0x5F09, 0x5F5D, 0x5F5C,
+ 0x5F0B, 0x5F11, 0x5F16, 0x5F29, 0x5F2D, 0x5F38, 0x5F41, 0x5F48,
+ 0x5F4C, 0x5F4E, 0x5F2F, 0x5F51, 0x5F56, 0x5F57, 0x5F59, 0x5F61,
+ 0x5F6D, 0x5F73, 0x5F77, 0x5F83, 0x5F82, 0x5F7F, 0x5F8A, 0x5F88,
+ 0x5F91, 0x5F87, 0x5F9E, 0x5F99, 0x5F98, 0x5FA0, 0x5FA8, 0x5FAD,
+ 0x5FBC, 0x5FD6, 0x5FFB, 0x5FE4, 0x5FF8, 0x5FF1, 0x5FDD, 0x60B3,
+ 0x5FFF, 0x6021, 0x6060, 0x6019, 0x6010, 0x6029, 0x600E, 0x6031,
+ 0x601B, 0x6015, 0x602B, 0x6026, 0x600F, 0x603A, 0x605A, 0x6041,
+ 0x606A, 0x6077, 0x605F, 0x604A, 0x6046, 0x604D, 0x6063, 0x6043,
+ 0x6064, 0x6042, 0x606C, 0x606B, 0x6059, 0x6081, 0x608D, 0x60E7,
+ 0x6083, 0x609A, 0x6084, 0x609B, 0x6096, 0x6097, 0x6092, 0x60A7,
+ 0x608B, 0x60E1, 0x60B8, 0x60E0, 0x60D3, 0x60B4, 0x5FF0, 0x60BD,
+ 0x60C6, 0x60B5, 0x60D8, 0x614D, 0x6115, 0x6106, 0x60F6, 0x60F7,
+ 0x6100, 0x60F4, 0x60FA, 0x6103, 0x6121, 0x60FB, 0x60F1, 0x610D,
+ 0x610E, 0x6147, 0x613E, 0x6128, 0x6127, 0x614A, 0x613F, 0x613C,
+ 0x612C, 0x6134, 0x613D, 0x6142, 0x6144, 0x6173, 0x6177, 0x6158,
+ 0x6159, 0x615A, 0x616B, 0x6174, 0x616F, 0x6165, 0x6171, 0x615F,
+ 0x615D, 0x6153, 0x6175, 0x6199, 0x6196, 0x6187, 0x61AC, 0x6194,
+ 0x619A, 0x618A, 0x6191, 0x61AB, 0x61AE, 0x61CC, 0x61CA, 0x61C9,
+ 0x61F7, 0x61C8, 0x61C3, 0x61C6, 0x61BA, 0x61CB, 0x7F79, 0x61CD,
+ 0x61E6, 0x61E3, 0x61F6, 0x61FA, 0x61F4, 0x61FF, 0x61FD, 0x61FC,
+ 0x61FE, 0x6200, 0x6208, 0x6209, 0x620D, 0x620C, 0x6214, 0x621B,
+ 0x621E, 0x6221, 0x622A, 0x622E, 0x6230, 0x6232, 0x6233, 0x6241,
+ 0x624E, 0x625E, 0x6263, 0x625B, 0x6260, 0x6268, 0x627C, 0x6282,
+ 0x6289, 0x627E, 0x6292, 0x6293, 0x6296, 0x62D4, 0x6283, 0x6294,
+ 0x62D7, 0x62D1, 0x62BB, 0x62CF, 0x62FF, 0x62C6, 0x64D4, 0x62C8,
+ 0x62DC, 0x62CC, 0x62CA, 0x62C2, 0x62C7, 0x629B, 0x62C9, 0x630C,
+ 0x62EE, 0x62F1, 0x6327, 0x6302, 0x6308, 0x62EF, 0x62F5, 0x6350,
+ 0x633E, 0x634D, 0x641C, 0x634F, 0x6396, 0x638E, 0x6380, 0x63AB,
+ 0x6376, 0x63A3, 0x638F, 0x6389, 0x639F, 0x63B5, 0x636B, 0x6369,
+ 0x63BE, 0x63E9, 0x63C0, 0x63C6, 0x63E3, 0x63C9, 0x63D2, 0x63F6,
+ 0x63C4, 0x6416, 0x6434, 0x6406, 0x6413, 0x6426, 0x6436, 0x651D,
+ 0x6417, 0x6428, 0x640F, 0x6467, 0x646F, 0x6476, 0x644E, 0x652A,
+ 0x6495, 0x6493, 0x64A5, 0x64A9, 0x6488, 0x64BC, 0x64DA, 0x64D2,
+ 0x64C5, 0x64C7, 0x64BB, 0x64D8, 0x64C2, 0x64F1, 0x64E7, 0x8209,
+ 0x64E0, 0x64E1, 0x62AC, 0x64E3, 0x64EF, 0x652C, 0x64F6, 0x64F4,
+ 0x64F2, 0x64FA, 0x6500, 0x64FD, 0x6518, 0x651C, 0x6505, 0x6524,
+ 0x6523, 0x652B, 0x6534, 0x6535, 0x6537, 0x6536, 0x6538, 0x754B,
+ 0x6548, 0x6556, 0x6555, 0x654D, 0x6558, 0x655E, 0x655D, 0x6572,
+ 0x6578, 0x6582, 0x6583, 0x8B8A, 0x659B, 0x659F, 0x65AB, 0x65B7,
+ 0x65C3, 0x65C6, 0x65C1, 0x65C4, 0x65CC, 0x65D2, 0x65DB, 0x65D9,
+ 0x65E0, 0x65E1, 0x65F1, 0x6772, 0x660A, 0x6603, 0x65FB, 0x6773,
+ 0x6635, 0x6636, 0x6634, 0x661C, 0x664F, 0x6644, 0x6649, 0x6641,
+ 0x665E, 0x665D, 0x6664, 0x6667, 0x6668, 0x665F, 0x6662, 0x6670,
+ 0x6683, 0x6688, 0x668E, 0x6689, 0x6684, 0x6698, 0x669D, 0x66C1,
+ 0x66B9, 0x66C9, 0x66BE, 0x66BC, 0x66C4, 0x66B8, 0x66D6, 0x66DA,
+ 0x66E0, 0x663F, 0x66E6, 0x66E9, 0x66F0, 0x66F5, 0x66F7, 0x670F,
+ 0x6716, 0x671E, 0x6726, 0x6727, 0x9738, 0x672E, 0x673F, 0x6736,
+ 0x6741, 0x6738, 0x6737, 0x6746, 0x675E, 0x6760, 0x6759, 0x6763,
+ 0x6764, 0x6789, 0x6770, 0x67A9, 0x677C, 0x676A, 0x678C, 0x678B,
+ 0x67A6, 0x67A1, 0x6785, 0x67B7, 0x67EF, 0x67B4, 0x67EC, 0x67B3,
+ 0x67E9, 0x67B8, 0x67E4, 0x67DE, 0x67DD, 0x67E2, 0x67EE, 0x67B9,
+ 0x67CE, 0x67C6, 0x67E7, 0x6A9C, 0x681E, 0x6846, 0x6829, 0x6840,
+ 0x684D, 0x6832, 0x684E, 0x68B3, 0x682B, 0x6859, 0x6863, 0x6877,
+ 0x687F, 0x689F, 0x688F, 0x68AD, 0x6894, 0x689D, 0x689B, 0x6883,
+ 0x6AAE, 0x68B9, 0x6874, 0x68B5, 0x68A0, 0x68BA, 0x690F, 0x688D,
+ 0x687E, 0x6901, 0x68CA, 0x6908, 0x68D8, 0x6922, 0x6926, 0x68E1,
+ 0x690C, 0x68CD, 0x68D4, 0x68E7, 0x68D5, 0x6936, 0x6912, 0x6904,
+ 0x68D7, 0x68E3, 0x6925, 0x68F9, 0x68E0, 0x68EF, 0x6928, 0x692A,
+ 0x691A, 0x6923, 0x6921, 0x68C6, 0x6979, 0x6977, 0x695C, 0x6978,
+ 0x696B, 0x6954, 0x697E, 0x696E, 0x6939, 0x6974, 0x693D, 0x6959,
+ 0x6930, 0x6961, 0x695E, 0x695D, 0x6981, 0x696A, 0x69B2, 0x69AE,
+ 0x69D0, 0x69BF, 0x69C1, 0x69D3, 0x69BE, 0x69CE, 0x5BE8, 0x69CA,
+ 0x69DD, 0x69BB, 0x69C3, 0x69A7, 0x6A2E, 0x6991, 0x69A0, 0x699C,
+ 0x6995, 0x69B4, 0x69DE, 0x69E8, 0x6A02, 0x6A1B, 0x69FF, 0x6B0A,
+ 0x69F9, 0x69F2, 0x69E7, 0x6A05, 0x69B1, 0x6A1E, 0x69ED, 0x6A14,
+ 0x69EB, 0x6A0A, 0x6A12, 0x6AC1, 0x6A23, 0x6A13, 0x6A44, 0x6A0C,
+ 0x6A72, 0x6A36, 0x6A78, 0x6A47, 0x6A62, 0x6A59, 0x6A66, 0x6A48,
+ 0x6A38, 0x6A22, 0x6A90, 0x6A8D, 0x6AA0, 0x6A84, 0x6AA2, 0x6AA3,
+ 0x6A97, 0x8617, 0x6ABB, 0x6AC3, 0x6AC2, 0x6AB8, 0x6AB3, 0x6AAC,
+ 0x6ADE, 0x6AD1, 0x6ADF, 0x6AAA, 0x6ADA, 0x6AEA, 0x6AFB, 0x6B05,
+ 0x8616, 0x6AFA, 0x6B12, 0x6B16, 0x9B31, 0x6B1F, 0x6B38, 0x6B37,
+ 0x76DC, 0x6B39, 0x98EE, 0x6B47, 0x6B43, 0x6B49, 0x6B50, 0x6B59,
+ 0x6B54, 0x6B5B, 0x6B5F, 0x6B61, 0x6B78, 0x6B79, 0x6B7F, 0x6B80,
+ 0x6B84, 0x6B83, 0x6B8D, 0x6B98, 0x6B95, 0x6B9E, 0x6BA4, 0x6BAA,
+ 0x6BAB, 0x6BAF, 0x6BB2, 0x6BB1, 0x6BB3, 0x6BB7, 0x6BBC, 0x6BC6,
+ 0x6BCB, 0x6BD3, 0x6BDF, 0x6BEC, 0x6BEB, 0x6BF3, 0x6BEF, 0x9EBE,
+ 0x6C08, 0x6C13, 0x6C14, 0x6C1B, 0x6C24, 0x6C23, 0x6C5E, 0x6C55,
+ 0x6C62, 0x6C6A, 0x6C82, 0x6C8D, 0x6C9A, 0x6C81, 0x6C9B, 0x6C7E,
+ 0x6C68, 0x6C73, 0x6C92, 0x6C90, 0x6CC4, 0x6CF1, 0x6CD3, 0x6CBD,
+ 0x6CD7, 0x6CC5, 0x6CDD, 0x6CAE, 0x6CB1, 0x6CBE, 0x6CBA, 0x6CDB,
+ 0x6CEF, 0x6CD9, 0x6CEA, 0x6D1F, 0x884D, 0x6D36, 0x6D2B, 0x6D3D,
+ 0x6D38, 0x6D19, 0x6D35, 0x6D33, 0x6D12, 0x6D0C, 0x6D63, 0x6D93,
+ 0x6D64, 0x6D5A, 0x6D79, 0x6D59, 0x6D8E, 0x6D95, 0x6FE4, 0x6D85,
+ 0x6DF9, 0x6E15, 0x6E0A, 0x6DB5, 0x6DC7, 0x6DE6, 0x6DB8, 0x6DC6,
+ 0x6DEC, 0x6DDE, 0x6DCC, 0x6DE8, 0x6DD2, 0x6DC5, 0x6DFA, 0x6DD9,
+ 0x6DE4, 0x6DD5, 0x6DEA, 0x6DEE, 0x6E2D, 0x6E6E, 0x6E2E, 0x6E19,
+ 0x6E72, 0x6E5F, 0x6E3E, 0x6E23, 0x6E6B, 0x6E2B, 0x6E76, 0x6E4D,
+ 0x6E1F, 0x6E43, 0x6E3A, 0x6E4E, 0x6E24, 0x6EFF, 0x6E1D, 0x6E38,
+ 0x6E82, 0x6EAA, 0x6E98, 0x6EC9, 0x6EB7, 0x6ED3, 0x6EBD, 0x6EAF,
+ 0x6EC4, 0x6EB2, 0x6ED4, 0x6ED5, 0x6E8F, 0x6EA5, 0x6EC2, 0x6E9F,
+ 0x6F41, 0x6F11, 0x704C, 0x6EEC, 0x6EF8, 0x6EFE, 0x6F3F, 0x6EF2,
+ 0x6F31, 0x6EEF, 0x6F32, 0x6ECC, 0x6F3E, 0x6F13, 0x6EF7, 0x6F86,
+ 0x6F7A, 0x6F78, 0x6F81, 0x6F80, 0x6F6F, 0x6F5B, 0x6FF3, 0x6F6D,
+ 0x6F82, 0x6F7C, 0x6F58, 0x6F8E, 0x6F91, 0x6FC2, 0x6F66, 0x6FB3,
+ 0x6FA3, 0x6FA1, 0x6FA4, 0x6FB9, 0x6FC6, 0x6FAA, 0x6FDF, 0x6FD5,
+ 0x6FEC, 0x6FD4, 0x6FD8, 0x6FF1, 0x6FEE, 0x6FDB, 0x7009, 0x700B,
+ 0x6FFA, 0x7011, 0x7001, 0x700F, 0x6FFE, 0x701B, 0x701A, 0x6F74,
+ 0x701D, 0x7018, 0x701F, 0x7030, 0x703E, 0x7032, 0x7051, 0x7063,
+ 0x7099, 0x7092, 0x70AF, 0x70F1, 0x70AC, 0x70B8, 0x70B3, 0x70AE,
+ 0x70DF, 0x70CB, 0x70DD, 0x70D9, 0x7109, 0x70FD, 0x711C, 0x7119,
+ 0x7165, 0x7155, 0x7188, 0x7166, 0x7162, 0x714C, 0x7156, 0x716C,
+ 0x718F, 0x71FB, 0x7184, 0x7195, 0x71A8, 0x71AC, 0x71D7, 0x71B9,
+ 0x71BE, 0x71D2, 0x71C9, 0x71D4, 0x71CE, 0x71E0, 0x71EC, 0x71E7,
+ 0x71F5, 0x71FC, 0x71F9, 0x71FF, 0x720D, 0x7210, 0x721B, 0x7228,
+ 0x722D, 0x722C, 0x7230, 0x7232, 0x723B, 0x723C, 0x723F, 0x7240,
+ 0x7246, 0x724B, 0x7258, 0x7274, 0x727E, 0x7282, 0x7281, 0x7287,
+ 0x7292, 0x7296, 0x72A2, 0x72A7, 0x72B9, 0x72B2, 0x72C3, 0x72C6,
+ 0x72C4, 0x72CE, 0x72D2, 0x72E2, 0x72E0, 0x72E1, 0x72F9, 0x72F7,
+ 0x500F, 0x7317, 0x730A, 0x731C, 0x7316, 0x731D, 0x7334, 0x732F,
+ 0x7329, 0x7325, 0x733E, 0x734E, 0x734F, 0x9ED8, 0x7357, 0x736A,
+ 0x7368, 0x7370, 0x7378, 0x7375, 0x737B, 0x737A, 0x73C8, 0x73B3,
+ 0x73CE, 0x73BB, 0x73C0, 0x73E5, 0x73EE, 0x73DE, 0x74A2, 0x7405,
+ 0x746F, 0x7425, 0x73F8, 0x7432, 0x743A, 0x7455, 0x743F, 0x745F,
+ 0x7459, 0x7441, 0x745C, 0x7469, 0x7470, 0x7463, 0x746A, 0x7476,
+ 0x747E, 0x748B, 0x749E, 0x74A7, 0x74CA, 0x74CF, 0x74D4, 0x73F1,
+ 0x74E0, 0x74E3, 0x74E7, 0x74E9, 0x74EE, 0x74F2, 0x74F0, 0x74F1,
+ 0x74F8, 0x74F7, 0x7504, 0x7503, 0x7505, 0x750C, 0x750E, 0x750D,
+ 0x7515, 0x7513, 0x751E, 0x7526, 0x752C, 0x753C, 0x7544, 0x754D,
+ 0x754A, 0x7549, 0x755B, 0x7546, 0x755A, 0x7569, 0x7564, 0x7567,
+ 0x756B, 0x756D, 0x7578, 0x7576, 0x7586, 0x7587, 0x7574, 0x758A,
+ 0x7589, 0x7582, 0x7594, 0x759A, 0x759D, 0x75A5, 0x75A3, 0x75C2,
+ 0x75B3, 0x75C3, 0x75B5, 0x75BD, 0x75B8, 0x75BC, 0x75B1, 0x75CD,
+ 0x75CA, 0x75D2, 0x75D9, 0x75E3, 0x75DE, 0x75FE, 0x75FF, 0x75FC,
+ 0x7601, 0x75F0, 0x75FA, 0x75F2, 0x75F3, 0x760B, 0x760D, 0x7609,
+ 0x761F, 0x7627, 0x7620, 0x7621, 0x7622, 0x7624, 0x7634, 0x7630,
+ 0x763B, 0x7647, 0x7648, 0x7646, 0x765C, 0x7658, 0x7661, 0x7662,
+ 0x7668, 0x7669, 0x766A, 0x7667, 0x766C, 0x7670, 0x7672, 0x7676,
+ 0x7678, 0x767C, 0x7680, 0x7683, 0x7688, 0x768B, 0x768E, 0x7696,
+ 0x7693, 0x7699, 0x769A, 0x76B0, 0x76B4, 0x76B8, 0x76B9, 0x76BA,
+ 0x76C2, 0x76CD, 0x76D6, 0x76D2, 0x76DE, 0x76E1, 0x76E5, 0x76E7,
+ 0x76EA, 0x862F, 0x76FB, 0x7708, 0x7707, 0x7704, 0x7729, 0x7724,
+ 0x771E, 0x7725, 0x7726, 0x771B, 0x7737, 0x7738, 0x7747, 0x775A,
+ 0x7768, 0x776B, 0x775B, 0x7765, 0x777F, 0x777E, 0x7779, 0x778E,
+ 0x778B, 0x7791, 0x77A0, 0x779E, 0x77B0, 0x77B6, 0x77B9, 0x77BF,
+ 0x77BC, 0x77BD, 0x77BB, 0x77C7, 0x77CD, 0x77D7, 0x77DA, 0x77DC,
+ 0x77E3, 0x77EE, 0x77FC, 0x780C, 0x7812, 0x7926, 0x7820, 0x792A,
+ 0x7845, 0x788E, 0x7874, 0x7886, 0x787C, 0x789A, 0x788C, 0x78A3,
+ 0x78B5, 0x78AA, 0x78AF, 0x78D1, 0x78C6, 0x78CB, 0x78D4, 0x78BE,
+ 0x78BC, 0x78C5, 0x78CA, 0x78EC, 0x78E7, 0x78DA, 0x78FD, 0x78F4,
+ 0x7907, 0x7912, 0x7911, 0x7919, 0x792C, 0x792B, 0x7940, 0x7960,
+ 0x7957, 0x795F, 0x795A, 0x7955, 0x7953, 0x797A, 0x797F, 0x798A,
+ 0x799D, 0x79A7, 0x9F4B, 0x79AA, 0x79AE, 0x79B3, 0x79B9, 0x79BA,
+ 0x79C9, 0x79D5, 0x79E7, 0x79EC, 0x79E1, 0x79E3, 0x7A08, 0x7A0D,
+ 0x7A18, 0x7A19, 0x7A20, 0x7A1F, 0x7980, 0x7A31, 0x7A3B, 0x7A3E,
+ 0x7A37, 0x7A43, 0x7A57, 0x7A49, 0x7A61, 0x7A62, 0x7A69, 0x9F9D,
+ 0x7A70, 0x7A79, 0x7A7D, 0x7A88, 0x7A97, 0x7A95, 0x7A98, 0x7A96,
+ 0x7AA9, 0x7AC8, 0x7AB0, 0x7AB6, 0x7AC5, 0x7AC4, 0x7ABF, 0x9083,
+ 0x7AC7, 0x7ACA, 0x7ACD, 0x7ACF, 0x7AD5, 0x7AD3, 0x7AD9, 0x7ADA,
+ 0x7ADD, 0x7AE1, 0x7AE2, 0x7AE6, 0x7AED, 0x7AF0, 0x7B02, 0x7B0F,
+ 0x7B0A, 0x7B06, 0x7B33, 0x7B18, 0x7B19, 0x7B1E, 0x7B35, 0x7B28,
+ 0x7B36, 0x7B50, 0x7B7A, 0x7B04, 0x7B4D, 0x7B0B, 0x7B4C, 0x7B45,
+ 0x7B75, 0x7B65, 0x7B74, 0x7B67, 0x7B70, 0x7B71, 0x7B6C, 0x7B6E,
+ 0x7B9D, 0x7B98, 0x7B9F, 0x7B8D, 0x7B9C, 0x7B9A, 0x7B8B, 0x7B92,
+ 0x7B8F, 0x7B5D, 0x7B99, 0x7BCB, 0x7BC1, 0x7BCC, 0x7BCF, 0x7BB4,
+ 0x7BC6, 0x7BDD, 0x7BE9, 0x7C11, 0x7C14, 0x7BE6, 0x7BE5, 0x7C60,
+ 0x7C00, 0x7C07, 0x7C13, 0x7BF3, 0x7BF7, 0x7C17, 0x7C0D, 0x7BF6,
+ 0x7C23, 0x7C27, 0x7C2A, 0x7C1F, 0x7C37, 0x7C2B, 0x7C3D, 0x7C4C,
+ 0x7C43, 0x7C54, 0x7C4F, 0x7C40, 0x7C50, 0x7C58, 0x7C5F, 0x7C64,
+ 0x7C56, 0x7C65, 0x7C6C, 0x7C75, 0x7C83, 0x7C90, 0x7CA4, 0x7CAD,
+ 0x7CA2, 0x7CAB, 0x7CA1, 0x7CA8, 0x7CB3, 0x7CB2, 0x7CB1, 0x7CAE,
+ 0x7CB9, 0x7CBD, 0x7CC0, 0x7CC5, 0x7CC2, 0x7CD8, 0x7CD2, 0x7CDC,
+ 0x7CE2, 0x9B3B, 0x7CEF, 0x7CF2, 0x7CF4, 0x7CF6, 0x7CFA, 0x7D06,
+ 0x7D02, 0x7D1C, 0x7D15, 0x7D0A, 0x7D45, 0x7D4B, 0x7D2E, 0x7D32,
+ 0x7D3F, 0x7D35, 0x7D46, 0x7D73, 0x7D56, 0x7D4E, 0x7D72, 0x7D68,
+ 0x7D6E, 0x7D4F, 0x7D63, 0x7D93, 0x7D89, 0x7D5B, 0x7D8F, 0x7D7D,
+ 0x7D9B, 0x7DBA, 0x7DAE, 0x7DA3, 0x7DB5, 0x7DC7, 0x7DBD, 0x7DAB,
+ 0x7E3D, 0x7DA2, 0x7DAF, 0x7DDC, 0x7DB8, 0x7D9F, 0x7DB0, 0x7DD8,
+ 0x7DDD, 0x7DE4, 0x7DDE, 0x7DFB, 0x7DF2, 0x7DE1, 0x7E05, 0x7E0A,
+ 0x7E23, 0x7E21, 0x7E12, 0x7E31, 0x7E1F, 0x7E09, 0x7E0B, 0x7E22,
+ 0x7E46, 0x7E66, 0x7E3B, 0x7E35, 0x7E39, 0x7E43, 0x7E37, 0x7E32,
+ 0x7E3A, 0x7E67, 0x7E5D, 0x7E56, 0x7E5E, 0x7E59, 0x7E5A, 0x7E79,
+ 0x7E6A, 0x7E69, 0x7E7C, 0x7E7B, 0x7E83, 0x7DD5, 0x7E7D, 0x8FAE,
+ 0x7E7F, 0x7E88, 0x7E89, 0x7E8C, 0x7E92, 0x7E90, 0x7E93, 0x7E94,
+ 0x7E96, 0x7E8E, 0x7E9B, 0x7E9C, 0x7F38, 0x7F3A, 0x7F45, 0x7F4C,
+ 0x7F4D, 0x7F4E, 0x7F50, 0x7F51, 0x7F55, 0x7F54, 0x7F58, 0x7F5F,
+ 0x7F60, 0x7F68, 0x7F69, 0x7F67, 0x7F78, 0x7F82, 0x7F86, 0x7F83,
+ 0x7F88, 0x7F87, 0x7F8C, 0x7F94, 0x7F9E, 0x7F9D, 0x7F9A, 0x7FA3,
+ 0x7FAF, 0x7FB2, 0x7FB9, 0x7FAE, 0x7FB6, 0x7FB8, 0x8B71, 0x7FC5,
+ 0x7FC6, 0x7FCA, 0x7FD5, 0x7FD4, 0x7FE1, 0x7FE6, 0x7FE9, 0x7FF3,
+ 0x7FF9, 0x98DC, 0x8006, 0x8004, 0x800B, 0x8012, 0x8018, 0x8019,
+ 0x801C, 0x8021, 0x8028, 0x803F, 0x803B, 0x804A, 0x8046, 0x8052,
+ 0x8058, 0x805A, 0x805F, 0x8062, 0x8068, 0x8073, 0x8072, 0x8070,
+ 0x8076, 0x8079, 0x807D, 0x807F, 0x8084, 0x8086, 0x8085, 0x809B,
+ 0x8093, 0x809A, 0x80AD, 0x5190, 0x80AC, 0x80DB, 0x80E5, 0x80D9,
+ 0x80DD, 0x80C4, 0x80DA, 0x80D6, 0x8109, 0x80EF, 0x80F1, 0x811B,
+ 0x8129, 0x8123, 0x812F, 0x814B, 0x968B, 0x8146, 0x813E, 0x8153,
+ 0x8151, 0x80FC, 0x8171, 0x816E, 0x8165, 0x8166, 0x8174, 0x8183,
+ 0x8188, 0x818A, 0x8180, 0x8182, 0x81A0, 0x8195, 0x81A4, 0x81A3,
+ 0x815F, 0x8193, 0x81A9, 0x81B0, 0x81B5, 0x81BE, 0x81B8, 0x81BD,
+ 0x81C0, 0x81C2, 0x81BA, 0x81C9, 0x81CD, 0x81D1, 0x81D9, 0x81D8,
+ 0x81C8, 0x81DA, 0x81DF, 0x81E0, 0x81E7, 0x81FA, 0x81FB, 0x81FE,
+ 0x8201, 0x8202, 0x8205, 0x8207, 0x820A, 0x820D, 0x8210, 0x8216,
+ 0x8229, 0x822B, 0x8238, 0x8233, 0x8240, 0x8259, 0x8258, 0x825D,
+ 0x825A, 0x825F, 0x8264, 0x8262, 0x8268, 0x826A, 0x826B, 0x822E,
+ 0x8271, 0x8277, 0x8278, 0x827E, 0x828D, 0x8292, 0x82AB, 0x829F,
+ 0x82BB, 0x82AC, 0x82E1, 0x82E3, 0x82DF, 0x82D2, 0x82F4, 0x82F3,
+ 0x82FA, 0x8393, 0x8303, 0x82FB, 0x82F9, 0x82DE, 0x8306, 0x82DC,
+ 0x8309, 0x82D9, 0x8335, 0x8334, 0x8316, 0x8332, 0x8331, 0x8340,
+ 0x8339, 0x8350, 0x8345, 0x832F, 0x832B, 0x8317, 0x8318, 0x8385,
+ 0x839A, 0x83AA, 0x839F, 0x83A2, 0x8396, 0x8323, 0x838E, 0x8387,
+ 0x838A, 0x837C, 0x83B5, 0x8373, 0x8375, 0x83A0, 0x8389, 0x83A8,
+ 0x83F4, 0x8413, 0x83EB, 0x83CE, 0x83FD, 0x8403, 0x83D8, 0x840B,
+ 0x83C1, 0x83F7, 0x8407, 0x83E0, 0x83F2, 0x840D, 0x8422, 0x8420,
+ 0x83BD, 0x8438, 0x8506, 0x83FB, 0x846D, 0x842A, 0x843C, 0x855A,
+ 0x8484, 0x8477, 0x846B, 0x84AD, 0x846E, 0x8482, 0x8469, 0x8446,
+ 0x842C, 0x846F, 0x8479, 0x8435, 0x84CA, 0x8462, 0x84B9, 0x84BF,
+ 0x849F, 0x84D9, 0x84CD, 0x84BB, 0x84DA, 0x84D0, 0x84C1, 0x84C6,
+ 0x84D6, 0x84A1, 0x8521, 0x84FF, 0x84F4, 0x8517, 0x8518, 0x852C,
+ 0x851F, 0x8515, 0x8514, 0x84FC, 0x8540, 0x8563, 0x8558, 0x8548,
+ 0x8541, 0x8602, 0x854B, 0x8555, 0x8580, 0x85A4, 0x8588, 0x8591,
+ 0x858A, 0x85A8, 0x856D, 0x8594, 0x859B, 0x85EA, 0x8587, 0x859C,
+ 0x8577, 0x857E, 0x8590, 0x85C9, 0x85BA, 0x85CF, 0x85B9, 0x85D0,
+ 0x85D5, 0x85DD, 0x85E5, 0x85DC, 0x85F9, 0x860A, 0x8613, 0x860B,
+ 0x85FE, 0x85FA, 0x8606, 0x8622, 0x861A, 0x8630, 0x863F, 0x864D,
+ 0x4E55, 0x8654, 0x865F, 0x8667, 0x8671, 0x8693, 0x86A3, 0x86A9,
+ 0x86AA, 0x868B, 0x868C, 0x86B6, 0x86AF, 0x86C4, 0x86C6, 0x86B0,
+ 0x86C9, 0x8823, 0x86AB, 0x86D4, 0x86DE, 0x86E9, 0x86EC, 0x86DF,
+ 0x86DB, 0x86EF, 0x8712, 0x8706, 0x8708, 0x8700, 0x8703, 0x86FB,
+ 0x8711, 0x8709, 0x870D, 0x86F9, 0x870A, 0x8734, 0x873F, 0x8737,
+ 0x873B, 0x8725, 0x8729, 0x871A, 0x8760, 0x875F, 0x8778, 0x874C,
+ 0x874E, 0x8774, 0x8757, 0x8768, 0x876E, 0x8759, 0x8753, 0x8763,
+ 0x876A, 0x8805, 0x87A2, 0x879F, 0x8782, 0x87AF, 0x87CB, 0x87BD,
+ 0x87C0, 0x87D0, 0x96D6, 0x87AB, 0x87C4, 0x87B3, 0x87C7, 0x87C6,
+ 0x87BB, 0x87EF, 0x87F2, 0x87E0, 0x880F, 0x880D, 0x87FE, 0x87F6,
+ 0x87F7, 0x880E, 0x87D2, 0x8811, 0x8816, 0x8815, 0x8822, 0x8821,
+ 0x8831, 0x8836, 0x8839, 0x8827, 0x883B, 0x8844, 0x8842, 0x8852,
+ 0x8859, 0x885E, 0x8862, 0x886B, 0x8881, 0x887E, 0x889E, 0x8875,
+ 0x887D, 0x88B5, 0x8872, 0x8882, 0x8897, 0x8892, 0x88AE, 0x8899,
+ 0x88A2, 0x888D, 0x88A4, 0x88B0, 0x88BF, 0x88B1, 0x88C3, 0x88C4,
+ 0x88D4, 0x88D8, 0x88D9, 0x88DD, 0x88F9, 0x8902, 0x88FC, 0x88F4,
+ 0x88E8, 0x88F2, 0x8904, 0x890C, 0x890A, 0x8913, 0x8943, 0x891E,
+ 0x8925, 0x892A, 0x892B, 0x8941, 0x8944, 0x893B, 0x8936, 0x8938,
+ 0x894C, 0x891D, 0x8960, 0x895E, 0x8966, 0x8964, 0x896D, 0x896A,
+ 0x896F, 0x8974, 0x8977, 0x897E, 0x8983, 0x8988, 0x898A, 0x8993,
+ 0x8998, 0x89A1, 0x89A9, 0x89A6, 0x89AC, 0x89AF, 0x89B2, 0x89BA,
+ 0x89BD, 0x89BF, 0x89C0, 0x89DA, 0x89DC, 0x89DD, 0x89E7, 0x89F4,
+ 0x89F8, 0x8A03, 0x8A16, 0x8A10, 0x8A0C, 0x8A1B, 0x8A1D, 0x8A25,
+ 0x8A36, 0x8A41, 0x8A5B, 0x8A52, 0x8A46, 0x8A48, 0x8A7C, 0x8A6D,
+ 0x8A6C, 0x8A62, 0x8A85, 0x8A82, 0x8A84, 0x8AA8, 0x8AA1, 0x8A91,
+ 0x8AA5, 0x8AA6, 0x8A9A, 0x8AA3, 0x8AC4, 0x8ACD, 0x8AC2, 0x8ADA,
+ 0x8AEB, 0x8AF3, 0x8AE7, 0x8AE4, 0x8AF1, 0x8B14, 0x8AE0, 0x8AE2,
+ 0x8AF7, 0x8ADE, 0x8ADB, 0x8B0C, 0x8B07, 0x8B1A, 0x8AE1, 0x8B16,
+ 0x8B10, 0x8B17, 0x8B20, 0x8B33, 0x97AB, 0x8B26, 0x8B2B, 0x8B3E,
+ 0x8B28, 0x8B41, 0x8B4C, 0x8B4F, 0x8B4E, 0x8B49, 0x8B56, 0x8B5B,
+ 0x8B5A, 0x8B6B, 0x8B5F, 0x8B6C, 0x8B6F, 0x8B74, 0x8B7D, 0x8B80,
+ 0x8B8C, 0x8B8E, 0x8B92, 0x8B93, 0x8B96, 0x8B99, 0x8B9A, 0x8C3A,
+ 0x8C41, 0x8C3F, 0x8C48, 0x8C4C, 0x8C4E, 0x8C50, 0x8C55, 0x8C62,
+ 0x8C6C, 0x8C78, 0x8C7A, 0x8C82, 0x8C89, 0x8C85, 0x8C8A, 0x8C8D,
+ 0x8C8E, 0x8C94, 0x8C7C, 0x8C98, 0x621D, 0x8CAD, 0x8CAA, 0x8CBD,
+ 0x8CB2, 0x8CB3, 0x8CAE, 0x8CB6, 0x8CC8, 0x8CC1, 0x8CE4, 0x8CE3,
+ 0x8CDA, 0x8CFD, 0x8CFA, 0x8CFB, 0x8D04, 0x8D05, 0x8D0A, 0x8D07,
+ 0x8D0F, 0x8D0D, 0x8D10, 0x9F4E, 0x8D13, 0x8CCD, 0x8D14, 0x8D16,
+ 0x8D67, 0x8D6D, 0x8D71, 0x8D73, 0x8D81, 0x8D99, 0x8DC2, 0x8DBE,
+ 0x8DBA, 0x8DCF, 0x8DDA, 0x8DD6, 0x8DCC, 0x8DDB, 0x8DCB, 0x8DEA,
+ 0x8DEB, 0x8DDF, 0x8DE3, 0x8DFC, 0x8E08, 0x8E09, 0x8DFF, 0x8E1D,
+ 0x8E1E, 0x8E10, 0x8E1F, 0x8E42, 0x8E35, 0x8E30, 0x8E34, 0x8E4A,
+ 0x8E47, 0x8E49, 0x8E4C, 0x8E50, 0x8E48, 0x8E59, 0x8E64, 0x8E60,
+ 0x8E2A, 0x8E63, 0x8E55, 0x8E76, 0x8E72, 0x8E7C, 0x8E81, 0x8E87,
+ 0x8E85, 0x8E84, 0x8E8B, 0x8E8A, 0x8E93, 0x8E91, 0x8E94, 0x8E99,
+ 0x8EAA, 0x8EA1, 0x8EAC, 0x8EB0, 0x8EC6, 0x8EB1, 0x8EBE, 0x8EC5,
+ 0x8EC8, 0x8ECB, 0x8EDB, 0x8EE3, 0x8EFC, 0x8EFB, 0x8EEB, 0x8EFE,
+ 0x8F0A, 0x8F05, 0x8F15, 0x8F12, 0x8F19, 0x8F13, 0x8F1C, 0x8F1F,
+ 0x8F1B, 0x8F0C, 0x8F26, 0x8F33, 0x8F3B, 0x8F39, 0x8F45, 0x8F42,
+ 0x8F3E, 0x8F4C, 0x8F49, 0x8F46, 0x8F4E, 0x8F57, 0x8F5C, 0x8F62,
+ 0x8F63, 0x8F64, 0x8F9C, 0x8F9F, 0x8FA3, 0x8FAD, 0x8FAF, 0x8FB7,
+ 0x8FDA, 0x8FE5, 0x8FE2, 0x8FEA, 0x8FEF, 0x9087, 0x8FF4, 0x9005,
+ 0x8FF9, 0x8FFA, 0x9011, 0x9015, 0x9021, 0x900D, 0x901E, 0x9016,
+ 0x900B, 0x9027, 0x9036, 0x9035, 0x9039, 0x8FF8, 0x904F, 0x9050,
+ 0x9051, 0x9052, 0x900E, 0x9049, 0x903E, 0x9056, 0x9058, 0x905E,
+ 0x9068, 0x906F, 0x9076, 0x96A8, 0x9072, 0x9082, 0x907D, 0x9081,
+ 0x9080, 0x908A, 0x9089, 0x908F, 0x90A8, 0x90AF, 0x90B1, 0x90B5,
+ 0x90E2, 0x90E4, 0x6248, 0x90DB, 0x9102, 0x9112, 0x9119, 0x9132,
+ 0x9130, 0x914A, 0x9156, 0x9158, 0x9163, 0x9165, 0x9169, 0x9173,
+ 0x9172, 0x918B, 0x9189, 0x9182, 0x91A2, 0x91AB, 0x91AF, 0x91AA,
+ 0x91B5, 0x91B4, 0x91BA, 0x91C0, 0x91C1, 0x91C9, 0x91CB, 0x91D0,
+ 0x91D6, 0x91DF, 0x91E1, 0x91DB, 0x91FC, 0x91F5, 0x91F6, 0x921E,
+ 0x91FF, 0x9214, 0x922C, 0x9215, 0x9211, 0x925E, 0x9257, 0x9245,
+ 0x9249, 0x9264, 0x9248, 0x9295, 0x923F, 0x924B, 0x9250, 0x929C,
+ 0x9296, 0x9293, 0x929B, 0x925A, 0x92CF, 0x92B9, 0x92B7, 0x92E9,
+ 0x930F, 0x92FA, 0x9344, 0x932E, 0x9319, 0x9322, 0x931A, 0x9323,
+ 0x933A, 0x9335, 0x933B, 0x935C, 0x9360, 0x937C, 0x936E, 0x9356,
+ 0x93B0, 0x93AC, 0x93AD, 0x9394, 0x93B9, 0x93D6, 0x93D7, 0x93E8,
+ 0x93E5, 0x93D8, 0x93C3, 0x93DD, 0x93D0, 0x93C8, 0x93E4, 0x941A,
+ 0x9414, 0x9413, 0x9403, 0x9407, 0x9410, 0x9436, 0x942B, 0x9435,
+ 0x9421, 0x943A, 0x9441, 0x9452, 0x9444, 0x945B, 0x9460, 0x9462,
+ 0x945E, 0x946A, 0x9229, 0x9470, 0x9475, 0x9477, 0x947D, 0x945A,
+ 0x947C, 0x947E, 0x9481, 0x947F, 0x9582, 0x9587, 0x958A, 0x9594,
+ 0x9596, 0x9598, 0x9599, 0x95A0, 0x95A8, 0x95A7, 0x95AD, 0x95BC,
+ 0x95BB, 0x95B9, 0x95BE, 0x95CA, 0x6FF6, 0x95C3, 0x95CD, 0x95CC,
+ 0x95D5, 0x95D4, 0x95D6, 0x95DC, 0x95E1, 0x95E5, 0x95E2, 0x9621,
+ 0x9628, 0x962E, 0x962F, 0x9642, 0x964C, 0x964F, 0x964B, 0x9677,
+ 0x965C, 0x965E, 0x965D, 0x965F, 0x9666, 0x9672, 0x966C, 0x968D,
+ 0x9698, 0x9695, 0x9697, 0x96AA, 0x96A7, 0x96B1, 0x96B2, 0x96B0,
+ 0x96B4, 0x96B6, 0x96B8, 0x96B9, 0x96CE, 0x96CB, 0x96C9, 0x96CD,
+ 0x894D, 0x96DC, 0x970D, 0x96D5, 0x96F9, 0x9704, 0x9706, 0x9708,
+ 0x9713, 0x970E, 0x9711, 0x970F, 0x9716, 0x9719, 0x9724, 0x972A,
+ 0x9730, 0x9739, 0x973D, 0x973E, 0x9744, 0x9746, 0x9748, 0x9742,
+ 0x9749, 0x975C, 0x9760, 0x9764, 0x9766, 0x9768, 0x52D2, 0x976B,
+ 0x9771, 0x9779, 0x9785, 0x977C, 0x9781, 0x977A, 0x9786, 0x978B,
+ 0x978F, 0x9790, 0x979C, 0x97A8, 0x97A6, 0x97A3, 0x97B3, 0x97B4,
+ 0x97C3, 0x97C6, 0x97C8, 0x97CB, 0x97DC, 0x97ED, 0x9F4F, 0x97F2,
+ 0x7ADF, 0x97F6, 0x97F5, 0x980F, 0x980C, 0x9838, 0x9824, 0x9821,
+ 0x9837, 0x983D, 0x9846, 0x984F, 0x984B, 0x986B, 0x986F, 0x9870,
+ 0x9871, 0x9874, 0x9873, 0x98AA, 0x98AF, 0x98B1, 0x98B6, 0x98C4,
+ 0x98C3, 0x98C6, 0x98E9, 0x98EB, 0x9903, 0x9909, 0x9912, 0x9914,
+ 0x9918, 0x9921, 0x991D, 0x991E, 0x9924, 0x9920, 0x992C, 0x992E,
+ 0x993D, 0x993E, 0x9942, 0x9949, 0x9945, 0x9950, 0x994B, 0x9951,
+ 0x9952, 0x994C, 0x9955, 0x9997, 0x9998, 0x99A5, 0x99AD, 0x99AE,
+ 0x99BC, 0x99DF, 0x99DB, 0x99DD, 0x99D8, 0x99D1, 0x99ED, 0x99EE,
+ 0x99F1, 0x99F2, 0x99FB, 0x99F8, 0x9A01, 0x9A0F, 0x9A05, 0x99E2,
+ 0x9A19, 0x9A2B, 0x9A37, 0x9A45, 0x9A42, 0x9A40, 0x9A43, 0x9A3E,
+ 0x9A55, 0x9A4D, 0x9A5B, 0x9A57, 0x9A5F, 0x9A62, 0x9A65, 0x9A64,
+ 0x9A69, 0x9A6B, 0x9A6A, 0x9AAD, 0x9AB0, 0x9ABC, 0x9AC0, 0x9ACF,
+ 0x9AD1, 0x9AD3, 0x9AD4, 0x9ADE, 0x9ADF, 0x9AE2, 0x9AE3, 0x9AE6,
+ 0x9AEF, 0x9AEB, 0x9AEE, 0x9AF4, 0x9AF1, 0x9AF7, 0x9AFB, 0x9B06,
+ 0x9B18, 0x9B1A, 0x9B1F, 0x9B22, 0x9B23, 0x9B25, 0x9B27, 0x9B28,
+ 0x9B29, 0x9B2A, 0x9B2E, 0x9B2F, 0x9B32, 0x9B44, 0x9B43, 0x9B4F,
+ 0x9B4D, 0x9B4E, 0x9B51, 0x9B58, 0x9B74, 0x9B93, 0x9B83, 0x9B91,
+ 0x9B96, 0x9B97, 0x9B9F, 0x9BA0, 0x9BA8, 0x9BB4, 0x9BC0, 0x9BCA,
+ 0x9BB9, 0x9BC6, 0x9BCF, 0x9BD1, 0x9BD2, 0x9BE3, 0x9BE2, 0x9BE4,
+ 0x9BD4, 0x9BE1, 0x9C3A, 0x9BF2, 0x9BF1, 0x9BF0, 0x9C15, 0x9C14,
+ 0x9C09, 0x9C13, 0x9C0C, 0x9C06, 0x9C08, 0x9C12, 0x9C0A, 0x9C04,
+ 0x9C2E, 0x9C1B, 0x9C25, 0x9C24, 0x9C21, 0x9C30, 0x9C47, 0x9C32,
+ 0x9C46, 0x9C3E, 0x9C5A, 0x9C60, 0x9C67, 0x9C76, 0x9C78, 0x9CE7,
+ 0x9CEC, 0x9CF0, 0x9D09, 0x9D08, 0x9CEB, 0x9D03, 0x9D06, 0x9D2A,
+ 0x9D26, 0x9DAF, 0x9D23, 0x9D1F, 0x9D44, 0x9D15, 0x9D12, 0x9D41,
+ 0x9D3F, 0x9D3E, 0x9D46, 0x9D48, 0x9D5D, 0x9D5E, 0x9D64, 0x9D51,
+ 0x9D50, 0x9D59, 0x9D72, 0x9D89, 0x9D87, 0x9DAB, 0x9D6F, 0x9D7A,
+ 0x9D9A, 0x9DA4, 0x9DA9, 0x9DB2, 0x9DC4, 0x9DC1, 0x9DBB, 0x9DB8,
+ 0x9DBA, 0x9DC6, 0x9DCF, 0x9DC2, 0x9DD9, 0x9DD3, 0x9DF8, 0x9DE6,
+ 0x9DED, 0x9DEF, 0x9DFD, 0x9E1A, 0x9E1B, 0x9E1E, 0x9E75, 0x9E79,
+ 0x9E7D, 0x9E81, 0x9E88, 0x9E8B, 0x9E8C, 0x9E92, 0x9E95, 0x9E91,
+ 0x9E9D, 0x9EA5, 0x9EA9, 0x9EB8, 0x9EAA, 0x9EAD, 0x9761, 0x9ECC,
+ 0x9ECE, 0x9ECF, 0x9ED0, 0x9ED4, 0x9EDC, 0x9EDE, 0x9EDD, 0x9EE0,
+ 0x9EE5, 0x9EE8, 0x9EEF, 0x9EF4, 0x9EF6, 0x9EF7, 0x9EF9, 0x9EFB,
+ 0x9EFC, 0x9EFD, 0x9F07, 0x9F08, 0x76B7, 0x9F15, 0x9F21, 0x9F2C,
+ 0x9F3E, 0x9F4A, 0x9F52, 0x9F54, 0x9F63, 0x9F5F, 0x9F60, 0x9F61,
+ 0x9F66, 0x9F67, 0x9F6C, 0x9F6A, 0x9F77, 0x9F72, 0x9F76, 0x9F95,
+ 0x9F9C, 0x9FA0, 0x582F, 0x69C7, 0x9059, 0x7464, 0x2642, 0x2500,
+ 0x2501, 0x2502, 0x2503, 0x2504, 0x2505, 0x2506, 0x2507, 0x2508,
+ 0x2509, 0x250A, 0x250B, 0x250C, 0x250D, 0x250E, 0x250F, 0x2510,
+ 0x2511, 0x2512, 0x2513, 0x2514, 0x2515, 0x2516, 0x2517, 0x2518,
+ 0x2519, 0x251A, 0x251B, 0x251C, 0x251D, 0x251E, 0x251F, 0x2520,
+ 0x2521, 0x2522, 0x2523, 0x2524, 0x2525, 0x2526, 0x2527, 0x2528,
+ 0x2529, 0x252A, 0x252B, 0x252C, 0x252D, 0x252E, 0x252F, 0x2530,
+ 0x2531, 0x2532, 0x2533, 0x2534, 0x2535, 0x2536, 0x2537, 0x2538,
+ 0x2539, 0x253A, 0x253B, 0x253C, 0x253D, 0x253E, 0x253F, 0x2540,
+ 0x2541, 0x2542, 0x2543, 0x2544, 0x2545, 0x2546, 0x2547, 0x2548,
+ 0x2549, 0x254A, 0x254B, 0x2460, 0x2461, 0x2462, 0x2463, 0x2464,
+ 0x2465, 0x2466, 0x2467, 0x2468, 0x2469, 0x246A, 0x246B, 0x246C,
+ 0x246D, 0x246E, 0x246F, 0x2470, 0x2471, 0x2472, 0x2473, 0x2160,
+ 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168,
+ 0x2169, 0x3349, 0x3314, 0x3322, 0x334D, 0x3318, 0x3327, 0x3303,
+ 0x3336, 0x3351, 0x3357, 0x330D, 0x3326, 0x3323, 0x332B, 0x334A,
+ 0x333B, 0x339C, 0x339D, 0x339E, 0x338E, 0x338F, 0x33C4, 0x33A1,
+ 0x301D, 0x301F, 0x2116, 0x33CD, 0x2121, 0x32A4, 0x32A5, 0x32A6,
+ 0x32A7, 0x32A8, 0x3231, 0x3232, 0x3239, 0x337E, 0x337D, 0x337C,
+ 0x222E, 0x2211, 0x221A, 0x22A5, 0x2220, 0x221F, 0x22BF, 0x2229,
+ 0x222A, 0x555E, 0x98F4, 0x6EA2, 0x9C2F, 0x6DEB, 0x8FC2, 0x6B1D,
+ 0x53A9, 0x958F, 0x5642, 0x990C, 0x7130, 0x8956, 0x9DD7, 0x8FE6,
+ 0x6062, 0x62D0, 0x6666, 0x559D, 0x845B, 0x9784, 0x5699, 0x6F97,
+ 0x7FF0, 0x7FEB, 0x5FBD, 0x7947, 0x4FE0, 0x537F, 0x50C5, 0x8EC0,
+ 0x55B0, 0x6ADB, 0x5C51, 0x9774, 0x7941, 0x6167, 0x7A3D, 0x7E6B,
+ 0x834A, 0x9699, 0x5026, 0x5ACC, 0x6372, 0x9E7C, 0x8AFA, 0x5DF7,
+ 0x663B, 0x6E9D, 0x9EB4, 0x9D60, 0x7511, 0x91C7, 0x698A, 0x6805,
+ 0x85A9, 0x9BD6, 0x9306, 0x73CA, 0x53F1, 0x5C62, 0x906E, 0x6753,
+ 0x707C, 0x7E61, 0x914B, 0x66D9, 0x6E1A, 0x85AF, 0x85F7, 0x54E8,
+ 0x5EE0, 0x68A2, 0x8523, 0x91AC, 0x9798, 0x8755, 0x9771, 0x9017,
+ 0x7FE0, 0x647A, 0x901D, 0x87EC, 0x64B0, 0x6813, 0x714E, 0x717D,
+ 0x8A6E, 0x564C, 0x9061, 0x5275, 0x6414, 0x7626, 0x905C, 0x9A52,
+ 0x817F, 0x9EDB, 0x5544, 0x6FEF, 0x7422, 0x86F8, 0x5DFD, 0x8FBF,
+ 0x68DA, 0x9C48, 0x6A3D, 0x7C1E, 0x8A3B, 0x7026, 0x51CB, 0x6357,
+ 0x69CC, 0x939A, 0x585A, 0x6451, 0x912D, 0x64E2, 0x6EBA, 0x5861,
+ 0x985A, 0x5835, 0x5C60, 0x83DF, 0x8CED, 0x5858, 0x79B1, 0x9D07,
+ 0x7006, 0x701E, 0x5678, 0x9041, 0x9813, 0x90A3, 0x8B0E, 0x7058,
+ 0x6962, 0x79B0, 0x56CA, 0x724C, 0x9019, 0x79E4, 0x525D, 0x7BB8,
+ 0x6F51, 0x91B1, 0x633D, 0x6249, 0x6A0B, 0x67CA, 0x7A17, 0x903C,
+ 0x5A9B, 0x8B2C, 0x5EDF, 0x7015, 0x983B, 0x853D, 0x77A5, 0x5A29,
+ 0x5E96, 0x6CE1, 0x84EC, 0x9830, 0x9C52, 0x9EB5, 0x5132, 0x9905,
+ 0x7C7E, 0x9453, 0x6108, 0x7652, 0x7337, 0x7194, 0x8000, 0x840A,
+ 0x907C, 0x6F23, 0x7149, 0x84EE, 0x6994, 0x881F, 0x5154, 0x5189,
+ 0x5195, 0x51A4, 0x5539, 0x5533, 0x55E4, 0x5632, 0x56A5, 0x580B,
+ 0x5ABE, 0x5BC3, 0x5C5B, 0x5E64, 0x6097, 0x6369, 0x6406, 0x6522,
+ 0x6583, 0x67A6, 0x67B4, 0x689B, 0x688E, 0x6E6E, 0x71D7, 0x7228,
+ 0x73CE, 0x7504, 0x750D, 0x7515, 0x7693, 0x787C, 0x7A31, 0x9F9D,
+ 0x7B99, 0x7C90, 0x7CAE, 0x7D9B, 0x7DAE, 0x7D9F, 0x7FD4, 0x822E,
+ 0x828D, 0x82D2, 0x8323, 0x8375, 0x8517, 0x853E, 0x8782, 0x87D2,
+ 0x890A, 0x89AF, 0x8ADE, 0x8B41, 0x8DDA, 0x8E09, 0x8F13, 0x8FEA,
+ 0x8FE9, 0x9058, 0x6248, 0x91C1, 0x95BB, 0x7762, 0x9724, 0x9760,
+ 0x976D, 0x9824, 0x9B2E, 0x9B97, 0x9BF2, 0x9EAA, 0x9F9C, 0x3001,
+ 0x3002, 0x203E, 0xFF3F, 0x30FC, 0x2015, 0x2010, 0x301C, 0x2016,
+ 0xFF5C, 0x2026, 0x2025, 0xFF08, 0xFF09, 0x3014, 0x3015, 0xFF3B,
+ 0xFF3D, 0xFF5B, 0xFF5D, 0x3008, 0x3009, 0x300A, 0x300B, 0x300C,
+ 0x300D, 0x300E, 0x300F, 0x3010, 0x3011, 0xFF1D, 0x3041, 0x3043,
+ 0x3045, 0x3047, 0x3049, 0x3063, 0x3083, 0x3085, 0x3087, 0x308E,
+ 0x30A1, 0x30A3, 0x30A5, 0x30A7, 0x30A9, 0x30C3, 0x30E3, 0x30E5,
+ 0x30E7, 0x30EE, 0x30F5, 0x30F6, 0x3349, 0x3314, 0x3322, 0x334D,
+ 0x3318, 0x3327, 0x3303, 0x3336, 0x3351, 0x3357, 0x330D, 0x3326,
+ 0x3323, 0x332B, 0x334A, 0x333B, 0x301D, 0x301E, 0x3094, 0x304B,
+ 0x3051, 0x82A6, 0x8328, 0x5653, 0x53A9, 0x7259, 0x6C72, 0x7B08,
+ 0x9957, 0x62F3, 0x9910, 0x976D, 0x717D, 0x7A7F, 0x7BAD, 0x63C3,
+ 0x83DF, 0x7962, 0x53DB, 0x7BC7, 0x8FC4, 0x7C3E, 0x50CA, 0x5315,
+ 0x55A9, 0x56AE, 0x5819, 0x591B, 0x5C28, 0x5ED0, 0x5ECF, 0x6241,
+ 0x66C1, 0x6C08, 0x6E23, 0x6EEC, 0x7A97, 0x7BDD, 0x7FE9, 0x8422,
+ 0x8759, 0x880E, 0x87D2, 0x9A19, 0x9EAD, 0xFFE4, 0xFF07, 0xFF02,
+ 0x11A8, 0x25C1, 0x25B7, 0x21E9, 0x21E7, 0x21E6, 0x21E8, 0x25A2,
+ 0x2667, 0x2661, 0x2664, 0x2662, 0x33A0, 0x33A2, 0x33A4, 0x33A5,
+ 0x3397, 0x2113, 0x3398, 0x33B3, 0x33B2, 0x33B1, 0x33B0, 0x3385,
+ 0x3386, 0x3387, 0x33CB, 0x3390, 0x33D4, 0x3396, 0x3322, 0x3316,
+ 0x3318, 0x3315, 0x3303, 0x3323, 0x3357, 0x3342, 0x3339, 0x333B,
+ 0x3300, 0x3331, 0x3347, 0x331E, 0x332A, 0x33CD, 0x337F, 0x2121,
+ 0x260E, 0x3036, 0x3020, 0x00A9, 0x00AE, 0x0000, 0x2488, 0x2489,
+ 0x248A, 0x248B, 0x248C, 0x248D, 0x248E, 0x248F, 0x2490, 0x2474,
+ 0x2475, 0x2476, 0x2477, 0x2478, 0x2479, 0x247A, 0x247B, 0x247C,
+ 0x247D, 0x247E, 0x247F, 0x2480, 0x2481, 0x2482, 0x2483, 0x2484,
+ 0x2485, 0x2486, 0x2487, 0x3251, 0x2170, 0x2171, 0x2172, 0x2173,
+ 0x2174, 0x2175, 0x2176, 0x2177, 0x2178, 0x2179, 0x3252, 0x3253,
+ 0x3254, 0x3255, 0x3256, 0x3257, 0x3258, 0x3259, 0x325A, 0x325B,
+ 0x249C, 0x249D, 0x249E, 0x249F, 0x24A0, 0x24A1, 0x24A2, 0x24A3,
+ 0x24A4, 0x24A5, 0x24A6, 0x24A7, 0x24A8, 0x24A9, 0x24AA, 0x24AB,
+ 0x24AC, 0x24AD, 0x24AE, 0x24AF, 0x24B0, 0x24B1, 0x24B2, 0x24B3,
+ 0x24B4, 0x24B5, 0x3243, 0x323D, 0x323F, 0x3234, 0x3238, 0x3233,
+ 0x323C, 0x3242, 0x323E, 0x3236, 0x3235, 0x323B, 0x3240, 0x323A,
+ 0x32B0, 0x32AD, 0x32A9, 0x32AF, 0x3294, 0x32AA, 0x3298, 0x32AB,
+ 0x3292, 0x3291, 0x3293, 0x32AC, 0x32AE, 0x3296, 0x23A9, 0x23A8,
+ 0x23A7, 0xFE38, 0x23AD, 0x23AC, 0x23AB, 0xFE38, 0x23AB, 0x23AC,
+ 0x23AD, 0xFE38, 0x23A7, 0x23A8, 0x23A9, 0xFE38, 0x33CC, 0x3305,
+ 0x00BD, 0x00BC, 0x339F, 0x33A3, 0x33A6, 0xFFFD, 0xFFFD, 0x329E,
+ 0x3388, 0x3389, 0x33C8, 0x222D, 0x5370, 0x3230, 0x322A, 0x322B,
+ 0x322C, 0x322D, 0x322E, 0x322F, 0x3237, 0x3241, 0x27A1, 0x21E6,
+ 0x21E7, 0x21E9, 0x25C9, 0x2660, 0x2665, 0x2663, 0x2666, 0x2600,
+ 0x2601, 0x2602, 0x2603, 0x261E, 0x261C, 0x261D, 0x261F, 0x3299,
+ 0x24EA, 0x216A, 0x216B, 0xFF10, 0xFF10, 0x3000, 0x2581, 0x2582,
+ 0x2583, 0x2584, 0x2585, 0x2586, 0x2587, 0x2588, 0x258F, 0x258E,
+ 0x258D, 0x258C, 0x258B, 0x258A, 0x2589, 0x2594, 0x2595, 0x256D,
+ 0x256E, 0x2570, 0x256F, 0x2550, 0x255E, 0x256A, 0x2561, 0x25E2,
+ 0x25E3, 0x25E5, 0x25E4, 0x25CF, 0x0ED0, 0x2571, 0x2572, 0x2573,
+ 0x304B, 0x3051, 0x9022, 0x8FBB, 0xFF0C, 0x00B0, 0x3013, 0x309C,
+ 0x309B, 0x02CF, 0xFF0E, 0x2018, 0x2019, 0x201C, 0x201D, 0x201C,
+ 0x201E, 0x2018, 0x201A, 0x02BA, 0x51DC, 0x7199, 0x2776, 0x2777,
+ 0x2778, 0x2779, 0x277A, 0x277B, 0x277C, 0x277D, 0x277E, 0x0000,
+ 0x0000, 0x0000, 0x217A, 0x217B, 0x0000, 0x0000, 0x0000, 0x217F,
+ 0x210A, 0x2109, 0x0000, 0x0000, 0x3004, 0x21C6, 0x21C4, 0x21C5,
+ 0x0000, 0x30F7, 0x30F8, 0x30F9, 0x30FA, 0x5927, 0x5C0F, 0x329D,
+ 0x63A7, 0x0000, 0x0000, 0x337B, 0x337F, 0x0000, 0x0000, 0x3333,
+ 0x334E, 0x3322, 0x3316, 0x3305, 0x3305, 0x3305, 0x3333, 0x334E,
+ 0x334E, 0x334E, 0x3303, 0x3318, 0x3315, 0x3339, 0x3339, 0x3339,
+ 0x3357, 0x3342, 0x3342, 0x3342, 0x3323, 0x333B, 0x3300, 0x331E,
+ 0x331E, 0x331E, 0x332A, 0x332A, 0x332A, 0x3347, 0x3331, 0x7E8A,
+ 0x891C, 0x9348, 0x9288, 0x84DC, 0x4FC9, 0x70BB, 0x6631, 0x68C8,
+ 0x92F9, 0x66FB, 0x5F45, 0x4E28, 0x4EE1, 0x4EFC, 0x4F00, 0x4F03,
+ 0x4F39, 0x4F56, 0x4F92, 0x4F8A, 0x4F9A, 0x4F94, 0x4FCD, 0x5040,
+ 0x5022, 0x4FFF, 0x501E, 0x5046, 0x5070, 0x5042, 0x5094, 0x50F4,
+ 0x50D8, 0x514A, 0x5164, 0x519D, 0x51BE, 0x51EC, 0x5215, 0x529C,
+ 0x52A6, 0x52C0, 0x52DB, 0x5300, 0x5307, 0x5324, 0x5372, 0x5393,
+ 0x53B2, 0x53DD, 0xFA0E, 0x549C, 0x548A, 0x54A9, 0x54FF, 0x5586,
+ 0x5759, 0x5765, 0x57AC, 0x57C8, 0x57C7, 0xFA0F, 0xFA10, 0x589E,
+ 0x58B2, 0x590B, 0x5953, 0x595B, 0x595D, 0x5963, 0x59A4, 0x59BA,
+ 0x5B56, 0x5BC0, 0x752F, 0x5BD8, 0x5BEC, 0x5C1E, 0x5CA6, 0x5CBA,
+ 0x5CF5, 0x5D27, 0x5D53, 0xFA11, 0x5D42, 0x5D6D, 0x5DB8, 0x5DB9,
+ 0x5DD0, 0x5F21, 0x5F34, 0x5F67, 0x5FB7, 0x5FDE, 0x605D, 0x6085,
+ 0x608A, 0x60DE, 0x60D5, 0x6120, 0x60F2, 0x6111, 0x6137, 0x6130,
+ 0x6198, 0x6213, 0x62A6, 0x63F5, 0x6460, 0x649D, 0x64CE, 0x654E,
+ 0x6600, 0x6615, 0x6609, 0x662E, 0x661E, 0x6624, 0x6665, 0x6657,
+ 0x6659, 0xFA12, 0x6673, 0x6699, 0x66A0, 0x66B2, 0x66BF, 0x66FA,
+ 0x670E, 0xF929, 0x6766, 0x67BB, 0x6852, 0x67C0, 0x6801, 0x6844,
+ 0x68CF, 0xFA13, 0x6968, 0xFA14, 0x6998, 0x69E2, 0x6A30, 0x6A6B,
+ 0x6A46, 0x6A73, 0x6A7E, 0x6AE2, 0x6AE4, 0x6BD6, 0x6C3F, 0x6C5C,
+ 0x6C86, 0x6C6F, 0x6CDA, 0x6D04, 0x6D87, 0x6D6F, 0x6D96, 0x6DAC,
+ 0x6DCF, 0x6DF8, 0x6DF2, 0x6DFC, 0x6E39, 0x6E5C, 0x6E27, 0x6E3C,
+ 0x6EBF, 0x6F88, 0x6FB5, 0x6FF5, 0x7005, 0x7007, 0x7028, 0x7085,
+ 0x70AB, 0x710F, 0x7104, 0x715C, 0x7146, 0x7147, 0xFA15, 0x71C1,
+ 0x71FE, 0x72B1, 0x72BE, 0x7324, 0xFA16, 0x7377, 0x73BD, 0x73C9,
+ 0x73D6, 0x73E3, 0x73D2, 0x7407, 0x73F5, 0x7426, 0x742A, 0x7429,
+ 0x742E, 0x7462, 0x7489, 0x749F, 0x7501, 0x756F, 0x7682, 0x769C,
+ 0x769E, 0x769B, 0x76A6, 0xFA17, 0x7746, 0x52AF, 0x7821, 0x784E,
+ 0x7864, 0x787A, 0x7930, 0xFA18, 0xFA19, 0xFA1A, 0x7994, 0xFA1B,
+ 0x799B, 0x7AD1, 0x7AE7, 0xFA1C, 0x7AEB, 0x7B9E, 0xFA1D, 0x7D48,
+ 0x7D5C, 0x7DB7, 0x7DA0, 0x7DD6, 0x7E52, 0x7F47, 0x7FA1, 0xFA1E,
+ 0x8301, 0x8362, 0x837F, 0x83C7, 0x83F6, 0x8448, 0x84B4, 0x8553,
+ 0x8559, 0x856B, 0xFA1F, 0x85B0, 0xFA20, 0xFA21, 0x8807, 0x88F5,
+ 0x8A12, 0x8A37, 0x8A79, 0x8AA7, 0x8ABE, 0x8ADF, 0xFA22, 0x8AF6,
+ 0x8B53, 0x8B7F, 0x8CF0, 0x8CF4, 0x8D12, 0x8D76, 0xFA23, 0x8ECF,
+ 0xFA24, 0xFA25, 0x9067, 0x90DE, 0xFA26, 0x9115, 0x9127, 0x91DA,
+ 0x91D7, 0x91DE, 0x91ED, 0x91EE, 0x91E4, 0x91E5, 0x9206, 0x9210,
+ 0x920A, 0x923A, 0x9240, 0x923C, 0x924E, 0x9259, 0x9251, 0x9239,
+ 0x9267, 0x92A7, 0x9277, 0x9278, 0x92E7, 0x92D7, 0x92D9, 0x92D0,
+ 0xFA27, 0x92D5, 0x92E0, 0x92D3, 0x9325, 0x9321, 0x92FB, 0xFA28,
+ 0x931E, 0x92FF, 0x931D, 0x9302, 0x9370, 0x9357, 0x93A4, 0x93C6,
+ 0x93DE, 0x93F8, 0x9431, 0x9445, 0x9448, 0x9592, 0xF9DC, 0xFA29,
+ 0x969D, 0x96AF, 0x9733, 0x973B, 0x9743, 0x974D, 0x974F, 0x9751,
+ 0x9755, 0x9857, 0x9865, 0xFA2A, 0xFA2B, 0x9927, 0xFA2C, 0x999E,
+ 0x9A4E, 0x9AD9, 0x9ADC, 0x9B75, 0x9B72, 0x9B8F, 0x9BB1, 0x9BBB,
+ 0x9C00, 0x9D70, 0x9D6B, 0xFA2D, 0x9E19, 0x9ED1, 0x00AC, 0x005C,
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
+ 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
+ 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
+ 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
+ 0x0058, 0x0059, 0x005A, 0x005B, 0x00A5, 0x005D, 0x005E, 0x005F,
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
+ 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
+ 0x0078, 0x0079, 0x007A, 0x007B, 0x00A6, 0x007D, 0x0303, 0x02BC,
+ 0x005C, 0x02BB, 0x007C, 0x007E, 0x00A1, 0x00A2, 0x00A3, 0x2044,
+ 0x0192, 0x00A7, 0x00A4, 0x201C, 0x00AB, 0x2039, 0x203A, 0xFB01,
+ 0xFB02, 0x2012, 0x2020, 0x2021, 0x00B7, 0x00B6, 0x2022, 0x201A,
+ 0x201E, 0x201D, 0x00BB, 0x2026, 0x2030, 0x00BF, 0x0301, 0x0302,
+ 0x00AF, 0x0306, 0x0307, 0x0308, 0x030A, 0x00B8, 0x030B, 0x0328,
+ 0x030C, 0x0336, 0x00C6, 0x00AA, 0x0141, 0x00D8, 0x0152, 0x00BA,
+ 0x00E6, 0x0131, 0x0142, 0x00F8, 0x0153, 0x00DF, 0x002D, 0x00A9,
+ 0x00AC, 0x00AE, 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B5, 0x00B9,
+ 0x00BC, 0x00BD, 0x00BE, 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4,
+ 0x00C5, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD,
+ 0x00CE, 0x00CF, 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5,
+ 0x00D6, 0x00D7, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE,
+ 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E7, 0x00E8,
+ 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, 0x00F0,
+ 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, 0x00F9,
+ 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF, 0x0160, 0x0178,
+ 0x017D, 0x0305, 0x0161, 0x2122, 0x017E, 0x0030, 0x2002, 0x0021,
+ 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029,
+ 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, 0x0030, 0x0031,
+ 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039,
+ 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, 0x0040, 0x0041,
+ 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049,
+ 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051,
+ 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059,
+ 0x005A, 0x005B, 0x00A5, 0x005D, 0x005E, 0x005F, 0x0060, 0x0061,
+ 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069,
+ 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, 0x0070, 0x0071,
+ 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079,
+ 0x007A, 0x007B, 0x007C, 0x007D, 0x203E, 0xFF40, 0x2032, 0x00A8,
+ 0x2036, 0x00C4, 0x00F9, 0x00E9, 0x00ED, 0x00DF, 0x00E7, 0x00C7,
+ 0x00D1, 0x00F1, 0x00A2, 0x00A3, 0x00F3, 0x00FA, 0x00A1, 0x00BF,
+ 0x00BD, 0x00D6, 0x00DC, 0x00E4, 0x00EB, 0x00EF, 0x00F6, 0x00DC,
+ 0x00E2, 0x00EA, 0x00EE, 0x00F4, 0x00FC, 0x00E0, 0x00E9, 0x00E1,
+ 0x007E, 0x0030, 0x00AC, 0x005C, 0xFF60, 0xFF61, 0xFF62, 0xFF63,
+ 0xFF64, 0xFF65, 0xFF66, 0xFF67, 0xFF68, 0xFF69, 0xFF6A, 0xFF6B,
+ 0xFF6C, 0xFF6D, 0xFF6E, 0xFF6F, 0xFF70, 0xFF71, 0xFF72, 0xFF73,
+ 0xFF74, 0xFF75, 0xFF76, 0xFF77, 0xFF78, 0xFF79, 0xFF7A, 0xFF7B,
+ 0xFF7C, 0xFF7D, 0xFF7E, 0xFF7F, 0xFF80, 0xFF81, 0xFF82, 0xFF83,
+ 0xFF84, 0xFF85, 0xFF86, 0xFF87, 0xFF88, 0xFF89, 0xFF8A, 0xFF8B,
+ 0xFF8C, 0xFF8D, 0xFF8E, 0xFF8F, 0xFF90, 0xFF91, 0xFF92, 0xFF93,
+ 0xFF94, 0xFF95, 0xFF96, 0xFF97, 0xFF98, 0xFF99, 0xFF9A, 0xFF9B,
+ 0xFF9C, 0xFF9D, 0xFF9E, 0xFF9F, 0x30F0, 0x30F1, 0x30EE, 0x30AB,
+ 0x30B1, 0x30F4, 0x30AC, 0x30AE, 0x30B0, 0x30B2, 0x30B4, 0x30B6,
+ 0x30B8, 0x30BA, 0x30BC, 0x30BE, 0x30C0, 0x30C2, 0x30C5, 0x30C7,
+ 0x30C9, 0x30D0, 0x30D1, 0x30D3, 0x30D4, 0x30D6, 0x30D7, 0x30D9,
+ 0x30DA, 0x30DC, 0x30DD, 0xFF60, 0x3092, 0x3041, 0x3043, 0x3045,
+ 0x3047, 0x3049, 0x3083, 0x3085, 0x3087, 0x3063, 0x3042, 0x3044,
+ 0x3046, 0x3048, 0x304A, 0x304B, 0x304D, 0x304F, 0x3051, 0x3053,
+ 0x3055, 0x3057, 0x3059, 0x305B, 0x305D, 0x305F, 0x3061, 0x3064,
+ 0x3066, 0x3068, 0x306A, 0x306B, 0x306C, 0x306D, 0x306E, 0x306F,
+ 0x3072, 0x3075, 0x3078, 0x307B, 0x307E, 0x307F, 0x3080, 0x3081,
+ 0x3082, 0x3084, 0x3086, 0x3088, 0x3089, 0x308A, 0x308B, 0x308C,
+ 0x308D, 0x308F, 0x3093, 0x3090, 0x3091, 0x308E, 0x304C, 0x304E,
+ 0x3050, 0x3052, 0x3054, 0x3056, 0x3068, 0x305A, 0x305C, 0x305E,
+ 0x3060, 0x3062, 0x3065, 0x3067, 0x3069, 0x3070, 0x3071, 0x3073,
+ 0x3074, 0x3076, 0x3077, 0x3079, 0x307A, 0x307C, 0x307D, 0x301D,
+ 0x301E, 0x005B, 0x005D, 0x3008, 0x3009, 0x300A, 0x300B, 0x300E,
+ 0x300F, 0x3010, 0x3011, 0x2012, 0xFF60, 0x2500, 0x2501, 0x2502,
+ 0x2503, 0x2504, 0x2505, 0x2506, 0x2507, 0x2508, 0x2509, 0x250A,
+ 0x250B, 0x250C, 0x250D, 0x250E, 0x250F, 0x2510, 0x2511, 0x2512,
+ 0x2513, 0x2514, 0x2515, 0x2516, 0x2517, 0x2518, 0x2519, 0x251A,
+ 0x251B, 0x251C, 0x251D, 0x251E, 0x251F, 0x2520, 0x2521, 0x2522,
+ 0x2523, 0x2524, 0x2525, 0x2526, 0x2527, 0x2528, 0x2529, 0x252A,
+ 0x252B, 0x252C, 0x252D, 0x252E, 0x252F, 0x2530, 0x2531, 0x2532,
+ 0x2533, 0x2534, 0x2535, 0x2536, 0x2537, 0x2538, 0x2539, 0x253A,
+ 0x253B, 0x253C, 0x253D, 0x253E, 0x253F, 0x2540, 0x2541, 0x2542,
+ 0x2543, 0x2544, 0x2545, 0x2546, 0x2547, 0x2548, 0x2549, 0x254A,
+ 0x254B, 0x25B2, 0x20AC, 0x2126, 0x2032, 0x2033, 0xFB00, 0xFB03,
+ 0xFB04, 0x0101, 0x012B, 0x016B, 0x0113, 0x014D, 0x0100, 0x012A,
+ 0x016A, 0x0112, 0x014C, 0x215B, 0x215C, 0x215D, 0x215E, 0x2153,
+ 0x2154, 0x2070, 0x2074, 0x2075, 0x2076, 0x2077, 0x2078, 0x2079,
+ 0x2080, 0x2081, 0x2082, 0x2083, 0x2084, 0x2085, 0x2086, 0x2087,
+ 0x2088, 0x2089, 0x01CD, 0x011A, 0x0000, 0x1EBC, 0x01CF, 0x0000,
+ 0x0128, 0x01D1, 0x0000, 0x01D3, 0x016E, 0x0168, 0x01CE, 0x011B,
+ 0x0000, 0x1EBD, 0x01D0, 0x0000, 0x0129, 0x01D2, 0x0000, 0x01D4,
+ 0x016F, 0x0169, 0x0251, 0x0251, 0x0251, 0x01FD, 0x00E6, 0x0254,
+ 0x0254, 0x0254, 0x0259, 0x0259, 0x0259, 0x025A, 0x025A, 0x025A,
+ 0x025B, 0x025B, 0x025B, 0x006A, 0x014B, 0x0275, 0x028C, 0x028C,
+ 0x028C, 0x0292, 0x0283, 0x02D0, 0x0020, 0x0021, 0x0022, 0x0023,
+ 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B,
+ 0x002C, 0x002D, 0x002E, 0x002F, 0x0030, 0x0031, 0x0032, 0x0033,
+ 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B,
+ 0x003C, 0x003D, 0x003E, 0x003F, 0x0040, 0x0041, 0x0042, 0x0043,
+ 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B,
+ 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052, 0x0053,
+ 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B,
+ 0x00A5, 0x005D, 0x005E, 0x005F, 0x0060, 0x0061, 0x0062, 0x0063,
+ 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B,
+ 0x006C, 0x006D, 0x006E, 0x006F, 0x0070, 0x0071, 0x0072, 0x0073,
+ 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B,
+ 0x00A6, 0x007D, 0x0303, 0x02BC, 0x005C, 0x02BB, 0x007C, 0x007E,
+ 0x00A1, 0x00A2, 0x00A3, 0x2044, 0x0192, 0x00A7, 0x00A4, 0x201C,
+ 0x00AB, 0x2039, 0x203A, 0xFB01, 0xFB02, 0x2012, 0x2020, 0x2021,
+ 0x00B7, 0x00B6, 0x2022, 0x201A, 0x201E, 0x201D, 0x00BB, 0x2026,
+ 0x2030, 0x00BF, 0x0301, 0x0302, 0x00AF, 0x0306, 0x0307, 0x0308,
+ 0x030A, 0x00B8, 0x030B, 0x0328, 0x030C, 0x0336, 0x00C6, 0x00AA,
+ 0x0141, 0x00D8, 0x0152, 0x00BA, 0x00E6, 0x0131, 0x0142, 0x00F8,
+ 0x0153, 0x00DF, 0x002D, 0x00A9, 0x00AC, 0x00AE, 0x00B0, 0x00B1,
+ 0x00B2, 0x00B3, 0x00B5, 0x00B9, 0x00BC, 0x00BD, 0x00BE, 0x00C0,
+ 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C7, 0x00C8, 0x00C9,
+ 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, 0x00D0, 0x00D1,
+ 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, 0x00D9, 0x00DA,
+ 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00E0, 0x00E1, 0x00E2, 0x00E3,
+ 0x00E4, 0x00E5, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC,
+ 0x00ED, 0x00EE, 0x00EF, 0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4,
+ 0x00F5, 0x00F6, 0x00F7, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD,
+ 0x00FE, 0x00FF, 0x0160, 0x0178, 0x017D, 0x0305, 0x0161, 0x2122,
+ 0x017E, 0x0030, 0x20AC, 0x2126, 0x2032, 0x2033, 0xFB00, 0xFB03,
+ 0xFB04, 0x0101, 0x012B, 0x016B, 0x0113, 0x014D, 0x0100, 0x012A,
+ 0x016A, 0x0112, 0x014C, 0x215B, 0x215C, 0x215D, 0x215E, 0x2153,
+ 0x2154, 0x2070, 0x2074, 0x2075, 0x2076, 0x2077, 0x2078, 0x2079,
+ 0x2080, 0x2081, 0x2082, 0x2083, 0x2084, 0x2085, 0x2086, 0x2087,
+ 0x2088, 0x2089, 0x01CD, 0x011A, 0x0000, 0x1EBC, 0x01CF, 0x0000,
+ 0x0128, 0x01D1, 0x0000, 0x01D3, 0x016E, 0x0168, 0x01CE, 0x011B,
+ 0x0000, 0x1EBD, 0x01D0, 0x0000, 0x0129, 0x01D2, 0x0000, 0x01D4,
+ 0x016F, 0x0169, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035,
+ 0x0036, 0x0037, 0x0038, 0x0039, 0x0336, 0x002D, 0x003D, 0x002C,
+ 0x0028, 0x0029, 0x002E, 0x002F, 0x003A, 0x003B, 0x0030, 0x0031,
+ 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039,
+ 0x0336, 0x002D, 0x003D, 0x002C, 0x0028, 0x0029, 0x002E, 0x002F,
+ 0x003A, 0x003B, 0x00B7, 0x20AC, 0x0000, 0x2153, 0x2154, 0x00BE,
+ 0x2155, 0x2156, 0x2157, 0x2158, 0x2159, 0x215A, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x215B, 0x215C, 0x215D, 0x215E,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
+ 0x0038, 0x0039, 0x0030, 0x2163, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2170, 0x2171,
+ 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, 0x2177, 0x2178, 0x2179,
+ 0x217A, 0x217B, 0x0000, 0x0000, 0x0000, 0x2160, 0x2161, 0x2162,
+ 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, 0x216A,
+ 0x216B, 0x0000, 0x0000, 0x0000, 0x0041, 0x0042, 0x0043, 0x0044,
+ 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C,
+ 0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054,
+ 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x3042, 0x3044,
+ 0x3046, 0x3048, 0x304A, 0x304B, 0x304D, 0x304F, 0x3051, 0x3053,
+ 0x3055, 0x3057, 0x3059, 0x305B, 0x305D, 0x305F, 0x3061, 0x3064,
+ 0x3066, 0x3068, 0x306A, 0x306B, 0x306C, 0x306D, 0x306E, 0x306F,
+ 0x3072, 0x3075, 0x3078, 0x307B, 0x307E, 0x307F, 0x3080, 0x3081,
+ 0x3082, 0x3084, 0x3086, 0x3088, 0x3089, 0x308A, 0x308B, 0x308C,
+ 0x308D, 0x308F, 0x3090, 0x3091, 0x3092, 0x3093, 0x30A2, 0x30A4,
+ 0x30A6, 0x30A8, 0x30AA, 0x30AB, 0x30AD, 0x30AF, 0x30B1, 0x30B3,
+ 0x30B5, 0x30B7, 0x30B9, 0x30BB, 0x30BD, 0x30BF, 0x30C1, 0x30C4,
+ 0x30C6, 0x30C8, 0x30CA, 0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF,
+ 0x30D2, 0x30D5, 0x30D8, 0x30DB, 0x30DE, 0x30DF, 0x30E0, 0x30E1,
+ 0x30E2, 0x30E4, 0x30E6, 0x30E8, 0x30E9, 0x30EA, 0x30EB, 0x30EC,
+ 0x30ED, 0x30EF, 0x30F0, 0x30F1, 0x30F2, 0x30F3, 0x3220, 0x3221,
+ 0x3222, 0x3223, 0x3224, 0x3225, 0x3226, 0x3227, 0x3228, 0x3229,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x55B6, 0x5408, 0x6CEB, 0x554F, 0x7B54, 0x4F8B,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
+ 0x0038, 0x0039, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035,
+ 0x0036, 0x0037, 0x0038, 0x0039, 0x3063, 0x624D, 0x3007, 0x4E00,
+ 0x4E8C, 0x4E09, 0x56DB, 0x4E94, 0x516D, 0x4E03, 0x516B, 0x4E5D,
+ 0x5341, 0x3007, 0x4E00, 0x4E8C, 0x4E09, 0x56DB, 0x4E94, 0x516D,
+ 0x4E03, 0x516B, 0x4E5D, 0x5341, 0x3007, 0x4E00, 0x4E8C, 0x4E09,
+ 0x56DB, 0x4E94, 0x516D, 0x4E03, 0x516B, 0x4E5D, 0x3064, 0x624D,
+ 0x4E00, 0x4E8C, 0x4E09, 0x56DB, 0x4E94, 0x516D, 0x4E03, 0x516B,
+ 0x4E5D, 0x5341, 0x3007, 0x4E00, 0x4E8C, 0x4E09, 0x56DB, 0x4E94,
+ 0x516D, 0x4E03, 0x516B, 0x4E5D, 0x5341, 0x30B3, 0x3063, 0x30C3,
+ 0x30A9, 0x0000, 0x0000, 0x2460, 0x2461, 0x2462, 0x2463, 0x2464,
+ 0x2465, 0x2466, 0x2467, 0x2468, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x24D0, 0x24D1, 0x24D2, 0x24D3, 0x24D4, 0x24D5, 0x24D6,
+ 0x24D7, 0x24D8, 0x24D9, 0x24DA, 0x24DB, 0x24DC, 0x24DD, 0x24DE,
+ 0x24DF, 0x24E0, 0x24E1, 0x24E2, 0x24E3, 0x24E4, 0x24E5, 0x24E6,
+ 0x24E7, 0x24E8, 0x24E9, 0x24B6, 0x24B7, 0x24B8, 0x24B9, 0x24BA,
+ 0x24BB, 0x24BC, 0x24BD, 0x24BE, 0x24BF, 0x24C0, 0x24C1, 0x24C2,
+ 0x24C3, 0x24C4, 0x24C5, 0x24C6, 0x24C7, 0x24C8, 0x24C9, 0x24CA,
+ 0x24CB, 0x24CC, 0x24CD, 0x24CE, 0x24CF, 0x3042, 0x3044, 0x3046,
+ 0x3048, 0x304A, 0x304B, 0x304D, 0x304F, 0x3051, 0x3053, 0x3055,
+ 0x3057, 0x3059, 0x305B, 0x305D, 0x305F, 0x3061, 0x3064, 0x3066,
+ 0x3068, 0x306A, 0x306B, 0x306C, 0x306D, 0x306E, 0x306F, 0x3072,
+ 0x3075, 0x3078, 0x307B, 0x307E, 0x307F, 0x3080, 0x3081, 0x3082,
+ 0x3084, 0x3086, 0x3088, 0x3089, 0x308A, 0x308B, 0x308C, 0x308D,
+ 0x308F, 0x3090, 0x3091, 0x3092, 0x3093, 0x32D0, 0x32D1, 0x32D2,
+ 0x32D3, 0x32D4, 0x32D5, 0x32D6, 0x32D7, 0x32D8, 0x32D9, 0x32DA,
+ 0x32DB, 0x32DC, 0x32DD, 0x32DE, 0x32DF, 0x32E0, 0x32E1, 0x32E2,
+ 0x32E3, 0x32E4, 0x32E5, 0x32E6, 0x32E7, 0x32E8, 0x32E9, 0x32EA,
+ 0x32EB, 0x32EC, 0x32ED, 0x32EE, 0x32EF, 0x32F0, 0x32F1, 0x32F2,
+ 0x32F3, 0x32F4, 0x32F5, 0x32F6, 0x32F7, 0x32F8, 0x32F9, 0x32FA,
+ 0x32FB, 0x32FC, 0x32FD, 0x32FE, 0x30F3, 0x3280, 0x3281, 0x3282,
+ 0x3283, 0x3284, 0x3285, 0x3286, 0x3287, 0x3288, 0x3289, 0x3290,
+ 0x328A, 0x328B, 0x328C, 0x328D, 0x328E, 0x328F, 0x8ABF, 0x329F,
+ 0x526F, 0x6E1B, 0x6A19, 0x6B20, 0x57FA, 0x7981, 0x32A0, 0x32A1,
+ 0x329B, 0x329A, 0x32A3, 0x32A2, 0x3297, 0x51FA, 0x329C, 0x3295,
+ 0x6E08, 0x5897, 0x554F, 0x7B54, 0x4F8B, 0x96FB, 0x25CC, 0x0030,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0061, 0x0062, 0x0063,
+ 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B,
+ 0x006C, 0x006D, 0x006E, 0x006F, 0x0070, 0x0071, 0x0072, 0x0073,
+ 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x0041,
+ 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049,
+ 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051,
+ 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059,
+ 0x005A, 0x3042, 0x3044, 0x3046, 0x3048, 0x304A, 0x304B, 0x304D,
+ 0x304F, 0x3051, 0x3053, 0x3055, 0x3057, 0x3059, 0x305B, 0x305D,
+ 0x305F, 0x3061, 0x3064, 0x3066, 0x3068, 0x306A, 0x306B, 0x306C,
+ 0x306D, 0x306E, 0x306F, 0x3072, 0x3075, 0x3078, 0x307B, 0x307E,
+ 0x307F, 0x3080, 0x3081, 0x3082, 0x3084, 0x3086, 0x3088, 0x3089,
+ 0x308A, 0x308B, 0x308C, 0x308D, 0x308F, 0x3090, 0x3091, 0x3092,
+ 0x3093, 0x30A2, 0x30A4, 0x30A6, 0x30A8, 0x30AA, 0x30AB, 0x30AD,
+ 0x30AF, 0x30B1, 0x30B3, 0x30B5, 0x30B7, 0x30B9, 0x30BB, 0x30BD,
+ 0x30BF, 0x30C1, 0x30C4, 0x30C6, 0x30C8, 0x30CA, 0x30CB, 0x30CC,
+ 0x30CD, 0x30CE, 0x30CF, 0x30D2, 0x30D5, 0x30D8, 0x30DB, 0x30DE,
+ 0x30DF, 0x30E0, 0x30E1, 0x30E2, 0x30E4, 0x30E6, 0x30E8, 0x30E9,
+ 0x30EA, 0x30EB, 0x30EC, 0x30ED, 0x30EF, 0x30F0, 0x30F1, 0x30F2,
+ 0x30F3, 0x65E5, 0x6708, 0x706B, 0x6C34, 0x6728, 0x91D1, 0x571F,
+ 0x554F, 0x7B54, 0x4F8B, 0x25CF, 0x0030, 0x0000, 0x0031, 0x0000,
+ 0x0032, 0x0000, 0x0033, 0x0000, 0x0034, 0x0000, 0x0035, 0x0000,
+ 0x0036, 0x0000, 0x0037, 0x0000, 0x0038, 0x0000, 0x0039, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065,
+ 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D,
+ 0x006E, 0x006F, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075,
+ 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x0041, 0x0042, 0x0043,
+ 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B,
+ 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052, 0x0053,
+ 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x3042,
+ 0x3044, 0x3046, 0x3048, 0x304A, 0x304B, 0x304D, 0x304F, 0x3051,
+ 0x3053, 0x3055, 0x3057, 0x3059, 0x305B, 0x305D, 0x305F, 0x3061,
+ 0x3064, 0x3066, 0x3068, 0x306A, 0x306B, 0x306C, 0x306D, 0x306E,
+ 0x306F, 0x3072, 0x3075, 0x3078, 0x307B, 0x307E, 0x307F, 0x3080,
+ 0x3081, 0x3082, 0x3084, 0x3086, 0x3088, 0x3089, 0x308A, 0x308B,
+ 0x308C, 0x308D, 0x308F, 0x3090, 0x3091, 0x3092, 0x3093, 0x30A2,
+ 0x30A4, 0x30A6, 0x30A8, 0x30AA, 0x30AB, 0x30AD, 0x30AF, 0x30B1,
+ 0x30B3, 0x30B5, 0x30B7, 0x30B9, 0x30BB, 0x30BD, 0x30BF, 0x30C1,
+ 0x30C4, 0x30C6, 0x30C8, 0x30CA, 0x30CB, 0x30CC, 0x30CD, 0x30CE,
+ 0x30CF, 0x30D2, 0x30D5, 0x30D8, 0x30DB, 0x30DE, 0x30DF, 0x30E0,
+ 0x30E1, 0x30E2, 0x30E4, 0x30E6, 0x30E8, 0x30E9, 0x30EA, 0x30EB,
+ 0x30EC, 0x30ED, 0x30EF, 0x30F0, 0x30F1, 0x30F2, 0x30F3, 0x65E5,
+ 0x6708, 0x706B, 0x6C34, 0x6728, 0x91D1, 0x571F, 0x8CA0, 0x52DD,
+ 0x554F, 0x7B54, 0x4F8B, 0x25A1, 0x25A1, 0x0030, 0x0000, 0x0031,
+ 0x0000, 0x0032, 0x0000, 0x0033, 0x0000, 0x0034, 0x0000, 0x0035,
+ 0x0000, 0x0036, 0x0000, 0x0037, 0x0000, 0x0038, 0x0000, 0x0039,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0061, 0x0062, 0x0063, 0x0064,
+ 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C,
+ 0x006D, 0x006E, 0x006F, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074,
+ 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x0041, 0x0042,
+ 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A,
+ 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052,
+ 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A,
+ 0x3042, 0x3044, 0x3046, 0x3048, 0x304A, 0x304B, 0x304D, 0x304F,
+ 0x3051, 0x3053, 0x3055, 0x3057, 0x3059, 0x305B, 0x305D, 0x305F,
+ 0x3061, 0x3064, 0x3066, 0x3068, 0x306A, 0x306B, 0x306C, 0x306D,
+ 0x306E, 0x306F, 0x3072, 0x3075, 0x3078, 0x307B, 0x307E, 0x307F,
+ 0x3080, 0x3081, 0x3082, 0x3084, 0x3086, 0x3088, 0x3089, 0x308A,
+ 0x308B, 0x308C, 0x308D, 0x308F, 0x3090, 0x3091, 0x3092, 0x3093,
+ 0x30A2, 0x30A4, 0x30A6, 0x30A8, 0x30AA, 0x30AB, 0x30AD, 0x30AF,
+ 0x30B1, 0x30B3, 0x30B5, 0x30B7, 0x30B9, 0x30BB, 0x30BD, 0x30BF,
+ 0x30C1, 0x30C4, 0x30C6, 0x30C8, 0x30CA, 0x30CB, 0x30CC, 0x30CD,
+ 0x30CE, 0x30CF, 0x30D2, 0x30D5, 0x30D8, 0x30DB, 0x30DE, 0x30DF,
+ 0x30E0, 0x30E1, 0x30E2, 0x30E4, 0x30E6, 0x30E8, 0x30E9, 0x30EA,
+ 0x30EB, 0x30EC, 0x30ED, 0x30EF, 0x30F0, 0x30F1, 0x30F2, 0x30F3,
+ 0x65E5, 0x6708, 0x706B, 0x6C34, 0x6728, 0x91D1, 0x571F, 0x554F,
+ 0x7B54, 0x4F8B, 0x25A0, 0x0030, 0x0000, 0x0031, 0x0000, 0x0032,
+ 0x0000, 0x0033, 0x0000, 0x0034, 0x0000, 0x0035, 0x0000, 0x0036,
+ 0x0000, 0x0037, 0x0000, 0x0038, 0x0000, 0x0039, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066,
+ 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E,
+ 0x006F, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076,
+ 0x0077, 0x0078, 0x0079, 0x007A, 0x0041, 0x0042, 0x0043, 0x0044,
+ 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C,
+ 0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054,
+ 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x3042, 0x3044,
+ 0x3046, 0x3048, 0x304A, 0x304B, 0x304D, 0x304F, 0x3051, 0x3053,
+ 0x3055, 0x3057, 0x3059, 0x305B, 0x305D, 0x305F, 0x3061, 0x3064,
+ 0x3066, 0x3068, 0x306A, 0x306B, 0x306C, 0x306D, 0x306E, 0x306F,
+ 0x3072, 0x3075, 0x3078, 0x307B, 0x307E, 0x307F, 0x3080, 0x3081,
+ 0x3082, 0x3084, 0x3086, 0x3088, 0x3089, 0x308A, 0x308B, 0x308C,
+ 0x308D, 0x308F, 0x3090, 0x3091, 0x3092, 0x3093, 0x30A2, 0x30A4,
+ 0x30A6, 0x30A8, 0x30AA, 0x30AB, 0x30AD, 0x30AF, 0x30B1, 0x30B3,
+ 0x30B5, 0x30B7, 0x30B9, 0x30BB, 0x30BD, 0x30BF, 0x30C1, 0x30C4,
+ 0x30C6, 0x30C8, 0x30CA, 0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF,
+ 0x30D2, 0x30D5, 0x30D8, 0x30DB, 0x30DE, 0x30DF, 0x30E0, 0x30E1,
+ 0x30E2, 0x30E4, 0x30E6, 0x30E8, 0x30E9, 0x30EA, 0x30EB, 0x30EC,
+ 0x30ED, 0x30EF, 0x30F0, 0x30F1, 0x30F2, 0x30F3, 0x65E5, 0x6708,
+ 0x706B, 0x6C34, 0x6728, 0x91D1, 0x571F, 0x554F, 0x7B54, 0x4F8B,
+ 0x0030, 0x0000, 0x0031, 0x0000, 0x0032, 0x0000, 0x0033, 0x0000,
+ 0x0034, 0x0000, 0x0035, 0x0000, 0x0036, 0x0000, 0x0037, 0x0000,
+ 0x0038, 0x0000, 0x0039, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0061,
+ 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069,
+ 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, 0x0070, 0x0071,
+ 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079,
+ 0x007A, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
+ 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
+ 0x0058, 0x0059, 0x005A, 0x3042, 0x3044, 0x3046, 0x3048, 0x304A,
+ 0x304B, 0x304D, 0x304F, 0x3051, 0x3053, 0x3055, 0x3057, 0x3059,
+ 0x305B, 0x305D, 0x305F, 0x3061, 0x3064, 0x3066, 0x3068, 0x306A,
+ 0x306B, 0x306C, 0x306D, 0x306E, 0x306F, 0x3072, 0x3075, 0x3078,
+ 0x307B, 0x307E, 0x307F, 0x3080, 0x3081, 0x3082, 0x3084, 0x3086,
+ 0x3088, 0x3089, 0x308A, 0x308B, 0x308C, 0x308D, 0x308F, 0x3090,
+ 0x3091, 0x3092, 0x3093, 0x30A2, 0x30A4, 0x30A6, 0x30A8, 0x30AA,
+ 0x30AB, 0x30AD, 0x30AF, 0x30B1, 0x30B3, 0x30B5, 0x30B7, 0x30B9,
+ 0x30BB, 0x30BD, 0x30BF, 0x30C1, 0x30C4, 0x30C6, 0x30C8, 0x30CA,
+ 0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF, 0x30D2, 0x30D5, 0x30D8,
+ 0x30DB, 0x30DE, 0x30DF, 0x30E0, 0x30E1, 0x30E2, 0x30E4, 0x30E6,
+ 0x30E8, 0x30E9, 0x30EA, 0x30EB, 0x30EC, 0x30ED, 0x30EF, 0x30F0,
+ 0x30F1, 0x30F2, 0x30F3, 0x65E5, 0x6708, 0x706B, 0x6C34, 0x6728,
+ 0x91D1, 0x571F, 0x554F, 0x7B54, 0x4F8B, 0x25A0, 0x33C2, 0x33CD,
+ 0x2116, 0x0000, 0x33D8, 0x33DA, 0x2121, 0x2122, 0x0000, 0x2100,
+ 0x33C2, 0x0000, 0x33C4, 0x2105, 0x3397, 0x3371, 0x3398, 0x2113,
+ 0x338D, 0x339B, 0x3396, 0x0000, 0x0000, 0x33D7, 0x33D8, 0x0000,
+ 0x0000, 0x0000, 0x3301, 0x3302, 0x3304, 0x3306, 0x0000, 0x3308,
+ 0x0000, 0x3307, 0x330A, 0x0000, 0x3309, 0x0000, 0x330B, 0x0000,
+ 0x330C, 0x330E, 0x330F, 0x3310, 0x3311, 0x3312, 0x3313, 0x0000,
+ 0x3317, 0x0000, 0x3319, 0x0000, 0x331A, 0x331B, 0x331C, 0x331D,
+ 0x331F, 0x3320, 0x3321, 0x3324, 0x0000, 0x3325, 0x0000, 0x0000,
+ 0x3328, 0x3329, 0x0000, 0x332D, 0x0000, 0x0000, 0x332E, 0x332F,
+ 0x3330, 0x3332, 0x0000, 0x0000, 0x3334, 0x3335, 0x333C, 0x0000,
+ 0x0000, 0x0000, 0x3337, 0x0000, 0x3338, 0x333A, 0x333D, 0x3341,
+ 0x333E, 0x333F, 0x3340, 0x3343, 0x3344, 0x3345, 0x3346, 0x3348,
+ 0x334B, 0x334C, 0x334F, 0x3350, 0x0000, 0x0000, 0x3352, 0x3354,
+ 0x0000, 0x0000, 0x3353, 0x3355, 0x3356, 0x0000, 0x3301, 0x3302,
+ 0x3304, 0x3306, 0x0000, 0x3308, 0x0000, 0x3307, 0x330A, 0x0000,
+ 0x3309, 0x0000, 0x330B, 0x0000, 0x330C, 0x330E, 0x330F, 0x3310,
+ 0x3311, 0x3312, 0x3313, 0x0000, 0x3317, 0x0000, 0x3319, 0x0000,
+ 0x331A, 0x331B, 0x331C, 0x331D, 0x331F, 0x3320, 0x3321, 0x3324,
+ 0x0000, 0x3325, 0x0000, 0x0000, 0x3328, 0x3329, 0x0000, 0x332D,
+ 0x0000, 0x0000, 0x332E, 0x332F, 0x3330, 0x3332, 0x0000, 0x0000,
+ 0x3334, 0x3335, 0x333C, 0x0000, 0x0000, 0x0000, 0x3337, 0x0000,
+ 0x3338, 0x333A, 0x333D, 0x3341, 0x333E, 0x333F, 0x3340, 0x3343,
+ 0x3344, 0x3345, 0x3346, 0x3348, 0x334B, 0x334C, 0x334F, 0x3350,
+ 0x0000, 0x0000, 0x3352, 0x3354, 0x0000, 0x0000, 0x3353, 0x3355,
+ 0x3356, 0x337E, 0x337D, 0x337C, 0x337B, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x002D,
+ 0x003D, 0x2103, 0x2640, 0x2642, 0x3013, 0x3012, 0x300C, 0x300D,
+ 0x300E, 0x300F, 0x301A, 0x301B, 0x3018, 0x3019, 0xFF08, 0xFF09,
+ 0x301D, 0x301E, 0x2018, 0x2019, 0x201C, 0x201D, 0x0027, 0x0022,
+ 0x0000, 0x2135, 0x03D0, 0x220A, 0x210F, 0x00B5, 0x03C6, 0x03DB,
+ 0x03D1, 0xFFFD, 0x2668, 0x2669, 0x266C, 0xFF1A, 0x00A9, 0x00A9,
+ 0x00AE, 0x00AE, 0x303B, 0x303B, 0x3033, 0x3034, 0x3035, 0x203C,
+ 0x2049, 0x0021, 0x203C, 0x2049, 0x244A, 0x0000, 0x2213, 0x2260,
+ 0x2243, 0x2272, 0x2273, 0x300C, 0x300D, 0x300E, 0x300F, 0x301A,
+ 0x301B, 0x3018, 0x3019, 0xFF5F, 0xFF60, 0x300C, 0x300D, 0x300E,
+ 0x300F, 0x301A, 0x301B, 0x3018, 0x3019, 0xFF5F, 0xFF60, 0x239B,
+ 0x239D, 0x239E, 0x23A0, 0x239D, 0x239B, 0x23A0, 0x239E, 0x23A1,
+ 0x23A3, 0x23A4, 0x23A6, 0x23A3, 0x23A1, 0x23A6, 0x23A4, 0x23A1,
+ 0x23A3, 0x23A4, 0x23A6, 0x23A3, 0x23A1, 0x23A6, 0x23A4, 0xFF5C,
+ 0x2015, 0x301D, 0x301E, 0x2018, 0x2019, 0x2018, 0x2019, 0x2702,
+ 0x2702, 0x2702, 0x2702, 0x303D, 0x3012, 0x309F, 0x534D, 0x2207,
+ 0x2205, 0x22A0, 0x2296, 0x2298, 0x2295, 0x2297, 0x229E, 0x2295,
+ 0x0021, 0x25B3, 0x25C0, 0x25B6, 0x21E6, 0x21E8, 0x21E7, 0x21E9,
+ 0x21D0, 0x2194, 0x2198, 0x2199, 0x2196, 0x2197, 0x21CC, 0x21C6,
+ 0x21C4, 0x21C5, 0x2190, 0x2192, 0x2191, 0x2193, 0x2194, 0x2195,
+ 0x2504, 0x2506, 0x3030, 0x2307, 0x3030, 0x2307, 0x3030, 0x2307,
+ 0x3030, 0x2307, 0x3030, 0x2307, 0x2740, 0x273F, 0x25A1, 0x25A0,
+ 0x25A1, 0x25A1, 0x25A1, 0x25A1, 0x25A1, 0x25AB, 0x25A0, 0x25AA,
+ 0x271A, 0x271A, 0x25C7, 0x25C6, 0x25C7, 0x25C7, 0x25C7, 0x25C7,
+ 0x25C7, 0x25C6, 0x25C6, 0x25CE, 0x25C9, 0x25CB, 0x25E6, 0x25CF,
+ 0x2022, 0x2756, 0x2756, 0x2756, 0x2756, 0x3008, 0x3009, 0x3008,
+ 0x3009, 0x300A, 0x300B, 0x300A, 0x300B, 0x3053, 0x3053, 0x30B3,
+ 0x30B3, 0x309D, 0x309E, 0x3041, 0x3042, 0x3043, 0x3044, 0x3045,
+ 0x3046, 0x3047, 0x3048, 0x3049, 0x304A, 0x304B, 0x304B, 0x304C,
+ 0x304D, 0x304E, 0x304F, 0x3050, 0x3051, 0x3051, 0x3052, 0x3053,
+ 0x3053, 0x3054, 0x3055, 0x3056, 0x3057, 0x3058, 0x3059, 0x305A,
+ 0x305B, 0x305C, 0x305D, 0x305E, 0x305F, 0x3060, 0x3061, 0x3062,
+ 0x3063, 0x3064, 0x3065, 0x3066, 0x3067, 0x3068, 0x3069, 0x306A,
+ 0x306B, 0x306C, 0x306D, 0x306E, 0x306F, 0x3070, 0x3071, 0x3072,
+ 0x3073, 0x3074, 0x3075, 0x3076, 0x3077, 0x3078, 0x3079, 0x307A,
+ 0x307B, 0x307C, 0x307D, 0x307E, 0x307F, 0x3080, 0x3081, 0x3082,
+ 0x3083, 0x3084, 0x3085, 0x3086, 0x3087, 0x3088, 0x3089, 0x308A,
+ 0x308B, 0x308C, 0x308D, 0x308E, 0x308F, 0x3090, 0x3091, 0x3092,
+ 0x3093, 0x3094, 0x30FD, 0x30FE, 0x30FC, 0x30A1, 0x30A2, 0x30A3,
+ 0x30A4, 0x30A5, 0x30A6, 0x30A7, 0x30A8, 0x30A9, 0x30AA, 0x30F5,
+ 0x30AB, 0x30AC, 0x30AD, 0x30AE, 0x30AF, 0x30B0, 0x30F6, 0x30B1,
+ 0x30B2, 0x30B3, 0x30B3, 0x30B4, 0x30B5, 0x30B6, 0x30B7, 0x30B8,
+ 0x30B9, 0x30BA, 0x30BB, 0x30BC, 0x30BD, 0x30BE, 0x30BF, 0x30C0,
+ 0x30C1, 0x30C2, 0x30C3, 0x30C4, 0x30C5, 0x30C6, 0x30C7, 0x30C8,
+ 0x30C9, 0x30CA, 0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF, 0x30D0,
+ 0x30D1, 0x30D2, 0x30D3, 0x30D4, 0x30D5, 0x30D6, 0x30D7, 0x30D8,
+ 0x30D9, 0x30DA, 0x30DB, 0x30DC, 0x30DD, 0x30DE, 0x30DF, 0x30E0,
+ 0x30E1, 0x30E2, 0x30E3, 0x30E4, 0x30E5, 0x30E6, 0x30E7, 0x30E8,
+ 0x30E9, 0x30EA, 0x30EB, 0x30EC, 0x30ED, 0x30EE, 0x30EF, 0x30F0,
+ 0x30F1, 0x30F2, 0x30F3, 0x30F4, 0x30F7, 0x30F8, 0x30F9, 0x30FA,
+ 0x309D, 0x309E, 0x3041, 0x3042, 0x3043, 0x3044, 0x3045, 0x3046,
+ 0x3047, 0x3048, 0x3049, 0x304A, 0x304B, 0x304B, 0x304C, 0x304D,
+ 0x304E, 0x304F, 0x3050, 0x3051, 0x3051, 0x3052, 0x3053, 0x3053,
+ 0x3054, 0x3055, 0x3056, 0x3057, 0x3058, 0x3059, 0x305A, 0x305B,
+ 0x305C, 0x305D, 0x305E, 0x305F, 0x3060, 0x3061, 0x3062, 0x3063,
+ 0x3064, 0x3065, 0x3066, 0x3067, 0x3068, 0x3069, 0x306A, 0x306B,
+ 0x306C, 0x306D, 0x306E, 0x306F, 0x3070, 0x3071, 0x3072, 0x3073,
+ 0x3074, 0x3075, 0x3076, 0x3077, 0x3078, 0x3079, 0x307A, 0x307B,
+ 0x307C, 0x307D, 0x307E, 0x307F, 0x3080, 0x3081, 0x3082, 0x3083,
+ 0x3084, 0x3085, 0x3086, 0x3087, 0x3088, 0x3089, 0x308A, 0x308B,
+ 0x308C, 0x308D, 0x308E, 0x308F, 0x3090, 0x3091, 0x3092, 0x3093,
+ 0x3094, 0x30FD, 0x30FE, 0x30FC, 0x30A1, 0x30A2, 0x30A3, 0x30A4,
+ 0x30A5, 0x30A6, 0x30A7, 0x30A8, 0x30A9, 0x30AA, 0x30F5, 0x30AB,
+ 0x30AC, 0x30AD, 0x30AE, 0x30AF, 0x30B0, 0x30F6, 0x30B1, 0x30B2,
+ 0x30B3, 0x30B3, 0x30B4, 0x30B5, 0x30B6, 0x30B7, 0x30B8, 0x30B9,
+ 0x30BA, 0x30BB, 0x30BC, 0x30BD, 0x30BE, 0x30BF, 0x30C0, 0x30C1,
+ 0x30C2, 0x30C3, 0x30C4, 0x30C5, 0x30C6, 0x30C7, 0x30C8, 0x30C9,
+ 0x30CA, 0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF, 0x30D0, 0x30D1,
+ 0x30D2, 0x30D3, 0x30D4, 0x30D5, 0x30D6, 0x30D7, 0x30D8, 0x30D9,
+ 0x30DA, 0x30DB, 0x30DC, 0x30DD, 0x30DE, 0x30DF, 0x30E0, 0x30E1,
+ 0x30E2, 0x30E3, 0x30E4, 0x30E5, 0x30E6, 0x30E7, 0x30E8, 0x30E9,
+ 0x30EA, 0x30EB, 0x30EC, 0x30ED, 0x30EE, 0x30EF, 0x30F0, 0x30F1,
+ 0x30F2, 0x30F3, 0x30F4, 0x30F7, 0x30F8, 0x30F9, 0x30FA, 0x3001,
+ 0x3002, 0x30FB, 0xFF0A, 0x203B, 0x25CB, 0x25CE, 0x25C9, 0x25B3,
+ 0x25B2, 0x30FD, 0x30FE, 0x309D, 0x309E, 0xFF08, 0xFF09, 0x3014,
+ 0x3015, 0xFF08, 0xFF09, 0x3014, 0x3015, 0x0030, 0x0031, 0x0032,
+ 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x3041,
+ 0x3042, 0x3043, 0x3044, 0x3045, 0x3046, 0x3047, 0x3048, 0x3049,
+ 0x304A, 0x304B, 0x304B, 0x304C, 0x304D, 0x304E, 0x304F, 0x3050,
+ 0x3051, 0x3051, 0x3052, 0x3053, 0x3054, 0x3055, 0x3056, 0x3057,
+ 0x3058, 0x3059, 0x305A, 0x305B, 0x305C, 0x305D, 0x305E, 0x305F,
+ 0x3060, 0x3061, 0x3062, 0x3063, 0x3064, 0x3065, 0x3066, 0x3067,
+ 0x3068, 0x3069, 0x306A, 0x306B, 0x306C, 0x306D, 0x306E, 0x306F,
+ 0x3070, 0x3071, 0x3072, 0x3073, 0x3074, 0x3075, 0x3076, 0x3077,
+ 0x3078, 0x3079, 0x307A, 0x307B, 0x307C, 0x307D, 0x307E, 0x307F,
+ 0x3080, 0x3081, 0x3082, 0x3083, 0x3084, 0x3085, 0x3086, 0x3087,
+ 0x3088, 0x3089, 0x308A, 0x308B, 0x308C, 0x308D, 0x308E, 0x308F,
+ 0x3090, 0x3091, 0x3092, 0x3093, 0x3094, 0x3041, 0x3043, 0x3045,
+ 0x3047, 0x3049, 0x304B, 0x3051, 0x3063, 0x3083, 0x3085, 0x3087,
+ 0x308E, 0x30A1, 0x30A2, 0x30A3, 0x30A4, 0x30A5, 0x30A6, 0x30A7,
+ 0x30A8, 0x30A9, 0x30AA, 0x30AB, 0x30F5, 0x30AC, 0x30AD, 0x30AE,
+ 0x30AF, 0x30B0, 0x30B1, 0x30F6, 0x30B2, 0x30B3, 0x30B4, 0x30B5,
+ 0x30B6, 0x30B7, 0x30B8, 0x30B9, 0x30BA, 0x30BB, 0x30BC, 0x30BD,
+ 0x30BE, 0x30BF, 0x30C0, 0x30C1, 0x30C2, 0x30C3, 0x30C4, 0x30C5,
+ 0x30C6, 0x30C7, 0x30C8, 0x30C9, 0x30CA, 0x30CB, 0x30CC, 0x30CD,
+ 0x30CE, 0x30CF, 0x30D0, 0x30D1, 0x30D2, 0x30D3, 0x30D4, 0x30D5,
+ 0x30D6, 0x30D7, 0x30D8, 0x30D9, 0x30DA, 0x30DB, 0x30DC, 0x30DD,
+ 0x30DE, 0x30DF, 0x30E0, 0x30E1, 0x30E2, 0x30E3, 0x30E4, 0x30E5,
+ 0x30E6, 0x30E7, 0x30E8, 0x30E9, 0x30EA, 0x30EB, 0x30EC, 0x30ED,
+ 0x30EE, 0x30EF, 0x30F0, 0x30F1, 0x30F2, 0x30F3, 0x30F4, 0x30A1,
+ 0x30A3, 0x30A5, 0x30A7, 0x30A9, 0x30F5, 0x30F6, 0x30C3, 0x30E3,
+ 0x30E5, 0x30E7, 0x30EE, 0x30FC, 0x30FC, 0x6CE8, 0x20AC, 0x2126,
+ 0x2032, 0x2033, 0xFB00, 0xFB03, 0xFB04, 0x0101, 0x012B, 0x016B,
+ 0x0113, 0x014D, 0x0100, 0x012A, 0x016A, 0x0112, 0x014C, 0x215B,
+ 0x215C, 0x215D, 0x215E, 0x2153, 0x2154, 0x2070, 0x2074, 0x2075,
+ 0x2076, 0x2077, 0x2078, 0x2079, 0x2080, 0x2081, 0x2082, 0x2083,
+ 0x2084, 0x2085, 0x2086, 0x2087, 0x2088, 0x2089, 0x01CD, 0x011A,
+ 0x0000, 0x1EBC, 0x01CF, 0x0000, 0x0128, 0x01D1, 0x0000, 0x01D3,
+ 0x016E, 0x0168, 0x01CE, 0x011B, 0x0000, 0x1EBD, 0x01D0, 0x0000,
+ 0x0129, 0x01D2, 0x0000, 0x01D4, 0x016F, 0x0169, 0x0251, 0x0251,
+ 0x0251, 0x01FD, 0x00E6, 0x0254, 0x0254, 0x0254, 0x0259, 0x0259,
+ 0x0259, 0x025A, 0x025A, 0x025A, 0x025B, 0x025B, 0x025B, 0x006A,
+ 0x014B, 0x0275, 0x028C, 0x028C, 0x028C, 0x0292, 0x0283, 0x02D0,
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
+ 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
+ 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
+ 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
+ 0x0058, 0x0059, 0x005A, 0x005B, 0x00A5, 0x005D, 0x005E, 0x005F,
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
+ 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
+ 0x0078, 0x0079, 0x007A, 0x007B, 0x00A6, 0x007D, 0x0303, 0x02BC,
+ 0x005C, 0x02BB, 0x007C, 0x007E, 0x00A1, 0x00A2, 0x00A3, 0x2044,
+ 0x0192, 0x00A7, 0x00A4, 0x201C, 0x00AB, 0x2039, 0x203A, 0xFB01,
+ 0xFB02, 0x2012, 0x2020, 0x2021, 0x00B7, 0x00B6, 0x2022, 0x201A,
+ 0x201E, 0x201D, 0x00BB, 0x2026, 0x2030, 0x00BF, 0x0301, 0x0302,
+ 0x00AF, 0x0306, 0x0307, 0x0308, 0x030A, 0x00B8, 0x030B, 0x0328,
+ 0x030C, 0x0336, 0x00C6, 0x00AA, 0x0141, 0x00D8, 0x0152, 0x00BA,
+ 0x00E6, 0x0131, 0x0142, 0x00F8, 0x0153, 0x00DF, 0x002D, 0x00A9,
+ 0x00AC, 0x00AE, 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B5, 0x00B9,
+ 0x00BC, 0x00BD, 0x00BE, 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4,
+ 0x00C5, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD,
+ 0x00CE, 0x00CF, 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5,
+ 0x00D6, 0x00D7, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE,
+ 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E7, 0x00E8,
+ 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, 0x00F0,
+ 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, 0x00F9,
+ 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF, 0x0160, 0x0178,
+ 0x017D, 0x0305, 0x0161, 0x2122, 0x017E, 0x0030, 0x20AC, 0x2126,
+ 0x2032, 0x2033, 0xFB00, 0xFB03, 0xFB04, 0x0101, 0x012B, 0x016B,
+ 0x0113, 0x014D, 0x0100, 0x012A, 0x016A, 0x0112, 0x014C, 0x215B,
+ 0x215C, 0x215D, 0x215E, 0x2153, 0x2154, 0x2070, 0x2074, 0x2075,
+ 0x2076, 0x2077, 0x2078, 0x2079, 0x2080, 0x2081, 0x2082, 0x2083,
+ 0x2084, 0x2085, 0x2086, 0x2087, 0x2088, 0x2089, 0x01CD, 0x011A,
+ 0x0000, 0x1EBC, 0x01CF, 0x0000, 0x0128, 0x01D1, 0x0000, 0x01D3,
+ 0x016E, 0x0168, 0x01CE, 0x011B, 0x0000, 0x1EBD, 0x01D0, 0x0000,
+ 0x0129, 0x01D2, 0x0000, 0x01D4, 0x016F, 0x0169, 0x0030, 0x0031,
+ 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039,
+ 0x0336, 0x002D, 0x003D, 0x002C, 0x0028, 0x0029, 0x002E, 0x002F,
+ 0x003A, 0x003B, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035,
+ 0x0036, 0x0037, 0x0038, 0x0039, 0x0336, 0x002D, 0x003D, 0x002C,
+ 0x0028, 0x0029, 0x002E, 0x002F, 0x003A, 0x003B, 0x00B7, 0x002D,
+ 0x003D, 0x2103, 0x2640, 0x2642, 0x3013, 0x3012, 0x300C, 0x300D,
+ 0x300E, 0x300F, 0x301A, 0x301B, 0x3018, 0x3019, 0xFF08, 0xFF09,
+ 0x301D, 0x301E, 0x2018, 0x2019, 0x201C, 0x201D, 0x0027, 0x0022,
+ 0x9038, 0x8B01, 0x7DE3, 0x9EC3, 0x6EAB, 0x798D, 0x6094, 0x6D77,
+ 0x6168, 0x6982, 0x6E34, 0x8910, 0x6F22, 0x5668, 0x65E2, 0x7948,
+ 0x865B, 0x97FF, 0x52E4, 0x8B39, 0x63ED, 0x64CA, 0x784F, 0x7A40,
+ 0x6BBA, 0x7949, 0x8996, 0x716E, 0x793E, 0x8005, 0x81ED, 0x795D,
+ 0x6691, 0x7F72, 0x6D89, 0x72C0, 0x613C, 0x771E, 0x7BC0, 0x7956,
+ 0x50E7, 0x5C64, 0x5DE2, 0x618E, 0x8D08, 0x537D, 0x5606, 0x8457,
+ 0x5FB5, 0x61F2, 0x93AD, 0x798E, 0x9B2D, 0x7A81, 0x96E3, 0x6885,
+ 0x7E41, 0x6669, 0x5351, 0x7891, 0x8CD3, 0x654F, 0x4FAE, 0x5002,
+ 0x5840, 0x52C9, 0x6B65, 0x58A8, 0x6BCF, 0x514D, 0x623E, 0x7950,
+ 0x6B04, 0x9686, 0x865C, 0x6DDA, 0x985E, 0x66C6, 0x6B77, 0x7DF4,
+ 0x934A, 0x5ECA, 0x9304, 0x6982, 0x51B4, 0x634C, 0x86DB, 0x9089,
+ 0x9022, 0x5049, 0x7DEF, 0x9055, 0x53A9, 0x990C, 0x885B, 0x5EF6,
+ 0x6CBF, 0x925B, 0x7FC1, 0x82BD, 0x96C5, 0x5BB3, 0x6168, 0x6982,
+ 0x6BBB, 0x6562, 0x8CAB, 0x5DCC, 0x9811, 0x5E30, 0x8ECC, 0x7AAE,
+ 0x5747, 0x5091, 0x7A74, 0x5065, 0x5EFA, 0x9237, 0x6A8E, 0x4EA4,
+ 0x516C, 0x66F4, 0x6821, 0x786C, 0x7D5E, 0x8003, 0x8CFC, 0x964D,
+ 0x62F7, 0x7F6A, 0x4F7F, 0x53F2, 0x59C9, 0x8B1D, 0x90AA, 0x53CE,
+ 0x8F2F, 0x67D4, 0x77AC, 0x821C, 0x696F, 0x677E, 0x8A1F, 0x4E08,
+ 0x57F4, 0x690D, 0x8077, 0x89AA, 0x9042, 0x636E, 0x6442, 0x8239,
+ 0x7DCF, 0x8061, 0x50CF, 0x8A95, 0x6065, 0x5146, 0x773A, 0x8074,
+ 0x8DF3, 0x5EAD, 0x5EF7, 0x8247, 0x6843, 0x9003, 0x6D3E, 0x6392,
+ 0x8F29, 0x73ED, 0x9812, 0x60B2, 0x6249, 0x6590, 0x7DCB, 0x8AB9,
+ 0x8CA7, 0x7236, 0x847A, 0x5206, 0x5674, 0x61A4, 0x7C89, 0x7D1B,
+ 0x96F0, 0x853D, 0x4FBF, 0x6367, 0x76C6, 0x685D, 0x8108, 0x8036,
+ 0x7FFC, 0x540F, 0x96A3, 0x9E9F, 0x9E97, 0x806F, 0x807E, 0x6E7E,
+ 0x5085, 0x5193, 0x51DB, 0x5315, 0x5340, 0x96D9, 0x55A9, 0x56C1,
+ 0x570D, 0x58AB, 0x59DA, 0x5A36, 0x5ABE, 0x5D4E, 0x5D87, 0x5DC9,
+ 0x5DD3, 0x5F2D, 0x5F98, 0x60D8, 0x613D, 0x61FE, 0x6268, 0x62CF,
+ 0x651D, 0x640F, 0x64F2, 0x655D, 0x665F, 0x67A9, 0x67E7, 0x696B,
+ 0x6930, 0x69A7, 0x6A44, 0x6A90, 0x6C08, 0x6C13, 0x6E23, 0x6F11,
+ 0x6EFE, 0x6F3E, 0x71FF, 0x73E5, 0x7432, 0x745F, 0x74E0, 0x750C,
+ 0x7672, 0x792A, 0x78D4, 0x79BA, 0x7A19, 0x7A95, 0x7CF2, 0x7D73,
+ 0x7DDD, 0x7E35, 0x7FAE, 0x7FE1, 0x805A, 0x805F, 0x8073, 0x8070,
+ 0x8076, 0x8153, 0x818A, 0x81B5, 0x81CD, 0x83F2, 0x8555, 0x85D5,
+ 0x871A, 0x8836, 0x889E, 0x88D8, 0x88F4, 0x892B, 0x893B, 0x896A,
+ 0x896F, 0x8A1D, 0x8D05, 0x8D0F, 0x9F4E, 0x8E91, 0x8EA1, 0x9052,
+ 0x900E, 0x9130, 0x9156, 0x9158, 0x9165, 0x9173, 0x9172, 0x91A2,
+ 0x91AF, 0x91AA, 0x91B4, 0x91BA, 0x9477, 0x9698, 0x973D, 0x9760,
+ 0x9771, 0x980C, 0x9873, 0x98C3, 0x9A45, 0x9B4D, 0x9B58, 0x9BC6,
+ 0x9BE1, 0x9BF1, 0x9D48, 0x9DCF, 0x9F08, 0x6271, 0x6697, 0x610F,
+ 0x8863, 0x9055, 0x907A, 0x78EF, 0x54E1, 0x2ED7, 0x2EBD, 0x53A9,
+ 0x74DC, 0x904B, 0x990C, 0x885E, 0x92B3, 0x95B1, 0x5EF6, 0x63F4,
+ 0x6CBF, 0x7159, 0x9060, 0x925B, 0x65BC, 0x5F80, 0x7FC1, 0x5378,
+ 0x97F3, 0x5316, 0x82B1, 0x83D3, 0x8CA8, 0x904E, 0x82BD, 0x96C5,
+ 0x9913, 0x5EFB, 0x7070, 0x5BB3, 0x6168, 0x6168, 0x6168, 0x69EA,
+ 0x6982, 0x676E, 0x89D2, 0x9694, 0x5272, 0x8F44, 0x938C, 0x82C5,
+ 0x5BD2, 0x74B0, 0x7DE9, 0x7F36, 0x9084, 0x9592, 0x97D3, 0x8218,
+ 0x5371, 0x559C, 0x3402, 0x3402, 0x5E7E, 0x65E3, 0x671F, 0x6A5F,
+ 0x8D77, 0x98E2, 0x5409, 0x55AB, 0x8650, 0x9006, 0x53CA, 0x5438,
+ 0x6025, 0x7D1A, 0x5DE8, 0x62D2, 0x8DDD, 0x9B5A, 0x9B5A, 0x537F,
+ 0x5F3A, 0x6050, 0x69C1, 0x6A4B, 0x6A4B, 0x9115, 0x97FF, 0x9957,
+ 0x6681, 0x2EA9, 0x8FD1, 0x5036, 0x77E9, 0x5177, 0x865E, 0x7A7A,
+ 0x9047, 0x6ADB, 0x5553, 0x5951, 0x6075, 0x6167, 0x8FCE, 0x5091,
+ 0x6F54, 0x7A74, 0x2EBC, 0x2EBC, 0x517C, 0x5238, 0x61B2, 0x6743,
+ 0x80A9, 0x8B19, 0x9063, 0x539F, 0x8A01, 0x6236, 0x96C7, 0x9867,
+ 0x5433, 0x5A1B, 0x8AA4, 0x5DE5, 0x614C, 0x6285, 0x63A7, 0x69CB,
+ 0x6D69, 0x6E2F, 0x8015, 0x8154, 0x8352, 0x8B1B, 0x8CFC, 0x543F,
+ 0x9177, 0x8170, 0x7511, 0x8FBC, 0x4ECA, 0x9396, 0x5EA7, 0x5F69,
+ 0x63A1, 0x6B72, 0x83DC, 0x51B4, 0x54B2, 0x524A, 0x7522, 0x9910,
+ 0x59FF, 0x59FF, 0x5DFF, 0x8AEE, 0x8AEE, 0x8CC7, 0x8CC7, 0x6B21,
+ 0x6B21, 0x6ECB, 0x73BA, 0x53F1, 0x6368, 0x659C, 0x90AA, 0x52FA,
+ 0x7235, 0x7235, 0x914C, 0x5F31, 0x4E3B, 0x53D7, 0x6388, 0x5468,
+ 0x7D42, 0x7FD2, 0x8846, 0x9031, 0x4F4F, 0x8853, 0x8FF0, 0x5DE1,
+ 0x9075, 0x9075, 0x6240, 0x66F8, 0x5973, 0x52DD, 0x5546, 0x5BB5,
+ 0x5C06, 0x2E8C, 0x2E8D, 0x5C19, 0x6D88, 0x785D, 0x8096, 0x4E08,
+ 0x5B82, 0x57CE, 0x60C5, 0x57F4, 0x98FE, 0x690D, 0x6B96, 0x98DF,
+ 0x98E0, 0x2EDE, 0x378D, 0x4FB5, 0x2E97, 0x6D78, 0x771F, 0x9032,
+ 0x4EBB, 0x4EBA, 0x5203, 0x5C0B, 0x8A0A, 0x8A0A, 0x8FC5, 0x8870,
+ 0x9042, 0x351F, 0x52E2, 0x6210, 0x76DB, 0x8056, 0x8980, 0x8AA0,
+ 0x8ACB, 0x975C, 0x975C, 0x7A05, 0x8106, 0x96BB, 0x7C4D, 0x7BC0,
+ 0x8AAA, 0x96EA, 0x7D76, 0x6247, 0x6F98, 0x7FA1, 0x8239, 0x9078,
+ 0x9077, 0x524D, 0x5168, 0x6383, 0x63F7, 0x7626, 0x8D70, 0x9001,
+ 0x906D, 0x9020, 0x2ECA, 0x901F, 0x8CCA, 0x5C0A, 0x5C0A, 0x59A5,
+ 0x6CF0, 0x9000, 0x902E, 0x968A, 0x9BDB, 0x5927, 0x3427, 0x7027,
+ 0x9054, 0x812B, 0x4E39, 0x6B4E, 0x70AD, 0x8A95, 0x6696, 0x5024,
+ 0x7F6E, 0x7BC9, 0x2EAE, 0x7B51, 0x9010, 0x67F1, 0x6CE8, 0x99D0,
+ 0x5F6B, 0x5FB5, 0x61F2, 0x671D, 0x6F6E, 0x8ABF, 0x76F4, 0x6715,
+ 0x6715, 0x589C, 0x8FFD, 0x901A, 0x576A, 0x91E3, 0x5448, 0x5E1D,
+ 0x7A0B, 0x7684, 0x9069, 0x8FED, 0x6DFB, 0x514E, 0x9014, 0x783A,
+ 0x5721, 0x571F, 0x51AC, 0x5510, 0x7CD6, 0x85E4, 0x8B04, 0x9003,
+ 0x900F, 0x9A30, 0x5C0E, 0x9053, 0x5451, 0x3B88, 0x5167, 0x8089,
+ 0x4E73, 0x5FCD, 0x8A8D, 0x5BE7, 0x7D0D, 0x8987, 0x6D3E, 0x80BA,
+ 0x535A, 0x8584, 0x8FEB, 0x7E1B, 0x8087, 0x4E37, 0x6F51, 0x91B1,
+ 0x4F34, 0x5224, 0x534A, 0x5E06, 0x7554, 0x6669, 0x8543, 0x907F,
+ 0x5FAE, 0x9F3B, 0x5339, 0x2EAA, 0x5F65, 0x59EC, 0x59EB, 0x8A55,
+ 0x5E99, 0x75C5, 0x5A66, 0x6577, 0x6D6E, 0x8CA0, 0x8CA0, 0x670D,
+ 0x8986, 0x4E19, 0x5E63, 0x5E73, 0x5F0A, 0x8511, 0x504F, 0x7DE8,
+ 0x8FD4, 0x904D, 0x7C3F, 0x5305, 0x5D29, 0x62B1, 0x670B, 0x7832,
+ 0x7E2B, 0x80DE, 0x840C, 0x90A6, 0x90A6, 0x98FD, 0x9D6C, 0x4EA1,
+ 0x5E3D, 0x5FD8, 0x5FD9, 0x623F, 0x671B, 0x671B, 0x5192, 0x6469,
+ 0x7FFB, 0x51E1, 0x78E8, 0x9B54, 0x2FC7, 0x69D9, 0x685D, 0x4FE3,
+ 0x53C8, 0x7E6D, 0x9EBF, 0x8108, 0x660E, 0x76DF, 0x8FF7, 0x5984,
+ 0x52D0, 0x76F2, 0x8017, 0x623E, 0x7D0B, 0x9580, 0x7D04, 0x8E8D,
+ 0x687A, 0x687A, 0x6801, 0x6109, 0x8AED, 0x8F38, 0x52C7, 0x6709,
+ 0x7336, 0x7336, 0x7337, 0x88D5, 0x904A, 0x66DC, 0x2EB7, 0x8981,
+ 0x990A, 0x7FCC, 0x7FFC, 0x8EB6, 0x862D, 0x7387, 0x9F8D, 0x9F8D,
+ 0x65C5, 0x6881, 0x71D0, 0x96A3, 0x9C57, 0x9E9F, 0x7C7B, 0x5EC9,
+ 0x6190, 0x9023, 0x6717, 0x8002, 0x8107, 0x50CA, 0x511A, 0x5154,
+ 0x5195, 0x2E87, 0x528D, 0x52D7, 0x52F9, 0x5349, 0x353E, 0x53DF,
+ 0x66FC, 0x5533, 0x55E4, 0x5455, 0x56C0, 0x5939, 0x5A1C, 0x5AC2,
+ 0x5B73, 0x5BC3, 0x5C14, 0x37E2, 0x5CE6, 0x5E54, 0x4E48, 0x5EE3,
+ 0x6097, 0x62D4, 0x62CC, 0x641C, 0x63C6, 0x6428, 0x8209, 0x631B,
+ 0x665F, 0x665F, 0x6663, 0x66F5, 0x675E, 0x689D, 0x688D, 0x69F6,
+ 0x6961, 0x5BE8, 0x5BE8, 0x69BB, 0x6BCC, 0x6F11, 0x6E17, 0x6F98,
+ 0x6CAA, 0x6CAA, 0x701B, 0x7162, 0x723B, 0x4E2C, 0x731C, 0x74CA,
+ 0x74EF, 0x7575, 0x75EC, 0x764E, 0x3FB1, 0x776A, 0x77A9, 0x7940,
+ 0x7953, 0x7953, 0x9F4B, 0x79AE, 0x9083, 0x7B53, 0x7C11, 0x7C14,
+ 0x4264, 0x7C50, 0x7C58, 0x7D46, 0x7D63, 0x7E22, 0x7E22, 0x7E48,
+ 0x7E35, 0x7E43, 0x7E8C, 0x7F50, 0x7F51, 0x7F51, 0x7F51, 0x7FC5,
+ 0x7FC6, 0x7FE9, 0x8141, 0x4453, 0x8258, 0x8279, 0x2EBF, 0x2EC0,
+ 0x82E3, 0x5179, 0x83A2, 0x8420, 0x83BD, 0x84F4, 0x856D, 0x8587,
+ 0x85F4, 0x4E55, 0x8737, 0x873B, 0x8805, 0x87BD, 0x867D, 0x8836,
+ 0x8944, 0x88C6, 0x89BD, 0x8ADB, 0x8B3E, 0x8B5A, 0x8D73, 0x8D99,
+ 0x8DCB, 0x8E34, 0x8E4A, 0x8FEF, 0x9087, 0x8FFA, 0x901E, 0x9035,
+ 0x9050, 0x8FC8, 0x9081, 0x908A, 0x908A, 0x908A, 0x908A, 0x908A,
+ 0x908A, 0x9089, 0x9089, 0x9089, 0x9089, 0x9089, 0x9089, 0x9089,
+ 0x9089, 0x9089, 0x9089, 0x9089, 0x9089, 0x92CF, 0x93DD, 0x95BC,
+ 0x9621, 0x96B2, 0x975C, 0x9839, 0x98EB, 0x9903, 0x9909, 0x9945,
+ 0x9945, 0x994B, 0x9A08, 0x9A5F, 0x9A65, 0x9AEF, 0x9B18, 0x9BDF,
+ 0x9D09, 0x9D08, 0x9EA5, 0x9ECC, 0x9F08, 0x9F4A, 0x9F63, 0x9F67,
+ 0x9F6C, 0x7199, 0x7199, 0x891C, 0x68C8, 0x66FB, 0x5F45, 0x5300,
+ 0x5389, 0x5953, 0xFA11, 0x6852, 0x6A73, 0x6D87, 0xFA15, 0x8A12,
+ 0x4E04, 0x4E05, 0x4E1F, 0x4E2B, 0x4E2F, 0x4E30, 0x4E40, 0x4E41,
+ 0x4E44, 0x4E5A, 0x4E7F, 0x4E8D, 0x4E96, 0x4EB9, 0x4ED0, 0x4EE0,
+ 0x4EFD, 0x4EFF, 0x4F0B, 0x4F15, 0x4F60, 0x4F3B, 0x4F49, 0x4F54,
+ 0x4F7A, 0x4F7D, 0x4F7E, 0x4F97, 0x4FBE, 0x4FCF, 0x4FFD, 0x5000,
+ 0x5001, 0x5010, 0x501B, 0x5027, 0x502E, 0x5057, 0x5066, 0x506A,
+ 0x503B, 0x508F, 0x5096, 0x509C, 0x50CC, 0x50E6, 0x50E9, 0x50EF,
+ 0x5108, 0x510B, 0x5110, 0x511B, 0x511E, 0x515F, 0x51A1, 0x51BC,
+ 0x51DE, 0x51EE, 0x51F4, 0x5201, 0x5202, 0x5213, 0x5249, 0x5261,
+ 0x5266, 0x5293, 0x52C8, 0x52F0, 0x530A, 0x530B, 0x533E, 0x534C,
+ 0x534B, 0x5361, 0x536C, 0x53AB, 0x53DA, 0x53E6, 0x53F5, 0x5427,
+ 0x544D, 0x5466, 0x546B, 0x5474, 0x548D, 0x5496, 0x54A1, 0x54AD,
+ 0x54B9, 0x54BF, 0x54C6, 0x54CD, 0x550E, 0x552B, 0x5535, 0x554A,
+ 0x5560, 0x5561, 0x5588, 0x558E, 0x5608, 0x560E, 0x560F, 0x5637,
+ 0x563F, 0x5649, 0x564B, 0x564F, 0x5666, 0x5669, 0x566F, 0x5671,
+ 0x5672, 0x5695, 0x569A, 0x56AC, 0x56AD, 0x56B1, 0x56C9, 0x56DD,
+ 0x56E4, 0x570A, 0x5715, 0x5723, 0x572F, 0x5733, 0x5734, 0x574C,
+ 0x5770, 0x578C, 0x579C, 0x57B8, 0x57E6, 0x57ED, 0x57F5, 0x57F6,
+ 0x57FF, 0x5809, 0x5820, 0x5832, 0x587C, 0x5880, 0x58A9, 0x58CE,
+ 0x58D0, 0x58D4, 0x58DA, 0x58E9, 0x590C, 0x5924, 0x592F, 0x5961,
+ 0x596D, 0x59CA, 0x59D2, 0x59DD, 0x59E3, 0x59E4, 0x5A04, 0x5A0C,
+ 0x5A23, 0x5A47, 0x5A55, 0x5A63, 0x5A6D, 0x5A7E, 0x5A9E, 0x5AA7,
+ 0x5AAC, 0x5AB3, 0x5AE0, 0x5B00, 0x5B19, 0x5B25, 0x5B2D, 0x5B41,
+ 0x5B7C, 0x5B7E, 0x5B7F, 0x5B8A, 0x5C23, 0x5C2B, 0x5C30, 0x5C63,
+ 0x5C69, 0x5C7C, 0x5CCB, 0x5CD2, 0x5CF4, 0x5D24, 0x5D26, 0x5D43,
+ 0x5D46, 0x5D4A, 0x5D92, 0x5D94, 0x5D99, 0x5DA0, 0x5DD8, 0x5DE0,
+ 0x5DF8, 0x5E00, 0x5E12, 0x5E14, 0x5E15, 0x5E18, 0x5E2E, 0x5E58,
+ 0x5E6B, 0x5E6C, 0x5EA8, 0x5EAA, 0x5EBE, 0x5EBF, 0x5ECB, 0x5ED2,
+ 0x5F07, 0x5F0E, 0x5F1C, 0x5F1D, 0x5F22, 0x5F28, 0x5F36, 0x5F3B,
+ 0x5F40, 0x5F50, 0x5F58, 0x5F64, 0x5F89, 0x5F9C, 0x5FA7, 0x5FA4,
+ 0x5FAF, 0x5FB8, 0x5FC4, 0x5FC9, 0x5FE1, 0x5FE9, 0x5FED, 0x5FFC,
+ 0x6017, 0x601A, 0x6033, 0x6061, 0x607F, 0x609E, 0x60A4, 0x60B0,
+ 0x60CB, 0x60DB, 0x60F8, 0x6112, 0x6113, 0x6114, 0x611C, 0x617C,
+ 0x618D, 0x619F, 0x61A8, 0x61C2, 0x61DF, 0x6215, 0x6229, 0x6243,
+ 0x6246, 0x624C, 0x6251, 0x6256, 0x62C4, 0x62FC, 0x630A, 0x630D,
+ 0x6318, 0x6339, 0x6342, 0x6343, 0x6365, 0x6374, 0x637D, 0x6384,
+ 0x6387, 0x6390, 0x639E, 0x63D1, 0x63DC, 0x6409, 0x6410, 0x6422,
+ 0x6454, 0x645B, 0x646D, 0x647B, 0x64BE, 0x64BF, 0x64E5, 0x64F7,
+ 0x64FB, 0x6504, 0x6516, 0x6519, 0x6547, 0x6567, 0x6581, 0x6585,
+ 0x65C2, 0x65F0, 0x65F2, 0x662C, 0x664C, 0x665B, 0x665C, 0x6661,
+ 0x666B, 0x6677, 0x66A4, 0x66C8, 0x66EC, 0x6705, 0x6713, 0x6733,
+ 0x6748, 0x674C, 0x6776, 0x677B, 0x67B0, 0x67B2, 0x67F9, 0x67D7,
+ 0x67D9, 0x67F0, 0x682C, 0x6830, 0x6831, 0x685B, 0x6872, 0x6875,
+ 0x687A, 0x6884, 0x68A5, 0x68B2, 0x68D0, 0x68D6, 0x68E8, 0x68ED,
+ 0x68F0, 0x68F1, 0x68FC, 0x6911, 0x6913, 0x6935, 0x693B, 0x6957,
+ 0x6963, 0x6972, 0x697F, 0x6980, 0x69A6, 0x69AD, 0x69B7, 0x69D6,
+ 0x69D7, 0x6A01, 0x6A0F, 0x6A15, 0x6A28, 0x6A34, 0x6A3E, 0x6A45,
+ 0x6A50, 0x6A51, 0x6A56, 0x6A5B, 0x6A83, 0x6A89, 0x6A91, 0x6A9D,
+ 0x6A9E, 0x6A9F, 0x6ADC, 0x6AE7, 0x6AEC, 0x6B1E, 0x6B24, 0x6B35,
+ 0x6B46, 0x6B56, 0x6B60, 0x6B82, 0x6BBE, 0x6BE1, 0x6BF1, 0x6C10,
+ 0x6C33, 0x6C35, 0x6C3A, 0x6C59, 0x6C76, 0x6C7B, 0x6C85, 0x6C95,
+ 0x6C9C, 0x6CD0, 0x6CD4, 0x6CD6, 0x6CE0, 0x6CEB, 0x6CEC, 0x6CEE,
+ 0x6D0A, 0x6D0E, 0x6D11, 0x6D2E, 0x6D57, 0x6D5E, 0x6D65, 0x6D82,
+ 0x6DBF, 0x6DC4, 0x6DCA, 0x6DD6, 0x6DE9, 0x6E22, 0x6E51, 0x6EC7,
+ 0x6ECA, 0x6ECE, 0x6EFD, 0x6F1A, 0x6F2A, 0x6F2F, 0x6F33, 0x6F5A,
+ 0x6F5E, 0x6F62, 0x6F7D, 0x6F8B, 0x6F8D, 0x6F92, 0x6F94, 0x6F9A,
+ 0x6FA7, 0x6FA8, 0x6FB6, 0x6FDA, 0x6FDE, 0x6FF9, 0x7039, 0x703C,
+ 0x704A, 0x7054, 0x705D, 0x705E, 0x7064, 0x706C, 0x707E, 0x7081,
+ 0x7095, 0x70B7, 0x70D3, 0x70D4, 0x70D8, 0x70DC, 0x7107, 0x7120,
+ 0x7131, 0x714A, 0x7152, 0x7160, 0x7179, 0x7192, 0x71B3, 0x71CB,
+ 0x71D3, 0x71D6, 0x7200, 0x721D, 0x722B, 0x7238, 0x7241, 0x7253,
+ 0x7255, 0x7256, 0x725C, 0x728D, 0x72AD, 0x72B4, 0x72C7, 0x72FB,
+ 0x7304, 0x7305, 0x7328, 0x7331, 0x7343, 0x736C, 0x737C, 0x7383,
+ 0x7385, 0x7386, 0x7395, 0x739E, 0x739F, 0x73A0, 0x73A6, 0x73AB,
+ 0x73B5, 0x73B7, 0x73BC, 0x73CF, 0x73D9, 0x73E9, 0x73F4, 0x73FD,
+ 0x7404, 0x740A, 0x741A, 0x741B, 0x7424, 0x7428, 0x742C, 0x742F,
+ 0x7430, 0x7431, 0x7439, 0x7444, 0x7447, 0x744B, 0x744D, 0x7451,
+ 0x7457, 0x7466, 0x746B, 0x7471, 0x7480, 0x7485, 0x7486, 0x7487,
+ 0x7490, 0x7498, 0x749C, 0x74A0, 0x74A3, 0x74A8, 0x74AB, 0x74B5,
+ 0x74BF, 0x74C8, 0x74DA, 0x74DE, 0x754E, 0x7579, 0x7581, 0x7590,
+ 0x7592, 0x7593, 0x75B4, 0x75E4, 0x75F9, 0x7600, 0x760A, 0x7615,
+ 0x7616, 0x7619, 0x761E, 0x762D, 0x7635, 0x7643, 0x764B, 0x7665,
+ 0x766D, 0x766F, 0x7671, 0x7674, 0x76A4, 0x76A5, 0x76C5, 0x76CC,
+ 0x76EC, 0x76FC, 0x7734, 0x7736, 0x775C, 0x775F, 0x7760, 0x7772,
+ 0x777D, 0x7795, 0x77AA, 0x77E6, 0x77F0, 0x77F4, 0x7806, 0x7822,
+ 0x782D, 0x782E, 0x7830, 0x7835, 0x7868, 0x789E, 0x78C8, 0x78CC,
+ 0x78CE, 0x78E4, 0x78E0, 0x78E1, 0x78F2, 0x78F7, 0x78FB, 0x7931,
+ 0x7934, 0x793B, 0x793D, 0x7945, 0x795B, 0x795C, 0x798B, 0x7996,
+ 0x7998, 0x79B8, 0x79BB, 0x79CA, 0x79DA, 0x7A03, 0x7A09, 0x7A11,
+ 0x7A1E, 0x7A2D, 0x7A39, 0x7A45, 0x7A4C, 0x7A5D, 0x7A60, 0x7A6D,
+ 0x7A78, 0x7AA0, 0x7AA3, 0x7AB3, 0x7ABB, 0x7ABC, 0x7AC6, 0x7B07,
+ 0x7B14, 0x7B27, 0x7B31, 0x7B47, 0x7B4E, 0x7B60, 0x7B69, 0x7B6D,
+ 0x7B72, 0x7B91, 0x7BAF, 0x7BD7, 0x7BD9, 0x7C0B, 0x7C0F, 0x7C20,
+ 0x7C26, 0x7C31, 0x7C36, 0x7C51, 0x7C59, 0x7C67, 0x7C6E, 0x7C70,
+ 0x7CBC, 0x7CBF, 0x7CC8, 0x7CC9, 0x7CD7, 0x7CD9, 0x7CDD, 0x7CEB,
+ 0x7D07, 0x7D08, 0x7D09, 0x7D13, 0x7D1D, 0x7D23, 0x7D41, 0x7D53,
+ 0x7D59, 0x7D5D, 0x7D7A, 0x7D86, 0x7D8B, 0x7D8C, 0x7DCC, 0x7DEB,
+ 0x7DF1, 0x7DF9, 0x7E08, 0x7E11, 0x7E15, 0x7E20, 0x7E47, 0x7E62,
+ 0x7E6E, 0x7E73, 0x7E8D, 0x7E91, 0x7E98, 0x7F44, 0x7F4F, 0x7F52,
+ 0x7F53, 0x7F61, 0x7F91, 0x7FBF, 0x7FCE, 0x7FDF, 0x7FE5, 0x7FEC,
+ 0x7FEE, 0x7FEF, 0x7FFA, 0x800E, 0x8011, 0x8014, 0x8024, 0x8026,
+ 0x803A, 0x803C, 0x8060, 0x8071, 0x8075, 0x809E, 0x80A6, 0x80AB,
+ 0x80D7, 0x80D8, 0x8116, 0x8118, 0x813A, 0x814A, 0x814C, 0x8181,
+ 0x8184, 0x81B4, 0x81CF, 0x81F9, 0x8203, 0x8221, 0x8232, 0x8234,
+ 0x8246, 0x824B, 0x824F, 0x828E, 0x82AE, 0x82B7, 0x82BE, 0x82C6,
+ 0x82FE, 0x8343, 0x8351, 0x8355, 0x8386, 0x838D, 0x8392, 0x8398,
+ 0x83A9, 0x83BF, 0x83C0, 0x83EA, 0x840F, 0x8411, 0x844A, 0x8476,
+ 0x84A8, 0x84AF, 0x84C0, 0x84C2, 0x84F0, 0x84FD, 0x850C, 0x8534,
+ 0x855E, 0x858F, 0x85B7, 0x85CE, 0x85AD, 0x8612, 0x8629, 0x8652,
+ 0x8663, 0x866C, 0x866F, 0x867A, 0x868D, 0x8691, 0x8698, 0x86A7,
+ 0x86A8, 0x86FA, 0x86FD, 0x870B, 0x8713, 0x8719, 0x871E, 0x8728,
+ 0x873E, 0x8771, 0x8788, 0x8799, 0x87AC, 0x87AD, 0x87B5, 0x87D6,
+ 0x87EB, 0x87ED, 0x8801, 0x8803, 0x8806, 0x880B, 0x8814, 0x881C,
+ 0x8856, 0x885F, 0x8864, 0x8898, 0x88AA, 0x88BD, 0x88BE, 0x88CA,
+ 0x88D2, 0x88DB, 0x88F0, 0x88F1, 0x8906, 0x8918, 0x8919, 0x891A,
+ 0x8927, 0x8930, 0x893E, 0x897B, 0x89D4, 0x89D6, 0x89E5, 0x89F1,
+ 0x8A07, 0x8A0F, 0x8A15, 0x8A22, 0x8A4E, 0x8A7F, 0x8AF4, 0x8B1F,
+ 0x8B37, 0x8B43, 0x8B44, 0x8B54, 0x8B9C, 0x8B9E, 0x8C47, 0x8C54,
+ 0x8C73, 0x8CA4, 0x8CD9, 0x8CE1, 0x8CF8, 0x8CFE, 0x8D1B, 0x8D69,
+ 0x8D6C, 0x8D84, 0x8D8D, 0x8D95, 0x8DA6, 0x8DC6, 0x8DCE, 0x8DE4,
+ 0x8DEC, 0x8E20, 0x8E4B, 0x8E6C, 0x8E70, 0x8E7A, 0x8E92, 0x8EAE,
+ 0x8EB3, 0x8ED1, 0x8ED4, 0x8EF9, 0x8F17, 0x8F36, 0x8FA6, 0x8FB5,
+ 0x8FB6, 0x8FC6, 0x8FE0, 0x8FE4, 0x8FF6, 0x9002, 0x902C, 0x9044,
+ 0x9088, 0x9095, 0x9099, 0x909B, 0x90A2, 0x90B4, 0x90D7, 0x90DD,
+ 0x90F4, 0x9117, 0x911C, 0x9131, 0x913A, 0x913D, 0x9148, 0x915B,
+ 0x9161, 0x9164, 0x918E, 0x919E, 0x91A8, 0x91AD, 0x91AE, 0x91B2,
+ 0x91BC, 0x91F0, 0x91F7, 0x91FB, 0x9207, 0x9228, 0x9233, 0x9238,
+ 0x9243, 0x9247, 0x924F, 0x9260, 0x92C2, 0x92CB, 0x92CC, 0x92DF,
+ 0x930D, 0x9315, 0x931F, 0x9327, 0x9347, 0x9352, 0x9365, 0x936A,
+ 0x936D, 0x939B, 0x93BA, 0x93A9, 0x93C1, 0x93CA, 0x93E2, 0x93FA,
+ 0x93FD, 0x940F, 0x9434, 0x943F, 0x9455, 0x946B, 0x9472, 0x9578,
+ 0x95A6, 0x95A9, 0x95AB, 0x95B4, 0x95BD, 0x95DA, 0x961D, 0x9641,
+ 0x9658, 0x9684, 0x96A4, 0x96A9, 0x96D2, 0x5DB2, 0x96DE, 0x96E9,
+ 0x96F1, 0x9702, 0x9709, 0x975A, 0x9763, 0x976E, 0x9773, 0x979A,
+ 0x97A2, 0x97B5, 0x97B6, 0x97D9, 0x97DE, 0x97F4, 0x980A, 0x980E,
+ 0x981E, 0x9823, 0x982B, 0x983E, 0x9852, 0x9853, 0x9859, 0x986C,
+ 0x98B8, 0x98BA, 0x98BF, 0x98C8, 0x98E5, 0x9932, 0x9933, 0x9940,
+ 0x994D, 0x995C, 0x995F, 0x99B1, 0x99B9, 0x99BA, 0x99C9, 0x9A02,
+ 0x9A16, 0x9A24, 0x9A27, 0x9A2D, 0x9A2E, 0x9A36, 0x9A38, 0x9A4A,
+ 0x9A56, 0x9AB5, 0x9AB6, 0x9AF9, 0x9B03, 0x9B20, 0x9B33, 0x9B34,
+ 0x9B73, 0x9B79, 0x9BA7, 0x9BC1, 0x9BC7, 0x9BD7, 0x9BE7, 0x9BEB,
+ 0x9BF7, 0x9BFA, 0x9BFD, 0x9C0B, 0x9C27, 0x9C2A, 0x9C36, 0x9C41,
+ 0x9C53, 0x9C63, 0x9C6A, 0x9C77, 0x9D02, 0x9D42, 0x9D47, 0x9D63,
+ 0x9D69, 0x9D7C, 0x9D7E, 0x9D8D, 0x9DB1, 0x9DC3, 0x9DC7, 0x9DD6,
+ 0x9DDF, 0x9DEB, 0x9DF4, 0x9E15, 0x9E1D, 0x9EA4, 0x9EA8, 0x9EAC,
+ 0x9EE7, 0x9EEE, 0x9F10, 0x9F12, 0x9F17, 0x9F19, 0x9F2F, 0x9F37,
+ 0x9F39, 0x9F41, 0x9F45, 0x9F57, 0x9F68, 0x9F71, 0x9F75, 0x9F90,
+ 0x9F94, 0x9FA2, 0x4E30, 0x3405, 0x4F60, 0x5620, 0x5ECB, 0x2E95,
+ 0x60A4, 0x69D7, 0x6B24, 0x6FF9, 0x6EE6, 0x71B3, 0x2EA4, 0x7AC6,
+ 0x7F61, 0x8071, 0x809E, 0x2ECC, 0x91F0, 0x5DB2, 0x97DE, 0x4FD3,
+ 0x50D9, 0x50F0, 0x51C3, 0x5676, 0x6A54, 0x6D01, 0x6DD0, 0x6E42,
+ 0x6ED9, 0x73E4, 0x7421, 0x756C, 0x7851, 0x87F5, 0xFFFD, 0x73A8,
+ 0x3AF3, 0x34DB, 0x440C, 0x3E8A, 0xFFFD, 0xFFFD, 0x4BE8, 0xFFFD,
+ 0x3EDA, 0x3B22, 0xFFFD, 0x457A, 0x4093, 0xFFFD, 0x4665, 0x4103,
+ 0x4293, 0x46AE, 0x3488, 0xFFFD,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/Japan1/EUC-H_1.cpp b/core/src/fpdfapi/fpdf_cmaps/Japan1/EUC-H_1.cpp
index f0e01e1e23..7ea5866db4 100644
--- a/core/src/fpdfapi/fpdf_cmaps/Japan1/EUC-H_1.cpp
+++ b/core/src/fpdfapi/fpdf_cmaps/Japan1/EUC-H_1.cpp
@@ -1,48 +1,48 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-extern const unsigned short g_FXCMAP_EUC_H_1[120 * 3] = {
- 0x0020, 0x007E, 0x00E7, 0x8EA0, 0x8EDF, 0x0146, 0xA1A1, 0xA1FE, 0x0279,
- 0xA2A1, 0xA2AE, 0x02D7, 0xA2BA, 0xA2C1, 0x02E5, 0xA2CA, 0xA2D0, 0x02ED,
- 0xA2DC, 0xA2EA, 0x02F4, 0xA2F2, 0xA2F9, 0x0303, 0xA2FE, 0xA2FE, 0x030B,
- 0xA3B0, 0xA3B9, 0x030C, 0xA3C1, 0xA3DA, 0x0316, 0xA3E1, 0xA3FA, 0x0330,
- 0xA4A1, 0xA4F3, 0x034A, 0xA5A1, 0xA5F6, 0x039D, 0xA6A1, 0xA6B8, 0x03F3,
- 0xA6C1, 0xA6D8, 0x040B, 0xA7A1, 0xA7C1, 0x0423, 0xA7D1, 0xA7F1, 0x0444,
- 0xA8A1, 0xA8A1, 0x1D37, 0xA8A2, 0xA8A2, 0x1D39, 0xA8A3, 0xA8A3, 0x1D43,
- 0xA8A4, 0xA8A4, 0x1D47, 0xA8A5, 0xA8A5, 0x1D4F, 0xA8A6, 0xA8A6, 0x1D4B,
- 0xA8A7, 0xA8A7, 0x1D53, 0xA8A8, 0xA8A8, 0x1D63, 0xA8A9, 0xA8A9, 0x1D5B,
- 0xA8AA, 0xA8AA, 0x1D6B, 0xA8AB, 0xA8AB, 0x1D73, 0xA8AC, 0xA8AC, 0x1D38,
- 0xA8AD, 0xA8AD, 0x1D3A, 0xA8AE, 0xA8AE, 0x1D46, 0xA8AF, 0xA8AF, 0x1D4A,
- 0xA8B0, 0xA8B0, 0x1D52, 0xA8B1, 0xA8B1, 0x1D4E, 0xA8B2, 0xA8B2, 0x1D5A,
- 0xA8B3, 0xA8B3, 0x1D6A, 0xA8B4, 0xA8B4, 0x1D62, 0xA8B5, 0xA8B5, 0x1D72,
- 0xA8B6, 0xA8B6, 0x1D82, 0xA8B7, 0xA8B7, 0x1D57, 0xA8B8, 0xA8B8, 0x1D66,
- 0xA8B9, 0xA8B9, 0x1D5F, 0xA8BA, 0xA8BA, 0x1D6E, 0xA8BB, 0xA8BB, 0x1D76,
- 0xA8BC, 0xA8BC, 0x1D54, 0xA8BD, 0xA8BD, 0x1D67, 0xA8BE, 0xA8BE, 0x1D5C,
- 0xA8BF, 0xA8BF, 0x1D6F, 0xA8C0, 0xA8C0, 0x1D79, 0xB0A1, 0xB0FE, 0x0465,
- 0xB1A1, 0xB1FE, 0x04C3, 0xB2A1, 0xB2FE, 0x0521, 0xB3A1, 0xB3FE, 0x057F,
- 0xB4A1, 0xB4FE, 0x05DD, 0xB5A1, 0xB5FE, 0x063B, 0xB6A1, 0xB6FE, 0x0699,
- 0xB7A1, 0xB7FE, 0x06F7, 0xB8A1, 0xB8FE, 0x0755, 0xB9A1, 0xB9FE, 0x07B3,
- 0xBAA1, 0xBAFE, 0x0811, 0xBBA1, 0xBBFE, 0x086F, 0xBCA1, 0xBCFE, 0x08CD,
- 0xBDA1, 0xBDFE, 0x092B, 0xBEA1, 0xBEFE, 0x0989, 0xBFA1, 0xBFFE, 0x09E7,
- 0xC0A1, 0xC0FE, 0x0A45, 0xC1A1, 0xC1FE, 0x0AA3, 0xC2A1, 0xC2FE, 0x0B01,
- 0xC3A1, 0xC3FE, 0x0B5F, 0xC4A1, 0xC4FE, 0x0BBD, 0xC5A1, 0xC5FE, 0x0C1B,
- 0xC6A1, 0xC6FE, 0x0C79, 0xC7A1, 0xC7FE, 0x0CD7, 0xC8A1, 0xC8FE, 0x0D35,
- 0xC9A1, 0xC9FE, 0x0D93, 0xCAA1, 0xCAFE, 0x0DF1, 0xCBA1, 0xCBFE, 0x0E4F,
- 0xCCA1, 0xCCFE, 0x0EAD, 0xCDA1, 0xCDFE, 0x0F0B, 0xCEA1, 0xCEFE, 0x0F69,
- 0xCFA1, 0xCFD3, 0x0FC7, 0xD0A1, 0xD0FE, 0x0FFA, 0xD1A1, 0xD1FE, 0x1058,
- 0xD2A1, 0xD2FE, 0x10B6, 0xD3A1, 0xD3FE, 0x1114, 0xD4A1, 0xD4FE, 0x1172,
- 0xD5A1, 0xD5FE, 0x11D0, 0xD6A1, 0xD6FE, 0x122E, 0xD7A1, 0xD7FE, 0x128C,
- 0xD8A1, 0xD8FE, 0x12EA, 0xD9A1, 0xD9FE, 0x1348, 0xDAA1, 0xDAFE, 0x13A6,
- 0xDBA1, 0xDBFE, 0x1404, 0xDCA1, 0xDCFE, 0x1462, 0xDDA1, 0xDDFE, 0x14C0,
- 0xDEA1, 0xDEFE, 0x151E, 0xDFA1, 0xDFFE, 0x157C, 0xE0A1, 0xE0FE, 0x15DA,
- 0xE1A1, 0xE1FE, 0x1638, 0xE2A1, 0xE2FE, 0x1696, 0xE3A1, 0xE3FE, 0x16F4,
- 0xE4A1, 0xE4FE, 0x1752, 0xE5A1, 0xE5FE, 0x17B0, 0xE6A1, 0xE6FE, 0x180E,
- 0xE7A1, 0xE7FE, 0x186C, 0xE8A1, 0xE8FE, 0x18CA, 0xE9A1, 0xE9FE, 0x1928,
- 0xEAA1, 0xEAFE, 0x1986, 0xEBA1, 0xEBFE, 0x19E4, 0xECA1, 0xECFE, 0x1A42,
- 0xEDA1, 0xEDFE, 0x1AA0, 0xEEA1, 0xEEFE, 0x1AFE, 0xEFA1, 0xEFFE, 0x1B5C,
- 0xF0A1, 0xF0FE, 0x1BBA, 0xF1A1, 0xF1FE, 0x1C18, 0xF2A1, 0xF2FE, 0x1C76,
- 0xF3A1, 0xF3FE, 0x1CD4, 0xF4A1, 0xF4A4, 0x1D32, 0xF4A5, 0xF4A6, 0x205C,
-};
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_EUC_H_1[120 * 3] = {
+ 0x0020, 0x007E, 0x00E7, 0x8EA0, 0x8EDF, 0x0146, 0xA1A1, 0xA1FE, 0x0279,
+ 0xA2A1, 0xA2AE, 0x02D7, 0xA2BA, 0xA2C1, 0x02E5, 0xA2CA, 0xA2D0, 0x02ED,
+ 0xA2DC, 0xA2EA, 0x02F4, 0xA2F2, 0xA2F9, 0x0303, 0xA2FE, 0xA2FE, 0x030B,
+ 0xA3B0, 0xA3B9, 0x030C, 0xA3C1, 0xA3DA, 0x0316, 0xA3E1, 0xA3FA, 0x0330,
+ 0xA4A1, 0xA4F3, 0x034A, 0xA5A1, 0xA5F6, 0x039D, 0xA6A1, 0xA6B8, 0x03F3,
+ 0xA6C1, 0xA6D8, 0x040B, 0xA7A1, 0xA7C1, 0x0423, 0xA7D1, 0xA7F1, 0x0444,
+ 0xA8A1, 0xA8A1, 0x1D37, 0xA8A2, 0xA8A2, 0x1D39, 0xA8A3, 0xA8A3, 0x1D43,
+ 0xA8A4, 0xA8A4, 0x1D47, 0xA8A5, 0xA8A5, 0x1D4F, 0xA8A6, 0xA8A6, 0x1D4B,
+ 0xA8A7, 0xA8A7, 0x1D53, 0xA8A8, 0xA8A8, 0x1D63, 0xA8A9, 0xA8A9, 0x1D5B,
+ 0xA8AA, 0xA8AA, 0x1D6B, 0xA8AB, 0xA8AB, 0x1D73, 0xA8AC, 0xA8AC, 0x1D38,
+ 0xA8AD, 0xA8AD, 0x1D3A, 0xA8AE, 0xA8AE, 0x1D46, 0xA8AF, 0xA8AF, 0x1D4A,
+ 0xA8B0, 0xA8B0, 0x1D52, 0xA8B1, 0xA8B1, 0x1D4E, 0xA8B2, 0xA8B2, 0x1D5A,
+ 0xA8B3, 0xA8B3, 0x1D6A, 0xA8B4, 0xA8B4, 0x1D62, 0xA8B5, 0xA8B5, 0x1D72,
+ 0xA8B6, 0xA8B6, 0x1D82, 0xA8B7, 0xA8B7, 0x1D57, 0xA8B8, 0xA8B8, 0x1D66,
+ 0xA8B9, 0xA8B9, 0x1D5F, 0xA8BA, 0xA8BA, 0x1D6E, 0xA8BB, 0xA8BB, 0x1D76,
+ 0xA8BC, 0xA8BC, 0x1D54, 0xA8BD, 0xA8BD, 0x1D67, 0xA8BE, 0xA8BE, 0x1D5C,
+ 0xA8BF, 0xA8BF, 0x1D6F, 0xA8C0, 0xA8C0, 0x1D79, 0xB0A1, 0xB0FE, 0x0465,
+ 0xB1A1, 0xB1FE, 0x04C3, 0xB2A1, 0xB2FE, 0x0521, 0xB3A1, 0xB3FE, 0x057F,
+ 0xB4A1, 0xB4FE, 0x05DD, 0xB5A1, 0xB5FE, 0x063B, 0xB6A1, 0xB6FE, 0x0699,
+ 0xB7A1, 0xB7FE, 0x06F7, 0xB8A1, 0xB8FE, 0x0755, 0xB9A1, 0xB9FE, 0x07B3,
+ 0xBAA1, 0xBAFE, 0x0811, 0xBBA1, 0xBBFE, 0x086F, 0xBCA1, 0xBCFE, 0x08CD,
+ 0xBDA1, 0xBDFE, 0x092B, 0xBEA1, 0xBEFE, 0x0989, 0xBFA1, 0xBFFE, 0x09E7,
+ 0xC0A1, 0xC0FE, 0x0A45, 0xC1A1, 0xC1FE, 0x0AA3, 0xC2A1, 0xC2FE, 0x0B01,
+ 0xC3A1, 0xC3FE, 0x0B5F, 0xC4A1, 0xC4FE, 0x0BBD, 0xC5A1, 0xC5FE, 0x0C1B,
+ 0xC6A1, 0xC6FE, 0x0C79, 0xC7A1, 0xC7FE, 0x0CD7, 0xC8A1, 0xC8FE, 0x0D35,
+ 0xC9A1, 0xC9FE, 0x0D93, 0xCAA1, 0xCAFE, 0x0DF1, 0xCBA1, 0xCBFE, 0x0E4F,
+ 0xCCA1, 0xCCFE, 0x0EAD, 0xCDA1, 0xCDFE, 0x0F0B, 0xCEA1, 0xCEFE, 0x0F69,
+ 0xCFA1, 0xCFD3, 0x0FC7, 0xD0A1, 0xD0FE, 0x0FFA, 0xD1A1, 0xD1FE, 0x1058,
+ 0xD2A1, 0xD2FE, 0x10B6, 0xD3A1, 0xD3FE, 0x1114, 0xD4A1, 0xD4FE, 0x1172,
+ 0xD5A1, 0xD5FE, 0x11D0, 0xD6A1, 0xD6FE, 0x122E, 0xD7A1, 0xD7FE, 0x128C,
+ 0xD8A1, 0xD8FE, 0x12EA, 0xD9A1, 0xD9FE, 0x1348, 0xDAA1, 0xDAFE, 0x13A6,
+ 0xDBA1, 0xDBFE, 0x1404, 0xDCA1, 0xDCFE, 0x1462, 0xDDA1, 0xDDFE, 0x14C0,
+ 0xDEA1, 0xDEFE, 0x151E, 0xDFA1, 0xDFFE, 0x157C, 0xE0A1, 0xE0FE, 0x15DA,
+ 0xE1A1, 0xE1FE, 0x1638, 0xE2A1, 0xE2FE, 0x1696, 0xE3A1, 0xE3FE, 0x16F4,
+ 0xE4A1, 0xE4FE, 0x1752, 0xE5A1, 0xE5FE, 0x17B0, 0xE6A1, 0xE6FE, 0x180E,
+ 0xE7A1, 0xE7FE, 0x186C, 0xE8A1, 0xE8FE, 0x18CA, 0xE9A1, 0xE9FE, 0x1928,
+ 0xEAA1, 0xEAFE, 0x1986, 0xEBA1, 0xEBFE, 0x19E4, 0xECA1, 0xECFE, 0x1A42,
+ 0xEDA1, 0xEDFE, 0x1AA0, 0xEEA1, 0xEEFE, 0x1AFE, 0xEFA1, 0xEFFE, 0x1B5C,
+ 0xF0A1, 0xF0FE, 0x1BBA, 0xF1A1, 0xF1FE, 0x1C18, 0xF2A1, 0xF2FE, 0x1C76,
+ 0xF3A1, 0xF3FE, 0x1CD4, 0xF4A1, 0xF4A4, 0x1D32, 0xF4A5, 0xF4A6, 0x205C,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/Japan1/H_1.cpp b/core/src/fpdfapi/fpdf_cmaps/Japan1/H_1.cpp
index e14e699c8d..43076a0ace 100644
--- a/core/src/fpdfapi/fpdf_cmaps/Japan1/H_1.cpp
+++ b/core/src/fpdfapi/fpdf_cmaps/Japan1/H_1.cpp
@@ -1,48 +1,48 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-extern const unsigned short g_FXCMAP_H_1[118 * 3] = {
- 0x2121, 0x217E, 0x0279, 0x2221, 0x222E, 0x02D7, 0x223A, 0x2241, 0x02E5,
- 0x224A, 0x2250, 0x02ED, 0x225C, 0x226A, 0x02F4, 0x2272, 0x2279, 0x0303,
- 0x227E, 0x227E, 0x030B, 0x2330, 0x2339, 0x030C, 0x2341, 0x235A, 0x0316,
- 0x2361, 0x237A, 0x0330, 0x2421, 0x2473, 0x034A, 0x2521, 0x2576, 0x039D,
- 0x2621, 0x2638, 0x03F3, 0x2641, 0x2658, 0x040B, 0x2721, 0x2741, 0x0423,
- 0x2751, 0x2771, 0x0444, 0x2821, 0x2821, 0x1D37, 0x2822, 0x2822, 0x1D39,
- 0x2823, 0x2823, 0x1D43, 0x2824, 0x2824, 0x1D47, 0x2825, 0x2825, 0x1D4F,
- 0x2826, 0x2826, 0x1D4B, 0x2827, 0x2827, 0x1D53, 0x2828, 0x2828, 0x1D63,
- 0x2829, 0x2829, 0x1D5B, 0x282A, 0x282A, 0x1D6B, 0x282B, 0x282B, 0x1D73,
- 0x282C, 0x282C, 0x1D38, 0x282D, 0x282D, 0x1D3A, 0x282E, 0x282E, 0x1D46,
- 0x282F, 0x282F, 0x1D4A, 0x2830, 0x2830, 0x1D52, 0x2831, 0x2831, 0x1D4E,
- 0x2832, 0x2832, 0x1D5A, 0x2833, 0x2833, 0x1D6A, 0x2834, 0x2834, 0x1D62,
- 0x2835, 0x2835, 0x1D72, 0x2836, 0x2836, 0x1D82, 0x2837, 0x2837, 0x1D57,
- 0x2838, 0x2838, 0x1D66, 0x2839, 0x2839, 0x1D5F, 0x283A, 0x283A, 0x1D6E,
- 0x283B, 0x283B, 0x1D76, 0x283C, 0x283C, 0x1D54, 0x283D, 0x283D, 0x1D67,
- 0x283E, 0x283E, 0x1D5C, 0x283F, 0x283F, 0x1D6F, 0x2840, 0x2840, 0x1D79,
- 0x3021, 0x307E, 0x0465, 0x3121, 0x317E, 0x04C3, 0x3221, 0x327E, 0x0521,
- 0x3321, 0x337E, 0x057F, 0x3421, 0x347E, 0x05DD, 0x3521, 0x357E, 0x063B,
- 0x3621, 0x367E, 0x0699, 0x3721, 0x377E, 0x06F7, 0x3821, 0x387E, 0x0755,
- 0x3921, 0x397E, 0x07B3, 0x3A21, 0x3A7E, 0x0811, 0x3B21, 0x3B7E, 0x086F,
- 0x3C21, 0x3C7E, 0x08CD, 0x3D21, 0x3D7E, 0x092B, 0x3E21, 0x3E7E, 0x0989,
- 0x3F21, 0x3F7E, 0x09E7, 0x4021, 0x407E, 0x0A45, 0x4121, 0x417E, 0x0AA3,
- 0x4221, 0x427E, 0x0B01, 0x4321, 0x437E, 0x0B5F, 0x4421, 0x447E, 0x0BBD,
- 0x4521, 0x457E, 0x0C1B, 0x4621, 0x467E, 0x0C79, 0x4721, 0x477E, 0x0CD7,
- 0x4821, 0x487E, 0x0D35, 0x4921, 0x497E, 0x0D93, 0x4A21, 0x4A7E, 0x0DF1,
- 0x4B21, 0x4B7E, 0x0E4F, 0x4C21, 0x4C7E, 0x0EAD, 0x4D21, 0x4D7E, 0x0F0B,
- 0x4E21, 0x4E7E, 0x0F69, 0x4F21, 0x4F53, 0x0FC7, 0x5021, 0x507E, 0x0FFA,
- 0x5121, 0x517E, 0x1058, 0x5221, 0x527E, 0x10B6, 0x5321, 0x537E, 0x1114,
- 0x5421, 0x547E, 0x1172, 0x5521, 0x557E, 0x11D0, 0x5621, 0x567E, 0x122E,
- 0x5721, 0x577E, 0x128C, 0x5821, 0x587E, 0x12EA, 0x5921, 0x597E, 0x1348,
- 0x5A21, 0x5A7E, 0x13A6, 0x5B21, 0x5B7E, 0x1404, 0x5C21, 0x5C7E, 0x1462,
- 0x5D21, 0x5D7E, 0x14C0, 0x5E21, 0x5E7E, 0x151E, 0x5F21, 0x5F7E, 0x157C,
- 0x6021, 0x607E, 0x15DA, 0x6121, 0x617E, 0x1638, 0x6221, 0x627E, 0x1696,
- 0x6321, 0x637E, 0x16F4, 0x6421, 0x647E, 0x1752, 0x6521, 0x657E, 0x17B0,
- 0x6621, 0x667E, 0x180E, 0x6721, 0x677E, 0x186C, 0x6821, 0x687E, 0x18CA,
- 0x6921, 0x697E, 0x1928, 0x6A21, 0x6A7E, 0x1986, 0x6B21, 0x6B7E, 0x19E4,
- 0x6C21, 0x6C7E, 0x1A42, 0x6D21, 0x6D7E, 0x1AA0, 0x6E21, 0x6E7E, 0x1AFE,
- 0x6F21, 0x6F7E, 0x1B5C, 0x7021, 0x707E, 0x1BBA, 0x7121, 0x717E, 0x1C18,
- 0x7221, 0x727E, 0x1C76, 0x7321, 0x737E, 0x1CD4, 0x7421, 0x7424, 0x1D32,
- 0x7425, 0x7426, 0x205C,
-};
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_H_1[118 * 3] = {
+ 0x2121, 0x217E, 0x0279, 0x2221, 0x222E, 0x02D7, 0x223A, 0x2241, 0x02E5,
+ 0x224A, 0x2250, 0x02ED, 0x225C, 0x226A, 0x02F4, 0x2272, 0x2279, 0x0303,
+ 0x227E, 0x227E, 0x030B, 0x2330, 0x2339, 0x030C, 0x2341, 0x235A, 0x0316,
+ 0x2361, 0x237A, 0x0330, 0x2421, 0x2473, 0x034A, 0x2521, 0x2576, 0x039D,
+ 0x2621, 0x2638, 0x03F3, 0x2641, 0x2658, 0x040B, 0x2721, 0x2741, 0x0423,
+ 0x2751, 0x2771, 0x0444, 0x2821, 0x2821, 0x1D37, 0x2822, 0x2822, 0x1D39,
+ 0x2823, 0x2823, 0x1D43, 0x2824, 0x2824, 0x1D47, 0x2825, 0x2825, 0x1D4F,
+ 0x2826, 0x2826, 0x1D4B, 0x2827, 0x2827, 0x1D53, 0x2828, 0x2828, 0x1D63,
+ 0x2829, 0x2829, 0x1D5B, 0x282A, 0x282A, 0x1D6B, 0x282B, 0x282B, 0x1D73,
+ 0x282C, 0x282C, 0x1D38, 0x282D, 0x282D, 0x1D3A, 0x282E, 0x282E, 0x1D46,
+ 0x282F, 0x282F, 0x1D4A, 0x2830, 0x2830, 0x1D52, 0x2831, 0x2831, 0x1D4E,
+ 0x2832, 0x2832, 0x1D5A, 0x2833, 0x2833, 0x1D6A, 0x2834, 0x2834, 0x1D62,
+ 0x2835, 0x2835, 0x1D72, 0x2836, 0x2836, 0x1D82, 0x2837, 0x2837, 0x1D57,
+ 0x2838, 0x2838, 0x1D66, 0x2839, 0x2839, 0x1D5F, 0x283A, 0x283A, 0x1D6E,
+ 0x283B, 0x283B, 0x1D76, 0x283C, 0x283C, 0x1D54, 0x283D, 0x283D, 0x1D67,
+ 0x283E, 0x283E, 0x1D5C, 0x283F, 0x283F, 0x1D6F, 0x2840, 0x2840, 0x1D79,
+ 0x3021, 0x307E, 0x0465, 0x3121, 0x317E, 0x04C3, 0x3221, 0x327E, 0x0521,
+ 0x3321, 0x337E, 0x057F, 0x3421, 0x347E, 0x05DD, 0x3521, 0x357E, 0x063B,
+ 0x3621, 0x367E, 0x0699, 0x3721, 0x377E, 0x06F7, 0x3821, 0x387E, 0x0755,
+ 0x3921, 0x397E, 0x07B3, 0x3A21, 0x3A7E, 0x0811, 0x3B21, 0x3B7E, 0x086F,
+ 0x3C21, 0x3C7E, 0x08CD, 0x3D21, 0x3D7E, 0x092B, 0x3E21, 0x3E7E, 0x0989,
+ 0x3F21, 0x3F7E, 0x09E7, 0x4021, 0x407E, 0x0A45, 0x4121, 0x417E, 0x0AA3,
+ 0x4221, 0x427E, 0x0B01, 0x4321, 0x437E, 0x0B5F, 0x4421, 0x447E, 0x0BBD,
+ 0x4521, 0x457E, 0x0C1B, 0x4621, 0x467E, 0x0C79, 0x4721, 0x477E, 0x0CD7,
+ 0x4821, 0x487E, 0x0D35, 0x4921, 0x497E, 0x0D93, 0x4A21, 0x4A7E, 0x0DF1,
+ 0x4B21, 0x4B7E, 0x0E4F, 0x4C21, 0x4C7E, 0x0EAD, 0x4D21, 0x4D7E, 0x0F0B,
+ 0x4E21, 0x4E7E, 0x0F69, 0x4F21, 0x4F53, 0x0FC7, 0x5021, 0x507E, 0x0FFA,
+ 0x5121, 0x517E, 0x1058, 0x5221, 0x527E, 0x10B6, 0x5321, 0x537E, 0x1114,
+ 0x5421, 0x547E, 0x1172, 0x5521, 0x557E, 0x11D0, 0x5621, 0x567E, 0x122E,
+ 0x5721, 0x577E, 0x128C, 0x5821, 0x587E, 0x12EA, 0x5921, 0x597E, 0x1348,
+ 0x5A21, 0x5A7E, 0x13A6, 0x5B21, 0x5B7E, 0x1404, 0x5C21, 0x5C7E, 0x1462,
+ 0x5D21, 0x5D7E, 0x14C0, 0x5E21, 0x5E7E, 0x151E, 0x5F21, 0x5F7E, 0x157C,
+ 0x6021, 0x607E, 0x15DA, 0x6121, 0x617E, 0x1638, 0x6221, 0x627E, 0x1696,
+ 0x6321, 0x637E, 0x16F4, 0x6421, 0x647E, 0x1752, 0x6521, 0x657E, 0x17B0,
+ 0x6621, 0x667E, 0x180E, 0x6721, 0x677E, 0x186C, 0x6821, 0x687E, 0x18CA,
+ 0x6921, 0x697E, 0x1928, 0x6A21, 0x6A7E, 0x1986, 0x6B21, 0x6B7E, 0x19E4,
+ 0x6C21, 0x6C7E, 0x1A42, 0x6D21, 0x6D7E, 0x1AA0, 0x6E21, 0x6E7E, 0x1AFE,
+ 0x6F21, 0x6F7E, 0x1B5C, 0x7021, 0x707E, 0x1BBA, 0x7121, 0x717E, 0x1C18,
+ 0x7221, 0x727E, 0x1C76, 0x7321, 0x737E, 0x1CD4, 0x7421, 0x7424, 0x1D32,
+ 0x7425, 0x7426, 0x205C,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UCS2-HW-V_4.cpp b/core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UCS2-HW-V_4.cpp
index a59420ac5f..e996aebbae 100644
--- a/core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UCS2-HW-V_4.cpp
+++ b/core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UCS2-HW-V_4.cpp
@@ -1,75 +1,75 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-extern const unsigned short g_FXCMAP_UniJIS_UCS2_HW_V_4[199 * 3] = {
- 0x0020, 0x005B, 0x00E7, 0x005C, 0x005C, 0x220F, 0x005D, 0x007E, 0x0124,
- 0x00A5, 0x00A5, 0x0123, 0x00B0, 0x00B0, 0x204D, 0x2010, 0x2010, 0x1ED5,
- 0x2015, 0x2015, 0x1ED4, 0x2016, 0x2016, 0x1ED7, 0x2018, 0x2019, 0x2059,
- 0x201C, 0x201D, 0x2057, 0x2025, 0x2025, 0x1EDA, 0x2026, 0x2026, 0x1ED9,
- 0x2032, 0x2032, 0x2051, 0x2033, 0x2033, 0x205B, 0x2190, 0x2190, 0x02E2,
- 0x2191, 0x2191, 0x02E0, 0x2192, 0x2192, 0x02E3, 0x2193, 0x2193, 0x02E1,
- 0x2195, 0x2195, 0x2FB6, 0x21C4, 0x21C4, 0x2077, 0x21C5, 0x21C5, 0x2076,
- 0x21C6, 0x21C6, 0x2078, 0x21E6, 0x21E6, 0x1F4C, 0x21E7, 0x21E7, 0x1F4E,
- 0x21E8, 0x21E8, 0x1F4B, 0x21E9, 0x21E9, 0x1F4D, 0x2225, 0x2225, 0x1ED7,
- 0x223C, 0x223C, 0x1ED6, 0x22EF, 0x22EF, 0x1ED9, 0x2500, 0x2501, 0x1D39,
- 0x2502, 0x2503, 0x1D37, 0x2504, 0x2505, 0x1D3D, 0x2506, 0x2507, 0x1D3B,
- 0x2508, 0x2509, 0x1D41, 0x250A, 0x250B, 0x1D3F, 0x250C, 0x250C, 0x1D47,
- 0x250D, 0x250D, 0x1D49, 0x250E, 0x250E, 0x1D48, 0x250F, 0x250F, 0x1D4A,
- 0x2510, 0x2510, 0x1D4F, 0x2511, 0x2511, 0x1D51, 0x2512, 0x2512, 0x1D50,
- 0x2513, 0x2513, 0x1D52, 0x2514, 0x2514, 0x1D43, 0x2515, 0x2515, 0x1D45,
- 0x2516, 0x2516, 0x1D44, 0x2517, 0x2517, 0x1D46, 0x2518, 0x2518, 0x1D4B,
- 0x2519, 0x2519, 0x1D4D, 0x251A, 0x251A, 0x1D4C, 0x251B, 0x251B, 0x1D4E,
- 0x251C, 0x251C, 0x1D63, 0x251D, 0x251D, 0x1D67, 0x251E, 0x251E, 0x1D65,
- 0x251F, 0x251F, 0x1D64, 0x2520, 0x2520, 0x1D66, 0x2521, 0x2521, 0x1D69,
- 0x2522, 0x2522, 0x1D68, 0x2523, 0x2524, 0x1D6A, 0x2525, 0x2525, 0x1D6F,
- 0x2526, 0x2526, 0x1D6D, 0x2527, 0x2527, 0x1D6C, 0x2528, 0x2528, 0x1D6E,
- 0x2529, 0x2529, 0x1D71, 0x252A, 0x252A, 0x1D70, 0x252B, 0x252B, 0x1D72,
- 0x252C, 0x252C, 0x1D5B, 0x252D, 0x252F, 0x1D5D, 0x2530, 0x2530, 0x1D5C,
- 0x2531, 0x2533, 0x1D60, 0x2534, 0x2534, 0x1D53, 0x2535, 0x2537, 0x1D55,
- 0x2538, 0x2538, 0x1D54, 0x2539, 0x253B, 0x1D58, 0x253D, 0x253F, 0x1D77,
- 0x2540, 0x2540, 0x1D75, 0x2541, 0x2541, 0x1D74, 0x2542, 0x2542, 0x1D76,
- 0x2543, 0x2543, 0x1D7B, 0x2544, 0x2544, 0x1D7D, 0x2545, 0x2545, 0x1D7A,
- 0x2546, 0x2546, 0x1D7C, 0x2547, 0x2547, 0x1D81, 0x2548, 0x2548, 0x1D80,
- 0x2549, 0x254A, 0x1D7E, 0x261C, 0x261C, 0x201D, 0x261D, 0x261D, 0x201B,
- 0x261E, 0x261E, 0x201E, 0x261F, 0x261F, 0x201C, 0x2702, 0x2702, 0x2F92,
- 0x27A1, 0x27A1, 0x2011, 0x3001, 0x3002, 0x1ECF, 0x3008, 0x3011, 0x1EE3,
- 0x3013, 0x3013, 0x204E, 0x3014, 0x3015, 0x1EDD, 0x301C, 0x301C, 0x1ED6,
- 0x301D, 0x301D, 0x1F14, 0x301F, 0x301F, 0x1F15, 0x3041, 0x3041, 0x1EEE,
- 0x3043, 0x3043, 0x1EEF, 0x3045, 0x3045, 0x1EF0, 0x3047, 0x3047, 0x1EF1,
- 0x3049, 0x3049, 0x1EF2, 0x3063, 0x3063, 0x1EF3, 0x3083, 0x3083, 0x1EF4,
- 0x3085, 0x3085, 0x1EF5, 0x3087, 0x3087, 0x1EF6, 0x308E, 0x308E, 0x1EF7,
- 0x309B, 0x309B, 0x2050, 0x309C, 0x309C, 0x204F, 0x30A1, 0x30A1, 0x1EF8,
- 0x30A3, 0x30A3, 0x1EF9, 0x30A5, 0x30A5, 0x1EFA, 0x30A7, 0x30A7, 0x1EFB,
- 0x30A9, 0x30A9, 0x1EFC, 0x30C3, 0x30C3, 0x1EFD, 0x30E3, 0x30E3, 0x1EFE,
- 0x30E5, 0x30E5, 0x1EFF, 0x30E7, 0x30E7, 0x1F00, 0x30EE, 0x30EE, 0x1F01,
- 0x30F5, 0x30F6, 0x1F02, 0x30FC, 0x30FC, 0x1ED3, 0x3300, 0x3300, 0x209E,
- 0x3301, 0x3302, 0x2EB6, 0x3303, 0x3303, 0x2092, 0x3304, 0x3304, 0x2EB8,
- 0x3305, 0x3305, 0x208D, 0x3306, 0x3306, 0x2EB9, 0x3307, 0x3307, 0x2EBD,
- 0x3308, 0x3308, 0x2EBB, 0x3309, 0x3309, 0x2EC0, 0x330A, 0x330A, 0x2EBE,
- 0x330B, 0x330B, 0x2EC2, 0x330C, 0x330C, 0x2EC4, 0x330D, 0x330D, 0x1F0E,
- 0x330E, 0x3313, 0x2EC5, 0x3314, 0x3314, 0x1F05, 0x3315, 0x3315, 0x2094,
- 0x3316, 0x3316, 0x208A, 0x3317, 0x3317, 0x2ECC, 0x3318, 0x3318, 0x2093,
- 0x3319, 0x3319, 0x2ECE, 0x331A, 0x331D, 0x2ED0, 0x331E, 0x331E, 0x20A1,
- 0x331F, 0x3321, 0x2ED4, 0x3322, 0x3322, 0x2089, 0x3323, 0x3323, 0x209C,
- 0x3324, 0x3324, 0x2ED7, 0x3325, 0x3325, 0x2ED9, 0x3326, 0x3326, 0x1F0F,
- 0x3327, 0x3327, 0x1F09, 0x3328, 0x3329, 0x2EDC, 0x332A, 0x332A, 0x20A4,
- 0x332B, 0x332B, 0x1F11, 0x332D, 0x332D, 0x2EDF, 0x332E, 0x3330, 0x2EE2,
- 0x3331, 0x3331, 0x20A6, 0x3332, 0x3332, 0x2EE5, 0x3333, 0x3333, 0x208E,
- 0x3334, 0x3335, 0x2EE8, 0x3336, 0x3336, 0x1F0B, 0x3337, 0x3337, 0x2EEE,
- 0x3338, 0x3338, 0x2EF0, 0x3339, 0x3339, 0x2097, 0x333A, 0x333A, 0x2EF1,
- 0x333B, 0x333B, 0x209D, 0x333C, 0x333C, 0x2EEA, 0x333D, 0x333D, 0x2EF2,
- 0x333E, 0x3340, 0x2EF4, 0x3341, 0x3341, 0x2EF3, 0x3342, 0x3342, 0x209B,
- 0x3343, 0x3346, 0x2EF7, 0x3347, 0x3347, 0x20A5, 0x3348, 0x3348, 0x2EFB,
- 0x3349, 0x3349, 0x1F04, 0x334A, 0x334A, 0x1F12, 0x334B, 0x334C, 0x2EFC,
- 0x334D, 0x334D, 0x1F07, 0x334E, 0x334E, 0x2091, 0x334F, 0x3350, 0x2EFE,
- 0x3351, 0x3351, 0x1F0C, 0x3352, 0x3352, 0x2F02, 0x3353, 0x3353, 0x2F06,
- 0x3354, 0x3354, 0x2F03, 0x3355, 0x3356, 0x2F07, 0x3357, 0x3357, 0x2098,
- 0x337F, 0x337F, 0x2084, 0xFF08, 0xFF09, 0x1EDB, 0xFF0C, 0xFF0C, 0x204C,
- 0xFF0E, 0xFF0E, 0x2052, 0xFF1D, 0xFF1D, 0x1EED, 0xFF3B, 0xFF3B, 0x1EDF,
- 0xFF3D, 0xFF3D, 0x1EE0, 0xFF3F, 0xFF3F, 0x1ED2, 0xFF5B, 0xFF5B, 0x1EE1,
- 0xFF5C, 0xFF5C, 0x1ED8, 0xFF5D, 0xFF5D, 0x1EE2, 0xFF5E, 0xFF5E, 0x1ED6,
- 0xFFE3, 0xFFE3, 0x1ED1,
-};
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_UniJIS_UCS2_HW_V_4[199 * 3] = {
+ 0x0020, 0x005B, 0x00E7, 0x005C, 0x005C, 0x220F, 0x005D, 0x007E, 0x0124,
+ 0x00A5, 0x00A5, 0x0123, 0x00B0, 0x00B0, 0x204D, 0x2010, 0x2010, 0x1ED5,
+ 0x2015, 0x2015, 0x1ED4, 0x2016, 0x2016, 0x1ED7, 0x2018, 0x2019, 0x2059,
+ 0x201C, 0x201D, 0x2057, 0x2025, 0x2025, 0x1EDA, 0x2026, 0x2026, 0x1ED9,
+ 0x2032, 0x2032, 0x2051, 0x2033, 0x2033, 0x205B, 0x2190, 0x2190, 0x02E2,
+ 0x2191, 0x2191, 0x02E0, 0x2192, 0x2192, 0x02E3, 0x2193, 0x2193, 0x02E1,
+ 0x2195, 0x2195, 0x2FB6, 0x21C4, 0x21C4, 0x2077, 0x21C5, 0x21C5, 0x2076,
+ 0x21C6, 0x21C6, 0x2078, 0x21E6, 0x21E6, 0x1F4C, 0x21E7, 0x21E7, 0x1F4E,
+ 0x21E8, 0x21E8, 0x1F4B, 0x21E9, 0x21E9, 0x1F4D, 0x2225, 0x2225, 0x1ED7,
+ 0x223C, 0x223C, 0x1ED6, 0x22EF, 0x22EF, 0x1ED9, 0x2500, 0x2501, 0x1D39,
+ 0x2502, 0x2503, 0x1D37, 0x2504, 0x2505, 0x1D3D, 0x2506, 0x2507, 0x1D3B,
+ 0x2508, 0x2509, 0x1D41, 0x250A, 0x250B, 0x1D3F, 0x250C, 0x250C, 0x1D47,
+ 0x250D, 0x250D, 0x1D49, 0x250E, 0x250E, 0x1D48, 0x250F, 0x250F, 0x1D4A,
+ 0x2510, 0x2510, 0x1D4F, 0x2511, 0x2511, 0x1D51, 0x2512, 0x2512, 0x1D50,
+ 0x2513, 0x2513, 0x1D52, 0x2514, 0x2514, 0x1D43, 0x2515, 0x2515, 0x1D45,
+ 0x2516, 0x2516, 0x1D44, 0x2517, 0x2517, 0x1D46, 0x2518, 0x2518, 0x1D4B,
+ 0x2519, 0x2519, 0x1D4D, 0x251A, 0x251A, 0x1D4C, 0x251B, 0x251B, 0x1D4E,
+ 0x251C, 0x251C, 0x1D63, 0x251D, 0x251D, 0x1D67, 0x251E, 0x251E, 0x1D65,
+ 0x251F, 0x251F, 0x1D64, 0x2520, 0x2520, 0x1D66, 0x2521, 0x2521, 0x1D69,
+ 0x2522, 0x2522, 0x1D68, 0x2523, 0x2524, 0x1D6A, 0x2525, 0x2525, 0x1D6F,
+ 0x2526, 0x2526, 0x1D6D, 0x2527, 0x2527, 0x1D6C, 0x2528, 0x2528, 0x1D6E,
+ 0x2529, 0x2529, 0x1D71, 0x252A, 0x252A, 0x1D70, 0x252B, 0x252B, 0x1D72,
+ 0x252C, 0x252C, 0x1D5B, 0x252D, 0x252F, 0x1D5D, 0x2530, 0x2530, 0x1D5C,
+ 0x2531, 0x2533, 0x1D60, 0x2534, 0x2534, 0x1D53, 0x2535, 0x2537, 0x1D55,
+ 0x2538, 0x2538, 0x1D54, 0x2539, 0x253B, 0x1D58, 0x253D, 0x253F, 0x1D77,
+ 0x2540, 0x2540, 0x1D75, 0x2541, 0x2541, 0x1D74, 0x2542, 0x2542, 0x1D76,
+ 0x2543, 0x2543, 0x1D7B, 0x2544, 0x2544, 0x1D7D, 0x2545, 0x2545, 0x1D7A,
+ 0x2546, 0x2546, 0x1D7C, 0x2547, 0x2547, 0x1D81, 0x2548, 0x2548, 0x1D80,
+ 0x2549, 0x254A, 0x1D7E, 0x261C, 0x261C, 0x201D, 0x261D, 0x261D, 0x201B,
+ 0x261E, 0x261E, 0x201E, 0x261F, 0x261F, 0x201C, 0x2702, 0x2702, 0x2F92,
+ 0x27A1, 0x27A1, 0x2011, 0x3001, 0x3002, 0x1ECF, 0x3008, 0x3011, 0x1EE3,
+ 0x3013, 0x3013, 0x204E, 0x3014, 0x3015, 0x1EDD, 0x301C, 0x301C, 0x1ED6,
+ 0x301D, 0x301D, 0x1F14, 0x301F, 0x301F, 0x1F15, 0x3041, 0x3041, 0x1EEE,
+ 0x3043, 0x3043, 0x1EEF, 0x3045, 0x3045, 0x1EF0, 0x3047, 0x3047, 0x1EF1,
+ 0x3049, 0x3049, 0x1EF2, 0x3063, 0x3063, 0x1EF3, 0x3083, 0x3083, 0x1EF4,
+ 0x3085, 0x3085, 0x1EF5, 0x3087, 0x3087, 0x1EF6, 0x308E, 0x308E, 0x1EF7,
+ 0x309B, 0x309B, 0x2050, 0x309C, 0x309C, 0x204F, 0x30A1, 0x30A1, 0x1EF8,
+ 0x30A3, 0x30A3, 0x1EF9, 0x30A5, 0x30A5, 0x1EFA, 0x30A7, 0x30A7, 0x1EFB,
+ 0x30A9, 0x30A9, 0x1EFC, 0x30C3, 0x30C3, 0x1EFD, 0x30E3, 0x30E3, 0x1EFE,
+ 0x30E5, 0x30E5, 0x1EFF, 0x30E7, 0x30E7, 0x1F00, 0x30EE, 0x30EE, 0x1F01,
+ 0x30F5, 0x30F6, 0x1F02, 0x30FC, 0x30FC, 0x1ED3, 0x3300, 0x3300, 0x209E,
+ 0x3301, 0x3302, 0x2EB6, 0x3303, 0x3303, 0x2092, 0x3304, 0x3304, 0x2EB8,
+ 0x3305, 0x3305, 0x208D, 0x3306, 0x3306, 0x2EB9, 0x3307, 0x3307, 0x2EBD,
+ 0x3308, 0x3308, 0x2EBB, 0x3309, 0x3309, 0x2EC0, 0x330A, 0x330A, 0x2EBE,
+ 0x330B, 0x330B, 0x2EC2, 0x330C, 0x330C, 0x2EC4, 0x330D, 0x330D, 0x1F0E,
+ 0x330E, 0x3313, 0x2EC5, 0x3314, 0x3314, 0x1F05, 0x3315, 0x3315, 0x2094,
+ 0x3316, 0x3316, 0x208A, 0x3317, 0x3317, 0x2ECC, 0x3318, 0x3318, 0x2093,
+ 0x3319, 0x3319, 0x2ECE, 0x331A, 0x331D, 0x2ED0, 0x331E, 0x331E, 0x20A1,
+ 0x331F, 0x3321, 0x2ED4, 0x3322, 0x3322, 0x2089, 0x3323, 0x3323, 0x209C,
+ 0x3324, 0x3324, 0x2ED7, 0x3325, 0x3325, 0x2ED9, 0x3326, 0x3326, 0x1F0F,
+ 0x3327, 0x3327, 0x1F09, 0x3328, 0x3329, 0x2EDC, 0x332A, 0x332A, 0x20A4,
+ 0x332B, 0x332B, 0x1F11, 0x332D, 0x332D, 0x2EDF, 0x332E, 0x3330, 0x2EE2,
+ 0x3331, 0x3331, 0x20A6, 0x3332, 0x3332, 0x2EE5, 0x3333, 0x3333, 0x208E,
+ 0x3334, 0x3335, 0x2EE8, 0x3336, 0x3336, 0x1F0B, 0x3337, 0x3337, 0x2EEE,
+ 0x3338, 0x3338, 0x2EF0, 0x3339, 0x3339, 0x2097, 0x333A, 0x333A, 0x2EF1,
+ 0x333B, 0x333B, 0x209D, 0x333C, 0x333C, 0x2EEA, 0x333D, 0x333D, 0x2EF2,
+ 0x333E, 0x3340, 0x2EF4, 0x3341, 0x3341, 0x2EF3, 0x3342, 0x3342, 0x209B,
+ 0x3343, 0x3346, 0x2EF7, 0x3347, 0x3347, 0x20A5, 0x3348, 0x3348, 0x2EFB,
+ 0x3349, 0x3349, 0x1F04, 0x334A, 0x334A, 0x1F12, 0x334B, 0x334C, 0x2EFC,
+ 0x334D, 0x334D, 0x1F07, 0x334E, 0x334E, 0x2091, 0x334F, 0x3350, 0x2EFE,
+ 0x3351, 0x3351, 0x1F0C, 0x3352, 0x3352, 0x2F02, 0x3353, 0x3353, 0x2F06,
+ 0x3354, 0x3354, 0x2F03, 0x3355, 0x3356, 0x2F07, 0x3357, 0x3357, 0x2098,
+ 0x337F, 0x337F, 0x2084, 0xFF08, 0xFF09, 0x1EDB, 0xFF0C, 0xFF0C, 0x204C,
+ 0xFF0E, 0xFF0E, 0x2052, 0xFF1D, 0xFF1D, 0x1EED, 0xFF3B, 0xFF3B, 0x1EDF,
+ 0xFF3D, 0xFF3D, 0x1EE0, 0xFF3F, 0xFF3F, 0x1ED2, 0xFF5B, 0xFF5B, 0x1EE1,
+ 0xFF5C, 0xFF5C, 0x1ED8, 0xFF5D, 0xFF5D, 0x1EE2, 0xFF5E, 0xFF5E, 0x1ED6,
+ 0xFFE3, 0xFFE3, 0x1ED1,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UCS2-H_4.cpp b/core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UCS2-H_4.cpp
index 35f0b71518..c6ab8349c3 100644
--- a/core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UCS2-H_4.cpp
+++ b/core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UCS2-H_4.cpp
@@ -1,2451 +1,2451 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-extern const unsigned short g_FXCMAP_UniJIS_UCS2_H_4[9772 * 2] = {
- 0x0020, 0x0001, 0x0021, 0x0002, 0x0022, 0x0003, 0x0023, 0x0004,
- 0x0024, 0x0005, 0x0025, 0x0006, 0x0026, 0x0007, 0x0027, 0x0008,
- 0x0028, 0x0009, 0x0029, 0x000A, 0x002A, 0x000B, 0x002B, 0x000C,
- 0x002C, 0x000D, 0x002D, 0x000E, 0x002E, 0x000F, 0x002F, 0x0010,
- 0x0030, 0x0011, 0x0031, 0x0012, 0x0032, 0x0013, 0x0033, 0x0014,
- 0x0034, 0x0015, 0x0035, 0x0016, 0x0036, 0x0017, 0x0037, 0x0018,
- 0x0038, 0x0019, 0x0039, 0x001A, 0x003A, 0x001B, 0x003B, 0x001C,
- 0x003C, 0x001D, 0x003D, 0x001E, 0x003E, 0x001F, 0x003F, 0x0020,
- 0x0040, 0x0021, 0x0041, 0x0022, 0x0042, 0x0023, 0x0043, 0x0024,
- 0x0044, 0x0025, 0x0045, 0x0026, 0x0046, 0x0027, 0x0047, 0x0028,
- 0x0048, 0x0029, 0x0049, 0x002A, 0x004A, 0x002B, 0x004B, 0x002C,
- 0x004C, 0x002D, 0x004D, 0x002E, 0x004E, 0x002F, 0x004F, 0x0030,
- 0x0050, 0x0031, 0x0051, 0x0032, 0x0052, 0x0033, 0x0053, 0x0034,
- 0x0054, 0x0035, 0x0055, 0x0036, 0x0056, 0x0037, 0x0057, 0x0038,
- 0x0058, 0x0039, 0x0059, 0x003A, 0x005A, 0x003B, 0x005B, 0x003C,
- 0x005C, 0x0061, 0x005D, 0x003E, 0x005E, 0x003F, 0x005F, 0x0040,
- 0x0060, 0x0041, 0x0061, 0x0042, 0x0062, 0x0043, 0x0063, 0x0044,
- 0x0064, 0x0045, 0x0065, 0x0046, 0x0066, 0x0047, 0x0067, 0x0048,
- 0x0068, 0x0049, 0x0069, 0x004A, 0x006A, 0x004B, 0x006B, 0x004C,
- 0x006C, 0x004D, 0x006D, 0x004E, 0x006E, 0x004F, 0x006F, 0x0050,
- 0x0070, 0x0051, 0x0071, 0x0052, 0x0072, 0x0053, 0x0073, 0x0054,
- 0x0074, 0x0055, 0x0075, 0x0056, 0x0076, 0x0057, 0x0077, 0x0058,
- 0x0078, 0x0059, 0x0079, 0x005A, 0x007A, 0x005B, 0x007B, 0x005C,
- 0x007C, 0x005D, 0x007D, 0x005E, 0x007E, 0x005F, 0x00A1, 0x0065,
- 0x00A2, 0x0066, 0x00A3, 0x0067, 0x00A4, 0x006B, 0x00A5, 0x003D,
- 0x00A6, 0x0063, 0x00A7, 0x02D0, 0x00A8, 0x0287, 0x00A9, 0x0098,
- 0x00AA, 0x008C, 0x00AB, 0x006D, 0x00AC, 0x0099, 0x00AD, 0x0097,
- 0x00AE, 0x009A, 0x00AF, 0x0081, 0x00B0, 0x02C3, 0x00B1, 0x02B6,
- 0x00B2, 0x009D, 0x00B3, 0x009E, 0x00B4, 0x0285, 0x00B5, 0x009F,
- 0x00B6, 0x030A, 0x00B7, 0x0075, 0x00B8, 0x0086, 0x00B9, 0x00A0,
- 0x00BA, 0x0090, 0x00BB, 0x007B, 0x00BC, 0x00A1, 0x00BD, 0x00A2,
- 0x00BE, 0x00A3, 0x00BF, 0x007E, 0x00C0, 0x00A4, 0x00C1, 0x00A5,
- 0x00C2, 0x00A6, 0x00C3, 0x00A7, 0x00C4, 0x00A8, 0x00C5, 0x00A9,
- 0x00C6, 0x008B, 0x00C7, 0x00AA, 0x00C8, 0x00AB, 0x00C9, 0x00AC,
- 0x00CA, 0x00AD, 0x00CB, 0x00AE, 0x00CC, 0x00AF, 0x00CD, 0x00B0,
- 0x00CE, 0x00B1, 0x00CF, 0x00B2, 0x00D0, 0x00B3, 0x00D1, 0x00B4,
- 0x00D2, 0x00B5, 0x00D3, 0x00B6, 0x00D4, 0x00B7, 0x00D5, 0x00B8,
- 0x00D6, 0x00B9, 0x00D7, 0x02B7, 0x00D8, 0x008E, 0x00D9, 0x00BB,
- 0x00DA, 0x00BC, 0x00DB, 0x00BD, 0x00DC, 0x00BE, 0x00DD, 0x00BF,
- 0x00DE, 0x00C0, 0x00DF, 0x0096, 0x00E0, 0x00C1, 0x00E1, 0x00C2,
- 0x00E2, 0x00C3, 0x00E3, 0x00C4, 0x00E4, 0x00C5, 0x00E5, 0x00C6,
- 0x00E6, 0x0091, 0x00E7, 0x00C7, 0x00E8, 0x00C8, 0x00E9, 0x00C9,
- 0x00EA, 0x00CA, 0x00EB, 0x00CB, 0x00EC, 0x00CC, 0x00ED, 0x00CD,
- 0x00EE, 0x00CE, 0x00EF, 0x00CF, 0x00F0, 0x00D0, 0x00F1, 0x00D1,
- 0x00F2, 0x00D2, 0x00F3, 0x00D3, 0x00F4, 0x00D4, 0x00F5, 0x00D5,
- 0x00F6, 0x00D6, 0x00F7, 0x02B8, 0x00F8, 0x0094, 0x00F9, 0x00D8,
- 0x00FA, 0x00D9, 0x00FB, 0x00DA, 0x00FC, 0x00DB, 0x00FD, 0x00DC,
- 0x00FE, 0x00DD, 0x00FF, 0x00DE, 0x0100, 0x2496, 0x0101, 0x2491,
- 0x0112, 0x2499, 0x0113, 0x2494, 0x011A, 0x24B3, 0x011B, 0x24BF,
- 0x0127, 0x2F3C, 0x0128, 0x24B8, 0x0129, 0x24C4, 0x012A, 0x2497,
- 0x012B, 0x2492, 0x0131, 0x0092, 0x0141, 0x008D, 0x0142, 0x0093,
- 0x014B, 0x24DC, 0x014C, 0x249A, 0x014D, 0x2495, 0x0152, 0x008F,
- 0x0153, 0x0095, 0x0160, 0x00DF, 0x0161, 0x00E3, 0x0168, 0x24BD,
- 0x0169, 0x24C9, 0x016A, 0x2498, 0x016B, 0x2493, 0x016E, 0x24BC,
- 0x016F, 0x24C8, 0x0178, 0x00E0, 0x017D, 0x00E1, 0x017E, 0x00E5,
- 0x01C0, 0x0063, 0x01CD, 0x24B2, 0x01CE, 0x24BE, 0x01CF, 0x24B6,
- 0x01D0, 0x24C2, 0x01D1, 0x24B9, 0x01D2, 0x24C5, 0x01D3, 0x24BB,
- 0x01D4, 0x24C7, 0x01FD, 0x24CD, 0x0251, 0x24CA, 0x0254, 0x24CF,
- 0x0259, 0x24D2, 0x025A, 0x24D5, 0x025B, 0x24D8, 0x0275, 0x24DD,
- 0x0283, 0x24E2, 0x028C, 0x24DE, 0x0292, 0x24E1, 0x02D0, 0x24E3,
- 0x0300, 0x0041, 0x0301, 0x007F, 0x0302, 0x0080, 0x0303, 0x005F,
- 0x0304, 0x0081, 0x0305, 0x00E2, 0x0306, 0x0082, 0x0307, 0x0083,
- 0x0308, 0x0084, 0x030A, 0x0085, 0x030B, 0x0087, 0x030C, 0x0089,
- 0x0327, 0x0086, 0x0328, 0x0088, 0x0332, 0x0040, 0x0336, 0x008A,
- 0x0361, 0x02F6, 0x0391, 0x03F3, 0x0392, 0x03F4, 0x0393, 0x03F5,
- 0x0394, 0x03F6, 0x0395, 0x03F7, 0x0396, 0x03F8, 0x0397, 0x03F9,
- 0x0398, 0x03FA, 0x0399, 0x03FB, 0x039A, 0x03FC, 0x039B, 0x03FD,
- 0x039C, 0x03FE, 0x039D, 0x03FF, 0x039E, 0x0400, 0x039F, 0x0401,
- 0x03A0, 0x0402, 0x03A1, 0x0403, 0x03A3, 0x0404, 0x03A4, 0x0405,
- 0x03A5, 0x0406, 0x03A6, 0x0407, 0x03A7, 0x0408, 0x03A8, 0x0409,
- 0x03A9, 0x040A, 0x03B1, 0x040B, 0x03B2, 0x040C, 0x03B3, 0x040D,
- 0x03B4, 0x040E, 0x03B5, 0x040F, 0x03B6, 0x0410, 0x03B7, 0x0411,
- 0x03B8, 0x0412, 0x03B9, 0x0413, 0x03BA, 0x0414, 0x03BB, 0x0415,
- 0x03BC, 0x0416, 0x03BD, 0x0417, 0x03BE, 0x0418, 0x03BF, 0x0419,
- 0x03C0, 0x041A, 0x03C1, 0x041B, 0x03C3, 0x041C, 0x03C4, 0x041D,
- 0x03C5, 0x041E, 0x03C6, 0x041F, 0x03C7, 0x0420, 0x03C8, 0x0421,
- 0x03C9, 0x0422, 0x03D0, 0x2F3A, 0x03D1, 0x2F40, 0x03DB, 0x2F3F,
- 0x0401, 0x0429, 0x0410, 0x0423, 0x0411, 0x0424, 0x0412, 0x0425,
- 0x0413, 0x0426, 0x0414, 0x0427, 0x0415, 0x0428, 0x0416, 0x042A,
- 0x0417, 0x042B, 0x0418, 0x042C, 0x0419, 0x042D, 0x041A, 0x042E,
- 0x041B, 0x042F, 0x041C, 0x0430, 0x041D, 0x0431, 0x041E, 0x0432,
- 0x041F, 0x0433, 0x0420, 0x0434, 0x0421, 0x0435, 0x0422, 0x0436,
- 0x0423, 0x0437, 0x0424, 0x0438, 0x0425, 0x0439, 0x0426, 0x043A,
- 0x0427, 0x043B, 0x0428, 0x043C, 0x0429, 0x043D, 0x042A, 0x043E,
- 0x042B, 0x043F, 0x042C, 0x0440, 0x042D, 0x0441, 0x042E, 0x0442,
- 0x042F, 0x0443, 0x0430, 0x0444, 0x0431, 0x0445, 0x0432, 0x0446,
- 0x0433, 0x0447, 0x0434, 0x0448, 0x0435, 0x0449, 0x0436, 0x044B,
- 0x0437, 0x044C, 0x0438, 0x044D, 0x0439, 0x044E, 0x043A, 0x044F,
- 0x043B, 0x0450, 0x043C, 0x0451, 0x043D, 0x0452, 0x043E, 0x0453,
- 0x043F, 0x0454, 0x0440, 0x0455, 0x0441, 0x0456, 0x0442, 0x0457,
- 0x0443, 0x0458, 0x0444, 0x0459, 0x0445, 0x045A, 0x0446, 0x045B,
- 0x0447, 0x045C, 0x0448, 0x045D, 0x0449, 0x045E, 0x044A, 0x045F,
- 0x044B, 0x0460, 0x044C, 0x0461, 0x044D, 0x0462, 0x044E, 0x0463,
- 0x044F, 0x0464, 0x0451, 0x044A, 0x045B, 0x2F3C, 0x1EBC, 0x24B5,
- 0x1EBD, 0x24C1, 0x2002, 0x00E7, 0x2003, 0x0279, 0x2010, 0x0296,
- 0x2011, 0x000E, 0x2012, 0x0072, 0x2013, 0x0072, 0x2014, 0x008A,
- 0x2015, 0x0295, 0x2016, 0x029A, 0x2018, 0x029E, 0x2019, 0x029F,
- 0x201A, 0x0078, 0x201C, 0x02A0, 0x201D, 0x02A1, 0x201E, 0x0079,
- 0x2020, 0x0308, 0x2021, 0x0309, 0x2022, 0x0077, 0x2025, 0x029D,
- 0x2026, 0x029C, 0x2030, 0x0304, 0x2032, 0x02C4, 0x2033, 0x02C5,
- 0x2039, 0x006E, 0x203A, 0x006F, 0x203B, 0x02DE, 0x203C, 0x2F4F,
- 0x203E, 0x0145, 0x2044, 0x0068, 0x2049, 0x2F50, 0x2070, 0x24A1,
- 0x2074, 0x24A2, 0x2075, 0x24A3, 0x2076, 0x24A4, 0x2077, 0x24A5,
- 0x2078, 0x24A6, 0x2079, 0x24A7, 0x2080, 0x24A8, 0x2081, 0x24A9,
- 0x2082, 0x24AA, 0x2083, 0x24AB, 0x2084, 0x24AC, 0x2085, 0x24AD,
- 0x2086, 0x24AE, 0x2087, 0x24AF, 0x2088, 0x24B0, 0x2089, 0x24B1,
- 0x20AC, 0x248A, 0x20DD, 0x030B, 0x2100, 0x2E4F, 0x2103, 0x02C6,
- 0x2105, 0x2E53, 0x2109, 0x2071, 0x210A, 0x2070, 0x210F, 0x2F3C,
- 0x2113, 0x1F59, 0x2116, 0x1DBA, 0x2121, 0x1F77, 0x2122, 0x00E4,
- 0x2126, 0x248B, 0x212B, 0x0303, 0x2135, 0x2F39, 0x2153, 0x249F,
- 0x2154, 0x24A0, 0x215B, 0x249B, 0x215C, 0x249C, 0x215D, 0x249D,
- 0x215E, 0x249E, 0x2160, 0x1D97, 0x2161, 0x1D98, 0x2162, 0x1D99,
- 0x2163, 0x1D9A, 0x2164, 0x1D9B, 0x2165, 0x1D9C, 0x2166, 0x1D9D,
- 0x2167, 0x1D9E, 0x2168, 0x1D9F, 0x2169, 0x1DA0, 0x216A, 0x2021,
- 0x216B, 0x2022, 0x2170, 0x1F9C, 0x2171, 0x1F9D, 0x2172, 0x1F9E,
- 0x2173, 0x1F9F, 0x2174, 0x1FA0, 0x2175, 0x1FA1, 0x2176, 0x1FA2,
- 0x2177, 0x1FA3, 0x2178, 0x1FA4, 0x2179, 0x1FA5, 0x217A, 0x206A,
- 0x217B, 0x206B, 0x217F, 0x206F, 0x2190, 0x02E1, 0x2191, 0x02E2,
- 0x2192, 0x02E0, 0x2193, 0x02E3, 0x2194, 0x2FA9, 0x2195, 0x2FB7,
- 0x2196, 0x2FAC, 0x2197, 0x2FAD, 0x2198, 0x2FAA, 0x2199, 0x2FAB,
- 0x21C4, 0x2076, 0x21C5, 0x2077, 0x21C6, 0x2075, 0x21CC, 0x2FAE,
- 0x21D0, 0x2FA8, 0x21D2, 0x02F0, 0x21D4, 0x02F1, 0x21E6, 0x1F4D,
- 0x21E7, 0x1F4C, 0x21E8, 0x1F4E, 0x21E9, 0x1F4B, 0x2200, 0x02F2,
- 0x2202, 0x02F7, 0x2203, 0x02F3, 0x2205, 0x2F98, 0x2207, 0x02F8,
- 0x2208, 0x02E5, 0x220A, 0x2F3B, 0x220B, 0x02E6, 0x2211, 0x1DC9,
- 0x2212, 0x02B5, 0x2213, 0x2F56, 0x221A, 0x02FD, 0x221D, 0x02FF,
- 0x221E, 0x02BF, 0x221F, 0x1DCD, 0x2220, 0x02F4, 0x2225, 0x029A,
- 0x2227, 0x02ED, 0x2228, 0x02EE, 0x2229, 0x02EC, 0x222A, 0x02EB,
- 0x222B, 0x0301, 0x222C, 0x0302, 0x222D, 0x2003, 0x222E, 0x1DC8,
- 0x2234, 0x02C0, 0x2235, 0x0300, 0x223C, 0x0299, 0x223D, 0x02FE,
- 0x2243, 0x2F58, 0x2252, 0x02FA, 0x2260, 0x02BA, 0x2261, 0x02F9,
- 0x2266, 0x02BD, 0x2267, 0x02BE, 0x226A, 0x02FB, 0x226B, 0x02FC,
- 0x2272, 0x2F59, 0x2273, 0x2F5A, 0x2282, 0x02E9, 0x2283, 0x02EA,
- 0x2286, 0x02E7, 0x2287, 0x02E8, 0x2295, 0x2F9C, 0x2296, 0x2F9A,
- 0x2297, 0x2F9D, 0x2298, 0x2F9B, 0x229D, 0x2F9A, 0x229E, 0x2F9E,
- 0x22A0, 0x2F99, 0x22A5, 0x02F5, 0x22BF, 0x1DCE, 0x22EE, 0x1ED9,
- 0x22EF, 0x029C, 0x2300, 0x2F98, 0x2307, 0x2FBB, 0x2312, 0x02F6,
- 0x244A, 0x2F54, 0x2460, 0x1D83, 0x2461, 0x1D84, 0x2462, 0x1D85,
- 0x2463, 0x1D86, 0x2464, 0x1D87, 0x2465, 0x1D88, 0x2466, 0x1D89,
- 0x2467, 0x1D8A, 0x2468, 0x1D8B, 0x2469, 0x1D8C, 0x246A, 0x1D8D,
- 0x246B, 0x1D8E, 0x246C, 0x1D8F, 0x246D, 0x1D90, 0x246E, 0x1D91,
- 0x246F, 0x1D92, 0x2470, 0x1D93, 0x2471, 0x1D94, 0x2472, 0x1D95,
- 0x2473, 0x1D96, 0x2474, 0x1F87, 0x2475, 0x1F88, 0x2476, 0x1F89,
- 0x2477, 0x1F8A, 0x2478, 0x1F8B, 0x2479, 0x1F8C, 0x247A, 0x1F8D,
- 0x247B, 0x1F8E, 0x247C, 0x1F8F, 0x247D, 0x1F90, 0x247E, 0x1F91,
- 0x247F, 0x1F92, 0x2480, 0x1F93, 0x2481, 0x1F94, 0x2482, 0x1F95,
- 0x2483, 0x1F96, 0x2484, 0x1F97, 0x2485, 0x1F98, 0x2486, 0x1F99,
- 0x2487, 0x1F9A, 0x2488, 0x1F7E, 0x2489, 0x1F7F, 0x248A, 0x1F80,
- 0x248B, 0x1F81, 0x248C, 0x1F82, 0x248D, 0x1F83, 0x248E, 0x1F84,
- 0x248F, 0x1F85, 0x2490, 0x1F86, 0x249C, 0x1FB0, 0x249D, 0x1FB1,
- 0x249E, 0x1FB2, 0x249F, 0x1FB3, 0x24A0, 0x1FB4, 0x24A1, 0x1FB5,
- 0x24A2, 0x1FB6, 0x24A3, 0x1FB7, 0x24A4, 0x1FB8, 0x24A5, 0x1FB9,
- 0x24A6, 0x1FBA, 0x24A7, 0x1FBB, 0x24A8, 0x1FBC, 0x24A9, 0x1FBD,
- 0x24AA, 0x1FBE, 0x24AB, 0x1FBF, 0x24AC, 0x1FC0, 0x24AD, 0x1FC1,
- 0x24AE, 0x1FC2, 0x24AF, 0x1FC3, 0x24B0, 0x1FC4, 0x24B1, 0x1FC5,
- 0x24B2, 0x1FC6, 0x24B3, 0x1FC7, 0x24B4, 0x1FC8, 0x24B5, 0x1FC9,
- 0x24B6, 0x2863, 0x24B7, 0x2864, 0x24B8, 0x2865, 0x24B9, 0x2866,
- 0x24BA, 0x2867, 0x24BB, 0x2868, 0x24BC, 0x2869, 0x24BD, 0x286A,
- 0x24BE, 0x286B, 0x24BF, 0x286C, 0x24C0, 0x286D, 0x24C1, 0x286E,
- 0x24C2, 0x286F, 0x24C3, 0x2870, 0x24C4, 0x2871, 0x24C5, 0x2872,
- 0x24C6, 0x2873, 0x24C7, 0x2874, 0x24C8, 0x2875, 0x24C9, 0x2876,
- 0x24CA, 0x2877, 0x24CB, 0x2878, 0x24CC, 0x2879, 0x24CD, 0x287A,
- 0x24CE, 0x287B, 0x24CF, 0x287C, 0x24D0, 0x2849, 0x24D1, 0x284A,
- 0x24D2, 0x284B, 0x24D3, 0x284C, 0x24D4, 0x284D, 0x24D5, 0x284E,
- 0x24D6, 0x284F, 0x24D7, 0x2850, 0x24D8, 0x2851, 0x24D9, 0x2852,
- 0x24DA, 0x2853, 0x24DB, 0x2854, 0x24DC, 0x2855, 0x24DD, 0x2856,
- 0x24DE, 0x2857, 0x24DF, 0x2858, 0x24E0, 0x2859, 0x24E1, 0x285A,
- 0x24E2, 0x285B, 0x24E3, 0x285C, 0x24E4, 0x285D, 0x24E5, 0x285E,
- 0x24E6, 0x285F, 0x24E7, 0x2860, 0x24E8, 0x2861, 0x24E9, 0x2862,
- 0x24EA, 0x2020, 0x2500, 0x1D37, 0x2501, 0x1D38, 0x2502, 0x1D39,
- 0x2503, 0x1D3A, 0x2504, 0x1D3B, 0x2505, 0x1D3C, 0x2506, 0x1D3D,
- 0x2507, 0x1D3E, 0x2508, 0x1D3F, 0x2509, 0x1D40, 0x250A, 0x1D41,
- 0x250B, 0x1D42, 0x250C, 0x1D43, 0x250D, 0x1D44, 0x250E, 0x1D45,
- 0x250F, 0x1D46, 0x2510, 0x1D47, 0x2511, 0x1D48, 0x2512, 0x1D49,
- 0x2513, 0x1D4A, 0x2514, 0x1D4B, 0x2515, 0x1D4C, 0x2516, 0x1D4D,
- 0x2517, 0x1D4E, 0x2518, 0x1D4F, 0x2519, 0x1D50, 0x251A, 0x1D51,
- 0x251B, 0x1D52, 0x251C, 0x1D53, 0x251D, 0x1D54, 0x251E, 0x1D55,
- 0x251F, 0x1D56, 0x2520, 0x1D57, 0x2521, 0x1D58, 0x2522, 0x1D59,
- 0x2523, 0x1D5A, 0x2524, 0x1D5B, 0x2525, 0x1D5C, 0x2526, 0x1D5D,
- 0x2527, 0x1D5E, 0x2528, 0x1D5F, 0x2529, 0x1D60, 0x252A, 0x1D61,
- 0x252B, 0x1D62, 0x252C, 0x1D63, 0x252D, 0x1D64, 0x252E, 0x1D65,
- 0x252F, 0x1D66, 0x2530, 0x1D67, 0x2531, 0x1D68, 0x2532, 0x1D69,
- 0x2533, 0x1D6A, 0x2534, 0x1D6B, 0x2535, 0x1D6C, 0x2536, 0x1D6D,
- 0x2537, 0x1D6E, 0x2538, 0x1D6F, 0x2539, 0x1D70, 0x253A, 0x1D71,
- 0x253B, 0x1D72, 0x253C, 0x1D73, 0x253D, 0x1D74, 0x253E, 0x1D75,
- 0x253F, 0x1D76, 0x2540, 0x1D77, 0x2541, 0x1D78, 0x2542, 0x1D79,
- 0x2543, 0x1D7A, 0x2544, 0x1D7B, 0x2545, 0x1D7C, 0x2546, 0x1D7D,
- 0x2547, 0x1D7E, 0x2548, 0x1D7F, 0x2549, 0x1D80, 0x254A, 0x1D81,
- 0x254B, 0x1D82, 0x2550, 0x203B, 0x255E, 0x203C, 0x2561, 0x203E,
- 0x256A, 0x203D, 0x256D, 0x2037, 0x256E, 0x2038, 0x256F, 0x203A,
- 0x2570, 0x2039, 0x2571, 0x2045, 0x2572, 0x2046, 0x2573, 0x2047,
- 0x2581, 0x2026, 0x2582, 0x2027, 0x2583, 0x2028, 0x2584, 0x2029,
- 0x2585, 0x202A, 0x2586, 0x202B, 0x2587, 0x202C, 0x2588, 0x202D,
- 0x2589, 0x2034, 0x258A, 0x2033, 0x258B, 0x2032, 0x258C, 0x2031,
- 0x258D, 0x2030, 0x258E, 0x202F, 0x258F, 0x202E, 0x2594, 0x2035,
- 0x2595, 0x2036, 0x25A0, 0x02D9, 0x25A1, 0x02D8, 0x25A2, 0x1F4F,
- 0x25AA, 0x2FCF, 0x25AB, 0x2FCD, 0x25B2, 0x02DB, 0x25B3, 0x02DA,
- 0x25B6, 0x2FA3, 0x25B7, 0x1F4A, 0x25BC, 0x02DD, 0x25BD, 0x02DC,
- 0x25C0, 0x2FA2, 0x25C1, 0x1F49, 0x25C6, 0x02D7, 0x25C7, 0x02D6,
- 0x25C9, 0x2012, 0x25CB, 0x02D3, 0x25CC, 0x2906, 0x25CE, 0x02D5,
- 0x25CF, 0x02D4, 0x25E2, 0x203F, 0x25E3, 0x2040, 0x25E4, 0x2042,
- 0x25E5, 0x2041, 0x25E6, 0x2FDE, 0x25EF, 0x030B, 0x2600, 0x2017,
- 0x2601, 0x2018, 0x2602, 0x2019, 0x2603, 0x201A, 0x2605, 0x02D2,
- 0x2606, 0x02D1, 0x260E, 0x1F78, 0x2612, 0x2F99, 0x261C, 0x201C,
- 0x261D, 0x201D, 0x261E, 0x201B, 0x261F, 0x201E, 0x2640, 0x02C2,
- 0x2642, 0x02C1, 0x2660, 0x2013, 0x2661, 0x1F51, 0x2662, 0x1F53,
- 0x2663, 0x2015, 0x2664, 0x1F52, 0x2665, 0x2014, 0x2666, 0x2016,
- 0x2667, 0x1F50, 0x2668, 0x2F42, 0x2669, 0x2F43, 0x266A, 0x0307,
- 0x266C, 0x2F44, 0x266D, 0x0306, 0x266F, 0x0305, 0x2702, 0x2F90,
- 0x271A, 0x2FD1, 0x2756, 0x2FE3, 0x2776, 0x205E, 0x2777, 0x205F,
- 0x2778, 0x2060, 0x2779, 0x2061, 0x277A, 0x2062, 0x277B, 0x2063,
- 0x277C, 0x2064, 0x277D, 0x2065, 0x277E, 0x2066, 0x27A1, 0x200E,
- 0x2E83, 0x37E1, 0x2E85, 0x3620, 0x2E87, 0x3719, 0x2E89, 0x3814,
- 0x2E8B, 0x371E, 0x2E8C, 0x3609, 0x2E8D, 0x360A, 0x2E8E, 0x1071,
- 0x2E8F, 0x388C, 0x2E90, 0x1226, 0x2E92, 0x0EB2, 0x2E93, 0x1283,
- 0x2E94, 0x12AB, 0x2E95, 0x3C1F, 0x2E96, 0x38C2, 0x2E97, 0x361C,
- 0x2E98, 0x38E1, 0x2E99, 0x13C3, 0x2E9B, 0x13E1, 0x2E9F, 0x0E3C,
- 0x2EA0, 0x0EBD, 0x2EA1, 0x3961, 0x2EA2, 0x3962, 0x2EA3, 0x399D,
- 0x2EA4, 0x3C26, 0x2EA6, 0x374D, 0x2EA8, 0x39BC, 0x2EA9, 0x35A1,
- 0x2EAA, 0x36AB, 0x2EAB, 0x3A97, 0x2EAC, 0x08D4, 0x2EAD, 0x3A39,
- 0x2EAE, 0x3662, 0x2EB1, 0x3A98, 0x2EB2, 0x3A97, 0x2EB3, 0x376D,
- 0x2EB7, 0x36FE, 0x2EB9, 0x3713, 0x2EBC, 0x35B3, 0x2EBD, 0x354E,
- 0x2EBE, 0x3775, 0x2EBF, 0x3776, 0x2EC0, 0x3777, 0x2EC1, 0x078B,
- 0x2EC2, 0x3B0A, 0x2EC3, 0x362E, 0x2EC4, 0x0A62, 0x2EC6, 0x3572,
- 0x2ECA, 0x364A, 0x2ECC, 0x3C2B, 0x2ECD, 0x3B50, 0x2ECF, 0x3B9E,
- 0x2ED1, 0x0BD5, 0x2ED2, 0x3B97, 0x2ED6, 0x3B9E, 0x2ED7, 0x354D,
- 0x2ED8, 0x0A68, 0x2EDD, 0x3617, 0x2EDE, 0x3619, 0x2EDF, 0x3618,
- 0x2EE4, 0x064E, 0x2EE8, 0x0D34, 0x2EE9, 0x052B, 0x2EEB, 0x0A6A,
- 0x2EED, 0x08C3, 0x2EEF, 0x0F7D, 0x2EF2, 0x064F, 0x2F00, 0x04B0,
- 0x2F01, 0x20B3, 0x2F02, 0x0FFF, 0x2F03, 0x1001, 0x2F04, 0x0535,
- 0x2F05, 0x1006, 0x2F06, 0x0CCB, 0x2F07, 0x100E, 0x2F08, 0x0A13,
- 0x2F09, 0x1070, 0x2F0A, 0x0CD6, 0x2F0B, 0x0D40, 0x2F0C, 0x107B,
- 0x2F0D, 0x1083, 0x2F0E, 0x1089, 0x2F0F, 0x1093, 0x2F10, 0x1098,
- 0x2F11, 0x0C5B, 0x2F12, 0x0F97, 0x2F13, 0x10C6, 0x2F14, 0x10CD,
- 0x2F15, 0x10CE, 0x2F16, 0x10D3, 0x2F17, 0x0947, 0x2F18, 0x0E7C,
- 0x2F19, 0x10DC, 0x2F1A, 0x10E1, 0x2F1B, 0x10E8, 0x2F1C, 0x0EA2,
- 0x2F1D, 0x07B1, 0x2F1E, 0x116B, 0x2F1F, 0x0C54, 0x2F20, 0x089C,
- 0x2F21, 0x11BA, 0x2F22, 0x11BB, 0x2F23, 0x0F26, 0x2F24, 0x0B47,
- 0x2F25, 0x0981, 0x2F26, 0x08A0, 0x2F27, 0x120E, 0x2F28, 0x0A47,
- 0x2F29, 0x0996, 0x2F2A, 0x1226, 0x2F2B, 0x1228, 0x2F2C, 0x1232,
- 0x2F2D, 0x0881, 0x2F2E, 0x126C, 0x2F2F, 0x07BB, 0x2F30, 0x077E,
- 0x2F31, 0x06CA, 0x2F32, 0x05EF, 0x2F33, 0x1283, 0x2F34, 0x1285,
- 0x2F35, 0x1299, 0x2F36, 0x129B, 0x2F37, 0x12A0, 0x2F38, 0x0677,
- 0x2F39, 0x38B9, 0x2F3A, 0x12AF, 0x2F3B, 0x12B1, 0x2F3C, 0x09FA,
- 0x2F3D, 0x1342, 0x2F3E, 0x0781, 0x2F3F, 0x0916, 0x2F40, 0x08A7,
- 0x2F41, 0x13C2, 0x2F42, 0x0E08, 0x2F43, 0x0C47, 0x2F44, 0x06CC,
- 0x2F45, 0x0E4D, 0x2F46, 0x13E0, 0x2F47, 0x0CD4, 0x2F48, 0x140C,
- 0x2F49, 0x0744, 0x2F4A, 0x0EE6, 0x2F4B, 0x073D, 0x2F4C, 0x08AD,
- 0x2F4D, 0x14E5, 0x2F4E, 0x14F4, 0x2F4F, 0x14F8, 0x2F50, 0x0D7A,
- 0x2F51, 0x0EDF, 0x2F52, 0x08AF, 0x2F53, 0x1502, 0x2F54, 0x0A2B,
- 0x2F55, 0x0550, 0x2F56, 0x0BFA, 0x2F57, 0x0DD5, 0x2F58, 0x15E4,
- 0x2F59, 0x15E6, 0x2F5A, 0x0E22, 0x2F5B, 0x0567, 0x2F5C, 0x0687,
- 0x2F5D, 0x0758, 0x2F5E, 0x0770, 0x2F5F, 0x06C4, 0x2F60, 0x04DD,
- 0x2F61, 0x05E0, 0x2F62, 0x0601, 0x2F63, 0x0A5C, 0x2F64, 0x0F3B,
- 0x2F65, 0x0C3E, 0x2F66, 0x0D97, 0x2F67, 0x3A00, 0x2F68, 0x1697,
- 0x2F69, 0x0D28, 0x2F6A, 0x0D7D, 0x2F6B, 0x087C, 0x2F6C, 0x0EE8,
- 0x2F6D, 0x0EC3, 0x2F6E, 0x0EFC, 0x2F6F, 0x0A74, 0x2F70, 0x08D4,
- 0x2F71, 0x3A41, 0x2F72, 0x0553, 0x2F73, 0x0740, 0x2F74, 0x0F71,
- 0x2F75, 0x0B9B, 0x2F76, 0x0E16, 0x2F77, 0x08B3, 0x2F78, 0x0608,
- 0x2F79, 0x1813, 0x2F7A, 0x0F3D, 0x2F7B, 0x04CB, 0x2F7C, 0x0FDD,
- 0x2F7D, 0x08D5, 0x2F7E, 0x183D, 0x2F7F, 0x08D6, 0x2F80, 0x1853,
- 0x2F81, 0x0CD1, 0x2F82, 0x0A09, 0x2F83, 0x08D7, 0x2F84, 0x08B8,
- 0x2F85, 0x04D3, 0x2F86, 0x0A89, 0x2F87, 0x0AA6, 0x2F88, 0x0938,
- 0x2F89, 0x0821, 0x2F8A, 0x09ED, 0x2F8B, 0x18B2, 0x2F8C, 0x194F,
- 0x2F8D, 0x0BAC, 0x2F8E, 0x0742, 0x2F8F, 0x07E6, 0x2F90, 0x04A5,
- 0x2F91, 0x19EB, 0x2F92, 0x075F, 0x2F93, 0x05AF, 0x2F94, 0x0774,
- 0x2F95, 0x0B69, 0x2F96, 0x0C7E, 0x2F97, 0x1A56, 0x2F98, 0x1A59,
- 0x2F99, 0x058B, 0x2F9A, 0x0A7A, 0x2F9B, 0x0AF8, 0x2F9C, 0x0B0D,
- 0x2F9D, 0x0A0E, 0x2F9E, 0x0902, 0x2F9F, 0x0A0F, 0x2FA0, 0x0B62,
- 0x2FA1, 0x3B4F, 0x2FA2, 0x0F22, 0x2FA3, 0x0CAB, 0x2FA4, 0x0D64,
- 0x2FA5, 0x0F6C, 0x2FA6, 0x06DA, 0x2FA7, 0x0BD5, 0x2FA8, 0x0EF3,
- 0x2FA9, 0x0DDE, 0x2FAA, 0x1BC9, 0x2FAB, 0x1BCB, 0x2FAC, 0x04CD,
- 0x2FAD, 0x21F7, 0x2FAE, 0x0D87, 0x2FAF, 0x0ED8, 0x2FB0, 0x05B5,
- 0x2FB1, 0x1C03, 0x2FB2, 0x1C05, 0x2FB3, 0x053B, 0x2FB4, 0x0E17,
- 0x2FB5, 0x0DE9, 0x2FB6, 0x0D88, 0x2FB7, 0x09EF, 0x2FB8, 0x091F,
- 0x2FB9, 0x07F3, 0x2FBA, 0x0D05, 0x2FBB, 0x080E, 0x2FBC, 0x07F4,
- 0x2FBD, 0x1C6C, 0x2FBE, 0x1C7D, 0x2FBF, 0x1C83, 0x2FC0, 0x1C84,
- 0x2FC1, 0x064E, 0x2FC2, 0x0695, 0x2FC3, 0x0BD7, 0x2FC4, 0x1CF6,
- 0x2FC5, 0x08DB, 0x2FC6, 0x1D01, 0x2FC7, 0x0E91, 0x2FC8, 0x340B,
- 0x2FC9, 0x066A, 0x2FCA, 0x0807, 0x2FCB, 0x1D16, 0x2FCC, 0x1D19,
- 0x2FCD, 0x0C1E, 0x2FCE, 0x0791, 0x2FCF, 0x0ACF, 0x2FD0, 0x0D93,
- 0x2FD1, 0x1D21, 0x2FD2, 0x1D22, 0x2FD3, 0x0F7E, 0x2FD4, 0x1D30,
- 0x2FD5, 0x1D31, 0x3000, 0x0279, 0x3001, 0x027A, 0x3002, 0x027B,
- 0x3003, 0x028F, 0x3004, 0x2074, 0x3005, 0x0291, 0x3006, 0x0292,
- 0x3007, 0x0293, 0x3008, 0x02AA, 0x3009, 0x02AB, 0x300A, 0x02AC,
- 0x300B, 0x02AD, 0x300C, 0x02AE, 0x300D, 0x02AF, 0x300E, 0x02B0,
- 0x300F, 0x02B1, 0x3010, 0x02B2, 0x3011, 0x02B3, 0x3012, 0x02DF,
- 0x3013, 0x02E4, 0x3014, 0x02A4, 0x3015, 0x02A5, 0x301C, 0x0299,
- 0x301D, 0x1DB8, 0x301F, 0x1DB9, 0x3020, 0x1F7A, 0x3030, 0x2FBA,
- 0x3033, 0x2F4C, 0x3034, 0x2F4D, 0x3035, 0x2F4E, 0x3036, 0x1F79,
- 0x3041, 0x034A, 0x3042, 0x034B, 0x3043, 0x034C, 0x3044, 0x034D,
- 0x3045, 0x034E, 0x3046, 0x034F, 0x3047, 0x0350, 0x3048, 0x0351,
- 0x3049, 0x0352, 0x304A, 0x0353, 0x304B, 0x0354, 0x304C, 0x0355,
- 0x304D, 0x0356, 0x304E, 0x0357, 0x304F, 0x0358, 0x3050, 0x0359,
- 0x3051, 0x035A, 0x3052, 0x035B, 0x3053, 0x035C, 0x3054, 0x035D,
- 0x3055, 0x035E, 0x3056, 0x035F, 0x3057, 0x0360, 0x3058, 0x0361,
- 0x3059, 0x0362, 0x305A, 0x0363, 0x305B, 0x0364, 0x305C, 0x0365,
- 0x305D, 0x0366, 0x305E, 0x0367, 0x305F, 0x0368, 0x3060, 0x0369,
- 0x3061, 0x036A, 0x3062, 0x036B, 0x3063, 0x036C, 0x3064, 0x036D,
- 0x3065, 0x036E, 0x3066, 0x036F, 0x3067, 0x0370, 0x3068, 0x0371,
- 0x3069, 0x0372, 0x306A, 0x0373, 0x306B, 0x0374, 0x306C, 0x0375,
- 0x306D, 0x0376, 0x306E, 0x0377, 0x306F, 0x0378, 0x3070, 0x0379,
- 0x3071, 0x037A, 0x3072, 0x037B, 0x3073, 0x037C, 0x3074, 0x037D,
- 0x3075, 0x037E, 0x3076, 0x037F, 0x3077, 0x0380, 0x3078, 0x0381,
- 0x3079, 0x0382, 0x307A, 0x0383, 0x307B, 0x0384, 0x307C, 0x0385,
- 0x307D, 0x0386, 0x307E, 0x0387, 0x307F, 0x0388, 0x3080, 0x0389,
- 0x3081, 0x038A, 0x3082, 0x038B, 0x3083, 0x038C, 0x3084, 0x038D,
- 0x3085, 0x038E, 0x3086, 0x038F, 0x3087, 0x0390, 0x3088, 0x0391,
- 0x3089, 0x0392, 0x308A, 0x0393, 0x308B, 0x0394, 0x308C, 0x0395,
- 0x308D, 0x0396, 0x308E, 0x0397, 0x308F, 0x0398, 0x3090, 0x0399,
- 0x3091, 0x039A, 0x3092, 0x039B, 0x3093, 0x039C, 0x3094, 0x1F16,
- 0x309B, 0x0283, 0x309C, 0x0284, 0x309D, 0x028D, 0x309E, 0x028E,
- 0x30A1, 0x039D, 0x30A2, 0x039E, 0x30A3, 0x039F, 0x30A4, 0x03A0,
- 0x30A5, 0x03A1, 0x30A6, 0x03A2, 0x30A7, 0x03A3, 0x30A8, 0x03A4,
- 0x30A9, 0x03A5, 0x30AA, 0x03A6, 0x30AB, 0x03A7, 0x30AC, 0x03A8,
- 0x30AD, 0x03A9, 0x30AE, 0x03AA, 0x30AF, 0x03AB, 0x30B0, 0x03AC,
- 0x30B1, 0x03AD, 0x30B2, 0x03AE, 0x30B3, 0x03AF, 0x30B4, 0x03B0,
- 0x30B5, 0x03B1, 0x30B6, 0x03B2, 0x30B7, 0x03B3, 0x30B8, 0x03B4,
- 0x30B9, 0x03B5, 0x30BA, 0x03B6, 0x30BB, 0x03B7, 0x30BC, 0x03B8,
- 0x30BD, 0x03B9, 0x30BE, 0x03BA, 0x30BF, 0x03BB, 0x30C0, 0x03BC,
- 0x30C1, 0x03BD, 0x30C2, 0x03BE, 0x30C3, 0x03BF, 0x30C4, 0x03C0,
- 0x30C5, 0x03C1, 0x30C6, 0x03C2, 0x30C7, 0x03C3, 0x30C8, 0x03C4,
- 0x30C9, 0x03C5, 0x30CA, 0x03C6, 0x30CB, 0x03C7, 0x30CC, 0x03C8,
- 0x30CD, 0x03C9, 0x30CE, 0x03CA, 0x30CF, 0x03CB, 0x30D0, 0x03CC,
- 0x30D1, 0x03CD, 0x30D2, 0x03CE, 0x30D3, 0x03CF, 0x30D4, 0x03D0,
- 0x30D5, 0x03D1, 0x30D6, 0x03D2, 0x30D7, 0x03D3, 0x30D8, 0x03D4,
- 0x30D9, 0x03D5, 0x30DA, 0x03D6, 0x30DB, 0x03D7, 0x30DC, 0x03D8,
- 0x30DD, 0x03D9, 0x30DE, 0x03DA, 0x30DF, 0x03DB, 0x30E0, 0x03DC,
- 0x30E1, 0x03DD, 0x30E2, 0x03DE, 0x30E3, 0x03DF, 0x30E4, 0x03E0,
- 0x30E5, 0x03E1, 0x30E6, 0x03E2, 0x30E7, 0x03E3, 0x30E8, 0x03E4,
- 0x30E9, 0x03E5, 0x30EA, 0x03E6, 0x30EB, 0x03E7, 0x30EC, 0x03E8,
- 0x30ED, 0x03E9, 0x30EE, 0x03EA, 0x30EF, 0x03EB, 0x30F0, 0x03EC,
- 0x30F1, 0x03ED, 0x30F2, 0x03EE, 0x30F3, 0x03EF, 0x30F4, 0x03F0,
- 0x30F5, 0x03F1, 0x30F6, 0x03F2, 0x30F7, 0x2079, 0x30F8, 0x207A,
- 0x30F9, 0x207B, 0x30FA, 0x207C, 0x30FB, 0x027E, 0x30FC, 0x0294,
- 0x30FD, 0x028B, 0x30FE, 0x028C, 0x3220, 0x278E, 0x3221, 0x278F,
- 0x3222, 0x2790, 0x3223, 0x2791, 0x3224, 0x2792, 0x3225, 0x2793,
- 0x3226, 0x2794, 0x3227, 0x2795, 0x3228, 0x2796, 0x3229, 0x2797,
- 0x322A, 0x2006, 0x322B, 0x2007, 0x322C, 0x2008, 0x322D, 0x2009,
- 0x322E, 0x200A, 0x322F, 0x200B, 0x3230, 0x2005, 0x3231, 0x1DC2,
- 0x3232, 0x1DC3, 0x3233, 0x1FCF, 0x3234, 0x1FCD, 0x3235, 0x1FD4,
- 0x3236, 0x1FD3, 0x3237, 0x200C, 0x3238, 0x1FCE, 0x3239, 0x1DC4,
- 0x323A, 0x1FD7, 0x323B, 0x1FD5, 0x323C, 0x1FD0, 0x323D, 0x1FCB,
- 0x323E, 0x1FD2, 0x323F, 0x1FCC, 0x3240, 0x1FD6, 0x3241, 0x200D,
- 0x3242, 0x1FD1, 0x3243, 0x1FCA, 0x3280, 0x28DD, 0x3281, 0x28DE,
- 0x3282, 0x28DF, 0x3283, 0x28E0, 0x3284, 0x28E1, 0x3285, 0x28E2,
- 0x3286, 0x28E3, 0x3287, 0x28E4, 0x3288, 0x28E5, 0x3289, 0x28E6,
- 0x328A, 0x28E8, 0x328B, 0x28E9, 0x328C, 0x28EA, 0x328D, 0x28EB,
- 0x328E, 0x28EC, 0x328F, 0x28ED, 0x3290, 0x28E7, 0x3291, 0x1FE1,
- 0x3292, 0x1FE0, 0x3293, 0x1FE2, 0x3294, 0x1FDC, 0x3295, 0x28FF,
- 0x3296, 0x1FE5, 0x3297, 0x28FC, 0x3298, 0x1FDE, 0x3299, 0x201F,
- 0x329A, 0x28F9, 0x329B, 0x28F8, 0x329C, 0x28FE, 0x329D, 0x207F,
- 0x329E, 0x1FFF, 0x329F, 0x28EF, 0x32A0, 0x28F6, 0x32A1, 0x28F7,
- 0x32A2, 0x28FB, 0x32A3, 0x28FA, 0x32A4, 0x1DBD, 0x32A5, 0x1DBE,
- 0x32A6, 0x1DBF, 0x32A7, 0x1DC0, 0x32A8, 0x1DC1, 0x32A9, 0x1FDA,
- 0x32AA, 0x1FDD, 0x32AB, 0x1FDF, 0x32AC, 0x1FE3, 0x32AD, 0x1FD9,
- 0x32AE, 0x1FE4, 0x32AF, 0x1FDB, 0x32B0, 0x1FD8, 0x32D0, 0x28AD,
- 0x32D1, 0x28AE, 0x32D2, 0x28AF, 0x32D3, 0x28B0, 0x32D4, 0x28B1,
- 0x32D5, 0x28B2, 0x32D6, 0x28B3, 0x32D7, 0x28B4, 0x32D8, 0x28B5,
- 0x32D9, 0x28B6, 0x32DA, 0x28B7, 0x32DB, 0x28B8, 0x32DC, 0x28B9,
- 0x32DD, 0x28BA, 0x32DE, 0x28BB, 0x32DF, 0x28BC, 0x32E0, 0x28BD,
- 0x32E1, 0x28BE, 0x32E2, 0x28BF, 0x32E3, 0x28C0, 0x32E4, 0x28C1,
- 0x32E5, 0x28C2, 0x32E6, 0x28C3, 0x32E7, 0x28C4, 0x32E8, 0x28C5,
- 0x32E9, 0x28C6, 0x32EA, 0x28C7, 0x32EB, 0x28C8, 0x32EC, 0x28C9,
- 0x32ED, 0x28CA, 0x32EE, 0x28CB, 0x32EF, 0x28CC, 0x32F0, 0x28CD,
- 0x32F1, 0x28CE, 0x32F2, 0x28CF, 0x32F3, 0x28D0, 0x32F4, 0x28D1,
- 0x32F5, 0x28D2, 0x32F6, 0x28D3, 0x32F7, 0x28D4, 0x32F8, 0x28D5,
- 0x32F9, 0x28D6, 0x32FA, 0x28D7, 0x32FB, 0x28D8, 0x32FC, 0x28D9,
- 0x32FD, 0x28DA, 0x32FE, 0x28DB, 0x3300, 0x1F70, 0x3301, 0x2E62,
- 0x3302, 0x2E63, 0x3303, 0x1F6A, 0x3304, 0x2E64, 0x3305, 0x1FF7,
- 0x3306, 0x2E65, 0x3307, 0x2E69, 0x3308, 0x2E67, 0x3309, 0x2E6C,
- 0x330A, 0x2E6A, 0x330B, 0x2E6E, 0x330C, 0x2E70, 0x330D, 0x1DAB,
- 0x330E, 0x2E71, 0x330F, 0x2E72, 0x3310, 0x2E73, 0x3311, 0x2E74,
- 0x3312, 0x2E75, 0x3313, 0x2E76, 0x3314, 0x1DA2, 0x3315, 0x1F69,
- 0x3316, 0x1F67, 0x3317, 0x2E78, 0x3318, 0x1F68, 0x3319, 0x2E7A,
- 0x331A, 0x2E7C, 0x331B, 0x2E7D, 0x331C, 0x2E7E, 0x331D, 0x2E7F,
- 0x331E, 0x1F73, 0x331F, 0x2E80, 0x3320, 0x2E81, 0x3321, 0x2E82,
- 0x3322, 0x1F66, 0x3323, 0x1F6B, 0x3324, 0x2E83, 0x3325, 0x2E85,
- 0x3326, 0x1DAC, 0x3327, 0x1DA6, 0x3328, 0x2E88, 0x3329, 0x2E89,
- 0x332A, 0x1F74, 0x332B, 0x1DAE, 0x332D, 0x2E8B, 0x332E, 0x2E8E,
- 0x332F, 0x2E8F, 0x3330, 0x2E90, 0x3331, 0x1F71, 0x3332, 0x2E91,
- 0x3333, 0x2087, 0x3334, 0x2E94, 0x3335, 0x2E95, 0x3336, 0x1DA8,
- 0x3337, 0x2E9A, 0x3338, 0x2E9C, 0x3339, 0x1F6E, 0x333A, 0x2E9D,
- 0x333B, 0x1F6F, 0x333C, 0x2E96, 0x333D, 0x2E9E, 0x333E, 0x2EA0,
- 0x333F, 0x2EA1, 0x3340, 0x2EA2, 0x3341, 0x2E9F, 0x3342, 0x1F6D,
- 0x3343, 0x2EA3, 0x3344, 0x2EA4, 0x3345, 0x2EA5, 0x3346, 0x2EA6,
- 0x3347, 0x1F72, 0x3348, 0x2EA7, 0x3349, 0x1DA1, 0x334A, 0x1DAF,
- 0x334B, 0x2EA8, 0x334C, 0x2EA9, 0x334D, 0x1DA4, 0x334E, 0x2088,
- 0x334F, 0x2EAA, 0x3350, 0x2EAB, 0x3351, 0x1DA9, 0x3352, 0x2EAE,
- 0x3353, 0x2EB2, 0x3354, 0x2EAF, 0x3355, 0x2EB3, 0x3356, 0x2EB4,
- 0x3357, 0x1F6C, 0x3371, 0x2E55, 0x337B, 0x2083, 0x337C, 0x1DC7,
- 0x337D, 0x1DC6, 0x337E, 0x1DC5, 0x337F, 0x1F76, 0x3385, 0x1F5F,
- 0x3386, 0x1F60, 0x3387, 0x1F61, 0x3388, 0x2000, 0x3389, 0x2001,
- 0x338D, 0x2E58, 0x338E, 0x1DB4, 0x338F, 0x1DB5, 0x3390, 0x1F63,
- 0x3396, 0x1F65, 0x3397, 0x1F58, 0x3398, 0x1F5A, 0x339B, 0x2E59,
- 0x339C, 0x1DB1, 0x339D, 0x1DB2, 0x339E, 0x1DB3, 0x339F, 0x1FFA,
- 0x33A0, 0x1F54, 0x33A1, 0x1DB7, 0x33A2, 0x1F55, 0x33A3, 0x1FFB,
- 0x33A4, 0x1F56, 0x33A5, 0x1F57, 0x33A6, 0x1FFC, 0x33B0, 0x1F5E,
- 0x33B1, 0x1F5D, 0x33B2, 0x1F5C, 0x33B3, 0x1F5B, 0x33C2, 0x2E50,
- 0x33C4, 0x1DB6, 0x33C8, 0x2002, 0x33CB, 0x1F62, 0x33CC, 0x1FF6,
- 0x33CD, 0x1DBB, 0x33D4, 0x1F64, 0x33D7, 0x2E5D, 0x33D8, 0x2E5E,
- 0x33DA, 0x2E4B, 0x3402, 0x3582, 0x3405, 0x3C1B, 0x3427, 0x3656,
- 0x3488, 0x3C52, 0x34DB, 0x3C41, 0x351F, 0x3629, 0x353E, 0x371E,
- 0x378D, 0x361A, 0x37E2, 0x372B, 0x3AF3, 0x3C40, 0x3B22, 0x3C49,
- 0x3B88, 0x368D, 0x3E8A, 0x3C43, 0x3EDA, 0x3C48, 0x3FB1, 0x3754,
- 0x4093, 0x3C4C, 0x4103, 0x3C4F, 0x4264, 0x3760, 0x4293, 0x3C50,
- 0x440C, 0x3C42, 0x4453, 0x3773, 0x457A, 0x3C4B, 0x4665, 0x3C4E,
- 0x46AE, 0x3C51, 0x4BE8, 0x3C46, 0x4E00, 0x04B0, 0x4E01, 0x0BB8,
- 0x4E03, 0x08E3, 0x4E04, 0x37D8, 0x4E05, 0x37D9, 0x4E07, 0x0EAA,
- 0x4E08, 0x09CE, 0x4E09, 0x087E, 0x4E0A, 0x09CD, 0x4E0B, 0x053C,
- 0x4E0D, 0x0DC6, 0x4E0E, 0x0F29, 0x4E10, 0x0FFB, 0x4E11, 0x04D1,
- 0x4E14, 0x05CC, 0x4E15, 0x0FFC, 0x4E16, 0x0A48, 0x4E17, 0x10D7,
- 0x4E18, 0x0670, 0x4E19, 0x0E0A, 0x4E1E, 0x09CF, 0x4E1F, 0x37DA,
- 0x4E21, 0x0F86, 0x4E26, 0x0E12, 0x4E28, 0x20B3, 0x4E2A, 0x0FFD,
- 0x4E2B, 0x37DB, 0x4E2C, 0x374D, 0x4E2D, 0x0BA4, 0x4E2F, 0x37DC,
- 0x4E30, 0x37DD, 0x4E31, 0x0FFE, 0x4E32, 0x06F2, 0x4E36, 0x0FFF,
- 0x4E37, 0x369D, 0x4E38, 0x0619, 0x4E39, 0x0B6E, 0x4E3B, 0x0913,
- 0x4E3C, 0x1000, 0x4E3F, 0x1001, 0x4E40, 0x37DE, 0x4E41, 0x37DF,
- 0x4E42, 0x1002, 0x4E43, 0x0CEB, 0x4E44, 0x37E0, 0x4E45, 0x0671,
- 0x4E48, 0x372E, 0x4E4B, 0x0CED, 0x4E4D, 0x0CBB, 0x4E4E, 0x0777,
- 0x4E4F, 0x0E61, 0x4E55, 0x1950, 0x4E56, 0x1003, 0x4E57, 0x09D0,
- 0x4E58, 0x1004, 0x4E59, 0x0535, 0x4E5A, 0x37E1, 0x4E5D, 0x06DD,
- 0x4E5E, 0x07A4, 0x4E5F, 0x0EF5, 0x4E62, 0x1233, 0x4E71, 0x0F5A,
- 0x4E73, 0x0CD5, 0x4E7E, 0x05E1, 0x4E7F, 0x37E2, 0x4E80, 0x064F,
- 0x4E82, 0x1005, 0x4E85, 0x1006, 0x4E86, 0x0F83, 0x4E88, 0x0F27,
- 0x4E89, 0x0AEA, 0x4E8A, 0x1008, 0x4E8B, 0x08C4, 0x4E8C, 0x0CCB,
- 0x4E8D, 0x37E3, 0x4E8E, 0x100B, 0x4E91, 0x04E0, 0x4E92, 0x0793,
- 0x4E94, 0x0792, 0x4E95, 0x04AA, 0x4E96, 0x37E4, 0x4E98, 0x0FF1,
- 0x4E99, 0x0FF0, 0x4E9B, 0x0823, 0x4E9C, 0x0465, 0x4E9E, 0x100C,
- 0x4E9F, 0x100D, 0x4EA0, 0x100E, 0x4EA1, 0x0E62, 0x4EA2, 0x100F,
- 0x4EA4, 0x07A6, 0x4EA5, 0x04AB, 0x4EA6, 0x0EA0, 0x4EA8, 0x0696,
- 0x4EAB, 0x0697, 0x4EAC, 0x0698, 0x4EAD, 0x0BFE, 0x4EAE, 0x0F84,
- 0x4EB0, 0x1010, 0x4EB3, 0x1011, 0x4EB6, 0x1012, 0x4EB9, 0x37E5,
- 0x4EBA, 0x0A13, 0x4EBB, 0x3620, 0x4EC0, 0x0944, 0x4EC1, 0x0A14,
- 0x4EC2, 0x1017, 0x4EC4, 0x1015, 0x4EC6, 0x1016, 0x4EC7, 0x0672,
- 0x4ECA, 0x0813, 0x4ECB, 0x0570, 0x4ECD, 0x1014, 0x4ECE, 0x1013,
- 0x4ECF, 0x0DF9, 0x4ED0, 0x37E6, 0x4ED4, 0x0894, 0x4ED5, 0x0893,
- 0x4ED6, 0x0B1E, 0x4ED7, 0x1018, 0x4ED8, 0x0DC7, 0x4ED9, 0x0A8B,
- 0x4EDD, 0x0290, 0x4EDE, 0x1019, 0x4EDF, 0x101B, 0x4EE0, 0x37E7,
- 0x4EE1, 0x20B4, 0x4EE3, 0x0B45, 0x4EE4, 0x0FA9, 0x4EE5, 0x048E,
- 0x4EED, 0x101A, 0x4EEE, 0x053E, 0x4EF0, 0x06BC, 0x4EF2, 0x0BA5,
- 0x4EF6, 0x0745, 0x4EF7, 0x101C, 0x4EFB, 0x0CDA, 0x4EFC, 0x20B5,
- 0x4EFD, 0x37E8, 0x4EFF, 0x37E9, 0x4F00, 0x20B6, 0x4F01, 0x0627,
- 0x4F03, 0x20B7, 0x4F09, 0x101D, 0x4F0A, 0x048F, 0x4F0B, 0x37EA,
- 0x4F0D, 0x0794, 0x4F0E, 0x0628, 0x4F0F, 0x0DEC, 0x4F10, 0x0D46,
- 0x4F11, 0x0673, 0x4F15, 0x37EB, 0x4F1A, 0x0571, 0x4F1C, 0x1040,
- 0x4F1D, 0x0C3B, 0x4F2F, 0x0D22, 0x4F30, 0x101F, 0x4F34, 0x0D50,
- 0x4F36, 0x0FAA, 0x4F38, 0x09F3, 0x4F39, 0x20B8, 0x4F3A, 0x0895,
- 0x4F3B, 0x37ED, 0x4F3C, 0x08C5, 0x4F3D, 0x0540, 0x4F43, 0x0BED,
- 0x4F46, 0x0B60, 0x4F47, 0x1023, 0x4F49, 0x37EE, 0x4F4D, 0x0490,
- 0x4F4E, 0x0BFF, 0x4F4F, 0x0945, 0x4F50, 0x0824, 0x4F51, 0x0F0E,
- 0x4F53, 0x0B2E, 0x4F54, 0x37EF, 0x4F55, 0x053F, 0x4F56, 0x20B9,
- 0x4F57, 0x1022, 0x4F59, 0x0F28, 0x4F5A, 0x101E, 0x4F5B, 0x1020,
- 0x4F5C, 0x085E, 0x4F5D, 0x1021, 0x4F5E, 0x11D3, 0x4F60, 0x37EC,
- 0x4F69, 0x1029, 0x4F6F, 0x102C, 0x4F70, 0x102A, 0x4F73, 0x0542,
- 0x4F75, 0x0E0B, 0x4F76, 0x1024, 0x4F7A, 0x37F0, 0x4F7B, 0x1028,
- 0x4F7C, 0x07A7, 0x4F7D, 0x37F1, 0x4F7E, 0x37F2, 0x4F7F, 0x0896,
- 0x4F83, 0x05E2, 0x4F86, 0x102D, 0x4F88, 0x1025, 0x4F8A, 0x20BB,
- 0x4F8B, 0x0FAB, 0x4F8D, 0x08C6, 0x4F8F, 0x1026, 0x4F91, 0x102B,
- 0x4F92, 0x20BA, 0x4F94, 0x20BD, 0x4F96, 0x102E, 0x4F97, 0x37F3,
- 0x4F98, 0x1027, 0x4F9A, 0x20BC, 0x4F9B, 0x0699, 0x4F9D, 0x0491,
- 0x4FA0, 0x069A, 0x4FA1, 0x0541, 0x4FAB, 0x11D4, 0x4FAD, 0x0EA7,
- 0x4FAE, 0x0DE0, 0x4FAF, 0x07A8, 0x4FB5, 0x09F5, 0x4FB6, 0x0F7F,
- 0x4FBE, 0x37F4, 0x4FBF, 0x0E28, 0x4FC2, 0x070E, 0x4FC3, 0x0B05,
- 0x4FC4, 0x0564, 0x4FC9, 0x20AC, 0x4FCA, 0x095D, 0x4FCD, 0x20BE,
- 0x4FCE, 0x1032, 0x4FCF, 0x37F5, 0x4FD0, 0x1037, 0x4FD1, 0x1035,
- 0x4FD3, 0x3C2F, 0x4FD4, 0x1030, 0x4FD7, 0x0B0F, 0x4FD8, 0x1033,
- 0x4FDA, 0x1036, 0x4FDB, 0x1034, 0x4FDD, 0x0E2D, 0x4FDF, 0x1031,
- 0x4FE0, 0x1DEC, 0x4FE1, 0x09F4, 0x4FE3, 0x0EA1, 0x4FE4, 0x1038,
- 0x4FE5, 0x1039, 0x4FEE, 0x092E, 0x4FEF, 0x1046, 0x4FF3, 0x0D06,
- 0x4FF5, 0x0DA8, 0x4FF6, 0x1041, 0x4FF8, 0x0E40, 0x4FFA, 0x0536,
- 0x4FFD, 0x37F6, 0x4FFE, 0x1045, 0x4FFF, 0x20C1, 0x5000, 0x37F7,
- 0x5001, 0x37F8, 0x5002, 0x3447, 0x5005, 0x103F, 0x5006, 0x1048,
- 0x5009, 0x0AD4, 0x500B, 0x0778, 0x500D, 0x0D12, 0x500F, 0x1600,
- 0x5010, 0x37F9, 0x5011, 0x1047, 0x5012, 0x0C57, 0x5014, 0x103C,
- 0x5016, 0x07AA, 0x5019, 0x07A9, 0x501A, 0x103A, 0x501B, 0x37FA,
- 0x501E, 0x20C2, 0x501F, 0x0906, 0x5021, 0x1042, 0x5022, 0x20C0,
- 0x5023, 0x0E3F, 0x5024, 0x0B8B, 0x5025, 0x103E, 0x5026, 0x0747,
- 0x5027, 0x37FB, 0x5028, 0x103B, 0x5029, 0x1043, 0x502A, 0x103D,
- 0x502B, 0x0F99, 0x502C, 0x1044, 0x502D, 0x0FE7, 0x502E, 0x37FC,
- 0x5036, 0x06DE, 0x5039, 0x0746, 0x503B, 0x3800, 0x5040, 0x20BF,
- 0x5042, 0x20C5, 0x5043, 0x1049, 0x5046, 0x20C3, 0x5047, 0x104A,
- 0x5048, 0x104E, 0x5049, 0x0492, 0x504F, 0x0E20, 0x5050, 0x104D,
- 0x5055, 0x104C, 0x5056, 0x1050, 0x5057, 0x37FD, 0x505A, 0x104F,
- 0x505C, 0x0C00, 0x5065, 0x0748, 0x5066, 0x37FE, 0x506A, 0x37FF,
- 0x506C, 0x1051, 0x5070, 0x20C4, 0x5072, 0x08F1, 0x5074, 0x0B06,
- 0x5075, 0x0C01, 0x5076, 0x06EE, 0x5078, 0x1052, 0x507D, 0x0650,
- 0x5080, 0x1053, 0x5085, 0x1055, 0x508D, 0x0E63, 0x508F, 0x3801,
- 0x5091, 0x073C, 0x5094, 0x20C6, 0x5096, 0x3802, 0x5098, 0x087F,
- 0x5099, 0x0D8B, 0x509A, 0x1054, 0x509C, 0x3803, 0x50AC, 0x0835,
- 0x50AD, 0x0F2D, 0x50B2, 0x1057, 0x50B3, 0x105A, 0x50B4, 0x1056,
- 0x50B5, 0x0834, 0x50B7, 0x0987, 0x50BE, 0x070F, 0x50C2, 0x105B,
- 0x50C5, 0x06C7, 0x50C9, 0x1058, 0x50CA, 0x1059, 0x50CC, 0x3804,
- 0x50CD, 0x0C87, 0x50CF, 0x0AFE, 0x50D1, 0x069B, 0x50D5, 0x0E7B,
- 0x50D6, 0x105C, 0x50D8, 0x20C8, 0x50D9, 0x3C30, 0x50DA, 0x0F85,
- 0x50DE, 0x105D, 0x50E3, 0x1060, 0x50E5, 0x105E, 0x50E6, 0x3805,
- 0x50E7, 0x0AD0, 0x50E9, 0x3806, 0x50ED, 0x105F, 0x50EE, 0x1061,
- 0x50EF, 0x3807, 0x50F0, 0x3C31, 0x50F4, 0x20C7, 0x50F5, 0x1063,
- 0x50F9, 0x1062, 0x50FB, 0x0E18, 0x5100, 0x0651, 0x5101, 0x1065,
- 0x5102, 0x1066, 0x5104, 0x052F, 0x5108, 0x3808, 0x5109, 0x1064,
- 0x510B, 0x3809, 0x5110, 0x380A, 0x5112, 0x0920, 0x5114, 0x1069,
- 0x5115, 0x1068, 0x5116, 0x1067, 0x5118, 0x102F, 0x511A, 0x106A,
- 0x511B, 0x380B, 0x511E, 0x380C, 0x511F, 0x0988, 0x5121, 0x106B,
- 0x512A, 0x0F0F, 0x5132, 0x0EE5, 0x5137, 0x106D, 0x513A, 0x106C,
- 0x513B, 0x106F, 0x513C, 0x106E, 0x513F, 0x1070, 0x5140, 0x1071,
- 0x5141, 0x04B8, 0x5143, 0x0769, 0x5144, 0x0711, 0x5145, 0x0946,
- 0x5146, 0x0BB9, 0x5147, 0x069C, 0x5148, 0x0A8C, 0x5149, 0x07AB,
- 0x514A, 0x20C9, 0x514B, 0x0800, 0x514C, 0x1073, 0x514D, 0x0ED4,
- 0x514E, 0x0C40, 0x5150, 0x08C7, 0x5152, 0x1072, 0x5154, 0x1074,
- 0x515A, 0x0C58, 0x515C, 0x05D3, 0x515F, 0x380D, 0x5162, 0x1075,
- 0x5164, 0x20CA, 0x5165, 0x0CD6, 0x5167, 0x368E, 0x5168, 0x0AB6,
- 0x5169, 0x1077, 0x516A, 0x1078, 0x516B, 0x0D40, 0x516C, 0x07AC,
- 0x516D, 0x0FE1, 0x516E, 0x1079, 0x5171, 0x069E, 0x5175, 0x0E0C,
- 0x5176, 0x0B16, 0x5177, 0x06E9, 0x5178, 0x0C2F, 0x5179, 0x3779,
- 0x517C, 0x0749, 0x5180, 0x107A, 0x5182, 0x107B, 0x5185, 0x0CBA,
- 0x5186, 0x0501, 0x5189, 0x107E, 0x518A, 0x086D, 0x518C, 0x107D,
- 0x518D, 0x0836, 0x518F, 0x107F, 0x5190, 0x185B, 0x5191, 0x1080,
- 0x5192, 0x0E6F, 0x5193, 0x1081, 0x5195, 0x1082, 0x5196, 0x1083,
- 0x5197, 0x09D1, 0x5199, 0x08F8, 0x519D, 0x20CB, 0x51A0, 0x05E3,
- 0x51A1, 0x380E, 0x51A2, 0x1086, 0x51A4, 0x1084, 0x51A5, 0x0EC9,
- 0x51A6, 0x1085, 0x51A8, 0x0DCC, 0x51A9, 0x1087, 0x51AA, 0x1088,
- 0x51AB, 0x1089, 0x51AC, 0x0C59, 0x51B0, 0x108D, 0x51B1, 0x108B,
- 0x51B2, 0x108C, 0x51B3, 0x108A, 0x51B4, 0x0853, 0x51B5, 0x108E,
- 0x51B6, 0x0EF6, 0x51B7, 0x0FAC, 0x51BC, 0x380F, 0x51BD, 0x108F,
- 0x51BE, 0x20CC, 0x51C3, 0x3C32, 0x51C4, 0x0A4C, 0x51C5, 0x1090,
- 0x51C6, 0x0964, 0x51C9, 0x1091, 0x51CB, 0x0BBA, 0x51CC, 0x0F87,
- 0x51CD, 0x0C5A, 0x51D6, 0x10DA, 0x51DB, 0x1092, 0x51DC, 0x205C,
- 0x51DD, 0x06BD, 0x51DE, 0x3810, 0x51E0, 0x1093, 0x51E1, 0x0E8C,
- 0x51E6, 0x0972, 0x51E7, 0x0B5C, 0x51E9, 0x1095, 0x51EA, 0x0CBC,
- 0x51EC, 0x20CD, 0x51ED, 0x1096, 0x51EE, 0x3811, 0x51F0, 0x1097,
- 0x51F1, 0x058C, 0x51F4, 0x3812, 0x51F5, 0x1098, 0x51F6, 0x069F,
- 0x51F8, 0x0CA4, 0x51F9, 0x051C, 0x51FA, 0x095A, 0x51FD, 0x0D35,
- 0x51FE, 0x1099, 0x5200, 0x0C5B, 0x5201, 0x3813, 0x5202, 0x3814,
- 0x5203, 0x0A15, 0x5204, 0x109A, 0x5206, 0x0DFC, 0x5207, 0x0A7E,
- 0x5208, 0x05DE, 0x520A, 0x05E5, 0x520B, 0x109B, 0x520E, 0x109D,
- 0x5211, 0x0710, 0x5213, 0x3815, 0x5214, 0x109C, 0x5215, 0x20CE,
- 0x5217, 0x0FBB, 0x521D, 0x0973, 0x5224, 0x0D51, 0x5225, 0x0E1C,
- 0x5227, 0x109E, 0x5229, 0x0F62, 0x522A, 0x109F, 0x522E, 0x10A0,
- 0x5230, 0x0C78, 0x5233, 0x10A1, 0x5236, 0x0A4D, 0x5237, 0x086E,
- 0x5238, 0x074A, 0x5239, 0x10A2, 0x523A, 0x0897, 0x523B, 0x0801,
- 0x5243, 0x0C02, 0x5244, 0x10A4, 0x5247, 0x0B07, 0x5249, 0x3816,
- 0x524A, 0x085F, 0x524B, 0x10A5, 0x524C, 0x10A6, 0x524D, 0x0AB2,
- 0x524F, 0x10A3, 0x5254, 0x10A8, 0x5256, 0x0E64, 0x525B, 0x07F6,
- 0x525D, 0x1E5E, 0x525E, 0x10A7, 0x5261, 0x3817, 0x5263, 0x074B,
- 0x5264, 0x084E, 0x5265, 0x0D23, 0x5266, 0x3818, 0x5269, 0x10AB,
- 0x526A, 0x10A9, 0x526F, 0x0DED, 0x5270, 0x09D2, 0x5271, 0x10B2,
- 0x5272, 0x05C2, 0x5273, 0x10AC, 0x5274, 0x10AA, 0x5275, 0x0AD1,
- 0x527D, 0x10AE, 0x527F, 0x10AD, 0x5283, 0x05A2, 0x5287, 0x0736,
- 0x5288, 0x10B3, 0x5289, 0x0F75, 0x528D, 0x10AF, 0x5291, 0x10B4,
- 0x5292, 0x10B1, 0x5293, 0x3819, 0x5294, 0x10B0, 0x529B, 0x0F97,
- 0x529C, 0x20CF, 0x529F, 0x07AD, 0x52A0, 0x0543, 0x52A3, 0x0FBC,
- 0x52A6, 0x20D0, 0x52A9, 0x097F, 0x52AA, 0x0C52, 0x52AB, 0x07F7,
- 0x52AC, 0x10B7, 0x52AD, 0x10B8, 0x52AF, 0x217D, 0x52B1, 0x0FAD,
- 0x52B4, 0x0FD1, 0x52B5, 0x10BA, 0x52B9, 0x07AE, 0x52BC, 0x10B9,
- 0x52BE, 0x058D, 0x52C0, 0x20D1, 0x52C1, 0x10BB, 0x52C3, 0x0E84,
- 0x52C5, 0x0BD8, 0x52C7, 0x0F10, 0x52C8, 0x381A, 0x52C9, 0x0E29,
- 0x52CD, 0x10BC, 0x52D0, 0x36E8, 0x52D2, 0x1BEE, 0x52D5, 0x0C88,
- 0x52D7, 0x10BD, 0x52D8, 0x05E6, 0x52D9, 0x0EBF, 0x52DB, 0x20D2,
- 0x52DD, 0x0989, 0x52DE, 0x10BE, 0x52DF, 0x0E37, 0x52E0, 0x10C2,
- 0x52E2, 0x0A4E, 0x52E3, 0x10BF, 0x52E4, 0x06C8, 0x52E6, 0x10C0,
- 0x52E7, 0x05E7, 0x52F0, 0x381B, 0x52F2, 0x0704, 0x52F3, 0x10C3,
- 0x52F5, 0x10C4, 0x52F8, 0x10C5, 0x52F9, 0x10C6, 0x52FA, 0x0907,
- 0x52FE, 0x07AF, 0x52FF, 0x0EEA, 0x5300, 0x20D3, 0x5301, 0x0EF4,
- 0x5302, 0x0CCF, 0x5305, 0x0E41, 0x5306, 0x10C7, 0x5307, 0x20D4,
- 0x5308, 0x10C8, 0x530A, 0x381C, 0x530B, 0x381D, 0x530D, 0x10CA,
- 0x530F, 0x10CC, 0x5310, 0x10CB, 0x5315, 0x10CD, 0x5316, 0x053D,
- 0x5317, 0x0E7A, 0x5319, 0x086C, 0x531A, 0x10CE, 0x531D, 0x0ADB,
- 0x5320, 0x098A, 0x5321, 0x06A1, 0x5323, 0x10CF, 0x5324, 0x20D5,
- 0x532A, 0x0D6F, 0x532F, 0x10D0, 0x5331, 0x10D1, 0x5333, 0x10D2,
- 0x5338, 0x10D3, 0x5339, 0x0D96, 0x533A, 0x06E0, 0x533B, 0x04A9,
- 0x533E, 0x381E, 0x533F, 0x0C97, 0x5340, 0x10D4, 0x5341, 0x0947,
- 0x5343, 0x0A8D, 0x5345, 0x10D6, 0x5346, 0x10D5, 0x5347, 0x098B,
- 0x5348, 0x0795, 0x5349, 0x10D8, 0x534A, 0x0D52, 0x534B, 0x3820,
- 0x534C, 0x381F, 0x534D, 0x10D9, 0x5351, 0x0D70, 0x5352, 0x0B14,
- 0x5353, 0x0B4E, 0x5354, 0x06A0, 0x5357, 0x0CC6, 0x5358, 0x0B6F,
- 0x535A, 0x0D24, 0x535C, 0x0E7C, 0x535E, 0x10DB, 0x5360, 0x0A8E,
- 0x5361, 0x3821, 0x5366, 0x070B, 0x5369, 0x10DC, 0x536C, 0x3822,
- 0x536E, 0x10DD, 0x536F, 0x04CE, 0x5370, 0x04B9, 0x5371, 0x0629,
- 0x5372, 0x20D6, 0x5373, 0x0B08, 0x5374, 0x066B, 0x5375, 0x0F5B,
- 0x5377, 0x10E0, 0x5378, 0x0537, 0x537B, 0x10DF, 0x537D, 0x3435,
- 0x537F, 0x06A2, 0x5382, 0x10E1, 0x5384, 0x0EFD, 0x5389, 0x37D0,
- 0x5393, 0x20D7, 0x5396, 0x10E2, 0x5398, 0x0F9A, 0x539A, 0x07B0,
- 0x539F, 0x076A, 0x53A0, 0x10E3, 0x53A5, 0x10E5, 0x53A6, 0x10E4,
- 0x53A8, 0x0A25, 0x53A9, 0x04DB, 0x53AB, 0x3823, 0x53AD, 0x0500,
- 0x53AE, 0x10E6, 0x53B0, 0x10E7, 0x53B2, 0x20D8, 0x53B3, 0x076B,
- 0x53B6, 0x10E8, 0x53BB, 0x0688, 0x53C2, 0x0880, 0x53C3, 0x10E9,
- 0x53C8, 0x0EA2, 0x53C9, 0x0825, 0x53CA, 0x0674, 0x53CB, 0x0F11,
- 0x53CC, 0x0AD2, 0x53CD, 0x0D53, 0x53CE, 0x0929, 0x53D4, 0x0951,
- 0x53D6, 0x0914, 0x53D7, 0x0921, 0x53D9, 0x0980, 0x53DA, 0x3824,
- 0x53DB, 0x0D54, 0x53DD, 0x20D9, 0x53DF, 0x10EC, 0x53E1, 0x04E5,
- 0x53E2, 0x0AD3, 0x53E3, 0x07B1, 0x53E4, 0x0779, 0x53E5, 0x06DF,
- 0x53E6, 0x3825, 0x53E8, 0x10F0, 0x53E9, 0x0B5F, 0x53EA, 0x0B5E,
- 0x53EB, 0x06A3, 0x53EC, 0x098C, 0x53ED, 0x10F1, 0x53EE, 0x10EF,
- 0x53EF, 0x0544, 0x53F0, 0x0B46, 0x53F1, 0x08E4, 0x53F2, 0x0899,
- 0x53F3, 0x04C8, 0x53F5, 0x3826, 0x53F6, 0x05CE, 0x53F7, 0x07F8,
- 0x53F8, 0x0898, 0x53FA, 0x10F2, 0x5401, 0x10F3, 0x5403, 0x0663,
- 0x5404, 0x05A4, 0x5408, 0x07F9, 0x5409, 0x0662, 0x540A, 0x0BFB,
- 0x540B, 0x04C7, 0x540C, 0x0C89, 0x540D, 0x0ECA, 0x540E, 0x07B3,
- 0x540F, 0x0F63, 0x5410, 0x0C41, 0x5411, 0x07B2, 0x541B, 0x0705,
- 0x541D, 0x10FC, 0x541F, 0x06DB, 0x5420, 0x0E78, 0x5426, 0x0D71,
- 0x5427, 0x3827, 0x5429, 0x10FB, 0x542B, 0x061A, 0x542C, 0x10F6,
- 0x542D, 0x10F7, 0x542E, 0x10F9, 0x5433, 0x35C0, 0x5436, 0x10FA,
- 0x5438, 0x0675, 0x5439, 0x0A27, 0x543B, 0x0DFD, 0x543C, 0x10F8,
- 0x543D, 0x10F4, 0x543E, 0x0797, 0x543F, 0x35CF, 0x5440, 0x10F5,
- 0x5442, 0x0FCA, 0x5446, 0x0E42, 0x5448, 0x0C04, 0x5449, 0x0796,
- 0x544A, 0x0802, 0x544D, 0x3828, 0x544E, 0x10FD, 0x5451, 0x0CB5,
- 0x5455, 0x3723, 0x545F, 0x1101, 0x5466, 0x3829, 0x5468, 0x092A,
- 0x546A, 0x0922, 0x546B, 0x382A, 0x5470, 0x1104, 0x5471, 0x1102,
- 0x5473, 0x0EAF, 0x5474, 0x382B, 0x5475, 0x10FF, 0x5476, 0x1108,
- 0x5477, 0x1103, 0x547B, 0x1106, 0x547C, 0x077A, 0x547D, 0x0ECB,
- 0x5480, 0x1107, 0x5484, 0x1109, 0x5486, 0x110B, 0x548A, 0x20DC,
- 0x548B, 0x0860, 0x548C, 0x0FE8, 0x548D, 0x382C, 0x548E, 0x1100,
- 0x548F, 0x10FE, 0x5490, 0x110A, 0x5492, 0x1105, 0x5496, 0x382D,
- 0x549C, 0x20DB, 0x54A1, 0x382E, 0x54A2, 0x110D, 0x54A4, 0x1116,
- 0x54A5, 0x110F, 0x54A8, 0x1113, 0x54A9, 0x20DD, 0x54AB, 0x1114,
- 0x54AC, 0x1110, 0x54AD, 0x382F, 0x54AF, 0x1131, 0x54B2, 0x0859,
- 0x54B3, 0x058F, 0x54B8, 0x110E, 0x54B9, 0x3830, 0x54BC, 0x1118,
- 0x54BD, 0x04BA, 0x54BE, 0x1117, 0x54BF, 0x3831, 0x54C0, 0x0469,
- 0x54C1, 0x0DBC, 0x54C2, 0x1115, 0x54C4, 0x1111, 0x54C6, 0x3832,
- 0x54C7, 0x110C, 0x54C8, 0x1112, 0x54C9, 0x0838, 0x54CD, 0x3833,
- 0x54D8, 0x1119, 0x54E1, 0x04BB, 0x54E2, 0x1122, 0x54E5, 0x111A,
- 0x54E6, 0x111B, 0x54E8, 0x098D, 0x54E9, 0x0E97, 0x54ED, 0x1120,
- 0x54EE, 0x111F, 0x54F2, 0x0C29, 0x54FA, 0x1121, 0x54FD, 0x111E,
- 0x54FF, 0x20DE, 0x5504, 0x04D6, 0x5506, 0x0826, 0x5507, 0x09F6,
- 0x550E, 0x3834, 0x550F, 0x111C, 0x5510, 0x0C5C, 0x5514, 0x111D,
- 0x5516, 0x0466, 0x552B, 0x3835, 0x552E, 0x1127, 0x552F, 0x0F0D,
- 0x5531, 0x098F, 0x5533, 0x112D, 0x5535, 0x3836, 0x5538, 0x112C,
- 0x5539, 0x1123, 0x553E, 0x0B23, 0x5540, 0x1124, 0x5544, 0x0B4F,
- 0x5545, 0x1129, 0x5546, 0x098E, 0x554A, 0x3837, 0x554C, 0x1126,
- 0x554F, 0x0EF0, 0x5553, 0x0712, 0x5556, 0x112A, 0x5557, 0x112B,
- 0x555C, 0x1128, 0x555D, 0x112E, 0x555E, 0x1DD1, 0x5560, 0x3838,
- 0x5561, 0x3839, 0x5563, 0x1125, 0x557B, 0x1134, 0x557C, 0x1139,
- 0x557E, 0x1135, 0x5580, 0x1130, 0x5583, 0x113A, 0x5584, 0x0AB3,
- 0x5586, 0x20DF, 0x5587, 0x113C, 0x5588, 0x383A, 0x5589, 0x07B4,
- 0x558A, 0x1132, 0x558B, 0x0BBB, 0x558E, 0x383B, 0x5598, 0x1136,
- 0x5599, 0x112F, 0x559A, 0x05E9, 0x559C, 0x062A, 0x559D, 0x05C3,
- 0x559E, 0x1137, 0x559F, 0x1133, 0x55A7, 0x074C, 0x55A8, 0x113D,
- 0x55A9, 0x113B, 0x55AA, 0x0AD5, 0x55AB, 0x0664, 0x55AC, 0x06A4,
- 0x55AE, 0x1138, 0x55B0, 0x06EC, 0x55B6, 0x04E6, 0x55C4, 0x1141,
- 0x55C5, 0x113F, 0x55C7, 0x1178, 0x55D4, 0x1144, 0x55DA, 0x113E,
- 0x55DC, 0x1142, 0x55DF, 0x1140, 0x55E3, 0x089A, 0x55E4, 0x1143,
- 0x55F7, 0x1146, 0x55F9, 0x114B, 0x55FD, 0x1149, 0x55FE, 0x1148,
- 0x5606, 0x0B70, 0x5608, 0x383C, 0x5609, 0x0545, 0x560E, 0x383D,
- 0x560F, 0x383E, 0x5614, 0x1145, 0x5616, 0x1147, 0x5617, 0x0990,
- 0x5618, 0x04D5, 0x561B, 0x114A, 0x5620, 0x3C1D, 0x5629, 0x055E,
- 0x562F, 0x1155, 0x5631, 0x09E4, 0x5632, 0x1151, 0x5634, 0x114F,
- 0x5636, 0x1150, 0x5637, 0x383F, 0x5638, 0x1152, 0x563F, 0x3840,
- 0x5642, 0x04DF, 0x5649, 0x3841, 0x564B, 0x3842, 0x564C, 0x0ABB,
- 0x564E, 0x114C, 0x564F, 0x3843, 0x5650, 0x114D, 0x5653, 0x1F1B,
- 0x565B, 0x05D8, 0x5664, 0x1154, 0x5666, 0x3844, 0x5668, 0x062B,
- 0x5669, 0x3845, 0x566A, 0x1157, 0x566B, 0x1153, 0x566C, 0x1156,
- 0x566F, 0x3846, 0x5671, 0x3847, 0x5672, 0x3848, 0x5674, 0x0DFE,
- 0x5676, 0x3C33, 0x5678, 0x0CAD, 0x567A, 0x0D4C, 0x5680, 0x1159,
- 0x5686, 0x1158, 0x5687, 0x05A3, 0x568A, 0x115A, 0x568F, 0x115D,
- 0x5694, 0x115C, 0x5695, 0x3849, 0x5699, 0x1DE6, 0x569A, 0x384A,
- 0x56A0, 0x115B, 0x56A2, 0x0CEF, 0x56A5, 0x115E, 0x56AC, 0x384B,
- 0x56AD, 0x384C, 0x56AE, 0x115F, 0x56B1, 0x384D, 0x56B4, 0x1161,
- 0x56B6, 0x1160, 0x56BC, 0x1163, 0x56C0, 0x1166, 0x56C1, 0x1164,
- 0x56C2, 0x1162, 0x56C3, 0x1165, 0x56C8, 0x1167, 0x56C9, 0x384E,
- 0x56CA, 0x1E5A, 0x56CE, 0x1168, 0x56D1, 0x1169, 0x56D3, 0x116A,
- 0x56D7, 0x116B, 0x56D8, 0x107C, 0x56DA, 0x0928, 0x56DB, 0x089B,
- 0x56DD, 0x384F, 0x56DE, 0x0573, 0x56E0, 0x04BC, 0x56E3, 0x0B82,
- 0x56E4, 0x3850, 0x56EE, 0x116C, 0x56F0, 0x0814, 0x56F2, 0x0493,
- 0x56F3, 0x0A24, 0x56F9, 0x116D, 0x56FA, 0x077B, 0x56FD, 0x0803,
- 0x56FF, 0x116F, 0x5700, 0x116E, 0x5703, 0x0E30, 0x5704, 0x1170,
- 0x5708, 0x1172, 0x5709, 0x1171, 0x570A, 0x3851, 0x570B, 0x1173,
- 0x570D, 0x1174, 0x570F, 0x074D, 0x5712, 0x0502, 0x5713, 0x1175,
- 0x5715, 0x3852, 0x5716, 0x1177, 0x5718, 0x1176, 0x571C, 0x1179,
- 0x571F, 0x0C54, 0x5721, 0x3680, 0x5723, 0x3853, 0x5726, 0x117A,
- 0x5727, 0x0479, 0x5728, 0x084F, 0x572D, 0x0713, 0x572F, 0x3854,
- 0x5730, 0x0B8D, 0x5733, 0x3855, 0x5734, 0x3856, 0x5737, 0x117B,
- 0x5738, 0x117C, 0x573B, 0x117E, 0x5740, 0x117F, 0x5742, 0x0854,
- 0x5747, 0x06C9, 0x574A, 0x0E65, 0x574C, 0x3857, 0x574E, 0x117D,
- 0x574F, 0x1180, 0x5750, 0x0831, 0x5751, 0x07B5, 0x5759, 0x20E0,
- 0x5761, 0x1184, 0x5764, 0x0815, 0x5765, 0x20E1, 0x5766, 0x0B71,
- 0x5769, 0x1181, 0x576A, 0x0BF6, 0x5770, 0x3858, 0x577F, 0x1185,
- 0x5782, 0x0A28, 0x5788, 0x1183, 0x5789, 0x1186, 0x578B, 0x0715,
- 0x578C, 0x3859, 0x5793, 0x1187, 0x579C, 0x385A, 0x57A0, 0x1188,
- 0x57A2, 0x07B6, 0x57A3, 0x059E, 0x57A4, 0x118A, 0x57AA, 0x118B,
- 0x57AC, 0x20E2, 0x57B0, 0x118C, 0x57B3, 0x1189, 0x57B8, 0x385B,
- 0x57C0, 0x1182, 0x57C3, 0x118D, 0x57C6, 0x118E, 0x57C7, 0x20E4,
- 0x57C8, 0x20E3, 0x57CB, 0x0E92, 0x57CE, 0x09D3, 0x57D2, 0x1190,
- 0x57D3, 0x1191, 0x57D4, 0x118F, 0x57D6, 0x1193, 0x57DC, 0x0CEE,
- 0x57DF, 0x04AC, 0x57E0, 0x0DC8, 0x57E3, 0x1194, 0x57E6, 0x385C,
- 0x57ED, 0x385D, 0x57F4, 0x09E5, 0x57F5, 0x385E, 0x57F6, 0x385F,
- 0x57F7, 0x08E5, 0x57F9, 0x0D13, 0x57FA, 0x062C, 0x57FC, 0x085B,
- 0x57FF, 0x3860, 0x5800, 0x0E87, 0x5802, 0x0C8A, 0x5805, 0x074E,
- 0x5806, 0x0B2F, 0x5809, 0x3861, 0x580A, 0x1192, 0x580B, 0x1195,
- 0x5815, 0x0B24, 0x5819, 0x1196, 0x581D, 0x1197, 0x5820, 0x3862,
- 0x5821, 0x1199, 0x5824, 0x0C05, 0x582A, 0x05EA, 0x582F, 0x1D32,
- 0x5830, 0x0503, 0x5831, 0x0E43, 0x5832, 0x3863, 0x5834, 0x09D4,
- 0x5835, 0x0C42, 0x583A, 0x0856, 0x583D, 0x119F, 0x5840, 0x0E0D,
- 0x5841, 0x0FA5, 0x584A, 0x0574, 0x584B, 0x119B, 0x5851, 0x0ABC,
- 0x5852, 0x119E, 0x5854, 0x0C5D, 0x5857, 0x0C43, 0x5858, 0x0C5E,
- 0x5859, 0x0D4D, 0x585A, 0x0BE9, 0x585E, 0x0839, 0x5861, 0x1E47,
- 0x5862, 0x119A, 0x5869, 0x0518, 0x586B, 0x0C30, 0x5870, 0x119C,
- 0x5872, 0x1198, 0x5875, 0x0A16, 0x5879, 0x11A0, 0x587C, 0x3864,
- 0x587E, 0x0958, 0x5880, 0x3865, 0x5883, 0x06A5, 0x5885, 0x11A1,
- 0x5893, 0x0E38, 0x5897, 0x0AFF, 0x589C, 0x0BE2, 0x589E, 0x20E7,
- 0x589F, 0x11A3, 0x58A8, 0x0E7D, 0x58A9, 0x3866, 0x58AB, 0x11A4,
- 0x58AE, 0x11A9, 0x58B2, 0x20E8, 0x58B3, 0x0DFF, 0x58B8, 0x11A8,
- 0x58B9, 0x11A2, 0x58BA, 0x11A5, 0x58BB, 0x11A7, 0x58BE, 0x0816,
- 0x58C1, 0x0E19, 0x58C5, 0x11AA, 0x58C7, 0x0B83, 0x58CA, 0x0575,
- 0x58CC, 0x09D5, 0x58CE, 0x3867, 0x58D0, 0x3868, 0x58D1, 0x11AC,
- 0x58D3, 0x11AB, 0x58D4, 0x3869, 0x58D5, 0x07FA, 0x58D7, 0x11AD,
- 0x58D8, 0x11AF, 0x58D9, 0x11AE, 0x58DA, 0x386A, 0x58DC, 0x11B1,
- 0x58DE, 0x11A6, 0x58DF, 0x11B3, 0x58E4, 0x11B2, 0x58E5, 0x11B0,
- 0x58E9, 0x386B, 0x58EB, 0x089C, 0x58EC, 0x0A17, 0x58EE, 0x0AD6,
- 0x58EF, 0x11B4, 0x58F0, 0x0A60, 0x58F1, 0x04B1, 0x58F2, 0x0D1A,
- 0x58F7, 0x0BF7, 0x58F9, 0x11B6, 0x58FA, 0x11B5, 0x58FB, 0x11B7,
- 0x58FC, 0x11B8, 0x58FD, 0x11B9, 0x5902, 0x11BA, 0x5909, 0x0E21,
- 0x590A, 0x11BB, 0x590B, 0x20E9, 0x590C, 0x386C, 0x590F, 0x0546,
- 0x5910, 0x11BC, 0x5915, 0x0F26, 0x5916, 0x058E, 0x5918, 0x10DE,
- 0x5919, 0x0952, 0x591A, 0x0B1F, 0x591B, 0x11BD, 0x591C, 0x0EF7,
- 0x5922, 0x0EC0, 0x5924, 0x386D, 0x5925, 0x11BF, 0x5927, 0x0B47,
- 0x5929, 0x0C31, 0x592A, 0x0B20, 0x592B, 0x0DC9, 0x592C, 0x11C0,
- 0x592D, 0x11C1, 0x592E, 0x051D, 0x592F, 0x386E, 0x5931, 0x08E6,
- 0x5932, 0x11C2, 0x5937, 0x0494, 0x5938, 0x11C3, 0x5939, 0x3725,
- 0x593E, 0x11C4, 0x5944, 0x0504, 0x5947, 0x062D, 0x5948, 0x0CB8,
- 0x5949, 0x0E44, 0x594E, 0x11C8, 0x594F, 0x0AD7, 0x5950, 0x11C7,
- 0x5951, 0x0716, 0x5953, 0x20EA, 0x5954, 0x0E89, 0x5955, 0x11C6,
- 0x5957, 0x0C5F, 0x5958, 0x11CA, 0x595A, 0x11C9, 0x595B, 0x20EB,
- 0x595D, 0x20EC, 0x5960, 0x11CC, 0x5961, 0x386F, 0x5962, 0x11CB,
- 0x5963, 0x20ED, 0x5965, 0x051E, 0x5967, 0x11CD, 0x5968, 0x0991,
- 0x5969, 0x11CF, 0x596A, 0x0B63, 0x596C, 0x11CE, 0x596D, 0x3870,
- 0x596E, 0x0E03, 0x5973, 0x0981, 0x5974, 0x0C55, 0x5978, 0x11D0,
- 0x597D, 0x07B7, 0x5981, 0x11D1, 0x5982, 0x0CD7, 0x5983, 0x0D72,
- 0x5984, 0x0EDD, 0x598A, 0x0CDB, 0x598D, 0x11DA, 0x5993, 0x0652,
- 0x5996, 0x0F2F, 0x5999, 0x0EBB, 0x599B, 0x1239, 0x599D, 0x11D2,
- 0x59A3, 0x11D5, 0x59A4, 0x20EE, 0x59A5, 0x0B25, 0x59A8, 0x0E66,
- 0x59AC, 0x0C44, 0x59B2, 0x11D6, 0x59B9, 0x0E93, 0x59BA, 0x20EF,
- 0x59BB, 0x083A, 0x59BE, 0x0992, 0x59C6, 0x11D7, 0x59C9, 0x089E,
- 0x59CA, 0x3871, 0x59CB, 0x089D, 0x59D0, 0x047D, 0x59D1, 0x077C,
- 0x59D2, 0x3872, 0x59D3, 0x0A4F, 0x59D4, 0x0495, 0x59D9, 0x11DB,
- 0x59DA, 0x11DC, 0x59DC, 0x11D9, 0x59DD, 0x3873, 0x59E3, 0x3874,
- 0x59E4, 0x3875, 0x59E5, 0x04DA, 0x59E6, 0x05EB, 0x59E8, 0x11D8,
- 0x59EA, 0x0ED1, 0x59EB, 0x0DA3, 0x59EC, 0x36AD, 0x59F6, 0x046C,
- 0x59FB, 0x04BD, 0x59FF, 0x089F, 0x5A01, 0x0496, 0x5A03, 0x0467,
- 0x5A04, 0x3876, 0x5A09, 0x11E1, 0x5A0C, 0x3877, 0x5A11, 0x11DF,
- 0x5A18, 0x0EC8, 0x5A1A, 0x11E2, 0x5A1B, 0x35C1, 0x5A1C, 0x11E0,
- 0x5A1F, 0x11DE, 0x5A20, 0x09F7, 0x5A23, 0x3878, 0x5A25, 0x11DD,
- 0x5A29, 0x0E2A, 0x5A2F, 0x0798, 0x5A35, 0x11E6, 0x5A36, 0x11E7,
- 0x5A3C, 0x0993, 0x5A40, 0x11E3, 0x5A41, 0x0FD2, 0x5A46, 0x0D02,
- 0x5A47, 0x3879, 0x5A49, 0x11E5, 0x5A55, 0x387A, 0x5A5A, 0x0817,
- 0x5A62, 0x11E8, 0x5A63, 0x387B, 0x5A66, 0x0DCA, 0x5A6A, 0x11E9,
- 0x5A6C, 0x11E4, 0x5A6D, 0x387C, 0x5A7E, 0x387D, 0x5A7F, 0x0EC7,
- 0x5A92, 0x0D14, 0x5A9A, 0x11EA, 0x5A9B, 0x0DA4, 0x5A9E, 0x387E,
- 0x5AA7, 0x387F, 0x5AAC, 0x3880, 0x5AB3, 0x3881, 0x5ABC, 0x11EB,
- 0x5ABD, 0x11EF, 0x5ABE, 0x11EC, 0x5AC1, 0x0547, 0x5AC2, 0x11EE,
- 0x5AC9, 0x08E7, 0x5ACB, 0x11ED, 0x5ACC, 0x074F, 0x5AD0, 0x11FB,
- 0x5AD6, 0x11F4, 0x5AD7, 0x11F1, 0x5AE0, 0x3882, 0x5AE1, 0x0BA2,
- 0x5AE3, 0x11F0, 0x5AE6, 0x11F2, 0x5AE9, 0x11F3, 0x5AFA, 0x11F5,
- 0x5AFB, 0x11F6, 0x5B00, 0x3883, 0x5B09, 0x062E, 0x5B0B, 0x11F8,
- 0x5B0C, 0x11F7, 0x5B16, 0x11F9, 0x5B19, 0x3884, 0x5B22, 0x09D6,
- 0x5B25, 0x3885, 0x5B2A, 0x11FC, 0x5B2C, 0x0BF8, 0x5B2D, 0x3886,
- 0x5B30, 0x04E7, 0x5B32, 0x11FA, 0x5B36, 0x11FD, 0x5B3E, 0x11FE,
- 0x5B40, 0x1201, 0x5B41, 0x3887, 0x5B43, 0x11FF, 0x5B45, 0x1200,
- 0x5B50, 0x08A0, 0x5B51, 0x1202, 0x5B54, 0x07B8, 0x5B55, 0x1203,
- 0x5B56, 0x20F0, 0x5B57, 0x08C8, 0x5B58, 0x0B18, 0x5B5A, 0x1204,
- 0x5B5B, 0x1205, 0x5B5C, 0x08A8, 0x5B5D, 0x07B9, 0x5B5F, 0x0EDE,
- 0x5B63, 0x0642, 0x5B64, 0x077D, 0x5B65, 0x1206, 0x5B66, 0x05B6,
- 0x5B69, 0x1207, 0x5B6B, 0x0B19, 0x5B70, 0x1208, 0x5B71, 0x1230,
- 0x5B73, 0x1209, 0x5B75, 0x120A, 0x5B78, 0x120B, 0x5B7A, 0x120D,
- 0x5B7C, 0x3888, 0x5B7E, 0x3889, 0x5B7F, 0x388A, 0x5B80, 0x120E,
- 0x5B82, 0x3610, 0x5B83, 0x120F, 0x5B85, 0x0B50, 0x5B87, 0x04C9,
- 0x5B88, 0x0915, 0x5B89, 0x0486, 0x5B8A, 0x388B, 0x5B8B, 0x0AD9,
- 0x5B8C, 0x05EC, 0x5B8D, 0x08E1, 0x5B8F, 0x07BA, 0x5B95, 0x0C60,
- 0x5B97, 0x092B, 0x5B98, 0x05ED, 0x5B99, 0x0BA6, 0x5B9A, 0x0C06,
- 0x5B9B, 0x047C, 0x5B9C, 0x0653, 0x5B9D, 0x0E45, 0x5B9F, 0x08EE,
- 0x5BA2, 0x066C, 0x5BA3, 0x0A8F, 0x5BA4, 0x08E8, 0x5BA5, 0x0F12,
- 0x5BA6, 0x1210, 0x5BAE, 0x0676, 0x5BB0, 0x083B, 0x5BB3, 0x0590,
- 0x5BB4, 0x0505, 0x5BB5, 0x0994, 0x5BB6, 0x0548, 0x5BB8, 0x1211,
- 0x5BB9, 0x0F30, 0x5BBF, 0x0953, 0x5BC0, 0x20F1, 0x5BC2, 0x0910,
- 0x5BC3, 0x1212, 0x5BC4, 0x062F, 0x5BC5, 0x0CAA, 0x5BC6, 0x0EB5,
- 0x5BC7, 0x1213, 0x5BC9, 0x1214, 0x5BCC, 0x0DCB, 0x5BD0, 0x1216,
- 0x5BD2, 0x05E4, 0x5BD3, 0x06EF, 0x5BD4, 0x1215, 0x5BD8, 0x20F3,
- 0x5BDB, 0x05EE, 0x5BDD, 0x09F8, 0x5BDE, 0x121A, 0x5BDF, 0x086F,
- 0x5BE1, 0x0549, 0x5BE2, 0x1219, 0x5BE4, 0x1217, 0x5BE5, 0x121B,
- 0x5BE6, 0x1218, 0x5BE7, 0x0CE1, 0x5BE8, 0x148E, 0x5BE9, 0x09F9,
- 0x5BEB, 0x121C, 0x5BEC, 0x20F4, 0x5BEE, 0x0F88, 0x5BF0, 0x121D,
- 0x5BF3, 0x121F, 0x5BF5, 0x0BBC, 0x5BF6, 0x121E, 0x5BF8, 0x0A47,
- 0x5BFA, 0x08C9, 0x5BFE, 0x0B30, 0x5BFF, 0x0923, 0x5C01, 0x0DE7,
- 0x5C02, 0x0A90, 0x5C04, 0x08F9, 0x5C05, 0x1220, 0x5C06, 0x0995,
- 0x5C07, 0x1221, 0x5C08, 0x1222, 0x5C09, 0x0497, 0x5C0A, 0x0B1A,
- 0x5C0B, 0x0A18, 0x5C0D, 0x1223, 0x5C0E, 0x0C8B, 0x5C0F, 0x0996,
- 0x5C11, 0x0997, 0x5C13, 0x1224, 0x5C14, 0x372A, 0x5C16, 0x0A91,
- 0x5C19, 0x360B, 0x5C1A, 0x0998, 0x5C1E, 0x20F5, 0x5C20, 0x1225,
- 0x5C22, 0x1226, 0x5C23, 0x388C, 0x5C24, 0x0EEC, 0x5C28, 0x1227,
- 0x5C2B, 0x388D, 0x5C2D, 0x06BE, 0x5C30, 0x388E, 0x5C31, 0x092C,
- 0x5C38, 0x1228, 0x5C39, 0x1229, 0x5C3A, 0x0908, 0x5C3B, 0x09F2,
- 0x5C3C, 0x0CCC, 0x5C3D, 0x0A1A, 0x5C3E, 0x0D8C, 0x5C3F, 0x0CD8,
- 0x5C40, 0x06C1, 0x5C41, 0x122A, 0x5C45, 0x0689, 0x5C46, 0x122B,
- 0x5C48, 0x06F6, 0x5C4A, 0x0CA7, 0x5C4B, 0x0530, 0x5C4D, 0x08A1,
- 0x5C4E, 0x122C, 0x5C4F, 0x122F, 0x5C50, 0x122E, 0x5C51, 0x06F5,
- 0x5C53, 0x122D, 0x5C55, 0x0C32, 0x5C5B, 0x1E92, 0x5C5E, 0x0B10,
- 0x5C60, 0x0C45, 0x5C61, 0x08F4, 0x5C62, 0x1E0D, 0x5C63, 0x388F,
- 0x5C64, 0x0ADA, 0x5C65, 0x0F64, 0x5C69, 0x3890, 0x5C6C, 0x1231,
- 0x5C6E, 0x1232, 0x5C6F, 0x0CAE, 0x5C71, 0x0881, 0x5C76, 0x1234,
- 0x5C79, 0x1235, 0x5C7C, 0x3891, 0x5C8C, 0x1236, 0x5C90, 0x0630,
- 0x5C91, 0x1237, 0x5C94, 0x1238, 0x5CA1, 0x052C, 0x5CA6, 0x20F6,
- 0x5CA8, 0x0ABD, 0x5CA9, 0x0620, 0x5CAB, 0x123A, 0x5CAC, 0x0EB4,
- 0x5CB1, 0x0B32, 0x5CB3, 0x05B7, 0x5CB6, 0x123C, 0x5CB7, 0x123E,
- 0x5CB8, 0x061B, 0x5CBA, 0x20F7, 0x5CBB, 0x123B, 0x5CBC, 0x123D,
- 0x5CBE, 0x1240, 0x5CC5, 0x123F, 0x5CC7, 0x1241, 0x5CCB, 0x3892,
- 0x5CD2, 0x3893, 0x5CD9, 0x1242, 0x5CE0, 0x0C95, 0x5CE1, 0x06A6,
- 0x5CE6, 0x372C, 0x5CE8, 0x0565, 0x5CE9, 0x1243, 0x5CEA, 0x1248,
- 0x5CED, 0x1246, 0x5CEF, 0x0E47, 0x5CF0, 0x0E46, 0x5CF4, 0x3894,
- 0x5CF5, 0x20F8, 0x5CF6, 0x0C61, 0x5CFA, 0x1245, 0x5CFB, 0x095E,
- 0x5CFD, 0x1244, 0x5D07, 0x0A38, 0x5D0B, 0x1249, 0x5D0E, 0x085A,
- 0x5D11, 0x124F, 0x5D14, 0x1250, 0x5D15, 0x124A, 0x5D16, 0x0591,
- 0x5D17, 0x124B, 0x5D18, 0x1254, 0x5D19, 0x1253, 0x5D1A, 0x1252,
- 0x5D1B, 0x124E, 0x5D1F, 0x124D, 0x5D22, 0x1251, 0x5D24, 0x3895,
- 0x5D26, 0x3896, 0x5D27, 0x20F9, 0x5D29, 0x0E48, 0x5D42, 0x20FC,
- 0x5D43, 0x3897, 0x5D46, 0x3898, 0x5D4A, 0x3899, 0x5D4B, 0x1258,
- 0x5D4C, 0x1255, 0x5D4E, 0x1257, 0x5D50, 0x0F5C, 0x5D52, 0x1256,
- 0x5D53, 0x20FA, 0x5D5C, 0x124C, 0x5D69, 0x0A39, 0x5D6C, 0x1259,
- 0x5D6D, 0x20FD, 0x5D6F, 0x0827, 0x5D73, 0x125A, 0x5D76, 0x125B,
- 0x5D82, 0x125E, 0x5D84, 0x125D, 0x5D87, 0x125C, 0x5D8B, 0x0C62,
- 0x5D8C, 0x1247, 0x5D90, 0x1264, 0x5D92, 0x389A, 0x5D94, 0x389B,
- 0x5D99, 0x389C, 0x5D9D, 0x1260, 0x5DA0, 0x389D, 0x5DA2, 0x125F,
- 0x5DAC, 0x1261, 0x5DAE, 0x1262, 0x5DB2, 0x3BA5, 0x5DB7, 0x1265,
- 0x5DB8, 0x20FE, 0x5DB9, 0x20FF, 0x5DBA, 0x0FAE, 0x5DBC, 0x1266,
- 0x5DBD, 0x1263, 0x5DC9, 0x1267, 0x5DCC, 0x061C, 0x5DCD, 0x1268,
- 0x5DD0, 0x2100, 0x5DD2, 0x126A, 0x5DD3, 0x1269, 0x5DD6, 0x126B,
- 0x5DD8, 0x389E, 0x5DDB, 0x126C, 0x5DDD, 0x0A92, 0x5DDE, 0x092D,
- 0x5DE0, 0x389F, 0x5DE1, 0x096E, 0x5DE2, 0x3432, 0x5DE3, 0x0AE5,
- 0x5DE5, 0x07BB, 0x5DE6, 0x0828, 0x5DE7, 0x07BC, 0x5DE8, 0x068A,
- 0x5DEB, 0x126D, 0x5DEE, 0x0829, 0x5DF1, 0x077E, 0x5DF2, 0x126E,
- 0x5DF3, 0x0EB2, 0x5DF4, 0x0CF9, 0x5DF5, 0x126F, 0x5DF7, 0x07BD,
- 0x5DF8, 0x38A0, 0x5DFB, 0x05E8, 0x5DFD, 0x0B65, 0x5DFE, 0x06CA,
- 0x5DFF, 0x35E2, 0x5E00, 0x38A1, 0x5E02, 0x08A2, 0x5E03, 0x0DCD,
- 0x5E06, 0x0D55, 0x5E0B, 0x1270, 0x5E0C, 0x0631, 0x5E11, 0x1273,
- 0x5E12, 0x38A2, 0x5E14, 0x38A3, 0x5E15, 0x38A4, 0x5E16, 0x0BBD,
- 0x5E18, 0x38A5, 0x5E19, 0x1272, 0x5E1A, 0x1271, 0x5E1B, 0x1274,
- 0x5E1D, 0x0C07, 0x5E25, 0x0A29, 0x5E2B, 0x08A3, 0x5E2D, 0x0A6E,
- 0x5E2E, 0x38A6, 0x5E2F, 0x0B33, 0x5E30, 0x063C, 0x5E33, 0x0BBE,
- 0x5E36, 0x1275, 0x5E37, 0x1276, 0x5E38, 0x09D7, 0x5E3D, 0x0E67,
- 0x5E40, 0x1279, 0x5E43, 0x1278, 0x5E44, 0x1277, 0x5E45, 0x0DEF,
- 0x5E47, 0x1280, 0x5E4C, 0x0E88, 0x5E4E, 0x127A, 0x5E54, 0x127C,
- 0x5E55, 0x0E99, 0x5E57, 0x127B, 0x5E58, 0x38A7, 0x5E5F, 0x127D,
- 0x5E61, 0x0D3C, 0x5E62, 0x127E, 0x5E63, 0x0E0E, 0x5E64, 0x127F,
- 0x5E6B, 0x38A8, 0x5E6C, 0x38A9, 0x5E72, 0x05EF, 0x5E73, 0x0E0F,
- 0x5E74, 0x0CE5, 0x5E75, 0x1281, 0x5E76, 0x1282, 0x5E78, 0x07BE,
- 0x5E79, 0x05F0, 0x5E7A, 0x1283, 0x5E7B, 0x076C, 0x5E7C, 0x0F2E,
- 0x5E7D, 0x0F13, 0x5E7E, 0x0632, 0x5E7F, 0x1285, 0x5E81, 0x0BBF,
- 0x5E83, 0x07BF, 0x5E84, 0x0999, 0x5E87, 0x0D73, 0x5E8A, 0x099A,
- 0x5E8F, 0x0982, 0x5E95, 0x0C08, 0x5E96, 0x0E49, 0x5E97, 0x0C33,
- 0x5E99, 0x36B0, 0x5E9A, 0x07C0, 0x5E9C, 0x0DCE, 0x5EA0, 0x1286,
- 0x5EA6, 0x0C53, 0x5EA7, 0x0832, 0x5EA8, 0x38AA, 0x5EAA, 0x38AB,
- 0x5EAB, 0x077F, 0x5EAD, 0x0C09, 0x5EB5, 0x0487, 0x5EB6, 0x0978,
- 0x5EB7, 0x07C1, 0x5EB8, 0x0F31, 0x5EBE, 0x38AC, 0x5EBF, 0x38AD,
- 0x5EC1, 0x1287, 0x5EC2, 0x1288, 0x5EC3, 0x0D07, 0x5EC8, 0x1289,
- 0x5EC9, 0x0FBF, 0x5ECA, 0x0FD3, 0x5ECB, 0x38AE, 0x5ECF, 0x128B,
- 0x5ED0, 0x128A, 0x5ED2, 0x38AF, 0x5ED3, 0x05A5, 0x5ED6, 0x128C,
- 0x5EDA, 0x128F, 0x5EDB, 0x1290, 0x5EDD, 0x128E, 0x5EDF, 0x0DB2,
- 0x5EE0, 0x099B, 0x5EE1, 0x1292, 0x5EE2, 0x1291, 0x5EE3, 0x128D,
- 0x5EE8, 0x1293, 0x5EE9, 0x1294, 0x5EEC, 0x1295, 0x5EF0, 0x1298,
- 0x5EF1, 0x1296, 0x5EF3, 0x1297, 0x5EF4, 0x1299, 0x5EF6, 0x0506,
- 0x5EF7, 0x0C0A, 0x5EF8, 0x129A, 0x5EFA, 0x0750, 0x5EFB, 0x0576,
- 0x5EFC, 0x0CEC, 0x5EFE, 0x129B, 0x5EFF, 0x0CD3, 0x5F01, 0x0E2B,
- 0x5F03, 0x129C, 0x5F04, 0x0FD4, 0x5F07, 0x38B0, 0x5F09, 0x129D,
- 0x5F0A, 0x0E10, 0x5F0B, 0x12A0, 0x5F0C, 0x0FFA, 0x5F0D, 0x100A,
- 0x5F0E, 0x38B1, 0x5F0F, 0x08DC, 0x5F10, 0x0CCD, 0x5F11, 0x12A1,
- 0x5F13, 0x0677, 0x5F14, 0x0BC0, 0x5F15, 0x04BE, 0x5F16, 0x12A2,
- 0x5F17, 0x0DF6, 0x5F18, 0x07C2, 0x5F1B, 0x0B8E, 0x5F1C, 0x38B2,
- 0x5F1D, 0x38B3, 0x5F1F, 0x0C0B, 0x5F21, 0x2101, 0x5F22, 0x38B4,
- 0x5F25, 0x0EFB, 0x5F26, 0x076D, 0x5F27, 0x0780, 0x5F28, 0x38B5,
- 0x5F29, 0x12A3, 0x5F2D, 0x12A4, 0x5F2F, 0x12AA, 0x5F31, 0x0911,
- 0x5F34, 0x2102, 0x5F35, 0x0BC1, 0x5F36, 0x38B6, 0x5F37, 0x06A7,
- 0x5F38, 0x12A5, 0x5F3A, 0x3598, 0x5F3B, 0x38B7, 0x5F3C, 0x0D9D,
- 0x5F3E, 0x0B84, 0x5F40, 0x38B8, 0x5F41, 0x12A6, 0x5F45, 0x20B2,
- 0x5F48, 0x12A7, 0x5F4A, 0x06A8, 0x5F4C, 0x12A8, 0x5F4E, 0x12A9,
- 0x5F50, 0x38B9, 0x5F51, 0x12AB, 0x5F53, 0x0C70, 0x5F56, 0x12AC,
- 0x5F57, 0x12AD, 0x5F58, 0x38BA, 0x5F59, 0x12AE, 0x5F5C, 0x129F,
- 0x5F5D, 0x129E, 0x5F61, 0x12AF, 0x5F62, 0x0717, 0x5F64, 0x38BB,
- 0x5F65, 0x36AC, 0x5F66, 0x0D99, 0x5F67, 0x2103, 0x5F69, 0x083C,
- 0x5F6A, 0x0DA9, 0x5F6B, 0x0BC2, 0x5F6C, 0x0DBD, 0x5F6D, 0x12B0,
- 0x5F70, 0x099C, 0x5F71, 0x04E8, 0x5F73, 0x12B1, 0x5F77, 0x12B2,
- 0x5F79, 0x0EFE, 0x5F7C, 0x0D74, 0x5F7F, 0x12B5, 0x5F80, 0x051F,
- 0x5F81, 0x0A50, 0x5F82, 0x12B4, 0x5F83, 0x12B3, 0x5F84, 0x0718,
- 0x5F85, 0x0B34, 0x5F87, 0x12B9, 0x5F88, 0x12B7, 0x5F89, 0x38BC,
- 0x5F8A, 0x12B6, 0x5F8B, 0x0F6F, 0x5F8C, 0x0799, 0x5F90, 0x0983,
- 0x5F91, 0x12B8, 0x5F92, 0x0C46, 0x5F93, 0x0948, 0x5F97, 0x0C98,
- 0x5F98, 0x12BC, 0x5F99, 0x12BB, 0x5F9C, 0x38BD, 0x5F9E, 0x12BA,
- 0x5FA0, 0x12BD, 0x5FA1, 0x079A, 0x5FA4, 0x38BF, 0x5FA7, 0x38BE,
- 0x5FA8, 0x12BE, 0x5FA9, 0x0DEE, 0x5FAA, 0x0965, 0x5FAD, 0x12BF,
- 0x5FAE, 0x0D8D, 0x5FAF, 0x38C0, 0x5FB3, 0x0C99, 0x5FB4, 0x0BC3,
- 0x5FB5, 0x3438, 0x5FB7, 0x2104, 0x5FB8, 0x38C1, 0x5FB9, 0x0C2A,
- 0x5FBC, 0x12C0, 0x5FBD, 0x0645, 0x5FC3, 0x09FA, 0x5FC4, 0x38C2,
- 0x5FC5, 0x0D9E, 0x5FC9, 0x38C3, 0x5FCC, 0x0633, 0x5FCD, 0x0CDC,
- 0x5FD6, 0x12C1, 0x5FD7, 0x08A4, 0x5FD8, 0x0E68, 0x5FD9, 0x0E69,
- 0x5FDC, 0x0520, 0x5FDD, 0x12C6, 0x5FDE, 0x2105, 0x5FE0, 0x0BA7,
- 0x5FE1, 0x38C4, 0x5FE4, 0x12C3, 0x5FE9, 0x38C5, 0x5FEB, 0x0577,
- 0x5FED, 0x38C6, 0x5FF0, 0x12F6, 0x5FF1, 0x12C5, 0x5FF5, 0x0CE6,
- 0x5FF8, 0x12C4, 0x5FFB, 0x12C2, 0x5FFC, 0x38C7, 0x5FFD, 0x080C,
- 0x5FFF, 0x12C8, 0x600E, 0x12CE, 0x600F, 0x12D4, 0x6010, 0x12CC,
- 0x6012, 0x0C56, 0x6015, 0x12D1, 0x6016, 0x0DCF, 0x6017, 0x38C8,
- 0x6019, 0x12CB, 0x601A, 0x38C9, 0x601B, 0x12D0, 0x601C, 0x0FAF,
- 0x601D, 0x08A5, 0x6020, 0x0B35, 0x6021, 0x12C9, 0x6025, 0x0678,
- 0x6026, 0x12D3, 0x6027, 0x0A51, 0x6028, 0x0507, 0x6029, 0x12CD,
- 0x602A, 0x0578, 0x602B, 0x12D2, 0x602F, 0x06A9, 0x6031, 0x12CF,
- 0x6033, 0x38CA, 0x603A, 0x12D5, 0x6041, 0x12D7, 0x6042, 0x12E1,
- 0x6043, 0x12DF, 0x6046, 0x12DC, 0x604A, 0x12DB, 0x604B, 0x0FC0,
- 0x604D, 0x12DD, 0x6050, 0x06AA, 0x6052, 0x07C3, 0x6055, 0x0984,
- 0x6059, 0x12E4, 0x605A, 0x12D6, 0x605D, 0x2106, 0x605F, 0x12DA,
- 0x6060, 0x12CA, 0x6061, 0x38CB, 0x6062, 0x057A, 0x6063, 0x12DE,
- 0x6064, 0x12E0, 0x6065, 0x0B8F, 0x6068, 0x0818, 0x6069, 0x0538,
- 0x606A, 0x12D8, 0x606B, 0x12E3, 0x606C, 0x12E2, 0x606D, 0x06AB,
- 0x606F, 0x0B09, 0x6070, 0x05C4, 0x6075, 0x0719, 0x6077, 0x12D9,
- 0x607F, 0x38CC, 0x6081, 0x12E5, 0x6083, 0x12E8, 0x6084, 0x12EA,
- 0x6085, 0x2107, 0x6089, 0x08E9, 0x608A, 0x2108, 0x608B, 0x12F0,
- 0x608C, 0x0C0C, 0x608D, 0x12E6, 0x6092, 0x12EE, 0x6094, 0x0579,
- 0x6096, 0x12EC, 0x6097, 0x12ED, 0x609A, 0x12E9, 0x609B, 0x12EB,
- 0x609E, 0x38CD, 0x609F, 0x079B, 0x60A0, 0x0F14, 0x60A3, 0x05F1,
- 0x60A4, 0x38CE, 0x60A6, 0x04FB, 0x60A7, 0x12EF, 0x60A9, 0x0CF0,
- 0x60AA, 0x0471, 0x60B0, 0x38CF, 0x60B2, 0x0D75, 0x60B3, 0x12C7,
- 0x60B4, 0x12F5, 0x60B5, 0x12F9, 0x60B6, 0x0EF1, 0x60B8, 0x12F2,
- 0x60BC, 0x0C63, 0x60BD, 0x12F7, 0x60C5, 0x09D8, 0x60C6, 0x12F8,
- 0x60C7, 0x0CAF, 0x60CB, 0x38D0, 0x60D1, 0x0FED, 0x60D3, 0x12F4,
- 0x60D5, 0x210A, 0x60D8, 0x12FA, 0x60DA, 0x080D, 0x60DB, 0x38D1,
- 0x60DC, 0x0A6F, 0x60DE, 0x2109, 0x60DF, 0x0498, 0x60E0, 0x12F3,
- 0x60E1, 0x12F1, 0x60E3, 0x0ADC, 0x60E7, 0x12E7, 0x60E8, 0x0882,
- 0x60F0, 0x0B26, 0x60F1, 0x1306, 0x60F2, 0x210C, 0x60F3, 0x0ADD,
- 0x60F4, 0x1301, 0x60F6, 0x12FE, 0x60F7, 0x12FF, 0x60F8, 0x38D2,
- 0x60F9, 0x0912, 0x60FA, 0x1302, 0x60FB, 0x1305, 0x6100, 0x1300,
- 0x6101, 0x092F, 0x6103, 0x1303, 0x6106, 0x12FD, 0x6108, 0x0F08,
- 0x6109, 0x0F07, 0x610D, 0x1307, 0x610E, 0x1308, 0x610F, 0x0499,
- 0x6111, 0x210D, 0x6112, 0x38D3, 0x6113, 0x38D4, 0x6114, 0x38D5,
- 0x6115, 0x12FC, 0x611A, 0x06EA, 0x611B, 0x046A, 0x611C, 0x38D6,
- 0x611F, 0x05F2, 0x6120, 0x210B, 0x6121, 0x1304, 0x6127, 0x130C,
- 0x6128, 0x130B, 0x612C, 0x1310, 0x6130, 0x210F, 0x6134, 0x1311,
- 0x6137, 0x210E, 0x613C, 0x130F, 0x613D, 0x1312, 0x613E, 0x130A,
- 0x613F, 0x130E, 0x6142, 0x1313, 0x6144, 0x1314, 0x6147, 0x1309,
- 0x6148, 0x08CA, 0x614A, 0x130D, 0x614B, 0x0B36, 0x614C, 0x07C4,
- 0x614D, 0x12FB, 0x614E, 0x09FB, 0x6153, 0x1321, 0x6155, 0x0E39,
- 0x6158, 0x1317, 0x6159, 0x1318, 0x615A, 0x1319, 0x615D, 0x1320,
- 0x615F, 0x131F, 0x6162, 0x0EAB, 0x6163, 0x05F3, 0x6165, 0x131D,
- 0x6167, 0x071B, 0x6168, 0x0592, 0x616B, 0x131A, 0x616E, 0x0F80,
- 0x616F, 0x131C, 0x6170, 0x049A, 0x6171, 0x131E, 0x6173, 0x1315,
- 0x6174, 0x131B, 0x6175, 0x1322, 0x6176, 0x071A, 0x6177, 0x1316,
- 0x617C, 0x38D7, 0x617E, 0x0F47, 0x6182, 0x0F15, 0x6187, 0x1325,
- 0x618A, 0x1329, 0x618D, 0x38D8, 0x618E, 0x0B00, 0x6190, 0x0FC1,
- 0x6191, 0x132A, 0x6194, 0x1327, 0x6196, 0x1324, 0x6198, 0x2110,
- 0x6199, 0x1323, 0x619A, 0x1328, 0x619F, 0x38D9, 0x61A4, 0x0E00,
- 0x61A7, 0x0C8C, 0x61A8, 0x38DA, 0x61A9, 0x071C, 0x61AB, 0x132B,
- 0x61AC, 0x1326, 0x61AE, 0x132C, 0x61B2, 0x0751, 0x61B6, 0x0531,
- 0x61BA, 0x1334, 0x61BE, 0x05F4, 0x61C2, 0x38DB, 0x61C3, 0x1332,
- 0x61C6, 0x1333, 0x61C7, 0x0819, 0x61C8, 0x1331, 0x61C9, 0x132F,
- 0x61CA, 0x132E, 0x61CB, 0x1335, 0x61CC, 0x132D, 0x61CD, 0x1337,
- 0x61D0, 0x057B, 0x61DF, 0x38DC, 0x61E3, 0x1339, 0x61E6, 0x1338,
- 0x61F2, 0x0BC4, 0x61F4, 0x133C, 0x61F6, 0x133A, 0x61F7, 0x1330,
- 0x61F8, 0x0752, 0x61FA, 0x133B, 0x61FC, 0x133F, 0x61FD, 0x133E,
- 0x61FE, 0x1340, 0x61FF, 0x133D, 0x6200, 0x1341, 0x6208, 0x1342,
- 0x6209, 0x1343, 0x620A, 0x0E3A, 0x620C, 0x1345, 0x620D, 0x1344,
- 0x620E, 0x0949, 0x6210, 0x0A52, 0x6211, 0x0566, 0x6212, 0x057C,
- 0x6213, 0x2111, 0x6214, 0x1346, 0x6215, 0x38DD, 0x6216, 0x0483,
- 0x621A, 0x0A70, 0x621B, 0x1347, 0x621D, 0x1A64, 0x621E, 0x1348,
- 0x621F, 0x0737, 0x6221, 0x1349, 0x6226, 0x0A93, 0x6229, 0x38DE,
- 0x622A, 0x134A, 0x622E, 0x134B, 0x622F, 0x0654, 0x6230, 0x134C,
- 0x6232, 0x134D, 0x6233, 0x134E, 0x6234, 0x0B37, 0x6236, 0x35BD,
- 0x6238, 0x0781, 0x623B, 0x0EED, 0x623E, 0x344E, 0x623F, 0x0E6A,
- 0x6240, 0x0974, 0x6241, 0x134F, 0x6243, 0x38DF, 0x6246, 0x38E0,
- 0x6247, 0x0A94, 0x6248, 0x1B1A, 0x6249, 0x0D76, 0x624B, 0x0916,
- 0x624C, 0x38E1, 0x624D, 0x083D, 0x624E, 0x1350, 0x6251, 0x38E2,
- 0x6253, 0x0B27, 0x6255, 0x0DF7, 0x6256, 0x38E3, 0x6258, 0x0B51,
- 0x625B, 0x1353, 0x625E, 0x1351, 0x6260, 0x1354, 0x6263, 0x1352,
- 0x6268, 0x1355, 0x626E, 0x0E01, 0x6271, 0x047B, 0x6276, 0x0DD0,
- 0x6279, 0x0D77, 0x627C, 0x1356, 0x627E, 0x1359, 0x627F, 0x099D,
- 0x6280, 0x0655, 0x6282, 0x1357, 0x6283, 0x135E, 0x6284, 0x099E,
- 0x6285, 0x35C5, 0x6289, 0x1358, 0x628A, 0x0CFA, 0x6291, 0x0F48,
- 0x6292, 0x135A, 0x6293, 0x135B, 0x6294, 0x135F, 0x6295, 0x0C64,
- 0x6296, 0x135C, 0x6297, 0x07C5, 0x6298, 0x0A82, 0x629B, 0x136D,
- 0x629C, 0x0D48, 0x629E, 0x0B52, 0x62A6, 0x2112, 0x62AB, 0x0D78,
- 0x62AC, 0x13B2, 0x62B1, 0x0E4A, 0x62B5, 0x0C0D, 0x62B9, 0x0EA3,
- 0x62BB, 0x1362, 0x62BC, 0x0521, 0x62BD, 0x0BA8, 0x62C2, 0x136B,
- 0x62C4, 0x38E4, 0x62C5, 0x0B72, 0x62C6, 0x1365, 0x62C7, 0x136C,
- 0x62C8, 0x1367, 0x62C9, 0x136E, 0x62CA, 0x136A, 0x62CC, 0x1369,
- 0x62CD, 0x0D25, 0x62CF, 0x1363, 0x62D0, 0x057D, 0x62D1, 0x1361,
- 0x62D2, 0x068B, 0x62D3, 0x0B53, 0x62D4, 0x135D, 0x62D7, 0x1360,
- 0x62D8, 0x07C6, 0x62D9, 0x0A7F, 0x62DB, 0x099F, 0x62DC, 0x1368,
- 0x62DD, 0x0D08, 0x62E0, 0x068C, 0x62E1, 0x05A6, 0x62EC, 0x05C5,
- 0x62ED, 0x09E7, 0x62EE, 0x1370, 0x62EF, 0x1375, 0x62F1, 0x1371,
- 0x62F3, 0x0753, 0x62F5, 0x1376, 0x62F6, 0x0870, 0x62F7, 0x07FB,
- 0x62FC, 0x38E5, 0x62FE, 0x0930, 0x62FF, 0x1364, 0x6301, 0x08CB,
- 0x6302, 0x1373, 0x6307, 0x08A6, 0x6308, 0x1374, 0x6309, 0x0488,
- 0x630A, 0x38E6, 0x630C, 0x136F, 0x630D, 0x38E7, 0x6311, 0x0BC5,
- 0x6318, 0x38E8, 0x6319, 0x068D, 0x631B, 0x3737, 0x631F, 0x06AC,
- 0x6327, 0x1372, 0x6328, 0x046B, 0x632B, 0x0833, 0x632F, 0x09FC,
- 0x6339, 0x38E9, 0x633A, 0x0C0E, 0x633D, 0x0D68, 0x633E, 0x1378,
- 0x633F, 0x0AE0, 0x6342, 0x38EA, 0x6343, 0x38EB, 0x6349, 0x0B0A,
- 0x634C, 0x0879, 0x634D, 0x1379, 0x634F, 0x137B, 0x6350, 0x1377,
- 0x6355, 0x0E31, 0x6357, 0x0BD9, 0x635C, 0x0ADE, 0x6365, 0x38EC,
- 0x6367, 0x0E4B, 0x6368, 0x08FA, 0x6369, 0x1387, 0x636B, 0x1386,
- 0x636E, 0x0A3E, 0x6372, 0x0754, 0x6374, 0x38ED, 0x6376, 0x1380,
- 0x6377, 0x09A1, 0x637A, 0x0CC0, 0x637B, 0x0CE7, 0x637D, 0x38EE,
- 0x6380, 0x137E, 0x6383, 0x0ADF, 0x6384, 0x38EF, 0x6387, 0x38F0,
- 0x6388, 0x0924, 0x6389, 0x1383, 0x638C, 0x09A0, 0x638E, 0x137D,
- 0x638F, 0x1382, 0x6390, 0x38F1, 0x6392, 0x0D09, 0x6396, 0x137C,
- 0x6398, 0x06F7, 0x639B, 0x05BB, 0x639E, 0x38F2, 0x639F, 0x1384,
- 0x63A0, 0x0F73, 0x63A1, 0x083E, 0x63A2, 0x0B73, 0x63A3, 0x1381,
- 0x63A5, 0x0A80, 0x63A7, 0x07C7, 0x63A8, 0x0A2A, 0x63A9, 0x0508,
- 0x63AA, 0x0ABE, 0x63AB, 0x137F, 0x63AC, 0x065F, 0x63B2, 0x071D,
- 0x63B4, 0x0BEB, 0x63B5, 0x1385, 0x63BB, 0x0AE1, 0x63BE, 0x1388,
- 0x63C0, 0x138A, 0x63C3, 0x0B17, 0x63C4, 0x1390, 0x63C6, 0x138B,
- 0x63C9, 0x138D, 0x63CF, 0x0DB3, 0x63D0, 0x0C0F, 0x63D1, 0x38F3,
- 0x63D2, 0x138E, 0x63D6, 0x0F16, 0x63DA, 0x0F32, 0x63DB, 0x05F5,
- 0x63DC, 0x38F4, 0x63E1, 0x0472, 0x63E3, 0x138C, 0x63E9, 0x1389,
- 0x63ED, 0x341C, 0x63EE, 0x0634, 0x63F4, 0x0509, 0x63F5, 0x2113,
- 0x63F6, 0x138F, 0x63F7, 0x3644, 0x63FA, 0x0F33, 0x6406, 0x1393,
- 0x6409, 0x38F5, 0x640D, 0x0B1B, 0x640F, 0x139A, 0x6410, 0x38F6,
- 0x6413, 0x1394, 0x6414, 0x1E2C, 0x6416, 0x1391, 0x6417, 0x1398,
- 0x641C, 0x137A, 0x6422, 0x38F7, 0x6426, 0x1395, 0x6428, 0x1399,
- 0x642C, 0x0D56, 0x642D, 0x0C65, 0x6434, 0x1392, 0x6436, 0x1396,
- 0x643A, 0x071E, 0x643E, 0x0861, 0x6442, 0x0A81, 0x644E, 0x139E,
- 0x6451, 0x1E43, 0x6454, 0x38F8, 0x6458, 0x0C20, 0x645B, 0x38F9,
- 0x6460, 0x2114, 0x6467, 0x139B, 0x6469, 0x0E8E, 0x646D, 0x38FA,
- 0x646F, 0x139C, 0x6476, 0x139D, 0x6478, 0x0EDA, 0x647A, 0x0A46,
- 0x647B, 0x38FB, 0x6483, 0x0738, 0x6488, 0x13A4, 0x6492, 0x0883,
- 0x6493, 0x13A1, 0x6495, 0x13A0, 0x649A, 0x0CE8, 0x649D, 0x2115,
- 0x649E, 0x0C8D, 0x64A4, 0x0C2B, 0x64A5, 0x13A2, 0x64A9, 0x13A3,
- 0x64AB, 0x0DE1, 0x64AD, 0x0CFB, 0x64AE, 0x0871, 0x64B0, 0x0A95,
- 0x64B2, 0x0E7E, 0x64B9, 0x05A7, 0x64BB, 0x13AA, 0x64BC, 0x13A5,
- 0x64BE, 0x38FC, 0x64BF, 0x38FD, 0x64C1, 0x0F34, 0x64C2, 0x13AC,
- 0x64C5, 0x13A8, 0x64C7, 0x13A9, 0x64CA, 0x341D, 0x64CD, 0x0AE2,
- 0x64CE, 0x2116, 0x64D2, 0x13A7, 0x64D4, 0x1366, 0x64D8, 0x13AB,
- 0x64DA, 0x13A6, 0x64E0, 0x13B0, 0x64E1, 0x13B1, 0x64E2, 0x0C21,
- 0x64E3, 0x13B3, 0x64E5, 0x38FE, 0x64E6, 0x0872, 0x64E7, 0x13AE,
- 0x64EC, 0x0656, 0x64EF, 0x13B4, 0x64F1, 0x13AD, 0x64F2, 0x13B8,
- 0x64F4, 0x13B7, 0x64F6, 0x13B6, 0x64F7, 0x38FF, 0x64FA, 0x13B9,
- 0x64FB, 0x3900, 0x64FD, 0x13BB, 0x64FE, 0x09D9, 0x6500, 0x13BA,
- 0x6504, 0x3901, 0x6505, 0x13BE, 0x6516, 0x3902, 0x6518, 0x13BC,
- 0x6519, 0x3903, 0x651C, 0x13BD, 0x651D, 0x1397, 0x6522, 0x1E97,
- 0x6523, 0x13C0, 0x6524, 0x13BF, 0x652A, 0x139F, 0x652B, 0x13C1,
- 0x652C, 0x13B5, 0x652F, 0x08A7, 0x6534, 0x13C2, 0x6535, 0x13C3,
- 0x6536, 0x13C5, 0x6537, 0x13C4, 0x6538, 0x13C6, 0x6539, 0x057E,
- 0x653B, 0x07C8, 0x653E, 0x0E4C, 0x653F, 0x0A53, 0x6545, 0x0782,
- 0x6547, 0x3904, 0x6548, 0x13C8, 0x654D, 0x13CB, 0x654E, 0x2117,
- 0x654F, 0x0DC4, 0x6551, 0x0679, 0x6555, 0x13CA, 0x6556, 0x13C9,
- 0x6557, 0x0D0A, 0x6558, 0x13CC, 0x6559, 0x06AD, 0x655D, 0x13CE,
- 0x655E, 0x13CD, 0x6562, 0x05F6, 0x6563, 0x0884, 0x6566, 0x0CB0,
- 0x6567, 0x3905, 0x656C, 0x071F, 0x6570, 0x0A3A, 0x6572, 0x13CF,
- 0x6574, 0x0A54, 0x6575, 0x0C22, 0x6577, 0x0DD1, 0x6578, 0x13D0,
- 0x6581, 0x3906, 0x6582, 0x13D1, 0x6583, 0x13D2, 0x6585, 0x3907,
- 0x6587, 0x0E08, 0x6588, 0x120C, 0x6589, 0x0A6A, 0x658C, 0x0DBE,
- 0x658E, 0x0848, 0x6590, 0x0D79, 0x6591, 0x0D57, 0x6597, 0x0C47,
- 0x6599, 0x0F89, 0x659B, 0x13D4, 0x659C, 0x08FC, 0x659F, 0x13D5,
- 0x65A1, 0x047A, 0x65A4, 0x06CC, 0x65A5, 0x0A71, 0x65A7, 0x0DD2,
- 0x65AB, 0x13D6, 0x65AC, 0x0890, 0x65AD, 0x0B85, 0x65AF, 0x08A9,
- 0x65B0, 0x09FD, 0x65B7, 0x13D7, 0x65B9, 0x0E4D, 0x65BC, 0x0519,
- 0x65BD, 0x08AA, 0x65C1, 0x13DA, 0x65C2, 0x3908, 0x65C3, 0x13D8,
- 0x65C4, 0x13DB, 0x65C5, 0x0F81, 0x65C6, 0x13D9, 0x65CB, 0x0A9F,
- 0x65CC, 0x13DC, 0x65CF, 0x0B12, 0x65D2, 0x13DD, 0x65D7, 0x0636,
- 0x65D9, 0x13DF, 0x65DB, 0x13DE, 0x65E0, 0x13E0, 0x65E1, 0x13E1,
- 0x65E2, 0x0637, 0x65E3, 0x3585, 0x65E5, 0x0CD4, 0x65E6, 0x0B74,
- 0x65E7, 0x0686, 0x65E8, 0x08AB, 0x65E9, 0x0AE3, 0x65EC, 0x0966,
- 0x65ED, 0x0474, 0x65F0, 0x3909, 0x65F1, 0x13E2, 0x65F2, 0x390A,
- 0x65FA, 0x0522, 0x65FB, 0x13E6, 0x6600, 0x2118, 0x6602, 0x07C9,
- 0x6603, 0x13E5, 0x6606, 0x081B, 0x6607, 0x09A2, 0x6609, 0x211A,
- 0x660A, 0x13E4, 0x660C, 0x09A3, 0x660E, 0x0ECC, 0x660F, 0x081A,
- 0x6613, 0x049B, 0x6614, 0x0A72, 0x6615, 0x2119, 0x661C, 0x13EB,
- 0x661E, 0x211C, 0x661F, 0x0A55, 0x6620, 0x04E9, 0x6624, 0x211D,
- 0x6625, 0x095F, 0x6627, 0x0E94, 0x6628, 0x0862, 0x662C, 0x390B,
- 0x662D, 0x09A4, 0x662E, 0x211B, 0x662F, 0x0A4B, 0x6631, 0x20AE,
- 0x6634, 0x13EA, 0x6635, 0x13E8, 0x6636, 0x13E9, 0x663B, 0x1E00,
- 0x663C, 0x0BA9, 0x663F, 0x1409, 0x6641, 0x13EF, 0x6642, 0x08CC,
- 0x6643, 0x07CA, 0x6644, 0x13ED, 0x6649, 0x13EE, 0x664B, 0x09FE,
- 0x664C, 0x390C, 0x664F, 0x13EC, 0x6652, 0x087D, 0x6657, 0x211F,
- 0x6659, 0x2120, 0x665B, 0x390D, 0x665C, 0x390E, 0x665D, 0x13F1,
- 0x665E, 0x13F0, 0x665F, 0x13F5, 0x6661, 0x390F, 0x6662, 0x13F6,
- 0x6663, 0x373A, 0x6664, 0x13F2, 0x6665, 0x211E, 0x6666, 0x0580,
- 0x6667, 0x13F3, 0x6668, 0x13F4, 0x6669, 0x0D69, 0x666B, 0x3910,
- 0x666E, 0x0DD3, 0x666F, 0x0720, 0x6670, 0x13F7, 0x6673, 0x2122,
- 0x6674, 0x0A56, 0x6676, 0x09A5, 0x6677, 0x3911, 0x667A, 0x0B90,
- 0x6681, 0x06BF, 0x6683, 0x13F8, 0x6684, 0x13FC, 0x6687, 0x054B,
- 0x6688, 0x13F9, 0x6689, 0x13FB, 0x668E, 0x13FA, 0x6691, 0x0975,
- 0x6696, 0x0B86, 0x6697, 0x0489, 0x6698, 0x13FD, 0x6699, 0x2123,
- 0x669D, 0x13FE, 0x66A0, 0x2124, 0x66A2, 0x0BC6, 0x66A4, 0x3912,
- 0x66A6, 0x0FB9, 0x66AB, 0x0891, 0x66AE, 0x0E3B, 0x66B2, 0x2125,
- 0x66B4, 0x0E6B, 0x66B8, 0x1405, 0x66B9, 0x1400, 0x66BC, 0x1403,
- 0x66BE, 0x1402, 0x66BF, 0x2126, 0x66C1, 0x13FF, 0x66C4, 0x1404,
- 0x66C6, 0x3455, 0x66C7, 0x0CB6, 0x66C8, 0x3913, 0x66C9, 0x1401,
- 0x66D6, 0x1406, 0x66D9, 0x0976, 0x66DA, 0x1407, 0x66DC, 0x0F35,
- 0x66DD, 0x0D2E, 0x66E0, 0x1408, 0x66E6, 0x140A, 0x66E9, 0x140B,
- 0x66EC, 0x3914, 0x66F0, 0x140C, 0x66F2, 0x06C2, 0x66F3, 0x04EA,
- 0x66F4, 0x07CB, 0x66F5, 0x140D, 0x66F7, 0x140E, 0x66F8, 0x097B,
- 0x66F9, 0x0AE4, 0x66FA, 0x2127, 0x66FB, 0x20B1, 0x66FC, 0x10ED,
- 0x66FD, 0x0AC0, 0x66FE, 0x0ABF, 0x66FF, 0x0B38, 0x6700, 0x0837,
- 0x6703, 0x104B, 0x6705, 0x3915, 0x6708, 0x0744, 0x6709, 0x0F17,
- 0x670B, 0x0E4E, 0x670D, 0x0DF0, 0x670E, 0x2128, 0x670F, 0x140F,
- 0x6713, 0x3916, 0x6714, 0x0863, 0x6715, 0x0BDB, 0x6716, 0x1410,
- 0x6717, 0x0FD5, 0x671B, 0x0E6C, 0x671D, 0x0BC7, 0x671E, 0x1411,
- 0x671F, 0x0638, 0x6726, 0x1412, 0x6727, 0x1413, 0x6728, 0x0EE6,
- 0x672A, 0x0EB0, 0x672B, 0x0EA4, 0x672C, 0x0E8A, 0x672D, 0x0873,
- 0x672E, 0x1415, 0x6731, 0x0917, 0x6733, 0x3917, 0x6734, 0x0E7F,
- 0x6736, 0x1417, 0x6737, 0x141A, 0x6738, 0x1419, 0x673A, 0x0635,
- 0x673D, 0x067A, 0x673F, 0x1416, 0x6741, 0x1418, 0x6743, 0x35B7,
- 0x6746, 0x141B, 0x6748, 0x3918, 0x6749, 0x0A3F, 0x674C, 0x3919,
- 0x674E, 0x0F65, 0x674F, 0x048D, 0x6750, 0x0850, 0x6751, 0x0B1C,
- 0x6753, 0x0909, 0x6756, 0x09DB, 0x6759, 0x141E, 0x675C, 0x0C48,
- 0x675E, 0x141C, 0x675F, 0x0B0B, 0x6760, 0x141D, 0x6761, 0x09DA,
- 0x6762, 0x0EE9, 0x6763, 0x141F, 0x6764, 0x1420, 0x6765, 0x0F52,
- 0x6766, 0x212A, 0x676A, 0x1425, 0x676D, 0x07CC, 0x676E, 0x3571,
- 0x676F, 0x0D0B, 0x6770, 0x1422, 0x6771, 0x0C66, 0x6772, 0x13E3,
- 0x6773, 0x13E7, 0x6775, 0x0669, 0x6776, 0x391A, 0x6777, 0x0CFD,
- 0x677B, 0x391B, 0x677C, 0x1424, 0x677E, 0x09A6, 0x677F, 0x0D58,
- 0x6785, 0x142A, 0x6787, 0x0D8E, 0x6789, 0x1421, 0x678B, 0x1427,
- 0x678C, 0x1426, 0x6790, 0x0A73, 0x6795, 0x0E9B, 0x6797, 0x0F9B,
- 0x679A, 0x0E95, 0x679C, 0x054C, 0x679D, 0x08AC, 0x67A0, 0x0FEE,
- 0x67A1, 0x1429, 0x67A2, 0x0A3B, 0x67A6, 0x1428, 0x67A9, 0x1423,
- 0x67AF, 0x0783, 0x67B0, 0x391C, 0x67B2, 0x391D, 0x67B3, 0x142F,
- 0x67B4, 0x142D, 0x67B6, 0x054D, 0x67B7, 0x142B, 0x67B8, 0x1431,
- 0x67B9, 0x1437, 0x67BB, 0x212B, 0x67C0, 0x212D, 0x67C1, 0x0B28,
- 0x67C4, 0x0E11, 0x67C6, 0x1439, 0x67CA, 0x0D94, 0x67CE, 0x1438,
- 0x67CF, 0x0D26, 0x67D0, 0x0E6D, 0x67D1, 0x05F7, 0x67D3, 0x0A9B,
- 0x67D4, 0x094A, 0x67D7, 0x391F, 0x67D8, 0x0BEF, 0x67D9, 0x3920,
- 0x67DA, 0x0F18, 0x67DD, 0x1434, 0x67DE, 0x1433, 0x67E2, 0x1435,
- 0x67E4, 0x1432, 0x67E7, 0x143A, 0x67E9, 0x1430, 0x67EC, 0x142E,
- 0x67EE, 0x1436, 0x67EF, 0x142C, 0x67F0, 0x3921, 0x67F1, 0x0BAA,
- 0x67F3, 0x0F04, 0x67F4, 0x08F2, 0x67F5, 0x0864, 0x67F9, 0x391E,
- 0x67FB, 0x082A, 0x67FE, 0x0E9D, 0x67FF, 0x059F, 0x6801, 0x212E,
- 0x6802, 0x0BEA, 0x6803, 0x0CA2, 0x6804, 0x04EB, 0x6805, 0x1E07,
- 0x6813, 0x0A96, 0x6816, 0x0A58, 0x6817, 0x0700, 0x681E, 0x143C,
- 0x6821, 0x07CD, 0x6822, 0x05DA, 0x6829, 0x143E, 0x682A, 0x05D2,
- 0x682B, 0x1444, 0x682C, 0x3922, 0x6830, 0x3923, 0x6831, 0x3924,
- 0x6832, 0x1441, 0x6834, 0x0A97, 0x6838, 0x05A9, 0x6839, 0x081C,
- 0x683C, 0x05A8, 0x683D, 0x083F, 0x6840, 0x143F, 0x6841, 0x073B,
- 0x6842, 0x0721, 0x6843, 0x0C67, 0x6844, 0x212F, 0x6846, 0x143D,
- 0x6848, 0x048A, 0x684D, 0x1440, 0x684E, 0x1442, 0x6850, 0x06C5,
- 0x6851, 0x0702, 0x6852, 0x212C, 0x6853, 0x05F8, 0x6854, 0x0665,
- 0x6859, 0x1445, 0x685B, 0x3925, 0x685C, 0x0869, 0x685D, 0x0E9F,
- 0x685F, 0x0885, 0x6863, 0x1446, 0x6867, 0x0DA2, 0x6872, 0x3926,
- 0x6874, 0x1452, 0x6875, 0x3927, 0x6876, 0x0533, 0x6877, 0x1447,
- 0x687A, 0x3928, 0x687E, 0x1458, 0x687F, 0x1448, 0x6881, 0x0F8A,
- 0x6883, 0x144F, 0x6884, 0x3929, 0x6885, 0x0D15, 0x688D, 0x1457,
- 0x688E, 0x1E9C, 0x688F, 0x144A, 0x6893, 0x0478, 0x6894, 0x144C,
- 0x6897, 0x07CE, 0x689B, 0x144E, 0x689D, 0x144D, 0x689F, 0x1449,
- 0x68A0, 0x1454, 0x68A2, 0x09A7, 0x68A5, 0x392A, 0x68A6, 0x11BE,
- 0x68A7, 0x079C, 0x68A8, 0x0F66, 0x68AD, 0x144B, 0x68AF, 0x0C10,
- 0x68B0, 0x0581, 0x68B1, 0x081D, 0x68B2, 0x392B, 0x68B3, 0x1443,
- 0x68B5, 0x1453, 0x68B6, 0x05BF, 0x68B9, 0x1451, 0x68BA, 0x1455,
- 0x68BC, 0x0C68, 0x68C4, 0x063A, 0x68C6, 0x1473, 0x68C8, 0x20AF,
- 0x68C9, 0x0ED5, 0x68CA, 0x145A, 0x68CB, 0x0639, 0x68CD, 0x1461,
- 0x68CF, 0x2130, 0x68D0, 0x392C, 0x68D2, 0x0E6E, 0x68D4, 0x1462,
- 0x68D5, 0x1464, 0x68D6, 0x392D, 0x68D7, 0x1468, 0x68D8, 0x145C,
- 0x68DA, 0x0B68, 0x68DF, 0x0C69, 0x68E0, 0x146C, 0x68E1, 0x145F,
- 0x68E3, 0x1469, 0x68E7, 0x1463, 0x68E8, 0x392E, 0x68ED, 0x392F,
- 0x68EE, 0x09FF, 0x68EF, 0x146D, 0x68F0, 0x3930, 0x68F1, 0x3931,
- 0x68F2, 0x0A57, 0x68F9, 0x146B, 0x68FA, 0x05F9, 0x68FC, 0x3932,
- 0x6900, 0x0FF6, 0x6901, 0x1459, 0x6904, 0x1467, 0x6905, 0x049C,
- 0x6908, 0x145B, 0x690B, 0x0EC6, 0x690C, 0x1460, 0x690D, 0x09E8,
- 0x690E, 0x0BE3, 0x690F, 0x1456, 0x6911, 0x3933, 0x6912, 0x1466,
- 0x6913, 0x3934, 0x6919, 0x0A40, 0x691A, 0x1470, 0x691B, 0x05CF,
- 0x691C, 0x0755, 0x6921, 0x1472, 0x6922, 0x145D, 0x6923, 0x1471,
- 0x6925, 0x146A, 0x6926, 0x145E, 0x6928, 0x146E, 0x692A, 0x146F,
- 0x6930, 0x1480, 0x6934, 0x0CA6, 0x6935, 0x3935, 0x6936, 0x1465,
- 0x6939, 0x147C, 0x693B, 0x3936, 0x693D, 0x147E, 0x693F, 0x0BF4,
- 0x694A, 0x0F36, 0x6953, 0x0DE8, 0x6954, 0x1479, 0x6955, 0x0B2A,
- 0x6957, 0x3937, 0x6959, 0x147F, 0x695A, 0x0AC1, 0x695C, 0x1476,
- 0x695D, 0x1483, 0x695E, 0x1482, 0x6960, 0x0CC7, 0x6961, 0x1481,
- 0x6962, 0x0CC2, 0x6963, 0x3938, 0x6968, 0x2132, 0x696A, 0x1485,
- 0x696B, 0x1478, 0x696D, 0x06C0, 0x696E, 0x147B, 0x696F, 0x0967,
- 0x6972, 0x3939, 0x6973, 0x0D16, 0x6974, 0x147D, 0x6975, 0x06C3,
- 0x6977, 0x1475, 0x6978, 0x1477, 0x6979, 0x1474, 0x697C, 0x0FD6,
- 0x697D, 0x05B8, 0x697E, 0x147A, 0x697F, 0x393A, 0x6980, 0x393B,
- 0x6981, 0x1484, 0x6982, 0x0593, 0x698A, 0x0857, 0x698E, 0x04FF,
- 0x6991, 0x1495, 0x6994, 0x0FD7, 0x6995, 0x1498, 0x6998, 0x2134,
- 0x699B, 0x0A00, 0x699C, 0x1497, 0x69A0, 0x1496, 0x69A6, 0x393C,
- 0x69A7, 0x1493, 0x69AD, 0x393D, 0x69AE, 0x1487, 0x69B1, 0x14A4,
- 0x69B2, 0x1486, 0x69B4, 0x1499, 0x69B7, 0x393E, 0x69BB, 0x1491,
- 0x69BE, 0x148C, 0x69BF, 0x1489, 0x69C1, 0x148A, 0x69C3, 0x1492,
- 0x69C7, 0x1D33, 0x69CA, 0x148F, 0x69CB, 0x07CF, 0x69CC, 0x0BE4,
- 0x69CD, 0x0AE6, 0x69CE, 0x148D, 0x69D0, 0x1488, 0x69D3, 0x148B,
- 0x69D6, 0x393F, 0x69D7, 0x3940, 0x69D8, 0x0F37, 0x69D9, 0x0E98,
- 0x69DD, 0x1490, 0x69DE, 0x149A, 0x69E2, 0x2135, 0x69E7, 0x14A2,
- 0x69E8, 0x149B, 0x69EA, 0x356F, 0x69EB, 0x14A8, 0x69ED, 0x14A6,
- 0x69F2, 0x14A1, 0x69F6, 0x373F, 0x69F9, 0x14A0, 0x69FB, 0x0BEC,
- 0x69FD, 0x0AE7, 0x69FF, 0x149E, 0x6A01, 0x3941, 0x6A02, 0x149C,
- 0x6A05, 0x14A3, 0x6A0A, 0x14A9, 0x6A0B, 0x0D89, 0x6A0C, 0x14AF,
- 0x6A0F, 0x3942, 0x6A12, 0x14AA, 0x6A13, 0x14AD, 0x6A14, 0x14A7,
- 0x6A15, 0x3943, 0x6A17, 0x0BB2, 0x6A19, 0x0DAA, 0x6A1B, 0x149D,
- 0x6A1E, 0x14A5, 0x6A1F, 0x09A8, 0x6A21, 0x0EDB, 0x6A22, 0x14B9,
- 0x6A23, 0x14AC, 0x6A28, 0x3944, 0x6A29, 0x0756, 0x6A2A, 0x0523,
- 0x6A2B, 0x05BD, 0x6A2E, 0x1494, 0x6A30, 0x2136, 0x6A34, 0x3945,
- 0x6A35, 0x09A9, 0x6A36, 0x14B1, 0x6A38, 0x14B8, 0x6A39, 0x0925,
- 0x6A3A, 0x05D0, 0x6A3D, 0x0B6C, 0x6A3E, 0x3946, 0x6A44, 0x14AE,
- 0x6A45, 0x3947, 0x6A46, 0x2138, 0x6A47, 0x14B3, 0x6A48, 0x14B7,
- 0x6A4B, 0x06AE, 0x6A50, 0x3948, 0x6A51, 0x3949, 0x6A54, 0x3C34,
- 0x6A56, 0x394A, 0x6A58, 0x0666, 0x6A59, 0x14B5, 0x6A5B, 0x394B,
- 0x6A5F, 0x063B, 0x6A61, 0x0CA3, 0x6A62, 0x14B4, 0x6A66, 0x14B6,
- 0x6A6B, 0x2137, 0x6A72, 0x14B0, 0x6A73, 0x2139, 0x6A78, 0x14B2,
- 0x6A7E, 0x213A, 0x6A7F, 0x05BE, 0x6A80, 0x0B87, 0x6A83, 0x394C,
- 0x6A84, 0x14BD, 0x6A89, 0x394D, 0x6A8D, 0x14BB, 0x6A8E, 0x079D,
- 0x6A90, 0x14BA, 0x6A91, 0x394E, 0x6A97, 0x14C0, 0x6A9C, 0x143B,
- 0x6A9D, 0x394F, 0x6A9E, 0x3950, 0x6A9F, 0x3951, 0x6AA0, 0x14BC,
- 0x6AA2, 0x14BE, 0x6AA3, 0x14BF, 0x6AAA, 0x14CB, 0x6AAC, 0x14C7,
- 0x6AAE, 0x1450, 0x6AB3, 0x14C6, 0x6AB8, 0x14C5, 0x6ABB, 0x14C2,
- 0x6AC1, 0x14AB, 0x6AC2, 0x14C4, 0x6AC3, 0x14C3, 0x6AD1, 0x14C9,
- 0x6AD3, 0x0FCC, 0x6ADA, 0x14CC, 0x6ADB, 0x06F3, 0x6ADC, 0x3952,
- 0x6ADE, 0x14C8, 0x6ADF, 0x14CA, 0x6AE2, 0x213B, 0x6AE4, 0x213C,
- 0x6AE7, 0x3953, 0x6AE8, 0x0D3B, 0x6AEA, 0x14CD, 0x6AEC, 0x3954,
- 0x6AFA, 0x14D1, 0x6AFB, 0x14CE, 0x6B04, 0x0F5D, 0x6B05, 0x14CF,
- 0x6B0A, 0x149F, 0x6B12, 0x14D2, 0x6B16, 0x14D3, 0x6B1D, 0x04D7,
- 0x6B1E, 0x3955, 0x6B1F, 0x14D5, 0x6B20, 0x073D, 0x6B21, 0x08CD,
- 0x6B23, 0x06CD, 0x6B24, 0x3956, 0x6B27, 0x0524, 0x6B32, 0x0F49,
- 0x6B35, 0x3957, 0x6B37, 0x14D7, 0x6B38, 0x14D6, 0x6B39, 0x14D9,
- 0x6B3A, 0x0657, 0x6B3D, 0x06CE, 0x6B3E, 0x05FA, 0x6B43, 0x14DC,
- 0x6B46, 0x3958, 0x6B47, 0x14DB, 0x6B49, 0x14DD, 0x6B4C, 0x054E,
- 0x6B4E, 0x0B75, 0x6B50, 0x14DE, 0x6B53, 0x05FB, 0x6B54, 0x14E0,
- 0x6B56, 0x3959, 0x6B59, 0x14DF, 0x6B5B, 0x14E1, 0x6B5F, 0x14E2,
- 0x6B60, 0x395A, 0x6B61, 0x14E3, 0x6B62, 0x08AD, 0x6B63, 0x0A59,
- 0x6B64, 0x0811, 0x6B65, 0x344A, 0x6B66, 0x0DE2, 0x6B69, 0x0E32,
- 0x6B6A, 0x0FEA, 0x6B6F, 0x08C3, 0x6B72, 0x35D9, 0x6B73, 0x0840,
- 0x6B74, 0x0FBA, 0x6B77, 0x3456, 0x6B78, 0x14E4, 0x6B79, 0x14E5,
- 0x6B7B, 0x08AE, 0x6B7F, 0x14E6, 0x6B80, 0x14E7, 0x6B82, 0x395B,
- 0x6B83, 0x14E9, 0x6B84, 0x14E8, 0x6B86, 0x0E86, 0x6B89, 0x0968,
- 0x6B8A, 0x0918, 0x6B8B, 0x0892, 0x6B8D, 0x14EA, 0x6B95, 0x14EC,
- 0x6B96, 0x09E9, 0x6B98, 0x14EB, 0x6B9E, 0x14ED, 0x6BA4, 0x14EE,
- 0x6BAA, 0x14EF, 0x6BAB, 0x14F0, 0x6BAF, 0x14F1, 0x6BB1, 0x14F3,
- 0x6BB2, 0x14F2, 0x6BB3, 0x14F4, 0x6BB4, 0x0525, 0x6BB5, 0x0B88,
- 0x6BB7, 0x14F5, 0x6BBA, 0x0874, 0x6BBB, 0x05AA, 0x6BBC, 0x14F6,
- 0x6BBE, 0x395C, 0x6BBF, 0x0C3C, 0x6BC0, 0x119D, 0x6BC5, 0x063D,
- 0x6BC6, 0x14F7, 0x6BCB, 0x14F8, 0x6BCC, 0x3744, 0x6BCD, 0x0E3C,
- 0x6BCE, 0x0E96, 0x6BCF, 0x344C, 0x6BD2, 0x0C9F, 0x6BD3, 0x14F9,
- 0x6BD4, 0x0D7A, 0x6BD6, 0x213D, 0x6BD8, 0x0D8F, 0x6BDB, 0x0EDF,
- 0x6BDF, 0x14FA, 0x6BE1, 0x395D, 0x6BEB, 0x14FC, 0x6BEC, 0x14FB,
- 0x6BEF, 0x14FE, 0x6BF1, 0x395E, 0x6BF3, 0x14FD, 0x6C08, 0x1500,
- 0x6C0F, 0x08AF, 0x6C10, 0x395F, 0x6C11, 0x0EBD, 0x6C13, 0x1501,
- 0x6C14, 0x1502, 0x6C17, 0x063E, 0x6C1B, 0x1503, 0x6C23, 0x1505,
- 0x6C24, 0x1504, 0x6C33, 0x3960, 0x6C34, 0x0A2B, 0x6C35, 0x3961,
- 0x6C37, 0x0DAB, 0x6C38, 0x04EC, 0x6C3A, 0x3962, 0x6C3E, 0x0D59,
- 0x6C3F, 0x213E, 0x6C40, 0x0C11, 0x6C41, 0x094B, 0x6C42, 0x067B,
- 0x6C4E, 0x0D5A, 0x6C50, 0x08DA, 0x6C55, 0x1507, 0x6C57, 0x05FC,
- 0x6C59, 0x3963, 0x6C5A, 0x051A, 0x6C5C, 0x213F, 0x6C5D, 0x0CCA,
- 0x6C5E, 0x1506, 0x6C5F, 0x07D0, 0x6C60, 0x0B91, 0x6C62, 0x1508,
- 0x6C68, 0x1510, 0x6C6A, 0x1509, 0x6C6F, 0x2141, 0x6C70, 0x0B21,
- 0x6C72, 0x067C, 0x6C73, 0x1511, 0x6C76, 0x3964, 0x6C7A, 0x073E,
- 0x6C7B, 0x3965, 0x6C7D, 0x063F, 0x6C7E, 0x150F, 0x6C81, 0x150D,
- 0x6C82, 0x150A, 0x6C83, 0x0F4A, 0x6C85, 0x3966, 0x6C86, 0x2140,
- 0x6C88, 0x0BDC, 0x6C8C, 0x0CB1, 0x6C8D, 0x150B, 0x6C90, 0x1513,
- 0x6C92, 0x1512, 0x6C93, 0x06F9, 0x6C95, 0x3967, 0x6C96, 0x052D,
- 0x6C99, 0x082B, 0x6C9A, 0x150C, 0x6C9B, 0x150E, 0x6C9C, 0x3968,
- 0x6CA1, 0x0E85, 0x6CA2, 0x0B54, 0x6CAA, 0x3749, 0x6CAB, 0x0EA5,
- 0x6CAE, 0x151B, 0x6CB1, 0x151C, 0x6CB3, 0x054F, 0x6CB8, 0x0DF8,
- 0x6CB9, 0x0F09, 0x6CBA, 0x151E, 0x6CBB, 0x08CF, 0x6CBC, 0x09AA,
- 0x6CBD, 0x1517, 0x6CBE, 0x151D, 0x6CBF, 0x050A, 0x6CC1, 0x06AF,
- 0x6CC4, 0x1514, 0x6CC5, 0x1519, 0x6CC9, 0x0A98, 0x6CCA, 0x0D27,
- 0x6CCC, 0x0D7B, 0x6CD0, 0x3969, 0x6CD3, 0x1516, 0x6CD4, 0x396A,
- 0x6CD5, 0x0E4F, 0x6CD6, 0x396B, 0x6CD7, 0x1518, 0x6CD9, 0x1521,
- 0x6CDA, 0x2142, 0x6CDB, 0x151F, 0x6CDD, 0x151A, 0x6CE0, 0x396C,
- 0x6CE1, 0x0E50, 0x6CE2, 0x0CFE, 0x6CE3, 0x067D, 0x6CE5, 0x0C1F,
- 0x6CE8, 0x0BAB, 0x6CEA, 0x1522, 0x6CEB, 0x396D, 0x6CEC, 0x396E,
- 0x6CEE, 0x396F, 0x6CEF, 0x1520, 0x6CF0, 0x0B39, 0x6CF1, 0x1515,
- 0x6CF3, 0x04ED, 0x6D01, 0x3C35, 0x6D04, 0x2143, 0x6D0A, 0x3970,
- 0x6D0B, 0x0F38, 0x6D0C, 0x152D, 0x6D0E, 0x3971, 0x6D11, 0x3972,
- 0x6D12, 0x152C, 0x6D17, 0x0A9A, 0x6D19, 0x1529, 0x6D1B, 0x0F56,
- 0x6D1E, 0x0C8E, 0x6D1F, 0x1523, 0x6D25, 0x0BE1, 0x6D29, 0x04EE,
- 0x6D2A, 0x07D1, 0x6D2B, 0x1526, 0x6D2E, 0x3973, 0x6D32, 0x0931,
- 0x6D33, 0x152B, 0x6D35, 0x152A, 0x6D36, 0x1525, 0x6D38, 0x1528,
- 0x6D3B, 0x05C6, 0x6D3D, 0x1527, 0x6D3E, 0x0CFF, 0x6D41, 0x0F76,
- 0x6D44, 0x09DC, 0x6D45, 0x0A99, 0x6D57, 0x3974, 0x6D59, 0x1533,
- 0x6D5A, 0x1531, 0x6D5C, 0x0DBF, 0x6D5E, 0x3975, 0x6D63, 0x152E,
- 0x6D64, 0x1530, 0x6D65, 0x3976, 0x6D66, 0x04DC, 0x6D69, 0x07D2,
- 0x6D6A, 0x0FD8, 0x6D6C, 0x059B, 0x6D6E, 0x0DD4, 0x6D6F, 0x2145,
- 0x6D74, 0x0F4B, 0x6D77, 0x0582, 0x6D78, 0x0A01, 0x6D79, 0x1532,
- 0x6D82, 0x3977, 0x6D85, 0x1537, 0x6D87, 0x2144, 0x6D88, 0x09AB,
- 0x6D89, 0x342A, 0x6D8C, 0x0F1A, 0x6D8E, 0x1534, 0x6D93, 0x152F,
- 0x6D95, 0x1535, 0x6D96, 0x2146, 0x6D99, 0x0FA6, 0x6D9B, 0x0C6D,
- 0x6D9C, 0x0C9A, 0x6DAC, 0x2147, 0x6DAF, 0x0594, 0x6DB2, 0x04F7,
- 0x6DB5, 0x153B, 0x6DB8, 0x153E, 0x6DBC, 0x0F8B, 0x6DBF, 0x3978,
- 0x6DC0, 0x0F4E, 0x6DC4, 0x3979, 0x6DC5, 0x1545, 0x6DC6, 0x153F,
- 0x6DC7, 0x153C, 0x6DCA, 0x397A, 0x6DCB, 0x0F9C, 0x6DCC, 0x1542,
- 0x6DCF, 0x2148, 0x6DD0, 0x3C36, 0x6DD1, 0x0954, 0x6DD2, 0x1544,
- 0x6DD5, 0x1549, 0x6DD6, 0x397B, 0x6DD8, 0x0C6B, 0x6DD9, 0x1547,
- 0x6DDA, 0x3453, 0x6DDE, 0x1541, 0x6DE1, 0x0B76, 0x6DE4, 0x1548,
- 0x6DE6, 0x153D, 0x6DE8, 0x1543, 0x6DE9, 0x397C, 0x6DEA, 0x154A,
- 0x6DEB, 0x04C0, 0x6DEC, 0x1540, 0x6DEE, 0x154B, 0x6DF1, 0x0A02,
- 0x6DF2, 0x214A, 0x6DF3, 0x0969, 0x6DF5, 0x0DF5, 0x6DF7, 0x081E,
- 0x6DF8, 0x2149, 0x6DF9, 0x1538, 0x6DFA, 0x1546, 0x6DFB, 0x0C34,
- 0x6DFC, 0x214B, 0x6E05, 0x0A5A, 0x6E07, 0x05C7, 0x6E08, 0x0841,
- 0x6E09, 0x09AC, 0x6E0A, 0x153A, 0x6E0B, 0x094C, 0x6E13, 0x0722,
- 0x6E15, 0x1539, 0x6E17, 0x3746, 0x6E19, 0x154F, 0x6E1A, 0x0977,
- 0x6E1B, 0x076E, 0x6E1D, 0x155E, 0x6E1F, 0x1558, 0x6E20, 0x068E,
- 0x6E21, 0x0C49, 0x6E22, 0x397D, 0x6E23, 0x1553, 0x6E24, 0x155C,
- 0x6E25, 0x0473, 0x6E26, 0x04D4, 0x6E27, 0x214E, 0x6E29, 0x0539,
- 0x6E2B, 0x1555, 0x6E2C, 0x0B0C, 0x6E2D, 0x154C, 0x6E2E, 0x154E,
- 0x6E2F, 0x07D3, 0x6E34, 0x3412, 0x6E38, 0x155F, 0x6E39, 0x214C,
- 0x6E3A, 0x155A, 0x6E3C, 0x214F, 0x6E3E, 0x1552, 0x6E42, 0x3C37,
- 0x6E43, 0x1559, 0x6E4A, 0x0EB7, 0x6E4D, 0x1557, 0x6E4E, 0x155B,
- 0x6E51, 0x397E, 0x6E56, 0x0784, 0x6E58, 0x09AD, 0x6E5B, 0x0B77,
- 0x6E5C, 0x214D, 0x6E5F, 0x1551, 0x6E67, 0x0F19, 0x6E6B, 0x1554,
- 0x6E6E, 0x154D, 0x6E6F, 0x0C6C, 0x6E72, 0x1550, 0x6E76, 0x1556,
- 0x6E7E, 0x0FF7, 0x6E7F, 0x08EA, 0x6E80, 0x0EAC, 0x6E82, 0x1560,
- 0x6E8C, 0x0D42, 0x6E8F, 0x156C, 0x6E90, 0x076F, 0x6E96, 0x096A,
- 0x6E98, 0x1562, 0x6E9C, 0x0F77, 0x6E9D, 0x07D4, 0x6E9F, 0x156F,
- 0x6EA2, 0x04B2, 0x6EA5, 0x156D, 0x6EAA, 0x1561, 0x6EAB, 0x340C,
- 0x6EAF, 0x1567, 0x6EB2, 0x1569, 0x6EB6, 0x0F39, 0x6EB7, 0x1564,
- 0x6EBA, 0x0C28, 0x6EBD, 0x1566, 0x6EBF, 0x2150, 0x6EC2, 0x156E,
- 0x6EC4, 0x1568, 0x6EC5, 0x0ED3, 0x6EC7, 0x397F, 0x6EC9, 0x1563,
- 0x6ECA, 0x3980, 0x6ECB, 0x08CE, 0x6ECC, 0x157B, 0x6ECE, 0x3981,
- 0x6ED1, 0x05C8, 0x6ED3, 0x1565, 0x6ED4, 0x156A, 0x6ED5, 0x156B,
- 0x6ED9, 0x3C38, 0x6EDD, 0x0B4C, 0x6EDE, 0x0B3A, 0x6EE6, 0x3C24,
- 0x6EEC, 0x1573, 0x6EEF, 0x1579, 0x6EF2, 0x1577, 0x6EF4, 0x0C23,
- 0x6EF7, 0x157E, 0x6EF8, 0x1574, 0x6EFD, 0x3982, 0x6EFE, 0x1575,
- 0x6EFF, 0x155D, 0x6F01, 0x0693, 0x6F02, 0x0DAC, 0x6F06, 0x08EB,
- 0x6F09, 0x0809, 0x6F0F, 0x0FD9, 0x6F11, 0x1571, 0x6F13, 0x157D,
- 0x6F14, 0x050B, 0x6F15, 0x0AE8, 0x6F1A, 0x3983, 0x6F20, 0x0D2F,
- 0x6F22, 0x05FD, 0x6F23, 0x0FC2, 0x6F2A, 0x3984, 0x6F2B, 0x0EAD,
- 0x6F2C, 0x0BEE, 0x6F2F, 0x3985, 0x6F31, 0x1578, 0x6F32, 0x157A,
- 0x6F33, 0x3986, 0x6F38, 0x0AB4, 0x6F3E, 0x157C, 0x6F3F, 0x1576,
- 0x6F41, 0x1570, 0x6F45, 0x05FF, 0x6F51, 0x1E60, 0x6F54, 0x073F,
- 0x6F58, 0x158A, 0x6F5A, 0x3987, 0x6F5B, 0x1585, 0x6F5C, 0x0A9C,
- 0x6F5E, 0x3988, 0x6F5F, 0x05C1, 0x6F62, 0x3989, 0x6F64, 0x096B,
- 0x6F66, 0x158E, 0x6F6D, 0x1587, 0x6F6E, 0x0BC8, 0x6F6F, 0x1584,
- 0x6F70, 0x0BF5, 0x6F74, 0x15A7, 0x6F78, 0x1581, 0x6F7A, 0x1580,
- 0x6F7C, 0x1589, 0x6F7D, 0x398A, 0x6F80, 0x1583, 0x6F81, 0x1582,
- 0x6F82, 0x1588, 0x6F84, 0x0A45, 0x6F86, 0x157F, 0x6F88, 0x2151,
- 0x6F8B, 0x398B, 0x6F8D, 0x398C, 0x6F8E, 0x158B, 0x6F91, 0x158C,
- 0x6F92, 0x398D, 0x6F94, 0x398E, 0x6F97, 0x05FE, 0x6F98, 0x363C,
- 0x6F9A, 0x398F, 0x6FA1, 0x1591, 0x6FA3, 0x1590, 0x6FA4, 0x1592,
- 0x6FA7, 0x3990, 0x6FA8, 0x3991, 0x6FAA, 0x1595, 0x6FB1, 0x0C3D,
- 0x6FB3, 0x158F, 0x6FB5, 0x2152, 0x6FB6, 0x3992, 0x6FB9, 0x1593,
- 0x6FC0, 0x0739, 0x6FC1, 0x0B59, 0x6FC2, 0x158D, 0x6FC3, 0x0CF1,
- 0x6FC6, 0x1594, 0x6FD4, 0x1599, 0x6FD5, 0x1597, 0x6FD8, 0x159A,
- 0x6FDA, 0x3993, 0x6FDB, 0x159D, 0x6FDE, 0x3994, 0x6FDF, 0x1596,
- 0x6FE0, 0x07FC, 0x6FE1, 0x0CDE, 0x6FE4, 0x1536, 0x6FEB, 0x0F5E,
- 0x6FEC, 0x1598, 0x6FEE, 0x159C, 0x6FEF, 0x0B55, 0x6FF1, 0x159B,
- 0x6FF3, 0x1586, 0x6FF5, 0x2153, 0x6FF6, 0x1BA4, 0x6FF9, 0x3995,
- 0x6FFA, 0x15A0, 0x6FFE, 0x15A4, 0x7001, 0x15A2, 0x7005, 0x2154,
- 0x7006, 0x1E50, 0x7007, 0x2155, 0x7009, 0x159E, 0x700B, 0x159F,
- 0x700F, 0x15A3, 0x7011, 0x15A1, 0x7015, 0x0DC0, 0x7018, 0x15A9,
- 0x701A, 0x15A6, 0x701B, 0x15A5, 0x701D, 0x15A8, 0x701E, 0x0CAC,
- 0x701F, 0x15AA, 0x7026, 0x0BB3, 0x7027, 0x0B4D, 0x7028, 0x2156,
- 0x702C, 0x0A49, 0x7030, 0x15AB, 0x7032, 0x15AD, 0x7039, 0x3996,
- 0x703C, 0x3997, 0x703E, 0x15AC, 0x704A, 0x3998, 0x704C, 0x1572,
- 0x7051, 0x15AE, 0x7054, 0x3999, 0x7058, 0x0CBF, 0x705D, 0x399A,
- 0x705E, 0x399B, 0x7063, 0x15AF, 0x7064, 0x399C, 0x706B, 0x0550,
- 0x706C, 0x399D, 0x706F, 0x0C6E, 0x7070, 0x0583, 0x7078, 0x067E,
- 0x707C, 0x090A, 0x707D, 0x0842, 0x707E, 0x399E, 0x7081, 0x399F,
- 0x7085, 0x2157, 0x7089, 0x0FCD, 0x708A, 0x0A2C, 0x708E, 0x050C,
- 0x7092, 0x15B1, 0x7095, 0x39A0, 0x7099, 0x15B0, 0x70AB, 0x2158,
- 0x70AC, 0x15B4, 0x70AD, 0x0B78, 0x70AE, 0x15B7, 0x70AF, 0x15B2,
- 0x70B3, 0x15B6, 0x70B7, 0x39A1, 0x70B8, 0x15B5, 0x70B9, 0x0C3A,
- 0x70BA, 0x049D, 0x70BB, 0x20AD, 0x70C8, 0x0FBD, 0x70CB, 0x15B9,
- 0x70CF, 0x04CA, 0x70D3, 0x39A2, 0x70D4, 0x39A3, 0x70D8, 0x39A4,
- 0x70D9, 0x15BB, 0x70DC, 0x39A5, 0x70DD, 0x15BA, 0x70DF, 0x15B8,
- 0x70F1, 0x15B3, 0x70F9, 0x0E51, 0x70FD, 0x15BD, 0x7104, 0x215A,
- 0x7107, 0x39A6, 0x7109, 0x15BC, 0x710F, 0x2159, 0x7114, 0x050D,
- 0x7119, 0x15BF, 0x711A, 0x0E02, 0x711C, 0x15BE, 0x7120, 0x39A7,
- 0x7121, 0x0EC1, 0x7126, 0x09AF, 0x7130, 0x1DDC, 0x7131, 0x39A8,
- 0x7136, 0x0AB5, 0x713C, 0x09AE, 0x7146, 0x215C, 0x7147, 0x215D,
- 0x7149, 0x0FC3, 0x714A, 0x39A9, 0x714C, 0x15C5, 0x714E, 0x0A9D,
- 0x7152, 0x39AA, 0x7155, 0x15C1, 0x7156, 0x15C6, 0x7159, 0x050E,
- 0x715C, 0x215B, 0x7160, 0x39AB, 0x7162, 0x15C4, 0x7164, 0x0D17,
- 0x7165, 0x15C0, 0x7166, 0x15C3, 0x7167, 0x09B0, 0x7169, 0x0D65,
- 0x716C, 0x15C7, 0x716E, 0x08FD, 0x7179, 0x39AC, 0x717D, 0x0A9E,
- 0x7184, 0x15CA, 0x7188, 0x15C2, 0x718A, 0x06FD, 0x718F, 0x15C8,
- 0x7192, 0x39AD, 0x7194, 0x0F3A, 0x7195, 0x15CB, 0x7199, 0x205D,
- 0x719F, 0x0959, 0x71A8, 0x15CC, 0x71AC, 0x15CD, 0x71B1, 0x0CE4,
- 0x71B3, 0x39AE, 0x71B9, 0x15CF, 0x71BE, 0x15D0, 0x71C1, 0x215F,
- 0x71C3, 0x0CE9, 0x71C8, 0x0C6F, 0x71C9, 0x15D2, 0x71CB, 0x39AF,
- 0x71CE, 0x15D4, 0x71D0, 0x0F9D, 0x71D2, 0x15D1, 0x71D3, 0x39B0,
- 0x71D4, 0x15D3, 0x71D5, 0x050F, 0x71D6, 0x39B1, 0x71D7, 0x15CE,
- 0x71DF, 0x114E, 0x71E0, 0x15D5, 0x71E5, 0x0AE9, 0x71E6, 0x0886,
- 0x71E7, 0x15D7, 0x71EC, 0x15D6, 0x71ED, 0x09EA, 0x71EE, 0x10EE,
- 0x71F5, 0x15D8, 0x71F9, 0x15DA, 0x71FB, 0x15C9, 0x71FC, 0x15D9,
- 0x71FE, 0x2160, 0x71FF, 0x15DB, 0x7200, 0x39B2, 0x7206, 0x0D30,
- 0x720D, 0x15DC, 0x7210, 0x15DD, 0x721B, 0x15DE, 0x721D, 0x39B3,
- 0x7228, 0x15DF, 0x722A, 0x0BFA, 0x722B, 0x39B4, 0x722C, 0x15E1,
- 0x722D, 0x15E0, 0x7230, 0x15E2, 0x7232, 0x15E3, 0x7235, 0x090B,
- 0x7236, 0x0DD5, 0x7238, 0x39B5, 0x723A, 0x0EF8, 0x723B, 0x15E4,
- 0x723C, 0x15E5, 0x723D, 0x0AD8, 0x723E, 0x08D0, 0x723F, 0x15E6,
- 0x7240, 0x15E7, 0x7241, 0x39B6, 0x7246, 0x15E8, 0x7247, 0x0E22,
- 0x7248, 0x0D5B, 0x724B, 0x15E9, 0x724C, 0x0D0D, 0x7252, 0x0BC9,
- 0x7253, 0x39B7, 0x7255, 0x39B8, 0x7256, 0x39B9, 0x7258, 0x15EA,
- 0x7259, 0x0567, 0x725B, 0x0687, 0x725C, 0x39BA, 0x725D, 0x0ED2,
- 0x725F, 0x0EC2, 0x7261, 0x0534, 0x7262, 0x0FDA, 0x7267, 0x0E80,
- 0x7269, 0x0DFA, 0x7272, 0x0A5B, 0x7274, 0x15EB, 0x7279, 0x0C9B,
- 0x727D, 0x0757, 0x727E, 0x15EC, 0x7280, 0x0844, 0x7281, 0x15EE,
- 0x7282, 0x15ED, 0x7287, 0x15EF, 0x728D, 0x39BB, 0x7292, 0x15F0,
- 0x7296, 0x15F1, 0x72A0, 0x0658, 0x72A2, 0x15F2, 0x72A7, 0x15F3,
- 0x72AC, 0x0758, 0x72AD, 0x39BC, 0x72AF, 0x0D5C, 0x72B1, 0x2161,
- 0x72B2, 0x15F5, 0x72B4, 0x39BD, 0x72B6, 0x09DD, 0x72B9, 0x15F4,
- 0x72BE, 0x2162, 0x72C0, 0x342B, 0x72C2, 0x06B0, 0x72C3, 0x15F6,
- 0x72C4, 0x15F8, 0x72C6, 0x15F7, 0x72C7, 0x39BE, 0x72CE, 0x15F9,
- 0x72D0, 0x0785, 0x72D2, 0x15FA, 0x72D7, 0x06E1, 0x72D9, 0x0AC2,
- 0x72DB, 0x080F, 0x72E0, 0x15FC, 0x72E1, 0x15FD, 0x72E2, 0x15FB,
- 0x72E9, 0x0919, 0x72EC, 0x0CA0, 0x72ED, 0x06B1, 0x72F7, 0x15FF,
- 0x72F8, 0x0B6A, 0x72F9, 0x15FE, 0x72FB, 0x39BF, 0x72FC, 0x0FDB,
- 0x72FD, 0x0D18, 0x7304, 0x39C0, 0x7305, 0x39C1, 0x730A, 0x1602,
- 0x7316, 0x1604, 0x7317, 0x1601, 0x731B, 0x0EE0, 0x731C, 0x1603,
- 0x731D, 0x1605, 0x731F, 0x0F8C, 0x7324, 0x2163, 0x7325, 0x1609,
- 0x7328, 0x39C2, 0x7329, 0x1608, 0x732A, 0x0BB4, 0x732B, 0x0CE3,
- 0x732E, 0x0759, 0x732F, 0x1607, 0x7331, 0x39C3, 0x7334, 0x1606,
- 0x7336, 0x0F1B, 0x7337, 0x0F1C, 0x733E, 0x160A, 0x733F, 0x0510,
- 0x7343, 0x39C4, 0x7344, 0x0808, 0x7345, 0x08B0, 0x734E, 0x160B,
- 0x734F, 0x160C, 0x7357, 0x160E, 0x7363, 0x094D, 0x7368, 0x1610,
- 0x736A, 0x160F, 0x736C, 0x39C5, 0x7370, 0x1611, 0x7372, 0x05AB,
- 0x7375, 0x1613, 0x7377, 0x2165, 0x7378, 0x1612, 0x737A, 0x1615,
- 0x737B, 0x1614, 0x737C, 0x39C6, 0x7383, 0x39C7, 0x7384, 0x0770,
- 0x7385, 0x39C8, 0x7386, 0x39C9, 0x7387, 0x0F70, 0x7389, 0x06C4,
- 0x738B, 0x0526, 0x7395, 0x39CA, 0x7396, 0x06E2, 0x739E, 0x39CB,
- 0x739F, 0x39CC, 0x73A0, 0x39CD, 0x73A6, 0x39CE, 0x73A8, 0x3C3F,
- 0x73A9, 0x061D, 0x73AB, 0x39CF, 0x73B2, 0x0FB0, 0x73B3, 0x1617,
- 0x73B5, 0x39D0, 0x73B7, 0x39D1, 0x73BA, 0x35EA, 0x73BB, 0x1619,
- 0x73BC, 0x39D2, 0x73BD, 0x2166, 0x73C0, 0x161A, 0x73C2, 0x0551,
- 0x73C8, 0x1616, 0x73C9, 0x2167, 0x73CA, 0x0887, 0x73CD, 0x0BDD,
- 0x73CE, 0x1618, 0x73CF, 0x39D3, 0x73D2, 0x216A, 0x73D6, 0x2168,
- 0x73D9, 0x39D4, 0x73DE, 0x161D, 0x73E0, 0x091A, 0x73E3, 0x2169,
- 0x73E4, 0x3C39, 0x73E5, 0x161B, 0x73E9, 0x39D5, 0x73EA, 0x0714,
- 0x73ED, 0x0D5D, 0x73EE, 0x161C, 0x73F1, 0x1637, 0x73F4, 0x39D6,
- 0x73F5, 0x216C, 0x73F8, 0x1622, 0x73FD, 0x39D7, 0x73FE, 0x0771,
- 0x7403, 0x067F, 0x7404, 0x39D8, 0x7405, 0x161F, 0x7406, 0x0F67,
- 0x7407, 0x216B, 0x7409, 0x0F78, 0x740A, 0x39D9, 0x741A, 0x39DA,
- 0x741B, 0x39DB, 0x7421, 0x3C3A, 0x7422, 0x0B56, 0x7424, 0x39DC,
- 0x7425, 0x1621, 0x7426, 0x216D, 0x7428, 0x39DD, 0x7429, 0x216F,
- 0x742A, 0x216E, 0x742C, 0x39DE, 0x742E, 0x2170, 0x742F, 0x39DF,
- 0x7430, 0x39E0, 0x7431, 0x39E1, 0x7432, 0x1623, 0x7433, 0x0F9E,
- 0x7434, 0x06CF, 0x7435, 0x0D90, 0x7436, 0x0D00, 0x7439, 0x39E2,
- 0x743A, 0x1624, 0x743F, 0x1626, 0x7441, 0x1629, 0x7444, 0x39E3,
- 0x7447, 0x39E4, 0x744B, 0x39E5, 0x744D, 0x39E6, 0x7451, 0x39E7,
- 0x7455, 0x1625, 0x7457, 0x39E8, 0x7459, 0x1628, 0x745A, 0x079E,
- 0x745B, 0x04EF, 0x745C, 0x162A, 0x745E, 0x0A36, 0x745F, 0x1627,
- 0x7460, 0x0FA4, 0x7462, 0x2171, 0x7463, 0x162D, 0x7464, 0x1D35,
- 0x7466, 0x39E9, 0x7469, 0x162B, 0x746A, 0x162E, 0x746B, 0x39EA,
- 0x746F, 0x1620, 0x7470, 0x162C, 0x7471, 0x39EB, 0x7473, 0x082C,
- 0x7476, 0x162F, 0x747E, 0x1630, 0x7480, 0x39EC, 0x7483, 0x0F68,
- 0x7485, 0x39ED, 0x7486, 0x39EE, 0x7487, 0x39EF, 0x7489, 0x2172,
- 0x748B, 0x1631, 0x7490, 0x39F0, 0x7498, 0x39F1, 0x749C, 0x39F2,
- 0x749E, 0x1632, 0x749F, 0x2173, 0x74A0, 0x39F3, 0x74A2, 0x161E,
- 0x74A3, 0x39F4, 0x74A7, 0x1633, 0x74A8, 0x39F5, 0x74AB, 0x39F6,
- 0x74B0, 0x0600, 0x74B5, 0x39F7, 0x74BD, 0x08D1, 0x74BF, 0x39F8,
- 0x74C8, 0x39F9, 0x74CA, 0x1634, 0x74CF, 0x1635, 0x74D4, 0x1636,
- 0x74DA, 0x39FA, 0x74DC, 0x04DD, 0x74DE, 0x39FB, 0x74E0, 0x1638,
- 0x74E2, 0x0DAD, 0x74E3, 0x1639, 0x74E6, 0x05E0, 0x74E7, 0x163A,
- 0x74E9, 0x163B, 0x74EE, 0x163C, 0x74EF, 0x3750, 0x74F0, 0x163E,
- 0x74F1, 0x163F, 0x74F2, 0x163D, 0x74F6, 0x0DC5, 0x74F7, 0x1641,
- 0x74F8, 0x1640, 0x7501, 0x2174, 0x7503, 0x1643, 0x7504, 0x1642,
- 0x7505, 0x1644, 0x750C, 0x1645, 0x750D, 0x1647, 0x750E, 0x1646,
- 0x7511, 0x080B, 0x7513, 0x1649, 0x7515, 0x1648, 0x7518, 0x0601,
- 0x751A, 0x0A19, 0x751C, 0x0C36, 0x751E, 0x164A, 0x751F, 0x0A5C,
- 0x7522, 0x35DE, 0x7523, 0x0888, 0x7525, 0x051B, 0x7526, 0x164B,
- 0x7528, 0x0F3B, 0x752B, 0x0E33, 0x752C, 0x164C, 0x752F, 0x20F2,
- 0x7530, 0x0C3E, 0x7531, 0x0F1D, 0x7532, 0x07D5, 0x7533, 0x0A03,
- 0x7537, 0x0B89, 0x7538, 0x10C9, 0x753A, 0x0BCA, 0x753B, 0x0568,
- 0x753C, 0x164D, 0x7544, 0x164E, 0x7546, 0x1653, 0x7549, 0x1651,
- 0x754A, 0x1650, 0x754B, 0x13C7, 0x754C, 0x0584, 0x754D, 0x164F,
- 0x754E, 0x39FC, 0x754F, 0x049E, 0x7551, 0x0D3E, 0x7554, 0x0D5E,
- 0x7559, 0x0F79, 0x755A, 0x1654, 0x755B, 0x1652, 0x755C, 0x0B9A,
- 0x755D, 0x0A4A, 0x7560, 0x0D3F, 0x7562, 0x0D9F, 0x7564, 0x1656,
- 0x7565, 0x0F74, 0x7566, 0x0723, 0x7567, 0x1657, 0x7569, 0x1655,
- 0x756A, 0x0D6A, 0x756B, 0x1658, 0x756C, 0x3C3B, 0x756D, 0x1659,
- 0x756F, 0x2175, 0x7570, 0x049F, 0x7573, 0x09DE, 0x7574, 0x165E,
- 0x7575, 0x3751, 0x7576, 0x165B, 0x7577, 0x0CC5, 0x7578, 0x165A,
- 0x7579, 0x39FD, 0x757F, 0x0640, 0x7581, 0x39FE, 0x7582, 0x1661,
- 0x7586, 0x165C, 0x7587, 0x165D, 0x7589, 0x1660, 0x758A, 0x165F,
- 0x758B, 0x0D97, 0x758E, 0x0AC4, 0x758F, 0x0AC3, 0x7590, 0x39FF,
- 0x7591, 0x0659, 0x7592, 0x3A00, 0x7593, 0x3A01, 0x7594, 0x1662,
- 0x759A, 0x1663, 0x759D, 0x1664, 0x75A3, 0x1666, 0x75A5, 0x1665,
- 0x75AB, 0x04F8, 0x75B1, 0x166E, 0x75B2, 0x0D7C, 0x75B3, 0x1668,
- 0x75B4, 0x3A02, 0x75B5, 0x166A, 0x75B8, 0x166C, 0x75B9, 0x0A04,
- 0x75BC, 0x166D, 0x75BD, 0x166B, 0x75BE, 0x08EC, 0x75C2, 0x1667,
- 0x75C3, 0x1669, 0x75C5, 0x0DB4, 0x75C7, 0x09B1, 0x75CA, 0x1670,
- 0x75CD, 0x166F, 0x75D2, 0x1671, 0x75D4, 0x08D2, 0x75D5, 0x081F,
- 0x75D8, 0x0C71, 0x75D9, 0x1672, 0x75DB, 0x0BE7, 0x75DE, 0x1674,
- 0x75E2, 0x0F69, 0x75E3, 0x1673, 0x75E4, 0x3A03, 0x75E9, 0x0AEB,
- 0x75EC, 0x3752, 0x75F0, 0x1679, 0x75F2, 0x167B, 0x75F3, 0x167C,
- 0x75F4, 0x0B92, 0x75F9, 0x3A04, 0x75FA, 0x167A, 0x75FC, 0x1677,
- 0x75FE, 0x1675, 0x75FF, 0x1676, 0x7600, 0x3A05, 0x7601, 0x1678,
- 0x7609, 0x167F, 0x760A, 0x3A06, 0x760B, 0x167D, 0x760D, 0x167E,
- 0x7615, 0x3A07, 0x7616, 0x3A08, 0x7619, 0x3A09, 0x761E, 0x3A0A,
- 0x761F, 0x1680, 0x7620, 0x1682, 0x7621, 0x1683, 0x7622, 0x1684,
- 0x7624, 0x1685, 0x7626, 0x1E2D, 0x7627, 0x1681, 0x762D, 0x3A0B,
- 0x7630, 0x1687, 0x7634, 0x1686, 0x7635, 0x3A0C, 0x763B, 0x1688,
- 0x7642, 0x0F8D, 0x7643, 0x3A0D, 0x7646, 0x168B, 0x7647, 0x1689,
- 0x7648, 0x168A, 0x764B, 0x3A0E, 0x764C, 0x061E, 0x764E, 0x3753,
- 0x7652, 0x0F0A, 0x7656, 0x0E1A, 0x7658, 0x168D, 0x765C, 0x168C,
- 0x7661, 0x168E, 0x7662, 0x168F, 0x7665, 0x3A0F, 0x7667, 0x1693,
- 0x7668, 0x1690, 0x7669, 0x1691, 0x766A, 0x1692, 0x766C, 0x1694,
- 0x766D, 0x3A10, 0x766F, 0x3A11, 0x7670, 0x1695, 0x7671, 0x3A12,
- 0x7672, 0x1696, 0x7674, 0x3A13, 0x7676, 0x1697, 0x7678, 0x1698,
- 0x767A, 0x0D43, 0x767B, 0x0C4A, 0x767C, 0x1699, 0x767D, 0x0D28,
- 0x767E, 0x0DA6, 0x7680, 0x169A, 0x7682, 0x2176, 0x7683, 0x169B,
- 0x7684, 0x0C24, 0x7686, 0x0585, 0x7687, 0x07D6, 0x7688, 0x169C,
- 0x768B, 0x169D, 0x768E, 0x169E, 0x7690, 0x0877, 0x7693, 0x16A0,
- 0x7696, 0x169F, 0x7699, 0x16A1, 0x769A, 0x16A2, 0x769B, 0x2179,
- 0x769C, 0x2177, 0x769E, 0x2178, 0x76A4, 0x3A14, 0x76A5, 0x3A15,
- 0x76A6, 0x217A, 0x76AE, 0x0D7D, 0x76B0, 0x16A3, 0x76B4, 0x16A4,
- 0x76B7, 0x1D1C, 0x76B8, 0x16A5, 0x76B9, 0x16A6, 0x76BA, 0x16A7,
- 0x76BF, 0x087C, 0x76C2, 0x16A8, 0x76C3, 0x0D0C, 0x76C5, 0x3A16,
- 0x76C6, 0x0E8D, 0x76C8, 0x04F0, 0x76CA, 0x04F9, 0x76CC, 0x3A17,
- 0x76CD, 0x16A9, 0x76D2, 0x16AB, 0x76D6, 0x16AA, 0x76D7, 0x0C6A,
- 0x76DB, 0x0A5D, 0x76DC, 0x14D8, 0x76DE, 0x16AC, 0x76DF, 0x0ECD,
- 0x76E1, 0x16AD, 0x76E3, 0x0602, 0x76E4, 0x0D6B, 0x76E5, 0x16AE,
- 0x76E7, 0x16AF, 0x76EA, 0x16B0, 0x76EC, 0x3A18, 0x76EE, 0x0EE8,
- 0x76F2, 0x0EE1, 0x76F4, 0x0BDA, 0x76F8, 0x0AEC, 0x76FB, 0x16B2,
- 0x76FC, 0x3A19, 0x76FE, 0x096C, 0x7701, 0x09B2, 0x7704, 0x16B5,
- 0x7707, 0x16B4, 0x7708, 0x16B3, 0x7709, 0x0D91, 0x770B, 0x0603,
- 0x770C, 0x075D, 0x771B, 0x16BB, 0x771E, 0x16B8, 0x771F, 0x0A05,
- 0x7720, 0x0EBE, 0x7724, 0x16B7, 0x7725, 0x16B9, 0x7726, 0x16BA,
- 0x7729, 0x16B6, 0x7734, 0x3A1A, 0x7736, 0x3A1B, 0x7737, 0x16BC,
- 0x7738, 0x16BD, 0x773A, 0x0BCB, 0x773C, 0x061F, 0x7740, 0x0BA3,
- 0x7746, 0x217C, 0x7747, 0x16BE, 0x775A, 0x16BF, 0x775B, 0x16C2,
- 0x775C, 0x3A1C, 0x775F, 0x3A1D, 0x7760, 0x3A1E, 0x7761, 0x0A2D,
- 0x7762, 0x1EC5, 0x7763, 0x0C9C, 0x7765, 0x16C3, 0x7766, 0x0E81,
- 0x7768, 0x16C0, 0x776A, 0x3755, 0x776B, 0x16C1, 0x7772, 0x3A1F,
- 0x7779, 0x16C6, 0x777D, 0x3A20, 0x777E, 0x16C5, 0x777F, 0x16C4,
- 0x778B, 0x16C8, 0x778E, 0x16C7, 0x7791, 0x16C9, 0x7795, 0x3A21,
- 0x779E, 0x16CB, 0x77A0, 0x16CA, 0x77A5, 0x0E1D, 0x77A9, 0x3756,
- 0x77AA, 0x3A22, 0x77AC, 0x0960, 0x77AD, 0x0F8E, 0x77B0, 0x16CC,
- 0x77B3, 0x0C8F, 0x77B6, 0x16CD, 0x77B9, 0x16CE, 0x77BB, 0x16D2,
- 0x77BC, 0x16D0, 0x77BD, 0x16D1, 0x77BF, 0x16CF, 0x77C7, 0x16D3,
- 0x77CD, 0x16D4, 0x77D7, 0x16D5, 0x77DA, 0x16D6, 0x77DB, 0x0EC3,
- 0x77DC, 0x16D7, 0x77E2, 0x0EFC, 0x77E3, 0x16D8, 0x77E5, 0x0B8C,
- 0x77E6, 0x3A23, 0x77E7, 0x0D20, 0x77E9, 0x06E3, 0x77ED, 0x0B79,
- 0x77EE, 0x16D9, 0x77EF, 0x06B2, 0x77F0, 0x3A24, 0x77F3, 0x0A74,
- 0x77F4, 0x3A25, 0x77FC, 0x16DA, 0x7802, 0x082D, 0x7806, 0x3A26,
- 0x780C, 0x16DB, 0x7812, 0x16DC, 0x7814, 0x075A, 0x7815, 0x0845,
- 0x7820, 0x16DE, 0x7821, 0x217E, 0x7822, 0x3A27, 0x7825, 0x0C50,
- 0x7826, 0x0846, 0x7827, 0x0668, 0x782D, 0x3A28, 0x782E, 0x3A29,
- 0x7830, 0x3A2A, 0x7832, 0x0E52, 0x7834, 0x0D01, 0x7835, 0x3A2B,
- 0x783A, 0x0C51, 0x783F, 0x07EE, 0x7845, 0x16E0, 0x784E, 0x217F,
- 0x784F, 0x341E, 0x7851, 0x3C3C, 0x785D, 0x09B3, 0x7864, 0x2180,
- 0x7868, 0x3A2C, 0x786B, 0x0F7A, 0x786C, 0x07D7, 0x786F, 0x075B,
- 0x7872, 0x0D37, 0x7874, 0x16E2, 0x787A, 0x2181, 0x787C, 0x16E4,
- 0x7881, 0x079F, 0x7886, 0x16E3, 0x7887, 0x0C12, 0x788C, 0x16E6,
- 0x788D, 0x0595, 0x788E, 0x16E1, 0x7891, 0x0D7E, 0x7893, 0x04D2,
- 0x7895, 0x085C, 0x7897, 0x0FF8, 0x789A, 0x16E5, 0x789E, 0x3A2D,
- 0x78A3, 0x16E7, 0x78A7, 0x0E1B, 0x78A9, 0x0A7D, 0x78AA, 0x16E9,
- 0x78AF, 0x16EA, 0x78B5, 0x16E8, 0x78BA, 0x05AC, 0x78BC, 0x16F0,
- 0x78BE, 0x16EF, 0x78C1, 0x08D3, 0x78C5, 0x16F1, 0x78C6, 0x16EC,
- 0x78C8, 0x3A2E, 0x78CA, 0x16F2, 0x78CB, 0x16ED, 0x78CC, 0x3A2F,
- 0x78CE, 0x3A30, 0x78D0, 0x0D6C, 0x78D1, 0x16EB, 0x78D4, 0x16EE,
- 0x78DA, 0x16F5, 0x78E0, 0x3A32, 0x78E1, 0x3A33, 0x78E4, 0x3A31,
- 0x78E7, 0x16F4, 0x78E8, 0x0E8F, 0x78EC, 0x16F3, 0x78EF, 0x04AF,
- 0x78F2, 0x3A34, 0x78F4, 0x16F7, 0x78F7, 0x3A35, 0x78FB, 0x3A36,
- 0x78FD, 0x16F6, 0x7901, 0x09B4, 0x7907, 0x16F8, 0x790E, 0x0AC5,
- 0x7911, 0x16FA, 0x7912, 0x16F9, 0x7919, 0x16FB, 0x7926, 0x16DD,
- 0x792A, 0x16DF, 0x792B, 0x16FD, 0x792C, 0x16FC, 0x7930, 0x2182,
- 0x7931, 0x3A37, 0x7934, 0x3A38, 0x793A, 0x08D4, 0x793B, 0x3A39,
- 0x793C, 0x0FB1, 0x793D, 0x3A3A, 0x793E, 0x08FE, 0x7940, 0x16FE,
- 0x7941, 0x070D, 0x7945, 0x3A3B, 0x7947, 0x065A, 0x7948, 0x0641,
- 0x7949, 0x08B1, 0x7950, 0x0F1E, 0x7953, 0x1704, 0x7955, 0x1703,
- 0x7956, 0x0AC6, 0x7957, 0x1700, 0x795A, 0x1702, 0x795B, 0x3A3C,
- 0x795C, 0x3A3D, 0x795D, 0x0955, 0x795E, 0x0A06, 0x795F, 0x1701,
- 0x7960, 0x16FF, 0x7962, 0x0CE0, 0x7965, 0x09B5, 0x7968, 0x0DAE,
- 0x796D, 0x0847, 0x7977, 0x0C72, 0x797A, 0x1705, 0x797F, 0x1706,
- 0x7980, 0x171C, 0x7981, 0x06D0, 0x7984, 0x0FE3, 0x7985, 0x0AB7,
- 0x798A, 0x1707, 0x798B, 0x3A3E, 0x798D, 0x0552, 0x798E, 0x0C13,
- 0x798F, 0x0DF1, 0x7994, 0x2186, 0x7996, 0x3A3F, 0x7998, 0x3A40,
- 0x799B, 0x2188, 0x799D, 0x1708, 0x79A6, 0x0694, 0x79A7, 0x1709,
- 0x79AA, 0x170B, 0x79AE, 0x170C, 0x79B0, 0x0CDF, 0x79B1, 0x1E4E,
- 0x79B3, 0x170D, 0x79B8, 0x3A41, 0x79B9, 0x170E, 0x79BA, 0x170F,
- 0x79BB, 0x3A42, 0x79BD, 0x06D1, 0x79BE, 0x0553, 0x79BF, 0x0C9D,
- 0x79C0, 0x0932, 0x79C1, 0x08B2, 0x79C9, 0x1710, 0x79CA, 0x3A43,
- 0x79CB, 0x0933, 0x79D1, 0x054A, 0x79D2, 0x0DB5, 0x79D5, 0x1711,
- 0x79D8, 0x0D7F, 0x79DA, 0x3A44, 0x79DF, 0x0AC7, 0x79E1, 0x1714,
- 0x79E3, 0x1715, 0x79E4, 0x0D1F, 0x79E6, 0x0A07, 0x79E7, 0x1712,
- 0x79E9, 0x0B9F, 0x79EC, 0x1713, 0x79F0, 0x09B6, 0x79FB, 0x04A0,
- 0x7A00, 0x0643, 0x7A03, 0x3A45, 0x7A05, 0x3633, 0x7A08, 0x1716,
- 0x7A09, 0x3A46, 0x7A0B, 0x0C14, 0x7A0D, 0x1717, 0x7A0E, 0x0A6B,
- 0x7A11, 0x3A47, 0x7A14, 0x0EB9, 0x7A17, 0x0D95, 0x7A18, 0x1718,
- 0x7A19, 0x1719, 0x7A1A, 0x0B93, 0x7A1C, 0x0F8F, 0x7A1E, 0x3A48,
- 0x7A1F, 0x171B, 0x7A20, 0x171A, 0x7A2D, 0x3A49, 0x7A2E, 0x091B,
- 0x7A31, 0x171D, 0x7A32, 0x04B4, 0x7A37, 0x1720, 0x7A39, 0x3A4A,
- 0x7A3B, 0x171E, 0x7A3C, 0x0554, 0x7A3D, 0x0724, 0x7A3E, 0x171F,
- 0x7A3F, 0x07D8, 0x7A40, 0x0804, 0x7A42, 0x0E36, 0x7A43, 0x1721,
- 0x7A45, 0x3A4B, 0x7A46, 0x0E82, 0x7A49, 0x1723, 0x7A4C, 0x3A4C,
- 0x7A4D, 0x0A75, 0x7A4E, 0x04F1, 0x7A4F, 0x053A, 0x7A50, 0x0470,
- 0x7A57, 0x1722, 0x7A5D, 0x3A4D, 0x7A60, 0x3A4E, 0x7A61, 0x1724,
- 0x7A62, 0x1725, 0x7A63, 0x09DF, 0x7A69, 0x1726, 0x7A6B, 0x05AD,
- 0x7A6D, 0x3A4F, 0x7A70, 0x1728, 0x7A74, 0x0740, 0x7A76, 0x0680,
- 0x7A78, 0x3A50, 0x7A79, 0x1729, 0x7A7A, 0x06ED, 0x7A7D, 0x172A,
- 0x7A7F, 0x0AA0, 0x7A81, 0x0CA5, 0x7A83, 0x0A84, 0x7A84, 0x0865,
- 0x7A88, 0x172B, 0x7A92, 0x0BA0, 0x7A93, 0x0AED, 0x7A95, 0x172D,
- 0x7A96, 0x172F, 0x7A97, 0x172C, 0x7A98, 0x172E, 0x7A9F, 0x06F8,
- 0x7AA0, 0x3A51, 0x7AA3, 0x3A52, 0x7AA9, 0x1730, 0x7AAA, 0x06FC,
- 0x7AAE, 0x0681, 0x7AAF, 0x0F3C, 0x7AB0, 0x1732, 0x7AB3, 0x3A53,
- 0x7AB6, 0x1733, 0x7ABA, 0x04D0, 0x7ABB, 0x3A54, 0x7ABC, 0x3A55,
- 0x7ABF, 0x1736, 0x7AC3, 0x05D4, 0x7AC4, 0x1735, 0x7AC5, 0x1734,
- 0x7AC6, 0x3A56, 0x7AC7, 0x1738, 0x7AC8, 0x1731, 0x7ACA, 0x1739,
- 0x7ACB, 0x0F71, 0x7ACD, 0x173A, 0x7ACF, 0x173B, 0x7AD1, 0x2189,
- 0x7AD2, 0x11C5, 0x7AD3, 0x173D, 0x7AD5, 0x173C, 0x7AD9, 0x173E,
- 0x7ADA, 0x173F, 0x7ADC, 0x0F7D, 0x7ADD, 0x1740, 0x7ADF, 0x1C08,
- 0x7AE0, 0x09B7, 0x7AE1, 0x1741, 0x7AE2, 0x1742, 0x7AE3, 0x0961,
- 0x7AE5, 0x0C90, 0x7AE6, 0x1743, 0x7AE7, 0x218A, 0x7AEA, 0x0B66,
- 0x7AEB, 0x218C, 0x7AED, 0x1744, 0x7AEF, 0x0B7A, 0x7AF0, 0x1745,
- 0x7AF6, 0x069D, 0x7AF8, 0x1076, 0x7AF9, 0x0B9B, 0x7AFA, 0x08DF,
- 0x7AFF, 0x0604, 0x7B02, 0x1746, 0x7B04, 0x1753, 0x7B06, 0x1749,
- 0x7B07, 0x3A57, 0x7B08, 0x0682, 0x7B0A, 0x1748, 0x7B0B, 0x1755,
- 0x7B0F, 0x1747, 0x7B11, 0x09B8, 0x7B14, 0x3A58, 0x7B18, 0x174B,
- 0x7B19, 0x174C, 0x7B1B, 0x0C25, 0x7B1E, 0x174D, 0x7B20, 0x05BC,
- 0x7B25, 0x0A20, 0x7B26, 0x0DD6, 0x7B27, 0x3A59, 0x7B28, 0x174F,
- 0x7B2C, 0x0B48, 0x7B31, 0x3A5A, 0x7B33, 0x174A, 0x7B35, 0x174E,
- 0x7B36, 0x1750, 0x7B39, 0x086B, 0x7B45, 0x1757, 0x7B46, 0x0DA0,
- 0x7B47, 0x3A5B, 0x7B48, 0x0D3A, 0x7B49, 0x0C73, 0x7B4B, 0x06D2,
- 0x7B4C, 0x1756, 0x7B4D, 0x1754, 0x7B4E, 0x3A5C, 0x7B4F, 0x0D49,
- 0x7B50, 0x1751, 0x7B51, 0x0B9C, 0x7B52, 0x0C75, 0x7B53, 0x375D,
- 0x7B54, 0x0C74, 0x7B56, 0x0866, 0x7B5D, 0x1769, 0x7B60, 0x3A5D,
- 0x7B65, 0x1759, 0x7B67, 0x175B, 0x7B69, 0x3A5E, 0x7B6C, 0x175E,
- 0x7B6D, 0x3A5F, 0x7B6E, 0x175F, 0x7B70, 0x175C, 0x7B71, 0x175D,
- 0x7B72, 0x3A60, 0x7B74, 0x175A, 0x7B75, 0x1758, 0x7B7A, 0x1752,
- 0x7B86, 0x0E1F, 0x7B87, 0x0555, 0x7B8B, 0x1766, 0x7B8D, 0x1763,
- 0x7B8F, 0x1768, 0x7B91, 0x3A61, 0x7B92, 0x1767, 0x7B94, 0x0D29,
- 0x7B95, 0x0EB3, 0x7B97, 0x0889, 0x7B98, 0x1761, 0x7B99, 0x176A,
- 0x7B9A, 0x1765, 0x7B9C, 0x1764, 0x7B9D, 0x1760, 0x7B9E, 0x218D,
- 0x7B9F, 0x1762, 0x7BA1, 0x0605, 0x7BAA, 0x0B7B, 0x7BAD, 0x0AA1,
- 0x7BAF, 0x3A62, 0x7BB1, 0x0D36, 0x7BB4, 0x176F, 0x7BB8, 0x0D38,
- 0x7BC0, 0x0A85, 0x7BC1, 0x176C, 0x7BC4, 0x0D63, 0x7BC6, 0x1770,
- 0x7BC7, 0x0E23, 0x7BC9, 0x0B99, 0x7BCB, 0x176B, 0x7BCC, 0x176D,
- 0x7BCF, 0x176E, 0x7BD7, 0x3A63, 0x7BD9, 0x3A64, 0x7BDD, 0x1771,
- 0x7BE0, 0x08F0, 0x7BE4, 0x0C9E, 0x7BE5, 0x1776, 0x7BE6, 0x1775,
- 0x7BE9, 0x1772, 0x7BED, 0x0FDC, 0x7BF3, 0x177B, 0x7BF6, 0x177F,
- 0x7BF7, 0x177C, 0x7C00, 0x1778, 0x7C07, 0x1779, 0x7C0B, 0x3A65,
- 0x7C0D, 0x177E, 0x7C0F, 0x3A66, 0x7C11, 0x1773, 0x7C12, 0x10EA,
- 0x7C13, 0x177A, 0x7C14, 0x1774, 0x7C17, 0x177D, 0x7C1E, 0x1E3B,
- 0x7C1F, 0x1783, 0x7C20, 0x3A67, 0x7C21, 0x0606, 0x7C23, 0x1780,
- 0x7C26, 0x3A68, 0x7C27, 0x1781, 0x7C2A, 0x1782, 0x7C2B, 0x1785,
- 0x7C31, 0x3A69, 0x7C36, 0x3A6A, 0x7C37, 0x1784, 0x7C38, 0x0D8A,
- 0x7C3D, 0x1786, 0x7C3E, 0x0FC4, 0x7C3F, 0x0E3D, 0x7C40, 0x178B,
- 0x7C43, 0x1788, 0x7C4C, 0x1787, 0x7C4D, 0x0A76, 0x7C4F, 0x178A,
- 0x7C50, 0x178C, 0x7C51, 0x3A6B, 0x7C54, 0x1789, 0x7C56, 0x1790,
- 0x7C58, 0x178D, 0x7C59, 0x3A6C, 0x7C5F, 0x178E, 0x7C60, 0x1777,
- 0x7C64, 0x178F, 0x7C65, 0x1791, 0x7C67, 0x3A6D, 0x7C6C, 0x1792,
- 0x7C6E, 0x3A6E, 0x7C70, 0x3A6F, 0x7C73, 0x0E16, 0x7C75, 0x1793,
- 0x7C7B, 0x370E, 0x7C7E, 0x0EEE, 0x7C81, 0x06C6, 0x7C82, 0x06FF,
- 0x7C83, 0x1794, 0x7C89, 0x0E04, 0x7C8B, 0x0A2E, 0x7C8D, 0x0EBC,
- 0x7C90, 0x1795, 0x7C92, 0x0F7B, 0x7C95, 0x0D2A, 0x7C97, 0x0AC8,
- 0x7C98, 0x0CEA, 0x7C9B, 0x0957, 0x7C9F, 0x0484, 0x7CA1, 0x179A,
- 0x7CA2, 0x1798, 0x7CA4, 0x1796, 0x7CA5, 0x05DD, 0x7CA7, 0x09B9,
- 0x7CA8, 0x179B, 0x7CAB, 0x1799, 0x7CAD, 0x1797, 0x7CAE, 0x179F,
- 0x7CB1, 0x179E, 0x7CB2, 0x179D, 0x7CB3, 0x179C, 0x7CB9, 0x17A0,
- 0x7CBC, 0x3A70, 0x7CBD, 0x17A1, 0x7CBE, 0x0A5E, 0x7CBF, 0x3A71,
- 0x7CC0, 0x17A2, 0x7CC2, 0x17A4, 0x7CC5, 0x17A3, 0x7CC8, 0x3A72,
- 0x7CC9, 0x3A73, 0x7CCA, 0x0786, 0x7CCE, 0x0ABA, 0x7CD2, 0x17A6,
- 0x7CD6, 0x0C76, 0x7CD7, 0x3A74, 0x7CD8, 0x17A5, 0x7CD9, 0x3A75,
- 0x7CDC, 0x17A7, 0x7CDD, 0x3A76, 0x7CDE, 0x0E05, 0x7CDF, 0x0AEE,
- 0x7CE0, 0x07D9, 0x7CE2, 0x17A8, 0x7CE7, 0x0F90, 0x7CEB, 0x3A77,
- 0x7CEF, 0x17AA, 0x7CF2, 0x17AB, 0x7CF4, 0x17AC, 0x7CF6, 0x17AD,
- 0x7CF8, 0x08B3, 0x7CFA, 0x17AE, 0x7CFB, 0x0725, 0x7CFE, 0x0684,
- 0x7D00, 0x0644, 0x7D02, 0x17B0, 0x7D04, 0x0EFF, 0x7D05, 0x07DA,
- 0x7D06, 0x17AF, 0x7D07, 0x3A78, 0x7D08, 0x3A79, 0x7D09, 0x3A7A,
- 0x7D0A, 0x17B3, 0x7D0B, 0x0EF2, 0x7D0D, 0x0CF2, 0x7D10, 0x0DA5,
- 0x7D13, 0x3A7B, 0x7D14, 0x096D, 0x7D15, 0x17B2, 0x7D17, 0x08FF,
- 0x7D18, 0x07DB, 0x7D19, 0x08B4, 0x7D1A, 0x0683, 0x7D1B, 0x0E06,
- 0x7D1C, 0x17B1, 0x7D1D, 0x3A7C, 0x7D20, 0x0AC9, 0x7D21, 0x0E70,
- 0x7D22, 0x0867, 0x7D23, 0x3A7D, 0x7D2B, 0x08B5, 0x7D2C, 0x0BF9,
- 0x7D2E, 0x17B6, 0x7D2F, 0x0FA7, 0x7D30, 0x0849, 0x7D32, 0x17B7,
- 0x7D33, 0x0A08, 0x7D35, 0x17B9, 0x7D39, 0x09BA, 0x7D3A, 0x0820,
- 0x7D3F, 0x17B8, 0x7D41, 0x3A7E, 0x7D42, 0x0934, 0x7D43, 0x0772,
- 0x7D44, 0x0ACA, 0x7D45, 0x17B4, 0x7D46, 0x17BA, 0x7D48, 0x218F,
- 0x7D4B, 0x17B5, 0x7D4C, 0x0726, 0x7D4E, 0x17BD, 0x7D4F, 0x17C1,
- 0x7D50, 0x0741, 0x7D53, 0x3A7F, 0x7D56, 0x17BC, 0x7D59, 0x3A80,
- 0x7D5B, 0x17C5, 0x7D5C, 0x2190, 0x7D5D, 0x3A81, 0x7D5E, 0x07DC,
- 0x7D61, 0x0F57, 0x7D62, 0x0480, 0x7D63, 0x17C2, 0x7D66, 0x0685,
- 0x7D68, 0x17BF, 0x7D6E, 0x17C0, 0x7D71, 0x0C77, 0x7D72, 0x17BE,
- 0x7D73, 0x17BB, 0x7D75, 0x0586, 0x7D76, 0x0A88, 0x7D79, 0x075C,
- 0x7D7A, 0x3A82, 0x7D7D, 0x17C7, 0x7D86, 0x3A83, 0x7D89, 0x17C4,
- 0x7D8B, 0x3A84, 0x7D8C, 0x3A85, 0x7D8F, 0x17C6, 0x7D93, 0x17C3,
- 0x7D99, 0x0727, 0x7D9A, 0x0B13, 0x7D9B, 0x17C8, 0x7D9C, 0x0AF0,
- 0x7D9F, 0x17D5, 0x7DA0, 0x2192, 0x7DA2, 0x17D1, 0x7DA3, 0x17CB,
- 0x7DAB, 0x17CF, 0x7DAC, 0x0926, 0x7DAD, 0x04A1, 0x7DAE, 0x17CA,
- 0x7DAF, 0x17D2, 0x7DB0, 0x17D6, 0x7DB1, 0x07DD, 0x7DB2, 0x0EE2,
- 0x7DB4, 0x0BF2, 0x7DB5, 0x17CC, 0x7DB7, 0x2191, 0x7DB8, 0x17D4,
- 0x7DBA, 0x17C9, 0x7DBB, 0x0B7C, 0x7DBD, 0x17CE, 0x7DBE, 0x0481,
- 0x7DBF, 0x0ED6, 0x7DC7, 0x17CD, 0x7DCA, 0x06D3, 0x7DCB, 0x0D80,
- 0x7DCC, 0x3A86, 0x7DCF, 0x0AEF, 0x7DD1, 0x0F98, 0x7DD2, 0x0979,
- 0x7DD5, 0x17FD, 0x7DD6, 0x2193, 0x7DD8, 0x17D7, 0x7DDA, 0x0AA2,
- 0x7DDC, 0x17D3, 0x7DDD, 0x17D8, 0x7DDE, 0x17DA, 0x7DE0, 0x0C15,
- 0x7DE1, 0x17DD, 0x7DE3, 0x340A, 0x7DE4, 0x17D9, 0x7DE8, 0x0E24,
- 0x7DE9, 0x0607, 0x7DEB, 0x3A87, 0x7DEC, 0x0ED7, 0x7DEF, 0x04A2,
- 0x7DF1, 0x3A88, 0x7DF2, 0x17DC, 0x7DF4, 0x0FC5, 0x7DF9, 0x3A89,
- 0x7DFB, 0x17DB, 0x7E01, 0x0511, 0x7E04, 0x0CC4, 0x7E05, 0x17DE,
- 0x7E08, 0x3A8A, 0x7E09, 0x17E5, 0x7E0A, 0x17DF, 0x7E0B, 0x17E6,
- 0x7E11, 0x3A8B, 0x7E12, 0x17E2, 0x7E15, 0x3A8C, 0x7E1B, 0x0D31,
- 0x7E1E, 0x08F6, 0x7E1F, 0x17E4, 0x7E20, 0x3A8D, 0x7E21, 0x17E1,
- 0x7E22, 0x17E7, 0x7E23, 0x17E0, 0x7E26, 0x094E, 0x7E2B, 0x0E53,
- 0x7E2E, 0x0956, 0x7E31, 0x17E3, 0x7E32, 0x17EF, 0x7E35, 0x17EB,
- 0x7E37, 0x17EE, 0x7E39, 0x17EC, 0x7E3A, 0x17F0, 0x7E3B, 0x17EA,
- 0x7E3D, 0x17D0, 0x7E3E, 0x0A77, 0x7E41, 0x0D5F, 0x7E43, 0x17ED,
- 0x7E46, 0x17E8, 0x7E47, 0x3A8E, 0x7E48, 0x3767, 0x7E4A, 0x0AA3,
- 0x7E4B, 0x0728, 0x7E4D, 0x0935, 0x7E52, 0x2194, 0x7E54, 0x09EB,
- 0x7E55, 0x0AB8, 0x7E56, 0x17F3, 0x7E59, 0x17F5, 0x7E5A, 0x17F6,
- 0x7E5D, 0x17F2, 0x7E5E, 0x17F4, 0x7E61, 0x1E11, 0x7E62, 0x3A8F,
- 0x7E66, 0x17E9, 0x7E67, 0x17F1, 0x7E69, 0x17F9, 0x7E6A, 0x17F8,
- 0x7E6B, 0x1DF7, 0x7E6D, 0x0EA8, 0x7E6E, 0x3A90, 0x7E70, 0x0701,
- 0x7E73, 0x3A91, 0x7E79, 0x17F7, 0x7E7B, 0x17FB, 0x7E7C, 0x17FA,
- 0x7E7D, 0x17FE, 0x7E7F, 0x1800, 0x7E82, 0x088A, 0x7E83, 0x17FC,
- 0x7E88, 0x1801, 0x7E89, 0x1802, 0x7E8A, 0x20A7, 0x7E8C, 0x1803,
- 0x7E8D, 0x3A92, 0x7E8E, 0x1809, 0x7E8F, 0x0C35, 0x7E90, 0x1805,
- 0x7E91, 0x3A93, 0x7E92, 0x1804, 0x7E93, 0x1806, 0x7E94, 0x1807,
- 0x7E96, 0x1808, 0x7E98, 0x3A94, 0x7E9B, 0x180A, 0x7E9C, 0x180B,
- 0x7F36, 0x0608, 0x7F38, 0x180C, 0x7F3A, 0x180D, 0x7F44, 0x3A95,
- 0x7F45, 0x180E, 0x7F47, 0x2195, 0x7F4C, 0x180F, 0x7F4D, 0x1810,
- 0x7F4E, 0x1811, 0x7F4F, 0x3A96, 0x7F50, 0x1812, 0x7F51, 0x1813,
- 0x7F52, 0x3A97, 0x7F53, 0x3A98, 0x7F54, 0x1815, 0x7F55, 0x1814,
- 0x7F58, 0x1816, 0x7F5F, 0x1817, 0x7F60, 0x1818, 0x7F61, 0x3A99,
- 0x7F67, 0x181B, 0x7F68, 0x1819, 0x7F69, 0x181A, 0x7F6A, 0x0851,
- 0x7F6B, 0x0729, 0x7F6E, 0x0B94, 0x7F70, 0x0D47, 0x7F72, 0x097A,
- 0x7F75, 0x0D03, 0x7F77, 0x0D81, 0x7F78, 0x181C, 0x7F79, 0x1336,
- 0x7F82, 0x181D, 0x7F83, 0x181F, 0x7F85, 0x0F4F, 0x7F86, 0x181E,
- 0x7F87, 0x1821, 0x7F88, 0x1820, 0x7F8A, 0x0F3D, 0x7F8C, 0x1822,
- 0x7F8E, 0x0D92, 0x7F91, 0x3A9A, 0x7F94, 0x1823, 0x7F9A, 0x1826,
- 0x7F9D, 0x1825, 0x7F9E, 0x1824, 0x7FA1, 0x2196, 0x7FA3, 0x1827,
- 0x7FA4, 0x0708, 0x7FA8, 0x0AA4, 0x7FA9, 0x065B, 0x7FAE, 0x182B,
- 0x7FAF, 0x1828, 0x7FB2, 0x1829, 0x7FB6, 0x182C, 0x7FB8, 0x182D,
- 0x7FB9, 0x182A, 0x7FBD, 0x04CB, 0x7FBF, 0x3A9B, 0x7FC1, 0x0527,
- 0x7FC5, 0x182F, 0x7FC6, 0x1830, 0x7FCA, 0x1831, 0x7FCC, 0x0F4C,
- 0x7FCE, 0x3A9C, 0x7FD2, 0x0936, 0x7FD4, 0x1833, 0x7FD5, 0x1832,
- 0x7FDF, 0x3A9D, 0x7FE0, 0x0A2F, 0x7FE1, 0x1834, 0x7FE5, 0x3A9E,
- 0x7FE6, 0x1835, 0x7FE9, 0x1836, 0x7FEB, 0x0621, 0x7FEC, 0x3A9F,
- 0x7FEE, 0x3AA0, 0x7FEF, 0x3AA1, 0x7FF0, 0x0609, 0x7FF3, 0x1837,
- 0x7FF9, 0x1838, 0x7FFA, 0x3AA2, 0x7FFB, 0x0E8B, 0x7FFC, 0x0F4D,
- 0x8000, 0x0F3E, 0x8001, 0x0FDD, 0x8002, 0x3713, 0x8003, 0x07DF,
- 0x8004, 0x183B, 0x8005, 0x0900, 0x8006, 0x183A, 0x800B, 0x183C,
- 0x800C, 0x08D5, 0x800E, 0x3AA3, 0x8010, 0x0B31, 0x8011, 0x3AA4,
- 0x8012, 0x183D, 0x8014, 0x3AA5, 0x8015, 0x07DE, 0x8017, 0x0EE3,
- 0x8018, 0x183E, 0x8019, 0x183F, 0x801C, 0x1840, 0x8021, 0x1841,
- 0x8024, 0x3AA6, 0x8026, 0x3AA7, 0x8028, 0x1842, 0x8033, 0x08D6,
- 0x8036, 0x0EF9, 0x803A, 0x3AA8, 0x803B, 0x1844, 0x803C, 0x3AA9,
- 0x803D, 0x0B7D, 0x803F, 0x1843, 0x8046, 0x1846, 0x804A, 0x1845,
- 0x8052, 0x1847, 0x8056, 0x0A5F, 0x8058, 0x1848, 0x805A, 0x1849,
- 0x805E, 0x0E09, 0x805F, 0x184A, 0x8060, 0x3AAA, 0x8061, 0x0AF1,
- 0x8062, 0x184B, 0x8068, 0x184C, 0x806F, 0x0FC6, 0x8070, 0x184F,
- 0x8071, 0x3AAB, 0x8072, 0x184E, 0x8073, 0x184D, 0x8074, 0x0BCC,
- 0x8075, 0x3AAC, 0x8076, 0x1850, 0x8077, 0x09EC, 0x8079, 0x1851,
- 0x807D, 0x1852, 0x807E, 0x0FDE, 0x807F, 0x1853, 0x8084, 0x1854,
- 0x8085, 0x1856, 0x8086, 0x1855, 0x8087, 0x0D39, 0x8089, 0x0CD1,
- 0x808B, 0x0FE4, 0x808C, 0x0D3D, 0x8093, 0x1858, 0x8096, 0x09BB,
- 0x8098, 0x0D9C, 0x809A, 0x1859, 0x809B, 0x1857, 0x809D, 0x060A,
- 0x809E, 0x3AAD, 0x80A1, 0x0788, 0x80A2, 0x08B6, 0x80A5, 0x0D82,
- 0x80A6, 0x3AAE, 0x80A9, 0x075E, 0x80AA, 0x0E71, 0x80AB, 0x3AAF,
- 0x80AC, 0x185C, 0x80AD, 0x185A, 0x80AF, 0x07E0, 0x80B1, 0x07E1,
- 0x80B2, 0x04AD, 0x80B4, 0x0858, 0x80BA, 0x0D0F, 0x80C3, 0x04A3,
- 0x80C4, 0x1861, 0x80C6, 0x0B7E, 0x80CC, 0x0D0E, 0x80CE, 0x0B3B,
- 0x80D6, 0x1863, 0x80D7, 0x3AB0, 0x80D8, 0x3AB1, 0x80D9, 0x185F,
- 0x80DA, 0x1862, 0x80DB, 0x185D, 0x80DD, 0x1860, 0x80DE, 0x0E54,
- 0x80E1, 0x0789, 0x80E4, 0x04C1, 0x80E5, 0x185E, 0x80EF, 0x1865,
- 0x80F1, 0x1866, 0x80F4, 0x0C91, 0x80F8, 0x06B3, 0x80FC, 0x1871,
- 0x80FD, 0x0CF3, 0x8102, 0x08B7, 0x8105, 0x06B4, 0x8106, 0x0A6C,
- 0x8107, 0x0FEC, 0x8108, 0x0EBA, 0x8109, 0x1864, 0x810A, 0x0A78,
- 0x8116, 0x3AB2, 0x8118, 0x3AB3, 0x811A, 0x066D, 0x811B, 0x1867,
- 0x8123, 0x1869, 0x8129, 0x1868, 0x812B, 0x3659, 0x812F, 0x186A,
- 0x8131, 0x0B64, 0x8133, 0x0CF4, 0x8139, 0x0BCD, 0x813A, 0x3AB4,
- 0x813E, 0x186E, 0x8141, 0x3772, 0x8146, 0x186D, 0x814A, 0x3AB5,
- 0x814B, 0x186B, 0x814C, 0x3AB6, 0x814E, 0x0A1B, 0x8150, 0x0DD7,
- 0x8151, 0x1870, 0x8153, 0x186F, 0x8154, 0x07E2, 0x8155, 0x0FF9,
- 0x815F, 0x1880, 0x8165, 0x1874, 0x8166, 0x1875, 0x816B, 0x091C,
- 0x816E, 0x1873, 0x8170, 0x080A, 0x8171, 0x1872, 0x8174, 0x1876,
- 0x8178, 0x0BCE, 0x8179, 0x0DF2, 0x817A, 0x0AA5, 0x817F, 0x0B3C,
- 0x8180, 0x187A, 0x8181, 0x3AB7, 0x8182, 0x187B, 0x8183, 0x1877,
- 0x8184, 0x3AB8, 0x8188, 0x1878, 0x818A, 0x1879, 0x818F, 0x07E3,
- 0x8193, 0x1881, 0x8195, 0x187D, 0x819A, 0x0DD8, 0x819C, 0x0E9A,
- 0x819D, 0x0D9A, 0x81A0, 0x187C, 0x81A3, 0x187F, 0x81A4, 0x187E,
- 0x81A8, 0x0E72, 0x81A9, 0x1882, 0x81B0, 0x1883, 0x81B3, 0x0AB9,
- 0x81B4, 0x3AB9, 0x81B5, 0x1884, 0x81B8, 0x1886, 0x81BA, 0x188A,
- 0x81BD, 0x1887, 0x81BE, 0x1885, 0x81BF, 0x0CF5, 0x81C0, 0x1888,
- 0x81C2, 0x1889, 0x81C6, 0x0532, 0x81C8, 0x1890, 0x81C9, 0x188B,
- 0x81CD, 0x188C, 0x81CF, 0x3ABA, 0x81D1, 0x188D, 0x81D3, 0x0B01,
- 0x81D8, 0x188F, 0x81D9, 0x188E, 0x81DA, 0x1891, 0x81DF, 0x1892,
- 0x81E0, 0x1893, 0x81E3, 0x0A09, 0x81E5, 0x0569, 0x81E7, 0x1894,
- 0x81E8, 0x0F9F, 0x81EA, 0x08D7, 0x81ED, 0x0937, 0x81F3, 0x08B8,
- 0x81F4, 0x0B95, 0x81F9, 0x3ABB, 0x81FA, 0x1895, 0x81FB, 0x1896,
- 0x81FC, 0x04D3, 0x81FE, 0x1897, 0x8201, 0x1898, 0x8202, 0x1899,
- 0x8203, 0x3ABC, 0x8205, 0x189A, 0x8207, 0x189B, 0x8208, 0x06B5,
- 0x8209, 0x13AF, 0x820A, 0x189C, 0x820C, 0x0A89, 0x820D, 0x189D,
- 0x820E, 0x08F7, 0x8210, 0x189E, 0x8212, 0x1009, 0x8216, 0x189F,
- 0x8217, 0x0E2E, 0x8218, 0x0618, 0x821B, 0x0AA6, 0x821C, 0x0962,
- 0x821E, 0x0DE3, 0x821F, 0x0938, 0x8221, 0x3ABD, 0x8229, 0x18A0,
- 0x822A, 0x07E4, 0x822B, 0x18A1, 0x822C, 0x0D60, 0x822E, 0x18AF,
- 0x8232, 0x3ABE, 0x8233, 0x18A3, 0x8234, 0x3ABF, 0x8235, 0x0B29,
- 0x8236, 0x0D2B, 0x8237, 0x0773, 0x8238, 0x18A2, 0x8239, 0x0AA7,
- 0x8240, 0x18A4, 0x8246, 0x3AC0, 0x8247, 0x0C16, 0x824B, 0x3AC1,
- 0x824F, 0x3AC2, 0x8258, 0x18A6, 0x8259, 0x18A5, 0x825A, 0x18A8,
- 0x825D, 0x18A7, 0x825F, 0x18A9, 0x8262, 0x18AB, 0x8264, 0x18AA,
- 0x8266, 0x060B, 0x8268, 0x18AC, 0x826A, 0x18AD, 0x826B, 0x18AE,
- 0x826E, 0x0821, 0x826F, 0x0F91, 0x8271, 0x18B0, 0x8272, 0x09ED,
- 0x8276, 0x0512, 0x8277, 0x18B1, 0x8278, 0x18B2, 0x8279, 0x3775,
- 0x827E, 0x18B3, 0x828B, 0x04B6, 0x828D, 0x18B4, 0x828E, 0x3AC3,
- 0x8292, 0x18B5, 0x8299, 0x0DD9, 0x829D, 0x08F3, 0x829F, 0x18B7,
- 0x82A5, 0x0587, 0x82A6, 0x0476, 0x82AB, 0x18B6, 0x82AC, 0x18B9,
- 0x82AD, 0x0D04, 0x82AE, 0x3AC4, 0x82AF, 0x0A0A, 0x82B1, 0x0556,
- 0x82B3, 0x0E55, 0x82B7, 0x3AC5, 0x82B8, 0x0733, 0x82B9, 0x06D4,
- 0x82BB, 0x18B8, 0x82BD, 0x056A, 0x82BE, 0x3AC6, 0x82C5, 0x05DF,
- 0x82C6, 0x3AC7, 0x82D1, 0x0513, 0x82D2, 0x18BD, 0x82D3, 0x0FB2,
- 0x82D4, 0x0B3D, 0x82D7, 0x0DB6, 0x82D9, 0x18C9, 0x82DB, 0x0557,
- 0x82DC, 0x18C7, 0x82DE, 0x18C5, 0x82DF, 0x18BC, 0x82E1, 0x18BA,
- 0x82E3, 0x18BB, 0x82E5, 0x090F, 0x82E6, 0x06E4, 0x82E7, 0x0BB5,
- 0x82EB, 0x0CA9, 0x82F1, 0x04F3, 0x82F3, 0x18BF, 0x82F4, 0x18BE,
- 0x82F9, 0x18C4, 0x82FA, 0x18C0, 0x82FB, 0x18C3, 0x82FE, 0x3AC8,
- 0x8301, 0x2198, 0x8302, 0x0EDC, 0x8303, 0x18C2, 0x8304, 0x0558,
- 0x8305, 0x05DB, 0x8306, 0x18C6, 0x8309, 0x18C8, 0x830E, 0x072A,
- 0x8316, 0x18CC, 0x8317, 0x18D5, 0x8318, 0x18D6, 0x831C, 0x046F,
- 0x8323, 0x18DD, 0x8328, 0x04B5, 0x832B, 0x18D4, 0x832F, 0x18D3,
- 0x8331, 0x18CE, 0x8332, 0x18CD, 0x8334, 0x18CB, 0x8335, 0x18CA,
- 0x8336, 0x0BA1, 0x8338, 0x0B5B, 0x8339, 0x18D0, 0x8340, 0x18CF,
- 0x8343, 0x3AC9, 0x8345, 0x18D2, 0x8349, 0x0AF2, 0x834A, 0x072B,
- 0x834F, 0x04E3, 0x8350, 0x18D1, 0x8351, 0x3ACA, 0x8352, 0x07E5,
- 0x8355, 0x3ACB, 0x8358, 0x0AF3, 0x8362, 0x2199, 0x8373, 0x18E3,
- 0x8375, 0x18E4, 0x8377, 0x0559, 0x837B, 0x052E, 0x837C, 0x18E1,
- 0x837F, 0x219A, 0x8385, 0x18D7, 0x8386, 0x3ACC, 0x8387, 0x18DF,
- 0x8389, 0x18E6, 0x838A, 0x18E0, 0x838D, 0x3ACD, 0x838E, 0x18DE,
- 0x8392, 0x3ACE, 0x8393, 0x18C1, 0x8396, 0x18DC, 0x8398, 0x3ACF,
- 0x839A, 0x18D8, 0x839E, 0x060C, 0x839F, 0x18DA, 0x83A0, 0x18E5,
- 0x83A2, 0x18DB, 0x83A8, 0x18E7, 0x83A9, 0x3AD0, 0x83AA, 0x18D9,
- 0x83AB, 0x0D32, 0x83B1, 0x0F53, 0x83B5, 0x18E2, 0x83BD, 0x18F8,
- 0x83BF, 0x3AD1, 0x83C0, 0x3AD2, 0x83C1, 0x18F0, 0x83C5, 0x0A41,
- 0x83C7, 0x219B, 0x83CA, 0x0660, 0x83CC, 0x06D5, 0x83CE, 0x18EB,
- 0x83D3, 0x055B, 0x83D6, 0x09BC, 0x83D8, 0x18EE, 0x83DC, 0x084A,
- 0x83DF, 0x0C4B, 0x83E0, 0x18F3, 0x83E9, 0x0E3E, 0x83EA, 0x3AD3,
- 0x83EB, 0x18EA, 0x83EF, 0x055A, 0x83F0, 0x078A, 0x83F1, 0x0D9B,
- 0x83F2, 0x18F4, 0x83F4, 0x18E8, 0x83F6, 0x219C, 0x83F7, 0x18F1,
- 0x83FB, 0x18FB, 0x83FD, 0x18EC, 0x8403, 0x18ED, 0x8404, 0x0C92,
- 0x8407, 0x18F2, 0x840A, 0x1E7F, 0x840B, 0x18EF, 0x840C, 0x0E56,
- 0x840D, 0x18F5, 0x840E, 0x04A4, 0x840F, 0x3AD4, 0x8411, 0x3AD5,
- 0x8413, 0x18E9, 0x8420, 0x18F7, 0x8422, 0x18F6, 0x8429, 0x0D21,
- 0x842A, 0x18FD, 0x842C, 0x1908, 0x8431, 0x05DC, 0x8435, 0x190B,
- 0x8438, 0x18F9, 0x843C, 0x18FE, 0x843D, 0x0F58, 0x8446, 0x1907,
- 0x8448, 0x219D, 0x8449, 0x0F3F, 0x844A, 0x3AD6, 0x844E, 0x0F72,
- 0x8457, 0x0BB6, 0x845B, 0x05C9, 0x8461, 0x0DE4, 0x8462, 0x190D,
- 0x8463, 0x0C79, 0x8466, 0x0475, 0x8469, 0x1906, 0x846B, 0x1902,
- 0x846C, 0x0AF4, 0x846D, 0x18FC, 0x846E, 0x1904, 0x846F, 0x1909,
- 0x8471, 0x0CE2, 0x8475, 0x046E, 0x8476, 0x3AD7, 0x8477, 0x1901,
- 0x8479, 0x190A, 0x847A, 0x0DEA, 0x8482, 0x1905, 0x8484, 0x1900,
- 0x848B, 0x09BD, 0x8490, 0x0939, 0x8494, 0x08D8, 0x8499, 0x0EE4,
- 0x849C, 0x0DB9, 0x849F, 0x1910, 0x84A1, 0x1919, 0x84A8, 0x3AD8,
- 0x84AD, 0x1903, 0x84AF, 0x3AD9, 0x84B2, 0x05D5, 0x84B4, 0x219E,
- 0x84B8, 0x09E0, 0x84B9, 0x190E, 0x84BB, 0x1913, 0x84BC, 0x0AF5,
- 0x84BF, 0x190F, 0x84C0, 0x3ADA, 0x84C1, 0x1916, 0x84C2, 0x3ADB,
- 0x84C4, 0x0B9D, 0x84C6, 0x1917, 0x84C9, 0x0F40, 0x84CA, 0x190C,
- 0x84CB, 0x0596, 0x84CD, 0x1912, 0x84D0, 0x1915, 0x84D1, 0x0EB8,
- 0x84D6, 0x1918, 0x84D9, 0x1911, 0x84DA, 0x1914, 0x84DC, 0x20AB,
- 0x84EC, 0x0E57, 0x84EE, 0x0FC7, 0x84F0, 0x3ADC, 0x84F4, 0x191C,
- 0x84FC, 0x1923, 0x84FD, 0x3ADD, 0x84FF, 0x191B, 0x8500, 0x08EF,
- 0x8506, 0x18FA, 0x850C, 0x3ADE, 0x8511, 0x0E1E, 0x8513, 0x0EAE,
- 0x8514, 0x1922, 0x8515, 0x1921, 0x8517, 0x191D, 0x8518, 0x191E,
- 0x851A, 0x04D8, 0x851F, 0x1920, 0x8521, 0x191A, 0x8523, 0x1E1A,
- 0x8526, 0x0BF1, 0x852C, 0x191F, 0x852D, 0x04C2, 0x8534, 0x3ADF,
- 0x8535, 0x0B02, 0x853D, 0x0E13, 0x853E, 0x1EB5, 0x8540, 0x1924,
- 0x8541, 0x1928, 0x8543, 0x0D6D, 0x8548, 0x1927, 0x8549, 0x09BE,
- 0x854A, 0x08F5, 0x854B, 0x192A, 0x854E, 0x06B6, 0x8553, 0x219F,
- 0x8555, 0x192B, 0x8557, 0x0DEB, 0x8558, 0x1926, 0x8559, 0x21A0,
- 0x855A, 0x18FF, 0x855E, 0x3AE0, 0x8563, 0x1925, 0x8568, 0x0FF5,
- 0x8569, 0x0C7A, 0x856A, 0x0DE5, 0x856B, 0x21A1, 0x856D, 0x1932,
- 0x8577, 0x1938, 0x857E, 0x1939, 0x8580, 0x192C, 0x8584, 0x0D2C,
- 0x8587, 0x1936, 0x8588, 0x192E, 0x858A, 0x1930, 0x858F, 0x3AE1,
- 0x8590, 0x193A, 0x8591, 0x192F, 0x8594, 0x1933, 0x8597, 0x0514,
- 0x8599, 0x0CBD, 0x859B, 0x1934, 0x859C, 0x1937, 0x85A4, 0x192D,
- 0x85A6, 0x0AA8, 0x85A8, 0x1931, 0x85A9, 0x0875, 0x85AA, 0x0A0B,
- 0x85AB, 0x0706, 0x85AC, 0x0F00, 0x85AD, 0x3AE4, 0x85AE, 0x0F05,
- 0x85AF, 0x097C, 0x85B0, 0x21A3, 0x85B7, 0x3AE2, 0x85B9, 0x193E,
- 0x85BA, 0x193C, 0x85C1, 0x0FF4, 0x85C9, 0x193B, 0x85CD, 0x0F5F,
- 0x85CE, 0x3AE3, 0x85CF, 0x193D, 0x85D0, 0x193F, 0x85D5, 0x1940,
- 0x85DC, 0x1943, 0x85DD, 0x1941, 0x85E4, 0x0C7B, 0x85E5, 0x1942,
- 0x85E9, 0x0D61, 0x85EA, 0x1935, 0x85F4, 0x3780, 0x85F7, 0x097D,
- 0x85F9, 0x1944, 0x85FA, 0x1949, 0x85FB, 0x0AF6, 0x85FE, 0x1948,
- 0x8602, 0x1929, 0x8606, 0x194A, 0x8607, 0x0ACB, 0x860A, 0x1945,
- 0x860B, 0x1947, 0x8612, 0x3AE5, 0x8613, 0x1946, 0x8616, 0x14D0,
- 0x8617, 0x14C1, 0x861A, 0x194C, 0x8622, 0x194B, 0x8629, 0x3AE6,
- 0x862D, 0x0F60, 0x862F, 0x16B1, 0x8630, 0x194D, 0x863F, 0x194E,
- 0x864D, 0x194F, 0x864E, 0x078B, 0x8650, 0x066E, 0x8652, 0x3AE7,
- 0x8654, 0x1951, 0x8655, 0x1094, 0x865A, 0x068F, 0x865B, 0x3418,
- 0x865C, 0x0F82, 0x865E, 0x06EB, 0x865F, 0x1952, 0x8663, 0x3AE8,
- 0x8667, 0x1953, 0x866B, 0x0BAC, 0x866C, 0x3AE9, 0x866F, 0x3AEA,
- 0x8671, 0x1954, 0x8679, 0x0CD2, 0x867A, 0x3AEB, 0x867B, 0x047E,
- 0x867D, 0x3786, 0x868A, 0x0563, 0x868B, 0x1959, 0x868C, 0x195A,
- 0x868D, 0x3AEC, 0x8691, 0x3AED, 0x8693, 0x1955, 0x8695, 0x088B,
- 0x8698, 0x3AEE, 0x86A3, 0x1956, 0x86A4, 0x0CF8, 0x86A7, 0x3AEF,
- 0x86A8, 0x3AF0, 0x86A9, 0x1957, 0x86AA, 0x1958, 0x86AB, 0x1962,
- 0x86AF, 0x195C, 0x86B0, 0x195F, 0x86B6, 0x195B, 0x86C4, 0x195D,
- 0x86C6, 0x195E, 0x86C7, 0x0904, 0x86C9, 0x1960, 0x86CB, 0x0B7F,
- 0x86CD, 0x072C, 0x86CE, 0x05A0, 0x86D4, 0x1963, 0x86D9, 0x059D,
- 0x86DB, 0x1968, 0x86DE, 0x1964, 0x86DF, 0x1967, 0x86E4, 0x0D4E,
- 0x86E9, 0x1965, 0x86EC, 0x1966, 0x86ED, 0x0DBA, 0x86EE, 0x0D6E,
- 0x86EF, 0x1969, 0x86F8, 0x0B5D, 0x86F9, 0x1973, 0x86FA, 0x3AF1,
- 0x86FB, 0x196F, 0x86FD, 0x3AF2, 0x86FE, 0x056B, 0x8700, 0x196D,
- 0x8702, 0x0E58, 0x8703, 0x196E, 0x8706, 0x196B, 0x8708, 0x196C,
- 0x8709, 0x1971, 0x870A, 0x1974, 0x870B, 0x3AF3, 0x870D, 0x1972,
- 0x8711, 0x1970, 0x8712, 0x196A, 0x8713, 0x3AF4, 0x8718, 0x0B96,
- 0x8719, 0x3AF5, 0x871A, 0x197B, 0x871C, 0x0EB6, 0x871E, 0x3AF6,
- 0x8725, 0x1979, 0x8728, 0x3AF7, 0x8729, 0x197A, 0x8734, 0x1975,
- 0x8737, 0x1977, 0x873B, 0x1978, 0x873E, 0x3AF8, 0x873F, 0x1976,
- 0x8749, 0x0A8A, 0x874B, 0x0FDF, 0x874C, 0x197F, 0x874E, 0x1980,
- 0x8753, 0x1986, 0x8755, 0x09F0, 0x8757, 0x1982, 0x8759, 0x1985,
- 0x875F, 0x197D, 0x8760, 0x197C, 0x8763, 0x1987, 0x8766, 0x055C,
- 0x8768, 0x1983, 0x876A, 0x1988, 0x876E, 0x1984, 0x8771, 0x3AF9,
- 0x8774, 0x1981, 0x8776, 0x0BCF, 0x8778, 0x197E, 0x877F, 0x0D1E,
- 0x8782, 0x198C, 0x8788, 0x3AFA, 0x878D, 0x0F25, 0x8799, 0x3AFB,
- 0x879F, 0x198B, 0x87A2, 0x198A, 0x87AB, 0x1993, 0x87AC, 0x3AFC,
- 0x87AD, 0x3AFD, 0x87AF, 0x198D, 0x87B3, 0x1995, 0x87B5, 0x3AFE,
- 0x87BA, 0x0F50, 0x87BB, 0x1998, 0x87BD, 0x198F, 0x87C0, 0x1990,
- 0x87C4, 0x1994, 0x87C6, 0x1997, 0x87C7, 0x1996, 0x87CB, 0x198E,
- 0x87D0, 0x1991, 0x87D2, 0x19A2, 0x87D6, 0x3AFF, 0x87E0, 0x199B,
- 0x87EB, 0x3B00, 0x87EC, 0x1E23, 0x87ED, 0x3B01, 0x87EF, 0x1999,
- 0x87F2, 0x199A, 0x87F5, 0x3C3D, 0x87F6, 0x199F, 0x87F7, 0x19A0,
- 0x87F9, 0x0588, 0x87FB, 0x065C, 0x87FE, 0x199E, 0x8801, 0x3B02,
- 0x8803, 0x3B03, 0x8805, 0x1989, 0x8806, 0x3B04, 0x8807, 0x21A6,
- 0x880B, 0x3B05, 0x880D, 0x199D, 0x880E, 0x19A1, 0x880F, 0x199C,
- 0x8811, 0x19A3, 0x8814, 0x3B06, 0x8815, 0x19A5, 0x8816, 0x19A4,
- 0x881C, 0x3B07, 0x881F, 0x1E85, 0x8821, 0x19A7, 0x8822, 0x19A6,
- 0x8823, 0x1961, 0x8827, 0x19AB, 0x8831, 0x19A8, 0x8836, 0x19A9,
- 0x8839, 0x19AA, 0x883B, 0x19AC, 0x8840, 0x0742, 0x8842, 0x19AE,
- 0x8844, 0x19AD, 0x8846, 0x093A, 0x884C, 0x07E6, 0x884D, 0x1524,
- 0x8852, 0x19AF, 0x8853, 0x095B, 0x8856, 0x3B08, 0x8857, 0x0597,
- 0x8859, 0x19B0, 0x885B, 0x04F4, 0x885D, 0x09BF, 0x885E, 0x19B1,
- 0x885F, 0x3B09, 0x8861, 0x07E7, 0x8862, 0x19B2, 0x8863, 0x04A5,
- 0x8864, 0x3B0A, 0x8868, 0x0DAF, 0x886B, 0x19B3, 0x8870, 0x0A30,
- 0x8872, 0x19BA, 0x8875, 0x19B7, 0x8877, 0x0BAD, 0x887D, 0x19B8,
- 0x887E, 0x19B5, 0x887F, 0x06D6, 0x8881, 0x19B4, 0x8882, 0x19BB,
- 0x8888, 0x070C, 0x888B, 0x0B3E, 0x888D, 0x19C1, 0x8892, 0x19BD,
- 0x8896, 0x0B15, 0x8897, 0x19BC, 0x8898, 0x3B0B, 0x8899, 0x19BF,
- 0x889E, 0x19B6, 0x88A2, 0x19C0, 0x88A4, 0x19C2, 0x88AA, 0x3B0C,
- 0x88AB, 0x0D83, 0x88AE, 0x19BE, 0x88B0, 0x19C3, 0x88B1, 0x19C5,
- 0x88B4, 0x0787, 0x88B5, 0x19B9, 0x88B7, 0x0485, 0x88BD, 0x3B0D,
- 0x88BE, 0x3B0E, 0x88BF, 0x19C4, 0x88C1, 0x084B, 0x88C2, 0x0FBE,
- 0x88C3, 0x19C6, 0x88C4, 0x19C7, 0x88C5, 0x0AF7, 0x88C6, 0x3789,
- 0x88CA, 0x3B0F, 0x88CF, 0x0F6A, 0x88D2, 0x3B10, 0x88D4, 0x19C8,
- 0x88D5, 0x0F1F, 0x88D8, 0x19C9, 0x88D9, 0x19CA, 0x88DB, 0x3B11,
- 0x88DC, 0x0E34, 0x88DD, 0x19CB, 0x88DF, 0x0830, 0x88E1, 0x0F6B,
- 0x88E8, 0x19D0, 0x88F0, 0x3B12, 0x88F1, 0x3B13, 0x88F2, 0x19D1,
- 0x88F3, 0x09C0, 0x88F4, 0x19CF, 0x88F5, 0x21A7, 0x88F8, 0x0F51,
- 0x88F9, 0x19CC, 0x88FC, 0x19CE, 0x88FD, 0x0A61, 0x88FE, 0x0A44,
- 0x8902, 0x19CD, 0x8904, 0x19D2, 0x8906, 0x3B14, 0x8907, 0x0DF3,
- 0x890A, 0x19D4, 0x890C, 0x19D3, 0x8910, 0x05CA, 0x8912, 0x0E59,
- 0x8913, 0x19D5, 0x8918, 0x3B15, 0x8919, 0x3B16, 0x891A, 0x3B17,
- 0x891C, 0x20A8, 0x891D, 0x19E1, 0x891E, 0x19D7, 0x8925, 0x19D8,
- 0x8927, 0x3B18, 0x892A, 0x19D9, 0x892B, 0x19DA, 0x8930, 0x3B19,
- 0x8936, 0x19DE, 0x8938, 0x19DF, 0x893B, 0x19DD, 0x893E, 0x3B1A,
- 0x8941, 0x19DB, 0x8943, 0x19D6, 0x8944, 0x19DC, 0x894C, 0x19E0,
- 0x894D, 0x1BD0, 0x8956, 0x0528, 0x895E, 0x19E3, 0x895F, 0x06D7,
- 0x8960, 0x19E2, 0x8964, 0x19E5, 0x8966, 0x19E4, 0x896A, 0x19E7,
- 0x896D, 0x19E6, 0x896F, 0x19E8, 0x8972, 0x093B, 0x8974, 0x19E9,
- 0x8977, 0x19EA, 0x897B, 0x3B1B, 0x897E, 0x19EB, 0x897F, 0x0A62,
- 0x8980, 0x362E, 0x8981, 0x0F41, 0x8983, 0x19EC, 0x8986, 0x0DF4,
- 0x8987, 0x0CFC, 0x8988, 0x19ED, 0x898A, 0x19EE, 0x898B, 0x075F,
- 0x898F, 0x0646, 0x8993, 0x19EF, 0x8996, 0x08B9, 0x8997, 0x0CF7,
- 0x8998, 0x19F0, 0x899A, 0x05AE, 0x89A1, 0x19F1, 0x89A6, 0x19F3,
- 0x89A7, 0x0F61, 0x89A9, 0x19F2, 0x89AA, 0x0A0C, 0x89AC, 0x19F4,
- 0x89AF, 0x19F5, 0x89B2, 0x19F6, 0x89B3, 0x060D, 0x89BA, 0x19F7,
- 0x89BD, 0x19F8, 0x89BF, 0x19F9, 0x89C0, 0x19FA, 0x89D2, 0x05AF,
- 0x89D4, 0x3B1C, 0x89D6, 0x3B1D, 0x89DA, 0x19FB, 0x89DC, 0x19FC,
- 0x89DD, 0x19FD, 0x89E3, 0x0572, 0x89E5, 0x3B1E, 0x89E6, 0x09EE,
- 0x89E7, 0x19FE, 0x89F1, 0x3B1F, 0x89F4, 0x19FF, 0x89F8, 0x1A00,
- 0x8A00, 0x0774, 0x8A01, 0x35BC, 0x8A02, 0x0C17, 0x8A03, 0x1A01,
- 0x8A07, 0x3B20, 0x8A08, 0x072D, 0x8A0A, 0x0A1C, 0x8A0C, 0x1A04,
- 0x8A0E, 0x0C7C, 0x8A0F, 0x3B21, 0x8A10, 0x1A03, 0x8A12, 0x21A8,
- 0x8A13, 0x0707, 0x8A15, 0x3B22, 0x8A16, 0x1A02, 0x8A17, 0x0B57,
- 0x8A18, 0x0647, 0x8A1B, 0x1A05, 0x8A1D, 0x1A06, 0x8A1F, 0x09C1,
- 0x8A22, 0x3B23, 0x8A23, 0x0743, 0x8A25, 0x1A07, 0x8A2A, 0x0E5A,
- 0x8A2D, 0x0A83, 0x8A31, 0x0690, 0x8A33, 0x0F01, 0x8A34, 0x0ACC,
- 0x8A36, 0x1A08, 0x8A37, 0x21A9, 0x8A3A, 0x0A0D, 0x8A3B, 0x0BAE,
- 0x8A3C, 0x09C2, 0x8A41, 0x1A09, 0x8A46, 0x1A0C, 0x8A48, 0x1A0D,
- 0x8A4E, 0x3B24, 0x8A50, 0x082E, 0x8A51, 0x0B22, 0x8A52, 0x1A0B,
- 0x8A54, 0x09C3, 0x8A55, 0x0DB0, 0x8A5B, 0x1A0A, 0x8A5E, 0x08BA,
- 0x8A60, 0x04F5, 0x8A62, 0x1A11, 0x8A63, 0x072E, 0x8A66, 0x08BC,
- 0x8A69, 0x08BB, 0x8A6B, 0x0FF3, 0x8A6C, 0x1A10, 0x8A6D, 0x1A0F,
- 0x8A6E, 0x0AA9, 0x8A70, 0x0667, 0x8A71, 0x0FE9, 0x8A72, 0x0598,
- 0x8A73, 0x09C4, 0x8A79, 0x21AA, 0x8A7C, 0x1A0E, 0x8A7F, 0x3B25,
- 0x8A82, 0x1A13, 0x8A84, 0x1A14, 0x8A85, 0x1A12, 0x8A87, 0x078C,
- 0x8A89, 0x0F2A, 0x8A8C, 0x08BD, 0x8A8D, 0x0CDD, 0x8A91, 0x1A17,
- 0x8A93, 0x0A64, 0x8A95, 0x0B80, 0x8A98, 0x0F20, 0x8A9A, 0x1A1A,
- 0x8A9E, 0x07A0, 0x8AA0, 0x0A63, 0x8AA1, 0x1A16, 0x8AA3, 0x1A1B,
- 0x8AA4, 0x07A1, 0x8AA5, 0x1A18, 0x8AA6, 0x1A19, 0x8AA7, 0x21AB,
- 0x8AA8, 0x1A15, 0x8AAA, 0x3638, 0x8AAC, 0x0A86, 0x8AAD, 0x0CA1,
- 0x8AB0, 0x0B6D, 0x8AB2, 0x055D, 0x8AB9, 0x0D84, 0x8ABC, 0x065D,
- 0x8ABE, 0x21AC, 0x8ABF, 0x0BD0, 0x8AC2, 0x1A1E, 0x8AC4, 0x1A1C,
- 0x8AC7, 0x0B8A, 0x8ACB, 0x0A65, 0x8ACC, 0x060E, 0x8ACD, 0x1A1D,
- 0x8ACF, 0x0A21, 0x8AD2, 0x0F92, 0x8AD6, 0x0FE6, 0x8ADA, 0x1A1F,
- 0x8ADB, 0x1A2A, 0x8ADC, 0x0BD1, 0x8ADE, 0x1A29, 0x8ADF, 0x21AD,
- 0x8AE0, 0x1A26, 0x8AE1, 0x1A2E, 0x8AE2, 0x1A27, 0x8AE4, 0x1A23,
- 0x8AE6, 0x0C18, 0x8AE7, 0x1A22, 0x8AEB, 0x1A20, 0x8AED, 0x0F0B,
- 0x8AEE, 0x08BE, 0x8AF1, 0x1A24, 0x8AF3, 0x1A21, 0x8AF4, 0x3B26,
- 0x8AF6, 0x21AF, 0x8AF7, 0x1A28, 0x8AF8, 0x097E, 0x8AFA, 0x0775,
- 0x8AFE, 0x0B5A, 0x8B00, 0x0E73, 0x8B01, 0x04FC, 0x8B02, 0x04A6,
- 0x8B04, 0x0C7D, 0x8B07, 0x1A2C, 0x8B0C, 0x1A2B, 0x8B0E, 0x0CBE,
- 0x8B10, 0x1A30, 0x8B14, 0x1A25, 0x8B16, 0x1A2F, 0x8B17, 0x1A31,
- 0x8B19, 0x0760, 0x8B1A, 0x1A2D, 0x8B1B, 0x07E8, 0x8B1D, 0x0901,
- 0x8B1F, 0x3B27, 0x8B20, 0x1A32, 0x8B21, 0x0F42, 0x8B26, 0x1A35,
- 0x8B28, 0x1A38, 0x8B2B, 0x1A36, 0x8B2C, 0x0DA7, 0x8B33, 0x1A33,
- 0x8B37, 0x3B28, 0x8B39, 0x06D8, 0x8B3E, 0x1A37, 0x8B41, 0x1A39,
- 0x8B43, 0x3B29, 0x8B44, 0x3B2A, 0x8B49, 0x1A3D, 0x8B4C, 0x1A3A,
- 0x8B4E, 0x1A3C, 0x8B4F, 0x1A3B, 0x8B53, 0x21B0, 0x8B54, 0x3B2B,
- 0x8B56, 0x1A3E, 0x8B58, 0x08DD, 0x8B5A, 0x1A40, 0x8B5B, 0x1A3F,
- 0x8B5C, 0x0DDA, 0x8B5F, 0x1A42, 0x8B66, 0x072F, 0x8B6B, 0x1A41,
- 0x8B6C, 0x1A43, 0x8B6F, 0x1A44, 0x8B70, 0x065E, 0x8B71, 0x182E,
- 0x8B72, 0x09E1, 0x8B74, 0x1A45, 0x8B77, 0x07A2, 0x8B7D, 0x1A46,
- 0x8B7F, 0x21B1, 0x8B80, 0x1A47, 0x8B83, 0x088C, 0x8B8A, 0x13D3,
- 0x8B8C, 0x1A48, 0x8B8E, 0x1A49, 0x8B90, 0x093C, 0x8B92, 0x1A4A,
- 0x8B93, 0x1A4B, 0x8B96, 0x1A4C, 0x8B99, 0x1A4D, 0x8B9A, 0x1A4E,
- 0x8B9C, 0x3B2C, 0x8B9E, 0x3B2D, 0x8C37, 0x0B69, 0x8C3A, 0x1A4F,
- 0x8C3F, 0x1A51, 0x8C41, 0x1A50, 0x8C46, 0x0C7E, 0x8C47, 0x3B2E,
- 0x8C48, 0x1A52, 0x8C4A, 0x0E5B, 0x8C4C, 0x1A53, 0x8C4E, 0x1A54,
- 0x8C50, 0x1A55, 0x8C54, 0x3B2F, 0x8C55, 0x1A56, 0x8C5A, 0x0CB2,
- 0x8C61, 0x09C5, 0x8C62, 0x1A57, 0x8C6A, 0x07FD, 0x8C6B, 0x1007,
- 0x8C6C, 0x1A58, 0x8C73, 0x3B30, 0x8C78, 0x1A59, 0x8C79, 0x0DB1,
- 0x8C7A, 0x1A5A, 0x8C7C, 0x1A62, 0x8C82, 0x1A5B, 0x8C85, 0x1A5D,
- 0x8C89, 0x1A5C, 0x8C8A, 0x1A5E, 0x8C8C, 0x0E74, 0x8C8D, 0x1A5F,
- 0x8C8E, 0x1A60, 0x8C94, 0x1A61, 0x8C98, 0x1A63, 0x8C9D, 0x058B,
- 0x8C9E, 0x0C03, 0x8CA0, 0x0DDB, 0x8CA1, 0x0852, 0x8CA2, 0x07E9,
- 0x8CA4, 0x3B31, 0x8CA7, 0x0DC1, 0x8CA8, 0x055F, 0x8CA9, 0x0D62,
- 0x8CAA, 0x1A66, 0x8CAB, 0x060F, 0x8CAC, 0x0A79, 0x8CAD, 0x1A65,
- 0x8CAE, 0x1A6A, 0x8CAF, 0x0BB7, 0x8CB0, 0x0EEF, 0x8CB2, 0x1A68,
- 0x8CB3, 0x1A69, 0x8CB4, 0x0648, 0x8CB6, 0x1A6B, 0x8CB7, 0x0D19,
- 0x8CB8, 0x0B3F, 0x8CBB, 0x0D85, 0x8CBC, 0x0C37, 0x8CBD, 0x1A67,
- 0x8CBF, 0x0E75, 0x8CC0, 0x056C, 0x8CC1, 0x1A6D, 0x8CC2, 0x0FCE,
- 0x8CC3, 0x0BDE, 0x8CC4, 0x0FEB, 0x8CC7, 0x08BF, 0x8CC8, 0x1A6C,
- 0x8CCA, 0x0B11, 0x8CCD, 0x1A7D, 0x8CCE, 0x0AAA, 0x8CD1, 0x0CD0,
- 0x8CD3, 0x0DC2, 0x8CD9, 0x3B32, 0x8CDA, 0x1A70, 0x8CDB, 0x088D,
- 0x8CDC, 0x08C0, 0x8CDE, 0x09C6, 0x8CE0, 0x0D1B, 0x8CE1, 0x3B33,
- 0x8CE2, 0x0761, 0x8CE3, 0x1A6F, 0x8CE4, 0x1A6E, 0x8CE6, 0x0DDC,
- 0x8CEA, 0x08ED, 0x8CED, 0x0C4C, 0x8CF0, 0x21B2, 0x8CF4, 0x21B3,
- 0x8CF8, 0x3B34, 0x8CFA, 0x1A72, 0x8CFB, 0x1A73, 0x8CFC, 0x07EA,
- 0x8CFD, 0x1A71, 0x8CFE, 0x3B35, 0x8D04, 0x1A74, 0x8D05, 0x1A75,
- 0x8D07, 0x1A77, 0x8D08, 0x0B03, 0x8D0A, 0x1A76, 0x8D0B, 0x0622,
- 0x8D0D, 0x1A79, 0x8D0F, 0x1A78, 0x8D10, 0x1A7A, 0x8D12, 0x21B4,
- 0x8D13, 0x1A7C, 0x8D14, 0x1A7E, 0x8D16, 0x1A7F, 0x8D1B, 0x3B36,
- 0x8D64, 0x0A7A, 0x8D66, 0x08FB, 0x8D67, 0x1A80, 0x8D69, 0x3B37,
- 0x8D6B, 0x05B0, 0x8D6C, 0x3B38, 0x8D6D, 0x1A81, 0x8D70, 0x0AF8,
- 0x8D71, 0x1A82, 0x8D73, 0x1A83, 0x8D74, 0x0DDD, 0x8D76, 0x21B5,
- 0x8D77, 0x0649, 0x8D81, 0x1A84, 0x8D84, 0x3B39, 0x8D85, 0x0BD2,
- 0x8D8A, 0x04FD, 0x8D8D, 0x3B3A, 0x8D95, 0x3B3B, 0x8D99, 0x1A85,
- 0x8DA3, 0x091D, 0x8DA6, 0x3B3C, 0x8DA8, 0x0A3C, 0x8DB3, 0x0B0D,
- 0x8DBA, 0x1A88, 0x8DBE, 0x1A87, 0x8DC2, 0x1A86, 0x8DC6, 0x3B3D,
- 0x8DCB, 0x1A8E, 0x8DCC, 0x1A8C, 0x8DCE, 0x3B3E, 0x8DCF, 0x1A89,
- 0x8DD6, 0x1A8B, 0x8DDA, 0x1A8A, 0x8DDB, 0x1A8D, 0x8DDD, 0x0691,
- 0x8DDF, 0x1A91, 0x8DE1, 0x0A7B, 0x8DE3, 0x1A92, 0x8DE4, 0x3B3F,
- 0x8DE8, 0x078D, 0x8DEA, 0x1A8F, 0x8DEB, 0x1A90, 0x8DEC, 0x3B40,
- 0x8DEF, 0x0FCF, 0x8DF3, 0x0BD3, 0x8DF5, 0x0AAB, 0x8DFC, 0x1A93,
- 0x8DFF, 0x1A96, 0x8E08, 0x1A94, 0x8E09, 0x1A95, 0x8E0A, 0x0F43,
- 0x8E0F, 0x0C7F, 0x8E10, 0x1A99, 0x8E1D, 0x1A97, 0x8E1E, 0x1A98,
- 0x8E1F, 0x1A9A, 0x8E20, 0x3B41, 0x8E2A, 0x1AA8, 0x8E30, 0x1A9D,
- 0x8E34, 0x1A9E, 0x8E35, 0x1A9C, 0x8E42, 0x1A9B, 0x8E44, 0x0C19,
- 0x8E47, 0x1AA0, 0x8E48, 0x1AA4, 0x8E49, 0x1AA1, 0x8E4A, 0x1A9F,
- 0x8E4B, 0x3B42, 0x8E4C, 0x1AA2, 0x8E50, 0x1AA3, 0x8E55, 0x1AAA,
- 0x8E59, 0x1AA5, 0x8E5F, 0x0A7C, 0x8E60, 0x1AA7, 0x8E63, 0x1AA9,
- 0x8E64, 0x1AA6, 0x8E6C, 0x3B43, 0x8E70, 0x3B44, 0x8E72, 0x1AAC,
- 0x8E74, 0x093D, 0x8E76, 0x1AAB, 0x8E7A, 0x3B45, 0x8E7C, 0x1AAD,
- 0x8E81, 0x1AAE, 0x8E84, 0x1AB1, 0x8E85, 0x1AB0, 0x8E87, 0x1AAF,
- 0x8E8A, 0x1AB3, 0x8E8B, 0x1AB2, 0x8E8D, 0x0F02, 0x8E91, 0x1AB5,
- 0x8E92, 0x3B46, 0x8E93, 0x1AB4, 0x8E94, 0x1AB6, 0x8E99, 0x1AB7,
- 0x8EA1, 0x1AB9, 0x8EAA, 0x1AB8, 0x8EAB, 0x0A0E, 0x8EAC, 0x1ABA,
- 0x8EAE, 0x3B47, 0x8EAF, 0x06E5, 0x8EB0, 0x1ABB, 0x8EB1, 0x1ABD,
- 0x8EB3, 0x3B48, 0x8EB6, 0x3703, 0x8EBE, 0x1ABE, 0x8EC0, 0x1DEF,
- 0x8EC5, 0x1ABF, 0x8EC6, 0x1ABC, 0x8EC8, 0x1AC0, 0x8ECA, 0x0902,
- 0x8ECB, 0x1AC1, 0x8ECC, 0x064A, 0x8ECD, 0x0709, 0x8ECF, 0x21B7,
- 0x8ED1, 0x3B49, 0x8ED2, 0x0762, 0x8ED4, 0x3B4A, 0x8EDB, 0x1AC2,
- 0x8EDF, 0x0CC8, 0x8EE2, 0x0C38, 0x8EE3, 0x1AC3, 0x8EEB, 0x1AC6,
- 0x8EF8, 0x08E0, 0x8EF9, 0x3B4B, 0x8EFB, 0x1AC5, 0x8EFC, 0x1AC4,
- 0x8EFD, 0x0730, 0x8EFE, 0x1AC7, 0x8F03, 0x05B1, 0x8F05, 0x1AC9,
- 0x8F09, 0x084C, 0x8F0A, 0x1AC8, 0x8F0C, 0x1AD1, 0x8F12, 0x1ACB,
- 0x8F13, 0x1ACD, 0x8F14, 0x0E35, 0x8F15, 0x1ACA, 0x8F17, 0x3B4C,
- 0x8F19, 0x1ACC, 0x8F1B, 0x1AD0, 0x8F1C, 0x1ACE, 0x8F1D, 0x064B,
- 0x8F1F, 0x1ACF, 0x8F26, 0x1AD2, 0x8F29, 0x0D10, 0x8F2A, 0x0FA0,
- 0x8F2F, 0x093E, 0x8F33, 0x1AD3, 0x8F36, 0x3B4D, 0x8F38, 0x0F0C,
- 0x8F39, 0x1AD5, 0x8F3B, 0x1AD4, 0x8F3E, 0x1AD8, 0x8F3F, 0x0F2B,
- 0x8F42, 0x1AD7, 0x8F44, 0x05CB, 0x8F45, 0x1AD6, 0x8F46, 0x1ADB,
- 0x8F49, 0x1ADA, 0x8F4C, 0x1AD9, 0x8F4D, 0x0C2C, 0x8F4E, 0x1ADC,
- 0x8F57, 0x1ADD, 0x8F5C, 0x1ADE, 0x8F5F, 0x07FE, 0x8F61, 0x06FB,
- 0x8F62, 0x1ADF, 0x8F63, 0x1AE0, 0x8F64, 0x1AE1, 0x8F9B, 0x0A0F,
- 0x8F9C, 0x1AE2, 0x8F9E, 0x08D9, 0x8F9F, 0x1AE3, 0x8FA3, 0x1AE4,
- 0x8FA6, 0x3B4E, 0x8FA7, 0x10B6, 0x8FA8, 0x10B5, 0x8FAD, 0x1AE5,
- 0x8FAE, 0x17FF, 0x8FAF, 0x1AE6, 0x8FB0, 0x0B62, 0x8FB1, 0x09F1,
- 0x8FB2, 0x0CF6, 0x8FB5, 0x3B4F, 0x8FB6, 0x3B50, 0x8FB7, 0x1AE7,
- 0x8FBA, 0x0E25, 0x8FBB, 0x0BF0, 0x8FBC, 0x0810, 0x8FBF, 0x0B67,
- 0x8FC2, 0x04CC, 0x8FC4, 0x0EA6, 0x8FC5, 0x0A1D, 0x8FC6, 0x3B51,
- 0x8FC8, 0x3799, 0x8FCE, 0x0734, 0x8FD1, 0x06D9, 0x8FD4, 0x0E26,
- 0x8FDA, 0x1AE8, 0x8FE0, 0x3B52, 0x8FE2, 0x1AEA, 0x8FE4, 0x3B53,
- 0x8FE5, 0x1AE9, 0x8FE6, 0x0560, 0x8FE9, 0x0CCE, 0x8FEA, 0x1AEB,
- 0x8FEB, 0x0D2D, 0x8FED, 0x0C2D, 0x8FEF, 0x1AEC, 0x8FF0, 0x095C,
- 0x8FF4, 0x1AEE, 0x8FF6, 0x3B54, 0x8FF7, 0x0ECE, 0x8FF8, 0x1AFD,
- 0x8FF9, 0x1AF0, 0x8FFA, 0x1AF1, 0x8FFD, 0x0BE5, 0x9000, 0x0B40,
- 0x9001, 0x0AF9, 0x9002, 0x3B55, 0x9003, 0x0C80, 0x9005, 0x1AEF,
- 0x9006, 0x066F, 0x900B, 0x1AF8, 0x900D, 0x1AF5, 0x900E, 0x1B02,
- 0x900F, 0x0C81, 0x9010, 0x0B9E, 0x9011, 0x1AF2, 0x9013, 0x0C1A,
- 0x9014, 0x0C4D, 0x9015, 0x1AF3, 0x9016, 0x1AF7, 0x9017, 0x0A26,
- 0x9019, 0x0D1D, 0x901A, 0x0BE8, 0x901D, 0x0A66, 0x901E, 0x1AF6,
- 0x901F, 0x0B0E, 0x9020, 0x0B04, 0x9021, 0x1AF4, 0x9022, 0x046D,
- 0x9023, 0x0FC8, 0x9027, 0x1AF9, 0x902C, 0x3B56, 0x902E, 0x0B41,
- 0x9031, 0x093F, 0x9032, 0x0A10, 0x9035, 0x1AFB, 0x9036, 0x1AFA,
- 0x9038, 0x04B3, 0x9039, 0x1AFC, 0x903C, 0x0DA1, 0x903E, 0x1B04,
- 0x9041, 0x0CB3, 0x9042, 0x0A31, 0x9044, 0x3B57, 0x9045, 0x0B97,
- 0x9047, 0x06F0, 0x9049, 0x1B03, 0x904A, 0x0F21, 0x904B, 0x04E1,
- 0x904D, 0x0E27, 0x904E, 0x0561, 0x904F, 0x1AFE, 0x9050, 0x1AFF,
- 0x9051, 0x1B00, 0x9052, 0x1B01, 0x9053, 0x0C93, 0x9054, 0x0B61,
- 0x9055, 0x04A7, 0x9056, 0x1B05, 0x9058, 0x1B06, 0x9059, 0x1D34,
- 0x905C, 0x0B1D, 0x905E, 0x1B07, 0x9060, 0x0515, 0x9061, 0x0ACE,
- 0x9063, 0x0763, 0x9065, 0x0F44, 0x9067, 0x21BA, 0x9068, 0x1B08,
- 0x9069, 0x0C26, 0x906D, 0x0AFA, 0x906E, 0x0903, 0x906F, 0x1B09,
- 0x9072, 0x1B0C, 0x9075, 0x096F, 0x9076, 0x1B0A, 0x9077, 0x0AAD,
- 0x9078, 0x0AAC, 0x907A, 0x04A8, 0x907C, 0x0F93, 0x907D, 0x1B0E,
- 0x907F, 0x0D86, 0x9080, 0x1B10, 0x9081, 0x1B0F, 0x9082, 0x1B0D,
- 0x9083, 0x1737, 0x9084, 0x0610, 0x9087, 0x1AED, 0x9088, 0x3B58,
- 0x9089, 0x1B12, 0x908A, 0x1B11, 0x908F, 0x1B13, 0x9091, 0x0F22,
- 0x9095, 0x3B59, 0x9099, 0x3B5A, 0x909B, 0x3B5B, 0x90A2, 0x3B5C,
- 0x90A3, 0x0CB9, 0x90A6, 0x0E5C, 0x90A8, 0x1B14, 0x90AA, 0x0905,
- 0x90AF, 0x1B15, 0x90B1, 0x1B16, 0x90B4, 0x3B5D, 0x90B5, 0x1B17,
- 0x90B8, 0x0C1B, 0x90C1, 0x04AE, 0x90CA, 0x07EB, 0x90CE, 0x0FE0,
- 0x90D7, 0x3B5E, 0x90DB, 0x1B1B, 0x90DD, 0x3B5F, 0x90DE, 0x21BB,
- 0x90E1, 0x070A, 0x90E2, 0x1B18, 0x90E4, 0x1B19, 0x90E8, 0x0DE6,
- 0x90ED, 0x05B2, 0x90F4, 0x3B60, 0x90F5, 0x0F23, 0x90F7, 0x06B7,
- 0x90FD, 0x0C4E, 0x9102, 0x1B1C, 0x9112, 0x1B1D, 0x9115, 0x21BD,
- 0x9117, 0x3B61, 0x9119, 0x1B1E, 0x911C, 0x3B62, 0x9127, 0x21BE,
- 0x912D, 0x0C1C, 0x9130, 0x1B20, 0x9131, 0x3B63, 0x9132, 0x1B1F,
- 0x913A, 0x3B64, 0x913D, 0x3B65, 0x9148, 0x3B66, 0x9149, 0x0CAB,
- 0x914A, 0x1B21, 0x914B, 0x0940, 0x914C, 0x090C, 0x914D, 0x0D11,
- 0x914E, 0x0BAF, 0x9152, 0x091E, 0x9154, 0x0A32, 0x9156, 0x1B22,
- 0x9158, 0x1B23, 0x915B, 0x3B67, 0x9161, 0x3B68, 0x9162, 0x0A23,
- 0x9163, 0x1B24, 0x9164, 0x3B69, 0x9165, 0x1B25, 0x9169, 0x1B26,
- 0x916A, 0x0F59, 0x916C, 0x0941, 0x9172, 0x1B28, 0x9173, 0x1B27,
- 0x9175, 0x07EC, 0x9177, 0x0805, 0x9178, 0x088E, 0x9182, 0x1B2B,
- 0x9187, 0x0970, 0x9189, 0x1B2A, 0x918B, 0x1B29, 0x918D, 0x0B49,
- 0x918E, 0x3B6A, 0x9190, 0x07A3, 0x9192, 0x0A67, 0x9197, 0x0D44,
- 0x919C, 0x0943, 0x919E, 0x3B6B, 0x91A2, 0x1B2C, 0x91A4, 0x09C7,
- 0x91A8, 0x3B6C, 0x91AA, 0x1B2F, 0x91AB, 0x1B2D, 0x91AC, 0x1E1B,
- 0x91AD, 0x3B6D, 0x91AE, 0x3B6E, 0x91AF, 0x1B2E, 0x91B1, 0x1E61,
- 0x91B2, 0x3B6F, 0x91B4, 0x1B31, 0x91B5, 0x1B30, 0x91B8, 0x09E2,
- 0x91BA, 0x1B32, 0x91BC, 0x3B70, 0x91C0, 0x1B33, 0x91C1, 0x1B34,
- 0x91C6, 0x0D64, 0x91C7, 0x0843, 0x91C8, 0x090D, 0x91C9, 0x1B35,
- 0x91CB, 0x1B36, 0x91CC, 0x0F6C, 0x91CD, 0x094F, 0x91CE, 0x0EFA,
- 0x91CF, 0x0F94, 0x91D0, 0x1B37, 0x91D1, 0x06DA, 0x91D6, 0x1B38,
- 0x91D7, 0x21C0, 0x91D8, 0x0C1D, 0x91DA, 0x21BF, 0x91DB, 0x1B3B,
- 0x91DC, 0x05D6, 0x91DD, 0x0A11, 0x91DE, 0x21C1, 0x91DF, 0x1B39,
- 0x91E1, 0x1B3A, 0x91E3, 0x0BFC, 0x91E4, 0x21C4, 0x91E5, 0x21C5,
- 0x91E6, 0x0E83, 0x91E7, 0x06F4, 0x91ED, 0x21C2, 0x91EE, 0x21C3,
- 0x91F0, 0x3B71, 0x91F5, 0x1B3D, 0x91F6, 0x1B3E, 0x91F7, 0x3B72,
- 0x91FB, 0x3B73, 0x91FC, 0x1B3C, 0x91FF, 0x1B40, 0x9206, 0x21C6,
- 0x9207, 0x3B74, 0x920A, 0x21C8, 0x920D, 0x0CB7, 0x920E, 0x05A1,
- 0x9210, 0x21C7, 0x9211, 0x1B44, 0x9214, 0x1B41, 0x9215, 0x1B43,
- 0x921E, 0x1B3F, 0x9228, 0x3B75, 0x9229, 0x1B8A, 0x922C, 0x1B42,
- 0x9233, 0x3B76, 0x9234, 0x0FB3, 0x9237, 0x078E, 0x9238, 0x3B77,
- 0x9239, 0x21CF, 0x923A, 0x21C9, 0x923C, 0x21CB, 0x923F, 0x1B4C,
- 0x9240, 0x21CA, 0x9243, 0x3B78, 0x9244, 0x0C2E, 0x9245, 0x1B47,
- 0x9247, 0x3B79, 0x9248, 0x1B4A, 0x9249, 0x1B48, 0x924B, 0x1B4D,
- 0x924E, 0x21CC, 0x924F, 0x3B7A, 0x9250, 0x1B4E, 0x9251, 0x21CE,
- 0x9257, 0x1B46, 0x9259, 0x21CD, 0x925A, 0x1B53, 0x925B, 0x0516,
- 0x925E, 0x1B45, 0x9260, 0x3B7B, 0x9262, 0x0D41, 0x9264, 0x1B49,
- 0x9266, 0x09C8, 0x9267, 0x21D0, 0x9271, 0x07ED, 0x9277, 0x21D2,
- 0x9278, 0x21D3, 0x927E, 0x0E76, 0x9280, 0x06DC, 0x9283, 0x0950,
- 0x9285, 0x0C94, 0x9288, 0x20AA, 0x9291, 0x0AAF, 0x9293, 0x1B51,
- 0x9295, 0x1B4B, 0x9296, 0x1B50, 0x9298, 0x0ECF, 0x929A, 0x0BD4,
- 0x929B, 0x1B52, 0x929C, 0x1B4F, 0x92A7, 0x21D1, 0x92AD, 0x0AAE,
- 0x92B3, 0x3554, 0x92B7, 0x1B56, 0x92B9, 0x1B55, 0x92C2, 0x3B7C,
- 0x92CB, 0x3B7D, 0x92CC, 0x3B7E, 0x92CF, 0x1B54, 0x92D0, 0x21D7,
- 0x92D2, 0x0E5D, 0x92D3, 0x21DB, 0x92D5, 0x21D9, 0x92D7, 0x21D5,
- 0x92D9, 0x21D6, 0x92DF, 0x3B7F, 0x92E0, 0x21DA, 0x92E4, 0x0985,
- 0x92E7, 0x21D4, 0x92E9, 0x1B57, 0x92EA, 0x0E2F, 0x92ED, 0x04F6,
- 0x92F2, 0x0DB8, 0x92F3, 0x0BB0, 0x92F8, 0x0692, 0x92F9, 0x20B0,
- 0x92FA, 0x1B59, 0x92FB, 0x21DE, 0x92FC, 0x07EF, 0x92FF, 0x21E1,
- 0x9302, 0x21E3, 0x9304, 0x345A, 0x9306, 0x087A, 0x930D, 0x3B80,
- 0x930F, 0x1B58, 0x9310, 0x0A33, 0x9315, 0x3B81, 0x9318, 0x0A34,
- 0x9319, 0x1B5C, 0x931A, 0x1B5E, 0x931D, 0x21E2, 0x931E, 0x21E0,
- 0x931F, 0x3B82, 0x9320, 0x09E3, 0x9321, 0x21DD, 0x9322, 0x1B5D,
- 0x9323, 0x1B5F, 0x9325, 0x21DC, 0x9326, 0x06CB, 0x9327, 0x3B83,
- 0x9328, 0x0DB7, 0x932B, 0x090E, 0x932C, 0x0FC9, 0x932E, 0x1B5B,
- 0x932F, 0x0868, 0x9332, 0x0FE5, 0x9335, 0x1B61, 0x933A, 0x1B60,
- 0x933B, 0x1B62, 0x9344, 0x1B5A, 0x9347, 0x3B84, 0x9348, 0x20A9,
- 0x934A, 0x3458, 0x934B, 0x0CC1, 0x934D, 0x0C4F, 0x9352, 0x3B85,
- 0x9354, 0x0BF3, 0x9356, 0x1B67, 0x9357, 0x21E5, 0x935B, 0x0B81,
- 0x935C, 0x1B63, 0x9360, 0x1B64, 0x9365, 0x3B86, 0x936A, 0x3B87,
- 0x936C, 0x0703, 0x936D, 0x3B88, 0x936E, 0x1B66, 0x9370, 0x21E4,
- 0x9375, 0x0764, 0x937C, 0x1B65, 0x937E, 0x09C9, 0x938C, 0x05D7,
- 0x9394, 0x1B6B, 0x9396, 0x082F, 0x9397, 0x0AFB, 0x939A, 0x0BE6,
- 0x939B, 0x3B89, 0x93A4, 0x21E6, 0x93A7, 0x0599, 0x93A9, 0x3B8B,
- 0x93AC, 0x1B69, 0x93AD, 0x1B6A, 0x93AE, 0x0BDF, 0x93B0, 0x1B68,
- 0x93B9, 0x1B6C, 0x93BA, 0x3B8A, 0x93C1, 0x3B8C, 0x93C3, 0x1B72,
- 0x93C6, 0x21E7, 0x93C8, 0x1B75, 0x93CA, 0x3B8D, 0x93D0, 0x1B74,
- 0x93D1, 0x0C27, 0x93D6, 0x1B6D, 0x93D7, 0x1B6E, 0x93D8, 0x1B71,
- 0x93DD, 0x1B73, 0x93DE, 0x21E8, 0x93E1, 0x06B8, 0x93E2, 0x3B8E,
- 0x93E4, 0x1B76, 0x93E5, 0x1B70, 0x93E8, 0x1B6F, 0x93F8, 0x21E9,
- 0x93FA, 0x3B8F, 0x93FD, 0x3B90, 0x9403, 0x1B7A, 0x9407, 0x1B7B,
- 0x940F, 0x3B91, 0x9410, 0x1B7C, 0x9413, 0x1B79, 0x9414, 0x1B78,
- 0x9418, 0x09CA, 0x9419, 0x0C82, 0x941A, 0x1B77, 0x9421, 0x1B80,
- 0x942B, 0x1B7E, 0x9431, 0x21EA, 0x9434, 0x3B92, 0x9435, 0x1B7F,
- 0x9436, 0x1B7D, 0x9438, 0x0B58, 0x943A, 0x1B81, 0x943F, 0x3B93,
- 0x9441, 0x1B82, 0x9444, 0x1B84, 0x9445, 0x21EB, 0x9448, 0x21EC,
- 0x9451, 0x0611, 0x9452, 0x1B83, 0x9453, 0x0F06, 0x9455, 0x3B94,
- 0x945A, 0x1B8F, 0x945B, 0x1B85, 0x945E, 0x1B88, 0x9460, 0x1B86,
- 0x9462, 0x1B87, 0x946A, 0x1B89, 0x946B, 0x3B95, 0x9470, 0x1B8B,
- 0x9472, 0x3B96, 0x9475, 0x1B8C, 0x9477, 0x1B8D, 0x947C, 0x1B90,
- 0x947D, 0x1B8E, 0x947E, 0x1B91, 0x947F, 0x1B93, 0x9481, 0x1B92,
- 0x9577, 0x0BD5, 0x9578, 0x3B97, 0x9580, 0x0EF3, 0x9582, 0x1B94,
- 0x9583, 0x0AB0, 0x9587, 0x1B95, 0x9589, 0x0E14, 0x958A, 0x1B96,
- 0x958B, 0x0589, 0x958F, 0x04DE, 0x9591, 0x0613, 0x9592, 0x21ED,
- 0x9593, 0x0612, 0x9594, 0x1B97, 0x9596, 0x1B98, 0x9598, 0x1B99,
- 0x9599, 0x1B9A, 0x95A0, 0x1B9B, 0x95A2, 0x0614, 0x95A3, 0x05B3,
- 0x95A4, 0x07F0, 0x95A5, 0x0D4A, 0x95A6, 0x3B98, 0x95A7, 0x1B9D,
- 0x95A8, 0x1B9C, 0x95A9, 0x3B99, 0x95AB, 0x3B9A, 0x95AD, 0x1B9E,
- 0x95B1, 0x3555, 0x95B2, 0x04FE, 0x95B4, 0x3B9B, 0x95B9, 0x1BA1,
- 0x95BB, 0x1BA0, 0x95BC, 0x1B9F, 0x95BD, 0x3B9C, 0x95BE, 0x1BA2,
- 0x95C3, 0x1BA5, 0x95C7, 0x048B, 0x95CA, 0x1BA3, 0x95CC, 0x1BA7,
- 0x95CD, 0x1BA6, 0x95D4, 0x1BA9, 0x95D5, 0x1BA8, 0x95D6, 0x1BAA,
- 0x95D8, 0x0C86, 0x95DA, 0x3B9D, 0x95DC, 0x1BAB, 0x95E1, 0x1BAC,
- 0x95E2, 0x1BAE, 0x95E5, 0x1BAD, 0x961C, 0x0DDE, 0x961D, 0x3B9E,
- 0x9621, 0x1BAF, 0x9628, 0x1BB0, 0x962A, 0x0855, 0x962E, 0x1BB1,
- 0x962F, 0x1BB2, 0x9632, 0x0E77, 0x963B, 0x0ACD, 0x963F, 0x0468,
- 0x9640, 0x0B2B, 0x9641, 0x3B9F, 0x9642, 0x1BB3, 0x9644, 0x0DDF,
- 0x964B, 0x1BB6, 0x964C, 0x1BB4, 0x964D, 0x07F1, 0x964F, 0x1BB5,
- 0x9650, 0x0776, 0x9658, 0x3BA0, 0x965B, 0x0E15, 0x965C, 0x1BB8,
- 0x965D, 0x1BBA, 0x965E, 0x1BB9, 0x965F, 0x1BBB, 0x9662, 0x04C3,
- 0x9663, 0x0A1E, 0x9664, 0x0986, 0x9665, 0x0615, 0x9666, 0x1BBC,
- 0x966A, 0x0D1C, 0x966C, 0x1BBE, 0x9670, 0x04C4, 0x9672, 0x1BBD,
- 0x9673, 0x0BE0, 0x9675, 0x0F95, 0x9676, 0x0C83, 0x9677, 0x1BB7,
- 0x9678, 0x0F6E, 0x967A, 0x0765, 0x967D, 0x0F45, 0x9684, 0x3BA1,
- 0x9685, 0x06F1, 0x9686, 0x0F7C, 0x9688, 0x06FE, 0x968A, 0x0B42,
- 0x968B, 0x186C, 0x968D, 0x1BBF, 0x968E, 0x058A, 0x968F, 0x0A35,
- 0x9694, 0x05B4, 0x9695, 0x1BC1, 0x9697, 0x1BC2, 0x9698, 0x1BC0,
- 0x9699, 0x073A, 0x969B, 0x084D, 0x969C, 0x09CB, 0x969D, 0x21F0,
- 0x96A0, 0x04C5, 0x96A3, 0x0FA1, 0x96A4, 0x3BA2, 0x96A7, 0x1BC4,
- 0x96A8, 0x1B0B, 0x96A9, 0x3BA3, 0x96AA, 0x1BC3, 0x96AF, 0x21F1,
- 0x96B0, 0x1BC7, 0x96B1, 0x1BC5, 0x96B2, 0x1BC6, 0x96B4, 0x1BC8,
- 0x96B6, 0x1BC9, 0x96B7, 0x0FB4, 0x96B8, 0x1BCA, 0x96B9, 0x1BCB,
- 0x96BB, 0x0A6D, 0x96BC, 0x0D4F, 0x96C0, 0x0A43, 0x96C1, 0x0623,
- 0x96C4, 0x0F24, 0x96C5, 0x056D, 0x96C6, 0x0942, 0x96C7, 0x078F,
- 0x96C9, 0x1BCE, 0x96CB, 0x1BCD, 0x96CC, 0x08C1, 0x96CD, 0x1BCF,
- 0x96CE, 0x1BCC, 0x96D1, 0x0876, 0x96D2, 0x3BA4, 0x96D5, 0x1BD3,
- 0x96D6, 0x1992, 0x96D9, 0x10EB, 0x96DB, 0x0A3D, 0x96DC, 0x1BD1,
- 0x96DE, 0x3BA6, 0x96E2, 0x0F6D, 0x96E3, 0x0CC9, 0x96E8, 0x04CD,
- 0x96E9, 0x3BA7, 0x96EA, 0x0A87, 0x96EB, 0x08E2, 0x96F0, 0x0E07,
- 0x96F1, 0x3BA8, 0x96F2, 0x04E2, 0x96F6, 0x0FB5, 0x96F7, 0x0F55,
- 0x96F9, 0x1BD4, 0x96FB, 0x0C3F, 0x9700, 0x0927, 0x9702, 0x3BA9,
- 0x9704, 0x1BD5, 0x9706, 0x1BD6, 0x9707, 0x0A12, 0x9708, 0x1BD7,
- 0x9709, 0x3BAA, 0x970A, 0x0FB6, 0x970D, 0x1BD2, 0x970E, 0x1BD9,
- 0x970F, 0x1BDB, 0x9711, 0x1BDA, 0x9713, 0x1BD8, 0x9716, 0x1BDC,
- 0x9719, 0x1BDD, 0x971C, 0x0AFC, 0x971E, 0x0562, 0x9724, 0x1BDE,
- 0x9727, 0x0EC4, 0x972A, 0x1BDF, 0x9730, 0x1BE0, 0x9732, 0x0FD0,
- 0x9733, 0x21F2, 0x9738, 0x1414, 0x9739, 0x1BE1, 0x973B, 0x21F3,
- 0x973D, 0x1BE2, 0x973E, 0x1BE3, 0x9742, 0x1BE7, 0x9743, 0x21F4,
- 0x9744, 0x1BE4, 0x9746, 0x1BE5, 0x9748, 0x1BE6, 0x9749, 0x1BE8,
- 0x974D, 0x21F5, 0x974F, 0x21F6, 0x9751, 0x21F7, 0x9752, 0x0A68,
- 0x9755, 0x21F8, 0x9756, 0x0F03, 0x9759, 0x0A69, 0x975A, 0x3BAB,
- 0x975C, 0x1BE9, 0x975E, 0x0D87, 0x9760, 0x1BEA, 0x9761, 0x1D06,
- 0x9762, 0x0ED8, 0x9763, 0x3BAC, 0x9764, 0x1BEB, 0x9766, 0x1BEC,
- 0x9768, 0x1BED, 0x9769, 0x05B5, 0x976B, 0x1BEF, 0x976D, 0x0A1F,
- 0x976E, 0x3BAD, 0x9771, 0x1BF0, 0x9773, 0x3BAE, 0x9774, 0x06FA,
- 0x9779, 0x1BF1, 0x977A, 0x1BF5, 0x977C, 0x1BF3, 0x9781, 0x1BF4,
- 0x9784, 0x05D1, 0x9785, 0x1BF2, 0x9786, 0x1BF6, 0x978B, 0x1BF7,
- 0x978D, 0x048C, 0x978F, 0x1BF8, 0x9790, 0x1BF9, 0x9798, 0x09CC,
- 0x979A, 0x3BAF, 0x979C, 0x1BFA, 0x97A0, 0x0661, 0x97A2, 0x3BB0,
- 0x97A3, 0x1BFD, 0x97A6, 0x1BFC, 0x97A8, 0x1BFB, 0x97AB, 0x1A34,
- 0x97AD, 0x0E2C, 0x97B3, 0x1BFE, 0x97B4, 0x1BFF, 0x97B5, 0x3BB1,
- 0x97B6, 0x3BB2, 0x97C3, 0x1C00, 0x97C6, 0x1C01, 0x97C8, 0x1C02,
- 0x97CB, 0x1C03, 0x97D3, 0x0616, 0x97D9, 0x3BB3, 0x97DC, 0x1C04,
- 0x97DE, 0x3BB4, 0x97ED, 0x1C05, 0x97EE, 0x0CD9, 0x97F2, 0x1C07,
- 0x97F3, 0x053B, 0x97F4, 0x3BB5, 0x97F5, 0x1C0A, 0x97F6, 0x1C09,
- 0x97FB, 0x04C6, 0x97FF, 0x06B9, 0x9801, 0x0E17, 0x9802, 0x0BD6,
- 0x9803, 0x0812, 0x9805, 0x07F2, 0x9806, 0x0971, 0x9808, 0x0A22,
- 0x980A, 0x3BB6, 0x980C, 0x1C0C, 0x980E, 0x3BB7, 0x980F, 0x1C0B,
- 0x9810, 0x0F2C, 0x9811, 0x0624, 0x9812, 0x0D66, 0x9813, 0x0CB4,
- 0x9817, 0x0A42, 0x9818, 0x0F96, 0x981A, 0x0731, 0x981E, 0x3BB8,
- 0x9821, 0x1C0F, 0x9823, 0x3BB9, 0x9824, 0x1C0E, 0x982B, 0x3BBA,
- 0x982C, 0x0E79, 0x982D, 0x0C84, 0x9830, 0x1E73, 0x9834, 0x04F2,
- 0x9837, 0x1C10, 0x9838, 0x1C0D, 0x9839, 0x37B3, 0x983B, 0x0DC3,
- 0x983C, 0x0F54, 0x983D, 0x1C11, 0x983E, 0x3BBB, 0x9846, 0x1C12,
- 0x984B, 0x1C14, 0x984C, 0x0B4A, 0x984D, 0x05B9, 0x984E, 0x05BA,
- 0x984F, 0x1C13, 0x9852, 0x3BBC, 0x9853, 0x3BBD, 0x9854, 0x0625,
- 0x9855, 0x0766, 0x9857, 0x21F9, 0x9858, 0x0626, 0x9859, 0x3BBE,
- 0x985A, 0x1E48, 0x985B, 0x0C39, 0x985E, 0x0FA8, 0x9865, 0x21FA,
- 0x9867, 0x0790, 0x986B, 0x1C15, 0x986C, 0x3BBF, 0x986F, 0x1C16,
- 0x9870, 0x1C17, 0x9871, 0x1C18, 0x9873, 0x1C1A, 0x9874, 0x1C19,
- 0x98A8, 0x0DE9, 0x98AA, 0x1C1B, 0x98AF, 0x1C1C, 0x98B1, 0x1C1D,
- 0x98B6, 0x1C1E, 0x98B8, 0x3BC0, 0x98BA, 0x3BC1, 0x98BF, 0x3BC2,
- 0x98C3, 0x1C20, 0x98C4, 0x1C1F, 0x98C6, 0x1C21, 0x98C8, 0x3BC3,
- 0x98DB, 0x0D88, 0x98DC, 0x1839, 0x98DF, 0x09EF, 0x98E0, 0x3618,
- 0x98E2, 0x064C, 0x98E5, 0x3BC4, 0x98E9, 0x1C22, 0x98EB, 0x1C23,
- 0x98ED, 0x10C1, 0x98EE, 0x14DA, 0x98EF, 0x0D67, 0x98F2, 0x04BF,
- 0x98F4, 0x047F, 0x98FC, 0x08C2, 0x98FD, 0x0E5E, 0x98FE, 0x09E6,
- 0x9903, 0x1C24, 0x9905, 0x0EEB, 0x9909, 0x1C25, 0x990A, 0x0F46,
- 0x990C, 0x04E4, 0x9910, 0x088F, 0x9912, 0x1C26, 0x9913, 0x056E,
- 0x9914, 0x1C27, 0x9918, 0x1C28, 0x991D, 0x1C2A, 0x991E, 0x1C2B,
- 0x9920, 0x1C2D, 0x9921, 0x1C29, 0x9924, 0x1C2C, 0x9927, 0x21FD,
- 0x9928, 0x0617, 0x992C, 0x1C2E, 0x992E, 0x1C2F, 0x9932, 0x3BC5,
- 0x9933, 0x3BC6, 0x993D, 0x1C30, 0x993E, 0x1C31, 0x9940, 0x3BC7,
- 0x9942, 0x1C32, 0x9945, 0x1C34, 0x9949, 0x1C33, 0x994B, 0x1C36,
- 0x994C, 0x1C39, 0x994D, 0x3BC8, 0x9950, 0x1C35, 0x9951, 0x1C37,
- 0x9952, 0x1C38, 0x9955, 0x1C3A, 0x9957, 0x06BA, 0x995C, 0x3BC9,
- 0x995F, 0x3BCA, 0x9996, 0x091F, 0x9997, 0x1C3B, 0x9998, 0x1C3C,
- 0x9999, 0x07F3, 0x999E, 0x21FF, 0x99A5, 0x1C3D, 0x99A8, 0x059C,
- 0x99AC, 0x0D05, 0x99AD, 0x1C3E, 0x99AE, 0x1C3F, 0x99B1, 0x3BCB,
- 0x99B3, 0x0B98, 0x99B4, 0x0CC3, 0x99B9, 0x3BCC, 0x99BA, 0x3BCD,
- 0x99BC, 0x1C40, 0x99C1, 0x0D33, 0x99C4, 0x0B2C, 0x99C5, 0x04FA,
- 0x99C6, 0x06E6, 0x99C8, 0x06E7, 0x99C9, 0x3BCE, 0x99D0, 0x0BB1,
- 0x99D1, 0x1C45, 0x99D2, 0x06E8, 0x99D5, 0x056F, 0x99D8, 0x1C44,
- 0x99DB, 0x1C42, 0x99DD, 0x1C43, 0x99DF, 0x1C41, 0x99E2, 0x1C4F,
- 0x99ED, 0x1C46, 0x99EE, 0x1C47, 0x99F1, 0x1C48, 0x99F2, 0x1C49,
- 0x99F8, 0x1C4B, 0x99FB, 0x1C4A, 0x99FF, 0x0963, 0x9A01, 0x1C4C,
- 0x9A02, 0x3BCF, 0x9A05, 0x1C4E, 0x9A08, 0x37BA, 0x9A0E, 0x064D,
- 0x9A0F, 0x1C4D, 0x9A12, 0x0AFD, 0x9A13, 0x0767, 0x9A16, 0x3BD0,
- 0x9A19, 0x1C50, 0x9A24, 0x3BD1, 0x9A27, 0x3BD2, 0x9A28, 0x0B2D,
- 0x9A2B, 0x1C51, 0x9A2D, 0x3BD3, 0x9A2E, 0x3BD4, 0x9A30, 0x0C85,
- 0x9A36, 0x3BD5, 0x9A37, 0x1C52, 0x9A38, 0x3BD6, 0x9A3E, 0x1C57,
- 0x9A40, 0x1C55, 0x9A42, 0x1C54, 0x9A43, 0x1C56, 0x9A45, 0x1C53,
- 0x9A4A, 0x3BD7, 0x9A4D, 0x1C59, 0x9A4E, 0x2200, 0x9A52, 0x1E2F,
- 0x9A55, 0x1C58, 0x9A56, 0x3BD8, 0x9A57, 0x1C5B, 0x9A5A, 0x06BB,
- 0x9A5B, 0x1C5A, 0x9A5F, 0x1C5C, 0x9A62, 0x1C5D, 0x9A64, 0x1C5F,
- 0x9A65, 0x1C5E, 0x9A69, 0x1C60, 0x9A6A, 0x1C62, 0x9A6B, 0x1C61,
- 0x9AA8, 0x080E, 0x9AAD, 0x1C63, 0x9AB0, 0x1C64, 0x9AB5, 0x3BD9,
- 0x9AB6, 0x3BDA, 0x9AB8, 0x059A, 0x9ABC, 0x1C65, 0x9AC0, 0x1C66,
- 0x9AC4, 0x0A37, 0x9ACF, 0x1C67, 0x9AD1, 0x1C68, 0x9AD3, 0x1C69,
- 0x9AD4, 0x1C6A, 0x9AD8, 0x07F4, 0x9AD9, 0x2201, 0x9ADC, 0x2202,
- 0x9ADE, 0x1C6B, 0x9ADF, 0x1C6C, 0x9AE2, 0x1C6D, 0x9AE3, 0x1C6E,
- 0x9AE6, 0x1C6F, 0x9AEA, 0x0D45, 0x9AEB, 0x1C71, 0x9AED, 0x0D98,
- 0x9AEE, 0x1C72, 0x9AEF, 0x1C70, 0x9AF1, 0x1C74, 0x9AF4, 0x1C73,
- 0x9AF7, 0x1C75, 0x9AF9, 0x3BDB, 0x9AFB, 0x1C76, 0x9B03, 0x3BDC,
- 0x9B06, 0x1C77, 0x9B18, 0x1C78, 0x9B1A, 0x1C79, 0x9B1F, 0x1C7A,
- 0x9B20, 0x3BDD, 0x9B22, 0x1C7B, 0x9B23, 0x1C7C, 0x9B25, 0x1C7D,
- 0x9B27, 0x1C7E, 0x9B28, 0x1C7F, 0x9B29, 0x1C80, 0x9B2A, 0x1C81,
- 0x9B2D, 0x343C, 0x9B2E, 0x1C82, 0x9B2F, 0x1C83, 0x9B31, 0x14D4,
- 0x9B32, 0x1C84, 0x9B33, 0x3BDE, 0x9B34, 0x3BDF, 0x9B3B, 0x17A9,
- 0x9B3C, 0x064E, 0x9B41, 0x057F, 0x9B42, 0x0822, 0x9B43, 0x1C86,
- 0x9B44, 0x1C85, 0x9B45, 0x0EB1, 0x9B4D, 0x1C88, 0x9B4E, 0x1C89,
- 0x9B4F, 0x1C87, 0x9B51, 0x1C8A, 0x9B54, 0x0E90, 0x9B58, 0x1C8B,
- 0x9B5A, 0x0695, 0x9B6F, 0x0FCB, 0x9B72, 0x2204, 0x9B73, 0x3BE0,
- 0x9B74, 0x1C8C, 0x9B75, 0x2203, 0x9B79, 0x3BE1, 0x9B83, 0x1C8E,
- 0x9B8E, 0x0482, 0x9B8F, 0x2205, 0x9B91, 0x1C8F, 0x9B92, 0x0DFB,
- 0x9B93, 0x1C8D, 0x9B96, 0x1C90, 0x9B97, 0x1C91, 0x9B9F, 0x1C92,
- 0x9BA0, 0x1C93, 0x9BA7, 0x3BE2, 0x9BA8, 0x1C94, 0x9BAA, 0x0E9C,
- 0x9BAB, 0x087B, 0x9BAD, 0x086A, 0x9BAE, 0x0AB1, 0x9BB1, 0x2206,
- 0x9BB4, 0x1C95, 0x9BB9, 0x1C98, 0x9BBB, 0x2207, 0x9BC0, 0x1C96,
- 0x9BC1, 0x3BE3, 0x9BC6, 0x1C99, 0x9BC7, 0x3BE4, 0x9BC9, 0x07A5,
- 0x9BCA, 0x1C97, 0x9BCF, 0x1C9A, 0x9BD1, 0x1C9B, 0x9BD2, 0x1C9C,
- 0x9BD4, 0x1CA0, 0x9BD6, 0x0878, 0x9BD7, 0x3BE5, 0x9BDB, 0x0B44,
- 0x9BDF, 0x37BF, 0x9BE1, 0x1CA1, 0x9BE2, 0x1C9E, 0x9BE3, 0x1C9D,
- 0x9BE4, 0x1C9F, 0x9BE7, 0x3BE6, 0x9BE8, 0x0735, 0x9BEB, 0x3BE7,
- 0x9BF0, 0x1CA5, 0x9BF1, 0x1CA4, 0x9BF2, 0x1CA3, 0x9BF5, 0x0477,
- 0x9BF7, 0x3BE8, 0x9BFA, 0x3BE9, 0x9BFD, 0x3BEA, 0x9C00, 0x2208,
- 0x9C04, 0x1CAF, 0x9C06, 0x1CAB, 0x9C08, 0x1CAC, 0x9C09, 0x1CA8,
- 0x9C0A, 0x1CAE, 0x9C0B, 0x3BEB, 0x9C0C, 0x1CAA, 0x9C0D, 0x05C0,
- 0x9C10, 0x0FF2, 0x9C12, 0x1CAD, 0x9C13, 0x1CA9, 0x9C14, 0x1CA7,
- 0x9C15, 0x1CA6, 0x9C1B, 0x1CB1, 0x9C21, 0x1CB4, 0x9C24, 0x1CB3,
- 0x9C25, 0x1CB2, 0x9C27, 0x3BEC, 0x9C2A, 0x3BED, 0x9C2D, 0x0DBB,
- 0x9C2E, 0x1CB0, 0x9C2F, 0x04B7, 0x9C30, 0x1CB5, 0x9C32, 0x1CB7,
- 0x9C36, 0x3BEE, 0x9C39, 0x05CD, 0x9C3A, 0x1CA2, 0x9C3B, 0x04D9,
- 0x9C3E, 0x1CB9, 0x9C41, 0x3BEF, 0x9C46, 0x1CB8, 0x9C47, 0x1CB6,
- 0x9C48, 0x0B6B, 0x9C52, 0x0E9E, 0x9C53, 0x3BF0, 0x9C57, 0x0FA2,
- 0x9C5A, 0x1CBA, 0x9C60, 0x1CBB, 0x9C63, 0x3BF1, 0x9C67, 0x1CBC,
- 0x9C6A, 0x3BF2, 0x9C76, 0x1CBD, 0x9C77, 0x3BF3, 0x9C78, 0x1CBE,
- 0x9CE5, 0x0BD7, 0x9CE7, 0x1CBF, 0x9CE9, 0x0D4B, 0x9CEB, 0x1CC4,
- 0x9CEC, 0x1CC0, 0x9CF0, 0x1CC1, 0x9CF3, 0x0E5F, 0x9CF4, 0x0ED0,
- 0x9CF6, 0x0CA8, 0x9D02, 0x3BF4, 0x9D03, 0x1CC5, 0x9D06, 0x1CC6,
- 0x9D07, 0x0C96, 0x9D08, 0x1CC3, 0x9D09, 0x1CC2, 0x9D0E, 0x052A,
- 0x9D12, 0x1CCE, 0x9D15, 0x1CCD, 0x9D1B, 0x0517, 0x9D1F, 0x1CCB,
- 0x9D23, 0x1CCA, 0x9D26, 0x1CC8, 0x9D28, 0x05D9, 0x9D2A, 0x1CC7,
- 0x9D2B, 0x08DE, 0x9D2C, 0x0529, 0x9D3B, 0x07F5, 0x9D3E, 0x1CD1,
- 0x9D3F, 0x1CD0, 0x9D41, 0x1CCF, 0x9D42, 0x3BF5, 0x9D44, 0x1CCC,
- 0x9D46, 0x1CD2, 0x9D47, 0x3BF6, 0x9D48, 0x1CD3, 0x9D50, 0x1CD8,
- 0x9D51, 0x1CD7, 0x9D59, 0x1CD9, 0x9D5C, 0x04CF, 0x9D5D, 0x1CD4,
- 0x9D5E, 0x1CD5, 0x9D60, 0x0806, 0x9D61, 0x0EC5, 0x9D63, 0x3BF7,
- 0x9D64, 0x1CD6, 0x9D69, 0x3BF8, 0x9D6B, 0x220A, 0x9D6C, 0x0E60,
- 0x9D6F, 0x1CDE, 0x9D70, 0x2209, 0x9D72, 0x1CDA, 0x9D7A, 0x1CDF,
- 0x9D7C, 0x3BF9, 0x9D7E, 0x3BFA, 0x9D87, 0x1CDC, 0x9D89, 0x1CDB,
- 0x9D8D, 0x3BFB, 0x9D8F, 0x0732, 0x9D9A, 0x1CE0, 0x9DA4, 0x1CE1,
- 0x9DA9, 0x1CE2, 0x9DAB, 0x1CDD, 0x9DAF, 0x1CC9, 0x9DB1, 0x3BFC,
- 0x9DB2, 0x1CE3, 0x9DB4, 0x0BFD, 0x9DB8, 0x1CE7, 0x9DBA, 0x1CE8,
- 0x9DBB, 0x1CE6, 0x9DC1, 0x1CE5, 0x9DC2, 0x1CEB, 0x9DC3, 0x3BFD,
- 0x9DC4, 0x1CE4, 0x9DC6, 0x1CE9, 0x9DC7, 0x3BFE, 0x9DCF, 0x1CEA,
- 0x9DD3, 0x1CED, 0x9DD6, 0x3BFF, 0x9DD7, 0x1DDE, 0x9DD9, 0x1CEC,
- 0x9DDF, 0x3C00, 0x9DE6, 0x1CEF, 0x9DEB, 0x3C01, 0x9DED, 0x1CF0,
- 0x9DEF, 0x1CF1, 0x9DF2, 0x0FEF, 0x9DF4, 0x3C02, 0x9DF8, 0x1CEE,
- 0x9DF9, 0x0B4B, 0x9DFA, 0x085D, 0x9DFD, 0x1CF2, 0x9E15, 0x3C03,
- 0x9E19, 0x220C, 0x9E1A, 0x1CF3, 0x9E1B, 0x1CF4, 0x9E1D, 0x3C04,
- 0x9E1E, 0x1CF5, 0x9E75, 0x1CF6, 0x9E78, 0x0768, 0x9E79, 0x1CF7,
- 0x9E7C, 0x1DFD, 0x9E7D, 0x1CF8, 0x9E7F, 0x08DB, 0x9E81, 0x1CF9,
- 0x9E88, 0x1CFA, 0x9E8B, 0x1CFB, 0x9E8C, 0x1CFC, 0x9E91, 0x1CFF,
- 0x9E92, 0x1CFD, 0x9E93, 0x0FE2, 0x9E95, 0x1CFE, 0x9E97, 0x0FB7,
- 0x9E9D, 0x1D00, 0x9E9F, 0x0FA3, 0x9EA4, 0x3C05, 0x9EA5, 0x1D01,
- 0x9EA6, 0x0D34, 0x9EA8, 0x3C06, 0x9EA9, 0x1D02, 0x9EAA, 0x1D04,
- 0x9EAC, 0x3C07, 0x9EAD, 0x1D05, 0x9EB4, 0x1E02, 0x9EB5, 0x1E75,
- 0x9EB8, 0x1D03, 0x9EB9, 0x07FF, 0x9EBA, 0x0ED9, 0x9EBB, 0x0E91,
- 0x9EBC, 0x1284, 0x9EBE, 0x14FF, 0x9EBF, 0x0EA9, 0x9EC3, 0x340B,
- 0x9EC4, 0x052B, 0x9ECC, 0x1D07, 0x9ECD, 0x066A, 0x9ECE, 0x1D08,
- 0x9ECF, 0x1D09, 0x9ED0, 0x1D0A, 0x9ED1, 0x220D, 0x9ED2, 0x0807,
- 0x9ED4, 0x1D0B, 0x9ED8, 0x160D, 0x9ED9, 0x0EE7, 0x9EDB, 0x0B43,
- 0x9EDC, 0x1D0C, 0x9EDD, 0x1D0E, 0x9EDE, 0x1D0D, 0x9EE0, 0x1D0F,
- 0x9EE5, 0x1D10, 0x9EE7, 0x3C08, 0x9EE8, 0x1D11, 0x9EEE, 0x3C09,
- 0x9EEF, 0x1D12, 0x9EF4, 0x1D13, 0x9EF6, 0x1D14, 0x9EF7, 0x1D15,
- 0x9EF9, 0x1D16, 0x9EFB, 0x1D17, 0x9EFC, 0x1D18, 0x9EFD, 0x1D19,
- 0x9F07, 0x1D1A, 0x9F08, 0x1D1B, 0x9F0E, 0x0C1E, 0x9F10, 0x3C0A,
- 0x9F12, 0x3C0B, 0x9F13, 0x0791, 0x9F15, 0x1D1D, 0x9F17, 0x3C0C,
- 0x9F19, 0x3C0D, 0x9F20, 0x0ACF, 0x9F21, 0x1D1E, 0x9F2C, 0x1D1F,
- 0x9F2F, 0x3C0E, 0x9F37, 0x3C0F, 0x9F39, 0x3C10, 0x9F3B, 0x0D93,
- 0x9F3E, 0x1D20, 0x9F41, 0x3C11, 0x9F45, 0x3C12, 0x9F4A, 0x1D21,
- 0x9F4B, 0x170A, 0x9F4E, 0x1A7B, 0x9F4F, 0x1C06, 0x9F52, 0x1D22,
- 0x9F54, 0x1D23, 0x9F57, 0x3C13, 0x9F5F, 0x1D25, 0x9F60, 0x1D26,
- 0x9F61, 0x1D27, 0x9F62, 0x0FB8, 0x9F63, 0x1D24, 0x9F66, 0x1D28,
- 0x9F67, 0x1D29, 0x9F68, 0x3C14, 0x9F6A, 0x1D2B, 0x9F6C, 0x1D2A,
- 0x9F71, 0x3C15, 0x9F72, 0x1D2D, 0x9F75, 0x3C16, 0x9F76, 0x1D2E,
- 0x9F77, 0x1D2C, 0x9F8D, 0x0F7E, 0x9F90, 0x3C17, 0x9F94, 0x3C18,
- 0x9F95, 0x1D2F, 0x9F9C, 0x1D30, 0x9F9D, 0x1727, 0x9FA0, 0x1D31,
- 0x9FA2, 0x3C19, 0xF929, 0x2129, 0xF9DC, 0x21EE, 0xFA0E, 0x20DA,
- 0xFA0F, 0x20E5, 0xFA10, 0x20E6, 0xFA11, 0x20FB, 0xFA12, 0x2121,
- 0xFA13, 0x2131, 0xFA14, 0x2133, 0xFA15, 0x215E, 0xFA16, 0x2164,
- 0xFA17, 0x217B, 0xFA18, 0x2183, 0xFA19, 0x2184, 0xFA1A, 0x2185,
- 0xFA1B, 0x2187, 0xFA1C, 0x218B, 0xFA1D, 0x218E, 0xFA1E, 0x2197,
- 0xFA1F, 0x21A2, 0xFA20, 0x21A4, 0xFA21, 0x21A5, 0xFA22, 0x21AE,
- 0xFA23, 0x21B6, 0xFA24, 0x21B8, 0xFA25, 0x21B9, 0xFA26, 0x21BC,
- 0xFA27, 0x21D8, 0xFA28, 0x21DF, 0xFA29, 0x21EF, 0xFA2A, 0x21FB,
- 0xFA2B, 0x21FC, 0xFA2C, 0x21FE, 0xFA2D, 0x220B, 0xFB00, 0x248E,
- 0xFB01, 0x0070, 0xFB02, 0x0071, 0xFB03, 0x248F, 0xFB04, 0x2490,
- 0xFE30, 0x1EDA, 0xFE31, 0x1ED4, 0xFE32, 0x1ED5, 0xFE33, 0x1ED2,
- 0xFE35, 0x1EDB, 0xFE36, 0x1EDC, 0xFE37, 0x1EE1, 0xFE38, 0x1EE2,
- 0xFE39, 0x1EDD, 0xFE3A, 0x1EDE, 0xFE3B, 0x1EEB, 0xFE3C, 0x1EEC,
- 0xFE3D, 0x1EE5, 0xFE3E, 0x1EE6, 0xFE3F, 0x1EE3, 0xFE40, 0x1EE4,
- 0xFE41, 0x1EE7, 0xFE42, 0x1EE8, 0xFE43, 0x1EE9, 0xFE44, 0x1EEA,
- 0xFF01, 0x0282, 0xFF02, 0x1F47, 0xFF03, 0x02CC, 0xFF04, 0x02C8,
- 0xFF05, 0x02CB, 0xFF06, 0x02CD, 0xFF07, 0x1F46, 0xFF08, 0x02A2,
- 0xFF09, 0x02A3, 0xFF0A, 0x02CE, 0xFF0B, 0x02B4, 0xFF0C, 0x027C,
- 0xFF0D, 0x02B5, 0xFF0E, 0x027D, 0xFF0F, 0x0297, 0xFF10, 0x030C,
- 0xFF11, 0x030D, 0xFF12, 0x030E, 0xFF13, 0x030F, 0xFF14, 0x0310,
- 0xFF15, 0x0311, 0xFF16, 0x0312, 0xFF17, 0x0313, 0xFF18, 0x0314,
- 0xFF19, 0x0315, 0xFF1A, 0x027F, 0xFF1B, 0x0280, 0xFF1C, 0x02BB,
- 0xFF1D, 0x02B9, 0xFF1E, 0x02BC, 0xFF1F, 0x0281, 0xFF20, 0x02CF,
- 0xFF21, 0x0316, 0xFF22, 0x0317, 0xFF23, 0x0318, 0xFF24, 0x0319,
- 0xFF25, 0x031A, 0xFF26, 0x031B, 0xFF27, 0x031C, 0xFF28, 0x031D,
- 0xFF29, 0x031E, 0xFF2A, 0x031F, 0xFF2B, 0x0320, 0xFF2C, 0x0321,
- 0xFF2D, 0x0322, 0xFF2E, 0x0323, 0xFF2F, 0x0324, 0xFF30, 0x0325,
- 0xFF31, 0x0326, 0xFF32, 0x0327, 0xFF33, 0x0328, 0xFF34, 0x0329,
- 0xFF35, 0x032A, 0xFF36, 0x032B, 0xFF37, 0x032C, 0xFF38, 0x032D,
- 0xFF39, 0x032E, 0xFF3A, 0x032F, 0xFF3B, 0x02A6, 0xFF3C, 0x0298,
- 0xFF3D, 0x02A7, 0xFF3E, 0x0288, 0xFF3F, 0x028A, 0xFF40, 0x0286,
- 0xFF41, 0x0330, 0xFF42, 0x0331, 0xFF43, 0x0332, 0xFF44, 0x0333,
- 0xFF45, 0x0334, 0xFF46, 0x0335, 0xFF47, 0x0336, 0xFF48, 0x0337,
- 0xFF49, 0x0338, 0xFF4A, 0x0339, 0xFF4B, 0x033A, 0xFF4C, 0x033B,
- 0xFF4D, 0x033C, 0xFF4E, 0x033D, 0xFF4F, 0x033E, 0xFF50, 0x033F,
- 0xFF51, 0x0340, 0xFF52, 0x0341, 0xFF53, 0x0342, 0xFF54, 0x0343,
- 0xFF55, 0x0344, 0xFF56, 0x0345, 0xFF57, 0x0346, 0xFF58, 0x0347,
- 0xFF59, 0x0348, 0xFF5A, 0x0349, 0xFF5B, 0x02A8, 0xFF5C, 0x029B,
- 0xFF5D, 0x02A9, 0xFF5E, 0x0299, 0xFF61, 0x0147, 0xFF62, 0x0148,
- 0xFF63, 0x0149, 0xFF64, 0x014A, 0xFF65, 0x014B, 0xFF66, 0x014C,
- 0xFF67, 0x014D, 0xFF68, 0x014E, 0xFF69, 0x014F, 0xFF6A, 0x0150,
- 0xFF6B, 0x0151, 0xFF6C, 0x0152, 0xFF6D, 0x0153, 0xFF6E, 0x0154,
- 0xFF6F, 0x0155, 0xFF70, 0x0156, 0xFF71, 0x0157, 0xFF72, 0x0158,
- 0xFF73, 0x0159, 0xFF74, 0x015A, 0xFF75, 0x015B, 0xFF76, 0x015C,
- 0xFF77, 0x015D, 0xFF78, 0x015E, 0xFF79, 0x015F, 0xFF7A, 0x0160,
- 0xFF7B, 0x0161, 0xFF7C, 0x0162, 0xFF7D, 0x0163, 0xFF7E, 0x0164,
- 0xFF7F, 0x0165, 0xFF80, 0x0166, 0xFF81, 0x0167, 0xFF82, 0x0168,
- 0xFF83, 0x0169, 0xFF84, 0x016A, 0xFF85, 0x016B, 0xFF86, 0x016C,
- 0xFF87, 0x016D, 0xFF88, 0x016E, 0xFF89, 0x016F, 0xFF8A, 0x0170,
- 0xFF8B, 0x0171, 0xFF8C, 0x0172, 0xFF8D, 0x0173, 0xFF8E, 0x0174,
- 0xFF8F, 0x0175, 0xFF90, 0x0176, 0xFF91, 0x0177, 0xFF92, 0x0178,
- 0xFF93, 0x0179, 0xFF94, 0x017A, 0xFF95, 0x017B, 0xFF96, 0x017C,
- 0xFF97, 0x017D, 0xFF98, 0x017E, 0xFF99, 0x017F, 0xFF9A, 0x0180,
- 0xFF9B, 0x0181, 0xFF9C, 0x0182, 0xFF9D, 0x0183, 0xFF9E, 0x0184,
- 0xFF9F, 0x0185, 0xFFE0, 0x02C9, 0xFFE1, 0x02CA, 0xFFE2, 0x02EF,
- 0xFFE3, 0x0289, 0xFFE4, 0x1F45, 0xFFE5, 0x02C7, 0xFFE8, 0x0143,
-};
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_UniJIS_UCS2_H_4[9772 * 2] = {
+ 0x0020, 0x0001, 0x0021, 0x0002, 0x0022, 0x0003, 0x0023, 0x0004,
+ 0x0024, 0x0005, 0x0025, 0x0006, 0x0026, 0x0007, 0x0027, 0x0008,
+ 0x0028, 0x0009, 0x0029, 0x000A, 0x002A, 0x000B, 0x002B, 0x000C,
+ 0x002C, 0x000D, 0x002D, 0x000E, 0x002E, 0x000F, 0x002F, 0x0010,
+ 0x0030, 0x0011, 0x0031, 0x0012, 0x0032, 0x0013, 0x0033, 0x0014,
+ 0x0034, 0x0015, 0x0035, 0x0016, 0x0036, 0x0017, 0x0037, 0x0018,
+ 0x0038, 0x0019, 0x0039, 0x001A, 0x003A, 0x001B, 0x003B, 0x001C,
+ 0x003C, 0x001D, 0x003D, 0x001E, 0x003E, 0x001F, 0x003F, 0x0020,
+ 0x0040, 0x0021, 0x0041, 0x0022, 0x0042, 0x0023, 0x0043, 0x0024,
+ 0x0044, 0x0025, 0x0045, 0x0026, 0x0046, 0x0027, 0x0047, 0x0028,
+ 0x0048, 0x0029, 0x0049, 0x002A, 0x004A, 0x002B, 0x004B, 0x002C,
+ 0x004C, 0x002D, 0x004D, 0x002E, 0x004E, 0x002F, 0x004F, 0x0030,
+ 0x0050, 0x0031, 0x0051, 0x0032, 0x0052, 0x0033, 0x0053, 0x0034,
+ 0x0054, 0x0035, 0x0055, 0x0036, 0x0056, 0x0037, 0x0057, 0x0038,
+ 0x0058, 0x0039, 0x0059, 0x003A, 0x005A, 0x003B, 0x005B, 0x003C,
+ 0x005C, 0x0061, 0x005D, 0x003E, 0x005E, 0x003F, 0x005F, 0x0040,
+ 0x0060, 0x0041, 0x0061, 0x0042, 0x0062, 0x0043, 0x0063, 0x0044,
+ 0x0064, 0x0045, 0x0065, 0x0046, 0x0066, 0x0047, 0x0067, 0x0048,
+ 0x0068, 0x0049, 0x0069, 0x004A, 0x006A, 0x004B, 0x006B, 0x004C,
+ 0x006C, 0x004D, 0x006D, 0x004E, 0x006E, 0x004F, 0x006F, 0x0050,
+ 0x0070, 0x0051, 0x0071, 0x0052, 0x0072, 0x0053, 0x0073, 0x0054,
+ 0x0074, 0x0055, 0x0075, 0x0056, 0x0076, 0x0057, 0x0077, 0x0058,
+ 0x0078, 0x0059, 0x0079, 0x005A, 0x007A, 0x005B, 0x007B, 0x005C,
+ 0x007C, 0x005D, 0x007D, 0x005E, 0x007E, 0x005F, 0x00A1, 0x0065,
+ 0x00A2, 0x0066, 0x00A3, 0x0067, 0x00A4, 0x006B, 0x00A5, 0x003D,
+ 0x00A6, 0x0063, 0x00A7, 0x02D0, 0x00A8, 0x0287, 0x00A9, 0x0098,
+ 0x00AA, 0x008C, 0x00AB, 0x006D, 0x00AC, 0x0099, 0x00AD, 0x0097,
+ 0x00AE, 0x009A, 0x00AF, 0x0081, 0x00B0, 0x02C3, 0x00B1, 0x02B6,
+ 0x00B2, 0x009D, 0x00B3, 0x009E, 0x00B4, 0x0285, 0x00B5, 0x009F,
+ 0x00B6, 0x030A, 0x00B7, 0x0075, 0x00B8, 0x0086, 0x00B9, 0x00A0,
+ 0x00BA, 0x0090, 0x00BB, 0x007B, 0x00BC, 0x00A1, 0x00BD, 0x00A2,
+ 0x00BE, 0x00A3, 0x00BF, 0x007E, 0x00C0, 0x00A4, 0x00C1, 0x00A5,
+ 0x00C2, 0x00A6, 0x00C3, 0x00A7, 0x00C4, 0x00A8, 0x00C5, 0x00A9,
+ 0x00C6, 0x008B, 0x00C7, 0x00AA, 0x00C8, 0x00AB, 0x00C9, 0x00AC,
+ 0x00CA, 0x00AD, 0x00CB, 0x00AE, 0x00CC, 0x00AF, 0x00CD, 0x00B0,
+ 0x00CE, 0x00B1, 0x00CF, 0x00B2, 0x00D0, 0x00B3, 0x00D1, 0x00B4,
+ 0x00D2, 0x00B5, 0x00D3, 0x00B6, 0x00D4, 0x00B7, 0x00D5, 0x00B8,
+ 0x00D6, 0x00B9, 0x00D7, 0x02B7, 0x00D8, 0x008E, 0x00D9, 0x00BB,
+ 0x00DA, 0x00BC, 0x00DB, 0x00BD, 0x00DC, 0x00BE, 0x00DD, 0x00BF,
+ 0x00DE, 0x00C0, 0x00DF, 0x0096, 0x00E0, 0x00C1, 0x00E1, 0x00C2,
+ 0x00E2, 0x00C3, 0x00E3, 0x00C4, 0x00E4, 0x00C5, 0x00E5, 0x00C6,
+ 0x00E6, 0x0091, 0x00E7, 0x00C7, 0x00E8, 0x00C8, 0x00E9, 0x00C9,
+ 0x00EA, 0x00CA, 0x00EB, 0x00CB, 0x00EC, 0x00CC, 0x00ED, 0x00CD,
+ 0x00EE, 0x00CE, 0x00EF, 0x00CF, 0x00F0, 0x00D0, 0x00F1, 0x00D1,
+ 0x00F2, 0x00D2, 0x00F3, 0x00D3, 0x00F4, 0x00D4, 0x00F5, 0x00D5,
+ 0x00F6, 0x00D6, 0x00F7, 0x02B8, 0x00F8, 0x0094, 0x00F9, 0x00D8,
+ 0x00FA, 0x00D9, 0x00FB, 0x00DA, 0x00FC, 0x00DB, 0x00FD, 0x00DC,
+ 0x00FE, 0x00DD, 0x00FF, 0x00DE, 0x0100, 0x2496, 0x0101, 0x2491,
+ 0x0112, 0x2499, 0x0113, 0x2494, 0x011A, 0x24B3, 0x011B, 0x24BF,
+ 0x0127, 0x2F3C, 0x0128, 0x24B8, 0x0129, 0x24C4, 0x012A, 0x2497,
+ 0x012B, 0x2492, 0x0131, 0x0092, 0x0141, 0x008D, 0x0142, 0x0093,
+ 0x014B, 0x24DC, 0x014C, 0x249A, 0x014D, 0x2495, 0x0152, 0x008F,
+ 0x0153, 0x0095, 0x0160, 0x00DF, 0x0161, 0x00E3, 0x0168, 0x24BD,
+ 0x0169, 0x24C9, 0x016A, 0x2498, 0x016B, 0x2493, 0x016E, 0x24BC,
+ 0x016F, 0x24C8, 0x0178, 0x00E0, 0x017D, 0x00E1, 0x017E, 0x00E5,
+ 0x01C0, 0x0063, 0x01CD, 0x24B2, 0x01CE, 0x24BE, 0x01CF, 0x24B6,
+ 0x01D0, 0x24C2, 0x01D1, 0x24B9, 0x01D2, 0x24C5, 0x01D3, 0x24BB,
+ 0x01D4, 0x24C7, 0x01FD, 0x24CD, 0x0251, 0x24CA, 0x0254, 0x24CF,
+ 0x0259, 0x24D2, 0x025A, 0x24D5, 0x025B, 0x24D8, 0x0275, 0x24DD,
+ 0x0283, 0x24E2, 0x028C, 0x24DE, 0x0292, 0x24E1, 0x02D0, 0x24E3,
+ 0x0300, 0x0041, 0x0301, 0x007F, 0x0302, 0x0080, 0x0303, 0x005F,
+ 0x0304, 0x0081, 0x0305, 0x00E2, 0x0306, 0x0082, 0x0307, 0x0083,
+ 0x0308, 0x0084, 0x030A, 0x0085, 0x030B, 0x0087, 0x030C, 0x0089,
+ 0x0327, 0x0086, 0x0328, 0x0088, 0x0332, 0x0040, 0x0336, 0x008A,
+ 0x0361, 0x02F6, 0x0391, 0x03F3, 0x0392, 0x03F4, 0x0393, 0x03F5,
+ 0x0394, 0x03F6, 0x0395, 0x03F7, 0x0396, 0x03F8, 0x0397, 0x03F9,
+ 0x0398, 0x03FA, 0x0399, 0x03FB, 0x039A, 0x03FC, 0x039B, 0x03FD,
+ 0x039C, 0x03FE, 0x039D, 0x03FF, 0x039E, 0x0400, 0x039F, 0x0401,
+ 0x03A0, 0x0402, 0x03A1, 0x0403, 0x03A3, 0x0404, 0x03A4, 0x0405,
+ 0x03A5, 0x0406, 0x03A6, 0x0407, 0x03A7, 0x0408, 0x03A8, 0x0409,
+ 0x03A9, 0x040A, 0x03B1, 0x040B, 0x03B2, 0x040C, 0x03B3, 0x040D,
+ 0x03B4, 0x040E, 0x03B5, 0x040F, 0x03B6, 0x0410, 0x03B7, 0x0411,
+ 0x03B8, 0x0412, 0x03B9, 0x0413, 0x03BA, 0x0414, 0x03BB, 0x0415,
+ 0x03BC, 0x0416, 0x03BD, 0x0417, 0x03BE, 0x0418, 0x03BF, 0x0419,
+ 0x03C0, 0x041A, 0x03C1, 0x041B, 0x03C3, 0x041C, 0x03C4, 0x041D,
+ 0x03C5, 0x041E, 0x03C6, 0x041F, 0x03C7, 0x0420, 0x03C8, 0x0421,
+ 0x03C9, 0x0422, 0x03D0, 0x2F3A, 0x03D1, 0x2F40, 0x03DB, 0x2F3F,
+ 0x0401, 0x0429, 0x0410, 0x0423, 0x0411, 0x0424, 0x0412, 0x0425,
+ 0x0413, 0x0426, 0x0414, 0x0427, 0x0415, 0x0428, 0x0416, 0x042A,
+ 0x0417, 0x042B, 0x0418, 0x042C, 0x0419, 0x042D, 0x041A, 0x042E,
+ 0x041B, 0x042F, 0x041C, 0x0430, 0x041D, 0x0431, 0x041E, 0x0432,
+ 0x041F, 0x0433, 0x0420, 0x0434, 0x0421, 0x0435, 0x0422, 0x0436,
+ 0x0423, 0x0437, 0x0424, 0x0438, 0x0425, 0x0439, 0x0426, 0x043A,
+ 0x0427, 0x043B, 0x0428, 0x043C, 0x0429, 0x043D, 0x042A, 0x043E,
+ 0x042B, 0x043F, 0x042C, 0x0440, 0x042D, 0x0441, 0x042E, 0x0442,
+ 0x042F, 0x0443, 0x0430, 0x0444, 0x0431, 0x0445, 0x0432, 0x0446,
+ 0x0433, 0x0447, 0x0434, 0x0448, 0x0435, 0x0449, 0x0436, 0x044B,
+ 0x0437, 0x044C, 0x0438, 0x044D, 0x0439, 0x044E, 0x043A, 0x044F,
+ 0x043B, 0x0450, 0x043C, 0x0451, 0x043D, 0x0452, 0x043E, 0x0453,
+ 0x043F, 0x0454, 0x0440, 0x0455, 0x0441, 0x0456, 0x0442, 0x0457,
+ 0x0443, 0x0458, 0x0444, 0x0459, 0x0445, 0x045A, 0x0446, 0x045B,
+ 0x0447, 0x045C, 0x0448, 0x045D, 0x0449, 0x045E, 0x044A, 0x045F,
+ 0x044B, 0x0460, 0x044C, 0x0461, 0x044D, 0x0462, 0x044E, 0x0463,
+ 0x044F, 0x0464, 0x0451, 0x044A, 0x045B, 0x2F3C, 0x1EBC, 0x24B5,
+ 0x1EBD, 0x24C1, 0x2002, 0x00E7, 0x2003, 0x0279, 0x2010, 0x0296,
+ 0x2011, 0x000E, 0x2012, 0x0072, 0x2013, 0x0072, 0x2014, 0x008A,
+ 0x2015, 0x0295, 0x2016, 0x029A, 0x2018, 0x029E, 0x2019, 0x029F,
+ 0x201A, 0x0078, 0x201C, 0x02A0, 0x201D, 0x02A1, 0x201E, 0x0079,
+ 0x2020, 0x0308, 0x2021, 0x0309, 0x2022, 0x0077, 0x2025, 0x029D,
+ 0x2026, 0x029C, 0x2030, 0x0304, 0x2032, 0x02C4, 0x2033, 0x02C5,
+ 0x2039, 0x006E, 0x203A, 0x006F, 0x203B, 0x02DE, 0x203C, 0x2F4F,
+ 0x203E, 0x0145, 0x2044, 0x0068, 0x2049, 0x2F50, 0x2070, 0x24A1,
+ 0x2074, 0x24A2, 0x2075, 0x24A3, 0x2076, 0x24A4, 0x2077, 0x24A5,
+ 0x2078, 0x24A6, 0x2079, 0x24A7, 0x2080, 0x24A8, 0x2081, 0x24A9,
+ 0x2082, 0x24AA, 0x2083, 0x24AB, 0x2084, 0x24AC, 0x2085, 0x24AD,
+ 0x2086, 0x24AE, 0x2087, 0x24AF, 0x2088, 0x24B0, 0x2089, 0x24B1,
+ 0x20AC, 0x248A, 0x20DD, 0x030B, 0x2100, 0x2E4F, 0x2103, 0x02C6,
+ 0x2105, 0x2E53, 0x2109, 0x2071, 0x210A, 0x2070, 0x210F, 0x2F3C,
+ 0x2113, 0x1F59, 0x2116, 0x1DBA, 0x2121, 0x1F77, 0x2122, 0x00E4,
+ 0x2126, 0x248B, 0x212B, 0x0303, 0x2135, 0x2F39, 0x2153, 0x249F,
+ 0x2154, 0x24A0, 0x215B, 0x249B, 0x215C, 0x249C, 0x215D, 0x249D,
+ 0x215E, 0x249E, 0x2160, 0x1D97, 0x2161, 0x1D98, 0x2162, 0x1D99,
+ 0x2163, 0x1D9A, 0x2164, 0x1D9B, 0x2165, 0x1D9C, 0x2166, 0x1D9D,
+ 0x2167, 0x1D9E, 0x2168, 0x1D9F, 0x2169, 0x1DA0, 0x216A, 0x2021,
+ 0x216B, 0x2022, 0x2170, 0x1F9C, 0x2171, 0x1F9D, 0x2172, 0x1F9E,
+ 0x2173, 0x1F9F, 0x2174, 0x1FA0, 0x2175, 0x1FA1, 0x2176, 0x1FA2,
+ 0x2177, 0x1FA3, 0x2178, 0x1FA4, 0x2179, 0x1FA5, 0x217A, 0x206A,
+ 0x217B, 0x206B, 0x217F, 0x206F, 0x2190, 0x02E1, 0x2191, 0x02E2,
+ 0x2192, 0x02E0, 0x2193, 0x02E3, 0x2194, 0x2FA9, 0x2195, 0x2FB7,
+ 0x2196, 0x2FAC, 0x2197, 0x2FAD, 0x2198, 0x2FAA, 0x2199, 0x2FAB,
+ 0x21C4, 0x2076, 0x21C5, 0x2077, 0x21C6, 0x2075, 0x21CC, 0x2FAE,
+ 0x21D0, 0x2FA8, 0x21D2, 0x02F0, 0x21D4, 0x02F1, 0x21E6, 0x1F4D,
+ 0x21E7, 0x1F4C, 0x21E8, 0x1F4E, 0x21E9, 0x1F4B, 0x2200, 0x02F2,
+ 0x2202, 0x02F7, 0x2203, 0x02F3, 0x2205, 0x2F98, 0x2207, 0x02F8,
+ 0x2208, 0x02E5, 0x220A, 0x2F3B, 0x220B, 0x02E6, 0x2211, 0x1DC9,
+ 0x2212, 0x02B5, 0x2213, 0x2F56, 0x221A, 0x02FD, 0x221D, 0x02FF,
+ 0x221E, 0x02BF, 0x221F, 0x1DCD, 0x2220, 0x02F4, 0x2225, 0x029A,
+ 0x2227, 0x02ED, 0x2228, 0x02EE, 0x2229, 0x02EC, 0x222A, 0x02EB,
+ 0x222B, 0x0301, 0x222C, 0x0302, 0x222D, 0x2003, 0x222E, 0x1DC8,
+ 0x2234, 0x02C0, 0x2235, 0x0300, 0x223C, 0x0299, 0x223D, 0x02FE,
+ 0x2243, 0x2F58, 0x2252, 0x02FA, 0x2260, 0x02BA, 0x2261, 0x02F9,
+ 0x2266, 0x02BD, 0x2267, 0x02BE, 0x226A, 0x02FB, 0x226B, 0x02FC,
+ 0x2272, 0x2F59, 0x2273, 0x2F5A, 0x2282, 0x02E9, 0x2283, 0x02EA,
+ 0x2286, 0x02E7, 0x2287, 0x02E8, 0x2295, 0x2F9C, 0x2296, 0x2F9A,
+ 0x2297, 0x2F9D, 0x2298, 0x2F9B, 0x229D, 0x2F9A, 0x229E, 0x2F9E,
+ 0x22A0, 0x2F99, 0x22A5, 0x02F5, 0x22BF, 0x1DCE, 0x22EE, 0x1ED9,
+ 0x22EF, 0x029C, 0x2300, 0x2F98, 0x2307, 0x2FBB, 0x2312, 0x02F6,
+ 0x244A, 0x2F54, 0x2460, 0x1D83, 0x2461, 0x1D84, 0x2462, 0x1D85,
+ 0x2463, 0x1D86, 0x2464, 0x1D87, 0x2465, 0x1D88, 0x2466, 0x1D89,
+ 0x2467, 0x1D8A, 0x2468, 0x1D8B, 0x2469, 0x1D8C, 0x246A, 0x1D8D,
+ 0x246B, 0x1D8E, 0x246C, 0x1D8F, 0x246D, 0x1D90, 0x246E, 0x1D91,
+ 0x246F, 0x1D92, 0x2470, 0x1D93, 0x2471, 0x1D94, 0x2472, 0x1D95,
+ 0x2473, 0x1D96, 0x2474, 0x1F87, 0x2475, 0x1F88, 0x2476, 0x1F89,
+ 0x2477, 0x1F8A, 0x2478, 0x1F8B, 0x2479, 0x1F8C, 0x247A, 0x1F8D,
+ 0x247B, 0x1F8E, 0x247C, 0x1F8F, 0x247D, 0x1F90, 0x247E, 0x1F91,
+ 0x247F, 0x1F92, 0x2480, 0x1F93, 0x2481, 0x1F94, 0x2482, 0x1F95,
+ 0x2483, 0x1F96, 0x2484, 0x1F97, 0x2485, 0x1F98, 0x2486, 0x1F99,
+ 0x2487, 0x1F9A, 0x2488, 0x1F7E, 0x2489, 0x1F7F, 0x248A, 0x1F80,
+ 0x248B, 0x1F81, 0x248C, 0x1F82, 0x248D, 0x1F83, 0x248E, 0x1F84,
+ 0x248F, 0x1F85, 0x2490, 0x1F86, 0x249C, 0x1FB0, 0x249D, 0x1FB1,
+ 0x249E, 0x1FB2, 0x249F, 0x1FB3, 0x24A0, 0x1FB4, 0x24A1, 0x1FB5,
+ 0x24A2, 0x1FB6, 0x24A3, 0x1FB7, 0x24A4, 0x1FB8, 0x24A5, 0x1FB9,
+ 0x24A6, 0x1FBA, 0x24A7, 0x1FBB, 0x24A8, 0x1FBC, 0x24A9, 0x1FBD,
+ 0x24AA, 0x1FBE, 0x24AB, 0x1FBF, 0x24AC, 0x1FC0, 0x24AD, 0x1FC1,
+ 0x24AE, 0x1FC2, 0x24AF, 0x1FC3, 0x24B0, 0x1FC4, 0x24B1, 0x1FC5,
+ 0x24B2, 0x1FC6, 0x24B3, 0x1FC7, 0x24B4, 0x1FC8, 0x24B5, 0x1FC9,
+ 0x24B6, 0x2863, 0x24B7, 0x2864, 0x24B8, 0x2865, 0x24B9, 0x2866,
+ 0x24BA, 0x2867, 0x24BB, 0x2868, 0x24BC, 0x2869, 0x24BD, 0x286A,
+ 0x24BE, 0x286B, 0x24BF, 0x286C, 0x24C0, 0x286D, 0x24C1, 0x286E,
+ 0x24C2, 0x286F, 0x24C3, 0x2870, 0x24C4, 0x2871, 0x24C5, 0x2872,
+ 0x24C6, 0x2873, 0x24C7, 0x2874, 0x24C8, 0x2875, 0x24C9, 0x2876,
+ 0x24CA, 0x2877, 0x24CB, 0x2878, 0x24CC, 0x2879, 0x24CD, 0x287A,
+ 0x24CE, 0x287B, 0x24CF, 0x287C, 0x24D0, 0x2849, 0x24D1, 0x284A,
+ 0x24D2, 0x284B, 0x24D3, 0x284C, 0x24D4, 0x284D, 0x24D5, 0x284E,
+ 0x24D6, 0x284F, 0x24D7, 0x2850, 0x24D8, 0x2851, 0x24D9, 0x2852,
+ 0x24DA, 0x2853, 0x24DB, 0x2854, 0x24DC, 0x2855, 0x24DD, 0x2856,
+ 0x24DE, 0x2857, 0x24DF, 0x2858, 0x24E0, 0x2859, 0x24E1, 0x285A,
+ 0x24E2, 0x285B, 0x24E3, 0x285C, 0x24E4, 0x285D, 0x24E5, 0x285E,
+ 0x24E6, 0x285F, 0x24E7, 0x2860, 0x24E8, 0x2861, 0x24E9, 0x2862,
+ 0x24EA, 0x2020, 0x2500, 0x1D37, 0x2501, 0x1D38, 0x2502, 0x1D39,
+ 0x2503, 0x1D3A, 0x2504, 0x1D3B, 0x2505, 0x1D3C, 0x2506, 0x1D3D,
+ 0x2507, 0x1D3E, 0x2508, 0x1D3F, 0x2509, 0x1D40, 0x250A, 0x1D41,
+ 0x250B, 0x1D42, 0x250C, 0x1D43, 0x250D, 0x1D44, 0x250E, 0x1D45,
+ 0x250F, 0x1D46, 0x2510, 0x1D47, 0x2511, 0x1D48, 0x2512, 0x1D49,
+ 0x2513, 0x1D4A, 0x2514, 0x1D4B, 0x2515, 0x1D4C, 0x2516, 0x1D4D,
+ 0x2517, 0x1D4E, 0x2518, 0x1D4F, 0x2519, 0x1D50, 0x251A, 0x1D51,
+ 0x251B, 0x1D52, 0x251C, 0x1D53, 0x251D, 0x1D54, 0x251E, 0x1D55,
+ 0x251F, 0x1D56, 0x2520, 0x1D57, 0x2521, 0x1D58, 0x2522, 0x1D59,
+ 0x2523, 0x1D5A, 0x2524, 0x1D5B, 0x2525, 0x1D5C, 0x2526, 0x1D5D,
+ 0x2527, 0x1D5E, 0x2528, 0x1D5F, 0x2529, 0x1D60, 0x252A, 0x1D61,
+ 0x252B, 0x1D62, 0x252C, 0x1D63, 0x252D, 0x1D64, 0x252E, 0x1D65,
+ 0x252F, 0x1D66, 0x2530, 0x1D67, 0x2531, 0x1D68, 0x2532, 0x1D69,
+ 0x2533, 0x1D6A, 0x2534, 0x1D6B, 0x2535, 0x1D6C, 0x2536, 0x1D6D,
+ 0x2537, 0x1D6E, 0x2538, 0x1D6F, 0x2539, 0x1D70, 0x253A, 0x1D71,
+ 0x253B, 0x1D72, 0x253C, 0x1D73, 0x253D, 0x1D74, 0x253E, 0x1D75,
+ 0x253F, 0x1D76, 0x2540, 0x1D77, 0x2541, 0x1D78, 0x2542, 0x1D79,
+ 0x2543, 0x1D7A, 0x2544, 0x1D7B, 0x2545, 0x1D7C, 0x2546, 0x1D7D,
+ 0x2547, 0x1D7E, 0x2548, 0x1D7F, 0x2549, 0x1D80, 0x254A, 0x1D81,
+ 0x254B, 0x1D82, 0x2550, 0x203B, 0x255E, 0x203C, 0x2561, 0x203E,
+ 0x256A, 0x203D, 0x256D, 0x2037, 0x256E, 0x2038, 0x256F, 0x203A,
+ 0x2570, 0x2039, 0x2571, 0x2045, 0x2572, 0x2046, 0x2573, 0x2047,
+ 0x2581, 0x2026, 0x2582, 0x2027, 0x2583, 0x2028, 0x2584, 0x2029,
+ 0x2585, 0x202A, 0x2586, 0x202B, 0x2587, 0x202C, 0x2588, 0x202D,
+ 0x2589, 0x2034, 0x258A, 0x2033, 0x258B, 0x2032, 0x258C, 0x2031,
+ 0x258D, 0x2030, 0x258E, 0x202F, 0x258F, 0x202E, 0x2594, 0x2035,
+ 0x2595, 0x2036, 0x25A0, 0x02D9, 0x25A1, 0x02D8, 0x25A2, 0x1F4F,
+ 0x25AA, 0x2FCF, 0x25AB, 0x2FCD, 0x25B2, 0x02DB, 0x25B3, 0x02DA,
+ 0x25B6, 0x2FA3, 0x25B7, 0x1F4A, 0x25BC, 0x02DD, 0x25BD, 0x02DC,
+ 0x25C0, 0x2FA2, 0x25C1, 0x1F49, 0x25C6, 0x02D7, 0x25C7, 0x02D6,
+ 0x25C9, 0x2012, 0x25CB, 0x02D3, 0x25CC, 0x2906, 0x25CE, 0x02D5,
+ 0x25CF, 0x02D4, 0x25E2, 0x203F, 0x25E3, 0x2040, 0x25E4, 0x2042,
+ 0x25E5, 0x2041, 0x25E6, 0x2FDE, 0x25EF, 0x030B, 0x2600, 0x2017,
+ 0x2601, 0x2018, 0x2602, 0x2019, 0x2603, 0x201A, 0x2605, 0x02D2,
+ 0x2606, 0x02D1, 0x260E, 0x1F78, 0x2612, 0x2F99, 0x261C, 0x201C,
+ 0x261D, 0x201D, 0x261E, 0x201B, 0x261F, 0x201E, 0x2640, 0x02C2,
+ 0x2642, 0x02C1, 0x2660, 0x2013, 0x2661, 0x1F51, 0x2662, 0x1F53,
+ 0x2663, 0x2015, 0x2664, 0x1F52, 0x2665, 0x2014, 0x2666, 0x2016,
+ 0x2667, 0x1F50, 0x2668, 0x2F42, 0x2669, 0x2F43, 0x266A, 0x0307,
+ 0x266C, 0x2F44, 0x266D, 0x0306, 0x266F, 0x0305, 0x2702, 0x2F90,
+ 0x271A, 0x2FD1, 0x2756, 0x2FE3, 0x2776, 0x205E, 0x2777, 0x205F,
+ 0x2778, 0x2060, 0x2779, 0x2061, 0x277A, 0x2062, 0x277B, 0x2063,
+ 0x277C, 0x2064, 0x277D, 0x2065, 0x277E, 0x2066, 0x27A1, 0x200E,
+ 0x2E83, 0x37E1, 0x2E85, 0x3620, 0x2E87, 0x3719, 0x2E89, 0x3814,
+ 0x2E8B, 0x371E, 0x2E8C, 0x3609, 0x2E8D, 0x360A, 0x2E8E, 0x1071,
+ 0x2E8F, 0x388C, 0x2E90, 0x1226, 0x2E92, 0x0EB2, 0x2E93, 0x1283,
+ 0x2E94, 0x12AB, 0x2E95, 0x3C1F, 0x2E96, 0x38C2, 0x2E97, 0x361C,
+ 0x2E98, 0x38E1, 0x2E99, 0x13C3, 0x2E9B, 0x13E1, 0x2E9F, 0x0E3C,
+ 0x2EA0, 0x0EBD, 0x2EA1, 0x3961, 0x2EA2, 0x3962, 0x2EA3, 0x399D,
+ 0x2EA4, 0x3C26, 0x2EA6, 0x374D, 0x2EA8, 0x39BC, 0x2EA9, 0x35A1,
+ 0x2EAA, 0x36AB, 0x2EAB, 0x3A97, 0x2EAC, 0x08D4, 0x2EAD, 0x3A39,
+ 0x2EAE, 0x3662, 0x2EB1, 0x3A98, 0x2EB2, 0x3A97, 0x2EB3, 0x376D,
+ 0x2EB7, 0x36FE, 0x2EB9, 0x3713, 0x2EBC, 0x35B3, 0x2EBD, 0x354E,
+ 0x2EBE, 0x3775, 0x2EBF, 0x3776, 0x2EC0, 0x3777, 0x2EC1, 0x078B,
+ 0x2EC2, 0x3B0A, 0x2EC3, 0x362E, 0x2EC4, 0x0A62, 0x2EC6, 0x3572,
+ 0x2ECA, 0x364A, 0x2ECC, 0x3C2B, 0x2ECD, 0x3B50, 0x2ECF, 0x3B9E,
+ 0x2ED1, 0x0BD5, 0x2ED2, 0x3B97, 0x2ED6, 0x3B9E, 0x2ED7, 0x354D,
+ 0x2ED8, 0x0A68, 0x2EDD, 0x3617, 0x2EDE, 0x3619, 0x2EDF, 0x3618,
+ 0x2EE4, 0x064E, 0x2EE8, 0x0D34, 0x2EE9, 0x052B, 0x2EEB, 0x0A6A,
+ 0x2EED, 0x08C3, 0x2EEF, 0x0F7D, 0x2EF2, 0x064F, 0x2F00, 0x04B0,
+ 0x2F01, 0x20B3, 0x2F02, 0x0FFF, 0x2F03, 0x1001, 0x2F04, 0x0535,
+ 0x2F05, 0x1006, 0x2F06, 0x0CCB, 0x2F07, 0x100E, 0x2F08, 0x0A13,
+ 0x2F09, 0x1070, 0x2F0A, 0x0CD6, 0x2F0B, 0x0D40, 0x2F0C, 0x107B,
+ 0x2F0D, 0x1083, 0x2F0E, 0x1089, 0x2F0F, 0x1093, 0x2F10, 0x1098,
+ 0x2F11, 0x0C5B, 0x2F12, 0x0F97, 0x2F13, 0x10C6, 0x2F14, 0x10CD,
+ 0x2F15, 0x10CE, 0x2F16, 0x10D3, 0x2F17, 0x0947, 0x2F18, 0x0E7C,
+ 0x2F19, 0x10DC, 0x2F1A, 0x10E1, 0x2F1B, 0x10E8, 0x2F1C, 0x0EA2,
+ 0x2F1D, 0x07B1, 0x2F1E, 0x116B, 0x2F1F, 0x0C54, 0x2F20, 0x089C,
+ 0x2F21, 0x11BA, 0x2F22, 0x11BB, 0x2F23, 0x0F26, 0x2F24, 0x0B47,
+ 0x2F25, 0x0981, 0x2F26, 0x08A0, 0x2F27, 0x120E, 0x2F28, 0x0A47,
+ 0x2F29, 0x0996, 0x2F2A, 0x1226, 0x2F2B, 0x1228, 0x2F2C, 0x1232,
+ 0x2F2D, 0x0881, 0x2F2E, 0x126C, 0x2F2F, 0x07BB, 0x2F30, 0x077E,
+ 0x2F31, 0x06CA, 0x2F32, 0x05EF, 0x2F33, 0x1283, 0x2F34, 0x1285,
+ 0x2F35, 0x1299, 0x2F36, 0x129B, 0x2F37, 0x12A0, 0x2F38, 0x0677,
+ 0x2F39, 0x38B9, 0x2F3A, 0x12AF, 0x2F3B, 0x12B1, 0x2F3C, 0x09FA,
+ 0x2F3D, 0x1342, 0x2F3E, 0x0781, 0x2F3F, 0x0916, 0x2F40, 0x08A7,
+ 0x2F41, 0x13C2, 0x2F42, 0x0E08, 0x2F43, 0x0C47, 0x2F44, 0x06CC,
+ 0x2F45, 0x0E4D, 0x2F46, 0x13E0, 0x2F47, 0x0CD4, 0x2F48, 0x140C,
+ 0x2F49, 0x0744, 0x2F4A, 0x0EE6, 0x2F4B, 0x073D, 0x2F4C, 0x08AD,
+ 0x2F4D, 0x14E5, 0x2F4E, 0x14F4, 0x2F4F, 0x14F8, 0x2F50, 0x0D7A,
+ 0x2F51, 0x0EDF, 0x2F52, 0x08AF, 0x2F53, 0x1502, 0x2F54, 0x0A2B,
+ 0x2F55, 0x0550, 0x2F56, 0x0BFA, 0x2F57, 0x0DD5, 0x2F58, 0x15E4,
+ 0x2F59, 0x15E6, 0x2F5A, 0x0E22, 0x2F5B, 0x0567, 0x2F5C, 0x0687,
+ 0x2F5D, 0x0758, 0x2F5E, 0x0770, 0x2F5F, 0x06C4, 0x2F60, 0x04DD,
+ 0x2F61, 0x05E0, 0x2F62, 0x0601, 0x2F63, 0x0A5C, 0x2F64, 0x0F3B,
+ 0x2F65, 0x0C3E, 0x2F66, 0x0D97, 0x2F67, 0x3A00, 0x2F68, 0x1697,
+ 0x2F69, 0x0D28, 0x2F6A, 0x0D7D, 0x2F6B, 0x087C, 0x2F6C, 0x0EE8,
+ 0x2F6D, 0x0EC3, 0x2F6E, 0x0EFC, 0x2F6F, 0x0A74, 0x2F70, 0x08D4,
+ 0x2F71, 0x3A41, 0x2F72, 0x0553, 0x2F73, 0x0740, 0x2F74, 0x0F71,
+ 0x2F75, 0x0B9B, 0x2F76, 0x0E16, 0x2F77, 0x08B3, 0x2F78, 0x0608,
+ 0x2F79, 0x1813, 0x2F7A, 0x0F3D, 0x2F7B, 0x04CB, 0x2F7C, 0x0FDD,
+ 0x2F7D, 0x08D5, 0x2F7E, 0x183D, 0x2F7F, 0x08D6, 0x2F80, 0x1853,
+ 0x2F81, 0x0CD1, 0x2F82, 0x0A09, 0x2F83, 0x08D7, 0x2F84, 0x08B8,
+ 0x2F85, 0x04D3, 0x2F86, 0x0A89, 0x2F87, 0x0AA6, 0x2F88, 0x0938,
+ 0x2F89, 0x0821, 0x2F8A, 0x09ED, 0x2F8B, 0x18B2, 0x2F8C, 0x194F,
+ 0x2F8D, 0x0BAC, 0x2F8E, 0x0742, 0x2F8F, 0x07E6, 0x2F90, 0x04A5,
+ 0x2F91, 0x19EB, 0x2F92, 0x075F, 0x2F93, 0x05AF, 0x2F94, 0x0774,
+ 0x2F95, 0x0B69, 0x2F96, 0x0C7E, 0x2F97, 0x1A56, 0x2F98, 0x1A59,
+ 0x2F99, 0x058B, 0x2F9A, 0x0A7A, 0x2F9B, 0x0AF8, 0x2F9C, 0x0B0D,
+ 0x2F9D, 0x0A0E, 0x2F9E, 0x0902, 0x2F9F, 0x0A0F, 0x2FA0, 0x0B62,
+ 0x2FA1, 0x3B4F, 0x2FA2, 0x0F22, 0x2FA3, 0x0CAB, 0x2FA4, 0x0D64,
+ 0x2FA5, 0x0F6C, 0x2FA6, 0x06DA, 0x2FA7, 0x0BD5, 0x2FA8, 0x0EF3,
+ 0x2FA9, 0x0DDE, 0x2FAA, 0x1BC9, 0x2FAB, 0x1BCB, 0x2FAC, 0x04CD,
+ 0x2FAD, 0x21F7, 0x2FAE, 0x0D87, 0x2FAF, 0x0ED8, 0x2FB0, 0x05B5,
+ 0x2FB1, 0x1C03, 0x2FB2, 0x1C05, 0x2FB3, 0x053B, 0x2FB4, 0x0E17,
+ 0x2FB5, 0x0DE9, 0x2FB6, 0x0D88, 0x2FB7, 0x09EF, 0x2FB8, 0x091F,
+ 0x2FB9, 0x07F3, 0x2FBA, 0x0D05, 0x2FBB, 0x080E, 0x2FBC, 0x07F4,
+ 0x2FBD, 0x1C6C, 0x2FBE, 0x1C7D, 0x2FBF, 0x1C83, 0x2FC0, 0x1C84,
+ 0x2FC1, 0x064E, 0x2FC2, 0x0695, 0x2FC3, 0x0BD7, 0x2FC4, 0x1CF6,
+ 0x2FC5, 0x08DB, 0x2FC6, 0x1D01, 0x2FC7, 0x0E91, 0x2FC8, 0x340B,
+ 0x2FC9, 0x066A, 0x2FCA, 0x0807, 0x2FCB, 0x1D16, 0x2FCC, 0x1D19,
+ 0x2FCD, 0x0C1E, 0x2FCE, 0x0791, 0x2FCF, 0x0ACF, 0x2FD0, 0x0D93,
+ 0x2FD1, 0x1D21, 0x2FD2, 0x1D22, 0x2FD3, 0x0F7E, 0x2FD4, 0x1D30,
+ 0x2FD5, 0x1D31, 0x3000, 0x0279, 0x3001, 0x027A, 0x3002, 0x027B,
+ 0x3003, 0x028F, 0x3004, 0x2074, 0x3005, 0x0291, 0x3006, 0x0292,
+ 0x3007, 0x0293, 0x3008, 0x02AA, 0x3009, 0x02AB, 0x300A, 0x02AC,
+ 0x300B, 0x02AD, 0x300C, 0x02AE, 0x300D, 0x02AF, 0x300E, 0x02B0,
+ 0x300F, 0x02B1, 0x3010, 0x02B2, 0x3011, 0x02B3, 0x3012, 0x02DF,
+ 0x3013, 0x02E4, 0x3014, 0x02A4, 0x3015, 0x02A5, 0x301C, 0x0299,
+ 0x301D, 0x1DB8, 0x301F, 0x1DB9, 0x3020, 0x1F7A, 0x3030, 0x2FBA,
+ 0x3033, 0x2F4C, 0x3034, 0x2F4D, 0x3035, 0x2F4E, 0x3036, 0x1F79,
+ 0x3041, 0x034A, 0x3042, 0x034B, 0x3043, 0x034C, 0x3044, 0x034D,
+ 0x3045, 0x034E, 0x3046, 0x034F, 0x3047, 0x0350, 0x3048, 0x0351,
+ 0x3049, 0x0352, 0x304A, 0x0353, 0x304B, 0x0354, 0x304C, 0x0355,
+ 0x304D, 0x0356, 0x304E, 0x0357, 0x304F, 0x0358, 0x3050, 0x0359,
+ 0x3051, 0x035A, 0x3052, 0x035B, 0x3053, 0x035C, 0x3054, 0x035D,
+ 0x3055, 0x035E, 0x3056, 0x035F, 0x3057, 0x0360, 0x3058, 0x0361,
+ 0x3059, 0x0362, 0x305A, 0x0363, 0x305B, 0x0364, 0x305C, 0x0365,
+ 0x305D, 0x0366, 0x305E, 0x0367, 0x305F, 0x0368, 0x3060, 0x0369,
+ 0x3061, 0x036A, 0x3062, 0x036B, 0x3063, 0x036C, 0x3064, 0x036D,
+ 0x3065, 0x036E, 0x3066, 0x036F, 0x3067, 0x0370, 0x3068, 0x0371,
+ 0x3069, 0x0372, 0x306A, 0x0373, 0x306B, 0x0374, 0x306C, 0x0375,
+ 0x306D, 0x0376, 0x306E, 0x0377, 0x306F, 0x0378, 0x3070, 0x0379,
+ 0x3071, 0x037A, 0x3072, 0x037B, 0x3073, 0x037C, 0x3074, 0x037D,
+ 0x3075, 0x037E, 0x3076, 0x037F, 0x3077, 0x0380, 0x3078, 0x0381,
+ 0x3079, 0x0382, 0x307A, 0x0383, 0x307B, 0x0384, 0x307C, 0x0385,
+ 0x307D, 0x0386, 0x307E, 0x0387, 0x307F, 0x0388, 0x3080, 0x0389,
+ 0x3081, 0x038A, 0x3082, 0x038B, 0x3083, 0x038C, 0x3084, 0x038D,
+ 0x3085, 0x038E, 0x3086, 0x038F, 0x3087, 0x0390, 0x3088, 0x0391,
+ 0x3089, 0x0392, 0x308A, 0x0393, 0x308B, 0x0394, 0x308C, 0x0395,
+ 0x308D, 0x0396, 0x308E, 0x0397, 0x308F, 0x0398, 0x3090, 0x0399,
+ 0x3091, 0x039A, 0x3092, 0x039B, 0x3093, 0x039C, 0x3094, 0x1F16,
+ 0x309B, 0x0283, 0x309C, 0x0284, 0x309D, 0x028D, 0x309E, 0x028E,
+ 0x30A1, 0x039D, 0x30A2, 0x039E, 0x30A3, 0x039F, 0x30A4, 0x03A0,
+ 0x30A5, 0x03A1, 0x30A6, 0x03A2, 0x30A7, 0x03A3, 0x30A8, 0x03A4,
+ 0x30A9, 0x03A5, 0x30AA, 0x03A6, 0x30AB, 0x03A7, 0x30AC, 0x03A8,
+ 0x30AD, 0x03A9, 0x30AE, 0x03AA, 0x30AF, 0x03AB, 0x30B0, 0x03AC,
+ 0x30B1, 0x03AD, 0x30B2, 0x03AE, 0x30B3, 0x03AF, 0x30B4, 0x03B0,
+ 0x30B5, 0x03B1, 0x30B6, 0x03B2, 0x30B7, 0x03B3, 0x30B8, 0x03B4,
+ 0x30B9, 0x03B5, 0x30BA, 0x03B6, 0x30BB, 0x03B7, 0x30BC, 0x03B8,
+ 0x30BD, 0x03B9, 0x30BE, 0x03BA, 0x30BF, 0x03BB, 0x30C0, 0x03BC,
+ 0x30C1, 0x03BD, 0x30C2, 0x03BE, 0x30C3, 0x03BF, 0x30C4, 0x03C0,
+ 0x30C5, 0x03C1, 0x30C6, 0x03C2, 0x30C7, 0x03C3, 0x30C8, 0x03C4,
+ 0x30C9, 0x03C5, 0x30CA, 0x03C6, 0x30CB, 0x03C7, 0x30CC, 0x03C8,
+ 0x30CD, 0x03C9, 0x30CE, 0x03CA, 0x30CF, 0x03CB, 0x30D0, 0x03CC,
+ 0x30D1, 0x03CD, 0x30D2, 0x03CE, 0x30D3, 0x03CF, 0x30D4, 0x03D0,
+ 0x30D5, 0x03D1, 0x30D6, 0x03D2, 0x30D7, 0x03D3, 0x30D8, 0x03D4,
+ 0x30D9, 0x03D5, 0x30DA, 0x03D6, 0x30DB, 0x03D7, 0x30DC, 0x03D8,
+ 0x30DD, 0x03D9, 0x30DE, 0x03DA, 0x30DF, 0x03DB, 0x30E0, 0x03DC,
+ 0x30E1, 0x03DD, 0x30E2, 0x03DE, 0x30E3, 0x03DF, 0x30E4, 0x03E0,
+ 0x30E5, 0x03E1, 0x30E6, 0x03E2, 0x30E7, 0x03E3, 0x30E8, 0x03E4,
+ 0x30E9, 0x03E5, 0x30EA, 0x03E6, 0x30EB, 0x03E7, 0x30EC, 0x03E8,
+ 0x30ED, 0x03E9, 0x30EE, 0x03EA, 0x30EF, 0x03EB, 0x30F0, 0x03EC,
+ 0x30F1, 0x03ED, 0x30F2, 0x03EE, 0x30F3, 0x03EF, 0x30F4, 0x03F0,
+ 0x30F5, 0x03F1, 0x30F6, 0x03F2, 0x30F7, 0x2079, 0x30F8, 0x207A,
+ 0x30F9, 0x207B, 0x30FA, 0x207C, 0x30FB, 0x027E, 0x30FC, 0x0294,
+ 0x30FD, 0x028B, 0x30FE, 0x028C, 0x3220, 0x278E, 0x3221, 0x278F,
+ 0x3222, 0x2790, 0x3223, 0x2791, 0x3224, 0x2792, 0x3225, 0x2793,
+ 0x3226, 0x2794, 0x3227, 0x2795, 0x3228, 0x2796, 0x3229, 0x2797,
+ 0x322A, 0x2006, 0x322B, 0x2007, 0x322C, 0x2008, 0x322D, 0x2009,
+ 0x322E, 0x200A, 0x322F, 0x200B, 0x3230, 0x2005, 0x3231, 0x1DC2,
+ 0x3232, 0x1DC3, 0x3233, 0x1FCF, 0x3234, 0x1FCD, 0x3235, 0x1FD4,
+ 0x3236, 0x1FD3, 0x3237, 0x200C, 0x3238, 0x1FCE, 0x3239, 0x1DC4,
+ 0x323A, 0x1FD7, 0x323B, 0x1FD5, 0x323C, 0x1FD0, 0x323D, 0x1FCB,
+ 0x323E, 0x1FD2, 0x323F, 0x1FCC, 0x3240, 0x1FD6, 0x3241, 0x200D,
+ 0x3242, 0x1FD1, 0x3243, 0x1FCA, 0x3280, 0x28DD, 0x3281, 0x28DE,
+ 0x3282, 0x28DF, 0x3283, 0x28E0, 0x3284, 0x28E1, 0x3285, 0x28E2,
+ 0x3286, 0x28E3, 0x3287, 0x28E4, 0x3288, 0x28E5, 0x3289, 0x28E6,
+ 0x328A, 0x28E8, 0x328B, 0x28E9, 0x328C, 0x28EA, 0x328D, 0x28EB,
+ 0x328E, 0x28EC, 0x328F, 0x28ED, 0x3290, 0x28E7, 0x3291, 0x1FE1,
+ 0x3292, 0x1FE0, 0x3293, 0x1FE2, 0x3294, 0x1FDC, 0x3295, 0x28FF,
+ 0x3296, 0x1FE5, 0x3297, 0x28FC, 0x3298, 0x1FDE, 0x3299, 0x201F,
+ 0x329A, 0x28F9, 0x329B, 0x28F8, 0x329C, 0x28FE, 0x329D, 0x207F,
+ 0x329E, 0x1FFF, 0x329F, 0x28EF, 0x32A0, 0x28F6, 0x32A1, 0x28F7,
+ 0x32A2, 0x28FB, 0x32A3, 0x28FA, 0x32A4, 0x1DBD, 0x32A5, 0x1DBE,
+ 0x32A6, 0x1DBF, 0x32A7, 0x1DC0, 0x32A8, 0x1DC1, 0x32A9, 0x1FDA,
+ 0x32AA, 0x1FDD, 0x32AB, 0x1FDF, 0x32AC, 0x1FE3, 0x32AD, 0x1FD9,
+ 0x32AE, 0x1FE4, 0x32AF, 0x1FDB, 0x32B0, 0x1FD8, 0x32D0, 0x28AD,
+ 0x32D1, 0x28AE, 0x32D2, 0x28AF, 0x32D3, 0x28B0, 0x32D4, 0x28B1,
+ 0x32D5, 0x28B2, 0x32D6, 0x28B3, 0x32D7, 0x28B4, 0x32D8, 0x28B5,
+ 0x32D9, 0x28B6, 0x32DA, 0x28B7, 0x32DB, 0x28B8, 0x32DC, 0x28B9,
+ 0x32DD, 0x28BA, 0x32DE, 0x28BB, 0x32DF, 0x28BC, 0x32E0, 0x28BD,
+ 0x32E1, 0x28BE, 0x32E2, 0x28BF, 0x32E3, 0x28C0, 0x32E4, 0x28C1,
+ 0x32E5, 0x28C2, 0x32E6, 0x28C3, 0x32E7, 0x28C4, 0x32E8, 0x28C5,
+ 0x32E9, 0x28C6, 0x32EA, 0x28C7, 0x32EB, 0x28C8, 0x32EC, 0x28C9,
+ 0x32ED, 0x28CA, 0x32EE, 0x28CB, 0x32EF, 0x28CC, 0x32F0, 0x28CD,
+ 0x32F1, 0x28CE, 0x32F2, 0x28CF, 0x32F3, 0x28D0, 0x32F4, 0x28D1,
+ 0x32F5, 0x28D2, 0x32F6, 0x28D3, 0x32F7, 0x28D4, 0x32F8, 0x28D5,
+ 0x32F9, 0x28D6, 0x32FA, 0x28D7, 0x32FB, 0x28D8, 0x32FC, 0x28D9,
+ 0x32FD, 0x28DA, 0x32FE, 0x28DB, 0x3300, 0x1F70, 0x3301, 0x2E62,
+ 0x3302, 0x2E63, 0x3303, 0x1F6A, 0x3304, 0x2E64, 0x3305, 0x1FF7,
+ 0x3306, 0x2E65, 0x3307, 0x2E69, 0x3308, 0x2E67, 0x3309, 0x2E6C,
+ 0x330A, 0x2E6A, 0x330B, 0x2E6E, 0x330C, 0x2E70, 0x330D, 0x1DAB,
+ 0x330E, 0x2E71, 0x330F, 0x2E72, 0x3310, 0x2E73, 0x3311, 0x2E74,
+ 0x3312, 0x2E75, 0x3313, 0x2E76, 0x3314, 0x1DA2, 0x3315, 0x1F69,
+ 0x3316, 0x1F67, 0x3317, 0x2E78, 0x3318, 0x1F68, 0x3319, 0x2E7A,
+ 0x331A, 0x2E7C, 0x331B, 0x2E7D, 0x331C, 0x2E7E, 0x331D, 0x2E7F,
+ 0x331E, 0x1F73, 0x331F, 0x2E80, 0x3320, 0x2E81, 0x3321, 0x2E82,
+ 0x3322, 0x1F66, 0x3323, 0x1F6B, 0x3324, 0x2E83, 0x3325, 0x2E85,
+ 0x3326, 0x1DAC, 0x3327, 0x1DA6, 0x3328, 0x2E88, 0x3329, 0x2E89,
+ 0x332A, 0x1F74, 0x332B, 0x1DAE, 0x332D, 0x2E8B, 0x332E, 0x2E8E,
+ 0x332F, 0x2E8F, 0x3330, 0x2E90, 0x3331, 0x1F71, 0x3332, 0x2E91,
+ 0x3333, 0x2087, 0x3334, 0x2E94, 0x3335, 0x2E95, 0x3336, 0x1DA8,
+ 0x3337, 0x2E9A, 0x3338, 0x2E9C, 0x3339, 0x1F6E, 0x333A, 0x2E9D,
+ 0x333B, 0x1F6F, 0x333C, 0x2E96, 0x333D, 0x2E9E, 0x333E, 0x2EA0,
+ 0x333F, 0x2EA1, 0x3340, 0x2EA2, 0x3341, 0x2E9F, 0x3342, 0x1F6D,
+ 0x3343, 0x2EA3, 0x3344, 0x2EA4, 0x3345, 0x2EA5, 0x3346, 0x2EA6,
+ 0x3347, 0x1F72, 0x3348, 0x2EA7, 0x3349, 0x1DA1, 0x334A, 0x1DAF,
+ 0x334B, 0x2EA8, 0x334C, 0x2EA9, 0x334D, 0x1DA4, 0x334E, 0x2088,
+ 0x334F, 0x2EAA, 0x3350, 0x2EAB, 0x3351, 0x1DA9, 0x3352, 0x2EAE,
+ 0x3353, 0x2EB2, 0x3354, 0x2EAF, 0x3355, 0x2EB3, 0x3356, 0x2EB4,
+ 0x3357, 0x1F6C, 0x3371, 0x2E55, 0x337B, 0x2083, 0x337C, 0x1DC7,
+ 0x337D, 0x1DC6, 0x337E, 0x1DC5, 0x337F, 0x1F76, 0x3385, 0x1F5F,
+ 0x3386, 0x1F60, 0x3387, 0x1F61, 0x3388, 0x2000, 0x3389, 0x2001,
+ 0x338D, 0x2E58, 0x338E, 0x1DB4, 0x338F, 0x1DB5, 0x3390, 0x1F63,
+ 0x3396, 0x1F65, 0x3397, 0x1F58, 0x3398, 0x1F5A, 0x339B, 0x2E59,
+ 0x339C, 0x1DB1, 0x339D, 0x1DB2, 0x339E, 0x1DB3, 0x339F, 0x1FFA,
+ 0x33A0, 0x1F54, 0x33A1, 0x1DB7, 0x33A2, 0x1F55, 0x33A3, 0x1FFB,
+ 0x33A4, 0x1F56, 0x33A5, 0x1F57, 0x33A6, 0x1FFC, 0x33B0, 0x1F5E,
+ 0x33B1, 0x1F5D, 0x33B2, 0x1F5C, 0x33B3, 0x1F5B, 0x33C2, 0x2E50,
+ 0x33C4, 0x1DB6, 0x33C8, 0x2002, 0x33CB, 0x1F62, 0x33CC, 0x1FF6,
+ 0x33CD, 0x1DBB, 0x33D4, 0x1F64, 0x33D7, 0x2E5D, 0x33D8, 0x2E5E,
+ 0x33DA, 0x2E4B, 0x3402, 0x3582, 0x3405, 0x3C1B, 0x3427, 0x3656,
+ 0x3488, 0x3C52, 0x34DB, 0x3C41, 0x351F, 0x3629, 0x353E, 0x371E,
+ 0x378D, 0x361A, 0x37E2, 0x372B, 0x3AF3, 0x3C40, 0x3B22, 0x3C49,
+ 0x3B88, 0x368D, 0x3E8A, 0x3C43, 0x3EDA, 0x3C48, 0x3FB1, 0x3754,
+ 0x4093, 0x3C4C, 0x4103, 0x3C4F, 0x4264, 0x3760, 0x4293, 0x3C50,
+ 0x440C, 0x3C42, 0x4453, 0x3773, 0x457A, 0x3C4B, 0x4665, 0x3C4E,
+ 0x46AE, 0x3C51, 0x4BE8, 0x3C46, 0x4E00, 0x04B0, 0x4E01, 0x0BB8,
+ 0x4E03, 0x08E3, 0x4E04, 0x37D8, 0x4E05, 0x37D9, 0x4E07, 0x0EAA,
+ 0x4E08, 0x09CE, 0x4E09, 0x087E, 0x4E0A, 0x09CD, 0x4E0B, 0x053C,
+ 0x4E0D, 0x0DC6, 0x4E0E, 0x0F29, 0x4E10, 0x0FFB, 0x4E11, 0x04D1,
+ 0x4E14, 0x05CC, 0x4E15, 0x0FFC, 0x4E16, 0x0A48, 0x4E17, 0x10D7,
+ 0x4E18, 0x0670, 0x4E19, 0x0E0A, 0x4E1E, 0x09CF, 0x4E1F, 0x37DA,
+ 0x4E21, 0x0F86, 0x4E26, 0x0E12, 0x4E28, 0x20B3, 0x4E2A, 0x0FFD,
+ 0x4E2B, 0x37DB, 0x4E2C, 0x374D, 0x4E2D, 0x0BA4, 0x4E2F, 0x37DC,
+ 0x4E30, 0x37DD, 0x4E31, 0x0FFE, 0x4E32, 0x06F2, 0x4E36, 0x0FFF,
+ 0x4E37, 0x369D, 0x4E38, 0x0619, 0x4E39, 0x0B6E, 0x4E3B, 0x0913,
+ 0x4E3C, 0x1000, 0x4E3F, 0x1001, 0x4E40, 0x37DE, 0x4E41, 0x37DF,
+ 0x4E42, 0x1002, 0x4E43, 0x0CEB, 0x4E44, 0x37E0, 0x4E45, 0x0671,
+ 0x4E48, 0x372E, 0x4E4B, 0x0CED, 0x4E4D, 0x0CBB, 0x4E4E, 0x0777,
+ 0x4E4F, 0x0E61, 0x4E55, 0x1950, 0x4E56, 0x1003, 0x4E57, 0x09D0,
+ 0x4E58, 0x1004, 0x4E59, 0x0535, 0x4E5A, 0x37E1, 0x4E5D, 0x06DD,
+ 0x4E5E, 0x07A4, 0x4E5F, 0x0EF5, 0x4E62, 0x1233, 0x4E71, 0x0F5A,
+ 0x4E73, 0x0CD5, 0x4E7E, 0x05E1, 0x4E7F, 0x37E2, 0x4E80, 0x064F,
+ 0x4E82, 0x1005, 0x4E85, 0x1006, 0x4E86, 0x0F83, 0x4E88, 0x0F27,
+ 0x4E89, 0x0AEA, 0x4E8A, 0x1008, 0x4E8B, 0x08C4, 0x4E8C, 0x0CCB,
+ 0x4E8D, 0x37E3, 0x4E8E, 0x100B, 0x4E91, 0x04E0, 0x4E92, 0x0793,
+ 0x4E94, 0x0792, 0x4E95, 0x04AA, 0x4E96, 0x37E4, 0x4E98, 0x0FF1,
+ 0x4E99, 0x0FF0, 0x4E9B, 0x0823, 0x4E9C, 0x0465, 0x4E9E, 0x100C,
+ 0x4E9F, 0x100D, 0x4EA0, 0x100E, 0x4EA1, 0x0E62, 0x4EA2, 0x100F,
+ 0x4EA4, 0x07A6, 0x4EA5, 0x04AB, 0x4EA6, 0x0EA0, 0x4EA8, 0x0696,
+ 0x4EAB, 0x0697, 0x4EAC, 0x0698, 0x4EAD, 0x0BFE, 0x4EAE, 0x0F84,
+ 0x4EB0, 0x1010, 0x4EB3, 0x1011, 0x4EB6, 0x1012, 0x4EB9, 0x37E5,
+ 0x4EBA, 0x0A13, 0x4EBB, 0x3620, 0x4EC0, 0x0944, 0x4EC1, 0x0A14,
+ 0x4EC2, 0x1017, 0x4EC4, 0x1015, 0x4EC6, 0x1016, 0x4EC7, 0x0672,
+ 0x4ECA, 0x0813, 0x4ECB, 0x0570, 0x4ECD, 0x1014, 0x4ECE, 0x1013,
+ 0x4ECF, 0x0DF9, 0x4ED0, 0x37E6, 0x4ED4, 0x0894, 0x4ED5, 0x0893,
+ 0x4ED6, 0x0B1E, 0x4ED7, 0x1018, 0x4ED8, 0x0DC7, 0x4ED9, 0x0A8B,
+ 0x4EDD, 0x0290, 0x4EDE, 0x1019, 0x4EDF, 0x101B, 0x4EE0, 0x37E7,
+ 0x4EE1, 0x20B4, 0x4EE3, 0x0B45, 0x4EE4, 0x0FA9, 0x4EE5, 0x048E,
+ 0x4EED, 0x101A, 0x4EEE, 0x053E, 0x4EF0, 0x06BC, 0x4EF2, 0x0BA5,
+ 0x4EF6, 0x0745, 0x4EF7, 0x101C, 0x4EFB, 0x0CDA, 0x4EFC, 0x20B5,
+ 0x4EFD, 0x37E8, 0x4EFF, 0x37E9, 0x4F00, 0x20B6, 0x4F01, 0x0627,
+ 0x4F03, 0x20B7, 0x4F09, 0x101D, 0x4F0A, 0x048F, 0x4F0B, 0x37EA,
+ 0x4F0D, 0x0794, 0x4F0E, 0x0628, 0x4F0F, 0x0DEC, 0x4F10, 0x0D46,
+ 0x4F11, 0x0673, 0x4F15, 0x37EB, 0x4F1A, 0x0571, 0x4F1C, 0x1040,
+ 0x4F1D, 0x0C3B, 0x4F2F, 0x0D22, 0x4F30, 0x101F, 0x4F34, 0x0D50,
+ 0x4F36, 0x0FAA, 0x4F38, 0x09F3, 0x4F39, 0x20B8, 0x4F3A, 0x0895,
+ 0x4F3B, 0x37ED, 0x4F3C, 0x08C5, 0x4F3D, 0x0540, 0x4F43, 0x0BED,
+ 0x4F46, 0x0B60, 0x4F47, 0x1023, 0x4F49, 0x37EE, 0x4F4D, 0x0490,
+ 0x4F4E, 0x0BFF, 0x4F4F, 0x0945, 0x4F50, 0x0824, 0x4F51, 0x0F0E,
+ 0x4F53, 0x0B2E, 0x4F54, 0x37EF, 0x4F55, 0x053F, 0x4F56, 0x20B9,
+ 0x4F57, 0x1022, 0x4F59, 0x0F28, 0x4F5A, 0x101E, 0x4F5B, 0x1020,
+ 0x4F5C, 0x085E, 0x4F5D, 0x1021, 0x4F5E, 0x11D3, 0x4F60, 0x37EC,
+ 0x4F69, 0x1029, 0x4F6F, 0x102C, 0x4F70, 0x102A, 0x4F73, 0x0542,
+ 0x4F75, 0x0E0B, 0x4F76, 0x1024, 0x4F7A, 0x37F0, 0x4F7B, 0x1028,
+ 0x4F7C, 0x07A7, 0x4F7D, 0x37F1, 0x4F7E, 0x37F2, 0x4F7F, 0x0896,
+ 0x4F83, 0x05E2, 0x4F86, 0x102D, 0x4F88, 0x1025, 0x4F8A, 0x20BB,
+ 0x4F8B, 0x0FAB, 0x4F8D, 0x08C6, 0x4F8F, 0x1026, 0x4F91, 0x102B,
+ 0x4F92, 0x20BA, 0x4F94, 0x20BD, 0x4F96, 0x102E, 0x4F97, 0x37F3,
+ 0x4F98, 0x1027, 0x4F9A, 0x20BC, 0x4F9B, 0x0699, 0x4F9D, 0x0491,
+ 0x4FA0, 0x069A, 0x4FA1, 0x0541, 0x4FAB, 0x11D4, 0x4FAD, 0x0EA7,
+ 0x4FAE, 0x0DE0, 0x4FAF, 0x07A8, 0x4FB5, 0x09F5, 0x4FB6, 0x0F7F,
+ 0x4FBE, 0x37F4, 0x4FBF, 0x0E28, 0x4FC2, 0x070E, 0x4FC3, 0x0B05,
+ 0x4FC4, 0x0564, 0x4FC9, 0x20AC, 0x4FCA, 0x095D, 0x4FCD, 0x20BE,
+ 0x4FCE, 0x1032, 0x4FCF, 0x37F5, 0x4FD0, 0x1037, 0x4FD1, 0x1035,
+ 0x4FD3, 0x3C2F, 0x4FD4, 0x1030, 0x4FD7, 0x0B0F, 0x4FD8, 0x1033,
+ 0x4FDA, 0x1036, 0x4FDB, 0x1034, 0x4FDD, 0x0E2D, 0x4FDF, 0x1031,
+ 0x4FE0, 0x1DEC, 0x4FE1, 0x09F4, 0x4FE3, 0x0EA1, 0x4FE4, 0x1038,
+ 0x4FE5, 0x1039, 0x4FEE, 0x092E, 0x4FEF, 0x1046, 0x4FF3, 0x0D06,
+ 0x4FF5, 0x0DA8, 0x4FF6, 0x1041, 0x4FF8, 0x0E40, 0x4FFA, 0x0536,
+ 0x4FFD, 0x37F6, 0x4FFE, 0x1045, 0x4FFF, 0x20C1, 0x5000, 0x37F7,
+ 0x5001, 0x37F8, 0x5002, 0x3447, 0x5005, 0x103F, 0x5006, 0x1048,
+ 0x5009, 0x0AD4, 0x500B, 0x0778, 0x500D, 0x0D12, 0x500F, 0x1600,
+ 0x5010, 0x37F9, 0x5011, 0x1047, 0x5012, 0x0C57, 0x5014, 0x103C,
+ 0x5016, 0x07AA, 0x5019, 0x07A9, 0x501A, 0x103A, 0x501B, 0x37FA,
+ 0x501E, 0x20C2, 0x501F, 0x0906, 0x5021, 0x1042, 0x5022, 0x20C0,
+ 0x5023, 0x0E3F, 0x5024, 0x0B8B, 0x5025, 0x103E, 0x5026, 0x0747,
+ 0x5027, 0x37FB, 0x5028, 0x103B, 0x5029, 0x1043, 0x502A, 0x103D,
+ 0x502B, 0x0F99, 0x502C, 0x1044, 0x502D, 0x0FE7, 0x502E, 0x37FC,
+ 0x5036, 0x06DE, 0x5039, 0x0746, 0x503B, 0x3800, 0x5040, 0x20BF,
+ 0x5042, 0x20C5, 0x5043, 0x1049, 0x5046, 0x20C3, 0x5047, 0x104A,
+ 0x5048, 0x104E, 0x5049, 0x0492, 0x504F, 0x0E20, 0x5050, 0x104D,
+ 0x5055, 0x104C, 0x5056, 0x1050, 0x5057, 0x37FD, 0x505A, 0x104F,
+ 0x505C, 0x0C00, 0x5065, 0x0748, 0x5066, 0x37FE, 0x506A, 0x37FF,
+ 0x506C, 0x1051, 0x5070, 0x20C4, 0x5072, 0x08F1, 0x5074, 0x0B06,
+ 0x5075, 0x0C01, 0x5076, 0x06EE, 0x5078, 0x1052, 0x507D, 0x0650,
+ 0x5080, 0x1053, 0x5085, 0x1055, 0x508D, 0x0E63, 0x508F, 0x3801,
+ 0x5091, 0x073C, 0x5094, 0x20C6, 0x5096, 0x3802, 0x5098, 0x087F,
+ 0x5099, 0x0D8B, 0x509A, 0x1054, 0x509C, 0x3803, 0x50AC, 0x0835,
+ 0x50AD, 0x0F2D, 0x50B2, 0x1057, 0x50B3, 0x105A, 0x50B4, 0x1056,
+ 0x50B5, 0x0834, 0x50B7, 0x0987, 0x50BE, 0x070F, 0x50C2, 0x105B,
+ 0x50C5, 0x06C7, 0x50C9, 0x1058, 0x50CA, 0x1059, 0x50CC, 0x3804,
+ 0x50CD, 0x0C87, 0x50CF, 0x0AFE, 0x50D1, 0x069B, 0x50D5, 0x0E7B,
+ 0x50D6, 0x105C, 0x50D8, 0x20C8, 0x50D9, 0x3C30, 0x50DA, 0x0F85,
+ 0x50DE, 0x105D, 0x50E3, 0x1060, 0x50E5, 0x105E, 0x50E6, 0x3805,
+ 0x50E7, 0x0AD0, 0x50E9, 0x3806, 0x50ED, 0x105F, 0x50EE, 0x1061,
+ 0x50EF, 0x3807, 0x50F0, 0x3C31, 0x50F4, 0x20C7, 0x50F5, 0x1063,
+ 0x50F9, 0x1062, 0x50FB, 0x0E18, 0x5100, 0x0651, 0x5101, 0x1065,
+ 0x5102, 0x1066, 0x5104, 0x052F, 0x5108, 0x3808, 0x5109, 0x1064,
+ 0x510B, 0x3809, 0x5110, 0x380A, 0x5112, 0x0920, 0x5114, 0x1069,
+ 0x5115, 0x1068, 0x5116, 0x1067, 0x5118, 0x102F, 0x511A, 0x106A,
+ 0x511B, 0x380B, 0x511E, 0x380C, 0x511F, 0x0988, 0x5121, 0x106B,
+ 0x512A, 0x0F0F, 0x5132, 0x0EE5, 0x5137, 0x106D, 0x513A, 0x106C,
+ 0x513B, 0x106F, 0x513C, 0x106E, 0x513F, 0x1070, 0x5140, 0x1071,
+ 0x5141, 0x04B8, 0x5143, 0x0769, 0x5144, 0x0711, 0x5145, 0x0946,
+ 0x5146, 0x0BB9, 0x5147, 0x069C, 0x5148, 0x0A8C, 0x5149, 0x07AB,
+ 0x514A, 0x20C9, 0x514B, 0x0800, 0x514C, 0x1073, 0x514D, 0x0ED4,
+ 0x514E, 0x0C40, 0x5150, 0x08C7, 0x5152, 0x1072, 0x5154, 0x1074,
+ 0x515A, 0x0C58, 0x515C, 0x05D3, 0x515F, 0x380D, 0x5162, 0x1075,
+ 0x5164, 0x20CA, 0x5165, 0x0CD6, 0x5167, 0x368E, 0x5168, 0x0AB6,
+ 0x5169, 0x1077, 0x516A, 0x1078, 0x516B, 0x0D40, 0x516C, 0x07AC,
+ 0x516D, 0x0FE1, 0x516E, 0x1079, 0x5171, 0x069E, 0x5175, 0x0E0C,
+ 0x5176, 0x0B16, 0x5177, 0x06E9, 0x5178, 0x0C2F, 0x5179, 0x3779,
+ 0x517C, 0x0749, 0x5180, 0x107A, 0x5182, 0x107B, 0x5185, 0x0CBA,
+ 0x5186, 0x0501, 0x5189, 0x107E, 0x518A, 0x086D, 0x518C, 0x107D,
+ 0x518D, 0x0836, 0x518F, 0x107F, 0x5190, 0x185B, 0x5191, 0x1080,
+ 0x5192, 0x0E6F, 0x5193, 0x1081, 0x5195, 0x1082, 0x5196, 0x1083,
+ 0x5197, 0x09D1, 0x5199, 0x08F8, 0x519D, 0x20CB, 0x51A0, 0x05E3,
+ 0x51A1, 0x380E, 0x51A2, 0x1086, 0x51A4, 0x1084, 0x51A5, 0x0EC9,
+ 0x51A6, 0x1085, 0x51A8, 0x0DCC, 0x51A9, 0x1087, 0x51AA, 0x1088,
+ 0x51AB, 0x1089, 0x51AC, 0x0C59, 0x51B0, 0x108D, 0x51B1, 0x108B,
+ 0x51B2, 0x108C, 0x51B3, 0x108A, 0x51B4, 0x0853, 0x51B5, 0x108E,
+ 0x51B6, 0x0EF6, 0x51B7, 0x0FAC, 0x51BC, 0x380F, 0x51BD, 0x108F,
+ 0x51BE, 0x20CC, 0x51C3, 0x3C32, 0x51C4, 0x0A4C, 0x51C5, 0x1090,
+ 0x51C6, 0x0964, 0x51C9, 0x1091, 0x51CB, 0x0BBA, 0x51CC, 0x0F87,
+ 0x51CD, 0x0C5A, 0x51D6, 0x10DA, 0x51DB, 0x1092, 0x51DC, 0x205C,
+ 0x51DD, 0x06BD, 0x51DE, 0x3810, 0x51E0, 0x1093, 0x51E1, 0x0E8C,
+ 0x51E6, 0x0972, 0x51E7, 0x0B5C, 0x51E9, 0x1095, 0x51EA, 0x0CBC,
+ 0x51EC, 0x20CD, 0x51ED, 0x1096, 0x51EE, 0x3811, 0x51F0, 0x1097,
+ 0x51F1, 0x058C, 0x51F4, 0x3812, 0x51F5, 0x1098, 0x51F6, 0x069F,
+ 0x51F8, 0x0CA4, 0x51F9, 0x051C, 0x51FA, 0x095A, 0x51FD, 0x0D35,
+ 0x51FE, 0x1099, 0x5200, 0x0C5B, 0x5201, 0x3813, 0x5202, 0x3814,
+ 0x5203, 0x0A15, 0x5204, 0x109A, 0x5206, 0x0DFC, 0x5207, 0x0A7E,
+ 0x5208, 0x05DE, 0x520A, 0x05E5, 0x520B, 0x109B, 0x520E, 0x109D,
+ 0x5211, 0x0710, 0x5213, 0x3815, 0x5214, 0x109C, 0x5215, 0x20CE,
+ 0x5217, 0x0FBB, 0x521D, 0x0973, 0x5224, 0x0D51, 0x5225, 0x0E1C,
+ 0x5227, 0x109E, 0x5229, 0x0F62, 0x522A, 0x109F, 0x522E, 0x10A0,
+ 0x5230, 0x0C78, 0x5233, 0x10A1, 0x5236, 0x0A4D, 0x5237, 0x086E,
+ 0x5238, 0x074A, 0x5239, 0x10A2, 0x523A, 0x0897, 0x523B, 0x0801,
+ 0x5243, 0x0C02, 0x5244, 0x10A4, 0x5247, 0x0B07, 0x5249, 0x3816,
+ 0x524A, 0x085F, 0x524B, 0x10A5, 0x524C, 0x10A6, 0x524D, 0x0AB2,
+ 0x524F, 0x10A3, 0x5254, 0x10A8, 0x5256, 0x0E64, 0x525B, 0x07F6,
+ 0x525D, 0x1E5E, 0x525E, 0x10A7, 0x5261, 0x3817, 0x5263, 0x074B,
+ 0x5264, 0x084E, 0x5265, 0x0D23, 0x5266, 0x3818, 0x5269, 0x10AB,
+ 0x526A, 0x10A9, 0x526F, 0x0DED, 0x5270, 0x09D2, 0x5271, 0x10B2,
+ 0x5272, 0x05C2, 0x5273, 0x10AC, 0x5274, 0x10AA, 0x5275, 0x0AD1,
+ 0x527D, 0x10AE, 0x527F, 0x10AD, 0x5283, 0x05A2, 0x5287, 0x0736,
+ 0x5288, 0x10B3, 0x5289, 0x0F75, 0x528D, 0x10AF, 0x5291, 0x10B4,
+ 0x5292, 0x10B1, 0x5293, 0x3819, 0x5294, 0x10B0, 0x529B, 0x0F97,
+ 0x529C, 0x20CF, 0x529F, 0x07AD, 0x52A0, 0x0543, 0x52A3, 0x0FBC,
+ 0x52A6, 0x20D0, 0x52A9, 0x097F, 0x52AA, 0x0C52, 0x52AB, 0x07F7,
+ 0x52AC, 0x10B7, 0x52AD, 0x10B8, 0x52AF, 0x217D, 0x52B1, 0x0FAD,
+ 0x52B4, 0x0FD1, 0x52B5, 0x10BA, 0x52B9, 0x07AE, 0x52BC, 0x10B9,
+ 0x52BE, 0x058D, 0x52C0, 0x20D1, 0x52C1, 0x10BB, 0x52C3, 0x0E84,
+ 0x52C5, 0x0BD8, 0x52C7, 0x0F10, 0x52C8, 0x381A, 0x52C9, 0x0E29,
+ 0x52CD, 0x10BC, 0x52D0, 0x36E8, 0x52D2, 0x1BEE, 0x52D5, 0x0C88,
+ 0x52D7, 0x10BD, 0x52D8, 0x05E6, 0x52D9, 0x0EBF, 0x52DB, 0x20D2,
+ 0x52DD, 0x0989, 0x52DE, 0x10BE, 0x52DF, 0x0E37, 0x52E0, 0x10C2,
+ 0x52E2, 0x0A4E, 0x52E3, 0x10BF, 0x52E4, 0x06C8, 0x52E6, 0x10C0,
+ 0x52E7, 0x05E7, 0x52F0, 0x381B, 0x52F2, 0x0704, 0x52F3, 0x10C3,
+ 0x52F5, 0x10C4, 0x52F8, 0x10C5, 0x52F9, 0x10C6, 0x52FA, 0x0907,
+ 0x52FE, 0x07AF, 0x52FF, 0x0EEA, 0x5300, 0x20D3, 0x5301, 0x0EF4,
+ 0x5302, 0x0CCF, 0x5305, 0x0E41, 0x5306, 0x10C7, 0x5307, 0x20D4,
+ 0x5308, 0x10C8, 0x530A, 0x381C, 0x530B, 0x381D, 0x530D, 0x10CA,
+ 0x530F, 0x10CC, 0x5310, 0x10CB, 0x5315, 0x10CD, 0x5316, 0x053D,
+ 0x5317, 0x0E7A, 0x5319, 0x086C, 0x531A, 0x10CE, 0x531D, 0x0ADB,
+ 0x5320, 0x098A, 0x5321, 0x06A1, 0x5323, 0x10CF, 0x5324, 0x20D5,
+ 0x532A, 0x0D6F, 0x532F, 0x10D0, 0x5331, 0x10D1, 0x5333, 0x10D2,
+ 0x5338, 0x10D3, 0x5339, 0x0D96, 0x533A, 0x06E0, 0x533B, 0x04A9,
+ 0x533E, 0x381E, 0x533F, 0x0C97, 0x5340, 0x10D4, 0x5341, 0x0947,
+ 0x5343, 0x0A8D, 0x5345, 0x10D6, 0x5346, 0x10D5, 0x5347, 0x098B,
+ 0x5348, 0x0795, 0x5349, 0x10D8, 0x534A, 0x0D52, 0x534B, 0x3820,
+ 0x534C, 0x381F, 0x534D, 0x10D9, 0x5351, 0x0D70, 0x5352, 0x0B14,
+ 0x5353, 0x0B4E, 0x5354, 0x06A0, 0x5357, 0x0CC6, 0x5358, 0x0B6F,
+ 0x535A, 0x0D24, 0x535C, 0x0E7C, 0x535E, 0x10DB, 0x5360, 0x0A8E,
+ 0x5361, 0x3821, 0x5366, 0x070B, 0x5369, 0x10DC, 0x536C, 0x3822,
+ 0x536E, 0x10DD, 0x536F, 0x04CE, 0x5370, 0x04B9, 0x5371, 0x0629,
+ 0x5372, 0x20D6, 0x5373, 0x0B08, 0x5374, 0x066B, 0x5375, 0x0F5B,
+ 0x5377, 0x10E0, 0x5378, 0x0537, 0x537B, 0x10DF, 0x537D, 0x3435,
+ 0x537F, 0x06A2, 0x5382, 0x10E1, 0x5384, 0x0EFD, 0x5389, 0x37D0,
+ 0x5393, 0x20D7, 0x5396, 0x10E2, 0x5398, 0x0F9A, 0x539A, 0x07B0,
+ 0x539F, 0x076A, 0x53A0, 0x10E3, 0x53A5, 0x10E5, 0x53A6, 0x10E4,
+ 0x53A8, 0x0A25, 0x53A9, 0x04DB, 0x53AB, 0x3823, 0x53AD, 0x0500,
+ 0x53AE, 0x10E6, 0x53B0, 0x10E7, 0x53B2, 0x20D8, 0x53B3, 0x076B,
+ 0x53B6, 0x10E8, 0x53BB, 0x0688, 0x53C2, 0x0880, 0x53C3, 0x10E9,
+ 0x53C8, 0x0EA2, 0x53C9, 0x0825, 0x53CA, 0x0674, 0x53CB, 0x0F11,
+ 0x53CC, 0x0AD2, 0x53CD, 0x0D53, 0x53CE, 0x0929, 0x53D4, 0x0951,
+ 0x53D6, 0x0914, 0x53D7, 0x0921, 0x53D9, 0x0980, 0x53DA, 0x3824,
+ 0x53DB, 0x0D54, 0x53DD, 0x20D9, 0x53DF, 0x10EC, 0x53E1, 0x04E5,
+ 0x53E2, 0x0AD3, 0x53E3, 0x07B1, 0x53E4, 0x0779, 0x53E5, 0x06DF,
+ 0x53E6, 0x3825, 0x53E8, 0x10F0, 0x53E9, 0x0B5F, 0x53EA, 0x0B5E,
+ 0x53EB, 0x06A3, 0x53EC, 0x098C, 0x53ED, 0x10F1, 0x53EE, 0x10EF,
+ 0x53EF, 0x0544, 0x53F0, 0x0B46, 0x53F1, 0x08E4, 0x53F2, 0x0899,
+ 0x53F3, 0x04C8, 0x53F5, 0x3826, 0x53F6, 0x05CE, 0x53F7, 0x07F8,
+ 0x53F8, 0x0898, 0x53FA, 0x10F2, 0x5401, 0x10F3, 0x5403, 0x0663,
+ 0x5404, 0x05A4, 0x5408, 0x07F9, 0x5409, 0x0662, 0x540A, 0x0BFB,
+ 0x540B, 0x04C7, 0x540C, 0x0C89, 0x540D, 0x0ECA, 0x540E, 0x07B3,
+ 0x540F, 0x0F63, 0x5410, 0x0C41, 0x5411, 0x07B2, 0x541B, 0x0705,
+ 0x541D, 0x10FC, 0x541F, 0x06DB, 0x5420, 0x0E78, 0x5426, 0x0D71,
+ 0x5427, 0x3827, 0x5429, 0x10FB, 0x542B, 0x061A, 0x542C, 0x10F6,
+ 0x542D, 0x10F7, 0x542E, 0x10F9, 0x5433, 0x35C0, 0x5436, 0x10FA,
+ 0x5438, 0x0675, 0x5439, 0x0A27, 0x543B, 0x0DFD, 0x543C, 0x10F8,
+ 0x543D, 0x10F4, 0x543E, 0x0797, 0x543F, 0x35CF, 0x5440, 0x10F5,
+ 0x5442, 0x0FCA, 0x5446, 0x0E42, 0x5448, 0x0C04, 0x5449, 0x0796,
+ 0x544A, 0x0802, 0x544D, 0x3828, 0x544E, 0x10FD, 0x5451, 0x0CB5,
+ 0x5455, 0x3723, 0x545F, 0x1101, 0x5466, 0x3829, 0x5468, 0x092A,
+ 0x546A, 0x0922, 0x546B, 0x382A, 0x5470, 0x1104, 0x5471, 0x1102,
+ 0x5473, 0x0EAF, 0x5474, 0x382B, 0x5475, 0x10FF, 0x5476, 0x1108,
+ 0x5477, 0x1103, 0x547B, 0x1106, 0x547C, 0x077A, 0x547D, 0x0ECB,
+ 0x5480, 0x1107, 0x5484, 0x1109, 0x5486, 0x110B, 0x548A, 0x20DC,
+ 0x548B, 0x0860, 0x548C, 0x0FE8, 0x548D, 0x382C, 0x548E, 0x1100,
+ 0x548F, 0x10FE, 0x5490, 0x110A, 0x5492, 0x1105, 0x5496, 0x382D,
+ 0x549C, 0x20DB, 0x54A1, 0x382E, 0x54A2, 0x110D, 0x54A4, 0x1116,
+ 0x54A5, 0x110F, 0x54A8, 0x1113, 0x54A9, 0x20DD, 0x54AB, 0x1114,
+ 0x54AC, 0x1110, 0x54AD, 0x382F, 0x54AF, 0x1131, 0x54B2, 0x0859,
+ 0x54B3, 0x058F, 0x54B8, 0x110E, 0x54B9, 0x3830, 0x54BC, 0x1118,
+ 0x54BD, 0x04BA, 0x54BE, 0x1117, 0x54BF, 0x3831, 0x54C0, 0x0469,
+ 0x54C1, 0x0DBC, 0x54C2, 0x1115, 0x54C4, 0x1111, 0x54C6, 0x3832,
+ 0x54C7, 0x110C, 0x54C8, 0x1112, 0x54C9, 0x0838, 0x54CD, 0x3833,
+ 0x54D8, 0x1119, 0x54E1, 0x04BB, 0x54E2, 0x1122, 0x54E5, 0x111A,
+ 0x54E6, 0x111B, 0x54E8, 0x098D, 0x54E9, 0x0E97, 0x54ED, 0x1120,
+ 0x54EE, 0x111F, 0x54F2, 0x0C29, 0x54FA, 0x1121, 0x54FD, 0x111E,
+ 0x54FF, 0x20DE, 0x5504, 0x04D6, 0x5506, 0x0826, 0x5507, 0x09F6,
+ 0x550E, 0x3834, 0x550F, 0x111C, 0x5510, 0x0C5C, 0x5514, 0x111D,
+ 0x5516, 0x0466, 0x552B, 0x3835, 0x552E, 0x1127, 0x552F, 0x0F0D,
+ 0x5531, 0x098F, 0x5533, 0x112D, 0x5535, 0x3836, 0x5538, 0x112C,
+ 0x5539, 0x1123, 0x553E, 0x0B23, 0x5540, 0x1124, 0x5544, 0x0B4F,
+ 0x5545, 0x1129, 0x5546, 0x098E, 0x554A, 0x3837, 0x554C, 0x1126,
+ 0x554F, 0x0EF0, 0x5553, 0x0712, 0x5556, 0x112A, 0x5557, 0x112B,
+ 0x555C, 0x1128, 0x555D, 0x112E, 0x555E, 0x1DD1, 0x5560, 0x3838,
+ 0x5561, 0x3839, 0x5563, 0x1125, 0x557B, 0x1134, 0x557C, 0x1139,
+ 0x557E, 0x1135, 0x5580, 0x1130, 0x5583, 0x113A, 0x5584, 0x0AB3,
+ 0x5586, 0x20DF, 0x5587, 0x113C, 0x5588, 0x383A, 0x5589, 0x07B4,
+ 0x558A, 0x1132, 0x558B, 0x0BBB, 0x558E, 0x383B, 0x5598, 0x1136,
+ 0x5599, 0x112F, 0x559A, 0x05E9, 0x559C, 0x062A, 0x559D, 0x05C3,
+ 0x559E, 0x1137, 0x559F, 0x1133, 0x55A7, 0x074C, 0x55A8, 0x113D,
+ 0x55A9, 0x113B, 0x55AA, 0x0AD5, 0x55AB, 0x0664, 0x55AC, 0x06A4,
+ 0x55AE, 0x1138, 0x55B0, 0x06EC, 0x55B6, 0x04E6, 0x55C4, 0x1141,
+ 0x55C5, 0x113F, 0x55C7, 0x1178, 0x55D4, 0x1144, 0x55DA, 0x113E,
+ 0x55DC, 0x1142, 0x55DF, 0x1140, 0x55E3, 0x089A, 0x55E4, 0x1143,
+ 0x55F7, 0x1146, 0x55F9, 0x114B, 0x55FD, 0x1149, 0x55FE, 0x1148,
+ 0x5606, 0x0B70, 0x5608, 0x383C, 0x5609, 0x0545, 0x560E, 0x383D,
+ 0x560F, 0x383E, 0x5614, 0x1145, 0x5616, 0x1147, 0x5617, 0x0990,
+ 0x5618, 0x04D5, 0x561B, 0x114A, 0x5620, 0x3C1D, 0x5629, 0x055E,
+ 0x562F, 0x1155, 0x5631, 0x09E4, 0x5632, 0x1151, 0x5634, 0x114F,
+ 0x5636, 0x1150, 0x5637, 0x383F, 0x5638, 0x1152, 0x563F, 0x3840,
+ 0x5642, 0x04DF, 0x5649, 0x3841, 0x564B, 0x3842, 0x564C, 0x0ABB,
+ 0x564E, 0x114C, 0x564F, 0x3843, 0x5650, 0x114D, 0x5653, 0x1F1B,
+ 0x565B, 0x05D8, 0x5664, 0x1154, 0x5666, 0x3844, 0x5668, 0x062B,
+ 0x5669, 0x3845, 0x566A, 0x1157, 0x566B, 0x1153, 0x566C, 0x1156,
+ 0x566F, 0x3846, 0x5671, 0x3847, 0x5672, 0x3848, 0x5674, 0x0DFE,
+ 0x5676, 0x3C33, 0x5678, 0x0CAD, 0x567A, 0x0D4C, 0x5680, 0x1159,
+ 0x5686, 0x1158, 0x5687, 0x05A3, 0x568A, 0x115A, 0x568F, 0x115D,
+ 0x5694, 0x115C, 0x5695, 0x3849, 0x5699, 0x1DE6, 0x569A, 0x384A,
+ 0x56A0, 0x115B, 0x56A2, 0x0CEF, 0x56A5, 0x115E, 0x56AC, 0x384B,
+ 0x56AD, 0x384C, 0x56AE, 0x115F, 0x56B1, 0x384D, 0x56B4, 0x1161,
+ 0x56B6, 0x1160, 0x56BC, 0x1163, 0x56C0, 0x1166, 0x56C1, 0x1164,
+ 0x56C2, 0x1162, 0x56C3, 0x1165, 0x56C8, 0x1167, 0x56C9, 0x384E,
+ 0x56CA, 0x1E5A, 0x56CE, 0x1168, 0x56D1, 0x1169, 0x56D3, 0x116A,
+ 0x56D7, 0x116B, 0x56D8, 0x107C, 0x56DA, 0x0928, 0x56DB, 0x089B,
+ 0x56DD, 0x384F, 0x56DE, 0x0573, 0x56E0, 0x04BC, 0x56E3, 0x0B82,
+ 0x56E4, 0x3850, 0x56EE, 0x116C, 0x56F0, 0x0814, 0x56F2, 0x0493,
+ 0x56F3, 0x0A24, 0x56F9, 0x116D, 0x56FA, 0x077B, 0x56FD, 0x0803,
+ 0x56FF, 0x116F, 0x5700, 0x116E, 0x5703, 0x0E30, 0x5704, 0x1170,
+ 0x5708, 0x1172, 0x5709, 0x1171, 0x570A, 0x3851, 0x570B, 0x1173,
+ 0x570D, 0x1174, 0x570F, 0x074D, 0x5712, 0x0502, 0x5713, 0x1175,
+ 0x5715, 0x3852, 0x5716, 0x1177, 0x5718, 0x1176, 0x571C, 0x1179,
+ 0x571F, 0x0C54, 0x5721, 0x3680, 0x5723, 0x3853, 0x5726, 0x117A,
+ 0x5727, 0x0479, 0x5728, 0x084F, 0x572D, 0x0713, 0x572F, 0x3854,
+ 0x5730, 0x0B8D, 0x5733, 0x3855, 0x5734, 0x3856, 0x5737, 0x117B,
+ 0x5738, 0x117C, 0x573B, 0x117E, 0x5740, 0x117F, 0x5742, 0x0854,
+ 0x5747, 0x06C9, 0x574A, 0x0E65, 0x574C, 0x3857, 0x574E, 0x117D,
+ 0x574F, 0x1180, 0x5750, 0x0831, 0x5751, 0x07B5, 0x5759, 0x20E0,
+ 0x5761, 0x1184, 0x5764, 0x0815, 0x5765, 0x20E1, 0x5766, 0x0B71,
+ 0x5769, 0x1181, 0x576A, 0x0BF6, 0x5770, 0x3858, 0x577F, 0x1185,
+ 0x5782, 0x0A28, 0x5788, 0x1183, 0x5789, 0x1186, 0x578B, 0x0715,
+ 0x578C, 0x3859, 0x5793, 0x1187, 0x579C, 0x385A, 0x57A0, 0x1188,
+ 0x57A2, 0x07B6, 0x57A3, 0x059E, 0x57A4, 0x118A, 0x57AA, 0x118B,
+ 0x57AC, 0x20E2, 0x57B0, 0x118C, 0x57B3, 0x1189, 0x57B8, 0x385B,
+ 0x57C0, 0x1182, 0x57C3, 0x118D, 0x57C6, 0x118E, 0x57C7, 0x20E4,
+ 0x57C8, 0x20E3, 0x57CB, 0x0E92, 0x57CE, 0x09D3, 0x57D2, 0x1190,
+ 0x57D3, 0x1191, 0x57D4, 0x118F, 0x57D6, 0x1193, 0x57DC, 0x0CEE,
+ 0x57DF, 0x04AC, 0x57E0, 0x0DC8, 0x57E3, 0x1194, 0x57E6, 0x385C,
+ 0x57ED, 0x385D, 0x57F4, 0x09E5, 0x57F5, 0x385E, 0x57F6, 0x385F,
+ 0x57F7, 0x08E5, 0x57F9, 0x0D13, 0x57FA, 0x062C, 0x57FC, 0x085B,
+ 0x57FF, 0x3860, 0x5800, 0x0E87, 0x5802, 0x0C8A, 0x5805, 0x074E,
+ 0x5806, 0x0B2F, 0x5809, 0x3861, 0x580A, 0x1192, 0x580B, 0x1195,
+ 0x5815, 0x0B24, 0x5819, 0x1196, 0x581D, 0x1197, 0x5820, 0x3862,
+ 0x5821, 0x1199, 0x5824, 0x0C05, 0x582A, 0x05EA, 0x582F, 0x1D32,
+ 0x5830, 0x0503, 0x5831, 0x0E43, 0x5832, 0x3863, 0x5834, 0x09D4,
+ 0x5835, 0x0C42, 0x583A, 0x0856, 0x583D, 0x119F, 0x5840, 0x0E0D,
+ 0x5841, 0x0FA5, 0x584A, 0x0574, 0x584B, 0x119B, 0x5851, 0x0ABC,
+ 0x5852, 0x119E, 0x5854, 0x0C5D, 0x5857, 0x0C43, 0x5858, 0x0C5E,
+ 0x5859, 0x0D4D, 0x585A, 0x0BE9, 0x585E, 0x0839, 0x5861, 0x1E47,
+ 0x5862, 0x119A, 0x5869, 0x0518, 0x586B, 0x0C30, 0x5870, 0x119C,
+ 0x5872, 0x1198, 0x5875, 0x0A16, 0x5879, 0x11A0, 0x587C, 0x3864,
+ 0x587E, 0x0958, 0x5880, 0x3865, 0x5883, 0x06A5, 0x5885, 0x11A1,
+ 0x5893, 0x0E38, 0x5897, 0x0AFF, 0x589C, 0x0BE2, 0x589E, 0x20E7,
+ 0x589F, 0x11A3, 0x58A8, 0x0E7D, 0x58A9, 0x3866, 0x58AB, 0x11A4,
+ 0x58AE, 0x11A9, 0x58B2, 0x20E8, 0x58B3, 0x0DFF, 0x58B8, 0x11A8,
+ 0x58B9, 0x11A2, 0x58BA, 0x11A5, 0x58BB, 0x11A7, 0x58BE, 0x0816,
+ 0x58C1, 0x0E19, 0x58C5, 0x11AA, 0x58C7, 0x0B83, 0x58CA, 0x0575,
+ 0x58CC, 0x09D5, 0x58CE, 0x3867, 0x58D0, 0x3868, 0x58D1, 0x11AC,
+ 0x58D3, 0x11AB, 0x58D4, 0x3869, 0x58D5, 0x07FA, 0x58D7, 0x11AD,
+ 0x58D8, 0x11AF, 0x58D9, 0x11AE, 0x58DA, 0x386A, 0x58DC, 0x11B1,
+ 0x58DE, 0x11A6, 0x58DF, 0x11B3, 0x58E4, 0x11B2, 0x58E5, 0x11B0,
+ 0x58E9, 0x386B, 0x58EB, 0x089C, 0x58EC, 0x0A17, 0x58EE, 0x0AD6,
+ 0x58EF, 0x11B4, 0x58F0, 0x0A60, 0x58F1, 0x04B1, 0x58F2, 0x0D1A,
+ 0x58F7, 0x0BF7, 0x58F9, 0x11B6, 0x58FA, 0x11B5, 0x58FB, 0x11B7,
+ 0x58FC, 0x11B8, 0x58FD, 0x11B9, 0x5902, 0x11BA, 0x5909, 0x0E21,
+ 0x590A, 0x11BB, 0x590B, 0x20E9, 0x590C, 0x386C, 0x590F, 0x0546,
+ 0x5910, 0x11BC, 0x5915, 0x0F26, 0x5916, 0x058E, 0x5918, 0x10DE,
+ 0x5919, 0x0952, 0x591A, 0x0B1F, 0x591B, 0x11BD, 0x591C, 0x0EF7,
+ 0x5922, 0x0EC0, 0x5924, 0x386D, 0x5925, 0x11BF, 0x5927, 0x0B47,
+ 0x5929, 0x0C31, 0x592A, 0x0B20, 0x592B, 0x0DC9, 0x592C, 0x11C0,
+ 0x592D, 0x11C1, 0x592E, 0x051D, 0x592F, 0x386E, 0x5931, 0x08E6,
+ 0x5932, 0x11C2, 0x5937, 0x0494, 0x5938, 0x11C3, 0x5939, 0x3725,
+ 0x593E, 0x11C4, 0x5944, 0x0504, 0x5947, 0x062D, 0x5948, 0x0CB8,
+ 0x5949, 0x0E44, 0x594E, 0x11C8, 0x594F, 0x0AD7, 0x5950, 0x11C7,
+ 0x5951, 0x0716, 0x5953, 0x20EA, 0x5954, 0x0E89, 0x5955, 0x11C6,
+ 0x5957, 0x0C5F, 0x5958, 0x11CA, 0x595A, 0x11C9, 0x595B, 0x20EB,
+ 0x595D, 0x20EC, 0x5960, 0x11CC, 0x5961, 0x386F, 0x5962, 0x11CB,
+ 0x5963, 0x20ED, 0x5965, 0x051E, 0x5967, 0x11CD, 0x5968, 0x0991,
+ 0x5969, 0x11CF, 0x596A, 0x0B63, 0x596C, 0x11CE, 0x596D, 0x3870,
+ 0x596E, 0x0E03, 0x5973, 0x0981, 0x5974, 0x0C55, 0x5978, 0x11D0,
+ 0x597D, 0x07B7, 0x5981, 0x11D1, 0x5982, 0x0CD7, 0x5983, 0x0D72,
+ 0x5984, 0x0EDD, 0x598A, 0x0CDB, 0x598D, 0x11DA, 0x5993, 0x0652,
+ 0x5996, 0x0F2F, 0x5999, 0x0EBB, 0x599B, 0x1239, 0x599D, 0x11D2,
+ 0x59A3, 0x11D5, 0x59A4, 0x20EE, 0x59A5, 0x0B25, 0x59A8, 0x0E66,
+ 0x59AC, 0x0C44, 0x59B2, 0x11D6, 0x59B9, 0x0E93, 0x59BA, 0x20EF,
+ 0x59BB, 0x083A, 0x59BE, 0x0992, 0x59C6, 0x11D7, 0x59C9, 0x089E,
+ 0x59CA, 0x3871, 0x59CB, 0x089D, 0x59D0, 0x047D, 0x59D1, 0x077C,
+ 0x59D2, 0x3872, 0x59D3, 0x0A4F, 0x59D4, 0x0495, 0x59D9, 0x11DB,
+ 0x59DA, 0x11DC, 0x59DC, 0x11D9, 0x59DD, 0x3873, 0x59E3, 0x3874,
+ 0x59E4, 0x3875, 0x59E5, 0x04DA, 0x59E6, 0x05EB, 0x59E8, 0x11D8,
+ 0x59EA, 0x0ED1, 0x59EB, 0x0DA3, 0x59EC, 0x36AD, 0x59F6, 0x046C,
+ 0x59FB, 0x04BD, 0x59FF, 0x089F, 0x5A01, 0x0496, 0x5A03, 0x0467,
+ 0x5A04, 0x3876, 0x5A09, 0x11E1, 0x5A0C, 0x3877, 0x5A11, 0x11DF,
+ 0x5A18, 0x0EC8, 0x5A1A, 0x11E2, 0x5A1B, 0x35C1, 0x5A1C, 0x11E0,
+ 0x5A1F, 0x11DE, 0x5A20, 0x09F7, 0x5A23, 0x3878, 0x5A25, 0x11DD,
+ 0x5A29, 0x0E2A, 0x5A2F, 0x0798, 0x5A35, 0x11E6, 0x5A36, 0x11E7,
+ 0x5A3C, 0x0993, 0x5A40, 0x11E3, 0x5A41, 0x0FD2, 0x5A46, 0x0D02,
+ 0x5A47, 0x3879, 0x5A49, 0x11E5, 0x5A55, 0x387A, 0x5A5A, 0x0817,
+ 0x5A62, 0x11E8, 0x5A63, 0x387B, 0x5A66, 0x0DCA, 0x5A6A, 0x11E9,
+ 0x5A6C, 0x11E4, 0x5A6D, 0x387C, 0x5A7E, 0x387D, 0x5A7F, 0x0EC7,
+ 0x5A92, 0x0D14, 0x5A9A, 0x11EA, 0x5A9B, 0x0DA4, 0x5A9E, 0x387E,
+ 0x5AA7, 0x387F, 0x5AAC, 0x3880, 0x5AB3, 0x3881, 0x5ABC, 0x11EB,
+ 0x5ABD, 0x11EF, 0x5ABE, 0x11EC, 0x5AC1, 0x0547, 0x5AC2, 0x11EE,
+ 0x5AC9, 0x08E7, 0x5ACB, 0x11ED, 0x5ACC, 0x074F, 0x5AD0, 0x11FB,
+ 0x5AD6, 0x11F4, 0x5AD7, 0x11F1, 0x5AE0, 0x3882, 0x5AE1, 0x0BA2,
+ 0x5AE3, 0x11F0, 0x5AE6, 0x11F2, 0x5AE9, 0x11F3, 0x5AFA, 0x11F5,
+ 0x5AFB, 0x11F6, 0x5B00, 0x3883, 0x5B09, 0x062E, 0x5B0B, 0x11F8,
+ 0x5B0C, 0x11F7, 0x5B16, 0x11F9, 0x5B19, 0x3884, 0x5B22, 0x09D6,
+ 0x5B25, 0x3885, 0x5B2A, 0x11FC, 0x5B2C, 0x0BF8, 0x5B2D, 0x3886,
+ 0x5B30, 0x04E7, 0x5B32, 0x11FA, 0x5B36, 0x11FD, 0x5B3E, 0x11FE,
+ 0x5B40, 0x1201, 0x5B41, 0x3887, 0x5B43, 0x11FF, 0x5B45, 0x1200,
+ 0x5B50, 0x08A0, 0x5B51, 0x1202, 0x5B54, 0x07B8, 0x5B55, 0x1203,
+ 0x5B56, 0x20F0, 0x5B57, 0x08C8, 0x5B58, 0x0B18, 0x5B5A, 0x1204,
+ 0x5B5B, 0x1205, 0x5B5C, 0x08A8, 0x5B5D, 0x07B9, 0x5B5F, 0x0EDE,
+ 0x5B63, 0x0642, 0x5B64, 0x077D, 0x5B65, 0x1206, 0x5B66, 0x05B6,
+ 0x5B69, 0x1207, 0x5B6B, 0x0B19, 0x5B70, 0x1208, 0x5B71, 0x1230,
+ 0x5B73, 0x1209, 0x5B75, 0x120A, 0x5B78, 0x120B, 0x5B7A, 0x120D,
+ 0x5B7C, 0x3888, 0x5B7E, 0x3889, 0x5B7F, 0x388A, 0x5B80, 0x120E,
+ 0x5B82, 0x3610, 0x5B83, 0x120F, 0x5B85, 0x0B50, 0x5B87, 0x04C9,
+ 0x5B88, 0x0915, 0x5B89, 0x0486, 0x5B8A, 0x388B, 0x5B8B, 0x0AD9,
+ 0x5B8C, 0x05EC, 0x5B8D, 0x08E1, 0x5B8F, 0x07BA, 0x5B95, 0x0C60,
+ 0x5B97, 0x092B, 0x5B98, 0x05ED, 0x5B99, 0x0BA6, 0x5B9A, 0x0C06,
+ 0x5B9B, 0x047C, 0x5B9C, 0x0653, 0x5B9D, 0x0E45, 0x5B9F, 0x08EE,
+ 0x5BA2, 0x066C, 0x5BA3, 0x0A8F, 0x5BA4, 0x08E8, 0x5BA5, 0x0F12,
+ 0x5BA6, 0x1210, 0x5BAE, 0x0676, 0x5BB0, 0x083B, 0x5BB3, 0x0590,
+ 0x5BB4, 0x0505, 0x5BB5, 0x0994, 0x5BB6, 0x0548, 0x5BB8, 0x1211,
+ 0x5BB9, 0x0F30, 0x5BBF, 0x0953, 0x5BC0, 0x20F1, 0x5BC2, 0x0910,
+ 0x5BC3, 0x1212, 0x5BC4, 0x062F, 0x5BC5, 0x0CAA, 0x5BC6, 0x0EB5,
+ 0x5BC7, 0x1213, 0x5BC9, 0x1214, 0x5BCC, 0x0DCB, 0x5BD0, 0x1216,
+ 0x5BD2, 0x05E4, 0x5BD3, 0x06EF, 0x5BD4, 0x1215, 0x5BD8, 0x20F3,
+ 0x5BDB, 0x05EE, 0x5BDD, 0x09F8, 0x5BDE, 0x121A, 0x5BDF, 0x086F,
+ 0x5BE1, 0x0549, 0x5BE2, 0x1219, 0x5BE4, 0x1217, 0x5BE5, 0x121B,
+ 0x5BE6, 0x1218, 0x5BE7, 0x0CE1, 0x5BE8, 0x148E, 0x5BE9, 0x09F9,
+ 0x5BEB, 0x121C, 0x5BEC, 0x20F4, 0x5BEE, 0x0F88, 0x5BF0, 0x121D,
+ 0x5BF3, 0x121F, 0x5BF5, 0x0BBC, 0x5BF6, 0x121E, 0x5BF8, 0x0A47,
+ 0x5BFA, 0x08C9, 0x5BFE, 0x0B30, 0x5BFF, 0x0923, 0x5C01, 0x0DE7,
+ 0x5C02, 0x0A90, 0x5C04, 0x08F9, 0x5C05, 0x1220, 0x5C06, 0x0995,
+ 0x5C07, 0x1221, 0x5C08, 0x1222, 0x5C09, 0x0497, 0x5C0A, 0x0B1A,
+ 0x5C0B, 0x0A18, 0x5C0D, 0x1223, 0x5C0E, 0x0C8B, 0x5C0F, 0x0996,
+ 0x5C11, 0x0997, 0x5C13, 0x1224, 0x5C14, 0x372A, 0x5C16, 0x0A91,
+ 0x5C19, 0x360B, 0x5C1A, 0x0998, 0x5C1E, 0x20F5, 0x5C20, 0x1225,
+ 0x5C22, 0x1226, 0x5C23, 0x388C, 0x5C24, 0x0EEC, 0x5C28, 0x1227,
+ 0x5C2B, 0x388D, 0x5C2D, 0x06BE, 0x5C30, 0x388E, 0x5C31, 0x092C,
+ 0x5C38, 0x1228, 0x5C39, 0x1229, 0x5C3A, 0x0908, 0x5C3B, 0x09F2,
+ 0x5C3C, 0x0CCC, 0x5C3D, 0x0A1A, 0x5C3E, 0x0D8C, 0x5C3F, 0x0CD8,
+ 0x5C40, 0x06C1, 0x5C41, 0x122A, 0x5C45, 0x0689, 0x5C46, 0x122B,
+ 0x5C48, 0x06F6, 0x5C4A, 0x0CA7, 0x5C4B, 0x0530, 0x5C4D, 0x08A1,
+ 0x5C4E, 0x122C, 0x5C4F, 0x122F, 0x5C50, 0x122E, 0x5C51, 0x06F5,
+ 0x5C53, 0x122D, 0x5C55, 0x0C32, 0x5C5B, 0x1E92, 0x5C5E, 0x0B10,
+ 0x5C60, 0x0C45, 0x5C61, 0x08F4, 0x5C62, 0x1E0D, 0x5C63, 0x388F,
+ 0x5C64, 0x0ADA, 0x5C65, 0x0F64, 0x5C69, 0x3890, 0x5C6C, 0x1231,
+ 0x5C6E, 0x1232, 0x5C6F, 0x0CAE, 0x5C71, 0x0881, 0x5C76, 0x1234,
+ 0x5C79, 0x1235, 0x5C7C, 0x3891, 0x5C8C, 0x1236, 0x5C90, 0x0630,
+ 0x5C91, 0x1237, 0x5C94, 0x1238, 0x5CA1, 0x052C, 0x5CA6, 0x20F6,
+ 0x5CA8, 0x0ABD, 0x5CA9, 0x0620, 0x5CAB, 0x123A, 0x5CAC, 0x0EB4,
+ 0x5CB1, 0x0B32, 0x5CB3, 0x05B7, 0x5CB6, 0x123C, 0x5CB7, 0x123E,
+ 0x5CB8, 0x061B, 0x5CBA, 0x20F7, 0x5CBB, 0x123B, 0x5CBC, 0x123D,
+ 0x5CBE, 0x1240, 0x5CC5, 0x123F, 0x5CC7, 0x1241, 0x5CCB, 0x3892,
+ 0x5CD2, 0x3893, 0x5CD9, 0x1242, 0x5CE0, 0x0C95, 0x5CE1, 0x06A6,
+ 0x5CE6, 0x372C, 0x5CE8, 0x0565, 0x5CE9, 0x1243, 0x5CEA, 0x1248,
+ 0x5CED, 0x1246, 0x5CEF, 0x0E47, 0x5CF0, 0x0E46, 0x5CF4, 0x3894,
+ 0x5CF5, 0x20F8, 0x5CF6, 0x0C61, 0x5CFA, 0x1245, 0x5CFB, 0x095E,
+ 0x5CFD, 0x1244, 0x5D07, 0x0A38, 0x5D0B, 0x1249, 0x5D0E, 0x085A,
+ 0x5D11, 0x124F, 0x5D14, 0x1250, 0x5D15, 0x124A, 0x5D16, 0x0591,
+ 0x5D17, 0x124B, 0x5D18, 0x1254, 0x5D19, 0x1253, 0x5D1A, 0x1252,
+ 0x5D1B, 0x124E, 0x5D1F, 0x124D, 0x5D22, 0x1251, 0x5D24, 0x3895,
+ 0x5D26, 0x3896, 0x5D27, 0x20F9, 0x5D29, 0x0E48, 0x5D42, 0x20FC,
+ 0x5D43, 0x3897, 0x5D46, 0x3898, 0x5D4A, 0x3899, 0x5D4B, 0x1258,
+ 0x5D4C, 0x1255, 0x5D4E, 0x1257, 0x5D50, 0x0F5C, 0x5D52, 0x1256,
+ 0x5D53, 0x20FA, 0x5D5C, 0x124C, 0x5D69, 0x0A39, 0x5D6C, 0x1259,
+ 0x5D6D, 0x20FD, 0x5D6F, 0x0827, 0x5D73, 0x125A, 0x5D76, 0x125B,
+ 0x5D82, 0x125E, 0x5D84, 0x125D, 0x5D87, 0x125C, 0x5D8B, 0x0C62,
+ 0x5D8C, 0x1247, 0x5D90, 0x1264, 0x5D92, 0x389A, 0x5D94, 0x389B,
+ 0x5D99, 0x389C, 0x5D9D, 0x1260, 0x5DA0, 0x389D, 0x5DA2, 0x125F,
+ 0x5DAC, 0x1261, 0x5DAE, 0x1262, 0x5DB2, 0x3BA5, 0x5DB7, 0x1265,
+ 0x5DB8, 0x20FE, 0x5DB9, 0x20FF, 0x5DBA, 0x0FAE, 0x5DBC, 0x1266,
+ 0x5DBD, 0x1263, 0x5DC9, 0x1267, 0x5DCC, 0x061C, 0x5DCD, 0x1268,
+ 0x5DD0, 0x2100, 0x5DD2, 0x126A, 0x5DD3, 0x1269, 0x5DD6, 0x126B,
+ 0x5DD8, 0x389E, 0x5DDB, 0x126C, 0x5DDD, 0x0A92, 0x5DDE, 0x092D,
+ 0x5DE0, 0x389F, 0x5DE1, 0x096E, 0x5DE2, 0x3432, 0x5DE3, 0x0AE5,
+ 0x5DE5, 0x07BB, 0x5DE6, 0x0828, 0x5DE7, 0x07BC, 0x5DE8, 0x068A,
+ 0x5DEB, 0x126D, 0x5DEE, 0x0829, 0x5DF1, 0x077E, 0x5DF2, 0x126E,
+ 0x5DF3, 0x0EB2, 0x5DF4, 0x0CF9, 0x5DF5, 0x126F, 0x5DF7, 0x07BD,
+ 0x5DF8, 0x38A0, 0x5DFB, 0x05E8, 0x5DFD, 0x0B65, 0x5DFE, 0x06CA,
+ 0x5DFF, 0x35E2, 0x5E00, 0x38A1, 0x5E02, 0x08A2, 0x5E03, 0x0DCD,
+ 0x5E06, 0x0D55, 0x5E0B, 0x1270, 0x5E0C, 0x0631, 0x5E11, 0x1273,
+ 0x5E12, 0x38A2, 0x5E14, 0x38A3, 0x5E15, 0x38A4, 0x5E16, 0x0BBD,
+ 0x5E18, 0x38A5, 0x5E19, 0x1272, 0x5E1A, 0x1271, 0x5E1B, 0x1274,
+ 0x5E1D, 0x0C07, 0x5E25, 0x0A29, 0x5E2B, 0x08A3, 0x5E2D, 0x0A6E,
+ 0x5E2E, 0x38A6, 0x5E2F, 0x0B33, 0x5E30, 0x063C, 0x5E33, 0x0BBE,
+ 0x5E36, 0x1275, 0x5E37, 0x1276, 0x5E38, 0x09D7, 0x5E3D, 0x0E67,
+ 0x5E40, 0x1279, 0x5E43, 0x1278, 0x5E44, 0x1277, 0x5E45, 0x0DEF,
+ 0x5E47, 0x1280, 0x5E4C, 0x0E88, 0x5E4E, 0x127A, 0x5E54, 0x127C,
+ 0x5E55, 0x0E99, 0x5E57, 0x127B, 0x5E58, 0x38A7, 0x5E5F, 0x127D,
+ 0x5E61, 0x0D3C, 0x5E62, 0x127E, 0x5E63, 0x0E0E, 0x5E64, 0x127F,
+ 0x5E6B, 0x38A8, 0x5E6C, 0x38A9, 0x5E72, 0x05EF, 0x5E73, 0x0E0F,
+ 0x5E74, 0x0CE5, 0x5E75, 0x1281, 0x5E76, 0x1282, 0x5E78, 0x07BE,
+ 0x5E79, 0x05F0, 0x5E7A, 0x1283, 0x5E7B, 0x076C, 0x5E7C, 0x0F2E,
+ 0x5E7D, 0x0F13, 0x5E7E, 0x0632, 0x5E7F, 0x1285, 0x5E81, 0x0BBF,
+ 0x5E83, 0x07BF, 0x5E84, 0x0999, 0x5E87, 0x0D73, 0x5E8A, 0x099A,
+ 0x5E8F, 0x0982, 0x5E95, 0x0C08, 0x5E96, 0x0E49, 0x5E97, 0x0C33,
+ 0x5E99, 0x36B0, 0x5E9A, 0x07C0, 0x5E9C, 0x0DCE, 0x5EA0, 0x1286,
+ 0x5EA6, 0x0C53, 0x5EA7, 0x0832, 0x5EA8, 0x38AA, 0x5EAA, 0x38AB,
+ 0x5EAB, 0x077F, 0x5EAD, 0x0C09, 0x5EB5, 0x0487, 0x5EB6, 0x0978,
+ 0x5EB7, 0x07C1, 0x5EB8, 0x0F31, 0x5EBE, 0x38AC, 0x5EBF, 0x38AD,
+ 0x5EC1, 0x1287, 0x5EC2, 0x1288, 0x5EC3, 0x0D07, 0x5EC8, 0x1289,
+ 0x5EC9, 0x0FBF, 0x5ECA, 0x0FD3, 0x5ECB, 0x38AE, 0x5ECF, 0x128B,
+ 0x5ED0, 0x128A, 0x5ED2, 0x38AF, 0x5ED3, 0x05A5, 0x5ED6, 0x128C,
+ 0x5EDA, 0x128F, 0x5EDB, 0x1290, 0x5EDD, 0x128E, 0x5EDF, 0x0DB2,
+ 0x5EE0, 0x099B, 0x5EE1, 0x1292, 0x5EE2, 0x1291, 0x5EE3, 0x128D,
+ 0x5EE8, 0x1293, 0x5EE9, 0x1294, 0x5EEC, 0x1295, 0x5EF0, 0x1298,
+ 0x5EF1, 0x1296, 0x5EF3, 0x1297, 0x5EF4, 0x1299, 0x5EF6, 0x0506,
+ 0x5EF7, 0x0C0A, 0x5EF8, 0x129A, 0x5EFA, 0x0750, 0x5EFB, 0x0576,
+ 0x5EFC, 0x0CEC, 0x5EFE, 0x129B, 0x5EFF, 0x0CD3, 0x5F01, 0x0E2B,
+ 0x5F03, 0x129C, 0x5F04, 0x0FD4, 0x5F07, 0x38B0, 0x5F09, 0x129D,
+ 0x5F0A, 0x0E10, 0x5F0B, 0x12A0, 0x5F0C, 0x0FFA, 0x5F0D, 0x100A,
+ 0x5F0E, 0x38B1, 0x5F0F, 0x08DC, 0x5F10, 0x0CCD, 0x5F11, 0x12A1,
+ 0x5F13, 0x0677, 0x5F14, 0x0BC0, 0x5F15, 0x04BE, 0x5F16, 0x12A2,
+ 0x5F17, 0x0DF6, 0x5F18, 0x07C2, 0x5F1B, 0x0B8E, 0x5F1C, 0x38B2,
+ 0x5F1D, 0x38B3, 0x5F1F, 0x0C0B, 0x5F21, 0x2101, 0x5F22, 0x38B4,
+ 0x5F25, 0x0EFB, 0x5F26, 0x076D, 0x5F27, 0x0780, 0x5F28, 0x38B5,
+ 0x5F29, 0x12A3, 0x5F2D, 0x12A4, 0x5F2F, 0x12AA, 0x5F31, 0x0911,
+ 0x5F34, 0x2102, 0x5F35, 0x0BC1, 0x5F36, 0x38B6, 0x5F37, 0x06A7,
+ 0x5F38, 0x12A5, 0x5F3A, 0x3598, 0x5F3B, 0x38B7, 0x5F3C, 0x0D9D,
+ 0x5F3E, 0x0B84, 0x5F40, 0x38B8, 0x5F41, 0x12A6, 0x5F45, 0x20B2,
+ 0x5F48, 0x12A7, 0x5F4A, 0x06A8, 0x5F4C, 0x12A8, 0x5F4E, 0x12A9,
+ 0x5F50, 0x38B9, 0x5F51, 0x12AB, 0x5F53, 0x0C70, 0x5F56, 0x12AC,
+ 0x5F57, 0x12AD, 0x5F58, 0x38BA, 0x5F59, 0x12AE, 0x5F5C, 0x129F,
+ 0x5F5D, 0x129E, 0x5F61, 0x12AF, 0x5F62, 0x0717, 0x5F64, 0x38BB,
+ 0x5F65, 0x36AC, 0x5F66, 0x0D99, 0x5F67, 0x2103, 0x5F69, 0x083C,
+ 0x5F6A, 0x0DA9, 0x5F6B, 0x0BC2, 0x5F6C, 0x0DBD, 0x5F6D, 0x12B0,
+ 0x5F70, 0x099C, 0x5F71, 0x04E8, 0x5F73, 0x12B1, 0x5F77, 0x12B2,
+ 0x5F79, 0x0EFE, 0x5F7C, 0x0D74, 0x5F7F, 0x12B5, 0x5F80, 0x051F,
+ 0x5F81, 0x0A50, 0x5F82, 0x12B4, 0x5F83, 0x12B3, 0x5F84, 0x0718,
+ 0x5F85, 0x0B34, 0x5F87, 0x12B9, 0x5F88, 0x12B7, 0x5F89, 0x38BC,
+ 0x5F8A, 0x12B6, 0x5F8B, 0x0F6F, 0x5F8C, 0x0799, 0x5F90, 0x0983,
+ 0x5F91, 0x12B8, 0x5F92, 0x0C46, 0x5F93, 0x0948, 0x5F97, 0x0C98,
+ 0x5F98, 0x12BC, 0x5F99, 0x12BB, 0x5F9C, 0x38BD, 0x5F9E, 0x12BA,
+ 0x5FA0, 0x12BD, 0x5FA1, 0x079A, 0x5FA4, 0x38BF, 0x5FA7, 0x38BE,
+ 0x5FA8, 0x12BE, 0x5FA9, 0x0DEE, 0x5FAA, 0x0965, 0x5FAD, 0x12BF,
+ 0x5FAE, 0x0D8D, 0x5FAF, 0x38C0, 0x5FB3, 0x0C99, 0x5FB4, 0x0BC3,
+ 0x5FB5, 0x3438, 0x5FB7, 0x2104, 0x5FB8, 0x38C1, 0x5FB9, 0x0C2A,
+ 0x5FBC, 0x12C0, 0x5FBD, 0x0645, 0x5FC3, 0x09FA, 0x5FC4, 0x38C2,
+ 0x5FC5, 0x0D9E, 0x5FC9, 0x38C3, 0x5FCC, 0x0633, 0x5FCD, 0x0CDC,
+ 0x5FD6, 0x12C1, 0x5FD7, 0x08A4, 0x5FD8, 0x0E68, 0x5FD9, 0x0E69,
+ 0x5FDC, 0x0520, 0x5FDD, 0x12C6, 0x5FDE, 0x2105, 0x5FE0, 0x0BA7,
+ 0x5FE1, 0x38C4, 0x5FE4, 0x12C3, 0x5FE9, 0x38C5, 0x5FEB, 0x0577,
+ 0x5FED, 0x38C6, 0x5FF0, 0x12F6, 0x5FF1, 0x12C5, 0x5FF5, 0x0CE6,
+ 0x5FF8, 0x12C4, 0x5FFB, 0x12C2, 0x5FFC, 0x38C7, 0x5FFD, 0x080C,
+ 0x5FFF, 0x12C8, 0x600E, 0x12CE, 0x600F, 0x12D4, 0x6010, 0x12CC,
+ 0x6012, 0x0C56, 0x6015, 0x12D1, 0x6016, 0x0DCF, 0x6017, 0x38C8,
+ 0x6019, 0x12CB, 0x601A, 0x38C9, 0x601B, 0x12D0, 0x601C, 0x0FAF,
+ 0x601D, 0x08A5, 0x6020, 0x0B35, 0x6021, 0x12C9, 0x6025, 0x0678,
+ 0x6026, 0x12D3, 0x6027, 0x0A51, 0x6028, 0x0507, 0x6029, 0x12CD,
+ 0x602A, 0x0578, 0x602B, 0x12D2, 0x602F, 0x06A9, 0x6031, 0x12CF,
+ 0x6033, 0x38CA, 0x603A, 0x12D5, 0x6041, 0x12D7, 0x6042, 0x12E1,
+ 0x6043, 0x12DF, 0x6046, 0x12DC, 0x604A, 0x12DB, 0x604B, 0x0FC0,
+ 0x604D, 0x12DD, 0x6050, 0x06AA, 0x6052, 0x07C3, 0x6055, 0x0984,
+ 0x6059, 0x12E4, 0x605A, 0x12D6, 0x605D, 0x2106, 0x605F, 0x12DA,
+ 0x6060, 0x12CA, 0x6061, 0x38CB, 0x6062, 0x057A, 0x6063, 0x12DE,
+ 0x6064, 0x12E0, 0x6065, 0x0B8F, 0x6068, 0x0818, 0x6069, 0x0538,
+ 0x606A, 0x12D8, 0x606B, 0x12E3, 0x606C, 0x12E2, 0x606D, 0x06AB,
+ 0x606F, 0x0B09, 0x6070, 0x05C4, 0x6075, 0x0719, 0x6077, 0x12D9,
+ 0x607F, 0x38CC, 0x6081, 0x12E5, 0x6083, 0x12E8, 0x6084, 0x12EA,
+ 0x6085, 0x2107, 0x6089, 0x08E9, 0x608A, 0x2108, 0x608B, 0x12F0,
+ 0x608C, 0x0C0C, 0x608D, 0x12E6, 0x6092, 0x12EE, 0x6094, 0x0579,
+ 0x6096, 0x12EC, 0x6097, 0x12ED, 0x609A, 0x12E9, 0x609B, 0x12EB,
+ 0x609E, 0x38CD, 0x609F, 0x079B, 0x60A0, 0x0F14, 0x60A3, 0x05F1,
+ 0x60A4, 0x38CE, 0x60A6, 0x04FB, 0x60A7, 0x12EF, 0x60A9, 0x0CF0,
+ 0x60AA, 0x0471, 0x60B0, 0x38CF, 0x60B2, 0x0D75, 0x60B3, 0x12C7,
+ 0x60B4, 0x12F5, 0x60B5, 0x12F9, 0x60B6, 0x0EF1, 0x60B8, 0x12F2,
+ 0x60BC, 0x0C63, 0x60BD, 0x12F7, 0x60C5, 0x09D8, 0x60C6, 0x12F8,
+ 0x60C7, 0x0CAF, 0x60CB, 0x38D0, 0x60D1, 0x0FED, 0x60D3, 0x12F4,
+ 0x60D5, 0x210A, 0x60D8, 0x12FA, 0x60DA, 0x080D, 0x60DB, 0x38D1,
+ 0x60DC, 0x0A6F, 0x60DE, 0x2109, 0x60DF, 0x0498, 0x60E0, 0x12F3,
+ 0x60E1, 0x12F1, 0x60E3, 0x0ADC, 0x60E7, 0x12E7, 0x60E8, 0x0882,
+ 0x60F0, 0x0B26, 0x60F1, 0x1306, 0x60F2, 0x210C, 0x60F3, 0x0ADD,
+ 0x60F4, 0x1301, 0x60F6, 0x12FE, 0x60F7, 0x12FF, 0x60F8, 0x38D2,
+ 0x60F9, 0x0912, 0x60FA, 0x1302, 0x60FB, 0x1305, 0x6100, 0x1300,
+ 0x6101, 0x092F, 0x6103, 0x1303, 0x6106, 0x12FD, 0x6108, 0x0F08,
+ 0x6109, 0x0F07, 0x610D, 0x1307, 0x610E, 0x1308, 0x610F, 0x0499,
+ 0x6111, 0x210D, 0x6112, 0x38D3, 0x6113, 0x38D4, 0x6114, 0x38D5,
+ 0x6115, 0x12FC, 0x611A, 0x06EA, 0x611B, 0x046A, 0x611C, 0x38D6,
+ 0x611F, 0x05F2, 0x6120, 0x210B, 0x6121, 0x1304, 0x6127, 0x130C,
+ 0x6128, 0x130B, 0x612C, 0x1310, 0x6130, 0x210F, 0x6134, 0x1311,
+ 0x6137, 0x210E, 0x613C, 0x130F, 0x613D, 0x1312, 0x613E, 0x130A,
+ 0x613F, 0x130E, 0x6142, 0x1313, 0x6144, 0x1314, 0x6147, 0x1309,
+ 0x6148, 0x08CA, 0x614A, 0x130D, 0x614B, 0x0B36, 0x614C, 0x07C4,
+ 0x614D, 0x12FB, 0x614E, 0x09FB, 0x6153, 0x1321, 0x6155, 0x0E39,
+ 0x6158, 0x1317, 0x6159, 0x1318, 0x615A, 0x1319, 0x615D, 0x1320,
+ 0x615F, 0x131F, 0x6162, 0x0EAB, 0x6163, 0x05F3, 0x6165, 0x131D,
+ 0x6167, 0x071B, 0x6168, 0x0592, 0x616B, 0x131A, 0x616E, 0x0F80,
+ 0x616F, 0x131C, 0x6170, 0x049A, 0x6171, 0x131E, 0x6173, 0x1315,
+ 0x6174, 0x131B, 0x6175, 0x1322, 0x6176, 0x071A, 0x6177, 0x1316,
+ 0x617C, 0x38D7, 0x617E, 0x0F47, 0x6182, 0x0F15, 0x6187, 0x1325,
+ 0x618A, 0x1329, 0x618D, 0x38D8, 0x618E, 0x0B00, 0x6190, 0x0FC1,
+ 0x6191, 0x132A, 0x6194, 0x1327, 0x6196, 0x1324, 0x6198, 0x2110,
+ 0x6199, 0x1323, 0x619A, 0x1328, 0x619F, 0x38D9, 0x61A4, 0x0E00,
+ 0x61A7, 0x0C8C, 0x61A8, 0x38DA, 0x61A9, 0x071C, 0x61AB, 0x132B,
+ 0x61AC, 0x1326, 0x61AE, 0x132C, 0x61B2, 0x0751, 0x61B6, 0x0531,
+ 0x61BA, 0x1334, 0x61BE, 0x05F4, 0x61C2, 0x38DB, 0x61C3, 0x1332,
+ 0x61C6, 0x1333, 0x61C7, 0x0819, 0x61C8, 0x1331, 0x61C9, 0x132F,
+ 0x61CA, 0x132E, 0x61CB, 0x1335, 0x61CC, 0x132D, 0x61CD, 0x1337,
+ 0x61D0, 0x057B, 0x61DF, 0x38DC, 0x61E3, 0x1339, 0x61E6, 0x1338,
+ 0x61F2, 0x0BC4, 0x61F4, 0x133C, 0x61F6, 0x133A, 0x61F7, 0x1330,
+ 0x61F8, 0x0752, 0x61FA, 0x133B, 0x61FC, 0x133F, 0x61FD, 0x133E,
+ 0x61FE, 0x1340, 0x61FF, 0x133D, 0x6200, 0x1341, 0x6208, 0x1342,
+ 0x6209, 0x1343, 0x620A, 0x0E3A, 0x620C, 0x1345, 0x620D, 0x1344,
+ 0x620E, 0x0949, 0x6210, 0x0A52, 0x6211, 0x0566, 0x6212, 0x057C,
+ 0x6213, 0x2111, 0x6214, 0x1346, 0x6215, 0x38DD, 0x6216, 0x0483,
+ 0x621A, 0x0A70, 0x621B, 0x1347, 0x621D, 0x1A64, 0x621E, 0x1348,
+ 0x621F, 0x0737, 0x6221, 0x1349, 0x6226, 0x0A93, 0x6229, 0x38DE,
+ 0x622A, 0x134A, 0x622E, 0x134B, 0x622F, 0x0654, 0x6230, 0x134C,
+ 0x6232, 0x134D, 0x6233, 0x134E, 0x6234, 0x0B37, 0x6236, 0x35BD,
+ 0x6238, 0x0781, 0x623B, 0x0EED, 0x623E, 0x344E, 0x623F, 0x0E6A,
+ 0x6240, 0x0974, 0x6241, 0x134F, 0x6243, 0x38DF, 0x6246, 0x38E0,
+ 0x6247, 0x0A94, 0x6248, 0x1B1A, 0x6249, 0x0D76, 0x624B, 0x0916,
+ 0x624C, 0x38E1, 0x624D, 0x083D, 0x624E, 0x1350, 0x6251, 0x38E2,
+ 0x6253, 0x0B27, 0x6255, 0x0DF7, 0x6256, 0x38E3, 0x6258, 0x0B51,
+ 0x625B, 0x1353, 0x625E, 0x1351, 0x6260, 0x1354, 0x6263, 0x1352,
+ 0x6268, 0x1355, 0x626E, 0x0E01, 0x6271, 0x047B, 0x6276, 0x0DD0,
+ 0x6279, 0x0D77, 0x627C, 0x1356, 0x627E, 0x1359, 0x627F, 0x099D,
+ 0x6280, 0x0655, 0x6282, 0x1357, 0x6283, 0x135E, 0x6284, 0x099E,
+ 0x6285, 0x35C5, 0x6289, 0x1358, 0x628A, 0x0CFA, 0x6291, 0x0F48,
+ 0x6292, 0x135A, 0x6293, 0x135B, 0x6294, 0x135F, 0x6295, 0x0C64,
+ 0x6296, 0x135C, 0x6297, 0x07C5, 0x6298, 0x0A82, 0x629B, 0x136D,
+ 0x629C, 0x0D48, 0x629E, 0x0B52, 0x62A6, 0x2112, 0x62AB, 0x0D78,
+ 0x62AC, 0x13B2, 0x62B1, 0x0E4A, 0x62B5, 0x0C0D, 0x62B9, 0x0EA3,
+ 0x62BB, 0x1362, 0x62BC, 0x0521, 0x62BD, 0x0BA8, 0x62C2, 0x136B,
+ 0x62C4, 0x38E4, 0x62C5, 0x0B72, 0x62C6, 0x1365, 0x62C7, 0x136C,
+ 0x62C8, 0x1367, 0x62C9, 0x136E, 0x62CA, 0x136A, 0x62CC, 0x1369,
+ 0x62CD, 0x0D25, 0x62CF, 0x1363, 0x62D0, 0x057D, 0x62D1, 0x1361,
+ 0x62D2, 0x068B, 0x62D3, 0x0B53, 0x62D4, 0x135D, 0x62D7, 0x1360,
+ 0x62D8, 0x07C6, 0x62D9, 0x0A7F, 0x62DB, 0x099F, 0x62DC, 0x1368,
+ 0x62DD, 0x0D08, 0x62E0, 0x068C, 0x62E1, 0x05A6, 0x62EC, 0x05C5,
+ 0x62ED, 0x09E7, 0x62EE, 0x1370, 0x62EF, 0x1375, 0x62F1, 0x1371,
+ 0x62F3, 0x0753, 0x62F5, 0x1376, 0x62F6, 0x0870, 0x62F7, 0x07FB,
+ 0x62FC, 0x38E5, 0x62FE, 0x0930, 0x62FF, 0x1364, 0x6301, 0x08CB,
+ 0x6302, 0x1373, 0x6307, 0x08A6, 0x6308, 0x1374, 0x6309, 0x0488,
+ 0x630A, 0x38E6, 0x630C, 0x136F, 0x630D, 0x38E7, 0x6311, 0x0BC5,
+ 0x6318, 0x38E8, 0x6319, 0x068D, 0x631B, 0x3737, 0x631F, 0x06AC,
+ 0x6327, 0x1372, 0x6328, 0x046B, 0x632B, 0x0833, 0x632F, 0x09FC,
+ 0x6339, 0x38E9, 0x633A, 0x0C0E, 0x633D, 0x0D68, 0x633E, 0x1378,
+ 0x633F, 0x0AE0, 0x6342, 0x38EA, 0x6343, 0x38EB, 0x6349, 0x0B0A,
+ 0x634C, 0x0879, 0x634D, 0x1379, 0x634F, 0x137B, 0x6350, 0x1377,
+ 0x6355, 0x0E31, 0x6357, 0x0BD9, 0x635C, 0x0ADE, 0x6365, 0x38EC,
+ 0x6367, 0x0E4B, 0x6368, 0x08FA, 0x6369, 0x1387, 0x636B, 0x1386,
+ 0x636E, 0x0A3E, 0x6372, 0x0754, 0x6374, 0x38ED, 0x6376, 0x1380,
+ 0x6377, 0x09A1, 0x637A, 0x0CC0, 0x637B, 0x0CE7, 0x637D, 0x38EE,
+ 0x6380, 0x137E, 0x6383, 0x0ADF, 0x6384, 0x38EF, 0x6387, 0x38F0,
+ 0x6388, 0x0924, 0x6389, 0x1383, 0x638C, 0x09A0, 0x638E, 0x137D,
+ 0x638F, 0x1382, 0x6390, 0x38F1, 0x6392, 0x0D09, 0x6396, 0x137C,
+ 0x6398, 0x06F7, 0x639B, 0x05BB, 0x639E, 0x38F2, 0x639F, 0x1384,
+ 0x63A0, 0x0F73, 0x63A1, 0x083E, 0x63A2, 0x0B73, 0x63A3, 0x1381,
+ 0x63A5, 0x0A80, 0x63A7, 0x07C7, 0x63A8, 0x0A2A, 0x63A9, 0x0508,
+ 0x63AA, 0x0ABE, 0x63AB, 0x137F, 0x63AC, 0x065F, 0x63B2, 0x071D,
+ 0x63B4, 0x0BEB, 0x63B5, 0x1385, 0x63BB, 0x0AE1, 0x63BE, 0x1388,
+ 0x63C0, 0x138A, 0x63C3, 0x0B17, 0x63C4, 0x1390, 0x63C6, 0x138B,
+ 0x63C9, 0x138D, 0x63CF, 0x0DB3, 0x63D0, 0x0C0F, 0x63D1, 0x38F3,
+ 0x63D2, 0x138E, 0x63D6, 0x0F16, 0x63DA, 0x0F32, 0x63DB, 0x05F5,
+ 0x63DC, 0x38F4, 0x63E1, 0x0472, 0x63E3, 0x138C, 0x63E9, 0x1389,
+ 0x63ED, 0x341C, 0x63EE, 0x0634, 0x63F4, 0x0509, 0x63F5, 0x2113,
+ 0x63F6, 0x138F, 0x63F7, 0x3644, 0x63FA, 0x0F33, 0x6406, 0x1393,
+ 0x6409, 0x38F5, 0x640D, 0x0B1B, 0x640F, 0x139A, 0x6410, 0x38F6,
+ 0x6413, 0x1394, 0x6414, 0x1E2C, 0x6416, 0x1391, 0x6417, 0x1398,
+ 0x641C, 0x137A, 0x6422, 0x38F7, 0x6426, 0x1395, 0x6428, 0x1399,
+ 0x642C, 0x0D56, 0x642D, 0x0C65, 0x6434, 0x1392, 0x6436, 0x1396,
+ 0x643A, 0x071E, 0x643E, 0x0861, 0x6442, 0x0A81, 0x644E, 0x139E,
+ 0x6451, 0x1E43, 0x6454, 0x38F8, 0x6458, 0x0C20, 0x645B, 0x38F9,
+ 0x6460, 0x2114, 0x6467, 0x139B, 0x6469, 0x0E8E, 0x646D, 0x38FA,
+ 0x646F, 0x139C, 0x6476, 0x139D, 0x6478, 0x0EDA, 0x647A, 0x0A46,
+ 0x647B, 0x38FB, 0x6483, 0x0738, 0x6488, 0x13A4, 0x6492, 0x0883,
+ 0x6493, 0x13A1, 0x6495, 0x13A0, 0x649A, 0x0CE8, 0x649D, 0x2115,
+ 0x649E, 0x0C8D, 0x64A4, 0x0C2B, 0x64A5, 0x13A2, 0x64A9, 0x13A3,
+ 0x64AB, 0x0DE1, 0x64AD, 0x0CFB, 0x64AE, 0x0871, 0x64B0, 0x0A95,
+ 0x64B2, 0x0E7E, 0x64B9, 0x05A7, 0x64BB, 0x13AA, 0x64BC, 0x13A5,
+ 0x64BE, 0x38FC, 0x64BF, 0x38FD, 0x64C1, 0x0F34, 0x64C2, 0x13AC,
+ 0x64C5, 0x13A8, 0x64C7, 0x13A9, 0x64CA, 0x341D, 0x64CD, 0x0AE2,
+ 0x64CE, 0x2116, 0x64D2, 0x13A7, 0x64D4, 0x1366, 0x64D8, 0x13AB,
+ 0x64DA, 0x13A6, 0x64E0, 0x13B0, 0x64E1, 0x13B1, 0x64E2, 0x0C21,
+ 0x64E3, 0x13B3, 0x64E5, 0x38FE, 0x64E6, 0x0872, 0x64E7, 0x13AE,
+ 0x64EC, 0x0656, 0x64EF, 0x13B4, 0x64F1, 0x13AD, 0x64F2, 0x13B8,
+ 0x64F4, 0x13B7, 0x64F6, 0x13B6, 0x64F7, 0x38FF, 0x64FA, 0x13B9,
+ 0x64FB, 0x3900, 0x64FD, 0x13BB, 0x64FE, 0x09D9, 0x6500, 0x13BA,
+ 0x6504, 0x3901, 0x6505, 0x13BE, 0x6516, 0x3902, 0x6518, 0x13BC,
+ 0x6519, 0x3903, 0x651C, 0x13BD, 0x651D, 0x1397, 0x6522, 0x1E97,
+ 0x6523, 0x13C0, 0x6524, 0x13BF, 0x652A, 0x139F, 0x652B, 0x13C1,
+ 0x652C, 0x13B5, 0x652F, 0x08A7, 0x6534, 0x13C2, 0x6535, 0x13C3,
+ 0x6536, 0x13C5, 0x6537, 0x13C4, 0x6538, 0x13C6, 0x6539, 0x057E,
+ 0x653B, 0x07C8, 0x653E, 0x0E4C, 0x653F, 0x0A53, 0x6545, 0x0782,
+ 0x6547, 0x3904, 0x6548, 0x13C8, 0x654D, 0x13CB, 0x654E, 0x2117,
+ 0x654F, 0x0DC4, 0x6551, 0x0679, 0x6555, 0x13CA, 0x6556, 0x13C9,
+ 0x6557, 0x0D0A, 0x6558, 0x13CC, 0x6559, 0x06AD, 0x655D, 0x13CE,
+ 0x655E, 0x13CD, 0x6562, 0x05F6, 0x6563, 0x0884, 0x6566, 0x0CB0,
+ 0x6567, 0x3905, 0x656C, 0x071F, 0x6570, 0x0A3A, 0x6572, 0x13CF,
+ 0x6574, 0x0A54, 0x6575, 0x0C22, 0x6577, 0x0DD1, 0x6578, 0x13D0,
+ 0x6581, 0x3906, 0x6582, 0x13D1, 0x6583, 0x13D2, 0x6585, 0x3907,
+ 0x6587, 0x0E08, 0x6588, 0x120C, 0x6589, 0x0A6A, 0x658C, 0x0DBE,
+ 0x658E, 0x0848, 0x6590, 0x0D79, 0x6591, 0x0D57, 0x6597, 0x0C47,
+ 0x6599, 0x0F89, 0x659B, 0x13D4, 0x659C, 0x08FC, 0x659F, 0x13D5,
+ 0x65A1, 0x047A, 0x65A4, 0x06CC, 0x65A5, 0x0A71, 0x65A7, 0x0DD2,
+ 0x65AB, 0x13D6, 0x65AC, 0x0890, 0x65AD, 0x0B85, 0x65AF, 0x08A9,
+ 0x65B0, 0x09FD, 0x65B7, 0x13D7, 0x65B9, 0x0E4D, 0x65BC, 0x0519,
+ 0x65BD, 0x08AA, 0x65C1, 0x13DA, 0x65C2, 0x3908, 0x65C3, 0x13D8,
+ 0x65C4, 0x13DB, 0x65C5, 0x0F81, 0x65C6, 0x13D9, 0x65CB, 0x0A9F,
+ 0x65CC, 0x13DC, 0x65CF, 0x0B12, 0x65D2, 0x13DD, 0x65D7, 0x0636,
+ 0x65D9, 0x13DF, 0x65DB, 0x13DE, 0x65E0, 0x13E0, 0x65E1, 0x13E1,
+ 0x65E2, 0x0637, 0x65E3, 0x3585, 0x65E5, 0x0CD4, 0x65E6, 0x0B74,
+ 0x65E7, 0x0686, 0x65E8, 0x08AB, 0x65E9, 0x0AE3, 0x65EC, 0x0966,
+ 0x65ED, 0x0474, 0x65F0, 0x3909, 0x65F1, 0x13E2, 0x65F2, 0x390A,
+ 0x65FA, 0x0522, 0x65FB, 0x13E6, 0x6600, 0x2118, 0x6602, 0x07C9,
+ 0x6603, 0x13E5, 0x6606, 0x081B, 0x6607, 0x09A2, 0x6609, 0x211A,
+ 0x660A, 0x13E4, 0x660C, 0x09A3, 0x660E, 0x0ECC, 0x660F, 0x081A,
+ 0x6613, 0x049B, 0x6614, 0x0A72, 0x6615, 0x2119, 0x661C, 0x13EB,
+ 0x661E, 0x211C, 0x661F, 0x0A55, 0x6620, 0x04E9, 0x6624, 0x211D,
+ 0x6625, 0x095F, 0x6627, 0x0E94, 0x6628, 0x0862, 0x662C, 0x390B,
+ 0x662D, 0x09A4, 0x662E, 0x211B, 0x662F, 0x0A4B, 0x6631, 0x20AE,
+ 0x6634, 0x13EA, 0x6635, 0x13E8, 0x6636, 0x13E9, 0x663B, 0x1E00,
+ 0x663C, 0x0BA9, 0x663F, 0x1409, 0x6641, 0x13EF, 0x6642, 0x08CC,
+ 0x6643, 0x07CA, 0x6644, 0x13ED, 0x6649, 0x13EE, 0x664B, 0x09FE,
+ 0x664C, 0x390C, 0x664F, 0x13EC, 0x6652, 0x087D, 0x6657, 0x211F,
+ 0x6659, 0x2120, 0x665B, 0x390D, 0x665C, 0x390E, 0x665D, 0x13F1,
+ 0x665E, 0x13F0, 0x665F, 0x13F5, 0x6661, 0x390F, 0x6662, 0x13F6,
+ 0x6663, 0x373A, 0x6664, 0x13F2, 0x6665, 0x211E, 0x6666, 0x0580,
+ 0x6667, 0x13F3, 0x6668, 0x13F4, 0x6669, 0x0D69, 0x666B, 0x3910,
+ 0x666E, 0x0DD3, 0x666F, 0x0720, 0x6670, 0x13F7, 0x6673, 0x2122,
+ 0x6674, 0x0A56, 0x6676, 0x09A5, 0x6677, 0x3911, 0x667A, 0x0B90,
+ 0x6681, 0x06BF, 0x6683, 0x13F8, 0x6684, 0x13FC, 0x6687, 0x054B,
+ 0x6688, 0x13F9, 0x6689, 0x13FB, 0x668E, 0x13FA, 0x6691, 0x0975,
+ 0x6696, 0x0B86, 0x6697, 0x0489, 0x6698, 0x13FD, 0x6699, 0x2123,
+ 0x669D, 0x13FE, 0x66A0, 0x2124, 0x66A2, 0x0BC6, 0x66A4, 0x3912,
+ 0x66A6, 0x0FB9, 0x66AB, 0x0891, 0x66AE, 0x0E3B, 0x66B2, 0x2125,
+ 0x66B4, 0x0E6B, 0x66B8, 0x1405, 0x66B9, 0x1400, 0x66BC, 0x1403,
+ 0x66BE, 0x1402, 0x66BF, 0x2126, 0x66C1, 0x13FF, 0x66C4, 0x1404,
+ 0x66C6, 0x3455, 0x66C7, 0x0CB6, 0x66C8, 0x3913, 0x66C9, 0x1401,
+ 0x66D6, 0x1406, 0x66D9, 0x0976, 0x66DA, 0x1407, 0x66DC, 0x0F35,
+ 0x66DD, 0x0D2E, 0x66E0, 0x1408, 0x66E6, 0x140A, 0x66E9, 0x140B,
+ 0x66EC, 0x3914, 0x66F0, 0x140C, 0x66F2, 0x06C2, 0x66F3, 0x04EA,
+ 0x66F4, 0x07CB, 0x66F5, 0x140D, 0x66F7, 0x140E, 0x66F8, 0x097B,
+ 0x66F9, 0x0AE4, 0x66FA, 0x2127, 0x66FB, 0x20B1, 0x66FC, 0x10ED,
+ 0x66FD, 0x0AC0, 0x66FE, 0x0ABF, 0x66FF, 0x0B38, 0x6700, 0x0837,
+ 0x6703, 0x104B, 0x6705, 0x3915, 0x6708, 0x0744, 0x6709, 0x0F17,
+ 0x670B, 0x0E4E, 0x670D, 0x0DF0, 0x670E, 0x2128, 0x670F, 0x140F,
+ 0x6713, 0x3916, 0x6714, 0x0863, 0x6715, 0x0BDB, 0x6716, 0x1410,
+ 0x6717, 0x0FD5, 0x671B, 0x0E6C, 0x671D, 0x0BC7, 0x671E, 0x1411,
+ 0x671F, 0x0638, 0x6726, 0x1412, 0x6727, 0x1413, 0x6728, 0x0EE6,
+ 0x672A, 0x0EB0, 0x672B, 0x0EA4, 0x672C, 0x0E8A, 0x672D, 0x0873,
+ 0x672E, 0x1415, 0x6731, 0x0917, 0x6733, 0x3917, 0x6734, 0x0E7F,
+ 0x6736, 0x1417, 0x6737, 0x141A, 0x6738, 0x1419, 0x673A, 0x0635,
+ 0x673D, 0x067A, 0x673F, 0x1416, 0x6741, 0x1418, 0x6743, 0x35B7,
+ 0x6746, 0x141B, 0x6748, 0x3918, 0x6749, 0x0A3F, 0x674C, 0x3919,
+ 0x674E, 0x0F65, 0x674F, 0x048D, 0x6750, 0x0850, 0x6751, 0x0B1C,
+ 0x6753, 0x0909, 0x6756, 0x09DB, 0x6759, 0x141E, 0x675C, 0x0C48,
+ 0x675E, 0x141C, 0x675F, 0x0B0B, 0x6760, 0x141D, 0x6761, 0x09DA,
+ 0x6762, 0x0EE9, 0x6763, 0x141F, 0x6764, 0x1420, 0x6765, 0x0F52,
+ 0x6766, 0x212A, 0x676A, 0x1425, 0x676D, 0x07CC, 0x676E, 0x3571,
+ 0x676F, 0x0D0B, 0x6770, 0x1422, 0x6771, 0x0C66, 0x6772, 0x13E3,
+ 0x6773, 0x13E7, 0x6775, 0x0669, 0x6776, 0x391A, 0x6777, 0x0CFD,
+ 0x677B, 0x391B, 0x677C, 0x1424, 0x677E, 0x09A6, 0x677F, 0x0D58,
+ 0x6785, 0x142A, 0x6787, 0x0D8E, 0x6789, 0x1421, 0x678B, 0x1427,
+ 0x678C, 0x1426, 0x6790, 0x0A73, 0x6795, 0x0E9B, 0x6797, 0x0F9B,
+ 0x679A, 0x0E95, 0x679C, 0x054C, 0x679D, 0x08AC, 0x67A0, 0x0FEE,
+ 0x67A1, 0x1429, 0x67A2, 0x0A3B, 0x67A6, 0x1428, 0x67A9, 0x1423,
+ 0x67AF, 0x0783, 0x67B0, 0x391C, 0x67B2, 0x391D, 0x67B3, 0x142F,
+ 0x67B4, 0x142D, 0x67B6, 0x054D, 0x67B7, 0x142B, 0x67B8, 0x1431,
+ 0x67B9, 0x1437, 0x67BB, 0x212B, 0x67C0, 0x212D, 0x67C1, 0x0B28,
+ 0x67C4, 0x0E11, 0x67C6, 0x1439, 0x67CA, 0x0D94, 0x67CE, 0x1438,
+ 0x67CF, 0x0D26, 0x67D0, 0x0E6D, 0x67D1, 0x05F7, 0x67D3, 0x0A9B,
+ 0x67D4, 0x094A, 0x67D7, 0x391F, 0x67D8, 0x0BEF, 0x67D9, 0x3920,
+ 0x67DA, 0x0F18, 0x67DD, 0x1434, 0x67DE, 0x1433, 0x67E2, 0x1435,
+ 0x67E4, 0x1432, 0x67E7, 0x143A, 0x67E9, 0x1430, 0x67EC, 0x142E,
+ 0x67EE, 0x1436, 0x67EF, 0x142C, 0x67F0, 0x3921, 0x67F1, 0x0BAA,
+ 0x67F3, 0x0F04, 0x67F4, 0x08F2, 0x67F5, 0x0864, 0x67F9, 0x391E,
+ 0x67FB, 0x082A, 0x67FE, 0x0E9D, 0x67FF, 0x059F, 0x6801, 0x212E,
+ 0x6802, 0x0BEA, 0x6803, 0x0CA2, 0x6804, 0x04EB, 0x6805, 0x1E07,
+ 0x6813, 0x0A96, 0x6816, 0x0A58, 0x6817, 0x0700, 0x681E, 0x143C,
+ 0x6821, 0x07CD, 0x6822, 0x05DA, 0x6829, 0x143E, 0x682A, 0x05D2,
+ 0x682B, 0x1444, 0x682C, 0x3922, 0x6830, 0x3923, 0x6831, 0x3924,
+ 0x6832, 0x1441, 0x6834, 0x0A97, 0x6838, 0x05A9, 0x6839, 0x081C,
+ 0x683C, 0x05A8, 0x683D, 0x083F, 0x6840, 0x143F, 0x6841, 0x073B,
+ 0x6842, 0x0721, 0x6843, 0x0C67, 0x6844, 0x212F, 0x6846, 0x143D,
+ 0x6848, 0x048A, 0x684D, 0x1440, 0x684E, 0x1442, 0x6850, 0x06C5,
+ 0x6851, 0x0702, 0x6852, 0x212C, 0x6853, 0x05F8, 0x6854, 0x0665,
+ 0x6859, 0x1445, 0x685B, 0x3925, 0x685C, 0x0869, 0x685D, 0x0E9F,
+ 0x685F, 0x0885, 0x6863, 0x1446, 0x6867, 0x0DA2, 0x6872, 0x3926,
+ 0x6874, 0x1452, 0x6875, 0x3927, 0x6876, 0x0533, 0x6877, 0x1447,
+ 0x687A, 0x3928, 0x687E, 0x1458, 0x687F, 0x1448, 0x6881, 0x0F8A,
+ 0x6883, 0x144F, 0x6884, 0x3929, 0x6885, 0x0D15, 0x688D, 0x1457,
+ 0x688E, 0x1E9C, 0x688F, 0x144A, 0x6893, 0x0478, 0x6894, 0x144C,
+ 0x6897, 0x07CE, 0x689B, 0x144E, 0x689D, 0x144D, 0x689F, 0x1449,
+ 0x68A0, 0x1454, 0x68A2, 0x09A7, 0x68A5, 0x392A, 0x68A6, 0x11BE,
+ 0x68A7, 0x079C, 0x68A8, 0x0F66, 0x68AD, 0x144B, 0x68AF, 0x0C10,
+ 0x68B0, 0x0581, 0x68B1, 0x081D, 0x68B2, 0x392B, 0x68B3, 0x1443,
+ 0x68B5, 0x1453, 0x68B6, 0x05BF, 0x68B9, 0x1451, 0x68BA, 0x1455,
+ 0x68BC, 0x0C68, 0x68C4, 0x063A, 0x68C6, 0x1473, 0x68C8, 0x20AF,
+ 0x68C9, 0x0ED5, 0x68CA, 0x145A, 0x68CB, 0x0639, 0x68CD, 0x1461,
+ 0x68CF, 0x2130, 0x68D0, 0x392C, 0x68D2, 0x0E6E, 0x68D4, 0x1462,
+ 0x68D5, 0x1464, 0x68D6, 0x392D, 0x68D7, 0x1468, 0x68D8, 0x145C,
+ 0x68DA, 0x0B68, 0x68DF, 0x0C69, 0x68E0, 0x146C, 0x68E1, 0x145F,
+ 0x68E3, 0x1469, 0x68E7, 0x1463, 0x68E8, 0x392E, 0x68ED, 0x392F,
+ 0x68EE, 0x09FF, 0x68EF, 0x146D, 0x68F0, 0x3930, 0x68F1, 0x3931,
+ 0x68F2, 0x0A57, 0x68F9, 0x146B, 0x68FA, 0x05F9, 0x68FC, 0x3932,
+ 0x6900, 0x0FF6, 0x6901, 0x1459, 0x6904, 0x1467, 0x6905, 0x049C,
+ 0x6908, 0x145B, 0x690B, 0x0EC6, 0x690C, 0x1460, 0x690D, 0x09E8,
+ 0x690E, 0x0BE3, 0x690F, 0x1456, 0x6911, 0x3933, 0x6912, 0x1466,
+ 0x6913, 0x3934, 0x6919, 0x0A40, 0x691A, 0x1470, 0x691B, 0x05CF,
+ 0x691C, 0x0755, 0x6921, 0x1472, 0x6922, 0x145D, 0x6923, 0x1471,
+ 0x6925, 0x146A, 0x6926, 0x145E, 0x6928, 0x146E, 0x692A, 0x146F,
+ 0x6930, 0x1480, 0x6934, 0x0CA6, 0x6935, 0x3935, 0x6936, 0x1465,
+ 0x6939, 0x147C, 0x693B, 0x3936, 0x693D, 0x147E, 0x693F, 0x0BF4,
+ 0x694A, 0x0F36, 0x6953, 0x0DE8, 0x6954, 0x1479, 0x6955, 0x0B2A,
+ 0x6957, 0x3937, 0x6959, 0x147F, 0x695A, 0x0AC1, 0x695C, 0x1476,
+ 0x695D, 0x1483, 0x695E, 0x1482, 0x6960, 0x0CC7, 0x6961, 0x1481,
+ 0x6962, 0x0CC2, 0x6963, 0x3938, 0x6968, 0x2132, 0x696A, 0x1485,
+ 0x696B, 0x1478, 0x696D, 0x06C0, 0x696E, 0x147B, 0x696F, 0x0967,
+ 0x6972, 0x3939, 0x6973, 0x0D16, 0x6974, 0x147D, 0x6975, 0x06C3,
+ 0x6977, 0x1475, 0x6978, 0x1477, 0x6979, 0x1474, 0x697C, 0x0FD6,
+ 0x697D, 0x05B8, 0x697E, 0x147A, 0x697F, 0x393A, 0x6980, 0x393B,
+ 0x6981, 0x1484, 0x6982, 0x0593, 0x698A, 0x0857, 0x698E, 0x04FF,
+ 0x6991, 0x1495, 0x6994, 0x0FD7, 0x6995, 0x1498, 0x6998, 0x2134,
+ 0x699B, 0x0A00, 0x699C, 0x1497, 0x69A0, 0x1496, 0x69A6, 0x393C,
+ 0x69A7, 0x1493, 0x69AD, 0x393D, 0x69AE, 0x1487, 0x69B1, 0x14A4,
+ 0x69B2, 0x1486, 0x69B4, 0x1499, 0x69B7, 0x393E, 0x69BB, 0x1491,
+ 0x69BE, 0x148C, 0x69BF, 0x1489, 0x69C1, 0x148A, 0x69C3, 0x1492,
+ 0x69C7, 0x1D33, 0x69CA, 0x148F, 0x69CB, 0x07CF, 0x69CC, 0x0BE4,
+ 0x69CD, 0x0AE6, 0x69CE, 0x148D, 0x69D0, 0x1488, 0x69D3, 0x148B,
+ 0x69D6, 0x393F, 0x69D7, 0x3940, 0x69D8, 0x0F37, 0x69D9, 0x0E98,
+ 0x69DD, 0x1490, 0x69DE, 0x149A, 0x69E2, 0x2135, 0x69E7, 0x14A2,
+ 0x69E8, 0x149B, 0x69EA, 0x356F, 0x69EB, 0x14A8, 0x69ED, 0x14A6,
+ 0x69F2, 0x14A1, 0x69F6, 0x373F, 0x69F9, 0x14A0, 0x69FB, 0x0BEC,
+ 0x69FD, 0x0AE7, 0x69FF, 0x149E, 0x6A01, 0x3941, 0x6A02, 0x149C,
+ 0x6A05, 0x14A3, 0x6A0A, 0x14A9, 0x6A0B, 0x0D89, 0x6A0C, 0x14AF,
+ 0x6A0F, 0x3942, 0x6A12, 0x14AA, 0x6A13, 0x14AD, 0x6A14, 0x14A7,
+ 0x6A15, 0x3943, 0x6A17, 0x0BB2, 0x6A19, 0x0DAA, 0x6A1B, 0x149D,
+ 0x6A1E, 0x14A5, 0x6A1F, 0x09A8, 0x6A21, 0x0EDB, 0x6A22, 0x14B9,
+ 0x6A23, 0x14AC, 0x6A28, 0x3944, 0x6A29, 0x0756, 0x6A2A, 0x0523,
+ 0x6A2B, 0x05BD, 0x6A2E, 0x1494, 0x6A30, 0x2136, 0x6A34, 0x3945,
+ 0x6A35, 0x09A9, 0x6A36, 0x14B1, 0x6A38, 0x14B8, 0x6A39, 0x0925,
+ 0x6A3A, 0x05D0, 0x6A3D, 0x0B6C, 0x6A3E, 0x3946, 0x6A44, 0x14AE,
+ 0x6A45, 0x3947, 0x6A46, 0x2138, 0x6A47, 0x14B3, 0x6A48, 0x14B7,
+ 0x6A4B, 0x06AE, 0x6A50, 0x3948, 0x6A51, 0x3949, 0x6A54, 0x3C34,
+ 0x6A56, 0x394A, 0x6A58, 0x0666, 0x6A59, 0x14B5, 0x6A5B, 0x394B,
+ 0x6A5F, 0x063B, 0x6A61, 0x0CA3, 0x6A62, 0x14B4, 0x6A66, 0x14B6,
+ 0x6A6B, 0x2137, 0x6A72, 0x14B0, 0x6A73, 0x2139, 0x6A78, 0x14B2,
+ 0x6A7E, 0x213A, 0x6A7F, 0x05BE, 0x6A80, 0x0B87, 0x6A83, 0x394C,
+ 0x6A84, 0x14BD, 0x6A89, 0x394D, 0x6A8D, 0x14BB, 0x6A8E, 0x079D,
+ 0x6A90, 0x14BA, 0x6A91, 0x394E, 0x6A97, 0x14C0, 0x6A9C, 0x143B,
+ 0x6A9D, 0x394F, 0x6A9E, 0x3950, 0x6A9F, 0x3951, 0x6AA0, 0x14BC,
+ 0x6AA2, 0x14BE, 0x6AA3, 0x14BF, 0x6AAA, 0x14CB, 0x6AAC, 0x14C7,
+ 0x6AAE, 0x1450, 0x6AB3, 0x14C6, 0x6AB8, 0x14C5, 0x6ABB, 0x14C2,
+ 0x6AC1, 0x14AB, 0x6AC2, 0x14C4, 0x6AC3, 0x14C3, 0x6AD1, 0x14C9,
+ 0x6AD3, 0x0FCC, 0x6ADA, 0x14CC, 0x6ADB, 0x06F3, 0x6ADC, 0x3952,
+ 0x6ADE, 0x14C8, 0x6ADF, 0x14CA, 0x6AE2, 0x213B, 0x6AE4, 0x213C,
+ 0x6AE7, 0x3953, 0x6AE8, 0x0D3B, 0x6AEA, 0x14CD, 0x6AEC, 0x3954,
+ 0x6AFA, 0x14D1, 0x6AFB, 0x14CE, 0x6B04, 0x0F5D, 0x6B05, 0x14CF,
+ 0x6B0A, 0x149F, 0x6B12, 0x14D2, 0x6B16, 0x14D3, 0x6B1D, 0x04D7,
+ 0x6B1E, 0x3955, 0x6B1F, 0x14D5, 0x6B20, 0x073D, 0x6B21, 0x08CD,
+ 0x6B23, 0x06CD, 0x6B24, 0x3956, 0x6B27, 0x0524, 0x6B32, 0x0F49,
+ 0x6B35, 0x3957, 0x6B37, 0x14D7, 0x6B38, 0x14D6, 0x6B39, 0x14D9,
+ 0x6B3A, 0x0657, 0x6B3D, 0x06CE, 0x6B3E, 0x05FA, 0x6B43, 0x14DC,
+ 0x6B46, 0x3958, 0x6B47, 0x14DB, 0x6B49, 0x14DD, 0x6B4C, 0x054E,
+ 0x6B4E, 0x0B75, 0x6B50, 0x14DE, 0x6B53, 0x05FB, 0x6B54, 0x14E0,
+ 0x6B56, 0x3959, 0x6B59, 0x14DF, 0x6B5B, 0x14E1, 0x6B5F, 0x14E2,
+ 0x6B60, 0x395A, 0x6B61, 0x14E3, 0x6B62, 0x08AD, 0x6B63, 0x0A59,
+ 0x6B64, 0x0811, 0x6B65, 0x344A, 0x6B66, 0x0DE2, 0x6B69, 0x0E32,
+ 0x6B6A, 0x0FEA, 0x6B6F, 0x08C3, 0x6B72, 0x35D9, 0x6B73, 0x0840,
+ 0x6B74, 0x0FBA, 0x6B77, 0x3456, 0x6B78, 0x14E4, 0x6B79, 0x14E5,
+ 0x6B7B, 0x08AE, 0x6B7F, 0x14E6, 0x6B80, 0x14E7, 0x6B82, 0x395B,
+ 0x6B83, 0x14E9, 0x6B84, 0x14E8, 0x6B86, 0x0E86, 0x6B89, 0x0968,
+ 0x6B8A, 0x0918, 0x6B8B, 0x0892, 0x6B8D, 0x14EA, 0x6B95, 0x14EC,
+ 0x6B96, 0x09E9, 0x6B98, 0x14EB, 0x6B9E, 0x14ED, 0x6BA4, 0x14EE,
+ 0x6BAA, 0x14EF, 0x6BAB, 0x14F0, 0x6BAF, 0x14F1, 0x6BB1, 0x14F3,
+ 0x6BB2, 0x14F2, 0x6BB3, 0x14F4, 0x6BB4, 0x0525, 0x6BB5, 0x0B88,
+ 0x6BB7, 0x14F5, 0x6BBA, 0x0874, 0x6BBB, 0x05AA, 0x6BBC, 0x14F6,
+ 0x6BBE, 0x395C, 0x6BBF, 0x0C3C, 0x6BC0, 0x119D, 0x6BC5, 0x063D,
+ 0x6BC6, 0x14F7, 0x6BCB, 0x14F8, 0x6BCC, 0x3744, 0x6BCD, 0x0E3C,
+ 0x6BCE, 0x0E96, 0x6BCF, 0x344C, 0x6BD2, 0x0C9F, 0x6BD3, 0x14F9,
+ 0x6BD4, 0x0D7A, 0x6BD6, 0x213D, 0x6BD8, 0x0D8F, 0x6BDB, 0x0EDF,
+ 0x6BDF, 0x14FA, 0x6BE1, 0x395D, 0x6BEB, 0x14FC, 0x6BEC, 0x14FB,
+ 0x6BEF, 0x14FE, 0x6BF1, 0x395E, 0x6BF3, 0x14FD, 0x6C08, 0x1500,
+ 0x6C0F, 0x08AF, 0x6C10, 0x395F, 0x6C11, 0x0EBD, 0x6C13, 0x1501,
+ 0x6C14, 0x1502, 0x6C17, 0x063E, 0x6C1B, 0x1503, 0x6C23, 0x1505,
+ 0x6C24, 0x1504, 0x6C33, 0x3960, 0x6C34, 0x0A2B, 0x6C35, 0x3961,
+ 0x6C37, 0x0DAB, 0x6C38, 0x04EC, 0x6C3A, 0x3962, 0x6C3E, 0x0D59,
+ 0x6C3F, 0x213E, 0x6C40, 0x0C11, 0x6C41, 0x094B, 0x6C42, 0x067B,
+ 0x6C4E, 0x0D5A, 0x6C50, 0x08DA, 0x6C55, 0x1507, 0x6C57, 0x05FC,
+ 0x6C59, 0x3963, 0x6C5A, 0x051A, 0x6C5C, 0x213F, 0x6C5D, 0x0CCA,
+ 0x6C5E, 0x1506, 0x6C5F, 0x07D0, 0x6C60, 0x0B91, 0x6C62, 0x1508,
+ 0x6C68, 0x1510, 0x6C6A, 0x1509, 0x6C6F, 0x2141, 0x6C70, 0x0B21,
+ 0x6C72, 0x067C, 0x6C73, 0x1511, 0x6C76, 0x3964, 0x6C7A, 0x073E,
+ 0x6C7B, 0x3965, 0x6C7D, 0x063F, 0x6C7E, 0x150F, 0x6C81, 0x150D,
+ 0x6C82, 0x150A, 0x6C83, 0x0F4A, 0x6C85, 0x3966, 0x6C86, 0x2140,
+ 0x6C88, 0x0BDC, 0x6C8C, 0x0CB1, 0x6C8D, 0x150B, 0x6C90, 0x1513,
+ 0x6C92, 0x1512, 0x6C93, 0x06F9, 0x6C95, 0x3967, 0x6C96, 0x052D,
+ 0x6C99, 0x082B, 0x6C9A, 0x150C, 0x6C9B, 0x150E, 0x6C9C, 0x3968,
+ 0x6CA1, 0x0E85, 0x6CA2, 0x0B54, 0x6CAA, 0x3749, 0x6CAB, 0x0EA5,
+ 0x6CAE, 0x151B, 0x6CB1, 0x151C, 0x6CB3, 0x054F, 0x6CB8, 0x0DF8,
+ 0x6CB9, 0x0F09, 0x6CBA, 0x151E, 0x6CBB, 0x08CF, 0x6CBC, 0x09AA,
+ 0x6CBD, 0x1517, 0x6CBE, 0x151D, 0x6CBF, 0x050A, 0x6CC1, 0x06AF,
+ 0x6CC4, 0x1514, 0x6CC5, 0x1519, 0x6CC9, 0x0A98, 0x6CCA, 0x0D27,
+ 0x6CCC, 0x0D7B, 0x6CD0, 0x3969, 0x6CD3, 0x1516, 0x6CD4, 0x396A,
+ 0x6CD5, 0x0E4F, 0x6CD6, 0x396B, 0x6CD7, 0x1518, 0x6CD9, 0x1521,
+ 0x6CDA, 0x2142, 0x6CDB, 0x151F, 0x6CDD, 0x151A, 0x6CE0, 0x396C,
+ 0x6CE1, 0x0E50, 0x6CE2, 0x0CFE, 0x6CE3, 0x067D, 0x6CE5, 0x0C1F,
+ 0x6CE8, 0x0BAB, 0x6CEA, 0x1522, 0x6CEB, 0x396D, 0x6CEC, 0x396E,
+ 0x6CEE, 0x396F, 0x6CEF, 0x1520, 0x6CF0, 0x0B39, 0x6CF1, 0x1515,
+ 0x6CF3, 0x04ED, 0x6D01, 0x3C35, 0x6D04, 0x2143, 0x6D0A, 0x3970,
+ 0x6D0B, 0x0F38, 0x6D0C, 0x152D, 0x6D0E, 0x3971, 0x6D11, 0x3972,
+ 0x6D12, 0x152C, 0x6D17, 0x0A9A, 0x6D19, 0x1529, 0x6D1B, 0x0F56,
+ 0x6D1E, 0x0C8E, 0x6D1F, 0x1523, 0x6D25, 0x0BE1, 0x6D29, 0x04EE,
+ 0x6D2A, 0x07D1, 0x6D2B, 0x1526, 0x6D2E, 0x3973, 0x6D32, 0x0931,
+ 0x6D33, 0x152B, 0x6D35, 0x152A, 0x6D36, 0x1525, 0x6D38, 0x1528,
+ 0x6D3B, 0x05C6, 0x6D3D, 0x1527, 0x6D3E, 0x0CFF, 0x6D41, 0x0F76,
+ 0x6D44, 0x09DC, 0x6D45, 0x0A99, 0x6D57, 0x3974, 0x6D59, 0x1533,
+ 0x6D5A, 0x1531, 0x6D5C, 0x0DBF, 0x6D5E, 0x3975, 0x6D63, 0x152E,
+ 0x6D64, 0x1530, 0x6D65, 0x3976, 0x6D66, 0x04DC, 0x6D69, 0x07D2,
+ 0x6D6A, 0x0FD8, 0x6D6C, 0x059B, 0x6D6E, 0x0DD4, 0x6D6F, 0x2145,
+ 0x6D74, 0x0F4B, 0x6D77, 0x0582, 0x6D78, 0x0A01, 0x6D79, 0x1532,
+ 0x6D82, 0x3977, 0x6D85, 0x1537, 0x6D87, 0x2144, 0x6D88, 0x09AB,
+ 0x6D89, 0x342A, 0x6D8C, 0x0F1A, 0x6D8E, 0x1534, 0x6D93, 0x152F,
+ 0x6D95, 0x1535, 0x6D96, 0x2146, 0x6D99, 0x0FA6, 0x6D9B, 0x0C6D,
+ 0x6D9C, 0x0C9A, 0x6DAC, 0x2147, 0x6DAF, 0x0594, 0x6DB2, 0x04F7,
+ 0x6DB5, 0x153B, 0x6DB8, 0x153E, 0x6DBC, 0x0F8B, 0x6DBF, 0x3978,
+ 0x6DC0, 0x0F4E, 0x6DC4, 0x3979, 0x6DC5, 0x1545, 0x6DC6, 0x153F,
+ 0x6DC7, 0x153C, 0x6DCA, 0x397A, 0x6DCB, 0x0F9C, 0x6DCC, 0x1542,
+ 0x6DCF, 0x2148, 0x6DD0, 0x3C36, 0x6DD1, 0x0954, 0x6DD2, 0x1544,
+ 0x6DD5, 0x1549, 0x6DD6, 0x397B, 0x6DD8, 0x0C6B, 0x6DD9, 0x1547,
+ 0x6DDA, 0x3453, 0x6DDE, 0x1541, 0x6DE1, 0x0B76, 0x6DE4, 0x1548,
+ 0x6DE6, 0x153D, 0x6DE8, 0x1543, 0x6DE9, 0x397C, 0x6DEA, 0x154A,
+ 0x6DEB, 0x04C0, 0x6DEC, 0x1540, 0x6DEE, 0x154B, 0x6DF1, 0x0A02,
+ 0x6DF2, 0x214A, 0x6DF3, 0x0969, 0x6DF5, 0x0DF5, 0x6DF7, 0x081E,
+ 0x6DF8, 0x2149, 0x6DF9, 0x1538, 0x6DFA, 0x1546, 0x6DFB, 0x0C34,
+ 0x6DFC, 0x214B, 0x6E05, 0x0A5A, 0x6E07, 0x05C7, 0x6E08, 0x0841,
+ 0x6E09, 0x09AC, 0x6E0A, 0x153A, 0x6E0B, 0x094C, 0x6E13, 0x0722,
+ 0x6E15, 0x1539, 0x6E17, 0x3746, 0x6E19, 0x154F, 0x6E1A, 0x0977,
+ 0x6E1B, 0x076E, 0x6E1D, 0x155E, 0x6E1F, 0x1558, 0x6E20, 0x068E,
+ 0x6E21, 0x0C49, 0x6E22, 0x397D, 0x6E23, 0x1553, 0x6E24, 0x155C,
+ 0x6E25, 0x0473, 0x6E26, 0x04D4, 0x6E27, 0x214E, 0x6E29, 0x0539,
+ 0x6E2B, 0x1555, 0x6E2C, 0x0B0C, 0x6E2D, 0x154C, 0x6E2E, 0x154E,
+ 0x6E2F, 0x07D3, 0x6E34, 0x3412, 0x6E38, 0x155F, 0x6E39, 0x214C,
+ 0x6E3A, 0x155A, 0x6E3C, 0x214F, 0x6E3E, 0x1552, 0x6E42, 0x3C37,
+ 0x6E43, 0x1559, 0x6E4A, 0x0EB7, 0x6E4D, 0x1557, 0x6E4E, 0x155B,
+ 0x6E51, 0x397E, 0x6E56, 0x0784, 0x6E58, 0x09AD, 0x6E5B, 0x0B77,
+ 0x6E5C, 0x214D, 0x6E5F, 0x1551, 0x6E67, 0x0F19, 0x6E6B, 0x1554,
+ 0x6E6E, 0x154D, 0x6E6F, 0x0C6C, 0x6E72, 0x1550, 0x6E76, 0x1556,
+ 0x6E7E, 0x0FF7, 0x6E7F, 0x08EA, 0x6E80, 0x0EAC, 0x6E82, 0x1560,
+ 0x6E8C, 0x0D42, 0x6E8F, 0x156C, 0x6E90, 0x076F, 0x6E96, 0x096A,
+ 0x6E98, 0x1562, 0x6E9C, 0x0F77, 0x6E9D, 0x07D4, 0x6E9F, 0x156F,
+ 0x6EA2, 0x04B2, 0x6EA5, 0x156D, 0x6EAA, 0x1561, 0x6EAB, 0x340C,
+ 0x6EAF, 0x1567, 0x6EB2, 0x1569, 0x6EB6, 0x0F39, 0x6EB7, 0x1564,
+ 0x6EBA, 0x0C28, 0x6EBD, 0x1566, 0x6EBF, 0x2150, 0x6EC2, 0x156E,
+ 0x6EC4, 0x1568, 0x6EC5, 0x0ED3, 0x6EC7, 0x397F, 0x6EC9, 0x1563,
+ 0x6ECA, 0x3980, 0x6ECB, 0x08CE, 0x6ECC, 0x157B, 0x6ECE, 0x3981,
+ 0x6ED1, 0x05C8, 0x6ED3, 0x1565, 0x6ED4, 0x156A, 0x6ED5, 0x156B,
+ 0x6ED9, 0x3C38, 0x6EDD, 0x0B4C, 0x6EDE, 0x0B3A, 0x6EE6, 0x3C24,
+ 0x6EEC, 0x1573, 0x6EEF, 0x1579, 0x6EF2, 0x1577, 0x6EF4, 0x0C23,
+ 0x6EF7, 0x157E, 0x6EF8, 0x1574, 0x6EFD, 0x3982, 0x6EFE, 0x1575,
+ 0x6EFF, 0x155D, 0x6F01, 0x0693, 0x6F02, 0x0DAC, 0x6F06, 0x08EB,
+ 0x6F09, 0x0809, 0x6F0F, 0x0FD9, 0x6F11, 0x1571, 0x6F13, 0x157D,
+ 0x6F14, 0x050B, 0x6F15, 0x0AE8, 0x6F1A, 0x3983, 0x6F20, 0x0D2F,
+ 0x6F22, 0x05FD, 0x6F23, 0x0FC2, 0x6F2A, 0x3984, 0x6F2B, 0x0EAD,
+ 0x6F2C, 0x0BEE, 0x6F2F, 0x3985, 0x6F31, 0x1578, 0x6F32, 0x157A,
+ 0x6F33, 0x3986, 0x6F38, 0x0AB4, 0x6F3E, 0x157C, 0x6F3F, 0x1576,
+ 0x6F41, 0x1570, 0x6F45, 0x05FF, 0x6F51, 0x1E60, 0x6F54, 0x073F,
+ 0x6F58, 0x158A, 0x6F5A, 0x3987, 0x6F5B, 0x1585, 0x6F5C, 0x0A9C,
+ 0x6F5E, 0x3988, 0x6F5F, 0x05C1, 0x6F62, 0x3989, 0x6F64, 0x096B,
+ 0x6F66, 0x158E, 0x6F6D, 0x1587, 0x6F6E, 0x0BC8, 0x6F6F, 0x1584,
+ 0x6F70, 0x0BF5, 0x6F74, 0x15A7, 0x6F78, 0x1581, 0x6F7A, 0x1580,
+ 0x6F7C, 0x1589, 0x6F7D, 0x398A, 0x6F80, 0x1583, 0x6F81, 0x1582,
+ 0x6F82, 0x1588, 0x6F84, 0x0A45, 0x6F86, 0x157F, 0x6F88, 0x2151,
+ 0x6F8B, 0x398B, 0x6F8D, 0x398C, 0x6F8E, 0x158B, 0x6F91, 0x158C,
+ 0x6F92, 0x398D, 0x6F94, 0x398E, 0x6F97, 0x05FE, 0x6F98, 0x363C,
+ 0x6F9A, 0x398F, 0x6FA1, 0x1591, 0x6FA3, 0x1590, 0x6FA4, 0x1592,
+ 0x6FA7, 0x3990, 0x6FA8, 0x3991, 0x6FAA, 0x1595, 0x6FB1, 0x0C3D,
+ 0x6FB3, 0x158F, 0x6FB5, 0x2152, 0x6FB6, 0x3992, 0x6FB9, 0x1593,
+ 0x6FC0, 0x0739, 0x6FC1, 0x0B59, 0x6FC2, 0x158D, 0x6FC3, 0x0CF1,
+ 0x6FC6, 0x1594, 0x6FD4, 0x1599, 0x6FD5, 0x1597, 0x6FD8, 0x159A,
+ 0x6FDA, 0x3993, 0x6FDB, 0x159D, 0x6FDE, 0x3994, 0x6FDF, 0x1596,
+ 0x6FE0, 0x07FC, 0x6FE1, 0x0CDE, 0x6FE4, 0x1536, 0x6FEB, 0x0F5E,
+ 0x6FEC, 0x1598, 0x6FEE, 0x159C, 0x6FEF, 0x0B55, 0x6FF1, 0x159B,
+ 0x6FF3, 0x1586, 0x6FF5, 0x2153, 0x6FF6, 0x1BA4, 0x6FF9, 0x3995,
+ 0x6FFA, 0x15A0, 0x6FFE, 0x15A4, 0x7001, 0x15A2, 0x7005, 0x2154,
+ 0x7006, 0x1E50, 0x7007, 0x2155, 0x7009, 0x159E, 0x700B, 0x159F,
+ 0x700F, 0x15A3, 0x7011, 0x15A1, 0x7015, 0x0DC0, 0x7018, 0x15A9,
+ 0x701A, 0x15A6, 0x701B, 0x15A5, 0x701D, 0x15A8, 0x701E, 0x0CAC,
+ 0x701F, 0x15AA, 0x7026, 0x0BB3, 0x7027, 0x0B4D, 0x7028, 0x2156,
+ 0x702C, 0x0A49, 0x7030, 0x15AB, 0x7032, 0x15AD, 0x7039, 0x3996,
+ 0x703C, 0x3997, 0x703E, 0x15AC, 0x704A, 0x3998, 0x704C, 0x1572,
+ 0x7051, 0x15AE, 0x7054, 0x3999, 0x7058, 0x0CBF, 0x705D, 0x399A,
+ 0x705E, 0x399B, 0x7063, 0x15AF, 0x7064, 0x399C, 0x706B, 0x0550,
+ 0x706C, 0x399D, 0x706F, 0x0C6E, 0x7070, 0x0583, 0x7078, 0x067E,
+ 0x707C, 0x090A, 0x707D, 0x0842, 0x707E, 0x399E, 0x7081, 0x399F,
+ 0x7085, 0x2157, 0x7089, 0x0FCD, 0x708A, 0x0A2C, 0x708E, 0x050C,
+ 0x7092, 0x15B1, 0x7095, 0x39A0, 0x7099, 0x15B0, 0x70AB, 0x2158,
+ 0x70AC, 0x15B4, 0x70AD, 0x0B78, 0x70AE, 0x15B7, 0x70AF, 0x15B2,
+ 0x70B3, 0x15B6, 0x70B7, 0x39A1, 0x70B8, 0x15B5, 0x70B9, 0x0C3A,
+ 0x70BA, 0x049D, 0x70BB, 0x20AD, 0x70C8, 0x0FBD, 0x70CB, 0x15B9,
+ 0x70CF, 0x04CA, 0x70D3, 0x39A2, 0x70D4, 0x39A3, 0x70D8, 0x39A4,
+ 0x70D9, 0x15BB, 0x70DC, 0x39A5, 0x70DD, 0x15BA, 0x70DF, 0x15B8,
+ 0x70F1, 0x15B3, 0x70F9, 0x0E51, 0x70FD, 0x15BD, 0x7104, 0x215A,
+ 0x7107, 0x39A6, 0x7109, 0x15BC, 0x710F, 0x2159, 0x7114, 0x050D,
+ 0x7119, 0x15BF, 0x711A, 0x0E02, 0x711C, 0x15BE, 0x7120, 0x39A7,
+ 0x7121, 0x0EC1, 0x7126, 0x09AF, 0x7130, 0x1DDC, 0x7131, 0x39A8,
+ 0x7136, 0x0AB5, 0x713C, 0x09AE, 0x7146, 0x215C, 0x7147, 0x215D,
+ 0x7149, 0x0FC3, 0x714A, 0x39A9, 0x714C, 0x15C5, 0x714E, 0x0A9D,
+ 0x7152, 0x39AA, 0x7155, 0x15C1, 0x7156, 0x15C6, 0x7159, 0x050E,
+ 0x715C, 0x215B, 0x7160, 0x39AB, 0x7162, 0x15C4, 0x7164, 0x0D17,
+ 0x7165, 0x15C0, 0x7166, 0x15C3, 0x7167, 0x09B0, 0x7169, 0x0D65,
+ 0x716C, 0x15C7, 0x716E, 0x08FD, 0x7179, 0x39AC, 0x717D, 0x0A9E,
+ 0x7184, 0x15CA, 0x7188, 0x15C2, 0x718A, 0x06FD, 0x718F, 0x15C8,
+ 0x7192, 0x39AD, 0x7194, 0x0F3A, 0x7195, 0x15CB, 0x7199, 0x205D,
+ 0x719F, 0x0959, 0x71A8, 0x15CC, 0x71AC, 0x15CD, 0x71B1, 0x0CE4,
+ 0x71B3, 0x39AE, 0x71B9, 0x15CF, 0x71BE, 0x15D0, 0x71C1, 0x215F,
+ 0x71C3, 0x0CE9, 0x71C8, 0x0C6F, 0x71C9, 0x15D2, 0x71CB, 0x39AF,
+ 0x71CE, 0x15D4, 0x71D0, 0x0F9D, 0x71D2, 0x15D1, 0x71D3, 0x39B0,
+ 0x71D4, 0x15D3, 0x71D5, 0x050F, 0x71D6, 0x39B1, 0x71D7, 0x15CE,
+ 0x71DF, 0x114E, 0x71E0, 0x15D5, 0x71E5, 0x0AE9, 0x71E6, 0x0886,
+ 0x71E7, 0x15D7, 0x71EC, 0x15D6, 0x71ED, 0x09EA, 0x71EE, 0x10EE,
+ 0x71F5, 0x15D8, 0x71F9, 0x15DA, 0x71FB, 0x15C9, 0x71FC, 0x15D9,
+ 0x71FE, 0x2160, 0x71FF, 0x15DB, 0x7200, 0x39B2, 0x7206, 0x0D30,
+ 0x720D, 0x15DC, 0x7210, 0x15DD, 0x721B, 0x15DE, 0x721D, 0x39B3,
+ 0x7228, 0x15DF, 0x722A, 0x0BFA, 0x722B, 0x39B4, 0x722C, 0x15E1,
+ 0x722D, 0x15E0, 0x7230, 0x15E2, 0x7232, 0x15E3, 0x7235, 0x090B,
+ 0x7236, 0x0DD5, 0x7238, 0x39B5, 0x723A, 0x0EF8, 0x723B, 0x15E4,
+ 0x723C, 0x15E5, 0x723D, 0x0AD8, 0x723E, 0x08D0, 0x723F, 0x15E6,
+ 0x7240, 0x15E7, 0x7241, 0x39B6, 0x7246, 0x15E8, 0x7247, 0x0E22,
+ 0x7248, 0x0D5B, 0x724B, 0x15E9, 0x724C, 0x0D0D, 0x7252, 0x0BC9,
+ 0x7253, 0x39B7, 0x7255, 0x39B8, 0x7256, 0x39B9, 0x7258, 0x15EA,
+ 0x7259, 0x0567, 0x725B, 0x0687, 0x725C, 0x39BA, 0x725D, 0x0ED2,
+ 0x725F, 0x0EC2, 0x7261, 0x0534, 0x7262, 0x0FDA, 0x7267, 0x0E80,
+ 0x7269, 0x0DFA, 0x7272, 0x0A5B, 0x7274, 0x15EB, 0x7279, 0x0C9B,
+ 0x727D, 0x0757, 0x727E, 0x15EC, 0x7280, 0x0844, 0x7281, 0x15EE,
+ 0x7282, 0x15ED, 0x7287, 0x15EF, 0x728D, 0x39BB, 0x7292, 0x15F0,
+ 0x7296, 0x15F1, 0x72A0, 0x0658, 0x72A2, 0x15F2, 0x72A7, 0x15F3,
+ 0x72AC, 0x0758, 0x72AD, 0x39BC, 0x72AF, 0x0D5C, 0x72B1, 0x2161,
+ 0x72B2, 0x15F5, 0x72B4, 0x39BD, 0x72B6, 0x09DD, 0x72B9, 0x15F4,
+ 0x72BE, 0x2162, 0x72C0, 0x342B, 0x72C2, 0x06B0, 0x72C3, 0x15F6,
+ 0x72C4, 0x15F8, 0x72C6, 0x15F7, 0x72C7, 0x39BE, 0x72CE, 0x15F9,
+ 0x72D0, 0x0785, 0x72D2, 0x15FA, 0x72D7, 0x06E1, 0x72D9, 0x0AC2,
+ 0x72DB, 0x080F, 0x72E0, 0x15FC, 0x72E1, 0x15FD, 0x72E2, 0x15FB,
+ 0x72E9, 0x0919, 0x72EC, 0x0CA0, 0x72ED, 0x06B1, 0x72F7, 0x15FF,
+ 0x72F8, 0x0B6A, 0x72F9, 0x15FE, 0x72FB, 0x39BF, 0x72FC, 0x0FDB,
+ 0x72FD, 0x0D18, 0x7304, 0x39C0, 0x7305, 0x39C1, 0x730A, 0x1602,
+ 0x7316, 0x1604, 0x7317, 0x1601, 0x731B, 0x0EE0, 0x731C, 0x1603,
+ 0x731D, 0x1605, 0x731F, 0x0F8C, 0x7324, 0x2163, 0x7325, 0x1609,
+ 0x7328, 0x39C2, 0x7329, 0x1608, 0x732A, 0x0BB4, 0x732B, 0x0CE3,
+ 0x732E, 0x0759, 0x732F, 0x1607, 0x7331, 0x39C3, 0x7334, 0x1606,
+ 0x7336, 0x0F1B, 0x7337, 0x0F1C, 0x733E, 0x160A, 0x733F, 0x0510,
+ 0x7343, 0x39C4, 0x7344, 0x0808, 0x7345, 0x08B0, 0x734E, 0x160B,
+ 0x734F, 0x160C, 0x7357, 0x160E, 0x7363, 0x094D, 0x7368, 0x1610,
+ 0x736A, 0x160F, 0x736C, 0x39C5, 0x7370, 0x1611, 0x7372, 0x05AB,
+ 0x7375, 0x1613, 0x7377, 0x2165, 0x7378, 0x1612, 0x737A, 0x1615,
+ 0x737B, 0x1614, 0x737C, 0x39C6, 0x7383, 0x39C7, 0x7384, 0x0770,
+ 0x7385, 0x39C8, 0x7386, 0x39C9, 0x7387, 0x0F70, 0x7389, 0x06C4,
+ 0x738B, 0x0526, 0x7395, 0x39CA, 0x7396, 0x06E2, 0x739E, 0x39CB,
+ 0x739F, 0x39CC, 0x73A0, 0x39CD, 0x73A6, 0x39CE, 0x73A8, 0x3C3F,
+ 0x73A9, 0x061D, 0x73AB, 0x39CF, 0x73B2, 0x0FB0, 0x73B3, 0x1617,
+ 0x73B5, 0x39D0, 0x73B7, 0x39D1, 0x73BA, 0x35EA, 0x73BB, 0x1619,
+ 0x73BC, 0x39D2, 0x73BD, 0x2166, 0x73C0, 0x161A, 0x73C2, 0x0551,
+ 0x73C8, 0x1616, 0x73C9, 0x2167, 0x73CA, 0x0887, 0x73CD, 0x0BDD,
+ 0x73CE, 0x1618, 0x73CF, 0x39D3, 0x73D2, 0x216A, 0x73D6, 0x2168,
+ 0x73D9, 0x39D4, 0x73DE, 0x161D, 0x73E0, 0x091A, 0x73E3, 0x2169,
+ 0x73E4, 0x3C39, 0x73E5, 0x161B, 0x73E9, 0x39D5, 0x73EA, 0x0714,
+ 0x73ED, 0x0D5D, 0x73EE, 0x161C, 0x73F1, 0x1637, 0x73F4, 0x39D6,
+ 0x73F5, 0x216C, 0x73F8, 0x1622, 0x73FD, 0x39D7, 0x73FE, 0x0771,
+ 0x7403, 0x067F, 0x7404, 0x39D8, 0x7405, 0x161F, 0x7406, 0x0F67,
+ 0x7407, 0x216B, 0x7409, 0x0F78, 0x740A, 0x39D9, 0x741A, 0x39DA,
+ 0x741B, 0x39DB, 0x7421, 0x3C3A, 0x7422, 0x0B56, 0x7424, 0x39DC,
+ 0x7425, 0x1621, 0x7426, 0x216D, 0x7428, 0x39DD, 0x7429, 0x216F,
+ 0x742A, 0x216E, 0x742C, 0x39DE, 0x742E, 0x2170, 0x742F, 0x39DF,
+ 0x7430, 0x39E0, 0x7431, 0x39E1, 0x7432, 0x1623, 0x7433, 0x0F9E,
+ 0x7434, 0x06CF, 0x7435, 0x0D90, 0x7436, 0x0D00, 0x7439, 0x39E2,
+ 0x743A, 0x1624, 0x743F, 0x1626, 0x7441, 0x1629, 0x7444, 0x39E3,
+ 0x7447, 0x39E4, 0x744B, 0x39E5, 0x744D, 0x39E6, 0x7451, 0x39E7,
+ 0x7455, 0x1625, 0x7457, 0x39E8, 0x7459, 0x1628, 0x745A, 0x079E,
+ 0x745B, 0x04EF, 0x745C, 0x162A, 0x745E, 0x0A36, 0x745F, 0x1627,
+ 0x7460, 0x0FA4, 0x7462, 0x2171, 0x7463, 0x162D, 0x7464, 0x1D35,
+ 0x7466, 0x39E9, 0x7469, 0x162B, 0x746A, 0x162E, 0x746B, 0x39EA,
+ 0x746F, 0x1620, 0x7470, 0x162C, 0x7471, 0x39EB, 0x7473, 0x082C,
+ 0x7476, 0x162F, 0x747E, 0x1630, 0x7480, 0x39EC, 0x7483, 0x0F68,
+ 0x7485, 0x39ED, 0x7486, 0x39EE, 0x7487, 0x39EF, 0x7489, 0x2172,
+ 0x748B, 0x1631, 0x7490, 0x39F0, 0x7498, 0x39F1, 0x749C, 0x39F2,
+ 0x749E, 0x1632, 0x749F, 0x2173, 0x74A0, 0x39F3, 0x74A2, 0x161E,
+ 0x74A3, 0x39F4, 0x74A7, 0x1633, 0x74A8, 0x39F5, 0x74AB, 0x39F6,
+ 0x74B0, 0x0600, 0x74B5, 0x39F7, 0x74BD, 0x08D1, 0x74BF, 0x39F8,
+ 0x74C8, 0x39F9, 0x74CA, 0x1634, 0x74CF, 0x1635, 0x74D4, 0x1636,
+ 0x74DA, 0x39FA, 0x74DC, 0x04DD, 0x74DE, 0x39FB, 0x74E0, 0x1638,
+ 0x74E2, 0x0DAD, 0x74E3, 0x1639, 0x74E6, 0x05E0, 0x74E7, 0x163A,
+ 0x74E9, 0x163B, 0x74EE, 0x163C, 0x74EF, 0x3750, 0x74F0, 0x163E,
+ 0x74F1, 0x163F, 0x74F2, 0x163D, 0x74F6, 0x0DC5, 0x74F7, 0x1641,
+ 0x74F8, 0x1640, 0x7501, 0x2174, 0x7503, 0x1643, 0x7504, 0x1642,
+ 0x7505, 0x1644, 0x750C, 0x1645, 0x750D, 0x1647, 0x750E, 0x1646,
+ 0x7511, 0x080B, 0x7513, 0x1649, 0x7515, 0x1648, 0x7518, 0x0601,
+ 0x751A, 0x0A19, 0x751C, 0x0C36, 0x751E, 0x164A, 0x751F, 0x0A5C,
+ 0x7522, 0x35DE, 0x7523, 0x0888, 0x7525, 0x051B, 0x7526, 0x164B,
+ 0x7528, 0x0F3B, 0x752B, 0x0E33, 0x752C, 0x164C, 0x752F, 0x20F2,
+ 0x7530, 0x0C3E, 0x7531, 0x0F1D, 0x7532, 0x07D5, 0x7533, 0x0A03,
+ 0x7537, 0x0B89, 0x7538, 0x10C9, 0x753A, 0x0BCA, 0x753B, 0x0568,
+ 0x753C, 0x164D, 0x7544, 0x164E, 0x7546, 0x1653, 0x7549, 0x1651,
+ 0x754A, 0x1650, 0x754B, 0x13C7, 0x754C, 0x0584, 0x754D, 0x164F,
+ 0x754E, 0x39FC, 0x754F, 0x049E, 0x7551, 0x0D3E, 0x7554, 0x0D5E,
+ 0x7559, 0x0F79, 0x755A, 0x1654, 0x755B, 0x1652, 0x755C, 0x0B9A,
+ 0x755D, 0x0A4A, 0x7560, 0x0D3F, 0x7562, 0x0D9F, 0x7564, 0x1656,
+ 0x7565, 0x0F74, 0x7566, 0x0723, 0x7567, 0x1657, 0x7569, 0x1655,
+ 0x756A, 0x0D6A, 0x756B, 0x1658, 0x756C, 0x3C3B, 0x756D, 0x1659,
+ 0x756F, 0x2175, 0x7570, 0x049F, 0x7573, 0x09DE, 0x7574, 0x165E,
+ 0x7575, 0x3751, 0x7576, 0x165B, 0x7577, 0x0CC5, 0x7578, 0x165A,
+ 0x7579, 0x39FD, 0x757F, 0x0640, 0x7581, 0x39FE, 0x7582, 0x1661,
+ 0x7586, 0x165C, 0x7587, 0x165D, 0x7589, 0x1660, 0x758A, 0x165F,
+ 0x758B, 0x0D97, 0x758E, 0x0AC4, 0x758F, 0x0AC3, 0x7590, 0x39FF,
+ 0x7591, 0x0659, 0x7592, 0x3A00, 0x7593, 0x3A01, 0x7594, 0x1662,
+ 0x759A, 0x1663, 0x759D, 0x1664, 0x75A3, 0x1666, 0x75A5, 0x1665,
+ 0x75AB, 0x04F8, 0x75B1, 0x166E, 0x75B2, 0x0D7C, 0x75B3, 0x1668,
+ 0x75B4, 0x3A02, 0x75B5, 0x166A, 0x75B8, 0x166C, 0x75B9, 0x0A04,
+ 0x75BC, 0x166D, 0x75BD, 0x166B, 0x75BE, 0x08EC, 0x75C2, 0x1667,
+ 0x75C3, 0x1669, 0x75C5, 0x0DB4, 0x75C7, 0x09B1, 0x75CA, 0x1670,
+ 0x75CD, 0x166F, 0x75D2, 0x1671, 0x75D4, 0x08D2, 0x75D5, 0x081F,
+ 0x75D8, 0x0C71, 0x75D9, 0x1672, 0x75DB, 0x0BE7, 0x75DE, 0x1674,
+ 0x75E2, 0x0F69, 0x75E3, 0x1673, 0x75E4, 0x3A03, 0x75E9, 0x0AEB,
+ 0x75EC, 0x3752, 0x75F0, 0x1679, 0x75F2, 0x167B, 0x75F3, 0x167C,
+ 0x75F4, 0x0B92, 0x75F9, 0x3A04, 0x75FA, 0x167A, 0x75FC, 0x1677,
+ 0x75FE, 0x1675, 0x75FF, 0x1676, 0x7600, 0x3A05, 0x7601, 0x1678,
+ 0x7609, 0x167F, 0x760A, 0x3A06, 0x760B, 0x167D, 0x760D, 0x167E,
+ 0x7615, 0x3A07, 0x7616, 0x3A08, 0x7619, 0x3A09, 0x761E, 0x3A0A,
+ 0x761F, 0x1680, 0x7620, 0x1682, 0x7621, 0x1683, 0x7622, 0x1684,
+ 0x7624, 0x1685, 0x7626, 0x1E2D, 0x7627, 0x1681, 0x762D, 0x3A0B,
+ 0x7630, 0x1687, 0x7634, 0x1686, 0x7635, 0x3A0C, 0x763B, 0x1688,
+ 0x7642, 0x0F8D, 0x7643, 0x3A0D, 0x7646, 0x168B, 0x7647, 0x1689,
+ 0x7648, 0x168A, 0x764B, 0x3A0E, 0x764C, 0x061E, 0x764E, 0x3753,
+ 0x7652, 0x0F0A, 0x7656, 0x0E1A, 0x7658, 0x168D, 0x765C, 0x168C,
+ 0x7661, 0x168E, 0x7662, 0x168F, 0x7665, 0x3A0F, 0x7667, 0x1693,
+ 0x7668, 0x1690, 0x7669, 0x1691, 0x766A, 0x1692, 0x766C, 0x1694,
+ 0x766D, 0x3A10, 0x766F, 0x3A11, 0x7670, 0x1695, 0x7671, 0x3A12,
+ 0x7672, 0x1696, 0x7674, 0x3A13, 0x7676, 0x1697, 0x7678, 0x1698,
+ 0x767A, 0x0D43, 0x767B, 0x0C4A, 0x767C, 0x1699, 0x767D, 0x0D28,
+ 0x767E, 0x0DA6, 0x7680, 0x169A, 0x7682, 0x2176, 0x7683, 0x169B,
+ 0x7684, 0x0C24, 0x7686, 0x0585, 0x7687, 0x07D6, 0x7688, 0x169C,
+ 0x768B, 0x169D, 0x768E, 0x169E, 0x7690, 0x0877, 0x7693, 0x16A0,
+ 0x7696, 0x169F, 0x7699, 0x16A1, 0x769A, 0x16A2, 0x769B, 0x2179,
+ 0x769C, 0x2177, 0x769E, 0x2178, 0x76A4, 0x3A14, 0x76A5, 0x3A15,
+ 0x76A6, 0x217A, 0x76AE, 0x0D7D, 0x76B0, 0x16A3, 0x76B4, 0x16A4,
+ 0x76B7, 0x1D1C, 0x76B8, 0x16A5, 0x76B9, 0x16A6, 0x76BA, 0x16A7,
+ 0x76BF, 0x087C, 0x76C2, 0x16A8, 0x76C3, 0x0D0C, 0x76C5, 0x3A16,
+ 0x76C6, 0x0E8D, 0x76C8, 0x04F0, 0x76CA, 0x04F9, 0x76CC, 0x3A17,
+ 0x76CD, 0x16A9, 0x76D2, 0x16AB, 0x76D6, 0x16AA, 0x76D7, 0x0C6A,
+ 0x76DB, 0x0A5D, 0x76DC, 0x14D8, 0x76DE, 0x16AC, 0x76DF, 0x0ECD,
+ 0x76E1, 0x16AD, 0x76E3, 0x0602, 0x76E4, 0x0D6B, 0x76E5, 0x16AE,
+ 0x76E7, 0x16AF, 0x76EA, 0x16B0, 0x76EC, 0x3A18, 0x76EE, 0x0EE8,
+ 0x76F2, 0x0EE1, 0x76F4, 0x0BDA, 0x76F8, 0x0AEC, 0x76FB, 0x16B2,
+ 0x76FC, 0x3A19, 0x76FE, 0x096C, 0x7701, 0x09B2, 0x7704, 0x16B5,
+ 0x7707, 0x16B4, 0x7708, 0x16B3, 0x7709, 0x0D91, 0x770B, 0x0603,
+ 0x770C, 0x075D, 0x771B, 0x16BB, 0x771E, 0x16B8, 0x771F, 0x0A05,
+ 0x7720, 0x0EBE, 0x7724, 0x16B7, 0x7725, 0x16B9, 0x7726, 0x16BA,
+ 0x7729, 0x16B6, 0x7734, 0x3A1A, 0x7736, 0x3A1B, 0x7737, 0x16BC,
+ 0x7738, 0x16BD, 0x773A, 0x0BCB, 0x773C, 0x061F, 0x7740, 0x0BA3,
+ 0x7746, 0x217C, 0x7747, 0x16BE, 0x775A, 0x16BF, 0x775B, 0x16C2,
+ 0x775C, 0x3A1C, 0x775F, 0x3A1D, 0x7760, 0x3A1E, 0x7761, 0x0A2D,
+ 0x7762, 0x1EC5, 0x7763, 0x0C9C, 0x7765, 0x16C3, 0x7766, 0x0E81,
+ 0x7768, 0x16C0, 0x776A, 0x3755, 0x776B, 0x16C1, 0x7772, 0x3A1F,
+ 0x7779, 0x16C6, 0x777D, 0x3A20, 0x777E, 0x16C5, 0x777F, 0x16C4,
+ 0x778B, 0x16C8, 0x778E, 0x16C7, 0x7791, 0x16C9, 0x7795, 0x3A21,
+ 0x779E, 0x16CB, 0x77A0, 0x16CA, 0x77A5, 0x0E1D, 0x77A9, 0x3756,
+ 0x77AA, 0x3A22, 0x77AC, 0x0960, 0x77AD, 0x0F8E, 0x77B0, 0x16CC,
+ 0x77B3, 0x0C8F, 0x77B6, 0x16CD, 0x77B9, 0x16CE, 0x77BB, 0x16D2,
+ 0x77BC, 0x16D0, 0x77BD, 0x16D1, 0x77BF, 0x16CF, 0x77C7, 0x16D3,
+ 0x77CD, 0x16D4, 0x77D7, 0x16D5, 0x77DA, 0x16D6, 0x77DB, 0x0EC3,
+ 0x77DC, 0x16D7, 0x77E2, 0x0EFC, 0x77E3, 0x16D8, 0x77E5, 0x0B8C,
+ 0x77E6, 0x3A23, 0x77E7, 0x0D20, 0x77E9, 0x06E3, 0x77ED, 0x0B79,
+ 0x77EE, 0x16D9, 0x77EF, 0x06B2, 0x77F0, 0x3A24, 0x77F3, 0x0A74,
+ 0x77F4, 0x3A25, 0x77FC, 0x16DA, 0x7802, 0x082D, 0x7806, 0x3A26,
+ 0x780C, 0x16DB, 0x7812, 0x16DC, 0x7814, 0x075A, 0x7815, 0x0845,
+ 0x7820, 0x16DE, 0x7821, 0x217E, 0x7822, 0x3A27, 0x7825, 0x0C50,
+ 0x7826, 0x0846, 0x7827, 0x0668, 0x782D, 0x3A28, 0x782E, 0x3A29,
+ 0x7830, 0x3A2A, 0x7832, 0x0E52, 0x7834, 0x0D01, 0x7835, 0x3A2B,
+ 0x783A, 0x0C51, 0x783F, 0x07EE, 0x7845, 0x16E0, 0x784E, 0x217F,
+ 0x784F, 0x341E, 0x7851, 0x3C3C, 0x785D, 0x09B3, 0x7864, 0x2180,
+ 0x7868, 0x3A2C, 0x786B, 0x0F7A, 0x786C, 0x07D7, 0x786F, 0x075B,
+ 0x7872, 0x0D37, 0x7874, 0x16E2, 0x787A, 0x2181, 0x787C, 0x16E4,
+ 0x7881, 0x079F, 0x7886, 0x16E3, 0x7887, 0x0C12, 0x788C, 0x16E6,
+ 0x788D, 0x0595, 0x788E, 0x16E1, 0x7891, 0x0D7E, 0x7893, 0x04D2,
+ 0x7895, 0x085C, 0x7897, 0x0FF8, 0x789A, 0x16E5, 0x789E, 0x3A2D,
+ 0x78A3, 0x16E7, 0x78A7, 0x0E1B, 0x78A9, 0x0A7D, 0x78AA, 0x16E9,
+ 0x78AF, 0x16EA, 0x78B5, 0x16E8, 0x78BA, 0x05AC, 0x78BC, 0x16F0,
+ 0x78BE, 0x16EF, 0x78C1, 0x08D3, 0x78C5, 0x16F1, 0x78C6, 0x16EC,
+ 0x78C8, 0x3A2E, 0x78CA, 0x16F2, 0x78CB, 0x16ED, 0x78CC, 0x3A2F,
+ 0x78CE, 0x3A30, 0x78D0, 0x0D6C, 0x78D1, 0x16EB, 0x78D4, 0x16EE,
+ 0x78DA, 0x16F5, 0x78E0, 0x3A32, 0x78E1, 0x3A33, 0x78E4, 0x3A31,
+ 0x78E7, 0x16F4, 0x78E8, 0x0E8F, 0x78EC, 0x16F3, 0x78EF, 0x04AF,
+ 0x78F2, 0x3A34, 0x78F4, 0x16F7, 0x78F7, 0x3A35, 0x78FB, 0x3A36,
+ 0x78FD, 0x16F6, 0x7901, 0x09B4, 0x7907, 0x16F8, 0x790E, 0x0AC5,
+ 0x7911, 0x16FA, 0x7912, 0x16F9, 0x7919, 0x16FB, 0x7926, 0x16DD,
+ 0x792A, 0x16DF, 0x792B, 0x16FD, 0x792C, 0x16FC, 0x7930, 0x2182,
+ 0x7931, 0x3A37, 0x7934, 0x3A38, 0x793A, 0x08D4, 0x793B, 0x3A39,
+ 0x793C, 0x0FB1, 0x793D, 0x3A3A, 0x793E, 0x08FE, 0x7940, 0x16FE,
+ 0x7941, 0x070D, 0x7945, 0x3A3B, 0x7947, 0x065A, 0x7948, 0x0641,
+ 0x7949, 0x08B1, 0x7950, 0x0F1E, 0x7953, 0x1704, 0x7955, 0x1703,
+ 0x7956, 0x0AC6, 0x7957, 0x1700, 0x795A, 0x1702, 0x795B, 0x3A3C,
+ 0x795C, 0x3A3D, 0x795D, 0x0955, 0x795E, 0x0A06, 0x795F, 0x1701,
+ 0x7960, 0x16FF, 0x7962, 0x0CE0, 0x7965, 0x09B5, 0x7968, 0x0DAE,
+ 0x796D, 0x0847, 0x7977, 0x0C72, 0x797A, 0x1705, 0x797F, 0x1706,
+ 0x7980, 0x171C, 0x7981, 0x06D0, 0x7984, 0x0FE3, 0x7985, 0x0AB7,
+ 0x798A, 0x1707, 0x798B, 0x3A3E, 0x798D, 0x0552, 0x798E, 0x0C13,
+ 0x798F, 0x0DF1, 0x7994, 0x2186, 0x7996, 0x3A3F, 0x7998, 0x3A40,
+ 0x799B, 0x2188, 0x799D, 0x1708, 0x79A6, 0x0694, 0x79A7, 0x1709,
+ 0x79AA, 0x170B, 0x79AE, 0x170C, 0x79B0, 0x0CDF, 0x79B1, 0x1E4E,
+ 0x79B3, 0x170D, 0x79B8, 0x3A41, 0x79B9, 0x170E, 0x79BA, 0x170F,
+ 0x79BB, 0x3A42, 0x79BD, 0x06D1, 0x79BE, 0x0553, 0x79BF, 0x0C9D,
+ 0x79C0, 0x0932, 0x79C1, 0x08B2, 0x79C9, 0x1710, 0x79CA, 0x3A43,
+ 0x79CB, 0x0933, 0x79D1, 0x054A, 0x79D2, 0x0DB5, 0x79D5, 0x1711,
+ 0x79D8, 0x0D7F, 0x79DA, 0x3A44, 0x79DF, 0x0AC7, 0x79E1, 0x1714,
+ 0x79E3, 0x1715, 0x79E4, 0x0D1F, 0x79E6, 0x0A07, 0x79E7, 0x1712,
+ 0x79E9, 0x0B9F, 0x79EC, 0x1713, 0x79F0, 0x09B6, 0x79FB, 0x04A0,
+ 0x7A00, 0x0643, 0x7A03, 0x3A45, 0x7A05, 0x3633, 0x7A08, 0x1716,
+ 0x7A09, 0x3A46, 0x7A0B, 0x0C14, 0x7A0D, 0x1717, 0x7A0E, 0x0A6B,
+ 0x7A11, 0x3A47, 0x7A14, 0x0EB9, 0x7A17, 0x0D95, 0x7A18, 0x1718,
+ 0x7A19, 0x1719, 0x7A1A, 0x0B93, 0x7A1C, 0x0F8F, 0x7A1E, 0x3A48,
+ 0x7A1F, 0x171B, 0x7A20, 0x171A, 0x7A2D, 0x3A49, 0x7A2E, 0x091B,
+ 0x7A31, 0x171D, 0x7A32, 0x04B4, 0x7A37, 0x1720, 0x7A39, 0x3A4A,
+ 0x7A3B, 0x171E, 0x7A3C, 0x0554, 0x7A3D, 0x0724, 0x7A3E, 0x171F,
+ 0x7A3F, 0x07D8, 0x7A40, 0x0804, 0x7A42, 0x0E36, 0x7A43, 0x1721,
+ 0x7A45, 0x3A4B, 0x7A46, 0x0E82, 0x7A49, 0x1723, 0x7A4C, 0x3A4C,
+ 0x7A4D, 0x0A75, 0x7A4E, 0x04F1, 0x7A4F, 0x053A, 0x7A50, 0x0470,
+ 0x7A57, 0x1722, 0x7A5D, 0x3A4D, 0x7A60, 0x3A4E, 0x7A61, 0x1724,
+ 0x7A62, 0x1725, 0x7A63, 0x09DF, 0x7A69, 0x1726, 0x7A6B, 0x05AD,
+ 0x7A6D, 0x3A4F, 0x7A70, 0x1728, 0x7A74, 0x0740, 0x7A76, 0x0680,
+ 0x7A78, 0x3A50, 0x7A79, 0x1729, 0x7A7A, 0x06ED, 0x7A7D, 0x172A,
+ 0x7A7F, 0x0AA0, 0x7A81, 0x0CA5, 0x7A83, 0x0A84, 0x7A84, 0x0865,
+ 0x7A88, 0x172B, 0x7A92, 0x0BA0, 0x7A93, 0x0AED, 0x7A95, 0x172D,
+ 0x7A96, 0x172F, 0x7A97, 0x172C, 0x7A98, 0x172E, 0x7A9F, 0x06F8,
+ 0x7AA0, 0x3A51, 0x7AA3, 0x3A52, 0x7AA9, 0x1730, 0x7AAA, 0x06FC,
+ 0x7AAE, 0x0681, 0x7AAF, 0x0F3C, 0x7AB0, 0x1732, 0x7AB3, 0x3A53,
+ 0x7AB6, 0x1733, 0x7ABA, 0x04D0, 0x7ABB, 0x3A54, 0x7ABC, 0x3A55,
+ 0x7ABF, 0x1736, 0x7AC3, 0x05D4, 0x7AC4, 0x1735, 0x7AC5, 0x1734,
+ 0x7AC6, 0x3A56, 0x7AC7, 0x1738, 0x7AC8, 0x1731, 0x7ACA, 0x1739,
+ 0x7ACB, 0x0F71, 0x7ACD, 0x173A, 0x7ACF, 0x173B, 0x7AD1, 0x2189,
+ 0x7AD2, 0x11C5, 0x7AD3, 0x173D, 0x7AD5, 0x173C, 0x7AD9, 0x173E,
+ 0x7ADA, 0x173F, 0x7ADC, 0x0F7D, 0x7ADD, 0x1740, 0x7ADF, 0x1C08,
+ 0x7AE0, 0x09B7, 0x7AE1, 0x1741, 0x7AE2, 0x1742, 0x7AE3, 0x0961,
+ 0x7AE5, 0x0C90, 0x7AE6, 0x1743, 0x7AE7, 0x218A, 0x7AEA, 0x0B66,
+ 0x7AEB, 0x218C, 0x7AED, 0x1744, 0x7AEF, 0x0B7A, 0x7AF0, 0x1745,
+ 0x7AF6, 0x069D, 0x7AF8, 0x1076, 0x7AF9, 0x0B9B, 0x7AFA, 0x08DF,
+ 0x7AFF, 0x0604, 0x7B02, 0x1746, 0x7B04, 0x1753, 0x7B06, 0x1749,
+ 0x7B07, 0x3A57, 0x7B08, 0x0682, 0x7B0A, 0x1748, 0x7B0B, 0x1755,
+ 0x7B0F, 0x1747, 0x7B11, 0x09B8, 0x7B14, 0x3A58, 0x7B18, 0x174B,
+ 0x7B19, 0x174C, 0x7B1B, 0x0C25, 0x7B1E, 0x174D, 0x7B20, 0x05BC,
+ 0x7B25, 0x0A20, 0x7B26, 0x0DD6, 0x7B27, 0x3A59, 0x7B28, 0x174F,
+ 0x7B2C, 0x0B48, 0x7B31, 0x3A5A, 0x7B33, 0x174A, 0x7B35, 0x174E,
+ 0x7B36, 0x1750, 0x7B39, 0x086B, 0x7B45, 0x1757, 0x7B46, 0x0DA0,
+ 0x7B47, 0x3A5B, 0x7B48, 0x0D3A, 0x7B49, 0x0C73, 0x7B4B, 0x06D2,
+ 0x7B4C, 0x1756, 0x7B4D, 0x1754, 0x7B4E, 0x3A5C, 0x7B4F, 0x0D49,
+ 0x7B50, 0x1751, 0x7B51, 0x0B9C, 0x7B52, 0x0C75, 0x7B53, 0x375D,
+ 0x7B54, 0x0C74, 0x7B56, 0x0866, 0x7B5D, 0x1769, 0x7B60, 0x3A5D,
+ 0x7B65, 0x1759, 0x7B67, 0x175B, 0x7B69, 0x3A5E, 0x7B6C, 0x175E,
+ 0x7B6D, 0x3A5F, 0x7B6E, 0x175F, 0x7B70, 0x175C, 0x7B71, 0x175D,
+ 0x7B72, 0x3A60, 0x7B74, 0x175A, 0x7B75, 0x1758, 0x7B7A, 0x1752,
+ 0x7B86, 0x0E1F, 0x7B87, 0x0555, 0x7B8B, 0x1766, 0x7B8D, 0x1763,
+ 0x7B8F, 0x1768, 0x7B91, 0x3A61, 0x7B92, 0x1767, 0x7B94, 0x0D29,
+ 0x7B95, 0x0EB3, 0x7B97, 0x0889, 0x7B98, 0x1761, 0x7B99, 0x176A,
+ 0x7B9A, 0x1765, 0x7B9C, 0x1764, 0x7B9D, 0x1760, 0x7B9E, 0x218D,
+ 0x7B9F, 0x1762, 0x7BA1, 0x0605, 0x7BAA, 0x0B7B, 0x7BAD, 0x0AA1,
+ 0x7BAF, 0x3A62, 0x7BB1, 0x0D36, 0x7BB4, 0x176F, 0x7BB8, 0x0D38,
+ 0x7BC0, 0x0A85, 0x7BC1, 0x176C, 0x7BC4, 0x0D63, 0x7BC6, 0x1770,
+ 0x7BC7, 0x0E23, 0x7BC9, 0x0B99, 0x7BCB, 0x176B, 0x7BCC, 0x176D,
+ 0x7BCF, 0x176E, 0x7BD7, 0x3A63, 0x7BD9, 0x3A64, 0x7BDD, 0x1771,
+ 0x7BE0, 0x08F0, 0x7BE4, 0x0C9E, 0x7BE5, 0x1776, 0x7BE6, 0x1775,
+ 0x7BE9, 0x1772, 0x7BED, 0x0FDC, 0x7BF3, 0x177B, 0x7BF6, 0x177F,
+ 0x7BF7, 0x177C, 0x7C00, 0x1778, 0x7C07, 0x1779, 0x7C0B, 0x3A65,
+ 0x7C0D, 0x177E, 0x7C0F, 0x3A66, 0x7C11, 0x1773, 0x7C12, 0x10EA,
+ 0x7C13, 0x177A, 0x7C14, 0x1774, 0x7C17, 0x177D, 0x7C1E, 0x1E3B,
+ 0x7C1F, 0x1783, 0x7C20, 0x3A67, 0x7C21, 0x0606, 0x7C23, 0x1780,
+ 0x7C26, 0x3A68, 0x7C27, 0x1781, 0x7C2A, 0x1782, 0x7C2B, 0x1785,
+ 0x7C31, 0x3A69, 0x7C36, 0x3A6A, 0x7C37, 0x1784, 0x7C38, 0x0D8A,
+ 0x7C3D, 0x1786, 0x7C3E, 0x0FC4, 0x7C3F, 0x0E3D, 0x7C40, 0x178B,
+ 0x7C43, 0x1788, 0x7C4C, 0x1787, 0x7C4D, 0x0A76, 0x7C4F, 0x178A,
+ 0x7C50, 0x178C, 0x7C51, 0x3A6B, 0x7C54, 0x1789, 0x7C56, 0x1790,
+ 0x7C58, 0x178D, 0x7C59, 0x3A6C, 0x7C5F, 0x178E, 0x7C60, 0x1777,
+ 0x7C64, 0x178F, 0x7C65, 0x1791, 0x7C67, 0x3A6D, 0x7C6C, 0x1792,
+ 0x7C6E, 0x3A6E, 0x7C70, 0x3A6F, 0x7C73, 0x0E16, 0x7C75, 0x1793,
+ 0x7C7B, 0x370E, 0x7C7E, 0x0EEE, 0x7C81, 0x06C6, 0x7C82, 0x06FF,
+ 0x7C83, 0x1794, 0x7C89, 0x0E04, 0x7C8B, 0x0A2E, 0x7C8D, 0x0EBC,
+ 0x7C90, 0x1795, 0x7C92, 0x0F7B, 0x7C95, 0x0D2A, 0x7C97, 0x0AC8,
+ 0x7C98, 0x0CEA, 0x7C9B, 0x0957, 0x7C9F, 0x0484, 0x7CA1, 0x179A,
+ 0x7CA2, 0x1798, 0x7CA4, 0x1796, 0x7CA5, 0x05DD, 0x7CA7, 0x09B9,
+ 0x7CA8, 0x179B, 0x7CAB, 0x1799, 0x7CAD, 0x1797, 0x7CAE, 0x179F,
+ 0x7CB1, 0x179E, 0x7CB2, 0x179D, 0x7CB3, 0x179C, 0x7CB9, 0x17A0,
+ 0x7CBC, 0x3A70, 0x7CBD, 0x17A1, 0x7CBE, 0x0A5E, 0x7CBF, 0x3A71,
+ 0x7CC0, 0x17A2, 0x7CC2, 0x17A4, 0x7CC5, 0x17A3, 0x7CC8, 0x3A72,
+ 0x7CC9, 0x3A73, 0x7CCA, 0x0786, 0x7CCE, 0x0ABA, 0x7CD2, 0x17A6,
+ 0x7CD6, 0x0C76, 0x7CD7, 0x3A74, 0x7CD8, 0x17A5, 0x7CD9, 0x3A75,
+ 0x7CDC, 0x17A7, 0x7CDD, 0x3A76, 0x7CDE, 0x0E05, 0x7CDF, 0x0AEE,
+ 0x7CE0, 0x07D9, 0x7CE2, 0x17A8, 0x7CE7, 0x0F90, 0x7CEB, 0x3A77,
+ 0x7CEF, 0x17AA, 0x7CF2, 0x17AB, 0x7CF4, 0x17AC, 0x7CF6, 0x17AD,
+ 0x7CF8, 0x08B3, 0x7CFA, 0x17AE, 0x7CFB, 0x0725, 0x7CFE, 0x0684,
+ 0x7D00, 0x0644, 0x7D02, 0x17B0, 0x7D04, 0x0EFF, 0x7D05, 0x07DA,
+ 0x7D06, 0x17AF, 0x7D07, 0x3A78, 0x7D08, 0x3A79, 0x7D09, 0x3A7A,
+ 0x7D0A, 0x17B3, 0x7D0B, 0x0EF2, 0x7D0D, 0x0CF2, 0x7D10, 0x0DA5,
+ 0x7D13, 0x3A7B, 0x7D14, 0x096D, 0x7D15, 0x17B2, 0x7D17, 0x08FF,
+ 0x7D18, 0x07DB, 0x7D19, 0x08B4, 0x7D1A, 0x0683, 0x7D1B, 0x0E06,
+ 0x7D1C, 0x17B1, 0x7D1D, 0x3A7C, 0x7D20, 0x0AC9, 0x7D21, 0x0E70,
+ 0x7D22, 0x0867, 0x7D23, 0x3A7D, 0x7D2B, 0x08B5, 0x7D2C, 0x0BF9,
+ 0x7D2E, 0x17B6, 0x7D2F, 0x0FA7, 0x7D30, 0x0849, 0x7D32, 0x17B7,
+ 0x7D33, 0x0A08, 0x7D35, 0x17B9, 0x7D39, 0x09BA, 0x7D3A, 0x0820,
+ 0x7D3F, 0x17B8, 0x7D41, 0x3A7E, 0x7D42, 0x0934, 0x7D43, 0x0772,
+ 0x7D44, 0x0ACA, 0x7D45, 0x17B4, 0x7D46, 0x17BA, 0x7D48, 0x218F,
+ 0x7D4B, 0x17B5, 0x7D4C, 0x0726, 0x7D4E, 0x17BD, 0x7D4F, 0x17C1,
+ 0x7D50, 0x0741, 0x7D53, 0x3A7F, 0x7D56, 0x17BC, 0x7D59, 0x3A80,
+ 0x7D5B, 0x17C5, 0x7D5C, 0x2190, 0x7D5D, 0x3A81, 0x7D5E, 0x07DC,
+ 0x7D61, 0x0F57, 0x7D62, 0x0480, 0x7D63, 0x17C2, 0x7D66, 0x0685,
+ 0x7D68, 0x17BF, 0x7D6E, 0x17C0, 0x7D71, 0x0C77, 0x7D72, 0x17BE,
+ 0x7D73, 0x17BB, 0x7D75, 0x0586, 0x7D76, 0x0A88, 0x7D79, 0x075C,
+ 0x7D7A, 0x3A82, 0x7D7D, 0x17C7, 0x7D86, 0x3A83, 0x7D89, 0x17C4,
+ 0x7D8B, 0x3A84, 0x7D8C, 0x3A85, 0x7D8F, 0x17C6, 0x7D93, 0x17C3,
+ 0x7D99, 0x0727, 0x7D9A, 0x0B13, 0x7D9B, 0x17C8, 0x7D9C, 0x0AF0,
+ 0x7D9F, 0x17D5, 0x7DA0, 0x2192, 0x7DA2, 0x17D1, 0x7DA3, 0x17CB,
+ 0x7DAB, 0x17CF, 0x7DAC, 0x0926, 0x7DAD, 0x04A1, 0x7DAE, 0x17CA,
+ 0x7DAF, 0x17D2, 0x7DB0, 0x17D6, 0x7DB1, 0x07DD, 0x7DB2, 0x0EE2,
+ 0x7DB4, 0x0BF2, 0x7DB5, 0x17CC, 0x7DB7, 0x2191, 0x7DB8, 0x17D4,
+ 0x7DBA, 0x17C9, 0x7DBB, 0x0B7C, 0x7DBD, 0x17CE, 0x7DBE, 0x0481,
+ 0x7DBF, 0x0ED6, 0x7DC7, 0x17CD, 0x7DCA, 0x06D3, 0x7DCB, 0x0D80,
+ 0x7DCC, 0x3A86, 0x7DCF, 0x0AEF, 0x7DD1, 0x0F98, 0x7DD2, 0x0979,
+ 0x7DD5, 0x17FD, 0x7DD6, 0x2193, 0x7DD8, 0x17D7, 0x7DDA, 0x0AA2,
+ 0x7DDC, 0x17D3, 0x7DDD, 0x17D8, 0x7DDE, 0x17DA, 0x7DE0, 0x0C15,
+ 0x7DE1, 0x17DD, 0x7DE3, 0x340A, 0x7DE4, 0x17D9, 0x7DE8, 0x0E24,
+ 0x7DE9, 0x0607, 0x7DEB, 0x3A87, 0x7DEC, 0x0ED7, 0x7DEF, 0x04A2,
+ 0x7DF1, 0x3A88, 0x7DF2, 0x17DC, 0x7DF4, 0x0FC5, 0x7DF9, 0x3A89,
+ 0x7DFB, 0x17DB, 0x7E01, 0x0511, 0x7E04, 0x0CC4, 0x7E05, 0x17DE,
+ 0x7E08, 0x3A8A, 0x7E09, 0x17E5, 0x7E0A, 0x17DF, 0x7E0B, 0x17E6,
+ 0x7E11, 0x3A8B, 0x7E12, 0x17E2, 0x7E15, 0x3A8C, 0x7E1B, 0x0D31,
+ 0x7E1E, 0x08F6, 0x7E1F, 0x17E4, 0x7E20, 0x3A8D, 0x7E21, 0x17E1,
+ 0x7E22, 0x17E7, 0x7E23, 0x17E0, 0x7E26, 0x094E, 0x7E2B, 0x0E53,
+ 0x7E2E, 0x0956, 0x7E31, 0x17E3, 0x7E32, 0x17EF, 0x7E35, 0x17EB,
+ 0x7E37, 0x17EE, 0x7E39, 0x17EC, 0x7E3A, 0x17F0, 0x7E3B, 0x17EA,
+ 0x7E3D, 0x17D0, 0x7E3E, 0x0A77, 0x7E41, 0x0D5F, 0x7E43, 0x17ED,
+ 0x7E46, 0x17E8, 0x7E47, 0x3A8E, 0x7E48, 0x3767, 0x7E4A, 0x0AA3,
+ 0x7E4B, 0x0728, 0x7E4D, 0x0935, 0x7E52, 0x2194, 0x7E54, 0x09EB,
+ 0x7E55, 0x0AB8, 0x7E56, 0x17F3, 0x7E59, 0x17F5, 0x7E5A, 0x17F6,
+ 0x7E5D, 0x17F2, 0x7E5E, 0x17F4, 0x7E61, 0x1E11, 0x7E62, 0x3A8F,
+ 0x7E66, 0x17E9, 0x7E67, 0x17F1, 0x7E69, 0x17F9, 0x7E6A, 0x17F8,
+ 0x7E6B, 0x1DF7, 0x7E6D, 0x0EA8, 0x7E6E, 0x3A90, 0x7E70, 0x0701,
+ 0x7E73, 0x3A91, 0x7E79, 0x17F7, 0x7E7B, 0x17FB, 0x7E7C, 0x17FA,
+ 0x7E7D, 0x17FE, 0x7E7F, 0x1800, 0x7E82, 0x088A, 0x7E83, 0x17FC,
+ 0x7E88, 0x1801, 0x7E89, 0x1802, 0x7E8A, 0x20A7, 0x7E8C, 0x1803,
+ 0x7E8D, 0x3A92, 0x7E8E, 0x1809, 0x7E8F, 0x0C35, 0x7E90, 0x1805,
+ 0x7E91, 0x3A93, 0x7E92, 0x1804, 0x7E93, 0x1806, 0x7E94, 0x1807,
+ 0x7E96, 0x1808, 0x7E98, 0x3A94, 0x7E9B, 0x180A, 0x7E9C, 0x180B,
+ 0x7F36, 0x0608, 0x7F38, 0x180C, 0x7F3A, 0x180D, 0x7F44, 0x3A95,
+ 0x7F45, 0x180E, 0x7F47, 0x2195, 0x7F4C, 0x180F, 0x7F4D, 0x1810,
+ 0x7F4E, 0x1811, 0x7F4F, 0x3A96, 0x7F50, 0x1812, 0x7F51, 0x1813,
+ 0x7F52, 0x3A97, 0x7F53, 0x3A98, 0x7F54, 0x1815, 0x7F55, 0x1814,
+ 0x7F58, 0x1816, 0x7F5F, 0x1817, 0x7F60, 0x1818, 0x7F61, 0x3A99,
+ 0x7F67, 0x181B, 0x7F68, 0x1819, 0x7F69, 0x181A, 0x7F6A, 0x0851,
+ 0x7F6B, 0x0729, 0x7F6E, 0x0B94, 0x7F70, 0x0D47, 0x7F72, 0x097A,
+ 0x7F75, 0x0D03, 0x7F77, 0x0D81, 0x7F78, 0x181C, 0x7F79, 0x1336,
+ 0x7F82, 0x181D, 0x7F83, 0x181F, 0x7F85, 0x0F4F, 0x7F86, 0x181E,
+ 0x7F87, 0x1821, 0x7F88, 0x1820, 0x7F8A, 0x0F3D, 0x7F8C, 0x1822,
+ 0x7F8E, 0x0D92, 0x7F91, 0x3A9A, 0x7F94, 0x1823, 0x7F9A, 0x1826,
+ 0x7F9D, 0x1825, 0x7F9E, 0x1824, 0x7FA1, 0x2196, 0x7FA3, 0x1827,
+ 0x7FA4, 0x0708, 0x7FA8, 0x0AA4, 0x7FA9, 0x065B, 0x7FAE, 0x182B,
+ 0x7FAF, 0x1828, 0x7FB2, 0x1829, 0x7FB6, 0x182C, 0x7FB8, 0x182D,
+ 0x7FB9, 0x182A, 0x7FBD, 0x04CB, 0x7FBF, 0x3A9B, 0x7FC1, 0x0527,
+ 0x7FC5, 0x182F, 0x7FC6, 0x1830, 0x7FCA, 0x1831, 0x7FCC, 0x0F4C,
+ 0x7FCE, 0x3A9C, 0x7FD2, 0x0936, 0x7FD4, 0x1833, 0x7FD5, 0x1832,
+ 0x7FDF, 0x3A9D, 0x7FE0, 0x0A2F, 0x7FE1, 0x1834, 0x7FE5, 0x3A9E,
+ 0x7FE6, 0x1835, 0x7FE9, 0x1836, 0x7FEB, 0x0621, 0x7FEC, 0x3A9F,
+ 0x7FEE, 0x3AA0, 0x7FEF, 0x3AA1, 0x7FF0, 0x0609, 0x7FF3, 0x1837,
+ 0x7FF9, 0x1838, 0x7FFA, 0x3AA2, 0x7FFB, 0x0E8B, 0x7FFC, 0x0F4D,
+ 0x8000, 0x0F3E, 0x8001, 0x0FDD, 0x8002, 0x3713, 0x8003, 0x07DF,
+ 0x8004, 0x183B, 0x8005, 0x0900, 0x8006, 0x183A, 0x800B, 0x183C,
+ 0x800C, 0x08D5, 0x800E, 0x3AA3, 0x8010, 0x0B31, 0x8011, 0x3AA4,
+ 0x8012, 0x183D, 0x8014, 0x3AA5, 0x8015, 0x07DE, 0x8017, 0x0EE3,
+ 0x8018, 0x183E, 0x8019, 0x183F, 0x801C, 0x1840, 0x8021, 0x1841,
+ 0x8024, 0x3AA6, 0x8026, 0x3AA7, 0x8028, 0x1842, 0x8033, 0x08D6,
+ 0x8036, 0x0EF9, 0x803A, 0x3AA8, 0x803B, 0x1844, 0x803C, 0x3AA9,
+ 0x803D, 0x0B7D, 0x803F, 0x1843, 0x8046, 0x1846, 0x804A, 0x1845,
+ 0x8052, 0x1847, 0x8056, 0x0A5F, 0x8058, 0x1848, 0x805A, 0x1849,
+ 0x805E, 0x0E09, 0x805F, 0x184A, 0x8060, 0x3AAA, 0x8061, 0x0AF1,
+ 0x8062, 0x184B, 0x8068, 0x184C, 0x806F, 0x0FC6, 0x8070, 0x184F,
+ 0x8071, 0x3AAB, 0x8072, 0x184E, 0x8073, 0x184D, 0x8074, 0x0BCC,
+ 0x8075, 0x3AAC, 0x8076, 0x1850, 0x8077, 0x09EC, 0x8079, 0x1851,
+ 0x807D, 0x1852, 0x807E, 0x0FDE, 0x807F, 0x1853, 0x8084, 0x1854,
+ 0x8085, 0x1856, 0x8086, 0x1855, 0x8087, 0x0D39, 0x8089, 0x0CD1,
+ 0x808B, 0x0FE4, 0x808C, 0x0D3D, 0x8093, 0x1858, 0x8096, 0x09BB,
+ 0x8098, 0x0D9C, 0x809A, 0x1859, 0x809B, 0x1857, 0x809D, 0x060A,
+ 0x809E, 0x3AAD, 0x80A1, 0x0788, 0x80A2, 0x08B6, 0x80A5, 0x0D82,
+ 0x80A6, 0x3AAE, 0x80A9, 0x075E, 0x80AA, 0x0E71, 0x80AB, 0x3AAF,
+ 0x80AC, 0x185C, 0x80AD, 0x185A, 0x80AF, 0x07E0, 0x80B1, 0x07E1,
+ 0x80B2, 0x04AD, 0x80B4, 0x0858, 0x80BA, 0x0D0F, 0x80C3, 0x04A3,
+ 0x80C4, 0x1861, 0x80C6, 0x0B7E, 0x80CC, 0x0D0E, 0x80CE, 0x0B3B,
+ 0x80D6, 0x1863, 0x80D7, 0x3AB0, 0x80D8, 0x3AB1, 0x80D9, 0x185F,
+ 0x80DA, 0x1862, 0x80DB, 0x185D, 0x80DD, 0x1860, 0x80DE, 0x0E54,
+ 0x80E1, 0x0789, 0x80E4, 0x04C1, 0x80E5, 0x185E, 0x80EF, 0x1865,
+ 0x80F1, 0x1866, 0x80F4, 0x0C91, 0x80F8, 0x06B3, 0x80FC, 0x1871,
+ 0x80FD, 0x0CF3, 0x8102, 0x08B7, 0x8105, 0x06B4, 0x8106, 0x0A6C,
+ 0x8107, 0x0FEC, 0x8108, 0x0EBA, 0x8109, 0x1864, 0x810A, 0x0A78,
+ 0x8116, 0x3AB2, 0x8118, 0x3AB3, 0x811A, 0x066D, 0x811B, 0x1867,
+ 0x8123, 0x1869, 0x8129, 0x1868, 0x812B, 0x3659, 0x812F, 0x186A,
+ 0x8131, 0x0B64, 0x8133, 0x0CF4, 0x8139, 0x0BCD, 0x813A, 0x3AB4,
+ 0x813E, 0x186E, 0x8141, 0x3772, 0x8146, 0x186D, 0x814A, 0x3AB5,
+ 0x814B, 0x186B, 0x814C, 0x3AB6, 0x814E, 0x0A1B, 0x8150, 0x0DD7,
+ 0x8151, 0x1870, 0x8153, 0x186F, 0x8154, 0x07E2, 0x8155, 0x0FF9,
+ 0x815F, 0x1880, 0x8165, 0x1874, 0x8166, 0x1875, 0x816B, 0x091C,
+ 0x816E, 0x1873, 0x8170, 0x080A, 0x8171, 0x1872, 0x8174, 0x1876,
+ 0x8178, 0x0BCE, 0x8179, 0x0DF2, 0x817A, 0x0AA5, 0x817F, 0x0B3C,
+ 0x8180, 0x187A, 0x8181, 0x3AB7, 0x8182, 0x187B, 0x8183, 0x1877,
+ 0x8184, 0x3AB8, 0x8188, 0x1878, 0x818A, 0x1879, 0x818F, 0x07E3,
+ 0x8193, 0x1881, 0x8195, 0x187D, 0x819A, 0x0DD8, 0x819C, 0x0E9A,
+ 0x819D, 0x0D9A, 0x81A0, 0x187C, 0x81A3, 0x187F, 0x81A4, 0x187E,
+ 0x81A8, 0x0E72, 0x81A9, 0x1882, 0x81B0, 0x1883, 0x81B3, 0x0AB9,
+ 0x81B4, 0x3AB9, 0x81B5, 0x1884, 0x81B8, 0x1886, 0x81BA, 0x188A,
+ 0x81BD, 0x1887, 0x81BE, 0x1885, 0x81BF, 0x0CF5, 0x81C0, 0x1888,
+ 0x81C2, 0x1889, 0x81C6, 0x0532, 0x81C8, 0x1890, 0x81C9, 0x188B,
+ 0x81CD, 0x188C, 0x81CF, 0x3ABA, 0x81D1, 0x188D, 0x81D3, 0x0B01,
+ 0x81D8, 0x188F, 0x81D9, 0x188E, 0x81DA, 0x1891, 0x81DF, 0x1892,
+ 0x81E0, 0x1893, 0x81E3, 0x0A09, 0x81E5, 0x0569, 0x81E7, 0x1894,
+ 0x81E8, 0x0F9F, 0x81EA, 0x08D7, 0x81ED, 0x0937, 0x81F3, 0x08B8,
+ 0x81F4, 0x0B95, 0x81F9, 0x3ABB, 0x81FA, 0x1895, 0x81FB, 0x1896,
+ 0x81FC, 0x04D3, 0x81FE, 0x1897, 0x8201, 0x1898, 0x8202, 0x1899,
+ 0x8203, 0x3ABC, 0x8205, 0x189A, 0x8207, 0x189B, 0x8208, 0x06B5,
+ 0x8209, 0x13AF, 0x820A, 0x189C, 0x820C, 0x0A89, 0x820D, 0x189D,
+ 0x820E, 0x08F7, 0x8210, 0x189E, 0x8212, 0x1009, 0x8216, 0x189F,
+ 0x8217, 0x0E2E, 0x8218, 0x0618, 0x821B, 0x0AA6, 0x821C, 0x0962,
+ 0x821E, 0x0DE3, 0x821F, 0x0938, 0x8221, 0x3ABD, 0x8229, 0x18A0,
+ 0x822A, 0x07E4, 0x822B, 0x18A1, 0x822C, 0x0D60, 0x822E, 0x18AF,
+ 0x8232, 0x3ABE, 0x8233, 0x18A3, 0x8234, 0x3ABF, 0x8235, 0x0B29,
+ 0x8236, 0x0D2B, 0x8237, 0x0773, 0x8238, 0x18A2, 0x8239, 0x0AA7,
+ 0x8240, 0x18A4, 0x8246, 0x3AC0, 0x8247, 0x0C16, 0x824B, 0x3AC1,
+ 0x824F, 0x3AC2, 0x8258, 0x18A6, 0x8259, 0x18A5, 0x825A, 0x18A8,
+ 0x825D, 0x18A7, 0x825F, 0x18A9, 0x8262, 0x18AB, 0x8264, 0x18AA,
+ 0x8266, 0x060B, 0x8268, 0x18AC, 0x826A, 0x18AD, 0x826B, 0x18AE,
+ 0x826E, 0x0821, 0x826F, 0x0F91, 0x8271, 0x18B0, 0x8272, 0x09ED,
+ 0x8276, 0x0512, 0x8277, 0x18B1, 0x8278, 0x18B2, 0x8279, 0x3775,
+ 0x827E, 0x18B3, 0x828B, 0x04B6, 0x828D, 0x18B4, 0x828E, 0x3AC3,
+ 0x8292, 0x18B5, 0x8299, 0x0DD9, 0x829D, 0x08F3, 0x829F, 0x18B7,
+ 0x82A5, 0x0587, 0x82A6, 0x0476, 0x82AB, 0x18B6, 0x82AC, 0x18B9,
+ 0x82AD, 0x0D04, 0x82AE, 0x3AC4, 0x82AF, 0x0A0A, 0x82B1, 0x0556,
+ 0x82B3, 0x0E55, 0x82B7, 0x3AC5, 0x82B8, 0x0733, 0x82B9, 0x06D4,
+ 0x82BB, 0x18B8, 0x82BD, 0x056A, 0x82BE, 0x3AC6, 0x82C5, 0x05DF,
+ 0x82C6, 0x3AC7, 0x82D1, 0x0513, 0x82D2, 0x18BD, 0x82D3, 0x0FB2,
+ 0x82D4, 0x0B3D, 0x82D7, 0x0DB6, 0x82D9, 0x18C9, 0x82DB, 0x0557,
+ 0x82DC, 0x18C7, 0x82DE, 0x18C5, 0x82DF, 0x18BC, 0x82E1, 0x18BA,
+ 0x82E3, 0x18BB, 0x82E5, 0x090F, 0x82E6, 0x06E4, 0x82E7, 0x0BB5,
+ 0x82EB, 0x0CA9, 0x82F1, 0x04F3, 0x82F3, 0x18BF, 0x82F4, 0x18BE,
+ 0x82F9, 0x18C4, 0x82FA, 0x18C0, 0x82FB, 0x18C3, 0x82FE, 0x3AC8,
+ 0x8301, 0x2198, 0x8302, 0x0EDC, 0x8303, 0x18C2, 0x8304, 0x0558,
+ 0x8305, 0x05DB, 0x8306, 0x18C6, 0x8309, 0x18C8, 0x830E, 0x072A,
+ 0x8316, 0x18CC, 0x8317, 0x18D5, 0x8318, 0x18D6, 0x831C, 0x046F,
+ 0x8323, 0x18DD, 0x8328, 0x04B5, 0x832B, 0x18D4, 0x832F, 0x18D3,
+ 0x8331, 0x18CE, 0x8332, 0x18CD, 0x8334, 0x18CB, 0x8335, 0x18CA,
+ 0x8336, 0x0BA1, 0x8338, 0x0B5B, 0x8339, 0x18D0, 0x8340, 0x18CF,
+ 0x8343, 0x3AC9, 0x8345, 0x18D2, 0x8349, 0x0AF2, 0x834A, 0x072B,
+ 0x834F, 0x04E3, 0x8350, 0x18D1, 0x8351, 0x3ACA, 0x8352, 0x07E5,
+ 0x8355, 0x3ACB, 0x8358, 0x0AF3, 0x8362, 0x2199, 0x8373, 0x18E3,
+ 0x8375, 0x18E4, 0x8377, 0x0559, 0x837B, 0x052E, 0x837C, 0x18E1,
+ 0x837F, 0x219A, 0x8385, 0x18D7, 0x8386, 0x3ACC, 0x8387, 0x18DF,
+ 0x8389, 0x18E6, 0x838A, 0x18E0, 0x838D, 0x3ACD, 0x838E, 0x18DE,
+ 0x8392, 0x3ACE, 0x8393, 0x18C1, 0x8396, 0x18DC, 0x8398, 0x3ACF,
+ 0x839A, 0x18D8, 0x839E, 0x060C, 0x839F, 0x18DA, 0x83A0, 0x18E5,
+ 0x83A2, 0x18DB, 0x83A8, 0x18E7, 0x83A9, 0x3AD0, 0x83AA, 0x18D9,
+ 0x83AB, 0x0D32, 0x83B1, 0x0F53, 0x83B5, 0x18E2, 0x83BD, 0x18F8,
+ 0x83BF, 0x3AD1, 0x83C0, 0x3AD2, 0x83C1, 0x18F0, 0x83C5, 0x0A41,
+ 0x83C7, 0x219B, 0x83CA, 0x0660, 0x83CC, 0x06D5, 0x83CE, 0x18EB,
+ 0x83D3, 0x055B, 0x83D6, 0x09BC, 0x83D8, 0x18EE, 0x83DC, 0x084A,
+ 0x83DF, 0x0C4B, 0x83E0, 0x18F3, 0x83E9, 0x0E3E, 0x83EA, 0x3AD3,
+ 0x83EB, 0x18EA, 0x83EF, 0x055A, 0x83F0, 0x078A, 0x83F1, 0x0D9B,
+ 0x83F2, 0x18F4, 0x83F4, 0x18E8, 0x83F6, 0x219C, 0x83F7, 0x18F1,
+ 0x83FB, 0x18FB, 0x83FD, 0x18EC, 0x8403, 0x18ED, 0x8404, 0x0C92,
+ 0x8407, 0x18F2, 0x840A, 0x1E7F, 0x840B, 0x18EF, 0x840C, 0x0E56,
+ 0x840D, 0x18F5, 0x840E, 0x04A4, 0x840F, 0x3AD4, 0x8411, 0x3AD5,
+ 0x8413, 0x18E9, 0x8420, 0x18F7, 0x8422, 0x18F6, 0x8429, 0x0D21,
+ 0x842A, 0x18FD, 0x842C, 0x1908, 0x8431, 0x05DC, 0x8435, 0x190B,
+ 0x8438, 0x18F9, 0x843C, 0x18FE, 0x843D, 0x0F58, 0x8446, 0x1907,
+ 0x8448, 0x219D, 0x8449, 0x0F3F, 0x844A, 0x3AD6, 0x844E, 0x0F72,
+ 0x8457, 0x0BB6, 0x845B, 0x05C9, 0x8461, 0x0DE4, 0x8462, 0x190D,
+ 0x8463, 0x0C79, 0x8466, 0x0475, 0x8469, 0x1906, 0x846B, 0x1902,
+ 0x846C, 0x0AF4, 0x846D, 0x18FC, 0x846E, 0x1904, 0x846F, 0x1909,
+ 0x8471, 0x0CE2, 0x8475, 0x046E, 0x8476, 0x3AD7, 0x8477, 0x1901,
+ 0x8479, 0x190A, 0x847A, 0x0DEA, 0x8482, 0x1905, 0x8484, 0x1900,
+ 0x848B, 0x09BD, 0x8490, 0x0939, 0x8494, 0x08D8, 0x8499, 0x0EE4,
+ 0x849C, 0x0DB9, 0x849F, 0x1910, 0x84A1, 0x1919, 0x84A8, 0x3AD8,
+ 0x84AD, 0x1903, 0x84AF, 0x3AD9, 0x84B2, 0x05D5, 0x84B4, 0x219E,
+ 0x84B8, 0x09E0, 0x84B9, 0x190E, 0x84BB, 0x1913, 0x84BC, 0x0AF5,
+ 0x84BF, 0x190F, 0x84C0, 0x3ADA, 0x84C1, 0x1916, 0x84C2, 0x3ADB,
+ 0x84C4, 0x0B9D, 0x84C6, 0x1917, 0x84C9, 0x0F40, 0x84CA, 0x190C,
+ 0x84CB, 0x0596, 0x84CD, 0x1912, 0x84D0, 0x1915, 0x84D1, 0x0EB8,
+ 0x84D6, 0x1918, 0x84D9, 0x1911, 0x84DA, 0x1914, 0x84DC, 0x20AB,
+ 0x84EC, 0x0E57, 0x84EE, 0x0FC7, 0x84F0, 0x3ADC, 0x84F4, 0x191C,
+ 0x84FC, 0x1923, 0x84FD, 0x3ADD, 0x84FF, 0x191B, 0x8500, 0x08EF,
+ 0x8506, 0x18FA, 0x850C, 0x3ADE, 0x8511, 0x0E1E, 0x8513, 0x0EAE,
+ 0x8514, 0x1922, 0x8515, 0x1921, 0x8517, 0x191D, 0x8518, 0x191E,
+ 0x851A, 0x04D8, 0x851F, 0x1920, 0x8521, 0x191A, 0x8523, 0x1E1A,
+ 0x8526, 0x0BF1, 0x852C, 0x191F, 0x852D, 0x04C2, 0x8534, 0x3ADF,
+ 0x8535, 0x0B02, 0x853D, 0x0E13, 0x853E, 0x1EB5, 0x8540, 0x1924,
+ 0x8541, 0x1928, 0x8543, 0x0D6D, 0x8548, 0x1927, 0x8549, 0x09BE,
+ 0x854A, 0x08F5, 0x854B, 0x192A, 0x854E, 0x06B6, 0x8553, 0x219F,
+ 0x8555, 0x192B, 0x8557, 0x0DEB, 0x8558, 0x1926, 0x8559, 0x21A0,
+ 0x855A, 0x18FF, 0x855E, 0x3AE0, 0x8563, 0x1925, 0x8568, 0x0FF5,
+ 0x8569, 0x0C7A, 0x856A, 0x0DE5, 0x856B, 0x21A1, 0x856D, 0x1932,
+ 0x8577, 0x1938, 0x857E, 0x1939, 0x8580, 0x192C, 0x8584, 0x0D2C,
+ 0x8587, 0x1936, 0x8588, 0x192E, 0x858A, 0x1930, 0x858F, 0x3AE1,
+ 0x8590, 0x193A, 0x8591, 0x192F, 0x8594, 0x1933, 0x8597, 0x0514,
+ 0x8599, 0x0CBD, 0x859B, 0x1934, 0x859C, 0x1937, 0x85A4, 0x192D,
+ 0x85A6, 0x0AA8, 0x85A8, 0x1931, 0x85A9, 0x0875, 0x85AA, 0x0A0B,
+ 0x85AB, 0x0706, 0x85AC, 0x0F00, 0x85AD, 0x3AE4, 0x85AE, 0x0F05,
+ 0x85AF, 0x097C, 0x85B0, 0x21A3, 0x85B7, 0x3AE2, 0x85B9, 0x193E,
+ 0x85BA, 0x193C, 0x85C1, 0x0FF4, 0x85C9, 0x193B, 0x85CD, 0x0F5F,
+ 0x85CE, 0x3AE3, 0x85CF, 0x193D, 0x85D0, 0x193F, 0x85D5, 0x1940,
+ 0x85DC, 0x1943, 0x85DD, 0x1941, 0x85E4, 0x0C7B, 0x85E5, 0x1942,
+ 0x85E9, 0x0D61, 0x85EA, 0x1935, 0x85F4, 0x3780, 0x85F7, 0x097D,
+ 0x85F9, 0x1944, 0x85FA, 0x1949, 0x85FB, 0x0AF6, 0x85FE, 0x1948,
+ 0x8602, 0x1929, 0x8606, 0x194A, 0x8607, 0x0ACB, 0x860A, 0x1945,
+ 0x860B, 0x1947, 0x8612, 0x3AE5, 0x8613, 0x1946, 0x8616, 0x14D0,
+ 0x8617, 0x14C1, 0x861A, 0x194C, 0x8622, 0x194B, 0x8629, 0x3AE6,
+ 0x862D, 0x0F60, 0x862F, 0x16B1, 0x8630, 0x194D, 0x863F, 0x194E,
+ 0x864D, 0x194F, 0x864E, 0x078B, 0x8650, 0x066E, 0x8652, 0x3AE7,
+ 0x8654, 0x1951, 0x8655, 0x1094, 0x865A, 0x068F, 0x865B, 0x3418,
+ 0x865C, 0x0F82, 0x865E, 0x06EB, 0x865F, 0x1952, 0x8663, 0x3AE8,
+ 0x8667, 0x1953, 0x866B, 0x0BAC, 0x866C, 0x3AE9, 0x866F, 0x3AEA,
+ 0x8671, 0x1954, 0x8679, 0x0CD2, 0x867A, 0x3AEB, 0x867B, 0x047E,
+ 0x867D, 0x3786, 0x868A, 0x0563, 0x868B, 0x1959, 0x868C, 0x195A,
+ 0x868D, 0x3AEC, 0x8691, 0x3AED, 0x8693, 0x1955, 0x8695, 0x088B,
+ 0x8698, 0x3AEE, 0x86A3, 0x1956, 0x86A4, 0x0CF8, 0x86A7, 0x3AEF,
+ 0x86A8, 0x3AF0, 0x86A9, 0x1957, 0x86AA, 0x1958, 0x86AB, 0x1962,
+ 0x86AF, 0x195C, 0x86B0, 0x195F, 0x86B6, 0x195B, 0x86C4, 0x195D,
+ 0x86C6, 0x195E, 0x86C7, 0x0904, 0x86C9, 0x1960, 0x86CB, 0x0B7F,
+ 0x86CD, 0x072C, 0x86CE, 0x05A0, 0x86D4, 0x1963, 0x86D9, 0x059D,
+ 0x86DB, 0x1968, 0x86DE, 0x1964, 0x86DF, 0x1967, 0x86E4, 0x0D4E,
+ 0x86E9, 0x1965, 0x86EC, 0x1966, 0x86ED, 0x0DBA, 0x86EE, 0x0D6E,
+ 0x86EF, 0x1969, 0x86F8, 0x0B5D, 0x86F9, 0x1973, 0x86FA, 0x3AF1,
+ 0x86FB, 0x196F, 0x86FD, 0x3AF2, 0x86FE, 0x056B, 0x8700, 0x196D,
+ 0x8702, 0x0E58, 0x8703, 0x196E, 0x8706, 0x196B, 0x8708, 0x196C,
+ 0x8709, 0x1971, 0x870A, 0x1974, 0x870B, 0x3AF3, 0x870D, 0x1972,
+ 0x8711, 0x1970, 0x8712, 0x196A, 0x8713, 0x3AF4, 0x8718, 0x0B96,
+ 0x8719, 0x3AF5, 0x871A, 0x197B, 0x871C, 0x0EB6, 0x871E, 0x3AF6,
+ 0x8725, 0x1979, 0x8728, 0x3AF7, 0x8729, 0x197A, 0x8734, 0x1975,
+ 0x8737, 0x1977, 0x873B, 0x1978, 0x873E, 0x3AF8, 0x873F, 0x1976,
+ 0x8749, 0x0A8A, 0x874B, 0x0FDF, 0x874C, 0x197F, 0x874E, 0x1980,
+ 0x8753, 0x1986, 0x8755, 0x09F0, 0x8757, 0x1982, 0x8759, 0x1985,
+ 0x875F, 0x197D, 0x8760, 0x197C, 0x8763, 0x1987, 0x8766, 0x055C,
+ 0x8768, 0x1983, 0x876A, 0x1988, 0x876E, 0x1984, 0x8771, 0x3AF9,
+ 0x8774, 0x1981, 0x8776, 0x0BCF, 0x8778, 0x197E, 0x877F, 0x0D1E,
+ 0x8782, 0x198C, 0x8788, 0x3AFA, 0x878D, 0x0F25, 0x8799, 0x3AFB,
+ 0x879F, 0x198B, 0x87A2, 0x198A, 0x87AB, 0x1993, 0x87AC, 0x3AFC,
+ 0x87AD, 0x3AFD, 0x87AF, 0x198D, 0x87B3, 0x1995, 0x87B5, 0x3AFE,
+ 0x87BA, 0x0F50, 0x87BB, 0x1998, 0x87BD, 0x198F, 0x87C0, 0x1990,
+ 0x87C4, 0x1994, 0x87C6, 0x1997, 0x87C7, 0x1996, 0x87CB, 0x198E,
+ 0x87D0, 0x1991, 0x87D2, 0x19A2, 0x87D6, 0x3AFF, 0x87E0, 0x199B,
+ 0x87EB, 0x3B00, 0x87EC, 0x1E23, 0x87ED, 0x3B01, 0x87EF, 0x1999,
+ 0x87F2, 0x199A, 0x87F5, 0x3C3D, 0x87F6, 0x199F, 0x87F7, 0x19A0,
+ 0x87F9, 0x0588, 0x87FB, 0x065C, 0x87FE, 0x199E, 0x8801, 0x3B02,
+ 0x8803, 0x3B03, 0x8805, 0x1989, 0x8806, 0x3B04, 0x8807, 0x21A6,
+ 0x880B, 0x3B05, 0x880D, 0x199D, 0x880E, 0x19A1, 0x880F, 0x199C,
+ 0x8811, 0x19A3, 0x8814, 0x3B06, 0x8815, 0x19A5, 0x8816, 0x19A4,
+ 0x881C, 0x3B07, 0x881F, 0x1E85, 0x8821, 0x19A7, 0x8822, 0x19A6,
+ 0x8823, 0x1961, 0x8827, 0x19AB, 0x8831, 0x19A8, 0x8836, 0x19A9,
+ 0x8839, 0x19AA, 0x883B, 0x19AC, 0x8840, 0x0742, 0x8842, 0x19AE,
+ 0x8844, 0x19AD, 0x8846, 0x093A, 0x884C, 0x07E6, 0x884D, 0x1524,
+ 0x8852, 0x19AF, 0x8853, 0x095B, 0x8856, 0x3B08, 0x8857, 0x0597,
+ 0x8859, 0x19B0, 0x885B, 0x04F4, 0x885D, 0x09BF, 0x885E, 0x19B1,
+ 0x885F, 0x3B09, 0x8861, 0x07E7, 0x8862, 0x19B2, 0x8863, 0x04A5,
+ 0x8864, 0x3B0A, 0x8868, 0x0DAF, 0x886B, 0x19B3, 0x8870, 0x0A30,
+ 0x8872, 0x19BA, 0x8875, 0x19B7, 0x8877, 0x0BAD, 0x887D, 0x19B8,
+ 0x887E, 0x19B5, 0x887F, 0x06D6, 0x8881, 0x19B4, 0x8882, 0x19BB,
+ 0x8888, 0x070C, 0x888B, 0x0B3E, 0x888D, 0x19C1, 0x8892, 0x19BD,
+ 0x8896, 0x0B15, 0x8897, 0x19BC, 0x8898, 0x3B0B, 0x8899, 0x19BF,
+ 0x889E, 0x19B6, 0x88A2, 0x19C0, 0x88A4, 0x19C2, 0x88AA, 0x3B0C,
+ 0x88AB, 0x0D83, 0x88AE, 0x19BE, 0x88B0, 0x19C3, 0x88B1, 0x19C5,
+ 0x88B4, 0x0787, 0x88B5, 0x19B9, 0x88B7, 0x0485, 0x88BD, 0x3B0D,
+ 0x88BE, 0x3B0E, 0x88BF, 0x19C4, 0x88C1, 0x084B, 0x88C2, 0x0FBE,
+ 0x88C3, 0x19C6, 0x88C4, 0x19C7, 0x88C5, 0x0AF7, 0x88C6, 0x3789,
+ 0x88CA, 0x3B0F, 0x88CF, 0x0F6A, 0x88D2, 0x3B10, 0x88D4, 0x19C8,
+ 0x88D5, 0x0F1F, 0x88D8, 0x19C9, 0x88D9, 0x19CA, 0x88DB, 0x3B11,
+ 0x88DC, 0x0E34, 0x88DD, 0x19CB, 0x88DF, 0x0830, 0x88E1, 0x0F6B,
+ 0x88E8, 0x19D0, 0x88F0, 0x3B12, 0x88F1, 0x3B13, 0x88F2, 0x19D1,
+ 0x88F3, 0x09C0, 0x88F4, 0x19CF, 0x88F5, 0x21A7, 0x88F8, 0x0F51,
+ 0x88F9, 0x19CC, 0x88FC, 0x19CE, 0x88FD, 0x0A61, 0x88FE, 0x0A44,
+ 0x8902, 0x19CD, 0x8904, 0x19D2, 0x8906, 0x3B14, 0x8907, 0x0DF3,
+ 0x890A, 0x19D4, 0x890C, 0x19D3, 0x8910, 0x05CA, 0x8912, 0x0E59,
+ 0x8913, 0x19D5, 0x8918, 0x3B15, 0x8919, 0x3B16, 0x891A, 0x3B17,
+ 0x891C, 0x20A8, 0x891D, 0x19E1, 0x891E, 0x19D7, 0x8925, 0x19D8,
+ 0x8927, 0x3B18, 0x892A, 0x19D9, 0x892B, 0x19DA, 0x8930, 0x3B19,
+ 0x8936, 0x19DE, 0x8938, 0x19DF, 0x893B, 0x19DD, 0x893E, 0x3B1A,
+ 0x8941, 0x19DB, 0x8943, 0x19D6, 0x8944, 0x19DC, 0x894C, 0x19E0,
+ 0x894D, 0x1BD0, 0x8956, 0x0528, 0x895E, 0x19E3, 0x895F, 0x06D7,
+ 0x8960, 0x19E2, 0x8964, 0x19E5, 0x8966, 0x19E4, 0x896A, 0x19E7,
+ 0x896D, 0x19E6, 0x896F, 0x19E8, 0x8972, 0x093B, 0x8974, 0x19E9,
+ 0x8977, 0x19EA, 0x897B, 0x3B1B, 0x897E, 0x19EB, 0x897F, 0x0A62,
+ 0x8980, 0x362E, 0x8981, 0x0F41, 0x8983, 0x19EC, 0x8986, 0x0DF4,
+ 0x8987, 0x0CFC, 0x8988, 0x19ED, 0x898A, 0x19EE, 0x898B, 0x075F,
+ 0x898F, 0x0646, 0x8993, 0x19EF, 0x8996, 0x08B9, 0x8997, 0x0CF7,
+ 0x8998, 0x19F0, 0x899A, 0x05AE, 0x89A1, 0x19F1, 0x89A6, 0x19F3,
+ 0x89A7, 0x0F61, 0x89A9, 0x19F2, 0x89AA, 0x0A0C, 0x89AC, 0x19F4,
+ 0x89AF, 0x19F5, 0x89B2, 0x19F6, 0x89B3, 0x060D, 0x89BA, 0x19F7,
+ 0x89BD, 0x19F8, 0x89BF, 0x19F9, 0x89C0, 0x19FA, 0x89D2, 0x05AF,
+ 0x89D4, 0x3B1C, 0x89D6, 0x3B1D, 0x89DA, 0x19FB, 0x89DC, 0x19FC,
+ 0x89DD, 0x19FD, 0x89E3, 0x0572, 0x89E5, 0x3B1E, 0x89E6, 0x09EE,
+ 0x89E7, 0x19FE, 0x89F1, 0x3B1F, 0x89F4, 0x19FF, 0x89F8, 0x1A00,
+ 0x8A00, 0x0774, 0x8A01, 0x35BC, 0x8A02, 0x0C17, 0x8A03, 0x1A01,
+ 0x8A07, 0x3B20, 0x8A08, 0x072D, 0x8A0A, 0x0A1C, 0x8A0C, 0x1A04,
+ 0x8A0E, 0x0C7C, 0x8A0F, 0x3B21, 0x8A10, 0x1A03, 0x8A12, 0x21A8,
+ 0x8A13, 0x0707, 0x8A15, 0x3B22, 0x8A16, 0x1A02, 0x8A17, 0x0B57,
+ 0x8A18, 0x0647, 0x8A1B, 0x1A05, 0x8A1D, 0x1A06, 0x8A1F, 0x09C1,
+ 0x8A22, 0x3B23, 0x8A23, 0x0743, 0x8A25, 0x1A07, 0x8A2A, 0x0E5A,
+ 0x8A2D, 0x0A83, 0x8A31, 0x0690, 0x8A33, 0x0F01, 0x8A34, 0x0ACC,
+ 0x8A36, 0x1A08, 0x8A37, 0x21A9, 0x8A3A, 0x0A0D, 0x8A3B, 0x0BAE,
+ 0x8A3C, 0x09C2, 0x8A41, 0x1A09, 0x8A46, 0x1A0C, 0x8A48, 0x1A0D,
+ 0x8A4E, 0x3B24, 0x8A50, 0x082E, 0x8A51, 0x0B22, 0x8A52, 0x1A0B,
+ 0x8A54, 0x09C3, 0x8A55, 0x0DB0, 0x8A5B, 0x1A0A, 0x8A5E, 0x08BA,
+ 0x8A60, 0x04F5, 0x8A62, 0x1A11, 0x8A63, 0x072E, 0x8A66, 0x08BC,
+ 0x8A69, 0x08BB, 0x8A6B, 0x0FF3, 0x8A6C, 0x1A10, 0x8A6D, 0x1A0F,
+ 0x8A6E, 0x0AA9, 0x8A70, 0x0667, 0x8A71, 0x0FE9, 0x8A72, 0x0598,
+ 0x8A73, 0x09C4, 0x8A79, 0x21AA, 0x8A7C, 0x1A0E, 0x8A7F, 0x3B25,
+ 0x8A82, 0x1A13, 0x8A84, 0x1A14, 0x8A85, 0x1A12, 0x8A87, 0x078C,
+ 0x8A89, 0x0F2A, 0x8A8C, 0x08BD, 0x8A8D, 0x0CDD, 0x8A91, 0x1A17,
+ 0x8A93, 0x0A64, 0x8A95, 0x0B80, 0x8A98, 0x0F20, 0x8A9A, 0x1A1A,
+ 0x8A9E, 0x07A0, 0x8AA0, 0x0A63, 0x8AA1, 0x1A16, 0x8AA3, 0x1A1B,
+ 0x8AA4, 0x07A1, 0x8AA5, 0x1A18, 0x8AA6, 0x1A19, 0x8AA7, 0x21AB,
+ 0x8AA8, 0x1A15, 0x8AAA, 0x3638, 0x8AAC, 0x0A86, 0x8AAD, 0x0CA1,
+ 0x8AB0, 0x0B6D, 0x8AB2, 0x055D, 0x8AB9, 0x0D84, 0x8ABC, 0x065D,
+ 0x8ABE, 0x21AC, 0x8ABF, 0x0BD0, 0x8AC2, 0x1A1E, 0x8AC4, 0x1A1C,
+ 0x8AC7, 0x0B8A, 0x8ACB, 0x0A65, 0x8ACC, 0x060E, 0x8ACD, 0x1A1D,
+ 0x8ACF, 0x0A21, 0x8AD2, 0x0F92, 0x8AD6, 0x0FE6, 0x8ADA, 0x1A1F,
+ 0x8ADB, 0x1A2A, 0x8ADC, 0x0BD1, 0x8ADE, 0x1A29, 0x8ADF, 0x21AD,
+ 0x8AE0, 0x1A26, 0x8AE1, 0x1A2E, 0x8AE2, 0x1A27, 0x8AE4, 0x1A23,
+ 0x8AE6, 0x0C18, 0x8AE7, 0x1A22, 0x8AEB, 0x1A20, 0x8AED, 0x0F0B,
+ 0x8AEE, 0x08BE, 0x8AF1, 0x1A24, 0x8AF3, 0x1A21, 0x8AF4, 0x3B26,
+ 0x8AF6, 0x21AF, 0x8AF7, 0x1A28, 0x8AF8, 0x097E, 0x8AFA, 0x0775,
+ 0x8AFE, 0x0B5A, 0x8B00, 0x0E73, 0x8B01, 0x04FC, 0x8B02, 0x04A6,
+ 0x8B04, 0x0C7D, 0x8B07, 0x1A2C, 0x8B0C, 0x1A2B, 0x8B0E, 0x0CBE,
+ 0x8B10, 0x1A30, 0x8B14, 0x1A25, 0x8B16, 0x1A2F, 0x8B17, 0x1A31,
+ 0x8B19, 0x0760, 0x8B1A, 0x1A2D, 0x8B1B, 0x07E8, 0x8B1D, 0x0901,
+ 0x8B1F, 0x3B27, 0x8B20, 0x1A32, 0x8B21, 0x0F42, 0x8B26, 0x1A35,
+ 0x8B28, 0x1A38, 0x8B2B, 0x1A36, 0x8B2C, 0x0DA7, 0x8B33, 0x1A33,
+ 0x8B37, 0x3B28, 0x8B39, 0x06D8, 0x8B3E, 0x1A37, 0x8B41, 0x1A39,
+ 0x8B43, 0x3B29, 0x8B44, 0x3B2A, 0x8B49, 0x1A3D, 0x8B4C, 0x1A3A,
+ 0x8B4E, 0x1A3C, 0x8B4F, 0x1A3B, 0x8B53, 0x21B0, 0x8B54, 0x3B2B,
+ 0x8B56, 0x1A3E, 0x8B58, 0x08DD, 0x8B5A, 0x1A40, 0x8B5B, 0x1A3F,
+ 0x8B5C, 0x0DDA, 0x8B5F, 0x1A42, 0x8B66, 0x072F, 0x8B6B, 0x1A41,
+ 0x8B6C, 0x1A43, 0x8B6F, 0x1A44, 0x8B70, 0x065E, 0x8B71, 0x182E,
+ 0x8B72, 0x09E1, 0x8B74, 0x1A45, 0x8B77, 0x07A2, 0x8B7D, 0x1A46,
+ 0x8B7F, 0x21B1, 0x8B80, 0x1A47, 0x8B83, 0x088C, 0x8B8A, 0x13D3,
+ 0x8B8C, 0x1A48, 0x8B8E, 0x1A49, 0x8B90, 0x093C, 0x8B92, 0x1A4A,
+ 0x8B93, 0x1A4B, 0x8B96, 0x1A4C, 0x8B99, 0x1A4D, 0x8B9A, 0x1A4E,
+ 0x8B9C, 0x3B2C, 0x8B9E, 0x3B2D, 0x8C37, 0x0B69, 0x8C3A, 0x1A4F,
+ 0x8C3F, 0x1A51, 0x8C41, 0x1A50, 0x8C46, 0x0C7E, 0x8C47, 0x3B2E,
+ 0x8C48, 0x1A52, 0x8C4A, 0x0E5B, 0x8C4C, 0x1A53, 0x8C4E, 0x1A54,
+ 0x8C50, 0x1A55, 0x8C54, 0x3B2F, 0x8C55, 0x1A56, 0x8C5A, 0x0CB2,
+ 0x8C61, 0x09C5, 0x8C62, 0x1A57, 0x8C6A, 0x07FD, 0x8C6B, 0x1007,
+ 0x8C6C, 0x1A58, 0x8C73, 0x3B30, 0x8C78, 0x1A59, 0x8C79, 0x0DB1,
+ 0x8C7A, 0x1A5A, 0x8C7C, 0x1A62, 0x8C82, 0x1A5B, 0x8C85, 0x1A5D,
+ 0x8C89, 0x1A5C, 0x8C8A, 0x1A5E, 0x8C8C, 0x0E74, 0x8C8D, 0x1A5F,
+ 0x8C8E, 0x1A60, 0x8C94, 0x1A61, 0x8C98, 0x1A63, 0x8C9D, 0x058B,
+ 0x8C9E, 0x0C03, 0x8CA0, 0x0DDB, 0x8CA1, 0x0852, 0x8CA2, 0x07E9,
+ 0x8CA4, 0x3B31, 0x8CA7, 0x0DC1, 0x8CA8, 0x055F, 0x8CA9, 0x0D62,
+ 0x8CAA, 0x1A66, 0x8CAB, 0x060F, 0x8CAC, 0x0A79, 0x8CAD, 0x1A65,
+ 0x8CAE, 0x1A6A, 0x8CAF, 0x0BB7, 0x8CB0, 0x0EEF, 0x8CB2, 0x1A68,
+ 0x8CB3, 0x1A69, 0x8CB4, 0x0648, 0x8CB6, 0x1A6B, 0x8CB7, 0x0D19,
+ 0x8CB8, 0x0B3F, 0x8CBB, 0x0D85, 0x8CBC, 0x0C37, 0x8CBD, 0x1A67,
+ 0x8CBF, 0x0E75, 0x8CC0, 0x056C, 0x8CC1, 0x1A6D, 0x8CC2, 0x0FCE,
+ 0x8CC3, 0x0BDE, 0x8CC4, 0x0FEB, 0x8CC7, 0x08BF, 0x8CC8, 0x1A6C,
+ 0x8CCA, 0x0B11, 0x8CCD, 0x1A7D, 0x8CCE, 0x0AAA, 0x8CD1, 0x0CD0,
+ 0x8CD3, 0x0DC2, 0x8CD9, 0x3B32, 0x8CDA, 0x1A70, 0x8CDB, 0x088D,
+ 0x8CDC, 0x08C0, 0x8CDE, 0x09C6, 0x8CE0, 0x0D1B, 0x8CE1, 0x3B33,
+ 0x8CE2, 0x0761, 0x8CE3, 0x1A6F, 0x8CE4, 0x1A6E, 0x8CE6, 0x0DDC,
+ 0x8CEA, 0x08ED, 0x8CED, 0x0C4C, 0x8CF0, 0x21B2, 0x8CF4, 0x21B3,
+ 0x8CF8, 0x3B34, 0x8CFA, 0x1A72, 0x8CFB, 0x1A73, 0x8CFC, 0x07EA,
+ 0x8CFD, 0x1A71, 0x8CFE, 0x3B35, 0x8D04, 0x1A74, 0x8D05, 0x1A75,
+ 0x8D07, 0x1A77, 0x8D08, 0x0B03, 0x8D0A, 0x1A76, 0x8D0B, 0x0622,
+ 0x8D0D, 0x1A79, 0x8D0F, 0x1A78, 0x8D10, 0x1A7A, 0x8D12, 0x21B4,
+ 0x8D13, 0x1A7C, 0x8D14, 0x1A7E, 0x8D16, 0x1A7F, 0x8D1B, 0x3B36,
+ 0x8D64, 0x0A7A, 0x8D66, 0x08FB, 0x8D67, 0x1A80, 0x8D69, 0x3B37,
+ 0x8D6B, 0x05B0, 0x8D6C, 0x3B38, 0x8D6D, 0x1A81, 0x8D70, 0x0AF8,
+ 0x8D71, 0x1A82, 0x8D73, 0x1A83, 0x8D74, 0x0DDD, 0x8D76, 0x21B5,
+ 0x8D77, 0x0649, 0x8D81, 0x1A84, 0x8D84, 0x3B39, 0x8D85, 0x0BD2,
+ 0x8D8A, 0x04FD, 0x8D8D, 0x3B3A, 0x8D95, 0x3B3B, 0x8D99, 0x1A85,
+ 0x8DA3, 0x091D, 0x8DA6, 0x3B3C, 0x8DA8, 0x0A3C, 0x8DB3, 0x0B0D,
+ 0x8DBA, 0x1A88, 0x8DBE, 0x1A87, 0x8DC2, 0x1A86, 0x8DC6, 0x3B3D,
+ 0x8DCB, 0x1A8E, 0x8DCC, 0x1A8C, 0x8DCE, 0x3B3E, 0x8DCF, 0x1A89,
+ 0x8DD6, 0x1A8B, 0x8DDA, 0x1A8A, 0x8DDB, 0x1A8D, 0x8DDD, 0x0691,
+ 0x8DDF, 0x1A91, 0x8DE1, 0x0A7B, 0x8DE3, 0x1A92, 0x8DE4, 0x3B3F,
+ 0x8DE8, 0x078D, 0x8DEA, 0x1A8F, 0x8DEB, 0x1A90, 0x8DEC, 0x3B40,
+ 0x8DEF, 0x0FCF, 0x8DF3, 0x0BD3, 0x8DF5, 0x0AAB, 0x8DFC, 0x1A93,
+ 0x8DFF, 0x1A96, 0x8E08, 0x1A94, 0x8E09, 0x1A95, 0x8E0A, 0x0F43,
+ 0x8E0F, 0x0C7F, 0x8E10, 0x1A99, 0x8E1D, 0x1A97, 0x8E1E, 0x1A98,
+ 0x8E1F, 0x1A9A, 0x8E20, 0x3B41, 0x8E2A, 0x1AA8, 0x8E30, 0x1A9D,
+ 0x8E34, 0x1A9E, 0x8E35, 0x1A9C, 0x8E42, 0x1A9B, 0x8E44, 0x0C19,
+ 0x8E47, 0x1AA0, 0x8E48, 0x1AA4, 0x8E49, 0x1AA1, 0x8E4A, 0x1A9F,
+ 0x8E4B, 0x3B42, 0x8E4C, 0x1AA2, 0x8E50, 0x1AA3, 0x8E55, 0x1AAA,
+ 0x8E59, 0x1AA5, 0x8E5F, 0x0A7C, 0x8E60, 0x1AA7, 0x8E63, 0x1AA9,
+ 0x8E64, 0x1AA6, 0x8E6C, 0x3B43, 0x8E70, 0x3B44, 0x8E72, 0x1AAC,
+ 0x8E74, 0x093D, 0x8E76, 0x1AAB, 0x8E7A, 0x3B45, 0x8E7C, 0x1AAD,
+ 0x8E81, 0x1AAE, 0x8E84, 0x1AB1, 0x8E85, 0x1AB0, 0x8E87, 0x1AAF,
+ 0x8E8A, 0x1AB3, 0x8E8B, 0x1AB2, 0x8E8D, 0x0F02, 0x8E91, 0x1AB5,
+ 0x8E92, 0x3B46, 0x8E93, 0x1AB4, 0x8E94, 0x1AB6, 0x8E99, 0x1AB7,
+ 0x8EA1, 0x1AB9, 0x8EAA, 0x1AB8, 0x8EAB, 0x0A0E, 0x8EAC, 0x1ABA,
+ 0x8EAE, 0x3B47, 0x8EAF, 0x06E5, 0x8EB0, 0x1ABB, 0x8EB1, 0x1ABD,
+ 0x8EB3, 0x3B48, 0x8EB6, 0x3703, 0x8EBE, 0x1ABE, 0x8EC0, 0x1DEF,
+ 0x8EC5, 0x1ABF, 0x8EC6, 0x1ABC, 0x8EC8, 0x1AC0, 0x8ECA, 0x0902,
+ 0x8ECB, 0x1AC1, 0x8ECC, 0x064A, 0x8ECD, 0x0709, 0x8ECF, 0x21B7,
+ 0x8ED1, 0x3B49, 0x8ED2, 0x0762, 0x8ED4, 0x3B4A, 0x8EDB, 0x1AC2,
+ 0x8EDF, 0x0CC8, 0x8EE2, 0x0C38, 0x8EE3, 0x1AC3, 0x8EEB, 0x1AC6,
+ 0x8EF8, 0x08E0, 0x8EF9, 0x3B4B, 0x8EFB, 0x1AC5, 0x8EFC, 0x1AC4,
+ 0x8EFD, 0x0730, 0x8EFE, 0x1AC7, 0x8F03, 0x05B1, 0x8F05, 0x1AC9,
+ 0x8F09, 0x084C, 0x8F0A, 0x1AC8, 0x8F0C, 0x1AD1, 0x8F12, 0x1ACB,
+ 0x8F13, 0x1ACD, 0x8F14, 0x0E35, 0x8F15, 0x1ACA, 0x8F17, 0x3B4C,
+ 0x8F19, 0x1ACC, 0x8F1B, 0x1AD0, 0x8F1C, 0x1ACE, 0x8F1D, 0x064B,
+ 0x8F1F, 0x1ACF, 0x8F26, 0x1AD2, 0x8F29, 0x0D10, 0x8F2A, 0x0FA0,
+ 0x8F2F, 0x093E, 0x8F33, 0x1AD3, 0x8F36, 0x3B4D, 0x8F38, 0x0F0C,
+ 0x8F39, 0x1AD5, 0x8F3B, 0x1AD4, 0x8F3E, 0x1AD8, 0x8F3F, 0x0F2B,
+ 0x8F42, 0x1AD7, 0x8F44, 0x05CB, 0x8F45, 0x1AD6, 0x8F46, 0x1ADB,
+ 0x8F49, 0x1ADA, 0x8F4C, 0x1AD9, 0x8F4D, 0x0C2C, 0x8F4E, 0x1ADC,
+ 0x8F57, 0x1ADD, 0x8F5C, 0x1ADE, 0x8F5F, 0x07FE, 0x8F61, 0x06FB,
+ 0x8F62, 0x1ADF, 0x8F63, 0x1AE0, 0x8F64, 0x1AE1, 0x8F9B, 0x0A0F,
+ 0x8F9C, 0x1AE2, 0x8F9E, 0x08D9, 0x8F9F, 0x1AE3, 0x8FA3, 0x1AE4,
+ 0x8FA6, 0x3B4E, 0x8FA7, 0x10B6, 0x8FA8, 0x10B5, 0x8FAD, 0x1AE5,
+ 0x8FAE, 0x17FF, 0x8FAF, 0x1AE6, 0x8FB0, 0x0B62, 0x8FB1, 0x09F1,
+ 0x8FB2, 0x0CF6, 0x8FB5, 0x3B4F, 0x8FB6, 0x3B50, 0x8FB7, 0x1AE7,
+ 0x8FBA, 0x0E25, 0x8FBB, 0x0BF0, 0x8FBC, 0x0810, 0x8FBF, 0x0B67,
+ 0x8FC2, 0x04CC, 0x8FC4, 0x0EA6, 0x8FC5, 0x0A1D, 0x8FC6, 0x3B51,
+ 0x8FC8, 0x3799, 0x8FCE, 0x0734, 0x8FD1, 0x06D9, 0x8FD4, 0x0E26,
+ 0x8FDA, 0x1AE8, 0x8FE0, 0x3B52, 0x8FE2, 0x1AEA, 0x8FE4, 0x3B53,
+ 0x8FE5, 0x1AE9, 0x8FE6, 0x0560, 0x8FE9, 0x0CCE, 0x8FEA, 0x1AEB,
+ 0x8FEB, 0x0D2D, 0x8FED, 0x0C2D, 0x8FEF, 0x1AEC, 0x8FF0, 0x095C,
+ 0x8FF4, 0x1AEE, 0x8FF6, 0x3B54, 0x8FF7, 0x0ECE, 0x8FF8, 0x1AFD,
+ 0x8FF9, 0x1AF0, 0x8FFA, 0x1AF1, 0x8FFD, 0x0BE5, 0x9000, 0x0B40,
+ 0x9001, 0x0AF9, 0x9002, 0x3B55, 0x9003, 0x0C80, 0x9005, 0x1AEF,
+ 0x9006, 0x066F, 0x900B, 0x1AF8, 0x900D, 0x1AF5, 0x900E, 0x1B02,
+ 0x900F, 0x0C81, 0x9010, 0x0B9E, 0x9011, 0x1AF2, 0x9013, 0x0C1A,
+ 0x9014, 0x0C4D, 0x9015, 0x1AF3, 0x9016, 0x1AF7, 0x9017, 0x0A26,
+ 0x9019, 0x0D1D, 0x901A, 0x0BE8, 0x901D, 0x0A66, 0x901E, 0x1AF6,
+ 0x901F, 0x0B0E, 0x9020, 0x0B04, 0x9021, 0x1AF4, 0x9022, 0x046D,
+ 0x9023, 0x0FC8, 0x9027, 0x1AF9, 0x902C, 0x3B56, 0x902E, 0x0B41,
+ 0x9031, 0x093F, 0x9032, 0x0A10, 0x9035, 0x1AFB, 0x9036, 0x1AFA,
+ 0x9038, 0x04B3, 0x9039, 0x1AFC, 0x903C, 0x0DA1, 0x903E, 0x1B04,
+ 0x9041, 0x0CB3, 0x9042, 0x0A31, 0x9044, 0x3B57, 0x9045, 0x0B97,
+ 0x9047, 0x06F0, 0x9049, 0x1B03, 0x904A, 0x0F21, 0x904B, 0x04E1,
+ 0x904D, 0x0E27, 0x904E, 0x0561, 0x904F, 0x1AFE, 0x9050, 0x1AFF,
+ 0x9051, 0x1B00, 0x9052, 0x1B01, 0x9053, 0x0C93, 0x9054, 0x0B61,
+ 0x9055, 0x04A7, 0x9056, 0x1B05, 0x9058, 0x1B06, 0x9059, 0x1D34,
+ 0x905C, 0x0B1D, 0x905E, 0x1B07, 0x9060, 0x0515, 0x9061, 0x0ACE,
+ 0x9063, 0x0763, 0x9065, 0x0F44, 0x9067, 0x21BA, 0x9068, 0x1B08,
+ 0x9069, 0x0C26, 0x906D, 0x0AFA, 0x906E, 0x0903, 0x906F, 0x1B09,
+ 0x9072, 0x1B0C, 0x9075, 0x096F, 0x9076, 0x1B0A, 0x9077, 0x0AAD,
+ 0x9078, 0x0AAC, 0x907A, 0x04A8, 0x907C, 0x0F93, 0x907D, 0x1B0E,
+ 0x907F, 0x0D86, 0x9080, 0x1B10, 0x9081, 0x1B0F, 0x9082, 0x1B0D,
+ 0x9083, 0x1737, 0x9084, 0x0610, 0x9087, 0x1AED, 0x9088, 0x3B58,
+ 0x9089, 0x1B12, 0x908A, 0x1B11, 0x908F, 0x1B13, 0x9091, 0x0F22,
+ 0x9095, 0x3B59, 0x9099, 0x3B5A, 0x909B, 0x3B5B, 0x90A2, 0x3B5C,
+ 0x90A3, 0x0CB9, 0x90A6, 0x0E5C, 0x90A8, 0x1B14, 0x90AA, 0x0905,
+ 0x90AF, 0x1B15, 0x90B1, 0x1B16, 0x90B4, 0x3B5D, 0x90B5, 0x1B17,
+ 0x90B8, 0x0C1B, 0x90C1, 0x04AE, 0x90CA, 0x07EB, 0x90CE, 0x0FE0,
+ 0x90D7, 0x3B5E, 0x90DB, 0x1B1B, 0x90DD, 0x3B5F, 0x90DE, 0x21BB,
+ 0x90E1, 0x070A, 0x90E2, 0x1B18, 0x90E4, 0x1B19, 0x90E8, 0x0DE6,
+ 0x90ED, 0x05B2, 0x90F4, 0x3B60, 0x90F5, 0x0F23, 0x90F7, 0x06B7,
+ 0x90FD, 0x0C4E, 0x9102, 0x1B1C, 0x9112, 0x1B1D, 0x9115, 0x21BD,
+ 0x9117, 0x3B61, 0x9119, 0x1B1E, 0x911C, 0x3B62, 0x9127, 0x21BE,
+ 0x912D, 0x0C1C, 0x9130, 0x1B20, 0x9131, 0x3B63, 0x9132, 0x1B1F,
+ 0x913A, 0x3B64, 0x913D, 0x3B65, 0x9148, 0x3B66, 0x9149, 0x0CAB,
+ 0x914A, 0x1B21, 0x914B, 0x0940, 0x914C, 0x090C, 0x914D, 0x0D11,
+ 0x914E, 0x0BAF, 0x9152, 0x091E, 0x9154, 0x0A32, 0x9156, 0x1B22,
+ 0x9158, 0x1B23, 0x915B, 0x3B67, 0x9161, 0x3B68, 0x9162, 0x0A23,
+ 0x9163, 0x1B24, 0x9164, 0x3B69, 0x9165, 0x1B25, 0x9169, 0x1B26,
+ 0x916A, 0x0F59, 0x916C, 0x0941, 0x9172, 0x1B28, 0x9173, 0x1B27,
+ 0x9175, 0x07EC, 0x9177, 0x0805, 0x9178, 0x088E, 0x9182, 0x1B2B,
+ 0x9187, 0x0970, 0x9189, 0x1B2A, 0x918B, 0x1B29, 0x918D, 0x0B49,
+ 0x918E, 0x3B6A, 0x9190, 0x07A3, 0x9192, 0x0A67, 0x9197, 0x0D44,
+ 0x919C, 0x0943, 0x919E, 0x3B6B, 0x91A2, 0x1B2C, 0x91A4, 0x09C7,
+ 0x91A8, 0x3B6C, 0x91AA, 0x1B2F, 0x91AB, 0x1B2D, 0x91AC, 0x1E1B,
+ 0x91AD, 0x3B6D, 0x91AE, 0x3B6E, 0x91AF, 0x1B2E, 0x91B1, 0x1E61,
+ 0x91B2, 0x3B6F, 0x91B4, 0x1B31, 0x91B5, 0x1B30, 0x91B8, 0x09E2,
+ 0x91BA, 0x1B32, 0x91BC, 0x3B70, 0x91C0, 0x1B33, 0x91C1, 0x1B34,
+ 0x91C6, 0x0D64, 0x91C7, 0x0843, 0x91C8, 0x090D, 0x91C9, 0x1B35,
+ 0x91CB, 0x1B36, 0x91CC, 0x0F6C, 0x91CD, 0x094F, 0x91CE, 0x0EFA,
+ 0x91CF, 0x0F94, 0x91D0, 0x1B37, 0x91D1, 0x06DA, 0x91D6, 0x1B38,
+ 0x91D7, 0x21C0, 0x91D8, 0x0C1D, 0x91DA, 0x21BF, 0x91DB, 0x1B3B,
+ 0x91DC, 0x05D6, 0x91DD, 0x0A11, 0x91DE, 0x21C1, 0x91DF, 0x1B39,
+ 0x91E1, 0x1B3A, 0x91E3, 0x0BFC, 0x91E4, 0x21C4, 0x91E5, 0x21C5,
+ 0x91E6, 0x0E83, 0x91E7, 0x06F4, 0x91ED, 0x21C2, 0x91EE, 0x21C3,
+ 0x91F0, 0x3B71, 0x91F5, 0x1B3D, 0x91F6, 0x1B3E, 0x91F7, 0x3B72,
+ 0x91FB, 0x3B73, 0x91FC, 0x1B3C, 0x91FF, 0x1B40, 0x9206, 0x21C6,
+ 0x9207, 0x3B74, 0x920A, 0x21C8, 0x920D, 0x0CB7, 0x920E, 0x05A1,
+ 0x9210, 0x21C7, 0x9211, 0x1B44, 0x9214, 0x1B41, 0x9215, 0x1B43,
+ 0x921E, 0x1B3F, 0x9228, 0x3B75, 0x9229, 0x1B8A, 0x922C, 0x1B42,
+ 0x9233, 0x3B76, 0x9234, 0x0FB3, 0x9237, 0x078E, 0x9238, 0x3B77,
+ 0x9239, 0x21CF, 0x923A, 0x21C9, 0x923C, 0x21CB, 0x923F, 0x1B4C,
+ 0x9240, 0x21CA, 0x9243, 0x3B78, 0x9244, 0x0C2E, 0x9245, 0x1B47,
+ 0x9247, 0x3B79, 0x9248, 0x1B4A, 0x9249, 0x1B48, 0x924B, 0x1B4D,
+ 0x924E, 0x21CC, 0x924F, 0x3B7A, 0x9250, 0x1B4E, 0x9251, 0x21CE,
+ 0x9257, 0x1B46, 0x9259, 0x21CD, 0x925A, 0x1B53, 0x925B, 0x0516,
+ 0x925E, 0x1B45, 0x9260, 0x3B7B, 0x9262, 0x0D41, 0x9264, 0x1B49,
+ 0x9266, 0x09C8, 0x9267, 0x21D0, 0x9271, 0x07ED, 0x9277, 0x21D2,
+ 0x9278, 0x21D3, 0x927E, 0x0E76, 0x9280, 0x06DC, 0x9283, 0x0950,
+ 0x9285, 0x0C94, 0x9288, 0x20AA, 0x9291, 0x0AAF, 0x9293, 0x1B51,
+ 0x9295, 0x1B4B, 0x9296, 0x1B50, 0x9298, 0x0ECF, 0x929A, 0x0BD4,
+ 0x929B, 0x1B52, 0x929C, 0x1B4F, 0x92A7, 0x21D1, 0x92AD, 0x0AAE,
+ 0x92B3, 0x3554, 0x92B7, 0x1B56, 0x92B9, 0x1B55, 0x92C2, 0x3B7C,
+ 0x92CB, 0x3B7D, 0x92CC, 0x3B7E, 0x92CF, 0x1B54, 0x92D0, 0x21D7,
+ 0x92D2, 0x0E5D, 0x92D3, 0x21DB, 0x92D5, 0x21D9, 0x92D7, 0x21D5,
+ 0x92D9, 0x21D6, 0x92DF, 0x3B7F, 0x92E0, 0x21DA, 0x92E4, 0x0985,
+ 0x92E7, 0x21D4, 0x92E9, 0x1B57, 0x92EA, 0x0E2F, 0x92ED, 0x04F6,
+ 0x92F2, 0x0DB8, 0x92F3, 0x0BB0, 0x92F8, 0x0692, 0x92F9, 0x20B0,
+ 0x92FA, 0x1B59, 0x92FB, 0x21DE, 0x92FC, 0x07EF, 0x92FF, 0x21E1,
+ 0x9302, 0x21E3, 0x9304, 0x345A, 0x9306, 0x087A, 0x930D, 0x3B80,
+ 0x930F, 0x1B58, 0x9310, 0x0A33, 0x9315, 0x3B81, 0x9318, 0x0A34,
+ 0x9319, 0x1B5C, 0x931A, 0x1B5E, 0x931D, 0x21E2, 0x931E, 0x21E0,
+ 0x931F, 0x3B82, 0x9320, 0x09E3, 0x9321, 0x21DD, 0x9322, 0x1B5D,
+ 0x9323, 0x1B5F, 0x9325, 0x21DC, 0x9326, 0x06CB, 0x9327, 0x3B83,
+ 0x9328, 0x0DB7, 0x932B, 0x090E, 0x932C, 0x0FC9, 0x932E, 0x1B5B,
+ 0x932F, 0x0868, 0x9332, 0x0FE5, 0x9335, 0x1B61, 0x933A, 0x1B60,
+ 0x933B, 0x1B62, 0x9344, 0x1B5A, 0x9347, 0x3B84, 0x9348, 0x20A9,
+ 0x934A, 0x3458, 0x934B, 0x0CC1, 0x934D, 0x0C4F, 0x9352, 0x3B85,
+ 0x9354, 0x0BF3, 0x9356, 0x1B67, 0x9357, 0x21E5, 0x935B, 0x0B81,
+ 0x935C, 0x1B63, 0x9360, 0x1B64, 0x9365, 0x3B86, 0x936A, 0x3B87,
+ 0x936C, 0x0703, 0x936D, 0x3B88, 0x936E, 0x1B66, 0x9370, 0x21E4,
+ 0x9375, 0x0764, 0x937C, 0x1B65, 0x937E, 0x09C9, 0x938C, 0x05D7,
+ 0x9394, 0x1B6B, 0x9396, 0x082F, 0x9397, 0x0AFB, 0x939A, 0x0BE6,
+ 0x939B, 0x3B89, 0x93A4, 0x21E6, 0x93A7, 0x0599, 0x93A9, 0x3B8B,
+ 0x93AC, 0x1B69, 0x93AD, 0x1B6A, 0x93AE, 0x0BDF, 0x93B0, 0x1B68,
+ 0x93B9, 0x1B6C, 0x93BA, 0x3B8A, 0x93C1, 0x3B8C, 0x93C3, 0x1B72,
+ 0x93C6, 0x21E7, 0x93C8, 0x1B75, 0x93CA, 0x3B8D, 0x93D0, 0x1B74,
+ 0x93D1, 0x0C27, 0x93D6, 0x1B6D, 0x93D7, 0x1B6E, 0x93D8, 0x1B71,
+ 0x93DD, 0x1B73, 0x93DE, 0x21E8, 0x93E1, 0x06B8, 0x93E2, 0x3B8E,
+ 0x93E4, 0x1B76, 0x93E5, 0x1B70, 0x93E8, 0x1B6F, 0x93F8, 0x21E9,
+ 0x93FA, 0x3B8F, 0x93FD, 0x3B90, 0x9403, 0x1B7A, 0x9407, 0x1B7B,
+ 0x940F, 0x3B91, 0x9410, 0x1B7C, 0x9413, 0x1B79, 0x9414, 0x1B78,
+ 0x9418, 0x09CA, 0x9419, 0x0C82, 0x941A, 0x1B77, 0x9421, 0x1B80,
+ 0x942B, 0x1B7E, 0x9431, 0x21EA, 0x9434, 0x3B92, 0x9435, 0x1B7F,
+ 0x9436, 0x1B7D, 0x9438, 0x0B58, 0x943A, 0x1B81, 0x943F, 0x3B93,
+ 0x9441, 0x1B82, 0x9444, 0x1B84, 0x9445, 0x21EB, 0x9448, 0x21EC,
+ 0x9451, 0x0611, 0x9452, 0x1B83, 0x9453, 0x0F06, 0x9455, 0x3B94,
+ 0x945A, 0x1B8F, 0x945B, 0x1B85, 0x945E, 0x1B88, 0x9460, 0x1B86,
+ 0x9462, 0x1B87, 0x946A, 0x1B89, 0x946B, 0x3B95, 0x9470, 0x1B8B,
+ 0x9472, 0x3B96, 0x9475, 0x1B8C, 0x9477, 0x1B8D, 0x947C, 0x1B90,
+ 0x947D, 0x1B8E, 0x947E, 0x1B91, 0x947F, 0x1B93, 0x9481, 0x1B92,
+ 0x9577, 0x0BD5, 0x9578, 0x3B97, 0x9580, 0x0EF3, 0x9582, 0x1B94,
+ 0x9583, 0x0AB0, 0x9587, 0x1B95, 0x9589, 0x0E14, 0x958A, 0x1B96,
+ 0x958B, 0x0589, 0x958F, 0x04DE, 0x9591, 0x0613, 0x9592, 0x21ED,
+ 0x9593, 0x0612, 0x9594, 0x1B97, 0x9596, 0x1B98, 0x9598, 0x1B99,
+ 0x9599, 0x1B9A, 0x95A0, 0x1B9B, 0x95A2, 0x0614, 0x95A3, 0x05B3,
+ 0x95A4, 0x07F0, 0x95A5, 0x0D4A, 0x95A6, 0x3B98, 0x95A7, 0x1B9D,
+ 0x95A8, 0x1B9C, 0x95A9, 0x3B99, 0x95AB, 0x3B9A, 0x95AD, 0x1B9E,
+ 0x95B1, 0x3555, 0x95B2, 0x04FE, 0x95B4, 0x3B9B, 0x95B9, 0x1BA1,
+ 0x95BB, 0x1BA0, 0x95BC, 0x1B9F, 0x95BD, 0x3B9C, 0x95BE, 0x1BA2,
+ 0x95C3, 0x1BA5, 0x95C7, 0x048B, 0x95CA, 0x1BA3, 0x95CC, 0x1BA7,
+ 0x95CD, 0x1BA6, 0x95D4, 0x1BA9, 0x95D5, 0x1BA8, 0x95D6, 0x1BAA,
+ 0x95D8, 0x0C86, 0x95DA, 0x3B9D, 0x95DC, 0x1BAB, 0x95E1, 0x1BAC,
+ 0x95E2, 0x1BAE, 0x95E5, 0x1BAD, 0x961C, 0x0DDE, 0x961D, 0x3B9E,
+ 0x9621, 0x1BAF, 0x9628, 0x1BB0, 0x962A, 0x0855, 0x962E, 0x1BB1,
+ 0x962F, 0x1BB2, 0x9632, 0x0E77, 0x963B, 0x0ACD, 0x963F, 0x0468,
+ 0x9640, 0x0B2B, 0x9641, 0x3B9F, 0x9642, 0x1BB3, 0x9644, 0x0DDF,
+ 0x964B, 0x1BB6, 0x964C, 0x1BB4, 0x964D, 0x07F1, 0x964F, 0x1BB5,
+ 0x9650, 0x0776, 0x9658, 0x3BA0, 0x965B, 0x0E15, 0x965C, 0x1BB8,
+ 0x965D, 0x1BBA, 0x965E, 0x1BB9, 0x965F, 0x1BBB, 0x9662, 0x04C3,
+ 0x9663, 0x0A1E, 0x9664, 0x0986, 0x9665, 0x0615, 0x9666, 0x1BBC,
+ 0x966A, 0x0D1C, 0x966C, 0x1BBE, 0x9670, 0x04C4, 0x9672, 0x1BBD,
+ 0x9673, 0x0BE0, 0x9675, 0x0F95, 0x9676, 0x0C83, 0x9677, 0x1BB7,
+ 0x9678, 0x0F6E, 0x967A, 0x0765, 0x967D, 0x0F45, 0x9684, 0x3BA1,
+ 0x9685, 0x06F1, 0x9686, 0x0F7C, 0x9688, 0x06FE, 0x968A, 0x0B42,
+ 0x968B, 0x186C, 0x968D, 0x1BBF, 0x968E, 0x058A, 0x968F, 0x0A35,
+ 0x9694, 0x05B4, 0x9695, 0x1BC1, 0x9697, 0x1BC2, 0x9698, 0x1BC0,
+ 0x9699, 0x073A, 0x969B, 0x084D, 0x969C, 0x09CB, 0x969D, 0x21F0,
+ 0x96A0, 0x04C5, 0x96A3, 0x0FA1, 0x96A4, 0x3BA2, 0x96A7, 0x1BC4,
+ 0x96A8, 0x1B0B, 0x96A9, 0x3BA3, 0x96AA, 0x1BC3, 0x96AF, 0x21F1,
+ 0x96B0, 0x1BC7, 0x96B1, 0x1BC5, 0x96B2, 0x1BC6, 0x96B4, 0x1BC8,
+ 0x96B6, 0x1BC9, 0x96B7, 0x0FB4, 0x96B8, 0x1BCA, 0x96B9, 0x1BCB,
+ 0x96BB, 0x0A6D, 0x96BC, 0x0D4F, 0x96C0, 0x0A43, 0x96C1, 0x0623,
+ 0x96C4, 0x0F24, 0x96C5, 0x056D, 0x96C6, 0x0942, 0x96C7, 0x078F,
+ 0x96C9, 0x1BCE, 0x96CB, 0x1BCD, 0x96CC, 0x08C1, 0x96CD, 0x1BCF,
+ 0x96CE, 0x1BCC, 0x96D1, 0x0876, 0x96D2, 0x3BA4, 0x96D5, 0x1BD3,
+ 0x96D6, 0x1992, 0x96D9, 0x10EB, 0x96DB, 0x0A3D, 0x96DC, 0x1BD1,
+ 0x96DE, 0x3BA6, 0x96E2, 0x0F6D, 0x96E3, 0x0CC9, 0x96E8, 0x04CD,
+ 0x96E9, 0x3BA7, 0x96EA, 0x0A87, 0x96EB, 0x08E2, 0x96F0, 0x0E07,
+ 0x96F1, 0x3BA8, 0x96F2, 0x04E2, 0x96F6, 0x0FB5, 0x96F7, 0x0F55,
+ 0x96F9, 0x1BD4, 0x96FB, 0x0C3F, 0x9700, 0x0927, 0x9702, 0x3BA9,
+ 0x9704, 0x1BD5, 0x9706, 0x1BD6, 0x9707, 0x0A12, 0x9708, 0x1BD7,
+ 0x9709, 0x3BAA, 0x970A, 0x0FB6, 0x970D, 0x1BD2, 0x970E, 0x1BD9,
+ 0x970F, 0x1BDB, 0x9711, 0x1BDA, 0x9713, 0x1BD8, 0x9716, 0x1BDC,
+ 0x9719, 0x1BDD, 0x971C, 0x0AFC, 0x971E, 0x0562, 0x9724, 0x1BDE,
+ 0x9727, 0x0EC4, 0x972A, 0x1BDF, 0x9730, 0x1BE0, 0x9732, 0x0FD0,
+ 0x9733, 0x21F2, 0x9738, 0x1414, 0x9739, 0x1BE1, 0x973B, 0x21F3,
+ 0x973D, 0x1BE2, 0x973E, 0x1BE3, 0x9742, 0x1BE7, 0x9743, 0x21F4,
+ 0x9744, 0x1BE4, 0x9746, 0x1BE5, 0x9748, 0x1BE6, 0x9749, 0x1BE8,
+ 0x974D, 0x21F5, 0x974F, 0x21F6, 0x9751, 0x21F7, 0x9752, 0x0A68,
+ 0x9755, 0x21F8, 0x9756, 0x0F03, 0x9759, 0x0A69, 0x975A, 0x3BAB,
+ 0x975C, 0x1BE9, 0x975E, 0x0D87, 0x9760, 0x1BEA, 0x9761, 0x1D06,
+ 0x9762, 0x0ED8, 0x9763, 0x3BAC, 0x9764, 0x1BEB, 0x9766, 0x1BEC,
+ 0x9768, 0x1BED, 0x9769, 0x05B5, 0x976B, 0x1BEF, 0x976D, 0x0A1F,
+ 0x976E, 0x3BAD, 0x9771, 0x1BF0, 0x9773, 0x3BAE, 0x9774, 0x06FA,
+ 0x9779, 0x1BF1, 0x977A, 0x1BF5, 0x977C, 0x1BF3, 0x9781, 0x1BF4,
+ 0x9784, 0x05D1, 0x9785, 0x1BF2, 0x9786, 0x1BF6, 0x978B, 0x1BF7,
+ 0x978D, 0x048C, 0x978F, 0x1BF8, 0x9790, 0x1BF9, 0x9798, 0x09CC,
+ 0x979A, 0x3BAF, 0x979C, 0x1BFA, 0x97A0, 0x0661, 0x97A2, 0x3BB0,
+ 0x97A3, 0x1BFD, 0x97A6, 0x1BFC, 0x97A8, 0x1BFB, 0x97AB, 0x1A34,
+ 0x97AD, 0x0E2C, 0x97B3, 0x1BFE, 0x97B4, 0x1BFF, 0x97B5, 0x3BB1,
+ 0x97B6, 0x3BB2, 0x97C3, 0x1C00, 0x97C6, 0x1C01, 0x97C8, 0x1C02,
+ 0x97CB, 0x1C03, 0x97D3, 0x0616, 0x97D9, 0x3BB3, 0x97DC, 0x1C04,
+ 0x97DE, 0x3BB4, 0x97ED, 0x1C05, 0x97EE, 0x0CD9, 0x97F2, 0x1C07,
+ 0x97F3, 0x053B, 0x97F4, 0x3BB5, 0x97F5, 0x1C0A, 0x97F6, 0x1C09,
+ 0x97FB, 0x04C6, 0x97FF, 0x06B9, 0x9801, 0x0E17, 0x9802, 0x0BD6,
+ 0x9803, 0x0812, 0x9805, 0x07F2, 0x9806, 0x0971, 0x9808, 0x0A22,
+ 0x980A, 0x3BB6, 0x980C, 0x1C0C, 0x980E, 0x3BB7, 0x980F, 0x1C0B,
+ 0x9810, 0x0F2C, 0x9811, 0x0624, 0x9812, 0x0D66, 0x9813, 0x0CB4,
+ 0x9817, 0x0A42, 0x9818, 0x0F96, 0x981A, 0x0731, 0x981E, 0x3BB8,
+ 0x9821, 0x1C0F, 0x9823, 0x3BB9, 0x9824, 0x1C0E, 0x982B, 0x3BBA,
+ 0x982C, 0x0E79, 0x982D, 0x0C84, 0x9830, 0x1E73, 0x9834, 0x04F2,
+ 0x9837, 0x1C10, 0x9838, 0x1C0D, 0x9839, 0x37B3, 0x983B, 0x0DC3,
+ 0x983C, 0x0F54, 0x983D, 0x1C11, 0x983E, 0x3BBB, 0x9846, 0x1C12,
+ 0x984B, 0x1C14, 0x984C, 0x0B4A, 0x984D, 0x05B9, 0x984E, 0x05BA,
+ 0x984F, 0x1C13, 0x9852, 0x3BBC, 0x9853, 0x3BBD, 0x9854, 0x0625,
+ 0x9855, 0x0766, 0x9857, 0x21F9, 0x9858, 0x0626, 0x9859, 0x3BBE,
+ 0x985A, 0x1E48, 0x985B, 0x0C39, 0x985E, 0x0FA8, 0x9865, 0x21FA,
+ 0x9867, 0x0790, 0x986B, 0x1C15, 0x986C, 0x3BBF, 0x986F, 0x1C16,
+ 0x9870, 0x1C17, 0x9871, 0x1C18, 0x9873, 0x1C1A, 0x9874, 0x1C19,
+ 0x98A8, 0x0DE9, 0x98AA, 0x1C1B, 0x98AF, 0x1C1C, 0x98B1, 0x1C1D,
+ 0x98B6, 0x1C1E, 0x98B8, 0x3BC0, 0x98BA, 0x3BC1, 0x98BF, 0x3BC2,
+ 0x98C3, 0x1C20, 0x98C4, 0x1C1F, 0x98C6, 0x1C21, 0x98C8, 0x3BC3,
+ 0x98DB, 0x0D88, 0x98DC, 0x1839, 0x98DF, 0x09EF, 0x98E0, 0x3618,
+ 0x98E2, 0x064C, 0x98E5, 0x3BC4, 0x98E9, 0x1C22, 0x98EB, 0x1C23,
+ 0x98ED, 0x10C1, 0x98EE, 0x14DA, 0x98EF, 0x0D67, 0x98F2, 0x04BF,
+ 0x98F4, 0x047F, 0x98FC, 0x08C2, 0x98FD, 0x0E5E, 0x98FE, 0x09E6,
+ 0x9903, 0x1C24, 0x9905, 0x0EEB, 0x9909, 0x1C25, 0x990A, 0x0F46,
+ 0x990C, 0x04E4, 0x9910, 0x088F, 0x9912, 0x1C26, 0x9913, 0x056E,
+ 0x9914, 0x1C27, 0x9918, 0x1C28, 0x991D, 0x1C2A, 0x991E, 0x1C2B,
+ 0x9920, 0x1C2D, 0x9921, 0x1C29, 0x9924, 0x1C2C, 0x9927, 0x21FD,
+ 0x9928, 0x0617, 0x992C, 0x1C2E, 0x992E, 0x1C2F, 0x9932, 0x3BC5,
+ 0x9933, 0x3BC6, 0x993D, 0x1C30, 0x993E, 0x1C31, 0x9940, 0x3BC7,
+ 0x9942, 0x1C32, 0x9945, 0x1C34, 0x9949, 0x1C33, 0x994B, 0x1C36,
+ 0x994C, 0x1C39, 0x994D, 0x3BC8, 0x9950, 0x1C35, 0x9951, 0x1C37,
+ 0x9952, 0x1C38, 0x9955, 0x1C3A, 0x9957, 0x06BA, 0x995C, 0x3BC9,
+ 0x995F, 0x3BCA, 0x9996, 0x091F, 0x9997, 0x1C3B, 0x9998, 0x1C3C,
+ 0x9999, 0x07F3, 0x999E, 0x21FF, 0x99A5, 0x1C3D, 0x99A8, 0x059C,
+ 0x99AC, 0x0D05, 0x99AD, 0x1C3E, 0x99AE, 0x1C3F, 0x99B1, 0x3BCB,
+ 0x99B3, 0x0B98, 0x99B4, 0x0CC3, 0x99B9, 0x3BCC, 0x99BA, 0x3BCD,
+ 0x99BC, 0x1C40, 0x99C1, 0x0D33, 0x99C4, 0x0B2C, 0x99C5, 0x04FA,
+ 0x99C6, 0x06E6, 0x99C8, 0x06E7, 0x99C9, 0x3BCE, 0x99D0, 0x0BB1,
+ 0x99D1, 0x1C45, 0x99D2, 0x06E8, 0x99D5, 0x056F, 0x99D8, 0x1C44,
+ 0x99DB, 0x1C42, 0x99DD, 0x1C43, 0x99DF, 0x1C41, 0x99E2, 0x1C4F,
+ 0x99ED, 0x1C46, 0x99EE, 0x1C47, 0x99F1, 0x1C48, 0x99F2, 0x1C49,
+ 0x99F8, 0x1C4B, 0x99FB, 0x1C4A, 0x99FF, 0x0963, 0x9A01, 0x1C4C,
+ 0x9A02, 0x3BCF, 0x9A05, 0x1C4E, 0x9A08, 0x37BA, 0x9A0E, 0x064D,
+ 0x9A0F, 0x1C4D, 0x9A12, 0x0AFD, 0x9A13, 0x0767, 0x9A16, 0x3BD0,
+ 0x9A19, 0x1C50, 0x9A24, 0x3BD1, 0x9A27, 0x3BD2, 0x9A28, 0x0B2D,
+ 0x9A2B, 0x1C51, 0x9A2D, 0x3BD3, 0x9A2E, 0x3BD4, 0x9A30, 0x0C85,
+ 0x9A36, 0x3BD5, 0x9A37, 0x1C52, 0x9A38, 0x3BD6, 0x9A3E, 0x1C57,
+ 0x9A40, 0x1C55, 0x9A42, 0x1C54, 0x9A43, 0x1C56, 0x9A45, 0x1C53,
+ 0x9A4A, 0x3BD7, 0x9A4D, 0x1C59, 0x9A4E, 0x2200, 0x9A52, 0x1E2F,
+ 0x9A55, 0x1C58, 0x9A56, 0x3BD8, 0x9A57, 0x1C5B, 0x9A5A, 0x06BB,
+ 0x9A5B, 0x1C5A, 0x9A5F, 0x1C5C, 0x9A62, 0x1C5D, 0x9A64, 0x1C5F,
+ 0x9A65, 0x1C5E, 0x9A69, 0x1C60, 0x9A6A, 0x1C62, 0x9A6B, 0x1C61,
+ 0x9AA8, 0x080E, 0x9AAD, 0x1C63, 0x9AB0, 0x1C64, 0x9AB5, 0x3BD9,
+ 0x9AB6, 0x3BDA, 0x9AB8, 0x059A, 0x9ABC, 0x1C65, 0x9AC0, 0x1C66,
+ 0x9AC4, 0x0A37, 0x9ACF, 0x1C67, 0x9AD1, 0x1C68, 0x9AD3, 0x1C69,
+ 0x9AD4, 0x1C6A, 0x9AD8, 0x07F4, 0x9AD9, 0x2201, 0x9ADC, 0x2202,
+ 0x9ADE, 0x1C6B, 0x9ADF, 0x1C6C, 0x9AE2, 0x1C6D, 0x9AE3, 0x1C6E,
+ 0x9AE6, 0x1C6F, 0x9AEA, 0x0D45, 0x9AEB, 0x1C71, 0x9AED, 0x0D98,
+ 0x9AEE, 0x1C72, 0x9AEF, 0x1C70, 0x9AF1, 0x1C74, 0x9AF4, 0x1C73,
+ 0x9AF7, 0x1C75, 0x9AF9, 0x3BDB, 0x9AFB, 0x1C76, 0x9B03, 0x3BDC,
+ 0x9B06, 0x1C77, 0x9B18, 0x1C78, 0x9B1A, 0x1C79, 0x9B1F, 0x1C7A,
+ 0x9B20, 0x3BDD, 0x9B22, 0x1C7B, 0x9B23, 0x1C7C, 0x9B25, 0x1C7D,
+ 0x9B27, 0x1C7E, 0x9B28, 0x1C7F, 0x9B29, 0x1C80, 0x9B2A, 0x1C81,
+ 0x9B2D, 0x343C, 0x9B2E, 0x1C82, 0x9B2F, 0x1C83, 0x9B31, 0x14D4,
+ 0x9B32, 0x1C84, 0x9B33, 0x3BDE, 0x9B34, 0x3BDF, 0x9B3B, 0x17A9,
+ 0x9B3C, 0x064E, 0x9B41, 0x057F, 0x9B42, 0x0822, 0x9B43, 0x1C86,
+ 0x9B44, 0x1C85, 0x9B45, 0x0EB1, 0x9B4D, 0x1C88, 0x9B4E, 0x1C89,
+ 0x9B4F, 0x1C87, 0x9B51, 0x1C8A, 0x9B54, 0x0E90, 0x9B58, 0x1C8B,
+ 0x9B5A, 0x0695, 0x9B6F, 0x0FCB, 0x9B72, 0x2204, 0x9B73, 0x3BE0,
+ 0x9B74, 0x1C8C, 0x9B75, 0x2203, 0x9B79, 0x3BE1, 0x9B83, 0x1C8E,
+ 0x9B8E, 0x0482, 0x9B8F, 0x2205, 0x9B91, 0x1C8F, 0x9B92, 0x0DFB,
+ 0x9B93, 0x1C8D, 0x9B96, 0x1C90, 0x9B97, 0x1C91, 0x9B9F, 0x1C92,
+ 0x9BA0, 0x1C93, 0x9BA7, 0x3BE2, 0x9BA8, 0x1C94, 0x9BAA, 0x0E9C,
+ 0x9BAB, 0x087B, 0x9BAD, 0x086A, 0x9BAE, 0x0AB1, 0x9BB1, 0x2206,
+ 0x9BB4, 0x1C95, 0x9BB9, 0x1C98, 0x9BBB, 0x2207, 0x9BC0, 0x1C96,
+ 0x9BC1, 0x3BE3, 0x9BC6, 0x1C99, 0x9BC7, 0x3BE4, 0x9BC9, 0x07A5,
+ 0x9BCA, 0x1C97, 0x9BCF, 0x1C9A, 0x9BD1, 0x1C9B, 0x9BD2, 0x1C9C,
+ 0x9BD4, 0x1CA0, 0x9BD6, 0x0878, 0x9BD7, 0x3BE5, 0x9BDB, 0x0B44,
+ 0x9BDF, 0x37BF, 0x9BE1, 0x1CA1, 0x9BE2, 0x1C9E, 0x9BE3, 0x1C9D,
+ 0x9BE4, 0x1C9F, 0x9BE7, 0x3BE6, 0x9BE8, 0x0735, 0x9BEB, 0x3BE7,
+ 0x9BF0, 0x1CA5, 0x9BF1, 0x1CA4, 0x9BF2, 0x1CA3, 0x9BF5, 0x0477,
+ 0x9BF7, 0x3BE8, 0x9BFA, 0x3BE9, 0x9BFD, 0x3BEA, 0x9C00, 0x2208,
+ 0x9C04, 0x1CAF, 0x9C06, 0x1CAB, 0x9C08, 0x1CAC, 0x9C09, 0x1CA8,
+ 0x9C0A, 0x1CAE, 0x9C0B, 0x3BEB, 0x9C0C, 0x1CAA, 0x9C0D, 0x05C0,
+ 0x9C10, 0x0FF2, 0x9C12, 0x1CAD, 0x9C13, 0x1CA9, 0x9C14, 0x1CA7,
+ 0x9C15, 0x1CA6, 0x9C1B, 0x1CB1, 0x9C21, 0x1CB4, 0x9C24, 0x1CB3,
+ 0x9C25, 0x1CB2, 0x9C27, 0x3BEC, 0x9C2A, 0x3BED, 0x9C2D, 0x0DBB,
+ 0x9C2E, 0x1CB0, 0x9C2F, 0x04B7, 0x9C30, 0x1CB5, 0x9C32, 0x1CB7,
+ 0x9C36, 0x3BEE, 0x9C39, 0x05CD, 0x9C3A, 0x1CA2, 0x9C3B, 0x04D9,
+ 0x9C3E, 0x1CB9, 0x9C41, 0x3BEF, 0x9C46, 0x1CB8, 0x9C47, 0x1CB6,
+ 0x9C48, 0x0B6B, 0x9C52, 0x0E9E, 0x9C53, 0x3BF0, 0x9C57, 0x0FA2,
+ 0x9C5A, 0x1CBA, 0x9C60, 0x1CBB, 0x9C63, 0x3BF1, 0x9C67, 0x1CBC,
+ 0x9C6A, 0x3BF2, 0x9C76, 0x1CBD, 0x9C77, 0x3BF3, 0x9C78, 0x1CBE,
+ 0x9CE5, 0x0BD7, 0x9CE7, 0x1CBF, 0x9CE9, 0x0D4B, 0x9CEB, 0x1CC4,
+ 0x9CEC, 0x1CC0, 0x9CF0, 0x1CC1, 0x9CF3, 0x0E5F, 0x9CF4, 0x0ED0,
+ 0x9CF6, 0x0CA8, 0x9D02, 0x3BF4, 0x9D03, 0x1CC5, 0x9D06, 0x1CC6,
+ 0x9D07, 0x0C96, 0x9D08, 0x1CC3, 0x9D09, 0x1CC2, 0x9D0E, 0x052A,
+ 0x9D12, 0x1CCE, 0x9D15, 0x1CCD, 0x9D1B, 0x0517, 0x9D1F, 0x1CCB,
+ 0x9D23, 0x1CCA, 0x9D26, 0x1CC8, 0x9D28, 0x05D9, 0x9D2A, 0x1CC7,
+ 0x9D2B, 0x08DE, 0x9D2C, 0x0529, 0x9D3B, 0x07F5, 0x9D3E, 0x1CD1,
+ 0x9D3F, 0x1CD0, 0x9D41, 0x1CCF, 0x9D42, 0x3BF5, 0x9D44, 0x1CCC,
+ 0x9D46, 0x1CD2, 0x9D47, 0x3BF6, 0x9D48, 0x1CD3, 0x9D50, 0x1CD8,
+ 0x9D51, 0x1CD7, 0x9D59, 0x1CD9, 0x9D5C, 0x04CF, 0x9D5D, 0x1CD4,
+ 0x9D5E, 0x1CD5, 0x9D60, 0x0806, 0x9D61, 0x0EC5, 0x9D63, 0x3BF7,
+ 0x9D64, 0x1CD6, 0x9D69, 0x3BF8, 0x9D6B, 0x220A, 0x9D6C, 0x0E60,
+ 0x9D6F, 0x1CDE, 0x9D70, 0x2209, 0x9D72, 0x1CDA, 0x9D7A, 0x1CDF,
+ 0x9D7C, 0x3BF9, 0x9D7E, 0x3BFA, 0x9D87, 0x1CDC, 0x9D89, 0x1CDB,
+ 0x9D8D, 0x3BFB, 0x9D8F, 0x0732, 0x9D9A, 0x1CE0, 0x9DA4, 0x1CE1,
+ 0x9DA9, 0x1CE2, 0x9DAB, 0x1CDD, 0x9DAF, 0x1CC9, 0x9DB1, 0x3BFC,
+ 0x9DB2, 0x1CE3, 0x9DB4, 0x0BFD, 0x9DB8, 0x1CE7, 0x9DBA, 0x1CE8,
+ 0x9DBB, 0x1CE6, 0x9DC1, 0x1CE5, 0x9DC2, 0x1CEB, 0x9DC3, 0x3BFD,
+ 0x9DC4, 0x1CE4, 0x9DC6, 0x1CE9, 0x9DC7, 0x3BFE, 0x9DCF, 0x1CEA,
+ 0x9DD3, 0x1CED, 0x9DD6, 0x3BFF, 0x9DD7, 0x1DDE, 0x9DD9, 0x1CEC,
+ 0x9DDF, 0x3C00, 0x9DE6, 0x1CEF, 0x9DEB, 0x3C01, 0x9DED, 0x1CF0,
+ 0x9DEF, 0x1CF1, 0x9DF2, 0x0FEF, 0x9DF4, 0x3C02, 0x9DF8, 0x1CEE,
+ 0x9DF9, 0x0B4B, 0x9DFA, 0x085D, 0x9DFD, 0x1CF2, 0x9E15, 0x3C03,
+ 0x9E19, 0x220C, 0x9E1A, 0x1CF3, 0x9E1B, 0x1CF4, 0x9E1D, 0x3C04,
+ 0x9E1E, 0x1CF5, 0x9E75, 0x1CF6, 0x9E78, 0x0768, 0x9E79, 0x1CF7,
+ 0x9E7C, 0x1DFD, 0x9E7D, 0x1CF8, 0x9E7F, 0x08DB, 0x9E81, 0x1CF9,
+ 0x9E88, 0x1CFA, 0x9E8B, 0x1CFB, 0x9E8C, 0x1CFC, 0x9E91, 0x1CFF,
+ 0x9E92, 0x1CFD, 0x9E93, 0x0FE2, 0x9E95, 0x1CFE, 0x9E97, 0x0FB7,
+ 0x9E9D, 0x1D00, 0x9E9F, 0x0FA3, 0x9EA4, 0x3C05, 0x9EA5, 0x1D01,
+ 0x9EA6, 0x0D34, 0x9EA8, 0x3C06, 0x9EA9, 0x1D02, 0x9EAA, 0x1D04,
+ 0x9EAC, 0x3C07, 0x9EAD, 0x1D05, 0x9EB4, 0x1E02, 0x9EB5, 0x1E75,
+ 0x9EB8, 0x1D03, 0x9EB9, 0x07FF, 0x9EBA, 0x0ED9, 0x9EBB, 0x0E91,
+ 0x9EBC, 0x1284, 0x9EBE, 0x14FF, 0x9EBF, 0x0EA9, 0x9EC3, 0x340B,
+ 0x9EC4, 0x052B, 0x9ECC, 0x1D07, 0x9ECD, 0x066A, 0x9ECE, 0x1D08,
+ 0x9ECF, 0x1D09, 0x9ED0, 0x1D0A, 0x9ED1, 0x220D, 0x9ED2, 0x0807,
+ 0x9ED4, 0x1D0B, 0x9ED8, 0x160D, 0x9ED9, 0x0EE7, 0x9EDB, 0x0B43,
+ 0x9EDC, 0x1D0C, 0x9EDD, 0x1D0E, 0x9EDE, 0x1D0D, 0x9EE0, 0x1D0F,
+ 0x9EE5, 0x1D10, 0x9EE7, 0x3C08, 0x9EE8, 0x1D11, 0x9EEE, 0x3C09,
+ 0x9EEF, 0x1D12, 0x9EF4, 0x1D13, 0x9EF6, 0x1D14, 0x9EF7, 0x1D15,
+ 0x9EF9, 0x1D16, 0x9EFB, 0x1D17, 0x9EFC, 0x1D18, 0x9EFD, 0x1D19,
+ 0x9F07, 0x1D1A, 0x9F08, 0x1D1B, 0x9F0E, 0x0C1E, 0x9F10, 0x3C0A,
+ 0x9F12, 0x3C0B, 0x9F13, 0x0791, 0x9F15, 0x1D1D, 0x9F17, 0x3C0C,
+ 0x9F19, 0x3C0D, 0x9F20, 0x0ACF, 0x9F21, 0x1D1E, 0x9F2C, 0x1D1F,
+ 0x9F2F, 0x3C0E, 0x9F37, 0x3C0F, 0x9F39, 0x3C10, 0x9F3B, 0x0D93,
+ 0x9F3E, 0x1D20, 0x9F41, 0x3C11, 0x9F45, 0x3C12, 0x9F4A, 0x1D21,
+ 0x9F4B, 0x170A, 0x9F4E, 0x1A7B, 0x9F4F, 0x1C06, 0x9F52, 0x1D22,
+ 0x9F54, 0x1D23, 0x9F57, 0x3C13, 0x9F5F, 0x1D25, 0x9F60, 0x1D26,
+ 0x9F61, 0x1D27, 0x9F62, 0x0FB8, 0x9F63, 0x1D24, 0x9F66, 0x1D28,
+ 0x9F67, 0x1D29, 0x9F68, 0x3C14, 0x9F6A, 0x1D2B, 0x9F6C, 0x1D2A,
+ 0x9F71, 0x3C15, 0x9F72, 0x1D2D, 0x9F75, 0x3C16, 0x9F76, 0x1D2E,
+ 0x9F77, 0x1D2C, 0x9F8D, 0x0F7E, 0x9F90, 0x3C17, 0x9F94, 0x3C18,
+ 0x9F95, 0x1D2F, 0x9F9C, 0x1D30, 0x9F9D, 0x1727, 0x9FA0, 0x1D31,
+ 0x9FA2, 0x3C19, 0xF929, 0x2129, 0xF9DC, 0x21EE, 0xFA0E, 0x20DA,
+ 0xFA0F, 0x20E5, 0xFA10, 0x20E6, 0xFA11, 0x20FB, 0xFA12, 0x2121,
+ 0xFA13, 0x2131, 0xFA14, 0x2133, 0xFA15, 0x215E, 0xFA16, 0x2164,
+ 0xFA17, 0x217B, 0xFA18, 0x2183, 0xFA19, 0x2184, 0xFA1A, 0x2185,
+ 0xFA1B, 0x2187, 0xFA1C, 0x218B, 0xFA1D, 0x218E, 0xFA1E, 0x2197,
+ 0xFA1F, 0x21A2, 0xFA20, 0x21A4, 0xFA21, 0x21A5, 0xFA22, 0x21AE,
+ 0xFA23, 0x21B6, 0xFA24, 0x21B8, 0xFA25, 0x21B9, 0xFA26, 0x21BC,
+ 0xFA27, 0x21D8, 0xFA28, 0x21DF, 0xFA29, 0x21EF, 0xFA2A, 0x21FB,
+ 0xFA2B, 0x21FC, 0xFA2C, 0x21FE, 0xFA2D, 0x220B, 0xFB00, 0x248E,
+ 0xFB01, 0x0070, 0xFB02, 0x0071, 0xFB03, 0x248F, 0xFB04, 0x2490,
+ 0xFE30, 0x1EDA, 0xFE31, 0x1ED4, 0xFE32, 0x1ED5, 0xFE33, 0x1ED2,
+ 0xFE35, 0x1EDB, 0xFE36, 0x1EDC, 0xFE37, 0x1EE1, 0xFE38, 0x1EE2,
+ 0xFE39, 0x1EDD, 0xFE3A, 0x1EDE, 0xFE3B, 0x1EEB, 0xFE3C, 0x1EEC,
+ 0xFE3D, 0x1EE5, 0xFE3E, 0x1EE6, 0xFE3F, 0x1EE3, 0xFE40, 0x1EE4,
+ 0xFE41, 0x1EE7, 0xFE42, 0x1EE8, 0xFE43, 0x1EE9, 0xFE44, 0x1EEA,
+ 0xFF01, 0x0282, 0xFF02, 0x1F47, 0xFF03, 0x02CC, 0xFF04, 0x02C8,
+ 0xFF05, 0x02CB, 0xFF06, 0x02CD, 0xFF07, 0x1F46, 0xFF08, 0x02A2,
+ 0xFF09, 0x02A3, 0xFF0A, 0x02CE, 0xFF0B, 0x02B4, 0xFF0C, 0x027C,
+ 0xFF0D, 0x02B5, 0xFF0E, 0x027D, 0xFF0F, 0x0297, 0xFF10, 0x030C,
+ 0xFF11, 0x030D, 0xFF12, 0x030E, 0xFF13, 0x030F, 0xFF14, 0x0310,
+ 0xFF15, 0x0311, 0xFF16, 0x0312, 0xFF17, 0x0313, 0xFF18, 0x0314,
+ 0xFF19, 0x0315, 0xFF1A, 0x027F, 0xFF1B, 0x0280, 0xFF1C, 0x02BB,
+ 0xFF1D, 0x02B9, 0xFF1E, 0x02BC, 0xFF1F, 0x0281, 0xFF20, 0x02CF,
+ 0xFF21, 0x0316, 0xFF22, 0x0317, 0xFF23, 0x0318, 0xFF24, 0x0319,
+ 0xFF25, 0x031A, 0xFF26, 0x031B, 0xFF27, 0x031C, 0xFF28, 0x031D,
+ 0xFF29, 0x031E, 0xFF2A, 0x031F, 0xFF2B, 0x0320, 0xFF2C, 0x0321,
+ 0xFF2D, 0x0322, 0xFF2E, 0x0323, 0xFF2F, 0x0324, 0xFF30, 0x0325,
+ 0xFF31, 0x0326, 0xFF32, 0x0327, 0xFF33, 0x0328, 0xFF34, 0x0329,
+ 0xFF35, 0x032A, 0xFF36, 0x032B, 0xFF37, 0x032C, 0xFF38, 0x032D,
+ 0xFF39, 0x032E, 0xFF3A, 0x032F, 0xFF3B, 0x02A6, 0xFF3C, 0x0298,
+ 0xFF3D, 0x02A7, 0xFF3E, 0x0288, 0xFF3F, 0x028A, 0xFF40, 0x0286,
+ 0xFF41, 0x0330, 0xFF42, 0x0331, 0xFF43, 0x0332, 0xFF44, 0x0333,
+ 0xFF45, 0x0334, 0xFF46, 0x0335, 0xFF47, 0x0336, 0xFF48, 0x0337,
+ 0xFF49, 0x0338, 0xFF4A, 0x0339, 0xFF4B, 0x033A, 0xFF4C, 0x033B,
+ 0xFF4D, 0x033C, 0xFF4E, 0x033D, 0xFF4F, 0x033E, 0xFF50, 0x033F,
+ 0xFF51, 0x0340, 0xFF52, 0x0341, 0xFF53, 0x0342, 0xFF54, 0x0343,
+ 0xFF55, 0x0344, 0xFF56, 0x0345, 0xFF57, 0x0346, 0xFF58, 0x0347,
+ 0xFF59, 0x0348, 0xFF5A, 0x0349, 0xFF5B, 0x02A8, 0xFF5C, 0x029B,
+ 0xFF5D, 0x02A9, 0xFF5E, 0x0299, 0xFF61, 0x0147, 0xFF62, 0x0148,
+ 0xFF63, 0x0149, 0xFF64, 0x014A, 0xFF65, 0x014B, 0xFF66, 0x014C,
+ 0xFF67, 0x014D, 0xFF68, 0x014E, 0xFF69, 0x014F, 0xFF6A, 0x0150,
+ 0xFF6B, 0x0151, 0xFF6C, 0x0152, 0xFF6D, 0x0153, 0xFF6E, 0x0154,
+ 0xFF6F, 0x0155, 0xFF70, 0x0156, 0xFF71, 0x0157, 0xFF72, 0x0158,
+ 0xFF73, 0x0159, 0xFF74, 0x015A, 0xFF75, 0x015B, 0xFF76, 0x015C,
+ 0xFF77, 0x015D, 0xFF78, 0x015E, 0xFF79, 0x015F, 0xFF7A, 0x0160,
+ 0xFF7B, 0x0161, 0xFF7C, 0x0162, 0xFF7D, 0x0163, 0xFF7E, 0x0164,
+ 0xFF7F, 0x0165, 0xFF80, 0x0166, 0xFF81, 0x0167, 0xFF82, 0x0168,
+ 0xFF83, 0x0169, 0xFF84, 0x016A, 0xFF85, 0x016B, 0xFF86, 0x016C,
+ 0xFF87, 0x016D, 0xFF88, 0x016E, 0xFF89, 0x016F, 0xFF8A, 0x0170,
+ 0xFF8B, 0x0171, 0xFF8C, 0x0172, 0xFF8D, 0x0173, 0xFF8E, 0x0174,
+ 0xFF8F, 0x0175, 0xFF90, 0x0176, 0xFF91, 0x0177, 0xFF92, 0x0178,
+ 0xFF93, 0x0179, 0xFF94, 0x017A, 0xFF95, 0x017B, 0xFF96, 0x017C,
+ 0xFF97, 0x017D, 0xFF98, 0x017E, 0xFF99, 0x017F, 0xFF9A, 0x0180,
+ 0xFF9B, 0x0181, 0xFF9C, 0x0182, 0xFF9D, 0x0183, 0xFF9E, 0x0184,
+ 0xFF9F, 0x0185, 0xFFE0, 0x02C9, 0xFFE1, 0x02CA, 0xFFE2, 0x02EF,
+ 0xFFE3, 0x0289, 0xFFE4, 0x1F45, 0xFFE5, 0x02C7, 0xFFE8, 0x0143,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UCS2-V_4.cpp b/core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UCS2-V_4.cpp
index 52f1008c83..916631b242 100644
--- a/core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UCS2-V_4.cpp
+++ b/core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UCS2-V_4.cpp
@@ -1,71 +1,71 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-extern const unsigned short g_FXCMAP_UniJIS_UCS2_V_4[251 * 2] = {
- 0x00B0, 0x204D, 0x2010, 0x1ED5, 0x2015, 0x1ED4, 0x2016, 0x1ED7,
- 0x2018, 0x2059, 0x2019, 0x205A, 0x201C, 0x2057, 0x201D, 0x2058,
- 0x2025, 0x1EDA, 0x2026, 0x1ED9, 0x2032, 0x2051, 0x2033, 0x205B,
- 0x2190, 0x02E2, 0x2191, 0x02E0, 0x2192, 0x02E3, 0x2193, 0x02E1,
- 0x2195, 0x2FB6, 0x21C4, 0x2077, 0x21C5, 0x2076, 0x21C6, 0x2078,
- 0x21E6, 0x1F4C, 0x21E7, 0x1F4E, 0x21E8, 0x1F4B, 0x21E9, 0x1F4D,
- 0x2225, 0x1ED7, 0x223C, 0x1ED6, 0x22EF, 0x1ED9, 0x2500, 0x1D39,
- 0x2501, 0x1D3A, 0x2502, 0x1D37, 0x2503, 0x1D38, 0x2504, 0x1D3D,
- 0x2505, 0x1D3E, 0x2506, 0x1D3B, 0x2507, 0x1D3C, 0x2508, 0x1D41,
- 0x2509, 0x1D42, 0x250A, 0x1D3F, 0x250B, 0x1D40, 0x250C, 0x1D47,
- 0x250D, 0x1D49, 0x250E, 0x1D48, 0x250F, 0x1D4A, 0x2510, 0x1D4F,
- 0x2511, 0x1D51, 0x2512, 0x1D50, 0x2513, 0x1D52, 0x2514, 0x1D43,
- 0x2515, 0x1D45, 0x2516, 0x1D44, 0x2517, 0x1D46, 0x2518, 0x1D4B,
- 0x2519, 0x1D4D, 0x251A, 0x1D4C, 0x251B, 0x1D4E, 0x251C, 0x1D63,
- 0x251D, 0x1D67, 0x251E, 0x1D65, 0x251F, 0x1D64, 0x2520, 0x1D66,
- 0x2521, 0x1D69, 0x2522, 0x1D68, 0x2523, 0x1D6A, 0x2524, 0x1D6B,
- 0x2525, 0x1D6F, 0x2526, 0x1D6D, 0x2527, 0x1D6C, 0x2528, 0x1D6E,
- 0x2529, 0x1D71, 0x252A, 0x1D70, 0x252B, 0x1D72, 0x252C, 0x1D5B,
- 0x252D, 0x1D5D, 0x252E, 0x1D5E, 0x252F, 0x1D5F, 0x2530, 0x1D5C,
- 0x2531, 0x1D60, 0x2532, 0x1D61, 0x2533, 0x1D62, 0x2534, 0x1D53,
- 0x2535, 0x1D55, 0x2536, 0x1D56, 0x2537, 0x1D57, 0x2538, 0x1D54,
- 0x2539, 0x1D58, 0x253A, 0x1D59, 0x253B, 0x1D5A, 0x253D, 0x1D77,
- 0x253E, 0x1D78, 0x253F, 0x1D79, 0x2540, 0x1D75, 0x2541, 0x1D74,
- 0x2542, 0x1D76, 0x2543, 0x1D7B, 0x2544, 0x1D7D, 0x2545, 0x1D7A,
- 0x2546, 0x1D7C, 0x2547, 0x1D81, 0x2548, 0x1D80, 0x2549, 0x1D7E,
- 0x254A, 0x1D7F, 0x261C, 0x201D, 0x261D, 0x201B, 0x261E, 0x201E,
- 0x261F, 0x201C, 0x2702, 0x2F92, 0x27A1, 0x2011, 0x3001, 0x1ECF,
- 0x3002, 0x1ED0, 0x3008, 0x1EE3, 0x3009, 0x1EE4, 0x300A, 0x1EE5,
- 0x300B, 0x1EE6, 0x300C, 0x1EE7, 0x300D, 0x1EE8, 0x300E, 0x1EE9,
- 0x300F, 0x1EEA, 0x3010, 0x1EEB, 0x3011, 0x1EEC, 0x3013, 0x204E,
- 0x3014, 0x1EDD, 0x3015, 0x1EDE, 0x301C, 0x1ED6, 0x301D, 0x1F14,
- 0x301F, 0x1F15, 0x3041, 0x1EEE, 0x3043, 0x1EEF, 0x3045, 0x1EF0,
- 0x3047, 0x1EF1, 0x3049, 0x1EF2, 0x3063, 0x1EF3, 0x3083, 0x1EF4,
- 0x3085, 0x1EF5, 0x3087, 0x1EF6, 0x308E, 0x1EF7, 0x309B, 0x2050,
- 0x309C, 0x204F, 0x30A1, 0x1EF8, 0x30A3, 0x1EF9, 0x30A5, 0x1EFA,
- 0x30A7, 0x1EFB, 0x30A9, 0x1EFC, 0x30C3, 0x1EFD, 0x30E3, 0x1EFE,
- 0x30E5, 0x1EFF, 0x30E7, 0x1F00, 0x30EE, 0x1F01, 0x30F5, 0x1F02,
- 0x30F6, 0x1F03, 0x30FC, 0x1ED3, 0x3300, 0x209E, 0x3301, 0x2EB6,
- 0x3302, 0x2EB7, 0x3303, 0x2092, 0x3304, 0x2EB8, 0x3305, 0x208D,
- 0x3306, 0x2EB9, 0x3307, 0x2EBD, 0x3308, 0x2EBB, 0x3309, 0x2EC0,
- 0x330A, 0x2EBE, 0x330B, 0x2EC2, 0x330C, 0x2EC4, 0x330D, 0x1F0E,
- 0x330E, 0x2EC5, 0x330F, 0x2EC6, 0x3310, 0x2EC7, 0x3311, 0x2EC8,
- 0x3312, 0x2EC9, 0x3313, 0x2ECA, 0x3314, 0x1F05, 0x3315, 0x2094,
- 0x3316, 0x208A, 0x3317, 0x2ECC, 0x3318, 0x2093, 0x3319, 0x2ECE,
- 0x331A, 0x2ED0, 0x331B, 0x2ED1, 0x331C, 0x2ED2, 0x331D, 0x2ED3,
- 0x331E, 0x20A1, 0x331F, 0x2ED4, 0x3320, 0x2ED5, 0x3321, 0x2ED6,
- 0x3322, 0x2089, 0x3323, 0x209C, 0x3324, 0x2ED7, 0x3325, 0x2ED9,
- 0x3326, 0x1F0F, 0x3327, 0x1F09, 0x3328, 0x2EDC, 0x3329, 0x2EDD,
- 0x332A, 0x20A4, 0x332B, 0x1F11, 0x332D, 0x2EDF, 0x332E, 0x2EE2,
- 0x332F, 0x2EE3, 0x3330, 0x2EE4, 0x3331, 0x20A6, 0x3332, 0x2EE5,
- 0x3333, 0x208E, 0x3334, 0x2EE8, 0x3335, 0x2EE9, 0x3336, 0x1F0B,
- 0x3337, 0x2EEE, 0x3338, 0x2EF0, 0x3339, 0x2097, 0x333A, 0x2EF1,
- 0x333B, 0x209D, 0x333C, 0x2EEA, 0x333D, 0x2EF2, 0x333E, 0x2EF4,
- 0x333F, 0x2EF5, 0x3340, 0x2EF6, 0x3341, 0x2EF3, 0x3342, 0x209B,
- 0x3343, 0x2EF7, 0x3344, 0x2EF8, 0x3345, 0x2EF9, 0x3346, 0x2EFA,
- 0x3347, 0x20A5, 0x3348, 0x2EFB, 0x3349, 0x1F04, 0x334A, 0x1F12,
- 0x334B, 0x2EFC, 0x334C, 0x2EFD, 0x334D, 0x1F07, 0x334E, 0x2091,
- 0x334F, 0x2EFE, 0x3350, 0x2EFF, 0x3351, 0x1F0C, 0x3352, 0x2F02,
- 0x3353, 0x2F06, 0x3354, 0x2F03, 0x3355, 0x2F07, 0x3356, 0x2F08,
- 0x3357, 0x2098, 0x337F, 0x2084, 0xFF08, 0x1EDB, 0xFF09, 0x1EDC,
- 0xFF0C, 0x204C, 0xFF0E, 0x2052, 0xFF1D, 0x1EED, 0xFF3B, 0x1EDF,
- 0xFF3D, 0x1EE0, 0xFF3F, 0x1ED2, 0xFF5B, 0x1EE1, 0xFF5C, 0x1ED8,
- 0xFF5D, 0x1EE2, 0xFF5E, 0x1ED6, 0xFFE3, 0x1ED1,
-};
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_UniJIS_UCS2_V_4[251 * 2] = {
+ 0x00B0, 0x204D, 0x2010, 0x1ED5, 0x2015, 0x1ED4, 0x2016, 0x1ED7,
+ 0x2018, 0x2059, 0x2019, 0x205A, 0x201C, 0x2057, 0x201D, 0x2058,
+ 0x2025, 0x1EDA, 0x2026, 0x1ED9, 0x2032, 0x2051, 0x2033, 0x205B,
+ 0x2190, 0x02E2, 0x2191, 0x02E0, 0x2192, 0x02E3, 0x2193, 0x02E1,
+ 0x2195, 0x2FB6, 0x21C4, 0x2077, 0x21C5, 0x2076, 0x21C6, 0x2078,
+ 0x21E6, 0x1F4C, 0x21E7, 0x1F4E, 0x21E8, 0x1F4B, 0x21E9, 0x1F4D,
+ 0x2225, 0x1ED7, 0x223C, 0x1ED6, 0x22EF, 0x1ED9, 0x2500, 0x1D39,
+ 0x2501, 0x1D3A, 0x2502, 0x1D37, 0x2503, 0x1D38, 0x2504, 0x1D3D,
+ 0x2505, 0x1D3E, 0x2506, 0x1D3B, 0x2507, 0x1D3C, 0x2508, 0x1D41,
+ 0x2509, 0x1D42, 0x250A, 0x1D3F, 0x250B, 0x1D40, 0x250C, 0x1D47,
+ 0x250D, 0x1D49, 0x250E, 0x1D48, 0x250F, 0x1D4A, 0x2510, 0x1D4F,
+ 0x2511, 0x1D51, 0x2512, 0x1D50, 0x2513, 0x1D52, 0x2514, 0x1D43,
+ 0x2515, 0x1D45, 0x2516, 0x1D44, 0x2517, 0x1D46, 0x2518, 0x1D4B,
+ 0x2519, 0x1D4D, 0x251A, 0x1D4C, 0x251B, 0x1D4E, 0x251C, 0x1D63,
+ 0x251D, 0x1D67, 0x251E, 0x1D65, 0x251F, 0x1D64, 0x2520, 0x1D66,
+ 0x2521, 0x1D69, 0x2522, 0x1D68, 0x2523, 0x1D6A, 0x2524, 0x1D6B,
+ 0x2525, 0x1D6F, 0x2526, 0x1D6D, 0x2527, 0x1D6C, 0x2528, 0x1D6E,
+ 0x2529, 0x1D71, 0x252A, 0x1D70, 0x252B, 0x1D72, 0x252C, 0x1D5B,
+ 0x252D, 0x1D5D, 0x252E, 0x1D5E, 0x252F, 0x1D5F, 0x2530, 0x1D5C,
+ 0x2531, 0x1D60, 0x2532, 0x1D61, 0x2533, 0x1D62, 0x2534, 0x1D53,
+ 0x2535, 0x1D55, 0x2536, 0x1D56, 0x2537, 0x1D57, 0x2538, 0x1D54,
+ 0x2539, 0x1D58, 0x253A, 0x1D59, 0x253B, 0x1D5A, 0x253D, 0x1D77,
+ 0x253E, 0x1D78, 0x253F, 0x1D79, 0x2540, 0x1D75, 0x2541, 0x1D74,
+ 0x2542, 0x1D76, 0x2543, 0x1D7B, 0x2544, 0x1D7D, 0x2545, 0x1D7A,
+ 0x2546, 0x1D7C, 0x2547, 0x1D81, 0x2548, 0x1D80, 0x2549, 0x1D7E,
+ 0x254A, 0x1D7F, 0x261C, 0x201D, 0x261D, 0x201B, 0x261E, 0x201E,
+ 0x261F, 0x201C, 0x2702, 0x2F92, 0x27A1, 0x2011, 0x3001, 0x1ECF,
+ 0x3002, 0x1ED0, 0x3008, 0x1EE3, 0x3009, 0x1EE4, 0x300A, 0x1EE5,
+ 0x300B, 0x1EE6, 0x300C, 0x1EE7, 0x300D, 0x1EE8, 0x300E, 0x1EE9,
+ 0x300F, 0x1EEA, 0x3010, 0x1EEB, 0x3011, 0x1EEC, 0x3013, 0x204E,
+ 0x3014, 0x1EDD, 0x3015, 0x1EDE, 0x301C, 0x1ED6, 0x301D, 0x1F14,
+ 0x301F, 0x1F15, 0x3041, 0x1EEE, 0x3043, 0x1EEF, 0x3045, 0x1EF0,
+ 0x3047, 0x1EF1, 0x3049, 0x1EF2, 0x3063, 0x1EF3, 0x3083, 0x1EF4,
+ 0x3085, 0x1EF5, 0x3087, 0x1EF6, 0x308E, 0x1EF7, 0x309B, 0x2050,
+ 0x309C, 0x204F, 0x30A1, 0x1EF8, 0x30A3, 0x1EF9, 0x30A5, 0x1EFA,
+ 0x30A7, 0x1EFB, 0x30A9, 0x1EFC, 0x30C3, 0x1EFD, 0x30E3, 0x1EFE,
+ 0x30E5, 0x1EFF, 0x30E7, 0x1F00, 0x30EE, 0x1F01, 0x30F5, 0x1F02,
+ 0x30F6, 0x1F03, 0x30FC, 0x1ED3, 0x3300, 0x209E, 0x3301, 0x2EB6,
+ 0x3302, 0x2EB7, 0x3303, 0x2092, 0x3304, 0x2EB8, 0x3305, 0x208D,
+ 0x3306, 0x2EB9, 0x3307, 0x2EBD, 0x3308, 0x2EBB, 0x3309, 0x2EC0,
+ 0x330A, 0x2EBE, 0x330B, 0x2EC2, 0x330C, 0x2EC4, 0x330D, 0x1F0E,
+ 0x330E, 0x2EC5, 0x330F, 0x2EC6, 0x3310, 0x2EC7, 0x3311, 0x2EC8,
+ 0x3312, 0x2EC9, 0x3313, 0x2ECA, 0x3314, 0x1F05, 0x3315, 0x2094,
+ 0x3316, 0x208A, 0x3317, 0x2ECC, 0x3318, 0x2093, 0x3319, 0x2ECE,
+ 0x331A, 0x2ED0, 0x331B, 0x2ED1, 0x331C, 0x2ED2, 0x331D, 0x2ED3,
+ 0x331E, 0x20A1, 0x331F, 0x2ED4, 0x3320, 0x2ED5, 0x3321, 0x2ED6,
+ 0x3322, 0x2089, 0x3323, 0x209C, 0x3324, 0x2ED7, 0x3325, 0x2ED9,
+ 0x3326, 0x1F0F, 0x3327, 0x1F09, 0x3328, 0x2EDC, 0x3329, 0x2EDD,
+ 0x332A, 0x20A4, 0x332B, 0x1F11, 0x332D, 0x2EDF, 0x332E, 0x2EE2,
+ 0x332F, 0x2EE3, 0x3330, 0x2EE4, 0x3331, 0x20A6, 0x3332, 0x2EE5,
+ 0x3333, 0x208E, 0x3334, 0x2EE8, 0x3335, 0x2EE9, 0x3336, 0x1F0B,
+ 0x3337, 0x2EEE, 0x3338, 0x2EF0, 0x3339, 0x2097, 0x333A, 0x2EF1,
+ 0x333B, 0x209D, 0x333C, 0x2EEA, 0x333D, 0x2EF2, 0x333E, 0x2EF4,
+ 0x333F, 0x2EF5, 0x3340, 0x2EF6, 0x3341, 0x2EF3, 0x3342, 0x209B,
+ 0x3343, 0x2EF7, 0x3344, 0x2EF8, 0x3345, 0x2EF9, 0x3346, 0x2EFA,
+ 0x3347, 0x20A5, 0x3348, 0x2EFB, 0x3349, 0x1F04, 0x334A, 0x1F12,
+ 0x334B, 0x2EFC, 0x334C, 0x2EFD, 0x334D, 0x1F07, 0x334E, 0x2091,
+ 0x334F, 0x2EFE, 0x3350, 0x2EFF, 0x3351, 0x1F0C, 0x3352, 0x2F02,
+ 0x3353, 0x2F06, 0x3354, 0x2F03, 0x3355, 0x2F07, 0x3356, 0x2F08,
+ 0x3357, 0x2098, 0x337F, 0x2084, 0xFF08, 0x1EDB, 0xFF09, 0x1EDC,
+ 0xFF0C, 0x204C, 0xFF0E, 0x2052, 0xFF1D, 0x1EED, 0xFF3B, 0x1EDF,
+ 0xFF3D, 0x1EE0, 0xFF3F, 0x1ED2, 0xFF5B, 0x1EE1, 0xFF5C, 0x1ED8,
+ 0xFF5D, 0x1EE2, 0xFF5E, 0x1ED6, 0xFFE3, 0x1ED1,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UTF16-H_5.cpp b/core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UTF16-H_5.cpp
index 1cc2312a13..5c22d995e6 100644
--- a/core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UTF16-H_5.cpp
+++ b/core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UTF16-H_5.cpp
@@ -1,3449 +1,3449 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-extern const unsigned short g_FXCMAP_UniJIS_UTF16_H_5[13241 * 2] = {
- 0x0020, 0x0001, 0x0021, 0x0002, 0x0022, 0x0003, 0x0023, 0x0004,
- 0x0024, 0x0005, 0x0025, 0x0006, 0x0026, 0x0007, 0x0027, 0x0008,
- 0x0028, 0x0009, 0x0029, 0x000A, 0x002A, 0x000B, 0x002B, 0x000C,
- 0x002C, 0x000D, 0x002D, 0x000E, 0x002E, 0x000F, 0x002F, 0x0010,
- 0x0030, 0x0011, 0x0031, 0x0012, 0x0032, 0x0013, 0x0033, 0x0014,
- 0x0034, 0x0015, 0x0035, 0x0016, 0x0036, 0x0017, 0x0037, 0x0018,
- 0x0038, 0x0019, 0x0039, 0x001A, 0x003A, 0x001B, 0x003B, 0x001C,
- 0x003C, 0x001D, 0x003D, 0x001E, 0x003E, 0x001F, 0x003F, 0x0020,
- 0x0040, 0x0021, 0x0041, 0x0022, 0x0042, 0x0023, 0x0043, 0x0024,
- 0x0044, 0x0025, 0x0045, 0x0026, 0x0046, 0x0027, 0x0047, 0x0028,
- 0x0048, 0x0029, 0x0049, 0x002A, 0x004A, 0x002B, 0x004B, 0x002C,
- 0x004C, 0x002D, 0x004D, 0x002E, 0x004E, 0x002F, 0x004F, 0x0030,
- 0x0050, 0x0031, 0x0051, 0x0032, 0x0052, 0x0033, 0x0053, 0x0034,
- 0x0054, 0x0035, 0x0055, 0x0036, 0x0056, 0x0037, 0x0057, 0x0038,
- 0x0058, 0x0039, 0x0059, 0x003A, 0x005A, 0x003B, 0x005B, 0x003C,
- 0x005C, 0x0061, 0x005D, 0x003E, 0x005E, 0x003F, 0x005F, 0x0040,
- 0x0060, 0x0041, 0x0061, 0x0042, 0x0062, 0x0043, 0x0063, 0x0044,
- 0x0064, 0x0045, 0x0065, 0x0046, 0x0066, 0x0047, 0x0067, 0x0048,
- 0x0068, 0x0049, 0x0069, 0x004A, 0x006A, 0x004B, 0x006B, 0x004C,
- 0x006C, 0x004D, 0x006D, 0x004E, 0x006E, 0x004F, 0x006F, 0x0050,
- 0x0070, 0x0051, 0x0071, 0x0052, 0x0072, 0x0053, 0x0073, 0x0054,
- 0x0074, 0x0055, 0x0075, 0x0056, 0x0076, 0x0057, 0x0077, 0x0058,
- 0x0078, 0x0059, 0x0079, 0x005A, 0x007A, 0x005B, 0x007B, 0x005C,
- 0x007C, 0x0063, 0x007D, 0x005E, 0x007E, 0x0064, 0x00A0, 0x0001,
- 0x00A1, 0x0065, 0x00A2, 0x0066, 0x00A3, 0x0067, 0x00A4, 0x006B,
- 0x00A5, 0x003D, 0x00A6, 0x005D, 0x00A7, 0x02D0, 0x00A8, 0x0287,
- 0x00A9, 0x0098, 0x00AA, 0x008C, 0x00AB, 0x006D, 0x00AC, 0x0099,
- 0x00AD, 0x0097, 0x00AE, 0x009A, 0x00AF, 0x0081, 0x00B0, 0x02C3,
- 0x00B1, 0x02B6, 0x00B2, 0x009D, 0x00B3, 0x009E, 0x00B4, 0x0285,
- 0x00B5, 0x009F, 0x00B6, 0x030A, 0x00B7, 0x0075, 0x00B8, 0x0086,
- 0x00B9, 0x00A0, 0x00BA, 0x0090, 0x00BB, 0x007B, 0x00BC, 0x00A1,
- 0x00BD, 0x00A2, 0x00BE, 0x00A3, 0x00BF, 0x007E, 0x00C0, 0x00A4,
- 0x00C1, 0x00A5, 0x00C2, 0x00A6, 0x00C3, 0x00A7, 0x00C4, 0x00A8,
- 0x00C5, 0x00A9, 0x00C6, 0x008B, 0x00C7, 0x00AA, 0x00C8, 0x00AB,
- 0x00C9, 0x00AC, 0x00CA, 0x00AD, 0x00CB, 0x00AE, 0x00CC, 0x00AF,
- 0x00CD, 0x00B0, 0x00CE, 0x00B1, 0x00CF, 0x00B2, 0x00D0, 0x00B3,
- 0x00D1, 0x00B4, 0x00D2, 0x00B5, 0x00D3, 0x00B6, 0x00D4, 0x00B7,
- 0x00D5, 0x00B8, 0x00D6, 0x00B9, 0x00D7, 0x02B7, 0x00D8, 0x008E,
- 0x00D9, 0x00BB, 0x00DA, 0x00BC, 0x00DB, 0x00BD, 0x00DC, 0x00BE,
- 0x00DD, 0x00BF, 0x00DE, 0x00C0, 0x00DF, 0x0096, 0x00E0, 0x00C1,
- 0x00E1, 0x00C2, 0x00E2, 0x00C3, 0x00E3, 0x00C4, 0x00E4, 0x00C5,
- 0x00E5, 0x00C6, 0x00E6, 0x0091, 0x00E7, 0x00C7, 0x00E8, 0x00C8,
- 0x00E9, 0x00C9, 0x00EA, 0x00CA, 0x00EB, 0x00CB, 0x00EC, 0x00CC,
- 0x00ED, 0x00CD, 0x00EE, 0x00CE, 0x00EF, 0x00CF, 0x00F0, 0x00D0,
- 0x00F1, 0x00D1, 0x00F2, 0x00D2, 0x00F3, 0x00D3, 0x00F4, 0x00D4,
- 0x00F5, 0x00D5, 0x00F6, 0x00D6, 0x00F7, 0x02B8, 0x00F8, 0x0094,
- 0x00F9, 0x00D8, 0x00FA, 0x00D9, 0x00FB, 0x00DA, 0x00FC, 0x00DB,
- 0x00FD, 0x00DC, 0x00FE, 0x00DD, 0x00FF, 0x00DE, 0x0100, 0x2496,
- 0x0101, 0x2491, 0x0102, 0x3D8C, 0x0103, 0x3D99, 0x0104, 0x3D79,
- 0x0105, 0x3D81, 0x0106, 0x3D8E, 0x0107, 0x3D9B, 0x0108, 0x3DA7,
- 0x0109, 0x3DAD, 0x010C, 0x3D8F, 0x010D, 0x3D9C, 0x010E, 0x3D91,
- 0x010F, 0x3D9E, 0x0111, 0x3D9F, 0x0112, 0x2499, 0x0113, 0x2494,
- 0x0118, 0x3D90, 0x0119, 0x3D9D, 0x011A, 0x24B3, 0x011B, 0x24BF,
- 0x011C, 0x3DA8, 0x011D, 0x3DAE, 0x0124, 0x3DA9, 0x0125, 0x3DAF,
- 0x0127, 0x3DC8, 0x0128, 0x24B8, 0x0129, 0x24C4, 0x012A, 0x2497,
- 0x012B, 0x2492, 0x0131, 0x0092, 0x0134, 0x3DAA, 0x0135, 0x3DB0,
- 0x0139, 0x3D8D, 0x013A, 0x3D9A, 0x013D, 0x3D7B, 0x013E, 0x3D83,
- 0x0141, 0x008D, 0x0142, 0x0093, 0x0143, 0x3D92, 0x0144, 0x3DA0,
- 0x0147, 0x3D93, 0x0148, 0x3DA1, 0x014B, 0x24DC, 0x014C, 0x249A,
- 0x014D, 0x2495, 0x0150, 0x3D94, 0x0151, 0x3DA2, 0x0152, 0x008F,
- 0x0153, 0x0095, 0x0154, 0x3D8B, 0x0155, 0x3D98, 0x0158, 0x3D95,
- 0x0159, 0x3DA3, 0x015A, 0x3D7C, 0x015B, 0x3D84, 0x015C, 0x3DAB,
- 0x015D, 0x3DB1, 0x015E, 0x3D7D, 0x015F, 0x3D86, 0x0160, 0x00DF,
- 0x0161, 0x00E3, 0x0162, 0x3D97, 0x0163, 0x3DA5, 0x0164, 0x3D7E,
- 0x0165, 0x3D87, 0x0168, 0x24BD, 0x0169, 0x24C9, 0x016A, 0x2498,
- 0x016B, 0x2493, 0x016C, 0x3DAC, 0x016D, 0x3DB2, 0x016E, 0x24BC,
- 0x016F, 0x24C8, 0x0170, 0x3D96, 0x0171, 0x3DA4, 0x0178, 0x00E0,
- 0x0179, 0x3D7F, 0x017A, 0x3D88, 0x017B, 0x3D80, 0x017C, 0x3D8A,
- 0x017D, 0x00E1, 0x017E, 0x00E5, 0x0192, 0x0069, 0x0193, 0x3DD2,
- 0x01C2, 0x3DCD, 0x01CD, 0x24B2, 0x01CE, 0x24BE, 0x01CF, 0x24B6,
- 0x01D0, 0x24C2, 0x01D1, 0x24B9, 0x01D2, 0x24C5, 0x01D3, 0x24BB,
- 0x01D4, 0x24C7, 0x01D6, 0x3D75, 0x01D8, 0x3D76, 0x01DA, 0x3D77,
- 0x01DC, 0x3D78, 0x01F8, 0x3D73, 0x01F9, 0x3D74, 0x01FD, 0x24CD,
- 0x0250, 0x3DD8, 0x0251, 0x24CA, 0x0252, 0x3DDC, 0x0253, 0x3DCE,
- 0x0254, 0x24CF, 0x0255, 0x3DE1, 0x0256, 0x3DBA, 0x0257, 0x3DCF,
- 0x0258, 0x3DD5, 0x0259, 0x24D2, 0x025A, 0x24D5, 0x025B, 0x24D8,
- 0x025C, 0x3DD6, 0x025E, 0x3DD7, 0x025F, 0x3DC1, 0x0260, 0x3DD1,
- 0x0261, 0x3DC5, 0x0262, 0x3E0B, 0x0263, 0x3E0C, 0x0264, 0x3DDB,
- 0x0265, 0x3DDE, 0x0266, 0x3DCB, 0x0267, 0x3DE4, 0x0268, 0x3DD3,
- 0x026A, 0x3E0D, 0x026C, 0x3DB6, 0x026D, 0x3DC0, 0x026E, 0x3DB7,
- 0x026F, 0x3DD9, 0x0270, 0x3DC6, 0x0271, 0x3DB3, 0x0272, 0x3DC2,
- 0x0273, 0x3DBB, 0x0274, 0x3E0E, 0x0275, 0x24DD, 0x0276, 0x3E0F,
- 0x0278, 0x3E10, 0x0279, 0x3DB8, 0x027A, 0x3DE3, 0x027B, 0x3DBF,
- 0x027D, 0x3DBC, 0x027E, 0x3DB5, 0x0280, 0x3E11, 0x0281, 0x3DC7,
- 0x0282, 0x3DBD, 0x0283, 0x24E2, 0x0284, 0x3DD0, 0x0288, 0x3DB9,
- 0x0289, 0x3DD4, 0x028A, 0x3DDA, 0x028B, 0x3DB4, 0x028C, 0x24DE,
- 0x028D, 0x3DDD, 0x028E, 0x3DC4, 0x028F, 0x3E12, 0x0290, 0x3DBE,
- 0x0291, 0x3DE2, 0x0292, 0x24E1, 0x0294, 0x3DCA, 0x0295, 0x3DC9,
- 0x0298, 0x3DCC, 0x0299, 0x3E13, 0x029C, 0x3E14, 0x029D, 0x3DC3,
- 0x029F, 0x3E15, 0x02A1, 0x3DE0, 0x02A2, 0x3DDF, 0x02B0, 0x3E16,
- 0x02B2, 0x3E17, 0x02B7, 0x3E18, 0x02BB, 0x0062, 0x02BC, 0x0060,
- 0x02C1, 0x3E19, 0x02C6, 0x0080, 0x02C7, 0x3D85, 0x02C8, 0x3DE6,
- 0x02CC, 0x3DE7, 0x02D0, 0x24E3, 0x02D1, 0x3DE8, 0x02D8, 0x3D7A,
- 0x02D9, 0x3DA6, 0x02DA, 0x0085, 0x02DB, 0x3D82, 0x02DC, 0x005F,
- 0x02DD, 0x3D89, 0x02DE, 0x3DFB, 0x02E0, 0x3E1A, 0x02E1, 0x3E1B,
- 0x02E5, 0x3DEB, 0x02E6, 0x3DEC, 0x02E7, 0x3DED, 0x02E8, 0x3DEE,
- 0x02E9, 0x3DEF, 0x0300, 0x0041, 0x0301, 0x007F, 0x0302, 0x0080,
- 0x0303, 0x005F, 0x0304, 0x0081, 0x0305, 0x00E2, 0x0306, 0x0082,
- 0x0307, 0x0083, 0x0308, 0x0084, 0x030A, 0x0085, 0x030B, 0x0087,
- 0x030C, 0x0089, 0x030F, 0x3DEA, 0x0318, 0x3E02, 0x0319, 0x3E03,
- 0x031A, 0x3E07, 0x031C, 0x3DF5, 0x031D, 0x3E00, 0x031E, 0x3E01,
- 0x031F, 0x3DF6, 0x0320, 0x3DF7, 0x0324, 0x3DFC, 0x0325, 0x3DF2,
- 0x0327, 0x0086, 0x0328, 0x0088, 0x0329, 0x3DF9, 0x032A, 0x3E04,
- 0x032C, 0x3DF3, 0x032F, 0x3DFA, 0x0330, 0x3DFD, 0x0332, 0x0040,
- 0x0334, 0x3DFF, 0x0336, 0x008A, 0x0339, 0x3DF4, 0x033A, 0x3E05,
- 0x033B, 0x3E06, 0x033C, 0x3DFE, 0x033D, 0x3DF8, 0x0361, 0x3DE5,
- 0x0391, 0x03F3, 0x0392, 0x03F4, 0x0393, 0x03F5, 0x0394, 0x03F6,
- 0x0395, 0x03F7, 0x0396, 0x03F8, 0x0397, 0x03F9, 0x0398, 0x03FA,
- 0x0399, 0x03FB, 0x039A, 0x03FC, 0x039B, 0x03FD, 0x039C, 0x03FE,
- 0x039D, 0x03FF, 0x039E, 0x0400, 0x039F, 0x0401, 0x03A0, 0x0402,
- 0x03A1, 0x0403, 0x03A3, 0x0404, 0x03A4, 0x0405, 0x03A5, 0x0406,
- 0x03A6, 0x0407, 0x03A7, 0x0408, 0x03A8, 0x0409, 0x03A9, 0x040A,
- 0x03B1, 0x040B, 0x03B2, 0x040C, 0x03B3, 0x040D, 0x03B4, 0x040E,
- 0x03B5, 0x040F, 0x03B6, 0x0410, 0x03B7, 0x0411, 0x03B8, 0x0412,
- 0x03B9, 0x0413, 0x03BA, 0x0414, 0x03BB, 0x0415, 0x03BC, 0x0416,
- 0x03BD, 0x0417, 0x03BE, 0x0418, 0x03BF, 0x0419, 0x03C0, 0x041A,
- 0x03C1, 0x041B, 0x03C2, 0x3F5E, 0x03C3, 0x041C, 0x03C4, 0x041D,
- 0x03C5, 0x041E, 0x03C6, 0x041F, 0x03C7, 0x0420, 0x03C8, 0x0421,
- 0x03C9, 0x0422, 0x03D0, 0x2F3A, 0x03D1, 0x2F40, 0x03D5, 0x2F3E,
- 0x03DB, 0x2F3F, 0x0401, 0x0429, 0x0410, 0x0423, 0x0411, 0x0424,
- 0x0412, 0x0425, 0x0413, 0x0426, 0x0414, 0x0427, 0x0415, 0x0428,
- 0x0416, 0x042A, 0x0417, 0x042B, 0x0418, 0x042C, 0x0419, 0x042D,
- 0x041A, 0x042E, 0x041B, 0x042F, 0x041C, 0x0430, 0x041D, 0x0431,
- 0x041E, 0x0432, 0x041F, 0x0433, 0x0420, 0x0434, 0x0421, 0x0435,
- 0x0422, 0x0436, 0x0423, 0x0437, 0x0424, 0x0438, 0x0425, 0x0439,
- 0x0426, 0x043A, 0x0427, 0x043B, 0x0428, 0x043C, 0x0429, 0x043D,
- 0x042A, 0x043E, 0x042B, 0x043F, 0x042C, 0x0440, 0x042D, 0x0441,
- 0x042E, 0x0442, 0x042F, 0x0443, 0x0430, 0x0444, 0x0431, 0x0445,
- 0x0432, 0x0446, 0x0433, 0x0447, 0x0434, 0x0448, 0x0435, 0x0449,
- 0x0436, 0x044B, 0x0437, 0x044C, 0x0438, 0x044D, 0x0439, 0x044E,
- 0x043A, 0x044F, 0x043B, 0x0450, 0x043C, 0x0451, 0x043D, 0x0452,
- 0x043E, 0x0453, 0x043F, 0x0454, 0x0440, 0x0455, 0x0441, 0x0456,
- 0x0442, 0x0457, 0x0443, 0x0458, 0x0444, 0x0459, 0x0445, 0x045A,
- 0x0446, 0x045B, 0x0447, 0x045C, 0x0448, 0x045D, 0x0449, 0x045E,
- 0x044A, 0x045F, 0x044B, 0x0460, 0x044C, 0x0461, 0x044D, 0x0462,
- 0x044E, 0x0463, 0x044F, 0x0464, 0x0451, 0x044A, 0x1E3E, 0x3D71,
- 0x1E3F, 0x3D72, 0x1EBC, 0x24B5, 0x1EBD, 0x24C1, 0x1F70, 0x24CC,
- 0x1F71, 0x24CB, 0x1F72, 0x24DA, 0x1F73, 0x24D9, 0x2002, 0x00E7,
- 0x2003, 0x0279, 0x2010, 0x0296, 0x2011, 0x000E, 0x2012, 0x0072,
- 0x2013, 0x0072, 0x2014, 0x008A, 0x2015, 0x0295, 0x2016, 0x029A,
- 0x2018, 0x0062, 0x2019, 0x0060, 0x201A, 0x0078, 0x201C, 0x006C,
- 0x201D, 0x007A, 0x201E, 0x0079, 0x2020, 0x0308, 0x2021, 0x0309,
- 0x2022, 0x0077, 0x2025, 0x029D, 0x2026, 0x029C, 0x2030, 0x0304,
- 0x2032, 0x02C4, 0x2033, 0x02C5, 0x2039, 0x006E, 0x203A, 0x006F,
- 0x203B, 0x02DE, 0x203C, 0x2F4F, 0x203E, 0x00E2, 0x203F, 0x3DE9,
- 0x2042, 0x3F9A, 0x2044, 0x0068, 0x2047, 0x3F96, 0x2048, 0x3F97,
- 0x2049, 0x2F50, 0x2051, 0x3F99, 0x2070, 0x24A1, 0x2074, 0x24A2,
- 0x2075, 0x24A3, 0x2076, 0x24A4, 0x2077, 0x24A5, 0x2078, 0x24A6,
- 0x2079, 0x24A7, 0x2080, 0x24A8, 0x2081, 0x24A9, 0x2082, 0x24AA,
- 0x2083, 0x24AB, 0x2084, 0x24AC, 0x2085, 0x24AD, 0x2086, 0x24AE,
- 0x2087, 0x24AF, 0x2088, 0x24B0, 0x2089, 0x24B1, 0x20AC, 0x248A,
- 0x20DD, 0x3FC8, 0x20DE, 0x2B1B, 0x2100, 0x2E4F, 0x2103, 0x02C6,
- 0x2105, 0x2E53, 0x2109, 0x2071, 0x210A, 0x2070, 0x210F, 0x2F3C,
- 0x2113, 0x1F59, 0x2116, 0x1DBA, 0x2121, 0x1F77, 0x2122, 0x00E4,
- 0x2126, 0x248B, 0x2127, 0x3C9B, 0x212B, 0x0303, 0x2135, 0x2F39,
- 0x213B, 0x2073, 0x2153, 0x249F, 0x2154, 0x24A0, 0x2155, 0x3D6F,
- 0x2156, 0x2639, 0x2157, 0x263A, 0x2158, 0x263B, 0x2159, 0x263C,
- 0x215A, 0x263D, 0x215B, 0x249B, 0x215C, 0x249C, 0x215D, 0x249D,
- 0x215E, 0x249E, 0x2160, 0x1D97, 0x2161, 0x1D98, 0x2162, 0x1D99,
- 0x2163, 0x1D9A, 0x2164, 0x1D9B, 0x2165, 0x1D9C, 0x2166, 0x1D9D,
- 0x2167, 0x1D9E, 0x2168, 0x1D9F, 0x2169, 0x1DA0, 0x216A, 0x2021,
- 0x216B, 0x2022, 0x2170, 0x1F9C, 0x2171, 0x1F9D, 0x2172, 0x1F9E,
- 0x2173, 0x1F9F, 0x2174, 0x1FA0, 0x2175, 0x1FA1, 0x2176, 0x1FA2,
- 0x2177, 0x1FA3, 0x2178, 0x1FA4, 0x2179, 0x1FA5, 0x217A, 0x206A,
- 0x217B, 0x206B, 0x217F, 0x206F, 0x2190, 0x02E1, 0x2191, 0x02E2,
- 0x2192, 0x02E0, 0x2193, 0x02E3, 0x2194, 0x2FA9, 0x2196, 0x2FAC,
- 0x2197, 0x2FAD, 0x2198, 0x2FAA, 0x2199, 0x2FAB, 0x21C4, 0x2076,
- 0x21C5, 0x2077, 0x21C6, 0x2075, 0x21CB, 0x2FAF, 0x21CC, 0x2FAE,
- 0x21D0, 0x2FA8, 0x21D2, 0x02F0, 0x21D4, 0x02F1, 0x21E6, 0x1F4D,
- 0x21E7, 0x1F4C, 0x21E8, 0x1F4E, 0x21E9, 0x1F4B, 0x2200, 0x02F2,
- 0x2202, 0x02F7, 0x2203, 0x02F3, 0x2205, 0x2F98, 0x2207, 0x02F8,
- 0x2208, 0x02E5, 0x2209, 0x3C74, 0x220A, 0x2F3B, 0x220B, 0x02E6,
- 0x2211, 0x1DC9, 0x2212, 0x02B5, 0x2213, 0x2F56, 0x2219, 0x0075,
- 0x221A, 0x02FD, 0x221D, 0x02FF, 0x221E, 0x02BF, 0x221F, 0x1DCD,
- 0x2220, 0x02F4, 0x2225, 0x3C81, 0x2226, 0x3C82, 0x2227, 0x02ED,
- 0x2228, 0x02EE, 0x2229, 0x02EC, 0x222A, 0x02EB, 0x222B, 0x0301,
- 0x222C, 0x0302, 0x222D, 0x2003, 0x222E, 0x1DC8, 0x2234, 0x02C0,
- 0x2235, 0x0300, 0x223C, 0x0064, 0x223D, 0x02FE, 0x2243, 0x2F58,
- 0x2245, 0x3C93, 0x2248, 0x3C94, 0x2252, 0x02FA, 0x2260, 0x02BA,
- 0x2261, 0x02F9, 0x2262, 0x3C91, 0x2266, 0x02BD, 0x2267, 0x02BE,
- 0x226A, 0x02FB, 0x226B, 0x02FC, 0x2272, 0x2F59, 0x2273, 0x2F5A,
- 0x2276, 0x3C95, 0x2277, 0x3C96, 0x2282, 0x02E9, 0x2283, 0x02EA,
- 0x2284, 0x3C70, 0x2285, 0x3C71, 0x2286, 0x02E7, 0x2287, 0x02E8,
- 0x228A, 0x3C72, 0x228B, 0x3C73, 0x2295, 0x2F9C, 0x2296, 0x2F9A,
- 0x2297, 0x2F9D, 0x2298, 0x2F9B, 0x229E, 0x3E22, 0x22A0, 0x2F99,
- 0x22A5, 0x02F5, 0x22BF, 0x1DCE, 0x22DA, 0x3D6D, 0x22DB, 0x3D6E,
- 0x2305, 0x3C76, 0x2306, 0x3C77, 0x2307, 0x2FBB, 0x2312, 0x02F6,
- 0x2318, 0x3D70, 0x239B, 0x2F6F, 0x239C, 0x2F87, 0x239D, 0x2F70,
- 0x239E, 0x2F71, 0x239F, 0x2F87, 0x23A0, 0x2F72, 0x23A1, 0x2F77,
- 0x23A2, 0x2F87, 0x23A3, 0x2F78, 0x23A4, 0x2F79, 0x23A5, 0x2F87,
- 0x23A6, 0x2F7A, 0x23A7, 0x1FF2, 0x23A8, 0x1FF3, 0x23A9, 0x1FF4,
- 0x23AA, 0x2F87, 0x23AB, 0x1FEE, 0x23AC, 0x1FEF, 0x23AD, 0x1FF0,
- 0x23B0, 0x3FB8, 0x23B1, 0x3FB9, 0x23BE, 0x3F7D, 0x23BF, 0x3F7E,
- 0x23C0, 0x3F7F, 0x23C1, 0x3F80, 0x23C2, 0x3F81, 0x23C3, 0x3F82,
- 0x23C4, 0x3F83, 0x23C5, 0x3F84, 0x23C6, 0x3F85, 0x23C7, 0x3F86,
- 0x23C8, 0x3F87, 0x23C9, 0x3F88, 0x23CA, 0x3F89, 0x23CB, 0x3F8A,
- 0x23CC, 0x3F8B, 0x23CE, 0x3F91, 0x2423, 0x3F90, 0x2460, 0x1D83,
- 0x2461, 0x1D84, 0x2462, 0x1D85, 0x2463, 0x1D86, 0x2464, 0x1D87,
- 0x2465, 0x1D88, 0x2466, 0x1D89, 0x2467, 0x1D8A, 0x2468, 0x1D8B,
- 0x2469, 0x1D8C, 0x246A, 0x1D8D, 0x246B, 0x1D8E, 0x246C, 0x1D8F,
- 0x246D, 0x1D90, 0x246E, 0x1D91, 0x246F, 0x1D92, 0x2470, 0x1D93,
- 0x2471, 0x1D94, 0x2472, 0x1D95, 0x2473, 0x1D96, 0x2474, 0x1F87,
- 0x2475, 0x1F88, 0x2476, 0x1F89, 0x2477, 0x1F8A, 0x2478, 0x1F8B,
- 0x2479, 0x1F8C, 0x247A, 0x1F8D, 0x247B, 0x1F8E, 0x247C, 0x1F8F,
- 0x247D, 0x1F90, 0x247E, 0x1F91, 0x247F, 0x1F92, 0x2480, 0x1F93,
- 0x2481, 0x1F94, 0x2482, 0x1F95, 0x2483, 0x1F96, 0x2484, 0x1F97,
- 0x2485, 0x1F98, 0x2486, 0x1F99, 0x2487, 0x1F9A, 0x2488, 0x1F7E,
- 0x2489, 0x1F7F, 0x248A, 0x1F80, 0x248B, 0x1F81, 0x248C, 0x1F82,
- 0x248D, 0x1F83, 0x248E, 0x1F84, 0x248F, 0x1F85, 0x2490, 0x1F86,
- 0x249C, 0x1FB0, 0x249D, 0x1FB1, 0x249E, 0x1FB2, 0x249F, 0x1FB3,
- 0x24A0, 0x1FB4, 0x24A1, 0x1FB5, 0x24A2, 0x1FB6, 0x24A3, 0x1FB7,
- 0x24A4, 0x1FB8, 0x24A5, 0x1FB9, 0x24A6, 0x1FBA, 0x24A7, 0x1FBB,
- 0x24A8, 0x1FBC, 0x24A9, 0x1FBD, 0x24AA, 0x1FBE, 0x24AB, 0x1FBF,
- 0x24AC, 0x1FC0, 0x24AD, 0x1FC1, 0x24AE, 0x1FC2, 0x24AF, 0x1FC3,
- 0x24B0, 0x1FC4, 0x24B1, 0x1FC5, 0x24B2, 0x1FC6, 0x24B3, 0x1FC7,
- 0x24B4, 0x1FC8, 0x24B5, 0x1FC9, 0x24B6, 0x2863, 0x24B7, 0x2864,
- 0x24B8, 0x2865, 0x24B9, 0x2866, 0x24BA, 0x2867, 0x24BB, 0x2868,
- 0x24BC, 0x2869, 0x24BD, 0x286A, 0x24BE, 0x286B, 0x24BF, 0x286C,
- 0x24C0, 0x286D, 0x24C1, 0x286E, 0x24C2, 0x286F, 0x24C3, 0x2870,
- 0x24C4, 0x2871, 0x24C5, 0x2872, 0x24C6, 0x2873, 0x24C7, 0x2874,
- 0x24C8, 0x2875, 0x24C9, 0x2876, 0x24CA, 0x2877, 0x24CB, 0x2878,
- 0x24CC, 0x2879, 0x24CD, 0x287A, 0x24CE, 0x287B, 0x24CF, 0x287C,
- 0x24D0, 0x2849, 0x24D1, 0x284A, 0x24D2, 0x284B, 0x24D3, 0x284C,
- 0x24D4, 0x284D, 0x24D5, 0x284E, 0x24D6, 0x284F, 0x24D7, 0x2850,
- 0x24D8, 0x2851, 0x24D9, 0x2852, 0x24DA, 0x2853, 0x24DB, 0x2854,
- 0x24DC, 0x2855, 0x24DD, 0x2856, 0x24DE, 0x2857, 0x24DF, 0x2858,
- 0x24E0, 0x2859, 0x24E1, 0x285A, 0x24E2, 0x285B, 0x24E3, 0x285C,
- 0x24E4, 0x285D, 0x24E5, 0x285E, 0x24E6, 0x285F, 0x24E7, 0x2860,
- 0x24E8, 0x2861, 0x24E9, 0x2862, 0x24EA, 0x2020, 0x24EB, 0x2913,
- 0x24EC, 0x2914, 0x24ED, 0x2915, 0x24EE, 0x2916, 0x24EF, 0x2917,
- 0x24F0, 0x2918, 0x24F1, 0x2919, 0x24F2, 0x291A, 0x24F3, 0x291B,
- 0x24F4, 0x291C, 0x24F5, 0x3F5F, 0x24F6, 0x3F60, 0x24F7, 0x3F61,
- 0x24F8, 0x3F62, 0x24F9, 0x3F63, 0x24FA, 0x3F64, 0x24FB, 0x3F65,
- 0x24FC, 0x3F66, 0x24FD, 0x3F67, 0x24FE, 0x3F68, 0x24FF, 0x2907,
- 0x2500, 0x1D37, 0x2501, 0x1D38, 0x2502, 0x1D39, 0x2503, 0x1D3A,
- 0x2504, 0x1D3B, 0x2505, 0x1D3C, 0x2506, 0x1D3D, 0x2507, 0x1D3E,
- 0x2508, 0x1D3F, 0x2509, 0x1D40, 0x250A, 0x1D41, 0x250B, 0x1D42,
- 0x250C, 0x1D43, 0x250D, 0x1D44, 0x250E, 0x1D45, 0x250F, 0x1D46,
- 0x2510, 0x1D47, 0x2511, 0x1D48, 0x2512, 0x1D49, 0x2513, 0x1D4A,
- 0x2514, 0x1D4B, 0x2515, 0x1D4C, 0x2516, 0x1D4D, 0x2517, 0x1D4E,
- 0x2518, 0x1D4F, 0x2519, 0x1D50, 0x251A, 0x1D51, 0x251B, 0x1D52,
- 0x251C, 0x1D53, 0x251D, 0x1D54, 0x251E, 0x1D55, 0x251F, 0x1D56,
- 0x2520, 0x1D57, 0x2521, 0x1D58, 0x2522, 0x1D59, 0x2523, 0x1D5A,
- 0x2524, 0x1D5B, 0x2525, 0x1D5C, 0x2526, 0x1D5D, 0x2527, 0x1D5E,
- 0x2528, 0x1D5F, 0x2529, 0x1D60, 0x252A, 0x1D61, 0x252B, 0x1D62,
- 0x252C, 0x1D63, 0x252D, 0x1D64, 0x252E, 0x1D65, 0x252F, 0x1D66,
- 0x2530, 0x1D67, 0x2531, 0x1D68, 0x2532, 0x1D69, 0x2533, 0x1D6A,
- 0x2534, 0x1D6B, 0x2535, 0x1D6C, 0x2536, 0x1D6D, 0x2537, 0x1D6E,
- 0x2538, 0x1D6F, 0x2539, 0x1D70, 0x253A, 0x1D71, 0x253B, 0x1D72,
- 0x253C, 0x1D73, 0x253D, 0x1D74, 0x253E, 0x1D75, 0x253F, 0x1D76,
- 0x2540, 0x1D77, 0x2541, 0x1D78, 0x2542, 0x1D79, 0x2543, 0x1D7A,
- 0x2544, 0x1D7B, 0x2545, 0x1D7C, 0x2546, 0x1D7D, 0x2547, 0x1D7E,
- 0x2548, 0x1D7F, 0x2549, 0x1D80, 0x254A, 0x1D81, 0x254B, 0x1D82,
- 0x2550, 0x203B, 0x255E, 0x203C, 0x2561, 0x203E, 0x256A, 0x203D,
- 0x256D, 0x2037, 0x256E, 0x2038, 0x256F, 0x203A, 0x2570, 0x2039,
- 0x2571, 0x2045, 0x2572, 0x2046, 0x2573, 0x2047, 0x2581, 0x2026,
- 0x2582, 0x2027, 0x2583, 0x2028, 0x2584, 0x2029, 0x2585, 0x202A,
- 0x2586, 0x202B, 0x2587, 0x202C, 0x2588, 0x202D, 0x2589, 0x2034,
- 0x258A, 0x2033, 0x258B, 0x2032, 0x258C, 0x2031, 0x258D, 0x2030,
- 0x258E, 0x202F, 0x258F, 0x202E, 0x2594, 0x2035, 0x2595, 0x2036,
- 0x25A0, 0x02D9, 0x25A1, 0x02D8, 0x25A2, 0x1F4F, 0x25AA, 0x2FCF,
- 0x25AB, 0x2FCD, 0x25B1, 0x3F6B, 0x25B2, 0x02DB, 0x25B3, 0x02DA,
- 0x25B6, 0x2FA3, 0x25B7, 0x1F4A, 0x25BC, 0x02DD, 0x25BD, 0x02DC,
- 0x25C0, 0x2FA2, 0x25C1, 0x1F49, 0x25C6, 0x02D7, 0x25C7, 0x02D6,
- 0x25C9, 0x2012, 0x25CB, 0x02D3, 0x25CC, 0x2906, 0x25CE, 0x02D5,
- 0x25CF, 0x02D4, 0x25D0, 0x3F92, 0x25D1, 0x3F93, 0x25D2, 0x3F94,
- 0x25D3, 0x3F95, 0x25E2, 0x203F, 0x25E3, 0x2040, 0x25E4, 0x2042,
- 0x25E5, 0x2041, 0x25E6, 0x2FDE, 0x25EF, 0x030B, 0x2600, 0x2017,
- 0x2601, 0x2018, 0x2602, 0x2019, 0x2603, 0x201A, 0x2605, 0x02D2,
- 0x2606, 0x02D1, 0x260E, 0x1F78, 0x2616, 0x3F69, 0x2617, 0x3F6A,
- 0x261C, 0x201C, 0x261D, 0x201D, 0x261E, 0x201B, 0x261F, 0x201E,
- 0x2640, 0x02C2, 0x2642, 0x02C1, 0x2660, 0x2013, 0x2661, 0x1F51,
- 0x2662, 0x1F53, 0x2663, 0x2015, 0x2664, 0x1F52, 0x2665, 0x2014,
- 0x2666, 0x2016, 0x2667, 0x1F50, 0x2668, 0x2F42, 0x2669, 0x2F43,
- 0x266A, 0x0307, 0x266B, 0x3F48, 0x266C, 0x2F44, 0x266D, 0x0306,
- 0x266E, 0x3F47, 0x266F, 0x0305, 0x2672, 0x3FBA, 0x2673, 0x3FBB,
- 0x2674, 0x3FBC, 0x2675, 0x3FBD, 0x2676, 0x3FBE, 0x2677, 0x3FBF,
- 0x2678, 0x3FC0, 0x2679, 0x3FC1, 0x267A, 0x3FC2, 0x267B, 0x3FC3,
- 0x267C, 0x3FC4, 0x267D, 0x3FC5, 0x26A0, 0x2FA0, 0x2702, 0x2F90,
- 0x2713, 0x3F8E, 0x271A, 0x2FD1, 0x273F, 0x2FC5, 0x2740, 0x2FC4,
- 0x2756, 0x2FE3, 0x2776, 0x205E, 0x2777, 0x205F, 0x2778, 0x2060,
- 0x2779, 0x2061, 0x277A, 0x2062, 0x277B, 0x2063, 0x277C, 0x2064,
- 0x277D, 0x2065, 0x277E, 0x2066, 0x277F, 0x2912, 0x27A1, 0x200E,
- 0x2934, 0x3F49, 0x2935, 0x3F4A, 0x29BF, 0x3F4B, 0x29FA, 0x3F4F,
- 0x29FB, 0x3F50, 0x2B05, 0x200F, 0x2B06, 0x2010, 0x2B07, 0x2011,
- 0x2E83, 0x37E1, 0x2E85, 0x3620, 0x2E87, 0x3719, 0x2E89, 0x3814,
- 0x2E8B, 0x371E, 0x2E8C, 0x3609, 0x2E8D, 0x360A, 0x2E8E, 0x1071,
- 0x2E8F, 0x388C, 0x2E90, 0x1226, 0x2E92, 0x0EB2, 0x2E93, 0x1283,
- 0x2E94, 0x12AB, 0x2E95, 0x3C1F, 0x2E96, 0x38C2, 0x2E97, 0x361C,
- 0x2E98, 0x38E1, 0x2E99, 0x13C3, 0x2E9B, 0x13E1, 0x2E9E, 0x45E5,
- 0x2E9F, 0x0E3C, 0x2EA0, 0x0EBD, 0x2EA1, 0x3961, 0x2EA2, 0x3962,
- 0x2EA3, 0x399D, 0x2EA4, 0x3C26, 0x2EA6, 0x374D, 0x2EA8, 0x39BC,
- 0x2EA9, 0x35A1, 0x2EAA, 0x36AB, 0x2EAB, 0x3A97, 0x2EAC, 0x4ABA,
- 0x2EAD, 0x3A39, 0x2EAE, 0x3662, 0x2EB1, 0x3A98, 0x2EB2, 0x3A97,
- 0x2EB3, 0x376D, 0x2EB7, 0x36FE, 0x2EB9, 0x3713, 0x2EBC, 0x35B3,
- 0x2EBD, 0x354E, 0x2EBE, 0x3775, 0x2EBF, 0x3776, 0x2EC0, 0x3777,
- 0x2EC1, 0x078B, 0x2EC2, 0x3B0A, 0x2EC3, 0x362E, 0x2EC4, 0x0A62,
- 0x2EC6, 0x3572, 0x2ECA, 0x364A, 0x2ECC, 0x3C2B, 0x2ECD, 0x3B50,
- 0x2ECF, 0x3B9E, 0x2ED1, 0x0BD5, 0x2ED2, 0x3B97, 0x2ED6, 0x3B9E,
- 0x2ED7, 0x354D, 0x2ED8, 0x0A68, 0x2EDD, 0x3617, 0x2EDE, 0x3619,
- 0x2EDF, 0x3618, 0x2EE4, 0x064E, 0x2EE8, 0x0D34, 0x2EE9, 0x052B,
- 0x2EEB, 0x0A6A, 0x2EED, 0x08C3, 0x2EEF, 0x0F7D, 0x2EF2, 0x064F,
- 0x2F00, 0x04B0, 0x2F01, 0x20B3, 0x2F02, 0x0FFF, 0x2F03, 0x1001,
- 0x2F04, 0x0535, 0x2F05, 0x1006, 0x2F06, 0x0CCB, 0x2F07, 0x100E,
- 0x2F08, 0x0A13, 0x2F09, 0x1070, 0x2F0A, 0x0CD6, 0x2F0B, 0x0D40,
- 0x2F0C, 0x107B, 0x2F0D, 0x1083, 0x2F0E, 0x1089, 0x2F0F, 0x1093,
- 0x2F10, 0x1098, 0x2F11, 0x0C5B, 0x2F12, 0x0F97, 0x2F13, 0x10C6,
- 0x2F14, 0x10CD, 0x2F15, 0x10CE, 0x2F16, 0x10D3, 0x2F17, 0x0947,
- 0x2F18, 0x0E7C, 0x2F19, 0x10DC, 0x2F1A, 0x10E1, 0x2F1B, 0x10E8,
- 0x2F1C, 0x0EA2, 0x2F1D, 0x07B1, 0x2F1E, 0x116B, 0x2F1F, 0x0C54,
- 0x2F20, 0x089C, 0x2F21, 0x11BA, 0x2F22, 0x11BB, 0x2F23, 0x0F26,
- 0x2F24, 0x0B47, 0x2F25, 0x0981, 0x2F26, 0x08A0, 0x2F27, 0x120E,
- 0x2F28, 0x0A47, 0x2F29, 0x0996, 0x2F2A, 0x1226, 0x2F2B, 0x1228,
- 0x2F2C, 0x1232, 0x2F2D, 0x0881, 0x2F2E, 0x126C, 0x2F2F, 0x07BB,
- 0x2F30, 0x077E, 0x2F31, 0x06CA, 0x2F32, 0x05EF, 0x2F33, 0x1283,
- 0x2F34, 0x1285, 0x2F35, 0x1299, 0x2F36, 0x129B, 0x2F37, 0x12A0,
- 0x2F38, 0x0677, 0x2F39, 0x38B9, 0x2F3A, 0x12AF, 0x2F3B, 0x12B1,
- 0x2F3C, 0x09FA, 0x2F3D, 0x1342, 0x2F3E, 0x0781, 0x2F3F, 0x0916,
- 0x2F40, 0x08A7, 0x2F41, 0x13C2, 0x2F42, 0x0E08, 0x2F43, 0x0C47,
- 0x2F44, 0x06CC, 0x2F45, 0x0E4D, 0x2F46, 0x13E0, 0x2F47, 0x0CD4,
- 0x2F48, 0x140C, 0x2F49, 0x0744, 0x2F4A, 0x0EE6, 0x2F4B, 0x073D,
- 0x2F4C, 0x08AD, 0x2F4D, 0x14E5, 0x2F4E, 0x14F4, 0x2F4F, 0x14F8,
- 0x2F50, 0x0D7A, 0x2F51, 0x0EDF, 0x2F52, 0x08AF, 0x2F53, 0x1502,
- 0x2F54, 0x0A2B, 0x2F55, 0x0550, 0x2F56, 0x0BFA, 0x2F57, 0x0DD5,
- 0x2F58, 0x15E4, 0x2F59, 0x15E6, 0x2F5A, 0x0E22, 0x2F5B, 0x0567,
- 0x2F5C, 0x0687, 0x2F5D, 0x0758, 0x2F5E, 0x0770, 0x2F5F, 0x06C4,
- 0x2F60, 0x04DD, 0x2F61, 0x05E0, 0x2F62, 0x0601, 0x2F63, 0x0A5C,
- 0x2F64, 0x0F3B, 0x2F65, 0x0C3E, 0x2F66, 0x0D97, 0x2F67, 0x3A00,
- 0x2F68, 0x1697, 0x2F69, 0x0D28, 0x2F6A, 0x0D7D, 0x2F6B, 0x087C,
- 0x2F6C, 0x0EE8, 0x2F6D, 0x0EC3, 0x2F6E, 0x0EFC, 0x2F6F, 0x0A74,
- 0x2F70, 0x08D4, 0x2F71, 0x3A41, 0x2F72, 0x0553, 0x2F73, 0x0740,
- 0x2F74, 0x0F71, 0x2F75, 0x0B9B, 0x2F76, 0x0E16, 0x2F77, 0x08B3,
- 0x2F78, 0x0608, 0x2F79, 0x1813, 0x2F7A, 0x0F3D, 0x2F7B, 0x04CB,
- 0x2F7C, 0x0FDD, 0x2F7D, 0x08D5, 0x2F7E, 0x183D, 0x2F7F, 0x08D6,
- 0x2F80, 0x1853, 0x2F81, 0x0CD1, 0x2F82, 0x0A09, 0x2F83, 0x08D7,
- 0x2F84, 0x08B8, 0x2F85, 0x04D3, 0x2F86, 0x0A89, 0x2F87, 0x0AA6,
- 0x2F88, 0x0938, 0x2F89, 0x0821, 0x2F8A, 0x09ED, 0x2F8B, 0x18B2,
- 0x2F8C, 0x194F, 0x2F8D, 0x0BAC, 0x2F8E, 0x0742, 0x2F8F, 0x07E6,
- 0x2F90, 0x04A5, 0x2F91, 0x19EB, 0x2F92, 0x075F, 0x2F93, 0x05AF,
- 0x2F94, 0x0774, 0x2F95, 0x0B69, 0x2F96, 0x0C7E, 0x2F97, 0x1A56,
- 0x2F98, 0x1A59, 0x2F99, 0x058B, 0x2F9A, 0x0A7A, 0x2F9B, 0x0AF8,
- 0x2F9C, 0x0B0D, 0x2F9D, 0x0A0E, 0x2F9E, 0x0902, 0x2F9F, 0x0A0F,
- 0x2FA0, 0x0B62, 0x2FA1, 0x3B4F, 0x2FA2, 0x0F22, 0x2FA3, 0x0CAB,
- 0x2FA4, 0x0D64, 0x2FA5, 0x0F6C, 0x2FA6, 0x06DA, 0x2FA7, 0x0BD5,
- 0x2FA8, 0x0EF3, 0x2FA9, 0x0DDE, 0x2FAA, 0x1BC9, 0x2FAB, 0x1BCB,
- 0x2FAC, 0x04CD, 0x2FAD, 0x21F7, 0x2FAE, 0x0D87, 0x2FAF, 0x0ED8,
- 0x2FB0, 0x05B5, 0x2FB1, 0x1C03, 0x2FB2, 0x1C05, 0x2FB3, 0x053B,
- 0x2FB4, 0x0E17, 0x2FB5, 0x0DE9, 0x2FB6, 0x0D88, 0x2FB7, 0x09EF,
- 0x2FB8, 0x091F, 0x2FB9, 0x07F3, 0x2FBA, 0x0D05, 0x2FBB, 0x080E,
- 0x2FBC, 0x07F4, 0x2FBD, 0x1C6C, 0x2FBE, 0x1C7D, 0x2FBF, 0x1C83,
- 0x2FC0, 0x1C84, 0x2FC1, 0x064E, 0x2FC2, 0x0695, 0x2FC3, 0x0BD7,
- 0x2FC4, 0x1CF6, 0x2FC5, 0x08DB, 0x2FC6, 0x1D01, 0x2FC7, 0x0E91,
- 0x2FC8, 0x340B, 0x2FC9, 0x066A, 0x2FCA, 0x0807, 0x2FCB, 0x1D16,
- 0x2FCC, 0x1D19, 0x2FCD, 0x0C1E, 0x2FCE, 0x0791, 0x2FCF, 0x0ACF,
- 0x2FD0, 0x0D93, 0x2FD1, 0x1D21, 0x2FD2, 0x1D22, 0x2FD3, 0x0F7E,
- 0x2FD4, 0x1D30, 0x2FD5, 0x1D31, 0x3000, 0x0279, 0x3001, 0x027A,
- 0x3002, 0x027B, 0x3003, 0x028F, 0x3004, 0x2074, 0x3005, 0x0291,
- 0x3006, 0x0292, 0x3007, 0x0293, 0x3008, 0x02AA, 0x3009, 0x02AB,
- 0x300A, 0x02AC, 0x300B, 0x02AD, 0x300C, 0x02AE, 0x300D, 0x02AF,
- 0x300E, 0x02B0, 0x300F, 0x02B1, 0x3010, 0x02B2, 0x3011, 0x02B3,
- 0x3012, 0x02DF, 0x3013, 0x02E4, 0x3014, 0x02A4, 0x3015, 0x02A5,
- 0x3016, 0x3F45, 0x3017, 0x3F46, 0x3018, 0x2F61, 0x3019, 0x2F62,
- 0x301C, 0x0299, 0x301D, 0x1DB8, 0x301F, 0x1DB9, 0x3020, 0x1F7A,
- 0x3030, 0x2FBA, 0x3033, 0x2F4C, 0x3034, 0x2F4D, 0x3035, 0x2F4E,
- 0x3036, 0x1F79, 0x303B, 0x2F4A, 0x303C, 0x3F42, 0x303D, 0x2F93,
- 0x3041, 0x034A, 0x3042, 0x034B, 0x3043, 0x034C, 0x3044, 0x034D,
- 0x3045, 0x034E, 0x3046, 0x034F, 0x3047, 0x0350, 0x3048, 0x0351,
- 0x3049, 0x0352, 0x304A, 0x0353, 0x304B, 0x0354, 0x304C, 0x0355,
- 0x304D, 0x0356, 0x304E, 0x0357, 0x304F, 0x0358, 0x3050, 0x0359,
- 0x3051, 0x035A, 0x3052, 0x035B, 0x3053, 0x035C, 0x3054, 0x035D,
- 0x3055, 0x035E, 0x3056, 0x035F, 0x3057, 0x0360, 0x3058, 0x0361,
- 0x3059, 0x0362, 0x305A, 0x0363, 0x305B, 0x0364, 0x305C, 0x0365,
- 0x305D, 0x0366, 0x305E, 0x0367, 0x305F, 0x0368, 0x3060, 0x0369,
- 0x3061, 0x036A, 0x3062, 0x036B, 0x3063, 0x036C, 0x3064, 0x036D,
- 0x3065, 0x036E, 0x3066, 0x036F, 0x3067, 0x0370, 0x3068, 0x0371,
- 0x3069, 0x0372, 0x306A, 0x0373, 0x306B, 0x0374, 0x306C, 0x0375,
- 0x306D, 0x0376, 0x306E, 0x0377, 0x306F, 0x0378, 0x3070, 0x0379,
- 0x3071, 0x037A, 0x3072, 0x037B, 0x3073, 0x037C, 0x3074, 0x037D,
- 0x3075, 0x037E, 0x3076, 0x037F, 0x3077, 0x0380, 0x3078, 0x0381,
- 0x3079, 0x0382, 0x307A, 0x0383, 0x307B, 0x0384, 0x307C, 0x0385,
- 0x307D, 0x0386, 0x307E, 0x0387, 0x307F, 0x0388, 0x3080, 0x0389,
- 0x3081, 0x038A, 0x3082, 0x038B, 0x3083, 0x038C, 0x3084, 0x038D,
- 0x3085, 0x038E, 0x3086, 0x038F, 0x3087, 0x0390, 0x3088, 0x0391,
- 0x3089, 0x0392, 0x308A, 0x0393, 0x308B, 0x0394, 0x308C, 0x0395,
- 0x308D, 0x0396, 0x308E, 0x0397, 0x308F, 0x0398, 0x3090, 0x0399,
- 0x3091, 0x039A, 0x3092, 0x039B, 0x3093, 0x039C, 0x3094, 0x1F16,
- 0x3095, 0x1F17, 0x3096, 0x1F18, 0x3099, 0x3FC6, 0x309A, 0x3FC7,
- 0x309B, 0x0283, 0x309C, 0x0284, 0x309D, 0x028D, 0x309E, 0x028E,
- 0x309F, 0x2F95, 0x30A0, 0x3F4D, 0x30A1, 0x039D, 0x30A2, 0x039E,
- 0x30A3, 0x039F, 0x30A4, 0x03A0, 0x30A5, 0x03A1, 0x30A6, 0x03A2,
- 0x30A7, 0x03A3, 0x30A8, 0x03A4, 0x30A9, 0x03A5, 0x30AA, 0x03A6,
- 0x30AB, 0x03A7, 0x30AC, 0x03A8, 0x30AD, 0x03A9, 0x30AE, 0x03AA,
- 0x30AF, 0x03AB, 0x30B0, 0x03AC, 0x30B1, 0x03AD, 0x30B2, 0x03AE,
- 0x30B3, 0x03AF, 0x30B4, 0x03B0, 0x30B5, 0x03B1, 0x30B6, 0x03B2,
- 0x30B7, 0x03B3, 0x30B8, 0x03B4, 0x30B9, 0x03B5, 0x30BA, 0x03B6,
- 0x30BB, 0x03B7, 0x30BC, 0x03B8, 0x30BD, 0x03B9, 0x30BE, 0x03BA,
- 0x30BF, 0x03BB, 0x30C0, 0x03BC, 0x30C1, 0x03BD, 0x30C2, 0x03BE,
- 0x30C3, 0x03BF, 0x30C4, 0x03C0, 0x30C5, 0x03C1, 0x30C6, 0x03C2,
- 0x30C7, 0x03C3, 0x30C8, 0x03C4, 0x30C9, 0x03C5, 0x30CA, 0x03C6,
- 0x30CB, 0x03C7, 0x30CC, 0x03C8, 0x30CD, 0x03C9, 0x30CE, 0x03CA,
- 0x30CF, 0x03CB, 0x30D0, 0x03CC, 0x30D1, 0x03CD, 0x30D2, 0x03CE,
- 0x30D3, 0x03CF, 0x30D4, 0x03D0, 0x30D5, 0x03D1, 0x30D6, 0x03D2,
- 0x30D7, 0x03D3, 0x30D8, 0x03D4, 0x30D9, 0x03D5, 0x30DA, 0x03D6,
- 0x30DB, 0x03D7, 0x30DC, 0x03D8, 0x30DD, 0x03D9, 0x30DE, 0x03DA,
- 0x30DF, 0x03DB, 0x30E0, 0x03DC, 0x30E1, 0x03DD, 0x30E2, 0x03DE,
- 0x30E3, 0x03DF, 0x30E4, 0x03E0, 0x30E5, 0x03E1, 0x30E6, 0x03E2,
- 0x30E7, 0x03E3, 0x30E8, 0x03E4, 0x30E9, 0x03E5, 0x30EA, 0x03E6,
- 0x30EB, 0x03E7, 0x30EC, 0x03E8, 0x30ED, 0x03E9, 0x30EE, 0x03EA,
- 0x30EF, 0x03EB, 0x30F0, 0x03EC, 0x30F1, 0x03ED, 0x30F2, 0x03EE,
- 0x30F3, 0x03EF, 0x30F4, 0x03F0, 0x30F5, 0x03F1, 0x30F6, 0x03F2,
- 0x30F7, 0x2079, 0x30F8, 0x207A, 0x30F9, 0x207B, 0x30FA, 0x207C,
- 0x30FB, 0x027E, 0x30FC, 0x0294, 0x30FD, 0x028B, 0x30FE, 0x028C,
- 0x30FF, 0x3F43, 0x3190, 0x3F9B, 0x3191, 0x3F9C, 0x3192, 0x3F9D,
- 0x3193, 0x3F9E, 0x3194, 0x3F9F, 0x3195, 0x3FA0, 0x3196, 0x3FA1,
- 0x3197, 0x3FA2, 0x3198, 0x3FA3, 0x3199, 0x3FA4, 0x319A, 0x3FA5,
- 0x319B, 0x3FA6, 0x319C, 0x3FA7, 0x319D, 0x3FA8, 0x319E, 0x3FA9,
- 0x319F, 0x3FAA, 0x31F0, 0x3F6C, 0x31F1, 0x3F6D, 0x31F2, 0x3F6E,
- 0x31F3, 0x3F6F, 0x31F4, 0x3F70, 0x31F5, 0x3F71, 0x31F6, 0x3F72,
- 0x31F7, 0x3F73, 0x31F8, 0x3F74, 0x31F9, 0x3F75, 0x31FA, 0x3F77,
- 0x31FB, 0x3F78, 0x31FC, 0x3F79, 0x31FD, 0x3F7A, 0x31FE, 0x3F7B,
- 0x31FF, 0x3F7C, 0x3220, 0x278E, 0x3221, 0x278F, 0x3222, 0x2790,
- 0x3223, 0x2791, 0x3224, 0x2792, 0x3225, 0x2793, 0x3226, 0x2794,
- 0x3227, 0x2795, 0x3228, 0x2796, 0x3229, 0x2797, 0x322A, 0x2006,
- 0x322B, 0x2007, 0x322C, 0x2008, 0x322D, 0x2009, 0x322E, 0x200A,
- 0x322F, 0x200B, 0x3230, 0x2005, 0x3231, 0x1DC2, 0x3232, 0x1DC3,
- 0x3233, 0x1FCF, 0x3234, 0x1FCD, 0x3235, 0x1FD4, 0x3236, 0x1FD3,
- 0x3237, 0x200C, 0x3238, 0x1FCE, 0x3239, 0x1DC4, 0x323A, 0x1FD7,
- 0x323B, 0x1FD5, 0x323C, 0x1FD0, 0x323D, 0x1FCB, 0x323E, 0x1FD2,
- 0x323F, 0x1FCC, 0x3240, 0x1FD6, 0x3241, 0x200D, 0x3242, 0x1FD1,
- 0x3243, 0x1FCA, 0x3251, 0x1F9B, 0x3252, 0x1FA6, 0x3253, 0x1FA7,
- 0x3254, 0x1FA8, 0x3255, 0x1FA9, 0x3256, 0x1FAA, 0x3257, 0x1FAB,
- 0x3258, 0x1FAC, 0x3259, 0x1FAD, 0x325A, 0x1FAE, 0x325B, 0x1FAF,
- 0x325C, 0x2804, 0x325D, 0x2805, 0x325E, 0x2806, 0x325F, 0x2807,
- 0x3280, 0x28DD, 0x3281, 0x28DE, 0x3282, 0x28DF, 0x3283, 0x28E0,
- 0x3284, 0x28E1, 0x3285, 0x28E2, 0x3286, 0x28E3, 0x3287, 0x28E4,
- 0x3288, 0x28E5, 0x3289, 0x28E6, 0x328A, 0x28E8, 0x328B, 0x28E9,
- 0x328C, 0x28EA, 0x328D, 0x28EB, 0x328E, 0x28EC, 0x328F, 0x28ED,
- 0x3290, 0x28E7, 0x3291, 0x1FE1, 0x3292, 0x1FE0, 0x3293, 0x1FE2,
- 0x3294, 0x1FDC, 0x3295, 0x28FF, 0x3296, 0x1FE5, 0x3297, 0x28FC,
- 0x3298, 0x1FDE, 0x3299, 0x201F, 0x329A, 0x28F9, 0x329B, 0x28F8,
- 0x329C, 0x28FE, 0x329D, 0x207F, 0x329E, 0x1FFF, 0x329F, 0x28EF,
- 0x32A0, 0x28F6, 0x32A1, 0x28F7, 0x32A2, 0x28FB, 0x32A3, 0x28FA,
- 0x32A4, 0x1DBD, 0x32A5, 0x1DBE, 0x32A6, 0x1DBF, 0x32A7, 0x1DC0,
- 0x32A8, 0x1DC1, 0x32A9, 0x1FDA, 0x32AA, 0x1FDD, 0x32AB, 0x1FDF,
- 0x32AC, 0x1FE3, 0x32AD, 0x1FD9, 0x32AE, 0x1FE4, 0x32AF, 0x1FDB,
- 0x32B0, 0x1FD8, 0x32B1, 0x2808, 0x32B2, 0x2809, 0x32B3, 0x280A,
- 0x32B4, 0x280B, 0x32B5, 0x280C, 0x32B6, 0x280D, 0x32B7, 0x280E,
- 0x32B8, 0x280F, 0x32B9, 0x2810, 0x32BA, 0x2811, 0x32BB, 0x2812,
- 0x32BC, 0x2813, 0x32BD, 0x2814, 0x32BE, 0x2815, 0x32BF, 0x2816,
- 0x32D0, 0x28AD, 0x32D1, 0x28AE, 0x32D2, 0x28AF, 0x32D3, 0x28B0,
- 0x32D4, 0x28B1, 0x32D5, 0x28B2, 0x32D6, 0x28B3, 0x32D7, 0x28B4,
- 0x32D8, 0x28B5, 0x32D9, 0x28B6, 0x32DA, 0x28B7, 0x32DB, 0x28B8,
- 0x32DC, 0x28B9, 0x32DD, 0x28BA, 0x32DE, 0x28BB, 0x32DF, 0x28BC,
- 0x32E0, 0x28BD, 0x32E1, 0x28BE, 0x32E2, 0x28BF, 0x32E3, 0x28C0,
- 0x32E4, 0x28C1, 0x32E5, 0x28C2, 0x32E6, 0x28C3, 0x32E7, 0x28C4,
- 0x32E8, 0x28C5, 0x32E9, 0x28C6, 0x32EA, 0x28C7, 0x32EB, 0x28C8,
- 0x32EC, 0x28C9, 0x32ED, 0x28CA, 0x32EE, 0x28CB, 0x32EF, 0x28CC,
- 0x32F0, 0x28CD, 0x32F1, 0x28CE, 0x32F2, 0x28CF, 0x32F3, 0x28D0,
- 0x32F4, 0x28D1, 0x32F5, 0x28D2, 0x32F6, 0x28D3, 0x32F7, 0x28D4,
- 0x32F8, 0x28D5, 0x32F9, 0x28D6, 0x32FA, 0x28D7, 0x32FB, 0x28D8,
- 0x32FC, 0x28D9, 0x32FD, 0x28DA, 0x32FE, 0x28DB, 0x3300, 0x1F70,
- 0x3301, 0x2E62, 0x3302, 0x2E63, 0x3303, 0x1F6A, 0x3304, 0x2E64,
- 0x3305, 0x1FF7, 0x3306, 0x2E65, 0x3307, 0x2E69, 0x3308, 0x2E67,
- 0x3309, 0x2E6C, 0x330A, 0x2E6A, 0x330B, 0x2E6E, 0x330C, 0x2E70,
- 0x330D, 0x1DAB, 0x330E, 0x2E71, 0x330F, 0x2E72, 0x3310, 0x2E73,
- 0x3311, 0x2E74, 0x3312, 0x2E75, 0x3313, 0x2E76, 0x3314, 0x1DA2,
- 0x3315, 0x1F69, 0x3316, 0x1F67, 0x3317, 0x2E78, 0x3318, 0x1F68,
- 0x3319, 0x2E7A, 0x331A, 0x2E7C, 0x331B, 0x2E7D, 0x331C, 0x2E7E,
- 0x331D, 0x2E7F, 0x331E, 0x1F73, 0x331F, 0x2E80, 0x3320, 0x2E81,
- 0x3321, 0x2E82, 0x3322, 0x1F66, 0x3323, 0x1F6B, 0x3324, 0x2E83,
- 0x3325, 0x2E85, 0x3326, 0x1DAC, 0x3327, 0x1DA6, 0x3328, 0x2E88,
- 0x3329, 0x2E89, 0x332A, 0x1F74, 0x332B, 0x1DAE, 0x332D, 0x2E8B,
- 0x332E, 0x2E8E, 0x332F, 0x2E8F, 0x3330, 0x2E90, 0x3331, 0x1F71,
- 0x3332, 0x2E91, 0x3333, 0x2087, 0x3334, 0x2E94, 0x3335, 0x2E95,
- 0x3336, 0x1DA8, 0x3337, 0x2E9A, 0x3338, 0x2E9C, 0x3339, 0x1F6E,
- 0x333A, 0x2E9D, 0x333B, 0x1F6F, 0x333C, 0x2E96, 0x333D, 0x2E9E,
- 0x333E, 0x2EA0, 0x333F, 0x2EA1, 0x3340, 0x2EA2, 0x3341, 0x2E9F,
- 0x3342, 0x1F6D, 0x3343, 0x2EA3, 0x3344, 0x2EA4, 0x3345, 0x2EA5,
- 0x3346, 0x2EA6, 0x3347, 0x1F72, 0x3348, 0x2EA7, 0x3349, 0x1DA1,
- 0x334A, 0x1DAF, 0x334B, 0x2EA8, 0x334C, 0x2EA9, 0x334D, 0x1DA4,
- 0x334E, 0x2088, 0x334F, 0x2EAA, 0x3350, 0x2EAB, 0x3351, 0x1DA9,
- 0x3352, 0x2EAE, 0x3353, 0x2EB2, 0x3354, 0x2EAF, 0x3355, 0x2EB3,
- 0x3356, 0x2EB4, 0x3357, 0x1F6C, 0x3371, 0x2E55, 0x337B, 0x2083,
- 0x337C, 0x1DC7, 0x337D, 0x1DC6, 0x337E, 0x1DC5, 0x337F, 0x1F76,
- 0x3385, 0x1F5F, 0x3386, 0x1F60, 0x3387, 0x1F61, 0x3388, 0x2000,
- 0x3389, 0x2001, 0x338D, 0x2E58, 0x338E, 0x1DB4, 0x338F, 0x1DB5,
- 0x3390, 0x1F63, 0x3396, 0x1F65, 0x3397, 0x1F58, 0x3398, 0x1F5A,
- 0x339B, 0x2E59, 0x339C, 0x1DB1, 0x339D, 0x1DB2, 0x339E, 0x1DB3,
- 0x339F, 0x1FFA, 0x33A0, 0x1F54, 0x33A1, 0x1DB7, 0x33A2, 0x1F55,
- 0x33A3, 0x1FFB, 0x33A4, 0x1F56, 0x33A5, 0x1F57, 0x33A6, 0x1FFC,
- 0x33B0, 0x1F5E, 0x33B1, 0x1F5D, 0x33B2, 0x1F5C, 0x33B3, 0x1F5B,
- 0x33C2, 0x2E50, 0x33C4, 0x1DB6, 0x33C8, 0x2002, 0x33CB, 0x1F62,
- 0x33CC, 0x1FF6, 0x33CD, 0x1DBB, 0x33D4, 0x1F64, 0x33D7, 0x2E5D,
- 0x33D8, 0x2E5E, 0x33DA, 0x2E4B, 0x3402, 0x3582, 0x3405, 0x3C1B,
- 0x3406, 0x435A, 0x3427, 0x3656, 0x342C, 0x435E, 0x342E, 0x3788,
- 0x3468, 0x36DF, 0x346A, 0x4375, 0x3488, 0x3C52, 0x3492, 0x438E,
- 0x34B5, 0x4199, 0x34BC, 0x4397, 0x34C1, 0x47D0, 0x34C7, 0x439B,
- 0x34DB, 0x3C41, 0x351F, 0x3629, 0x353E, 0x371E, 0x355D, 0x43BD,
- 0x355E, 0x43BE, 0x3563, 0x43C0, 0x356E, 0x43C4, 0x35A6, 0x43D9,
- 0x35A8, 0x43DB, 0x35C5, 0x43E1, 0x35DA, 0x43EA, 0x35DE, 0x4E63,
- 0x35F4, 0x43F3, 0x3605, 0x43FA, 0x3614, 0x4ABB, 0x364A, 0x4421,
- 0x3691, 0x4441, 0x3696, 0x4445, 0x3699, 0x4443, 0x36CF, 0x4456,
- 0x3761, 0x4478, 0x3762, 0x4479, 0x376B, 0x447D, 0x376C, 0x447C,
- 0x3775, 0x4480, 0x378D, 0x361A, 0x37C1, 0x448E, 0x37E2, 0x372B,
- 0x37E8, 0x44A2, 0x37F4, 0x44A5, 0x37FD, 0x44A8, 0x3800, 0x44AA,
- 0x382F, 0x44B4, 0x3836, 0x44B5, 0x3840, 0x44B6, 0x385C, 0x44BA,
- 0x3861, 0x44BC, 0x38A1, 0x4ECB, 0x38AD, 0x4ABC, 0x38FA, 0x361C,
- 0x3917, 0x44D9, 0x391A, 0x44DC, 0x396F, 0x44EB, 0x39A4, 0x4E9A,
- 0x39B8, 0x4E9B, 0x3A5C, 0x4E9F, 0x3A6E, 0x4531, 0x3A73, 0x4534,
- 0x3A85, 0x4EAE, 0x3AC4, 0x4EA7, 0x3ACB, 0x4EA8, 0x3AD6, 0x4543,
- 0x3AD7, 0x455E, 0x3AEA, 0x454D, 0x3AF3, 0x3C40, 0x3B0E, 0x4558,
- 0x3B1A, 0x455C, 0x3B1C, 0x455D, 0x3B22, 0x3C49, 0x3B6D, 0x458C,
- 0x3B77, 0x4585, 0x3B87, 0x45A2, 0x3B88, 0x368D, 0x3B8D, 0x45A4,
- 0x3BA4, 0x45AA, 0x3BB6, 0x420E, 0x3BC3, 0x420F, 0x3BCD, 0x45B8,
- 0x3BF0, 0x45C9, 0x3BF3, 0x4EB7, 0x3C0F, 0x4217, 0x3C26, 0x45DF,
- 0x3CC3, 0x45FC, 0x3CD2, 0x4601, 0x3D11, 0x4625, 0x3D1E, 0x4630,
- 0x3D31, 0x4EBE, 0x3D4E, 0x1DE7, 0x3D64, 0x464A, 0x3D9A, 0x4658,
- 0x3DC0, 0x466A, 0x3DCC, 0x4ABD, 0x3DD4, 0x466F, 0x3E05, 0x467B,
- 0x3E3F, 0x4248, 0x3E40, 0x4ECA, 0x3E60, 0x468B, 0x3E66, 0x468D,
- 0x3E68, 0x468E, 0x3E83, 0x4695, 0x3E8A, 0x3C43, 0x3E94, 0x469B,
- 0x3EDA, 0x3C48, 0x3F57, 0x46CB, 0x3F72, 0x4258, 0x3F75, 0x46D9,
- 0x3F77, 0x46DB, 0x3FAE, 0x46ED, 0x3FB1, 0x3754, 0x3FC9, 0x46F8,
- 0x3FD7, 0x46FD, 0x3FDC, 0x4ABE, 0x4039, 0x470F, 0x4058, 0x4716,
- 0x4093, 0x3C4C, 0x4103, 0x3C4F, 0x4105, 0x473B, 0x4148, 0x4747,
- 0x414F, 0x474A, 0x4163, 0x474E, 0x41B4, 0x475D, 0x41BF, 0x4760,
- 0x41E6, 0x476B, 0x41EE, 0x476F, 0x41F3, 0x476C, 0x4207, 0x4776,
- 0x420E, 0x4779, 0x4264, 0x3760, 0x4293, 0x3C50, 0x42C6, 0x479F,
- 0x42D6, 0x47AA, 0x42DD, 0x47AE, 0x4302, 0x47BC, 0x432B, 0x47C9,
- 0x4343, 0x47CB, 0x43EE, 0x47F7, 0x43F0, 0x47FA, 0x4408, 0x4800,
- 0x440C, 0x3C42, 0x4417, 0x4802, 0x441C, 0x4803, 0x4422, 0x4805,
- 0x4453, 0x3773, 0x445B, 0x42A4, 0x4476, 0x481C, 0x447A, 0x481D,
- 0x4491, 0x4823, 0x44B3, 0x483E, 0x44BE, 0x483C, 0x44D4, 0x483D,
- 0x4508, 0x485C, 0x450D, 0x4858, 0x4525, 0x377E, 0x4543, 0x486C,
- 0x457A, 0x3C4B, 0x459D, 0x42D4, 0x45B8, 0x48A0, 0x45BE, 0x4ABF,
- 0x45E5, 0x48BA, 0x45EA, 0x42D9, 0x460F, 0x48CA, 0x4610, 0x4AC0,
- 0x4641, 0x48D8, 0x4665, 0x3C4E, 0x46A1, 0x48E9, 0x46AE, 0x3C51,
- 0x46AF, 0x48ED, 0x470C, 0x4902, 0x471F, 0x4EFB, 0x4764, 0x4918,
- 0x47E6, 0x3790, 0x47FD, 0x4924, 0x4816, 0x492E, 0x481E, 0x4F01,
- 0x4844, 0x42F5, 0x484E, 0x493A, 0x48B5, 0x495B, 0x49B0, 0x431F,
- 0x49E7, 0x49D2, 0x49FA, 0x49D6, 0x4A04, 0x49DB, 0x4A29, 0x49DE,
- 0x4ABC, 0x49F6, 0x4B38, 0x35DF, 0x4B3B, 0x4A0E, 0x4B7E, 0x4AC1,
- 0x4BC2, 0x4A33, 0x4BCA, 0x4A35, 0x4BD2, 0x4A37, 0x4BE8, 0x3C46,
- 0x4C17, 0x4334, 0x4C20, 0x4A48, 0x4C38, 0x4AC2, 0x4CC4, 0x4A84,
- 0x4CD1, 0x4A87, 0x4CE1, 0x4AC3, 0x4D07, 0x4A9B, 0x4D77, 0x4AAB,
- 0x4E00, 0x04B0, 0x4E01, 0x0BB8, 0x4E02, 0x4352, 0x4E03, 0x08E3,
- 0x4E04, 0x37D8, 0x4E05, 0x37D9, 0x4E07, 0x0EAA, 0x4E08, 0x09CE,
- 0x4E09, 0x087E, 0x4E0A, 0x09CD, 0x4E0B, 0x053C, 0x4E0C, 0x4AC4,
- 0x4E0D, 0x0DC6, 0x4E0E, 0x0F29, 0x4E0F, 0x4353, 0x4E10, 0x0FFB,
- 0x4E11, 0x04D1, 0x4E12, 0x4354, 0x4E14, 0x05CC, 0x4E15, 0x0FFC,
- 0x4E16, 0x0A48, 0x4E17, 0x10D7, 0x4E18, 0x0670, 0x4E19, 0x0E0A,
- 0x4E1E, 0x09CF, 0x4E1F, 0x37DA, 0x4E21, 0x0F86, 0x4E23, 0x4AC5,
- 0x4E24, 0x4AC6, 0x4E26, 0x0E12, 0x4E28, 0x20B3, 0x4E29, 0x4355,
- 0x4E2A, 0x0FFD, 0x4E2B, 0x37DB, 0x4E2C, 0x374D, 0x4E2D, 0x0BA4,
- 0x4E2E, 0x4356, 0x4E2F, 0x37DC, 0x4E30, 0x37DD, 0x4E31, 0x0FFE,
- 0x4E32, 0x06F2, 0x4E36, 0x0FFF, 0x4E37, 0x369D, 0x4E38, 0x0619,
- 0x4E39, 0x0B6E, 0x4E3B, 0x0913, 0x4E3C, 0x1000, 0x4E3F, 0x1001,
- 0x4E40, 0x37DE, 0x4E41, 0x37DF, 0x4E42, 0x1002, 0x4E43, 0x0CEB,
- 0x4E44, 0x37E0, 0x4E45, 0x0671, 0x4E47, 0x4357, 0x4E48, 0x372E,
- 0x4E4B, 0x0CED, 0x4E4D, 0x0CBB, 0x4E4E, 0x0777, 0x4E4F, 0x0E61,
- 0x4E51, 0x4359, 0x4E55, 0x1950, 0x4E56, 0x1003, 0x4E57, 0x09D0,
- 0x4E58, 0x1004, 0x4E59, 0x0535, 0x4E5A, 0x37E1, 0x4E5D, 0x06DD,
- 0x4E5E, 0x07A4, 0x4E5F, 0x0EF5, 0x4E62, 0x1233, 0x4E69, 0x435C,
- 0x4E71, 0x0F5A, 0x4E73, 0x0CD5, 0x4E79, 0x4AC7, 0x4E7E, 0x05E1,
- 0x4E7F, 0x37E2, 0x4E80, 0x064F, 0x4E82, 0x1005, 0x4E85, 0x1006,
- 0x4E86, 0x0F83, 0x4E88, 0x0F27, 0x4E89, 0x0AEA, 0x4E8A, 0x1008,
- 0x4E8B, 0x08C4, 0x4E8C, 0x0CCB, 0x4E8D, 0x37E3, 0x4E8E, 0x100B,
- 0x4E91, 0x04E0, 0x4E92, 0x0793, 0x4E94, 0x0792, 0x4E95, 0x04AA,
- 0x4E96, 0x37E4, 0x4E98, 0x0FF1, 0x4E99, 0x0FF0, 0x4E9B, 0x0823,
- 0x4E9C, 0x0465, 0x4E9D, 0x435D, 0x4E9E, 0x100C, 0x4E9F, 0x100D,
- 0x4EA0, 0x100E, 0x4EA1, 0x0E62, 0x4EA2, 0x100F, 0x4EA4, 0x07A6,
- 0x4EA5, 0x04AB, 0x4EA6, 0x0EA0, 0x4EA8, 0x0696, 0x4EAB, 0x0697,
- 0x4EAC, 0x0698, 0x4EAD, 0x0BFE, 0x4EAE, 0x0F84, 0x4EB0, 0x1010,
- 0x4EB3, 0x1011, 0x4EB6, 0x1012, 0x4EB9, 0x37E5, 0x4EBA, 0x0A13,
- 0x4EBB, 0x3620, 0x4EBC, 0x435F, 0x4EC0, 0x0944, 0x4EC1, 0x0A14,
- 0x4EC2, 0x1017, 0x4EC3, 0x4360, 0x4EC4, 0x1015, 0x4EC6, 0x1016,
- 0x4EC7, 0x0672, 0x4EC8, 0x4361, 0x4ECA, 0x0813, 0x4ECB, 0x0570,
- 0x4ECD, 0x1014, 0x4ECE, 0x1013, 0x4ECF, 0x0DF9, 0x4ED0, 0x37E6,
- 0x4ED4, 0x0894, 0x4ED5, 0x0893, 0x4ED6, 0x0B1E, 0x4ED7, 0x1018,
- 0x4ED8, 0x0DC7, 0x4ED9, 0x0A8B, 0x4EDA, 0x4363, 0x4EDD, 0x0290,
- 0x4EDE, 0x1019, 0x4EDF, 0x101B, 0x4EE0, 0x37E7, 0x4EE1, 0x20B4,
- 0x4EE3, 0x0B45, 0x4EE4, 0x0FA9, 0x4EE5, 0x048E, 0x4EEB, 0x4362,
- 0x4EED, 0x101A, 0x4EEE, 0x053E, 0x4EF0, 0x06BC, 0x4EF1, 0x4364,
- 0x4EF2, 0x0BA5, 0x4EF3, 0x4AC8, 0x4EF5, 0x4365, 0x4EF6, 0x0745,
- 0x4EF7, 0x101C, 0x4EFB, 0x0CDA, 0x4EFC, 0x20B5, 0x4EFD, 0x37E8,
- 0x4EFF, 0x37E9, 0x4F00, 0x20B6, 0x4F01, 0x0627, 0x4F03, 0x20B7,
- 0x4F09, 0x101D, 0x4F0A, 0x048F, 0x4F0B, 0x37EA, 0x4F0C, 0x4AC9,
- 0x4F0D, 0x0794, 0x4F0E, 0x0628, 0x4F0F, 0x0DEC, 0x4F10, 0x0D46,
- 0x4F11, 0x0673, 0x4F15, 0x37EB, 0x4F16, 0x4366, 0x4F19, 0x4ACA,
- 0x4F1A, 0x0571, 0x4F1C, 0x1040, 0x4F1D, 0x0C3B, 0x4F2B, 0x4ACB,
- 0x4F2E, 0x4ACC, 0x4F2F, 0x0D22, 0x4F30, 0x101F, 0x4F31, 0x4ACD,
- 0x4F34, 0x0D50, 0x4F36, 0x0FAA, 0x4F37, 0x4368, 0x4F38, 0x09F3,
- 0x4F39, 0x20B8, 0x4F3A, 0x0895, 0x4F3B, 0x37ED, 0x4F3C, 0x08C5,
- 0x4F3D, 0x0540, 0x4F3E, 0x4369, 0x4F43, 0x0BED, 0x4F46, 0x0B60,
- 0x4F47, 0x1023, 0x4F48, 0x418B, 0x4F49, 0x37EE, 0x4F4D, 0x0490,
- 0x4F4E, 0x0BFF, 0x4F4F, 0x0945, 0x4F50, 0x0824, 0x4F51, 0x0F0E,
- 0x4F53, 0x0B2E, 0x4F54, 0x37EF, 0x4F55, 0x053F, 0x4F56, 0x20B9,
- 0x4F57, 0x1022, 0x4F58, 0x436A, 0x4F59, 0x0F28, 0x4F5A, 0x101E,
- 0x4F5B, 0x1020, 0x4F5C, 0x085E, 0x4F5D, 0x1021, 0x4F5E, 0x11D3,
- 0x4F5F, 0x418C, 0x4F60, 0x37EC, 0x4F64, 0x4367, 0x4F69, 0x1029,
- 0x4F6A, 0x418D, 0x4F6C, 0x418E, 0x4F6F, 0x102C, 0x4F70, 0x102A,
- 0x4F73, 0x0542, 0x4F75, 0x0E0B, 0x4F76, 0x1024, 0x4F77, 0x436C,
- 0x4F78, 0x436D, 0x4F7A, 0x37F0, 0x4F7B, 0x1028, 0x4F7C, 0x07A7,
- 0x4F7D, 0x37F1, 0x4F7E, 0x37F2, 0x4F7F, 0x0896, 0x4F82, 0x436E,
- 0x4F83, 0x05E2, 0x4F84, 0x4ACE, 0x4F85, 0x436F, 0x4F86, 0x102D,
- 0x4F88, 0x1025, 0x4F8A, 0x20BB, 0x4F8B, 0x0FAB, 0x4F8D, 0x08C6,
- 0x4F8F, 0x1026, 0x4F91, 0x102B, 0x4F92, 0x20BA, 0x4F94, 0x20BD,
- 0x4F96, 0x102E, 0x4F97, 0x37F3, 0x4F98, 0x1027, 0x4F9A, 0x20BC,
- 0x4F9B, 0x0699, 0x4F9D, 0x0491, 0x4F9E, 0x4ACF, 0x4FA0, 0x069A,
- 0x4FA1, 0x0541, 0x4FAB, 0x11D4, 0x4FAD, 0x0EA7, 0x4FAE, 0x0DE0,
- 0x4FAF, 0x07A8, 0x4FB2, 0x4371, 0x4FB5, 0x09F5, 0x4FB6, 0x0F7F,
- 0x4FB7, 0x4AD0, 0x4FBE, 0x37F4, 0x4FBF, 0x0E28, 0x4FC2, 0x070E,
- 0x4FC3, 0x0B05, 0x4FC4, 0x0564, 0x4FC5, 0x4372, 0x4FC9, 0x20AC,
- 0x4FCA, 0x095D, 0x4FCB, 0x4373, 0x4FCD, 0x20BE, 0x4FCE, 0x1032,
- 0x4FCF, 0x37F5, 0x4FD0, 0x1037, 0x4FD1, 0x1035, 0x4FD2, 0x4374,
- 0x4FD3, 0x3C2F, 0x4FD4, 0x1030, 0x4FD7, 0x0B0F, 0x4FD8, 0x1033,
- 0x4FDA, 0x1036, 0x4FDB, 0x1034, 0x4FDD, 0x0E2D, 0x4FDF, 0x1031,
- 0x4FE0, 0x1DEC, 0x4FE1, 0x09F4, 0x4FE3, 0x0EA1, 0x4FE4, 0x1038,
- 0x4FE5, 0x1039, 0x4FE6, 0x4370, 0x4FEE, 0x092E, 0x4FEF, 0x1046,
- 0x4FF1, 0x35A3, 0x4FF2, 0x4376, 0x4FF3, 0x0D06, 0x4FF5, 0x0DA8,
- 0x4FF6, 0x1041, 0x4FF8, 0x0E40, 0x4FFA, 0x0536, 0x4FFD, 0x37F6,
- 0x4FFE, 0x1045, 0x4FFF, 0x20C1, 0x5000, 0x37F7, 0x5001, 0x37F8,
- 0x5002, 0x4F4B, 0x5004, 0x4AD1, 0x5005, 0x103F, 0x5006, 0x1048,
- 0x5009, 0x0AD4, 0x500B, 0x0778, 0x500C, 0x4AD2, 0x500D, 0x0D12,
- 0x500E, 0x418F, 0x500F, 0x1600, 0x5010, 0x37F9, 0x5011, 0x1047,
- 0x5012, 0x0C57, 0x5013, 0x4377, 0x5014, 0x103C, 0x5016, 0x07AA,
- 0x5018, 0x4190, 0x5019, 0x07A9, 0x501A, 0x103A, 0x501B, 0x37FA,
- 0x501C, 0x4378, 0x501E, 0x20C2, 0x501F, 0x0906, 0x5021, 0x1042,
- 0x5022, 0x20C0, 0x5023, 0x0E3F, 0x5024, 0x0B8B, 0x5025, 0x103E,
- 0x5026, 0x0747, 0x5027, 0x37FB, 0x5028, 0x103B, 0x5029, 0x1043,
- 0x502A, 0x103D, 0x502B, 0x0F99, 0x502C, 0x1044, 0x502D, 0x0FE7,
- 0x502E, 0x37FC, 0x5036, 0x06DE, 0x5039, 0x0746, 0x503B, 0x3800,
- 0x5040, 0x20BF, 0x5041, 0x4191, 0x5042, 0x20C5, 0x5043, 0x1049,
- 0x5046, 0x20C3, 0x5047, 0x104A, 0x5048, 0x104E, 0x5049, 0x0492,
- 0x504C, 0x4AD3, 0x504E, 0x4379, 0x504F, 0x0E20, 0x5050, 0x104D,
- 0x5053, 0x437A, 0x5055, 0x104C, 0x5056, 0x1050, 0x5057, 0x37FD,
- 0x505A, 0x104F, 0x505C, 0x0C00, 0x505F, 0x4AD4, 0x5062, 0x4AD5,
- 0x5063, 0x437B, 0x5065, 0x0748, 0x5066, 0x37FE, 0x506A, 0x37FF,
- 0x506C, 0x1051, 0x5070, 0x20C4, 0x5072, 0x08F1, 0x5074, 0x0B06,
- 0x5075, 0x0C01, 0x5076, 0x06EE, 0x5077, 0x4AD6, 0x5078, 0x1052,
- 0x507D, 0x0650, 0x5080, 0x1053, 0x5085, 0x1055, 0x5088, 0x437D,
- 0x508D, 0x0E63, 0x508E, 0x4AD7, 0x508F, 0x3801, 0x5091, 0x073C,
- 0x5092, 0x437E, 0x5093, 0x437F, 0x5094, 0x20C6, 0x5095, 0x4380,
- 0x5096, 0x3802, 0x5098, 0x087F, 0x5099, 0x0D8B, 0x509A, 0x1054,
- 0x509C, 0x3803, 0x509E, 0x4AD8, 0x50A2, 0x4AD9, 0x50A3, 0x437C,
- 0x50AA, 0x4381, 0x50AC, 0x0835, 0x50AD, 0x0F2D, 0x50B1, 0x4383,
- 0x50B2, 0x1057, 0x50B3, 0x105A, 0x50B4, 0x1056, 0x50B5, 0x0834,
- 0x50B7, 0x0987, 0x50BA, 0x4384, 0x50BB, 0x4385, 0x50BE, 0x070F,
- 0x50C2, 0x105B, 0x50C3, 0x4ADA, 0x50C4, 0x4386, 0x50C5, 0x06C7,
- 0x50C7, 0x4387, 0x50C9, 0x1058, 0x50CA, 0x1059, 0x50CC, 0x3804,
- 0x50CD, 0x0C87, 0x50CE, 0x438A, 0x50CF, 0x0AFE, 0x50D0, 0x4193,
- 0x50D1, 0x069B, 0x50D4, 0x438C, 0x50D5, 0x0E7B, 0x50D6, 0x105C,
- 0x50D8, 0x20C8, 0x50D9, 0x3C30, 0x50DA, 0x0F85, 0x50DE, 0x105D,
- 0x50E1, 0x438D, 0x50E3, 0x1060, 0x50E5, 0x105E, 0x50E6, 0x3805,
- 0x50E7, 0x0AD0, 0x50E8, 0x4ADB, 0x50E9, 0x3806, 0x50ED, 0x105F,
- 0x50EE, 0x1061, 0x50EF, 0x3807, 0x50F0, 0x3C31, 0x50F1, 0x4ADC,
- 0x50F2, 0x4192, 0x50F3, 0x4388, 0x50F4, 0x20C7, 0x50F5, 0x1063,
- 0x50F9, 0x1062, 0x50FB, 0x0E18, 0x50FE, 0x4ADD, 0x5100, 0x0651,
- 0x5101, 0x1065, 0x5102, 0x1066, 0x5103, 0x4195, 0x5104, 0x052F,
- 0x5106, 0x4194, 0x5107, 0x4ADE, 0x5108, 0x3808, 0x5109, 0x1064,
- 0x510B, 0x3809, 0x510C, 0x4ADF, 0x510D, 0x4AE0, 0x510E, 0x4AE1,
- 0x5110, 0x380A, 0x5112, 0x0920, 0x5114, 0x1069, 0x5115, 0x1068,
- 0x5116, 0x1067, 0x5117, 0x4390, 0x5118, 0x102F, 0x511A, 0x106A,
- 0x511B, 0x380B, 0x511E, 0x380C, 0x511F, 0x0988, 0x5121, 0x106B,
- 0x512A, 0x0F0F, 0x5132, 0x0EE5, 0x5133, 0x4AE2, 0x5135, 0x4196,
- 0x5137, 0x106D, 0x5138, 0x4AE3, 0x513A, 0x106C, 0x513B, 0x106F,
- 0x513C, 0x106E, 0x513F, 0x1070, 0x5140, 0x1071, 0x5141, 0x04B8,
- 0x5143, 0x0769, 0x5144, 0x0711, 0x5145, 0x0946, 0x5146, 0x0BB9,
- 0x5147, 0x069C, 0x5148, 0x0A8C, 0x5149, 0x07AB, 0x514A, 0x20C9,
- 0x514B, 0x0800, 0x514C, 0x1073, 0x514D, 0x0ED4, 0x514E, 0x0C40,
- 0x5150, 0x08C7, 0x5152, 0x1072, 0x5154, 0x1074, 0x5155, 0x4197,
- 0x5157, 0x4198, 0x515A, 0x0C58, 0x515C, 0x05D3, 0x515F, 0x380D,
- 0x5160, 0x4392, 0x5162, 0x1075, 0x5164, 0x20CA, 0x5165, 0x0CD6,
- 0x5167, 0x368E, 0x5168, 0x0AB6, 0x5169, 0x1077, 0x516A, 0x1078,
- 0x516B, 0x0D40, 0x516C, 0x07AC, 0x516D, 0x0FE1, 0x516E, 0x1079,
- 0x5171, 0x069E, 0x5173, 0x4394, 0x5174, 0x4AE4, 0x5175, 0x0E0C,
- 0x5176, 0x0B16, 0x5177, 0x06E9, 0x5178, 0x0C2F, 0x5179, 0x3779,
- 0x517B, 0x47D9, 0x517C, 0x0749, 0x5180, 0x107A, 0x5182, 0x107B,
- 0x5183, 0x4395, 0x5184, 0x4AE5, 0x5185, 0x0CBA, 0x5186, 0x0501,
- 0x5189, 0x107E, 0x518A, 0x086D, 0x518B, 0x4396, 0x518C, 0x107D,
- 0x518D, 0x0836, 0x518F, 0x107F, 0x5190, 0x185B, 0x5191, 0x1080,
- 0x5192, 0x0E6F, 0x5193, 0x1081, 0x5195, 0x1082, 0x5196, 0x1083,
- 0x5197, 0x09D1, 0x5198, 0x4398, 0x5199, 0x08F8, 0x519D, 0x20CB,
- 0x51A0, 0x05E3, 0x51A1, 0x380E, 0x51A2, 0x1086, 0x51A3, 0x4399,
- 0x51A4, 0x1084, 0x51A5, 0x0EC9, 0x51A6, 0x1085, 0x51A8, 0x0DCC,
- 0x51A9, 0x1087, 0x51AA, 0x1088, 0x51AB, 0x1089, 0x51AC, 0x0C59,
- 0x51AD, 0x439A, 0x51B0, 0x108D, 0x51B1, 0x108B, 0x51B2, 0x108C,
- 0x51B3, 0x108A, 0x51B4, 0x0853, 0x51B5, 0x108E, 0x51B6, 0x0EF6,
- 0x51B7, 0x0FAC, 0x51B8, 0x4AE6, 0x51BA, 0x4AE7, 0x51BC, 0x380F,
- 0x51BD, 0x108F, 0x51BE, 0x20CC, 0x51C3, 0x3C32, 0x51C4, 0x0A4C,
- 0x51C5, 0x1090, 0x51C6, 0x0964, 0x51C8, 0x4AE8, 0x51C9, 0x1091,
- 0x51CA, 0x419A, 0x51CB, 0x0BBA, 0x51CC, 0x0F87, 0x51CD, 0x0C5A,
- 0x51CF, 0x4AE9, 0x51D1, 0x4AEA, 0x51D3, 0x4AEB, 0x51D4, 0x4AEC,
- 0x51D6, 0x10DA, 0x51D8, 0x4AED, 0x51DB, 0x1092, 0x51DC, 0x205C,
- 0x51DD, 0x06BD, 0x51DE, 0x4F4C, 0x51DF, 0x4AEE, 0x51E0, 0x1093,
- 0x51E1, 0x0E8C, 0x51E2, 0x419B, 0x51E6, 0x0972, 0x51E7, 0x0B5C,
- 0x51E9, 0x1095, 0x51EA, 0x0CBC, 0x51EC, 0x20CD, 0x51ED, 0x1096,
- 0x51EE, 0x3811, 0x51F0, 0x1097, 0x51F1, 0x058C, 0x51F3, 0x439D,
- 0x51F4, 0x3812, 0x51F5, 0x1098, 0x51F6, 0x069F, 0x51F8, 0x0CA4,
- 0x51F9, 0x051C, 0x51FA, 0x095A, 0x51FD, 0x0D35, 0x51FE, 0x1099,
- 0x5200, 0x0C5B, 0x5201, 0x3813, 0x5202, 0x3814, 0x5203, 0x0A15,
- 0x5204, 0x109A, 0x5205, 0x4AEF, 0x5206, 0x0DFC, 0x5207, 0x0A7E,
- 0x5208, 0x05DE, 0x520A, 0x05E5, 0x520B, 0x109B, 0x520E, 0x109D,
- 0x5211, 0x0710, 0x5212, 0x439E, 0x5213, 0x3815, 0x5214, 0x109C,
- 0x5215, 0x20CE, 0x5216, 0x439F, 0x5217, 0x0FBB, 0x521D, 0x0973,
- 0x5224, 0x0D51, 0x5225, 0x0E1C, 0x5226, 0x4AF0, 0x5227, 0x109E,
- 0x5228, 0x4AF1, 0x5229, 0x0F62, 0x522A, 0x109F, 0x522B, 0x4AF2,
- 0x522E, 0x10A0, 0x5230, 0x0C78, 0x5231, 0x4AF3, 0x5232, 0x4AF4,
- 0x5233, 0x10A1, 0x5235, 0x4AF5, 0x5236, 0x0A4D, 0x5237, 0x086E,
- 0x5238, 0x074A, 0x5239, 0x10A2, 0x523A, 0x0897, 0x523B, 0x0801,
- 0x523C, 0x4AF6, 0x5243, 0x0C02, 0x5244, 0x10A4, 0x5247, 0x0B07,
- 0x5249, 0x3816, 0x524A, 0x085F, 0x524B, 0x10A5, 0x524C, 0x10A6,
- 0x524D, 0x0AB2, 0x524F, 0x10A3, 0x5254, 0x10A8, 0x5255, 0x43A1,
- 0x5256, 0x0E64, 0x5257, 0x419C, 0x525A, 0x4AF7, 0x525B, 0x07F6,
- 0x525C, 0x43A2, 0x525D, 0x1E5E, 0x525E, 0x10A7, 0x5260, 0x4AF8,
- 0x5261, 0x3817, 0x5263, 0x074B, 0x5264, 0x084E, 0x5265, 0x0D23,
- 0x5266, 0x3818, 0x5269, 0x10AB, 0x526A, 0x10A9, 0x526C, 0x43A3,
- 0x526E, 0x4AF9, 0x526F, 0x0DED, 0x5270, 0x09D2, 0x5271, 0x10B2,
- 0x5272, 0x05C2, 0x5273, 0x10AC, 0x5274, 0x10AA, 0x5275, 0x0AD1,
- 0x5277, 0x43A4, 0x5278, 0x4AFA, 0x5279, 0x4AFB, 0x527D, 0x10AE,
- 0x527F, 0x10AD, 0x5282, 0x43A6, 0x5283, 0x05A2, 0x5284, 0x43A5,
- 0x5287, 0x0736, 0x5288, 0x10B3, 0x5289, 0x0F75, 0x528A, 0x4AFC,
- 0x528C, 0x4AFD, 0x528D, 0x10AF, 0x5291, 0x10B4, 0x5292, 0x10B1,
- 0x5293, 0x3819, 0x5294, 0x10B0, 0x5298, 0x43A8, 0x529B, 0x0F97,
- 0x529C, 0x20CF, 0x529F, 0x07AD, 0x52A0, 0x0543, 0x52A3, 0x0FBC,
- 0x52A4, 0x43AA, 0x52A6, 0x20D0, 0x52A9, 0x097F, 0x52AA, 0x0C52,
- 0x52AB, 0x07F7, 0x52AC, 0x10B7, 0x52AD, 0x10B8, 0x52AF, 0x217D,
- 0x52B1, 0x0FAD, 0x52B4, 0x0FD1, 0x52B5, 0x10BA, 0x52B9, 0x07AE,
- 0x52BA, 0x43AB, 0x52BB, 0x43AC, 0x52BC, 0x10B9, 0x52BE, 0x058D,
- 0x52C0, 0x20D1, 0x52C1, 0x10BB, 0x52C3, 0x0E84, 0x52C5, 0x0BD8,
- 0x52C7, 0x0F10, 0x52C8, 0x381A, 0x52C9, 0x0E29, 0x52CA, 0x43AD,
- 0x52CC, 0x419D, 0x52CD, 0x10BC, 0x52D0, 0x36E8, 0x52D1, 0x43AE,
- 0x52D2, 0x1BEE, 0x52D5, 0x0C88, 0x52D6, 0x419E, 0x52D7, 0x10BD,
- 0x52D8, 0x05E6, 0x52D9, 0x0EBF, 0x52DB, 0x20D2, 0x52DD, 0x0989,
- 0x52DE, 0x10BE, 0x52DF, 0x0E37, 0x52E0, 0x10C2, 0x52E1, 0x4AFE,
- 0x52E2, 0x0A4E, 0x52E3, 0x10BF, 0x52E4, 0x06C8, 0x52E6, 0x10C0,
- 0x52E7, 0x05E7, 0x52E9, 0x4AFF, 0x52F0, 0x381B, 0x52F1, 0x4B00,
- 0x52F2, 0x0704, 0x52F3, 0x10C3, 0x52F5, 0x10C4, 0x52F7, 0x43B0,
- 0x52F8, 0x10C5, 0x52F9, 0x10C6, 0x52FA, 0x0907, 0x52FB, 0x419F,
- 0x52FE, 0x07AF, 0x52FF, 0x0EEA, 0x5300, 0x20D3, 0x5301, 0x0EF4,
- 0x5302, 0x0CCF, 0x5303, 0x4B01, 0x5305, 0x0E41, 0x5306, 0x10C7,
- 0x5307, 0x4F4D, 0x5308, 0x10C8, 0x530A, 0x381C, 0x530B, 0x381D,
- 0x530D, 0x10CA, 0x530F, 0x10CC, 0x5310, 0x10CB, 0x5311, 0x4B02,
- 0x5315, 0x10CD, 0x5316, 0x053D, 0x5317, 0x0E7A, 0x5319, 0x086C,
- 0x531A, 0x10CE, 0x531C, 0x41A0, 0x531D, 0x0ADB, 0x531F, 0x4B03,
- 0x5320, 0x098A, 0x5321, 0x06A1, 0x5323, 0x10CF, 0x5324, 0x20D5,
- 0x532A, 0x0D6F, 0x532D, 0x4B04, 0x532F, 0x10D0, 0x5331, 0x10D1,
- 0x5332, 0x4B05, 0x5333, 0x10D2, 0x5335, 0x43B1, 0x5338, 0x10D3,
- 0x5339, 0x0D96, 0x533A, 0x06E0, 0x533B, 0x04A9, 0x533D, 0x4B06,
- 0x533E, 0x381E, 0x533F, 0x0C97, 0x5340, 0x10D4, 0x5341, 0x0947,
- 0x5342, 0x43B2, 0x5343, 0x0A8D, 0x5345, 0x10D6, 0x5346, 0x10D5,
- 0x5347, 0x098B, 0x5348, 0x0795, 0x5349, 0x10D8, 0x534A, 0x0D52,
- 0x534B, 0x3820, 0x534C, 0x381F, 0x534D, 0x10D9, 0x5351, 0x0D70,
- 0x5352, 0x0B14, 0x5353, 0x0B4E, 0x5354, 0x06A0, 0x5357, 0x0CC6,
- 0x5358, 0x0B6F, 0x535A, 0x0D24, 0x535C, 0x0E7C, 0x535E, 0x10DB,
- 0x5360, 0x0A8E, 0x5361, 0x3821, 0x5363, 0x41A1, 0x5365, 0x4B07,
- 0x5366, 0x070B, 0x5367, 0x43B5, 0x5369, 0x10DC, 0x536C, 0x3822,
- 0x536D, 0x4B08, 0x536E, 0x10DD, 0x536F, 0x04CE, 0x5370, 0x04B9,
- 0x5371, 0x0629, 0x5372, 0x20D6, 0x5373, 0x0B08, 0x5374, 0x066B,
- 0x5375, 0x0F5B, 0x5377, 0x10E0, 0x5378, 0x0537, 0x5379, 0x4B09,
- 0x537A, 0x43B6, 0x537B, 0x10DF, 0x537D, 0x3435, 0x537E, 0x4B0A,
- 0x537F, 0x06A2, 0x5382, 0x10E1, 0x5384, 0x0EFD, 0x5389, 0x37D0,
- 0x5393, 0x20D7, 0x5394, 0x4B0B, 0x5396, 0x10E2, 0x5398, 0x0F9A,
- 0x5399, 0x4B0C, 0x539A, 0x07B0, 0x539D, 0x41A2, 0x539F, 0x076A,
- 0x53A0, 0x10E3, 0x53A4, 0x43B7, 0x53A5, 0x10E5, 0x53A6, 0x10E4,
- 0x53A8, 0x0A25, 0x53A9, 0x04DB, 0x53AA, 0x4B0D, 0x53AB, 0x3823,
- 0x53AD, 0x0500, 0x53AE, 0x10E6, 0x53AF, 0x4B0E, 0x53B0, 0x10E7,
- 0x53B2, 0x20D8, 0x53B3, 0x076B, 0x53B4, 0x43B8, 0x53B6, 0x10E8,
- 0x53B7, 0x43BA, 0x53BA, 0x4B0F, 0x53BB, 0x0688, 0x53C0, 0x43BB,
- 0x53C1, 0x4B10, 0x53C2, 0x0880, 0x53C3, 0x10E9, 0x53C4, 0x4B11,
- 0x53C5, 0x4B12, 0x53C8, 0x0EA2, 0x53C9, 0x0825, 0x53CA, 0x0674,
- 0x53CB, 0x0F11, 0x53CC, 0x0AD2, 0x53CD, 0x0D53, 0x53CE, 0x0929,
- 0x53D4, 0x0951, 0x53D5, 0x43BF, 0x53D6, 0x0914, 0x53D7, 0x0921,
- 0x53D9, 0x0980, 0x53DA, 0x3824, 0x53DB, 0x0D54, 0x53DD, 0x20D9,
- 0x53DF, 0x10EC, 0x53E0, 0x4B13, 0x53E1, 0x04E5, 0x53E2, 0x0AD3,
- 0x53E3, 0x07B1, 0x53E4, 0x0779, 0x53E5, 0x06DF, 0x53E6, 0x3825,
- 0x53E8, 0x10F0, 0x53E9, 0x0B5F, 0x53EA, 0x0B5E, 0x53EB, 0x06A3,
- 0x53EC, 0x098C, 0x53ED, 0x10F1, 0x53EE, 0x10EF, 0x53EF, 0x0544,
- 0x53F0, 0x0B46, 0x53F1, 0x08E4, 0x53F2, 0x0899, 0x53F3, 0x04C8,
- 0x53F4, 0x43C1, 0x53F5, 0x3826, 0x53F6, 0x05CE, 0x53F7, 0x07F8,
- 0x53F8, 0x0898, 0x53FA, 0x10F2, 0x5401, 0x10F3, 0x5403, 0x0663,
- 0x5404, 0x05A4, 0x5408, 0x07F9, 0x5409, 0x0662, 0x540A, 0x0BFB,
- 0x540B, 0x04C7, 0x540C, 0x0C89, 0x540D, 0x0ECA, 0x540E, 0x07B3,
- 0x540F, 0x0F63, 0x5410, 0x0C41, 0x5411, 0x07B2, 0x5412, 0x41A3,
- 0x5413, 0x4B14, 0x541B, 0x0705, 0x541D, 0x10FC, 0x541E, 0x368C,
- 0x541F, 0x06DB, 0x5420, 0x0E78, 0x5424, 0x43C2, 0x5426, 0x0D71,
- 0x5427, 0x3827, 0x5428, 0x43C3, 0x5429, 0x10FB, 0x542A, 0x4B15,
- 0x542B, 0x061A, 0x542C, 0x10F6, 0x542D, 0x10F7, 0x542E, 0x10F9,
- 0x5431, 0x4B16, 0x5433, 0x35C0, 0x5434, 0x4B17, 0x5435, 0x4B18,
- 0x5436, 0x10FA, 0x5438, 0x0675, 0x5439, 0x0A27, 0x543B, 0x0DFD,
- 0x543C, 0x10F8, 0x543D, 0x10F4, 0x543E, 0x0797, 0x543F, 0x35CF,
- 0x5440, 0x10F5, 0x5442, 0x0FCA, 0x5443, 0x43C5, 0x5446, 0x0E42,
- 0x5448, 0x0C04, 0x5449, 0x0796, 0x544A, 0x0802, 0x544C, 0x4B19,
- 0x544D, 0x3828, 0x544E, 0x10FD, 0x5451, 0x0CB5, 0x5455, 0x3723,
- 0x545F, 0x1101, 0x5462, 0x43C6, 0x5466, 0x3829, 0x5468, 0x092A,
- 0x546A, 0x0922, 0x546B, 0x382A, 0x546C, 0x43C7, 0x5470, 0x1104,
- 0x5471, 0x1102, 0x5473, 0x0EAF, 0x5474, 0x382B, 0x5475, 0x10FF,
- 0x5476, 0x1108, 0x5477, 0x1103, 0x547B, 0x1106, 0x547C, 0x077A,
- 0x547D, 0x0ECB, 0x547F, 0x41A4, 0x5480, 0x1107, 0x5484, 0x1109,
- 0x5486, 0x110B, 0x5488, 0x41A5, 0x548A, 0x20DC, 0x548B, 0x0860,
- 0x548C, 0x0FE8, 0x548D, 0x382C, 0x548E, 0x1100, 0x548F, 0x10FE,
- 0x5490, 0x110A, 0x5492, 0x1105, 0x5495, 0x43C8, 0x5496, 0x382D,
- 0x549C, 0x20DB, 0x54A0, 0x43C9, 0x54A1, 0x382E, 0x54A2, 0x110D,
- 0x54A4, 0x1116, 0x54A5, 0x110F, 0x54A6, 0x43CA, 0x54A7, 0x4B1A,
- 0x54A8, 0x1113, 0x54A9, 0x20DD, 0x54AA, 0x4B1B, 0x54AB, 0x1114,
- 0x54AC, 0x1110, 0x54AD, 0x382F, 0x54AE, 0x43CB, 0x54AF, 0x1131,
- 0x54B1, 0x4B1C, 0x54B2, 0x0859, 0x54B3, 0x058F, 0x54B7, 0x43CC,
- 0x54B8, 0x110E, 0x54B9, 0x3830, 0x54BA, 0x43CD, 0x54BB, 0x4B1D,
- 0x54BC, 0x1118, 0x54BD, 0x04BA, 0x54BE, 0x1117, 0x54BF, 0x3831,
- 0x54C0, 0x0469, 0x54C1, 0x0DBC, 0x54C2, 0x1115, 0x54C3, 0x43CE,
- 0x54C4, 0x1111, 0x54C6, 0x3832, 0x54C7, 0x110C, 0x54C8, 0x1112,
- 0x54C9, 0x0838, 0x54CD, 0x3833, 0x54CE, 0x4B1E, 0x54D8, 0x1119,
- 0x54E1, 0x04BB, 0x54E2, 0x1122, 0x54E5, 0x111A, 0x54E6, 0x111B,
- 0x54E8, 0x098D, 0x54E9, 0x0E97, 0x54EA, 0x4B1F, 0x54EC, 0x43D0,
- 0x54ED, 0x1120, 0x54EE, 0x111F, 0x54EF, 0x43D1, 0x54F1, 0x43D2,
- 0x54F2, 0x0C29, 0x54F3, 0x43D3, 0x54FA, 0x1121, 0x54FC, 0x4B20,
- 0x54FD, 0x111E, 0x54FF, 0x20DE, 0x5500, 0x43D4, 0x5501, 0x43D5,
- 0x5504, 0x04D6, 0x5505, 0x4B21, 0x5506, 0x0826, 0x5507, 0x09F6,
- 0x5508, 0x4B22, 0x5509, 0x43D6, 0x550E, 0x3834, 0x550F, 0x111C,
- 0x5510, 0x0C5C, 0x5514, 0x111D, 0x5515, 0x4B23, 0x5516, 0x0466,
- 0x5527, 0x4B24, 0x552A, 0x4B25, 0x552B, 0x3835, 0x552E, 0x1127,
- 0x552F, 0x0F0D, 0x5531, 0x098F, 0x5533, 0x112D, 0x5535, 0x3836,
- 0x5536, 0x4B26, 0x5538, 0x112C, 0x5539, 0x1123, 0x553C, 0x43D7,
- 0x553E, 0x0B23, 0x5540, 0x1124, 0x5541, 0x43D8, 0x5544, 0x0B4F,
- 0x5545, 0x1129, 0x5546, 0x098E, 0x5547, 0x43DA, 0x554A, 0x3837,
- 0x554C, 0x1126, 0x554F, 0x0EF0, 0x5550, 0x41A6, 0x5551, 0x4B27,
- 0x5553, 0x0712, 0x5556, 0x112A, 0x5557, 0x112B, 0x555C, 0x1128,
- 0x555D, 0x112E, 0x555E, 0x1DD1, 0x5560, 0x3838, 0x5561, 0x4F54,
- 0x5563, 0x1125, 0x5564, 0x43DC, 0x5566, 0x4B28, 0x557B, 0x1134,
- 0x557C, 0x1139, 0x557D, 0x43DE, 0x557E, 0x1135, 0x5580, 0x1130,
- 0x5581, 0x41A7, 0x5582, 0x43DF, 0x5583, 0x113A, 0x5584, 0x0AB3,
- 0x5586, 0x20DF, 0x5587, 0x113C, 0x5588, 0x383A, 0x5589, 0x07B4,
- 0x558A, 0x1132, 0x558B, 0x0BBB, 0x558E, 0x383B, 0x558F, 0x4B29,
- 0x5591, 0x43E0, 0x5592, 0x4B2A, 0x5594, 0x4B2B, 0x5598, 0x1136,
- 0x5599, 0x112F, 0x559A, 0x05E9, 0x559C, 0x062A, 0x559D, 0x05C3,
- 0x559E, 0x1137, 0x559F, 0x1133, 0x55A4, 0x4B2C, 0x55A7, 0x074C,
- 0x55A8, 0x113D, 0x55A9, 0x113B, 0x55AA, 0x0AD5, 0x55AB, 0x0664,
- 0x55AC, 0x06A4, 0x55AD, 0x41A8, 0x55AE, 0x1138, 0x55B0, 0x06EC,
- 0x55B2, 0x4B2D, 0x55B6, 0x04E6, 0x55BF, 0x43E5, 0x55C3, 0x4B2E,
- 0x55C4, 0x1141, 0x55C5, 0x113F, 0x55C6, 0x4B2F, 0x55C7, 0x1178,
- 0x55C9, 0x43E6, 0x55CC, 0x43E7, 0x55CE, 0x41A9, 0x55D1, 0x43E8,
- 0x55D2, 0x43E2, 0x55D3, 0x4B30, 0x55D4, 0x1144, 0x55DA, 0x113E,
- 0x55DB, 0x4B31, 0x55DC, 0x1142, 0x55DD, 0x43E9, 0x55DF, 0x1140,
- 0x55E2, 0x43EB, 0x55E3, 0x089A, 0x55E4, 0x1143, 0x55E9, 0x43ED,
- 0x55EC, 0x4B32, 0x55EE, 0x4B33, 0x55F1, 0x4B34, 0x55F6, 0x4B35,
- 0x55F7, 0x1146, 0x55F8, 0x4B36, 0x55F9, 0x114B, 0x55FD, 0x1149,
- 0x55FE, 0x1148, 0x5605, 0x4B37, 0x5606, 0x0B70, 0x5607, 0x43F0,
- 0x5608, 0x383C, 0x5609, 0x0545, 0x560D, 0x4B38, 0x560E, 0x383D,
- 0x560F, 0x383E, 0x5610, 0x43F1, 0x5611, 0x4B39, 0x5612, 0x4B3A,
- 0x5614, 0x1145, 0x5616, 0x1147, 0x5617, 0x0990, 0x5618, 0x04D5,
- 0x561B, 0x114A, 0x5620, 0x3C1D, 0x5628, 0x43EE, 0x5629, 0x055E,
- 0x562C, 0x4B3B, 0x562F, 0x1155, 0x5630, 0x43F2, 0x5631, 0x09E4,
- 0x5632, 0x1151, 0x5634, 0x114F, 0x5635, 0x4B3C, 0x5636, 0x1150,
- 0x5637, 0x383F, 0x5638, 0x1152, 0x5639, 0x4B3D, 0x563B, 0x41AA,
- 0x563D, 0x43F4, 0x563F, 0x3840, 0x5640, 0x43F5, 0x5642, 0x04DF,
- 0x5647, 0x43F6, 0x5649, 0x3841, 0x564B, 0x3842, 0x564C, 0x0ABB,
- 0x564D, 0x4B3E, 0x564E, 0x114C, 0x564F, 0x3843, 0x5650, 0x114D,
- 0x5653, 0x1F1B, 0x5654, 0x4B3F, 0x565B, 0x05D8, 0x565E, 0x43F7,
- 0x5660, 0x43F8, 0x5664, 0x1154, 0x5666, 0x3844, 0x5668, 0x062B,
- 0x5669, 0x3845, 0x566A, 0x1157, 0x566B, 0x1153, 0x566C, 0x1156,
- 0x566D, 0x43F9, 0x566F, 0x3846, 0x5671, 0x3847, 0x5672, 0x3848,
- 0x5674, 0x0DFE, 0x5676, 0x3C33, 0x5678, 0x0CAD, 0x567A, 0x0D4C,
- 0x5680, 0x1159, 0x5685, 0x4B40, 0x5686, 0x1158, 0x5687, 0x05A3,
- 0x5688, 0x43FB, 0x568A, 0x115A, 0x568C, 0x43FC, 0x568F, 0x115D,
- 0x5694, 0x115C, 0x5695, 0x3849, 0x5699, 0x1DE6, 0x569A, 0x384A,
- 0x569D, 0x43FD, 0x569E, 0x41AB, 0x569F, 0x4B41, 0x56A0, 0x115B,
- 0x56A2, 0x0CEF, 0x56A5, 0x115E, 0x56A6, 0x4B42, 0x56A8, 0x43FE,
- 0x56A9, 0x41AC, 0x56AC, 0x384B, 0x56AD, 0x384C, 0x56AE, 0x115F,
- 0x56B1, 0x384D, 0x56B2, 0x43FF, 0x56B3, 0x41AD, 0x56B4, 0x1161,
- 0x56B6, 0x1160, 0x56B7, 0x4B43, 0x56BC, 0x1163, 0x56C0, 0x1166,
- 0x56C1, 0x1164, 0x56C2, 0x1162, 0x56C3, 0x1165, 0x56C5, 0x4400,
- 0x56C8, 0x1167, 0x56C9, 0x384E, 0x56CA, 0x1E5A, 0x56CC, 0x4B44,
- 0x56CD, 0x4401, 0x56CE, 0x1168, 0x56CF, 0x4B45, 0x56D1, 0x1169,
- 0x56D3, 0x116A, 0x56D7, 0x116B, 0x56D8, 0x107C, 0x56D9, 0x4B46,
- 0x56DA, 0x0928, 0x56DB, 0x089B, 0x56DD, 0x384F, 0x56DE, 0x0573,
- 0x56DF, 0x4402, 0x56E0, 0x04BC, 0x56E1, 0x4B47, 0x56E3, 0x0B82,
- 0x56E4, 0x3850, 0x56E8, 0x4403, 0x56EB, 0x4B48, 0x56ED, 0x4B49,
- 0x56EE, 0x116C, 0x56F0, 0x0814, 0x56F1, 0x4B4A, 0x56F2, 0x0493,
- 0x56F3, 0x0A24, 0x56F6, 0x4404, 0x56F7, 0x4405, 0x56F9, 0x116D,
- 0x56FA, 0x077B, 0x56FD, 0x0803, 0x56FF, 0x116F, 0x5700, 0x116E,
- 0x5703, 0x0E30, 0x5704, 0x1170, 0x5707, 0x4B4B, 0x5708, 0x1172,
- 0x5709, 0x1171, 0x570A, 0x3851, 0x570B, 0x1173, 0x570C, 0x4B4C,
- 0x570D, 0x1174, 0x570F, 0x074D, 0x5712, 0x0502, 0x5713, 0x1175,
- 0x5715, 0x3852, 0x5716, 0x1177, 0x5718, 0x1176, 0x571A, 0x4B4D,
- 0x571B, 0x4B4E, 0x571C, 0x1179, 0x571D, 0x4B4F, 0x571F, 0x0C54,
- 0x5721, 0x3680, 0x5723, 0x3853, 0x5726, 0x117A, 0x5727, 0x0479,
- 0x5728, 0x084F, 0x5729, 0x4408, 0x572C, 0x4B50, 0x572D, 0x0713,
- 0x572E, 0x4B51, 0x572F, 0x3854, 0x5730, 0x0B8D, 0x5733, 0x3855,
- 0x5734, 0x3856, 0x5737, 0x117B, 0x5738, 0x117C, 0x573B, 0x117E,
- 0x573D, 0x4B52, 0x573E, 0x4B53, 0x5740, 0x117F, 0x5742, 0x0854,
- 0x5745, 0x440A, 0x5746, 0x440B, 0x5747, 0x06C9, 0x574A, 0x0E65,
- 0x574C, 0x3857, 0x574D, 0x440C, 0x574E, 0x117D, 0x574F, 0x1180,
- 0x5750, 0x0831, 0x5751, 0x07B5, 0x5759, 0x20E0, 0x575F, 0x4B54,
- 0x5761, 0x1184, 0x5764, 0x0815, 0x5765, 0x20E1, 0x5766, 0x0B71,
- 0x5768, 0x440E, 0x5769, 0x1181, 0x576A, 0x0BF6, 0x576B, 0x4B55,
- 0x576D, 0x4B56, 0x576F, 0x440F, 0x5770, 0x3858, 0x5773, 0x4410,
- 0x5774, 0x4411, 0x5775, 0x4412, 0x5777, 0x41AE, 0x577A, 0x4B57,
- 0x577B, 0x4413, 0x577C, 0x41AF, 0x577F, 0x1185, 0x5782, 0x0A28,
- 0x5783, 0x4B58, 0x5788, 0x1183, 0x5789, 0x1186, 0x578B, 0x0715,
- 0x578C, 0x3859, 0x5793, 0x1187, 0x5797, 0x4B59, 0x579A, 0x4416,
- 0x579C, 0x385A, 0x579D, 0x4417, 0x579E, 0x4418, 0x57A0, 0x1188,
- 0x57A2, 0x07B6, 0x57A3, 0x059E, 0x57A4, 0x118A, 0x57A8, 0x4419,
- 0x57AA, 0x118B, 0x57AC, 0x20E2, 0x57AE, 0x4B5A, 0x57B0, 0x118C,
- 0x57B3, 0x1189, 0x57B8, 0x385B, 0x57C0, 0x1182, 0x57C3, 0x118D,
- 0x57C6, 0x118E, 0x57C7, 0x20E4, 0x57C8, 0x20E3, 0x57CB, 0x0E92,
- 0x57CC, 0x441C, 0x57CE, 0x09D3, 0x57CF, 0x41B1, 0x57D2, 0x1190,
- 0x57D3, 0x1191, 0x57D4, 0x118F, 0x57D5, 0x4B5B, 0x57D6, 0x1193,
- 0x57D7, 0x441A, 0x57DC, 0x0CEE, 0x57DE, 0x441F, 0x57DF, 0x04AC,
- 0x57E0, 0x0DC8, 0x57E3, 0x1194, 0x57E4, 0x41B2, 0x57E6, 0x385C,
- 0x57E7, 0x4B5C, 0x57ED, 0x385D, 0x57F0, 0x4420, 0x57F4, 0x09E5,
- 0x57F5, 0x385E, 0x57F6, 0x385F, 0x57F7, 0x08E5, 0x57F8, 0x4422,
- 0x57F9, 0x0D13, 0x57FA, 0x062C, 0x57FB, 0x4423, 0x57FC, 0x085B,
- 0x57FD, 0x4424, 0x57FF, 0x3860, 0x5800, 0x0E87, 0x5802, 0x0C8A,
- 0x5804, 0x4425, 0x5805, 0x074E, 0x5806, 0x0B2F, 0x5809, 0x3861,
- 0x580A, 0x1192, 0x580B, 0x1195, 0x580D, 0x4B5D, 0x5815, 0x0B24,
- 0x5819, 0x1196, 0x581D, 0x1197, 0x581E, 0x4426, 0x5820, 0x3862,
- 0x5821, 0x1199, 0x5824, 0x0C05, 0x5826, 0x4B5E, 0x5827, 0x4427,
- 0x582A, 0x05EA, 0x582F, 0x1D32, 0x5830, 0x0503, 0x5831, 0x0E43,
- 0x5832, 0x3863, 0x5834, 0x09D4, 0x5835, 0x0C42, 0x5839, 0x4428,
- 0x583A, 0x0856, 0x583D, 0x119F, 0x5840, 0x0E0D, 0x5841, 0x0FA5,
- 0x5849, 0x442A, 0x584A, 0x0574, 0x584B, 0x119B, 0x584C, 0x442B,
- 0x584D, 0x4B5F, 0x584F, 0x4B60, 0x5851, 0x0ABC, 0x5852, 0x119E,
- 0x5854, 0x0C5D, 0x5857, 0x0C43, 0x5858, 0x0C5E, 0x5859, 0x0D4D,
- 0x585A, 0x0BE9, 0x585E, 0x0839, 0x585F, 0x4B61, 0x5861, 0x1E47,
- 0x5862, 0x119A, 0x5864, 0x41B3, 0x5867, 0x442C, 0x5869, 0x0518,
- 0x586B, 0x0C30, 0x586D, 0x4B62, 0x5870, 0x119C, 0x5872, 0x1198,
- 0x5875, 0x0A16, 0x5879, 0x11A0, 0x587C, 0x3864, 0x587E, 0x0958,
- 0x587F, 0x4B63, 0x5880, 0x3865, 0x5881, 0x4B64, 0x5883, 0x06A5,
- 0x5885, 0x11A1, 0x5889, 0x41B4, 0x588A, 0x442D, 0x588B, 0x442E,
- 0x588D, 0x442F, 0x588F, 0x4430, 0x5890, 0x4431, 0x5893, 0x0E38,
- 0x5894, 0x4432, 0x5897, 0x0AFF, 0x5898, 0x4B65, 0x589C, 0x0BE2,
- 0x589D, 0x4433, 0x589E, 0x20E7, 0x589F, 0x11A3, 0x58A8, 0x0E7D,
- 0x58A9, 0x3866, 0x58AA, 0x4434, 0x58AB, 0x11A4, 0x58AE, 0x11A9,
- 0x58B1, 0x4435, 0x58B2, 0x20E8, 0x58B3, 0x0DFF, 0x58B8, 0x11A8,
- 0x58B9, 0x11A2, 0x58BA, 0x11A5, 0x58BB, 0x11A7, 0x58BC, 0x4B66,
- 0x58BE, 0x0816, 0x58C1, 0x0E19, 0x58C3, 0x4437, 0x58C5, 0x11AA,
- 0x58C7, 0x0B83, 0x58CA, 0x0575, 0x58CC, 0x09D5, 0x58CD, 0x4438,
- 0x58CE, 0x3867, 0x58D0, 0x3868, 0x58D1, 0x11AC, 0x58D2, 0x41B6,
- 0x58D3, 0x11AB, 0x58D4, 0x3869, 0x58D5, 0x07FA, 0x58D7, 0x11AD,
- 0x58D8, 0x11AF, 0x58D9, 0x11AE, 0x58DA, 0x386A, 0x58DC, 0x11B1,
- 0x58DE, 0x11A6, 0x58DF, 0x11B3, 0x58E0, 0x41B7, 0x58E2, 0x4439,
- 0x58E4, 0x11B2, 0x58E5, 0x11B0, 0x58E9, 0x386B, 0x58EB, 0x089C,
- 0x58EC, 0x0A17, 0x58EE, 0x0AD6, 0x58EF, 0x11B4, 0x58F0, 0x0A60,
- 0x58F1, 0x04B1, 0x58F2, 0x0D1A, 0x58F3, 0x443A, 0x58F4, 0x443B,
- 0x58F7, 0x0BF7, 0x58F9, 0x11B6, 0x58FA, 0x11B5, 0x58FB, 0x11B7,
- 0x58FC, 0x11B8, 0x58FD, 0x11B9, 0x5902, 0x11BA, 0x5905, 0x443C,
- 0x5906, 0x443D, 0x5909, 0x0E21, 0x590A, 0x11BB, 0x590B, 0x20E9,
- 0x590C, 0x386C, 0x590D, 0x443E, 0x590F, 0x0546, 0x5910, 0x11BC,
- 0x5914, 0x443F, 0x5915, 0x0F26, 0x5916, 0x058E, 0x5918, 0x10DE,
- 0x5919, 0x0952, 0x591A, 0x0B1F, 0x591B, 0x11BD, 0x591C, 0x0EF7,
- 0x591F, 0x4B67, 0x5922, 0x0EC0, 0x5923, 0x4B68, 0x5924, 0x386D,
- 0x5925, 0x11BF, 0x5927, 0x0B47, 0x5929, 0x0C31, 0x592A, 0x0B20,
- 0x592B, 0x0DC9, 0x592C, 0x11C0, 0x592D, 0x11C1, 0x592E, 0x051D,
- 0x592F, 0x386E, 0x5931, 0x08E6, 0x5932, 0x11C2, 0x5937, 0x0494,
- 0x5938, 0x11C3, 0x5939, 0x3725, 0x593D, 0x4442, 0x593E, 0x11C4,
- 0x5944, 0x0504, 0x5946, 0x4444, 0x5947, 0x062D, 0x5948, 0x0CB8,
- 0x5949, 0x0E44, 0x594E, 0x11C8, 0x594F, 0x0AD7, 0x5950, 0x11C7,
- 0x5951, 0x0716, 0x5953, 0x20EA, 0x5954, 0x0E89, 0x5955, 0x11C6,
- 0x5957, 0x0C5F, 0x5958, 0x11CA, 0x5959, 0x4B69, 0x595A, 0x11C9,
- 0x595B, 0x20EB, 0x595D, 0x20EC, 0x595F, 0x4447, 0x5960, 0x11CC,
- 0x5961, 0x386F, 0x5962, 0x11CB, 0x5963, 0x20ED, 0x5965, 0x051E,
- 0x5967, 0x11CD, 0x5968, 0x0991, 0x5969, 0x11CF, 0x596A, 0x0B63,
- 0x596C, 0x11CE, 0x596D, 0x3870, 0x596E, 0x0E03, 0x5973, 0x0981,
- 0x5974, 0x0C55, 0x5975, 0x4449, 0x5976, 0x444A, 0x5978, 0x11D0,
- 0x5979, 0x4B6A, 0x597C, 0x444B, 0x597D, 0x07B7, 0x5981, 0x11D1,
- 0x5982, 0x0CD7, 0x5983, 0x0D72, 0x5984, 0x0EDD, 0x598A, 0x0CDB,
- 0x598B, 0x41B9, 0x598D, 0x11DA, 0x5992, 0x41BA, 0x5993, 0x0652,
- 0x5996, 0x0F2F, 0x5997, 0x4B6B, 0x5999, 0x0EBB, 0x599B, 0x1239,
- 0x599D, 0x11D2, 0x599F, 0x444C, 0x59A3, 0x11D5, 0x59A4, 0x20EE,
- 0x59A5, 0x0B25, 0x59A8, 0x0E66, 0x59AC, 0x0C44, 0x59AE, 0x444D,
- 0x59AF, 0x4B6C, 0x59B2, 0x11D6, 0x59B3, 0x4B6D, 0x59B9, 0x0E93,
- 0x59BA, 0x20EF, 0x59BB, 0x083A, 0x59BC, 0x444E, 0x59BE, 0x0992,
- 0x59C3, 0x41BB, 0x59C6, 0x11D7, 0x59C8, 0x444F, 0x59C9, 0x089E,
- 0x59CA, 0x3871, 0x59CB, 0x089D, 0x59CD, 0x4450, 0x59D0, 0x047D,
- 0x59D1, 0x077C, 0x59D2, 0x3872, 0x59D3, 0x0A4F, 0x59D4, 0x0495,
- 0x59D9, 0x11DB, 0x59DA, 0x11DC, 0x59DC, 0x11D9, 0x59DD, 0x3873,
- 0x59DE, 0x4451, 0x59DF, 0x4B6E, 0x59E3, 0x3874, 0x59E4, 0x3875,
- 0x59E5, 0x04DA, 0x59E6, 0x05EB, 0x59E7, 0x4452, 0x59E8, 0x11D8,
- 0x59EA, 0x0ED1, 0x59EB, 0x0DA3, 0x59EC, 0x36AD, 0x59EE, 0x4453,
- 0x59F1, 0x4B6F, 0x59F6, 0x046C, 0x59F8, 0x4B70, 0x59FB, 0x04BD,
- 0x59FF, 0x089F, 0x5A01, 0x0496, 0x5A03, 0x0467, 0x5A04, 0x3876,
- 0x5A09, 0x11E1, 0x5A0C, 0x3877, 0x5A0D, 0x4457, 0x5A11, 0x11DF,
- 0x5A13, 0x41BC, 0x5A17, 0x4458, 0x5A18, 0x0EC8, 0x5A1A, 0x11E2,
- 0x5A1B, 0x35C1, 0x5A1C, 0x11E0, 0x5A1F, 0x11DE, 0x5A20, 0x09F7,
- 0x5A23, 0x3878, 0x5A25, 0x11DD, 0x5A27, 0x4459, 0x5A29, 0x0E2A,
- 0x5A2D, 0x445A, 0x5A2F, 0x0798, 0x5A35, 0x11E6, 0x5A36, 0x11E7,
- 0x5A3C, 0x0993, 0x5A40, 0x11E3, 0x5A41, 0x0FD2, 0x5A46, 0x0D02,
- 0x5A47, 0x3879, 0x5A49, 0x11E5, 0x5A55, 0x387A, 0x5A5A, 0x0817,
- 0x5A62, 0x11E8, 0x5A63, 0x387B, 0x5A65, 0x445B, 0x5A66, 0x0DCA,
- 0x5A67, 0x41BD, 0x5A6A, 0x11E9, 0x5A6C, 0x11E4, 0x5A6D, 0x387C,
- 0x5A77, 0x41BE, 0x5A7A, 0x445C, 0x5A7E, 0x387D, 0x5A7F, 0x0EC7,
- 0x5A84, 0x41BF, 0x5A8B, 0x445D, 0x5A92, 0x0D14, 0x5A9A, 0x11EA,
- 0x5A9B, 0x0DA4, 0x5A9C, 0x445E, 0x5A9E, 0x387E, 0x5A9F, 0x445F,
- 0x5AA0, 0x4460, 0x5AA2, 0x4461, 0x5AA7, 0x387F, 0x5AAC, 0x3880,
- 0x5AB1, 0x4462, 0x5AB2, 0x4B71, 0x5AB3, 0x3881, 0x5AB5, 0x4463,
- 0x5AB8, 0x4B72, 0x5ABA, 0x4464, 0x5ABC, 0x11EB, 0x5ABD, 0x11EF,
- 0x5ABE, 0x11EC, 0x5ABF, 0x4465, 0x5AC1, 0x0547, 0x5AC2, 0x11EE,
- 0x5AC4, 0x41C0, 0x5AC9, 0x08E7, 0x5ACB, 0x11ED, 0x5ACC, 0x074F,
- 0x5AD0, 0x11FB, 0x5AD6, 0x11F4, 0x5AD7, 0x11F1, 0x5ADA, 0x4466,
- 0x5ADC, 0x4467, 0x5AE0, 0x3882, 0x5AE1, 0x0BA2, 0x5AE3, 0x11F0,
- 0x5AE5, 0x4468, 0x5AE6, 0x11F2, 0x5AE9, 0x11F3, 0x5AEA, 0x4B73,
- 0x5AEE, 0x446A, 0x5AF0, 0x4469, 0x5AF5, 0x446B, 0x5AF6, 0x4B74,
- 0x5AFA, 0x11F5, 0x5AFB, 0x11F6, 0x5B00, 0x3883, 0x5B08, 0x446C,
- 0x5B09, 0x062E, 0x5B0B, 0x11F8, 0x5B0C, 0x11F7, 0x5B16, 0x11F9,
- 0x5B17, 0x446D, 0x5B19, 0x3884, 0x5B1B, 0x4B75, 0x5B1D, 0x4B76,
- 0x5B21, 0x4B77, 0x5B22, 0x09D6, 0x5B25, 0x3885, 0x5B2A, 0x11FC,
- 0x5B2C, 0x0BF8, 0x5B2D, 0x3886, 0x5B30, 0x04E7, 0x5B32, 0x11FA,
- 0x5B34, 0x446E, 0x5B36, 0x11FD, 0x5B38, 0x4B78, 0x5B3E, 0x11FE,
- 0x5B40, 0x1201, 0x5B41, 0x3887, 0x5B43, 0x11FF, 0x5B45, 0x1200,
- 0x5B4C, 0x446F, 0x5B50, 0x08A0, 0x5B51, 0x1202, 0x5B52, 0x4470,
- 0x5B54, 0x07B8, 0x5B55, 0x1203, 0x5B56, 0x20F0, 0x5B57, 0x08C8,
- 0x5B58, 0x0B18, 0x5B5A, 0x1204, 0x5B5B, 0x1205, 0x5B5C, 0x08A8,
- 0x5B5D, 0x07B9, 0x5B5F, 0x0EDE, 0x5B63, 0x0642, 0x5B64, 0x077D,
- 0x5B65, 0x1206, 0x5B66, 0x05B6, 0x5B68, 0x4471, 0x5B69, 0x1207,
- 0x5B6B, 0x0B19, 0x5B6F, 0x4472, 0x5B70, 0x1208, 0x5B71, 0x1230,
- 0x5B73, 0x1209, 0x5B75, 0x120A, 0x5B76, 0x3728, 0x5B78, 0x120B,
- 0x5B7A, 0x120D, 0x5B7C, 0x3888, 0x5B7D, 0x41C2, 0x5B7E, 0x3889,
- 0x5B7F, 0x388A, 0x5B80, 0x120E, 0x5B81, 0x4473, 0x5B82, 0x3610,
- 0x5B83, 0x120F, 0x5B84, 0x4474, 0x5B85, 0x0B50, 0x5B87, 0x04C9,
- 0x5B88, 0x0915, 0x5B89, 0x0486, 0x5B8A, 0x388B, 0x5B8B, 0x0AD9,
- 0x5B8C, 0x05EC, 0x5B8D, 0x08E1, 0x5B8F, 0x07BA, 0x5B93, 0x41C3,
- 0x5B95, 0x0C60, 0x5B96, 0x4476, 0x5B97, 0x092B, 0x5B98, 0x05ED,
- 0x5B99, 0x0BA6, 0x5B9A, 0x0C06, 0x5B9B, 0x047C, 0x5B9C, 0x0653,
- 0x5B9D, 0x0E45, 0x5B9F, 0x08EE, 0x5BA2, 0x066C, 0x5BA3, 0x0A8F,
- 0x5BA4, 0x08E8, 0x5BA5, 0x0F12, 0x5BA6, 0x1210, 0x5BAC, 0x4477,
- 0x5BAE, 0x0676, 0x5BB0, 0x083B, 0x5BB3, 0x0590, 0x5BB4, 0x0505,
- 0x5BB5, 0x0994, 0x5BB6, 0x0548, 0x5BB7, 0x4B79, 0x5BB8, 0x1211,
- 0x5BB9, 0x0F30, 0x5BBF, 0x0953, 0x5BC0, 0x20F1, 0x5BC2, 0x0910,
- 0x5BC3, 0x1212, 0x5BC4, 0x062F, 0x5BC5, 0x0CAA, 0x5BC6, 0x0EB5,
- 0x5BC7, 0x1213, 0x5BC9, 0x1214, 0x5BCC, 0x0DCB, 0x5BCE, 0x447A,
- 0x5BD0, 0x1216, 0x5BD2, 0x05E4, 0x5BD3, 0x06EF, 0x5BD4, 0x1215,
- 0x5BD6, 0x447B, 0x5BD7, 0x4B7A, 0x5BD8, 0x20F3, 0x5BDB, 0x05EE,
- 0x5BDD, 0x09F8, 0x5BDE, 0x121A, 0x5BDF, 0x086F, 0x5BE0, 0x4B7B,
- 0x5BE1, 0x0549, 0x5BE2, 0x1219, 0x5BE4, 0x1217, 0x5BE5, 0x121B,
- 0x5BE6, 0x1218, 0x5BE7, 0x0CE1, 0x5BE8, 0x148E, 0x5BE9, 0x09F9,
- 0x5BEB, 0x121C, 0x5BEC, 0x4F4E, 0x5BEE, 0x0F88, 0x5BF0, 0x121D,
- 0x5BF1, 0x447E, 0x5BF3, 0x121F, 0x5BF5, 0x0BBC, 0x5BF6, 0x121E,
- 0x5BF8, 0x0A47, 0x5BFA, 0x08C9, 0x5BFD, 0x447F, 0x5BFE, 0x0B30,
- 0x5BFF, 0x0923, 0x5C01, 0x0DE7, 0x5C02, 0x0A90, 0x5C03, 0x4481,
- 0x5C04, 0x08F9, 0x5C05, 0x1220, 0x5C06, 0x0995, 0x5C07, 0x1221,
- 0x5C08, 0x1222, 0x5C09, 0x0497, 0x5C0A, 0x0B1A, 0x5C0B, 0x0A18,
- 0x5C0D, 0x1223, 0x5C0E, 0x0C8B, 0x5C0F, 0x0996, 0x5C11, 0x0997,
- 0x5C12, 0x41C4, 0x5C13, 0x1224, 0x5C14, 0x372A, 0x5C16, 0x0A91,
- 0x5C19, 0x360B, 0x5C1A, 0x0998, 0x5C1E, 0x20F5, 0x5C1F, 0x4B7C,
- 0x5C20, 0x1225, 0x5C22, 0x1226, 0x5C23, 0x388C, 0x5C24, 0x0EEC,
- 0x5C28, 0x1227, 0x5C29, 0x4482, 0x5C2A, 0x4B7D, 0x5C2B, 0x388D,
- 0x5C2C, 0x4B7E, 0x5C2D, 0x06BE, 0x5C30, 0x388E, 0x5C31, 0x092C,
- 0x5C36, 0x4B7F, 0x5C38, 0x1228, 0x5C39, 0x1229, 0x5C3A, 0x0908,
- 0x5C3B, 0x09F2, 0x5C3C, 0x0CCC, 0x5C3D, 0x0A1A, 0x5C3E, 0x0D8C,
- 0x5C3F, 0x0CD8, 0x5C40, 0x06C1, 0x5C41, 0x122A, 0x5C45, 0x0689,
- 0x5C46, 0x122B, 0x5C48, 0x06F6, 0x5C4A, 0x0CA7, 0x5C4B, 0x0530,
- 0x5C4D, 0x08A1, 0x5C4E, 0x122C, 0x5C4F, 0x122F, 0x5C50, 0x122E,
- 0x5C51, 0x06F5, 0x5C53, 0x122D, 0x5C55, 0x0C32, 0x5C59, 0x4B80,
- 0x5C5B, 0x1E92, 0x5C5C, 0x4B81, 0x5C5E, 0x0B10, 0x5C5F, 0x4484,
- 0x5C60, 0x0C45, 0x5C61, 0x08F4, 0x5C62, 0x1E0D, 0x5C63, 0x388F,
- 0x5C64, 0x0ADA, 0x5C65, 0x0F64, 0x5C67, 0x4485, 0x5C68, 0x4486,
- 0x5C69, 0x3890, 0x5C6C, 0x1231, 0x5C6D, 0x4B82, 0x5C6E, 0x1232,
- 0x5C6F, 0x0CAE, 0x5C70, 0x4487, 0x5C71, 0x0881, 0x5C76, 0x1234,
- 0x5C79, 0x1235, 0x5C7A, 0x41C7, 0x5C7C, 0x3891, 0x5C88, 0x448C,
- 0x5C8A, 0x448D, 0x5C8C, 0x1236, 0x5C8F, 0x41C8, 0x5C90, 0x0630,
- 0x5C91, 0x1237, 0x5C94, 0x1238, 0x5C9F, 0x41C9, 0x5CA0, 0x4491,
- 0x5CA1, 0x052C, 0x5CA2, 0x4492, 0x5CA3, 0x41CA, 0x5CA6, 0x20F6,
- 0x5CA7, 0x4493, 0x5CA8, 0x0ABD, 0x5CA9, 0x0620, 0x5CAA, 0x41CB,
- 0x5CAB, 0x123A, 0x5CAC, 0x0EB4, 0x5CAD, 0x4495, 0x5CB1, 0x0B32,
- 0x5CB3, 0x05B7, 0x5CB5, 0x4496, 0x5CB6, 0x123C, 0x5CB7, 0x123E,
- 0x5CB8, 0x061B, 0x5CBA, 0x20F7, 0x5CBB, 0x123B, 0x5CBC, 0x123D,
- 0x5CBE, 0x1240, 0x5CC5, 0x123F, 0x5CC7, 0x1241, 0x5CC9, 0x4498,
- 0x5CCB, 0x3892, 0x5CD0, 0x41CC, 0x5CD2, 0x3893, 0x5CD9, 0x1242,
- 0x5CDD, 0x4B83, 0x5CE0, 0x0C95, 0x5CE1, 0x06A6, 0x5CE6, 0x372C,
- 0x5CE8, 0x0565, 0x5CE9, 0x1243, 0x5CEA, 0x1248, 0x5CED, 0x1246,
- 0x5CEF, 0x0E47, 0x5CF0, 0x0E46, 0x5CF4, 0x3894, 0x5CF5, 0x20F8,
- 0x5CF6, 0x0C61, 0x5CFA, 0x1245, 0x5CFB, 0x095E, 0x5CFD, 0x1244,
- 0x5D01, 0x4B84, 0x5D06, 0x449B, 0x5D07, 0x0A38, 0x5D0B, 0x1249,
- 0x5D0D, 0x41CE, 0x5D0E, 0x085A, 0x5D10, 0x449C, 0x5D11, 0x124F,
- 0x5D14, 0x1250, 0x5D15, 0x124A, 0x5D16, 0x0591, 0x5D17, 0x124B,
- 0x5D18, 0x1254, 0x5D19, 0x1253, 0x5D1A, 0x1252, 0x5D1B, 0x124E,
- 0x5D1D, 0x449E, 0x5D1F, 0x124D, 0x5D20, 0x449F, 0x5D22, 0x1251,
- 0x5D24, 0x3895, 0x5D26, 0x3896, 0x5D27, 0x20F9, 0x5D29, 0x0E48,
- 0x5D2B, 0x449D, 0x5D31, 0x44A0, 0x5D34, 0x4B85, 0x5D39, 0x44A1,
- 0x5D3D, 0x4B86, 0x5D42, 0x20FC, 0x5D43, 0x3897, 0x5D46, 0x3898,
- 0x5D47, 0x41CF, 0x5D4A, 0x3899, 0x5D4B, 0x1258, 0x5D4C, 0x1255,
- 0x5D4E, 0x1257, 0x5D50, 0x0F5C, 0x5D52, 0x1256, 0x5D53, 0x20FA,
- 0x5D59, 0x4B87, 0x5D5C, 0x124C, 0x5D61, 0x44A3, 0x5D69, 0x0A39,
- 0x5D6A, 0x44A4, 0x5D6C, 0x1259, 0x5D6D, 0x20FD, 0x5D6F, 0x0827,
- 0x5D70, 0x44A6, 0x5D73, 0x125A, 0x5D76, 0x125B, 0x5D7E, 0x4B88,
- 0x5D81, 0x41D0, 0x5D82, 0x125E, 0x5D83, 0x4B89, 0x5D84, 0x125D,
- 0x5D87, 0x125C, 0x5D88, 0x44A9, 0x5D8B, 0x0C62, 0x5D8C, 0x1247,
- 0x5D90, 0x1264, 0x5D92, 0x389A, 0x5D94, 0x389B, 0x5D97, 0x44AB,
- 0x5D99, 0x389C, 0x5D9D, 0x1260, 0x5DA0, 0x389D, 0x5DA2, 0x125F,
- 0x5DA4, 0x41D1, 0x5DA7, 0x41D2, 0x5DAC, 0x1261, 0x5DAE, 0x1262,
- 0x5DB0, 0x44AC, 0x5DB2, 0x3C2D, 0x5DB4, 0x44AD, 0x5DB7, 0x1265,
- 0x5DB8, 0x20FE, 0x5DB9, 0x20FF, 0x5DBA, 0x0FAE, 0x5DBC, 0x1266,
- 0x5DBD, 0x1263, 0x5DC7, 0x4B8A, 0x5DC9, 0x1267, 0x5DCB, 0x41D3,
- 0x5DCC, 0x061C, 0x5DCD, 0x1268, 0x5DD0, 0x2100, 0x5DD1, 0x44AF,
- 0x5DD2, 0x126A, 0x5DD3, 0x1269, 0x5DD6, 0x126B, 0x5DD7, 0x44B0,
- 0x5DD8, 0x389E, 0x5DDB, 0x126C, 0x5DDD, 0x0A92, 0x5DDE, 0x092D,
- 0x5DE0, 0x389F, 0x5DE1, 0x096E, 0x5DE2, 0x3432, 0x5DE3, 0x0AE5,
- 0x5DE4, 0x44B2, 0x5DE5, 0x07BB, 0x5DE6, 0x0828, 0x5DE7, 0x07BC,
- 0x5DE8, 0x068A, 0x5DE9, 0x44B3, 0x5DEB, 0x126D, 0x5DEE, 0x0829,
- 0x5DF1, 0x077E, 0x5DF2, 0x126E, 0x5DF3, 0x0EB2, 0x5DF4, 0x0CF9,
- 0x5DF5, 0x126F, 0x5DF7, 0x07BD, 0x5DF8, 0x38A0, 0x5DF9, 0x4B8B,
- 0x5DFB, 0x05E8, 0x5DFD, 0x0B65, 0x5DFE, 0x06CA, 0x5DFF, 0x35E2,
- 0x5E00, 0x38A1, 0x5E02, 0x08A2, 0x5E03, 0x0DCD, 0x5E06, 0x0D55,
- 0x5E0B, 0x1270, 0x5E0C, 0x0631, 0x5E11, 0x1273, 0x5E12, 0x38A2,
- 0x5E14, 0x38A3, 0x5E15, 0x38A4, 0x5E16, 0x0BBD, 0x5E18, 0x38A5,
- 0x5E19, 0x1272, 0x5E1A, 0x1271, 0x5E1B, 0x1274, 0x5E1D, 0x0C07,
- 0x5E1F, 0x44B7, 0x5E25, 0x0A29, 0x5E28, 0x4B8C, 0x5E2B, 0x08A3,
- 0x5E2D, 0x0A6E, 0x5E2E, 0x38A6, 0x5E2F, 0x0B33, 0x5E30, 0x063C,
- 0x5E32, 0x4B8D, 0x5E33, 0x0BBE, 0x5E35, 0x4B8E, 0x5E36, 0x1275,
- 0x5E37, 0x1276, 0x5E38, 0x09D7, 0x5E3D, 0x0E67, 0x5E3E, 0x44B8,
- 0x5E40, 0x1279, 0x5E43, 0x1278, 0x5E44, 0x1277, 0x5E45, 0x0DEF,
- 0x5E47, 0x1280, 0x5E49, 0x44B9, 0x5E4C, 0x0E88, 0x5E4E, 0x127A,
- 0x5E54, 0x127C, 0x5E55, 0x0E99, 0x5E56, 0x44BB, 0x5E57, 0x127B,
- 0x5E58, 0x38A7, 0x5E5B, 0x4B8F, 0x5E5E, 0x41D4, 0x5E5F, 0x127D,
- 0x5E61, 0x0D3C, 0x5E62, 0x127E, 0x5E63, 0x0E0E, 0x5E64, 0x127F,
- 0x5E68, 0x4B90, 0x5E6A, 0x4B91, 0x5E6B, 0x38A8, 0x5E6C, 0x38A9,
- 0x5E6D, 0x44BD, 0x5E6E, 0x44BE, 0x5E72, 0x05EF, 0x5E73, 0x0E0F,
- 0x5E74, 0x0CE5, 0x5E75, 0x1281, 0x5E76, 0x1282, 0x5E77, 0x4B92,
- 0x5E78, 0x07BE, 0x5E79, 0x05F0, 0x5E7A, 0x1283, 0x5E7B, 0x076C,
- 0x5E7C, 0x0F2E, 0x5E7D, 0x0F13, 0x5E7E, 0x0632, 0x5E7F, 0x1285,
- 0x5E80, 0x4B93, 0x5E81, 0x0BBF, 0x5E83, 0x07BF, 0x5E84, 0x0999,
- 0x5E87, 0x0D73, 0x5E8A, 0x099A, 0x5E8B, 0x4B94, 0x5E8F, 0x0982,
- 0x5E95, 0x0C08, 0x5E96, 0x0E49, 0x5E97, 0x0C33, 0x5E99, 0x36B0,
- 0x5E9A, 0x07C0, 0x5E9C, 0x0DCE, 0x5EA0, 0x1286, 0x5EA5, 0x44C0,
- 0x5EA6, 0x0C53, 0x5EA7, 0x0832, 0x5EA8, 0x38AA, 0x5EAA, 0x38AB,
- 0x5EAB, 0x077F, 0x5EAC, 0x44C1, 0x5EAD, 0x0C09, 0x5EB3, 0x4B95,
- 0x5EB5, 0x0487, 0x5EB6, 0x0978, 0x5EB7, 0x07C1, 0x5EB8, 0x0F31,
- 0x5EB9, 0x44C2, 0x5EBD, 0x4B96, 0x5EBE, 0x38AC, 0x5EBF, 0x38AD,
- 0x5EC1, 0x1287, 0x5EC2, 0x1288, 0x5EC3, 0x0D07, 0x5EC6, 0x44C3,
- 0x5EC8, 0x1289, 0x5EC9, 0x0FBF, 0x5ECA, 0x0FD3, 0x5ECB, 0x3C1E,
- 0x5ECF, 0x128B, 0x5ED0, 0x128A, 0x5ED1, 0x4B97, 0x5ED2, 0x38AF,
- 0x5ED3, 0x05A5, 0x5ED4, 0x4B98, 0x5ED5, 0x4B99, 0x5ED6, 0x128C,
- 0x5ED9, 0x44C4, 0x5EDA, 0x128F, 0x5EDB, 0x1290, 0x5EDD, 0x128E,
- 0x5EDF, 0x0DB2, 0x5EE0, 0x099B, 0x5EE1, 0x1292, 0x5EE2, 0x1291,
- 0x5EE3, 0x128D, 0x5EE8, 0x1293, 0x5EE9, 0x1294, 0x5EEC, 0x1295,
- 0x5EF0, 0x1298, 0x5EF1, 0x1296, 0x5EF3, 0x1297, 0x5EF4, 0x1299,
- 0x5EF6, 0x0506, 0x5EF7, 0x0C0A, 0x5EF8, 0x129A, 0x5EF9, 0x41D5,
- 0x5EFA, 0x0750, 0x5EFB, 0x0576, 0x5EFC, 0x0CEC, 0x5EFD, 0x44C6,
- 0x5EFE, 0x129B, 0x5EFF, 0x0CD3, 0x5F00, 0x41D6, 0x5F01, 0x0E2B,
- 0x5F02, 0x41D7, 0x5F03, 0x129C, 0x5F04, 0x0FD4, 0x5F07, 0x38B0,
- 0x5F08, 0x44C7, 0x5F09, 0x129D, 0x5F0A, 0x0E10, 0x5F0B, 0x12A0,
- 0x5F0C, 0x0FFA, 0x5F0D, 0x100A, 0x5F0E, 0x38B1, 0x5F0F, 0x08DC,
- 0x5F10, 0x0CCD, 0x5F11, 0x12A1, 0x5F13, 0x0677, 0x5F14, 0x0BC0,
- 0x5F15, 0x04BE, 0x5F16, 0x12A2, 0x5F17, 0x0DF6, 0x5F18, 0x07C2,
- 0x5F1B, 0x0B8E, 0x5F1C, 0x38B2, 0x5F1D, 0x38B3, 0x5F1E, 0x44C9,
- 0x5F1F, 0x0C0B, 0x5F21, 0x2101, 0x5F22, 0x38B4, 0x5F23, 0x41D8,
- 0x5F25, 0x0EFB, 0x5F26, 0x076D, 0x5F27, 0x0780, 0x5F28, 0x38B5,
- 0x5F29, 0x12A3, 0x5F2D, 0x12A4, 0x5F2F, 0x12AA, 0x5F31, 0x0911,
- 0x5F34, 0x2102, 0x5F35, 0x0BC1, 0x5F36, 0x38B6, 0x5F37, 0x06A7,
- 0x5F38, 0x12A5, 0x5F3A, 0x3598, 0x5F3B, 0x38B7, 0x5F3C, 0x0D9D,
- 0x5F3D, 0x41D9, 0x5F3E, 0x0B84, 0x5F40, 0x38B8, 0x5F41, 0x12A6,
- 0x5F45, 0x20B2, 0x5F47, 0x44CA, 0x5F48, 0x12A7, 0x5F4A, 0x06A8,
- 0x5F4C, 0x12A8, 0x5F4D, 0x4B9A, 0x5F4E, 0x12A9, 0x5F50, 0x38B9,
- 0x5F51, 0x12AB, 0x5F53, 0x0C70, 0x5F54, 0x41DA, 0x5F56, 0x12AC,
- 0x5F57, 0x12AD, 0x5F58, 0x38BA, 0x5F59, 0x12AE, 0x5F5C, 0x129F,
- 0x5F5D, 0x129E, 0x5F61, 0x12AF, 0x5F62, 0x0717, 0x5F63, 0x44CB,
- 0x5F64, 0x38BB, 0x5F65, 0x36AC, 0x5F66, 0x0D99, 0x5F67, 0x2103,
- 0x5F69, 0x083C, 0x5F6A, 0x0DA9, 0x5F6B, 0x0BC2, 0x5F6C, 0x0DBD,
- 0x5F6D, 0x12B0, 0x5F70, 0x099C, 0x5F71, 0x04E8, 0x5F72, 0x44CC,
- 0x5F73, 0x12B1, 0x5F77, 0x12B2, 0x5F79, 0x0EFE, 0x5F7C, 0x0D74,
- 0x5F7D, 0x41DB, 0x5F7E, 0x44CD, 0x5F7F, 0x12B5, 0x5F80, 0x051F,
- 0x5F81, 0x0A50, 0x5F82, 0x12B4, 0x5F83, 0x12B3, 0x5F84, 0x0718,
- 0x5F85, 0x0B34, 0x5F87, 0x12B9, 0x5F88, 0x12B7, 0x5F89, 0x38BC,
- 0x5F8A, 0x12B6, 0x5F8B, 0x0F6F, 0x5F8C, 0x0799, 0x5F8F, 0x44CE,
- 0x5F90, 0x0983, 0x5F91, 0x12B8, 0x5F92, 0x0C46, 0x5F93, 0x0948,
- 0x5F97, 0x0C98, 0x5F98, 0x12BC, 0x5F99, 0x12BB, 0x5F9C, 0x38BD,
- 0x5F9E, 0x12BA, 0x5FA0, 0x12BD, 0x5FA1, 0x079A, 0x5FA2, 0x44CF,
- 0x5FA4, 0x38BF, 0x5FA7, 0x38BE, 0x5FA8, 0x12BE, 0x5FA9, 0x0DEE,
- 0x5FAA, 0x0965, 0x5FAC, 0x4B9B, 0x5FAD, 0x12BF, 0x5FAE, 0x0D8D,
- 0x5FAF, 0x38C0, 0x5FB3, 0x0C99, 0x5FB4, 0x0BC3, 0x5FB5, 0x3438,
- 0x5FB7, 0x2104, 0x5FB8, 0x38C1, 0x5FB9, 0x0C2A, 0x5FBC, 0x12C0,
- 0x5FBD, 0x0645, 0x5FC3, 0x09FA, 0x5FC4, 0x38C2, 0x5FC5, 0x0D9E,
- 0x5FC7, 0x44D0, 0x5FC9, 0x38C3, 0x5FCB, 0x44D1, 0x5FCC, 0x0633,
- 0x5FCD, 0x0CDC, 0x5FD2, 0x44D2, 0x5FD3, 0x44D3, 0x5FD4, 0x44D4,
- 0x5FD6, 0x12C1, 0x5FD7, 0x08A4, 0x5FD8, 0x0E68, 0x5FD9, 0x0E69,
- 0x5FDC, 0x0520, 0x5FDD, 0x12C6, 0x5FDE, 0x2105, 0x5FE0, 0x0BA7,
- 0x5FE1, 0x38C4, 0x5FE2, 0x44D5, 0x5FE4, 0x12C3, 0x5FE9, 0x38C5,
- 0x5FEA, 0x4B9C, 0x5FEB, 0x0577, 0x5FED, 0x38C6, 0x5FEE, 0x44D6,
- 0x5FEF, 0x44D7, 0x5FF0, 0x12F6, 0x5FF1, 0x12C5, 0x5FF3, 0x44D8,
- 0x5FF5, 0x0CE6, 0x5FF8, 0x12C4, 0x5FFB, 0x12C2, 0x5FFC, 0x38C7,
- 0x5FFD, 0x080C, 0x5FFF, 0x12C8, 0x6007, 0x4B9D, 0x600D, 0x41DC,
- 0x600E, 0x12CE, 0x600F, 0x12D4, 0x6010, 0x12CC, 0x6012, 0x0C56,
- 0x6014, 0x41DD, 0x6015, 0x12D1, 0x6016, 0x0DCF, 0x6017, 0x38C8,
- 0x6018, 0x41DE, 0x6019, 0x12CB, 0x601A, 0x38C9, 0x601B, 0x12D0,
- 0x601C, 0x0FAF, 0x601D, 0x08A5, 0x6020, 0x0B35, 0x6021, 0x12C9,
- 0x6022, 0x44DA, 0x6024, 0x44DB, 0x6025, 0x0678, 0x6026, 0x12D3,
- 0x6027, 0x0A51, 0x6028, 0x0507, 0x6029, 0x12CD, 0x602A, 0x0578,
- 0x602B, 0x12D2, 0x602F, 0x06A9, 0x6031, 0x12CF, 0x6033, 0x38CA,
- 0x6035, 0x41DF, 0x603A, 0x12D5, 0x6041, 0x12D7, 0x6042, 0x12E1,
- 0x6043, 0x12DF, 0x6046, 0x12DC, 0x6047, 0x41E0, 0x6049, 0x4B9E,
- 0x604A, 0x12DB, 0x604B, 0x0FC0, 0x604C, 0x44DD, 0x604D, 0x12DD,
- 0x6050, 0x06AA, 0x6052, 0x07C3, 0x6054, 0x4B9F, 0x6055, 0x0984,
- 0x6059, 0x12E4, 0x605A, 0x12D6, 0x605D, 0x2106, 0x605F, 0x12DA,
- 0x6060, 0x12CA, 0x6061, 0x38CB, 0x6062, 0x057A, 0x6063, 0x12DE,
- 0x6064, 0x12E0, 0x6065, 0x0B8F, 0x6067, 0x4BA0, 0x6068, 0x0818,
- 0x6069, 0x0538, 0x606A, 0x12D8, 0x606B, 0x12E3, 0x606C, 0x12E2,
- 0x606D, 0x06AB, 0x606F, 0x0B09, 0x6070, 0x05C4, 0x6075, 0x0719,
- 0x6077, 0x12D9, 0x607F, 0x38CC, 0x6081, 0x12E5, 0x6083, 0x12E8,
- 0x6084, 0x12EA, 0x6085, 0x2107, 0x6089, 0x08E9, 0x608A, 0x2108,
- 0x608B, 0x12F0, 0x608C, 0x0C0C, 0x608D, 0x12E6, 0x6092, 0x12EE,
- 0x6094, 0x0579, 0x6095, 0x44DE, 0x6096, 0x12EC, 0x6097, 0x12ED,
- 0x609A, 0x12E9, 0x609B, 0x12EB, 0x609D, 0x41E1, 0x609E, 0x38CD,
- 0x609F, 0x079B, 0x60A0, 0x0F14, 0x60A3, 0x05F1, 0x60A4, 0x38CE,
- 0x60A6, 0x04FB, 0x60A7, 0x12EF, 0x60A8, 0x44DF, 0x60A9, 0x0CF0,
- 0x60AA, 0x0471, 0x60B0, 0x38CF, 0x60B1, 0x44E1, 0x60B2, 0x0D75,
- 0x60B3, 0x12C7, 0x60B4, 0x12F5, 0x60B5, 0x12F9, 0x60B6, 0x0EF1,
- 0x60B8, 0x12F2, 0x60BB, 0x4BA1, 0x60BC, 0x0C63, 0x60BD, 0x12F7,
- 0x60BE, 0x44E2, 0x60C4, 0x4BA2, 0x60C5, 0x09D8, 0x60C6, 0x12F8,
- 0x60C7, 0x0CAF, 0x60C8, 0x44E3, 0x60CB, 0x38D0, 0x60D1, 0x0FED,
- 0x60D3, 0x12F4, 0x60D4, 0x41E2, 0x60D5, 0x210A, 0x60D8, 0x12FA,
- 0x60D9, 0x44E4, 0x60DA, 0x080D, 0x60DB, 0x38D1, 0x60DC, 0x0A6F,
- 0x60DD, 0x41E3, 0x60DE, 0x2109, 0x60DF, 0x0498, 0x60E0, 0x12F3,
- 0x60E1, 0x12F1, 0x60E3, 0x0ADC, 0x60E7, 0x12E7, 0x60E8, 0x0882,
- 0x60EE, 0x44E5, 0x60F0, 0x0B26, 0x60F1, 0x1306, 0x60F2, 0x210C,
- 0x60F3, 0x0ADD, 0x60F4, 0x1301, 0x60F5, 0x44E6, 0x60F6, 0x12FE,
- 0x60F7, 0x12FF, 0x60F8, 0x38D2, 0x60F9, 0x0912, 0x60FA, 0x1302,
- 0x60FB, 0x1305, 0x60FD, 0x4BA3, 0x6100, 0x1300, 0x6101, 0x092F,
- 0x6103, 0x1303, 0x6106, 0x12FD, 0x6108, 0x0F08, 0x6109, 0x0F07,
- 0x610A, 0x4BA4, 0x610D, 0x1307, 0x610E, 0x1308, 0x610F, 0x0499,
- 0x6110, 0x44E7, 0x6111, 0x210D, 0x6112, 0x38D3, 0x6113, 0x38D4,
- 0x6114, 0x38D5, 0x6115, 0x12FC, 0x6116, 0x4BA5, 0x6119, 0x44E8,
- 0x611A, 0x06EA, 0x611B, 0x046A, 0x611C, 0x38D6, 0x611E, 0x44E9,
- 0x611F, 0x05F2, 0x6120, 0x210B, 0x6121, 0x1304, 0x6127, 0x130C,
- 0x6128, 0x130B, 0x612A, 0x4BA6, 0x612B, 0x41E4, 0x612C, 0x1310,
- 0x6130, 0x210F, 0x6134, 0x1311, 0x6136, 0x4BA7, 0x6137, 0x210E,
- 0x613A, 0x44EA, 0x613C, 0x130F, 0x613D, 0x1312, 0x613E, 0x130A,
- 0x613F, 0x130E, 0x6141, 0x44EC, 0x6142, 0x1313, 0x6144, 0x1314,
- 0x6146, 0x44ED, 0x6147, 0x1309, 0x6148, 0x08CA, 0x614A, 0x130D,
- 0x614B, 0x0B36, 0x614C, 0x07C4, 0x614D, 0x12FB, 0x614E, 0x09FB,
- 0x6153, 0x1321, 0x6155, 0x0E39, 0x6158, 0x1317, 0x6159, 0x1318,
- 0x615A, 0x1319, 0x615D, 0x1320, 0x615E, 0x4BA8, 0x615F, 0x131F,
- 0x6160, 0x44EE, 0x6162, 0x0EAB, 0x6163, 0x05F3, 0x6164, 0x4BA9,
- 0x6165, 0x131D, 0x6167, 0x071B, 0x6168, 0x0592, 0x616B, 0x131A,
- 0x616E, 0x0F80, 0x616F, 0x131C, 0x6170, 0x049A, 0x6171, 0x131E,
- 0x6173, 0x1315, 0x6174, 0x131B, 0x6175, 0x1322, 0x6176, 0x071A,
- 0x6177, 0x1316, 0x617B, 0x4BAA, 0x617C, 0x38D7, 0x617D, 0x4BAB,
- 0x617E, 0x0F47, 0x617F, 0x4BAC, 0x6182, 0x0F15, 0x6187, 0x1325,
- 0x618A, 0x1329, 0x618D, 0x38D8, 0x618E, 0x0B00, 0x6190, 0x0FC1,
- 0x6191, 0x132A, 0x6192, 0x44F0, 0x6193, 0x44F1, 0x6194, 0x1327,
- 0x6196, 0x1324, 0x6197, 0x44F2, 0x6198, 0x2110, 0x6199, 0x1323,
- 0x619A, 0x1328, 0x619D, 0x4BAD, 0x619F, 0x38D9, 0x61A4, 0x0E00,
- 0x61A5, 0x44F3, 0x61A7, 0x0C8C, 0x61A8, 0x38DA, 0x61A9, 0x071C,
- 0x61AB, 0x132B, 0x61AC, 0x1326, 0x61AD, 0x44F4, 0x61AE, 0x132C,
- 0x61B2, 0x0751, 0x61B6, 0x0531, 0x61B8, 0x4BAE, 0x61B9, 0x41E6,
- 0x61BA, 0x1334, 0x61BC, 0x41E5, 0x61BE, 0x05F4, 0x61C2, 0x38DB,
- 0x61C3, 0x1332, 0x61C6, 0x1333, 0x61C7, 0x0819, 0x61C8, 0x1331,
- 0x61C9, 0x132F, 0x61CA, 0x132E, 0x61CB, 0x1335, 0x61CC, 0x132D,
- 0x61CD, 0x1337, 0x61D0, 0x057B, 0x61D5, 0x44F6, 0x61DC, 0x4BAF,
- 0x61DD, 0x44F7, 0x61DF, 0x38DC, 0x61E2, 0x4BB0, 0x61E3, 0x1339,
- 0x61E5, 0x4BB1, 0x61E6, 0x1338, 0x61E8, 0x4BB2, 0x61F2, 0x0BC4,
- 0x61F4, 0x133C, 0x61F5, 0x44F8, 0x61F6, 0x133A, 0x61F7, 0x1330,
- 0x61F8, 0x0752, 0x61FA, 0x133B, 0x61FC, 0x133F, 0x61FD, 0x133E,
- 0x61FE, 0x1340, 0x61FF, 0x133D, 0x6200, 0x1341, 0x6204, 0x4BB3,
- 0x6207, 0x4BB4, 0x6208, 0x1342, 0x6209, 0x1343, 0x620A, 0x0E3A,
- 0x620C, 0x1345, 0x620D, 0x1344, 0x620E, 0x0949, 0x6210, 0x0A52,
- 0x6211, 0x0566, 0x6212, 0x057C, 0x6213, 0x2111, 0x6214, 0x1346,
- 0x6215, 0x38DD, 0x6216, 0x0483, 0x621A, 0x0A70, 0x621B, 0x1347,
- 0x621D, 0x1A64, 0x621E, 0x1348, 0x621F, 0x0737, 0x6221, 0x1349,
- 0x6222, 0x41E7, 0x6223, 0x44FA, 0x6226, 0x0A93, 0x6229, 0x38DE,
- 0x622A, 0x134A, 0x622E, 0x134B, 0x622F, 0x0654, 0x6230, 0x134C,
- 0x6231, 0x4BB5, 0x6232, 0x134D, 0x6233, 0x134E, 0x6234, 0x0B37,
- 0x6236, 0x35BD, 0x6238, 0x0781, 0x6239, 0x4BB6, 0x623B, 0x0EED,
- 0x623D, 0x4BB7, 0x623E, 0x344E, 0x623F, 0x0E6A, 0x6240, 0x0974,
- 0x6241, 0x134F, 0x6243, 0x38DF, 0x6246, 0x38E0, 0x6247, 0x0A94,
- 0x6248, 0x1B1A, 0x6249, 0x0D76, 0x624B, 0x0916, 0x624C, 0x38E1,
- 0x624D, 0x083D, 0x624E, 0x1350, 0x6251, 0x38E2, 0x6252, 0x44FB,
- 0x6253, 0x0B27, 0x6255, 0x0DF7, 0x6256, 0x38E3, 0x6258, 0x0B51,
- 0x625A, 0x41E8, 0x625B, 0x1353, 0x625E, 0x1351, 0x6260, 0x1354,
- 0x6261, 0x44FC, 0x6263, 0x1352, 0x6264, 0x44FD, 0x6268, 0x1355,
- 0x626D, 0x44FF, 0x626E, 0x0E01, 0x626F, 0x41E9, 0x6271, 0x047B,
- 0x6273, 0x4500, 0x6276, 0x0DD0, 0x6279, 0x0D77, 0x627A, 0x4BB8,
- 0x627B, 0x44FE, 0x627C, 0x1356, 0x627E, 0x1359, 0x627F, 0x099D,
- 0x6280, 0x0655, 0x6282, 0x1357, 0x6283, 0x135E, 0x6284, 0x099E,
- 0x6285, 0x35C5, 0x6289, 0x1358, 0x628A, 0x0CFA, 0x6290, 0x4BB9,
- 0x6291, 0x0F48, 0x6292, 0x135A, 0x6293, 0x135B, 0x6294, 0x135F,
- 0x6295, 0x0C64, 0x6296, 0x135C, 0x6297, 0x07C5, 0x6298, 0x0A82,
- 0x6299, 0x4501, 0x629B, 0x136D, 0x629C, 0x0D48, 0x629E, 0x0B52,
- 0x62A6, 0x2112, 0x62A8, 0x4BBA, 0x62AB, 0x0D78, 0x62AC, 0x13B2,
- 0x62B1, 0x0E4A, 0x62B5, 0x0C0D, 0x62B9, 0x0EA3, 0x62BB, 0x1362,
- 0x62BC, 0x0521, 0x62BD, 0x0BA8, 0x62C2, 0x136B, 0x62C4, 0x38E4,
- 0x62C5, 0x0B72, 0x62C6, 0x1365, 0x62C7, 0x136C, 0x62C8, 0x1367,
- 0x62C9, 0x136E, 0x62CA, 0x136A, 0x62CC, 0x1369, 0x62CD, 0x0D25,
- 0x62CF, 0x1363, 0x62D0, 0x057D, 0x62D1, 0x1361, 0x62D2, 0x068B,
- 0x62D3, 0x0B53, 0x62D4, 0x135D, 0x62D5, 0x4502, 0x62D6, 0x41EA,
- 0x62D7, 0x1360, 0x62D8, 0x07C6, 0x62D9, 0x0A7F, 0x62DA, 0x4BBB,
- 0x62DB, 0x099F, 0x62DC, 0x1368, 0x62DD, 0x0D08, 0x62E0, 0x068C,
- 0x62E1, 0x05A6, 0x62EC, 0x05C5, 0x62ED, 0x09E7, 0x62EE, 0x1370,
- 0x62EF, 0x1375, 0x62F1, 0x1371, 0x62F3, 0x0753, 0x62F4, 0x4BBC,
- 0x62F5, 0x1376, 0x62F6, 0x0870, 0x62F7, 0x07FB, 0x62FC, 0x38E5,
- 0x62FD, 0x4504, 0x62FE, 0x0930, 0x62FF, 0x1364, 0x6301, 0x08CB,
- 0x6302, 0x1373, 0x6303, 0x4505, 0x6307, 0x08A6, 0x6308, 0x1374,
- 0x6309, 0x0488, 0x630A, 0x38E6, 0x630C, 0x136F, 0x630D, 0x38E7,
- 0x6310, 0x4506, 0x6311, 0x0BC5, 0x6316, 0x4BBD, 0x6318, 0x38E8,
- 0x6319, 0x068D, 0x631B, 0x3737, 0x631F, 0x06AC, 0x6327, 0x1372,
- 0x6328, 0x046B, 0x632A, 0x4BBE, 0x632B, 0x0833, 0x632F, 0x09FC,
- 0x6332, 0x4509, 0x6335, 0x450A, 0x6336, 0x4BBF, 0x6339, 0x38E9,
- 0x633A, 0x0C0E, 0x633B, 0x450B, 0x633C, 0x450C, 0x633D, 0x0D68,
- 0x633E, 0x1378, 0x633F, 0x0AE0, 0x6341, 0x450D, 0x6342, 0x38EA,
- 0x6343, 0x38EB, 0x6344, 0x450E, 0x6346, 0x4BC0, 0x6349, 0x0B0A,
- 0x634B, 0x4BC1, 0x634C, 0x0879, 0x634D, 0x1379, 0x634E, 0x450F,
- 0x634F, 0x137B, 0x6350, 0x1377, 0x6353, 0x4BC2, 0x6355, 0x0E31,
- 0x6357, 0x0BD9, 0x6359, 0x4511, 0x635C, 0x0ADE, 0x6365, 0x38EC,
- 0x6367, 0x0E4B, 0x6368, 0x08FA, 0x6369, 0x1387, 0x636B, 0x1386,
- 0x636C, 0x4514, 0x636E, 0x0A3E, 0x6371, 0x4BC3, 0x6372, 0x0754,
- 0x6374, 0x38ED, 0x6375, 0x4BC4, 0x6376, 0x1380, 0x6377, 0x09A1,
- 0x637A, 0x0CC0, 0x637B, 0x0CE7, 0x637C, 0x41EB, 0x637D, 0x38EE,
- 0x637F, 0x4BC5, 0x6380, 0x137E, 0x6382, 0x4BC6, 0x6383, 0x0ADF,
- 0x6384, 0x38EF, 0x6387, 0x38F0, 0x6388, 0x0924, 0x6389, 0x1383,
- 0x638A, 0x4BC7, 0x638C, 0x09A0, 0x638E, 0x137D, 0x638F, 0x1382,
- 0x6390, 0x38F1, 0x6392, 0x0D09, 0x6394, 0x4517, 0x6396, 0x137C,
- 0x6398, 0x06F7, 0x6399, 0x4515, 0x639B, 0x05BB, 0x639E, 0x38F2,
- 0x639F, 0x1384, 0x63A0, 0x0F73, 0x63A1, 0x083E, 0x63A2, 0x0B73,
- 0x63A3, 0x1381, 0x63A5, 0x0A80, 0x63A7, 0x07C7, 0x63A8, 0x0A2A,
- 0x63A9, 0x0508, 0x63AA, 0x0ABE, 0x63AB, 0x137F, 0x63AC, 0x065F,
- 0x63AE, 0x4BC8, 0x63AF, 0x4BC9, 0x63B2, 0x071D, 0x63B4, 0x0BEB,
- 0x63B5, 0x1385, 0x63BB, 0x0AE1, 0x63BD, 0x4518, 0x63BE, 0x1388,
- 0x63C0, 0x138A, 0x63C3, 0x0B17, 0x63C4, 0x1390, 0x63C6, 0x138B,
- 0x63C9, 0x138D, 0x63CF, 0x0DB3, 0x63D0, 0x0C0F, 0x63D1, 0x38F3,
- 0x63D2, 0x138E, 0x63D4, 0x4519, 0x63D5, 0x451A, 0x63D6, 0x0F16,
- 0x63DA, 0x0F32, 0x63DB, 0x05F5, 0x63DC, 0x38F4, 0x63E0, 0x451B,
- 0x63E1, 0x0472, 0x63E3, 0x138C, 0x63E5, 0x41EC, 0x63E9, 0x1389,
- 0x63EA, 0x4BCA, 0x63EB, 0x451C, 0x63EC, 0x451D, 0x63ED, 0x341C,
- 0x63EE, 0x0634, 0x63F2, 0x451E, 0x63F4, 0x0509, 0x63F5, 0x2113,
- 0x63F6, 0x138F, 0x63F7, 0x3644, 0x63F8, 0x4BCB, 0x63F9, 0x4BCC,
- 0x63FA, 0x0F33, 0x6406, 0x1393, 0x6409, 0x38F5, 0x640D, 0x0B1B,
- 0x640F, 0x139A, 0x6410, 0x38F6, 0x6412, 0x4BCD, 0x6413, 0x1394,
- 0x6414, 0x1E2C, 0x6416, 0x1391, 0x6417, 0x1398, 0x6418, 0x4BCE,
- 0x641C, 0x137A, 0x641E, 0x451F, 0x6420, 0x4BCF, 0x6422, 0x38F7,
- 0x6424, 0x4BD0, 0x6425, 0x4520, 0x6426, 0x1395, 0x6428, 0x1399,
- 0x6429, 0x4521, 0x642A, 0x4BD1, 0x642C, 0x0D56, 0x642D, 0x0C65,
- 0x642F, 0x4522, 0x6434, 0x1392, 0x6435, 0x4BD2, 0x6436, 0x1396,
- 0x643A, 0x071E, 0x643D, 0x4BD3, 0x643E, 0x0861, 0x643F, 0x4BD4,
- 0x6442, 0x0A81, 0x644E, 0x139E, 0x6451, 0x1E43, 0x6452, 0x4BD5,
- 0x6454, 0x38F8, 0x6458, 0x0C20, 0x645A, 0x4523, 0x645B, 0x38F9,
- 0x645D, 0x4524, 0x645F, 0x4BD6, 0x6460, 0x2114, 0x6467, 0x139B,
- 0x6469, 0x0E8E, 0x646D, 0x38FA, 0x646F, 0x139C, 0x6473, 0x4525,
- 0x6474, 0x4BD7, 0x6476, 0x139D, 0x6478, 0x0EDA, 0x6479, 0x41ED,
- 0x647A, 0x0A46, 0x647B, 0x38FB, 0x647D, 0x4526, 0x6483, 0x0738,
- 0x6487, 0x4527, 0x6488, 0x13A4, 0x6490, 0x4BD8, 0x6491, 0x4528,
- 0x6492, 0x0883, 0x6493, 0x13A1, 0x6495, 0x13A0, 0x6498, 0x4BD9,
- 0x6499, 0x4BDA, 0x649A, 0x0CE8, 0x649D, 0x2115, 0x649E, 0x0C8D,
- 0x649F, 0x4529, 0x64A4, 0x0C2B, 0x64A5, 0x13A2, 0x64A9, 0x13A3,
- 0x64AB, 0x0DE1, 0x64AC, 0x4BDB, 0x64AD, 0x0CFB, 0x64AE, 0x0871,
- 0x64B0, 0x0A95, 0x64B2, 0x0E7E, 0x64B3, 0x4BDC, 0x64B9, 0x05A7,
- 0x64BB, 0x13AA, 0x64BC, 0x13A5, 0x64BE, 0x38FC, 0x64BF, 0x38FD,
- 0x64C1, 0x0F34, 0x64C2, 0x13AC, 0x64C4, 0x41EE, 0x64C5, 0x13A8,
- 0x64C7, 0x13A9, 0x64CA, 0x341D, 0x64CB, 0x452A, 0x64CC, 0x452B,
- 0x64CD, 0x0AE2, 0x64CE, 0x2116, 0x64D0, 0x41EF, 0x64D2, 0x13A7,
- 0x64D4, 0x1366, 0x64D5, 0x452C, 0x64D7, 0x452D, 0x64D8, 0x13AB,
- 0x64DA, 0x13A6, 0x64E0, 0x13B0, 0x64E1, 0x13B1, 0x64E2, 0x0C21,
- 0x64E3, 0x13B3, 0x64E4, 0x452F, 0x64E5, 0x38FE, 0x64E6, 0x0872,
- 0x64E7, 0x13AE, 0x64EC, 0x0656, 0x64ED, 0x4BDD, 0x64EF, 0x13B4,
- 0x64F0, 0x4BDE, 0x64F1, 0x13AD, 0x64F2, 0x13B8, 0x64F4, 0x13B7,
- 0x64F6, 0x13B6, 0x64F7, 0x38FF, 0x64FA, 0x13B9, 0x64FB, 0x3900,
- 0x64FD, 0x13BB, 0x64FE, 0x09D9, 0x64FF, 0x4530, 0x6500, 0x13BA,
- 0x6504, 0x3901, 0x6505, 0x13BE, 0x650F, 0x4532, 0x6514, 0x4533,
- 0x6516, 0x3902, 0x6518, 0x13BC, 0x6519, 0x3903, 0x651B, 0x4BDF,
- 0x651C, 0x13BD, 0x651D, 0x1397, 0x651E, 0x4535, 0x651F, 0x4BE0,
- 0x6522, 0x1E97, 0x6523, 0x13C0, 0x6524, 0x13BF, 0x6529, 0x41F0,
- 0x652A, 0x139F, 0x652B, 0x13C1, 0x652C, 0x13B5, 0x652E, 0x4BE1,
- 0x652F, 0x08A7, 0x6532, 0x4536, 0x6534, 0x13C2, 0x6535, 0x13C3,
- 0x6536, 0x13C5, 0x6537, 0x13C4, 0x6538, 0x13C6, 0x6539, 0x057E,
- 0x653B, 0x07C8, 0x653E, 0x0E4C, 0x653F, 0x0A53, 0x6544, 0x4537,
- 0x6545, 0x0782, 0x6547, 0x3904, 0x6548, 0x13C8, 0x6549, 0x4BE2,
- 0x654D, 0x13CB, 0x654E, 0x2117, 0x654F, 0x0DC4, 0x6551, 0x0679,
- 0x6554, 0x4538, 0x6555, 0x13CA, 0x6556, 0x13C9, 0x6557, 0x0D0A,
- 0x6558, 0x13CC, 0x6559, 0x06AD, 0x655D, 0x13CE, 0x655E, 0x13CD,
- 0x6560, 0x4BE3, 0x6562, 0x05F6, 0x6563, 0x0884, 0x6566, 0x0CB0,
- 0x6567, 0x3905, 0x656B, 0x4539, 0x656C, 0x071F, 0x6570, 0x0A3A,
- 0x6572, 0x13CF, 0x6574, 0x0A54, 0x6575, 0x0C22, 0x6577, 0x0DD1,
- 0x6578, 0x13D0, 0x657A, 0x453A, 0x6581, 0x3906, 0x6582, 0x13D1,
- 0x6583, 0x13D2, 0x6584, 0x453B, 0x6585, 0x3907, 0x6587, 0x0E08,
- 0x6588, 0x120C, 0x6589, 0x0A6A, 0x658A, 0x453C, 0x658C, 0x0DBE,
- 0x658E, 0x0848, 0x6590, 0x0D79, 0x6591, 0x0D57, 0x6592, 0x4BE4,
- 0x6595, 0x4BE5, 0x6597, 0x0C47, 0x6599, 0x0F89, 0x659B, 0x13D4,
- 0x659C, 0x08FC, 0x659D, 0x41F1, 0x659F, 0x13D5, 0x65A1, 0x047A,
- 0x65A4, 0x06CC, 0x65A5, 0x0A71, 0x65A7, 0x0DD2, 0x65AB, 0x13D6,
- 0x65AC, 0x0890, 0x65AD, 0x0B85, 0x65AF, 0x08A9, 0x65B0, 0x09FD,
- 0x65B2, 0x453D, 0x65B4, 0x4BE6, 0x65B5, 0x453E, 0x65B7, 0x13D7,
- 0x65B8, 0x453F, 0x65B9, 0x0E4D, 0x65BC, 0x0519, 0x65BD, 0x08AA,
- 0x65BE, 0x4BE7, 0x65BF, 0x4540, 0x65C1, 0x13DA, 0x65C2, 0x3908,
- 0x65C3, 0x13D8, 0x65C4, 0x13DB, 0x65C5, 0x0F81, 0x65C6, 0x13D9,
- 0x65C8, 0x4BE8, 0x65C9, 0x4541, 0x65CB, 0x0A9F, 0x65CC, 0x13DC,
- 0x65CE, 0x4BE9, 0x65CF, 0x0B12, 0x65D0, 0x4BEA, 0x65D2, 0x13DD,
- 0x65D4, 0x4542, 0x65D7, 0x0636, 0x65D9, 0x13DF, 0x65DB, 0x13DE,
- 0x65DF, 0x4BEB, 0x65E0, 0x13E0, 0x65E1, 0x13E1, 0x65E2, 0x0637,
- 0x65E3, 0x3585, 0x65E5, 0x0CD4, 0x65E6, 0x0B74, 0x65E7, 0x0686,
- 0x65E8, 0x08AB, 0x65E9, 0x0AE3, 0x65EC, 0x0966, 0x65ED, 0x0474,
- 0x65F0, 0x3909, 0x65F1, 0x13E2, 0x65F2, 0x390A, 0x65F9, 0x4544,
- 0x65FA, 0x0522, 0x65FB, 0x13E6, 0x65FC, 0x4545, 0x6600, 0x2118,
- 0x6602, 0x07C9, 0x6603, 0x13E5, 0x6604, 0x4546, 0x6606, 0x081B,
- 0x6607, 0x09A2, 0x6608, 0x4547, 0x6609, 0x211A, 0x660A, 0x13E4,
- 0x660C, 0x09A3, 0x660E, 0x0ECC, 0x660F, 0x081A, 0x6613, 0x049B,
- 0x6614, 0x0A72, 0x6615, 0x2119, 0x661C, 0x13EB, 0x661E, 0x4F50,
- 0x661F, 0x0A55, 0x6620, 0x04E9, 0x6621, 0x4548, 0x6622, 0x41F3,
- 0x6624, 0x211D, 0x6625, 0x095F, 0x6627, 0x0E94, 0x6628, 0x0862,
- 0x662A, 0x4549, 0x662B, 0x41F4, 0x662C, 0x390B, 0x662D, 0x09A4,
- 0x662E, 0x211B, 0x662F, 0x0A4B, 0x6630, 0x41F5, 0x6631, 0x20AE,
- 0x6633, 0x41F6, 0x6634, 0x13EA, 0x6635, 0x13E8, 0x6636, 0x13E9,
- 0x663A, 0x41F2, 0x663B, 0x1E00, 0x663C, 0x0BA9, 0x663F, 0x1409,
- 0x6641, 0x13EF, 0x6642, 0x08CC, 0x6643, 0x07CA, 0x6644, 0x13ED,
- 0x6645, 0x454A, 0x6648, 0x41F7, 0x6649, 0x13EE, 0x664B, 0x09FE,
- 0x664C, 0x390C, 0x664E, 0x454C, 0x664F, 0x13EC, 0x6651, 0x454B,
- 0x6652, 0x087D, 0x6657, 0x211F, 0x6659, 0x2120, 0x665A, 0x3441,
- 0x665B, 0x390D, 0x665C, 0x390E, 0x665D, 0x13F1, 0x665E, 0x13F0,
- 0x665F, 0x13F5, 0x6661, 0x390F, 0x6662, 0x13F6, 0x6663, 0x373A,
- 0x6664, 0x13F2, 0x6665, 0x211E, 0x6666, 0x0580, 0x6667, 0x13F3,
- 0x6668, 0x13F4, 0x6669, 0x0D69, 0x666A, 0x4551, 0x666B, 0x3910,
- 0x666C, 0x4552, 0x666D, 0x4553, 0x666E, 0x0DD3, 0x666F, 0x0720,
- 0x6670, 0x13F7, 0x6673, 0x2122, 0x6674, 0x0A56, 0x6676, 0x09A5,
- 0x6677, 0x41F9, 0x6678, 0x41FA, 0x667A, 0x0B90, 0x667B, 0x4554,
- 0x667E, 0x4BEC, 0x6680, 0x4555, 0x6681, 0x06BF, 0x6683, 0x13F8,
- 0x6684, 0x13FC, 0x6687, 0x054B, 0x6688, 0x13F9, 0x6689, 0x13FB,
- 0x668B, 0x4BED, 0x668C, 0x4BEE, 0x668D, 0x41FB, 0x668E, 0x13FA,
- 0x6690, 0x4556, 0x6691, 0x0975, 0x6692, 0x4557, 0x6696, 0x0B86,
- 0x6697, 0x0489, 0x6698, 0x13FD, 0x6699, 0x2123, 0x669D, 0x13FE,
- 0x66A0, 0x2124, 0x66A2, 0x0BC6, 0x66A4, 0x3912, 0x66A6, 0x0FB9,
- 0x66AB, 0x0891, 0x66AD, 0x4559, 0x66AE, 0x0E3B, 0x66B1, 0x455A,
- 0x66B2, 0x2125, 0x66B3, 0x4BEF, 0x66B4, 0x0E6B, 0x66B5, 0x455B,
- 0x66B8, 0x1405, 0x66B9, 0x1400, 0x66BB, 0x41FC, 0x66BC, 0x1403,
- 0x66BE, 0x1402, 0x66BF, 0x2126, 0x66C0, 0x4BF0, 0x66C1, 0x13FF,
- 0x66C4, 0x1404, 0x66C6, 0x3455, 0x66C7, 0x0CB6, 0x66C8, 0x3913,
- 0x66C9, 0x1401, 0x66CF, 0x4BF1, 0x66D6, 0x1406, 0x66D9, 0x0976,
- 0x66DA, 0x1407, 0x66DB, 0x41FD, 0x66DC, 0x0F35, 0x66DD, 0x0D2E,
- 0x66E0, 0x1408, 0x66E6, 0x140A, 0x66E8, 0x41FE, 0x66E9, 0x140B,
- 0x66EC, 0x3914, 0x66F0, 0x140C, 0x66F2, 0x06C2, 0x66F3, 0x04EA,
- 0x66F4, 0x07CB, 0x66F5, 0x140D, 0x66F7, 0x140E, 0x66F8, 0x097B,
- 0x66F9, 0x0AE4, 0x66FA, 0x2127, 0x66FB, 0x20B1, 0x66FC, 0x10ED,
- 0x66FD, 0x0AC0, 0x66FE, 0x0ABF, 0x66FF, 0x0B38, 0x6700, 0x0837,
- 0x6701, 0x455F, 0x6703, 0x104B, 0x6705, 0x3915, 0x6708, 0x0744,
- 0x6709, 0x0F17, 0x670B, 0x0E4E, 0x670D, 0x0DF0, 0x670E, 0x2128,
- 0x670F, 0x140F, 0x6712, 0x4560, 0x6713, 0x3916, 0x6714, 0x0863,
- 0x6715, 0x0BDB, 0x6716, 0x1410, 0x6717, 0x0FD5, 0x6719, 0x4562,
- 0x671B, 0x0E6C, 0x671D, 0x0BC7, 0x671E, 0x1411, 0x671F, 0x0638,
- 0x6725, 0x4BF2, 0x6726, 0x1412, 0x6727, 0x1413, 0x6728, 0x0EE6,
- 0x672A, 0x0EB0, 0x672B, 0x0EA4, 0x672C, 0x0E8A, 0x672D, 0x0873,
- 0x672E, 0x1415, 0x6731, 0x0917, 0x6733, 0x3917, 0x6734, 0x0E7F,
- 0x6735, 0x4BF3, 0x6736, 0x1417, 0x6737, 0x141A, 0x6738, 0x1419,
- 0x673A, 0x0635, 0x673D, 0x067A, 0x673F, 0x1416, 0x6741, 0x1418,
- 0x6743, 0x35B7, 0x6746, 0x141B, 0x6747, 0x41FF, 0x6748, 0x3918,
- 0x6749, 0x0A3F, 0x674C, 0x3919, 0x674D, 0x4565, 0x674E, 0x0F65,
- 0x674F, 0x048D, 0x6750, 0x0850, 0x6751, 0x0B1C, 0x6753, 0x0909,
- 0x6754, 0x4566, 0x6755, 0x4BF4, 0x6756, 0x09DB, 0x6759, 0x141E,
- 0x675C, 0x0C48, 0x675D, 0x4567, 0x675E, 0x141C, 0x675F, 0x0B0B,
- 0x6760, 0x141D, 0x6761, 0x09DA, 0x6762, 0x0EE9, 0x6763, 0x141F,
- 0x6764, 0x1420, 0x6765, 0x0F52, 0x6766, 0x212A, 0x676A, 0x1425,
- 0x676D, 0x07CC, 0x676E, 0x3571, 0x676F, 0x0D0B, 0x6770, 0x1422,
- 0x6771, 0x0C66, 0x6772, 0x13E3, 0x6773, 0x13E7, 0x6774, 0x456B,
- 0x6775, 0x0669, 0x6776, 0x391A, 0x6777, 0x0CFD, 0x677B, 0x391B,
- 0x677C, 0x1424, 0x677E, 0x09A6, 0x677F, 0x0D58, 0x6780, 0x4BF5,
- 0x6781, 0x4200, 0x6785, 0x142A, 0x6787, 0x0D8E, 0x6789, 0x1421,
- 0x678B, 0x1427, 0x678C, 0x1426, 0x678F, 0x4BF6, 0x6790, 0x0A73,
- 0x6791, 0x4BF7, 0x6792, 0x456D, 0x6793, 0x4201, 0x6795, 0x0E9B,
- 0x6797, 0x0F9B, 0x6798, 0x4202, 0x679A, 0x0E95, 0x679B, 0x4203,
- 0x679C, 0x054C, 0x679D, 0x08AC, 0x67A0, 0x0FEE, 0x67A1, 0x1429,
- 0x67A2, 0x0A3B, 0x67A4, 0x4BF8, 0x67A6, 0x1428, 0x67A9, 0x1423,
- 0x67AF, 0x0783, 0x67B0, 0x391C, 0x67B1, 0x4BF9, 0x67B2, 0x391D,
- 0x67B3, 0x142F, 0x67B4, 0x142D, 0x67B5, 0x4BFA, 0x67B6, 0x054D,
- 0x67B7, 0x142B, 0x67B8, 0x1431, 0x67B9, 0x1437, 0x67BB, 0x212B,
- 0x67BE, 0x4BFB, 0x67C0, 0x212D, 0x67C1, 0x0B28, 0x67C3, 0x4571,
- 0x67C4, 0x0E11, 0x67C6, 0x1439, 0x67C8, 0x4572, 0x67CA, 0x0D94,
- 0x67CE, 0x1438, 0x67CF, 0x0D26, 0x67D0, 0x0E6D, 0x67D1, 0x05F7,
- 0x67D2, 0x4573, 0x67D3, 0x0A9B, 0x67D4, 0x094A, 0x67D7, 0x391F,
- 0x67D8, 0x0BEF, 0x67D9, 0x3920, 0x67DA, 0x0F18, 0x67DB, 0x4574,
- 0x67DD, 0x1434, 0x67DE, 0x1433, 0x67E2, 0x1435, 0x67E4, 0x1432,
- 0x67E7, 0x143A, 0x67E9, 0x1430, 0x67EC, 0x142E, 0x67EE, 0x1436,
- 0x67EF, 0x142C, 0x67F0, 0x3921, 0x67F1, 0x0BAA, 0x67F3, 0x0F04,
- 0x67F4, 0x08F2, 0x67F5, 0x0864, 0x67F7, 0x4575, 0x67F9, 0x391E,
- 0x67FA, 0x1E9A, 0x67FB, 0x082A, 0x67FC, 0x4204, 0x67FE, 0x0E9D,
- 0x67FF, 0x059F, 0x6801, 0x36F2, 0x6802, 0x0BEA, 0x6803, 0x0CA2,
- 0x6804, 0x04EB, 0x6805, 0x1E07, 0x6810, 0x4570, 0x6813, 0x0A96,
- 0x6816, 0x0A58, 0x6817, 0x0700, 0x6818, 0x4579, 0x681D, 0x4205,
- 0x681E, 0x143C, 0x681F, 0x457A, 0x6821, 0x07CD, 0x6822, 0x05DA,
- 0x6828, 0x4BFC, 0x6829, 0x143E, 0x682A, 0x05D2, 0x682B, 0x1444,
- 0x682C, 0x3922, 0x682D, 0x457B, 0x6830, 0x3923, 0x6831, 0x3924,
- 0x6832, 0x1441, 0x6833, 0x457D, 0x6834, 0x0A97, 0x6838, 0x05A9,
- 0x6839, 0x081C, 0x683B, 0x457E, 0x683C, 0x05A8, 0x683D, 0x083F,
- 0x683E, 0x457F, 0x6840, 0x143F, 0x6841, 0x073B, 0x6842, 0x0721,
- 0x6843, 0x0C67, 0x6844, 0x212F, 0x6845, 0x4580, 0x6846, 0x143D,
- 0x6848, 0x048A, 0x6849, 0x4581, 0x684C, 0x4582, 0x684D, 0x1440,
- 0x684E, 0x1442, 0x6850, 0x06C5, 0x6851, 0x0702, 0x6852, 0x212C,
- 0x6853, 0x05F8, 0x6854, 0x0665, 0x6855, 0x4583, 0x6857, 0x4584,
- 0x6859, 0x1445, 0x685B, 0x3925, 0x685C, 0x0869, 0x685D, 0x0E9F,
- 0x685F, 0x0885, 0x6863, 0x1446, 0x6867, 0x0DA2, 0x686B, 0x4586,
- 0x686E, 0x4587, 0x6872, 0x3926, 0x6874, 0x1452, 0x6875, 0x3927,
- 0x6876, 0x0533, 0x6877, 0x1447, 0x687A, 0x3928, 0x687C, 0x4588,
- 0x687E, 0x1458, 0x687F, 0x1448, 0x6881, 0x0F8A, 0x6882, 0x4589,
- 0x6883, 0x144F, 0x6884, 0x3929, 0x6885, 0x0D15, 0x6886, 0x4BFD,
- 0x688D, 0x1457, 0x688E, 0x1E9C, 0x688F, 0x144A, 0x6890, 0x458A,
- 0x6893, 0x0478, 0x6894, 0x144C, 0x6896, 0x458B, 0x6897, 0x07CE,
- 0x6898, 0x458D, 0x6899, 0x458E, 0x689A, 0x458F, 0x689B, 0x144E,
- 0x689C, 0x4590, 0x689D, 0x144D, 0x689F, 0x1449, 0x68A0, 0x1454,
- 0x68A2, 0x09A7, 0x68A3, 0x4206, 0x68A5, 0x392A, 0x68A6, 0x11BE,
- 0x68A7, 0x079C, 0x68A8, 0x0F66, 0x68AA, 0x4591, 0x68AB, 0x4592,
- 0x68AD, 0x144B, 0x68AF, 0x0C10, 0x68B0, 0x0581, 0x68B1, 0x081D,
- 0x68B2, 0x392B, 0x68B3, 0x1443, 0x68B4, 0x4593, 0x68B5, 0x1453,
- 0x68B6, 0x05BF, 0x68B9, 0x1451, 0x68BA, 0x1455, 0x68BB, 0x4594,
- 0x68BC, 0x0C68, 0x68C3, 0x4598, 0x68C4, 0x063A, 0x68C5, 0x4599,
- 0x68C6, 0x1473, 0x68C8, 0x20AF, 0x68C9, 0x0ED5, 0x68CA, 0x145A,
- 0x68CB, 0x0639, 0x68CC, 0x459A, 0x68CD, 0x1461, 0x68CF, 0x2130,
- 0x68D0, 0x392C, 0x68D2, 0x0E6E, 0x68D4, 0x1462, 0x68D5, 0x1464,
- 0x68D6, 0x392D, 0x68D7, 0x1468, 0x68D8, 0x145C, 0x68D9, 0x459B,
- 0x68DA, 0x0B68, 0x68DF, 0x0C69, 0x68E0, 0x146C, 0x68E1, 0x145F,
- 0x68E3, 0x1469, 0x68E4, 0x459C, 0x68E5, 0x459D, 0x68E7, 0x1463,
- 0x68E8, 0x392E, 0x68EB, 0x4BFE, 0x68EC, 0x459E, 0x68ED, 0x392F,
- 0x68EE, 0x09FF, 0x68EF, 0x146D, 0x68F0, 0x3930, 0x68F1, 0x3931,
- 0x68F2, 0x0A57, 0x68F5, 0x4BFF, 0x68F7, 0x459F, 0x68F9, 0x146B,
- 0x68FA, 0x05F9, 0x68FB, 0x4595, 0x68FC, 0x3932, 0x6900, 0x0FF6,
- 0x6901, 0x1459, 0x6903, 0x45A0, 0x6904, 0x1467, 0x6905, 0x049C,
- 0x6907, 0x45A1, 0x6908, 0x145B, 0x690A, 0x4207, 0x690B, 0x0EC6,
- 0x690C, 0x1460, 0x690D, 0x09E8, 0x690E, 0x0BE3, 0x690F, 0x1456,
- 0x6911, 0x3933, 0x6912, 0x1466, 0x6913, 0x3934, 0x6917, 0x4C00,
- 0x6919, 0x0A40, 0x691A, 0x1470, 0x691B, 0x05CF, 0x691C, 0x0755,
- 0x6921, 0x1472, 0x6922, 0x145D, 0x6923, 0x1471, 0x6925, 0x146A,
- 0x6926, 0x145E, 0x6928, 0x146E, 0x692A, 0x146F, 0x6930, 0x1480,
- 0x6933, 0x4C01, 0x6934, 0x0CA6, 0x6935, 0x3935, 0x6936, 0x1465,
- 0x6938, 0x4C02, 0x6939, 0x147C, 0x693B, 0x3936, 0x693D, 0x147E,
- 0x693F, 0x0BF4, 0x6942, 0x420A, 0x6946, 0x45A5, 0x6949, 0x4208,
- 0x694A, 0x0F36, 0x6953, 0x0DE8, 0x6954, 0x1479, 0x6955, 0x0B2A,
- 0x6957, 0x3937, 0x6959, 0x147F, 0x695A, 0x0AC1, 0x695B, 0x4C03,
- 0x695C, 0x1476, 0x695D, 0x1483, 0x695E, 0x1482, 0x6960, 0x0CC7,
- 0x6961, 0x1481, 0x6962, 0x0CC2, 0x6963, 0x3938, 0x6964, 0x420B,
- 0x6965, 0x4C04, 0x6968, 0x2132, 0x6969, 0x45A6, 0x696A, 0x1485,
- 0x696B, 0x1478, 0x696C, 0x45A7, 0x696D, 0x06C0, 0x696E, 0x147B,
- 0x696F, 0x0967, 0x6972, 0x3939, 0x6973, 0x0D16, 0x6974, 0x147D,
- 0x6975, 0x06C3, 0x6977, 0x1475, 0x6978, 0x1477, 0x6979, 0x1474,
- 0x697A, 0x45A8, 0x697C, 0x0FD6, 0x697D, 0x05B8, 0x697E, 0x147A,
- 0x697F, 0x393A, 0x6980, 0x393B, 0x6981, 0x1484, 0x6982, 0x0593,
- 0x6986, 0x3740, 0x698A, 0x0857, 0x698E, 0x04FF, 0x6991, 0x1495,
- 0x6992, 0x45A9, 0x6994, 0x0FD7, 0x6995, 0x1498, 0x6996, 0x45AB,
- 0x6998, 0x2134, 0x699B, 0x0A00, 0x699C, 0x1497, 0x69A0, 0x1496,
- 0x69A5, 0x420C, 0x69A6, 0x393C, 0x69A7, 0x1493, 0x69A8, 0x4C05,
- 0x69AB, 0x4C06, 0x69AD, 0x393D, 0x69AE, 0x1487, 0x69AF, 0x4C07,
- 0x69B0, 0x45AC, 0x69B1, 0x14A4, 0x69B2, 0x1486, 0x69B4, 0x1499,
- 0x69B7, 0x393E, 0x69BA, 0x45AD, 0x69BB, 0x1491, 0x69BC, 0x45AE,
- 0x69BE, 0x148C, 0x69BF, 0x1489, 0x69C0, 0x45AF, 0x69C1, 0x148A,
- 0x69C3, 0x1492, 0x69C7, 0x1D33, 0x69CA, 0x148F, 0x69CB, 0x07CF,
- 0x69CC, 0x0BE4, 0x69CD, 0x0AE6, 0x69CE, 0x148D, 0x69CF, 0x420D,
- 0x69D0, 0x1488, 0x69D1, 0x45B0, 0x69D3, 0x148B, 0x69D6, 0x393F,
- 0x69D7, 0x3940, 0x69D8, 0x0F37, 0x69D9, 0x0E98, 0x69DD, 0x1490,
- 0x69DE, 0x149A, 0x69E2, 0x2135, 0x69E3, 0x45B4, 0x69E5, 0x4C08,
- 0x69E7, 0x14A2, 0x69E8, 0x149B, 0x69E9, 0x4210, 0x69EA, 0x3411,
- 0x69EB, 0x14A8, 0x69ED, 0x14A6, 0x69EE, 0x45B5, 0x69EF, 0x45B6,
- 0x69F1, 0x4C09, 0x69F2, 0x14A1, 0x69F3, 0x45B7, 0x69F4, 0x45B9,
- 0x69F5, 0x4211, 0x69F6, 0x373F, 0x69F9, 0x14A0, 0x69FB, 0x0BEC,
- 0x69FD, 0x0AE7, 0x69FE, 0x45BA, 0x69FF, 0x149E, 0x6A01, 0x3941,
- 0x6A02, 0x149C, 0x6A05, 0x14A3, 0x6A0A, 0x14A9, 0x6A0B, 0x0D89,
- 0x6A0C, 0x14AF, 0x6A0F, 0x3942, 0x6A11, 0x45BB, 0x6A12, 0x14AA,
- 0x6A13, 0x14AD, 0x6A14, 0x14A7, 0x6A15, 0x3943, 0x6A17, 0x0BB2,
- 0x6A19, 0x0DAA, 0x6A1A, 0x45BC, 0x6A1B, 0x149D, 0x6A1D, 0x45BD,
- 0x6A1E, 0x14A5, 0x6A1F, 0x09A8, 0x6A21, 0x0EDB, 0x6A22, 0x14B9,
- 0x6A23, 0x14AC, 0x6A28, 0x3944, 0x6A29, 0x0756, 0x6A2A, 0x0523,
- 0x6A2B, 0x05BD, 0x6A2E, 0x1494, 0x6A30, 0x2136, 0x6A32, 0x45BF,
- 0x6A33, 0x45C0, 0x6A34, 0x3945, 0x6A35, 0x09A9, 0x6A36, 0x14B1,
- 0x6A38, 0x14B8, 0x6A39, 0x0925, 0x6A3A, 0x05D0, 0x6A3B, 0x4213,
- 0x6A3D, 0x0B6C, 0x6A3E, 0x3946, 0x6A3F, 0x45C1, 0x6A44, 0x14AE,
- 0x6A45, 0x3947, 0x6A46, 0x2138, 0x6A47, 0x14B3, 0x6A48, 0x14B7,
- 0x6A49, 0x45C2, 0x6A4A, 0x4C0A, 0x6A4B, 0x06AE, 0x6A4E, 0x45C4,
- 0x6A50, 0x3948, 0x6A51, 0x3949, 0x6A52, 0x45C5, 0x6A54, 0x3C34,
- 0x6A55, 0x4C0B, 0x6A56, 0x394A, 0x6A58, 0x0666, 0x6A59, 0x14B5,
- 0x6A5B, 0x394B, 0x6A5F, 0x063B, 0x6A61, 0x0CA3, 0x6A62, 0x14B4,
- 0x6A64, 0x45C6, 0x6A66, 0x14B6, 0x6A67, 0x4C0C, 0x6A6B, 0x2137,
- 0x6A71, 0x4C0D, 0x6A72, 0x14B0, 0x6A73, 0x2139, 0x6A78, 0x14B2,
- 0x6A7A, 0x45C3, 0x6A7E, 0x213A, 0x6A7F, 0x05BE, 0x6A80, 0x0B87,
- 0x6A83, 0x394C, 0x6A84, 0x14BD, 0x6A89, 0x394D, 0x6A8B, 0x45C8,
- 0x6A8D, 0x14BB, 0x6A8E, 0x079D, 0x6A90, 0x14BA, 0x6A91, 0x394E,
- 0x6A94, 0x4215, 0x6A97, 0x14C0, 0x6A9C, 0x143B, 0x6A9D, 0x394F,
- 0x6A9E, 0x3950, 0x6A9F, 0x3951, 0x6AA0, 0x14BC, 0x6AA1, 0x45CA,
- 0x6AA2, 0x14BE, 0x6AA3, 0x14BF, 0x6AA5, 0x4216, 0x6AAA, 0x14CB,
- 0x6AAB, 0x45CC, 0x6AAC, 0x14C7, 0x6AAE, 0x1450, 0x6AAF, 0x4C0E,
- 0x6AB3, 0x14C6, 0x6AB8, 0x14C5, 0x6ABB, 0x14C2, 0x6ABD, 0x45CD,
- 0x6AC1, 0x14AB, 0x6AC2, 0x14C4, 0x6AC3, 0x14C3, 0x6AC6, 0x45CE,
- 0x6AC8, 0x4C0F, 0x6AC9, 0x4C10, 0x6AD0, 0x45D0, 0x6AD1, 0x14C9,
- 0x6AD3, 0x0FCC, 0x6AD4, 0x45CF, 0x6ADA, 0x14CC, 0x6ADB, 0x06F3,
- 0x6ADC, 0x3952, 0x6ADD, 0x45D1, 0x6ADE, 0x14C8, 0x6ADF, 0x14CA,
- 0x6AE2, 0x213B, 0x6AE4, 0x213C, 0x6AE7, 0x3953, 0x6AE8, 0x0D3B,
- 0x6AEA, 0x14CD, 0x6AEC, 0x3954, 0x6AF1, 0x45D4, 0x6AF2, 0x45D5,
- 0x6AF3, 0x45D6, 0x6AF8, 0x4EB8, 0x6AFA, 0x14D1, 0x6AFB, 0x14CE,
- 0x6AFD, 0x45D7, 0x6B03, 0x4C11, 0x6B04, 0x0F5D, 0x6B05, 0x14CF,
- 0x6B0A, 0x149F, 0x6B0B, 0x45D9, 0x6B0F, 0x45DA, 0x6B10, 0x45DB,
- 0x6B11, 0x45DC, 0x6B12, 0x14D2, 0x6B16, 0x14D3, 0x6B17, 0x45DE,
- 0x6B1B, 0x4218, 0x6B1D, 0x04D7, 0x6B1E, 0x3955, 0x6B1F, 0x14D5,
- 0x6B20, 0x073D, 0x6B21, 0x08CD, 0x6B23, 0x06CD, 0x6B24, 0x3956,
- 0x6B27, 0x0524, 0x6B2C, 0x4219, 0x6B2F, 0x45E0, 0x6B32, 0x0F49,
- 0x6B35, 0x3957, 0x6B37, 0x14D7, 0x6B38, 0x14D6, 0x6B39, 0x14D9,
- 0x6B3A, 0x0657, 0x6B3B, 0x4C12, 0x6B3D, 0x06CE, 0x6B3E, 0x05FA,
- 0x6B3F, 0x4C13, 0x6B43, 0x14DC, 0x6B46, 0x3958, 0x6B47, 0x14DB,
- 0x6B49, 0x14DD, 0x6B4A, 0x45E1, 0x6B4C, 0x054E, 0x6B4E, 0x0B75,
- 0x6B50, 0x14DE, 0x6B53, 0x05FB, 0x6B54, 0x14E0, 0x6B56, 0x3959,
- 0x6B58, 0x45E2, 0x6B59, 0x14DF, 0x6B5B, 0x14E1, 0x6B5F, 0x14E2,
- 0x6B60, 0x395A, 0x6B61, 0x14E3, 0x6B62, 0x08AD, 0x6B63, 0x0A59,
- 0x6B64, 0x0811, 0x6B65, 0x344A, 0x6B66, 0x0DE2, 0x6B67, 0x421A,
- 0x6B69, 0x0E32, 0x6B6A, 0x0FEA, 0x6B6C, 0x45E3, 0x6B6F, 0x08C3,
- 0x6B72, 0x35D9, 0x6B73, 0x0840, 0x6B74, 0x0FBA, 0x6B75, 0x45E4,
- 0x6B77, 0x3456, 0x6B78, 0x14E4, 0x6B79, 0x14E5, 0x6B7A, 0x45E5,
- 0x6B7B, 0x08AE, 0x6B7D, 0x4C14, 0x6B7E, 0x4C15, 0x6B7F, 0x14E6,
- 0x6B80, 0x14E7, 0x6B81, 0x45E6, 0x6B82, 0x395B, 0x6B83, 0x14E9,
- 0x6B84, 0x14E8, 0x6B86, 0x0E86, 0x6B89, 0x0968, 0x6B8A, 0x0918,
- 0x6B8B, 0x0892, 0x6B8D, 0x14EA, 0x6B95, 0x14EC, 0x6B96, 0x09E9,
- 0x6B98, 0x14EB, 0x6B9B, 0x45E7, 0x6B9E, 0x14ED, 0x6BA4, 0x14EE,
- 0x6BA9, 0x421B, 0x6BAA, 0x14EF, 0x6BAB, 0x14F0, 0x6BAD, 0x421C,
- 0x6BAE, 0x45E8, 0x6BAF, 0x14F1, 0x6BB0, 0x4C16, 0x6BB1, 0x14F3,
- 0x6BB2, 0x14F2, 0x6BB3, 0x14F4, 0x6BB4, 0x0525, 0x6BB5, 0x0B88,
- 0x6BB7, 0x14F5, 0x6BBA, 0x0874, 0x6BBB, 0x05AA, 0x6BBC, 0x14F6,
- 0x6BBD, 0x45EA, 0x6BBE, 0x395C, 0x6BBF, 0x0C3C, 0x6BC0, 0x119D,
- 0x6BC5, 0x063D, 0x6BC6, 0x14F7, 0x6BC7, 0x45EB, 0x6BC8, 0x45EC,
- 0x6BC9, 0x45ED, 0x6BCB, 0x14F8, 0x6BCC, 0x3744, 0x6BCD, 0x0E3C,
- 0x6BCE, 0x0E96, 0x6BCF, 0x344C, 0x6BD2, 0x0C9F, 0x6BD3, 0x14F9,
- 0x6BD4, 0x0D7A, 0x6BD6, 0x213D, 0x6BD7, 0x421D, 0x6BD8, 0x0D8F,
- 0x6BDA, 0x45EE, 0x6BDB, 0x0EDF, 0x6BDF, 0x14FA, 0x6BE1, 0x395D,
- 0x6BE6, 0x45EF, 0x6BE7, 0x45F0, 0x6BEB, 0x14FC, 0x6BEC, 0x14FB,
- 0x6BEE, 0x45F1, 0x6BEF, 0x14FE, 0x6BF1, 0x395E, 0x6BF3, 0x14FD,
- 0x6BF7, 0x4C17, 0x6BF9, 0x4C18, 0x6BFF, 0x421E, 0x6C02, 0x45F2,
- 0x6C04, 0x4C19, 0x6C05, 0x421F, 0x6C08, 0x1500, 0x6C09, 0x4C1A,
- 0x6C0A, 0x45F3, 0x6C0D, 0x4C1B, 0x6C0E, 0x45F4, 0x6C0F, 0x08AF,
- 0x6C10, 0x395F, 0x6C11, 0x0EBD, 0x6C13, 0x1501, 0x6C14, 0x1502,
- 0x6C17, 0x063E, 0x6C1B, 0x1503, 0x6C23, 0x1505, 0x6C24, 0x1504,
- 0x6C2C, 0x4C1C, 0x6C33, 0x3960, 0x6C34, 0x0A2B, 0x6C35, 0x3961,
- 0x6C36, 0x45F5, 0x6C37, 0x0DAB, 0x6C38, 0x04EC, 0x6C3A, 0x4F55,
- 0x6C3E, 0x0D59, 0x6C3F, 0x213E, 0x6C40, 0x0C11, 0x6C41, 0x094B,
- 0x6C42, 0x067B, 0x6C4A, 0x4C1D, 0x6C4D, 0x45F7, 0x6C4E, 0x0D5A,
- 0x6C50, 0x08DA, 0x6C52, 0x4C1E, 0x6C54, 0x4C1F, 0x6C55, 0x1507,
- 0x6C57, 0x05FC, 0x6C59, 0x3963, 0x6C5A, 0x051A, 0x6C5B, 0x45F8,
- 0x6C5C, 0x213F, 0x6C5D, 0x0CCA, 0x6C5E, 0x1506, 0x6C5F, 0x07D0,
- 0x6C60, 0x0B91, 0x6C62, 0x1508, 0x6C67, 0x460A, 0x6C68, 0x1510,
- 0x6C6A, 0x1509, 0x6C6D, 0x45F9, 0x6C6F, 0x2141, 0x6C70, 0x0B21,
- 0x6C72, 0x067C, 0x6C73, 0x1511, 0x6C74, 0x4220, 0x6C76, 0x3964,
- 0x6C79, 0x4C20, 0x6C7A, 0x073E, 0x6C7B, 0x3965, 0x6C7D, 0x063F,
- 0x6C7E, 0x150F, 0x6C81, 0x150D, 0x6C82, 0x150A, 0x6C83, 0x0F4A,
- 0x6C84, 0x45FA, 0x6C85, 0x3966, 0x6C86, 0x2140, 0x6C88, 0x0BDC,
- 0x6C89, 0x45FB, 0x6C8C, 0x0CB1, 0x6C8D, 0x150B, 0x6C90, 0x1513,
- 0x6C92, 0x1512, 0x6C93, 0x06F9, 0x6C94, 0x45FD, 0x6C95, 0x3967,
- 0x6C96, 0x052D, 0x6C97, 0x45FE, 0x6C98, 0x4221, 0x6C99, 0x082B,
- 0x6C9A, 0x150C, 0x6C9B, 0x150E, 0x6C9C, 0x3968, 0x6CA1, 0x0E85,
- 0x6CA2, 0x0B54, 0x6CAA, 0x3749, 0x6CAB, 0x0EA5, 0x6CAC, 0x4C21,
- 0x6CAD, 0x45FF, 0x6CAE, 0x151B, 0x6CB1, 0x151C, 0x6CB3, 0x054F,
- 0x6CB4, 0x4C22, 0x6CB8, 0x0DF8, 0x6CB9, 0x0F09, 0x6CBA, 0x151E,
- 0x6CBB, 0x08CF, 0x6CBC, 0x09AA, 0x6CBD, 0x1517, 0x6CBE, 0x151D,
- 0x6CBF, 0x050A, 0x6CC1, 0x06AF, 0x6CC2, 0x4600, 0x6CC4, 0x1514,
- 0x6CC5, 0x1519, 0x6CC6, 0x4223, 0x6CC9, 0x0A98, 0x6CCA, 0x0D27,
- 0x6CCC, 0x0D7B, 0x6CD0, 0x3969, 0x6CD2, 0x4C23, 0x6CD3, 0x1516,
- 0x6CD4, 0x396A, 0x6CD5, 0x0E4F, 0x6CD6, 0x396B, 0x6CD7, 0x1518,
- 0x6CD9, 0x1521, 0x6CDA, 0x2142, 0x6CDB, 0x151F, 0x6CDC, 0x4602,
- 0x6CDD, 0x151A, 0x6CE0, 0x396C, 0x6CE1, 0x0E50, 0x6CE2, 0x0CFE,
- 0x6CE3, 0x067D, 0x6CE5, 0x0C1F, 0x6CE8, 0x0BAB, 0x6CE9, 0x4603,
- 0x6CEA, 0x1522, 0x6CEB, 0x396D, 0x6CEC, 0x396E, 0x6CED, 0x4604,
- 0x6CEE, 0x396F, 0x6CEF, 0x1520, 0x6CF0, 0x0B39, 0x6CF1, 0x1515,
- 0x6CF3, 0x04ED, 0x6CFB, 0x4222, 0x6D00, 0x4606, 0x6D01, 0x3C35,
- 0x6D04, 0x2143, 0x6D0A, 0x3970, 0x6D0B, 0x0F38, 0x6D0C, 0x152D,
- 0x6D0E, 0x3971, 0x6D11, 0x3972, 0x6D12, 0x152C, 0x6D17, 0x0A9A,
- 0x6D19, 0x1529, 0x6D1B, 0x0F56, 0x6D1E, 0x0C8E, 0x6D1F, 0x1523,
- 0x6D24, 0x4607, 0x6D25, 0x0BE1, 0x6D26, 0x4608, 0x6D27, 0x4609,
- 0x6D29, 0x04EE, 0x6D2A, 0x07D1, 0x6D2B, 0x1526, 0x6D2E, 0x3973,
- 0x6D2F, 0x460B, 0x6D31, 0x4224, 0x6D32, 0x0931, 0x6D33, 0x152B,
- 0x6D34, 0x461E, 0x6D35, 0x152A, 0x6D36, 0x1525, 0x6D38, 0x1528,
- 0x6D39, 0x4225, 0x6D3B, 0x05C6, 0x6D3C, 0x460C, 0x6D3D, 0x1527,
- 0x6D3E, 0x0CFF, 0x6D3F, 0x4226, 0x6D41, 0x0F76, 0x6D44, 0x09DC,
- 0x6D45, 0x0A99, 0x6D57, 0x3974, 0x6D58, 0x4227, 0x6D59, 0x1533,
- 0x6D5A, 0x1531, 0x6D5B, 0x460D, 0x6D5C, 0x0DBF, 0x6D5E, 0x3975,
- 0x6D60, 0x460E, 0x6D61, 0x4C24, 0x6D63, 0x152E, 0x6D64, 0x1530,
- 0x6D65, 0x3976, 0x6D66, 0x04DC, 0x6D69, 0x07D2, 0x6D6A, 0x0FD8,
- 0x6D6C, 0x059B, 0x6D6E, 0x0DD4, 0x6D6F, 0x2145, 0x6D70, 0x460F,
- 0x6D74, 0x0F4B, 0x6D77, 0x0582, 0x6D78, 0x0A01, 0x6D79, 0x1532,
- 0x6D7C, 0x4C25, 0x6D80, 0x4610, 0x6D81, 0x4611, 0x6D82, 0x3977,
- 0x6D85, 0x1537, 0x6D87, 0x2144, 0x6D88, 0x09AB, 0x6D89, 0x342A,
- 0x6D8A, 0x4612, 0x6D8C, 0x0F1A, 0x6D8D, 0x4613, 0x6D8E, 0x1534,
- 0x6D91, 0x4614, 0x6D93, 0x152F, 0x6D94, 0x4228, 0x6D95, 0x1535,
- 0x6D96, 0x2146, 0x6D98, 0x4615, 0x6D99, 0x0FA6, 0x6D9B, 0x0C6D,
- 0x6D9C, 0x0C9A, 0x6DAA, 0x4229, 0x6DAB, 0x461A, 0x6DAC, 0x2147,
- 0x6DAE, 0x461B, 0x6DAF, 0x0594, 0x6DB2, 0x04F7, 0x6DB4, 0x461C,
- 0x6DB5, 0x153B, 0x6DB8, 0x153E, 0x6DB9, 0x4C26, 0x6DBC, 0x0F8B,
- 0x6DBF, 0x3978, 0x6DC0, 0x0F4E, 0x6DC2, 0x461D, 0x6DC4, 0x3979,
- 0x6DC5, 0x1545, 0x6DC6, 0x153F, 0x6DC7, 0x153C, 0x6DC8, 0x461F,
- 0x6DCA, 0x397A, 0x6DCB, 0x0F9C, 0x6DCC, 0x1542, 0x6DCE, 0x4620,
- 0x6DCF, 0x2148, 0x6DD0, 0x3C36, 0x6DD1, 0x0954, 0x6DD2, 0x1544,
- 0x6DD5, 0x1549, 0x6DD6, 0x397B, 0x6DD8, 0x0C6B, 0x6DD9, 0x1547,
- 0x6DDA, 0x3453, 0x6DDB, 0x422A, 0x6DDD, 0x422B, 0x6DDE, 0x1541,
- 0x6DDF, 0x4621, 0x6DE1, 0x0B76, 0x6DE4, 0x1548, 0x6DE6, 0x153D,
- 0x6DE8, 0x1543, 0x6DE9, 0x397C, 0x6DEA, 0x154A, 0x6DEB, 0x04C0,
- 0x6DEC, 0x1540, 0x6DEE, 0x154B, 0x6DF0, 0x4C27, 0x6DF1, 0x0A02,
- 0x6DF2, 0x214A, 0x6DF3, 0x0969, 0x6DF5, 0x0DF5, 0x6DF6, 0x4622,
- 0x6DF7, 0x081E, 0x6DF8, 0x2149, 0x6DF9, 0x1538, 0x6DFA, 0x1546,
- 0x6DFB, 0x0C34, 0x6DFC, 0x214B, 0x6E05, 0x0A5A, 0x6E07, 0x05C7,
- 0x6E08, 0x0841, 0x6E09, 0x09AC, 0x6E0A, 0x153A, 0x6E0B, 0x094C,
- 0x6E13, 0x0722, 0x6E15, 0x1539, 0x6E17, 0x3746, 0x6E19, 0x154F,
- 0x6E1A, 0x0977, 0x6E1B, 0x076E, 0x6E1D, 0x155E, 0x6E1E, 0x4624,
- 0x6E1F, 0x1558, 0x6E20, 0x068E, 0x6E21, 0x0C49, 0x6E22, 0x397D,
- 0x6E23, 0x1553, 0x6E24, 0x155C, 0x6E25, 0x0473, 0x6E26, 0x04D4,
- 0x6E27, 0x214E, 0x6E29, 0x0539, 0x6E2B, 0x1555, 0x6E2C, 0x0B0C,
- 0x6E2D, 0x154C, 0x6E2E, 0x154E, 0x6E2F, 0x07D3, 0x6E32, 0x4626,
- 0x6E34, 0x3412, 0x6E36, 0x4623, 0x6E38, 0x155F, 0x6E39, 0x214C,
- 0x6E3A, 0x155A, 0x6E3C, 0x214F, 0x6E3E, 0x1552, 0x6E42, 0x3C37,
- 0x6E43, 0x1559, 0x6E44, 0x422C, 0x6E45, 0x4C28, 0x6E48, 0x4627,
- 0x6E49, 0x4628, 0x6E4A, 0x0EB7, 0x6E4B, 0x4629, 0x6E4C, 0x462A,
- 0x6E4D, 0x1557, 0x6E4E, 0x155B, 0x6E4F, 0x462B, 0x6E51, 0x397E,
- 0x6E53, 0x462C, 0x6E54, 0x462D, 0x6E56, 0x0784, 0x6E57, 0x462E,
- 0x6E58, 0x09AD, 0x6E5B, 0x0B77, 0x6E5C, 0x214D, 0x6E5E, 0x422D,
- 0x6E5F, 0x1551, 0x6E63, 0x462F, 0x6E67, 0x0F19, 0x6E6B, 0x1554,
- 0x6E6E, 0x154D, 0x6E6F, 0x0C6C, 0x6E72, 0x1550, 0x6E73, 0x4C29,
- 0x6E76, 0x1556, 0x6E7B, 0x4C2A, 0x6E7D, 0x4C2B, 0x6E7E, 0x0FF7,
- 0x6E7F, 0x08EA, 0x6E80, 0x0EAC, 0x6E82, 0x1560, 0x6E89, 0x4C2C,
- 0x6E8C, 0x0D42, 0x6E8F, 0x156C, 0x6E90, 0x076F, 0x6E93, 0x4631,
- 0x6E96, 0x096A, 0x6E98, 0x1562, 0x6E9C, 0x0F77, 0x6E9D, 0x07D4,
- 0x6E9F, 0x156F, 0x6EA2, 0x04B2, 0x6EA5, 0x156D, 0x6EA7, 0x4632,
- 0x6EAA, 0x1561, 0x6EAB, 0x340C, 0x6EAF, 0x1567, 0x6EB1, 0x422E,
- 0x6EB2, 0x1569, 0x6EB4, 0x4633, 0x6EB6, 0x0F39, 0x6EB7, 0x1564,
- 0x6EBA, 0x0C28, 0x6EBC, 0x4C2D, 0x6EBD, 0x1566, 0x6EBF, 0x2150,
- 0x6EC1, 0x422F, 0x6EC2, 0x156E, 0x6EC3, 0x4634, 0x6EC4, 0x1568,
- 0x6EC5, 0x0ED3, 0x6EC7, 0x397F, 0x6EC9, 0x1563, 0x6ECA, 0x3980,
- 0x6ECB, 0x08CE, 0x6ECC, 0x157B, 0x6ECE, 0x3981, 0x6ED1, 0x05C8,
- 0x6ED3, 0x1565, 0x6ED4, 0x156A, 0x6ED5, 0x156B, 0x6ED9, 0x3C38,
- 0x6EDA, 0x4C2E, 0x6EDB, 0x4C2F, 0x6EDD, 0x0B4C, 0x6EDE, 0x0B3A,
- 0x6EE6, 0x3C24, 0x6EEB, 0x4636, 0x6EEC, 0x1573, 0x6EEF, 0x1579,
- 0x6EF2, 0x1577, 0x6EF4, 0x0C23, 0x6EF7, 0x157E, 0x6EF8, 0x1574,
- 0x6EF9, 0x4637, 0x6EFB, 0x4638, 0x6EFD, 0x3982, 0x6EFE, 0x1575,
- 0x6EFF, 0x155D, 0x6F01, 0x0693, 0x6F02, 0x0DAC, 0x6F06, 0x08EB,
- 0x6F09, 0x0809, 0x6F0A, 0x4639, 0x6F0C, 0x463A, 0x6F0F, 0x0FD9,
- 0x6F10, 0x4230, 0x6F11, 0x1571, 0x6F13, 0x157D, 0x6F14, 0x050B,
- 0x6F15, 0x0AE8, 0x6F18, 0x463B, 0x6F1A, 0x3983, 0x6F20, 0x0D2F,
- 0x6F22, 0x05FD, 0x6F23, 0x0FC2, 0x6F25, 0x463C, 0x6F26, 0x4C30,
- 0x6F29, 0x4C31, 0x6F2A, 0x3984, 0x6F2B, 0x0EAD, 0x6F2C, 0x0BEE,
- 0x6F2F, 0x3985, 0x6F30, 0x4C32, 0x6F31, 0x1578, 0x6F32, 0x157A,
- 0x6F33, 0x3986, 0x6F35, 0x4635, 0x6F36, 0x463D, 0x6F38, 0x0AB4,
- 0x6F3C, 0x463E, 0x6F3E, 0x157C, 0x6F3F, 0x1576, 0x6F41, 0x1570,
- 0x6F45, 0x05FF, 0x6F51, 0x1E60, 0x6F52, 0x4640, 0x6F54, 0x073F,
- 0x6F57, 0x4641, 0x6F58, 0x158A, 0x6F59, 0x4231, 0x6F5A, 0x3987,
- 0x6F5B, 0x1585, 0x6F5C, 0x0A9C, 0x6F5E, 0x3988, 0x6F5F, 0x05C1,
- 0x6F60, 0x4642, 0x6F61, 0x4232, 0x6F62, 0x3989, 0x6F64, 0x096B,
- 0x6F66, 0x158E, 0x6F68, 0x4643, 0x6F6D, 0x1587, 0x6F6E, 0x0BC8,
- 0x6F6F, 0x1584, 0x6F70, 0x0BF5, 0x6F74, 0x15A7, 0x6F78, 0x1581,
- 0x6F7A, 0x1580, 0x6F7C, 0x1589, 0x6F7D, 0x398A, 0x6F7E, 0x4233,
- 0x6F80, 0x1583, 0x6F81, 0x1582, 0x6F82, 0x1588, 0x6F84, 0x0A45,
- 0x6F86, 0x157F, 0x6F87, 0x4C33, 0x6F88, 0x2151, 0x6F8B, 0x398B,
- 0x6F8C, 0x4234, 0x6F8D, 0x398C, 0x6F8E, 0x158B, 0x6F90, 0x4644,
- 0x6F91, 0x158C, 0x6F92, 0x398D, 0x6F94, 0x398E, 0x6F96, 0x4645,
- 0x6F97, 0x05FE, 0x6F98, 0x363C, 0x6F9A, 0x398F, 0x6F9D, 0x4C34,
- 0x6F9F, 0x4647, 0x6FA0, 0x4235, 0x6FA1, 0x1591, 0x6FA3, 0x1590,
- 0x6FA4, 0x1592, 0x6FA5, 0x4648, 0x6FA7, 0x3990, 0x6FA8, 0x3991,
- 0x6FAA, 0x1595, 0x6FAE, 0x4C35, 0x6FAF, 0x4649, 0x6FB1, 0x0C3D,
- 0x6FB3, 0x158F, 0x6FB5, 0x2152, 0x6FB6, 0x3992, 0x6FB7, 0x4C36,
- 0x6FB9, 0x1593, 0x6FBC, 0x4236, 0x6FBE, 0x4646, 0x6FC0, 0x0739,
- 0x6FC1, 0x0B59, 0x6FC2, 0x158D, 0x6FC3, 0x0CF1, 0x6FC6, 0x1594,
- 0x6FC7, 0x4237, 0x6FC8, 0x464B, 0x6FC9, 0x464C, 0x6FCA, 0x4238,
- 0x6FD4, 0x1599, 0x6FD5, 0x1597, 0x6FD8, 0x159A, 0x6FDA, 0x3993,
- 0x6FDB, 0x159D, 0x6FDE, 0x3994, 0x6FDF, 0x1596, 0x6FE0, 0x07FC,
- 0x6FE1, 0x0CDE, 0x6FE4, 0x1536, 0x6FE9, 0x464D, 0x6FEB, 0x0F5E,
- 0x6FEC, 0x1598, 0x6FEE, 0x159C, 0x6FEF, 0x0B55, 0x6FF0, 0x4239,
- 0x6FF1, 0x159B, 0x6FF3, 0x1586, 0x6FF5, 0x2153, 0x6FF6, 0x1BA4,
- 0x6FF9, 0x3C23, 0x6FFA, 0x15A0, 0x6FFC, 0x464F, 0x6FFE, 0x15A4,
- 0x7000, 0x4650, 0x7001, 0x15A2, 0x7005, 0x2154, 0x7006, 0x1E50,
- 0x7007, 0x2155, 0x7009, 0x159E, 0x700A, 0x4651, 0x700B, 0x159F,
- 0x700D, 0x4C37, 0x700F, 0x15A3, 0x7011, 0x15A1, 0x7015, 0x0DC0,
- 0x7018, 0x15A9, 0x701A, 0x15A6, 0x701B, 0x15A5, 0x701D, 0x15A8,
- 0x701E, 0x0CAC, 0x701F, 0x15AA, 0x7020, 0x4C38, 0x7023, 0x4652,
- 0x7026, 0x0BB3, 0x7027, 0x0B4D, 0x7028, 0x2156, 0x702C, 0x0A49,
- 0x7030, 0x15AB, 0x7032, 0x15AD, 0x7039, 0x3996, 0x703A, 0x4654,
- 0x703C, 0x3997, 0x703E, 0x15AC, 0x7043, 0x4655, 0x7047, 0x4656,
- 0x7049, 0x4C39, 0x704A, 0x4F52, 0x704B, 0x4657, 0x704C, 0x1572,
- 0x704E, 0x423A, 0x7051, 0x15AE, 0x7054, 0x3999, 0x7058, 0x0CBF,
- 0x705D, 0x399A, 0x705E, 0x399B, 0x7063, 0x15AF, 0x7064, 0x399C,
- 0x7065, 0x4659, 0x7069, 0x465A, 0x706B, 0x0550, 0x706C, 0x399D,
- 0x706E, 0x465B, 0x706F, 0x0C6E, 0x7070, 0x0583, 0x7075, 0x423B,
- 0x7076, 0x465C, 0x7078, 0x067E, 0x707C, 0x090A, 0x707D, 0x0842,
- 0x707E, 0x399E, 0x7081, 0x399F, 0x7085, 0x2157, 0x7086, 0x465D,
- 0x7089, 0x0FCD, 0x708A, 0x0A2C, 0x708E, 0x050C, 0x7092, 0x15B1,
- 0x7095, 0x39A0, 0x7097, 0x465E, 0x7098, 0x4C3A, 0x7099, 0x15B0,
- 0x709F, 0x4660, 0x70A4, 0x423C, 0x70AB, 0x2158, 0x70AC, 0x15B4,
- 0x70AD, 0x0B78, 0x70AE, 0x15B7, 0x70AF, 0x15B2, 0x70B0, 0x4C3B,
- 0x70B1, 0x4661, 0x70B3, 0x15B6, 0x70B7, 0x39A1, 0x70B8, 0x15B5,
- 0x70B9, 0x0C3A, 0x70BA, 0x049D, 0x70BB, 0x20AD, 0x70C8, 0x0FBD,
- 0x70CA, 0x4664, 0x70CB, 0x15B9, 0x70CF, 0x04CA, 0x70D1, 0x4665,
- 0x70D3, 0x39A2, 0x70D4, 0x39A3, 0x70D5, 0x4C3C, 0x70D6, 0x4C3D,
- 0x70D8, 0x39A4, 0x70D9, 0x15BB, 0x70DC, 0x39A5, 0x70DD, 0x15BA,
- 0x70DF, 0x15B8, 0x70E4, 0x423D, 0x70EC, 0x4663, 0x70F1, 0x15B3,
- 0x70F9, 0x0E51, 0x70FD, 0x15BD, 0x7103, 0x4666, 0x7104, 0x215A,
- 0x7106, 0x4667, 0x7107, 0x39A6, 0x7108, 0x4668, 0x7109, 0x15BC,
- 0x710C, 0x4669, 0x710F, 0x2159, 0x7114, 0x050D, 0x7119, 0x15BF,
- 0x711A, 0x0E02, 0x711C, 0x15BE, 0x711E, 0x423F, 0x7120, 0x39A7,
- 0x7121, 0x0EC1, 0x7126, 0x09AF, 0x712B, 0x423E, 0x712E, 0x4240,
- 0x712F, 0x466B, 0x7130, 0x1DDC, 0x7131, 0x39A8, 0x7136, 0x0AB5,
- 0x713C, 0x09AE, 0x7145, 0x4C3E, 0x7146, 0x215C, 0x7147, 0x215D,
- 0x7149, 0x0FC3, 0x714A, 0x39A9, 0x714C, 0x15C5, 0x714E, 0x0A9D,
- 0x7150, 0x466C, 0x7151, 0x4241, 0x7152, 0x39AA, 0x7153, 0x466D,
- 0x7155, 0x15C1, 0x7156, 0x15C6, 0x7159, 0x050E, 0x715C, 0x215B,
- 0x715E, 0x466E, 0x7160, 0x39AB, 0x7162, 0x15C4, 0x7164, 0x0D17,
- 0x7165, 0x15C0, 0x7166, 0x15C3, 0x7167, 0x09B0, 0x7168, 0x4242,
- 0x7169, 0x0D65, 0x716C, 0x15C7, 0x716E, 0x08FD, 0x7179, 0x39AC,
- 0x717D, 0x0A9E, 0x7180, 0x4671, 0x7184, 0x15CA, 0x7185, 0x4243,
- 0x7187, 0x4244, 0x7188, 0x15C2, 0x718A, 0x06FD, 0x718F, 0x15C8,
- 0x7192, 0x39AD, 0x7194, 0x0F3A, 0x7195, 0x15CB, 0x7196, 0x4670,
- 0x7199, 0x205D, 0x719B, 0x4672, 0x719F, 0x0959, 0x71A0, 0x4673,
- 0x71A2, 0x4674, 0x71A8, 0x15CC, 0x71AC, 0x15CD, 0x71AE, 0x4675,
- 0x71AF, 0x4676, 0x71B1, 0x0CE4, 0x71B2, 0x4C3F, 0x71B3, 0x3C25,
- 0x71B9, 0x15CF, 0x71BA, 0x4245, 0x71BE, 0x15D0, 0x71C1, 0x215F,
- 0x71C3, 0x0CE9, 0x71C4, 0x4246, 0x71C8, 0x0C6F, 0x71C9, 0x15D2,
- 0x71CB, 0x39AF, 0x71CE, 0x15D4, 0x71D0, 0x0F9D, 0x71D2, 0x15D1,
- 0x71D3, 0x39B0, 0x71D4, 0x15D3, 0x71D5, 0x050F, 0x71D6, 0x39B1,
- 0x71D7, 0x15CE, 0x71D9, 0x4678, 0x71DC, 0x4679, 0x71DF, 0x114E,
- 0x71E0, 0x15D5, 0x71E5, 0x0AE9, 0x71E6, 0x0886, 0x71E7, 0x15D7,
- 0x71EC, 0x15D6, 0x71ED, 0x09EA, 0x71EE, 0x10EE, 0x71F4, 0x4C40,
- 0x71F5, 0x15D8, 0x71F9, 0x15DA, 0x71FB, 0x15C9, 0x71FC, 0x15D9,
- 0x71FE, 0x2160, 0x71FF, 0x15DB, 0x7200, 0x39B2, 0x7206, 0x0D30,
- 0x7207, 0x467A, 0x720D, 0x15DC, 0x7210, 0x15DD, 0x7215, 0x4247,
- 0x7217, 0x4C41, 0x721B, 0x15DE, 0x721D, 0x39B3, 0x721F, 0x4C42,
- 0x7228, 0x15DF, 0x722A, 0x0BFA, 0x722B, 0x39B4, 0x722C, 0x15E1,
- 0x722D, 0x15E0, 0x7230, 0x15E2, 0x7232, 0x15E3, 0x7234, 0x467C,
- 0x7235, 0x090B, 0x7236, 0x0DD5, 0x7238, 0x39B5, 0x7239, 0x467D,
- 0x723A, 0x0EF8, 0x723B, 0x15E4, 0x723C, 0x15E5, 0x723D, 0x0AD8,
- 0x723E, 0x08D0, 0x723F, 0x15E6, 0x7240, 0x15E7, 0x7241, 0x39B6,
- 0x7242, 0x467E, 0x7243, 0x4C43, 0x7246, 0x15E8, 0x7247, 0x0E22,
- 0x7248, 0x0D5B, 0x724B, 0x15E9, 0x724C, 0x0D0D, 0x724F, 0x4C44,
- 0x7250, 0x4C45, 0x7252, 0x0BC9, 0x7253, 0x39B7, 0x7255, 0x39B8,
- 0x7256, 0x39B9, 0x7257, 0x467F, 0x7258, 0x15EA, 0x7259, 0x0567,
- 0x725A, 0x4C46, 0x725B, 0x0687, 0x725C, 0x39BA, 0x725D, 0x0ED2,
- 0x725F, 0x0EC2, 0x7260, 0x4C47, 0x7261, 0x0534, 0x7262, 0x0FDA,
- 0x7263, 0x4680, 0x7267, 0x0E80, 0x7268, 0x4C48, 0x7269, 0x0DFA,
- 0x726E, 0x4682, 0x726F, 0x4683, 0x7272, 0x0A5B, 0x7274, 0x15EB,
- 0x7277, 0x4C49, 0x7278, 0x4684, 0x7279, 0x0C9B, 0x727D, 0x0757,
- 0x727E, 0x15EC, 0x727F, 0x4685, 0x7280, 0x0844, 0x7281, 0x15EE,
- 0x7282, 0x15ED, 0x7284, 0x4C4A, 0x7287, 0x15EF, 0x728D, 0x39BB,
- 0x728E, 0x4686, 0x7292, 0x15F0, 0x7296, 0x15F1, 0x729B, 0x4249,
- 0x72A0, 0x0658, 0x72A2, 0x15F2, 0x72A7, 0x15F3, 0x72AC, 0x0758,
- 0x72AD, 0x39BC, 0x72AE, 0x4688, 0x72AF, 0x0D5C, 0x72B0, 0x4689,
- 0x72B1, 0x2161, 0x72B2, 0x15F5, 0x72B4, 0x39BD, 0x72B6, 0x09DD,
- 0x72B9, 0x15F4, 0x72BE, 0x2162, 0x72C0, 0x342B, 0x72C1, 0x468A,
- 0x72C2, 0x06B0, 0x72C3, 0x15F6, 0x72C4, 0x15F8, 0x72C6, 0x15F7,
- 0x72C7, 0x39BE, 0x72C9, 0x4C4B, 0x72CC, 0x468C, 0x72CE, 0x15F9,
- 0x72D0, 0x0785, 0x72D2, 0x15FA, 0x72D7, 0x06E1, 0x72D9, 0x0AC2,
- 0x72DB, 0x080F, 0x72E0, 0x15FC, 0x72E1, 0x15FD, 0x72E2, 0x15FB,
- 0x72E5, 0x4C4C, 0x72E9, 0x0919, 0x72EC, 0x0CA0, 0x72ED, 0x06B1,
- 0x72F3, 0x468F, 0x72F4, 0x4C4D, 0x72F7, 0x15FF, 0x72F8, 0x0B6A,
- 0x72F9, 0x15FE, 0x72FA, 0x4690, 0x72FB, 0x39BF, 0x72FC, 0x0FDB,
- 0x72FD, 0x0D18, 0x7302, 0x4C4E, 0x7304, 0x39C0, 0x7305, 0x39C1,
- 0x7307, 0x4691, 0x730A, 0x1602, 0x730B, 0x4C4F, 0x7312, 0x4692,
- 0x7316, 0x1604, 0x7317, 0x1601, 0x7318, 0x4693, 0x7319, 0x4694,
- 0x731B, 0x0EE0, 0x731C, 0x1603, 0x731D, 0x1605, 0x731E, 0x4C50,
- 0x731F, 0x0F8C, 0x7322, 0x4C51, 0x7324, 0x2163, 0x7325, 0x1609,
- 0x7327, 0x424B, 0x7328, 0x39C2, 0x7329, 0x1608, 0x732A, 0x0BB4,
- 0x732B, 0x0CE3, 0x732C, 0x4697, 0x732E, 0x0759, 0x732F, 0x1607,
- 0x7331, 0x39C3, 0x7333, 0x4698, 0x7334, 0x1606, 0x7336, 0x0F1B,
- 0x7337, 0x0F1C, 0x7339, 0x4696, 0x733A, 0x4C52, 0x733B, 0x4C53,
- 0x733D, 0x4699, 0x733E, 0x160A, 0x733F, 0x0510, 0x7343, 0x39C4,
- 0x7344, 0x0808, 0x7345, 0x08B0, 0x734D, 0x4C54, 0x734E, 0x160B,
- 0x734F, 0x160C, 0x7350, 0x424C, 0x7352, 0x469A, 0x7357, 0x160E,
- 0x7358, 0x4C55, 0x7363, 0x094D, 0x7366, 0x424D, 0x7367, 0x4C56,
- 0x7368, 0x1610, 0x736A, 0x160F, 0x736B, 0x469C, 0x736C, 0x39C5,
- 0x736E, 0x469E, 0x736F, 0x469F, 0x7370, 0x1611, 0x7371, 0x46A0,
- 0x7372, 0x05AB, 0x7375, 0x1613, 0x7377, 0x2165, 0x7378, 0x1612,
- 0x737A, 0x1615, 0x737B, 0x1614, 0x737C, 0x39C6, 0x7381, 0x46A1,
- 0x7383, 0x39C7, 0x7384, 0x0770, 0x7385, 0x39C8, 0x7386, 0x39C9,
- 0x7387, 0x0F70, 0x7389, 0x06C4, 0x738A, 0x46A2, 0x738B, 0x0526,
- 0x7394, 0x46A3, 0x7395, 0x39CA, 0x7396, 0x06E2, 0x7398, 0x46A4,
- 0x739C, 0x46A5, 0x739E, 0x39CB, 0x739F, 0x39CC, 0x73A0, 0x39CD,
- 0x73A2, 0x424E, 0x73A5, 0x46A6, 0x73A6, 0x39CE, 0x73A8, 0x3C3F,
- 0x73A9, 0x061D, 0x73AB, 0x39CF, 0x73B2, 0x0FB0, 0x73B3, 0x1617,
- 0x73B5, 0x39D0, 0x73B7, 0x39D1, 0x73B9, 0x46A7, 0x73BA, 0x35EA,
- 0x73BB, 0x1619, 0x73BC, 0x39D2, 0x73BD, 0x2166, 0x73BF, 0x46A8,
- 0x73C0, 0x161A, 0x73C2, 0x0551, 0x73C5, 0x46A9, 0x73C8, 0x1616,
- 0x73C9, 0x2167, 0x73CA, 0x0887, 0x73CB, 0x46AA, 0x73CD, 0x0BDD,
- 0x73CE, 0x1618, 0x73CF, 0x39D3, 0x73D2, 0x216A, 0x73D6, 0x2168,
- 0x73D9, 0x39D4, 0x73DE, 0x161D, 0x73E0, 0x091A, 0x73E1, 0x46AB,
- 0x73E3, 0x2169, 0x73E4, 0x3C39, 0x73E5, 0x161B, 0x73E7, 0x46AC,
- 0x73E9, 0x39D5, 0x73EA, 0x0714, 0x73ED, 0x0D5D, 0x73EE, 0x161C,
- 0x73F1, 0x1637, 0x73F4, 0x39D6, 0x73F5, 0x216C, 0x73F8, 0x1622,
- 0x73F9, 0x46AD, 0x73FA, 0x46AF, 0x73FD, 0x39D7, 0x73FE, 0x0771,
- 0x7401, 0x46B0, 0x7403, 0x067F, 0x7404, 0x39D8, 0x7405, 0x161F,
- 0x7406, 0x0F67, 0x7407, 0x216B, 0x7409, 0x0F78, 0x740A, 0x39D9,
- 0x7413, 0x46AE, 0x741A, 0x39DA, 0x741B, 0x39DB, 0x7421, 0x3C3A,
- 0x7422, 0x0B56, 0x7424, 0x39DC, 0x7425, 0x1621, 0x7426, 0x216D,
- 0x7428, 0x39DD, 0x7429, 0x216F, 0x742A, 0x216E, 0x742B, 0x424F,
- 0x742C, 0x39DE, 0x742E, 0x2170, 0x742F, 0x39DF, 0x7430, 0x39E0,
- 0x7431, 0x39E1, 0x7432, 0x1623, 0x7433, 0x0F9E, 0x7434, 0x06CF,
- 0x7435, 0x0D90, 0x7436, 0x0D00, 0x7439, 0x39E2, 0x743A, 0x1624,
- 0x743F, 0x1626, 0x7440, 0x46B2, 0x7441, 0x1629, 0x7443, 0x46B3,
- 0x7444, 0x39E3, 0x7446, 0x4250, 0x7447, 0x39E4, 0x744B, 0x39E5,
- 0x744D, 0x39E6, 0x7451, 0x39E7, 0x7452, 0x46B4, 0x7453, 0x46B1,
- 0x7455, 0x1625, 0x7457, 0x39E8, 0x7459, 0x1628, 0x745A, 0x079E,
- 0x745B, 0x04EF, 0x745C, 0x162A, 0x745D, 0x46B5, 0x745E, 0x0A36,
- 0x745F, 0x1627, 0x7460, 0x0FA4, 0x7462, 0x4251, 0x7463, 0x162D,
- 0x7464, 0x1D35, 0x7466, 0x39E9, 0x7469, 0x162B, 0x746A, 0x162E,
- 0x746B, 0x39EA, 0x746D, 0x4252, 0x746F, 0x1620, 0x7470, 0x162C,
- 0x7471, 0x39EB, 0x7472, 0x4C57, 0x7473, 0x082C, 0x7476, 0x162F,
- 0x747E, 0x1630, 0x7480, 0x39EC, 0x7481, 0x46B6, 0x7483, 0x0F68,
- 0x7485, 0x39ED, 0x7486, 0x39EE, 0x7487, 0x39EF, 0x7488, 0x46B7,
- 0x7489, 0x2172, 0x748B, 0x1631, 0x7490, 0x39F0, 0x7492, 0x46B9,
- 0x7497, 0x46BA, 0x7498, 0x39F1, 0x7499, 0x46BB, 0x749C, 0x39F2,
- 0x749E, 0x1632, 0x749F, 0x2173, 0x74A0, 0x39F3, 0x74A1, 0x46BC,
- 0x74A2, 0x161E, 0x74A3, 0x39F4, 0x74A5, 0x46BD, 0x74A6, 0x4253,
- 0x74A7, 0x1633, 0x74A8, 0x39F5, 0x74A9, 0x4254, 0x74AA, 0x46BE,
- 0x74AB, 0x39F6, 0x74AF, 0x4C58, 0x74B0, 0x0600, 0x74B5, 0x39F7,
- 0x74B9, 0x46BF, 0x74BA, 0x46C1, 0x74BB, 0x46C0, 0x74BD, 0x08D1,
- 0x74BF, 0x39F8, 0x74C8, 0x39F9, 0x74C9, 0x4255, 0x74CA, 0x1634,
- 0x74CF, 0x1635, 0x74D4, 0x1636, 0x74D6, 0x46C2, 0x74D8, 0x46C3,
- 0x74DA, 0x39FA, 0x74DC, 0x04DD, 0x74DE, 0x39FB, 0x74DF, 0x4C59,
- 0x74E0, 0x1638, 0x74E2, 0x0DAD, 0x74E3, 0x1639, 0x74E4, 0x4C5A,
- 0x74E6, 0x05E0, 0x74E7, 0x163A, 0x74E9, 0x163B, 0x74EB, 0x46C4,
- 0x74EE, 0x163C, 0x74EF, 0x3750, 0x74F0, 0x163E, 0x74F1, 0x163F,
- 0x74F2, 0x163D, 0x74F4, 0x4C5B, 0x74F6, 0x0DC5, 0x74F7, 0x1641,
- 0x74F8, 0x1640, 0x74FA, 0x46C6, 0x74FB, 0x4C5C, 0x74FF, 0x4256,
- 0x7501, 0x2174, 0x7503, 0x1643, 0x7504, 0x1642, 0x7505, 0x1644,
- 0x750C, 0x1645, 0x750D, 0x1647, 0x750E, 0x1646, 0x7511, 0x080B,
- 0x7513, 0x1649, 0x7515, 0x1648, 0x7516, 0x4C5D, 0x7517, 0x4257,
- 0x7518, 0x0601, 0x751A, 0x0A19, 0x751C, 0x0C36, 0x751E, 0x164A,
- 0x751F, 0x0A5C, 0x7520, 0x46C8, 0x7521, 0x4C5E, 0x7522, 0x35DE,
- 0x7523, 0x0888, 0x7524, 0x46C9, 0x7525, 0x051B, 0x7526, 0x164B,
- 0x7528, 0x0F3B, 0x752A, 0x46CA, 0x752B, 0x0E33, 0x752C, 0x164C,
- 0x752F, 0x20F2, 0x7530, 0x0C3E, 0x7531, 0x0F1D, 0x7532, 0x07D5,
- 0x7533, 0x0A03, 0x7537, 0x0B89, 0x7538, 0x10C9, 0x753A, 0x0BCA,
- 0x753B, 0x0568, 0x753C, 0x164D, 0x753D, 0x46CD, 0x753E, 0x46CE,
- 0x753F, 0x4C5F, 0x7540, 0x46CF, 0x7544, 0x164E, 0x7546, 0x1653,
- 0x7548, 0x46D0, 0x7549, 0x1651, 0x754A, 0x1650, 0x754B, 0x13C7,
- 0x754C, 0x0584, 0x754D, 0x164F, 0x754E, 0x39FC, 0x754F, 0x049E,
- 0x7550, 0x46D1, 0x7551, 0x0D3E, 0x7552, 0x46D2, 0x7554, 0x0D5E,
- 0x7559, 0x0F79, 0x755A, 0x1654, 0x755B, 0x1652, 0x755C, 0x0B9A,
- 0x755D, 0x0A4A, 0x755E, 0x4C60, 0x7560, 0x0D3F, 0x7562, 0x0D9F,
- 0x7564, 0x1656, 0x7565, 0x0F74, 0x7566, 0x0723, 0x7567, 0x1657,
- 0x7569, 0x1655, 0x756A, 0x0D6A, 0x756B, 0x1658, 0x756C, 0x3C3B,
- 0x756D, 0x1659, 0x756F, 0x2175, 0x7570, 0x049F, 0x7571, 0x46D4,
- 0x7572, 0x46D3, 0x7573, 0x09DE, 0x7574, 0x165E, 0x7575, 0x3751,
- 0x7576, 0x165B, 0x7577, 0x0CC5, 0x7578, 0x165A, 0x7579, 0x39FD,
- 0x757A, 0x46D5, 0x757D, 0x46D6, 0x757E, 0x46D7, 0x757F, 0x0640,
- 0x7581, 0x39FE, 0x7582, 0x1661, 0x7586, 0x165C, 0x7587, 0x165D,
- 0x7589, 0x1660, 0x758A, 0x165F, 0x758B, 0x0D97, 0x758C, 0x46D8,
- 0x758E, 0x0AC4, 0x758F, 0x0AC3, 0x7590, 0x39FF, 0x7591, 0x0659,
- 0x7592, 0x3A00, 0x7593, 0x3A01, 0x7594, 0x1662, 0x7599, 0x4C61,
- 0x759A, 0x1663, 0x759D, 0x1664, 0x75A2, 0x46DA, 0x75A3, 0x1666,
- 0x75A4, 0x4C62, 0x75A5, 0x1665, 0x75AB, 0x04F8, 0x75B0, 0x46DC,
- 0x75B1, 0x166E, 0x75B2, 0x0D7C, 0x75B3, 0x1668, 0x75B4, 0x3A02,
- 0x75B5, 0x166A, 0x75B7, 0x46DD, 0x75B8, 0x166C, 0x75B9, 0x0A04,
- 0x75BC, 0x166D, 0x75BD, 0x166B, 0x75BE, 0x08EC, 0x75BF, 0x46DE,
- 0x75C0, 0x46DF, 0x75C1, 0x4C63, 0x75C2, 0x1667, 0x75C3, 0x1669,
- 0x75C4, 0x4C64, 0x75C5, 0x0DB4, 0x75C6, 0x46E0, 0x75C7, 0x09B1,
- 0x75CA, 0x1670, 0x75CC, 0x4C65, 0x75CD, 0x166F, 0x75CE, 0x4259,
- 0x75CF, 0x46E1, 0x75D2, 0x1671, 0x75D3, 0x46E2, 0x75D4, 0x08D2,
- 0x75D5, 0x081F, 0x75D7, 0x4C66, 0x75D8, 0x0C71, 0x75D9, 0x1672,
- 0x75DB, 0x0BE7, 0x75DC, 0x4C67, 0x75DD, 0x46E3, 0x75DE, 0x1674,
- 0x75DF, 0x46E4, 0x75E0, 0x46E5, 0x75E1, 0x4C68, 0x75E2, 0x0F69,
- 0x75E3, 0x1673, 0x75E4, 0x3A03, 0x75E7, 0x46E6, 0x75E9, 0x0AEB,
- 0x75EC, 0x3752, 0x75EE, 0x46E7, 0x75EF, 0x4C69, 0x75F0, 0x1679,
- 0x75F1, 0x46E8, 0x75F2, 0x167B, 0x75F3, 0x167C, 0x75F4, 0x0B92,
- 0x75F9, 0x3A04, 0x75FA, 0x167A, 0x75FC, 0x1677, 0x75FE, 0x1675,
- 0x75FF, 0x1676, 0x7600, 0x3A05, 0x7601, 0x1678, 0x7602, 0x425A,
- 0x7603, 0x46E9, 0x7604, 0x4C6A, 0x7607, 0x46EB, 0x7608, 0x425B,
- 0x7609, 0x167F, 0x760A, 0x3A06, 0x760B, 0x167D, 0x760C, 0x4C6B,
- 0x760D, 0x167E, 0x760F, 0x46EC, 0x7613, 0x46EF, 0x7615, 0x3A07,
- 0x7616, 0x3A08, 0x7618, 0x46EA, 0x7619, 0x3A09, 0x761B, 0x46F0,
- 0x761C, 0x46F1, 0x761D, 0x4C6C, 0x761E, 0x3A0A, 0x761F, 0x1680,
- 0x7620, 0x1682, 0x7621, 0x1683, 0x7622, 0x1684, 0x7624, 0x1685,
- 0x7625, 0x46F3, 0x7626, 0x3645, 0x7627, 0x1681, 0x7628, 0x46F4,
- 0x762D, 0x3A0B, 0x7630, 0x1687, 0x7632, 0x4C6D, 0x7633, 0x46F6,
- 0x7634, 0x1686, 0x7635, 0x3A0C, 0x7638, 0x4C6E, 0x763B, 0x1688,
- 0x763C, 0x46F5, 0x7641, 0x46F9, 0x7642, 0x0F8D, 0x7643, 0x3A0D,
- 0x7645, 0x4C6F, 0x7646, 0x168B, 0x7647, 0x1689, 0x7648, 0x168A,
- 0x7649, 0x46FB, 0x764A, 0x4C70, 0x764B, 0x3A0E, 0x764C, 0x061E,
- 0x764E, 0x3753, 0x7652, 0x0F0A, 0x7655, 0x46FC, 0x7656, 0x0E1A,
- 0x7658, 0x168D, 0x765C, 0x168C, 0x765F, 0x4C71, 0x7661, 0x168E,
- 0x7662, 0x168F, 0x7664, 0x425C, 0x7665, 0x3A0F, 0x7667, 0x1693,
- 0x7668, 0x1690, 0x7669, 0x1691, 0x766A, 0x1692, 0x766C, 0x1694,
- 0x766D, 0x3A10, 0x766E, 0x46FE, 0x766F, 0x3A11, 0x7670, 0x1695,
- 0x7671, 0x3A12, 0x7672, 0x1696, 0x7674, 0x3A13, 0x7676, 0x1697,
- 0x7678, 0x1698, 0x767A, 0x0D43, 0x767B, 0x0C4A, 0x767C, 0x1699,
- 0x767D, 0x0D28, 0x767E, 0x0DA6, 0x7680, 0x169A, 0x7681, 0x425D,
- 0x7682, 0x2176, 0x7683, 0x169B, 0x7684, 0x0C24, 0x7686, 0x0585,
- 0x7687, 0x07D6, 0x7688, 0x169C, 0x768B, 0x169D, 0x768E, 0x169E,
- 0x7690, 0x0877, 0x7693, 0x16A0, 0x7695, 0x46FF, 0x7696, 0x169F,
- 0x7699, 0x16A1, 0x769A, 0x16A2, 0x769B, 0x2179, 0x769C, 0x2177,
- 0x769D, 0x425E, 0x769E, 0x2178, 0x76A0, 0x4701, 0x76A1, 0x4700,
- 0x76A4, 0x3A14, 0x76A5, 0x3A15, 0x76A6, 0x217A, 0x76A7, 0x4702,
- 0x76A8, 0x4703, 0x76AA, 0x425F, 0x76AD, 0x4C72, 0x76AE, 0x0D7D,
- 0x76AF, 0x4704, 0x76B0, 0x16A3, 0x76B4, 0x16A4, 0x76B6, 0x4260,
- 0x76B7, 0x1D1C, 0x76B8, 0x16A5, 0x76B9, 0x16A6, 0x76BA, 0x16A7,
- 0x76BD, 0x4C73, 0x76BF, 0x087C, 0x76C2, 0x16A8, 0x76C3, 0x0D0C,
- 0x76C5, 0x3A16, 0x76C6, 0x0E8D, 0x76C8, 0x04F0, 0x76C9, 0x4706,
- 0x76CA, 0x04F9, 0x76CC, 0x3A17, 0x76CD, 0x16A9, 0x76CE, 0x4261,
- 0x76D2, 0x16AB, 0x76D4, 0x4262, 0x76D6, 0x16AA, 0x76D7, 0x0C6A,
- 0x76D9, 0x4C74, 0x76DB, 0x0A5D, 0x76DC, 0x14D8, 0x76DE, 0x16AC,
- 0x76DF, 0x0ECD, 0x76E1, 0x16AD, 0x76E3, 0x0602, 0x76E4, 0x0D6B,
- 0x76E5, 0x16AE, 0x76E6, 0x4263, 0x76E7, 0x16AF, 0x76E8, 0x4708,
- 0x76EA, 0x16B0, 0x76EB, 0x4C75, 0x76EC, 0x3A18, 0x76EE, 0x0EE8,
- 0x76F0, 0x4C76, 0x76F1, 0x4264, 0x76F2, 0x0EE1, 0x76F4, 0x0BDA,
- 0x76F8, 0x0AEC, 0x76F9, 0x4C77, 0x76FB, 0x16B2, 0x76FC, 0x3A19,
- 0x76FE, 0x096C, 0x7700, 0x4C78, 0x7701, 0x09B2, 0x7704, 0x16B5,
- 0x7707, 0x16B4, 0x7708, 0x16B3, 0x7709, 0x0D91, 0x770A, 0x4265,
- 0x770B, 0x0603, 0x770C, 0x075D, 0x770E, 0x4C79, 0x7717, 0x470A,
- 0x7719, 0x4266, 0x771A, 0x470B, 0x771B, 0x16BB, 0x771E, 0x16B8,
- 0x771F, 0x0A05, 0x7720, 0x0EBE, 0x7722, 0x4C7A, 0x7724, 0x16B7,
- 0x7725, 0x16B9, 0x7726, 0x16BA, 0x7728, 0x4C7B, 0x7729, 0x16B6,
- 0x772D, 0x470C, 0x772F, 0x4C7C, 0x7734, 0x3A1A, 0x7735, 0x470D,
- 0x7736, 0x3A1B, 0x7737, 0x16BC, 0x7738, 0x16BD, 0x7739, 0x4C7D,
- 0x773A, 0x0BCB, 0x773C, 0x061F, 0x773E, 0x4C7E, 0x7740, 0x0BA3,
- 0x7745, 0x4C7F, 0x7746, 0x217C, 0x7747, 0x16BE, 0x774A, 0x4C80,
- 0x774D, 0x4267, 0x774E, 0x4268, 0x774F, 0x4C81, 0x7758, 0x4712,
- 0x775A, 0x16BF, 0x775B, 0x16C2, 0x775C, 0x3A1C, 0x775E, 0x4C82,
- 0x775F, 0x3A1D, 0x7760, 0x3A1E, 0x7761, 0x0A2D, 0x7762, 0x1EC5,
- 0x7763, 0x0C9C, 0x7764, 0x4C83, 0x7765, 0x16C3, 0x7766, 0x0E81,
- 0x7767, 0x4C84, 0x7768, 0x16C0, 0x776A, 0x3755, 0x776B, 0x16C1,
- 0x776C, 0x4C85, 0x7772, 0x3A1F, 0x7779, 0x16C6, 0x777A, 0x4269,
- 0x777C, 0x4714, 0x777D, 0x3A20, 0x777E, 0x16C5, 0x777F, 0x16C4,
- 0x7780, 0x426A, 0x7784, 0x4C86, 0x778B, 0x16C8, 0x778C, 0x4C87,
- 0x778D, 0x4C88, 0x778E, 0x16C7, 0x7791, 0x16C9, 0x7794, 0x426B,
- 0x7795, 0x3A21, 0x7796, 0x4C89, 0x779A, 0x4717, 0x779E, 0x16CB,
- 0x779F, 0x4718, 0x77A0, 0x16CA, 0x77A2, 0x4719, 0x77A4, 0x471A,
- 0x77A5, 0x0E1D, 0x77A7, 0x4C8A, 0x77A9, 0x3756, 0x77AA, 0x3A22,
- 0x77AC, 0x0960, 0x77AD, 0x0F8E, 0x77AF, 0x4C8B, 0x77B0, 0x16CC,
- 0x77B3, 0x0C8F, 0x77B6, 0x16CD, 0x77B7, 0x4C8C, 0x77B9, 0x16CE,
- 0x77BB, 0x16D2, 0x77BC, 0x16D0, 0x77BD, 0x16D1, 0x77BE, 0x4C8D,
- 0x77BF, 0x16CF, 0x77C7, 0x16D3, 0x77C9, 0x4C8E, 0x77CD, 0x16D4,
- 0x77D1, 0x4C8F, 0x77D7, 0x16D5, 0x77D9, 0x4C90, 0x77DA, 0x16D6,
- 0x77DB, 0x0EC3, 0x77DC, 0x16D7, 0x77DE, 0x471B, 0x77DF, 0x471C,
- 0x77E0, 0x426C, 0x77E2, 0x0EFC, 0x77E3, 0x16D8, 0x77E4, 0x471D,
- 0x77E5, 0x0B8C, 0x77E6, 0x3A23, 0x77E7, 0x0D20, 0x77E9, 0x06E3,
- 0x77EA, 0x471E, 0x77EC, 0x471F, 0x77ED, 0x0B79, 0x77EE, 0x16D9,
- 0x77EF, 0x06B2, 0x77F0, 0x3A24, 0x77F1, 0x4C91, 0x77F3, 0x0A74,
- 0x77F4, 0x3A25, 0x77FB, 0x4720, 0x77FC, 0x16DA, 0x7802, 0x082D,
- 0x7805, 0x4722, 0x7806, 0x3A26, 0x7809, 0x4723, 0x780C, 0x16DB,
- 0x780D, 0x4724, 0x7812, 0x16DC, 0x7814, 0x075A, 0x7815, 0x0845,
- 0x7819, 0x4725, 0x7820, 0x16DE, 0x7821, 0x217E, 0x7822, 0x3A27,
- 0x7825, 0x0C50, 0x7826, 0x0846, 0x7827, 0x0668, 0x782C, 0x4726,
- 0x782D, 0x3A28, 0x782E, 0x3A29, 0x7830, 0x3A2A, 0x7832, 0x0E52,
- 0x7834, 0x0D01, 0x7835, 0x3A2B, 0x7837, 0x4C92, 0x783A, 0x0C51,
- 0x783F, 0x07EE, 0x7843, 0x426E, 0x7845, 0x16E0, 0x7847, 0x4727,
- 0x784E, 0x217F, 0x784F, 0x341E, 0x7851, 0x3C3C, 0x785C, 0x4C93,
- 0x785D, 0x09B3, 0x7864, 0x2180, 0x7868, 0x3A2C, 0x786A, 0x4728,
- 0x786B, 0x0F7A, 0x786C, 0x07D7, 0x786E, 0x426F, 0x786F, 0x075B,
- 0x7872, 0x0D37, 0x7874, 0x16E2, 0x787A, 0x2181, 0x787C, 0x16E4,
- 0x787E, 0x4C94, 0x7881, 0x079F, 0x7886, 0x16E3, 0x7887, 0x0C12,
- 0x788A, 0x472A, 0x788C, 0x16E6, 0x788D, 0x0595, 0x788E, 0x16E1,
- 0x7891, 0x0D7E, 0x7893, 0x04D2, 0x7894, 0x472B, 0x7895, 0x085C,
- 0x7897, 0x0FF8, 0x7898, 0x4C95, 0x789A, 0x16E5, 0x789D, 0x472D,
- 0x789E, 0x3A2D, 0x789F, 0x472E, 0x78A1, 0x4C96, 0x78A3, 0x16E7,
- 0x78A4, 0x472C, 0x78A7, 0x0E1B, 0x78A9, 0x0A7D, 0x78AA, 0x16E9,
- 0x78AD, 0x4272, 0x78AF, 0x16EA, 0x78B0, 0x4270, 0x78B1, 0x4C97,
- 0x78B3, 0x4C98, 0x78B5, 0x16E8, 0x78BA, 0x05AC, 0x78BB, 0x472F,
- 0x78BC, 0x16F0, 0x78BE, 0x16EF, 0x78C1, 0x08D3, 0x78C5, 0x16F1,
- 0x78C6, 0x16EC, 0x78C8, 0x3A2E, 0x78C9, 0x4C99, 0x78CA, 0x16F2,
- 0x78CB, 0x16ED, 0x78CC, 0x3A2F, 0x78CE, 0x3A30, 0x78D0, 0x0D6C,
- 0x78D1, 0x16EB, 0x78D3, 0x4C9A, 0x78D4, 0x16EE, 0x78D5, 0x4730,
- 0x78DA, 0x16F5, 0x78E0, 0x3A32, 0x78E1, 0x3A33, 0x78E4, 0x3A31,
- 0x78E6, 0x4731, 0x78E7, 0x16F4, 0x78E8, 0x0E8F, 0x78EC, 0x16F3,
- 0x78EF, 0x04AF, 0x78F2, 0x3A34, 0x78F4, 0x16F7, 0x78F7, 0x3A35,
- 0x78F9, 0x4732, 0x78FA, 0x4733, 0x78FB, 0x3A36, 0x78FD, 0x16F6,
- 0x78FE, 0x4734, 0x7900, 0x4273, 0x7901, 0x09B4, 0x7907, 0x16F8,
- 0x790C, 0x4C9B, 0x790E, 0x0AC5, 0x7910, 0x4736, 0x7911, 0x16FA,
- 0x7912, 0x16F9, 0x7919, 0x16FB, 0x791B, 0x4737, 0x791C, 0x4274,
- 0x791F, 0x4C9C, 0x7925, 0x4738, 0x7926, 0x16DD, 0x7927, 0x4C9D,
- 0x7928, 0x4C9E, 0x792A, 0x16DF, 0x792B, 0x16FD, 0x792C, 0x16FC,
- 0x792E, 0x4275, 0x7930, 0x2182, 0x7931, 0x3A37, 0x7934, 0x4276,
- 0x793A, 0x08D4, 0x793B, 0x3A39, 0x793C, 0x0FB1, 0x793D, 0x3A3A,
- 0x793E, 0x08FE, 0x793F, 0x4C9F, 0x7940, 0x16FE, 0x7941, 0x070D,
- 0x7942, 0x4CA0, 0x7945, 0x3A3B, 0x7946, 0x4277, 0x7947, 0x065A,
- 0x7948, 0x0641, 0x7949, 0x08B1, 0x794A, 0x4739, 0x7950, 0x0F1E,
- 0x7953, 0x1704, 0x7954, 0x4CA1, 0x7955, 0x1703, 0x7956, 0x0AC6,
- 0x7957, 0x1700, 0x7958, 0x473A, 0x795A, 0x1702, 0x795B, 0x3A3C,
- 0x795C, 0x3A3D, 0x795D, 0x0955, 0x795E, 0x0A06, 0x795F, 0x1701,
- 0x7960, 0x16FF, 0x7962, 0x0CE0, 0x7965, 0x09B5, 0x7967, 0x473C,
- 0x7968, 0x0DAE, 0x796B, 0x4CA2, 0x796D, 0x0847, 0x7972, 0x473D,
- 0x7977, 0x0C72, 0x7979, 0x4278, 0x797A, 0x1705, 0x797C, 0x4CA3,
- 0x797F, 0x1706, 0x7980, 0x171C, 0x7981, 0x06D0, 0x7984, 0x0FE3,
- 0x7985, 0x0AB7, 0x798A, 0x1707, 0x798B, 0x3A3E, 0x798D, 0x0552,
- 0x798E, 0x0C13, 0x798F, 0x0DF1, 0x7994, 0x2186, 0x7995, 0x473E,
- 0x7996, 0x3A3F, 0x7998, 0x3A40, 0x799B, 0x2188, 0x799D, 0x1708,
- 0x79A1, 0x473F, 0x79A6, 0x0694, 0x79A7, 0x1709, 0x79A9, 0x4740,
- 0x79AA, 0x170B, 0x79AB, 0x4CA4, 0x79AE, 0x170C, 0x79B0, 0x0CDF,
- 0x79B1, 0x1E4E, 0x79B3, 0x170D, 0x79B4, 0x4741, 0x79B8, 0x3A41,
- 0x79B9, 0x170E, 0x79BA, 0x170F, 0x79BB, 0x3A42, 0x79BD, 0x06D1,
- 0x79BE, 0x0553, 0x79BF, 0x0C9D, 0x79C0, 0x0932, 0x79C1, 0x08B2,
- 0x79C2, 0x4742, 0x79C4, 0x4CA5, 0x79C7, 0x4743, 0x79C8, 0x4279,
- 0x79C9, 0x1710, 0x79CA, 0x3A43, 0x79CB, 0x0933, 0x79CC, 0x4744,
- 0x79CD, 0x4745, 0x79D1, 0x054A, 0x79D2, 0x0DB5, 0x79D4, 0x427B,
- 0x79D5, 0x1711, 0x79D6, 0x4746, 0x79D8, 0x0D7F, 0x79DA, 0x3A44,
- 0x79DE, 0x427C, 0x79DF, 0x0AC7, 0x79E1, 0x1714, 0x79E3, 0x1715,
- 0x79E4, 0x0D1F, 0x79E6, 0x0A07, 0x79E7, 0x1712, 0x79E9, 0x0B9F,
- 0x79EA, 0x4CA6, 0x79EB, 0x427D, 0x79EC, 0x1713, 0x79ED, 0x427E,
- 0x79F0, 0x09B6, 0x79FB, 0x04A0, 0x7A00, 0x0643, 0x7A02, 0x4CA7,
- 0x7A03, 0x3A45, 0x7A05, 0x3633, 0x7A08, 0x1716, 0x7A09, 0x3A46,
- 0x7A0A, 0x474B, 0x7A0B, 0x0C14, 0x7A0C, 0x4CA8, 0x7A0D, 0x1717,
- 0x7A0E, 0x0A6B, 0x7A11, 0x3A47, 0x7A14, 0x0EB9, 0x7A15, 0x474C,
- 0x7A17, 0x0D95, 0x7A18, 0x1718, 0x7A19, 0x1719, 0x7A1A, 0x0B93,
- 0x7A1B, 0x474D, 0x7A1C, 0x0F8F, 0x7A1E, 0x3A48, 0x7A1F, 0x171B,
- 0x7A20, 0x171A, 0x7A2D, 0x3A49, 0x7A2E, 0x091B, 0x7A30, 0x4CA9,
- 0x7A31, 0x171D, 0x7A32, 0x04B4, 0x7A37, 0x1720, 0x7A38, 0x474F,
- 0x7A39, 0x3A4A, 0x7A3A, 0x4CAA, 0x7A3B, 0x171E, 0x7A3C, 0x0554,
- 0x7A3D, 0x0724, 0x7A3E, 0x171F, 0x7A3F, 0x07D8, 0x7A40, 0x0804,
- 0x7A42, 0x0E36, 0x7A43, 0x1721, 0x7A44, 0x4CAB, 0x7A45, 0x3A4B,
- 0x7A46, 0x0E82, 0x7A47, 0x4750, 0x7A49, 0x1723, 0x7A4C, 0x3A4C,
- 0x7A4D, 0x0A75, 0x7A4E, 0x04F1, 0x7A4F, 0x053A, 0x7A50, 0x0470,
- 0x7A56, 0x4751, 0x7A57, 0x1722, 0x7A59, 0x4752, 0x7A5C, 0x4753,
- 0x7A5D, 0x3A4D, 0x7A5F, 0x4754, 0x7A60, 0x4F56, 0x7A61, 0x1724,
- 0x7A62, 0x1725, 0x7A63, 0x09DF, 0x7A67, 0x4755, 0x7A69, 0x1726,
- 0x7A6A, 0x4756, 0x7A6B, 0x05AD, 0x7A6D, 0x3A4F, 0x7A70, 0x1728,
- 0x7A74, 0x0740, 0x7A75, 0x4757, 0x7A76, 0x0680, 0x7A78, 0x3A50,
- 0x7A79, 0x1729, 0x7A7A, 0x06ED, 0x7A7D, 0x172A, 0x7A7F, 0x0AA0,
- 0x7A80, 0x4CAC, 0x7A81, 0x0CA5, 0x7A82, 0x4758, 0x7A83, 0x0A84,
- 0x7A84, 0x0865, 0x7A85, 0x427F, 0x7A86, 0x4CAD, 0x7A88, 0x172B,
- 0x7A8A, 0x4759, 0x7A90, 0x475A, 0x7A92, 0x0BA0, 0x7A93, 0x0AED,
- 0x7A94, 0x4CAE, 0x7A95, 0x172D, 0x7A96, 0x172F, 0x7A97, 0x172C,
- 0x7A98, 0x172E, 0x7A9F, 0x06F8, 0x7AA0, 0x3A51, 0x7AA3, 0x3A52,
- 0x7AA9, 0x1730, 0x7AAA, 0x06FC, 0x7AAC, 0x475B, 0x7AAE, 0x0681,
- 0x7AAF, 0x0F3C, 0x7AB0, 0x1732, 0x7AB3, 0x3A53, 0x7AB5, 0x4CAF,
- 0x7AB6, 0x1733, 0x7AB9, 0x475E, 0x7ABA, 0x04D0, 0x7ABB, 0x3A54,
- 0x7ABC, 0x3A55, 0x7ABD, 0x4CB0, 0x7ABE, 0x475F, 0x7ABF, 0x1736,
- 0x7AC3, 0x05D4, 0x7AC4, 0x1735, 0x7AC5, 0x1734, 0x7AC6, 0x3A56,
- 0x7AC7, 0x1738, 0x7AC8, 0x1731, 0x7ACA, 0x1739, 0x7ACB, 0x0F71,
- 0x7ACC, 0x4761, 0x7ACD, 0x173A, 0x7ACE, 0x4281, 0x7ACF, 0x173B,
- 0x7AD1, 0x2189, 0x7AD2, 0x11C5, 0x7AD3, 0x173D, 0x7AD5, 0x173C,
- 0x7AD9, 0x173E, 0x7ADA, 0x173F, 0x7ADC, 0x0F7D, 0x7ADD, 0x1740,
- 0x7ADF, 0x1C08, 0x7AE0, 0x09B7, 0x7AE1, 0x1741, 0x7AE2, 0x1742,
- 0x7AE3, 0x0961, 0x7AE5, 0x0C90, 0x7AE6, 0x1743, 0x7AE7, 0x218A,
- 0x7AE8, 0x4762, 0x7AEA, 0x0B66, 0x7AEB, 0x218C, 0x7AED, 0x1744,
- 0x7AEF, 0x0B7A, 0x7AF0, 0x1745, 0x7AF4, 0x4763, 0x7AF6, 0x069D,
- 0x7AF8, 0x1076, 0x7AF9, 0x0B9B, 0x7AFA, 0x08DF, 0x7AFD, 0x4282,
- 0x7AFE, 0x4CB1, 0x7AFF, 0x0604, 0x7B02, 0x1746, 0x7B04, 0x1753,
- 0x7B06, 0x1749, 0x7B07, 0x3A57, 0x7B08, 0x0682, 0x7B0A, 0x1748,
- 0x7B0B, 0x1755, 0x7B0F, 0x1747, 0x7B11, 0x09B8, 0x7B12, 0x4283,
- 0x7B14, 0x3A58, 0x7B18, 0x174B, 0x7B19, 0x174C, 0x7B1B, 0x0C25,
- 0x7B1E, 0x174D, 0x7B20, 0x05BC, 0x7B25, 0x0A20, 0x7B26, 0x0DD6,
- 0x7B27, 0x3A59, 0x7B28, 0x174F, 0x7B2A, 0x4768, 0x7B2B, 0x4CB2,
- 0x7B2C, 0x0B48, 0x7B2D, 0x4284, 0x7B2E, 0x4769, 0x7B2F, 0x476A,
- 0x7B31, 0x3A5A, 0x7B33, 0x174A, 0x7B35, 0x174E, 0x7B36, 0x1750,
- 0x7B39, 0x086B, 0x7B3B, 0x4285, 0x7B3D, 0x4767, 0x7B41, 0x476E,
- 0x7B45, 0x1757, 0x7B46, 0x0DA0, 0x7B47, 0x3A5B, 0x7B48, 0x0D3A,
- 0x7B49, 0x0C73, 0x7B4B, 0x06D2, 0x7B4C, 0x1756, 0x7B4D, 0x1754,
- 0x7B4E, 0x3A5C, 0x7B4F, 0x0D49, 0x7B50, 0x1751, 0x7B51, 0x0B9C,
- 0x7B52, 0x0C75, 0x7B53, 0x375D, 0x7B54, 0x0C74, 0x7B55, 0x4770,
- 0x7B56, 0x0866, 0x7B5D, 0x1769, 0x7B60, 0x3A5D, 0x7B64, 0x4772,
- 0x7B65, 0x1759, 0x7B66, 0x4773, 0x7B67, 0x175B, 0x7B69, 0x3A5E,
- 0x7B6C, 0x175E, 0x7B6D, 0x3A5F, 0x7B6E, 0x175F, 0x7B6F, 0x4286,
- 0x7B70, 0x175C, 0x7B71, 0x175D, 0x7B72, 0x3A60, 0x7B73, 0x4774,
- 0x7B74, 0x175A, 0x7B75, 0x1758, 0x7B77, 0x4CB3, 0x7B79, 0x4771,
- 0x7B7A, 0x1752, 0x7B7F, 0x476D, 0x7B86, 0x0E1F, 0x7B87, 0x0555,
- 0x7B8B, 0x1766, 0x7B8D, 0x1763, 0x7B8F, 0x1768, 0x7B90, 0x4777,
- 0x7B91, 0x3A61, 0x7B92, 0x1767, 0x7B94, 0x0D29, 0x7B95, 0x0EB3,
- 0x7B97, 0x0889, 0x7B98, 0x1761, 0x7B99, 0x176A, 0x7B9A, 0x1765,
- 0x7B9B, 0x4778, 0x7B9C, 0x1764, 0x7B9D, 0x1760, 0x7B9E, 0x218D,
- 0x7B9F, 0x1762, 0x7BA0, 0x4CB4, 0x7BA1, 0x0605, 0x7BAA, 0x0B7B,
- 0x7BAC, 0x4CB5, 0x7BAD, 0x0AA1, 0x7BAF, 0x3A62, 0x7BB0, 0x4CB6,
- 0x7BB1, 0x0D36, 0x7BB4, 0x176F, 0x7BB5, 0x477A, 0x7BB8, 0x0D38,
- 0x7BBC, 0x477B, 0x7BC0, 0x0A85, 0x7BC1, 0x176C, 0x7BC4, 0x0D63,
- 0x7BC5, 0x477C, 0x7BC6, 0x1770, 0x7BC7, 0x0E23, 0x7BC9, 0x0B99,
- 0x7BCA, 0x477D, 0x7BCB, 0x176B, 0x7BCC, 0x176D, 0x7BCF, 0x176E,
- 0x7BD4, 0x4780, 0x7BD6, 0x4781, 0x7BD7, 0x3A63, 0x7BD9, 0x3A64,
- 0x7BDA, 0x4782, 0x7BDD, 0x1771, 0x7BE0, 0x08F0, 0x7BE4, 0x0C9E,
- 0x7BE5, 0x1776, 0x7BE6, 0x1775, 0x7BE8, 0x4CB7, 0x7BE9, 0x1772,
- 0x7BEA, 0x4783, 0x7BED, 0x0FDC, 0x7BF0, 0x4784, 0x7BF2, 0x4CB8,
- 0x7BF3, 0x177B, 0x7BF6, 0x177F, 0x7BF7, 0x177C, 0x7BF8, 0x4CB9,
- 0x7BFC, 0x4CBA, 0x7BFE, 0x4CBB, 0x7C00, 0x1778, 0x7C01, 0x4287,
- 0x7C03, 0x4785, 0x7C07, 0x1779, 0x7C09, 0x4CBC, 0x7C0B, 0x3A65,
- 0x7C0D, 0x177E, 0x7C0E, 0x4786, 0x7C0F, 0x3A66, 0x7C11, 0x1773,
- 0x7C12, 0x10EA, 0x7C13, 0x177A, 0x7C14, 0x1774, 0x7C17, 0x177D,
- 0x7C1E, 0x1E3B, 0x7C1F, 0x1783, 0x7C20, 0x3A67, 0x7C21, 0x0606,
- 0x7C23, 0x1780, 0x7C26, 0x3A68, 0x7C27, 0x1781, 0x7C28, 0x4CBD,
- 0x7C2A, 0x1782, 0x7C2B, 0x1785, 0x7C2F, 0x4CBE, 0x7C31, 0x3A69,
- 0x7C33, 0x4288, 0x7C36, 0x3A6A, 0x7C37, 0x1784, 0x7C38, 0x0D8A,
- 0x7C3D, 0x1786, 0x7C3E, 0x0FC4, 0x7C3F, 0x0E3D, 0x7C40, 0x178B,
- 0x7C42, 0x4CBF, 0x7C43, 0x1788, 0x7C45, 0x4787, 0x7C4A, 0x4788,
- 0x7C4C, 0x1787, 0x7C4D, 0x0A76, 0x7C4F, 0x178A, 0x7C50, 0x178C,
- 0x7C51, 0x3A6B, 0x7C52, 0x4CC0, 0x7C53, 0x4CC1, 0x7C54, 0x1789,
- 0x7C56, 0x1790, 0x7C57, 0x4789, 0x7C58, 0x178D, 0x7C59, 0x3A6C,
- 0x7C5B, 0x4CC2, 0x7C5C, 0x4CC3, 0x7C5D, 0x4CC4, 0x7C5E, 0x478A,
- 0x7C5F, 0x178E, 0x7C60, 0x1777, 0x7C61, 0x478B, 0x7C64, 0x178F,
- 0x7C65, 0x1791, 0x7C67, 0x3A6D, 0x7C69, 0x478C, 0x7C6C, 0x1792,
- 0x7C6D, 0x428A, 0x7C6E, 0x3A6E, 0x7C6F, 0x478D, 0x7C70, 0x3A6F,
- 0x7C72, 0x4CC5, 0x7C73, 0x0E16, 0x7C75, 0x1793, 0x7C79, 0x428B,
- 0x7C7B, 0x370E, 0x7C7D, 0x4CC6, 0x7C7E, 0x0EEE, 0x7C81, 0x06C6,
- 0x7C82, 0x06FF, 0x7C83, 0x1794, 0x7C87, 0x4CC7, 0x7C89, 0x0E04,
- 0x7C8B, 0x0A2E, 0x7C8D, 0x0EBC, 0x7C8F, 0x428C, 0x7C90, 0x1795,
- 0x7C92, 0x0F7B, 0x7C94, 0x428D, 0x7C95, 0x0D2A, 0x7C97, 0x0AC8,
- 0x7C98, 0x0CEA, 0x7C9B, 0x0957, 0x7C9E, 0x4CC8, 0x7C9F, 0x0484,
- 0x7CA0, 0x428E, 0x7CA1, 0x179A, 0x7CA2, 0x1798, 0x7CA4, 0x1796,
- 0x7CA5, 0x05DD, 0x7CA6, 0x4791, 0x7CA7, 0x09B9, 0x7CA8, 0x179B,
- 0x7CAB, 0x1799, 0x7CAD, 0x1797, 0x7CAE, 0x179F, 0x7CB1, 0x179E,
- 0x7CB2, 0x179D, 0x7CB3, 0x179C, 0x7CB6, 0x4793, 0x7CB7, 0x4794,
- 0x7CB9, 0x17A0, 0x7CBA, 0x4CC9, 0x7CBC, 0x3A70, 0x7CBD, 0x17A1,
- 0x7CBE, 0x0A5E, 0x7CBF, 0x3A71, 0x7CC0, 0x17A2, 0x7CC2, 0x17A4,
- 0x7CC4, 0x4796, 0x7CC5, 0x17A3, 0x7CC7, 0x4CCA, 0x7CC8, 0x3A72,
- 0x7CC9, 0x3A73, 0x7CCA, 0x0786, 0x7CCD, 0x4798, 0x7CCE, 0x0ABA,
- 0x7CD2, 0x17A6, 0x7CD3, 0x4CCB, 0x7CD5, 0x428F, 0x7CD6, 0x0C76,
- 0x7CD7, 0x3A74, 0x7CD8, 0x17A5, 0x7CD9, 0x3A75, 0x7CDA, 0x4CCC,
- 0x7CDC, 0x17A7, 0x7CDD, 0x3A76, 0x7CDE, 0x0E05, 0x7CDF, 0x0AEE,
- 0x7CE0, 0x07D9, 0x7CE2, 0x17A8, 0x7CE6, 0x479B, 0x7CE7, 0x0F90,
- 0x7CEB, 0x3A77, 0x7CEF, 0x17AA, 0x7CF2, 0x17AB, 0x7CF4, 0x17AC,
- 0x7CF5, 0x479D, 0x7CF6, 0x17AD, 0x7CF8, 0x08B3, 0x7CFA, 0x17AE,
- 0x7CFB, 0x0725, 0x7CFE, 0x0684, 0x7D00, 0x0644, 0x7D02, 0x17B0,
- 0x7D03, 0x479E, 0x7D04, 0x0EFF, 0x7D05, 0x07DA, 0x7D06, 0x17AF,
- 0x7D07, 0x3A78, 0x7D08, 0x3A79, 0x7D09, 0x3A7A, 0x7D0A, 0x17B3,
- 0x7D0B, 0x0EF2, 0x7D0D, 0x0CF2, 0x7D10, 0x0DA5, 0x7D12, 0x47A0,
- 0x7D13, 0x3A7B, 0x7D14, 0x096D, 0x7D15, 0x17B2, 0x7D17, 0x08FF,
- 0x7D18, 0x07DB, 0x7D19, 0x08B4, 0x7D1A, 0x0683, 0x7D1B, 0x0E06,
- 0x7D1C, 0x17B1, 0x7D1D, 0x3A7C, 0x7D1E, 0x47A1, 0x7D20, 0x0AC9,
- 0x7D21, 0x0E70, 0x7D22, 0x0867, 0x7D23, 0x3A7D, 0x7D2B, 0x08B5,
- 0x7D2C, 0x0BF9, 0x7D2E, 0x17B6, 0x7D2F, 0x0FA7, 0x7D30, 0x0849,
- 0x7D31, 0x4290, 0x7D32, 0x17B7, 0x7D33, 0x0A08, 0x7D35, 0x17B9,
- 0x7D39, 0x09BA, 0x7D3A, 0x0820, 0x7D3C, 0x4CCD, 0x7D3D, 0x47A4,
- 0x7D3E, 0x47A5, 0x7D3F, 0x17B8, 0x7D40, 0x47A6, 0x7D41, 0x3A7E,
- 0x7D42, 0x0934, 0x7D43, 0x0772, 0x7D44, 0x0ACA, 0x7D45, 0x17B4,
- 0x7D46, 0x17BA, 0x7D47, 0x47A7, 0x7D48, 0x218F, 0x7D4B, 0x17B5,
- 0x7D4C, 0x0726, 0x7D4D, 0x4CCE, 0x7D4E, 0x17BD, 0x7D4F, 0x17C1,
- 0x7D50, 0x0741, 0x7D53, 0x3A7F, 0x7D55, 0x363A, 0x7D56, 0x17BC,
- 0x7D59, 0x3A80, 0x7D5A, 0x47AB, 0x7D5B, 0x17C5, 0x7D5C, 0x4291,
- 0x7D5D, 0x3A81, 0x7D5E, 0x07DC, 0x7D61, 0x0F57, 0x7D62, 0x0480,
- 0x7D63, 0x17C2, 0x7D66, 0x0685, 0x7D68, 0x17BF, 0x7D6A, 0x47AC,
- 0x7D6E, 0x17C0, 0x7D70, 0x47AD, 0x7D71, 0x0C77, 0x7D72, 0x17BE,
- 0x7D73, 0x17BB, 0x7D75, 0x0586, 0x7D76, 0x0A88, 0x7D79, 0x075C,
- 0x7D7A, 0x3A82, 0x7D7D, 0x17C7, 0x7D7F, 0x47AF, 0x7D82, 0x4CCF,
- 0x7D83, 0x4292, 0x7D85, 0x4CD0, 0x7D86, 0x3A83, 0x7D88, 0x47B1,
- 0x7D89, 0x17C4, 0x7D8B, 0x3A84, 0x7D8C, 0x3A85, 0x7D8D, 0x4CD1,
- 0x7D8F, 0x17C6, 0x7D91, 0x4CD2, 0x7D93, 0x17C3, 0x7D97, 0x47B2,
- 0x7D99, 0x0727, 0x7D9A, 0x0B13, 0x7D9B, 0x17C8, 0x7D9C, 0x0AF0,
- 0x7D9D, 0x47B4, 0x7D9E, 0x4CD3, 0x7D9F, 0x17D5, 0x7DA0, 0x2192,
- 0x7DA2, 0x17D1, 0x7DA3, 0x17CB, 0x7DA6, 0x4293, 0x7DA7, 0x47B5,
- 0x7DAA, 0x47B6, 0x7DAB, 0x17CF, 0x7DAC, 0x0926, 0x7DAD, 0x04A1,
- 0x7DAE, 0x17CA, 0x7DAF, 0x17D2, 0x7DB0, 0x17D6, 0x7DB1, 0x07DD,
- 0x7DB2, 0x0EE2, 0x7DB3, 0x4CD4, 0x7DB4, 0x0BF2, 0x7DB5, 0x17CC,
- 0x7DB6, 0x47B7, 0x7DB7, 0x2191, 0x7DB8, 0x17D4, 0x7DB9, 0x4CD5,
- 0x7DBA, 0x17C9, 0x7DBB, 0x0B7C, 0x7DBD, 0x17CE, 0x7DBE, 0x0481,
- 0x7DBF, 0x0ED6, 0x7DC0, 0x47B8, 0x7DC2, 0x4294, 0x7DC7, 0x17CD,
- 0x7DCA, 0x06D3, 0x7DCB, 0x0D80, 0x7DCC, 0x3A86, 0x7DCF, 0x0AEF,
- 0x7DD0, 0x4CD6, 0x7DD1, 0x0F98, 0x7DD2, 0x0979, 0x7DD5, 0x17FD,
- 0x7DD6, 0x2193, 0x7DD7, 0x47B9, 0x7DD8, 0x17D7, 0x7DD9, 0x47BA,
- 0x7DDA, 0x0AA2, 0x7DDC, 0x17D3, 0x7DDD, 0x17D8, 0x7DDE, 0x17DA,
- 0x7DE0, 0x0C15, 0x7DE1, 0x17DD, 0x7DE3, 0x340A, 0x7DE4, 0x17D9,
- 0x7DE5, 0x4CD7, 0x7DE6, 0x47BB, 0x7DE8, 0x0E24, 0x7DE9, 0x0607,
- 0x7DEB, 0x3A87, 0x7DEC, 0x0ED7, 0x7DEF, 0x04A2, 0x7DF1, 0x3A88,
- 0x7DF2, 0x17DC, 0x7DF4, 0x0FC5, 0x7DF5, 0x4CD8, 0x7DF6, 0x4CD9,
- 0x7DF9, 0x3A89, 0x7DFB, 0x17DB, 0x7E01, 0x0511, 0x7E04, 0x0CC4,
- 0x7E05, 0x17DE, 0x7E08, 0x3A8A, 0x7E09, 0x17E5, 0x7E0A, 0x17DF,
- 0x7E0B, 0x17E6, 0x7E10, 0x47BF, 0x7E11, 0x3A8B, 0x7E12, 0x17E2,
- 0x7E15, 0x3A8C, 0x7E17, 0x47C0, 0x7E1B, 0x0D31, 0x7E1D, 0x47C1,
- 0x7E1E, 0x08F6, 0x7E1F, 0x17E4, 0x7E20, 0x3A8D, 0x7E21, 0x17E1,
- 0x7E22, 0x17E7, 0x7E23, 0x17E0, 0x7E26, 0x094E, 0x7E27, 0x47C2,
- 0x7E28, 0x4295, 0x7E2B, 0x0E53, 0x7E2C, 0x47C3, 0x7E2E, 0x0956,
- 0x7E2F, 0x4CDA, 0x7E31, 0x17E3, 0x7E32, 0x17EF, 0x7E35, 0x17EB,
- 0x7E36, 0x4CDB, 0x7E37, 0x17EE, 0x7E39, 0x17EC, 0x7E3A, 0x17F0,
- 0x7E3B, 0x17EA, 0x7E3D, 0x17D0, 0x7E3E, 0x0A77, 0x7E41, 0x0D5F,
- 0x7E43, 0x17ED, 0x7E44, 0x4CDC, 0x7E45, 0x47C4, 0x7E46, 0x17E8,
- 0x7E47, 0x3A8E, 0x7E48, 0x3767, 0x7E4A, 0x0AA3, 0x7E4B, 0x0728,
- 0x7E4D, 0x0935, 0x7E52, 0x2194, 0x7E54, 0x09EB, 0x7E55, 0x0AB8,
- 0x7E56, 0x17F3, 0x7E59, 0x17F5, 0x7E5A, 0x17F6, 0x7E5D, 0x17F2,
- 0x7E5E, 0x17F4, 0x7E61, 0x1E11, 0x7E62, 0x3A8F, 0x7E66, 0x17E9,
- 0x7E67, 0x17F1, 0x7E69, 0x17F9, 0x7E6A, 0x17F8, 0x7E6B, 0x1DF7,
- 0x7E6D, 0x0EA8, 0x7E6E, 0x3A90, 0x7E6F, 0x4CDD, 0x7E70, 0x0701,
- 0x7E73, 0x3A91, 0x7E75, 0x47C5, 0x7E78, 0x4CDE, 0x7E79, 0x17F7,
- 0x7E7B, 0x17FB, 0x7E7C, 0x17FA, 0x7E7D, 0x17FE, 0x7E7E, 0x47C6,
- 0x7E7F, 0x1800, 0x7E81, 0x4CDF, 0x7E82, 0x088A, 0x7E83, 0x17FC,
- 0x7E86, 0x47C7, 0x7E87, 0x47C8, 0x7E88, 0x1801, 0x7E89, 0x1802,
- 0x7E8A, 0x20A7, 0x7E8C, 0x1803, 0x7E8D, 0x3A92, 0x7E8E, 0x1809,
- 0x7E8F, 0x0C35, 0x7E90, 0x1805, 0x7E91, 0x3A93, 0x7E92, 0x1804,
- 0x7E93, 0x1806, 0x7E94, 0x1807, 0x7E96, 0x1808, 0x7E98, 0x3A94,
- 0x7E9A, 0x47CA, 0x7E9B, 0x180A, 0x7E9C, 0x180B, 0x7F36, 0x0608,
- 0x7F38, 0x180C, 0x7F3A, 0x180D, 0x7F3B, 0x47CD, 0x7F3C, 0x47CC,
- 0x7F3D, 0x4CE0, 0x7F3E, 0x47CE, 0x7F43, 0x47CF, 0x7F44, 0x3A95,
- 0x7F45, 0x180E, 0x7F47, 0x2195, 0x7F4C, 0x180F, 0x7F4D, 0x1810,
- 0x7F4E, 0x1811, 0x7F4F, 0x3A96, 0x7F50, 0x1812, 0x7F51, 0x1813,
- 0x7F52, 0x3A97, 0x7F53, 0x3A98, 0x7F54, 0x1815, 0x7F55, 0x1814,
- 0x7F58, 0x1816, 0x7F5B, 0x4CE1, 0x7F5D, 0x4CE2, 0x7F5F, 0x1817,
- 0x7F60, 0x1818, 0x7F61, 0x3A99, 0x7F63, 0x47D3, 0x7F64, 0x47D4,
- 0x7F65, 0x4CE3, 0x7F67, 0x181B, 0x7F68, 0x1819, 0x7F69, 0x181A,
- 0x7F6A, 0x0851, 0x7F6B, 0x0729, 0x7F6D, 0x47D5, 0x7F6E, 0x0B94,
- 0x7F70, 0x0D47, 0x7F71, 0x4CE4, 0x7F72, 0x097A, 0x7F75, 0x0D03,
- 0x7F77, 0x0D81, 0x7F78, 0x181C, 0x7F79, 0x1336, 0x7F7D, 0x47D6,
- 0x7F7E, 0x47D7, 0x7F7F, 0x4CE5, 0x7F80, 0x4CE6, 0x7F82, 0x181D,
- 0x7F83, 0x181F, 0x7F85, 0x0F4F, 0x7F86, 0x181E, 0x7F87, 0x1821,
- 0x7F88, 0x1820, 0x7F8A, 0x0F3D, 0x7F8B, 0x4CE7, 0x7F8C, 0x1822,
- 0x7F8E, 0x0D92, 0x7F90, 0x47D8, 0x7F91, 0x3A9A, 0x7F94, 0x1823,
- 0x7F96, 0x47DB, 0x7F97, 0x4296, 0x7F9A, 0x1826, 0x7F9C, 0x47DC,
- 0x7F9D, 0x1825, 0x7F9E, 0x1824, 0x7FA1, 0x2196, 0x7FA2, 0x4CE8,
- 0x7FA3, 0x1827, 0x7FA4, 0x0708, 0x7FA8, 0x0AA4, 0x7FA9, 0x065B,
- 0x7FAD, 0x47DD, 0x7FAE, 0x182B, 0x7FAF, 0x1828, 0x7FB2, 0x1829,
- 0x7FB6, 0x182C, 0x7FB8, 0x182D, 0x7FB9, 0x182A, 0x7FBD, 0x04CB,
- 0x7FBF, 0x3A9B, 0x7FC1, 0x0527, 0x7FC3, 0x47DF, 0x7FC5, 0x182F,
- 0x7FC6, 0x1830, 0x7FCA, 0x1831, 0x7FCC, 0x0F4C, 0x7FCE, 0x3A9C,
- 0x7FCF, 0x47E0, 0x7FD2, 0x0936, 0x7FD4, 0x1833, 0x7FD5, 0x1832,
- 0x7FDB, 0x4297, 0x7FDF, 0x3A9D, 0x7FE0, 0x0A2F, 0x7FE1, 0x1834,
- 0x7FE3, 0x47E1, 0x7FE5, 0x3A9E, 0x7FE6, 0x1835, 0x7FE9, 0x1836,
- 0x7FEB, 0x0621, 0x7FEC, 0x3A9F, 0x7FEE, 0x3AA0, 0x7FEF, 0x3AA1,
- 0x7FF0, 0x0609, 0x7FF2, 0x47E2, 0x7FF3, 0x1837, 0x7FF9, 0x1838,
- 0x7FFA, 0x3AA2, 0x7FFB, 0x0E8B, 0x7FFC, 0x0F4D, 0x7FFD, 0x4CE9,
- 0x7FFE, 0x4CEA, 0x7FFF, 0x4CEB, 0x8000, 0x0F3E, 0x8001, 0x0FDD,
- 0x8002, 0x3713, 0x8003, 0x07DF, 0x8004, 0x183B, 0x8005, 0x0900,
- 0x8006, 0x183A, 0x8007, 0x4CEC, 0x8008, 0x47E4, 0x800A, 0x47E3,
- 0x800B, 0x183C, 0x800C, 0x08D5, 0x800D, 0x4CED, 0x800E, 0x3AA3,
- 0x8010, 0x0B31, 0x8011, 0x3AA4, 0x8012, 0x183D, 0x8014, 0x3AA5,
- 0x8015, 0x07DE, 0x8016, 0x47E5, 0x8017, 0x0EE3, 0x8018, 0x183E,
- 0x8019, 0x183F, 0x801C, 0x1840, 0x801E, 0x4CEE, 0x8021, 0x1841,
- 0x8024, 0x3AA6, 0x8026, 0x3AA7, 0x8028, 0x1842, 0x802C, 0x47E6,
- 0x8030, 0x47E7, 0x8033, 0x08D6, 0x8035, 0x4298, 0x8036, 0x0EF9,
- 0x8037, 0x4299, 0x8039, 0x4CEF, 0x803A, 0x3AA8, 0x803B, 0x1844,
- 0x803C, 0x3AA9, 0x803D, 0x0B7D, 0x803F, 0x1843, 0x8043, 0x47E8,
- 0x8046, 0x1846, 0x804A, 0x1845, 0x8052, 0x1847, 0x8056, 0x0A5F,
- 0x8058, 0x1848, 0x805A, 0x1849, 0x805E, 0x0E09, 0x805F, 0x184A,
- 0x8060, 0x3AAA, 0x8061, 0x0AF1, 0x8062, 0x184B, 0x8066, 0x47E9,
- 0x8068, 0x184C, 0x806F, 0x0FC6, 0x8070, 0x184F, 0x8071, 0x3AAB,
- 0x8072, 0x184E, 0x8073, 0x184D, 0x8074, 0x0BCC, 0x8075, 0x3AAC,
- 0x8076, 0x1850, 0x8077, 0x09EC, 0x8079, 0x1851, 0x807B, 0x47EA,
- 0x807D, 0x1852, 0x807E, 0x0FDE, 0x807F, 0x1853, 0x8084, 0x1854,
- 0x8085, 0x1856, 0x8086, 0x1855, 0x8087, 0x0D39, 0x8088, 0x4CF0,
- 0x8089, 0x0CD1, 0x808B, 0x0FE4, 0x808C, 0x0D3D, 0x808E, 0x4CF1,
- 0x8093, 0x1858, 0x8096, 0x09BB, 0x8098, 0x0D9C, 0x8099, 0x47EB,
- 0x809A, 0x1859, 0x809B, 0x1857, 0x809C, 0x47EC, 0x809D, 0x060A,
- 0x809E, 0x3AAD, 0x80A1, 0x0788, 0x80A2, 0x08B6, 0x80A4, 0x47ED,
- 0x80A5, 0x0D82, 0x80A6, 0x3AAE, 0x80A7, 0x47EE, 0x80A9, 0x075E,
- 0x80AA, 0x0E71, 0x80AB, 0x3AAF, 0x80AC, 0x185C, 0x80AD, 0x185A,
- 0x80AF, 0x07E0, 0x80B1, 0x07E1, 0x80B2, 0x04AD, 0x80B4, 0x0858,
- 0x80B8, 0x47EF, 0x80BA, 0x0D0F, 0x80C3, 0x04A3, 0x80C4, 0x1861,
- 0x80C5, 0x47F1, 0x80C6, 0x0B7E, 0x80CA, 0x429A, 0x80CC, 0x0D0E,
- 0x80CE, 0x0B3B, 0x80CF, 0x4CF2, 0x80D4, 0x4CF3, 0x80D5, 0x47F2,
- 0x80D6, 0x1863, 0x80D7, 0x3AB0, 0x80D8, 0x3AB1, 0x80D9, 0x185F,
- 0x80DA, 0x1862, 0x80DB, 0x185D, 0x80DD, 0x1860, 0x80DE, 0x0E54,
- 0x80E0, 0x429B, 0x80E1, 0x0789, 0x80E4, 0x04C1, 0x80E5, 0x185E,
- 0x80E6, 0x47F3, 0x80ED, 0x4CF4, 0x80EF, 0x1865, 0x80F0, 0x4CF5,
- 0x80F1, 0x1866, 0x80F3, 0x429C, 0x80F4, 0x0C91, 0x80F5, 0x47F5,
- 0x80F7, 0x4CF6, 0x80F8, 0x06B3, 0x80FA, 0x4CF7, 0x80FB, 0x47F6,
- 0x80FC, 0x1871, 0x80FD, 0x0CF3, 0x80FE, 0x4CF8, 0x8102, 0x08B7,
- 0x8103, 0x4CF9, 0x8105, 0x06B4, 0x8106, 0x0A6C, 0x8107, 0x0FEC,
- 0x8108, 0x0EBA, 0x8109, 0x1864, 0x810A, 0x0A78, 0x810D, 0x47F4,
- 0x8116, 0x3AB2, 0x8117, 0x4CFA, 0x8118, 0x3AB3, 0x811A, 0x066D,
- 0x811B, 0x1867, 0x811E, 0x47F9, 0x8123, 0x1869, 0x8124, 0x47FB,
- 0x8127, 0x47FC, 0x8129, 0x1868, 0x812B, 0x3659, 0x812C, 0x47FD,
- 0x812F, 0x186A, 0x8130, 0x4CFB, 0x8131, 0x0B64, 0x8133, 0x0CF4,
- 0x8135, 0x47F8, 0x8139, 0x0BCD, 0x813A, 0x3AB4, 0x813D, 0x47FF,
- 0x813E, 0x186E, 0x8141, 0x3772, 0x8146, 0x186D, 0x814A, 0x3AB5,
- 0x814B, 0x186B, 0x814C, 0x3AB6, 0x814E, 0x0A1B, 0x8150, 0x0DD7,
- 0x8151, 0x1870, 0x8153, 0x186F, 0x8154, 0x07E2, 0x8155, 0x0FF9,
- 0x8157, 0x4CFC, 0x815F, 0x1880, 0x8160, 0x429D, 0x8165, 0x1874,
- 0x8166, 0x1875, 0x8167, 0x429E, 0x8168, 0x429F, 0x8169, 0x4801,
- 0x816B, 0x091C, 0x816D, 0x42A0, 0x816E, 0x1873, 0x816F, 0x4CFD,
- 0x8170, 0x080A, 0x8171, 0x1872, 0x8173, 0x4CFE, 0x8174, 0x1876,
- 0x8178, 0x0BCE, 0x8179, 0x0DF2, 0x817A, 0x0AA5, 0x817F, 0x0B3C,
- 0x8180, 0x187A, 0x8181, 0x3AB7, 0x8182, 0x187B, 0x8183, 0x1877,
- 0x8184, 0x3AB8, 0x8185, 0x4804, 0x8188, 0x1878, 0x818A, 0x1879,
- 0x818B, 0x4CFF, 0x818F, 0x07E3, 0x8190, 0x4D00, 0x8193, 0x1881,
- 0x8195, 0x187D, 0x8198, 0x4806, 0x819A, 0x0DD8, 0x819B, 0x4D01,
- 0x819C, 0x0E9A, 0x819D, 0x0D9A, 0x819E, 0x4D02, 0x81A0, 0x187C,
- 0x81A3, 0x187F, 0x81A4, 0x187E, 0x81A8, 0x0E72, 0x81A9, 0x1882,
- 0x81B0, 0x1883, 0x81B2, 0x4807, 0x81B3, 0x0AB9, 0x81B4, 0x3AB9,
- 0x81B5, 0x1884, 0x81B8, 0x1886, 0x81BA, 0x188A, 0x81BB, 0x42A1,
- 0x81BD, 0x1887, 0x81BE, 0x1885, 0x81BF, 0x0CF5, 0x81C0, 0x1888,
- 0x81C1, 0x4808, 0x81C2, 0x1889, 0x81C3, 0x4809, 0x81C6, 0x0532,
- 0x81C8, 0x1890, 0x81C9, 0x188B, 0x81CA, 0x42A2, 0x81CB, 0x4D03,
- 0x81CD, 0x188C, 0x81CF, 0x3ABA, 0x81D1, 0x188D, 0x81D3, 0x0B01,
- 0x81D5, 0x4D04, 0x81D6, 0x480A, 0x81D7, 0x42A3, 0x81D8, 0x188F,
- 0x81D9, 0x188E, 0x81DA, 0x1891, 0x81DB, 0x480B, 0x81DD, 0x4D05,
- 0x81DE, 0x4D06, 0x81DF, 0x1892, 0x81E0, 0x1893, 0x81E1, 0x4D07,
- 0x81E3, 0x0A09, 0x81E4, 0x480D, 0x81E5, 0x0569, 0x81E7, 0x1894,
- 0x81E8, 0x0F9F, 0x81EA, 0x08D7, 0x81EC, 0x480F, 0x81ED, 0x0937,
- 0x81EF, 0x4D08, 0x81F3, 0x08B8, 0x81F4, 0x0B95, 0x81F6, 0x4D09,
- 0x81F9, 0x3ABB, 0x81FA, 0x1895, 0x81FB, 0x1896, 0x81FC, 0x04D3,
- 0x81FD, 0x4810, 0x81FE, 0x1897, 0x81FF, 0x4811, 0x8200, 0x4D0A,
- 0x8201, 0x1898, 0x8202, 0x1899, 0x8203, 0x3ABC, 0x8204, 0x4813,
- 0x8205, 0x189A, 0x8207, 0x189B, 0x8208, 0x06B5, 0x8209, 0x13AF,
- 0x820A, 0x189C, 0x820B, 0x4D0B, 0x820C, 0x0A89, 0x820D, 0x189D,
- 0x820E, 0x08F7, 0x8210, 0x189E, 0x8212, 0x1009, 0x8213, 0x4D0C,
- 0x8214, 0x4D0D, 0x8216, 0x189F, 0x8217, 0x0E2E, 0x8218, 0x0618,
- 0x8219, 0x4815, 0x821A, 0x4D0E, 0x821B, 0x0AA6, 0x821C, 0x0962,
- 0x821E, 0x0DE3, 0x821F, 0x0938, 0x8221, 0x3ABD, 0x8222, 0x4816,
- 0x8229, 0x18A0, 0x822A, 0x07E4, 0x822B, 0x18A1, 0x822C, 0x0D60,
- 0x822E, 0x18AF, 0x8232, 0x3ABE, 0x8233, 0x18A3, 0x8234, 0x3ABF,
- 0x8235, 0x0B29, 0x8236, 0x0D2B, 0x8237, 0x0773, 0x8238, 0x18A2,
- 0x8239, 0x0AA7, 0x823A, 0x4D0F, 0x823C, 0x4818, 0x8240, 0x18A4,
- 0x8244, 0x4D10, 0x8245, 0x481A, 0x8246, 0x3AC0, 0x8247, 0x0C16,
- 0x8249, 0x4819, 0x824B, 0x3AC1, 0x824F, 0x3AC2, 0x8257, 0x481E,
- 0x8258, 0x18A6, 0x8259, 0x18A5, 0x825A, 0x18A8, 0x825C, 0x4820,
- 0x825D, 0x18A7, 0x825F, 0x18A9, 0x8260, 0x42A5, 0x8262, 0x18AB,
- 0x8263, 0x4821, 0x8264, 0x18AA, 0x8266, 0x060B, 0x8268, 0x18AC,
- 0x826A, 0x18AD, 0x826B, 0x18AE, 0x826D, 0x4D11, 0x826E, 0x0821,
- 0x826F, 0x0F91, 0x8271, 0x18B0, 0x8272, 0x09ED, 0x8274, 0x42A6,
- 0x8276, 0x0512, 0x8277, 0x18B1, 0x8278, 0x18B2, 0x8279, 0x3775,
- 0x827D, 0x4824, 0x827E, 0x18B3, 0x827F, 0x4825, 0x8283, 0x4826,
- 0x8284, 0x4D12, 0x8289, 0x4D13, 0x828A, 0x4827, 0x828B, 0x04B6,
- 0x828D, 0x18B4, 0x828E, 0x3AC3, 0x8291, 0x4D14, 0x8292, 0x18B5,
- 0x8293, 0x4828, 0x8299, 0x0DD9, 0x829D, 0x08F3, 0x829F, 0x18B7,
- 0x82A1, 0x42A8, 0x82A3, 0x42A9, 0x82A4, 0x42AA, 0x82A5, 0x0587,
- 0x82A6, 0x0476, 0x82A7, 0x4829, 0x82A8, 0x482A, 0x82A9, 0x42AB,
- 0x82AA, 0x4D15, 0x82AB, 0x18B6, 0x82AC, 0x18B9, 0x82AD, 0x0D04,
- 0x82AE, 0x3AC4, 0x82AF, 0x0A0A, 0x82B0, 0x4D16, 0x82B1, 0x0556,
- 0x82B2, 0x482B, 0x82B3, 0x0E55, 0x82B4, 0x482C, 0x82B7, 0x3AC5,
- 0x82B8, 0x0733, 0x82B9, 0x06D4, 0x82BA, 0x482D, 0x82BB, 0x18B8,
- 0x82BC, 0x482E, 0x82BD, 0x056A, 0x82BE, 0x3AC6, 0x82BF, 0x42AC,
- 0x82C5, 0x05DF, 0x82C6, 0x3AC7, 0x82D0, 0x4D17, 0x82D1, 0x0513,
- 0x82D2, 0x18BD, 0x82D3, 0x0FB2, 0x82D4, 0x0B3D, 0x82D5, 0x42AD,
- 0x82D7, 0x0DB6, 0x82D9, 0x18C9, 0x82DB, 0x0557, 0x82DC, 0x18C7,
- 0x82DE, 0x18C5, 0x82DF, 0x18BC, 0x82E1, 0x18BA, 0x82E2, 0x482F,
- 0x82E3, 0x18BB, 0x82E5, 0x090F, 0x82E6, 0x06E4, 0x82E7, 0x0BB5,
- 0x82E8, 0x4830, 0x82EA, 0x4D18, 0x82EB, 0x0CA9, 0x82EF, 0x4D19,
- 0x82F1, 0x04F3, 0x82F3, 0x18BF, 0x82F4, 0x18BE, 0x82F6, 0x4D1A,
- 0x82F7, 0x4831, 0x82F9, 0x18C4, 0x82FA, 0x18C0, 0x82FB, 0x18C3,
- 0x82FD, 0x42AE, 0x82FE, 0x3AC8, 0x8300, 0x42AF, 0x8301, 0x2198,
- 0x8302, 0x0EDC, 0x8303, 0x18C2, 0x8304, 0x0558, 0x8305, 0x05DB,
- 0x8306, 0x18C6, 0x8307, 0x4832, 0x8308, 0x4833, 0x8309, 0x18C8,
- 0x830C, 0x4834, 0x830E, 0x072A, 0x8316, 0x18CC, 0x8317, 0x18D5,
- 0x8318, 0x18D6, 0x831B, 0x4836, 0x831C, 0x046F, 0x831D, 0x4837,
- 0x8322, 0x42B0, 0x8323, 0x18DD, 0x8328, 0x04B5, 0x832B, 0x18D4,
- 0x832D, 0x42B1, 0x832F, 0x18D3, 0x8330, 0x4838, 0x8331, 0x18CE,
- 0x8332, 0x18CD, 0x8334, 0x18CB, 0x8335, 0x18CA, 0x8336, 0x0BA1,
- 0x8338, 0x0B5B, 0x8339, 0x18D0, 0x833A, 0x42B2, 0x833C, 0x4839,
- 0x8340, 0x18CF, 0x8343, 0x3AC9, 0x8344, 0x483A, 0x8345, 0x18D2,
- 0x8346, 0x1DF8, 0x8347, 0x42B3, 0x8349, 0x0AF2, 0x834A, 0x072B,
- 0x834F, 0x04E3, 0x8350, 0x18D1, 0x8351, 0x3ACA, 0x8352, 0x07E5,
- 0x8354, 0x4835, 0x8355, 0x3ACB, 0x8356, 0x4D1B, 0x8357, 0x483B,
- 0x8358, 0x0AF3, 0x835A, 0x377A, 0x8362, 0x2199, 0x8363, 0x456F,
- 0x8373, 0x18E3, 0x8375, 0x18E4, 0x8377, 0x0559, 0x8378, 0x4D1C,
- 0x837B, 0x052E, 0x837C, 0x18E1, 0x837D, 0x42B4, 0x837F, 0x219A,
- 0x8385, 0x18D7, 0x8386, 0x3ACC, 0x8387, 0x18DF, 0x8389, 0x18E6,
- 0x838A, 0x18E0, 0x838D, 0x3ACD, 0x838E, 0x18DE, 0x8392, 0x3ACE,
- 0x8393, 0x18C1, 0x8394, 0x483F, 0x8395, 0x4840, 0x8396, 0x18DC,
- 0x8398, 0x3ACF, 0x839A, 0x18D8, 0x839B, 0x4841, 0x839D, 0x4842,
- 0x839E, 0x060C, 0x839F, 0x18DA, 0x83A0, 0x18E5, 0x83A2, 0x18DB,
- 0x83A7, 0x42B5, 0x83A8, 0x18E7, 0x83A9, 0x3AD0, 0x83AA, 0x18D9,
- 0x83AB, 0x0D32, 0x83B1, 0x0F53, 0x83B5, 0x18E2, 0x83BD, 0x18F8,
- 0x83BF, 0x3AD1, 0x83C0, 0x3AD2, 0x83C1, 0x18F0, 0x83C5, 0x0A41,
- 0x83C7, 0x219B, 0x83C9, 0x4843, 0x83CA, 0x0660, 0x83CC, 0x06D5,
- 0x83CE, 0x18EB, 0x83CF, 0x42B6, 0x83D0, 0x4844, 0x83D1, 0x42B7,
- 0x83D3, 0x055B, 0x83D4, 0x4845, 0x83D6, 0x09BC, 0x83D8, 0x18EE,
- 0x83DC, 0x084A, 0x83DD, 0x4846, 0x83DF, 0x0C4B, 0x83E0, 0x18F3,
- 0x83E1, 0x42B8, 0x83E5, 0x4847, 0x83E9, 0x0E3E, 0x83EA, 0x3AD3,
- 0x83EB, 0x18EA, 0x83EF, 0x055A, 0x83F0, 0x078A, 0x83F1, 0x0D9B,
- 0x83F2, 0x18F4, 0x83F4, 0x18E8, 0x83F6, 0x219C, 0x83F7, 0x18F1,
- 0x83F8, 0x4D1D, 0x83F9, 0x4848, 0x83FB, 0x18FB, 0x83FC, 0x4D1E,
- 0x83FD, 0x18EC, 0x8401, 0x42B9, 0x8403, 0x18ED, 0x8404, 0x0C92,
- 0x8406, 0x42BA, 0x8407, 0x18F2, 0x840A, 0x1E7F, 0x840B, 0x18EF,
- 0x840C, 0x0E56, 0x840D, 0x18F5, 0x840E, 0x04A4, 0x840F, 0x3AD4,
- 0x8411, 0x3AD5, 0x8413, 0x18E9, 0x8415, 0x4849, 0x8417, 0x484B,
- 0x8420, 0x18F7, 0x8422, 0x18F6, 0x8429, 0x0D21, 0x842A, 0x18FD,
- 0x842C, 0x1908, 0x8431, 0x05DC, 0x8435, 0x190B, 0x8438, 0x18F9,
- 0x8439, 0x484C, 0x843C, 0x18FE, 0x843D, 0x0F58, 0x8446, 0x1907,
- 0x8448, 0x219D, 0x8449, 0x0F3F, 0x844A, 0x3AD6, 0x844E, 0x0F72,
- 0x844F, 0x484D, 0x8451, 0x484E, 0x8452, 0x484F, 0x8457, 0x0BB6,
- 0x8458, 0x4D1F, 0x8459, 0x4850, 0x845A, 0x4851, 0x845B, 0x05C9,
- 0x845C, 0x4852, 0x845F, 0x42BB, 0x8461, 0x0DE4, 0x8462, 0x190D,
- 0x8463, 0x0C79, 0x8465, 0x4854, 0x8466, 0x0475, 0x8469, 0x1906,
- 0x846B, 0x1902, 0x846C, 0x0AF4, 0x846D, 0x18FC, 0x846E, 0x1904,
- 0x846F, 0x1909, 0x8470, 0x42BC, 0x8471, 0x0CE2, 0x8473, 0x42BD,
- 0x8475, 0x046E, 0x8476, 0x3AD7, 0x8477, 0x1901, 0x8478, 0x4855,
- 0x8479, 0x190A, 0x847A, 0x0DEA, 0x847C, 0x4856, 0x8481, 0x4857,
- 0x8482, 0x1905, 0x8484, 0x1900, 0x8485, 0x42BE, 0x848B, 0x09BD,
- 0x8490, 0x0939, 0x8493, 0x4D20, 0x8494, 0x08D8, 0x8497, 0x4859,
- 0x8499, 0x0EE4, 0x849C, 0x0DB9, 0x849E, 0x42BF, 0x849F, 0x1910,
- 0x84A1, 0x1919, 0x84A6, 0x485A, 0x84A8, 0x3AD8, 0x84AD, 0x1903,
- 0x84AF, 0x3AD9, 0x84B1, 0x4D21, 0x84B2, 0x05D5, 0x84B4, 0x219E,
- 0x84B8, 0x09E0, 0x84B9, 0x190E, 0x84BA, 0x42C0, 0x84BB, 0x1913,
- 0x84BC, 0x0AF5, 0x84BD, 0x4D22, 0x84BE, 0x485B, 0x84BF, 0x190F,
- 0x84C0, 0x3ADA, 0x84C1, 0x1916, 0x84C2, 0x3ADB, 0x84C4, 0x0B9D,
- 0x84C6, 0x1917, 0x84C9, 0x0F40, 0x84CA, 0x190C, 0x84CB, 0x0596,
- 0x84CD, 0x1912, 0x84CE, 0x485D, 0x84CF, 0x485E, 0x84D0, 0x1915,
- 0x84D1, 0x0EB8, 0x84D3, 0x485F, 0x84D6, 0x1918, 0x84D9, 0x1911,
- 0x84DA, 0x1914, 0x84DC, 0x20AB, 0x84E7, 0x4861, 0x84EA, 0x4862,
- 0x84EC, 0x0E57, 0x84EE, 0x0FC7, 0x84EF, 0x4863, 0x84F0, 0x3ADC,
- 0x84F1, 0x4864, 0x84F4, 0x191C, 0x84FA, 0x4865, 0x84FB, 0x4D23,
- 0x84FC, 0x1923, 0x84FD, 0x3ADD, 0x84FF, 0x191B, 0x8500, 0x08EF,
- 0x8506, 0x18FA, 0x850C, 0x3ADE, 0x8511, 0x0E1E, 0x8513, 0x0EAE,
- 0x8514, 0x1922, 0x8515, 0x1921, 0x8517, 0x191D, 0x8518, 0x191E,
- 0x851A, 0x04D8, 0x851B, 0x4866, 0x851E, 0x42C3, 0x851F, 0x1920,
- 0x8521, 0x191A, 0x8523, 0x1E1A, 0x8524, 0x4867, 0x8525, 0x4868,
- 0x8526, 0x0BF1, 0x852B, 0x4869, 0x852C, 0x191F, 0x852D, 0x04C2,
- 0x852F, 0x42C4, 0x8532, 0x42C2, 0x8534, 0x3ADF, 0x8535, 0x0B02,
- 0x853D, 0x0E13, 0x853E, 0x1EB5, 0x8540, 0x1924, 0x8541, 0x1928,
- 0x8543, 0x0D6D, 0x8546, 0x4D24, 0x8548, 0x1927, 0x8549, 0x09BE,
- 0x854A, 0x08F5, 0x854B, 0x192A, 0x854E, 0x06B6, 0x854F, 0x486A,
- 0x8551, 0x486D, 0x8553, 0x219F, 0x8555, 0x192B, 0x8556, 0x4D25,
- 0x8557, 0x0DEB, 0x8558, 0x1926, 0x8559, 0x21A0, 0x855A, 0x18FF,
- 0x855D, 0x4D26, 0x855E, 0x3AE0, 0x8561, 0x486E, 0x8562, 0x486F,
- 0x8563, 0x1925, 0x8564, 0x42C5, 0x8568, 0x0FF5, 0x8569, 0x0C7A,
- 0x856A, 0x0DE5, 0x856B, 0x21A1, 0x856D, 0x1932, 0x856F, 0x486B,
- 0x8577, 0x1938, 0x857A, 0x42C6, 0x857B, 0x4871, 0x857D, 0x4872,
- 0x857E, 0x1939, 0x857F, 0x4873, 0x8580, 0x192C, 0x8581, 0x4874,
- 0x8584, 0x0D2C, 0x8585, 0x4D27, 0x8586, 0x4875, 0x8587, 0x1936,
- 0x8588, 0x192E, 0x858A, 0x1930, 0x858C, 0x42C7, 0x858F, 0x3AE1,
- 0x8590, 0x193A, 0x8591, 0x192F, 0x8593, 0x4876, 0x8594, 0x1933,
- 0x8597, 0x0514, 0x8598, 0x4D28, 0x8599, 0x0CBD, 0x859B, 0x1934,
- 0x859C, 0x1937, 0x859D, 0x4877, 0x859F, 0x4878, 0x85A2, 0x42C8,
- 0x85A4, 0x192D, 0x85A6, 0x0AA8, 0x85A8, 0x1931, 0x85A9, 0x0875,
- 0x85AA, 0x0A0B, 0x85AB, 0x0706, 0x85AC, 0x0F00, 0x85AD, 0x3AE4,
- 0x85AE, 0x0F05, 0x85AF, 0x097C, 0x85B0, 0x21A3, 0x85B7, 0x3AE2,
- 0x85B9, 0x193E, 0x85BA, 0x193C, 0x85BC, 0x487C, 0x85C1, 0x0FF4,
- 0x85C7, 0x487D, 0x85C9, 0x193B, 0x85CA, 0x487E, 0x85CB, 0x42C9,
- 0x85CD, 0x0F5F, 0x85CE, 0x3AE3, 0x85CF, 0x193D, 0x85D0, 0x193F,
- 0x85D5, 0x1940, 0x85D8, 0x487F, 0x85D9, 0x4880, 0x85DC, 0x1943,
- 0x85DD, 0x1941, 0x85DF, 0x4881, 0x85E1, 0x4882, 0x85E4, 0x0C7B,
- 0x85E5, 0x1942, 0x85E6, 0x4883, 0x85E9, 0x0D61, 0x85EA, 0x1935,
- 0x85ED, 0x42CA, 0x85F4, 0x3780, 0x85F6, 0x4884, 0x85F7, 0x097D,
- 0x85F9, 0x1944, 0x85FA, 0x1949, 0x85FB, 0x0AF6, 0x85FE, 0x1948,
- 0x85FF, 0x42CB, 0x8600, 0x4885, 0x8602, 0x1929, 0x8604, 0x42CC,
- 0x8605, 0x42CD, 0x8606, 0x194A, 0x8607, 0x0ACB, 0x860A, 0x1945,
- 0x860B, 0x1947, 0x8610, 0x42CE, 0x8611, 0x4886, 0x8612, 0x3AE5,
- 0x8613, 0x1946, 0x8616, 0x14D0, 0x8617, 0x14C1, 0x8618, 0x42D0,
- 0x861A, 0x194C, 0x861E, 0x4887, 0x8621, 0x4888, 0x8622, 0x194B,
- 0x8624, 0x4889, 0x8627, 0x488A, 0x8629, 0x3AE6, 0x862D, 0x0F60,
- 0x862F, 0x16B1, 0x8630, 0x194D, 0x8638, 0x42D1, 0x8639, 0x488C,
- 0x863C, 0x488D, 0x863F, 0x194E, 0x8640, 0x488F, 0x8641, 0x41B8,
- 0x8642, 0x4D29, 0x8646, 0x4D2A, 0x864D, 0x194F, 0x864E, 0x078B,
- 0x8650, 0x066E, 0x8652, 0x3AE7, 0x8653, 0x4890, 0x8654, 0x1951,
- 0x8655, 0x1094, 0x8656, 0x4891, 0x8657, 0x42D2, 0x865A, 0x068F,
- 0x865B, 0x3418, 0x865C, 0x0F82, 0x865E, 0x06EB, 0x865F, 0x1952,
- 0x8662, 0x42D3, 0x8663, 0x3AE8, 0x8667, 0x1953, 0x866B, 0x0BAC,
- 0x866C, 0x3AE9, 0x866F, 0x3AEA, 0x8671, 0x1954, 0x8675, 0x42D5,
- 0x8677, 0x4892, 0x8679, 0x0CD2, 0x867A, 0x3AEB, 0x867B, 0x047E,
- 0x867D, 0x3786, 0x8687, 0x4893, 0x8689, 0x4894, 0x868A, 0x0563,
- 0x868B, 0x1959, 0x868C, 0x195A, 0x868D, 0x3AEC, 0x8691, 0x3AED,
- 0x8693, 0x1955, 0x8695, 0x088B, 0x8698, 0x3AEE, 0x869C, 0x4895,
- 0x869D, 0x4896, 0x86A3, 0x1956, 0x86A4, 0x0CF8, 0x86A7, 0x3AEF,
- 0x86A8, 0x3AF0, 0x86A9, 0x1957, 0x86AA, 0x1958, 0x86AB, 0x1962,
- 0x86AF, 0x195C, 0x86B0, 0x195F, 0x86B1, 0x4897, 0x86B3, 0x4898,
- 0x86B6, 0x195B, 0x86B8, 0x42D6, 0x86C0, 0x4D2B, 0x86C1, 0x4899,
- 0x86C3, 0x489A, 0x86C4, 0x195D, 0x86C6, 0x195E, 0x86C7, 0x0904,
- 0x86C9, 0x1960, 0x86CB, 0x0B7F, 0x86CD, 0x072C, 0x86CE, 0x05A0,
- 0x86D1, 0x489B, 0x86D4, 0x1963, 0x86D5, 0x489C, 0x86D7, 0x489D,
- 0x86D9, 0x059D, 0x86DB, 0x1968, 0x86DE, 0x1964, 0x86DF, 0x1967,
- 0x86E3, 0x489E, 0x86E4, 0x0D4E, 0x86E6, 0x489F, 0x86E9, 0x1965,
- 0x86EC, 0x1966, 0x86ED, 0x0DBA, 0x86EE, 0x0D6E, 0x86EF, 0x1969,
- 0x86F8, 0x0B5D, 0x86F9, 0x1973, 0x86FA, 0x3AF1, 0x86FB, 0x196F,
- 0x86FC, 0x42D7, 0x86FD, 0x3AF2, 0x86FE, 0x056B, 0x8700, 0x196D,
- 0x8702, 0x0E58, 0x8703, 0x196E, 0x8705, 0x48A1, 0x8706, 0x196B,
- 0x8707, 0x48A2, 0x8708, 0x196C, 0x8709, 0x1971, 0x870A, 0x1974,
- 0x870B, 0x3AF3, 0x870D, 0x1972, 0x870E, 0x48A3, 0x8710, 0x48A4,
- 0x8711, 0x1970, 0x8712, 0x196A, 0x8713, 0x3AF4, 0x8714, 0x4D2C,
- 0x8718, 0x0B96, 0x8719, 0x3AF5, 0x871A, 0x197B, 0x871C, 0x0EB6,
- 0x871E, 0x3AF6, 0x871F, 0x48A5, 0x8721, 0x48A6, 0x8722, 0x4D2D,
- 0x8723, 0x48A7, 0x8725, 0x1979, 0x8728, 0x3AF7, 0x8729, 0x197A,
- 0x872E, 0x4D2E, 0x8731, 0x48A8, 0x8734, 0x1975, 0x8737, 0x1977,
- 0x8739, 0x4D2F, 0x873A, 0x48A9, 0x873B, 0x1978, 0x873E, 0x3AF8,
- 0x873F, 0x1976, 0x8740, 0x48AA, 0x8743, 0x48AB, 0x8749, 0x0A8A,
- 0x874B, 0x0FDF, 0x874C, 0x197F, 0x874E, 0x1980, 0x8751, 0x48AC,
- 0x8753, 0x1986, 0x8755, 0x09F0, 0x8757, 0x1982, 0x8758, 0x48AD,
- 0x8759, 0x1985, 0x875D, 0x4D30, 0x875F, 0x197D, 0x8760, 0x197C,
- 0x8763, 0x1987, 0x8764, 0x48AE, 0x8765, 0x48AF, 0x8766, 0x055C,
- 0x8768, 0x1983, 0x876A, 0x1988, 0x876E, 0x1984, 0x8771, 0x3AF9,
- 0x8772, 0x48B0, 0x8774, 0x1981, 0x8776, 0x0BCF, 0x8778, 0x197E,
- 0x877B, 0x4D31, 0x877C, 0x48B1, 0x877F, 0x0D1E, 0x8782, 0x198C,
- 0x8787, 0x42D8, 0x8788, 0x3AFA, 0x8789, 0x48B5, 0x878B, 0x48B6,
- 0x878C, 0x4D32, 0x878D, 0x0F25, 0x878E, 0x4D33, 0x8793, 0x48B7,
- 0x8797, 0x4D34, 0x8798, 0x4D35, 0x8799, 0x3AFB, 0x879E, 0x4D36,
- 0x879F, 0x198B, 0x87A0, 0x48B8, 0x87A2, 0x198A, 0x87A3, 0x4D37,
- 0x87A7, 0x48B4, 0x87AB, 0x1993, 0x87AC, 0x3AFC, 0x87AD, 0x3AFD,
- 0x87AE, 0x4D38, 0x87AF, 0x198D, 0x87B3, 0x1995, 0x87B5, 0x3AFE,
- 0x87BA, 0x0F50, 0x87BB, 0x1998, 0x87BD, 0x198F, 0x87BE, 0x48BB,
- 0x87BF, 0x4D39, 0x87C0, 0x1990, 0x87C1, 0x48BD, 0x87C4, 0x1994,
- 0x87C6, 0x1997, 0x87C7, 0x1996, 0x87C9, 0x4D3A, 0x87CB, 0x198E,
- 0x87CE, 0x48BE, 0x87D0, 0x1991, 0x87D2, 0x19A2, 0x87D6, 0x3AFF,
- 0x87DA, 0x4D3B, 0x87DF, 0x48BF, 0x87E0, 0x199B, 0x87E3, 0x48C1,
- 0x87E5, 0x48C2, 0x87E6, 0x48C3, 0x87EA, 0x48C4, 0x87EB, 0x3B00,
- 0x87EC, 0x1E23, 0x87ED, 0x3B01, 0x87EF, 0x1999, 0x87F2, 0x199A,
- 0x87F5, 0x3C3D, 0x87F6, 0x199F, 0x87F7, 0x19A0, 0x87F9, 0x0588,
- 0x87FB, 0x065C, 0x87FE, 0x199E, 0x8801, 0x3B02, 0x8803, 0x4F58,
- 0x8805, 0x1989, 0x8806, 0x3B04, 0x8807, 0x21A6, 0x880A, 0x42DA,
- 0x880B, 0x3B05, 0x880D, 0x199D, 0x880E, 0x19A1, 0x880F, 0x199C,
- 0x8810, 0x42DB, 0x8811, 0x19A3, 0x8813, 0x48C5, 0x8814, 0x3B06,
- 0x8815, 0x19A5, 0x8816, 0x19A4, 0x8818, 0x4D3C, 0x881B, 0x4D3D,
- 0x881C, 0x3B07, 0x881F, 0x1E85, 0x8821, 0x19A7, 0x8822, 0x19A6,
- 0x8823, 0x1961, 0x8827, 0x19AB, 0x8828, 0x48C6, 0x882D, 0x4D3E,
- 0x882E, 0x48C7, 0x8831, 0x19A8, 0x8832, 0x48C8, 0x8836, 0x19A9,
- 0x8839, 0x19AA, 0x883A, 0x4D3F, 0x883B, 0x19AC, 0x883C, 0x48C9,
- 0x8840, 0x0742, 0x8842, 0x19AE, 0x8844, 0x19AD, 0x8845, 0x4D40,
- 0x8846, 0x093A, 0x884A, 0x48CB, 0x884B, 0x4D41, 0x884C, 0x07E6,
- 0x884D, 0x1524, 0x884E, 0x4D42, 0x8852, 0x19AF, 0x8853, 0x095B,
- 0x8855, 0x4D43, 0x8856, 0x3B08, 0x8857, 0x0597, 0x8858, 0x48CC,
- 0x8859, 0x19B0, 0x885A, 0x4D44, 0x885B, 0x04F4, 0x885D, 0x09BF,
- 0x885E, 0x19B1, 0x885F, 0x3B09, 0x8861, 0x07E7, 0x8862, 0x19B2,
- 0x8863, 0x04A5, 0x8864, 0x3B0A, 0x8868, 0x0DAF, 0x8869, 0x48CF,
- 0x886B, 0x19B3, 0x886E, 0x4D45, 0x886F, 0x48D1, 0x8870, 0x0A30,
- 0x8872, 0x19BA, 0x8875, 0x19B7, 0x8877, 0x0BAD, 0x887D, 0x19B8,
- 0x887E, 0x19B5, 0x887F, 0x06D6, 0x8881, 0x19B4, 0x8882, 0x19BB,
- 0x8888, 0x070C, 0x888B, 0x0B3E, 0x888D, 0x19C1, 0x8892, 0x19BD,
- 0x8896, 0x0B15, 0x8897, 0x19BC, 0x8898, 0x3B0B, 0x8899, 0x19BF,
- 0x889A, 0x4D46, 0x889B, 0x4D47, 0x889C, 0x4D48, 0x889E, 0x19B6,
- 0x88A0, 0x48D2, 0x88A2, 0x19C0, 0x88A4, 0x19C2, 0x88AA, 0x3B0C,
- 0x88AB, 0x0D83, 0x88AE, 0x19BE, 0x88B0, 0x19C3, 0x88B1, 0x19C5,
- 0x88B4, 0x0787, 0x88B5, 0x19B9, 0x88B7, 0x0485, 0x88BC, 0x48D3,
- 0x88BD, 0x3B0D, 0x88BE, 0x3B0E, 0x88BF, 0x19C4, 0x88C0, 0x48D4,
- 0x88C1, 0x084B, 0x88C2, 0x0FBE, 0x88C3, 0x19C6, 0x88C4, 0x19C7,
- 0x88C5, 0x0AF7, 0x88C6, 0x3789, 0x88CA, 0x3B0F, 0x88CD, 0x4D49,
- 0x88CE, 0x42DC, 0x88CF, 0x0F6A, 0x88D1, 0x48D6, 0x88D2, 0x3B10,
- 0x88D3, 0x48D7, 0x88D4, 0x19C8, 0x88D5, 0x0F1F, 0x88D8, 0x19C9,
- 0x88D9, 0x19CA, 0x88DB, 0x3B11, 0x88DC, 0x0E34, 0x88DD, 0x19CB,
- 0x88DF, 0x0830, 0x88E0, 0x4D4A, 0x88E1, 0x0F6B, 0x88E8, 0x19D0,
- 0x88EF, 0x4D4B, 0x88F0, 0x3B12, 0x88F1, 0x3B13, 0x88F2, 0x19D1,
- 0x88F3, 0x09C0, 0x88F4, 0x19CF, 0x88F5, 0x21A7, 0x88F8, 0x0F51,
- 0x88F9, 0x19CC, 0x88FC, 0x19CE, 0x88FD, 0x0A61, 0x88FE, 0x0A44,
- 0x8901, 0x48D9, 0x8902, 0x19CD, 0x8904, 0x19D2, 0x8906, 0x3B14,
- 0x8907, 0x0DF3, 0x890A, 0x19D4, 0x890C, 0x19D3, 0x890E, 0x4D4C,
- 0x890F, 0x4D4D, 0x8910, 0x05CA, 0x8912, 0x0E59, 0x8913, 0x19D5,
- 0x8918, 0x3B15, 0x8919, 0x3B16, 0x891A, 0x3B17, 0x891C, 0x20A8,
- 0x891D, 0x19E1, 0x891E, 0x19D7, 0x8925, 0x19D8, 0x8926, 0x4D4E,
- 0x8927, 0x3B18, 0x892A, 0x19D9, 0x892B, 0x19DA, 0x8930, 0x3B19,
- 0x8932, 0x42DE, 0x8935, 0x4D4F, 0x8936, 0x19DE, 0x8937, 0x48DB,
- 0x8938, 0x19DF, 0x8939, 0x42DF, 0x893B, 0x19DD, 0x893E, 0x3B1A,
- 0x8940, 0x42E0, 0x8941, 0x19DB, 0x8942, 0x48DD, 0x8943, 0x19D6,
- 0x8944, 0x19DC, 0x8945, 0x48DE, 0x8949, 0x48DF, 0x894C, 0x19E0,
- 0x894D, 0x1BD0, 0x8956, 0x0528, 0x895A, 0x4D50, 0x895C, 0x4D51,
- 0x895E, 0x19E3, 0x895F, 0x06D7, 0x8960, 0x19E2, 0x8962, 0x48E1,
- 0x8964, 0x19E5, 0x8966, 0x19E4, 0x896A, 0x19E7, 0x896B, 0x4D52,
- 0x896D, 0x19E6, 0x896F, 0x19E8, 0x8970, 0x4D53, 0x8972, 0x093B,
- 0x8974, 0x19E9, 0x8977, 0x19EA, 0x897B, 0x3B1B, 0x897C, 0x4D54,
- 0x897E, 0x19EB, 0x897F, 0x0A62, 0x8980, 0x362E, 0x8981, 0x0F41,
- 0x8983, 0x19EC, 0x8986, 0x0DF4, 0x8987, 0x0CFC, 0x8988, 0x19ED,
- 0x8989, 0x48E2, 0x898A, 0x19EE, 0x898B, 0x075F, 0x898F, 0x0646,
- 0x8990, 0x48E3, 0x8993, 0x19EF, 0x8994, 0x42E1, 0x8996, 0x08B9,
- 0x8997, 0x0CF7, 0x8998, 0x19F0, 0x899A, 0x05AE, 0x899F, 0x48E4,
- 0x89A1, 0x19F1, 0x89A5, 0x4D55, 0x89A6, 0x19F3, 0x89A7, 0x0F61,
- 0x89A9, 0x19F2, 0x89AA, 0x0A0C, 0x89AC, 0x19F4, 0x89AF, 0x19F5,
- 0x89B0, 0x48E5, 0x89B2, 0x19F6, 0x89B3, 0x060D, 0x89B5, 0x4D56,
- 0x89B7, 0x48E6, 0x89BA, 0x19F7, 0x89BC, 0x4D57, 0x89BD, 0x19F8,
- 0x89BF, 0x19F9, 0x89C0, 0x19FA, 0x89D2, 0x05AF, 0x89D4, 0x3B1C,
- 0x89D5, 0x4D58, 0x89D6, 0x3B1D, 0x89D8, 0x48E7, 0x89DA, 0x19FB,
- 0x89DC, 0x19FC, 0x89DD, 0x19FD, 0x89E3, 0x0572, 0x89E5, 0x3B1E,
- 0x89E6, 0x09EE, 0x89E7, 0x19FE, 0x89EB, 0x48E8, 0x89F1, 0x3B1F,
- 0x89F3, 0x48EA, 0x89F4, 0x19FF, 0x89F6, 0x42E2, 0x89F8, 0x1A00,
- 0x89FD, 0x48EB, 0x89FF, 0x48EC, 0x8A00, 0x0774, 0x8A01, 0x35BC,
- 0x8A02, 0x0C17, 0x8A03, 0x1A01, 0x8A07, 0x3B20, 0x8A08, 0x072D,
- 0x8A0A, 0x0A1C, 0x8A0C, 0x1A04, 0x8A0E, 0x0C7C, 0x8A0F, 0x3B21,
- 0x8A10, 0x1A03, 0x8A11, 0x48EE, 0x8A12, 0x21A8, 0x8A13, 0x0707,
- 0x8A14, 0x48EF, 0x8A15, 0x3B22, 0x8A16, 0x1A02, 0x8A17, 0x0B57,
- 0x8A18, 0x0647, 0x8A1B, 0x1A05, 0x8A1D, 0x1A06, 0x8A1F, 0x09C1,
- 0x8A21, 0x48F1, 0x8A22, 0x3B23, 0x8A23, 0x0743, 0x8A25, 0x1A07,
- 0x8A2A, 0x0E5A, 0x8A2D, 0x0A83, 0x8A31, 0x0690, 0x8A33, 0x0F01,
- 0x8A34, 0x0ACC, 0x8A35, 0x48F2, 0x8A36, 0x1A08, 0x8A37, 0x21A9,
- 0x8A3A, 0x0A0D, 0x8A3B, 0x0BAE, 0x8A3C, 0x09C2, 0x8A3E, 0x48F3,
- 0x8A41, 0x1A09, 0x8A45, 0x48F4, 0x8A46, 0x1A0C, 0x8A47, 0x42E3,
- 0x8A48, 0x1A0D, 0x8A49, 0x4D59, 0x8A4D, 0x48F5, 0x8A4E, 0x3B24,
- 0x8A50, 0x082E, 0x8A51, 0x0B22, 0x8A52, 0x1A0B, 0x8A54, 0x09C3,
- 0x8A55, 0x0DB0, 0x8A57, 0x4D5A, 0x8A58, 0x48F6, 0x8A5B, 0x1A0A,
- 0x8A5D, 0x42E4, 0x8A5E, 0x08BA, 0x8A60, 0x04F5, 0x8A61, 0x42E5,
- 0x8A62, 0x1A11, 0x8A63, 0x072E, 0x8A66, 0x08BC, 0x8A67, 0x4D5B,
- 0x8A69, 0x08BB, 0x8A6B, 0x0FF3, 0x8A6C, 0x1A10, 0x8A6D, 0x1A0F,
- 0x8A6E, 0x0AA9, 0x8A70, 0x0667, 0x8A71, 0x0FE9, 0x8A72, 0x0598,
- 0x8A73, 0x09C4, 0x8A75, 0x42E6, 0x8A79, 0x21AA, 0x8A7C, 0x1A0E,
- 0x8A7E, 0x4D5C, 0x8A7F, 0x3B25, 0x8A82, 0x1A13, 0x8A84, 0x1A14,
- 0x8A85, 0x1A12, 0x8A86, 0x4D5D, 0x8A87, 0x078C, 0x8A89, 0x0F2A,
- 0x8A8C, 0x08BD, 0x8A8D, 0x0CDD, 0x8A90, 0x48F8, 0x8A91, 0x1A17,
- 0x8A93, 0x0A64, 0x8A95, 0x0B80, 0x8A96, 0x4D5E, 0x8A98, 0x0F20,
- 0x8A9A, 0x1A1A, 0x8A9E, 0x07A0, 0x8AA0, 0x0A63, 0x8AA1, 0x1A16,
- 0x8AA3, 0x1A1B, 0x8AA4, 0x07A1, 0x8AA5, 0x1A18, 0x8AA6, 0x1A19,
- 0x8AA7, 0x21AB, 0x8AA8, 0x1A15, 0x8AAA, 0x3638, 0x8AAC, 0x0A86,
- 0x8AAD, 0x0CA1, 0x8AAE, 0x48F7, 0x8AB0, 0x0B6D, 0x8AB2, 0x055D,
- 0x8AB6, 0x4D5F, 0x8AB7, 0x48F9, 0x8AB9, 0x0D84, 0x8ABC, 0x065D,
- 0x8ABE, 0x21AC, 0x8ABF, 0x0BD0, 0x8AC2, 0x1A1E, 0x8AC4, 0x1A1C,
- 0x8AC7, 0x0B8A, 0x8AC9, 0x4D60, 0x8ACB, 0x0A65, 0x8ACC, 0x060E,
- 0x8ACD, 0x1A1D, 0x8ACF, 0x0A21, 0x8AD0, 0x42E7, 0x8AD1, 0x4D61,
- 0x8AD2, 0x0F92, 0x8AD6, 0x0FE6, 0x8AD7, 0x48FA, 0x8ADA, 0x1A1F,
- 0x8ADB, 0x1A2A, 0x8ADC, 0x0BD1, 0x8ADD, 0x4D62, 0x8ADE, 0x1A29,
- 0x8ADF, 0x21AD, 0x8AE0, 0x1A26, 0x8AE1, 0x1A2E, 0x8AE2, 0x1A27,
- 0x8AE4, 0x1A23, 0x8AE6, 0x0C18, 0x8AE7, 0x1A22, 0x8AEB, 0x1A20,
- 0x8AEC, 0x4D63, 0x8AED, 0x0F0B, 0x8AEE, 0x08BE, 0x8AF1, 0x1A24,
- 0x8AF3, 0x1A21, 0x8AF4, 0x3B26, 0x8AF5, 0x4D64, 0x8AF6, 0x21AF,
- 0x8AF7, 0x1A28, 0x8AF8, 0x097E, 0x8AFA, 0x0775, 0x8AFC, 0x48FB,
- 0x8AFE, 0x0B5A, 0x8B00, 0x0E73, 0x8B01, 0x04FC, 0x8B02, 0x04A6,
- 0x8B04, 0x0C7D, 0x8B05, 0x48FE, 0x8B06, 0x4D65, 0x8B07, 0x1A2C,
- 0x8B0A, 0x48FD, 0x8B0C, 0x1A2B, 0x8B0D, 0x48FF, 0x8B0E, 0x0CBE,
- 0x8B0F, 0x4D66, 0x8B10, 0x1A30, 0x8B11, 0x4D67, 0x8B14, 0x1A25,
- 0x8B16, 0x1A2F, 0x8B17, 0x1A31, 0x8B19, 0x0760, 0x8B1A, 0x1A2D,
- 0x8B1B, 0x07E8, 0x8B1C, 0x4900, 0x8B1D, 0x0901, 0x8B1F, 0x3B27,
- 0x8B20, 0x1A32, 0x8B21, 0x0F42, 0x8B26, 0x1A35, 0x8B28, 0x1A38,
- 0x8B2B, 0x1A36, 0x8B2C, 0x0DA7, 0x8B2D, 0x4901, 0x8B33, 0x1A33,
- 0x8B37, 0x3B28, 0x8B39, 0x06D8, 0x8B3E, 0x1A37, 0x8B41, 0x1A39,
- 0x8B43, 0x3B29, 0x8B44, 0x3B2A, 0x8B45, 0x4D68, 0x8B46, 0x42E8,
- 0x8B49, 0x1A3D, 0x8B4C, 0x1A3A, 0x8B4E, 0x1A3C, 0x8B4F, 0x1A3B,
- 0x8B51, 0x4903, 0x8B52, 0x4D69, 0x8B53, 0x21B0, 0x8B54, 0x3B2B,
- 0x8B56, 0x1A3E, 0x8B58, 0x08DD, 0x8B59, 0x42E9, 0x8B5A, 0x1A40,
- 0x8B5B, 0x1A3F, 0x8B5C, 0x0DDA, 0x8B5E, 0x4904, 0x8B5F, 0x1A42,
- 0x8B66, 0x072F, 0x8B69, 0x42EA, 0x8B6B, 0x1A41, 0x8B6C, 0x1A43,
- 0x8B6D, 0x4D6A, 0x8B6F, 0x1A44, 0x8B70, 0x065E, 0x8B71, 0x182E,
- 0x8B72, 0x09E1, 0x8B74, 0x1A45, 0x8B76, 0x4905, 0x8B77, 0x07A2,
- 0x8B78, 0x4D6B, 0x8B7C, 0x4D6C, 0x8B7D, 0x1A46, 0x8B7E, 0x4D6D,
- 0x8B7F, 0x21B1, 0x8B80, 0x1A47, 0x8B81, 0x4906, 0x8B83, 0x088C,
- 0x8B85, 0x4D6E, 0x8B8A, 0x13D3, 0x8B8B, 0x4907, 0x8B8C, 0x1A48,
- 0x8B8E, 0x1A49, 0x8B90, 0x093C, 0x8B92, 0x1A4A, 0x8B93, 0x1A4B,
- 0x8B94, 0x4908, 0x8B95, 0x4909, 0x8B96, 0x1A4C, 0x8B99, 0x1A4D,
- 0x8B9A, 0x1A4E, 0x8B9C, 0x3B2C, 0x8B9D, 0x42EB, 0x8B9E, 0x3B2D,
- 0x8B9F, 0x4D6F, 0x8C37, 0x0B69, 0x8C39, 0x490A, 0x8C3A, 0x1A4F,
- 0x8C3D, 0x490C, 0x8C3F, 0x1A51, 0x8C41, 0x1A50, 0x8C45, 0x490F,
- 0x8C46, 0x0C7E, 0x8C47, 0x3B2E, 0x8C48, 0x1A52, 0x8C49, 0x42EC,
- 0x8C4A, 0x0E5B, 0x8C4B, 0x4D70, 0x8C4C, 0x1A53, 0x8C4E, 0x1A54,
- 0x8C4F, 0x4910, 0x8C50, 0x1A55, 0x8C53, 0x4D71, 0x8C54, 0x3B2F,
- 0x8C55, 0x1A56, 0x8C57, 0x4911, 0x8C5A, 0x0CB2, 0x8C61, 0x09C5,
- 0x8C62, 0x1A57, 0x8C68, 0x42ED, 0x8C69, 0x4912, 0x8C6A, 0x07FD,
- 0x8C6B, 0x1007, 0x8C6C, 0x1A58, 0x8C6D, 0x4913, 0x8C73, 0x3B30,
- 0x8C78, 0x1A59, 0x8C79, 0x0DB1, 0x8C7A, 0x1A5A, 0x8C7B, 0x4D72,
- 0x8C7C, 0x1A62, 0x8C82, 0x1A5B, 0x8C85, 0x1A5D, 0x8C89, 0x1A5C,
- 0x8C8A, 0x1A5E, 0x8C8C, 0x0E74, 0x8C8D, 0x1A5F, 0x8C8E, 0x1A60,
- 0x8C92, 0x4916, 0x8C93, 0x4915, 0x8C94, 0x1A61, 0x8C98, 0x1A63,
- 0x8C99, 0x4917, 0x8C9B, 0x4919, 0x8C9D, 0x058B, 0x8C9E, 0x0C03,
- 0x8C9F, 0x354C, 0x8CA0, 0x0DDB, 0x8CA1, 0x0852, 0x8CA2, 0x07E9,
- 0x8CA4, 0x3B31, 0x8CA7, 0x0DC1, 0x8CA8, 0x055F, 0x8CA9, 0x0D62,
- 0x8CAA, 0x1A66, 0x8CAB, 0x060F, 0x8CAC, 0x0A79, 0x8CAD, 0x1A65,
- 0x8CAE, 0x1A6A, 0x8CAF, 0x0BB7, 0x8CB0, 0x0EEF, 0x8CB2, 0x1A68,
- 0x8CB3, 0x1A69, 0x8CB4, 0x0648, 0x8CB6, 0x1A6B, 0x8CB7, 0x0D19,
- 0x8CB8, 0x0B3F, 0x8CBA, 0x4D73, 0x8CBB, 0x0D85, 0x8CBC, 0x0C37,
- 0x8CBD, 0x1A67, 0x8CBF, 0x0E75, 0x8CC0, 0x056C, 0x8CC1, 0x1A6D,
- 0x8CC2, 0x0FCE, 0x8CC3, 0x0BDE, 0x8CC4, 0x0FEB, 0x8CC5, 0x4D74,
- 0x8CC7, 0x08BF, 0x8CC8, 0x1A6C, 0x8CC9, 0x4D75, 0x8CCA, 0x0B11,
- 0x8CCD, 0x1A7D, 0x8CCE, 0x0AAA, 0x8CD1, 0x0CD0, 0x8CD2, 0x4D76,
- 0x8CD3, 0x0DC2, 0x8CD5, 0x491B, 0x8CD6, 0x491A, 0x8CD9, 0x3B32,
- 0x8CDA, 0x1A70, 0x8CDB, 0x088D, 0x8CDC, 0x08C0, 0x8CDE, 0x09C6,
- 0x8CE0, 0x0D1B, 0x8CE1, 0x3B33, 0x8CE2, 0x0761, 0x8CE3, 0x1A6F,
- 0x8CE4, 0x1A6E, 0x8CE6, 0x0DDC, 0x8CEA, 0x08ED, 0x8CEC, 0x4D77,
- 0x8CED, 0x0C4C, 0x8CF0, 0x21B2, 0x8CF1, 0x491D, 0x8CF4, 0x21B3,
- 0x8CF5, 0x4D78, 0x8CF7, 0x4D79, 0x8CF8, 0x3B34, 0x8CFA, 0x1A72,
- 0x8CFB, 0x1A73, 0x8CFC, 0x07EA, 0x8CFD, 0x1A71, 0x8CFE, 0x3B35,
- 0x8D01, 0x4D7A, 0x8D03, 0x4D7B, 0x8D04, 0x1A74, 0x8D05, 0x1A75,
- 0x8D07, 0x1A77, 0x8D08, 0x0B03, 0x8D09, 0x491F, 0x8D0A, 0x1A76,
- 0x8D0B, 0x0622, 0x8D0D, 0x1A79, 0x8D0E, 0x4920, 0x8D0F, 0x1A78,
- 0x8D10, 0x1A7A, 0x8D12, 0x21B4, 0x8D13, 0x1A7C, 0x8D14, 0x1A7E,
- 0x8D16, 0x1A7F, 0x8D17, 0x4D7C, 0x8D1B, 0x3B36, 0x8D1C, 0x4D7D,
- 0x8D64, 0x0A7A, 0x8D66, 0x08FB, 0x8D67, 0x1A80, 0x8D69, 0x3B37,
- 0x8D6B, 0x05B0, 0x8D6C, 0x3B38, 0x8D6D, 0x1A81, 0x8D6E, 0x4D7E,
- 0x8D70, 0x0AF8, 0x8D71, 0x1A82, 0x8D73, 0x1A83, 0x8D74, 0x0DDD,
- 0x8D76, 0x21B5, 0x8D77, 0x0649, 0x8D81, 0x1A84, 0x8D84, 0x3B39,
- 0x8D85, 0x0BD2, 0x8D8A, 0x04FD, 0x8D8D, 0x3B3A, 0x8D91, 0x4D7F,
- 0x8D95, 0x3B3B, 0x8D99, 0x1A85, 0x8D9F, 0x4D80, 0x8DA3, 0x091D,
- 0x8DA6, 0x3B3C, 0x8DA8, 0x0A3C, 0x8DAB, 0x4D81, 0x8DAF, 0x42EE,
- 0x8DB2, 0x4D82, 0x8DB3, 0x0B0D, 0x8DBA, 0x1A88, 0x8DBE, 0x1A87,
- 0x8DC2, 0x1A86, 0x8DC6, 0x3B3D, 0x8DC8, 0x4921, 0x8DCB, 0x1A8E,
- 0x8DCC, 0x1A8C, 0x8DCE, 0x3B3E, 0x8DCF, 0x1A89, 0x8DD1, 0x42EF,
- 0x8DD5, 0x4D83, 0x8DD6, 0x1A8B, 0x8DD7, 0x42F0, 0x8DD9, 0x4922,
- 0x8DDA, 0x1A8A, 0x8DDB, 0x1A8D, 0x8DDD, 0x0691, 0x8DDF, 0x1A91,
- 0x8DE1, 0x0A7B, 0x8DE3, 0x1A92, 0x8DE4, 0x3B3F, 0x8DE7, 0x4D84,
- 0x8DE8, 0x078D, 0x8DEA, 0x1A8F, 0x8DEB, 0x1A90, 0x8DEC, 0x3B40,
- 0x8DEF, 0x0FCF, 0x8DF1, 0x4D85, 0x8DF2, 0x4D86, 0x8DF3, 0x0BD3,
- 0x8DF4, 0x4D87, 0x8DF5, 0x0AAB, 0x8DFC, 0x1A93, 0x8DFD, 0x4925,
- 0x8DFF, 0x1A96, 0x8E01, 0x4D88, 0x8E06, 0x4926, 0x8E08, 0x1A94,
- 0x8E09, 0x1A95, 0x8E0A, 0x0F43, 0x8E0B, 0x4D89, 0x8E0C, 0x4923,
- 0x8E0F, 0x0C7F, 0x8E10, 0x1A99, 0x8E14, 0x4928, 0x8E16, 0x4929,
- 0x8E1D, 0x1A97, 0x8E1E, 0x1A98, 0x8E1F, 0x1A9A, 0x8E20, 0x3B41,
- 0x8E21, 0x492A, 0x8E22, 0x492B, 0x8E23, 0x42F1, 0x8E26, 0x4D8A,
- 0x8E27, 0x492C, 0x8E2A, 0x1AA8, 0x8E30, 0x1A9D, 0x8E31, 0x4D8B,
- 0x8E34, 0x1A9E, 0x8E35, 0x1A9C, 0x8E36, 0x492F, 0x8E39, 0x4930,
- 0x8E3D, 0x42F2, 0x8E40, 0x4D8C, 0x8E41, 0x4D8D, 0x8E42, 0x1A9B,
- 0x8E44, 0x0C19, 0x8E47, 0x1AA0, 0x8E48, 0x1AA4, 0x8E49, 0x1AA1,
- 0x8E4A, 0x1A9F, 0x8E4B, 0x3B42, 0x8E4C, 0x1AA2, 0x8E4D, 0x4D8E,
- 0x8E4F, 0x4D8F, 0x8E50, 0x1AA3, 0x8E54, 0x4931, 0x8E55, 0x1AAA,
- 0x8E59, 0x1AA5, 0x8E5C, 0x4D90, 0x8E5F, 0x0A7C, 0x8E60, 0x1AA7,
- 0x8E61, 0x4D91, 0x8E62, 0x4932, 0x8E63, 0x1AA9, 0x8E64, 0x1AA6,
- 0x8E69, 0x4D92, 0x8E6C, 0x3B43, 0x8E6D, 0x4933, 0x8E6F, 0x4934,
- 0x8E70, 0x3B44, 0x8E71, 0x4D93, 0x8E72, 0x1AAC, 0x8E74, 0x093D,
- 0x8E75, 0x4D94, 0x8E76, 0x1AAB, 0x8E77, 0x4D95, 0x8E7A, 0x3B45,
- 0x8E7B, 0x42F3, 0x8E7C, 0x1AAD, 0x8E81, 0x1AAE, 0x8E84, 0x1AB1,
- 0x8E85, 0x1AB0, 0x8E87, 0x1AAF, 0x8E89, 0x4D96, 0x8E8A, 0x1AB3,
- 0x8E8B, 0x1AB2, 0x8E8D, 0x0F02, 0x8E90, 0x4D97, 0x8E91, 0x1AB5,
- 0x8E92, 0x3B46, 0x8E93, 0x1AB4, 0x8E94, 0x1AB6, 0x8E95, 0x4D98,
- 0x8E98, 0x4935, 0x8E99, 0x1AB7, 0x8E9A, 0x4D99, 0x8E9E, 0x4936,
- 0x8EA1, 0x1AB9, 0x8EA7, 0x4D9A, 0x8EA9, 0x4D9B, 0x8EAA, 0x1AB8,
- 0x8EAB, 0x0A0E, 0x8EAC, 0x1ABA, 0x8EAD, 0x4D9C, 0x8EAE, 0x3B47,
- 0x8EAF, 0x06E5, 0x8EB0, 0x1ABB, 0x8EB1, 0x1ABD, 0x8EB3, 0x3B48,
- 0x8EB5, 0x4937, 0x8EB6, 0x3703, 0x8EBB, 0x4938, 0x8EBE, 0x1ABE,
- 0x8EC0, 0x1DEF, 0x8EC5, 0x1ABF, 0x8EC6, 0x1ABC, 0x8EC8, 0x1AC0,
- 0x8ECA, 0x0902, 0x8ECB, 0x1AC1, 0x8ECC, 0x064A, 0x8ECD, 0x0709,
- 0x8ECF, 0x21B7, 0x8ED1, 0x3B49, 0x8ED2, 0x0762, 0x8ED4, 0x3B4A,
- 0x8EDB, 0x1AC2, 0x8EDF, 0x0CC8, 0x8EE2, 0x0C38, 0x8EE3, 0x1AC3,
- 0x8EE8, 0x4D9D, 0x8EEB, 0x1AC6, 0x8EF0, 0x4D9E, 0x8EF8, 0x08E0,
- 0x8EF9, 0x3B4B, 0x8EFA, 0x42F6, 0x8EFB, 0x1AC5, 0x8EFC, 0x1AC4,
- 0x8EFD, 0x0730, 0x8EFE, 0x1AC7, 0x8F00, 0x493C, 0x8F03, 0x05B1,
- 0x8F05, 0x1AC9, 0x8F07, 0x4D9F, 0x8F08, 0x493D, 0x8F09, 0x084C,
- 0x8F0A, 0x1AC8, 0x8F0C, 0x1AD1, 0x8F12, 0x1ACB, 0x8F13, 0x1ACD,
- 0x8F14, 0x0E35, 0x8F15, 0x1ACA, 0x8F17, 0x3B4C, 0x8F18, 0x4DA0,
- 0x8F19, 0x1ACC, 0x8F1B, 0x1AD0, 0x8F1C, 0x1ACE, 0x8F1D, 0x064B,
- 0x8F1E, 0x42F7, 0x8F1F, 0x1ACF, 0x8F25, 0x4DA1, 0x8F26, 0x1AD2,
- 0x8F27, 0x4DA2, 0x8F29, 0x0D10, 0x8F2A, 0x0FA0, 0x8F2B, 0x493E,
- 0x8F2C, 0x4DA3, 0x8F2D, 0x42F8, 0x8F2F, 0x093E, 0x8F33, 0x1AD3,
- 0x8F35, 0x4DA4, 0x8F36, 0x3B4D, 0x8F38, 0x0F0C, 0x8F39, 0x1AD5,
- 0x8F3A, 0x4DA5, 0x8F3B, 0x1AD4, 0x8F3E, 0x1AD8, 0x8F3F, 0x0F2B,
- 0x8F40, 0x493F, 0x8F42, 0x1AD7, 0x8F43, 0x4DA6, 0x8F44, 0x05CB,
- 0x8F45, 0x1AD6, 0x8F46, 0x1ADB, 0x8F47, 0x4DA7, 0x8F49, 0x1ADA,
- 0x8F4A, 0x4940, 0x8F4C, 0x1AD9, 0x8F4D, 0x0C2C, 0x8F4E, 0x1ADC,
- 0x8F51, 0x4DA8, 0x8F54, 0x42F9, 0x8F55, 0x4DA9, 0x8F57, 0x1ADD,
- 0x8F58, 0x4941, 0x8F5C, 0x1ADE, 0x8F5F, 0x07FE, 0x8F61, 0x06FB,
- 0x8F62, 0x1ADF, 0x8F63, 0x1AE0, 0x8F64, 0x1AE1, 0x8F9B, 0x0A0F,
- 0x8F9C, 0x1AE2, 0x8F9E, 0x08D9, 0x8F9F, 0x1AE3, 0x8FA0, 0x4DAA,
- 0x8FA1, 0x4DAB, 0x8FA2, 0x4DAC, 0x8FA3, 0x1AE4, 0x8FA4, 0x4943,
- 0x8FA5, 0x4DAD, 0x8FA6, 0x3B4E, 0x8FA7, 0x10B6, 0x8FA8, 0x10B5,
- 0x8FAD, 0x1AE5, 0x8FAE, 0x17FF, 0x8FAF, 0x1AE6, 0x8FB0, 0x0B62,
- 0x8FB1, 0x09F1, 0x8FB2, 0x0CF6, 0x8FB4, 0x4944, 0x8FB5, 0x3B4F,
- 0x8FB6, 0x3B50, 0x8FB7, 0x1AE7, 0x8FBA, 0x0E25, 0x8FBB, 0x0BF0,
- 0x8FBC, 0x0810, 0x8FBF, 0x0B67, 0x8FC1, 0x4946, 0x8FC2, 0x04CC,
- 0x8FC4, 0x0EA6, 0x8FC5, 0x0A1D, 0x8FC6, 0x4947, 0x8FC8, 0x3799,
- 0x8FCA, 0x4949, 0x8FCD, 0x494A, 0x8FCE, 0x0734, 0x8FD1, 0x06D9,
- 0x8FD3, 0x494B, 0x8FD4, 0x0E26, 0x8FD5, 0x494C, 0x8FDA, 0x1AE8,
- 0x8FE0, 0x3B52, 0x8FE2, 0x1AEA, 0x8FE4, 0x3B53, 0x8FE5, 0x1AE9,
- 0x8FE6, 0x0560, 0x8FE8, 0x42FB, 0x8FE9, 0x0CCE, 0x8FEA, 0x1AEB,
- 0x8FEB, 0x0D2D, 0x8FED, 0x0C2D, 0x8FEE, 0x42FC, 0x8FEF, 0x1AEC,
- 0x8FF0, 0x095C, 0x8FF1, 0x494D, 0x8FF4, 0x1AEE, 0x8FF5, 0x494E,
- 0x8FF6, 0x3B54, 0x8FF7, 0x0ECE, 0x8FF8, 0x1AFD, 0x8FF9, 0x1AF0,
- 0x8FFA, 0x1AF1, 0x8FFB, 0x494F, 0x8FFD, 0x0BE5, 0x9000, 0x0B40,
- 0x9001, 0x0AF9, 0x9002, 0x3B55, 0x9003, 0x0C80, 0x9004, 0x4DAE,
- 0x9005, 0x1AEF, 0x9006, 0x066F, 0x9008, 0x42FD, 0x900B, 0x1AF8,
- 0x900C, 0x4950, 0x900D, 0x1AF5, 0x900E, 0x1B02, 0x900F, 0x0C81,
- 0x9010, 0x0B9E, 0x9011, 0x1AF2, 0x9013, 0x0C1A, 0x9014, 0x0C4D,
- 0x9015, 0x1AF3, 0x9016, 0x1AF7, 0x9017, 0x0A26, 0x9019, 0x0D1D,
- 0x901A, 0x0BE8, 0x901B, 0x4DAF, 0x901D, 0x0A66, 0x901E, 0x1AF6,
- 0x901F, 0x0B0E, 0x9020, 0x0B04, 0x9021, 0x1AF4, 0x9022, 0x046D,
- 0x9023, 0x0FC8, 0x9027, 0x1AF9, 0x902C, 0x3B56, 0x902D, 0x42FE,
- 0x902E, 0x0B41, 0x902F, 0x4DB0, 0x9031, 0x093F, 0x9032, 0x0A10,
- 0x9035, 0x1AFB, 0x9036, 0x1AFA, 0x9037, 0x4951, 0x9038, 0x04B3,
- 0x9039, 0x1AFC, 0x903C, 0x0DA1, 0x903E, 0x1B04, 0x9041, 0x0CB3,
- 0x9042, 0x0A31, 0x9043, 0x4953, 0x9044, 0x3B57, 0x9045, 0x0B97,
- 0x9047, 0x06F0, 0x9049, 0x1B03, 0x904A, 0x0F21, 0x904B, 0x04E1,
- 0x904C, 0x4DB1, 0x904D, 0x0E27, 0x904E, 0x0561, 0x904F, 0x1AFE,
- 0x9050, 0x1AFF, 0x9051, 0x1B00, 0x9052, 0x1B01, 0x9053, 0x0C93,
- 0x9054, 0x0B61, 0x9055, 0x04A7, 0x9056, 0x1B05, 0x9058, 0x1B06,
- 0x9059, 0x1D34, 0x905B, 0x4DB2, 0x905C, 0x0B1D, 0x905D, 0x4954,
- 0x905E, 0x1B07, 0x9060, 0x0515, 0x9061, 0x0ACE, 0x9063, 0x0763,
- 0x9065, 0x0F44, 0x9067, 0x21BA, 0x9068, 0x1B08, 0x9069, 0x0C26,
- 0x906D, 0x0AFA, 0x906E, 0x0903, 0x906F, 0x1B09, 0x9070, 0x4DB3,
- 0x9072, 0x1B0C, 0x9074, 0x4DB4, 0x9075, 0x096F, 0x9076, 0x1B0A,
- 0x9077, 0x0AAD, 0x9078, 0x0AAC, 0x9079, 0x4DB5, 0x907A, 0x04A8,
- 0x907C, 0x0F93, 0x907D, 0x1B0E, 0x907F, 0x0D86, 0x9080, 0x1B10,
- 0x9081, 0x1B0F, 0x9082, 0x1B0D, 0x9083, 0x1737, 0x9084, 0x0610,
- 0x9085, 0x4957, 0x9087, 0x1AED, 0x9088, 0x3B58, 0x9089, 0x1B12,
- 0x908A, 0x1B11, 0x908B, 0x4DB6, 0x908C, 0x4958, 0x908F, 0x1B13,
- 0x9090, 0x4959, 0x9091, 0x0F22, 0x9095, 0x3B59, 0x9097, 0x42FF,
- 0x9098, 0x4DB7, 0x9099, 0x3B5A, 0x909B, 0x3B5B, 0x90A0, 0x4DB8,
- 0x90A1, 0x495A, 0x90A2, 0x3B5C, 0x90A3, 0x0CB9, 0x90A6, 0x0E5C,
- 0x90A8, 0x1B14, 0x90AA, 0x0905, 0x90AF, 0x1B15, 0x90B0, 0x495C,
- 0x90B1, 0x1B16, 0x90B2, 0x4DB9, 0x90B3, 0x4300, 0x90B4, 0x3B5D,
- 0x90B5, 0x1B17, 0x90B6, 0x495D, 0x90B8, 0x0C1B, 0x90BD, 0x4DBA,
- 0x90BE, 0x4301, 0x90C1, 0x04AE, 0x90C3, 0x495E, 0x90C4, 0x4302,
- 0x90C5, 0x4303, 0x90C7, 0x4304, 0x90C8, 0x495F, 0x90C9, 0x4DBB,
- 0x90CA, 0x07EB, 0x90CE, 0x0FE0, 0x90D7, 0x3B5E, 0x90DB, 0x1B1B,
- 0x90DC, 0x4961, 0x90DD, 0x3B5F, 0x90DE, 0x21BB, 0x90DF, 0x4962,
- 0x90E1, 0x070A, 0x90E2, 0x1B18, 0x90E4, 0x1B19, 0x90E8, 0x0DE6,
- 0x90EB, 0x4967, 0x90ED, 0x05B2, 0x90EF, 0x4305, 0x90F0, 0x4DBC,
- 0x90F2, 0x4965, 0x90F4, 0x3B60, 0x90F5, 0x0F23, 0x90F6, 0x4964,
- 0x90F7, 0x06B7, 0x90FD, 0x0C4E, 0x90FE, 0x4968, 0x90FF, 0x4969,
- 0x9100, 0x4966, 0x9102, 0x1B1C, 0x9104, 0x496A, 0x9105, 0x4DBD,
- 0x9106, 0x496B, 0x9112, 0x1B1D, 0x9114, 0x4306, 0x9115, 0x21BD,
- 0x9116, 0x4307, 0x9117, 0x3B61, 0x9118, 0x496C, 0x9119, 0x1B1E,
- 0x911C, 0x3B62, 0x911E, 0x496D, 0x9122, 0x4308, 0x9123, 0x4309,
- 0x9125, 0x4DBE, 0x9127, 0x21BE, 0x912D, 0x0C1C, 0x912F, 0x430A,
- 0x9130, 0x1B20, 0x9131, 0x3B63, 0x9132, 0x1B1F, 0x9134, 0x430B,
- 0x9137, 0x496E, 0x9139, 0x496F, 0x913A, 0x3B64, 0x913D, 0x3B65,
- 0x9146, 0x4970, 0x9147, 0x4971, 0x9148, 0x3B66, 0x9149, 0x0CAB,
- 0x914A, 0x1B21, 0x914B, 0x0940, 0x914C, 0x090C, 0x914D, 0x0D11,
- 0x914E, 0x0BAF, 0x9152, 0x091E, 0x9154, 0x0A32, 0x9156, 0x1B22,
- 0x9157, 0x4972, 0x9158, 0x1B23, 0x9159, 0x4973, 0x915A, 0x4DBF,
- 0x915B, 0x3B67, 0x9161, 0x3B68, 0x9162, 0x0A23, 0x9163, 0x1B24,
- 0x9164, 0x3B69, 0x9165, 0x1B25, 0x9167, 0x4DC0, 0x9169, 0x1B26,
- 0x916A, 0x0F59, 0x916C, 0x0941, 0x9172, 0x1B28, 0x9173, 0x1B27,
- 0x9174, 0x4974, 0x9175, 0x07EC, 0x9177, 0x0805, 0x9178, 0x088E,
- 0x9179, 0x4975, 0x917A, 0x4DC1, 0x9182, 0x1B2B, 0x9183, 0x430C,
- 0x9185, 0x4976, 0x9187, 0x0970, 0x9189, 0x1B2A, 0x918A, 0x4DC2,
- 0x918B, 0x1B29, 0x918D, 0x0B49, 0x918E, 0x3B6A, 0x9190, 0x07A3,
- 0x9191, 0x4DC3, 0x9192, 0x0A67, 0x9195, 0x4DC4, 0x9197, 0x0D44,
- 0x919C, 0x0943, 0x919E, 0x3B6B, 0x91A2, 0x1B2C, 0x91A4, 0x09C7,
- 0x91A8, 0x3B6C, 0x91AA, 0x1B2F, 0x91AB, 0x1B2D, 0x91AC, 0x1E1B,
- 0x91AD, 0x3B6D, 0x91AE, 0x3B6E, 0x91AF, 0x1B2E, 0x91B0, 0x4DC5,
- 0x91B1, 0x1E61, 0x91B2, 0x3B6F, 0x91B3, 0x4977, 0x91B4, 0x1B31,
- 0x91B5, 0x1B30, 0x91B6, 0x4978, 0x91B8, 0x09E2, 0x91BA, 0x1B32,
- 0x91BB, 0x4DC6, 0x91BC, 0x3B70, 0x91BD, 0x4DC7, 0x91C0, 0x1B33,
- 0x91C1, 0x1B34, 0x91C2, 0x4DC8, 0x91C3, 0x4979, 0x91C4, 0x497A,
- 0x91C5, 0x4DC9, 0x91C6, 0x0D64, 0x91C7, 0x0843, 0x91C8, 0x090D,
- 0x91C9, 0x1B35, 0x91CB, 0x1B36, 0x91CC, 0x0F6C, 0x91CD, 0x094F,
- 0x91CE, 0x0EFA, 0x91CF, 0x0F94, 0x91D0, 0x1B37, 0x91D1, 0x06DA,
- 0x91D6, 0x1B38, 0x91D7, 0x21C0, 0x91D8, 0x0C1D, 0x91DA, 0x21BF,
- 0x91DB, 0x1B3B, 0x91DC, 0x05D6, 0x91DD, 0x0A11, 0x91DE, 0x21C1,
- 0x91DF, 0x1B39, 0x91E1, 0x1B3A, 0x91E3, 0x0BFC, 0x91E4, 0x21C4,
- 0x91E5, 0x21C5, 0x91E6, 0x0E83, 0x91E7, 0x06F4, 0x91EC, 0x497D,
- 0x91ED, 0x21C2, 0x91EE, 0x21C3, 0x91F0, 0x3B71, 0x91F1, 0x430D,
- 0x91F5, 0x1B3D, 0x91F6, 0x1B3E, 0x91F7, 0x3B72, 0x91FB, 0x3B73,
- 0x91FC, 0x1B3C, 0x91FF, 0x1B40, 0x9200, 0x4DCA, 0x9201, 0x497E,
- 0x9206, 0x21C6, 0x9207, 0x3B74, 0x9209, 0x4DCB, 0x920A, 0x21C8,
- 0x920D, 0x0CB7, 0x920E, 0x05A1, 0x9210, 0x21C7, 0x9211, 0x1B44,
- 0x9214, 0x1B41, 0x9215, 0x1B43, 0x9216, 0x497F, 0x9217, 0x4980,
- 0x921E, 0x1B3F, 0x9223, 0x4DCC, 0x9228, 0x3B75, 0x9229, 0x1B8A,
- 0x922C, 0x1B42, 0x9233, 0x3B76, 0x9234, 0x0FB3, 0x9237, 0x078E,
- 0x9238, 0x3B77, 0x9239, 0x21CF, 0x923A, 0x21C9, 0x923C, 0x21CB,
- 0x923F, 0x1B4C, 0x9240, 0x21CA, 0x9242, 0x4982, 0x9243, 0x3B78,
- 0x9244, 0x0C2E, 0x9245, 0x1B47, 0x9247, 0x3B79, 0x9248, 0x1B4A,
- 0x9249, 0x1B48, 0x924A, 0x4983, 0x924B, 0x1B4D, 0x924E, 0x21CC,
- 0x924F, 0x3B7A, 0x9250, 0x1B4E, 0x9251, 0x21CE, 0x9256, 0x4984,
- 0x9257, 0x1B46, 0x9259, 0x21CD, 0x925A, 0x1B53, 0x925B, 0x0516,
- 0x925E, 0x1B45, 0x9260, 0x3B7B, 0x9261, 0x4985, 0x9262, 0x0D41,
- 0x9264, 0x1B49, 0x9265, 0x4986, 0x9266, 0x09C8, 0x9267, 0x21D0,
- 0x9268, 0x4987, 0x9271, 0x07ED, 0x9276, 0x4DCD, 0x9277, 0x21D2,
- 0x9278, 0x21D3, 0x927C, 0x4989, 0x927D, 0x498A, 0x927E, 0x0E76,
- 0x927F, 0x498B, 0x9280, 0x06DC, 0x9283, 0x0950, 0x9285, 0x0C94,
- 0x9288, 0x20AA, 0x9289, 0x498C, 0x928D, 0x498D, 0x928E, 0x4DCE,
- 0x9291, 0x0AAF, 0x9293, 0x1B51, 0x9295, 0x1B4B, 0x9296, 0x1B50,
- 0x9297, 0x498E, 0x9298, 0x0ECF, 0x9299, 0x498F, 0x929A, 0x0BD4,
- 0x929B, 0x1B52, 0x929C, 0x1B4F, 0x929F, 0x4990, 0x92A7, 0x21D1,
- 0x92AB, 0x4991, 0x92AD, 0x0AAE, 0x92AF, 0x4DCF, 0x92B2, 0x4994,
- 0x92B3, 0x3554, 0x92B7, 0x1B56, 0x92B9, 0x1B55, 0x92BB, 0x4DD0,
- 0x92BC, 0x4DD1, 0x92BF, 0x4995, 0x92C0, 0x4996, 0x92C1, 0x4DD2,
- 0x92C2, 0x3B7C, 0x92C3, 0x4DD3, 0x92C5, 0x4DD4, 0x92C6, 0x4997,
- 0x92C8, 0x4DD5, 0x92CB, 0x3B7D, 0x92CC, 0x3B7E, 0x92CE, 0x4998,
- 0x92CF, 0x1B54, 0x92D0, 0x21D7, 0x92D2, 0x0E5D, 0x92D3, 0x21DB,
- 0x92D5, 0x21D9, 0x92D7, 0x21D5, 0x92D9, 0x21D6, 0x92DF, 0x3B7F,
- 0x92E0, 0x21DA, 0x92E4, 0x0985, 0x92E5, 0x4999, 0x92E7, 0x21D4,
- 0x92E9, 0x1B57, 0x92EA, 0x0E2F, 0x92ED, 0x04F6, 0x92F2, 0x0DB8,
- 0x92F3, 0x0BB0, 0x92F7, 0x499D, 0x92F8, 0x0692, 0x92F9, 0x20B0,
- 0x92FA, 0x1B59, 0x92FB, 0x21DE, 0x92FC, 0x07EF, 0x92FF, 0x21E1,
- 0x9302, 0x21E3, 0x9304, 0x345A, 0x9306, 0x087A, 0x930D, 0x3B80,
- 0x930F, 0x1B58, 0x9310, 0x0A33, 0x9311, 0x499A, 0x9314, 0x4DD6,
- 0x9315, 0x3B81, 0x9318, 0x0A34, 0x9319, 0x1B5C, 0x931A, 0x1B5E,
- 0x931D, 0x21E2, 0x931E, 0x21E0, 0x931F, 0x3B82, 0x9320, 0x09E3,
- 0x9321, 0x21DD, 0x9322, 0x1B5D, 0x9323, 0x1B5F, 0x9325, 0x21DC,
- 0x9326, 0x06CB, 0x9327, 0x3B83, 0x9328, 0x0DB7, 0x9329, 0x499E,
- 0x932B, 0x090E, 0x932C, 0x0FC9, 0x932E, 0x1B5B, 0x932F, 0x0868,
- 0x9332, 0x0FE5, 0x9333, 0x4DD7, 0x9335, 0x1B61, 0x9336, 0x4DD8,
- 0x933A, 0x1B60, 0x933B, 0x1B62, 0x9344, 0x1B5A, 0x9347, 0x3B84,
- 0x9348, 0x20A9, 0x9349, 0x430E, 0x934A, 0x3458, 0x934B, 0x0CC1,
- 0x934D, 0x0C4F, 0x9351, 0x49A1, 0x9352, 0x3B85, 0x9354, 0x0BF3,
- 0x9356, 0x1B67, 0x9357, 0x21E5, 0x9358, 0x4DD9, 0x935A, 0x49A2,
- 0x935B, 0x0B81, 0x935C, 0x1B63, 0x9360, 0x1B64, 0x9364, 0x430F,
- 0x9365, 0x4310, 0x936A, 0x3B87, 0x936B, 0x49A3, 0x936C, 0x0703,
- 0x936D, 0x3B88, 0x936E, 0x1B66, 0x9370, 0x21E4, 0x9371, 0x49A4,
- 0x9373, 0x49A5, 0x9375, 0x0764, 0x937C, 0x1B65, 0x937E, 0x09C9,
- 0x937F, 0x4DDA, 0x9382, 0x4DDB, 0x9388, 0x49A9, 0x938A, 0x4DDC,
- 0x938B, 0x49AA, 0x938C, 0x05D7, 0x938F, 0x49AB, 0x9394, 0x1B6B,
- 0x9396, 0x082F, 0x9397, 0x0AFB, 0x939A, 0x0BE6, 0x939B, 0x3B89,
- 0x939E, 0x49AC, 0x93A1, 0x49A6, 0x93A3, 0x4311, 0x93A4, 0x21E6,
- 0x93A7, 0x0599, 0x93A9, 0x3B8B, 0x93AC, 0x1B69, 0x93AD, 0x1B6A,
- 0x93AE, 0x0BDF, 0x93B0, 0x1B68, 0x93B9, 0x1B6C, 0x93BA, 0x3B8A,
- 0x93BB, 0x4DDD, 0x93C1, 0x3B8C, 0x93C3, 0x1B72, 0x93C6, 0x21E7,
- 0x93C7, 0x49B1, 0x93C8, 0x1B75, 0x93CA, 0x3B8D, 0x93CC, 0x4DDE,
- 0x93D0, 0x1B74, 0x93D1, 0x0C27, 0x93D6, 0x1B6D, 0x93D7, 0x1B6E,
- 0x93D8, 0x1B71, 0x93DC, 0x49B2, 0x93DD, 0x1B73, 0x93DE, 0x21E8,
- 0x93DF, 0x4312, 0x93E1, 0x06B8, 0x93E2, 0x3B8E, 0x93E4, 0x1B76,
- 0x93E5, 0x1B70, 0x93E6, 0x4DDF, 0x93E7, 0x49B3, 0x93E8, 0x1B6F,
- 0x93F1, 0x49B0, 0x93F5, 0x49AD, 0x93F8, 0x21E9, 0x93F9, 0x4DE0,
- 0x93FA, 0x3B8F, 0x93FB, 0x49B7, 0x93FD, 0x3B90, 0x9402, 0x4DE1,
- 0x9403, 0x1B7A, 0x9404, 0x4313, 0x9407, 0x1B7B, 0x9409, 0x49B4,
- 0x940D, 0x4DE2, 0x940E, 0x4DE3, 0x940F, 0x3B91, 0x9410, 0x1B7C,
- 0x9413, 0x1B79, 0x9414, 0x1B78, 0x9416, 0x49B5, 0x9417, 0x49B6,
- 0x9418, 0x09CA, 0x9419, 0x0C82, 0x941A, 0x1B77, 0x9421, 0x1B80,
- 0x942B, 0x1B7E, 0x942E, 0x4DE4, 0x9431, 0x21EA, 0x9432, 0x49B8,
- 0x9433, 0x4314, 0x9434, 0x3B92, 0x9435, 0x1B7F, 0x9436, 0x1B7D,
- 0x9438, 0x0B58, 0x943A, 0x1B81, 0x943B, 0x49B9, 0x943F, 0x3B93,
- 0x9441, 0x1B82, 0x9444, 0x1B84, 0x9445, 0x21EB, 0x9448, 0x21EC,
- 0x944A, 0x4315, 0x944C, 0x4DE5, 0x9451, 0x0611, 0x9452, 0x1B83,
- 0x9453, 0x0F06, 0x9455, 0x3B94, 0x945A, 0x1B8F, 0x945B, 0x1B85,
- 0x945E, 0x1B88, 0x9460, 0x1B86, 0x9462, 0x1B87, 0x9463, 0x4316,
- 0x946A, 0x1B89, 0x946B, 0x3B95, 0x946D, 0x49BC, 0x946F, 0x49BD,
- 0x9470, 0x1B8B, 0x9471, 0x4317, 0x9472, 0x3B96, 0x9475, 0x1B8C,
- 0x9477, 0x1B8D, 0x947C, 0x1B90, 0x947D, 0x1B8E, 0x947E, 0x1B91,
- 0x947F, 0x1B93, 0x9481, 0x1B92, 0x9577, 0x0BD5, 0x9578, 0x3B97,
- 0x9579, 0x49BE, 0x9580, 0x0EF3, 0x9582, 0x1B94, 0x9583, 0x0AB0,
- 0x9586, 0x49BF, 0x9587, 0x1B95, 0x9588, 0x4DE6, 0x9589, 0x0E14,
- 0x958A, 0x1B96, 0x958B, 0x0589, 0x958C, 0x49C0, 0x958D, 0x49C1,
- 0x958E, 0x4318, 0x958F, 0x04DE, 0x9591, 0x0613, 0x9592, 0x21ED,
- 0x9593, 0x0612, 0x9594, 0x1B97, 0x9596, 0x1B98, 0x9598, 0x1B99,
- 0x9599, 0x1B9A, 0x959F, 0x4319, 0x95A0, 0x1B9B, 0x95A1, 0x4DE7,
- 0x95A2, 0x0614, 0x95A3, 0x05B3, 0x95A4, 0x07F0, 0x95A5, 0x0D4A,
- 0x95A6, 0x3B98, 0x95A7, 0x1B9D, 0x95A8, 0x1B9C, 0x95A9, 0x3B99,
- 0x95AB, 0x4F59, 0x95AC, 0x431A, 0x95AD, 0x1B9E, 0x95B1, 0x3555,
- 0x95B2, 0x04FE, 0x95B4, 0x3B9B, 0x95B6, 0x431B, 0x95B9, 0x1BA1,
- 0x95BB, 0x1BA0, 0x95BC, 0x1B9F, 0x95BD, 0x3B9C, 0x95BE, 0x1BA2,
- 0x95BF, 0x4DE8, 0x95C3, 0x1BA5, 0x95C6, 0x4DE9, 0x95C7, 0x048B,
- 0x95C8, 0x49C4, 0x95C9, 0x4DEA, 0x95CA, 0x1BA3, 0x95CB, 0x431C,
- 0x95CC, 0x1BA7, 0x95CD, 0x1BA6, 0x95D0, 0x431D, 0x95D1, 0x4DEB,
- 0x95D2, 0x4DEC, 0x95D3, 0x431E, 0x95D4, 0x1BA9, 0x95D5, 0x1BA8,
- 0x95D6, 0x1BAA, 0x95D8, 0x0C86, 0x95DA, 0x3B9D, 0x95DC, 0x1BAB,
- 0x95DE, 0x4320, 0x95E0, 0x4DED, 0x95E1, 0x1BAC, 0x95E2, 0x1BAE,
- 0x95E4, 0x4DEE, 0x95E5, 0x1BAD, 0x95E6, 0x4DEF, 0x961C, 0x0DDE,
- 0x961D, 0x3B9E, 0x9621, 0x1BAF, 0x9624, 0x4DF0, 0x9628, 0x1BB0,
- 0x962A, 0x0855, 0x962C, 0x49C7, 0x962E, 0x1BB1, 0x962F, 0x1BB2,
- 0x9631, 0x4DF1, 0x9632, 0x0E77, 0x9633, 0x49C8, 0x9634, 0x49C9,
- 0x9638, 0x4DF2, 0x963B, 0x0ACD, 0x963C, 0x49CB, 0x963D, 0x4DF3,
- 0x963F, 0x0468, 0x9640, 0x0B2B, 0x9641, 0x3B9F, 0x9642, 0x1BB3,
- 0x9644, 0x0DDF, 0x964B, 0x1BB6, 0x964C, 0x1BB4, 0x964D, 0x07F1,
- 0x964F, 0x1BB5, 0x9650, 0x0776, 0x9654, 0x4DF4, 0x9658, 0x3BA0,
- 0x965B, 0x0E15, 0x965C, 0x1BB8, 0x965D, 0x1BBA, 0x965E, 0x1BB9,
- 0x965F, 0x1BBB, 0x9661, 0x49CC, 0x9662, 0x04C3, 0x9663, 0x0A1E,
- 0x9664, 0x0986, 0x9665, 0x0615, 0x9666, 0x1BBC, 0x966A, 0x0D1C,
- 0x966C, 0x1BBE, 0x9670, 0x04C4, 0x9672, 0x1BBD, 0x9673, 0x0BE0,
- 0x9674, 0x4DF5, 0x9675, 0x0F95, 0x9676, 0x0C83, 0x9677, 0x1BB7,
- 0x9678, 0x0F6E, 0x967A, 0x0765, 0x967B, 0x4DF6, 0x967D, 0x0F45,
- 0x967F, 0x4DF7, 0x9681, 0x4DF8, 0x9682, 0x49CE, 0x9683, 0x4DF9,
- 0x9684, 0x3BA1, 0x9685, 0x06F1, 0x9686, 0x0F7C, 0x9688, 0x06FE,
- 0x9689, 0x4DFA, 0x968A, 0x0B42, 0x968B, 0x186C, 0x968D, 0x1BBF,
- 0x968E, 0x058A, 0x968F, 0x0A35, 0x9694, 0x05B4, 0x9695, 0x1BC1,
- 0x9696, 0x4DFB, 0x9697, 0x1BC2, 0x9698, 0x1BC0, 0x9699, 0x073A,
- 0x969A, 0x49D0, 0x969B, 0x084D, 0x969C, 0x09CB, 0x969D, 0x21F0,
- 0x96A0, 0x04C5, 0x96A3, 0x0FA1, 0x96A4, 0x3BA2, 0x96A5, 0x4321,
- 0x96A7, 0x1BC4, 0x96A8, 0x1B0B, 0x96A9, 0x3BA3, 0x96AA, 0x1BC3,
- 0x96AE, 0x4DFC, 0x96AF, 0x21F1, 0x96B0, 0x1BC7, 0x96B1, 0x1BC5,
- 0x96B2, 0x1BC6, 0x96B3, 0x49D3, 0x96B4, 0x1BC8, 0x96B6, 0x1BC9,
- 0x96B7, 0x0FB4, 0x96B8, 0x1BCA, 0x96B9, 0x1BCB, 0x96BA, 0x49D4,
- 0x96BB, 0x0A6D, 0x96BC, 0x0D4F, 0x96BD, 0x49D5, 0x96C0, 0x0A43,
- 0x96C1, 0x0623, 0x96C4, 0x0F24, 0x96C5, 0x056D, 0x96C6, 0x0942,
- 0x96C7, 0x078F, 0x96C9, 0x1BCE, 0x96CB, 0x1BCD, 0x96CC, 0x08C1,
- 0x96CD, 0x1BCF, 0x96CE, 0x1BCC, 0x96D1, 0x0876, 0x96D2, 0x3BA4,
- 0x96D5, 0x1BD3, 0x96D6, 0x1992, 0x96D8, 0x49D8, 0x96D9, 0x10EB,
- 0x96DA, 0x49D9, 0x96DB, 0x0A3D, 0x96DC, 0x1BD1, 0x96DD, 0x49DA,
- 0x96DE, 0x3BA6, 0x96E2, 0x0F6D, 0x96E3, 0x0CC9, 0x96E8, 0x04CD,
- 0x96E9, 0x3BA7, 0x96EA, 0x0A87, 0x96EB, 0x08E2, 0x96EF, 0x4322,
- 0x96F0, 0x0E07, 0x96F1, 0x3BA8, 0x96F2, 0x04E2, 0x96F6, 0x0FB5,
- 0x96F7, 0x0F55, 0x96F9, 0x1BD4, 0x96FB, 0x0C3F, 0x9700, 0x0927,
- 0x9702, 0x3BA9, 0x9703, 0x4DFD, 0x9704, 0x1BD5, 0x9706, 0x1BD6,
- 0x9707, 0x0A12, 0x9708, 0x1BD7, 0x9709, 0x3BAA, 0x970A, 0x0FB6,
- 0x970D, 0x1BD2, 0x970E, 0x1BD9, 0x970F, 0x1BDB, 0x9711, 0x1BDA,
- 0x9713, 0x1BD8, 0x9714, 0x49DC, 0x9716, 0x1BDC, 0x9719, 0x1BDD,
- 0x971B, 0x4DFE, 0x971C, 0x0AFC, 0x971E, 0x0562, 0x9721, 0x4DFF,
- 0x9722, 0x4E00, 0x9723, 0x49DD, 0x9724, 0x1BDE, 0x9727, 0x0EC4,
- 0x9728, 0x4E01, 0x972A, 0x1BDF, 0x9730, 0x1BE0, 0x9731, 0x4E02,
- 0x9732, 0x0FD0, 0x9733, 0x21F2, 0x9736, 0x49DF, 0x9738, 0x1414,
- 0x9739, 0x1BE1, 0x973B, 0x21F3, 0x973D, 0x1BE2, 0x973E, 0x1BE3,
- 0x9741, 0x49E0, 0x9742, 0x1BE7, 0x9743, 0x21F4, 0x9744, 0x1BE4,
- 0x9746, 0x1BE5, 0x9747, 0x49E1, 0x9748, 0x1BE6, 0x9749, 0x1BE8,
- 0x974D, 0x21F5, 0x974E, 0x4323, 0x974F, 0x21F6, 0x9751, 0x21F7,
- 0x9752, 0x0A68, 0x9755, 0x4F5A, 0x9756, 0x0F03, 0x9757, 0x49E2,
- 0x9759, 0x0A69, 0x975A, 0x3BAB, 0x975B, 0x49E3, 0x975C, 0x1BE9,
- 0x975E, 0x0D87, 0x9760, 0x1BEA, 0x9761, 0x1D06, 0x9762, 0x0ED8,
- 0x9763, 0x3BAC, 0x9764, 0x1BEB, 0x9766, 0x1BEC, 0x9767, 0x4E03,
- 0x9768, 0x1BED, 0x9769, 0x05B5, 0x976A, 0x49E4, 0x976B, 0x1BEF,
- 0x976D, 0x0A1F, 0x976E, 0x3BAD, 0x9771, 0x1BF0, 0x9773, 0x3BAE,
- 0x9774, 0x06FA, 0x9776, 0x4E04, 0x9779, 0x1BF1, 0x977A, 0x1BF5,
- 0x977C, 0x1BF3, 0x977D, 0x4E05, 0x977F, 0x4E06, 0x9781, 0x1BF4,
- 0x9784, 0x05D1, 0x9785, 0x1BF2, 0x9786, 0x1BF6, 0x978B, 0x1BF7,
- 0x978D, 0x048C, 0x978F, 0x1BF8, 0x9790, 0x1BF9, 0x9795, 0x4324,
- 0x9796, 0x49E7, 0x9798, 0x09CC, 0x9799, 0x4E07, 0x979A, 0x3BAF,
- 0x979C, 0x1BFA, 0x979E, 0x49E8, 0x979F, 0x4E08, 0x97A0, 0x0661,
- 0x97A2, 0x3BB0, 0x97A3, 0x1BFD, 0x97A6, 0x1BFC, 0x97A8, 0x1BFB,
- 0x97AB, 0x1A34, 0x97AC, 0x4E09, 0x97AD, 0x0E2C, 0x97AE, 0x4325,
- 0x97B1, 0x49E9, 0x97B2, 0x49EA, 0x97B3, 0x1BFE, 0x97B4, 0x1BFF,
- 0x97B5, 0x3BB1, 0x97B6, 0x3BB2, 0x97B9, 0x4E0A, 0x97BA, 0x4326,
- 0x97BE, 0x49EB, 0x97C1, 0x4327, 0x97C3, 0x1C00, 0x97C6, 0x1C01,
- 0x97C8, 0x1C02, 0x97C9, 0x4328, 0x97CB, 0x1C03, 0x97CC, 0x49EC,
- 0x97CD, 0x4E0B, 0x97D1, 0x49ED, 0x97D3, 0x0616, 0x97D4, 0x49EE,
- 0x97D8, 0x49EF, 0x97D9, 0x3BB3, 0x97DB, 0x4329, 0x97DC, 0x1C04,
- 0x97DE, 0x3BB4, 0x97E0, 0x4E0C, 0x97E1, 0x49F0, 0x97ED, 0x1C05,
- 0x97EE, 0x0CD9, 0x97EF, 0x4E0D, 0x97F1, 0x49F1, 0x97F2, 0x1C07,
- 0x97F3, 0x053B, 0x97F4, 0x3BB5, 0x97F5, 0x1C0A, 0x97F6, 0x1C09,
- 0x97FB, 0x04C6, 0x97FF, 0x06B9, 0x9801, 0x0E17, 0x9802, 0x0BD6,
- 0x9803, 0x0812, 0x9804, 0x49F2, 0x9805, 0x07F2, 0x9806, 0x0971,
- 0x9807, 0x4E0E, 0x9808, 0x0A22, 0x980A, 0x3BB6, 0x980C, 0x1C0C,
- 0x980D, 0x49F3, 0x980E, 0x3BB7, 0x980F, 0x1C0B, 0x9810, 0x0F2C,
- 0x9811, 0x0624, 0x9812, 0x0D66, 0x9813, 0x0CB4, 0x9814, 0x49F4,
- 0x9816, 0x49F5, 0x9817, 0x0A42, 0x9818, 0x0F96, 0x981A, 0x0731,
- 0x981E, 0x3BB8, 0x9821, 0x1C0F, 0x9823, 0x3BB9, 0x9824, 0x1C0E,
- 0x9825, 0x49FA, 0x9826, 0x4E0F, 0x982B, 0x3BBA, 0x982C, 0x0E79,
- 0x982D, 0x0C84, 0x982E, 0x4E10, 0x9830, 0x1E73, 0x9832, 0x49F8,
- 0x9833, 0x49F9, 0x9834, 0x04F2, 0x9837, 0x1C10, 0x9838, 0x1C0D,
- 0x9839, 0x37B3, 0x983B, 0x0DC3, 0x983C, 0x0F54, 0x983D, 0x1C11,
- 0x983E, 0x3BBB, 0x9846, 0x1C12, 0x9847, 0x49FB, 0x984B, 0x1C14,
- 0x984C, 0x0B4A, 0x984D, 0x05B9, 0x984E, 0x05BA, 0x984F, 0x1C13,
- 0x9852, 0x3BBC, 0x9853, 0x3BBD, 0x9854, 0x0625, 0x9855, 0x0766,
- 0x9856, 0x432A, 0x9857, 0x21F9, 0x9858, 0x0626, 0x9859, 0x3BBE,
- 0x985A, 0x1E48, 0x985B, 0x0C39, 0x985E, 0x0FA8, 0x9862, 0x4E11,
- 0x9863, 0x4E12, 0x9865, 0x21FA, 0x9866, 0x49FC, 0x9867, 0x0790,
- 0x986B, 0x1C15, 0x986C, 0x3BBF, 0x986F, 0x1C16, 0x9870, 0x1C17,
- 0x9871, 0x1C18, 0x9873, 0x1C1A, 0x9874, 0x1C19, 0x98A8, 0x0DE9,
- 0x98AA, 0x1C1B, 0x98AB, 0x49FD, 0x98AD, 0x49FE, 0x98AF, 0x1C1C,
- 0x98B0, 0x49FF, 0x98B1, 0x1C1D, 0x98B4, 0x4E13, 0x98B6, 0x1C1E,
- 0x98B7, 0x4A01, 0x98B8, 0x3BC0, 0x98BA, 0x3BC1, 0x98BB, 0x4A02,
- 0x98BC, 0x4A03, 0x98BF, 0x3BC2, 0x98C2, 0x4A04, 0x98C3, 0x1C20,
- 0x98C4, 0x1C1F, 0x98C5, 0x4E14, 0x98C6, 0x1C21, 0x98C7, 0x4A05,
- 0x98C8, 0x3BC3, 0x98CB, 0x4A06, 0x98DB, 0x0D88, 0x98DC, 0x1839,
- 0x98DF, 0x09EF, 0x98E0, 0x3618, 0x98E1, 0x4A07, 0x98E2, 0x064C,
- 0x98E3, 0x4A08, 0x98E5, 0x3BC4, 0x98E7, 0x432B, 0x98E9, 0x1C22,
- 0x98EA, 0x4A09, 0x98EB, 0x1C23, 0x98ED, 0x10C1, 0x98EE, 0x14DA,
- 0x98EF, 0x0D67, 0x98F0, 0x4A0A, 0x98F1, 0x4A0B, 0x98F2, 0x04BF,
- 0x98F3, 0x4A0C, 0x98F4, 0x047F, 0x98FC, 0x08C2, 0x98FD, 0x0E5E,
- 0x98FE, 0x09E6, 0x9902, 0x4E15, 0x9903, 0x1C24, 0x9905, 0x0EEB,
- 0x9908, 0x4A0D, 0x9909, 0x1C25, 0x990A, 0x0F46, 0x990C, 0x04E4,
- 0x9910, 0x088F, 0x9911, 0x4E16, 0x9912, 0x1C26, 0x9913, 0x056E,
- 0x9914, 0x1C27, 0x9915, 0x4E17, 0x9916, 0x4A10, 0x9917, 0x4A11,
- 0x9918, 0x1C28, 0x991A, 0x4A13, 0x991B, 0x4A14, 0x991C, 0x4A15,
- 0x991D, 0x1C2A, 0x991E, 0x1C2B, 0x9920, 0x1C2D, 0x9921, 0x1C29,
- 0x9924, 0x1C2C, 0x9927, 0x21FD, 0x9928, 0x0617, 0x992C, 0x1C2E,
- 0x992E, 0x1C2F, 0x9931, 0x4A17, 0x9932, 0x3BC5, 0x9933, 0x3BC6,
- 0x9935, 0x4E18, 0x993A, 0x4A18, 0x993B, 0x4A19, 0x993C, 0x4A1A,
- 0x993D, 0x1C30, 0x993E, 0x1C31, 0x9940, 0x3BC7, 0x9941, 0x4A1B,
- 0x9942, 0x1C32, 0x9945, 0x1C34, 0x9946, 0x4A1C, 0x9948, 0x4E19,
- 0x9949, 0x1C33, 0x994B, 0x1C36, 0x994C, 0x1C39, 0x994D, 0x3BC8,
- 0x994E, 0x4A1D, 0x9950, 0x1C35, 0x9951, 0x1C37, 0x9952, 0x1C38,
- 0x9954, 0x4E1A, 0x9955, 0x1C3A, 0x9957, 0x06BA, 0x9958, 0x432C,
- 0x995C, 0x3BC9, 0x995E, 0x4E1B, 0x995F, 0x3BCA, 0x9960, 0x4A1E,
- 0x9996, 0x091F, 0x9997, 0x1C3B, 0x9998, 0x1C3C, 0x9999, 0x07F3,
- 0x999E, 0x21FF, 0x99A3, 0x4A1F, 0x99A5, 0x1C3D, 0x99A6, 0x4A20,
- 0x99A8, 0x059C, 0x99AC, 0x0D05, 0x99AD, 0x1C3E, 0x99AE, 0x1C3F,
- 0x99B1, 0x3BCB, 0x99B3, 0x0B98, 0x99B4, 0x0CC3, 0x99B9, 0x3BCC,
- 0x99BA, 0x3BCD, 0x99BC, 0x1C40, 0x99BD, 0x4A21, 0x99BF, 0x4A22,
- 0x99C1, 0x0D33, 0x99C3, 0x4A23, 0x99C4, 0x0B2C, 0x99C5, 0x04FA,
- 0x99C6, 0x06E6, 0x99C8, 0x06E7, 0x99C9, 0x3BCE, 0x99D0, 0x0BB1,
- 0x99D1, 0x1C45, 0x99D2, 0x06E8, 0x99D4, 0x4A24, 0x99D5, 0x056F,
- 0x99D8, 0x1C44, 0x99D9, 0x4A25, 0x99DB, 0x1C42, 0x99DD, 0x1C43,
- 0x99DE, 0x4A26, 0x99DF, 0x1C41, 0x99E1, 0x4E1C, 0x99E2, 0x1C4F,
- 0x99ED, 0x1C46, 0x99EE, 0x1C47, 0x99F0, 0x4A28, 0x99F1, 0x1C48,
- 0x99F2, 0x1C49, 0x99F8, 0x1C4B, 0x99F9, 0x4A29, 0x99FB, 0x1C4A,
- 0x99FC, 0x4A2A, 0x99FF, 0x0963, 0x9A01, 0x1C4C, 0x9A02, 0x3BCF,
- 0x9A03, 0x432D, 0x9A05, 0x1C4E, 0x9A08, 0x37BA, 0x9A0A, 0x4A2B,
- 0x9A0C, 0x4E1D, 0x9A0E, 0x064D, 0x9A0F, 0x1C4D, 0x9A10, 0x4E1E,
- 0x9A11, 0x4A2C, 0x9A12, 0x0AFD, 0x9A13, 0x0767, 0x9A16, 0x3BD0,
- 0x9A19, 0x1C50, 0x9A1A, 0x4A2D, 0x9A20, 0x4A2E, 0x9A23, 0x4E1F,
- 0x9A24, 0x3BD1, 0x9A27, 0x3BD2, 0x9A28, 0x0B2D, 0x9A2B, 0x1C51,
- 0x9A2D, 0x3BD3, 0x9A2E, 0x3BD4, 0x9A30, 0x0C85, 0x9A31, 0x4A2F,
- 0x9A36, 0x3BD5, 0x9A37, 0x1C52, 0x9A38, 0x3BD6, 0x9A3E, 0x1C57,
- 0x9A40, 0x1C55, 0x9A41, 0x4E20, 0x9A42, 0x1C54, 0x9A43, 0x1C56,
- 0x9A44, 0x4A30, 0x9A45, 0x1C53, 0x9A4A, 0x3BD7, 0x9A4C, 0x4A31,
- 0x9A4D, 0x1C59, 0x9A4E, 0x2200, 0x9A51, 0x4E21, 0x9A52, 0x1E2F,
- 0x9A55, 0x1C58, 0x9A56, 0x3BD8, 0x9A57, 0x1C5B, 0x9A58, 0x4A32,
- 0x9A5A, 0x06BB, 0x9A5B, 0x1C5A, 0x9A5F, 0x1C5C, 0x9A62, 0x1C5D,
- 0x9A64, 0x1C5F, 0x9A65, 0x1C5E, 0x9A69, 0x1C60, 0x9A6A, 0x1C62,
- 0x9A6B, 0x1C61, 0x9AA8, 0x080E, 0x9AAD, 0x1C63, 0x9AAF, 0x4A34,
- 0x9AB0, 0x1C64, 0x9AB5, 0x3BD9, 0x9AB6, 0x3BDA, 0x9AB7, 0x4A36,
- 0x9AB8, 0x059A, 0x9AB9, 0x4A38, 0x9ABC, 0x1C65, 0x9ABD, 0x4E22,
- 0x9ABE, 0x4E23, 0x9AC0, 0x1C66, 0x9AC1, 0x432E, 0x9AC3, 0x432F,
- 0x9AC4, 0x0A37, 0x9AC6, 0x4A3A, 0x9ACE, 0x4330, 0x9ACF, 0x1C67,
- 0x9AD0, 0x4A3B, 0x9AD1, 0x1C68, 0x9AD2, 0x4A3C, 0x9AD3, 0x1C69,
- 0x9AD4, 0x1C6A, 0x9AD5, 0x4A3D, 0x9AD6, 0x4331, 0x9AD8, 0x07F4,
- 0x9AD9, 0x2201, 0x9ADC, 0x2202, 0x9ADE, 0x1C6B, 0x9ADF, 0x1C6C,
- 0x9AE0, 0x4A3E, 0x9AE2, 0x1C6D, 0x9AE3, 0x1C6E, 0x9AE5, 0x4A3F,
- 0x9AE6, 0x1C6F, 0x9AE9, 0x4A40, 0x9AEA, 0x0D45, 0x9AEB, 0x1C71,
- 0x9AED, 0x0D98, 0x9AEE, 0x1C72, 0x9AEF, 0x1C70, 0x9AF1, 0x1C74,
- 0x9AF4, 0x1C73, 0x9AF7, 0x1C75, 0x9AF9, 0x3BDB, 0x9AFB, 0x1C76,
- 0x9B01, 0x4E24, 0x9B02, 0x4332, 0x9B03, 0x3BDC, 0x9B06, 0x1C77,
- 0x9B08, 0x4333, 0x9B09, 0x4E25, 0x9B0B, 0x4E26, 0x9B0C, 0x4A41,
- 0x9B0D, 0x4E27, 0x9B0E, 0x4E28, 0x9B10, 0x4A42, 0x9B12, 0x4A43,
- 0x9B16, 0x4A44, 0x9B18, 0x1C78, 0x9B19, 0x4E29, 0x9B1A, 0x1C79,
- 0x9B1C, 0x4A45, 0x9B1D, 0x4F49, 0x9B1F, 0x1C7A, 0x9B20, 0x3BDD,
- 0x9B22, 0x1C7B, 0x9B23, 0x1C7C, 0x9B25, 0x1C7D, 0x9B27, 0x1C7E,
- 0x9B28, 0x1C7F, 0x9B29, 0x1C80, 0x9B2A, 0x1C81, 0x9B2B, 0x4A46,
- 0x9B2C, 0x4F4A, 0x9B2D, 0x4335, 0x9B2E, 0x1C82, 0x9B2F, 0x1C83,
- 0x9B31, 0x14D4, 0x9B32, 0x1C84, 0x9B33, 0x3BDE, 0x9B34, 0x3BDF,
- 0x9B35, 0x4E2A, 0x9B3B, 0x17A9, 0x9B3C, 0x064E, 0x9B3D, 0x4A47,
- 0x9B41, 0x057F, 0x9B42, 0x0822, 0x9B43, 0x1C86, 0x9B44, 0x1C85,
- 0x9B45, 0x0EB1, 0x9B48, 0x4E2B, 0x9B4B, 0x4A49, 0x9B4D, 0x1C88,
- 0x9B4E, 0x1C89, 0x9B4F, 0x1C87, 0x9B51, 0x1C8A, 0x9B54, 0x0E90,
- 0x9B55, 0x4E2C, 0x9B58, 0x1C8B, 0x9B5A, 0x0695, 0x9B5E, 0x4336,
- 0x9B63, 0x4A4A, 0x9B65, 0x4A4B, 0x9B66, 0x4337, 0x9B68, 0x4E2D,
- 0x9B6B, 0x4A4C, 0x9B6C, 0x4A4D, 0x9B6F, 0x0FCB, 0x9B72, 0x2204,
- 0x9B73, 0x3BE0, 0x9B74, 0x1C8C, 0x9B75, 0x2203, 0x9B76, 0x4A4E,
- 0x9B77, 0x4A4F, 0x9B79, 0x3BE1, 0x9B80, 0x4E2E, 0x9B83, 0x1C8E,
- 0x9B84, 0x4338, 0x9B86, 0x4E2F, 0x9B8A, 0x4339, 0x9B8E, 0x0482,
- 0x9B8F, 0x2205, 0x9B90, 0x4E30, 0x9B91, 0x1C8F, 0x9B92, 0x0DFB,
- 0x9B93, 0x1C8D, 0x9B96, 0x1C90, 0x9B97, 0x1C91, 0x9B9D, 0x4E31,
- 0x9B9E, 0x433A, 0x9B9F, 0x1C92, 0x9BA0, 0x1C93, 0x9BA6, 0x4A50,
- 0x9BA7, 0x3BE2, 0x9BA8, 0x1C94, 0x9BAA, 0x0E9C, 0x9BAB, 0x087B,
- 0x9BAC, 0x4A51, 0x9BAD, 0x086A, 0x9BAE, 0x0AB1, 0x9BB0, 0x4E32,
- 0x9BB1, 0x2206, 0x9BB2, 0x4A53, 0x9BB4, 0x1C95, 0x9BB8, 0x4A54,
- 0x9BB9, 0x1C98, 0x9BBB, 0x2207, 0x9BBE, 0x4A55, 0x9BBF, 0x4E33,
- 0x9BC0, 0x1C96, 0x9BC1, 0x3BE3, 0x9BC6, 0x1C99, 0x9BC7, 0x3BE4,
- 0x9BC8, 0x4E34, 0x9BC9, 0x07A5, 0x9BCA, 0x1C97, 0x9BCE, 0x433B,
- 0x9BCF, 0x1C9A, 0x9BD1, 0x1C9B, 0x9BD2, 0x1C9C, 0x9BD4, 0x1CA0,
- 0x9BD6, 0x0878, 0x9BD7, 0x3BE5, 0x9BD8, 0x4A57, 0x9BDB, 0x0B44,
- 0x9BDD, 0x4A58, 0x9BDF, 0x37BF, 0x9BE1, 0x1CA1, 0x9BE2, 0x1C9E,
- 0x9BE3, 0x1C9D, 0x9BE4, 0x1C9F, 0x9BE5, 0x433C, 0x9BE7, 0x3BE6,
- 0x9BE8, 0x0735, 0x9BEA, 0x4A59, 0x9BEB, 0x3BE7, 0x9BEE, 0x4A5B,
- 0x9BEF, 0x4A5A, 0x9BF0, 0x1CA5, 0x9BF1, 0x1CA4, 0x9BF2, 0x1CA3,
- 0x9BF3, 0x4A56, 0x9BF5, 0x0477, 0x9BF7, 0x3BE8, 0x9BF8, 0x433D,
- 0x9BFA, 0x3BE9, 0x9BFD, 0x3BEA, 0x9BFF, 0x4E35, 0x9C00, 0x2208,
- 0x9C02, 0x4E36, 0x9C04, 0x1CAF, 0x9C06, 0x1CAB, 0x9C08, 0x1CAC,
- 0x9C09, 0x1CA8, 0x9C0A, 0x1CAE, 0x9C0B, 0x3BEB, 0x9C0C, 0x1CAA,
- 0x9C0D, 0x05C0, 0x9C10, 0x0FF2, 0x9C12, 0x1CAD, 0x9C13, 0x1CA9,
- 0x9C14, 0x1CA7, 0x9C15, 0x1CA6, 0x9C16, 0x4A5F, 0x9C18, 0x4A60,
- 0x9C19, 0x4A61, 0x9C1A, 0x4A62, 0x9C1B, 0x1CB1, 0x9C1C, 0x4E37,
- 0x9C1D, 0x4A63, 0x9C21, 0x1CB4, 0x9C22, 0x4A64, 0x9C23, 0x433E,
- 0x9C24, 0x1CB3, 0x9C25, 0x1CB2, 0x9C27, 0x3BEC, 0x9C29, 0x4A65,
- 0x9C2A, 0x3BED, 0x9C2D, 0x0DBB, 0x9C2E, 0x1CB0, 0x9C2F, 0x04B7,
- 0x9C30, 0x1CB5, 0x9C31, 0x4A67, 0x9C32, 0x1CB7, 0x9C35, 0x4E38,
- 0x9C36, 0x3BEE, 0x9C37, 0x4A68, 0x9C39, 0x05CD, 0x9C3A, 0x1CA2,
- 0x9C3B, 0x04D9, 0x9C3E, 0x1CB9, 0x9C41, 0x3BEF, 0x9C44, 0x4E39,
- 0x9C45, 0x4A69, 0x9C46, 0x1CB8, 0x9C47, 0x1CB6, 0x9C48, 0x0B6B,
- 0x9C49, 0x4A6C, 0x9C4A, 0x4A6D, 0x9C4F, 0x433F, 0x9C50, 0x4340,
- 0x9C52, 0x0E9E, 0x9C53, 0x3BF0, 0x9C54, 0x4A6F, 0x9C56, 0x4E3A,
- 0x9C57, 0x0FA2, 0x9C58, 0x4A70, 0x9C5A, 0x1CBA, 0x9C5B, 0x4A71,
- 0x9C5C, 0x4A6A, 0x9C5D, 0x4A72, 0x9C5F, 0x4A73, 0x9C60, 0x1CBB,
- 0x9C61, 0x4E3B, 0x9C63, 0x3BF1, 0x9C65, 0x4341, 0x9C67, 0x1CBC,
- 0x9C68, 0x4E3C, 0x9C69, 0x4A74, 0x9C6A, 0x4A75, 0x9C6B, 0x4A76,
- 0x9C6D, 0x4A77, 0x9C6E, 0x4A78, 0x9C70, 0x3BF2, 0x9C72, 0x4A79,
- 0x9C75, 0x4A7A, 0x9C76, 0x1CBD, 0x9C77, 0x3BF3, 0x9C78, 0x1CBE,
- 0x9C7A, 0x4A7B, 0x9CE5, 0x0BD7, 0x9CE6, 0x4A7C, 0x9CE7, 0x1CBF,
- 0x9CE9, 0x0D4B, 0x9CEB, 0x1CC4, 0x9CEC, 0x1CC0, 0x9CF0, 0x1CC1,
- 0x9CF2, 0x4A7D, 0x9CF3, 0x0E5F, 0x9CF4, 0x0ED0, 0x9CF6, 0x0CA8,
- 0x9D02, 0x3BF4, 0x9D03, 0x1CC5, 0x9D06, 0x1CC6, 0x9D07, 0x0C96,
- 0x9D08, 0x1CC3, 0x9D09, 0x1CC2, 0x9D0B, 0x4A7E, 0x9D0E, 0x052A,
- 0x9D11, 0x4A80, 0x9D12, 0x1CCE, 0x9D15, 0x1CCD, 0x9D17, 0x4A81,
- 0x9D18, 0x4A82, 0x9D1B, 0x0517, 0x9D1D, 0x4342, 0x9D1E, 0x4343,
- 0x9D1F, 0x1CCB, 0x9D23, 0x1CCA, 0x9D26, 0x1CC8, 0x9D28, 0x05D9,
- 0x9D2A, 0x1CC7, 0x9D2B, 0x08DE, 0x9D2C, 0x0529, 0x9D30, 0x4E3D,
- 0x9D32, 0x4A86, 0x9D3B, 0x07F5, 0x9D3D, 0x4E3E, 0x9D3E, 0x1CD1,
- 0x9D3F, 0x1CD0, 0x9D41, 0x1CCF, 0x9D42, 0x3BF5, 0x9D43, 0x4344,
- 0x9D44, 0x1CCC, 0x9D46, 0x1CD2, 0x9D47, 0x3BF6, 0x9D48, 0x1CD3,
- 0x9D4A, 0x4A88, 0x9D50, 0x1CD8, 0x9D51, 0x1CD7, 0x9D52, 0x4345,
- 0x9D59, 0x1CD9, 0x9D5C, 0x04CF, 0x9D5D, 0x1CD4, 0x9D5E, 0x1CD5,
- 0x9D5F, 0x4A89, 0x9D60, 0x0806, 0x9D61, 0x0EC5, 0x9D62, 0x4A8A,
- 0x9D63, 0x3BF7, 0x9D64, 0x1CD6, 0x9D69, 0x3BF8, 0x9D6A, 0x4E3F,
- 0x9D6B, 0x220A, 0x9D6C, 0x0E60, 0x9D6F, 0x1CDE, 0x9D70, 0x2209,
- 0x9D72, 0x1CDA, 0x9D73, 0x4A8D, 0x9D76, 0x4A8E, 0x9D77, 0x4A8F,
- 0x9D7A, 0x1CDF, 0x9D7B, 0x4E40, 0x9D7C, 0x3BF9, 0x9D7E, 0x3BFA,
- 0x9D84, 0x4A90, 0x9D87, 0x1CDC, 0x9D89, 0x1CDB, 0x9D8A, 0x4346,
- 0x9D8D, 0x3BFB, 0x9D8F, 0x0732, 0x9D96, 0x4347, 0x9D99, 0x4A91,
- 0x9D9A, 0x1CE0, 0x9DA1, 0x4A92, 0x9DA4, 0x1CE1, 0x9DA9, 0x1CE2,
- 0x9DAB, 0x1CDD, 0x9DAC, 0x4349, 0x9DAF, 0x1CC9, 0x9DB1, 0x3BFC,
- 0x9DB2, 0x1CE3, 0x9DB4, 0x0BFD, 0x9DB5, 0x4A94, 0x9DB8, 0x1CE7,
- 0x9DB9, 0x4A95, 0x9DBA, 0x1CE8, 0x9DBB, 0x1CE6, 0x9DBC, 0x434A,
- 0x9DBD, 0x4A96, 0x9DBF, 0x4A93, 0x9DC0, 0x4348, 0x9DC1, 0x1CE5,
- 0x9DC2, 0x1CEB, 0x9DC3, 0x3BFD, 0x9DC4, 0x1CE4, 0x9DC6, 0x1CE9,
- 0x9DC7, 0x3BFE, 0x9DC9, 0x4A97, 0x9DCF, 0x1CEA, 0x9DD3, 0x1CED,
- 0x9DD6, 0x3BFF, 0x9DD7, 0x1DDE, 0x9DD9, 0x1CEC, 0x9DDA, 0x4A98,
- 0x9DDF, 0x3C00, 0x9DE0, 0x4A99, 0x9DE3, 0x4A9A, 0x9DE5, 0x4E41,
- 0x9DE6, 0x1CEF, 0x9DE7, 0x434C, 0x9DE9, 0x4E42, 0x9DEB, 0x3C01,
- 0x9DED, 0x1CF0, 0x9DEF, 0x1CF1, 0x9DF2, 0x0FEF, 0x9DF3, 0x4E43,
- 0x9DF4, 0x3C02, 0x9DF8, 0x1CEE, 0x9DF9, 0x0B4B, 0x9DFA, 0x085D,
- 0x9DFD, 0x1CF2, 0x9E02, 0x4A9D, 0x9E07, 0x434D, 0x9E0A, 0x4A9C,
- 0x9E0D, 0x4A9E, 0x9E15, 0x3C03, 0x9E19, 0x220C, 0x9E1A, 0x1CF3,
- 0x9E1B, 0x1CF4, 0x9E1C, 0x4A9F, 0x9E1D, 0x3C04, 0x9E1E, 0x1CF5,
- 0x9E75, 0x1CF6, 0x9E78, 0x0768, 0x9E79, 0x1CF7, 0x9E7A, 0x4E44,
- 0x9E7B, 0x4AA0, 0x9E7C, 0x1DFD, 0x9E7D, 0x1CF8, 0x9E7F, 0x08DB,
- 0x9E80, 0x4AA2, 0x9E81, 0x1CF9, 0x9E82, 0x4E45, 0x9E83, 0x4E46,
- 0x9E84, 0x4E47, 0x9E85, 0x4AA3, 0x9E88, 0x1CFA, 0x9E8B, 0x1CFB,
- 0x9E8C, 0x1CFC, 0x9E91, 0x1CFF, 0x9E92, 0x1CFD, 0x9E93, 0x0FE2,
- 0x9E95, 0x1CFE, 0x9E97, 0x0FB7, 0x9E9B, 0x4AA4, 0x9E9D, 0x1D00,
- 0x9E9E, 0x434E, 0x9E9F, 0x0FA3, 0x9EA4, 0x3C05, 0x9EA5, 0x1D01,
- 0x9EA6, 0x0D34, 0x9EA8, 0x3C06, 0x9EA9, 0x1D02, 0x9EAA, 0x1D04,
- 0x9EAC, 0x3C07, 0x9EAD, 0x1D05, 0x9EAF, 0x434F, 0x9EB0, 0x4E48,
- 0x9EB4, 0x1E02, 0x9EB5, 0x1E75, 0x9EB8, 0x1D03, 0x9EB9, 0x07FF,
- 0x9EBA, 0x0ED9, 0x9EBB, 0x0E91, 0x9EBC, 0x1284, 0x9EBD, 0x4AA6,
- 0x9EBE, 0x14FF, 0x9EBF, 0x0EA9, 0x9EC3, 0x340B, 0x9EC4, 0x052B,
- 0x9ECC, 0x1D07, 0x9ECD, 0x066A, 0x9ECE, 0x1D08, 0x9ECF, 0x1D09,
- 0x9ED0, 0x1D0A, 0x9ED1, 0x220D, 0x9ED2, 0x0807, 0x9ED4, 0x1D0B,
- 0x9ED8, 0x160D, 0x9ED9, 0x0EE7, 0x9EDB, 0x0B43, 0x9EDC, 0x1D0C,
- 0x9EDD, 0x1D0E, 0x9EDE, 0x1D0D, 0x9EDF, 0x4AA8, 0x9EE0, 0x1D0F,
- 0x9EE4, 0x4E49, 0x9EE5, 0x1D10, 0x9EE7, 0x3C08, 0x9EE8, 0x1D11,
- 0x9EEE, 0x3C09, 0x9EEF, 0x1D12, 0x9EF0, 0x4E4A, 0x9EF2, 0x4E4B,
- 0x9EF4, 0x1D13, 0x9EF6, 0x1D14, 0x9EF7, 0x1D15, 0x9EF9, 0x1D16,
- 0x9EFB, 0x1D17, 0x9EFC, 0x1D18, 0x9EFD, 0x1D19, 0x9EFF, 0x4AA9,
- 0x9F02, 0x4AAA, 0x9F03, 0x4AAC, 0x9F07, 0x1D1A, 0x9F08, 0x1D1B,
- 0x9F09, 0x4E4C, 0x9F0E, 0x0C1E, 0x9F0F, 0x4E4D, 0x9F10, 0x3C0A,
- 0x9F12, 0x3C0B, 0x9F13, 0x0791, 0x9F14, 0x4E4E, 0x9F15, 0x1D1D,
- 0x9F17, 0x3C0C, 0x9F19, 0x3C0D, 0x9F1B, 0x4E4F, 0x9F20, 0x0ACF,
- 0x9F21, 0x1D1E, 0x9F22, 0x4E50, 0x9F26, 0x4E51, 0x9F2A, 0x4E52,
- 0x9F2B, 0x4E53, 0x9F2C, 0x1D1F, 0x9F2F, 0x3C0E, 0x9F34, 0x4E54,
- 0x9F37, 0x3C0F, 0x9F39, 0x3C10, 0x9F3A, 0x4AAD, 0x9F3B, 0x0D93,
- 0x9F3D, 0x4AAE, 0x9F3E, 0x1D20, 0x9F41, 0x3C11, 0x9F45, 0x3C12,
- 0x9F46, 0x4AAF, 0x9F4A, 0x1D21, 0x9F4B, 0x170A, 0x9F4E, 0x1A7B,
- 0x9F4F, 0x1C06, 0x9F52, 0x1D22, 0x9F53, 0x4AB0, 0x9F54, 0x1D23,
- 0x9F55, 0x4AB1, 0x9F57, 0x3C13, 0x9F58, 0x4AB2, 0x9F5A, 0x4E55,
- 0x9F5D, 0x4AB4, 0x9F5F, 0x1D25, 0x9F60, 0x1D26, 0x9F61, 0x1D27,
- 0x9F62, 0x0FB8, 0x9F63, 0x1D24, 0x9F66, 0x1D28, 0x9F67, 0x1D29,
- 0x9F68, 0x3C14, 0x9F69, 0x4AB6, 0x9F6A, 0x1D2B, 0x9F6C, 0x1D2A,
- 0x9F6D, 0x4AB7, 0x9F6F, 0x4E56, 0x9F70, 0x4AB8, 0x9F71, 0x3C15,
- 0x9F72, 0x1D2D, 0x9F75, 0x3C16, 0x9F76, 0x1D2E, 0x9F77, 0x1D2C,
- 0x9F8D, 0x0F7E, 0x9F90, 0x3C17, 0x9F94, 0x3C18, 0x9F95, 0x1D2F,
- 0x9F97, 0x4350, 0x9F9C, 0x1D30, 0x9F9D, 0x1727, 0x9F9E, 0x4E57,
- 0x9FA0, 0x1D31, 0x9FA2, 0x3C19, 0x9FA5, 0x4E58, 0xF860, 0x3C54,
- 0xF861, 0x3C55, 0xF862, 0x3C56, 0xF87A, 0x3C57, 0xF87F, 0x3C58,
- 0xF909, 0x35AB, 0xF91D, 0x3450, 0xF91F, 0x3704, 0xF928, 0x4F4F,
- 0xF929, 0x4F51, 0xF936, 0x3452, 0xF95F, 0x3693, 0xF970, 0x3420,
- 0xF983, 0x3708, 0xF992, 0x1E81, 0xF993, 0x1E82, 0xF999, 0x1E83,
- 0xF99A, 0x3711, 0xF9A2, 0x370F, 0xF9C3, 0x1E80, 0xF9D0, 0x3454,
- 0xF9DC, 0x3451, 0xF9EC, 0x1E46, 0xFA03, 0x3684, 0xFA0E, 0x20DA,
- 0xFA0F, 0x20E5, 0xFA10, 0x1E42, 0xFA11, 0x37D2, 0xFA12, 0x2121,
- 0xFA13, 0x2131, 0xFA14, 0x2133, 0xFA15, 0x4F53, 0xFA16, 0x2164,
- 0xFA17, 0x217B, 0xFA18, 0x2183, 0xFA19, 0x2184, 0xFA1A, 0x2185,
- 0xFA1B, 0x2187, 0xFA1C, 0x218B, 0xFA1D, 0x218E, 0xFA1E, 0x2197,
- 0xFA1F, 0x21A2, 0xFA20, 0x21A4, 0xFA21, 0x21A5, 0xFA22, 0x21AE,
- 0xFA23, 0x21B6, 0xFA24, 0x4948, 0xFA25, 0x21B9, 0xFA26, 0x21BC,
- 0xFA27, 0x21D8, 0xFA28, 0x21DF, 0xFA29, 0x21EF, 0xFA2A, 0x21FB,
- 0xFA2B, 0x21FC, 0xFA2C, 0x21FE, 0xFA2D, 0x220B, 0xFA30, 0x3446,
- 0xFA31, 0x3430, 0xFA32, 0x344D, 0xFA33, 0x3449, 0xFA34, 0x341A,
- 0xFA35, 0x3442, 0xFA36, 0x1DE3, 0xFA37, 0x3436, 0xFA38, 0x3415,
- 0xFA39, 0x3448, 0xFA3A, 0x344B, 0xFA3B, 0x3431, 0xFA3C, 0x41C5,
- 0xFA3D, 0x340E, 0xFA3E, 0x3410, 0xFA3F, 0x3433, 0xFA40, 0x3439,
- 0xFA41, 0x3445, 0xFA42, 0x3416, 0xFA43, 0x3428, 0xFA44, 0x343F,
- 0xFA45, 0x340F, 0xFA46, 0x1E14, 0xFA47, 0x3414, 0xFA48, 0x3423,
- 0xFA49, 0x3C26, 0xFA4A, 0x1E34, 0xFA4B, 0x3443, 0xFA4C, 0x3424,
- 0xFA4D, 0x3421, 0xFA4E, 0x3417, 0xFA4F, 0x344F, 0xFA50, 0x342F,
- 0xFA51, 0x3427, 0xFA52, 0x340D, 0xFA53, 0x343B, 0xFA54, 0x341F,
- 0xFA55, 0x343D, 0xFA56, 0x342E, 0xFA57, 0x3457, 0xFA58, 0x47BE,
- 0xFA59, 0x3440, 0xFA5A, 0x3429, 0xFA5B, 0x3425, 0xFA5C, 0x3426,
- 0xFA5D, 0x3777, 0xFA5E, 0x3776, 0xFA5F, 0x3437, 0xFA60, 0x3413,
- 0xFA61, 0x3422, 0xFA62, 0x3409, 0xFA63, 0x341B, 0xFA64, 0x3444,
- 0xFA65, 0x3434, 0xFA66, 0x3C2B, 0xFA67, 0x3408, 0xFA68, 0x343E,
- 0xFA69, 0x3419, 0xFA6A, 0x1E6C, 0xFB00, 0x248E, 0xFB01, 0x0070,
- 0xFB02, 0x0071, 0xFB03, 0x248F, 0xFB04, 0x2490, 0xFE30, 0x1EDA,
- 0xFE31, 0x1ED4, 0xFE32, 0x1ED5, 0xFE33, 0x1ED2, 0xFE35, 0x1EDB,
- 0xFE36, 0x1EDC, 0xFE37, 0x1EE1, 0xFE38, 0x1EE2, 0xFE39, 0x1EDD,
- 0xFE3A, 0x1EDE, 0xFE3B, 0x1EEB, 0xFE3C, 0x1EEC, 0xFE3D, 0x1EE5,
- 0xFE3E, 0x1EE6, 0xFE3F, 0x1EE3, 0xFE40, 0x1EE4, 0xFE41, 0x1EE7,
- 0xFE42, 0x1EE8, 0xFE43, 0x1EE9, 0xFE44, 0x1EEA, 0xFE45, 0x315F,
- 0xFE46, 0x3160, 0xFE47, 0x1EDF, 0xFE48, 0x1EE0, 0xFF01, 0x0282,
- 0xFF02, 0x1F47, 0xFF03, 0x02CC, 0xFF04, 0x02C8, 0xFF05, 0x02CB,
- 0xFF06, 0x02CD, 0xFF07, 0x1F46, 0xFF08, 0x02A2, 0xFF09, 0x02A3,
- 0xFF0A, 0x02CE, 0xFF0B, 0x02B4, 0xFF0C, 0x027C, 0xFF0D, 0x02B5,
- 0xFF0E, 0x027D, 0xFF0F, 0x0297, 0xFF10, 0x030C, 0xFF11, 0x030D,
- 0xFF12, 0x030E, 0xFF13, 0x030F, 0xFF14, 0x0310, 0xFF15, 0x0311,
- 0xFF16, 0x0312, 0xFF17, 0x0313, 0xFF18, 0x0314, 0xFF19, 0x0315,
- 0xFF1A, 0x027F, 0xFF1B, 0x0280, 0xFF1C, 0x02BB, 0xFF1D, 0x02B9,
- 0xFF1E, 0x02BC, 0xFF1F, 0x0281, 0xFF20, 0x02CF, 0xFF21, 0x0316,
- 0xFF22, 0x0317, 0xFF23, 0x0318, 0xFF24, 0x0319, 0xFF25, 0x031A,
- 0xFF26, 0x031B, 0xFF27, 0x031C, 0xFF28, 0x031D, 0xFF29, 0x031E,
- 0xFF2A, 0x031F, 0xFF2B, 0x0320, 0xFF2C, 0x0321, 0xFF2D, 0x0322,
- 0xFF2E, 0x0323, 0xFF2F, 0x0324, 0xFF30, 0x0325, 0xFF31, 0x0326,
- 0xFF32, 0x0327, 0xFF33, 0x0328, 0xFF34, 0x0329, 0xFF35, 0x032A,
- 0xFF36, 0x032B, 0xFF37, 0x032C, 0xFF38, 0x032D, 0xFF39, 0x032E,
- 0xFF3A, 0x032F, 0xFF3B, 0x02A6, 0xFF3C, 0x0298, 0xFF3D, 0x02A7,
- 0xFF3E, 0x0288, 0xFF3F, 0x028A, 0xFF40, 0x0286, 0xFF41, 0x0330,
- 0xFF42, 0x0331, 0xFF43, 0x0332, 0xFF44, 0x0333, 0xFF45, 0x0334,
- 0xFF46, 0x0335, 0xFF47, 0x0336, 0xFF48, 0x0337, 0xFF49, 0x0338,
- 0xFF4A, 0x0339, 0xFF4B, 0x033A, 0xFF4C, 0x033B, 0xFF4D, 0x033C,
- 0xFF4E, 0x033D, 0xFF4F, 0x033E, 0xFF50, 0x033F, 0xFF51, 0x0340,
- 0xFF52, 0x0341, 0xFF53, 0x0342, 0xFF54, 0x0343, 0xFF55, 0x0344,
- 0xFF56, 0x0345, 0xFF57, 0x0346, 0xFF58, 0x0347, 0xFF59, 0x0348,
- 0xFF5A, 0x0349, 0xFF5B, 0x02A8, 0xFF5C, 0x029B, 0xFF5D, 0x02A9,
- 0xFF5E, 0x0299, 0xFF5F, 0x2F63, 0xFF60, 0x2F64, 0xFF61, 0x0147,
- 0xFF62, 0x0148, 0xFF63, 0x0149, 0xFF64, 0x014A, 0xFF65, 0x014B,
- 0xFF66, 0x014C, 0xFF67, 0x014D, 0xFF68, 0x014E, 0xFF69, 0x014F,
- 0xFF6A, 0x0150, 0xFF6B, 0x0151, 0xFF6C, 0x0152, 0xFF6D, 0x0153,
- 0xFF6E, 0x0154, 0xFF6F, 0x0155, 0xFF70, 0x0156, 0xFF71, 0x0157,
- 0xFF72, 0x0158, 0xFF73, 0x0159, 0xFF74, 0x015A, 0xFF75, 0x015B,
- 0xFF76, 0x015C, 0xFF77, 0x015D, 0xFF78, 0x015E, 0xFF79, 0x015F,
- 0xFF7A, 0x0160, 0xFF7B, 0x0161, 0xFF7C, 0x0162, 0xFF7D, 0x0163,
- 0xFF7E, 0x0164, 0xFF7F, 0x0165, 0xFF80, 0x0166, 0xFF81, 0x0167,
- 0xFF82, 0x0168, 0xFF83, 0x0169, 0xFF84, 0x016A, 0xFF85, 0x016B,
- 0xFF86, 0x016C, 0xFF87, 0x016D, 0xFF88, 0x016E, 0xFF89, 0x016F,
- 0xFF8A, 0x0170, 0xFF8B, 0x0171, 0xFF8C, 0x0172, 0xFF8D, 0x0173,
- 0xFF8E, 0x0174, 0xFF8F, 0x0175, 0xFF90, 0x0176, 0xFF91, 0x0177,
- 0xFF92, 0x0178, 0xFF93, 0x0179, 0xFF94, 0x017A, 0xFF95, 0x017B,
- 0xFF96, 0x017C, 0xFF97, 0x017D, 0xFF98, 0x017E, 0xFF99, 0x017F,
- 0xFF9A, 0x0180, 0xFF9B, 0x0181, 0xFF9C, 0x0182, 0xFF9D, 0x0183,
- 0xFF9E, 0x0184, 0xFF9F, 0x0185, 0xFFE0, 0x02C9, 0xFFE1, 0x02CA,
- 0xFFE2, 0x02EF, 0xFFE3, 0x0289, 0xFFE4, 0x1F45, 0xFFE5, 0x02C7,
- 0xFFE8, 0x0143,
-};
-extern const unsigned short g_FXCMAP_UniJIS_UTF16_H_5_DWord[384 * 3] = {
- 0xD840, 0xDC0B, 0x360F, 0xD840, 0xDC89, 0x4351, 0xD840, 0xDC8A, 0x371C,
- 0xD840, 0xDCA2, 0x4358, 0xD840, 0xDCA4, 0x435B, 0xD840, 0xDCB0, 0x3781,
- 0xD840, 0xDCF5, 0x4E59, 0xD840, 0xDD58, 0x4E6B, 0xD840, 0xDDA2, 0x3621,
- 0xD840, 0xDE13, 0x436B, 0xD840, 0xDF2B, 0x4382, 0xD840, 0xDF71, 0x438B,
- 0xD840, 0xDF81, 0x4389, 0xD840, 0xDFF9, 0x438F, 0xD841, 0xDC4A, 0x4391,
- 0xD841, 0xDD09, 0x4393, 0xD841, 0xDDB1, 0x4E70, 0xD841, 0xDDD6, 0x439C,
- 0xD841, 0xDE11, 0x37D6, 0xD841, 0xDE28, 0x3719, 0xD841, 0xDEEC, 0x4E73,
- 0xD841, 0xDF4F, 0x43A0, 0xD842, 0xDC07, 0x43A7, 0xD842, 0xDC3A, 0x43A9,
- 0xD842, 0xDCB9, 0x43AF, 0xD842, 0xDD0E, 0x34D3, 0xD842, 0xDD7C, 0x43B3,
- 0xD842, 0xDD9D, 0x43B4, 0xD842, 0xDE64, 0x35BB, 0xD842, 0xDED3, 0x43B9,
- 0xD842, 0xDF1D, 0x43BC, 0xD842, 0xDF9F, 0x35EB, 0xD842, 0xDFB7, 0x358A,
- 0xD843, 0xDD45, 0x43CF, 0xD843, 0xDD58, 0x4E7A, 0xD843, 0xDDE1, 0x43DD,
- 0xD843, 0xDE64, 0x43EC, 0xD843, 0xDE6D, 0x43E4, 0xD843, 0xDE95, 0x43E3,
- 0xD843, 0xDF5F, 0x43EF, 0xD844, 0xDE01, 0x4406, 0xD844, 0xDE3D, 0x3681,
- 0xD844, 0xDE55, 0x4407, 0xD844, 0xDE74, 0x440D, 0xD844, 0xDE7B, 0x4409,
- 0xD844, 0xDED7, 0x4415, 0xD844, 0xDEE4, 0x4414, 0xD844, 0xDEFD, 0x441B,
- 0xD844, 0xDF1B, 0x41B0, 0xD844, 0xDF36, 0x441D, 0xD844, 0xDF44, 0x441E,
- 0xD844, 0xDFC4, 0x4429, 0xD845, 0xDC6D, 0x4436, 0xD845, 0xDC6E, 0x41B5,
- 0xD845, 0xDDD7, 0x4440, 0xD845, 0xDE47, 0x4448, 0xD845, 0xDEB4, 0x41C6,
- 0xD845, 0xDF06, 0x4454, 0xD845, 0xDF42, 0x4455, 0xD846, 0xDCBD, 0x41C1,
- 0xD846, 0xDDC3, 0x4475, 0xD846, 0xDE1A, 0x1E91, 0xD847, 0xDC56, 0x4483,
- 0xD847, 0xDD2D, 0x4488, 0xD847, 0xDD45, 0x4489, 0xD847, 0xDD62, 0x448B,
- 0xD847, 0xDD78, 0x448A, 0xD847, 0xDD92, 0x4494, 0xD847, 0xDD9C, 0x4490,
- 0xD847, 0xDDA1, 0x448F, 0xD847, 0xDDB7, 0x4497, 0xD847, 0xDDE0, 0x4499,
- 0xD847, 0xDE33, 0x449A, 0xD847, 0xDE34, 0x41CD, 0xD847, 0xDF1E, 0x44A7,
- 0xD847, 0xDF76, 0x44AE, 0xD847, 0xDFFA, 0x44B1, 0xD848, 0xDD7B, 0x44BF,
- 0xD848, 0xDE18, 0x4AA1, 0xD848, 0xDF1E, 0x44C5, 0xD848, 0xDFAD, 0x44C8,
- 0xD849, 0xDE09, 0x3C53, 0xD849, 0xDEF3, 0x44E0, 0xD84A, 0xDC5B, 0x44EF,
- 0xD84A, 0xDCAB, 0x44F5, 0xD84A, 0xDD8F, 0x44F9, 0xD84A, 0xDEB8, 0x4503,
- 0xD84A, 0xDF46, 0x4510, 0xD84A, 0xDF4F, 0x4507, 0xD84A, 0xDF50, 0x4508,
- 0xD84A, 0xDFA6, 0x4513, 0xD84B, 0xDC1D, 0x4512, 0xD84B, 0xDC24, 0x4516,
- 0xD84B, 0xDDE1, 0x452E, 0xD84B, 0xDE42, 0x4E9C, 0xD84B, 0xDFEB, 0x4EA2,
- 0xD84C, 0xDDB6, 0x4550, 0xD84C, 0xDDC3, 0x454E, 0xD84C, 0xDDC4, 0x41F8,
- 0xD84C, 0xDDF5, 0x454F, 0xD84C, 0xDF72, 0x4561, 0xD84C, 0xDFD0, 0x4568,
- 0xD84C, 0xDFD2, 0x4564, 0xD84C, 0xDFD3, 0x4563, 0xD84C, 0xDFD5, 0x456A,
- 0xD84C, 0xDFDA, 0x456C, 0xD84C, 0xDFDF, 0x456E, 0xD84C, 0xDFE4, 0x4569,
- 0xD84C, 0xDFFE, 0x3C3E, 0xD84D, 0xDC4A, 0x4576, 0xD84D, 0xDC4B, 0x4578,
- 0xD84D, 0xDC51, 0x4577, 0xD84D, 0xDC65, 0x457C, 0xD84D, 0xDCE4, 0x4596,
- 0xD84D, 0xDD5A, 0x4597, 0xD84D, 0xDD94, 0x45A3, 0xD84D, 0xDDC4, 0x4209,
- 0xD84D, 0xDE38, 0x45B3, 0xD84D, 0xDE39, 0x45B1, 0xD84D, 0xDE3A, 0x3C21,
- 0xD84D, 0xDE47, 0x45B2, 0xD84D, 0xDF0C, 0x45C7, 0xD84D, 0xDF1C, 0x45BE,
- 0xD84D, 0xDF3F, 0x4212, 0xD84D, 0xDF63, 0x4214, 0xD84D, 0xDF64, 0x45CB,
- 0xD84D, 0xDFE7, 0x45D3, 0xD84D, 0xDFFF, 0x45D2, 0xD84E, 0xDC24, 0x45D8,
- 0xD84E, 0xDC3D, 0x45DD, 0xD84E, 0xDE98, 0x45E9, 0xD84F, 0xDC7F, 0x45F6,
- 0xD84F, 0xDCBE, 0x37D5, 0xD84F, 0xDCFE, 0x3650, 0xD84F, 0xDD00, 0x4605,
- 0xD84F, 0xDD0E, 0x47DA, 0xD84F, 0xDD40, 0x4616, 0xD84F, 0xDDD3, 0x4619,
- 0xD84F, 0xDDF9, 0x4618, 0xD84F, 0xDDFA, 0x4617, 0xD84F, 0xDF7E, 0x463F,
- 0xD850, 0xDC4B, 0x4EC8, 0xD850, 0xDC96, 0x464E, 0xD850, 0xDD03, 0x4653,
- 0xD850, 0xDDC6, 0x465F, 0xD850, 0xDDFE, 0x4662, 0xD850, 0xDEEE, 0x37CA,
- 0xD850, 0xDFBC, 0x4677, 0xD850, 0xDFD0, 0x1E9E, 0xD851, 0xDE29, 0x4681,
- 0xD851, 0xDEA5, 0x4687, 0xD851, 0xDFF1, 0x424A, 0xD852, 0xDC96, 0x469D,
- 0xD852, 0xDE4D, 0x46B8, 0xD852, 0xDF56, 0x46C5, 0xD852, 0xDF6F, 0x46C7,
- 0xD853, 0xDC16, 0x46CC, 0xD853, 0xDD14, 0x36AB, 0xD853, 0xDE04, 0x4E5A,
- 0xD853, 0xDE0E, 0x46EE, 0xD853, 0xDE37, 0x46F2, 0xD853, 0xDE6A, 0x46F7,
- 0xD853, 0xDE8B, 0x46FA, 0xD853, 0xDFF2, 0x4E5B, 0xD854, 0xDC4A, 0x4705,
- 0xD854, 0xDC55, 0x4707, 0xD854, 0xDD22, 0x4709, 0xD854, 0xDDA9, 0x470E,
- 0xD854, 0xDDCD, 0x4711, 0xD854, 0xDDE5, 0x4710, 0xD854, 0xDE1E, 0x4713,
- 0xD854, 0xDE4C, 0x4715, 0xD855, 0xDC2E, 0x4721, 0xD855, 0xDC8E, 0x426D,
- 0xD855, 0xDCD9, 0x4729, 0xD855, 0xDD0E, 0x4271, 0xD855, 0xDDA7, 0x4735,
- 0xD855, 0xDE7F, 0x36FB, 0xD855, 0xDF71, 0x427A, 0xD855, 0xDFA9, 0x4748,
- 0xD855, 0xDFB4, 0x4749, 0xD856, 0xDC74, 0x1DF6, 0xD856, 0xDDC4, 0x4280,
- 0xD856, 0xDDCC, 0x4E90, 0xD856, 0xDDD4, 0x475C, 0xD856, 0xDEE3, 0x4765,
- 0xD856, 0xDEE4, 0x4764, 0xD856, 0xDEF1, 0x4766, 0xD856, 0xDFB2, 0x4775,
- 0xD857, 0xDC4B, 0x477E, 0xD857, 0xDC64, 0x477F, 0xD857, 0xDDA1, 0x4289,
- 0xD857, 0xDE2E, 0x478E, 0xD857, 0xDE56, 0x478F, 0xD857, 0xDE62, 0x4792,
- 0xD857, 0xDE65, 0x4790, 0xD857, 0xDEC2, 0x4797, 0xD857, 0xDED8, 0x4795,
- 0xD857, 0xDEE8, 0x4799, 0xD857, 0xDF23, 0x479A, 0xD857, 0xDF5C, 0x479C,
- 0xD857, 0xDFD4, 0x47A3, 0xD857, 0xDFE0, 0x47A2, 0xD857, 0xDFFB, 0x47A9,
- 0xD858, 0xDC0C, 0x47A8, 0xD858, 0xDC17, 0x47B0, 0xD858, 0xDC60, 0x47B3,
- 0xD858, 0xDCED, 0x47BD, 0xD858, 0xDE70, 0x47D1, 0xD858, 0xDE86, 0x47D2,
- 0xD858, 0xDF4C, 0x4F57, 0xD859, 0xDC02, 0x47DE, 0xD859, 0xDE7E, 0x47F0,
- 0xD859, 0xDEB0, 0x3714, 0xD859, 0xDF1D, 0x47FE, 0xD85A, 0xDCDD, 0x480C,
- 0xD85A, 0xDCEA, 0x480E, 0xD85A, 0xDD51, 0x354E, 0xD85A, 0xDD6F, 0x4812,
- 0xD85A, 0xDD99, 0x3736, 0xD85A, 0xDDDD, 0x4814, 0xD85A, 0xDE1E, 0x4817,
- 0xD85A, 0xDE58, 0x481B, 0xD85A, 0xDE8C, 0x481F, 0xD85A, 0xDEB7, 0x4822,
- 0xD85A, 0xDEFF, 0x42A7, 0xD85B, 0xDC29, 0x4446, 0xD85B, 0xDC73, 0x484A,
- 0xD85B, 0xDC9E, 0x4EEE, 0xD85B, 0xDCDD, 0x4853, 0xD85B, 0xDE40, 0x42C1,
- 0xD85B, 0xDE65, 0x4860, 0xD85B, 0xDF94, 0x4870, 0xD85B, 0xDFF6, 0x487A,
- 0xD85B, 0xDFF7, 0x487B, 0xD85B, 0xDFF8, 0x4879, 0xD85C, 0xDCF4, 0x42CF,
- 0xD85C, 0xDD0D, 0x488B, 0xD85C, 0xDD39, 0x488E, 0xD85C, 0xDFDA, 0x48B3,
- 0xD85C, 0xDFDB, 0x48B2, 0xD85C, 0xDFFE, 0x48B9, 0xD85D, 0xDC10, 0x48BC,
- 0xD85D, 0xDC49, 0x48C0, 0xD85D, 0xDE14, 0x48CE, 0xD85D, 0xDE15, 0x48CD,
- 0xD85D, 0xDE31, 0x48D0, 0xD85D, 0xDE84, 0x42DD, 0xD85D, 0xDE93, 0x48D5,
- 0xD85D, 0xDF0E, 0x48DA, 0xD85D, 0xDF23, 0x48DC, 0xD85D, 0xDF52, 0x48E0,
- 0xD85E, 0xDD85, 0x48F0, 0xD85E, 0xDDB4, 0x4EA5, 0xD85E, 0xDE84, 0x48FC,
- 0xD85E, 0xDFB3, 0x490B, 0xD85E, 0xDFBE, 0x490D, 0xD85E, 0xDFC7, 0x490E,
- 0xD85F, 0xDC3C, 0x4EFC, 0xD85F, 0xDCB8, 0x4914, 0xD85F, 0xDD73, 0x4E5C,
- 0xD85F, 0xDDA0, 0x491C, 0xD85F, 0xDE10, 0x491E, 0xD85F, 0xDFB7, 0x364A,
- 0xD860, 0xDC8A, 0x4927, 0xD860, 0xDCBB, 0x492D, 0xD860, 0xDE77, 0x42F4,
- 0xD860, 0xDE82, 0x4939, 0xD860, 0xDEF3, 0x493B, 0xD860, 0xDFCD, 0x42FA,
- 0xD861, 0xDC0C, 0x4942, 0xD861, 0xDC55, 0x4945, 0xD861, 0xDD6B, 0x4952,
- 0xD861, 0xDDC8, 0x4955, 0xD861, 0xDDC9, 0x4956, 0xD861, 0xDED7, 0x4960,
- 0xD861, 0xDEFA, 0x4963, 0xD862, 0xDD46, 0x497C, 0xD862, 0xDD49, 0x497B,
- 0xD862, 0xDD6B, 0x4981, 0xD862, 0xDD87, 0x37AD, 0xD862, 0xDD88, 0x4988,
- 0xD862, 0xDDBA, 0x4992, 0xD862, 0xDDBB, 0x4993, 0xD862, 0xDE1E, 0x499B,
- 0xD862, 0xDE29, 0x499C, 0xD862, 0xDE43, 0x49A0, 0xD862, 0xDE71, 0x499F,
- 0xD862, 0xDE99, 0x49A7, 0xD862, 0xDECD, 0x49A8, 0xD862, 0xDEDD, 0x49AF,
- 0xD862, 0xDEE4, 0x49AE, 0xD862, 0xDFC1, 0x49BA, 0xD862, 0xDFEF, 0x49BB,
- 0xD863, 0xDCDD, 0x1DD9, 0xD863, 0xDD10, 0x49C2, 0xD863, 0xDD71, 0x49C3,
- 0xD863, 0xDDFB, 0x49C5, 0xD863, 0xDE17, 0x37B0, 0xD863, 0xDE1F, 0x49C6,
- 0xD863, 0xDE36, 0x49CA, 0xD863, 0xDE89, 0x49CD, 0xD863, 0xDEEB, 0x49CF,
- 0xD863, 0xDEF6, 0x1DF9, 0xD863, 0xDF32, 0x49D1, 0xD863, 0xDFF8, 0x49D7,
- 0xD864, 0xDEA0, 0x49E5, 0xD864, 0xDEB1, 0x49E6, 0xD865, 0xDC90, 0x49F7,
- 0xD865, 0xDDCF, 0x4A00, 0xD865, 0xDE7F, 0x3619, 0xD865, 0xDEF0, 0x4A0F,
- 0xD865, 0xDF19, 0x4A12, 0xD865, 0xDF50, 0x4A16, 0xD866, 0xDCC6, 0x4A27,
- 0xD866, 0xDE72, 0x4A39, 0xD867, 0xDD4B, 0x3595, 0xD867, 0xDDDB, 0x4A52,
- 0xD867, 0xDE15, 0x4A5C, 0xD867, 0xDE3D, 0x4F5B, 0xD867, 0xDE49, 0x4A5E,
- 0xD867, 0xDE8A, 0x4A5D, 0xD867, 0xDEC4, 0x4A66, 0xD867, 0xDEDB, 0x4A6E,
- 0xD867, 0xDEE9, 0x4A6B, 0xD867, 0xDFCE, 0x4A7F, 0xD867, 0xDFD7, 0x4A7F,
- 0xD868, 0xDC1A, 0x4A85, 0xD868, 0xDC2F, 0x4A83, 0xD868, 0xDC82, 0x4A8C,
- 0xD868, 0xDCF9, 0x4A8B, 0xD868, 0xDD90, 0x434B, 0xD868, 0xDEB2, 0x4E68,
- 0xD868, 0xDF8C, 0x4AA5, 0xD869, 0xDC37, 0x4AA7, 0xD869, 0xDDF1, 0x4AB3,
- 0xD869, 0xDE02, 0x4AB5, 0xD869, 0xDE1A, 0x4F5C, 0xD869, 0xDEB2, 0x4AB9,
- 0xD87E, 0xDC04, 0x3C1C, 0xD87E, 0xDC0F, 0x1E86, 0xD87E, 0xDC15, 0x4E5D,
- 0xD87E, 0xDC18, 0x1E89, 0xD87E, 0xDC1A, 0x3682, 0xD87E, 0xDC22, 0x3574,
- 0xD87E, 0xDC28, 0x35EF, 0xD87E, 0xDC2C, 0x371D, 0xD87E, 0xDC33, 0x3597,
- 0xD87E, 0xDC3F, 0x35F7, 0xD87E, 0xDC46, 0x4E5E, 0xD87E, 0xDC52, 0x3611,
- 0xD87E, 0xDC62, 0x36AE, 0xD87E, 0xDC6D, 0x3729, 0xD87E, 0xDC73, 0x3608,
- 0xD87E, 0xDC77, 0x1E4A, 0xD87E, 0xDC84, 0x1E36, 0xD87E, 0xDC99, 0x4E5F,
- 0xD87E, 0xDC9A, 0x3668, 0xD87E, 0xDCA6, 0x4E60, 0xD87E, 0xDCAC, 0x35B6,
- 0xD87E, 0xDCB2, 0x362B, 0xD87E, 0xDCB6, 0x3731, 0xD87E, 0xDCD3, 0x1E88,
- 0xD87E, 0xDCDB, 0x373C, 0xD87E, 0xDCDC, 0x1E0F, 0xD87E, 0xDCE1, 0x37D3,
- 0xD87E, 0xDCE5, 0x4E61, 0xD87E, 0xDCEA, 0x356F, 0xD87E, 0xDCED, 0x1DF1,
- 0xD87E, 0xDCFC, 0x3558, 0xD87E, 0xDD03, 0x35C8, 0xD87E, 0xDD0B, 0x35E9,
- 0xD87E, 0xDD0F, 0x366C, 0xD87E, 0xDD1A, 0x365C, 0xD87E, 0xDD20, 0x1E9F,
- 0xD87E, 0xDD21, 0x35F1, 0xD87E, 0xDD45, 0x342D, 0xD87E, 0xDD47, 0x361E,
- 0xD87E, 0xDD6C, 0x3764, 0xD87E, 0xDD95, 0x3566, 0xD87E, 0xDDD0, 0x36F4,
- 0xD87E, 0xDDDE, 0x4E62, 0xD87E, 0xDDDF, 0x36F5, 0xD87E, 0xDDF4, 0x3BA5,
-};
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_UniJIS_UTF16_H_5[13241 * 2] = {
+ 0x0020, 0x0001, 0x0021, 0x0002, 0x0022, 0x0003, 0x0023, 0x0004,
+ 0x0024, 0x0005, 0x0025, 0x0006, 0x0026, 0x0007, 0x0027, 0x0008,
+ 0x0028, 0x0009, 0x0029, 0x000A, 0x002A, 0x000B, 0x002B, 0x000C,
+ 0x002C, 0x000D, 0x002D, 0x000E, 0x002E, 0x000F, 0x002F, 0x0010,
+ 0x0030, 0x0011, 0x0031, 0x0012, 0x0032, 0x0013, 0x0033, 0x0014,
+ 0x0034, 0x0015, 0x0035, 0x0016, 0x0036, 0x0017, 0x0037, 0x0018,
+ 0x0038, 0x0019, 0x0039, 0x001A, 0x003A, 0x001B, 0x003B, 0x001C,
+ 0x003C, 0x001D, 0x003D, 0x001E, 0x003E, 0x001F, 0x003F, 0x0020,
+ 0x0040, 0x0021, 0x0041, 0x0022, 0x0042, 0x0023, 0x0043, 0x0024,
+ 0x0044, 0x0025, 0x0045, 0x0026, 0x0046, 0x0027, 0x0047, 0x0028,
+ 0x0048, 0x0029, 0x0049, 0x002A, 0x004A, 0x002B, 0x004B, 0x002C,
+ 0x004C, 0x002D, 0x004D, 0x002E, 0x004E, 0x002F, 0x004F, 0x0030,
+ 0x0050, 0x0031, 0x0051, 0x0032, 0x0052, 0x0033, 0x0053, 0x0034,
+ 0x0054, 0x0035, 0x0055, 0x0036, 0x0056, 0x0037, 0x0057, 0x0038,
+ 0x0058, 0x0039, 0x0059, 0x003A, 0x005A, 0x003B, 0x005B, 0x003C,
+ 0x005C, 0x0061, 0x005D, 0x003E, 0x005E, 0x003F, 0x005F, 0x0040,
+ 0x0060, 0x0041, 0x0061, 0x0042, 0x0062, 0x0043, 0x0063, 0x0044,
+ 0x0064, 0x0045, 0x0065, 0x0046, 0x0066, 0x0047, 0x0067, 0x0048,
+ 0x0068, 0x0049, 0x0069, 0x004A, 0x006A, 0x004B, 0x006B, 0x004C,
+ 0x006C, 0x004D, 0x006D, 0x004E, 0x006E, 0x004F, 0x006F, 0x0050,
+ 0x0070, 0x0051, 0x0071, 0x0052, 0x0072, 0x0053, 0x0073, 0x0054,
+ 0x0074, 0x0055, 0x0075, 0x0056, 0x0076, 0x0057, 0x0077, 0x0058,
+ 0x0078, 0x0059, 0x0079, 0x005A, 0x007A, 0x005B, 0x007B, 0x005C,
+ 0x007C, 0x0063, 0x007D, 0x005E, 0x007E, 0x0064, 0x00A0, 0x0001,
+ 0x00A1, 0x0065, 0x00A2, 0x0066, 0x00A3, 0x0067, 0x00A4, 0x006B,
+ 0x00A5, 0x003D, 0x00A6, 0x005D, 0x00A7, 0x02D0, 0x00A8, 0x0287,
+ 0x00A9, 0x0098, 0x00AA, 0x008C, 0x00AB, 0x006D, 0x00AC, 0x0099,
+ 0x00AD, 0x0097, 0x00AE, 0x009A, 0x00AF, 0x0081, 0x00B0, 0x02C3,
+ 0x00B1, 0x02B6, 0x00B2, 0x009D, 0x00B3, 0x009E, 0x00B4, 0x0285,
+ 0x00B5, 0x009F, 0x00B6, 0x030A, 0x00B7, 0x0075, 0x00B8, 0x0086,
+ 0x00B9, 0x00A0, 0x00BA, 0x0090, 0x00BB, 0x007B, 0x00BC, 0x00A1,
+ 0x00BD, 0x00A2, 0x00BE, 0x00A3, 0x00BF, 0x007E, 0x00C0, 0x00A4,
+ 0x00C1, 0x00A5, 0x00C2, 0x00A6, 0x00C3, 0x00A7, 0x00C4, 0x00A8,
+ 0x00C5, 0x00A9, 0x00C6, 0x008B, 0x00C7, 0x00AA, 0x00C8, 0x00AB,
+ 0x00C9, 0x00AC, 0x00CA, 0x00AD, 0x00CB, 0x00AE, 0x00CC, 0x00AF,
+ 0x00CD, 0x00B0, 0x00CE, 0x00B1, 0x00CF, 0x00B2, 0x00D0, 0x00B3,
+ 0x00D1, 0x00B4, 0x00D2, 0x00B5, 0x00D3, 0x00B6, 0x00D4, 0x00B7,
+ 0x00D5, 0x00B8, 0x00D6, 0x00B9, 0x00D7, 0x02B7, 0x00D8, 0x008E,
+ 0x00D9, 0x00BB, 0x00DA, 0x00BC, 0x00DB, 0x00BD, 0x00DC, 0x00BE,
+ 0x00DD, 0x00BF, 0x00DE, 0x00C0, 0x00DF, 0x0096, 0x00E0, 0x00C1,
+ 0x00E1, 0x00C2, 0x00E2, 0x00C3, 0x00E3, 0x00C4, 0x00E4, 0x00C5,
+ 0x00E5, 0x00C6, 0x00E6, 0x0091, 0x00E7, 0x00C7, 0x00E8, 0x00C8,
+ 0x00E9, 0x00C9, 0x00EA, 0x00CA, 0x00EB, 0x00CB, 0x00EC, 0x00CC,
+ 0x00ED, 0x00CD, 0x00EE, 0x00CE, 0x00EF, 0x00CF, 0x00F0, 0x00D0,
+ 0x00F1, 0x00D1, 0x00F2, 0x00D2, 0x00F3, 0x00D3, 0x00F4, 0x00D4,
+ 0x00F5, 0x00D5, 0x00F6, 0x00D6, 0x00F7, 0x02B8, 0x00F8, 0x0094,
+ 0x00F9, 0x00D8, 0x00FA, 0x00D9, 0x00FB, 0x00DA, 0x00FC, 0x00DB,
+ 0x00FD, 0x00DC, 0x00FE, 0x00DD, 0x00FF, 0x00DE, 0x0100, 0x2496,
+ 0x0101, 0x2491, 0x0102, 0x3D8C, 0x0103, 0x3D99, 0x0104, 0x3D79,
+ 0x0105, 0x3D81, 0x0106, 0x3D8E, 0x0107, 0x3D9B, 0x0108, 0x3DA7,
+ 0x0109, 0x3DAD, 0x010C, 0x3D8F, 0x010D, 0x3D9C, 0x010E, 0x3D91,
+ 0x010F, 0x3D9E, 0x0111, 0x3D9F, 0x0112, 0x2499, 0x0113, 0x2494,
+ 0x0118, 0x3D90, 0x0119, 0x3D9D, 0x011A, 0x24B3, 0x011B, 0x24BF,
+ 0x011C, 0x3DA8, 0x011D, 0x3DAE, 0x0124, 0x3DA9, 0x0125, 0x3DAF,
+ 0x0127, 0x3DC8, 0x0128, 0x24B8, 0x0129, 0x24C4, 0x012A, 0x2497,
+ 0x012B, 0x2492, 0x0131, 0x0092, 0x0134, 0x3DAA, 0x0135, 0x3DB0,
+ 0x0139, 0x3D8D, 0x013A, 0x3D9A, 0x013D, 0x3D7B, 0x013E, 0x3D83,
+ 0x0141, 0x008D, 0x0142, 0x0093, 0x0143, 0x3D92, 0x0144, 0x3DA0,
+ 0x0147, 0x3D93, 0x0148, 0x3DA1, 0x014B, 0x24DC, 0x014C, 0x249A,
+ 0x014D, 0x2495, 0x0150, 0x3D94, 0x0151, 0x3DA2, 0x0152, 0x008F,
+ 0x0153, 0x0095, 0x0154, 0x3D8B, 0x0155, 0x3D98, 0x0158, 0x3D95,
+ 0x0159, 0x3DA3, 0x015A, 0x3D7C, 0x015B, 0x3D84, 0x015C, 0x3DAB,
+ 0x015D, 0x3DB1, 0x015E, 0x3D7D, 0x015F, 0x3D86, 0x0160, 0x00DF,
+ 0x0161, 0x00E3, 0x0162, 0x3D97, 0x0163, 0x3DA5, 0x0164, 0x3D7E,
+ 0x0165, 0x3D87, 0x0168, 0x24BD, 0x0169, 0x24C9, 0x016A, 0x2498,
+ 0x016B, 0x2493, 0x016C, 0x3DAC, 0x016D, 0x3DB2, 0x016E, 0x24BC,
+ 0x016F, 0x24C8, 0x0170, 0x3D96, 0x0171, 0x3DA4, 0x0178, 0x00E0,
+ 0x0179, 0x3D7F, 0x017A, 0x3D88, 0x017B, 0x3D80, 0x017C, 0x3D8A,
+ 0x017D, 0x00E1, 0x017E, 0x00E5, 0x0192, 0x0069, 0x0193, 0x3DD2,
+ 0x01C2, 0x3DCD, 0x01CD, 0x24B2, 0x01CE, 0x24BE, 0x01CF, 0x24B6,
+ 0x01D0, 0x24C2, 0x01D1, 0x24B9, 0x01D2, 0x24C5, 0x01D3, 0x24BB,
+ 0x01D4, 0x24C7, 0x01D6, 0x3D75, 0x01D8, 0x3D76, 0x01DA, 0x3D77,
+ 0x01DC, 0x3D78, 0x01F8, 0x3D73, 0x01F9, 0x3D74, 0x01FD, 0x24CD,
+ 0x0250, 0x3DD8, 0x0251, 0x24CA, 0x0252, 0x3DDC, 0x0253, 0x3DCE,
+ 0x0254, 0x24CF, 0x0255, 0x3DE1, 0x0256, 0x3DBA, 0x0257, 0x3DCF,
+ 0x0258, 0x3DD5, 0x0259, 0x24D2, 0x025A, 0x24D5, 0x025B, 0x24D8,
+ 0x025C, 0x3DD6, 0x025E, 0x3DD7, 0x025F, 0x3DC1, 0x0260, 0x3DD1,
+ 0x0261, 0x3DC5, 0x0262, 0x3E0B, 0x0263, 0x3E0C, 0x0264, 0x3DDB,
+ 0x0265, 0x3DDE, 0x0266, 0x3DCB, 0x0267, 0x3DE4, 0x0268, 0x3DD3,
+ 0x026A, 0x3E0D, 0x026C, 0x3DB6, 0x026D, 0x3DC0, 0x026E, 0x3DB7,
+ 0x026F, 0x3DD9, 0x0270, 0x3DC6, 0x0271, 0x3DB3, 0x0272, 0x3DC2,
+ 0x0273, 0x3DBB, 0x0274, 0x3E0E, 0x0275, 0x24DD, 0x0276, 0x3E0F,
+ 0x0278, 0x3E10, 0x0279, 0x3DB8, 0x027A, 0x3DE3, 0x027B, 0x3DBF,
+ 0x027D, 0x3DBC, 0x027E, 0x3DB5, 0x0280, 0x3E11, 0x0281, 0x3DC7,
+ 0x0282, 0x3DBD, 0x0283, 0x24E2, 0x0284, 0x3DD0, 0x0288, 0x3DB9,
+ 0x0289, 0x3DD4, 0x028A, 0x3DDA, 0x028B, 0x3DB4, 0x028C, 0x24DE,
+ 0x028D, 0x3DDD, 0x028E, 0x3DC4, 0x028F, 0x3E12, 0x0290, 0x3DBE,
+ 0x0291, 0x3DE2, 0x0292, 0x24E1, 0x0294, 0x3DCA, 0x0295, 0x3DC9,
+ 0x0298, 0x3DCC, 0x0299, 0x3E13, 0x029C, 0x3E14, 0x029D, 0x3DC3,
+ 0x029F, 0x3E15, 0x02A1, 0x3DE0, 0x02A2, 0x3DDF, 0x02B0, 0x3E16,
+ 0x02B2, 0x3E17, 0x02B7, 0x3E18, 0x02BB, 0x0062, 0x02BC, 0x0060,
+ 0x02C1, 0x3E19, 0x02C6, 0x0080, 0x02C7, 0x3D85, 0x02C8, 0x3DE6,
+ 0x02CC, 0x3DE7, 0x02D0, 0x24E3, 0x02D1, 0x3DE8, 0x02D8, 0x3D7A,
+ 0x02D9, 0x3DA6, 0x02DA, 0x0085, 0x02DB, 0x3D82, 0x02DC, 0x005F,
+ 0x02DD, 0x3D89, 0x02DE, 0x3DFB, 0x02E0, 0x3E1A, 0x02E1, 0x3E1B,
+ 0x02E5, 0x3DEB, 0x02E6, 0x3DEC, 0x02E7, 0x3DED, 0x02E8, 0x3DEE,
+ 0x02E9, 0x3DEF, 0x0300, 0x0041, 0x0301, 0x007F, 0x0302, 0x0080,
+ 0x0303, 0x005F, 0x0304, 0x0081, 0x0305, 0x00E2, 0x0306, 0x0082,
+ 0x0307, 0x0083, 0x0308, 0x0084, 0x030A, 0x0085, 0x030B, 0x0087,
+ 0x030C, 0x0089, 0x030F, 0x3DEA, 0x0318, 0x3E02, 0x0319, 0x3E03,
+ 0x031A, 0x3E07, 0x031C, 0x3DF5, 0x031D, 0x3E00, 0x031E, 0x3E01,
+ 0x031F, 0x3DF6, 0x0320, 0x3DF7, 0x0324, 0x3DFC, 0x0325, 0x3DF2,
+ 0x0327, 0x0086, 0x0328, 0x0088, 0x0329, 0x3DF9, 0x032A, 0x3E04,
+ 0x032C, 0x3DF3, 0x032F, 0x3DFA, 0x0330, 0x3DFD, 0x0332, 0x0040,
+ 0x0334, 0x3DFF, 0x0336, 0x008A, 0x0339, 0x3DF4, 0x033A, 0x3E05,
+ 0x033B, 0x3E06, 0x033C, 0x3DFE, 0x033D, 0x3DF8, 0x0361, 0x3DE5,
+ 0x0391, 0x03F3, 0x0392, 0x03F4, 0x0393, 0x03F5, 0x0394, 0x03F6,
+ 0x0395, 0x03F7, 0x0396, 0x03F8, 0x0397, 0x03F9, 0x0398, 0x03FA,
+ 0x0399, 0x03FB, 0x039A, 0x03FC, 0x039B, 0x03FD, 0x039C, 0x03FE,
+ 0x039D, 0x03FF, 0x039E, 0x0400, 0x039F, 0x0401, 0x03A0, 0x0402,
+ 0x03A1, 0x0403, 0x03A3, 0x0404, 0x03A4, 0x0405, 0x03A5, 0x0406,
+ 0x03A6, 0x0407, 0x03A7, 0x0408, 0x03A8, 0x0409, 0x03A9, 0x040A,
+ 0x03B1, 0x040B, 0x03B2, 0x040C, 0x03B3, 0x040D, 0x03B4, 0x040E,
+ 0x03B5, 0x040F, 0x03B6, 0x0410, 0x03B7, 0x0411, 0x03B8, 0x0412,
+ 0x03B9, 0x0413, 0x03BA, 0x0414, 0x03BB, 0x0415, 0x03BC, 0x0416,
+ 0x03BD, 0x0417, 0x03BE, 0x0418, 0x03BF, 0x0419, 0x03C0, 0x041A,
+ 0x03C1, 0x041B, 0x03C2, 0x3F5E, 0x03C3, 0x041C, 0x03C4, 0x041D,
+ 0x03C5, 0x041E, 0x03C6, 0x041F, 0x03C7, 0x0420, 0x03C8, 0x0421,
+ 0x03C9, 0x0422, 0x03D0, 0x2F3A, 0x03D1, 0x2F40, 0x03D5, 0x2F3E,
+ 0x03DB, 0x2F3F, 0x0401, 0x0429, 0x0410, 0x0423, 0x0411, 0x0424,
+ 0x0412, 0x0425, 0x0413, 0x0426, 0x0414, 0x0427, 0x0415, 0x0428,
+ 0x0416, 0x042A, 0x0417, 0x042B, 0x0418, 0x042C, 0x0419, 0x042D,
+ 0x041A, 0x042E, 0x041B, 0x042F, 0x041C, 0x0430, 0x041D, 0x0431,
+ 0x041E, 0x0432, 0x041F, 0x0433, 0x0420, 0x0434, 0x0421, 0x0435,
+ 0x0422, 0x0436, 0x0423, 0x0437, 0x0424, 0x0438, 0x0425, 0x0439,
+ 0x0426, 0x043A, 0x0427, 0x043B, 0x0428, 0x043C, 0x0429, 0x043D,
+ 0x042A, 0x043E, 0x042B, 0x043F, 0x042C, 0x0440, 0x042D, 0x0441,
+ 0x042E, 0x0442, 0x042F, 0x0443, 0x0430, 0x0444, 0x0431, 0x0445,
+ 0x0432, 0x0446, 0x0433, 0x0447, 0x0434, 0x0448, 0x0435, 0x0449,
+ 0x0436, 0x044B, 0x0437, 0x044C, 0x0438, 0x044D, 0x0439, 0x044E,
+ 0x043A, 0x044F, 0x043B, 0x0450, 0x043C, 0x0451, 0x043D, 0x0452,
+ 0x043E, 0x0453, 0x043F, 0x0454, 0x0440, 0x0455, 0x0441, 0x0456,
+ 0x0442, 0x0457, 0x0443, 0x0458, 0x0444, 0x0459, 0x0445, 0x045A,
+ 0x0446, 0x045B, 0x0447, 0x045C, 0x0448, 0x045D, 0x0449, 0x045E,
+ 0x044A, 0x045F, 0x044B, 0x0460, 0x044C, 0x0461, 0x044D, 0x0462,
+ 0x044E, 0x0463, 0x044F, 0x0464, 0x0451, 0x044A, 0x1E3E, 0x3D71,
+ 0x1E3F, 0x3D72, 0x1EBC, 0x24B5, 0x1EBD, 0x24C1, 0x1F70, 0x24CC,
+ 0x1F71, 0x24CB, 0x1F72, 0x24DA, 0x1F73, 0x24D9, 0x2002, 0x00E7,
+ 0x2003, 0x0279, 0x2010, 0x0296, 0x2011, 0x000E, 0x2012, 0x0072,
+ 0x2013, 0x0072, 0x2014, 0x008A, 0x2015, 0x0295, 0x2016, 0x029A,
+ 0x2018, 0x0062, 0x2019, 0x0060, 0x201A, 0x0078, 0x201C, 0x006C,
+ 0x201D, 0x007A, 0x201E, 0x0079, 0x2020, 0x0308, 0x2021, 0x0309,
+ 0x2022, 0x0077, 0x2025, 0x029D, 0x2026, 0x029C, 0x2030, 0x0304,
+ 0x2032, 0x02C4, 0x2033, 0x02C5, 0x2039, 0x006E, 0x203A, 0x006F,
+ 0x203B, 0x02DE, 0x203C, 0x2F4F, 0x203E, 0x00E2, 0x203F, 0x3DE9,
+ 0x2042, 0x3F9A, 0x2044, 0x0068, 0x2047, 0x3F96, 0x2048, 0x3F97,
+ 0x2049, 0x2F50, 0x2051, 0x3F99, 0x2070, 0x24A1, 0x2074, 0x24A2,
+ 0x2075, 0x24A3, 0x2076, 0x24A4, 0x2077, 0x24A5, 0x2078, 0x24A6,
+ 0x2079, 0x24A7, 0x2080, 0x24A8, 0x2081, 0x24A9, 0x2082, 0x24AA,
+ 0x2083, 0x24AB, 0x2084, 0x24AC, 0x2085, 0x24AD, 0x2086, 0x24AE,
+ 0x2087, 0x24AF, 0x2088, 0x24B0, 0x2089, 0x24B1, 0x20AC, 0x248A,
+ 0x20DD, 0x3FC8, 0x20DE, 0x2B1B, 0x2100, 0x2E4F, 0x2103, 0x02C6,
+ 0x2105, 0x2E53, 0x2109, 0x2071, 0x210A, 0x2070, 0x210F, 0x2F3C,
+ 0x2113, 0x1F59, 0x2116, 0x1DBA, 0x2121, 0x1F77, 0x2122, 0x00E4,
+ 0x2126, 0x248B, 0x2127, 0x3C9B, 0x212B, 0x0303, 0x2135, 0x2F39,
+ 0x213B, 0x2073, 0x2153, 0x249F, 0x2154, 0x24A0, 0x2155, 0x3D6F,
+ 0x2156, 0x2639, 0x2157, 0x263A, 0x2158, 0x263B, 0x2159, 0x263C,
+ 0x215A, 0x263D, 0x215B, 0x249B, 0x215C, 0x249C, 0x215D, 0x249D,
+ 0x215E, 0x249E, 0x2160, 0x1D97, 0x2161, 0x1D98, 0x2162, 0x1D99,
+ 0x2163, 0x1D9A, 0x2164, 0x1D9B, 0x2165, 0x1D9C, 0x2166, 0x1D9D,
+ 0x2167, 0x1D9E, 0x2168, 0x1D9F, 0x2169, 0x1DA0, 0x216A, 0x2021,
+ 0x216B, 0x2022, 0x2170, 0x1F9C, 0x2171, 0x1F9D, 0x2172, 0x1F9E,
+ 0x2173, 0x1F9F, 0x2174, 0x1FA0, 0x2175, 0x1FA1, 0x2176, 0x1FA2,
+ 0x2177, 0x1FA3, 0x2178, 0x1FA4, 0x2179, 0x1FA5, 0x217A, 0x206A,
+ 0x217B, 0x206B, 0x217F, 0x206F, 0x2190, 0x02E1, 0x2191, 0x02E2,
+ 0x2192, 0x02E0, 0x2193, 0x02E3, 0x2194, 0x2FA9, 0x2196, 0x2FAC,
+ 0x2197, 0x2FAD, 0x2198, 0x2FAA, 0x2199, 0x2FAB, 0x21C4, 0x2076,
+ 0x21C5, 0x2077, 0x21C6, 0x2075, 0x21CB, 0x2FAF, 0x21CC, 0x2FAE,
+ 0x21D0, 0x2FA8, 0x21D2, 0x02F0, 0x21D4, 0x02F1, 0x21E6, 0x1F4D,
+ 0x21E7, 0x1F4C, 0x21E8, 0x1F4E, 0x21E9, 0x1F4B, 0x2200, 0x02F2,
+ 0x2202, 0x02F7, 0x2203, 0x02F3, 0x2205, 0x2F98, 0x2207, 0x02F8,
+ 0x2208, 0x02E5, 0x2209, 0x3C74, 0x220A, 0x2F3B, 0x220B, 0x02E6,
+ 0x2211, 0x1DC9, 0x2212, 0x02B5, 0x2213, 0x2F56, 0x2219, 0x0075,
+ 0x221A, 0x02FD, 0x221D, 0x02FF, 0x221E, 0x02BF, 0x221F, 0x1DCD,
+ 0x2220, 0x02F4, 0x2225, 0x3C81, 0x2226, 0x3C82, 0x2227, 0x02ED,
+ 0x2228, 0x02EE, 0x2229, 0x02EC, 0x222A, 0x02EB, 0x222B, 0x0301,
+ 0x222C, 0x0302, 0x222D, 0x2003, 0x222E, 0x1DC8, 0x2234, 0x02C0,
+ 0x2235, 0x0300, 0x223C, 0x0064, 0x223D, 0x02FE, 0x2243, 0x2F58,
+ 0x2245, 0x3C93, 0x2248, 0x3C94, 0x2252, 0x02FA, 0x2260, 0x02BA,
+ 0x2261, 0x02F9, 0x2262, 0x3C91, 0x2266, 0x02BD, 0x2267, 0x02BE,
+ 0x226A, 0x02FB, 0x226B, 0x02FC, 0x2272, 0x2F59, 0x2273, 0x2F5A,
+ 0x2276, 0x3C95, 0x2277, 0x3C96, 0x2282, 0x02E9, 0x2283, 0x02EA,
+ 0x2284, 0x3C70, 0x2285, 0x3C71, 0x2286, 0x02E7, 0x2287, 0x02E8,
+ 0x228A, 0x3C72, 0x228B, 0x3C73, 0x2295, 0x2F9C, 0x2296, 0x2F9A,
+ 0x2297, 0x2F9D, 0x2298, 0x2F9B, 0x229E, 0x3E22, 0x22A0, 0x2F99,
+ 0x22A5, 0x02F5, 0x22BF, 0x1DCE, 0x22DA, 0x3D6D, 0x22DB, 0x3D6E,
+ 0x2305, 0x3C76, 0x2306, 0x3C77, 0x2307, 0x2FBB, 0x2312, 0x02F6,
+ 0x2318, 0x3D70, 0x239B, 0x2F6F, 0x239C, 0x2F87, 0x239D, 0x2F70,
+ 0x239E, 0x2F71, 0x239F, 0x2F87, 0x23A0, 0x2F72, 0x23A1, 0x2F77,
+ 0x23A2, 0x2F87, 0x23A3, 0x2F78, 0x23A4, 0x2F79, 0x23A5, 0x2F87,
+ 0x23A6, 0x2F7A, 0x23A7, 0x1FF2, 0x23A8, 0x1FF3, 0x23A9, 0x1FF4,
+ 0x23AA, 0x2F87, 0x23AB, 0x1FEE, 0x23AC, 0x1FEF, 0x23AD, 0x1FF0,
+ 0x23B0, 0x3FB8, 0x23B1, 0x3FB9, 0x23BE, 0x3F7D, 0x23BF, 0x3F7E,
+ 0x23C0, 0x3F7F, 0x23C1, 0x3F80, 0x23C2, 0x3F81, 0x23C3, 0x3F82,
+ 0x23C4, 0x3F83, 0x23C5, 0x3F84, 0x23C6, 0x3F85, 0x23C7, 0x3F86,
+ 0x23C8, 0x3F87, 0x23C9, 0x3F88, 0x23CA, 0x3F89, 0x23CB, 0x3F8A,
+ 0x23CC, 0x3F8B, 0x23CE, 0x3F91, 0x2423, 0x3F90, 0x2460, 0x1D83,
+ 0x2461, 0x1D84, 0x2462, 0x1D85, 0x2463, 0x1D86, 0x2464, 0x1D87,
+ 0x2465, 0x1D88, 0x2466, 0x1D89, 0x2467, 0x1D8A, 0x2468, 0x1D8B,
+ 0x2469, 0x1D8C, 0x246A, 0x1D8D, 0x246B, 0x1D8E, 0x246C, 0x1D8F,
+ 0x246D, 0x1D90, 0x246E, 0x1D91, 0x246F, 0x1D92, 0x2470, 0x1D93,
+ 0x2471, 0x1D94, 0x2472, 0x1D95, 0x2473, 0x1D96, 0x2474, 0x1F87,
+ 0x2475, 0x1F88, 0x2476, 0x1F89, 0x2477, 0x1F8A, 0x2478, 0x1F8B,
+ 0x2479, 0x1F8C, 0x247A, 0x1F8D, 0x247B, 0x1F8E, 0x247C, 0x1F8F,
+ 0x247D, 0x1F90, 0x247E, 0x1F91, 0x247F, 0x1F92, 0x2480, 0x1F93,
+ 0x2481, 0x1F94, 0x2482, 0x1F95, 0x2483, 0x1F96, 0x2484, 0x1F97,
+ 0x2485, 0x1F98, 0x2486, 0x1F99, 0x2487, 0x1F9A, 0x2488, 0x1F7E,
+ 0x2489, 0x1F7F, 0x248A, 0x1F80, 0x248B, 0x1F81, 0x248C, 0x1F82,
+ 0x248D, 0x1F83, 0x248E, 0x1F84, 0x248F, 0x1F85, 0x2490, 0x1F86,
+ 0x249C, 0x1FB0, 0x249D, 0x1FB1, 0x249E, 0x1FB2, 0x249F, 0x1FB3,
+ 0x24A0, 0x1FB4, 0x24A1, 0x1FB5, 0x24A2, 0x1FB6, 0x24A3, 0x1FB7,
+ 0x24A4, 0x1FB8, 0x24A5, 0x1FB9, 0x24A6, 0x1FBA, 0x24A7, 0x1FBB,
+ 0x24A8, 0x1FBC, 0x24A9, 0x1FBD, 0x24AA, 0x1FBE, 0x24AB, 0x1FBF,
+ 0x24AC, 0x1FC0, 0x24AD, 0x1FC1, 0x24AE, 0x1FC2, 0x24AF, 0x1FC3,
+ 0x24B0, 0x1FC4, 0x24B1, 0x1FC5, 0x24B2, 0x1FC6, 0x24B3, 0x1FC7,
+ 0x24B4, 0x1FC8, 0x24B5, 0x1FC9, 0x24B6, 0x2863, 0x24B7, 0x2864,
+ 0x24B8, 0x2865, 0x24B9, 0x2866, 0x24BA, 0x2867, 0x24BB, 0x2868,
+ 0x24BC, 0x2869, 0x24BD, 0x286A, 0x24BE, 0x286B, 0x24BF, 0x286C,
+ 0x24C0, 0x286D, 0x24C1, 0x286E, 0x24C2, 0x286F, 0x24C3, 0x2870,
+ 0x24C4, 0x2871, 0x24C5, 0x2872, 0x24C6, 0x2873, 0x24C7, 0x2874,
+ 0x24C8, 0x2875, 0x24C9, 0x2876, 0x24CA, 0x2877, 0x24CB, 0x2878,
+ 0x24CC, 0x2879, 0x24CD, 0x287A, 0x24CE, 0x287B, 0x24CF, 0x287C,
+ 0x24D0, 0x2849, 0x24D1, 0x284A, 0x24D2, 0x284B, 0x24D3, 0x284C,
+ 0x24D4, 0x284D, 0x24D5, 0x284E, 0x24D6, 0x284F, 0x24D7, 0x2850,
+ 0x24D8, 0x2851, 0x24D9, 0x2852, 0x24DA, 0x2853, 0x24DB, 0x2854,
+ 0x24DC, 0x2855, 0x24DD, 0x2856, 0x24DE, 0x2857, 0x24DF, 0x2858,
+ 0x24E0, 0x2859, 0x24E1, 0x285A, 0x24E2, 0x285B, 0x24E3, 0x285C,
+ 0x24E4, 0x285D, 0x24E5, 0x285E, 0x24E6, 0x285F, 0x24E7, 0x2860,
+ 0x24E8, 0x2861, 0x24E9, 0x2862, 0x24EA, 0x2020, 0x24EB, 0x2913,
+ 0x24EC, 0x2914, 0x24ED, 0x2915, 0x24EE, 0x2916, 0x24EF, 0x2917,
+ 0x24F0, 0x2918, 0x24F1, 0x2919, 0x24F2, 0x291A, 0x24F3, 0x291B,
+ 0x24F4, 0x291C, 0x24F5, 0x3F5F, 0x24F6, 0x3F60, 0x24F7, 0x3F61,
+ 0x24F8, 0x3F62, 0x24F9, 0x3F63, 0x24FA, 0x3F64, 0x24FB, 0x3F65,
+ 0x24FC, 0x3F66, 0x24FD, 0x3F67, 0x24FE, 0x3F68, 0x24FF, 0x2907,
+ 0x2500, 0x1D37, 0x2501, 0x1D38, 0x2502, 0x1D39, 0x2503, 0x1D3A,
+ 0x2504, 0x1D3B, 0x2505, 0x1D3C, 0x2506, 0x1D3D, 0x2507, 0x1D3E,
+ 0x2508, 0x1D3F, 0x2509, 0x1D40, 0x250A, 0x1D41, 0x250B, 0x1D42,
+ 0x250C, 0x1D43, 0x250D, 0x1D44, 0x250E, 0x1D45, 0x250F, 0x1D46,
+ 0x2510, 0x1D47, 0x2511, 0x1D48, 0x2512, 0x1D49, 0x2513, 0x1D4A,
+ 0x2514, 0x1D4B, 0x2515, 0x1D4C, 0x2516, 0x1D4D, 0x2517, 0x1D4E,
+ 0x2518, 0x1D4F, 0x2519, 0x1D50, 0x251A, 0x1D51, 0x251B, 0x1D52,
+ 0x251C, 0x1D53, 0x251D, 0x1D54, 0x251E, 0x1D55, 0x251F, 0x1D56,
+ 0x2520, 0x1D57, 0x2521, 0x1D58, 0x2522, 0x1D59, 0x2523, 0x1D5A,
+ 0x2524, 0x1D5B, 0x2525, 0x1D5C, 0x2526, 0x1D5D, 0x2527, 0x1D5E,
+ 0x2528, 0x1D5F, 0x2529, 0x1D60, 0x252A, 0x1D61, 0x252B, 0x1D62,
+ 0x252C, 0x1D63, 0x252D, 0x1D64, 0x252E, 0x1D65, 0x252F, 0x1D66,
+ 0x2530, 0x1D67, 0x2531, 0x1D68, 0x2532, 0x1D69, 0x2533, 0x1D6A,
+ 0x2534, 0x1D6B, 0x2535, 0x1D6C, 0x2536, 0x1D6D, 0x2537, 0x1D6E,
+ 0x2538, 0x1D6F, 0x2539, 0x1D70, 0x253A, 0x1D71, 0x253B, 0x1D72,
+ 0x253C, 0x1D73, 0x253D, 0x1D74, 0x253E, 0x1D75, 0x253F, 0x1D76,
+ 0x2540, 0x1D77, 0x2541, 0x1D78, 0x2542, 0x1D79, 0x2543, 0x1D7A,
+ 0x2544, 0x1D7B, 0x2545, 0x1D7C, 0x2546, 0x1D7D, 0x2547, 0x1D7E,
+ 0x2548, 0x1D7F, 0x2549, 0x1D80, 0x254A, 0x1D81, 0x254B, 0x1D82,
+ 0x2550, 0x203B, 0x255E, 0x203C, 0x2561, 0x203E, 0x256A, 0x203D,
+ 0x256D, 0x2037, 0x256E, 0x2038, 0x256F, 0x203A, 0x2570, 0x2039,
+ 0x2571, 0x2045, 0x2572, 0x2046, 0x2573, 0x2047, 0x2581, 0x2026,
+ 0x2582, 0x2027, 0x2583, 0x2028, 0x2584, 0x2029, 0x2585, 0x202A,
+ 0x2586, 0x202B, 0x2587, 0x202C, 0x2588, 0x202D, 0x2589, 0x2034,
+ 0x258A, 0x2033, 0x258B, 0x2032, 0x258C, 0x2031, 0x258D, 0x2030,
+ 0x258E, 0x202F, 0x258F, 0x202E, 0x2594, 0x2035, 0x2595, 0x2036,
+ 0x25A0, 0x02D9, 0x25A1, 0x02D8, 0x25A2, 0x1F4F, 0x25AA, 0x2FCF,
+ 0x25AB, 0x2FCD, 0x25B1, 0x3F6B, 0x25B2, 0x02DB, 0x25B3, 0x02DA,
+ 0x25B6, 0x2FA3, 0x25B7, 0x1F4A, 0x25BC, 0x02DD, 0x25BD, 0x02DC,
+ 0x25C0, 0x2FA2, 0x25C1, 0x1F49, 0x25C6, 0x02D7, 0x25C7, 0x02D6,
+ 0x25C9, 0x2012, 0x25CB, 0x02D3, 0x25CC, 0x2906, 0x25CE, 0x02D5,
+ 0x25CF, 0x02D4, 0x25D0, 0x3F92, 0x25D1, 0x3F93, 0x25D2, 0x3F94,
+ 0x25D3, 0x3F95, 0x25E2, 0x203F, 0x25E3, 0x2040, 0x25E4, 0x2042,
+ 0x25E5, 0x2041, 0x25E6, 0x2FDE, 0x25EF, 0x030B, 0x2600, 0x2017,
+ 0x2601, 0x2018, 0x2602, 0x2019, 0x2603, 0x201A, 0x2605, 0x02D2,
+ 0x2606, 0x02D1, 0x260E, 0x1F78, 0x2616, 0x3F69, 0x2617, 0x3F6A,
+ 0x261C, 0x201C, 0x261D, 0x201D, 0x261E, 0x201B, 0x261F, 0x201E,
+ 0x2640, 0x02C2, 0x2642, 0x02C1, 0x2660, 0x2013, 0x2661, 0x1F51,
+ 0x2662, 0x1F53, 0x2663, 0x2015, 0x2664, 0x1F52, 0x2665, 0x2014,
+ 0x2666, 0x2016, 0x2667, 0x1F50, 0x2668, 0x2F42, 0x2669, 0x2F43,
+ 0x266A, 0x0307, 0x266B, 0x3F48, 0x266C, 0x2F44, 0x266D, 0x0306,
+ 0x266E, 0x3F47, 0x266F, 0x0305, 0x2672, 0x3FBA, 0x2673, 0x3FBB,
+ 0x2674, 0x3FBC, 0x2675, 0x3FBD, 0x2676, 0x3FBE, 0x2677, 0x3FBF,
+ 0x2678, 0x3FC0, 0x2679, 0x3FC1, 0x267A, 0x3FC2, 0x267B, 0x3FC3,
+ 0x267C, 0x3FC4, 0x267D, 0x3FC5, 0x26A0, 0x2FA0, 0x2702, 0x2F90,
+ 0x2713, 0x3F8E, 0x271A, 0x2FD1, 0x273F, 0x2FC5, 0x2740, 0x2FC4,
+ 0x2756, 0x2FE3, 0x2776, 0x205E, 0x2777, 0x205F, 0x2778, 0x2060,
+ 0x2779, 0x2061, 0x277A, 0x2062, 0x277B, 0x2063, 0x277C, 0x2064,
+ 0x277D, 0x2065, 0x277E, 0x2066, 0x277F, 0x2912, 0x27A1, 0x200E,
+ 0x2934, 0x3F49, 0x2935, 0x3F4A, 0x29BF, 0x3F4B, 0x29FA, 0x3F4F,
+ 0x29FB, 0x3F50, 0x2B05, 0x200F, 0x2B06, 0x2010, 0x2B07, 0x2011,
+ 0x2E83, 0x37E1, 0x2E85, 0x3620, 0x2E87, 0x3719, 0x2E89, 0x3814,
+ 0x2E8B, 0x371E, 0x2E8C, 0x3609, 0x2E8D, 0x360A, 0x2E8E, 0x1071,
+ 0x2E8F, 0x388C, 0x2E90, 0x1226, 0x2E92, 0x0EB2, 0x2E93, 0x1283,
+ 0x2E94, 0x12AB, 0x2E95, 0x3C1F, 0x2E96, 0x38C2, 0x2E97, 0x361C,
+ 0x2E98, 0x38E1, 0x2E99, 0x13C3, 0x2E9B, 0x13E1, 0x2E9E, 0x45E5,
+ 0x2E9F, 0x0E3C, 0x2EA0, 0x0EBD, 0x2EA1, 0x3961, 0x2EA2, 0x3962,
+ 0x2EA3, 0x399D, 0x2EA4, 0x3C26, 0x2EA6, 0x374D, 0x2EA8, 0x39BC,
+ 0x2EA9, 0x35A1, 0x2EAA, 0x36AB, 0x2EAB, 0x3A97, 0x2EAC, 0x4ABA,
+ 0x2EAD, 0x3A39, 0x2EAE, 0x3662, 0x2EB1, 0x3A98, 0x2EB2, 0x3A97,
+ 0x2EB3, 0x376D, 0x2EB7, 0x36FE, 0x2EB9, 0x3713, 0x2EBC, 0x35B3,
+ 0x2EBD, 0x354E, 0x2EBE, 0x3775, 0x2EBF, 0x3776, 0x2EC0, 0x3777,
+ 0x2EC1, 0x078B, 0x2EC2, 0x3B0A, 0x2EC3, 0x362E, 0x2EC4, 0x0A62,
+ 0x2EC6, 0x3572, 0x2ECA, 0x364A, 0x2ECC, 0x3C2B, 0x2ECD, 0x3B50,
+ 0x2ECF, 0x3B9E, 0x2ED1, 0x0BD5, 0x2ED2, 0x3B97, 0x2ED6, 0x3B9E,
+ 0x2ED7, 0x354D, 0x2ED8, 0x0A68, 0x2EDD, 0x3617, 0x2EDE, 0x3619,
+ 0x2EDF, 0x3618, 0x2EE4, 0x064E, 0x2EE8, 0x0D34, 0x2EE9, 0x052B,
+ 0x2EEB, 0x0A6A, 0x2EED, 0x08C3, 0x2EEF, 0x0F7D, 0x2EF2, 0x064F,
+ 0x2F00, 0x04B0, 0x2F01, 0x20B3, 0x2F02, 0x0FFF, 0x2F03, 0x1001,
+ 0x2F04, 0x0535, 0x2F05, 0x1006, 0x2F06, 0x0CCB, 0x2F07, 0x100E,
+ 0x2F08, 0x0A13, 0x2F09, 0x1070, 0x2F0A, 0x0CD6, 0x2F0B, 0x0D40,
+ 0x2F0C, 0x107B, 0x2F0D, 0x1083, 0x2F0E, 0x1089, 0x2F0F, 0x1093,
+ 0x2F10, 0x1098, 0x2F11, 0x0C5B, 0x2F12, 0x0F97, 0x2F13, 0x10C6,
+ 0x2F14, 0x10CD, 0x2F15, 0x10CE, 0x2F16, 0x10D3, 0x2F17, 0x0947,
+ 0x2F18, 0x0E7C, 0x2F19, 0x10DC, 0x2F1A, 0x10E1, 0x2F1B, 0x10E8,
+ 0x2F1C, 0x0EA2, 0x2F1D, 0x07B1, 0x2F1E, 0x116B, 0x2F1F, 0x0C54,
+ 0x2F20, 0x089C, 0x2F21, 0x11BA, 0x2F22, 0x11BB, 0x2F23, 0x0F26,
+ 0x2F24, 0x0B47, 0x2F25, 0x0981, 0x2F26, 0x08A0, 0x2F27, 0x120E,
+ 0x2F28, 0x0A47, 0x2F29, 0x0996, 0x2F2A, 0x1226, 0x2F2B, 0x1228,
+ 0x2F2C, 0x1232, 0x2F2D, 0x0881, 0x2F2E, 0x126C, 0x2F2F, 0x07BB,
+ 0x2F30, 0x077E, 0x2F31, 0x06CA, 0x2F32, 0x05EF, 0x2F33, 0x1283,
+ 0x2F34, 0x1285, 0x2F35, 0x1299, 0x2F36, 0x129B, 0x2F37, 0x12A0,
+ 0x2F38, 0x0677, 0x2F39, 0x38B9, 0x2F3A, 0x12AF, 0x2F3B, 0x12B1,
+ 0x2F3C, 0x09FA, 0x2F3D, 0x1342, 0x2F3E, 0x0781, 0x2F3F, 0x0916,
+ 0x2F40, 0x08A7, 0x2F41, 0x13C2, 0x2F42, 0x0E08, 0x2F43, 0x0C47,
+ 0x2F44, 0x06CC, 0x2F45, 0x0E4D, 0x2F46, 0x13E0, 0x2F47, 0x0CD4,
+ 0x2F48, 0x140C, 0x2F49, 0x0744, 0x2F4A, 0x0EE6, 0x2F4B, 0x073D,
+ 0x2F4C, 0x08AD, 0x2F4D, 0x14E5, 0x2F4E, 0x14F4, 0x2F4F, 0x14F8,
+ 0x2F50, 0x0D7A, 0x2F51, 0x0EDF, 0x2F52, 0x08AF, 0x2F53, 0x1502,
+ 0x2F54, 0x0A2B, 0x2F55, 0x0550, 0x2F56, 0x0BFA, 0x2F57, 0x0DD5,
+ 0x2F58, 0x15E4, 0x2F59, 0x15E6, 0x2F5A, 0x0E22, 0x2F5B, 0x0567,
+ 0x2F5C, 0x0687, 0x2F5D, 0x0758, 0x2F5E, 0x0770, 0x2F5F, 0x06C4,
+ 0x2F60, 0x04DD, 0x2F61, 0x05E0, 0x2F62, 0x0601, 0x2F63, 0x0A5C,
+ 0x2F64, 0x0F3B, 0x2F65, 0x0C3E, 0x2F66, 0x0D97, 0x2F67, 0x3A00,
+ 0x2F68, 0x1697, 0x2F69, 0x0D28, 0x2F6A, 0x0D7D, 0x2F6B, 0x087C,
+ 0x2F6C, 0x0EE8, 0x2F6D, 0x0EC3, 0x2F6E, 0x0EFC, 0x2F6F, 0x0A74,
+ 0x2F70, 0x08D4, 0x2F71, 0x3A41, 0x2F72, 0x0553, 0x2F73, 0x0740,
+ 0x2F74, 0x0F71, 0x2F75, 0x0B9B, 0x2F76, 0x0E16, 0x2F77, 0x08B3,
+ 0x2F78, 0x0608, 0x2F79, 0x1813, 0x2F7A, 0x0F3D, 0x2F7B, 0x04CB,
+ 0x2F7C, 0x0FDD, 0x2F7D, 0x08D5, 0x2F7E, 0x183D, 0x2F7F, 0x08D6,
+ 0x2F80, 0x1853, 0x2F81, 0x0CD1, 0x2F82, 0x0A09, 0x2F83, 0x08D7,
+ 0x2F84, 0x08B8, 0x2F85, 0x04D3, 0x2F86, 0x0A89, 0x2F87, 0x0AA6,
+ 0x2F88, 0x0938, 0x2F89, 0x0821, 0x2F8A, 0x09ED, 0x2F8B, 0x18B2,
+ 0x2F8C, 0x194F, 0x2F8D, 0x0BAC, 0x2F8E, 0x0742, 0x2F8F, 0x07E6,
+ 0x2F90, 0x04A5, 0x2F91, 0x19EB, 0x2F92, 0x075F, 0x2F93, 0x05AF,
+ 0x2F94, 0x0774, 0x2F95, 0x0B69, 0x2F96, 0x0C7E, 0x2F97, 0x1A56,
+ 0x2F98, 0x1A59, 0x2F99, 0x058B, 0x2F9A, 0x0A7A, 0x2F9B, 0x0AF8,
+ 0x2F9C, 0x0B0D, 0x2F9D, 0x0A0E, 0x2F9E, 0x0902, 0x2F9F, 0x0A0F,
+ 0x2FA0, 0x0B62, 0x2FA1, 0x3B4F, 0x2FA2, 0x0F22, 0x2FA3, 0x0CAB,
+ 0x2FA4, 0x0D64, 0x2FA5, 0x0F6C, 0x2FA6, 0x06DA, 0x2FA7, 0x0BD5,
+ 0x2FA8, 0x0EF3, 0x2FA9, 0x0DDE, 0x2FAA, 0x1BC9, 0x2FAB, 0x1BCB,
+ 0x2FAC, 0x04CD, 0x2FAD, 0x21F7, 0x2FAE, 0x0D87, 0x2FAF, 0x0ED8,
+ 0x2FB0, 0x05B5, 0x2FB1, 0x1C03, 0x2FB2, 0x1C05, 0x2FB3, 0x053B,
+ 0x2FB4, 0x0E17, 0x2FB5, 0x0DE9, 0x2FB6, 0x0D88, 0x2FB7, 0x09EF,
+ 0x2FB8, 0x091F, 0x2FB9, 0x07F3, 0x2FBA, 0x0D05, 0x2FBB, 0x080E,
+ 0x2FBC, 0x07F4, 0x2FBD, 0x1C6C, 0x2FBE, 0x1C7D, 0x2FBF, 0x1C83,
+ 0x2FC0, 0x1C84, 0x2FC1, 0x064E, 0x2FC2, 0x0695, 0x2FC3, 0x0BD7,
+ 0x2FC4, 0x1CF6, 0x2FC5, 0x08DB, 0x2FC6, 0x1D01, 0x2FC7, 0x0E91,
+ 0x2FC8, 0x340B, 0x2FC9, 0x066A, 0x2FCA, 0x0807, 0x2FCB, 0x1D16,
+ 0x2FCC, 0x1D19, 0x2FCD, 0x0C1E, 0x2FCE, 0x0791, 0x2FCF, 0x0ACF,
+ 0x2FD0, 0x0D93, 0x2FD1, 0x1D21, 0x2FD2, 0x1D22, 0x2FD3, 0x0F7E,
+ 0x2FD4, 0x1D30, 0x2FD5, 0x1D31, 0x3000, 0x0279, 0x3001, 0x027A,
+ 0x3002, 0x027B, 0x3003, 0x028F, 0x3004, 0x2074, 0x3005, 0x0291,
+ 0x3006, 0x0292, 0x3007, 0x0293, 0x3008, 0x02AA, 0x3009, 0x02AB,
+ 0x300A, 0x02AC, 0x300B, 0x02AD, 0x300C, 0x02AE, 0x300D, 0x02AF,
+ 0x300E, 0x02B0, 0x300F, 0x02B1, 0x3010, 0x02B2, 0x3011, 0x02B3,
+ 0x3012, 0x02DF, 0x3013, 0x02E4, 0x3014, 0x02A4, 0x3015, 0x02A5,
+ 0x3016, 0x3F45, 0x3017, 0x3F46, 0x3018, 0x2F61, 0x3019, 0x2F62,
+ 0x301C, 0x0299, 0x301D, 0x1DB8, 0x301F, 0x1DB9, 0x3020, 0x1F7A,
+ 0x3030, 0x2FBA, 0x3033, 0x2F4C, 0x3034, 0x2F4D, 0x3035, 0x2F4E,
+ 0x3036, 0x1F79, 0x303B, 0x2F4A, 0x303C, 0x3F42, 0x303D, 0x2F93,
+ 0x3041, 0x034A, 0x3042, 0x034B, 0x3043, 0x034C, 0x3044, 0x034D,
+ 0x3045, 0x034E, 0x3046, 0x034F, 0x3047, 0x0350, 0x3048, 0x0351,
+ 0x3049, 0x0352, 0x304A, 0x0353, 0x304B, 0x0354, 0x304C, 0x0355,
+ 0x304D, 0x0356, 0x304E, 0x0357, 0x304F, 0x0358, 0x3050, 0x0359,
+ 0x3051, 0x035A, 0x3052, 0x035B, 0x3053, 0x035C, 0x3054, 0x035D,
+ 0x3055, 0x035E, 0x3056, 0x035F, 0x3057, 0x0360, 0x3058, 0x0361,
+ 0x3059, 0x0362, 0x305A, 0x0363, 0x305B, 0x0364, 0x305C, 0x0365,
+ 0x305D, 0x0366, 0x305E, 0x0367, 0x305F, 0x0368, 0x3060, 0x0369,
+ 0x3061, 0x036A, 0x3062, 0x036B, 0x3063, 0x036C, 0x3064, 0x036D,
+ 0x3065, 0x036E, 0x3066, 0x036F, 0x3067, 0x0370, 0x3068, 0x0371,
+ 0x3069, 0x0372, 0x306A, 0x0373, 0x306B, 0x0374, 0x306C, 0x0375,
+ 0x306D, 0x0376, 0x306E, 0x0377, 0x306F, 0x0378, 0x3070, 0x0379,
+ 0x3071, 0x037A, 0x3072, 0x037B, 0x3073, 0x037C, 0x3074, 0x037D,
+ 0x3075, 0x037E, 0x3076, 0x037F, 0x3077, 0x0380, 0x3078, 0x0381,
+ 0x3079, 0x0382, 0x307A, 0x0383, 0x307B, 0x0384, 0x307C, 0x0385,
+ 0x307D, 0x0386, 0x307E, 0x0387, 0x307F, 0x0388, 0x3080, 0x0389,
+ 0x3081, 0x038A, 0x3082, 0x038B, 0x3083, 0x038C, 0x3084, 0x038D,
+ 0x3085, 0x038E, 0x3086, 0x038F, 0x3087, 0x0390, 0x3088, 0x0391,
+ 0x3089, 0x0392, 0x308A, 0x0393, 0x308B, 0x0394, 0x308C, 0x0395,
+ 0x308D, 0x0396, 0x308E, 0x0397, 0x308F, 0x0398, 0x3090, 0x0399,
+ 0x3091, 0x039A, 0x3092, 0x039B, 0x3093, 0x039C, 0x3094, 0x1F16,
+ 0x3095, 0x1F17, 0x3096, 0x1F18, 0x3099, 0x3FC6, 0x309A, 0x3FC7,
+ 0x309B, 0x0283, 0x309C, 0x0284, 0x309D, 0x028D, 0x309E, 0x028E,
+ 0x309F, 0x2F95, 0x30A0, 0x3F4D, 0x30A1, 0x039D, 0x30A2, 0x039E,
+ 0x30A3, 0x039F, 0x30A4, 0x03A0, 0x30A5, 0x03A1, 0x30A6, 0x03A2,
+ 0x30A7, 0x03A3, 0x30A8, 0x03A4, 0x30A9, 0x03A5, 0x30AA, 0x03A6,
+ 0x30AB, 0x03A7, 0x30AC, 0x03A8, 0x30AD, 0x03A9, 0x30AE, 0x03AA,
+ 0x30AF, 0x03AB, 0x30B0, 0x03AC, 0x30B1, 0x03AD, 0x30B2, 0x03AE,
+ 0x30B3, 0x03AF, 0x30B4, 0x03B0, 0x30B5, 0x03B1, 0x30B6, 0x03B2,
+ 0x30B7, 0x03B3, 0x30B8, 0x03B4, 0x30B9, 0x03B5, 0x30BA, 0x03B6,
+ 0x30BB, 0x03B7, 0x30BC, 0x03B8, 0x30BD, 0x03B9, 0x30BE, 0x03BA,
+ 0x30BF, 0x03BB, 0x30C0, 0x03BC, 0x30C1, 0x03BD, 0x30C2, 0x03BE,
+ 0x30C3, 0x03BF, 0x30C4, 0x03C0, 0x30C5, 0x03C1, 0x30C6, 0x03C2,
+ 0x30C7, 0x03C3, 0x30C8, 0x03C4, 0x30C9, 0x03C5, 0x30CA, 0x03C6,
+ 0x30CB, 0x03C7, 0x30CC, 0x03C8, 0x30CD, 0x03C9, 0x30CE, 0x03CA,
+ 0x30CF, 0x03CB, 0x30D0, 0x03CC, 0x30D1, 0x03CD, 0x30D2, 0x03CE,
+ 0x30D3, 0x03CF, 0x30D4, 0x03D0, 0x30D5, 0x03D1, 0x30D6, 0x03D2,
+ 0x30D7, 0x03D3, 0x30D8, 0x03D4, 0x30D9, 0x03D5, 0x30DA, 0x03D6,
+ 0x30DB, 0x03D7, 0x30DC, 0x03D8, 0x30DD, 0x03D9, 0x30DE, 0x03DA,
+ 0x30DF, 0x03DB, 0x30E0, 0x03DC, 0x30E1, 0x03DD, 0x30E2, 0x03DE,
+ 0x30E3, 0x03DF, 0x30E4, 0x03E0, 0x30E5, 0x03E1, 0x30E6, 0x03E2,
+ 0x30E7, 0x03E3, 0x30E8, 0x03E4, 0x30E9, 0x03E5, 0x30EA, 0x03E6,
+ 0x30EB, 0x03E7, 0x30EC, 0x03E8, 0x30ED, 0x03E9, 0x30EE, 0x03EA,
+ 0x30EF, 0x03EB, 0x30F0, 0x03EC, 0x30F1, 0x03ED, 0x30F2, 0x03EE,
+ 0x30F3, 0x03EF, 0x30F4, 0x03F0, 0x30F5, 0x03F1, 0x30F6, 0x03F2,
+ 0x30F7, 0x2079, 0x30F8, 0x207A, 0x30F9, 0x207B, 0x30FA, 0x207C,
+ 0x30FB, 0x027E, 0x30FC, 0x0294, 0x30FD, 0x028B, 0x30FE, 0x028C,
+ 0x30FF, 0x3F43, 0x3190, 0x3F9B, 0x3191, 0x3F9C, 0x3192, 0x3F9D,
+ 0x3193, 0x3F9E, 0x3194, 0x3F9F, 0x3195, 0x3FA0, 0x3196, 0x3FA1,
+ 0x3197, 0x3FA2, 0x3198, 0x3FA3, 0x3199, 0x3FA4, 0x319A, 0x3FA5,
+ 0x319B, 0x3FA6, 0x319C, 0x3FA7, 0x319D, 0x3FA8, 0x319E, 0x3FA9,
+ 0x319F, 0x3FAA, 0x31F0, 0x3F6C, 0x31F1, 0x3F6D, 0x31F2, 0x3F6E,
+ 0x31F3, 0x3F6F, 0x31F4, 0x3F70, 0x31F5, 0x3F71, 0x31F6, 0x3F72,
+ 0x31F7, 0x3F73, 0x31F8, 0x3F74, 0x31F9, 0x3F75, 0x31FA, 0x3F77,
+ 0x31FB, 0x3F78, 0x31FC, 0x3F79, 0x31FD, 0x3F7A, 0x31FE, 0x3F7B,
+ 0x31FF, 0x3F7C, 0x3220, 0x278E, 0x3221, 0x278F, 0x3222, 0x2790,
+ 0x3223, 0x2791, 0x3224, 0x2792, 0x3225, 0x2793, 0x3226, 0x2794,
+ 0x3227, 0x2795, 0x3228, 0x2796, 0x3229, 0x2797, 0x322A, 0x2006,
+ 0x322B, 0x2007, 0x322C, 0x2008, 0x322D, 0x2009, 0x322E, 0x200A,
+ 0x322F, 0x200B, 0x3230, 0x2005, 0x3231, 0x1DC2, 0x3232, 0x1DC3,
+ 0x3233, 0x1FCF, 0x3234, 0x1FCD, 0x3235, 0x1FD4, 0x3236, 0x1FD3,
+ 0x3237, 0x200C, 0x3238, 0x1FCE, 0x3239, 0x1DC4, 0x323A, 0x1FD7,
+ 0x323B, 0x1FD5, 0x323C, 0x1FD0, 0x323D, 0x1FCB, 0x323E, 0x1FD2,
+ 0x323F, 0x1FCC, 0x3240, 0x1FD6, 0x3241, 0x200D, 0x3242, 0x1FD1,
+ 0x3243, 0x1FCA, 0x3251, 0x1F9B, 0x3252, 0x1FA6, 0x3253, 0x1FA7,
+ 0x3254, 0x1FA8, 0x3255, 0x1FA9, 0x3256, 0x1FAA, 0x3257, 0x1FAB,
+ 0x3258, 0x1FAC, 0x3259, 0x1FAD, 0x325A, 0x1FAE, 0x325B, 0x1FAF,
+ 0x325C, 0x2804, 0x325D, 0x2805, 0x325E, 0x2806, 0x325F, 0x2807,
+ 0x3280, 0x28DD, 0x3281, 0x28DE, 0x3282, 0x28DF, 0x3283, 0x28E0,
+ 0x3284, 0x28E1, 0x3285, 0x28E2, 0x3286, 0x28E3, 0x3287, 0x28E4,
+ 0x3288, 0x28E5, 0x3289, 0x28E6, 0x328A, 0x28E8, 0x328B, 0x28E9,
+ 0x328C, 0x28EA, 0x328D, 0x28EB, 0x328E, 0x28EC, 0x328F, 0x28ED,
+ 0x3290, 0x28E7, 0x3291, 0x1FE1, 0x3292, 0x1FE0, 0x3293, 0x1FE2,
+ 0x3294, 0x1FDC, 0x3295, 0x28FF, 0x3296, 0x1FE5, 0x3297, 0x28FC,
+ 0x3298, 0x1FDE, 0x3299, 0x201F, 0x329A, 0x28F9, 0x329B, 0x28F8,
+ 0x329C, 0x28FE, 0x329D, 0x207F, 0x329E, 0x1FFF, 0x329F, 0x28EF,
+ 0x32A0, 0x28F6, 0x32A1, 0x28F7, 0x32A2, 0x28FB, 0x32A3, 0x28FA,
+ 0x32A4, 0x1DBD, 0x32A5, 0x1DBE, 0x32A6, 0x1DBF, 0x32A7, 0x1DC0,
+ 0x32A8, 0x1DC1, 0x32A9, 0x1FDA, 0x32AA, 0x1FDD, 0x32AB, 0x1FDF,
+ 0x32AC, 0x1FE3, 0x32AD, 0x1FD9, 0x32AE, 0x1FE4, 0x32AF, 0x1FDB,
+ 0x32B0, 0x1FD8, 0x32B1, 0x2808, 0x32B2, 0x2809, 0x32B3, 0x280A,
+ 0x32B4, 0x280B, 0x32B5, 0x280C, 0x32B6, 0x280D, 0x32B7, 0x280E,
+ 0x32B8, 0x280F, 0x32B9, 0x2810, 0x32BA, 0x2811, 0x32BB, 0x2812,
+ 0x32BC, 0x2813, 0x32BD, 0x2814, 0x32BE, 0x2815, 0x32BF, 0x2816,
+ 0x32D0, 0x28AD, 0x32D1, 0x28AE, 0x32D2, 0x28AF, 0x32D3, 0x28B0,
+ 0x32D4, 0x28B1, 0x32D5, 0x28B2, 0x32D6, 0x28B3, 0x32D7, 0x28B4,
+ 0x32D8, 0x28B5, 0x32D9, 0x28B6, 0x32DA, 0x28B7, 0x32DB, 0x28B8,
+ 0x32DC, 0x28B9, 0x32DD, 0x28BA, 0x32DE, 0x28BB, 0x32DF, 0x28BC,
+ 0x32E0, 0x28BD, 0x32E1, 0x28BE, 0x32E2, 0x28BF, 0x32E3, 0x28C0,
+ 0x32E4, 0x28C1, 0x32E5, 0x28C2, 0x32E6, 0x28C3, 0x32E7, 0x28C4,
+ 0x32E8, 0x28C5, 0x32E9, 0x28C6, 0x32EA, 0x28C7, 0x32EB, 0x28C8,
+ 0x32EC, 0x28C9, 0x32ED, 0x28CA, 0x32EE, 0x28CB, 0x32EF, 0x28CC,
+ 0x32F0, 0x28CD, 0x32F1, 0x28CE, 0x32F2, 0x28CF, 0x32F3, 0x28D0,
+ 0x32F4, 0x28D1, 0x32F5, 0x28D2, 0x32F6, 0x28D3, 0x32F7, 0x28D4,
+ 0x32F8, 0x28D5, 0x32F9, 0x28D6, 0x32FA, 0x28D7, 0x32FB, 0x28D8,
+ 0x32FC, 0x28D9, 0x32FD, 0x28DA, 0x32FE, 0x28DB, 0x3300, 0x1F70,
+ 0x3301, 0x2E62, 0x3302, 0x2E63, 0x3303, 0x1F6A, 0x3304, 0x2E64,
+ 0x3305, 0x1FF7, 0x3306, 0x2E65, 0x3307, 0x2E69, 0x3308, 0x2E67,
+ 0x3309, 0x2E6C, 0x330A, 0x2E6A, 0x330B, 0x2E6E, 0x330C, 0x2E70,
+ 0x330D, 0x1DAB, 0x330E, 0x2E71, 0x330F, 0x2E72, 0x3310, 0x2E73,
+ 0x3311, 0x2E74, 0x3312, 0x2E75, 0x3313, 0x2E76, 0x3314, 0x1DA2,
+ 0x3315, 0x1F69, 0x3316, 0x1F67, 0x3317, 0x2E78, 0x3318, 0x1F68,
+ 0x3319, 0x2E7A, 0x331A, 0x2E7C, 0x331B, 0x2E7D, 0x331C, 0x2E7E,
+ 0x331D, 0x2E7F, 0x331E, 0x1F73, 0x331F, 0x2E80, 0x3320, 0x2E81,
+ 0x3321, 0x2E82, 0x3322, 0x1F66, 0x3323, 0x1F6B, 0x3324, 0x2E83,
+ 0x3325, 0x2E85, 0x3326, 0x1DAC, 0x3327, 0x1DA6, 0x3328, 0x2E88,
+ 0x3329, 0x2E89, 0x332A, 0x1F74, 0x332B, 0x1DAE, 0x332D, 0x2E8B,
+ 0x332E, 0x2E8E, 0x332F, 0x2E8F, 0x3330, 0x2E90, 0x3331, 0x1F71,
+ 0x3332, 0x2E91, 0x3333, 0x2087, 0x3334, 0x2E94, 0x3335, 0x2E95,
+ 0x3336, 0x1DA8, 0x3337, 0x2E9A, 0x3338, 0x2E9C, 0x3339, 0x1F6E,
+ 0x333A, 0x2E9D, 0x333B, 0x1F6F, 0x333C, 0x2E96, 0x333D, 0x2E9E,
+ 0x333E, 0x2EA0, 0x333F, 0x2EA1, 0x3340, 0x2EA2, 0x3341, 0x2E9F,
+ 0x3342, 0x1F6D, 0x3343, 0x2EA3, 0x3344, 0x2EA4, 0x3345, 0x2EA5,
+ 0x3346, 0x2EA6, 0x3347, 0x1F72, 0x3348, 0x2EA7, 0x3349, 0x1DA1,
+ 0x334A, 0x1DAF, 0x334B, 0x2EA8, 0x334C, 0x2EA9, 0x334D, 0x1DA4,
+ 0x334E, 0x2088, 0x334F, 0x2EAA, 0x3350, 0x2EAB, 0x3351, 0x1DA9,
+ 0x3352, 0x2EAE, 0x3353, 0x2EB2, 0x3354, 0x2EAF, 0x3355, 0x2EB3,
+ 0x3356, 0x2EB4, 0x3357, 0x1F6C, 0x3371, 0x2E55, 0x337B, 0x2083,
+ 0x337C, 0x1DC7, 0x337D, 0x1DC6, 0x337E, 0x1DC5, 0x337F, 0x1F76,
+ 0x3385, 0x1F5F, 0x3386, 0x1F60, 0x3387, 0x1F61, 0x3388, 0x2000,
+ 0x3389, 0x2001, 0x338D, 0x2E58, 0x338E, 0x1DB4, 0x338F, 0x1DB5,
+ 0x3390, 0x1F63, 0x3396, 0x1F65, 0x3397, 0x1F58, 0x3398, 0x1F5A,
+ 0x339B, 0x2E59, 0x339C, 0x1DB1, 0x339D, 0x1DB2, 0x339E, 0x1DB3,
+ 0x339F, 0x1FFA, 0x33A0, 0x1F54, 0x33A1, 0x1DB7, 0x33A2, 0x1F55,
+ 0x33A3, 0x1FFB, 0x33A4, 0x1F56, 0x33A5, 0x1F57, 0x33A6, 0x1FFC,
+ 0x33B0, 0x1F5E, 0x33B1, 0x1F5D, 0x33B2, 0x1F5C, 0x33B3, 0x1F5B,
+ 0x33C2, 0x2E50, 0x33C4, 0x1DB6, 0x33C8, 0x2002, 0x33CB, 0x1F62,
+ 0x33CC, 0x1FF6, 0x33CD, 0x1DBB, 0x33D4, 0x1F64, 0x33D7, 0x2E5D,
+ 0x33D8, 0x2E5E, 0x33DA, 0x2E4B, 0x3402, 0x3582, 0x3405, 0x3C1B,
+ 0x3406, 0x435A, 0x3427, 0x3656, 0x342C, 0x435E, 0x342E, 0x3788,
+ 0x3468, 0x36DF, 0x346A, 0x4375, 0x3488, 0x3C52, 0x3492, 0x438E,
+ 0x34B5, 0x4199, 0x34BC, 0x4397, 0x34C1, 0x47D0, 0x34C7, 0x439B,
+ 0x34DB, 0x3C41, 0x351F, 0x3629, 0x353E, 0x371E, 0x355D, 0x43BD,
+ 0x355E, 0x43BE, 0x3563, 0x43C0, 0x356E, 0x43C4, 0x35A6, 0x43D9,
+ 0x35A8, 0x43DB, 0x35C5, 0x43E1, 0x35DA, 0x43EA, 0x35DE, 0x4E63,
+ 0x35F4, 0x43F3, 0x3605, 0x43FA, 0x3614, 0x4ABB, 0x364A, 0x4421,
+ 0x3691, 0x4441, 0x3696, 0x4445, 0x3699, 0x4443, 0x36CF, 0x4456,
+ 0x3761, 0x4478, 0x3762, 0x4479, 0x376B, 0x447D, 0x376C, 0x447C,
+ 0x3775, 0x4480, 0x378D, 0x361A, 0x37C1, 0x448E, 0x37E2, 0x372B,
+ 0x37E8, 0x44A2, 0x37F4, 0x44A5, 0x37FD, 0x44A8, 0x3800, 0x44AA,
+ 0x382F, 0x44B4, 0x3836, 0x44B5, 0x3840, 0x44B6, 0x385C, 0x44BA,
+ 0x3861, 0x44BC, 0x38A1, 0x4ECB, 0x38AD, 0x4ABC, 0x38FA, 0x361C,
+ 0x3917, 0x44D9, 0x391A, 0x44DC, 0x396F, 0x44EB, 0x39A4, 0x4E9A,
+ 0x39B8, 0x4E9B, 0x3A5C, 0x4E9F, 0x3A6E, 0x4531, 0x3A73, 0x4534,
+ 0x3A85, 0x4EAE, 0x3AC4, 0x4EA7, 0x3ACB, 0x4EA8, 0x3AD6, 0x4543,
+ 0x3AD7, 0x455E, 0x3AEA, 0x454D, 0x3AF3, 0x3C40, 0x3B0E, 0x4558,
+ 0x3B1A, 0x455C, 0x3B1C, 0x455D, 0x3B22, 0x3C49, 0x3B6D, 0x458C,
+ 0x3B77, 0x4585, 0x3B87, 0x45A2, 0x3B88, 0x368D, 0x3B8D, 0x45A4,
+ 0x3BA4, 0x45AA, 0x3BB6, 0x420E, 0x3BC3, 0x420F, 0x3BCD, 0x45B8,
+ 0x3BF0, 0x45C9, 0x3BF3, 0x4EB7, 0x3C0F, 0x4217, 0x3C26, 0x45DF,
+ 0x3CC3, 0x45FC, 0x3CD2, 0x4601, 0x3D11, 0x4625, 0x3D1E, 0x4630,
+ 0x3D31, 0x4EBE, 0x3D4E, 0x1DE7, 0x3D64, 0x464A, 0x3D9A, 0x4658,
+ 0x3DC0, 0x466A, 0x3DCC, 0x4ABD, 0x3DD4, 0x466F, 0x3E05, 0x467B,
+ 0x3E3F, 0x4248, 0x3E40, 0x4ECA, 0x3E60, 0x468B, 0x3E66, 0x468D,
+ 0x3E68, 0x468E, 0x3E83, 0x4695, 0x3E8A, 0x3C43, 0x3E94, 0x469B,
+ 0x3EDA, 0x3C48, 0x3F57, 0x46CB, 0x3F72, 0x4258, 0x3F75, 0x46D9,
+ 0x3F77, 0x46DB, 0x3FAE, 0x46ED, 0x3FB1, 0x3754, 0x3FC9, 0x46F8,
+ 0x3FD7, 0x46FD, 0x3FDC, 0x4ABE, 0x4039, 0x470F, 0x4058, 0x4716,
+ 0x4093, 0x3C4C, 0x4103, 0x3C4F, 0x4105, 0x473B, 0x4148, 0x4747,
+ 0x414F, 0x474A, 0x4163, 0x474E, 0x41B4, 0x475D, 0x41BF, 0x4760,
+ 0x41E6, 0x476B, 0x41EE, 0x476F, 0x41F3, 0x476C, 0x4207, 0x4776,
+ 0x420E, 0x4779, 0x4264, 0x3760, 0x4293, 0x3C50, 0x42C6, 0x479F,
+ 0x42D6, 0x47AA, 0x42DD, 0x47AE, 0x4302, 0x47BC, 0x432B, 0x47C9,
+ 0x4343, 0x47CB, 0x43EE, 0x47F7, 0x43F0, 0x47FA, 0x4408, 0x4800,
+ 0x440C, 0x3C42, 0x4417, 0x4802, 0x441C, 0x4803, 0x4422, 0x4805,
+ 0x4453, 0x3773, 0x445B, 0x42A4, 0x4476, 0x481C, 0x447A, 0x481D,
+ 0x4491, 0x4823, 0x44B3, 0x483E, 0x44BE, 0x483C, 0x44D4, 0x483D,
+ 0x4508, 0x485C, 0x450D, 0x4858, 0x4525, 0x377E, 0x4543, 0x486C,
+ 0x457A, 0x3C4B, 0x459D, 0x42D4, 0x45B8, 0x48A0, 0x45BE, 0x4ABF,
+ 0x45E5, 0x48BA, 0x45EA, 0x42D9, 0x460F, 0x48CA, 0x4610, 0x4AC0,
+ 0x4641, 0x48D8, 0x4665, 0x3C4E, 0x46A1, 0x48E9, 0x46AE, 0x3C51,
+ 0x46AF, 0x48ED, 0x470C, 0x4902, 0x471F, 0x4EFB, 0x4764, 0x4918,
+ 0x47E6, 0x3790, 0x47FD, 0x4924, 0x4816, 0x492E, 0x481E, 0x4F01,
+ 0x4844, 0x42F5, 0x484E, 0x493A, 0x48B5, 0x495B, 0x49B0, 0x431F,
+ 0x49E7, 0x49D2, 0x49FA, 0x49D6, 0x4A04, 0x49DB, 0x4A29, 0x49DE,
+ 0x4ABC, 0x49F6, 0x4B38, 0x35DF, 0x4B3B, 0x4A0E, 0x4B7E, 0x4AC1,
+ 0x4BC2, 0x4A33, 0x4BCA, 0x4A35, 0x4BD2, 0x4A37, 0x4BE8, 0x3C46,
+ 0x4C17, 0x4334, 0x4C20, 0x4A48, 0x4C38, 0x4AC2, 0x4CC4, 0x4A84,
+ 0x4CD1, 0x4A87, 0x4CE1, 0x4AC3, 0x4D07, 0x4A9B, 0x4D77, 0x4AAB,
+ 0x4E00, 0x04B0, 0x4E01, 0x0BB8, 0x4E02, 0x4352, 0x4E03, 0x08E3,
+ 0x4E04, 0x37D8, 0x4E05, 0x37D9, 0x4E07, 0x0EAA, 0x4E08, 0x09CE,
+ 0x4E09, 0x087E, 0x4E0A, 0x09CD, 0x4E0B, 0x053C, 0x4E0C, 0x4AC4,
+ 0x4E0D, 0x0DC6, 0x4E0E, 0x0F29, 0x4E0F, 0x4353, 0x4E10, 0x0FFB,
+ 0x4E11, 0x04D1, 0x4E12, 0x4354, 0x4E14, 0x05CC, 0x4E15, 0x0FFC,
+ 0x4E16, 0x0A48, 0x4E17, 0x10D7, 0x4E18, 0x0670, 0x4E19, 0x0E0A,
+ 0x4E1E, 0x09CF, 0x4E1F, 0x37DA, 0x4E21, 0x0F86, 0x4E23, 0x4AC5,
+ 0x4E24, 0x4AC6, 0x4E26, 0x0E12, 0x4E28, 0x20B3, 0x4E29, 0x4355,
+ 0x4E2A, 0x0FFD, 0x4E2B, 0x37DB, 0x4E2C, 0x374D, 0x4E2D, 0x0BA4,
+ 0x4E2E, 0x4356, 0x4E2F, 0x37DC, 0x4E30, 0x37DD, 0x4E31, 0x0FFE,
+ 0x4E32, 0x06F2, 0x4E36, 0x0FFF, 0x4E37, 0x369D, 0x4E38, 0x0619,
+ 0x4E39, 0x0B6E, 0x4E3B, 0x0913, 0x4E3C, 0x1000, 0x4E3F, 0x1001,
+ 0x4E40, 0x37DE, 0x4E41, 0x37DF, 0x4E42, 0x1002, 0x4E43, 0x0CEB,
+ 0x4E44, 0x37E0, 0x4E45, 0x0671, 0x4E47, 0x4357, 0x4E48, 0x372E,
+ 0x4E4B, 0x0CED, 0x4E4D, 0x0CBB, 0x4E4E, 0x0777, 0x4E4F, 0x0E61,
+ 0x4E51, 0x4359, 0x4E55, 0x1950, 0x4E56, 0x1003, 0x4E57, 0x09D0,
+ 0x4E58, 0x1004, 0x4E59, 0x0535, 0x4E5A, 0x37E1, 0x4E5D, 0x06DD,
+ 0x4E5E, 0x07A4, 0x4E5F, 0x0EF5, 0x4E62, 0x1233, 0x4E69, 0x435C,
+ 0x4E71, 0x0F5A, 0x4E73, 0x0CD5, 0x4E79, 0x4AC7, 0x4E7E, 0x05E1,
+ 0x4E7F, 0x37E2, 0x4E80, 0x064F, 0x4E82, 0x1005, 0x4E85, 0x1006,
+ 0x4E86, 0x0F83, 0x4E88, 0x0F27, 0x4E89, 0x0AEA, 0x4E8A, 0x1008,
+ 0x4E8B, 0x08C4, 0x4E8C, 0x0CCB, 0x4E8D, 0x37E3, 0x4E8E, 0x100B,
+ 0x4E91, 0x04E0, 0x4E92, 0x0793, 0x4E94, 0x0792, 0x4E95, 0x04AA,
+ 0x4E96, 0x37E4, 0x4E98, 0x0FF1, 0x4E99, 0x0FF0, 0x4E9B, 0x0823,
+ 0x4E9C, 0x0465, 0x4E9D, 0x435D, 0x4E9E, 0x100C, 0x4E9F, 0x100D,
+ 0x4EA0, 0x100E, 0x4EA1, 0x0E62, 0x4EA2, 0x100F, 0x4EA4, 0x07A6,
+ 0x4EA5, 0x04AB, 0x4EA6, 0x0EA0, 0x4EA8, 0x0696, 0x4EAB, 0x0697,
+ 0x4EAC, 0x0698, 0x4EAD, 0x0BFE, 0x4EAE, 0x0F84, 0x4EB0, 0x1010,
+ 0x4EB3, 0x1011, 0x4EB6, 0x1012, 0x4EB9, 0x37E5, 0x4EBA, 0x0A13,
+ 0x4EBB, 0x3620, 0x4EBC, 0x435F, 0x4EC0, 0x0944, 0x4EC1, 0x0A14,
+ 0x4EC2, 0x1017, 0x4EC3, 0x4360, 0x4EC4, 0x1015, 0x4EC6, 0x1016,
+ 0x4EC7, 0x0672, 0x4EC8, 0x4361, 0x4ECA, 0x0813, 0x4ECB, 0x0570,
+ 0x4ECD, 0x1014, 0x4ECE, 0x1013, 0x4ECF, 0x0DF9, 0x4ED0, 0x37E6,
+ 0x4ED4, 0x0894, 0x4ED5, 0x0893, 0x4ED6, 0x0B1E, 0x4ED7, 0x1018,
+ 0x4ED8, 0x0DC7, 0x4ED9, 0x0A8B, 0x4EDA, 0x4363, 0x4EDD, 0x0290,
+ 0x4EDE, 0x1019, 0x4EDF, 0x101B, 0x4EE0, 0x37E7, 0x4EE1, 0x20B4,
+ 0x4EE3, 0x0B45, 0x4EE4, 0x0FA9, 0x4EE5, 0x048E, 0x4EEB, 0x4362,
+ 0x4EED, 0x101A, 0x4EEE, 0x053E, 0x4EF0, 0x06BC, 0x4EF1, 0x4364,
+ 0x4EF2, 0x0BA5, 0x4EF3, 0x4AC8, 0x4EF5, 0x4365, 0x4EF6, 0x0745,
+ 0x4EF7, 0x101C, 0x4EFB, 0x0CDA, 0x4EFC, 0x20B5, 0x4EFD, 0x37E8,
+ 0x4EFF, 0x37E9, 0x4F00, 0x20B6, 0x4F01, 0x0627, 0x4F03, 0x20B7,
+ 0x4F09, 0x101D, 0x4F0A, 0x048F, 0x4F0B, 0x37EA, 0x4F0C, 0x4AC9,
+ 0x4F0D, 0x0794, 0x4F0E, 0x0628, 0x4F0F, 0x0DEC, 0x4F10, 0x0D46,
+ 0x4F11, 0x0673, 0x4F15, 0x37EB, 0x4F16, 0x4366, 0x4F19, 0x4ACA,
+ 0x4F1A, 0x0571, 0x4F1C, 0x1040, 0x4F1D, 0x0C3B, 0x4F2B, 0x4ACB,
+ 0x4F2E, 0x4ACC, 0x4F2F, 0x0D22, 0x4F30, 0x101F, 0x4F31, 0x4ACD,
+ 0x4F34, 0x0D50, 0x4F36, 0x0FAA, 0x4F37, 0x4368, 0x4F38, 0x09F3,
+ 0x4F39, 0x20B8, 0x4F3A, 0x0895, 0x4F3B, 0x37ED, 0x4F3C, 0x08C5,
+ 0x4F3D, 0x0540, 0x4F3E, 0x4369, 0x4F43, 0x0BED, 0x4F46, 0x0B60,
+ 0x4F47, 0x1023, 0x4F48, 0x418B, 0x4F49, 0x37EE, 0x4F4D, 0x0490,
+ 0x4F4E, 0x0BFF, 0x4F4F, 0x0945, 0x4F50, 0x0824, 0x4F51, 0x0F0E,
+ 0x4F53, 0x0B2E, 0x4F54, 0x37EF, 0x4F55, 0x053F, 0x4F56, 0x20B9,
+ 0x4F57, 0x1022, 0x4F58, 0x436A, 0x4F59, 0x0F28, 0x4F5A, 0x101E,
+ 0x4F5B, 0x1020, 0x4F5C, 0x085E, 0x4F5D, 0x1021, 0x4F5E, 0x11D3,
+ 0x4F5F, 0x418C, 0x4F60, 0x37EC, 0x4F64, 0x4367, 0x4F69, 0x1029,
+ 0x4F6A, 0x418D, 0x4F6C, 0x418E, 0x4F6F, 0x102C, 0x4F70, 0x102A,
+ 0x4F73, 0x0542, 0x4F75, 0x0E0B, 0x4F76, 0x1024, 0x4F77, 0x436C,
+ 0x4F78, 0x436D, 0x4F7A, 0x37F0, 0x4F7B, 0x1028, 0x4F7C, 0x07A7,
+ 0x4F7D, 0x37F1, 0x4F7E, 0x37F2, 0x4F7F, 0x0896, 0x4F82, 0x436E,
+ 0x4F83, 0x05E2, 0x4F84, 0x4ACE, 0x4F85, 0x436F, 0x4F86, 0x102D,
+ 0x4F88, 0x1025, 0x4F8A, 0x20BB, 0x4F8B, 0x0FAB, 0x4F8D, 0x08C6,
+ 0x4F8F, 0x1026, 0x4F91, 0x102B, 0x4F92, 0x20BA, 0x4F94, 0x20BD,
+ 0x4F96, 0x102E, 0x4F97, 0x37F3, 0x4F98, 0x1027, 0x4F9A, 0x20BC,
+ 0x4F9B, 0x0699, 0x4F9D, 0x0491, 0x4F9E, 0x4ACF, 0x4FA0, 0x069A,
+ 0x4FA1, 0x0541, 0x4FAB, 0x11D4, 0x4FAD, 0x0EA7, 0x4FAE, 0x0DE0,
+ 0x4FAF, 0x07A8, 0x4FB2, 0x4371, 0x4FB5, 0x09F5, 0x4FB6, 0x0F7F,
+ 0x4FB7, 0x4AD0, 0x4FBE, 0x37F4, 0x4FBF, 0x0E28, 0x4FC2, 0x070E,
+ 0x4FC3, 0x0B05, 0x4FC4, 0x0564, 0x4FC5, 0x4372, 0x4FC9, 0x20AC,
+ 0x4FCA, 0x095D, 0x4FCB, 0x4373, 0x4FCD, 0x20BE, 0x4FCE, 0x1032,
+ 0x4FCF, 0x37F5, 0x4FD0, 0x1037, 0x4FD1, 0x1035, 0x4FD2, 0x4374,
+ 0x4FD3, 0x3C2F, 0x4FD4, 0x1030, 0x4FD7, 0x0B0F, 0x4FD8, 0x1033,
+ 0x4FDA, 0x1036, 0x4FDB, 0x1034, 0x4FDD, 0x0E2D, 0x4FDF, 0x1031,
+ 0x4FE0, 0x1DEC, 0x4FE1, 0x09F4, 0x4FE3, 0x0EA1, 0x4FE4, 0x1038,
+ 0x4FE5, 0x1039, 0x4FE6, 0x4370, 0x4FEE, 0x092E, 0x4FEF, 0x1046,
+ 0x4FF1, 0x35A3, 0x4FF2, 0x4376, 0x4FF3, 0x0D06, 0x4FF5, 0x0DA8,
+ 0x4FF6, 0x1041, 0x4FF8, 0x0E40, 0x4FFA, 0x0536, 0x4FFD, 0x37F6,
+ 0x4FFE, 0x1045, 0x4FFF, 0x20C1, 0x5000, 0x37F7, 0x5001, 0x37F8,
+ 0x5002, 0x4F4B, 0x5004, 0x4AD1, 0x5005, 0x103F, 0x5006, 0x1048,
+ 0x5009, 0x0AD4, 0x500B, 0x0778, 0x500C, 0x4AD2, 0x500D, 0x0D12,
+ 0x500E, 0x418F, 0x500F, 0x1600, 0x5010, 0x37F9, 0x5011, 0x1047,
+ 0x5012, 0x0C57, 0x5013, 0x4377, 0x5014, 0x103C, 0x5016, 0x07AA,
+ 0x5018, 0x4190, 0x5019, 0x07A9, 0x501A, 0x103A, 0x501B, 0x37FA,
+ 0x501C, 0x4378, 0x501E, 0x20C2, 0x501F, 0x0906, 0x5021, 0x1042,
+ 0x5022, 0x20C0, 0x5023, 0x0E3F, 0x5024, 0x0B8B, 0x5025, 0x103E,
+ 0x5026, 0x0747, 0x5027, 0x37FB, 0x5028, 0x103B, 0x5029, 0x1043,
+ 0x502A, 0x103D, 0x502B, 0x0F99, 0x502C, 0x1044, 0x502D, 0x0FE7,
+ 0x502E, 0x37FC, 0x5036, 0x06DE, 0x5039, 0x0746, 0x503B, 0x3800,
+ 0x5040, 0x20BF, 0x5041, 0x4191, 0x5042, 0x20C5, 0x5043, 0x1049,
+ 0x5046, 0x20C3, 0x5047, 0x104A, 0x5048, 0x104E, 0x5049, 0x0492,
+ 0x504C, 0x4AD3, 0x504E, 0x4379, 0x504F, 0x0E20, 0x5050, 0x104D,
+ 0x5053, 0x437A, 0x5055, 0x104C, 0x5056, 0x1050, 0x5057, 0x37FD,
+ 0x505A, 0x104F, 0x505C, 0x0C00, 0x505F, 0x4AD4, 0x5062, 0x4AD5,
+ 0x5063, 0x437B, 0x5065, 0x0748, 0x5066, 0x37FE, 0x506A, 0x37FF,
+ 0x506C, 0x1051, 0x5070, 0x20C4, 0x5072, 0x08F1, 0x5074, 0x0B06,
+ 0x5075, 0x0C01, 0x5076, 0x06EE, 0x5077, 0x4AD6, 0x5078, 0x1052,
+ 0x507D, 0x0650, 0x5080, 0x1053, 0x5085, 0x1055, 0x5088, 0x437D,
+ 0x508D, 0x0E63, 0x508E, 0x4AD7, 0x508F, 0x3801, 0x5091, 0x073C,
+ 0x5092, 0x437E, 0x5093, 0x437F, 0x5094, 0x20C6, 0x5095, 0x4380,
+ 0x5096, 0x3802, 0x5098, 0x087F, 0x5099, 0x0D8B, 0x509A, 0x1054,
+ 0x509C, 0x3803, 0x509E, 0x4AD8, 0x50A2, 0x4AD9, 0x50A3, 0x437C,
+ 0x50AA, 0x4381, 0x50AC, 0x0835, 0x50AD, 0x0F2D, 0x50B1, 0x4383,
+ 0x50B2, 0x1057, 0x50B3, 0x105A, 0x50B4, 0x1056, 0x50B5, 0x0834,
+ 0x50B7, 0x0987, 0x50BA, 0x4384, 0x50BB, 0x4385, 0x50BE, 0x070F,
+ 0x50C2, 0x105B, 0x50C3, 0x4ADA, 0x50C4, 0x4386, 0x50C5, 0x06C7,
+ 0x50C7, 0x4387, 0x50C9, 0x1058, 0x50CA, 0x1059, 0x50CC, 0x3804,
+ 0x50CD, 0x0C87, 0x50CE, 0x438A, 0x50CF, 0x0AFE, 0x50D0, 0x4193,
+ 0x50D1, 0x069B, 0x50D4, 0x438C, 0x50D5, 0x0E7B, 0x50D6, 0x105C,
+ 0x50D8, 0x20C8, 0x50D9, 0x3C30, 0x50DA, 0x0F85, 0x50DE, 0x105D,
+ 0x50E1, 0x438D, 0x50E3, 0x1060, 0x50E5, 0x105E, 0x50E6, 0x3805,
+ 0x50E7, 0x0AD0, 0x50E8, 0x4ADB, 0x50E9, 0x3806, 0x50ED, 0x105F,
+ 0x50EE, 0x1061, 0x50EF, 0x3807, 0x50F0, 0x3C31, 0x50F1, 0x4ADC,
+ 0x50F2, 0x4192, 0x50F3, 0x4388, 0x50F4, 0x20C7, 0x50F5, 0x1063,
+ 0x50F9, 0x1062, 0x50FB, 0x0E18, 0x50FE, 0x4ADD, 0x5100, 0x0651,
+ 0x5101, 0x1065, 0x5102, 0x1066, 0x5103, 0x4195, 0x5104, 0x052F,
+ 0x5106, 0x4194, 0x5107, 0x4ADE, 0x5108, 0x3808, 0x5109, 0x1064,
+ 0x510B, 0x3809, 0x510C, 0x4ADF, 0x510D, 0x4AE0, 0x510E, 0x4AE1,
+ 0x5110, 0x380A, 0x5112, 0x0920, 0x5114, 0x1069, 0x5115, 0x1068,
+ 0x5116, 0x1067, 0x5117, 0x4390, 0x5118, 0x102F, 0x511A, 0x106A,
+ 0x511B, 0x380B, 0x511E, 0x380C, 0x511F, 0x0988, 0x5121, 0x106B,
+ 0x512A, 0x0F0F, 0x5132, 0x0EE5, 0x5133, 0x4AE2, 0x5135, 0x4196,
+ 0x5137, 0x106D, 0x5138, 0x4AE3, 0x513A, 0x106C, 0x513B, 0x106F,
+ 0x513C, 0x106E, 0x513F, 0x1070, 0x5140, 0x1071, 0x5141, 0x04B8,
+ 0x5143, 0x0769, 0x5144, 0x0711, 0x5145, 0x0946, 0x5146, 0x0BB9,
+ 0x5147, 0x069C, 0x5148, 0x0A8C, 0x5149, 0x07AB, 0x514A, 0x20C9,
+ 0x514B, 0x0800, 0x514C, 0x1073, 0x514D, 0x0ED4, 0x514E, 0x0C40,
+ 0x5150, 0x08C7, 0x5152, 0x1072, 0x5154, 0x1074, 0x5155, 0x4197,
+ 0x5157, 0x4198, 0x515A, 0x0C58, 0x515C, 0x05D3, 0x515F, 0x380D,
+ 0x5160, 0x4392, 0x5162, 0x1075, 0x5164, 0x20CA, 0x5165, 0x0CD6,
+ 0x5167, 0x368E, 0x5168, 0x0AB6, 0x5169, 0x1077, 0x516A, 0x1078,
+ 0x516B, 0x0D40, 0x516C, 0x07AC, 0x516D, 0x0FE1, 0x516E, 0x1079,
+ 0x5171, 0x069E, 0x5173, 0x4394, 0x5174, 0x4AE4, 0x5175, 0x0E0C,
+ 0x5176, 0x0B16, 0x5177, 0x06E9, 0x5178, 0x0C2F, 0x5179, 0x3779,
+ 0x517B, 0x47D9, 0x517C, 0x0749, 0x5180, 0x107A, 0x5182, 0x107B,
+ 0x5183, 0x4395, 0x5184, 0x4AE5, 0x5185, 0x0CBA, 0x5186, 0x0501,
+ 0x5189, 0x107E, 0x518A, 0x086D, 0x518B, 0x4396, 0x518C, 0x107D,
+ 0x518D, 0x0836, 0x518F, 0x107F, 0x5190, 0x185B, 0x5191, 0x1080,
+ 0x5192, 0x0E6F, 0x5193, 0x1081, 0x5195, 0x1082, 0x5196, 0x1083,
+ 0x5197, 0x09D1, 0x5198, 0x4398, 0x5199, 0x08F8, 0x519D, 0x20CB,
+ 0x51A0, 0x05E3, 0x51A1, 0x380E, 0x51A2, 0x1086, 0x51A3, 0x4399,
+ 0x51A4, 0x1084, 0x51A5, 0x0EC9, 0x51A6, 0x1085, 0x51A8, 0x0DCC,
+ 0x51A9, 0x1087, 0x51AA, 0x1088, 0x51AB, 0x1089, 0x51AC, 0x0C59,
+ 0x51AD, 0x439A, 0x51B0, 0x108D, 0x51B1, 0x108B, 0x51B2, 0x108C,
+ 0x51B3, 0x108A, 0x51B4, 0x0853, 0x51B5, 0x108E, 0x51B6, 0x0EF6,
+ 0x51B7, 0x0FAC, 0x51B8, 0x4AE6, 0x51BA, 0x4AE7, 0x51BC, 0x380F,
+ 0x51BD, 0x108F, 0x51BE, 0x20CC, 0x51C3, 0x3C32, 0x51C4, 0x0A4C,
+ 0x51C5, 0x1090, 0x51C6, 0x0964, 0x51C8, 0x4AE8, 0x51C9, 0x1091,
+ 0x51CA, 0x419A, 0x51CB, 0x0BBA, 0x51CC, 0x0F87, 0x51CD, 0x0C5A,
+ 0x51CF, 0x4AE9, 0x51D1, 0x4AEA, 0x51D3, 0x4AEB, 0x51D4, 0x4AEC,
+ 0x51D6, 0x10DA, 0x51D8, 0x4AED, 0x51DB, 0x1092, 0x51DC, 0x205C,
+ 0x51DD, 0x06BD, 0x51DE, 0x4F4C, 0x51DF, 0x4AEE, 0x51E0, 0x1093,
+ 0x51E1, 0x0E8C, 0x51E2, 0x419B, 0x51E6, 0x0972, 0x51E7, 0x0B5C,
+ 0x51E9, 0x1095, 0x51EA, 0x0CBC, 0x51EC, 0x20CD, 0x51ED, 0x1096,
+ 0x51EE, 0x3811, 0x51F0, 0x1097, 0x51F1, 0x058C, 0x51F3, 0x439D,
+ 0x51F4, 0x3812, 0x51F5, 0x1098, 0x51F6, 0x069F, 0x51F8, 0x0CA4,
+ 0x51F9, 0x051C, 0x51FA, 0x095A, 0x51FD, 0x0D35, 0x51FE, 0x1099,
+ 0x5200, 0x0C5B, 0x5201, 0x3813, 0x5202, 0x3814, 0x5203, 0x0A15,
+ 0x5204, 0x109A, 0x5205, 0x4AEF, 0x5206, 0x0DFC, 0x5207, 0x0A7E,
+ 0x5208, 0x05DE, 0x520A, 0x05E5, 0x520B, 0x109B, 0x520E, 0x109D,
+ 0x5211, 0x0710, 0x5212, 0x439E, 0x5213, 0x3815, 0x5214, 0x109C,
+ 0x5215, 0x20CE, 0x5216, 0x439F, 0x5217, 0x0FBB, 0x521D, 0x0973,
+ 0x5224, 0x0D51, 0x5225, 0x0E1C, 0x5226, 0x4AF0, 0x5227, 0x109E,
+ 0x5228, 0x4AF1, 0x5229, 0x0F62, 0x522A, 0x109F, 0x522B, 0x4AF2,
+ 0x522E, 0x10A0, 0x5230, 0x0C78, 0x5231, 0x4AF3, 0x5232, 0x4AF4,
+ 0x5233, 0x10A1, 0x5235, 0x4AF5, 0x5236, 0x0A4D, 0x5237, 0x086E,
+ 0x5238, 0x074A, 0x5239, 0x10A2, 0x523A, 0x0897, 0x523B, 0x0801,
+ 0x523C, 0x4AF6, 0x5243, 0x0C02, 0x5244, 0x10A4, 0x5247, 0x0B07,
+ 0x5249, 0x3816, 0x524A, 0x085F, 0x524B, 0x10A5, 0x524C, 0x10A6,
+ 0x524D, 0x0AB2, 0x524F, 0x10A3, 0x5254, 0x10A8, 0x5255, 0x43A1,
+ 0x5256, 0x0E64, 0x5257, 0x419C, 0x525A, 0x4AF7, 0x525B, 0x07F6,
+ 0x525C, 0x43A2, 0x525D, 0x1E5E, 0x525E, 0x10A7, 0x5260, 0x4AF8,
+ 0x5261, 0x3817, 0x5263, 0x074B, 0x5264, 0x084E, 0x5265, 0x0D23,
+ 0x5266, 0x3818, 0x5269, 0x10AB, 0x526A, 0x10A9, 0x526C, 0x43A3,
+ 0x526E, 0x4AF9, 0x526F, 0x0DED, 0x5270, 0x09D2, 0x5271, 0x10B2,
+ 0x5272, 0x05C2, 0x5273, 0x10AC, 0x5274, 0x10AA, 0x5275, 0x0AD1,
+ 0x5277, 0x43A4, 0x5278, 0x4AFA, 0x5279, 0x4AFB, 0x527D, 0x10AE,
+ 0x527F, 0x10AD, 0x5282, 0x43A6, 0x5283, 0x05A2, 0x5284, 0x43A5,
+ 0x5287, 0x0736, 0x5288, 0x10B3, 0x5289, 0x0F75, 0x528A, 0x4AFC,
+ 0x528C, 0x4AFD, 0x528D, 0x10AF, 0x5291, 0x10B4, 0x5292, 0x10B1,
+ 0x5293, 0x3819, 0x5294, 0x10B0, 0x5298, 0x43A8, 0x529B, 0x0F97,
+ 0x529C, 0x20CF, 0x529F, 0x07AD, 0x52A0, 0x0543, 0x52A3, 0x0FBC,
+ 0x52A4, 0x43AA, 0x52A6, 0x20D0, 0x52A9, 0x097F, 0x52AA, 0x0C52,
+ 0x52AB, 0x07F7, 0x52AC, 0x10B7, 0x52AD, 0x10B8, 0x52AF, 0x217D,
+ 0x52B1, 0x0FAD, 0x52B4, 0x0FD1, 0x52B5, 0x10BA, 0x52B9, 0x07AE,
+ 0x52BA, 0x43AB, 0x52BB, 0x43AC, 0x52BC, 0x10B9, 0x52BE, 0x058D,
+ 0x52C0, 0x20D1, 0x52C1, 0x10BB, 0x52C3, 0x0E84, 0x52C5, 0x0BD8,
+ 0x52C7, 0x0F10, 0x52C8, 0x381A, 0x52C9, 0x0E29, 0x52CA, 0x43AD,
+ 0x52CC, 0x419D, 0x52CD, 0x10BC, 0x52D0, 0x36E8, 0x52D1, 0x43AE,
+ 0x52D2, 0x1BEE, 0x52D5, 0x0C88, 0x52D6, 0x419E, 0x52D7, 0x10BD,
+ 0x52D8, 0x05E6, 0x52D9, 0x0EBF, 0x52DB, 0x20D2, 0x52DD, 0x0989,
+ 0x52DE, 0x10BE, 0x52DF, 0x0E37, 0x52E0, 0x10C2, 0x52E1, 0x4AFE,
+ 0x52E2, 0x0A4E, 0x52E3, 0x10BF, 0x52E4, 0x06C8, 0x52E6, 0x10C0,
+ 0x52E7, 0x05E7, 0x52E9, 0x4AFF, 0x52F0, 0x381B, 0x52F1, 0x4B00,
+ 0x52F2, 0x0704, 0x52F3, 0x10C3, 0x52F5, 0x10C4, 0x52F7, 0x43B0,
+ 0x52F8, 0x10C5, 0x52F9, 0x10C6, 0x52FA, 0x0907, 0x52FB, 0x419F,
+ 0x52FE, 0x07AF, 0x52FF, 0x0EEA, 0x5300, 0x20D3, 0x5301, 0x0EF4,
+ 0x5302, 0x0CCF, 0x5303, 0x4B01, 0x5305, 0x0E41, 0x5306, 0x10C7,
+ 0x5307, 0x4F4D, 0x5308, 0x10C8, 0x530A, 0x381C, 0x530B, 0x381D,
+ 0x530D, 0x10CA, 0x530F, 0x10CC, 0x5310, 0x10CB, 0x5311, 0x4B02,
+ 0x5315, 0x10CD, 0x5316, 0x053D, 0x5317, 0x0E7A, 0x5319, 0x086C,
+ 0x531A, 0x10CE, 0x531C, 0x41A0, 0x531D, 0x0ADB, 0x531F, 0x4B03,
+ 0x5320, 0x098A, 0x5321, 0x06A1, 0x5323, 0x10CF, 0x5324, 0x20D5,
+ 0x532A, 0x0D6F, 0x532D, 0x4B04, 0x532F, 0x10D0, 0x5331, 0x10D1,
+ 0x5332, 0x4B05, 0x5333, 0x10D2, 0x5335, 0x43B1, 0x5338, 0x10D3,
+ 0x5339, 0x0D96, 0x533A, 0x06E0, 0x533B, 0x04A9, 0x533D, 0x4B06,
+ 0x533E, 0x381E, 0x533F, 0x0C97, 0x5340, 0x10D4, 0x5341, 0x0947,
+ 0x5342, 0x43B2, 0x5343, 0x0A8D, 0x5345, 0x10D6, 0x5346, 0x10D5,
+ 0x5347, 0x098B, 0x5348, 0x0795, 0x5349, 0x10D8, 0x534A, 0x0D52,
+ 0x534B, 0x3820, 0x534C, 0x381F, 0x534D, 0x10D9, 0x5351, 0x0D70,
+ 0x5352, 0x0B14, 0x5353, 0x0B4E, 0x5354, 0x06A0, 0x5357, 0x0CC6,
+ 0x5358, 0x0B6F, 0x535A, 0x0D24, 0x535C, 0x0E7C, 0x535E, 0x10DB,
+ 0x5360, 0x0A8E, 0x5361, 0x3821, 0x5363, 0x41A1, 0x5365, 0x4B07,
+ 0x5366, 0x070B, 0x5367, 0x43B5, 0x5369, 0x10DC, 0x536C, 0x3822,
+ 0x536D, 0x4B08, 0x536E, 0x10DD, 0x536F, 0x04CE, 0x5370, 0x04B9,
+ 0x5371, 0x0629, 0x5372, 0x20D6, 0x5373, 0x0B08, 0x5374, 0x066B,
+ 0x5375, 0x0F5B, 0x5377, 0x10E0, 0x5378, 0x0537, 0x5379, 0x4B09,
+ 0x537A, 0x43B6, 0x537B, 0x10DF, 0x537D, 0x3435, 0x537E, 0x4B0A,
+ 0x537F, 0x06A2, 0x5382, 0x10E1, 0x5384, 0x0EFD, 0x5389, 0x37D0,
+ 0x5393, 0x20D7, 0x5394, 0x4B0B, 0x5396, 0x10E2, 0x5398, 0x0F9A,
+ 0x5399, 0x4B0C, 0x539A, 0x07B0, 0x539D, 0x41A2, 0x539F, 0x076A,
+ 0x53A0, 0x10E3, 0x53A4, 0x43B7, 0x53A5, 0x10E5, 0x53A6, 0x10E4,
+ 0x53A8, 0x0A25, 0x53A9, 0x04DB, 0x53AA, 0x4B0D, 0x53AB, 0x3823,
+ 0x53AD, 0x0500, 0x53AE, 0x10E6, 0x53AF, 0x4B0E, 0x53B0, 0x10E7,
+ 0x53B2, 0x20D8, 0x53B3, 0x076B, 0x53B4, 0x43B8, 0x53B6, 0x10E8,
+ 0x53B7, 0x43BA, 0x53BA, 0x4B0F, 0x53BB, 0x0688, 0x53C0, 0x43BB,
+ 0x53C1, 0x4B10, 0x53C2, 0x0880, 0x53C3, 0x10E9, 0x53C4, 0x4B11,
+ 0x53C5, 0x4B12, 0x53C8, 0x0EA2, 0x53C9, 0x0825, 0x53CA, 0x0674,
+ 0x53CB, 0x0F11, 0x53CC, 0x0AD2, 0x53CD, 0x0D53, 0x53CE, 0x0929,
+ 0x53D4, 0x0951, 0x53D5, 0x43BF, 0x53D6, 0x0914, 0x53D7, 0x0921,
+ 0x53D9, 0x0980, 0x53DA, 0x3824, 0x53DB, 0x0D54, 0x53DD, 0x20D9,
+ 0x53DF, 0x10EC, 0x53E0, 0x4B13, 0x53E1, 0x04E5, 0x53E2, 0x0AD3,
+ 0x53E3, 0x07B1, 0x53E4, 0x0779, 0x53E5, 0x06DF, 0x53E6, 0x3825,
+ 0x53E8, 0x10F0, 0x53E9, 0x0B5F, 0x53EA, 0x0B5E, 0x53EB, 0x06A3,
+ 0x53EC, 0x098C, 0x53ED, 0x10F1, 0x53EE, 0x10EF, 0x53EF, 0x0544,
+ 0x53F0, 0x0B46, 0x53F1, 0x08E4, 0x53F2, 0x0899, 0x53F3, 0x04C8,
+ 0x53F4, 0x43C1, 0x53F5, 0x3826, 0x53F6, 0x05CE, 0x53F7, 0x07F8,
+ 0x53F8, 0x0898, 0x53FA, 0x10F2, 0x5401, 0x10F3, 0x5403, 0x0663,
+ 0x5404, 0x05A4, 0x5408, 0x07F9, 0x5409, 0x0662, 0x540A, 0x0BFB,
+ 0x540B, 0x04C7, 0x540C, 0x0C89, 0x540D, 0x0ECA, 0x540E, 0x07B3,
+ 0x540F, 0x0F63, 0x5410, 0x0C41, 0x5411, 0x07B2, 0x5412, 0x41A3,
+ 0x5413, 0x4B14, 0x541B, 0x0705, 0x541D, 0x10FC, 0x541E, 0x368C,
+ 0x541F, 0x06DB, 0x5420, 0x0E78, 0x5424, 0x43C2, 0x5426, 0x0D71,
+ 0x5427, 0x3827, 0x5428, 0x43C3, 0x5429, 0x10FB, 0x542A, 0x4B15,
+ 0x542B, 0x061A, 0x542C, 0x10F6, 0x542D, 0x10F7, 0x542E, 0x10F9,
+ 0x5431, 0x4B16, 0x5433, 0x35C0, 0x5434, 0x4B17, 0x5435, 0x4B18,
+ 0x5436, 0x10FA, 0x5438, 0x0675, 0x5439, 0x0A27, 0x543B, 0x0DFD,
+ 0x543C, 0x10F8, 0x543D, 0x10F4, 0x543E, 0x0797, 0x543F, 0x35CF,
+ 0x5440, 0x10F5, 0x5442, 0x0FCA, 0x5443, 0x43C5, 0x5446, 0x0E42,
+ 0x5448, 0x0C04, 0x5449, 0x0796, 0x544A, 0x0802, 0x544C, 0x4B19,
+ 0x544D, 0x3828, 0x544E, 0x10FD, 0x5451, 0x0CB5, 0x5455, 0x3723,
+ 0x545F, 0x1101, 0x5462, 0x43C6, 0x5466, 0x3829, 0x5468, 0x092A,
+ 0x546A, 0x0922, 0x546B, 0x382A, 0x546C, 0x43C7, 0x5470, 0x1104,
+ 0x5471, 0x1102, 0x5473, 0x0EAF, 0x5474, 0x382B, 0x5475, 0x10FF,
+ 0x5476, 0x1108, 0x5477, 0x1103, 0x547B, 0x1106, 0x547C, 0x077A,
+ 0x547D, 0x0ECB, 0x547F, 0x41A4, 0x5480, 0x1107, 0x5484, 0x1109,
+ 0x5486, 0x110B, 0x5488, 0x41A5, 0x548A, 0x20DC, 0x548B, 0x0860,
+ 0x548C, 0x0FE8, 0x548D, 0x382C, 0x548E, 0x1100, 0x548F, 0x10FE,
+ 0x5490, 0x110A, 0x5492, 0x1105, 0x5495, 0x43C8, 0x5496, 0x382D,
+ 0x549C, 0x20DB, 0x54A0, 0x43C9, 0x54A1, 0x382E, 0x54A2, 0x110D,
+ 0x54A4, 0x1116, 0x54A5, 0x110F, 0x54A6, 0x43CA, 0x54A7, 0x4B1A,
+ 0x54A8, 0x1113, 0x54A9, 0x20DD, 0x54AA, 0x4B1B, 0x54AB, 0x1114,
+ 0x54AC, 0x1110, 0x54AD, 0x382F, 0x54AE, 0x43CB, 0x54AF, 0x1131,
+ 0x54B1, 0x4B1C, 0x54B2, 0x0859, 0x54B3, 0x058F, 0x54B7, 0x43CC,
+ 0x54B8, 0x110E, 0x54B9, 0x3830, 0x54BA, 0x43CD, 0x54BB, 0x4B1D,
+ 0x54BC, 0x1118, 0x54BD, 0x04BA, 0x54BE, 0x1117, 0x54BF, 0x3831,
+ 0x54C0, 0x0469, 0x54C1, 0x0DBC, 0x54C2, 0x1115, 0x54C3, 0x43CE,
+ 0x54C4, 0x1111, 0x54C6, 0x3832, 0x54C7, 0x110C, 0x54C8, 0x1112,
+ 0x54C9, 0x0838, 0x54CD, 0x3833, 0x54CE, 0x4B1E, 0x54D8, 0x1119,
+ 0x54E1, 0x04BB, 0x54E2, 0x1122, 0x54E5, 0x111A, 0x54E6, 0x111B,
+ 0x54E8, 0x098D, 0x54E9, 0x0E97, 0x54EA, 0x4B1F, 0x54EC, 0x43D0,
+ 0x54ED, 0x1120, 0x54EE, 0x111F, 0x54EF, 0x43D1, 0x54F1, 0x43D2,
+ 0x54F2, 0x0C29, 0x54F3, 0x43D3, 0x54FA, 0x1121, 0x54FC, 0x4B20,
+ 0x54FD, 0x111E, 0x54FF, 0x20DE, 0x5500, 0x43D4, 0x5501, 0x43D5,
+ 0x5504, 0x04D6, 0x5505, 0x4B21, 0x5506, 0x0826, 0x5507, 0x09F6,
+ 0x5508, 0x4B22, 0x5509, 0x43D6, 0x550E, 0x3834, 0x550F, 0x111C,
+ 0x5510, 0x0C5C, 0x5514, 0x111D, 0x5515, 0x4B23, 0x5516, 0x0466,
+ 0x5527, 0x4B24, 0x552A, 0x4B25, 0x552B, 0x3835, 0x552E, 0x1127,
+ 0x552F, 0x0F0D, 0x5531, 0x098F, 0x5533, 0x112D, 0x5535, 0x3836,
+ 0x5536, 0x4B26, 0x5538, 0x112C, 0x5539, 0x1123, 0x553C, 0x43D7,
+ 0x553E, 0x0B23, 0x5540, 0x1124, 0x5541, 0x43D8, 0x5544, 0x0B4F,
+ 0x5545, 0x1129, 0x5546, 0x098E, 0x5547, 0x43DA, 0x554A, 0x3837,
+ 0x554C, 0x1126, 0x554F, 0x0EF0, 0x5550, 0x41A6, 0x5551, 0x4B27,
+ 0x5553, 0x0712, 0x5556, 0x112A, 0x5557, 0x112B, 0x555C, 0x1128,
+ 0x555D, 0x112E, 0x555E, 0x1DD1, 0x5560, 0x3838, 0x5561, 0x4F54,
+ 0x5563, 0x1125, 0x5564, 0x43DC, 0x5566, 0x4B28, 0x557B, 0x1134,
+ 0x557C, 0x1139, 0x557D, 0x43DE, 0x557E, 0x1135, 0x5580, 0x1130,
+ 0x5581, 0x41A7, 0x5582, 0x43DF, 0x5583, 0x113A, 0x5584, 0x0AB3,
+ 0x5586, 0x20DF, 0x5587, 0x113C, 0x5588, 0x383A, 0x5589, 0x07B4,
+ 0x558A, 0x1132, 0x558B, 0x0BBB, 0x558E, 0x383B, 0x558F, 0x4B29,
+ 0x5591, 0x43E0, 0x5592, 0x4B2A, 0x5594, 0x4B2B, 0x5598, 0x1136,
+ 0x5599, 0x112F, 0x559A, 0x05E9, 0x559C, 0x062A, 0x559D, 0x05C3,
+ 0x559E, 0x1137, 0x559F, 0x1133, 0x55A4, 0x4B2C, 0x55A7, 0x074C,
+ 0x55A8, 0x113D, 0x55A9, 0x113B, 0x55AA, 0x0AD5, 0x55AB, 0x0664,
+ 0x55AC, 0x06A4, 0x55AD, 0x41A8, 0x55AE, 0x1138, 0x55B0, 0x06EC,
+ 0x55B2, 0x4B2D, 0x55B6, 0x04E6, 0x55BF, 0x43E5, 0x55C3, 0x4B2E,
+ 0x55C4, 0x1141, 0x55C5, 0x113F, 0x55C6, 0x4B2F, 0x55C7, 0x1178,
+ 0x55C9, 0x43E6, 0x55CC, 0x43E7, 0x55CE, 0x41A9, 0x55D1, 0x43E8,
+ 0x55D2, 0x43E2, 0x55D3, 0x4B30, 0x55D4, 0x1144, 0x55DA, 0x113E,
+ 0x55DB, 0x4B31, 0x55DC, 0x1142, 0x55DD, 0x43E9, 0x55DF, 0x1140,
+ 0x55E2, 0x43EB, 0x55E3, 0x089A, 0x55E4, 0x1143, 0x55E9, 0x43ED,
+ 0x55EC, 0x4B32, 0x55EE, 0x4B33, 0x55F1, 0x4B34, 0x55F6, 0x4B35,
+ 0x55F7, 0x1146, 0x55F8, 0x4B36, 0x55F9, 0x114B, 0x55FD, 0x1149,
+ 0x55FE, 0x1148, 0x5605, 0x4B37, 0x5606, 0x0B70, 0x5607, 0x43F0,
+ 0x5608, 0x383C, 0x5609, 0x0545, 0x560D, 0x4B38, 0x560E, 0x383D,
+ 0x560F, 0x383E, 0x5610, 0x43F1, 0x5611, 0x4B39, 0x5612, 0x4B3A,
+ 0x5614, 0x1145, 0x5616, 0x1147, 0x5617, 0x0990, 0x5618, 0x04D5,
+ 0x561B, 0x114A, 0x5620, 0x3C1D, 0x5628, 0x43EE, 0x5629, 0x055E,
+ 0x562C, 0x4B3B, 0x562F, 0x1155, 0x5630, 0x43F2, 0x5631, 0x09E4,
+ 0x5632, 0x1151, 0x5634, 0x114F, 0x5635, 0x4B3C, 0x5636, 0x1150,
+ 0x5637, 0x383F, 0x5638, 0x1152, 0x5639, 0x4B3D, 0x563B, 0x41AA,
+ 0x563D, 0x43F4, 0x563F, 0x3840, 0x5640, 0x43F5, 0x5642, 0x04DF,
+ 0x5647, 0x43F6, 0x5649, 0x3841, 0x564B, 0x3842, 0x564C, 0x0ABB,
+ 0x564D, 0x4B3E, 0x564E, 0x114C, 0x564F, 0x3843, 0x5650, 0x114D,
+ 0x5653, 0x1F1B, 0x5654, 0x4B3F, 0x565B, 0x05D8, 0x565E, 0x43F7,
+ 0x5660, 0x43F8, 0x5664, 0x1154, 0x5666, 0x3844, 0x5668, 0x062B,
+ 0x5669, 0x3845, 0x566A, 0x1157, 0x566B, 0x1153, 0x566C, 0x1156,
+ 0x566D, 0x43F9, 0x566F, 0x3846, 0x5671, 0x3847, 0x5672, 0x3848,
+ 0x5674, 0x0DFE, 0x5676, 0x3C33, 0x5678, 0x0CAD, 0x567A, 0x0D4C,
+ 0x5680, 0x1159, 0x5685, 0x4B40, 0x5686, 0x1158, 0x5687, 0x05A3,
+ 0x5688, 0x43FB, 0x568A, 0x115A, 0x568C, 0x43FC, 0x568F, 0x115D,
+ 0x5694, 0x115C, 0x5695, 0x3849, 0x5699, 0x1DE6, 0x569A, 0x384A,
+ 0x569D, 0x43FD, 0x569E, 0x41AB, 0x569F, 0x4B41, 0x56A0, 0x115B,
+ 0x56A2, 0x0CEF, 0x56A5, 0x115E, 0x56A6, 0x4B42, 0x56A8, 0x43FE,
+ 0x56A9, 0x41AC, 0x56AC, 0x384B, 0x56AD, 0x384C, 0x56AE, 0x115F,
+ 0x56B1, 0x384D, 0x56B2, 0x43FF, 0x56B3, 0x41AD, 0x56B4, 0x1161,
+ 0x56B6, 0x1160, 0x56B7, 0x4B43, 0x56BC, 0x1163, 0x56C0, 0x1166,
+ 0x56C1, 0x1164, 0x56C2, 0x1162, 0x56C3, 0x1165, 0x56C5, 0x4400,
+ 0x56C8, 0x1167, 0x56C9, 0x384E, 0x56CA, 0x1E5A, 0x56CC, 0x4B44,
+ 0x56CD, 0x4401, 0x56CE, 0x1168, 0x56CF, 0x4B45, 0x56D1, 0x1169,
+ 0x56D3, 0x116A, 0x56D7, 0x116B, 0x56D8, 0x107C, 0x56D9, 0x4B46,
+ 0x56DA, 0x0928, 0x56DB, 0x089B, 0x56DD, 0x384F, 0x56DE, 0x0573,
+ 0x56DF, 0x4402, 0x56E0, 0x04BC, 0x56E1, 0x4B47, 0x56E3, 0x0B82,
+ 0x56E4, 0x3850, 0x56E8, 0x4403, 0x56EB, 0x4B48, 0x56ED, 0x4B49,
+ 0x56EE, 0x116C, 0x56F0, 0x0814, 0x56F1, 0x4B4A, 0x56F2, 0x0493,
+ 0x56F3, 0x0A24, 0x56F6, 0x4404, 0x56F7, 0x4405, 0x56F9, 0x116D,
+ 0x56FA, 0x077B, 0x56FD, 0x0803, 0x56FF, 0x116F, 0x5700, 0x116E,
+ 0x5703, 0x0E30, 0x5704, 0x1170, 0x5707, 0x4B4B, 0x5708, 0x1172,
+ 0x5709, 0x1171, 0x570A, 0x3851, 0x570B, 0x1173, 0x570C, 0x4B4C,
+ 0x570D, 0x1174, 0x570F, 0x074D, 0x5712, 0x0502, 0x5713, 0x1175,
+ 0x5715, 0x3852, 0x5716, 0x1177, 0x5718, 0x1176, 0x571A, 0x4B4D,
+ 0x571B, 0x4B4E, 0x571C, 0x1179, 0x571D, 0x4B4F, 0x571F, 0x0C54,
+ 0x5721, 0x3680, 0x5723, 0x3853, 0x5726, 0x117A, 0x5727, 0x0479,
+ 0x5728, 0x084F, 0x5729, 0x4408, 0x572C, 0x4B50, 0x572D, 0x0713,
+ 0x572E, 0x4B51, 0x572F, 0x3854, 0x5730, 0x0B8D, 0x5733, 0x3855,
+ 0x5734, 0x3856, 0x5737, 0x117B, 0x5738, 0x117C, 0x573B, 0x117E,
+ 0x573D, 0x4B52, 0x573E, 0x4B53, 0x5740, 0x117F, 0x5742, 0x0854,
+ 0x5745, 0x440A, 0x5746, 0x440B, 0x5747, 0x06C9, 0x574A, 0x0E65,
+ 0x574C, 0x3857, 0x574D, 0x440C, 0x574E, 0x117D, 0x574F, 0x1180,
+ 0x5750, 0x0831, 0x5751, 0x07B5, 0x5759, 0x20E0, 0x575F, 0x4B54,
+ 0x5761, 0x1184, 0x5764, 0x0815, 0x5765, 0x20E1, 0x5766, 0x0B71,
+ 0x5768, 0x440E, 0x5769, 0x1181, 0x576A, 0x0BF6, 0x576B, 0x4B55,
+ 0x576D, 0x4B56, 0x576F, 0x440F, 0x5770, 0x3858, 0x5773, 0x4410,
+ 0x5774, 0x4411, 0x5775, 0x4412, 0x5777, 0x41AE, 0x577A, 0x4B57,
+ 0x577B, 0x4413, 0x577C, 0x41AF, 0x577F, 0x1185, 0x5782, 0x0A28,
+ 0x5783, 0x4B58, 0x5788, 0x1183, 0x5789, 0x1186, 0x578B, 0x0715,
+ 0x578C, 0x3859, 0x5793, 0x1187, 0x5797, 0x4B59, 0x579A, 0x4416,
+ 0x579C, 0x385A, 0x579D, 0x4417, 0x579E, 0x4418, 0x57A0, 0x1188,
+ 0x57A2, 0x07B6, 0x57A3, 0x059E, 0x57A4, 0x118A, 0x57A8, 0x4419,
+ 0x57AA, 0x118B, 0x57AC, 0x20E2, 0x57AE, 0x4B5A, 0x57B0, 0x118C,
+ 0x57B3, 0x1189, 0x57B8, 0x385B, 0x57C0, 0x1182, 0x57C3, 0x118D,
+ 0x57C6, 0x118E, 0x57C7, 0x20E4, 0x57C8, 0x20E3, 0x57CB, 0x0E92,
+ 0x57CC, 0x441C, 0x57CE, 0x09D3, 0x57CF, 0x41B1, 0x57D2, 0x1190,
+ 0x57D3, 0x1191, 0x57D4, 0x118F, 0x57D5, 0x4B5B, 0x57D6, 0x1193,
+ 0x57D7, 0x441A, 0x57DC, 0x0CEE, 0x57DE, 0x441F, 0x57DF, 0x04AC,
+ 0x57E0, 0x0DC8, 0x57E3, 0x1194, 0x57E4, 0x41B2, 0x57E6, 0x385C,
+ 0x57E7, 0x4B5C, 0x57ED, 0x385D, 0x57F0, 0x4420, 0x57F4, 0x09E5,
+ 0x57F5, 0x385E, 0x57F6, 0x385F, 0x57F7, 0x08E5, 0x57F8, 0x4422,
+ 0x57F9, 0x0D13, 0x57FA, 0x062C, 0x57FB, 0x4423, 0x57FC, 0x085B,
+ 0x57FD, 0x4424, 0x57FF, 0x3860, 0x5800, 0x0E87, 0x5802, 0x0C8A,
+ 0x5804, 0x4425, 0x5805, 0x074E, 0x5806, 0x0B2F, 0x5809, 0x3861,
+ 0x580A, 0x1192, 0x580B, 0x1195, 0x580D, 0x4B5D, 0x5815, 0x0B24,
+ 0x5819, 0x1196, 0x581D, 0x1197, 0x581E, 0x4426, 0x5820, 0x3862,
+ 0x5821, 0x1199, 0x5824, 0x0C05, 0x5826, 0x4B5E, 0x5827, 0x4427,
+ 0x582A, 0x05EA, 0x582F, 0x1D32, 0x5830, 0x0503, 0x5831, 0x0E43,
+ 0x5832, 0x3863, 0x5834, 0x09D4, 0x5835, 0x0C42, 0x5839, 0x4428,
+ 0x583A, 0x0856, 0x583D, 0x119F, 0x5840, 0x0E0D, 0x5841, 0x0FA5,
+ 0x5849, 0x442A, 0x584A, 0x0574, 0x584B, 0x119B, 0x584C, 0x442B,
+ 0x584D, 0x4B5F, 0x584F, 0x4B60, 0x5851, 0x0ABC, 0x5852, 0x119E,
+ 0x5854, 0x0C5D, 0x5857, 0x0C43, 0x5858, 0x0C5E, 0x5859, 0x0D4D,
+ 0x585A, 0x0BE9, 0x585E, 0x0839, 0x585F, 0x4B61, 0x5861, 0x1E47,
+ 0x5862, 0x119A, 0x5864, 0x41B3, 0x5867, 0x442C, 0x5869, 0x0518,
+ 0x586B, 0x0C30, 0x586D, 0x4B62, 0x5870, 0x119C, 0x5872, 0x1198,
+ 0x5875, 0x0A16, 0x5879, 0x11A0, 0x587C, 0x3864, 0x587E, 0x0958,
+ 0x587F, 0x4B63, 0x5880, 0x3865, 0x5881, 0x4B64, 0x5883, 0x06A5,
+ 0x5885, 0x11A1, 0x5889, 0x41B4, 0x588A, 0x442D, 0x588B, 0x442E,
+ 0x588D, 0x442F, 0x588F, 0x4430, 0x5890, 0x4431, 0x5893, 0x0E38,
+ 0x5894, 0x4432, 0x5897, 0x0AFF, 0x5898, 0x4B65, 0x589C, 0x0BE2,
+ 0x589D, 0x4433, 0x589E, 0x20E7, 0x589F, 0x11A3, 0x58A8, 0x0E7D,
+ 0x58A9, 0x3866, 0x58AA, 0x4434, 0x58AB, 0x11A4, 0x58AE, 0x11A9,
+ 0x58B1, 0x4435, 0x58B2, 0x20E8, 0x58B3, 0x0DFF, 0x58B8, 0x11A8,
+ 0x58B9, 0x11A2, 0x58BA, 0x11A5, 0x58BB, 0x11A7, 0x58BC, 0x4B66,
+ 0x58BE, 0x0816, 0x58C1, 0x0E19, 0x58C3, 0x4437, 0x58C5, 0x11AA,
+ 0x58C7, 0x0B83, 0x58CA, 0x0575, 0x58CC, 0x09D5, 0x58CD, 0x4438,
+ 0x58CE, 0x3867, 0x58D0, 0x3868, 0x58D1, 0x11AC, 0x58D2, 0x41B6,
+ 0x58D3, 0x11AB, 0x58D4, 0x3869, 0x58D5, 0x07FA, 0x58D7, 0x11AD,
+ 0x58D8, 0x11AF, 0x58D9, 0x11AE, 0x58DA, 0x386A, 0x58DC, 0x11B1,
+ 0x58DE, 0x11A6, 0x58DF, 0x11B3, 0x58E0, 0x41B7, 0x58E2, 0x4439,
+ 0x58E4, 0x11B2, 0x58E5, 0x11B0, 0x58E9, 0x386B, 0x58EB, 0x089C,
+ 0x58EC, 0x0A17, 0x58EE, 0x0AD6, 0x58EF, 0x11B4, 0x58F0, 0x0A60,
+ 0x58F1, 0x04B1, 0x58F2, 0x0D1A, 0x58F3, 0x443A, 0x58F4, 0x443B,
+ 0x58F7, 0x0BF7, 0x58F9, 0x11B6, 0x58FA, 0x11B5, 0x58FB, 0x11B7,
+ 0x58FC, 0x11B8, 0x58FD, 0x11B9, 0x5902, 0x11BA, 0x5905, 0x443C,
+ 0x5906, 0x443D, 0x5909, 0x0E21, 0x590A, 0x11BB, 0x590B, 0x20E9,
+ 0x590C, 0x386C, 0x590D, 0x443E, 0x590F, 0x0546, 0x5910, 0x11BC,
+ 0x5914, 0x443F, 0x5915, 0x0F26, 0x5916, 0x058E, 0x5918, 0x10DE,
+ 0x5919, 0x0952, 0x591A, 0x0B1F, 0x591B, 0x11BD, 0x591C, 0x0EF7,
+ 0x591F, 0x4B67, 0x5922, 0x0EC0, 0x5923, 0x4B68, 0x5924, 0x386D,
+ 0x5925, 0x11BF, 0x5927, 0x0B47, 0x5929, 0x0C31, 0x592A, 0x0B20,
+ 0x592B, 0x0DC9, 0x592C, 0x11C0, 0x592D, 0x11C1, 0x592E, 0x051D,
+ 0x592F, 0x386E, 0x5931, 0x08E6, 0x5932, 0x11C2, 0x5937, 0x0494,
+ 0x5938, 0x11C3, 0x5939, 0x3725, 0x593D, 0x4442, 0x593E, 0x11C4,
+ 0x5944, 0x0504, 0x5946, 0x4444, 0x5947, 0x062D, 0x5948, 0x0CB8,
+ 0x5949, 0x0E44, 0x594E, 0x11C8, 0x594F, 0x0AD7, 0x5950, 0x11C7,
+ 0x5951, 0x0716, 0x5953, 0x20EA, 0x5954, 0x0E89, 0x5955, 0x11C6,
+ 0x5957, 0x0C5F, 0x5958, 0x11CA, 0x5959, 0x4B69, 0x595A, 0x11C9,
+ 0x595B, 0x20EB, 0x595D, 0x20EC, 0x595F, 0x4447, 0x5960, 0x11CC,
+ 0x5961, 0x386F, 0x5962, 0x11CB, 0x5963, 0x20ED, 0x5965, 0x051E,
+ 0x5967, 0x11CD, 0x5968, 0x0991, 0x5969, 0x11CF, 0x596A, 0x0B63,
+ 0x596C, 0x11CE, 0x596D, 0x3870, 0x596E, 0x0E03, 0x5973, 0x0981,
+ 0x5974, 0x0C55, 0x5975, 0x4449, 0x5976, 0x444A, 0x5978, 0x11D0,
+ 0x5979, 0x4B6A, 0x597C, 0x444B, 0x597D, 0x07B7, 0x5981, 0x11D1,
+ 0x5982, 0x0CD7, 0x5983, 0x0D72, 0x5984, 0x0EDD, 0x598A, 0x0CDB,
+ 0x598B, 0x41B9, 0x598D, 0x11DA, 0x5992, 0x41BA, 0x5993, 0x0652,
+ 0x5996, 0x0F2F, 0x5997, 0x4B6B, 0x5999, 0x0EBB, 0x599B, 0x1239,
+ 0x599D, 0x11D2, 0x599F, 0x444C, 0x59A3, 0x11D5, 0x59A4, 0x20EE,
+ 0x59A5, 0x0B25, 0x59A8, 0x0E66, 0x59AC, 0x0C44, 0x59AE, 0x444D,
+ 0x59AF, 0x4B6C, 0x59B2, 0x11D6, 0x59B3, 0x4B6D, 0x59B9, 0x0E93,
+ 0x59BA, 0x20EF, 0x59BB, 0x083A, 0x59BC, 0x444E, 0x59BE, 0x0992,
+ 0x59C3, 0x41BB, 0x59C6, 0x11D7, 0x59C8, 0x444F, 0x59C9, 0x089E,
+ 0x59CA, 0x3871, 0x59CB, 0x089D, 0x59CD, 0x4450, 0x59D0, 0x047D,
+ 0x59D1, 0x077C, 0x59D2, 0x3872, 0x59D3, 0x0A4F, 0x59D4, 0x0495,
+ 0x59D9, 0x11DB, 0x59DA, 0x11DC, 0x59DC, 0x11D9, 0x59DD, 0x3873,
+ 0x59DE, 0x4451, 0x59DF, 0x4B6E, 0x59E3, 0x3874, 0x59E4, 0x3875,
+ 0x59E5, 0x04DA, 0x59E6, 0x05EB, 0x59E7, 0x4452, 0x59E8, 0x11D8,
+ 0x59EA, 0x0ED1, 0x59EB, 0x0DA3, 0x59EC, 0x36AD, 0x59EE, 0x4453,
+ 0x59F1, 0x4B6F, 0x59F6, 0x046C, 0x59F8, 0x4B70, 0x59FB, 0x04BD,
+ 0x59FF, 0x089F, 0x5A01, 0x0496, 0x5A03, 0x0467, 0x5A04, 0x3876,
+ 0x5A09, 0x11E1, 0x5A0C, 0x3877, 0x5A0D, 0x4457, 0x5A11, 0x11DF,
+ 0x5A13, 0x41BC, 0x5A17, 0x4458, 0x5A18, 0x0EC8, 0x5A1A, 0x11E2,
+ 0x5A1B, 0x35C1, 0x5A1C, 0x11E0, 0x5A1F, 0x11DE, 0x5A20, 0x09F7,
+ 0x5A23, 0x3878, 0x5A25, 0x11DD, 0x5A27, 0x4459, 0x5A29, 0x0E2A,
+ 0x5A2D, 0x445A, 0x5A2F, 0x0798, 0x5A35, 0x11E6, 0x5A36, 0x11E7,
+ 0x5A3C, 0x0993, 0x5A40, 0x11E3, 0x5A41, 0x0FD2, 0x5A46, 0x0D02,
+ 0x5A47, 0x3879, 0x5A49, 0x11E5, 0x5A55, 0x387A, 0x5A5A, 0x0817,
+ 0x5A62, 0x11E8, 0x5A63, 0x387B, 0x5A65, 0x445B, 0x5A66, 0x0DCA,
+ 0x5A67, 0x41BD, 0x5A6A, 0x11E9, 0x5A6C, 0x11E4, 0x5A6D, 0x387C,
+ 0x5A77, 0x41BE, 0x5A7A, 0x445C, 0x5A7E, 0x387D, 0x5A7F, 0x0EC7,
+ 0x5A84, 0x41BF, 0x5A8B, 0x445D, 0x5A92, 0x0D14, 0x5A9A, 0x11EA,
+ 0x5A9B, 0x0DA4, 0x5A9C, 0x445E, 0x5A9E, 0x387E, 0x5A9F, 0x445F,
+ 0x5AA0, 0x4460, 0x5AA2, 0x4461, 0x5AA7, 0x387F, 0x5AAC, 0x3880,
+ 0x5AB1, 0x4462, 0x5AB2, 0x4B71, 0x5AB3, 0x3881, 0x5AB5, 0x4463,
+ 0x5AB8, 0x4B72, 0x5ABA, 0x4464, 0x5ABC, 0x11EB, 0x5ABD, 0x11EF,
+ 0x5ABE, 0x11EC, 0x5ABF, 0x4465, 0x5AC1, 0x0547, 0x5AC2, 0x11EE,
+ 0x5AC4, 0x41C0, 0x5AC9, 0x08E7, 0x5ACB, 0x11ED, 0x5ACC, 0x074F,
+ 0x5AD0, 0x11FB, 0x5AD6, 0x11F4, 0x5AD7, 0x11F1, 0x5ADA, 0x4466,
+ 0x5ADC, 0x4467, 0x5AE0, 0x3882, 0x5AE1, 0x0BA2, 0x5AE3, 0x11F0,
+ 0x5AE5, 0x4468, 0x5AE6, 0x11F2, 0x5AE9, 0x11F3, 0x5AEA, 0x4B73,
+ 0x5AEE, 0x446A, 0x5AF0, 0x4469, 0x5AF5, 0x446B, 0x5AF6, 0x4B74,
+ 0x5AFA, 0x11F5, 0x5AFB, 0x11F6, 0x5B00, 0x3883, 0x5B08, 0x446C,
+ 0x5B09, 0x062E, 0x5B0B, 0x11F8, 0x5B0C, 0x11F7, 0x5B16, 0x11F9,
+ 0x5B17, 0x446D, 0x5B19, 0x3884, 0x5B1B, 0x4B75, 0x5B1D, 0x4B76,
+ 0x5B21, 0x4B77, 0x5B22, 0x09D6, 0x5B25, 0x3885, 0x5B2A, 0x11FC,
+ 0x5B2C, 0x0BF8, 0x5B2D, 0x3886, 0x5B30, 0x04E7, 0x5B32, 0x11FA,
+ 0x5B34, 0x446E, 0x5B36, 0x11FD, 0x5B38, 0x4B78, 0x5B3E, 0x11FE,
+ 0x5B40, 0x1201, 0x5B41, 0x3887, 0x5B43, 0x11FF, 0x5B45, 0x1200,
+ 0x5B4C, 0x446F, 0x5B50, 0x08A0, 0x5B51, 0x1202, 0x5B52, 0x4470,
+ 0x5B54, 0x07B8, 0x5B55, 0x1203, 0x5B56, 0x20F0, 0x5B57, 0x08C8,
+ 0x5B58, 0x0B18, 0x5B5A, 0x1204, 0x5B5B, 0x1205, 0x5B5C, 0x08A8,
+ 0x5B5D, 0x07B9, 0x5B5F, 0x0EDE, 0x5B63, 0x0642, 0x5B64, 0x077D,
+ 0x5B65, 0x1206, 0x5B66, 0x05B6, 0x5B68, 0x4471, 0x5B69, 0x1207,
+ 0x5B6B, 0x0B19, 0x5B6F, 0x4472, 0x5B70, 0x1208, 0x5B71, 0x1230,
+ 0x5B73, 0x1209, 0x5B75, 0x120A, 0x5B76, 0x3728, 0x5B78, 0x120B,
+ 0x5B7A, 0x120D, 0x5B7C, 0x3888, 0x5B7D, 0x41C2, 0x5B7E, 0x3889,
+ 0x5B7F, 0x388A, 0x5B80, 0x120E, 0x5B81, 0x4473, 0x5B82, 0x3610,
+ 0x5B83, 0x120F, 0x5B84, 0x4474, 0x5B85, 0x0B50, 0x5B87, 0x04C9,
+ 0x5B88, 0x0915, 0x5B89, 0x0486, 0x5B8A, 0x388B, 0x5B8B, 0x0AD9,
+ 0x5B8C, 0x05EC, 0x5B8D, 0x08E1, 0x5B8F, 0x07BA, 0x5B93, 0x41C3,
+ 0x5B95, 0x0C60, 0x5B96, 0x4476, 0x5B97, 0x092B, 0x5B98, 0x05ED,
+ 0x5B99, 0x0BA6, 0x5B9A, 0x0C06, 0x5B9B, 0x047C, 0x5B9C, 0x0653,
+ 0x5B9D, 0x0E45, 0x5B9F, 0x08EE, 0x5BA2, 0x066C, 0x5BA3, 0x0A8F,
+ 0x5BA4, 0x08E8, 0x5BA5, 0x0F12, 0x5BA6, 0x1210, 0x5BAC, 0x4477,
+ 0x5BAE, 0x0676, 0x5BB0, 0x083B, 0x5BB3, 0x0590, 0x5BB4, 0x0505,
+ 0x5BB5, 0x0994, 0x5BB6, 0x0548, 0x5BB7, 0x4B79, 0x5BB8, 0x1211,
+ 0x5BB9, 0x0F30, 0x5BBF, 0x0953, 0x5BC0, 0x20F1, 0x5BC2, 0x0910,
+ 0x5BC3, 0x1212, 0x5BC4, 0x062F, 0x5BC5, 0x0CAA, 0x5BC6, 0x0EB5,
+ 0x5BC7, 0x1213, 0x5BC9, 0x1214, 0x5BCC, 0x0DCB, 0x5BCE, 0x447A,
+ 0x5BD0, 0x1216, 0x5BD2, 0x05E4, 0x5BD3, 0x06EF, 0x5BD4, 0x1215,
+ 0x5BD6, 0x447B, 0x5BD7, 0x4B7A, 0x5BD8, 0x20F3, 0x5BDB, 0x05EE,
+ 0x5BDD, 0x09F8, 0x5BDE, 0x121A, 0x5BDF, 0x086F, 0x5BE0, 0x4B7B,
+ 0x5BE1, 0x0549, 0x5BE2, 0x1219, 0x5BE4, 0x1217, 0x5BE5, 0x121B,
+ 0x5BE6, 0x1218, 0x5BE7, 0x0CE1, 0x5BE8, 0x148E, 0x5BE9, 0x09F9,
+ 0x5BEB, 0x121C, 0x5BEC, 0x4F4E, 0x5BEE, 0x0F88, 0x5BF0, 0x121D,
+ 0x5BF1, 0x447E, 0x5BF3, 0x121F, 0x5BF5, 0x0BBC, 0x5BF6, 0x121E,
+ 0x5BF8, 0x0A47, 0x5BFA, 0x08C9, 0x5BFD, 0x447F, 0x5BFE, 0x0B30,
+ 0x5BFF, 0x0923, 0x5C01, 0x0DE7, 0x5C02, 0x0A90, 0x5C03, 0x4481,
+ 0x5C04, 0x08F9, 0x5C05, 0x1220, 0x5C06, 0x0995, 0x5C07, 0x1221,
+ 0x5C08, 0x1222, 0x5C09, 0x0497, 0x5C0A, 0x0B1A, 0x5C0B, 0x0A18,
+ 0x5C0D, 0x1223, 0x5C0E, 0x0C8B, 0x5C0F, 0x0996, 0x5C11, 0x0997,
+ 0x5C12, 0x41C4, 0x5C13, 0x1224, 0x5C14, 0x372A, 0x5C16, 0x0A91,
+ 0x5C19, 0x360B, 0x5C1A, 0x0998, 0x5C1E, 0x20F5, 0x5C1F, 0x4B7C,
+ 0x5C20, 0x1225, 0x5C22, 0x1226, 0x5C23, 0x388C, 0x5C24, 0x0EEC,
+ 0x5C28, 0x1227, 0x5C29, 0x4482, 0x5C2A, 0x4B7D, 0x5C2B, 0x388D,
+ 0x5C2C, 0x4B7E, 0x5C2D, 0x06BE, 0x5C30, 0x388E, 0x5C31, 0x092C,
+ 0x5C36, 0x4B7F, 0x5C38, 0x1228, 0x5C39, 0x1229, 0x5C3A, 0x0908,
+ 0x5C3B, 0x09F2, 0x5C3C, 0x0CCC, 0x5C3D, 0x0A1A, 0x5C3E, 0x0D8C,
+ 0x5C3F, 0x0CD8, 0x5C40, 0x06C1, 0x5C41, 0x122A, 0x5C45, 0x0689,
+ 0x5C46, 0x122B, 0x5C48, 0x06F6, 0x5C4A, 0x0CA7, 0x5C4B, 0x0530,
+ 0x5C4D, 0x08A1, 0x5C4E, 0x122C, 0x5C4F, 0x122F, 0x5C50, 0x122E,
+ 0x5C51, 0x06F5, 0x5C53, 0x122D, 0x5C55, 0x0C32, 0x5C59, 0x4B80,
+ 0x5C5B, 0x1E92, 0x5C5C, 0x4B81, 0x5C5E, 0x0B10, 0x5C5F, 0x4484,
+ 0x5C60, 0x0C45, 0x5C61, 0x08F4, 0x5C62, 0x1E0D, 0x5C63, 0x388F,
+ 0x5C64, 0x0ADA, 0x5C65, 0x0F64, 0x5C67, 0x4485, 0x5C68, 0x4486,
+ 0x5C69, 0x3890, 0x5C6C, 0x1231, 0x5C6D, 0x4B82, 0x5C6E, 0x1232,
+ 0x5C6F, 0x0CAE, 0x5C70, 0x4487, 0x5C71, 0x0881, 0x5C76, 0x1234,
+ 0x5C79, 0x1235, 0x5C7A, 0x41C7, 0x5C7C, 0x3891, 0x5C88, 0x448C,
+ 0x5C8A, 0x448D, 0x5C8C, 0x1236, 0x5C8F, 0x41C8, 0x5C90, 0x0630,
+ 0x5C91, 0x1237, 0x5C94, 0x1238, 0x5C9F, 0x41C9, 0x5CA0, 0x4491,
+ 0x5CA1, 0x052C, 0x5CA2, 0x4492, 0x5CA3, 0x41CA, 0x5CA6, 0x20F6,
+ 0x5CA7, 0x4493, 0x5CA8, 0x0ABD, 0x5CA9, 0x0620, 0x5CAA, 0x41CB,
+ 0x5CAB, 0x123A, 0x5CAC, 0x0EB4, 0x5CAD, 0x4495, 0x5CB1, 0x0B32,
+ 0x5CB3, 0x05B7, 0x5CB5, 0x4496, 0x5CB6, 0x123C, 0x5CB7, 0x123E,
+ 0x5CB8, 0x061B, 0x5CBA, 0x20F7, 0x5CBB, 0x123B, 0x5CBC, 0x123D,
+ 0x5CBE, 0x1240, 0x5CC5, 0x123F, 0x5CC7, 0x1241, 0x5CC9, 0x4498,
+ 0x5CCB, 0x3892, 0x5CD0, 0x41CC, 0x5CD2, 0x3893, 0x5CD9, 0x1242,
+ 0x5CDD, 0x4B83, 0x5CE0, 0x0C95, 0x5CE1, 0x06A6, 0x5CE6, 0x372C,
+ 0x5CE8, 0x0565, 0x5CE9, 0x1243, 0x5CEA, 0x1248, 0x5CED, 0x1246,
+ 0x5CEF, 0x0E47, 0x5CF0, 0x0E46, 0x5CF4, 0x3894, 0x5CF5, 0x20F8,
+ 0x5CF6, 0x0C61, 0x5CFA, 0x1245, 0x5CFB, 0x095E, 0x5CFD, 0x1244,
+ 0x5D01, 0x4B84, 0x5D06, 0x449B, 0x5D07, 0x0A38, 0x5D0B, 0x1249,
+ 0x5D0D, 0x41CE, 0x5D0E, 0x085A, 0x5D10, 0x449C, 0x5D11, 0x124F,
+ 0x5D14, 0x1250, 0x5D15, 0x124A, 0x5D16, 0x0591, 0x5D17, 0x124B,
+ 0x5D18, 0x1254, 0x5D19, 0x1253, 0x5D1A, 0x1252, 0x5D1B, 0x124E,
+ 0x5D1D, 0x449E, 0x5D1F, 0x124D, 0x5D20, 0x449F, 0x5D22, 0x1251,
+ 0x5D24, 0x3895, 0x5D26, 0x3896, 0x5D27, 0x20F9, 0x5D29, 0x0E48,
+ 0x5D2B, 0x449D, 0x5D31, 0x44A0, 0x5D34, 0x4B85, 0x5D39, 0x44A1,
+ 0x5D3D, 0x4B86, 0x5D42, 0x20FC, 0x5D43, 0x3897, 0x5D46, 0x3898,
+ 0x5D47, 0x41CF, 0x5D4A, 0x3899, 0x5D4B, 0x1258, 0x5D4C, 0x1255,
+ 0x5D4E, 0x1257, 0x5D50, 0x0F5C, 0x5D52, 0x1256, 0x5D53, 0x20FA,
+ 0x5D59, 0x4B87, 0x5D5C, 0x124C, 0x5D61, 0x44A3, 0x5D69, 0x0A39,
+ 0x5D6A, 0x44A4, 0x5D6C, 0x1259, 0x5D6D, 0x20FD, 0x5D6F, 0x0827,
+ 0x5D70, 0x44A6, 0x5D73, 0x125A, 0x5D76, 0x125B, 0x5D7E, 0x4B88,
+ 0x5D81, 0x41D0, 0x5D82, 0x125E, 0x5D83, 0x4B89, 0x5D84, 0x125D,
+ 0x5D87, 0x125C, 0x5D88, 0x44A9, 0x5D8B, 0x0C62, 0x5D8C, 0x1247,
+ 0x5D90, 0x1264, 0x5D92, 0x389A, 0x5D94, 0x389B, 0x5D97, 0x44AB,
+ 0x5D99, 0x389C, 0x5D9D, 0x1260, 0x5DA0, 0x389D, 0x5DA2, 0x125F,
+ 0x5DA4, 0x41D1, 0x5DA7, 0x41D2, 0x5DAC, 0x1261, 0x5DAE, 0x1262,
+ 0x5DB0, 0x44AC, 0x5DB2, 0x3C2D, 0x5DB4, 0x44AD, 0x5DB7, 0x1265,
+ 0x5DB8, 0x20FE, 0x5DB9, 0x20FF, 0x5DBA, 0x0FAE, 0x5DBC, 0x1266,
+ 0x5DBD, 0x1263, 0x5DC7, 0x4B8A, 0x5DC9, 0x1267, 0x5DCB, 0x41D3,
+ 0x5DCC, 0x061C, 0x5DCD, 0x1268, 0x5DD0, 0x2100, 0x5DD1, 0x44AF,
+ 0x5DD2, 0x126A, 0x5DD3, 0x1269, 0x5DD6, 0x126B, 0x5DD7, 0x44B0,
+ 0x5DD8, 0x389E, 0x5DDB, 0x126C, 0x5DDD, 0x0A92, 0x5DDE, 0x092D,
+ 0x5DE0, 0x389F, 0x5DE1, 0x096E, 0x5DE2, 0x3432, 0x5DE3, 0x0AE5,
+ 0x5DE4, 0x44B2, 0x5DE5, 0x07BB, 0x5DE6, 0x0828, 0x5DE7, 0x07BC,
+ 0x5DE8, 0x068A, 0x5DE9, 0x44B3, 0x5DEB, 0x126D, 0x5DEE, 0x0829,
+ 0x5DF1, 0x077E, 0x5DF2, 0x126E, 0x5DF3, 0x0EB2, 0x5DF4, 0x0CF9,
+ 0x5DF5, 0x126F, 0x5DF7, 0x07BD, 0x5DF8, 0x38A0, 0x5DF9, 0x4B8B,
+ 0x5DFB, 0x05E8, 0x5DFD, 0x0B65, 0x5DFE, 0x06CA, 0x5DFF, 0x35E2,
+ 0x5E00, 0x38A1, 0x5E02, 0x08A2, 0x5E03, 0x0DCD, 0x5E06, 0x0D55,
+ 0x5E0B, 0x1270, 0x5E0C, 0x0631, 0x5E11, 0x1273, 0x5E12, 0x38A2,
+ 0x5E14, 0x38A3, 0x5E15, 0x38A4, 0x5E16, 0x0BBD, 0x5E18, 0x38A5,
+ 0x5E19, 0x1272, 0x5E1A, 0x1271, 0x5E1B, 0x1274, 0x5E1D, 0x0C07,
+ 0x5E1F, 0x44B7, 0x5E25, 0x0A29, 0x5E28, 0x4B8C, 0x5E2B, 0x08A3,
+ 0x5E2D, 0x0A6E, 0x5E2E, 0x38A6, 0x5E2F, 0x0B33, 0x5E30, 0x063C,
+ 0x5E32, 0x4B8D, 0x5E33, 0x0BBE, 0x5E35, 0x4B8E, 0x5E36, 0x1275,
+ 0x5E37, 0x1276, 0x5E38, 0x09D7, 0x5E3D, 0x0E67, 0x5E3E, 0x44B8,
+ 0x5E40, 0x1279, 0x5E43, 0x1278, 0x5E44, 0x1277, 0x5E45, 0x0DEF,
+ 0x5E47, 0x1280, 0x5E49, 0x44B9, 0x5E4C, 0x0E88, 0x5E4E, 0x127A,
+ 0x5E54, 0x127C, 0x5E55, 0x0E99, 0x5E56, 0x44BB, 0x5E57, 0x127B,
+ 0x5E58, 0x38A7, 0x5E5B, 0x4B8F, 0x5E5E, 0x41D4, 0x5E5F, 0x127D,
+ 0x5E61, 0x0D3C, 0x5E62, 0x127E, 0x5E63, 0x0E0E, 0x5E64, 0x127F,
+ 0x5E68, 0x4B90, 0x5E6A, 0x4B91, 0x5E6B, 0x38A8, 0x5E6C, 0x38A9,
+ 0x5E6D, 0x44BD, 0x5E6E, 0x44BE, 0x5E72, 0x05EF, 0x5E73, 0x0E0F,
+ 0x5E74, 0x0CE5, 0x5E75, 0x1281, 0x5E76, 0x1282, 0x5E77, 0x4B92,
+ 0x5E78, 0x07BE, 0x5E79, 0x05F0, 0x5E7A, 0x1283, 0x5E7B, 0x076C,
+ 0x5E7C, 0x0F2E, 0x5E7D, 0x0F13, 0x5E7E, 0x0632, 0x5E7F, 0x1285,
+ 0x5E80, 0x4B93, 0x5E81, 0x0BBF, 0x5E83, 0x07BF, 0x5E84, 0x0999,
+ 0x5E87, 0x0D73, 0x5E8A, 0x099A, 0x5E8B, 0x4B94, 0x5E8F, 0x0982,
+ 0x5E95, 0x0C08, 0x5E96, 0x0E49, 0x5E97, 0x0C33, 0x5E99, 0x36B0,
+ 0x5E9A, 0x07C0, 0x5E9C, 0x0DCE, 0x5EA0, 0x1286, 0x5EA5, 0x44C0,
+ 0x5EA6, 0x0C53, 0x5EA7, 0x0832, 0x5EA8, 0x38AA, 0x5EAA, 0x38AB,
+ 0x5EAB, 0x077F, 0x5EAC, 0x44C1, 0x5EAD, 0x0C09, 0x5EB3, 0x4B95,
+ 0x5EB5, 0x0487, 0x5EB6, 0x0978, 0x5EB7, 0x07C1, 0x5EB8, 0x0F31,
+ 0x5EB9, 0x44C2, 0x5EBD, 0x4B96, 0x5EBE, 0x38AC, 0x5EBF, 0x38AD,
+ 0x5EC1, 0x1287, 0x5EC2, 0x1288, 0x5EC3, 0x0D07, 0x5EC6, 0x44C3,
+ 0x5EC8, 0x1289, 0x5EC9, 0x0FBF, 0x5ECA, 0x0FD3, 0x5ECB, 0x3C1E,
+ 0x5ECF, 0x128B, 0x5ED0, 0x128A, 0x5ED1, 0x4B97, 0x5ED2, 0x38AF,
+ 0x5ED3, 0x05A5, 0x5ED4, 0x4B98, 0x5ED5, 0x4B99, 0x5ED6, 0x128C,
+ 0x5ED9, 0x44C4, 0x5EDA, 0x128F, 0x5EDB, 0x1290, 0x5EDD, 0x128E,
+ 0x5EDF, 0x0DB2, 0x5EE0, 0x099B, 0x5EE1, 0x1292, 0x5EE2, 0x1291,
+ 0x5EE3, 0x128D, 0x5EE8, 0x1293, 0x5EE9, 0x1294, 0x5EEC, 0x1295,
+ 0x5EF0, 0x1298, 0x5EF1, 0x1296, 0x5EF3, 0x1297, 0x5EF4, 0x1299,
+ 0x5EF6, 0x0506, 0x5EF7, 0x0C0A, 0x5EF8, 0x129A, 0x5EF9, 0x41D5,
+ 0x5EFA, 0x0750, 0x5EFB, 0x0576, 0x5EFC, 0x0CEC, 0x5EFD, 0x44C6,
+ 0x5EFE, 0x129B, 0x5EFF, 0x0CD3, 0x5F00, 0x41D6, 0x5F01, 0x0E2B,
+ 0x5F02, 0x41D7, 0x5F03, 0x129C, 0x5F04, 0x0FD4, 0x5F07, 0x38B0,
+ 0x5F08, 0x44C7, 0x5F09, 0x129D, 0x5F0A, 0x0E10, 0x5F0B, 0x12A0,
+ 0x5F0C, 0x0FFA, 0x5F0D, 0x100A, 0x5F0E, 0x38B1, 0x5F0F, 0x08DC,
+ 0x5F10, 0x0CCD, 0x5F11, 0x12A1, 0x5F13, 0x0677, 0x5F14, 0x0BC0,
+ 0x5F15, 0x04BE, 0x5F16, 0x12A2, 0x5F17, 0x0DF6, 0x5F18, 0x07C2,
+ 0x5F1B, 0x0B8E, 0x5F1C, 0x38B2, 0x5F1D, 0x38B3, 0x5F1E, 0x44C9,
+ 0x5F1F, 0x0C0B, 0x5F21, 0x2101, 0x5F22, 0x38B4, 0x5F23, 0x41D8,
+ 0x5F25, 0x0EFB, 0x5F26, 0x076D, 0x5F27, 0x0780, 0x5F28, 0x38B5,
+ 0x5F29, 0x12A3, 0x5F2D, 0x12A4, 0x5F2F, 0x12AA, 0x5F31, 0x0911,
+ 0x5F34, 0x2102, 0x5F35, 0x0BC1, 0x5F36, 0x38B6, 0x5F37, 0x06A7,
+ 0x5F38, 0x12A5, 0x5F3A, 0x3598, 0x5F3B, 0x38B7, 0x5F3C, 0x0D9D,
+ 0x5F3D, 0x41D9, 0x5F3E, 0x0B84, 0x5F40, 0x38B8, 0x5F41, 0x12A6,
+ 0x5F45, 0x20B2, 0x5F47, 0x44CA, 0x5F48, 0x12A7, 0x5F4A, 0x06A8,
+ 0x5F4C, 0x12A8, 0x5F4D, 0x4B9A, 0x5F4E, 0x12A9, 0x5F50, 0x38B9,
+ 0x5F51, 0x12AB, 0x5F53, 0x0C70, 0x5F54, 0x41DA, 0x5F56, 0x12AC,
+ 0x5F57, 0x12AD, 0x5F58, 0x38BA, 0x5F59, 0x12AE, 0x5F5C, 0x129F,
+ 0x5F5D, 0x129E, 0x5F61, 0x12AF, 0x5F62, 0x0717, 0x5F63, 0x44CB,
+ 0x5F64, 0x38BB, 0x5F65, 0x36AC, 0x5F66, 0x0D99, 0x5F67, 0x2103,
+ 0x5F69, 0x083C, 0x5F6A, 0x0DA9, 0x5F6B, 0x0BC2, 0x5F6C, 0x0DBD,
+ 0x5F6D, 0x12B0, 0x5F70, 0x099C, 0x5F71, 0x04E8, 0x5F72, 0x44CC,
+ 0x5F73, 0x12B1, 0x5F77, 0x12B2, 0x5F79, 0x0EFE, 0x5F7C, 0x0D74,
+ 0x5F7D, 0x41DB, 0x5F7E, 0x44CD, 0x5F7F, 0x12B5, 0x5F80, 0x051F,
+ 0x5F81, 0x0A50, 0x5F82, 0x12B4, 0x5F83, 0x12B3, 0x5F84, 0x0718,
+ 0x5F85, 0x0B34, 0x5F87, 0x12B9, 0x5F88, 0x12B7, 0x5F89, 0x38BC,
+ 0x5F8A, 0x12B6, 0x5F8B, 0x0F6F, 0x5F8C, 0x0799, 0x5F8F, 0x44CE,
+ 0x5F90, 0x0983, 0x5F91, 0x12B8, 0x5F92, 0x0C46, 0x5F93, 0x0948,
+ 0x5F97, 0x0C98, 0x5F98, 0x12BC, 0x5F99, 0x12BB, 0x5F9C, 0x38BD,
+ 0x5F9E, 0x12BA, 0x5FA0, 0x12BD, 0x5FA1, 0x079A, 0x5FA2, 0x44CF,
+ 0x5FA4, 0x38BF, 0x5FA7, 0x38BE, 0x5FA8, 0x12BE, 0x5FA9, 0x0DEE,
+ 0x5FAA, 0x0965, 0x5FAC, 0x4B9B, 0x5FAD, 0x12BF, 0x5FAE, 0x0D8D,
+ 0x5FAF, 0x38C0, 0x5FB3, 0x0C99, 0x5FB4, 0x0BC3, 0x5FB5, 0x3438,
+ 0x5FB7, 0x2104, 0x5FB8, 0x38C1, 0x5FB9, 0x0C2A, 0x5FBC, 0x12C0,
+ 0x5FBD, 0x0645, 0x5FC3, 0x09FA, 0x5FC4, 0x38C2, 0x5FC5, 0x0D9E,
+ 0x5FC7, 0x44D0, 0x5FC9, 0x38C3, 0x5FCB, 0x44D1, 0x5FCC, 0x0633,
+ 0x5FCD, 0x0CDC, 0x5FD2, 0x44D2, 0x5FD3, 0x44D3, 0x5FD4, 0x44D4,
+ 0x5FD6, 0x12C1, 0x5FD7, 0x08A4, 0x5FD8, 0x0E68, 0x5FD9, 0x0E69,
+ 0x5FDC, 0x0520, 0x5FDD, 0x12C6, 0x5FDE, 0x2105, 0x5FE0, 0x0BA7,
+ 0x5FE1, 0x38C4, 0x5FE2, 0x44D5, 0x5FE4, 0x12C3, 0x5FE9, 0x38C5,
+ 0x5FEA, 0x4B9C, 0x5FEB, 0x0577, 0x5FED, 0x38C6, 0x5FEE, 0x44D6,
+ 0x5FEF, 0x44D7, 0x5FF0, 0x12F6, 0x5FF1, 0x12C5, 0x5FF3, 0x44D8,
+ 0x5FF5, 0x0CE6, 0x5FF8, 0x12C4, 0x5FFB, 0x12C2, 0x5FFC, 0x38C7,
+ 0x5FFD, 0x080C, 0x5FFF, 0x12C8, 0x6007, 0x4B9D, 0x600D, 0x41DC,
+ 0x600E, 0x12CE, 0x600F, 0x12D4, 0x6010, 0x12CC, 0x6012, 0x0C56,
+ 0x6014, 0x41DD, 0x6015, 0x12D1, 0x6016, 0x0DCF, 0x6017, 0x38C8,
+ 0x6018, 0x41DE, 0x6019, 0x12CB, 0x601A, 0x38C9, 0x601B, 0x12D0,
+ 0x601C, 0x0FAF, 0x601D, 0x08A5, 0x6020, 0x0B35, 0x6021, 0x12C9,
+ 0x6022, 0x44DA, 0x6024, 0x44DB, 0x6025, 0x0678, 0x6026, 0x12D3,
+ 0x6027, 0x0A51, 0x6028, 0x0507, 0x6029, 0x12CD, 0x602A, 0x0578,
+ 0x602B, 0x12D2, 0x602F, 0x06A9, 0x6031, 0x12CF, 0x6033, 0x38CA,
+ 0x6035, 0x41DF, 0x603A, 0x12D5, 0x6041, 0x12D7, 0x6042, 0x12E1,
+ 0x6043, 0x12DF, 0x6046, 0x12DC, 0x6047, 0x41E0, 0x6049, 0x4B9E,
+ 0x604A, 0x12DB, 0x604B, 0x0FC0, 0x604C, 0x44DD, 0x604D, 0x12DD,
+ 0x6050, 0x06AA, 0x6052, 0x07C3, 0x6054, 0x4B9F, 0x6055, 0x0984,
+ 0x6059, 0x12E4, 0x605A, 0x12D6, 0x605D, 0x2106, 0x605F, 0x12DA,
+ 0x6060, 0x12CA, 0x6061, 0x38CB, 0x6062, 0x057A, 0x6063, 0x12DE,
+ 0x6064, 0x12E0, 0x6065, 0x0B8F, 0x6067, 0x4BA0, 0x6068, 0x0818,
+ 0x6069, 0x0538, 0x606A, 0x12D8, 0x606B, 0x12E3, 0x606C, 0x12E2,
+ 0x606D, 0x06AB, 0x606F, 0x0B09, 0x6070, 0x05C4, 0x6075, 0x0719,
+ 0x6077, 0x12D9, 0x607F, 0x38CC, 0x6081, 0x12E5, 0x6083, 0x12E8,
+ 0x6084, 0x12EA, 0x6085, 0x2107, 0x6089, 0x08E9, 0x608A, 0x2108,
+ 0x608B, 0x12F0, 0x608C, 0x0C0C, 0x608D, 0x12E6, 0x6092, 0x12EE,
+ 0x6094, 0x0579, 0x6095, 0x44DE, 0x6096, 0x12EC, 0x6097, 0x12ED,
+ 0x609A, 0x12E9, 0x609B, 0x12EB, 0x609D, 0x41E1, 0x609E, 0x38CD,
+ 0x609F, 0x079B, 0x60A0, 0x0F14, 0x60A3, 0x05F1, 0x60A4, 0x38CE,
+ 0x60A6, 0x04FB, 0x60A7, 0x12EF, 0x60A8, 0x44DF, 0x60A9, 0x0CF0,
+ 0x60AA, 0x0471, 0x60B0, 0x38CF, 0x60B1, 0x44E1, 0x60B2, 0x0D75,
+ 0x60B3, 0x12C7, 0x60B4, 0x12F5, 0x60B5, 0x12F9, 0x60B6, 0x0EF1,
+ 0x60B8, 0x12F2, 0x60BB, 0x4BA1, 0x60BC, 0x0C63, 0x60BD, 0x12F7,
+ 0x60BE, 0x44E2, 0x60C4, 0x4BA2, 0x60C5, 0x09D8, 0x60C6, 0x12F8,
+ 0x60C7, 0x0CAF, 0x60C8, 0x44E3, 0x60CB, 0x38D0, 0x60D1, 0x0FED,
+ 0x60D3, 0x12F4, 0x60D4, 0x41E2, 0x60D5, 0x210A, 0x60D8, 0x12FA,
+ 0x60D9, 0x44E4, 0x60DA, 0x080D, 0x60DB, 0x38D1, 0x60DC, 0x0A6F,
+ 0x60DD, 0x41E3, 0x60DE, 0x2109, 0x60DF, 0x0498, 0x60E0, 0x12F3,
+ 0x60E1, 0x12F1, 0x60E3, 0x0ADC, 0x60E7, 0x12E7, 0x60E8, 0x0882,
+ 0x60EE, 0x44E5, 0x60F0, 0x0B26, 0x60F1, 0x1306, 0x60F2, 0x210C,
+ 0x60F3, 0x0ADD, 0x60F4, 0x1301, 0x60F5, 0x44E6, 0x60F6, 0x12FE,
+ 0x60F7, 0x12FF, 0x60F8, 0x38D2, 0x60F9, 0x0912, 0x60FA, 0x1302,
+ 0x60FB, 0x1305, 0x60FD, 0x4BA3, 0x6100, 0x1300, 0x6101, 0x092F,
+ 0x6103, 0x1303, 0x6106, 0x12FD, 0x6108, 0x0F08, 0x6109, 0x0F07,
+ 0x610A, 0x4BA4, 0x610D, 0x1307, 0x610E, 0x1308, 0x610F, 0x0499,
+ 0x6110, 0x44E7, 0x6111, 0x210D, 0x6112, 0x38D3, 0x6113, 0x38D4,
+ 0x6114, 0x38D5, 0x6115, 0x12FC, 0x6116, 0x4BA5, 0x6119, 0x44E8,
+ 0x611A, 0x06EA, 0x611B, 0x046A, 0x611C, 0x38D6, 0x611E, 0x44E9,
+ 0x611F, 0x05F2, 0x6120, 0x210B, 0x6121, 0x1304, 0x6127, 0x130C,
+ 0x6128, 0x130B, 0x612A, 0x4BA6, 0x612B, 0x41E4, 0x612C, 0x1310,
+ 0x6130, 0x210F, 0x6134, 0x1311, 0x6136, 0x4BA7, 0x6137, 0x210E,
+ 0x613A, 0x44EA, 0x613C, 0x130F, 0x613D, 0x1312, 0x613E, 0x130A,
+ 0x613F, 0x130E, 0x6141, 0x44EC, 0x6142, 0x1313, 0x6144, 0x1314,
+ 0x6146, 0x44ED, 0x6147, 0x1309, 0x6148, 0x08CA, 0x614A, 0x130D,
+ 0x614B, 0x0B36, 0x614C, 0x07C4, 0x614D, 0x12FB, 0x614E, 0x09FB,
+ 0x6153, 0x1321, 0x6155, 0x0E39, 0x6158, 0x1317, 0x6159, 0x1318,
+ 0x615A, 0x1319, 0x615D, 0x1320, 0x615E, 0x4BA8, 0x615F, 0x131F,
+ 0x6160, 0x44EE, 0x6162, 0x0EAB, 0x6163, 0x05F3, 0x6164, 0x4BA9,
+ 0x6165, 0x131D, 0x6167, 0x071B, 0x6168, 0x0592, 0x616B, 0x131A,
+ 0x616E, 0x0F80, 0x616F, 0x131C, 0x6170, 0x049A, 0x6171, 0x131E,
+ 0x6173, 0x1315, 0x6174, 0x131B, 0x6175, 0x1322, 0x6176, 0x071A,
+ 0x6177, 0x1316, 0x617B, 0x4BAA, 0x617C, 0x38D7, 0x617D, 0x4BAB,
+ 0x617E, 0x0F47, 0x617F, 0x4BAC, 0x6182, 0x0F15, 0x6187, 0x1325,
+ 0x618A, 0x1329, 0x618D, 0x38D8, 0x618E, 0x0B00, 0x6190, 0x0FC1,
+ 0x6191, 0x132A, 0x6192, 0x44F0, 0x6193, 0x44F1, 0x6194, 0x1327,
+ 0x6196, 0x1324, 0x6197, 0x44F2, 0x6198, 0x2110, 0x6199, 0x1323,
+ 0x619A, 0x1328, 0x619D, 0x4BAD, 0x619F, 0x38D9, 0x61A4, 0x0E00,
+ 0x61A5, 0x44F3, 0x61A7, 0x0C8C, 0x61A8, 0x38DA, 0x61A9, 0x071C,
+ 0x61AB, 0x132B, 0x61AC, 0x1326, 0x61AD, 0x44F4, 0x61AE, 0x132C,
+ 0x61B2, 0x0751, 0x61B6, 0x0531, 0x61B8, 0x4BAE, 0x61B9, 0x41E6,
+ 0x61BA, 0x1334, 0x61BC, 0x41E5, 0x61BE, 0x05F4, 0x61C2, 0x38DB,
+ 0x61C3, 0x1332, 0x61C6, 0x1333, 0x61C7, 0x0819, 0x61C8, 0x1331,
+ 0x61C9, 0x132F, 0x61CA, 0x132E, 0x61CB, 0x1335, 0x61CC, 0x132D,
+ 0x61CD, 0x1337, 0x61D0, 0x057B, 0x61D5, 0x44F6, 0x61DC, 0x4BAF,
+ 0x61DD, 0x44F7, 0x61DF, 0x38DC, 0x61E2, 0x4BB0, 0x61E3, 0x1339,
+ 0x61E5, 0x4BB1, 0x61E6, 0x1338, 0x61E8, 0x4BB2, 0x61F2, 0x0BC4,
+ 0x61F4, 0x133C, 0x61F5, 0x44F8, 0x61F6, 0x133A, 0x61F7, 0x1330,
+ 0x61F8, 0x0752, 0x61FA, 0x133B, 0x61FC, 0x133F, 0x61FD, 0x133E,
+ 0x61FE, 0x1340, 0x61FF, 0x133D, 0x6200, 0x1341, 0x6204, 0x4BB3,
+ 0x6207, 0x4BB4, 0x6208, 0x1342, 0x6209, 0x1343, 0x620A, 0x0E3A,
+ 0x620C, 0x1345, 0x620D, 0x1344, 0x620E, 0x0949, 0x6210, 0x0A52,
+ 0x6211, 0x0566, 0x6212, 0x057C, 0x6213, 0x2111, 0x6214, 0x1346,
+ 0x6215, 0x38DD, 0x6216, 0x0483, 0x621A, 0x0A70, 0x621B, 0x1347,
+ 0x621D, 0x1A64, 0x621E, 0x1348, 0x621F, 0x0737, 0x6221, 0x1349,
+ 0x6222, 0x41E7, 0x6223, 0x44FA, 0x6226, 0x0A93, 0x6229, 0x38DE,
+ 0x622A, 0x134A, 0x622E, 0x134B, 0x622F, 0x0654, 0x6230, 0x134C,
+ 0x6231, 0x4BB5, 0x6232, 0x134D, 0x6233, 0x134E, 0x6234, 0x0B37,
+ 0x6236, 0x35BD, 0x6238, 0x0781, 0x6239, 0x4BB6, 0x623B, 0x0EED,
+ 0x623D, 0x4BB7, 0x623E, 0x344E, 0x623F, 0x0E6A, 0x6240, 0x0974,
+ 0x6241, 0x134F, 0x6243, 0x38DF, 0x6246, 0x38E0, 0x6247, 0x0A94,
+ 0x6248, 0x1B1A, 0x6249, 0x0D76, 0x624B, 0x0916, 0x624C, 0x38E1,
+ 0x624D, 0x083D, 0x624E, 0x1350, 0x6251, 0x38E2, 0x6252, 0x44FB,
+ 0x6253, 0x0B27, 0x6255, 0x0DF7, 0x6256, 0x38E3, 0x6258, 0x0B51,
+ 0x625A, 0x41E8, 0x625B, 0x1353, 0x625E, 0x1351, 0x6260, 0x1354,
+ 0x6261, 0x44FC, 0x6263, 0x1352, 0x6264, 0x44FD, 0x6268, 0x1355,
+ 0x626D, 0x44FF, 0x626E, 0x0E01, 0x626F, 0x41E9, 0x6271, 0x047B,
+ 0x6273, 0x4500, 0x6276, 0x0DD0, 0x6279, 0x0D77, 0x627A, 0x4BB8,
+ 0x627B, 0x44FE, 0x627C, 0x1356, 0x627E, 0x1359, 0x627F, 0x099D,
+ 0x6280, 0x0655, 0x6282, 0x1357, 0x6283, 0x135E, 0x6284, 0x099E,
+ 0x6285, 0x35C5, 0x6289, 0x1358, 0x628A, 0x0CFA, 0x6290, 0x4BB9,
+ 0x6291, 0x0F48, 0x6292, 0x135A, 0x6293, 0x135B, 0x6294, 0x135F,
+ 0x6295, 0x0C64, 0x6296, 0x135C, 0x6297, 0x07C5, 0x6298, 0x0A82,
+ 0x6299, 0x4501, 0x629B, 0x136D, 0x629C, 0x0D48, 0x629E, 0x0B52,
+ 0x62A6, 0x2112, 0x62A8, 0x4BBA, 0x62AB, 0x0D78, 0x62AC, 0x13B2,
+ 0x62B1, 0x0E4A, 0x62B5, 0x0C0D, 0x62B9, 0x0EA3, 0x62BB, 0x1362,
+ 0x62BC, 0x0521, 0x62BD, 0x0BA8, 0x62C2, 0x136B, 0x62C4, 0x38E4,
+ 0x62C5, 0x0B72, 0x62C6, 0x1365, 0x62C7, 0x136C, 0x62C8, 0x1367,
+ 0x62C9, 0x136E, 0x62CA, 0x136A, 0x62CC, 0x1369, 0x62CD, 0x0D25,
+ 0x62CF, 0x1363, 0x62D0, 0x057D, 0x62D1, 0x1361, 0x62D2, 0x068B,
+ 0x62D3, 0x0B53, 0x62D4, 0x135D, 0x62D5, 0x4502, 0x62D6, 0x41EA,
+ 0x62D7, 0x1360, 0x62D8, 0x07C6, 0x62D9, 0x0A7F, 0x62DA, 0x4BBB,
+ 0x62DB, 0x099F, 0x62DC, 0x1368, 0x62DD, 0x0D08, 0x62E0, 0x068C,
+ 0x62E1, 0x05A6, 0x62EC, 0x05C5, 0x62ED, 0x09E7, 0x62EE, 0x1370,
+ 0x62EF, 0x1375, 0x62F1, 0x1371, 0x62F3, 0x0753, 0x62F4, 0x4BBC,
+ 0x62F5, 0x1376, 0x62F6, 0x0870, 0x62F7, 0x07FB, 0x62FC, 0x38E5,
+ 0x62FD, 0x4504, 0x62FE, 0x0930, 0x62FF, 0x1364, 0x6301, 0x08CB,
+ 0x6302, 0x1373, 0x6303, 0x4505, 0x6307, 0x08A6, 0x6308, 0x1374,
+ 0x6309, 0x0488, 0x630A, 0x38E6, 0x630C, 0x136F, 0x630D, 0x38E7,
+ 0x6310, 0x4506, 0x6311, 0x0BC5, 0x6316, 0x4BBD, 0x6318, 0x38E8,
+ 0x6319, 0x068D, 0x631B, 0x3737, 0x631F, 0x06AC, 0x6327, 0x1372,
+ 0x6328, 0x046B, 0x632A, 0x4BBE, 0x632B, 0x0833, 0x632F, 0x09FC,
+ 0x6332, 0x4509, 0x6335, 0x450A, 0x6336, 0x4BBF, 0x6339, 0x38E9,
+ 0x633A, 0x0C0E, 0x633B, 0x450B, 0x633C, 0x450C, 0x633D, 0x0D68,
+ 0x633E, 0x1378, 0x633F, 0x0AE0, 0x6341, 0x450D, 0x6342, 0x38EA,
+ 0x6343, 0x38EB, 0x6344, 0x450E, 0x6346, 0x4BC0, 0x6349, 0x0B0A,
+ 0x634B, 0x4BC1, 0x634C, 0x0879, 0x634D, 0x1379, 0x634E, 0x450F,
+ 0x634F, 0x137B, 0x6350, 0x1377, 0x6353, 0x4BC2, 0x6355, 0x0E31,
+ 0x6357, 0x0BD9, 0x6359, 0x4511, 0x635C, 0x0ADE, 0x6365, 0x38EC,
+ 0x6367, 0x0E4B, 0x6368, 0x08FA, 0x6369, 0x1387, 0x636B, 0x1386,
+ 0x636C, 0x4514, 0x636E, 0x0A3E, 0x6371, 0x4BC3, 0x6372, 0x0754,
+ 0x6374, 0x38ED, 0x6375, 0x4BC4, 0x6376, 0x1380, 0x6377, 0x09A1,
+ 0x637A, 0x0CC0, 0x637B, 0x0CE7, 0x637C, 0x41EB, 0x637D, 0x38EE,
+ 0x637F, 0x4BC5, 0x6380, 0x137E, 0x6382, 0x4BC6, 0x6383, 0x0ADF,
+ 0x6384, 0x38EF, 0x6387, 0x38F0, 0x6388, 0x0924, 0x6389, 0x1383,
+ 0x638A, 0x4BC7, 0x638C, 0x09A0, 0x638E, 0x137D, 0x638F, 0x1382,
+ 0x6390, 0x38F1, 0x6392, 0x0D09, 0x6394, 0x4517, 0x6396, 0x137C,
+ 0x6398, 0x06F7, 0x6399, 0x4515, 0x639B, 0x05BB, 0x639E, 0x38F2,
+ 0x639F, 0x1384, 0x63A0, 0x0F73, 0x63A1, 0x083E, 0x63A2, 0x0B73,
+ 0x63A3, 0x1381, 0x63A5, 0x0A80, 0x63A7, 0x07C7, 0x63A8, 0x0A2A,
+ 0x63A9, 0x0508, 0x63AA, 0x0ABE, 0x63AB, 0x137F, 0x63AC, 0x065F,
+ 0x63AE, 0x4BC8, 0x63AF, 0x4BC9, 0x63B2, 0x071D, 0x63B4, 0x0BEB,
+ 0x63B5, 0x1385, 0x63BB, 0x0AE1, 0x63BD, 0x4518, 0x63BE, 0x1388,
+ 0x63C0, 0x138A, 0x63C3, 0x0B17, 0x63C4, 0x1390, 0x63C6, 0x138B,
+ 0x63C9, 0x138D, 0x63CF, 0x0DB3, 0x63D0, 0x0C0F, 0x63D1, 0x38F3,
+ 0x63D2, 0x138E, 0x63D4, 0x4519, 0x63D5, 0x451A, 0x63D6, 0x0F16,
+ 0x63DA, 0x0F32, 0x63DB, 0x05F5, 0x63DC, 0x38F4, 0x63E0, 0x451B,
+ 0x63E1, 0x0472, 0x63E3, 0x138C, 0x63E5, 0x41EC, 0x63E9, 0x1389,
+ 0x63EA, 0x4BCA, 0x63EB, 0x451C, 0x63EC, 0x451D, 0x63ED, 0x341C,
+ 0x63EE, 0x0634, 0x63F2, 0x451E, 0x63F4, 0x0509, 0x63F5, 0x2113,
+ 0x63F6, 0x138F, 0x63F7, 0x3644, 0x63F8, 0x4BCB, 0x63F9, 0x4BCC,
+ 0x63FA, 0x0F33, 0x6406, 0x1393, 0x6409, 0x38F5, 0x640D, 0x0B1B,
+ 0x640F, 0x139A, 0x6410, 0x38F6, 0x6412, 0x4BCD, 0x6413, 0x1394,
+ 0x6414, 0x1E2C, 0x6416, 0x1391, 0x6417, 0x1398, 0x6418, 0x4BCE,
+ 0x641C, 0x137A, 0x641E, 0x451F, 0x6420, 0x4BCF, 0x6422, 0x38F7,
+ 0x6424, 0x4BD0, 0x6425, 0x4520, 0x6426, 0x1395, 0x6428, 0x1399,
+ 0x6429, 0x4521, 0x642A, 0x4BD1, 0x642C, 0x0D56, 0x642D, 0x0C65,
+ 0x642F, 0x4522, 0x6434, 0x1392, 0x6435, 0x4BD2, 0x6436, 0x1396,
+ 0x643A, 0x071E, 0x643D, 0x4BD3, 0x643E, 0x0861, 0x643F, 0x4BD4,
+ 0x6442, 0x0A81, 0x644E, 0x139E, 0x6451, 0x1E43, 0x6452, 0x4BD5,
+ 0x6454, 0x38F8, 0x6458, 0x0C20, 0x645A, 0x4523, 0x645B, 0x38F9,
+ 0x645D, 0x4524, 0x645F, 0x4BD6, 0x6460, 0x2114, 0x6467, 0x139B,
+ 0x6469, 0x0E8E, 0x646D, 0x38FA, 0x646F, 0x139C, 0x6473, 0x4525,
+ 0x6474, 0x4BD7, 0x6476, 0x139D, 0x6478, 0x0EDA, 0x6479, 0x41ED,
+ 0x647A, 0x0A46, 0x647B, 0x38FB, 0x647D, 0x4526, 0x6483, 0x0738,
+ 0x6487, 0x4527, 0x6488, 0x13A4, 0x6490, 0x4BD8, 0x6491, 0x4528,
+ 0x6492, 0x0883, 0x6493, 0x13A1, 0x6495, 0x13A0, 0x6498, 0x4BD9,
+ 0x6499, 0x4BDA, 0x649A, 0x0CE8, 0x649D, 0x2115, 0x649E, 0x0C8D,
+ 0x649F, 0x4529, 0x64A4, 0x0C2B, 0x64A5, 0x13A2, 0x64A9, 0x13A3,
+ 0x64AB, 0x0DE1, 0x64AC, 0x4BDB, 0x64AD, 0x0CFB, 0x64AE, 0x0871,
+ 0x64B0, 0x0A95, 0x64B2, 0x0E7E, 0x64B3, 0x4BDC, 0x64B9, 0x05A7,
+ 0x64BB, 0x13AA, 0x64BC, 0x13A5, 0x64BE, 0x38FC, 0x64BF, 0x38FD,
+ 0x64C1, 0x0F34, 0x64C2, 0x13AC, 0x64C4, 0x41EE, 0x64C5, 0x13A8,
+ 0x64C7, 0x13A9, 0x64CA, 0x341D, 0x64CB, 0x452A, 0x64CC, 0x452B,
+ 0x64CD, 0x0AE2, 0x64CE, 0x2116, 0x64D0, 0x41EF, 0x64D2, 0x13A7,
+ 0x64D4, 0x1366, 0x64D5, 0x452C, 0x64D7, 0x452D, 0x64D8, 0x13AB,
+ 0x64DA, 0x13A6, 0x64E0, 0x13B0, 0x64E1, 0x13B1, 0x64E2, 0x0C21,
+ 0x64E3, 0x13B3, 0x64E4, 0x452F, 0x64E5, 0x38FE, 0x64E6, 0x0872,
+ 0x64E7, 0x13AE, 0x64EC, 0x0656, 0x64ED, 0x4BDD, 0x64EF, 0x13B4,
+ 0x64F0, 0x4BDE, 0x64F1, 0x13AD, 0x64F2, 0x13B8, 0x64F4, 0x13B7,
+ 0x64F6, 0x13B6, 0x64F7, 0x38FF, 0x64FA, 0x13B9, 0x64FB, 0x3900,
+ 0x64FD, 0x13BB, 0x64FE, 0x09D9, 0x64FF, 0x4530, 0x6500, 0x13BA,
+ 0x6504, 0x3901, 0x6505, 0x13BE, 0x650F, 0x4532, 0x6514, 0x4533,
+ 0x6516, 0x3902, 0x6518, 0x13BC, 0x6519, 0x3903, 0x651B, 0x4BDF,
+ 0x651C, 0x13BD, 0x651D, 0x1397, 0x651E, 0x4535, 0x651F, 0x4BE0,
+ 0x6522, 0x1E97, 0x6523, 0x13C0, 0x6524, 0x13BF, 0x6529, 0x41F0,
+ 0x652A, 0x139F, 0x652B, 0x13C1, 0x652C, 0x13B5, 0x652E, 0x4BE1,
+ 0x652F, 0x08A7, 0x6532, 0x4536, 0x6534, 0x13C2, 0x6535, 0x13C3,
+ 0x6536, 0x13C5, 0x6537, 0x13C4, 0x6538, 0x13C6, 0x6539, 0x057E,
+ 0x653B, 0x07C8, 0x653E, 0x0E4C, 0x653F, 0x0A53, 0x6544, 0x4537,
+ 0x6545, 0x0782, 0x6547, 0x3904, 0x6548, 0x13C8, 0x6549, 0x4BE2,
+ 0x654D, 0x13CB, 0x654E, 0x2117, 0x654F, 0x0DC4, 0x6551, 0x0679,
+ 0x6554, 0x4538, 0x6555, 0x13CA, 0x6556, 0x13C9, 0x6557, 0x0D0A,
+ 0x6558, 0x13CC, 0x6559, 0x06AD, 0x655D, 0x13CE, 0x655E, 0x13CD,
+ 0x6560, 0x4BE3, 0x6562, 0x05F6, 0x6563, 0x0884, 0x6566, 0x0CB0,
+ 0x6567, 0x3905, 0x656B, 0x4539, 0x656C, 0x071F, 0x6570, 0x0A3A,
+ 0x6572, 0x13CF, 0x6574, 0x0A54, 0x6575, 0x0C22, 0x6577, 0x0DD1,
+ 0x6578, 0x13D0, 0x657A, 0x453A, 0x6581, 0x3906, 0x6582, 0x13D1,
+ 0x6583, 0x13D2, 0x6584, 0x453B, 0x6585, 0x3907, 0x6587, 0x0E08,
+ 0x6588, 0x120C, 0x6589, 0x0A6A, 0x658A, 0x453C, 0x658C, 0x0DBE,
+ 0x658E, 0x0848, 0x6590, 0x0D79, 0x6591, 0x0D57, 0x6592, 0x4BE4,
+ 0x6595, 0x4BE5, 0x6597, 0x0C47, 0x6599, 0x0F89, 0x659B, 0x13D4,
+ 0x659C, 0x08FC, 0x659D, 0x41F1, 0x659F, 0x13D5, 0x65A1, 0x047A,
+ 0x65A4, 0x06CC, 0x65A5, 0x0A71, 0x65A7, 0x0DD2, 0x65AB, 0x13D6,
+ 0x65AC, 0x0890, 0x65AD, 0x0B85, 0x65AF, 0x08A9, 0x65B0, 0x09FD,
+ 0x65B2, 0x453D, 0x65B4, 0x4BE6, 0x65B5, 0x453E, 0x65B7, 0x13D7,
+ 0x65B8, 0x453F, 0x65B9, 0x0E4D, 0x65BC, 0x0519, 0x65BD, 0x08AA,
+ 0x65BE, 0x4BE7, 0x65BF, 0x4540, 0x65C1, 0x13DA, 0x65C2, 0x3908,
+ 0x65C3, 0x13D8, 0x65C4, 0x13DB, 0x65C5, 0x0F81, 0x65C6, 0x13D9,
+ 0x65C8, 0x4BE8, 0x65C9, 0x4541, 0x65CB, 0x0A9F, 0x65CC, 0x13DC,
+ 0x65CE, 0x4BE9, 0x65CF, 0x0B12, 0x65D0, 0x4BEA, 0x65D2, 0x13DD,
+ 0x65D4, 0x4542, 0x65D7, 0x0636, 0x65D9, 0x13DF, 0x65DB, 0x13DE,
+ 0x65DF, 0x4BEB, 0x65E0, 0x13E0, 0x65E1, 0x13E1, 0x65E2, 0x0637,
+ 0x65E3, 0x3585, 0x65E5, 0x0CD4, 0x65E6, 0x0B74, 0x65E7, 0x0686,
+ 0x65E8, 0x08AB, 0x65E9, 0x0AE3, 0x65EC, 0x0966, 0x65ED, 0x0474,
+ 0x65F0, 0x3909, 0x65F1, 0x13E2, 0x65F2, 0x390A, 0x65F9, 0x4544,
+ 0x65FA, 0x0522, 0x65FB, 0x13E6, 0x65FC, 0x4545, 0x6600, 0x2118,
+ 0x6602, 0x07C9, 0x6603, 0x13E5, 0x6604, 0x4546, 0x6606, 0x081B,
+ 0x6607, 0x09A2, 0x6608, 0x4547, 0x6609, 0x211A, 0x660A, 0x13E4,
+ 0x660C, 0x09A3, 0x660E, 0x0ECC, 0x660F, 0x081A, 0x6613, 0x049B,
+ 0x6614, 0x0A72, 0x6615, 0x2119, 0x661C, 0x13EB, 0x661E, 0x4F50,
+ 0x661F, 0x0A55, 0x6620, 0x04E9, 0x6621, 0x4548, 0x6622, 0x41F3,
+ 0x6624, 0x211D, 0x6625, 0x095F, 0x6627, 0x0E94, 0x6628, 0x0862,
+ 0x662A, 0x4549, 0x662B, 0x41F4, 0x662C, 0x390B, 0x662D, 0x09A4,
+ 0x662E, 0x211B, 0x662F, 0x0A4B, 0x6630, 0x41F5, 0x6631, 0x20AE,
+ 0x6633, 0x41F6, 0x6634, 0x13EA, 0x6635, 0x13E8, 0x6636, 0x13E9,
+ 0x663A, 0x41F2, 0x663B, 0x1E00, 0x663C, 0x0BA9, 0x663F, 0x1409,
+ 0x6641, 0x13EF, 0x6642, 0x08CC, 0x6643, 0x07CA, 0x6644, 0x13ED,
+ 0x6645, 0x454A, 0x6648, 0x41F7, 0x6649, 0x13EE, 0x664B, 0x09FE,
+ 0x664C, 0x390C, 0x664E, 0x454C, 0x664F, 0x13EC, 0x6651, 0x454B,
+ 0x6652, 0x087D, 0x6657, 0x211F, 0x6659, 0x2120, 0x665A, 0x3441,
+ 0x665B, 0x390D, 0x665C, 0x390E, 0x665D, 0x13F1, 0x665E, 0x13F0,
+ 0x665F, 0x13F5, 0x6661, 0x390F, 0x6662, 0x13F6, 0x6663, 0x373A,
+ 0x6664, 0x13F2, 0x6665, 0x211E, 0x6666, 0x0580, 0x6667, 0x13F3,
+ 0x6668, 0x13F4, 0x6669, 0x0D69, 0x666A, 0x4551, 0x666B, 0x3910,
+ 0x666C, 0x4552, 0x666D, 0x4553, 0x666E, 0x0DD3, 0x666F, 0x0720,
+ 0x6670, 0x13F7, 0x6673, 0x2122, 0x6674, 0x0A56, 0x6676, 0x09A5,
+ 0x6677, 0x41F9, 0x6678, 0x41FA, 0x667A, 0x0B90, 0x667B, 0x4554,
+ 0x667E, 0x4BEC, 0x6680, 0x4555, 0x6681, 0x06BF, 0x6683, 0x13F8,
+ 0x6684, 0x13FC, 0x6687, 0x054B, 0x6688, 0x13F9, 0x6689, 0x13FB,
+ 0x668B, 0x4BED, 0x668C, 0x4BEE, 0x668D, 0x41FB, 0x668E, 0x13FA,
+ 0x6690, 0x4556, 0x6691, 0x0975, 0x6692, 0x4557, 0x6696, 0x0B86,
+ 0x6697, 0x0489, 0x6698, 0x13FD, 0x6699, 0x2123, 0x669D, 0x13FE,
+ 0x66A0, 0x2124, 0x66A2, 0x0BC6, 0x66A4, 0x3912, 0x66A6, 0x0FB9,
+ 0x66AB, 0x0891, 0x66AD, 0x4559, 0x66AE, 0x0E3B, 0x66B1, 0x455A,
+ 0x66B2, 0x2125, 0x66B3, 0x4BEF, 0x66B4, 0x0E6B, 0x66B5, 0x455B,
+ 0x66B8, 0x1405, 0x66B9, 0x1400, 0x66BB, 0x41FC, 0x66BC, 0x1403,
+ 0x66BE, 0x1402, 0x66BF, 0x2126, 0x66C0, 0x4BF0, 0x66C1, 0x13FF,
+ 0x66C4, 0x1404, 0x66C6, 0x3455, 0x66C7, 0x0CB6, 0x66C8, 0x3913,
+ 0x66C9, 0x1401, 0x66CF, 0x4BF1, 0x66D6, 0x1406, 0x66D9, 0x0976,
+ 0x66DA, 0x1407, 0x66DB, 0x41FD, 0x66DC, 0x0F35, 0x66DD, 0x0D2E,
+ 0x66E0, 0x1408, 0x66E6, 0x140A, 0x66E8, 0x41FE, 0x66E9, 0x140B,
+ 0x66EC, 0x3914, 0x66F0, 0x140C, 0x66F2, 0x06C2, 0x66F3, 0x04EA,
+ 0x66F4, 0x07CB, 0x66F5, 0x140D, 0x66F7, 0x140E, 0x66F8, 0x097B,
+ 0x66F9, 0x0AE4, 0x66FA, 0x2127, 0x66FB, 0x20B1, 0x66FC, 0x10ED,
+ 0x66FD, 0x0AC0, 0x66FE, 0x0ABF, 0x66FF, 0x0B38, 0x6700, 0x0837,
+ 0x6701, 0x455F, 0x6703, 0x104B, 0x6705, 0x3915, 0x6708, 0x0744,
+ 0x6709, 0x0F17, 0x670B, 0x0E4E, 0x670D, 0x0DF0, 0x670E, 0x2128,
+ 0x670F, 0x140F, 0x6712, 0x4560, 0x6713, 0x3916, 0x6714, 0x0863,
+ 0x6715, 0x0BDB, 0x6716, 0x1410, 0x6717, 0x0FD5, 0x6719, 0x4562,
+ 0x671B, 0x0E6C, 0x671D, 0x0BC7, 0x671E, 0x1411, 0x671F, 0x0638,
+ 0x6725, 0x4BF2, 0x6726, 0x1412, 0x6727, 0x1413, 0x6728, 0x0EE6,
+ 0x672A, 0x0EB0, 0x672B, 0x0EA4, 0x672C, 0x0E8A, 0x672D, 0x0873,
+ 0x672E, 0x1415, 0x6731, 0x0917, 0x6733, 0x3917, 0x6734, 0x0E7F,
+ 0x6735, 0x4BF3, 0x6736, 0x1417, 0x6737, 0x141A, 0x6738, 0x1419,
+ 0x673A, 0x0635, 0x673D, 0x067A, 0x673F, 0x1416, 0x6741, 0x1418,
+ 0x6743, 0x35B7, 0x6746, 0x141B, 0x6747, 0x41FF, 0x6748, 0x3918,
+ 0x6749, 0x0A3F, 0x674C, 0x3919, 0x674D, 0x4565, 0x674E, 0x0F65,
+ 0x674F, 0x048D, 0x6750, 0x0850, 0x6751, 0x0B1C, 0x6753, 0x0909,
+ 0x6754, 0x4566, 0x6755, 0x4BF4, 0x6756, 0x09DB, 0x6759, 0x141E,
+ 0x675C, 0x0C48, 0x675D, 0x4567, 0x675E, 0x141C, 0x675F, 0x0B0B,
+ 0x6760, 0x141D, 0x6761, 0x09DA, 0x6762, 0x0EE9, 0x6763, 0x141F,
+ 0x6764, 0x1420, 0x6765, 0x0F52, 0x6766, 0x212A, 0x676A, 0x1425,
+ 0x676D, 0x07CC, 0x676E, 0x3571, 0x676F, 0x0D0B, 0x6770, 0x1422,
+ 0x6771, 0x0C66, 0x6772, 0x13E3, 0x6773, 0x13E7, 0x6774, 0x456B,
+ 0x6775, 0x0669, 0x6776, 0x391A, 0x6777, 0x0CFD, 0x677B, 0x391B,
+ 0x677C, 0x1424, 0x677E, 0x09A6, 0x677F, 0x0D58, 0x6780, 0x4BF5,
+ 0x6781, 0x4200, 0x6785, 0x142A, 0x6787, 0x0D8E, 0x6789, 0x1421,
+ 0x678B, 0x1427, 0x678C, 0x1426, 0x678F, 0x4BF6, 0x6790, 0x0A73,
+ 0x6791, 0x4BF7, 0x6792, 0x456D, 0x6793, 0x4201, 0x6795, 0x0E9B,
+ 0x6797, 0x0F9B, 0x6798, 0x4202, 0x679A, 0x0E95, 0x679B, 0x4203,
+ 0x679C, 0x054C, 0x679D, 0x08AC, 0x67A0, 0x0FEE, 0x67A1, 0x1429,
+ 0x67A2, 0x0A3B, 0x67A4, 0x4BF8, 0x67A6, 0x1428, 0x67A9, 0x1423,
+ 0x67AF, 0x0783, 0x67B0, 0x391C, 0x67B1, 0x4BF9, 0x67B2, 0x391D,
+ 0x67B3, 0x142F, 0x67B4, 0x142D, 0x67B5, 0x4BFA, 0x67B6, 0x054D,
+ 0x67B7, 0x142B, 0x67B8, 0x1431, 0x67B9, 0x1437, 0x67BB, 0x212B,
+ 0x67BE, 0x4BFB, 0x67C0, 0x212D, 0x67C1, 0x0B28, 0x67C3, 0x4571,
+ 0x67C4, 0x0E11, 0x67C6, 0x1439, 0x67C8, 0x4572, 0x67CA, 0x0D94,
+ 0x67CE, 0x1438, 0x67CF, 0x0D26, 0x67D0, 0x0E6D, 0x67D1, 0x05F7,
+ 0x67D2, 0x4573, 0x67D3, 0x0A9B, 0x67D4, 0x094A, 0x67D7, 0x391F,
+ 0x67D8, 0x0BEF, 0x67D9, 0x3920, 0x67DA, 0x0F18, 0x67DB, 0x4574,
+ 0x67DD, 0x1434, 0x67DE, 0x1433, 0x67E2, 0x1435, 0x67E4, 0x1432,
+ 0x67E7, 0x143A, 0x67E9, 0x1430, 0x67EC, 0x142E, 0x67EE, 0x1436,
+ 0x67EF, 0x142C, 0x67F0, 0x3921, 0x67F1, 0x0BAA, 0x67F3, 0x0F04,
+ 0x67F4, 0x08F2, 0x67F5, 0x0864, 0x67F7, 0x4575, 0x67F9, 0x391E,
+ 0x67FA, 0x1E9A, 0x67FB, 0x082A, 0x67FC, 0x4204, 0x67FE, 0x0E9D,
+ 0x67FF, 0x059F, 0x6801, 0x36F2, 0x6802, 0x0BEA, 0x6803, 0x0CA2,
+ 0x6804, 0x04EB, 0x6805, 0x1E07, 0x6810, 0x4570, 0x6813, 0x0A96,
+ 0x6816, 0x0A58, 0x6817, 0x0700, 0x6818, 0x4579, 0x681D, 0x4205,
+ 0x681E, 0x143C, 0x681F, 0x457A, 0x6821, 0x07CD, 0x6822, 0x05DA,
+ 0x6828, 0x4BFC, 0x6829, 0x143E, 0x682A, 0x05D2, 0x682B, 0x1444,
+ 0x682C, 0x3922, 0x682D, 0x457B, 0x6830, 0x3923, 0x6831, 0x3924,
+ 0x6832, 0x1441, 0x6833, 0x457D, 0x6834, 0x0A97, 0x6838, 0x05A9,
+ 0x6839, 0x081C, 0x683B, 0x457E, 0x683C, 0x05A8, 0x683D, 0x083F,
+ 0x683E, 0x457F, 0x6840, 0x143F, 0x6841, 0x073B, 0x6842, 0x0721,
+ 0x6843, 0x0C67, 0x6844, 0x212F, 0x6845, 0x4580, 0x6846, 0x143D,
+ 0x6848, 0x048A, 0x6849, 0x4581, 0x684C, 0x4582, 0x684D, 0x1440,
+ 0x684E, 0x1442, 0x6850, 0x06C5, 0x6851, 0x0702, 0x6852, 0x212C,
+ 0x6853, 0x05F8, 0x6854, 0x0665, 0x6855, 0x4583, 0x6857, 0x4584,
+ 0x6859, 0x1445, 0x685B, 0x3925, 0x685C, 0x0869, 0x685D, 0x0E9F,
+ 0x685F, 0x0885, 0x6863, 0x1446, 0x6867, 0x0DA2, 0x686B, 0x4586,
+ 0x686E, 0x4587, 0x6872, 0x3926, 0x6874, 0x1452, 0x6875, 0x3927,
+ 0x6876, 0x0533, 0x6877, 0x1447, 0x687A, 0x3928, 0x687C, 0x4588,
+ 0x687E, 0x1458, 0x687F, 0x1448, 0x6881, 0x0F8A, 0x6882, 0x4589,
+ 0x6883, 0x144F, 0x6884, 0x3929, 0x6885, 0x0D15, 0x6886, 0x4BFD,
+ 0x688D, 0x1457, 0x688E, 0x1E9C, 0x688F, 0x144A, 0x6890, 0x458A,
+ 0x6893, 0x0478, 0x6894, 0x144C, 0x6896, 0x458B, 0x6897, 0x07CE,
+ 0x6898, 0x458D, 0x6899, 0x458E, 0x689A, 0x458F, 0x689B, 0x144E,
+ 0x689C, 0x4590, 0x689D, 0x144D, 0x689F, 0x1449, 0x68A0, 0x1454,
+ 0x68A2, 0x09A7, 0x68A3, 0x4206, 0x68A5, 0x392A, 0x68A6, 0x11BE,
+ 0x68A7, 0x079C, 0x68A8, 0x0F66, 0x68AA, 0x4591, 0x68AB, 0x4592,
+ 0x68AD, 0x144B, 0x68AF, 0x0C10, 0x68B0, 0x0581, 0x68B1, 0x081D,
+ 0x68B2, 0x392B, 0x68B3, 0x1443, 0x68B4, 0x4593, 0x68B5, 0x1453,
+ 0x68B6, 0x05BF, 0x68B9, 0x1451, 0x68BA, 0x1455, 0x68BB, 0x4594,
+ 0x68BC, 0x0C68, 0x68C3, 0x4598, 0x68C4, 0x063A, 0x68C5, 0x4599,
+ 0x68C6, 0x1473, 0x68C8, 0x20AF, 0x68C9, 0x0ED5, 0x68CA, 0x145A,
+ 0x68CB, 0x0639, 0x68CC, 0x459A, 0x68CD, 0x1461, 0x68CF, 0x2130,
+ 0x68D0, 0x392C, 0x68D2, 0x0E6E, 0x68D4, 0x1462, 0x68D5, 0x1464,
+ 0x68D6, 0x392D, 0x68D7, 0x1468, 0x68D8, 0x145C, 0x68D9, 0x459B,
+ 0x68DA, 0x0B68, 0x68DF, 0x0C69, 0x68E0, 0x146C, 0x68E1, 0x145F,
+ 0x68E3, 0x1469, 0x68E4, 0x459C, 0x68E5, 0x459D, 0x68E7, 0x1463,
+ 0x68E8, 0x392E, 0x68EB, 0x4BFE, 0x68EC, 0x459E, 0x68ED, 0x392F,
+ 0x68EE, 0x09FF, 0x68EF, 0x146D, 0x68F0, 0x3930, 0x68F1, 0x3931,
+ 0x68F2, 0x0A57, 0x68F5, 0x4BFF, 0x68F7, 0x459F, 0x68F9, 0x146B,
+ 0x68FA, 0x05F9, 0x68FB, 0x4595, 0x68FC, 0x3932, 0x6900, 0x0FF6,
+ 0x6901, 0x1459, 0x6903, 0x45A0, 0x6904, 0x1467, 0x6905, 0x049C,
+ 0x6907, 0x45A1, 0x6908, 0x145B, 0x690A, 0x4207, 0x690B, 0x0EC6,
+ 0x690C, 0x1460, 0x690D, 0x09E8, 0x690E, 0x0BE3, 0x690F, 0x1456,
+ 0x6911, 0x3933, 0x6912, 0x1466, 0x6913, 0x3934, 0x6917, 0x4C00,
+ 0x6919, 0x0A40, 0x691A, 0x1470, 0x691B, 0x05CF, 0x691C, 0x0755,
+ 0x6921, 0x1472, 0x6922, 0x145D, 0x6923, 0x1471, 0x6925, 0x146A,
+ 0x6926, 0x145E, 0x6928, 0x146E, 0x692A, 0x146F, 0x6930, 0x1480,
+ 0x6933, 0x4C01, 0x6934, 0x0CA6, 0x6935, 0x3935, 0x6936, 0x1465,
+ 0x6938, 0x4C02, 0x6939, 0x147C, 0x693B, 0x3936, 0x693D, 0x147E,
+ 0x693F, 0x0BF4, 0x6942, 0x420A, 0x6946, 0x45A5, 0x6949, 0x4208,
+ 0x694A, 0x0F36, 0x6953, 0x0DE8, 0x6954, 0x1479, 0x6955, 0x0B2A,
+ 0x6957, 0x3937, 0x6959, 0x147F, 0x695A, 0x0AC1, 0x695B, 0x4C03,
+ 0x695C, 0x1476, 0x695D, 0x1483, 0x695E, 0x1482, 0x6960, 0x0CC7,
+ 0x6961, 0x1481, 0x6962, 0x0CC2, 0x6963, 0x3938, 0x6964, 0x420B,
+ 0x6965, 0x4C04, 0x6968, 0x2132, 0x6969, 0x45A6, 0x696A, 0x1485,
+ 0x696B, 0x1478, 0x696C, 0x45A7, 0x696D, 0x06C0, 0x696E, 0x147B,
+ 0x696F, 0x0967, 0x6972, 0x3939, 0x6973, 0x0D16, 0x6974, 0x147D,
+ 0x6975, 0x06C3, 0x6977, 0x1475, 0x6978, 0x1477, 0x6979, 0x1474,
+ 0x697A, 0x45A8, 0x697C, 0x0FD6, 0x697D, 0x05B8, 0x697E, 0x147A,
+ 0x697F, 0x393A, 0x6980, 0x393B, 0x6981, 0x1484, 0x6982, 0x0593,
+ 0x6986, 0x3740, 0x698A, 0x0857, 0x698E, 0x04FF, 0x6991, 0x1495,
+ 0x6992, 0x45A9, 0x6994, 0x0FD7, 0x6995, 0x1498, 0x6996, 0x45AB,
+ 0x6998, 0x2134, 0x699B, 0x0A00, 0x699C, 0x1497, 0x69A0, 0x1496,
+ 0x69A5, 0x420C, 0x69A6, 0x393C, 0x69A7, 0x1493, 0x69A8, 0x4C05,
+ 0x69AB, 0x4C06, 0x69AD, 0x393D, 0x69AE, 0x1487, 0x69AF, 0x4C07,
+ 0x69B0, 0x45AC, 0x69B1, 0x14A4, 0x69B2, 0x1486, 0x69B4, 0x1499,
+ 0x69B7, 0x393E, 0x69BA, 0x45AD, 0x69BB, 0x1491, 0x69BC, 0x45AE,
+ 0x69BE, 0x148C, 0x69BF, 0x1489, 0x69C0, 0x45AF, 0x69C1, 0x148A,
+ 0x69C3, 0x1492, 0x69C7, 0x1D33, 0x69CA, 0x148F, 0x69CB, 0x07CF,
+ 0x69CC, 0x0BE4, 0x69CD, 0x0AE6, 0x69CE, 0x148D, 0x69CF, 0x420D,
+ 0x69D0, 0x1488, 0x69D1, 0x45B0, 0x69D3, 0x148B, 0x69D6, 0x393F,
+ 0x69D7, 0x3940, 0x69D8, 0x0F37, 0x69D9, 0x0E98, 0x69DD, 0x1490,
+ 0x69DE, 0x149A, 0x69E2, 0x2135, 0x69E3, 0x45B4, 0x69E5, 0x4C08,
+ 0x69E7, 0x14A2, 0x69E8, 0x149B, 0x69E9, 0x4210, 0x69EA, 0x3411,
+ 0x69EB, 0x14A8, 0x69ED, 0x14A6, 0x69EE, 0x45B5, 0x69EF, 0x45B6,
+ 0x69F1, 0x4C09, 0x69F2, 0x14A1, 0x69F3, 0x45B7, 0x69F4, 0x45B9,
+ 0x69F5, 0x4211, 0x69F6, 0x373F, 0x69F9, 0x14A0, 0x69FB, 0x0BEC,
+ 0x69FD, 0x0AE7, 0x69FE, 0x45BA, 0x69FF, 0x149E, 0x6A01, 0x3941,
+ 0x6A02, 0x149C, 0x6A05, 0x14A3, 0x6A0A, 0x14A9, 0x6A0B, 0x0D89,
+ 0x6A0C, 0x14AF, 0x6A0F, 0x3942, 0x6A11, 0x45BB, 0x6A12, 0x14AA,
+ 0x6A13, 0x14AD, 0x6A14, 0x14A7, 0x6A15, 0x3943, 0x6A17, 0x0BB2,
+ 0x6A19, 0x0DAA, 0x6A1A, 0x45BC, 0x6A1B, 0x149D, 0x6A1D, 0x45BD,
+ 0x6A1E, 0x14A5, 0x6A1F, 0x09A8, 0x6A21, 0x0EDB, 0x6A22, 0x14B9,
+ 0x6A23, 0x14AC, 0x6A28, 0x3944, 0x6A29, 0x0756, 0x6A2A, 0x0523,
+ 0x6A2B, 0x05BD, 0x6A2E, 0x1494, 0x6A30, 0x2136, 0x6A32, 0x45BF,
+ 0x6A33, 0x45C0, 0x6A34, 0x3945, 0x6A35, 0x09A9, 0x6A36, 0x14B1,
+ 0x6A38, 0x14B8, 0x6A39, 0x0925, 0x6A3A, 0x05D0, 0x6A3B, 0x4213,
+ 0x6A3D, 0x0B6C, 0x6A3E, 0x3946, 0x6A3F, 0x45C1, 0x6A44, 0x14AE,
+ 0x6A45, 0x3947, 0x6A46, 0x2138, 0x6A47, 0x14B3, 0x6A48, 0x14B7,
+ 0x6A49, 0x45C2, 0x6A4A, 0x4C0A, 0x6A4B, 0x06AE, 0x6A4E, 0x45C4,
+ 0x6A50, 0x3948, 0x6A51, 0x3949, 0x6A52, 0x45C5, 0x6A54, 0x3C34,
+ 0x6A55, 0x4C0B, 0x6A56, 0x394A, 0x6A58, 0x0666, 0x6A59, 0x14B5,
+ 0x6A5B, 0x394B, 0x6A5F, 0x063B, 0x6A61, 0x0CA3, 0x6A62, 0x14B4,
+ 0x6A64, 0x45C6, 0x6A66, 0x14B6, 0x6A67, 0x4C0C, 0x6A6B, 0x2137,
+ 0x6A71, 0x4C0D, 0x6A72, 0x14B0, 0x6A73, 0x2139, 0x6A78, 0x14B2,
+ 0x6A7A, 0x45C3, 0x6A7E, 0x213A, 0x6A7F, 0x05BE, 0x6A80, 0x0B87,
+ 0x6A83, 0x394C, 0x6A84, 0x14BD, 0x6A89, 0x394D, 0x6A8B, 0x45C8,
+ 0x6A8D, 0x14BB, 0x6A8E, 0x079D, 0x6A90, 0x14BA, 0x6A91, 0x394E,
+ 0x6A94, 0x4215, 0x6A97, 0x14C0, 0x6A9C, 0x143B, 0x6A9D, 0x394F,
+ 0x6A9E, 0x3950, 0x6A9F, 0x3951, 0x6AA0, 0x14BC, 0x6AA1, 0x45CA,
+ 0x6AA2, 0x14BE, 0x6AA3, 0x14BF, 0x6AA5, 0x4216, 0x6AAA, 0x14CB,
+ 0x6AAB, 0x45CC, 0x6AAC, 0x14C7, 0x6AAE, 0x1450, 0x6AAF, 0x4C0E,
+ 0x6AB3, 0x14C6, 0x6AB8, 0x14C5, 0x6ABB, 0x14C2, 0x6ABD, 0x45CD,
+ 0x6AC1, 0x14AB, 0x6AC2, 0x14C4, 0x6AC3, 0x14C3, 0x6AC6, 0x45CE,
+ 0x6AC8, 0x4C0F, 0x6AC9, 0x4C10, 0x6AD0, 0x45D0, 0x6AD1, 0x14C9,
+ 0x6AD3, 0x0FCC, 0x6AD4, 0x45CF, 0x6ADA, 0x14CC, 0x6ADB, 0x06F3,
+ 0x6ADC, 0x3952, 0x6ADD, 0x45D1, 0x6ADE, 0x14C8, 0x6ADF, 0x14CA,
+ 0x6AE2, 0x213B, 0x6AE4, 0x213C, 0x6AE7, 0x3953, 0x6AE8, 0x0D3B,
+ 0x6AEA, 0x14CD, 0x6AEC, 0x3954, 0x6AF1, 0x45D4, 0x6AF2, 0x45D5,
+ 0x6AF3, 0x45D6, 0x6AF8, 0x4EB8, 0x6AFA, 0x14D1, 0x6AFB, 0x14CE,
+ 0x6AFD, 0x45D7, 0x6B03, 0x4C11, 0x6B04, 0x0F5D, 0x6B05, 0x14CF,
+ 0x6B0A, 0x149F, 0x6B0B, 0x45D9, 0x6B0F, 0x45DA, 0x6B10, 0x45DB,
+ 0x6B11, 0x45DC, 0x6B12, 0x14D2, 0x6B16, 0x14D3, 0x6B17, 0x45DE,
+ 0x6B1B, 0x4218, 0x6B1D, 0x04D7, 0x6B1E, 0x3955, 0x6B1F, 0x14D5,
+ 0x6B20, 0x073D, 0x6B21, 0x08CD, 0x6B23, 0x06CD, 0x6B24, 0x3956,
+ 0x6B27, 0x0524, 0x6B2C, 0x4219, 0x6B2F, 0x45E0, 0x6B32, 0x0F49,
+ 0x6B35, 0x3957, 0x6B37, 0x14D7, 0x6B38, 0x14D6, 0x6B39, 0x14D9,
+ 0x6B3A, 0x0657, 0x6B3B, 0x4C12, 0x6B3D, 0x06CE, 0x6B3E, 0x05FA,
+ 0x6B3F, 0x4C13, 0x6B43, 0x14DC, 0x6B46, 0x3958, 0x6B47, 0x14DB,
+ 0x6B49, 0x14DD, 0x6B4A, 0x45E1, 0x6B4C, 0x054E, 0x6B4E, 0x0B75,
+ 0x6B50, 0x14DE, 0x6B53, 0x05FB, 0x6B54, 0x14E0, 0x6B56, 0x3959,
+ 0x6B58, 0x45E2, 0x6B59, 0x14DF, 0x6B5B, 0x14E1, 0x6B5F, 0x14E2,
+ 0x6B60, 0x395A, 0x6B61, 0x14E3, 0x6B62, 0x08AD, 0x6B63, 0x0A59,
+ 0x6B64, 0x0811, 0x6B65, 0x344A, 0x6B66, 0x0DE2, 0x6B67, 0x421A,
+ 0x6B69, 0x0E32, 0x6B6A, 0x0FEA, 0x6B6C, 0x45E3, 0x6B6F, 0x08C3,
+ 0x6B72, 0x35D9, 0x6B73, 0x0840, 0x6B74, 0x0FBA, 0x6B75, 0x45E4,
+ 0x6B77, 0x3456, 0x6B78, 0x14E4, 0x6B79, 0x14E5, 0x6B7A, 0x45E5,
+ 0x6B7B, 0x08AE, 0x6B7D, 0x4C14, 0x6B7E, 0x4C15, 0x6B7F, 0x14E6,
+ 0x6B80, 0x14E7, 0x6B81, 0x45E6, 0x6B82, 0x395B, 0x6B83, 0x14E9,
+ 0x6B84, 0x14E8, 0x6B86, 0x0E86, 0x6B89, 0x0968, 0x6B8A, 0x0918,
+ 0x6B8B, 0x0892, 0x6B8D, 0x14EA, 0x6B95, 0x14EC, 0x6B96, 0x09E9,
+ 0x6B98, 0x14EB, 0x6B9B, 0x45E7, 0x6B9E, 0x14ED, 0x6BA4, 0x14EE,
+ 0x6BA9, 0x421B, 0x6BAA, 0x14EF, 0x6BAB, 0x14F0, 0x6BAD, 0x421C,
+ 0x6BAE, 0x45E8, 0x6BAF, 0x14F1, 0x6BB0, 0x4C16, 0x6BB1, 0x14F3,
+ 0x6BB2, 0x14F2, 0x6BB3, 0x14F4, 0x6BB4, 0x0525, 0x6BB5, 0x0B88,
+ 0x6BB7, 0x14F5, 0x6BBA, 0x0874, 0x6BBB, 0x05AA, 0x6BBC, 0x14F6,
+ 0x6BBD, 0x45EA, 0x6BBE, 0x395C, 0x6BBF, 0x0C3C, 0x6BC0, 0x119D,
+ 0x6BC5, 0x063D, 0x6BC6, 0x14F7, 0x6BC7, 0x45EB, 0x6BC8, 0x45EC,
+ 0x6BC9, 0x45ED, 0x6BCB, 0x14F8, 0x6BCC, 0x3744, 0x6BCD, 0x0E3C,
+ 0x6BCE, 0x0E96, 0x6BCF, 0x344C, 0x6BD2, 0x0C9F, 0x6BD3, 0x14F9,
+ 0x6BD4, 0x0D7A, 0x6BD6, 0x213D, 0x6BD7, 0x421D, 0x6BD8, 0x0D8F,
+ 0x6BDA, 0x45EE, 0x6BDB, 0x0EDF, 0x6BDF, 0x14FA, 0x6BE1, 0x395D,
+ 0x6BE6, 0x45EF, 0x6BE7, 0x45F0, 0x6BEB, 0x14FC, 0x6BEC, 0x14FB,
+ 0x6BEE, 0x45F1, 0x6BEF, 0x14FE, 0x6BF1, 0x395E, 0x6BF3, 0x14FD,
+ 0x6BF7, 0x4C17, 0x6BF9, 0x4C18, 0x6BFF, 0x421E, 0x6C02, 0x45F2,
+ 0x6C04, 0x4C19, 0x6C05, 0x421F, 0x6C08, 0x1500, 0x6C09, 0x4C1A,
+ 0x6C0A, 0x45F3, 0x6C0D, 0x4C1B, 0x6C0E, 0x45F4, 0x6C0F, 0x08AF,
+ 0x6C10, 0x395F, 0x6C11, 0x0EBD, 0x6C13, 0x1501, 0x6C14, 0x1502,
+ 0x6C17, 0x063E, 0x6C1B, 0x1503, 0x6C23, 0x1505, 0x6C24, 0x1504,
+ 0x6C2C, 0x4C1C, 0x6C33, 0x3960, 0x6C34, 0x0A2B, 0x6C35, 0x3961,
+ 0x6C36, 0x45F5, 0x6C37, 0x0DAB, 0x6C38, 0x04EC, 0x6C3A, 0x4F55,
+ 0x6C3E, 0x0D59, 0x6C3F, 0x213E, 0x6C40, 0x0C11, 0x6C41, 0x094B,
+ 0x6C42, 0x067B, 0x6C4A, 0x4C1D, 0x6C4D, 0x45F7, 0x6C4E, 0x0D5A,
+ 0x6C50, 0x08DA, 0x6C52, 0x4C1E, 0x6C54, 0x4C1F, 0x6C55, 0x1507,
+ 0x6C57, 0x05FC, 0x6C59, 0x3963, 0x6C5A, 0x051A, 0x6C5B, 0x45F8,
+ 0x6C5C, 0x213F, 0x6C5D, 0x0CCA, 0x6C5E, 0x1506, 0x6C5F, 0x07D0,
+ 0x6C60, 0x0B91, 0x6C62, 0x1508, 0x6C67, 0x460A, 0x6C68, 0x1510,
+ 0x6C6A, 0x1509, 0x6C6D, 0x45F9, 0x6C6F, 0x2141, 0x6C70, 0x0B21,
+ 0x6C72, 0x067C, 0x6C73, 0x1511, 0x6C74, 0x4220, 0x6C76, 0x3964,
+ 0x6C79, 0x4C20, 0x6C7A, 0x073E, 0x6C7B, 0x3965, 0x6C7D, 0x063F,
+ 0x6C7E, 0x150F, 0x6C81, 0x150D, 0x6C82, 0x150A, 0x6C83, 0x0F4A,
+ 0x6C84, 0x45FA, 0x6C85, 0x3966, 0x6C86, 0x2140, 0x6C88, 0x0BDC,
+ 0x6C89, 0x45FB, 0x6C8C, 0x0CB1, 0x6C8D, 0x150B, 0x6C90, 0x1513,
+ 0x6C92, 0x1512, 0x6C93, 0x06F9, 0x6C94, 0x45FD, 0x6C95, 0x3967,
+ 0x6C96, 0x052D, 0x6C97, 0x45FE, 0x6C98, 0x4221, 0x6C99, 0x082B,
+ 0x6C9A, 0x150C, 0x6C9B, 0x150E, 0x6C9C, 0x3968, 0x6CA1, 0x0E85,
+ 0x6CA2, 0x0B54, 0x6CAA, 0x3749, 0x6CAB, 0x0EA5, 0x6CAC, 0x4C21,
+ 0x6CAD, 0x45FF, 0x6CAE, 0x151B, 0x6CB1, 0x151C, 0x6CB3, 0x054F,
+ 0x6CB4, 0x4C22, 0x6CB8, 0x0DF8, 0x6CB9, 0x0F09, 0x6CBA, 0x151E,
+ 0x6CBB, 0x08CF, 0x6CBC, 0x09AA, 0x6CBD, 0x1517, 0x6CBE, 0x151D,
+ 0x6CBF, 0x050A, 0x6CC1, 0x06AF, 0x6CC2, 0x4600, 0x6CC4, 0x1514,
+ 0x6CC5, 0x1519, 0x6CC6, 0x4223, 0x6CC9, 0x0A98, 0x6CCA, 0x0D27,
+ 0x6CCC, 0x0D7B, 0x6CD0, 0x3969, 0x6CD2, 0x4C23, 0x6CD3, 0x1516,
+ 0x6CD4, 0x396A, 0x6CD5, 0x0E4F, 0x6CD6, 0x396B, 0x6CD7, 0x1518,
+ 0x6CD9, 0x1521, 0x6CDA, 0x2142, 0x6CDB, 0x151F, 0x6CDC, 0x4602,
+ 0x6CDD, 0x151A, 0x6CE0, 0x396C, 0x6CE1, 0x0E50, 0x6CE2, 0x0CFE,
+ 0x6CE3, 0x067D, 0x6CE5, 0x0C1F, 0x6CE8, 0x0BAB, 0x6CE9, 0x4603,
+ 0x6CEA, 0x1522, 0x6CEB, 0x396D, 0x6CEC, 0x396E, 0x6CED, 0x4604,
+ 0x6CEE, 0x396F, 0x6CEF, 0x1520, 0x6CF0, 0x0B39, 0x6CF1, 0x1515,
+ 0x6CF3, 0x04ED, 0x6CFB, 0x4222, 0x6D00, 0x4606, 0x6D01, 0x3C35,
+ 0x6D04, 0x2143, 0x6D0A, 0x3970, 0x6D0B, 0x0F38, 0x6D0C, 0x152D,
+ 0x6D0E, 0x3971, 0x6D11, 0x3972, 0x6D12, 0x152C, 0x6D17, 0x0A9A,
+ 0x6D19, 0x1529, 0x6D1B, 0x0F56, 0x6D1E, 0x0C8E, 0x6D1F, 0x1523,
+ 0x6D24, 0x4607, 0x6D25, 0x0BE1, 0x6D26, 0x4608, 0x6D27, 0x4609,
+ 0x6D29, 0x04EE, 0x6D2A, 0x07D1, 0x6D2B, 0x1526, 0x6D2E, 0x3973,
+ 0x6D2F, 0x460B, 0x6D31, 0x4224, 0x6D32, 0x0931, 0x6D33, 0x152B,
+ 0x6D34, 0x461E, 0x6D35, 0x152A, 0x6D36, 0x1525, 0x6D38, 0x1528,
+ 0x6D39, 0x4225, 0x6D3B, 0x05C6, 0x6D3C, 0x460C, 0x6D3D, 0x1527,
+ 0x6D3E, 0x0CFF, 0x6D3F, 0x4226, 0x6D41, 0x0F76, 0x6D44, 0x09DC,
+ 0x6D45, 0x0A99, 0x6D57, 0x3974, 0x6D58, 0x4227, 0x6D59, 0x1533,
+ 0x6D5A, 0x1531, 0x6D5B, 0x460D, 0x6D5C, 0x0DBF, 0x6D5E, 0x3975,
+ 0x6D60, 0x460E, 0x6D61, 0x4C24, 0x6D63, 0x152E, 0x6D64, 0x1530,
+ 0x6D65, 0x3976, 0x6D66, 0x04DC, 0x6D69, 0x07D2, 0x6D6A, 0x0FD8,
+ 0x6D6C, 0x059B, 0x6D6E, 0x0DD4, 0x6D6F, 0x2145, 0x6D70, 0x460F,
+ 0x6D74, 0x0F4B, 0x6D77, 0x0582, 0x6D78, 0x0A01, 0x6D79, 0x1532,
+ 0x6D7C, 0x4C25, 0x6D80, 0x4610, 0x6D81, 0x4611, 0x6D82, 0x3977,
+ 0x6D85, 0x1537, 0x6D87, 0x2144, 0x6D88, 0x09AB, 0x6D89, 0x342A,
+ 0x6D8A, 0x4612, 0x6D8C, 0x0F1A, 0x6D8D, 0x4613, 0x6D8E, 0x1534,
+ 0x6D91, 0x4614, 0x6D93, 0x152F, 0x6D94, 0x4228, 0x6D95, 0x1535,
+ 0x6D96, 0x2146, 0x6D98, 0x4615, 0x6D99, 0x0FA6, 0x6D9B, 0x0C6D,
+ 0x6D9C, 0x0C9A, 0x6DAA, 0x4229, 0x6DAB, 0x461A, 0x6DAC, 0x2147,
+ 0x6DAE, 0x461B, 0x6DAF, 0x0594, 0x6DB2, 0x04F7, 0x6DB4, 0x461C,
+ 0x6DB5, 0x153B, 0x6DB8, 0x153E, 0x6DB9, 0x4C26, 0x6DBC, 0x0F8B,
+ 0x6DBF, 0x3978, 0x6DC0, 0x0F4E, 0x6DC2, 0x461D, 0x6DC4, 0x3979,
+ 0x6DC5, 0x1545, 0x6DC6, 0x153F, 0x6DC7, 0x153C, 0x6DC8, 0x461F,
+ 0x6DCA, 0x397A, 0x6DCB, 0x0F9C, 0x6DCC, 0x1542, 0x6DCE, 0x4620,
+ 0x6DCF, 0x2148, 0x6DD0, 0x3C36, 0x6DD1, 0x0954, 0x6DD2, 0x1544,
+ 0x6DD5, 0x1549, 0x6DD6, 0x397B, 0x6DD8, 0x0C6B, 0x6DD9, 0x1547,
+ 0x6DDA, 0x3453, 0x6DDB, 0x422A, 0x6DDD, 0x422B, 0x6DDE, 0x1541,
+ 0x6DDF, 0x4621, 0x6DE1, 0x0B76, 0x6DE4, 0x1548, 0x6DE6, 0x153D,
+ 0x6DE8, 0x1543, 0x6DE9, 0x397C, 0x6DEA, 0x154A, 0x6DEB, 0x04C0,
+ 0x6DEC, 0x1540, 0x6DEE, 0x154B, 0x6DF0, 0x4C27, 0x6DF1, 0x0A02,
+ 0x6DF2, 0x214A, 0x6DF3, 0x0969, 0x6DF5, 0x0DF5, 0x6DF6, 0x4622,
+ 0x6DF7, 0x081E, 0x6DF8, 0x2149, 0x6DF9, 0x1538, 0x6DFA, 0x1546,
+ 0x6DFB, 0x0C34, 0x6DFC, 0x214B, 0x6E05, 0x0A5A, 0x6E07, 0x05C7,
+ 0x6E08, 0x0841, 0x6E09, 0x09AC, 0x6E0A, 0x153A, 0x6E0B, 0x094C,
+ 0x6E13, 0x0722, 0x6E15, 0x1539, 0x6E17, 0x3746, 0x6E19, 0x154F,
+ 0x6E1A, 0x0977, 0x6E1B, 0x076E, 0x6E1D, 0x155E, 0x6E1E, 0x4624,
+ 0x6E1F, 0x1558, 0x6E20, 0x068E, 0x6E21, 0x0C49, 0x6E22, 0x397D,
+ 0x6E23, 0x1553, 0x6E24, 0x155C, 0x6E25, 0x0473, 0x6E26, 0x04D4,
+ 0x6E27, 0x214E, 0x6E29, 0x0539, 0x6E2B, 0x1555, 0x6E2C, 0x0B0C,
+ 0x6E2D, 0x154C, 0x6E2E, 0x154E, 0x6E2F, 0x07D3, 0x6E32, 0x4626,
+ 0x6E34, 0x3412, 0x6E36, 0x4623, 0x6E38, 0x155F, 0x6E39, 0x214C,
+ 0x6E3A, 0x155A, 0x6E3C, 0x214F, 0x6E3E, 0x1552, 0x6E42, 0x3C37,
+ 0x6E43, 0x1559, 0x6E44, 0x422C, 0x6E45, 0x4C28, 0x6E48, 0x4627,
+ 0x6E49, 0x4628, 0x6E4A, 0x0EB7, 0x6E4B, 0x4629, 0x6E4C, 0x462A,
+ 0x6E4D, 0x1557, 0x6E4E, 0x155B, 0x6E4F, 0x462B, 0x6E51, 0x397E,
+ 0x6E53, 0x462C, 0x6E54, 0x462D, 0x6E56, 0x0784, 0x6E57, 0x462E,
+ 0x6E58, 0x09AD, 0x6E5B, 0x0B77, 0x6E5C, 0x214D, 0x6E5E, 0x422D,
+ 0x6E5F, 0x1551, 0x6E63, 0x462F, 0x6E67, 0x0F19, 0x6E6B, 0x1554,
+ 0x6E6E, 0x154D, 0x6E6F, 0x0C6C, 0x6E72, 0x1550, 0x6E73, 0x4C29,
+ 0x6E76, 0x1556, 0x6E7B, 0x4C2A, 0x6E7D, 0x4C2B, 0x6E7E, 0x0FF7,
+ 0x6E7F, 0x08EA, 0x6E80, 0x0EAC, 0x6E82, 0x1560, 0x6E89, 0x4C2C,
+ 0x6E8C, 0x0D42, 0x6E8F, 0x156C, 0x6E90, 0x076F, 0x6E93, 0x4631,
+ 0x6E96, 0x096A, 0x6E98, 0x1562, 0x6E9C, 0x0F77, 0x6E9D, 0x07D4,
+ 0x6E9F, 0x156F, 0x6EA2, 0x04B2, 0x6EA5, 0x156D, 0x6EA7, 0x4632,
+ 0x6EAA, 0x1561, 0x6EAB, 0x340C, 0x6EAF, 0x1567, 0x6EB1, 0x422E,
+ 0x6EB2, 0x1569, 0x6EB4, 0x4633, 0x6EB6, 0x0F39, 0x6EB7, 0x1564,
+ 0x6EBA, 0x0C28, 0x6EBC, 0x4C2D, 0x6EBD, 0x1566, 0x6EBF, 0x2150,
+ 0x6EC1, 0x422F, 0x6EC2, 0x156E, 0x6EC3, 0x4634, 0x6EC4, 0x1568,
+ 0x6EC5, 0x0ED3, 0x6EC7, 0x397F, 0x6EC9, 0x1563, 0x6ECA, 0x3980,
+ 0x6ECB, 0x08CE, 0x6ECC, 0x157B, 0x6ECE, 0x3981, 0x6ED1, 0x05C8,
+ 0x6ED3, 0x1565, 0x6ED4, 0x156A, 0x6ED5, 0x156B, 0x6ED9, 0x3C38,
+ 0x6EDA, 0x4C2E, 0x6EDB, 0x4C2F, 0x6EDD, 0x0B4C, 0x6EDE, 0x0B3A,
+ 0x6EE6, 0x3C24, 0x6EEB, 0x4636, 0x6EEC, 0x1573, 0x6EEF, 0x1579,
+ 0x6EF2, 0x1577, 0x6EF4, 0x0C23, 0x6EF7, 0x157E, 0x6EF8, 0x1574,
+ 0x6EF9, 0x4637, 0x6EFB, 0x4638, 0x6EFD, 0x3982, 0x6EFE, 0x1575,
+ 0x6EFF, 0x155D, 0x6F01, 0x0693, 0x6F02, 0x0DAC, 0x6F06, 0x08EB,
+ 0x6F09, 0x0809, 0x6F0A, 0x4639, 0x6F0C, 0x463A, 0x6F0F, 0x0FD9,
+ 0x6F10, 0x4230, 0x6F11, 0x1571, 0x6F13, 0x157D, 0x6F14, 0x050B,
+ 0x6F15, 0x0AE8, 0x6F18, 0x463B, 0x6F1A, 0x3983, 0x6F20, 0x0D2F,
+ 0x6F22, 0x05FD, 0x6F23, 0x0FC2, 0x6F25, 0x463C, 0x6F26, 0x4C30,
+ 0x6F29, 0x4C31, 0x6F2A, 0x3984, 0x6F2B, 0x0EAD, 0x6F2C, 0x0BEE,
+ 0x6F2F, 0x3985, 0x6F30, 0x4C32, 0x6F31, 0x1578, 0x6F32, 0x157A,
+ 0x6F33, 0x3986, 0x6F35, 0x4635, 0x6F36, 0x463D, 0x6F38, 0x0AB4,
+ 0x6F3C, 0x463E, 0x6F3E, 0x157C, 0x6F3F, 0x1576, 0x6F41, 0x1570,
+ 0x6F45, 0x05FF, 0x6F51, 0x1E60, 0x6F52, 0x4640, 0x6F54, 0x073F,
+ 0x6F57, 0x4641, 0x6F58, 0x158A, 0x6F59, 0x4231, 0x6F5A, 0x3987,
+ 0x6F5B, 0x1585, 0x6F5C, 0x0A9C, 0x6F5E, 0x3988, 0x6F5F, 0x05C1,
+ 0x6F60, 0x4642, 0x6F61, 0x4232, 0x6F62, 0x3989, 0x6F64, 0x096B,
+ 0x6F66, 0x158E, 0x6F68, 0x4643, 0x6F6D, 0x1587, 0x6F6E, 0x0BC8,
+ 0x6F6F, 0x1584, 0x6F70, 0x0BF5, 0x6F74, 0x15A7, 0x6F78, 0x1581,
+ 0x6F7A, 0x1580, 0x6F7C, 0x1589, 0x6F7D, 0x398A, 0x6F7E, 0x4233,
+ 0x6F80, 0x1583, 0x6F81, 0x1582, 0x6F82, 0x1588, 0x6F84, 0x0A45,
+ 0x6F86, 0x157F, 0x6F87, 0x4C33, 0x6F88, 0x2151, 0x6F8B, 0x398B,
+ 0x6F8C, 0x4234, 0x6F8D, 0x398C, 0x6F8E, 0x158B, 0x6F90, 0x4644,
+ 0x6F91, 0x158C, 0x6F92, 0x398D, 0x6F94, 0x398E, 0x6F96, 0x4645,
+ 0x6F97, 0x05FE, 0x6F98, 0x363C, 0x6F9A, 0x398F, 0x6F9D, 0x4C34,
+ 0x6F9F, 0x4647, 0x6FA0, 0x4235, 0x6FA1, 0x1591, 0x6FA3, 0x1590,
+ 0x6FA4, 0x1592, 0x6FA5, 0x4648, 0x6FA7, 0x3990, 0x6FA8, 0x3991,
+ 0x6FAA, 0x1595, 0x6FAE, 0x4C35, 0x6FAF, 0x4649, 0x6FB1, 0x0C3D,
+ 0x6FB3, 0x158F, 0x6FB5, 0x2152, 0x6FB6, 0x3992, 0x6FB7, 0x4C36,
+ 0x6FB9, 0x1593, 0x6FBC, 0x4236, 0x6FBE, 0x4646, 0x6FC0, 0x0739,
+ 0x6FC1, 0x0B59, 0x6FC2, 0x158D, 0x6FC3, 0x0CF1, 0x6FC6, 0x1594,
+ 0x6FC7, 0x4237, 0x6FC8, 0x464B, 0x6FC9, 0x464C, 0x6FCA, 0x4238,
+ 0x6FD4, 0x1599, 0x6FD5, 0x1597, 0x6FD8, 0x159A, 0x6FDA, 0x3993,
+ 0x6FDB, 0x159D, 0x6FDE, 0x3994, 0x6FDF, 0x1596, 0x6FE0, 0x07FC,
+ 0x6FE1, 0x0CDE, 0x6FE4, 0x1536, 0x6FE9, 0x464D, 0x6FEB, 0x0F5E,
+ 0x6FEC, 0x1598, 0x6FEE, 0x159C, 0x6FEF, 0x0B55, 0x6FF0, 0x4239,
+ 0x6FF1, 0x159B, 0x6FF3, 0x1586, 0x6FF5, 0x2153, 0x6FF6, 0x1BA4,
+ 0x6FF9, 0x3C23, 0x6FFA, 0x15A0, 0x6FFC, 0x464F, 0x6FFE, 0x15A4,
+ 0x7000, 0x4650, 0x7001, 0x15A2, 0x7005, 0x2154, 0x7006, 0x1E50,
+ 0x7007, 0x2155, 0x7009, 0x159E, 0x700A, 0x4651, 0x700B, 0x159F,
+ 0x700D, 0x4C37, 0x700F, 0x15A3, 0x7011, 0x15A1, 0x7015, 0x0DC0,
+ 0x7018, 0x15A9, 0x701A, 0x15A6, 0x701B, 0x15A5, 0x701D, 0x15A8,
+ 0x701E, 0x0CAC, 0x701F, 0x15AA, 0x7020, 0x4C38, 0x7023, 0x4652,
+ 0x7026, 0x0BB3, 0x7027, 0x0B4D, 0x7028, 0x2156, 0x702C, 0x0A49,
+ 0x7030, 0x15AB, 0x7032, 0x15AD, 0x7039, 0x3996, 0x703A, 0x4654,
+ 0x703C, 0x3997, 0x703E, 0x15AC, 0x7043, 0x4655, 0x7047, 0x4656,
+ 0x7049, 0x4C39, 0x704A, 0x4F52, 0x704B, 0x4657, 0x704C, 0x1572,
+ 0x704E, 0x423A, 0x7051, 0x15AE, 0x7054, 0x3999, 0x7058, 0x0CBF,
+ 0x705D, 0x399A, 0x705E, 0x399B, 0x7063, 0x15AF, 0x7064, 0x399C,
+ 0x7065, 0x4659, 0x7069, 0x465A, 0x706B, 0x0550, 0x706C, 0x399D,
+ 0x706E, 0x465B, 0x706F, 0x0C6E, 0x7070, 0x0583, 0x7075, 0x423B,
+ 0x7076, 0x465C, 0x7078, 0x067E, 0x707C, 0x090A, 0x707D, 0x0842,
+ 0x707E, 0x399E, 0x7081, 0x399F, 0x7085, 0x2157, 0x7086, 0x465D,
+ 0x7089, 0x0FCD, 0x708A, 0x0A2C, 0x708E, 0x050C, 0x7092, 0x15B1,
+ 0x7095, 0x39A0, 0x7097, 0x465E, 0x7098, 0x4C3A, 0x7099, 0x15B0,
+ 0x709F, 0x4660, 0x70A4, 0x423C, 0x70AB, 0x2158, 0x70AC, 0x15B4,
+ 0x70AD, 0x0B78, 0x70AE, 0x15B7, 0x70AF, 0x15B2, 0x70B0, 0x4C3B,
+ 0x70B1, 0x4661, 0x70B3, 0x15B6, 0x70B7, 0x39A1, 0x70B8, 0x15B5,
+ 0x70B9, 0x0C3A, 0x70BA, 0x049D, 0x70BB, 0x20AD, 0x70C8, 0x0FBD,
+ 0x70CA, 0x4664, 0x70CB, 0x15B9, 0x70CF, 0x04CA, 0x70D1, 0x4665,
+ 0x70D3, 0x39A2, 0x70D4, 0x39A3, 0x70D5, 0x4C3C, 0x70D6, 0x4C3D,
+ 0x70D8, 0x39A4, 0x70D9, 0x15BB, 0x70DC, 0x39A5, 0x70DD, 0x15BA,
+ 0x70DF, 0x15B8, 0x70E4, 0x423D, 0x70EC, 0x4663, 0x70F1, 0x15B3,
+ 0x70F9, 0x0E51, 0x70FD, 0x15BD, 0x7103, 0x4666, 0x7104, 0x215A,
+ 0x7106, 0x4667, 0x7107, 0x39A6, 0x7108, 0x4668, 0x7109, 0x15BC,
+ 0x710C, 0x4669, 0x710F, 0x2159, 0x7114, 0x050D, 0x7119, 0x15BF,
+ 0x711A, 0x0E02, 0x711C, 0x15BE, 0x711E, 0x423F, 0x7120, 0x39A7,
+ 0x7121, 0x0EC1, 0x7126, 0x09AF, 0x712B, 0x423E, 0x712E, 0x4240,
+ 0x712F, 0x466B, 0x7130, 0x1DDC, 0x7131, 0x39A8, 0x7136, 0x0AB5,
+ 0x713C, 0x09AE, 0x7145, 0x4C3E, 0x7146, 0x215C, 0x7147, 0x215D,
+ 0x7149, 0x0FC3, 0x714A, 0x39A9, 0x714C, 0x15C5, 0x714E, 0x0A9D,
+ 0x7150, 0x466C, 0x7151, 0x4241, 0x7152, 0x39AA, 0x7153, 0x466D,
+ 0x7155, 0x15C1, 0x7156, 0x15C6, 0x7159, 0x050E, 0x715C, 0x215B,
+ 0x715E, 0x466E, 0x7160, 0x39AB, 0x7162, 0x15C4, 0x7164, 0x0D17,
+ 0x7165, 0x15C0, 0x7166, 0x15C3, 0x7167, 0x09B0, 0x7168, 0x4242,
+ 0x7169, 0x0D65, 0x716C, 0x15C7, 0x716E, 0x08FD, 0x7179, 0x39AC,
+ 0x717D, 0x0A9E, 0x7180, 0x4671, 0x7184, 0x15CA, 0x7185, 0x4243,
+ 0x7187, 0x4244, 0x7188, 0x15C2, 0x718A, 0x06FD, 0x718F, 0x15C8,
+ 0x7192, 0x39AD, 0x7194, 0x0F3A, 0x7195, 0x15CB, 0x7196, 0x4670,
+ 0x7199, 0x205D, 0x719B, 0x4672, 0x719F, 0x0959, 0x71A0, 0x4673,
+ 0x71A2, 0x4674, 0x71A8, 0x15CC, 0x71AC, 0x15CD, 0x71AE, 0x4675,
+ 0x71AF, 0x4676, 0x71B1, 0x0CE4, 0x71B2, 0x4C3F, 0x71B3, 0x3C25,
+ 0x71B9, 0x15CF, 0x71BA, 0x4245, 0x71BE, 0x15D0, 0x71C1, 0x215F,
+ 0x71C3, 0x0CE9, 0x71C4, 0x4246, 0x71C8, 0x0C6F, 0x71C9, 0x15D2,
+ 0x71CB, 0x39AF, 0x71CE, 0x15D4, 0x71D0, 0x0F9D, 0x71D2, 0x15D1,
+ 0x71D3, 0x39B0, 0x71D4, 0x15D3, 0x71D5, 0x050F, 0x71D6, 0x39B1,
+ 0x71D7, 0x15CE, 0x71D9, 0x4678, 0x71DC, 0x4679, 0x71DF, 0x114E,
+ 0x71E0, 0x15D5, 0x71E5, 0x0AE9, 0x71E6, 0x0886, 0x71E7, 0x15D7,
+ 0x71EC, 0x15D6, 0x71ED, 0x09EA, 0x71EE, 0x10EE, 0x71F4, 0x4C40,
+ 0x71F5, 0x15D8, 0x71F9, 0x15DA, 0x71FB, 0x15C9, 0x71FC, 0x15D9,
+ 0x71FE, 0x2160, 0x71FF, 0x15DB, 0x7200, 0x39B2, 0x7206, 0x0D30,
+ 0x7207, 0x467A, 0x720D, 0x15DC, 0x7210, 0x15DD, 0x7215, 0x4247,
+ 0x7217, 0x4C41, 0x721B, 0x15DE, 0x721D, 0x39B3, 0x721F, 0x4C42,
+ 0x7228, 0x15DF, 0x722A, 0x0BFA, 0x722B, 0x39B4, 0x722C, 0x15E1,
+ 0x722D, 0x15E0, 0x7230, 0x15E2, 0x7232, 0x15E3, 0x7234, 0x467C,
+ 0x7235, 0x090B, 0x7236, 0x0DD5, 0x7238, 0x39B5, 0x7239, 0x467D,
+ 0x723A, 0x0EF8, 0x723B, 0x15E4, 0x723C, 0x15E5, 0x723D, 0x0AD8,
+ 0x723E, 0x08D0, 0x723F, 0x15E6, 0x7240, 0x15E7, 0x7241, 0x39B6,
+ 0x7242, 0x467E, 0x7243, 0x4C43, 0x7246, 0x15E8, 0x7247, 0x0E22,
+ 0x7248, 0x0D5B, 0x724B, 0x15E9, 0x724C, 0x0D0D, 0x724F, 0x4C44,
+ 0x7250, 0x4C45, 0x7252, 0x0BC9, 0x7253, 0x39B7, 0x7255, 0x39B8,
+ 0x7256, 0x39B9, 0x7257, 0x467F, 0x7258, 0x15EA, 0x7259, 0x0567,
+ 0x725A, 0x4C46, 0x725B, 0x0687, 0x725C, 0x39BA, 0x725D, 0x0ED2,
+ 0x725F, 0x0EC2, 0x7260, 0x4C47, 0x7261, 0x0534, 0x7262, 0x0FDA,
+ 0x7263, 0x4680, 0x7267, 0x0E80, 0x7268, 0x4C48, 0x7269, 0x0DFA,
+ 0x726E, 0x4682, 0x726F, 0x4683, 0x7272, 0x0A5B, 0x7274, 0x15EB,
+ 0x7277, 0x4C49, 0x7278, 0x4684, 0x7279, 0x0C9B, 0x727D, 0x0757,
+ 0x727E, 0x15EC, 0x727F, 0x4685, 0x7280, 0x0844, 0x7281, 0x15EE,
+ 0x7282, 0x15ED, 0x7284, 0x4C4A, 0x7287, 0x15EF, 0x728D, 0x39BB,
+ 0x728E, 0x4686, 0x7292, 0x15F0, 0x7296, 0x15F1, 0x729B, 0x4249,
+ 0x72A0, 0x0658, 0x72A2, 0x15F2, 0x72A7, 0x15F3, 0x72AC, 0x0758,
+ 0x72AD, 0x39BC, 0x72AE, 0x4688, 0x72AF, 0x0D5C, 0x72B0, 0x4689,
+ 0x72B1, 0x2161, 0x72B2, 0x15F5, 0x72B4, 0x39BD, 0x72B6, 0x09DD,
+ 0x72B9, 0x15F4, 0x72BE, 0x2162, 0x72C0, 0x342B, 0x72C1, 0x468A,
+ 0x72C2, 0x06B0, 0x72C3, 0x15F6, 0x72C4, 0x15F8, 0x72C6, 0x15F7,
+ 0x72C7, 0x39BE, 0x72C9, 0x4C4B, 0x72CC, 0x468C, 0x72CE, 0x15F9,
+ 0x72D0, 0x0785, 0x72D2, 0x15FA, 0x72D7, 0x06E1, 0x72D9, 0x0AC2,
+ 0x72DB, 0x080F, 0x72E0, 0x15FC, 0x72E1, 0x15FD, 0x72E2, 0x15FB,
+ 0x72E5, 0x4C4C, 0x72E9, 0x0919, 0x72EC, 0x0CA0, 0x72ED, 0x06B1,
+ 0x72F3, 0x468F, 0x72F4, 0x4C4D, 0x72F7, 0x15FF, 0x72F8, 0x0B6A,
+ 0x72F9, 0x15FE, 0x72FA, 0x4690, 0x72FB, 0x39BF, 0x72FC, 0x0FDB,
+ 0x72FD, 0x0D18, 0x7302, 0x4C4E, 0x7304, 0x39C0, 0x7305, 0x39C1,
+ 0x7307, 0x4691, 0x730A, 0x1602, 0x730B, 0x4C4F, 0x7312, 0x4692,
+ 0x7316, 0x1604, 0x7317, 0x1601, 0x7318, 0x4693, 0x7319, 0x4694,
+ 0x731B, 0x0EE0, 0x731C, 0x1603, 0x731D, 0x1605, 0x731E, 0x4C50,
+ 0x731F, 0x0F8C, 0x7322, 0x4C51, 0x7324, 0x2163, 0x7325, 0x1609,
+ 0x7327, 0x424B, 0x7328, 0x39C2, 0x7329, 0x1608, 0x732A, 0x0BB4,
+ 0x732B, 0x0CE3, 0x732C, 0x4697, 0x732E, 0x0759, 0x732F, 0x1607,
+ 0x7331, 0x39C3, 0x7333, 0x4698, 0x7334, 0x1606, 0x7336, 0x0F1B,
+ 0x7337, 0x0F1C, 0x7339, 0x4696, 0x733A, 0x4C52, 0x733B, 0x4C53,
+ 0x733D, 0x4699, 0x733E, 0x160A, 0x733F, 0x0510, 0x7343, 0x39C4,
+ 0x7344, 0x0808, 0x7345, 0x08B0, 0x734D, 0x4C54, 0x734E, 0x160B,
+ 0x734F, 0x160C, 0x7350, 0x424C, 0x7352, 0x469A, 0x7357, 0x160E,
+ 0x7358, 0x4C55, 0x7363, 0x094D, 0x7366, 0x424D, 0x7367, 0x4C56,
+ 0x7368, 0x1610, 0x736A, 0x160F, 0x736B, 0x469C, 0x736C, 0x39C5,
+ 0x736E, 0x469E, 0x736F, 0x469F, 0x7370, 0x1611, 0x7371, 0x46A0,
+ 0x7372, 0x05AB, 0x7375, 0x1613, 0x7377, 0x2165, 0x7378, 0x1612,
+ 0x737A, 0x1615, 0x737B, 0x1614, 0x737C, 0x39C6, 0x7381, 0x46A1,
+ 0x7383, 0x39C7, 0x7384, 0x0770, 0x7385, 0x39C8, 0x7386, 0x39C9,
+ 0x7387, 0x0F70, 0x7389, 0x06C4, 0x738A, 0x46A2, 0x738B, 0x0526,
+ 0x7394, 0x46A3, 0x7395, 0x39CA, 0x7396, 0x06E2, 0x7398, 0x46A4,
+ 0x739C, 0x46A5, 0x739E, 0x39CB, 0x739F, 0x39CC, 0x73A0, 0x39CD,
+ 0x73A2, 0x424E, 0x73A5, 0x46A6, 0x73A6, 0x39CE, 0x73A8, 0x3C3F,
+ 0x73A9, 0x061D, 0x73AB, 0x39CF, 0x73B2, 0x0FB0, 0x73B3, 0x1617,
+ 0x73B5, 0x39D0, 0x73B7, 0x39D1, 0x73B9, 0x46A7, 0x73BA, 0x35EA,
+ 0x73BB, 0x1619, 0x73BC, 0x39D2, 0x73BD, 0x2166, 0x73BF, 0x46A8,
+ 0x73C0, 0x161A, 0x73C2, 0x0551, 0x73C5, 0x46A9, 0x73C8, 0x1616,
+ 0x73C9, 0x2167, 0x73CA, 0x0887, 0x73CB, 0x46AA, 0x73CD, 0x0BDD,
+ 0x73CE, 0x1618, 0x73CF, 0x39D3, 0x73D2, 0x216A, 0x73D6, 0x2168,
+ 0x73D9, 0x39D4, 0x73DE, 0x161D, 0x73E0, 0x091A, 0x73E1, 0x46AB,
+ 0x73E3, 0x2169, 0x73E4, 0x3C39, 0x73E5, 0x161B, 0x73E7, 0x46AC,
+ 0x73E9, 0x39D5, 0x73EA, 0x0714, 0x73ED, 0x0D5D, 0x73EE, 0x161C,
+ 0x73F1, 0x1637, 0x73F4, 0x39D6, 0x73F5, 0x216C, 0x73F8, 0x1622,
+ 0x73F9, 0x46AD, 0x73FA, 0x46AF, 0x73FD, 0x39D7, 0x73FE, 0x0771,
+ 0x7401, 0x46B0, 0x7403, 0x067F, 0x7404, 0x39D8, 0x7405, 0x161F,
+ 0x7406, 0x0F67, 0x7407, 0x216B, 0x7409, 0x0F78, 0x740A, 0x39D9,
+ 0x7413, 0x46AE, 0x741A, 0x39DA, 0x741B, 0x39DB, 0x7421, 0x3C3A,
+ 0x7422, 0x0B56, 0x7424, 0x39DC, 0x7425, 0x1621, 0x7426, 0x216D,
+ 0x7428, 0x39DD, 0x7429, 0x216F, 0x742A, 0x216E, 0x742B, 0x424F,
+ 0x742C, 0x39DE, 0x742E, 0x2170, 0x742F, 0x39DF, 0x7430, 0x39E0,
+ 0x7431, 0x39E1, 0x7432, 0x1623, 0x7433, 0x0F9E, 0x7434, 0x06CF,
+ 0x7435, 0x0D90, 0x7436, 0x0D00, 0x7439, 0x39E2, 0x743A, 0x1624,
+ 0x743F, 0x1626, 0x7440, 0x46B2, 0x7441, 0x1629, 0x7443, 0x46B3,
+ 0x7444, 0x39E3, 0x7446, 0x4250, 0x7447, 0x39E4, 0x744B, 0x39E5,
+ 0x744D, 0x39E6, 0x7451, 0x39E7, 0x7452, 0x46B4, 0x7453, 0x46B1,
+ 0x7455, 0x1625, 0x7457, 0x39E8, 0x7459, 0x1628, 0x745A, 0x079E,
+ 0x745B, 0x04EF, 0x745C, 0x162A, 0x745D, 0x46B5, 0x745E, 0x0A36,
+ 0x745F, 0x1627, 0x7460, 0x0FA4, 0x7462, 0x4251, 0x7463, 0x162D,
+ 0x7464, 0x1D35, 0x7466, 0x39E9, 0x7469, 0x162B, 0x746A, 0x162E,
+ 0x746B, 0x39EA, 0x746D, 0x4252, 0x746F, 0x1620, 0x7470, 0x162C,
+ 0x7471, 0x39EB, 0x7472, 0x4C57, 0x7473, 0x082C, 0x7476, 0x162F,
+ 0x747E, 0x1630, 0x7480, 0x39EC, 0x7481, 0x46B6, 0x7483, 0x0F68,
+ 0x7485, 0x39ED, 0x7486, 0x39EE, 0x7487, 0x39EF, 0x7488, 0x46B7,
+ 0x7489, 0x2172, 0x748B, 0x1631, 0x7490, 0x39F0, 0x7492, 0x46B9,
+ 0x7497, 0x46BA, 0x7498, 0x39F1, 0x7499, 0x46BB, 0x749C, 0x39F2,
+ 0x749E, 0x1632, 0x749F, 0x2173, 0x74A0, 0x39F3, 0x74A1, 0x46BC,
+ 0x74A2, 0x161E, 0x74A3, 0x39F4, 0x74A5, 0x46BD, 0x74A6, 0x4253,
+ 0x74A7, 0x1633, 0x74A8, 0x39F5, 0x74A9, 0x4254, 0x74AA, 0x46BE,
+ 0x74AB, 0x39F6, 0x74AF, 0x4C58, 0x74B0, 0x0600, 0x74B5, 0x39F7,
+ 0x74B9, 0x46BF, 0x74BA, 0x46C1, 0x74BB, 0x46C0, 0x74BD, 0x08D1,
+ 0x74BF, 0x39F8, 0x74C8, 0x39F9, 0x74C9, 0x4255, 0x74CA, 0x1634,
+ 0x74CF, 0x1635, 0x74D4, 0x1636, 0x74D6, 0x46C2, 0x74D8, 0x46C3,
+ 0x74DA, 0x39FA, 0x74DC, 0x04DD, 0x74DE, 0x39FB, 0x74DF, 0x4C59,
+ 0x74E0, 0x1638, 0x74E2, 0x0DAD, 0x74E3, 0x1639, 0x74E4, 0x4C5A,
+ 0x74E6, 0x05E0, 0x74E7, 0x163A, 0x74E9, 0x163B, 0x74EB, 0x46C4,
+ 0x74EE, 0x163C, 0x74EF, 0x3750, 0x74F0, 0x163E, 0x74F1, 0x163F,
+ 0x74F2, 0x163D, 0x74F4, 0x4C5B, 0x74F6, 0x0DC5, 0x74F7, 0x1641,
+ 0x74F8, 0x1640, 0x74FA, 0x46C6, 0x74FB, 0x4C5C, 0x74FF, 0x4256,
+ 0x7501, 0x2174, 0x7503, 0x1643, 0x7504, 0x1642, 0x7505, 0x1644,
+ 0x750C, 0x1645, 0x750D, 0x1647, 0x750E, 0x1646, 0x7511, 0x080B,
+ 0x7513, 0x1649, 0x7515, 0x1648, 0x7516, 0x4C5D, 0x7517, 0x4257,
+ 0x7518, 0x0601, 0x751A, 0x0A19, 0x751C, 0x0C36, 0x751E, 0x164A,
+ 0x751F, 0x0A5C, 0x7520, 0x46C8, 0x7521, 0x4C5E, 0x7522, 0x35DE,
+ 0x7523, 0x0888, 0x7524, 0x46C9, 0x7525, 0x051B, 0x7526, 0x164B,
+ 0x7528, 0x0F3B, 0x752A, 0x46CA, 0x752B, 0x0E33, 0x752C, 0x164C,
+ 0x752F, 0x20F2, 0x7530, 0x0C3E, 0x7531, 0x0F1D, 0x7532, 0x07D5,
+ 0x7533, 0x0A03, 0x7537, 0x0B89, 0x7538, 0x10C9, 0x753A, 0x0BCA,
+ 0x753B, 0x0568, 0x753C, 0x164D, 0x753D, 0x46CD, 0x753E, 0x46CE,
+ 0x753F, 0x4C5F, 0x7540, 0x46CF, 0x7544, 0x164E, 0x7546, 0x1653,
+ 0x7548, 0x46D0, 0x7549, 0x1651, 0x754A, 0x1650, 0x754B, 0x13C7,
+ 0x754C, 0x0584, 0x754D, 0x164F, 0x754E, 0x39FC, 0x754F, 0x049E,
+ 0x7550, 0x46D1, 0x7551, 0x0D3E, 0x7552, 0x46D2, 0x7554, 0x0D5E,
+ 0x7559, 0x0F79, 0x755A, 0x1654, 0x755B, 0x1652, 0x755C, 0x0B9A,
+ 0x755D, 0x0A4A, 0x755E, 0x4C60, 0x7560, 0x0D3F, 0x7562, 0x0D9F,
+ 0x7564, 0x1656, 0x7565, 0x0F74, 0x7566, 0x0723, 0x7567, 0x1657,
+ 0x7569, 0x1655, 0x756A, 0x0D6A, 0x756B, 0x1658, 0x756C, 0x3C3B,
+ 0x756D, 0x1659, 0x756F, 0x2175, 0x7570, 0x049F, 0x7571, 0x46D4,
+ 0x7572, 0x46D3, 0x7573, 0x09DE, 0x7574, 0x165E, 0x7575, 0x3751,
+ 0x7576, 0x165B, 0x7577, 0x0CC5, 0x7578, 0x165A, 0x7579, 0x39FD,
+ 0x757A, 0x46D5, 0x757D, 0x46D6, 0x757E, 0x46D7, 0x757F, 0x0640,
+ 0x7581, 0x39FE, 0x7582, 0x1661, 0x7586, 0x165C, 0x7587, 0x165D,
+ 0x7589, 0x1660, 0x758A, 0x165F, 0x758B, 0x0D97, 0x758C, 0x46D8,
+ 0x758E, 0x0AC4, 0x758F, 0x0AC3, 0x7590, 0x39FF, 0x7591, 0x0659,
+ 0x7592, 0x3A00, 0x7593, 0x3A01, 0x7594, 0x1662, 0x7599, 0x4C61,
+ 0x759A, 0x1663, 0x759D, 0x1664, 0x75A2, 0x46DA, 0x75A3, 0x1666,
+ 0x75A4, 0x4C62, 0x75A5, 0x1665, 0x75AB, 0x04F8, 0x75B0, 0x46DC,
+ 0x75B1, 0x166E, 0x75B2, 0x0D7C, 0x75B3, 0x1668, 0x75B4, 0x3A02,
+ 0x75B5, 0x166A, 0x75B7, 0x46DD, 0x75B8, 0x166C, 0x75B9, 0x0A04,
+ 0x75BC, 0x166D, 0x75BD, 0x166B, 0x75BE, 0x08EC, 0x75BF, 0x46DE,
+ 0x75C0, 0x46DF, 0x75C1, 0x4C63, 0x75C2, 0x1667, 0x75C3, 0x1669,
+ 0x75C4, 0x4C64, 0x75C5, 0x0DB4, 0x75C6, 0x46E0, 0x75C7, 0x09B1,
+ 0x75CA, 0x1670, 0x75CC, 0x4C65, 0x75CD, 0x166F, 0x75CE, 0x4259,
+ 0x75CF, 0x46E1, 0x75D2, 0x1671, 0x75D3, 0x46E2, 0x75D4, 0x08D2,
+ 0x75D5, 0x081F, 0x75D7, 0x4C66, 0x75D8, 0x0C71, 0x75D9, 0x1672,
+ 0x75DB, 0x0BE7, 0x75DC, 0x4C67, 0x75DD, 0x46E3, 0x75DE, 0x1674,
+ 0x75DF, 0x46E4, 0x75E0, 0x46E5, 0x75E1, 0x4C68, 0x75E2, 0x0F69,
+ 0x75E3, 0x1673, 0x75E4, 0x3A03, 0x75E7, 0x46E6, 0x75E9, 0x0AEB,
+ 0x75EC, 0x3752, 0x75EE, 0x46E7, 0x75EF, 0x4C69, 0x75F0, 0x1679,
+ 0x75F1, 0x46E8, 0x75F2, 0x167B, 0x75F3, 0x167C, 0x75F4, 0x0B92,
+ 0x75F9, 0x3A04, 0x75FA, 0x167A, 0x75FC, 0x1677, 0x75FE, 0x1675,
+ 0x75FF, 0x1676, 0x7600, 0x3A05, 0x7601, 0x1678, 0x7602, 0x425A,
+ 0x7603, 0x46E9, 0x7604, 0x4C6A, 0x7607, 0x46EB, 0x7608, 0x425B,
+ 0x7609, 0x167F, 0x760A, 0x3A06, 0x760B, 0x167D, 0x760C, 0x4C6B,
+ 0x760D, 0x167E, 0x760F, 0x46EC, 0x7613, 0x46EF, 0x7615, 0x3A07,
+ 0x7616, 0x3A08, 0x7618, 0x46EA, 0x7619, 0x3A09, 0x761B, 0x46F0,
+ 0x761C, 0x46F1, 0x761D, 0x4C6C, 0x761E, 0x3A0A, 0x761F, 0x1680,
+ 0x7620, 0x1682, 0x7621, 0x1683, 0x7622, 0x1684, 0x7624, 0x1685,
+ 0x7625, 0x46F3, 0x7626, 0x3645, 0x7627, 0x1681, 0x7628, 0x46F4,
+ 0x762D, 0x3A0B, 0x7630, 0x1687, 0x7632, 0x4C6D, 0x7633, 0x46F6,
+ 0x7634, 0x1686, 0x7635, 0x3A0C, 0x7638, 0x4C6E, 0x763B, 0x1688,
+ 0x763C, 0x46F5, 0x7641, 0x46F9, 0x7642, 0x0F8D, 0x7643, 0x3A0D,
+ 0x7645, 0x4C6F, 0x7646, 0x168B, 0x7647, 0x1689, 0x7648, 0x168A,
+ 0x7649, 0x46FB, 0x764A, 0x4C70, 0x764B, 0x3A0E, 0x764C, 0x061E,
+ 0x764E, 0x3753, 0x7652, 0x0F0A, 0x7655, 0x46FC, 0x7656, 0x0E1A,
+ 0x7658, 0x168D, 0x765C, 0x168C, 0x765F, 0x4C71, 0x7661, 0x168E,
+ 0x7662, 0x168F, 0x7664, 0x425C, 0x7665, 0x3A0F, 0x7667, 0x1693,
+ 0x7668, 0x1690, 0x7669, 0x1691, 0x766A, 0x1692, 0x766C, 0x1694,
+ 0x766D, 0x3A10, 0x766E, 0x46FE, 0x766F, 0x3A11, 0x7670, 0x1695,
+ 0x7671, 0x3A12, 0x7672, 0x1696, 0x7674, 0x3A13, 0x7676, 0x1697,
+ 0x7678, 0x1698, 0x767A, 0x0D43, 0x767B, 0x0C4A, 0x767C, 0x1699,
+ 0x767D, 0x0D28, 0x767E, 0x0DA6, 0x7680, 0x169A, 0x7681, 0x425D,
+ 0x7682, 0x2176, 0x7683, 0x169B, 0x7684, 0x0C24, 0x7686, 0x0585,
+ 0x7687, 0x07D6, 0x7688, 0x169C, 0x768B, 0x169D, 0x768E, 0x169E,
+ 0x7690, 0x0877, 0x7693, 0x16A0, 0x7695, 0x46FF, 0x7696, 0x169F,
+ 0x7699, 0x16A1, 0x769A, 0x16A2, 0x769B, 0x2179, 0x769C, 0x2177,
+ 0x769D, 0x425E, 0x769E, 0x2178, 0x76A0, 0x4701, 0x76A1, 0x4700,
+ 0x76A4, 0x3A14, 0x76A5, 0x3A15, 0x76A6, 0x217A, 0x76A7, 0x4702,
+ 0x76A8, 0x4703, 0x76AA, 0x425F, 0x76AD, 0x4C72, 0x76AE, 0x0D7D,
+ 0x76AF, 0x4704, 0x76B0, 0x16A3, 0x76B4, 0x16A4, 0x76B6, 0x4260,
+ 0x76B7, 0x1D1C, 0x76B8, 0x16A5, 0x76B9, 0x16A6, 0x76BA, 0x16A7,
+ 0x76BD, 0x4C73, 0x76BF, 0x087C, 0x76C2, 0x16A8, 0x76C3, 0x0D0C,
+ 0x76C5, 0x3A16, 0x76C6, 0x0E8D, 0x76C8, 0x04F0, 0x76C9, 0x4706,
+ 0x76CA, 0x04F9, 0x76CC, 0x3A17, 0x76CD, 0x16A9, 0x76CE, 0x4261,
+ 0x76D2, 0x16AB, 0x76D4, 0x4262, 0x76D6, 0x16AA, 0x76D7, 0x0C6A,
+ 0x76D9, 0x4C74, 0x76DB, 0x0A5D, 0x76DC, 0x14D8, 0x76DE, 0x16AC,
+ 0x76DF, 0x0ECD, 0x76E1, 0x16AD, 0x76E3, 0x0602, 0x76E4, 0x0D6B,
+ 0x76E5, 0x16AE, 0x76E6, 0x4263, 0x76E7, 0x16AF, 0x76E8, 0x4708,
+ 0x76EA, 0x16B0, 0x76EB, 0x4C75, 0x76EC, 0x3A18, 0x76EE, 0x0EE8,
+ 0x76F0, 0x4C76, 0x76F1, 0x4264, 0x76F2, 0x0EE1, 0x76F4, 0x0BDA,
+ 0x76F8, 0x0AEC, 0x76F9, 0x4C77, 0x76FB, 0x16B2, 0x76FC, 0x3A19,
+ 0x76FE, 0x096C, 0x7700, 0x4C78, 0x7701, 0x09B2, 0x7704, 0x16B5,
+ 0x7707, 0x16B4, 0x7708, 0x16B3, 0x7709, 0x0D91, 0x770A, 0x4265,
+ 0x770B, 0x0603, 0x770C, 0x075D, 0x770E, 0x4C79, 0x7717, 0x470A,
+ 0x7719, 0x4266, 0x771A, 0x470B, 0x771B, 0x16BB, 0x771E, 0x16B8,
+ 0x771F, 0x0A05, 0x7720, 0x0EBE, 0x7722, 0x4C7A, 0x7724, 0x16B7,
+ 0x7725, 0x16B9, 0x7726, 0x16BA, 0x7728, 0x4C7B, 0x7729, 0x16B6,
+ 0x772D, 0x470C, 0x772F, 0x4C7C, 0x7734, 0x3A1A, 0x7735, 0x470D,
+ 0x7736, 0x3A1B, 0x7737, 0x16BC, 0x7738, 0x16BD, 0x7739, 0x4C7D,
+ 0x773A, 0x0BCB, 0x773C, 0x061F, 0x773E, 0x4C7E, 0x7740, 0x0BA3,
+ 0x7745, 0x4C7F, 0x7746, 0x217C, 0x7747, 0x16BE, 0x774A, 0x4C80,
+ 0x774D, 0x4267, 0x774E, 0x4268, 0x774F, 0x4C81, 0x7758, 0x4712,
+ 0x775A, 0x16BF, 0x775B, 0x16C2, 0x775C, 0x3A1C, 0x775E, 0x4C82,
+ 0x775F, 0x3A1D, 0x7760, 0x3A1E, 0x7761, 0x0A2D, 0x7762, 0x1EC5,
+ 0x7763, 0x0C9C, 0x7764, 0x4C83, 0x7765, 0x16C3, 0x7766, 0x0E81,
+ 0x7767, 0x4C84, 0x7768, 0x16C0, 0x776A, 0x3755, 0x776B, 0x16C1,
+ 0x776C, 0x4C85, 0x7772, 0x3A1F, 0x7779, 0x16C6, 0x777A, 0x4269,
+ 0x777C, 0x4714, 0x777D, 0x3A20, 0x777E, 0x16C5, 0x777F, 0x16C4,
+ 0x7780, 0x426A, 0x7784, 0x4C86, 0x778B, 0x16C8, 0x778C, 0x4C87,
+ 0x778D, 0x4C88, 0x778E, 0x16C7, 0x7791, 0x16C9, 0x7794, 0x426B,
+ 0x7795, 0x3A21, 0x7796, 0x4C89, 0x779A, 0x4717, 0x779E, 0x16CB,
+ 0x779F, 0x4718, 0x77A0, 0x16CA, 0x77A2, 0x4719, 0x77A4, 0x471A,
+ 0x77A5, 0x0E1D, 0x77A7, 0x4C8A, 0x77A9, 0x3756, 0x77AA, 0x3A22,
+ 0x77AC, 0x0960, 0x77AD, 0x0F8E, 0x77AF, 0x4C8B, 0x77B0, 0x16CC,
+ 0x77B3, 0x0C8F, 0x77B6, 0x16CD, 0x77B7, 0x4C8C, 0x77B9, 0x16CE,
+ 0x77BB, 0x16D2, 0x77BC, 0x16D0, 0x77BD, 0x16D1, 0x77BE, 0x4C8D,
+ 0x77BF, 0x16CF, 0x77C7, 0x16D3, 0x77C9, 0x4C8E, 0x77CD, 0x16D4,
+ 0x77D1, 0x4C8F, 0x77D7, 0x16D5, 0x77D9, 0x4C90, 0x77DA, 0x16D6,
+ 0x77DB, 0x0EC3, 0x77DC, 0x16D7, 0x77DE, 0x471B, 0x77DF, 0x471C,
+ 0x77E0, 0x426C, 0x77E2, 0x0EFC, 0x77E3, 0x16D8, 0x77E4, 0x471D,
+ 0x77E5, 0x0B8C, 0x77E6, 0x3A23, 0x77E7, 0x0D20, 0x77E9, 0x06E3,
+ 0x77EA, 0x471E, 0x77EC, 0x471F, 0x77ED, 0x0B79, 0x77EE, 0x16D9,
+ 0x77EF, 0x06B2, 0x77F0, 0x3A24, 0x77F1, 0x4C91, 0x77F3, 0x0A74,
+ 0x77F4, 0x3A25, 0x77FB, 0x4720, 0x77FC, 0x16DA, 0x7802, 0x082D,
+ 0x7805, 0x4722, 0x7806, 0x3A26, 0x7809, 0x4723, 0x780C, 0x16DB,
+ 0x780D, 0x4724, 0x7812, 0x16DC, 0x7814, 0x075A, 0x7815, 0x0845,
+ 0x7819, 0x4725, 0x7820, 0x16DE, 0x7821, 0x217E, 0x7822, 0x3A27,
+ 0x7825, 0x0C50, 0x7826, 0x0846, 0x7827, 0x0668, 0x782C, 0x4726,
+ 0x782D, 0x3A28, 0x782E, 0x3A29, 0x7830, 0x3A2A, 0x7832, 0x0E52,
+ 0x7834, 0x0D01, 0x7835, 0x3A2B, 0x7837, 0x4C92, 0x783A, 0x0C51,
+ 0x783F, 0x07EE, 0x7843, 0x426E, 0x7845, 0x16E0, 0x7847, 0x4727,
+ 0x784E, 0x217F, 0x784F, 0x341E, 0x7851, 0x3C3C, 0x785C, 0x4C93,
+ 0x785D, 0x09B3, 0x7864, 0x2180, 0x7868, 0x3A2C, 0x786A, 0x4728,
+ 0x786B, 0x0F7A, 0x786C, 0x07D7, 0x786E, 0x426F, 0x786F, 0x075B,
+ 0x7872, 0x0D37, 0x7874, 0x16E2, 0x787A, 0x2181, 0x787C, 0x16E4,
+ 0x787E, 0x4C94, 0x7881, 0x079F, 0x7886, 0x16E3, 0x7887, 0x0C12,
+ 0x788A, 0x472A, 0x788C, 0x16E6, 0x788D, 0x0595, 0x788E, 0x16E1,
+ 0x7891, 0x0D7E, 0x7893, 0x04D2, 0x7894, 0x472B, 0x7895, 0x085C,
+ 0x7897, 0x0FF8, 0x7898, 0x4C95, 0x789A, 0x16E5, 0x789D, 0x472D,
+ 0x789E, 0x3A2D, 0x789F, 0x472E, 0x78A1, 0x4C96, 0x78A3, 0x16E7,
+ 0x78A4, 0x472C, 0x78A7, 0x0E1B, 0x78A9, 0x0A7D, 0x78AA, 0x16E9,
+ 0x78AD, 0x4272, 0x78AF, 0x16EA, 0x78B0, 0x4270, 0x78B1, 0x4C97,
+ 0x78B3, 0x4C98, 0x78B5, 0x16E8, 0x78BA, 0x05AC, 0x78BB, 0x472F,
+ 0x78BC, 0x16F0, 0x78BE, 0x16EF, 0x78C1, 0x08D3, 0x78C5, 0x16F1,
+ 0x78C6, 0x16EC, 0x78C8, 0x3A2E, 0x78C9, 0x4C99, 0x78CA, 0x16F2,
+ 0x78CB, 0x16ED, 0x78CC, 0x3A2F, 0x78CE, 0x3A30, 0x78D0, 0x0D6C,
+ 0x78D1, 0x16EB, 0x78D3, 0x4C9A, 0x78D4, 0x16EE, 0x78D5, 0x4730,
+ 0x78DA, 0x16F5, 0x78E0, 0x3A32, 0x78E1, 0x3A33, 0x78E4, 0x3A31,
+ 0x78E6, 0x4731, 0x78E7, 0x16F4, 0x78E8, 0x0E8F, 0x78EC, 0x16F3,
+ 0x78EF, 0x04AF, 0x78F2, 0x3A34, 0x78F4, 0x16F7, 0x78F7, 0x3A35,
+ 0x78F9, 0x4732, 0x78FA, 0x4733, 0x78FB, 0x3A36, 0x78FD, 0x16F6,
+ 0x78FE, 0x4734, 0x7900, 0x4273, 0x7901, 0x09B4, 0x7907, 0x16F8,
+ 0x790C, 0x4C9B, 0x790E, 0x0AC5, 0x7910, 0x4736, 0x7911, 0x16FA,
+ 0x7912, 0x16F9, 0x7919, 0x16FB, 0x791B, 0x4737, 0x791C, 0x4274,
+ 0x791F, 0x4C9C, 0x7925, 0x4738, 0x7926, 0x16DD, 0x7927, 0x4C9D,
+ 0x7928, 0x4C9E, 0x792A, 0x16DF, 0x792B, 0x16FD, 0x792C, 0x16FC,
+ 0x792E, 0x4275, 0x7930, 0x2182, 0x7931, 0x3A37, 0x7934, 0x4276,
+ 0x793A, 0x08D4, 0x793B, 0x3A39, 0x793C, 0x0FB1, 0x793D, 0x3A3A,
+ 0x793E, 0x08FE, 0x793F, 0x4C9F, 0x7940, 0x16FE, 0x7941, 0x070D,
+ 0x7942, 0x4CA0, 0x7945, 0x3A3B, 0x7946, 0x4277, 0x7947, 0x065A,
+ 0x7948, 0x0641, 0x7949, 0x08B1, 0x794A, 0x4739, 0x7950, 0x0F1E,
+ 0x7953, 0x1704, 0x7954, 0x4CA1, 0x7955, 0x1703, 0x7956, 0x0AC6,
+ 0x7957, 0x1700, 0x7958, 0x473A, 0x795A, 0x1702, 0x795B, 0x3A3C,
+ 0x795C, 0x3A3D, 0x795D, 0x0955, 0x795E, 0x0A06, 0x795F, 0x1701,
+ 0x7960, 0x16FF, 0x7962, 0x0CE0, 0x7965, 0x09B5, 0x7967, 0x473C,
+ 0x7968, 0x0DAE, 0x796B, 0x4CA2, 0x796D, 0x0847, 0x7972, 0x473D,
+ 0x7977, 0x0C72, 0x7979, 0x4278, 0x797A, 0x1705, 0x797C, 0x4CA3,
+ 0x797F, 0x1706, 0x7980, 0x171C, 0x7981, 0x06D0, 0x7984, 0x0FE3,
+ 0x7985, 0x0AB7, 0x798A, 0x1707, 0x798B, 0x3A3E, 0x798D, 0x0552,
+ 0x798E, 0x0C13, 0x798F, 0x0DF1, 0x7994, 0x2186, 0x7995, 0x473E,
+ 0x7996, 0x3A3F, 0x7998, 0x3A40, 0x799B, 0x2188, 0x799D, 0x1708,
+ 0x79A1, 0x473F, 0x79A6, 0x0694, 0x79A7, 0x1709, 0x79A9, 0x4740,
+ 0x79AA, 0x170B, 0x79AB, 0x4CA4, 0x79AE, 0x170C, 0x79B0, 0x0CDF,
+ 0x79B1, 0x1E4E, 0x79B3, 0x170D, 0x79B4, 0x4741, 0x79B8, 0x3A41,
+ 0x79B9, 0x170E, 0x79BA, 0x170F, 0x79BB, 0x3A42, 0x79BD, 0x06D1,
+ 0x79BE, 0x0553, 0x79BF, 0x0C9D, 0x79C0, 0x0932, 0x79C1, 0x08B2,
+ 0x79C2, 0x4742, 0x79C4, 0x4CA5, 0x79C7, 0x4743, 0x79C8, 0x4279,
+ 0x79C9, 0x1710, 0x79CA, 0x3A43, 0x79CB, 0x0933, 0x79CC, 0x4744,
+ 0x79CD, 0x4745, 0x79D1, 0x054A, 0x79D2, 0x0DB5, 0x79D4, 0x427B,
+ 0x79D5, 0x1711, 0x79D6, 0x4746, 0x79D8, 0x0D7F, 0x79DA, 0x3A44,
+ 0x79DE, 0x427C, 0x79DF, 0x0AC7, 0x79E1, 0x1714, 0x79E3, 0x1715,
+ 0x79E4, 0x0D1F, 0x79E6, 0x0A07, 0x79E7, 0x1712, 0x79E9, 0x0B9F,
+ 0x79EA, 0x4CA6, 0x79EB, 0x427D, 0x79EC, 0x1713, 0x79ED, 0x427E,
+ 0x79F0, 0x09B6, 0x79FB, 0x04A0, 0x7A00, 0x0643, 0x7A02, 0x4CA7,
+ 0x7A03, 0x3A45, 0x7A05, 0x3633, 0x7A08, 0x1716, 0x7A09, 0x3A46,
+ 0x7A0A, 0x474B, 0x7A0B, 0x0C14, 0x7A0C, 0x4CA8, 0x7A0D, 0x1717,
+ 0x7A0E, 0x0A6B, 0x7A11, 0x3A47, 0x7A14, 0x0EB9, 0x7A15, 0x474C,
+ 0x7A17, 0x0D95, 0x7A18, 0x1718, 0x7A19, 0x1719, 0x7A1A, 0x0B93,
+ 0x7A1B, 0x474D, 0x7A1C, 0x0F8F, 0x7A1E, 0x3A48, 0x7A1F, 0x171B,
+ 0x7A20, 0x171A, 0x7A2D, 0x3A49, 0x7A2E, 0x091B, 0x7A30, 0x4CA9,
+ 0x7A31, 0x171D, 0x7A32, 0x04B4, 0x7A37, 0x1720, 0x7A38, 0x474F,
+ 0x7A39, 0x3A4A, 0x7A3A, 0x4CAA, 0x7A3B, 0x171E, 0x7A3C, 0x0554,
+ 0x7A3D, 0x0724, 0x7A3E, 0x171F, 0x7A3F, 0x07D8, 0x7A40, 0x0804,
+ 0x7A42, 0x0E36, 0x7A43, 0x1721, 0x7A44, 0x4CAB, 0x7A45, 0x3A4B,
+ 0x7A46, 0x0E82, 0x7A47, 0x4750, 0x7A49, 0x1723, 0x7A4C, 0x3A4C,
+ 0x7A4D, 0x0A75, 0x7A4E, 0x04F1, 0x7A4F, 0x053A, 0x7A50, 0x0470,
+ 0x7A56, 0x4751, 0x7A57, 0x1722, 0x7A59, 0x4752, 0x7A5C, 0x4753,
+ 0x7A5D, 0x3A4D, 0x7A5F, 0x4754, 0x7A60, 0x4F56, 0x7A61, 0x1724,
+ 0x7A62, 0x1725, 0x7A63, 0x09DF, 0x7A67, 0x4755, 0x7A69, 0x1726,
+ 0x7A6A, 0x4756, 0x7A6B, 0x05AD, 0x7A6D, 0x3A4F, 0x7A70, 0x1728,
+ 0x7A74, 0x0740, 0x7A75, 0x4757, 0x7A76, 0x0680, 0x7A78, 0x3A50,
+ 0x7A79, 0x1729, 0x7A7A, 0x06ED, 0x7A7D, 0x172A, 0x7A7F, 0x0AA0,
+ 0x7A80, 0x4CAC, 0x7A81, 0x0CA5, 0x7A82, 0x4758, 0x7A83, 0x0A84,
+ 0x7A84, 0x0865, 0x7A85, 0x427F, 0x7A86, 0x4CAD, 0x7A88, 0x172B,
+ 0x7A8A, 0x4759, 0x7A90, 0x475A, 0x7A92, 0x0BA0, 0x7A93, 0x0AED,
+ 0x7A94, 0x4CAE, 0x7A95, 0x172D, 0x7A96, 0x172F, 0x7A97, 0x172C,
+ 0x7A98, 0x172E, 0x7A9F, 0x06F8, 0x7AA0, 0x3A51, 0x7AA3, 0x3A52,
+ 0x7AA9, 0x1730, 0x7AAA, 0x06FC, 0x7AAC, 0x475B, 0x7AAE, 0x0681,
+ 0x7AAF, 0x0F3C, 0x7AB0, 0x1732, 0x7AB3, 0x3A53, 0x7AB5, 0x4CAF,
+ 0x7AB6, 0x1733, 0x7AB9, 0x475E, 0x7ABA, 0x04D0, 0x7ABB, 0x3A54,
+ 0x7ABC, 0x3A55, 0x7ABD, 0x4CB0, 0x7ABE, 0x475F, 0x7ABF, 0x1736,
+ 0x7AC3, 0x05D4, 0x7AC4, 0x1735, 0x7AC5, 0x1734, 0x7AC6, 0x3A56,
+ 0x7AC7, 0x1738, 0x7AC8, 0x1731, 0x7ACA, 0x1739, 0x7ACB, 0x0F71,
+ 0x7ACC, 0x4761, 0x7ACD, 0x173A, 0x7ACE, 0x4281, 0x7ACF, 0x173B,
+ 0x7AD1, 0x2189, 0x7AD2, 0x11C5, 0x7AD3, 0x173D, 0x7AD5, 0x173C,
+ 0x7AD9, 0x173E, 0x7ADA, 0x173F, 0x7ADC, 0x0F7D, 0x7ADD, 0x1740,
+ 0x7ADF, 0x1C08, 0x7AE0, 0x09B7, 0x7AE1, 0x1741, 0x7AE2, 0x1742,
+ 0x7AE3, 0x0961, 0x7AE5, 0x0C90, 0x7AE6, 0x1743, 0x7AE7, 0x218A,
+ 0x7AE8, 0x4762, 0x7AEA, 0x0B66, 0x7AEB, 0x218C, 0x7AED, 0x1744,
+ 0x7AEF, 0x0B7A, 0x7AF0, 0x1745, 0x7AF4, 0x4763, 0x7AF6, 0x069D,
+ 0x7AF8, 0x1076, 0x7AF9, 0x0B9B, 0x7AFA, 0x08DF, 0x7AFD, 0x4282,
+ 0x7AFE, 0x4CB1, 0x7AFF, 0x0604, 0x7B02, 0x1746, 0x7B04, 0x1753,
+ 0x7B06, 0x1749, 0x7B07, 0x3A57, 0x7B08, 0x0682, 0x7B0A, 0x1748,
+ 0x7B0B, 0x1755, 0x7B0F, 0x1747, 0x7B11, 0x09B8, 0x7B12, 0x4283,
+ 0x7B14, 0x3A58, 0x7B18, 0x174B, 0x7B19, 0x174C, 0x7B1B, 0x0C25,
+ 0x7B1E, 0x174D, 0x7B20, 0x05BC, 0x7B25, 0x0A20, 0x7B26, 0x0DD6,
+ 0x7B27, 0x3A59, 0x7B28, 0x174F, 0x7B2A, 0x4768, 0x7B2B, 0x4CB2,
+ 0x7B2C, 0x0B48, 0x7B2D, 0x4284, 0x7B2E, 0x4769, 0x7B2F, 0x476A,
+ 0x7B31, 0x3A5A, 0x7B33, 0x174A, 0x7B35, 0x174E, 0x7B36, 0x1750,
+ 0x7B39, 0x086B, 0x7B3B, 0x4285, 0x7B3D, 0x4767, 0x7B41, 0x476E,
+ 0x7B45, 0x1757, 0x7B46, 0x0DA0, 0x7B47, 0x3A5B, 0x7B48, 0x0D3A,
+ 0x7B49, 0x0C73, 0x7B4B, 0x06D2, 0x7B4C, 0x1756, 0x7B4D, 0x1754,
+ 0x7B4E, 0x3A5C, 0x7B4F, 0x0D49, 0x7B50, 0x1751, 0x7B51, 0x0B9C,
+ 0x7B52, 0x0C75, 0x7B53, 0x375D, 0x7B54, 0x0C74, 0x7B55, 0x4770,
+ 0x7B56, 0x0866, 0x7B5D, 0x1769, 0x7B60, 0x3A5D, 0x7B64, 0x4772,
+ 0x7B65, 0x1759, 0x7B66, 0x4773, 0x7B67, 0x175B, 0x7B69, 0x3A5E,
+ 0x7B6C, 0x175E, 0x7B6D, 0x3A5F, 0x7B6E, 0x175F, 0x7B6F, 0x4286,
+ 0x7B70, 0x175C, 0x7B71, 0x175D, 0x7B72, 0x3A60, 0x7B73, 0x4774,
+ 0x7B74, 0x175A, 0x7B75, 0x1758, 0x7B77, 0x4CB3, 0x7B79, 0x4771,
+ 0x7B7A, 0x1752, 0x7B7F, 0x476D, 0x7B86, 0x0E1F, 0x7B87, 0x0555,
+ 0x7B8B, 0x1766, 0x7B8D, 0x1763, 0x7B8F, 0x1768, 0x7B90, 0x4777,
+ 0x7B91, 0x3A61, 0x7B92, 0x1767, 0x7B94, 0x0D29, 0x7B95, 0x0EB3,
+ 0x7B97, 0x0889, 0x7B98, 0x1761, 0x7B99, 0x176A, 0x7B9A, 0x1765,
+ 0x7B9B, 0x4778, 0x7B9C, 0x1764, 0x7B9D, 0x1760, 0x7B9E, 0x218D,
+ 0x7B9F, 0x1762, 0x7BA0, 0x4CB4, 0x7BA1, 0x0605, 0x7BAA, 0x0B7B,
+ 0x7BAC, 0x4CB5, 0x7BAD, 0x0AA1, 0x7BAF, 0x3A62, 0x7BB0, 0x4CB6,
+ 0x7BB1, 0x0D36, 0x7BB4, 0x176F, 0x7BB5, 0x477A, 0x7BB8, 0x0D38,
+ 0x7BBC, 0x477B, 0x7BC0, 0x0A85, 0x7BC1, 0x176C, 0x7BC4, 0x0D63,
+ 0x7BC5, 0x477C, 0x7BC6, 0x1770, 0x7BC7, 0x0E23, 0x7BC9, 0x0B99,
+ 0x7BCA, 0x477D, 0x7BCB, 0x176B, 0x7BCC, 0x176D, 0x7BCF, 0x176E,
+ 0x7BD4, 0x4780, 0x7BD6, 0x4781, 0x7BD7, 0x3A63, 0x7BD9, 0x3A64,
+ 0x7BDA, 0x4782, 0x7BDD, 0x1771, 0x7BE0, 0x08F0, 0x7BE4, 0x0C9E,
+ 0x7BE5, 0x1776, 0x7BE6, 0x1775, 0x7BE8, 0x4CB7, 0x7BE9, 0x1772,
+ 0x7BEA, 0x4783, 0x7BED, 0x0FDC, 0x7BF0, 0x4784, 0x7BF2, 0x4CB8,
+ 0x7BF3, 0x177B, 0x7BF6, 0x177F, 0x7BF7, 0x177C, 0x7BF8, 0x4CB9,
+ 0x7BFC, 0x4CBA, 0x7BFE, 0x4CBB, 0x7C00, 0x1778, 0x7C01, 0x4287,
+ 0x7C03, 0x4785, 0x7C07, 0x1779, 0x7C09, 0x4CBC, 0x7C0B, 0x3A65,
+ 0x7C0D, 0x177E, 0x7C0E, 0x4786, 0x7C0F, 0x3A66, 0x7C11, 0x1773,
+ 0x7C12, 0x10EA, 0x7C13, 0x177A, 0x7C14, 0x1774, 0x7C17, 0x177D,
+ 0x7C1E, 0x1E3B, 0x7C1F, 0x1783, 0x7C20, 0x3A67, 0x7C21, 0x0606,
+ 0x7C23, 0x1780, 0x7C26, 0x3A68, 0x7C27, 0x1781, 0x7C28, 0x4CBD,
+ 0x7C2A, 0x1782, 0x7C2B, 0x1785, 0x7C2F, 0x4CBE, 0x7C31, 0x3A69,
+ 0x7C33, 0x4288, 0x7C36, 0x3A6A, 0x7C37, 0x1784, 0x7C38, 0x0D8A,
+ 0x7C3D, 0x1786, 0x7C3E, 0x0FC4, 0x7C3F, 0x0E3D, 0x7C40, 0x178B,
+ 0x7C42, 0x4CBF, 0x7C43, 0x1788, 0x7C45, 0x4787, 0x7C4A, 0x4788,
+ 0x7C4C, 0x1787, 0x7C4D, 0x0A76, 0x7C4F, 0x178A, 0x7C50, 0x178C,
+ 0x7C51, 0x3A6B, 0x7C52, 0x4CC0, 0x7C53, 0x4CC1, 0x7C54, 0x1789,
+ 0x7C56, 0x1790, 0x7C57, 0x4789, 0x7C58, 0x178D, 0x7C59, 0x3A6C,
+ 0x7C5B, 0x4CC2, 0x7C5C, 0x4CC3, 0x7C5D, 0x4CC4, 0x7C5E, 0x478A,
+ 0x7C5F, 0x178E, 0x7C60, 0x1777, 0x7C61, 0x478B, 0x7C64, 0x178F,
+ 0x7C65, 0x1791, 0x7C67, 0x3A6D, 0x7C69, 0x478C, 0x7C6C, 0x1792,
+ 0x7C6D, 0x428A, 0x7C6E, 0x3A6E, 0x7C6F, 0x478D, 0x7C70, 0x3A6F,
+ 0x7C72, 0x4CC5, 0x7C73, 0x0E16, 0x7C75, 0x1793, 0x7C79, 0x428B,
+ 0x7C7B, 0x370E, 0x7C7D, 0x4CC6, 0x7C7E, 0x0EEE, 0x7C81, 0x06C6,
+ 0x7C82, 0x06FF, 0x7C83, 0x1794, 0x7C87, 0x4CC7, 0x7C89, 0x0E04,
+ 0x7C8B, 0x0A2E, 0x7C8D, 0x0EBC, 0x7C8F, 0x428C, 0x7C90, 0x1795,
+ 0x7C92, 0x0F7B, 0x7C94, 0x428D, 0x7C95, 0x0D2A, 0x7C97, 0x0AC8,
+ 0x7C98, 0x0CEA, 0x7C9B, 0x0957, 0x7C9E, 0x4CC8, 0x7C9F, 0x0484,
+ 0x7CA0, 0x428E, 0x7CA1, 0x179A, 0x7CA2, 0x1798, 0x7CA4, 0x1796,
+ 0x7CA5, 0x05DD, 0x7CA6, 0x4791, 0x7CA7, 0x09B9, 0x7CA8, 0x179B,
+ 0x7CAB, 0x1799, 0x7CAD, 0x1797, 0x7CAE, 0x179F, 0x7CB1, 0x179E,
+ 0x7CB2, 0x179D, 0x7CB3, 0x179C, 0x7CB6, 0x4793, 0x7CB7, 0x4794,
+ 0x7CB9, 0x17A0, 0x7CBA, 0x4CC9, 0x7CBC, 0x3A70, 0x7CBD, 0x17A1,
+ 0x7CBE, 0x0A5E, 0x7CBF, 0x3A71, 0x7CC0, 0x17A2, 0x7CC2, 0x17A4,
+ 0x7CC4, 0x4796, 0x7CC5, 0x17A3, 0x7CC7, 0x4CCA, 0x7CC8, 0x3A72,
+ 0x7CC9, 0x3A73, 0x7CCA, 0x0786, 0x7CCD, 0x4798, 0x7CCE, 0x0ABA,
+ 0x7CD2, 0x17A6, 0x7CD3, 0x4CCB, 0x7CD5, 0x428F, 0x7CD6, 0x0C76,
+ 0x7CD7, 0x3A74, 0x7CD8, 0x17A5, 0x7CD9, 0x3A75, 0x7CDA, 0x4CCC,
+ 0x7CDC, 0x17A7, 0x7CDD, 0x3A76, 0x7CDE, 0x0E05, 0x7CDF, 0x0AEE,
+ 0x7CE0, 0x07D9, 0x7CE2, 0x17A8, 0x7CE6, 0x479B, 0x7CE7, 0x0F90,
+ 0x7CEB, 0x3A77, 0x7CEF, 0x17AA, 0x7CF2, 0x17AB, 0x7CF4, 0x17AC,
+ 0x7CF5, 0x479D, 0x7CF6, 0x17AD, 0x7CF8, 0x08B3, 0x7CFA, 0x17AE,
+ 0x7CFB, 0x0725, 0x7CFE, 0x0684, 0x7D00, 0x0644, 0x7D02, 0x17B0,
+ 0x7D03, 0x479E, 0x7D04, 0x0EFF, 0x7D05, 0x07DA, 0x7D06, 0x17AF,
+ 0x7D07, 0x3A78, 0x7D08, 0x3A79, 0x7D09, 0x3A7A, 0x7D0A, 0x17B3,
+ 0x7D0B, 0x0EF2, 0x7D0D, 0x0CF2, 0x7D10, 0x0DA5, 0x7D12, 0x47A0,
+ 0x7D13, 0x3A7B, 0x7D14, 0x096D, 0x7D15, 0x17B2, 0x7D17, 0x08FF,
+ 0x7D18, 0x07DB, 0x7D19, 0x08B4, 0x7D1A, 0x0683, 0x7D1B, 0x0E06,
+ 0x7D1C, 0x17B1, 0x7D1D, 0x3A7C, 0x7D1E, 0x47A1, 0x7D20, 0x0AC9,
+ 0x7D21, 0x0E70, 0x7D22, 0x0867, 0x7D23, 0x3A7D, 0x7D2B, 0x08B5,
+ 0x7D2C, 0x0BF9, 0x7D2E, 0x17B6, 0x7D2F, 0x0FA7, 0x7D30, 0x0849,
+ 0x7D31, 0x4290, 0x7D32, 0x17B7, 0x7D33, 0x0A08, 0x7D35, 0x17B9,
+ 0x7D39, 0x09BA, 0x7D3A, 0x0820, 0x7D3C, 0x4CCD, 0x7D3D, 0x47A4,
+ 0x7D3E, 0x47A5, 0x7D3F, 0x17B8, 0x7D40, 0x47A6, 0x7D41, 0x3A7E,
+ 0x7D42, 0x0934, 0x7D43, 0x0772, 0x7D44, 0x0ACA, 0x7D45, 0x17B4,
+ 0x7D46, 0x17BA, 0x7D47, 0x47A7, 0x7D48, 0x218F, 0x7D4B, 0x17B5,
+ 0x7D4C, 0x0726, 0x7D4D, 0x4CCE, 0x7D4E, 0x17BD, 0x7D4F, 0x17C1,
+ 0x7D50, 0x0741, 0x7D53, 0x3A7F, 0x7D55, 0x363A, 0x7D56, 0x17BC,
+ 0x7D59, 0x3A80, 0x7D5A, 0x47AB, 0x7D5B, 0x17C5, 0x7D5C, 0x4291,
+ 0x7D5D, 0x3A81, 0x7D5E, 0x07DC, 0x7D61, 0x0F57, 0x7D62, 0x0480,
+ 0x7D63, 0x17C2, 0x7D66, 0x0685, 0x7D68, 0x17BF, 0x7D6A, 0x47AC,
+ 0x7D6E, 0x17C0, 0x7D70, 0x47AD, 0x7D71, 0x0C77, 0x7D72, 0x17BE,
+ 0x7D73, 0x17BB, 0x7D75, 0x0586, 0x7D76, 0x0A88, 0x7D79, 0x075C,
+ 0x7D7A, 0x3A82, 0x7D7D, 0x17C7, 0x7D7F, 0x47AF, 0x7D82, 0x4CCF,
+ 0x7D83, 0x4292, 0x7D85, 0x4CD0, 0x7D86, 0x3A83, 0x7D88, 0x47B1,
+ 0x7D89, 0x17C4, 0x7D8B, 0x3A84, 0x7D8C, 0x3A85, 0x7D8D, 0x4CD1,
+ 0x7D8F, 0x17C6, 0x7D91, 0x4CD2, 0x7D93, 0x17C3, 0x7D97, 0x47B2,
+ 0x7D99, 0x0727, 0x7D9A, 0x0B13, 0x7D9B, 0x17C8, 0x7D9C, 0x0AF0,
+ 0x7D9D, 0x47B4, 0x7D9E, 0x4CD3, 0x7D9F, 0x17D5, 0x7DA0, 0x2192,
+ 0x7DA2, 0x17D1, 0x7DA3, 0x17CB, 0x7DA6, 0x4293, 0x7DA7, 0x47B5,
+ 0x7DAA, 0x47B6, 0x7DAB, 0x17CF, 0x7DAC, 0x0926, 0x7DAD, 0x04A1,
+ 0x7DAE, 0x17CA, 0x7DAF, 0x17D2, 0x7DB0, 0x17D6, 0x7DB1, 0x07DD,
+ 0x7DB2, 0x0EE2, 0x7DB3, 0x4CD4, 0x7DB4, 0x0BF2, 0x7DB5, 0x17CC,
+ 0x7DB6, 0x47B7, 0x7DB7, 0x2191, 0x7DB8, 0x17D4, 0x7DB9, 0x4CD5,
+ 0x7DBA, 0x17C9, 0x7DBB, 0x0B7C, 0x7DBD, 0x17CE, 0x7DBE, 0x0481,
+ 0x7DBF, 0x0ED6, 0x7DC0, 0x47B8, 0x7DC2, 0x4294, 0x7DC7, 0x17CD,
+ 0x7DCA, 0x06D3, 0x7DCB, 0x0D80, 0x7DCC, 0x3A86, 0x7DCF, 0x0AEF,
+ 0x7DD0, 0x4CD6, 0x7DD1, 0x0F98, 0x7DD2, 0x0979, 0x7DD5, 0x17FD,
+ 0x7DD6, 0x2193, 0x7DD7, 0x47B9, 0x7DD8, 0x17D7, 0x7DD9, 0x47BA,
+ 0x7DDA, 0x0AA2, 0x7DDC, 0x17D3, 0x7DDD, 0x17D8, 0x7DDE, 0x17DA,
+ 0x7DE0, 0x0C15, 0x7DE1, 0x17DD, 0x7DE3, 0x340A, 0x7DE4, 0x17D9,
+ 0x7DE5, 0x4CD7, 0x7DE6, 0x47BB, 0x7DE8, 0x0E24, 0x7DE9, 0x0607,
+ 0x7DEB, 0x3A87, 0x7DEC, 0x0ED7, 0x7DEF, 0x04A2, 0x7DF1, 0x3A88,
+ 0x7DF2, 0x17DC, 0x7DF4, 0x0FC5, 0x7DF5, 0x4CD8, 0x7DF6, 0x4CD9,
+ 0x7DF9, 0x3A89, 0x7DFB, 0x17DB, 0x7E01, 0x0511, 0x7E04, 0x0CC4,
+ 0x7E05, 0x17DE, 0x7E08, 0x3A8A, 0x7E09, 0x17E5, 0x7E0A, 0x17DF,
+ 0x7E0B, 0x17E6, 0x7E10, 0x47BF, 0x7E11, 0x3A8B, 0x7E12, 0x17E2,
+ 0x7E15, 0x3A8C, 0x7E17, 0x47C0, 0x7E1B, 0x0D31, 0x7E1D, 0x47C1,
+ 0x7E1E, 0x08F6, 0x7E1F, 0x17E4, 0x7E20, 0x3A8D, 0x7E21, 0x17E1,
+ 0x7E22, 0x17E7, 0x7E23, 0x17E0, 0x7E26, 0x094E, 0x7E27, 0x47C2,
+ 0x7E28, 0x4295, 0x7E2B, 0x0E53, 0x7E2C, 0x47C3, 0x7E2E, 0x0956,
+ 0x7E2F, 0x4CDA, 0x7E31, 0x17E3, 0x7E32, 0x17EF, 0x7E35, 0x17EB,
+ 0x7E36, 0x4CDB, 0x7E37, 0x17EE, 0x7E39, 0x17EC, 0x7E3A, 0x17F0,
+ 0x7E3B, 0x17EA, 0x7E3D, 0x17D0, 0x7E3E, 0x0A77, 0x7E41, 0x0D5F,
+ 0x7E43, 0x17ED, 0x7E44, 0x4CDC, 0x7E45, 0x47C4, 0x7E46, 0x17E8,
+ 0x7E47, 0x3A8E, 0x7E48, 0x3767, 0x7E4A, 0x0AA3, 0x7E4B, 0x0728,
+ 0x7E4D, 0x0935, 0x7E52, 0x2194, 0x7E54, 0x09EB, 0x7E55, 0x0AB8,
+ 0x7E56, 0x17F3, 0x7E59, 0x17F5, 0x7E5A, 0x17F6, 0x7E5D, 0x17F2,
+ 0x7E5E, 0x17F4, 0x7E61, 0x1E11, 0x7E62, 0x3A8F, 0x7E66, 0x17E9,
+ 0x7E67, 0x17F1, 0x7E69, 0x17F9, 0x7E6A, 0x17F8, 0x7E6B, 0x1DF7,
+ 0x7E6D, 0x0EA8, 0x7E6E, 0x3A90, 0x7E6F, 0x4CDD, 0x7E70, 0x0701,
+ 0x7E73, 0x3A91, 0x7E75, 0x47C5, 0x7E78, 0x4CDE, 0x7E79, 0x17F7,
+ 0x7E7B, 0x17FB, 0x7E7C, 0x17FA, 0x7E7D, 0x17FE, 0x7E7E, 0x47C6,
+ 0x7E7F, 0x1800, 0x7E81, 0x4CDF, 0x7E82, 0x088A, 0x7E83, 0x17FC,
+ 0x7E86, 0x47C7, 0x7E87, 0x47C8, 0x7E88, 0x1801, 0x7E89, 0x1802,
+ 0x7E8A, 0x20A7, 0x7E8C, 0x1803, 0x7E8D, 0x3A92, 0x7E8E, 0x1809,
+ 0x7E8F, 0x0C35, 0x7E90, 0x1805, 0x7E91, 0x3A93, 0x7E92, 0x1804,
+ 0x7E93, 0x1806, 0x7E94, 0x1807, 0x7E96, 0x1808, 0x7E98, 0x3A94,
+ 0x7E9A, 0x47CA, 0x7E9B, 0x180A, 0x7E9C, 0x180B, 0x7F36, 0x0608,
+ 0x7F38, 0x180C, 0x7F3A, 0x180D, 0x7F3B, 0x47CD, 0x7F3C, 0x47CC,
+ 0x7F3D, 0x4CE0, 0x7F3E, 0x47CE, 0x7F43, 0x47CF, 0x7F44, 0x3A95,
+ 0x7F45, 0x180E, 0x7F47, 0x2195, 0x7F4C, 0x180F, 0x7F4D, 0x1810,
+ 0x7F4E, 0x1811, 0x7F4F, 0x3A96, 0x7F50, 0x1812, 0x7F51, 0x1813,
+ 0x7F52, 0x3A97, 0x7F53, 0x3A98, 0x7F54, 0x1815, 0x7F55, 0x1814,
+ 0x7F58, 0x1816, 0x7F5B, 0x4CE1, 0x7F5D, 0x4CE2, 0x7F5F, 0x1817,
+ 0x7F60, 0x1818, 0x7F61, 0x3A99, 0x7F63, 0x47D3, 0x7F64, 0x47D4,
+ 0x7F65, 0x4CE3, 0x7F67, 0x181B, 0x7F68, 0x1819, 0x7F69, 0x181A,
+ 0x7F6A, 0x0851, 0x7F6B, 0x0729, 0x7F6D, 0x47D5, 0x7F6E, 0x0B94,
+ 0x7F70, 0x0D47, 0x7F71, 0x4CE4, 0x7F72, 0x097A, 0x7F75, 0x0D03,
+ 0x7F77, 0x0D81, 0x7F78, 0x181C, 0x7F79, 0x1336, 0x7F7D, 0x47D6,
+ 0x7F7E, 0x47D7, 0x7F7F, 0x4CE5, 0x7F80, 0x4CE6, 0x7F82, 0x181D,
+ 0x7F83, 0x181F, 0x7F85, 0x0F4F, 0x7F86, 0x181E, 0x7F87, 0x1821,
+ 0x7F88, 0x1820, 0x7F8A, 0x0F3D, 0x7F8B, 0x4CE7, 0x7F8C, 0x1822,
+ 0x7F8E, 0x0D92, 0x7F90, 0x47D8, 0x7F91, 0x3A9A, 0x7F94, 0x1823,
+ 0x7F96, 0x47DB, 0x7F97, 0x4296, 0x7F9A, 0x1826, 0x7F9C, 0x47DC,
+ 0x7F9D, 0x1825, 0x7F9E, 0x1824, 0x7FA1, 0x2196, 0x7FA2, 0x4CE8,
+ 0x7FA3, 0x1827, 0x7FA4, 0x0708, 0x7FA8, 0x0AA4, 0x7FA9, 0x065B,
+ 0x7FAD, 0x47DD, 0x7FAE, 0x182B, 0x7FAF, 0x1828, 0x7FB2, 0x1829,
+ 0x7FB6, 0x182C, 0x7FB8, 0x182D, 0x7FB9, 0x182A, 0x7FBD, 0x04CB,
+ 0x7FBF, 0x3A9B, 0x7FC1, 0x0527, 0x7FC3, 0x47DF, 0x7FC5, 0x182F,
+ 0x7FC6, 0x1830, 0x7FCA, 0x1831, 0x7FCC, 0x0F4C, 0x7FCE, 0x3A9C,
+ 0x7FCF, 0x47E0, 0x7FD2, 0x0936, 0x7FD4, 0x1833, 0x7FD5, 0x1832,
+ 0x7FDB, 0x4297, 0x7FDF, 0x3A9D, 0x7FE0, 0x0A2F, 0x7FE1, 0x1834,
+ 0x7FE3, 0x47E1, 0x7FE5, 0x3A9E, 0x7FE6, 0x1835, 0x7FE9, 0x1836,
+ 0x7FEB, 0x0621, 0x7FEC, 0x3A9F, 0x7FEE, 0x3AA0, 0x7FEF, 0x3AA1,
+ 0x7FF0, 0x0609, 0x7FF2, 0x47E2, 0x7FF3, 0x1837, 0x7FF9, 0x1838,
+ 0x7FFA, 0x3AA2, 0x7FFB, 0x0E8B, 0x7FFC, 0x0F4D, 0x7FFD, 0x4CE9,
+ 0x7FFE, 0x4CEA, 0x7FFF, 0x4CEB, 0x8000, 0x0F3E, 0x8001, 0x0FDD,
+ 0x8002, 0x3713, 0x8003, 0x07DF, 0x8004, 0x183B, 0x8005, 0x0900,
+ 0x8006, 0x183A, 0x8007, 0x4CEC, 0x8008, 0x47E4, 0x800A, 0x47E3,
+ 0x800B, 0x183C, 0x800C, 0x08D5, 0x800D, 0x4CED, 0x800E, 0x3AA3,
+ 0x8010, 0x0B31, 0x8011, 0x3AA4, 0x8012, 0x183D, 0x8014, 0x3AA5,
+ 0x8015, 0x07DE, 0x8016, 0x47E5, 0x8017, 0x0EE3, 0x8018, 0x183E,
+ 0x8019, 0x183F, 0x801C, 0x1840, 0x801E, 0x4CEE, 0x8021, 0x1841,
+ 0x8024, 0x3AA6, 0x8026, 0x3AA7, 0x8028, 0x1842, 0x802C, 0x47E6,
+ 0x8030, 0x47E7, 0x8033, 0x08D6, 0x8035, 0x4298, 0x8036, 0x0EF9,
+ 0x8037, 0x4299, 0x8039, 0x4CEF, 0x803A, 0x3AA8, 0x803B, 0x1844,
+ 0x803C, 0x3AA9, 0x803D, 0x0B7D, 0x803F, 0x1843, 0x8043, 0x47E8,
+ 0x8046, 0x1846, 0x804A, 0x1845, 0x8052, 0x1847, 0x8056, 0x0A5F,
+ 0x8058, 0x1848, 0x805A, 0x1849, 0x805E, 0x0E09, 0x805F, 0x184A,
+ 0x8060, 0x3AAA, 0x8061, 0x0AF1, 0x8062, 0x184B, 0x8066, 0x47E9,
+ 0x8068, 0x184C, 0x806F, 0x0FC6, 0x8070, 0x184F, 0x8071, 0x3AAB,
+ 0x8072, 0x184E, 0x8073, 0x184D, 0x8074, 0x0BCC, 0x8075, 0x3AAC,
+ 0x8076, 0x1850, 0x8077, 0x09EC, 0x8079, 0x1851, 0x807B, 0x47EA,
+ 0x807D, 0x1852, 0x807E, 0x0FDE, 0x807F, 0x1853, 0x8084, 0x1854,
+ 0x8085, 0x1856, 0x8086, 0x1855, 0x8087, 0x0D39, 0x8088, 0x4CF0,
+ 0x8089, 0x0CD1, 0x808B, 0x0FE4, 0x808C, 0x0D3D, 0x808E, 0x4CF1,
+ 0x8093, 0x1858, 0x8096, 0x09BB, 0x8098, 0x0D9C, 0x8099, 0x47EB,
+ 0x809A, 0x1859, 0x809B, 0x1857, 0x809C, 0x47EC, 0x809D, 0x060A,
+ 0x809E, 0x3AAD, 0x80A1, 0x0788, 0x80A2, 0x08B6, 0x80A4, 0x47ED,
+ 0x80A5, 0x0D82, 0x80A6, 0x3AAE, 0x80A7, 0x47EE, 0x80A9, 0x075E,
+ 0x80AA, 0x0E71, 0x80AB, 0x3AAF, 0x80AC, 0x185C, 0x80AD, 0x185A,
+ 0x80AF, 0x07E0, 0x80B1, 0x07E1, 0x80B2, 0x04AD, 0x80B4, 0x0858,
+ 0x80B8, 0x47EF, 0x80BA, 0x0D0F, 0x80C3, 0x04A3, 0x80C4, 0x1861,
+ 0x80C5, 0x47F1, 0x80C6, 0x0B7E, 0x80CA, 0x429A, 0x80CC, 0x0D0E,
+ 0x80CE, 0x0B3B, 0x80CF, 0x4CF2, 0x80D4, 0x4CF3, 0x80D5, 0x47F2,
+ 0x80D6, 0x1863, 0x80D7, 0x3AB0, 0x80D8, 0x3AB1, 0x80D9, 0x185F,
+ 0x80DA, 0x1862, 0x80DB, 0x185D, 0x80DD, 0x1860, 0x80DE, 0x0E54,
+ 0x80E0, 0x429B, 0x80E1, 0x0789, 0x80E4, 0x04C1, 0x80E5, 0x185E,
+ 0x80E6, 0x47F3, 0x80ED, 0x4CF4, 0x80EF, 0x1865, 0x80F0, 0x4CF5,
+ 0x80F1, 0x1866, 0x80F3, 0x429C, 0x80F4, 0x0C91, 0x80F5, 0x47F5,
+ 0x80F7, 0x4CF6, 0x80F8, 0x06B3, 0x80FA, 0x4CF7, 0x80FB, 0x47F6,
+ 0x80FC, 0x1871, 0x80FD, 0x0CF3, 0x80FE, 0x4CF8, 0x8102, 0x08B7,
+ 0x8103, 0x4CF9, 0x8105, 0x06B4, 0x8106, 0x0A6C, 0x8107, 0x0FEC,
+ 0x8108, 0x0EBA, 0x8109, 0x1864, 0x810A, 0x0A78, 0x810D, 0x47F4,
+ 0x8116, 0x3AB2, 0x8117, 0x4CFA, 0x8118, 0x3AB3, 0x811A, 0x066D,
+ 0x811B, 0x1867, 0x811E, 0x47F9, 0x8123, 0x1869, 0x8124, 0x47FB,
+ 0x8127, 0x47FC, 0x8129, 0x1868, 0x812B, 0x3659, 0x812C, 0x47FD,
+ 0x812F, 0x186A, 0x8130, 0x4CFB, 0x8131, 0x0B64, 0x8133, 0x0CF4,
+ 0x8135, 0x47F8, 0x8139, 0x0BCD, 0x813A, 0x3AB4, 0x813D, 0x47FF,
+ 0x813E, 0x186E, 0x8141, 0x3772, 0x8146, 0x186D, 0x814A, 0x3AB5,
+ 0x814B, 0x186B, 0x814C, 0x3AB6, 0x814E, 0x0A1B, 0x8150, 0x0DD7,
+ 0x8151, 0x1870, 0x8153, 0x186F, 0x8154, 0x07E2, 0x8155, 0x0FF9,
+ 0x8157, 0x4CFC, 0x815F, 0x1880, 0x8160, 0x429D, 0x8165, 0x1874,
+ 0x8166, 0x1875, 0x8167, 0x429E, 0x8168, 0x429F, 0x8169, 0x4801,
+ 0x816B, 0x091C, 0x816D, 0x42A0, 0x816E, 0x1873, 0x816F, 0x4CFD,
+ 0x8170, 0x080A, 0x8171, 0x1872, 0x8173, 0x4CFE, 0x8174, 0x1876,
+ 0x8178, 0x0BCE, 0x8179, 0x0DF2, 0x817A, 0x0AA5, 0x817F, 0x0B3C,
+ 0x8180, 0x187A, 0x8181, 0x3AB7, 0x8182, 0x187B, 0x8183, 0x1877,
+ 0x8184, 0x3AB8, 0x8185, 0x4804, 0x8188, 0x1878, 0x818A, 0x1879,
+ 0x818B, 0x4CFF, 0x818F, 0x07E3, 0x8190, 0x4D00, 0x8193, 0x1881,
+ 0x8195, 0x187D, 0x8198, 0x4806, 0x819A, 0x0DD8, 0x819B, 0x4D01,
+ 0x819C, 0x0E9A, 0x819D, 0x0D9A, 0x819E, 0x4D02, 0x81A0, 0x187C,
+ 0x81A3, 0x187F, 0x81A4, 0x187E, 0x81A8, 0x0E72, 0x81A9, 0x1882,
+ 0x81B0, 0x1883, 0x81B2, 0x4807, 0x81B3, 0x0AB9, 0x81B4, 0x3AB9,
+ 0x81B5, 0x1884, 0x81B8, 0x1886, 0x81BA, 0x188A, 0x81BB, 0x42A1,
+ 0x81BD, 0x1887, 0x81BE, 0x1885, 0x81BF, 0x0CF5, 0x81C0, 0x1888,
+ 0x81C1, 0x4808, 0x81C2, 0x1889, 0x81C3, 0x4809, 0x81C6, 0x0532,
+ 0x81C8, 0x1890, 0x81C9, 0x188B, 0x81CA, 0x42A2, 0x81CB, 0x4D03,
+ 0x81CD, 0x188C, 0x81CF, 0x3ABA, 0x81D1, 0x188D, 0x81D3, 0x0B01,
+ 0x81D5, 0x4D04, 0x81D6, 0x480A, 0x81D7, 0x42A3, 0x81D8, 0x188F,
+ 0x81D9, 0x188E, 0x81DA, 0x1891, 0x81DB, 0x480B, 0x81DD, 0x4D05,
+ 0x81DE, 0x4D06, 0x81DF, 0x1892, 0x81E0, 0x1893, 0x81E1, 0x4D07,
+ 0x81E3, 0x0A09, 0x81E4, 0x480D, 0x81E5, 0x0569, 0x81E7, 0x1894,
+ 0x81E8, 0x0F9F, 0x81EA, 0x08D7, 0x81EC, 0x480F, 0x81ED, 0x0937,
+ 0x81EF, 0x4D08, 0x81F3, 0x08B8, 0x81F4, 0x0B95, 0x81F6, 0x4D09,
+ 0x81F9, 0x3ABB, 0x81FA, 0x1895, 0x81FB, 0x1896, 0x81FC, 0x04D3,
+ 0x81FD, 0x4810, 0x81FE, 0x1897, 0x81FF, 0x4811, 0x8200, 0x4D0A,
+ 0x8201, 0x1898, 0x8202, 0x1899, 0x8203, 0x3ABC, 0x8204, 0x4813,
+ 0x8205, 0x189A, 0x8207, 0x189B, 0x8208, 0x06B5, 0x8209, 0x13AF,
+ 0x820A, 0x189C, 0x820B, 0x4D0B, 0x820C, 0x0A89, 0x820D, 0x189D,
+ 0x820E, 0x08F7, 0x8210, 0x189E, 0x8212, 0x1009, 0x8213, 0x4D0C,
+ 0x8214, 0x4D0D, 0x8216, 0x189F, 0x8217, 0x0E2E, 0x8218, 0x0618,
+ 0x8219, 0x4815, 0x821A, 0x4D0E, 0x821B, 0x0AA6, 0x821C, 0x0962,
+ 0x821E, 0x0DE3, 0x821F, 0x0938, 0x8221, 0x3ABD, 0x8222, 0x4816,
+ 0x8229, 0x18A0, 0x822A, 0x07E4, 0x822B, 0x18A1, 0x822C, 0x0D60,
+ 0x822E, 0x18AF, 0x8232, 0x3ABE, 0x8233, 0x18A3, 0x8234, 0x3ABF,
+ 0x8235, 0x0B29, 0x8236, 0x0D2B, 0x8237, 0x0773, 0x8238, 0x18A2,
+ 0x8239, 0x0AA7, 0x823A, 0x4D0F, 0x823C, 0x4818, 0x8240, 0x18A4,
+ 0x8244, 0x4D10, 0x8245, 0x481A, 0x8246, 0x3AC0, 0x8247, 0x0C16,
+ 0x8249, 0x4819, 0x824B, 0x3AC1, 0x824F, 0x3AC2, 0x8257, 0x481E,
+ 0x8258, 0x18A6, 0x8259, 0x18A5, 0x825A, 0x18A8, 0x825C, 0x4820,
+ 0x825D, 0x18A7, 0x825F, 0x18A9, 0x8260, 0x42A5, 0x8262, 0x18AB,
+ 0x8263, 0x4821, 0x8264, 0x18AA, 0x8266, 0x060B, 0x8268, 0x18AC,
+ 0x826A, 0x18AD, 0x826B, 0x18AE, 0x826D, 0x4D11, 0x826E, 0x0821,
+ 0x826F, 0x0F91, 0x8271, 0x18B0, 0x8272, 0x09ED, 0x8274, 0x42A6,
+ 0x8276, 0x0512, 0x8277, 0x18B1, 0x8278, 0x18B2, 0x8279, 0x3775,
+ 0x827D, 0x4824, 0x827E, 0x18B3, 0x827F, 0x4825, 0x8283, 0x4826,
+ 0x8284, 0x4D12, 0x8289, 0x4D13, 0x828A, 0x4827, 0x828B, 0x04B6,
+ 0x828D, 0x18B4, 0x828E, 0x3AC3, 0x8291, 0x4D14, 0x8292, 0x18B5,
+ 0x8293, 0x4828, 0x8299, 0x0DD9, 0x829D, 0x08F3, 0x829F, 0x18B7,
+ 0x82A1, 0x42A8, 0x82A3, 0x42A9, 0x82A4, 0x42AA, 0x82A5, 0x0587,
+ 0x82A6, 0x0476, 0x82A7, 0x4829, 0x82A8, 0x482A, 0x82A9, 0x42AB,
+ 0x82AA, 0x4D15, 0x82AB, 0x18B6, 0x82AC, 0x18B9, 0x82AD, 0x0D04,
+ 0x82AE, 0x3AC4, 0x82AF, 0x0A0A, 0x82B0, 0x4D16, 0x82B1, 0x0556,
+ 0x82B2, 0x482B, 0x82B3, 0x0E55, 0x82B4, 0x482C, 0x82B7, 0x3AC5,
+ 0x82B8, 0x0733, 0x82B9, 0x06D4, 0x82BA, 0x482D, 0x82BB, 0x18B8,
+ 0x82BC, 0x482E, 0x82BD, 0x056A, 0x82BE, 0x3AC6, 0x82BF, 0x42AC,
+ 0x82C5, 0x05DF, 0x82C6, 0x3AC7, 0x82D0, 0x4D17, 0x82D1, 0x0513,
+ 0x82D2, 0x18BD, 0x82D3, 0x0FB2, 0x82D4, 0x0B3D, 0x82D5, 0x42AD,
+ 0x82D7, 0x0DB6, 0x82D9, 0x18C9, 0x82DB, 0x0557, 0x82DC, 0x18C7,
+ 0x82DE, 0x18C5, 0x82DF, 0x18BC, 0x82E1, 0x18BA, 0x82E2, 0x482F,
+ 0x82E3, 0x18BB, 0x82E5, 0x090F, 0x82E6, 0x06E4, 0x82E7, 0x0BB5,
+ 0x82E8, 0x4830, 0x82EA, 0x4D18, 0x82EB, 0x0CA9, 0x82EF, 0x4D19,
+ 0x82F1, 0x04F3, 0x82F3, 0x18BF, 0x82F4, 0x18BE, 0x82F6, 0x4D1A,
+ 0x82F7, 0x4831, 0x82F9, 0x18C4, 0x82FA, 0x18C0, 0x82FB, 0x18C3,
+ 0x82FD, 0x42AE, 0x82FE, 0x3AC8, 0x8300, 0x42AF, 0x8301, 0x2198,
+ 0x8302, 0x0EDC, 0x8303, 0x18C2, 0x8304, 0x0558, 0x8305, 0x05DB,
+ 0x8306, 0x18C6, 0x8307, 0x4832, 0x8308, 0x4833, 0x8309, 0x18C8,
+ 0x830C, 0x4834, 0x830E, 0x072A, 0x8316, 0x18CC, 0x8317, 0x18D5,
+ 0x8318, 0x18D6, 0x831B, 0x4836, 0x831C, 0x046F, 0x831D, 0x4837,
+ 0x8322, 0x42B0, 0x8323, 0x18DD, 0x8328, 0x04B5, 0x832B, 0x18D4,
+ 0x832D, 0x42B1, 0x832F, 0x18D3, 0x8330, 0x4838, 0x8331, 0x18CE,
+ 0x8332, 0x18CD, 0x8334, 0x18CB, 0x8335, 0x18CA, 0x8336, 0x0BA1,
+ 0x8338, 0x0B5B, 0x8339, 0x18D0, 0x833A, 0x42B2, 0x833C, 0x4839,
+ 0x8340, 0x18CF, 0x8343, 0x3AC9, 0x8344, 0x483A, 0x8345, 0x18D2,
+ 0x8346, 0x1DF8, 0x8347, 0x42B3, 0x8349, 0x0AF2, 0x834A, 0x072B,
+ 0x834F, 0x04E3, 0x8350, 0x18D1, 0x8351, 0x3ACA, 0x8352, 0x07E5,
+ 0x8354, 0x4835, 0x8355, 0x3ACB, 0x8356, 0x4D1B, 0x8357, 0x483B,
+ 0x8358, 0x0AF3, 0x835A, 0x377A, 0x8362, 0x2199, 0x8363, 0x456F,
+ 0x8373, 0x18E3, 0x8375, 0x18E4, 0x8377, 0x0559, 0x8378, 0x4D1C,
+ 0x837B, 0x052E, 0x837C, 0x18E1, 0x837D, 0x42B4, 0x837F, 0x219A,
+ 0x8385, 0x18D7, 0x8386, 0x3ACC, 0x8387, 0x18DF, 0x8389, 0x18E6,
+ 0x838A, 0x18E0, 0x838D, 0x3ACD, 0x838E, 0x18DE, 0x8392, 0x3ACE,
+ 0x8393, 0x18C1, 0x8394, 0x483F, 0x8395, 0x4840, 0x8396, 0x18DC,
+ 0x8398, 0x3ACF, 0x839A, 0x18D8, 0x839B, 0x4841, 0x839D, 0x4842,
+ 0x839E, 0x060C, 0x839F, 0x18DA, 0x83A0, 0x18E5, 0x83A2, 0x18DB,
+ 0x83A7, 0x42B5, 0x83A8, 0x18E7, 0x83A9, 0x3AD0, 0x83AA, 0x18D9,
+ 0x83AB, 0x0D32, 0x83B1, 0x0F53, 0x83B5, 0x18E2, 0x83BD, 0x18F8,
+ 0x83BF, 0x3AD1, 0x83C0, 0x3AD2, 0x83C1, 0x18F0, 0x83C5, 0x0A41,
+ 0x83C7, 0x219B, 0x83C9, 0x4843, 0x83CA, 0x0660, 0x83CC, 0x06D5,
+ 0x83CE, 0x18EB, 0x83CF, 0x42B6, 0x83D0, 0x4844, 0x83D1, 0x42B7,
+ 0x83D3, 0x055B, 0x83D4, 0x4845, 0x83D6, 0x09BC, 0x83D8, 0x18EE,
+ 0x83DC, 0x084A, 0x83DD, 0x4846, 0x83DF, 0x0C4B, 0x83E0, 0x18F3,
+ 0x83E1, 0x42B8, 0x83E5, 0x4847, 0x83E9, 0x0E3E, 0x83EA, 0x3AD3,
+ 0x83EB, 0x18EA, 0x83EF, 0x055A, 0x83F0, 0x078A, 0x83F1, 0x0D9B,
+ 0x83F2, 0x18F4, 0x83F4, 0x18E8, 0x83F6, 0x219C, 0x83F7, 0x18F1,
+ 0x83F8, 0x4D1D, 0x83F9, 0x4848, 0x83FB, 0x18FB, 0x83FC, 0x4D1E,
+ 0x83FD, 0x18EC, 0x8401, 0x42B9, 0x8403, 0x18ED, 0x8404, 0x0C92,
+ 0x8406, 0x42BA, 0x8407, 0x18F2, 0x840A, 0x1E7F, 0x840B, 0x18EF,
+ 0x840C, 0x0E56, 0x840D, 0x18F5, 0x840E, 0x04A4, 0x840F, 0x3AD4,
+ 0x8411, 0x3AD5, 0x8413, 0x18E9, 0x8415, 0x4849, 0x8417, 0x484B,
+ 0x8420, 0x18F7, 0x8422, 0x18F6, 0x8429, 0x0D21, 0x842A, 0x18FD,
+ 0x842C, 0x1908, 0x8431, 0x05DC, 0x8435, 0x190B, 0x8438, 0x18F9,
+ 0x8439, 0x484C, 0x843C, 0x18FE, 0x843D, 0x0F58, 0x8446, 0x1907,
+ 0x8448, 0x219D, 0x8449, 0x0F3F, 0x844A, 0x3AD6, 0x844E, 0x0F72,
+ 0x844F, 0x484D, 0x8451, 0x484E, 0x8452, 0x484F, 0x8457, 0x0BB6,
+ 0x8458, 0x4D1F, 0x8459, 0x4850, 0x845A, 0x4851, 0x845B, 0x05C9,
+ 0x845C, 0x4852, 0x845F, 0x42BB, 0x8461, 0x0DE4, 0x8462, 0x190D,
+ 0x8463, 0x0C79, 0x8465, 0x4854, 0x8466, 0x0475, 0x8469, 0x1906,
+ 0x846B, 0x1902, 0x846C, 0x0AF4, 0x846D, 0x18FC, 0x846E, 0x1904,
+ 0x846F, 0x1909, 0x8470, 0x42BC, 0x8471, 0x0CE2, 0x8473, 0x42BD,
+ 0x8475, 0x046E, 0x8476, 0x3AD7, 0x8477, 0x1901, 0x8478, 0x4855,
+ 0x8479, 0x190A, 0x847A, 0x0DEA, 0x847C, 0x4856, 0x8481, 0x4857,
+ 0x8482, 0x1905, 0x8484, 0x1900, 0x8485, 0x42BE, 0x848B, 0x09BD,
+ 0x8490, 0x0939, 0x8493, 0x4D20, 0x8494, 0x08D8, 0x8497, 0x4859,
+ 0x8499, 0x0EE4, 0x849C, 0x0DB9, 0x849E, 0x42BF, 0x849F, 0x1910,
+ 0x84A1, 0x1919, 0x84A6, 0x485A, 0x84A8, 0x3AD8, 0x84AD, 0x1903,
+ 0x84AF, 0x3AD9, 0x84B1, 0x4D21, 0x84B2, 0x05D5, 0x84B4, 0x219E,
+ 0x84B8, 0x09E0, 0x84B9, 0x190E, 0x84BA, 0x42C0, 0x84BB, 0x1913,
+ 0x84BC, 0x0AF5, 0x84BD, 0x4D22, 0x84BE, 0x485B, 0x84BF, 0x190F,
+ 0x84C0, 0x3ADA, 0x84C1, 0x1916, 0x84C2, 0x3ADB, 0x84C4, 0x0B9D,
+ 0x84C6, 0x1917, 0x84C9, 0x0F40, 0x84CA, 0x190C, 0x84CB, 0x0596,
+ 0x84CD, 0x1912, 0x84CE, 0x485D, 0x84CF, 0x485E, 0x84D0, 0x1915,
+ 0x84D1, 0x0EB8, 0x84D3, 0x485F, 0x84D6, 0x1918, 0x84D9, 0x1911,
+ 0x84DA, 0x1914, 0x84DC, 0x20AB, 0x84E7, 0x4861, 0x84EA, 0x4862,
+ 0x84EC, 0x0E57, 0x84EE, 0x0FC7, 0x84EF, 0x4863, 0x84F0, 0x3ADC,
+ 0x84F1, 0x4864, 0x84F4, 0x191C, 0x84FA, 0x4865, 0x84FB, 0x4D23,
+ 0x84FC, 0x1923, 0x84FD, 0x3ADD, 0x84FF, 0x191B, 0x8500, 0x08EF,
+ 0x8506, 0x18FA, 0x850C, 0x3ADE, 0x8511, 0x0E1E, 0x8513, 0x0EAE,
+ 0x8514, 0x1922, 0x8515, 0x1921, 0x8517, 0x191D, 0x8518, 0x191E,
+ 0x851A, 0x04D8, 0x851B, 0x4866, 0x851E, 0x42C3, 0x851F, 0x1920,
+ 0x8521, 0x191A, 0x8523, 0x1E1A, 0x8524, 0x4867, 0x8525, 0x4868,
+ 0x8526, 0x0BF1, 0x852B, 0x4869, 0x852C, 0x191F, 0x852D, 0x04C2,
+ 0x852F, 0x42C4, 0x8532, 0x42C2, 0x8534, 0x3ADF, 0x8535, 0x0B02,
+ 0x853D, 0x0E13, 0x853E, 0x1EB5, 0x8540, 0x1924, 0x8541, 0x1928,
+ 0x8543, 0x0D6D, 0x8546, 0x4D24, 0x8548, 0x1927, 0x8549, 0x09BE,
+ 0x854A, 0x08F5, 0x854B, 0x192A, 0x854E, 0x06B6, 0x854F, 0x486A,
+ 0x8551, 0x486D, 0x8553, 0x219F, 0x8555, 0x192B, 0x8556, 0x4D25,
+ 0x8557, 0x0DEB, 0x8558, 0x1926, 0x8559, 0x21A0, 0x855A, 0x18FF,
+ 0x855D, 0x4D26, 0x855E, 0x3AE0, 0x8561, 0x486E, 0x8562, 0x486F,
+ 0x8563, 0x1925, 0x8564, 0x42C5, 0x8568, 0x0FF5, 0x8569, 0x0C7A,
+ 0x856A, 0x0DE5, 0x856B, 0x21A1, 0x856D, 0x1932, 0x856F, 0x486B,
+ 0x8577, 0x1938, 0x857A, 0x42C6, 0x857B, 0x4871, 0x857D, 0x4872,
+ 0x857E, 0x1939, 0x857F, 0x4873, 0x8580, 0x192C, 0x8581, 0x4874,
+ 0x8584, 0x0D2C, 0x8585, 0x4D27, 0x8586, 0x4875, 0x8587, 0x1936,
+ 0x8588, 0x192E, 0x858A, 0x1930, 0x858C, 0x42C7, 0x858F, 0x3AE1,
+ 0x8590, 0x193A, 0x8591, 0x192F, 0x8593, 0x4876, 0x8594, 0x1933,
+ 0x8597, 0x0514, 0x8598, 0x4D28, 0x8599, 0x0CBD, 0x859B, 0x1934,
+ 0x859C, 0x1937, 0x859D, 0x4877, 0x859F, 0x4878, 0x85A2, 0x42C8,
+ 0x85A4, 0x192D, 0x85A6, 0x0AA8, 0x85A8, 0x1931, 0x85A9, 0x0875,
+ 0x85AA, 0x0A0B, 0x85AB, 0x0706, 0x85AC, 0x0F00, 0x85AD, 0x3AE4,
+ 0x85AE, 0x0F05, 0x85AF, 0x097C, 0x85B0, 0x21A3, 0x85B7, 0x3AE2,
+ 0x85B9, 0x193E, 0x85BA, 0x193C, 0x85BC, 0x487C, 0x85C1, 0x0FF4,
+ 0x85C7, 0x487D, 0x85C9, 0x193B, 0x85CA, 0x487E, 0x85CB, 0x42C9,
+ 0x85CD, 0x0F5F, 0x85CE, 0x3AE3, 0x85CF, 0x193D, 0x85D0, 0x193F,
+ 0x85D5, 0x1940, 0x85D8, 0x487F, 0x85D9, 0x4880, 0x85DC, 0x1943,
+ 0x85DD, 0x1941, 0x85DF, 0x4881, 0x85E1, 0x4882, 0x85E4, 0x0C7B,
+ 0x85E5, 0x1942, 0x85E6, 0x4883, 0x85E9, 0x0D61, 0x85EA, 0x1935,
+ 0x85ED, 0x42CA, 0x85F4, 0x3780, 0x85F6, 0x4884, 0x85F7, 0x097D,
+ 0x85F9, 0x1944, 0x85FA, 0x1949, 0x85FB, 0x0AF6, 0x85FE, 0x1948,
+ 0x85FF, 0x42CB, 0x8600, 0x4885, 0x8602, 0x1929, 0x8604, 0x42CC,
+ 0x8605, 0x42CD, 0x8606, 0x194A, 0x8607, 0x0ACB, 0x860A, 0x1945,
+ 0x860B, 0x1947, 0x8610, 0x42CE, 0x8611, 0x4886, 0x8612, 0x3AE5,
+ 0x8613, 0x1946, 0x8616, 0x14D0, 0x8617, 0x14C1, 0x8618, 0x42D0,
+ 0x861A, 0x194C, 0x861E, 0x4887, 0x8621, 0x4888, 0x8622, 0x194B,
+ 0x8624, 0x4889, 0x8627, 0x488A, 0x8629, 0x3AE6, 0x862D, 0x0F60,
+ 0x862F, 0x16B1, 0x8630, 0x194D, 0x8638, 0x42D1, 0x8639, 0x488C,
+ 0x863C, 0x488D, 0x863F, 0x194E, 0x8640, 0x488F, 0x8641, 0x41B8,
+ 0x8642, 0x4D29, 0x8646, 0x4D2A, 0x864D, 0x194F, 0x864E, 0x078B,
+ 0x8650, 0x066E, 0x8652, 0x3AE7, 0x8653, 0x4890, 0x8654, 0x1951,
+ 0x8655, 0x1094, 0x8656, 0x4891, 0x8657, 0x42D2, 0x865A, 0x068F,
+ 0x865B, 0x3418, 0x865C, 0x0F82, 0x865E, 0x06EB, 0x865F, 0x1952,
+ 0x8662, 0x42D3, 0x8663, 0x3AE8, 0x8667, 0x1953, 0x866B, 0x0BAC,
+ 0x866C, 0x3AE9, 0x866F, 0x3AEA, 0x8671, 0x1954, 0x8675, 0x42D5,
+ 0x8677, 0x4892, 0x8679, 0x0CD2, 0x867A, 0x3AEB, 0x867B, 0x047E,
+ 0x867D, 0x3786, 0x8687, 0x4893, 0x8689, 0x4894, 0x868A, 0x0563,
+ 0x868B, 0x1959, 0x868C, 0x195A, 0x868D, 0x3AEC, 0x8691, 0x3AED,
+ 0x8693, 0x1955, 0x8695, 0x088B, 0x8698, 0x3AEE, 0x869C, 0x4895,
+ 0x869D, 0x4896, 0x86A3, 0x1956, 0x86A4, 0x0CF8, 0x86A7, 0x3AEF,
+ 0x86A8, 0x3AF0, 0x86A9, 0x1957, 0x86AA, 0x1958, 0x86AB, 0x1962,
+ 0x86AF, 0x195C, 0x86B0, 0x195F, 0x86B1, 0x4897, 0x86B3, 0x4898,
+ 0x86B6, 0x195B, 0x86B8, 0x42D6, 0x86C0, 0x4D2B, 0x86C1, 0x4899,
+ 0x86C3, 0x489A, 0x86C4, 0x195D, 0x86C6, 0x195E, 0x86C7, 0x0904,
+ 0x86C9, 0x1960, 0x86CB, 0x0B7F, 0x86CD, 0x072C, 0x86CE, 0x05A0,
+ 0x86D1, 0x489B, 0x86D4, 0x1963, 0x86D5, 0x489C, 0x86D7, 0x489D,
+ 0x86D9, 0x059D, 0x86DB, 0x1968, 0x86DE, 0x1964, 0x86DF, 0x1967,
+ 0x86E3, 0x489E, 0x86E4, 0x0D4E, 0x86E6, 0x489F, 0x86E9, 0x1965,
+ 0x86EC, 0x1966, 0x86ED, 0x0DBA, 0x86EE, 0x0D6E, 0x86EF, 0x1969,
+ 0x86F8, 0x0B5D, 0x86F9, 0x1973, 0x86FA, 0x3AF1, 0x86FB, 0x196F,
+ 0x86FC, 0x42D7, 0x86FD, 0x3AF2, 0x86FE, 0x056B, 0x8700, 0x196D,
+ 0x8702, 0x0E58, 0x8703, 0x196E, 0x8705, 0x48A1, 0x8706, 0x196B,
+ 0x8707, 0x48A2, 0x8708, 0x196C, 0x8709, 0x1971, 0x870A, 0x1974,
+ 0x870B, 0x3AF3, 0x870D, 0x1972, 0x870E, 0x48A3, 0x8710, 0x48A4,
+ 0x8711, 0x1970, 0x8712, 0x196A, 0x8713, 0x3AF4, 0x8714, 0x4D2C,
+ 0x8718, 0x0B96, 0x8719, 0x3AF5, 0x871A, 0x197B, 0x871C, 0x0EB6,
+ 0x871E, 0x3AF6, 0x871F, 0x48A5, 0x8721, 0x48A6, 0x8722, 0x4D2D,
+ 0x8723, 0x48A7, 0x8725, 0x1979, 0x8728, 0x3AF7, 0x8729, 0x197A,
+ 0x872E, 0x4D2E, 0x8731, 0x48A8, 0x8734, 0x1975, 0x8737, 0x1977,
+ 0x8739, 0x4D2F, 0x873A, 0x48A9, 0x873B, 0x1978, 0x873E, 0x3AF8,
+ 0x873F, 0x1976, 0x8740, 0x48AA, 0x8743, 0x48AB, 0x8749, 0x0A8A,
+ 0x874B, 0x0FDF, 0x874C, 0x197F, 0x874E, 0x1980, 0x8751, 0x48AC,
+ 0x8753, 0x1986, 0x8755, 0x09F0, 0x8757, 0x1982, 0x8758, 0x48AD,
+ 0x8759, 0x1985, 0x875D, 0x4D30, 0x875F, 0x197D, 0x8760, 0x197C,
+ 0x8763, 0x1987, 0x8764, 0x48AE, 0x8765, 0x48AF, 0x8766, 0x055C,
+ 0x8768, 0x1983, 0x876A, 0x1988, 0x876E, 0x1984, 0x8771, 0x3AF9,
+ 0x8772, 0x48B0, 0x8774, 0x1981, 0x8776, 0x0BCF, 0x8778, 0x197E,
+ 0x877B, 0x4D31, 0x877C, 0x48B1, 0x877F, 0x0D1E, 0x8782, 0x198C,
+ 0x8787, 0x42D8, 0x8788, 0x3AFA, 0x8789, 0x48B5, 0x878B, 0x48B6,
+ 0x878C, 0x4D32, 0x878D, 0x0F25, 0x878E, 0x4D33, 0x8793, 0x48B7,
+ 0x8797, 0x4D34, 0x8798, 0x4D35, 0x8799, 0x3AFB, 0x879E, 0x4D36,
+ 0x879F, 0x198B, 0x87A0, 0x48B8, 0x87A2, 0x198A, 0x87A3, 0x4D37,
+ 0x87A7, 0x48B4, 0x87AB, 0x1993, 0x87AC, 0x3AFC, 0x87AD, 0x3AFD,
+ 0x87AE, 0x4D38, 0x87AF, 0x198D, 0x87B3, 0x1995, 0x87B5, 0x3AFE,
+ 0x87BA, 0x0F50, 0x87BB, 0x1998, 0x87BD, 0x198F, 0x87BE, 0x48BB,
+ 0x87BF, 0x4D39, 0x87C0, 0x1990, 0x87C1, 0x48BD, 0x87C4, 0x1994,
+ 0x87C6, 0x1997, 0x87C7, 0x1996, 0x87C9, 0x4D3A, 0x87CB, 0x198E,
+ 0x87CE, 0x48BE, 0x87D0, 0x1991, 0x87D2, 0x19A2, 0x87D6, 0x3AFF,
+ 0x87DA, 0x4D3B, 0x87DF, 0x48BF, 0x87E0, 0x199B, 0x87E3, 0x48C1,
+ 0x87E5, 0x48C2, 0x87E6, 0x48C3, 0x87EA, 0x48C4, 0x87EB, 0x3B00,
+ 0x87EC, 0x1E23, 0x87ED, 0x3B01, 0x87EF, 0x1999, 0x87F2, 0x199A,
+ 0x87F5, 0x3C3D, 0x87F6, 0x199F, 0x87F7, 0x19A0, 0x87F9, 0x0588,
+ 0x87FB, 0x065C, 0x87FE, 0x199E, 0x8801, 0x3B02, 0x8803, 0x4F58,
+ 0x8805, 0x1989, 0x8806, 0x3B04, 0x8807, 0x21A6, 0x880A, 0x42DA,
+ 0x880B, 0x3B05, 0x880D, 0x199D, 0x880E, 0x19A1, 0x880F, 0x199C,
+ 0x8810, 0x42DB, 0x8811, 0x19A3, 0x8813, 0x48C5, 0x8814, 0x3B06,
+ 0x8815, 0x19A5, 0x8816, 0x19A4, 0x8818, 0x4D3C, 0x881B, 0x4D3D,
+ 0x881C, 0x3B07, 0x881F, 0x1E85, 0x8821, 0x19A7, 0x8822, 0x19A6,
+ 0x8823, 0x1961, 0x8827, 0x19AB, 0x8828, 0x48C6, 0x882D, 0x4D3E,
+ 0x882E, 0x48C7, 0x8831, 0x19A8, 0x8832, 0x48C8, 0x8836, 0x19A9,
+ 0x8839, 0x19AA, 0x883A, 0x4D3F, 0x883B, 0x19AC, 0x883C, 0x48C9,
+ 0x8840, 0x0742, 0x8842, 0x19AE, 0x8844, 0x19AD, 0x8845, 0x4D40,
+ 0x8846, 0x093A, 0x884A, 0x48CB, 0x884B, 0x4D41, 0x884C, 0x07E6,
+ 0x884D, 0x1524, 0x884E, 0x4D42, 0x8852, 0x19AF, 0x8853, 0x095B,
+ 0x8855, 0x4D43, 0x8856, 0x3B08, 0x8857, 0x0597, 0x8858, 0x48CC,
+ 0x8859, 0x19B0, 0x885A, 0x4D44, 0x885B, 0x04F4, 0x885D, 0x09BF,
+ 0x885E, 0x19B1, 0x885F, 0x3B09, 0x8861, 0x07E7, 0x8862, 0x19B2,
+ 0x8863, 0x04A5, 0x8864, 0x3B0A, 0x8868, 0x0DAF, 0x8869, 0x48CF,
+ 0x886B, 0x19B3, 0x886E, 0x4D45, 0x886F, 0x48D1, 0x8870, 0x0A30,
+ 0x8872, 0x19BA, 0x8875, 0x19B7, 0x8877, 0x0BAD, 0x887D, 0x19B8,
+ 0x887E, 0x19B5, 0x887F, 0x06D6, 0x8881, 0x19B4, 0x8882, 0x19BB,
+ 0x8888, 0x070C, 0x888B, 0x0B3E, 0x888D, 0x19C1, 0x8892, 0x19BD,
+ 0x8896, 0x0B15, 0x8897, 0x19BC, 0x8898, 0x3B0B, 0x8899, 0x19BF,
+ 0x889A, 0x4D46, 0x889B, 0x4D47, 0x889C, 0x4D48, 0x889E, 0x19B6,
+ 0x88A0, 0x48D2, 0x88A2, 0x19C0, 0x88A4, 0x19C2, 0x88AA, 0x3B0C,
+ 0x88AB, 0x0D83, 0x88AE, 0x19BE, 0x88B0, 0x19C3, 0x88B1, 0x19C5,
+ 0x88B4, 0x0787, 0x88B5, 0x19B9, 0x88B7, 0x0485, 0x88BC, 0x48D3,
+ 0x88BD, 0x3B0D, 0x88BE, 0x3B0E, 0x88BF, 0x19C4, 0x88C0, 0x48D4,
+ 0x88C1, 0x084B, 0x88C2, 0x0FBE, 0x88C3, 0x19C6, 0x88C4, 0x19C7,
+ 0x88C5, 0x0AF7, 0x88C6, 0x3789, 0x88CA, 0x3B0F, 0x88CD, 0x4D49,
+ 0x88CE, 0x42DC, 0x88CF, 0x0F6A, 0x88D1, 0x48D6, 0x88D2, 0x3B10,
+ 0x88D3, 0x48D7, 0x88D4, 0x19C8, 0x88D5, 0x0F1F, 0x88D8, 0x19C9,
+ 0x88D9, 0x19CA, 0x88DB, 0x3B11, 0x88DC, 0x0E34, 0x88DD, 0x19CB,
+ 0x88DF, 0x0830, 0x88E0, 0x4D4A, 0x88E1, 0x0F6B, 0x88E8, 0x19D0,
+ 0x88EF, 0x4D4B, 0x88F0, 0x3B12, 0x88F1, 0x3B13, 0x88F2, 0x19D1,
+ 0x88F3, 0x09C0, 0x88F4, 0x19CF, 0x88F5, 0x21A7, 0x88F8, 0x0F51,
+ 0x88F9, 0x19CC, 0x88FC, 0x19CE, 0x88FD, 0x0A61, 0x88FE, 0x0A44,
+ 0x8901, 0x48D9, 0x8902, 0x19CD, 0x8904, 0x19D2, 0x8906, 0x3B14,
+ 0x8907, 0x0DF3, 0x890A, 0x19D4, 0x890C, 0x19D3, 0x890E, 0x4D4C,
+ 0x890F, 0x4D4D, 0x8910, 0x05CA, 0x8912, 0x0E59, 0x8913, 0x19D5,
+ 0x8918, 0x3B15, 0x8919, 0x3B16, 0x891A, 0x3B17, 0x891C, 0x20A8,
+ 0x891D, 0x19E1, 0x891E, 0x19D7, 0x8925, 0x19D8, 0x8926, 0x4D4E,
+ 0x8927, 0x3B18, 0x892A, 0x19D9, 0x892B, 0x19DA, 0x8930, 0x3B19,
+ 0x8932, 0x42DE, 0x8935, 0x4D4F, 0x8936, 0x19DE, 0x8937, 0x48DB,
+ 0x8938, 0x19DF, 0x8939, 0x42DF, 0x893B, 0x19DD, 0x893E, 0x3B1A,
+ 0x8940, 0x42E0, 0x8941, 0x19DB, 0x8942, 0x48DD, 0x8943, 0x19D6,
+ 0x8944, 0x19DC, 0x8945, 0x48DE, 0x8949, 0x48DF, 0x894C, 0x19E0,
+ 0x894D, 0x1BD0, 0x8956, 0x0528, 0x895A, 0x4D50, 0x895C, 0x4D51,
+ 0x895E, 0x19E3, 0x895F, 0x06D7, 0x8960, 0x19E2, 0x8962, 0x48E1,
+ 0x8964, 0x19E5, 0x8966, 0x19E4, 0x896A, 0x19E7, 0x896B, 0x4D52,
+ 0x896D, 0x19E6, 0x896F, 0x19E8, 0x8970, 0x4D53, 0x8972, 0x093B,
+ 0x8974, 0x19E9, 0x8977, 0x19EA, 0x897B, 0x3B1B, 0x897C, 0x4D54,
+ 0x897E, 0x19EB, 0x897F, 0x0A62, 0x8980, 0x362E, 0x8981, 0x0F41,
+ 0x8983, 0x19EC, 0x8986, 0x0DF4, 0x8987, 0x0CFC, 0x8988, 0x19ED,
+ 0x8989, 0x48E2, 0x898A, 0x19EE, 0x898B, 0x075F, 0x898F, 0x0646,
+ 0x8990, 0x48E3, 0x8993, 0x19EF, 0x8994, 0x42E1, 0x8996, 0x08B9,
+ 0x8997, 0x0CF7, 0x8998, 0x19F0, 0x899A, 0x05AE, 0x899F, 0x48E4,
+ 0x89A1, 0x19F1, 0x89A5, 0x4D55, 0x89A6, 0x19F3, 0x89A7, 0x0F61,
+ 0x89A9, 0x19F2, 0x89AA, 0x0A0C, 0x89AC, 0x19F4, 0x89AF, 0x19F5,
+ 0x89B0, 0x48E5, 0x89B2, 0x19F6, 0x89B3, 0x060D, 0x89B5, 0x4D56,
+ 0x89B7, 0x48E6, 0x89BA, 0x19F7, 0x89BC, 0x4D57, 0x89BD, 0x19F8,
+ 0x89BF, 0x19F9, 0x89C0, 0x19FA, 0x89D2, 0x05AF, 0x89D4, 0x3B1C,
+ 0x89D5, 0x4D58, 0x89D6, 0x3B1D, 0x89D8, 0x48E7, 0x89DA, 0x19FB,
+ 0x89DC, 0x19FC, 0x89DD, 0x19FD, 0x89E3, 0x0572, 0x89E5, 0x3B1E,
+ 0x89E6, 0x09EE, 0x89E7, 0x19FE, 0x89EB, 0x48E8, 0x89F1, 0x3B1F,
+ 0x89F3, 0x48EA, 0x89F4, 0x19FF, 0x89F6, 0x42E2, 0x89F8, 0x1A00,
+ 0x89FD, 0x48EB, 0x89FF, 0x48EC, 0x8A00, 0x0774, 0x8A01, 0x35BC,
+ 0x8A02, 0x0C17, 0x8A03, 0x1A01, 0x8A07, 0x3B20, 0x8A08, 0x072D,
+ 0x8A0A, 0x0A1C, 0x8A0C, 0x1A04, 0x8A0E, 0x0C7C, 0x8A0F, 0x3B21,
+ 0x8A10, 0x1A03, 0x8A11, 0x48EE, 0x8A12, 0x21A8, 0x8A13, 0x0707,
+ 0x8A14, 0x48EF, 0x8A15, 0x3B22, 0x8A16, 0x1A02, 0x8A17, 0x0B57,
+ 0x8A18, 0x0647, 0x8A1B, 0x1A05, 0x8A1D, 0x1A06, 0x8A1F, 0x09C1,
+ 0x8A21, 0x48F1, 0x8A22, 0x3B23, 0x8A23, 0x0743, 0x8A25, 0x1A07,
+ 0x8A2A, 0x0E5A, 0x8A2D, 0x0A83, 0x8A31, 0x0690, 0x8A33, 0x0F01,
+ 0x8A34, 0x0ACC, 0x8A35, 0x48F2, 0x8A36, 0x1A08, 0x8A37, 0x21A9,
+ 0x8A3A, 0x0A0D, 0x8A3B, 0x0BAE, 0x8A3C, 0x09C2, 0x8A3E, 0x48F3,
+ 0x8A41, 0x1A09, 0x8A45, 0x48F4, 0x8A46, 0x1A0C, 0x8A47, 0x42E3,
+ 0x8A48, 0x1A0D, 0x8A49, 0x4D59, 0x8A4D, 0x48F5, 0x8A4E, 0x3B24,
+ 0x8A50, 0x082E, 0x8A51, 0x0B22, 0x8A52, 0x1A0B, 0x8A54, 0x09C3,
+ 0x8A55, 0x0DB0, 0x8A57, 0x4D5A, 0x8A58, 0x48F6, 0x8A5B, 0x1A0A,
+ 0x8A5D, 0x42E4, 0x8A5E, 0x08BA, 0x8A60, 0x04F5, 0x8A61, 0x42E5,
+ 0x8A62, 0x1A11, 0x8A63, 0x072E, 0x8A66, 0x08BC, 0x8A67, 0x4D5B,
+ 0x8A69, 0x08BB, 0x8A6B, 0x0FF3, 0x8A6C, 0x1A10, 0x8A6D, 0x1A0F,
+ 0x8A6E, 0x0AA9, 0x8A70, 0x0667, 0x8A71, 0x0FE9, 0x8A72, 0x0598,
+ 0x8A73, 0x09C4, 0x8A75, 0x42E6, 0x8A79, 0x21AA, 0x8A7C, 0x1A0E,
+ 0x8A7E, 0x4D5C, 0x8A7F, 0x3B25, 0x8A82, 0x1A13, 0x8A84, 0x1A14,
+ 0x8A85, 0x1A12, 0x8A86, 0x4D5D, 0x8A87, 0x078C, 0x8A89, 0x0F2A,
+ 0x8A8C, 0x08BD, 0x8A8D, 0x0CDD, 0x8A90, 0x48F8, 0x8A91, 0x1A17,
+ 0x8A93, 0x0A64, 0x8A95, 0x0B80, 0x8A96, 0x4D5E, 0x8A98, 0x0F20,
+ 0x8A9A, 0x1A1A, 0x8A9E, 0x07A0, 0x8AA0, 0x0A63, 0x8AA1, 0x1A16,
+ 0x8AA3, 0x1A1B, 0x8AA4, 0x07A1, 0x8AA5, 0x1A18, 0x8AA6, 0x1A19,
+ 0x8AA7, 0x21AB, 0x8AA8, 0x1A15, 0x8AAA, 0x3638, 0x8AAC, 0x0A86,
+ 0x8AAD, 0x0CA1, 0x8AAE, 0x48F7, 0x8AB0, 0x0B6D, 0x8AB2, 0x055D,
+ 0x8AB6, 0x4D5F, 0x8AB7, 0x48F9, 0x8AB9, 0x0D84, 0x8ABC, 0x065D,
+ 0x8ABE, 0x21AC, 0x8ABF, 0x0BD0, 0x8AC2, 0x1A1E, 0x8AC4, 0x1A1C,
+ 0x8AC7, 0x0B8A, 0x8AC9, 0x4D60, 0x8ACB, 0x0A65, 0x8ACC, 0x060E,
+ 0x8ACD, 0x1A1D, 0x8ACF, 0x0A21, 0x8AD0, 0x42E7, 0x8AD1, 0x4D61,
+ 0x8AD2, 0x0F92, 0x8AD6, 0x0FE6, 0x8AD7, 0x48FA, 0x8ADA, 0x1A1F,
+ 0x8ADB, 0x1A2A, 0x8ADC, 0x0BD1, 0x8ADD, 0x4D62, 0x8ADE, 0x1A29,
+ 0x8ADF, 0x21AD, 0x8AE0, 0x1A26, 0x8AE1, 0x1A2E, 0x8AE2, 0x1A27,
+ 0x8AE4, 0x1A23, 0x8AE6, 0x0C18, 0x8AE7, 0x1A22, 0x8AEB, 0x1A20,
+ 0x8AEC, 0x4D63, 0x8AED, 0x0F0B, 0x8AEE, 0x08BE, 0x8AF1, 0x1A24,
+ 0x8AF3, 0x1A21, 0x8AF4, 0x3B26, 0x8AF5, 0x4D64, 0x8AF6, 0x21AF,
+ 0x8AF7, 0x1A28, 0x8AF8, 0x097E, 0x8AFA, 0x0775, 0x8AFC, 0x48FB,
+ 0x8AFE, 0x0B5A, 0x8B00, 0x0E73, 0x8B01, 0x04FC, 0x8B02, 0x04A6,
+ 0x8B04, 0x0C7D, 0x8B05, 0x48FE, 0x8B06, 0x4D65, 0x8B07, 0x1A2C,
+ 0x8B0A, 0x48FD, 0x8B0C, 0x1A2B, 0x8B0D, 0x48FF, 0x8B0E, 0x0CBE,
+ 0x8B0F, 0x4D66, 0x8B10, 0x1A30, 0x8B11, 0x4D67, 0x8B14, 0x1A25,
+ 0x8B16, 0x1A2F, 0x8B17, 0x1A31, 0x8B19, 0x0760, 0x8B1A, 0x1A2D,
+ 0x8B1B, 0x07E8, 0x8B1C, 0x4900, 0x8B1D, 0x0901, 0x8B1F, 0x3B27,
+ 0x8B20, 0x1A32, 0x8B21, 0x0F42, 0x8B26, 0x1A35, 0x8B28, 0x1A38,
+ 0x8B2B, 0x1A36, 0x8B2C, 0x0DA7, 0x8B2D, 0x4901, 0x8B33, 0x1A33,
+ 0x8B37, 0x3B28, 0x8B39, 0x06D8, 0x8B3E, 0x1A37, 0x8B41, 0x1A39,
+ 0x8B43, 0x3B29, 0x8B44, 0x3B2A, 0x8B45, 0x4D68, 0x8B46, 0x42E8,
+ 0x8B49, 0x1A3D, 0x8B4C, 0x1A3A, 0x8B4E, 0x1A3C, 0x8B4F, 0x1A3B,
+ 0x8B51, 0x4903, 0x8B52, 0x4D69, 0x8B53, 0x21B0, 0x8B54, 0x3B2B,
+ 0x8B56, 0x1A3E, 0x8B58, 0x08DD, 0x8B59, 0x42E9, 0x8B5A, 0x1A40,
+ 0x8B5B, 0x1A3F, 0x8B5C, 0x0DDA, 0x8B5E, 0x4904, 0x8B5F, 0x1A42,
+ 0x8B66, 0x072F, 0x8B69, 0x42EA, 0x8B6B, 0x1A41, 0x8B6C, 0x1A43,
+ 0x8B6D, 0x4D6A, 0x8B6F, 0x1A44, 0x8B70, 0x065E, 0x8B71, 0x182E,
+ 0x8B72, 0x09E1, 0x8B74, 0x1A45, 0x8B76, 0x4905, 0x8B77, 0x07A2,
+ 0x8B78, 0x4D6B, 0x8B7C, 0x4D6C, 0x8B7D, 0x1A46, 0x8B7E, 0x4D6D,
+ 0x8B7F, 0x21B1, 0x8B80, 0x1A47, 0x8B81, 0x4906, 0x8B83, 0x088C,
+ 0x8B85, 0x4D6E, 0x8B8A, 0x13D3, 0x8B8B, 0x4907, 0x8B8C, 0x1A48,
+ 0x8B8E, 0x1A49, 0x8B90, 0x093C, 0x8B92, 0x1A4A, 0x8B93, 0x1A4B,
+ 0x8B94, 0x4908, 0x8B95, 0x4909, 0x8B96, 0x1A4C, 0x8B99, 0x1A4D,
+ 0x8B9A, 0x1A4E, 0x8B9C, 0x3B2C, 0x8B9D, 0x42EB, 0x8B9E, 0x3B2D,
+ 0x8B9F, 0x4D6F, 0x8C37, 0x0B69, 0x8C39, 0x490A, 0x8C3A, 0x1A4F,
+ 0x8C3D, 0x490C, 0x8C3F, 0x1A51, 0x8C41, 0x1A50, 0x8C45, 0x490F,
+ 0x8C46, 0x0C7E, 0x8C47, 0x3B2E, 0x8C48, 0x1A52, 0x8C49, 0x42EC,
+ 0x8C4A, 0x0E5B, 0x8C4B, 0x4D70, 0x8C4C, 0x1A53, 0x8C4E, 0x1A54,
+ 0x8C4F, 0x4910, 0x8C50, 0x1A55, 0x8C53, 0x4D71, 0x8C54, 0x3B2F,
+ 0x8C55, 0x1A56, 0x8C57, 0x4911, 0x8C5A, 0x0CB2, 0x8C61, 0x09C5,
+ 0x8C62, 0x1A57, 0x8C68, 0x42ED, 0x8C69, 0x4912, 0x8C6A, 0x07FD,
+ 0x8C6B, 0x1007, 0x8C6C, 0x1A58, 0x8C6D, 0x4913, 0x8C73, 0x3B30,
+ 0x8C78, 0x1A59, 0x8C79, 0x0DB1, 0x8C7A, 0x1A5A, 0x8C7B, 0x4D72,
+ 0x8C7C, 0x1A62, 0x8C82, 0x1A5B, 0x8C85, 0x1A5D, 0x8C89, 0x1A5C,
+ 0x8C8A, 0x1A5E, 0x8C8C, 0x0E74, 0x8C8D, 0x1A5F, 0x8C8E, 0x1A60,
+ 0x8C92, 0x4916, 0x8C93, 0x4915, 0x8C94, 0x1A61, 0x8C98, 0x1A63,
+ 0x8C99, 0x4917, 0x8C9B, 0x4919, 0x8C9D, 0x058B, 0x8C9E, 0x0C03,
+ 0x8C9F, 0x354C, 0x8CA0, 0x0DDB, 0x8CA1, 0x0852, 0x8CA2, 0x07E9,
+ 0x8CA4, 0x3B31, 0x8CA7, 0x0DC1, 0x8CA8, 0x055F, 0x8CA9, 0x0D62,
+ 0x8CAA, 0x1A66, 0x8CAB, 0x060F, 0x8CAC, 0x0A79, 0x8CAD, 0x1A65,
+ 0x8CAE, 0x1A6A, 0x8CAF, 0x0BB7, 0x8CB0, 0x0EEF, 0x8CB2, 0x1A68,
+ 0x8CB3, 0x1A69, 0x8CB4, 0x0648, 0x8CB6, 0x1A6B, 0x8CB7, 0x0D19,
+ 0x8CB8, 0x0B3F, 0x8CBA, 0x4D73, 0x8CBB, 0x0D85, 0x8CBC, 0x0C37,
+ 0x8CBD, 0x1A67, 0x8CBF, 0x0E75, 0x8CC0, 0x056C, 0x8CC1, 0x1A6D,
+ 0x8CC2, 0x0FCE, 0x8CC3, 0x0BDE, 0x8CC4, 0x0FEB, 0x8CC5, 0x4D74,
+ 0x8CC7, 0x08BF, 0x8CC8, 0x1A6C, 0x8CC9, 0x4D75, 0x8CCA, 0x0B11,
+ 0x8CCD, 0x1A7D, 0x8CCE, 0x0AAA, 0x8CD1, 0x0CD0, 0x8CD2, 0x4D76,
+ 0x8CD3, 0x0DC2, 0x8CD5, 0x491B, 0x8CD6, 0x491A, 0x8CD9, 0x3B32,
+ 0x8CDA, 0x1A70, 0x8CDB, 0x088D, 0x8CDC, 0x08C0, 0x8CDE, 0x09C6,
+ 0x8CE0, 0x0D1B, 0x8CE1, 0x3B33, 0x8CE2, 0x0761, 0x8CE3, 0x1A6F,
+ 0x8CE4, 0x1A6E, 0x8CE6, 0x0DDC, 0x8CEA, 0x08ED, 0x8CEC, 0x4D77,
+ 0x8CED, 0x0C4C, 0x8CF0, 0x21B2, 0x8CF1, 0x491D, 0x8CF4, 0x21B3,
+ 0x8CF5, 0x4D78, 0x8CF7, 0x4D79, 0x8CF8, 0x3B34, 0x8CFA, 0x1A72,
+ 0x8CFB, 0x1A73, 0x8CFC, 0x07EA, 0x8CFD, 0x1A71, 0x8CFE, 0x3B35,
+ 0x8D01, 0x4D7A, 0x8D03, 0x4D7B, 0x8D04, 0x1A74, 0x8D05, 0x1A75,
+ 0x8D07, 0x1A77, 0x8D08, 0x0B03, 0x8D09, 0x491F, 0x8D0A, 0x1A76,
+ 0x8D0B, 0x0622, 0x8D0D, 0x1A79, 0x8D0E, 0x4920, 0x8D0F, 0x1A78,
+ 0x8D10, 0x1A7A, 0x8D12, 0x21B4, 0x8D13, 0x1A7C, 0x8D14, 0x1A7E,
+ 0x8D16, 0x1A7F, 0x8D17, 0x4D7C, 0x8D1B, 0x3B36, 0x8D1C, 0x4D7D,
+ 0x8D64, 0x0A7A, 0x8D66, 0x08FB, 0x8D67, 0x1A80, 0x8D69, 0x3B37,
+ 0x8D6B, 0x05B0, 0x8D6C, 0x3B38, 0x8D6D, 0x1A81, 0x8D6E, 0x4D7E,
+ 0x8D70, 0x0AF8, 0x8D71, 0x1A82, 0x8D73, 0x1A83, 0x8D74, 0x0DDD,
+ 0x8D76, 0x21B5, 0x8D77, 0x0649, 0x8D81, 0x1A84, 0x8D84, 0x3B39,
+ 0x8D85, 0x0BD2, 0x8D8A, 0x04FD, 0x8D8D, 0x3B3A, 0x8D91, 0x4D7F,
+ 0x8D95, 0x3B3B, 0x8D99, 0x1A85, 0x8D9F, 0x4D80, 0x8DA3, 0x091D,
+ 0x8DA6, 0x3B3C, 0x8DA8, 0x0A3C, 0x8DAB, 0x4D81, 0x8DAF, 0x42EE,
+ 0x8DB2, 0x4D82, 0x8DB3, 0x0B0D, 0x8DBA, 0x1A88, 0x8DBE, 0x1A87,
+ 0x8DC2, 0x1A86, 0x8DC6, 0x3B3D, 0x8DC8, 0x4921, 0x8DCB, 0x1A8E,
+ 0x8DCC, 0x1A8C, 0x8DCE, 0x3B3E, 0x8DCF, 0x1A89, 0x8DD1, 0x42EF,
+ 0x8DD5, 0x4D83, 0x8DD6, 0x1A8B, 0x8DD7, 0x42F0, 0x8DD9, 0x4922,
+ 0x8DDA, 0x1A8A, 0x8DDB, 0x1A8D, 0x8DDD, 0x0691, 0x8DDF, 0x1A91,
+ 0x8DE1, 0x0A7B, 0x8DE3, 0x1A92, 0x8DE4, 0x3B3F, 0x8DE7, 0x4D84,
+ 0x8DE8, 0x078D, 0x8DEA, 0x1A8F, 0x8DEB, 0x1A90, 0x8DEC, 0x3B40,
+ 0x8DEF, 0x0FCF, 0x8DF1, 0x4D85, 0x8DF2, 0x4D86, 0x8DF3, 0x0BD3,
+ 0x8DF4, 0x4D87, 0x8DF5, 0x0AAB, 0x8DFC, 0x1A93, 0x8DFD, 0x4925,
+ 0x8DFF, 0x1A96, 0x8E01, 0x4D88, 0x8E06, 0x4926, 0x8E08, 0x1A94,
+ 0x8E09, 0x1A95, 0x8E0A, 0x0F43, 0x8E0B, 0x4D89, 0x8E0C, 0x4923,
+ 0x8E0F, 0x0C7F, 0x8E10, 0x1A99, 0x8E14, 0x4928, 0x8E16, 0x4929,
+ 0x8E1D, 0x1A97, 0x8E1E, 0x1A98, 0x8E1F, 0x1A9A, 0x8E20, 0x3B41,
+ 0x8E21, 0x492A, 0x8E22, 0x492B, 0x8E23, 0x42F1, 0x8E26, 0x4D8A,
+ 0x8E27, 0x492C, 0x8E2A, 0x1AA8, 0x8E30, 0x1A9D, 0x8E31, 0x4D8B,
+ 0x8E34, 0x1A9E, 0x8E35, 0x1A9C, 0x8E36, 0x492F, 0x8E39, 0x4930,
+ 0x8E3D, 0x42F2, 0x8E40, 0x4D8C, 0x8E41, 0x4D8D, 0x8E42, 0x1A9B,
+ 0x8E44, 0x0C19, 0x8E47, 0x1AA0, 0x8E48, 0x1AA4, 0x8E49, 0x1AA1,
+ 0x8E4A, 0x1A9F, 0x8E4B, 0x3B42, 0x8E4C, 0x1AA2, 0x8E4D, 0x4D8E,
+ 0x8E4F, 0x4D8F, 0x8E50, 0x1AA3, 0x8E54, 0x4931, 0x8E55, 0x1AAA,
+ 0x8E59, 0x1AA5, 0x8E5C, 0x4D90, 0x8E5F, 0x0A7C, 0x8E60, 0x1AA7,
+ 0x8E61, 0x4D91, 0x8E62, 0x4932, 0x8E63, 0x1AA9, 0x8E64, 0x1AA6,
+ 0x8E69, 0x4D92, 0x8E6C, 0x3B43, 0x8E6D, 0x4933, 0x8E6F, 0x4934,
+ 0x8E70, 0x3B44, 0x8E71, 0x4D93, 0x8E72, 0x1AAC, 0x8E74, 0x093D,
+ 0x8E75, 0x4D94, 0x8E76, 0x1AAB, 0x8E77, 0x4D95, 0x8E7A, 0x3B45,
+ 0x8E7B, 0x42F3, 0x8E7C, 0x1AAD, 0x8E81, 0x1AAE, 0x8E84, 0x1AB1,
+ 0x8E85, 0x1AB0, 0x8E87, 0x1AAF, 0x8E89, 0x4D96, 0x8E8A, 0x1AB3,
+ 0x8E8B, 0x1AB2, 0x8E8D, 0x0F02, 0x8E90, 0x4D97, 0x8E91, 0x1AB5,
+ 0x8E92, 0x3B46, 0x8E93, 0x1AB4, 0x8E94, 0x1AB6, 0x8E95, 0x4D98,
+ 0x8E98, 0x4935, 0x8E99, 0x1AB7, 0x8E9A, 0x4D99, 0x8E9E, 0x4936,
+ 0x8EA1, 0x1AB9, 0x8EA7, 0x4D9A, 0x8EA9, 0x4D9B, 0x8EAA, 0x1AB8,
+ 0x8EAB, 0x0A0E, 0x8EAC, 0x1ABA, 0x8EAD, 0x4D9C, 0x8EAE, 0x3B47,
+ 0x8EAF, 0x06E5, 0x8EB0, 0x1ABB, 0x8EB1, 0x1ABD, 0x8EB3, 0x3B48,
+ 0x8EB5, 0x4937, 0x8EB6, 0x3703, 0x8EBB, 0x4938, 0x8EBE, 0x1ABE,
+ 0x8EC0, 0x1DEF, 0x8EC5, 0x1ABF, 0x8EC6, 0x1ABC, 0x8EC8, 0x1AC0,
+ 0x8ECA, 0x0902, 0x8ECB, 0x1AC1, 0x8ECC, 0x064A, 0x8ECD, 0x0709,
+ 0x8ECF, 0x21B7, 0x8ED1, 0x3B49, 0x8ED2, 0x0762, 0x8ED4, 0x3B4A,
+ 0x8EDB, 0x1AC2, 0x8EDF, 0x0CC8, 0x8EE2, 0x0C38, 0x8EE3, 0x1AC3,
+ 0x8EE8, 0x4D9D, 0x8EEB, 0x1AC6, 0x8EF0, 0x4D9E, 0x8EF8, 0x08E0,
+ 0x8EF9, 0x3B4B, 0x8EFA, 0x42F6, 0x8EFB, 0x1AC5, 0x8EFC, 0x1AC4,
+ 0x8EFD, 0x0730, 0x8EFE, 0x1AC7, 0x8F00, 0x493C, 0x8F03, 0x05B1,
+ 0x8F05, 0x1AC9, 0x8F07, 0x4D9F, 0x8F08, 0x493D, 0x8F09, 0x084C,
+ 0x8F0A, 0x1AC8, 0x8F0C, 0x1AD1, 0x8F12, 0x1ACB, 0x8F13, 0x1ACD,
+ 0x8F14, 0x0E35, 0x8F15, 0x1ACA, 0x8F17, 0x3B4C, 0x8F18, 0x4DA0,
+ 0x8F19, 0x1ACC, 0x8F1B, 0x1AD0, 0x8F1C, 0x1ACE, 0x8F1D, 0x064B,
+ 0x8F1E, 0x42F7, 0x8F1F, 0x1ACF, 0x8F25, 0x4DA1, 0x8F26, 0x1AD2,
+ 0x8F27, 0x4DA2, 0x8F29, 0x0D10, 0x8F2A, 0x0FA0, 0x8F2B, 0x493E,
+ 0x8F2C, 0x4DA3, 0x8F2D, 0x42F8, 0x8F2F, 0x093E, 0x8F33, 0x1AD3,
+ 0x8F35, 0x4DA4, 0x8F36, 0x3B4D, 0x8F38, 0x0F0C, 0x8F39, 0x1AD5,
+ 0x8F3A, 0x4DA5, 0x8F3B, 0x1AD4, 0x8F3E, 0x1AD8, 0x8F3F, 0x0F2B,
+ 0x8F40, 0x493F, 0x8F42, 0x1AD7, 0x8F43, 0x4DA6, 0x8F44, 0x05CB,
+ 0x8F45, 0x1AD6, 0x8F46, 0x1ADB, 0x8F47, 0x4DA7, 0x8F49, 0x1ADA,
+ 0x8F4A, 0x4940, 0x8F4C, 0x1AD9, 0x8F4D, 0x0C2C, 0x8F4E, 0x1ADC,
+ 0x8F51, 0x4DA8, 0x8F54, 0x42F9, 0x8F55, 0x4DA9, 0x8F57, 0x1ADD,
+ 0x8F58, 0x4941, 0x8F5C, 0x1ADE, 0x8F5F, 0x07FE, 0x8F61, 0x06FB,
+ 0x8F62, 0x1ADF, 0x8F63, 0x1AE0, 0x8F64, 0x1AE1, 0x8F9B, 0x0A0F,
+ 0x8F9C, 0x1AE2, 0x8F9E, 0x08D9, 0x8F9F, 0x1AE3, 0x8FA0, 0x4DAA,
+ 0x8FA1, 0x4DAB, 0x8FA2, 0x4DAC, 0x8FA3, 0x1AE4, 0x8FA4, 0x4943,
+ 0x8FA5, 0x4DAD, 0x8FA6, 0x3B4E, 0x8FA7, 0x10B6, 0x8FA8, 0x10B5,
+ 0x8FAD, 0x1AE5, 0x8FAE, 0x17FF, 0x8FAF, 0x1AE6, 0x8FB0, 0x0B62,
+ 0x8FB1, 0x09F1, 0x8FB2, 0x0CF6, 0x8FB4, 0x4944, 0x8FB5, 0x3B4F,
+ 0x8FB6, 0x3B50, 0x8FB7, 0x1AE7, 0x8FBA, 0x0E25, 0x8FBB, 0x0BF0,
+ 0x8FBC, 0x0810, 0x8FBF, 0x0B67, 0x8FC1, 0x4946, 0x8FC2, 0x04CC,
+ 0x8FC4, 0x0EA6, 0x8FC5, 0x0A1D, 0x8FC6, 0x4947, 0x8FC8, 0x3799,
+ 0x8FCA, 0x4949, 0x8FCD, 0x494A, 0x8FCE, 0x0734, 0x8FD1, 0x06D9,
+ 0x8FD3, 0x494B, 0x8FD4, 0x0E26, 0x8FD5, 0x494C, 0x8FDA, 0x1AE8,
+ 0x8FE0, 0x3B52, 0x8FE2, 0x1AEA, 0x8FE4, 0x3B53, 0x8FE5, 0x1AE9,
+ 0x8FE6, 0x0560, 0x8FE8, 0x42FB, 0x8FE9, 0x0CCE, 0x8FEA, 0x1AEB,
+ 0x8FEB, 0x0D2D, 0x8FED, 0x0C2D, 0x8FEE, 0x42FC, 0x8FEF, 0x1AEC,
+ 0x8FF0, 0x095C, 0x8FF1, 0x494D, 0x8FF4, 0x1AEE, 0x8FF5, 0x494E,
+ 0x8FF6, 0x3B54, 0x8FF7, 0x0ECE, 0x8FF8, 0x1AFD, 0x8FF9, 0x1AF0,
+ 0x8FFA, 0x1AF1, 0x8FFB, 0x494F, 0x8FFD, 0x0BE5, 0x9000, 0x0B40,
+ 0x9001, 0x0AF9, 0x9002, 0x3B55, 0x9003, 0x0C80, 0x9004, 0x4DAE,
+ 0x9005, 0x1AEF, 0x9006, 0x066F, 0x9008, 0x42FD, 0x900B, 0x1AF8,
+ 0x900C, 0x4950, 0x900D, 0x1AF5, 0x900E, 0x1B02, 0x900F, 0x0C81,
+ 0x9010, 0x0B9E, 0x9011, 0x1AF2, 0x9013, 0x0C1A, 0x9014, 0x0C4D,
+ 0x9015, 0x1AF3, 0x9016, 0x1AF7, 0x9017, 0x0A26, 0x9019, 0x0D1D,
+ 0x901A, 0x0BE8, 0x901B, 0x4DAF, 0x901D, 0x0A66, 0x901E, 0x1AF6,
+ 0x901F, 0x0B0E, 0x9020, 0x0B04, 0x9021, 0x1AF4, 0x9022, 0x046D,
+ 0x9023, 0x0FC8, 0x9027, 0x1AF9, 0x902C, 0x3B56, 0x902D, 0x42FE,
+ 0x902E, 0x0B41, 0x902F, 0x4DB0, 0x9031, 0x093F, 0x9032, 0x0A10,
+ 0x9035, 0x1AFB, 0x9036, 0x1AFA, 0x9037, 0x4951, 0x9038, 0x04B3,
+ 0x9039, 0x1AFC, 0x903C, 0x0DA1, 0x903E, 0x1B04, 0x9041, 0x0CB3,
+ 0x9042, 0x0A31, 0x9043, 0x4953, 0x9044, 0x3B57, 0x9045, 0x0B97,
+ 0x9047, 0x06F0, 0x9049, 0x1B03, 0x904A, 0x0F21, 0x904B, 0x04E1,
+ 0x904C, 0x4DB1, 0x904D, 0x0E27, 0x904E, 0x0561, 0x904F, 0x1AFE,
+ 0x9050, 0x1AFF, 0x9051, 0x1B00, 0x9052, 0x1B01, 0x9053, 0x0C93,
+ 0x9054, 0x0B61, 0x9055, 0x04A7, 0x9056, 0x1B05, 0x9058, 0x1B06,
+ 0x9059, 0x1D34, 0x905B, 0x4DB2, 0x905C, 0x0B1D, 0x905D, 0x4954,
+ 0x905E, 0x1B07, 0x9060, 0x0515, 0x9061, 0x0ACE, 0x9063, 0x0763,
+ 0x9065, 0x0F44, 0x9067, 0x21BA, 0x9068, 0x1B08, 0x9069, 0x0C26,
+ 0x906D, 0x0AFA, 0x906E, 0x0903, 0x906F, 0x1B09, 0x9070, 0x4DB3,
+ 0x9072, 0x1B0C, 0x9074, 0x4DB4, 0x9075, 0x096F, 0x9076, 0x1B0A,
+ 0x9077, 0x0AAD, 0x9078, 0x0AAC, 0x9079, 0x4DB5, 0x907A, 0x04A8,
+ 0x907C, 0x0F93, 0x907D, 0x1B0E, 0x907F, 0x0D86, 0x9080, 0x1B10,
+ 0x9081, 0x1B0F, 0x9082, 0x1B0D, 0x9083, 0x1737, 0x9084, 0x0610,
+ 0x9085, 0x4957, 0x9087, 0x1AED, 0x9088, 0x3B58, 0x9089, 0x1B12,
+ 0x908A, 0x1B11, 0x908B, 0x4DB6, 0x908C, 0x4958, 0x908F, 0x1B13,
+ 0x9090, 0x4959, 0x9091, 0x0F22, 0x9095, 0x3B59, 0x9097, 0x42FF,
+ 0x9098, 0x4DB7, 0x9099, 0x3B5A, 0x909B, 0x3B5B, 0x90A0, 0x4DB8,
+ 0x90A1, 0x495A, 0x90A2, 0x3B5C, 0x90A3, 0x0CB9, 0x90A6, 0x0E5C,
+ 0x90A8, 0x1B14, 0x90AA, 0x0905, 0x90AF, 0x1B15, 0x90B0, 0x495C,
+ 0x90B1, 0x1B16, 0x90B2, 0x4DB9, 0x90B3, 0x4300, 0x90B4, 0x3B5D,
+ 0x90B5, 0x1B17, 0x90B6, 0x495D, 0x90B8, 0x0C1B, 0x90BD, 0x4DBA,
+ 0x90BE, 0x4301, 0x90C1, 0x04AE, 0x90C3, 0x495E, 0x90C4, 0x4302,
+ 0x90C5, 0x4303, 0x90C7, 0x4304, 0x90C8, 0x495F, 0x90C9, 0x4DBB,
+ 0x90CA, 0x07EB, 0x90CE, 0x0FE0, 0x90D7, 0x3B5E, 0x90DB, 0x1B1B,
+ 0x90DC, 0x4961, 0x90DD, 0x3B5F, 0x90DE, 0x21BB, 0x90DF, 0x4962,
+ 0x90E1, 0x070A, 0x90E2, 0x1B18, 0x90E4, 0x1B19, 0x90E8, 0x0DE6,
+ 0x90EB, 0x4967, 0x90ED, 0x05B2, 0x90EF, 0x4305, 0x90F0, 0x4DBC,
+ 0x90F2, 0x4965, 0x90F4, 0x3B60, 0x90F5, 0x0F23, 0x90F6, 0x4964,
+ 0x90F7, 0x06B7, 0x90FD, 0x0C4E, 0x90FE, 0x4968, 0x90FF, 0x4969,
+ 0x9100, 0x4966, 0x9102, 0x1B1C, 0x9104, 0x496A, 0x9105, 0x4DBD,
+ 0x9106, 0x496B, 0x9112, 0x1B1D, 0x9114, 0x4306, 0x9115, 0x21BD,
+ 0x9116, 0x4307, 0x9117, 0x3B61, 0x9118, 0x496C, 0x9119, 0x1B1E,
+ 0x911C, 0x3B62, 0x911E, 0x496D, 0x9122, 0x4308, 0x9123, 0x4309,
+ 0x9125, 0x4DBE, 0x9127, 0x21BE, 0x912D, 0x0C1C, 0x912F, 0x430A,
+ 0x9130, 0x1B20, 0x9131, 0x3B63, 0x9132, 0x1B1F, 0x9134, 0x430B,
+ 0x9137, 0x496E, 0x9139, 0x496F, 0x913A, 0x3B64, 0x913D, 0x3B65,
+ 0x9146, 0x4970, 0x9147, 0x4971, 0x9148, 0x3B66, 0x9149, 0x0CAB,
+ 0x914A, 0x1B21, 0x914B, 0x0940, 0x914C, 0x090C, 0x914D, 0x0D11,
+ 0x914E, 0x0BAF, 0x9152, 0x091E, 0x9154, 0x0A32, 0x9156, 0x1B22,
+ 0x9157, 0x4972, 0x9158, 0x1B23, 0x9159, 0x4973, 0x915A, 0x4DBF,
+ 0x915B, 0x3B67, 0x9161, 0x3B68, 0x9162, 0x0A23, 0x9163, 0x1B24,
+ 0x9164, 0x3B69, 0x9165, 0x1B25, 0x9167, 0x4DC0, 0x9169, 0x1B26,
+ 0x916A, 0x0F59, 0x916C, 0x0941, 0x9172, 0x1B28, 0x9173, 0x1B27,
+ 0x9174, 0x4974, 0x9175, 0x07EC, 0x9177, 0x0805, 0x9178, 0x088E,
+ 0x9179, 0x4975, 0x917A, 0x4DC1, 0x9182, 0x1B2B, 0x9183, 0x430C,
+ 0x9185, 0x4976, 0x9187, 0x0970, 0x9189, 0x1B2A, 0x918A, 0x4DC2,
+ 0x918B, 0x1B29, 0x918D, 0x0B49, 0x918E, 0x3B6A, 0x9190, 0x07A3,
+ 0x9191, 0x4DC3, 0x9192, 0x0A67, 0x9195, 0x4DC4, 0x9197, 0x0D44,
+ 0x919C, 0x0943, 0x919E, 0x3B6B, 0x91A2, 0x1B2C, 0x91A4, 0x09C7,
+ 0x91A8, 0x3B6C, 0x91AA, 0x1B2F, 0x91AB, 0x1B2D, 0x91AC, 0x1E1B,
+ 0x91AD, 0x3B6D, 0x91AE, 0x3B6E, 0x91AF, 0x1B2E, 0x91B0, 0x4DC5,
+ 0x91B1, 0x1E61, 0x91B2, 0x3B6F, 0x91B3, 0x4977, 0x91B4, 0x1B31,
+ 0x91B5, 0x1B30, 0x91B6, 0x4978, 0x91B8, 0x09E2, 0x91BA, 0x1B32,
+ 0x91BB, 0x4DC6, 0x91BC, 0x3B70, 0x91BD, 0x4DC7, 0x91C0, 0x1B33,
+ 0x91C1, 0x1B34, 0x91C2, 0x4DC8, 0x91C3, 0x4979, 0x91C4, 0x497A,
+ 0x91C5, 0x4DC9, 0x91C6, 0x0D64, 0x91C7, 0x0843, 0x91C8, 0x090D,
+ 0x91C9, 0x1B35, 0x91CB, 0x1B36, 0x91CC, 0x0F6C, 0x91CD, 0x094F,
+ 0x91CE, 0x0EFA, 0x91CF, 0x0F94, 0x91D0, 0x1B37, 0x91D1, 0x06DA,
+ 0x91D6, 0x1B38, 0x91D7, 0x21C0, 0x91D8, 0x0C1D, 0x91DA, 0x21BF,
+ 0x91DB, 0x1B3B, 0x91DC, 0x05D6, 0x91DD, 0x0A11, 0x91DE, 0x21C1,
+ 0x91DF, 0x1B39, 0x91E1, 0x1B3A, 0x91E3, 0x0BFC, 0x91E4, 0x21C4,
+ 0x91E5, 0x21C5, 0x91E6, 0x0E83, 0x91E7, 0x06F4, 0x91EC, 0x497D,
+ 0x91ED, 0x21C2, 0x91EE, 0x21C3, 0x91F0, 0x3B71, 0x91F1, 0x430D,
+ 0x91F5, 0x1B3D, 0x91F6, 0x1B3E, 0x91F7, 0x3B72, 0x91FB, 0x3B73,
+ 0x91FC, 0x1B3C, 0x91FF, 0x1B40, 0x9200, 0x4DCA, 0x9201, 0x497E,
+ 0x9206, 0x21C6, 0x9207, 0x3B74, 0x9209, 0x4DCB, 0x920A, 0x21C8,
+ 0x920D, 0x0CB7, 0x920E, 0x05A1, 0x9210, 0x21C7, 0x9211, 0x1B44,
+ 0x9214, 0x1B41, 0x9215, 0x1B43, 0x9216, 0x497F, 0x9217, 0x4980,
+ 0x921E, 0x1B3F, 0x9223, 0x4DCC, 0x9228, 0x3B75, 0x9229, 0x1B8A,
+ 0x922C, 0x1B42, 0x9233, 0x3B76, 0x9234, 0x0FB3, 0x9237, 0x078E,
+ 0x9238, 0x3B77, 0x9239, 0x21CF, 0x923A, 0x21C9, 0x923C, 0x21CB,
+ 0x923F, 0x1B4C, 0x9240, 0x21CA, 0x9242, 0x4982, 0x9243, 0x3B78,
+ 0x9244, 0x0C2E, 0x9245, 0x1B47, 0x9247, 0x3B79, 0x9248, 0x1B4A,
+ 0x9249, 0x1B48, 0x924A, 0x4983, 0x924B, 0x1B4D, 0x924E, 0x21CC,
+ 0x924F, 0x3B7A, 0x9250, 0x1B4E, 0x9251, 0x21CE, 0x9256, 0x4984,
+ 0x9257, 0x1B46, 0x9259, 0x21CD, 0x925A, 0x1B53, 0x925B, 0x0516,
+ 0x925E, 0x1B45, 0x9260, 0x3B7B, 0x9261, 0x4985, 0x9262, 0x0D41,
+ 0x9264, 0x1B49, 0x9265, 0x4986, 0x9266, 0x09C8, 0x9267, 0x21D0,
+ 0x9268, 0x4987, 0x9271, 0x07ED, 0x9276, 0x4DCD, 0x9277, 0x21D2,
+ 0x9278, 0x21D3, 0x927C, 0x4989, 0x927D, 0x498A, 0x927E, 0x0E76,
+ 0x927F, 0x498B, 0x9280, 0x06DC, 0x9283, 0x0950, 0x9285, 0x0C94,
+ 0x9288, 0x20AA, 0x9289, 0x498C, 0x928D, 0x498D, 0x928E, 0x4DCE,
+ 0x9291, 0x0AAF, 0x9293, 0x1B51, 0x9295, 0x1B4B, 0x9296, 0x1B50,
+ 0x9297, 0x498E, 0x9298, 0x0ECF, 0x9299, 0x498F, 0x929A, 0x0BD4,
+ 0x929B, 0x1B52, 0x929C, 0x1B4F, 0x929F, 0x4990, 0x92A7, 0x21D1,
+ 0x92AB, 0x4991, 0x92AD, 0x0AAE, 0x92AF, 0x4DCF, 0x92B2, 0x4994,
+ 0x92B3, 0x3554, 0x92B7, 0x1B56, 0x92B9, 0x1B55, 0x92BB, 0x4DD0,
+ 0x92BC, 0x4DD1, 0x92BF, 0x4995, 0x92C0, 0x4996, 0x92C1, 0x4DD2,
+ 0x92C2, 0x3B7C, 0x92C3, 0x4DD3, 0x92C5, 0x4DD4, 0x92C6, 0x4997,
+ 0x92C8, 0x4DD5, 0x92CB, 0x3B7D, 0x92CC, 0x3B7E, 0x92CE, 0x4998,
+ 0x92CF, 0x1B54, 0x92D0, 0x21D7, 0x92D2, 0x0E5D, 0x92D3, 0x21DB,
+ 0x92D5, 0x21D9, 0x92D7, 0x21D5, 0x92D9, 0x21D6, 0x92DF, 0x3B7F,
+ 0x92E0, 0x21DA, 0x92E4, 0x0985, 0x92E5, 0x4999, 0x92E7, 0x21D4,
+ 0x92E9, 0x1B57, 0x92EA, 0x0E2F, 0x92ED, 0x04F6, 0x92F2, 0x0DB8,
+ 0x92F3, 0x0BB0, 0x92F7, 0x499D, 0x92F8, 0x0692, 0x92F9, 0x20B0,
+ 0x92FA, 0x1B59, 0x92FB, 0x21DE, 0x92FC, 0x07EF, 0x92FF, 0x21E1,
+ 0x9302, 0x21E3, 0x9304, 0x345A, 0x9306, 0x087A, 0x930D, 0x3B80,
+ 0x930F, 0x1B58, 0x9310, 0x0A33, 0x9311, 0x499A, 0x9314, 0x4DD6,
+ 0x9315, 0x3B81, 0x9318, 0x0A34, 0x9319, 0x1B5C, 0x931A, 0x1B5E,
+ 0x931D, 0x21E2, 0x931E, 0x21E0, 0x931F, 0x3B82, 0x9320, 0x09E3,
+ 0x9321, 0x21DD, 0x9322, 0x1B5D, 0x9323, 0x1B5F, 0x9325, 0x21DC,
+ 0x9326, 0x06CB, 0x9327, 0x3B83, 0x9328, 0x0DB7, 0x9329, 0x499E,
+ 0x932B, 0x090E, 0x932C, 0x0FC9, 0x932E, 0x1B5B, 0x932F, 0x0868,
+ 0x9332, 0x0FE5, 0x9333, 0x4DD7, 0x9335, 0x1B61, 0x9336, 0x4DD8,
+ 0x933A, 0x1B60, 0x933B, 0x1B62, 0x9344, 0x1B5A, 0x9347, 0x3B84,
+ 0x9348, 0x20A9, 0x9349, 0x430E, 0x934A, 0x3458, 0x934B, 0x0CC1,
+ 0x934D, 0x0C4F, 0x9351, 0x49A1, 0x9352, 0x3B85, 0x9354, 0x0BF3,
+ 0x9356, 0x1B67, 0x9357, 0x21E5, 0x9358, 0x4DD9, 0x935A, 0x49A2,
+ 0x935B, 0x0B81, 0x935C, 0x1B63, 0x9360, 0x1B64, 0x9364, 0x430F,
+ 0x9365, 0x4310, 0x936A, 0x3B87, 0x936B, 0x49A3, 0x936C, 0x0703,
+ 0x936D, 0x3B88, 0x936E, 0x1B66, 0x9370, 0x21E4, 0x9371, 0x49A4,
+ 0x9373, 0x49A5, 0x9375, 0x0764, 0x937C, 0x1B65, 0x937E, 0x09C9,
+ 0x937F, 0x4DDA, 0x9382, 0x4DDB, 0x9388, 0x49A9, 0x938A, 0x4DDC,
+ 0x938B, 0x49AA, 0x938C, 0x05D7, 0x938F, 0x49AB, 0x9394, 0x1B6B,
+ 0x9396, 0x082F, 0x9397, 0x0AFB, 0x939A, 0x0BE6, 0x939B, 0x3B89,
+ 0x939E, 0x49AC, 0x93A1, 0x49A6, 0x93A3, 0x4311, 0x93A4, 0x21E6,
+ 0x93A7, 0x0599, 0x93A9, 0x3B8B, 0x93AC, 0x1B69, 0x93AD, 0x1B6A,
+ 0x93AE, 0x0BDF, 0x93B0, 0x1B68, 0x93B9, 0x1B6C, 0x93BA, 0x3B8A,
+ 0x93BB, 0x4DDD, 0x93C1, 0x3B8C, 0x93C3, 0x1B72, 0x93C6, 0x21E7,
+ 0x93C7, 0x49B1, 0x93C8, 0x1B75, 0x93CA, 0x3B8D, 0x93CC, 0x4DDE,
+ 0x93D0, 0x1B74, 0x93D1, 0x0C27, 0x93D6, 0x1B6D, 0x93D7, 0x1B6E,
+ 0x93D8, 0x1B71, 0x93DC, 0x49B2, 0x93DD, 0x1B73, 0x93DE, 0x21E8,
+ 0x93DF, 0x4312, 0x93E1, 0x06B8, 0x93E2, 0x3B8E, 0x93E4, 0x1B76,
+ 0x93E5, 0x1B70, 0x93E6, 0x4DDF, 0x93E7, 0x49B3, 0x93E8, 0x1B6F,
+ 0x93F1, 0x49B0, 0x93F5, 0x49AD, 0x93F8, 0x21E9, 0x93F9, 0x4DE0,
+ 0x93FA, 0x3B8F, 0x93FB, 0x49B7, 0x93FD, 0x3B90, 0x9402, 0x4DE1,
+ 0x9403, 0x1B7A, 0x9404, 0x4313, 0x9407, 0x1B7B, 0x9409, 0x49B4,
+ 0x940D, 0x4DE2, 0x940E, 0x4DE3, 0x940F, 0x3B91, 0x9410, 0x1B7C,
+ 0x9413, 0x1B79, 0x9414, 0x1B78, 0x9416, 0x49B5, 0x9417, 0x49B6,
+ 0x9418, 0x09CA, 0x9419, 0x0C82, 0x941A, 0x1B77, 0x9421, 0x1B80,
+ 0x942B, 0x1B7E, 0x942E, 0x4DE4, 0x9431, 0x21EA, 0x9432, 0x49B8,
+ 0x9433, 0x4314, 0x9434, 0x3B92, 0x9435, 0x1B7F, 0x9436, 0x1B7D,
+ 0x9438, 0x0B58, 0x943A, 0x1B81, 0x943B, 0x49B9, 0x943F, 0x3B93,
+ 0x9441, 0x1B82, 0x9444, 0x1B84, 0x9445, 0x21EB, 0x9448, 0x21EC,
+ 0x944A, 0x4315, 0x944C, 0x4DE5, 0x9451, 0x0611, 0x9452, 0x1B83,
+ 0x9453, 0x0F06, 0x9455, 0x3B94, 0x945A, 0x1B8F, 0x945B, 0x1B85,
+ 0x945E, 0x1B88, 0x9460, 0x1B86, 0x9462, 0x1B87, 0x9463, 0x4316,
+ 0x946A, 0x1B89, 0x946B, 0x3B95, 0x946D, 0x49BC, 0x946F, 0x49BD,
+ 0x9470, 0x1B8B, 0x9471, 0x4317, 0x9472, 0x3B96, 0x9475, 0x1B8C,
+ 0x9477, 0x1B8D, 0x947C, 0x1B90, 0x947D, 0x1B8E, 0x947E, 0x1B91,
+ 0x947F, 0x1B93, 0x9481, 0x1B92, 0x9577, 0x0BD5, 0x9578, 0x3B97,
+ 0x9579, 0x49BE, 0x9580, 0x0EF3, 0x9582, 0x1B94, 0x9583, 0x0AB0,
+ 0x9586, 0x49BF, 0x9587, 0x1B95, 0x9588, 0x4DE6, 0x9589, 0x0E14,
+ 0x958A, 0x1B96, 0x958B, 0x0589, 0x958C, 0x49C0, 0x958D, 0x49C1,
+ 0x958E, 0x4318, 0x958F, 0x04DE, 0x9591, 0x0613, 0x9592, 0x21ED,
+ 0x9593, 0x0612, 0x9594, 0x1B97, 0x9596, 0x1B98, 0x9598, 0x1B99,
+ 0x9599, 0x1B9A, 0x959F, 0x4319, 0x95A0, 0x1B9B, 0x95A1, 0x4DE7,
+ 0x95A2, 0x0614, 0x95A3, 0x05B3, 0x95A4, 0x07F0, 0x95A5, 0x0D4A,
+ 0x95A6, 0x3B98, 0x95A7, 0x1B9D, 0x95A8, 0x1B9C, 0x95A9, 0x3B99,
+ 0x95AB, 0x4F59, 0x95AC, 0x431A, 0x95AD, 0x1B9E, 0x95B1, 0x3555,
+ 0x95B2, 0x04FE, 0x95B4, 0x3B9B, 0x95B6, 0x431B, 0x95B9, 0x1BA1,
+ 0x95BB, 0x1BA0, 0x95BC, 0x1B9F, 0x95BD, 0x3B9C, 0x95BE, 0x1BA2,
+ 0x95BF, 0x4DE8, 0x95C3, 0x1BA5, 0x95C6, 0x4DE9, 0x95C7, 0x048B,
+ 0x95C8, 0x49C4, 0x95C9, 0x4DEA, 0x95CA, 0x1BA3, 0x95CB, 0x431C,
+ 0x95CC, 0x1BA7, 0x95CD, 0x1BA6, 0x95D0, 0x431D, 0x95D1, 0x4DEB,
+ 0x95D2, 0x4DEC, 0x95D3, 0x431E, 0x95D4, 0x1BA9, 0x95D5, 0x1BA8,
+ 0x95D6, 0x1BAA, 0x95D8, 0x0C86, 0x95DA, 0x3B9D, 0x95DC, 0x1BAB,
+ 0x95DE, 0x4320, 0x95E0, 0x4DED, 0x95E1, 0x1BAC, 0x95E2, 0x1BAE,
+ 0x95E4, 0x4DEE, 0x95E5, 0x1BAD, 0x95E6, 0x4DEF, 0x961C, 0x0DDE,
+ 0x961D, 0x3B9E, 0x9621, 0x1BAF, 0x9624, 0x4DF0, 0x9628, 0x1BB0,
+ 0x962A, 0x0855, 0x962C, 0x49C7, 0x962E, 0x1BB1, 0x962F, 0x1BB2,
+ 0x9631, 0x4DF1, 0x9632, 0x0E77, 0x9633, 0x49C8, 0x9634, 0x49C9,
+ 0x9638, 0x4DF2, 0x963B, 0x0ACD, 0x963C, 0x49CB, 0x963D, 0x4DF3,
+ 0x963F, 0x0468, 0x9640, 0x0B2B, 0x9641, 0x3B9F, 0x9642, 0x1BB3,
+ 0x9644, 0x0DDF, 0x964B, 0x1BB6, 0x964C, 0x1BB4, 0x964D, 0x07F1,
+ 0x964F, 0x1BB5, 0x9650, 0x0776, 0x9654, 0x4DF4, 0x9658, 0x3BA0,
+ 0x965B, 0x0E15, 0x965C, 0x1BB8, 0x965D, 0x1BBA, 0x965E, 0x1BB9,
+ 0x965F, 0x1BBB, 0x9661, 0x49CC, 0x9662, 0x04C3, 0x9663, 0x0A1E,
+ 0x9664, 0x0986, 0x9665, 0x0615, 0x9666, 0x1BBC, 0x966A, 0x0D1C,
+ 0x966C, 0x1BBE, 0x9670, 0x04C4, 0x9672, 0x1BBD, 0x9673, 0x0BE0,
+ 0x9674, 0x4DF5, 0x9675, 0x0F95, 0x9676, 0x0C83, 0x9677, 0x1BB7,
+ 0x9678, 0x0F6E, 0x967A, 0x0765, 0x967B, 0x4DF6, 0x967D, 0x0F45,
+ 0x967F, 0x4DF7, 0x9681, 0x4DF8, 0x9682, 0x49CE, 0x9683, 0x4DF9,
+ 0x9684, 0x3BA1, 0x9685, 0x06F1, 0x9686, 0x0F7C, 0x9688, 0x06FE,
+ 0x9689, 0x4DFA, 0x968A, 0x0B42, 0x968B, 0x186C, 0x968D, 0x1BBF,
+ 0x968E, 0x058A, 0x968F, 0x0A35, 0x9694, 0x05B4, 0x9695, 0x1BC1,
+ 0x9696, 0x4DFB, 0x9697, 0x1BC2, 0x9698, 0x1BC0, 0x9699, 0x073A,
+ 0x969A, 0x49D0, 0x969B, 0x084D, 0x969C, 0x09CB, 0x969D, 0x21F0,
+ 0x96A0, 0x04C5, 0x96A3, 0x0FA1, 0x96A4, 0x3BA2, 0x96A5, 0x4321,
+ 0x96A7, 0x1BC4, 0x96A8, 0x1B0B, 0x96A9, 0x3BA3, 0x96AA, 0x1BC3,
+ 0x96AE, 0x4DFC, 0x96AF, 0x21F1, 0x96B0, 0x1BC7, 0x96B1, 0x1BC5,
+ 0x96B2, 0x1BC6, 0x96B3, 0x49D3, 0x96B4, 0x1BC8, 0x96B6, 0x1BC9,
+ 0x96B7, 0x0FB4, 0x96B8, 0x1BCA, 0x96B9, 0x1BCB, 0x96BA, 0x49D4,
+ 0x96BB, 0x0A6D, 0x96BC, 0x0D4F, 0x96BD, 0x49D5, 0x96C0, 0x0A43,
+ 0x96C1, 0x0623, 0x96C4, 0x0F24, 0x96C5, 0x056D, 0x96C6, 0x0942,
+ 0x96C7, 0x078F, 0x96C9, 0x1BCE, 0x96CB, 0x1BCD, 0x96CC, 0x08C1,
+ 0x96CD, 0x1BCF, 0x96CE, 0x1BCC, 0x96D1, 0x0876, 0x96D2, 0x3BA4,
+ 0x96D5, 0x1BD3, 0x96D6, 0x1992, 0x96D8, 0x49D8, 0x96D9, 0x10EB,
+ 0x96DA, 0x49D9, 0x96DB, 0x0A3D, 0x96DC, 0x1BD1, 0x96DD, 0x49DA,
+ 0x96DE, 0x3BA6, 0x96E2, 0x0F6D, 0x96E3, 0x0CC9, 0x96E8, 0x04CD,
+ 0x96E9, 0x3BA7, 0x96EA, 0x0A87, 0x96EB, 0x08E2, 0x96EF, 0x4322,
+ 0x96F0, 0x0E07, 0x96F1, 0x3BA8, 0x96F2, 0x04E2, 0x96F6, 0x0FB5,
+ 0x96F7, 0x0F55, 0x96F9, 0x1BD4, 0x96FB, 0x0C3F, 0x9700, 0x0927,
+ 0x9702, 0x3BA9, 0x9703, 0x4DFD, 0x9704, 0x1BD5, 0x9706, 0x1BD6,
+ 0x9707, 0x0A12, 0x9708, 0x1BD7, 0x9709, 0x3BAA, 0x970A, 0x0FB6,
+ 0x970D, 0x1BD2, 0x970E, 0x1BD9, 0x970F, 0x1BDB, 0x9711, 0x1BDA,
+ 0x9713, 0x1BD8, 0x9714, 0x49DC, 0x9716, 0x1BDC, 0x9719, 0x1BDD,
+ 0x971B, 0x4DFE, 0x971C, 0x0AFC, 0x971E, 0x0562, 0x9721, 0x4DFF,
+ 0x9722, 0x4E00, 0x9723, 0x49DD, 0x9724, 0x1BDE, 0x9727, 0x0EC4,
+ 0x9728, 0x4E01, 0x972A, 0x1BDF, 0x9730, 0x1BE0, 0x9731, 0x4E02,
+ 0x9732, 0x0FD0, 0x9733, 0x21F2, 0x9736, 0x49DF, 0x9738, 0x1414,
+ 0x9739, 0x1BE1, 0x973B, 0x21F3, 0x973D, 0x1BE2, 0x973E, 0x1BE3,
+ 0x9741, 0x49E0, 0x9742, 0x1BE7, 0x9743, 0x21F4, 0x9744, 0x1BE4,
+ 0x9746, 0x1BE5, 0x9747, 0x49E1, 0x9748, 0x1BE6, 0x9749, 0x1BE8,
+ 0x974D, 0x21F5, 0x974E, 0x4323, 0x974F, 0x21F6, 0x9751, 0x21F7,
+ 0x9752, 0x0A68, 0x9755, 0x4F5A, 0x9756, 0x0F03, 0x9757, 0x49E2,
+ 0x9759, 0x0A69, 0x975A, 0x3BAB, 0x975B, 0x49E3, 0x975C, 0x1BE9,
+ 0x975E, 0x0D87, 0x9760, 0x1BEA, 0x9761, 0x1D06, 0x9762, 0x0ED8,
+ 0x9763, 0x3BAC, 0x9764, 0x1BEB, 0x9766, 0x1BEC, 0x9767, 0x4E03,
+ 0x9768, 0x1BED, 0x9769, 0x05B5, 0x976A, 0x49E4, 0x976B, 0x1BEF,
+ 0x976D, 0x0A1F, 0x976E, 0x3BAD, 0x9771, 0x1BF0, 0x9773, 0x3BAE,
+ 0x9774, 0x06FA, 0x9776, 0x4E04, 0x9779, 0x1BF1, 0x977A, 0x1BF5,
+ 0x977C, 0x1BF3, 0x977D, 0x4E05, 0x977F, 0x4E06, 0x9781, 0x1BF4,
+ 0x9784, 0x05D1, 0x9785, 0x1BF2, 0x9786, 0x1BF6, 0x978B, 0x1BF7,
+ 0x978D, 0x048C, 0x978F, 0x1BF8, 0x9790, 0x1BF9, 0x9795, 0x4324,
+ 0x9796, 0x49E7, 0x9798, 0x09CC, 0x9799, 0x4E07, 0x979A, 0x3BAF,
+ 0x979C, 0x1BFA, 0x979E, 0x49E8, 0x979F, 0x4E08, 0x97A0, 0x0661,
+ 0x97A2, 0x3BB0, 0x97A3, 0x1BFD, 0x97A6, 0x1BFC, 0x97A8, 0x1BFB,
+ 0x97AB, 0x1A34, 0x97AC, 0x4E09, 0x97AD, 0x0E2C, 0x97AE, 0x4325,
+ 0x97B1, 0x49E9, 0x97B2, 0x49EA, 0x97B3, 0x1BFE, 0x97B4, 0x1BFF,
+ 0x97B5, 0x3BB1, 0x97B6, 0x3BB2, 0x97B9, 0x4E0A, 0x97BA, 0x4326,
+ 0x97BE, 0x49EB, 0x97C1, 0x4327, 0x97C3, 0x1C00, 0x97C6, 0x1C01,
+ 0x97C8, 0x1C02, 0x97C9, 0x4328, 0x97CB, 0x1C03, 0x97CC, 0x49EC,
+ 0x97CD, 0x4E0B, 0x97D1, 0x49ED, 0x97D3, 0x0616, 0x97D4, 0x49EE,
+ 0x97D8, 0x49EF, 0x97D9, 0x3BB3, 0x97DB, 0x4329, 0x97DC, 0x1C04,
+ 0x97DE, 0x3BB4, 0x97E0, 0x4E0C, 0x97E1, 0x49F0, 0x97ED, 0x1C05,
+ 0x97EE, 0x0CD9, 0x97EF, 0x4E0D, 0x97F1, 0x49F1, 0x97F2, 0x1C07,
+ 0x97F3, 0x053B, 0x97F4, 0x3BB5, 0x97F5, 0x1C0A, 0x97F6, 0x1C09,
+ 0x97FB, 0x04C6, 0x97FF, 0x06B9, 0x9801, 0x0E17, 0x9802, 0x0BD6,
+ 0x9803, 0x0812, 0x9804, 0x49F2, 0x9805, 0x07F2, 0x9806, 0x0971,
+ 0x9807, 0x4E0E, 0x9808, 0x0A22, 0x980A, 0x3BB6, 0x980C, 0x1C0C,
+ 0x980D, 0x49F3, 0x980E, 0x3BB7, 0x980F, 0x1C0B, 0x9810, 0x0F2C,
+ 0x9811, 0x0624, 0x9812, 0x0D66, 0x9813, 0x0CB4, 0x9814, 0x49F4,
+ 0x9816, 0x49F5, 0x9817, 0x0A42, 0x9818, 0x0F96, 0x981A, 0x0731,
+ 0x981E, 0x3BB8, 0x9821, 0x1C0F, 0x9823, 0x3BB9, 0x9824, 0x1C0E,
+ 0x9825, 0x49FA, 0x9826, 0x4E0F, 0x982B, 0x3BBA, 0x982C, 0x0E79,
+ 0x982D, 0x0C84, 0x982E, 0x4E10, 0x9830, 0x1E73, 0x9832, 0x49F8,
+ 0x9833, 0x49F9, 0x9834, 0x04F2, 0x9837, 0x1C10, 0x9838, 0x1C0D,
+ 0x9839, 0x37B3, 0x983B, 0x0DC3, 0x983C, 0x0F54, 0x983D, 0x1C11,
+ 0x983E, 0x3BBB, 0x9846, 0x1C12, 0x9847, 0x49FB, 0x984B, 0x1C14,
+ 0x984C, 0x0B4A, 0x984D, 0x05B9, 0x984E, 0x05BA, 0x984F, 0x1C13,
+ 0x9852, 0x3BBC, 0x9853, 0x3BBD, 0x9854, 0x0625, 0x9855, 0x0766,
+ 0x9856, 0x432A, 0x9857, 0x21F9, 0x9858, 0x0626, 0x9859, 0x3BBE,
+ 0x985A, 0x1E48, 0x985B, 0x0C39, 0x985E, 0x0FA8, 0x9862, 0x4E11,
+ 0x9863, 0x4E12, 0x9865, 0x21FA, 0x9866, 0x49FC, 0x9867, 0x0790,
+ 0x986B, 0x1C15, 0x986C, 0x3BBF, 0x986F, 0x1C16, 0x9870, 0x1C17,
+ 0x9871, 0x1C18, 0x9873, 0x1C1A, 0x9874, 0x1C19, 0x98A8, 0x0DE9,
+ 0x98AA, 0x1C1B, 0x98AB, 0x49FD, 0x98AD, 0x49FE, 0x98AF, 0x1C1C,
+ 0x98B0, 0x49FF, 0x98B1, 0x1C1D, 0x98B4, 0x4E13, 0x98B6, 0x1C1E,
+ 0x98B7, 0x4A01, 0x98B8, 0x3BC0, 0x98BA, 0x3BC1, 0x98BB, 0x4A02,
+ 0x98BC, 0x4A03, 0x98BF, 0x3BC2, 0x98C2, 0x4A04, 0x98C3, 0x1C20,
+ 0x98C4, 0x1C1F, 0x98C5, 0x4E14, 0x98C6, 0x1C21, 0x98C7, 0x4A05,
+ 0x98C8, 0x3BC3, 0x98CB, 0x4A06, 0x98DB, 0x0D88, 0x98DC, 0x1839,
+ 0x98DF, 0x09EF, 0x98E0, 0x3618, 0x98E1, 0x4A07, 0x98E2, 0x064C,
+ 0x98E3, 0x4A08, 0x98E5, 0x3BC4, 0x98E7, 0x432B, 0x98E9, 0x1C22,
+ 0x98EA, 0x4A09, 0x98EB, 0x1C23, 0x98ED, 0x10C1, 0x98EE, 0x14DA,
+ 0x98EF, 0x0D67, 0x98F0, 0x4A0A, 0x98F1, 0x4A0B, 0x98F2, 0x04BF,
+ 0x98F3, 0x4A0C, 0x98F4, 0x047F, 0x98FC, 0x08C2, 0x98FD, 0x0E5E,
+ 0x98FE, 0x09E6, 0x9902, 0x4E15, 0x9903, 0x1C24, 0x9905, 0x0EEB,
+ 0x9908, 0x4A0D, 0x9909, 0x1C25, 0x990A, 0x0F46, 0x990C, 0x04E4,
+ 0x9910, 0x088F, 0x9911, 0x4E16, 0x9912, 0x1C26, 0x9913, 0x056E,
+ 0x9914, 0x1C27, 0x9915, 0x4E17, 0x9916, 0x4A10, 0x9917, 0x4A11,
+ 0x9918, 0x1C28, 0x991A, 0x4A13, 0x991B, 0x4A14, 0x991C, 0x4A15,
+ 0x991D, 0x1C2A, 0x991E, 0x1C2B, 0x9920, 0x1C2D, 0x9921, 0x1C29,
+ 0x9924, 0x1C2C, 0x9927, 0x21FD, 0x9928, 0x0617, 0x992C, 0x1C2E,
+ 0x992E, 0x1C2F, 0x9931, 0x4A17, 0x9932, 0x3BC5, 0x9933, 0x3BC6,
+ 0x9935, 0x4E18, 0x993A, 0x4A18, 0x993B, 0x4A19, 0x993C, 0x4A1A,
+ 0x993D, 0x1C30, 0x993E, 0x1C31, 0x9940, 0x3BC7, 0x9941, 0x4A1B,
+ 0x9942, 0x1C32, 0x9945, 0x1C34, 0x9946, 0x4A1C, 0x9948, 0x4E19,
+ 0x9949, 0x1C33, 0x994B, 0x1C36, 0x994C, 0x1C39, 0x994D, 0x3BC8,
+ 0x994E, 0x4A1D, 0x9950, 0x1C35, 0x9951, 0x1C37, 0x9952, 0x1C38,
+ 0x9954, 0x4E1A, 0x9955, 0x1C3A, 0x9957, 0x06BA, 0x9958, 0x432C,
+ 0x995C, 0x3BC9, 0x995E, 0x4E1B, 0x995F, 0x3BCA, 0x9960, 0x4A1E,
+ 0x9996, 0x091F, 0x9997, 0x1C3B, 0x9998, 0x1C3C, 0x9999, 0x07F3,
+ 0x999E, 0x21FF, 0x99A3, 0x4A1F, 0x99A5, 0x1C3D, 0x99A6, 0x4A20,
+ 0x99A8, 0x059C, 0x99AC, 0x0D05, 0x99AD, 0x1C3E, 0x99AE, 0x1C3F,
+ 0x99B1, 0x3BCB, 0x99B3, 0x0B98, 0x99B4, 0x0CC3, 0x99B9, 0x3BCC,
+ 0x99BA, 0x3BCD, 0x99BC, 0x1C40, 0x99BD, 0x4A21, 0x99BF, 0x4A22,
+ 0x99C1, 0x0D33, 0x99C3, 0x4A23, 0x99C4, 0x0B2C, 0x99C5, 0x04FA,
+ 0x99C6, 0x06E6, 0x99C8, 0x06E7, 0x99C9, 0x3BCE, 0x99D0, 0x0BB1,
+ 0x99D1, 0x1C45, 0x99D2, 0x06E8, 0x99D4, 0x4A24, 0x99D5, 0x056F,
+ 0x99D8, 0x1C44, 0x99D9, 0x4A25, 0x99DB, 0x1C42, 0x99DD, 0x1C43,
+ 0x99DE, 0x4A26, 0x99DF, 0x1C41, 0x99E1, 0x4E1C, 0x99E2, 0x1C4F,
+ 0x99ED, 0x1C46, 0x99EE, 0x1C47, 0x99F0, 0x4A28, 0x99F1, 0x1C48,
+ 0x99F2, 0x1C49, 0x99F8, 0x1C4B, 0x99F9, 0x4A29, 0x99FB, 0x1C4A,
+ 0x99FC, 0x4A2A, 0x99FF, 0x0963, 0x9A01, 0x1C4C, 0x9A02, 0x3BCF,
+ 0x9A03, 0x432D, 0x9A05, 0x1C4E, 0x9A08, 0x37BA, 0x9A0A, 0x4A2B,
+ 0x9A0C, 0x4E1D, 0x9A0E, 0x064D, 0x9A0F, 0x1C4D, 0x9A10, 0x4E1E,
+ 0x9A11, 0x4A2C, 0x9A12, 0x0AFD, 0x9A13, 0x0767, 0x9A16, 0x3BD0,
+ 0x9A19, 0x1C50, 0x9A1A, 0x4A2D, 0x9A20, 0x4A2E, 0x9A23, 0x4E1F,
+ 0x9A24, 0x3BD1, 0x9A27, 0x3BD2, 0x9A28, 0x0B2D, 0x9A2B, 0x1C51,
+ 0x9A2D, 0x3BD3, 0x9A2E, 0x3BD4, 0x9A30, 0x0C85, 0x9A31, 0x4A2F,
+ 0x9A36, 0x3BD5, 0x9A37, 0x1C52, 0x9A38, 0x3BD6, 0x9A3E, 0x1C57,
+ 0x9A40, 0x1C55, 0x9A41, 0x4E20, 0x9A42, 0x1C54, 0x9A43, 0x1C56,
+ 0x9A44, 0x4A30, 0x9A45, 0x1C53, 0x9A4A, 0x3BD7, 0x9A4C, 0x4A31,
+ 0x9A4D, 0x1C59, 0x9A4E, 0x2200, 0x9A51, 0x4E21, 0x9A52, 0x1E2F,
+ 0x9A55, 0x1C58, 0x9A56, 0x3BD8, 0x9A57, 0x1C5B, 0x9A58, 0x4A32,
+ 0x9A5A, 0x06BB, 0x9A5B, 0x1C5A, 0x9A5F, 0x1C5C, 0x9A62, 0x1C5D,
+ 0x9A64, 0x1C5F, 0x9A65, 0x1C5E, 0x9A69, 0x1C60, 0x9A6A, 0x1C62,
+ 0x9A6B, 0x1C61, 0x9AA8, 0x080E, 0x9AAD, 0x1C63, 0x9AAF, 0x4A34,
+ 0x9AB0, 0x1C64, 0x9AB5, 0x3BD9, 0x9AB6, 0x3BDA, 0x9AB7, 0x4A36,
+ 0x9AB8, 0x059A, 0x9AB9, 0x4A38, 0x9ABC, 0x1C65, 0x9ABD, 0x4E22,
+ 0x9ABE, 0x4E23, 0x9AC0, 0x1C66, 0x9AC1, 0x432E, 0x9AC3, 0x432F,
+ 0x9AC4, 0x0A37, 0x9AC6, 0x4A3A, 0x9ACE, 0x4330, 0x9ACF, 0x1C67,
+ 0x9AD0, 0x4A3B, 0x9AD1, 0x1C68, 0x9AD2, 0x4A3C, 0x9AD3, 0x1C69,
+ 0x9AD4, 0x1C6A, 0x9AD5, 0x4A3D, 0x9AD6, 0x4331, 0x9AD8, 0x07F4,
+ 0x9AD9, 0x2201, 0x9ADC, 0x2202, 0x9ADE, 0x1C6B, 0x9ADF, 0x1C6C,
+ 0x9AE0, 0x4A3E, 0x9AE2, 0x1C6D, 0x9AE3, 0x1C6E, 0x9AE5, 0x4A3F,
+ 0x9AE6, 0x1C6F, 0x9AE9, 0x4A40, 0x9AEA, 0x0D45, 0x9AEB, 0x1C71,
+ 0x9AED, 0x0D98, 0x9AEE, 0x1C72, 0x9AEF, 0x1C70, 0x9AF1, 0x1C74,
+ 0x9AF4, 0x1C73, 0x9AF7, 0x1C75, 0x9AF9, 0x3BDB, 0x9AFB, 0x1C76,
+ 0x9B01, 0x4E24, 0x9B02, 0x4332, 0x9B03, 0x3BDC, 0x9B06, 0x1C77,
+ 0x9B08, 0x4333, 0x9B09, 0x4E25, 0x9B0B, 0x4E26, 0x9B0C, 0x4A41,
+ 0x9B0D, 0x4E27, 0x9B0E, 0x4E28, 0x9B10, 0x4A42, 0x9B12, 0x4A43,
+ 0x9B16, 0x4A44, 0x9B18, 0x1C78, 0x9B19, 0x4E29, 0x9B1A, 0x1C79,
+ 0x9B1C, 0x4A45, 0x9B1D, 0x4F49, 0x9B1F, 0x1C7A, 0x9B20, 0x3BDD,
+ 0x9B22, 0x1C7B, 0x9B23, 0x1C7C, 0x9B25, 0x1C7D, 0x9B27, 0x1C7E,
+ 0x9B28, 0x1C7F, 0x9B29, 0x1C80, 0x9B2A, 0x1C81, 0x9B2B, 0x4A46,
+ 0x9B2C, 0x4F4A, 0x9B2D, 0x4335, 0x9B2E, 0x1C82, 0x9B2F, 0x1C83,
+ 0x9B31, 0x14D4, 0x9B32, 0x1C84, 0x9B33, 0x3BDE, 0x9B34, 0x3BDF,
+ 0x9B35, 0x4E2A, 0x9B3B, 0x17A9, 0x9B3C, 0x064E, 0x9B3D, 0x4A47,
+ 0x9B41, 0x057F, 0x9B42, 0x0822, 0x9B43, 0x1C86, 0x9B44, 0x1C85,
+ 0x9B45, 0x0EB1, 0x9B48, 0x4E2B, 0x9B4B, 0x4A49, 0x9B4D, 0x1C88,
+ 0x9B4E, 0x1C89, 0x9B4F, 0x1C87, 0x9B51, 0x1C8A, 0x9B54, 0x0E90,
+ 0x9B55, 0x4E2C, 0x9B58, 0x1C8B, 0x9B5A, 0x0695, 0x9B5E, 0x4336,
+ 0x9B63, 0x4A4A, 0x9B65, 0x4A4B, 0x9B66, 0x4337, 0x9B68, 0x4E2D,
+ 0x9B6B, 0x4A4C, 0x9B6C, 0x4A4D, 0x9B6F, 0x0FCB, 0x9B72, 0x2204,
+ 0x9B73, 0x3BE0, 0x9B74, 0x1C8C, 0x9B75, 0x2203, 0x9B76, 0x4A4E,
+ 0x9B77, 0x4A4F, 0x9B79, 0x3BE1, 0x9B80, 0x4E2E, 0x9B83, 0x1C8E,
+ 0x9B84, 0x4338, 0x9B86, 0x4E2F, 0x9B8A, 0x4339, 0x9B8E, 0x0482,
+ 0x9B8F, 0x2205, 0x9B90, 0x4E30, 0x9B91, 0x1C8F, 0x9B92, 0x0DFB,
+ 0x9B93, 0x1C8D, 0x9B96, 0x1C90, 0x9B97, 0x1C91, 0x9B9D, 0x4E31,
+ 0x9B9E, 0x433A, 0x9B9F, 0x1C92, 0x9BA0, 0x1C93, 0x9BA6, 0x4A50,
+ 0x9BA7, 0x3BE2, 0x9BA8, 0x1C94, 0x9BAA, 0x0E9C, 0x9BAB, 0x087B,
+ 0x9BAC, 0x4A51, 0x9BAD, 0x086A, 0x9BAE, 0x0AB1, 0x9BB0, 0x4E32,
+ 0x9BB1, 0x2206, 0x9BB2, 0x4A53, 0x9BB4, 0x1C95, 0x9BB8, 0x4A54,
+ 0x9BB9, 0x1C98, 0x9BBB, 0x2207, 0x9BBE, 0x4A55, 0x9BBF, 0x4E33,
+ 0x9BC0, 0x1C96, 0x9BC1, 0x3BE3, 0x9BC6, 0x1C99, 0x9BC7, 0x3BE4,
+ 0x9BC8, 0x4E34, 0x9BC9, 0x07A5, 0x9BCA, 0x1C97, 0x9BCE, 0x433B,
+ 0x9BCF, 0x1C9A, 0x9BD1, 0x1C9B, 0x9BD2, 0x1C9C, 0x9BD4, 0x1CA0,
+ 0x9BD6, 0x0878, 0x9BD7, 0x3BE5, 0x9BD8, 0x4A57, 0x9BDB, 0x0B44,
+ 0x9BDD, 0x4A58, 0x9BDF, 0x37BF, 0x9BE1, 0x1CA1, 0x9BE2, 0x1C9E,
+ 0x9BE3, 0x1C9D, 0x9BE4, 0x1C9F, 0x9BE5, 0x433C, 0x9BE7, 0x3BE6,
+ 0x9BE8, 0x0735, 0x9BEA, 0x4A59, 0x9BEB, 0x3BE7, 0x9BEE, 0x4A5B,
+ 0x9BEF, 0x4A5A, 0x9BF0, 0x1CA5, 0x9BF1, 0x1CA4, 0x9BF2, 0x1CA3,
+ 0x9BF3, 0x4A56, 0x9BF5, 0x0477, 0x9BF7, 0x3BE8, 0x9BF8, 0x433D,
+ 0x9BFA, 0x3BE9, 0x9BFD, 0x3BEA, 0x9BFF, 0x4E35, 0x9C00, 0x2208,
+ 0x9C02, 0x4E36, 0x9C04, 0x1CAF, 0x9C06, 0x1CAB, 0x9C08, 0x1CAC,
+ 0x9C09, 0x1CA8, 0x9C0A, 0x1CAE, 0x9C0B, 0x3BEB, 0x9C0C, 0x1CAA,
+ 0x9C0D, 0x05C0, 0x9C10, 0x0FF2, 0x9C12, 0x1CAD, 0x9C13, 0x1CA9,
+ 0x9C14, 0x1CA7, 0x9C15, 0x1CA6, 0x9C16, 0x4A5F, 0x9C18, 0x4A60,
+ 0x9C19, 0x4A61, 0x9C1A, 0x4A62, 0x9C1B, 0x1CB1, 0x9C1C, 0x4E37,
+ 0x9C1D, 0x4A63, 0x9C21, 0x1CB4, 0x9C22, 0x4A64, 0x9C23, 0x433E,
+ 0x9C24, 0x1CB3, 0x9C25, 0x1CB2, 0x9C27, 0x3BEC, 0x9C29, 0x4A65,
+ 0x9C2A, 0x3BED, 0x9C2D, 0x0DBB, 0x9C2E, 0x1CB0, 0x9C2F, 0x04B7,
+ 0x9C30, 0x1CB5, 0x9C31, 0x4A67, 0x9C32, 0x1CB7, 0x9C35, 0x4E38,
+ 0x9C36, 0x3BEE, 0x9C37, 0x4A68, 0x9C39, 0x05CD, 0x9C3A, 0x1CA2,
+ 0x9C3B, 0x04D9, 0x9C3E, 0x1CB9, 0x9C41, 0x3BEF, 0x9C44, 0x4E39,
+ 0x9C45, 0x4A69, 0x9C46, 0x1CB8, 0x9C47, 0x1CB6, 0x9C48, 0x0B6B,
+ 0x9C49, 0x4A6C, 0x9C4A, 0x4A6D, 0x9C4F, 0x433F, 0x9C50, 0x4340,
+ 0x9C52, 0x0E9E, 0x9C53, 0x3BF0, 0x9C54, 0x4A6F, 0x9C56, 0x4E3A,
+ 0x9C57, 0x0FA2, 0x9C58, 0x4A70, 0x9C5A, 0x1CBA, 0x9C5B, 0x4A71,
+ 0x9C5C, 0x4A6A, 0x9C5D, 0x4A72, 0x9C5F, 0x4A73, 0x9C60, 0x1CBB,
+ 0x9C61, 0x4E3B, 0x9C63, 0x3BF1, 0x9C65, 0x4341, 0x9C67, 0x1CBC,
+ 0x9C68, 0x4E3C, 0x9C69, 0x4A74, 0x9C6A, 0x4A75, 0x9C6B, 0x4A76,
+ 0x9C6D, 0x4A77, 0x9C6E, 0x4A78, 0x9C70, 0x3BF2, 0x9C72, 0x4A79,
+ 0x9C75, 0x4A7A, 0x9C76, 0x1CBD, 0x9C77, 0x3BF3, 0x9C78, 0x1CBE,
+ 0x9C7A, 0x4A7B, 0x9CE5, 0x0BD7, 0x9CE6, 0x4A7C, 0x9CE7, 0x1CBF,
+ 0x9CE9, 0x0D4B, 0x9CEB, 0x1CC4, 0x9CEC, 0x1CC0, 0x9CF0, 0x1CC1,
+ 0x9CF2, 0x4A7D, 0x9CF3, 0x0E5F, 0x9CF4, 0x0ED0, 0x9CF6, 0x0CA8,
+ 0x9D02, 0x3BF4, 0x9D03, 0x1CC5, 0x9D06, 0x1CC6, 0x9D07, 0x0C96,
+ 0x9D08, 0x1CC3, 0x9D09, 0x1CC2, 0x9D0B, 0x4A7E, 0x9D0E, 0x052A,
+ 0x9D11, 0x4A80, 0x9D12, 0x1CCE, 0x9D15, 0x1CCD, 0x9D17, 0x4A81,
+ 0x9D18, 0x4A82, 0x9D1B, 0x0517, 0x9D1D, 0x4342, 0x9D1E, 0x4343,
+ 0x9D1F, 0x1CCB, 0x9D23, 0x1CCA, 0x9D26, 0x1CC8, 0x9D28, 0x05D9,
+ 0x9D2A, 0x1CC7, 0x9D2B, 0x08DE, 0x9D2C, 0x0529, 0x9D30, 0x4E3D,
+ 0x9D32, 0x4A86, 0x9D3B, 0x07F5, 0x9D3D, 0x4E3E, 0x9D3E, 0x1CD1,
+ 0x9D3F, 0x1CD0, 0x9D41, 0x1CCF, 0x9D42, 0x3BF5, 0x9D43, 0x4344,
+ 0x9D44, 0x1CCC, 0x9D46, 0x1CD2, 0x9D47, 0x3BF6, 0x9D48, 0x1CD3,
+ 0x9D4A, 0x4A88, 0x9D50, 0x1CD8, 0x9D51, 0x1CD7, 0x9D52, 0x4345,
+ 0x9D59, 0x1CD9, 0x9D5C, 0x04CF, 0x9D5D, 0x1CD4, 0x9D5E, 0x1CD5,
+ 0x9D5F, 0x4A89, 0x9D60, 0x0806, 0x9D61, 0x0EC5, 0x9D62, 0x4A8A,
+ 0x9D63, 0x3BF7, 0x9D64, 0x1CD6, 0x9D69, 0x3BF8, 0x9D6A, 0x4E3F,
+ 0x9D6B, 0x220A, 0x9D6C, 0x0E60, 0x9D6F, 0x1CDE, 0x9D70, 0x2209,
+ 0x9D72, 0x1CDA, 0x9D73, 0x4A8D, 0x9D76, 0x4A8E, 0x9D77, 0x4A8F,
+ 0x9D7A, 0x1CDF, 0x9D7B, 0x4E40, 0x9D7C, 0x3BF9, 0x9D7E, 0x3BFA,
+ 0x9D84, 0x4A90, 0x9D87, 0x1CDC, 0x9D89, 0x1CDB, 0x9D8A, 0x4346,
+ 0x9D8D, 0x3BFB, 0x9D8F, 0x0732, 0x9D96, 0x4347, 0x9D99, 0x4A91,
+ 0x9D9A, 0x1CE0, 0x9DA1, 0x4A92, 0x9DA4, 0x1CE1, 0x9DA9, 0x1CE2,
+ 0x9DAB, 0x1CDD, 0x9DAC, 0x4349, 0x9DAF, 0x1CC9, 0x9DB1, 0x3BFC,
+ 0x9DB2, 0x1CE3, 0x9DB4, 0x0BFD, 0x9DB5, 0x4A94, 0x9DB8, 0x1CE7,
+ 0x9DB9, 0x4A95, 0x9DBA, 0x1CE8, 0x9DBB, 0x1CE6, 0x9DBC, 0x434A,
+ 0x9DBD, 0x4A96, 0x9DBF, 0x4A93, 0x9DC0, 0x4348, 0x9DC1, 0x1CE5,
+ 0x9DC2, 0x1CEB, 0x9DC3, 0x3BFD, 0x9DC4, 0x1CE4, 0x9DC6, 0x1CE9,
+ 0x9DC7, 0x3BFE, 0x9DC9, 0x4A97, 0x9DCF, 0x1CEA, 0x9DD3, 0x1CED,
+ 0x9DD6, 0x3BFF, 0x9DD7, 0x1DDE, 0x9DD9, 0x1CEC, 0x9DDA, 0x4A98,
+ 0x9DDF, 0x3C00, 0x9DE0, 0x4A99, 0x9DE3, 0x4A9A, 0x9DE5, 0x4E41,
+ 0x9DE6, 0x1CEF, 0x9DE7, 0x434C, 0x9DE9, 0x4E42, 0x9DEB, 0x3C01,
+ 0x9DED, 0x1CF0, 0x9DEF, 0x1CF1, 0x9DF2, 0x0FEF, 0x9DF3, 0x4E43,
+ 0x9DF4, 0x3C02, 0x9DF8, 0x1CEE, 0x9DF9, 0x0B4B, 0x9DFA, 0x085D,
+ 0x9DFD, 0x1CF2, 0x9E02, 0x4A9D, 0x9E07, 0x434D, 0x9E0A, 0x4A9C,
+ 0x9E0D, 0x4A9E, 0x9E15, 0x3C03, 0x9E19, 0x220C, 0x9E1A, 0x1CF3,
+ 0x9E1B, 0x1CF4, 0x9E1C, 0x4A9F, 0x9E1D, 0x3C04, 0x9E1E, 0x1CF5,
+ 0x9E75, 0x1CF6, 0x9E78, 0x0768, 0x9E79, 0x1CF7, 0x9E7A, 0x4E44,
+ 0x9E7B, 0x4AA0, 0x9E7C, 0x1DFD, 0x9E7D, 0x1CF8, 0x9E7F, 0x08DB,
+ 0x9E80, 0x4AA2, 0x9E81, 0x1CF9, 0x9E82, 0x4E45, 0x9E83, 0x4E46,
+ 0x9E84, 0x4E47, 0x9E85, 0x4AA3, 0x9E88, 0x1CFA, 0x9E8B, 0x1CFB,
+ 0x9E8C, 0x1CFC, 0x9E91, 0x1CFF, 0x9E92, 0x1CFD, 0x9E93, 0x0FE2,
+ 0x9E95, 0x1CFE, 0x9E97, 0x0FB7, 0x9E9B, 0x4AA4, 0x9E9D, 0x1D00,
+ 0x9E9E, 0x434E, 0x9E9F, 0x0FA3, 0x9EA4, 0x3C05, 0x9EA5, 0x1D01,
+ 0x9EA6, 0x0D34, 0x9EA8, 0x3C06, 0x9EA9, 0x1D02, 0x9EAA, 0x1D04,
+ 0x9EAC, 0x3C07, 0x9EAD, 0x1D05, 0x9EAF, 0x434F, 0x9EB0, 0x4E48,
+ 0x9EB4, 0x1E02, 0x9EB5, 0x1E75, 0x9EB8, 0x1D03, 0x9EB9, 0x07FF,
+ 0x9EBA, 0x0ED9, 0x9EBB, 0x0E91, 0x9EBC, 0x1284, 0x9EBD, 0x4AA6,
+ 0x9EBE, 0x14FF, 0x9EBF, 0x0EA9, 0x9EC3, 0x340B, 0x9EC4, 0x052B,
+ 0x9ECC, 0x1D07, 0x9ECD, 0x066A, 0x9ECE, 0x1D08, 0x9ECF, 0x1D09,
+ 0x9ED0, 0x1D0A, 0x9ED1, 0x220D, 0x9ED2, 0x0807, 0x9ED4, 0x1D0B,
+ 0x9ED8, 0x160D, 0x9ED9, 0x0EE7, 0x9EDB, 0x0B43, 0x9EDC, 0x1D0C,
+ 0x9EDD, 0x1D0E, 0x9EDE, 0x1D0D, 0x9EDF, 0x4AA8, 0x9EE0, 0x1D0F,
+ 0x9EE4, 0x4E49, 0x9EE5, 0x1D10, 0x9EE7, 0x3C08, 0x9EE8, 0x1D11,
+ 0x9EEE, 0x3C09, 0x9EEF, 0x1D12, 0x9EF0, 0x4E4A, 0x9EF2, 0x4E4B,
+ 0x9EF4, 0x1D13, 0x9EF6, 0x1D14, 0x9EF7, 0x1D15, 0x9EF9, 0x1D16,
+ 0x9EFB, 0x1D17, 0x9EFC, 0x1D18, 0x9EFD, 0x1D19, 0x9EFF, 0x4AA9,
+ 0x9F02, 0x4AAA, 0x9F03, 0x4AAC, 0x9F07, 0x1D1A, 0x9F08, 0x1D1B,
+ 0x9F09, 0x4E4C, 0x9F0E, 0x0C1E, 0x9F0F, 0x4E4D, 0x9F10, 0x3C0A,
+ 0x9F12, 0x3C0B, 0x9F13, 0x0791, 0x9F14, 0x4E4E, 0x9F15, 0x1D1D,
+ 0x9F17, 0x3C0C, 0x9F19, 0x3C0D, 0x9F1B, 0x4E4F, 0x9F20, 0x0ACF,
+ 0x9F21, 0x1D1E, 0x9F22, 0x4E50, 0x9F26, 0x4E51, 0x9F2A, 0x4E52,
+ 0x9F2B, 0x4E53, 0x9F2C, 0x1D1F, 0x9F2F, 0x3C0E, 0x9F34, 0x4E54,
+ 0x9F37, 0x3C0F, 0x9F39, 0x3C10, 0x9F3A, 0x4AAD, 0x9F3B, 0x0D93,
+ 0x9F3D, 0x4AAE, 0x9F3E, 0x1D20, 0x9F41, 0x3C11, 0x9F45, 0x3C12,
+ 0x9F46, 0x4AAF, 0x9F4A, 0x1D21, 0x9F4B, 0x170A, 0x9F4E, 0x1A7B,
+ 0x9F4F, 0x1C06, 0x9F52, 0x1D22, 0x9F53, 0x4AB0, 0x9F54, 0x1D23,
+ 0x9F55, 0x4AB1, 0x9F57, 0x3C13, 0x9F58, 0x4AB2, 0x9F5A, 0x4E55,
+ 0x9F5D, 0x4AB4, 0x9F5F, 0x1D25, 0x9F60, 0x1D26, 0x9F61, 0x1D27,
+ 0x9F62, 0x0FB8, 0x9F63, 0x1D24, 0x9F66, 0x1D28, 0x9F67, 0x1D29,
+ 0x9F68, 0x3C14, 0x9F69, 0x4AB6, 0x9F6A, 0x1D2B, 0x9F6C, 0x1D2A,
+ 0x9F6D, 0x4AB7, 0x9F6F, 0x4E56, 0x9F70, 0x4AB8, 0x9F71, 0x3C15,
+ 0x9F72, 0x1D2D, 0x9F75, 0x3C16, 0x9F76, 0x1D2E, 0x9F77, 0x1D2C,
+ 0x9F8D, 0x0F7E, 0x9F90, 0x3C17, 0x9F94, 0x3C18, 0x9F95, 0x1D2F,
+ 0x9F97, 0x4350, 0x9F9C, 0x1D30, 0x9F9D, 0x1727, 0x9F9E, 0x4E57,
+ 0x9FA0, 0x1D31, 0x9FA2, 0x3C19, 0x9FA5, 0x4E58, 0xF860, 0x3C54,
+ 0xF861, 0x3C55, 0xF862, 0x3C56, 0xF87A, 0x3C57, 0xF87F, 0x3C58,
+ 0xF909, 0x35AB, 0xF91D, 0x3450, 0xF91F, 0x3704, 0xF928, 0x4F4F,
+ 0xF929, 0x4F51, 0xF936, 0x3452, 0xF95F, 0x3693, 0xF970, 0x3420,
+ 0xF983, 0x3708, 0xF992, 0x1E81, 0xF993, 0x1E82, 0xF999, 0x1E83,
+ 0xF99A, 0x3711, 0xF9A2, 0x370F, 0xF9C3, 0x1E80, 0xF9D0, 0x3454,
+ 0xF9DC, 0x3451, 0xF9EC, 0x1E46, 0xFA03, 0x3684, 0xFA0E, 0x20DA,
+ 0xFA0F, 0x20E5, 0xFA10, 0x1E42, 0xFA11, 0x37D2, 0xFA12, 0x2121,
+ 0xFA13, 0x2131, 0xFA14, 0x2133, 0xFA15, 0x4F53, 0xFA16, 0x2164,
+ 0xFA17, 0x217B, 0xFA18, 0x2183, 0xFA19, 0x2184, 0xFA1A, 0x2185,
+ 0xFA1B, 0x2187, 0xFA1C, 0x218B, 0xFA1D, 0x218E, 0xFA1E, 0x2197,
+ 0xFA1F, 0x21A2, 0xFA20, 0x21A4, 0xFA21, 0x21A5, 0xFA22, 0x21AE,
+ 0xFA23, 0x21B6, 0xFA24, 0x4948, 0xFA25, 0x21B9, 0xFA26, 0x21BC,
+ 0xFA27, 0x21D8, 0xFA28, 0x21DF, 0xFA29, 0x21EF, 0xFA2A, 0x21FB,
+ 0xFA2B, 0x21FC, 0xFA2C, 0x21FE, 0xFA2D, 0x220B, 0xFA30, 0x3446,
+ 0xFA31, 0x3430, 0xFA32, 0x344D, 0xFA33, 0x3449, 0xFA34, 0x341A,
+ 0xFA35, 0x3442, 0xFA36, 0x1DE3, 0xFA37, 0x3436, 0xFA38, 0x3415,
+ 0xFA39, 0x3448, 0xFA3A, 0x344B, 0xFA3B, 0x3431, 0xFA3C, 0x41C5,
+ 0xFA3D, 0x340E, 0xFA3E, 0x3410, 0xFA3F, 0x3433, 0xFA40, 0x3439,
+ 0xFA41, 0x3445, 0xFA42, 0x3416, 0xFA43, 0x3428, 0xFA44, 0x343F,
+ 0xFA45, 0x340F, 0xFA46, 0x1E14, 0xFA47, 0x3414, 0xFA48, 0x3423,
+ 0xFA49, 0x3C26, 0xFA4A, 0x1E34, 0xFA4B, 0x3443, 0xFA4C, 0x3424,
+ 0xFA4D, 0x3421, 0xFA4E, 0x3417, 0xFA4F, 0x344F, 0xFA50, 0x342F,
+ 0xFA51, 0x3427, 0xFA52, 0x340D, 0xFA53, 0x343B, 0xFA54, 0x341F,
+ 0xFA55, 0x343D, 0xFA56, 0x342E, 0xFA57, 0x3457, 0xFA58, 0x47BE,
+ 0xFA59, 0x3440, 0xFA5A, 0x3429, 0xFA5B, 0x3425, 0xFA5C, 0x3426,
+ 0xFA5D, 0x3777, 0xFA5E, 0x3776, 0xFA5F, 0x3437, 0xFA60, 0x3413,
+ 0xFA61, 0x3422, 0xFA62, 0x3409, 0xFA63, 0x341B, 0xFA64, 0x3444,
+ 0xFA65, 0x3434, 0xFA66, 0x3C2B, 0xFA67, 0x3408, 0xFA68, 0x343E,
+ 0xFA69, 0x3419, 0xFA6A, 0x1E6C, 0xFB00, 0x248E, 0xFB01, 0x0070,
+ 0xFB02, 0x0071, 0xFB03, 0x248F, 0xFB04, 0x2490, 0xFE30, 0x1EDA,
+ 0xFE31, 0x1ED4, 0xFE32, 0x1ED5, 0xFE33, 0x1ED2, 0xFE35, 0x1EDB,
+ 0xFE36, 0x1EDC, 0xFE37, 0x1EE1, 0xFE38, 0x1EE2, 0xFE39, 0x1EDD,
+ 0xFE3A, 0x1EDE, 0xFE3B, 0x1EEB, 0xFE3C, 0x1EEC, 0xFE3D, 0x1EE5,
+ 0xFE3E, 0x1EE6, 0xFE3F, 0x1EE3, 0xFE40, 0x1EE4, 0xFE41, 0x1EE7,
+ 0xFE42, 0x1EE8, 0xFE43, 0x1EE9, 0xFE44, 0x1EEA, 0xFE45, 0x315F,
+ 0xFE46, 0x3160, 0xFE47, 0x1EDF, 0xFE48, 0x1EE0, 0xFF01, 0x0282,
+ 0xFF02, 0x1F47, 0xFF03, 0x02CC, 0xFF04, 0x02C8, 0xFF05, 0x02CB,
+ 0xFF06, 0x02CD, 0xFF07, 0x1F46, 0xFF08, 0x02A2, 0xFF09, 0x02A3,
+ 0xFF0A, 0x02CE, 0xFF0B, 0x02B4, 0xFF0C, 0x027C, 0xFF0D, 0x02B5,
+ 0xFF0E, 0x027D, 0xFF0F, 0x0297, 0xFF10, 0x030C, 0xFF11, 0x030D,
+ 0xFF12, 0x030E, 0xFF13, 0x030F, 0xFF14, 0x0310, 0xFF15, 0x0311,
+ 0xFF16, 0x0312, 0xFF17, 0x0313, 0xFF18, 0x0314, 0xFF19, 0x0315,
+ 0xFF1A, 0x027F, 0xFF1B, 0x0280, 0xFF1C, 0x02BB, 0xFF1D, 0x02B9,
+ 0xFF1E, 0x02BC, 0xFF1F, 0x0281, 0xFF20, 0x02CF, 0xFF21, 0x0316,
+ 0xFF22, 0x0317, 0xFF23, 0x0318, 0xFF24, 0x0319, 0xFF25, 0x031A,
+ 0xFF26, 0x031B, 0xFF27, 0x031C, 0xFF28, 0x031D, 0xFF29, 0x031E,
+ 0xFF2A, 0x031F, 0xFF2B, 0x0320, 0xFF2C, 0x0321, 0xFF2D, 0x0322,
+ 0xFF2E, 0x0323, 0xFF2F, 0x0324, 0xFF30, 0x0325, 0xFF31, 0x0326,
+ 0xFF32, 0x0327, 0xFF33, 0x0328, 0xFF34, 0x0329, 0xFF35, 0x032A,
+ 0xFF36, 0x032B, 0xFF37, 0x032C, 0xFF38, 0x032D, 0xFF39, 0x032E,
+ 0xFF3A, 0x032F, 0xFF3B, 0x02A6, 0xFF3C, 0x0298, 0xFF3D, 0x02A7,
+ 0xFF3E, 0x0288, 0xFF3F, 0x028A, 0xFF40, 0x0286, 0xFF41, 0x0330,
+ 0xFF42, 0x0331, 0xFF43, 0x0332, 0xFF44, 0x0333, 0xFF45, 0x0334,
+ 0xFF46, 0x0335, 0xFF47, 0x0336, 0xFF48, 0x0337, 0xFF49, 0x0338,
+ 0xFF4A, 0x0339, 0xFF4B, 0x033A, 0xFF4C, 0x033B, 0xFF4D, 0x033C,
+ 0xFF4E, 0x033D, 0xFF4F, 0x033E, 0xFF50, 0x033F, 0xFF51, 0x0340,
+ 0xFF52, 0x0341, 0xFF53, 0x0342, 0xFF54, 0x0343, 0xFF55, 0x0344,
+ 0xFF56, 0x0345, 0xFF57, 0x0346, 0xFF58, 0x0347, 0xFF59, 0x0348,
+ 0xFF5A, 0x0349, 0xFF5B, 0x02A8, 0xFF5C, 0x029B, 0xFF5D, 0x02A9,
+ 0xFF5E, 0x0299, 0xFF5F, 0x2F63, 0xFF60, 0x2F64, 0xFF61, 0x0147,
+ 0xFF62, 0x0148, 0xFF63, 0x0149, 0xFF64, 0x014A, 0xFF65, 0x014B,
+ 0xFF66, 0x014C, 0xFF67, 0x014D, 0xFF68, 0x014E, 0xFF69, 0x014F,
+ 0xFF6A, 0x0150, 0xFF6B, 0x0151, 0xFF6C, 0x0152, 0xFF6D, 0x0153,
+ 0xFF6E, 0x0154, 0xFF6F, 0x0155, 0xFF70, 0x0156, 0xFF71, 0x0157,
+ 0xFF72, 0x0158, 0xFF73, 0x0159, 0xFF74, 0x015A, 0xFF75, 0x015B,
+ 0xFF76, 0x015C, 0xFF77, 0x015D, 0xFF78, 0x015E, 0xFF79, 0x015F,
+ 0xFF7A, 0x0160, 0xFF7B, 0x0161, 0xFF7C, 0x0162, 0xFF7D, 0x0163,
+ 0xFF7E, 0x0164, 0xFF7F, 0x0165, 0xFF80, 0x0166, 0xFF81, 0x0167,
+ 0xFF82, 0x0168, 0xFF83, 0x0169, 0xFF84, 0x016A, 0xFF85, 0x016B,
+ 0xFF86, 0x016C, 0xFF87, 0x016D, 0xFF88, 0x016E, 0xFF89, 0x016F,
+ 0xFF8A, 0x0170, 0xFF8B, 0x0171, 0xFF8C, 0x0172, 0xFF8D, 0x0173,
+ 0xFF8E, 0x0174, 0xFF8F, 0x0175, 0xFF90, 0x0176, 0xFF91, 0x0177,
+ 0xFF92, 0x0178, 0xFF93, 0x0179, 0xFF94, 0x017A, 0xFF95, 0x017B,
+ 0xFF96, 0x017C, 0xFF97, 0x017D, 0xFF98, 0x017E, 0xFF99, 0x017F,
+ 0xFF9A, 0x0180, 0xFF9B, 0x0181, 0xFF9C, 0x0182, 0xFF9D, 0x0183,
+ 0xFF9E, 0x0184, 0xFF9F, 0x0185, 0xFFE0, 0x02C9, 0xFFE1, 0x02CA,
+ 0xFFE2, 0x02EF, 0xFFE3, 0x0289, 0xFFE4, 0x1F45, 0xFFE5, 0x02C7,
+ 0xFFE8, 0x0143,
+};
+extern const unsigned short g_FXCMAP_UniJIS_UTF16_H_5_DWord[384 * 3] = {
+ 0xD840, 0xDC0B, 0x360F, 0xD840, 0xDC89, 0x4351, 0xD840, 0xDC8A, 0x371C,
+ 0xD840, 0xDCA2, 0x4358, 0xD840, 0xDCA4, 0x435B, 0xD840, 0xDCB0, 0x3781,
+ 0xD840, 0xDCF5, 0x4E59, 0xD840, 0xDD58, 0x4E6B, 0xD840, 0xDDA2, 0x3621,
+ 0xD840, 0xDE13, 0x436B, 0xD840, 0xDF2B, 0x4382, 0xD840, 0xDF71, 0x438B,
+ 0xD840, 0xDF81, 0x4389, 0xD840, 0xDFF9, 0x438F, 0xD841, 0xDC4A, 0x4391,
+ 0xD841, 0xDD09, 0x4393, 0xD841, 0xDDB1, 0x4E70, 0xD841, 0xDDD6, 0x439C,
+ 0xD841, 0xDE11, 0x37D6, 0xD841, 0xDE28, 0x3719, 0xD841, 0xDEEC, 0x4E73,
+ 0xD841, 0xDF4F, 0x43A0, 0xD842, 0xDC07, 0x43A7, 0xD842, 0xDC3A, 0x43A9,
+ 0xD842, 0xDCB9, 0x43AF, 0xD842, 0xDD0E, 0x34D3, 0xD842, 0xDD7C, 0x43B3,
+ 0xD842, 0xDD9D, 0x43B4, 0xD842, 0xDE64, 0x35BB, 0xD842, 0xDED3, 0x43B9,
+ 0xD842, 0xDF1D, 0x43BC, 0xD842, 0xDF9F, 0x35EB, 0xD842, 0xDFB7, 0x358A,
+ 0xD843, 0xDD45, 0x43CF, 0xD843, 0xDD58, 0x4E7A, 0xD843, 0xDDE1, 0x43DD,
+ 0xD843, 0xDE64, 0x43EC, 0xD843, 0xDE6D, 0x43E4, 0xD843, 0xDE95, 0x43E3,
+ 0xD843, 0xDF5F, 0x43EF, 0xD844, 0xDE01, 0x4406, 0xD844, 0xDE3D, 0x3681,
+ 0xD844, 0xDE55, 0x4407, 0xD844, 0xDE74, 0x440D, 0xD844, 0xDE7B, 0x4409,
+ 0xD844, 0xDED7, 0x4415, 0xD844, 0xDEE4, 0x4414, 0xD844, 0xDEFD, 0x441B,
+ 0xD844, 0xDF1B, 0x41B0, 0xD844, 0xDF36, 0x441D, 0xD844, 0xDF44, 0x441E,
+ 0xD844, 0xDFC4, 0x4429, 0xD845, 0xDC6D, 0x4436, 0xD845, 0xDC6E, 0x41B5,
+ 0xD845, 0xDDD7, 0x4440, 0xD845, 0xDE47, 0x4448, 0xD845, 0xDEB4, 0x41C6,
+ 0xD845, 0xDF06, 0x4454, 0xD845, 0xDF42, 0x4455, 0xD846, 0xDCBD, 0x41C1,
+ 0xD846, 0xDDC3, 0x4475, 0xD846, 0xDE1A, 0x1E91, 0xD847, 0xDC56, 0x4483,
+ 0xD847, 0xDD2D, 0x4488, 0xD847, 0xDD45, 0x4489, 0xD847, 0xDD62, 0x448B,
+ 0xD847, 0xDD78, 0x448A, 0xD847, 0xDD92, 0x4494, 0xD847, 0xDD9C, 0x4490,
+ 0xD847, 0xDDA1, 0x448F, 0xD847, 0xDDB7, 0x4497, 0xD847, 0xDDE0, 0x4499,
+ 0xD847, 0xDE33, 0x449A, 0xD847, 0xDE34, 0x41CD, 0xD847, 0xDF1E, 0x44A7,
+ 0xD847, 0xDF76, 0x44AE, 0xD847, 0xDFFA, 0x44B1, 0xD848, 0xDD7B, 0x44BF,
+ 0xD848, 0xDE18, 0x4AA1, 0xD848, 0xDF1E, 0x44C5, 0xD848, 0xDFAD, 0x44C8,
+ 0xD849, 0xDE09, 0x3C53, 0xD849, 0xDEF3, 0x44E0, 0xD84A, 0xDC5B, 0x44EF,
+ 0xD84A, 0xDCAB, 0x44F5, 0xD84A, 0xDD8F, 0x44F9, 0xD84A, 0xDEB8, 0x4503,
+ 0xD84A, 0xDF46, 0x4510, 0xD84A, 0xDF4F, 0x4507, 0xD84A, 0xDF50, 0x4508,
+ 0xD84A, 0xDFA6, 0x4513, 0xD84B, 0xDC1D, 0x4512, 0xD84B, 0xDC24, 0x4516,
+ 0xD84B, 0xDDE1, 0x452E, 0xD84B, 0xDE42, 0x4E9C, 0xD84B, 0xDFEB, 0x4EA2,
+ 0xD84C, 0xDDB6, 0x4550, 0xD84C, 0xDDC3, 0x454E, 0xD84C, 0xDDC4, 0x41F8,
+ 0xD84C, 0xDDF5, 0x454F, 0xD84C, 0xDF72, 0x4561, 0xD84C, 0xDFD0, 0x4568,
+ 0xD84C, 0xDFD2, 0x4564, 0xD84C, 0xDFD3, 0x4563, 0xD84C, 0xDFD5, 0x456A,
+ 0xD84C, 0xDFDA, 0x456C, 0xD84C, 0xDFDF, 0x456E, 0xD84C, 0xDFE4, 0x4569,
+ 0xD84C, 0xDFFE, 0x3C3E, 0xD84D, 0xDC4A, 0x4576, 0xD84D, 0xDC4B, 0x4578,
+ 0xD84D, 0xDC51, 0x4577, 0xD84D, 0xDC65, 0x457C, 0xD84D, 0xDCE4, 0x4596,
+ 0xD84D, 0xDD5A, 0x4597, 0xD84D, 0xDD94, 0x45A3, 0xD84D, 0xDDC4, 0x4209,
+ 0xD84D, 0xDE38, 0x45B3, 0xD84D, 0xDE39, 0x45B1, 0xD84D, 0xDE3A, 0x3C21,
+ 0xD84D, 0xDE47, 0x45B2, 0xD84D, 0xDF0C, 0x45C7, 0xD84D, 0xDF1C, 0x45BE,
+ 0xD84D, 0xDF3F, 0x4212, 0xD84D, 0xDF63, 0x4214, 0xD84D, 0xDF64, 0x45CB,
+ 0xD84D, 0xDFE7, 0x45D3, 0xD84D, 0xDFFF, 0x45D2, 0xD84E, 0xDC24, 0x45D8,
+ 0xD84E, 0xDC3D, 0x45DD, 0xD84E, 0xDE98, 0x45E9, 0xD84F, 0xDC7F, 0x45F6,
+ 0xD84F, 0xDCBE, 0x37D5, 0xD84F, 0xDCFE, 0x3650, 0xD84F, 0xDD00, 0x4605,
+ 0xD84F, 0xDD0E, 0x47DA, 0xD84F, 0xDD40, 0x4616, 0xD84F, 0xDDD3, 0x4619,
+ 0xD84F, 0xDDF9, 0x4618, 0xD84F, 0xDDFA, 0x4617, 0xD84F, 0xDF7E, 0x463F,
+ 0xD850, 0xDC4B, 0x4EC8, 0xD850, 0xDC96, 0x464E, 0xD850, 0xDD03, 0x4653,
+ 0xD850, 0xDDC6, 0x465F, 0xD850, 0xDDFE, 0x4662, 0xD850, 0xDEEE, 0x37CA,
+ 0xD850, 0xDFBC, 0x4677, 0xD850, 0xDFD0, 0x1E9E, 0xD851, 0xDE29, 0x4681,
+ 0xD851, 0xDEA5, 0x4687, 0xD851, 0xDFF1, 0x424A, 0xD852, 0xDC96, 0x469D,
+ 0xD852, 0xDE4D, 0x46B8, 0xD852, 0xDF56, 0x46C5, 0xD852, 0xDF6F, 0x46C7,
+ 0xD853, 0xDC16, 0x46CC, 0xD853, 0xDD14, 0x36AB, 0xD853, 0xDE04, 0x4E5A,
+ 0xD853, 0xDE0E, 0x46EE, 0xD853, 0xDE37, 0x46F2, 0xD853, 0xDE6A, 0x46F7,
+ 0xD853, 0xDE8B, 0x46FA, 0xD853, 0xDFF2, 0x4E5B, 0xD854, 0xDC4A, 0x4705,
+ 0xD854, 0xDC55, 0x4707, 0xD854, 0xDD22, 0x4709, 0xD854, 0xDDA9, 0x470E,
+ 0xD854, 0xDDCD, 0x4711, 0xD854, 0xDDE5, 0x4710, 0xD854, 0xDE1E, 0x4713,
+ 0xD854, 0xDE4C, 0x4715, 0xD855, 0xDC2E, 0x4721, 0xD855, 0xDC8E, 0x426D,
+ 0xD855, 0xDCD9, 0x4729, 0xD855, 0xDD0E, 0x4271, 0xD855, 0xDDA7, 0x4735,
+ 0xD855, 0xDE7F, 0x36FB, 0xD855, 0xDF71, 0x427A, 0xD855, 0xDFA9, 0x4748,
+ 0xD855, 0xDFB4, 0x4749, 0xD856, 0xDC74, 0x1DF6, 0xD856, 0xDDC4, 0x4280,
+ 0xD856, 0xDDCC, 0x4E90, 0xD856, 0xDDD4, 0x475C, 0xD856, 0xDEE3, 0x4765,
+ 0xD856, 0xDEE4, 0x4764, 0xD856, 0xDEF1, 0x4766, 0xD856, 0xDFB2, 0x4775,
+ 0xD857, 0xDC4B, 0x477E, 0xD857, 0xDC64, 0x477F, 0xD857, 0xDDA1, 0x4289,
+ 0xD857, 0xDE2E, 0x478E, 0xD857, 0xDE56, 0x478F, 0xD857, 0xDE62, 0x4792,
+ 0xD857, 0xDE65, 0x4790, 0xD857, 0xDEC2, 0x4797, 0xD857, 0xDED8, 0x4795,
+ 0xD857, 0xDEE8, 0x4799, 0xD857, 0xDF23, 0x479A, 0xD857, 0xDF5C, 0x479C,
+ 0xD857, 0xDFD4, 0x47A3, 0xD857, 0xDFE0, 0x47A2, 0xD857, 0xDFFB, 0x47A9,
+ 0xD858, 0xDC0C, 0x47A8, 0xD858, 0xDC17, 0x47B0, 0xD858, 0xDC60, 0x47B3,
+ 0xD858, 0xDCED, 0x47BD, 0xD858, 0xDE70, 0x47D1, 0xD858, 0xDE86, 0x47D2,
+ 0xD858, 0xDF4C, 0x4F57, 0xD859, 0xDC02, 0x47DE, 0xD859, 0xDE7E, 0x47F0,
+ 0xD859, 0xDEB0, 0x3714, 0xD859, 0xDF1D, 0x47FE, 0xD85A, 0xDCDD, 0x480C,
+ 0xD85A, 0xDCEA, 0x480E, 0xD85A, 0xDD51, 0x354E, 0xD85A, 0xDD6F, 0x4812,
+ 0xD85A, 0xDD99, 0x3736, 0xD85A, 0xDDDD, 0x4814, 0xD85A, 0xDE1E, 0x4817,
+ 0xD85A, 0xDE58, 0x481B, 0xD85A, 0xDE8C, 0x481F, 0xD85A, 0xDEB7, 0x4822,
+ 0xD85A, 0xDEFF, 0x42A7, 0xD85B, 0xDC29, 0x4446, 0xD85B, 0xDC73, 0x484A,
+ 0xD85B, 0xDC9E, 0x4EEE, 0xD85B, 0xDCDD, 0x4853, 0xD85B, 0xDE40, 0x42C1,
+ 0xD85B, 0xDE65, 0x4860, 0xD85B, 0xDF94, 0x4870, 0xD85B, 0xDFF6, 0x487A,
+ 0xD85B, 0xDFF7, 0x487B, 0xD85B, 0xDFF8, 0x4879, 0xD85C, 0xDCF4, 0x42CF,
+ 0xD85C, 0xDD0D, 0x488B, 0xD85C, 0xDD39, 0x488E, 0xD85C, 0xDFDA, 0x48B3,
+ 0xD85C, 0xDFDB, 0x48B2, 0xD85C, 0xDFFE, 0x48B9, 0xD85D, 0xDC10, 0x48BC,
+ 0xD85D, 0xDC49, 0x48C0, 0xD85D, 0xDE14, 0x48CE, 0xD85D, 0xDE15, 0x48CD,
+ 0xD85D, 0xDE31, 0x48D0, 0xD85D, 0xDE84, 0x42DD, 0xD85D, 0xDE93, 0x48D5,
+ 0xD85D, 0xDF0E, 0x48DA, 0xD85D, 0xDF23, 0x48DC, 0xD85D, 0xDF52, 0x48E0,
+ 0xD85E, 0xDD85, 0x48F0, 0xD85E, 0xDDB4, 0x4EA5, 0xD85E, 0xDE84, 0x48FC,
+ 0xD85E, 0xDFB3, 0x490B, 0xD85E, 0xDFBE, 0x490D, 0xD85E, 0xDFC7, 0x490E,
+ 0xD85F, 0xDC3C, 0x4EFC, 0xD85F, 0xDCB8, 0x4914, 0xD85F, 0xDD73, 0x4E5C,
+ 0xD85F, 0xDDA0, 0x491C, 0xD85F, 0xDE10, 0x491E, 0xD85F, 0xDFB7, 0x364A,
+ 0xD860, 0xDC8A, 0x4927, 0xD860, 0xDCBB, 0x492D, 0xD860, 0xDE77, 0x42F4,
+ 0xD860, 0xDE82, 0x4939, 0xD860, 0xDEF3, 0x493B, 0xD860, 0xDFCD, 0x42FA,
+ 0xD861, 0xDC0C, 0x4942, 0xD861, 0xDC55, 0x4945, 0xD861, 0xDD6B, 0x4952,
+ 0xD861, 0xDDC8, 0x4955, 0xD861, 0xDDC9, 0x4956, 0xD861, 0xDED7, 0x4960,
+ 0xD861, 0xDEFA, 0x4963, 0xD862, 0xDD46, 0x497C, 0xD862, 0xDD49, 0x497B,
+ 0xD862, 0xDD6B, 0x4981, 0xD862, 0xDD87, 0x37AD, 0xD862, 0xDD88, 0x4988,
+ 0xD862, 0xDDBA, 0x4992, 0xD862, 0xDDBB, 0x4993, 0xD862, 0xDE1E, 0x499B,
+ 0xD862, 0xDE29, 0x499C, 0xD862, 0xDE43, 0x49A0, 0xD862, 0xDE71, 0x499F,
+ 0xD862, 0xDE99, 0x49A7, 0xD862, 0xDECD, 0x49A8, 0xD862, 0xDEDD, 0x49AF,
+ 0xD862, 0xDEE4, 0x49AE, 0xD862, 0xDFC1, 0x49BA, 0xD862, 0xDFEF, 0x49BB,
+ 0xD863, 0xDCDD, 0x1DD9, 0xD863, 0xDD10, 0x49C2, 0xD863, 0xDD71, 0x49C3,
+ 0xD863, 0xDDFB, 0x49C5, 0xD863, 0xDE17, 0x37B0, 0xD863, 0xDE1F, 0x49C6,
+ 0xD863, 0xDE36, 0x49CA, 0xD863, 0xDE89, 0x49CD, 0xD863, 0xDEEB, 0x49CF,
+ 0xD863, 0xDEF6, 0x1DF9, 0xD863, 0xDF32, 0x49D1, 0xD863, 0xDFF8, 0x49D7,
+ 0xD864, 0xDEA0, 0x49E5, 0xD864, 0xDEB1, 0x49E6, 0xD865, 0xDC90, 0x49F7,
+ 0xD865, 0xDDCF, 0x4A00, 0xD865, 0xDE7F, 0x3619, 0xD865, 0xDEF0, 0x4A0F,
+ 0xD865, 0xDF19, 0x4A12, 0xD865, 0xDF50, 0x4A16, 0xD866, 0xDCC6, 0x4A27,
+ 0xD866, 0xDE72, 0x4A39, 0xD867, 0xDD4B, 0x3595, 0xD867, 0xDDDB, 0x4A52,
+ 0xD867, 0xDE15, 0x4A5C, 0xD867, 0xDE3D, 0x4F5B, 0xD867, 0xDE49, 0x4A5E,
+ 0xD867, 0xDE8A, 0x4A5D, 0xD867, 0xDEC4, 0x4A66, 0xD867, 0xDEDB, 0x4A6E,
+ 0xD867, 0xDEE9, 0x4A6B, 0xD867, 0xDFCE, 0x4A7F, 0xD867, 0xDFD7, 0x4A7F,
+ 0xD868, 0xDC1A, 0x4A85, 0xD868, 0xDC2F, 0x4A83, 0xD868, 0xDC82, 0x4A8C,
+ 0xD868, 0xDCF9, 0x4A8B, 0xD868, 0xDD90, 0x434B, 0xD868, 0xDEB2, 0x4E68,
+ 0xD868, 0xDF8C, 0x4AA5, 0xD869, 0xDC37, 0x4AA7, 0xD869, 0xDDF1, 0x4AB3,
+ 0xD869, 0xDE02, 0x4AB5, 0xD869, 0xDE1A, 0x4F5C, 0xD869, 0xDEB2, 0x4AB9,
+ 0xD87E, 0xDC04, 0x3C1C, 0xD87E, 0xDC0F, 0x1E86, 0xD87E, 0xDC15, 0x4E5D,
+ 0xD87E, 0xDC18, 0x1E89, 0xD87E, 0xDC1A, 0x3682, 0xD87E, 0xDC22, 0x3574,
+ 0xD87E, 0xDC28, 0x35EF, 0xD87E, 0xDC2C, 0x371D, 0xD87E, 0xDC33, 0x3597,
+ 0xD87E, 0xDC3F, 0x35F7, 0xD87E, 0xDC46, 0x4E5E, 0xD87E, 0xDC52, 0x3611,
+ 0xD87E, 0xDC62, 0x36AE, 0xD87E, 0xDC6D, 0x3729, 0xD87E, 0xDC73, 0x3608,
+ 0xD87E, 0xDC77, 0x1E4A, 0xD87E, 0xDC84, 0x1E36, 0xD87E, 0xDC99, 0x4E5F,
+ 0xD87E, 0xDC9A, 0x3668, 0xD87E, 0xDCA6, 0x4E60, 0xD87E, 0xDCAC, 0x35B6,
+ 0xD87E, 0xDCB2, 0x362B, 0xD87E, 0xDCB6, 0x3731, 0xD87E, 0xDCD3, 0x1E88,
+ 0xD87E, 0xDCDB, 0x373C, 0xD87E, 0xDCDC, 0x1E0F, 0xD87E, 0xDCE1, 0x37D3,
+ 0xD87E, 0xDCE5, 0x4E61, 0xD87E, 0xDCEA, 0x356F, 0xD87E, 0xDCED, 0x1DF1,
+ 0xD87E, 0xDCFC, 0x3558, 0xD87E, 0xDD03, 0x35C8, 0xD87E, 0xDD0B, 0x35E9,
+ 0xD87E, 0xDD0F, 0x366C, 0xD87E, 0xDD1A, 0x365C, 0xD87E, 0xDD20, 0x1E9F,
+ 0xD87E, 0xDD21, 0x35F1, 0xD87E, 0xDD45, 0x342D, 0xD87E, 0xDD47, 0x361E,
+ 0xD87E, 0xDD6C, 0x3764, 0xD87E, 0xDD95, 0x3566, 0xD87E, 0xDDD0, 0x36F4,
+ 0xD87E, 0xDDDE, 0x4E62, 0xD87E, 0xDDDF, 0x36F5, 0xD87E, 0xDDF4, 0x3BA5,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UTF16-V_5.cpp b/core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UTF16-V_5.cpp
index ac83c75aec..c0073d717c 100644
--- a/core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UTF16-V_5.cpp
+++ b/core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UTF16-V_5.cpp
@@ -1,81 +1,81 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-extern const unsigned short g_FXCMAP_UniJIS_UTF16_V_5[289 * 2] = {
- 0x00B0, 0x204D, 0x2010, 0x1ED5, 0x2015, 0x1ED4, 0x2016, 0x1ED7,
- 0x2025, 0x1EDA, 0x2026, 0x1ED9, 0x2032, 0x2051, 0x2033, 0x205B,
- 0x2190, 0x02E2, 0x2191, 0x02E0, 0x2192, 0x02E3, 0x2193, 0x02E1,
- 0x21C4, 0x2077, 0x21C5, 0x2076, 0x21C6, 0x2078, 0x21E6, 0x1F4C,
- 0x21E7, 0x1F4E, 0x21E8, 0x1F4B, 0x21E9, 0x1F4D, 0x239B, 0x2F74,
- 0x239C, 0x2F88, 0x239D, 0x2F73, 0x239E, 0x2F76, 0x239F, 0x2F88,
- 0x23A0, 0x2F75, 0x23A1, 0x2F7C, 0x23A2, 0x2F88, 0x23A3, 0x2F7B,
- 0x23A4, 0x2F7E, 0x23A5, 0x2F88, 0x23A6, 0x2F7D, 0x23A7, 0x1FE8,
- 0x23A8, 0x1FE7, 0x23A9, 0x1FE6, 0x23AA, 0x2F88, 0x23AB, 0x1FEC,
- 0x23AC, 0x1FEB, 0x23AD, 0x1FEA, 0x23B0, 0x3FDE, 0x23B1, 0x3FDF,
- 0x2500, 0x1D39, 0x2501, 0x1D3A, 0x2502, 0x1D37, 0x2503, 0x1D38,
- 0x2504, 0x1D3D, 0x2505, 0x1D3E, 0x2506, 0x1D3B, 0x2507, 0x1D3C,
- 0x2508, 0x1D41, 0x2509, 0x1D42, 0x250A, 0x1D3F, 0x250B, 0x1D40,
- 0x250C, 0x1D47, 0x250D, 0x1D49, 0x250E, 0x1D48, 0x250F, 0x1D4A,
- 0x2510, 0x1D4F, 0x2511, 0x1D51, 0x2512, 0x1D50, 0x2513, 0x1D52,
- 0x2514, 0x1D43, 0x2515, 0x1D45, 0x2516, 0x1D44, 0x2517, 0x1D46,
- 0x2518, 0x1D4B, 0x2519, 0x1D4D, 0x251A, 0x1D4C, 0x251B, 0x1D4E,
- 0x251C, 0x1D63, 0x251D, 0x1D67, 0x251E, 0x1D65, 0x251F, 0x1D64,
- 0x2520, 0x1D66, 0x2521, 0x1D69, 0x2522, 0x1D68, 0x2523, 0x1D6A,
- 0x2524, 0x1D6B, 0x2525, 0x1D6F, 0x2526, 0x1D6D, 0x2527, 0x1D6C,
- 0x2528, 0x1D6E, 0x2529, 0x1D71, 0x252A, 0x1D70, 0x252B, 0x1D72,
- 0x252C, 0x1D5B, 0x252D, 0x1D5D, 0x252E, 0x1D5E, 0x252F, 0x1D5F,
- 0x2530, 0x1D5C, 0x2531, 0x1D60, 0x2532, 0x1D61, 0x2533, 0x1D62,
- 0x2534, 0x1D53, 0x2535, 0x1D55, 0x2536, 0x1D56, 0x2537, 0x1D57,
- 0x2538, 0x1D54, 0x2539, 0x1D58, 0x253A, 0x1D59, 0x253B, 0x1D5A,
- 0x253D, 0x1D77, 0x253E, 0x1D78, 0x253F, 0x1D79, 0x2540, 0x1D75,
- 0x2541, 0x1D74, 0x2542, 0x1D76, 0x2543, 0x1D7B, 0x2544, 0x1D7D,
- 0x2545, 0x1D7A, 0x2546, 0x1D7C, 0x2547, 0x1D81, 0x2548, 0x1D80,
- 0x2549, 0x1D7E, 0x254A, 0x1D7F, 0x261C, 0x201D, 0x261D, 0x201B,
- 0x261E, 0x201E, 0x261F, 0x201C, 0x2702, 0x2F92, 0x27A1, 0x2011,
- 0x3001, 0x1ECF, 0x3002, 0x1ED0, 0x3008, 0x1EE3, 0x3009, 0x1EE4,
- 0x300A, 0x1EE5, 0x300B, 0x1EE6, 0x300C, 0x1EE7, 0x300D, 0x1EE8,
- 0x300E, 0x1EE9, 0x300F, 0x1EEA, 0x3010, 0x1EEB, 0x3011, 0x1EEC,
- 0x3014, 0x1EDD, 0x3015, 0x1EDE, 0x3016, 0x3FC9, 0x3017, 0x3FCA,
- 0x3018, 0x2F6B, 0x3019, 0x2F6C, 0x301C, 0x1ED6, 0x301D, 0x1F14,
- 0x301F, 0x1F15, 0x303B, 0x2F4B, 0x3041, 0x1EEE, 0x3043, 0x1EEF,
- 0x3045, 0x1EF0, 0x3047, 0x1EF1, 0x3049, 0x1EF2, 0x3063, 0x1EF3,
- 0x3083, 0x1EF4, 0x3085, 0x1EF5, 0x3087, 0x1EF6, 0x308E, 0x1EF7,
- 0x3095, 0x2048, 0x3096, 0x2049, 0x309B, 0x2050, 0x309C, 0x204F,
- 0x30A0, 0x3FCB, 0x30A1, 0x1EF8, 0x30A3, 0x1EF9, 0x30A5, 0x1EFA,
- 0x30A7, 0x1EFB, 0x30A9, 0x1EFC, 0x30C3, 0x1EFD, 0x30E3, 0x1EFE,
- 0x30E5, 0x1EFF, 0x30E7, 0x1F00, 0x30EE, 0x1F01, 0x30F5, 0x1F02,
- 0x30F6, 0x1F03, 0x30FC, 0x1ED3, 0x31F0, 0x3FCD, 0x31F1, 0x3FCE,
- 0x31F2, 0x3FCF, 0x31F3, 0x3FD0, 0x31F4, 0x3FD1, 0x31F5, 0x3FD2,
- 0x31F6, 0x3FD3, 0x31F7, 0x3FD4, 0x31F8, 0x3FD5, 0x31F9, 0x3FD6,
- 0x31FA, 0x3FD8, 0x31FB, 0x3FD9, 0x31FC, 0x3FDA, 0x31FD, 0x3FDB,
- 0x31FE, 0x3FDC, 0x31FF, 0x3FDD, 0x3300, 0x209E, 0x3301, 0x2EB6,
- 0x3302, 0x2EB7, 0x3303, 0x2092, 0x3304, 0x2EB8, 0x3305, 0x208D,
- 0x3306, 0x2EB9, 0x3307, 0x2EBD, 0x3308, 0x2EBB, 0x3309, 0x2EC0,
- 0x330A, 0x2EBE, 0x330B, 0x2EC2, 0x330C, 0x2EC4, 0x330D, 0x1F0E,
- 0x330E, 0x2EC5, 0x330F, 0x2EC6, 0x3310, 0x2EC7, 0x3311, 0x2EC8,
- 0x3312, 0x2EC9, 0x3313, 0x2ECA, 0x3314, 0x1F05, 0x3315, 0x2094,
- 0x3316, 0x208A, 0x3317, 0x2ECC, 0x3318, 0x2093, 0x3319, 0x2ECE,
- 0x331A, 0x2ED0, 0x331B, 0x2ED1, 0x331C, 0x2ED2, 0x331D, 0x2ED3,
- 0x331E, 0x20A1, 0x331F, 0x2ED4, 0x3320, 0x2ED5, 0x3321, 0x2ED6,
- 0x3322, 0x2089, 0x3323, 0x209C, 0x3324, 0x2ED7, 0x3325, 0x2ED9,
- 0x3326, 0x1F0F, 0x3327, 0x1F09, 0x3328, 0x2EDC, 0x3329, 0x2EDD,
- 0x332A, 0x20A4, 0x332B, 0x1F11, 0x332D, 0x2EDF, 0x332E, 0x2EE2,
- 0x332F, 0x2EE3, 0x3330, 0x2EE4, 0x3331, 0x20A6, 0x3332, 0x2EE5,
- 0x3333, 0x208E, 0x3334, 0x2EE8, 0x3335, 0x2EE9, 0x3336, 0x1F0B,
- 0x3337, 0x2EEE, 0x3338, 0x2EF0, 0x3339, 0x2097, 0x333A, 0x2EF1,
- 0x333B, 0x209D, 0x333C, 0x2EEA, 0x333D, 0x2EF2, 0x333E, 0x2EF4,
- 0x333F, 0x2EF5, 0x3340, 0x2EF6, 0x3341, 0x2EF3, 0x3342, 0x209B,
- 0x3343, 0x2EF7, 0x3344, 0x2EF8, 0x3345, 0x2EF9, 0x3346, 0x2EFA,
- 0x3347, 0x20A5, 0x3348, 0x2EFB, 0x3349, 0x1F04, 0x334A, 0x1F12,
- 0x334B, 0x2EFC, 0x334C, 0x2EFD, 0x334D, 0x1F07, 0x334E, 0x2091,
- 0x334F, 0x2EFE, 0x3350, 0x2EFF, 0x3351, 0x1F0C, 0x3352, 0x2F02,
- 0x3353, 0x2F06, 0x3354, 0x2F03, 0x3355, 0x2F07, 0x3356, 0x2F08,
- 0x3357, 0x2098, 0x337F, 0x2084, 0xFF08, 0x1EDB, 0xFF09, 0x1EDC,
- 0xFF0C, 0x204C, 0xFF0E, 0x2052, 0xFF1D, 0x1EED, 0xFF3B, 0x1EDF,
- 0xFF3D, 0x1EE0, 0xFF3F, 0x1ED2, 0xFF5B, 0x1EE1, 0xFF5C, 0x1ED8,
- 0xFF5D, 0x1EE2, 0xFF5E, 0x1ED6, 0xFF5F, 0x2F6D, 0xFF60, 0x2F6E,
- 0xFFE3, 0x1ED1,
-};
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_UniJIS_UTF16_V_5[289 * 2] = {
+ 0x00B0, 0x204D, 0x2010, 0x1ED5, 0x2015, 0x1ED4, 0x2016, 0x1ED7,
+ 0x2025, 0x1EDA, 0x2026, 0x1ED9, 0x2032, 0x2051, 0x2033, 0x205B,
+ 0x2190, 0x02E2, 0x2191, 0x02E0, 0x2192, 0x02E3, 0x2193, 0x02E1,
+ 0x21C4, 0x2077, 0x21C5, 0x2076, 0x21C6, 0x2078, 0x21E6, 0x1F4C,
+ 0x21E7, 0x1F4E, 0x21E8, 0x1F4B, 0x21E9, 0x1F4D, 0x239B, 0x2F74,
+ 0x239C, 0x2F88, 0x239D, 0x2F73, 0x239E, 0x2F76, 0x239F, 0x2F88,
+ 0x23A0, 0x2F75, 0x23A1, 0x2F7C, 0x23A2, 0x2F88, 0x23A3, 0x2F7B,
+ 0x23A4, 0x2F7E, 0x23A5, 0x2F88, 0x23A6, 0x2F7D, 0x23A7, 0x1FE8,
+ 0x23A8, 0x1FE7, 0x23A9, 0x1FE6, 0x23AA, 0x2F88, 0x23AB, 0x1FEC,
+ 0x23AC, 0x1FEB, 0x23AD, 0x1FEA, 0x23B0, 0x3FDE, 0x23B1, 0x3FDF,
+ 0x2500, 0x1D39, 0x2501, 0x1D3A, 0x2502, 0x1D37, 0x2503, 0x1D38,
+ 0x2504, 0x1D3D, 0x2505, 0x1D3E, 0x2506, 0x1D3B, 0x2507, 0x1D3C,
+ 0x2508, 0x1D41, 0x2509, 0x1D42, 0x250A, 0x1D3F, 0x250B, 0x1D40,
+ 0x250C, 0x1D47, 0x250D, 0x1D49, 0x250E, 0x1D48, 0x250F, 0x1D4A,
+ 0x2510, 0x1D4F, 0x2511, 0x1D51, 0x2512, 0x1D50, 0x2513, 0x1D52,
+ 0x2514, 0x1D43, 0x2515, 0x1D45, 0x2516, 0x1D44, 0x2517, 0x1D46,
+ 0x2518, 0x1D4B, 0x2519, 0x1D4D, 0x251A, 0x1D4C, 0x251B, 0x1D4E,
+ 0x251C, 0x1D63, 0x251D, 0x1D67, 0x251E, 0x1D65, 0x251F, 0x1D64,
+ 0x2520, 0x1D66, 0x2521, 0x1D69, 0x2522, 0x1D68, 0x2523, 0x1D6A,
+ 0x2524, 0x1D6B, 0x2525, 0x1D6F, 0x2526, 0x1D6D, 0x2527, 0x1D6C,
+ 0x2528, 0x1D6E, 0x2529, 0x1D71, 0x252A, 0x1D70, 0x252B, 0x1D72,
+ 0x252C, 0x1D5B, 0x252D, 0x1D5D, 0x252E, 0x1D5E, 0x252F, 0x1D5F,
+ 0x2530, 0x1D5C, 0x2531, 0x1D60, 0x2532, 0x1D61, 0x2533, 0x1D62,
+ 0x2534, 0x1D53, 0x2535, 0x1D55, 0x2536, 0x1D56, 0x2537, 0x1D57,
+ 0x2538, 0x1D54, 0x2539, 0x1D58, 0x253A, 0x1D59, 0x253B, 0x1D5A,
+ 0x253D, 0x1D77, 0x253E, 0x1D78, 0x253F, 0x1D79, 0x2540, 0x1D75,
+ 0x2541, 0x1D74, 0x2542, 0x1D76, 0x2543, 0x1D7B, 0x2544, 0x1D7D,
+ 0x2545, 0x1D7A, 0x2546, 0x1D7C, 0x2547, 0x1D81, 0x2548, 0x1D80,
+ 0x2549, 0x1D7E, 0x254A, 0x1D7F, 0x261C, 0x201D, 0x261D, 0x201B,
+ 0x261E, 0x201E, 0x261F, 0x201C, 0x2702, 0x2F92, 0x27A1, 0x2011,
+ 0x3001, 0x1ECF, 0x3002, 0x1ED0, 0x3008, 0x1EE3, 0x3009, 0x1EE4,
+ 0x300A, 0x1EE5, 0x300B, 0x1EE6, 0x300C, 0x1EE7, 0x300D, 0x1EE8,
+ 0x300E, 0x1EE9, 0x300F, 0x1EEA, 0x3010, 0x1EEB, 0x3011, 0x1EEC,
+ 0x3014, 0x1EDD, 0x3015, 0x1EDE, 0x3016, 0x3FC9, 0x3017, 0x3FCA,
+ 0x3018, 0x2F6B, 0x3019, 0x2F6C, 0x301C, 0x1ED6, 0x301D, 0x1F14,
+ 0x301F, 0x1F15, 0x303B, 0x2F4B, 0x3041, 0x1EEE, 0x3043, 0x1EEF,
+ 0x3045, 0x1EF0, 0x3047, 0x1EF1, 0x3049, 0x1EF2, 0x3063, 0x1EF3,
+ 0x3083, 0x1EF4, 0x3085, 0x1EF5, 0x3087, 0x1EF6, 0x308E, 0x1EF7,
+ 0x3095, 0x2048, 0x3096, 0x2049, 0x309B, 0x2050, 0x309C, 0x204F,
+ 0x30A0, 0x3FCB, 0x30A1, 0x1EF8, 0x30A3, 0x1EF9, 0x30A5, 0x1EFA,
+ 0x30A7, 0x1EFB, 0x30A9, 0x1EFC, 0x30C3, 0x1EFD, 0x30E3, 0x1EFE,
+ 0x30E5, 0x1EFF, 0x30E7, 0x1F00, 0x30EE, 0x1F01, 0x30F5, 0x1F02,
+ 0x30F6, 0x1F03, 0x30FC, 0x1ED3, 0x31F0, 0x3FCD, 0x31F1, 0x3FCE,
+ 0x31F2, 0x3FCF, 0x31F3, 0x3FD0, 0x31F4, 0x3FD1, 0x31F5, 0x3FD2,
+ 0x31F6, 0x3FD3, 0x31F7, 0x3FD4, 0x31F8, 0x3FD5, 0x31F9, 0x3FD6,
+ 0x31FA, 0x3FD8, 0x31FB, 0x3FD9, 0x31FC, 0x3FDA, 0x31FD, 0x3FDB,
+ 0x31FE, 0x3FDC, 0x31FF, 0x3FDD, 0x3300, 0x209E, 0x3301, 0x2EB6,
+ 0x3302, 0x2EB7, 0x3303, 0x2092, 0x3304, 0x2EB8, 0x3305, 0x208D,
+ 0x3306, 0x2EB9, 0x3307, 0x2EBD, 0x3308, 0x2EBB, 0x3309, 0x2EC0,
+ 0x330A, 0x2EBE, 0x330B, 0x2EC2, 0x330C, 0x2EC4, 0x330D, 0x1F0E,
+ 0x330E, 0x2EC5, 0x330F, 0x2EC6, 0x3310, 0x2EC7, 0x3311, 0x2EC8,
+ 0x3312, 0x2EC9, 0x3313, 0x2ECA, 0x3314, 0x1F05, 0x3315, 0x2094,
+ 0x3316, 0x208A, 0x3317, 0x2ECC, 0x3318, 0x2093, 0x3319, 0x2ECE,
+ 0x331A, 0x2ED0, 0x331B, 0x2ED1, 0x331C, 0x2ED2, 0x331D, 0x2ED3,
+ 0x331E, 0x20A1, 0x331F, 0x2ED4, 0x3320, 0x2ED5, 0x3321, 0x2ED6,
+ 0x3322, 0x2089, 0x3323, 0x209C, 0x3324, 0x2ED7, 0x3325, 0x2ED9,
+ 0x3326, 0x1F0F, 0x3327, 0x1F09, 0x3328, 0x2EDC, 0x3329, 0x2EDD,
+ 0x332A, 0x20A4, 0x332B, 0x1F11, 0x332D, 0x2EDF, 0x332E, 0x2EE2,
+ 0x332F, 0x2EE3, 0x3330, 0x2EE4, 0x3331, 0x20A6, 0x3332, 0x2EE5,
+ 0x3333, 0x208E, 0x3334, 0x2EE8, 0x3335, 0x2EE9, 0x3336, 0x1F0B,
+ 0x3337, 0x2EEE, 0x3338, 0x2EF0, 0x3339, 0x2097, 0x333A, 0x2EF1,
+ 0x333B, 0x209D, 0x333C, 0x2EEA, 0x333D, 0x2EF2, 0x333E, 0x2EF4,
+ 0x333F, 0x2EF5, 0x3340, 0x2EF6, 0x3341, 0x2EF3, 0x3342, 0x209B,
+ 0x3343, 0x2EF7, 0x3344, 0x2EF8, 0x3345, 0x2EF9, 0x3346, 0x2EFA,
+ 0x3347, 0x20A5, 0x3348, 0x2EFB, 0x3349, 0x1F04, 0x334A, 0x1F12,
+ 0x334B, 0x2EFC, 0x334C, 0x2EFD, 0x334D, 0x1F07, 0x334E, 0x2091,
+ 0x334F, 0x2EFE, 0x3350, 0x2EFF, 0x3351, 0x1F0C, 0x3352, 0x2F02,
+ 0x3353, 0x2F06, 0x3354, 0x2F03, 0x3355, 0x2F07, 0x3356, 0x2F08,
+ 0x3357, 0x2098, 0x337F, 0x2084, 0xFF08, 0x1EDB, 0xFF09, 0x1EDC,
+ 0xFF0C, 0x204C, 0xFF0E, 0x2052, 0xFF1D, 0x1EED, 0xFF3B, 0x1EDF,
+ 0xFF3D, 0x1EE0, 0xFF3F, 0x1ED2, 0xFF5B, 0x1EE1, 0xFF5C, 0x1ED8,
+ 0xFF5D, 0x1EE2, 0xFF5E, 0x1ED6, 0xFF5F, 0x2F6D, 0xFF60, 0x2F6E,
+ 0xFFE3, 0x1ED1,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/Korea1/Adobe-Korea1-UCS2_2.cpp b/core/src/fpdfapi/fpdf_cmaps/Korea1/Adobe-Korea1-UCS2_2.cpp
index f5f7a99b61..837b3ea559 100644
--- a/core/src/fpdfapi/fpdf_cmaps/Korea1/Adobe-Korea1-UCS2_2.cpp
+++ b/core/src/fpdfapi/fpdf_cmaps/Korea1/Adobe-Korea1-UCS2_2.cpp
@@ -1,2302 +1,2302 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-extern const unsigned short g_FXCMAP_Korea1CID2Unicode_2[18352] = {
- 0xFFFD, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026,
- 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E,
- 0x002F, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036,
- 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E,
- 0x003F, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046,
- 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E,
- 0x004F, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056,
- 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E,
- 0x005F, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066,
- 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E,
- 0x006F, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076,
- 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E,
- 0x20A9, 0x2010, 0x00A9, 0x2122, 0x22EF, 0x3000, 0x3001, 0x3002,
- 0x00B7, 0x2025, 0x2026, 0x00A8, 0x3003, 0x2013, 0x2014, 0x2016,
- 0xFF3C, 0x223C, 0x2018, 0x2019, 0x201C, 0x201D, 0x3014, 0x3015,
- 0x3008, 0x3009, 0x300A, 0x300B, 0x300C, 0x300D, 0x300E, 0x300F,
- 0x3010, 0x3011, 0x00B1, 0x00D7, 0x00F7, 0x2260, 0x2264, 0x2265,
- 0x221E, 0x2234, 0x00B0, 0x2032, 0x2033, 0x2103, 0x212B, 0xFFE0,
- 0xFFE1, 0xFFE5, 0x2642, 0x2640, 0x2220, 0x22A5, 0x2312, 0x2202,
- 0x2207, 0x2261, 0x2252, 0x00A7, 0x203B, 0x2606, 0x2605, 0x25CB,
- 0x25CF, 0x25CE, 0x25C7, 0x25C6, 0x25A1, 0x25A0, 0x25B3, 0x25B2,
- 0x25BD, 0x25BC, 0x2192, 0x2190, 0x2191, 0x2193, 0x2194, 0x3013,
- 0x226A, 0x226B, 0x221A, 0x223D, 0x221D, 0x2235, 0x222B, 0x222C,
- 0x2208, 0x220B, 0x2286, 0x2287, 0x2282, 0x2283, 0x222A, 0x2229,
- 0x2227, 0x2228, 0xFFE2, 0x21D2, 0x21D4, 0x2200, 0x2203, 0x00B4,
- 0x02DC, 0x02C7, 0x02D8, 0x02DD, 0x02DA, 0x02D9, 0x00B8, 0x02DB,
- 0x00A1, 0x00BF, 0x2236, 0x222E, 0x2211, 0x220F, 0x00A4, 0x2109,
- 0x2030, 0x25C1, 0x25C0, 0x25B7, 0x25B6, 0x2664, 0x2660, 0x2661,
- 0x2665, 0x2667, 0x2663, 0x2299, 0x25C8, 0x25A3, 0x25D0, 0x25D1,
- 0x2592, 0x25A4, 0x25A5, 0x25A8, 0x25A7, 0x25A6, 0x25A9, 0x2668,
- 0x260F, 0x260E, 0x261C, 0x261E, 0x00B6, 0x2020, 0x2021, 0x2195,
- 0x2197, 0x2199, 0x2196, 0x2198, 0x266D, 0x2669, 0x266A, 0x266C,
- 0x327F, 0x321C, 0x2116, 0x33C7, 0x2122, 0x33C2, 0x33D8, 0x2121,
- 0xFF01, 0xFF02, 0xFF03, 0xFF04, 0xFF05, 0xFF06, 0xFF07, 0xFF08,
- 0xFF09, 0xFF0A, 0xFF0B, 0xFF0C, 0xFF0D, 0xFF0E, 0xFF0F, 0xFF10,
- 0xFF11, 0xFF12, 0xFF13, 0xFF14, 0xFF15, 0xFF16, 0xFF17, 0xFF18,
- 0xFF19, 0xFF1A, 0xFF1B, 0xFF1C, 0xFF1D, 0xFF1E, 0xFF1F, 0xFF20,
- 0xFF21, 0xFF22, 0xFF23, 0xFF24, 0xFF25, 0xFF26, 0xFF27, 0xFF28,
- 0xFF29, 0xFF2A, 0xFF2B, 0xFF2C, 0xFF2D, 0xFF2E, 0xFF2F, 0xFF30,
- 0xFF31, 0xFF32, 0xFF33, 0xFF34, 0xFF35, 0xFF36, 0xFF37, 0xFF38,
- 0xFF39, 0xFF3A, 0xFF3B, 0xFFE6, 0xFF3D, 0xFF3E, 0xFF3F, 0xFF40,
- 0xFF41, 0xFF42, 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, 0xFF48,
- 0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F, 0xFF50,
- 0xFF51, 0xFF52, 0xFF53, 0xFF54, 0xFF55, 0xFF56, 0xFF57, 0xFF58,
- 0xFF59, 0xFF5A, 0xFF5B, 0xFF5C, 0xFF5D, 0xFFE3, 0x3131, 0x3132,
- 0x3133, 0x3134, 0x3135, 0x3136, 0x3137, 0x3138, 0x3139, 0x313A,
- 0x313B, 0x313C, 0x313D, 0x313E, 0x313F, 0x3140, 0x3141, 0x3142,
- 0x3143, 0x3144, 0x3145, 0x3146, 0x3147, 0x3148, 0x3149, 0x314A,
- 0x314B, 0x314C, 0x314D, 0x314E, 0x314F, 0x3150, 0x3151, 0x3152,
- 0x3153, 0x3154, 0x3155, 0x3156, 0x3157, 0x3158, 0x3159, 0x315A,
- 0x315B, 0x315C, 0x315D, 0x315E, 0x315F, 0x3160, 0x3161, 0x3162,
- 0x3163, 0x3165, 0x3166, 0x3167, 0x3168, 0x3169, 0x316A, 0x316B,
- 0x316C, 0x316D, 0x316E, 0x316F, 0x3170, 0x3171, 0x3172, 0x3173,
- 0x3174, 0x3175, 0x3176, 0x3177, 0x3178, 0x3179, 0x317A, 0x317B,
- 0x317C, 0x317D, 0x317E, 0x317F, 0x3180, 0x3181, 0x3182, 0x3183,
- 0x3184, 0x3185, 0x3186, 0x3187, 0x3188, 0x3189, 0x318A, 0x318B,
- 0x318C, 0x318D, 0x318E, 0x2170, 0x2171, 0x2172, 0x2173, 0x2174,
- 0x2175, 0x2176, 0x2177, 0x2178, 0x2179, 0x2160, 0x2161, 0x2162,
- 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, 0x0391,
- 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399,
- 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, 0x03A0, 0x03A1,
- 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, 0x03B1,
- 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, 0x03B8, 0x03B9,
- 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, 0x03C0, 0x03C1,
- 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8, 0x03C9, 0x2500,
- 0x2502, 0x250C, 0x2510, 0x2518, 0x2514, 0x251C, 0x252C, 0x2524,
- 0x2534, 0x253C, 0x2501, 0x2503, 0x250F, 0x2513, 0x251B, 0x2517,
- 0x2523, 0x2533, 0x252B, 0x253B, 0x254B, 0x2520, 0x252F, 0x2528,
- 0x2537, 0x253F, 0x251D, 0x2530, 0x2525, 0x2538, 0x2542, 0x2512,
- 0x2511, 0x251A, 0x2519, 0x2516, 0x2515, 0x250E, 0x250D, 0x251E,
- 0x251F, 0x2521, 0x2522, 0x2526, 0x2527, 0x2529, 0x252A, 0x252D,
- 0x252E, 0x2531, 0x2532, 0x2535, 0x2536, 0x2539, 0x253A, 0x253D,
- 0x253E, 0x2540, 0x2541, 0x2543, 0x2544, 0x2545, 0x2546, 0x2547,
- 0x2548, 0x2549, 0x254A, 0x3395, 0x3396, 0x3397, 0x2113, 0x3398,
- 0x33C4, 0x33A3, 0x33A4, 0x33A5, 0x33A6, 0x3399, 0x339A, 0x339B,
- 0x339C, 0x339D, 0x339E, 0x339F, 0x33A0, 0x33A1, 0x33A2, 0x33CA,
- 0x338D, 0x338E, 0x338F, 0x33CF, 0x3388, 0x3389, 0x33C8, 0x33A7,
- 0x33A8, 0x33B0, 0x33B1, 0x33B2, 0x33B3, 0x33B4, 0x33B5, 0x33B6,
- 0x33B7, 0x33B8, 0x33B9, 0x3380, 0x3381, 0x3382, 0x3383, 0x3384,
- 0x33BA, 0x33BB, 0x33BC, 0x33BD, 0x33BE, 0x33BF, 0x3390, 0x3391,
- 0x3392, 0x3393, 0x3394, 0x2126, 0x33C0, 0x33C1, 0x338A, 0x338B,
- 0x338C, 0x33D6, 0x33C5, 0x33AD, 0x33AE, 0x33AF, 0x33DB, 0x33A9,
- 0x33AA, 0x33AB, 0x33AC, 0x33DD, 0x33D0, 0x33D3, 0x33C3, 0x33C9,
- 0x33DC, 0x33C6, 0x00C6, 0x00D0, 0x00AA, 0x0126, 0x0132, 0x013F,
- 0x0141, 0x00D8, 0x0152, 0x00BA, 0x00DE, 0x0166, 0x014A, 0x3260,
- 0x3261, 0x3262, 0x3263, 0x3264, 0x3265, 0x3266, 0x3267, 0x3268,
- 0x3269, 0x326A, 0x326B, 0x326C, 0x326D, 0x326E, 0x326F, 0x3270,
- 0x3271, 0x3272, 0x3273, 0x3274, 0x3275, 0x3276, 0x3277, 0x3278,
- 0x3279, 0x327A, 0x327B, 0x24D0, 0x24D1, 0x24D2, 0x24D3, 0x24D4,
- 0x24D5, 0x24D6, 0x24D7, 0x24D8, 0x24D9, 0x24DA, 0x24DB, 0x24DC,
- 0x24DD, 0x24DE, 0x24DF, 0x24E0, 0x24E1, 0x24E2, 0x24E3, 0x24E4,
- 0x24E5, 0x24E6, 0x24E7, 0x24E8, 0x24E9, 0x2460, 0x2461, 0x2462,
- 0x2463, 0x2464, 0x2465, 0x2466, 0x2467, 0x2468, 0x2469, 0x246A,
- 0x246B, 0x246C, 0x246D, 0x246E, 0x00BD, 0x2153, 0x2154, 0x00BC,
- 0x00BE, 0x215B, 0x215C, 0x215D, 0x215E, 0x00E6, 0x0111, 0x00F0,
- 0x0127, 0x0131, 0x0133, 0x0138, 0x0140, 0x0142, 0x00F8, 0x0153,
- 0x00DF, 0x00FE, 0x0167, 0x014B, 0x0149, 0x3200, 0x3201, 0x3202,
- 0x3203, 0x3204, 0x3205, 0x3206, 0x3207, 0x3208, 0x3209, 0x320A,
- 0x320B, 0x320C, 0x320D, 0x320E, 0x320F, 0x3210, 0x3211, 0x3212,
- 0x3213, 0x3214, 0x3215, 0x3216, 0x3217, 0x3218, 0x3219, 0x321A,
- 0x321B, 0x249C, 0x249D, 0x249E, 0x249F, 0x24A0, 0x24A1, 0x24A2,
- 0x24A3, 0x24A4, 0x24A5, 0x24A6, 0x24A7, 0x24A8, 0x24A9, 0x24AA,
- 0x24AB, 0x24AC, 0x24AD, 0x24AE, 0x24AF, 0x24B0, 0x24B1, 0x24B2,
- 0x24B3, 0x24B4, 0x24B5, 0x2474, 0x2475, 0x2476, 0x2477, 0x2478,
- 0x2479, 0x247A, 0x247B, 0x247C, 0x247D, 0x247E, 0x247F, 0x2480,
- 0x2481, 0x2482, 0x00B9, 0x00B2, 0x00B3, 0x2074, 0x207F, 0x2081,
- 0x2082, 0x2083, 0x2084, 0x3041, 0x3042, 0x3043, 0x3044, 0x3045,
- 0x3046, 0x3047, 0x3048, 0x3049, 0x304A, 0x304B, 0x304C, 0x304D,
- 0x304E, 0x304F, 0x3050, 0x3051, 0x3052, 0x3053, 0x3054, 0x3055,
- 0x3056, 0x3057, 0x3058, 0x3059, 0x305A, 0x305B, 0x305C, 0x305D,
- 0x305E, 0x305F, 0x3060, 0x3061, 0x3062, 0x3063, 0x3064, 0x3065,
- 0x3066, 0x3067, 0x3068, 0x3069, 0x306A, 0x306B, 0x306C, 0x306D,
- 0x306E, 0x306F, 0x3070, 0x3071, 0x3072, 0x3073, 0x3074, 0x3075,
- 0x3076, 0x3077, 0x3078, 0x3079, 0x307A, 0x307B, 0x307C, 0x307D,
- 0x307E, 0x307F, 0x3080, 0x3081, 0x3082, 0x3083, 0x3084, 0x3085,
- 0x3086, 0x3087, 0x3088, 0x3089, 0x308A, 0x308B, 0x308C, 0x308D,
- 0x308E, 0x308F, 0x3090, 0x3091, 0x3092, 0x3093, 0x30A1, 0x30A2,
- 0x30A3, 0x30A4, 0x30A5, 0x30A6, 0x30A7, 0x30A8, 0x30A9, 0x30AA,
- 0x30AB, 0x30AC, 0x30AD, 0x30AE, 0x30AF, 0x30B0, 0x30B1, 0x30B2,
- 0x30B3, 0x30B4, 0x30B5, 0x30B6, 0x30B7, 0x30B8, 0x30B9, 0x30BA,
- 0x30BB, 0x30BC, 0x30BD, 0x30BE, 0x30BF, 0x30C0, 0x30C1, 0x30C2,
- 0x30C3, 0x30C4, 0x30C5, 0x30C6, 0x30C7, 0x30C8, 0x30C9, 0x30CA,
- 0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF, 0x30D0, 0x30D1, 0x30D2,
- 0x30D3, 0x30D4, 0x30D5, 0x30D6, 0x30D7, 0x30D8, 0x30D9, 0x30DA,
- 0x30DB, 0x30DC, 0x30DD, 0x30DE, 0x30DF, 0x30E0, 0x30E1, 0x30E2,
- 0x30E3, 0x30E4, 0x30E5, 0x30E6, 0x30E7, 0x30E8, 0x30E9, 0x30EA,
- 0x30EB, 0x30EC, 0x30ED, 0x30EE, 0x30EF, 0x30F0, 0x30F1, 0x30F2,
- 0x30F3, 0x30F4, 0x30F5, 0x30F6, 0x0410, 0x0411, 0x0412, 0x0413,
- 0x0414, 0x0415, 0x0401, 0x0416, 0x0417, 0x0418, 0x0419, 0x041A,
- 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, 0x0420, 0x0421, 0x0422,
- 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042A,
- 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, 0x0430, 0x0431, 0x0432,
- 0x0433, 0x0434, 0x0435, 0x0451, 0x0436, 0x0437, 0x0438, 0x0439,
- 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, 0x0440, 0x0441,
- 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449,
- 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F, 0xAC00, 0xAC01,
- 0xAC04, 0xAC07, 0xAC08, 0xAC09, 0xAC0A, 0xAC10, 0xAC11, 0xAC12,
- 0xAC13, 0xAC14, 0xAC15, 0xAC16, 0xAC17, 0xAC19, 0xAC1A, 0xAC1B,
- 0xAC1C, 0xAC1D, 0xAC20, 0xAC24, 0xAC2C, 0xAC2D, 0xAC2F, 0xAC30,
- 0xAC31, 0xAC38, 0xAC39, 0xAC3C, 0xAC40, 0xAC4B, 0xAC4D, 0xAC54,
- 0xAC58, 0xAC5C, 0xAC70, 0xAC71, 0xAC74, 0xAC77, 0xAC78, 0xAC7A,
- 0xAC80, 0xAC81, 0xAC83, 0xAC84, 0xAC85, 0xAC86, 0xAC89, 0xAC8A,
- 0xAC8B, 0xAC8C, 0xAC90, 0xAC94, 0xAC9C, 0xAC9D, 0xAC9F, 0xACA0,
- 0xACA1, 0xACA8, 0xACA9, 0xACAA, 0xACAC, 0xACAF, 0xACB0, 0xACB8,
- 0xACB9, 0xACBB, 0xACBC, 0xACBD, 0xACC1, 0xACC4, 0xACC8, 0xACCC,
- 0xACD5, 0xACD7, 0xACE0, 0xACE1, 0xACE4, 0xACE7, 0xACE8, 0xACEA,
- 0xACEC, 0xACEF, 0xACF0, 0xACF1, 0xACF3, 0xACF5, 0xACF6, 0xACFC,
- 0xACFD, 0xAD00, 0xAD04, 0xAD06, 0xAD0C, 0xAD0D, 0xAD0F, 0xAD11,
- 0xAD18, 0xAD1C, 0xAD20, 0xAD29, 0xAD2C, 0xAD2D, 0xAD34, 0xAD35,
- 0xAD38, 0xAD3C, 0xAD44, 0xAD45, 0xAD47, 0xAD49, 0xAD50, 0xAD54,
- 0xAD58, 0xAD61, 0xAD63, 0xAD6C, 0xAD6D, 0xAD70, 0xAD73, 0xAD74,
- 0xAD75, 0xAD76, 0xAD7B, 0xAD7C, 0xAD7D, 0xAD7F, 0xAD81, 0xAD82,
- 0xAD88, 0xAD89, 0xAD8C, 0xAD90, 0xAD9C, 0xAD9D, 0xADA4, 0xADB7,
- 0xADC0, 0xADC1, 0xADC4, 0xADC8, 0xADD0, 0xADD1, 0xADD3, 0xADDC,
- 0xADE0, 0xADE4, 0xADF8, 0xADF9, 0xADFC, 0xADFF, 0xAE00, 0xAE01,
- 0xAE08, 0xAE09, 0xAE0B, 0xAE0D, 0xAE14, 0xAE30, 0xAE31, 0xAE34,
- 0xAE37, 0xAE38, 0xAE3A, 0xAE40, 0xAE41, 0xAE43, 0xAE45, 0xAE46,
- 0xAE4A, 0xAE4C, 0xAE4D, 0xAE4E, 0xAE50, 0xAE54, 0xAE56, 0xAE5C,
- 0xAE5D, 0xAE5F, 0xAE60, 0xAE61, 0xAE65, 0xAE68, 0xAE69, 0xAE6C,
- 0xAE70, 0xAE78, 0xAE79, 0xAE7B, 0xAE7C, 0xAE7D, 0xAE84, 0xAE85,
- 0xAE8C, 0xAEBC, 0xAEBD, 0xAEBE, 0xAEC0, 0xAEC4, 0xAECC, 0xAECD,
- 0xAECF, 0xAED0, 0xAED1, 0xAED8, 0xAED9, 0xAEDC, 0xAEE8, 0xAEEB,
- 0xAEED, 0xAEF4, 0xAEF8, 0xAEFC, 0xAF07, 0xAF08, 0xAF0D, 0xAF10,
- 0xAF2C, 0xAF2D, 0xAF30, 0xAF32, 0xAF34, 0xAF3C, 0xAF3D, 0xAF3F,
- 0xAF41, 0xAF42, 0xAF43, 0xAF48, 0xAF49, 0xAF50, 0xAF5C, 0xAF5D,
- 0xAF64, 0xAF65, 0xAF79, 0xAF80, 0xAF84, 0xAF88, 0xAF90, 0xAF91,
- 0xAF95, 0xAF9C, 0xAFB8, 0xAFB9, 0xAFBC, 0xAFC0, 0xAFC7, 0xAFC8,
- 0xAFC9, 0xAFCB, 0xAFCD, 0xAFCE, 0xAFD4, 0xAFDC, 0xAFE8, 0xAFE9,
- 0xAFF0, 0xAFF1, 0xAFF4, 0xAFF8, 0xB000, 0xB001, 0xB004, 0xB00C,
- 0xB010, 0xB014, 0xB01C, 0xB01D, 0xB028, 0xB044, 0xB045, 0xB048,
- 0xB04A, 0xB04C, 0xB04E, 0xB053, 0xB054, 0xB055, 0xB057, 0xB059,
- 0xB05D, 0xB07C, 0xB07D, 0xB080, 0xB084, 0xB08C, 0xB08D, 0xB08F,
- 0xB091, 0xB098, 0xB099, 0xB09A, 0xB09C, 0xB09F, 0xB0A0, 0xB0A1,
- 0xB0A2, 0xB0A8, 0xB0A9, 0xB0AB, 0xB0AC, 0xB0AD, 0xB0AE, 0xB0AF,
- 0xB0B1, 0xB0B3, 0xB0B4, 0xB0B5, 0xB0B8, 0xB0BC, 0xB0C4, 0xB0C5,
- 0xB0C7, 0xB0C8, 0xB0C9, 0xB0D0, 0xB0D1, 0xB0D4, 0xB0D8, 0xB0E0,
- 0xB0E5, 0xB108, 0xB109, 0xB10B, 0xB10C, 0xB110, 0xB112, 0xB113,
- 0xB118, 0xB119, 0xB11B, 0xB11C, 0xB11D, 0xB123, 0xB124, 0xB125,
- 0xB128, 0xB12C, 0xB134, 0xB135, 0xB137, 0xB138, 0xB139, 0xB140,
- 0xB141, 0xB144, 0xB148, 0xB150, 0xB151, 0xB154, 0xB155, 0xB158,
- 0xB15C, 0xB160, 0xB178, 0xB179, 0xB17C, 0xB180, 0xB182, 0xB188,
- 0xB189, 0xB18B, 0xB18D, 0xB192, 0xB193, 0xB194, 0xB198, 0xB19C,
- 0xB1A8, 0xB1CC, 0xB1D0, 0xB1D4, 0xB1DC, 0xB1DD, 0xB1DF, 0xB1E8,
- 0xB1E9, 0xB1EC, 0xB1F0, 0xB1F9, 0xB1FB, 0xB1FD, 0xB204, 0xB205,
- 0xB208, 0xB20B, 0xB20C, 0xB214, 0xB215, 0xB217, 0xB219, 0xB220,
- 0xB234, 0xB23C, 0xB258, 0xB25C, 0xB260, 0xB268, 0xB269, 0xB274,
- 0xB275, 0xB27C, 0xB284, 0xB285, 0xB289, 0xB290, 0xB291, 0xB294,
- 0xB298, 0xB299, 0xB29A, 0xB2A0, 0xB2A1, 0xB2A3, 0xB2A5, 0xB2A6,
- 0xB2AA, 0xB2AC, 0xB2B0, 0xB2B4, 0xB2C8, 0xB2C9, 0xB2CC, 0xB2D0,
- 0xB2D2, 0xB2D8, 0xB2D9, 0xB2DB, 0xB2DD, 0xB2E2, 0xB2E4, 0xB2E5,
- 0xB2E6, 0xB2E8, 0xB2EB, 0xB2EC, 0xB2ED, 0xB2EE, 0xB2EF, 0xB2F3,
- 0xB2F4, 0xB2F5, 0xB2F7, 0xB2F8, 0xB2F9, 0xB2FA, 0xB2FB, 0xB2FF,
- 0xB300, 0xB301, 0xB304, 0xB308, 0xB310, 0xB311, 0xB313, 0xB314,
- 0xB315, 0xB31C, 0xB354, 0xB355, 0xB356, 0xB358, 0xB35B, 0xB35C,
- 0xB35E, 0xB35F, 0xB364, 0xB365, 0xB367, 0xB369, 0xB36B, 0xB36E,
- 0xB370, 0xB371, 0xB374, 0xB378, 0xB380, 0xB381, 0xB383, 0xB384,
- 0xB385, 0xB38C, 0xB390, 0xB394, 0xB3A0, 0xB3A1, 0xB3A8, 0xB3AC,
- 0xB3C4, 0xB3C5, 0xB3C8, 0xB3CB, 0xB3CC, 0xB3CE, 0xB3D0, 0xB3D4,
- 0xB3D5, 0xB3D7, 0xB3D9, 0xB3DB, 0xB3DD, 0xB3E0, 0xB3E4, 0xB3E8,
- 0xB3FC, 0xB410, 0xB418, 0xB41C, 0xB420, 0xB428, 0xB429, 0xB42B,
- 0xB434, 0xB450, 0xB451, 0xB454, 0xB458, 0xB460, 0xB461, 0xB463,
- 0xB465, 0xB46C, 0xB480, 0xB488, 0xB49D, 0xB4A4, 0xB4A8, 0xB4AC,
- 0xB4B5, 0xB4B7, 0xB4B9, 0xB4C0, 0xB4C4, 0xB4C8, 0xB4D0, 0xB4D5,
- 0xB4DC, 0xB4DD, 0xB4E0, 0xB4E3, 0xB4E4, 0xB4E6, 0xB4EC, 0xB4ED,
- 0xB4EF, 0xB4F1, 0xB4F8, 0xB514, 0xB515, 0xB518, 0xB51B, 0xB51C,
- 0xB524, 0xB525, 0xB527, 0xB528, 0xB529, 0xB52A, 0xB530, 0xB531,
- 0xB534, 0xB538, 0xB540, 0xB541, 0xB543, 0xB544, 0xB545, 0xB54B,
- 0xB54C, 0xB54D, 0xB550, 0xB554, 0xB55C, 0xB55D, 0xB55F, 0xB560,
- 0xB561, 0xB5A0, 0xB5A1, 0xB5A4, 0xB5A8, 0xB5AA, 0xB5AB, 0xB5B0,
- 0xB5B1, 0xB5B3, 0xB5B4, 0xB5B5, 0xB5BB, 0xB5BC, 0xB5BD, 0xB5C0,
- 0xB5C4, 0xB5CC, 0xB5CD, 0xB5CF, 0xB5D0, 0xB5D1, 0xB5D8, 0xB5EC,
- 0xB610, 0xB611, 0xB614, 0xB618, 0xB625, 0xB62C, 0xB634, 0xB648,
- 0xB664, 0xB668, 0xB69C, 0xB69D, 0xB6A0, 0xB6A4, 0xB6AB, 0xB6AC,
- 0xB6B1, 0xB6D4, 0xB6F0, 0xB6F4, 0xB6F8, 0xB700, 0xB701, 0xB705,
- 0xB728, 0xB729, 0xB72C, 0xB72F, 0xB730, 0xB738, 0xB739, 0xB73B,
- 0xB744, 0xB748, 0xB74C, 0xB754, 0xB755, 0xB760, 0xB764, 0xB768,
- 0xB770, 0xB771, 0xB773, 0xB775, 0xB77C, 0xB77D, 0xB780, 0xB784,
- 0xB78C, 0xB78D, 0xB78F, 0xB790, 0xB791, 0xB792, 0xB796, 0xB797,
- 0xB798, 0xB799, 0xB79C, 0xB7A0, 0xB7A8, 0xB7A9, 0xB7AB, 0xB7AC,
- 0xB7AD, 0xB7B4, 0xB7B5, 0xB7B8, 0xB7C7, 0xB7C9, 0xB7EC, 0xB7ED,
- 0xB7F0, 0xB7F4, 0xB7FC, 0xB7FD, 0xB7FF, 0xB800, 0xB801, 0xB807,
- 0xB808, 0xB809, 0xB80C, 0xB810, 0xB818, 0xB819, 0xB81B, 0xB81D,
- 0xB824, 0xB825, 0xB828, 0xB82C, 0xB834, 0xB835, 0xB837, 0xB838,
- 0xB839, 0xB840, 0xB844, 0xB851, 0xB853, 0xB85C, 0xB85D, 0xB860,
- 0xB864, 0xB86C, 0xB86D, 0xB86F, 0xB871, 0xB878, 0xB87C, 0xB88D,
- 0xB8A8, 0xB8B0, 0xB8B4, 0xB8B8, 0xB8C0, 0xB8C1, 0xB8C3, 0xB8C5,
- 0xB8CC, 0xB8D0, 0xB8D4, 0xB8DD, 0xB8DF, 0xB8E1, 0xB8E8, 0xB8E9,
- 0xB8EC, 0xB8F0, 0xB8F8, 0xB8F9, 0xB8FB, 0xB8FD, 0xB904, 0xB918,
- 0xB920, 0xB93C, 0xB93D, 0xB940, 0xB944, 0xB94C, 0xB94F, 0xB951,
- 0xB958, 0xB959, 0xB95C, 0xB960, 0xB968, 0xB969, 0xB96B, 0xB96D,
- 0xB974, 0xB975, 0xB978, 0xB97C, 0xB984, 0xB985, 0xB987, 0xB989,
- 0xB98A, 0xB98D, 0xB98E, 0xB9AC, 0xB9AD, 0xB9B0, 0xB9B4, 0xB9BC,
- 0xB9BD, 0xB9BF, 0xB9C1, 0xB9C8, 0xB9C9, 0xB9CC, 0xB9CE, 0xB9CF,
- 0xB9D0, 0xB9D1, 0xB9D2, 0xB9D8, 0xB9D9, 0xB9DB, 0xB9DD, 0xB9DE,
- 0xB9E1, 0xB9E3, 0xB9E4, 0xB9E5, 0xB9E8, 0xB9EC, 0xB9F4, 0xB9F5,
- 0xB9F7, 0xB9F8, 0xB9F9, 0xB9FA, 0xBA00, 0xBA01, 0xBA08, 0xBA15,
- 0xBA38, 0xBA39, 0xBA3C, 0xBA40, 0xBA42, 0xBA48, 0xBA49, 0xBA4B,
- 0xBA4D, 0xBA4E, 0xBA53, 0xBA54, 0xBA55, 0xBA58, 0xBA5C, 0xBA64,
- 0xBA65, 0xBA67, 0xBA68, 0xBA69, 0xBA70, 0xBA71, 0xBA74, 0xBA78,
- 0xBA83, 0xBA84, 0xBA85, 0xBA87, 0xBA8C, 0xBAA8, 0xBAA9, 0xBAAB,
- 0xBAAC, 0xBAB0, 0xBAB2, 0xBAB8, 0xBAB9, 0xBABB, 0xBABD, 0xBAC4,
- 0xBAC8, 0xBAD8, 0xBAD9, 0xBAFC, 0xBB00, 0xBB04, 0xBB0D, 0xBB0F,
- 0xBB11, 0xBB18, 0xBB1C, 0xBB20, 0xBB29, 0xBB2B, 0xBB34, 0xBB35,
- 0xBB36, 0xBB38, 0xBB3B, 0xBB3C, 0xBB3D, 0xBB3E, 0xBB44, 0xBB45,
- 0xBB47, 0xBB49, 0xBB4D, 0xBB4F, 0xBB50, 0xBB54, 0xBB58, 0xBB61,
- 0xBB63, 0xBB6C, 0xBB88, 0xBB8C, 0xBB90, 0xBBA4, 0xBBA8, 0xBBAC,
- 0xBBB4, 0xBBB7, 0xBBC0, 0xBBC4, 0xBBC8, 0xBBD0, 0xBBD3, 0xBBF8,
- 0xBBF9, 0xBBFC, 0xBBFF, 0xBC00, 0xBC02, 0xBC08, 0xBC09, 0xBC0B,
- 0xBC0C, 0xBC0D, 0xBC0F, 0xBC11, 0xBC14, 0xBC15, 0xBC16, 0xBC17,
- 0xBC18, 0xBC1B, 0xBC1C, 0xBC1D, 0xBC1E, 0xBC1F, 0xBC24, 0xBC25,
- 0xBC27, 0xBC29, 0xBC2D, 0xBC30, 0xBC31, 0xBC34, 0xBC38, 0xBC40,
- 0xBC41, 0xBC43, 0xBC44, 0xBC45, 0xBC49, 0xBC4C, 0xBC4D, 0xBC50,
- 0xBC5D, 0xBC84, 0xBC85, 0xBC88, 0xBC8B, 0xBC8C, 0xBC8E, 0xBC94,
- 0xBC95, 0xBC97, 0xBC99, 0xBC9A, 0xBCA0, 0xBCA1, 0xBCA4, 0xBCA7,
- 0xBCA8, 0xBCB0, 0xBCB1, 0xBCB3, 0xBCB4, 0xBCB5, 0xBCBC, 0xBCBD,
- 0xBCC0, 0xBCC4, 0xBCCD, 0xBCCF, 0xBCD0, 0xBCD1, 0xBCD5, 0xBCD8,
- 0xBCDC, 0xBCF4, 0xBCF5, 0xBCF6, 0xBCF8, 0xBCFC, 0xBD04, 0xBD05,
- 0xBD07, 0xBD09, 0xBD10, 0xBD14, 0xBD24, 0xBD2C, 0xBD40, 0xBD48,
- 0xBD49, 0xBD4C, 0xBD50, 0xBD58, 0xBD59, 0xBD64, 0xBD68, 0xBD80,
- 0xBD81, 0xBD84, 0xBD87, 0xBD88, 0xBD89, 0xBD8A, 0xBD90, 0xBD91,
- 0xBD93, 0xBD95, 0xBD99, 0xBD9A, 0xBD9C, 0xBDA4, 0xBDB0, 0xBDB8,
- 0xBDD4, 0xBDD5, 0xBDD8, 0xBDDC, 0xBDE9, 0xBDF0, 0xBDF4, 0xBDF8,
- 0xBE00, 0xBE03, 0xBE05, 0xBE0C, 0xBE0D, 0xBE10, 0xBE14, 0xBE1C,
- 0xBE1D, 0xBE1F, 0xBE44, 0xBE45, 0xBE48, 0xBE4C, 0xBE4E, 0xBE54,
- 0xBE55, 0xBE57, 0xBE59, 0xBE5A, 0xBE5B, 0xBE60, 0xBE61, 0xBE64,
- 0xBE68, 0xBE6A, 0xBE70, 0xBE71, 0xBE73, 0xBE74, 0xBE75, 0xBE7B,
- 0xBE7C, 0xBE7D, 0xBE80, 0xBE84, 0xBE8C, 0xBE8D, 0xBE8F, 0xBE90,
- 0xBE91, 0xBE98, 0xBE99, 0xBEA8, 0xBED0, 0xBED1, 0xBED4, 0xBED7,
- 0xBED8, 0xBEE0, 0xBEE3, 0xBEE4, 0xBEE5, 0xBEEC, 0xBF01, 0xBF08,
- 0xBF09, 0xBF18, 0xBF19, 0xBF1B, 0xBF1C, 0xBF1D, 0xBF40, 0xBF41,
- 0xBF44, 0xBF48, 0xBF50, 0xBF51, 0xBF55, 0xBF94, 0xBFB0, 0xBFC5,
- 0xBFCC, 0xBFCD, 0xBFD0, 0xBFD4, 0xBFDC, 0xBFDF, 0xBFE1, 0xC03C,
- 0xC051, 0xC058, 0xC05C, 0xC060, 0xC068, 0xC069, 0xC090, 0xC091,
- 0xC094, 0xC098, 0xC0A0, 0xC0A1, 0xC0A3, 0xC0A5, 0xC0AC, 0xC0AD,
- 0xC0AF, 0xC0B0, 0xC0B3, 0xC0B4, 0xC0B5, 0xC0B6, 0xC0BC, 0xC0BD,
- 0xC0BF, 0xC0C0, 0xC0C1, 0xC0C5, 0xC0C8, 0xC0C9, 0xC0CC, 0xC0D0,
- 0xC0D8, 0xC0D9, 0xC0DB, 0xC0DC, 0xC0DD, 0xC0E4, 0xC0E5, 0xC0E8,
- 0xC0EC, 0xC0F4, 0xC0F5, 0xC0F7, 0xC0F9, 0xC100, 0xC104, 0xC108,
- 0xC110, 0xC115, 0xC11C, 0xC11D, 0xC11E, 0xC11F, 0xC120, 0xC123,
- 0xC124, 0xC126, 0xC127, 0xC12C, 0xC12D, 0xC12F, 0xC130, 0xC131,
- 0xC136, 0xC138, 0xC139, 0xC13C, 0xC140, 0xC148, 0xC149, 0xC14B,
- 0xC14C, 0xC14D, 0xC154, 0xC155, 0xC158, 0xC15C, 0xC164, 0xC165,
- 0xC167, 0xC168, 0xC169, 0xC170, 0xC174, 0xC178, 0xC185, 0xC18C,
- 0xC18D, 0xC18E, 0xC190, 0xC194, 0xC196, 0xC19C, 0xC19D, 0xC19F,
- 0xC1A1, 0xC1A5, 0xC1A8, 0xC1A9, 0xC1AC, 0xC1B0, 0xC1BD, 0xC1C4,
- 0xC1C8, 0xC1CC, 0xC1D4, 0xC1D7, 0xC1D8, 0xC1E0, 0xC1E4, 0xC1E8,
- 0xC1F0, 0xC1F1, 0xC1F3, 0xC1FC, 0xC1FD, 0xC200, 0xC204, 0xC20C,
- 0xC20D, 0xC20F, 0xC211, 0xC218, 0xC219, 0xC21C, 0xC21F, 0xC220,
- 0xC228, 0xC229, 0xC22B, 0xC22D, 0xC22F, 0xC231, 0xC232, 0xC234,
- 0xC248, 0xC250, 0xC251, 0xC254, 0xC258, 0xC260, 0xC265, 0xC26C,
- 0xC26D, 0xC270, 0xC274, 0xC27C, 0xC27D, 0xC27F, 0xC281, 0xC288,
- 0xC289, 0xC290, 0xC298, 0xC29B, 0xC29D, 0xC2A4, 0xC2A5, 0xC2A8,
- 0xC2AC, 0xC2AD, 0xC2B4, 0xC2B5, 0xC2B7, 0xC2B9, 0xC2DC, 0xC2DD,
- 0xC2E0, 0xC2E3, 0xC2E4, 0xC2EB, 0xC2EC, 0xC2ED, 0xC2EF, 0xC2F1,
- 0xC2F6, 0xC2F8, 0xC2F9, 0xC2FB, 0xC2FC, 0xC300, 0xC308, 0xC309,
- 0xC30C, 0xC30D, 0xC313, 0xC314, 0xC315, 0xC318, 0xC31C, 0xC324,
- 0xC325, 0xC328, 0xC329, 0xC345, 0xC368, 0xC369, 0xC36C, 0xC370,
- 0xC372, 0xC378, 0xC379, 0xC37C, 0xC37D, 0xC384, 0xC388, 0xC38C,
- 0xC3C0, 0xC3D8, 0xC3D9, 0xC3DC, 0xC3DF, 0xC3E0, 0xC3E2, 0xC3E8,
- 0xC3E9, 0xC3ED, 0xC3F4, 0xC3F5, 0xC3F8, 0xC408, 0xC410, 0xC424,
- 0xC42C, 0xC430, 0xC434, 0xC43C, 0xC43D, 0xC448, 0xC464, 0xC465,
- 0xC468, 0xC46C, 0xC474, 0xC475, 0xC479, 0xC480, 0xC494, 0xC49C,
- 0xC4B8, 0xC4BC, 0xC4E9, 0xC4F0, 0xC4F1, 0xC4F4, 0xC4F8, 0xC4FA,
- 0xC4FF, 0xC500, 0xC501, 0xC50C, 0xC510, 0xC514, 0xC51C, 0xC528,
- 0xC529, 0xC52C, 0xC530, 0xC538, 0xC539, 0xC53B, 0xC53D, 0xC544,
- 0xC545, 0xC548, 0xC549, 0xC54A, 0xC54C, 0xC54D, 0xC54E, 0xC553,
- 0xC554, 0xC555, 0xC557, 0xC558, 0xC559, 0xC55D, 0xC55E, 0xC560,
- 0xC561, 0xC564, 0xC568, 0xC570, 0xC571, 0xC573, 0xC574, 0xC575,
- 0xC57C, 0xC57D, 0xC580, 0xC584, 0xC587, 0xC58C, 0xC58D, 0xC58F,
- 0xC591, 0xC595, 0xC597, 0xC598, 0xC59C, 0xC5A0, 0xC5A9, 0xC5B4,
- 0xC5B5, 0xC5B8, 0xC5B9, 0xC5BB, 0xC5BC, 0xC5BD, 0xC5BE, 0xC5C4,
- 0xC5C5, 0xC5C6, 0xC5C7, 0xC5C8, 0xC5C9, 0xC5CA, 0xC5CC, 0xC5CE,
- 0xC5D0, 0xC5D1, 0xC5D4, 0xC5D8, 0xC5E0, 0xC5E1, 0xC5E3, 0xC5E5,
- 0xC5EC, 0xC5ED, 0xC5EE, 0xC5F0, 0xC5F4, 0xC5F6, 0xC5F7, 0xC5FC,
- 0xC5FD, 0xC5FE, 0xC5FF, 0xC600, 0xC601, 0xC605, 0xC606, 0xC607,
- 0xC608, 0xC60C, 0xC610, 0xC618, 0xC619, 0xC61B, 0xC61C, 0xC624,
- 0xC625, 0xC628, 0xC62C, 0xC62D, 0xC62E, 0xC630, 0xC633, 0xC634,
- 0xC635, 0xC637, 0xC639, 0xC63B, 0xC640, 0xC641, 0xC644, 0xC648,
- 0xC650, 0xC651, 0xC653, 0xC654, 0xC655, 0xC65C, 0xC65D, 0xC660,
- 0xC66C, 0xC66F, 0xC671, 0xC678, 0xC679, 0xC67C, 0xC680, 0xC688,
- 0xC689, 0xC68B, 0xC68D, 0xC694, 0xC695, 0xC698, 0xC69C, 0xC6A4,
- 0xC6A5, 0xC6A7, 0xC6A9, 0xC6B0, 0xC6B1, 0xC6B4, 0xC6B8, 0xC6B9,
- 0xC6BA, 0xC6C0, 0xC6C1, 0xC6C3, 0xC6C5, 0xC6CC, 0xC6CD, 0xC6D0,
- 0xC6D4, 0xC6DC, 0xC6DD, 0xC6E0, 0xC6E1, 0xC6E8, 0xC6E9, 0xC6EC,
- 0xC6F0, 0xC6F8, 0xC6F9, 0xC6FD, 0xC704, 0xC705, 0xC708, 0xC70C,
- 0xC714, 0xC715, 0xC717, 0xC719, 0xC720, 0xC721, 0xC724, 0xC728,
- 0xC730, 0xC731, 0xC733, 0xC735, 0xC737, 0xC73C, 0xC73D, 0xC740,
- 0xC744, 0xC74A, 0xC74C, 0xC74D, 0xC74F, 0xC751, 0xC752, 0xC753,
- 0xC754, 0xC755, 0xC756, 0xC757, 0xC758, 0xC75C, 0xC760, 0xC768,
- 0xC76B, 0xC774, 0xC775, 0xC778, 0xC77C, 0xC77D, 0xC77E, 0xC783,
- 0xC784, 0xC785, 0xC787, 0xC788, 0xC789, 0xC78A, 0xC78E, 0xC790,
- 0xC791, 0xC794, 0xC796, 0xC797, 0xC798, 0xC79A, 0xC7A0, 0xC7A1,
- 0xC7A3, 0xC7A4, 0xC7A5, 0xC7A6, 0xC7AC, 0xC7AD, 0xC7B0, 0xC7B4,
- 0xC7BC, 0xC7BD, 0xC7BF, 0xC7C0, 0xC7C1, 0xC7C8, 0xC7C9, 0xC7CC,
- 0xC7CE, 0xC7D0, 0xC7D8, 0xC7DD, 0xC7E4, 0xC7E8, 0xC7EC, 0xC800,
- 0xC801, 0xC804, 0xC808, 0xC80A, 0xC810, 0xC811, 0xC813, 0xC815,
- 0xC816, 0xC81C, 0xC81D, 0xC820, 0xC824, 0xC82C, 0xC82D, 0xC82F,
- 0xC831, 0xC838, 0xC83C, 0xC840, 0xC848, 0xC849, 0xC84C, 0xC84D,
- 0xC854, 0xC870, 0xC871, 0xC874, 0xC878, 0xC87A, 0xC880, 0xC881,
- 0xC883, 0xC885, 0xC886, 0xC887, 0xC88B, 0xC88C, 0xC88D, 0xC894,
- 0xC89D, 0xC89F, 0xC8A1, 0xC8A8, 0xC8BC, 0xC8BD, 0xC8C4, 0xC8C8,
- 0xC8CC, 0xC8D4, 0xC8D5, 0xC8D7, 0xC8D9, 0xC8E0, 0xC8E1, 0xC8E4,
- 0xC8F5, 0xC8FC, 0xC8FD, 0xC900, 0xC904, 0xC905, 0xC906, 0xC90C,
- 0xC90D, 0xC90F, 0xC911, 0xC918, 0xC92C, 0xC934, 0xC950, 0xC951,
- 0xC954, 0xC958, 0xC960, 0xC961, 0xC963, 0xC96C, 0xC970, 0xC974,
- 0xC97C, 0xC988, 0xC989, 0xC98C, 0xC990, 0xC998, 0xC999, 0xC99B,
- 0xC99D, 0xC9C0, 0xC9C1, 0xC9C4, 0xC9C7, 0xC9C8, 0xC9CA, 0xC9D0,
- 0xC9D1, 0xC9D3, 0xC9D5, 0xC9D6, 0xC9D9, 0xC9DA, 0xC9DC, 0xC9DD,
- 0xC9E0, 0xC9E2, 0xC9E4, 0xC9E7, 0xC9EC, 0xC9ED, 0xC9EF, 0xC9F0,
- 0xC9F1, 0xC9F8, 0xC9F9, 0xC9FC, 0xCA00, 0xCA08, 0xCA09, 0xCA0B,
- 0xCA0C, 0xCA0D, 0xCA14, 0xCA18, 0xCA29, 0xCA4C, 0xCA4D, 0xCA50,
- 0xCA54, 0xCA5C, 0xCA5D, 0xCA5F, 0xCA60, 0xCA61, 0xCA68, 0xCA7D,
- 0xCA84, 0xCA98, 0xCABC, 0xCABD, 0xCAC0, 0xCAC4, 0xCACC, 0xCACD,
- 0xCACF, 0xCAD1, 0xCAD3, 0xCAD8, 0xCAD9, 0xCAE0, 0xCAEC, 0xCAF4,
- 0xCB08, 0xCB10, 0xCB14, 0xCB18, 0xCB20, 0xCB21, 0xCB41, 0xCB48,
- 0xCB49, 0xCB4C, 0xCB50, 0xCB58, 0xCB59, 0xCB5D, 0xCB64, 0xCB78,
- 0xCB79, 0xCB9C, 0xCBB8, 0xCBD4, 0xCBE4, 0xCBE7, 0xCBE9, 0xCC0C,
- 0xCC0D, 0xCC10, 0xCC14, 0xCC1C, 0xCC1D, 0xCC21, 0xCC22, 0xCC27,
- 0xCC28, 0xCC29, 0xCC2C, 0xCC2E, 0xCC30, 0xCC38, 0xCC39, 0xCC3B,
- 0xCC3C, 0xCC3D, 0xCC3E, 0xCC44, 0xCC45, 0xCC48, 0xCC4C, 0xCC54,
- 0xCC55, 0xCC57, 0xCC58, 0xCC59, 0xCC60, 0xCC64, 0xCC66, 0xCC68,
- 0xCC70, 0xCC75, 0xCC98, 0xCC99, 0xCC9C, 0xCCA0, 0xCCA8, 0xCCA9,
- 0xCCAB, 0xCCAC, 0xCCAD, 0xCCB4, 0xCCB5, 0xCCB8, 0xCCBC, 0xCCC4,
- 0xCCC5, 0xCCC7, 0xCCC9, 0xCCD0, 0xCCD4, 0xCCE4, 0xCCEC, 0xCCF0,
- 0xCD01, 0xCD08, 0xCD09, 0xCD0C, 0xCD10, 0xCD18, 0xCD19, 0xCD1B,
- 0xCD1D, 0xCD24, 0xCD28, 0xCD2C, 0xCD39, 0xCD5C, 0xCD60, 0xCD64,
- 0xCD6C, 0xCD6D, 0xCD6F, 0xCD71, 0xCD78, 0xCD88, 0xCD94, 0xCD95,
- 0xCD98, 0xCD9C, 0xCDA4, 0xCDA5, 0xCDA7, 0xCDA9, 0xCDB0, 0xCDC4,
- 0xCDCC, 0xCDD0, 0xCDE8, 0xCDEC, 0xCDF0, 0xCDF8, 0xCDF9, 0xCDFB,
- 0xCDFD, 0xCE04, 0xCE08, 0xCE0C, 0xCE14, 0xCE19, 0xCE20, 0xCE21,
- 0xCE24, 0xCE28, 0xCE30, 0xCE31, 0xCE33, 0xCE35, 0xCE58, 0xCE59,
- 0xCE5C, 0xCE5F, 0xCE60, 0xCE61, 0xCE68, 0xCE69, 0xCE6B, 0xCE6D,
- 0xCE74, 0xCE75, 0xCE78, 0xCE7C, 0xCE84, 0xCE85, 0xCE87, 0xCE89,
- 0xCE90, 0xCE91, 0xCE94, 0xCE98, 0xCEA0, 0xCEA1, 0xCEA3, 0xCEA4,
- 0xCEA5, 0xCEAC, 0xCEAD, 0xCEC1, 0xCEE4, 0xCEE5, 0xCEE8, 0xCEEB,
- 0xCEEC, 0xCEF4, 0xCEF5, 0xCEF7, 0xCEF8, 0xCEF9, 0xCF00, 0xCF01,
- 0xCF04, 0xCF08, 0xCF10, 0xCF11, 0xCF13, 0xCF15, 0xCF1C, 0xCF20,
- 0xCF24, 0xCF2C, 0xCF2D, 0xCF2F, 0xCF30, 0xCF31, 0xCF38, 0xCF54,
- 0xCF55, 0xCF58, 0xCF5C, 0xCF64, 0xCF65, 0xCF67, 0xCF69, 0xCF70,
- 0xCF71, 0xCF74, 0xCF78, 0xCF80, 0xCF85, 0xCF8C, 0xCFA1, 0xCFA8,
- 0xCFB0, 0xCFC4, 0xCFE0, 0xCFE1, 0xCFE4, 0xCFE8, 0xCFF0, 0xCFF1,
- 0xCFF3, 0xCFF5, 0xCFFC, 0xD000, 0xD004, 0xD011, 0xD018, 0xD02D,
- 0xD034, 0xD035, 0xD038, 0xD03C, 0xD044, 0xD045, 0xD047, 0xD049,
- 0xD050, 0xD054, 0xD058, 0xD060, 0xD06C, 0xD06D, 0xD070, 0xD074,
- 0xD07C, 0xD07D, 0xD081, 0xD0A4, 0xD0A5, 0xD0A8, 0xD0AC, 0xD0B4,
- 0xD0B5, 0xD0B7, 0xD0B9, 0xD0C0, 0xD0C1, 0xD0C4, 0xD0C8, 0xD0C9,
- 0xD0D0, 0xD0D1, 0xD0D3, 0xD0D4, 0xD0D5, 0xD0DC, 0xD0DD, 0xD0E0,
- 0xD0E4, 0xD0EC, 0xD0ED, 0xD0EF, 0xD0F0, 0xD0F1, 0xD0F8, 0xD10D,
- 0xD130, 0xD131, 0xD134, 0xD138, 0xD13A, 0xD140, 0xD141, 0xD143,
- 0xD144, 0xD145, 0xD14C, 0xD14D, 0xD150, 0xD154, 0xD15C, 0xD15D,
- 0xD15F, 0xD161, 0xD168, 0xD16C, 0xD17C, 0xD184, 0xD188, 0xD1A0,
- 0xD1A1, 0xD1A4, 0xD1A8, 0xD1B0, 0xD1B1, 0xD1B3, 0xD1B5, 0xD1BA,
- 0xD1BC, 0xD1C0, 0xD1D8, 0xD1F4, 0xD1F8, 0xD207, 0xD209, 0xD210,
- 0xD22C, 0xD22D, 0xD230, 0xD234, 0xD23C, 0xD23D, 0xD23F, 0xD241,
- 0xD248, 0xD25C, 0xD264, 0xD280, 0xD281, 0xD284, 0xD288, 0xD290,
- 0xD291, 0xD295, 0xD29C, 0xD2A0, 0xD2A4, 0xD2AC, 0xD2B1, 0xD2B8,
- 0xD2B9, 0xD2BC, 0xD2BF, 0xD2C0, 0xD2C2, 0xD2C8, 0xD2C9, 0xD2CB,
- 0xD2D4, 0xD2D8, 0xD2DC, 0xD2E4, 0xD2E5, 0xD2F0, 0xD2F1, 0xD2F4,
- 0xD2F8, 0xD300, 0xD301, 0xD303, 0xD305, 0xD30C, 0xD30D, 0xD30E,
- 0xD310, 0xD314, 0xD316, 0xD31C, 0xD31D, 0xD31F, 0xD320, 0xD321,
- 0xD325, 0xD328, 0xD329, 0xD32C, 0xD330, 0xD338, 0xD339, 0xD33B,
- 0xD33C, 0xD33D, 0xD344, 0xD345, 0xD37C, 0xD37D, 0xD380, 0xD384,
- 0xD38C, 0xD38D, 0xD38F, 0xD390, 0xD391, 0xD398, 0xD399, 0xD39C,
- 0xD3A0, 0xD3A8, 0xD3A9, 0xD3AB, 0xD3AD, 0xD3B4, 0xD3B8, 0xD3BC,
- 0xD3C4, 0xD3C5, 0xD3C8, 0xD3C9, 0xD3D0, 0xD3D8, 0xD3E1, 0xD3E3,
- 0xD3EC, 0xD3ED, 0xD3F0, 0xD3F4, 0xD3FC, 0xD3FD, 0xD3FF, 0xD401,
- 0xD408, 0xD41D, 0xD440, 0xD444, 0xD45C, 0xD460, 0xD464, 0xD46D,
- 0xD46F, 0xD478, 0xD479, 0xD47C, 0xD47F, 0xD480, 0xD482, 0xD488,
- 0xD489, 0xD48B, 0xD48D, 0xD494, 0xD4A9, 0xD4CC, 0xD4D0, 0xD4D4,
- 0xD4DC, 0xD4DF, 0xD4E8, 0xD4EC, 0xD4F0, 0xD4F8, 0xD4FB, 0xD4FD,
- 0xD504, 0xD508, 0xD50C, 0xD514, 0xD515, 0xD517, 0xD53C, 0xD53D,
- 0xD540, 0xD544, 0xD54C, 0xD54D, 0xD54F, 0xD551, 0xD558, 0xD559,
- 0xD55C, 0xD560, 0xD565, 0xD568, 0xD569, 0xD56B, 0xD56D, 0xD574,
- 0xD575, 0xD578, 0xD57C, 0xD584, 0xD585, 0xD587, 0xD588, 0xD589,
- 0xD590, 0xD5A5, 0xD5C8, 0xD5C9, 0xD5CC, 0xD5D0, 0xD5D2, 0xD5D8,
- 0xD5D9, 0xD5DB, 0xD5DD, 0xD5E4, 0xD5E5, 0xD5E8, 0xD5EC, 0xD5F4,
- 0xD5F5, 0xD5F7, 0xD5F9, 0xD600, 0xD601, 0xD604, 0xD608, 0xD610,
- 0xD611, 0xD613, 0xD614, 0xD615, 0xD61C, 0xD620, 0xD624, 0xD62D,
- 0xD638, 0xD639, 0xD63C, 0xD640, 0xD645, 0xD648, 0xD649, 0xD64B,
- 0xD64D, 0xD651, 0xD654, 0xD655, 0xD658, 0xD65C, 0xD667, 0xD669,
- 0xD670, 0xD671, 0xD674, 0xD683, 0xD685, 0xD68C, 0xD68D, 0xD690,
- 0xD694, 0xD69D, 0xD69F, 0xD6A1, 0xD6A8, 0xD6AC, 0xD6B0, 0xD6B9,
- 0xD6BB, 0xD6C4, 0xD6C5, 0xD6C8, 0xD6CC, 0xD6D1, 0xD6D4, 0xD6D7,
- 0xD6D9, 0xD6E0, 0xD6E4, 0xD6E8, 0xD6F0, 0xD6F5, 0xD6FC, 0xD6FD,
- 0xD700, 0xD704, 0xD711, 0xD718, 0xD719, 0xD71C, 0xD720, 0xD728,
- 0xD729, 0xD72B, 0xD72D, 0xD734, 0xD735, 0xD738, 0xD73C, 0xD744,
- 0xD747, 0xD749, 0xD750, 0xD751, 0xD754, 0xD756, 0xD757, 0xD758,
- 0xD759, 0xD760, 0xD761, 0xD763, 0xD765, 0xD769, 0xD76C, 0xD770,
- 0xD774, 0xD77C, 0xD77D, 0xD781, 0xD788, 0xD789, 0xD78C, 0xD790,
- 0xD798, 0xD799, 0xD79B, 0xD79D, 0x4F3D, 0x4F73, 0x5047, 0x50F9,
- 0x52A0, 0x53EF, 0x5475, 0x54E5, 0x5609, 0x5AC1, 0x5BB6, 0x6687,
- 0x67B6, 0x67B7, 0x67EF, 0x6B4C, 0x73C2, 0x75C2, 0x7A3C, 0x82DB,
- 0x8304, 0x8857, 0x8888, 0x8A36, 0x8CC8, 0x8DCF, 0x8EFB, 0x8FE6,
- 0x99D5, 0x523B, 0x5374, 0x5404, 0x606A, 0x6164, 0x6BBC, 0x73CF,
- 0x811A, 0x89BA, 0x89D2, 0x95A3, 0x4F83, 0x520A, 0x58BE, 0x5978,
- 0x59E6, 0x5E72, 0x5E79, 0x61C7, 0x63C0, 0x6746, 0x67EC, 0x687F,
- 0x6F97, 0x764E, 0x770B, 0x78F5, 0x7A08, 0x7AFF, 0x7C21, 0x809D,
- 0x826E, 0x8271, 0x8AEB, 0x9593, 0x4E6B, 0x559D, 0x66F7, 0x6E34,
- 0x78A3, 0x7AED, 0x845B, 0x8910, 0x874E, 0x97A8, 0x52D8, 0x574E,
- 0x582A, 0x5D4C, 0x611F, 0x61BE, 0x6221, 0x6562, 0x67D1, 0x6A44,
- 0x6E1B, 0x7518, 0x75B3, 0x76E3, 0x77B0, 0x7D3A, 0x90AF, 0x9451,
- 0x9452, 0x9F95, 0x5323, 0x5CAC, 0x7532, 0x80DB, 0x9240, 0x9598,
- 0x525B, 0x5808, 0x59DC, 0x5CA1, 0x5D17, 0x5EB7, 0x5F3A, 0x5F4A,
- 0x6177, 0x6C5F, 0x757A, 0x7586, 0x7CE0, 0x7D73, 0x7DB1, 0x7F8C,
- 0x8154, 0x8221, 0x8591, 0x8941, 0x8B1B, 0x92FC, 0x964D, 0x9C47,
- 0x4ECB, 0x4EF7, 0x500B, 0x51F1, 0x584F, 0x6137, 0x613E, 0x6168,
- 0x6539, 0x69EA, 0x6F11, 0x75A5, 0x7686, 0x76D6, 0x7B87, 0x82A5,
- 0x84CB, 0x93A7, 0x958B, 0x5580, 0x5BA2, 0x5751, 0x7CB3, 0x7FB9,
- 0x91B5, 0x5028, 0x53BB, 0x5C45, 0x5DE8, 0x62D2, 0x636E, 0x64DA,
- 0x64E7, 0x6E20, 0x70AC, 0x795B, 0x8DDD, 0x8E1E, 0x907D, 0x9245,
- 0x92F8, 0x4E7E, 0x4EF6, 0x5065, 0x5DFE, 0x5EFA, 0x6106, 0x6957,
- 0x8171, 0x8654, 0x8E47, 0x9375, 0x9A2B, 0x4E5E, 0x5091, 0x6770,
- 0x6840, 0x5109, 0x528D, 0x5292, 0x6AA2, 0x77BC, 0x9210, 0x9ED4,
- 0x52AB, 0x602F, 0x8FF2, 0x5048, 0x61A9, 0x63ED, 0x64CA, 0x683C,
- 0x6A84, 0x6FC0, 0x8188, 0x89A1, 0x9694, 0x5805, 0x727D, 0x72AC,
- 0x7504, 0x7D79, 0x7E6D, 0x80A9, 0x898B, 0x8B74, 0x9063, 0x9D51,
- 0x6289, 0x6C7A, 0x6F54, 0x7D50, 0x7F3A, 0x8A23, 0x517C, 0x614A,
- 0x7B9D, 0x8B19, 0x9257, 0x938C, 0x4EAC, 0x4FD3, 0x501E, 0x50BE,
- 0x5106, 0x52C1, 0x52CD, 0x537F, 0x5770, 0x5883, 0x5E9A, 0x5F91,
- 0x6176, 0x61AC, 0x64CE, 0x656C, 0x666F, 0x66BB, 0x66F4, 0x6897,
- 0x6D87, 0x7085, 0x70F1, 0x749F, 0x74A5, 0x74CA, 0x75D9, 0x786C,
- 0x78EC, 0x7ADF, 0x7AF6, 0x7D45, 0x7D93, 0x8015, 0x803F, 0x811B,
- 0x8396, 0x8B66, 0x8F15, 0x9015, 0x93E1, 0x9803, 0x9838, 0x9A5A,
- 0x9BE8, 0x4FC2, 0x5553, 0x583A, 0x5951, 0x5B63, 0x5C46, 0x60B8,
- 0x6212, 0x6842, 0x68B0, 0x68E8, 0x6EAA, 0x754C, 0x7678, 0x78CE,
- 0x7A3D, 0x7CFB, 0x7E6B, 0x7E7C, 0x8A08, 0x8AA1, 0x8C3F, 0x968E,
- 0x9DC4, 0x53E4, 0x53E9, 0x544A, 0x5471, 0x56FA, 0x59D1, 0x5B64,
- 0x5C3B, 0x5EAB, 0x62F7, 0x6537, 0x6545, 0x6572, 0x66A0, 0x67AF,
- 0x69C1, 0x6CBD, 0x75FC, 0x7690, 0x777E, 0x7A3F, 0x7F94, 0x8003,
- 0x80A1, 0x818F, 0x82E6, 0x82FD, 0x83F0, 0x85C1, 0x8831, 0x88B4,
- 0x8AA5, 0x8F9C, 0x932E, 0x96C7, 0x9867, 0x9AD8, 0x9F13, 0x54ED,
- 0x659B, 0x66F2, 0x688F, 0x7A40, 0x8C37, 0x9D60, 0x56F0, 0x5764,
- 0x5D11, 0x6606, 0x68B1, 0x68CD, 0x6EFE, 0x7428, 0x889E, 0x9BE4,
- 0x6C68, 0x9AA8, 0x4F9B, 0x516C, 0x5171, 0x529F, 0x5B54, 0x5DE5,
- 0x6050, 0x606D, 0x62F1, 0x63A7, 0x653B, 0x73D9, 0x7A7A, 0x86A3,
- 0x8CA2, 0x978F, 0x4E32, 0x5BE1, 0x6208, 0x679C, 0x74DC, 0x79D1,
- 0x83D3, 0x8A87, 0x8AB2, 0x8DE8, 0x904E, 0x934B, 0x9846, 0x5ED3,
- 0x69E8, 0x85FF, 0x90ED, 0x51A0, 0x5B98, 0x5BEC, 0x6163, 0x68FA,
- 0x6B3E, 0x704C, 0x742F, 0x74D8, 0x7BA1, 0x7F50, 0x83C5, 0x89C0,
- 0x8CAB, 0x95DC, 0x9928, 0x522E, 0x605D, 0x62EC, 0x9002, 0x4F8A,
- 0x5149, 0x5321, 0x58D9, 0x5EE3, 0x66E0, 0x6D38, 0x709A, 0x72C2,
- 0x73D6, 0x7B50, 0x80F1, 0x945B, 0x5366, 0x639B, 0x7F6B, 0x4E56,
- 0x5080, 0x584A, 0x58DE, 0x602A, 0x6127, 0x62D0, 0x69D0, 0x9B41,
- 0x5B8F, 0x7D18, 0x80B1, 0x8F5F, 0x4EA4, 0x50D1, 0x54AC, 0x55AC,
- 0x5B0C, 0x5DA0, 0x5DE7, 0x652A, 0x654E, 0x6821, 0x6A4B, 0x72E1,
- 0x768E, 0x77EF, 0x7D5E, 0x7FF9, 0x81A0, 0x854E, 0x86DF, 0x8F03,
- 0x8F4E, 0x90CA, 0x9903, 0x9A55, 0x9BAB, 0x4E18, 0x4E45, 0x4E5D,
- 0x4EC7, 0x4FF1, 0x5177, 0x52FE, 0x5340, 0x53E3, 0x53E5, 0x548E,
- 0x5614, 0x5775, 0x57A2, 0x5BC7, 0x5D87, 0x5ED0, 0x61FC, 0x62D8,
- 0x6551, 0x67B8, 0x67E9, 0x69CB, 0x6B50, 0x6BC6, 0x6BEC, 0x6C42,
- 0x6E9D, 0x7078, 0x72D7, 0x7396, 0x7403, 0x77BF, 0x77E9, 0x7A76,
- 0x7D7F, 0x8009, 0x81FC, 0x8205, 0x820A, 0x82DF, 0x8862, 0x8B33,
- 0x8CFC, 0x8EC0, 0x9011, 0x90B1, 0x9264, 0x92B6, 0x99D2, 0x9A45,
- 0x9CE9, 0x9DD7, 0x9F9C, 0x570B, 0x5C40, 0x83CA, 0x97A0, 0x97AB,
- 0x9EB4, 0x541B, 0x7A98, 0x7FA4, 0x88D9, 0x8ECD, 0x90E1, 0x5800,
- 0x5C48, 0x6398, 0x7A9F, 0x5BAE, 0x5F13, 0x7A79, 0x7AAE, 0x828E,
- 0x8EAC, 0x5026, 0x5238, 0x52F8, 0x5377, 0x5708, 0x62F3, 0x6372,
- 0x6B0A, 0x6DC3, 0x7737, 0x53A5, 0x7357, 0x8568, 0x8E76, 0x95D5,
- 0x673A, 0x6AC3, 0x6F70, 0x8A6D, 0x8ECC, 0x994B, 0x6677, 0x6B78,
- 0x8CB4, 0x9B3C, 0x53EB, 0x572D, 0x594E, 0x63C6, 0x69FB, 0x73EA,
- 0x7845, 0x7ABA, 0x7AC5, 0x7CFE, 0x8475, 0x898F, 0x8D73, 0x9035,
- 0x95A8, 0x52FB, 0x5747, 0x7547, 0x7B60, 0x83CC, 0x921E, 0x6A58,
- 0x514B, 0x524B, 0x5287, 0x621F, 0x68D8, 0x6975, 0x9699, 0x50C5,
- 0x52A4, 0x52E4, 0x61C3, 0x65A4, 0x6839, 0x69FF, 0x747E, 0x7B4B,
- 0x82B9, 0x83EB, 0x89B2, 0x8B39, 0x8FD1, 0x9949, 0x4ECA, 0x5997,
- 0x64D2, 0x6611, 0x6A8E, 0x7434, 0x7981, 0x79BD, 0x82A9, 0x887E,
- 0x887F, 0x895F, 0x9326, 0x4F0B, 0x53CA, 0x6025, 0x6271, 0x6C72,
- 0x7D1A, 0x7D66, 0x4E98, 0x5162, 0x77DC, 0x80AF, 0x4F01, 0x4F0E,
- 0x5176, 0x5180, 0x55DC, 0x5668, 0x573B, 0x57FA, 0x57FC, 0x5914,
- 0x5947, 0x5993, 0x5BC4, 0x5C90, 0x5D0E, 0x5DF1, 0x5E7E, 0x5FCC,
- 0x6280, 0x65D7, 0x65E3, 0x671E, 0x671F, 0x675E, 0x68CB, 0x68C4,
- 0x6A5F, 0x6B3A, 0x6C23, 0x6C7D, 0x6C82, 0x6DC7, 0x7398, 0x7426,
- 0x742A, 0x7482, 0x74A3, 0x7578, 0x757F, 0x7881, 0x78EF, 0x7941,
- 0x7947, 0x7948, 0x797A, 0x7B95, 0x7D00, 0x7DBA, 0x7F88, 0x8006,
- 0x802D, 0x808C, 0x8A18, 0x8B4F, 0x8C48, 0x8D77, 0x9321, 0x9324,
- 0x98E2, 0x9951, 0x9A0E, 0x9A0F, 0x9A65, 0x9E92, 0x7DCA, 0x4F76,
- 0x5409, 0x62EE, 0x6854, 0x91D1, 0x55AB, 0x513A, 0x5A1C, 0x61E6,
- 0x62CF, 0x62FF, 0x90A3, 0x8AFE, 0x6696, 0x7156, 0x96E3, 0x634F,
- 0x637A, 0x5357, 0x678F, 0x6960, 0x6E73, 0x7537, 0x7D0D, 0x8872,
- 0x56CA, 0x5A18, 0x4E43, 0x5167, 0x5948, 0x67F0, 0x8010, 0x5973,
- 0x5E74, 0x649A, 0x79CA, 0x5FF5, 0x606C, 0x62C8, 0x637B, 0x5BE7,
- 0x5BD7, 0x52AA, 0x5974, 0x5F29, 0x6012, 0x7459, 0x99D1, 0x6FC3,
- 0x81BF, 0x8FB2, 0x60F1, 0x8166, 0x5C3F, 0x5AE9, 0x8A25, 0x677B,
- 0x7D10, 0x80FD, 0x5C3C, 0x6CE5, 0x533F, 0x6EBA, 0x591A, 0x8336,
- 0x4E39, 0x4EB6, 0x4F46, 0x55AE, 0x5718, 0x58C7, 0x5F56, 0x65B7,
- 0x65E6, 0x6A80, 0x6BB5, 0x6E4D, 0x77ED, 0x7AEF, 0x7C1E, 0x7DDE,
- 0x86CB, 0x8892, 0x9132, 0x935B, 0x64BB, 0x6FBE, 0x737A, 0x75B8,
- 0x9054, 0x5556, 0x574D, 0x61BA, 0x64D4, 0x66C7, 0x6DE1, 0x6E5B,
- 0x6F6D, 0x6FB9, 0x75F0, 0x8043, 0x81BD, 0x8541, 0x8983, 0x8AC7,
- 0x8B5A, 0x931F, 0x6C93, 0x7553, 0x7B54, 0x8E0F, 0x905D, 0x5510,
- 0x5802, 0x5858, 0x5E62, 0x6207, 0x649E, 0x68E0, 0x7576, 0x7CD6,
- 0x87B3, 0x9EE8, 0x4EE3, 0x5788, 0x576E, 0x5927, 0x5C0D, 0x5CB1,
- 0x5E36, 0x5F85, 0x6234, 0x64E1, 0x73B3, 0x81FA, 0x888B, 0x8CB8,
- 0x968A, 0x9EDB, 0x5B85, 0x5FB7, 0x60B3, 0x5012, 0x5200, 0x5230,
- 0x5716, 0x5835, 0x5857, 0x5C0E, 0x5C60, 0x5CF6, 0x5D8B, 0x5EA6,
- 0x5F92, 0x60BC, 0x6311, 0x6389, 0x6417, 0x6843, 0x68F9, 0x6AC2,
- 0x6DD8, 0x6E21, 0x6ED4, 0x6FE4, 0x71FE, 0x76DC, 0x7779, 0x79B1,
- 0x7A3B, 0x8404, 0x89A9, 0x8CED, 0x8DF3, 0x8E48, 0x9003, 0x9014,
- 0x9053, 0x90FD, 0x934D, 0x9676, 0x97DC, 0x6BD2, 0x7006, 0x7258,
- 0x72A2, 0x7368, 0x7763, 0x79BF, 0x7BE4, 0x7E9B, 0x8B80, 0x58A9,
- 0x60C7, 0x6566, 0x65FD, 0x66BE, 0x6C8C, 0x711E, 0x71C9, 0x8C5A,
- 0x9813, 0x4E6D, 0x7A81, 0x4EDD, 0x51AC, 0x51CD, 0x52D5, 0x540C,
- 0x61A7, 0x6771, 0x6850, 0x68DF, 0x6D1E, 0x6F7C, 0x75BC, 0x77B3,
- 0x7AE5, 0x80F4, 0x8463, 0x9285, 0x515C, 0x6597, 0x675C, 0x6793,
- 0x75D8, 0x7AC7, 0x8373, 0x8C46, 0x9017, 0x982D, 0x5C6F, 0x81C0,
- 0x829A, 0x9041, 0x906F, 0x920D, 0x5F97, 0x5D9D, 0x6A59, 0x71C8,
- 0x767B, 0x7B49, 0x85E4, 0x8B04, 0x9127, 0x9A30, 0x5587, 0x61F6,
- 0x7669, 0x7F85, 0x863F, 0x87BA, 0x88F8, 0x908F, 0x6D1B, 0x70D9,
- 0x73DE, 0x7D61, 0x843D, 0x916A, 0x99F1, 0x4E82, 0x5375, 0x6B04,
- 0x6B12, 0x703E, 0x721B, 0x862D, 0x9E1E, 0x524C, 0x8FA3, 0x5D50,
- 0x64E5, 0x652C, 0x6B16, 0x6FEB, 0x7C43, 0x7E9C, 0x85CD, 0x8964,
- 0x89BD, 0x62C9, 0x81D8, 0x881F, 0x5ECA, 0x6717, 0x6D6A, 0x72FC,
- 0x7405, 0x746F, 0x8782, 0x90DE, 0x4F86, 0x5D0D, 0x5FA0, 0x840A,
- 0x51B7, 0x63A0, 0x7565, 0x4EAE, 0x5006, 0x5169, 0x51C9, 0x6881,
- 0x6A11, 0x7CAE, 0x7CB1, 0x7CE7, 0x826F, 0x8AD2, 0x8F1B, 0x91CF,
- 0x4FB6, 0x5137, 0x52F5, 0x5442, 0x5EEC, 0x616E, 0x623E, 0x65C5,
- 0x6ADA, 0x6FFE, 0x792A, 0x85DC, 0x8823, 0x95AD, 0x9A62, 0x9A6A,
- 0x9E97, 0x9ECE, 0x529B, 0x66C6, 0x6B77, 0x701D, 0x792B, 0x8F62,
- 0x9742, 0x6190, 0x6200, 0x6523, 0x6F23, 0x7149, 0x7489, 0x7DF4,
- 0x806F, 0x84EE, 0x8F26, 0x9023, 0x934A, 0x51BD, 0x5217, 0x52A3,
- 0x6D0C, 0x70C8, 0x88C2, 0x5EC9, 0x6582, 0x6BAE, 0x6FC2, 0x7C3E,
- 0x7375, 0x4EE4, 0x4F36, 0x56F9, 0x5CBA, 0x5DBA, 0x601C, 0x73B2,
- 0x7B2D, 0x7F9A, 0x7FCE, 0x8046, 0x901E, 0x9234, 0x96F6, 0x9748,
- 0x9818, 0x9F61, 0x4F8B, 0x6FA7, 0x79AE, 0x91B4, 0x96B7, 0x52DE,
- 0x6488, 0x64C4, 0x6AD3, 0x6F5E, 0x7018, 0x7210, 0x76E7, 0x8001,
- 0x8606, 0x865C, 0x8DEF, 0x8F05, 0x9732, 0x9B6F, 0x9DFA, 0x9E75,
- 0x788C, 0x797F, 0x7DA0, 0x83C9, 0x9304, 0x9E7F, 0x9E93, 0x8AD6,
- 0x58DF, 0x5F04, 0x6727, 0x7027, 0x74CF, 0x7C60, 0x807E, 0x5121,
- 0x7028, 0x7262, 0x78CA, 0x8CC2, 0x8CDA, 0x8CF4, 0x96F7, 0x4E86,
- 0x50DA, 0x5BEE, 0x5ED6, 0x6599, 0x71CE, 0x7642, 0x77AD, 0x804A,
- 0x84FC, 0x907C, 0x9B27, 0x9F8D, 0x58D8, 0x5A41, 0x5C62, 0x6A13,
- 0x6DDA, 0x6F0F, 0x763B, 0x7D2F, 0x7E37, 0x851E, 0x8938, 0x93E4,
- 0x964B, 0x5289, 0x65D2, 0x67F3, 0x69B4, 0x6D41, 0x6E9C, 0x700F,
- 0x7409, 0x7460, 0x7559, 0x7624, 0x786B, 0x8B2C, 0x985E, 0x516D,
- 0x622E, 0x9678, 0x4F96, 0x502B, 0x5D19, 0x6DEA, 0x7DB8, 0x8F2A,
- 0x5F8B, 0x6144, 0x6817, 0x9686, 0x52D2, 0x808B, 0x51DC, 0x51CC,
- 0x695E, 0x7A1C, 0x7DBE, 0x83F1, 0x9675, 0x4FDA, 0x5229, 0x5398,
- 0x540F, 0x550E, 0x5C65, 0x60A7, 0x674E, 0x68A8, 0x6D6C, 0x7281,
- 0x72F8, 0x7406, 0x7483, 0x75E2, 0x7C6C, 0x7F79, 0x7FB8, 0x8389,
- 0x88CF, 0x88E1, 0x91CC, 0x91D0, 0x96E2, 0x9BC9, 0x541D, 0x6F7E,
- 0x71D0, 0x7498, 0x85FA, 0x8EAA, 0x96A3, 0x9C57, 0x9E9F, 0x6797,
- 0x6DCB, 0x7433, 0x81E8, 0x9716, 0x782C, 0x7ACB, 0x7B20, 0x7C92,
- 0x6469, 0x746A, 0x75F2, 0x78BC, 0x78E8, 0x99AC, 0x9B54, 0x9EBB,
- 0x5BDE, 0x5E55, 0x6F20, 0x819C, 0x83AB, 0x9088, 0x4E07, 0x534D,
- 0x5A29, 0x5DD2, 0x5F4E, 0x6162, 0x633D, 0x6669, 0x66FC, 0x6EFF,
- 0x6F2B, 0x7063, 0x779E, 0x842C, 0x8513, 0x883B, 0x8F13, 0x9945,
- 0x9C3B, 0x551C, 0x62B9, 0x672B, 0x6CAB, 0x8309, 0x896A, 0x977A,
- 0x4EA1, 0x5984, 0x5FD8, 0x5FD9, 0x671B, 0x7DB2, 0x7F54, 0x8292,
- 0x832B, 0x83BD, 0x8F1E, 0x9099, 0x57CB, 0x59B9, 0x5A92, 0x5BD0,
- 0x6627, 0x679A, 0x6885, 0x6BCF, 0x7164, 0x7F75, 0x8CB7, 0x8CE3,
- 0x9081, 0x9B45, 0x8108, 0x8C8A, 0x964C, 0x9A40, 0x9EA5, 0x5B5F,
- 0x6C13, 0x731B, 0x76F2, 0x76DF, 0x840C, 0x51AA, 0x8993, 0x514D,
- 0x5195, 0x52C9, 0x68C9, 0x6C94, 0x7704, 0x7720, 0x7DBF, 0x7DEC,
- 0x9762, 0x9EB5, 0x6EC5, 0x8511, 0x51A5, 0x540D, 0x547D, 0x660E,
- 0x669D, 0x6927, 0x6E9F, 0x76BF, 0x7791, 0x8317, 0x84C2, 0x879F,
- 0x9169, 0x9298, 0x9CF4, 0x8882, 0x4FAE, 0x5192, 0x52DF, 0x59C6,
- 0x5E3D, 0x6155, 0x6478, 0x6479, 0x66AE, 0x67D0, 0x6A21, 0x6BCD,
- 0x6BDB, 0x725F, 0x7261, 0x7441, 0x7738, 0x77DB, 0x8017, 0x82BC,
- 0x8305, 0x8B00, 0x8B28, 0x8C8C, 0x6728, 0x6C90, 0x7267, 0x76EE,
- 0x7766, 0x7A46, 0x9DA9, 0x6B7F, 0x6C92, 0x5922, 0x6726, 0x8499,
- 0x536F, 0x5893, 0x5999, 0x5EDF, 0x63CF, 0x6634, 0x6773, 0x6E3A,
- 0x732B, 0x7AD7, 0x82D7, 0x9328, 0x52D9, 0x5DEB, 0x61AE, 0x61CB,
- 0x620A, 0x62C7, 0x64AB, 0x65E0, 0x6959, 0x6B66, 0x6BCB, 0x7121,
- 0x73F7, 0x755D, 0x7E46, 0x821E, 0x8302, 0x856A, 0x8AA3, 0x8CBF,
- 0x9727, 0x9D61, 0x58A8, 0x9ED8, 0x5011, 0x520E, 0x543B, 0x554F,
- 0x6587, 0x6C76, 0x7D0A, 0x7D0B, 0x805E, 0x868A, 0x9580, 0x96EF,
- 0x52FF, 0x6C95, 0x7269, 0x5473, 0x5A9A, 0x5C3E, 0x5D4B, 0x5F4C,
- 0x5FAE, 0x672A, 0x68B6, 0x6963, 0x6E3C, 0x6E44, 0x7709, 0x7C73,
- 0x7F8E, 0x8587, 0x8B0E, 0x8FF7, 0x9761, 0x9EF4, 0x5CB7, 0x60B6,
- 0x610D, 0x61AB, 0x654F, 0x65FB, 0x65FC, 0x6C11, 0x6CEF, 0x739F,
- 0x73C9, 0x7DE1, 0x9594, 0x5BC6, 0x871C, 0x8B10, 0x525D, 0x535A,
- 0x62CD, 0x640F, 0x64B2, 0x6734, 0x6A38, 0x6CCA, 0x73C0, 0x749E,
- 0x7B94, 0x7C95, 0x7E1B, 0x818A, 0x8236, 0x8584, 0x8FEB, 0x96F9,
- 0x99C1, 0x4F34, 0x534A, 0x53CD, 0x53DB, 0x62CC, 0x642C, 0x6500,
- 0x6591, 0x69C3, 0x6CEE, 0x6F58, 0x73ED, 0x7554, 0x7622, 0x76E4,
- 0x76FC, 0x78D0, 0x78FB, 0x792C, 0x7D46, 0x822C, 0x87E0, 0x8FD4,
- 0x9812, 0x98EF, 0x52C3, 0x62D4, 0x64A5, 0x6E24, 0x6F51, 0x767C,
- 0x8DCB, 0x91B1, 0x9262, 0x9AEE, 0x9B43, 0x5023, 0x508D, 0x574A,
- 0x59A8, 0x5C28, 0x5E47, 0x5F77, 0x623F, 0x653E, 0x65B9, 0x65C1,
- 0x6609, 0x678B, 0x699C, 0x6EC2, 0x78C5, 0x7D21, 0x80AA, 0x8180,
- 0x822B, 0x82B3, 0x84A1, 0x868C, 0x8A2A, 0x8B17, 0x90A6, 0x9632,
- 0x9F90, 0x500D, 0x4FF3, 0x57F9, 0x5F98, 0x62DC, 0x6392, 0x676F,
- 0x6E43, 0x7119, 0x76C3, 0x80CC, 0x80DA, 0x88F4, 0x88F5, 0x8919,
- 0x8CE0, 0x8F29, 0x914D, 0x966A, 0x4F2F, 0x4F70, 0x5E1B, 0x67CF,
- 0x6822, 0x767D, 0x767E, 0x9B44, 0x5E61, 0x6A0A, 0x7169, 0x71D4,
- 0x756A, 0x7E41, 0x8543, 0x85E9, 0x98DC, 0x4F10, 0x7B4F, 0x7F70,
- 0x95A5, 0x51E1, 0x5E06, 0x68B5, 0x6C3E, 0x6C4E, 0x6CDB, 0x72AF,
- 0x7BC4, 0x8303, 0x6CD5, 0x743A, 0x50FB, 0x5288, 0x58C1, 0x64D8,
- 0x6A97, 0x74A7, 0x7656, 0x78A7, 0x8617, 0x95E2, 0x9739, 0x535E,
- 0x5F01, 0x8B8A, 0x8FA8, 0x8FAF, 0x908A, 0x5225, 0x77A5, 0x9C49,
- 0x9F08, 0x4E19, 0x5002, 0x5175, 0x5C5B, 0x5E77, 0x661E, 0x663A,
- 0x67C4, 0x68C5, 0x70B3, 0x7501, 0x75C5, 0x79C9, 0x7ADD, 0x8F27,
- 0x9920, 0x9A08, 0x4FDD, 0x5821, 0x5831, 0x5BF6, 0x666E, 0x6B65,
- 0x6D11, 0x6E7A, 0x6F7D, 0x73E4, 0x752B, 0x83E9, 0x88DC, 0x8913,
- 0x8B5C, 0x8F14, 0x4F0F, 0x50D5, 0x5310, 0x535C, 0x5B93, 0x5FA9,
- 0x670D, 0x798F, 0x8179, 0x832F, 0x8514, 0x8907, 0x8986, 0x8F39,
- 0x8F3B, 0x99A5, 0x9C12, 0x672C, 0x4E76, 0x4FF8, 0x5949, 0x5C01,
- 0x5CEF, 0x5CF0, 0x6367, 0x68D2, 0x70FD, 0x71A2, 0x742B, 0x7E2B,
- 0x84EC, 0x8702, 0x9022, 0x92D2, 0x9CF3, 0x4E0D, 0x4ED8, 0x4FEF,
- 0x5085, 0x5256, 0x526F, 0x5426, 0x5490, 0x57E0, 0x592B, 0x5A66,
- 0x5B5A, 0x5B75, 0x5BCC, 0x5E9C, 0x6276, 0x6577, 0x65A7, 0x6D6E,
- 0x6EA5, 0x7236, 0x7B26, 0x7C3F, 0x7F36, 0x8150, 0x8151, 0x819A,
- 0x8240, 0x8299, 0x83A9, 0x8A03, 0x8CA0, 0x8CE6, 0x8CFB, 0x8D74,
- 0x8DBA, 0x90E8, 0x91DC, 0x961C, 0x9644, 0x99D9, 0x9CE7, 0x5317,
- 0x5206, 0x5429, 0x5674, 0x58B3, 0x5954, 0x596E, 0x5FFF, 0x61A4,
- 0x626E, 0x6610, 0x6C7E, 0x711A, 0x76C6, 0x7C89, 0x7CDE, 0x7D1B,
- 0x82AC, 0x8CC1, 0x96F0, 0x4F5B, 0x5F17, 0x5F7F, 0x62C2, 0x5D29,
- 0x670B, 0x68DA, 0x787C, 0x7E43, 0x9D6C, 0x4E15, 0x5099, 0x5315,
- 0x532A, 0x5351, 0x5983, 0x5A62, 0x5E87, 0x60B2, 0x618A, 0x6249,
- 0x6279, 0x6590, 0x6787, 0x69A7, 0x6BD4, 0x6BD6, 0x6BD7, 0x6BD8,
- 0x6CB8, 0x7435, 0x75FA, 0x7812, 0x7891, 0x79D5, 0x79D8, 0x7C83,
- 0x7DCB, 0x7FE1, 0x80A5, 0x813E, 0x81C2, 0x83F2, 0x871A, 0x88E8,
- 0x8AB9, 0x8B6C, 0x8CBB, 0x9119, 0x975E, 0x98DB, 0x9F3B, 0x56AC,
- 0x5B2A, 0x5F6C, 0x658C, 0x6AB3, 0x6BAF, 0x6D5C, 0x6FF1, 0x7015,
- 0x725D, 0x73AD, 0x8CA7, 0x8CD3, 0x983B, 0x6191, 0x6C37, 0x8058,
- 0x9A01, 0x4E4D, 0x4E8B, 0x4E9B, 0x4ED5, 0x4F3A, 0x4F3C, 0x4F7F,
- 0x4FDF, 0x50FF, 0x53F2, 0x53F8, 0x5506, 0x55E3, 0x56DB, 0x58EB,
- 0x5962, 0x5A11, 0x5BEB, 0x5BFA, 0x5C04, 0x5DF3, 0x5E2B, 0x5F99,
- 0x601D, 0x6368, 0x659C, 0x65AF, 0x67F6, 0x67FB, 0x68AD, 0x6B7B,
- 0x6C99, 0x6CD7, 0x6E23, 0x7009, 0x7345, 0x7802, 0x793E, 0x7940,
- 0x7960, 0x79C1, 0x7BE9, 0x7D17, 0x7D72, 0x8086, 0x820D, 0x838E,
- 0x84D1, 0x86C7, 0x88DF, 0x8A50, 0x8A5E, 0x8B1D, 0x8CDC, 0x8D66,
- 0x8FAD, 0x90AA, 0x98FC, 0x99DF, 0x9E9D, 0x524A, 0x6714, 0x5098,
- 0x522A, 0x5C71, 0x6563, 0x6C55, 0x73CA, 0x7523, 0x759D, 0x7B97,
- 0x849C, 0x9178, 0x9730, 0x4E77, 0x6492, 0x6BBA, 0x715E, 0x85A9,
- 0x4E09, 0x6749, 0x68EE, 0x6E17, 0x829F, 0x8518, 0x886B, 0x63F7,
- 0x6F81, 0x9212, 0x98AF, 0x4E0A, 0x50B7, 0x50CF, 0x511F, 0x5546,
- 0x55AA, 0x5617, 0x5B40, 0x5C19, 0x5CE0, 0x5E38, 0x5E8A, 0x5EA0,
- 0x5EC2, 0x60F3, 0x6851, 0x6A61, 0x6E58, 0x723D, 0x7240, 0x72C0,
- 0x76F8, 0x7965, 0x7BB1, 0x7FD4, 0x88F3, 0x89F4, 0x8A73, 0x8C61,
- 0x8CDE, 0x971C, 0x585E, 0x74BD, 0x8CFD, 0x55C7, 0x7A61, 0x7D22,
- 0x8272, 0x7272, 0x751F, 0x7525, 0x7B19, 0x5885, 0x58FB, 0x5DBC,
- 0x5E8F, 0x5EB6, 0x5F90, 0x6055, 0x6292, 0x637F, 0x654D, 0x6691,
- 0x66D9, 0x66F8, 0x6816, 0x68F2, 0x7280, 0x745E, 0x7B6E, 0x7D6E,
- 0x7DD6, 0x7F72, 0x80E5, 0x8212, 0x85AF, 0x897F, 0x8A93, 0x901D,
- 0x92E4, 0x9ECD, 0x9F20, 0x5915, 0x596D, 0x5E2D, 0x60DC, 0x6614,
- 0x6673, 0x6790, 0x6C50, 0x6DC5, 0x6F5F, 0x77F3, 0x78A9, 0x84C6,
- 0x91CB, 0x932B, 0x4ED9, 0x50CA, 0x5148, 0x5584, 0x5B0B, 0x5BA3,
- 0x6247, 0x657E, 0x65CB, 0x6E32, 0x717D, 0x7401, 0x7444, 0x7487,
- 0x74BF, 0x766C, 0x79AA, 0x7DDA, 0x7E55, 0x7FA8, 0x817A, 0x81B3,
- 0x8239, 0x861A, 0x87EC, 0x8A75, 0x8DE3, 0x9078, 0x9291, 0x9425,
- 0x994D, 0x9BAE, 0x5368, 0x5C51, 0x6954, 0x6CC4, 0x6D29, 0x6E2B,
- 0x820C, 0x859B, 0x893B, 0x8A2D, 0x8AAA, 0x96EA, 0x9F67, 0x5261,
- 0x66B9, 0x6BB2, 0x7E96, 0x87FE, 0x8D0D, 0x9583, 0x965D, 0x651D,
- 0x6D89, 0x71EE, 0x57CE, 0x59D3, 0x5BAC, 0x6027, 0x60FA, 0x6210,
- 0x661F, 0x665F, 0x7329, 0x73F9, 0x76DB, 0x7701, 0x7B6C, 0x8056,
- 0x8072, 0x8165, 0x8AA0, 0x9192, 0x4E16, 0x52E2, 0x6B72, 0x6D17,
- 0x7A05, 0x7B39, 0x7D30, 0x8CB0, 0x53EC, 0x562F, 0x5851, 0x5BB5,
- 0x5C0F, 0x5C11, 0x5DE2, 0x6240, 0x6383, 0x6414, 0x662D, 0x68B3,
- 0x6CBC, 0x6D88, 0x6EAF, 0x701F, 0x70A4, 0x71D2, 0x7526, 0x758F,
- 0x758E, 0x7619, 0x7B11, 0x7BE0, 0x7C2B, 0x7D20, 0x7D39, 0x852C,
- 0x856D, 0x8607, 0x8A34, 0x900D, 0x9061, 0x90B5, 0x92B7, 0x97F6,
- 0x9A37, 0x4FD7, 0x5C6C, 0x675F, 0x6D91, 0x7C9F, 0x7E8C, 0x8B16,
- 0x8D16, 0x901F, 0x5B6B, 0x5DFD, 0x640D, 0x84C0, 0x905C, 0x98E1,
- 0x7387, 0x5B8B, 0x609A, 0x677E, 0x6DDE, 0x8A1F, 0x8AA6, 0x9001,
- 0x980C, 0x5237, 0x7051, 0x788E, 0x9396, 0x8870, 0x91D7, 0x4FEE,
- 0x53D7, 0x55FD, 0x56DA, 0x5782, 0x58FD, 0x5AC2, 0x5B88, 0x5CAB,
- 0x5CC0, 0x5E25, 0x6101, 0x620D, 0x624B, 0x6388, 0x641C, 0x6536,
- 0x6578, 0x6A39, 0x6B8A, 0x6C34, 0x6D19, 0x6F31, 0x71E7, 0x72E9,
- 0x7378, 0x7407, 0x74B2, 0x7626, 0x7761, 0x79C0, 0x7A57, 0x7AEA,
- 0x7CB9, 0x7D8F, 0x7DAC, 0x7E61, 0x7F9E, 0x8129, 0x8331, 0x8490,
- 0x84DA, 0x85EA, 0x8896, 0x8AB0, 0x8B90, 0x8F38, 0x9042, 0x9083,
- 0x916C, 0x9296, 0x92B9, 0x968B, 0x96A7, 0x96A8, 0x96D6, 0x9700,
- 0x9808, 0x9996, 0x9AD3, 0x9B1A, 0x53D4, 0x587E, 0x5919, 0x5B70,
- 0x5BBF, 0x6DD1, 0x6F5A, 0x719F, 0x7421, 0x74B9, 0x8085, 0x83FD,
- 0x5DE1, 0x5F87, 0x5FAA, 0x6042, 0x65EC, 0x6812, 0x696F, 0x6A53,
- 0x6B89, 0x6D35, 0x6DF3, 0x73E3, 0x76FE, 0x77AC, 0x7B4D, 0x7D14,
- 0x8123, 0x821C, 0x8340, 0x84F4, 0x8563, 0x8A62, 0x8AC4, 0x9187,
- 0x931E, 0x9806, 0x99B4, 0x620C, 0x8853, 0x8FF0, 0x9265, 0x5D07,
- 0x5D27, 0x5D69, 0x745F, 0x819D, 0x8768, 0x6FD5, 0x62FE, 0x7FD2,
- 0x8936, 0x8972, 0x4E1E, 0x4E58, 0x50E7, 0x52DD, 0x5347, 0x627F,
- 0x6607, 0x7E69, 0x8805, 0x965E, 0x4F8D, 0x5319, 0x5636, 0x59CB,
- 0x5AA4, 0x5C38, 0x5C4E, 0x5C4D, 0x5E02, 0x5F11, 0x6043, 0x65BD,
- 0x662F, 0x6642, 0x67BE, 0x67F4, 0x731C, 0x77E2, 0x793A, 0x7FC5,
- 0x8494, 0x84CD, 0x8996, 0x8A66, 0x8A69, 0x8AE1, 0x8C55, 0x8C7A,
- 0x57F4, 0x5BD4, 0x5F0F, 0x606F, 0x62ED, 0x690D, 0x6B96, 0x6E5C,
- 0x7184, 0x7BD2, 0x8755, 0x8B58, 0x8EFE, 0x98DF, 0x98FE, 0x4F38,
- 0x4F81, 0x4FE1, 0x547B, 0x5A20, 0x5BB8, 0x613C, 0x65B0, 0x6668,
- 0x71FC, 0x7533, 0x795E, 0x7D33, 0x814E, 0x81E3, 0x8398, 0x85AA,
- 0x85CE, 0x8703, 0x8A0A, 0x8EAB, 0x8F9B, 0x8FC5, 0x5931, 0x5BA4,
- 0x5BE6, 0x6089, 0x5BE9, 0x5C0B, 0x5FC3, 0x6C81, 0x6DF1, 0x700B,
- 0x751A, 0x82AF, 0x8AF6, 0x4EC0, 0x5341, 0x96D9, 0x6C0F, 0x4E9E,
- 0x4FC4, 0x5152, 0x555E, 0x5A25, 0x5CE8, 0x6211, 0x7259, 0x82BD,
- 0x83AA, 0x86FE, 0x8859, 0x8A1D, 0x963F, 0x96C5, 0x9913, 0x9D09,
- 0x9D5D, 0x580A, 0x5CB3, 0x5DBD, 0x5E44, 0x60E1, 0x6115, 0x63E1,
- 0x6A02, 0x6E25, 0x9102, 0x9354, 0x984E, 0x9C10, 0x9F77, 0x5B89,
- 0x5CB8, 0x6309, 0x664F, 0x6848, 0x773C, 0x96C1, 0x978D, 0x9854,
- 0x9B9F, 0x65A1, 0x8B01, 0x8ECB, 0x95BC, 0x5535, 0x5CA9, 0x5DD6,
- 0x5EB5, 0x6697, 0x764C, 0x83F4, 0x95C7, 0x58D3, 0x62BC, 0x72CE,
- 0x9D28, 0x4EF0, 0x592E, 0x600F, 0x663B, 0x6B83, 0x79E7, 0x9D26,
- 0x5393, 0x54C0, 0x57C3, 0x5D16, 0x611B, 0x66D6, 0x6DAF, 0x788D,
- 0x827E, 0x9698, 0x9744, 0x5384, 0x627C, 0x6396, 0x6DB2, 0x7E0A,
- 0x814B, 0x984D, 0x6AFB, 0x7F4C, 0x9DAF, 0x9E1A, 0x4E5F, 0x503B,
- 0x51B6, 0x591C, 0x60F9, 0x63F6, 0x6930, 0x723A, 0x8036, 0x91CE,
- 0x5F31, 0x7D04, 0x82E5, 0x846F, 0x84BB, 0x85E5, 0x8E8D, 0x4F6F,
- 0x58E4, 0x5B43, 0x6059, 0x63DA, 0x6518, 0x656D, 0x6698, 0x694A,
- 0x6A23, 0x6D0B, 0x7001, 0x716C, 0x75D2, 0x760D, 0x79B3, 0x7A70,
- 0x7F8A, 0x8944, 0x8B93, 0x91C0, 0x967D, 0x990A, 0x5704, 0x5FA1,
- 0x65BC, 0x6F01, 0x7600, 0x79A6, 0x8A9E, 0x99AD, 0x9B5A, 0x9F6C,
- 0x5104, 0x61B6, 0x6291, 0x6A8D, 0x81C6, 0x5043, 0x5830, 0x5F66,
- 0x7109, 0x8A00, 0x8AFA, 0x5B7C, 0x8616, 0x4FFA, 0x513C, 0x56B4,
- 0x5944, 0x63A9, 0x6DF9, 0x5DAA, 0x696D, 0x5186, 0x4E88, 0x4F59,
- 0x5982, 0x6B5F, 0x6C5D, 0x74B5, 0x7916, 0x8207, 0x8245, 0x8339,
- 0x8F3F, 0x8F5D, 0x9918, 0x4EA6, 0x57DF, 0x5F79, 0x6613, 0x75AB,
- 0x7E79, 0x8B6F, 0x9006, 0x9A5B, 0x56A5, 0x5827, 0x59F8, 0x5A1F,
- 0x5BB4, 0x5EF6, 0x6350, 0x633B, 0x693D, 0x6C87, 0x6CBF, 0x6D8E,
- 0x6D93, 0x6DF5, 0x6F14, 0x70DF, 0x7136, 0x7159, 0x71C3, 0x71D5,
- 0x784F, 0x786F, 0x7B75, 0x7DE3, 0x7E2F, 0x884D, 0x8EDF, 0x925B,
- 0x9CF6, 0x6085, 0x6D85, 0x71B1, 0x95B1, 0x53AD, 0x67D3, 0x708E,
- 0x7130, 0x7430, 0x8276, 0x82D2, 0x95BB, 0x9AE5, 0x9E7D, 0x66C4,
- 0x71C1, 0x8449, 0x584B, 0x5DB8, 0x5F71, 0x6620, 0x668E, 0x6979,
- 0x69AE, 0x6C38, 0x6CF3, 0x6E36, 0x6F41, 0x6FDA, 0x701B, 0x702F,
- 0x7150, 0x71DF, 0x7370, 0x745B, 0x74D4, 0x76C8, 0x7A4E, 0x7E93,
- 0x82F1, 0x8A60, 0x8FCE, 0x9348, 0x9719, 0x4E42, 0x502A, 0x5208,
- 0x53E1, 0x66F3, 0x6C6D, 0x6FCA, 0x730A, 0x777F, 0x7A62, 0x82AE,
- 0x85DD, 0x8602, 0x88D4, 0x8A63, 0x8B7D, 0x8C6B, 0x92B3, 0x9713,
- 0x9810, 0x4E94, 0x4F0D, 0x4FC9, 0x50B2, 0x5348, 0x543E, 0x5433,
- 0x55DA, 0x5862, 0x58BA, 0x5967, 0x5A1B, 0x5BE4, 0x609F, 0x61CA,
- 0x6556, 0x65FF, 0x6664, 0x68A7, 0x6C5A, 0x6FB3, 0x70CF, 0x71AC,
- 0x7352, 0x7B7D, 0x8708, 0x8AA4, 0x9C32, 0x9F07, 0x5C4B, 0x6C83,
- 0x7344, 0x7389, 0x923A, 0x6EAB, 0x7465, 0x761F, 0x7A69, 0x7E15,
- 0x860A, 0x5140, 0x58C5, 0x64C1, 0x74EE, 0x7515, 0x7670, 0x7FC1,
- 0x9095, 0x96CD, 0x9954, 0x6E26, 0x74E6, 0x7AA9, 0x7AAA, 0x81E5,
- 0x86D9, 0x8778, 0x8A1B, 0x5A49, 0x5B8C, 0x5B9B, 0x68A1, 0x6900,
- 0x6D63, 0x73A9, 0x7413, 0x742C, 0x7897, 0x7DE9, 0x7FEB, 0x8118,
- 0x8155, 0x839E, 0x8C4C, 0x962E, 0x9811, 0x66F0, 0x5F80, 0x65FA,
- 0x6789, 0x6C6A, 0x738B, 0x502D, 0x5A03, 0x6B6A, 0x77EE, 0x5916,
- 0x5D6C, 0x5DCD, 0x7325, 0x754F, 0x50E5, 0x51F9, 0x582F, 0x592D,
- 0x5996, 0x59DA, 0x5BE5, 0x5DA2, 0x62D7, 0x6416, 0x6493, 0x64FE,
- 0x66DC, 0x6A48, 0x71FF, 0x7464, 0x7A88, 0x7AAF, 0x7E47, 0x7E5E,
- 0x8000, 0x8170, 0x87EF, 0x8981, 0x8B20, 0x9059, 0x9080, 0x9952,
- 0x617E, 0x6B32, 0x6D74, 0x7E1F, 0x8925, 0x8FB1, 0x4FD1, 0x50AD,
- 0x5197, 0x52C7, 0x57C7, 0x5889, 0x5BB9, 0x5EB8, 0x6142, 0x6995,
- 0x6D8C, 0x6E67, 0x6EB6, 0x7194, 0x7462, 0x7528, 0x752C, 0x8073,
- 0x8338, 0x84C9, 0x8E0A, 0x9394, 0x93DE, 0x4E8E, 0x4F51, 0x5076,
- 0x512A, 0x53C8, 0x53CB, 0x53F3, 0x5B87, 0x5BD3, 0x5C24, 0x611A,
- 0x6182, 0x65F4, 0x725B, 0x7397, 0x7440, 0x76C2, 0x7950, 0x7991,
- 0x79B9, 0x7D06, 0x7FBD, 0x828B, 0x85D5, 0x865E, 0x8FC2, 0x9047,
- 0x90F5, 0x91EA, 0x9685, 0x96E8, 0x96E9, 0x52D6, 0x5F67, 0x65ED,
- 0x6631, 0x682F, 0x715C, 0x7A36, 0x90C1, 0x980A, 0x4E91, 0x6A52,
- 0x6B9E, 0x6F90, 0x7189, 0x8018, 0x82B8, 0x8553, 0x904B, 0x9695,
- 0x96F2, 0x97FB, 0x851A, 0x9B31, 0x4E90, 0x718A, 0x96C4, 0x5143,
- 0x539F, 0x54E1, 0x5713, 0x5712, 0x57A3, 0x5A9B, 0x5AC4, 0x5BC3,
- 0x6028, 0x613F, 0x63F4, 0x6C85, 0x6D39, 0x6E72, 0x6E90, 0x7230,
- 0x733F, 0x7457, 0x82D1, 0x8881, 0x8F45, 0x9060, 0x9662, 0x9858,
- 0x9D1B, 0x6708, 0x8D8A, 0x925E, 0x4F4D, 0x5049, 0x50DE, 0x5371,
- 0x570D, 0x59D4, 0x5A01, 0x5C09, 0x6170, 0x6690, 0x6E2D, 0x7232,
- 0x744B, 0x7DEF, 0x80C3, 0x840E, 0x8466, 0x853F, 0x875F, 0x885B,
- 0x8918, 0x8B02, 0x9055, 0x97CB, 0x9B4F, 0x4E73, 0x4F91, 0x5112,
- 0x516A, 0x552F, 0x55A9, 0x5B7A, 0x5BA5, 0x5E7C, 0x5E7D, 0x5EBE,
- 0x60A0, 0x60DF, 0x6108, 0x6109, 0x63C4, 0x6538, 0x6709, 0x67D4,
- 0x67DA, 0x6961, 0x6962, 0x6CB9, 0x6D27, 0x6E38, 0x6FE1, 0x7336,
- 0x7337, 0x745C, 0x7531, 0x7652, 0x7DAD, 0x81FE, 0x8438, 0x88D5,
- 0x8A98, 0x8ADB, 0x8AED, 0x8E30, 0x8E42, 0x904A, 0x903E, 0x907A,
- 0x9149, 0x91C9, 0x936E, 0x5809, 0x6BD3, 0x8089, 0x80B2, 0x5141,
- 0x596B, 0x5C39, 0x6F64, 0x73A7, 0x80E4, 0x8D07, 0x9217, 0x958F,
- 0x807F, 0x620E, 0x701C, 0x7D68, 0x878D, 0x57A0, 0x6069, 0x6147,
- 0x6BB7, 0x8ABE, 0x9280, 0x96B1, 0x4E59, 0x541F, 0x6DEB, 0x852D,
- 0x9670, 0x97F3, 0x98EE, 0x63D6, 0x6CE3, 0x9091, 0x51DD, 0x61C9,
- 0x81BA, 0x9DF9, 0x4F9D, 0x501A, 0x5100, 0x5B9C, 0x610F, 0x61FF,
- 0x64EC, 0x6905, 0x6BC5, 0x7591, 0x77E3, 0x7FA9, 0x8264, 0x858F,
- 0x87FB, 0x8863, 0x8ABC, 0x8B70, 0x91AB, 0x4E8C, 0x4EE5, 0x4F0A,
- 0x5937, 0x59E8, 0x5DF2, 0x5F1B, 0x5F5B, 0x6021, 0x723E, 0x73E5,
- 0x7570, 0x75CD, 0x79FB, 0x800C, 0x8033, 0x8084, 0x82E1, 0x8351,
- 0x8CBD, 0x8CB3, 0x9087, 0x98F4, 0x990C, 0x7037, 0x76CA, 0x7FCA,
- 0x7FCC, 0x7FFC, 0x8B1A, 0x4EBA, 0x4EC1, 0x5203, 0x5370, 0x54BD,
- 0x56E0, 0x59FB, 0x5BC5, 0x5F15, 0x5FCD, 0x6E6E, 0x7D6A, 0x8335,
- 0x8693, 0x8A8D, 0x976D, 0x9777, 0x4E00, 0x4F5A, 0x4F7E, 0x58F9,
- 0x65E5, 0x6EA2, 0x9038, 0x93B0, 0x99B9, 0x4EFB, 0x58EC, 0x598A,
- 0x59D9, 0x6041, 0x7A14, 0x834F, 0x8CC3, 0x5165, 0x5344, 0x4ECD,
- 0x5269, 0x5B55, 0x82BF, 0x4ED4, 0x523A, 0x54A8, 0x59C9, 0x59FF,
- 0x5B50, 0x5B57, 0x5B5C, 0x6063, 0x6148, 0x6ECB, 0x7099, 0x716E,
- 0x7386, 0x74F7, 0x75B5, 0x78C1, 0x7D2B, 0x8005, 0x81EA, 0x8328,
- 0x8517, 0x85C9, 0x8AEE, 0x8CC7, 0x96CC, 0x4F5C, 0x52FA, 0x56BC,
- 0x65AB, 0x6628, 0x707C, 0x70B8, 0x7235, 0x7DBD, 0x828D, 0x914C,
- 0x96C0, 0x9D72, 0x5B71, 0x68E7, 0x6B98, 0x6F7A, 0x76DE, 0x5C91,
- 0x66AB, 0x6F5B, 0x7BB4, 0x7C2A, 0x8836, 0x96DC, 0x4E08, 0x4ED7,
- 0x5320, 0x5834, 0x58BB, 0x58EF, 0x596C, 0x5C07, 0x5E33, 0x5E84,
- 0x5F35, 0x638C, 0x66B2, 0x6756, 0x6A1F, 0x6AA3, 0x6B0C, 0x6F3F,
- 0x7246, 0x7350, 0x748B, 0x7AE0, 0x7CA7, 0x8178, 0x81DF, 0x81E7,
- 0x838A, 0x846C, 0x8523, 0x8594, 0x85CF, 0x88DD, 0x8D13, 0x91AC,
- 0x9577, 0x969C, 0x518D, 0x54C9, 0x5728, 0x5BB0, 0x624D, 0x6750,
- 0x683D, 0x6893, 0x6E3D, 0x6ED3, 0x707D, 0x7E21, 0x88C1, 0x8CA1,
- 0x8F09, 0x9F4B, 0x9F4E, 0x722D, 0x7B8F, 0x8ACD, 0x931A, 0x4F47,
- 0x4F4E, 0x5132, 0x5480, 0x59D0, 0x5E95, 0x62B5, 0x6775, 0x696E,
- 0x6A17, 0x6CAE, 0x6E1A, 0x72D9, 0x732A, 0x75BD, 0x7BB8, 0x7D35,
- 0x82E7, 0x83F9, 0x8457, 0x85F7, 0x8A5B, 0x8CAF, 0x8E87, 0x9019,
- 0x90B8, 0x96CE, 0x9F5F, 0x52E3, 0x540A, 0x5AE1, 0x5BC2, 0x6458,
- 0x6575, 0x6EF4, 0x72C4, 0x7684, 0x7A4D, 0x7B1B, 0x7C4D, 0x7E3E,
- 0x7FDF, 0x837B, 0x8B2B, 0x8CCA, 0x8D64, 0x8DE1, 0x8E5F, 0x8FEA,
- 0x8FF9, 0x9069, 0x93D1, 0x4F43, 0x4F7A, 0x50B3, 0x5168, 0x5178,
- 0x524D, 0x526A, 0x5861, 0x587C, 0x5960, 0x5C08, 0x5C55, 0x5EDB,
- 0x609B, 0x6230, 0x6813, 0x6BBF, 0x6C08, 0x6FB1, 0x714E, 0x7420,
- 0x7530, 0x7538, 0x7551, 0x7672, 0x7B4C, 0x7B8B, 0x7BAD, 0x7BC6,
- 0x7E8F, 0x8A6E, 0x8F3E, 0x8F49, 0x923F, 0x9293, 0x9322, 0x942B,
- 0x96FB, 0x985A, 0x986B, 0x991E, 0x5207, 0x622A, 0x6298, 0x6D59,
- 0x7664, 0x7ACA, 0x7BC0, 0x7D76, 0x5360, 0x5CBE, 0x5E97, 0x6F38,
- 0x70B9, 0x7C98, 0x9711, 0x9B8E, 0x9EDE, 0x63A5, 0x647A, 0x8776,
- 0x4E01, 0x4E95, 0x4EAD, 0x505C, 0x5075, 0x5448, 0x59C3, 0x5B9A,
- 0x5E40, 0x5EAD, 0x5EF7, 0x5F81, 0x60C5, 0x633A, 0x653F, 0x6574,
- 0x65CC, 0x6676, 0x6678, 0x67FE, 0x6968, 0x6A89, 0x6B63, 0x6C40,
- 0x6DC0, 0x6DE8, 0x6E1F, 0x6E5E, 0x701E, 0x70A1, 0x738E, 0x73FD,
- 0x753A, 0x775B, 0x7887, 0x798E, 0x7A0B, 0x7A7D, 0x7CBE, 0x7D8E,
- 0x8247, 0x8A02, 0x8AEA, 0x8C9E, 0x912D, 0x914A, 0x91D8, 0x9266,
- 0x92CC, 0x9320, 0x9706, 0x9756, 0x975C, 0x9802, 0x9F0E, 0x5236,
- 0x5291, 0x557C, 0x5824, 0x5E1D, 0x5F1F, 0x608C, 0x63D0, 0x68AF,
- 0x6FDF, 0x796D, 0x7B2C, 0x81CD, 0x85BA, 0x88FD, 0x8AF8, 0x8E44,
- 0x918D, 0x9664, 0x969B, 0x973D, 0x984C, 0x9F4A, 0x4FCE, 0x5146,
- 0x51CB, 0x52A9, 0x5632, 0x5F14, 0x5F6B, 0x63AA, 0x64CD, 0x65E9,
- 0x6641, 0x66FA, 0x66F9, 0x671D, 0x689D, 0x68D7, 0x69FD, 0x6F15,
- 0x6F6E, 0x7167, 0x71E5, 0x722A, 0x74AA, 0x773A, 0x7956, 0x795A,
- 0x79DF, 0x7A20, 0x7A95, 0x7C97, 0x7CDF, 0x7D44, 0x7E70, 0x8087,
- 0x85FB, 0x86A4, 0x8A54, 0x8ABF, 0x8D99, 0x8E81, 0x9020, 0x906D,
- 0x91E3, 0x963B, 0x96D5, 0x9CE5, 0x65CF, 0x7C07, 0x8DB3, 0x93C3,
- 0x5B58, 0x5C0A, 0x5352, 0x62D9, 0x731D, 0x5027, 0x5B97, 0x5F9E,
- 0x60B0, 0x616B, 0x68D5, 0x6DD9, 0x742E, 0x7A2E, 0x7D42, 0x7D9C,
- 0x7E31, 0x816B, 0x8E2A, 0x8E35, 0x937E, 0x9418, 0x4F50, 0x5750,
- 0x5DE6, 0x5EA7, 0x632B, 0x7F6A, 0x4E3B, 0x4F4F, 0x4F8F, 0x505A,
- 0x59DD, 0x80C4, 0x546A, 0x5468, 0x55FE, 0x594F, 0x5B99, 0x5DDE,
- 0x5EDA, 0x665D, 0x6731, 0x67F1, 0x682A, 0x6CE8, 0x6D32, 0x6E4A,
- 0x6F8D, 0x70B7, 0x73E0, 0x7587, 0x7C4C, 0x7D02, 0x7D2C, 0x7DA2,
- 0x821F, 0x86DB, 0x8A3B, 0x8A85, 0x8D70, 0x8E8A, 0x8F33, 0x9031,
- 0x914E, 0x9152, 0x9444, 0x99D0, 0x7AF9, 0x7CA5, 0x4FCA, 0x5101,
- 0x51C6, 0x57C8, 0x5BEF, 0x5CFB, 0x6659, 0x6A3D, 0x6D5A, 0x6E96,
- 0x6FEC, 0x710C, 0x756F, 0x7AE3, 0x8822, 0x9021, 0x9075, 0x96CB,
- 0x99FF, 0x8301, 0x4E2D, 0x4EF2, 0x8846, 0x91CD, 0x537D, 0x6ADB,
- 0x696B, 0x6C41, 0x847A, 0x589E, 0x618E, 0x66FE, 0x62EF, 0x70DD,
- 0x7511, 0x75C7, 0x7E52, 0x84B8, 0x8B49, 0x8D08, 0x4E4B, 0x53EA,
- 0x54AB, 0x5730, 0x5740, 0x5FD7, 0x6301, 0x6307, 0x646F, 0x652F,
- 0x65E8, 0x667A, 0x679D, 0x67B3, 0x6B62, 0x6C60, 0x6C9A, 0x6F2C,
- 0x77E5, 0x7825, 0x7949, 0x7957, 0x7D19, 0x80A2, 0x8102, 0x81F3,
- 0x829D, 0x82B7, 0x8718, 0x8A8C, 0x8D04, 0x8DBE, 0x9072, 0x76F4,
- 0x7A19, 0x7A37, 0x7E54, 0x8077, 0x5507, 0x55D4, 0x5875, 0x632F,
- 0x6422, 0x6649, 0x664B, 0x686D, 0x699B, 0x6B84, 0x6D25, 0x6EB1,
- 0x73CD, 0x7468, 0x74A1, 0x755B, 0x75B9, 0x76E1, 0x771E, 0x778B,
- 0x79E6, 0x7E09, 0x7E1D, 0x81FB, 0x852F, 0x8897, 0x8A3A, 0x8CD1,
- 0x8EEB, 0x8FB0, 0x9032, 0x93AD, 0x9663, 0x9673, 0x9707, 0x4F84,
- 0x53F1, 0x59EA, 0x5AC9, 0x5E19, 0x684E, 0x74C6, 0x75BE, 0x79E9,
- 0x7A92, 0x81A3, 0x86ED, 0x8CEA, 0x8DCC, 0x8FED, 0x659F, 0x6715,
- 0x57F7, 0x6F57, 0x7DDD, 0x8F2F, 0x93F6, 0x96C6, 0x5FB5, 0x61F2,
- 0x6F84, 0x4E14, 0x4F98, 0x501F, 0x53C9, 0x55DF, 0x5D6F, 0x5DEE,
- 0x6B21, 0x6B64, 0x78CB, 0x7B9A, 0x8E49, 0x8ECA, 0x906E, 0x6349,
- 0x643E, 0x7740, 0x7A84, 0x932F, 0x947F, 0x9F6A, 0x64B0, 0x6FAF,
- 0x71E6, 0x74A8, 0x74DA, 0x7AC4, 0x7C12, 0x7E82, 0x7CB2, 0x7E98,
- 0x8B9A, 0x8D0A, 0x947D, 0x9910, 0x994C, 0x5239, 0x5BDF, 0x64E6,
- 0x672D, 0x7D2E, 0x50ED, 0x53C3, 0x5879, 0x6158, 0x6159, 0x61FA,
- 0x65AC, 0x7AD9, 0x8B92, 0x8B96, 0x5009, 0x5021, 0x5275, 0x5531,
- 0x5A3C, 0x5EE0, 0x5F70, 0x6134, 0x655E, 0x660C, 0x6636, 0x66A2,
- 0x69CD, 0x6EC4, 0x6F32, 0x7316, 0x7621, 0x7A93, 0x8139, 0x8259,
- 0x83D6, 0x84BC, 0x50B5, 0x57F0, 0x5BC0, 0x5BE8, 0x5F69, 0x63A1,
- 0x7826, 0x7DB5, 0x83DC, 0x8521, 0x91C7, 0x91F5, 0x518A, 0x67F5,
- 0x7B56, 0x8CAC, 0x51C4, 0x59BB, 0x60BD, 0x8655, 0x501C, 0x5254,
- 0x5C3A, 0x617D, 0x621A, 0x62D3, 0x64F2, 0x65A5, 0x6ECC, 0x7620,
- 0x810A, 0x8E60, 0x965F, 0x96BB, 0x4EDF, 0x5343, 0x5598, 0x5929,
- 0x5DDD, 0x64C5, 0x6CC9, 0x6DFA, 0x7394, 0x7A7F, 0x821B, 0x85A6,
- 0x8CE4, 0x8E10, 0x9077, 0x91E7, 0x95E1, 0x9621, 0x97C6, 0x51F8,
- 0x54F2, 0x5586, 0x5FB9, 0x64A4, 0x6F88, 0x7DB4, 0x8F1F, 0x8F4D,
- 0x9435, 0x50C9, 0x5C16, 0x6CBE, 0x6DFB, 0x751B, 0x77BB, 0x7C3D,
- 0x7C64, 0x8A79, 0x8AC2, 0x581E, 0x59BE, 0x5E16, 0x6377, 0x7252,
- 0x758A, 0x776B, 0x8ADC, 0x8CBC, 0x8F12, 0x5EF3, 0x6674, 0x6DF8,
- 0x807D, 0x83C1, 0x8ACB, 0x9751, 0x9BD6, 0x5243, 0x66FF, 0x6D95,
- 0x6EEF, 0x7DE0, 0x8AE6, 0x902E, 0x905E, 0x9AD4, 0x521D, 0x527F,
- 0x54E8, 0x6194, 0x6284, 0x62DB, 0x68A2, 0x6912, 0x695A, 0x6A35,
- 0x7092, 0x7126, 0x785D, 0x7901, 0x790E, 0x79D2, 0x7A0D, 0x8096,
- 0x8278, 0x82D5, 0x8349, 0x8549, 0x8C82, 0x8D85, 0x9162, 0x918B,
- 0x91AE, 0x4FC3, 0x56D1, 0x71ED, 0x77D7, 0x8700, 0x89F8, 0x5BF8,
- 0x5FD6, 0x6751, 0x90A8, 0x53E2, 0x585A, 0x5BF5, 0x60A4, 0x6181,
- 0x6460, 0x7E3D, 0x8070, 0x8525, 0x9283, 0x64AE, 0x50AC, 0x5D14,
- 0x6700, 0x589C, 0x62BD, 0x63A8, 0x690E, 0x6978, 0x6A1E, 0x6E6B,
- 0x76BA, 0x79CB, 0x82BB, 0x8429, 0x8ACF, 0x8DA8, 0x8FFD, 0x9112,
- 0x914B, 0x919C, 0x9310, 0x9318, 0x939A, 0x96DB, 0x9A36, 0x9C0D,
- 0x4E11, 0x755C, 0x795D, 0x7AFA, 0x7B51, 0x7BC9, 0x7E2E, 0x84C4,
- 0x8E59, 0x8E74, 0x8EF8, 0x9010, 0x6625, 0x693F, 0x7443, 0x51FA,
- 0x672E, 0x9EDC, 0x5145, 0x5FE0, 0x6C96, 0x87F2, 0x885D, 0x8877,
- 0x60B4, 0x81B5, 0x8403, 0x8D05, 0x53D6, 0x5439, 0x5634, 0x5A36,
- 0x5C31, 0x708A, 0x7FE0, 0x805A, 0x8106, 0x81ED, 0x8DA3, 0x9189,
- 0x9A5F, 0x9DF2, 0x5074, 0x4EC4, 0x53A0, 0x60FB, 0x6E2C, 0x5C64,
- 0x4F88, 0x5024, 0x55E4, 0x5CD9, 0x5E5F, 0x6065, 0x6894, 0x6CBB,
- 0x6DC4, 0x71BE, 0x75D4, 0x75F4, 0x7661, 0x7A1A, 0x7A49, 0x7DC7,
- 0x7DFB, 0x7F6E, 0x81F4, 0x86A9, 0x8F1C, 0x96C9, 0x99B3, 0x9F52,
- 0x5247, 0x52C5, 0x98ED, 0x89AA, 0x4E03, 0x67D2, 0x6F06, 0x4FB5,
- 0x5BE2, 0x6795, 0x6C88, 0x6D78, 0x741B, 0x7827, 0x91DD, 0x937C,
- 0x87C4, 0x79E4, 0x7A31, 0x5FEB, 0x4ED6, 0x54A4, 0x553E, 0x58AE,
- 0x59A5, 0x60F0, 0x6253, 0x62D6, 0x6736, 0x6955, 0x8235, 0x9640,
- 0x99B1, 0x99DD, 0x502C, 0x5353, 0x5544, 0x577C, 0x6258, 0x64E2,
- 0x666B, 0x67DD, 0x6FC1, 0x6FEF, 0x7422, 0x7438, 0x8A17, 0x9438,
- 0x5451, 0x5606, 0x5766, 0x5F48, 0x619A, 0x6B4E, 0x7058, 0x70AD,
- 0x7DBB, 0x8A95, 0x596A, 0x812B, 0x63A2, 0x7708, 0x803D, 0x8CAA,
- 0x5854, 0x642D, 0x69BB, 0x5B95, 0x5E11, 0x6E6F, 0x8569, 0x514C,
- 0x53F0, 0x592A, 0x6020, 0x614B, 0x6B86, 0x6C70, 0x6CF0, 0x7B1E,
- 0x80CE, 0x82D4, 0x8DC6, 0x90B0, 0x98B1, 0x64C7, 0x6FA4, 0x6491,
- 0x6504, 0x514E, 0x5410, 0x571F, 0x8A0E, 0x615F, 0x6876, 0x75DB,
- 0x7B52, 0x7D71, 0x901A, 0x5806, 0x69CC, 0x817F, 0x892A, 0x9000,
- 0x9839, 0x5078, 0x5957, 0x59AC, 0x6295, 0x900F, 0x9B2A, 0x615D,
- 0x7279, 0x95D6, 0x5761, 0x5A46, 0x5DF4, 0x628A, 0x64AD, 0x64FA,
- 0x6777, 0x6CE2, 0x6D3E, 0x722C, 0x7436, 0x7834, 0x7F77, 0x82AD,
- 0x8DDB, 0x9817, 0x5224, 0x5742, 0x677F, 0x7248, 0x74E3, 0x8CA9,
- 0x8FA6, 0x9211, 0x962A, 0x516B, 0x53ED, 0x634C, 0x4F69, 0x5504,
- 0x6096, 0x6557, 0x6C9B, 0x6D7F, 0x724C, 0x72FD, 0x7A17, 0x8987,
- 0x8C9D, 0x5F6D, 0x6F8E, 0x70F9, 0x81A8, 0x610E, 0x4FBF, 0x504F,
- 0x6241, 0x7247, 0x7BC7, 0x7DE8, 0x7FE9, 0x904D, 0x97AD, 0x9A19,
- 0x8CB6, 0x576A, 0x5E73, 0x67B0, 0x840D, 0x8A55, 0x5420, 0x5B16,
- 0x5E63, 0x5EE2, 0x5F0A, 0x6583, 0x80BA, 0x853D, 0x9589, 0x965B,
- 0x4F48, 0x5305, 0x530D, 0x530F, 0x5486, 0x54FA, 0x5703, 0x5E03,
- 0x6016, 0x629B, 0x62B1, 0x6355, 0x6CE1, 0x6D66, 0x75B1, 0x7832,
- 0x80DE, 0x812F, 0x82DE, 0x8461, 0x84B2, 0x888D, 0x8912, 0x900B,
- 0x92EA, 0x98FD, 0x9B91, 0x5E45, 0x66B4, 0x66DD, 0x7011, 0x7206,
- 0x4FF5, 0x527D, 0x5F6A, 0x6153, 0x6753, 0x6A19, 0x6F02, 0x74E2,
- 0x7968, 0x8868, 0x8C79, 0x98C7, 0x98C4, 0x9A43, 0x54C1, 0x7A1F,
- 0x6953, 0x8AF7, 0x8C4A, 0x98A8, 0x99AE, 0x5F7C, 0x62AB, 0x75B2,
- 0x76AE, 0x88AB, 0x907F, 0x9642, 0x5339, 0x5F3C, 0x5FC5, 0x6CCC,
- 0x73CC, 0x7562, 0x758B, 0x7B46, 0x82FE, 0x999D, 0x4E4F, 0x903C,
- 0x4E0B, 0x4F55, 0x53A6, 0x590F, 0x5EC8, 0x6630, 0x6CB3, 0x7455,
- 0x8377, 0x8766, 0x8CC0, 0x9050, 0x971E, 0x9C15, 0x58D1, 0x5B78,
- 0x8650, 0x8B14, 0x9DB4, 0x5BD2, 0x6068, 0x608D, 0x65F1, 0x6C57,
- 0x6F22, 0x6FA3, 0x701A, 0x7F55, 0x7FF0, 0x9591, 0x9592, 0x9650,
- 0x97D3, 0x5272, 0x8F44, 0x51FD, 0x542B, 0x54B8, 0x5563, 0x558A,
- 0x6ABB, 0x6DB5, 0x7DD8, 0x8266, 0x929C, 0x9677, 0x9E79, 0x5408,
- 0x54C8, 0x76D2, 0x86E4, 0x95A4, 0x95D4, 0x965C, 0x4EA2, 0x4F09,
- 0x59EE, 0x5AE6, 0x5DF7, 0x6052, 0x6297, 0x676D, 0x6841, 0x6C86,
- 0x6E2F, 0x7F38, 0x809B, 0x822A, 0x9805, 0x4EA5, 0x5055, 0x54B3,
- 0x5793, 0x595A, 0x5B69, 0x5BB3, 0x61C8, 0x6977, 0x6D77, 0x7023,
- 0x87F9, 0x89E3, 0x8A72, 0x8AE7, 0x9082, 0x99ED, 0x9AB8, 0x52BE,
- 0x6838, 0x5016, 0x5E78, 0x674F, 0x8347, 0x884C, 0x4EAB, 0x5411,
- 0x56AE, 0x73E6, 0x9115, 0x97FF, 0x9909, 0x9957, 0x9999, 0x5653,
- 0x589F, 0x865B, 0x8A31, 0x61B2, 0x6AF6, 0x737B, 0x8ED2, 0x6B47,
- 0x96AA, 0x9A57, 0x5955, 0x7200, 0x8D6B, 0x9769, 0x4FD4, 0x5CF4,
- 0x5F26, 0x61F8, 0x665B, 0x6CEB, 0x70AB, 0x7384, 0x73B9, 0x73FE,
- 0x7729, 0x774D, 0x7D43, 0x7D62, 0x7E23, 0x8237, 0x8852, 0x8CE2,
- 0x9249, 0x986F, 0x5B51, 0x7A74, 0x8840, 0x9801, 0x5ACC, 0x4FE0,
- 0x5354, 0x593E, 0x5CFD, 0x633E, 0x6D79, 0x72F9, 0x8105, 0x8107,
- 0x83A2, 0x92CF, 0x9830, 0x4EA8, 0x5144, 0x5211, 0x578B, 0x5F62,
- 0x6CC2, 0x6ECE, 0x7005, 0x7050, 0x70AF, 0x7192, 0x73E9, 0x7469,
- 0x834A, 0x87A2, 0x8861, 0x9008, 0x90A2, 0x93A3, 0x99A8, 0x516E,
- 0x5F57, 0x60E0, 0x6167, 0x66B3, 0x8559, 0x8E4A, 0x91AF, 0x978B,
- 0x4E4E, 0x4E92, 0x547C, 0x58D5, 0x58FA, 0x597D, 0x5CB5, 0x5F27,
- 0x6236, 0x6248, 0x660A, 0x6667, 0x6BEB, 0x6D69, 0x6DCF, 0x6E56,
- 0x6EF8, 0x6F94, 0x6FE0, 0x6FE9, 0x705D, 0x72D0, 0x7425, 0x745A,
- 0x74E0, 0x7693, 0x795C, 0x7CCA, 0x7E1E, 0x80E1, 0x82A6, 0x846B,
- 0x84BF, 0x864E, 0x865F, 0x8774, 0x8B77, 0x8C6A, 0x93AC, 0x9800,
- 0x9865, 0x60D1, 0x6216, 0x9177, 0x5A5A, 0x660F, 0x6DF7, 0x6E3E,
- 0x743F, 0x9B42, 0x5FFD, 0x60DA, 0x7B0F, 0x54C4, 0x5F18, 0x6C5E,
- 0x6CD3, 0x6D2A, 0x70D8, 0x7D05, 0x8679, 0x8A0C, 0x9D3B, 0x5316,
- 0x548C, 0x5B05, 0x6A3A, 0x706B, 0x7575, 0x798D, 0x79BE, 0x82B1,
- 0x83EF, 0x8A71, 0x8B41, 0x8CA8, 0x9774, 0x64F4, 0x652B, 0x78BA,
- 0x78BB, 0x7A6B, 0x4E38, 0x559A, 0x5950, 0x5BA6, 0x5E7B, 0x60A3,
- 0x63DB, 0x6B61, 0x6665, 0x6853, 0x6E19, 0x7165, 0x74B0, 0x7D08,
- 0x9084, 0x9A69, 0x9C25, 0x6D3B, 0x6ED1, 0x733E, 0x8C41, 0x95CA,
- 0x51F0, 0x5E4C, 0x5FA8, 0x604D, 0x60F6, 0x6130, 0x614C, 0x6643,
- 0x6644, 0x69A5, 0x6CC1, 0x6E5F, 0x6EC9, 0x6F62, 0x714C, 0x749C,
- 0x7687, 0x7BC1, 0x7C27, 0x8352, 0x8757, 0x9051, 0x968D, 0x9EC3,
- 0x532F, 0x56DE, 0x5EFB, 0x5F8A, 0x6062, 0x6094, 0x61F7, 0x6666,
- 0x6703, 0x6A9C, 0x6DEE, 0x6FAE, 0x7070, 0x736A, 0x7E6A, 0x81BE,
- 0x8334, 0x86D4, 0x8AA8, 0x8CC4, 0x5283, 0x7372, 0x5B96, 0x6A6B,
- 0x9404, 0x54EE, 0x5686, 0x5B5D, 0x6548, 0x6585, 0x66C9, 0x689F,
- 0x6D8D, 0x6DC6, 0x723B, 0x80B4, 0x9175, 0x9A4D, 0x4FAF, 0x5019,
- 0x539A, 0x540E, 0x543C, 0x5589, 0x55C5, 0x5E3F, 0x5F8C, 0x673D,
- 0x7166, 0x73DD, 0x9005, 0x52DB, 0x52F3, 0x5864, 0x58CE, 0x7104,
- 0x718F, 0x71FB, 0x85B0, 0x8A13, 0x6688, 0x85A8, 0x55A7, 0x6684,
- 0x714A, 0x8431, 0x5349, 0x5599, 0x6BC1, 0x5F59, 0x5FBD, 0x63EE,
- 0x6689, 0x7147, 0x8AF1, 0x8F1D, 0x9EBE, 0x4F11, 0x643A, 0x70CB,
- 0x7566, 0x8667, 0x6064, 0x8B4E, 0x9DF8, 0x5147, 0x51F6, 0x5308,
- 0x6D36, 0x80F8, 0x9ED1, 0x6615, 0x6B23, 0x7098, 0x75D5, 0x5403,
- 0x5C79, 0x7D07, 0x8A16, 0x6B20, 0x6B3D, 0x6B46, 0x5438, 0x6070,
- 0x6D3D, 0x7FD5, 0x8208, 0x50D6, 0x51DE, 0x559C, 0x566B, 0x56CD,
- 0x59EC, 0x5B09, 0x5E0C, 0x6199, 0x6198, 0x6231, 0x665E, 0x66E6,
- 0x7199, 0x71B9, 0x71BA, 0x72A7, 0x79A7, 0x7A00, 0x7FB2, 0x8A70,
- 0x3001, 0x3002, 0x2025, 0x00AD, 0x2015, 0x2225, 0xFF5E, 0x3014,
- 0x3015, 0x3008, 0x3009, 0x300A, 0x300B, 0x300C, 0x300D, 0x300E,
- 0x300F, 0x3010, 0x3011, 0x3013, 0xFF01, 0xFF08, 0xFF09, 0xFF0C,
- 0xFF0E, 0xFF1A, 0xFF1B, 0xFF1C, 0xFF1D, 0xFF1E, 0xFF1F, 0xFF3B,
- 0xFF3D, 0xFF3F, 0xFF5B, 0xFF5C, 0xFF5D, 0xFF5E, 0x0020, 0x0021,
- 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029,
- 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, 0x0030, 0x0031,
- 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039,
- 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, 0x0040, 0x0041,
- 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049,
- 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051,
- 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059,
- 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, 0x0060, 0x0061,
- 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069,
- 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, 0x0070, 0x0071,
- 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079,
- 0x007A, 0x007B, 0x007C, 0x007D, 0x203E, 0x007E, 0x005C, 0x231C,
- 0x231F, 0x0000, 0x0000, 0x0000, 0x0000, 0x300E, 0x300F, 0x300A,
- 0x300B, 0x3008, 0x3009, 0x0028, 0x0029, 0x0000, 0x0000, 0x0028,
- 0x0029, 0x0028, 0x0029, 0x0000, 0x0000, 0x0028, 0x0029, 0x0000,
- 0x0000, 0x3016, 0x3017, 0x3016, 0x3017, 0x3018, 0x3019, 0x005B,
- 0x005D, 0x0000, 0x0000, 0x263E, 0x263D, 0x2021, 0x2021, 0x2020,
- 0x2021, 0x0000, 0x2217, 0x0000, 0x0000, 0x201F, 0x201B, 0x02D6,
- 0x02D7, 0x00D7, 0x221E, 0x0000, 0x00B1, 0x2213, 0x003E, 0x003C,
- 0x003D, 0x2260, 0x207D, 0x207E, 0x007B, 0x007D, 0x0000, 0x0000,
- 0x2229, 0x222A, 0x2282, 0x2208, 0x03A3, 0x0021, 0x0000, 0x3021,
- 0x3022, 0x3023, 0x0000, 0x0000, 0x0000, 0x4E03, 0x0000, 0x0000,
- 0x5341, 0x0000, 0x0000, 0x0027, 0x3014, 0x3015, 0x002A, 0x0000,
- 0x2217, 0x002A, 0xCDCD, 0x3001, 0x3002, 0x0028, 0x0029, 0x0028,
- 0x0029, 0x0028, 0x0029, 0x3016, 0x3017, 0x3010, 0x3011, 0x0000,
- 0x0000, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE,
- 0x20DE, 0x20DE, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D,
- 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x00B6, 0x0000, 0x0000,
- 0x22EF, 0x2237, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE,
- 0x20DE, 0x20DE, 0x20DE, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D,
- 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x278A, 0x278B,
- 0x278C, 0x278D, 0x278E, 0x278F, 0x2790, 0x2791, 0x2792, 0x2793,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029,
- 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029,
- 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029,
- 0x0029, 0x0029, 0x0029, 0x0029, 0x24B6, 0x24B7, 0x24B8, 0x24B9,
- 0x24BA, 0x24BB, 0x24BC, 0x24BD, 0x24BE, 0x24BF, 0x24C0, 0x24C1,
- 0x24C2, 0x24C3, 0x24C4, 0x24C5, 0x24C6, 0x24C7, 0x24C8, 0x24C9,
- 0x24CA, 0x24CB, 0x24CC, 0x24CD, 0x24CE, 0x24CF, 0x20DE, 0x20DE,
- 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x005D,
- 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D,
- 0x005D, 0x005D, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE,
- 0x20DE, 0x20DE, 0x20DE, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D,
- 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x22CF, 0x22CE, 0x22CF, 0x22CE, 0x2280,
- 0x2281, 0x2270, 0x2271, 0x2272, 0x2273, 0x0000, 0x228A, 0x0000,
- 0x228B, 0x2276, 0x2277, 0x2279, 0x22DA, 0x22DB, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x2221, 0x2245, 0x2243, 0x2248, 0x0000, 0x22A4,
- 0x22AB, 0x0000, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE,
- 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x0000, 0x2460, 0x2461, 0x2462,
- 0x2463, 0x2464, 0x2465, 0x2466, 0x2467, 0x2468, 0x0029, 0x0029,
- 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029,
- 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029,
- 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029,
- 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029,
- 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029,
- 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029,
- 0x0029, 0x0029, 0x0021, 0x00B0, 0x0027, 0x0022, 0x2034, 0x0029,
- 0x0029, 0x0029, 0x0029, 0x0000, 0x0000, 0x2020, 0x2020, 0x2021,
- 0x2020, 0x00A7, 0x0023, 0x002A, 0x002A, 0x0000, 0x0000, 0x2042,
- 0x002A, 0x0000, 0x0000, 0x2042, 0x002A, 0x0000, 0x0000, 0x2022,
- 0x20DF, 0x20DF, 0x0000, 0x20DF, 0x3008, 0x3009, 0x300A, 0x300B,
- 0x261C, 0x261E, 0x0000, 0x0000, 0x20DE, 0x0000, 0x20DE, 0x20DE,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x20DD, 0x20DD, 0x271A, 0x2716,
- 0x0000, 0x25EF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x25CC,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20A9, 0x0000, 0x0000,
- 0x262F, 0x0000, 0x262F, 0x262F, 0x0000, 0x0000, 0x0000, 0x3020,
- 0x0000, 0x2776, 0x2777, 0x2778, 0x2779, 0x277A, 0x277B, 0x277C,
- 0x277D, 0x277E, 0x277F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0029, 0x0029, 0x0029,
- 0x0029, 0x0029, 0x0029, 0x2642, 0x22A9, 0x3036, 0x25CB, 0x25D3,
- 0x25A1, 0x2302, 0x0000, 0x25AD, 0x25AD, 0x0000, 0x0000, 0x0000,
- 0x25C7, 0x0000, 0x0000, 0x2206, 0x22BF, 0x231E, 0x0000, 0x2225,
- 0x2226, 0x0000, 0x2253, 0x2251, 0x2266, 0x2267, 0x2213, 0x2295,
- 0x2296, 0x2297, 0x20DD, 0x2314, 0x0000, 0x0000, 0x2262, 0x0000,
- 0x25B1, 0x0000, 0x2222, 0x2250, 0x00D8, 0x234A, 0x22A3, 0x0338,
- 0x0000, 0x226E, 0x226F, 0x2285, 0x2284, 0x2209, 0x220C, 0x22BB,
- 0x0016, 0x225A, 0x2306, 0x0024, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x329E, 0x0000, 0x203C, 0x003F, 0x0000, 0x003F, 0x22C4,
- 0x25C7, 0x22C4, 0x25C6, 0x25AB, 0x25A1, 0x25AB, 0x25A0, 0x25E6,
- 0x25CB, 0x25E6, 0x25CF, 0x25BD, 0x25B3, 0x25B7, 0x25C1, 0x2726,
- 0x25CF, 0x25A0, 0x0000, 0x25CA, 0x3231, 0x3239, 0x33CB, 0x2483,
- 0x2494, 0x2495, 0x2496, 0x2497, 0x0029, 0x0029, 0x0029, 0x0029,
- 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x2192, 0x2190,
- 0x2191, 0x2193, 0x2196, 0x2197, 0x2198, 0x2199, 0x21D0, 0x21CF,
- 0x21CD, 0x21D4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x2794, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x279C, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x27BA, 0x0000, 0x0000, 0x0000, 0x0000, 0x21D1, 0x21D3,
- 0x0000, 0x279E, 0x0000, 0x0000, 0x0000, 0x279E, 0x0000, 0x0000,
- 0x21B5, 0x21B1, 0x0000, 0x21B4, 0x21B0, 0x21B3, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x21E6, 0x21E8, 0x21E7, 0x21E9, 0x21BC, 0x21C0, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x21C0, 0x21BC, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x21C4, 0x21C5, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E,
- 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E,
- 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E,
- 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E,
- 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E,
- 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E,
- 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x20DE, 0x20DE,
- 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE,
- 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE,
- 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE,
- 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE,
- 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE,
- 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE,
- 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE,
- 0x20DE, 0x20DE, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD,
- 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD,
- 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD,
- 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD,
- 0x20DD, 0x20DD, 0x2483, 0x2484, 0x2485, 0x2486, 0x2487, 0x0029,
- 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x20DD, 0x20DD, 0x20DD,
- 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD,
- 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD,
- 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD,
- 0x3294, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD,
- 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD,
- 0x32A5, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD,
- 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD,
- 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD,
- 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD,
- 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD,
- 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD,
- 0x20DD, 0x0029, 0x0029, 0x0029, 0x0029, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x2794, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x21E0, 0x21E1,
- 0x21E2, 0x21E3, 0x0000, 0x27A1, 0x0000, 0x0000, 0x21E6, 0x21E8,
- 0x21E7, 0x21E9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x261D, 0x261F,
- 0x0000, 0x0000, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD,
- 0x20DD, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE,
- 0x20DE, 0x20DE, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D,
- 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x20DE, 0x20DE, 0x20DE,
- 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x005D,
- 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D,
- 0x005D, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE,
- 0x20DE, 0x20DE, 0x20DE, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D,
- 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x20DE, 0x20DE, 0x20DE,
- 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x3290, 0x328A, 0x328B, 0x328C,
- 0x328D, 0x328E, 0x328F, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE,
- 0x20DE, 0x20DE, 0x300C, 0x300D, 0x300E, 0x300F, 0x21E8, 0x21E6,
- 0x21E7, 0x21E9, 0x0022, 0x301F, 0x301D, 0x2036, 0x0060, 0x3001,
- 0x0000, 0x0021, 0x3021, 0x002C, 0x3002, 0xAC02, 0xAC03, 0xAC05,
- 0xAC06, 0xAC0B, 0xAC0C, 0xAC0D, 0xAC0E, 0xAC0F, 0xAC18, 0xAC1E,
- 0xAC1F, 0xAC21, 0xAC22, 0xAC23, 0xAC25, 0xAC26, 0xAC27, 0xAC28,
- 0xAC29, 0xAC2A, 0xAC2B, 0xAC2E, 0xAC32, 0xAC33, 0xAC34, 0xAC35,
- 0xAC36, 0xAC37, 0xAC3A, 0xAC3B, 0xAC3D, 0xAC3E, 0xAC3F, 0xAC41,
- 0xAC42, 0xAC43, 0xAC44, 0xAC45, 0xAC46, 0xAC47, 0xAC48, 0xAC49,
- 0xAC4A, 0xAC4C, 0xAC4E, 0xAC4F, 0xAC50, 0xAC51, 0xAC52, 0xAC53,
- 0xAC55, 0xAC56, 0xAC57, 0xAC59, 0xAC5A, 0xAC5B, 0xAC5D, 0xAC5E,
- 0xAC5F, 0xAC60, 0xAC61, 0xAC62, 0xAC63, 0xAC64, 0xAC65, 0xAC66,
- 0xAC67, 0xAC68, 0xAC69, 0xAC6A, 0xAC6B, 0xAC6C, 0xAC6D, 0xAC6E,
- 0xAC6F, 0xAC72, 0xAC73, 0xAC75, 0xAC76, 0xAC79, 0xAC7B, 0xAC7C,
- 0xAC7D, 0xAC7E, 0xAC7F, 0xAC82, 0xAC87, 0xAC88, 0xAC8D, 0xAC8E,
- 0xAC8F, 0xAC91, 0xAC92, 0xAC93, 0xAC95, 0xAC96, 0xAC97, 0xAC98,
- 0xAC99, 0xAC9A, 0xAC9B, 0xAC9E, 0xACA2, 0xACA3, 0xACA4, 0xACA5,
- 0xACA6, 0xACA7, 0xACAB, 0xACAD, 0xACAE, 0xACB1, 0xACB2, 0xACB3,
- 0xACB4, 0xACB5, 0xACB6, 0xACB7, 0xACBA, 0xACBE, 0xACBF, 0xACC0,
- 0xACC2, 0xACC3, 0xACC5, 0xACC6, 0xACC7, 0xACC9, 0xACCA, 0xACCB,
- 0xACCD, 0xACCE, 0xACCF, 0xACD0, 0xACD1, 0xACD2, 0xACD3, 0xACD4,
- 0xACD6, 0xACD8, 0xACD9, 0xACDA, 0xACDB, 0xACDC, 0xACDD, 0xACDE,
- 0xACDF, 0xACE2, 0xACE3, 0xACE5, 0xACE6, 0xACE9, 0xACEB, 0xACED,
- 0xACEE, 0xACF2, 0xACF4, 0xACF7, 0xACF8, 0xACF9, 0xACFA, 0xACFB,
- 0xACFE, 0xACFF, 0xAD01, 0xAD02, 0xAD03, 0xAD05, 0xAD07, 0xAD08,
- 0xAD09, 0xAD0A, 0xAD0B, 0xAD0E, 0xAD10, 0xAD12, 0xAD13, 0xAD14,
- 0xAD15, 0xAD16, 0xAD17, 0xAD19, 0xAD1A, 0xAD1B, 0xAD1D, 0xAD1E,
- 0xAD1F, 0xAD21, 0xAD22, 0xAD23, 0xAD24, 0xAD25, 0xAD26, 0xAD27,
- 0xAD28, 0xAD2A, 0xAD2B, 0xAD2E, 0xAD2F, 0xAD30, 0xAD31, 0xAD32,
- 0xAD33, 0xAD36, 0xAD37, 0xAD39, 0xAD3A, 0xAD3B, 0xAD3D, 0xAD3E,
- 0xAD3F, 0xAD40, 0xAD41, 0xAD42, 0xAD43, 0xAD46, 0xAD48, 0xAD4A,
- 0xAD4B, 0xAD4C, 0xAD4D, 0xAD4E, 0xAD4F, 0xAD51, 0xAD52, 0xAD53,
- 0xAD55, 0xAD56, 0xAD57, 0xAD59, 0xAD5A, 0xAD5B, 0xAD5C, 0xAD5D,
- 0xAD5E, 0xAD5F, 0xAD60, 0xAD62, 0xAD64, 0xAD65, 0xAD66, 0xAD67,
- 0xAD68, 0xAD69, 0xAD6A, 0xAD6B, 0xAD6E, 0xAD6F, 0xAD71, 0xAD72,
- 0xAD77, 0xAD78, 0xAD79, 0xAD7A, 0xAD7E, 0xAD80, 0xAD83, 0xAD84,
- 0xAD85, 0xAD86, 0xAD87, 0xAD8A, 0xAD8B, 0xAD8D, 0xAD8E, 0xAD8F,
- 0xAD91, 0xAD92, 0xAD93, 0xAD94, 0xAD95, 0xAD96, 0xAD97, 0xAD98,
- 0xAD99, 0xAD9A, 0xAD9B, 0xAD9E, 0xAD9F, 0xADA0, 0xADA1, 0xADA2,
- 0xADA3, 0xADA5, 0xADA6, 0xADA7, 0xADA8, 0xADA9, 0xADAA, 0xADAB,
- 0xADAC, 0xADAD, 0xADAE, 0xADAF, 0xADB0, 0xADB1, 0xADB2, 0xADB3,
- 0xADB4, 0xADB5, 0xADB6, 0xADB8, 0xADB9, 0xADBA, 0xADBB, 0xADBC,
- 0xADBD, 0xADBE, 0xADBF, 0xADC2, 0xADC3, 0xADC5, 0xADC6, 0xADC7,
- 0xADC9, 0xADCA, 0xADCB, 0xADCC, 0xADCD, 0xADCE, 0xADCF, 0xADD2,
- 0xADD4, 0xADD5, 0xADD6, 0xADD7, 0xADD8, 0xADD9, 0xADDA, 0xADDB,
- 0xADDD, 0xADDE, 0xADDF, 0xADE1, 0xADE2, 0xADE3, 0xADE5, 0xADE6,
- 0xADE7, 0xADE8, 0xADE9, 0xADEA, 0xADEB, 0xADEC, 0xADED, 0xADEE,
- 0xADEF, 0xADF0, 0xADF1, 0xADF2, 0xADF3, 0xADF4, 0xADF5, 0xADF6,
- 0xADF7, 0xADFA, 0xADFB, 0xADFD, 0xADFE, 0xAE02, 0xAE03, 0xAE04,
- 0xAE05, 0xAE06, 0xAE07, 0xAE0A, 0xAE0C, 0xAE0E, 0xAE0F, 0xAE10,
- 0xAE11, 0xAE12, 0xAE13, 0xAE15, 0xAE16, 0xAE17, 0xAE18, 0xAE19,
- 0xAE1A, 0xAE1B, 0xAE1C, 0xAE1D, 0xAE1E, 0xAE1F, 0xAE20, 0xAE21,
- 0xAE22, 0xAE23, 0xAE24, 0xAE25, 0xAE26, 0xAE27, 0xAE28, 0xAE29,
- 0xAE2A, 0xAE2B, 0xAE2C, 0xAE2D, 0xAE2E, 0xAE2F, 0xAE32, 0xAE33,
- 0xAE35, 0xAE36, 0xAE39, 0xAE3B, 0xAE3C, 0xAE3D, 0xAE3E, 0xAE3F,
- 0xAE42, 0xAE44, 0xAE47, 0xAE48, 0xAE49, 0xAE4B, 0xAE4F, 0xAE51,
- 0xAE52, 0xAE53, 0xAE55, 0xAE57, 0xAE58, 0xAE59, 0xAE5A, 0xAE5B,
- 0xAE5E, 0xAE62, 0xAE63, 0xAE64, 0xAE66, 0xAE67, 0xAE6A, 0xAE6B,
- 0xAE6D, 0xAE6E, 0xAE6F, 0xAE71, 0xAE72, 0xAE73, 0xAE74, 0xAE75,
- 0xAE76, 0xAE77, 0xAE7A, 0xAE7E, 0xAE7F, 0xAE80, 0xAE81, 0xAE82,
- 0xAE83, 0xAE86, 0xAE87, 0xAE88, 0xAE89, 0xAE8A, 0xAE8B, 0xAE8D,
- 0xAE8E, 0xAE8F, 0xAE90, 0xAE91, 0xAE92, 0xAE93, 0xAE94, 0xAE95,
- 0xAE96, 0xAE97, 0xAE98, 0xAE99, 0xAE9A, 0xAE9B, 0xAE9C, 0xAE9D,
- 0xAE9E, 0xAE9F, 0xAEA0, 0xAEA1, 0xAEA2, 0xAEA3, 0xAEA4, 0xAEA5,
- 0xAEA6, 0xAEA7, 0xAEA8, 0xAEA9, 0xAEAA, 0xAEAB, 0xAEAC, 0xAEAD,
- 0xAEAE, 0xAEAF, 0xAEB0, 0xAEB1, 0xAEB2, 0xAEB3, 0xAEB4, 0xAEB5,
- 0xAEB6, 0xAEB7, 0xAEB8, 0xAEB9, 0xAEBA, 0xAEBB, 0xAEBF, 0xAEC1,
- 0xAEC2, 0xAEC3, 0xAEC5, 0xAEC6, 0xAEC7, 0xAEC8, 0xAEC9, 0xAECA,
- 0xAECB, 0xAECE, 0xAED2, 0xAED3, 0xAED4, 0xAED5, 0xAED6, 0xAED7,
- 0xAEDA, 0xAEDB, 0xAEDD, 0xAEDE, 0xAEDF, 0xAEE0, 0xAEE1, 0xAEE2,
- 0xAEE3, 0xAEE4, 0xAEE5, 0xAEE6, 0xAEE7, 0xAEE9, 0xAEEA, 0xAEEC,
- 0xAEEE, 0xAEEF, 0xAEF0, 0xAEF1, 0xAEF2, 0xAEF3, 0xAEF5, 0xAEF6,
- 0xAEF7, 0xAEF9, 0xAEFA, 0xAEFB, 0xAEFD, 0xAEFE, 0xAEFF, 0xAF00,
- 0xAF01, 0xAF02, 0xAF03, 0xAF04, 0xAF05, 0xAF06, 0xAF09, 0xAF0A,
- 0xAF0B, 0xAF0C, 0xAF0E, 0xAF0F, 0xAF11, 0xAF12, 0xAF13, 0xAF14,
- 0xAF15, 0xAF16, 0xAF17, 0xAF18, 0xAF19, 0xAF1A, 0xAF1B, 0xAF1C,
- 0xAF1D, 0xAF1E, 0xAF1F, 0xAF20, 0xAF21, 0xAF22, 0xAF23, 0xAF24,
- 0xAF25, 0xAF26, 0xAF27, 0xAF28, 0xAF29, 0xAF2A, 0xAF2B, 0xAF2E,
- 0xAF2F, 0xAF31, 0xAF33, 0xAF35, 0xAF36, 0xAF37, 0xAF38, 0xAF39,
- 0xAF3A, 0xAF3B, 0xAF3E, 0xAF40, 0xAF44, 0xAF45, 0xAF46, 0xAF47,
- 0xAF4A, 0xAF4B, 0xAF4C, 0xAF4D, 0xAF4E, 0xAF4F, 0xAF51, 0xAF52,
- 0xAF53, 0xAF54, 0xAF55, 0xAF56, 0xAF57, 0xAF58, 0xAF59, 0xAF5A,
- 0xAF5B, 0xAF5E, 0xAF5F, 0xAF60, 0xAF61, 0xAF62, 0xAF63, 0xAF66,
- 0xAF67, 0xAF68, 0xAF69, 0xAF6A, 0xAF6B, 0xAF6C, 0xAF6D, 0xAF6E,
- 0xAF6F, 0xAF70, 0xAF71, 0xAF72, 0xAF73, 0xAF74, 0xAF75, 0xAF76,
- 0xAF77, 0xAF78, 0xAF7A, 0xAF7B, 0xAF7C, 0xAF7D, 0xAF7E, 0xAF7F,
- 0xAF81, 0xAF82, 0xAF83, 0xAF85, 0xAF86, 0xAF87, 0xAF89, 0xAF8A,
- 0xAF8B, 0xAF8C, 0xAF8D, 0xAF8E, 0xAF8F, 0xAF92, 0xAF93, 0xAF94,
- 0xAF96, 0xAF97, 0xAF98, 0xAF99, 0xAF9A, 0xAF9B, 0xAF9D, 0xAF9E,
- 0xAF9F, 0xAFA0, 0xAFA1, 0xAFA2, 0xAFA3, 0xAFA4, 0xAFA5, 0xAFA6,
- 0xAFA7, 0xAFA8, 0xAFA9, 0xAFAA, 0xAFAB, 0xAFAC, 0xAFAD, 0xAFAE,
- 0xAFAF, 0xAFB0, 0xAFB1, 0xAFB2, 0xAFB3, 0xAFB4, 0xAFB5, 0xAFB6,
- 0xAFB7, 0xAFBA, 0xAFBB, 0xAFBD, 0xAFBE, 0xAFBF, 0xAFC1, 0xAFC2,
- 0xAFC3, 0xAFC4, 0xAFC5, 0xAFC6, 0xAFCA, 0xAFCC, 0xAFCF, 0xAFD0,
- 0xAFD1, 0xAFD2, 0xAFD3, 0xAFD5, 0xAFD6, 0xAFD7, 0xAFD8, 0xAFD9,
- 0xAFDA, 0xAFDB, 0xAFDD, 0xAFDE, 0xAFDF, 0xAFE0, 0xAFE1, 0xAFE2,
- 0xAFE3, 0xAFE4, 0xAFE5, 0xAFE6, 0xAFE7, 0xAFEA, 0xAFEB, 0xAFEC,
- 0xAFED, 0xAFEE, 0xAFEF, 0xAFF2, 0xAFF3, 0xAFF5, 0xAFF6, 0xAFF7,
- 0xAFF9, 0xAFFA, 0xAFFB, 0xAFFC, 0xAFFD, 0xAFFE, 0xAFFF, 0xB002,
- 0xB003, 0xB005, 0xB006, 0xB007, 0xB008, 0xB009, 0xB00A, 0xB00B,
- 0xB00D, 0xB00E, 0xB00F, 0xB011, 0xB012, 0xB013, 0xB015, 0xB016,
- 0xB017, 0xB018, 0xB019, 0xB01A, 0xB01B, 0xB01E, 0xB01F, 0xB020,
- 0xB021, 0xB022, 0xB023, 0xB024, 0xB025, 0xB026, 0xB027, 0xB029,
- 0xB02A, 0xB02B, 0xB02C, 0xB02D, 0xB02E, 0xB02F, 0xB030, 0xB031,
- 0xB032, 0xB033, 0xB034, 0xB035, 0xB036, 0xB037, 0xB038, 0xB039,
- 0xB03A, 0xB03B, 0xB03C, 0xB03D, 0xB03E, 0xB03F, 0xB040, 0xB041,
- 0xB042, 0xB043, 0xB046, 0xB047, 0xB049, 0xB04B, 0xB04D, 0xB04F,
- 0xB050, 0xB051, 0xB052, 0xB056, 0xB058, 0xB05A, 0xB05B, 0xB05C,
- 0xB05E, 0xB05F, 0xB060, 0xB061, 0xB062, 0xB063, 0xB064, 0xB065,
- 0xB066, 0xB067, 0xB068, 0xB069, 0xB06A, 0xB06B, 0xB06C, 0xB06D,
- 0xB06E, 0xB06F, 0xB070, 0xB071, 0xB072, 0xB073, 0xB074, 0xB075,
- 0xB076, 0xB077, 0xB078, 0xB079, 0xB07A, 0xB07B, 0xB07E, 0xB07F,
- 0xB081, 0xB082, 0xB083, 0xB085, 0xB086, 0xB087, 0xB088, 0xB089,
- 0xB08A, 0xB08B, 0xB08E, 0xB090, 0xB092, 0xB093, 0xB094, 0xB095,
- 0xB096, 0xB097, 0xB09B, 0xB09D, 0xB09E, 0xB0A3, 0xB0A4, 0xB0A5,
- 0xB0A6, 0xB0A7, 0xB0AA, 0xB0B0, 0xB0B2, 0xB0B6, 0xB0B7, 0xB0B9,
- 0xB0BA, 0xB0BB, 0xB0BD, 0xB0BE, 0xB0BF, 0xB0C0, 0xB0C1, 0xB0C2,
- 0xB0C3, 0xB0C6, 0xB0CA, 0xB0CB, 0xB0CC, 0xB0CD, 0xB0CE, 0xB0CF,
- 0xB0D2, 0xB0D3, 0xB0D5, 0xB0D6, 0xB0D7, 0xB0D9, 0xB0DA, 0xB0DB,
- 0xB0DC, 0xB0DD, 0xB0DE, 0xB0DF, 0xB0E1, 0xB0E2, 0xB0E3, 0xB0E4,
- 0xB0E6, 0xB0E7, 0xB0E8, 0xB0E9, 0xB0EA, 0xB0EB, 0xB0EC, 0xB0ED,
- 0xB0EE, 0xB0EF, 0xB0F0, 0xB0F1, 0xB0F2, 0xB0F3, 0xB0F4, 0xB0F5,
- 0xB0F6, 0xB0F7, 0xB0F8, 0xB0F9, 0xB0FA, 0xB0FB, 0xB0FC, 0xB0FD,
- 0xB0FE, 0xB0FF, 0xB100, 0xB101, 0xB102, 0xB103, 0xB104, 0xB105,
- 0xB106, 0xB107, 0xB10A, 0xB10D, 0xB10E, 0xB10F, 0xB111, 0xB114,
- 0xB115, 0xB116, 0xB117, 0xB11A, 0xB11E, 0xB11F, 0xB120, 0xB121,
- 0xB122, 0xB126, 0xB127, 0xB129, 0xB12A, 0xB12B, 0xB12D, 0xB12E,
- 0xB12F, 0xB130, 0xB131, 0xB132, 0xB133, 0xB136, 0xB13A, 0xB13B,
- 0xB13C, 0xB13D, 0xB13E, 0xB13F, 0xB142, 0xB143, 0xB145, 0xB146,
- 0xB147, 0xB149, 0xB14A, 0xB14B, 0xB14C, 0xB14D, 0xB14E, 0xB14F,
- 0xB152, 0xB153, 0xB156, 0xB157, 0xB159, 0xB15A, 0xB15B, 0xB15D,
- 0xB15E, 0xB15F, 0xB161, 0xB162, 0xB163, 0xB164, 0xB165, 0xB166,
- 0xB167, 0xB168, 0xB169, 0xB16A, 0xB16B, 0xB16C, 0xB16D, 0xB16E,
- 0xB16F, 0xB170, 0xB171, 0xB172, 0xB173, 0xB174, 0xB175, 0xB176,
- 0xB177, 0xB17A, 0xB17B, 0xB17D, 0xB17E, 0xB17F, 0xB181, 0xB183,
- 0xB184, 0xB185, 0xB186, 0xB187, 0xB18A, 0xB18C, 0xB18E, 0xB18F,
- 0xB190, 0xB191, 0xB195, 0xB196, 0xB197, 0xB199, 0xB19A, 0xB19B,
- 0xB19D, 0xB19E, 0xB19F, 0xB1A0, 0xB1A1, 0xB1A2, 0xB1A3, 0xB1A4,
- 0xB1A5, 0xB1A6, 0xB1A7, 0xB1A9, 0xB1AA, 0xB1AB, 0xB1AC, 0xB1AD,
- 0xB1AE, 0xB1AF, 0xB1B0, 0xB1B1, 0xB1B2, 0xB1B3, 0xB1B4, 0xB1B5,
- 0xB1B6, 0xB1B7, 0xB1B8, 0xB1B9, 0xB1BA, 0xB1BB, 0xB1BC, 0xB1BD,
- 0xB1BE, 0xB1BF, 0xB1C0, 0xB1C1, 0xB1C2, 0xB1C3, 0xB1C4, 0xB1C5,
- 0xB1C6, 0xB1C7, 0xB1C8, 0xB1C9, 0xB1CA, 0xB1CB, 0xB1CD, 0xB1CE,
- 0xB1CF, 0xB1D1, 0xB1D2, 0xB1D3, 0xB1D5, 0xB1D6, 0xB1D7, 0xB1D8,
- 0xB1D9, 0xB1DA, 0xB1DB, 0xB1DE, 0xB1E0, 0xB1E1, 0xB1E2, 0xB1E3,
- 0xB1E4, 0xB1E5, 0xB1E6, 0xB1E7, 0xB1EA, 0xB1EB, 0xB1ED, 0xB1EE,
- 0xB1EF, 0xB1F1, 0xB1F2, 0xB1F3, 0xB1F4, 0xB1F5, 0xB1F6, 0xB1F7,
- 0xB1F8, 0xB1FA, 0xB1FC, 0xB1FE, 0xB1FF, 0xB200, 0xB201, 0xB202,
- 0xB203, 0xB206, 0xB207, 0xB209, 0xB20A, 0xB20D, 0xB20E, 0xB20F,
- 0xB210, 0xB211, 0xB212, 0xB213, 0xB216, 0xB218, 0xB21A, 0xB21B,
- 0xB21C, 0xB21D, 0xB21E, 0xB21F, 0xB221, 0xB222, 0xB223, 0xB224,
- 0xB225, 0xB226, 0xB227, 0xB228, 0xB229, 0xB22A, 0xB22B, 0xB22C,
- 0xB22D, 0xB22E, 0xB22F, 0xB230, 0xB231, 0xB232, 0xB233, 0xB235,
- 0xB236, 0xB237, 0xB238, 0xB239, 0xB23A, 0xB23B, 0xB23D, 0xB23E,
- 0xB23F, 0xB240, 0xB241, 0xB242, 0xB243, 0xB244, 0xB245, 0xB246,
- 0xB247, 0xB248, 0xB249, 0xB24A, 0xB24B, 0xB24C, 0xB24D, 0xB24E,
- 0xB24F, 0xB250, 0xB251, 0xB252, 0xB253, 0xB254, 0xB255, 0xB256,
- 0xB257, 0xB259, 0xB25A, 0xB25B, 0xB25D, 0xB25E, 0xB25F, 0xB261,
- 0xB262, 0xB263, 0xB264, 0xB265, 0xB266, 0xB267, 0xB26A, 0xB26B,
- 0xB26C, 0xB26D, 0xB26E, 0xB26F, 0xB270, 0xB271, 0xB272, 0xB273,
- 0xB276, 0xB277, 0xB278, 0xB279, 0xB27A, 0xB27B, 0xB27D, 0xB27E,
- 0xB27F, 0xB280, 0xB281, 0xB282, 0xB283, 0xB286, 0xB287, 0xB288,
- 0xB28A, 0xB28B, 0xB28C, 0xB28D, 0xB28E, 0xB28F, 0xB292, 0xB293,
- 0xB295, 0xB296, 0xB297, 0xB29B, 0xB29C, 0xB29D, 0xB29E, 0xB29F,
- 0xB2A2, 0xB2A4, 0xB2A7, 0xB2A8, 0xB2A9, 0xB2AB, 0xB2AD, 0xB2AE,
- 0xB2AF, 0xB2B1, 0xB2B2, 0xB2B3, 0xB2B5, 0xB2B6, 0xB2B7, 0xB2B8,
- 0xB2B9, 0xB2BA, 0xB2BB, 0xB2BC, 0xB2BD, 0xB2BE, 0xB2BF, 0xB2C0,
- 0xB2C1, 0xB2C2, 0xB2C3, 0xB2C4, 0xB2C5, 0xB2C6, 0xB2C7, 0xB2CA,
- 0xB2CB, 0xB2CD, 0xB2CE, 0xB2CF, 0xB2D1, 0xB2D3, 0xB2D4, 0xB2D5,
- 0xB2D6, 0xB2D7, 0xB2DA, 0xB2DC, 0xB2DE, 0xB2DF, 0xB2E0, 0xB2E1,
- 0xB2E3, 0xB2E7, 0xB2E9, 0xB2EA, 0xB2F0, 0xB2F1, 0xB2F2, 0xB2F6,
- 0xB2FC, 0xB2FD, 0xB2FE, 0xB302, 0xB303, 0xB305, 0xB306, 0xB307,
- 0xB309, 0xB30A, 0xB30B, 0xB30C, 0xB30D, 0xB30E, 0xB30F, 0xB312,
- 0xB316, 0xB317, 0xB318, 0xB319, 0xB31A, 0xB31B, 0xB31D, 0xB31E,
- 0xB31F, 0xB320, 0xB321, 0xB322, 0xB323, 0xB324, 0xB325, 0xB326,
- 0xB327, 0xB328, 0xB329, 0xB32A, 0xB32B, 0xB32C, 0xB32D, 0xB32E,
- 0xB32F, 0xB330, 0xB331, 0xB332, 0xB333, 0xB334, 0xB335, 0xB336,
- 0xB337, 0xB338, 0xB339, 0xB33A, 0xB33B, 0xB33C, 0xB33D, 0xB33E,
- 0xB33F, 0xB340, 0xB341, 0xB342, 0xB343, 0xB344, 0xB345, 0xB346,
- 0xB347, 0xB348, 0xB349, 0xB34A, 0xB34B, 0xB34C, 0xB34D, 0xB34E,
- 0xB34F, 0xB350, 0xB351, 0xB352, 0xB353, 0xB357, 0xB359, 0xB35A,
- 0xB35D, 0xB360, 0xB361, 0xB362, 0xB363, 0xB366, 0xB368, 0xB36A,
- 0xB36C, 0xB36D, 0xB36F, 0xB372, 0xB373, 0xB375, 0xB376, 0xB377,
- 0xB379, 0xB37A, 0xB37B, 0xB37C, 0xB37D, 0xB37E, 0xB37F, 0xB382,
- 0xB386, 0xB387, 0xB388, 0xB389, 0xB38A, 0xB38B, 0xB38D, 0xB38E,
- 0xB38F, 0xB391, 0xB392, 0xB393, 0xB395, 0xB396, 0xB397, 0xB398,
- 0xB399, 0xB39A, 0xB39B, 0xB39C, 0xB39D, 0xB39E, 0xB39F, 0xB3A2,
- 0xB3A3, 0xB3A4, 0xB3A5, 0xB3A6, 0xB3A7, 0xB3A9, 0xB3AA, 0xB3AB,
- 0xB3AD, 0xB3AE, 0xB3AF, 0xB3B0, 0xB3B1, 0xB3B2, 0xB3B3, 0xB3B4,
- 0xB3B5, 0xB3B6, 0xB3B7, 0xB3B8, 0xB3B9, 0xB3BA, 0xB3BB, 0xB3BC,
- 0xB3BD, 0xB3BE, 0xB3BF, 0xB3C0, 0xB3C1, 0xB3C2, 0xB3C3, 0xB3C6,
- 0xB3C7, 0xB3C9, 0xB3CA, 0xB3CD, 0xB3CF, 0xB3D1, 0xB3D2, 0xB3D3,
- 0xB3D6, 0xB3D8, 0xB3DA, 0xB3DC, 0xB3DE, 0xB3DF, 0xB3E1, 0xB3E2,
- 0xB3E3, 0xB3E5, 0xB3E6, 0xB3E7, 0xB3E9, 0xB3EA, 0xB3EB, 0xB3EC,
- 0xB3ED, 0xB3EE, 0xB3EF, 0xB3F0, 0xB3F1, 0xB3F2, 0xB3F3, 0xB3F4,
- 0xB3F5, 0xB3F6, 0xB3F7, 0xB3F8, 0xB3F9, 0xB3FA, 0xB3FB, 0xB3FD,
- 0xB3FE, 0xB3FF, 0xB400, 0xB401, 0xB402, 0xB403, 0xB404, 0xB405,
- 0xB406, 0xB407, 0xB408, 0xB409, 0xB40A, 0xB40B, 0xB40C, 0xB40D,
- 0xB40E, 0xB40F, 0xB411, 0xB412, 0xB413, 0xB414, 0xB415, 0xB416,
- 0xB417, 0xB419, 0xB41A, 0xB41B, 0xB41D, 0xB41E, 0xB41F, 0xB421,
- 0xB422, 0xB423, 0xB424, 0xB425, 0xB426, 0xB427, 0xB42A, 0xB42C,
- 0xB42D, 0xB42E, 0xB42F, 0xB430, 0xB431, 0xB432, 0xB433, 0xB435,
- 0xB436, 0xB437, 0xB438, 0xB439, 0xB43A, 0xB43B, 0xB43C, 0xB43D,
- 0xB43E, 0xB43F, 0xB440, 0xB441, 0xB442, 0xB443, 0xB444, 0xB445,
- 0xB446, 0xB447, 0xB448, 0xB449, 0xB44A, 0xB44B, 0xB44C, 0xB44D,
- 0xB44E, 0xB44F, 0xB452, 0xB453, 0xB455, 0xB456, 0xB457, 0xB459,
- 0xB45A, 0xB45B, 0xB45C, 0xB45D, 0xB45E, 0xB45F, 0xB462, 0xB464,
- 0xB466, 0xB467, 0xB468, 0xB469, 0xB46A, 0xB46B, 0xB46D, 0xB46E,
- 0xB46F, 0xB470, 0xB471, 0xB472, 0xB473, 0xB474, 0xB475, 0xB476,
- 0xB477, 0xB478, 0xB479, 0xB47A, 0xB47B, 0xB47C, 0xB47D, 0xB47E,
- 0xB47F, 0xB481, 0xB482, 0xB483, 0xB484, 0xB485, 0xB486, 0xB487,
- 0xB489, 0xB48A, 0xB48B, 0xB48C, 0xB48D, 0xB48E, 0xB48F, 0xB490,
- 0xB491, 0xB492, 0xB493, 0xB494, 0xB495, 0xB496, 0xB497, 0xB498,
- 0xB499, 0xB49A, 0xB49B, 0xB49C, 0xB49E, 0xB49F, 0xB4A0, 0xB4A1,
- 0xB4A2, 0xB4A3, 0xB4A5, 0xB4A6, 0xB4A7, 0xB4A9, 0xB4AA, 0xB4AB,
- 0xB4AD, 0xB4AE, 0xB4AF, 0xB4B0, 0xB4B1, 0xB4B2, 0xB4B3, 0xB4B4,
- 0xB4B6, 0xB4B8, 0xB4BA, 0xB4BB, 0xB4BC, 0xB4BD, 0xB4BE, 0xB4BF,
- 0xB4C1, 0xB4C2, 0xB4C3, 0xB4C5, 0xB4C6, 0xB4C7, 0xB4C9, 0xB4CA,
- 0xB4CB, 0xB4CC, 0xB4CD, 0xB4CE, 0xB4CF, 0xB4D1, 0xB4D2, 0xB4D3,
- 0xB4D4, 0xB4D6, 0xB4D7, 0xB4D8, 0xB4D9, 0xB4DA, 0xB4DB, 0xB4DE,
- 0xB4DF, 0xB4E1, 0xB4E2, 0xB4E5, 0xB4E7, 0xB4E8, 0xB4E9, 0xB4EA,
- 0xB4EB, 0xB4EE, 0xB4F0, 0xB4F2, 0xB4F3, 0xB4F4, 0xB4F5, 0xB4F6,
- 0xB4F7, 0xB4F9, 0xB4FA, 0xB4FB, 0xB4FC, 0xB4FD, 0xB4FE, 0xB4FF,
- 0xB500, 0xB501, 0xB502, 0xB503, 0xB504, 0xB505, 0xB506, 0xB507,
- 0xB508, 0xB509, 0xB50A, 0xB50B, 0xB50C, 0xB50D, 0xB50E, 0xB50F,
- 0xB510, 0xB511, 0xB512, 0xB513, 0xB516, 0xB517, 0xB519, 0xB51A,
- 0xB51D, 0xB51E, 0xB51F, 0xB520, 0xB521, 0xB522, 0xB523, 0xB526,
- 0xB52B, 0xB52C, 0xB52D, 0xB52E, 0xB52F, 0xB532, 0xB533, 0xB535,
- 0xB536, 0xB537, 0xB539, 0xB53A, 0xB53B, 0xB53C, 0xB53D, 0xB53E,
- 0xB53F, 0xB542, 0xB546, 0xB547, 0xB548, 0xB549, 0xB54A, 0xB54E,
- 0xB54F, 0xB551, 0xB552, 0xB553, 0xB555, 0xB556, 0xB557, 0xB558,
- 0xB559, 0xB55A, 0xB55B, 0xB55E, 0xB562, 0xB563, 0xB564, 0xB565,
- 0xB566, 0xB567, 0xB568, 0xB569, 0xB56A, 0xB56B, 0xB56C, 0xB56D,
- 0xB56E, 0xB56F, 0xB570, 0xB571, 0xB572, 0xB573, 0xB574, 0xB575,
- 0xB576, 0xB577, 0xB578, 0xB579, 0xB57A, 0xB57B, 0xB57C, 0xB57D,
- 0xB57E, 0xB57F, 0xB580, 0xB581, 0xB582, 0xB583, 0xB584, 0xB585,
- 0xB586, 0xB587, 0xB588, 0xB589, 0xB58A, 0xB58B, 0xB58C, 0xB58D,
- 0xB58E, 0xB58F, 0xB590, 0xB591, 0xB592, 0xB593, 0xB594, 0xB595,
- 0xB596, 0xB597, 0xB598, 0xB599, 0xB59A, 0xB59B, 0xB59C, 0xB59D,
- 0xB59E, 0xB59F, 0xB5A2, 0xB5A3, 0xB5A5, 0xB5A6, 0xB5A7, 0xB5A9,
- 0xB5AC, 0xB5AD, 0xB5AE, 0xB5AF, 0xB5B2, 0xB5B6, 0xB5B7, 0xB5B8,
- 0xB5B9, 0xB5BA, 0xB5BE, 0xB5BF, 0xB5C1, 0xB5C2, 0xB5C3, 0xB5C5,
- 0xB5C6, 0xB5C7, 0xB5C8, 0xB5C9, 0xB5CA, 0xB5CB, 0xB5CE, 0xB5D2,
- 0xB5D3, 0xB5D4, 0xB5D5, 0xB5D6, 0xB5D7, 0xB5D9, 0xB5DA, 0xB5DB,
- 0xB5DC, 0xB5DD, 0xB5DE, 0xB5DF, 0xB5E0, 0xB5E1, 0xB5E2, 0xB5E3,
- 0xB5E4, 0xB5E5, 0xB5E6, 0xB5E7, 0xB5E8, 0xB5E9, 0xB5EA, 0xB5EB,
- 0xB5ED, 0xB5EE, 0xB5EF, 0xB5F0, 0xB5F1, 0xB5F2, 0xB5F3, 0xB5F4,
- 0xB5F5, 0xB5F6, 0xB5F7, 0xB5F8, 0xB5F9, 0xB5FA, 0xB5FB, 0xB5FC,
- 0xB5FD, 0xB5FE, 0xB5FF, 0xB600, 0xB601, 0xB602, 0xB603, 0xB604,
- 0xB605, 0xB606, 0xB607, 0xB608, 0xB609, 0xB60A, 0xB60B, 0xB60C,
- 0xB60D, 0xB60E, 0xB60F, 0xB612, 0xB613, 0xB615, 0xB616, 0xB617,
- 0xB619, 0xB61A, 0xB61B, 0xB61C, 0xB61D, 0xB61E, 0xB61F, 0xB620,
- 0xB621, 0xB622, 0xB623, 0xB624, 0xB626, 0xB627, 0xB628, 0xB629,
- 0xB62A, 0xB62B, 0xB62D, 0xB62E, 0xB62F, 0xB630, 0xB631, 0xB632,
- 0xB633, 0xB635, 0xB636, 0xB637, 0xB638, 0xB639, 0xB63A, 0xB63B,
- 0xB63C, 0xB63D, 0xB63E, 0xB63F, 0xB640, 0xB641, 0xB642, 0xB643,
- 0xB644, 0xB645, 0xB646, 0xB647, 0xB649, 0xB64A, 0xB64B, 0xB64C,
- 0xB64D, 0xB64E, 0xB64F, 0xB650, 0xB651, 0xB652, 0xB653, 0xB654,
- 0xB655, 0xB656, 0xB657, 0xB658, 0xB659, 0xB65A, 0xB65B, 0xB65C,
- 0xB65D, 0xB65E, 0xB65F, 0xB660, 0xB661, 0xB662, 0xB663, 0xB665,
- 0xB666, 0xB667, 0xB669, 0xB66A, 0xB66B, 0xB66C, 0xB66D, 0xB66E,
- 0xB66F, 0xB670, 0xB671, 0xB672, 0xB673, 0xB674, 0xB675, 0xB676,
- 0xB677, 0xB678, 0xB679, 0xB67A, 0xB67B, 0xB67C, 0xB67D, 0xB67E,
- 0xB67F, 0xB680, 0xB681, 0xB682, 0xB683, 0xB684, 0xB685, 0xB686,
- 0xB687, 0xB688, 0xB689, 0xB68A, 0xB68B, 0xB68C, 0xB68D, 0xB68E,
- 0xB68F, 0xB690, 0xB691, 0xB692, 0xB693, 0xB694, 0xB695, 0xB696,
- 0xB697, 0xB698, 0xB699, 0xB69A, 0xB69B, 0xB69E, 0xB69F, 0xB6A1,
- 0xB6A2, 0xB6A3, 0xB6A5, 0xB6A6, 0xB6A7, 0xB6A8, 0xB6A9, 0xB6AA,
- 0xB6AD, 0xB6AE, 0xB6AF, 0xB6B0, 0xB6B2, 0xB6B3, 0xB6B4, 0xB6B5,
- 0xB6B6, 0xB6B7, 0xB6B8, 0xB6B9, 0xB6BA, 0xB6BB, 0xB6BC, 0xB6BD,
- 0xB6BE, 0xB6BF, 0xB6C0, 0xB6C1, 0xB6C2, 0xB6C3, 0xB6C4, 0xB6C5,
- 0xB6C6, 0xB6C7, 0xB6C8, 0xB6C9, 0xB6CA, 0xB6CB, 0xB6CC, 0xB6CD,
- 0xB6CE, 0xB6CF, 0xB6D0, 0xB6D1, 0xB6D2, 0xB6D3, 0xB6D5, 0xB6D6,
- 0xB6D7, 0xB6D8, 0xB6D9, 0xB6DA, 0xB6DB, 0xB6DC, 0xB6DD, 0xB6DE,
- 0xB6DF, 0xB6E0, 0xB6E1, 0xB6E2, 0xB6E3, 0xB6E4, 0xB6E5, 0xB6E6,
- 0xB6E7, 0xB6E8, 0xB6E9, 0xB6EA, 0xB6EB, 0xB6EC, 0xB6ED, 0xB6EE,
- 0xB6EF, 0xB6F1, 0xB6F2, 0xB6F3, 0xB6F5, 0xB6F6, 0xB6F7, 0xB6F9,
- 0xB6FA, 0xB6FB, 0xB6FC, 0xB6FD, 0xB6FE, 0xB6FF, 0xB702, 0xB703,
- 0xB704, 0xB706, 0xB707, 0xB708, 0xB709, 0xB70A, 0xB70B, 0xB70C,
- 0xB70D, 0xB70E, 0xB70F, 0xB710, 0xB711, 0xB712, 0xB713, 0xB714,
- 0xB715, 0xB716, 0xB717, 0xB718, 0xB719, 0xB71A, 0xB71B, 0xB71C,
- 0xB71D, 0xB71E, 0xB71F, 0xB720, 0xB721, 0xB722, 0xB723, 0xB724,
- 0xB725, 0xB726, 0xB727, 0xB72A, 0xB72B, 0xB72D, 0xB72E, 0xB731,
- 0xB732, 0xB733, 0xB734, 0xB735, 0xB736, 0xB737, 0xB73A, 0xB73C,
- 0xB73D, 0xB73E, 0xB73F, 0xB740, 0xB741, 0xB742, 0xB743, 0xB745,
- 0xB746, 0xB747, 0xB749, 0xB74A, 0xB74B, 0xB74D, 0xB74E, 0xB74F,
- 0xB750, 0xB751, 0xB752, 0xB753, 0xB756, 0xB757, 0xB758, 0xB759,
- 0xB75A, 0xB75B, 0xB75C, 0xB75D, 0xB75E, 0xB75F, 0xB761, 0xB762,
- 0xB763, 0xB765, 0xB766, 0xB767, 0xB769, 0xB76A, 0xB76B, 0xB76C,
- 0xB76D, 0xB76E, 0xB76F, 0xB772, 0xB774, 0xB776, 0xB777, 0xB778,
- 0xB779, 0xB77A, 0xB77B, 0xB77E, 0xB77F, 0xB781, 0xB782, 0xB783,
- 0xB785, 0xB786, 0xB787, 0xB788, 0xB789, 0xB78A, 0xB78B, 0xB78E,
- 0xB793, 0xB794, 0xB795, 0xB79A, 0xB79B, 0xB79D, 0xB79E, 0xB79F,
- 0xB7A1, 0xB7A2, 0xB7A3, 0xB7A4, 0xB7A5, 0xB7A6, 0xB7A7, 0xB7AA,
- 0xB7AE, 0xB7AF, 0xB7B0, 0xB7B1, 0xB7B2, 0xB7B3, 0xB7B6, 0xB7B7,
- 0xB7B9, 0xB7BA, 0xB7BB, 0xB7BC, 0xB7BD, 0xB7BE, 0xB7BF, 0xB7C0,
- 0xB7C1, 0xB7C2, 0xB7C3, 0xB7C4, 0xB7C5, 0xB7C6, 0xB7C8, 0xB7CA,
- 0xB7CB, 0xB7CC, 0xB7CD, 0xB7CE, 0xB7CF, 0xB7D0, 0xB7D1, 0xB7D2,
- 0xB7D3, 0xB7D4, 0xB7D5, 0xB7D6, 0xB7D7, 0xB7D8, 0xB7D9, 0xB7DA,
- 0xB7DB, 0xB7DC, 0xB7DD, 0xB7DE, 0xB7DF, 0xB7E0, 0xB7E1, 0xB7E2,
- 0xB7E3, 0xB7E4, 0xB7E5, 0xB7E6, 0xB7E7, 0xB7E8, 0xB7E9, 0xB7EA,
- 0xB7EB, 0xB7EE, 0xB7EF, 0xB7F1, 0xB7F2, 0xB7F3, 0xB7F5, 0xB7F6,
- 0xB7F7, 0xB7F8, 0xB7F9, 0xB7FA, 0xB7FB, 0xB7FE, 0xB802, 0xB803,
- 0xB804, 0xB805, 0xB806, 0xB80A, 0xB80B, 0xB80D, 0xB80E, 0xB80F,
- 0xB811, 0xB812, 0xB813, 0xB814, 0xB815, 0xB816, 0xB817, 0xB81A,
- 0xB81C, 0xB81E, 0xB81F, 0xB820, 0xB821, 0xB822, 0xB823, 0xB826,
- 0xB827, 0xB829, 0xB82A, 0xB82B, 0xB82D, 0xB82E, 0xB82F, 0xB830,
- 0xB831, 0xB832, 0xB833, 0xB836, 0xB83A, 0xB83B, 0xB83C, 0xB83D,
- 0xB83E, 0xB83F, 0xB841, 0xB842, 0xB843, 0xB845, 0xB846, 0xB847,
- 0xB848, 0xB849, 0xB84A, 0xB84B, 0xB84C, 0xB84D, 0xB84E, 0xB84F,
- 0xB850, 0xB852, 0xB854, 0xB855, 0xB856, 0xB857, 0xB858, 0xB859,
- 0xB85A, 0xB85B, 0xB85E, 0xB85F, 0xB861, 0xB862, 0xB863, 0xB865,
- 0xB866, 0xB867, 0xB868, 0xB869, 0xB86A, 0xB86B, 0xB86E, 0xB870,
- 0xB872, 0xB873, 0xB874, 0xB875, 0xB876, 0xB877, 0xB879, 0xB87A,
- 0xB87B, 0xB87D, 0xB87E, 0xB87F, 0xB880, 0xB881, 0xB882, 0xB883,
- 0xB884, 0xB885, 0xB886, 0xB887, 0xB888, 0xB889, 0xB88A, 0xB88B,
- 0xB88C, 0xB88E, 0xB88F, 0xB890, 0xB891, 0xB892, 0xB893, 0xB894,
- 0xB895, 0xB896, 0xB897, 0xB898, 0xB899, 0xB89A, 0xB89B, 0xB89C,
- 0xB89D, 0xB89E, 0xB89F, 0xB8A0, 0xB8A1, 0xB8A2, 0xB8A3, 0xB8A4,
- 0xB8A5, 0xB8A6, 0xB8A7, 0xB8A9, 0xB8AA, 0xB8AB, 0xB8AC, 0xB8AD,
- 0xB8AE, 0xB8AF, 0xB8B1, 0xB8B2, 0xB8B3, 0xB8B5, 0xB8B6, 0xB8B7,
- 0xB8B9, 0xB8BA, 0xB8BB, 0xB8BC, 0xB8BD, 0xB8BE, 0xB8BF, 0xB8C2,
- 0xB8C4, 0xB8C6, 0xB8C7, 0xB8C8, 0xB8C9, 0xB8CA, 0xB8CB, 0xB8CD,
- 0xB8CE, 0xB8CF, 0xB8D1, 0xB8D2, 0xB8D3, 0xB8D5, 0xB8D6, 0xB8D7,
- 0xB8D8, 0xB8D9, 0xB8DA, 0xB8DB, 0xB8DC, 0xB8DE, 0xB8E0, 0xB8E2,
- 0xB8E3, 0xB8E4, 0xB8E5, 0xB8E6, 0xB8E7, 0xB8EA, 0xB8EB, 0xB8ED,
- 0xB8EE, 0xB8EF, 0xB8F1, 0xB8F2, 0xB8F3, 0xB8F4, 0xB8F5, 0xB8F6,
- 0xB8F7, 0xB8FA, 0xB8FC, 0xB8FE, 0xB8FF, 0xB900, 0xB901, 0xB902,
- 0xB903, 0xB905, 0xB906, 0xB907, 0xB908, 0xB909, 0xB90A, 0xB90B,
- 0xB90C, 0xB90D, 0xB90E, 0xB90F, 0xB910, 0xB911, 0xB912, 0xB913,
- 0xB914, 0xB915, 0xB916, 0xB917, 0xB919, 0xB91A, 0xB91B, 0xB91C,
- 0xB91D, 0xB91E, 0xB91F, 0xB921, 0xB922, 0xB923, 0xB924, 0xB925,
- 0xB926, 0xB927, 0xB928, 0xB929, 0xB92A, 0xB92B, 0xB92C, 0xB92D,
- 0xB92E, 0xB92F, 0xB930, 0xB931, 0xB932, 0xB933, 0xB934, 0xB935,
- 0xB936, 0xB937, 0xB938, 0xB939, 0xB93A, 0xB93B, 0xB93E, 0xB93F,
- 0xB941, 0xB942, 0xB943, 0xB945, 0xB946, 0xB947, 0xB948, 0xB949,
- 0xB94A, 0xB94B, 0xB94D, 0xB94E, 0xB950, 0xB952, 0xB953, 0xB954,
- 0xB955, 0xB956, 0xB957, 0xB95A, 0xB95B, 0xB95D, 0xB95E, 0xB95F,
- 0xB961, 0xB962, 0xB963, 0xB964, 0xB965, 0xB966, 0xB967, 0xB96A,
- 0xB96C, 0xB96E, 0xB96F, 0xB970, 0xB971, 0xB972, 0xB973, 0xB976,
- 0xB977, 0xB979, 0xB97A, 0xB97B, 0xB97D, 0xB97E, 0xB97F, 0xB980,
- 0xB981, 0xB982, 0xB983, 0xB986, 0xB988, 0xB98B, 0xB98C, 0xB98F,
- 0xB990, 0xB991, 0xB992, 0xB993, 0xB994, 0xB995, 0xB996, 0xB997,
- 0xB998, 0xB999, 0xB99A, 0xB99B, 0xB99C, 0xB99D, 0xB99E, 0xB99F,
- 0xB9A0, 0xB9A1, 0xB9A2, 0xB9A3, 0xB9A4, 0xB9A5, 0xB9A6, 0xB9A7,
- 0xB9A8, 0xB9A9, 0xB9AA, 0xB9AB, 0xB9AE, 0xB9AF, 0xB9B1, 0xB9B2,
- 0xB9B3, 0xB9B5, 0xB9B6, 0xB9B7, 0xB9B8, 0xB9B9, 0xB9BA, 0xB9BB,
- 0xB9BE, 0xB9C0, 0xB9C2, 0xB9C3, 0xB9C4, 0xB9C5, 0xB9C6, 0xB9C7,
- 0xB9CA, 0xB9CB, 0xB9CD, 0xB9D3, 0xB9D4, 0xB9D5, 0xB9D6, 0xB9D7,
- 0xB9DA, 0xB9DC, 0xB9DF, 0xB9E0, 0xB9E2, 0xB9E6, 0xB9E7, 0xB9E9,
- 0xB9EA, 0xB9EB, 0xB9ED, 0xB9EE, 0xB9EF, 0xB9F0, 0xB9F1, 0xB9F2,
- 0xB9F3, 0xB9F6, 0xB9FB, 0xB9FC, 0xB9FD, 0xB9FE, 0xB9FF, 0xBA02,
- 0xBA03, 0xBA04, 0xBA05, 0xBA06, 0xBA07, 0xBA09, 0xBA0A, 0xBA0B,
- 0xBA0C, 0xBA0D, 0xBA0E, 0xBA0F, 0xBA10, 0xBA11, 0xBA12, 0xBA13,
- 0xBA14, 0xBA16, 0xBA17, 0xBA18, 0xBA19, 0xBA1A, 0xBA1B, 0xBA1C,
- 0xBA1D, 0xBA1E, 0xBA1F, 0xBA20, 0xBA21, 0xBA22, 0xBA23, 0xBA24,
- 0xBA25, 0xBA26, 0xBA27, 0xBA28, 0xBA29, 0xBA2A, 0xBA2B, 0xBA2C,
- 0xBA2D, 0xBA2E, 0xBA2F, 0xBA30, 0xBA31, 0xBA32, 0xBA33, 0xBA34,
- 0xBA35, 0xBA36, 0xBA37, 0xBA3A, 0xBA3B, 0xBA3D, 0xBA3E, 0xBA3F,
- 0xBA41, 0xBA43, 0xBA44, 0xBA45, 0xBA46, 0xBA47, 0xBA4A, 0xBA4C,
- 0xBA4F, 0xBA50, 0xBA51, 0xBA52, 0xBA56, 0xBA57, 0xBA59, 0xBA5A,
- 0xBA5B, 0xBA5D, 0xBA5E, 0xBA5F, 0xBA60, 0xBA61, 0xBA62, 0xBA63,
- 0xBA66, 0xBA6A, 0xBA6B, 0xBA6C, 0xBA6D, 0xBA6E, 0xBA6F, 0xBA72,
- 0xBA73, 0xBA75, 0xBA76, 0xBA77, 0xBA79, 0xBA7A, 0xBA7B, 0xBA7C,
- 0xBA7D, 0xBA7E, 0xBA7F, 0xBA80, 0xBA81, 0xBA82, 0xBA86, 0xBA88,
- 0xBA89, 0xBA8A, 0xBA8B, 0xBA8D, 0xBA8E, 0xBA8F, 0xBA90, 0xBA91,
- 0xBA92, 0xBA93, 0xBA94, 0xBA95, 0xBA96, 0xBA97, 0xBA98, 0xBA99,
- 0xBA9A, 0xBA9B, 0xBA9C, 0xBA9D, 0xBA9E, 0xBA9F, 0xBAA0, 0xBAA1,
- 0xBAA2, 0xBAA3, 0xBAA4, 0xBAA5, 0xBAA6, 0xBAA7, 0xBAAA, 0xBAAD,
- 0xBAAE, 0xBAAF, 0xBAB1, 0xBAB3, 0xBAB4, 0xBAB5, 0xBAB6, 0xBAB7,
- 0xBABA, 0xBABC, 0xBABE, 0xBABF, 0xBAC0, 0xBAC1, 0xBAC2, 0xBAC3,
- 0xBAC5, 0xBAC6, 0xBAC7, 0xBAC9, 0xBACA, 0xBACB, 0xBACC, 0xBACD,
- 0xBACE, 0xBACF, 0xBAD0, 0xBAD1, 0xBAD2, 0xBAD3, 0xBAD4, 0xBAD5,
- 0xBAD6, 0xBAD7, 0xBADA, 0xBADB, 0xBADC, 0xBADD, 0xBADE, 0xBADF,
- 0xBAE0, 0xBAE1, 0xBAE2, 0xBAE3, 0xBAE4, 0xBAE5, 0xBAE6, 0xBAE7,
- 0xBAE8, 0xBAE9, 0xBAEA, 0xBAEB, 0xBAEC, 0xBAED, 0xBAEE, 0xBAEF,
- 0xBAF0, 0xBAF1, 0xBAF2, 0xBAF3, 0xBAF4, 0xBAF5, 0xBAF6, 0xBAF7,
- 0xBAF8, 0xBAF9, 0xBAFA, 0xBAFB, 0xBAFD, 0xBAFE, 0xBAFF, 0xBB01,
- 0xBB02, 0xBB03, 0xBB05, 0xBB06, 0xBB07, 0xBB08, 0xBB09, 0xBB0A,
- 0xBB0B, 0xBB0C, 0xBB0E, 0xBB10, 0xBB12, 0xBB13, 0xBB14, 0xBB15,
- 0xBB16, 0xBB17, 0xBB19, 0xBB1A, 0xBB1B, 0xBB1D, 0xBB1E, 0xBB1F,
- 0xBB21, 0xBB22, 0xBB23, 0xBB24, 0xBB25, 0xBB26, 0xBB27, 0xBB28,
- 0xBB2A, 0xBB2C, 0xBB2D, 0xBB2E, 0xBB2F, 0xBB30, 0xBB31, 0xBB32,
- 0xBB33, 0xBB37, 0xBB39, 0xBB3A, 0xBB3F, 0xBB40, 0xBB41, 0xBB42,
- 0xBB43, 0xBB46, 0xBB48, 0xBB4A, 0xBB4B, 0xBB4C, 0xBB4E, 0xBB51,
- 0xBB52, 0xBB53, 0xBB55, 0xBB56, 0xBB57, 0xBB59, 0xBB5A, 0xBB5B,
- 0xBB5C, 0xBB5D, 0xBB5E, 0xBB5F, 0xBB60, 0xBB62, 0xBB64, 0xBB65,
- 0xBB66, 0xBB67, 0xBB68, 0xBB69, 0xBB6A, 0xBB6B, 0xBB6D, 0xBB6E,
- 0xBB6F, 0xBB70, 0xBB71, 0xBB72, 0xBB73, 0xBB74, 0xBB75, 0xBB76,
- 0xBB77, 0xBB78, 0xBB79, 0xBB7A, 0xBB7B, 0xBB7C, 0xBB7D, 0xBB7E,
- 0xBB7F, 0xBB80, 0xBB81, 0xBB82, 0xBB83, 0xBB84, 0xBB85, 0xBB86,
- 0xBB87, 0xBB89, 0xBB8A, 0xBB8B, 0xBB8D, 0xBB8E, 0xBB8F, 0xBB91,
- 0xBB92, 0xBB93, 0xBB94, 0xBB95, 0xBB96, 0xBB97, 0xBB98, 0xBB99,
- 0xBB9A, 0xBB9B, 0xBB9C, 0xBB9D, 0xBB9E, 0xBB9F, 0xBBA0, 0xBBA1,
- 0xBBA2, 0xBBA3, 0xBBA5, 0xBBA6, 0xBBA7, 0xBBA9, 0xBBAA, 0xBBAB,
- 0xBBAD, 0xBBAE, 0xBBAF, 0xBBB0, 0xBBB1, 0xBBB2, 0xBBB3, 0xBBB5,
- 0xBBB6, 0xBBB8, 0xBBB9, 0xBBBA, 0xBBBB, 0xBBBC, 0xBBBD, 0xBBBE,
- 0xBBBF, 0xBBC1, 0xBBC2, 0xBBC3, 0xBBC5, 0xBBC6, 0xBBC7, 0xBBC9,
- 0xBBCA, 0xBBCB, 0xBBCC, 0xBBCD, 0xBBCE, 0xBBCF, 0xBBD1, 0xBBD2,
- 0xBBD4, 0xBBD5, 0xBBD6, 0xBBD7, 0xBBD8, 0xBBD9, 0xBBDA, 0xBBDB,
- 0xBBDC, 0xBBDD, 0xBBDE, 0xBBDF, 0xBBE0, 0xBBE1, 0xBBE2, 0xBBE3,
- 0xBBE4, 0xBBE5, 0xBBE6, 0xBBE7, 0xBBE8, 0xBBE9, 0xBBEA, 0xBBEB,
- 0xBBEC, 0xBBED, 0xBBEE, 0xBBEF, 0xBBF0, 0xBBF1, 0xBBF2, 0xBBF3,
- 0xBBF4, 0xBBF5, 0xBBF6, 0xBBF7, 0xBBFA, 0xBBFB, 0xBBFD, 0xBBFE,
- 0xBC01, 0xBC03, 0xBC04, 0xBC05, 0xBC06, 0xBC07, 0xBC0A, 0xBC0E,
- 0xBC10, 0xBC12, 0xBC13, 0xBC19, 0xBC1A, 0xBC20, 0xBC21, 0xBC22,
- 0xBC23, 0xBC26, 0xBC28, 0xBC2A, 0xBC2B, 0xBC2C, 0xBC2E, 0xBC2F,
- 0xBC32, 0xBC33, 0xBC35, 0xBC36, 0xBC37, 0xBC39, 0xBC3A, 0xBC3B,
- 0xBC3C, 0xBC3D, 0xBC3E, 0xBC3F, 0xBC42, 0xBC46, 0xBC47, 0xBC48,
- 0xBC4A, 0xBC4B, 0xBC4E, 0xBC4F, 0xBC51, 0xBC52, 0xBC53, 0xBC54,
- 0xBC55, 0xBC56, 0xBC57, 0xBC58, 0xBC59, 0xBC5A, 0xBC5B, 0xBC5C,
- 0xBC5E, 0xBC5F, 0xBC60, 0xBC61, 0xBC62, 0xBC63, 0xBC64, 0xBC65,
- 0xBC66, 0xBC67, 0xBC68, 0xBC69, 0xBC6A, 0xBC6B, 0xBC6C, 0xBC6D,
- 0xBC6E, 0xBC6F, 0xBC70, 0xBC71, 0xBC72, 0xBC73, 0xBC74, 0xBC75,
- 0xBC76, 0xBC77, 0xBC78, 0xBC79, 0xBC7A, 0xBC7B, 0xBC7C, 0xBC7D,
- 0xBC7E, 0xBC7F, 0xBC80, 0xBC81, 0xBC82, 0xBC83, 0xBC86, 0xBC87,
- 0xBC89, 0xBC8A, 0xBC8D, 0xBC8F, 0xBC90, 0xBC91, 0xBC92, 0xBC93,
- 0xBC96, 0xBC98, 0xBC9B, 0xBC9C, 0xBC9D, 0xBC9E, 0xBC9F, 0xBCA2,
- 0xBCA3, 0xBCA5, 0xBCA6, 0xBCA9, 0xBCAA, 0xBCAB, 0xBCAC, 0xBCAD,
- 0xBCAE, 0xBCAF, 0xBCB2, 0xBCB6, 0xBCB7, 0xBCB8, 0xBCB9, 0xBCBA,
- 0xBCBB, 0xBCBE, 0xBCBF, 0xBCC1, 0xBCC2, 0xBCC3, 0xBCC5, 0xBCC6,
- 0xBCC7, 0xBCC8, 0xBCC9, 0xBCCA, 0xBCCB, 0xBCCC, 0xBCCE, 0xBCD2,
- 0xBCD3, 0xBCD4, 0xBCD6, 0xBCD7, 0xBCD9, 0xBCDA, 0xBCDB, 0xBCDD,
- 0xBCDE, 0xBCDF, 0xBCE0, 0xBCE1, 0xBCE2, 0xBCE3, 0xBCE4, 0xBCE5,
- 0xBCE6, 0xBCE7, 0xBCE8, 0xBCE9, 0xBCEA, 0xBCEB, 0xBCEC, 0xBCED,
- 0xBCEE, 0xBCEF, 0xBCF0, 0xBCF1, 0xBCF2, 0xBCF3, 0xBCF7, 0xBCF9,
- 0xBCFA, 0xBCFB, 0xBCFD, 0xBCFE, 0xBCFF, 0xBD00, 0xBD01, 0xBD02,
- 0xBD03, 0xBD06, 0xBD08, 0xBD0A, 0xBD0B, 0xBD0C, 0xBD0D, 0xBD0E,
- 0xBD0F, 0xBD11, 0xBD12, 0xBD13, 0xBD15, 0xBD16, 0xBD17, 0xBD18,
- 0xBD19, 0xBD1A, 0xBD1B, 0xBD1C, 0xBD1D, 0xBD1E, 0xBD1F, 0xBD20,
- 0xBD21, 0xBD22, 0xBD23, 0xBD25, 0xBD26, 0xBD27, 0xBD28, 0xBD29,
- 0xBD2A, 0xBD2B, 0xBD2D, 0xBD2E, 0xBD2F, 0xBD30, 0xBD31, 0xBD32,
- 0xBD33, 0xBD34, 0xBD35, 0xBD36, 0xBD37, 0xBD38, 0xBD39, 0xBD3A,
- 0xBD3B, 0xBD3C, 0xBD3D, 0xBD3E, 0xBD3F, 0xBD41, 0xBD42, 0xBD43,
- 0xBD44, 0xBD45, 0xBD46, 0xBD47, 0xBD4A, 0xBD4B, 0xBD4D, 0xBD4E,
- 0xBD4F, 0xBD51, 0xBD52, 0xBD53, 0xBD54, 0xBD55, 0xBD56, 0xBD57,
- 0xBD5A, 0xBD5B, 0xBD5C, 0xBD5D, 0xBD5E, 0xBD5F, 0xBD60, 0xBD61,
- 0xBD62, 0xBD63, 0xBD65, 0xBD66, 0xBD67, 0xBD69, 0xBD6A, 0xBD6B,
- 0xBD6C, 0xBD6D, 0xBD6E, 0xBD6F, 0xBD70, 0xBD71, 0xBD72, 0xBD73,
- 0xBD74, 0xBD75, 0xBD76, 0xBD77, 0xBD78, 0xBD79, 0xBD7A, 0xBD7B,
- 0xBD7C, 0xBD7D, 0xBD7E, 0xBD7F, 0xBD82, 0xBD83, 0xBD85, 0xBD86,
- 0xBD8B, 0xBD8C, 0xBD8D, 0xBD8E, 0xBD8F, 0xBD92, 0xBD94, 0xBD96,
- 0xBD97, 0xBD98, 0xBD9B, 0xBD9D, 0xBD9E, 0xBD9F, 0xBDA0, 0xBDA1,
- 0xBDA2, 0xBDA3, 0xBDA5, 0xBDA6, 0xBDA7, 0xBDA8, 0xBDA9, 0xBDAA,
- 0xBDAB, 0xBDAC, 0xBDAD, 0xBDAE, 0xBDAF, 0xBDB1, 0xBDB2, 0xBDB3,
- 0xBDB4, 0xBDB5, 0xBDB6, 0xBDB7, 0xBDB9, 0xBDBA, 0xBDBB, 0xBDBC,
- 0xBDBD, 0xBDBE, 0xBDBF, 0xBDC0, 0xBDC1, 0xBDC2, 0xBDC3, 0xBDC4,
- 0xBDC5, 0xBDC6, 0xBDC7, 0xBDC8, 0xBDC9, 0xBDCA, 0xBDCB, 0xBDCC,
- 0xBDCD, 0xBDCE, 0xBDCF, 0xBDD0, 0xBDD1, 0xBDD2, 0xBDD3, 0xBDD6,
- 0xBDD7, 0xBDD9, 0xBDDA, 0xBDDB, 0xBDDD, 0xBDDE, 0xBDDF, 0xBDE0,
- 0xBDE1, 0xBDE2, 0xBDE3, 0xBDE4, 0xBDE5, 0xBDE6, 0xBDE7, 0xBDE8,
- 0xBDEA, 0xBDEB, 0xBDEC, 0xBDED, 0xBDEE, 0xBDEF, 0xBDF1, 0xBDF2,
- 0xBDF3, 0xBDF5, 0xBDF6, 0xBDF7, 0xBDF9, 0xBDFA, 0xBDFB, 0xBDFC,
- 0xBDFD, 0xBDFE, 0xBDFF, 0xBE01, 0xBE02, 0xBE04, 0xBE06, 0xBE07,
- 0xBE08, 0xBE09, 0xBE0A, 0xBE0B, 0xBE0E, 0xBE0F, 0xBE11, 0xBE12,
- 0xBE13, 0xBE15, 0xBE16, 0xBE17, 0xBE18, 0xBE19, 0xBE1A, 0xBE1B,
- 0xBE1E, 0xBE20, 0xBE21, 0xBE22, 0xBE23, 0xBE24, 0xBE25, 0xBE26,
- 0xBE27, 0xBE28, 0xBE29, 0xBE2A, 0xBE2B, 0xBE2C, 0xBE2D, 0xBE2E,
- 0xBE2F, 0xBE30, 0xBE31, 0xBE32, 0xBE33, 0xBE34, 0xBE35, 0xBE36,
- 0xBE37, 0xBE38, 0xBE39, 0xBE3A, 0xBE3B, 0xBE3C, 0xBE3D, 0xBE3E,
- 0xBE3F, 0xBE40, 0xBE41, 0xBE42, 0xBE43, 0xBE46, 0xBE47, 0xBE49,
- 0xBE4A, 0xBE4B, 0xBE4D, 0xBE4F, 0xBE50, 0xBE51, 0xBE52, 0xBE53,
- 0xBE56, 0xBE58, 0xBE5C, 0xBE5D, 0xBE5E, 0xBE5F, 0xBE62, 0xBE63,
- 0xBE65, 0xBE66, 0xBE67, 0xBE69, 0xBE6B, 0xBE6C, 0xBE6D, 0xBE6E,
- 0xBE6F, 0xBE72, 0xBE76, 0xBE77, 0xBE78, 0xBE79, 0xBE7A, 0xBE7E,
- 0xBE7F, 0xBE81, 0xBE82, 0xBE83, 0xBE85, 0xBE86, 0xBE87, 0xBE88,
- 0xBE89, 0xBE8A, 0xBE8B, 0xBE8E, 0xBE92, 0xBE93, 0xBE94, 0xBE95,
- 0xBE96, 0xBE97, 0xBE9A, 0xBE9B, 0xBE9C, 0xBE9D, 0xBE9E, 0xBE9F,
- 0xBEA0, 0xBEA1, 0xBEA2, 0xBEA3, 0xBEA4, 0xBEA5, 0xBEA6, 0xBEA7,
- 0xBEA9, 0xBEAA, 0xBEAB, 0xBEAC, 0xBEAD, 0xBEAE, 0xBEAF, 0xBEB0,
- 0xBEB1, 0xBEB2, 0xBEB3, 0xBEB4, 0xBEB5, 0xBEB6, 0xBEB7, 0xBEB8,
- 0xBEB9, 0xBEBA, 0xBEBB, 0xBEBC, 0xBEBD, 0xBEBE, 0xBEBF, 0xBEC0,
- 0xBEC1, 0xBEC2, 0xBEC3, 0xBEC4, 0xBEC5, 0xBEC6, 0xBEC7, 0xBEC8,
- 0xBEC9, 0xBECA, 0xBECB, 0xBECC, 0xBECD, 0xBECE, 0xBECF, 0xBED2,
- 0xBED3, 0xBED5, 0xBED6, 0xBED9, 0xBEDA, 0xBEDB, 0xBEDC, 0xBEDD,
- 0xBEDE, 0xBEDF, 0xBEE1, 0xBEE2, 0xBEE6, 0xBEE7, 0xBEE8, 0xBEE9,
- 0xBEEA, 0xBEEB, 0xBEED, 0xBEEE, 0xBEEF, 0xBEF0, 0xBEF1, 0xBEF2,
- 0xBEF3, 0xBEF4, 0xBEF5, 0xBEF6, 0xBEF7, 0xBEF8, 0xBEF9, 0xBEFA,
- 0xBEFB, 0xBEFC, 0xBEFD, 0xBEFE, 0xBEFF, 0xBF00, 0xBF02, 0xBF03,
- 0xBF04, 0xBF05, 0xBF06, 0xBF07, 0xBF0A, 0xBF0B, 0xBF0C, 0xBF0D,
- 0xBF0E, 0xBF0F, 0xBF10, 0xBF11, 0xBF12, 0xBF13, 0xBF14, 0xBF15,
- 0xBF16, 0xBF17, 0xBF1A, 0xBF1E, 0xBF1F, 0xBF20, 0xBF21, 0xBF22,
- 0xBF23, 0xBF24, 0xBF25, 0xBF26, 0xBF27, 0xBF28, 0xBF29, 0xBF2A,
- 0xBF2B, 0xBF2C, 0xBF2D, 0xBF2E, 0xBF2F, 0xBF30, 0xBF31, 0xBF32,
- 0xBF33, 0xBF34, 0xBF35, 0xBF36, 0xBF37, 0xBF38, 0xBF39, 0xBF3A,
- 0xBF3B, 0xBF3C, 0xBF3D, 0xBF3E, 0xBF3F, 0xBF42, 0xBF43, 0xBF45,
- 0xBF46, 0xBF47, 0xBF49, 0xBF4A, 0xBF4B, 0xBF4C, 0xBF4D, 0xBF4E,
- 0xBF4F, 0xBF52, 0xBF53, 0xBF54, 0xBF56, 0xBF57, 0xBF58, 0xBF59,
- 0xBF5A, 0xBF5B, 0xBF5C, 0xBF5D, 0xBF5E, 0xBF5F, 0xBF60, 0xBF61,
- 0xBF62, 0xBF63, 0xBF64, 0xBF65, 0xBF66, 0xBF67, 0xBF68, 0xBF69,
- 0xBF6A, 0xBF6B, 0xBF6C, 0xBF6D, 0xBF6E, 0xBF6F, 0xBF70, 0xBF71,
- 0xBF72, 0xBF73, 0xBF74, 0xBF75, 0xBF76, 0xBF77, 0xBF78, 0xBF79,
- 0xBF7A, 0xBF7B, 0xBF7C, 0xBF7D, 0xBF7E, 0xBF7F, 0xBF80, 0xBF81,
- 0xBF82, 0xBF83, 0xBF84, 0xBF85, 0xBF86, 0xBF87, 0xBF88, 0xBF89,
- 0xBF8A, 0xBF8B, 0xBF8C, 0xBF8D, 0xBF8E, 0xBF8F, 0xBF90, 0xBF91,
- 0xBF92, 0xBF93, 0xBF95, 0xBF96, 0xBF97, 0xBF98, 0xBF99, 0xBF9A,
- 0xBF9B, 0xBF9C, 0xBF9D, 0xBF9E, 0xBF9F, 0xBFA0, 0xBFA1, 0xBFA2,
- 0xBFA3, 0xBFA4, 0xBFA5, 0xBFA6, 0xBFA7, 0xBFA8, 0xBFA9, 0xBFAA,
- 0xBFAB, 0xBFAC, 0xBFAD, 0xBFAE, 0xBFAF, 0xBFB1, 0xBFB2, 0xBFB3,
- 0xBFB4, 0xBFB5, 0xBFB6, 0xBFB7, 0xBFB8, 0xBFB9, 0xBFBA, 0xBFBB,
- 0xBFBC, 0xBFBD, 0xBFBE, 0xBFBF, 0xBFC0, 0xBFC1, 0xBFC2, 0xBFC3,
- 0xBFC4, 0xBFC6, 0xBFC7, 0xBFC8, 0xBFC9, 0xBFCA, 0xBFCB, 0xBFCE,
- 0xBFCF, 0xBFD1, 0xBFD2, 0xBFD3, 0xBFD5, 0xBFD6, 0xBFD7, 0xBFD8,
- 0xBFD9, 0xBFDA, 0xBFDB, 0xBFDD, 0xBFDE, 0xBFE0, 0xBFE2, 0xBFE3,
- 0xBFE4, 0xBFE5, 0xBFE6, 0xBFE7, 0xBFE8, 0xBFE9, 0xBFEA, 0xBFEB,
- 0xBFEC, 0xBFED, 0xBFEE, 0xBFEF, 0xBFF0, 0xBFF1, 0xBFF2, 0xBFF3,
- 0xBFF4, 0xBFF5, 0xBFF6, 0xBFF7, 0xBFF8, 0xBFF9, 0xBFFA, 0xBFFB,
- 0xBFFC, 0xBFFD, 0xBFFE, 0xBFFF, 0xC000, 0xC001, 0xC002, 0xC003,
- 0xC004, 0xC005, 0xC006, 0xC007, 0xC008, 0xC009, 0xC00A, 0xC00B,
- 0xC00C, 0xC00D, 0xC00E, 0xC00F, 0xC010, 0xC011, 0xC012, 0xC013,
- 0xC014, 0xC015, 0xC016, 0xC017, 0xC018, 0xC019, 0xC01A, 0xC01B,
- 0xC01C, 0xC01D, 0xC01E, 0xC01F, 0xC020, 0xC021, 0xC022, 0xC023,
- 0xC024, 0xC025, 0xC026, 0xC027, 0xC028, 0xC029, 0xC02A, 0xC02B,
- 0xC02C, 0xC02D, 0xC02E, 0xC02F, 0xC030, 0xC031, 0xC032, 0xC033,
- 0xC034, 0xC035, 0xC036, 0xC037, 0xC038, 0xC039, 0xC03A, 0xC03B,
- 0xC03D, 0xC03E, 0xC03F, 0xC040, 0xC041, 0xC042, 0xC043, 0xC044,
- 0xC045, 0xC046, 0xC047, 0xC048, 0xC049, 0xC04A, 0xC04B, 0xC04C,
- 0xC04D, 0xC04E, 0xC04F, 0xC050, 0xC052, 0xC053, 0xC054, 0xC055,
- 0xC056, 0xC057, 0xC059, 0xC05A, 0xC05B, 0xC05D, 0xC05E, 0xC05F,
- 0xC061, 0xC062, 0xC063, 0xC064, 0xC065, 0xC066, 0xC067, 0xC06A,
- 0xC06B, 0xC06C, 0xC06D, 0xC06E, 0xC06F, 0xC070, 0xC071, 0xC072,
- 0xC073, 0xC074, 0xC075, 0xC076, 0xC077, 0xC078, 0xC079, 0xC07A,
- 0xC07B, 0xC07C, 0xC07D, 0xC07E, 0xC07F, 0xC080, 0xC081, 0xC082,
- 0xC083, 0xC084, 0xC085, 0xC086, 0xC087, 0xC088, 0xC089, 0xC08A,
- 0xC08B, 0xC08C, 0xC08D, 0xC08E, 0xC08F, 0xC092, 0xC093, 0xC095,
- 0xC096, 0xC097, 0xC099, 0xC09A, 0xC09B, 0xC09C, 0xC09D, 0xC09E,
- 0xC09F, 0xC0A2, 0xC0A4, 0xC0A6, 0xC0A7, 0xC0A8, 0xC0A9, 0xC0AA,
- 0xC0AB, 0xC0AE, 0xC0B1, 0xC0B2, 0xC0B7, 0xC0B8, 0xC0B9, 0xC0BA,
- 0xC0BB, 0xC0BE, 0xC0C2, 0xC0C3, 0xC0C4, 0xC0C6, 0xC0C7, 0xC0CA,
- 0xC0CB, 0xC0CD, 0xC0CE, 0xC0CF, 0xC0D1, 0xC0D2, 0xC0D3, 0xC0D4,
- 0xC0D5, 0xC0D6, 0xC0D7, 0xC0DA, 0xC0DE, 0xC0DF, 0xC0E0, 0xC0E1,
- 0xC0E2, 0xC0E3, 0xC0E6, 0xC0E7, 0xC0E9, 0xC0EA, 0xC0EB, 0xC0ED,
- 0xC0EE, 0xC0EF, 0xC0F0, 0xC0F1, 0xC0F2, 0xC0F3, 0xC0F6, 0xC0F8,
- 0xC0FA, 0xC0FB, 0xC0FC, 0xC0FD, 0xC0FE, 0xC0FF, 0xC101, 0xC102,
- 0xC103, 0xC105, 0xC106, 0xC107, 0xC109, 0xC10A, 0xC10B, 0xC10C,
- 0xC10D, 0xC10E, 0xC10F, 0xC111, 0xC112, 0xC113, 0xC114, 0xC116,
- 0xC117, 0xC118, 0xC119, 0xC11A, 0xC11B, 0xC121, 0xC122, 0xC125,
- 0xC128, 0xC129, 0xC12A, 0xC12B, 0xC12E, 0xC132, 0xC133, 0xC134,
- 0xC135, 0xC137, 0xC13A, 0xC13B, 0xC13D, 0xC13E, 0xC13F, 0xC141,
- 0xC142, 0xC143, 0xC144, 0xC145, 0xC146, 0xC147, 0xC14A, 0xC14E,
- 0xC14F, 0xC150, 0xC151, 0xC152, 0xC153, 0xC156, 0xC157, 0xC159,
- 0xC15A, 0xC15B, 0xC15D, 0xC15E, 0xC15F, 0xC160, 0xC161, 0xC162,
- 0xC163, 0xC166, 0xC16A, 0xC16B, 0xC16C, 0xC16D, 0xC16E, 0xC16F,
- 0xC171, 0xC172, 0xC173, 0xC175, 0xC176, 0xC177, 0xC179, 0xC17A,
- 0xC17B, 0xC17C, 0xC17D, 0xC17E, 0xC17F, 0xC180, 0xC181, 0xC182,
- 0xC183, 0xC184, 0xC186, 0xC187, 0xC188, 0xC189, 0xC18A, 0xC18B,
- 0xC18F, 0xC191, 0xC192, 0xC193, 0xC195, 0xC197, 0xC198, 0xC199,
- 0xC19A, 0xC19B, 0xC19E, 0xC1A0, 0xC1A2, 0xC1A3, 0xC1A4, 0xC1A6,
- 0xC1A7, 0xC1AA, 0xC1AB, 0xC1AD, 0xC1AE, 0xC1AF, 0xC1B1, 0xC1B2,
- 0xC1B3, 0xC1B4, 0xC1B5, 0xC1B6, 0xC1B7, 0xC1B8, 0xC1B9, 0xC1BA,
- 0xC1BB, 0xC1BC, 0xC1BE, 0xC1BF, 0xC1C0, 0xC1C1, 0xC1C2, 0xC1C3,
- 0xC1C5, 0xC1C6, 0xC1C7, 0xC1C9, 0xC1CA, 0xC1CB, 0xC1CD, 0xC1CE,
- 0xC1CF, 0xC1D0, 0xC1D1, 0xC1D2, 0xC1D3, 0xC1D5, 0xC1D6, 0xC1D9,
- 0xC1DA, 0xC1DB, 0xC1DC, 0xC1DD, 0xC1DE, 0xC1DF, 0xC1E1, 0xC1E2,
- 0xC1E3, 0xC1E5, 0xC1E6, 0xC1E7, 0xC1E9, 0xC1EA, 0xC1EB, 0xC1EC,
- 0xC1ED, 0xC1EE, 0xC1EF, 0xC1F2, 0xC1F4, 0xC1F5, 0xC1F6, 0xC1F7,
- 0xC1F8, 0xC1F9, 0xC1FA, 0xC1FB, 0xC1FE, 0xC1FF, 0xC201, 0xC202,
- 0xC203, 0xC205, 0xC206, 0xC207, 0xC208, 0xC209, 0xC20A, 0xC20B,
- 0xC20E, 0xC210, 0xC212, 0xC213, 0xC214, 0xC215, 0xC216, 0xC217,
- 0xC21A, 0xC21B, 0xC21D, 0xC21E, 0xC221, 0xC222, 0xC223, 0xC224,
- 0xC225, 0xC226, 0xC227, 0xC22A, 0xC22C, 0xC22E, 0xC230, 0xC233,
- 0xC235, 0xC236, 0xC237, 0xC238, 0xC239, 0xC23A, 0xC23B, 0xC23C,
- 0xC23D, 0xC23E, 0xC23F, 0xC240, 0xC241, 0xC242, 0xC243, 0xC244,
- 0xC245, 0xC246, 0xC247, 0xC249, 0xC24A, 0xC24B, 0xC24C, 0xC24D,
- 0xC24E, 0xC24F, 0xC252, 0xC253, 0xC255, 0xC256, 0xC257, 0xC259,
- 0xC25A, 0xC25B, 0xC25C, 0xC25D, 0xC25E, 0xC25F, 0xC261, 0xC262,
- 0xC263, 0xC264, 0xC266, 0xC267, 0xC268, 0xC269, 0xC26A, 0xC26B,
- 0xC26E, 0xC26F, 0xC271, 0xC272, 0xC273, 0xC275, 0xC276, 0xC277,
- 0xC278, 0xC279, 0xC27A, 0xC27B, 0xC27E, 0xC280, 0xC282, 0xC283,
- 0xC284, 0xC285, 0xC286, 0xC287, 0xC28A, 0xC28B, 0xC28C, 0xC28D,
- 0xC28E, 0xC28F, 0xC291, 0xC292, 0xC293, 0xC294, 0xC295, 0xC296,
- 0xC297, 0xC299, 0xC29A, 0xC29C, 0xC29E, 0xC29F, 0xC2A0, 0xC2A1,
- 0xC2A2, 0xC2A3, 0xC2A6, 0xC2A7, 0xC2A9, 0xC2AA, 0xC2AB, 0xC2AE,
- 0xC2AF, 0xC2B0, 0xC2B1, 0xC2B2, 0xC2B3, 0xC2B6, 0xC2B8, 0xC2BA,
- 0xC2BB, 0xC2BC, 0xC2BD, 0xC2BE, 0xC2BF, 0xC2C0, 0xC2C1, 0xC2C2,
- 0xC2C3, 0xC2C4, 0xC2C5, 0xC2C6, 0xC2C7, 0xC2C8, 0xC2C9, 0xC2CA,
- 0xC2CB, 0xC2CC, 0xC2CD, 0xC2CE, 0xC2CF, 0xC2D0, 0xC2D1, 0xC2D2,
- 0xC2D3, 0xC2D4, 0xC2D5, 0xC2D6, 0xC2D7, 0xC2D8, 0xC2D9, 0xC2DA,
- 0xC2DB, 0xC2DE, 0xC2DF, 0xC2E1, 0xC2E2, 0xC2E5, 0xC2E6, 0xC2E7,
- 0xC2E8, 0xC2E9, 0xC2EA, 0xC2EE, 0xC2F0, 0xC2F2, 0xC2F3, 0xC2F4,
- 0xC2F5, 0xC2F7, 0xC2FA, 0xC2FD, 0xC2FE, 0xC2FF, 0xC301, 0xC302,
- 0xC303, 0xC304, 0xC305, 0xC306, 0xC307, 0xC30A, 0xC30B, 0xC30E,
- 0xC30F, 0xC310, 0xC311, 0xC312, 0xC316, 0xC317, 0xC319, 0xC31A,
- 0xC31B, 0xC31D, 0xC31E, 0xC31F, 0xC320, 0xC321, 0xC322, 0xC323,
- 0xC326, 0xC327, 0xC32A, 0xC32B, 0xC32C, 0xC32D, 0xC32E, 0xC32F,
- 0xC330, 0xC331, 0xC332, 0xC333, 0xC334, 0xC335, 0xC336, 0xC337,
- 0xC338, 0xC339, 0xC33A, 0xC33B, 0xC33C, 0xC33D, 0xC33E, 0xC33F,
- 0xC340, 0xC341, 0xC342, 0xC343, 0xC344, 0xC346, 0xC347, 0xC348,
- 0xC349, 0xC34A, 0xC34B, 0xC34C, 0xC34D, 0xC34E, 0xC34F, 0xC350,
- 0xC351, 0xC352, 0xC353, 0xC354, 0xC355, 0xC356, 0xC357, 0xC358,
- 0xC359, 0xC35A, 0xC35B, 0xC35C, 0xC35D, 0xC35E, 0xC35F, 0xC360,
- 0xC361, 0xC362, 0xC363, 0xC364, 0xC365, 0xC366, 0xC367, 0xC36A,
- 0xC36B, 0xC36D, 0xC36E, 0xC36F, 0xC371, 0xC373, 0xC374, 0xC375,
- 0xC376, 0xC377, 0xC37A, 0xC37B, 0xC37E, 0xC37F, 0xC380, 0xC381,
- 0xC382, 0xC383, 0xC385, 0xC386, 0xC387, 0xC389, 0xC38A, 0xC38B,
- 0xC38D, 0xC38E, 0xC38F, 0xC390, 0xC391, 0xC392, 0xC393, 0xC394,
- 0xC395, 0xC396, 0xC397, 0xC398, 0xC399, 0xC39A, 0xC39B, 0xC39C,
- 0xC39D, 0xC39E, 0xC39F, 0xC3A0, 0xC3A1, 0xC3A2, 0xC3A3, 0xC3A4,
- 0xC3A5, 0xC3A6, 0xC3A7, 0xC3A8, 0xC3A9, 0xC3AA, 0xC3AB, 0xC3AC,
- 0xC3AD, 0xC3AE, 0xC3AF, 0xC3B0, 0xC3B1, 0xC3B2, 0xC3B3, 0xC3B4,
- 0xC3B5, 0xC3B6, 0xC3B7, 0xC3B8, 0xC3B9, 0xC3BA, 0xC3BB, 0xC3BC,
- 0xC3BD, 0xC3BE, 0xC3BF, 0xC3C1, 0xC3C2, 0xC3C3, 0xC3C4, 0xC3C5,
- 0xC3C6, 0xC3C7, 0xC3C8, 0xC3C9, 0xC3CA, 0xC3CB, 0xC3CC, 0xC3CD,
- 0xC3CE, 0xC3CF, 0xC3D0, 0xC3D1, 0xC3D2, 0xC3D3, 0xC3D4, 0xC3D5,
- 0xC3D6, 0xC3D7, 0xC3DA, 0xC3DB, 0xC3DD, 0xC3DE, 0xC3E1, 0xC3E3,
- 0xC3E4, 0xC3E5, 0xC3E6, 0xC3E7, 0xC3EA, 0xC3EB, 0xC3EC, 0xC3EE,
- 0xC3EF, 0xC3F0, 0xC3F1, 0xC3F2, 0xC3F3, 0xC3F6, 0xC3F7, 0xC3F9,
- 0xC3FA, 0xC3FB, 0xC3FC, 0xC3FD, 0xC3FE, 0xC3FF, 0xC400, 0xC401,
- 0xC402, 0xC403, 0xC404, 0xC405, 0xC406, 0xC407, 0xC409, 0xC40A,
- 0xC40B, 0xC40C, 0xC40D, 0xC40E, 0xC40F, 0xC411, 0xC412, 0xC413,
- 0xC414, 0xC415, 0xC416, 0xC417, 0xC418, 0xC419, 0xC41A, 0xC41B,
- 0xC41C, 0xC41D, 0xC41E, 0xC41F, 0xC420, 0xC421, 0xC422, 0xC423,
- 0xC425, 0xC426, 0xC427, 0xC428, 0xC429, 0xC42A, 0xC42B, 0xC42D,
- 0xC42E, 0xC42F, 0xC431, 0xC432, 0xC433, 0xC435, 0xC436, 0xC437,
- 0xC438, 0xC439, 0xC43A, 0xC43B, 0xC43E, 0xC43F, 0xC440, 0xC441,
- 0xC442, 0xC443, 0xC444, 0xC445, 0xC446, 0xC447, 0xC449, 0xC44A,
- 0xC44B, 0xC44C, 0xC44D, 0xC44E, 0xC44F, 0xC450, 0xC451, 0xC452,
- 0xC453, 0xC454, 0xC455, 0xC456, 0xC457, 0xC458, 0xC459, 0xC45A,
- 0xC45B, 0xC45C, 0xC45D, 0xC45E, 0xC45F, 0xC460, 0xC461, 0xC462,
- 0xC463, 0xC466, 0xC467, 0xC469, 0xC46A, 0xC46B, 0xC46D, 0xC46E,
- 0xC46F, 0xC470, 0xC471, 0xC472, 0xC473, 0xC476, 0xC477, 0xC478,
- 0xC47A, 0xC47B, 0xC47C, 0xC47D, 0xC47E, 0xC47F, 0xC481, 0xC482,
- 0xC483, 0xC484, 0xC485, 0xC486, 0xC487, 0xC488, 0xC489, 0xC48A,
- 0xC48B, 0xC48C, 0xC48D, 0xC48E, 0xC48F, 0xC490, 0xC491, 0xC492,
- 0xC493, 0xC495, 0xC496, 0xC497, 0xC498, 0xC499, 0xC49A, 0xC49B,
- 0xC49D, 0xC49E, 0xC49F, 0xC4A0, 0xC4A1, 0xC4A2, 0xC4A3, 0xC4A4,
- 0xC4A5, 0xC4A6, 0xC4A7, 0xC4A8, 0xC4A9, 0xC4AA, 0xC4AB, 0xC4AC,
- 0xC4AD, 0xC4AE, 0xC4AF, 0xC4B0, 0xC4B1, 0xC4B2, 0xC4B3, 0xC4B4,
- 0xC4B5, 0xC4B6, 0xC4B7, 0xC4B9, 0xC4BA, 0xC4BB, 0xC4BD, 0xC4BE,
- 0xC4BF, 0xC4C0, 0xC4C1, 0xC4C2, 0xC4C3, 0xC4C4, 0xC4C5, 0xC4C6,
- 0xC4C7, 0xC4C8, 0xC4C9, 0xC4CA, 0xC4CB, 0xC4CC, 0xC4CD, 0xC4CE,
- 0xC4CF, 0xC4D0, 0xC4D1, 0xC4D2, 0xC4D3, 0xC4D4, 0xC4D5, 0xC4D6,
- 0xC4D7, 0xC4D8, 0xC4D9, 0xC4DA, 0xC4DB, 0xC4DC, 0xC4DD, 0xC4DE,
- 0xC4DF, 0xC4E0, 0xC4E1, 0xC4E2, 0xC4E3, 0xC4E4, 0xC4E5, 0xC4E6,
- 0xC4E7, 0xC4E8, 0xC4EA, 0xC4EB, 0xC4EC, 0xC4ED, 0xC4EE, 0xC4EF,
- 0xC4F2, 0xC4F3, 0xC4F5, 0xC4F6, 0xC4F7, 0xC4F9, 0xC4FB, 0xC4FC,
- 0xC4FD, 0xC4FE, 0xC502, 0xC503, 0xC504, 0xC505, 0xC506, 0xC507,
- 0xC508, 0xC509, 0xC50A, 0xC50B, 0xC50D, 0xC50E, 0xC50F, 0xC511,
- 0xC512, 0xC513, 0xC515, 0xC516, 0xC517, 0xC518, 0xC519, 0xC51A,
- 0xC51B, 0xC51D, 0xC51E, 0xC51F, 0xC520, 0xC521, 0xC522, 0xC523,
- 0xC524, 0xC525, 0xC526, 0xC527, 0xC52A, 0xC52B, 0xC52D, 0xC52E,
- 0xC52F, 0xC531, 0xC532, 0xC533, 0xC534, 0xC535, 0xC536, 0xC537,
- 0xC53A, 0xC53C, 0xC53E, 0xC53F, 0xC540, 0xC541, 0xC542, 0xC543,
- 0xC546, 0xC547, 0xC54B, 0xC54F, 0xC550, 0xC551, 0xC552, 0xC556,
- 0xC55A, 0xC55B, 0xC55C, 0xC55F, 0xC562, 0xC563, 0xC565, 0xC566,
- 0xC567, 0xC569, 0xC56A, 0xC56B, 0xC56C, 0xC56D, 0xC56E, 0xC56F,
- 0xC572, 0xC576, 0xC577, 0xC578, 0xC579, 0xC57A, 0xC57B, 0xC57E,
- 0xC57F, 0xC581, 0xC582, 0xC583, 0xC585, 0xC586, 0xC588, 0xC589,
- 0xC58A, 0xC58B, 0xC58E, 0xC590, 0xC592, 0xC593, 0xC594, 0xC596,
- 0xC599, 0xC59A, 0xC59B, 0xC59D, 0xC59E, 0xC59F, 0xC5A1, 0xC5A2,
- 0xC5A3, 0xC5A4, 0xC5A5, 0xC5A6, 0xC5A7, 0xC5A8, 0xC5AA, 0xC5AB,
- 0xC5AC, 0xC5AD, 0xC5AE, 0xC5AF, 0xC5B0, 0xC5B1, 0xC5B2, 0xC5B3,
- 0xC5B6, 0xC5B7, 0xC5BA, 0xC5BF, 0xC5C0, 0xC5C1, 0xC5C2, 0xC5C3,
- 0xC5CB, 0xC5CD, 0xC5CF, 0xC5D2, 0xC5D3, 0xC5D5, 0xC5D6, 0xC5D7,
- 0xC5D9, 0xC5DA, 0xC5DB, 0xC5DC, 0xC5DD, 0xC5DE, 0xC5DF, 0xC5E2,
- 0xC5E4, 0xC5E6, 0xC5E7, 0xC5E8, 0xC5E9, 0xC5EA, 0xC5EB, 0xC5EF,
- 0xC5F1, 0xC5F2, 0xC5F3, 0xC5F5, 0xC5F8, 0xC5F9, 0xC5FA, 0xC5FB,
- 0xC602, 0xC603, 0xC604, 0xC609, 0xC60A, 0xC60B, 0xC60D, 0xC60E,
- 0xC60F, 0xC611, 0xC612, 0xC613, 0xC614, 0xC615, 0xC616, 0xC617,
- 0xC61A, 0xC61D, 0xC61E, 0xC61F, 0xC620, 0xC621, 0xC622, 0xC623,
- 0xC626, 0xC627, 0xC629, 0xC62A, 0xC62B, 0xC62F, 0xC631, 0xC632,
- 0xC636, 0xC638, 0xC63A, 0xC63C, 0xC63D, 0xC63E, 0xC63F, 0xC642,
- 0xC643, 0xC645, 0xC646, 0xC647, 0xC649, 0xC64A, 0xC64B, 0xC64C,
- 0xC64D, 0xC64E, 0xC64F, 0xC652, 0xC656, 0xC657, 0xC658, 0xC659,
- 0xC65A, 0xC65B, 0xC65E, 0xC65F, 0xC661, 0xC662, 0xC663, 0xC664,
- 0xC665, 0xC666, 0xC667, 0xC668, 0xC669, 0xC66A, 0xC66B, 0xC66D,
- 0xC66E, 0xC670, 0xC672, 0xC673, 0xC674, 0xC675, 0xC676, 0xC677,
- 0xC67A, 0xC67B, 0xC67D, 0xC67E, 0xC67F, 0xC681, 0xC682, 0xC683,
- 0xC684, 0xC685, 0xC686, 0xC687, 0xC68A, 0xC68C, 0xC68E, 0xC68F,
- 0xC690, 0xC691, 0xC692, 0xC693, 0xC696, 0xC697, 0xC699, 0xC69A,
- 0xC69B, 0xC69D, 0xC69E, 0xC69F, 0xC6A0, 0xC6A1, 0xC6A2, 0xC6A3,
- 0xC6A6, 0xC6A8, 0xC6AA, 0xC6AB, 0xC6AC, 0xC6AD, 0xC6AE, 0xC6AF,
- 0xC6B2, 0xC6B3, 0xC6B5, 0xC6B6, 0xC6B7, 0xC6BB, 0xC6BC, 0xC6BD,
- 0xC6BE, 0xC6BF, 0xC6C2, 0xC6C4, 0xC6C6, 0xC6C7, 0xC6C8, 0xC6C9,
- 0xC6CA, 0xC6CB, 0xC6CE, 0xC6CF, 0xC6D1, 0xC6D2, 0xC6D3, 0xC6D5,
- 0xC6D6, 0xC6D7, 0xC6D8, 0xC6D9, 0xC6DA, 0xC6DB, 0xC6DE, 0xC6DF,
- 0xC6E2, 0xC6E3, 0xC6E4, 0xC6E5, 0xC6E6, 0xC6E7, 0xC6EA, 0xC6EB,
- 0xC6ED, 0xC6EE, 0xC6EF, 0xC6F1, 0xC6F2, 0xC6F3, 0xC6F4, 0xC6F5,
- 0xC6F6, 0xC6F7, 0xC6FA, 0xC6FB, 0xC6FC, 0xC6FE, 0xC6FF, 0xC700,
- 0xC701, 0xC702, 0xC703, 0xC706, 0xC707, 0xC709, 0xC70A, 0xC70B,
- 0xC70D, 0xC70E, 0xC70F, 0xC710, 0xC711, 0xC712, 0xC713, 0xC716,
- 0xC718, 0xC71A, 0xC71B, 0xC71C, 0xC71D, 0xC71E, 0xC71F, 0xC722,
- 0xC723, 0xC725, 0xC726, 0xC727, 0xC729, 0xC72A, 0xC72B, 0xC72C,
- 0xC72D, 0xC72E, 0xC72F, 0xC732, 0xC734, 0xC736, 0xC738, 0xC739,
- 0xC73A, 0xC73B, 0xC73E, 0xC73F, 0xC741, 0xC742, 0xC743, 0xC745,
- 0xC746, 0xC747, 0xC748, 0xC749, 0xC74B, 0xC74E, 0xC750, 0xC759,
- 0xC75A, 0xC75B, 0xC75D, 0xC75E, 0xC75F, 0xC761, 0xC762, 0xC763,
- 0xC764, 0xC765, 0xC766, 0xC767, 0xC769, 0xC76A, 0xC76C, 0xC76D,
- 0xC76E, 0xC76F, 0xC770, 0xC771, 0xC772, 0xC773, 0xC776, 0xC777,
- 0xC779, 0xC77A, 0xC77B, 0xC77F, 0xC780, 0xC781, 0xC782, 0xC786,
- 0xC78B, 0xC78C, 0xC78D, 0xC78F, 0xC792, 0xC793, 0xC795, 0xC799,
- 0xC79B, 0xC79C, 0xC79D, 0xC79E, 0xC79F, 0xC7A2, 0xC7A7, 0xC7A8,
- 0xC7A9, 0xC7AA, 0xC7AB, 0xC7AE, 0xC7AF, 0xC7B1, 0xC7B2, 0xC7B3,
- 0xC7B5, 0xC7B6, 0xC7B7, 0xC7B8, 0xC7B9, 0xC7BA, 0xC7BB, 0xC7BE,
- 0xC7C2, 0xC7C3, 0xC7C4, 0xC7C5, 0xC7C6, 0xC7C7, 0xC7CA, 0xC7CB,
- 0xC7CD, 0xC7CF, 0xC7D1, 0xC7D2, 0xC7D3, 0xC7D4, 0xC7D5, 0xC7D6,
- 0xC7D7, 0xC7D9, 0xC7DA, 0xC7DB, 0xC7DC, 0xC7DE, 0xC7DF, 0xC7E0,
- 0xC7E1, 0xC7E2, 0xC7E3, 0xC7E5, 0xC7E6, 0xC7E7, 0xC7E9, 0xC7EA,
- 0xC7EB, 0xC7ED, 0xC7EE, 0xC7EF, 0xC7F0, 0xC7F1, 0xC7F2, 0xC7F3,
- 0xC7F4, 0xC7F5, 0xC7F6, 0xC7F7, 0xC7F8, 0xC7F9, 0xC7FA, 0xC7FB,
- 0xC7FC, 0xC7FD, 0xC7FE, 0xC7FF, 0xC802, 0xC803, 0xC805, 0xC806,
- 0xC807, 0xC809, 0xC80B, 0xC80C, 0xC80D, 0xC80E, 0xC80F, 0xC812,
- 0xC814, 0xC817, 0xC818, 0xC819, 0xC81A, 0xC81B, 0xC81E, 0xC81F,
- 0xC821, 0xC822, 0xC823, 0xC825, 0xC826, 0xC827, 0xC828, 0xC829,
- 0xC82A, 0xC82B, 0xC82E, 0xC830, 0xC832, 0xC833, 0xC834, 0xC835,
- 0xC836, 0xC837, 0xC839, 0xC83A, 0xC83B, 0xC83D, 0xC83E, 0xC83F,
- 0xC841, 0xC842, 0xC843, 0xC844, 0xC845, 0xC846, 0xC847, 0xC84A,
- 0xC84B, 0xC84E, 0xC84F, 0xC850, 0xC851, 0xC852, 0xC853, 0xC855,
- 0xC856, 0xC857, 0xC858, 0xC859, 0xC85A, 0xC85B, 0xC85C, 0xC85D,
- 0xC85E, 0xC85F, 0xC860, 0xC861, 0xC862, 0xC863, 0xC864, 0xC865,
- 0xC866, 0xC867, 0xC868, 0xC869, 0xC86A, 0xC86B, 0xC86C, 0xC86D,
- 0xC86E, 0xC86F, 0xC872, 0xC873, 0xC875, 0xC876, 0xC877, 0xC879,
- 0xC87B, 0xC87C, 0xC87D, 0xC87E, 0xC87F, 0xC882, 0xC884, 0xC888,
- 0xC889, 0xC88A, 0xC88E, 0xC88F, 0xC890, 0xC891, 0xC892, 0xC893,
- 0xC895, 0xC896, 0xC897, 0xC898, 0xC899, 0xC89A, 0xC89B, 0xC89C,
- 0xC89E, 0xC8A0, 0xC8A2, 0xC8A3, 0xC8A4, 0xC8A5, 0xC8A6, 0xC8A7,
- 0xC8A9, 0xC8AA, 0xC8AB, 0xC8AC, 0xC8AD, 0xC8AE, 0xC8AF, 0xC8B0,
- 0xC8B1, 0xC8B2, 0xC8B3, 0xC8B4, 0xC8B5, 0xC8B6, 0xC8B7, 0xC8B8,
- 0xC8B9, 0xC8BA, 0xC8BB, 0xC8BE, 0xC8BF, 0xC8C0, 0xC8C1, 0xC8C2,
- 0xC8C3, 0xC8C5, 0xC8C6, 0xC8C7, 0xC8C9, 0xC8CA, 0xC8CB, 0xC8CD,
- 0xC8CE, 0xC8CF, 0xC8D0, 0xC8D1, 0xC8D2, 0xC8D3, 0xC8D6, 0xC8D8,
- 0xC8DA, 0xC8DB, 0xC8DC, 0xC8DD, 0xC8DE, 0xC8DF, 0xC8E2, 0xC8E3,
- 0xC8E5, 0xC8E6, 0xC8E7, 0xC8E8, 0xC8E9, 0xC8EA, 0xC8EB, 0xC8EC,
- 0xC8ED, 0xC8EE, 0xC8EF, 0xC8F0, 0xC8F1, 0xC8F2, 0xC8F3, 0xC8F4,
- 0xC8F6, 0xC8F7, 0xC8F8, 0xC8F9, 0xC8FA, 0xC8FB, 0xC8FE, 0xC8FF,
- 0xC901, 0xC902, 0xC903, 0xC907, 0xC908, 0xC909, 0xC90A, 0xC90B,
- 0xC90E, 0xC910, 0xC912, 0xC913, 0xC914, 0xC915, 0xC916, 0xC917,
- 0xC919, 0xC91A, 0xC91B, 0xC91C, 0xC91D, 0xC91E, 0xC91F, 0xC920,
- 0xC921, 0xC922, 0xC923, 0xC924, 0xC925, 0xC926, 0xC927, 0xC928,
- 0xC929, 0xC92A, 0xC92B, 0xC92D, 0xC92E, 0xC92F, 0xC930, 0xC931,
- 0xC932, 0xC933, 0xC935, 0xC936, 0xC937, 0xC938, 0xC939, 0xC93A,
- 0xC93B, 0xC93C, 0xC93D, 0xC93E, 0xC93F, 0xC940, 0xC941, 0xC942,
- 0xC943, 0xC944, 0xC945, 0xC946, 0xC947, 0xC948, 0xC949, 0xC94A,
- 0xC94B, 0xC94C, 0xC94D, 0xC94E, 0xC94F, 0xC952, 0xC953, 0xC955,
- 0xC956, 0xC957, 0xC959, 0xC95A, 0xC95B, 0xC95C, 0xC95D, 0xC95E,
- 0xC95F, 0xC962, 0xC964, 0xC965, 0xC966, 0xC967, 0xC968, 0xC969,
- 0xC96A, 0xC96B, 0xC96D, 0xC96E, 0xC96F, 0xC971, 0xC972, 0xC973,
- 0xC975, 0xC976, 0xC977, 0xC978, 0xC979, 0xC97A, 0xC97B, 0xC97D,
- 0xC97E, 0xC97F, 0xC980, 0xC981, 0xC982, 0xC983, 0xC984, 0xC985,
- 0xC986, 0xC987, 0xC98A, 0xC98B, 0xC98D, 0xC98E, 0xC98F, 0xC991,
- 0xC992, 0xC993, 0xC994, 0xC995, 0xC996, 0xC997, 0xC99A, 0xC99C,
- 0xC99E, 0xC99F, 0xC9A0, 0xC9A1, 0xC9A2, 0xC9A3, 0xC9A4, 0xC9A5,
- 0xC9A6, 0xC9A7, 0xC9A8, 0xC9A9, 0xC9AA, 0xC9AB, 0xC9AC, 0xC9AD,
- 0xC9AE, 0xC9AF, 0xC9B0, 0xC9B1, 0xC9B2, 0xC9B3, 0xC9B4, 0xC9B5,
- 0xC9B6, 0xC9B7, 0xC9B8, 0xC9B9, 0xC9BA, 0xC9BB, 0xC9BC, 0xC9BD,
- 0xC9BE, 0xC9BF, 0xC9C2, 0xC9C3, 0xC9C5, 0xC9C6, 0xC9C9, 0xC9CB,
- 0xC9CC, 0xC9CD, 0xC9CE, 0xC9CF, 0xC9D2, 0xC9D4, 0xC9D7, 0xC9D8,
- 0xC9DB, 0xC9DE, 0xC9DF, 0xC9E1, 0xC9E3, 0xC9E5, 0xC9E6, 0xC9E8,
- 0xC9E9, 0xC9EA, 0xC9EB, 0xC9EE, 0xC9F2, 0xC9F3, 0xC9F4, 0xC9F5,
- 0xC9F6, 0xC9F7, 0xC9FA, 0xC9FB, 0xC9FD, 0xC9FE, 0xC9FF, 0xCA01,
- 0xCA02, 0xCA03, 0xCA04, 0xCA05, 0xCA06, 0xCA07, 0xCA0A, 0xCA0E,
- 0xCA0F, 0xCA10, 0xCA11, 0xCA12, 0xCA13, 0xCA15, 0xCA16, 0xCA17,
- 0xCA19, 0xCA1A, 0xCA1B, 0xCA1C, 0xCA1D, 0xCA1E, 0xCA1F, 0xCA20,
- 0xCA21, 0xCA22, 0xCA23, 0xCA24, 0xCA25, 0xCA26, 0xCA27, 0xCA28,
- 0xCA2A, 0xCA2B, 0xCA2C, 0xCA2D, 0xCA2E, 0xCA2F, 0xCA30, 0xCA31,
- 0xCA32, 0xCA33, 0xCA34, 0xCA35, 0xCA36, 0xCA37, 0xCA38, 0xCA39,
- 0xCA3A, 0xCA3B, 0xCA3C, 0xCA3D, 0xCA3E, 0xCA3F, 0xCA40, 0xCA41,
- 0xCA42, 0xCA43, 0xCA44, 0xCA45, 0xCA46, 0xCA47, 0xCA48, 0xCA49,
- 0xCA4A, 0xCA4B, 0xCA4E, 0xCA4F, 0xCA51, 0xCA52, 0xCA53, 0xCA55,
- 0xCA56, 0xCA57, 0xCA58, 0xCA59, 0xCA5A, 0xCA5B, 0xCA5E, 0xCA62,
- 0xCA63, 0xCA64, 0xCA65, 0xCA66, 0xCA67, 0xCA69, 0xCA6A, 0xCA6B,
- 0xCA6C, 0xCA6D, 0xCA6E, 0xCA6F, 0xCA70, 0xCA71, 0xCA72, 0xCA73,
- 0xCA74, 0xCA75, 0xCA76, 0xCA77, 0xCA78, 0xCA79, 0xCA7A, 0xCA7B,
- 0xCA7C, 0xCA7E, 0xCA7F, 0xCA80, 0xCA81, 0xCA82, 0xCA83, 0xCA85,
- 0xCA86, 0xCA87, 0xCA88, 0xCA89, 0xCA8A, 0xCA8B, 0xCA8C, 0xCA8D,
- 0xCA8E, 0xCA8F, 0xCA90, 0xCA91, 0xCA92, 0xCA93, 0xCA94, 0xCA95,
- 0xCA96, 0xCA97, 0xCA99, 0xCA9A, 0xCA9B, 0xCA9C, 0xCA9D, 0xCA9E,
- 0xCA9F, 0xCAA0, 0xCAA1, 0xCAA2, 0xCAA3, 0xCAA4, 0xCAA5, 0xCAA6,
- 0xCAA7, 0xCAA8, 0xCAA9, 0xCAAA, 0xCAAB, 0xCAAC, 0xCAAD, 0xCAAE,
- 0xCAAF, 0xCAB0, 0xCAB1, 0xCAB2, 0xCAB3, 0xCAB4, 0xCAB5, 0xCAB6,
- 0xCAB7, 0xCAB8, 0xCAB9, 0xCABA, 0xCABB, 0xCABE, 0xCABF, 0xCAC1,
- 0xCAC2, 0xCAC3, 0xCAC5, 0xCAC6, 0xCAC7, 0xCAC8, 0xCAC9, 0xCACA,
- 0xCACB, 0xCACE, 0xCAD0, 0xCAD2, 0xCAD4, 0xCAD5, 0xCAD6, 0xCAD7,
- 0xCADA, 0xCADB, 0xCADC, 0xCADD, 0xCADE, 0xCADF, 0xCAE1, 0xCAE2,
- 0xCAE3, 0xCAE4, 0xCAE5, 0xCAE6, 0xCAE7, 0xCAE8, 0xCAE9, 0xCAEA,
- 0xCAEB, 0xCAED, 0xCAEE, 0xCAEF, 0xCAF0, 0xCAF1, 0xCAF2, 0xCAF3,
- 0xCAF5, 0xCAF6, 0xCAF7, 0xCAF8, 0xCAF9, 0xCAFA, 0xCAFB, 0xCAFC,
- 0xCAFD, 0xCAFE, 0xCAFF, 0xCB00, 0xCB01, 0xCB02, 0xCB03, 0xCB04,
- 0xCB05, 0xCB06, 0xCB07, 0xCB09, 0xCB0A, 0xCB0B, 0xCB0C, 0xCB0D,
- 0xCB0E, 0xCB0F, 0xCB11, 0xCB12, 0xCB13, 0xCB15, 0xCB16, 0xCB17,
- 0xCB19, 0xCB1A, 0xCB1B, 0xCB1C, 0xCB1D, 0xCB1E, 0xCB1F, 0xCB22,
- 0xCB23, 0xCB24, 0xCB25, 0xCB26, 0xCB27, 0xCB28, 0xCB29, 0xCB2A,
- 0xCB2B, 0xCB2C, 0xCB2D, 0xCB2E, 0xCB2F, 0xCB30, 0xCB31, 0xCB32,
- 0xCB33, 0xCB34, 0xCB35, 0xCB36, 0xCB37, 0xCB38, 0xCB39, 0xCB3A,
- 0xCB3B, 0xCB3C, 0xCB3D, 0xCB3E, 0xCB3F, 0xCB40, 0xCB42, 0xCB43,
- 0xCB44, 0xCB45, 0xCB46, 0xCB47, 0xCB4A, 0xCB4B, 0xCB4D, 0xCB4E,
- 0xCB4F, 0xCB51, 0xCB52, 0xCB53, 0xCB54, 0xCB55, 0xCB56, 0xCB57,
- 0xCB5A, 0xCB5B, 0xCB5C, 0xCB5E, 0xCB5F, 0xCB60, 0xCB61, 0xCB62,
- 0xCB63, 0xCB65, 0xCB66, 0xCB67, 0xCB68, 0xCB69, 0xCB6A, 0xCB6B,
- 0xCB6C, 0xCB6D, 0xCB6E, 0xCB6F, 0xCB70, 0xCB71, 0xCB72, 0xCB73,
- 0xCB74, 0xCB75, 0xCB76, 0xCB77, 0xCB7A, 0xCB7B, 0xCB7C, 0xCB7D,
- 0xCB7E, 0xCB7F, 0xCB80, 0xCB81, 0xCB82, 0xCB83, 0xCB84, 0xCB85,
- 0xCB86, 0xCB87, 0xCB88, 0xCB89, 0xCB8A, 0xCB8B, 0xCB8C, 0xCB8D,
- 0xCB8E, 0xCB8F, 0xCB90, 0xCB91, 0xCB92, 0xCB93, 0xCB94, 0xCB95,
- 0xCB96, 0xCB97, 0xCB98, 0xCB99, 0xCB9A, 0xCB9B, 0xCB9D, 0xCB9E,
- 0xCB9F, 0xCBA0, 0xCBA1, 0xCBA2, 0xCBA3, 0xCBA4, 0xCBA5, 0xCBA6,
- 0xCBA7, 0xCBA8, 0xCBA9, 0xCBAA, 0xCBAB, 0xCBAC, 0xCBAD, 0xCBAE,
- 0xCBAF, 0xCBB0, 0xCBB1, 0xCBB2, 0xCBB3, 0xCBB4, 0xCBB5, 0xCBB6,
- 0xCBB7, 0xCBB9, 0xCBBA, 0xCBBB, 0xCBBC, 0xCBBD, 0xCBBE, 0xCBBF,
- 0xCBC0, 0xCBC1, 0xCBC2, 0xCBC3, 0xCBC4, 0xCBC5, 0xCBC6, 0xCBC7,
- 0xCBC8, 0xCBC9, 0xCBCA, 0xCBCB, 0xCBCC, 0xCBCD, 0xCBCE, 0xCBCF,
- 0xCBD0, 0xCBD1, 0xCBD2, 0xCBD3, 0xCBD5, 0xCBD6, 0xCBD7, 0xCBD8,
- 0xCBD9, 0xCBDA, 0xCBDB, 0xCBDC, 0xCBDD, 0xCBDE, 0xCBDF, 0xCBE0,
- 0xCBE1, 0xCBE2, 0xCBE3, 0xCBE5, 0xCBE6, 0xCBE8, 0xCBEA, 0xCBEB,
- 0xCBEC, 0xCBED, 0xCBEE, 0xCBEF, 0xCBF0, 0xCBF1, 0xCBF2, 0xCBF3,
- 0xCBF4, 0xCBF5, 0xCBF6, 0xCBF7, 0xCBF8, 0xCBF9, 0xCBFA, 0xCBFB,
- 0xCBFC, 0xCBFD, 0xCBFE, 0xCBFF, 0xCC00, 0xCC01, 0xCC02, 0xCC03,
- 0xCC04, 0xCC05, 0xCC06, 0xCC07, 0xCC08, 0xCC09, 0xCC0A, 0xCC0B,
- 0xCC0E, 0xCC0F, 0xCC11, 0xCC12, 0xCC13, 0xCC15, 0xCC16, 0xCC17,
- 0xCC18, 0xCC19, 0xCC1A, 0xCC1B, 0xCC1E, 0xCC1F, 0xCC20, 0xCC23,
- 0xCC24, 0xCC25, 0xCC26, 0xCC2A, 0xCC2B, 0xCC2D, 0xCC2F, 0xCC31,
- 0xCC32, 0xCC33, 0xCC34, 0xCC35, 0xCC36, 0xCC37, 0xCC3A, 0xCC3F,
- 0xCC40, 0xCC41, 0xCC42, 0xCC43, 0xCC46, 0xCC47, 0xCC49, 0xCC4A,
- 0xCC4B, 0xCC4D, 0xCC4E, 0xCC4F, 0xCC50, 0xCC51, 0xCC52, 0xCC53,
- 0xCC56, 0xCC5A, 0xCC5B, 0xCC5C, 0xCC5D, 0xCC5E, 0xCC5F, 0xCC61,
- 0xCC62, 0xCC63, 0xCC65, 0xCC67, 0xCC69, 0xCC6A, 0xCC6B, 0xCC6C,
- 0xCC6D, 0xCC6E, 0xCC6F, 0xCC71, 0xCC72, 0xCC73, 0xCC74, 0xCC76,
- 0xCC77, 0xCC78, 0xCC79, 0xCC7A, 0xCC7B, 0xCC7C, 0xCC7D, 0xCC7E,
- 0xCC7F, 0xCC80, 0xCC81, 0xCC82, 0xCC83, 0xCC84, 0xCC85, 0xCC86,
- 0xCC87, 0xCC88, 0xCC89, 0xCC8A, 0xCC8B, 0xCC8C, 0xCC8D, 0xCC8E,
- 0xCC8F, 0xCC90, 0xCC91, 0xCC92, 0xCC93, 0xCC94, 0xCC95, 0xCC96,
- 0xCC97, 0xCC9A, 0xCC9B, 0xCC9D, 0xCC9E, 0xCC9F, 0xCCA1, 0xCCA2,
- 0xCCA3, 0xCCA4, 0xCCA5, 0xCCA6, 0xCCA7, 0xCCAA, 0xCCAE, 0xCCAF,
- 0xCCB0, 0xCCB1, 0xCCB2, 0xCCB3, 0xCCB6, 0xCCB7, 0xCCB9, 0xCCBA,
- 0xCCBB, 0xCCBD, 0xCCBE, 0xCCBF, 0xCCC0, 0xCCC1, 0xCCC2, 0xCCC3,
- 0xCCC6, 0xCCC8, 0xCCCA, 0xCCCB, 0xCCCC, 0xCCCD, 0xCCCE, 0xCCCF,
- 0xCCD1, 0xCCD2, 0xCCD3, 0xCCD5, 0xCCD6, 0xCCD7, 0xCCD8, 0xCCD9,
- 0xCCDA, 0xCCDB, 0xCCDC, 0xCCDD, 0xCCDE, 0xCCDF, 0xCCE0, 0xCCE1,
- 0xCCE2, 0xCCE3, 0xCCE5, 0xCCE6, 0xCCE7, 0xCCE8, 0xCCE9, 0xCCEA,
- 0xCCEB, 0xCCED, 0xCCEE, 0xCCEF, 0xCCF1, 0xCCF2, 0xCCF3, 0xCCF4,
- 0xCCF5, 0xCCF6, 0xCCF7, 0xCCF8, 0xCCF9, 0xCCFA, 0xCCFB, 0xCCFC,
- 0xCCFD, 0xCCFE, 0xCCFF, 0xCD00, 0xCD02, 0xCD03, 0xCD04, 0xCD05,
- 0xCD06, 0xCD07, 0xCD0A, 0xCD0B, 0xCD0D, 0xCD0E, 0xCD0F, 0xCD11,
- 0xCD12, 0xCD13, 0xCD14, 0xCD15, 0xCD16, 0xCD17, 0xCD1A, 0xCD1C,
- 0xCD1E, 0xCD1F, 0xCD20, 0xCD21, 0xCD22, 0xCD23, 0xCD25, 0xCD26,
- 0xCD27, 0xCD29, 0xCD2A, 0xCD2B, 0xCD2D, 0xCD2E, 0xCD2F, 0xCD30,
- 0xCD31, 0xCD32, 0xCD33, 0xCD34, 0xCD35, 0xCD36, 0xCD37, 0xCD38,
- 0xCD3A, 0xCD3B, 0xCD3C, 0xCD3D, 0xCD3E, 0xCD3F, 0xCD40, 0xCD41,
- 0xCD42, 0xCD43, 0xCD44, 0xCD45, 0xCD46, 0xCD47, 0xCD48, 0xCD49,
- 0xCD4A, 0xCD4B, 0xCD4C, 0xCD4D, 0xCD4E, 0xCD4F, 0xCD50, 0xCD51,
- 0xCD52, 0xCD53, 0xCD54, 0xCD55, 0xCD56, 0xCD57, 0xCD58, 0xCD59,
- 0xCD5A, 0xCD5B, 0xCD5D, 0xCD5E, 0xCD5F, 0xCD61, 0xCD62, 0xCD63,
- 0xCD65, 0xCD66, 0xCD67, 0xCD68, 0xCD69, 0xCD6A, 0xCD6B, 0xCD6E,
- 0xCD70, 0xCD72, 0xCD73, 0xCD74, 0xCD75, 0xCD76, 0xCD77, 0xCD79,
- 0xCD7A, 0xCD7B, 0xCD7C, 0xCD7D, 0xCD7E, 0xCD7F, 0xCD80, 0xCD81,
- 0xCD82, 0xCD83, 0xCD84, 0xCD85, 0xCD86, 0xCD87, 0xCD89, 0xCD8A,
- 0xCD8B, 0xCD8C, 0xCD8D, 0xCD8E, 0xCD8F, 0xCD90, 0xCD91, 0xCD92,
- 0xCD93, 0xCD96, 0xCD97, 0xCD99, 0xCD9A, 0xCD9B, 0xCD9D, 0xCD9E,
- 0xCD9F, 0xCDA0, 0xCDA1, 0xCDA2, 0xCDA3, 0xCDA6, 0xCDA8, 0xCDAA,
- 0xCDAB, 0xCDAC, 0xCDAD, 0xCDAE, 0xCDAF, 0xCDB1, 0xCDB2, 0xCDB3,
- 0xCDB4, 0xCDB5, 0xCDB6, 0xCDB7, 0xCDB8, 0xCDB9, 0xCDBA, 0xCDBB,
- 0xCDBC, 0xCDBD, 0xCDBE, 0xCDBF, 0xCDC0, 0xCDC1, 0xCDC2, 0xCDC3,
- 0xCDC5, 0xCDC6, 0xCDC7, 0xCDC8, 0xCDC9, 0xCDCA, 0xCDCB, 0xCDCD,
- 0xCDCE, 0xCDCF, 0xCDD1, 0xCDD2, 0xCDD3, 0xCDD4, 0xCDD5, 0xCDD6,
- 0xCDD7, 0xCDD8, 0xCDD9, 0xCDDA, 0xCDDB, 0xCDDC, 0xCDDD, 0xCDDE,
- 0xCDDF, 0xCDE0, 0xCDE1, 0xCDE2, 0xCDE3, 0xCDE4, 0xCDE5, 0xCDE6,
- 0xCDE7, 0xCDE9, 0xCDEA, 0xCDEB, 0xCDED, 0xCDEE, 0xCDEF, 0xCDF1,
- 0xCDF2, 0xCDF3, 0xCDF4, 0xCDF5, 0xCDF6, 0xCDF7, 0xCDFA, 0xCDFC,
- 0xCDFE, 0xCDFF, 0xCE00, 0xCE01, 0xCE02, 0xCE03, 0xCE05, 0xCE06,
- 0xCE07, 0xCE09, 0xCE0A, 0xCE0B, 0xCE0D, 0xCE0E, 0xCE0F, 0xCE10,
- 0xCE11, 0xCE12, 0xCE13, 0xCE15, 0xCE16, 0xCE17, 0xCE18, 0xCE1A,
- 0xCE1B, 0xCE1C, 0xCE1D, 0xCE1E, 0xCE1F, 0xCE22, 0xCE23, 0xCE25,
- 0xCE26, 0xCE27, 0xCE29, 0xCE2A, 0xCE2B, 0xCE2C, 0xCE2D, 0xCE2E,
- 0xCE2F, 0xCE32, 0xCE34, 0xCE36, 0xCE37, 0xCE38, 0xCE39, 0xCE3A,
- 0xCE3B, 0xCE3C, 0xCE3D, 0xCE3E, 0xCE3F, 0xCE40, 0xCE41, 0xCE42,
- 0xCE43, 0xCE44, 0xCE45, 0xCE46, 0xCE47, 0xCE48, 0xCE49, 0xCE4A,
- 0xCE4B, 0xCE4C, 0xCE4D, 0xCE4E, 0xCE4F, 0xCE50, 0xCE51, 0xCE52,
- 0xCE53, 0xCE54, 0xCE55, 0xCE56, 0xCE57, 0xCE5A, 0xCE5B, 0xCE5D,
- 0xCE5E, 0xCE62, 0xCE63, 0xCE64, 0xCE65, 0xCE66, 0xCE67, 0xCE6A,
- 0xCE6C, 0xCE6E, 0xCE6F, 0xCE70, 0xCE71, 0xCE72, 0xCE73, 0xCE76,
- 0xCE77, 0xCE79, 0xCE7A, 0xCE7B, 0xCE7D, 0xCE7E, 0xCE7F, 0xCE80,
- 0xCE81, 0xCE82, 0xCE83, 0xCE86, 0xCE88, 0xCE8A, 0xCE8B, 0xCE8C,
- 0xCE8D, 0xCE8E, 0xCE8F, 0xCE92, 0xCE93, 0xCE95, 0xCE96, 0xCE97,
- 0xCE99, 0xCE9A, 0xCE9B, 0xCE9C, 0xCE9D, 0xCE9E, 0xCE9F, 0xCEA2,
- 0xCEA6, 0xCEA7, 0xCEA8, 0xCEA9, 0xCEAA, 0xCEAB, 0xCEAE, 0xCEAF,
- 0xCEB0, 0xCEB1, 0xCEB2, 0xCEB3, 0xCEB4, 0xCEB5, 0xCEB6, 0xCEB7,
- 0xCEB8, 0xCEB9, 0xCEBA, 0xCEBB, 0xCEBC, 0xCEBD, 0xCEBE, 0xCEBF,
- 0xCEC0, 0xCEC2, 0xCEC3, 0xCEC4, 0xCEC5, 0xCEC6, 0xCEC7, 0xCEC8,
- 0xCEC9, 0xCECA, 0xCECB, 0xCECC, 0xCECD, 0xCECE, 0xCECF, 0xCED0,
- 0xCED1, 0xCED2, 0xCED3, 0xCED4, 0xCED5, 0xCED6, 0xCED7, 0xCED8,
- 0xCED9, 0xCEDA, 0xCEDB, 0xCEDC, 0xCEDD, 0xCEDE, 0xCEDF, 0xCEE0,
- 0xCEE1, 0xCEE2, 0xCEE3, 0xCEE6, 0xCEE7, 0xCEE9, 0xCEEA, 0xCEED,
- 0xCEEE, 0xCEEF, 0xCEF0, 0xCEF1, 0xCEF2, 0xCEF3, 0xCEF6, 0xCEFA,
- 0xCEFB, 0xCEFC, 0xCEFD, 0xCEFE, 0xCEFF, 0xCF02, 0xCF03, 0xCF05,
- 0xCF06, 0xCF07, 0xCF09, 0xCF0A, 0xCF0B, 0xCF0C, 0xCF0D, 0xCF0E,
- 0xCF0F, 0xCF12, 0xCF14, 0xCF16, 0xCF17, 0xCF18, 0xCF19, 0xCF1A,
- 0xCF1B, 0xCF1D, 0xCF1E, 0xCF1F, 0xCF21, 0xCF22, 0xCF23, 0xCF25,
- 0xCF26, 0xCF27, 0xCF28, 0xCF29, 0xCF2A, 0xCF2B, 0xCF2E, 0xCF32,
- 0xCF33, 0xCF34, 0xCF35, 0xCF36, 0xCF37, 0xCF39, 0xCF3A, 0xCF3B,
- 0xCF3C, 0xCF3D, 0xCF3E, 0xCF3F, 0xCF40, 0xCF41, 0xCF42, 0xCF43,
- 0xCF44, 0xCF45, 0xCF46, 0xCF47, 0xCF48, 0xCF49, 0xCF4A, 0xCF4B,
- 0xCF4C, 0xCF4D, 0xCF4E, 0xCF4F, 0xCF50, 0xCF51, 0xCF52, 0xCF53,
- 0xCF56, 0xCF57, 0xCF59, 0xCF5A, 0xCF5B, 0xCF5D, 0xCF5E, 0xCF5F,
- 0xCF60, 0xCF61, 0xCF62, 0xCF63, 0xCF66, 0xCF68, 0xCF6A, 0xCF6B,
- 0xCF6C, 0xCF6D, 0xCF6E, 0xCF6F, 0xCF72, 0xCF73, 0xCF75, 0xCF76,
- 0xCF77, 0xCF79, 0xCF7A, 0xCF7B, 0xCF7C, 0xCF7D, 0xCF7E, 0xCF7F,
- 0xCF81, 0xCF82, 0xCF83, 0xCF84, 0xCF86, 0xCF87, 0xCF88, 0xCF89,
- 0xCF8A, 0xCF8B, 0xCF8D, 0xCF8E, 0xCF8F, 0xCF90, 0xCF91, 0xCF92,
- 0xCF93, 0xCF94, 0xCF95, 0xCF96, 0xCF97, 0xCF98, 0xCF99, 0xCF9A,
- 0xCF9B, 0xCF9C, 0xCF9D, 0xCF9E, 0xCF9F, 0xCFA0, 0xCFA2, 0xCFA3,
- 0xCFA4, 0xCFA5, 0xCFA6, 0xCFA7, 0xCFA9, 0xCFAA, 0xCFAB, 0xCFAC,
- 0xCFAD, 0xCFAE, 0xCFAF, 0xCFB1, 0xCFB2, 0xCFB3, 0xCFB4, 0xCFB5,
- 0xCFB6, 0xCFB7, 0xCFB8, 0xCFB9, 0xCFBA, 0xCFBB, 0xCFBC, 0xCFBD,
- 0xCFBE, 0xCFBF, 0xCFC0, 0xCFC1, 0xCFC2, 0xCFC3, 0xCFC5, 0xCFC6,
- 0xCFC7, 0xCFC8, 0xCFC9, 0xCFCA, 0xCFCB, 0xCFCC, 0xCFCD, 0xCFCE,
- 0xCFCF, 0xCFD0, 0xCFD1, 0xCFD2, 0xCFD3, 0xCFD4, 0xCFD5, 0xCFD6,
- 0xCFD7, 0xCFD8, 0xCFD9, 0xCFDA, 0xCFDB, 0xCFDC, 0xCFDD, 0xCFDE,
- 0xCFDF, 0xCFE2, 0xCFE3, 0xCFE5, 0xCFE6, 0xCFE7, 0xCFE9, 0xCFEA,
- 0xCFEB, 0xCFEC, 0xCFED, 0xCFEE, 0xCFEF, 0xCFF2, 0xCFF4, 0xCFF6,
- 0xCFF7, 0xCFF8, 0xCFF9, 0xCFFA, 0xCFFB, 0xCFFD, 0xCFFE, 0xCFFF,
- 0xD001, 0xD002, 0xD003, 0xD005, 0xD006, 0xD007, 0xD008, 0xD009,
- 0xD00A, 0xD00B, 0xD00C, 0xD00D, 0xD00E, 0xD00F, 0xD010, 0xD012,
- 0xD013, 0xD014, 0xD015, 0xD016, 0xD017, 0xD019, 0xD01A, 0xD01B,
- 0xD01C, 0xD01D, 0xD01E, 0xD01F, 0xD020, 0xD021, 0xD022, 0xD023,
- 0xD024, 0xD025, 0xD026, 0xD027, 0xD028, 0xD029, 0xD02A, 0xD02B,
- 0xD02C, 0xD02E, 0xD02F, 0xD030, 0xD031, 0xD032, 0xD033, 0xD036,
- 0xD037, 0xD039, 0xD03A, 0xD03B, 0xD03D, 0xD03E, 0xD03F, 0xD040,
- 0xD041, 0xD042, 0xD043, 0xD046, 0xD048, 0xD04A, 0xD04B, 0xD04C,
- 0xD04D, 0xD04E, 0xD04F, 0xD051, 0xD052, 0xD053, 0xD055, 0xD056,
- 0xD057, 0xD059, 0xD05A, 0xD05B, 0xD05C, 0xD05D, 0xD05E, 0xD05F,
- 0xD061, 0xD062, 0xD063, 0xD064, 0xD065, 0xD066, 0xD067, 0xD068,
- 0xD069, 0xD06A, 0xD06B, 0xD06E, 0xD06F, 0xD071, 0xD072, 0xD073,
- 0xD075, 0xD076, 0xD077, 0xD078, 0xD079, 0xD07A, 0xD07B, 0xD07E,
- 0xD07F, 0xD080, 0xD082, 0xD083, 0xD084, 0xD085, 0xD086, 0xD087,
- 0xD088, 0xD089, 0xD08A, 0xD08B, 0xD08C, 0xD08D, 0xD08E, 0xD08F,
- 0xD090, 0xD091, 0xD092, 0xD093, 0xD094, 0xD095, 0xD096, 0xD097,
- 0xD098, 0xD099, 0xD09A, 0xD09B, 0xD09C, 0xD09D, 0xD09E, 0xD09F,
- 0xD0A0, 0xD0A1, 0xD0A2, 0xD0A3, 0xD0A6, 0xD0A7, 0xD0A9, 0xD0AA,
- 0xD0AB, 0xD0AD, 0xD0AE, 0xD0AF, 0xD0B0, 0xD0B1, 0xD0B2, 0xD0B3,
- 0xD0B6, 0xD0B8, 0xD0BA, 0xD0BB, 0xD0BC, 0xD0BD, 0xD0BE, 0xD0BF,
- 0xD0C2, 0xD0C3, 0xD0C5, 0xD0C6, 0xD0C7, 0xD0CA, 0xD0CB, 0xD0CC,
- 0xD0CD, 0xD0CE, 0xD0CF, 0xD0D2, 0xD0D6, 0xD0D7, 0xD0D8, 0xD0D9,
- 0xD0DA, 0xD0DB, 0xD0DE, 0xD0DF, 0xD0E1, 0xD0E2, 0xD0E3, 0xD0E5,
- 0xD0E6, 0xD0E7, 0xD0E8, 0xD0E9, 0xD0EA, 0xD0EB, 0xD0EE, 0xD0F2,
- 0xD0F3, 0xD0F4, 0xD0F5, 0xD0F6, 0xD0F7, 0xD0F9, 0xD0FA, 0xD0FB,
- 0xD0FC, 0xD0FD, 0xD0FE, 0xD0FF, 0xD100, 0xD101, 0xD102, 0xD103,
- 0xD104, 0xD105, 0xD106, 0xD107, 0xD108, 0xD109, 0xD10A, 0xD10B,
- 0xD10C, 0xD10E, 0xD10F, 0xD110, 0xD111, 0xD112, 0xD113, 0xD114,
- 0xD115, 0xD116, 0xD117, 0xD118, 0xD119, 0xD11A, 0xD11B, 0xD11C,
- 0xD11D, 0xD11E, 0xD11F, 0xD120, 0xD121, 0xD122, 0xD123, 0xD124,
- 0xD125, 0xD126, 0xD127, 0xD128, 0xD129, 0xD12A, 0xD12B, 0xD12C,
- 0xD12D, 0xD12E, 0xD12F, 0xD132, 0xD133, 0xD135, 0xD136, 0xD137,
- 0xD139, 0xD13B, 0xD13C, 0xD13D, 0xD13E, 0xD13F, 0xD142, 0xD146,
- 0xD147, 0xD148, 0xD149, 0xD14A, 0xD14B, 0xD14E, 0xD14F, 0xD151,
- 0xD152, 0xD153, 0xD155, 0xD156, 0xD157, 0xD158, 0xD159, 0xD15A,
- 0xD15B, 0xD15E, 0xD160, 0xD162, 0xD163, 0xD164, 0xD165, 0xD166,
- 0xD167, 0xD169, 0xD16A, 0xD16B, 0xD16D, 0xD16E, 0xD16F, 0xD170,
- 0xD171, 0xD172, 0xD173, 0xD174, 0xD175, 0xD176, 0xD177, 0xD178,
- 0xD179, 0xD17A, 0xD17B, 0xD17D, 0xD17E, 0xD17F, 0xD180, 0xD181,
- 0xD182, 0xD183, 0xD185, 0xD186, 0xD187, 0xD189, 0xD18A, 0xD18B,
- 0xD18C, 0xD18D, 0xD18E, 0xD18F, 0xD190, 0xD191, 0xD192, 0xD193,
- 0xD194, 0xD195, 0xD196, 0xD197, 0xD198, 0xD199, 0xD19A, 0xD19B,
- 0xD19C, 0xD19D, 0xD19E, 0xD19F, 0xD1A2, 0xD1A3, 0xD1A5, 0xD1A6,
- 0xD1A7, 0xD1A9, 0xD1AA, 0xD1AB, 0xD1AC, 0xD1AD, 0xD1AE, 0xD1AF,
- 0xD1B2, 0xD1B4, 0xD1B6, 0xD1B7, 0xD1B8, 0xD1B9, 0xD1BB, 0xD1BD,
- 0xD1BE, 0xD1BF, 0xD1C1, 0xD1C2, 0xD1C3, 0xD1C4, 0xD1C5, 0xD1C6,
- 0xD1C7, 0xD1C8, 0xD1C9, 0xD1CA, 0xD1CB, 0xD1CC, 0xD1CD, 0xD1CE,
- 0xD1CF, 0xD1D0, 0xD1D1, 0xD1D2, 0xD1D3, 0xD1D4, 0xD1D5, 0xD1D6,
- 0xD1D7, 0xD1D9, 0xD1DA, 0xD1DB, 0xD1DC, 0xD1DD, 0xD1DE, 0xD1DF,
- 0xD1E0, 0xD1E1, 0xD1E2, 0xD1E3, 0xD1E4, 0xD1E5, 0xD1E6, 0xD1E7,
- 0xD1E8, 0xD1E9, 0xD1EA, 0xD1EB, 0xD1EC, 0xD1ED, 0xD1EE, 0xD1EF,
- 0xD1F0, 0xD1F1, 0xD1F2, 0xD1F3, 0xD1F5, 0xD1F6, 0xD1F7, 0xD1F9,
- 0xD1FA, 0xD1FB, 0xD1FC, 0xD1FD, 0xD1FE, 0xD1FF, 0xD200, 0xD201,
- 0xD202, 0xD203, 0xD204, 0xD205, 0xD206, 0xD208, 0xD20A, 0xD20B,
- 0xD20C, 0xD20D, 0xD20E, 0xD20F, 0xD211, 0xD212, 0xD213, 0xD214,
- 0xD215, 0xD216, 0xD217, 0xD218, 0xD219, 0xD21A, 0xD21B, 0xD21C,
- 0xD21D, 0xD21E, 0xD21F, 0xD220, 0xD221, 0xD222, 0xD223, 0xD224,
- 0xD225, 0xD226, 0xD227, 0xD228, 0xD229, 0xD22A, 0xD22B, 0xD22E,
- 0xD22F, 0xD231, 0xD232, 0xD233, 0xD235, 0xD236, 0xD237, 0xD238,
- 0xD239, 0xD23A, 0xD23B, 0xD23E, 0xD240, 0xD242, 0xD243, 0xD244,
- 0xD245, 0xD246, 0xD247, 0xD249, 0xD24A, 0xD24B, 0xD24C, 0xD24D,
- 0xD24E, 0xD24F, 0xD250, 0xD251, 0xD252, 0xD253, 0xD254, 0xD255,
- 0xD256, 0xD257, 0xD258, 0xD259, 0xD25A, 0xD25B, 0xD25D, 0xD25E,
- 0xD25F, 0xD260, 0xD261, 0xD262, 0xD263, 0xD265, 0xD266, 0xD267,
- 0xD268, 0xD269, 0xD26A, 0xD26B, 0xD26C, 0xD26D, 0xD26E, 0xD26F,
- 0xD270, 0xD271, 0xD272, 0xD273, 0xD274, 0xD275, 0xD276, 0xD277,
- 0xD278, 0xD279, 0xD27A, 0xD27B, 0xD27C, 0xD27D, 0xD27E, 0xD27F,
- 0xD282, 0xD283, 0xD285, 0xD286, 0xD287, 0xD289, 0xD28A, 0xD28B,
- 0xD28C, 0xD28D, 0xD28E, 0xD28F, 0xD292, 0xD293, 0xD294, 0xD296,
- 0xD297, 0xD298, 0xD299, 0xD29A, 0xD29B, 0xD29D, 0xD29E, 0xD29F,
- 0xD2A1, 0xD2A2, 0xD2A3, 0xD2A5, 0xD2A6, 0xD2A7, 0xD2A8, 0xD2A9,
- 0xD2AA, 0xD2AB, 0xD2AD, 0xD2AE, 0xD2AF, 0xD2B0, 0xD2B2, 0xD2B3,
- 0xD2B4, 0xD2B5, 0xD2B6, 0xD2B7, 0xD2BA, 0xD2BB, 0xD2BD, 0xD2BE,
- 0xD2C1, 0xD2C3, 0xD2C4, 0xD2C5, 0xD2C6, 0xD2C7, 0xD2CA, 0xD2CC,
- 0xD2CD, 0xD2CE, 0xD2CF, 0xD2D0, 0xD2D1, 0xD2D2, 0xD2D3, 0xD2D5,
- 0xD2D6, 0xD2D7, 0xD2D9, 0xD2DA, 0xD2DB, 0xD2DD, 0xD2DE, 0xD2DF,
- 0xD2E0, 0xD2E1, 0xD2E2, 0xD2E3, 0xD2E6, 0xD2E7, 0xD2E8, 0xD2E9,
- 0xD2EA, 0xD2EB, 0xD2EC, 0xD2ED, 0xD2EE, 0xD2EF, 0xD2F2, 0xD2F3,
- 0xD2F5, 0xD2F6, 0xD2F7, 0xD2F9, 0xD2FA, 0xD2FB, 0xD2FC, 0xD2FD,
- 0xD2FE, 0xD2FF, 0xD302, 0xD304, 0xD306, 0xD307, 0xD308, 0xD309,
- 0xD30A, 0xD30B, 0xD30F, 0xD311, 0xD312, 0xD313, 0xD315, 0xD317,
- 0xD318, 0xD319, 0xD31A, 0xD31B, 0xD31E, 0xD322, 0xD323, 0xD324,
- 0xD326, 0xD327, 0xD32A, 0xD32B, 0xD32D, 0xD32E, 0xD32F, 0xD331,
- 0xD332, 0xD333, 0xD334, 0xD335, 0xD336, 0xD337, 0xD33A, 0xD33E,
- 0xD33F, 0xD340, 0xD341, 0xD342, 0xD343, 0xD346, 0xD347, 0xD348,
- 0xD349, 0xD34A, 0xD34B, 0xD34C, 0xD34D, 0xD34E, 0xD34F, 0xD350,
- 0xD351, 0xD352, 0xD353, 0xD354, 0xD355, 0xD356, 0xD357, 0xD358,
- 0xD359, 0xD35A, 0xD35B, 0xD35C, 0xD35D, 0xD35E, 0xD35F, 0xD360,
- 0xD361, 0xD362, 0xD363, 0xD364, 0xD365, 0xD366, 0xD367, 0xD368,
- 0xD369, 0xD36A, 0xD36B, 0xD36C, 0xD36D, 0xD36E, 0xD36F, 0xD370,
- 0xD371, 0xD372, 0xD373, 0xD374, 0xD375, 0xD376, 0xD377, 0xD378,
- 0xD379, 0xD37A, 0xD37B, 0xD37E, 0xD37F, 0xD381, 0xD382, 0xD383,
- 0xD385, 0xD386, 0xD387, 0xD388, 0xD389, 0xD38A, 0xD38B, 0xD38E,
- 0xD392, 0xD393, 0xD394, 0xD395, 0xD396, 0xD397, 0xD39A, 0xD39B,
- 0xD39D, 0xD39E, 0xD39F, 0xD3A1, 0xD3A2, 0xD3A3, 0xD3A4, 0xD3A5,
- 0xD3A6, 0xD3A7, 0xD3AA, 0xD3AC, 0xD3AE, 0xD3AF, 0xD3B0, 0xD3B1,
- 0xD3B2, 0xD3B3, 0xD3B5, 0xD3B6, 0xD3B7, 0xD3B9, 0xD3BA, 0xD3BB,
- 0xD3BD, 0xD3BE, 0xD3BF, 0xD3C0, 0xD3C1, 0xD3C2, 0xD3C3, 0xD3C6,
- 0xD3C7, 0xD3CA, 0xD3CB, 0xD3CC, 0xD3CD, 0xD3CE, 0xD3CF, 0xD3D1,
- 0xD3D2, 0xD3D3, 0xD3D4, 0xD3D5, 0xD3D6, 0xD3D7, 0xD3D9, 0xD3DA,
- 0xD3DB, 0xD3DC, 0xD3DD, 0xD3DE, 0xD3DF, 0xD3E0, 0xD3E2, 0xD3E4,
- 0xD3E5, 0xD3E6, 0xD3E7, 0xD3E8, 0xD3E9, 0xD3EA, 0xD3EB, 0xD3EE,
- 0xD3EF, 0xD3F1, 0xD3F2, 0xD3F3, 0xD3F5, 0xD3F6, 0xD3F7, 0xD3F8,
- 0xD3F9, 0xD3FA, 0xD3FB, 0xD3FE, 0xD400, 0xD402, 0xD403, 0xD404,
- 0xD405, 0xD406, 0xD407, 0xD409, 0xD40A, 0xD40B, 0xD40C, 0xD40D,
- 0xD40E, 0xD40F, 0xD410, 0xD411, 0xD412, 0xD413, 0xD414, 0xD415,
- 0xD416, 0xD417, 0xD418, 0xD419, 0xD41A, 0xD41B, 0xD41C, 0xD41E,
- 0xD41F, 0xD420, 0xD421, 0xD422, 0xD423, 0xD424, 0xD425, 0xD426,
- 0xD427, 0xD428, 0xD429, 0xD42A, 0xD42B, 0xD42C, 0xD42D, 0xD42E,
- 0xD42F, 0xD430, 0xD431, 0xD432, 0xD433, 0xD434, 0xD435, 0xD436,
- 0xD437, 0xD438, 0xD439, 0xD43A, 0xD43B, 0xD43C, 0xD43D, 0xD43E,
- 0xD43F, 0xD441, 0xD442, 0xD443, 0xD445, 0xD446, 0xD447, 0xD448,
- 0xD449, 0xD44A, 0xD44B, 0xD44C, 0xD44D, 0xD44E, 0xD44F, 0xD450,
- 0xD451, 0xD452, 0xD453, 0xD454, 0xD455, 0xD456, 0xD457, 0xD458,
- 0xD459, 0xD45A, 0xD45B, 0xD45D, 0xD45E, 0xD45F, 0xD461, 0xD462,
- 0xD463, 0xD465, 0xD466, 0xD467, 0xD468, 0xD469, 0xD46A, 0xD46B,
- 0xD46C, 0xD46E, 0xD470, 0xD471, 0xD472, 0xD473, 0xD474, 0xD475,
- 0xD476, 0xD477, 0xD47A, 0xD47B, 0xD47D, 0xD47E, 0xD481, 0xD483,
- 0xD484, 0xD485, 0xD486, 0xD487, 0xD48A, 0xD48C, 0xD48E, 0xD48F,
- 0xD490, 0xD491, 0xD492, 0xD493, 0xD495, 0xD496, 0xD497, 0xD498,
- 0xD499, 0xD49A, 0xD49B, 0xD49C, 0xD49D, 0xD49E, 0xD49F, 0xD4A0,
- 0xD4A1, 0xD4A2, 0xD4A3, 0xD4A4, 0xD4A5, 0xD4A6, 0xD4A7, 0xD4A8,
- 0xD4AA, 0xD4AB, 0xD4AC, 0xD4AD, 0xD4AE, 0xD4AF, 0xD4B0, 0xD4B1,
- 0xD4B2, 0xD4B3, 0xD4B4, 0xD4B5, 0xD4B6, 0xD4B7, 0xD4B8, 0xD4B9,
- 0xD4BA, 0xD4BB, 0xD4BC, 0xD4BD, 0xD4BE, 0xD4BF, 0xD4C0, 0xD4C1,
- 0xD4C2, 0xD4C3, 0xD4C4, 0xD4C5, 0xD4C6, 0xD4C7, 0xD4C8, 0xD4C9,
- 0xD4CA, 0xD4CB, 0xD4CD, 0xD4CE, 0xD4CF, 0xD4D1, 0xD4D2, 0xD4D3,
- 0xD4D5, 0xD4D6, 0xD4D7, 0xD4D8, 0xD4D9, 0xD4DA, 0xD4DB, 0xD4DD,
- 0xD4DE, 0xD4E0, 0xD4E1, 0xD4E2, 0xD4E3, 0xD4E4, 0xD4E5, 0xD4E6,
- 0xD4E7, 0xD4E9, 0xD4EA, 0xD4EB, 0xD4ED, 0xD4EE, 0xD4EF, 0xD4F1,
- 0xD4F2, 0xD4F3, 0xD4F4, 0xD4F5, 0xD4F6, 0xD4F7, 0xD4F9, 0xD4FA,
- 0xD4FC, 0xD4FE, 0xD4FF, 0xD500, 0xD501, 0xD502, 0xD503, 0xD505,
- 0xD506, 0xD507, 0xD509, 0xD50A, 0xD50B, 0xD50D, 0xD50E, 0xD50F,
- 0xD510, 0xD511, 0xD512, 0xD513, 0xD516, 0xD518, 0xD519, 0xD51A,
- 0xD51B, 0xD51C, 0xD51D, 0xD51E, 0xD51F, 0xD520, 0xD521, 0xD522,
- 0xD523, 0xD524, 0xD525, 0xD526, 0xD527, 0xD528, 0xD529, 0xD52A,
- 0xD52B, 0xD52C, 0xD52D, 0xD52E, 0xD52F, 0xD530, 0xD531, 0xD532,
- 0xD533, 0xD534, 0xD535, 0xD536, 0xD537, 0xD538, 0xD539, 0xD53A,
- 0xD53B, 0xD53E, 0xD53F, 0xD541, 0xD542, 0xD543, 0xD545, 0xD546,
- 0xD547, 0xD548, 0xD549, 0xD54A, 0xD54B, 0xD54E, 0xD550, 0xD552,
- 0xD553, 0xD554, 0xD555, 0xD556, 0xD557, 0xD55A, 0xD55B, 0xD55D,
- 0xD55E, 0xD55F, 0xD561, 0xD562, 0xD563, 0xD564, 0xD566, 0xD567,
- 0xD56A, 0xD56C, 0xD56E, 0xD56F, 0xD570, 0xD571, 0xD572, 0xD573,
- 0xD576, 0xD577, 0xD579, 0xD57A, 0xD57B, 0xD57D, 0xD57E, 0xD57F,
- 0xD580, 0xD581, 0xD582, 0xD583, 0xD586, 0xD58A, 0xD58B, 0xD58C,
- 0xD58D, 0xD58E, 0xD58F, 0xD591, 0xD592, 0xD593, 0xD594, 0xD595,
- 0xD596, 0xD597, 0xD598, 0xD599, 0xD59A, 0xD59B, 0xD59C, 0xD59D,
- 0xD59E, 0xD59F, 0xD5A0, 0xD5A1, 0xD5A2, 0xD5A3, 0xD5A4, 0xD5A6,
- 0xD5A7, 0xD5A8, 0xD5A9, 0xD5AA, 0xD5AB, 0xD5AC, 0xD5AD, 0xD5AE,
- 0xD5AF, 0xD5B0, 0xD5B1, 0xD5B2, 0xD5B3, 0xD5B4, 0xD5B5, 0xD5B6,
- 0xD5B7, 0xD5B8, 0xD5B9, 0xD5BA, 0xD5BB, 0xD5BC, 0xD5BD, 0xD5BE,
- 0xD5BF, 0xD5C0, 0xD5C1, 0xD5C2, 0xD5C3, 0xD5C4, 0xD5C5, 0xD5C6,
- 0xD5C7, 0xD5CA, 0xD5CB, 0xD5CD, 0xD5CE, 0xD5CF, 0xD5D1, 0xD5D3,
- 0xD5D4, 0xD5D5, 0xD5D6, 0xD5D7, 0xD5DA, 0xD5DC, 0xD5DE, 0xD5DF,
- 0xD5E0, 0xD5E1, 0xD5E2, 0xD5E3, 0xD5E6, 0xD5E7, 0xD5E9, 0xD5EA,
- 0xD5EB, 0xD5ED, 0xD5EE, 0xD5EF, 0xD5F0, 0xD5F1, 0xD5F2, 0xD5F3,
- 0xD5F6, 0xD5F8, 0xD5FA, 0xD5FB, 0xD5FC, 0xD5FD, 0xD5FE, 0xD5FF,
- 0xD602, 0xD603, 0xD605, 0xD606, 0xD607, 0xD609, 0xD60A, 0xD60B,
- 0xD60C, 0xD60D, 0xD60E, 0xD60F, 0xD612, 0xD616, 0xD617, 0xD618,
- 0xD619, 0xD61A, 0xD61B, 0xD61D, 0xD61E, 0xD61F, 0xD621, 0xD622,
- 0xD623, 0xD625, 0xD626, 0xD627, 0xD628, 0xD629, 0xD62A, 0xD62B,
- 0xD62C, 0xD62E, 0xD62F, 0xD630, 0xD631, 0xD632, 0xD633, 0xD634,
- 0xD635, 0xD636, 0xD637, 0xD63A, 0xD63B, 0xD63D, 0xD63E, 0xD63F,
- 0xD641, 0xD642, 0xD643, 0xD644, 0xD646, 0xD647, 0xD64A, 0xD64C,
- 0xD64E, 0xD64F, 0xD650, 0xD652, 0xD653, 0xD656, 0xD657, 0xD659,
- 0xD65A, 0xD65B, 0xD65D, 0xD65E, 0xD65F, 0xD660, 0xD661, 0xD662,
- 0xD663, 0xD664, 0xD665, 0xD666, 0xD668, 0xD66A, 0xD66B, 0xD66C,
- 0xD66D, 0xD66E, 0xD66F, 0xD672, 0xD673, 0xD675, 0xD676, 0xD677,
- 0xD678, 0xD679, 0xD67A, 0xD67B, 0xD67C, 0xD67D, 0xD67E, 0xD67F,
- 0xD680, 0xD681, 0xD682, 0xD684, 0xD686, 0xD687, 0xD688, 0xD689,
- 0xD68A, 0xD68B, 0xD68E, 0xD68F, 0xD691, 0xD692, 0xD693, 0xD695,
- 0xD696, 0xD697, 0xD698, 0xD699, 0xD69A, 0xD69B, 0xD69C, 0xD69E,
- 0xD6A0, 0xD6A2, 0xD6A3, 0xD6A4, 0xD6A5, 0xD6A6, 0xD6A7, 0xD6A9,
- 0xD6AA, 0xD6AB, 0xD6AD, 0xD6AE, 0xD6AF, 0xD6B1, 0xD6B2, 0xD6B3,
- 0xD6B4, 0xD6B5, 0xD6B6, 0xD6B7, 0xD6B8, 0xD6BA, 0xD6BC, 0xD6BD,
- 0xD6BE, 0xD6BF, 0xD6C0, 0xD6C1, 0xD6C2, 0xD6C3, 0xD6C6, 0xD6C7,
- 0xD6C9, 0xD6CA, 0xD6CB, 0xD6CD, 0xD6CE, 0xD6CF, 0xD6D0, 0xD6D2,
- 0xD6D3, 0xD6D5, 0xD6D6, 0xD6D8, 0xD6DA, 0xD6DB, 0xD6DC, 0xD6DD,
- 0xD6DE, 0xD6DF, 0xD6E1, 0xD6E2, 0xD6E3, 0xD6E5, 0xD6E6, 0xD6E7,
- 0xD6E9, 0xD6EA, 0xD6EB, 0xD6EC, 0xD6ED, 0xD6EE, 0xD6EF, 0xD6F1,
- 0xD6F2, 0xD6F3, 0xD6F4, 0xD6F6, 0xD6F7, 0xD6F8, 0xD6F9, 0xD6FA,
- 0xD6FB, 0xD6FE, 0xD6FF, 0xD701, 0xD702, 0xD703, 0xD705, 0xD706,
- 0xD707, 0xD708, 0xD709, 0xD70A, 0xD70B, 0xD70C, 0xD70D, 0xD70E,
- 0xD70F, 0xD710, 0xD712, 0xD713, 0xD714, 0xD715, 0xD716, 0xD717,
- 0xD71A, 0xD71B, 0xD71D, 0xD71E, 0xD71F, 0xD721, 0xD722, 0xD723,
- 0xD724, 0xD725, 0xD726, 0xD727, 0xD72A, 0xD72C, 0xD72E, 0xD72F,
- 0xD730, 0xD731, 0xD732, 0xD733, 0xD736, 0xD737, 0xD739, 0xD73A,
- 0xD73B, 0xD73D, 0xD73E, 0xD73F, 0xD740, 0xD741, 0xD742, 0xD743,
- 0xD745, 0xD746, 0xD748, 0xD74A, 0xD74B, 0xD74C, 0xD74D, 0xD74E,
- 0xD74F, 0xD752, 0xD753, 0xD755, 0xD75A, 0xD75B, 0xD75C, 0xD75D,
- 0xD75E, 0xD75F, 0xD762, 0xD764, 0xD766, 0xD767, 0xD768, 0xD76A,
- 0xD76B, 0xD76D, 0xD76E, 0xD76F, 0xD771, 0xD772, 0xD773, 0xD775,
- 0xD776, 0xD777, 0xD778, 0xD779, 0xD77A, 0xD77B, 0xD77E, 0xD77F,
- 0xD780, 0xD782, 0xD783, 0xD784, 0xD785, 0xD786, 0xD787, 0xD78A,
- 0xD78B, 0xD78D, 0xD78E, 0xD78F, 0xD791, 0xD792, 0xD793, 0xD794,
- 0xD795, 0xD796, 0xD797, 0xD79A, 0xD79C, 0xD79E, 0xD79F, 0xD7A0,
- 0xD7A1, 0xD7A2, 0xD7A3, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024,
- 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C,
- 0x002D, 0x002E, 0x002F, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034,
- 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C,
- 0x003D, 0x003E, 0x003F, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044,
- 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C,
- 0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054,
- 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C,
- 0x005D, 0x005E, 0x005F, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064,
- 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C,
- 0x006D, 0x006E, 0x006F, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074,
- 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C,
- 0x007D, 0x007E, 0x20A9, 0x2010, 0x00A9, 0x2122, 0x22EF, 0x0020,
- 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028,
- 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, 0x0030,
- 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038,
- 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, 0x0040,
- 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048,
- 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050,
- 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058,
- 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, 0x0060,
- 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068,
- 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, 0x0070,
- 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078,
- 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x203E, 0x007E, 0x005C,
-};
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_Korea1CID2Unicode_2[18352] = {
+ 0xFFFD, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026,
+ 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E,
+ 0x002F, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036,
+ 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E,
+ 0x003F, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046,
+ 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E,
+ 0x004F, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056,
+ 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E,
+ 0x005F, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066,
+ 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E,
+ 0x006F, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076,
+ 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E,
+ 0x20A9, 0x2010, 0x00A9, 0x2122, 0x22EF, 0x3000, 0x3001, 0x3002,
+ 0x00B7, 0x2025, 0x2026, 0x00A8, 0x3003, 0x2013, 0x2014, 0x2016,
+ 0xFF3C, 0x223C, 0x2018, 0x2019, 0x201C, 0x201D, 0x3014, 0x3015,
+ 0x3008, 0x3009, 0x300A, 0x300B, 0x300C, 0x300D, 0x300E, 0x300F,
+ 0x3010, 0x3011, 0x00B1, 0x00D7, 0x00F7, 0x2260, 0x2264, 0x2265,
+ 0x221E, 0x2234, 0x00B0, 0x2032, 0x2033, 0x2103, 0x212B, 0xFFE0,
+ 0xFFE1, 0xFFE5, 0x2642, 0x2640, 0x2220, 0x22A5, 0x2312, 0x2202,
+ 0x2207, 0x2261, 0x2252, 0x00A7, 0x203B, 0x2606, 0x2605, 0x25CB,
+ 0x25CF, 0x25CE, 0x25C7, 0x25C6, 0x25A1, 0x25A0, 0x25B3, 0x25B2,
+ 0x25BD, 0x25BC, 0x2192, 0x2190, 0x2191, 0x2193, 0x2194, 0x3013,
+ 0x226A, 0x226B, 0x221A, 0x223D, 0x221D, 0x2235, 0x222B, 0x222C,
+ 0x2208, 0x220B, 0x2286, 0x2287, 0x2282, 0x2283, 0x222A, 0x2229,
+ 0x2227, 0x2228, 0xFFE2, 0x21D2, 0x21D4, 0x2200, 0x2203, 0x00B4,
+ 0x02DC, 0x02C7, 0x02D8, 0x02DD, 0x02DA, 0x02D9, 0x00B8, 0x02DB,
+ 0x00A1, 0x00BF, 0x2236, 0x222E, 0x2211, 0x220F, 0x00A4, 0x2109,
+ 0x2030, 0x25C1, 0x25C0, 0x25B7, 0x25B6, 0x2664, 0x2660, 0x2661,
+ 0x2665, 0x2667, 0x2663, 0x2299, 0x25C8, 0x25A3, 0x25D0, 0x25D1,
+ 0x2592, 0x25A4, 0x25A5, 0x25A8, 0x25A7, 0x25A6, 0x25A9, 0x2668,
+ 0x260F, 0x260E, 0x261C, 0x261E, 0x00B6, 0x2020, 0x2021, 0x2195,
+ 0x2197, 0x2199, 0x2196, 0x2198, 0x266D, 0x2669, 0x266A, 0x266C,
+ 0x327F, 0x321C, 0x2116, 0x33C7, 0x2122, 0x33C2, 0x33D8, 0x2121,
+ 0xFF01, 0xFF02, 0xFF03, 0xFF04, 0xFF05, 0xFF06, 0xFF07, 0xFF08,
+ 0xFF09, 0xFF0A, 0xFF0B, 0xFF0C, 0xFF0D, 0xFF0E, 0xFF0F, 0xFF10,
+ 0xFF11, 0xFF12, 0xFF13, 0xFF14, 0xFF15, 0xFF16, 0xFF17, 0xFF18,
+ 0xFF19, 0xFF1A, 0xFF1B, 0xFF1C, 0xFF1D, 0xFF1E, 0xFF1F, 0xFF20,
+ 0xFF21, 0xFF22, 0xFF23, 0xFF24, 0xFF25, 0xFF26, 0xFF27, 0xFF28,
+ 0xFF29, 0xFF2A, 0xFF2B, 0xFF2C, 0xFF2D, 0xFF2E, 0xFF2F, 0xFF30,
+ 0xFF31, 0xFF32, 0xFF33, 0xFF34, 0xFF35, 0xFF36, 0xFF37, 0xFF38,
+ 0xFF39, 0xFF3A, 0xFF3B, 0xFFE6, 0xFF3D, 0xFF3E, 0xFF3F, 0xFF40,
+ 0xFF41, 0xFF42, 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, 0xFF48,
+ 0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F, 0xFF50,
+ 0xFF51, 0xFF52, 0xFF53, 0xFF54, 0xFF55, 0xFF56, 0xFF57, 0xFF58,
+ 0xFF59, 0xFF5A, 0xFF5B, 0xFF5C, 0xFF5D, 0xFFE3, 0x3131, 0x3132,
+ 0x3133, 0x3134, 0x3135, 0x3136, 0x3137, 0x3138, 0x3139, 0x313A,
+ 0x313B, 0x313C, 0x313D, 0x313E, 0x313F, 0x3140, 0x3141, 0x3142,
+ 0x3143, 0x3144, 0x3145, 0x3146, 0x3147, 0x3148, 0x3149, 0x314A,
+ 0x314B, 0x314C, 0x314D, 0x314E, 0x314F, 0x3150, 0x3151, 0x3152,
+ 0x3153, 0x3154, 0x3155, 0x3156, 0x3157, 0x3158, 0x3159, 0x315A,
+ 0x315B, 0x315C, 0x315D, 0x315E, 0x315F, 0x3160, 0x3161, 0x3162,
+ 0x3163, 0x3165, 0x3166, 0x3167, 0x3168, 0x3169, 0x316A, 0x316B,
+ 0x316C, 0x316D, 0x316E, 0x316F, 0x3170, 0x3171, 0x3172, 0x3173,
+ 0x3174, 0x3175, 0x3176, 0x3177, 0x3178, 0x3179, 0x317A, 0x317B,
+ 0x317C, 0x317D, 0x317E, 0x317F, 0x3180, 0x3181, 0x3182, 0x3183,
+ 0x3184, 0x3185, 0x3186, 0x3187, 0x3188, 0x3189, 0x318A, 0x318B,
+ 0x318C, 0x318D, 0x318E, 0x2170, 0x2171, 0x2172, 0x2173, 0x2174,
+ 0x2175, 0x2176, 0x2177, 0x2178, 0x2179, 0x2160, 0x2161, 0x2162,
+ 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, 0x0391,
+ 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399,
+ 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, 0x03A0, 0x03A1,
+ 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, 0x03B1,
+ 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, 0x03B8, 0x03B9,
+ 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, 0x03C0, 0x03C1,
+ 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8, 0x03C9, 0x2500,
+ 0x2502, 0x250C, 0x2510, 0x2518, 0x2514, 0x251C, 0x252C, 0x2524,
+ 0x2534, 0x253C, 0x2501, 0x2503, 0x250F, 0x2513, 0x251B, 0x2517,
+ 0x2523, 0x2533, 0x252B, 0x253B, 0x254B, 0x2520, 0x252F, 0x2528,
+ 0x2537, 0x253F, 0x251D, 0x2530, 0x2525, 0x2538, 0x2542, 0x2512,
+ 0x2511, 0x251A, 0x2519, 0x2516, 0x2515, 0x250E, 0x250D, 0x251E,
+ 0x251F, 0x2521, 0x2522, 0x2526, 0x2527, 0x2529, 0x252A, 0x252D,
+ 0x252E, 0x2531, 0x2532, 0x2535, 0x2536, 0x2539, 0x253A, 0x253D,
+ 0x253E, 0x2540, 0x2541, 0x2543, 0x2544, 0x2545, 0x2546, 0x2547,
+ 0x2548, 0x2549, 0x254A, 0x3395, 0x3396, 0x3397, 0x2113, 0x3398,
+ 0x33C4, 0x33A3, 0x33A4, 0x33A5, 0x33A6, 0x3399, 0x339A, 0x339B,
+ 0x339C, 0x339D, 0x339E, 0x339F, 0x33A0, 0x33A1, 0x33A2, 0x33CA,
+ 0x338D, 0x338E, 0x338F, 0x33CF, 0x3388, 0x3389, 0x33C8, 0x33A7,
+ 0x33A8, 0x33B0, 0x33B1, 0x33B2, 0x33B3, 0x33B4, 0x33B5, 0x33B6,
+ 0x33B7, 0x33B8, 0x33B9, 0x3380, 0x3381, 0x3382, 0x3383, 0x3384,
+ 0x33BA, 0x33BB, 0x33BC, 0x33BD, 0x33BE, 0x33BF, 0x3390, 0x3391,
+ 0x3392, 0x3393, 0x3394, 0x2126, 0x33C0, 0x33C1, 0x338A, 0x338B,
+ 0x338C, 0x33D6, 0x33C5, 0x33AD, 0x33AE, 0x33AF, 0x33DB, 0x33A9,
+ 0x33AA, 0x33AB, 0x33AC, 0x33DD, 0x33D0, 0x33D3, 0x33C3, 0x33C9,
+ 0x33DC, 0x33C6, 0x00C6, 0x00D0, 0x00AA, 0x0126, 0x0132, 0x013F,
+ 0x0141, 0x00D8, 0x0152, 0x00BA, 0x00DE, 0x0166, 0x014A, 0x3260,
+ 0x3261, 0x3262, 0x3263, 0x3264, 0x3265, 0x3266, 0x3267, 0x3268,
+ 0x3269, 0x326A, 0x326B, 0x326C, 0x326D, 0x326E, 0x326F, 0x3270,
+ 0x3271, 0x3272, 0x3273, 0x3274, 0x3275, 0x3276, 0x3277, 0x3278,
+ 0x3279, 0x327A, 0x327B, 0x24D0, 0x24D1, 0x24D2, 0x24D3, 0x24D4,
+ 0x24D5, 0x24D6, 0x24D7, 0x24D8, 0x24D9, 0x24DA, 0x24DB, 0x24DC,
+ 0x24DD, 0x24DE, 0x24DF, 0x24E0, 0x24E1, 0x24E2, 0x24E3, 0x24E4,
+ 0x24E5, 0x24E6, 0x24E7, 0x24E8, 0x24E9, 0x2460, 0x2461, 0x2462,
+ 0x2463, 0x2464, 0x2465, 0x2466, 0x2467, 0x2468, 0x2469, 0x246A,
+ 0x246B, 0x246C, 0x246D, 0x246E, 0x00BD, 0x2153, 0x2154, 0x00BC,
+ 0x00BE, 0x215B, 0x215C, 0x215D, 0x215E, 0x00E6, 0x0111, 0x00F0,
+ 0x0127, 0x0131, 0x0133, 0x0138, 0x0140, 0x0142, 0x00F8, 0x0153,
+ 0x00DF, 0x00FE, 0x0167, 0x014B, 0x0149, 0x3200, 0x3201, 0x3202,
+ 0x3203, 0x3204, 0x3205, 0x3206, 0x3207, 0x3208, 0x3209, 0x320A,
+ 0x320B, 0x320C, 0x320D, 0x320E, 0x320F, 0x3210, 0x3211, 0x3212,
+ 0x3213, 0x3214, 0x3215, 0x3216, 0x3217, 0x3218, 0x3219, 0x321A,
+ 0x321B, 0x249C, 0x249D, 0x249E, 0x249F, 0x24A0, 0x24A1, 0x24A2,
+ 0x24A3, 0x24A4, 0x24A5, 0x24A6, 0x24A7, 0x24A8, 0x24A9, 0x24AA,
+ 0x24AB, 0x24AC, 0x24AD, 0x24AE, 0x24AF, 0x24B0, 0x24B1, 0x24B2,
+ 0x24B3, 0x24B4, 0x24B5, 0x2474, 0x2475, 0x2476, 0x2477, 0x2478,
+ 0x2479, 0x247A, 0x247B, 0x247C, 0x247D, 0x247E, 0x247F, 0x2480,
+ 0x2481, 0x2482, 0x00B9, 0x00B2, 0x00B3, 0x2074, 0x207F, 0x2081,
+ 0x2082, 0x2083, 0x2084, 0x3041, 0x3042, 0x3043, 0x3044, 0x3045,
+ 0x3046, 0x3047, 0x3048, 0x3049, 0x304A, 0x304B, 0x304C, 0x304D,
+ 0x304E, 0x304F, 0x3050, 0x3051, 0x3052, 0x3053, 0x3054, 0x3055,
+ 0x3056, 0x3057, 0x3058, 0x3059, 0x305A, 0x305B, 0x305C, 0x305D,
+ 0x305E, 0x305F, 0x3060, 0x3061, 0x3062, 0x3063, 0x3064, 0x3065,
+ 0x3066, 0x3067, 0x3068, 0x3069, 0x306A, 0x306B, 0x306C, 0x306D,
+ 0x306E, 0x306F, 0x3070, 0x3071, 0x3072, 0x3073, 0x3074, 0x3075,
+ 0x3076, 0x3077, 0x3078, 0x3079, 0x307A, 0x307B, 0x307C, 0x307D,
+ 0x307E, 0x307F, 0x3080, 0x3081, 0x3082, 0x3083, 0x3084, 0x3085,
+ 0x3086, 0x3087, 0x3088, 0x3089, 0x308A, 0x308B, 0x308C, 0x308D,
+ 0x308E, 0x308F, 0x3090, 0x3091, 0x3092, 0x3093, 0x30A1, 0x30A2,
+ 0x30A3, 0x30A4, 0x30A5, 0x30A6, 0x30A7, 0x30A8, 0x30A9, 0x30AA,
+ 0x30AB, 0x30AC, 0x30AD, 0x30AE, 0x30AF, 0x30B0, 0x30B1, 0x30B2,
+ 0x30B3, 0x30B4, 0x30B5, 0x30B6, 0x30B7, 0x30B8, 0x30B9, 0x30BA,
+ 0x30BB, 0x30BC, 0x30BD, 0x30BE, 0x30BF, 0x30C0, 0x30C1, 0x30C2,
+ 0x30C3, 0x30C4, 0x30C5, 0x30C6, 0x30C7, 0x30C8, 0x30C9, 0x30CA,
+ 0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF, 0x30D0, 0x30D1, 0x30D2,
+ 0x30D3, 0x30D4, 0x30D5, 0x30D6, 0x30D7, 0x30D8, 0x30D9, 0x30DA,
+ 0x30DB, 0x30DC, 0x30DD, 0x30DE, 0x30DF, 0x30E0, 0x30E1, 0x30E2,
+ 0x30E3, 0x30E4, 0x30E5, 0x30E6, 0x30E7, 0x30E8, 0x30E9, 0x30EA,
+ 0x30EB, 0x30EC, 0x30ED, 0x30EE, 0x30EF, 0x30F0, 0x30F1, 0x30F2,
+ 0x30F3, 0x30F4, 0x30F5, 0x30F6, 0x0410, 0x0411, 0x0412, 0x0413,
+ 0x0414, 0x0415, 0x0401, 0x0416, 0x0417, 0x0418, 0x0419, 0x041A,
+ 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, 0x0420, 0x0421, 0x0422,
+ 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042A,
+ 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, 0x0430, 0x0431, 0x0432,
+ 0x0433, 0x0434, 0x0435, 0x0451, 0x0436, 0x0437, 0x0438, 0x0439,
+ 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, 0x0440, 0x0441,
+ 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449,
+ 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F, 0xAC00, 0xAC01,
+ 0xAC04, 0xAC07, 0xAC08, 0xAC09, 0xAC0A, 0xAC10, 0xAC11, 0xAC12,
+ 0xAC13, 0xAC14, 0xAC15, 0xAC16, 0xAC17, 0xAC19, 0xAC1A, 0xAC1B,
+ 0xAC1C, 0xAC1D, 0xAC20, 0xAC24, 0xAC2C, 0xAC2D, 0xAC2F, 0xAC30,
+ 0xAC31, 0xAC38, 0xAC39, 0xAC3C, 0xAC40, 0xAC4B, 0xAC4D, 0xAC54,
+ 0xAC58, 0xAC5C, 0xAC70, 0xAC71, 0xAC74, 0xAC77, 0xAC78, 0xAC7A,
+ 0xAC80, 0xAC81, 0xAC83, 0xAC84, 0xAC85, 0xAC86, 0xAC89, 0xAC8A,
+ 0xAC8B, 0xAC8C, 0xAC90, 0xAC94, 0xAC9C, 0xAC9D, 0xAC9F, 0xACA0,
+ 0xACA1, 0xACA8, 0xACA9, 0xACAA, 0xACAC, 0xACAF, 0xACB0, 0xACB8,
+ 0xACB9, 0xACBB, 0xACBC, 0xACBD, 0xACC1, 0xACC4, 0xACC8, 0xACCC,
+ 0xACD5, 0xACD7, 0xACE0, 0xACE1, 0xACE4, 0xACE7, 0xACE8, 0xACEA,
+ 0xACEC, 0xACEF, 0xACF0, 0xACF1, 0xACF3, 0xACF5, 0xACF6, 0xACFC,
+ 0xACFD, 0xAD00, 0xAD04, 0xAD06, 0xAD0C, 0xAD0D, 0xAD0F, 0xAD11,
+ 0xAD18, 0xAD1C, 0xAD20, 0xAD29, 0xAD2C, 0xAD2D, 0xAD34, 0xAD35,
+ 0xAD38, 0xAD3C, 0xAD44, 0xAD45, 0xAD47, 0xAD49, 0xAD50, 0xAD54,
+ 0xAD58, 0xAD61, 0xAD63, 0xAD6C, 0xAD6D, 0xAD70, 0xAD73, 0xAD74,
+ 0xAD75, 0xAD76, 0xAD7B, 0xAD7C, 0xAD7D, 0xAD7F, 0xAD81, 0xAD82,
+ 0xAD88, 0xAD89, 0xAD8C, 0xAD90, 0xAD9C, 0xAD9D, 0xADA4, 0xADB7,
+ 0xADC0, 0xADC1, 0xADC4, 0xADC8, 0xADD0, 0xADD1, 0xADD3, 0xADDC,
+ 0xADE0, 0xADE4, 0xADF8, 0xADF9, 0xADFC, 0xADFF, 0xAE00, 0xAE01,
+ 0xAE08, 0xAE09, 0xAE0B, 0xAE0D, 0xAE14, 0xAE30, 0xAE31, 0xAE34,
+ 0xAE37, 0xAE38, 0xAE3A, 0xAE40, 0xAE41, 0xAE43, 0xAE45, 0xAE46,
+ 0xAE4A, 0xAE4C, 0xAE4D, 0xAE4E, 0xAE50, 0xAE54, 0xAE56, 0xAE5C,
+ 0xAE5D, 0xAE5F, 0xAE60, 0xAE61, 0xAE65, 0xAE68, 0xAE69, 0xAE6C,
+ 0xAE70, 0xAE78, 0xAE79, 0xAE7B, 0xAE7C, 0xAE7D, 0xAE84, 0xAE85,
+ 0xAE8C, 0xAEBC, 0xAEBD, 0xAEBE, 0xAEC0, 0xAEC4, 0xAECC, 0xAECD,
+ 0xAECF, 0xAED0, 0xAED1, 0xAED8, 0xAED9, 0xAEDC, 0xAEE8, 0xAEEB,
+ 0xAEED, 0xAEF4, 0xAEF8, 0xAEFC, 0xAF07, 0xAF08, 0xAF0D, 0xAF10,
+ 0xAF2C, 0xAF2D, 0xAF30, 0xAF32, 0xAF34, 0xAF3C, 0xAF3D, 0xAF3F,
+ 0xAF41, 0xAF42, 0xAF43, 0xAF48, 0xAF49, 0xAF50, 0xAF5C, 0xAF5D,
+ 0xAF64, 0xAF65, 0xAF79, 0xAF80, 0xAF84, 0xAF88, 0xAF90, 0xAF91,
+ 0xAF95, 0xAF9C, 0xAFB8, 0xAFB9, 0xAFBC, 0xAFC0, 0xAFC7, 0xAFC8,
+ 0xAFC9, 0xAFCB, 0xAFCD, 0xAFCE, 0xAFD4, 0xAFDC, 0xAFE8, 0xAFE9,
+ 0xAFF0, 0xAFF1, 0xAFF4, 0xAFF8, 0xB000, 0xB001, 0xB004, 0xB00C,
+ 0xB010, 0xB014, 0xB01C, 0xB01D, 0xB028, 0xB044, 0xB045, 0xB048,
+ 0xB04A, 0xB04C, 0xB04E, 0xB053, 0xB054, 0xB055, 0xB057, 0xB059,
+ 0xB05D, 0xB07C, 0xB07D, 0xB080, 0xB084, 0xB08C, 0xB08D, 0xB08F,
+ 0xB091, 0xB098, 0xB099, 0xB09A, 0xB09C, 0xB09F, 0xB0A0, 0xB0A1,
+ 0xB0A2, 0xB0A8, 0xB0A9, 0xB0AB, 0xB0AC, 0xB0AD, 0xB0AE, 0xB0AF,
+ 0xB0B1, 0xB0B3, 0xB0B4, 0xB0B5, 0xB0B8, 0xB0BC, 0xB0C4, 0xB0C5,
+ 0xB0C7, 0xB0C8, 0xB0C9, 0xB0D0, 0xB0D1, 0xB0D4, 0xB0D8, 0xB0E0,
+ 0xB0E5, 0xB108, 0xB109, 0xB10B, 0xB10C, 0xB110, 0xB112, 0xB113,
+ 0xB118, 0xB119, 0xB11B, 0xB11C, 0xB11D, 0xB123, 0xB124, 0xB125,
+ 0xB128, 0xB12C, 0xB134, 0xB135, 0xB137, 0xB138, 0xB139, 0xB140,
+ 0xB141, 0xB144, 0xB148, 0xB150, 0xB151, 0xB154, 0xB155, 0xB158,
+ 0xB15C, 0xB160, 0xB178, 0xB179, 0xB17C, 0xB180, 0xB182, 0xB188,
+ 0xB189, 0xB18B, 0xB18D, 0xB192, 0xB193, 0xB194, 0xB198, 0xB19C,
+ 0xB1A8, 0xB1CC, 0xB1D0, 0xB1D4, 0xB1DC, 0xB1DD, 0xB1DF, 0xB1E8,
+ 0xB1E9, 0xB1EC, 0xB1F0, 0xB1F9, 0xB1FB, 0xB1FD, 0xB204, 0xB205,
+ 0xB208, 0xB20B, 0xB20C, 0xB214, 0xB215, 0xB217, 0xB219, 0xB220,
+ 0xB234, 0xB23C, 0xB258, 0xB25C, 0xB260, 0xB268, 0xB269, 0xB274,
+ 0xB275, 0xB27C, 0xB284, 0xB285, 0xB289, 0xB290, 0xB291, 0xB294,
+ 0xB298, 0xB299, 0xB29A, 0xB2A0, 0xB2A1, 0xB2A3, 0xB2A5, 0xB2A6,
+ 0xB2AA, 0xB2AC, 0xB2B0, 0xB2B4, 0xB2C8, 0xB2C9, 0xB2CC, 0xB2D0,
+ 0xB2D2, 0xB2D8, 0xB2D9, 0xB2DB, 0xB2DD, 0xB2E2, 0xB2E4, 0xB2E5,
+ 0xB2E6, 0xB2E8, 0xB2EB, 0xB2EC, 0xB2ED, 0xB2EE, 0xB2EF, 0xB2F3,
+ 0xB2F4, 0xB2F5, 0xB2F7, 0xB2F8, 0xB2F9, 0xB2FA, 0xB2FB, 0xB2FF,
+ 0xB300, 0xB301, 0xB304, 0xB308, 0xB310, 0xB311, 0xB313, 0xB314,
+ 0xB315, 0xB31C, 0xB354, 0xB355, 0xB356, 0xB358, 0xB35B, 0xB35C,
+ 0xB35E, 0xB35F, 0xB364, 0xB365, 0xB367, 0xB369, 0xB36B, 0xB36E,
+ 0xB370, 0xB371, 0xB374, 0xB378, 0xB380, 0xB381, 0xB383, 0xB384,
+ 0xB385, 0xB38C, 0xB390, 0xB394, 0xB3A0, 0xB3A1, 0xB3A8, 0xB3AC,
+ 0xB3C4, 0xB3C5, 0xB3C8, 0xB3CB, 0xB3CC, 0xB3CE, 0xB3D0, 0xB3D4,
+ 0xB3D5, 0xB3D7, 0xB3D9, 0xB3DB, 0xB3DD, 0xB3E0, 0xB3E4, 0xB3E8,
+ 0xB3FC, 0xB410, 0xB418, 0xB41C, 0xB420, 0xB428, 0xB429, 0xB42B,
+ 0xB434, 0xB450, 0xB451, 0xB454, 0xB458, 0xB460, 0xB461, 0xB463,
+ 0xB465, 0xB46C, 0xB480, 0xB488, 0xB49D, 0xB4A4, 0xB4A8, 0xB4AC,
+ 0xB4B5, 0xB4B7, 0xB4B9, 0xB4C0, 0xB4C4, 0xB4C8, 0xB4D0, 0xB4D5,
+ 0xB4DC, 0xB4DD, 0xB4E0, 0xB4E3, 0xB4E4, 0xB4E6, 0xB4EC, 0xB4ED,
+ 0xB4EF, 0xB4F1, 0xB4F8, 0xB514, 0xB515, 0xB518, 0xB51B, 0xB51C,
+ 0xB524, 0xB525, 0xB527, 0xB528, 0xB529, 0xB52A, 0xB530, 0xB531,
+ 0xB534, 0xB538, 0xB540, 0xB541, 0xB543, 0xB544, 0xB545, 0xB54B,
+ 0xB54C, 0xB54D, 0xB550, 0xB554, 0xB55C, 0xB55D, 0xB55F, 0xB560,
+ 0xB561, 0xB5A0, 0xB5A1, 0xB5A4, 0xB5A8, 0xB5AA, 0xB5AB, 0xB5B0,
+ 0xB5B1, 0xB5B3, 0xB5B4, 0xB5B5, 0xB5BB, 0xB5BC, 0xB5BD, 0xB5C0,
+ 0xB5C4, 0xB5CC, 0xB5CD, 0xB5CF, 0xB5D0, 0xB5D1, 0xB5D8, 0xB5EC,
+ 0xB610, 0xB611, 0xB614, 0xB618, 0xB625, 0xB62C, 0xB634, 0xB648,
+ 0xB664, 0xB668, 0xB69C, 0xB69D, 0xB6A0, 0xB6A4, 0xB6AB, 0xB6AC,
+ 0xB6B1, 0xB6D4, 0xB6F0, 0xB6F4, 0xB6F8, 0xB700, 0xB701, 0xB705,
+ 0xB728, 0xB729, 0xB72C, 0xB72F, 0xB730, 0xB738, 0xB739, 0xB73B,
+ 0xB744, 0xB748, 0xB74C, 0xB754, 0xB755, 0xB760, 0xB764, 0xB768,
+ 0xB770, 0xB771, 0xB773, 0xB775, 0xB77C, 0xB77D, 0xB780, 0xB784,
+ 0xB78C, 0xB78D, 0xB78F, 0xB790, 0xB791, 0xB792, 0xB796, 0xB797,
+ 0xB798, 0xB799, 0xB79C, 0xB7A0, 0xB7A8, 0xB7A9, 0xB7AB, 0xB7AC,
+ 0xB7AD, 0xB7B4, 0xB7B5, 0xB7B8, 0xB7C7, 0xB7C9, 0xB7EC, 0xB7ED,
+ 0xB7F0, 0xB7F4, 0xB7FC, 0xB7FD, 0xB7FF, 0xB800, 0xB801, 0xB807,
+ 0xB808, 0xB809, 0xB80C, 0xB810, 0xB818, 0xB819, 0xB81B, 0xB81D,
+ 0xB824, 0xB825, 0xB828, 0xB82C, 0xB834, 0xB835, 0xB837, 0xB838,
+ 0xB839, 0xB840, 0xB844, 0xB851, 0xB853, 0xB85C, 0xB85D, 0xB860,
+ 0xB864, 0xB86C, 0xB86D, 0xB86F, 0xB871, 0xB878, 0xB87C, 0xB88D,
+ 0xB8A8, 0xB8B0, 0xB8B4, 0xB8B8, 0xB8C0, 0xB8C1, 0xB8C3, 0xB8C5,
+ 0xB8CC, 0xB8D0, 0xB8D4, 0xB8DD, 0xB8DF, 0xB8E1, 0xB8E8, 0xB8E9,
+ 0xB8EC, 0xB8F0, 0xB8F8, 0xB8F9, 0xB8FB, 0xB8FD, 0xB904, 0xB918,
+ 0xB920, 0xB93C, 0xB93D, 0xB940, 0xB944, 0xB94C, 0xB94F, 0xB951,
+ 0xB958, 0xB959, 0xB95C, 0xB960, 0xB968, 0xB969, 0xB96B, 0xB96D,
+ 0xB974, 0xB975, 0xB978, 0xB97C, 0xB984, 0xB985, 0xB987, 0xB989,
+ 0xB98A, 0xB98D, 0xB98E, 0xB9AC, 0xB9AD, 0xB9B0, 0xB9B4, 0xB9BC,
+ 0xB9BD, 0xB9BF, 0xB9C1, 0xB9C8, 0xB9C9, 0xB9CC, 0xB9CE, 0xB9CF,
+ 0xB9D0, 0xB9D1, 0xB9D2, 0xB9D8, 0xB9D9, 0xB9DB, 0xB9DD, 0xB9DE,
+ 0xB9E1, 0xB9E3, 0xB9E4, 0xB9E5, 0xB9E8, 0xB9EC, 0xB9F4, 0xB9F5,
+ 0xB9F7, 0xB9F8, 0xB9F9, 0xB9FA, 0xBA00, 0xBA01, 0xBA08, 0xBA15,
+ 0xBA38, 0xBA39, 0xBA3C, 0xBA40, 0xBA42, 0xBA48, 0xBA49, 0xBA4B,
+ 0xBA4D, 0xBA4E, 0xBA53, 0xBA54, 0xBA55, 0xBA58, 0xBA5C, 0xBA64,
+ 0xBA65, 0xBA67, 0xBA68, 0xBA69, 0xBA70, 0xBA71, 0xBA74, 0xBA78,
+ 0xBA83, 0xBA84, 0xBA85, 0xBA87, 0xBA8C, 0xBAA8, 0xBAA9, 0xBAAB,
+ 0xBAAC, 0xBAB0, 0xBAB2, 0xBAB8, 0xBAB9, 0xBABB, 0xBABD, 0xBAC4,
+ 0xBAC8, 0xBAD8, 0xBAD9, 0xBAFC, 0xBB00, 0xBB04, 0xBB0D, 0xBB0F,
+ 0xBB11, 0xBB18, 0xBB1C, 0xBB20, 0xBB29, 0xBB2B, 0xBB34, 0xBB35,
+ 0xBB36, 0xBB38, 0xBB3B, 0xBB3C, 0xBB3D, 0xBB3E, 0xBB44, 0xBB45,
+ 0xBB47, 0xBB49, 0xBB4D, 0xBB4F, 0xBB50, 0xBB54, 0xBB58, 0xBB61,
+ 0xBB63, 0xBB6C, 0xBB88, 0xBB8C, 0xBB90, 0xBBA4, 0xBBA8, 0xBBAC,
+ 0xBBB4, 0xBBB7, 0xBBC0, 0xBBC4, 0xBBC8, 0xBBD0, 0xBBD3, 0xBBF8,
+ 0xBBF9, 0xBBFC, 0xBBFF, 0xBC00, 0xBC02, 0xBC08, 0xBC09, 0xBC0B,
+ 0xBC0C, 0xBC0D, 0xBC0F, 0xBC11, 0xBC14, 0xBC15, 0xBC16, 0xBC17,
+ 0xBC18, 0xBC1B, 0xBC1C, 0xBC1D, 0xBC1E, 0xBC1F, 0xBC24, 0xBC25,
+ 0xBC27, 0xBC29, 0xBC2D, 0xBC30, 0xBC31, 0xBC34, 0xBC38, 0xBC40,
+ 0xBC41, 0xBC43, 0xBC44, 0xBC45, 0xBC49, 0xBC4C, 0xBC4D, 0xBC50,
+ 0xBC5D, 0xBC84, 0xBC85, 0xBC88, 0xBC8B, 0xBC8C, 0xBC8E, 0xBC94,
+ 0xBC95, 0xBC97, 0xBC99, 0xBC9A, 0xBCA0, 0xBCA1, 0xBCA4, 0xBCA7,
+ 0xBCA8, 0xBCB0, 0xBCB1, 0xBCB3, 0xBCB4, 0xBCB5, 0xBCBC, 0xBCBD,
+ 0xBCC0, 0xBCC4, 0xBCCD, 0xBCCF, 0xBCD0, 0xBCD1, 0xBCD5, 0xBCD8,
+ 0xBCDC, 0xBCF4, 0xBCF5, 0xBCF6, 0xBCF8, 0xBCFC, 0xBD04, 0xBD05,
+ 0xBD07, 0xBD09, 0xBD10, 0xBD14, 0xBD24, 0xBD2C, 0xBD40, 0xBD48,
+ 0xBD49, 0xBD4C, 0xBD50, 0xBD58, 0xBD59, 0xBD64, 0xBD68, 0xBD80,
+ 0xBD81, 0xBD84, 0xBD87, 0xBD88, 0xBD89, 0xBD8A, 0xBD90, 0xBD91,
+ 0xBD93, 0xBD95, 0xBD99, 0xBD9A, 0xBD9C, 0xBDA4, 0xBDB0, 0xBDB8,
+ 0xBDD4, 0xBDD5, 0xBDD8, 0xBDDC, 0xBDE9, 0xBDF0, 0xBDF4, 0xBDF8,
+ 0xBE00, 0xBE03, 0xBE05, 0xBE0C, 0xBE0D, 0xBE10, 0xBE14, 0xBE1C,
+ 0xBE1D, 0xBE1F, 0xBE44, 0xBE45, 0xBE48, 0xBE4C, 0xBE4E, 0xBE54,
+ 0xBE55, 0xBE57, 0xBE59, 0xBE5A, 0xBE5B, 0xBE60, 0xBE61, 0xBE64,
+ 0xBE68, 0xBE6A, 0xBE70, 0xBE71, 0xBE73, 0xBE74, 0xBE75, 0xBE7B,
+ 0xBE7C, 0xBE7D, 0xBE80, 0xBE84, 0xBE8C, 0xBE8D, 0xBE8F, 0xBE90,
+ 0xBE91, 0xBE98, 0xBE99, 0xBEA8, 0xBED0, 0xBED1, 0xBED4, 0xBED7,
+ 0xBED8, 0xBEE0, 0xBEE3, 0xBEE4, 0xBEE5, 0xBEEC, 0xBF01, 0xBF08,
+ 0xBF09, 0xBF18, 0xBF19, 0xBF1B, 0xBF1C, 0xBF1D, 0xBF40, 0xBF41,
+ 0xBF44, 0xBF48, 0xBF50, 0xBF51, 0xBF55, 0xBF94, 0xBFB0, 0xBFC5,
+ 0xBFCC, 0xBFCD, 0xBFD0, 0xBFD4, 0xBFDC, 0xBFDF, 0xBFE1, 0xC03C,
+ 0xC051, 0xC058, 0xC05C, 0xC060, 0xC068, 0xC069, 0xC090, 0xC091,
+ 0xC094, 0xC098, 0xC0A0, 0xC0A1, 0xC0A3, 0xC0A5, 0xC0AC, 0xC0AD,
+ 0xC0AF, 0xC0B0, 0xC0B3, 0xC0B4, 0xC0B5, 0xC0B6, 0xC0BC, 0xC0BD,
+ 0xC0BF, 0xC0C0, 0xC0C1, 0xC0C5, 0xC0C8, 0xC0C9, 0xC0CC, 0xC0D0,
+ 0xC0D8, 0xC0D9, 0xC0DB, 0xC0DC, 0xC0DD, 0xC0E4, 0xC0E5, 0xC0E8,
+ 0xC0EC, 0xC0F4, 0xC0F5, 0xC0F7, 0xC0F9, 0xC100, 0xC104, 0xC108,
+ 0xC110, 0xC115, 0xC11C, 0xC11D, 0xC11E, 0xC11F, 0xC120, 0xC123,
+ 0xC124, 0xC126, 0xC127, 0xC12C, 0xC12D, 0xC12F, 0xC130, 0xC131,
+ 0xC136, 0xC138, 0xC139, 0xC13C, 0xC140, 0xC148, 0xC149, 0xC14B,
+ 0xC14C, 0xC14D, 0xC154, 0xC155, 0xC158, 0xC15C, 0xC164, 0xC165,
+ 0xC167, 0xC168, 0xC169, 0xC170, 0xC174, 0xC178, 0xC185, 0xC18C,
+ 0xC18D, 0xC18E, 0xC190, 0xC194, 0xC196, 0xC19C, 0xC19D, 0xC19F,
+ 0xC1A1, 0xC1A5, 0xC1A8, 0xC1A9, 0xC1AC, 0xC1B0, 0xC1BD, 0xC1C4,
+ 0xC1C8, 0xC1CC, 0xC1D4, 0xC1D7, 0xC1D8, 0xC1E0, 0xC1E4, 0xC1E8,
+ 0xC1F0, 0xC1F1, 0xC1F3, 0xC1FC, 0xC1FD, 0xC200, 0xC204, 0xC20C,
+ 0xC20D, 0xC20F, 0xC211, 0xC218, 0xC219, 0xC21C, 0xC21F, 0xC220,
+ 0xC228, 0xC229, 0xC22B, 0xC22D, 0xC22F, 0xC231, 0xC232, 0xC234,
+ 0xC248, 0xC250, 0xC251, 0xC254, 0xC258, 0xC260, 0xC265, 0xC26C,
+ 0xC26D, 0xC270, 0xC274, 0xC27C, 0xC27D, 0xC27F, 0xC281, 0xC288,
+ 0xC289, 0xC290, 0xC298, 0xC29B, 0xC29D, 0xC2A4, 0xC2A5, 0xC2A8,
+ 0xC2AC, 0xC2AD, 0xC2B4, 0xC2B5, 0xC2B7, 0xC2B9, 0xC2DC, 0xC2DD,
+ 0xC2E0, 0xC2E3, 0xC2E4, 0xC2EB, 0xC2EC, 0xC2ED, 0xC2EF, 0xC2F1,
+ 0xC2F6, 0xC2F8, 0xC2F9, 0xC2FB, 0xC2FC, 0xC300, 0xC308, 0xC309,
+ 0xC30C, 0xC30D, 0xC313, 0xC314, 0xC315, 0xC318, 0xC31C, 0xC324,
+ 0xC325, 0xC328, 0xC329, 0xC345, 0xC368, 0xC369, 0xC36C, 0xC370,
+ 0xC372, 0xC378, 0xC379, 0xC37C, 0xC37D, 0xC384, 0xC388, 0xC38C,
+ 0xC3C0, 0xC3D8, 0xC3D9, 0xC3DC, 0xC3DF, 0xC3E0, 0xC3E2, 0xC3E8,
+ 0xC3E9, 0xC3ED, 0xC3F4, 0xC3F5, 0xC3F8, 0xC408, 0xC410, 0xC424,
+ 0xC42C, 0xC430, 0xC434, 0xC43C, 0xC43D, 0xC448, 0xC464, 0xC465,
+ 0xC468, 0xC46C, 0xC474, 0xC475, 0xC479, 0xC480, 0xC494, 0xC49C,
+ 0xC4B8, 0xC4BC, 0xC4E9, 0xC4F0, 0xC4F1, 0xC4F4, 0xC4F8, 0xC4FA,
+ 0xC4FF, 0xC500, 0xC501, 0xC50C, 0xC510, 0xC514, 0xC51C, 0xC528,
+ 0xC529, 0xC52C, 0xC530, 0xC538, 0xC539, 0xC53B, 0xC53D, 0xC544,
+ 0xC545, 0xC548, 0xC549, 0xC54A, 0xC54C, 0xC54D, 0xC54E, 0xC553,
+ 0xC554, 0xC555, 0xC557, 0xC558, 0xC559, 0xC55D, 0xC55E, 0xC560,
+ 0xC561, 0xC564, 0xC568, 0xC570, 0xC571, 0xC573, 0xC574, 0xC575,
+ 0xC57C, 0xC57D, 0xC580, 0xC584, 0xC587, 0xC58C, 0xC58D, 0xC58F,
+ 0xC591, 0xC595, 0xC597, 0xC598, 0xC59C, 0xC5A0, 0xC5A9, 0xC5B4,
+ 0xC5B5, 0xC5B8, 0xC5B9, 0xC5BB, 0xC5BC, 0xC5BD, 0xC5BE, 0xC5C4,
+ 0xC5C5, 0xC5C6, 0xC5C7, 0xC5C8, 0xC5C9, 0xC5CA, 0xC5CC, 0xC5CE,
+ 0xC5D0, 0xC5D1, 0xC5D4, 0xC5D8, 0xC5E0, 0xC5E1, 0xC5E3, 0xC5E5,
+ 0xC5EC, 0xC5ED, 0xC5EE, 0xC5F0, 0xC5F4, 0xC5F6, 0xC5F7, 0xC5FC,
+ 0xC5FD, 0xC5FE, 0xC5FF, 0xC600, 0xC601, 0xC605, 0xC606, 0xC607,
+ 0xC608, 0xC60C, 0xC610, 0xC618, 0xC619, 0xC61B, 0xC61C, 0xC624,
+ 0xC625, 0xC628, 0xC62C, 0xC62D, 0xC62E, 0xC630, 0xC633, 0xC634,
+ 0xC635, 0xC637, 0xC639, 0xC63B, 0xC640, 0xC641, 0xC644, 0xC648,
+ 0xC650, 0xC651, 0xC653, 0xC654, 0xC655, 0xC65C, 0xC65D, 0xC660,
+ 0xC66C, 0xC66F, 0xC671, 0xC678, 0xC679, 0xC67C, 0xC680, 0xC688,
+ 0xC689, 0xC68B, 0xC68D, 0xC694, 0xC695, 0xC698, 0xC69C, 0xC6A4,
+ 0xC6A5, 0xC6A7, 0xC6A9, 0xC6B0, 0xC6B1, 0xC6B4, 0xC6B8, 0xC6B9,
+ 0xC6BA, 0xC6C0, 0xC6C1, 0xC6C3, 0xC6C5, 0xC6CC, 0xC6CD, 0xC6D0,
+ 0xC6D4, 0xC6DC, 0xC6DD, 0xC6E0, 0xC6E1, 0xC6E8, 0xC6E9, 0xC6EC,
+ 0xC6F0, 0xC6F8, 0xC6F9, 0xC6FD, 0xC704, 0xC705, 0xC708, 0xC70C,
+ 0xC714, 0xC715, 0xC717, 0xC719, 0xC720, 0xC721, 0xC724, 0xC728,
+ 0xC730, 0xC731, 0xC733, 0xC735, 0xC737, 0xC73C, 0xC73D, 0xC740,
+ 0xC744, 0xC74A, 0xC74C, 0xC74D, 0xC74F, 0xC751, 0xC752, 0xC753,
+ 0xC754, 0xC755, 0xC756, 0xC757, 0xC758, 0xC75C, 0xC760, 0xC768,
+ 0xC76B, 0xC774, 0xC775, 0xC778, 0xC77C, 0xC77D, 0xC77E, 0xC783,
+ 0xC784, 0xC785, 0xC787, 0xC788, 0xC789, 0xC78A, 0xC78E, 0xC790,
+ 0xC791, 0xC794, 0xC796, 0xC797, 0xC798, 0xC79A, 0xC7A0, 0xC7A1,
+ 0xC7A3, 0xC7A4, 0xC7A5, 0xC7A6, 0xC7AC, 0xC7AD, 0xC7B0, 0xC7B4,
+ 0xC7BC, 0xC7BD, 0xC7BF, 0xC7C0, 0xC7C1, 0xC7C8, 0xC7C9, 0xC7CC,
+ 0xC7CE, 0xC7D0, 0xC7D8, 0xC7DD, 0xC7E4, 0xC7E8, 0xC7EC, 0xC800,
+ 0xC801, 0xC804, 0xC808, 0xC80A, 0xC810, 0xC811, 0xC813, 0xC815,
+ 0xC816, 0xC81C, 0xC81D, 0xC820, 0xC824, 0xC82C, 0xC82D, 0xC82F,
+ 0xC831, 0xC838, 0xC83C, 0xC840, 0xC848, 0xC849, 0xC84C, 0xC84D,
+ 0xC854, 0xC870, 0xC871, 0xC874, 0xC878, 0xC87A, 0xC880, 0xC881,
+ 0xC883, 0xC885, 0xC886, 0xC887, 0xC88B, 0xC88C, 0xC88D, 0xC894,
+ 0xC89D, 0xC89F, 0xC8A1, 0xC8A8, 0xC8BC, 0xC8BD, 0xC8C4, 0xC8C8,
+ 0xC8CC, 0xC8D4, 0xC8D5, 0xC8D7, 0xC8D9, 0xC8E0, 0xC8E1, 0xC8E4,
+ 0xC8F5, 0xC8FC, 0xC8FD, 0xC900, 0xC904, 0xC905, 0xC906, 0xC90C,
+ 0xC90D, 0xC90F, 0xC911, 0xC918, 0xC92C, 0xC934, 0xC950, 0xC951,
+ 0xC954, 0xC958, 0xC960, 0xC961, 0xC963, 0xC96C, 0xC970, 0xC974,
+ 0xC97C, 0xC988, 0xC989, 0xC98C, 0xC990, 0xC998, 0xC999, 0xC99B,
+ 0xC99D, 0xC9C0, 0xC9C1, 0xC9C4, 0xC9C7, 0xC9C8, 0xC9CA, 0xC9D0,
+ 0xC9D1, 0xC9D3, 0xC9D5, 0xC9D6, 0xC9D9, 0xC9DA, 0xC9DC, 0xC9DD,
+ 0xC9E0, 0xC9E2, 0xC9E4, 0xC9E7, 0xC9EC, 0xC9ED, 0xC9EF, 0xC9F0,
+ 0xC9F1, 0xC9F8, 0xC9F9, 0xC9FC, 0xCA00, 0xCA08, 0xCA09, 0xCA0B,
+ 0xCA0C, 0xCA0D, 0xCA14, 0xCA18, 0xCA29, 0xCA4C, 0xCA4D, 0xCA50,
+ 0xCA54, 0xCA5C, 0xCA5D, 0xCA5F, 0xCA60, 0xCA61, 0xCA68, 0xCA7D,
+ 0xCA84, 0xCA98, 0xCABC, 0xCABD, 0xCAC0, 0xCAC4, 0xCACC, 0xCACD,
+ 0xCACF, 0xCAD1, 0xCAD3, 0xCAD8, 0xCAD9, 0xCAE0, 0xCAEC, 0xCAF4,
+ 0xCB08, 0xCB10, 0xCB14, 0xCB18, 0xCB20, 0xCB21, 0xCB41, 0xCB48,
+ 0xCB49, 0xCB4C, 0xCB50, 0xCB58, 0xCB59, 0xCB5D, 0xCB64, 0xCB78,
+ 0xCB79, 0xCB9C, 0xCBB8, 0xCBD4, 0xCBE4, 0xCBE7, 0xCBE9, 0xCC0C,
+ 0xCC0D, 0xCC10, 0xCC14, 0xCC1C, 0xCC1D, 0xCC21, 0xCC22, 0xCC27,
+ 0xCC28, 0xCC29, 0xCC2C, 0xCC2E, 0xCC30, 0xCC38, 0xCC39, 0xCC3B,
+ 0xCC3C, 0xCC3D, 0xCC3E, 0xCC44, 0xCC45, 0xCC48, 0xCC4C, 0xCC54,
+ 0xCC55, 0xCC57, 0xCC58, 0xCC59, 0xCC60, 0xCC64, 0xCC66, 0xCC68,
+ 0xCC70, 0xCC75, 0xCC98, 0xCC99, 0xCC9C, 0xCCA0, 0xCCA8, 0xCCA9,
+ 0xCCAB, 0xCCAC, 0xCCAD, 0xCCB4, 0xCCB5, 0xCCB8, 0xCCBC, 0xCCC4,
+ 0xCCC5, 0xCCC7, 0xCCC9, 0xCCD0, 0xCCD4, 0xCCE4, 0xCCEC, 0xCCF0,
+ 0xCD01, 0xCD08, 0xCD09, 0xCD0C, 0xCD10, 0xCD18, 0xCD19, 0xCD1B,
+ 0xCD1D, 0xCD24, 0xCD28, 0xCD2C, 0xCD39, 0xCD5C, 0xCD60, 0xCD64,
+ 0xCD6C, 0xCD6D, 0xCD6F, 0xCD71, 0xCD78, 0xCD88, 0xCD94, 0xCD95,
+ 0xCD98, 0xCD9C, 0xCDA4, 0xCDA5, 0xCDA7, 0xCDA9, 0xCDB0, 0xCDC4,
+ 0xCDCC, 0xCDD0, 0xCDE8, 0xCDEC, 0xCDF0, 0xCDF8, 0xCDF9, 0xCDFB,
+ 0xCDFD, 0xCE04, 0xCE08, 0xCE0C, 0xCE14, 0xCE19, 0xCE20, 0xCE21,
+ 0xCE24, 0xCE28, 0xCE30, 0xCE31, 0xCE33, 0xCE35, 0xCE58, 0xCE59,
+ 0xCE5C, 0xCE5F, 0xCE60, 0xCE61, 0xCE68, 0xCE69, 0xCE6B, 0xCE6D,
+ 0xCE74, 0xCE75, 0xCE78, 0xCE7C, 0xCE84, 0xCE85, 0xCE87, 0xCE89,
+ 0xCE90, 0xCE91, 0xCE94, 0xCE98, 0xCEA0, 0xCEA1, 0xCEA3, 0xCEA4,
+ 0xCEA5, 0xCEAC, 0xCEAD, 0xCEC1, 0xCEE4, 0xCEE5, 0xCEE8, 0xCEEB,
+ 0xCEEC, 0xCEF4, 0xCEF5, 0xCEF7, 0xCEF8, 0xCEF9, 0xCF00, 0xCF01,
+ 0xCF04, 0xCF08, 0xCF10, 0xCF11, 0xCF13, 0xCF15, 0xCF1C, 0xCF20,
+ 0xCF24, 0xCF2C, 0xCF2D, 0xCF2F, 0xCF30, 0xCF31, 0xCF38, 0xCF54,
+ 0xCF55, 0xCF58, 0xCF5C, 0xCF64, 0xCF65, 0xCF67, 0xCF69, 0xCF70,
+ 0xCF71, 0xCF74, 0xCF78, 0xCF80, 0xCF85, 0xCF8C, 0xCFA1, 0xCFA8,
+ 0xCFB0, 0xCFC4, 0xCFE0, 0xCFE1, 0xCFE4, 0xCFE8, 0xCFF0, 0xCFF1,
+ 0xCFF3, 0xCFF5, 0xCFFC, 0xD000, 0xD004, 0xD011, 0xD018, 0xD02D,
+ 0xD034, 0xD035, 0xD038, 0xD03C, 0xD044, 0xD045, 0xD047, 0xD049,
+ 0xD050, 0xD054, 0xD058, 0xD060, 0xD06C, 0xD06D, 0xD070, 0xD074,
+ 0xD07C, 0xD07D, 0xD081, 0xD0A4, 0xD0A5, 0xD0A8, 0xD0AC, 0xD0B4,
+ 0xD0B5, 0xD0B7, 0xD0B9, 0xD0C0, 0xD0C1, 0xD0C4, 0xD0C8, 0xD0C9,
+ 0xD0D0, 0xD0D1, 0xD0D3, 0xD0D4, 0xD0D5, 0xD0DC, 0xD0DD, 0xD0E0,
+ 0xD0E4, 0xD0EC, 0xD0ED, 0xD0EF, 0xD0F0, 0xD0F1, 0xD0F8, 0xD10D,
+ 0xD130, 0xD131, 0xD134, 0xD138, 0xD13A, 0xD140, 0xD141, 0xD143,
+ 0xD144, 0xD145, 0xD14C, 0xD14D, 0xD150, 0xD154, 0xD15C, 0xD15D,
+ 0xD15F, 0xD161, 0xD168, 0xD16C, 0xD17C, 0xD184, 0xD188, 0xD1A0,
+ 0xD1A1, 0xD1A4, 0xD1A8, 0xD1B0, 0xD1B1, 0xD1B3, 0xD1B5, 0xD1BA,
+ 0xD1BC, 0xD1C0, 0xD1D8, 0xD1F4, 0xD1F8, 0xD207, 0xD209, 0xD210,
+ 0xD22C, 0xD22D, 0xD230, 0xD234, 0xD23C, 0xD23D, 0xD23F, 0xD241,
+ 0xD248, 0xD25C, 0xD264, 0xD280, 0xD281, 0xD284, 0xD288, 0xD290,
+ 0xD291, 0xD295, 0xD29C, 0xD2A0, 0xD2A4, 0xD2AC, 0xD2B1, 0xD2B8,
+ 0xD2B9, 0xD2BC, 0xD2BF, 0xD2C0, 0xD2C2, 0xD2C8, 0xD2C9, 0xD2CB,
+ 0xD2D4, 0xD2D8, 0xD2DC, 0xD2E4, 0xD2E5, 0xD2F0, 0xD2F1, 0xD2F4,
+ 0xD2F8, 0xD300, 0xD301, 0xD303, 0xD305, 0xD30C, 0xD30D, 0xD30E,
+ 0xD310, 0xD314, 0xD316, 0xD31C, 0xD31D, 0xD31F, 0xD320, 0xD321,
+ 0xD325, 0xD328, 0xD329, 0xD32C, 0xD330, 0xD338, 0xD339, 0xD33B,
+ 0xD33C, 0xD33D, 0xD344, 0xD345, 0xD37C, 0xD37D, 0xD380, 0xD384,
+ 0xD38C, 0xD38D, 0xD38F, 0xD390, 0xD391, 0xD398, 0xD399, 0xD39C,
+ 0xD3A0, 0xD3A8, 0xD3A9, 0xD3AB, 0xD3AD, 0xD3B4, 0xD3B8, 0xD3BC,
+ 0xD3C4, 0xD3C5, 0xD3C8, 0xD3C9, 0xD3D0, 0xD3D8, 0xD3E1, 0xD3E3,
+ 0xD3EC, 0xD3ED, 0xD3F0, 0xD3F4, 0xD3FC, 0xD3FD, 0xD3FF, 0xD401,
+ 0xD408, 0xD41D, 0xD440, 0xD444, 0xD45C, 0xD460, 0xD464, 0xD46D,
+ 0xD46F, 0xD478, 0xD479, 0xD47C, 0xD47F, 0xD480, 0xD482, 0xD488,
+ 0xD489, 0xD48B, 0xD48D, 0xD494, 0xD4A9, 0xD4CC, 0xD4D0, 0xD4D4,
+ 0xD4DC, 0xD4DF, 0xD4E8, 0xD4EC, 0xD4F0, 0xD4F8, 0xD4FB, 0xD4FD,
+ 0xD504, 0xD508, 0xD50C, 0xD514, 0xD515, 0xD517, 0xD53C, 0xD53D,
+ 0xD540, 0xD544, 0xD54C, 0xD54D, 0xD54F, 0xD551, 0xD558, 0xD559,
+ 0xD55C, 0xD560, 0xD565, 0xD568, 0xD569, 0xD56B, 0xD56D, 0xD574,
+ 0xD575, 0xD578, 0xD57C, 0xD584, 0xD585, 0xD587, 0xD588, 0xD589,
+ 0xD590, 0xD5A5, 0xD5C8, 0xD5C9, 0xD5CC, 0xD5D0, 0xD5D2, 0xD5D8,
+ 0xD5D9, 0xD5DB, 0xD5DD, 0xD5E4, 0xD5E5, 0xD5E8, 0xD5EC, 0xD5F4,
+ 0xD5F5, 0xD5F7, 0xD5F9, 0xD600, 0xD601, 0xD604, 0xD608, 0xD610,
+ 0xD611, 0xD613, 0xD614, 0xD615, 0xD61C, 0xD620, 0xD624, 0xD62D,
+ 0xD638, 0xD639, 0xD63C, 0xD640, 0xD645, 0xD648, 0xD649, 0xD64B,
+ 0xD64D, 0xD651, 0xD654, 0xD655, 0xD658, 0xD65C, 0xD667, 0xD669,
+ 0xD670, 0xD671, 0xD674, 0xD683, 0xD685, 0xD68C, 0xD68D, 0xD690,
+ 0xD694, 0xD69D, 0xD69F, 0xD6A1, 0xD6A8, 0xD6AC, 0xD6B0, 0xD6B9,
+ 0xD6BB, 0xD6C4, 0xD6C5, 0xD6C8, 0xD6CC, 0xD6D1, 0xD6D4, 0xD6D7,
+ 0xD6D9, 0xD6E0, 0xD6E4, 0xD6E8, 0xD6F0, 0xD6F5, 0xD6FC, 0xD6FD,
+ 0xD700, 0xD704, 0xD711, 0xD718, 0xD719, 0xD71C, 0xD720, 0xD728,
+ 0xD729, 0xD72B, 0xD72D, 0xD734, 0xD735, 0xD738, 0xD73C, 0xD744,
+ 0xD747, 0xD749, 0xD750, 0xD751, 0xD754, 0xD756, 0xD757, 0xD758,
+ 0xD759, 0xD760, 0xD761, 0xD763, 0xD765, 0xD769, 0xD76C, 0xD770,
+ 0xD774, 0xD77C, 0xD77D, 0xD781, 0xD788, 0xD789, 0xD78C, 0xD790,
+ 0xD798, 0xD799, 0xD79B, 0xD79D, 0x4F3D, 0x4F73, 0x5047, 0x50F9,
+ 0x52A0, 0x53EF, 0x5475, 0x54E5, 0x5609, 0x5AC1, 0x5BB6, 0x6687,
+ 0x67B6, 0x67B7, 0x67EF, 0x6B4C, 0x73C2, 0x75C2, 0x7A3C, 0x82DB,
+ 0x8304, 0x8857, 0x8888, 0x8A36, 0x8CC8, 0x8DCF, 0x8EFB, 0x8FE6,
+ 0x99D5, 0x523B, 0x5374, 0x5404, 0x606A, 0x6164, 0x6BBC, 0x73CF,
+ 0x811A, 0x89BA, 0x89D2, 0x95A3, 0x4F83, 0x520A, 0x58BE, 0x5978,
+ 0x59E6, 0x5E72, 0x5E79, 0x61C7, 0x63C0, 0x6746, 0x67EC, 0x687F,
+ 0x6F97, 0x764E, 0x770B, 0x78F5, 0x7A08, 0x7AFF, 0x7C21, 0x809D,
+ 0x826E, 0x8271, 0x8AEB, 0x9593, 0x4E6B, 0x559D, 0x66F7, 0x6E34,
+ 0x78A3, 0x7AED, 0x845B, 0x8910, 0x874E, 0x97A8, 0x52D8, 0x574E,
+ 0x582A, 0x5D4C, 0x611F, 0x61BE, 0x6221, 0x6562, 0x67D1, 0x6A44,
+ 0x6E1B, 0x7518, 0x75B3, 0x76E3, 0x77B0, 0x7D3A, 0x90AF, 0x9451,
+ 0x9452, 0x9F95, 0x5323, 0x5CAC, 0x7532, 0x80DB, 0x9240, 0x9598,
+ 0x525B, 0x5808, 0x59DC, 0x5CA1, 0x5D17, 0x5EB7, 0x5F3A, 0x5F4A,
+ 0x6177, 0x6C5F, 0x757A, 0x7586, 0x7CE0, 0x7D73, 0x7DB1, 0x7F8C,
+ 0x8154, 0x8221, 0x8591, 0x8941, 0x8B1B, 0x92FC, 0x964D, 0x9C47,
+ 0x4ECB, 0x4EF7, 0x500B, 0x51F1, 0x584F, 0x6137, 0x613E, 0x6168,
+ 0x6539, 0x69EA, 0x6F11, 0x75A5, 0x7686, 0x76D6, 0x7B87, 0x82A5,
+ 0x84CB, 0x93A7, 0x958B, 0x5580, 0x5BA2, 0x5751, 0x7CB3, 0x7FB9,
+ 0x91B5, 0x5028, 0x53BB, 0x5C45, 0x5DE8, 0x62D2, 0x636E, 0x64DA,
+ 0x64E7, 0x6E20, 0x70AC, 0x795B, 0x8DDD, 0x8E1E, 0x907D, 0x9245,
+ 0x92F8, 0x4E7E, 0x4EF6, 0x5065, 0x5DFE, 0x5EFA, 0x6106, 0x6957,
+ 0x8171, 0x8654, 0x8E47, 0x9375, 0x9A2B, 0x4E5E, 0x5091, 0x6770,
+ 0x6840, 0x5109, 0x528D, 0x5292, 0x6AA2, 0x77BC, 0x9210, 0x9ED4,
+ 0x52AB, 0x602F, 0x8FF2, 0x5048, 0x61A9, 0x63ED, 0x64CA, 0x683C,
+ 0x6A84, 0x6FC0, 0x8188, 0x89A1, 0x9694, 0x5805, 0x727D, 0x72AC,
+ 0x7504, 0x7D79, 0x7E6D, 0x80A9, 0x898B, 0x8B74, 0x9063, 0x9D51,
+ 0x6289, 0x6C7A, 0x6F54, 0x7D50, 0x7F3A, 0x8A23, 0x517C, 0x614A,
+ 0x7B9D, 0x8B19, 0x9257, 0x938C, 0x4EAC, 0x4FD3, 0x501E, 0x50BE,
+ 0x5106, 0x52C1, 0x52CD, 0x537F, 0x5770, 0x5883, 0x5E9A, 0x5F91,
+ 0x6176, 0x61AC, 0x64CE, 0x656C, 0x666F, 0x66BB, 0x66F4, 0x6897,
+ 0x6D87, 0x7085, 0x70F1, 0x749F, 0x74A5, 0x74CA, 0x75D9, 0x786C,
+ 0x78EC, 0x7ADF, 0x7AF6, 0x7D45, 0x7D93, 0x8015, 0x803F, 0x811B,
+ 0x8396, 0x8B66, 0x8F15, 0x9015, 0x93E1, 0x9803, 0x9838, 0x9A5A,
+ 0x9BE8, 0x4FC2, 0x5553, 0x583A, 0x5951, 0x5B63, 0x5C46, 0x60B8,
+ 0x6212, 0x6842, 0x68B0, 0x68E8, 0x6EAA, 0x754C, 0x7678, 0x78CE,
+ 0x7A3D, 0x7CFB, 0x7E6B, 0x7E7C, 0x8A08, 0x8AA1, 0x8C3F, 0x968E,
+ 0x9DC4, 0x53E4, 0x53E9, 0x544A, 0x5471, 0x56FA, 0x59D1, 0x5B64,
+ 0x5C3B, 0x5EAB, 0x62F7, 0x6537, 0x6545, 0x6572, 0x66A0, 0x67AF,
+ 0x69C1, 0x6CBD, 0x75FC, 0x7690, 0x777E, 0x7A3F, 0x7F94, 0x8003,
+ 0x80A1, 0x818F, 0x82E6, 0x82FD, 0x83F0, 0x85C1, 0x8831, 0x88B4,
+ 0x8AA5, 0x8F9C, 0x932E, 0x96C7, 0x9867, 0x9AD8, 0x9F13, 0x54ED,
+ 0x659B, 0x66F2, 0x688F, 0x7A40, 0x8C37, 0x9D60, 0x56F0, 0x5764,
+ 0x5D11, 0x6606, 0x68B1, 0x68CD, 0x6EFE, 0x7428, 0x889E, 0x9BE4,
+ 0x6C68, 0x9AA8, 0x4F9B, 0x516C, 0x5171, 0x529F, 0x5B54, 0x5DE5,
+ 0x6050, 0x606D, 0x62F1, 0x63A7, 0x653B, 0x73D9, 0x7A7A, 0x86A3,
+ 0x8CA2, 0x978F, 0x4E32, 0x5BE1, 0x6208, 0x679C, 0x74DC, 0x79D1,
+ 0x83D3, 0x8A87, 0x8AB2, 0x8DE8, 0x904E, 0x934B, 0x9846, 0x5ED3,
+ 0x69E8, 0x85FF, 0x90ED, 0x51A0, 0x5B98, 0x5BEC, 0x6163, 0x68FA,
+ 0x6B3E, 0x704C, 0x742F, 0x74D8, 0x7BA1, 0x7F50, 0x83C5, 0x89C0,
+ 0x8CAB, 0x95DC, 0x9928, 0x522E, 0x605D, 0x62EC, 0x9002, 0x4F8A,
+ 0x5149, 0x5321, 0x58D9, 0x5EE3, 0x66E0, 0x6D38, 0x709A, 0x72C2,
+ 0x73D6, 0x7B50, 0x80F1, 0x945B, 0x5366, 0x639B, 0x7F6B, 0x4E56,
+ 0x5080, 0x584A, 0x58DE, 0x602A, 0x6127, 0x62D0, 0x69D0, 0x9B41,
+ 0x5B8F, 0x7D18, 0x80B1, 0x8F5F, 0x4EA4, 0x50D1, 0x54AC, 0x55AC,
+ 0x5B0C, 0x5DA0, 0x5DE7, 0x652A, 0x654E, 0x6821, 0x6A4B, 0x72E1,
+ 0x768E, 0x77EF, 0x7D5E, 0x7FF9, 0x81A0, 0x854E, 0x86DF, 0x8F03,
+ 0x8F4E, 0x90CA, 0x9903, 0x9A55, 0x9BAB, 0x4E18, 0x4E45, 0x4E5D,
+ 0x4EC7, 0x4FF1, 0x5177, 0x52FE, 0x5340, 0x53E3, 0x53E5, 0x548E,
+ 0x5614, 0x5775, 0x57A2, 0x5BC7, 0x5D87, 0x5ED0, 0x61FC, 0x62D8,
+ 0x6551, 0x67B8, 0x67E9, 0x69CB, 0x6B50, 0x6BC6, 0x6BEC, 0x6C42,
+ 0x6E9D, 0x7078, 0x72D7, 0x7396, 0x7403, 0x77BF, 0x77E9, 0x7A76,
+ 0x7D7F, 0x8009, 0x81FC, 0x8205, 0x820A, 0x82DF, 0x8862, 0x8B33,
+ 0x8CFC, 0x8EC0, 0x9011, 0x90B1, 0x9264, 0x92B6, 0x99D2, 0x9A45,
+ 0x9CE9, 0x9DD7, 0x9F9C, 0x570B, 0x5C40, 0x83CA, 0x97A0, 0x97AB,
+ 0x9EB4, 0x541B, 0x7A98, 0x7FA4, 0x88D9, 0x8ECD, 0x90E1, 0x5800,
+ 0x5C48, 0x6398, 0x7A9F, 0x5BAE, 0x5F13, 0x7A79, 0x7AAE, 0x828E,
+ 0x8EAC, 0x5026, 0x5238, 0x52F8, 0x5377, 0x5708, 0x62F3, 0x6372,
+ 0x6B0A, 0x6DC3, 0x7737, 0x53A5, 0x7357, 0x8568, 0x8E76, 0x95D5,
+ 0x673A, 0x6AC3, 0x6F70, 0x8A6D, 0x8ECC, 0x994B, 0x6677, 0x6B78,
+ 0x8CB4, 0x9B3C, 0x53EB, 0x572D, 0x594E, 0x63C6, 0x69FB, 0x73EA,
+ 0x7845, 0x7ABA, 0x7AC5, 0x7CFE, 0x8475, 0x898F, 0x8D73, 0x9035,
+ 0x95A8, 0x52FB, 0x5747, 0x7547, 0x7B60, 0x83CC, 0x921E, 0x6A58,
+ 0x514B, 0x524B, 0x5287, 0x621F, 0x68D8, 0x6975, 0x9699, 0x50C5,
+ 0x52A4, 0x52E4, 0x61C3, 0x65A4, 0x6839, 0x69FF, 0x747E, 0x7B4B,
+ 0x82B9, 0x83EB, 0x89B2, 0x8B39, 0x8FD1, 0x9949, 0x4ECA, 0x5997,
+ 0x64D2, 0x6611, 0x6A8E, 0x7434, 0x7981, 0x79BD, 0x82A9, 0x887E,
+ 0x887F, 0x895F, 0x9326, 0x4F0B, 0x53CA, 0x6025, 0x6271, 0x6C72,
+ 0x7D1A, 0x7D66, 0x4E98, 0x5162, 0x77DC, 0x80AF, 0x4F01, 0x4F0E,
+ 0x5176, 0x5180, 0x55DC, 0x5668, 0x573B, 0x57FA, 0x57FC, 0x5914,
+ 0x5947, 0x5993, 0x5BC4, 0x5C90, 0x5D0E, 0x5DF1, 0x5E7E, 0x5FCC,
+ 0x6280, 0x65D7, 0x65E3, 0x671E, 0x671F, 0x675E, 0x68CB, 0x68C4,
+ 0x6A5F, 0x6B3A, 0x6C23, 0x6C7D, 0x6C82, 0x6DC7, 0x7398, 0x7426,
+ 0x742A, 0x7482, 0x74A3, 0x7578, 0x757F, 0x7881, 0x78EF, 0x7941,
+ 0x7947, 0x7948, 0x797A, 0x7B95, 0x7D00, 0x7DBA, 0x7F88, 0x8006,
+ 0x802D, 0x808C, 0x8A18, 0x8B4F, 0x8C48, 0x8D77, 0x9321, 0x9324,
+ 0x98E2, 0x9951, 0x9A0E, 0x9A0F, 0x9A65, 0x9E92, 0x7DCA, 0x4F76,
+ 0x5409, 0x62EE, 0x6854, 0x91D1, 0x55AB, 0x513A, 0x5A1C, 0x61E6,
+ 0x62CF, 0x62FF, 0x90A3, 0x8AFE, 0x6696, 0x7156, 0x96E3, 0x634F,
+ 0x637A, 0x5357, 0x678F, 0x6960, 0x6E73, 0x7537, 0x7D0D, 0x8872,
+ 0x56CA, 0x5A18, 0x4E43, 0x5167, 0x5948, 0x67F0, 0x8010, 0x5973,
+ 0x5E74, 0x649A, 0x79CA, 0x5FF5, 0x606C, 0x62C8, 0x637B, 0x5BE7,
+ 0x5BD7, 0x52AA, 0x5974, 0x5F29, 0x6012, 0x7459, 0x99D1, 0x6FC3,
+ 0x81BF, 0x8FB2, 0x60F1, 0x8166, 0x5C3F, 0x5AE9, 0x8A25, 0x677B,
+ 0x7D10, 0x80FD, 0x5C3C, 0x6CE5, 0x533F, 0x6EBA, 0x591A, 0x8336,
+ 0x4E39, 0x4EB6, 0x4F46, 0x55AE, 0x5718, 0x58C7, 0x5F56, 0x65B7,
+ 0x65E6, 0x6A80, 0x6BB5, 0x6E4D, 0x77ED, 0x7AEF, 0x7C1E, 0x7DDE,
+ 0x86CB, 0x8892, 0x9132, 0x935B, 0x64BB, 0x6FBE, 0x737A, 0x75B8,
+ 0x9054, 0x5556, 0x574D, 0x61BA, 0x64D4, 0x66C7, 0x6DE1, 0x6E5B,
+ 0x6F6D, 0x6FB9, 0x75F0, 0x8043, 0x81BD, 0x8541, 0x8983, 0x8AC7,
+ 0x8B5A, 0x931F, 0x6C93, 0x7553, 0x7B54, 0x8E0F, 0x905D, 0x5510,
+ 0x5802, 0x5858, 0x5E62, 0x6207, 0x649E, 0x68E0, 0x7576, 0x7CD6,
+ 0x87B3, 0x9EE8, 0x4EE3, 0x5788, 0x576E, 0x5927, 0x5C0D, 0x5CB1,
+ 0x5E36, 0x5F85, 0x6234, 0x64E1, 0x73B3, 0x81FA, 0x888B, 0x8CB8,
+ 0x968A, 0x9EDB, 0x5B85, 0x5FB7, 0x60B3, 0x5012, 0x5200, 0x5230,
+ 0x5716, 0x5835, 0x5857, 0x5C0E, 0x5C60, 0x5CF6, 0x5D8B, 0x5EA6,
+ 0x5F92, 0x60BC, 0x6311, 0x6389, 0x6417, 0x6843, 0x68F9, 0x6AC2,
+ 0x6DD8, 0x6E21, 0x6ED4, 0x6FE4, 0x71FE, 0x76DC, 0x7779, 0x79B1,
+ 0x7A3B, 0x8404, 0x89A9, 0x8CED, 0x8DF3, 0x8E48, 0x9003, 0x9014,
+ 0x9053, 0x90FD, 0x934D, 0x9676, 0x97DC, 0x6BD2, 0x7006, 0x7258,
+ 0x72A2, 0x7368, 0x7763, 0x79BF, 0x7BE4, 0x7E9B, 0x8B80, 0x58A9,
+ 0x60C7, 0x6566, 0x65FD, 0x66BE, 0x6C8C, 0x711E, 0x71C9, 0x8C5A,
+ 0x9813, 0x4E6D, 0x7A81, 0x4EDD, 0x51AC, 0x51CD, 0x52D5, 0x540C,
+ 0x61A7, 0x6771, 0x6850, 0x68DF, 0x6D1E, 0x6F7C, 0x75BC, 0x77B3,
+ 0x7AE5, 0x80F4, 0x8463, 0x9285, 0x515C, 0x6597, 0x675C, 0x6793,
+ 0x75D8, 0x7AC7, 0x8373, 0x8C46, 0x9017, 0x982D, 0x5C6F, 0x81C0,
+ 0x829A, 0x9041, 0x906F, 0x920D, 0x5F97, 0x5D9D, 0x6A59, 0x71C8,
+ 0x767B, 0x7B49, 0x85E4, 0x8B04, 0x9127, 0x9A30, 0x5587, 0x61F6,
+ 0x7669, 0x7F85, 0x863F, 0x87BA, 0x88F8, 0x908F, 0x6D1B, 0x70D9,
+ 0x73DE, 0x7D61, 0x843D, 0x916A, 0x99F1, 0x4E82, 0x5375, 0x6B04,
+ 0x6B12, 0x703E, 0x721B, 0x862D, 0x9E1E, 0x524C, 0x8FA3, 0x5D50,
+ 0x64E5, 0x652C, 0x6B16, 0x6FEB, 0x7C43, 0x7E9C, 0x85CD, 0x8964,
+ 0x89BD, 0x62C9, 0x81D8, 0x881F, 0x5ECA, 0x6717, 0x6D6A, 0x72FC,
+ 0x7405, 0x746F, 0x8782, 0x90DE, 0x4F86, 0x5D0D, 0x5FA0, 0x840A,
+ 0x51B7, 0x63A0, 0x7565, 0x4EAE, 0x5006, 0x5169, 0x51C9, 0x6881,
+ 0x6A11, 0x7CAE, 0x7CB1, 0x7CE7, 0x826F, 0x8AD2, 0x8F1B, 0x91CF,
+ 0x4FB6, 0x5137, 0x52F5, 0x5442, 0x5EEC, 0x616E, 0x623E, 0x65C5,
+ 0x6ADA, 0x6FFE, 0x792A, 0x85DC, 0x8823, 0x95AD, 0x9A62, 0x9A6A,
+ 0x9E97, 0x9ECE, 0x529B, 0x66C6, 0x6B77, 0x701D, 0x792B, 0x8F62,
+ 0x9742, 0x6190, 0x6200, 0x6523, 0x6F23, 0x7149, 0x7489, 0x7DF4,
+ 0x806F, 0x84EE, 0x8F26, 0x9023, 0x934A, 0x51BD, 0x5217, 0x52A3,
+ 0x6D0C, 0x70C8, 0x88C2, 0x5EC9, 0x6582, 0x6BAE, 0x6FC2, 0x7C3E,
+ 0x7375, 0x4EE4, 0x4F36, 0x56F9, 0x5CBA, 0x5DBA, 0x601C, 0x73B2,
+ 0x7B2D, 0x7F9A, 0x7FCE, 0x8046, 0x901E, 0x9234, 0x96F6, 0x9748,
+ 0x9818, 0x9F61, 0x4F8B, 0x6FA7, 0x79AE, 0x91B4, 0x96B7, 0x52DE,
+ 0x6488, 0x64C4, 0x6AD3, 0x6F5E, 0x7018, 0x7210, 0x76E7, 0x8001,
+ 0x8606, 0x865C, 0x8DEF, 0x8F05, 0x9732, 0x9B6F, 0x9DFA, 0x9E75,
+ 0x788C, 0x797F, 0x7DA0, 0x83C9, 0x9304, 0x9E7F, 0x9E93, 0x8AD6,
+ 0x58DF, 0x5F04, 0x6727, 0x7027, 0x74CF, 0x7C60, 0x807E, 0x5121,
+ 0x7028, 0x7262, 0x78CA, 0x8CC2, 0x8CDA, 0x8CF4, 0x96F7, 0x4E86,
+ 0x50DA, 0x5BEE, 0x5ED6, 0x6599, 0x71CE, 0x7642, 0x77AD, 0x804A,
+ 0x84FC, 0x907C, 0x9B27, 0x9F8D, 0x58D8, 0x5A41, 0x5C62, 0x6A13,
+ 0x6DDA, 0x6F0F, 0x763B, 0x7D2F, 0x7E37, 0x851E, 0x8938, 0x93E4,
+ 0x964B, 0x5289, 0x65D2, 0x67F3, 0x69B4, 0x6D41, 0x6E9C, 0x700F,
+ 0x7409, 0x7460, 0x7559, 0x7624, 0x786B, 0x8B2C, 0x985E, 0x516D,
+ 0x622E, 0x9678, 0x4F96, 0x502B, 0x5D19, 0x6DEA, 0x7DB8, 0x8F2A,
+ 0x5F8B, 0x6144, 0x6817, 0x9686, 0x52D2, 0x808B, 0x51DC, 0x51CC,
+ 0x695E, 0x7A1C, 0x7DBE, 0x83F1, 0x9675, 0x4FDA, 0x5229, 0x5398,
+ 0x540F, 0x550E, 0x5C65, 0x60A7, 0x674E, 0x68A8, 0x6D6C, 0x7281,
+ 0x72F8, 0x7406, 0x7483, 0x75E2, 0x7C6C, 0x7F79, 0x7FB8, 0x8389,
+ 0x88CF, 0x88E1, 0x91CC, 0x91D0, 0x96E2, 0x9BC9, 0x541D, 0x6F7E,
+ 0x71D0, 0x7498, 0x85FA, 0x8EAA, 0x96A3, 0x9C57, 0x9E9F, 0x6797,
+ 0x6DCB, 0x7433, 0x81E8, 0x9716, 0x782C, 0x7ACB, 0x7B20, 0x7C92,
+ 0x6469, 0x746A, 0x75F2, 0x78BC, 0x78E8, 0x99AC, 0x9B54, 0x9EBB,
+ 0x5BDE, 0x5E55, 0x6F20, 0x819C, 0x83AB, 0x9088, 0x4E07, 0x534D,
+ 0x5A29, 0x5DD2, 0x5F4E, 0x6162, 0x633D, 0x6669, 0x66FC, 0x6EFF,
+ 0x6F2B, 0x7063, 0x779E, 0x842C, 0x8513, 0x883B, 0x8F13, 0x9945,
+ 0x9C3B, 0x551C, 0x62B9, 0x672B, 0x6CAB, 0x8309, 0x896A, 0x977A,
+ 0x4EA1, 0x5984, 0x5FD8, 0x5FD9, 0x671B, 0x7DB2, 0x7F54, 0x8292,
+ 0x832B, 0x83BD, 0x8F1E, 0x9099, 0x57CB, 0x59B9, 0x5A92, 0x5BD0,
+ 0x6627, 0x679A, 0x6885, 0x6BCF, 0x7164, 0x7F75, 0x8CB7, 0x8CE3,
+ 0x9081, 0x9B45, 0x8108, 0x8C8A, 0x964C, 0x9A40, 0x9EA5, 0x5B5F,
+ 0x6C13, 0x731B, 0x76F2, 0x76DF, 0x840C, 0x51AA, 0x8993, 0x514D,
+ 0x5195, 0x52C9, 0x68C9, 0x6C94, 0x7704, 0x7720, 0x7DBF, 0x7DEC,
+ 0x9762, 0x9EB5, 0x6EC5, 0x8511, 0x51A5, 0x540D, 0x547D, 0x660E,
+ 0x669D, 0x6927, 0x6E9F, 0x76BF, 0x7791, 0x8317, 0x84C2, 0x879F,
+ 0x9169, 0x9298, 0x9CF4, 0x8882, 0x4FAE, 0x5192, 0x52DF, 0x59C6,
+ 0x5E3D, 0x6155, 0x6478, 0x6479, 0x66AE, 0x67D0, 0x6A21, 0x6BCD,
+ 0x6BDB, 0x725F, 0x7261, 0x7441, 0x7738, 0x77DB, 0x8017, 0x82BC,
+ 0x8305, 0x8B00, 0x8B28, 0x8C8C, 0x6728, 0x6C90, 0x7267, 0x76EE,
+ 0x7766, 0x7A46, 0x9DA9, 0x6B7F, 0x6C92, 0x5922, 0x6726, 0x8499,
+ 0x536F, 0x5893, 0x5999, 0x5EDF, 0x63CF, 0x6634, 0x6773, 0x6E3A,
+ 0x732B, 0x7AD7, 0x82D7, 0x9328, 0x52D9, 0x5DEB, 0x61AE, 0x61CB,
+ 0x620A, 0x62C7, 0x64AB, 0x65E0, 0x6959, 0x6B66, 0x6BCB, 0x7121,
+ 0x73F7, 0x755D, 0x7E46, 0x821E, 0x8302, 0x856A, 0x8AA3, 0x8CBF,
+ 0x9727, 0x9D61, 0x58A8, 0x9ED8, 0x5011, 0x520E, 0x543B, 0x554F,
+ 0x6587, 0x6C76, 0x7D0A, 0x7D0B, 0x805E, 0x868A, 0x9580, 0x96EF,
+ 0x52FF, 0x6C95, 0x7269, 0x5473, 0x5A9A, 0x5C3E, 0x5D4B, 0x5F4C,
+ 0x5FAE, 0x672A, 0x68B6, 0x6963, 0x6E3C, 0x6E44, 0x7709, 0x7C73,
+ 0x7F8E, 0x8587, 0x8B0E, 0x8FF7, 0x9761, 0x9EF4, 0x5CB7, 0x60B6,
+ 0x610D, 0x61AB, 0x654F, 0x65FB, 0x65FC, 0x6C11, 0x6CEF, 0x739F,
+ 0x73C9, 0x7DE1, 0x9594, 0x5BC6, 0x871C, 0x8B10, 0x525D, 0x535A,
+ 0x62CD, 0x640F, 0x64B2, 0x6734, 0x6A38, 0x6CCA, 0x73C0, 0x749E,
+ 0x7B94, 0x7C95, 0x7E1B, 0x818A, 0x8236, 0x8584, 0x8FEB, 0x96F9,
+ 0x99C1, 0x4F34, 0x534A, 0x53CD, 0x53DB, 0x62CC, 0x642C, 0x6500,
+ 0x6591, 0x69C3, 0x6CEE, 0x6F58, 0x73ED, 0x7554, 0x7622, 0x76E4,
+ 0x76FC, 0x78D0, 0x78FB, 0x792C, 0x7D46, 0x822C, 0x87E0, 0x8FD4,
+ 0x9812, 0x98EF, 0x52C3, 0x62D4, 0x64A5, 0x6E24, 0x6F51, 0x767C,
+ 0x8DCB, 0x91B1, 0x9262, 0x9AEE, 0x9B43, 0x5023, 0x508D, 0x574A,
+ 0x59A8, 0x5C28, 0x5E47, 0x5F77, 0x623F, 0x653E, 0x65B9, 0x65C1,
+ 0x6609, 0x678B, 0x699C, 0x6EC2, 0x78C5, 0x7D21, 0x80AA, 0x8180,
+ 0x822B, 0x82B3, 0x84A1, 0x868C, 0x8A2A, 0x8B17, 0x90A6, 0x9632,
+ 0x9F90, 0x500D, 0x4FF3, 0x57F9, 0x5F98, 0x62DC, 0x6392, 0x676F,
+ 0x6E43, 0x7119, 0x76C3, 0x80CC, 0x80DA, 0x88F4, 0x88F5, 0x8919,
+ 0x8CE0, 0x8F29, 0x914D, 0x966A, 0x4F2F, 0x4F70, 0x5E1B, 0x67CF,
+ 0x6822, 0x767D, 0x767E, 0x9B44, 0x5E61, 0x6A0A, 0x7169, 0x71D4,
+ 0x756A, 0x7E41, 0x8543, 0x85E9, 0x98DC, 0x4F10, 0x7B4F, 0x7F70,
+ 0x95A5, 0x51E1, 0x5E06, 0x68B5, 0x6C3E, 0x6C4E, 0x6CDB, 0x72AF,
+ 0x7BC4, 0x8303, 0x6CD5, 0x743A, 0x50FB, 0x5288, 0x58C1, 0x64D8,
+ 0x6A97, 0x74A7, 0x7656, 0x78A7, 0x8617, 0x95E2, 0x9739, 0x535E,
+ 0x5F01, 0x8B8A, 0x8FA8, 0x8FAF, 0x908A, 0x5225, 0x77A5, 0x9C49,
+ 0x9F08, 0x4E19, 0x5002, 0x5175, 0x5C5B, 0x5E77, 0x661E, 0x663A,
+ 0x67C4, 0x68C5, 0x70B3, 0x7501, 0x75C5, 0x79C9, 0x7ADD, 0x8F27,
+ 0x9920, 0x9A08, 0x4FDD, 0x5821, 0x5831, 0x5BF6, 0x666E, 0x6B65,
+ 0x6D11, 0x6E7A, 0x6F7D, 0x73E4, 0x752B, 0x83E9, 0x88DC, 0x8913,
+ 0x8B5C, 0x8F14, 0x4F0F, 0x50D5, 0x5310, 0x535C, 0x5B93, 0x5FA9,
+ 0x670D, 0x798F, 0x8179, 0x832F, 0x8514, 0x8907, 0x8986, 0x8F39,
+ 0x8F3B, 0x99A5, 0x9C12, 0x672C, 0x4E76, 0x4FF8, 0x5949, 0x5C01,
+ 0x5CEF, 0x5CF0, 0x6367, 0x68D2, 0x70FD, 0x71A2, 0x742B, 0x7E2B,
+ 0x84EC, 0x8702, 0x9022, 0x92D2, 0x9CF3, 0x4E0D, 0x4ED8, 0x4FEF,
+ 0x5085, 0x5256, 0x526F, 0x5426, 0x5490, 0x57E0, 0x592B, 0x5A66,
+ 0x5B5A, 0x5B75, 0x5BCC, 0x5E9C, 0x6276, 0x6577, 0x65A7, 0x6D6E,
+ 0x6EA5, 0x7236, 0x7B26, 0x7C3F, 0x7F36, 0x8150, 0x8151, 0x819A,
+ 0x8240, 0x8299, 0x83A9, 0x8A03, 0x8CA0, 0x8CE6, 0x8CFB, 0x8D74,
+ 0x8DBA, 0x90E8, 0x91DC, 0x961C, 0x9644, 0x99D9, 0x9CE7, 0x5317,
+ 0x5206, 0x5429, 0x5674, 0x58B3, 0x5954, 0x596E, 0x5FFF, 0x61A4,
+ 0x626E, 0x6610, 0x6C7E, 0x711A, 0x76C6, 0x7C89, 0x7CDE, 0x7D1B,
+ 0x82AC, 0x8CC1, 0x96F0, 0x4F5B, 0x5F17, 0x5F7F, 0x62C2, 0x5D29,
+ 0x670B, 0x68DA, 0x787C, 0x7E43, 0x9D6C, 0x4E15, 0x5099, 0x5315,
+ 0x532A, 0x5351, 0x5983, 0x5A62, 0x5E87, 0x60B2, 0x618A, 0x6249,
+ 0x6279, 0x6590, 0x6787, 0x69A7, 0x6BD4, 0x6BD6, 0x6BD7, 0x6BD8,
+ 0x6CB8, 0x7435, 0x75FA, 0x7812, 0x7891, 0x79D5, 0x79D8, 0x7C83,
+ 0x7DCB, 0x7FE1, 0x80A5, 0x813E, 0x81C2, 0x83F2, 0x871A, 0x88E8,
+ 0x8AB9, 0x8B6C, 0x8CBB, 0x9119, 0x975E, 0x98DB, 0x9F3B, 0x56AC,
+ 0x5B2A, 0x5F6C, 0x658C, 0x6AB3, 0x6BAF, 0x6D5C, 0x6FF1, 0x7015,
+ 0x725D, 0x73AD, 0x8CA7, 0x8CD3, 0x983B, 0x6191, 0x6C37, 0x8058,
+ 0x9A01, 0x4E4D, 0x4E8B, 0x4E9B, 0x4ED5, 0x4F3A, 0x4F3C, 0x4F7F,
+ 0x4FDF, 0x50FF, 0x53F2, 0x53F8, 0x5506, 0x55E3, 0x56DB, 0x58EB,
+ 0x5962, 0x5A11, 0x5BEB, 0x5BFA, 0x5C04, 0x5DF3, 0x5E2B, 0x5F99,
+ 0x601D, 0x6368, 0x659C, 0x65AF, 0x67F6, 0x67FB, 0x68AD, 0x6B7B,
+ 0x6C99, 0x6CD7, 0x6E23, 0x7009, 0x7345, 0x7802, 0x793E, 0x7940,
+ 0x7960, 0x79C1, 0x7BE9, 0x7D17, 0x7D72, 0x8086, 0x820D, 0x838E,
+ 0x84D1, 0x86C7, 0x88DF, 0x8A50, 0x8A5E, 0x8B1D, 0x8CDC, 0x8D66,
+ 0x8FAD, 0x90AA, 0x98FC, 0x99DF, 0x9E9D, 0x524A, 0x6714, 0x5098,
+ 0x522A, 0x5C71, 0x6563, 0x6C55, 0x73CA, 0x7523, 0x759D, 0x7B97,
+ 0x849C, 0x9178, 0x9730, 0x4E77, 0x6492, 0x6BBA, 0x715E, 0x85A9,
+ 0x4E09, 0x6749, 0x68EE, 0x6E17, 0x829F, 0x8518, 0x886B, 0x63F7,
+ 0x6F81, 0x9212, 0x98AF, 0x4E0A, 0x50B7, 0x50CF, 0x511F, 0x5546,
+ 0x55AA, 0x5617, 0x5B40, 0x5C19, 0x5CE0, 0x5E38, 0x5E8A, 0x5EA0,
+ 0x5EC2, 0x60F3, 0x6851, 0x6A61, 0x6E58, 0x723D, 0x7240, 0x72C0,
+ 0x76F8, 0x7965, 0x7BB1, 0x7FD4, 0x88F3, 0x89F4, 0x8A73, 0x8C61,
+ 0x8CDE, 0x971C, 0x585E, 0x74BD, 0x8CFD, 0x55C7, 0x7A61, 0x7D22,
+ 0x8272, 0x7272, 0x751F, 0x7525, 0x7B19, 0x5885, 0x58FB, 0x5DBC,
+ 0x5E8F, 0x5EB6, 0x5F90, 0x6055, 0x6292, 0x637F, 0x654D, 0x6691,
+ 0x66D9, 0x66F8, 0x6816, 0x68F2, 0x7280, 0x745E, 0x7B6E, 0x7D6E,
+ 0x7DD6, 0x7F72, 0x80E5, 0x8212, 0x85AF, 0x897F, 0x8A93, 0x901D,
+ 0x92E4, 0x9ECD, 0x9F20, 0x5915, 0x596D, 0x5E2D, 0x60DC, 0x6614,
+ 0x6673, 0x6790, 0x6C50, 0x6DC5, 0x6F5F, 0x77F3, 0x78A9, 0x84C6,
+ 0x91CB, 0x932B, 0x4ED9, 0x50CA, 0x5148, 0x5584, 0x5B0B, 0x5BA3,
+ 0x6247, 0x657E, 0x65CB, 0x6E32, 0x717D, 0x7401, 0x7444, 0x7487,
+ 0x74BF, 0x766C, 0x79AA, 0x7DDA, 0x7E55, 0x7FA8, 0x817A, 0x81B3,
+ 0x8239, 0x861A, 0x87EC, 0x8A75, 0x8DE3, 0x9078, 0x9291, 0x9425,
+ 0x994D, 0x9BAE, 0x5368, 0x5C51, 0x6954, 0x6CC4, 0x6D29, 0x6E2B,
+ 0x820C, 0x859B, 0x893B, 0x8A2D, 0x8AAA, 0x96EA, 0x9F67, 0x5261,
+ 0x66B9, 0x6BB2, 0x7E96, 0x87FE, 0x8D0D, 0x9583, 0x965D, 0x651D,
+ 0x6D89, 0x71EE, 0x57CE, 0x59D3, 0x5BAC, 0x6027, 0x60FA, 0x6210,
+ 0x661F, 0x665F, 0x7329, 0x73F9, 0x76DB, 0x7701, 0x7B6C, 0x8056,
+ 0x8072, 0x8165, 0x8AA0, 0x9192, 0x4E16, 0x52E2, 0x6B72, 0x6D17,
+ 0x7A05, 0x7B39, 0x7D30, 0x8CB0, 0x53EC, 0x562F, 0x5851, 0x5BB5,
+ 0x5C0F, 0x5C11, 0x5DE2, 0x6240, 0x6383, 0x6414, 0x662D, 0x68B3,
+ 0x6CBC, 0x6D88, 0x6EAF, 0x701F, 0x70A4, 0x71D2, 0x7526, 0x758F,
+ 0x758E, 0x7619, 0x7B11, 0x7BE0, 0x7C2B, 0x7D20, 0x7D39, 0x852C,
+ 0x856D, 0x8607, 0x8A34, 0x900D, 0x9061, 0x90B5, 0x92B7, 0x97F6,
+ 0x9A37, 0x4FD7, 0x5C6C, 0x675F, 0x6D91, 0x7C9F, 0x7E8C, 0x8B16,
+ 0x8D16, 0x901F, 0x5B6B, 0x5DFD, 0x640D, 0x84C0, 0x905C, 0x98E1,
+ 0x7387, 0x5B8B, 0x609A, 0x677E, 0x6DDE, 0x8A1F, 0x8AA6, 0x9001,
+ 0x980C, 0x5237, 0x7051, 0x788E, 0x9396, 0x8870, 0x91D7, 0x4FEE,
+ 0x53D7, 0x55FD, 0x56DA, 0x5782, 0x58FD, 0x5AC2, 0x5B88, 0x5CAB,
+ 0x5CC0, 0x5E25, 0x6101, 0x620D, 0x624B, 0x6388, 0x641C, 0x6536,
+ 0x6578, 0x6A39, 0x6B8A, 0x6C34, 0x6D19, 0x6F31, 0x71E7, 0x72E9,
+ 0x7378, 0x7407, 0x74B2, 0x7626, 0x7761, 0x79C0, 0x7A57, 0x7AEA,
+ 0x7CB9, 0x7D8F, 0x7DAC, 0x7E61, 0x7F9E, 0x8129, 0x8331, 0x8490,
+ 0x84DA, 0x85EA, 0x8896, 0x8AB0, 0x8B90, 0x8F38, 0x9042, 0x9083,
+ 0x916C, 0x9296, 0x92B9, 0x968B, 0x96A7, 0x96A8, 0x96D6, 0x9700,
+ 0x9808, 0x9996, 0x9AD3, 0x9B1A, 0x53D4, 0x587E, 0x5919, 0x5B70,
+ 0x5BBF, 0x6DD1, 0x6F5A, 0x719F, 0x7421, 0x74B9, 0x8085, 0x83FD,
+ 0x5DE1, 0x5F87, 0x5FAA, 0x6042, 0x65EC, 0x6812, 0x696F, 0x6A53,
+ 0x6B89, 0x6D35, 0x6DF3, 0x73E3, 0x76FE, 0x77AC, 0x7B4D, 0x7D14,
+ 0x8123, 0x821C, 0x8340, 0x84F4, 0x8563, 0x8A62, 0x8AC4, 0x9187,
+ 0x931E, 0x9806, 0x99B4, 0x620C, 0x8853, 0x8FF0, 0x9265, 0x5D07,
+ 0x5D27, 0x5D69, 0x745F, 0x819D, 0x8768, 0x6FD5, 0x62FE, 0x7FD2,
+ 0x8936, 0x8972, 0x4E1E, 0x4E58, 0x50E7, 0x52DD, 0x5347, 0x627F,
+ 0x6607, 0x7E69, 0x8805, 0x965E, 0x4F8D, 0x5319, 0x5636, 0x59CB,
+ 0x5AA4, 0x5C38, 0x5C4E, 0x5C4D, 0x5E02, 0x5F11, 0x6043, 0x65BD,
+ 0x662F, 0x6642, 0x67BE, 0x67F4, 0x731C, 0x77E2, 0x793A, 0x7FC5,
+ 0x8494, 0x84CD, 0x8996, 0x8A66, 0x8A69, 0x8AE1, 0x8C55, 0x8C7A,
+ 0x57F4, 0x5BD4, 0x5F0F, 0x606F, 0x62ED, 0x690D, 0x6B96, 0x6E5C,
+ 0x7184, 0x7BD2, 0x8755, 0x8B58, 0x8EFE, 0x98DF, 0x98FE, 0x4F38,
+ 0x4F81, 0x4FE1, 0x547B, 0x5A20, 0x5BB8, 0x613C, 0x65B0, 0x6668,
+ 0x71FC, 0x7533, 0x795E, 0x7D33, 0x814E, 0x81E3, 0x8398, 0x85AA,
+ 0x85CE, 0x8703, 0x8A0A, 0x8EAB, 0x8F9B, 0x8FC5, 0x5931, 0x5BA4,
+ 0x5BE6, 0x6089, 0x5BE9, 0x5C0B, 0x5FC3, 0x6C81, 0x6DF1, 0x700B,
+ 0x751A, 0x82AF, 0x8AF6, 0x4EC0, 0x5341, 0x96D9, 0x6C0F, 0x4E9E,
+ 0x4FC4, 0x5152, 0x555E, 0x5A25, 0x5CE8, 0x6211, 0x7259, 0x82BD,
+ 0x83AA, 0x86FE, 0x8859, 0x8A1D, 0x963F, 0x96C5, 0x9913, 0x9D09,
+ 0x9D5D, 0x580A, 0x5CB3, 0x5DBD, 0x5E44, 0x60E1, 0x6115, 0x63E1,
+ 0x6A02, 0x6E25, 0x9102, 0x9354, 0x984E, 0x9C10, 0x9F77, 0x5B89,
+ 0x5CB8, 0x6309, 0x664F, 0x6848, 0x773C, 0x96C1, 0x978D, 0x9854,
+ 0x9B9F, 0x65A1, 0x8B01, 0x8ECB, 0x95BC, 0x5535, 0x5CA9, 0x5DD6,
+ 0x5EB5, 0x6697, 0x764C, 0x83F4, 0x95C7, 0x58D3, 0x62BC, 0x72CE,
+ 0x9D28, 0x4EF0, 0x592E, 0x600F, 0x663B, 0x6B83, 0x79E7, 0x9D26,
+ 0x5393, 0x54C0, 0x57C3, 0x5D16, 0x611B, 0x66D6, 0x6DAF, 0x788D,
+ 0x827E, 0x9698, 0x9744, 0x5384, 0x627C, 0x6396, 0x6DB2, 0x7E0A,
+ 0x814B, 0x984D, 0x6AFB, 0x7F4C, 0x9DAF, 0x9E1A, 0x4E5F, 0x503B,
+ 0x51B6, 0x591C, 0x60F9, 0x63F6, 0x6930, 0x723A, 0x8036, 0x91CE,
+ 0x5F31, 0x7D04, 0x82E5, 0x846F, 0x84BB, 0x85E5, 0x8E8D, 0x4F6F,
+ 0x58E4, 0x5B43, 0x6059, 0x63DA, 0x6518, 0x656D, 0x6698, 0x694A,
+ 0x6A23, 0x6D0B, 0x7001, 0x716C, 0x75D2, 0x760D, 0x79B3, 0x7A70,
+ 0x7F8A, 0x8944, 0x8B93, 0x91C0, 0x967D, 0x990A, 0x5704, 0x5FA1,
+ 0x65BC, 0x6F01, 0x7600, 0x79A6, 0x8A9E, 0x99AD, 0x9B5A, 0x9F6C,
+ 0x5104, 0x61B6, 0x6291, 0x6A8D, 0x81C6, 0x5043, 0x5830, 0x5F66,
+ 0x7109, 0x8A00, 0x8AFA, 0x5B7C, 0x8616, 0x4FFA, 0x513C, 0x56B4,
+ 0x5944, 0x63A9, 0x6DF9, 0x5DAA, 0x696D, 0x5186, 0x4E88, 0x4F59,
+ 0x5982, 0x6B5F, 0x6C5D, 0x74B5, 0x7916, 0x8207, 0x8245, 0x8339,
+ 0x8F3F, 0x8F5D, 0x9918, 0x4EA6, 0x57DF, 0x5F79, 0x6613, 0x75AB,
+ 0x7E79, 0x8B6F, 0x9006, 0x9A5B, 0x56A5, 0x5827, 0x59F8, 0x5A1F,
+ 0x5BB4, 0x5EF6, 0x6350, 0x633B, 0x693D, 0x6C87, 0x6CBF, 0x6D8E,
+ 0x6D93, 0x6DF5, 0x6F14, 0x70DF, 0x7136, 0x7159, 0x71C3, 0x71D5,
+ 0x784F, 0x786F, 0x7B75, 0x7DE3, 0x7E2F, 0x884D, 0x8EDF, 0x925B,
+ 0x9CF6, 0x6085, 0x6D85, 0x71B1, 0x95B1, 0x53AD, 0x67D3, 0x708E,
+ 0x7130, 0x7430, 0x8276, 0x82D2, 0x95BB, 0x9AE5, 0x9E7D, 0x66C4,
+ 0x71C1, 0x8449, 0x584B, 0x5DB8, 0x5F71, 0x6620, 0x668E, 0x6979,
+ 0x69AE, 0x6C38, 0x6CF3, 0x6E36, 0x6F41, 0x6FDA, 0x701B, 0x702F,
+ 0x7150, 0x71DF, 0x7370, 0x745B, 0x74D4, 0x76C8, 0x7A4E, 0x7E93,
+ 0x82F1, 0x8A60, 0x8FCE, 0x9348, 0x9719, 0x4E42, 0x502A, 0x5208,
+ 0x53E1, 0x66F3, 0x6C6D, 0x6FCA, 0x730A, 0x777F, 0x7A62, 0x82AE,
+ 0x85DD, 0x8602, 0x88D4, 0x8A63, 0x8B7D, 0x8C6B, 0x92B3, 0x9713,
+ 0x9810, 0x4E94, 0x4F0D, 0x4FC9, 0x50B2, 0x5348, 0x543E, 0x5433,
+ 0x55DA, 0x5862, 0x58BA, 0x5967, 0x5A1B, 0x5BE4, 0x609F, 0x61CA,
+ 0x6556, 0x65FF, 0x6664, 0x68A7, 0x6C5A, 0x6FB3, 0x70CF, 0x71AC,
+ 0x7352, 0x7B7D, 0x8708, 0x8AA4, 0x9C32, 0x9F07, 0x5C4B, 0x6C83,
+ 0x7344, 0x7389, 0x923A, 0x6EAB, 0x7465, 0x761F, 0x7A69, 0x7E15,
+ 0x860A, 0x5140, 0x58C5, 0x64C1, 0x74EE, 0x7515, 0x7670, 0x7FC1,
+ 0x9095, 0x96CD, 0x9954, 0x6E26, 0x74E6, 0x7AA9, 0x7AAA, 0x81E5,
+ 0x86D9, 0x8778, 0x8A1B, 0x5A49, 0x5B8C, 0x5B9B, 0x68A1, 0x6900,
+ 0x6D63, 0x73A9, 0x7413, 0x742C, 0x7897, 0x7DE9, 0x7FEB, 0x8118,
+ 0x8155, 0x839E, 0x8C4C, 0x962E, 0x9811, 0x66F0, 0x5F80, 0x65FA,
+ 0x6789, 0x6C6A, 0x738B, 0x502D, 0x5A03, 0x6B6A, 0x77EE, 0x5916,
+ 0x5D6C, 0x5DCD, 0x7325, 0x754F, 0x50E5, 0x51F9, 0x582F, 0x592D,
+ 0x5996, 0x59DA, 0x5BE5, 0x5DA2, 0x62D7, 0x6416, 0x6493, 0x64FE,
+ 0x66DC, 0x6A48, 0x71FF, 0x7464, 0x7A88, 0x7AAF, 0x7E47, 0x7E5E,
+ 0x8000, 0x8170, 0x87EF, 0x8981, 0x8B20, 0x9059, 0x9080, 0x9952,
+ 0x617E, 0x6B32, 0x6D74, 0x7E1F, 0x8925, 0x8FB1, 0x4FD1, 0x50AD,
+ 0x5197, 0x52C7, 0x57C7, 0x5889, 0x5BB9, 0x5EB8, 0x6142, 0x6995,
+ 0x6D8C, 0x6E67, 0x6EB6, 0x7194, 0x7462, 0x7528, 0x752C, 0x8073,
+ 0x8338, 0x84C9, 0x8E0A, 0x9394, 0x93DE, 0x4E8E, 0x4F51, 0x5076,
+ 0x512A, 0x53C8, 0x53CB, 0x53F3, 0x5B87, 0x5BD3, 0x5C24, 0x611A,
+ 0x6182, 0x65F4, 0x725B, 0x7397, 0x7440, 0x76C2, 0x7950, 0x7991,
+ 0x79B9, 0x7D06, 0x7FBD, 0x828B, 0x85D5, 0x865E, 0x8FC2, 0x9047,
+ 0x90F5, 0x91EA, 0x9685, 0x96E8, 0x96E9, 0x52D6, 0x5F67, 0x65ED,
+ 0x6631, 0x682F, 0x715C, 0x7A36, 0x90C1, 0x980A, 0x4E91, 0x6A52,
+ 0x6B9E, 0x6F90, 0x7189, 0x8018, 0x82B8, 0x8553, 0x904B, 0x9695,
+ 0x96F2, 0x97FB, 0x851A, 0x9B31, 0x4E90, 0x718A, 0x96C4, 0x5143,
+ 0x539F, 0x54E1, 0x5713, 0x5712, 0x57A3, 0x5A9B, 0x5AC4, 0x5BC3,
+ 0x6028, 0x613F, 0x63F4, 0x6C85, 0x6D39, 0x6E72, 0x6E90, 0x7230,
+ 0x733F, 0x7457, 0x82D1, 0x8881, 0x8F45, 0x9060, 0x9662, 0x9858,
+ 0x9D1B, 0x6708, 0x8D8A, 0x925E, 0x4F4D, 0x5049, 0x50DE, 0x5371,
+ 0x570D, 0x59D4, 0x5A01, 0x5C09, 0x6170, 0x6690, 0x6E2D, 0x7232,
+ 0x744B, 0x7DEF, 0x80C3, 0x840E, 0x8466, 0x853F, 0x875F, 0x885B,
+ 0x8918, 0x8B02, 0x9055, 0x97CB, 0x9B4F, 0x4E73, 0x4F91, 0x5112,
+ 0x516A, 0x552F, 0x55A9, 0x5B7A, 0x5BA5, 0x5E7C, 0x5E7D, 0x5EBE,
+ 0x60A0, 0x60DF, 0x6108, 0x6109, 0x63C4, 0x6538, 0x6709, 0x67D4,
+ 0x67DA, 0x6961, 0x6962, 0x6CB9, 0x6D27, 0x6E38, 0x6FE1, 0x7336,
+ 0x7337, 0x745C, 0x7531, 0x7652, 0x7DAD, 0x81FE, 0x8438, 0x88D5,
+ 0x8A98, 0x8ADB, 0x8AED, 0x8E30, 0x8E42, 0x904A, 0x903E, 0x907A,
+ 0x9149, 0x91C9, 0x936E, 0x5809, 0x6BD3, 0x8089, 0x80B2, 0x5141,
+ 0x596B, 0x5C39, 0x6F64, 0x73A7, 0x80E4, 0x8D07, 0x9217, 0x958F,
+ 0x807F, 0x620E, 0x701C, 0x7D68, 0x878D, 0x57A0, 0x6069, 0x6147,
+ 0x6BB7, 0x8ABE, 0x9280, 0x96B1, 0x4E59, 0x541F, 0x6DEB, 0x852D,
+ 0x9670, 0x97F3, 0x98EE, 0x63D6, 0x6CE3, 0x9091, 0x51DD, 0x61C9,
+ 0x81BA, 0x9DF9, 0x4F9D, 0x501A, 0x5100, 0x5B9C, 0x610F, 0x61FF,
+ 0x64EC, 0x6905, 0x6BC5, 0x7591, 0x77E3, 0x7FA9, 0x8264, 0x858F,
+ 0x87FB, 0x8863, 0x8ABC, 0x8B70, 0x91AB, 0x4E8C, 0x4EE5, 0x4F0A,
+ 0x5937, 0x59E8, 0x5DF2, 0x5F1B, 0x5F5B, 0x6021, 0x723E, 0x73E5,
+ 0x7570, 0x75CD, 0x79FB, 0x800C, 0x8033, 0x8084, 0x82E1, 0x8351,
+ 0x8CBD, 0x8CB3, 0x9087, 0x98F4, 0x990C, 0x7037, 0x76CA, 0x7FCA,
+ 0x7FCC, 0x7FFC, 0x8B1A, 0x4EBA, 0x4EC1, 0x5203, 0x5370, 0x54BD,
+ 0x56E0, 0x59FB, 0x5BC5, 0x5F15, 0x5FCD, 0x6E6E, 0x7D6A, 0x8335,
+ 0x8693, 0x8A8D, 0x976D, 0x9777, 0x4E00, 0x4F5A, 0x4F7E, 0x58F9,
+ 0x65E5, 0x6EA2, 0x9038, 0x93B0, 0x99B9, 0x4EFB, 0x58EC, 0x598A,
+ 0x59D9, 0x6041, 0x7A14, 0x834F, 0x8CC3, 0x5165, 0x5344, 0x4ECD,
+ 0x5269, 0x5B55, 0x82BF, 0x4ED4, 0x523A, 0x54A8, 0x59C9, 0x59FF,
+ 0x5B50, 0x5B57, 0x5B5C, 0x6063, 0x6148, 0x6ECB, 0x7099, 0x716E,
+ 0x7386, 0x74F7, 0x75B5, 0x78C1, 0x7D2B, 0x8005, 0x81EA, 0x8328,
+ 0x8517, 0x85C9, 0x8AEE, 0x8CC7, 0x96CC, 0x4F5C, 0x52FA, 0x56BC,
+ 0x65AB, 0x6628, 0x707C, 0x70B8, 0x7235, 0x7DBD, 0x828D, 0x914C,
+ 0x96C0, 0x9D72, 0x5B71, 0x68E7, 0x6B98, 0x6F7A, 0x76DE, 0x5C91,
+ 0x66AB, 0x6F5B, 0x7BB4, 0x7C2A, 0x8836, 0x96DC, 0x4E08, 0x4ED7,
+ 0x5320, 0x5834, 0x58BB, 0x58EF, 0x596C, 0x5C07, 0x5E33, 0x5E84,
+ 0x5F35, 0x638C, 0x66B2, 0x6756, 0x6A1F, 0x6AA3, 0x6B0C, 0x6F3F,
+ 0x7246, 0x7350, 0x748B, 0x7AE0, 0x7CA7, 0x8178, 0x81DF, 0x81E7,
+ 0x838A, 0x846C, 0x8523, 0x8594, 0x85CF, 0x88DD, 0x8D13, 0x91AC,
+ 0x9577, 0x969C, 0x518D, 0x54C9, 0x5728, 0x5BB0, 0x624D, 0x6750,
+ 0x683D, 0x6893, 0x6E3D, 0x6ED3, 0x707D, 0x7E21, 0x88C1, 0x8CA1,
+ 0x8F09, 0x9F4B, 0x9F4E, 0x722D, 0x7B8F, 0x8ACD, 0x931A, 0x4F47,
+ 0x4F4E, 0x5132, 0x5480, 0x59D0, 0x5E95, 0x62B5, 0x6775, 0x696E,
+ 0x6A17, 0x6CAE, 0x6E1A, 0x72D9, 0x732A, 0x75BD, 0x7BB8, 0x7D35,
+ 0x82E7, 0x83F9, 0x8457, 0x85F7, 0x8A5B, 0x8CAF, 0x8E87, 0x9019,
+ 0x90B8, 0x96CE, 0x9F5F, 0x52E3, 0x540A, 0x5AE1, 0x5BC2, 0x6458,
+ 0x6575, 0x6EF4, 0x72C4, 0x7684, 0x7A4D, 0x7B1B, 0x7C4D, 0x7E3E,
+ 0x7FDF, 0x837B, 0x8B2B, 0x8CCA, 0x8D64, 0x8DE1, 0x8E5F, 0x8FEA,
+ 0x8FF9, 0x9069, 0x93D1, 0x4F43, 0x4F7A, 0x50B3, 0x5168, 0x5178,
+ 0x524D, 0x526A, 0x5861, 0x587C, 0x5960, 0x5C08, 0x5C55, 0x5EDB,
+ 0x609B, 0x6230, 0x6813, 0x6BBF, 0x6C08, 0x6FB1, 0x714E, 0x7420,
+ 0x7530, 0x7538, 0x7551, 0x7672, 0x7B4C, 0x7B8B, 0x7BAD, 0x7BC6,
+ 0x7E8F, 0x8A6E, 0x8F3E, 0x8F49, 0x923F, 0x9293, 0x9322, 0x942B,
+ 0x96FB, 0x985A, 0x986B, 0x991E, 0x5207, 0x622A, 0x6298, 0x6D59,
+ 0x7664, 0x7ACA, 0x7BC0, 0x7D76, 0x5360, 0x5CBE, 0x5E97, 0x6F38,
+ 0x70B9, 0x7C98, 0x9711, 0x9B8E, 0x9EDE, 0x63A5, 0x647A, 0x8776,
+ 0x4E01, 0x4E95, 0x4EAD, 0x505C, 0x5075, 0x5448, 0x59C3, 0x5B9A,
+ 0x5E40, 0x5EAD, 0x5EF7, 0x5F81, 0x60C5, 0x633A, 0x653F, 0x6574,
+ 0x65CC, 0x6676, 0x6678, 0x67FE, 0x6968, 0x6A89, 0x6B63, 0x6C40,
+ 0x6DC0, 0x6DE8, 0x6E1F, 0x6E5E, 0x701E, 0x70A1, 0x738E, 0x73FD,
+ 0x753A, 0x775B, 0x7887, 0x798E, 0x7A0B, 0x7A7D, 0x7CBE, 0x7D8E,
+ 0x8247, 0x8A02, 0x8AEA, 0x8C9E, 0x912D, 0x914A, 0x91D8, 0x9266,
+ 0x92CC, 0x9320, 0x9706, 0x9756, 0x975C, 0x9802, 0x9F0E, 0x5236,
+ 0x5291, 0x557C, 0x5824, 0x5E1D, 0x5F1F, 0x608C, 0x63D0, 0x68AF,
+ 0x6FDF, 0x796D, 0x7B2C, 0x81CD, 0x85BA, 0x88FD, 0x8AF8, 0x8E44,
+ 0x918D, 0x9664, 0x969B, 0x973D, 0x984C, 0x9F4A, 0x4FCE, 0x5146,
+ 0x51CB, 0x52A9, 0x5632, 0x5F14, 0x5F6B, 0x63AA, 0x64CD, 0x65E9,
+ 0x6641, 0x66FA, 0x66F9, 0x671D, 0x689D, 0x68D7, 0x69FD, 0x6F15,
+ 0x6F6E, 0x7167, 0x71E5, 0x722A, 0x74AA, 0x773A, 0x7956, 0x795A,
+ 0x79DF, 0x7A20, 0x7A95, 0x7C97, 0x7CDF, 0x7D44, 0x7E70, 0x8087,
+ 0x85FB, 0x86A4, 0x8A54, 0x8ABF, 0x8D99, 0x8E81, 0x9020, 0x906D,
+ 0x91E3, 0x963B, 0x96D5, 0x9CE5, 0x65CF, 0x7C07, 0x8DB3, 0x93C3,
+ 0x5B58, 0x5C0A, 0x5352, 0x62D9, 0x731D, 0x5027, 0x5B97, 0x5F9E,
+ 0x60B0, 0x616B, 0x68D5, 0x6DD9, 0x742E, 0x7A2E, 0x7D42, 0x7D9C,
+ 0x7E31, 0x816B, 0x8E2A, 0x8E35, 0x937E, 0x9418, 0x4F50, 0x5750,
+ 0x5DE6, 0x5EA7, 0x632B, 0x7F6A, 0x4E3B, 0x4F4F, 0x4F8F, 0x505A,
+ 0x59DD, 0x80C4, 0x546A, 0x5468, 0x55FE, 0x594F, 0x5B99, 0x5DDE,
+ 0x5EDA, 0x665D, 0x6731, 0x67F1, 0x682A, 0x6CE8, 0x6D32, 0x6E4A,
+ 0x6F8D, 0x70B7, 0x73E0, 0x7587, 0x7C4C, 0x7D02, 0x7D2C, 0x7DA2,
+ 0x821F, 0x86DB, 0x8A3B, 0x8A85, 0x8D70, 0x8E8A, 0x8F33, 0x9031,
+ 0x914E, 0x9152, 0x9444, 0x99D0, 0x7AF9, 0x7CA5, 0x4FCA, 0x5101,
+ 0x51C6, 0x57C8, 0x5BEF, 0x5CFB, 0x6659, 0x6A3D, 0x6D5A, 0x6E96,
+ 0x6FEC, 0x710C, 0x756F, 0x7AE3, 0x8822, 0x9021, 0x9075, 0x96CB,
+ 0x99FF, 0x8301, 0x4E2D, 0x4EF2, 0x8846, 0x91CD, 0x537D, 0x6ADB,
+ 0x696B, 0x6C41, 0x847A, 0x589E, 0x618E, 0x66FE, 0x62EF, 0x70DD,
+ 0x7511, 0x75C7, 0x7E52, 0x84B8, 0x8B49, 0x8D08, 0x4E4B, 0x53EA,
+ 0x54AB, 0x5730, 0x5740, 0x5FD7, 0x6301, 0x6307, 0x646F, 0x652F,
+ 0x65E8, 0x667A, 0x679D, 0x67B3, 0x6B62, 0x6C60, 0x6C9A, 0x6F2C,
+ 0x77E5, 0x7825, 0x7949, 0x7957, 0x7D19, 0x80A2, 0x8102, 0x81F3,
+ 0x829D, 0x82B7, 0x8718, 0x8A8C, 0x8D04, 0x8DBE, 0x9072, 0x76F4,
+ 0x7A19, 0x7A37, 0x7E54, 0x8077, 0x5507, 0x55D4, 0x5875, 0x632F,
+ 0x6422, 0x6649, 0x664B, 0x686D, 0x699B, 0x6B84, 0x6D25, 0x6EB1,
+ 0x73CD, 0x7468, 0x74A1, 0x755B, 0x75B9, 0x76E1, 0x771E, 0x778B,
+ 0x79E6, 0x7E09, 0x7E1D, 0x81FB, 0x852F, 0x8897, 0x8A3A, 0x8CD1,
+ 0x8EEB, 0x8FB0, 0x9032, 0x93AD, 0x9663, 0x9673, 0x9707, 0x4F84,
+ 0x53F1, 0x59EA, 0x5AC9, 0x5E19, 0x684E, 0x74C6, 0x75BE, 0x79E9,
+ 0x7A92, 0x81A3, 0x86ED, 0x8CEA, 0x8DCC, 0x8FED, 0x659F, 0x6715,
+ 0x57F7, 0x6F57, 0x7DDD, 0x8F2F, 0x93F6, 0x96C6, 0x5FB5, 0x61F2,
+ 0x6F84, 0x4E14, 0x4F98, 0x501F, 0x53C9, 0x55DF, 0x5D6F, 0x5DEE,
+ 0x6B21, 0x6B64, 0x78CB, 0x7B9A, 0x8E49, 0x8ECA, 0x906E, 0x6349,
+ 0x643E, 0x7740, 0x7A84, 0x932F, 0x947F, 0x9F6A, 0x64B0, 0x6FAF,
+ 0x71E6, 0x74A8, 0x74DA, 0x7AC4, 0x7C12, 0x7E82, 0x7CB2, 0x7E98,
+ 0x8B9A, 0x8D0A, 0x947D, 0x9910, 0x994C, 0x5239, 0x5BDF, 0x64E6,
+ 0x672D, 0x7D2E, 0x50ED, 0x53C3, 0x5879, 0x6158, 0x6159, 0x61FA,
+ 0x65AC, 0x7AD9, 0x8B92, 0x8B96, 0x5009, 0x5021, 0x5275, 0x5531,
+ 0x5A3C, 0x5EE0, 0x5F70, 0x6134, 0x655E, 0x660C, 0x6636, 0x66A2,
+ 0x69CD, 0x6EC4, 0x6F32, 0x7316, 0x7621, 0x7A93, 0x8139, 0x8259,
+ 0x83D6, 0x84BC, 0x50B5, 0x57F0, 0x5BC0, 0x5BE8, 0x5F69, 0x63A1,
+ 0x7826, 0x7DB5, 0x83DC, 0x8521, 0x91C7, 0x91F5, 0x518A, 0x67F5,
+ 0x7B56, 0x8CAC, 0x51C4, 0x59BB, 0x60BD, 0x8655, 0x501C, 0x5254,
+ 0x5C3A, 0x617D, 0x621A, 0x62D3, 0x64F2, 0x65A5, 0x6ECC, 0x7620,
+ 0x810A, 0x8E60, 0x965F, 0x96BB, 0x4EDF, 0x5343, 0x5598, 0x5929,
+ 0x5DDD, 0x64C5, 0x6CC9, 0x6DFA, 0x7394, 0x7A7F, 0x821B, 0x85A6,
+ 0x8CE4, 0x8E10, 0x9077, 0x91E7, 0x95E1, 0x9621, 0x97C6, 0x51F8,
+ 0x54F2, 0x5586, 0x5FB9, 0x64A4, 0x6F88, 0x7DB4, 0x8F1F, 0x8F4D,
+ 0x9435, 0x50C9, 0x5C16, 0x6CBE, 0x6DFB, 0x751B, 0x77BB, 0x7C3D,
+ 0x7C64, 0x8A79, 0x8AC2, 0x581E, 0x59BE, 0x5E16, 0x6377, 0x7252,
+ 0x758A, 0x776B, 0x8ADC, 0x8CBC, 0x8F12, 0x5EF3, 0x6674, 0x6DF8,
+ 0x807D, 0x83C1, 0x8ACB, 0x9751, 0x9BD6, 0x5243, 0x66FF, 0x6D95,
+ 0x6EEF, 0x7DE0, 0x8AE6, 0x902E, 0x905E, 0x9AD4, 0x521D, 0x527F,
+ 0x54E8, 0x6194, 0x6284, 0x62DB, 0x68A2, 0x6912, 0x695A, 0x6A35,
+ 0x7092, 0x7126, 0x785D, 0x7901, 0x790E, 0x79D2, 0x7A0D, 0x8096,
+ 0x8278, 0x82D5, 0x8349, 0x8549, 0x8C82, 0x8D85, 0x9162, 0x918B,
+ 0x91AE, 0x4FC3, 0x56D1, 0x71ED, 0x77D7, 0x8700, 0x89F8, 0x5BF8,
+ 0x5FD6, 0x6751, 0x90A8, 0x53E2, 0x585A, 0x5BF5, 0x60A4, 0x6181,
+ 0x6460, 0x7E3D, 0x8070, 0x8525, 0x9283, 0x64AE, 0x50AC, 0x5D14,
+ 0x6700, 0x589C, 0x62BD, 0x63A8, 0x690E, 0x6978, 0x6A1E, 0x6E6B,
+ 0x76BA, 0x79CB, 0x82BB, 0x8429, 0x8ACF, 0x8DA8, 0x8FFD, 0x9112,
+ 0x914B, 0x919C, 0x9310, 0x9318, 0x939A, 0x96DB, 0x9A36, 0x9C0D,
+ 0x4E11, 0x755C, 0x795D, 0x7AFA, 0x7B51, 0x7BC9, 0x7E2E, 0x84C4,
+ 0x8E59, 0x8E74, 0x8EF8, 0x9010, 0x6625, 0x693F, 0x7443, 0x51FA,
+ 0x672E, 0x9EDC, 0x5145, 0x5FE0, 0x6C96, 0x87F2, 0x885D, 0x8877,
+ 0x60B4, 0x81B5, 0x8403, 0x8D05, 0x53D6, 0x5439, 0x5634, 0x5A36,
+ 0x5C31, 0x708A, 0x7FE0, 0x805A, 0x8106, 0x81ED, 0x8DA3, 0x9189,
+ 0x9A5F, 0x9DF2, 0x5074, 0x4EC4, 0x53A0, 0x60FB, 0x6E2C, 0x5C64,
+ 0x4F88, 0x5024, 0x55E4, 0x5CD9, 0x5E5F, 0x6065, 0x6894, 0x6CBB,
+ 0x6DC4, 0x71BE, 0x75D4, 0x75F4, 0x7661, 0x7A1A, 0x7A49, 0x7DC7,
+ 0x7DFB, 0x7F6E, 0x81F4, 0x86A9, 0x8F1C, 0x96C9, 0x99B3, 0x9F52,
+ 0x5247, 0x52C5, 0x98ED, 0x89AA, 0x4E03, 0x67D2, 0x6F06, 0x4FB5,
+ 0x5BE2, 0x6795, 0x6C88, 0x6D78, 0x741B, 0x7827, 0x91DD, 0x937C,
+ 0x87C4, 0x79E4, 0x7A31, 0x5FEB, 0x4ED6, 0x54A4, 0x553E, 0x58AE,
+ 0x59A5, 0x60F0, 0x6253, 0x62D6, 0x6736, 0x6955, 0x8235, 0x9640,
+ 0x99B1, 0x99DD, 0x502C, 0x5353, 0x5544, 0x577C, 0x6258, 0x64E2,
+ 0x666B, 0x67DD, 0x6FC1, 0x6FEF, 0x7422, 0x7438, 0x8A17, 0x9438,
+ 0x5451, 0x5606, 0x5766, 0x5F48, 0x619A, 0x6B4E, 0x7058, 0x70AD,
+ 0x7DBB, 0x8A95, 0x596A, 0x812B, 0x63A2, 0x7708, 0x803D, 0x8CAA,
+ 0x5854, 0x642D, 0x69BB, 0x5B95, 0x5E11, 0x6E6F, 0x8569, 0x514C,
+ 0x53F0, 0x592A, 0x6020, 0x614B, 0x6B86, 0x6C70, 0x6CF0, 0x7B1E,
+ 0x80CE, 0x82D4, 0x8DC6, 0x90B0, 0x98B1, 0x64C7, 0x6FA4, 0x6491,
+ 0x6504, 0x514E, 0x5410, 0x571F, 0x8A0E, 0x615F, 0x6876, 0x75DB,
+ 0x7B52, 0x7D71, 0x901A, 0x5806, 0x69CC, 0x817F, 0x892A, 0x9000,
+ 0x9839, 0x5078, 0x5957, 0x59AC, 0x6295, 0x900F, 0x9B2A, 0x615D,
+ 0x7279, 0x95D6, 0x5761, 0x5A46, 0x5DF4, 0x628A, 0x64AD, 0x64FA,
+ 0x6777, 0x6CE2, 0x6D3E, 0x722C, 0x7436, 0x7834, 0x7F77, 0x82AD,
+ 0x8DDB, 0x9817, 0x5224, 0x5742, 0x677F, 0x7248, 0x74E3, 0x8CA9,
+ 0x8FA6, 0x9211, 0x962A, 0x516B, 0x53ED, 0x634C, 0x4F69, 0x5504,
+ 0x6096, 0x6557, 0x6C9B, 0x6D7F, 0x724C, 0x72FD, 0x7A17, 0x8987,
+ 0x8C9D, 0x5F6D, 0x6F8E, 0x70F9, 0x81A8, 0x610E, 0x4FBF, 0x504F,
+ 0x6241, 0x7247, 0x7BC7, 0x7DE8, 0x7FE9, 0x904D, 0x97AD, 0x9A19,
+ 0x8CB6, 0x576A, 0x5E73, 0x67B0, 0x840D, 0x8A55, 0x5420, 0x5B16,
+ 0x5E63, 0x5EE2, 0x5F0A, 0x6583, 0x80BA, 0x853D, 0x9589, 0x965B,
+ 0x4F48, 0x5305, 0x530D, 0x530F, 0x5486, 0x54FA, 0x5703, 0x5E03,
+ 0x6016, 0x629B, 0x62B1, 0x6355, 0x6CE1, 0x6D66, 0x75B1, 0x7832,
+ 0x80DE, 0x812F, 0x82DE, 0x8461, 0x84B2, 0x888D, 0x8912, 0x900B,
+ 0x92EA, 0x98FD, 0x9B91, 0x5E45, 0x66B4, 0x66DD, 0x7011, 0x7206,
+ 0x4FF5, 0x527D, 0x5F6A, 0x6153, 0x6753, 0x6A19, 0x6F02, 0x74E2,
+ 0x7968, 0x8868, 0x8C79, 0x98C7, 0x98C4, 0x9A43, 0x54C1, 0x7A1F,
+ 0x6953, 0x8AF7, 0x8C4A, 0x98A8, 0x99AE, 0x5F7C, 0x62AB, 0x75B2,
+ 0x76AE, 0x88AB, 0x907F, 0x9642, 0x5339, 0x5F3C, 0x5FC5, 0x6CCC,
+ 0x73CC, 0x7562, 0x758B, 0x7B46, 0x82FE, 0x999D, 0x4E4F, 0x903C,
+ 0x4E0B, 0x4F55, 0x53A6, 0x590F, 0x5EC8, 0x6630, 0x6CB3, 0x7455,
+ 0x8377, 0x8766, 0x8CC0, 0x9050, 0x971E, 0x9C15, 0x58D1, 0x5B78,
+ 0x8650, 0x8B14, 0x9DB4, 0x5BD2, 0x6068, 0x608D, 0x65F1, 0x6C57,
+ 0x6F22, 0x6FA3, 0x701A, 0x7F55, 0x7FF0, 0x9591, 0x9592, 0x9650,
+ 0x97D3, 0x5272, 0x8F44, 0x51FD, 0x542B, 0x54B8, 0x5563, 0x558A,
+ 0x6ABB, 0x6DB5, 0x7DD8, 0x8266, 0x929C, 0x9677, 0x9E79, 0x5408,
+ 0x54C8, 0x76D2, 0x86E4, 0x95A4, 0x95D4, 0x965C, 0x4EA2, 0x4F09,
+ 0x59EE, 0x5AE6, 0x5DF7, 0x6052, 0x6297, 0x676D, 0x6841, 0x6C86,
+ 0x6E2F, 0x7F38, 0x809B, 0x822A, 0x9805, 0x4EA5, 0x5055, 0x54B3,
+ 0x5793, 0x595A, 0x5B69, 0x5BB3, 0x61C8, 0x6977, 0x6D77, 0x7023,
+ 0x87F9, 0x89E3, 0x8A72, 0x8AE7, 0x9082, 0x99ED, 0x9AB8, 0x52BE,
+ 0x6838, 0x5016, 0x5E78, 0x674F, 0x8347, 0x884C, 0x4EAB, 0x5411,
+ 0x56AE, 0x73E6, 0x9115, 0x97FF, 0x9909, 0x9957, 0x9999, 0x5653,
+ 0x589F, 0x865B, 0x8A31, 0x61B2, 0x6AF6, 0x737B, 0x8ED2, 0x6B47,
+ 0x96AA, 0x9A57, 0x5955, 0x7200, 0x8D6B, 0x9769, 0x4FD4, 0x5CF4,
+ 0x5F26, 0x61F8, 0x665B, 0x6CEB, 0x70AB, 0x7384, 0x73B9, 0x73FE,
+ 0x7729, 0x774D, 0x7D43, 0x7D62, 0x7E23, 0x8237, 0x8852, 0x8CE2,
+ 0x9249, 0x986F, 0x5B51, 0x7A74, 0x8840, 0x9801, 0x5ACC, 0x4FE0,
+ 0x5354, 0x593E, 0x5CFD, 0x633E, 0x6D79, 0x72F9, 0x8105, 0x8107,
+ 0x83A2, 0x92CF, 0x9830, 0x4EA8, 0x5144, 0x5211, 0x578B, 0x5F62,
+ 0x6CC2, 0x6ECE, 0x7005, 0x7050, 0x70AF, 0x7192, 0x73E9, 0x7469,
+ 0x834A, 0x87A2, 0x8861, 0x9008, 0x90A2, 0x93A3, 0x99A8, 0x516E,
+ 0x5F57, 0x60E0, 0x6167, 0x66B3, 0x8559, 0x8E4A, 0x91AF, 0x978B,
+ 0x4E4E, 0x4E92, 0x547C, 0x58D5, 0x58FA, 0x597D, 0x5CB5, 0x5F27,
+ 0x6236, 0x6248, 0x660A, 0x6667, 0x6BEB, 0x6D69, 0x6DCF, 0x6E56,
+ 0x6EF8, 0x6F94, 0x6FE0, 0x6FE9, 0x705D, 0x72D0, 0x7425, 0x745A,
+ 0x74E0, 0x7693, 0x795C, 0x7CCA, 0x7E1E, 0x80E1, 0x82A6, 0x846B,
+ 0x84BF, 0x864E, 0x865F, 0x8774, 0x8B77, 0x8C6A, 0x93AC, 0x9800,
+ 0x9865, 0x60D1, 0x6216, 0x9177, 0x5A5A, 0x660F, 0x6DF7, 0x6E3E,
+ 0x743F, 0x9B42, 0x5FFD, 0x60DA, 0x7B0F, 0x54C4, 0x5F18, 0x6C5E,
+ 0x6CD3, 0x6D2A, 0x70D8, 0x7D05, 0x8679, 0x8A0C, 0x9D3B, 0x5316,
+ 0x548C, 0x5B05, 0x6A3A, 0x706B, 0x7575, 0x798D, 0x79BE, 0x82B1,
+ 0x83EF, 0x8A71, 0x8B41, 0x8CA8, 0x9774, 0x64F4, 0x652B, 0x78BA,
+ 0x78BB, 0x7A6B, 0x4E38, 0x559A, 0x5950, 0x5BA6, 0x5E7B, 0x60A3,
+ 0x63DB, 0x6B61, 0x6665, 0x6853, 0x6E19, 0x7165, 0x74B0, 0x7D08,
+ 0x9084, 0x9A69, 0x9C25, 0x6D3B, 0x6ED1, 0x733E, 0x8C41, 0x95CA,
+ 0x51F0, 0x5E4C, 0x5FA8, 0x604D, 0x60F6, 0x6130, 0x614C, 0x6643,
+ 0x6644, 0x69A5, 0x6CC1, 0x6E5F, 0x6EC9, 0x6F62, 0x714C, 0x749C,
+ 0x7687, 0x7BC1, 0x7C27, 0x8352, 0x8757, 0x9051, 0x968D, 0x9EC3,
+ 0x532F, 0x56DE, 0x5EFB, 0x5F8A, 0x6062, 0x6094, 0x61F7, 0x6666,
+ 0x6703, 0x6A9C, 0x6DEE, 0x6FAE, 0x7070, 0x736A, 0x7E6A, 0x81BE,
+ 0x8334, 0x86D4, 0x8AA8, 0x8CC4, 0x5283, 0x7372, 0x5B96, 0x6A6B,
+ 0x9404, 0x54EE, 0x5686, 0x5B5D, 0x6548, 0x6585, 0x66C9, 0x689F,
+ 0x6D8D, 0x6DC6, 0x723B, 0x80B4, 0x9175, 0x9A4D, 0x4FAF, 0x5019,
+ 0x539A, 0x540E, 0x543C, 0x5589, 0x55C5, 0x5E3F, 0x5F8C, 0x673D,
+ 0x7166, 0x73DD, 0x9005, 0x52DB, 0x52F3, 0x5864, 0x58CE, 0x7104,
+ 0x718F, 0x71FB, 0x85B0, 0x8A13, 0x6688, 0x85A8, 0x55A7, 0x6684,
+ 0x714A, 0x8431, 0x5349, 0x5599, 0x6BC1, 0x5F59, 0x5FBD, 0x63EE,
+ 0x6689, 0x7147, 0x8AF1, 0x8F1D, 0x9EBE, 0x4F11, 0x643A, 0x70CB,
+ 0x7566, 0x8667, 0x6064, 0x8B4E, 0x9DF8, 0x5147, 0x51F6, 0x5308,
+ 0x6D36, 0x80F8, 0x9ED1, 0x6615, 0x6B23, 0x7098, 0x75D5, 0x5403,
+ 0x5C79, 0x7D07, 0x8A16, 0x6B20, 0x6B3D, 0x6B46, 0x5438, 0x6070,
+ 0x6D3D, 0x7FD5, 0x8208, 0x50D6, 0x51DE, 0x559C, 0x566B, 0x56CD,
+ 0x59EC, 0x5B09, 0x5E0C, 0x6199, 0x6198, 0x6231, 0x665E, 0x66E6,
+ 0x7199, 0x71B9, 0x71BA, 0x72A7, 0x79A7, 0x7A00, 0x7FB2, 0x8A70,
+ 0x3001, 0x3002, 0x2025, 0x00AD, 0x2015, 0x2225, 0xFF5E, 0x3014,
+ 0x3015, 0x3008, 0x3009, 0x300A, 0x300B, 0x300C, 0x300D, 0x300E,
+ 0x300F, 0x3010, 0x3011, 0x3013, 0xFF01, 0xFF08, 0xFF09, 0xFF0C,
+ 0xFF0E, 0xFF1A, 0xFF1B, 0xFF1C, 0xFF1D, 0xFF1E, 0xFF1F, 0xFF3B,
+ 0xFF3D, 0xFF3F, 0xFF5B, 0xFF5C, 0xFF5D, 0xFF5E, 0x0020, 0x0021,
+ 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029,
+ 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, 0x0030, 0x0031,
+ 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039,
+ 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, 0x0040, 0x0041,
+ 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049,
+ 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051,
+ 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059,
+ 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, 0x0060, 0x0061,
+ 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069,
+ 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, 0x0070, 0x0071,
+ 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079,
+ 0x007A, 0x007B, 0x007C, 0x007D, 0x203E, 0x007E, 0x005C, 0x231C,
+ 0x231F, 0x0000, 0x0000, 0x0000, 0x0000, 0x300E, 0x300F, 0x300A,
+ 0x300B, 0x3008, 0x3009, 0x0028, 0x0029, 0x0000, 0x0000, 0x0028,
+ 0x0029, 0x0028, 0x0029, 0x0000, 0x0000, 0x0028, 0x0029, 0x0000,
+ 0x0000, 0x3016, 0x3017, 0x3016, 0x3017, 0x3018, 0x3019, 0x005B,
+ 0x005D, 0x0000, 0x0000, 0x263E, 0x263D, 0x2021, 0x2021, 0x2020,
+ 0x2021, 0x0000, 0x2217, 0x0000, 0x0000, 0x201F, 0x201B, 0x02D6,
+ 0x02D7, 0x00D7, 0x221E, 0x0000, 0x00B1, 0x2213, 0x003E, 0x003C,
+ 0x003D, 0x2260, 0x207D, 0x207E, 0x007B, 0x007D, 0x0000, 0x0000,
+ 0x2229, 0x222A, 0x2282, 0x2208, 0x03A3, 0x0021, 0x0000, 0x3021,
+ 0x3022, 0x3023, 0x0000, 0x0000, 0x0000, 0x4E03, 0x0000, 0x0000,
+ 0x5341, 0x0000, 0x0000, 0x0027, 0x3014, 0x3015, 0x002A, 0x0000,
+ 0x2217, 0x002A, 0xCDCD, 0x3001, 0x3002, 0x0028, 0x0029, 0x0028,
+ 0x0029, 0x0028, 0x0029, 0x3016, 0x3017, 0x3010, 0x3011, 0x0000,
+ 0x0000, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE,
+ 0x20DE, 0x20DE, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D,
+ 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x00B6, 0x0000, 0x0000,
+ 0x22EF, 0x2237, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE,
+ 0x20DE, 0x20DE, 0x20DE, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D,
+ 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x278A, 0x278B,
+ 0x278C, 0x278D, 0x278E, 0x278F, 0x2790, 0x2791, 0x2792, 0x2793,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029,
+ 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029,
+ 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029,
+ 0x0029, 0x0029, 0x0029, 0x0029, 0x24B6, 0x24B7, 0x24B8, 0x24B9,
+ 0x24BA, 0x24BB, 0x24BC, 0x24BD, 0x24BE, 0x24BF, 0x24C0, 0x24C1,
+ 0x24C2, 0x24C3, 0x24C4, 0x24C5, 0x24C6, 0x24C7, 0x24C8, 0x24C9,
+ 0x24CA, 0x24CB, 0x24CC, 0x24CD, 0x24CE, 0x24CF, 0x20DE, 0x20DE,
+ 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x005D,
+ 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D,
+ 0x005D, 0x005D, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE,
+ 0x20DE, 0x20DE, 0x20DE, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D,
+ 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x22CF, 0x22CE, 0x22CF, 0x22CE, 0x2280,
+ 0x2281, 0x2270, 0x2271, 0x2272, 0x2273, 0x0000, 0x228A, 0x0000,
+ 0x228B, 0x2276, 0x2277, 0x2279, 0x22DA, 0x22DB, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x2221, 0x2245, 0x2243, 0x2248, 0x0000, 0x22A4,
+ 0x22AB, 0x0000, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE,
+ 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x0000, 0x2460, 0x2461, 0x2462,
+ 0x2463, 0x2464, 0x2465, 0x2466, 0x2467, 0x2468, 0x0029, 0x0029,
+ 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029,
+ 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029,
+ 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029,
+ 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029,
+ 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029,
+ 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029,
+ 0x0029, 0x0029, 0x0021, 0x00B0, 0x0027, 0x0022, 0x2034, 0x0029,
+ 0x0029, 0x0029, 0x0029, 0x0000, 0x0000, 0x2020, 0x2020, 0x2021,
+ 0x2020, 0x00A7, 0x0023, 0x002A, 0x002A, 0x0000, 0x0000, 0x2042,
+ 0x002A, 0x0000, 0x0000, 0x2042, 0x002A, 0x0000, 0x0000, 0x2022,
+ 0x20DF, 0x20DF, 0x0000, 0x20DF, 0x3008, 0x3009, 0x300A, 0x300B,
+ 0x261C, 0x261E, 0x0000, 0x0000, 0x20DE, 0x0000, 0x20DE, 0x20DE,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x20DD, 0x20DD, 0x271A, 0x2716,
+ 0x0000, 0x25EF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x25CC,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20A9, 0x0000, 0x0000,
+ 0x262F, 0x0000, 0x262F, 0x262F, 0x0000, 0x0000, 0x0000, 0x3020,
+ 0x0000, 0x2776, 0x2777, 0x2778, 0x2779, 0x277A, 0x277B, 0x277C,
+ 0x277D, 0x277E, 0x277F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0029, 0x0029, 0x0029,
+ 0x0029, 0x0029, 0x0029, 0x2642, 0x22A9, 0x3036, 0x25CB, 0x25D3,
+ 0x25A1, 0x2302, 0x0000, 0x25AD, 0x25AD, 0x0000, 0x0000, 0x0000,
+ 0x25C7, 0x0000, 0x0000, 0x2206, 0x22BF, 0x231E, 0x0000, 0x2225,
+ 0x2226, 0x0000, 0x2253, 0x2251, 0x2266, 0x2267, 0x2213, 0x2295,
+ 0x2296, 0x2297, 0x20DD, 0x2314, 0x0000, 0x0000, 0x2262, 0x0000,
+ 0x25B1, 0x0000, 0x2222, 0x2250, 0x00D8, 0x234A, 0x22A3, 0x0338,
+ 0x0000, 0x226E, 0x226F, 0x2285, 0x2284, 0x2209, 0x220C, 0x22BB,
+ 0x0016, 0x225A, 0x2306, 0x0024, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x329E, 0x0000, 0x203C, 0x003F, 0x0000, 0x003F, 0x22C4,
+ 0x25C7, 0x22C4, 0x25C6, 0x25AB, 0x25A1, 0x25AB, 0x25A0, 0x25E6,
+ 0x25CB, 0x25E6, 0x25CF, 0x25BD, 0x25B3, 0x25B7, 0x25C1, 0x2726,
+ 0x25CF, 0x25A0, 0x0000, 0x25CA, 0x3231, 0x3239, 0x33CB, 0x2483,
+ 0x2494, 0x2495, 0x2496, 0x2497, 0x0029, 0x0029, 0x0029, 0x0029,
+ 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x2192, 0x2190,
+ 0x2191, 0x2193, 0x2196, 0x2197, 0x2198, 0x2199, 0x21D0, 0x21CF,
+ 0x21CD, 0x21D4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x2794, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x279C, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x27BA, 0x0000, 0x0000, 0x0000, 0x0000, 0x21D1, 0x21D3,
+ 0x0000, 0x279E, 0x0000, 0x0000, 0x0000, 0x279E, 0x0000, 0x0000,
+ 0x21B5, 0x21B1, 0x0000, 0x21B4, 0x21B0, 0x21B3, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x21E6, 0x21E8, 0x21E7, 0x21E9, 0x21BC, 0x21C0, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x21C0, 0x21BC, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x21C4, 0x21C5, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E,
+ 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E,
+ 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E,
+ 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E,
+ 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E,
+ 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E,
+ 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x20DE, 0x20DE,
+ 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE,
+ 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE,
+ 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE,
+ 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE,
+ 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE,
+ 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE,
+ 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE,
+ 0x20DE, 0x20DE, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD,
+ 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD,
+ 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD,
+ 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD,
+ 0x20DD, 0x20DD, 0x2483, 0x2484, 0x2485, 0x2486, 0x2487, 0x0029,
+ 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x20DD, 0x20DD, 0x20DD,
+ 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD,
+ 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD,
+ 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD,
+ 0x3294, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD,
+ 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD,
+ 0x32A5, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD,
+ 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD,
+ 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD,
+ 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD,
+ 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD,
+ 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD,
+ 0x20DD, 0x0029, 0x0029, 0x0029, 0x0029, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x2794, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x21E0, 0x21E1,
+ 0x21E2, 0x21E3, 0x0000, 0x27A1, 0x0000, 0x0000, 0x21E6, 0x21E8,
+ 0x21E7, 0x21E9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x261D, 0x261F,
+ 0x0000, 0x0000, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD,
+ 0x20DD, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE,
+ 0x20DE, 0x20DE, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D,
+ 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x20DE, 0x20DE, 0x20DE,
+ 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x005D,
+ 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D,
+ 0x005D, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE,
+ 0x20DE, 0x20DE, 0x20DE, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D,
+ 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x20DE, 0x20DE, 0x20DE,
+ 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x3290, 0x328A, 0x328B, 0x328C,
+ 0x328D, 0x328E, 0x328F, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE,
+ 0x20DE, 0x20DE, 0x300C, 0x300D, 0x300E, 0x300F, 0x21E8, 0x21E6,
+ 0x21E7, 0x21E9, 0x0022, 0x301F, 0x301D, 0x2036, 0x0060, 0x3001,
+ 0x0000, 0x0021, 0x3021, 0x002C, 0x3002, 0xAC02, 0xAC03, 0xAC05,
+ 0xAC06, 0xAC0B, 0xAC0C, 0xAC0D, 0xAC0E, 0xAC0F, 0xAC18, 0xAC1E,
+ 0xAC1F, 0xAC21, 0xAC22, 0xAC23, 0xAC25, 0xAC26, 0xAC27, 0xAC28,
+ 0xAC29, 0xAC2A, 0xAC2B, 0xAC2E, 0xAC32, 0xAC33, 0xAC34, 0xAC35,
+ 0xAC36, 0xAC37, 0xAC3A, 0xAC3B, 0xAC3D, 0xAC3E, 0xAC3F, 0xAC41,
+ 0xAC42, 0xAC43, 0xAC44, 0xAC45, 0xAC46, 0xAC47, 0xAC48, 0xAC49,
+ 0xAC4A, 0xAC4C, 0xAC4E, 0xAC4F, 0xAC50, 0xAC51, 0xAC52, 0xAC53,
+ 0xAC55, 0xAC56, 0xAC57, 0xAC59, 0xAC5A, 0xAC5B, 0xAC5D, 0xAC5E,
+ 0xAC5F, 0xAC60, 0xAC61, 0xAC62, 0xAC63, 0xAC64, 0xAC65, 0xAC66,
+ 0xAC67, 0xAC68, 0xAC69, 0xAC6A, 0xAC6B, 0xAC6C, 0xAC6D, 0xAC6E,
+ 0xAC6F, 0xAC72, 0xAC73, 0xAC75, 0xAC76, 0xAC79, 0xAC7B, 0xAC7C,
+ 0xAC7D, 0xAC7E, 0xAC7F, 0xAC82, 0xAC87, 0xAC88, 0xAC8D, 0xAC8E,
+ 0xAC8F, 0xAC91, 0xAC92, 0xAC93, 0xAC95, 0xAC96, 0xAC97, 0xAC98,
+ 0xAC99, 0xAC9A, 0xAC9B, 0xAC9E, 0xACA2, 0xACA3, 0xACA4, 0xACA5,
+ 0xACA6, 0xACA7, 0xACAB, 0xACAD, 0xACAE, 0xACB1, 0xACB2, 0xACB3,
+ 0xACB4, 0xACB5, 0xACB6, 0xACB7, 0xACBA, 0xACBE, 0xACBF, 0xACC0,
+ 0xACC2, 0xACC3, 0xACC5, 0xACC6, 0xACC7, 0xACC9, 0xACCA, 0xACCB,
+ 0xACCD, 0xACCE, 0xACCF, 0xACD0, 0xACD1, 0xACD2, 0xACD3, 0xACD4,
+ 0xACD6, 0xACD8, 0xACD9, 0xACDA, 0xACDB, 0xACDC, 0xACDD, 0xACDE,
+ 0xACDF, 0xACE2, 0xACE3, 0xACE5, 0xACE6, 0xACE9, 0xACEB, 0xACED,
+ 0xACEE, 0xACF2, 0xACF4, 0xACF7, 0xACF8, 0xACF9, 0xACFA, 0xACFB,
+ 0xACFE, 0xACFF, 0xAD01, 0xAD02, 0xAD03, 0xAD05, 0xAD07, 0xAD08,
+ 0xAD09, 0xAD0A, 0xAD0B, 0xAD0E, 0xAD10, 0xAD12, 0xAD13, 0xAD14,
+ 0xAD15, 0xAD16, 0xAD17, 0xAD19, 0xAD1A, 0xAD1B, 0xAD1D, 0xAD1E,
+ 0xAD1F, 0xAD21, 0xAD22, 0xAD23, 0xAD24, 0xAD25, 0xAD26, 0xAD27,
+ 0xAD28, 0xAD2A, 0xAD2B, 0xAD2E, 0xAD2F, 0xAD30, 0xAD31, 0xAD32,
+ 0xAD33, 0xAD36, 0xAD37, 0xAD39, 0xAD3A, 0xAD3B, 0xAD3D, 0xAD3E,
+ 0xAD3F, 0xAD40, 0xAD41, 0xAD42, 0xAD43, 0xAD46, 0xAD48, 0xAD4A,
+ 0xAD4B, 0xAD4C, 0xAD4D, 0xAD4E, 0xAD4F, 0xAD51, 0xAD52, 0xAD53,
+ 0xAD55, 0xAD56, 0xAD57, 0xAD59, 0xAD5A, 0xAD5B, 0xAD5C, 0xAD5D,
+ 0xAD5E, 0xAD5F, 0xAD60, 0xAD62, 0xAD64, 0xAD65, 0xAD66, 0xAD67,
+ 0xAD68, 0xAD69, 0xAD6A, 0xAD6B, 0xAD6E, 0xAD6F, 0xAD71, 0xAD72,
+ 0xAD77, 0xAD78, 0xAD79, 0xAD7A, 0xAD7E, 0xAD80, 0xAD83, 0xAD84,
+ 0xAD85, 0xAD86, 0xAD87, 0xAD8A, 0xAD8B, 0xAD8D, 0xAD8E, 0xAD8F,
+ 0xAD91, 0xAD92, 0xAD93, 0xAD94, 0xAD95, 0xAD96, 0xAD97, 0xAD98,
+ 0xAD99, 0xAD9A, 0xAD9B, 0xAD9E, 0xAD9F, 0xADA0, 0xADA1, 0xADA2,
+ 0xADA3, 0xADA5, 0xADA6, 0xADA7, 0xADA8, 0xADA9, 0xADAA, 0xADAB,
+ 0xADAC, 0xADAD, 0xADAE, 0xADAF, 0xADB0, 0xADB1, 0xADB2, 0xADB3,
+ 0xADB4, 0xADB5, 0xADB6, 0xADB8, 0xADB9, 0xADBA, 0xADBB, 0xADBC,
+ 0xADBD, 0xADBE, 0xADBF, 0xADC2, 0xADC3, 0xADC5, 0xADC6, 0xADC7,
+ 0xADC9, 0xADCA, 0xADCB, 0xADCC, 0xADCD, 0xADCE, 0xADCF, 0xADD2,
+ 0xADD4, 0xADD5, 0xADD6, 0xADD7, 0xADD8, 0xADD9, 0xADDA, 0xADDB,
+ 0xADDD, 0xADDE, 0xADDF, 0xADE1, 0xADE2, 0xADE3, 0xADE5, 0xADE6,
+ 0xADE7, 0xADE8, 0xADE9, 0xADEA, 0xADEB, 0xADEC, 0xADED, 0xADEE,
+ 0xADEF, 0xADF0, 0xADF1, 0xADF2, 0xADF3, 0xADF4, 0xADF5, 0xADF6,
+ 0xADF7, 0xADFA, 0xADFB, 0xADFD, 0xADFE, 0xAE02, 0xAE03, 0xAE04,
+ 0xAE05, 0xAE06, 0xAE07, 0xAE0A, 0xAE0C, 0xAE0E, 0xAE0F, 0xAE10,
+ 0xAE11, 0xAE12, 0xAE13, 0xAE15, 0xAE16, 0xAE17, 0xAE18, 0xAE19,
+ 0xAE1A, 0xAE1B, 0xAE1C, 0xAE1D, 0xAE1E, 0xAE1F, 0xAE20, 0xAE21,
+ 0xAE22, 0xAE23, 0xAE24, 0xAE25, 0xAE26, 0xAE27, 0xAE28, 0xAE29,
+ 0xAE2A, 0xAE2B, 0xAE2C, 0xAE2D, 0xAE2E, 0xAE2F, 0xAE32, 0xAE33,
+ 0xAE35, 0xAE36, 0xAE39, 0xAE3B, 0xAE3C, 0xAE3D, 0xAE3E, 0xAE3F,
+ 0xAE42, 0xAE44, 0xAE47, 0xAE48, 0xAE49, 0xAE4B, 0xAE4F, 0xAE51,
+ 0xAE52, 0xAE53, 0xAE55, 0xAE57, 0xAE58, 0xAE59, 0xAE5A, 0xAE5B,
+ 0xAE5E, 0xAE62, 0xAE63, 0xAE64, 0xAE66, 0xAE67, 0xAE6A, 0xAE6B,
+ 0xAE6D, 0xAE6E, 0xAE6F, 0xAE71, 0xAE72, 0xAE73, 0xAE74, 0xAE75,
+ 0xAE76, 0xAE77, 0xAE7A, 0xAE7E, 0xAE7F, 0xAE80, 0xAE81, 0xAE82,
+ 0xAE83, 0xAE86, 0xAE87, 0xAE88, 0xAE89, 0xAE8A, 0xAE8B, 0xAE8D,
+ 0xAE8E, 0xAE8F, 0xAE90, 0xAE91, 0xAE92, 0xAE93, 0xAE94, 0xAE95,
+ 0xAE96, 0xAE97, 0xAE98, 0xAE99, 0xAE9A, 0xAE9B, 0xAE9C, 0xAE9D,
+ 0xAE9E, 0xAE9F, 0xAEA0, 0xAEA1, 0xAEA2, 0xAEA3, 0xAEA4, 0xAEA5,
+ 0xAEA6, 0xAEA7, 0xAEA8, 0xAEA9, 0xAEAA, 0xAEAB, 0xAEAC, 0xAEAD,
+ 0xAEAE, 0xAEAF, 0xAEB0, 0xAEB1, 0xAEB2, 0xAEB3, 0xAEB4, 0xAEB5,
+ 0xAEB6, 0xAEB7, 0xAEB8, 0xAEB9, 0xAEBA, 0xAEBB, 0xAEBF, 0xAEC1,
+ 0xAEC2, 0xAEC3, 0xAEC5, 0xAEC6, 0xAEC7, 0xAEC8, 0xAEC9, 0xAECA,
+ 0xAECB, 0xAECE, 0xAED2, 0xAED3, 0xAED4, 0xAED5, 0xAED6, 0xAED7,
+ 0xAEDA, 0xAEDB, 0xAEDD, 0xAEDE, 0xAEDF, 0xAEE0, 0xAEE1, 0xAEE2,
+ 0xAEE3, 0xAEE4, 0xAEE5, 0xAEE6, 0xAEE7, 0xAEE9, 0xAEEA, 0xAEEC,
+ 0xAEEE, 0xAEEF, 0xAEF0, 0xAEF1, 0xAEF2, 0xAEF3, 0xAEF5, 0xAEF6,
+ 0xAEF7, 0xAEF9, 0xAEFA, 0xAEFB, 0xAEFD, 0xAEFE, 0xAEFF, 0xAF00,
+ 0xAF01, 0xAF02, 0xAF03, 0xAF04, 0xAF05, 0xAF06, 0xAF09, 0xAF0A,
+ 0xAF0B, 0xAF0C, 0xAF0E, 0xAF0F, 0xAF11, 0xAF12, 0xAF13, 0xAF14,
+ 0xAF15, 0xAF16, 0xAF17, 0xAF18, 0xAF19, 0xAF1A, 0xAF1B, 0xAF1C,
+ 0xAF1D, 0xAF1E, 0xAF1F, 0xAF20, 0xAF21, 0xAF22, 0xAF23, 0xAF24,
+ 0xAF25, 0xAF26, 0xAF27, 0xAF28, 0xAF29, 0xAF2A, 0xAF2B, 0xAF2E,
+ 0xAF2F, 0xAF31, 0xAF33, 0xAF35, 0xAF36, 0xAF37, 0xAF38, 0xAF39,
+ 0xAF3A, 0xAF3B, 0xAF3E, 0xAF40, 0xAF44, 0xAF45, 0xAF46, 0xAF47,
+ 0xAF4A, 0xAF4B, 0xAF4C, 0xAF4D, 0xAF4E, 0xAF4F, 0xAF51, 0xAF52,
+ 0xAF53, 0xAF54, 0xAF55, 0xAF56, 0xAF57, 0xAF58, 0xAF59, 0xAF5A,
+ 0xAF5B, 0xAF5E, 0xAF5F, 0xAF60, 0xAF61, 0xAF62, 0xAF63, 0xAF66,
+ 0xAF67, 0xAF68, 0xAF69, 0xAF6A, 0xAF6B, 0xAF6C, 0xAF6D, 0xAF6E,
+ 0xAF6F, 0xAF70, 0xAF71, 0xAF72, 0xAF73, 0xAF74, 0xAF75, 0xAF76,
+ 0xAF77, 0xAF78, 0xAF7A, 0xAF7B, 0xAF7C, 0xAF7D, 0xAF7E, 0xAF7F,
+ 0xAF81, 0xAF82, 0xAF83, 0xAF85, 0xAF86, 0xAF87, 0xAF89, 0xAF8A,
+ 0xAF8B, 0xAF8C, 0xAF8D, 0xAF8E, 0xAF8F, 0xAF92, 0xAF93, 0xAF94,
+ 0xAF96, 0xAF97, 0xAF98, 0xAF99, 0xAF9A, 0xAF9B, 0xAF9D, 0xAF9E,
+ 0xAF9F, 0xAFA0, 0xAFA1, 0xAFA2, 0xAFA3, 0xAFA4, 0xAFA5, 0xAFA6,
+ 0xAFA7, 0xAFA8, 0xAFA9, 0xAFAA, 0xAFAB, 0xAFAC, 0xAFAD, 0xAFAE,
+ 0xAFAF, 0xAFB0, 0xAFB1, 0xAFB2, 0xAFB3, 0xAFB4, 0xAFB5, 0xAFB6,
+ 0xAFB7, 0xAFBA, 0xAFBB, 0xAFBD, 0xAFBE, 0xAFBF, 0xAFC1, 0xAFC2,
+ 0xAFC3, 0xAFC4, 0xAFC5, 0xAFC6, 0xAFCA, 0xAFCC, 0xAFCF, 0xAFD0,
+ 0xAFD1, 0xAFD2, 0xAFD3, 0xAFD5, 0xAFD6, 0xAFD7, 0xAFD8, 0xAFD9,
+ 0xAFDA, 0xAFDB, 0xAFDD, 0xAFDE, 0xAFDF, 0xAFE0, 0xAFE1, 0xAFE2,
+ 0xAFE3, 0xAFE4, 0xAFE5, 0xAFE6, 0xAFE7, 0xAFEA, 0xAFEB, 0xAFEC,
+ 0xAFED, 0xAFEE, 0xAFEF, 0xAFF2, 0xAFF3, 0xAFF5, 0xAFF6, 0xAFF7,
+ 0xAFF9, 0xAFFA, 0xAFFB, 0xAFFC, 0xAFFD, 0xAFFE, 0xAFFF, 0xB002,
+ 0xB003, 0xB005, 0xB006, 0xB007, 0xB008, 0xB009, 0xB00A, 0xB00B,
+ 0xB00D, 0xB00E, 0xB00F, 0xB011, 0xB012, 0xB013, 0xB015, 0xB016,
+ 0xB017, 0xB018, 0xB019, 0xB01A, 0xB01B, 0xB01E, 0xB01F, 0xB020,
+ 0xB021, 0xB022, 0xB023, 0xB024, 0xB025, 0xB026, 0xB027, 0xB029,
+ 0xB02A, 0xB02B, 0xB02C, 0xB02D, 0xB02E, 0xB02F, 0xB030, 0xB031,
+ 0xB032, 0xB033, 0xB034, 0xB035, 0xB036, 0xB037, 0xB038, 0xB039,
+ 0xB03A, 0xB03B, 0xB03C, 0xB03D, 0xB03E, 0xB03F, 0xB040, 0xB041,
+ 0xB042, 0xB043, 0xB046, 0xB047, 0xB049, 0xB04B, 0xB04D, 0xB04F,
+ 0xB050, 0xB051, 0xB052, 0xB056, 0xB058, 0xB05A, 0xB05B, 0xB05C,
+ 0xB05E, 0xB05F, 0xB060, 0xB061, 0xB062, 0xB063, 0xB064, 0xB065,
+ 0xB066, 0xB067, 0xB068, 0xB069, 0xB06A, 0xB06B, 0xB06C, 0xB06D,
+ 0xB06E, 0xB06F, 0xB070, 0xB071, 0xB072, 0xB073, 0xB074, 0xB075,
+ 0xB076, 0xB077, 0xB078, 0xB079, 0xB07A, 0xB07B, 0xB07E, 0xB07F,
+ 0xB081, 0xB082, 0xB083, 0xB085, 0xB086, 0xB087, 0xB088, 0xB089,
+ 0xB08A, 0xB08B, 0xB08E, 0xB090, 0xB092, 0xB093, 0xB094, 0xB095,
+ 0xB096, 0xB097, 0xB09B, 0xB09D, 0xB09E, 0xB0A3, 0xB0A4, 0xB0A5,
+ 0xB0A6, 0xB0A7, 0xB0AA, 0xB0B0, 0xB0B2, 0xB0B6, 0xB0B7, 0xB0B9,
+ 0xB0BA, 0xB0BB, 0xB0BD, 0xB0BE, 0xB0BF, 0xB0C0, 0xB0C1, 0xB0C2,
+ 0xB0C3, 0xB0C6, 0xB0CA, 0xB0CB, 0xB0CC, 0xB0CD, 0xB0CE, 0xB0CF,
+ 0xB0D2, 0xB0D3, 0xB0D5, 0xB0D6, 0xB0D7, 0xB0D9, 0xB0DA, 0xB0DB,
+ 0xB0DC, 0xB0DD, 0xB0DE, 0xB0DF, 0xB0E1, 0xB0E2, 0xB0E3, 0xB0E4,
+ 0xB0E6, 0xB0E7, 0xB0E8, 0xB0E9, 0xB0EA, 0xB0EB, 0xB0EC, 0xB0ED,
+ 0xB0EE, 0xB0EF, 0xB0F0, 0xB0F1, 0xB0F2, 0xB0F3, 0xB0F4, 0xB0F5,
+ 0xB0F6, 0xB0F7, 0xB0F8, 0xB0F9, 0xB0FA, 0xB0FB, 0xB0FC, 0xB0FD,
+ 0xB0FE, 0xB0FF, 0xB100, 0xB101, 0xB102, 0xB103, 0xB104, 0xB105,
+ 0xB106, 0xB107, 0xB10A, 0xB10D, 0xB10E, 0xB10F, 0xB111, 0xB114,
+ 0xB115, 0xB116, 0xB117, 0xB11A, 0xB11E, 0xB11F, 0xB120, 0xB121,
+ 0xB122, 0xB126, 0xB127, 0xB129, 0xB12A, 0xB12B, 0xB12D, 0xB12E,
+ 0xB12F, 0xB130, 0xB131, 0xB132, 0xB133, 0xB136, 0xB13A, 0xB13B,
+ 0xB13C, 0xB13D, 0xB13E, 0xB13F, 0xB142, 0xB143, 0xB145, 0xB146,
+ 0xB147, 0xB149, 0xB14A, 0xB14B, 0xB14C, 0xB14D, 0xB14E, 0xB14F,
+ 0xB152, 0xB153, 0xB156, 0xB157, 0xB159, 0xB15A, 0xB15B, 0xB15D,
+ 0xB15E, 0xB15F, 0xB161, 0xB162, 0xB163, 0xB164, 0xB165, 0xB166,
+ 0xB167, 0xB168, 0xB169, 0xB16A, 0xB16B, 0xB16C, 0xB16D, 0xB16E,
+ 0xB16F, 0xB170, 0xB171, 0xB172, 0xB173, 0xB174, 0xB175, 0xB176,
+ 0xB177, 0xB17A, 0xB17B, 0xB17D, 0xB17E, 0xB17F, 0xB181, 0xB183,
+ 0xB184, 0xB185, 0xB186, 0xB187, 0xB18A, 0xB18C, 0xB18E, 0xB18F,
+ 0xB190, 0xB191, 0xB195, 0xB196, 0xB197, 0xB199, 0xB19A, 0xB19B,
+ 0xB19D, 0xB19E, 0xB19F, 0xB1A0, 0xB1A1, 0xB1A2, 0xB1A3, 0xB1A4,
+ 0xB1A5, 0xB1A6, 0xB1A7, 0xB1A9, 0xB1AA, 0xB1AB, 0xB1AC, 0xB1AD,
+ 0xB1AE, 0xB1AF, 0xB1B0, 0xB1B1, 0xB1B2, 0xB1B3, 0xB1B4, 0xB1B5,
+ 0xB1B6, 0xB1B7, 0xB1B8, 0xB1B9, 0xB1BA, 0xB1BB, 0xB1BC, 0xB1BD,
+ 0xB1BE, 0xB1BF, 0xB1C0, 0xB1C1, 0xB1C2, 0xB1C3, 0xB1C4, 0xB1C5,
+ 0xB1C6, 0xB1C7, 0xB1C8, 0xB1C9, 0xB1CA, 0xB1CB, 0xB1CD, 0xB1CE,
+ 0xB1CF, 0xB1D1, 0xB1D2, 0xB1D3, 0xB1D5, 0xB1D6, 0xB1D7, 0xB1D8,
+ 0xB1D9, 0xB1DA, 0xB1DB, 0xB1DE, 0xB1E0, 0xB1E1, 0xB1E2, 0xB1E3,
+ 0xB1E4, 0xB1E5, 0xB1E6, 0xB1E7, 0xB1EA, 0xB1EB, 0xB1ED, 0xB1EE,
+ 0xB1EF, 0xB1F1, 0xB1F2, 0xB1F3, 0xB1F4, 0xB1F5, 0xB1F6, 0xB1F7,
+ 0xB1F8, 0xB1FA, 0xB1FC, 0xB1FE, 0xB1FF, 0xB200, 0xB201, 0xB202,
+ 0xB203, 0xB206, 0xB207, 0xB209, 0xB20A, 0xB20D, 0xB20E, 0xB20F,
+ 0xB210, 0xB211, 0xB212, 0xB213, 0xB216, 0xB218, 0xB21A, 0xB21B,
+ 0xB21C, 0xB21D, 0xB21E, 0xB21F, 0xB221, 0xB222, 0xB223, 0xB224,
+ 0xB225, 0xB226, 0xB227, 0xB228, 0xB229, 0xB22A, 0xB22B, 0xB22C,
+ 0xB22D, 0xB22E, 0xB22F, 0xB230, 0xB231, 0xB232, 0xB233, 0xB235,
+ 0xB236, 0xB237, 0xB238, 0xB239, 0xB23A, 0xB23B, 0xB23D, 0xB23E,
+ 0xB23F, 0xB240, 0xB241, 0xB242, 0xB243, 0xB244, 0xB245, 0xB246,
+ 0xB247, 0xB248, 0xB249, 0xB24A, 0xB24B, 0xB24C, 0xB24D, 0xB24E,
+ 0xB24F, 0xB250, 0xB251, 0xB252, 0xB253, 0xB254, 0xB255, 0xB256,
+ 0xB257, 0xB259, 0xB25A, 0xB25B, 0xB25D, 0xB25E, 0xB25F, 0xB261,
+ 0xB262, 0xB263, 0xB264, 0xB265, 0xB266, 0xB267, 0xB26A, 0xB26B,
+ 0xB26C, 0xB26D, 0xB26E, 0xB26F, 0xB270, 0xB271, 0xB272, 0xB273,
+ 0xB276, 0xB277, 0xB278, 0xB279, 0xB27A, 0xB27B, 0xB27D, 0xB27E,
+ 0xB27F, 0xB280, 0xB281, 0xB282, 0xB283, 0xB286, 0xB287, 0xB288,
+ 0xB28A, 0xB28B, 0xB28C, 0xB28D, 0xB28E, 0xB28F, 0xB292, 0xB293,
+ 0xB295, 0xB296, 0xB297, 0xB29B, 0xB29C, 0xB29D, 0xB29E, 0xB29F,
+ 0xB2A2, 0xB2A4, 0xB2A7, 0xB2A8, 0xB2A9, 0xB2AB, 0xB2AD, 0xB2AE,
+ 0xB2AF, 0xB2B1, 0xB2B2, 0xB2B3, 0xB2B5, 0xB2B6, 0xB2B7, 0xB2B8,
+ 0xB2B9, 0xB2BA, 0xB2BB, 0xB2BC, 0xB2BD, 0xB2BE, 0xB2BF, 0xB2C0,
+ 0xB2C1, 0xB2C2, 0xB2C3, 0xB2C4, 0xB2C5, 0xB2C6, 0xB2C7, 0xB2CA,
+ 0xB2CB, 0xB2CD, 0xB2CE, 0xB2CF, 0xB2D1, 0xB2D3, 0xB2D4, 0xB2D5,
+ 0xB2D6, 0xB2D7, 0xB2DA, 0xB2DC, 0xB2DE, 0xB2DF, 0xB2E0, 0xB2E1,
+ 0xB2E3, 0xB2E7, 0xB2E9, 0xB2EA, 0xB2F0, 0xB2F1, 0xB2F2, 0xB2F6,
+ 0xB2FC, 0xB2FD, 0xB2FE, 0xB302, 0xB303, 0xB305, 0xB306, 0xB307,
+ 0xB309, 0xB30A, 0xB30B, 0xB30C, 0xB30D, 0xB30E, 0xB30F, 0xB312,
+ 0xB316, 0xB317, 0xB318, 0xB319, 0xB31A, 0xB31B, 0xB31D, 0xB31E,
+ 0xB31F, 0xB320, 0xB321, 0xB322, 0xB323, 0xB324, 0xB325, 0xB326,
+ 0xB327, 0xB328, 0xB329, 0xB32A, 0xB32B, 0xB32C, 0xB32D, 0xB32E,
+ 0xB32F, 0xB330, 0xB331, 0xB332, 0xB333, 0xB334, 0xB335, 0xB336,
+ 0xB337, 0xB338, 0xB339, 0xB33A, 0xB33B, 0xB33C, 0xB33D, 0xB33E,
+ 0xB33F, 0xB340, 0xB341, 0xB342, 0xB343, 0xB344, 0xB345, 0xB346,
+ 0xB347, 0xB348, 0xB349, 0xB34A, 0xB34B, 0xB34C, 0xB34D, 0xB34E,
+ 0xB34F, 0xB350, 0xB351, 0xB352, 0xB353, 0xB357, 0xB359, 0xB35A,
+ 0xB35D, 0xB360, 0xB361, 0xB362, 0xB363, 0xB366, 0xB368, 0xB36A,
+ 0xB36C, 0xB36D, 0xB36F, 0xB372, 0xB373, 0xB375, 0xB376, 0xB377,
+ 0xB379, 0xB37A, 0xB37B, 0xB37C, 0xB37D, 0xB37E, 0xB37F, 0xB382,
+ 0xB386, 0xB387, 0xB388, 0xB389, 0xB38A, 0xB38B, 0xB38D, 0xB38E,
+ 0xB38F, 0xB391, 0xB392, 0xB393, 0xB395, 0xB396, 0xB397, 0xB398,
+ 0xB399, 0xB39A, 0xB39B, 0xB39C, 0xB39D, 0xB39E, 0xB39F, 0xB3A2,
+ 0xB3A3, 0xB3A4, 0xB3A5, 0xB3A6, 0xB3A7, 0xB3A9, 0xB3AA, 0xB3AB,
+ 0xB3AD, 0xB3AE, 0xB3AF, 0xB3B0, 0xB3B1, 0xB3B2, 0xB3B3, 0xB3B4,
+ 0xB3B5, 0xB3B6, 0xB3B7, 0xB3B8, 0xB3B9, 0xB3BA, 0xB3BB, 0xB3BC,
+ 0xB3BD, 0xB3BE, 0xB3BF, 0xB3C0, 0xB3C1, 0xB3C2, 0xB3C3, 0xB3C6,
+ 0xB3C7, 0xB3C9, 0xB3CA, 0xB3CD, 0xB3CF, 0xB3D1, 0xB3D2, 0xB3D3,
+ 0xB3D6, 0xB3D8, 0xB3DA, 0xB3DC, 0xB3DE, 0xB3DF, 0xB3E1, 0xB3E2,
+ 0xB3E3, 0xB3E5, 0xB3E6, 0xB3E7, 0xB3E9, 0xB3EA, 0xB3EB, 0xB3EC,
+ 0xB3ED, 0xB3EE, 0xB3EF, 0xB3F0, 0xB3F1, 0xB3F2, 0xB3F3, 0xB3F4,
+ 0xB3F5, 0xB3F6, 0xB3F7, 0xB3F8, 0xB3F9, 0xB3FA, 0xB3FB, 0xB3FD,
+ 0xB3FE, 0xB3FF, 0xB400, 0xB401, 0xB402, 0xB403, 0xB404, 0xB405,
+ 0xB406, 0xB407, 0xB408, 0xB409, 0xB40A, 0xB40B, 0xB40C, 0xB40D,
+ 0xB40E, 0xB40F, 0xB411, 0xB412, 0xB413, 0xB414, 0xB415, 0xB416,
+ 0xB417, 0xB419, 0xB41A, 0xB41B, 0xB41D, 0xB41E, 0xB41F, 0xB421,
+ 0xB422, 0xB423, 0xB424, 0xB425, 0xB426, 0xB427, 0xB42A, 0xB42C,
+ 0xB42D, 0xB42E, 0xB42F, 0xB430, 0xB431, 0xB432, 0xB433, 0xB435,
+ 0xB436, 0xB437, 0xB438, 0xB439, 0xB43A, 0xB43B, 0xB43C, 0xB43D,
+ 0xB43E, 0xB43F, 0xB440, 0xB441, 0xB442, 0xB443, 0xB444, 0xB445,
+ 0xB446, 0xB447, 0xB448, 0xB449, 0xB44A, 0xB44B, 0xB44C, 0xB44D,
+ 0xB44E, 0xB44F, 0xB452, 0xB453, 0xB455, 0xB456, 0xB457, 0xB459,
+ 0xB45A, 0xB45B, 0xB45C, 0xB45D, 0xB45E, 0xB45F, 0xB462, 0xB464,
+ 0xB466, 0xB467, 0xB468, 0xB469, 0xB46A, 0xB46B, 0xB46D, 0xB46E,
+ 0xB46F, 0xB470, 0xB471, 0xB472, 0xB473, 0xB474, 0xB475, 0xB476,
+ 0xB477, 0xB478, 0xB479, 0xB47A, 0xB47B, 0xB47C, 0xB47D, 0xB47E,
+ 0xB47F, 0xB481, 0xB482, 0xB483, 0xB484, 0xB485, 0xB486, 0xB487,
+ 0xB489, 0xB48A, 0xB48B, 0xB48C, 0xB48D, 0xB48E, 0xB48F, 0xB490,
+ 0xB491, 0xB492, 0xB493, 0xB494, 0xB495, 0xB496, 0xB497, 0xB498,
+ 0xB499, 0xB49A, 0xB49B, 0xB49C, 0xB49E, 0xB49F, 0xB4A0, 0xB4A1,
+ 0xB4A2, 0xB4A3, 0xB4A5, 0xB4A6, 0xB4A7, 0xB4A9, 0xB4AA, 0xB4AB,
+ 0xB4AD, 0xB4AE, 0xB4AF, 0xB4B0, 0xB4B1, 0xB4B2, 0xB4B3, 0xB4B4,
+ 0xB4B6, 0xB4B8, 0xB4BA, 0xB4BB, 0xB4BC, 0xB4BD, 0xB4BE, 0xB4BF,
+ 0xB4C1, 0xB4C2, 0xB4C3, 0xB4C5, 0xB4C6, 0xB4C7, 0xB4C9, 0xB4CA,
+ 0xB4CB, 0xB4CC, 0xB4CD, 0xB4CE, 0xB4CF, 0xB4D1, 0xB4D2, 0xB4D3,
+ 0xB4D4, 0xB4D6, 0xB4D7, 0xB4D8, 0xB4D9, 0xB4DA, 0xB4DB, 0xB4DE,
+ 0xB4DF, 0xB4E1, 0xB4E2, 0xB4E5, 0xB4E7, 0xB4E8, 0xB4E9, 0xB4EA,
+ 0xB4EB, 0xB4EE, 0xB4F0, 0xB4F2, 0xB4F3, 0xB4F4, 0xB4F5, 0xB4F6,
+ 0xB4F7, 0xB4F9, 0xB4FA, 0xB4FB, 0xB4FC, 0xB4FD, 0xB4FE, 0xB4FF,
+ 0xB500, 0xB501, 0xB502, 0xB503, 0xB504, 0xB505, 0xB506, 0xB507,
+ 0xB508, 0xB509, 0xB50A, 0xB50B, 0xB50C, 0xB50D, 0xB50E, 0xB50F,
+ 0xB510, 0xB511, 0xB512, 0xB513, 0xB516, 0xB517, 0xB519, 0xB51A,
+ 0xB51D, 0xB51E, 0xB51F, 0xB520, 0xB521, 0xB522, 0xB523, 0xB526,
+ 0xB52B, 0xB52C, 0xB52D, 0xB52E, 0xB52F, 0xB532, 0xB533, 0xB535,
+ 0xB536, 0xB537, 0xB539, 0xB53A, 0xB53B, 0xB53C, 0xB53D, 0xB53E,
+ 0xB53F, 0xB542, 0xB546, 0xB547, 0xB548, 0xB549, 0xB54A, 0xB54E,
+ 0xB54F, 0xB551, 0xB552, 0xB553, 0xB555, 0xB556, 0xB557, 0xB558,
+ 0xB559, 0xB55A, 0xB55B, 0xB55E, 0xB562, 0xB563, 0xB564, 0xB565,
+ 0xB566, 0xB567, 0xB568, 0xB569, 0xB56A, 0xB56B, 0xB56C, 0xB56D,
+ 0xB56E, 0xB56F, 0xB570, 0xB571, 0xB572, 0xB573, 0xB574, 0xB575,
+ 0xB576, 0xB577, 0xB578, 0xB579, 0xB57A, 0xB57B, 0xB57C, 0xB57D,
+ 0xB57E, 0xB57F, 0xB580, 0xB581, 0xB582, 0xB583, 0xB584, 0xB585,
+ 0xB586, 0xB587, 0xB588, 0xB589, 0xB58A, 0xB58B, 0xB58C, 0xB58D,
+ 0xB58E, 0xB58F, 0xB590, 0xB591, 0xB592, 0xB593, 0xB594, 0xB595,
+ 0xB596, 0xB597, 0xB598, 0xB599, 0xB59A, 0xB59B, 0xB59C, 0xB59D,
+ 0xB59E, 0xB59F, 0xB5A2, 0xB5A3, 0xB5A5, 0xB5A6, 0xB5A7, 0xB5A9,
+ 0xB5AC, 0xB5AD, 0xB5AE, 0xB5AF, 0xB5B2, 0xB5B6, 0xB5B7, 0xB5B8,
+ 0xB5B9, 0xB5BA, 0xB5BE, 0xB5BF, 0xB5C1, 0xB5C2, 0xB5C3, 0xB5C5,
+ 0xB5C6, 0xB5C7, 0xB5C8, 0xB5C9, 0xB5CA, 0xB5CB, 0xB5CE, 0xB5D2,
+ 0xB5D3, 0xB5D4, 0xB5D5, 0xB5D6, 0xB5D7, 0xB5D9, 0xB5DA, 0xB5DB,
+ 0xB5DC, 0xB5DD, 0xB5DE, 0xB5DF, 0xB5E0, 0xB5E1, 0xB5E2, 0xB5E3,
+ 0xB5E4, 0xB5E5, 0xB5E6, 0xB5E7, 0xB5E8, 0xB5E9, 0xB5EA, 0xB5EB,
+ 0xB5ED, 0xB5EE, 0xB5EF, 0xB5F0, 0xB5F1, 0xB5F2, 0xB5F3, 0xB5F4,
+ 0xB5F5, 0xB5F6, 0xB5F7, 0xB5F8, 0xB5F9, 0xB5FA, 0xB5FB, 0xB5FC,
+ 0xB5FD, 0xB5FE, 0xB5FF, 0xB600, 0xB601, 0xB602, 0xB603, 0xB604,
+ 0xB605, 0xB606, 0xB607, 0xB608, 0xB609, 0xB60A, 0xB60B, 0xB60C,
+ 0xB60D, 0xB60E, 0xB60F, 0xB612, 0xB613, 0xB615, 0xB616, 0xB617,
+ 0xB619, 0xB61A, 0xB61B, 0xB61C, 0xB61D, 0xB61E, 0xB61F, 0xB620,
+ 0xB621, 0xB622, 0xB623, 0xB624, 0xB626, 0xB627, 0xB628, 0xB629,
+ 0xB62A, 0xB62B, 0xB62D, 0xB62E, 0xB62F, 0xB630, 0xB631, 0xB632,
+ 0xB633, 0xB635, 0xB636, 0xB637, 0xB638, 0xB639, 0xB63A, 0xB63B,
+ 0xB63C, 0xB63D, 0xB63E, 0xB63F, 0xB640, 0xB641, 0xB642, 0xB643,
+ 0xB644, 0xB645, 0xB646, 0xB647, 0xB649, 0xB64A, 0xB64B, 0xB64C,
+ 0xB64D, 0xB64E, 0xB64F, 0xB650, 0xB651, 0xB652, 0xB653, 0xB654,
+ 0xB655, 0xB656, 0xB657, 0xB658, 0xB659, 0xB65A, 0xB65B, 0xB65C,
+ 0xB65D, 0xB65E, 0xB65F, 0xB660, 0xB661, 0xB662, 0xB663, 0xB665,
+ 0xB666, 0xB667, 0xB669, 0xB66A, 0xB66B, 0xB66C, 0xB66D, 0xB66E,
+ 0xB66F, 0xB670, 0xB671, 0xB672, 0xB673, 0xB674, 0xB675, 0xB676,
+ 0xB677, 0xB678, 0xB679, 0xB67A, 0xB67B, 0xB67C, 0xB67D, 0xB67E,
+ 0xB67F, 0xB680, 0xB681, 0xB682, 0xB683, 0xB684, 0xB685, 0xB686,
+ 0xB687, 0xB688, 0xB689, 0xB68A, 0xB68B, 0xB68C, 0xB68D, 0xB68E,
+ 0xB68F, 0xB690, 0xB691, 0xB692, 0xB693, 0xB694, 0xB695, 0xB696,
+ 0xB697, 0xB698, 0xB699, 0xB69A, 0xB69B, 0xB69E, 0xB69F, 0xB6A1,
+ 0xB6A2, 0xB6A3, 0xB6A5, 0xB6A6, 0xB6A7, 0xB6A8, 0xB6A9, 0xB6AA,
+ 0xB6AD, 0xB6AE, 0xB6AF, 0xB6B0, 0xB6B2, 0xB6B3, 0xB6B4, 0xB6B5,
+ 0xB6B6, 0xB6B7, 0xB6B8, 0xB6B9, 0xB6BA, 0xB6BB, 0xB6BC, 0xB6BD,
+ 0xB6BE, 0xB6BF, 0xB6C0, 0xB6C1, 0xB6C2, 0xB6C3, 0xB6C4, 0xB6C5,
+ 0xB6C6, 0xB6C7, 0xB6C8, 0xB6C9, 0xB6CA, 0xB6CB, 0xB6CC, 0xB6CD,
+ 0xB6CE, 0xB6CF, 0xB6D0, 0xB6D1, 0xB6D2, 0xB6D3, 0xB6D5, 0xB6D6,
+ 0xB6D7, 0xB6D8, 0xB6D9, 0xB6DA, 0xB6DB, 0xB6DC, 0xB6DD, 0xB6DE,
+ 0xB6DF, 0xB6E0, 0xB6E1, 0xB6E2, 0xB6E3, 0xB6E4, 0xB6E5, 0xB6E6,
+ 0xB6E7, 0xB6E8, 0xB6E9, 0xB6EA, 0xB6EB, 0xB6EC, 0xB6ED, 0xB6EE,
+ 0xB6EF, 0xB6F1, 0xB6F2, 0xB6F3, 0xB6F5, 0xB6F6, 0xB6F7, 0xB6F9,
+ 0xB6FA, 0xB6FB, 0xB6FC, 0xB6FD, 0xB6FE, 0xB6FF, 0xB702, 0xB703,
+ 0xB704, 0xB706, 0xB707, 0xB708, 0xB709, 0xB70A, 0xB70B, 0xB70C,
+ 0xB70D, 0xB70E, 0xB70F, 0xB710, 0xB711, 0xB712, 0xB713, 0xB714,
+ 0xB715, 0xB716, 0xB717, 0xB718, 0xB719, 0xB71A, 0xB71B, 0xB71C,
+ 0xB71D, 0xB71E, 0xB71F, 0xB720, 0xB721, 0xB722, 0xB723, 0xB724,
+ 0xB725, 0xB726, 0xB727, 0xB72A, 0xB72B, 0xB72D, 0xB72E, 0xB731,
+ 0xB732, 0xB733, 0xB734, 0xB735, 0xB736, 0xB737, 0xB73A, 0xB73C,
+ 0xB73D, 0xB73E, 0xB73F, 0xB740, 0xB741, 0xB742, 0xB743, 0xB745,
+ 0xB746, 0xB747, 0xB749, 0xB74A, 0xB74B, 0xB74D, 0xB74E, 0xB74F,
+ 0xB750, 0xB751, 0xB752, 0xB753, 0xB756, 0xB757, 0xB758, 0xB759,
+ 0xB75A, 0xB75B, 0xB75C, 0xB75D, 0xB75E, 0xB75F, 0xB761, 0xB762,
+ 0xB763, 0xB765, 0xB766, 0xB767, 0xB769, 0xB76A, 0xB76B, 0xB76C,
+ 0xB76D, 0xB76E, 0xB76F, 0xB772, 0xB774, 0xB776, 0xB777, 0xB778,
+ 0xB779, 0xB77A, 0xB77B, 0xB77E, 0xB77F, 0xB781, 0xB782, 0xB783,
+ 0xB785, 0xB786, 0xB787, 0xB788, 0xB789, 0xB78A, 0xB78B, 0xB78E,
+ 0xB793, 0xB794, 0xB795, 0xB79A, 0xB79B, 0xB79D, 0xB79E, 0xB79F,
+ 0xB7A1, 0xB7A2, 0xB7A3, 0xB7A4, 0xB7A5, 0xB7A6, 0xB7A7, 0xB7AA,
+ 0xB7AE, 0xB7AF, 0xB7B0, 0xB7B1, 0xB7B2, 0xB7B3, 0xB7B6, 0xB7B7,
+ 0xB7B9, 0xB7BA, 0xB7BB, 0xB7BC, 0xB7BD, 0xB7BE, 0xB7BF, 0xB7C0,
+ 0xB7C1, 0xB7C2, 0xB7C3, 0xB7C4, 0xB7C5, 0xB7C6, 0xB7C8, 0xB7CA,
+ 0xB7CB, 0xB7CC, 0xB7CD, 0xB7CE, 0xB7CF, 0xB7D0, 0xB7D1, 0xB7D2,
+ 0xB7D3, 0xB7D4, 0xB7D5, 0xB7D6, 0xB7D7, 0xB7D8, 0xB7D9, 0xB7DA,
+ 0xB7DB, 0xB7DC, 0xB7DD, 0xB7DE, 0xB7DF, 0xB7E0, 0xB7E1, 0xB7E2,
+ 0xB7E3, 0xB7E4, 0xB7E5, 0xB7E6, 0xB7E7, 0xB7E8, 0xB7E9, 0xB7EA,
+ 0xB7EB, 0xB7EE, 0xB7EF, 0xB7F1, 0xB7F2, 0xB7F3, 0xB7F5, 0xB7F6,
+ 0xB7F7, 0xB7F8, 0xB7F9, 0xB7FA, 0xB7FB, 0xB7FE, 0xB802, 0xB803,
+ 0xB804, 0xB805, 0xB806, 0xB80A, 0xB80B, 0xB80D, 0xB80E, 0xB80F,
+ 0xB811, 0xB812, 0xB813, 0xB814, 0xB815, 0xB816, 0xB817, 0xB81A,
+ 0xB81C, 0xB81E, 0xB81F, 0xB820, 0xB821, 0xB822, 0xB823, 0xB826,
+ 0xB827, 0xB829, 0xB82A, 0xB82B, 0xB82D, 0xB82E, 0xB82F, 0xB830,
+ 0xB831, 0xB832, 0xB833, 0xB836, 0xB83A, 0xB83B, 0xB83C, 0xB83D,
+ 0xB83E, 0xB83F, 0xB841, 0xB842, 0xB843, 0xB845, 0xB846, 0xB847,
+ 0xB848, 0xB849, 0xB84A, 0xB84B, 0xB84C, 0xB84D, 0xB84E, 0xB84F,
+ 0xB850, 0xB852, 0xB854, 0xB855, 0xB856, 0xB857, 0xB858, 0xB859,
+ 0xB85A, 0xB85B, 0xB85E, 0xB85F, 0xB861, 0xB862, 0xB863, 0xB865,
+ 0xB866, 0xB867, 0xB868, 0xB869, 0xB86A, 0xB86B, 0xB86E, 0xB870,
+ 0xB872, 0xB873, 0xB874, 0xB875, 0xB876, 0xB877, 0xB879, 0xB87A,
+ 0xB87B, 0xB87D, 0xB87E, 0xB87F, 0xB880, 0xB881, 0xB882, 0xB883,
+ 0xB884, 0xB885, 0xB886, 0xB887, 0xB888, 0xB889, 0xB88A, 0xB88B,
+ 0xB88C, 0xB88E, 0xB88F, 0xB890, 0xB891, 0xB892, 0xB893, 0xB894,
+ 0xB895, 0xB896, 0xB897, 0xB898, 0xB899, 0xB89A, 0xB89B, 0xB89C,
+ 0xB89D, 0xB89E, 0xB89F, 0xB8A0, 0xB8A1, 0xB8A2, 0xB8A3, 0xB8A4,
+ 0xB8A5, 0xB8A6, 0xB8A7, 0xB8A9, 0xB8AA, 0xB8AB, 0xB8AC, 0xB8AD,
+ 0xB8AE, 0xB8AF, 0xB8B1, 0xB8B2, 0xB8B3, 0xB8B5, 0xB8B6, 0xB8B7,
+ 0xB8B9, 0xB8BA, 0xB8BB, 0xB8BC, 0xB8BD, 0xB8BE, 0xB8BF, 0xB8C2,
+ 0xB8C4, 0xB8C6, 0xB8C7, 0xB8C8, 0xB8C9, 0xB8CA, 0xB8CB, 0xB8CD,
+ 0xB8CE, 0xB8CF, 0xB8D1, 0xB8D2, 0xB8D3, 0xB8D5, 0xB8D6, 0xB8D7,
+ 0xB8D8, 0xB8D9, 0xB8DA, 0xB8DB, 0xB8DC, 0xB8DE, 0xB8E0, 0xB8E2,
+ 0xB8E3, 0xB8E4, 0xB8E5, 0xB8E6, 0xB8E7, 0xB8EA, 0xB8EB, 0xB8ED,
+ 0xB8EE, 0xB8EF, 0xB8F1, 0xB8F2, 0xB8F3, 0xB8F4, 0xB8F5, 0xB8F6,
+ 0xB8F7, 0xB8FA, 0xB8FC, 0xB8FE, 0xB8FF, 0xB900, 0xB901, 0xB902,
+ 0xB903, 0xB905, 0xB906, 0xB907, 0xB908, 0xB909, 0xB90A, 0xB90B,
+ 0xB90C, 0xB90D, 0xB90E, 0xB90F, 0xB910, 0xB911, 0xB912, 0xB913,
+ 0xB914, 0xB915, 0xB916, 0xB917, 0xB919, 0xB91A, 0xB91B, 0xB91C,
+ 0xB91D, 0xB91E, 0xB91F, 0xB921, 0xB922, 0xB923, 0xB924, 0xB925,
+ 0xB926, 0xB927, 0xB928, 0xB929, 0xB92A, 0xB92B, 0xB92C, 0xB92D,
+ 0xB92E, 0xB92F, 0xB930, 0xB931, 0xB932, 0xB933, 0xB934, 0xB935,
+ 0xB936, 0xB937, 0xB938, 0xB939, 0xB93A, 0xB93B, 0xB93E, 0xB93F,
+ 0xB941, 0xB942, 0xB943, 0xB945, 0xB946, 0xB947, 0xB948, 0xB949,
+ 0xB94A, 0xB94B, 0xB94D, 0xB94E, 0xB950, 0xB952, 0xB953, 0xB954,
+ 0xB955, 0xB956, 0xB957, 0xB95A, 0xB95B, 0xB95D, 0xB95E, 0xB95F,
+ 0xB961, 0xB962, 0xB963, 0xB964, 0xB965, 0xB966, 0xB967, 0xB96A,
+ 0xB96C, 0xB96E, 0xB96F, 0xB970, 0xB971, 0xB972, 0xB973, 0xB976,
+ 0xB977, 0xB979, 0xB97A, 0xB97B, 0xB97D, 0xB97E, 0xB97F, 0xB980,
+ 0xB981, 0xB982, 0xB983, 0xB986, 0xB988, 0xB98B, 0xB98C, 0xB98F,
+ 0xB990, 0xB991, 0xB992, 0xB993, 0xB994, 0xB995, 0xB996, 0xB997,
+ 0xB998, 0xB999, 0xB99A, 0xB99B, 0xB99C, 0xB99D, 0xB99E, 0xB99F,
+ 0xB9A0, 0xB9A1, 0xB9A2, 0xB9A3, 0xB9A4, 0xB9A5, 0xB9A6, 0xB9A7,
+ 0xB9A8, 0xB9A9, 0xB9AA, 0xB9AB, 0xB9AE, 0xB9AF, 0xB9B1, 0xB9B2,
+ 0xB9B3, 0xB9B5, 0xB9B6, 0xB9B7, 0xB9B8, 0xB9B9, 0xB9BA, 0xB9BB,
+ 0xB9BE, 0xB9C0, 0xB9C2, 0xB9C3, 0xB9C4, 0xB9C5, 0xB9C6, 0xB9C7,
+ 0xB9CA, 0xB9CB, 0xB9CD, 0xB9D3, 0xB9D4, 0xB9D5, 0xB9D6, 0xB9D7,
+ 0xB9DA, 0xB9DC, 0xB9DF, 0xB9E0, 0xB9E2, 0xB9E6, 0xB9E7, 0xB9E9,
+ 0xB9EA, 0xB9EB, 0xB9ED, 0xB9EE, 0xB9EF, 0xB9F0, 0xB9F1, 0xB9F2,
+ 0xB9F3, 0xB9F6, 0xB9FB, 0xB9FC, 0xB9FD, 0xB9FE, 0xB9FF, 0xBA02,
+ 0xBA03, 0xBA04, 0xBA05, 0xBA06, 0xBA07, 0xBA09, 0xBA0A, 0xBA0B,
+ 0xBA0C, 0xBA0D, 0xBA0E, 0xBA0F, 0xBA10, 0xBA11, 0xBA12, 0xBA13,
+ 0xBA14, 0xBA16, 0xBA17, 0xBA18, 0xBA19, 0xBA1A, 0xBA1B, 0xBA1C,
+ 0xBA1D, 0xBA1E, 0xBA1F, 0xBA20, 0xBA21, 0xBA22, 0xBA23, 0xBA24,
+ 0xBA25, 0xBA26, 0xBA27, 0xBA28, 0xBA29, 0xBA2A, 0xBA2B, 0xBA2C,
+ 0xBA2D, 0xBA2E, 0xBA2F, 0xBA30, 0xBA31, 0xBA32, 0xBA33, 0xBA34,
+ 0xBA35, 0xBA36, 0xBA37, 0xBA3A, 0xBA3B, 0xBA3D, 0xBA3E, 0xBA3F,
+ 0xBA41, 0xBA43, 0xBA44, 0xBA45, 0xBA46, 0xBA47, 0xBA4A, 0xBA4C,
+ 0xBA4F, 0xBA50, 0xBA51, 0xBA52, 0xBA56, 0xBA57, 0xBA59, 0xBA5A,
+ 0xBA5B, 0xBA5D, 0xBA5E, 0xBA5F, 0xBA60, 0xBA61, 0xBA62, 0xBA63,
+ 0xBA66, 0xBA6A, 0xBA6B, 0xBA6C, 0xBA6D, 0xBA6E, 0xBA6F, 0xBA72,
+ 0xBA73, 0xBA75, 0xBA76, 0xBA77, 0xBA79, 0xBA7A, 0xBA7B, 0xBA7C,
+ 0xBA7D, 0xBA7E, 0xBA7F, 0xBA80, 0xBA81, 0xBA82, 0xBA86, 0xBA88,
+ 0xBA89, 0xBA8A, 0xBA8B, 0xBA8D, 0xBA8E, 0xBA8F, 0xBA90, 0xBA91,
+ 0xBA92, 0xBA93, 0xBA94, 0xBA95, 0xBA96, 0xBA97, 0xBA98, 0xBA99,
+ 0xBA9A, 0xBA9B, 0xBA9C, 0xBA9D, 0xBA9E, 0xBA9F, 0xBAA0, 0xBAA1,
+ 0xBAA2, 0xBAA3, 0xBAA4, 0xBAA5, 0xBAA6, 0xBAA7, 0xBAAA, 0xBAAD,
+ 0xBAAE, 0xBAAF, 0xBAB1, 0xBAB3, 0xBAB4, 0xBAB5, 0xBAB6, 0xBAB7,
+ 0xBABA, 0xBABC, 0xBABE, 0xBABF, 0xBAC0, 0xBAC1, 0xBAC2, 0xBAC3,
+ 0xBAC5, 0xBAC6, 0xBAC7, 0xBAC9, 0xBACA, 0xBACB, 0xBACC, 0xBACD,
+ 0xBACE, 0xBACF, 0xBAD0, 0xBAD1, 0xBAD2, 0xBAD3, 0xBAD4, 0xBAD5,
+ 0xBAD6, 0xBAD7, 0xBADA, 0xBADB, 0xBADC, 0xBADD, 0xBADE, 0xBADF,
+ 0xBAE0, 0xBAE1, 0xBAE2, 0xBAE3, 0xBAE4, 0xBAE5, 0xBAE6, 0xBAE7,
+ 0xBAE8, 0xBAE9, 0xBAEA, 0xBAEB, 0xBAEC, 0xBAED, 0xBAEE, 0xBAEF,
+ 0xBAF0, 0xBAF1, 0xBAF2, 0xBAF3, 0xBAF4, 0xBAF5, 0xBAF6, 0xBAF7,
+ 0xBAF8, 0xBAF9, 0xBAFA, 0xBAFB, 0xBAFD, 0xBAFE, 0xBAFF, 0xBB01,
+ 0xBB02, 0xBB03, 0xBB05, 0xBB06, 0xBB07, 0xBB08, 0xBB09, 0xBB0A,
+ 0xBB0B, 0xBB0C, 0xBB0E, 0xBB10, 0xBB12, 0xBB13, 0xBB14, 0xBB15,
+ 0xBB16, 0xBB17, 0xBB19, 0xBB1A, 0xBB1B, 0xBB1D, 0xBB1E, 0xBB1F,
+ 0xBB21, 0xBB22, 0xBB23, 0xBB24, 0xBB25, 0xBB26, 0xBB27, 0xBB28,
+ 0xBB2A, 0xBB2C, 0xBB2D, 0xBB2E, 0xBB2F, 0xBB30, 0xBB31, 0xBB32,
+ 0xBB33, 0xBB37, 0xBB39, 0xBB3A, 0xBB3F, 0xBB40, 0xBB41, 0xBB42,
+ 0xBB43, 0xBB46, 0xBB48, 0xBB4A, 0xBB4B, 0xBB4C, 0xBB4E, 0xBB51,
+ 0xBB52, 0xBB53, 0xBB55, 0xBB56, 0xBB57, 0xBB59, 0xBB5A, 0xBB5B,
+ 0xBB5C, 0xBB5D, 0xBB5E, 0xBB5F, 0xBB60, 0xBB62, 0xBB64, 0xBB65,
+ 0xBB66, 0xBB67, 0xBB68, 0xBB69, 0xBB6A, 0xBB6B, 0xBB6D, 0xBB6E,
+ 0xBB6F, 0xBB70, 0xBB71, 0xBB72, 0xBB73, 0xBB74, 0xBB75, 0xBB76,
+ 0xBB77, 0xBB78, 0xBB79, 0xBB7A, 0xBB7B, 0xBB7C, 0xBB7D, 0xBB7E,
+ 0xBB7F, 0xBB80, 0xBB81, 0xBB82, 0xBB83, 0xBB84, 0xBB85, 0xBB86,
+ 0xBB87, 0xBB89, 0xBB8A, 0xBB8B, 0xBB8D, 0xBB8E, 0xBB8F, 0xBB91,
+ 0xBB92, 0xBB93, 0xBB94, 0xBB95, 0xBB96, 0xBB97, 0xBB98, 0xBB99,
+ 0xBB9A, 0xBB9B, 0xBB9C, 0xBB9D, 0xBB9E, 0xBB9F, 0xBBA0, 0xBBA1,
+ 0xBBA2, 0xBBA3, 0xBBA5, 0xBBA6, 0xBBA7, 0xBBA9, 0xBBAA, 0xBBAB,
+ 0xBBAD, 0xBBAE, 0xBBAF, 0xBBB0, 0xBBB1, 0xBBB2, 0xBBB3, 0xBBB5,
+ 0xBBB6, 0xBBB8, 0xBBB9, 0xBBBA, 0xBBBB, 0xBBBC, 0xBBBD, 0xBBBE,
+ 0xBBBF, 0xBBC1, 0xBBC2, 0xBBC3, 0xBBC5, 0xBBC6, 0xBBC7, 0xBBC9,
+ 0xBBCA, 0xBBCB, 0xBBCC, 0xBBCD, 0xBBCE, 0xBBCF, 0xBBD1, 0xBBD2,
+ 0xBBD4, 0xBBD5, 0xBBD6, 0xBBD7, 0xBBD8, 0xBBD9, 0xBBDA, 0xBBDB,
+ 0xBBDC, 0xBBDD, 0xBBDE, 0xBBDF, 0xBBE0, 0xBBE1, 0xBBE2, 0xBBE3,
+ 0xBBE4, 0xBBE5, 0xBBE6, 0xBBE7, 0xBBE8, 0xBBE9, 0xBBEA, 0xBBEB,
+ 0xBBEC, 0xBBED, 0xBBEE, 0xBBEF, 0xBBF0, 0xBBF1, 0xBBF2, 0xBBF3,
+ 0xBBF4, 0xBBF5, 0xBBF6, 0xBBF7, 0xBBFA, 0xBBFB, 0xBBFD, 0xBBFE,
+ 0xBC01, 0xBC03, 0xBC04, 0xBC05, 0xBC06, 0xBC07, 0xBC0A, 0xBC0E,
+ 0xBC10, 0xBC12, 0xBC13, 0xBC19, 0xBC1A, 0xBC20, 0xBC21, 0xBC22,
+ 0xBC23, 0xBC26, 0xBC28, 0xBC2A, 0xBC2B, 0xBC2C, 0xBC2E, 0xBC2F,
+ 0xBC32, 0xBC33, 0xBC35, 0xBC36, 0xBC37, 0xBC39, 0xBC3A, 0xBC3B,
+ 0xBC3C, 0xBC3D, 0xBC3E, 0xBC3F, 0xBC42, 0xBC46, 0xBC47, 0xBC48,
+ 0xBC4A, 0xBC4B, 0xBC4E, 0xBC4F, 0xBC51, 0xBC52, 0xBC53, 0xBC54,
+ 0xBC55, 0xBC56, 0xBC57, 0xBC58, 0xBC59, 0xBC5A, 0xBC5B, 0xBC5C,
+ 0xBC5E, 0xBC5F, 0xBC60, 0xBC61, 0xBC62, 0xBC63, 0xBC64, 0xBC65,
+ 0xBC66, 0xBC67, 0xBC68, 0xBC69, 0xBC6A, 0xBC6B, 0xBC6C, 0xBC6D,
+ 0xBC6E, 0xBC6F, 0xBC70, 0xBC71, 0xBC72, 0xBC73, 0xBC74, 0xBC75,
+ 0xBC76, 0xBC77, 0xBC78, 0xBC79, 0xBC7A, 0xBC7B, 0xBC7C, 0xBC7D,
+ 0xBC7E, 0xBC7F, 0xBC80, 0xBC81, 0xBC82, 0xBC83, 0xBC86, 0xBC87,
+ 0xBC89, 0xBC8A, 0xBC8D, 0xBC8F, 0xBC90, 0xBC91, 0xBC92, 0xBC93,
+ 0xBC96, 0xBC98, 0xBC9B, 0xBC9C, 0xBC9D, 0xBC9E, 0xBC9F, 0xBCA2,
+ 0xBCA3, 0xBCA5, 0xBCA6, 0xBCA9, 0xBCAA, 0xBCAB, 0xBCAC, 0xBCAD,
+ 0xBCAE, 0xBCAF, 0xBCB2, 0xBCB6, 0xBCB7, 0xBCB8, 0xBCB9, 0xBCBA,
+ 0xBCBB, 0xBCBE, 0xBCBF, 0xBCC1, 0xBCC2, 0xBCC3, 0xBCC5, 0xBCC6,
+ 0xBCC7, 0xBCC8, 0xBCC9, 0xBCCA, 0xBCCB, 0xBCCC, 0xBCCE, 0xBCD2,
+ 0xBCD3, 0xBCD4, 0xBCD6, 0xBCD7, 0xBCD9, 0xBCDA, 0xBCDB, 0xBCDD,
+ 0xBCDE, 0xBCDF, 0xBCE0, 0xBCE1, 0xBCE2, 0xBCE3, 0xBCE4, 0xBCE5,
+ 0xBCE6, 0xBCE7, 0xBCE8, 0xBCE9, 0xBCEA, 0xBCEB, 0xBCEC, 0xBCED,
+ 0xBCEE, 0xBCEF, 0xBCF0, 0xBCF1, 0xBCF2, 0xBCF3, 0xBCF7, 0xBCF9,
+ 0xBCFA, 0xBCFB, 0xBCFD, 0xBCFE, 0xBCFF, 0xBD00, 0xBD01, 0xBD02,
+ 0xBD03, 0xBD06, 0xBD08, 0xBD0A, 0xBD0B, 0xBD0C, 0xBD0D, 0xBD0E,
+ 0xBD0F, 0xBD11, 0xBD12, 0xBD13, 0xBD15, 0xBD16, 0xBD17, 0xBD18,
+ 0xBD19, 0xBD1A, 0xBD1B, 0xBD1C, 0xBD1D, 0xBD1E, 0xBD1F, 0xBD20,
+ 0xBD21, 0xBD22, 0xBD23, 0xBD25, 0xBD26, 0xBD27, 0xBD28, 0xBD29,
+ 0xBD2A, 0xBD2B, 0xBD2D, 0xBD2E, 0xBD2F, 0xBD30, 0xBD31, 0xBD32,
+ 0xBD33, 0xBD34, 0xBD35, 0xBD36, 0xBD37, 0xBD38, 0xBD39, 0xBD3A,
+ 0xBD3B, 0xBD3C, 0xBD3D, 0xBD3E, 0xBD3F, 0xBD41, 0xBD42, 0xBD43,
+ 0xBD44, 0xBD45, 0xBD46, 0xBD47, 0xBD4A, 0xBD4B, 0xBD4D, 0xBD4E,
+ 0xBD4F, 0xBD51, 0xBD52, 0xBD53, 0xBD54, 0xBD55, 0xBD56, 0xBD57,
+ 0xBD5A, 0xBD5B, 0xBD5C, 0xBD5D, 0xBD5E, 0xBD5F, 0xBD60, 0xBD61,
+ 0xBD62, 0xBD63, 0xBD65, 0xBD66, 0xBD67, 0xBD69, 0xBD6A, 0xBD6B,
+ 0xBD6C, 0xBD6D, 0xBD6E, 0xBD6F, 0xBD70, 0xBD71, 0xBD72, 0xBD73,
+ 0xBD74, 0xBD75, 0xBD76, 0xBD77, 0xBD78, 0xBD79, 0xBD7A, 0xBD7B,
+ 0xBD7C, 0xBD7D, 0xBD7E, 0xBD7F, 0xBD82, 0xBD83, 0xBD85, 0xBD86,
+ 0xBD8B, 0xBD8C, 0xBD8D, 0xBD8E, 0xBD8F, 0xBD92, 0xBD94, 0xBD96,
+ 0xBD97, 0xBD98, 0xBD9B, 0xBD9D, 0xBD9E, 0xBD9F, 0xBDA0, 0xBDA1,
+ 0xBDA2, 0xBDA3, 0xBDA5, 0xBDA6, 0xBDA7, 0xBDA8, 0xBDA9, 0xBDAA,
+ 0xBDAB, 0xBDAC, 0xBDAD, 0xBDAE, 0xBDAF, 0xBDB1, 0xBDB2, 0xBDB3,
+ 0xBDB4, 0xBDB5, 0xBDB6, 0xBDB7, 0xBDB9, 0xBDBA, 0xBDBB, 0xBDBC,
+ 0xBDBD, 0xBDBE, 0xBDBF, 0xBDC0, 0xBDC1, 0xBDC2, 0xBDC3, 0xBDC4,
+ 0xBDC5, 0xBDC6, 0xBDC7, 0xBDC8, 0xBDC9, 0xBDCA, 0xBDCB, 0xBDCC,
+ 0xBDCD, 0xBDCE, 0xBDCF, 0xBDD0, 0xBDD1, 0xBDD2, 0xBDD3, 0xBDD6,
+ 0xBDD7, 0xBDD9, 0xBDDA, 0xBDDB, 0xBDDD, 0xBDDE, 0xBDDF, 0xBDE0,
+ 0xBDE1, 0xBDE2, 0xBDE3, 0xBDE4, 0xBDE5, 0xBDE6, 0xBDE7, 0xBDE8,
+ 0xBDEA, 0xBDEB, 0xBDEC, 0xBDED, 0xBDEE, 0xBDEF, 0xBDF1, 0xBDF2,
+ 0xBDF3, 0xBDF5, 0xBDF6, 0xBDF7, 0xBDF9, 0xBDFA, 0xBDFB, 0xBDFC,
+ 0xBDFD, 0xBDFE, 0xBDFF, 0xBE01, 0xBE02, 0xBE04, 0xBE06, 0xBE07,
+ 0xBE08, 0xBE09, 0xBE0A, 0xBE0B, 0xBE0E, 0xBE0F, 0xBE11, 0xBE12,
+ 0xBE13, 0xBE15, 0xBE16, 0xBE17, 0xBE18, 0xBE19, 0xBE1A, 0xBE1B,
+ 0xBE1E, 0xBE20, 0xBE21, 0xBE22, 0xBE23, 0xBE24, 0xBE25, 0xBE26,
+ 0xBE27, 0xBE28, 0xBE29, 0xBE2A, 0xBE2B, 0xBE2C, 0xBE2D, 0xBE2E,
+ 0xBE2F, 0xBE30, 0xBE31, 0xBE32, 0xBE33, 0xBE34, 0xBE35, 0xBE36,
+ 0xBE37, 0xBE38, 0xBE39, 0xBE3A, 0xBE3B, 0xBE3C, 0xBE3D, 0xBE3E,
+ 0xBE3F, 0xBE40, 0xBE41, 0xBE42, 0xBE43, 0xBE46, 0xBE47, 0xBE49,
+ 0xBE4A, 0xBE4B, 0xBE4D, 0xBE4F, 0xBE50, 0xBE51, 0xBE52, 0xBE53,
+ 0xBE56, 0xBE58, 0xBE5C, 0xBE5D, 0xBE5E, 0xBE5F, 0xBE62, 0xBE63,
+ 0xBE65, 0xBE66, 0xBE67, 0xBE69, 0xBE6B, 0xBE6C, 0xBE6D, 0xBE6E,
+ 0xBE6F, 0xBE72, 0xBE76, 0xBE77, 0xBE78, 0xBE79, 0xBE7A, 0xBE7E,
+ 0xBE7F, 0xBE81, 0xBE82, 0xBE83, 0xBE85, 0xBE86, 0xBE87, 0xBE88,
+ 0xBE89, 0xBE8A, 0xBE8B, 0xBE8E, 0xBE92, 0xBE93, 0xBE94, 0xBE95,
+ 0xBE96, 0xBE97, 0xBE9A, 0xBE9B, 0xBE9C, 0xBE9D, 0xBE9E, 0xBE9F,
+ 0xBEA0, 0xBEA1, 0xBEA2, 0xBEA3, 0xBEA4, 0xBEA5, 0xBEA6, 0xBEA7,
+ 0xBEA9, 0xBEAA, 0xBEAB, 0xBEAC, 0xBEAD, 0xBEAE, 0xBEAF, 0xBEB0,
+ 0xBEB1, 0xBEB2, 0xBEB3, 0xBEB4, 0xBEB5, 0xBEB6, 0xBEB7, 0xBEB8,
+ 0xBEB9, 0xBEBA, 0xBEBB, 0xBEBC, 0xBEBD, 0xBEBE, 0xBEBF, 0xBEC0,
+ 0xBEC1, 0xBEC2, 0xBEC3, 0xBEC4, 0xBEC5, 0xBEC6, 0xBEC7, 0xBEC8,
+ 0xBEC9, 0xBECA, 0xBECB, 0xBECC, 0xBECD, 0xBECE, 0xBECF, 0xBED2,
+ 0xBED3, 0xBED5, 0xBED6, 0xBED9, 0xBEDA, 0xBEDB, 0xBEDC, 0xBEDD,
+ 0xBEDE, 0xBEDF, 0xBEE1, 0xBEE2, 0xBEE6, 0xBEE7, 0xBEE8, 0xBEE9,
+ 0xBEEA, 0xBEEB, 0xBEED, 0xBEEE, 0xBEEF, 0xBEF0, 0xBEF1, 0xBEF2,
+ 0xBEF3, 0xBEF4, 0xBEF5, 0xBEF6, 0xBEF7, 0xBEF8, 0xBEF9, 0xBEFA,
+ 0xBEFB, 0xBEFC, 0xBEFD, 0xBEFE, 0xBEFF, 0xBF00, 0xBF02, 0xBF03,
+ 0xBF04, 0xBF05, 0xBF06, 0xBF07, 0xBF0A, 0xBF0B, 0xBF0C, 0xBF0D,
+ 0xBF0E, 0xBF0F, 0xBF10, 0xBF11, 0xBF12, 0xBF13, 0xBF14, 0xBF15,
+ 0xBF16, 0xBF17, 0xBF1A, 0xBF1E, 0xBF1F, 0xBF20, 0xBF21, 0xBF22,
+ 0xBF23, 0xBF24, 0xBF25, 0xBF26, 0xBF27, 0xBF28, 0xBF29, 0xBF2A,
+ 0xBF2B, 0xBF2C, 0xBF2D, 0xBF2E, 0xBF2F, 0xBF30, 0xBF31, 0xBF32,
+ 0xBF33, 0xBF34, 0xBF35, 0xBF36, 0xBF37, 0xBF38, 0xBF39, 0xBF3A,
+ 0xBF3B, 0xBF3C, 0xBF3D, 0xBF3E, 0xBF3F, 0xBF42, 0xBF43, 0xBF45,
+ 0xBF46, 0xBF47, 0xBF49, 0xBF4A, 0xBF4B, 0xBF4C, 0xBF4D, 0xBF4E,
+ 0xBF4F, 0xBF52, 0xBF53, 0xBF54, 0xBF56, 0xBF57, 0xBF58, 0xBF59,
+ 0xBF5A, 0xBF5B, 0xBF5C, 0xBF5D, 0xBF5E, 0xBF5F, 0xBF60, 0xBF61,
+ 0xBF62, 0xBF63, 0xBF64, 0xBF65, 0xBF66, 0xBF67, 0xBF68, 0xBF69,
+ 0xBF6A, 0xBF6B, 0xBF6C, 0xBF6D, 0xBF6E, 0xBF6F, 0xBF70, 0xBF71,
+ 0xBF72, 0xBF73, 0xBF74, 0xBF75, 0xBF76, 0xBF77, 0xBF78, 0xBF79,
+ 0xBF7A, 0xBF7B, 0xBF7C, 0xBF7D, 0xBF7E, 0xBF7F, 0xBF80, 0xBF81,
+ 0xBF82, 0xBF83, 0xBF84, 0xBF85, 0xBF86, 0xBF87, 0xBF88, 0xBF89,
+ 0xBF8A, 0xBF8B, 0xBF8C, 0xBF8D, 0xBF8E, 0xBF8F, 0xBF90, 0xBF91,
+ 0xBF92, 0xBF93, 0xBF95, 0xBF96, 0xBF97, 0xBF98, 0xBF99, 0xBF9A,
+ 0xBF9B, 0xBF9C, 0xBF9D, 0xBF9E, 0xBF9F, 0xBFA0, 0xBFA1, 0xBFA2,
+ 0xBFA3, 0xBFA4, 0xBFA5, 0xBFA6, 0xBFA7, 0xBFA8, 0xBFA9, 0xBFAA,
+ 0xBFAB, 0xBFAC, 0xBFAD, 0xBFAE, 0xBFAF, 0xBFB1, 0xBFB2, 0xBFB3,
+ 0xBFB4, 0xBFB5, 0xBFB6, 0xBFB7, 0xBFB8, 0xBFB9, 0xBFBA, 0xBFBB,
+ 0xBFBC, 0xBFBD, 0xBFBE, 0xBFBF, 0xBFC0, 0xBFC1, 0xBFC2, 0xBFC3,
+ 0xBFC4, 0xBFC6, 0xBFC7, 0xBFC8, 0xBFC9, 0xBFCA, 0xBFCB, 0xBFCE,
+ 0xBFCF, 0xBFD1, 0xBFD2, 0xBFD3, 0xBFD5, 0xBFD6, 0xBFD7, 0xBFD8,
+ 0xBFD9, 0xBFDA, 0xBFDB, 0xBFDD, 0xBFDE, 0xBFE0, 0xBFE2, 0xBFE3,
+ 0xBFE4, 0xBFE5, 0xBFE6, 0xBFE7, 0xBFE8, 0xBFE9, 0xBFEA, 0xBFEB,
+ 0xBFEC, 0xBFED, 0xBFEE, 0xBFEF, 0xBFF0, 0xBFF1, 0xBFF2, 0xBFF3,
+ 0xBFF4, 0xBFF5, 0xBFF6, 0xBFF7, 0xBFF8, 0xBFF9, 0xBFFA, 0xBFFB,
+ 0xBFFC, 0xBFFD, 0xBFFE, 0xBFFF, 0xC000, 0xC001, 0xC002, 0xC003,
+ 0xC004, 0xC005, 0xC006, 0xC007, 0xC008, 0xC009, 0xC00A, 0xC00B,
+ 0xC00C, 0xC00D, 0xC00E, 0xC00F, 0xC010, 0xC011, 0xC012, 0xC013,
+ 0xC014, 0xC015, 0xC016, 0xC017, 0xC018, 0xC019, 0xC01A, 0xC01B,
+ 0xC01C, 0xC01D, 0xC01E, 0xC01F, 0xC020, 0xC021, 0xC022, 0xC023,
+ 0xC024, 0xC025, 0xC026, 0xC027, 0xC028, 0xC029, 0xC02A, 0xC02B,
+ 0xC02C, 0xC02D, 0xC02E, 0xC02F, 0xC030, 0xC031, 0xC032, 0xC033,
+ 0xC034, 0xC035, 0xC036, 0xC037, 0xC038, 0xC039, 0xC03A, 0xC03B,
+ 0xC03D, 0xC03E, 0xC03F, 0xC040, 0xC041, 0xC042, 0xC043, 0xC044,
+ 0xC045, 0xC046, 0xC047, 0xC048, 0xC049, 0xC04A, 0xC04B, 0xC04C,
+ 0xC04D, 0xC04E, 0xC04F, 0xC050, 0xC052, 0xC053, 0xC054, 0xC055,
+ 0xC056, 0xC057, 0xC059, 0xC05A, 0xC05B, 0xC05D, 0xC05E, 0xC05F,
+ 0xC061, 0xC062, 0xC063, 0xC064, 0xC065, 0xC066, 0xC067, 0xC06A,
+ 0xC06B, 0xC06C, 0xC06D, 0xC06E, 0xC06F, 0xC070, 0xC071, 0xC072,
+ 0xC073, 0xC074, 0xC075, 0xC076, 0xC077, 0xC078, 0xC079, 0xC07A,
+ 0xC07B, 0xC07C, 0xC07D, 0xC07E, 0xC07F, 0xC080, 0xC081, 0xC082,
+ 0xC083, 0xC084, 0xC085, 0xC086, 0xC087, 0xC088, 0xC089, 0xC08A,
+ 0xC08B, 0xC08C, 0xC08D, 0xC08E, 0xC08F, 0xC092, 0xC093, 0xC095,
+ 0xC096, 0xC097, 0xC099, 0xC09A, 0xC09B, 0xC09C, 0xC09D, 0xC09E,
+ 0xC09F, 0xC0A2, 0xC0A4, 0xC0A6, 0xC0A7, 0xC0A8, 0xC0A9, 0xC0AA,
+ 0xC0AB, 0xC0AE, 0xC0B1, 0xC0B2, 0xC0B7, 0xC0B8, 0xC0B9, 0xC0BA,
+ 0xC0BB, 0xC0BE, 0xC0C2, 0xC0C3, 0xC0C4, 0xC0C6, 0xC0C7, 0xC0CA,
+ 0xC0CB, 0xC0CD, 0xC0CE, 0xC0CF, 0xC0D1, 0xC0D2, 0xC0D3, 0xC0D4,
+ 0xC0D5, 0xC0D6, 0xC0D7, 0xC0DA, 0xC0DE, 0xC0DF, 0xC0E0, 0xC0E1,
+ 0xC0E2, 0xC0E3, 0xC0E6, 0xC0E7, 0xC0E9, 0xC0EA, 0xC0EB, 0xC0ED,
+ 0xC0EE, 0xC0EF, 0xC0F0, 0xC0F1, 0xC0F2, 0xC0F3, 0xC0F6, 0xC0F8,
+ 0xC0FA, 0xC0FB, 0xC0FC, 0xC0FD, 0xC0FE, 0xC0FF, 0xC101, 0xC102,
+ 0xC103, 0xC105, 0xC106, 0xC107, 0xC109, 0xC10A, 0xC10B, 0xC10C,
+ 0xC10D, 0xC10E, 0xC10F, 0xC111, 0xC112, 0xC113, 0xC114, 0xC116,
+ 0xC117, 0xC118, 0xC119, 0xC11A, 0xC11B, 0xC121, 0xC122, 0xC125,
+ 0xC128, 0xC129, 0xC12A, 0xC12B, 0xC12E, 0xC132, 0xC133, 0xC134,
+ 0xC135, 0xC137, 0xC13A, 0xC13B, 0xC13D, 0xC13E, 0xC13F, 0xC141,
+ 0xC142, 0xC143, 0xC144, 0xC145, 0xC146, 0xC147, 0xC14A, 0xC14E,
+ 0xC14F, 0xC150, 0xC151, 0xC152, 0xC153, 0xC156, 0xC157, 0xC159,
+ 0xC15A, 0xC15B, 0xC15D, 0xC15E, 0xC15F, 0xC160, 0xC161, 0xC162,
+ 0xC163, 0xC166, 0xC16A, 0xC16B, 0xC16C, 0xC16D, 0xC16E, 0xC16F,
+ 0xC171, 0xC172, 0xC173, 0xC175, 0xC176, 0xC177, 0xC179, 0xC17A,
+ 0xC17B, 0xC17C, 0xC17D, 0xC17E, 0xC17F, 0xC180, 0xC181, 0xC182,
+ 0xC183, 0xC184, 0xC186, 0xC187, 0xC188, 0xC189, 0xC18A, 0xC18B,
+ 0xC18F, 0xC191, 0xC192, 0xC193, 0xC195, 0xC197, 0xC198, 0xC199,
+ 0xC19A, 0xC19B, 0xC19E, 0xC1A0, 0xC1A2, 0xC1A3, 0xC1A4, 0xC1A6,
+ 0xC1A7, 0xC1AA, 0xC1AB, 0xC1AD, 0xC1AE, 0xC1AF, 0xC1B1, 0xC1B2,
+ 0xC1B3, 0xC1B4, 0xC1B5, 0xC1B6, 0xC1B7, 0xC1B8, 0xC1B9, 0xC1BA,
+ 0xC1BB, 0xC1BC, 0xC1BE, 0xC1BF, 0xC1C0, 0xC1C1, 0xC1C2, 0xC1C3,
+ 0xC1C5, 0xC1C6, 0xC1C7, 0xC1C9, 0xC1CA, 0xC1CB, 0xC1CD, 0xC1CE,
+ 0xC1CF, 0xC1D0, 0xC1D1, 0xC1D2, 0xC1D3, 0xC1D5, 0xC1D6, 0xC1D9,
+ 0xC1DA, 0xC1DB, 0xC1DC, 0xC1DD, 0xC1DE, 0xC1DF, 0xC1E1, 0xC1E2,
+ 0xC1E3, 0xC1E5, 0xC1E6, 0xC1E7, 0xC1E9, 0xC1EA, 0xC1EB, 0xC1EC,
+ 0xC1ED, 0xC1EE, 0xC1EF, 0xC1F2, 0xC1F4, 0xC1F5, 0xC1F6, 0xC1F7,
+ 0xC1F8, 0xC1F9, 0xC1FA, 0xC1FB, 0xC1FE, 0xC1FF, 0xC201, 0xC202,
+ 0xC203, 0xC205, 0xC206, 0xC207, 0xC208, 0xC209, 0xC20A, 0xC20B,
+ 0xC20E, 0xC210, 0xC212, 0xC213, 0xC214, 0xC215, 0xC216, 0xC217,
+ 0xC21A, 0xC21B, 0xC21D, 0xC21E, 0xC221, 0xC222, 0xC223, 0xC224,
+ 0xC225, 0xC226, 0xC227, 0xC22A, 0xC22C, 0xC22E, 0xC230, 0xC233,
+ 0xC235, 0xC236, 0xC237, 0xC238, 0xC239, 0xC23A, 0xC23B, 0xC23C,
+ 0xC23D, 0xC23E, 0xC23F, 0xC240, 0xC241, 0xC242, 0xC243, 0xC244,
+ 0xC245, 0xC246, 0xC247, 0xC249, 0xC24A, 0xC24B, 0xC24C, 0xC24D,
+ 0xC24E, 0xC24F, 0xC252, 0xC253, 0xC255, 0xC256, 0xC257, 0xC259,
+ 0xC25A, 0xC25B, 0xC25C, 0xC25D, 0xC25E, 0xC25F, 0xC261, 0xC262,
+ 0xC263, 0xC264, 0xC266, 0xC267, 0xC268, 0xC269, 0xC26A, 0xC26B,
+ 0xC26E, 0xC26F, 0xC271, 0xC272, 0xC273, 0xC275, 0xC276, 0xC277,
+ 0xC278, 0xC279, 0xC27A, 0xC27B, 0xC27E, 0xC280, 0xC282, 0xC283,
+ 0xC284, 0xC285, 0xC286, 0xC287, 0xC28A, 0xC28B, 0xC28C, 0xC28D,
+ 0xC28E, 0xC28F, 0xC291, 0xC292, 0xC293, 0xC294, 0xC295, 0xC296,
+ 0xC297, 0xC299, 0xC29A, 0xC29C, 0xC29E, 0xC29F, 0xC2A0, 0xC2A1,
+ 0xC2A2, 0xC2A3, 0xC2A6, 0xC2A7, 0xC2A9, 0xC2AA, 0xC2AB, 0xC2AE,
+ 0xC2AF, 0xC2B0, 0xC2B1, 0xC2B2, 0xC2B3, 0xC2B6, 0xC2B8, 0xC2BA,
+ 0xC2BB, 0xC2BC, 0xC2BD, 0xC2BE, 0xC2BF, 0xC2C0, 0xC2C1, 0xC2C2,
+ 0xC2C3, 0xC2C4, 0xC2C5, 0xC2C6, 0xC2C7, 0xC2C8, 0xC2C9, 0xC2CA,
+ 0xC2CB, 0xC2CC, 0xC2CD, 0xC2CE, 0xC2CF, 0xC2D0, 0xC2D1, 0xC2D2,
+ 0xC2D3, 0xC2D4, 0xC2D5, 0xC2D6, 0xC2D7, 0xC2D8, 0xC2D9, 0xC2DA,
+ 0xC2DB, 0xC2DE, 0xC2DF, 0xC2E1, 0xC2E2, 0xC2E5, 0xC2E6, 0xC2E7,
+ 0xC2E8, 0xC2E9, 0xC2EA, 0xC2EE, 0xC2F0, 0xC2F2, 0xC2F3, 0xC2F4,
+ 0xC2F5, 0xC2F7, 0xC2FA, 0xC2FD, 0xC2FE, 0xC2FF, 0xC301, 0xC302,
+ 0xC303, 0xC304, 0xC305, 0xC306, 0xC307, 0xC30A, 0xC30B, 0xC30E,
+ 0xC30F, 0xC310, 0xC311, 0xC312, 0xC316, 0xC317, 0xC319, 0xC31A,
+ 0xC31B, 0xC31D, 0xC31E, 0xC31F, 0xC320, 0xC321, 0xC322, 0xC323,
+ 0xC326, 0xC327, 0xC32A, 0xC32B, 0xC32C, 0xC32D, 0xC32E, 0xC32F,
+ 0xC330, 0xC331, 0xC332, 0xC333, 0xC334, 0xC335, 0xC336, 0xC337,
+ 0xC338, 0xC339, 0xC33A, 0xC33B, 0xC33C, 0xC33D, 0xC33E, 0xC33F,
+ 0xC340, 0xC341, 0xC342, 0xC343, 0xC344, 0xC346, 0xC347, 0xC348,
+ 0xC349, 0xC34A, 0xC34B, 0xC34C, 0xC34D, 0xC34E, 0xC34F, 0xC350,
+ 0xC351, 0xC352, 0xC353, 0xC354, 0xC355, 0xC356, 0xC357, 0xC358,
+ 0xC359, 0xC35A, 0xC35B, 0xC35C, 0xC35D, 0xC35E, 0xC35F, 0xC360,
+ 0xC361, 0xC362, 0xC363, 0xC364, 0xC365, 0xC366, 0xC367, 0xC36A,
+ 0xC36B, 0xC36D, 0xC36E, 0xC36F, 0xC371, 0xC373, 0xC374, 0xC375,
+ 0xC376, 0xC377, 0xC37A, 0xC37B, 0xC37E, 0xC37F, 0xC380, 0xC381,
+ 0xC382, 0xC383, 0xC385, 0xC386, 0xC387, 0xC389, 0xC38A, 0xC38B,
+ 0xC38D, 0xC38E, 0xC38F, 0xC390, 0xC391, 0xC392, 0xC393, 0xC394,
+ 0xC395, 0xC396, 0xC397, 0xC398, 0xC399, 0xC39A, 0xC39B, 0xC39C,
+ 0xC39D, 0xC39E, 0xC39F, 0xC3A0, 0xC3A1, 0xC3A2, 0xC3A3, 0xC3A4,
+ 0xC3A5, 0xC3A6, 0xC3A7, 0xC3A8, 0xC3A9, 0xC3AA, 0xC3AB, 0xC3AC,
+ 0xC3AD, 0xC3AE, 0xC3AF, 0xC3B0, 0xC3B1, 0xC3B2, 0xC3B3, 0xC3B4,
+ 0xC3B5, 0xC3B6, 0xC3B7, 0xC3B8, 0xC3B9, 0xC3BA, 0xC3BB, 0xC3BC,
+ 0xC3BD, 0xC3BE, 0xC3BF, 0xC3C1, 0xC3C2, 0xC3C3, 0xC3C4, 0xC3C5,
+ 0xC3C6, 0xC3C7, 0xC3C8, 0xC3C9, 0xC3CA, 0xC3CB, 0xC3CC, 0xC3CD,
+ 0xC3CE, 0xC3CF, 0xC3D0, 0xC3D1, 0xC3D2, 0xC3D3, 0xC3D4, 0xC3D5,
+ 0xC3D6, 0xC3D7, 0xC3DA, 0xC3DB, 0xC3DD, 0xC3DE, 0xC3E1, 0xC3E3,
+ 0xC3E4, 0xC3E5, 0xC3E6, 0xC3E7, 0xC3EA, 0xC3EB, 0xC3EC, 0xC3EE,
+ 0xC3EF, 0xC3F0, 0xC3F1, 0xC3F2, 0xC3F3, 0xC3F6, 0xC3F7, 0xC3F9,
+ 0xC3FA, 0xC3FB, 0xC3FC, 0xC3FD, 0xC3FE, 0xC3FF, 0xC400, 0xC401,
+ 0xC402, 0xC403, 0xC404, 0xC405, 0xC406, 0xC407, 0xC409, 0xC40A,
+ 0xC40B, 0xC40C, 0xC40D, 0xC40E, 0xC40F, 0xC411, 0xC412, 0xC413,
+ 0xC414, 0xC415, 0xC416, 0xC417, 0xC418, 0xC419, 0xC41A, 0xC41B,
+ 0xC41C, 0xC41D, 0xC41E, 0xC41F, 0xC420, 0xC421, 0xC422, 0xC423,
+ 0xC425, 0xC426, 0xC427, 0xC428, 0xC429, 0xC42A, 0xC42B, 0xC42D,
+ 0xC42E, 0xC42F, 0xC431, 0xC432, 0xC433, 0xC435, 0xC436, 0xC437,
+ 0xC438, 0xC439, 0xC43A, 0xC43B, 0xC43E, 0xC43F, 0xC440, 0xC441,
+ 0xC442, 0xC443, 0xC444, 0xC445, 0xC446, 0xC447, 0xC449, 0xC44A,
+ 0xC44B, 0xC44C, 0xC44D, 0xC44E, 0xC44F, 0xC450, 0xC451, 0xC452,
+ 0xC453, 0xC454, 0xC455, 0xC456, 0xC457, 0xC458, 0xC459, 0xC45A,
+ 0xC45B, 0xC45C, 0xC45D, 0xC45E, 0xC45F, 0xC460, 0xC461, 0xC462,
+ 0xC463, 0xC466, 0xC467, 0xC469, 0xC46A, 0xC46B, 0xC46D, 0xC46E,
+ 0xC46F, 0xC470, 0xC471, 0xC472, 0xC473, 0xC476, 0xC477, 0xC478,
+ 0xC47A, 0xC47B, 0xC47C, 0xC47D, 0xC47E, 0xC47F, 0xC481, 0xC482,
+ 0xC483, 0xC484, 0xC485, 0xC486, 0xC487, 0xC488, 0xC489, 0xC48A,
+ 0xC48B, 0xC48C, 0xC48D, 0xC48E, 0xC48F, 0xC490, 0xC491, 0xC492,
+ 0xC493, 0xC495, 0xC496, 0xC497, 0xC498, 0xC499, 0xC49A, 0xC49B,
+ 0xC49D, 0xC49E, 0xC49F, 0xC4A0, 0xC4A1, 0xC4A2, 0xC4A3, 0xC4A4,
+ 0xC4A5, 0xC4A6, 0xC4A7, 0xC4A8, 0xC4A9, 0xC4AA, 0xC4AB, 0xC4AC,
+ 0xC4AD, 0xC4AE, 0xC4AF, 0xC4B0, 0xC4B1, 0xC4B2, 0xC4B3, 0xC4B4,
+ 0xC4B5, 0xC4B6, 0xC4B7, 0xC4B9, 0xC4BA, 0xC4BB, 0xC4BD, 0xC4BE,
+ 0xC4BF, 0xC4C0, 0xC4C1, 0xC4C2, 0xC4C3, 0xC4C4, 0xC4C5, 0xC4C6,
+ 0xC4C7, 0xC4C8, 0xC4C9, 0xC4CA, 0xC4CB, 0xC4CC, 0xC4CD, 0xC4CE,
+ 0xC4CF, 0xC4D0, 0xC4D1, 0xC4D2, 0xC4D3, 0xC4D4, 0xC4D5, 0xC4D6,
+ 0xC4D7, 0xC4D8, 0xC4D9, 0xC4DA, 0xC4DB, 0xC4DC, 0xC4DD, 0xC4DE,
+ 0xC4DF, 0xC4E0, 0xC4E1, 0xC4E2, 0xC4E3, 0xC4E4, 0xC4E5, 0xC4E6,
+ 0xC4E7, 0xC4E8, 0xC4EA, 0xC4EB, 0xC4EC, 0xC4ED, 0xC4EE, 0xC4EF,
+ 0xC4F2, 0xC4F3, 0xC4F5, 0xC4F6, 0xC4F7, 0xC4F9, 0xC4FB, 0xC4FC,
+ 0xC4FD, 0xC4FE, 0xC502, 0xC503, 0xC504, 0xC505, 0xC506, 0xC507,
+ 0xC508, 0xC509, 0xC50A, 0xC50B, 0xC50D, 0xC50E, 0xC50F, 0xC511,
+ 0xC512, 0xC513, 0xC515, 0xC516, 0xC517, 0xC518, 0xC519, 0xC51A,
+ 0xC51B, 0xC51D, 0xC51E, 0xC51F, 0xC520, 0xC521, 0xC522, 0xC523,
+ 0xC524, 0xC525, 0xC526, 0xC527, 0xC52A, 0xC52B, 0xC52D, 0xC52E,
+ 0xC52F, 0xC531, 0xC532, 0xC533, 0xC534, 0xC535, 0xC536, 0xC537,
+ 0xC53A, 0xC53C, 0xC53E, 0xC53F, 0xC540, 0xC541, 0xC542, 0xC543,
+ 0xC546, 0xC547, 0xC54B, 0xC54F, 0xC550, 0xC551, 0xC552, 0xC556,
+ 0xC55A, 0xC55B, 0xC55C, 0xC55F, 0xC562, 0xC563, 0xC565, 0xC566,
+ 0xC567, 0xC569, 0xC56A, 0xC56B, 0xC56C, 0xC56D, 0xC56E, 0xC56F,
+ 0xC572, 0xC576, 0xC577, 0xC578, 0xC579, 0xC57A, 0xC57B, 0xC57E,
+ 0xC57F, 0xC581, 0xC582, 0xC583, 0xC585, 0xC586, 0xC588, 0xC589,
+ 0xC58A, 0xC58B, 0xC58E, 0xC590, 0xC592, 0xC593, 0xC594, 0xC596,
+ 0xC599, 0xC59A, 0xC59B, 0xC59D, 0xC59E, 0xC59F, 0xC5A1, 0xC5A2,
+ 0xC5A3, 0xC5A4, 0xC5A5, 0xC5A6, 0xC5A7, 0xC5A8, 0xC5AA, 0xC5AB,
+ 0xC5AC, 0xC5AD, 0xC5AE, 0xC5AF, 0xC5B0, 0xC5B1, 0xC5B2, 0xC5B3,
+ 0xC5B6, 0xC5B7, 0xC5BA, 0xC5BF, 0xC5C0, 0xC5C1, 0xC5C2, 0xC5C3,
+ 0xC5CB, 0xC5CD, 0xC5CF, 0xC5D2, 0xC5D3, 0xC5D5, 0xC5D6, 0xC5D7,
+ 0xC5D9, 0xC5DA, 0xC5DB, 0xC5DC, 0xC5DD, 0xC5DE, 0xC5DF, 0xC5E2,
+ 0xC5E4, 0xC5E6, 0xC5E7, 0xC5E8, 0xC5E9, 0xC5EA, 0xC5EB, 0xC5EF,
+ 0xC5F1, 0xC5F2, 0xC5F3, 0xC5F5, 0xC5F8, 0xC5F9, 0xC5FA, 0xC5FB,
+ 0xC602, 0xC603, 0xC604, 0xC609, 0xC60A, 0xC60B, 0xC60D, 0xC60E,
+ 0xC60F, 0xC611, 0xC612, 0xC613, 0xC614, 0xC615, 0xC616, 0xC617,
+ 0xC61A, 0xC61D, 0xC61E, 0xC61F, 0xC620, 0xC621, 0xC622, 0xC623,
+ 0xC626, 0xC627, 0xC629, 0xC62A, 0xC62B, 0xC62F, 0xC631, 0xC632,
+ 0xC636, 0xC638, 0xC63A, 0xC63C, 0xC63D, 0xC63E, 0xC63F, 0xC642,
+ 0xC643, 0xC645, 0xC646, 0xC647, 0xC649, 0xC64A, 0xC64B, 0xC64C,
+ 0xC64D, 0xC64E, 0xC64F, 0xC652, 0xC656, 0xC657, 0xC658, 0xC659,
+ 0xC65A, 0xC65B, 0xC65E, 0xC65F, 0xC661, 0xC662, 0xC663, 0xC664,
+ 0xC665, 0xC666, 0xC667, 0xC668, 0xC669, 0xC66A, 0xC66B, 0xC66D,
+ 0xC66E, 0xC670, 0xC672, 0xC673, 0xC674, 0xC675, 0xC676, 0xC677,
+ 0xC67A, 0xC67B, 0xC67D, 0xC67E, 0xC67F, 0xC681, 0xC682, 0xC683,
+ 0xC684, 0xC685, 0xC686, 0xC687, 0xC68A, 0xC68C, 0xC68E, 0xC68F,
+ 0xC690, 0xC691, 0xC692, 0xC693, 0xC696, 0xC697, 0xC699, 0xC69A,
+ 0xC69B, 0xC69D, 0xC69E, 0xC69F, 0xC6A0, 0xC6A1, 0xC6A2, 0xC6A3,
+ 0xC6A6, 0xC6A8, 0xC6AA, 0xC6AB, 0xC6AC, 0xC6AD, 0xC6AE, 0xC6AF,
+ 0xC6B2, 0xC6B3, 0xC6B5, 0xC6B6, 0xC6B7, 0xC6BB, 0xC6BC, 0xC6BD,
+ 0xC6BE, 0xC6BF, 0xC6C2, 0xC6C4, 0xC6C6, 0xC6C7, 0xC6C8, 0xC6C9,
+ 0xC6CA, 0xC6CB, 0xC6CE, 0xC6CF, 0xC6D1, 0xC6D2, 0xC6D3, 0xC6D5,
+ 0xC6D6, 0xC6D7, 0xC6D8, 0xC6D9, 0xC6DA, 0xC6DB, 0xC6DE, 0xC6DF,
+ 0xC6E2, 0xC6E3, 0xC6E4, 0xC6E5, 0xC6E6, 0xC6E7, 0xC6EA, 0xC6EB,
+ 0xC6ED, 0xC6EE, 0xC6EF, 0xC6F1, 0xC6F2, 0xC6F3, 0xC6F4, 0xC6F5,
+ 0xC6F6, 0xC6F7, 0xC6FA, 0xC6FB, 0xC6FC, 0xC6FE, 0xC6FF, 0xC700,
+ 0xC701, 0xC702, 0xC703, 0xC706, 0xC707, 0xC709, 0xC70A, 0xC70B,
+ 0xC70D, 0xC70E, 0xC70F, 0xC710, 0xC711, 0xC712, 0xC713, 0xC716,
+ 0xC718, 0xC71A, 0xC71B, 0xC71C, 0xC71D, 0xC71E, 0xC71F, 0xC722,
+ 0xC723, 0xC725, 0xC726, 0xC727, 0xC729, 0xC72A, 0xC72B, 0xC72C,
+ 0xC72D, 0xC72E, 0xC72F, 0xC732, 0xC734, 0xC736, 0xC738, 0xC739,
+ 0xC73A, 0xC73B, 0xC73E, 0xC73F, 0xC741, 0xC742, 0xC743, 0xC745,
+ 0xC746, 0xC747, 0xC748, 0xC749, 0xC74B, 0xC74E, 0xC750, 0xC759,
+ 0xC75A, 0xC75B, 0xC75D, 0xC75E, 0xC75F, 0xC761, 0xC762, 0xC763,
+ 0xC764, 0xC765, 0xC766, 0xC767, 0xC769, 0xC76A, 0xC76C, 0xC76D,
+ 0xC76E, 0xC76F, 0xC770, 0xC771, 0xC772, 0xC773, 0xC776, 0xC777,
+ 0xC779, 0xC77A, 0xC77B, 0xC77F, 0xC780, 0xC781, 0xC782, 0xC786,
+ 0xC78B, 0xC78C, 0xC78D, 0xC78F, 0xC792, 0xC793, 0xC795, 0xC799,
+ 0xC79B, 0xC79C, 0xC79D, 0xC79E, 0xC79F, 0xC7A2, 0xC7A7, 0xC7A8,
+ 0xC7A9, 0xC7AA, 0xC7AB, 0xC7AE, 0xC7AF, 0xC7B1, 0xC7B2, 0xC7B3,
+ 0xC7B5, 0xC7B6, 0xC7B7, 0xC7B8, 0xC7B9, 0xC7BA, 0xC7BB, 0xC7BE,
+ 0xC7C2, 0xC7C3, 0xC7C4, 0xC7C5, 0xC7C6, 0xC7C7, 0xC7CA, 0xC7CB,
+ 0xC7CD, 0xC7CF, 0xC7D1, 0xC7D2, 0xC7D3, 0xC7D4, 0xC7D5, 0xC7D6,
+ 0xC7D7, 0xC7D9, 0xC7DA, 0xC7DB, 0xC7DC, 0xC7DE, 0xC7DF, 0xC7E0,
+ 0xC7E1, 0xC7E2, 0xC7E3, 0xC7E5, 0xC7E6, 0xC7E7, 0xC7E9, 0xC7EA,
+ 0xC7EB, 0xC7ED, 0xC7EE, 0xC7EF, 0xC7F0, 0xC7F1, 0xC7F2, 0xC7F3,
+ 0xC7F4, 0xC7F5, 0xC7F6, 0xC7F7, 0xC7F8, 0xC7F9, 0xC7FA, 0xC7FB,
+ 0xC7FC, 0xC7FD, 0xC7FE, 0xC7FF, 0xC802, 0xC803, 0xC805, 0xC806,
+ 0xC807, 0xC809, 0xC80B, 0xC80C, 0xC80D, 0xC80E, 0xC80F, 0xC812,
+ 0xC814, 0xC817, 0xC818, 0xC819, 0xC81A, 0xC81B, 0xC81E, 0xC81F,
+ 0xC821, 0xC822, 0xC823, 0xC825, 0xC826, 0xC827, 0xC828, 0xC829,
+ 0xC82A, 0xC82B, 0xC82E, 0xC830, 0xC832, 0xC833, 0xC834, 0xC835,
+ 0xC836, 0xC837, 0xC839, 0xC83A, 0xC83B, 0xC83D, 0xC83E, 0xC83F,
+ 0xC841, 0xC842, 0xC843, 0xC844, 0xC845, 0xC846, 0xC847, 0xC84A,
+ 0xC84B, 0xC84E, 0xC84F, 0xC850, 0xC851, 0xC852, 0xC853, 0xC855,
+ 0xC856, 0xC857, 0xC858, 0xC859, 0xC85A, 0xC85B, 0xC85C, 0xC85D,
+ 0xC85E, 0xC85F, 0xC860, 0xC861, 0xC862, 0xC863, 0xC864, 0xC865,
+ 0xC866, 0xC867, 0xC868, 0xC869, 0xC86A, 0xC86B, 0xC86C, 0xC86D,
+ 0xC86E, 0xC86F, 0xC872, 0xC873, 0xC875, 0xC876, 0xC877, 0xC879,
+ 0xC87B, 0xC87C, 0xC87D, 0xC87E, 0xC87F, 0xC882, 0xC884, 0xC888,
+ 0xC889, 0xC88A, 0xC88E, 0xC88F, 0xC890, 0xC891, 0xC892, 0xC893,
+ 0xC895, 0xC896, 0xC897, 0xC898, 0xC899, 0xC89A, 0xC89B, 0xC89C,
+ 0xC89E, 0xC8A0, 0xC8A2, 0xC8A3, 0xC8A4, 0xC8A5, 0xC8A6, 0xC8A7,
+ 0xC8A9, 0xC8AA, 0xC8AB, 0xC8AC, 0xC8AD, 0xC8AE, 0xC8AF, 0xC8B0,
+ 0xC8B1, 0xC8B2, 0xC8B3, 0xC8B4, 0xC8B5, 0xC8B6, 0xC8B7, 0xC8B8,
+ 0xC8B9, 0xC8BA, 0xC8BB, 0xC8BE, 0xC8BF, 0xC8C0, 0xC8C1, 0xC8C2,
+ 0xC8C3, 0xC8C5, 0xC8C6, 0xC8C7, 0xC8C9, 0xC8CA, 0xC8CB, 0xC8CD,
+ 0xC8CE, 0xC8CF, 0xC8D0, 0xC8D1, 0xC8D2, 0xC8D3, 0xC8D6, 0xC8D8,
+ 0xC8DA, 0xC8DB, 0xC8DC, 0xC8DD, 0xC8DE, 0xC8DF, 0xC8E2, 0xC8E3,
+ 0xC8E5, 0xC8E6, 0xC8E7, 0xC8E8, 0xC8E9, 0xC8EA, 0xC8EB, 0xC8EC,
+ 0xC8ED, 0xC8EE, 0xC8EF, 0xC8F0, 0xC8F1, 0xC8F2, 0xC8F3, 0xC8F4,
+ 0xC8F6, 0xC8F7, 0xC8F8, 0xC8F9, 0xC8FA, 0xC8FB, 0xC8FE, 0xC8FF,
+ 0xC901, 0xC902, 0xC903, 0xC907, 0xC908, 0xC909, 0xC90A, 0xC90B,
+ 0xC90E, 0xC910, 0xC912, 0xC913, 0xC914, 0xC915, 0xC916, 0xC917,
+ 0xC919, 0xC91A, 0xC91B, 0xC91C, 0xC91D, 0xC91E, 0xC91F, 0xC920,
+ 0xC921, 0xC922, 0xC923, 0xC924, 0xC925, 0xC926, 0xC927, 0xC928,
+ 0xC929, 0xC92A, 0xC92B, 0xC92D, 0xC92E, 0xC92F, 0xC930, 0xC931,
+ 0xC932, 0xC933, 0xC935, 0xC936, 0xC937, 0xC938, 0xC939, 0xC93A,
+ 0xC93B, 0xC93C, 0xC93D, 0xC93E, 0xC93F, 0xC940, 0xC941, 0xC942,
+ 0xC943, 0xC944, 0xC945, 0xC946, 0xC947, 0xC948, 0xC949, 0xC94A,
+ 0xC94B, 0xC94C, 0xC94D, 0xC94E, 0xC94F, 0xC952, 0xC953, 0xC955,
+ 0xC956, 0xC957, 0xC959, 0xC95A, 0xC95B, 0xC95C, 0xC95D, 0xC95E,
+ 0xC95F, 0xC962, 0xC964, 0xC965, 0xC966, 0xC967, 0xC968, 0xC969,
+ 0xC96A, 0xC96B, 0xC96D, 0xC96E, 0xC96F, 0xC971, 0xC972, 0xC973,
+ 0xC975, 0xC976, 0xC977, 0xC978, 0xC979, 0xC97A, 0xC97B, 0xC97D,
+ 0xC97E, 0xC97F, 0xC980, 0xC981, 0xC982, 0xC983, 0xC984, 0xC985,
+ 0xC986, 0xC987, 0xC98A, 0xC98B, 0xC98D, 0xC98E, 0xC98F, 0xC991,
+ 0xC992, 0xC993, 0xC994, 0xC995, 0xC996, 0xC997, 0xC99A, 0xC99C,
+ 0xC99E, 0xC99F, 0xC9A0, 0xC9A1, 0xC9A2, 0xC9A3, 0xC9A4, 0xC9A5,
+ 0xC9A6, 0xC9A7, 0xC9A8, 0xC9A9, 0xC9AA, 0xC9AB, 0xC9AC, 0xC9AD,
+ 0xC9AE, 0xC9AF, 0xC9B0, 0xC9B1, 0xC9B2, 0xC9B3, 0xC9B4, 0xC9B5,
+ 0xC9B6, 0xC9B7, 0xC9B8, 0xC9B9, 0xC9BA, 0xC9BB, 0xC9BC, 0xC9BD,
+ 0xC9BE, 0xC9BF, 0xC9C2, 0xC9C3, 0xC9C5, 0xC9C6, 0xC9C9, 0xC9CB,
+ 0xC9CC, 0xC9CD, 0xC9CE, 0xC9CF, 0xC9D2, 0xC9D4, 0xC9D7, 0xC9D8,
+ 0xC9DB, 0xC9DE, 0xC9DF, 0xC9E1, 0xC9E3, 0xC9E5, 0xC9E6, 0xC9E8,
+ 0xC9E9, 0xC9EA, 0xC9EB, 0xC9EE, 0xC9F2, 0xC9F3, 0xC9F4, 0xC9F5,
+ 0xC9F6, 0xC9F7, 0xC9FA, 0xC9FB, 0xC9FD, 0xC9FE, 0xC9FF, 0xCA01,
+ 0xCA02, 0xCA03, 0xCA04, 0xCA05, 0xCA06, 0xCA07, 0xCA0A, 0xCA0E,
+ 0xCA0F, 0xCA10, 0xCA11, 0xCA12, 0xCA13, 0xCA15, 0xCA16, 0xCA17,
+ 0xCA19, 0xCA1A, 0xCA1B, 0xCA1C, 0xCA1D, 0xCA1E, 0xCA1F, 0xCA20,
+ 0xCA21, 0xCA22, 0xCA23, 0xCA24, 0xCA25, 0xCA26, 0xCA27, 0xCA28,
+ 0xCA2A, 0xCA2B, 0xCA2C, 0xCA2D, 0xCA2E, 0xCA2F, 0xCA30, 0xCA31,
+ 0xCA32, 0xCA33, 0xCA34, 0xCA35, 0xCA36, 0xCA37, 0xCA38, 0xCA39,
+ 0xCA3A, 0xCA3B, 0xCA3C, 0xCA3D, 0xCA3E, 0xCA3F, 0xCA40, 0xCA41,
+ 0xCA42, 0xCA43, 0xCA44, 0xCA45, 0xCA46, 0xCA47, 0xCA48, 0xCA49,
+ 0xCA4A, 0xCA4B, 0xCA4E, 0xCA4F, 0xCA51, 0xCA52, 0xCA53, 0xCA55,
+ 0xCA56, 0xCA57, 0xCA58, 0xCA59, 0xCA5A, 0xCA5B, 0xCA5E, 0xCA62,
+ 0xCA63, 0xCA64, 0xCA65, 0xCA66, 0xCA67, 0xCA69, 0xCA6A, 0xCA6B,
+ 0xCA6C, 0xCA6D, 0xCA6E, 0xCA6F, 0xCA70, 0xCA71, 0xCA72, 0xCA73,
+ 0xCA74, 0xCA75, 0xCA76, 0xCA77, 0xCA78, 0xCA79, 0xCA7A, 0xCA7B,
+ 0xCA7C, 0xCA7E, 0xCA7F, 0xCA80, 0xCA81, 0xCA82, 0xCA83, 0xCA85,
+ 0xCA86, 0xCA87, 0xCA88, 0xCA89, 0xCA8A, 0xCA8B, 0xCA8C, 0xCA8D,
+ 0xCA8E, 0xCA8F, 0xCA90, 0xCA91, 0xCA92, 0xCA93, 0xCA94, 0xCA95,
+ 0xCA96, 0xCA97, 0xCA99, 0xCA9A, 0xCA9B, 0xCA9C, 0xCA9D, 0xCA9E,
+ 0xCA9F, 0xCAA0, 0xCAA1, 0xCAA2, 0xCAA3, 0xCAA4, 0xCAA5, 0xCAA6,
+ 0xCAA7, 0xCAA8, 0xCAA9, 0xCAAA, 0xCAAB, 0xCAAC, 0xCAAD, 0xCAAE,
+ 0xCAAF, 0xCAB0, 0xCAB1, 0xCAB2, 0xCAB3, 0xCAB4, 0xCAB5, 0xCAB6,
+ 0xCAB7, 0xCAB8, 0xCAB9, 0xCABA, 0xCABB, 0xCABE, 0xCABF, 0xCAC1,
+ 0xCAC2, 0xCAC3, 0xCAC5, 0xCAC6, 0xCAC7, 0xCAC8, 0xCAC9, 0xCACA,
+ 0xCACB, 0xCACE, 0xCAD0, 0xCAD2, 0xCAD4, 0xCAD5, 0xCAD6, 0xCAD7,
+ 0xCADA, 0xCADB, 0xCADC, 0xCADD, 0xCADE, 0xCADF, 0xCAE1, 0xCAE2,
+ 0xCAE3, 0xCAE4, 0xCAE5, 0xCAE6, 0xCAE7, 0xCAE8, 0xCAE9, 0xCAEA,
+ 0xCAEB, 0xCAED, 0xCAEE, 0xCAEF, 0xCAF0, 0xCAF1, 0xCAF2, 0xCAF3,
+ 0xCAF5, 0xCAF6, 0xCAF7, 0xCAF8, 0xCAF9, 0xCAFA, 0xCAFB, 0xCAFC,
+ 0xCAFD, 0xCAFE, 0xCAFF, 0xCB00, 0xCB01, 0xCB02, 0xCB03, 0xCB04,
+ 0xCB05, 0xCB06, 0xCB07, 0xCB09, 0xCB0A, 0xCB0B, 0xCB0C, 0xCB0D,
+ 0xCB0E, 0xCB0F, 0xCB11, 0xCB12, 0xCB13, 0xCB15, 0xCB16, 0xCB17,
+ 0xCB19, 0xCB1A, 0xCB1B, 0xCB1C, 0xCB1D, 0xCB1E, 0xCB1F, 0xCB22,
+ 0xCB23, 0xCB24, 0xCB25, 0xCB26, 0xCB27, 0xCB28, 0xCB29, 0xCB2A,
+ 0xCB2B, 0xCB2C, 0xCB2D, 0xCB2E, 0xCB2F, 0xCB30, 0xCB31, 0xCB32,
+ 0xCB33, 0xCB34, 0xCB35, 0xCB36, 0xCB37, 0xCB38, 0xCB39, 0xCB3A,
+ 0xCB3B, 0xCB3C, 0xCB3D, 0xCB3E, 0xCB3F, 0xCB40, 0xCB42, 0xCB43,
+ 0xCB44, 0xCB45, 0xCB46, 0xCB47, 0xCB4A, 0xCB4B, 0xCB4D, 0xCB4E,
+ 0xCB4F, 0xCB51, 0xCB52, 0xCB53, 0xCB54, 0xCB55, 0xCB56, 0xCB57,
+ 0xCB5A, 0xCB5B, 0xCB5C, 0xCB5E, 0xCB5F, 0xCB60, 0xCB61, 0xCB62,
+ 0xCB63, 0xCB65, 0xCB66, 0xCB67, 0xCB68, 0xCB69, 0xCB6A, 0xCB6B,
+ 0xCB6C, 0xCB6D, 0xCB6E, 0xCB6F, 0xCB70, 0xCB71, 0xCB72, 0xCB73,
+ 0xCB74, 0xCB75, 0xCB76, 0xCB77, 0xCB7A, 0xCB7B, 0xCB7C, 0xCB7D,
+ 0xCB7E, 0xCB7F, 0xCB80, 0xCB81, 0xCB82, 0xCB83, 0xCB84, 0xCB85,
+ 0xCB86, 0xCB87, 0xCB88, 0xCB89, 0xCB8A, 0xCB8B, 0xCB8C, 0xCB8D,
+ 0xCB8E, 0xCB8F, 0xCB90, 0xCB91, 0xCB92, 0xCB93, 0xCB94, 0xCB95,
+ 0xCB96, 0xCB97, 0xCB98, 0xCB99, 0xCB9A, 0xCB9B, 0xCB9D, 0xCB9E,
+ 0xCB9F, 0xCBA0, 0xCBA1, 0xCBA2, 0xCBA3, 0xCBA4, 0xCBA5, 0xCBA6,
+ 0xCBA7, 0xCBA8, 0xCBA9, 0xCBAA, 0xCBAB, 0xCBAC, 0xCBAD, 0xCBAE,
+ 0xCBAF, 0xCBB0, 0xCBB1, 0xCBB2, 0xCBB3, 0xCBB4, 0xCBB5, 0xCBB6,
+ 0xCBB7, 0xCBB9, 0xCBBA, 0xCBBB, 0xCBBC, 0xCBBD, 0xCBBE, 0xCBBF,
+ 0xCBC0, 0xCBC1, 0xCBC2, 0xCBC3, 0xCBC4, 0xCBC5, 0xCBC6, 0xCBC7,
+ 0xCBC8, 0xCBC9, 0xCBCA, 0xCBCB, 0xCBCC, 0xCBCD, 0xCBCE, 0xCBCF,
+ 0xCBD0, 0xCBD1, 0xCBD2, 0xCBD3, 0xCBD5, 0xCBD6, 0xCBD7, 0xCBD8,
+ 0xCBD9, 0xCBDA, 0xCBDB, 0xCBDC, 0xCBDD, 0xCBDE, 0xCBDF, 0xCBE0,
+ 0xCBE1, 0xCBE2, 0xCBE3, 0xCBE5, 0xCBE6, 0xCBE8, 0xCBEA, 0xCBEB,
+ 0xCBEC, 0xCBED, 0xCBEE, 0xCBEF, 0xCBF0, 0xCBF1, 0xCBF2, 0xCBF3,
+ 0xCBF4, 0xCBF5, 0xCBF6, 0xCBF7, 0xCBF8, 0xCBF9, 0xCBFA, 0xCBFB,
+ 0xCBFC, 0xCBFD, 0xCBFE, 0xCBFF, 0xCC00, 0xCC01, 0xCC02, 0xCC03,
+ 0xCC04, 0xCC05, 0xCC06, 0xCC07, 0xCC08, 0xCC09, 0xCC0A, 0xCC0B,
+ 0xCC0E, 0xCC0F, 0xCC11, 0xCC12, 0xCC13, 0xCC15, 0xCC16, 0xCC17,
+ 0xCC18, 0xCC19, 0xCC1A, 0xCC1B, 0xCC1E, 0xCC1F, 0xCC20, 0xCC23,
+ 0xCC24, 0xCC25, 0xCC26, 0xCC2A, 0xCC2B, 0xCC2D, 0xCC2F, 0xCC31,
+ 0xCC32, 0xCC33, 0xCC34, 0xCC35, 0xCC36, 0xCC37, 0xCC3A, 0xCC3F,
+ 0xCC40, 0xCC41, 0xCC42, 0xCC43, 0xCC46, 0xCC47, 0xCC49, 0xCC4A,
+ 0xCC4B, 0xCC4D, 0xCC4E, 0xCC4F, 0xCC50, 0xCC51, 0xCC52, 0xCC53,
+ 0xCC56, 0xCC5A, 0xCC5B, 0xCC5C, 0xCC5D, 0xCC5E, 0xCC5F, 0xCC61,
+ 0xCC62, 0xCC63, 0xCC65, 0xCC67, 0xCC69, 0xCC6A, 0xCC6B, 0xCC6C,
+ 0xCC6D, 0xCC6E, 0xCC6F, 0xCC71, 0xCC72, 0xCC73, 0xCC74, 0xCC76,
+ 0xCC77, 0xCC78, 0xCC79, 0xCC7A, 0xCC7B, 0xCC7C, 0xCC7D, 0xCC7E,
+ 0xCC7F, 0xCC80, 0xCC81, 0xCC82, 0xCC83, 0xCC84, 0xCC85, 0xCC86,
+ 0xCC87, 0xCC88, 0xCC89, 0xCC8A, 0xCC8B, 0xCC8C, 0xCC8D, 0xCC8E,
+ 0xCC8F, 0xCC90, 0xCC91, 0xCC92, 0xCC93, 0xCC94, 0xCC95, 0xCC96,
+ 0xCC97, 0xCC9A, 0xCC9B, 0xCC9D, 0xCC9E, 0xCC9F, 0xCCA1, 0xCCA2,
+ 0xCCA3, 0xCCA4, 0xCCA5, 0xCCA6, 0xCCA7, 0xCCAA, 0xCCAE, 0xCCAF,
+ 0xCCB0, 0xCCB1, 0xCCB2, 0xCCB3, 0xCCB6, 0xCCB7, 0xCCB9, 0xCCBA,
+ 0xCCBB, 0xCCBD, 0xCCBE, 0xCCBF, 0xCCC0, 0xCCC1, 0xCCC2, 0xCCC3,
+ 0xCCC6, 0xCCC8, 0xCCCA, 0xCCCB, 0xCCCC, 0xCCCD, 0xCCCE, 0xCCCF,
+ 0xCCD1, 0xCCD2, 0xCCD3, 0xCCD5, 0xCCD6, 0xCCD7, 0xCCD8, 0xCCD9,
+ 0xCCDA, 0xCCDB, 0xCCDC, 0xCCDD, 0xCCDE, 0xCCDF, 0xCCE0, 0xCCE1,
+ 0xCCE2, 0xCCE3, 0xCCE5, 0xCCE6, 0xCCE7, 0xCCE8, 0xCCE9, 0xCCEA,
+ 0xCCEB, 0xCCED, 0xCCEE, 0xCCEF, 0xCCF1, 0xCCF2, 0xCCF3, 0xCCF4,
+ 0xCCF5, 0xCCF6, 0xCCF7, 0xCCF8, 0xCCF9, 0xCCFA, 0xCCFB, 0xCCFC,
+ 0xCCFD, 0xCCFE, 0xCCFF, 0xCD00, 0xCD02, 0xCD03, 0xCD04, 0xCD05,
+ 0xCD06, 0xCD07, 0xCD0A, 0xCD0B, 0xCD0D, 0xCD0E, 0xCD0F, 0xCD11,
+ 0xCD12, 0xCD13, 0xCD14, 0xCD15, 0xCD16, 0xCD17, 0xCD1A, 0xCD1C,
+ 0xCD1E, 0xCD1F, 0xCD20, 0xCD21, 0xCD22, 0xCD23, 0xCD25, 0xCD26,
+ 0xCD27, 0xCD29, 0xCD2A, 0xCD2B, 0xCD2D, 0xCD2E, 0xCD2F, 0xCD30,
+ 0xCD31, 0xCD32, 0xCD33, 0xCD34, 0xCD35, 0xCD36, 0xCD37, 0xCD38,
+ 0xCD3A, 0xCD3B, 0xCD3C, 0xCD3D, 0xCD3E, 0xCD3F, 0xCD40, 0xCD41,
+ 0xCD42, 0xCD43, 0xCD44, 0xCD45, 0xCD46, 0xCD47, 0xCD48, 0xCD49,
+ 0xCD4A, 0xCD4B, 0xCD4C, 0xCD4D, 0xCD4E, 0xCD4F, 0xCD50, 0xCD51,
+ 0xCD52, 0xCD53, 0xCD54, 0xCD55, 0xCD56, 0xCD57, 0xCD58, 0xCD59,
+ 0xCD5A, 0xCD5B, 0xCD5D, 0xCD5E, 0xCD5F, 0xCD61, 0xCD62, 0xCD63,
+ 0xCD65, 0xCD66, 0xCD67, 0xCD68, 0xCD69, 0xCD6A, 0xCD6B, 0xCD6E,
+ 0xCD70, 0xCD72, 0xCD73, 0xCD74, 0xCD75, 0xCD76, 0xCD77, 0xCD79,
+ 0xCD7A, 0xCD7B, 0xCD7C, 0xCD7D, 0xCD7E, 0xCD7F, 0xCD80, 0xCD81,
+ 0xCD82, 0xCD83, 0xCD84, 0xCD85, 0xCD86, 0xCD87, 0xCD89, 0xCD8A,
+ 0xCD8B, 0xCD8C, 0xCD8D, 0xCD8E, 0xCD8F, 0xCD90, 0xCD91, 0xCD92,
+ 0xCD93, 0xCD96, 0xCD97, 0xCD99, 0xCD9A, 0xCD9B, 0xCD9D, 0xCD9E,
+ 0xCD9F, 0xCDA0, 0xCDA1, 0xCDA2, 0xCDA3, 0xCDA6, 0xCDA8, 0xCDAA,
+ 0xCDAB, 0xCDAC, 0xCDAD, 0xCDAE, 0xCDAF, 0xCDB1, 0xCDB2, 0xCDB3,
+ 0xCDB4, 0xCDB5, 0xCDB6, 0xCDB7, 0xCDB8, 0xCDB9, 0xCDBA, 0xCDBB,
+ 0xCDBC, 0xCDBD, 0xCDBE, 0xCDBF, 0xCDC0, 0xCDC1, 0xCDC2, 0xCDC3,
+ 0xCDC5, 0xCDC6, 0xCDC7, 0xCDC8, 0xCDC9, 0xCDCA, 0xCDCB, 0xCDCD,
+ 0xCDCE, 0xCDCF, 0xCDD1, 0xCDD2, 0xCDD3, 0xCDD4, 0xCDD5, 0xCDD6,
+ 0xCDD7, 0xCDD8, 0xCDD9, 0xCDDA, 0xCDDB, 0xCDDC, 0xCDDD, 0xCDDE,
+ 0xCDDF, 0xCDE0, 0xCDE1, 0xCDE2, 0xCDE3, 0xCDE4, 0xCDE5, 0xCDE6,
+ 0xCDE7, 0xCDE9, 0xCDEA, 0xCDEB, 0xCDED, 0xCDEE, 0xCDEF, 0xCDF1,
+ 0xCDF2, 0xCDF3, 0xCDF4, 0xCDF5, 0xCDF6, 0xCDF7, 0xCDFA, 0xCDFC,
+ 0xCDFE, 0xCDFF, 0xCE00, 0xCE01, 0xCE02, 0xCE03, 0xCE05, 0xCE06,
+ 0xCE07, 0xCE09, 0xCE0A, 0xCE0B, 0xCE0D, 0xCE0E, 0xCE0F, 0xCE10,
+ 0xCE11, 0xCE12, 0xCE13, 0xCE15, 0xCE16, 0xCE17, 0xCE18, 0xCE1A,
+ 0xCE1B, 0xCE1C, 0xCE1D, 0xCE1E, 0xCE1F, 0xCE22, 0xCE23, 0xCE25,
+ 0xCE26, 0xCE27, 0xCE29, 0xCE2A, 0xCE2B, 0xCE2C, 0xCE2D, 0xCE2E,
+ 0xCE2F, 0xCE32, 0xCE34, 0xCE36, 0xCE37, 0xCE38, 0xCE39, 0xCE3A,
+ 0xCE3B, 0xCE3C, 0xCE3D, 0xCE3E, 0xCE3F, 0xCE40, 0xCE41, 0xCE42,
+ 0xCE43, 0xCE44, 0xCE45, 0xCE46, 0xCE47, 0xCE48, 0xCE49, 0xCE4A,
+ 0xCE4B, 0xCE4C, 0xCE4D, 0xCE4E, 0xCE4F, 0xCE50, 0xCE51, 0xCE52,
+ 0xCE53, 0xCE54, 0xCE55, 0xCE56, 0xCE57, 0xCE5A, 0xCE5B, 0xCE5D,
+ 0xCE5E, 0xCE62, 0xCE63, 0xCE64, 0xCE65, 0xCE66, 0xCE67, 0xCE6A,
+ 0xCE6C, 0xCE6E, 0xCE6F, 0xCE70, 0xCE71, 0xCE72, 0xCE73, 0xCE76,
+ 0xCE77, 0xCE79, 0xCE7A, 0xCE7B, 0xCE7D, 0xCE7E, 0xCE7F, 0xCE80,
+ 0xCE81, 0xCE82, 0xCE83, 0xCE86, 0xCE88, 0xCE8A, 0xCE8B, 0xCE8C,
+ 0xCE8D, 0xCE8E, 0xCE8F, 0xCE92, 0xCE93, 0xCE95, 0xCE96, 0xCE97,
+ 0xCE99, 0xCE9A, 0xCE9B, 0xCE9C, 0xCE9D, 0xCE9E, 0xCE9F, 0xCEA2,
+ 0xCEA6, 0xCEA7, 0xCEA8, 0xCEA9, 0xCEAA, 0xCEAB, 0xCEAE, 0xCEAF,
+ 0xCEB0, 0xCEB1, 0xCEB2, 0xCEB3, 0xCEB4, 0xCEB5, 0xCEB6, 0xCEB7,
+ 0xCEB8, 0xCEB9, 0xCEBA, 0xCEBB, 0xCEBC, 0xCEBD, 0xCEBE, 0xCEBF,
+ 0xCEC0, 0xCEC2, 0xCEC3, 0xCEC4, 0xCEC5, 0xCEC6, 0xCEC7, 0xCEC8,
+ 0xCEC9, 0xCECA, 0xCECB, 0xCECC, 0xCECD, 0xCECE, 0xCECF, 0xCED0,
+ 0xCED1, 0xCED2, 0xCED3, 0xCED4, 0xCED5, 0xCED6, 0xCED7, 0xCED8,
+ 0xCED9, 0xCEDA, 0xCEDB, 0xCEDC, 0xCEDD, 0xCEDE, 0xCEDF, 0xCEE0,
+ 0xCEE1, 0xCEE2, 0xCEE3, 0xCEE6, 0xCEE7, 0xCEE9, 0xCEEA, 0xCEED,
+ 0xCEEE, 0xCEEF, 0xCEF0, 0xCEF1, 0xCEF2, 0xCEF3, 0xCEF6, 0xCEFA,
+ 0xCEFB, 0xCEFC, 0xCEFD, 0xCEFE, 0xCEFF, 0xCF02, 0xCF03, 0xCF05,
+ 0xCF06, 0xCF07, 0xCF09, 0xCF0A, 0xCF0B, 0xCF0C, 0xCF0D, 0xCF0E,
+ 0xCF0F, 0xCF12, 0xCF14, 0xCF16, 0xCF17, 0xCF18, 0xCF19, 0xCF1A,
+ 0xCF1B, 0xCF1D, 0xCF1E, 0xCF1F, 0xCF21, 0xCF22, 0xCF23, 0xCF25,
+ 0xCF26, 0xCF27, 0xCF28, 0xCF29, 0xCF2A, 0xCF2B, 0xCF2E, 0xCF32,
+ 0xCF33, 0xCF34, 0xCF35, 0xCF36, 0xCF37, 0xCF39, 0xCF3A, 0xCF3B,
+ 0xCF3C, 0xCF3D, 0xCF3E, 0xCF3F, 0xCF40, 0xCF41, 0xCF42, 0xCF43,
+ 0xCF44, 0xCF45, 0xCF46, 0xCF47, 0xCF48, 0xCF49, 0xCF4A, 0xCF4B,
+ 0xCF4C, 0xCF4D, 0xCF4E, 0xCF4F, 0xCF50, 0xCF51, 0xCF52, 0xCF53,
+ 0xCF56, 0xCF57, 0xCF59, 0xCF5A, 0xCF5B, 0xCF5D, 0xCF5E, 0xCF5F,
+ 0xCF60, 0xCF61, 0xCF62, 0xCF63, 0xCF66, 0xCF68, 0xCF6A, 0xCF6B,
+ 0xCF6C, 0xCF6D, 0xCF6E, 0xCF6F, 0xCF72, 0xCF73, 0xCF75, 0xCF76,
+ 0xCF77, 0xCF79, 0xCF7A, 0xCF7B, 0xCF7C, 0xCF7D, 0xCF7E, 0xCF7F,
+ 0xCF81, 0xCF82, 0xCF83, 0xCF84, 0xCF86, 0xCF87, 0xCF88, 0xCF89,
+ 0xCF8A, 0xCF8B, 0xCF8D, 0xCF8E, 0xCF8F, 0xCF90, 0xCF91, 0xCF92,
+ 0xCF93, 0xCF94, 0xCF95, 0xCF96, 0xCF97, 0xCF98, 0xCF99, 0xCF9A,
+ 0xCF9B, 0xCF9C, 0xCF9D, 0xCF9E, 0xCF9F, 0xCFA0, 0xCFA2, 0xCFA3,
+ 0xCFA4, 0xCFA5, 0xCFA6, 0xCFA7, 0xCFA9, 0xCFAA, 0xCFAB, 0xCFAC,
+ 0xCFAD, 0xCFAE, 0xCFAF, 0xCFB1, 0xCFB2, 0xCFB3, 0xCFB4, 0xCFB5,
+ 0xCFB6, 0xCFB7, 0xCFB8, 0xCFB9, 0xCFBA, 0xCFBB, 0xCFBC, 0xCFBD,
+ 0xCFBE, 0xCFBF, 0xCFC0, 0xCFC1, 0xCFC2, 0xCFC3, 0xCFC5, 0xCFC6,
+ 0xCFC7, 0xCFC8, 0xCFC9, 0xCFCA, 0xCFCB, 0xCFCC, 0xCFCD, 0xCFCE,
+ 0xCFCF, 0xCFD0, 0xCFD1, 0xCFD2, 0xCFD3, 0xCFD4, 0xCFD5, 0xCFD6,
+ 0xCFD7, 0xCFD8, 0xCFD9, 0xCFDA, 0xCFDB, 0xCFDC, 0xCFDD, 0xCFDE,
+ 0xCFDF, 0xCFE2, 0xCFE3, 0xCFE5, 0xCFE6, 0xCFE7, 0xCFE9, 0xCFEA,
+ 0xCFEB, 0xCFEC, 0xCFED, 0xCFEE, 0xCFEF, 0xCFF2, 0xCFF4, 0xCFF6,
+ 0xCFF7, 0xCFF8, 0xCFF9, 0xCFFA, 0xCFFB, 0xCFFD, 0xCFFE, 0xCFFF,
+ 0xD001, 0xD002, 0xD003, 0xD005, 0xD006, 0xD007, 0xD008, 0xD009,
+ 0xD00A, 0xD00B, 0xD00C, 0xD00D, 0xD00E, 0xD00F, 0xD010, 0xD012,
+ 0xD013, 0xD014, 0xD015, 0xD016, 0xD017, 0xD019, 0xD01A, 0xD01B,
+ 0xD01C, 0xD01D, 0xD01E, 0xD01F, 0xD020, 0xD021, 0xD022, 0xD023,
+ 0xD024, 0xD025, 0xD026, 0xD027, 0xD028, 0xD029, 0xD02A, 0xD02B,
+ 0xD02C, 0xD02E, 0xD02F, 0xD030, 0xD031, 0xD032, 0xD033, 0xD036,
+ 0xD037, 0xD039, 0xD03A, 0xD03B, 0xD03D, 0xD03E, 0xD03F, 0xD040,
+ 0xD041, 0xD042, 0xD043, 0xD046, 0xD048, 0xD04A, 0xD04B, 0xD04C,
+ 0xD04D, 0xD04E, 0xD04F, 0xD051, 0xD052, 0xD053, 0xD055, 0xD056,
+ 0xD057, 0xD059, 0xD05A, 0xD05B, 0xD05C, 0xD05D, 0xD05E, 0xD05F,
+ 0xD061, 0xD062, 0xD063, 0xD064, 0xD065, 0xD066, 0xD067, 0xD068,
+ 0xD069, 0xD06A, 0xD06B, 0xD06E, 0xD06F, 0xD071, 0xD072, 0xD073,
+ 0xD075, 0xD076, 0xD077, 0xD078, 0xD079, 0xD07A, 0xD07B, 0xD07E,
+ 0xD07F, 0xD080, 0xD082, 0xD083, 0xD084, 0xD085, 0xD086, 0xD087,
+ 0xD088, 0xD089, 0xD08A, 0xD08B, 0xD08C, 0xD08D, 0xD08E, 0xD08F,
+ 0xD090, 0xD091, 0xD092, 0xD093, 0xD094, 0xD095, 0xD096, 0xD097,
+ 0xD098, 0xD099, 0xD09A, 0xD09B, 0xD09C, 0xD09D, 0xD09E, 0xD09F,
+ 0xD0A0, 0xD0A1, 0xD0A2, 0xD0A3, 0xD0A6, 0xD0A7, 0xD0A9, 0xD0AA,
+ 0xD0AB, 0xD0AD, 0xD0AE, 0xD0AF, 0xD0B0, 0xD0B1, 0xD0B2, 0xD0B3,
+ 0xD0B6, 0xD0B8, 0xD0BA, 0xD0BB, 0xD0BC, 0xD0BD, 0xD0BE, 0xD0BF,
+ 0xD0C2, 0xD0C3, 0xD0C5, 0xD0C6, 0xD0C7, 0xD0CA, 0xD0CB, 0xD0CC,
+ 0xD0CD, 0xD0CE, 0xD0CF, 0xD0D2, 0xD0D6, 0xD0D7, 0xD0D8, 0xD0D9,
+ 0xD0DA, 0xD0DB, 0xD0DE, 0xD0DF, 0xD0E1, 0xD0E2, 0xD0E3, 0xD0E5,
+ 0xD0E6, 0xD0E7, 0xD0E8, 0xD0E9, 0xD0EA, 0xD0EB, 0xD0EE, 0xD0F2,
+ 0xD0F3, 0xD0F4, 0xD0F5, 0xD0F6, 0xD0F7, 0xD0F9, 0xD0FA, 0xD0FB,
+ 0xD0FC, 0xD0FD, 0xD0FE, 0xD0FF, 0xD100, 0xD101, 0xD102, 0xD103,
+ 0xD104, 0xD105, 0xD106, 0xD107, 0xD108, 0xD109, 0xD10A, 0xD10B,
+ 0xD10C, 0xD10E, 0xD10F, 0xD110, 0xD111, 0xD112, 0xD113, 0xD114,
+ 0xD115, 0xD116, 0xD117, 0xD118, 0xD119, 0xD11A, 0xD11B, 0xD11C,
+ 0xD11D, 0xD11E, 0xD11F, 0xD120, 0xD121, 0xD122, 0xD123, 0xD124,
+ 0xD125, 0xD126, 0xD127, 0xD128, 0xD129, 0xD12A, 0xD12B, 0xD12C,
+ 0xD12D, 0xD12E, 0xD12F, 0xD132, 0xD133, 0xD135, 0xD136, 0xD137,
+ 0xD139, 0xD13B, 0xD13C, 0xD13D, 0xD13E, 0xD13F, 0xD142, 0xD146,
+ 0xD147, 0xD148, 0xD149, 0xD14A, 0xD14B, 0xD14E, 0xD14F, 0xD151,
+ 0xD152, 0xD153, 0xD155, 0xD156, 0xD157, 0xD158, 0xD159, 0xD15A,
+ 0xD15B, 0xD15E, 0xD160, 0xD162, 0xD163, 0xD164, 0xD165, 0xD166,
+ 0xD167, 0xD169, 0xD16A, 0xD16B, 0xD16D, 0xD16E, 0xD16F, 0xD170,
+ 0xD171, 0xD172, 0xD173, 0xD174, 0xD175, 0xD176, 0xD177, 0xD178,
+ 0xD179, 0xD17A, 0xD17B, 0xD17D, 0xD17E, 0xD17F, 0xD180, 0xD181,
+ 0xD182, 0xD183, 0xD185, 0xD186, 0xD187, 0xD189, 0xD18A, 0xD18B,
+ 0xD18C, 0xD18D, 0xD18E, 0xD18F, 0xD190, 0xD191, 0xD192, 0xD193,
+ 0xD194, 0xD195, 0xD196, 0xD197, 0xD198, 0xD199, 0xD19A, 0xD19B,
+ 0xD19C, 0xD19D, 0xD19E, 0xD19F, 0xD1A2, 0xD1A3, 0xD1A5, 0xD1A6,
+ 0xD1A7, 0xD1A9, 0xD1AA, 0xD1AB, 0xD1AC, 0xD1AD, 0xD1AE, 0xD1AF,
+ 0xD1B2, 0xD1B4, 0xD1B6, 0xD1B7, 0xD1B8, 0xD1B9, 0xD1BB, 0xD1BD,
+ 0xD1BE, 0xD1BF, 0xD1C1, 0xD1C2, 0xD1C3, 0xD1C4, 0xD1C5, 0xD1C6,
+ 0xD1C7, 0xD1C8, 0xD1C9, 0xD1CA, 0xD1CB, 0xD1CC, 0xD1CD, 0xD1CE,
+ 0xD1CF, 0xD1D0, 0xD1D1, 0xD1D2, 0xD1D3, 0xD1D4, 0xD1D5, 0xD1D6,
+ 0xD1D7, 0xD1D9, 0xD1DA, 0xD1DB, 0xD1DC, 0xD1DD, 0xD1DE, 0xD1DF,
+ 0xD1E0, 0xD1E1, 0xD1E2, 0xD1E3, 0xD1E4, 0xD1E5, 0xD1E6, 0xD1E7,
+ 0xD1E8, 0xD1E9, 0xD1EA, 0xD1EB, 0xD1EC, 0xD1ED, 0xD1EE, 0xD1EF,
+ 0xD1F0, 0xD1F1, 0xD1F2, 0xD1F3, 0xD1F5, 0xD1F6, 0xD1F7, 0xD1F9,
+ 0xD1FA, 0xD1FB, 0xD1FC, 0xD1FD, 0xD1FE, 0xD1FF, 0xD200, 0xD201,
+ 0xD202, 0xD203, 0xD204, 0xD205, 0xD206, 0xD208, 0xD20A, 0xD20B,
+ 0xD20C, 0xD20D, 0xD20E, 0xD20F, 0xD211, 0xD212, 0xD213, 0xD214,
+ 0xD215, 0xD216, 0xD217, 0xD218, 0xD219, 0xD21A, 0xD21B, 0xD21C,
+ 0xD21D, 0xD21E, 0xD21F, 0xD220, 0xD221, 0xD222, 0xD223, 0xD224,
+ 0xD225, 0xD226, 0xD227, 0xD228, 0xD229, 0xD22A, 0xD22B, 0xD22E,
+ 0xD22F, 0xD231, 0xD232, 0xD233, 0xD235, 0xD236, 0xD237, 0xD238,
+ 0xD239, 0xD23A, 0xD23B, 0xD23E, 0xD240, 0xD242, 0xD243, 0xD244,
+ 0xD245, 0xD246, 0xD247, 0xD249, 0xD24A, 0xD24B, 0xD24C, 0xD24D,
+ 0xD24E, 0xD24F, 0xD250, 0xD251, 0xD252, 0xD253, 0xD254, 0xD255,
+ 0xD256, 0xD257, 0xD258, 0xD259, 0xD25A, 0xD25B, 0xD25D, 0xD25E,
+ 0xD25F, 0xD260, 0xD261, 0xD262, 0xD263, 0xD265, 0xD266, 0xD267,
+ 0xD268, 0xD269, 0xD26A, 0xD26B, 0xD26C, 0xD26D, 0xD26E, 0xD26F,
+ 0xD270, 0xD271, 0xD272, 0xD273, 0xD274, 0xD275, 0xD276, 0xD277,
+ 0xD278, 0xD279, 0xD27A, 0xD27B, 0xD27C, 0xD27D, 0xD27E, 0xD27F,
+ 0xD282, 0xD283, 0xD285, 0xD286, 0xD287, 0xD289, 0xD28A, 0xD28B,
+ 0xD28C, 0xD28D, 0xD28E, 0xD28F, 0xD292, 0xD293, 0xD294, 0xD296,
+ 0xD297, 0xD298, 0xD299, 0xD29A, 0xD29B, 0xD29D, 0xD29E, 0xD29F,
+ 0xD2A1, 0xD2A2, 0xD2A3, 0xD2A5, 0xD2A6, 0xD2A7, 0xD2A8, 0xD2A9,
+ 0xD2AA, 0xD2AB, 0xD2AD, 0xD2AE, 0xD2AF, 0xD2B0, 0xD2B2, 0xD2B3,
+ 0xD2B4, 0xD2B5, 0xD2B6, 0xD2B7, 0xD2BA, 0xD2BB, 0xD2BD, 0xD2BE,
+ 0xD2C1, 0xD2C3, 0xD2C4, 0xD2C5, 0xD2C6, 0xD2C7, 0xD2CA, 0xD2CC,
+ 0xD2CD, 0xD2CE, 0xD2CF, 0xD2D0, 0xD2D1, 0xD2D2, 0xD2D3, 0xD2D5,
+ 0xD2D6, 0xD2D7, 0xD2D9, 0xD2DA, 0xD2DB, 0xD2DD, 0xD2DE, 0xD2DF,
+ 0xD2E0, 0xD2E1, 0xD2E2, 0xD2E3, 0xD2E6, 0xD2E7, 0xD2E8, 0xD2E9,
+ 0xD2EA, 0xD2EB, 0xD2EC, 0xD2ED, 0xD2EE, 0xD2EF, 0xD2F2, 0xD2F3,
+ 0xD2F5, 0xD2F6, 0xD2F7, 0xD2F9, 0xD2FA, 0xD2FB, 0xD2FC, 0xD2FD,
+ 0xD2FE, 0xD2FF, 0xD302, 0xD304, 0xD306, 0xD307, 0xD308, 0xD309,
+ 0xD30A, 0xD30B, 0xD30F, 0xD311, 0xD312, 0xD313, 0xD315, 0xD317,
+ 0xD318, 0xD319, 0xD31A, 0xD31B, 0xD31E, 0xD322, 0xD323, 0xD324,
+ 0xD326, 0xD327, 0xD32A, 0xD32B, 0xD32D, 0xD32E, 0xD32F, 0xD331,
+ 0xD332, 0xD333, 0xD334, 0xD335, 0xD336, 0xD337, 0xD33A, 0xD33E,
+ 0xD33F, 0xD340, 0xD341, 0xD342, 0xD343, 0xD346, 0xD347, 0xD348,
+ 0xD349, 0xD34A, 0xD34B, 0xD34C, 0xD34D, 0xD34E, 0xD34F, 0xD350,
+ 0xD351, 0xD352, 0xD353, 0xD354, 0xD355, 0xD356, 0xD357, 0xD358,
+ 0xD359, 0xD35A, 0xD35B, 0xD35C, 0xD35D, 0xD35E, 0xD35F, 0xD360,
+ 0xD361, 0xD362, 0xD363, 0xD364, 0xD365, 0xD366, 0xD367, 0xD368,
+ 0xD369, 0xD36A, 0xD36B, 0xD36C, 0xD36D, 0xD36E, 0xD36F, 0xD370,
+ 0xD371, 0xD372, 0xD373, 0xD374, 0xD375, 0xD376, 0xD377, 0xD378,
+ 0xD379, 0xD37A, 0xD37B, 0xD37E, 0xD37F, 0xD381, 0xD382, 0xD383,
+ 0xD385, 0xD386, 0xD387, 0xD388, 0xD389, 0xD38A, 0xD38B, 0xD38E,
+ 0xD392, 0xD393, 0xD394, 0xD395, 0xD396, 0xD397, 0xD39A, 0xD39B,
+ 0xD39D, 0xD39E, 0xD39F, 0xD3A1, 0xD3A2, 0xD3A3, 0xD3A4, 0xD3A5,
+ 0xD3A6, 0xD3A7, 0xD3AA, 0xD3AC, 0xD3AE, 0xD3AF, 0xD3B0, 0xD3B1,
+ 0xD3B2, 0xD3B3, 0xD3B5, 0xD3B6, 0xD3B7, 0xD3B9, 0xD3BA, 0xD3BB,
+ 0xD3BD, 0xD3BE, 0xD3BF, 0xD3C0, 0xD3C1, 0xD3C2, 0xD3C3, 0xD3C6,
+ 0xD3C7, 0xD3CA, 0xD3CB, 0xD3CC, 0xD3CD, 0xD3CE, 0xD3CF, 0xD3D1,
+ 0xD3D2, 0xD3D3, 0xD3D4, 0xD3D5, 0xD3D6, 0xD3D7, 0xD3D9, 0xD3DA,
+ 0xD3DB, 0xD3DC, 0xD3DD, 0xD3DE, 0xD3DF, 0xD3E0, 0xD3E2, 0xD3E4,
+ 0xD3E5, 0xD3E6, 0xD3E7, 0xD3E8, 0xD3E9, 0xD3EA, 0xD3EB, 0xD3EE,
+ 0xD3EF, 0xD3F1, 0xD3F2, 0xD3F3, 0xD3F5, 0xD3F6, 0xD3F7, 0xD3F8,
+ 0xD3F9, 0xD3FA, 0xD3FB, 0xD3FE, 0xD400, 0xD402, 0xD403, 0xD404,
+ 0xD405, 0xD406, 0xD407, 0xD409, 0xD40A, 0xD40B, 0xD40C, 0xD40D,
+ 0xD40E, 0xD40F, 0xD410, 0xD411, 0xD412, 0xD413, 0xD414, 0xD415,
+ 0xD416, 0xD417, 0xD418, 0xD419, 0xD41A, 0xD41B, 0xD41C, 0xD41E,
+ 0xD41F, 0xD420, 0xD421, 0xD422, 0xD423, 0xD424, 0xD425, 0xD426,
+ 0xD427, 0xD428, 0xD429, 0xD42A, 0xD42B, 0xD42C, 0xD42D, 0xD42E,
+ 0xD42F, 0xD430, 0xD431, 0xD432, 0xD433, 0xD434, 0xD435, 0xD436,
+ 0xD437, 0xD438, 0xD439, 0xD43A, 0xD43B, 0xD43C, 0xD43D, 0xD43E,
+ 0xD43F, 0xD441, 0xD442, 0xD443, 0xD445, 0xD446, 0xD447, 0xD448,
+ 0xD449, 0xD44A, 0xD44B, 0xD44C, 0xD44D, 0xD44E, 0xD44F, 0xD450,
+ 0xD451, 0xD452, 0xD453, 0xD454, 0xD455, 0xD456, 0xD457, 0xD458,
+ 0xD459, 0xD45A, 0xD45B, 0xD45D, 0xD45E, 0xD45F, 0xD461, 0xD462,
+ 0xD463, 0xD465, 0xD466, 0xD467, 0xD468, 0xD469, 0xD46A, 0xD46B,
+ 0xD46C, 0xD46E, 0xD470, 0xD471, 0xD472, 0xD473, 0xD474, 0xD475,
+ 0xD476, 0xD477, 0xD47A, 0xD47B, 0xD47D, 0xD47E, 0xD481, 0xD483,
+ 0xD484, 0xD485, 0xD486, 0xD487, 0xD48A, 0xD48C, 0xD48E, 0xD48F,
+ 0xD490, 0xD491, 0xD492, 0xD493, 0xD495, 0xD496, 0xD497, 0xD498,
+ 0xD499, 0xD49A, 0xD49B, 0xD49C, 0xD49D, 0xD49E, 0xD49F, 0xD4A0,
+ 0xD4A1, 0xD4A2, 0xD4A3, 0xD4A4, 0xD4A5, 0xD4A6, 0xD4A7, 0xD4A8,
+ 0xD4AA, 0xD4AB, 0xD4AC, 0xD4AD, 0xD4AE, 0xD4AF, 0xD4B0, 0xD4B1,
+ 0xD4B2, 0xD4B3, 0xD4B4, 0xD4B5, 0xD4B6, 0xD4B7, 0xD4B8, 0xD4B9,
+ 0xD4BA, 0xD4BB, 0xD4BC, 0xD4BD, 0xD4BE, 0xD4BF, 0xD4C0, 0xD4C1,
+ 0xD4C2, 0xD4C3, 0xD4C4, 0xD4C5, 0xD4C6, 0xD4C7, 0xD4C8, 0xD4C9,
+ 0xD4CA, 0xD4CB, 0xD4CD, 0xD4CE, 0xD4CF, 0xD4D1, 0xD4D2, 0xD4D3,
+ 0xD4D5, 0xD4D6, 0xD4D7, 0xD4D8, 0xD4D9, 0xD4DA, 0xD4DB, 0xD4DD,
+ 0xD4DE, 0xD4E0, 0xD4E1, 0xD4E2, 0xD4E3, 0xD4E4, 0xD4E5, 0xD4E6,
+ 0xD4E7, 0xD4E9, 0xD4EA, 0xD4EB, 0xD4ED, 0xD4EE, 0xD4EF, 0xD4F1,
+ 0xD4F2, 0xD4F3, 0xD4F4, 0xD4F5, 0xD4F6, 0xD4F7, 0xD4F9, 0xD4FA,
+ 0xD4FC, 0xD4FE, 0xD4FF, 0xD500, 0xD501, 0xD502, 0xD503, 0xD505,
+ 0xD506, 0xD507, 0xD509, 0xD50A, 0xD50B, 0xD50D, 0xD50E, 0xD50F,
+ 0xD510, 0xD511, 0xD512, 0xD513, 0xD516, 0xD518, 0xD519, 0xD51A,
+ 0xD51B, 0xD51C, 0xD51D, 0xD51E, 0xD51F, 0xD520, 0xD521, 0xD522,
+ 0xD523, 0xD524, 0xD525, 0xD526, 0xD527, 0xD528, 0xD529, 0xD52A,
+ 0xD52B, 0xD52C, 0xD52D, 0xD52E, 0xD52F, 0xD530, 0xD531, 0xD532,
+ 0xD533, 0xD534, 0xD535, 0xD536, 0xD537, 0xD538, 0xD539, 0xD53A,
+ 0xD53B, 0xD53E, 0xD53F, 0xD541, 0xD542, 0xD543, 0xD545, 0xD546,
+ 0xD547, 0xD548, 0xD549, 0xD54A, 0xD54B, 0xD54E, 0xD550, 0xD552,
+ 0xD553, 0xD554, 0xD555, 0xD556, 0xD557, 0xD55A, 0xD55B, 0xD55D,
+ 0xD55E, 0xD55F, 0xD561, 0xD562, 0xD563, 0xD564, 0xD566, 0xD567,
+ 0xD56A, 0xD56C, 0xD56E, 0xD56F, 0xD570, 0xD571, 0xD572, 0xD573,
+ 0xD576, 0xD577, 0xD579, 0xD57A, 0xD57B, 0xD57D, 0xD57E, 0xD57F,
+ 0xD580, 0xD581, 0xD582, 0xD583, 0xD586, 0xD58A, 0xD58B, 0xD58C,
+ 0xD58D, 0xD58E, 0xD58F, 0xD591, 0xD592, 0xD593, 0xD594, 0xD595,
+ 0xD596, 0xD597, 0xD598, 0xD599, 0xD59A, 0xD59B, 0xD59C, 0xD59D,
+ 0xD59E, 0xD59F, 0xD5A0, 0xD5A1, 0xD5A2, 0xD5A3, 0xD5A4, 0xD5A6,
+ 0xD5A7, 0xD5A8, 0xD5A9, 0xD5AA, 0xD5AB, 0xD5AC, 0xD5AD, 0xD5AE,
+ 0xD5AF, 0xD5B0, 0xD5B1, 0xD5B2, 0xD5B3, 0xD5B4, 0xD5B5, 0xD5B6,
+ 0xD5B7, 0xD5B8, 0xD5B9, 0xD5BA, 0xD5BB, 0xD5BC, 0xD5BD, 0xD5BE,
+ 0xD5BF, 0xD5C0, 0xD5C1, 0xD5C2, 0xD5C3, 0xD5C4, 0xD5C5, 0xD5C6,
+ 0xD5C7, 0xD5CA, 0xD5CB, 0xD5CD, 0xD5CE, 0xD5CF, 0xD5D1, 0xD5D3,
+ 0xD5D4, 0xD5D5, 0xD5D6, 0xD5D7, 0xD5DA, 0xD5DC, 0xD5DE, 0xD5DF,
+ 0xD5E0, 0xD5E1, 0xD5E2, 0xD5E3, 0xD5E6, 0xD5E7, 0xD5E9, 0xD5EA,
+ 0xD5EB, 0xD5ED, 0xD5EE, 0xD5EF, 0xD5F0, 0xD5F1, 0xD5F2, 0xD5F3,
+ 0xD5F6, 0xD5F8, 0xD5FA, 0xD5FB, 0xD5FC, 0xD5FD, 0xD5FE, 0xD5FF,
+ 0xD602, 0xD603, 0xD605, 0xD606, 0xD607, 0xD609, 0xD60A, 0xD60B,
+ 0xD60C, 0xD60D, 0xD60E, 0xD60F, 0xD612, 0xD616, 0xD617, 0xD618,
+ 0xD619, 0xD61A, 0xD61B, 0xD61D, 0xD61E, 0xD61F, 0xD621, 0xD622,
+ 0xD623, 0xD625, 0xD626, 0xD627, 0xD628, 0xD629, 0xD62A, 0xD62B,
+ 0xD62C, 0xD62E, 0xD62F, 0xD630, 0xD631, 0xD632, 0xD633, 0xD634,
+ 0xD635, 0xD636, 0xD637, 0xD63A, 0xD63B, 0xD63D, 0xD63E, 0xD63F,
+ 0xD641, 0xD642, 0xD643, 0xD644, 0xD646, 0xD647, 0xD64A, 0xD64C,
+ 0xD64E, 0xD64F, 0xD650, 0xD652, 0xD653, 0xD656, 0xD657, 0xD659,
+ 0xD65A, 0xD65B, 0xD65D, 0xD65E, 0xD65F, 0xD660, 0xD661, 0xD662,
+ 0xD663, 0xD664, 0xD665, 0xD666, 0xD668, 0xD66A, 0xD66B, 0xD66C,
+ 0xD66D, 0xD66E, 0xD66F, 0xD672, 0xD673, 0xD675, 0xD676, 0xD677,
+ 0xD678, 0xD679, 0xD67A, 0xD67B, 0xD67C, 0xD67D, 0xD67E, 0xD67F,
+ 0xD680, 0xD681, 0xD682, 0xD684, 0xD686, 0xD687, 0xD688, 0xD689,
+ 0xD68A, 0xD68B, 0xD68E, 0xD68F, 0xD691, 0xD692, 0xD693, 0xD695,
+ 0xD696, 0xD697, 0xD698, 0xD699, 0xD69A, 0xD69B, 0xD69C, 0xD69E,
+ 0xD6A0, 0xD6A2, 0xD6A3, 0xD6A4, 0xD6A5, 0xD6A6, 0xD6A7, 0xD6A9,
+ 0xD6AA, 0xD6AB, 0xD6AD, 0xD6AE, 0xD6AF, 0xD6B1, 0xD6B2, 0xD6B3,
+ 0xD6B4, 0xD6B5, 0xD6B6, 0xD6B7, 0xD6B8, 0xD6BA, 0xD6BC, 0xD6BD,
+ 0xD6BE, 0xD6BF, 0xD6C0, 0xD6C1, 0xD6C2, 0xD6C3, 0xD6C6, 0xD6C7,
+ 0xD6C9, 0xD6CA, 0xD6CB, 0xD6CD, 0xD6CE, 0xD6CF, 0xD6D0, 0xD6D2,
+ 0xD6D3, 0xD6D5, 0xD6D6, 0xD6D8, 0xD6DA, 0xD6DB, 0xD6DC, 0xD6DD,
+ 0xD6DE, 0xD6DF, 0xD6E1, 0xD6E2, 0xD6E3, 0xD6E5, 0xD6E6, 0xD6E7,
+ 0xD6E9, 0xD6EA, 0xD6EB, 0xD6EC, 0xD6ED, 0xD6EE, 0xD6EF, 0xD6F1,
+ 0xD6F2, 0xD6F3, 0xD6F4, 0xD6F6, 0xD6F7, 0xD6F8, 0xD6F9, 0xD6FA,
+ 0xD6FB, 0xD6FE, 0xD6FF, 0xD701, 0xD702, 0xD703, 0xD705, 0xD706,
+ 0xD707, 0xD708, 0xD709, 0xD70A, 0xD70B, 0xD70C, 0xD70D, 0xD70E,
+ 0xD70F, 0xD710, 0xD712, 0xD713, 0xD714, 0xD715, 0xD716, 0xD717,
+ 0xD71A, 0xD71B, 0xD71D, 0xD71E, 0xD71F, 0xD721, 0xD722, 0xD723,
+ 0xD724, 0xD725, 0xD726, 0xD727, 0xD72A, 0xD72C, 0xD72E, 0xD72F,
+ 0xD730, 0xD731, 0xD732, 0xD733, 0xD736, 0xD737, 0xD739, 0xD73A,
+ 0xD73B, 0xD73D, 0xD73E, 0xD73F, 0xD740, 0xD741, 0xD742, 0xD743,
+ 0xD745, 0xD746, 0xD748, 0xD74A, 0xD74B, 0xD74C, 0xD74D, 0xD74E,
+ 0xD74F, 0xD752, 0xD753, 0xD755, 0xD75A, 0xD75B, 0xD75C, 0xD75D,
+ 0xD75E, 0xD75F, 0xD762, 0xD764, 0xD766, 0xD767, 0xD768, 0xD76A,
+ 0xD76B, 0xD76D, 0xD76E, 0xD76F, 0xD771, 0xD772, 0xD773, 0xD775,
+ 0xD776, 0xD777, 0xD778, 0xD779, 0xD77A, 0xD77B, 0xD77E, 0xD77F,
+ 0xD780, 0xD782, 0xD783, 0xD784, 0xD785, 0xD786, 0xD787, 0xD78A,
+ 0xD78B, 0xD78D, 0xD78E, 0xD78F, 0xD791, 0xD792, 0xD793, 0xD794,
+ 0xD795, 0xD796, 0xD797, 0xD79A, 0xD79C, 0xD79E, 0xD79F, 0xD7A0,
+ 0xD7A1, 0xD7A2, 0xD7A3, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024,
+ 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C,
+ 0x002D, 0x002E, 0x002F, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034,
+ 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C,
+ 0x003D, 0x003E, 0x003F, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044,
+ 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C,
+ 0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054,
+ 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C,
+ 0x005D, 0x005E, 0x005F, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064,
+ 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C,
+ 0x006D, 0x006E, 0x006F, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074,
+ 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C,
+ 0x007D, 0x007E, 0x20A9, 0x2010, 0x00A9, 0x2122, 0x22EF, 0x0020,
+ 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028,
+ 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, 0x0030,
+ 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038,
+ 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, 0x0040,
+ 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048,
+ 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050,
+ 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058,
+ 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, 0x0060,
+ 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068,
+ 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, 0x0070,
+ 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078,
+ 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x203E, 0x007E, 0x005C,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/Korea1/KSC-EUC-H_0.cpp b/core/src/fpdfapi/fpdf_cmaps/Korea1/KSC-EUC-H_0.cpp
index cd261239ee..80ec35fb35 100644
--- a/core/src/fpdfapi/fpdf_cmaps/Korea1/KSC-EUC-H_0.cpp
+++ b/core/src/fpdfapi/fpdf_cmaps/Korea1/KSC-EUC-H_0.cpp
@@ -1,164 +1,164 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-extern const unsigned short g_FXCMAP_KSC_EUC_H_0[467 * 3] = {
- 0x0020, 0x007E, 0x1F9E, 0xA1A1, 0xA1FE, 0x0065, 0xA2A1, 0xA2E5, 0x00C3,
- 0xA3A1, 0xA3FE, 0x0108, 0xA4A1, 0xA4D3, 0x0166, 0xA4D5, 0xA4FE, 0x0199,
- 0xA5A1, 0xA5AA, 0x01C3, 0xA5B0, 0xA5B9, 0x01CD, 0xA5C1, 0xA5D8, 0x01D7,
- 0xA5E1, 0xA5F8, 0x01EF, 0xA6A1, 0xA6E4, 0x0207, 0xA7A1, 0xA7EF, 0x024B,
- 0xA8A1, 0xA8A4, 0x029A, 0xA8A6, 0xA8A6, 0x029E, 0xA8A8, 0xA8AF, 0x029F,
- 0xA8B1, 0xA8FE, 0x02A7, 0xA9A1, 0xA9FE, 0x02F5, 0xAAA1, 0xAAF3, 0x0353,
- 0xABA1, 0xABF6, 0x03A6, 0xACA1, 0xACC1, 0x03FC, 0xACD1, 0xACF1, 0x041D,
- 0xB0A1, 0xB0FE, 0x043E, 0xB1A1, 0xB1FE, 0x049C, 0xB2A1, 0xB2FE, 0x04FA,
- 0xB3A1, 0xB3FE, 0x0558, 0xB4A1, 0xB4FE, 0x05B6, 0xB5A1, 0xB5FE, 0x0614,
- 0xB6A1, 0xB6FE, 0x0672, 0xB7A1, 0xB7FE, 0x06D0, 0xB8A1, 0xB8FE, 0x072E,
- 0xB9A1, 0xB9FE, 0x078C, 0xBAA1, 0xBAFE, 0x07EA, 0xBBA1, 0xBBFE, 0x0848,
- 0xBCA1, 0xBCFE, 0x08A6, 0xBDA1, 0xBDFE, 0x0904, 0xBEA1, 0xBEFE, 0x0962,
- 0xBFA1, 0xBFFE, 0x09C0, 0xC0A1, 0xC0FE, 0x0A1E, 0xC1A1, 0xC1FE, 0x0A7C,
- 0xC2A1, 0xC2FE, 0x0ADA, 0xC3A1, 0xC3FE, 0x0B38, 0xC4A1, 0xC4FE, 0x0B96,
- 0xC5A1, 0xC5FE, 0x0BF4, 0xC6A1, 0xC6FE, 0x0C52, 0xC7A1, 0xC7FE, 0x0CB0,
- 0xC8A1, 0xC8FE, 0x0D0E, 0xCAA1, 0xCAFE, 0x0D6C, 0xCBA1, 0xCBCF, 0x0DCA,
- 0xCBD0, 0xCBD0, 0x1014, 0xCBD1, 0xCBD5, 0x0DF9, 0xCBD6, 0xCBD6, 0x0E5E,
- 0xCBD7, 0xCBE6, 0x0DFE, 0xCBE7, 0xCBE7, 0x1B8D, 0xCBE8, 0xCBFE, 0x0E0E,
- 0xCCA1, 0xCCFE, 0x0E25, 0xCDA1, 0xCDCE, 0x0E83, 0xCDCF, 0xCDCF, 0x0D84,
- 0xCDD0, 0xCDE7, 0x0EB1, 0xCDE8, 0xCDE8, 0x1EDC, 0xCDE9, 0xCDFE, 0x0EC9,
- 0xCEA1, 0xCEAC, 0x0EDF, 0xCEAD, 0xCEAD, 0x0EDA, 0xCEAE, 0xCEFE, 0x0EEB,
- 0xCFA1, 0xCFFA, 0x0F3C, 0xCFFB, 0xCFFB, 0x0F3E, 0xCFFC, 0xCFFE, 0x0F96,
- 0xD0A1, 0xD0A1, 0x0F99, 0xD0A2, 0xD0A2, 0x0F6A, 0xD0A3, 0xD0B7, 0x0F9A,
- 0xD0B8, 0xD0B8, 0x0F6A, 0xD0B9, 0xD0CF, 0x0FAF, 0xD0D0, 0xD0D0, 0x0E7C,
- 0xD0D1, 0xD0DC, 0x0FC6, 0xD0DD, 0xD0DD, 0x1023, 0xD0DE, 0xD0FE, 0x0FD2,
- 0xD1A1, 0xD1D3, 0x0FF3, 0xD1D4, 0xD1D4, 0x1116, 0xD1D5, 0xD1D5, 0x103C,
- 0xD1D6, 0xD1D7, 0x1026, 0xD1D8, 0xD1D8, 0x1117, 0xD1D9, 0xD1DA, 0x1028,
- 0xD1DB, 0xD1E0, 0x1118, 0xD1E1, 0xD1E1, 0x102A, 0xD1E2, 0xD1E2, 0x16A8,
- 0xD1E3, 0xD1E5, 0x111E, 0xD1E6, 0xD1E6, 0x1122, 0xD1E7, 0xD1E7, 0x102B,
- 0xD1E8, 0xD1EB, 0x1123, 0xD1EC, 0xD1EC, 0x102C, 0xD1ED, 0xD1ED, 0x1127,
- 0xD1EE, 0xD1EE, 0x102D, 0xD1EF, 0xD1F0, 0x112A, 0xD1F1, 0xD1F1, 0x102E,
- 0xD1F2, 0xD1F2, 0x112C, 0xD1F3, 0xD1F5, 0x102F, 0xD1F6, 0xD1F6, 0x112F,
- 0xD1F7, 0xD1F9, 0x1032, 0xD1FA, 0xD1FA, 0x1133, 0xD1FB, 0xD1FB, 0x1035,
- 0xD1FC, 0xD1FD, 0x1136, 0xD1FE, 0xD1FE, 0x1139, 0xD2A1, 0xD2A1, 0x1036,
- 0xD2A2, 0xD2A3, 0x113A, 0xD2A4, 0xD2A6, 0x1037, 0xD2A7, 0xD2AA, 0x113C,
- 0xD2AB, 0xD2AB, 0x1143, 0xD2AC, 0xD2AC, 0x103A, 0xD2AD, 0xD2AD, 0x1144,
- 0xD2AE, 0xD2B1, 0x103B, 0xD2B2, 0xD2B2, 0x1148, 0xD2B3, 0xD2BD, 0x103F,
- 0xD2BE, 0xD2BE, 0x119F, 0xD2BF, 0xD2C1, 0x104A, 0xD2C2, 0xD2C3, 0x11A1,
- 0xD2C4, 0xD2C4, 0x11A5, 0xD2C5, 0xD2C5, 0x104D, 0xD2C6, 0xD2CA, 0x11A6,
- 0xD2CB, 0xD2CB, 0x11AC, 0xD2CC, 0xD2CC, 0x104E, 0xD2CD, 0xD2CE, 0x11AD,
- 0xD2CF, 0xD2D4, 0x11B0, 0xD2D5, 0xD2D7, 0x11B7, 0xD2D8, 0xD2D8, 0x104F,
- 0xD2D9, 0xD2DA, 0x11BD, 0xD2DB, 0xD2DD, 0x1050, 0xD2DE, 0xD2DF, 0x11C1,
- 0xD2E0, 0xD2E0, 0x1053, 0xD2E1, 0xD2E1, 0x11C3, 0xD2E2, 0xD2E2, 0x11C6,
- 0xD2E3, 0xD2E3, 0x1054, 0xD2E4, 0xD2E4, 0x11D4, 0xD2E5, 0xD2E8, 0x11D6,
- 0xD2E9, 0xD2EA, 0x11DB, 0xD2EB, 0xD2EB, 0x11E0, 0xD2EC, 0xD2EF, 0x1055,
- 0xD2F0, 0xD2F3, 0x11FC, 0xD2F4, 0xD2F5, 0x1201, 0xD2F6, 0xD2F6, 0x1059,
- 0xD2F7, 0xD2F8, 0x1203, 0xD2F9, 0xD2FE, 0x105A, 0xD3A1, 0xD3FE, 0x1060,
- 0xD4A1, 0xD4E5, 0x10BE, 0xD4E6, 0xD4E6, 0x10DE, 0xD4E7, 0xD4FB, 0x1103,
- 0xD4FC, 0xD4FC, 0x1028, 0xD4FD, 0xD4FE, 0x1118, 0xD5A1, 0xD5A4, 0x111A,
- 0xD5A5, 0xD5A5, 0x16A8, 0xD5A6, 0xD5AA, 0x111E, 0xD5AB, 0xD5AB, 0x102B,
- 0xD5AC, 0xD5AD, 0x1123, 0xD5AE, 0xD5AE, 0x1060, 0xD5AF, 0xD5FE, 0x1125,
- 0xD6A1, 0xD6B7, 0x1175, 0xD6B8, 0xD6B8, 0x1047, 0xD6B9, 0xD6CC, 0x118C,
- 0xD6CD, 0xD6CD, 0x104C, 0xD6CE, 0xD6FE, 0x11A0, 0xD7A1, 0xD7CA, 0x11D1,
- 0xD7CB, 0xD7CB, 0x15B0, 0xD7CC, 0xD7E3, 0x11FB, 0xD7E4, 0xD7E4, 0x1918,
- 0xD7E5, 0xD7FE, 0x1213, 0xD8A1, 0xD8FE, 0x122D, 0xD9A1, 0xD9FE, 0x128B,
- 0xDAA1, 0xDAFE, 0x12E9, 0xDBA1, 0xDBC4, 0x1347, 0xDBC5, 0xDBC5, 0x141F,
- 0xDBC6, 0xDBE3, 0x136B, 0xDBE4, 0xDBE4, 0x133A, 0xDBE5, 0xDBFE, 0x1389,
- 0xDCA1, 0xDCA4, 0x13A3, 0xDCA5, 0xDCA5, 0x1D5E, 0xDCA6, 0xDCFE, 0x13A7,
- 0xDDA1, 0xDDA4, 0x1400, 0xDDA5, 0xDDA5, 0x13D7, 0xDDA6, 0xDDD4, 0x1404,
- 0xDDD5, 0xDDD5, 0x13F5, 0xDDD6, 0xDDF3, 0x1433, 0xDDF4, 0xDDF4, 0x1DB7,
- 0xDDF5, 0xDDFE, 0x1451, 0xDEA1, 0xDEFB, 0x145B, 0xDEFC, 0xDEFC, 0x15D0,
- 0xDEFD, 0xDEFD, 0x14B6, 0xDEFE, 0xDEFE, 0x14F7, 0xDFA1, 0xDFB2, 0x14B7,
- 0xDFB3, 0xDFB3, 0x1BAB, 0xDFB4, 0xDFE0, 0x14C9, 0xDFE1, 0xDFE1, 0x14F2,
- 0xDFE2, 0xDFE7, 0x14F6, 0xDFE8, 0xDFE8, 0x156D, 0xDFE9, 0xDFFE, 0x14FC,
- 0xE0A1, 0xE0F0, 0x1512, 0xE0F1, 0xE0F1, 0x1771, 0xE0F2, 0xE0FE, 0x1562,
- 0xE1A1, 0xE1AC, 0x156F, 0xE1AD, 0xE1AD, 0x1554, 0xE1AE, 0xE1EC, 0x157B,
- 0xE1ED, 0xE1ED, 0x14C5, 0xE1EE, 0xE1FE, 0x15BA, 0xE2A1, 0xE2FE, 0x15CB,
- 0xE3A1, 0xE3F4, 0x1629, 0xE3F5, 0xE3F5, 0x1B61, 0xE3F6, 0xE3FE, 0x167D,
- 0xE4A1, 0xE4A1, 0x1CCA, 0xE4A2, 0xE4A8, 0x1686, 0xE4A9, 0xE4A9, 0x162E,
- 0xE4AA, 0xE4FE, 0x168D, 0xE5A1, 0xE5AD, 0x16E2, 0xE5AE, 0xE5AE, 0x16F2,
- 0xE5AF, 0xE5B0, 0x16EF, 0xE5B1, 0xE5B2, 0x1149, 0xE5B3, 0xE5B8, 0x16F1,
- 0xE5B9, 0xE5B9, 0x114B, 0xE5BA, 0xE5BA, 0x16F7, 0xE5BB, 0xE5BC, 0x114D,
- 0xE5BD, 0xE5C3, 0x16F8, 0xE5C4, 0xE5C4, 0x114F, 0xE5C5, 0xE5CD, 0x16FF,
- 0xE5CE, 0xE5CE, 0x1153, 0xE5CF, 0xE5CF, 0x1708, 0xE5D0, 0xE5D0, 0x1154,
- 0xE5D1, 0xE5D1, 0x1709, 0xE5D2, 0xE5D2, 0x1155, 0xE5D3, 0xE5D5, 0x170A,
- 0xE5D6, 0xE5D6, 0x1157, 0xE5D7, 0xE5F9, 0x170D, 0xE5FA, 0xE5FB, 0x115A,
- 0xE5FC, 0xE5FC, 0x103F, 0xE5FD, 0xE5FD, 0x1730, 0xE5FE, 0xE5FE, 0x115C,
- 0xE6A1, 0xE6A1, 0x115F, 0xE6A2, 0xE6A3, 0x1731, 0xE6A4, 0xE6A4, 0x1161,
- 0xE6A5, 0xE6A6, 0x1733, 0xE6A7, 0xE6A7, 0x1162, 0xE6A8, 0xE6AC, 0x1735,
- 0xE6AD, 0xE6AD, 0x1165, 0xE6AE, 0xE6AE, 0x173A, 0xE6AF, 0xE6B1, 0x1167,
- 0xE6B2, 0xE6B2, 0x173B, 0xE6B3, 0xE6B3, 0x116A, 0xE6B4, 0xE6B6, 0x173C,
- 0xE6B7, 0xE6B8, 0x116B, 0xE6B9, 0xE6BB, 0x173F, 0xE6BC, 0xE6BC, 0x116F,
- 0xE6BD, 0xE6C3, 0x1742, 0xE6C4, 0xE6C4, 0x1040, 0xE6C5, 0xE6C5, 0x1749,
- 0xE6C6, 0xE6C7, 0x1171, 0xE6C8, 0xE6C9, 0x174A, 0xE6CA, 0xE6CA, 0x1041,
- 0xE6CB, 0xE6D1, 0x174C, 0xE6D2, 0xE6D2, 0x1174, 0xE6D3, 0xE6D5, 0x1753,
- 0xE6D6, 0xE6D6, 0x1175, 0xE6D7, 0xE6D8, 0x1756, 0xE6D9, 0xE6D9, 0x1176,
- 0xE6DA, 0xE6DB, 0x1758, 0xE6DC, 0xE6DC, 0x1042, 0xE6DD, 0xE6DE, 0x175A,
- 0xE6DF, 0xE6DF, 0x1177, 0xE6E0, 0xE6E0, 0x175C, 0xE6E1, 0xE6E1, 0x1178,
- 0xE6E2, 0xE6E3, 0x175D, 0xE6E4, 0xE6E4, 0x117A, 0xE6E5, 0xE6E5, 0x1179,
- 0xE6E6, 0xE6E6, 0x117B, 0xE6E7, 0xE6E7, 0x175F, 0xE6E8, 0xE6E8, 0x117C,
- 0xE6E9, 0xE6E9, 0x1760, 0xE6EA, 0xE6EB, 0x117E, 0xE6EC, 0xE6EC, 0x192F,
- 0xE6ED, 0xE6EE, 0x1761, 0xE6EF, 0xE6EF, 0x1181, 0xE6F0, 0xE6F0, 0x1763,
- 0xE6F1, 0xE6F1, 0x1182, 0xE6F2, 0xE6F2, 0x1554, 0xE6F3, 0xE6F4, 0x1764,
- 0xE6F5, 0xE6F5, 0x1183, 0xE6F6, 0xE6F6, 0x1043, 0xE6F7, 0xE6F7, 0x1046,
- 0xE6F8, 0xE6F8, 0x1766, 0xE6F9, 0xE6F9, 0x1185, 0xE6FA, 0xE6FE, 0x1767,
- 0xE7A1, 0xE7A1, 0x1187, 0xE7A2, 0xE7A5, 0x176C, 0xE7A6, 0xE7A6, 0x1188,
- 0xE7A7, 0xE7A8, 0x1770, 0xE7A9, 0xE7A9, 0x1189, 0xE7AA, 0xE7AA, 0x118B,
- 0xE7AB, 0xE7AB, 0x1772, 0xE7AC, 0xE7AC, 0x1047, 0xE7AD, 0xE7AD, 0x118D,
- 0xE7AE, 0xE7AF, 0x1773, 0xE7B0, 0xE7B0, 0x118E, 0xE7B1, 0xE7BE, 0x1775,
- 0xE7BF, 0xE7BF, 0x118F, 0xE7C0, 0xE7C0, 0x1783, 0xE7C1, 0xE7C1, 0x1E67,
- 0xE7C2, 0xE7C5, 0x1784, 0xE7C6, 0xE7C6, 0x1191, 0xE7C7, 0xE7C7, 0x1193,
- 0xE7C8, 0xE7CA, 0x1788, 0xE7CB, 0xE7CB, 0x1195, 0xE7CC, 0xE7CC, 0x178B,
- 0xE7CD, 0xE7CD, 0x1196, 0xE7CE, 0xE7CE, 0x178C, 0xE7CF, 0xE7D0, 0x1197,
- 0xE7D1, 0xE7D2, 0x178D, 0xE7D3, 0xE7D3, 0x119A, 0xE7D4, 0xE7DE, 0x178F,
- 0xE7DF, 0xE7DF, 0x119C, 0xE7E0, 0xE7E3, 0x179A, 0xE7E4, 0xE7E4, 0x119D,
- 0xE7E5, 0xE7E5, 0x179E, 0xE7E6, 0xE7E6, 0x119E, 0xE7E7, 0xE7F6, 0x179F,
- 0xE7F7, 0xE7F7, 0x16A5, 0xE7F8, 0xE7FE, 0x17AF, 0xE8A1, 0xE8E6, 0x17B6,
- 0xE8E7, 0xE8E8, 0x11C7, 0xE8E9, 0xE8EF, 0x17FC, 0xE8F0, 0xE8F0, 0x11C9,
- 0xE8F1, 0xE8F1, 0x1054, 0xE8F2, 0xE8F6, 0x1803, 0xE8F7, 0xE8F7, 0x11CB,
- 0xE8F8, 0xE8F8, 0x1808, 0xE8F9, 0xE8F9, 0x16A8, 0xE8FA, 0xE8FA, 0x1809,
- 0xE8FB, 0xE8FB, 0x11CC, 0xE8FC, 0xE8FD, 0x180A, 0xE8FE, 0xE8FE, 0x11CD,
- 0xE9A1, 0xE9A6, 0x180C, 0xE9A7, 0xE9A7, 0x11D0, 0xE9A8, 0xE9AB, 0x1812,
- 0xE9AC, 0xE9AC, 0x11D1, 0xE9AD, 0xE9CB, 0x1816, 0xE9CC, 0xE9CC, 0x11D3,
- 0xE9CD, 0xE9F6, 0x1835, 0xE9F7, 0xE9F7, 0x1F34, 0xE9F8, 0xE9FE, 0x185F,
- 0xEAA1, 0xEAC0, 0x1866, 0xEAC1, 0xEAC1, 0x17EB, 0xEAC2, 0xEAE4, 0x1886,
- 0xEAE5, 0xEAE5, 0x11E1, 0xEAE6, 0xEAF3, 0x18A9, 0xEAF4, 0xEAF4, 0x1057,
- 0xEAF5, 0xEAF6, 0x18B7, 0xEAF7, 0xEAF7, 0x11E3, 0xEAF8, 0xEAFB, 0x18B9,
- 0xEAFC, 0xEAFC, 0x11E5, 0xEAFD, 0xEAFD, 0x18BD, 0xEAFE, 0xEAFE, 0x11E6,
- 0xEBA1, 0xEBA3, 0x18BE, 0xEBA4, 0xEBA4, 0x11E8, 0xEBA5, 0xEBA6, 0x18C1,
- 0xEBA7, 0xEBA7, 0x11EA, 0xEBA8, 0xEBA8, 0x18C3, 0xEBA9, 0xEBA9, 0x11EC,
- 0xEBAA, 0xEBAA, 0x1058, 0xEBAB, 0xEBB9, 0x18C4, 0xEBBA, 0xEBBB, 0x11EE,
- 0xEBBC, 0xEBBC, 0x18D3, 0xEBBD, 0xEBBD, 0x11F0, 0xEBBE, 0xEBC0, 0x18D4,
- 0xEBC1, 0xEBC1, 0x11F1, 0xEBC2, 0xEBC2, 0x11F3, 0xEBC3, 0xEBC5, 0x18D7,
- 0xEBC6, 0xEBC7, 0x11F4, 0xEBC8, 0xEBCB, 0x18DA, 0xEBCC, 0xEBCC, 0x11F7,
- 0xEBCD, 0xEBCE, 0x18DE, 0xEBCF, 0xEBD1, 0x11F8, 0xEBD2, 0xEBD2, 0x15B0,
- 0xEBD3, 0xEBD7, 0x18E0, 0xEBD8, 0xEBD8, 0x11FB, 0xEBD9, 0xEBFE, 0x18E5,
- 0xECA1, 0xECA5, 0x190B, 0xECA6, 0xECA6, 0x1206, 0xECA7, 0xECA7, 0x1208,
- 0xECA8, 0xECA9, 0x1910, 0xECAA, 0xECAA, 0x120A, 0xECAB, 0xECAE, 0x1912,
- 0xECAF, 0xECAF, 0x173E, 0xECB0, 0xECB1, 0x120C, 0xECB2, 0xECB2, 0x105B,
- 0xECB3, 0xECB4, 0x1916, 0xECB5, 0xECB5, 0x1211, 0xECB6, 0xECB7, 0x1918,
- 0xECB8, 0xECB8, 0x1213, 0xECB9, 0xECB9, 0x191A, 0xECBA, 0xECBA, 0x1215,
- 0xECBB, 0xECBF, 0x191B, 0xECC0, 0xECC1, 0x1218, 0xECC2, 0xECC4, 0x1920,
- 0xECC5, 0xECC5, 0x121A, 0xECC6, 0xECC6, 0x121C, 0xECC7, 0xECC8, 0x1923,
- 0xECC9, 0xECCA, 0x105C, 0xECCB, 0xECD4, 0x1925, 0xECD5, 0xECD5, 0x121E,
- 0xECD6, 0xECDC, 0x192F, 0xECDD, 0xECDE, 0x1220, 0xECDF, 0xECE0, 0x1936,
- 0xECE1, 0xECE1, 0x1222, 0xECE2, 0xECE3, 0x1938, 0xECE4, 0xECE4, 0x1224,
- 0xECE5, 0xECE6, 0x193A, 0xECE7, 0xECE8, 0x1225, 0xECE9, 0xECF6, 0x193C,
- 0xECF7, 0xECF8, 0x1227, 0xECF9, 0xECF9, 0x194A, 0xECFA, 0xECFA, 0x122A,
- 0xECFB, 0xECFE, 0x194B, 0xEDA1, 0xEDA3, 0x122D, 0xEDA4, 0xEDED, 0x194F,
- 0xEDEE, 0xEDEE, 0x14E7, 0xEDEF, 0xEDFE, 0x1999, 0xEEA1, 0xEEDA, 0x19A9,
- 0xEEDB, 0xEEDB, 0x195E, 0xEEDC, 0xEEFE, 0x19E3, 0xEFA1, 0xEFFE, 0x1A06,
- 0xF0A1, 0xF0FE, 0x1A64, 0xF1A1, 0xF1FE, 0x1AC2, 0xF2A1, 0xF2BC, 0x1B20,
- 0xF2BD, 0xF2BD, 0x1663, 0xF2BE, 0xF2F9, 0x1B3C, 0xF2FA, 0xF2FA, 0x168B,
- 0xF2FB, 0xF2FE, 0x1B78, 0xF3A1, 0xF3B0, 0x1B7C, 0xF3B1, 0xF3B1, 0x105F,
- 0xF3B2, 0xF3FE, 0x1B8C, 0xF4A1, 0xF4A6, 0x1BD9, 0xF4A7, 0xF4A7, 0x1954,
- 0xF4A8, 0xF4ED, 0x1BDF, 0xF4EE, 0xF4EE, 0x1A1C, 0xF4EF, 0xF4FE, 0x1C25,
- 0xF5A1, 0xF5FE, 0x1C35, 0xF6A1, 0xF6F3, 0x1C93, 0xF6F4, 0xF6F4, 0x10B7,
- 0xF6F5, 0xF6F5, 0x1CE6, 0xF6F6, 0xF6F6, 0x1BE3, 0xF6F7, 0xF6FE, 0x1CE7,
- 0xF7A1, 0xF7B7, 0x1CEF, 0xF7B8, 0xF7B8, 0x1097, 0xF7B9, 0xF7C7, 0x1D06,
- 0xF7C8, 0xF7C8, 0x10AA, 0xF7C9, 0xF7D2, 0x1D15, 0xF7D3, 0xF7D3, 0x10F4,
- 0xF7D4, 0xF7FE, 0x1D1F, 0xF8A1, 0xF8DA, 0x1D4A, 0xF8DB, 0xF8DB, 0x1D94,
- 0xF8DC, 0xF8EF, 0x1D84, 0xF8F0, 0xF8F0, 0x13E0, 0xF8F1, 0xF8FE, 0x1D98,
- 0xF9A1, 0xF9FE, 0x1DA6, 0xFAA1, 0xFAA1, 0x1E1D, 0xFAA2, 0xFAA2, 0x0DE6,
- 0xFAA3, 0xFAE5, 0x1E04, 0xFAE6, 0xFAE6, 0x0E3C, 0xFAE7, 0xFAFE, 0x1E47,
- 0xFBA1, 0xFBFE, 0x1E5F, 0xFCA1, 0xFCA8, 0x1EBD, 0xFCA9, 0xFCA9, 0x0EE7,
- 0xFCAA, 0xFCFE, 0x1EC5, 0xFDA1, 0xFDFE, 0x1F1A,
-};
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_KSC_EUC_H_0[467 * 3] = {
+ 0x0020, 0x007E, 0x1F9E, 0xA1A1, 0xA1FE, 0x0065, 0xA2A1, 0xA2E5, 0x00C3,
+ 0xA3A1, 0xA3FE, 0x0108, 0xA4A1, 0xA4D3, 0x0166, 0xA4D5, 0xA4FE, 0x0199,
+ 0xA5A1, 0xA5AA, 0x01C3, 0xA5B0, 0xA5B9, 0x01CD, 0xA5C1, 0xA5D8, 0x01D7,
+ 0xA5E1, 0xA5F8, 0x01EF, 0xA6A1, 0xA6E4, 0x0207, 0xA7A1, 0xA7EF, 0x024B,
+ 0xA8A1, 0xA8A4, 0x029A, 0xA8A6, 0xA8A6, 0x029E, 0xA8A8, 0xA8AF, 0x029F,
+ 0xA8B1, 0xA8FE, 0x02A7, 0xA9A1, 0xA9FE, 0x02F5, 0xAAA1, 0xAAF3, 0x0353,
+ 0xABA1, 0xABF6, 0x03A6, 0xACA1, 0xACC1, 0x03FC, 0xACD1, 0xACF1, 0x041D,
+ 0xB0A1, 0xB0FE, 0x043E, 0xB1A1, 0xB1FE, 0x049C, 0xB2A1, 0xB2FE, 0x04FA,
+ 0xB3A1, 0xB3FE, 0x0558, 0xB4A1, 0xB4FE, 0x05B6, 0xB5A1, 0xB5FE, 0x0614,
+ 0xB6A1, 0xB6FE, 0x0672, 0xB7A1, 0xB7FE, 0x06D0, 0xB8A1, 0xB8FE, 0x072E,
+ 0xB9A1, 0xB9FE, 0x078C, 0xBAA1, 0xBAFE, 0x07EA, 0xBBA1, 0xBBFE, 0x0848,
+ 0xBCA1, 0xBCFE, 0x08A6, 0xBDA1, 0xBDFE, 0x0904, 0xBEA1, 0xBEFE, 0x0962,
+ 0xBFA1, 0xBFFE, 0x09C0, 0xC0A1, 0xC0FE, 0x0A1E, 0xC1A1, 0xC1FE, 0x0A7C,
+ 0xC2A1, 0xC2FE, 0x0ADA, 0xC3A1, 0xC3FE, 0x0B38, 0xC4A1, 0xC4FE, 0x0B96,
+ 0xC5A1, 0xC5FE, 0x0BF4, 0xC6A1, 0xC6FE, 0x0C52, 0xC7A1, 0xC7FE, 0x0CB0,
+ 0xC8A1, 0xC8FE, 0x0D0E, 0xCAA1, 0xCAFE, 0x0D6C, 0xCBA1, 0xCBCF, 0x0DCA,
+ 0xCBD0, 0xCBD0, 0x1014, 0xCBD1, 0xCBD5, 0x0DF9, 0xCBD6, 0xCBD6, 0x0E5E,
+ 0xCBD7, 0xCBE6, 0x0DFE, 0xCBE7, 0xCBE7, 0x1B8D, 0xCBE8, 0xCBFE, 0x0E0E,
+ 0xCCA1, 0xCCFE, 0x0E25, 0xCDA1, 0xCDCE, 0x0E83, 0xCDCF, 0xCDCF, 0x0D84,
+ 0xCDD0, 0xCDE7, 0x0EB1, 0xCDE8, 0xCDE8, 0x1EDC, 0xCDE9, 0xCDFE, 0x0EC9,
+ 0xCEA1, 0xCEAC, 0x0EDF, 0xCEAD, 0xCEAD, 0x0EDA, 0xCEAE, 0xCEFE, 0x0EEB,
+ 0xCFA1, 0xCFFA, 0x0F3C, 0xCFFB, 0xCFFB, 0x0F3E, 0xCFFC, 0xCFFE, 0x0F96,
+ 0xD0A1, 0xD0A1, 0x0F99, 0xD0A2, 0xD0A2, 0x0F6A, 0xD0A3, 0xD0B7, 0x0F9A,
+ 0xD0B8, 0xD0B8, 0x0F6A, 0xD0B9, 0xD0CF, 0x0FAF, 0xD0D0, 0xD0D0, 0x0E7C,
+ 0xD0D1, 0xD0DC, 0x0FC6, 0xD0DD, 0xD0DD, 0x1023, 0xD0DE, 0xD0FE, 0x0FD2,
+ 0xD1A1, 0xD1D3, 0x0FF3, 0xD1D4, 0xD1D4, 0x1116, 0xD1D5, 0xD1D5, 0x103C,
+ 0xD1D6, 0xD1D7, 0x1026, 0xD1D8, 0xD1D8, 0x1117, 0xD1D9, 0xD1DA, 0x1028,
+ 0xD1DB, 0xD1E0, 0x1118, 0xD1E1, 0xD1E1, 0x102A, 0xD1E2, 0xD1E2, 0x16A8,
+ 0xD1E3, 0xD1E5, 0x111E, 0xD1E6, 0xD1E6, 0x1122, 0xD1E7, 0xD1E7, 0x102B,
+ 0xD1E8, 0xD1EB, 0x1123, 0xD1EC, 0xD1EC, 0x102C, 0xD1ED, 0xD1ED, 0x1127,
+ 0xD1EE, 0xD1EE, 0x102D, 0xD1EF, 0xD1F0, 0x112A, 0xD1F1, 0xD1F1, 0x102E,
+ 0xD1F2, 0xD1F2, 0x112C, 0xD1F3, 0xD1F5, 0x102F, 0xD1F6, 0xD1F6, 0x112F,
+ 0xD1F7, 0xD1F9, 0x1032, 0xD1FA, 0xD1FA, 0x1133, 0xD1FB, 0xD1FB, 0x1035,
+ 0xD1FC, 0xD1FD, 0x1136, 0xD1FE, 0xD1FE, 0x1139, 0xD2A1, 0xD2A1, 0x1036,
+ 0xD2A2, 0xD2A3, 0x113A, 0xD2A4, 0xD2A6, 0x1037, 0xD2A7, 0xD2AA, 0x113C,
+ 0xD2AB, 0xD2AB, 0x1143, 0xD2AC, 0xD2AC, 0x103A, 0xD2AD, 0xD2AD, 0x1144,
+ 0xD2AE, 0xD2B1, 0x103B, 0xD2B2, 0xD2B2, 0x1148, 0xD2B3, 0xD2BD, 0x103F,
+ 0xD2BE, 0xD2BE, 0x119F, 0xD2BF, 0xD2C1, 0x104A, 0xD2C2, 0xD2C3, 0x11A1,
+ 0xD2C4, 0xD2C4, 0x11A5, 0xD2C5, 0xD2C5, 0x104D, 0xD2C6, 0xD2CA, 0x11A6,
+ 0xD2CB, 0xD2CB, 0x11AC, 0xD2CC, 0xD2CC, 0x104E, 0xD2CD, 0xD2CE, 0x11AD,
+ 0xD2CF, 0xD2D4, 0x11B0, 0xD2D5, 0xD2D7, 0x11B7, 0xD2D8, 0xD2D8, 0x104F,
+ 0xD2D9, 0xD2DA, 0x11BD, 0xD2DB, 0xD2DD, 0x1050, 0xD2DE, 0xD2DF, 0x11C1,
+ 0xD2E0, 0xD2E0, 0x1053, 0xD2E1, 0xD2E1, 0x11C3, 0xD2E2, 0xD2E2, 0x11C6,
+ 0xD2E3, 0xD2E3, 0x1054, 0xD2E4, 0xD2E4, 0x11D4, 0xD2E5, 0xD2E8, 0x11D6,
+ 0xD2E9, 0xD2EA, 0x11DB, 0xD2EB, 0xD2EB, 0x11E0, 0xD2EC, 0xD2EF, 0x1055,
+ 0xD2F0, 0xD2F3, 0x11FC, 0xD2F4, 0xD2F5, 0x1201, 0xD2F6, 0xD2F6, 0x1059,
+ 0xD2F7, 0xD2F8, 0x1203, 0xD2F9, 0xD2FE, 0x105A, 0xD3A1, 0xD3FE, 0x1060,
+ 0xD4A1, 0xD4E5, 0x10BE, 0xD4E6, 0xD4E6, 0x10DE, 0xD4E7, 0xD4FB, 0x1103,
+ 0xD4FC, 0xD4FC, 0x1028, 0xD4FD, 0xD4FE, 0x1118, 0xD5A1, 0xD5A4, 0x111A,
+ 0xD5A5, 0xD5A5, 0x16A8, 0xD5A6, 0xD5AA, 0x111E, 0xD5AB, 0xD5AB, 0x102B,
+ 0xD5AC, 0xD5AD, 0x1123, 0xD5AE, 0xD5AE, 0x1060, 0xD5AF, 0xD5FE, 0x1125,
+ 0xD6A1, 0xD6B7, 0x1175, 0xD6B8, 0xD6B8, 0x1047, 0xD6B9, 0xD6CC, 0x118C,
+ 0xD6CD, 0xD6CD, 0x104C, 0xD6CE, 0xD6FE, 0x11A0, 0xD7A1, 0xD7CA, 0x11D1,
+ 0xD7CB, 0xD7CB, 0x15B0, 0xD7CC, 0xD7E3, 0x11FB, 0xD7E4, 0xD7E4, 0x1918,
+ 0xD7E5, 0xD7FE, 0x1213, 0xD8A1, 0xD8FE, 0x122D, 0xD9A1, 0xD9FE, 0x128B,
+ 0xDAA1, 0xDAFE, 0x12E9, 0xDBA1, 0xDBC4, 0x1347, 0xDBC5, 0xDBC5, 0x141F,
+ 0xDBC6, 0xDBE3, 0x136B, 0xDBE4, 0xDBE4, 0x133A, 0xDBE5, 0xDBFE, 0x1389,
+ 0xDCA1, 0xDCA4, 0x13A3, 0xDCA5, 0xDCA5, 0x1D5E, 0xDCA6, 0xDCFE, 0x13A7,
+ 0xDDA1, 0xDDA4, 0x1400, 0xDDA5, 0xDDA5, 0x13D7, 0xDDA6, 0xDDD4, 0x1404,
+ 0xDDD5, 0xDDD5, 0x13F5, 0xDDD6, 0xDDF3, 0x1433, 0xDDF4, 0xDDF4, 0x1DB7,
+ 0xDDF5, 0xDDFE, 0x1451, 0xDEA1, 0xDEFB, 0x145B, 0xDEFC, 0xDEFC, 0x15D0,
+ 0xDEFD, 0xDEFD, 0x14B6, 0xDEFE, 0xDEFE, 0x14F7, 0xDFA1, 0xDFB2, 0x14B7,
+ 0xDFB3, 0xDFB3, 0x1BAB, 0xDFB4, 0xDFE0, 0x14C9, 0xDFE1, 0xDFE1, 0x14F2,
+ 0xDFE2, 0xDFE7, 0x14F6, 0xDFE8, 0xDFE8, 0x156D, 0xDFE9, 0xDFFE, 0x14FC,
+ 0xE0A1, 0xE0F0, 0x1512, 0xE0F1, 0xE0F1, 0x1771, 0xE0F2, 0xE0FE, 0x1562,
+ 0xE1A1, 0xE1AC, 0x156F, 0xE1AD, 0xE1AD, 0x1554, 0xE1AE, 0xE1EC, 0x157B,
+ 0xE1ED, 0xE1ED, 0x14C5, 0xE1EE, 0xE1FE, 0x15BA, 0xE2A1, 0xE2FE, 0x15CB,
+ 0xE3A1, 0xE3F4, 0x1629, 0xE3F5, 0xE3F5, 0x1B61, 0xE3F6, 0xE3FE, 0x167D,
+ 0xE4A1, 0xE4A1, 0x1CCA, 0xE4A2, 0xE4A8, 0x1686, 0xE4A9, 0xE4A9, 0x162E,
+ 0xE4AA, 0xE4FE, 0x168D, 0xE5A1, 0xE5AD, 0x16E2, 0xE5AE, 0xE5AE, 0x16F2,
+ 0xE5AF, 0xE5B0, 0x16EF, 0xE5B1, 0xE5B2, 0x1149, 0xE5B3, 0xE5B8, 0x16F1,
+ 0xE5B9, 0xE5B9, 0x114B, 0xE5BA, 0xE5BA, 0x16F7, 0xE5BB, 0xE5BC, 0x114D,
+ 0xE5BD, 0xE5C3, 0x16F8, 0xE5C4, 0xE5C4, 0x114F, 0xE5C5, 0xE5CD, 0x16FF,
+ 0xE5CE, 0xE5CE, 0x1153, 0xE5CF, 0xE5CF, 0x1708, 0xE5D0, 0xE5D0, 0x1154,
+ 0xE5D1, 0xE5D1, 0x1709, 0xE5D2, 0xE5D2, 0x1155, 0xE5D3, 0xE5D5, 0x170A,
+ 0xE5D6, 0xE5D6, 0x1157, 0xE5D7, 0xE5F9, 0x170D, 0xE5FA, 0xE5FB, 0x115A,
+ 0xE5FC, 0xE5FC, 0x103F, 0xE5FD, 0xE5FD, 0x1730, 0xE5FE, 0xE5FE, 0x115C,
+ 0xE6A1, 0xE6A1, 0x115F, 0xE6A2, 0xE6A3, 0x1731, 0xE6A4, 0xE6A4, 0x1161,
+ 0xE6A5, 0xE6A6, 0x1733, 0xE6A7, 0xE6A7, 0x1162, 0xE6A8, 0xE6AC, 0x1735,
+ 0xE6AD, 0xE6AD, 0x1165, 0xE6AE, 0xE6AE, 0x173A, 0xE6AF, 0xE6B1, 0x1167,
+ 0xE6B2, 0xE6B2, 0x173B, 0xE6B3, 0xE6B3, 0x116A, 0xE6B4, 0xE6B6, 0x173C,
+ 0xE6B7, 0xE6B8, 0x116B, 0xE6B9, 0xE6BB, 0x173F, 0xE6BC, 0xE6BC, 0x116F,
+ 0xE6BD, 0xE6C3, 0x1742, 0xE6C4, 0xE6C4, 0x1040, 0xE6C5, 0xE6C5, 0x1749,
+ 0xE6C6, 0xE6C7, 0x1171, 0xE6C8, 0xE6C9, 0x174A, 0xE6CA, 0xE6CA, 0x1041,
+ 0xE6CB, 0xE6D1, 0x174C, 0xE6D2, 0xE6D2, 0x1174, 0xE6D3, 0xE6D5, 0x1753,
+ 0xE6D6, 0xE6D6, 0x1175, 0xE6D7, 0xE6D8, 0x1756, 0xE6D9, 0xE6D9, 0x1176,
+ 0xE6DA, 0xE6DB, 0x1758, 0xE6DC, 0xE6DC, 0x1042, 0xE6DD, 0xE6DE, 0x175A,
+ 0xE6DF, 0xE6DF, 0x1177, 0xE6E0, 0xE6E0, 0x175C, 0xE6E1, 0xE6E1, 0x1178,
+ 0xE6E2, 0xE6E3, 0x175D, 0xE6E4, 0xE6E4, 0x117A, 0xE6E5, 0xE6E5, 0x1179,
+ 0xE6E6, 0xE6E6, 0x117B, 0xE6E7, 0xE6E7, 0x175F, 0xE6E8, 0xE6E8, 0x117C,
+ 0xE6E9, 0xE6E9, 0x1760, 0xE6EA, 0xE6EB, 0x117E, 0xE6EC, 0xE6EC, 0x192F,
+ 0xE6ED, 0xE6EE, 0x1761, 0xE6EF, 0xE6EF, 0x1181, 0xE6F0, 0xE6F0, 0x1763,
+ 0xE6F1, 0xE6F1, 0x1182, 0xE6F2, 0xE6F2, 0x1554, 0xE6F3, 0xE6F4, 0x1764,
+ 0xE6F5, 0xE6F5, 0x1183, 0xE6F6, 0xE6F6, 0x1043, 0xE6F7, 0xE6F7, 0x1046,
+ 0xE6F8, 0xE6F8, 0x1766, 0xE6F9, 0xE6F9, 0x1185, 0xE6FA, 0xE6FE, 0x1767,
+ 0xE7A1, 0xE7A1, 0x1187, 0xE7A2, 0xE7A5, 0x176C, 0xE7A6, 0xE7A6, 0x1188,
+ 0xE7A7, 0xE7A8, 0x1770, 0xE7A9, 0xE7A9, 0x1189, 0xE7AA, 0xE7AA, 0x118B,
+ 0xE7AB, 0xE7AB, 0x1772, 0xE7AC, 0xE7AC, 0x1047, 0xE7AD, 0xE7AD, 0x118D,
+ 0xE7AE, 0xE7AF, 0x1773, 0xE7B0, 0xE7B0, 0x118E, 0xE7B1, 0xE7BE, 0x1775,
+ 0xE7BF, 0xE7BF, 0x118F, 0xE7C0, 0xE7C0, 0x1783, 0xE7C1, 0xE7C1, 0x1E67,
+ 0xE7C2, 0xE7C5, 0x1784, 0xE7C6, 0xE7C6, 0x1191, 0xE7C7, 0xE7C7, 0x1193,
+ 0xE7C8, 0xE7CA, 0x1788, 0xE7CB, 0xE7CB, 0x1195, 0xE7CC, 0xE7CC, 0x178B,
+ 0xE7CD, 0xE7CD, 0x1196, 0xE7CE, 0xE7CE, 0x178C, 0xE7CF, 0xE7D0, 0x1197,
+ 0xE7D1, 0xE7D2, 0x178D, 0xE7D3, 0xE7D3, 0x119A, 0xE7D4, 0xE7DE, 0x178F,
+ 0xE7DF, 0xE7DF, 0x119C, 0xE7E0, 0xE7E3, 0x179A, 0xE7E4, 0xE7E4, 0x119D,
+ 0xE7E5, 0xE7E5, 0x179E, 0xE7E6, 0xE7E6, 0x119E, 0xE7E7, 0xE7F6, 0x179F,
+ 0xE7F7, 0xE7F7, 0x16A5, 0xE7F8, 0xE7FE, 0x17AF, 0xE8A1, 0xE8E6, 0x17B6,
+ 0xE8E7, 0xE8E8, 0x11C7, 0xE8E9, 0xE8EF, 0x17FC, 0xE8F0, 0xE8F0, 0x11C9,
+ 0xE8F1, 0xE8F1, 0x1054, 0xE8F2, 0xE8F6, 0x1803, 0xE8F7, 0xE8F7, 0x11CB,
+ 0xE8F8, 0xE8F8, 0x1808, 0xE8F9, 0xE8F9, 0x16A8, 0xE8FA, 0xE8FA, 0x1809,
+ 0xE8FB, 0xE8FB, 0x11CC, 0xE8FC, 0xE8FD, 0x180A, 0xE8FE, 0xE8FE, 0x11CD,
+ 0xE9A1, 0xE9A6, 0x180C, 0xE9A7, 0xE9A7, 0x11D0, 0xE9A8, 0xE9AB, 0x1812,
+ 0xE9AC, 0xE9AC, 0x11D1, 0xE9AD, 0xE9CB, 0x1816, 0xE9CC, 0xE9CC, 0x11D3,
+ 0xE9CD, 0xE9F6, 0x1835, 0xE9F7, 0xE9F7, 0x1F34, 0xE9F8, 0xE9FE, 0x185F,
+ 0xEAA1, 0xEAC0, 0x1866, 0xEAC1, 0xEAC1, 0x17EB, 0xEAC2, 0xEAE4, 0x1886,
+ 0xEAE5, 0xEAE5, 0x11E1, 0xEAE6, 0xEAF3, 0x18A9, 0xEAF4, 0xEAF4, 0x1057,
+ 0xEAF5, 0xEAF6, 0x18B7, 0xEAF7, 0xEAF7, 0x11E3, 0xEAF8, 0xEAFB, 0x18B9,
+ 0xEAFC, 0xEAFC, 0x11E5, 0xEAFD, 0xEAFD, 0x18BD, 0xEAFE, 0xEAFE, 0x11E6,
+ 0xEBA1, 0xEBA3, 0x18BE, 0xEBA4, 0xEBA4, 0x11E8, 0xEBA5, 0xEBA6, 0x18C1,
+ 0xEBA7, 0xEBA7, 0x11EA, 0xEBA8, 0xEBA8, 0x18C3, 0xEBA9, 0xEBA9, 0x11EC,
+ 0xEBAA, 0xEBAA, 0x1058, 0xEBAB, 0xEBB9, 0x18C4, 0xEBBA, 0xEBBB, 0x11EE,
+ 0xEBBC, 0xEBBC, 0x18D3, 0xEBBD, 0xEBBD, 0x11F0, 0xEBBE, 0xEBC0, 0x18D4,
+ 0xEBC1, 0xEBC1, 0x11F1, 0xEBC2, 0xEBC2, 0x11F3, 0xEBC3, 0xEBC5, 0x18D7,
+ 0xEBC6, 0xEBC7, 0x11F4, 0xEBC8, 0xEBCB, 0x18DA, 0xEBCC, 0xEBCC, 0x11F7,
+ 0xEBCD, 0xEBCE, 0x18DE, 0xEBCF, 0xEBD1, 0x11F8, 0xEBD2, 0xEBD2, 0x15B0,
+ 0xEBD3, 0xEBD7, 0x18E0, 0xEBD8, 0xEBD8, 0x11FB, 0xEBD9, 0xEBFE, 0x18E5,
+ 0xECA1, 0xECA5, 0x190B, 0xECA6, 0xECA6, 0x1206, 0xECA7, 0xECA7, 0x1208,
+ 0xECA8, 0xECA9, 0x1910, 0xECAA, 0xECAA, 0x120A, 0xECAB, 0xECAE, 0x1912,
+ 0xECAF, 0xECAF, 0x173E, 0xECB0, 0xECB1, 0x120C, 0xECB2, 0xECB2, 0x105B,
+ 0xECB3, 0xECB4, 0x1916, 0xECB5, 0xECB5, 0x1211, 0xECB6, 0xECB7, 0x1918,
+ 0xECB8, 0xECB8, 0x1213, 0xECB9, 0xECB9, 0x191A, 0xECBA, 0xECBA, 0x1215,
+ 0xECBB, 0xECBF, 0x191B, 0xECC0, 0xECC1, 0x1218, 0xECC2, 0xECC4, 0x1920,
+ 0xECC5, 0xECC5, 0x121A, 0xECC6, 0xECC6, 0x121C, 0xECC7, 0xECC8, 0x1923,
+ 0xECC9, 0xECCA, 0x105C, 0xECCB, 0xECD4, 0x1925, 0xECD5, 0xECD5, 0x121E,
+ 0xECD6, 0xECDC, 0x192F, 0xECDD, 0xECDE, 0x1220, 0xECDF, 0xECE0, 0x1936,
+ 0xECE1, 0xECE1, 0x1222, 0xECE2, 0xECE3, 0x1938, 0xECE4, 0xECE4, 0x1224,
+ 0xECE5, 0xECE6, 0x193A, 0xECE7, 0xECE8, 0x1225, 0xECE9, 0xECF6, 0x193C,
+ 0xECF7, 0xECF8, 0x1227, 0xECF9, 0xECF9, 0x194A, 0xECFA, 0xECFA, 0x122A,
+ 0xECFB, 0xECFE, 0x194B, 0xEDA1, 0xEDA3, 0x122D, 0xEDA4, 0xEDED, 0x194F,
+ 0xEDEE, 0xEDEE, 0x14E7, 0xEDEF, 0xEDFE, 0x1999, 0xEEA1, 0xEEDA, 0x19A9,
+ 0xEEDB, 0xEEDB, 0x195E, 0xEEDC, 0xEEFE, 0x19E3, 0xEFA1, 0xEFFE, 0x1A06,
+ 0xF0A1, 0xF0FE, 0x1A64, 0xF1A1, 0xF1FE, 0x1AC2, 0xF2A1, 0xF2BC, 0x1B20,
+ 0xF2BD, 0xF2BD, 0x1663, 0xF2BE, 0xF2F9, 0x1B3C, 0xF2FA, 0xF2FA, 0x168B,
+ 0xF2FB, 0xF2FE, 0x1B78, 0xF3A1, 0xF3B0, 0x1B7C, 0xF3B1, 0xF3B1, 0x105F,
+ 0xF3B2, 0xF3FE, 0x1B8C, 0xF4A1, 0xF4A6, 0x1BD9, 0xF4A7, 0xF4A7, 0x1954,
+ 0xF4A8, 0xF4ED, 0x1BDF, 0xF4EE, 0xF4EE, 0x1A1C, 0xF4EF, 0xF4FE, 0x1C25,
+ 0xF5A1, 0xF5FE, 0x1C35, 0xF6A1, 0xF6F3, 0x1C93, 0xF6F4, 0xF6F4, 0x10B7,
+ 0xF6F5, 0xF6F5, 0x1CE6, 0xF6F6, 0xF6F6, 0x1BE3, 0xF6F7, 0xF6FE, 0x1CE7,
+ 0xF7A1, 0xF7B7, 0x1CEF, 0xF7B8, 0xF7B8, 0x1097, 0xF7B9, 0xF7C7, 0x1D06,
+ 0xF7C8, 0xF7C8, 0x10AA, 0xF7C9, 0xF7D2, 0x1D15, 0xF7D3, 0xF7D3, 0x10F4,
+ 0xF7D4, 0xF7FE, 0x1D1F, 0xF8A1, 0xF8DA, 0x1D4A, 0xF8DB, 0xF8DB, 0x1D94,
+ 0xF8DC, 0xF8EF, 0x1D84, 0xF8F0, 0xF8F0, 0x13E0, 0xF8F1, 0xF8FE, 0x1D98,
+ 0xF9A1, 0xF9FE, 0x1DA6, 0xFAA1, 0xFAA1, 0x1E1D, 0xFAA2, 0xFAA2, 0x0DE6,
+ 0xFAA3, 0xFAE5, 0x1E04, 0xFAE6, 0xFAE6, 0x0E3C, 0xFAE7, 0xFAFE, 0x1E47,
+ 0xFBA1, 0xFBFE, 0x1E5F, 0xFCA1, 0xFCA8, 0x1EBD, 0xFCA9, 0xFCA9, 0x0EE7,
+ 0xFCAA, 0xFCFE, 0x1EC5, 0xFDA1, 0xFDFE, 0x1F1A,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/Korea1/KSC-EUC-V_0.cpp b/core/src/fpdfapi/fpdf_cmaps/Korea1/KSC-EUC-V_0.cpp
index e75a6a3b4f..5ff44154b4 100644
--- a/core/src/fpdfapi/fpdf_cmaps/Korea1/KSC-EUC-V_0.cpp
+++ b/core/src/fpdfapi/fpdf_cmaps/Korea1/KSC-EUC-V_0.cpp
@@ -1,14 +1,14 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-extern const unsigned short g_FXCMAP_KSC_EUC_V_0[16 * 3] = {
- 0xA1A2, 0xA1A3, 0x1F78, 0xA1A5, 0xA1A5, 0x1F7A, 0xA1A6, 0xA1A6, 0x2080,
- 0xA1A9, 0xA1AB, 0x1F7B, 0xA1AD, 0xA1AD, 0x1F7E, 0xA1B2, 0xA1BD, 0x1F7F,
- 0xA1EB, 0xA1EB, 0x1F8B, 0xA3A1, 0xA3A1, 0x1F8C, 0xA3A8, 0xA3A9, 0x1F8D,
- 0xA3AC, 0xA3AC, 0x1F8F, 0xA3AE, 0xA3AE, 0x1F90, 0xA3BA, 0xA3BF, 0x1F91,
- 0xA3DB, 0xA3DB, 0x1F97, 0xA3DD, 0xA3DD, 0x1F98, 0xA3DF, 0xA3DF, 0x1F99,
- 0xA3FB, 0xA3FE, 0x1F9A,
-};
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_KSC_EUC_V_0[16 * 3] = {
+ 0xA1A2, 0xA1A3, 0x1F78, 0xA1A5, 0xA1A5, 0x1F7A, 0xA1A6, 0xA1A6, 0x2080,
+ 0xA1A9, 0xA1AB, 0x1F7B, 0xA1AD, 0xA1AD, 0x1F7E, 0xA1B2, 0xA1BD, 0x1F7F,
+ 0xA1EB, 0xA1EB, 0x1F8B, 0xA3A1, 0xA3A1, 0x1F8C, 0xA3A8, 0xA3A9, 0x1F8D,
+ 0xA3AC, 0xA3AC, 0x1F8F, 0xA3AE, 0xA3AE, 0x1F90, 0xA3BA, 0xA3BF, 0x1F91,
+ 0xA3DB, 0xA3DB, 0x1F97, 0xA3DD, 0xA3DD, 0x1F98, 0xA3DF, 0xA3DF, 0x1F99,
+ 0xA3FB, 0xA3FE, 0x1F9A,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/Korea1/KSCms-UHC-HW-H_1.cpp b/core/src/fpdfapi/fpdf_cmaps/Korea1/KSCms-UHC-HW-H_1.cpp
index d95bab8287..d49e9f4813 100644
--- a/core/src/fpdfapi/fpdf_cmaps/Korea1/KSCms-UHC-HW-H_1.cpp
+++ b/core/src/fpdfapi/fpdf_cmaps/Korea1/KSCms-UHC-HW-H_1.cpp
@@ -1,233 +1,233 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-extern const unsigned short g_FXCMAP_KSCms_UHC_HW_H_1[675 * 3] = {
- 0x0020, 0x007E, 0x1F9E, 0x8141, 0x815A, 0x2475, 0x8161, 0x817A, 0x248F,
- 0x8181, 0x81FE, 0x24A9, 0x8241, 0x825A, 0x2527, 0x8261, 0x827A, 0x2541,
- 0x8281, 0x82FE, 0x255B, 0x8341, 0x835A, 0x25D9, 0x8361, 0x837A, 0x25F3,
- 0x8381, 0x83FE, 0x260D, 0x8441, 0x845A, 0x268B, 0x8461, 0x847A, 0x26A5,
- 0x8481, 0x84FE, 0x26BF, 0x8541, 0x855A, 0x273D, 0x8561, 0x857A, 0x2757,
- 0x8581, 0x85FE, 0x2771, 0x8641, 0x865A, 0x27EF, 0x8661, 0x867A, 0x2809,
- 0x8681, 0x86FE, 0x2823, 0x8741, 0x875A, 0x28A1, 0x8761, 0x877A, 0x28BB,
- 0x8781, 0x87FE, 0x28D5, 0x8841, 0x885A, 0x2953, 0x8861, 0x887A, 0x296D,
- 0x8881, 0x88FE, 0x2987, 0x8941, 0x895A, 0x2A05, 0x8961, 0x897A, 0x2A1F,
- 0x8981, 0x89FE, 0x2A39, 0x8A41, 0x8A5A, 0x2AB7, 0x8A61, 0x8A7A, 0x2AD1,
- 0x8A81, 0x8AFE, 0x2AEB, 0x8B41, 0x8B5A, 0x2B69, 0x8B61, 0x8B7A, 0x2B83,
- 0x8B81, 0x8BFE, 0x2B9D, 0x8C41, 0x8C5A, 0x2C1B, 0x8C61, 0x8C7A, 0x2C35,
- 0x8C81, 0x8CFE, 0x2C4F, 0x8D41, 0x8D5A, 0x2CCD, 0x8D61, 0x8D7A, 0x2CE7,
- 0x8D81, 0x8DFE, 0x2D01, 0x8E41, 0x8E5A, 0x2D7F, 0x8E61, 0x8E7A, 0x2D99,
- 0x8E81, 0x8EFE, 0x2DB3, 0x8F41, 0x8F5A, 0x2E31, 0x8F61, 0x8F7A, 0x2E4B,
- 0x8F81, 0x8FFE, 0x2E65, 0x9041, 0x905A, 0x2EE3, 0x9061, 0x907A, 0x2EFD,
- 0x9081, 0x90FE, 0x2F17, 0x9141, 0x915A, 0x2F95, 0x9161, 0x917A, 0x2FAF,
- 0x9181, 0x91FE, 0x2FC9, 0x9241, 0x925A, 0x3047, 0x9261, 0x927A, 0x3061,
- 0x9281, 0x92FE, 0x307B, 0x9341, 0x935A, 0x30F9, 0x9361, 0x937A, 0x3113,
- 0x9381, 0x93FE, 0x312D, 0x9441, 0x945A, 0x31AB, 0x9461, 0x947A, 0x31C5,
- 0x9481, 0x94FE, 0x31DF, 0x9541, 0x955A, 0x325D, 0x9561, 0x957A, 0x3277,
- 0x9581, 0x95FE, 0x3291, 0x9641, 0x965A, 0x330F, 0x9661, 0x967A, 0x3329,
- 0x9681, 0x96FE, 0x3343, 0x9741, 0x975A, 0x33C1, 0x9761, 0x977A, 0x33DB,
- 0x9781, 0x97FE, 0x33F5, 0x9841, 0x985A, 0x3473, 0x9861, 0x987A, 0x348D,
- 0x9881, 0x98FE, 0x34A7, 0x9941, 0x995A, 0x3525, 0x9961, 0x997A, 0x353F,
- 0x9981, 0x99FE, 0x3559, 0x9A41, 0x9A5A, 0x35D7, 0x9A61, 0x9A7A, 0x35F1,
- 0x9A81, 0x9AFE, 0x360B, 0x9B41, 0x9B5A, 0x3689, 0x9B61, 0x9B7A, 0x36A3,
- 0x9B81, 0x9BFE, 0x36BD, 0x9C41, 0x9C5A, 0x373B, 0x9C61, 0x9C7A, 0x3755,
- 0x9C81, 0x9CFE, 0x376F, 0x9D41, 0x9D5A, 0x37ED, 0x9D61, 0x9D7A, 0x3807,
- 0x9D81, 0x9DFE, 0x3821, 0x9E41, 0x9E5A, 0x389F, 0x9E61, 0x9E7A, 0x38B9,
- 0x9E81, 0x9EFE, 0x38D3, 0x9F41, 0x9F5A, 0x3951, 0x9F61, 0x9F7A, 0x396B,
- 0x9F81, 0x9FFE, 0x3985, 0xA041, 0xA05A, 0x3A03, 0xA061, 0xA07A, 0x3A1D,
- 0xA081, 0xA0FE, 0x3A37, 0xA141, 0xA15A, 0x3AB5, 0xA161, 0xA17A, 0x3ACF,
- 0xA181, 0xA1A0, 0x3AE9, 0xA1A1, 0xA1FE, 0x0065, 0xA241, 0xA25A, 0x3B09,
- 0xA261, 0xA27A, 0x3B23, 0xA281, 0xA2A0, 0x3B3D, 0xA2A1, 0xA2E5, 0x00C3,
- 0xA341, 0xA35A, 0x3B5D, 0xA361, 0xA37A, 0x3B77, 0xA381, 0xA3A0, 0x3B91,
- 0xA3A1, 0xA3FE, 0x0108, 0xA441, 0xA45A, 0x3BB1, 0xA461, 0xA47A, 0x3BCB,
- 0xA481, 0xA4A0, 0x3BE5, 0xA4A1, 0xA4D3, 0x0166, 0xA4D5, 0xA4FE, 0x0199,
- 0xA541, 0xA55A, 0x3C05, 0xA561, 0xA57A, 0x3C1F, 0xA581, 0xA5A0, 0x3C39,
- 0xA5A1, 0xA5AA, 0x01C3, 0xA5B0, 0xA5B9, 0x01CD, 0xA5C1, 0xA5D8, 0x01D7,
- 0xA5E1, 0xA5F8, 0x01EF, 0xA641, 0xA65A, 0x3C59, 0xA661, 0xA67A, 0x3C73,
- 0xA681, 0xA6A0, 0x3C8D, 0xA6A1, 0xA6E4, 0x0207, 0xA741, 0xA75A, 0x3CAD,
- 0xA761, 0xA77A, 0x3CC7, 0xA781, 0xA7A0, 0x3CE1, 0xA7A1, 0xA7EF, 0x024B,
- 0xA841, 0xA85A, 0x3D01, 0xA861, 0xA87A, 0x3D1B, 0xA881, 0xA8A0, 0x3D35,
- 0xA8A1, 0xA8A4, 0x029A, 0xA8A6, 0xA8A6, 0x029E, 0xA8A8, 0xA8AF, 0x029F,
- 0xA8B1, 0xA8FE, 0x02A7, 0xA941, 0xA95A, 0x3D55, 0xA961, 0xA97A, 0x3D6F,
- 0xA981, 0xA9A0, 0x3D89, 0xA9A1, 0xA9FE, 0x02F5, 0xAA41, 0xAA5A, 0x3DA9,
- 0xAA61, 0xAA7A, 0x3DC3, 0xAA81, 0xAAA0, 0x3DDD, 0xAAA1, 0xAAF3, 0x0353,
- 0xAB41, 0xAB5A, 0x3DFD, 0xAB61, 0xAB7A, 0x3E17, 0xAB81, 0xABA0, 0x3E31,
- 0xABA1, 0xABF6, 0x03A6, 0xAC41, 0xAC5A, 0x3E51, 0xAC61, 0xAC7A, 0x3E6B,
- 0xAC81, 0xACA0, 0x3E85, 0xACA1, 0xACC1, 0x03FC, 0xACD1, 0xACF1, 0x041D,
- 0xAD41, 0xAD5A, 0x3EA5, 0xAD61, 0xAD7A, 0x3EBF, 0xAD81, 0xADA0, 0x3ED9,
- 0xAE41, 0xAE5A, 0x3EF9, 0xAE61, 0xAE7A, 0x3F13, 0xAE81, 0xAEA0, 0x3F2D,
- 0xAF41, 0xAF5A, 0x3F4D, 0xAF61, 0xAF7A, 0x3F67, 0xAF81, 0xAFA0, 0x3F81,
- 0xB041, 0xB05A, 0x3FA1, 0xB061, 0xB07A, 0x3FBB, 0xB081, 0xB0A0, 0x3FD5,
- 0xB0A1, 0xB0FE, 0x043E, 0xB141, 0xB15A, 0x3FF5, 0xB161, 0xB17A, 0x400F,
- 0xB181, 0xB1A0, 0x4029, 0xB1A1, 0xB1FE, 0x049C, 0xB241, 0xB25A, 0x4049,
- 0xB261, 0xB27A, 0x4063, 0xB281, 0xB2A0, 0x407D, 0xB2A1, 0xB2FE, 0x04FA,
- 0xB341, 0xB35A, 0x409D, 0xB361, 0xB37A, 0x40B7, 0xB381, 0xB3A0, 0x40D1,
- 0xB3A1, 0xB3FE, 0x0558, 0xB441, 0xB45A, 0x40F1, 0xB461, 0xB47A, 0x410B,
- 0xB481, 0xB4A0, 0x4125, 0xB4A1, 0xB4FE, 0x05B6, 0xB541, 0xB55A, 0x4145,
- 0xB561, 0xB57A, 0x415F, 0xB581, 0xB5A0, 0x4179, 0xB5A1, 0xB5FE, 0x0614,
- 0xB641, 0xB65A, 0x4199, 0xB661, 0xB67A, 0x41B3, 0xB681, 0xB6A0, 0x41CD,
- 0xB6A1, 0xB6FE, 0x0672, 0xB741, 0xB75A, 0x41ED, 0xB761, 0xB77A, 0x4207,
- 0xB781, 0xB7A0, 0x4221, 0xB7A1, 0xB7FE, 0x06D0, 0xB841, 0xB85A, 0x4241,
- 0xB861, 0xB87A, 0x425B, 0xB881, 0xB8A0, 0x4275, 0xB8A1, 0xB8FE, 0x072E,
- 0xB941, 0xB95A, 0x4295, 0xB961, 0xB97A, 0x42AF, 0xB981, 0xB9A0, 0x42C9,
- 0xB9A1, 0xB9FE, 0x078C, 0xBA41, 0xBA5A, 0x42E9, 0xBA61, 0xBA7A, 0x4303,
- 0xBA81, 0xBAA0, 0x431D, 0xBAA1, 0xBAFE, 0x07EA, 0xBB41, 0xBB5A, 0x433D,
- 0xBB61, 0xBB7A, 0x4357, 0xBB81, 0xBBA0, 0x4371, 0xBBA1, 0xBBFE, 0x0848,
- 0xBC41, 0xBC5A, 0x4391, 0xBC61, 0xBC7A, 0x43AB, 0xBC81, 0xBCA0, 0x43C5,
- 0xBCA1, 0xBCFE, 0x08A6, 0xBD41, 0xBD5A, 0x43E5, 0xBD61, 0xBD7A, 0x43FF,
- 0xBD81, 0xBDA0, 0x4419, 0xBDA1, 0xBDFE, 0x0904, 0xBE41, 0xBE5A, 0x4439,
- 0xBE61, 0xBE7A, 0x4453, 0xBE81, 0xBEA0, 0x446D, 0xBEA1, 0xBEFE, 0x0962,
- 0xBF41, 0xBF5A, 0x448D, 0xBF61, 0xBF7A, 0x44A7, 0xBF81, 0xBFA0, 0x44C1,
- 0xBFA1, 0xBFFE, 0x09C0, 0xC041, 0xC05A, 0x44E1, 0xC061, 0xC07A, 0x44FB,
- 0xC081, 0xC0A0, 0x4515, 0xC0A1, 0xC0FE, 0x0A1E, 0xC141, 0xC15A, 0x4535,
- 0xC161, 0xC17A, 0x454F, 0xC181, 0xC1A0, 0x4569, 0xC1A1, 0xC1FE, 0x0A7C,
- 0xC241, 0xC25A, 0x4589, 0xC261, 0xC27A, 0x45A3, 0xC281, 0xC2A0, 0x45BD,
- 0xC2A1, 0xC2FE, 0x0ADA, 0xC341, 0xC35A, 0x45DD, 0xC361, 0xC37A, 0x45F7,
- 0xC381, 0xC3A0, 0x4611, 0xC3A1, 0xC3FE, 0x0B38, 0xC441, 0xC45A, 0x4631,
- 0xC461, 0xC47A, 0x464B, 0xC481, 0xC4A0, 0x4665, 0xC4A1, 0xC4FE, 0x0B96,
- 0xC541, 0xC55A, 0x4685, 0xC561, 0xC57A, 0x469F, 0xC581, 0xC5A0, 0x46B9,
- 0xC5A1, 0xC5FE, 0x0BF4, 0xC641, 0xC652, 0x46D9, 0xC6A1, 0xC6FE, 0x0C52,
- 0xC7A1, 0xC7FE, 0x0CB0, 0xC8A1, 0xC8FE, 0x0D0E, 0xCAA1, 0xCAFE, 0x0D6C,
- 0xCBA1, 0xCBCF, 0x0DCA, 0xCBD0, 0xCBD0, 0x1014, 0xCBD1, 0xCBD5, 0x0DF9,
- 0xCBD6, 0xCBD6, 0x0E5E, 0xCBD7, 0xCBE6, 0x0DFE, 0xCBE7, 0xCBE7, 0x1B8D,
- 0xCBE8, 0xCBFE, 0x0E0E, 0xCCA1, 0xCCFE, 0x0E25, 0xCDA1, 0xCDCE, 0x0E83,
- 0xCDCF, 0xCDCF, 0x0D84, 0xCDD0, 0xCDE7, 0x0EB1, 0xCDE8, 0xCDE8, 0x1EDC,
- 0xCDE9, 0xCDFE, 0x0EC9, 0xCEA1, 0xCEAC, 0x0EDF, 0xCEAD, 0xCEAD, 0x0EDA,
- 0xCEAE, 0xCEFE, 0x0EEB, 0xCFA1, 0xCFFA, 0x0F3C, 0xCFFB, 0xCFFB, 0x0F3E,
- 0xCFFC, 0xCFFE, 0x0F96, 0xD0A1, 0xD0A1, 0x0F99, 0xD0A2, 0xD0A2, 0x0F6A,
- 0xD0A3, 0xD0B7, 0x0F9A, 0xD0B8, 0xD0B8, 0x0F6A, 0xD0B9, 0xD0CF, 0x0FAF,
- 0xD0D0, 0xD0D0, 0x0E7C, 0xD0D1, 0xD0DC, 0x0FC6, 0xD0DD, 0xD0DD, 0x1023,
- 0xD0DE, 0xD0FE, 0x0FD2, 0xD1A1, 0xD1D3, 0x0FF3, 0xD1D4, 0xD1D4, 0x1116,
- 0xD1D5, 0xD1D5, 0x103C, 0xD1D6, 0xD1D7, 0x1026, 0xD1D8, 0xD1D8, 0x1117,
- 0xD1D9, 0xD1DA, 0x1028, 0xD1DB, 0xD1E0, 0x1118, 0xD1E1, 0xD1E1, 0x102A,
- 0xD1E2, 0xD1E2, 0x16A8, 0xD1E3, 0xD1E5, 0x111E, 0xD1E6, 0xD1E6, 0x1122,
- 0xD1E7, 0xD1E7, 0x102B, 0xD1E8, 0xD1EB, 0x1123, 0xD1EC, 0xD1EC, 0x102C,
- 0xD1ED, 0xD1ED, 0x1127, 0xD1EE, 0xD1EE, 0x102D, 0xD1EF, 0xD1F0, 0x112A,
- 0xD1F1, 0xD1F1, 0x102E, 0xD1F2, 0xD1F2, 0x112C, 0xD1F3, 0xD1F5, 0x102F,
- 0xD1F6, 0xD1F6, 0x112F, 0xD1F7, 0xD1F9, 0x1032, 0xD1FA, 0xD1FA, 0x1133,
- 0xD1FB, 0xD1FB, 0x1035, 0xD1FC, 0xD1FD, 0x1136, 0xD1FE, 0xD1FE, 0x1139,
- 0xD2A1, 0xD2A1, 0x1036, 0xD2A2, 0xD2A3, 0x113A, 0xD2A4, 0xD2A6, 0x1037,
- 0xD2A7, 0xD2AA, 0x113C, 0xD2AB, 0xD2AB, 0x1143, 0xD2AC, 0xD2AC, 0x103A,
- 0xD2AD, 0xD2AD, 0x1144, 0xD2AE, 0xD2B1, 0x103B, 0xD2B2, 0xD2B2, 0x1148,
- 0xD2B3, 0xD2BD, 0x103F, 0xD2BE, 0xD2BE, 0x119F, 0xD2BF, 0xD2C1, 0x104A,
- 0xD2C2, 0xD2C3, 0x11A1, 0xD2C4, 0xD2C4, 0x11A5, 0xD2C5, 0xD2C5, 0x104D,
- 0xD2C6, 0xD2CA, 0x11A6, 0xD2CB, 0xD2CB, 0x11AC, 0xD2CC, 0xD2CC, 0x104E,
- 0xD2CD, 0xD2CE, 0x11AD, 0xD2CF, 0xD2D4, 0x11B0, 0xD2D5, 0xD2D7, 0x11B7,
- 0xD2D8, 0xD2D8, 0x104F, 0xD2D9, 0xD2DA, 0x11BD, 0xD2DB, 0xD2DD, 0x1050,
- 0xD2DE, 0xD2DF, 0x11C1, 0xD2E0, 0xD2E0, 0x1053, 0xD2E1, 0xD2E1, 0x11C3,
- 0xD2E2, 0xD2E2, 0x11C6, 0xD2E3, 0xD2E3, 0x1054, 0xD2E4, 0xD2E4, 0x11D4,
- 0xD2E5, 0xD2E8, 0x11D6, 0xD2E9, 0xD2EA, 0x11DB, 0xD2EB, 0xD2EB, 0x11E0,
- 0xD2EC, 0xD2EF, 0x1055, 0xD2F0, 0xD2F3, 0x11FC, 0xD2F4, 0xD2F5, 0x1201,
- 0xD2F6, 0xD2F6, 0x1059, 0xD2F7, 0xD2F8, 0x1203, 0xD2F9, 0xD2FE, 0x105A,
- 0xD3A1, 0xD3FE, 0x1060, 0xD4A1, 0xD4E5, 0x10BE, 0xD4E6, 0xD4E6, 0x10DE,
- 0xD4E7, 0xD4FB, 0x1103, 0xD4FC, 0xD4FC, 0x1028, 0xD4FD, 0xD4FE, 0x1118,
- 0xD5A1, 0xD5A4, 0x111A, 0xD5A5, 0xD5A5, 0x16A8, 0xD5A6, 0xD5AA, 0x111E,
- 0xD5AB, 0xD5AB, 0x102B, 0xD5AC, 0xD5AD, 0x1123, 0xD5AE, 0xD5AE, 0x1060,
- 0xD5AF, 0xD5FE, 0x1125, 0xD6A1, 0xD6B7, 0x1175, 0xD6B8, 0xD6B8, 0x1047,
- 0xD6B9, 0xD6CC, 0x118C, 0xD6CD, 0xD6CD, 0x104C, 0xD6CE, 0xD6FE, 0x11A0,
- 0xD7A1, 0xD7CA, 0x11D1, 0xD7CB, 0xD7CB, 0x15B0, 0xD7CC, 0xD7E3, 0x11FB,
- 0xD7E4, 0xD7E4, 0x1918, 0xD7E5, 0xD7FE, 0x1213, 0xD8A1, 0xD8FE, 0x122D,
- 0xD9A1, 0xD9FE, 0x128B, 0xDAA1, 0xDAFE, 0x12E9, 0xDBA1, 0xDBC4, 0x1347,
- 0xDBC5, 0xDBC5, 0x141F, 0xDBC6, 0xDBE3, 0x136B, 0xDBE4, 0xDBE4, 0x133A,
- 0xDBE5, 0xDBFE, 0x1389, 0xDCA1, 0xDCA4, 0x13A3, 0xDCA5, 0xDCA5, 0x1D5E,
- 0xDCA6, 0xDCFE, 0x13A7, 0xDDA1, 0xDDA4, 0x1400, 0xDDA5, 0xDDA5, 0x13D7,
- 0xDDA6, 0xDDD4, 0x1404, 0xDDD5, 0xDDD5, 0x13F5, 0xDDD6, 0xDDF3, 0x1433,
- 0xDDF4, 0xDDF4, 0x1DB7, 0xDDF5, 0xDDFE, 0x1451, 0xDEA1, 0xDEFB, 0x145B,
- 0xDEFC, 0xDEFC, 0x15D0, 0xDEFD, 0xDEFD, 0x14B6, 0xDEFE, 0xDEFE, 0x14F7,
- 0xDFA1, 0xDFB2, 0x14B7, 0xDFB3, 0xDFB3, 0x1BAB, 0xDFB4, 0xDFE0, 0x14C9,
- 0xDFE1, 0xDFE1, 0x14F2, 0xDFE2, 0xDFE7, 0x14F6, 0xDFE8, 0xDFE8, 0x156D,
- 0xDFE9, 0xDFFE, 0x14FC, 0xE0A1, 0xE0F0, 0x1512, 0xE0F1, 0xE0F1, 0x1771,
- 0xE0F2, 0xE0FE, 0x1562, 0xE1A1, 0xE1AC, 0x156F, 0xE1AD, 0xE1AD, 0x1554,
- 0xE1AE, 0xE1EC, 0x157B, 0xE1ED, 0xE1ED, 0x14C5, 0xE1EE, 0xE1FE, 0x15BA,
- 0xE2A1, 0xE2FE, 0x15CB, 0xE3A1, 0xE3F4, 0x1629, 0xE3F5, 0xE3F5, 0x1B61,
- 0xE3F6, 0xE3FE, 0x167D, 0xE4A1, 0xE4A1, 0x1CCA, 0xE4A2, 0xE4A8, 0x1686,
- 0xE4A9, 0xE4A9, 0x162E, 0xE4AA, 0xE4FE, 0x168D, 0xE5A1, 0xE5AD, 0x16E2,
- 0xE5AE, 0xE5AE, 0x16F2, 0xE5AF, 0xE5B0, 0x16EF, 0xE5B1, 0xE5B2, 0x1149,
- 0xE5B3, 0xE5B8, 0x16F1, 0xE5B9, 0xE5B9, 0x114B, 0xE5BA, 0xE5BA, 0x16F7,
- 0xE5BB, 0xE5BC, 0x114D, 0xE5BD, 0xE5C3, 0x16F8, 0xE5C4, 0xE5C4, 0x114F,
- 0xE5C5, 0xE5CD, 0x16FF, 0xE5CE, 0xE5CE, 0x1153, 0xE5CF, 0xE5CF, 0x1708,
- 0xE5D0, 0xE5D0, 0x1154, 0xE5D1, 0xE5D1, 0x1709, 0xE5D2, 0xE5D2, 0x1155,
- 0xE5D3, 0xE5D5, 0x170A, 0xE5D6, 0xE5D6, 0x1157, 0xE5D7, 0xE5F9, 0x170D,
- 0xE5FA, 0xE5FB, 0x115A, 0xE5FC, 0xE5FC, 0x103F, 0xE5FD, 0xE5FD, 0x1730,
- 0xE5FE, 0xE5FE, 0x115C, 0xE6A1, 0xE6A1, 0x115F, 0xE6A2, 0xE6A3, 0x1731,
- 0xE6A4, 0xE6A4, 0x1161, 0xE6A5, 0xE6A6, 0x1733, 0xE6A7, 0xE6A7, 0x1162,
- 0xE6A8, 0xE6AC, 0x1735, 0xE6AD, 0xE6AD, 0x1165, 0xE6AE, 0xE6AE, 0x173A,
- 0xE6AF, 0xE6B1, 0x1167, 0xE6B2, 0xE6B2, 0x173B, 0xE6B3, 0xE6B3, 0x116A,
- 0xE6B4, 0xE6B6, 0x173C, 0xE6B7, 0xE6B8, 0x116B, 0xE6B9, 0xE6BB, 0x173F,
- 0xE6BC, 0xE6BC, 0x116F, 0xE6BD, 0xE6C3, 0x1742, 0xE6C4, 0xE6C4, 0x1040,
- 0xE6C5, 0xE6C5, 0x1749, 0xE6C6, 0xE6C7, 0x1171, 0xE6C8, 0xE6C9, 0x174A,
- 0xE6CA, 0xE6CA, 0x1041, 0xE6CB, 0xE6D1, 0x174C, 0xE6D2, 0xE6D2, 0x1174,
- 0xE6D3, 0xE6D5, 0x1753, 0xE6D6, 0xE6D6, 0x1175, 0xE6D7, 0xE6D8, 0x1756,
- 0xE6D9, 0xE6D9, 0x1176, 0xE6DA, 0xE6DB, 0x1758, 0xE6DC, 0xE6DC, 0x1042,
- 0xE6DD, 0xE6DE, 0x175A, 0xE6DF, 0xE6DF, 0x1177, 0xE6E0, 0xE6E0, 0x175C,
- 0xE6E1, 0xE6E1, 0x1178, 0xE6E2, 0xE6E3, 0x175D, 0xE6E4, 0xE6E4, 0x117A,
- 0xE6E5, 0xE6E5, 0x1179, 0xE6E6, 0xE6E6, 0x117B, 0xE6E7, 0xE6E7, 0x175F,
- 0xE6E8, 0xE6E8, 0x117C, 0xE6E9, 0xE6E9, 0x1760, 0xE6EA, 0xE6EB, 0x117E,
- 0xE6EC, 0xE6EC, 0x192F, 0xE6ED, 0xE6EE, 0x1761, 0xE6EF, 0xE6EF, 0x1181,
- 0xE6F0, 0xE6F0, 0x1763, 0xE6F1, 0xE6F1, 0x1182, 0xE6F2, 0xE6F2, 0x1554,
- 0xE6F3, 0xE6F4, 0x1764, 0xE6F5, 0xE6F5, 0x1183, 0xE6F6, 0xE6F6, 0x1043,
- 0xE6F7, 0xE6F7, 0x1046, 0xE6F8, 0xE6F8, 0x1766, 0xE6F9, 0xE6F9, 0x1185,
- 0xE6FA, 0xE6FE, 0x1767, 0xE7A1, 0xE7A1, 0x1187, 0xE7A2, 0xE7A5, 0x176C,
- 0xE7A6, 0xE7A6, 0x1188, 0xE7A7, 0xE7A8, 0x1770, 0xE7A9, 0xE7A9, 0x1189,
- 0xE7AA, 0xE7AA, 0x118B, 0xE7AB, 0xE7AB, 0x1772, 0xE7AC, 0xE7AC, 0x1047,
- 0xE7AD, 0xE7AD, 0x118D, 0xE7AE, 0xE7AF, 0x1773, 0xE7B0, 0xE7B0, 0x118E,
- 0xE7B1, 0xE7BE, 0x1775, 0xE7BF, 0xE7BF, 0x118F, 0xE7C0, 0xE7C0, 0x1783,
- 0xE7C1, 0xE7C1, 0x1E67, 0xE7C2, 0xE7C5, 0x1784, 0xE7C6, 0xE7C6, 0x1191,
- 0xE7C7, 0xE7C7, 0x1193, 0xE7C8, 0xE7CA, 0x1788, 0xE7CB, 0xE7CB, 0x1195,
- 0xE7CC, 0xE7CC, 0x178B, 0xE7CD, 0xE7CD, 0x1196, 0xE7CE, 0xE7CE, 0x178C,
- 0xE7CF, 0xE7D0, 0x1197, 0xE7D1, 0xE7D2, 0x178D, 0xE7D3, 0xE7D3, 0x119A,
- 0xE7D4, 0xE7DE, 0x178F, 0xE7DF, 0xE7DF, 0x119C, 0xE7E0, 0xE7E3, 0x179A,
- 0xE7E4, 0xE7E4, 0x119D, 0xE7E5, 0xE7E5, 0x179E, 0xE7E6, 0xE7E6, 0x119E,
- 0xE7E7, 0xE7F6, 0x179F, 0xE7F7, 0xE7F7, 0x16A5, 0xE7F8, 0xE7FE, 0x17AF,
- 0xE8A1, 0xE8E6, 0x17B6, 0xE8E7, 0xE8E8, 0x11C7, 0xE8E9, 0xE8EF, 0x17FC,
- 0xE8F0, 0xE8F0, 0x11C9, 0xE8F1, 0xE8F1, 0x1054, 0xE8F2, 0xE8F6, 0x1803,
- 0xE8F7, 0xE8F7, 0x11CB, 0xE8F8, 0xE8F8, 0x1808, 0xE8F9, 0xE8F9, 0x16A8,
- 0xE8FA, 0xE8FA, 0x1809, 0xE8FB, 0xE8FB, 0x11CC, 0xE8FC, 0xE8FD, 0x180A,
- 0xE8FE, 0xE8FE, 0x11CD, 0xE9A1, 0xE9A6, 0x180C, 0xE9A7, 0xE9A7, 0x11D0,
- 0xE9A8, 0xE9AB, 0x1812, 0xE9AC, 0xE9AC, 0x11D1, 0xE9AD, 0xE9CB, 0x1816,
- 0xE9CC, 0xE9CC, 0x11D3, 0xE9CD, 0xE9F6, 0x1835, 0xE9F7, 0xE9F7, 0x1F34,
- 0xE9F8, 0xE9FE, 0x185F, 0xEAA1, 0xEAC0, 0x1866, 0xEAC1, 0xEAC1, 0x17EB,
- 0xEAC2, 0xEAE4, 0x1886, 0xEAE5, 0xEAE5, 0x11E1, 0xEAE6, 0xEAF3, 0x18A9,
- 0xEAF4, 0xEAF4, 0x1057, 0xEAF5, 0xEAF6, 0x18B7, 0xEAF7, 0xEAF7, 0x11E3,
- 0xEAF8, 0xEAFB, 0x18B9, 0xEAFC, 0xEAFC, 0x11E5, 0xEAFD, 0xEAFD, 0x18BD,
- 0xEAFE, 0xEAFE, 0x11E6, 0xEBA1, 0xEBA3, 0x18BE, 0xEBA4, 0xEBA4, 0x11E8,
- 0xEBA5, 0xEBA6, 0x18C1, 0xEBA7, 0xEBA7, 0x11EA, 0xEBA8, 0xEBA8, 0x18C3,
- 0xEBA9, 0xEBA9, 0x11EC, 0xEBAA, 0xEBAA, 0x1058, 0xEBAB, 0xEBB9, 0x18C4,
- 0xEBBA, 0xEBBB, 0x11EE, 0xEBBC, 0xEBBC, 0x18D3, 0xEBBD, 0xEBBD, 0x11F0,
- 0xEBBE, 0xEBC0, 0x18D4, 0xEBC1, 0xEBC1, 0x11F1, 0xEBC2, 0xEBC2, 0x11F3,
- 0xEBC3, 0xEBC5, 0x18D7, 0xEBC6, 0xEBC7, 0x11F4, 0xEBC8, 0xEBCB, 0x18DA,
- 0xEBCC, 0xEBCC, 0x11F7, 0xEBCD, 0xEBCE, 0x18DE, 0xEBCF, 0xEBD1, 0x11F8,
- 0xEBD2, 0xEBD2, 0x15B0, 0xEBD3, 0xEBD7, 0x18E0, 0xEBD8, 0xEBD8, 0x11FB,
- 0xEBD9, 0xEBFE, 0x18E5, 0xECA1, 0xECA5, 0x190B, 0xECA6, 0xECA6, 0x1206,
- 0xECA7, 0xECA7, 0x1208, 0xECA8, 0xECA9, 0x1910, 0xECAA, 0xECAA, 0x120A,
- 0xECAB, 0xECAE, 0x1912, 0xECAF, 0xECAF, 0x173E, 0xECB0, 0xECB1, 0x120C,
- 0xECB2, 0xECB2, 0x105B, 0xECB3, 0xECB4, 0x1916, 0xECB5, 0xECB5, 0x1211,
- 0xECB6, 0xECB7, 0x1918, 0xECB8, 0xECB8, 0x1213, 0xECB9, 0xECB9, 0x191A,
- 0xECBA, 0xECBA, 0x1215, 0xECBB, 0xECBF, 0x191B, 0xECC0, 0xECC1, 0x1218,
- 0xECC2, 0xECC4, 0x1920, 0xECC5, 0xECC5, 0x121A, 0xECC6, 0xECC6, 0x121C,
- 0xECC7, 0xECC8, 0x1923, 0xECC9, 0xECCA, 0x105C, 0xECCB, 0xECD4, 0x1925,
- 0xECD5, 0xECD5, 0x121E, 0xECD6, 0xECDC, 0x192F, 0xECDD, 0xECDE, 0x1220,
- 0xECDF, 0xECE0, 0x1936, 0xECE1, 0xECE1, 0x1222, 0xECE2, 0xECE3, 0x1938,
- 0xECE4, 0xECE4, 0x1224, 0xECE5, 0xECE6, 0x193A, 0xECE7, 0xECE8, 0x1225,
- 0xECE9, 0xECF6, 0x193C, 0xECF7, 0xECF8, 0x1227, 0xECF9, 0xECF9, 0x194A,
- 0xECFA, 0xECFA, 0x122A, 0xECFB, 0xECFE, 0x194B, 0xEDA1, 0xEDA3, 0x122D,
- 0xEDA4, 0xEDED, 0x194F, 0xEDEE, 0xEDEE, 0x14E7, 0xEDEF, 0xEDFE, 0x1999,
- 0xEEA1, 0xEEDA, 0x19A9, 0xEEDB, 0xEEDB, 0x195E, 0xEEDC, 0xEEFE, 0x19E3,
- 0xEFA1, 0xEFFE, 0x1A06, 0xF0A1, 0xF0FE, 0x1A64, 0xF1A1, 0xF1FE, 0x1AC2,
- 0xF2A1, 0xF2BC, 0x1B20, 0xF2BD, 0xF2BD, 0x1663, 0xF2BE, 0xF2F9, 0x1B3C,
- 0xF2FA, 0xF2FA, 0x168B, 0xF2FB, 0xF2FE, 0x1B78, 0xF3A1, 0xF3B0, 0x1B7C,
- 0xF3B1, 0xF3B1, 0x105F, 0xF3B2, 0xF3FE, 0x1B8C, 0xF4A1, 0xF4A6, 0x1BD9,
- 0xF4A7, 0xF4A7, 0x1954, 0xF4A8, 0xF4ED, 0x1BDF, 0xF4EE, 0xF4EE, 0x1A1C,
- 0xF4EF, 0xF4FE, 0x1C25, 0xF5A1, 0xF5FE, 0x1C35, 0xF6A1, 0xF6F3, 0x1C93,
- 0xF6F4, 0xF6F4, 0x10B7, 0xF6F5, 0xF6F5, 0x1CE6, 0xF6F6, 0xF6F6, 0x1BE3,
- 0xF6F7, 0xF6FE, 0x1CE7, 0xF7A1, 0xF7B7, 0x1CEF, 0xF7B8, 0xF7B8, 0x1097,
- 0xF7B9, 0xF7C7, 0x1D06, 0xF7C8, 0xF7C8, 0x10AA, 0xF7C9, 0xF7D2, 0x1D15,
- 0xF7D3, 0xF7D3, 0x10F4, 0xF7D4, 0xF7FE, 0x1D1F, 0xF8A1, 0xF8DA, 0x1D4A,
- 0xF8DB, 0xF8DB, 0x1D94, 0xF8DC, 0xF8EF, 0x1D84, 0xF8F0, 0xF8F0, 0x13E0,
- 0xF8F1, 0xF8FE, 0x1D98, 0xF9A1, 0xF9FE, 0x1DA6, 0xFAA1, 0xFAA1, 0x1E1D,
- 0xFAA2, 0xFAA2, 0x0DE6, 0xFAA3, 0xFAE5, 0x1E04, 0xFAE6, 0xFAE6, 0x0E3C,
- 0xFAE7, 0xFAFE, 0x1E47, 0xFBA1, 0xFBFE, 0x1E5F, 0xFCA1, 0xFCA8, 0x1EBD,
- 0xFCA9, 0xFCA9, 0x0EE7, 0xFCAA, 0xFCFE, 0x1EC5, 0xFDA1, 0xFDFE, 0x1F1A,
-};
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_KSCms_UHC_HW_H_1[675 * 3] = {
+ 0x0020, 0x007E, 0x1F9E, 0x8141, 0x815A, 0x2475, 0x8161, 0x817A, 0x248F,
+ 0x8181, 0x81FE, 0x24A9, 0x8241, 0x825A, 0x2527, 0x8261, 0x827A, 0x2541,
+ 0x8281, 0x82FE, 0x255B, 0x8341, 0x835A, 0x25D9, 0x8361, 0x837A, 0x25F3,
+ 0x8381, 0x83FE, 0x260D, 0x8441, 0x845A, 0x268B, 0x8461, 0x847A, 0x26A5,
+ 0x8481, 0x84FE, 0x26BF, 0x8541, 0x855A, 0x273D, 0x8561, 0x857A, 0x2757,
+ 0x8581, 0x85FE, 0x2771, 0x8641, 0x865A, 0x27EF, 0x8661, 0x867A, 0x2809,
+ 0x8681, 0x86FE, 0x2823, 0x8741, 0x875A, 0x28A1, 0x8761, 0x877A, 0x28BB,
+ 0x8781, 0x87FE, 0x28D5, 0x8841, 0x885A, 0x2953, 0x8861, 0x887A, 0x296D,
+ 0x8881, 0x88FE, 0x2987, 0x8941, 0x895A, 0x2A05, 0x8961, 0x897A, 0x2A1F,
+ 0x8981, 0x89FE, 0x2A39, 0x8A41, 0x8A5A, 0x2AB7, 0x8A61, 0x8A7A, 0x2AD1,
+ 0x8A81, 0x8AFE, 0x2AEB, 0x8B41, 0x8B5A, 0x2B69, 0x8B61, 0x8B7A, 0x2B83,
+ 0x8B81, 0x8BFE, 0x2B9D, 0x8C41, 0x8C5A, 0x2C1B, 0x8C61, 0x8C7A, 0x2C35,
+ 0x8C81, 0x8CFE, 0x2C4F, 0x8D41, 0x8D5A, 0x2CCD, 0x8D61, 0x8D7A, 0x2CE7,
+ 0x8D81, 0x8DFE, 0x2D01, 0x8E41, 0x8E5A, 0x2D7F, 0x8E61, 0x8E7A, 0x2D99,
+ 0x8E81, 0x8EFE, 0x2DB3, 0x8F41, 0x8F5A, 0x2E31, 0x8F61, 0x8F7A, 0x2E4B,
+ 0x8F81, 0x8FFE, 0x2E65, 0x9041, 0x905A, 0x2EE3, 0x9061, 0x907A, 0x2EFD,
+ 0x9081, 0x90FE, 0x2F17, 0x9141, 0x915A, 0x2F95, 0x9161, 0x917A, 0x2FAF,
+ 0x9181, 0x91FE, 0x2FC9, 0x9241, 0x925A, 0x3047, 0x9261, 0x927A, 0x3061,
+ 0x9281, 0x92FE, 0x307B, 0x9341, 0x935A, 0x30F9, 0x9361, 0x937A, 0x3113,
+ 0x9381, 0x93FE, 0x312D, 0x9441, 0x945A, 0x31AB, 0x9461, 0x947A, 0x31C5,
+ 0x9481, 0x94FE, 0x31DF, 0x9541, 0x955A, 0x325D, 0x9561, 0x957A, 0x3277,
+ 0x9581, 0x95FE, 0x3291, 0x9641, 0x965A, 0x330F, 0x9661, 0x967A, 0x3329,
+ 0x9681, 0x96FE, 0x3343, 0x9741, 0x975A, 0x33C1, 0x9761, 0x977A, 0x33DB,
+ 0x9781, 0x97FE, 0x33F5, 0x9841, 0x985A, 0x3473, 0x9861, 0x987A, 0x348D,
+ 0x9881, 0x98FE, 0x34A7, 0x9941, 0x995A, 0x3525, 0x9961, 0x997A, 0x353F,
+ 0x9981, 0x99FE, 0x3559, 0x9A41, 0x9A5A, 0x35D7, 0x9A61, 0x9A7A, 0x35F1,
+ 0x9A81, 0x9AFE, 0x360B, 0x9B41, 0x9B5A, 0x3689, 0x9B61, 0x9B7A, 0x36A3,
+ 0x9B81, 0x9BFE, 0x36BD, 0x9C41, 0x9C5A, 0x373B, 0x9C61, 0x9C7A, 0x3755,
+ 0x9C81, 0x9CFE, 0x376F, 0x9D41, 0x9D5A, 0x37ED, 0x9D61, 0x9D7A, 0x3807,
+ 0x9D81, 0x9DFE, 0x3821, 0x9E41, 0x9E5A, 0x389F, 0x9E61, 0x9E7A, 0x38B9,
+ 0x9E81, 0x9EFE, 0x38D3, 0x9F41, 0x9F5A, 0x3951, 0x9F61, 0x9F7A, 0x396B,
+ 0x9F81, 0x9FFE, 0x3985, 0xA041, 0xA05A, 0x3A03, 0xA061, 0xA07A, 0x3A1D,
+ 0xA081, 0xA0FE, 0x3A37, 0xA141, 0xA15A, 0x3AB5, 0xA161, 0xA17A, 0x3ACF,
+ 0xA181, 0xA1A0, 0x3AE9, 0xA1A1, 0xA1FE, 0x0065, 0xA241, 0xA25A, 0x3B09,
+ 0xA261, 0xA27A, 0x3B23, 0xA281, 0xA2A0, 0x3B3D, 0xA2A1, 0xA2E5, 0x00C3,
+ 0xA341, 0xA35A, 0x3B5D, 0xA361, 0xA37A, 0x3B77, 0xA381, 0xA3A0, 0x3B91,
+ 0xA3A1, 0xA3FE, 0x0108, 0xA441, 0xA45A, 0x3BB1, 0xA461, 0xA47A, 0x3BCB,
+ 0xA481, 0xA4A0, 0x3BE5, 0xA4A1, 0xA4D3, 0x0166, 0xA4D5, 0xA4FE, 0x0199,
+ 0xA541, 0xA55A, 0x3C05, 0xA561, 0xA57A, 0x3C1F, 0xA581, 0xA5A0, 0x3C39,
+ 0xA5A1, 0xA5AA, 0x01C3, 0xA5B0, 0xA5B9, 0x01CD, 0xA5C1, 0xA5D8, 0x01D7,
+ 0xA5E1, 0xA5F8, 0x01EF, 0xA641, 0xA65A, 0x3C59, 0xA661, 0xA67A, 0x3C73,
+ 0xA681, 0xA6A0, 0x3C8D, 0xA6A1, 0xA6E4, 0x0207, 0xA741, 0xA75A, 0x3CAD,
+ 0xA761, 0xA77A, 0x3CC7, 0xA781, 0xA7A0, 0x3CE1, 0xA7A1, 0xA7EF, 0x024B,
+ 0xA841, 0xA85A, 0x3D01, 0xA861, 0xA87A, 0x3D1B, 0xA881, 0xA8A0, 0x3D35,
+ 0xA8A1, 0xA8A4, 0x029A, 0xA8A6, 0xA8A6, 0x029E, 0xA8A8, 0xA8AF, 0x029F,
+ 0xA8B1, 0xA8FE, 0x02A7, 0xA941, 0xA95A, 0x3D55, 0xA961, 0xA97A, 0x3D6F,
+ 0xA981, 0xA9A0, 0x3D89, 0xA9A1, 0xA9FE, 0x02F5, 0xAA41, 0xAA5A, 0x3DA9,
+ 0xAA61, 0xAA7A, 0x3DC3, 0xAA81, 0xAAA0, 0x3DDD, 0xAAA1, 0xAAF3, 0x0353,
+ 0xAB41, 0xAB5A, 0x3DFD, 0xAB61, 0xAB7A, 0x3E17, 0xAB81, 0xABA0, 0x3E31,
+ 0xABA1, 0xABF6, 0x03A6, 0xAC41, 0xAC5A, 0x3E51, 0xAC61, 0xAC7A, 0x3E6B,
+ 0xAC81, 0xACA0, 0x3E85, 0xACA1, 0xACC1, 0x03FC, 0xACD1, 0xACF1, 0x041D,
+ 0xAD41, 0xAD5A, 0x3EA5, 0xAD61, 0xAD7A, 0x3EBF, 0xAD81, 0xADA0, 0x3ED9,
+ 0xAE41, 0xAE5A, 0x3EF9, 0xAE61, 0xAE7A, 0x3F13, 0xAE81, 0xAEA0, 0x3F2D,
+ 0xAF41, 0xAF5A, 0x3F4D, 0xAF61, 0xAF7A, 0x3F67, 0xAF81, 0xAFA0, 0x3F81,
+ 0xB041, 0xB05A, 0x3FA1, 0xB061, 0xB07A, 0x3FBB, 0xB081, 0xB0A0, 0x3FD5,
+ 0xB0A1, 0xB0FE, 0x043E, 0xB141, 0xB15A, 0x3FF5, 0xB161, 0xB17A, 0x400F,
+ 0xB181, 0xB1A0, 0x4029, 0xB1A1, 0xB1FE, 0x049C, 0xB241, 0xB25A, 0x4049,
+ 0xB261, 0xB27A, 0x4063, 0xB281, 0xB2A0, 0x407D, 0xB2A1, 0xB2FE, 0x04FA,
+ 0xB341, 0xB35A, 0x409D, 0xB361, 0xB37A, 0x40B7, 0xB381, 0xB3A0, 0x40D1,
+ 0xB3A1, 0xB3FE, 0x0558, 0xB441, 0xB45A, 0x40F1, 0xB461, 0xB47A, 0x410B,
+ 0xB481, 0xB4A0, 0x4125, 0xB4A1, 0xB4FE, 0x05B6, 0xB541, 0xB55A, 0x4145,
+ 0xB561, 0xB57A, 0x415F, 0xB581, 0xB5A0, 0x4179, 0xB5A1, 0xB5FE, 0x0614,
+ 0xB641, 0xB65A, 0x4199, 0xB661, 0xB67A, 0x41B3, 0xB681, 0xB6A0, 0x41CD,
+ 0xB6A1, 0xB6FE, 0x0672, 0xB741, 0xB75A, 0x41ED, 0xB761, 0xB77A, 0x4207,
+ 0xB781, 0xB7A0, 0x4221, 0xB7A1, 0xB7FE, 0x06D0, 0xB841, 0xB85A, 0x4241,
+ 0xB861, 0xB87A, 0x425B, 0xB881, 0xB8A0, 0x4275, 0xB8A1, 0xB8FE, 0x072E,
+ 0xB941, 0xB95A, 0x4295, 0xB961, 0xB97A, 0x42AF, 0xB981, 0xB9A0, 0x42C9,
+ 0xB9A1, 0xB9FE, 0x078C, 0xBA41, 0xBA5A, 0x42E9, 0xBA61, 0xBA7A, 0x4303,
+ 0xBA81, 0xBAA0, 0x431D, 0xBAA1, 0xBAFE, 0x07EA, 0xBB41, 0xBB5A, 0x433D,
+ 0xBB61, 0xBB7A, 0x4357, 0xBB81, 0xBBA0, 0x4371, 0xBBA1, 0xBBFE, 0x0848,
+ 0xBC41, 0xBC5A, 0x4391, 0xBC61, 0xBC7A, 0x43AB, 0xBC81, 0xBCA0, 0x43C5,
+ 0xBCA1, 0xBCFE, 0x08A6, 0xBD41, 0xBD5A, 0x43E5, 0xBD61, 0xBD7A, 0x43FF,
+ 0xBD81, 0xBDA0, 0x4419, 0xBDA1, 0xBDFE, 0x0904, 0xBE41, 0xBE5A, 0x4439,
+ 0xBE61, 0xBE7A, 0x4453, 0xBE81, 0xBEA0, 0x446D, 0xBEA1, 0xBEFE, 0x0962,
+ 0xBF41, 0xBF5A, 0x448D, 0xBF61, 0xBF7A, 0x44A7, 0xBF81, 0xBFA0, 0x44C1,
+ 0xBFA1, 0xBFFE, 0x09C0, 0xC041, 0xC05A, 0x44E1, 0xC061, 0xC07A, 0x44FB,
+ 0xC081, 0xC0A0, 0x4515, 0xC0A1, 0xC0FE, 0x0A1E, 0xC141, 0xC15A, 0x4535,
+ 0xC161, 0xC17A, 0x454F, 0xC181, 0xC1A0, 0x4569, 0xC1A1, 0xC1FE, 0x0A7C,
+ 0xC241, 0xC25A, 0x4589, 0xC261, 0xC27A, 0x45A3, 0xC281, 0xC2A0, 0x45BD,
+ 0xC2A1, 0xC2FE, 0x0ADA, 0xC341, 0xC35A, 0x45DD, 0xC361, 0xC37A, 0x45F7,
+ 0xC381, 0xC3A0, 0x4611, 0xC3A1, 0xC3FE, 0x0B38, 0xC441, 0xC45A, 0x4631,
+ 0xC461, 0xC47A, 0x464B, 0xC481, 0xC4A0, 0x4665, 0xC4A1, 0xC4FE, 0x0B96,
+ 0xC541, 0xC55A, 0x4685, 0xC561, 0xC57A, 0x469F, 0xC581, 0xC5A0, 0x46B9,
+ 0xC5A1, 0xC5FE, 0x0BF4, 0xC641, 0xC652, 0x46D9, 0xC6A1, 0xC6FE, 0x0C52,
+ 0xC7A1, 0xC7FE, 0x0CB0, 0xC8A1, 0xC8FE, 0x0D0E, 0xCAA1, 0xCAFE, 0x0D6C,
+ 0xCBA1, 0xCBCF, 0x0DCA, 0xCBD0, 0xCBD0, 0x1014, 0xCBD1, 0xCBD5, 0x0DF9,
+ 0xCBD6, 0xCBD6, 0x0E5E, 0xCBD7, 0xCBE6, 0x0DFE, 0xCBE7, 0xCBE7, 0x1B8D,
+ 0xCBE8, 0xCBFE, 0x0E0E, 0xCCA1, 0xCCFE, 0x0E25, 0xCDA1, 0xCDCE, 0x0E83,
+ 0xCDCF, 0xCDCF, 0x0D84, 0xCDD0, 0xCDE7, 0x0EB1, 0xCDE8, 0xCDE8, 0x1EDC,
+ 0xCDE9, 0xCDFE, 0x0EC9, 0xCEA1, 0xCEAC, 0x0EDF, 0xCEAD, 0xCEAD, 0x0EDA,
+ 0xCEAE, 0xCEFE, 0x0EEB, 0xCFA1, 0xCFFA, 0x0F3C, 0xCFFB, 0xCFFB, 0x0F3E,
+ 0xCFFC, 0xCFFE, 0x0F96, 0xD0A1, 0xD0A1, 0x0F99, 0xD0A2, 0xD0A2, 0x0F6A,
+ 0xD0A3, 0xD0B7, 0x0F9A, 0xD0B8, 0xD0B8, 0x0F6A, 0xD0B9, 0xD0CF, 0x0FAF,
+ 0xD0D0, 0xD0D0, 0x0E7C, 0xD0D1, 0xD0DC, 0x0FC6, 0xD0DD, 0xD0DD, 0x1023,
+ 0xD0DE, 0xD0FE, 0x0FD2, 0xD1A1, 0xD1D3, 0x0FF3, 0xD1D4, 0xD1D4, 0x1116,
+ 0xD1D5, 0xD1D5, 0x103C, 0xD1D6, 0xD1D7, 0x1026, 0xD1D8, 0xD1D8, 0x1117,
+ 0xD1D9, 0xD1DA, 0x1028, 0xD1DB, 0xD1E0, 0x1118, 0xD1E1, 0xD1E1, 0x102A,
+ 0xD1E2, 0xD1E2, 0x16A8, 0xD1E3, 0xD1E5, 0x111E, 0xD1E6, 0xD1E6, 0x1122,
+ 0xD1E7, 0xD1E7, 0x102B, 0xD1E8, 0xD1EB, 0x1123, 0xD1EC, 0xD1EC, 0x102C,
+ 0xD1ED, 0xD1ED, 0x1127, 0xD1EE, 0xD1EE, 0x102D, 0xD1EF, 0xD1F0, 0x112A,
+ 0xD1F1, 0xD1F1, 0x102E, 0xD1F2, 0xD1F2, 0x112C, 0xD1F3, 0xD1F5, 0x102F,
+ 0xD1F6, 0xD1F6, 0x112F, 0xD1F7, 0xD1F9, 0x1032, 0xD1FA, 0xD1FA, 0x1133,
+ 0xD1FB, 0xD1FB, 0x1035, 0xD1FC, 0xD1FD, 0x1136, 0xD1FE, 0xD1FE, 0x1139,
+ 0xD2A1, 0xD2A1, 0x1036, 0xD2A2, 0xD2A3, 0x113A, 0xD2A4, 0xD2A6, 0x1037,
+ 0xD2A7, 0xD2AA, 0x113C, 0xD2AB, 0xD2AB, 0x1143, 0xD2AC, 0xD2AC, 0x103A,
+ 0xD2AD, 0xD2AD, 0x1144, 0xD2AE, 0xD2B1, 0x103B, 0xD2B2, 0xD2B2, 0x1148,
+ 0xD2B3, 0xD2BD, 0x103F, 0xD2BE, 0xD2BE, 0x119F, 0xD2BF, 0xD2C1, 0x104A,
+ 0xD2C2, 0xD2C3, 0x11A1, 0xD2C4, 0xD2C4, 0x11A5, 0xD2C5, 0xD2C5, 0x104D,
+ 0xD2C6, 0xD2CA, 0x11A6, 0xD2CB, 0xD2CB, 0x11AC, 0xD2CC, 0xD2CC, 0x104E,
+ 0xD2CD, 0xD2CE, 0x11AD, 0xD2CF, 0xD2D4, 0x11B0, 0xD2D5, 0xD2D7, 0x11B7,
+ 0xD2D8, 0xD2D8, 0x104F, 0xD2D9, 0xD2DA, 0x11BD, 0xD2DB, 0xD2DD, 0x1050,
+ 0xD2DE, 0xD2DF, 0x11C1, 0xD2E0, 0xD2E0, 0x1053, 0xD2E1, 0xD2E1, 0x11C3,
+ 0xD2E2, 0xD2E2, 0x11C6, 0xD2E3, 0xD2E3, 0x1054, 0xD2E4, 0xD2E4, 0x11D4,
+ 0xD2E5, 0xD2E8, 0x11D6, 0xD2E9, 0xD2EA, 0x11DB, 0xD2EB, 0xD2EB, 0x11E0,
+ 0xD2EC, 0xD2EF, 0x1055, 0xD2F0, 0xD2F3, 0x11FC, 0xD2F4, 0xD2F5, 0x1201,
+ 0xD2F6, 0xD2F6, 0x1059, 0xD2F7, 0xD2F8, 0x1203, 0xD2F9, 0xD2FE, 0x105A,
+ 0xD3A1, 0xD3FE, 0x1060, 0xD4A1, 0xD4E5, 0x10BE, 0xD4E6, 0xD4E6, 0x10DE,
+ 0xD4E7, 0xD4FB, 0x1103, 0xD4FC, 0xD4FC, 0x1028, 0xD4FD, 0xD4FE, 0x1118,
+ 0xD5A1, 0xD5A4, 0x111A, 0xD5A5, 0xD5A5, 0x16A8, 0xD5A6, 0xD5AA, 0x111E,
+ 0xD5AB, 0xD5AB, 0x102B, 0xD5AC, 0xD5AD, 0x1123, 0xD5AE, 0xD5AE, 0x1060,
+ 0xD5AF, 0xD5FE, 0x1125, 0xD6A1, 0xD6B7, 0x1175, 0xD6B8, 0xD6B8, 0x1047,
+ 0xD6B9, 0xD6CC, 0x118C, 0xD6CD, 0xD6CD, 0x104C, 0xD6CE, 0xD6FE, 0x11A0,
+ 0xD7A1, 0xD7CA, 0x11D1, 0xD7CB, 0xD7CB, 0x15B0, 0xD7CC, 0xD7E3, 0x11FB,
+ 0xD7E4, 0xD7E4, 0x1918, 0xD7E5, 0xD7FE, 0x1213, 0xD8A1, 0xD8FE, 0x122D,
+ 0xD9A1, 0xD9FE, 0x128B, 0xDAA1, 0xDAFE, 0x12E9, 0xDBA1, 0xDBC4, 0x1347,
+ 0xDBC5, 0xDBC5, 0x141F, 0xDBC6, 0xDBE3, 0x136B, 0xDBE4, 0xDBE4, 0x133A,
+ 0xDBE5, 0xDBFE, 0x1389, 0xDCA1, 0xDCA4, 0x13A3, 0xDCA5, 0xDCA5, 0x1D5E,
+ 0xDCA6, 0xDCFE, 0x13A7, 0xDDA1, 0xDDA4, 0x1400, 0xDDA5, 0xDDA5, 0x13D7,
+ 0xDDA6, 0xDDD4, 0x1404, 0xDDD5, 0xDDD5, 0x13F5, 0xDDD6, 0xDDF3, 0x1433,
+ 0xDDF4, 0xDDF4, 0x1DB7, 0xDDF5, 0xDDFE, 0x1451, 0xDEA1, 0xDEFB, 0x145B,
+ 0xDEFC, 0xDEFC, 0x15D0, 0xDEFD, 0xDEFD, 0x14B6, 0xDEFE, 0xDEFE, 0x14F7,
+ 0xDFA1, 0xDFB2, 0x14B7, 0xDFB3, 0xDFB3, 0x1BAB, 0xDFB4, 0xDFE0, 0x14C9,
+ 0xDFE1, 0xDFE1, 0x14F2, 0xDFE2, 0xDFE7, 0x14F6, 0xDFE8, 0xDFE8, 0x156D,
+ 0xDFE9, 0xDFFE, 0x14FC, 0xE0A1, 0xE0F0, 0x1512, 0xE0F1, 0xE0F1, 0x1771,
+ 0xE0F2, 0xE0FE, 0x1562, 0xE1A1, 0xE1AC, 0x156F, 0xE1AD, 0xE1AD, 0x1554,
+ 0xE1AE, 0xE1EC, 0x157B, 0xE1ED, 0xE1ED, 0x14C5, 0xE1EE, 0xE1FE, 0x15BA,
+ 0xE2A1, 0xE2FE, 0x15CB, 0xE3A1, 0xE3F4, 0x1629, 0xE3F5, 0xE3F5, 0x1B61,
+ 0xE3F6, 0xE3FE, 0x167D, 0xE4A1, 0xE4A1, 0x1CCA, 0xE4A2, 0xE4A8, 0x1686,
+ 0xE4A9, 0xE4A9, 0x162E, 0xE4AA, 0xE4FE, 0x168D, 0xE5A1, 0xE5AD, 0x16E2,
+ 0xE5AE, 0xE5AE, 0x16F2, 0xE5AF, 0xE5B0, 0x16EF, 0xE5B1, 0xE5B2, 0x1149,
+ 0xE5B3, 0xE5B8, 0x16F1, 0xE5B9, 0xE5B9, 0x114B, 0xE5BA, 0xE5BA, 0x16F7,
+ 0xE5BB, 0xE5BC, 0x114D, 0xE5BD, 0xE5C3, 0x16F8, 0xE5C4, 0xE5C4, 0x114F,
+ 0xE5C5, 0xE5CD, 0x16FF, 0xE5CE, 0xE5CE, 0x1153, 0xE5CF, 0xE5CF, 0x1708,
+ 0xE5D0, 0xE5D0, 0x1154, 0xE5D1, 0xE5D1, 0x1709, 0xE5D2, 0xE5D2, 0x1155,
+ 0xE5D3, 0xE5D5, 0x170A, 0xE5D6, 0xE5D6, 0x1157, 0xE5D7, 0xE5F9, 0x170D,
+ 0xE5FA, 0xE5FB, 0x115A, 0xE5FC, 0xE5FC, 0x103F, 0xE5FD, 0xE5FD, 0x1730,
+ 0xE5FE, 0xE5FE, 0x115C, 0xE6A1, 0xE6A1, 0x115F, 0xE6A2, 0xE6A3, 0x1731,
+ 0xE6A4, 0xE6A4, 0x1161, 0xE6A5, 0xE6A6, 0x1733, 0xE6A7, 0xE6A7, 0x1162,
+ 0xE6A8, 0xE6AC, 0x1735, 0xE6AD, 0xE6AD, 0x1165, 0xE6AE, 0xE6AE, 0x173A,
+ 0xE6AF, 0xE6B1, 0x1167, 0xE6B2, 0xE6B2, 0x173B, 0xE6B3, 0xE6B3, 0x116A,
+ 0xE6B4, 0xE6B6, 0x173C, 0xE6B7, 0xE6B8, 0x116B, 0xE6B9, 0xE6BB, 0x173F,
+ 0xE6BC, 0xE6BC, 0x116F, 0xE6BD, 0xE6C3, 0x1742, 0xE6C4, 0xE6C4, 0x1040,
+ 0xE6C5, 0xE6C5, 0x1749, 0xE6C6, 0xE6C7, 0x1171, 0xE6C8, 0xE6C9, 0x174A,
+ 0xE6CA, 0xE6CA, 0x1041, 0xE6CB, 0xE6D1, 0x174C, 0xE6D2, 0xE6D2, 0x1174,
+ 0xE6D3, 0xE6D5, 0x1753, 0xE6D6, 0xE6D6, 0x1175, 0xE6D7, 0xE6D8, 0x1756,
+ 0xE6D9, 0xE6D9, 0x1176, 0xE6DA, 0xE6DB, 0x1758, 0xE6DC, 0xE6DC, 0x1042,
+ 0xE6DD, 0xE6DE, 0x175A, 0xE6DF, 0xE6DF, 0x1177, 0xE6E0, 0xE6E0, 0x175C,
+ 0xE6E1, 0xE6E1, 0x1178, 0xE6E2, 0xE6E3, 0x175D, 0xE6E4, 0xE6E4, 0x117A,
+ 0xE6E5, 0xE6E5, 0x1179, 0xE6E6, 0xE6E6, 0x117B, 0xE6E7, 0xE6E7, 0x175F,
+ 0xE6E8, 0xE6E8, 0x117C, 0xE6E9, 0xE6E9, 0x1760, 0xE6EA, 0xE6EB, 0x117E,
+ 0xE6EC, 0xE6EC, 0x192F, 0xE6ED, 0xE6EE, 0x1761, 0xE6EF, 0xE6EF, 0x1181,
+ 0xE6F0, 0xE6F0, 0x1763, 0xE6F1, 0xE6F1, 0x1182, 0xE6F2, 0xE6F2, 0x1554,
+ 0xE6F3, 0xE6F4, 0x1764, 0xE6F5, 0xE6F5, 0x1183, 0xE6F6, 0xE6F6, 0x1043,
+ 0xE6F7, 0xE6F7, 0x1046, 0xE6F8, 0xE6F8, 0x1766, 0xE6F9, 0xE6F9, 0x1185,
+ 0xE6FA, 0xE6FE, 0x1767, 0xE7A1, 0xE7A1, 0x1187, 0xE7A2, 0xE7A5, 0x176C,
+ 0xE7A6, 0xE7A6, 0x1188, 0xE7A7, 0xE7A8, 0x1770, 0xE7A9, 0xE7A9, 0x1189,
+ 0xE7AA, 0xE7AA, 0x118B, 0xE7AB, 0xE7AB, 0x1772, 0xE7AC, 0xE7AC, 0x1047,
+ 0xE7AD, 0xE7AD, 0x118D, 0xE7AE, 0xE7AF, 0x1773, 0xE7B0, 0xE7B0, 0x118E,
+ 0xE7B1, 0xE7BE, 0x1775, 0xE7BF, 0xE7BF, 0x118F, 0xE7C0, 0xE7C0, 0x1783,
+ 0xE7C1, 0xE7C1, 0x1E67, 0xE7C2, 0xE7C5, 0x1784, 0xE7C6, 0xE7C6, 0x1191,
+ 0xE7C7, 0xE7C7, 0x1193, 0xE7C8, 0xE7CA, 0x1788, 0xE7CB, 0xE7CB, 0x1195,
+ 0xE7CC, 0xE7CC, 0x178B, 0xE7CD, 0xE7CD, 0x1196, 0xE7CE, 0xE7CE, 0x178C,
+ 0xE7CF, 0xE7D0, 0x1197, 0xE7D1, 0xE7D2, 0x178D, 0xE7D3, 0xE7D3, 0x119A,
+ 0xE7D4, 0xE7DE, 0x178F, 0xE7DF, 0xE7DF, 0x119C, 0xE7E0, 0xE7E3, 0x179A,
+ 0xE7E4, 0xE7E4, 0x119D, 0xE7E5, 0xE7E5, 0x179E, 0xE7E6, 0xE7E6, 0x119E,
+ 0xE7E7, 0xE7F6, 0x179F, 0xE7F7, 0xE7F7, 0x16A5, 0xE7F8, 0xE7FE, 0x17AF,
+ 0xE8A1, 0xE8E6, 0x17B6, 0xE8E7, 0xE8E8, 0x11C7, 0xE8E9, 0xE8EF, 0x17FC,
+ 0xE8F0, 0xE8F0, 0x11C9, 0xE8F1, 0xE8F1, 0x1054, 0xE8F2, 0xE8F6, 0x1803,
+ 0xE8F7, 0xE8F7, 0x11CB, 0xE8F8, 0xE8F8, 0x1808, 0xE8F9, 0xE8F9, 0x16A8,
+ 0xE8FA, 0xE8FA, 0x1809, 0xE8FB, 0xE8FB, 0x11CC, 0xE8FC, 0xE8FD, 0x180A,
+ 0xE8FE, 0xE8FE, 0x11CD, 0xE9A1, 0xE9A6, 0x180C, 0xE9A7, 0xE9A7, 0x11D0,
+ 0xE9A8, 0xE9AB, 0x1812, 0xE9AC, 0xE9AC, 0x11D1, 0xE9AD, 0xE9CB, 0x1816,
+ 0xE9CC, 0xE9CC, 0x11D3, 0xE9CD, 0xE9F6, 0x1835, 0xE9F7, 0xE9F7, 0x1F34,
+ 0xE9F8, 0xE9FE, 0x185F, 0xEAA1, 0xEAC0, 0x1866, 0xEAC1, 0xEAC1, 0x17EB,
+ 0xEAC2, 0xEAE4, 0x1886, 0xEAE5, 0xEAE5, 0x11E1, 0xEAE6, 0xEAF3, 0x18A9,
+ 0xEAF4, 0xEAF4, 0x1057, 0xEAF5, 0xEAF6, 0x18B7, 0xEAF7, 0xEAF7, 0x11E3,
+ 0xEAF8, 0xEAFB, 0x18B9, 0xEAFC, 0xEAFC, 0x11E5, 0xEAFD, 0xEAFD, 0x18BD,
+ 0xEAFE, 0xEAFE, 0x11E6, 0xEBA1, 0xEBA3, 0x18BE, 0xEBA4, 0xEBA4, 0x11E8,
+ 0xEBA5, 0xEBA6, 0x18C1, 0xEBA7, 0xEBA7, 0x11EA, 0xEBA8, 0xEBA8, 0x18C3,
+ 0xEBA9, 0xEBA9, 0x11EC, 0xEBAA, 0xEBAA, 0x1058, 0xEBAB, 0xEBB9, 0x18C4,
+ 0xEBBA, 0xEBBB, 0x11EE, 0xEBBC, 0xEBBC, 0x18D3, 0xEBBD, 0xEBBD, 0x11F0,
+ 0xEBBE, 0xEBC0, 0x18D4, 0xEBC1, 0xEBC1, 0x11F1, 0xEBC2, 0xEBC2, 0x11F3,
+ 0xEBC3, 0xEBC5, 0x18D7, 0xEBC6, 0xEBC7, 0x11F4, 0xEBC8, 0xEBCB, 0x18DA,
+ 0xEBCC, 0xEBCC, 0x11F7, 0xEBCD, 0xEBCE, 0x18DE, 0xEBCF, 0xEBD1, 0x11F8,
+ 0xEBD2, 0xEBD2, 0x15B0, 0xEBD3, 0xEBD7, 0x18E0, 0xEBD8, 0xEBD8, 0x11FB,
+ 0xEBD9, 0xEBFE, 0x18E5, 0xECA1, 0xECA5, 0x190B, 0xECA6, 0xECA6, 0x1206,
+ 0xECA7, 0xECA7, 0x1208, 0xECA8, 0xECA9, 0x1910, 0xECAA, 0xECAA, 0x120A,
+ 0xECAB, 0xECAE, 0x1912, 0xECAF, 0xECAF, 0x173E, 0xECB0, 0xECB1, 0x120C,
+ 0xECB2, 0xECB2, 0x105B, 0xECB3, 0xECB4, 0x1916, 0xECB5, 0xECB5, 0x1211,
+ 0xECB6, 0xECB7, 0x1918, 0xECB8, 0xECB8, 0x1213, 0xECB9, 0xECB9, 0x191A,
+ 0xECBA, 0xECBA, 0x1215, 0xECBB, 0xECBF, 0x191B, 0xECC0, 0xECC1, 0x1218,
+ 0xECC2, 0xECC4, 0x1920, 0xECC5, 0xECC5, 0x121A, 0xECC6, 0xECC6, 0x121C,
+ 0xECC7, 0xECC8, 0x1923, 0xECC9, 0xECCA, 0x105C, 0xECCB, 0xECD4, 0x1925,
+ 0xECD5, 0xECD5, 0x121E, 0xECD6, 0xECDC, 0x192F, 0xECDD, 0xECDE, 0x1220,
+ 0xECDF, 0xECE0, 0x1936, 0xECE1, 0xECE1, 0x1222, 0xECE2, 0xECE3, 0x1938,
+ 0xECE4, 0xECE4, 0x1224, 0xECE5, 0xECE6, 0x193A, 0xECE7, 0xECE8, 0x1225,
+ 0xECE9, 0xECF6, 0x193C, 0xECF7, 0xECF8, 0x1227, 0xECF9, 0xECF9, 0x194A,
+ 0xECFA, 0xECFA, 0x122A, 0xECFB, 0xECFE, 0x194B, 0xEDA1, 0xEDA3, 0x122D,
+ 0xEDA4, 0xEDED, 0x194F, 0xEDEE, 0xEDEE, 0x14E7, 0xEDEF, 0xEDFE, 0x1999,
+ 0xEEA1, 0xEEDA, 0x19A9, 0xEEDB, 0xEEDB, 0x195E, 0xEEDC, 0xEEFE, 0x19E3,
+ 0xEFA1, 0xEFFE, 0x1A06, 0xF0A1, 0xF0FE, 0x1A64, 0xF1A1, 0xF1FE, 0x1AC2,
+ 0xF2A1, 0xF2BC, 0x1B20, 0xF2BD, 0xF2BD, 0x1663, 0xF2BE, 0xF2F9, 0x1B3C,
+ 0xF2FA, 0xF2FA, 0x168B, 0xF2FB, 0xF2FE, 0x1B78, 0xF3A1, 0xF3B0, 0x1B7C,
+ 0xF3B1, 0xF3B1, 0x105F, 0xF3B2, 0xF3FE, 0x1B8C, 0xF4A1, 0xF4A6, 0x1BD9,
+ 0xF4A7, 0xF4A7, 0x1954, 0xF4A8, 0xF4ED, 0x1BDF, 0xF4EE, 0xF4EE, 0x1A1C,
+ 0xF4EF, 0xF4FE, 0x1C25, 0xF5A1, 0xF5FE, 0x1C35, 0xF6A1, 0xF6F3, 0x1C93,
+ 0xF6F4, 0xF6F4, 0x10B7, 0xF6F5, 0xF6F5, 0x1CE6, 0xF6F6, 0xF6F6, 0x1BE3,
+ 0xF6F7, 0xF6FE, 0x1CE7, 0xF7A1, 0xF7B7, 0x1CEF, 0xF7B8, 0xF7B8, 0x1097,
+ 0xF7B9, 0xF7C7, 0x1D06, 0xF7C8, 0xF7C8, 0x10AA, 0xF7C9, 0xF7D2, 0x1D15,
+ 0xF7D3, 0xF7D3, 0x10F4, 0xF7D4, 0xF7FE, 0x1D1F, 0xF8A1, 0xF8DA, 0x1D4A,
+ 0xF8DB, 0xF8DB, 0x1D94, 0xF8DC, 0xF8EF, 0x1D84, 0xF8F0, 0xF8F0, 0x13E0,
+ 0xF8F1, 0xF8FE, 0x1D98, 0xF9A1, 0xF9FE, 0x1DA6, 0xFAA1, 0xFAA1, 0x1E1D,
+ 0xFAA2, 0xFAA2, 0x0DE6, 0xFAA3, 0xFAE5, 0x1E04, 0xFAE6, 0xFAE6, 0x0E3C,
+ 0xFAE7, 0xFAFE, 0x1E47, 0xFBA1, 0xFBFE, 0x1E5F, 0xFCA1, 0xFCA8, 0x1EBD,
+ 0xFCA9, 0xFCA9, 0x0EE7, 0xFCAA, 0xFCFE, 0x1EC5, 0xFDA1, 0xFDFE, 0x1F1A,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/Korea1/KSCms-UHC-H_1.cpp b/core/src/fpdfapi/fpdf_cmaps/Korea1/KSCms-UHC-H_1.cpp
index 6464f2f5e9..af28a4d523 100644
--- a/core/src/fpdfapi/fpdf_cmaps/Korea1/KSCms-UHC-H_1.cpp
+++ b/core/src/fpdfapi/fpdf_cmaps/Korea1/KSCms-UHC-H_1.cpp
@@ -1,233 +1,233 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-extern const unsigned short g_FXCMAP_KSCms_UHC_H_1[675 * 3] = {
- 0x0020, 0x007E, 0x0001, 0x8141, 0x815A, 0x2475, 0x8161, 0x817A, 0x248F,
- 0x8181, 0x81FE, 0x24A9, 0x8241, 0x825A, 0x2527, 0x8261, 0x827A, 0x2541,
- 0x8281, 0x82FE, 0x255B, 0x8341, 0x835A, 0x25D9, 0x8361, 0x837A, 0x25F3,
- 0x8381, 0x83FE, 0x260D, 0x8441, 0x845A, 0x268B, 0x8461, 0x847A, 0x26A5,
- 0x8481, 0x84FE, 0x26BF, 0x8541, 0x855A, 0x273D, 0x8561, 0x857A, 0x2757,
- 0x8581, 0x85FE, 0x2771, 0x8641, 0x865A, 0x27EF, 0x8661, 0x867A, 0x2809,
- 0x8681, 0x86FE, 0x2823, 0x8741, 0x875A, 0x28A1, 0x8761, 0x877A, 0x28BB,
- 0x8781, 0x87FE, 0x28D5, 0x8841, 0x885A, 0x2953, 0x8861, 0x887A, 0x296D,
- 0x8881, 0x88FE, 0x2987, 0x8941, 0x895A, 0x2A05, 0x8961, 0x897A, 0x2A1F,
- 0x8981, 0x89FE, 0x2A39, 0x8A41, 0x8A5A, 0x2AB7, 0x8A61, 0x8A7A, 0x2AD1,
- 0x8A81, 0x8AFE, 0x2AEB, 0x8B41, 0x8B5A, 0x2B69, 0x8B61, 0x8B7A, 0x2B83,
- 0x8B81, 0x8BFE, 0x2B9D, 0x8C41, 0x8C5A, 0x2C1B, 0x8C61, 0x8C7A, 0x2C35,
- 0x8C81, 0x8CFE, 0x2C4F, 0x8D41, 0x8D5A, 0x2CCD, 0x8D61, 0x8D7A, 0x2CE7,
- 0x8D81, 0x8DFE, 0x2D01, 0x8E41, 0x8E5A, 0x2D7F, 0x8E61, 0x8E7A, 0x2D99,
- 0x8E81, 0x8EFE, 0x2DB3, 0x8F41, 0x8F5A, 0x2E31, 0x8F61, 0x8F7A, 0x2E4B,
- 0x8F81, 0x8FFE, 0x2E65, 0x9041, 0x905A, 0x2EE3, 0x9061, 0x907A, 0x2EFD,
- 0x9081, 0x90FE, 0x2F17, 0x9141, 0x915A, 0x2F95, 0x9161, 0x917A, 0x2FAF,
- 0x9181, 0x91FE, 0x2FC9, 0x9241, 0x925A, 0x3047, 0x9261, 0x927A, 0x3061,
- 0x9281, 0x92FE, 0x307B, 0x9341, 0x935A, 0x30F9, 0x9361, 0x937A, 0x3113,
- 0x9381, 0x93FE, 0x312D, 0x9441, 0x945A, 0x31AB, 0x9461, 0x947A, 0x31C5,
- 0x9481, 0x94FE, 0x31DF, 0x9541, 0x955A, 0x325D, 0x9561, 0x957A, 0x3277,
- 0x9581, 0x95FE, 0x3291, 0x9641, 0x965A, 0x330F, 0x9661, 0x967A, 0x3329,
- 0x9681, 0x96FE, 0x3343, 0x9741, 0x975A, 0x33C1, 0x9761, 0x977A, 0x33DB,
- 0x9781, 0x97FE, 0x33F5, 0x9841, 0x985A, 0x3473, 0x9861, 0x987A, 0x348D,
- 0x9881, 0x98FE, 0x34A7, 0x9941, 0x995A, 0x3525, 0x9961, 0x997A, 0x353F,
- 0x9981, 0x99FE, 0x3559, 0x9A41, 0x9A5A, 0x35D7, 0x9A61, 0x9A7A, 0x35F1,
- 0x9A81, 0x9AFE, 0x360B, 0x9B41, 0x9B5A, 0x3689, 0x9B61, 0x9B7A, 0x36A3,
- 0x9B81, 0x9BFE, 0x36BD, 0x9C41, 0x9C5A, 0x373B, 0x9C61, 0x9C7A, 0x3755,
- 0x9C81, 0x9CFE, 0x376F, 0x9D41, 0x9D5A, 0x37ED, 0x9D61, 0x9D7A, 0x3807,
- 0x9D81, 0x9DFE, 0x3821, 0x9E41, 0x9E5A, 0x389F, 0x9E61, 0x9E7A, 0x38B9,
- 0x9E81, 0x9EFE, 0x38D3, 0x9F41, 0x9F5A, 0x3951, 0x9F61, 0x9F7A, 0x396B,
- 0x9F81, 0x9FFE, 0x3985, 0xA041, 0xA05A, 0x3A03, 0xA061, 0xA07A, 0x3A1D,
- 0xA081, 0xA0FE, 0x3A37, 0xA141, 0xA15A, 0x3AB5, 0xA161, 0xA17A, 0x3ACF,
- 0xA181, 0xA1A0, 0x3AE9, 0xA1A1, 0xA1FE, 0x0065, 0xA241, 0xA25A, 0x3B09,
- 0xA261, 0xA27A, 0x3B23, 0xA281, 0xA2A0, 0x3B3D, 0xA2A1, 0xA2E5, 0x00C3,
- 0xA341, 0xA35A, 0x3B5D, 0xA361, 0xA37A, 0x3B77, 0xA381, 0xA3A0, 0x3B91,
- 0xA3A1, 0xA3FE, 0x0108, 0xA441, 0xA45A, 0x3BB1, 0xA461, 0xA47A, 0x3BCB,
- 0xA481, 0xA4A0, 0x3BE5, 0xA4A1, 0xA4D3, 0x0166, 0xA4D5, 0xA4FE, 0x0199,
- 0xA541, 0xA55A, 0x3C05, 0xA561, 0xA57A, 0x3C1F, 0xA581, 0xA5A0, 0x3C39,
- 0xA5A1, 0xA5AA, 0x01C3, 0xA5B0, 0xA5B9, 0x01CD, 0xA5C1, 0xA5D8, 0x01D7,
- 0xA5E1, 0xA5F8, 0x01EF, 0xA641, 0xA65A, 0x3C59, 0xA661, 0xA67A, 0x3C73,
- 0xA681, 0xA6A0, 0x3C8D, 0xA6A1, 0xA6E4, 0x0207, 0xA741, 0xA75A, 0x3CAD,
- 0xA761, 0xA77A, 0x3CC7, 0xA781, 0xA7A0, 0x3CE1, 0xA7A1, 0xA7EF, 0x024B,
- 0xA841, 0xA85A, 0x3D01, 0xA861, 0xA87A, 0x3D1B, 0xA881, 0xA8A0, 0x3D35,
- 0xA8A1, 0xA8A4, 0x029A, 0xA8A6, 0xA8A6, 0x029E, 0xA8A8, 0xA8AF, 0x029F,
- 0xA8B1, 0xA8FE, 0x02A7, 0xA941, 0xA95A, 0x3D55, 0xA961, 0xA97A, 0x3D6F,
- 0xA981, 0xA9A0, 0x3D89, 0xA9A1, 0xA9FE, 0x02F5, 0xAA41, 0xAA5A, 0x3DA9,
- 0xAA61, 0xAA7A, 0x3DC3, 0xAA81, 0xAAA0, 0x3DDD, 0xAAA1, 0xAAF3, 0x0353,
- 0xAB41, 0xAB5A, 0x3DFD, 0xAB61, 0xAB7A, 0x3E17, 0xAB81, 0xABA0, 0x3E31,
- 0xABA1, 0xABF6, 0x03A6, 0xAC41, 0xAC5A, 0x3E51, 0xAC61, 0xAC7A, 0x3E6B,
- 0xAC81, 0xACA0, 0x3E85, 0xACA1, 0xACC1, 0x03FC, 0xACD1, 0xACF1, 0x041D,
- 0xAD41, 0xAD5A, 0x3EA5, 0xAD61, 0xAD7A, 0x3EBF, 0xAD81, 0xADA0, 0x3ED9,
- 0xAE41, 0xAE5A, 0x3EF9, 0xAE61, 0xAE7A, 0x3F13, 0xAE81, 0xAEA0, 0x3F2D,
- 0xAF41, 0xAF5A, 0x3F4D, 0xAF61, 0xAF7A, 0x3F67, 0xAF81, 0xAFA0, 0x3F81,
- 0xB041, 0xB05A, 0x3FA1, 0xB061, 0xB07A, 0x3FBB, 0xB081, 0xB0A0, 0x3FD5,
- 0xB0A1, 0xB0FE, 0x043E, 0xB141, 0xB15A, 0x3FF5, 0xB161, 0xB17A, 0x400F,
- 0xB181, 0xB1A0, 0x4029, 0xB1A1, 0xB1FE, 0x049C, 0xB241, 0xB25A, 0x4049,
- 0xB261, 0xB27A, 0x4063, 0xB281, 0xB2A0, 0x407D, 0xB2A1, 0xB2FE, 0x04FA,
- 0xB341, 0xB35A, 0x409D, 0xB361, 0xB37A, 0x40B7, 0xB381, 0xB3A0, 0x40D1,
- 0xB3A1, 0xB3FE, 0x0558, 0xB441, 0xB45A, 0x40F1, 0xB461, 0xB47A, 0x410B,
- 0xB481, 0xB4A0, 0x4125, 0xB4A1, 0xB4FE, 0x05B6, 0xB541, 0xB55A, 0x4145,
- 0xB561, 0xB57A, 0x415F, 0xB581, 0xB5A0, 0x4179, 0xB5A1, 0xB5FE, 0x0614,
- 0xB641, 0xB65A, 0x4199, 0xB661, 0xB67A, 0x41B3, 0xB681, 0xB6A0, 0x41CD,
- 0xB6A1, 0xB6FE, 0x0672, 0xB741, 0xB75A, 0x41ED, 0xB761, 0xB77A, 0x4207,
- 0xB781, 0xB7A0, 0x4221, 0xB7A1, 0xB7FE, 0x06D0, 0xB841, 0xB85A, 0x4241,
- 0xB861, 0xB87A, 0x425B, 0xB881, 0xB8A0, 0x4275, 0xB8A1, 0xB8FE, 0x072E,
- 0xB941, 0xB95A, 0x4295, 0xB961, 0xB97A, 0x42AF, 0xB981, 0xB9A0, 0x42C9,
- 0xB9A1, 0xB9FE, 0x078C, 0xBA41, 0xBA5A, 0x42E9, 0xBA61, 0xBA7A, 0x4303,
- 0xBA81, 0xBAA0, 0x431D, 0xBAA1, 0xBAFE, 0x07EA, 0xBB41, 0xBB5A, 0x433D,
- 0xBB61, 0xBB7A, 0x4357, 0xBB81, 0xBBA0, 0x4371, 0xBBA1, 0xBBFE, 0x0848,
- 0xBC41, 0xBC5A, 0x4391, 0xBC61, 0xBC7A, 0x43AB, 0xBC81, 0xBCA0, 0x43C5,
- 0xBCA1, 0xBCFE, 0x08A6, 0xBD41, 0xBD5A, 0x43E5, 0xBD61, 0xBD7A, 0x43FF,
- 0xBD81, 0xBDA0, 0x4419, 0xBDA1, 0xBDFE, 0x0904, 0xBE41, 0xBE5A, 0x4439,
- 0xBE61, 0xBE7A, 0x4453, 0xBE81, 0xBEA0, 0x446D, 0xBEA1, 0xBEFE, 0x0962,
- 0xBF41, 0xBF5A, 0x448D, 0xBF61, 0xBF7A, 0x44A7, 0xBF81, 0xBFA0, 0x44C1,
- 0xBFA1, 0xBFFE, 0x09C0, 0xC041, 0xC05A, 0x44E1, 0xC061, 0xC07A, 0x44FB,
- 0xC081, 0xC0A0, 0x4515, 0xC0A1, 0xC0FE, 0x0A1E, 0xC141, 0xC15A, 0x4535,
- 0xC161, 0xC17A, 0x454F, 0xC181, 0xC1A0, 0x4569, 0xC1A1, 0xC1FE, 0x0A7C,
- 0xC241, 0xC25A, 0x4589, 0xC261, 0xC27A, 0x45A3, 0xC281, 0xC2A0, 0x45BD,
- 0xC2A1, 0xC2FE, 0x0ADA, 0xC341, 0xC35A, 0x45DD, 0xC361, 0xC37A, 0x45F7,
- 0xC381, 0xC3A0, 0x4611, 0xC3A1, 0xC3FE, 0x0B38, 0xC441, 0xC45A, 0x4631,
- 0xC461, 0xC47A, 0x464B, 0xC481, 0xC4A0, 0x4665, 0xC4A1, 0xC4FE, 0x0B96,
- 0xC541, 0xC55A, 0x4685, 0xC561, 0xC57A, 0x469F, 0xC581, 0xC5A0, 0x46B9,
- 0xC5A1, 0xC5FE, 0x0BF4, 0xC641, 0xC652, 0x46D9, 0xC6A1, 0xC6FE, 0x0C52,
- 0xC7A1, 0xC7FE, 0x0CB0, 0xC8A1, 0xC8FE, 0x0D0E, 0xCAA1, 0xCAFE, 0x0D6C,
- 0xCBA1, 0xCBCF, 0x0DCA, 0xCBD0, 0xCBD0, 0x1014, 0xCBD1, 0xCBD5, 0x0DF9,
- 0xCBD6, 0xCBD6, 0x0E5E, 0xCBD7, 0xCBE6, 0x0DFE, 0xCBE7, 0xCBE7, 0x1B8D,
- 0xCBE8, 0xCBFE, 0x0E0E, 0xCCA1, 0xCCFE, 0x0E25, 0xCDA1, 0xCDCE, 0x0E83,
- 0xCDCF, 0xCDCF, 0x0D84, 0xCDD0, 0xCDE7, 0x0EB1, 0xCDE8, 0xCDE8, 0x1EDC,
- 0xCDE9, 0xCDFE, 0x0EC9, 0xCEA1, 0xCEAC, 0x0EDF, 0xCEAD, 0xCEAD, 0x0EDA,
- 0xCEAE, 0xCEFE, 0x0EEB, 0xCFA1, 0xCFFA, 0x0F3C, 0xCFFB, 0xCFFB, 0x0F3E,
- 0xCFFC, 0xCFFE, 0x0F96, 0xD0A1, 0xD0A1, 0x0F99, 0xD0A2, 0xD0A2, 0x0F6A,
- 0xD0A3, 0xD0B7, 0x0F9A, 0xD0B8, 0xD0B8, 0x0F6A, 0xD0B9, 0xD0CF, 0x0FAF,
- 0xD0D0, 0xD0D0, 0x0E7C, 0xD0D1, 0xD0DC, 0x0FC6, 0xD0DD, 0xD0DD, 0x1023,
- 0xD0DE, 0xD0FE, 0x0FD2, 0xD1A1, 0xD1D3, 0x0FF3, 0xD1D4, 0xD1D4, 0x1116,
- 0xD1D5, 0xD1D5, 0x103C, 0xD1D6, 0xD1D7, 0x1026, 0xD1D8, 0xD1D8, 0x1117,
- 0xD1D9, 0xD1DA, 0x1028, 0xD1DB, 0xD1E0, 0x1118, 0xD1E1, 0xD1E1, 0x102A,
- 0xD1E2, 0xD1E2, 0x16A8, 0xD1E3, 0xD1E5, 0x111E, 0xD1E6, 0xD1E6, 0x1122,
- 0xD1E7, 0xD1E7, 0x102B, 0xD1E8, 0xD1EB, 0x1123, 0xD1EC, 0xD1EC, 0x102C,
- 0xD1ED, 0xD1ED, 0x1127, 0xD1EE, 0xD1EE, 0x102D, 0xD1EF, 0xD1F0, 0x112A,
- 0xD1F1, 0xD1F1, 0x102E, 0xD1F2, 0xD1F2, 0x112C, 0xD1F3, 0xD1F5, 0x102F,
- 0xD1F6, 0xD1F6, 0x112F, 0xD1F7, 0xD1F9, 0x1032, 0xD1FA, 0xD1FA, 0x1133,
- 0xD1FB, 0xD1FB, 0x1035, 0xD1FC, 0xD1FD, 0x1136, 0xD1FE, 0xD1FE, 0x1139,
- 0xD2A1, 0xD2A1, 0x1036, 0xD2A2, 0xD2A3, 0x113A, 0xD2A4, 0xD2A6, 0x1037,
- 0xD2A7, 0xD2AA, 0x113C, 0xD2AB, 0xD2AB, 0x1143, 0xD2AC, 0xD2AC, 0x103A,
- 0xD2AD, 0xD2AD, 0x1144, 0xD2AE, 0xD2B1, 0x103B, 0xD2B2, 0xD2B2, 0x1148,
- 0xD2B3, 0xD2BD, 0x103F, 0xD2BE, 0xD2BE, 0x119F, 0xD2BF, 0xD2C1, 0x104A,
- 0xD2C2, 0xD2C3, 0x11A1, 0xD2C4, 0xD2C4, 0x11A5, 0xD2C5, 0xD2C5, 0x104D,
- 0xD2C6, 0xD2CA, 0x11A6, 0xD2CB, 0xD2CB, 0x11AC, 0xD2CC, 0xD2CC, 0x104E,
- 0xD2CD, 0xD2CE, 0x11AD, 0xD2CF, 0xD2D4, 0x11B0, 0xD2D5, 0xD2D7, 0x11B7,
- 0xD2D8, 0xD2D8, 0x104F, 0xD2D9, 0xD2DA, 0x11BD, 0xD2DB, 0xD2DD, 0x1050,
- 0xD2DE, 0xD2DF, 0x11C1, 0xD2E0, 0xD2E0, 0x1053, 0xD2E1, 0xD2E1, 0x11C3,
- 0xD2E2, 0xD2E2, 0x11C6, 0xD2E3, 0xD2E3, 0x1054, 0xD2E4, 0xD2E4, 0x11D4,
- 0xD2E5, 0xD2E8, 0x11D6, 0xD2E9, 0xD2EA, 0x11DB, 0xD2EB, 0xD2EB, 0x11E0,
- 0xD2EC, 0xD2EF, 0x1055, 0xD2F0, 0xD2F3, 0x11FC, 0xD2F4, 0xD2F5, 0x1201,
- 0xD2F6, 0xD2F6, 0x1059, 0xD2F7, 0xD2F8, 0x1203, 0xD2F9, 0xD2FE, 0x105A,
- 0xD3A1, 0xD3FE, 0x1060, 0xD4A1, 0xD4E5, 0x10BE, 0xD4E6, 0xD4E6, 0x10DE,
- 0xD4E7, 0xD4FB, 0x1103, 0xD4FC, 0xD4FC, 0x1028, 0xD4FD, 0xD4FE, 0x1118,
- 0xD5A1, 0xD5A4, 0x111A, 0xD5A5, 0xD5A5, 0x16A8, 0xD5A6, 0xD5AA, 0x111E,
- 0xD5AB, 0xD5AB, 0x102B, 0xD5AC, 0xD5AD, 0x1123, 0xD5AE, 0xD5AE, 0x1060,
- 0xD5AF, 0xD5FE, 0x1125, 0xD6A1, 0xD6B7, 0x1175, 0xD6B8, 0xD6B8, 0x1047,
- 0xD6B9, 0xD6CC, 0x118C, 0xD6CD, 0xD6CD, 0x104C, 0xD6CE, 0xD6FE, 0x11A0,
- 0xD7A1, 0xD7CA, 0x11D1, 0xD7CB, 0xD7CB, 0x15B0, 0xD7CC, 0xD7E3, 0x11FB,
- 0xD7E4, 0xD7E4, 0x1918, 0xD7E5, 0xD7FE, 0x1213, 0xD8A1, 0xD8FE, 0x122D,
- 0xD9A1, 0xD9FE, 0x128B, 0xDAA1, 0xDAFE, 0x12E9, 0xDBA1, 0xDBC4, 0x1347,
- 0xDBC5, 0xDBC5, 0x141F, 0xDBC6, 0xDBE3, 0x136B, 0xDBE4, 0xDBE4, 0x133A,
- 0xDBE5, 0xDBFE, 0x1389, 0xDCA1, 0xDCA4, 0x13A3, 0xDCA5, 0xDCA5, 0x1D5E,
- 0xDCA6, 0xDCFE, 0x13A7, 0xDDA1, 0xDDA4, 0x1400, 0xDDA5, 0xDDA5, 0x13D7,
- 0xDDA6, 0xDDD4, 0x1404, 0xDDD5, 0xDDD5, 0x13F5, 0xDDD6, 0xDDF3, 0x1433,
- 0xDDF4, 0xDDF4, 0x1DB7, 0xDDF5, 0xDDFE, 0x1451, 0xDEA1, 0xDEFB, 0x145B,
- 0xDEFC, 0xDEFC, 0x15D0, 0xDEFD, 0xDEFD, 0x14B6, 0xDEFE, 0xDEFE, 0x14F7,
- 0xDFA1, 0xDFB2, 0x14B7, 0xDFB3, 0xDFB3, 0x1BAB, 0xDFB4, 0xDFE0, 0x14C9,
- 0xDFE1, 0xDFE1, 0x14F2, 0xDFE2, 0xDFE7, 0x14F6, 0xDFE8, 0xDFE8, 0x156D,
- 0xDFE9, 0xDFFE, 0x14FC, 0xE0A1, 0xE0F0, 0x1512, 0xE0F1, 0xE0F1, 0x1771,
- 0xE0F2, 0xE0FE, 0x1562, 0xE1A1, 0xE1AC, 0x156F, 0xE1AD, 0xE1AD, 0x1554,
- 0xE1AE, 0xE1EC, 0x157B, 0xE1ED, 0xE1ED, 0x14C5, 0xE1EE, 0xE1FE, 0x15BA,
- 0xE2A1, 0xE2FE, 0x15CB, 0xE3A1, 0xE3F4, 0x1629, 0xE3F5, 0xE3F5, 0x1B61,
- 0xE3F6, 0xE3FE, 0x167D, 0xE4A1, 0xE4A1, 0x1CCA, 0xE4A2, 0xE4A8, 0x1686,
- 0xE4A9, 0xE4A9, 0x162E, 0xE4AA, 0xE4FE, 0x168D, 0xE5A1, 0xE5AD, 0x16E2,
- 0xE5AE, 0xE5AE, 0x16F2, 0xE5AF, 0xE5B0, 0x16EF, 0xE5B1, 0xE5B2, 0x1149,
- 0xE5B3, 0xE5B8, 0x16F1, 0xE5B9, 0xE5B9, 0x114B, 0xE5BA, 0xE5BA, 0x16F7,
- 0xE5BB, 0xE5BC, 0x114D, 0xE5BD, 0xE5C3, 0x16F8, 0xE5C4, 0xE5C4, 0x114F,
- 0xE5C5, 0xE5CD, 0x16FF, 0xE5CE, 0xE5CE, 0x1153, 0xE5CF, 0xE5CF, 0x1708,
- 0xE5D0, 0xE5D0, 0x1154, 0xE5D1, 0xE5D1, 0x1709, 0xE5D2, 0xE5D2, 0x1155,
- 0xE5D3, 0xE5D5, 0x170A, 0xE5D6, 0xE5D6, 0x1157, 0xE5D7, 0xE5F9, 0x170D,
- 0xE5FA, 0xE5FB, 0x115A, 0xE5FC, 0xE5FC, 0x103F, 0xE5FD, 0xE5FD, 0x1730,
- 0xE5FE, 0xE5FE, 0x115C, 0xE6A1, 0xE6A1, 0x115F, 0xE6A2, 0xE6A3, 0x1731,
- 0xE6A4, 0xE6A4, 0x1161, 0xE6A5, 0xE6A6, 0x1733, 0xE6A7, 0xE6A7, 0x1162,
- 0xE6A8, 0xE6AC, 0x1735, 0xE6AD, 0xE6AD, 0x1165, 0xE6AE, 0xE6AE, 0x173A,
- 0xE6AF, 0xE6B1, 0x1167, 0xE6B2, 0xE6B2, 0x173B, 0xE6B3, 0xE6B3, 0x116A,
- 0xE6B4, 0xE6B6, 0x173C, 0xE6B7, 0xE6B8, 0x116B, 0xE6B9, 0xE6BB, 0x173F,
- 0xE6BC, 0xE6BC, 0x116F, 0xE6BD, 0xE6C3, 0x1742, 0xE6C4, 0xE6C4, 0x1040,
- 0xE6C5, 0xE6C5, 0x1749, 0xE6C6, 0xE6C7, 0x1171, 0xE6C8, 0xE6C9, 0x174A,
- 0xE6CA, 0xE6CA, 0x1041, 0xE6CB, 0xE6D1, 0x174C, 0xE6D2, 0xE6D2, 0x1174,
- 0xE6D3, 0xE6D5, 0x1753, 0xE6D6, 0xE6D6, 0x1175, 0xE6D7, 0xE6D8, 0x1756,
- 0xE6D9, 0xE6D9, 0x1176, 0xE6DA, 0xE6DB, 0x1758, 0xE6DC, 0xE6DC, 0x1042,
- 0xE6DD, 0xE6DE, 0x175A, 0xE6DF, 0xE6DF, 0x1177, 0xE6E0, 0xE6E0, 0x175C,
- 0xE6E1, 0xE6E1, 0x1178, 0xE6E2, 0xE6E3, 0x175D, 0xE6E4, 0xE6E4, 0x117A,
- 0xE6E5, 0xE6E5, 0x1179, 0xE6E6, 0xE6E6, 0x117B, 0xE6E7, 0xE6E7, 0x175F,
- 0xE6E8, 0xE6E8, 0x117C, 0xE6E9, 0xE6E9, 0x1760, 0xE6EA, 0xE6EB, 0x117E,
- 0xE6EC, 0xE6EC, 0x192F, 0xE6ED, 0xE6EE, 0x1761, 0xE6EF, 0xE6EF, 0x1181,
- 0xE6F0, 0xE6F0, 0x1763, 0xE6F1, 0xE6F1, 0x1182, 0xE6F2, 0xE6F2, 0x1554,
- 0xE6F3, 0xE6F4, 0x1764, 0xE6F5, 0xE6F5, 0x1183, 0xE6F6, 0xE6F6, 0x1043,
- 0xE6F7, 0xE6F7, 0x1046, 0xE6F8, 0xE6F8, 0x1766, 0xE6F9, 0xE6F9, 0x1185,
- 0xE6FA, 0xE6FE, 0x1767, 0xE7A1, 0xE7A1, 0x1187, 0xE7A2, 0xE7A5, 0x176C,
- 0xE7A6, 0xE7A6, 0x1188, 0xE7A7, 0xE7A8, 0x1770, 0xE7A9, 0xE7A9, 0x1189,
- 0xE7AA, 0xE7AA, 0x118B, 0xE7AB, 0xE7AB, 0x1772, 0xE7AC, 0xE7AC, 0x1047,
- 0xE7AD, 0xE7AD, 0x118D, 0xE7AE, 0xE7AF, 0x1773, 0xE7B0, 0xE7B0, 0x118E,
- 0xE7B1, 0xE7BE, 0x1775, 0xE7BF, 0xE7BF, 0x118F, 0xE7C0, 0xE7C0, 0x1783,
- 0xE7C1, 0xE7C1, 0x1E67, 0xE7C2, 0xE7C5, 0x1784, 0xE7C6, 0xE7C6, 0x1191,
- 0xE7C7, 0xE7C7, 0x1193, 0xE7C8, 0xE7CA, 0x1788, 0xE7CB, 0xE7CB, 0x1195,
- 0xE7CC, 0xE7CC, 0x178B, 0xE7CD, 0xE7CD, 0x1196, 0xE7CE, 0xE7CE, 0x178C,
- 0xE7CF, 0xE7D0, 0x1197, 0xE7D1, 0xE7D2, 0x178D, 0xE7D3, 0xE7D3, 0x119A,
- 0xE7D4, 0xE7DE, 0x178F, 0xE7DF, 0xE7DF, 0x119C, 0xE7E0, 0xE7E3, 0x179A,
- 0xE7E4, 0xE7E4, 0x119D, 0xE7E5, 0xE7E5, 0x179E, 0xE7E6, 0xE7E6, 0x119E,
- 0xE7E7, 0xE7F6, 0x179F, 0xE7F7, 0xE7F7, 0x16A5, 0xE7F8, 0xE7FE, 0x17AF,
- 0xE8A1, 0xE8E6, 0x17B6, 0xE8E7, 0xE8E8, 0x11C7, 0xE8E9, 0xE8EF, 0x17FC,
- 0xE8F0, 0xE8F0, 0x11C9, 0xE8F1, 0xE8F1, 0x1054, 0xE8F2, 0xE8F6, 0x1803,
- 0xE8F7, 0xE8F7, 0x11CB, 0xE8F8, 0xE8F8, 0x1808, 0xE8F9, 0xE8F9, 0x16A8,
- 0xE8FA, 0xE8FA, 0x1809, 0xE8FB, 0xE8FB, 0x11CC, 0xE8FC, 0xE8FD, 0x180A,
- 0xE8FE, 0xE8FE, 0x11CD, 0xE9A1, 0xE9A6, 0x180C, 0xE9A7, 0xE9A7, 0x11D0,
- 0xE9A8, 0xE9AB, 0x1812, 0xE9AC, 0xE9AC, 0x11D1, 0xE9AD, 0xE9CB, 0x1816,
- 0xE9CC, 0xE9CC, 0x11D3, 0xE9CD, 0xE9F6, 0x1835, 0xE9F7, 0xE9F7, 0x1F34,
- 0xE9F8, 0xE9FE, 0x185F, 0xEAA1, 0xEAC0, 0x1866, 0xEAC1, 0xEAC1, 0x17EB,
- 0xEAC2, 0xEAE4, 0x1886, 0xEAE5, 0xEAE5, 0x11E1, 0xEAE6, 0xEAF3, 0x18A9,
- 0xEAF4, 0xEAF4, 0x1057, 0xEAF5, 0xEAF6, 0x18B7, 0xEAF7, 0xEAF7, 0x11E3,
- 0xEAF8, 0xEAFB, 0x18B9, 0xEAFC, 0xEAFC, 0x11E5, 0xEAFD, 0xEAFD, 0x18BD,
- 0xEAFE, 0xEAFE, 0x11E6, 0xEBA1, 0xEBA3, 0x18BE, 0xEBA4, 0xEBA4, 0x11E8,
- 0xEBA5, 0xEBA6, 0x18C1, 0xEBA7, 0xEBA7, 0x11EA, 0xEBA8, 0xEBA8, 0x18C3,
- 0xEBA9, 0xEBA9, 0x11EC, 0xEBAA, 0xEBAA, 0x1058, 0xEBAB, 0xEBB9, 0x18C4,
- 0xEBBA, 0xEBBB, 0x11EE, 0xEBBC, 0xEBBC, 0x18D3, 0xEBBD, 0xEBBD, 0x11F0,
- 0xEBBE, 0xEBC0, 0x18D4, 0xEBC1, 0xEBC1, 0x11F1, 0xEBC2, 0xEBC2, 0x11F3,
- 0xEBC3, 0xEBC5, 0x18D7, 0xEBC6, 0xEBC7, 0x11F4, 0xEBC8, 0xEBCB, 0x18DA,
- 0xEBCC, 0xEBCC, 0x11F7, 0xEBCD, 0xEBCE, 0x18DE, 0xEBCF, 0xEBD1, 0x11F8,
- 0xEBD2, 0xEBD2, 0x15B0, 0xEBD3, 0xEBD7, 0x18E0, 0xEBD8, 0xEBD8, 0x11FB,
- 0xEBD9, 0xEBFE, 0x18E5, 0xECA1, 0xECA5, 0x190B, 0xECA6, 0xECA6, 0x1206,
- 0xECA7, 0xECA7, 0x1208, 0xECA8, 0xECA9, 0x1910, 0xECAA, 0xECAA, 0x120A,
- 0xECAB, 0xECAE, 0x1912, 0xECAF, 0xECAF, 0x173E, 0xECB0, 0xECB1, 0x120C,
- 0xECB2, 0xECB2, 0x105B, 0xECB3, 0xECB4, 0x1916, 0xECB5, 0xECB5, 0x1211,
- 0xECB6, 0xECB7, 0x1918, 0xECB8, 0xECB8, 0x1213, 0xECB9, 0xECB9, 0x191A,
- 0xECBA, 0xECBA, 0x1215, 0xECBB, 0xECBF, 0x191B, 0xECC0, 0xECC1, 0x1218,
- 0xECC2, 0xECC4, 0x1920, 0xECC5, 0xECC5, 0x121A, 0xECC6, 0xECC6, 0x121C,
- 0xECC7, 0xECC8, 0x1923, 0xECC9, 0xECCA, 0x105C, 0xECCB, 0xECD4, 0x1925,
- 0xECD5, 0xECD5, 0x121E, 0xECD6, 0xECDC, 0x192F, 0xECDD, 0xECDE, 0x1220,
- 0xECDF, 0xECE0, 0x1936, 0xECE1, 0xECE1, 0x1222, 0xECE2, 0xECE3, 0x1938,
- 0xECE4, 0xECE4, 0x1224, 0xECE5, 0xECE6, 0x193A, 0xECE7, 0xECE8, 0x1225,
- 0xECE9, 0xECF6, 0x193C, 0xECF7, 0xECF8, 0x1227, 0xECF9, 0xECF9, 0x194A,
- 0xECFA, 0xECFA, 0x122A, 0xECFB, 0xECFE, 0x194B, 0xEDA1, 0xEDA3, 0x122D,
- 0xEDA4, 0xEDED, 0x194F, 0xEDEE, 0xEDEE, 0x14E7, 0xEDEF, 0xEDFE, 0x1999,
- 0xEEA1, 0xEEDA, 0x19A9, 0xEEDB, 0xEEDB, 0x195E, 0xEEDC, 0xEEFE, 0x19E3,
- 0xEFA1, 0xEFFE, 0x1A06, 0xF0A1, 0xF0FE, 0x1A64, 0xF1A1, 0xF1FE, 0x1AC2,
- 0xF2A1, 0xF2BC, 0x1B20, 0xF2BD, 0xF2BD, 0x1663, 0xF2BE, 0xF2F9, 0x1B3C,
- 0xF2FA, 0xF2FA, 0x168B, 0xF2FB, 0xF2FE, 0x1B78, 0xF3A1, 0xF3B0, 0x1B7C,
- 0xF3B1, 0xF3B1, 0x105F, 0xF3B2, 0xF3FE, 0x1B8C, 0xF4A1, 0xF4A6, 0x1BD9,
- 0xF4A7, 0xF4A7, 0x1954, 0xF4A8, 0xF4ED, 0x1BDF, 0xF4EE, 0xF4EE, 0x1A1C,
- 0xF4EF, 0xF4FE, 0x1C25, 0xF5A1, 0xF5FE, 0x1C35, 0xF6A1, 0xF6F3, 0x1C93,
- 0xF6F4, 0xF6F4, 0x10B7, 0xF6F5, 0xF6F5, 0x1CE6, 0xF6F6, 0xF6F6, 0x1BE3,
- 0xF6F7, 0xF6FE, 0x1CE7, 0xF7A1, 0xF7B7, 0x1CEF, 0xF7B8, 0xF7B8, 0x1097,
- 0xF7B9, 0xF7C7, 0x1D06, 0xF7C8, 0xF7C8, 0x10AA, 0xF7C9, 0xF7D2, 0x1D15,
- 0xF7D3, 0xF7D3, 0x10F4, 0xF7D4, 0xF7FE, 0x1D1F, 0xF8A1, 0xF8DA, 0x1D4A,
- 0xF8DB, 0xF8DB, 0x1D94, 0xF8DC, 0xF8EF, 0x1D84, 0xF8F0, 0xF8F0, 0x13E0,
- 0xF8F1, 0xF8FE, 0x1D98, 0xF9A1, 0xF9FE, 0x1DA6, 0xFAA1, 0xFAA1, 0x1E1D,
- 0xFAA2, 0xFAA2, 0x0DE6, 0xFAA3, 0xFAE5, 0x1E04, 0xFAE6, 0xFAE6, 0x0E3C,
- 0xFAE7, 0xFAFE, 0x1E47, 0xFBA1, 0xFBFE, 0x1E5F, 0xFCA1, 0xFCA8, 0x1EBD,
- 0xFCA9, 0xFCA9, 0x0EE7, 0xFCAA, 0xFCFE, 0x1EC5, 0xFDA1, 0xFDFE, 0x1F1A,
-};
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_KSCms_UHC_H_1[675 * 3] = {
+ 0x0020, 0x007E, 0x0001, 0x8141, 0x815A, 0x2475, 0x8161, 0x817A, 0x248F,
+ 0x8181, 0x81FE, 0x24A9, 0x8241, 0x825A, 0x2527, 0x8261, 0x827A, 0x2541,
+ 0x8281, 0x82FE, 0x255B, 0x8341, 0x835A, 0x25D9, 0x8361, 0x837A, 0x25F3,
+ 0x8381, 0x83FE, 0x260D, 0x8441, 0x845A, 0x268B, 0x8461, 0x847A, 0x26A5,
+ 0x8481, 0x84FE, 0x26BF, 0x8541, 0x855A, 0x273D, 0x8561, 0x857A, 0x2757,
+ 0x8581, 0x85FE, 0x2771, 0x8641, 0x865A, 0x27EF, 0x8661, 0x867A, 0x2809,
+ 0x8681, 0x86FE, 0x2823, 0x8741, 0x875A, 0x28A1, 0x8761, 0x877A, 0x28BB,
+ 0x8781, 0x87FE, 0x28D5, 0x8841, 0x885A, 0x2953, 0x8861, 0x887A, 0x296D,
+ 0x8881, 0x88FE, 0x2987, 0x8941, 0x895A, 0x2A05, 0x8961, 0x897A, 0x2A1F,
+ 0x8981, 0x89FE, 0x2A39, 0x8A41, 0x8A5A, 0x2AB7, 0x8A61, 0x8A7A, 0x2AD1,
+ 0x8A81, 0x8AFE, 0x2AEB, 0x8B41, 0x8B5A, 0x2B69, 0x8B61, 0x8B7A, 0x2B83,
+ 0x8B81, 0x8BFE, 0x2B9D, 0x8C41, 0x8C5A, 0x2C1B, 0x8C61, 0x8C7A, 0x2C35,
+ 0x8C81, 0x8CFE, 0x2C4F, 0x8D41, 0x8D5A, 0x2CCD, 0x8D61, 0x8D7A, 0x2CE7,
+ 0x8D81, 0x8DFE, 0x2D01, 0x8E41, 0x8E5A, 0x2D7F, 0x8E61, 0x8E7A, 0x2D99,
+ 0x8E81, 0x8EFE, 0x2DB3, 0x8F41, 0x8F5A, 0x2E31, 0x8F61, 0x8F7A, 0x2E4B,
+ 0x8F81, 0x8FFE, 0x2E65, 0x9041, 0x905A, 0x2EE3, 0x9061, 0x907A, 0x2EFD,
+ 0x9081, 0x90FE, 0x2F17, 0x9141, 0x915A, 0x2F95, 0x9161, 0x917A, 0x2FAF,
+ 0x9181, 0x91FE, 0x2FC9, 0x9241, 0x925A, 0x3047, 0x9261, 0x927A, 0x3061,
+ 0x9281, 0x92FE, 0x307B, 0x9341, 0x935A, 0x30F9, 0x9361, 0x937A, 0x3113,
+ 0x9381, 0x93FE, 0x312D, 0x9441, 0x945A, 0x31AB, 0x9461, 0x947A, 0x31C5,
+ 0x9481, 0x94FE, 0x31DF, 0x9541, 0x955A, 0x325D, 0x9561, 0x957A, 0x3277,
+ 0x9581, 0x95FE, 0x3291, 0x9641, 0x965A, 0x330F, 0x9661, 0x967A, 0x3329,
+ 0x9681, 0x96FE, 0x3343, 0x9741, 0x975A, 0x33C1, 0x9761, 0x977A, 0x33DB,
+ 0x9781, 0x97FE, 0x33F5, 0x9841, 0x985A, 0x3473, 0x9861, 0x987A, 0x348D,
+ 0x9881, 0x98FE, 0x34A7, 0x9941, 0x995A, 0x3525, 0x9961, 0x997A, 0x353F,
+ 0x9981, 0x99FE, 0x3559, 0x9A41, 0x9A5A, 0x35D7, 0x9A61, 0x9A7A, 0x35F1,
+ 0x9A81, 0x9AFE, 0x360B, 0x9B41, 0x9B5A, 0x3689, 0x9B61, 0x9B7A, 0x36A3,
+ 0x9B81, 0x9BFE, 0x36BD, 0x9C41, 0x9C5A, 0x373B, 0x9C61, 0x9C7A, 0x3755,
+ 0x9C81, 0x9CFE, 0x376F, 0x9D41, 0x9D5A, 0x37ED, 0x9D61, 0x9D7A, 0x3807,
+ 0x9D81, 0x9DFE, 0x3821, 0x9E41, 0x9E5A, 0x389F, 0x9E61, 0x9E7A, 0x38B9,
+ 0x9E81, 0x9EFE, 0x38D3, 0x9F41, 0x9F5A, 0x3951, 0x9F61, 0x9F7A, 0x396B,
+ 0x9F81, 0x9FFE, 0x3985, 0xA041, 0xA05A, 0x3A03, 0xA061, 0xA07A, 0x3A1D,
+ 0xA081, 0xA0FE, 0x3A37, 0xA141, 0xA15A, 0x3AB5, 0xA161, 0xA17A, 0x3ACF,
+ 0xA181, 0xA1A0, 0x3AE9, 0xA1A1, 0xA1FE, 0x0065, 0xA241, 0xA25A, 0x3B09,
+ 0xA261, 0xA27A, 0x3B23, 0xA281, 0xA2A0, 0x3B3D, 0xA2A1, 0xA2E5, 0x00C3,
+ 0xA341, 0xA35A, 0x3B5D, 0xA361, 0xA37A, 0x3B77, 0xA381, 0xA3A0, 0x3B91,
+ 0xA3A1, 0xA3FE, 0x0108, 0xA441, 0xA45A, 0x3BB1, 0xA461, 0xA47A, 0x3BCB,
+ 0xA481, 0xA4A0, 0x3BE5, 0xA4A1, 0xA4D3, 0x0166, 0xA4D5, 0xA4FE, 0x0199,
+ 0xA541, 0xA55A, 0x3C05, 0xA561, 0xA57A, 0x3C1F, 0xA581, 0xA5A0, 0x3C39,
+ 0xA5A1, 0xA5AA, 0x01C3, 0xA5B0, 0xA5B9, 0x01CD, 0xA5C1, 0xA5D8, 0x01D7,
+ 0xA5E1, 0xA5F8, 0x01EF, 0xA641, 0xA65A, 0x3C59, 0xA661, 0xA67A, 0x3C73,
+ 0xA681, 0xA6A0, 0x3C8D, 0xA6A1, 0xA6E4, 0x0207, 0xA741, 0xA75A, 0x3CAD,
+ 0xA761, 0xA77A, 0x3CC7, 0xA781, 0xA7A0, 0x3CE1, 0xA7A1, 0xA7EF, 0x024B,
+ 0xA841, 0xA85A, 0x3D01, 0xA861, 0xA87A, 0x3D1B, 0xA881, 0xA8A0, 0x3D35,
+ 0xA8A1, 0xA8A4, 0x029A, 0xA8A6, 0xA8A6, 0x029E, 0xA8A8, 0xA8AF, 0x029F,
+ 0xA8B1, 0xA8FE, 0x02A7, 0xA941, 0xA95A, 0x3D55, 0xA961, 0xA97A, 0x3D6F,
+ 0xA981, 0xA9A0, 0x3D89, 0xA9A1, 0xA9FE, 0x02F5, 0xAA41, 0xAA5A, 0x3DA9,
+ 0xAA61, 0xAA7A, 0x3DC3, 0xAA81, 0xAAA0, 0x3DDD, 0xAAA1, 0xAAF3, 0x0353,
+ 0xAB41, 0xAB5A, 0x3DFD, 0xAB61, 0xAB7A, 0x3E17, 0xAB81, 0xABA0, 0x3E31,
+ 0xABA1, 0xABF6, 0x03A6, 0xAC41, 0xAC5A, 0x3E51, 0xAC61, 0xAC7A, 0x3E6B,
+ 0xAC81, 0xACA0, 0x3E85, 0xACA1, 0xACC1, 0x03FC, 0xACD1, 0xACF1, 0x041D,
+ 0xAD41, 0xAD5A, 0x3EA5, 0xAD61, 0xAD7A, 0x3EBF, 0xAD81, 0xADA0, 0x3ED9,
+ 0xAE41, 0xAE5A, 0x3EF9, 0xAE61, 0xAE7A, 0x3F13, 0xAE81, 0xAEA0, 0x3F2D,
+ 0xAF41, 0xAF5A, 0x3F4D, 0xAF61, 0xAF7A, 0x3F67, 0xAF81, 0xAFA0, 0x3F81,
+ 0xB041, 0xB05A, 0x3FA1, 0xB061, 0xB07A, 0x3FBB, 0xB081, 0xB0A0, 0x3FD5,
+ 0xB0A1, 0xB0FE, 0x043E, 0xB141, 0xB15A, 0x3FF5, 0xB161, 0xB17A, 0x400F,
+ 0xB181, 0xB1A0, 0x4029, 0xB1A1, 0xB1FE, 0x049C, 0xB241, 0xB25A, 0x4049,
+ 0xB261, 0xB27A, 0x4063, 0xB281, 0xB2A0, 0x407D, 0xB2A1, 0xB2FE, 0x04FA,
+ 0xB341, 0xB35A, 0x409D, 0xB361, 0xB37A, 0x40B7, 0xB381, 0xB3A0, 0x40D1,
+ 0xB3A1, 0xB3FE, 0x0558, 0xB441, 0xB45A, 0x40F1, 0xB461, 0xB47A, 0x410B,
+ 0xB481, 0xB4A0, 0x4125, 0xB4A1, 0xB4FE, 0x05B6, 0xB541, 0xB55A, 0x4145,
+ 0xB561, 0xB57A, 0x415F, 0xB581, 0xB5A0, 0x4179, 0xB5A1, 0xB5FE, 0x0614,
+ 0xB641, 0xB65A, 0x4199, 0xB661, 0xB67A, 0x41B3, 0xB681, 0xB6A0, 0x41CD,
+ 0xB6A1, 0xB6FE, 0x0672, 0xB741, 0xB75A, 0x41ED, 0xB761, 0xB77A, 0x4207,
+ 0xB781, 0xB7A0, 0x4221, 0xB7A1, 0xB7FE, 0x06D0, 0xB841, 0xB85A, 0x4241,
+ 0xB861, 0xB87A, 0x425B, 0xB881, 0xB8A0, 0x4275, 0xB8A1, 0xB8FE, 0x072E,
+ 0xB941, 0xB95A, 0x4295, 0xB961, 0xB97A, 0x42AF, 0xB981, 0xB9A0, 0x42C9,
+ 0xB9A1, 0xB9FE, 0x078C, 0xBA41, 0xBA5A, 0x42E9, 0xBA61, 0xBA7A, 0x4303,
+ 0xBA81, 0xBAA0, 0x431D, 0xBAA1, 0xBAFE, 0x07EA, 0xBB41, 0xBB5A, 0x433D,
+ 0xBB61, 0xBB7A, 0x4357, 0xBB81, 0xBBA0, 0x4371, 0xBBA1, 0xBBFE, 0x0848,
+ 0xBC41, 0xBC5A, 0x4391, 0xBC61, 0xBC7A, 0x43AB, 0xBC81, 0xBCA0, 0x43C5,
+ 0xBCA1, 0xBCFE, 0x08A6, 0xBD41, 0xBD5A, 0x43E5, 0xBD61, 0xBD7A, 0x43FF,
+ 0xBD81, 0xBDA0, 0x4419, 0xBDA1, 0xBDFE, 0x0904, 0xBE41, 0xBE5A, 0x4439,
+ 0xBE61, 0xBE7A, 0x4453, 0xBE81, 0xBEA0, 0x446D, 0xBEA1, 0xBEFE, 0x0962,
+ 0xBF41, 0xBF5A, 0x448D, 0xBF61, 0xBF7A, 0x44A7, 0xBF81, 0xBFA0, 0x44C1,
+ 0xBFA1, 0xBFFE, 0x09C0, 0xC041, 0xC05A, 0x44E1, 0xC061, 0xC07A, 0x44FB,
+ 0xC081, 0xC0A0, 0x4515, 0xC0A1, 0xC0FE, 0x0A1E, 0xC141, 0xC15A, 0x4535,
+ 0xC161, 0xC17A, 0x454F, 0xC181, 0xC1A0, 0x4569, 0xC1A1, 0xC1FE, 0x0A7C,
+ 0xC241, 0xC25A, 0x4589, 0xC261, 0xC27A, 0x45A3, 0xC281, 0xC2A0, 0x45BD,
+ 0xC2A1, 0xC2FE, 0x0ADA, 0xC341, 0xC35A, 0x45DD, 0xC361, 0xC37A, 0x45F7,
+ 0xC381, 0xC3A0, 0x4611, 0xC3A1, 0xC3FE, 0x0B38, 0xC441, 0xC45A, 0x4631,
+ 0xC461, 0xC47A, 0x464B, 0xC481, 0xC4A0, 0x4665, 0xC4A1, 0xC4FE, 0x0B96,
+ 0xC541, 0xC55A, 0x4685, 0xC561, 0xC57A, 0x469F, 0xC581, 0xC5A0, 0x46B9,
+ 0xC5A1, 0xC5FE, 0x0BF4, 0xC641, 0xC652, 0x46D9, 0xC6A1, 0xC6FE, 0x0C52,
+ 0xC7A1, 0xC7FE, 0x0CB0, 0xC8A1, 0xC8FE, 0x0D0E, 0xCAA1, 0xCAFE, 0x0D6C,
+ 0xCBA1, 0xCBCF, 0x0DCA, 0xCBD0, 0xCBD0, 0x1014, 0xCBD1, 0xCBD5, 0x0DF9,
+ 0xCBD6, 0xCBD6, 0x0E5E, 0xCBD7, 0xCBE6, 0x0DFE, 0xCBE7, 0xCBE7, 0x1B8D,
+ 0xCBE8, 0xCBFE, 0x0E0E, 0xCCA1, 0xCCFE, 0x0E25, 0xCDA1, 0xCDCE, 0x0E83,
+ 0xCDCF, 0xCDCF, 0x0D84, 0xCDD0, 0xCDE7, 0x0EB1, 0xCDE8, 0xCDE8, 0x1EDC,
+ 0xCDE9, 0xCDFE, 0x0EC9, 0xCEA1, 0xCEAC, 0x0EDF, 0xCEAD, 0xCEAD, 0x0EDA,
+ 0xCEAE, 0xCEFE, 0x0EEB, 0xCFA1, 0xCFFA, 0x0F3C, 0xCFFB, 0xCFFB, 0x0F3E,
+ 0xCFFC, 0xCFFE, 0x0F96, 0xD0A1, 0xD0A1, 0x0F99, 0xD0A2, 0xD0A2, 0x0F6A,
+ 0xD0A3, 0xD0B7, 0x0F9A, 0xD0B8, 0xD0B8, 0x0F6A, 0xD0B9, 0xD0CF, 0x0FAF,
+ 0xD0D0, 0xD0D0, 0x0E7C, 0xD0D1, 0xD0DC, 0x0FC6, 0xD0DD, 0xD0DD, 0x1023,
+ 0xD0DE, 0xD0FE, 0x0FD2, 0xD1A1, 0xD1D3, 0x0FF3, 0xD1D4, 0xD1D4, 0x1116,
+ 0xD1D5, 0xD1D5, 0x103C, 0xD1D6, 0xD1D7, 0x1026, 0xD1D8, 0xD1D8, 0x1117,
+ 0xD1D9, 0xD1DA, 0x1028, 0xD1DB, 0xD1E0, 0x1118, 0xD1E1, 0xD1E1, 0x102A,
+ 0xD1E2, 0xD1E2, 0x16A8, 0xD1E3, 0xD1E5, 0x111E, 0xD1E6, 0xD1E6, 0x1122,
+ 0xD1E7, 0xD1E7, 0x102B, 0xD1E8, 0xD1EB, 0x1123, 0xD1EC, 0xD1EC, 0x102C,
+ 0xD1ED, 0xD1ED, 0x1127, 0xD1EE, 0xD1EE, 0x102D, 0xD1EF, 0xD1F0, 0x112A,
+ 0xD1F1, 0xD1F1, 0x102E, 0xD1F2, 0xD1F2, 0x112C, 0xD1F3, 0xD1F5, 0x102F,
+ 0xD1F6, 0xD1F6, 0x112F, 0xD1F7, 0xD1F9, 0x1032, 0xD1FA, 0xD1FA, 0x1133,
+ 0xD1FB, 0xD1FB, 0x1035, 0xD1FC, 0xD1FD, 0x1136, 0xD1FE, 0xD1FE, 0x1139,
+ 0xD2A1, 0xD2A1, 0x1036, 0xD2A2, 0xD2A3, 0x113A, 0xD2A4, 0xD2A6, 0x1037,
+ 0xD2A7, 0xD2AA, 0x113C, 0xD2AB, 0xD2AB, 0x1143, 0xD2AC, 0xD2AC, 0x103A,
+ 0xD2AD, 0xD2AD, 0x1144, 0xD2AE, 0xD2B1, 0x103B, 0xD2B2, 0xD2B2, 0x1148,
+ 0xD2B3, 0xD2BD, 0x103F, 0xD2BE, 0xD2BE, 0x119F, 0xD2BF, 0xD2C1, 0x104A,
+ 0xD2C2, 0xD2C3, 0x11A1, 0xD2C4, 0xD2C4, 0x11A5, 0xD2C5, 0xD2C5, 0x104D,
+ 0xD2C6, 0xD2CA, 0x11A6, 0xD2CB, 0xD2CB, 0x11AC, 0xD2CC, 0xD2CC, 0x104E,
+ 0xD2CD, 0xD2CE, 0x11AD, 0xD2CF, 0xD2D4, 0x11B0, 0xD2D5, 0xD2D7, 0x11B7,
+ 0xD2D8, 0xD2D8, 0x104F, 0xD2D9, 0xD2DA, 0x11BD, 0xD2DB, 0xD2DD, 0x1050,
+ 0xD2DE, 0xD2DF, 0x11C1, 0xD2E0, 0xD2E0, 0x1053, 0xD2E1, 0xD2E1, 0x11C3,
+ 0xD2E2, 0xD2E2, 0x11C6, 0xD2E3, 0xD2E3, 0x1054, 0xD2E4, 0xD2E4, 0x11D4,
+ 0xD2E5, 0xD2E8, 0x11D6, 0xD2E9, 0xD2EA, 0x11DB, 0xD2EB, 0xD2EB, 0x11E0,
+ 0xD2EC, 0xD2EF, 0x1055, 0xD2F0, 0xD2F3, 0x11FC, 0xD2F4, 0xD2F5, 0x1201,
+ 0xD2F6, 0xD2F6, 0x1059, 0xD2F7, 0xD2F8, 0x1203, 0xD2F9, 0xD2FE, 0x105A,
+ 0xD3A1, 0xD3FE, 0x1060, 0xD4A1, 0xD4E5, 0x10BE, 0xD4E6, 0xD4E6, 0x10DE,
+ 0xD4E7, 0xD4FB, 0x1103, 0xD4FC, 0xD4FC, 0x1028, 0xD4FD, 0xD4FE, 0x1118,
+ 0xD5A1, 0xD5A4, 0x111A, 0xD5A5, 0xD5A5, 0x16A8, 0xD5A6, 0xD5AA, 0x111E,
+ 0xD5AB, 0xD5AB, 0x102B, 0xD5AC, 0xD5AD, 0x1123, 0xD5AE, 0xD5AE, 0x1060,
+ 0xD5AF, 0xD5FE, 0x1125, 0xD6A1, 0xD6B7, 0x1175, 0xD6B8, 0xD6B8, 0x1047,
+ 0xD6B9, 0xD6CC, 0x118C, 0xD6CD, 0xD6CD, 0x104C, 0xD6CE, 0xD6FE, 0x11A0,
+ 0xD7A1, 0xD7CA, 0x11D1, 0xD7CB, 0xD7CB, 0x15B0, 0xD7CC, 0xD7E3, 0x11FB,
+ 0xD7E4, 0xD7E4, 0x1918, 0xD7E5, 0xD7FE, 0x1213, 0xD8A1, 0xD8FE, 0x122D,
+ 0xD9A1, 0xD9FE, 0x128B, 0xDAA1, 0xDAFE, 0x12E9, 0xDBA1, 0xDBC4, 0x1347,
+ 0xDBC5, 0xDBC5, 0x141F, 0xDBC6, 0xDBE3, 0x136B, 0xDBE4, 0xDBE4, 0x133A,
+ 0xDBE5, 0xDBFE, 0x1389, 0xDCA1, 0xDCA4, 0x13A3, 0xDCA5, 0xDCA5, 0x1D5E,
+ 0xDCA6, 0xDCFE, 0x13A7, 0xDDA1, 0xDDA4, 0x1400, 0xDDA5, 0xDDA5, 0x13D7,
+ 0xDDA6, 0xDDD4, 0x1404, 0xDDD5, 0xDDD5, 0x13F5, 0xDDD6, 0xDDF3, 0x1433,
+ 0xDDF4, 0xDDF4, 0x1DB7, 0xDDF5, 0xDDFE, 0x1451, 0xDEA1, 0xDEFB, 0x145B,
+ 0xDEFC, 0xDEFC, 0x15D0, 0xDEFD, 0xDEFD, 0x14B6, 0xDEFE, 0xDEFE, 0x14F7,
+ 0xDFA1, 0xDFB2, 0x14B7, 0xDFB3, 0xDFB3, 0x1BAB, 0xDFB4, 0xDFE0, 0x14C9,
+ 0xDFE1, 0xDFE1, 0x14F2, 0xDFE2, 0xDFE7, 0x14F6, 0xDFE8, 0xDFE8, 0x156D,
+ 0xDFE9, 0xDFFE, 0x14FC, 0xE0A1, 0xE0F0, 0x1512, 0xE0F1, 0xE0F1, 0x1771,
+ 0xE0F2, 0xE0FE, 0x1562, 0xE1A1, 0xE1AC, 0x156F, 0xE1AD, 0xE1AD, 0x1554,
+ 0xE1AE, 0xE1EC, 0x157B, 0xE1ED, 0xE1ED, 0x14C5, 0xE1EE, 0xE1FE, 0x15BA,
+ 0xE2A1, 0xE2FE, 0x15CB, 0xE3A1, 0xE3F4, 0x1629, 0xE3F5, 0xE3F5, 0x1B61,
+ 0xE3F6, 0xE3FE, 0x167D, 0xE4A1, 0xE4A1, 0x1CCA, 0xE4A2, 0xE4A8, 0x1686,
+ 0xE4A9, 0xE4A9, 0x162E, 0xE4AA, 0xE4FE, 0x168D, 0xE5A1, 0xE5AD, 0x16E2,
+ 0xE5AE, 0xE5AE, 0x16F2, 0xE5AF, 0xE5B0, 0x16EF, 0xE5B1, 0xE5B2, 0x1149,
+ 0xE5B3, 0xE5B8, 0x16F1, 0xE5B9, 0xE5B9, 0x114B, 0xE5BA, 0xE5BA, 0x16F7,
+ 0xE5BB, 0xE5BC, 0x114D, 0xE5BD, 0xE5C3, 0x16F8, 0xE5C4, 0xE5C4, 0x114F,
+ 0xE5C5, 0xE5CD, 0x16FF, 0xE5CE, 0xE5CE, 0x1153, 0xE5CF, 0xE5CF, 0x1708,
+ 0xE5D0, 0xE5D0, 0x1154, 0xE5D1, 0xE5D1, 0x1709, 0xE5D2, 0xE5D2, 0x1155,
+ 0xE5D3, 0xE5D5, 0x170A, 0xE5D6, 0xE5D6, 0x1157, 0xE5D7, 0xE5F9, 0x170D,
+ 0xE5FA, 0xE5FB, 0x115A, 0xE5FC, 0xE5FC, 0x103F, 0xE5FD, 0xE5FD, 0x1730,
+ 0xE5FE, 0xE5FE, 0x115C, 0xE6A1, 0xE6A1, 0x115F, 0xE6A2, 0xE6A3, 0x1731,
+ 0xE6A4, 0xE6A4, 0x1161, 0xE6A5, 0xE6A6, 0x1733, 0xE6A7, 0xE6A7, 0x1162,
+ 0xE6A8, 0xE6AC, 0x1735, 0xE6AD, 0xE6AD, 0x1165, 0xE6AE, 0xE6AE, 0x173A,
+ 0xE6AF, 0xE6B1, 0x1167, 0xE6B2, 0xE6B2, 0x173B, 0xE6B3, 0xE6B3, 0x116A,
+ 0xE6B4, 0xE6B6, 0x173C, 0xE6B7, 0xE6B8, 0x116B, 0xE6B9, 0xE6BB, 0x173F,
+ 0xE6BC, 0xE6BC, 0x116F, 0xE6BD, 0xE6C3, 0x1742, 0xE6C4, 0xE6C4, 0x1040,
+ 0xE6C5, 0xE6C5, 0x1749, 0xE6C6, 0xE6C7, 0x1171, 0xE6C8, 0xE6C9, 0x174A,
+ 0xE6CA, 0xE6CA, 0x1041, 0xE6CB, 0xE6D1, 0x174C, 0xE6D2, 0xE6D2, 0x1174,
+ 0xE6D3, 0xE6D5, 0x1753, 0xE6D6, 0xE6D6, 0x1175, 0xE6D7, 0xE6D8, 0x1756,
+ 0xE6D9, 0xE6D9, 0x1176, 0xE6DA, 0xE6DB, 0x1758, 0xE6DC, 0xE6DC, 0x1042,
+ 0xE6DD, 0xE6DE, 0x175A, 0xE6DF, 0xE6DF, 0x1177, 0xE6E0, 0xE6E0, 0x175C,
+ 0xE6E1, 0xE6E1, 0x1178, 0xE6E2, 0xE6E3, 0x175D, 0xE6E4, 0xE6E4, 0x117A,
+ 0xE6E5, 0xE6E5, 0x1179, 0xE6E6, 0xE6E6, 0x117B, 0xE6E7, 0xE6E7, 0x175F,
+ 0xE6E8, 0xE6E8, 0x117C, 0xE6E9, 0xE6E9, 0x1760, 0xE6EA, 0xE6EB, 0x117E,
+ 0xE6EC, 0xE6EC, 0x192F, 0xE6ED, 0xE6EE, 0x1761, 0xE6EF, 0xE6EF, 0x1181,
+ 0xE6F0, 0xE6F0, 0x1763, 0xE6F1, 0xE6F1, 0x1182, 0xE6F2, 0xE6F2, 0x1554,
+ 0xE6F3, 0xE6F4, 0x1764, 0xE6F5, 0xE6F5, 0x1183, 0xE6F6, 0xE6F6, 0x1043,
+ 0xE6F7, 0xE6F7, 0x1046, 0xE6F8, 0xE6F8, 0x1766, 0xE6F9, 0xE6F9, 0x1185,
+ 0xE6FA, 0xE6FE, 0x1767, 0xE7A1, 0xE7A1, 0x1187, 0xE7A2, 0xE7A5, 0x176C,
+ 0xE7A6, 0xE7A6, 0x1188, 0xE7A7, 0xE7A8, 0x1770, 0xE7A9, 0xE7A9, 0x1189,
+ 0xE7AA, 0xE7AA, 0x118B, 0xE7AB, 0xE7AB, 0x1772, 0xE7AC, 0xE7AC, 0x1047,
+ 0xE7AD, 0xE7AD, 0x118D, 0xE7AE, 0xE7AF, 0x1773, 0xE7B0, 0xE7B0, 0x118E,
+ 0xE7B1, 0xE7BE, 0x1775, 0xE7BF, 0xE7BF, 0x118F, 0xE7C0, 0xE7C0, 0x1783,
+ 0xE7C1, 0xE7C1, 0x1E67, 0xE7C2, 0xE7C5, 0x1784, 0xE7C6, 0xE7C6, 0x1191,
+ 0xE7C7, 0xE7C7, 0x1193, 0xE7C8, 0xE7CA, 0x1788, 0xE7CB, 0xE7CB, 0x1195,
+ 0xE7CC, 0xE7CC, 0x178B, 0xE7CD, 0xE7CD, 0x1196, 0xE7CE, 0xE7CE, 0x178C,
+ 0xE7CF, 0xE7D0, 0x1197, 0xE7D1, 0xE7D2, 0x178D, 0xE7D3, 0xE7D3, 0x119A,
+ 0xE7D4, 0xE7DE, 0x178F, 0xE7DF, 0xE7DF, 0x119C, 0xE7E0, 0xE7E3, 0x179A,
+ 0xE7E4, 0xE7E4, 0x119D, 0xE7E5, 0xE7E5, 0x179E, 0xE7E6, 0xE7E6, 0x119E,
+ 0xE7E7, 0xE7F6, 0x179F, 0xE7F7, 0xE7F7, 0x16A5, 0xE7F8, 0xE7FE, 0x17AF,
+ 0xE8A1, 0xE8E6, 0x17B6, 0xE8E7, 0xE8E8, 0x11C7, 0xE8E9, 0xE8EF, 0x17FC,
+ 0xE8F0, 0xE8F0, 0x11C9, 0xE8F1, 0xE8F1, 0x1054, 0xE8F2, 0xE8F6, 0x1803,
+ 0xE8F7, 0xE8F7, 0x11CB, 0xE8F8, 0xE8F8, 0x1808, 0xE8F9, 0xE8F9, 0x16A8,
+ 0xE8FA, 0xE8FA, 0x1809, 0xE8FB, 0xE8FB, 0x11CC, 0xE8FC, 0xE8FD, 0x180A,
+ 0xE8FE, 0xE8FE, 0x11CD, 0xE9A1, 0xE9A6, 0x180C, 0xE9A7, 0xE9A7, 0x11D0,
+ 0xE9A8, 0xE9AB, 0x1812, 0xE9AC, 0xE9AC, 0x11D1, 0xE9AD, 0xE9CB, 0x1816,
+ 0xE9CC, 0xE9CC, 0x11D3, 0xE9CD, 0xE9F6, 0x1835, 0xE9F7, 0xE9F7, 0x1F34,
+ 0xE9F8, 0xE9FE, 0x185F, 0xEAA1, 0xEAC0, 0x1866, 0xEAC1, 0xEAC1, 0x17EB,
+ 0xEAC2, 0xEAE4, 0x1886, 0xEAE5, 0xEAE5, 0x11E1, 0xEAE6, 0xEAF3, 0x18A9,
+ 0xEAF4, 0xEAF4, 0x1057, 0xEAF5, 0xEAF6, 0x18B7, 0xEAF7, 0xEAF7, 0x11E3,
+ 0xEAF8, 0xEAFB, 0x18B9, 0xEAFC, 0xEAFC, 0x11E5, 0xEAFD, 0xEAFD, 0x18BD,
+ 0xEAFE, 0xEAFE, 0x11E6, 0xEBA1, 0xEBA3, 0x18BE, 0xEBA4, 0xEBA4, 0x11E8,
+ 0xEBA5, 0xEBA6, 0x18C1, 0xEBA7, 0xEBA7, 0x11EA, 0xEBA8, 0xEBA8, 0x18C3,
+ 0xEBA9, 0xEBA9, 0x11EC, 0xEBAA, 0xEBAA, 0x1058, 0xEBAB, 0xEBB9, 0x18C4,
+ 0xEBBA, 0xEBBB, 0x11EE, 0xEBBC, 0xEBBC, 0x18D3, 0xEBBD, 0xEBBD, 0x11F0,
+ 0xEBBE, 0xEBC0, 0x18D4, 0xEBC1, 0xEBC1, 0x11F1, 0xEBC2, 0xEBC2, 0x11F3,
+ 0xEBC3, 0xEBC5, 0x18D7, 0xEBC6, 0xEBC7, 0x11F4, 0xEBC8, 0xEBCB, 0x18DA,
+ 0xEBCC, 0xEBCC, 0x11F7, 0xEBCD, 0xEBCE, 0x18DE, 0xEBCF, 0xEBD1, 0x11F8,
+ 0xEBD2, 0xEBD2, 0x15B0, 0xEBD3, 0xEBD7, 0x18E0, 0xEBD8, 0xEBD8, 0x11FB,
+ 0xEBD9, 0xEBFE, 0x18E5, 0xECA1, 0xECA5, 0x190B, 0xECA6, 0xECA6, 0x1206,
+ 0xECA7, 0xECA7, 0x1208, 0xECA8, 0xECA9, 0x1910, 0xECAA, 0xECAA, 0x120A,
+ 0xECAB, 0xECAE, 0x1912, 0xECAF, 0xECAF, 0x173E, 0xECB0, 0xECB1, 0x120C,
+ 0xECB2, 0xECB2, 0x105B, 0xECB3, 0xECB4, 0x1916, 0xECB5, 0xECB5, 0x1211,
+ 0xECB6, 0xECB7, 0x1918, 0xECB8, 0xECB8, 0x1213, 0xECB9, 0xECB9, 0x191A,
+ 0xECBA, 0xECBA, 0x1215, 0xECBB, 0xECBF, 0x191B, 0xECC0, 0xECC1, 0x1218,
+ 0xECC2, 0xECC4, 0x1920, 0xECC5, 0xECC5, 0x121A, 0xECC6, 0xECC6, 0x121C,
+ 0xECC7, 0xECC8, 0x1923, 0xECC9, 0xECCA, 0x105C, 0xECCB, 0xECD4, 0x1925,
+ 0xECD5, 0xECD5, 0x121E, 0xECD6, 0xECDC, 0x192F, 0xECDD, 0xECDE, 0x1220,
+ 0xECDF, 0xECE0, 0x1936, 0xECE1, 0xECE1, 0x1222, 0xECE2, 0xECE3, 0x1938,
+ 0xECE4, 0xECE4, 0x1224, 0xECE5, 0xECE6, 0x193A, 0xECE7, 0xECE8, 0x1225,
+ 0xECE9, 0xECF6, 0x193C, 0xECF7, 0xECF8, 0x1227, 0xECF9, 0xECF9, 0x194A,
+ 0xECFA, 0xECFA, 0x122A, 0xECFB, 0xECFE, 0x194B, 0xEDA1, 0xEDA3, 0x122D,
+ 0xEDA4, 0xEDED, 0x194F, 0xEDEE, 0xEDEE, 0x14E7, 0xEDEF, 0xEDFE, 0x1999,
+ 0xEEA1, 0xEEDA, 0x19A9, 0xEEDB, 0xEEDB, 0x195E, 0xEEDC, 0xEEFE, 0x19E3,
+ 0xEFA1, 0xEFFE, 0x1A06, 0xF0A1, 0xF0FE, 0x1A64, 0xF1A1, 0xF1FE, 0x1AC2,
+ 0xF2A1, 0xF2BC, 0x1B20, 0xF2BD, 0xF2BD, 0x1663, 0xF2BE, 0xF2F9, 0x1B3C,
+ 0xF2FA, 0xF2FA, 0x168B, 0xF2FB, 0xF2FE, 0x1B78, 0xF3A1, 0xF3B0, 0x1B7C,
+ 0xF3B1, 0xF3B1, 0x105F, 0xF3B2, 0xF3FE, 0x1B8C, 0xF4A1, 0xF4A6, 0x1BD9,
+ 0xF4A7, 0xF4A7, 0x1954, 0xF4A8, 0xF4ED, 0x1BDF, 0xF4EE, 0xF4EE, 0x1A1C,
+ 0xF4EF, 0xF4FE, 0x1C25, 0xF5A1, 0xF5FE, 0x1C35, 0xF6A1, 0xF6F3, 0x1C93,
+ 0xF6F4, 0xF6F4, 0x10B7, 0xF6F5, 0xF6F5, 0x1CE6, 0xF6F6, 0xF6F6, 0x1BE3,
+ 0xF6F7, 0xF6FE, 0x1CE7, 0xF7A1, 0xF7B7, 0x1CEF, 0xF7B8, 0xF7B8, 0x1097,
+ 0xF7B9, 0xF7C7, 0x1D06, 0xF7C8, 0xF7C8, 0x10AA, 0xF7C9, 0xF7D2, 0x1D15,
+ 0xF7D3, 0xF7D3, 0x10F4, 0xF7D4, 0xF7FE, 0x1D1F, 0xF8A1, 0xF8DA, 0x1D4A,
+ 0xF8DB, 0xF8DB, 0x1D94, 0xF8DC, 0xF8EF, 0x1D84, 0xF8F0, 0xF8F0, 0x13E0,
+ 0xF8F1, 0xF8FE, 0x1D98, 0xF9A1, 0xF9FE, 0x1DA6, 0xFAA1, 0xFAA1, 0x1E1D,
+ 0xFAA2, 0xFAA2, 0x0DE6, 0xFAA3, 0xFAE5, 0x1E04, 0xFAE6, 0xFAE6, 0x0E3C,
+ 0xFAE7, 0xFAFE, 0x1E47, 0xFBA1, 0xFBFE, 0x1E5F, 0xFCA1, 0xFCA8, 0x1EBD,
+ 0xFCA9, 0xFCA9, 0x0EE7, 0xFCAA, 0xFCFE, 0x1EC5, 0xFDA1, 0xFDFE, 0x1F1A,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/Korea1/KSCpc-EUC-H_0.cpp b/core/src/fpdfapi/fpdf_cmaps/Korea1/KSCpc-EUC-H_0.cpp
index b062fc6316..9cb420d74e 100644
--- a/core/src/fpdfapi/fpdf_cmaps/Korea1/KSCpc-EUC-H_0.cpp
+++ b/core/src/fpdfapi/fpdf_cmaps/Korea1/KSCpc-EUC-H_0.cpp
@@ -1,178 +1,178 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-extern const unsigned short g_FXCMAP_KSCpc_EUC_H_0[509 * 3] = {
- 0x0020, 0x007E, 0x0001, 0x0081, 0x0083, 0x0060, 0x00FE, 0x00FF, 0x0063,
- 0xA141, 0xA17D, 0x1FFF, 0xA181, 0xA19A, 0x203C, 0xA19C, 0xA1A0, 0x2056,
- 0xA1A1, 0xA1A1, 0x0065, 0xA1A2, 0xA1A3, 0x205B, 0xA1A4, 0xA1FE, 0x0068,
- 0xA241, 0xA24C, 0x205D, 0xA2A1, 0xA2E5, 0x00C3, 0xA2E6, 0xA2FE, 0x2069,
- 0xA341, 0xA37D, 0x2082, 0xA381, 0xA39F, 0x20BF, 0xA3A1, 0xA3FE, 0x0108,
- 0xA441, 0xA47D, 0x20DE, 0xA481, 0xA49F, 0x211B, 0xA4A1, 0xA4D3, 0x0166,
- 0xA4D5, 0xA4FE, 0x0199, 0xA541, 0xA57D, 0x213A, 0xA581, 0xA58B, 0x2177,
- 0xA5A1, 0xA5AA, 0x01C3, 0xA5B0, 0xA5B9, 0x01CD, 0xA5C1, 0xA5D8, 0x01D7,
- 0xA5DA, 0xA5DE, 0x2182, 0xA5E1, 0xA5F8, 0x01EF, 0xA5F9, 0xA5FC, 0x2187,
- 0xA641, 0xA67D, 0x218B, 0xA681, 0xA68A, 0x21C8, 0xA68D, 0xA693, 0x21D2,
- 0xA696, 0xA69B, 0x21D9, 0xA69E, 0xA69F, 0x21DF, 0xA6A1, 0xA6E4, 0x0207,
- 0xA6E5, 0xA6FE, 0x21E1, 0xA741, 0xA77D, 0x21FB, 0xA781, 0xA79F, 0x2238,
- 0xA7A1, 0xA7EF, 0x024B, 0xA7F0, 0xA7FE, 0x2257, 0xA841, 0xA87D, 0x2266,
- 0xA881, 0xA89F, 0x22A3, 0xA8A1, 0xA8A4, 0x029A, 0xA8A6, 0xA8A6, 0x029E,
- 0xA8A8, 0xA8AF, 0x029F, 0xA8B1, 0xA8FE, 0x02A7, 0xA941, 0xA974, 0x22C2,
- 0xA9A1, 0xA9FE, 0x02F5, 0xAA41, 0xAA7D, 0x22F6, 0xAA81, 0xAA9F, 0x2333,
- 0xAAA1, 0xAAF3, 0x0353, 0xAAF4, 0xAAFE, 0x2352, 0xAB41, 0xAB7D, 0x235D,
- 0xAB81, 0xAB9F, 0x239A, 0xABA1, 0xABF6, 0x03A6, 0xABF7, 0xABFA, 0x23B9,
- 0xABFB, 0xABFD, 0x2472, 0xAC41, 0xAC7D, 0x23BD, 0xAC81, 0xAC97, 0x23FA,
- 0xACA1, 0xACC1, 0x03FC, 0xACC2, 0xACD0, 0x2411, 0xACD1, 0xACF1, 0x041D,
- 0xACF2, 0xACF6, 0x2420, 0xAD41, 0xAD7D, 0x2425, 0xADA1, 0xADB0, 0x2462,
- 0xB0A1, 0xB0FE, 0x043E, 0xB1A1, 0xB1FE, 0x049C, 0xB2A1, 0xB2FE, 0x04FA,
- 0xB3A1, 0xB3FE, 0x0558, 0xB4A1, 0xB4FE, 0x05B6, 0xB5A1, 0xB5FE, 0x0614,
- 0xB6A1, 0xB6FE, 0x0672, 0xB7A1, 0xB7FE, 0x06D0, 0xB8A1, 0xB8FE, 0x072E,
- 0xB9A1, 0xB9FE, 0x078C, 0xBAA1, 0xBAFE, 0x07EA, 0xBBA1, 0xBBFE, 0x0848,
- 0xBCA1, 0xBCFE, 0x08A6, 0xBDA1, 0xBDFE, 0x0904, 0xBEA1, 0xBEFE, 0x0962,
- 0xBFA1, 0xBFFE, 0x09C0, 0xC0A1, 0xC0FE, 0x0A1E, 0xC1A1, 0xC1FE, 0x0A7C,
- 0xC2A1, 0xC2FE, 0x0ADA, 0xC3A1, 0xC3FE, 0x0B38, 0xC4A1, 0xC4FE, 0x0B96,
- 0xC5A1, 0xC5FE, 0x0BF4, 0xC6A1, 0xC6FE, 0x0C52, 0xC7A1, 0xC7FE, 0x0CB0,
- 0xC8A1, 0xC8FE, 0x0D0E, 0xCAA1, 0xCAFE, 0x0D6C, 0xCBA1, 0xCBCF, 0x0DCA,
- 0xCBD0, 0xCBD0, 0x1014, 0xCBD1, 0xCBD5, 0x0DF9, 0xCBD6, 0xCBD6, 0x0E5E,
- 0xCBD7, 0xCBE6, 0x0DFE, 0xCBE7, 0xCBE7, 0x1B8D, 0xCBE8, 0xCBFE, 0x0E0E,
- 0xCCA1, 0xCCFE, 0x0E25, 0xCDA1, 0xCDCE, 0x0E83, 0xCDCF, 0xCDCF, 0x0D84,
- 0xCDD0, 0xCDE7, 0x0EB1, 0xCDE8, 0xCDE8, 0x1EDC, 0xCDE9, 0xCDFE, 0x0EC9,
- 0xCEA1, 0xCEAC, 0x0EDF, 0xCEAD, 0xCEAD, 0x0EDA, 0xCEAE, 0xCEFE, 0x0EEB,
- 0xCFA1, 0xCFFA, 0x0F3C, 0xCFFB, 0xCFFB, 0x0F3E, 0xCFFC, 0xCFFE, 0x0F96,
- 0xD0A1, 0xD0A1, 0x0F99, 0xD0A2, 0xD0A2, 0x0F6A, 0xD0A3, 0xD0B7, 0x0F9A,
- 0xD0B8, 0xD0B8, 0x0F6A, 0xD0B9, 0xD0CF, 0x0FAF, 0xD0D0, 0xD0D0, 0x0E7C,
- 0xD0D1, 0xD0DC, 0x0FC6, 0xD0DD, 0xD0DD, 0x1023, 0xD0DE, 0xD0FE, 0x0FD2,
- 0xD1A1, 0xD1D3, 0x0FF3, 0xD1D4, 0xD1D4, 0x1116, 0xD1D5, 0xD1D5, 0x103C,
- 0xD1D6, 0xD1D7, 0x1026, 0xD1D8, 0xD1D8, 0x1117, 0xD1D9, 0xD1DA, 0x1028,
- 0xD1DB, 0xD1E0, 0x1118, 0xD1E1, 0xD1E1, 0x102A, 0xD1E2, 0xD1E2, 0x16A8,
- 0xD1E3, 0xD1E5, 0x111E, 0xD1E6, 0xD1E6, 0x1122, 0xD1E7, 0xD1E7, 0x102B,
- 0xD1E8, 0xD1EB, 0x1123, 0xD1EC, 0xD1EC, 0x102C, 0xD1ED, 0xD1ED, 0x1127,
- 0xD1EE, 0xD1EE, 0x102D, 0xD1EF, 0xD1F0, 0x112A, 0xD1F1, 0xD1F1, 0x102E,
- 0xD1F2, 0xD1F2, 0x112C, 0xD1F3, 0xD1F5, 0x102F, 0xD1F6, 0xD1F6, 0x112F,
- 0xD1F7, 0xD1F9, 0x1032, 0xD1FA, 0xD1FA, 0x1133, 0xD1FB, 0xD1FB, 0x1035,
- 0xD1FC, 0xD1FD, 0x1136, 0xD1FE, 0xD1FE, 0x1139, 0xD2A1, 0xD2A1, 0x1036,
- 0xD2A2, 0xD2A3, 0x113A, 0xD2A4, 0xD2A6, 0x1037, 0xD2A7, 0xD2AA, 0x113C,
- 0xD2AB, 0xD2AB, 0x1143, 0xD2AC, 0xD2AC, 0x103A, 0xD2AD, 0xD2AD, 0x1144,
- 0xD2AE, 0xD2B1, 0x103B, 0xD2B2, 0xD2B2, 0x1148, 0xD2B3, 0xD2BD, 0x103F,
- 0xD2BE, 0xD2BE, 0x119F, 0xD2BF, 0xD2C1, 0x104A, 0xD2C2, 0xD2C3, 0x11A1,
- 0xD2C4, 0xD2C4, 0x11A5, 0xD2C5, 0xD2C5, 0x104D, 0xD2C6, 0xD2CA, 0x11A6,
- 0xD2CB, 0xD2CB, 0x11AC, 0xD2CC, 0xD2CC, 0x104E, 0xD2CD, 0xD2CE, 0x11AD,
- 0xD2CF, 0xD2D4, 0x11B0, 0xD2D5, 0xD2D7, 0x11B7, 0xD2D8, 0xD2D8, 0x104F,
- 0xD2D9, 0xD2DA, 0x11BD, 0xD2DB, 0xD2DD, 0x1050, 0xD2DE, 0xD2DF, 0x11C1,
- 0xD2E0, 0xD2E0, 0x1053, 0xD2E1, 0xD2E1, 0x11C3, 0xD2E2, 0xD2E2, 0x11C6,
- 0xD2E3, 0xD2E3, 0x1054, 0xD2E4, 0xD2E4, 0x11D4, 0xD2E5, 0xD2E8, 0x11D6,
- 0xD2E9, 0xD2EA, 0x11DB, 0xD2EB, 0xD2EB, 0x11E0, 0xD2EC, 0xD2EF, 0x1055,
- 0xD2F0, 0xD2F3, 0x11FC, 0xD2F4, 0xD2F5, 0x1201, 0xD2F6, 0xD2F6, 0x1059,
- 0xD2F7, 0xD2F8, 0x1203, 0xD2F9, 0xD2FE, 0x105A, 0xD3A1, 0xD3FE, 0x1060,
- 0xD4A1, 0xD4E5, 0x10BE, 0xD4E6, 0xD4E6, 0x10DE, 0xD4E7, 0xD4FB, 0x1103,
- 0xD4FC, 0xD4FC, 0x1028, 0xD4FD, 0xD4FE, 0x1118, 0xD5A1, 0xD5A4, 0x111A,
- 0xD5A5, 0xD5A5, 0x16A8, 0xD5A6, 0xD5AA, 0x111E, 0xD5AB, 0xD5AB, 0x102B,
- 0xD5AC, 0xD5AD, 0x1123, 0xD5AE, 0xD5AE, 0x1060, 0xD5AF, 0xD5FE, 0x1125,
- 0xD6A1, 0xD6B7, 0x1175, 0xD6B8, 0xD6B8, 0x1047, 0xD6B9, 0xD6CC, 0x118C,
- 0xD6CD, 0xD6CD, 0x104C, 0xD6CE, 0xD6FE, 0x11A0, 0xD7A1, 0xD7CA, 0x11D1,
- 0xD7CB, 0xD7CB, 0x15B0, 0xD7CC, 0xD7E3, 0x11FB, 0xD7E4, 0xD7E4, 0x1918,
- 0xD7E5, 0xD7FE, 0x1213, 0xD8A1, 0xD8FE, 0x122D, 0xD9A1, 0xD9FE, 0x128B,
- 0xDAA1, 0xDAFE, 0x12E9, 0xDBA1, 0xDBC4, 0x1347, 0xDBC5, 0xDBC5, 0x141F,
- 0xDBC6, 0xDBE3, 0x136B, 0xDBE4, 0xDBE4, 0x133A, 0xDBE5, 0xDBFE, 0x1389,
- 0xDCA1, 0xDCA4, 0x13A3, 0xDCA5, 0xDCA5, 0x1D5E, 0xDCA6, 0xDCFE, 0x13A7,
- 0xDDA1, 0xDDA4, 0x1400, 0xDDA5, 0xDDA5, 0x13D7, 0xDDA6, 0xDDD4, 0x1404,
- 0xDDD5, 0xDDD5, 0x13F5, 0xDDD6, 0xDDF3, 0x1433, 0xDDF4, 0xDDF4, 0x1DB7,
- 0xDDF5, 0xDDFE, 0x1451, 0xDEA1, 0xDEFB, 0x145B, 0xDEFC, 0xDEFC, 0x15D0,
- 0xDEFD, 0xDEFD, 0x14B6, 0xDEFE, 0xDEFE, 0x14F7, 0xDFA1, 0xDFB2, 0x14B7,
- 0xDFB3, 0xDFB3, 0x1BAB, 0xDFB4, 0xDFE0, 0x14C9, 0xDFE1, 0xDFE1, 0x14F2,
- 0xDFE2, 0xDFE7, 0x14F6, 0xDFE8, 0xDFE8, 0x156D, 0xDFE9, 0xDFFE, 0x14FC,
- 0xE0A1, 0xE0F0, 0x1512, 0xE0F1, 0xE0F1, 0x1771, 0xE0F2, 0xE0FE, 0x1562,
- 0xE1A1, 0xE1AC, 0x156F, 0xE1AD, 0xE1AD, 0x1554, 0xE1AE, 0xE1EC, 0x157B,
- 0xE1ED, 0xE1ED, 0x14C5, 0xE1EE, 0xE1FE, 0x15BA, 0xE2A1, 0xE2FE, 0x15CB,
- 0xE3A1, 0xE3F4, 0x1629, 0xE3F5, 0xE3F5, 0x1B61, 0xE3F6, 0xE3FE, 0x167D,
- 0xE4A1, 0xE4A1, 0x1CCA, 0xE4A2, 0xE4A8, 0x1686, 0xE4A9, 0xE4A9, 0x162E,
- 0xE4AA, 0xE4FE, 0x168D, 0xE5A1, 0xE5AD, 0x16E2, 0xE5AE, 0xE5AE, 0x16F2,
- 0xE5AF, 0xE5B0, 0x16EF, 0xE5B1, 0xE5B2, 0x1149, 0xE5B3, 0xE5B8, 0x16F1,
- 0xE5B9, 0xE5B9, 0x114B, 0xE5BA, 0xE5BA, 0x16F7, 0xE5BB, 0xE5BC, 0x114D,
- 0xE5BD, 0xE5C3, 0x16F8, 0xE5C4, 0xE5C4, 0x114F, 0xE5C5, 0xE5CD, 0x16FF,
- 0xE5CE, 0xE5CE, 0x1153, 0xE5CF, 0xE5CF, 0x1708, 0xE5D0, 0xE5D0, 0x1154,
- 0xE5D1, 0xE5D1, 0x1709, 0xE5D2, 0xE5D2, 0x1155, 0xE5D3, 0xE5D5, 0x170A,
- 0xE5D6, 0xE5D6, 0x1157, 0xE5D7, 0xE5F9, 0x170D, 0xE5FA, 0xE5FB, 0x115A,
- 0xE5FC, 0xE5FC, 0x103F, 0xE5FD, 0xE5FD, 0x1730, 0xE5FE, 0xE5FE, 0x115C,
- 0xE6A1, 0xE6A1, 0x115F, 0xE6A2, 0xE6A3, 0x1731, 0xE6A4, 0xE6A4, 0x1161,
- 0xE6A5, 0xE6A6, 0x1733, 0xE6A7, 0xE6A7, 0x1162, 0xE6A8, 0xE6AC, 0x1735,
- 0xE6AD, 0xE6AD, 0x1165, 0xE6AE, 0xE6AE, 0x173A, 0xE6AF, 0xE6B1, 0x1167,
- 0xE6B2, 0xE6B2, 0x173B, 0xE6B3, 0xE6B3, 0x116A, 0xE6B4, 0xE6B6, 0x173C,
- 0xE6B7, 0xE6B8, 0x116B, 0xE6B9, 0xE6BB, 0x173F, 0xE6BC, 0xE6BC, 0x116F,
- 0xE6BD, 0xE6C3, 0x1742, 0xE6C4, 0xE6C4, 0x1040, 0xE6C5, 0xE6C5, 0x1749,
- 0xE6C6, 0xE6C7, 0x1171, 0xE6C8, 0xE6C9, 0x174A, 0xE6CA, 0xE6CA, 0x1041,
- 0xE6CB, 0xE6D1, 0x174C, 0xE6D2, 0xE6D2, 0x1174, 0xE6D3, 0xE6D5, 0x1753,
- 0xE6D6, 0xE6D6, 0x1175, 0xE6D7, 0xE6D8, 0x1756, 0xE6D9, 0xE6D9, 0x1176,
- 0xE6DA, 0xE6DB, 0x1758, 0xE6DC, 0xE6DC, 0x1042, 0xE6DD, 0xE6DE, 0x175A,
- 0xE6DF, 0xE6DF, 0x1177, 0xE6E0, 0xE6E0, 0x175C, 0xE6E1, 0xE6E1, 0x1178,
- 0xE6E2, 0xE6E3, 0x175D, 0xE6E4, 0xE6E4, 0x117A, 0xE6E5, 0xE6E5, 0x1179,
- 0xE6E6, 0xE6E6, 0x117B, 0xE6E7, 0xE6E7, 0x175F, 0xE6E8, 0xE6E8, 0x117C,
- 0xE6E9, 0xE6E9, 0x1760, 0xE6EA, 0xE6EB, 0x117E, 0xE6EC, 0xE6EC, 0x192F,
- 0xE6ED, 0xE6EE, 0x1761, 0xE6EF, 0xE6EF, 0x1181, 0xE6F0, 0xE6F0, 0x1763,
- 0xE6F1, 0xE6F1, 0x1182, 0xE6F2, 0xE6F2, 0x1554, 0xE6F3, 0xE6F4, 0x1764,
- 0xE6F5, 0xE6F5, 0x1183, 0xE6F6, 0xE6F6, 0x1043, 0xE6F7, 0xE6F7, 0x1046,
- 0xE6F8, 0xE6F8, 0x1766, 0xE6F9, 0xE6F9, 0x1185, 0xE6FA, 0xE6FE, 0x1767,
- 0xE7A1, 0xE7A1, 0x1187, 0xE7A2, 0xE7A5, 0x176C, 0xE7A6, 0xE7A6, 0x1188,
- 0xE7A7, 0xE7A8, 0x1770, 0xE7A9, 0xE7A9, 0x1189, 0xE7AA, 0xE7AA, 0x118B,
- 0xE7AB, 0xE7AB, 0x1772, 0xE7AC, 0xE7AC, 0x1047, 0xE7AD, 0xE7AD, 0x118D,
- 0xE7AE, 0xE7AF, 0x1773, 0xE7B0, 0xE7B0, 0x118E, 0xE7B1, 0xE7BE, 0x1775,
- 0xE7BF, 0xE7BF, 0x118F, 0xE7C0, 0xE7C0, 0x1783, 0xE7C1, 0xE7C1, 0x1E67,
- 0xE7C2, 0xE7C5, 0x1784, 0xE7C6, 0xE7C6, 0x1191, 0xE7C7, 0xE7C7, 0x1193,
- 0xE7C8, 0xE7CA, 0x1788, 0xE7CB, 0xE7CB, 0x1195, 0xE7CC, 0xE7CC, 0x178B,
- 0xE7CD, 0xE7CD, 0x1196, 0xE7CE, 0xE7CE, 0x178C, 0xE7CF, 0xE7D0, 0x1197,
- 0xE7D1, 0xE7D2, 0x178D, 0xE7D3, 0xE7D3, 0x119A, 0xE7D4, 0xE7DE, 0x178F,
- 0xE7DF, 0xE7DF, 0x119C, 0xE7E0, 0xE7E3, 0x179A, 0xE7E4, 0xE7E4, 0x119D,
- 0xE7E5, 0xE7E5, 0x179E, 0xE7E6, 0xE7E6, 0x119E, 0xE7E7, 0xE7F6, 0x179F,
- 0xE7F7, 0xE7F7, 0x16A5, 0xE7F8, 0xE7FE, 0x17AF, 0xE8A1, 0xE8E6, 0x17B6,
- 0xE8E7, 0xE8E8, 0x11C7, 0xE8E9, 0xE8EF, 0x17FC, 0xE8F0, 0xE8F0, 0x11C9,
- 0xE8F1, 0xE8F1, 0x1054, 0xE8F2, 0xE8F6, 0x1803, 0xE8F7, 0xE8F7, 0x11CB,
- 0xE8F8, 0xE8F8, 0x1808, 0xE8F9, 0xE8F9, 0x16A8, 0xE8FA, 0xE8FA, 0x1809,
- 0xE8FB, 0xE8FB, 0x11CC, 0xE8FC, 0xE8FD, 0x180A, 0xE8FE, 0xE8FE, 0x11CD,
- 0xE9A1, 0xE9A6, 0x180C, 0xE9A7, 0xE9A7, 0x11D0, 0xE9A8, 0xE9AB, 0x1812,
- 0xE9AC, 0xE9AC, 0x11D1, 0xE9AD, 0xE9CB, 0x1816, 0xE9CC, 0xE9CC, 0x11D3,
- 0xE9CD, 0xE9F6, 0x1835, 0xE9F7, 0xE9F7, 0x1F34, 0xE9F8, 0xE9FE, 0x185F,
- 0xEAA1, 0xEAC0, 0x1866, 0xEAC1, 0xEAC1, 0x17EB, 0xEAC2, 0xEAE4, 0x1886,
- 0xEAE5, 0xEAE5, 0x11E1, 0xEAE6, 0xEAF3, 0x18A9, 0xEAF4, 0xEAF4, 0x1057,
- 0xEAF5, 0xEAF6, 0x18B7, 0xEAF7, 0xEAF7, 0x11E3, 0xEAF8, 0xEAFB, 0x18B9,
- 0xEAFC, 0xEAFC, 0x11E5, 0xEAFD, 0xEAFD, 0x18BD, 0xEAFE, 0xEAFE, 0x11E6,
- 0xEBA1, 0xEBA3, 0x18BE, 0xEBA4, 0xEBA4, 0x11E8, 0xEBA5, 0xEBA6, 0x18C1,
- 0xEBA7, 0xEBA7, 0x11EA, 0xEBA8, 0xEBA8, 0x18C3, 0xEBA9, 0xEBA9, 0x11EC,
- 0xEBAA, 0xEBAA, 0x1058, 0xEBAB, 0xEBB9, 0x18C4, 0xEBBA, 0xEBBB, 0x11EE,
- 0xEBBC, 0xEBBC, 0x18D3, 0xEBBD, 0xEBBD, 0x11F0, 0xEBBE, 0xEBC0, 0x18D4,
- 0xEBC1, 0xEBC1, 0x11F1, 0xEBC2, 0xEBC2, 0x11F3, 0xEBC3, 0xEBC5, 0x18D7,
- 0xEBC6, 0xEBC7, 0x11F4, 0xEBC8, 0xEBCB, 0x18DA, 0xEBCC, 0xEBCC, 0x11F7,
- 0xEBCD, 0xEBCE, 0x18DE, 0xEBCF, 0xEBD1, 0x11F8, 0xEBD2, 0xEBD2, 0x15B0,
- 0xEBD3, 0xEBD7, 0x18E0, 0xEBD8, 0xEBD8, 0x11FB, 0xEBD9, 0xEBFE, 0x18E5,
- 0xECA1, 0xECA5, 0x190B, 0xECA6, 0xECA6, 0x1206, 0xECA7, 0xECA7, 0x1208,
- 0xECA8, 0xECA9, 0x1910, 0xECAA, 0xECAA, 0x120A, 0xECAB, 0xECAE, 0x1912,
- 0xECAF, 0xECAF, 0x173E, 0xECB0, 0xECB1, 0x120C, 0xECB2, 0xECB2, 0x105B,
- 0xECB3, 0xECB4, 0x1916, 0xECB5, 0xECB5, 0x1211, 0xECB6, 0xECB7, 0x1918,
- 0xECB8, 0xECB8, 0x1213, 0xECB9, 0xECB9, 0x191A, 0xECBA, 0xECBA, 0x1215,
- 0xECBB, 0xECBF, 0x191B, 0xECC0, 0xECC1, 0x1218, 0xECC2, 0xECC4, 0x1920,
- 0xECC5, 0xECC5, 0x121A, 0xECC6, 0xECC6, 0x121C, 0xECC7, 0xECC8, 0x1923,
- 0xECC9, 0xECCA, 0x105C, 0xECCB, 0xECD4, 0x1925, 0xECD5, 0xECD5, 0x121E,
- 0xECD6, 0xECDC, 0x192F, 0xECDD, 0xECDE, 0x1220, 0xECDF, 0xECE0, 0x1936,
- 0xECE1, 0xECE1, 0x1222, 0xECE2, 0xECE3, 0x1938, 0xECE4, 0xECE4, 0x1224,
- 0xECE5, 0xECE6, 0x193A, 0xECE7, 0xECE8, 0x1225, 0xECE9, 0xECF6, 0x193C,
- 0xECF7, 0xECF8, 0x1227, 0xECF9, 0xECF9, 0x194A, 0xECFA, 0xECFA, 0x122A,
- 0xECFB, 0xECFE, 0x194B, 0xEDA1, 0xEDA3, 0x122D, 0xEDA4, 0xEDED, 0x194F,
- 0xEDEE, 0xEDEE, 0x14E7, 0xEDEF, 0xEDFE, 0x1999, 0xEEA1, 0xEEDA, 0x19A9,
- 0xEEDB, 0xEEDB, 0x195E, 0xEEDC, 0xEEFE, 0x19E3, 0xEFA1, 0xEFFE, 0x1A06,
- 0xF0A1, 0xF0FE, 0x1A64, 0xF1A1, 0xF1FE, 0x1AC2, 0xF2A1, 0xF2BC, 0x1B20,
- 0xF2BD, 0xF2BD, 0x1663, 0xF2BE, 0xF2F9, 0x1B3C, 0xF2FA, 0xF2FA, 0x168B,
- 0xF2FB, 0xF2FE, 0x1B78, 0xF3A1, 0xF3B0, 0x1B7C, 0xF3B1, 0xF3B1, 0x105F,
- 0xF3B2, 0xF3FE, 0x1B8C, 0xF4A1, 0xF4A6, 0x1BD9, 0xF4A7, 0xF4A7, 0x1954,
- 0xF4A8, 0xF4ED, 0x1BDF, 0xF4EE, 0xF4EE, 0x1A1C, 0xF4EF, 0xF4FE, 0x1C25,
- 0xF5A1, 0xF5FE, 0x1C35, 0xF6A1, 0xF6F3, 0x1C93, 0xF6F4, 0xF6F4, 0x10B7,
- 0xF6F5, 0xF6F5, 0x1CE6, 0xF6F6, 0xF6F6, 0x1BE3, 0xF6F7, 0xF6FE, 0x1CE7,
- 0xF7A1, 0xF7B7, 0x1CEF, 0xF7B8, 0xF7B8, 0x1097, 0xF7B9, 0xF7C7, 0x1D06,
- 0xF7C8, 0xF7C8, 0x10AA, 0xF7C9, 0xF7D2, 0x1D15, 0xF7D3, 0xF7D3, 0x10F4,
- 0xF7D4, 0xF7FE, 0x1D1F, 0xF8A1, 0xF8DA, 0x1D4A, 0xF8DB, 0xF8DB, 0x1D94,
- 0xF8DC, 0xF8EF, 0x1D84, 0xF8F0, 0xF8F0, 0x13E0, 0xF8F1, 0xF8FE, 0x1D98,
- 0xF9A1, 0xF9FE, 0x1DA6, 0xFAA1, 0xFAA1, 0x1E1D, 0xFAA2, 0xFAA2, 0x0DE6,
- 0xFAA3, 0xFAE5, 0x1E04, 0xFAE6, 0xFAE6, 0x0E3C, 0xFAE7, 0xFAFE, 0x1E47,
- 0xFBA1, 0xFBFE, 0x1E5F, 0xFCA1, 0xFCA8, 0x1EBD, 0xFCA9, 0xFCA9, 0x0EE7,
- 0xFCAA, 0xFCFE, 0x1EC5, 0xFDA1, 0xFDFE, 0x1F1A,
-};
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_KSCpc_EUC_H_0[509 * 3] = {
+ 0x0020, 0x007E, 0x0001, 0x0081, 0x0083, 0x0060, 0x00FE, 0x00FF, 0x0063,
+ 0xA141, 0xA17D, 0x1FFF, 0xA181, 0xA19A, 0x203C, 0xA19C, 0xA1A0, 0x2056,
+ 0xA1A1, 0xA1A1, 0x0065, 0xA1A2, 0xA1A3, 0x205B, 0xA1A4, 0xA1FE, 0x0068,
+ 0xA241, 0xA24C, 0x205D, 0xA2A1, 0xA2E5, 0x00C3, 0xA2E6, 0xA2FE, 0x2069,
+ 0xA341, 0xA37D, 0x2082, 0xA381, 0xA39F, 0x20BF, 0xA3A1, 0xA3FE, 0x0108,
+ 0xA441, 0xA47D, 0x20DE, 0xA481, 0xA49F, 0x211B, 0xA4A1, 0xA4D3, 0x0166,
+ 0xA4D5, 0xA4FE, 0x0199, 0xA541, 0xA57D, 0x213A, 0xA581, 0xA58B, 0x2177,
+ 0xA5A1, 0xA5AA, 0x01C3, 0xA5B0, 0xA5B9, 0x01CD, 0xA5C1, 0xA5D8, 0x01D7,
+ 0xA5DA, 0xA5DE, 0x2182, 0xA5E1, 0xA5F8, 0x01EF, 0xA5F9, 0xA5FC, 0x2187,
+ 0xA641, 0xA67D, 0x218B, 0xA681, 0xA68A, 0x21C8, 0xA68D, 0xA693, 0x21D2,
+ 0xA696, 0xA69B, 0x21D9, 0xA69E, 0xA69F, 0x21DF, 0xA6A1, 0xA6E4, 0x0207,
+ 0xA6E5, 0xA6FE, 0x21E1, 0xA741, 0xA77D, 0x21FB, 0xA781, 0xA79F, 0x2238,
+ 0xA7A1, 0xA7EF, 0x024B, 0xA7F0, 0xA7FE, 0x2257, 0xA841, 0xA87D, 0x2266,
+ 0xA881, 0xA89F, 0x22A3, 0xA8A1, 0xA8A4, 0x029A, 0xA8A6, 0xA8A6, 0x029E,
+ 0xA8A8, 0xA8AF, 0x029F, 0xA8B1, 0xA8FE, 0x02A7, 0xA941, 0xA974, 0x22C2,
+ 0xA9A1, 0xA9FE, 0x02F5, 0xAA41, 0xAA7D, 0x22F6, 0xAA81, 0xAA9F, 0x2333,
+ 0xAAA1, 0xAAF3, 0x0353, 0xAAF4, 0xAAFE, 0x2352, 0xAB41, 0xAB7D, 0x235D,
+ 0xAB81, 0xAB9F, 0x239A, 0xABA1, 0xABF6, 0x03A6, 0xABF7, 0xABFA, 0x23B9,
+ 0xABFB, 0xABFD, 0x2472, 0xAC41, 0xAC7D, 0x23BD, 0xAC81, 0xAC97, 0x23FA,
+ 0xACA1, 0xACC1, 0x03FC, 0xACC2, 0xACD0, 0x2411, 0xACD1, 0xACF1, 0x041D,
+ 0xACF2, 0xACF6, 0x2420, 0xAD41, 0xAD7D, 0x2425, 0xADA1, 0xADB0, 0x2462,
+ 0xB0A1, 0xB0FE, 0x043E, 0xB1A1, 0xB1FE, 0x049C, 0xB2A1, 0xB2FE, 0x04FA,
+ 0xB3A1, 0xB3FE, 0x0558, 0xB4A1, 0xB4FE, 0x05B6, 0xB5A1, 0xB5FE, 0x0614,
+ 0xB6A1, 0xB6FE, 0x0672, 0xB7A1, 0xB7FE, 0x06D0, 0xB8A1, 0xB8FE, 0x072E,
+ 0xB9A1, 0xB9FE, 0x078C, 0xBAA1, 0xBAFE, 0x07EA, 0xBBA1, 0xBBFE, 0x0848,
+ 0xBCA1, 0xBCFE, 0x08A6, 0xBDA1, 0xBDFE, 0x0904, 0xBEA1, 0xBEFE, 0x0962,
+ 0xBFA1, 0xBFFE, 0x09C0, 0xC0A1, 0xC0FE, 0x0A1E, 0xC1A1, 0xC1FE, 0x0A7C,
+ 0xC2A1, 0xC2FE, 0x0ADA, 0xC3A1, 0xC3FE, 0x0B38, 0xC4A1, 0xC4FE, 0x0B96,
+ 0xC5A1, 0xC5FE, 0x0BF4, 0xC6A1, 0xC6FE, 0x0C52, 0xC7A1, 0xC7FE, 0x0CB0,
+ 0xC8A1, 0xC8FE, 0x0D0E, 0xCAA1, 0xCAFE, 0x0D6C, 0xCBA1, 0xCBCF, 0x0DCA,
+ 0xCBD0, 0xCBD0, 0x1014, 0xCBD1, 0xCBD5, 0x0DF9, 0xCBD6, 0xCBD6, 0x0E5E,
+ 0xCBD7, 0xCBE6, 0x0DFE, 0xCBE7, 0xCBE7, 0x1B8D, 0xCBE8, 0xCBFE, 0x0E0E,
+ 0xCCA1, 0xCCFE, 0x0E25, 0xCDA1, 0xCDCE, 0x0E83, 0xCDCF, 0xCDCF, 0x0D84,
+ 0xCDD0, 0xCDE7, 0x0EB1, 0xCDE8, 0xCDE8, 0x1EDC, 0xCDE9, 0xCDFE, 0x0EC9,
+ 0xCEA1, 0xCEAC, 0x0EDF, 0xCEAD, 0xCEAD, 0x0EDA, 0xCEAE, 0xCEFE, 0x0EEB,
+ 0xCFA1, 0xCFFA, 0x0F3C, 0xCFFB, 0xCFFB, 0x0F3E, 0xCFFC, 0xCFFE, 0x0F96,
+ 0xD0A1, 0xD0A1, 0x0F99, 0xD0A2, 0xD0A2, 0x0F6A, 0xD0A3, 0xD0B7, 0x0F9A,
+ 0xD0B8, 0xD0B8, 0x0F6A, 0xD0B9, 0xD0CF, 0x0FAF, 0xD0D0, 0xD0D0, 0x0E7C,
+ 0xD0D1, 0xD0DC, 0x0FC6, 0xD0DD, 0xD0DD, 0x1023, 0xD0DE, 0xD0FE, 0x0FD2,
+ 0xD1A1, 0xD1D3, 0x0FF3, 0xD1D4, 0xD1D4, 0x1116, 0xD1D5, 0xD1D5, 0x103C,
+ 0xD1D6, 0xD1D7, 0x1026, 0xD1D8, 0xD1D8, 0x1117, 0xD1D9, 0xD1DA, 0x1028,
+ 0xD1DB, 0xD1E0, 0x1118, 0xD1E1, 0xD1E1, 0x102A, 0xD1E2, 0xD1E2, 0x16A8,
+ 0xD1E3, 0xD1E5, 0x111E, 0xD1E6, 0xD1E6, 0x1122, 0xD1E7, 0xD1E7, 0x102B,
+ 0xD1E8, 0xD1EB, 0x1123, 0xD1EC, 0xD1EC, 0x102C, 0xD1ED, 0xD1ED, 0x1127,
+ 0xD1EE, 0xD1EE, 0x102D, 0xD1EF, 0xD1F0, 0x112A, 0xD1F1, 0xD1F1, 0x102E,
+ 0xD1F2, 0xD1F2, 0x112C, 0xD1F3, 0xD1F5, 0x102F, 0xD1F6, 0xD1F6, 0x112F,
+ 0xD1F7, 0xD1F9, 0x1032, 0xD1FA, 0xD1FA, 0x1133, 0xD1FB, 0xD1FB, 0x1035,
+ 0xD1FC, 0xD1FD, 0x1136, 0xD1FE, 0xD1FE, 0x1139, 0xD2A1, 0xD2A1, 0x1036,
+ 0xD2A2, 0xD2A3, 0x113A, 0xD2A4, 0xD2A6, 0x1037, 0xD2A7, 0xD2AA, 0x113C,
+ 0xD2AB, 0xD2AB, 0x1143, 0xD2AC, 0xD2AC, 0x103A, 0xD2AD, 0xD2AD, 0x1144,
+ 0xD2AE, 0xD2B1, 0x103B, 0xD2B2, 0xD2B2, 0x1148, 0xD2B3, 0xD2BD, 0x103F,
+ 0xD2BE, 0xD2BE, 0x119F, 0xD2BF, 0xD2C1, 0x104A, 0xD2C2, 0xD2C3, 0x11A1,
+ 0xD2C4, 0xD2C4, 0x11A5, 0xD2C5, 0xD2C5, 0x104D, 0xD2C6, 0xD2CA, 0x11A6,
+ 0xD2CB, 0xD2CB, 0x11AC, 0xD2CC, 0xD2CC, 0x104E, 0xD2CD, 0xD2CE, 0x11AD,
+ 0xD2CF, 0xD2D4, 0x11B0, 0xD2D5, 0xD2D7, 0x11B7, 0xD2D8, 0xD2D8, 0x104F,
+ 0xD2D9, 0xD2DA, 0x11BD, 0xD2DB, 0xD2DD, 0x1050, 0xD2DE, 0xD2DF, 0x11C1,
+ 0xD2E0, 0xD2E0, 0x1053, 0xD2E1, 0xD2E1, 0x11C3, 0xD2E2, 0xD2E2, 0x11C6,
+ 0xD2E3, 0xD2E3, 0x1054, 0xD2E4, 0xD2E4, 0x11D4, 0xD2E5, 0xD2E8, 0x11D6,
+ 0xD2E9, 0xD2EA, 0x11DB, 0xD2EB, 0xD2EB, 0x11E0, 0xD2EC, 0xD2EF, 0x1055,
+ 0xD2F0, 0xD2F3, 0x11FC, 0xD2F4, 0xD2F5, 0x1201, 0xD2F6, 0xD2F6, 0x1059,
+ 0xD2F7, 0xD2F8, 0x1203, 0xD2F9, 0xD2FE, 0x105A, 0xD3A1, 0xD3FE, 0x1060,
+ 0xD4A1, 0xD4E5, 0x10BE, 0xD4E6, 0xD4E6, 0x10DE, 0xD4E7, 0xD4FB, 0x1103,
+ 0xD4FC, 0xD4FC, 0x1028, 0xD4FD, 0xD4FE, 0x1118, 0xD5A1, 0xD5A4, 0x111A,
+ 0xD5A5, 0xD5A5, 0x16A8, 0xD5A6, 0xD5AA, 0x111E, 0xD5AB, 0xD5AB, 0x102B,
+ 0xD5AC, 0xD5AD, 0x1123, 0xD5AE, 0xD5AE, 0x1060, 0xD5AF, 0xD5FE, 0x1125,
+ 0xD6A1, 0xD6B7, 0x1175, 0xD6B8, 0xD6B8, 0x1047, 0xD6B9, 0xD6CC, 0x118C,
+ 0xD6CD, 0xD6CD, 0x104C, 0xD6CE, 0xD6FE, 0x11A0, 0xD7A1, 0xD7CA, 0x11D1,
+ 0xD7CB, 0xD7CB, 0x15B0, 0xD7CC, 0xD7E3, 0x11FB, 0xD7E4, 0xD7E4, 0x1918,
+ 0xD7E5, 0xD7FE, 0x1213, 0xD8A1, 0xD8FE, 0x122D, 0xD9A1, 0xD9FE, 0x128B,
+ 0xDAA1, 0xDAFE, 0x12E9, 0xDBA1, 0xDBC4, 0x1347, 0xDBC5, 0xDBC5, 0x141F,
+ 0xDBC6, 0xDBE3, 0x136B, 0xDBE4, 0xDBE4, 0x133A, 0xDBE5, 0xDBFE, 0x1389,
+ 0xDCA1, 0xDCA4, 0x13A3, 0xDCA5, 0xDCA5, 0x1D5E, 0xDCA6, 0xDCFE, 0x13A7,
+ 0xDDA1, 0xDDA4, 0x1400, 0xDDA5, 0xDDA5, 0x13D7, 0xDDA6, 0xDDD4, 0x1404,
+ 0xDDD5, 0xDDD5, 0x13F5, 0xDDD6, 0xDDF3, 0x1433, 0xDDF4, 0xDDF4, 0x1DB7,
+ 0xDDF5, 0xDDFE, 0x1451, 0xDEA1, 0xDEFB, 0x145B, 0xDEFC, 0xDEFC, 0x15D0,
+ 0xDEFD, 0xDEFD, 0x14B6, 0xDEFE, 0xDEFE, 0x14F7, 0xDFA1, 0xDFB2, 0x14B7,
+ 0xDFB3, 0xDFB3, 0x1BAB, 0xDFB4, 0xDFE0, 0x14C9, 0xDFE1, 0xDFE1, 0x14F2,
+ 0xDFE2, 0xDFE7, 0x14F6, 0xDFE8, 0xDFE8, 0x156D, 0xDFE9, 0xDFFE, 0x14FC,
+ 0xE0A1, 0xE0F0, 0x1512, 0xE0F1, 0xE0F1, 0x1771, 0xE0F2, 0xE0FE, 0x1562,
+ 0xE1A1, 0xE1AC, 0x156F, 0xE1AD, 0xE1AD, 0x1554, 0xE1AE, 0xE1EC, 0x157B,
+ 0xE1ED, 0xE1ED, 0x14C5, 0xE1EE, 0xE1FE, 0x15BA, 0xE2A1, 0xE2FE, 0x15CB,
+ 0xE3A1, 0xE3F4, 0x1629, 0xE3F5, 0xE3F5, 0x1B61, 0xE3F6, 0xE3FE, 0x167D,
+ 0xE4A1, 0xE4A1, 0x1CCA, 0xE4A2, 0xE4A8, 0x1686, 0xE4A9, 0xE4A9, 0x162E,
+ 0xE4AA, 0xE4FE, 0x168D, 0xE5A1, 0xE5AD, 0x16E2, 0xE5AE, 0xE5AE, 0x16F2,
+ 0xE5AF, 0xE5B0, 0x16EF, 0xE5B1, 0xE5B2, 0x1149, 0xE5B3, 0xE5B8, 0x16F1,
+ 0xE5B9, 0xE5B9, 0x114B, 0xE5BA, 0xE5BA, 0x16F7, 0xE5BB, 0xE5BC, 0x114D,
+ 0xE5BD, 0xE5C3, 0x16F8, 0xE5C4, 0xE5C4, 0x114F, 0xE5C5, 0xE5CD, 0x16FF,
+ 0xE5CE, 0xE5CE, 0x1153, 0xE5CF, 0xE5CF, 0x1708, 0xE5D0, 0xE5D0, 0x1154,
+ 0xE5D1, 0xE5D1, 0x1709, 0xE5D2, 0xE5D2, 0x1155, 0xE5D3, 0xE5D5, 0x170A,
+ 0xE5D6, 0xE5D6, 0x1157, 0xE5D7, 0xE5F9, 0x170D, 0xE5FA, 0xE5FB, 0x115A,
+ 0xE5FC, 0xE5FC, 0x103F, 0xE5FD, 0xE5FD, 0x1730, 0xE5FE, 0xE5FE, 0x115C,
+ 0xE6A1, 0xE6A1, 0x115F, 0xE6A2, 0xE6A3, 0x1731, 0xE6A4, 0xE6A4, 0x1161,
+ 0xE6A5, 0xE6A6, 0x1733, 0xE6A7, 0xE6A7, 0x1162, 0xE6A8, 0xE6AC, 0x1735,
+ 0xE6AD, 0xE6AD, 0x1165, 0xE6AE, 0xE6AE, 0x173A, 0xE6AF, 0xE6B1, 0x1167,
+ 0xE6B2, 0xE6B2, 0x173B, 0xE6B3, 0xE6B3, 0x116A, 0xE6B4, 0xE6B6, 0x173C,
+ 0xE6B7, 0xE6B8, 0x116B, 0xE6B9, 0xE6BB, 0x173F, 0xE6BC, 0xE6BC, 0x116F,
+ 0xE6BD, 0xE6C3, 0x1742, 0xE6C4, 0xE6C4, 0x1040, 0xE6C5, 0xE6C5, 0x1749,
+ 0xE6C6, 0xE6C7, 0x1171, 0xE6C8, 0xE6C9, 0x174A, 0xE6CA, 0xE6CA, 0x1041,
+ 0xE6CB, 0xE6D1, 0x174C, 0xE6D2, 0xE6D2, 0x1174, 0xE6D3, 0xE6D5, 0x1753,
+ 0xE6D6, 0xE6D6, 0x1175, 0xE6D7, 0xE6D8, 0x1756, 0xE6D9, 0xE6D9, 0x1176,
+ 0xE6DA, 0xE6DB, 0x1758, 0xE6DC, 0xE6DC, 0x1042, 0xE6DD, 0xE6DE, 0x175A,
+ 0xE6DF, 0xE6DF, 0x1177, 0xE6E0, 0xE6E0, 0x175C, 0xE6E1, 0xE6E1, 0x1178,
+ 0xE6E2, 0xE6E3, 0x175D, 0xE6E4, 0xE6E4, 0x117A, 0xE6E5, 0xE6E5, 0x1179,
+ 0xE6E6, 0xE6E6, 0x117B, 0xE6E7, 0xE6E7, 0x175F, 0xE6E8, 0xE6E8, 0x117C,
+ 0xE6E9, 0xE6E9, 0x1760, 0xE6EA, 0xE6EB, 0x117E, 0xE6EC, 0xE6EC, 0x192F,
+ 0xE6ED, 0xE6EE, 0x1761, 0xE6EF, 0xE6EF, 0x1181, 0xE6F0, 0xE6F0, 0x1763,
+ 0xE6F1, 0xE6F1, 0x1182, 0xE6F2, 0xE6F2, 0x1554, 0xE6F3, 0xE6F4, 0x1764,
+ 0xE6F5, 0xE6F5, 0x1183, 0xE6F6, 0xE6F6, 0x1043, 0xE6F7, 0xE6F7, 0x1046,
+ 0xE6F8, 0xE6F8, 0x1766, 0xE6F9, 0xE6F9, 0x1185, 0xE6FA, 0xE6FE, 0x1767,
+ 0xE7A1, 0xE7A1, 0x1187, 0xE7A2, 0xE7A5, 0x176C, 0xE7A6, 0xE7A6, 0x1188,
+ 0xE7A7, 0xE7A8, 0x1770, 0xE7A9, 0xE7A9, 0x1189, 0xE7AA, 0xE7AA, 0x118B,
+ 0xE7AB, 0xE7AB, 0x1772, 0xE7AC, 0xE7AC, 0x1047, 0xE7AD, 0xE7AD, 0x118D,
+ 0xE7AE, 0xE7AF, 0x1773, 0xE7B0, 0xE7B0, 0x118E, 0xE7B1, 0xE7BE, 0x1775,
+ 0xE7BF, 0xE7BF, 0x118F, 0xE7C0, 0xE7C0, 0x1783, 0xE7C1, 0xE7C1, 0x1E67,
+ 0xE7C2, 0xE7C5, 0x1784, 0xE7C6, 0xE7C6, 0x1191, 0xE7C7, 0xE7C7, 0x1193,
+ 0xE7C8, 0xE7CA, 0x1788, 0xE7CB, 0xE7CB, 0x1195, 0xE7CC, 0xE7CC, 0x178B,
+ 0xE7CD, 0xE7CD, 0x1196, 0xE7CE, 0xE7CE, 0x178C, 0xE7CF, 0xE7D0, 0x1197,
+ 0xE7D1, 0xE7D2, 0x178D, 0xE7D3, 0xE7D3, 0x119A, 0xE7D4, 0xE7DE, 0x178F,
+ 0xE7DF, 0xE7DF, 0x119C, 0xE7E0, 0xE7E3, 0x179A, 0xE7E4, 0xE7E4, 0x119D,
+ 0xE7E5, 0xE7E5, 0x179E, 0xE7E6, 0xE7E6, 0x119E, 0xE7E7, 0xE7F6, 0x179F,
+ 0xE7F7, 0xE7F7, 0x16A5, 0xE7F8, 0xE7FE, 0x17AF, 0xE8A1, 0xE8E6, 0x17B6,
+ 0xE8E7, 0xE8E8, 0x11C7, 0xE8E9, 0xE8EF, 0x17FC, 0xE8F0, 0xE8F0, 0x11C9,
+ 0xE8F1, 0xE8F1, 0x1054, 0xE8F2, 0xE8F6, 0x1803, 0xE8F7, 0xE8F7, 0x11CB,
+ 0xE8F8, 0xE8F8, 0x1808, 0xE8F9, 0xE8F9, 0x16A8, 0xE8FA, 0xE8FA, 0x1809,
+ 0xE8FB, 0xE8FB, 0x11CC, 0xE8FC, 0xE8FD, 0x180A, 0xE8FE, 0xE8FE, 0x11CD,
+ 0xE9A1, 0xE9A6, 0x180C, 0xE9A7, 0xE9A7, 0x11D0, 0xE9A8, 0xE9AB, 0x1812,
+ 0xE9AC, 0xE9AC, 0x11D1, 0xE9AD, 0xE9CB, 0x1816, 0xE9CC, 0xE9CC, 0x11D3,
+ 0xE9CD, 0xE9F6, 0x1835, 0xE9F7, 0xE9F7, 0x1F34, 0xE9F8, 0xE9FE, 0x185F,
+ 0xEAA1, 0xEAC0, 0x1866, 0xEAC1, 0xEAC1, 0x17EB, 0xEAC2, 0xEAE4, 0x1886,
+ 0xEAE5, 0xEAE5, 0x11E1, 0xEAE6, 0xEAF3, 0x18A9, 0xEAF4, 0xEAF4, 0x1057,
+ 0xEAF5, 0xEAF6, 0x18B7, 0xEAF7, 0xEAF7, 0x11E3, 0xEAF8, 0xEAFB, 0x18B9,
+ 0xEAFC, 0xEAFC, 0x11E5, 0xEAFD, 0xEAFD, 0x18BD, 0xEAFE, 0xEAFE, 0x11E6,
+ 0xEBA1, 0xEBA3, 0x18BE, 0xEBA4, 0xEBA4, 0x11E8, 0xEBA5, 0xEBA6, 0x18C1,
+ 0xEBA7, 0xEBA7, 0x11EA, 0xEBA8, 0xEBA8, 0x18C3, 0xEBA9, 0xEBA9, 0x11EC,
+ 0xEBAA, 0xEBAA, 0x1058, 0xEBAB, 0xEBB9, 0x18C4, 0xEBBA, 0xEBBB, 0x11EE,
+ 0xEBBC, 0xEBBC, 0x18D3, 0xEBBD, 0xEBBD, 0x11F0, 0xEBBE, 0xEBC0, 0x18D4,
+ 0xEBC1, 0xEBC1, 0x11F1, 0xEBC2, 0xEBC2, 0x11F3, 0xEBC3, 0xEBC5, 0x18D7,
+ 0xEBC6, 0xEBC7, 0x11F4, 0xEBC8, 0xEBCB, 0x18DA, 0xEBCC, 0xEBCC, 0x11F7,
+ 0xEBCD, 0xEBCE, 0x18DE, 0xEBCF, 0xEBD1, 0x11F8, 0xEBD2, 0xEBD2, 0x15B0,
+ 0xEBD3, 0xEBD7, 0x18E0, 0xEBD8, 0xEBD8, 0x11FB, 0xEBD9, 0xEBFE, 0x18E5,
+ 0xECA1, 0xECA5, 0x190B, 0xECA6, 0xECA6, 0x1206, 0xECA7, 0xECA7, 0x1208,
+ 0xECA8, 0xECA9, 0x1910, 0xECAA, 0xECAA, 0x120A, 0xECAB, 0xECAE, 0x1912,
+ 0xECAF, 0xECAF, 0x173E, 0xECB0, 0xECB1, 0x120C, 0xECB2, 0xECB2, 0x105B,
+ 0xECB3, 0xECB4, 0x1916, 0xECB5, 0xECB5, 0x1211, 0xECB6, 0xECB7, 0x1918,
+ 0xECB8, 0xECB8, 0x1213, 0xECB9, 0xECB9, 0x191A, 0xECBA, 0xECBA, 0x1215,
+ 0xECBB, 0xECBF, 0x191B, 0xECC0, 0xECC1, 0x1218, 0xECC2, 0xECC4, 0x1920,
+ 0xECC5, 0xECC5, 0x121A, 0xECC6, 0xECC6, 0x121C, 0xECC7, 0xECC8, 0x1923,
+ 0xECC9, 0xECCA, 0x105C, 0xECCB, 0xECD4, 0x1925, 0xECD5, 0xECD5, 0x121E,
+ 0xECD6, 0xECDC, 0x192F, 0xECDD, 0xECDE, 0x1220, 0xECDF, 0xECE0, 0x1936,
+ 0xECE1, 0xECE1, 0x1222, 0xECE2, 0xECE3, 0x1938, 0xECE4, 0xECE4, 0x1224,
+ 0xECE5, 0xECE6, 0x193A, 0xECE7, 0xECE8, 0x1225, 0xECE9, 0xECF6, 0x193C,
+ 0xECF7, 0xECF8, 0x1227, 0xECF9, 0xECF9, 0x194A, 0xECFA, 0xECFA, 0x122A,
+ 0xECFB, 0xECFE, 0x194B, 0xEDA1, 0xEDA3, 0x122D, 0xEDA4, 0xEDED, 0x194F,
+ 0xEDEE, 0xEDEE, 0x14E7, 0xEDEF, 0xEDFE, 0x1999, 0xEEA1, 0xEEDA, 0x19A9,
+ 0xEEDB, 0xEEDB, 0x195E, 0xEEDC, 0xEEFE, 0x19E3, 0xEFA1, 0xEFFE, 0x1A06,
+ 0xF0A1, 0xF0FE, 0x1A64, 0xF1A1, 0xF1FE, 0x1AC2, 0xF2A1, 0xF2BC, 0x1B20,
+ 0xF2BD, 0xF2BD, 0x1663, 0xF2BE, 0xF2F9, 0x1B3C, 0xF2FA, 0xF2FA, 0x168B,
+ 0xF2FB, 0xF2FE, 0x1B78, 0xF3A1, 0xF3B0, 0x1B7C, 0xF3B1, 0xF3B1, 0x105F,
+ 0xF3B2, 0xF3FE, 0x1B8C, 0xF4A1, 0xF4A6, 0x1BD9, 0xF4A7, 0xF4A7, 0x1954,
+ 0xF4A8, 0xF4ED, 0x1BDF, 0xF4EE, 0xF4EE, 0x1A1C, 0xF4EF, 0xF4FE, 0x1C25,
+ 0xF5A1, 0xF5FE, 0x1C35, 0xF6A1, 0xF6F3, 0x1C93, 0xF6F4, 0xF6F4, 0x10B7,
+ 0xF6F5, 0xF6F5, 0x1CE6, 0xF6F6, 0xF6F6, 0x1BE3, 0xF6F7, 0xF6FE, 0x1CE7,
+ 0xF7A1, 0xF7B7, 0x1CEF, 0xF7B8, 0xF7B8, 0x1097, 0xF7B9, 0xF7C7, 0x1D06,
+ 0xF7C8, 0xF7C8, 0x10AA, 0xF7C9, 0xF7D2, 0x1D15, 0xF7D3, 0xF7D3, 0x10F4,
+ 0xF7D4, 0xF7FE, 0x1D1F, 0xF8A1, 0xF8DA, 0x1D4A, 0xF8DB, 0xF8DB, 0x1D94,
+ 0xF8DC, 0xF8EF, 0x1D84, 0xF8F0, 0xF8F0, 0x13E0, 0xF8F1, 0xF8FE, 0x1D98,
+ 0xF9A1, 0xF9FE, 0x1DA6, 0xFAA1, 0xFAA1, 0x1E1D, 0xFAA2, 0xFAA2, 0x0DE6,
+ 0xFAA3, 0xFAE5, 0x1E04, 0xFAE6, 0xFAE6, 0x0E3C, 0xFAE7, 0xFAFE, 0x1E47,
+ 0xFBA1, 0xFBFE, 0x1E5F, 0xFCA1, 0xFCA8, 0x1EBD, 0xFCA9, 0xFCA9, 0x0EE7,
+ 0xFCAA, 0xFCFE, 0x1EC5, 0xFDA1, 0xFDFE, 0x1F1A,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/Korea1/UniKS-UCS2-H_1.cpp b/core/src/fpdfapi/fpdf_cmaps/Korea1/UniKS-UCS2-H_1.cpp
index 62b6ea57ef..daf98271b1 100644
--- a/core/src/fpdfapi/fpdf_cmaps/Korea1/UniKS-UCS2-H_1.cpp
+++ b/core/src/fpdfapi/fpdf_cmaps/Korea1/UniKS-UCS2-H_1.cpp
@@ -1,2806 +1,2806 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-extern const unsigned short g_FXCMAP_UniKS_UCS2_H_1[8394 * 3] = {
- 0x0020, 0x007E, 0x0001, 0x00A1, 0x00A1, 0x00D0, 0x00A4, 0x00A4, 0x00D6,
- 0x00A7, 0x00A7, 0x009B, 0x00A8, 0x00A8, 0x006B, 0x00AA, 0x00AA, 0x029C,
- 0x00AB, 0x00AB, 0x00B0, 0x00B0, 0x00B0, 0x008A, 0x00B1, 0x00B1, 0x0082,
- 0x00B2, 0x00B3, 0x034B, 0x00B4, 0x00B4, 0x00C7, 0x00B6, 0x00B6, 0x00F4,
- 0x00B8, 0x00B8, 0x00CE, 0x00B9, 0x00B9, 0x034A, 0x00BA, 0x00BA, 0x02A3,
- 0x00BB, 0x00BB, 0x00B1, 0x00BC, 0x00BC, 0x02EF, 0x00BD, 0x00BD, 0x02EC,
- 0x00BE, 0x00BE, 0x02F0, 0x00BF, 0x00BF, 0x00D1, 0x00C6, 0x00C6, 0x029A,
- 0x00D0, 0x00D0, 0x029B, 0x00D7, 0x00D7, 0x0083, 0x00D8, 0x00D8, 0x02A1,
- 0x00DE, 0x00DE, 0x02A4, 0x00DF, 0x00DF, 0x0300, 0x00E6, 0x00E6, 0x02F5,
- 0x00F0, 0x00F0, 0x02F7, 0x00F7, 0x00F7, 0x0084, 0x00F8, 0x00F8, 0x02FE,
- 0x00FE, 0x00FE, 0x0301, 0x0111, 0x0111, 0x02F6, 0x0126, 0x0126, 0x029D,
- 0x0127, 0x0127, 0x02F8, 0x0131, 0x0131, 0x02F9, 0x0132, 0x0132, 0x029E,
- 0x0133, 0x0133, 0x02FA, 0x0138, 0x0138, 0x02FB, 0x013F, 0x013F, 0x029F,
- 0x0140, 0x0140, 0x02FC, 0x0141, 0x0141, 0x02A0, 0x0142, 0x0142, 0x02FD,
- 0x0149, 0x0149, 0x0304, 0x014A, 0x014A, 0x02A6, 0x014B, 0x014B, 0x0303,
- 0x0152, 0x0152, 0x02A2, 0x0153, 0x0153, 0x02FF, 0x0166, 0x0166, 0x02A5,
- 0x0167, 0x0167, 0x0302, 0x02BC, 0x02BC, 0x2053, 0x02C7, 0x02C7, 0x00C9,
- 0x02D8, 0x02D8, 0x00CA, 0x02D9, 0x02D9, 0x00CD, 0x02DA, 0x02DA, 0x00CC,
- 0x02DB, 0x02DB, 0x00CF, 0x02DC, 0x02DC, 0x00C8, 0x02DD, 0x02DD, 0x00CB,
- 0x0391, 0x03A1, 0x01D7, 0x03A3, 0x03A9, 0x01E8, 0x03B1, 0x03C1, 0x01EF,
- 0x03C3, 0x03C9, 0x0200, 0x0401, 0x0401, 0x0402, 0x0410, 0x0415, 0x03FC,
- 0x0416, 0x0435, 0x0403, 0x0436, 0x044F, 0x0424, 0x0451, 0x0451, 0x0423,
- 0x2013, 0x2014, 0x006D, 0x2016, 0x2016, 0x006F, 0x2018, 0x2019, 0x0072,
- 0x201B, 0x201B, 0x202E, 0x201C, 0x201D, 0x0074, 0x201F, 0x201F, 0x202D,
- 0x2020, 0x2021, 0x00F5, 0x2022, 0x2022, 0x219F, 0x2025, 0x2026, 0x0069,
- 0x2030, 0x2030, 0x00D8, 0x2032, 0x2033, 0x008B, 0x2034, 0x2034, 0x2186,
- 0x2035, 0x2035, 0x246E, 0x2036, 0x2036, 0x246C, 0x2039, 0x203A, 0x21A4,
- 0x203B, 0x203B, 0x009C, 0x203C, 0x203C, 0x223B, 0x2042, 0x2042, 0x2197,
- 0x2074, 0x2074, 0x034D, 0x207A, 0x207B, 0x202F, 0x207C, 0x207C, 0x2038,
- 0x207D, 0x207E, 0x203A, 0x207F, 0x207F, 0x034E, 0x2081, 0x2084, 0x034F,
- 0x2103, 0x2103, 0x008D, 0x2109, 0x2109, 0x00D7, 0x2113, 0x2113, 0x024E,
- 0x2116, 0x2116, 0x0102, 0x2121, 0x2121, 0x0107, 0x2122, 0x2122, 0x0104,
- 0x2126, 0x2126, 0x0283, 0x212B, 0x212B, 0x008E, 0x2153, 0x2154, 0x02ED,
- 0x215B, 0x215E, 0x02F1, 0x2160, 0x2169, 0x01CD, 0x2170, 0x2179, 0x01C3,
- 0x2190, 0x2191, 0x00AB, 0x2192, 0x2192, 0x00AA, 0x2193, 0x2194, 0x00AD,
- 0x2195, 0x2195, 0x00F7, 0x2196, 0x2196, 0x00FA, 0x2197, 0x2197, 0x00F8,
- 0x2198, 0x2198, 0x00FB, 0x2199, 0x2199, 0x00F9, 0x21B0, 0x21B0, 0x22A4,
- 0x21B1, 0x21B1, 0x22A1, 0x21B2, 0x21B2, 0x22A0, 0x21B3, 0x21B3, 0x22A5,
- 0x21B4, 0x21B4, 0x22A3, 0x21BC, 0x21BC, 0x22B4, 0x21C0, 0x21C0, 0x22B5,
- 0x21C4, 0x21C5, 0x22C0, 0x21CD, 0x21CD, 0x2270, 0x21CF, 0x21CF, 0x226F,
- 0x21D0, 0x21D0, 0x226E, 0x21D1, 0x21D1, 0x2296, 0x21D2, 0x21D2, 0x00C3,
- 0x21D3, 0x21D3, 0x2297, 0x21D4, 0x21D4, 0x00C4, 0x21E0, 0x21E0, 0x23E6,
- 0x21E1, 0x21E1, 0x23E8, 0x21E2, 0x21E2, 0x23E7, 0x21E3, 0x21E3, 0x23E9,
- 0x21E6, 0x21E6, 0x23EE, 0x21E7, 0x21E7, 0x23F0, 0x21E8, 0x21E8, 0x23EF,
- 0x21E9, 0x21E9, 0x23F1, 0x2200, 0x2200, 0x00C5, 0x2202, 0x2202, 0x0097,
- 0x2203, 0x2203, 0x00C6, 0x2206, 0x2206, 0x220B, 0x2207, 0x2207, 0x0098,
- 0x2208, 0x2208, 0x00B8, 0x2209, 0x2209, 0x222D, 0x220B, 0x220B, 0x00B9,
- 0x220C, 0x220C, 0x222E, 0x220F, 0x220F, 0x00D5, 0x2211, 0x2211, 0x00D4,
- 0x2213, 0x2213, 0x2216, 0x221A, 0x221A, 0x00B2, 0x221D, 0x221D, 0x00B4,
- 0x221E, 0x221E, 0x0088, 0x221F, 0x221F, 0x220D, 0x2220, 0x2220, 0x0094,
- 0x2222, 0x2222, 0x2222, 0x2225, 0x2226, 0x220F, 0x2227, 0x2228, 0x00C0,
- 0x2229, 0x2229, 0x00BF, 0x222A, 0x222A, 0x00BE, 0x222B, 0x222C, 0x00B6,
- 0x222E, 0x222E, 0x00D3, 0x2234, 0x2234, 0x0089, 0x2235, 0x2235, 0x00B5,
- 0x2236, 0x2236, 0x00D2, 0x2237, 0x2237, 0x2081, 0x223D, 0x223D, 0x00B3,
- 0x2243, 0x2243, 0x2134, 0x2245, 0x2245, 0x2133, 0x2248, 0x2248, 0x2135,
- 0x2250, 0x2250, 0x2223, 0x2251, 0x2251, 0x2213, 0x2252, 0x2252, 0x009A,
- 0x2253, 0x2253, 0x2212, 0x225A, 0x225A, 0x2231, 0x2260, 0x2260, 0x0085,
- 0x2261, 0x2261, 0x0099, 0x2262, 0x2262, 0x221E, 0x2264, 0x2265, 0x0086,
- 0x2266, 0x2267, 0x2214, 0x226E, 0x226F, 0x2229, 0x2270, 0x2273, 0x2121,
- 0x2276, 0x2277, 0x2129, 0x2279, 0x2279, 0x212B, 0x227A, 0x227B, 0x211B,
- 0x2280, 0x2281, 0x211F, 0x2282, 0x2283, 0x00BC, 0x2284, 0x2284, 0x222C,
- 0x2285, 0x2285, 0x222B, 0x2286, 0x2287, 0x00BA, 0x228A, 0x228A, 0x2126,
- 0x228B, 0x228B, 0x2128, 0x2295, 0x2297, 0x2217, 0x22A3, 0x22A3, 0x2226,
- 0x22A4, 0x22A4, 0x2137, 0x22A5, 0x22A5, 0x0095, 0x22BB, 0x22BC, 0x222F,
- 0x22CE, 0x22CF, 0x211D, 0x22DA, 0x22DB, 0x212C, 0x22EE, 0x22EE, 0x2080,
- 0x22EF, 0x22EF, 0x006A, 0x2306, 0x2306, 0x2232, 0x2312, 0x2312, 0x0096,
- 0x2314, 0x2314, 0x221B, 0x2460, 0x246E, 0x02DD, 0x246F, 0x2473, 0x2257,
- 0x2474, 0x2482, 0x033B, 0x2483, 0x2487, 0x2352, 0x249C, 0x24B5, 0x0321,
- 0x24B6, 0x24CF, 0x20C4, 0x24D0, 0x24E9, 0x02C3, 0x2500, 0x2500, 0x0207,
- 0x2501, 0x2501, 0x0212, 0x2502, 0x2502, 0x0208, 0x2503, 0x2503, 0x0213,
- 0x250C, 0x250C, 0x0209, 0x250D, 0x250D, 0x022E, 0x250E, 0x250E, 0x022D,
- 0x250F, 0x250F, 0x0214, 0x2510, 0x2510, 0x020A, 0x2511, 0x2511, 0x0228,
- 0x2512, 0x2512, 0x0227, 0x2513, 0x2513, 0x0215, 0x2514, 0x2514, 0x020C,
- 0x2515, 0x2515, 0x022C, 0x2516, 0x2516, 0x022B, 0x2517, 0x2517, 0x0217,
- 0x2518, 0x2518, 0x020B, 0x2519, 0x2519, 0x022A, 0x251A, 0x251A, 0x0229,
- 0x251B, 0x251B, 0x0216, 0x251C, 0x251C, 0x020D, 0x251D, 0x251D, 0x0222,
- 0x251E, 0x251F, 0x022F, 0x2520, 0x2520, 0x021D, 0x2521, 0x2522, 0x0231,
- 0x2523, 0x2523, 0x0218, 0x2524, 0x2524, 0x020F, 0x2525, 0x2525, 0x0224,
- 0x2526, 0x2527, 0x0233, 0x2528, 0x2528, 0x021F, 0x2529, 0x252A, 0x0235,
- 0x252B, 0x252B, 0x021A, 0x252C, 0x252C, 0x020E, 0x252D, 0x252E, 0x0237,
- 0x252F, 0x252F, 0x021E, 0x2530, 0x2530, 0x0223, 0x2531, 0x2532, 0x0239,
- 0x2533, 0x2533, 0x0219, 0x2534, 0x2534, 0x0210, 0x2535, 0x2536, 0x023B,
- 0x2537, 0x2537, 0x0220, 0x2538, 0x2538, 0x0225, 0x2539, 0x253A, 0x023D,
- 0x253B, 0x253B, 0x021B, 0x253C, 0x253C, 0x0211, 0x253D, 0x253E, 0x023F,
- 0x253F, 0x253F, 0x0221, 0x2540, 0x2541, 0x0241, 0x2542, 0x2542, 0x0226,
- 0x2543, 0x254A, 0x0243, 0x254B, 0x254B, 0x021C, 0x2592, 0x2592, 0x00E8,
- 0x25A0, 0x25A0, 0x00A5, 0x25A1, 0x25A1, 0x00A4, 0x25A3, 0x25A3, 0x00E5,
- 0x25A4, 0x25A5, 0x00E9, 0x25A6, 0x25A6, 0x00ED, 0x25A7, 0x25A7, 0x00EC,
- 0x25A8, 0x25A8, 0x00EB, 0x25A9, 0x25A9, 0x00EE, 0x25B1, 0x25B1, 0x2220,
- 0x25B2, 0x25B2, 0x00A7, 0x25B3, 0x25B3, 0x00A6, 0x25B5, 0x25B5, 0x224C,
- 0x25B6, 0x25B6, 0x00DC, 0x25B7, 0x25B7, 0x00DB, 0x25B9, 0x25B9, 0x224D,
- 0x25BC, 0x25BC, 0x00A9, 0x25BD, 0x25BD, 0x00A8, 0x25BF, 0x25BF, 0x224B,
- 0x25C0, 0x25C0, 0x00DA, 0x25C1, 0x25C1, 0x00D9, 0x25C3, 0x25C3, 0x224E,
- 0x25C6, 0x25C6, 0x00A3, 0x25C7, 0x25C7, 0x00A2, 0x25C8, 0x25C8, 0x00E4,
- 0x25C9, 0x25C9, 0x00E3, 0x25CA, 0x25CA, 0x2253, 0x25CB, 0x25CB, 0x009F,
- 0x25CC, 0x25CC, 0x21BF, 0x25CE, 0x25CE, 0x00A1, 0x25CF, 0x25CF, 0x00A0,
- 0x25D0, 0x25D1, 0x00E6, 0x25E6, 0x25E6, 0x2247, 0x25EF, 0x25EF, 0x21B9,
- 0x2605, 0x2605, 0x009E, 0x2606, 0x2606, 0x009D, 0x260E, 0x260E, 0x00F1,
- 0x260F, 0x260F, 0x00F0, 0x261C, 0x261C, 0x00F2, 0x261D, 0x261D, 0x2406,
- 0x261E, 0x261E, 0x00F3, 0x261F, 0x261F, 0x2407, 0x262F, 0x262F, 0x21D8,
- 0x2640, 0x2640, 0x0093, 0x2642, 0x2642, 0x0092, 0x2660, 0x2661, 0x00DE,
- 0x2663, 0x2663, 0x00E2, 0x2664, 0x2664, 0x00DD, 0x2665, 0x2665, 0x00E0,
- 0x2667, 0x2667, 0x00E1, 0x2668, 0x2668, 0x00EF, 0x2669, 0x266A, 0x00FD,
- 0x266C, 0x266C, 0x00FF, 0x266D, 0x266D, 0x00FC, 0x266F, 0x266F, 0x2192,
- 0x2716, 0x2716, 0x21B7, 0x271A, 0x271A, 0x21B6, 0x273D, 0x273D, 0x219C,
- 0x2756, 0x2756, 0x21BD, 0x2776, 0x277F, 0x21E1, 0x278A, 0x2793, 0x2096,
- 0x3000, 0x3002, 0x0065, 0x3003, 0x3003, 0x006C, 0x3008, 0x3011, 0x0078,
- 0x3012, 0x3012, 0x21FC, 0x3013, 0x3013, 0x00AF, 0x3014, 0x3015, 0x0076,
- 0x3016, 0x3019, 0x201B, 0x301E, 0x301F, 0x246A, 0x3020, 0x3020, 0x21DF,
- 0x3036, 0x3036, 0x21FD, 0x3041, 0x3093, 0x0353, 0x30A1, 0x30F6, 0x03A6,
- 0x30FB, 0x30FB, 0x0068, 0x30FC, 0x30FC, 0x2472, 0x3131, 0x3163, 0x0166,
- 0x3164, 0x3164, 0x0065, 0x3165, 0x318E, 0x0199, 0x3200, 0x321B, 0x0305,
- 0x321C, 0x321C, 0x0101, 0x3231, 0x3231, 0x2254, 0x3239, 0x3239, 0x2255,
- 0x3260, 0x327B, 0x02A7, 0x327F, 0x327F, 0x0100, 0x328A, 0x328F, 0x2455,
- 0x3290, 0x3290, 0x2454, 0x3294, 0x3294, 0x2378, 0x329E, 0x329E, 0x2239,
- 0x32A5, 0x32A5, 0x2388, 0x3380, 0x3384, 0x0273, 0x3388, 0x3389, 0x0264,
- 0x338A, 0x338C, 0x0286, 0x338D, 0x338F, 0x0260, 0x3390, 0x3394, 0x027E,
- 0x3395, 0x3397, 0x024B, 0x3398, 0x3398, 0x024F, 0x3399, 0x33A2, 0x0255,
- 0x33A3, 0x33A6, 0x0251, 0x33A7, 0x33A8, 0x0267, 0x33A9, 0x33AC, 0x028F,
- 0x33AD, 0x33AF, 0x028B, 0x33B0, 0x33B9, 0x0269, 0x33BA, 0x33BF, 0x0278,
- 0x33C0, 0x33C1, 0x0284, 0x33C2, 0x33C2, 0x0105, 0x33C3, 0x33C3, 0x0296,
- 0x33C4, 0x33C4, 0x0250, 0x33C5, 0x33C5, 0x028A, 0x33C6, 0x33C6, 0x0299,
- 0x33C7, 0x33C7, 0x0103, 0x33C8, 0x33C8, 0x0266, 0x33C9, 0x33C9, 0x0297,
- 0x33CA, 0x33CA, 0x025F, 0x33CB, 0x33CB, 0x2256, 0x33CF, 0x33CF, 0x0263,
- 0x33D0, 0x33D0, 0x0294, 0x33D3, 0x33D3, 0x0295, 0x33D6, 0x33D6, 0x0289,
- 0x33D8, 0x33D8, 0x0106, 0x33DB, 0x33DB, 0x028E, 0x33DC, 0x33DC, 0x0298,
- 0x33DD, 0x33DD, 0x0293, 0x4E00, 0x4E00, 0x193C, 0x4E01, 0x4E01, 0x1A30,
- 0x4E03, 0x4E03, 0x1CC4, 0x4E07, 0x4E07, 0x123E, 0x4E08, 0x4E08, 0x1986,
- 0x4E09, 0x4E09, 0x14C8, 0x4E0A, 0x4E0A, 0x14D3, 0x4E0B, 0x4E0B, 0x1DC0,
- 0x4E0D, 0x4E0D, 0x13F5, 0x4E11, 0x4E11, 0x1C78, 0x4E14, 0x4E14, 0x1B81,
- 0x4E15, 0x4E15, 0x143D, 0x4E16, 0x4E16, 0x1574, 0x4E18, 0x4E18, 0x0F35,
- 0x4E19, 0x4E19, 0x13B1, 0x4E1E, 0x4E1E, 0x1632, 0x4E2D, 0x4E2D, 0x1B0A,
- 0x4E32, 0x4E32, 0x0EDA, 0x4E38, 0x4E38, 0x1ECA, 0x4E39, 0x4E39, 0x1060,
- 0x4E3B, 0x4E3B, 0x1ACC, 0x4E42, 0x4E42, 0x178D, 0x4E43, 0x4E43, 0x103A,
- 0x4E45, 0x4E45, 0x0F36, 0x4E4B, 0x4E4B, 0x1B1E, 0x4E4D, 0x4E4D, 0x1479,
- 0x4E4E, 0x4E4E, 0x1E78, 0x4E4F, 0x4E4F, 0x1DBE, 0x4E56, 0x4E56, 0x0F0F,
- 0x4E58, 0x4E58, 0x1633, 0x4E59, 0x4E59, 0x18EC, 0x4E5D, 0x4E5D, 0x0F37,
- 0x4E5E, 0x4E5E, 0x0E1D, 0x4E5F, 0x4E5F, 0x16E6, 0x4E6B, 0x4E6B, 0x0DAC,
- 0x4E6D, 0x4E6D, 0x10E9, 0x4E73, 0x4E73, 0x18A5, 0x4E76, 0x4E76, 0x13E4,
- 0x4E77, 0x4E77, 0x14C3, 0x4E7E, 0x4E7E, 0x0E11, 0x4E82, 0x4E82, 0x1125,
- 0x4E86, 0x4E86, 0x11C7, 0x4E88, 0x4E88, 0x172E, 0x4E8B, 0x4E8B, 0x147A,
- 0x4E8C, 0x4E8C, 0x190D, 0x4E8E, 0x4E8E, 0x1835, 0x4E90, 0x4E90, 0x186C,
- 0x4E91, 0x4E91, 0x185E, 0x4E92, 0x4E92, 0x1E79, 0x4E94, 0x4E94, 0x17A1,
- 0x4E95, 0x4E95, 0x1A31, 0x4E98, 0x4E98, 0x0FDA, 0x4E9B, 0x4E9B, 0x147B,
- 0x4E9E, 0x4E9E, 0x168F, 0x4EA1, 0x4EA1, 0x1258, 0x4EA2, 0x4EA2, 0x1DF6,
- 0x4EA4, 0x4EA4, 0x0F1C, 0x4EA5, 0x4EA5, 0x1E05, 0x4EA6, 0x4EA6, 0x173B,
- 0x4EA8, 0x4EA8, 0x1E5B, 0x4EAB, 0x4EAB, 0x1E1E, 0x4EAC, 0x4EAC, 0x0E4C,
- 0x4EAD, 0x4EAD, 0x1A32, 0x4EAE, 0x4EAE, 0x114B, 0x4EB6, 0x4EB6, 0x1061,
- 0x4EBA, 0x4EBA, 0x192B, 0x4EC0, 0x4EC0, 0x168B, 0x4EC1, 0x4EC1, 0x192C,
- 0x4EC4, 0x4EC4, 0x1CA3, 0x4EC7, 0x4EC7, 0x0F38, 0x4ECA, 0x4ECA, 0x0FC6,
- 0x4ECB, 0x4ECB, 0x0DE8, 0x4ECD, 0x4ECD, 0x194F, 0x4ED4, 0x4ED4, 0x1953,
- 0x4ED5, 0x4ED5, 0x147C, 0x4ED6, 0x4ED6, 0x1CD4, 0x4ED7, 0x4ED7, 0x1987,
- 0x4ED8, 0x4ED8, 0x13F6, 0x4ED9, 0x4ED9, 0x152A, 0x4EDD, 0x4EDD, 0x10EB,
- 0x4EDF, 0x4EDF, 0x1BEC, 0x4EE3, 0x4EE3, 0x109A, 0x4EE4, 0x4EE4, 0x1189,
- 0x4EE5, 0x4EE5, 0x190E, 0x4EF0, 0x4EF0, 0x16C9, 0x4EF2, 0x4EF2, 0x1B0B,
- 0x4EF6, 0x4EF6, 0x0E12, 0x4EF7, 0x4EF7, 0x0DE9, 0x4EFB, 0x4EFB, 0x1945,
- 0x4F01, 0x4F01, 0x0FDE, 0x4F09, 0x4F09, 0x1DF7, 0x4F0A, 0x4F0A, 0x190F,
- 0x4F0B, 0x4F0B, 0x0FD3, 0x4F0D, 0x4F0D, 0x17A2, 0x4F0E, 0x4F0E, 0x0FDF,
- 0x4F0F, 0x4F0F, 0x13D2, 0x4F10, 0x4F10, 0x138D, 0x4F11, 0x4F11, 0x1F45,
- 0x4F2F, 0x4F2F, 0x137C, 0x4F34, 0x4F34, 0x1329, 0x4F36, 0x4F36, 0x118A,
- 0x4F38, 0x4F38, 0x1667, 0x4F3A, 0x4F3A, 0x147D, 0x4F3C, 0x4F3C, 0x147E,
- 0x4F3D, 0x4F3D, 0x0D6C, 0x4F43, 0x4F43, 0x19F3, 0x4F46, 0x4F46, 0x1062,
- 0x4F47, 0x4F47, 0x19BF, 0x4F48, 0x4F48, 0x1D78, 0x4F4D, 0x4F4D, 0x188C,
- 0x4F4E, 0x4F4E, 0x19C0, 0x4F4F, 0x4F4F, 0x1ACD, 0x4F50, 0x4F50, 0x1AC6,
- 0x4F51, 0x4F51, 0x1836, 0x4F55, 0x4F55, 0x1DC1, 0x4F59, 0x4F59, 0x172F,
- 0x4F5A, 0x4F5A, 0x193D, 0x4F5B, 0x4F5B, 0x1433, 0x4F5C, 0x4F5C, 0x196D,
- 0x4F69, 0x4F69, 0x1D4E, 0x4F6F, 0x4F6F, 0x16F7, 0x4F70, 0x4F70, 0x137D,
- 0x4F73, 0x4F73, 0x0D6D, 0x4F76, 0x4F76, 0x101F, 0x4F7A, 0x4F7A, 0x19F4,
- 0x4F7E, 0x4F7E, 0x193E, 0x4F7F, 0x4F7F, 0x147F, 0x4F81, 0x4F81, 0x1668,
- 0x4F83, 0x4F83, 0x0D94, 0x4F84, 0x4F84, 0x1B67, 0x4F86, 0x4F86, 0x1144,
- 0x4F88, 0x4F88, 0x1CA8, 0x4F8A, 0x4F8A, 0x0EFF, 0x4F8B, 0x4F8B, 0x119A,
- 0x4F8D, 0x4F8D, 0x163C, 0x4F8F, 0x4F8F, 0x1ACE, 0x4F91, 0x4F91, 0x18A6,
- 0x4F96, 0x4F96, 0x11F2, 0x4F98, 0x4F98, 0x1B82, 0x4F9B, 0x4F9B, 0x0ECA,
- 0x4F9D, 0x4F9D, 0x18FA, 0x4FAE, 0x4FAE, 0x129C, 0x4FAF, 0x4FAF, 0x1F1E,
- 0x4FB5, 0x4FB5, 0x1CC7, 0x4FB6, 0x4FB6, 0x1158, 0x4FBF, 0x4FBF, 0x1D5E,
- 0x4FC2, 0x4FC2, 0x0E79, 0x4FC3, 0x4FC3, 0x1C49, 0x4FC4, 0x4FC4, 0x1690,
- 0x4FC9, 0x4FC9, 0x17A3, 0x4FCA, 0x4FCA, 0x1AF6, 0x4FCE, 0x4FCE, 0x1A7E,
- 0x4FD1, 0x4FD1, 0x181E, 0x4FD3, 0x4FD3, 0x0E4D, 0x4FD4, 0x4FD4, 0x1E36,
- 0x4FD7, 0x4FD7, 0x15A1, 0x4FDA, 0x4FDA, 0x1205, 0x4FDD, 0x4FDD, 0x13C2,
- 0x4FDF, 0x4FDF, 0x1480, 0x4FE0, 0x4FE0, 0x1E4F, 0x4FE1, 0x4FE1, 0x1669,
- 0x4FEE, 0x4FEE, 0x15BF, 0x4FEF, 0x4FEF, 0x13F7, 0x4FF1, 0x4FF1, 0x0F39,
- 0x4FF3, 0x4FF3, 0x136A, 0x4FF5, 0x4FF5, 0x1D98, 0x4FF8, 0x4FF8, 0x13E5,
- 0x4FFA, 0x4FFA, 0x1725, 0x5002, 0x5002, 0x13B2, 0x5006, 0x5006, 0x114C,
- 0x5009, 0x5009, 0x1BB4, 0x500B, 0x500B, 0x0DEA, 0x500D, 0x500D, 0x1369,
- 0x5011, 0x5011, 0x12E4, 0x5012, 0x5012, 0x10AD, 0x5016, 0x5016, 0x1E19,
- 0x5019, 0x5019, 0x1F1F, 0x501A, 0x501A, 0x18FB, 0x501C, 0x501C, 0x1BDE,
- 0x501E, 0x501E, 0x0E4E, 0x501F, 0x501F, 0x1B83, 0x5021, 0x5021, 0x1BB5,
- 0x5023, 0x5023, 0x134D, 0x5024, 0x5024, 0x1CA9, 0x5026, 0x5026, 0x0F81,
- 0x5027, 0x5027, 0x1AB5, 0x5028, 0x5028, 0x0E01, 0x502A, 0x502A, 0x178E,
- 0x502B, 0x502B, 0x11F3, 0x502C, 0x502C, 0x1CE2, 0x502D, 0x502D, 0x17F3,
- 0x503B, 0x503B, 0x16E7, 0x5043, 0x5043, 0x171D, 0x5047, 0x5047, 0x0D6E,
- 0x5048, 0x5048, 0x0E2B, 0x5049, 0x5049, 0x188D, 0x504F, 0x504F, 0x1D5F,
- 0x5055, 0x5055, 0x1E06, 0x505A, 0x505A, 0x1ACF, 0x505C, 0x505C, 0x1A33,
- 0x5065, 0x5065, 0x0E13, 0x5074, 0x5074, 0x1CA2, 0x5075, 0x5075, 0x1A34,
- 0x5076, 0x5076, 0x1837, 0x5078, 0x5078, 0x1D29, 0x5080, 0x5080, 0x0F10,
- 0x5085, 0x5085, 0x13F8, 0x508D, 0x508D, 0x134E, 0x5091, 0x5091, 0x0E1E,
- 0x5098, 0x5098, 0x14B7, 0x5099, 0x5099, 0x143E, 0x50AC, 0x50AC, 0x1C5E,
- 0x50AD, 0x50AD, 0x181F, 0x50B2, 0x50B2, 0x17A4, 0x50B3, 0x50B3, 0x19F5,
- 0x50B5, 0x50B5, 0x1BCA, 0x50B7, 0x50B7, 0x14D4, 0x50BE, 0x50BE, 0x0E4F,
- 0x50C5, 0x50C5, 0x0FB7, 0x50C9, 0x50C9, 0x1C09, 0x50CA, 0x50CA, 0x152B,
- 0x50CF, 0x50CF, 0x14D5, 0x50D1, 0x50D1, 0x0F1D, 0x50D5, 0x50D5, 0x13D3,
- 0x50D6, 0x50D6, 0x1F63, 0x50DA, 0x50DA, 0x11C8, 0x50DE, 0x50DE, 0x188E,
- 0x50E5, 0x50E5, 0x17FC, 0x50E7, 0x50E7, 0x1634, 0x50ED, 0x50ED, 0x1BAA,
- 0x50F9, 0x50F9, 0x0D6F, 0x50FB, 0x50FB, 0x139C, 0x50FF, 0x50FF, 0x1481,
- 0x5100, 0x5100, 0x18FC, 0x5101, 0x5101, 0x1AF7, 0x5104, 0x5104, 0x1718,
- 0x5106, 0x5106, 0x0E50, 0x5109, 0x5109, 0x0E21, 0x5112, 0x5112, 0x18A7,
- 0x511F, 0x511F, 0x14D6, 0x5121, 0x5121, 0x11BF, 0x512A, 0x512A, 0x1838,
- 0x5132, 0x5132, 0x19C1, 0x5137, 0x5137, 0x1159, 0x513A, 0x513A, 0x1025,
- 0x513C, 0x513C, 0x1726, 0x5140, 0x5140, 0x17C9, 0x5141, 0x5141, 0x18D7,
- 0x5143, 0x5143, 0x186F, 0x5144, 0x5144, 0x1E5C, 0x5145, 0x5145, 0x1C8A,
- 0x5146, 0x5146, 0x1A7F, 0x5147, 0x5147, 0x1F4D, 0x5148, 0x5148, 0x152C,
- 0x5149, 0x5149, 0x0F00, 0x514B, 0x514B, 0x0FB0, 0x514C, 0x514C, 0x1D07,
- 0x514D, 0x514D, 0x127F, 0x514E, 0x514E, 0x1D19, 0x5152, 0x5152, 0x1691,
- 0x515C, 0x515C, 0x10FC, 0x5162, 0x5162, 0x0FDB, 0x5165, 0x5165, 0x194D,
- 0x5167, 0x5167, 0x103B, 0x5168, 0x5168, 0x19F6, 0x5169, 0x5169, 0x114D,
- 0x516A, 0x516A, 0x18A8, 0x516B, 0x516B, 0x1D4B, 0x516C, 0x516C, 0x0ECB,
- 0x516D, 0x516D, 0x11EF, 0x516E, 0x516E, 0x1E6F, 0x5171, 0x5171, 0x0ECC,
- 0x5175, 0x5175, 0x13B3, 0x5176, 0x5176, 0x0FE0, 0x5177, 0x5177, 0x0F3A,
- 0x5178, 0x5178, 0x19F7, 0x517C, 0x517C, 0x0E46, 0x5180, 0x5180, 0x0FE1,
- 0x5186, 0x5186, 0x172D, 0x518A, 0x518A, 0x1BD6, 0x518D, 0x518D, 0x19AA,
- 0x5192, 0x5192, 0x129D, 0x5195, 0x5195, 0x1280, 0x5197, 0x5197, 0x1820,
- 0x51A0, 0x51A0, 0x0EEB, 0x51A5, 0x51A5, 0x128C, 0x51AA, 0x51AA, 0x127D,
- 0x51AC, 0x51AC, 0x10EC, 0x51B6, 0x51B6, 0x16E8, 0x51B7, 0x51B7, 0x1148,
- 0x51BD, 0x51BD, 0x117D, 0x51C4, 0x51C4, 0x1BDA, 0x51C6, 0x51C6, 0x1AF8,
- 0x51C9, 0x51C9, 0x114E, 0x51CB, 0x51CB, 0x1A80, 0x51CC, 0x51CC, 0x11FF,
- 0x51CD, 0x51CD, 0x10ED, 0x51DC, 0x51DC, 0x11FE, 0x51DD, 0x51DD, 0x18F6,
- 0x51DE, 0x51DE, 0x1F64, 0x51E1, 0x51E1, 0x1391, 0x51F0, 0x51F0, 0x1EE0,
- 0x51F1, 0x51F1, 0x0DEB, 0x51F6, 0x51F6, 0x1F4E, 0x51F8, 0x51F8, 0x1BFF,
- 0x51F9, 0x51F9, 0x17FD, 0x51FA, 0x51FA, 0x1C87, 0x51FD, 0x51FD, 0x1DE3,
- 0x5200, 0x5200, 0x10AE, 0x5203, 0x5203, 0x192D, 0x5206, 0x5206, 0x1420,
- 0x5207, 0x5207, 0x1A1C, 0x5208, 0x5208, 0x178F, 0x520A, 0x520A, 0x0D95,
- 0x520E, 0x520E, 0x12E5, 0x5211, 0x5211, 0x1E5D, 0x5217, 0x5217, 0x117E,
- 0x521D, 0x521D, 0x1C2E, 0x5224, 0x5224, 0x1D42, 0x5225, 0x5225, 0x13AD,
- 0x5229, 0x5229, 0x1206, 0x522A, 0x522A, 0x14B8, 0x522E, 0x522E, 0x0EFB,
- 0x5230, 0x5230, 0x10AF, 0x5236, 0x5236, 0x1A67, 0x5237, 0x5237, 0x15B9,
- 0x5238, 0x5238, 0x0F82, 0x5239, 0x5239, 0x1BA5, 0x523A, 0x523A, 0x1954,
- 0x523B, 0x523B, 0x0D89, 0x5243, 0x5243, 0x1C25, 0x5247, 0x5247, 0x1CC0,
- 0x524A, 0x524A, 0x14B5, 0x524B, 0x524B, 0x0FB1, 0x524C, 0x524C, 0x112D,
- 0x524D, 0x524D, 0x19F8, 0x5254, 0x5254, 0x1BDF, 0x5256, 0x5256, 0x13F9,
- 0x525B, 0x525B, 0x0DD0, 0x525D, 0x525D, 0x1316, 0x5261, 0x5261, 0x1557,
- 0x5269, 0x5269, 0x1950, 0x526A, 0x526A, 0x19F9, 0x526F, 0x526F, 0x13FA,
- 0x5272, 0x5272, 0x1DE1, 0x5275, 0x5275, 0x1BB6, 0x527D, 0x527D, 0x1D99,
- 0x527F, 0x527F, 0x1C2F, 0x5283, 0x5283, 0x1F0C, 0x5287, 0x5287, 0x0FB2,
- 0x5288, 0x5288, 0x139D, 0x5289, 0x5289, 0x11E1, 0x528D, 0x528D, 0x0E22,
- 0x5291, 0x5291, 0x1A68, 0x5292, 0x5292, 0x0E23, 0x529B, 0x529B, 0x116A,
- 0x529F, 0x529F, 0x0ECD, 0x52A0, 0x52A0, 0x0D70, 0x52A3, 0x52A3, 0x117F,
- 0x52A4, 0x52A4, 0x0FB8, 0x52A9, 0x52A9, 0x1A81, 0x52AA, 0x52AA, 0x1049,
- 0x52AB, 0x52AB, 0x0E28, 0x52BE, 0x52BE, 0x1E17, 0x52C1, 0x52C1, 0x0E51,
- 0x52C3, 0x52C3, 0x1342, 0x52C5, 0x52C5, 0x1CC1, 0x52C7, 0x52C7, 0x1821,
- 0x52C9, 0x52C9, 0x1281, 0x52CD, 0x52CD, 0x0E52, 0x52D2, 0x52D2, 0x11FC,
- 0x52D5, 0x52D5, 0x10EE, 0x52D6, 0x52D6, 0x1855, 0x52D8, 0x52D8, 0x0DB6,
- 0x52D9, 0x52D9, 0x12CC, 0x52DB, 0x52DB, 0x1F2B, 0x52DD, 0x52DD, 0x1635,
- 0x52DE, 0x52DE, 0x119F, 0x52DF, 0x52DF, 0x129E, 0x52E2, 0x52E2, 0x1575,
- 0x52E3, 0x52E3, 0x19DB, 0x52E4, 0x52E4, 0x0FB9, 0x52F3, 0x52F3, 0x1F2C,
- 0x52F5, 0x52F5, 0x115A, 0x52F8, 0x52F8, 0x0F83, 0x52FA, 0x52FA, 0x196E,
- 0x52FB, 0x52FB, 0x0FA9, 0x52FE, 0x52FE, 0x0F3B, 0x52FF, 0x52FF, 0x12F0,
- 0x5305, 0x5305, 0x1D79, 0x5308, 0x5308, 0x1F4F, 0x530D, 0x530D, 0x1D7A,
- 0x530F, 0x530F, 0x1D7B, 0x5310, 0x5310, 0x13D4, 0x5315, 0x5315, 0x143F,
- 0x5316, 0x5316, 0x1EB7, 0x5317, 0x5317, 0x141F, 0x5319, 0x5319, 0x163D,
- 0x5320, 0x5320, 0x1988, 0x5321, 0x5321, 0x0F01, 0x5323, 0x5323, 0x0DCA,
- 0x532A, 0x532A, 0x1440, 0x532F, 0x532F, 0x1EF8, 0x5339, 0x5339, 0x1DB4,
- 0x533F, 0x533F, 0x105C, 0x5340, 0x5340, 0x0F3C, 0x5341, 0x5341, 0x168C,
- 0x5343, 0x5343, 0x1BED, 0x5344, 0x5344, 0x194E, 0x5347, 0x5347, 0x1636,
- 0x5348, 0x5348, 0x17A5, 0x5349, 0x5349, 0x1F3A, 0x534A, 0x534A, 0x132A,
- 0x534D, 0x534D, 0x123F, 0x5351, 0x5351, 0x1441, 0x5352, 0x5352, 0x1AB2,
- 0x5353, 0x5353, 0x1CE3, 0x5354, 0x5354, 0x1E50, 0x5357, 0x5357, 0x1031,
- 0x535A, 0x535A, 0x1317, 0x535C, 0x535C, 0x13D5, 0x535E, 0x535E, 0x13A7,
- 0x5360, 0x5360, 0x1A24, 0x5366, 0x5366, 0x0F0C, 0x5368, 0x5368, 0x154A,
- 0x536F, 0x536F, 0x12C0, 0x5370, 0x5370, 0x192E, 0x5371, 0x5371, 0x188F,
- 0x5374, 0x5374, 0x0D8A, 0x5375, 0x5375, 0x1126, 0x5377, 0x5377, 0x0F84,
- 0x537D, 0x537D, 0x1B0E, 0x537F, 0x537F, 0x0E53, 0x5384, 0x5384, 0x16DB,
- 0x5393, 0x5393, 0x16D0, 0x5398, 0x5398, 0x1207, 0x539A, 0x539A, 0x1F20,
- 0x539F, 0x539F, 0x1870, 0x53A0, 0x53A0, 0x1CA4, 0x53A5, 0x53A5, 0x0F8B,
- 0x53A6, 0x53A6, 0x1DC2, 0x53AD, 0x53AD, 0x1765, 0x53BB, 0x53BB, 0x0E02,
- 0x53C3, 0x53C3, 0x1BAB, 0x53C8, 0x53C8, 0x1839, 0x53C9, 0x53C9, 0x1B84,
- 0x53CA, 0x53CA, 0x0FD4, 0x53CB, 0x53CB, 0x183A, 0x53CD, 0x53CD, 0x132B,
- 0x53D4, 0x53D4, 0x15FC, 0x53D6, 0x53D6, 0x1C94, 0x53D7, 0x53D7, 0x15C0,
- 0x53DB, 0x53DB, 0x132C, 0x53E1, 0x53E1, 0x1790, 0x53E2, 0x53E2, 0x1C53,
- 0x53E3, 0x53E3, 0x0F3D, 0x53E4, 0x53E4, 0x0E91, 0x53E5, 0x53E5, 0x0F3E,
- 0x53E9, 0x53E9, 0x0E92, 0x53EA, 0x53EA, 0x1B1F, 0x53EB, 0x53EB, 0x0F9A,
- 0x53EC, 0x53EC, 0x157C, 0x53ED, 0x53ED, 0x1D4C, 0x53EF, 0x53EF, 0x0D71,
- 0x53F0, 0x53F0, 0x1D08, 0x53F1, 0x53F1, 0x1B68, 0x53F2, 0x53F2, 0x1482,
- 0x53F3, 0x53F3, 0x183B, 0x53F8, 0x53F8, 0x1483, 0x5403, 0x5403, 0x1F57,
- 0x5404, 0x5404, 0x0D8B, 0x5408, 0x5408, 0x1DEF, 0x5409, 0x5409, 0x1020,
- 0x540A, 0x540A, 0x19DC, 0x540C, 0x540C, 0x10EF, 0x540D, 0x540D, 0x128D,
- 0x540E, 0x540E, 0x1F21, 0x540F, 0x540F, 0x1208, 0x5410, 0x5410, 0x1D1A,
- 0x5411, 0x5411, 0x1E1F, 0x541B, 0x541B, 0x0F71, 0x541D, 0x541D, 0x121E,
- 0x541F, 0x541F, 0x18ED, 0x5420, 0x5420, 0x1D6E, 0x5426, 0x5426, 0x13FB,
- 0x5429, 0x5429, 0x1421, 0x542B, 0x542B, 0x1DE4, 0x5433, 0x5433, 0x17A7,
- 0x5438, 0x5438, 0x1F5E, 0x5439, 0x5439, 0x1C95, 0x543B, 0x543B, 0x12E6,
- 0x543C, 0x543C, 0x1F22, 0x543E, 0x543E, 0x17A6, 0x5442, 0x5442, 0x115B,
- 0x5448, 0x5448, 0x1A35, 0x544A, 0x544A, 0x0E93, 0x5451, 0x5451, 0x1CF0,
- 0x5468, 0x5468, 0x1AD3, 0x546A, 0x546A, 0x1AD2, 0x5471, 0x5471, 0x0E94,
- 0x5473, 0x5473, 0x12F3, 0x5475, 0x5475, 0x0D72, 0x547B, 0x547B, 0x166A,
- 0x547C, 0x547C, 0x1E7A, 0x547D, 0x547D, 0x128E, 0x5480, 0x5480, 0x19C2,
- 0x5486, 0x5486, 0x1D7C, 0x548C, 0x548C, 0x1EB8, 0x548E, 0x548E, 0x0F3F,
- 0x5490, 0x5490, 0x13FC, 0x54A4, 0x54A4, 0x1CD5, 0x54A8, 0x54A8, 0x1955,
- 0x54AB, 0x54AB, 0x1B20, 0x54AC, 0x54AC, 0x0F1E, 0x54B3, 0x54B3, 0x1E07,
- 0x54B8, 0x54B8, 0x1DE5, 0x54BD, 0x54BD, 0x192F, 0x54C0, 0x54C0, 0x16D1,
- 0x54C1, 0x54C1, 0x1DA6, 0x54C4, 0x54C4, 0x1EAD, 0x54C8, 0x54C8, 0x1DF0,
- 0x54C9, 0x54C9, 0x19AB, 0x54E1, 0x54E1, 0x1871, 0x54E5, 0x54E5, 0x0D73,
- 0x54E8, 0x54E8, 0x1C30, 0x54ED, 0x54ED, 0x0EB7, 0x54EE, 0x54EE, 0x1F11,
- 0x54F2, 0x54F2, 0x1C00, 0x54FA, 0x54FA, 0x1D7D, 0x5504, 0x5504, 0x1D4F,
- 0x5506, 0x5506, 0x1484, 0x5507, 0x5507, 0x1B44, 0x550E, 0x550E, 0x1209,
- 0x5510, 0x5510, 0x108F, 0x551C, 0x551C, 0x1251, 0x552F, 0x552F, 0x18A9,
- 0x5531, 0x5531, 0x1BB7, 0x5535, 0x5535, 0x16BD, 0x553E, 0x553E, 0x1CD6,
- 0x5544, 0x5544, 0x1CE4, 0x5546, 0x5546, 0x14D7, 0x554F, 0x554F, 0x12E7,
- 0x5553, 0x5553, 0x0E7A, 0x5556, 0x5556, 0x1079, 0x555E, 0x555E, 0x1692,
- 0x5563, 0x5563, 0x1DE6, 0x557C, 0x557C, 0x1A69, 0x5580, 0x5580, 0x0DFB,
- 0x5584, 0x5584, 0x152D, 0x5586, 0x5586, 0x1C01, 0x5587, 0x5587, 0x1116,
- 0x5589, 0x5589, 0x1F23, 0x558A, 0x558A, 0x1DE7, 0x5598, 0x5598, 0x1BEE,
- 0x5599, 0x5599, 0x1F3B, 0x559A, 0x559A, 0x1ECB, 0x559C, 0x559C, 0x1F65,
- 0x559D, 0x559D, 0x0DAD, 0x55A7, 0x55A7, 0x1F36, 0x55A9, 0x55A9, 0x18AA,
- 0x55AA, 0x55AA, 0x14D8, 0x55AB, 0x55AB, 0x1024, 0x55AC, 0x55AC, 0x0F1F,
- 0x55AE, 0x55AE, 0x1063, 0x55C5, 0x55C5, 0x1F24, 0x55C7, 0x55C7, 0x14F5,
- 0x55D4, 0x55D4, 0x1B45, 0x55DA, 0x55DA, 0x17A8, 0x55DC, 0x55DC, 0x0FE2,
- 0x55DF, 0x55DF, 0x1B85, 0x55E3, 0x55E3, 0x1485, 0x55E4, 0x55E4, 0x1CAA,
- 0x55FD, 0x55FD, 0x15C1, 0x55FE, 0x55FE, 0x1AD4, 0x5606, 0x5606, 0x1CF1,
- 0x5609, 0x5609, 0x0D74, 0x5614, 0x5614, 0x0F40, 0x5617, 0x5617, 0x14D9,
- 0x562F, 0x562F, 0x157D, 0x5632, 0x5632, 0x1A82, 0x5634, 0x5634, 0x1C96,
- 0x5636, 0x5636, 0x163E, 0x5653, 0x5653, 0x1E27, 0x5668, 0x5668, 0x0FE3,
- 0x566B, 0x566B, 0x1F66, 0x5674, 0x5674, 0x1422, 0x5686, 0x5686, 0x1F12,
- 0x56A5, 0x56A5, 0x1744, 0x56AC, 0x56AC, 0x1467, 0x56AE, 0x56AE, 0x1E20,
- 0x56B4, 0x56B4, 0x1727, 0x56BC, 0x56BC, 0x196F, 0x56CA, 0x56CA, 0x1038,
- 0x56CD, 0x56CD, 0x1F67, 0x56D1, 0x56D1, 0x1C4A, 0x56DA, 0x56DA, 0x15C2,
- 0x56DB, 0x56DB, 0x1486, 0x56DE, 0x56DE, 0x1EF9, 0x56E0, 0x56E0, 0x1930,
- 0x56F0, 0x56F0, 0x0EBE, 0x56F9, 0x56F9, 0x118B, 0x56FA, 0x56FA, 0x0E95,
- 0x5703, 0x5703, 0x1D7E, 0x5704, 0x5704, 0x170E, 0x5708, 0x5708, 0x0F85,
- 0x570B, 0x570B, 0x0F6B, 0x570D, 0x570D, 0x1890, 0x5712, 0x5712, 0x1873,
- 0x5713, 0x5713, 0x1872, 0x5716, 0x5716, 0x10B0, 0x5718, 0x5718, 0x1064,
- 0x571F, 0x571F, 0x1D1B, 0x5728, 0x5728, 0x19AC, 0x572D, 0x572D, 0x0F9B,
- 0x5730, 0x5730, 0x1B21, 0x573B, 0x573B, 0x0FE4, 0x5740, 0x5740, 0x1B22,
- 0x5742, 0x5742, 0x1D43, 0x5747, 0x5747, 0x0FAA, 0x574A, 0x574A, 0x134F,
- 0x574D, 0x574D, 0x107A, 0x574E, 0x574E, 0x0DB7, 0x5750, 0x5750, 0x1AC7,
- 0x5751, 0x5751, 0x0DFD, 0x5761, 0x5761, 0x1D32, 0x5764, 0x5764, 0x0EBF,
- 0x5766, 0x5766, 0x1CF2, 0x576A, 0x576A, 0x1D69, 0x576E, 0x576E, 0x109C,
- 0x5770, 0x5770, 0x0E54, 0x5775, 0x5775, 0x0F41, 0x577C, 0x577C, 0x1CE5,
- 0x5782, 0x5782, 0x15C3, 0x5788, 0x5788, 0x109B, 0x578B, 0x578B, 0x1E5E,
- 0x5793, 0x5793, 0x1E08, 0x57A0, 0x57A0, 0x18E5, 0x57A2, 0x57A2, 0x0F42,
- 0x57A3, 0x57A3, 0x1874, 0x57C3, 0x57C3, 0x16D2, 0x57C7, 0x57C7, 0x1822,
- 0x57C8, 0x57C8, 0x1AF9, 0x57CB, 0x57CB, 0x1264, 0x57CE, 0x57CE, 0x1562,
- 0x57DF, 0x57DF, 0x173C, 0x57E0, 0x57E0, 0x13FD, 0x57F0, 0x57F0, 0x1BCB,
- 0x57F4, 0x57F4, 0x1658, 0x57F7, 0x57F7, 0x1B78, 0x57F9, 0x57F9, 0x136B,
- 0x57FA, 0x57FA, 0x0FE5, 0x57FC, 0x57FC, 0x0FE6, 0x5800, 0x5800, 0x0F77,
- 0x5802, 0x5802, 0x1090, 0x5805, 0x5805, 0x0E35, 0x5806, 0x5806, 0x1D23,
- 0x5808, 0x5808, 0x0DD1, 0x5809, 0x5809, 0x18D3, 0x580A, 0x580A, 0x16A1,
- 0x581E, 0x581E, 0x1C13, 0x5821, 0x5821, 0x13C3, 0x5824, 0x5824, 0x1A6A,
- 0x5827, 0x5827, 0x1745, 0x582A, 0x582A, 0x0DB8, 0x582F, 0x582F, 0x17FE,
- 0x5830, 0x5830, 0x171E, 0x5831, 0x5831, 0x13C4, 0x5834, 0x5834, 0x1989,
- 0x5835, 0x5835, 0x10B1, 0x583A, 0x583A, 0x0E7B, 0x584A, 0x584A, 0x0F11,
- 0x584B, 0x584B, 0x1772, 0x584F, 0x584F, 0x0DEC, 0x5851, 0x5851, 0x157E,
- 0x5854, 0x5854, 0x1D00, 0x5857, 0x5857, 0x10B2, 0x5858, 0x5858, 0x1091,
- 0x585A, 0x585A, 0x1C54, 0x585E, 0x585E, 0x14F2, 0x5861, 0x5861, 0x19FA,
- 0x5862, 0x5862, 0x17A9, 0x5864, 0x5864, 0x1F2D, 0x5875, 0x5875, 0x1B46,
- 0x5879, 0x5879, 0x1BAC, 0x587C, 0x587C, 0x19FB, 0x587E, 0x587E, 0x15FD,
- 0x5883, 0x5883, 0x0E55, 0x5885, 0x5885, 0x14FD, 0x5889, 0x5889, 0x1823,
- 0x5893, 0x5893, 0x12C1, 0x589C, 0x589C, 0x1C61, 0x589E, 0x589E, 0x1B13,
- 0x589F, 0x589F, 0x1E28, 0x58A8, 0x58A8, 0x12E2, 0x58A9, 0x58A9, 0x10DF,
- 0x58AE, 0x58AE, 0x1CD7, 0x58B3, 0x58B3, 0x1423, 0x58BA, 0x58BA, 0x17AA,
- 0x58BB, 0x58BB, 0x198A, 0x58BE, 0x58BE, 0x0D96, 0x58C1, 0x58C1, 0x139E,
- 0x58C5, 0x58C5, 0x17CA, 0x58C7, 0x58C7, 0x1065, 0x58CE, 0x58CE, 0x1F2E,
- 0x58D1, 0x58D1, 0x1DCE, 0x58D3, 0x58D3, 0x16C5, 0x58D5, 0x58D5, 0x1E7B,
- 0x58D8, 0x58D8, 0x11D4, 0x58D9, 0x58D9, 0x0F02, 0x58DE, 0x58DE, 0x0F12,
- 0x58DF, 0x58DF, 0x11B8, 0x58E4, 0x58E4, 0x16F8, 0x58EB, 0x58EB, 0x1487,
- 0x58EC, 0x58EC, 0x1946, 0x58EF, 0x58EF, 0x198B, 0x58F9, 0x58F9, 0x193F,
- 0x58FA, 0x58FA, 0x1E7C, 0x58FB, 0x58FB, 0x14FE, 0x58FD, 0x58FD, 0x15C4,
- 0x590F, 0x590F, 0x1DC3, 0x5914, 0x5914, 0x0FE7, 0x5915, 0x5915, 0x151B,
- 0x5916, 0x5916, 0x17F7, 0x5919, 0x5919, 0x15FE, 0x591A, 0x591A, 0x105E,
- 0x591C, 0x591C, 0x16E9, 0x5922, 0x5922, 0x12BD, 0x5927, 0x5927, 0x109D,
- 0x5929, 0x5929, 0x1BEF, 0x592A, 0x592A, 0x1D09, 0x592B, 0x592B, 0x13FE,
- 0x592D, 0x592D, 0x17FF, 0x592E, 0x592E, 0x16CA, 0x5931, 0x5931, 0x167E,
- 0x5937, 0x5937, 0x1910, 0x593E, 0x593E, 0x1E51, 0x5944, 0x5944, 0x1728,
- 0x5947, 0x5947, 0x0FE8, 0x5948, 0x5948, 0x103C, 0x5949, 0x5949, 0x13E6,
- 0x594E, 0x594E, 0x0F9C, 0x594F, 0x594F, 0x1AD5, 0x5950, 0x5950, 0x1ECC,
- 0x5951, 0x5951, 0x0E7C, 0x5954, 0x5954, 0x1424, 0x5955, 0x5955, 0x1E32,
- 0x5957, 0x5957, 0x1D2A, 0x595A, 0x595A, 0x1E09, 0x5960, 0x5960, 0x19FC,
- 0x5962, 0x5962, 0x1488, 0x5967, 0x5967, 0x17AB, 0x596A, 0x596A, 0x1CFA,
- 0x596B, 0x596B, 0x18D8, 0x596C, 0x596C, 0x198C, 0x596D, 0x596D, 0x151C,
- 0x596E, 0x596E, 0x1425, 0x5973, 0x5973, 0x103F, 0x5974, 0x5974, 0x104A,
- 0x5978, 0x5978, 0x0D97, 0x597D, 0x597D, 0x1E7D, 0x5982, 0x5982, 0x1730,
- 0x5983, 0x5983, 0x1442, 0x5984, 0x5984, 0x1259, 0x598A, 0x598A, 0x1947,
- 0x5993, 0x5993, 0x0FE9, 0x5996, 0x5996, 0x1800, 0x5997, 0x5997, 0x0FC7,
- 0x5999, 0x5999, 0x12C2, 0x59A5, 0x59A5, 0x1CD8, 0x59A8, 0x59A8, 0x1350,
- 0x59AC, 0x59AC, 0x1D2B, 0x59B9, 0x59B9, 0x1265, 0x59BB, 0x59BB, 0x1BDB,
- 0x59BE, 0x59BE, 0x1C14, 0x59C3, 0x59C3, 0x1A36, 0x59C6, 0x59C6, 0x129F,
- 0x59C9, 0x59C9, 0x1956, 0x59CB, 0x59CB, 0x163F, 0x59D0, 0x59D0, 0x19C3,
- 0x59D1, 0x59D1, 0x0E96, 0x59D3, 0x59D3, 0x1563, 0x59D4, 0x59D4, 0x1891,
- 0x59D9, 0x59D9, 0x1948, 0x59DA, 0x59DA, 0x1801, 0x59DC, 0x59DC, 0x0DD2,
- 0x59DD, 0x59DD, 0x1AD0, 0x59E6, 0x59E6, 0x0D98, 0x59E8, 0x59E8, 0x1911,
- 0x59EA, 0x59EA, 0x1B69, 0x59EC, 0x59EC, 0x1F68, 0x59EE, 0x59EE, 0x1DF8,
- 0x59F8, 0x59F8, 0x1746, 0x59FB, 0x59FB, 0x1931, 0x59FF, 0x59FF, 0x1957,
- 0x5A01, 0x5A01, 0x1892, 0x5A03, 0x5A03, 0x17F4, 0x5A11, 0x5A11, 0x1489,
- 0x5A18, 0x5A18, 0x1039, 0x5A1B, 0x5A1B, 0x17AC, 0x5A1C, 0x5A1C, 0x1026,
- 0x5A1F, 0x5A1F, 0x1747, 0x5A20, 0x5A20, 0x166B, 0x5A25, 0x5A25, 0x1693,
- 0x5A29, 0x5A29, 0x1240, 0x5A36, 0x5A36, 0x1C97, 0x5A3C, 0x5A3C, 0x1BB8,
- 0x5A41, 0x5A41, 0x11D5, 0x5A46, 0x5A46, 0x1D33, 0x5A49, 0x5A49, 0x17DB,
- 0x5A5A, 0x5A5A, 0x1EA4, 0x5A62, 0x5A62, 0x1443, 0x5A66, 0x5A66, 0x13FF,
- 0x5A92, 0x5A92, 0x1266, 0x5A9A, 0x5A9A, 0x12F4, 0x5A9B, 0x5A9B, 0x1875,
- 0x5AA4, 0x5AA4, 0x1640, 0x5AC1, 0x5AC1, 0x0D75, 0x5AC2, 0x5AC2, 0x15C5,
- 0x5AC4, 0x5AC4, 0x1876, 0x5AC9, 0x5AC9, 0x1B6A, 0x5ACC, 0x5ACC, 0x1E4E,
- 0x5AE1, 0x5AE1, 0x19DD, 0x5AE6, 0x5AE6, 0x1DF9, 0x5AE9, 0x5AE9, 0x1055,
- 0x5B05, 0x5B05, 0x1EB9, 0x5B09, 0x5B09, 0x1F69, 0x5B0B, 0x5B0B, 0x152E,
- 0x5B0C, 0x5B0C, 0x0F20, 0x5B16, 0x5B16, 0x1D6F, 0x5B2A, 0x5B2A, 0x1468,
- 0x5B40, 0x5B40, 0x14DA, 0x5B43, 0x5B43, 0x16F9, 0x5B50, 0x5B50, 0x1958,
- 0x5B51, 0x5B51, 0x1E4A, 0x5B54, 0x5B54, 0x0ECE, 0x5B55, 0x5B55, 0x1951,
- 0x5B57, 0x5B57, 0x1959, 0x5B58, 0x5B58, 0x1AB0, 0x5B5A, 0x5B5A, 0x1400,
- 0x5B5C, 0x5B5C, 0x195A, 0x5B5D, 0x5B5D, 0x1F13, 0x5B5F, 0x5B5F, 0x1277,
- 0x5B63, 0x5B63, 0x0E7D, 0x5B64, 0x5B64, 0x0E97, 0x5B69, 0x5B69, 0x1E0A,
- 0x5B6B, 0x5B6B, 0x15AA, 0x5B70, 0x5B70, 0x15FF, 0x5B71, 0x5B71, 0x197A,
- 0x5B75, 0x5B75, 0x1401, 0x5B78, 0x5B78, 0x1DCF, 0x5B7A, 0x5B7A, 0x18AB,
- 0x5B7C, 0x5B7C, 0x1723, 0x5B85, 0x5B85, 0x10AA, 0x5B87, 0x5B87, 0x183C,
- 0x5B88, 0x5B88, 0x15C6, 0x5B89, 0x5B89, 0x16AF, 0x5B8B, 0x5B8B, 0x15B1,
- 0x5B8C, 0x5B8C, 0x17DC, 0x5B8F, 0x5B8F, 0x0F18, 0x5B93, 0x5B93, 0x13D6,
- 0x5B95, 0x5B95, 0x1D03, 0x5B96, 0x5B96, 0x1F0E, 0x5B97, 0x5B97, 0x1AB6,
- 0x5B98, 0x5B98, 0x0EEC, 0x5B99, 0x5B99, 0x1AD6, 0x5B9A, 0x5B9A, 0x1A37,
- 0x5B9B, 0x5B9B, 0x17DD, 0x5B9C, 0x5B9C, 0x18FD, 0x5BA2, 0x5BA2, 0x0DFC,
- 0x5BA3, 0x5BA3, 0x152F, 0x5BA4, 0x5BA4, 0x167F, 0x5BA5, 0x5BA5, 0x18AC,
- 0x5BA6, 0x5BA6, 0x1ECD, 0x5BAC, 0x5BAC, 0x1564, 0x5BAE, 0x5BAE, 0x0F7B,
- 0x5BB0, 0x5BB0, 0x19AD, 0x5BB3, 0x5BB3, 0x1E0B, 0x5BB4, 0x5BB4, 0x1748,
- 0x5BB5, 0x5BB5, 0x157F, 0x5BB6, 0x5BB6, 0x0D76, 0x5BB8, 0x5BB8, 0x166C,
- 0x5BB9, 0x5BB9, 0x1824, 0x5BBF, 0x5BBF, 0x1600, 0x5BC0, 0x5BC0, 0x1BCC,
- 0x5BC2, 0x5BC2, 0x19DE, 0x5BC3, 0x5BC3, 0x1877, 0x5BC4, 0x5BC4, 0x0FEA,
- 0x5BC5, 0x5BC5, 0x1932, 0x5BC6, 0x5BC6, 0x1313, 0x5BC7, 0x5BC7, 0x0F43,
- 0x5BCC, 0x5BCC, 0x1402, 0x5BD0, 0x5BD0, 0x1267, 0x5BD2, 0x5BD2, 0x1DD3,
- 0x5BD3, 0x5BD3, 0x183D, 0x5BD4, 0x5BD4, 0x1659, 0x5BD7, 0x5BD7, 0x1048,
- 0x5BDE, 0x5BDE, 0x1238, 0x5BDF, 0x5BDF, 0x1BA6, 0x5BE1, 0x5BE1, 0x0EDB,
- 0x5BE2, 0x5BE2, 0x1CC8, 0x5BE4, 0x5BE4, 0x17AD, 0x5BE5, 0x5BE5, 0x1802,
- 0x5BE6, 0x5BE6, 0x1680, 0x5BE7, 0x5BE7, 0x1047, 0x5BE8, 0x5BE8, 0x1BCD,
- 0x5BE9, 0x5BE9, 0x1682, 0x5BEB, 0x5BEB, 0x148A, 0x5BEC, 0x5BEC, 0x0EED,
- 0x5BEE, 0x5BEE, 0x11C9, 0x5BEF, 0x5BEF, 0x1AFA, 0x5BF5, 0x5BF5, 0x1C55,
- 0x5BF6, 0x5BF6, 0x13C5, 0x5BF8, 0x5BF8, 0x1C4F, 0x5BFA, 0x5BFA, 0x148B,
- 0x5C01, 0x5C01, 0x13E7, 0x5C04, 0x5C04, 0x148C, 0x5C07, 0x5C07, 0x198D,
- 0x5C08, 0x5C08, 0x19FD, 0x5C09, 0x5C09, 0x1893, 0x5C0A, 0x5C0A, 0x1AB1,
- 0x5C0B, 0x5C0B, 0x1683, 0x5C0D, 0x5C0D, 0x109E, 0x5C0E, 0x5C0E, 0x10B3,
- 0x5C0F, 0x5C0F, 0x1580, 0x5C11, 0x5C11, 0x1581, 0x5C16, 0x5C16, 0x1C0A,
- 0x5C19, 0x5C19, 0x14DB, 0x5C24, 0x5C24, 0x183E, 0x5C28, 0x5C28, 0x1351,
- 0x5C31, 0x5C31, 0x1C98, 0x5C38, 0x5C38, 0x1641, 0x5C39, 0x5C39, 0x18D9,
- 0x5C3A, 0x5C3A, 0x1BE0, 0x5C3B, 0x5C3B, 0x0E98, 0x5C3C, 0x5C3C, 0x105A,
- 0x5C3E, 0x5C3E, 0x12F5, 0x5C3F, 0x5C3F, 0x1054, 0x5C40, 0x5C40, 0x0F6C,
- 0x5C45, 0x5C45, 0x0E03, 0x5C46, 0x5C46, 0x0E7E, 0x5C48, 0x5C48, 0x0F78,
- 0x5C4B, 0x5C4B, 0x17BE, 0x5C4D, 0x5C4D, 0x1643, 0x5C4E, 0x5C4E, 0x1642,
- 0x5C51, 0x5C51, 0x154B, 0x5C55, 0x5C55, 0x19FE, 0x5C5B, 0x5C5B, 0x13B4,
- 0x5C60, 0x5C60, 0x10B4, 0x5C62, 0x5C62, 0x11D6, 0x5C64, 0x5C64, 0x1CA7,
- 0x5C65, 0x5C65, 0x120A, 0x5C6C, 0x5C6C, 0x15A2, 0x5C6F, 0x5C6F, 0x1106,
- 0x5C71, 0x5C71, 0x14B9, 0x5C79, 0x5C79, 0x1F58, 0x5C90, 0x5C90, 0x0FEB,
- 0x5C91, 0x5C91, 0x197F, 0x5CA1, 0x5CA1, 0x0DD3, 0x5CA9, 0x5CA9, 0x16BE,
- 0x5CAB, 0x5CAB, 0x15C7, 0x5CAC, 0x5CAC, 0x0DCB, 0x5CB1, 0x5CB1, 0x109F,
- 0x5CB3, 0x5CB3, 0x16A2, 0x5CB5, 0x5CB5, 0x1E7E, 0x5CB7, 0x5CB7, 0x1306,
- 0x5CB8, 0x5CB8, 0x16B0, 0x5CBA, 0x5CBA, 0x118C, 0x5CBE, 0x5CBE, 0x1A25,
- 0x5CC0, 0x5CC0, 0x15C8, 0x5CD9, 0x5CD9, 0x1CAB, 0x5CE0, 0x5CE0, 0x14DC,
- 0x5CE8, 0x5CE8, 0x1694, 0x5CEF, 0x5CF0, 0x13E8, 0x5CF4, 0x5CF4, 0x1E37,
- 0x5CF6, 0x5CF6, 0x10B5, 0x5CFB, 0x5CFB, 0x1AFB, 0x5CFD, 0x5CFD, 0x1E52,
- 0x5D07, 0x5D07, 0x1627, 0x5D0D, 0x5D0D, 0x1145, 0x5D0E, 0x5D0E, 0x0FEC,
- 0x5D11, 0x5D11, 0x0EC0, 0x5D14, 0x5D14, 0x1C5F, 0x5D16, 0x5D16, 0x16D3,
- 0x5D17, 0x5D17, 0x0DD4, 0x5D19, 0x5D19, 0x11F4, 0x5D27, 0x5D27, 0x1628,
- 0x5D29, 0x5D29, 0x1437, 0x5D4B, 0x5D4B, 0x12F6, 0x5D4C, 0x5D4C, 0x0DB9,
- 0x5D50, 0x5D50, 0x112F, 0x5D69, 0x5D69, 0x1629, 0x5D6C, 0x5D6C, 0x17F8,
- 0x5D6F, 0x5D6F, 0x1B86, 0x5D87, 0x5D87, 0x0F44, 0x5D8B, 0x5D8B, 0x10B6,
- 0x5D9D, 0x5D9D, 0x110D, 0x5DA0, 0x5DA0, 0x0F21, 0x5DA2, 0x5DA2, 0x1803,
- 0x5DAA, 0x5DAA, 0x172B, 0x5DB8, 0x5DB8, 0x1773, 0x5DBA, 0x5DBA, 0x118D,
- 0x5DBC, 0x5DBC, 0x14FF, 0x5DBD, 0x5DBD, 0x16A3, 0x5DCD, 0x5DCD, 0x17F9,
- 0x5DD2, 0x5DD2, 0x1241, 0x5DD6, 0x5DD6, 0x16BF, 0x5DDD, 0x5DDD, 0x1BF0,
- 0x5DDE, 0x5DDE, 0x1AD7, 0x5DE1, 0x5DE1, 0x1608, 0x5DE2, 0x5DE2, 0x1582,
- 0x5DE5, 0x5DE5, 0x0ECF, 0x5DE6, 0x5DE6, 0x1AC8, 0x5DE7, 0x5DE7, 0x0F22,
- 0x5DE8, 0x5DE8, 0x0E04, 0x5DEB, 0x5DEB, 0x12CD, 0x5DEE, 0x5DEE, 0x1B87,
- 0x5DF1, 0x5DF1, 0x0FED, 0x5DF2, 0x5DF2, 0x1912, 0x5DF3, 0x5DF3, 0x148D,
- 0x5DF4, 0x5DF4, 0x1D34, 0x5DF7, 0x5DF7, 0x1DFA, 0x5DFD, 0x5DFD, 0x15AB,
- 0x5DFE, 0x5DFE, 0x0E14, 0x5E02, 0x5E02, 0x1644, 0x5E03, 0x5E03, 0x1D7F,
- 0x5E06, 0x5E06, 0x1392, 0x5E0C, 0x5E0C, 0x1F6A, 0x5E11, 0x5E11, 0x1D04,
- 0x5E16, 0x5E16, 0x1C15, 0x5E19, 0x5E19, 0x1B6B, 0x5E1B, 0x5E1B, 0x137E,
- 0x5E1D, 0x5E1D, 0x1A6B, 0x5E25, 0x5E25, 0x15C9, 0x5E2B, 0x5E2B, 0x148E,
- 0x5E2D, 0x5E2D, 0x151D, 0x5E33, 0x5E33, 0x198E, 0x5E36, 0x5E36, 0x10A0,
- 0x5E38, 0x5E38, 0x14DD, 0x5E3D, 0x5E3D, 0x12A0, 0x5E3F, 0x5E3F, 0x1F25,
- 0x5E40, 0x5E40, 0x1A38, 0x5E44, 0x5E44, 0x16A4, 0x5E45, 0x5E45, 0x1D93,
- 0x5E47, 0x5E47, 0x1352, 0x5E4C, 0x5E4C, 0x1EE1, 0x5E55, 0x5E55, 0x1239,
- 0x5E5F, 0x5E5F, 0x1CAC, 0x5E61, 0x5E61, 0x1384, 0x5E62, 0x5E62, 0x1092,
- 0x5E63, 0x5E63, 0x1D70, 0x5E72, 0x5E72, 0x0D99, 0x5E73, 0x5E73, 0x1D6A,
- 0x5E74, 0x5E74, 0x1040, 0x5E77, 0x5E77, 0x13B5, 0x5E78, 0x5E78, 0x1E1A,
- 0x5E79, 0x5E79, 0x0D9A, 0x5E7B, 0x5E7B, 0x1ECE, 0x5E7C, 0x5E7D, 0x18AD,
- 0x5E7E, 0x5E7E, 0x0FEE, 0x5E84, 0x5E84, 0x198F, 0x5E87, 0x5E87, 0x1444,
- 0x5E8A, 0x5E8A, 0x14DE, 0x5E8F, 0x5E8F, 0x1500, 0x5E95, 0x5E95, 0x19C4,
- 0x5E97, 0x5E97, 0x1A26, 0x5E9A, 0x5E9A, 0x0E56, 0x5E9C, 0x5E9C, 0x1403,
- 0x5EA0, 0x5EA0, 0x14DF, 0x5EA6, 0x5EA6, 0x10B7, 0x5EA7, 0x5EA7, 0x1AC9,
- 0x5EAB, 0x5EAB, 0x0E99, 0x5EAD, 0x5EAD, 0x1A39, 0x5EB5, 0x5EB5, 0x16C0,
- 0x5EB6, 0x5EB6, 0x1501, 0x5EB7, 0x5EB7, 0x0DD5, 0x5EB8, 0x5EB8, 0x1825,
- 0x5EBE, 0x5EBE, 0x18AF, 0x5EC2, 0x5EC2, 0x14E0, 0x5EC8, 0x5EC8, 0x1DC4,
- 0x5EC9, 0x5EC9, 0x1183, 0x5ECA, 0x5ECA, 0x113C, 0x5ED0, 0x5ED0, 0x0F45,
- 0x5ED3, 0x5ED3, 0x0EE7, 0x5ED6, 0x5ED6, 0x11CA, 0x5EDA, 0x5EDA, 0x1AD8,
- 0x5EDB, 0x5EDB, 0x19FF, 0x5EDF, 0x5EDF, 0x12C3, 0x5EE0, 0x5EE0, 0x1BB9,
- 0x5EE2, 0x5EE2, 0x1D71, 0x5EE3, 0x5EE3, 0x0F03, 0x5EEC, 0x5EEC, 0x115C,
- 0x5EF3, 0x5EF3, 0x1C1D, 0x5EF6, 0x5EF6, 0x1749, 0x5EF7, 0x5EF7, 0x1A3A,
- 0x5EFA, 0x5EFA, 0x0E15, 0x5EFB, 0x5EFB, 0x1EFA, 0x5F01, 0x5F01, 0x13A8,
- 0x5F04, 0x5F04, 0x11B9, 0x5F0A, 0x5F0A, 0x1D72, 0x5F0F, 0x5F0F, 0x165A,
- 0x5F11, 0x5F11, 0x1645, 0x5F13, 0x5F13, 0x0F7C, 0x5F14, 0x5F14, 0x1A83,
- 0x5F15, 0x5F15, 0x1933, 0x5F17, 0x5F17, 0x1434, 0x5F18, 0x5F18, 0x1EAE,
- 0x5F1B, 0x5F1B, 0x1913, 0x5F1F, 0x5F1F, 0x1A6C, 0x5F26, 0x5F26, 0x1E38,
- 0x5F27, 0x5F27, 0x1E7F, 0x5F29, 0x5F29, 0x104B, 0x5F31, 0x5F31, 0x16F0,
- 0x5F35, 0x5F35, 0x1990, 0x5F3A, 0x5F3A, 0x0DD6, 0x5F3C, 0x5F3C, 0x1DB5,
- 0x5F48, 0x5F48, 0x1CF3, 0x5F4A, 0x5F4A, 0x0DD7, 0x5F4C, 0x5F4C, 0x12F7,
- 0x5F4E, 0x5F4E, 0x1242, 0x5F56, 0x5F56, 0x1066, 0x5F57, 0x5F57, 0x1E70,
- 0x5F59, 0x5F59, 0x1F3D, 0x5F5B, 0x5F5B, 0x1914, 0x5F62, 0x5F62, 0x1E5F,
- 0x5F66, 0x5F66, 0x171F, 0x5F67, 0x5F67, 0x1856, 0x5F69, 0x5F69, 0x1BCE,
- 0x5F6A, 0x5F6A, 0x1D9A, 0x5F6B, 0x5F6B, 0x1A84, 0x5F6C, 0x5F6C, 0x1469,
- 0x5F6D, 0x5F6D, 0x1D59, 0x5F70, 0x5F70, 0x1BBA, 0x5F71, 0x5F71, 0x1774,
- 0x5F77, 0x5F77, 0x1353, 0x5F79, 0x5F79, 0x173D, 0x5F7C, 0x5F7C, 0x1DAD,
- 0x5F7F, 0x5F7F, 0x1435, 0x5F80, 0x5F80, 0x17EE, 0x5F81, 0x5F81, 0x1A3B,
- 0x5F85, 0x5F85, 0x10A1, 0x5F87, 0x5F87, 0x1609, 0x5F8A, 0x5F8A, 0x1EFB,
- 0x5F8B, 0x5F8B, 0x11F8, 0x5F8C, 0x5F8C, 0x1F26, 0x5F90, 0x5F90, 0x1502,
- 0x5F91, 0x5F91, 0x0E57, 0x5F92, 0x5F92, 0x10B8, 0x5F97, 0x5F97, 0x110C,
- 0x5F98, 0x5F98, 0x136C, 0x5F99, 0x5F99, 0x148F, 0x5F9E, 0x5F9E, 0x1AB7,
- 0x5FA0, 0x5FA0, 0x1146, 0x5FA1, 0x5FA1, 0x170F, 0x5FA8, 0x5FA8, 0x1EE2,
- 0x5FA9, 0x5FA9, 0x13D7, 0x5FAA, 0x5FAA, 0x160A, 0x5FAE, 0x5FAE, 0x12F8,
- 0x5FB5, 0x5FB5, 0x1B7E, 0x5FB7, 0x5FB7, 0x10AB, 0x5FB9, 0x5FB9, 0x1C02,
- 0x5FBD, 0x5FBD, 0x1F3E, 0x5FC3, 0x5FC3, 0x1684, 0x5FC5, 0x5FC5, 0x1DB6,
- 0x5FCC, 0x5FCC, 0x0FEF, 0x5FCD, 0x5FCD, 0x1934, 0x5FD6, 0x5FD6, 0x1C50,
- 0x5FD7, 0x5FD7, 0x1B23, 0x5FD8, 0x5FD9, 0x125A, 0x5FE0, 0x5FE0, 0x1C8B,
- 0x5FEB, 0x5FEB, 0x1CD3, 0x5FF5, 0x5FF5, 0x1043, 0x5FFD, 0x5FFD, 0x1EAA,
- 0x5FFF, 0x5FFF, 0x1426, 0x600F, 0x600F, 0x16CB, 0x6012, 0x6012, 0x104C,
- 0x6016, 0x6016, 0x1D80, 0x601C, 0x601C, 0x118E, 0x601D, 0x601D, 0x1490,
- 0x6020, 0x6020, 0x1D0A, 0x6021, 0x6021, 0x1915, 0x6025, 0x6025, 0x0FD5,
- 0x6027, 0x6027, 0x1565, 0x6028, 0x6028, 0x1878, 0x602A, 0x602A, 0x0F13,
- 0x602F, 0x602F, 0x0E29, 0x6041, 0x6041, 0x1949, 0x6042, 0x6042, 0x160B,
- 0x6043, 0x6043, 0x1646, 0x604D, 0x604D, 0x1EE3, 0x6050, 0x6050, 0x0ED0,
- 0x6052, 0x6052, 0x1DFB, 0x6055, 0x6055, 0x1503, 0x6059, 0x6059, 0x16FA,
- 0x605D, 0x605D, 0x0EFC, 0x6062, 0x6062, 0x1EFC, 0x6063, 0x6063, 0x195B,
- 0x6064, 0x6064, 0x1F4A, 0x6065, 0x6065, 0x1CAD, 0x6068, 0x6068, 0x1DD4,
- 0x6069, 0x6069, 0x18E6, 0x606A, 0x606A, 0x0D8C, 0x606C, 0x606C, 0x1044,
- 0x606D, 0x606D, 0x0ED1, 0x606F, 0x606F, 0x165B, 0x6070, 0x6070, 0x1F5F,
- 0x6085, 0x6085, 0x1761, 0x6089, 0x6089, 0x1681, 0x608C, 0x608C, 0x1A6D,
- 0x608D, 0x608D, 0x1DD5, 0x6094, 0x6094, 0x1EFD, 0x6096, 0x6096, 0x1D50,
- 0x609A, 0x609A, 0x15B2, 0x609B, 0x609B, 0x1A00, 0x609F, 0x609F, 0x17AE,
- 0x60A0, 0x60A0, 0x18B0, 0x60A3, 0x60A3, 0x1ECF, 0x60A4, 0x60A4, 0x1C56,
- 0x60A7, 0x60A7, 0x120B, 0x60B0, 0x60B0, 0x1AB8, 0x60B2, 0x60B2, 0x1445,
- 0x60B3, 0x60B3, 0x10AC, 0x60B4, 0x60B4, 0x1C90, 0x60B6, 0x60B6, 0x1307,
- 0x60B8, 0x60B8, 0x0E7F, 0x60BC, 0x60BC, 0x10B9, 0x60BD, 0x60BD, 0x1BDC,
- 0x60C5, 0x60C5, 0x1A3C, 0x60C7, 0x60C7, 0x10E0, 0x60D1, 0x60D1, 0x1EA1,
- 0x60DA, 0x60DA, 0x1EAB, 0x60DC, 0x60DC, 0x151E, 0x60DF, 0x60DF, 0x18B1,
- 0x60E0, 0x60E0, 0x1E71, 0x60E1, 0x60E1, 0x16A5, 0x60F0, 0x60F0, 0x1CD9,
- 0x60F1, 0x60F1, 0x1052, 0x60F3, 0x60F3, 0x14E1, 0x60F6, 0x60F6, 0x1EE4,
- 0x60F9, 0x60F9, 0x16EA, 0x60FA, 0x60FA, 0x1566, 0x60FB, 0x60FB, 0x1CA5,
- 0x6101, 0x6101, 0x15CA, 0x6106, 0x6106, 0x0E16, 0x6108, 0x6109, 0x18B2,
- 0x610D, 0x610D, 0x1308, 0x610E, 0x610E, 0x1D5D, 0x610F, 0x610F, 0x18FE,
- 0x6115, 0x6115, 0x16A6, 0x611A, 0x611A, 0x183F, 0x611B, 0x611B, 0x16D4,
- 0x611F, 0x611F, 0x0DBA, 0x6127, 0x6127, 0x0F14, 0x6130, 0x6130, 0x1EE5,
- 0x6134, 0x6134, 0x1BBB, 0x6137, 0x6137, 0x0DED, 0x613C, 0x613C, 0x166D,
- 0x613E, 0x613E, 0x0DEE, 0x613F, 0x613F, 0x1879, 0x6142, 0x6142, 0x1826,
- 0x6144, 0x6144, 0x11F9, 0x6147, 0x6147, 0x18E7, 0x6148, 0x6148, 0x195C,
- 0x614A, 0x614A, 0x0E47, 0x614B, 0x614B, 0x1D0B, 0x614C, 0x614C, 0x1EE6,
- 0x6153, 0x6153, 0x1D9B, 0x6155, 0x6155, 0x12A1, 0x6158, 0x6159, 0x1BAD,
- 0x615D, 0x615D, 0x1D2F, 0x615F, 0x615F, 0x1D1D, 0x6162, 0x6162, 0x1243,
- 0x6163, 0x6163, 0x0EEE, 0x6164, 0x6164, 0x0D8D, 0x6167, 0x6167, 0x1E72,
- 0x6168, 0x6168, 0x0DEF, 0x616B, 0x616B, 0x1AB9, 0x616E, 0x616E, 0x115D,
- 0x6170, 0x6170, 0x1894, 0x6176, 0x6176, 0x0E58, 0x6177, 0x6177, 0x0DD8,
- 0x617D, 0x617D, 0x1BE1, 0x617E, 0x617E, 0x1818, 0x6181, 0x6181, 0x1C57,
- 0x6182, 0x6182, 0x1840, 0x618A, 0x618A, 0x1446, 0x618E, 0x618E, 0x1B14,
- 0x6190, 0x6190, 0x1171, 0x6191, 0x6191, 0x1475, 0x6194, 0x6194, 0x1C31,
- 0x6198, 0x6198, 0x1F6C, 0x6199, 0x6199, 0x1F6B, 0x619A, 0x619A, 0x1CF4,
- 0x61A4, 0x61A4, 0x1427, 0x61A7, 0x61A7, 0x10F0, 0x61A9, 0x61A9, 0x0E2C,
- 0x61AB, 0x61AB, 0x1309, 0x61AC, 0x61AC, 0x0E59, 0x61AE, 0x61AE, 0x12CE,
- 0x61B2, 0x61B2, 0x1E2B, 0x61B6, 0x61B6, 0x1719, 0x61BA, 0x61BA, 0x107B,
- 0x61BE, 0x61BE, 0x0DBB, 0x61C3, 0x61C3, 0x0FBA, 0x61C7, 0x61C7, 0x0D9B,
- 0x61C8, 0x61C8, 0x1E0C, 0x61C9, 0x61C9, 0x18F7, 0x61CA, 0x61CA, 0x17AF,
- 0x61CB, 0x61CB, 0x12CF, 0x61E6, 0x61E6, 0x1027, 0x61F2, 0x61F2, 0x1B7F,
- 0x61F6, 0x61F6, 0x1117, 0x61F7, 0x61F7, 0x1EFE, 0x61F8, 0x61F8, 0x1E39,
- 0x61FA, 0x61FA, 0x1BAF, 0x61FC, 0x61FC, 0x0F46, 0x61FF, 0x61FF, 0x18FF,
- 0x6200, 0x6200, 0x1172, 0x6207, 0x6207, 0x1093, 0x6208, 0x6208, 0x0EDC,
- 0x620A, 0x620A, 0x12D0, 0x620C, 0x620C, 0x1623, 0x620D, 0x620D, 0x15CB,
- 0x620E, 0x620E, 0x18E1, 0x6210, 0x6210, 0x1567, 0x6211, 0x6211, 0x1695,
- 0x6212, 0x6212, 0x0E80, 0x6216, 0x6216, 0x1EA2, 0x621A, 0x621A, 0x1BE2,
- 0x621F, 0x621F, 0x0FB3, 0x6221, 0x6221, 0x0DBC, 0x622A, 0x622A, 0x1A1D,
- 0x622E, 0x622E, 0x11F0, 0x6230, 0x6230, 0x1A01, 0x6231, 0x6231, 0x1F6D,
- 0x6234, 0x6234, 0x10A2, 0x6236, 0x6236, 0x1E80, 0x623E, 0x623E, 0x115E,
- 0x623F, 0x623F, 0x1354, 0x6240, 0x6240, 0x1583, 0x6241, 0x6241, 0x1D60,
- 0x6247, 0x6247, 0x1530, 0x6248, 0x6248, 0x1E81, 0x6249, 0x6249, 0x1447,
- 0x624B, 0x624B, 0x15CC, 0x624D, 0x624D, 0x19AE, 0x6253, 0x6253, 0x1CDA,
- 0x6258, 0x6258, 0x1CE6, 0x626E, 0x626E, 0x1428, 0x6271, 0x6271, 0x0FD6,
- 0x6276, 0x6276, 0x1404, 0x6279, 0x6279, 0x1448, 0x627C, 0x627C, 0x16DC,
- 0x627F, 0x627F, 0x1637, 0x6280, 0x6280, 0x0FF0, 0x6284, 0x6284, 0x1C32,
- 0x6289, 0x6289, 0x0E40, 0x628A, 0x628A, 0x1D35, 0x6291, 0x6291, 0x171A,
- 0x6292, 0x6292, 0x1504, 0x6295, 0x6295, 0x1D2C, 0x6297, 0x6297, 0x1DFC,
- 0x6298, 0x6298, 0x1A1E, 0x629B, 0x629B, 0x1D81, 0x62AB, 0x62AB, 0x1DAE,
- 0x62B1, 0x62B1, 0x1D82, 0x62B5, 0x62B5, 0x19C5, 0x62B9, 0x62B9, 0x1252,
- 0x62BC, 0x62BC, 0x16C6, 0x62BD, 0x62BD, 0x1C62, 0x62C2, 0x62C2, 0x1436,
- 0x62C7, 0x62C7, 0x12D1, 0x62C8, 0x62C8, 0x1045, 0x62C9, 0x62C9, 0x1139,
- 0x62CC, 0x62CC, 0x132D, 0x62CD, 0x62CD, 0x1318, 0x62CF, 0x62CF, 0x1028,
- 0x62D0, 0x62D0, 0x0F15, 0x62D2, 0x62D2, 0x0E05, 0x62D3, 0x62D3, 0x1BE3,
- 0x62D4, 0x62D4, 0x1343, 0x62D6, 0x62D6, 0x1CDB, 0x62D7, 0x62D7, 0x1804,
- 0x62D8, 0x62D8, 0x0F47, 0x62D9, 0x62D9, 0x1AB3, 0x62DB, 0x62DB, 0x1C33,
- 0x62DC, 0x62DC, 0x136D, 0x62EC, 0x62EC, 0x0EFD, 0x62ED, 0x62ED, 0x165C,
- 0x62EE, 0x62EE, 0x1021, 0x62EF, 0x62EF, 0x1B16, 0x62F1, 0x62F1, 0x0ED2,
- 0x62F3, 0x62F3, 0x0F86, 0x62F7, 0x62F7, 0x0E9A, 0x62FE, 0x62FE, 0x162E,
- 0x62FF, 0x62FF, 0x1029, 0x6301, 0x6301, 0x1B24, 0x6307, 0x6307, 0x1B25,
- 0x6309, 0x6309, 0x16B1, 0x6311, 0x6311, 0x10BA, 0x632B, 0x632B, 0x1ACA,
- 0x632F, 0x632F, 0x1B47, 0x633A, 0x633A, 0x1A3D, 0x633B, 0x633B, 0x174B,
- 0x633D, 0x633D, 0x1244, 0x633E, 0x633E, 0x1E53, 0x6349, 0x6349, 0x1B8F,
- 0x634C, 0x634C, 0x1D4D, 0x634F, 0x634F, 0x102F, 0x6350, 0x6350, 0x174A,
- 0x6355, 0x6355, 0x1D83, 0x6367, 0x6367, 0x13EA, 0x6368, 0x6368, 0x1491,
- 0x636E, 0x636E, 0x0E06, 0x6372, 0x6372, 0x0F87, 0x6377, 0x6377, 0x1C16,
- 0x637A, 0x637A, 0x1030, 0x637B, 0x637B, 0x1046, 0x637F, 0x637F, 0x1505,
- 0x6383, 0x6383, 0x1584, 0x6388, 0x6388, 0x15CD, 0x6389, 0x6389, 0x10BB,
- 0x638C, 0x638C, 0x1991, 0x6392, 0x6392, 0x136E, 0x6396, 0x6396, 0x16DD,
- 0x6398, 0x6398, 0x0F79, 0x639B, 0x639B, 0x0F0D, 0x63A0, 0x63A0, 0x1149,
- 0x63A1, 0x63A1, 0x1BCF, 0x63A2, 0x63A2, 0x1CFC, 0x63A5, 0x63A5, 0x1A2D,
- 0x63A7, 0x63A7, 0x0ED3, 0x63A8, 0x63A8, 0x1C63, 0x63A9, 0x63A9, 0x1729,
- 0x63AA, 0x63AA, 0x1A85, 0x63C0, 0x63C0, 0x0D9C, 0x63C4, 0x63C4, 0x18B4,
- 0x63C6, 0x63C6, 0x0F9D, 0x63CF, 0x63CF, 0x12C4, 0x63D0, 0x63D0, 0x1A6E,
- 0x63D6, 0x63D6, 0x18F3, 0x63DA, 0x63DA, 0x16FB, 0x63DB, 0x63DB, 0x1ED0,
- 0x63E1, 0x63E1, 0x16A7, 0x63ED, 0x63ED, 0x0E2D, 0x63EE, 0x63EE, 0x1F3F,
- 0x63F4, 0x63F4, 0x187A, 0x63F6, 0x63F6, 0x16EB, 0x63F7, 0x63F7, 0x14CF,
- 0x640D, 0x640D, 0x15AC, 0x640F, 0x640F, 0x1319, 0x6414, 0x6414, 0x1585,
- 0x6416, 0x6416, 0x1805, 0x6417, 0x6417, 0x10BC, 0x641C, 0x641C, 0x15CE,
- 0x6422, 0x6422, 0x1B48, 0x642C, 0x642C, 0x132E, 0x642D, 0x642D, 0x1D01,
- 0x643A, 0x643A, 0x1F46, 0x643E, 0x643E, 0x1B90, 0x6458, 0x6458, 0x19DF,
- 0x6460, 0x6460, 0x1C58, 0x6469, 0x6469, 0x1230, 0x646F, 0x646F, 0x1B26,
- 0x6478, 0x6479, 0x12A2, 0x647A, 0x647A, 0x1A2E, 0x6488, 0x6488, 0x11A0,
- 0x6491, 0x6491, 0x1D17, 0x6492, 0x6492, 0x14C4, 0x6493, 0x6493, 0x1806,
- 0x649A, 0x649A, 0x1041, 0x649E, 0x649E, 0x1094, 0x64A4, 0x64A4, 0x1C03,
- 0x64A5, 0x64A5, 0x1344, 0x64AB, 0x64AB, 0x12D2, 0x64AD, 0x64AD, 0x1D36,
- 0x64AE, 0x64AE, 0x1C5D, 0x64B0, 0x64B0, 0x1B96, 0x64B2, 0x64B2, 0x131A,
- 0x64BB, 0x64BB, 0x1074, 0x64C1, 0x64C1, 0x17CB, 0x64C4, 0x64C4, 0x11A1,
- 0x64C5, 0x64C5, 0x1BF1, 0x64C7, 0x64C7, 0x1D15, 0x64CA, 0x64CA, 0x0E2E,
- 0x64CD, 0x64CD, 0x1A86, 0x64CE, 0x64CE, 0x0E5A, 0x64D2, 0x64D2, 0x0FC8,
- 0x64D4, 0x64D4, 0x107C, 0x64D8, 0x64D8, 0x139F, 0x64DA, 0x64DA, 0x0E07,
- 0x64E1, 0x64E1, 0x10A3, 0x64E2, 0x64E2, 0x1CE7, 0x64E5, 0x64E5, 0x1130,
- 0x64E6, 0x64E6, 0x1BA7, 0x64E7, 0x64E7, 0x0E08, 0x64EC, 0x64EC, 0x1900,
- 0x64F2, 0x64F2, 0x1BE4, 0x64F4, 0x64F4, 0x1EC5, 0x64FA, 0x64FA, 0x1D37,
- 0x64FE, 0x64FE, 0x1807, 0x6500, 0x6500, 0x132F, 0x6504, 0x6504, 0x1D18,
- 0x6518, 0x6518, 0x16FC, 0x651D, 0x651D, 0x155F, 0x6523, 0x6523, 0x1173,
- 0x652A, 0x652A, 0x0F23, 0x652B, 0x652B, 0x1EC6, 0x652C, 0x652C, 0x1131,
- 0x652F, 0x652F, 0x1B27, 0x6536, 0x6536, 0x15CF, 0x6537, 0x6537, 0x0E9B,
- 0x6538, 0x6538, 0x18B5, 0x6539, 0x6539, 0x0DF0, 0x653B, 0x653B, 0x0ED4,
- 0x653E, 0x653E, 0x1355, 0x653F, 0x653F, 0x1A3E, 0x6545, 0x6545, 0x0E9C,
- 0x6548, 0x6548, 0x1F14, 0x654D, 0x654D, 0x1506, 0x654E, 0x654E, 0x0F24,
- 0x654F, 0x654F, 0x130A, 0x6551, 0x6551, 0x0F48, 0x6556, 0x6556, 0x17B0,
- 0x6557, 0x6557, 0x1D51, 0x655E, 0x655E, 0x1BBC, 0x6562, 0x6562, 0x0DBD,
- 0x6563, 0x6563, 0x14BA, 0x6566, 0x6566, 0x10E1, 0x656C, 0x656C, 0x0E5B,
- 0x656D, 0x656D, 0x16FD, 0x6572, 0x6572, 0x0E9D, 0x6574, 0x6574, 0x1A3F,
- 0x6575, 0x6575, 0x19E0, 0x6577, 0x6577, 0x1405, 0x6578, 0x6578, 0x15D0,
- 0x657E, 0x657E, 0x1531, 0x6582, 0x6582, 0x1184, 0x6583, 0x6583, 0x1D73,
- 0x6585, 0x6585, 0x1F15, 0x6587, 0x6587, 0x12E8, 0x658C, 0x658C, 0x146A,
- 0x6590, 0x6590, 0x1449, 0x6591, 0x6591, 0x1330, 0x6597, 0x6597, 0x10FD,
- 0x6599, 0x6599, 0x11CB, 0x659B, 0x659B, 0x0EB8, 0x659C, 0x659C, 0x1492,
- 0x659F, 0x659F, 0x1B76, 0x65A1, 0x65A1, 0x16B9, 0x65A4, 0x65A4, 0x0FBB,
- 0x65A5, 0x65A5, 0x1BE5, 0x65A7, 0x65A7, 0x1406, 0x65AB, 0x65AB, 0x1970,
- 0x65AC, 0x65AC, 0x1BB0, 0x65AF, 0x65AF, 0x1493, 0x65B0, 0x65B0, 0x166E,
- 0x65B7, 0x65B7, 0x1067, 0x65B9, 0x65B9, 0x1356, 0x65BC, 0x65BC, 0x1710,
- 0x65BD, 0x65BD, 0x1647, 0x65C1, 0x65C1, 0x1357, 0x65C5, 0x65C5, 0x115F,
- 0x65CB, 0x65CB, 0x1532, 0x65CC, 0x65CC, 0x1A40, 0x65CF, 0x65CF, 0x1AAC,
- 0x65D2, 0x65D2, 0x11E2, 0x65D7, 0x65D7, 0x0FF1, 0x65E0, 0x65E0, 0x12D3,
- 0x65E3, 0x65E3, 0x0FF2, 0x65E5, 0x65E5, 0x1940, 0x65E6, 0x65E6, 0x1068,
- 0x65E8, 0x65E8, 0x1B28, 0x65E9, 0x65E9, 0x1A87, 0x65EC, 0x65EC, 0x160C,
- 0x65ED, 0x65ED, 0x1857, 0x65F1, 0x65F1, 0x1DD6, 0x65F4, 0x65F4, 0x1841,
- 0x65FA, 0x65FA, 0x17EF, 0x65FB, 0x65FC, 0x130B, 0x65FD, 0x65FD, 0x10E2,
- 0x65FF, 0x65FF, 0x17B1, 0x6606, 0x6606, 0x0EC1, 0x6607, 0x6607, 0x1638,
- 0x6609, 0x6609, 0x1358, 0x660A, 0x660A, 0x1E82, 0x660C, 0x660C, 0x1BBD,
- 0x660E, 0x660E, 0x128F, 0x660F, 0x660F, 0x1EA5, 0x6610, 0x6610, 0x1429,
- 0x6611, 0x6611, 0x0FC9, 0x6613, 0x6613, 0x173E, 0x6614, 0x6614, 0x151F,
- 0x6615, 0x6615, 0x1F53, 0x661E, 0x661E, 0x13B6, 0x661F, 0x661F, 0x1568,
- 0x6620, 0x6620, 0x1775, 0x6625, 0x6625, 0x1C84, 0x6627, 0x6627, 0x1268,
- 0x6628, 0x6628, 0x1971, 0x662D, 0x662D, 0x1586, 0x662F, 0x662F, 0x1648,
- 0x6630, 0x6630, 0x1DC5, 0x6631, 0x6631, 0x1858, 0x6634, 0x6634, 0x12C5,
- 0x6636, 0x6636, 0x1BBE, 0x663A, 0x663A, 0x13B7, 0x663B, 0x663B, 0x16CC,
- 0x6641, 0x6641, 0x1A88, 0x6642, 0x6642, 0x1649, 0x6643, 0x6644, 0x1EE7,
- 0x6649, 0x6649, 0x1B49, 0x664B, 0x664B, 0x1B4A, 0x664F, 0x664F, 0x16B2,
- 0x6659, 0x6659, 0x1AFC, 0x665B, 0x665B, 0x1E3A, 0x665D, 0x665D, 0x1AD9,
- 0x665E, 0x665E, 0x1F6E, 0x665F, 0x665F, 0x1569, 0x6664, 0x6664, 0x17B2,
- 0x6665, 0x6665, 0x1ED2, 0x6666, 0x6666, 0x1EFF, 0x6667, 0x6667, 0x1E83,
- 0x6668, 0x6668, 0x166F, 0x6669, 0x6669, 0x1245, 0x666B, 0x666B, 0x1CE8,
- 0x666E, 0x666E, 0x13C6, 0x666F, 0x666F, 0x0E5C, 0x6673, 0x6673, 0x1520,
- 0x6674, 0x6674, 0x1C1E, 0x6676, 0x6676, 0x1A41, 0x6677, 0x6677, 0x0F96,
- 0x6678, 0x6678, 0x1A42, 0x667A, 0x667A, 0x1B29, 0x6684, 0x6684, 0x1F37,
- 0x6687, 0x6687, 0x0D77, 0x6688, 0x6688, 0x1F34, 0x6689, 0x6689, 0x1F40,
- 0x668E, 0x668E, 0x1776, 0x6690, 0x6690, 0x1895, 0x6691, 0x6691, 0x1507,
- 0x6696, 0x6696, 0x102C, 0x6697, 0x6697, 0x16C1, 0x6698, 0x6698, 0x16FE,
- 0x669D, 0x669D, 0x1290, 0x66A0, 0x66A0, 0x0E9E, 0x66A2, 0x66A2, 0x1BBF,
- 0x66AB, 0x66AB, 0x1980, 0x66AE, 0x66AE, 0x12A4, 0x66B2, 0x66B2, 0x1992,
- 0x66B3, 0x66B3, 0x1E73, 0x66B4, 0x66B4, 0x1D94, 0x66B9, 0x66B9, 0x1558,
- 0x66BB, 0x66BB, 0x0E5D, 0x66BE, 0x66BE, 0x10E3, 0x66C4, 0x66C4, 0x176F,
- 0x66C6, 0x66C6, 0x116B, 0x66C7, 0x66C7, 0x107D, 0x66C9, 0x66C9, 0x1F16,
- 0x66D6, 0x66D6, 0x16D5, 0x66D9, 0x66D9, 0x1508, 0x66DC, 0x66DC, 0x1808,
- 0x66DD, 0x66DD, 0x1D95, 0x66E0, 0x66E0, 0x0F04, 0x66E6, 0x66E6, 0x1F6F,
- 0x66F0, 0x66F0, 0x17ED, 0x66F2, 0x66F2, 0x0EB9, 0x66F3, 0x66F3, 0x1791,
- 0x66F4, 0x66F4, 0x0E5E, 0x66F7, 0x66F7, 0x0DAE, 0x66F8, 0x66F8, 0x1509,
- 0x66F9, 0x66F9, 0x1A8A, 0x66FA, 0x66FA, 0x1A89, 0x66FC, 0x66FC, 0x1246,
- 0x66FE, 0x66FE, 0x1B15, 0x66FF, 0x66FF, 0x1C26, 0x6700, 0x6700, 0x1C60,
- 0x6703, 0x6703, 0x1F00, 0x6708, 0x6708, 0x1889, 0x6709, 0x6709, 0x18B6,
- 0x670B, 0x670B, 0x1438, 0x670D, 0x670D, 0x13D8, 0x6714, 0x6714, 0x14B6,
- 0x6715, 0x6715, 0x1B77, 0x6717, 0x6717, 0x113D, 0x671B, 0x671B, 0x125C,
- 0x671D, 0x671D, 0x1A8B, 0x671E, 0x671F, 0x0FF3, 0x6726, 0x6726, 0x12BE,
- 0x6727, 0x6727, 0x11BA, 0x6728, 0x6728, 0x12B4, 0x672A, 0x672A, 0x12F9,
- 0x672B, 0x672B, 0x1253, 0x672C, 0x672C, 0x13E3, 0x672D, 0x672D, 0x1BA8,
- 0x672E, 0x672E, 0x1C88, 0x6731, 0x6731, 0x1ADA, 0x6734, 0x6734, 0x131B,
- 0x6736, 0x6736, 0x1CDC, 0x673A, 0x673A, 0x0F90, 0x673D, 0x673D, 0x1F27,
- 0x6746, 0x6746, 0x0D9D, 0x6749, 0x6749, 0x14C9, 0x674E, 0x674E, 0x120C,
- 0x674F, 0x674F, 0x1E1B, 0x6750, 0x6750, 0x19AF, 0x6751, 0x6751, 0x1C51,
- 0x6753, 0x6753, 0x1D9C, 0x6756, 0x6756, 0x1993, 0x675C, 0x675C, 0x10FE,
- 0x675E, 0x675E, 0x0FF5, 0x675F, 0x675F, 0x15A3, 0x676D, 0x676D, 0x1DFD,
- 0x676F, 0x676F, 0x136F, 0x6770, 0x6770, 0x0E1F, 0x6771, 0x6771, 0x10F1,
- 0x6773, 0x6773, 0x12C6, 0x6775, 0x6775, 0x19C6, 0x6777, 0x6777, 0x1D38,
- 0x677B, 0x677B, 0x1057, 0x677E, 0x677E, 0x15B3, 0x677F, 0x677F, 0x1D44,
- 0x6787, 0x6787, 0x144A, 0x6789, 0x6789, 0x17F0, 0x678B, 0x678B, 0x1359,
- 0x678F, 0x678F, 0x1032, 0x6790, 0x6790, 0x1521, 0x6793, 0x6793, 0x10FF,
- 0x6795, 0x6795, 0x1CC9, 0x6797, 0x6797, 0x1227, 0x679A, 0x679A, 0x1269,
- 0x679C, 0x679C, 0x0EDD, 0x679D, 0x679D, 0x1B2A, 0x67AF, 0x67AF, 0x0E9F,
- 0x67B0, 0x67B0, 0x1D6B, 0x67B3, 0x67B3, 0x1B2B, 0x67B6, 0x67B7, 0x0D78,
- 0x67B8, 0x67B8, 0x0F49, 0x67BE, 0x67BE, 0x164A, 0x67C4, 0x67C4, 0x13B8,
- 0x67CF, 0x67CF, 0x137F, 0x67D0, 0x67D0, 0x12A5, 0x67D1, 0x67D1, 0x0DBE,
- 0x67D2, 0x67D2, 0x1CC5, 0x67D3, 0x67D3, 0x1766, 0x67D4, 0x67D4, 0x18B7,
- 0x67DA, 0x67DA, 0x18B8, 0x67DD, 0x67DD, 0x1CE9, 0x67E9, 0x67E9, 0x0F4A,
- 0x67EC, 0x67EC, 0x0D9E, 0x67EF, 0x67EF, 0x0D7A, 0x67F0, 0x67F0, 0x103D,
- 0x67F1, 0x67F1, 0x1ADB, 0x67F3, 0x67F3, 0x11E3, 0x67F4, 0x67F4, 0x164B,
- 0x67F5, 0x67F5, 0x1BD7, 0x67F6, 0x67F6, 0x1494, 0x67FB, 0x67FB, 0x1495,
- 0x67FE, 0x67FE, 0x1A43, 0x6812, 0x6812, 0x160D, 0x6813, 0x6813, 0x1A02,
- 0x6816, 0x6816, 0x150A, 0x6817, 0x6817, 0x11FA, 0x6821, 0x6821, 0x0F25,
- 0x6822, 0x6822, 0x1380, 0x682A, 0x682A, 0x1ADC, 0x682F, 0x682F, 0x1859,
- 0x6838, 0x6838, 0x1E18, 0x6839, 0x6839, 0x0FBC, 0x683C, 0x683C, 0x0E2F,
- 0x683D, 0x683D, 0x19B0, 0x6840, 0x6840, 0x0E20, 0x6841, 0x6841, 0x1DFE,
- 0x6842, 0x6842, 0x0E81, 0x6843, 0x6843, 0x10BD, 0x6848, 0x6848, 0x16B3,
- 0x684E, 0x684E, 0x1B6C, 0x6850, 0x6850, 0x10F2, 0x6851, 0x6851, 0x14E2,
- 0x6853, 0x6853, 0x1ED3, 0x6854, 0x6854, 0x1022, 0x686D, 0x686D, 0x1B4B,
- 0x6876, 0x6876, 0x1D1E, 0x687F, 0x687F, 0x0D9F, 0x6881, 0x6881, 0x114F,
- 0x6885, 0x6885, 0x126A, 0x688F, 0x688F, 0x0EBA, 0x6893, 0x6893, 0x19B1,
- 0x6894, 0x6894, 0x1CAE, 0x6897, 0x6897, 0x0E5F, 0x689D, 0x689D, 0x1A8C,
- 0x689F, 0x689F, 0x1F17, 0x68A1, 0x68A1, 0x17DE, 0x68A2, 0x68A2, 0x1C34,
- 0x68A7, 0x68A7, 0x17B3, 0x68A8, 0x68A8, 0x120D, 0x68AD, 0x68AD, 0x1496,
- 0x68AF, 0x68AF, 0x1A6F, 0x68B0, 0x68B0, 0x0E82, 0x68B1, 0x68B1, 0x0EC2,
- 0x68B3, 0x68B3, 0x1587, 0x68B5, 0x68B5, 0x1393, 0x68B6, 0x68B6, 0x12FA,
- 0x68C4, 0x68C4, 0x0FF7, 0x68C5, 0x68C5, 0x13B9, 0x68C9, 0x68C9, 0x1282,
- 0x68CB, 0x68CB, 0x0FF6, 0x68CD, 0x68CD, 0x0EC3, 0x68D2, 0x68D2, 0x13EB,
- 0x68D5, 0x68D5, 0x1ABA, 0x68D7, 0x68D7, 0x1A8D, 0x68D8, 0x68D8, 0x0FB4,
- 0x68DA, 0x68DA, 0x1439, 0x68DF, 0x68DF, 0x10F3, 0x68E0, 0x68E0, 0x1095,
- 0x68E7, 0x68E7, 0x197B, 0x68E8, 0x68E8, 0x0E83, 0x68EE, 0x68EE, 0x14CA,
- 0x68F2, 0x68F2, 0x150B, 0x68F9, 0x68F9, 0x10BE, 0x68FA, 0x68FA, 0x0EEF,
- 0x6900, 0x6900, 0x17DF, 0x6905, 0x6905, 0x1901, 0x690D, 0x690D, 0x165D,
- 0x690E, 0x690E, 0x1C64, 0x6912, 0x6912, 0x1C35, 0x6927, 0x6927, 0x1291,
- 0x6930, 0x6930, 0x16EC, 0x693D, 0x693D, 0x174C, 0x693F, 0x693F, 0x1C85,
- 0x694A, 0x694A, 0x16FF, 0x6953, 0x6953, 0x1DA8, 0x6954, 0x6954, 0x154C,
- 0x6955, 0x6955, 0x1CDD, 0x6957, 0x6957, 0x0E17, 0x6959, 0x6959, 0x12D4,
- 0x695A, 0x695A, 0x1C36, 0x695E, 0x695E, 0x1200, 0x6960, 0x6960, 0x1033,
- 0x6961, 0x6962, 0x18B9, 0x6963, 0x6963, 0x12FB, 0x6968, 0x6968, 0x1A44,
- 0x696B, 0x696B, 0x1B10, 0x696D, 0x696D, 0x172C, 0x696E, 0x696E, 0x19C7,
- 0x696F, 0x696F, 0x160E, 0x6975, 0x6975, 0x0FB5, 0x6977, 0x6977, 0x1E0D,
- 0x6978, 0x6978, 0x1C65, 0x6979, 0x6979, 0x1777, 0x6995, 0x6995, 0x1827,
- 0x699B, 0x699B, 0x1B4C, 0x699C, 0x699C, 0x135A, 0x69A5, 0x69A5, 0x1EE9,
- 0x69A7, 0x69A7, 0x144B, 0x69AE, 0x69AE, 0x1778, 0x69B4, 0x69B4, 0x11E4,
- 0x69BB, 0x69BB, 0x1D02, 0x69C1, 0x69C1, 0x0EA0, 0x69C3, 0x69C3, 0x1331,
- 0x69CB, 0x69CB, 0x0F4B, 0x69CC, 0x69CC, 0x1D24, 0x69CD, 0x69CD, 0x1BC0,
- 0x69D0, 0x69D0, 0x0F16, 0x69E8, 0x69E8, 0x0EE8, 0x69EA, 0x69EA, 0x0DF1,
- 0x69FB, 0x69FB, 0x0F9E, 0x69FD, 0x69FD, 0x1A8E, 0x69FF, 0x69FF, 0x0FBD,
- 0x6A02, 0x6A02, 0x16A8, 0x6A0A, 0x6A0A, 0x1385, 0x6A11, 0x6A11, 0x1150,
- 0x6A13, 0x6A13, 0x11D7, 0x6A17, 0x6A17, 0x19C8, 0x6A19, 0x6A19, 0x1D9D,
- 0x6A1E, 0x6A1E, 0x1C66, 0x6A1F, 0x6A1F, 0x1994, 0x6A21, 0x6A21, 0x12A6,
- 0x6A23, 0x6A23, 0x1700, 0x6A35, 0x6A35, 0x1C37, 0x6A38, 0x6A38, 0x131C,
- 0x6A39, 0x6A39, 0x15D1, 0x6A3A, 0x6A3A, 0x1EBA, 0x6A3D, 0x6A3D, 0x1AFD,
- 0x6A44, 0x6A44, 0x0DBF, 0x6A48, 0x6A48, 0x1809, 0x6A4B, 0x6A4B, 0x0F26,
- 0x6A52, 0x6A52, 0x185F, 0x6A53, 0x6A53, 0x160F, 0x6A58, 0x6A58, 0x0FAF,
- 0x6A59, 0x6A59, 0x110E, 0x6A5F, 0x6A5F, 0x0FF8, 0x6A61, 0x6A61, 0x14E3,
- 0x6A6B, 0x6A6B, 0x1F0F, 0x6A80, 0x6A80, 0x1069, 0x6A84, 0x6A84, 0x0E30,
- 0x6A89, 0x6A89, 0x1A45, 0x6A8D, 0x6A8D, 0x171B, 0x6A8E, 0x6A8E, 0x0FCA,
- 0x6A97, 0x6A97, 0x13A0, 0x6A9C, 0x6A9C, 0x1F01, 0x6AA2, 0x6AA2, 0x0E24,
- 0x6AA3, 0x6AA3, 0x1995, 0x6AB3, 0x6AB3, 0x146B, 0x6ABB, 0x6ABB, 0x1DE8,
- 0x6AC2, 0x6AC2, 0x10BF, 0x6AC3, 0x6AC3, 0x0F91, 0x6AD3, 0x6AD3, 0x11A2,
- 0x6ADA, 0x6ADA, 0x1160, 0x6ADB, 0x6ADB, 0x1B0F, 0x6AF6, 0x6AF6, 0x1E2C,
- 0x6AFB, 0x6AFB, 0x16E2, 0x6B04, 0x6B04, 0x1127, 0x6B0A, 0x6B0A, 0x0F88,
- 0x6B0C, 0x6B0C, 0x1996, 0x6B12, 0x6B12, 0x1128, 0x6B16, 0x6B16, 0x1132,
- 0x6B20, 0x6B20, 0x1F5B, 0x6B21, 0x6B21, 0x1B88, 0x6B23, 0x6B23, 0x1F54,
- 0x6B32, 0x6B32, 0x1819, 0x6B3A, 0x6B3A, 0x0FF9, 0x6B3D, 0x6B3D, 0x1F5C,
- 0x6B3E, 0x6B3E, 0x0EF0, 0x6B46, 0x6B46, 0x1F5D, 0x6B47, 0x6B47, 0x1E2F,
- 0x6B4C, 0x6B4C, 0x0D7B, 0x6B4E, 0x6B4E, 0x1CF5, 0x6B50, 0x6B50, 0x0F4C,
- 0x6B5F, 0x6B5F, 0x1731, 0x6B61, 0x6B61, 0x1ED1, 0x6B62, 0x6B62, 0x1B2C,
- 0x6B63, 0x6B63, 0x1A46, 0x6B64, 0x6B64, 0x1B89, 0x6B65, 0x6B65, 0x13C7,
- 0x6B66, 0x6B66, 0x12D5, 0x6B6A, 0x6B6A, 0x17F5, 0x6B72, 0x6B72, 0x1576,
- 0x6B77, 0x6B77, 0x116C, 0x6B78, 0x6B78, 0x0F97, 0x6B7B, 0x6B7B, 0x1497,
- 0x6B7F, 0x6B7F, 0x12BB, 0x6B83, 0x6B83, 0x16CD, 0x6B84, 0x6B84, 0x1B4D,
- 0x6B86, 0x6B86, 0x1D0C, 0x6B89, 0x6B89, 0x1610, 0x6B8A, 0x6B8A, 0x15D2,
- 0x6B96, 0x6B96, 0x165E, 0x6B98, 0x6B98, 0x197C, 0x6B9E, 0x6B9E, 0x1860,
- 0x6BAE, 0x6BAE, 0x1185, 0x6BAF, 0x6BAF, 0x146C, 0x6BB2, 0x6BB2, 0x1559,
- 0x6BB5, 0x6BB5, 0x106A, 0x6BB7, 0x6BB7, 0x18E8, 0x6BBA, 0x6BBA, 0x14C5,
- 0x6BBC, 0x6BBC, 0x0D8E, 0x6BBF, 0x6BBF, 0x1A03, 0x6BC1, 0x6BC1, 0x1F3C,
- 0x6BC5, 0x6BC5, 0x1902, 0x6BC6, 0x6BC6, 0x0F4D, 0x6BCB, 0x6BCB, 0x12D6,
- 0x6BCD, 0x6BCD, 0x12A7, 0x6BCF, 0x6BCF, 0x126B, 0x6BD2, 0x6BD2, 0x10D5,
- 0x6BD3, 0x6BD3, 0x18D4, 0x6BD4, 0x6BD4, 0x144C, 0x6BD6, 0x6BD8, 0x144D,
- 0x6BDB, 0x6BDB, 0x12A8, 0x6BEB, 0x6BEB, 0x1E84, 0x6BEC, 0x6BEC, 0x0F4E,
- 0x6C08, 0x6C08, 0x1A04, 0x6C0F, 0x6C0F, 0x168E, 0x6C11, 0x6C11, 0x130D,
- 0x6C13, 0x6C13, 0x1278, 0x6C23, 0x6C23, 0x0FFA, 0x6C34, 0x6C34, 0x15D3,
- 0x6C37, 0x6C37, 0x1476, 0x6C38, 0x6C38, 0x1779, 0x6C3E, 0x6C3E, 0x1394,
- 0x6C40, 0x6C40, 0x1A47, 0x6C41, 0x6C41, 0x1B11, 0x6C42, 0x6C42, 0x0F4F,
- 0x6C4E, 0x6C4E, 0x1395, 0x6C50, 0x6C50, 0x1522, 0x6C55, 0x6C55, 0x14BB,
- 0x6C57, 0x6C57, 0x1DD7, 0x6C5A, 0x6C5A, 0x17B4, 0x6C5D, 0x6C5D, 0x1732,
- 0x6C5E, 0x6C5E, 0x1EAF, 0x6C5F, 0x6C5F, 0x0DD9, 0x6C60, 0x6C60, 0x1B2D,
- 0x6C68, 0x6C68, 0x0EC8, 0x6C6A, 0x6C6A, 0x17F1, 0x6C6D, 0x6C6D, 0x1792,
- 0x6C70, 0x6C70, 0x1D0D, 0x6C72, 0x6C72, 0x0FD7, 0x6C76, 0x6C76, 0x12E9,
- 0x6C7A, 0x6C7A, 0x0E41, 0x6C7D, 0x6C7D, 0x0FFB, 0x6C7E, 0x6C7E, 0x142A,
- 0x6C81, 0x6C81, 0x1685, 0x6C82, 0x6C82, 0x0FFC, 0x6C83, 0x6C83, 0x17BF,
- 0x6C85, 0x6C85, 0x187B, 0x6C86, 0x6C86, 0x1DFF, 0x6C87, 0x6C87, 0x174D,
- 0x6C88, 0x6C88, 0x1CCA, 0x6C8C, 0x6C8C, 0x10E4, 0x6C90, 0x6C90, 0x12B5,
- 0x6C92, 0x6C92, 0x12BC, 0x6C93, 0x6C93, 0x108A, 0x6C94, 0x6C94, 0x1283,
- 0x6C95, 0x6C95, 0x12F1, 0x6C96, 0x6C96, 0x1C8C, 0x6C99, 0x6C99, 0x1498,
- 0x6C9A, 0x6C9A, 0x1B2E, 0x6C9B, 0x6C9B, 0x1D52, 0x6CAB, 0x6CAB, 0x1254,
- 0x6CAE, 0x6CAE, 0x19C9, 0x6CB3, 0x6CB3, 0x1DC6, 0x6CB8, 0x6CB8, 0x1450,
- 0x6CB9, 0x6CB9, 0x18BB, 0x6CBB, 0x6CBB, 0x1CAF, 0x6CBC, 0x6CBC, 0x1588,
- 0x6CBD, 0x6CBD, 0x0EA1, 0x6CBE, 0x6CBE, 0x1C0B, 0x6CBF, 0x6CBF, 0x174E,
- 0x6CC1, 0x6CC1, 0x1EEA, 0x6CC2, 0x6CC2, 0x1E60, 0x6CC4, 0x6CC4, 0x154D,
- 0x6CC9, 0x6CC9, 0x1BF2, 0x6CCA, 0x6CCA, 0x131D, 0x6CCC, 0x6CCC, 0x1DB7,
- 0x6CD3, 0x6CD3, 0x1EB0, 0x6CD5, 0x6CD5, 0x139A, 0x6CD7, 0x6CD7, 0x1499,
- 0x6CDB, 0x6CDB, 0x1396, 0x6CE1, 0x6CE1, 0x1D84, 0x6CE2, 0x6CE2, 0x1D39,
- 0x6CE3, 0x6CE3, 0x18F4, 0x6CE5, 0x6CE5, 0x105B, 0x6CE8, 0x6CE8, 0x1ADD,
- 0x6CEB, 0x6CEB, 0x1E3B, 0x6CEE, 0x6CEE, 0x1332, 0x6CEF, 0x6CEF, 0x130E,
- 0x6CF0, 0x6CF0, 0x1D0E, 0x6CF3, 0x6CF3, 0x177A, 0x6D0B, 0x6D0B, 0x1701,
- 0x6D0C, 0x6D0C, 0x1180, 0x6D11, 0x6D11, 0x13C8, 0x6D17, 0x6D17, 0x1577,
- 0x6D19, 0x6D19, 0x15D4, 0x6D1B, 0x6D1B, 0x111E, 0x6D1E, 0x6D1E, 0x10F4,
- 0x6D25, 0x6D25, 0x1B4E, 0x6D27, 0x6D27, 0x18BC, 0x6D29, 0x6D29, 0x154E,
- 0x6D2A, 0x6D2A, 0x1EB1, 0x6D32, 0x6D32, 0x1ADE, 0x6D35, 0x6D35, 0x1611,
- 0x6D36, 0x6D36, 0x1F50, 0x6D38, 0x6D38, 0x0F05, 0x6D39, 0x6D39, 0x187C,
- 0x6D3B, 0x6D3B, 0x1EDB, 0x6D3D, 0x6D3D, 0x1F60, 0x6D3E, 0x6D3E, 0x1D3A,
- 0x6D41, 0x6D41, 0x11E5, 0x6D59, 0x6D59, 0x1A1F, 0x6D5A, 0x6D5A, 0x1AFE,
- 0x6D5C, 0x6D5C, 0x146D, 0x6D63, 0x6D63, 0x17E0, 0x6D66, 0x6D66, 0x1D85,
- 0x6D69, 0x6D69, 0x1E85, 0x6D6A, 0x6D6A, 0x113E, 0x6D6C, 0x6D6C, 0x120E,
- 0x6D6E, 0x6D6E, 0x1407, 0x6D74, 0x6D74, 0x181A, 0x6D77, 0x6D77, 0x1E0E,
- 0x6D78, 0x6D78, 0x1CCB, 0x6D79, 0x6D79, 0x1E54, 0x6D7F, 0x6D7F, 0x1D53,
- 0x6D85, 0x6D85, 0x1762, 0x6D87, 0x6D87, 0x0E60, 0x6D88, 0x6D88, 0x1589,
- 0x6D89, 0x6D89, 0x1560, 0x6D8C, 0x6D8C, 0x1828, 0x6D8D, 0x6D8D, 0x1F18,
- 0x6D8E, 0x6D8E, 0x174F, 0x6D91, 0x6D91, 0x15A4, 0x6D93, 0x6D93, 0x1750,
- 0x6D95, 0x6D95, 0x1C27, 0x6DAF, 0x6DAF, 0x16D6, 0x6DB2, 0x6DB2, 0x16DE,
- 0x6DB5, 0x6DB5, 0x1DE9, 0x6DC0, 0x6DC0, 0x1A48, 0x6DC3, 0x6DC3, 0x0F89,
- 0x6DC4, 0x6DC4, 0x1CB0, 0x6DC5, 0x6DC5, 0x1523, 0x6DC6, 0x6DC6, 0x1F19,
- 0x6DC7, 0x6DC7, 0x0FFD, 0x6DCB, 0x6DCB, 0x1228, 0x6DCF, 0x6DCF, 0x1E86,
- 0x6DD1, 0x6DD1, 0x1601, 0x6DD8, 0x6DD8, 0x10C0, 0x6DD9, 0x6DD9, 0x1ABB,
- 0x6DDA, 0x6DDA, 0x11D8, 0x6DDE, 0x6DDE, 0x15B4, 0x6DE1, 0x6DE1, 0x107E,
- 0x6DE8, 0x6DE8, 0x1A49, 0x6DEA, 0x6DEA, 0x11F5, 0x6DEB, 0x6DEB, 0x18EE,
- 0x6DEE, 0x6DEE, 0x1F02, 0x6DF1, 0x6DF1, 0x1686, 0x6DF3, 0x6DF3, 0x1612,
- 0x6DF5, 0x6DF5, 0x1751, 0x6DF7, 0x6DF7, 0x1EA6, 0x6DF8, 0x6DF8, 0x1C1F,
- 0x6DF9, 0x6DF9, 0x172A, 0x6DFA, 0x6DFA, 0x1BF3, 0x6DFB, 0x6DFB, 0x1C0C,
- 0x6E17, 0x6E17, 0x14CB, 0x6E19, 0x6E19, 0x1ED4, 0x6E1A, 0x6E1A, 0x19CA,
- 0x6E1B, 0x6E1B, 0x0DC0, 0x6E1F, 0x6E1F, 0x1A4A, 0x6E20, 0x6E20, 0x0E09,
- 0x6E21, 0x6E21, 0x10C1, 0x6E23, 0x6E23, 0x149A, 0x6E24, 0x6E24, 0x1345,
- 0x6E25, 0x6E25, 0x16A9, 0x6E26, 0x6E26, 0x17D3, 0x6E2B, 0x6E2B, 0x154F,
- 0x6E2C, 0x6E2C, 0x1CA6, 0x6E2D, 0x6E2D, 0x1896, 0x6E2F, 0x6E2F, 0x1E00,
- 0x6E32, 0x6E32, 0x1533, 0x6E34, 0x6E34, 0x0DAF, 0x6E36, 0x6E36, 0x177B,
- 0x6E38, 0x6E38, 0x18BD, 0x6E3A, 0x6E3A, 0x12C7, 0x6E3C, 0x6E3C, 0x12FC,
- 0x6E3D, 0x6E3D, 0x19B2, 0x6E3E, 0x6E3E, 0x1EA7, 0x6E43, 0x6E43, 0x1370,
- 0x6E44, 0x6E44, 0x12FD, 0x6E4A, 0x6E4A, 0x1ADF, 0x6E4D, 0x6E4D, 0x106B,
- 0x6E56, 0x6E56, 0x1E87, 0x6E58, 0x6E58, 0x14E4, 0x6E5B, 0x6E5B, 0x107F,
- 0x6E5C, 0x6E5C, 0x165F, 0x6E5E, 0x6E5E, 0x1A4B, 0x6E5F, 0x6E5F, 0x1EEB,
- 0x6E67, 0x6E67, 0x1829, 0x6E6B, 0x6E6B, 0x1C67, 0x6E6E, 0x6E6E, 0x1935,
- 0x6E6F, 0x6E6F, 0x1D05, 0x6E72, 0x6E72, 0x187D, 0x6E73, 0x6E73, 0x1034,
- 0x6E7A, 0x6E7A, 0x13C9, 0x6E90, 0x6E90, 0x187E, 0x6E96, 0x6E96, 0x1AFF,
- 0x6E9C, 0x6E9C, 0x11E6, 0x6E9D, 0x6E9D, 0x0F50, 0x6E9F, 0x6E9F, 0x1292,
- 0x6EA2, 0x6EA2, 0x1941, 0x6EA5, 0x6EA5, 0x1408, 0x6EAA, 0x6EAA, 0x0E84,
- 0x6EAB, 0x6EAB, 0x17C3, 0x6EAF, 0x6EAF, 0x158A, 0x6EB1, 0x6EB1, 0x1B4F,
- 0x6EB6, 0x6EB6, 0x182A, 0x6EBA, 0x6EBA, 0x105D, 0x6EC2, 0x6EC2, 0x135B,
- 0x6EC4, 0x6EC4, 0x1BC1, 0x6EC5, 0x6EC5, 0x128A, 0x6EC9, 0x6EC9, 0x1EEC,
- 0x6ECB, 0x6ECB, 0x195D, 0x6ECC, 0x6ECC, 0x1BE6, 0x6ECE, 0x6ECE, 0x1E61,
- 0x6ED1, 0x6ED1, 0x1EDC, 0x6ED3, 0x6ED3, 0x19B3, 0x6ED4, 0x6ED4, 0x10C2,
- 0x6EEF, 0x6EEF, 0x1C28, 0x6EF4, 0x6EF4, 0x19E1, 0x6EF8, 0x6EF8, 0x1E88,
- 0x6EFE, 0x6EFE, 0x0EC4, 0x6EFF, 0x6EFF, 0x1247, 0x6F01, 0x6F01, 0x1711,
- 0x6F02, 0x6F02, 0x1D9E, 0x6F06, 0x6F06, 0x1CC6, 0x6F0F, 0x6F0F, 0x11D9,
- 0x6F11, 0x6F11, 0x0DF2, 0x6F14, 0x6F14, 0x1752, 0x6F15, 0x6F15, 0x1A8F,
- 0x6F20, 0x6F20, 0x123A, 0x6F22, 0x6F22, 0x1DD8, 0x6F23, 0x6F23, 0x1174,
- 0x6F2B, 0x6F2B, 0x1248, 0x6F2C, 0x6F2C, 0x1B2F, 0x6F31, 0x6F31, 0x15D5,
- 0x6F32, 0x6F32, 0x1BC2, 0x6F38, 0x6F38, 0x1A27, 0x6F3F, 0x6F3F, 0x1997,
- 0x6F41, 0x6F41, 0x177C, 0x6F51, 0x6F51, 0x1346, 0x6F54, 0x6F54, 0x0E42,
- 0x6F57, 0x6F57, 0x1B79, 0x6F58, 0x6F58, 0x1333, 0x6F5A, 0x6F5A, 0x1602,
- 0x6F5B, 0x6F5B, 0x1981, 0x6F5E, 0x6F5E, 0x11A3, 0x6F5F, 0x6F5F, 0x1524,
- 0x6F62, 0x6F62, 0x1EED, 0x6F64, 0x6F64, 0x18DA, 0x6F6D, 0x6F6D, 0x1080,
- 0x6F6E, 0x6F6E, 0x1A90, 0x6F70, 0x6F70, 0x0F92, 0x6F7A, 0x6F7A, 0x197D,
- 0x6F7C, 0x6F7C, 0x10F5, 0x6F7D, 0x6F7D, 0x13CA, 0x6F7E, 0x6F7E, 0x121F,
- 0x6F81, 0x6F81, 0x14D0, 0x6F84, 0x6F84, 0x1B80, 0x6F88, 0x6F88, 0x1C04,
- 0x6F8D, 0x6F8D, 0x1AE0, 0x6F8E, 0x6F8E, 0x1D5A, 0x6F90, 0x6F90, 0x1861,
- 0x6F94, 0x6F94, 0x1E89, 0x6F97, 0x6F97, 0x0DA0, 0x6FA3, 0x6FA3, 0x1DD9,
- 0x6FA4, 0x6FA4, 0x1D16, 0x6FA7, 0x6FA7, 0x119B, 0x6FAE, 0x6FAE, 0x1F03,
- 0x6FAF, 0x6FAF, 0x1B97, 0x6FB1, 0x6FB1, 0x1A05, 0x6FB3, 0x6FB3, 0x17B5,
- 0x6FB9, 0x6FB9, 0x1081, 0x6FBE, 0x6FBE, 0x1075, 0x6FC0, 0x6FC0, 0x0E31,
- 0x6FC1, 0x6FC1, 0x1CEA, 0x6FC2, 0x6FC2, 0x1186, 0x6FC3, 0x6FC3, 0x104F,
- 0x6FCA, 0x6FCA, 0x1793, 0x6FD5, 0x6FD5, 0x162D, 0x6FDA, 0x6FDA, 0x177D,
- 0x6FDF, 0x6FDF, 0x1A70, 0x6FE0, 0x6FE0, 0x1E8A, 0x6FE1, 0x6FE1, 0x18BE,
- 0x6FE4, 0x6FE4, 0x10C3, 0x6FE9, 0x6FE9, 0x1E8B, 0x6FEB, 0x6FEB, 0x1133,
- 0x6FEC, 0x6FEC, 0x1B00, 0x6FEF, 0x6FEF, 0x1CEB, 0x6FF1, 0x6FF1, 0x146E,
- 0x6FFE, 0x6FFE, 0x1161, 0x7001, 0x7001, 0x1702, 0x7005, 0x7005, 0x1E62,
- 0x7006, 0x7006, 0x10D6, 0x7009, 0x7009, 0x149B, 0x700B, 0x700B, 0x1687,
- 0x700F, 0x700F, 0x11E7, 0x7011, 0x7011, 0x1D96, 0x7015, 0x7015, 0x146F,
- 0x7018, 0x7018, 0x11A4, 0x701A, 0x701A, 0x1DDA, 0x701B, 0x701B, 0x177E,
- 0x701C, 0x701C, 0x18E2, 0x701D, 0x701D, 0x116D, 0x701E, 0x701E, 0x1A4C,
- 0x701F, 0x701F, 0x158B, 0x7023, 0x7023, 0x1E0F, 0x7027, 0x7027, 0x11BB,
- 0x7028, 0x7028, 0x11C0, 0x702F, 0x702F, 0x177F, 0x7037, 0x7037, 0x1925,
- 0x703E, 0x703E, 0x1129, 0x704C, 0x704C, 0x0EF1, 0x7050, 0x7050, 0x1E63,
- 0x7051, 0x7051, 0x15BA, 0x7058, 0x7058, 0x1CF6, 0x705D, 0x705D, 0x1E8C,
- 0x7063, 0x7063, 0x1249, 0x706B, 0x706B, 0x1EBB, 0x7070, 0x7070, 0x1F04,
- 0x7078, 0x7078, 0x0F51, 0x707C, 0x707C, 0x1972, 0x707D, 0x707D, 0x19B4,
- 0x7085, 0x7085, 0x0E61, 0x708A, 0x708A, 0x1C99, 0x708E, 0x708E, 0x1767,
- 0x7092, 0x7092, 0x1C38, 0x7098, 0x7098, 0x1F55, 0x7099, 0x7099, 0x195E,
- 0x709A, 0x709A, 0x0F06, 0x70A1, 0x70A1, 0x1A4D, 0x70A4, 0x70A4, 0x158C,
- 0x70AB, 0x70AB, 0x1E3C, 0x70AC, 0x70AC, 0x0E0A, 0x70AD, 0x70AD, 0x1CF7,
- 0x70AF, 0x70AF, 0x1E64, 0x70B3, 0x70B3, 0x13BA, 0x70B7, 0x70B7, 0x1AE1,
- 0x70B8, 0x70B8, 0x1973, 0x70B9, 0x70B9, 0x1A28, 0x70C8, 0x70C8, 0x1181,
- 0x70CB, 0x70CB, 0x1F47, 0x70CF, 0x70CF, 0x17B6, 0x70D8, 0x70D8, 0x1EB2,
- 0x70D9, 0x70D9, 0x111F, 0x70DD, 0x70DD, 0x1B17, 0x70DF, 0x70DF, 0x1753,
- 0x70F1, 0x70F1, 0x0E62, 0x70F9, 0x70F9, 0x1D5B, 0x70FD, 0x70FD, 0x13EC,
- 0x7104, 0x7104, 0x1F2F, 0x7109, 0x7109, 0x1720, 0x710C, 0x710C, 0x1B01,
- 0x7119, 0x7119, 0x1371, 0x711A, 0x711A, 0x142B, 0x711E, 0x711E, 0x10E5,
- 0x7121, 0x7121, 0x12D7, 0x7126, 0x7126, 0x1C39, 0x7130, 0x7130, 0x1768,
- 0x7136, 0x7136, 0x1754, 0x7147, 0x7147, 0x1F41, 0x7149, 0x7149, 0x1175,
- 0x714A, 0x714A, 0x1F38, 0x714C, 0x714C, 0x1EEE, 0x714E, 0x714E, 0x1A06,
- 0x7150, 0x7150, 0x1780, 0x7156, 0x7156, 0x102D, 0x7159, 0x7159, 0x1755,
- 0x715C, 0x715C, 0x185A, 0x715E, 0x715E, 0x14C6, 0x7164, 0x7164, 0x126C,
- 0x7165, 0x7165, 0x1ED5, 0x7166, 0x7166, 0x1F28, 0x7167, 0x7167, 0x1A91,
- 0x7169, 0x7169, 0x1386, 0x716C, 0x716C, 0x1703, 0x716E, 0x716E, 0x195F,
- 0x717D, 0x717D, 0x1534, 0x7184, 0x7184, 0x1660, 0x7189, 0x7189, 0x1862,
- 0x718A, 0x718A, 0x186D, 0x718F, 0x718F, 0x1F30, 0x7192, 0x7192, 0x1E65,
- 0x7194, 0x7194, 0x182B, 0x7199, 0x7199, 0x1F70, 0x719F, 0x719F, 0x1603,
- 0x71A2, 0x71A2, 0x13ED, 0x71AC, 0x71AC, 0x17B7, 0x71B1, 0x71B1, 0x1763,
- 0x71B9, 0x71BA, 0x1F71, 0x71BE, 0x71BE, 0x1CB1, 0x71C1, 0x71C1, 0x1770,
- 0x71C3, 0x71C3, 0x1756, 0x71C8, 0x71C8, 0x110F, 0x71C9, 0x71C9, 0x10E6,
- 0x71CE, 0x71CE, 0x11CC, 0x71D0, 0x71D0, 0x1220, 0x71D2, 0x71D2, 0x158D,
- 0x71D4, 0x71D4, 0x1387, 0x71D5, 0x71D5, 0x1757, 0x71DF, 0x71DF, 0x1781,
- 0x71E5, 0x71E5, 0x1A92, 0x71E6, 0x71E6, 0x1B98, 0x71E7, 0x71E7, 0x15D6,
- 0x71ED, 0x71ED, 0x1C4B, 0x71EE, 0x71EE, 0x1561, 0x71FB, 0x71FB, 0x1F31,
- 0x71FC, 0x71FC, 0x1670, 0x71FE, 0x71FE, 0x10C4, 0x71FF, 0x71FF, 0x180A,
- 0x7200, 0x7200, 0x1E33, 0x7206, 0x7206, 0x1D97, 0x7210, 0x7210, 0x11A5,
- 0x721B, 0x721B, 0x112A, 0x722A, 0x722A, 0x1A93, 0x722C, 0x722C, 0x1D3B,
- 0x722D, 0x722D, 0x19BB, 0x7230, 0x7230, 0x187F, 0x7232, 0x7232, 0x1897,
- 0x7235, 0x7235, 0x1974, 0x7236, 0x7236, 0x1409, 0x723A, 0x723A, 0x16ED,
- 0x723B, 0x723B, 0x1F1A, 0x723D, 0x723D, 0x14E5, 0x723E, 0x723E, 0x1916,
- 0x7240, 0x7240, 0x14E6, 0x7246, 0x7246, 0x1998, 0x7247, 0x7247, 0x1D61,
- 0x7248, 0x7248, 0x1D45, 0x724C, 0x724C, 0x1D54, 0x7252, 0x7252, 0x1C17,
- 0x7258, 0x7258, 0x10D7, 0x7259, 0x7259, 0x1696, 0x725B, 0x725B, 0x1842,
- 0x725D, 0x725D, 0x1470, 0x725F, 0x725F, 0x12A9, 0x7261, 0x7261, 0x12AA,
- 0x7262, 0x7262, 0x11C1, 0x7267, 0x7267, 0x12B6, 0x7269, 0x7269, 0x12F2,
- 0x7272, 0x7272, 0x14F9, 0x7279, 0x7279, 0x1D30, 0x727D, 0x727D, 0x0E36,
- 0x7280, 0x7280, 0x150C, 0x7281, 0x7281, 0x120F, 0x72A2, 0x72A2, 0x10D8,
- 0x72A7, 0x72A7, 0x1F73, 0x72AC, 0x72AC, 0x0E37, 0x72AF, 0x72AF, 0x1397,
- 0x72C0, 0x72C0, 0x14E7, 0x72C2, 0x72C2, 0x0F07, 0x72C4, 0x72C4, 0x19E2,
- 0x72CE, 0x72CE, 0x16C7, 0x72D0, 0x72D0, 0x1E8D, 0x72D7, 0x72D7, 0x0F52,
- 0x72D9, 0x72D9, 0x19CB, 0x72E1, 0x72E1, 0x0F27, 0x72E9, 0x72E9, 0x15D7,
- 0x72F8, 0x72F8, 0x1210, 0x72F9, 0x72F9, 0x1E55, 0x72FC, 0x72FC, 0x113F,
- 0x72FD, 0x72FD, 0x1D55, 0x730A, 0x730A, 0x1794, 0x7316, 0x7316, 0x1BC3,
- 0x731B, 0x731B, 0x1279, 0x731C, 0x731C, 0x164C, 0x731D, 0x731D, 0x1AB4,
- 0x7325, 0x7325, 0x17FA, 0x7329, 0x7329, 0x156A, 0x732A, 0x732A, 0x19CC,
- 0x732B, 0x732B, 0x12C8, 0x7336, 0x7337, 0x18BF, 0x733E, 0x733E, 0x1EDD,
- 0x733F, 0x733F, 0x1880, 0x7344, 0x7344, 0x17C0, 0x7345, 0x7345, 0x149C,
- 0x7350, 0x7350, 0x1999, 0x7352, 0x7352, 0x17B8, 0x7357, 0x7357, 0x0F8C,
- 0x7368, 0x7368, 0x10D9, 0x736A, 0x736A, 0x1F05, 0x7370, 0x7370, 0x1782,
- 0x7372, 0x7372, 0x1F0D, 0x7375, 0x7375, 0x1188, 0x7378, 0x7378, 0x15D8,
- 0x737A, 0x737A, 0x1076, 0x737B, 0x737B, 0x1E2D, 0x7384, 0x7384, 0x1E3D,
- 0x7386, 0x7386, 0x1960, 0x7387, 0x7387, 0x15B0, 0x7389, 0x7389, 0x17C1,
- 0x738B, 0x738B, 0x17F2, 0x738E, 0x738E, 0x1A4E, 0x7394, 0x7394, 0x1BF4,
- 0x7396, 0x7396, 0x0F53, 0x7397, 0x7397, 0x1843, 0x7398, 0x7398, 0x0FFE,
- 0x739F, 0x739F, 0x130F, 0x73A7, 0x73A7, 0x18DB, 0x73A9, 0x73A9, 0x17E1,
- 0x73AD, 0x73AD, 0x1471, 0x73B2, 0x73B2, 0x118F, 0x73B3, 0x73B3, 0x10A4,
- 0x73B9, 0x73B9, 0x1E3E, 0x73C0, 0x73C0, 0x131E, 0x73C2, 0x73C2, 0x0D7C,
- 0x73C9, 0x73C9, 0x1310, 0x73CA, 0x73CA, 0x14BC, 0x73CC, 0x73CC, 0x1DB8,
- 0x73CD, 0x73CD, 0x1B50, 0x73CF, 0x73CF, 0x0D8F, 0x73D6, 0x73D6, 0x0F08,
- 0x73D9, 0x73D9, 0x0ED5, 0x73DD, 0x73DD, 0x1F29, 0x73DE, 0x73DE, 0x1120,
- 0x73E0, 0x73E0, 0x1AE2, 0x73E3, 0x73E3, 0x1613, 0x73E4, 0x73E4, 0x13CB,
- 0x73E5, 0x73E5, 0x1917, 0x73E6, 0x73E6, 0x1E21, 0x73E9, 0x73E9, 0x1E66,
- 0x73EA, 0x73EA, 0x0F9F, 0x73ED, 0x73ED, 0x1334, 0x73F7, 0x73F7, 0x12D8,
- 0x73F9, 0x73F9, 0x156B, 0x73FD, 0x73FD, 0x1A4F, 0x73FE, 0x73FE, 0x1E3F,
- 0x7401, 0x7401, 0x1535, 0x7403, 0x7403, 0x0F54, 0x7405, 0x7405, 0x1140,
- 0x7406, 0x7406, 0x1211, 0x7407, 0x7407, 0x15D9, 0x7409, 0x7409, 0x11E8,
- 0x7413, 0x7413, 0x17E2, 0x741B, 0x741B, 0x1CCC, 0x7420, 0x7420, 0x1A07,
- 0x7421, 0x7421, 0x1604, 0x7422, 0x7422, 0x1CEC, 0x7425, 0x7425, 0x1E8E,
- 0x7426, 0x7426, 0x0FFF, 0x7428, 0x7428, 0x0EC5, 0x742A, 0x742A, 0x1000,
- 0x742B, 0x742B, 0x13EE, 0x742C, 0x742C, 0x17E3, 0x742E, 0x742E, 0x1ABC,
- 0x742F, 0x742F, 0x0EF2, 0x7430, 0x7430, 0x1769, 0x7433, 0x7433, 0x1229,
- 0x7434, 0x7434, 0x0FCB, 0x7435, 0x7435, 0x1451, 0x7436, 0x7436, 0x1D3C,
- 0x7438, 0x7438, 0x1CED, 0x743A, 0x743A, 0x139B, 0x743F, 0x743F, 0x1EA8,
- 0x7440, 0x7440, 0x1844, 0x7441, 0x7441, 0x12AB, 0x7443, 0x7443, 0x1C86,
- 0x7444, 0x7444, 0x1536, 0x744B, 0x744B, 0x1898, 0x7455, 0x7455, 0x1DC7,
- 0x7457, 0x7457, 0x1881, 0x7459, 0x7459, 0x104D, 0x745A, 0x745A, 0x1E8F,
- 0x745B, 0x745B, 0x1783, 0x745C, 0x745C, 0x18C1, 0x745E, 0x745E, 0x150D,
- 0x745F, 0x745F, 0x162A, 0x7460, 0x7460, 0x11E9, 0x7462, 0x7462, 0x182C,
- 0x7464, 0x7464, 0x180B, 0x7465, 0x7465, 0x17C4, 0x7468, 0x7468, 0x1B51,
- 0x7469, 0x7469, 0x1E67, 0x746A, 0x746A, 0x1231, 0x746F, 0x746F, 0x1141,
- 0x747E, 0x747E, 0x0FBE, 0x7482, 0x7482, 0x1001, 0x7483, 0x7483, 0x1212,
- 0x7487, 0x7487, 0x1537, 0x7489, 0x7489, 0x1176, 0x748B, 0x748B, 0x199A,
- 0x7498, 0x7498, 0x1221, 0x749C, 0x749C, 0x1EEF, 0x749E, 0x749E, 0x131F,
- 0x749F, 0x749F, 0x0E63, 0x74A1, 0x74A1, 0x1B52, 0x74A3, 0x74A3, 0x1002,
- 0x74A5, 0x74A5, 0x0E64, 0x74A7, 0x74A7, 0x13A1, 0x74A8, 0x74A8, 0x1B99,
- 0x74AA, 0x74AA, 0x1A94, 0x74B0, 0x74B0, 0x1ED6, 0x74B2, 0x74B2, 0x15DA,
- 0x74B5, 0x74B5, 0x1733, 0x74B9, 0x74B9, 0x1605, 0x74BD, 0x74BD, 0x14F3,
- 0x74BF, 0x74BF, 0x1538, 0x74C6, 0x74C6, 0x1B6D, 0x74CA, 0x74CA, 0x0E65,
- 0x74CF, 0x74CF, 0x11BC, 0x74D4, 0x74D4, 0x1784, 0x74D8, 0x74D8, 0x0EF3,
- 0x74DA, 0x74DA, 0x1B9A, 0x74DC, 0x74DC, 0x0EDE, 0x74E0, 0x74E0, 0x1E90,
- 0x74E2, 0x74E2, 0x1D9F, 0x74E3, 0x74E3, 0x1D46, 0x74E6, 0x74E6, 0x17D4,
- 0x74EE, 0x74EE, 0x17CC, 0x74F7, 0x74F7, 0x1961, 0x7501, 0x7501, 0x13BB,
- 0x7504, 0x7504, 0x0E38, 0x7511, 0x7511, 0x1B18, 0x7515, 0x7515, 0x17CD,
- 0x7518, 0x7518, 0x0DC1, 0x751A, 0x751A, 0x1688, 0x751B, 0x751B, 0x1C0D,
- 0x751F, 0x751F, 0x14FA, 0x7523, 0x7523, 0x14BD, 0x7525, 0x7525, 0x14FB,
- 0x7526, 0x7526, 0x158E, 0x7528, 0x7528, 0x182D, 0x752B, 0x752B, 0x13CC,
- 0x752C, 0x752C, 0x182E, 0x7530, 0x7530, 0x1A08, 0x7531, 0x7531, 0x18C2,
- 0x7532, 0x7532, 0x0DCC, 0x7533, 0x7533, 0x1671, 0x7537, 0x7537, 0x1035,
- 0x7538, 0x7538, 0x1A09, 0x753A, 0x753A, 0x1A50, 0x7547, 0x7547, 0x0FAB,
- 0x754C, 0x754C, 0x0E85, 0x754F, 0x754F, 0x17FB, 0x7551, 0x7551, 0x1A0A,
- 0x7553, 0x7553, 0x108B, 0x7554, 0x7554, 0x1335, 0x7559, 0x7559, 0x11EA,
- 0x755B, 0x755B, 0x1B53, 0x755C, 0x755C, 0x1C79, 0x755D, 0x755D, 0x12D9,
- 0x7562, 0x7562, 0x1DB9, 0x7565, 0x7565, 0x114A, 0x7566, 0x7566, 0x1F48,
- 0x756A, 0x756A, 0x1388, 0x756F, 0x756F, 0x1B02, 0x7570, 0x7570, 0x1918,
- 0x7575, 0x7575, 0x1EBC, 0x7576, 0x7576, 0x1096, 0x7578, 0x7578, 0x1003,
- 0x757A, 0x757A, 0x0DDA, 0x757F, 0x757F, 0x1004, 0x7586, 0x7586, 0x0DDB,
- 0x7587, 0x7587, 0x1AE3, 0x758A, 0x758A, 0x1C18, 0x758B, 0x758B, 0x1DBA,
- 0x758E, 0x758E, 0x1590, 0x758F, 0x758F, 0x158F, 0x7591, 0x7591, 0x1903,
- 0x759D, 0x759D, 0x14BE, 0x75A5, 0x75A5, 0x0DF3, 0x75AB, 0x75AB, 0x173F,
- 0x75B1, 0x75B1, 0x1D86, 0x75B2, 0x75B2, 0x1DAF, 0x75B3, 0x75B3, 0x0DC2,
- 0x75B5, 0x75B5, 0x1962, 0x75B8, 0x75B8, 0x1077, 0x75B9, 0x75B9, 0x1B54,
- 0x75BC, 0x75BC, 0x10F6, 0x75BD, 0x75BD, 0x19CD, 0x75BE, 0x75BE, 0x1B6E,
- 0x75C2, 0x75C2, 0x0D7D, 0x75C5, 0x75C5, 0x13BC, 0x75C7, 0x75C7, 0x1B19,
- 0x75CD, 0x75CD, 0x1919, 0x75D2, 0x75D2, 0x1704, 0x75D4, 0x75D4, 0x1CB2,
- 0x75D5, 0x75D5, 0x1F56, 0x75D8, 0x75D8, 0x1100, 0x75D9, 0x75D9, 0x0E66,
- 0x75DB, 0x75DB, 0x1D1F, 0x75E2, 0x75E2, 0x1213, 0x75F0, 0x75F0, 0x1082,
- 0x75F2, 0x75F2, 0x1232, 0x75F4, 0x75F4, 0x1CB3, 0x75FA, 0x75FA, 0x1452,
- 0x75FC, 0x75FC, 0x0EA2, 0x7600, 0x7600, 0x1712, 0x760D, 0x760D, 0x1705,
- 0x7619, 0x7619, 0x1591, 0x761F, 0x761F, 0x17C5, 0x7620, 0x7620, 0x1BE7,
- 0x7621, 0x7621, 0x1BC4, 0x7622, 0x7622, 0x1336, 0x7624, 0x7624, 0x11EB,
- 0x7626, 0x7626, 0x15DB, 0x763B, 0x763B, 0x11DA, 0x7642, 0x7642, 0x11CD,
- 0x764C, 0x764C, 0x16C2, 0x764E, 0x764E, 0x0DA1, 0x7652, 0x7652, 0x18C3,
- 0x7656, 0x7656, 0x13A2, 0x7661, 0x7661, 0x1CB4, 0x7664, 0x7664, 0x1A20,
- 0x7669, 0x7669, 0x1118, 0x766C, 0x766C, 0x1539, 0x7670, 0x7670, 0x17CE,
- 0x7672, 0x7672, 0x1A0B, 0x7678, 0x7678, 0x0E86, 0x767B, 0x767B, 0x1110,
- 0x767C, 0x767C, 0x1347, 0x767D, 0x767E, 0x1381, 0x7684, 0x7684, 0x19E3,
- 0x7686, 0x7686, 0x0DF4, 0x7687, 0x7687, 0x1EF0, 0x768E, 0x768E, 0x0F28,
- 0x7690, 0x7690, 0x0EA3, 0x7693, 0x7693, 0x1E91, 0x76AE, 0x76AE, 0x1DB0,
- 0x76BA, 0x76BA, 0x1C68, 0x76BF, 0x76BF, 0x1293, 0x76C2, 0x76C2, 0x1845,
- 0x76C3, 0x76C3, 0x1372, 0x76C6, 0x76C6, 0x142C, 0x76C8, 0x76C8, 0x1785,
- 0x76CA, 0x76CA, 0x1926, 0x76D2, 0x76D2, 0x1DF1, 0x76D6, 0x76D6, 0x0DF5,
- 0x76DB, 0x76DB, 0x156C, 0x76DC, 0x76DC, 0x10C5, 0x76DE, 0x76DE, 0x197E,
- 0x76DF, 0x76DF, 0x127B, 0x76E1, 0x76E1, 0x1B55, 0x76E3, 0x76E3, 0x0DC3,
- 0x76E4, 0x76E4, 0x1337, 0x76E7, 0x76E7, 0x11A6, 0x76EE, 0x76EE, 0x12B7,
- 0x76F2, 0x76F2, 0x127A, 0x76F4, 0x76F4, 0x1B3F, 0x76F8, 0x76F8, 0x14E8,
- 0x76FC, 0x76FC, 0x1338, 0x76FE, 0x76FE, 0x1614, 0x7701, 0x7701, 0x156D,
- 0x7704, 0x7704, 0x1284, 0x7708, 0x7708, 0x1CFD, 0x7709, 0x7709, 0x12FE,
- 0x770B, 0x770B, 0x0DA2, 0x771E, 0x771E, 0x1B56, 0x7720, 0x7720, 0x1285,
- 0x7729, 0x7729, 0x1E40, 0x7737, 0x7737, 0x0F8A, 0x7738, 0x7738, 0x12AC,
- 0x773A, 0x773A, 0x1A95, 0x773C, 0x773C, 0x16B4, 0x7740, 0x7740, 0x1B91,
- 0x774D, 0x774D, 0x1E41, 0x775B, 0x775B, 0x1A51, 0x7761, 0x7761, 0x15DC,
- 0x7763, 0x7763, 0x10DA, 0x7766, 0x7766, 0x12B8, 0x776B, 0x776B, 0x1C19,
- 0x7779, 0x7779, 0x10C6, 0x777E, 0x777E, 0x0EA4, 0x777F, 0x777F, 0x1795,
- 0x778B, 0x778B, 0x1B57, 0x7791, 0x7791, 0x1294, 0x779E, 0x779E, 0x124A,
- 0x77A5, 0x77A5, 0x13AE, 0x77AC, 0x77AC, 0x1615, 0x77AD, 0x77AD, 0x11CE,
- 0x77B0, 0x77B0, 0x0DC4, 0x77B3, 0x77B3, 0x10F7, 0x77BB, 0x77BB, 0x1C0E,
- 0x77BC, 0x77BC, 0x0E25, 0x77BF, 0x77BF, 0x0F55, 0x77D7, 0x77D7, 0x1C4C,
- 0x77DB, 0x77DB, 0x12AD, 0x77DC, 0x77DC, 0x0FDC, 0x77E2, 0x77E2, 0x164D,
- 0x77E3, 0x77E3, 0x1904, 0x77E5, 0x77E5, 0x1B30, 0x77E9, 0x77E9, 0x0F56,
- 0x77ED, 0x77ED, 0x106C, 0x77EE, 0x77EE, 0x17F6, 0x77EF, 0x77EF, 0x0F29,
- 0x77F3, 0x77F3, 0x1525, 0x7802, 0x7802, 0x149D, 0x7812, 0x7812, 0x1453,
- 0x7825, 0x7825, 0x1B31, 0x7826, 0x7826, 0x1BD0, 0x7827, 0x7827, 0x1CCD,
- 0x782C, 0x782C, 0x122C, 0x7832, 0x7832, 0x1D87, 0x7834, 0x7834, 0x1D3D,
- 0x7845, 0x7845, 0x0FA0, 0x784F, 0x784F, 0x1758, 0x785D, 0x785D, 0x1C3A,
- 0x786B, 0x786B, 0x11EC, 0x786C, 0x786C, 0x0E67, 0x786F, 0x786F, 0x1759,
- 0x787C, 0x787C, 0x143A, 0x7881, 0x7881, 0x1005, 0x7887, 0x7887, 0x1A52,
- 0x788C, 0x788C, 0x11B0, 0x788D, 0x788D, 0x16D7, 0x788E, 0x788E, 0x15BB,
- 0x7891, 0x7891, 0x1454, 0x7897, 0x7897, 0x17E4, 0x78A3, 0x78A3, 0x0DB0,
- 0x78A7, 0x78A7, 0x13A3, 0x78A9, 0x78A9, 0x1526, 0x78BA, 0x78BB, 0x1EC7,
- 0x78BC, 0x78BC, 0x1233, 0x78C1, 0x78C1, 0x1963, 0x78C5, 0x78C5, 0x135C,
- 0x78CA, 0x78CA, 0x11C2, 0x78CB, 0x78CB, 0x1B8A, 0x78CE, 0x78CE, 0x0E87,
- 0x78D0, 0x78D0, 0x1339, 0x78E8, 0x78E8, 0x1234, 0x78EC, 0x78EC, 0x0E68,
- 0x78EF, 0x78EF, 0x1006, 0x78F5, 0x78F5, 0x0DA3, 0x78FB, 0x78FB, 0x133A,
- 0x7901, 0x7901, 0x1C3B, 0x790E, 0x790E, 0x1C3C, 0x7916, 0x7916, 0x1734,
- 0x792A, 0x792A, 0x1162, 0x792B, 0x792B, 0x116E, 0x792C, 0x792C, 0x133B,
- 0x793A, 0x793A, 0x164E, 0x793E, 0x793E, 0x149E, 0x7940, 0x7940, 0x149F,
- 0x7941, 0x7941, 0x1007, 0x7947, 0x7948, 0x1008, 0x7949, 0x7949, 0x1B32,
- 0x7950, 0x7950, 0x1846, 0x7956, 0x7956, 0x1A96, 0x7957, 0x7957, 0x1B33,
- 0x795A, 0x795A, 0x1A97, 0x795B, 0x795B, 0x0E0B, 0x795C, 0x795C, 0x1E92,
- 0x795D, 0x795D, 0x1C7A, 0x795E, 0x795E, 0x1672, 0x7960, 0x7960, 0x14A0,
- 0x7965, 0x7965, 0x14E9, 0x7968, 0x7968, 0x1DA0, 0x796D, 0x796D, 0x1A71,
- 0x797A, 0x797A, 0x100A, 0x797F, 0x797F, 0x11B1, 0x7981, 0x7981, 0x0FCC,
- 0x798D, 0x798D, 0x1EBD, 0x798E, 0x798E, 0x1A53, 0x798F, 0x798F, 0x13D9,
- 0x7991, 0x7991, 0x1847, 0x79A6, 0x79A6, 0x1713, 0x79A7, 0x79A7, 0x1F74,
- 0x79AA, 0x79AA, 0x153A, 0x79AE, 0x79AE, 0x119C, 0x79B1, 0x79B1, 0x10C7,
- 0x79B3, 0x79B3, 0x1706, 0x79B9, 0x79B9, 0x1848, 0x79BD, 0x79BD, 0x0FCD,
- 0x79BE, 0x79BE, 0x1EBE, 0x79BF, 0x79BF, 0x10DB, 0x79C0, 0x79C0, 0x15DD,
- 0x79C1, 0x79C1, 0x14A1, 0x79C9, 0x79C9, 0x13BD, 0x79CA, 0x79CA, 0x1042,
- 0x79CB, 0x79CB, 0x1C69, 0x79D1, 0x79D1, 0x0EDF, 0x79D2, 0x79D2, 0x1C3D,
- 0x79D5, 0x79D5, 0x1455, 0x79D8, 0x79D8, 0x1456, 0x79DF, 0x79DF, 0x1A98,
- 0x79E4, 0x79E4, 0x1CD1, 0x79E6, 0x79E6, 0x1B58, 0x79E7, 0x79E7, 0x16CE,
- 0x79E9, 0x79E9, 0x1B6F, 0x79FB, 0x79FB, 0x191A, 0x7A00, 0x7A00, 0x1F75,
- 0x7A05, 0x7A05, 0x1578, 0x7A08, 0x7A08, 0x0DA4, 0x7A0B, 0x7A0B, 0x1A54,
- 0x7A0D, 0x7A0D, 0x1C3E, 0x7A14, 0x7A14, 0x194A, 0x7A17, 0x7A17, 0x1D56,
- 0x7A19, 0x7A19, 0x1B40, 0x7A1A, 0x7A1A, 0x1CB5, 0x7A1C, 0x7A1C, 0x1201,
- 0x7A1F, 0x7A1F, 0x1DA7, 0x7A20, 0x7A20, 0x1A99, 0x7A2E, 0x7A2E, 0x1ABD,
- 0x7A31, 0x7A31, 0x1CD2, 0x7A36, 0x7A36, 0x185B, 0x7A37, 0x7A37, 0x1B41,
- 0x7A3B, 0x7A3B, 0x10C8, 0x7A3C, 0x7A3C, 0x0D7E, 0x7A3D, 0x7A3D, 0x0E88,
- 0x7A3F, 0x7A3F, 0x0EA5, 0x7A40, 0x7A40, 0x0EBB, 0x7A46, 0x7A46, 0x12B9,
- 0x7A49, 0x7A49, 0x1CB6, 0x7A4D, 0x7A4D, 0x19E4, 0x7A4E, 0x7A4E, 0x1786,
- 0x7A57, 0x7A57, 0x15DE, 0x7A61, 0x7A61, 0x14F6, 0x7A62, 0x7A62, 0x1796,
- 0x7A69, 0x7A69, 0x17C6, 0x7A6B, 0x7A6B, 0x1EC9, 0x7A70, 0x7A70, 0x1707,
- 0x7A74, 0x7A74, 0x1E4B, 0x7A76, 0x7A76, 0x0F57, 0x7A79, 0x7A79, 0x0F7D,
- 0x7A7A, 0x7A7A, 0x0ED6, 0x7A7D, 0x7A7D, 0x1A55, 0x7A7F, 0x7A7F, 0x1BF5,
- 0x7A81, 0x7A81, 0x10EA, 0x7A84, 0x7A84, 0x1B92, 0x7A88, 0x7A88, 0x180C,
- 0x7A92, 0x7A92, 0x1B70, 0x7A93, 0x7A93, 0x1BC5, 0x7A95, 0x7A95, 0x1A9A,
- 0x7A98, 0x7A98, 0x0F72, 0x7A9F, 0x7A9F, 0x0F7A, 0x7AA9, 0x7AAA, 0x17D5,
- 0x7AAE, 0x7AAE, 0x0F7E, 0x7AAF, 0x7AAF, 0x180D, 0x7ABA, 0x7ABA, 0x0FA1,
- 0x7AC4, 0x7AC4, 0x1B9B, 0x7AC5, 0x7AC5, 0x0FA2, 0x7AC7, 0x7AC7, 0x1101,
- 0x7ACA, 0x7ACA, 0x1A21, 0x7ACB, 0x7ACB, 0x122D, 0x7AD7, 0x7AD7, 0x12C9,
- 0x7AD9, 0x7AD9, 0x1BB1, 0x7ADD, 0x7ADD, 0x13BE, 0x7ADF, 0x7ADF, 0x0E69,
- 0x7AE0, 0x7AE0, 0x199B, 0x7AE3, 0x7AE3, 0x1B03, 0x7AE5, 0x7AE5, 0x10F8,
- 0x7AEA, 0x7AEA, 0x15DF, 0x7AED, 0x7AED, 0x0DB1, 0x7AEF, 0x7AEF, 0x106D,
- 0x7AF6, 0x7AF6, 0x0E6A, 0x7AF9, 0x7AF9, 0x1AF4, 0x7AFA, 0x7AFA, 0x1C7B,
- 0x7AFF, 0x7AFF, 0x0DA5, 0x7B0F, 0x7B0F, 0x1EAC, 0x7B11, 0x7B11, 0x1592,
- 0x7B19, 0x7B19, 0x14FC, 0x7B1B, 0x7B1B, 0x19E5, 0x7B1E, 0x7B1E, 0x1D0F,
- 0x7B20, 0x7B20, 0x122E, 0x7B26, 0x7B26, 0x140A, 0x7B2C, 0x7B2C, 0x1A72,
- 0x7B2D, 0x7B2D, 0x1190, 0x7B39, 0x7B39, 0x1579, 0x7B46, 0x7B46, 0x1DBB,
- 0x7B49, 0x7B49, 0x1111, 0x7B4B, 0x7B4B, 0x0FBF, 0x7B4C, 0x7B4C, 0x1A0C,
- 0x7B4D, 0x7B4D, 0x1616, 0x7B4F, 0x7B4F, 0x138E, 0x7B50, 0x7B50, 0x0F09,
- 0x7B51, 0x7B51, 0x1C7C, 0x7B52, 0x7B52, 0x1D20, 0x7B54, 0x7B54, 0x108C,
- 0x7B56, 0x7B56, 0x1BD8, 0x7B60, 0x7B60, 0x0FAC, 0x7B6C, 0x7B6C, 0x156E,
- 0x7B6E, 0x7B6E, 0x150E, 0x7B75, 0x7B75, 0x175A, 0x7B7D, 0x7B7D, 0x17B9,
- 0x7B87, 0x7B87, 0x0DF6, 0x7B8B, 0x7B8B, 0x1A0D, 0x7B8F, 0x7B8F, 0x19BC,
- 0x7B94, 0x7B94, 0x1320, 0x7B95, 0x7B95, 0x100B, 0x7B97, 0x7B97, 0x14BF,
- 0x7B9A, 0x7B9A, 0x1B8B, 0x7B9D, 0x7B9D, 0x0E48, 0x7BA1, 0x7BA1, 0x0EF4,
- 0x7BAD, 0x7BAD, 0x1A0E, 0x7BB1, 0x7BB1, 0x14EA, 0x7BB4, 0x7BB4, 0x1982,
- 0x7BB8, 0x7BB8, 0x19CE, 0x7BC0, 0x7BC0, 0x1A22, 0x7BC1, 0x7BC1, 0x1EF1,
- 0x7BC4, 0x7BC4, 0x1398, 0x7BC6, 0x7BC6, 0x1A0F, 0x7BC7, 0x7BC7, 0x1D62,
- 0x7BC9, 0x7BC9, 0x1C7D, 0x7BD2, 0x7BD2, 0x1661, 0x7BE0, 0x7BE0, 0x1593,
- 0x7BE4, 0x7BE4, 0x10DC, 0x7BE9, 0x7BE9, 0x14A2, 0x7C07, 0x7C07, 0x1AAD,
- 0x7C12, 0x7C12, 0x1B9C, 0x7C1E, 0x7C1E, 0x106E, 0x7C21, 0x7C21, 0x0DA6,
- 0x7C27, 0x7C27, 0x1EF2, 0x7C2A, 0x7C2A, 0x1983, 0x7C2B, 0x7C2B, 0x1594,
- 0x7C3D, 0x7C3D, 0x1C0F, 0x7C3E, 0x7C3E, 0x1187, 0x7C3F, 0x7C3F, 0x140B,
- 0x7C43, 0x7C43, 0x1134, 0x7C4C, 0x7C4C, 0x1AE4, 0x7C4D, 0x7C4D, 0x19E6,
- 0x7C60, 0x7C60, 0x11BD, 0x7C64, 0x7C64, 0x1C10, 0x7C6C, 0x7C6C, 0x1214,
- 0x7C73, 0x7C73, 0x12FF, 0x7C83, 0x7C83, 0x1457, 0x7C89, 0x7C89, 0x142D,
- 0x7C92, 0x7C92, 0x122F, 0x7C95, 0x7C95, 0x1321, 0x7C97, 0x7C97, 0x1A9B,
- 0x7C98, 0x7C98, 0x1A29, 0x7C9F, 0x7C9F, 0x15A5, 0x7CA5, 0x7CA5, 0x1AF5,
- 0x7CA7, 0x7CA7, 0x199C, 0x7CAE, 0x7CAE, 0x1151, 0x7CB1, 0x7CB1, 0x1152,
- 0x7CB2, 0x7CB2, 0x1B9E, 0x7CB3, 0x7CB3, 0x0DFE, 0x7CB9, 0x7CB9, 0x15E0,
- 0x7CBE, 0x7CBE, 0x1A56, 0x7CCA, 0x7CCA, 0x1E93, 0x7CD6, 0x7CD6, 0x1097,
- 0x7CDE, 0x7CDE, 0x142E, 0x7CDF, 0x7CDF, 0x1A9C, 0x7CE0, 0x7CE0, 0x0DDC,
- 0x7CE7, 0x7CE7, 0x1153, 0x7CFB, 0x7CFB, 0x0E89, 0x7CFE, 0x7CFE, 0x0FA3,
- 0x7D00, 0x7D00, 0x100C, 0x7D02, 0x7D02, 0x1AE5, 0x7D04, 0x7D04, 0x16F1,
- 0x7D05, 0x7D05, 0x1EB3, 0x7D06, 0x7D06, 0x1849, 0x7D07, 0x7D07, 0x1F59,
- 0x7D08, 0x7D08, 0x1ED7, 0x7D0A, 0x7D0B, 0x12EA, 0x7D0D, 0x7D0D, 0x1036,
- 0x7D10, 0x7D10, 0x1058, 0x7D14, 0x7D14, 0x1617, 0x7D17, 0x7D17, 0x14A3,
- 0x7D18, 0x7D18, 0x0F19, 0x7D19, 0x7D19, 0x1B34, 0x7D1A, 0x7D1A, 0x0FD8,
- 0x7D1B, 0x7D1B, 0x142F, 0x7D20, 0x7D20, 0x1595, 0x7D21, 0x7D21, 0x135D,
- 0x7D22, 0x7D22, 0x14F7, 0x7D2B, 0x7D2B, 0x1964, 0x7D2C, 0x7D2C, 0x1AE6,
- 0x7D2E, 0x7D2E, 0x1BA9, 0x7D2F, 0x7D2F, 0x11DB, 0x7D30, 0x7D30, 0x157A,
- 0x7D33, 0x7D33, 0x1673, 0x7D35, 0x7D35, 0x19CF, 0x7D39, 0x7D39, 0x1596,
- 0x7D3A, 0x7D3A, 0x0DC5, 0x7D42, 0x7D42, 0x1ABE, 0x7D43, 0x7D43, 0x1E42,
- 0x7D44, 0x7D44, 0x1A9D, 0x7D45, 0x7D45, 0x0E6B, 0x7D46, 0x7D46, 0x133C,
- 0x7D50, 0x7D50, 0x0E43, 0x7D5E, 0x7D5E, 0x0F2A, 0x7D61, 0x7D61, 0x1121,
- 0x7D62, 0x7D62, 0x1E43, 0x7D66, 0x7D66, 0x0FD9, 0x7D68, 0x7D68, 0x18E3,
- 0x7D6A, 0x7D6A, 0x1936, 0x7D6E, 0x7D6E, 0x150F, 0x7D71, 0x7D71, 0x1D21,
- 0x7D72, 0x7D72, 0x14A4, 0x7D73, 0x7D73, 0x0DDD, 0x7D76, 0x7D76, 0x1A23,
- 0x7D79, 0x7D79, 0x0E39, 0x7D7F, 0x7D7F, 0x0F58, 0x7D8E, 0x7D8E, 0x1A57,
- 0x7D8F, 0x7D8F, 0x15E1, 0x7D93, 0x7D93, 0x0E6C, 0x7D9C, 0x7D9C, 0x1ABF,
- 0x7DA0, 0x7DA0, 0x11B2, 0x7DA2, 0x7DA2, 0x1AE7, 0x7DAC, 0x7DAC, 0x15E2,
- 0x7DAD, 0x7DAD, 0x18C4, 0x7DB1, 0x7DB1, 0x0DDE, 0x7DB2, 0x7DB2, 0x125D,
- 0x7DB4, 0x7DB4, 0x1C05, 0x7DB5, 0x7DB5, 0x1BD1, 0x7DB8, 0x7DB8, 0x11F6,
- 0x7DBA, 0x7DBA, 0x100D, 0x7DBB, 0x7DBB, 0x1CF8, 0x7DBD, 0x7DBD, 0x1975,
- 0x7DBE, 0x7DBE, 0x1202, 0x7DBF, 0x7DBF, 0x1286, 0x7DC7, 0x7DC7, 0x1CB7,
- 0x7DCA, 0x7DCA, 0x101E, 0x7DCB, 0x7DCB, 0x1458, 0x7DD6, 0x7DD6, 0x1510,
- 0x7DD8, 0x7DD8, 0x1DEA, 0x7DDA, 0x7DDA, 0x153B, 0x7DDD, 0x7DDD, 0x1B7A,
- 0x7DDE, 0x7DDE, 0x106F, 0x7DE0, 0x7DE0, 0x1C29, 0x7DE1, 0x7DE1, 0x1311,
- 0x7DE3, 0x7DE3, 0x175B, 0x7DE8, 0x7DE8, 0x1D63, 0x7DE9, 0x7DE9, 0x17E5,
- 0x7DEC, 0x7DEC, 0x1287, 0x7DEF, 0x7DEF, 0x1899, 0x7DF4, 0x7DF4, 0x1177,
- 0x7DFB, 0x7DFB, 0x1CB8, 0x7E09, 0x7E09, 0x1B59, 0x7E0A, 0x7E0A, 0x16DF,
- 0x7E15, 0x7E15, 0x17C7, 0x7E1B, 0x7E1B, 0x1322, 0x7E1D, 0x7E1D, 0x1B5A,
- 0x7E1E, 0x7E1E, 0x1E94, 0x7E1F, 0x7E1F, 0x181B, 0x7E21, 0x7E21, 0x19B5,
- 0x7E23, 0x7E23, 0x1E44, 0x7E2B, 0x7E2B, 0x13EF, 0x7E2E, 0x7E2E, 0x1C7E,
- 0x7E2F, 0x7E2F, 0x175C, 0x7E31, 0x7E31, 0x1AC0, 0x7E37, 0x7E37, 0x11DC,
- 0x7E3D, 0x7E3D, 0x1C59, 0x7E3E, 0x7E3E, 0x19E7, 0x7E41, 0x7E41, 0x1389,
- 0x7E43, 0x7E43, 0x143B, 0x7E46, 0x7E46, 0x12DA, 0x7E47, 0x7E47, 0x180E,
- 0x7E52, 0x7E52, 0x1B1A, 0x7E54, 0x7E54, 0x1B42, 0x7E55, 0x7E55, 0x153C,
- 0x7E5E, 0x7E5E, 0x180F, 0x7E61, 0x7E61, 0x15E3, 0x7E69, 0x7E69, 0x1639,
- 0x7E6A, 0x7E6A, 0x1F06, 0x7E6B, 0x7E6B, 0x0E8A, 0x7E6D, 0x7E6D, 0x0E3A,
- 0x7E70, 0x7E70, 0x1A9E, 0x7E79, 0x7E79, 0x1740, 0x7E7C, 0x7E7C, 0x0E8B,
- 0x7E82, 0x7E82, 0x1B9D, 0x7E8C, 0x7E8C, 0x15A6, 0x7E8F, 0x7E8F, 0x1A10,
- 0x7E93, 0x7E93, 0x1787, 0x7E96, 0x7E96, 0x155A, 0x7E98, 0x7E98, 0x1B9F,
- 0x7E9B, 0x7E9B, 0x10DD, 0x7E9C, 0x7E9C, 0x1135, 0x7F36, 0x7F36, 0x140C,
- 0x7F38, 0x7F38, 0x1E01, 0x7F3A, 0x7F3A, 0x0E44, 0x7F4C, 0x7F4C, 0x16E3,
- 0x7F50, 0x7F50, 0x0EF5, 0x7F54, 0x7F54, 0x125E, 0x7F55, 0x7F55, 0x1DDB,
- 0x7F6A, 0x7F6A, 0x1ACB, 0x7F6B, 0x7F6B, 0x0F0E, 0x7F6E, 0x7F6E, 0x1CB9,
- 0x7F70, 0x7F70, 0x138F, 0x7F72, 0x7F72, 0x1511, 0x7F75, 0x7F75, 0x126D,
- 0x7F77, 0x7F77, 0x1D3E, 0x7F79, 0x7F79, 0x1215, 0x7F85, 0x7F85, 0x1119,
- 0x7F88, 0x7F88, 0x100E, 0x7F8A, 0x7F8A, 0x1708, 0x7F8C, 0x7F8C, 0x0DDF,
- 0x7F8E, 0x7F8E, 0x1300, 0x7F94, 0x7F94, 0x0EA6, 0x7F9A, 0x7F9A, 0x1191,
- 0x7F9E, 0x7F9E, 0x15E4, 0x7FA4, 0x7FA4, 0x0F73, 0x7FA8, 0x7FA8, 0x153D,
- 0x7FA9, 0x7FA9, 0x1905, 0x7FB2, 0x7FB2, 0x1F76, 0x7FB8, 0x7FB8, 0x1216,
- 0x7FB9, 0x7FB9, 0x0DFF, 0x7FBD, 0x7FBD, 0x184A, 0x7FC1, 0x7FC1, 0x17CF,
- 0x7FC5, 0x7FC5, 0x164F, 0x7FCA, 0x7FCA, 0x1927, 0x7FCC, 0x7FCC, 0x1928,
- 0x7FCE, 0x7FCE, 0x1192, 0x7FD2, 0x7FD2, 0x162F, 0x7FD4, 0x7FD4, 0x14EB,
- 0x7FD5, 0x7FD5, 0x1F61, 0x7FDF, 0x7FDF, 0x19E8, 0x7FE0, 0x7FE0, 0x1C9A,
- 0x7FE1, 0x7FE1, 0x1459, 0x7FE9, 0x7FE9, 0x1D64, 0x7FEB, 0x7FEB, 0x17E6,
- 0x7FF0, 0x7FF0, 0x1DDC, 0x7FF9, 0x7FF9, 0x0F2B, 0x7FFC, 0x7FFC, 0x1929,
- 0x8000, 0x8000, 0x1810, 0x8001, 0x8001, 0x11A7, 0x8003, 0x8003, 0x0EA7,
- 0x8005, 0x8005, 0x1965, 0x8006, 0x8006, 0x100F, 0x8009, 0x8009, 0x0F59,
- 0x800C, 0x800C, 0x191B, 0x8010, 0x8010, 0x103E, 0x8015, 0x8015, 0x0E6D,
- 0x8017, 0x8017, 0x12AE, 0x8018, 0x8018, 0x1863, 0x802D, 0x802D, 0x1010,
- 0x8033, 0x8033, 0x191C, 0x8036, 0x8036, 0x16EE, 0x803D, 0x803D, 0x1CFE,
- 0x803F, 0x803F, 0x0E6E, 0x8043, 0x8043, 0x1083, 0x8046, 0x8046, 0x1193,
- 0x804A, 0x804A, 0x11CF, 0x8056, 0x8056, 0x156F, 0x8058, 0x8058, 0x1477,
- 0x805A, 0x805A, 0x1C9B, 0x805E, 0x805E, 0x12EC, 0x806F, 0x806F, 0x1178,
- 0x8070, 0x8070, 0x1C5A, 0x8072, 0x8072, 0x1570, 0x8073, 0x8073, 0x182F,
- 0x8077, 0x8077, 0x1B43, 0x807D, 0x807D, 0x1C20, 0x807E, 0x807E, 0x11BE,
- 0x807F, 0x807F, 0x18E0, 0x8084, 0x8084, 0x191D, 0x8085, 0x8085, 0x1606,
- 0x8086, 0x8086, 0x14A5, 0x8087, 0x8087, 0x1A9F, 0x8089, 0x8089, 0x18D5,
- 0x808B, 0x808B, 0x11FD, 0x808C, 0x808C, 0x1011, 0x8096, 0x8096, 0x1C3F,
- 0x809B, 0x809B, 0x1E02, 0x809D, 0x809D, 0x0DA7, 0x80A1, 0x80A1, 0x0EA8,
- 0x80A2, 0x80A2, 0x1B35, 0x80A5, 0x80A5, 0x145A, 0x80A9, 0x80A9, 0x0E3B,
- 0x80AA, 0x80AA, 0x135E, 0x80AF, 0x80AF, 0x0FDD, 0x80B1, 0x80B1, 0x0F1A,
- 0x80B2, 0x80B2, 0x18D6, 0x80B4, 0x80B4, 0x1F1B, 0x80BA, 0x80BA, 0x1D74,
- 0x80C3, 0x80C3, 0x189A, 0x80C4, 0x80C4, 0x1AD1, 0x80CC, 0x80CC, 0x1373,
- 0x80CE, 0x80CE, 0x1D10, 0x80DA, 0x80DA, 0x1374, 0x80DB, 0x80DB, 0x0DCD,
- 0x80DE, 0x80DE, 0x1D88, 0x80E1, 0x80E1, 0x1E95, 0x80E4, 0x80E4, 0x18DC,
- 0x80E5, 0x80E5, 0x1512, 0x80F1, 0x80F1, 0x0F0A, 0x80F4, 0x80F4, 0x10F9,
- 0x80F8, 0x80F8, 0x1F51, 0x80FD, 0x80FD, 0x1059, 0x8102, 0x8102, 0x1B36,
- 0x8105, 0x8105, 0x1E56, 0x8106, 0x8106, 0x1C9C, 0x8107, 0x8107, 0x1E57,
- 0x8108, 0x8108, 0x1272, 0x810A, 0x810A, 0x1BE8, 0x8118, 0x8118, 0x17E7,
- 0x811A, 0x811A, 0x0D90, 0x811B, 0x811B, 0x0E6F, 0x8123, 0x8123, 0x1618,
- 0x8129, 0x8129, 0x15E5, 0x812B, 0x812B, 0x1CFB, 0x812F, 0x812F, 0x1D89,
- 0x8139, 0x8139, 0x1BC6, 0x813E, 0x813E, 0x145B, 0x814B, 0x814B, 0x16E0,
- 0x814E, 0x814E, 0x1674, 0x8150, 0x8151, 0x140D, 0x8154, 0x8154, 0x0DE0,
- 0x8155, 0x8155, 0x17E8, 0x8165, 0x8165, 0x1571, 0x8166, 0x8166, 0x1053,
- 0x816B, 0x816B, 0x1AC1, 0x8170, 0x8170, 0x1811, 0x8171, 0x8171, 0x0E18,
- 0x8178, 0x8178, 0x199D, 0x8179, 0x8179, 0x13DA, 0x817A, 0x817A, 0x153E,
- 0x817F, 0x817F, 0x1D25, 0x8180, 0x8180, 0x135F, 0x8188, 0x8188, 0x0E32,
- 0x818A, 0x818A, 0x1323, 0x818F, 0x818F, 0x0EA9, 0x819A, 0x819A, 0x140F,
- 0x819C, 0x819C, 0x123B, 0x819D, 0x819D, 0x162B, 0x81A0, 0x81A0, 0x0F2C,
- 0x81A3, 0x81A3, 0x1B71, 0x81A8, 0x81A8, 0x1D5C, 0x81B3, 0x81B3, 0x153F,
- 0x81B5, 0x81B5, 0x1C91, 0x81BA, 0x81BA, 0x18F8, 0x81BD, 0x81BD, 0x1084,
- 0x81BE, 0x81BE, 0x1F07, 0x81BF, 0x81BF, 0x1050, 0x81C0, 0x81C0, 0x1107,
- 0x81C2, 0x81C2, 0x145C, 0x81C6, 0x81C6, 0x171C, 0x81CD, 0x81CD, 0x1A73,
- 0x81D8, 0x81D8, 0x113A, 0x81DF, 0x81DF, 0x199E, 0x81E3, 0x81E3, 0x1675,
- 0x81E5, 0x81E5, 0x17D7, 0x81E7, 0x81E7, 0x199F, 0x81E8, 0x81E8, 0x122A,
- 0x81EA, 0x81EA, 0x1966, 0x81ED, 0x81ED, 0x1C9D, 0x81F3, 0x81F3, 0x1B37,
- 0x81F4, 0x81F4, 0x1CBA, 0x81FA, 0x81FA, 0x10A5, 0x81FB, 0x81FB, 0x1B5B,
- 0x81FC, 0x81FC, 0x0F5A, 0x81FE, 0x81FE, 0x18C5, 0x8205, 0x8205, 0x0F5B,
- 0x8207, 0x8207, 0x1735, 0x8208, 0x8208, 0x1F62, 0x820A, 0x820A, 0x0F5C,
- 0x820C, 0x820C, 0x1550, 0x820D, 0x820D, 0x14A6, 0x8212, 0x8212, 0x1513,
- 0x821B, 0x821B, 0x1BF6, 0x821C, 0x821C, 0x1619, 0x821E, 0x821E, 0x12DB,
- 0x821F, 0x821F, 0x1AE8, 0x8221, 0x8221, 0x0DE1, 0x822A, 0x822A, 0x1E03,
- 0x822B, 0x822B, 0x1360, 0x822C, 0x822C, 0x133D, 0x8235, 0x8235, 0x1CDE,
- 0x8236, 0x8236, 0x1324, 0x8237, 0x8237, 0x1E45, 0x8239, 0x8239, 0x1540,
- 0x8240, 0x8240, 0x1410, 0x8245, 0x8245, 0x1736, 0x8247, 0x8247, 0x1A58,
- 0x8259, 0x8259, 0x1BC7, 0x8264, 0x8264, 0x1906, 0x8266, 0x8266, 0x1DEB,
- 0x826E, 0x826E, 0x0DA8, 0x826F, 0x826F, 0x1154, 0x8271, 0x8271, 0x0DA9,
- 0x8272, 0x8272, 0x14F8, 0x8276, 0x8276, 0x176A, 0x8278, 0x8278, 0x1C40,
- 0x827E, 0x827E, 0x16D8, 0x828B, 0x828B, 0x184B, 0x828D, 0x828D, 0x1976,
- 0x828E, 0x828E, 0x0F7F, 0x8292, 0x8292, 0x125F, 0x8299, 0x8299, 0x1411,
- 0x829A, 0x829A, 0x1108, 0x829D, 0x829D, 0x1B38, 0x829F, 0x829F, 0x14CC,
- 0x82A5, 0x82A5, 0x0DF7, 0x82A6, 0x82A6, 0x1E96, 0x82A9, 0x82A9, 0x0FCE,
- 0x82AC, 0x82AC, 0x1430, 0x82AD, 0x82AD, 0x1D3F, 0x82AE, 0x82AE, 0x1797,
- 0x82AF, 0x82AF, 0x1689, 0x82B1, 0x82B1, 0x1EBF, 0x82B3, 0x82B3, 0x1361,
- 0x82B7, 0x82B7, 0x1B39, 0x82B8, 0x82B8, 0x1864, 0x82B9, 0x82B9, 0x0FC0,
- 0x82BB, 0x82BB, 0x1C6A, 0x82BC, 0x82BC, 0x12AF, 0x82BD, 0x82BD, 0x1697,
- 0x82BF, 0x82BF, 0x1952, 0x82D1, 0x82D1, 0x1882, 0x82D2, 0x82D2, 0x176B,
- 0x82D4, 0x82D4, 0x1D11, 0x82D5, 0x82D5, 0x1C41, 0x82D7, 0x82D7, 0x12CA,
- 0x82DB, 0x82DB, 0x0D7F, 0x82DE, 0x82DE, 0x1D8A, 0x82DF, 0x82DF, 0x0F5D,
- 0x82E1, 0x82E1, 0x191E, 0x82E5, 0x82E5, 0x16F2, 0x82E6, 0x82E6, 0x0EAA,
- 0x82E7, 0x82E7, 0x19D0, 0x82F1, 0x82F1, 0x1788, 0x82FD, 0x82FD, 0x0EAB,
- 0x82FE, 0x82FE, 0x1DBC, 0x8301, 0x8301, 0x1B09, 0x8302, 0x8302, 0x12DC,
- 0x8303, 0x8303, 0x1399, 0x8304, 0x8304, 0x0D80, 0x8305, 0x8305, 0x12B0,
- 0x8309, 0x8309, 0x1255, 0x8317, 0x8317, 0x1295, 0x8328, 0x8328, 0x1967,
- 0x832B, 0x832B, 0x1260, 0x832F, 0x832F, 0x13DB, 0x8331, 0x8331, 0x15E6,
- 0x8334, 0x8334, 0x1F08, 0x8335, 0x8335, 0x1937, 0x8336, 0x8336, 0x105F,
- 0x8338, 0x8338, 0x1830, 0x8339, 0x8339, 0x1737, 0x8340, 0x8340, 0x161A,
- 0x8347, 0x8347, 0x1E1C, 0x8349, 0x8349, 0x1C42, 0x834A, 0x834A, 0x1E68,
- 0x834F, 0x834F, 0x194B, 0x8351, 0x8351, 0x191F, 0x8352, 0x8352, 0x1EF3,
- 0x8373, 0x8373, 0x1102, 0x8377, 0x8377, 0x1DC8, 0x837B, 0x837B, 0x19E9,
- 0x8389, 0x8389, 0x1217, 0x838A, 0x838A, 0x19A0, 0x838E, 0x838E, 0x14A7,
- 0x8396, 0x8396, 0x0E70, 0x8398, 0x8398, 0x1676, 0x839E, 0x839E, 0x17E9,
- 0x83A2, 0x83A2, 0x1E58, 0x83A9, 0x83A9, 0x1412, 0x83AA, 0x83AA, 0x1698,
- 0x83AB, 0x83AB, 0x123C, 0x83BD, 0x83BD, 0x1261, 0x83C1, 0x83C1, 0x1C21,
- 0x83C5, 0x83C5, 0x0EF6, 0x83C9, 0x83C9, 0x11B3, 0x83CA, 0x83CA, 0x0F6D,
- 0x83CC, 0x83CC, 0x0FAD, 0x83D3, 0x83D3, 0x0EE0, 0x83D6, 0x83D6, 0x1BC8,
- 0x83DC, 0x83DC, 0x1BD2, 0x83E9, 0x83E9, 0x13CD, 0x83EB, 0x83EB, 0x0FC1,
- 0x83EF, 0x83EF, 0x1EC0, 0x83F0, 0x83F0, 0x0EAC, 0x83F1, 0x83F1, 0x1203,
- 0x83F2, 0x83F2, 0x145D, 0x83F4, 0x83F4, 0x16C3, 0x83F9, 0x83F9, 0x19D1,
- 0x83FD, 0x83FD, 0x1607, 0x8403, 0x8403, 0x1C92, 0x8404, 0x8404, 0x10C9,
- 0x840A, 0x840A, 0x1147, 0x840C, 0x840C, 0x127C, 0x840D, 0x840D, 0x1D6C,
- 0x840E, 0x840E, 0x189B, 0x8429, 0x8429, 0x1C6B, 0x842C, 0x842C, 0x124B,
- 0x8431, 0x8431, 0x1F39, 0x8438, 0x8438, 0x18C6, 0x843D, 0x843D, 0x1122,
- 0x8449, 0x8449, 0x1771, 0x8457, 0x8457, 0x19D2, 0x845B, 0x845B, 0x0DB2,
- 0x8461, 0x8461, 0x1D8B, 0x8463, 0x8463, 0x10FA, 0x8466, 0x8466, 0x189C,
- 0x846B, 0x846B, 0x1E97, 0x846C, 0x846C, 0x19A1, 0x846F, 0x846F, 0x16F3,
- 0x8475, 0x8475, 0x0FA4, 0x847A, 0x847A, 0x1B12, 0x8490, 0x8490, 0x15E7,
- 0x8494, 0x8494, 0x1650, 0x8499, 0x8499, 0x12BF, 0x849C, 0x849C, 0x14C0,
- 0x84A1, 0x84A1, 0x1362, 0x84B2, 0x84B2, 0x1D8C, 0x84B8, 0x84B8, 0x1B1B,
- 0x84BB, 0x84BB, 0x16F4, 0x84BC, 0x84BC, 0x1BC9, 0x84BF, 0x84BF, 0x1E98,
- 0x84C0, 0x84C0, 0x15AD, 0x84C2, 0x84C2, 0x1296, 0x84C4, 0x84C4, 0x1C7F,
- 0x84C6, 0x84C6, 0x1527, 0x84C9, 0x84C9, 0x1831, 0x84CB, 0x84CB, 0x0DF8,
- 0x84CD, 0x84CD, 0x1651, 0x84D1, 0x84D1, 0x14A8, 0x84DA, 0x84DA, 0x15E8,
- 0x84EC, 0x84EC, 0x13F0, 0x84EE, 0x84EE, 0x1179, 0x84F4, 0x84F4, 0x161B,
- 0x84FC, 0x84FC, 0x11D0, 0x8511, 0x8511, 0x128B, 0x8513, 0x8513, 0x124C,
- 0x8514, 0x8514, 0x13DC, 0x8517, 0x8517, 0x1968, 0x8518, 0x8518, 0x14CD,
- 0x851A, 0x851A, 0x186A, 0x851E, 0x851E, 0x11DD, 0x8521, 0x8521, 0x1BD3,
- 0x8523, 0x8523, 0x19A2, 0x8525, 0x8525, 0x1C5B, 0x852C, 0x852C, 0x1597,
- 0x852D, 0x852D, 0x18EF, 0x852F, 0x852F, 0x1B5C, 0x853D, 0x853D, 0x1D75,
- 0x853F, 0x853F, 0x189D, 0x8541, 0x8541, 0x1085, 0x8543, 0x8543, 0x138A,
- 0x8549, 0x8549, 0x1C43, 0x854E, 0x854E, 0x0F2D, 0x8553, 0x8553, 0x1865,
- 0x8559, 0x8559, 0x1E74, 0x8563, 0x8563, 0x161C, 0x8568, 0x8568, 0x0F8D,
- 0x8569, 0x8569, 0x1D06, 0x856A, 0x856A, 0x12DD, 0x856D, 0x856D, 0x1598,
- 0x8584, 0x8584, 0x1325, 0x8587, 0x8587, 0x1301, 0x858F, 0x858F, 0x1907,
- 0x8591, 0x8591, 0x0DE2, 0x8594, 0x8594, 0x19A3, 0x859B, 0x859B, 0x1551,
- 0x85A6, 0x85A6, 0x1BF7, 0x85A8, 0x85A8, 0x1F35, 0x85A9, 0x85A9, 0x14C7,
- 0x85AA, 0x85AA, 0x1677, 0x85AF, 0x85AF, 0x1514, 0x85B0, 0x85B0, 0x1F32,
- 0x85BA, 0x85BA, 0x1A74, 0x85C1, 0x85C1, 0x0EAD, 0x85C9, 0x85C9, 0x1969,
- 0x85CD, 0x85CD, 0x1136, 0x85CE, 0x85CE, 0x1678, 0x85CF, 0x85CF, 0x19A4,
- 0x85D5, 0x85D5, 0x184C, 0x85DC, 0x85DC, 0x1163, 0x85DD, 0x85DD, 0x1798,
- 0x85E4, 0x85E4, 0x1112, 0x85E5, 0x85E5, 0x16F5, 0x85E9, 0x85E9, 0x138B,
- 0x85EA, 0x85EA, 0x15E9, 0x85F7, 0x85F7, 0x19D3, 0x85FA, 0x85FA, 0x1222,
- 0x85FB, 0x85FB, 0x1AA0, 0x85FF, 0x85FF, 0x0EE9, 0x8602, 0x8602, 0x1799,
- 0x8606, 0x8606, 0x11A8, 0x8607, 0x8607, 0x1599, 0x860A, 0x860A, 0x17C8,
- 0x8616, 0x8616, 0x1724, 0x8617, 0x8617, 0x13A4, 0x861A, 0x861A, 0x1541,
- 0x862D, 0x862D, 0x112B, 0x863F, 0x863F, 0x111A, 0x864E, 0x864E, 0x1E99,
- 0x8650, 0x8650, 0x1DD0, 0x8654, 0x8654, 0x0E19, 0x8655, 0x8655, 0x1BDD,
- 0x865B, 0x865B, 0x1E29, 0x865C, 0x865C, 0x11A9, 0x865E, 0x865E, 0x184D,
- 0x865F, 0x865F, 0x1E9A, 0x8667, 0x8667, 0x1F49, 0x8679, 0x8679, 0x1EB4,
- 0x868A, 0x868A, 0x12ED, 0x868C, 0x868C, 0x1363, 0x8693, 0x8693, 0x1938,
- 0x86A3, 0x86A3, 0x0ED7, 0x86A4, 0x86A4, 0x1AA1, 0x86A9, 0x86A9, 0x1CBB,
- 0x86C7, 0x86C7, 0x14A9, 0x86CB, 0x86CB, 0x1070, 0x86D4, 0x86D4, 0x1F09,
- 0x86D9, 0x86D9, 0x17D8, 0x86DB, 0x86DB, 0x1AE9, 0x86DF, 0x86DF, 0x0F2E,
- 0x86E4, 0x86E4, 0x1DF2, 0x86ED, 0x86ED, 0x1B72, 0x86FE, 0x86FE, 0x1699,
- 0x8700, 0x8700, 0x1C4D, 0x8702, 0x8702, 0x13F1, 0x8703, 0x8703, 0x1679,
- 0x8708, 0x8708, 0x17BA, 0x8718, 0x8718, 0x1B3A, 0x871A, 0x871A, 0x145E,
- 0x871C, 0x871C, 0x1314, 0x874E, 0x874E, 0x0DB4, 0x8755, 0x8755, 0x1662,
- 0x8757, 0x8757, 0x1EF4, 0x875F, 0x875F, 0x189E, 0x8766, 0x8766, 0x1DC9,
- 0x8768, 0x8768, 0x162C, 0x8774, 0x8774, 0x1E9B, 0x8776, 0x8776, 0x1A2F,
- 0x8778, 0x8778, 0x17D9, 0x8782, 0x8782, 0x1142, 0x878D, 0x878D, 0x18E4,
- 0x879F, 0x879F, 0x1297, 0x87A2, 0x87A2, 0x1E69, 0x87B3, 0x87B3, 0x1098,
- 0x87BA, 0x87BA, 0x111B, 0x87C4, 0x87C4, 0x1CD0, 0x87E0, 0x87E0, 0x133E,
- 0x87EC, 0x87EC, 0x1542, 0x87EF, 0x87EF, 0x1812, 0x87F2, 0x87F2, 0x1C8D,
- 0x87F9, 0x87F9, 0x1E10, 0x87FB, 0x87FB, 0x1908, 0x87FE, 0x87FE, 0x155B,
- 0x8805, 0x8805, 0x163A, 0x881F, 0x881F, 0x113B, 0x8822, 0x8822, 0x1B04,
- 0x8823, 0x8823, 0x1164, 0x8831, 0x8831, 0x0EAE, 0x8836, 0x8836, 0x1984,
- 0x883B, 0x883B, 0x124D, 0x8840, 0x8840, 0x1E4C, 0x8846, 0x8846, 0x1B0C,
- 0x884C, 0x884C, 0x1E1D, 0x884D, 0x884D, 0x175D, 0x8852, 0x8852, 0x1E46,
- 0x8853, 0x8853, 0x1624, 0x8857, 0x8857, 0x0D81, 0x8859, 0x8859, 0x169A,
- 0x885B, 0x885B, 0x189F, 0x885D, 0x885D, 0x1C8E, 0x8861, 0x8861, 0x1E6A,
- 0x8862, 0x8862, 0x0F5E, 0x8863, 0x8863, 0x1909, 0x8868, 0x8868, 0x1DA1,
- 0x886B, 0x886B, 0x14CE, 0x8870, 0x8870, 0x15BD, 0x8872, 0x8872, 0x1037,
- 0x8877, 0x8877, 0x1C8F, 0x887E, 0x887F, 0x0FCF, 0x8881, 0x8881, 0x1883,
- 0x8882, 0x8882, 0x129B, 0x8888, 0x8888, 0x0D82, 0x888B, 0x888B, 0x10A6,
- 0x888D, 0x888D, 0x1D8D, 0x8892, 0x8892, 0x1071, 0x8896, 0x8896, 0x15EA,
- 0x8897, 0x8897, 0x1B5D, 0x889E, 0x889E, 0x0EC6, 0x88AB, 0x88AB, 0x1DB1,
- 0x88B4, 0x88B4, 0x0EAF, 0x88C1, 0x88C1, 0x19B6, 0x88C2, 0x88C2, 0x1182,
- 0x88CF, 0x88CF, 0x1218, 0x88D4, 0x88D4, 0x179A, 0x88D5, 0x88D5, 0x18C7,
- 0x88D9, 0x88D9, 0x0F74, 0x88DC, 0x88DC, 0x13CE, 0x88DD, 0x88DD, 0x19A5,
- 0x88DF, 0x88DF, 0x14AA, 0x88E1, 0x88E1, 0x1219, 0x88E8, 0x88E8, 0x145F,
- 0x88F3, 0x88F3, 0x14EC, 0x88F4, 0x88F5, 0x1375, 0x88F8, 0x88F8, 0x111C,
- 0x88FD, 0x88FD, 0x1A75, 0x8907, 0x8907, 0x13DD, 0x8910, 0x8910, 0x0DB3,
- 0x8912, 0x8912, 0x1D8E, 0x8913, 0x8913, 0x13CF, 0x8918, 0x8918, 0x18A0,
- 0x8919, 0x8919, 0x1377, 0x8925, 0x8925, 0x181C, 0x892A, 0x892A, 0x1D26,
- 0x8936, 0x8936, 0x1630, 0x8938, 0x8938, 0x11DE, 0x893B, 0x893B, 0x1552,
- 0x8941, 0x8941, 0x0DE3, 0x8944, 0x8944, 0x1709, 0x895F, 0x895F, 0x0FD1,
- 0x8964, 0x8964, 0x1137, 0x896A, 0x896A, 0x1256, 0x8972, 0x8972, 0x1631,
- 0x897F, 0x897F, 0x1515, 0x8981, 0x8981, 0x1813, 0x8983, 0x8983, 0x1086,
- 0x8986, 0x8986, 0x13DE, 0x8987, 0x8987, 0x1D57, 0x898B, 0x898B, 0x0E3C,
- 0x898F, 0x898F, 0x0FA5, 0x8993, 0x8993, 0x127E, 0x8996, 0x8996, 0x1652,
- 0x89A1, 0x89A1, 0x0E33, 0x89A9, 0x89A9, 0x10CA, 0x89AA, 0x89AA, 0x1CC3,
- 0x89B2, 0x89B2, 0x0FC2, 0x89BA, 0x89BA, 0x0D91, 0x89BD, 0x89BD, 0x1138,
- 0x89C0, 0x89C0, 0x0EF7, 0x89D2, 0x89D2, 0x0D92, 0x89E3, 0x89E3, 0x1E11,
- 0x89F4, 0x89F4, 0x14ED, 0x89F8, 0x89F8, 0x1C4E, 0x8A00, 0x8A00, 0x1721,
- 0x8A02, 0x8A02, 0x1A59, 0x8A03, 0x8A03, 0x1413, 0x8A08, 0x8A08, 0x0E8C,
- 0x8A0A, 0x8A0A, 0x167A, 0x8A0C, 0x8A0C, 0x1EB5, 0x8A0E, 0x8A0E, 0x1D1C,
- 0x8A13, 0x8A13, 0x1F33, 0x8A16, 0x8A16, 0x1F5A, 0x8A17, 0x8A17, 0x1CEE,
- 0x8A18, 0x8A18, 0x1012, 0x8A1B, 0x8A1B, 0x17DA, 0x8A1D, 0x8A1D, 0x169B,
- 0x8A1F, 0x8A1F, 0x15B5, 0x8A23, 0x8A23, 0x0E45, 0x8A25, 0x8A25, 0x1056,
- 0x8A2A, 0x8A2A, 0x1364, 0x8A2D, 0x8A2D, 0x1553, 0x8A31, 0x8A31, 0x1E2A,
- 0x8A34, 0x8A34, 0x159A, 0x8A36, 0x8A36, 0x0D83, 0x8A3A, 0x8A3A, 0x1B5E,
- 0x8A3B, 0x8A3B, 0x1AEA, 0x8A50, 0x8A50, 0x14AB, 0x8A54, 0x8A54, 0x1AA2,
- 0x8A55, 0x8A55, 0x1D6D, 0x8A5B, 0x8A5B, 0x19D4, 0x8A5E, 0x8A5E, 0x14AC,
- 0x8A60, 0x8A60, 0x1789, 0x8A62, 0x8A62, 0x161D, 0x8A63, 0x8A63, 0x179B,
- 0x8A66, 0x8A66, 0x1653, 0x8A69, 0x8A69, 0x1654, 0x8A6D, 0x8A6D, 0x0F93,
- 0x8A6E, 0x8A6E, 0x1A11, 0x8A70, 0x8A70, 0x1F77, 0x8A71, 0x8A71, 0x1EC1,
- 0x8A72, 0x8A72, 0x1E12, 0x8A73, 0x8A73, 0x14EE, 0x8A75, 0x8A75, 0x1543,
- 0x8A79, 0x8A79, 0x1C11, 0x8A85, 0x8A85, 0x1AEB, 0x8A87, 0x8A87, 0x0EE1,
- 0x8A8C, 0x8A8C, 0x1B3B, 0x8A8D, 0x8A8D, 0x1939, 0x8A93, 0x8A93, 0x1516,
- 0x8A95, 0x8A95, 0x1CF9, 0x8A98, 0x8A98, 0x18C8, 0x8A9E, 0x8A9E, 0x1714,
- 0x8AA0, 0x8AA0, 0x1572, 0x8AA1, 0x8AA1, 0x0E8D, 0x8AA3, 0x8AA3, 0x12DE,
- 0x8AA4, 0x8AA4, 0x17BB, 0x8AA5, 0x8AA5, 0x0EB0, 0x8AA6, 0x8AA6, 0x15B6,
- 0x8AA8, 0x8AA8, 0x1F0A, 0x8AAA, 0x8AAA, 0x1554, 0x8AB0, 0x8AB0, 0x15EB,
- 0x8AB2, 0x8AB2, 0x0EE2, 0x8AB9, 0x8AB9, 0x1460, 0x8ABC, 0x8ABC, 0x190A,
- 0x8ABE, 0x8ABE, 0x18E9, 0x8ABF, 0x8ABF, 0x1AA3, 0x8AC2, 0x8AC2, 0x1C12,
- 0x8AC4, 0x8AC4, 0x161E, 0x8AC7, 0x8AC7, 0x1087, 0x8ACB, 0x8ACB, 0x1C22,
- 0x8ACD, 0x8ACD, 0x19BD, 0x8ACF, 0x8ACF, 0x1C6C, 0x8AD2, 0x8AD2, 0x1155,
- 0x8AD6, 0x8AD6, 0x11B7, 0x8ADB, 0x8ADB, 0x18C9, 0x8ADC, 0x8ADC, 0x1C1A,
- 0x8AE1, 0x8AE1, 0x1655, 0x8AE6, 0x8AE6, 0x1C2A, 0x8AE7, 0x8AE7, 0x1E13,
- 0x8AEA, 0x8AEA, 0x1A5A, 0x8AEB, 0x8AEB, 0x0DAA, 0x8AED, 0x8AED, 0x18CA,
- 0x8AEE, 0x8AEE, 0x196A, 0x8AF1, 0x8AF1, 0x1F42, 0x8AF6, 0x8AF6, 0x168A,
- 0x8AF7, 0x8AF7, 0x1DA9, 0x8AF8, 0x8AF8, 0x1A76, 0x8AFA, 0x8AFA, 0x1722,
- 0x8AFE, 0x8AFE, 0x102B, 0x8B00, 0x8B00, 0x12B1, 0x8B01, 0x8B01, 0x16BA,
- 0x8B02, 0x8B02, 0x18A1, 0x8B04, 0x8B04, 0x1113, 0x8B0E, 0x8B0E, 0x1302,
- 0x8B10, 0x8B10, 0x1315, 0x8B14, 0x8B14, 0x1DD1, 0x8B16, 0x8B16, 0x15A7,
- 0x8B17, 0x8B17, 0x1365, 0x8B19, 0x8B19, 0x0E49, 0x8B1A, 0x8B1A, 0x192A,
- 0x8B1B, 0x8B1B, 0x0DE4, 0x8B1D, 0x8B1D, 0x14AD, 0x8B20, 0x8B20, 0x1814,
- 0x8B28, 0x8B28, 0x12B2, 0x8B2B, 0x8B2B, 0x19EA, 0x8B2C, 0x8B2C, 0x11ED,
- 0x8B33, 0x8B33, 0x0F5F, 0x8B39, 0x8B39, 0x0FC3, 0x8B41, 0x8B41, 0x1EC2,
- 0x8B49, 0x8B49, 0x1B1C, 0x8B4E, 0x8B4E, 0x1F4B, 0x8B4F, 0x8B4F, 0x1013,
- 0x8B58, 0x8B58, 0x1663, 0x8B5A, 0x8B5A, 0x1088, 0x8B5C, 0x8B5C, 0x13D0,
- 0x8B66, 0x8B66, 0x0E71, 0x8B6C, 0x8B6C, 0x1461, 0x8B6F, 0x8B6F, 0x1741,
- 0x8B70, 0x8B70, 0x190B, 0x8B74, 0x8B74, 0x0E3D, 0x8B77, 0x8B77, 0x1E9C,
- 0x8B7D, 0x8B7D, 0x179C, 0x8B80, 0x8B80, 0x10DE, 0x8B8A, 0x8B8A, 0x13A9,
- 0x8B90, 0x8B90, 0x15EC, 0x8B92, 0x8B92, 0x1BB2, 0x8B93, 0x8B93, 0x170A,
- 0x8B96, 0x8B96, 0x1BB3, 0x8B9A, 0x8B9A, 0x1BA0, 0x8C37, 0x8C37, 0x0EBC,
- 0x8C3F, 0x8C3F, 0x0E8E, 0x8C41, 0x8C41, 0x1EDE, 0x8C46, 0x8C46, 0x1103,
- 0x8C48, 0x8C48, 0x1014, 0x8C4A, 0x8C4A, 0x1DAA, 0x8C4C, 0x8C4C, 0x17EA,
- 0x8C55, 0x8C55, 0x1656, 0x8C5A, 0x8C5A, 0x10E7, 0x8C61, 0x8C61, 0x14EF,
- 0x8C6A, 0x8C6A, 0x1E9D, 0x8C6B, 0x8C6B, 0x179D, 0x8C79, 0x8C79, 0x1DA2,
- 0x8C7A, 0x8C7A, 0x1657, 0x8C82, 0x8C82, 0x1C44, 0x8C8A, 0x8C8A, 0x1273,
- 0x8C8C, 0x8C8C, 0x12B3, 0x8C9D, 0x8C9D, 0x1D58, 0x8C9E, 0x8C9E, 0x1A5B,
- 0x8CA0, 0x8CA0, 0x1414, 0x8CA1, 0x8CA1, 0x19B7, 0x8CA2, 0x8CA2, 0x0ED8,
- 0x8CA7, 0x8CA7, 0x1472, 0x8CA8, 0x8CA8, 0x1EC3, 0x8CA9, 0x8CA9, 0x1D47,
- 0x8CAA, 0x8CAA, 0x1CFF, 0x8CAB, 0x8CAB, 0x0EF8, 0x8CAC, 0x8CAC, 0x1BD9,
- 0x8CAF, 0x8CAF, 0x19D5, 0x8CB0, 0x8CB0, 0x157B, 0x8CB3, 0x8CB3, 0x1921,
- 0x8CB4, 0x8CB4, 0x0F98, 0x8CB6, 0x8CB6, 0x1D68, 0x8CB7, 0x8CB7, 0x126E,
- 0x8CB8, 0x8CB8, 0x10A7, 0x8CBB, 0x8CBB, 0x1462, 0x8CBC, 0x8CBC, 0x1C1B,
- 0x8CBD, 0x8CBD, 0x1920, 0x8CBF, 0x8CBF, 0x12DF, 0x8CC0, 0x8CC0, 0x1DCA,
- 0x8CC1, 0x8CC1, 0x1431, 0x8CC2, 0x8CC2, 0x11C3, 0x8CC3, 0x8CC3, 0x194C,
- 0x8CC4, 0x8CC4, 0x1F0B, 0x8CC7, 0x8CC7, 0x196B, 0x8CC8, 0x8CC8, 0x0D84,
- 0x8CCA, 0x8CCA, 0x19EB, 0x8CD1, 0x8CD1, 0x1B5F, 0x8CD3, 0x8CD3, 0x1473,
- 0x8CDA, 0x8CDA, 0x11C4, 0x8CDC, 0x8CDC, 0x14AE, 0x8CDE, 0x8CDE, 0x14F0,
- 0x8CE0, 0x8CE0, 0x1378, 0x8CE2, 0x8CE2, 0x1E47, 0x8CE3, 0x8CE3, 0x126F,
- 0x8CE4, 0x8CE4, 0x1BF8, 0x8CE6, 0x8CE6, 0x1415, 0x8CEA, 0x8CEA, 0x1B73,
- 0x8CED, 0x8CED, 0x10CB, 0x8CF4, 0x8CF4, 0x11C5, 0x8CFB, 0x8CFB, 0x1416,
- 0x8CFC, 0x8CFC, 0x0F60, 0x8CFD, 0x8CFD, 0x14F4, 0x8D04, 0x8D04, 0x1B3C,
- 0x8D05, 0x8D05, 0x1C93, 0x8D07, 0x8D07, 0x18DD, 0x8D08, 0x8D08, 0x1B1D,
- 0x8D0A, 0x8D0A, 0x1BA1, 0x8D0D, 0x8D0D, 0x155C, 0x8D13, 0x8D13, 0x19A6,
- 0x8D16, 0x8D16, 0x15A8, 0x8D64, 0x8D64, 0x19EC, 0x8D66, 0x8D66, 0x14AF,
- 0x8D6B, 0x8D6B, 0x1E34, 0x8D70, 0x8D70, 0x1AEC, 0x8D73, 0x8D73, 0x0FA6,
- 0x8D74, 0x8D74, 0x1417, 0x8D77, 0x8D77, 0x1015, 0x8D85, 0x8D85, 0x1C45,
- 0x8D8A, 0x8D8A, 0x188A, 0x8D99, 0x8D99, 0x1AA4, 0x8DA3, 0x8DA3, 0x1C9E,
- 0x8DA8, 0x8DA8, 0x1C6D, 0x8DB3, 0x8DB3, 0x1AAE, 0x8DBA, 0x8DBA, 0x1418,
- 0x8DBE, 0x8DBE, 0x1B3D, 0x8DC6, 0x8DC6, 0x1D12, 0x8DCB, 0x8DCB, 0x1348,
- 0x8DCC, 0x8DCC, 0x1B74, 0x8DCF, 0x8DCF, 0x0D85, 0x8DDB, 0x8DDB, 0x1D40,
- 0x8DDD, 0x8DDD, 0x0E0C, 0x8DE1, 0x8DE1, 0x19ED, 0x8DE3, 0x8DE3, 0x1544,
- 0x8DE8, 0x8DE8, 0x0EE3, 0x8DEF, 0x8DEF, 0x11AA, 0x8DF3, 0x8DF3, 0x10CC,
- 0x8E0A, 0x8E0A, 0x1832, 0x8E0F, 0x8E0F, 0x108D, 0x8E10, 0x8E10, 0x1BF9,
- 0x8E1E, 0x8E1E, 0x0E0D, 0x8E2A, 0x8E2A, 0x1AC2, 0x8E30, 0x8E30, 0x18CB,
- 0x8E35, 0x8E35, 0x1AC3, 0x8E42, 0x8E42, 0x18CC, 0x8E44, 0x8E44, 0x1A77,
- 0x8E47, 0x8E47, 0x0E1A, 0x8E48, 0x8E48, 0x10CD, 0x8E49, 0x8E49, 0x1B8C,
- 0x8E4A, 0x8E4A, 0x1E75, 0x8E59, 0x8E59, 0x1C80, 0x8E5F, 0x8E5F, 0x19EE,
- 0x8E60, 0x8E60, 0x1BE9, 0x8E74, 0x8E74, 0x1C81, 0x8E76, 0x8E76, 0x0F8E,
- 0x8E81, 0x8E81, 0x1AA5, 0x8E87, 0x8E87, 0x19D6, 0x8E8A, 0x8E8A, 0x1AED,
- 0x8E8D, 0x8E8D, 0x16F6, 0x8EAA, 0x8EAA, 0x1223, 0x8EAB, 0x8EAB, 0x167B,
- 0x8EAC, 0x8EAC, 0x0F80, 0x8EC0, 0x8EC0, 0x0F61, 0x8ECA, 0x8ECA, 0x1B8D,
- 0x8ECB, 0x8ECB, 0x16BB, 0x8ECC, 0x8ECC, 0x0F94, 0x8ECD, 0x8ECD, 0x0F75,
- 0x8ED2, 0x8ED2, 0x1E2E, 0x8EDF, 0x8EDF, 0x175E, 0x8EEB, 0x8EEB, 0x1B60,
- 0x8EF8, 0x8EF8, 0x1C82, 0x8EFB, 0x8EFB, 0x0D86, 0x8EFE, 0x8EFE, 0x1664,
- 0x8F03, 0x8F03, 0x0F2F, 0x8F05, 0x8F05, 0x11AB, 0x8F09, 0x8F09, 0x19B8,
- 0x8F12, 0x8F12, 0x1C1C, 0x8F13, 0x8F13, 0x124E, 0x8F14, 0x8F14, 0x13D1,
- 0x8F15, 0x8F15, 0x0E72, 0x8F1B, 0x8F1B, 0x1156, 0x8F1C, 0x8F1C, 0x1CBC,
- 0x8F1D, 0x8F1D, 0x1F43, 0x8F1E, 0x8F1E, 0x1262, 0x8F1F, 0x8F1F, 0x1C06,
- 0x8F26, 0x8F26, 0x117A, 0x8F27, 0x8F27, 0x13BF, 0x8F29, 0x8F29, 0x1379,
- 0x8F2A, 0x8F2A, 0x11F7, 0x8F2F, 0x8F2F, 0x1B7B, 0x8F33, 0x8F33, 0x1AEE,
- 0x8F38, 0x8F38, 0x15ED, 0x8F39, 0x8F39, 0x13DF, 0x8F3B, 0x8F3B, 0x13E0,
- 0x8F3E, 0x8F3E, 0x1A12, 0x8F3F, 0x8F3F, 0x1738, 0x8F44, 0x8F44, 0x1DE2,
- 0x8F45, 0x8F45, 0x1884, 0x8F49, 0x8F49, 0x1A13, 0x8F4D, 0x8F4D, 0x1C07,
- 0x8F4E, 0x8F4E, 0x0F30, 0x8F5D, 0x8F5D, 0x1739, 0x8F5F, 0x8F5F, 0x0F1B,
- 0x8F62, 0x8F62, 0x116F, 0x8F9B, 0x8F9B, 0x167C, 0x8F9C, 0x8F9C, 0x0EB1,
- 0x8FA3, 0x8FA3, 0x112E, 0x8FA6, 0x8FA6, 0x1D48, 0x8FA8, 0x8FA8, 0x13AA,
- 0x8FAD, 0x8FAD, 0x14B0, 0x8FAF, 0x8FAF, 0x13AB, 0x8FB0, 0x8FB0, 0x1B61,
- 0x8FB1, 0x8FB1, 0x181D, 0x8FB2, 0x8FB2, 0x1051, 0x8FC2, 0x8FC2, 0x184E,
- 0x8FC5, 0x8FC5, 0x167D, 0x8FCE, 0x8FCE, 0x178A, 0x8FD1, 0x8FD1, 0x0FC4,
- 0x8FD4, 0x8FD4, 0x133F, 0x8FE6, 0x8FE6, 0x0D87, 0x8FEA, 0x8FEA, 0x19EF,
- 0x8FEB, 0x8FEB, 0x1326, 0x8FED, 0x8FED, 0x1B75, 0x8FF0, 0x8FF0, 0x1625,
- 0x8FF2, 0x8FF2, 0x0E2A, 0x8FF7, 0x8FF7, 0x1303, 0x8FF9, 0x8FF9, 0x19F0,
- 0x8FFD, 0x8FFD, 0x1C6E, 0x9000, 0x9000, 0x1D27, 0x9001, 0x9001, 0x15B7,
- 0x9002, 0x9002, 0x0EFE, 0x9003, 0x9003, 0x10CE, 0x9005, 0x9005, 0x1F2A,
- 0x9006, 0x9006, 0x1742, 0x9008, 0x9008, 0x1E6B, 0x900B, 0x900B, 0x1D8F,
- 0x900D, 0x900D, 0x159B, 0x900F, 0x900F, 0x1D2D, 0x9010, 0x9010, 0x1C83,
- 0x9011, 0x9011, 0x0F62, 0x9014, 0x9014, 0x10CF, 0x9015, 0x9015, 0x0E73,
- 0x9017, 0x9017, 0x1104, 0x9019, 0x9019, 0x19D7, 0x901A, 0x901A, 0x1D22,
- 0x901D, 0x901D, 0x1517, 0x901E, 0x901E, 0x1194, 0x901F, 0x901F, 0x15A9,
- 0x9020, 0x9020, 0x1AA6, 0x9021, 0x9021, 0x1B05, 0x9022, 0x9022, 0x13F2,
- 0x9023, 0x9023, 0x117B, 0x902E, 0x902E, 0x1C2B, 0x9031, 0x9031, 0x1AEF,
- 0x9032, 0x9032, 0x1B62, 0x9035, 0x9035, 0x0FA7, 0x9038, 0x9038, 0x1942,
- 0x903C, 0x903C, 0x1DBF, 0x903E, 0x903E, 0x18CE, 0x9041, 0x9041, 0x1109,
- 0x9042, 0x9042, 0x15EE, 0x9047, 0x9047, 0x184F, 0x904A, 0x904A, 0x18CD,
- 0x904B, 0x904B, 0x1866, 0x904D, 0x904D, 0x1D65, 0x904E, 0x904E, 0x0EE4,
- 0x9050, 0x9050, 0x1DCB, 0x9051, 0x9051, 0x1EF5, 0x9053, 0x9053, 0x10D0,
- 0x9054, 0x9054, 0x1078, 0x9055, 0x9055, 0x18A2, 0x9059, 0x9059, 0x1815,
- 0x905C, 0x905C, 0x15AE, 0x905D, 0x905D, 0x108E, 0x905E, 0x905E, 0x1C2C,
- 0x9060, 0x9060, 0x1885, 0x9061, 0x9061, 0x159C, 0x9063, 0x9063, 0x0E3E,
- 0x9069, 0x9069, 0x19F1, 0x906D, 0x906D, 0x1AA7, 0x906E, 0x906E, 0x1B8E,
- 0x906F, 0x906F, 0x110A, 0x9072, 0x9072, 0x1B3E, 0x9075, 0x9075, 0x1B06,
- 0x9077, 0x9077, 0x1BFA, 0x9078, 0x9078, 0x1545, 0x907A, 0x907A, 0x18CF,
- 0x907C, 0x907C, 0x11D1, 0x907D, 0x907D, 0x0E0E, 0x907F, 0x907F, 0x1DB2,
- 0x9080, 0x9080, 0x1816, 0x9081, 0x9081, 0x1270, 0x9082, 0x9082, 0x1E14,
- 0x9083, 0x9083, 0x15EF, 0x9084, 0x9084, 0x1ED8, 0x9087, 0x9087, 0x1922,
- 0x9088, 0x9088, 0x123D, 0x908A, 0x908A, 0x13AC, 0x908F, 0x908F, 0x111D,
- 0x9091, 0x9091, 0x18F5, 0x9095, 0x9095, 0x17D0, 0x9099, 0x9099, 0x1263,
- 0x90A2, 0x90A2, 0x1E6C, 0x90A3, 0x90A3, 0x102A, 0x90A6, 0x90A6, 0x1366,
- 0x90A8, 0x90A8, 0x1C52, 0x90AA, 0x90AA, 0x14B1, 0x90AF, 0x90AF, 0x0DC6,
- 0x90B0, 0x90B0, 0x1D13, 0x90B1, 0x90B1, 0x0F63, 0x90B5, 0x90B5, 0x159D,
- 0x90B8, 0x90B8, 0x19D8, 0x90C1, 0x90C1, 0x185C, 0x90CA, 0x90CA, 0x0F31,
- 0x90DE, 0x90DE, 0x1143, 0x90E1, 0x90E1, 0x0F76, 0x90E8, 0x90E8, 0x1419,
- 0x90ED, 0x90ED, 0x0EEA, 0x90F5, 0x90F5, 0x1850, 0x90FD, 0x90FD, 0x10D1,
- 0x9102, 0x9102, 0x16AA, 0x9112, 0x9112, 0x1C6F, 0x9115, 0x9115, 0x1E22,
- 0x9119, 0x9119, 0x1463, 0x9127, 0x9127, 0x1114, 0x912D, 0x912D, 0x1A5C,
- 0x9132, 0x9132, 0x1072, 0x9149, 0x9149, 0x18D0, 0x914A, 0x914A, 0x1A5D,
- 0x914B, 0x914B, 0x1C70, 0x914C, 0x914C, 0x1977, 0x914D, 0x914D, 0x137A,
- 0x914E, 0x914E, 0x1AF0, 0x9152, 0x9152, 0x1AF1, 0x9162, 0x9162, 0x1C46,
- 0x9169, 0x9169, 0x1298, 0x916A, 0x916A, 0x1123, 0x916C, 0x916C, 0x15F0,
- 0x9175, 0x9175, 0x1F1C, 0x9177, 0x9177, 0x1EA3, 0x9178, 0x9178, 0x14C1,
- 0x9187, 0x9187, 0x161F, 0x9189, 0x9189, 0x1C9F, 0x918B, 0x918B, 0x1C47,
- 0x918D, 0x918D, 0x1A78, 0x9192, 0x9192, 0x1573, 0x919C, 0x919C, 0x1C71,
- 0x91AB, 0x91AB, 0x190C, 0x91AC, 0x91AC, 0x19A7, 0x91AE, 0x91AE, 0x1C48,
- 0x91AF, 0x91AF, 0x1E76, 0x91B1, 0x91B1, 0x1349, 0x91B4, 0x91B4, 0x119D,
- 0x91B5, 0x91B5, 0x0E00, 0x91C0, 0x91C0, 0x170B, 0x91C7, 0x91C7, 0x1BD4,
- 0x91C9, 0x91C9, 0x18D1, 0x91CB, 0x91CB, 0x1528, 0x91CC, 0x91CC, 0x121A,
- 0x91CD, 0x91CD, 0x1B0D, 0x91CE, 0x91CE, 0x16EF, 0x91CF, 0x91CF, 0x1157,
- 0x91D0, 0x91D0, 0x121B, 0x91D1, 0x91D1, 0x1023, 0x91D7, 0x91D7, 0x15BE,
- 0x91D8, 0x91D8, 0x1A5E, 0x91DC, 0x91DC, 0x141A, 0x91DD, 0x91DD, 0x1CCE,
- 0x91E3, 0x91E3, 0x1AA8, 0x91E7, 0x91E7, 0x1BFB, 0x91EA, 0x91EA, 0x1851,
- 0x91F5, 0x91F5, 0x1BD5, 0x920D, 0x920D, 0x110B, 0x9210, 0x9210, 0x0E26,
- 0x9211, 0x9211, 0x1D49, 0x9212, 0x9212, 0x14D1, 0x9217, 0x9217, 0x18DE,
- 0x921E, 0x921E, 0x0FAE, 0x9234, 0x9234, 0x1195, 0x923A, 0x923A, 0x17C2,
- 0x923F, 0x923F, 0x1A14, 0x9240, 0x9240, 0x0DCE, 0x9245, 0x9245, 0x0E0F,
- 0x9249, 0x9249, 0x1E48, 0x9257, 0x9257, 0x0E4A, 0x925B, 0x925B, 0x175F,
- 0x925E, 0x925E, 0x188B, 0x9262, 0x9262, 0x134A, 0x9264, 0x9264, 0x0F64,
- 0x9265, 0x9265, 0x1626, 0x9266, 0x9266, 0x1A5F, 0x9280, 0x9280, 0x18EA,
- 0x9283, 0x9283, 0x1C5C, 0x9285, 0x9285, 0x10FB, 0x9291, 0x9291, 0x1546,
- 0x9293, 0x9293, 0x1A15, 0x9296, 0x9296, 0x15F1, 0x9298, 0x9298, 0x1299,
- 0x929C, 0x929C, 0x1DEC, 0x92B3, 0x92B3, 0x179E, 0x92B6, 0x92B6, 0x0F65,
- 0x92B7, 0x92B7, 0x159E, 0x92B9, 0x92B9, 0x15F2, 0x92CC, 0x92CC, 0x1A60,
- 0x92CF, 0x92CF, 0x1E59, 0x92D2, 0x92D2, 0x13F3, 0x92E4, 0x92E4, 0x1518,
- 0x92EA, 0x92EA, 0x1D90, 0x92F8, 0x92F8, 0x0E10, 0x92FC, 0x92FC, 0x0DE5,
- 0x9304, 0x9304, 0x11B4, 0x9310, 0x9310, 0x1C72, 0x9318, 0x9318, 0x1C73,
- 0x931A, 0x931A, 0x19BE, 0x931E, 0x931E, 0x1620, 0x931F, 0x931F, 0x1089,
- 0x9320, 0x9320, 0x1A61, 0x9321, 0x9321, 0x1016, 0x9322, 0x9322, 0x1A16,
- 0x9324, 0x9324, 0x1017, 0x9326, 0x9326, 0x0FD2, 0x9328, 0x9328, 0x12CB,
- 0x932B, 0x932B, 0x1529, 0x932E, 0x932E, 0x0EB2, 0x932F, 0x932F, 0x1B93,
- 0x9348, 0x9348, 0x178B, 0x934A, 0x934A, 0x117C, 0x934B, 0x934B, 0x0EE5,
- 0x934D, 0x934D, 0x10D2, 0x9354, 0x9354, 0x16AB, 0x935B, 0x935B, 0x1073,
- 0x936E, 0x936E, 0x18D2, 0x9375, 0x9375, 0x0E1B, 0x937C, 0x937C, 0x1CCF,
- 0x937E, 0x937E, 0x1AC4, 0x938C, 0x938C, 0x0E4B, 0x9394, 0x9394, 0x1833,
- 0x9396, 0x9396, 0x15BC, 0x939A, 0x939A, 0x1C74, 0x93A3, 0x93A3, 0x1E6D,
- 0x93A7, 0x93A7, 0x0DF9, 0x93AC, 0x93AC, 0x1E9E, 0x93AD, 0x93AD, 0x1B63,
- 0x93B0, 0x93B0, 0x1943, 0x93C3, 0x93C3, 0x1AAF, 0x93D1, 0x93D1, 0x19F2,
- 0x93DE, 0x93DE, 0x1834, 0x93E1, 0x93E1, 0x0E74, 0x93E4, 0x93E4, 0x11DF,
- 0x93F6, 0x93F6, 0x1B7C, 0x9404, 0x9404, 0x1F10, 0x9418, 0x9418, 0x1AC5,
- 0x9425, 0x9425, 0x1547, 0x942B, 0x942B, 0x1A17, 0x9435, 0x9435, 0x1C08,
- 0x9438, 0x9438, 0x1CEF, 0x9444, 0x9444, 0x1AF2, 0x9451, 0x9452, 0x0DC7,
- 0x945B, 0x945B, 0x0F0B, 0x947D, 0x947D, 0x1BA2, 0x947F, 0x947F, 0x1B94,
- 0x9577, 0x9577, 0x19A8, 0x9580, 0x9580, 0x12EE, 0x9583, 0x9583, 0x155D,
- 0x9589, 0x9589, 0x1D76, 0x958B, 0x958B, 0x0DFA, 0x958F, 0x958F, 0x18DF,
- 0x9591, 0x9592, 0x1DDD, 0x9593, 0x9593, 0x0DAB, 0x9594, 0x9594, 0x1312,
- 0x9598, 0x9598, 0x0DCF, 0x95A3, 0x95A3, 0x0D93, 0x95A4, 0x95A4, 0x1DF3,
- 0x95A5, 0x95A5, 0x1390, 0x95A8, 0x95A8, 0x0FA8, 0x95AD, 0x95AD, 0x1165,
- 0x95B1, 0x95B1, 0x1764, 0x95BB, 0x95BB, 0x176C, 0x95BC, 0x95BC, 0x16BC,
- 0x95C7, 0x95C7, 0x16C4, 0x95CA, 0x95CA, 0x1EDF, 0x95D4, 0x95D4, 0x1DF4,
- 0x95D5, 0x95D5, 0x0F8F, 0x95D6, 0x95D6, 0x1D31, 0x95DC, 0x95DC, 0x0EF9,
- 0x95E1, 0x95E1, 0x1BFC, 0x95E2, 0x95E2, 0x13A5, 0x961C, 0x961C, 0x141B,
- 0x9621, 0x9621, 0x1BFD, 0x962A, 0x962A, 0x1D4A, 0x962E, 0x962E, 0x17EB,
- 0x9632, 0x9632, 0x1367, 0x963B, 0x963B, 0x1AA9, 0x963F, 0x963F, 0x169C,
- 0x9640, 0x9640, 0x1CDF, 0x9642, 0x9642, 0x1DB3, 0x9644, 0x9644, 0x141C,
- 0x964B, 0x964B, 0x11E0, 0x964C, 0x964C, 0x1274, 0x964D, 0x964D, 0x0DE6,
- 0x9650, 0x9650, 0x1DDF, 0x965B, 0x965B, 0x1D77, 0x965C, 0x965C, 0x1DF5,
- 0x965D, 0x965D, 0x155E, 0x965E, 0x965E, 0x163B, 0x965F, 0x965F, 0x1BEA,
- 0x9662, 0x9662, 0x1886, 0x9663, 0x9663, 0x1B64, 0x9664, 0x9664, 0x1A79,
- 0x966A, 0x966A, 0x137B, 0x9670, 0x9670, 0x18F0, 0x9673, 0x9673, 0x1B65,
- 0x9675, 0x9675, 0x1204, 0x9676, 0x9676, 0x10D3, 0x9677, 0x9677, 0x1DED,
- 0x9678, 0x9678, 0x11F1, 0x967D, 0x967D, 0x170C, 0x9685, 0x9685, 0x1852,
- 0x9686, 0x9686, 0x11FB, 0x968A, 0x968A, 0x10A8, 0x968B, 0x968B, 0x15F3,
- 0x968D, 0x968D, 0x1EF6, 0x968E, 0x968E, 0x0E8F, 0x9694, 0x9694, 0x0E34,
- 0x9695, 0x9695, 0x1867, 0x9698, 0x9698, 0x16D9, 0x9699, 0x9699, 0x0FB6,
- 0x969B, 0x969B, 0x1A7A, 0x969C, 0x969C, 0x19A9, 0x96A3, 0x96A3, 0x1224,
- 0x96A7, 0x96A8, 0x15F4, 0x96AA, 0x96AA, 0x1E30, 0x96B1, 0x96B1, 0x18EB,
- 0x96B7, 0x96B7, 0x119E, 0x96BB, 0x96BB, 0x1BEB, 0x96C0, 0x96C0, 0x1978,
- 0x96C1, 0x96C1, 0x16B5, 0x96C4, 0x96C4, 0x186E, 0x96C5, 0x96C5, 0x169D,
- 0x96C6, 0x96C6, 0x1B7D, 0x96C7, 0x96C7, 0x0EB3, 0x96C9, 0x96C9, 0x1CBD,
- 0x96CB, 0x96CB, 0x1B07, 0x96CC, 0x96CC, 0x196C, 0x96CD, 0x96CD, 0x17D1,
- 0x96CE, 0x96CE, 0x19D9, 0x96D5, 0x96D5, 0x1AAA, 0x96D6, 0x96D6, 0x15F6,
- 0x96D9, 0x96D9, 0x168D, 0x96DB, 0x96DB, 0x1C75, 0x96DC, 0x96DC, 0x1985,
- 0x96E2, 0x96E2, 0x121C, 0x96E3, 0x96E3, 0x102E, 0x96E8, 0x96E9, 0x1853,
- 0x96EA, 0x96EA, 0x1555, 0x96EF, 0x96EF, 0x12EF, 0x96F0, 0x96F0, 0x1432,
- 0x96F2, 0x96F2, 0x1868, 0x96F6, 0x96F6, 0x1196, 0x96F7, 0x96F7, 0x11C6,
- 0x96F9, 0x96F9, 0x1327, 0x96FB, 0x96FB, 0x1A18, 0x9700, 0x9700, 0x15F7,
- 0x9706, 0x9706, 0x1A62, 0x9707, 0x9707, 0x1B66, 0x9711, 0x9711, 0x1A2A,
- 0x9713, 0x9713, 0x179F, 0x9716, 0x9716, 0x122B, 0x9719, 0x9719, 0x178C,
- 0x971C, 0x971C, 0x14F1, 0x971E, 0x971E, 0x1DCC, 0x9727, 0x9727, 0x12E0,
- 0x9730, 0x9730, 0x14C2, 0x9732, 0x9732, 0x11AC, 0x9739, 0x9739, 0x13A6,
- 0x973D, 0x973D, 0x1A7B, 0x9742, 0x9742, 0x1170, 0x9744, 0x9744, 0x16DA,
- 0x9748, 0x9748, 0x1197, 0x9751, 0x9751, 0x1C23, 0x9756, 0x9756, 0x1A63,
- 0x975C, 0x975C, 0x1A64, 0x975E, 0x975E, 0x1464, 0x9761, 0x9761, 0x1304,
- 0x9762, 0x9762, 0x1288, 0x9769, 0x9769, 0x1E35, 0x976D, 0x976D, 0x193A,
- 0x9774, 0x9774, 0x1EC4, 0x9777, 0x9777, 0x193B, 0x977A, 0x977A, 0x1257,
- 0x978B, 0x978B, 0x1E77, 0x978D, 0x978D, 0x16B6, 0x978F, 0x978F, 0x0ED9,
- 0x97A0, 0x97A0, 0x0F6E, 0x97A8, 0x97A8, 0x0DB5, 0x97AB, 0x97AB, 0x0F6F,
- 0x97AD, 0x97AD, 0x1D66, 0x97C6, 0x97C6, 0x1BFE, 0x97CB, 0x97CB, 0x18A3,
- 0x97D3, 0x97D3, 0x1DE0, 0x97DC, 0x97DC, 0x10D4, 0x97F3, 0x97F3, 0x18F1,
- 0x97F6, 0x97F6, 0x159F, 0x97FB, 0x97FB, 0x1869, 0x97FF, 0x97FF, 0x1E23,
- 0x9800, 0x9800, 0x1E9F, 0x9801, 0x9801, 0x1E4D, 0x9802, 0x9802, 0x1A65,
- 0x9803, 0x9803, 0x0E75, 0x9805, 0x9805, 0x1E04, 0x9806, 0x9806, 0x1621,
- 0x9808, 0x9808, 0x15F8, 0x980A, 0x980A, 0x185D, 0x980C, 0x980C, 0x15B8,
- 0x9810, 0x9810, 0x17A0, 0x9811, 0x9811, 0x17EC, 0x9812, 0x9812, 0x1340,
- 0x9813, 0x9813, 0x10E8, 0x9817, 0x9817, 0x1D41, 0x9818, 0x9818, 0x1198,
- 0x982D, 0x982D, 0x1105, 0x9830, 0x9830, 0x1E5A, 0x9838, 0x9838, 0x0E76,
- 0x9839, 0x9839, 0x1D28, 0x983B, 0x983B, 0x1474, 0x9846, 0x9846, 0x0EE6,
- 0x984C, 0x984C, 0x1A7C, 0x984D, 0x984D, 0x16E1, 0x984E, 0x984E, 0x16AC,
- 0x9854, 0x9854, 0x16B7, 0x9858, 0x9858, 0x1887, 0x985A, 0x985A, 0x1A19,
- 0x985E, 0x985E, 0x11EE, 0x9865, 0x9865, 0x1EA0, 0x9867, 0x9867, 0x0EB4,
- 0x986B, 0x986B, 0x1A1A, 0x986F, 0x986F, 0x1E49, 0x98A8, 0x98A8, 0x1DAB,
- 0x98AF, 0x98AF, 0x14D2, 0x98B1, 0x98B1, 0x1D14, 0x98C4, 0x98C4, 0x1DA4,
- 0x98C7, 0x98C7, 0x1DA3, 0x98DB, 0x98DB, 0x1465, 0x98DC, 0x98DC, 0x138C,
- 0x98DF, 0x98DF, 0x1665, 0x98E1, 0x98E1, 0x15AF, 0x98E2, 0x98E2, 0x1018,
- 0x98ED, 0x98ED, 0x1CC2, 0x98EE, 0x98EE, 0x18F2, 0x98EF, 0x98EF, 0x1341,
- 0x98F4, 0x98F4, 0x1923, 0x98FC, 0x98FC, 0x14B2, 0x98FD, 0x98FD, 0x1D91,
- 0x98FE, 0x98FE, 0x1666, 0x9903, 0x9903, 0x0F32, 0x9909, 0x9909, 0x1E24,
- 0x990A, 0x990A, 0x170D, 0x990C, 0x990C, 0x1924, 0x9910, 0x9910, 0x1BA3,
- 0x9913, 0x9913, 0x169E, 0x9918, 0x9918, 0x173A, 0x991E, 0x991E, 0x1A1B,
- 0x9920, 0x9920, 0x13C0, 0x9928, 0x9928, 0x0EFA, 0x9945, 0x9945, 0x124F,
- 0x9949, 0x9949, 0x0FC5, 0x994B, 0x994B, 0x0F95, 0x994C, 0x994C, 0x1BA4,
- 0x994D, 0x994D, 0x1548, 0x9951, 0x9951, 0x1019, 0x9952, 0x9952, 0x1817,
- 0x9954, 0x9954, 0x17D2, 0x9957, 0x9957, 0x1E25, 0x9996, 0x9996, 0x15F9,
- 0x9999, 0x9999, 0x1E26, 0x999D, 0x999D, 0x1DBD, 0x99A5, 0x99A5, 0x13E1,
- 0x99A8, 0x99A8, 0x1E6E, 0x99AC, 0x99AC, 0x1235, 0x99AD, 0x99AD, 0x1715,
- 0x99AE, 0x99AE, 0x1DAC, 0x99B1, 0x99B1, 0x1CE0, 0x99B3, 0x99B3, 0x1CBE,
- 0x99B4, 0x99B4, 0x1622, 0x99B9, 0x99B9, 0x1944, 0x99C1, 0x99C1, 0x1328,
- 0x99D0, 0x99D0, 0x1AF3, 0x99D1, 0x99D1, 0x104E, 0x99D2, 0x99D2, 0x0F66,
- 0x99D5, 0x99D5, 0x0D88, 0x99D9, 0x99D9, 0x141D, 0x99DD, 0x99DD, 0x1CE1,
- 0x99DF, 0x99DF, 0x14B3, 0x99ED, 0x99ED, 0x1E15, 0x99F1, 0x99F1, 0x1124,
- 0x99FF, 0x99FF, 0x1B08, 0x9A01, 0x9A01, 0x1478, 0x9A08, 0x9A08, 0x13C1,
- 0x9A0E, 0x9A0F, 0x101A, 0x9A19, 0x9A19, 0x1D67, 0x9A2B, 0x9A2B, 0x0E1C,
- 0x9A30, 0x9A30, 0x1115, 0x9A36, 0x9A36, 0x1C76, 0x9A37, 0x9A37, 0x15A0,
- 0x9A40, 0x9A40, 0x1275, 0x9A43, 0x9A43, 0x1DA5, 0x9A45, 0x9A45, 0x0F67,
- 0x9A4D, 0x9A4D, 0x1F1D, 0x9A55, 0x9A55, 0x0F33, 0x9A57, 0x9A57, 0x1E31,
- 0x9A5A, 0x9A5A, 0x0E77, 0x9A5B, 0x9A5B, 0x1743, 0x9A5F, 0x9A5F, 0x1CA0,
- 0x9A62, 0x9A62, 0x1166, 0x9A65, 0x9A65, 0x101C, 0x9A69, 0x9A69, 0x1ED9,
- 0x9A6A, 0x9A6A, 0x1167, 0x9AA8, 0x9AA8, 0x0EC9, 0x9AB8, 0x9AB8, 0x1E16,
- 0x9AD3, 0x9AD3, 0x15FA, 0x9AD4, 0x9AD4, 0x1C2D, 0x9AD8, 0x9AD8, 0x0EB5,
- 0x9AE5, 0x9AE5, 0x176D, 0x9AEE, 0x9AEE, 0x134B, 0x9B1A, 0x9B1A, 0x15FB,
- 0x9B27, 0x9B27, 0x11D2, 0x9B2A, 0x9B2A, 0x1D2E, 0x9B31, 0x9B31, 0x186B,
- 0x9B3C, 0x9B3C, 0x0F99, 0x9B41, 0x9B41, 0x0F17, 0x9B42, 0x9B42, 0x1EA9,
- 0x9B43, 0x9B43, 0x134C, 0x9B44, 0x9B44, 0x1383, 0x9B45, 0x9B45, 0x1271,
- 0x9B4F, 0x9B4F, 0x18A4, 0x9B54, 0x9B54, 0x1236, 0x9B5A, 0x9B5A, 0x1716,
- 0x9B6F, 0x9B6F, 0x11AD, 0x9B8E, 0x9B8E, 0x1A2B, 0x9B91, 0x9B91, 0x1D92,
- 0x9B9F, 0x9B9F, 0x16B8, 0x9BAB, 0x9BAB, 0x0F34, 0x9BAE, 0x9BAE, 0x1549,
- 0x9BC9, 0x9BC9, 0x121D, 0x9BD6, 0x9BD6, 0x1C24, 0x9BE4, 0x9BE4, 0x0EC7,
- 0x9BE8, 0x9BE8, 0x0E78, 0x9C0D, 0x9C0D, 0x1C77, 0x9C10, 0x9C10, 0x16AD,
- 0x9C12, 0x9C12, 0x13E2, 0x9C15, 0x9C15, 0x1DCD, 0x9C25, 0x9C25, 0x1EDA,
- 0x9C32, 0x9C32, 0x17BC, 0x9C3B, 0x9C3B, 0x1250, 0x9C47, 0x9C47, 0x0DE7,
- 0x9C49, 0x9C49, 0x13AF, 0x9C57, 0x9C57, 0x1225, 0x9CE5, 0x9CE5, 0x1AAB,
- 0x9CE7, 0x9CE7, 0x141E, 0x9CE9, 0x9CE9, 0x0F68, 0x9CF3, 0x9CF3, 0x13F4,
- 0x9CF4, 0x9CF4, 0x129A, 0x9CF6, 0x9CF6, 0x1760, 0x9D09, 0x9D09, 0x169F,
- 0x9D1B, 0x9D1B, 0x1888, 0x9D26, 0x9D26, 0x16CF, 0x9D28, 0x9D28, 0x16C8,
- 0x9D3B, 0x9D3B, 0x1EB6, 0x9D51, 0x9D51, 0x0E3F, 0x9D5D, 0x9D5D, 0x16A0,
- 0x9D60, 0x9D60, 0x0EBD, 0x9D61, 0x9D61, 0x12E1, 0x9D6C, 0x9D6C, 0x143C,
- 0x9D72, 0x9D72, 0x1979, 0x9DA9, 0x9DA9, 0x12BA, 0x9DAF, 0x9DAF, 0x16E4,
- 0x9DB4, 0x9DB4, 0x1DD2, 0x9DC4, 0x9DC4, 0x0E90, 0x9DD7, 0x9DD7, 0x0F69,
- 0x9DF2, 0x9DF2, 0x1CA1, 0x9DF8, 0x9DF8, 0x1F4C, 0x9DF9, 0x9DF9, 0x18F9,
- 0x9DFA, 0x9DFA, 0x11AE, 0x9E1A, 0x9E1A, 0x16E5, 0x9E1E, 0x9E1E, 0x112C,
- 0x9E75, 0x9E75, 0x11AF, 0x9E79, 0x9E79, 0x1DEE, 0x9E7D, 0x9E7D, 0x176E,
- 0x9E7F, 0x9E7F, 0x11B5, 0x9E92, 0x9E92, 0x101D, 0x9E93, 0x9E93, 0x11B6,
- 0x9E97, 0x9E97, 0x1168, 0x9E9D, 0x9E9D, 0x14B4, 0x9E9F, 0x9E9F, 0x1226,
- 0x9EA5, 0x9EA5, 0x1276, 0x9EB4, 0x9EB4, 0x0F70, 0x9EB5, 0x9EB5, 0x1289,
- 0x9EBB, 0x9EBB, 0x1237, 0x9EBE, 0x9EBE, 0x1F44, 0x9EC3, 0x9EC3, 0x1EF7,
- 0x9ECD, 0x9ECD, 0x1519, 0x9ECE, 0x9ECE, 0x1169, 0x9ED1, 0x9ED1, 0x1F52,
- 0x9ED4, 0x9ED4, 0x0E27, 0x9ED8, 0x9ED8, 0x12E3, 0x9EDB, 0x9EDB, 0x10A9,
- 0x9EDC, 0x9EDC, 0x1C89, 0x9EDE, 0x9EDE, 0x1A2C, 0x9EE8, 0x9EE8, 0x1099,
- 0x9EF4, 0x9EF4, 0x1305, 0x9F07, 0x9F07, 0x17BD, 0x9F08, 0x9F08, 0x13B0,
- 0x9F0E, 0x9F0E, 0x1A66, 0x9F13, 0x9F13, 0x0EB6, 0x9F20, 0x9F20, 0x151A,
- 0x9F3B, 0x9F3B, 0x1466, 0x9F4A, 0x9F4A, 0x1A7D, 0x9F4B, 0x9F4B, 0x19B9,
- 0x9F4E, 0x9F4E, 0x19BA, 0x9F52, 0x9F52, 0x1CBF, 0x9F5F, 0x9F5F, 0x19DA,
- 0x9F61, 0x9F61, 0x1199, 0x9F67, 0x9F67, 0x1556, 0x9F6A, 0x9F6A, 0x1B95,
- 0x9F6C, 0x9F6C, 0x1717, 0x9F77, 0x9F77, 0x16AE, 0x9F8D, 0x9F8D, 0x11D3,
- 0x9F90, 0x9F90, 0x1368, 0x9F95, 0x9F95, 0x0DC9, 0x9F9C, 0x9F9C, 0x0F6A,
- 0xAC00, 0xAC01, 0x043E, 0xAC02, 0xAC03, 0x2475, 0xAC04, 0xAC04, 0x0440,
- 0xAC05, 0xAC06, 0x2477, 0xAC07, 0xAC0A, 0x0441, 0xAC0B, 0xAC0F, 0x2479,
- 0xAC10, 0xAC17, 0x0445, 0xAC18, 0xAC18, 0x247E, 0xAC19, 0xAC1D, 0x044D,
- 0xAC1E, 0xAC1F, 0x247F, 0xAC20, 0xAC20, 0x0452, 0xAC21, 0xAC23, 0x2481,
- 0xAC24, 0xAC24, 0x0453, 0xAC25, 0xAC2B, 0x2484, 0xAC2C, 0xAC2D, 0x0454,
- 0xAC2E, 0xAC2E, 0x248B, 0xAC2F, 0xAC31, 0x0456, 0xAC32, 0xAC37, 0x248C,
- 0xAC38, 0xAC39, 0x0459, 0xAC3A, 0xAC3B, 0x2492, 0xAC3C, 0xAC3C, 0x045B,
- 0xAC3D, 0xAC3F, 0x2494, 0xAC40, 0xAC40, 0x045C, 0xAC41, 0xAC4A, 0x2497,
- 0xAC4B, 0xAC4B, 0x045D, 0xAC4C, 0xAC4C, 0x24A1, 0xAC4D, 0xAC4D, 0x045E,
- 0xAC4E, 0xAC53, 0x24A2, 0xAC54, 0xAC54, 0x045F, 0xAC55, 0xAC57, 0x24A8,
- 0xAC58, 0xAC58, 0x0460, 0xAC59, 0xAC5B, 0x24AB, 0xAC5C, 0xAC5C, 0x0461,
- 0xAC5D, 0xAC6F, 0x24AE, 0xAC70, 0xAC71, 0x0462, 0xAC72, 0xAC73, 0x24C1,
- 0xAC74, 0xAC74, 0x0464, 0xAC75, 0xAC76, 0x24C3, 0xAC77, 0xAC78, 0x0465,
- 0xAC79, 0xAC79, 0x24C5, 0xAC7A, 0xAC7A, 0x0467, 0xAC7B, 0xAC7F, 0x24C6,
- 0xAC80, 0xAC81, 0x0468, 0xAC82, 0xAC82, 0x24CB, 0xAC83, 0xAC86, 0x046A,
- 0xAC87, 0xAC88, 0x24CC, 0xAC89, 0xAC8C, 0x046E, 0xAC8D, 0xAC8F, 0x24CE,
- 0xAC90, 0xAC90, 0x0472, 0xAC91, 0xAC93, 0x24D1, 0xAC94, 0xAC94, 0x0473,
- 0xAC95, 0xAC9B, 0x24D4, 0xAC9C, 0xAC9D, 0x0474, 0xAC9E, 0xAC9E, 0x24DB,
- 0xAC9F, 0xACA1, 0x0476, 0xACA2, 0xACA7, 0x24DC, 0xACA8, 0xACAA, 0x0479,
- 0xACAB, 0xACAB, 0x24E2, 0xACAC, 0xACAC, 0x047C, 0xACAD, 0xACAE, 0x24E3,
- 0xACAF, 0xACB0, 0x047D, 0xACB1, 0xACB7, 0x24E5, 0xACB8, 0xACB9, 0x047F,
- 0xACBA, 0xACBA, 0x24EC, 0xACBB, 0xACBD, 0x0481, 0xACBE, 0xACC0, 0x24ED,
- 0xACC1, 0xACC1, 0x0484, 0xACC2, 0xACC3, 0x24F0, 0xACC4, 0xACC4, 0x0485,
- 0xACC5, 0xACC7, 0x24F2, 0xACC8, 0xACC8, 0x0486, 0xACC9, 0xACCB, 0x24F5,
- 0xACCC, 0xACCC, 0x0487, 0xACCD, 0xACD4, 0x24F8, 0xACD5, 0xACD5, 0x0488,
- 0xACD6, 0xACD6, 0x2500, 0xACD7, 0xACD7, 0x0489, 0xACD8, 0xACDF, 0x2501,
- 0xACE0, 0xACE1, 0x048A, 0xACE2, 0xACE3, 0x2509, 0xACE4, 0xACE4, 0x048C,
- 0xACE5, 0xACE6, 0x250B, 0xACE7, 0xACE8, 0x048D, 0xACE9, 0xACE9, 0x250D,
- 0xACEA, 0xACEA, 0x048F, 0xACEB, 0xACEB, 0x250E, 0xACEC, 0xACEC, 0x0490,
- 0xACED, 0xACEE, 0x250F, 0xACEF, 0xACF1, 0x0491, 0xACF2, 0xACF2, 0x2511,
- 0xACF3, 0xACF3, 0x0494, 0xACF4, 0xACF4, 0x2512, 0xACF5, 0xACF6, 0x0495,
- 0xACF7, 0xACFB, 0x2513, 0xACFC, 0xACFD, 0x0497, 0xACFE, 0xACFF, 0x2518,
- 0xAD00, 0xAD00, 0x0499, 0xAD01, 0xAD03, 0x251A, 0xAD04, 0xAD04, 0x049A,
- 0xAD05, 0xAD05, 0x251D, 0xAD06, 0xAD06, 0x049B, 0xAD07, 0xAD0B, 0x251E,
- 0xAD0C, 0xAD0D, 0x049C, 0xAD0E, 0xAD0E, 0x2523, 0xAD0F, 0xAD0F, 0x049E,
- 0xAD10, 0xAD10, 0x2524, 0xAD11, 0xAD11, 0x049F, 0xAD12, 0xAD17, 0x2525,
- 0xAD18, 0xAD18, 0x04A0, 0xAD19, 0xAD1B, 0x252B, 0xAD1C, 0xAD1C, 0x04A1,
- 0xAD1D, 0xAD1F, 0x252E, 0xAD20, 0xAD20, 0x04A2, 0xAD21, 0xAD28, 0x2531,
- 0xAD29, 0xAD29, 0x04A3, 0xAD2A, 0xAD2B, 0x2539, 0xAD2C, 0xAD2D, 0x04A4,
- 0xAD2E, 0xAD33, 0x253B, 0xAD34, 0xAD35, 0x04A6, 0xAD36, 0xAD37, 0x2541,
- 0xAD38, 0xAD38, 0x04A8, 0xAD39, 0xAD3B, 0x2543, 0xAD3C, 0xAD3C, 0x04A9,
- 0xAD3D, 0xAD43, 0x2546, 0xAD44, 0xAD45, 0x04AA, 0xAD46, 0xAD46, 0x254D,
- 0xAD47, 0xAD47, 0x04AC, 0xAD48, 0xAD48, 0x254E, 0xAD49, 0xAD49, 0x04AD,
- 0xAD4A, 0xAD4F, 0x254F, 0xAD50, 0xAD50, 0x04AE, 0xAD51, 0xAD53, 0x2555,
- 0xAD54, 0xAD54, 0x04AF, 0xAD55, 0xAD57, 0x2558, 0xAD58, 0xAD58, 0x04B0,
- 0xAD59, 0xAD60, 0x255B, 0xAD61, 0xAD61, 0x04B1, 0xAD62, 0xAD62, 0x2563,
- 0xAD63, 0xAD63, 0x04B2, 0xAD64, 0xAD6B, 0x2564, 0xAD6C, 0xAD6D, 0x04B3,
- 0xAD6E, 0xAD6F, 0x256C, 0xAD70, 0xAD70, 0x04B5, 0xAD71, 0xAD72, 0x256E,
- 0xAD73, 0xAD76, 0x04B6, 0xAD77, 0xAD7A, 0x2570, 0xAD7B, 0xAD7D, 0x04BA,
- 0xAD7E, 0xAD7E, 0x2574, 0xAD7F, 0xAD7F, 0x04BD, 0xAD80, 0xAD80, 0x2575,
- 0xAD81, 0xAD82, 0x04BE, 0xAD83, 0xAD87, 0x2576, 0xAD88, 0xAD89, 0x04C0,
- 0xAD8A, 0xAD8B, 0x257B, 0xAD8C, 0xAD8C, 0x04C2, 0xAD8D, 0xAD8F, 0x257D,
- 0xAD90, 0xAD90, 0x04C3, 0xAD91, 0xAD9B, 0x2580, 0xAD9C, 0xAD9D, 0x04C4,
- 0xAD9E, 0xADA3, 0x258B, 0xADA4, 0xADA4, 0x04C6, 0xADA5, 0xADB6, 0x2591,
- 0xADB7, 0xADB7, 0x04C7, 0xADB8, 0xADBF, 0x25A3, 0xADC0, 0xADC1, 0x04C8,
- 0xADC2, 0xADC3, 0x25AB, 0xADC4, 0xADC4, 0x04CA, 0xADC5, 0xADC7, 0x25AD,
- 0xADC8, 0xADC8, 0x04CB, 0xADC9, 0xADCF, 0x25B0, 0xADD0, 0xADD1, 0x04CC,
- 0xADD2, 0xADD2, 0x25B7, 0xADD3, 0xADD3, 0x04CE, 0xADD4, 0xADDB, 0x25B8,
- 0xADDC, 0xADDC, 0x04CF, 0xADDD, 0xADDF, 0x25C0, 0xADE0, 0xADE0, 0x04D0,
- 0xADE1, 0xADE3, 0x25C3, 0xADE4, 0xADE4, 0x04D1, 0xADE5, 0xADF7, 0x25C6,
- 0xADF8, 0xADF9, 0x04D2, 0xADFA, 0xADFB, 0x25D9, 0xADFC, 0xADFC, 0x04D4,
- 0xADFD, 0xADFE, 0x25DB, 0xADFF, 0xADFF, 0x04D5, 0xAE00, 0xAE01, 0x04D6,
- 0xAE02, 0xAE07, 0x25DD, 0xAE08, 0xAE09, 0x04D8, 0xAE0A, 0xAE0A, 0x25E3,
- 0xAE0B, 0xAE0B, 0x04DA, 0xAE0C, 0xAE0C, 0x25E4, 0xAE0D, 0xAE0D, 0x04DB,
- 0xAE0E, 0xAE13, 0x25E5, 0xAE14, 0xAE14, 0x04DC, 0xAE15, 0xAE2F, 0x25EB,
- 0xAE30, 0xAE31, 0x04DD, 0xAE32, 0xAE33, 0x2606, 0xAE34, 0xAE34, 0x04DF,
- 0xAE35, 0xAE36, 0x2608, 0xAE37, 0xAE38, 0x04E0, 0xAE39, 0xAE39, 0x260A,
- 0xAE3A, 0xAE3A, 0x04E2, 0xAE3B, 0xAE3F, 0x260B, 0xAE40, 0xAE41, 0x04E3,
- 0xAE42, 0xAE42, 0x2610, 0xAE43, 0xAE43, 0x04E5, 0xAE44, 0xAE44, 0x2611,
- 0xAE45, 0xAE46, 0x04E6, 0xAE47, 0xAE49, 0x2612, 0xAE4A, 0xAE4A, 0x04E8,
- 0xAE4B, 0xAE4B, 0x2615, 0xAE4C, 0xAE4E, 0x04E9, 0xAE4F, 0xAE4F, 0x2616,
- 0xAE50, 0xAE50, 0x04EC, 0xAE51, 0xAE53, 0x2617, 0xAE54, 0xAE54, 0x04ED,
- 0xAE55, 0xAE55, 0x261A, 0xAE56, 0xAE56, 0x04EE, 0xAE57, 0xAE5B, 0x261B,
- 0xAE5C, 0xAE5D, 0x04EF, 0xAE5E, 0xAE5E, 0x2620, 0xAE5F, 0xAE61, 0x04F1,
- 0xAE62, 0xAE64, 0x2621, 0xAE65, 0xAE65, 0x04F4, 0xAE66, 0xAE67, 0x2624,
- 0xAE68, 0xAE69, 0x04F5, 0xAE6A, 0xAE6B, 0x2626, 0xAE6C, 0xAE6C, 0x04F7,
- 0xAE6D, 0xAE6F, 0x2628, 0xAE70, 0xAE70, 0x04F8, 0xAE71, 0xAE77, 0x262B,
- 0xAE78, 0xAE79, 0x04F9, 0xAE7A, 0xAE7A, 0x2632, 0xAE7B, 0xAE7D, 0x04FB,
- 0xAE7E, 0xAE83, 0x2633, 0xAE84, 0xAE85, 0x04FE, 0xAE86, 0xAE8B, 0x2639,
- 0xAE8C, 0xAE8C, 0x0500, 0xAE8D, 0xAEBB, 0x263F, 0xAEBC, 0xAEBE, 0x0501,
- 0xAEBF, 0xAEBF, 0x266E, 0xAEC0, 0xAEC0, 0x0504, 0xAEC1, 0xAEC3, 0x266F,
- 0xAEC4, 0xAEC4, 0x0505, 0xAEC5, 0xAECB, 0x2672, 0xAECC, 0xAECD, 0x0506,
- 0xAECE, 0xAECE, 0x2679, 0xAECF, 0xAED1, 0x0508, 0xAED2, 0xAED7, 0x267A,
- 0xAED8, 0xAED9, 0x050B, 0xAEDA, 0xAEDB, 0x2680, 0xAEDC, 0xAEDC, 0x050D,
- 0xAEDD, 0xAEE7, 0x2682, 0xAEE8, 0xAEE8, 0x050E, 0xAEE9, 0xAEEA, 0x268D,
- 0xAEEB, 0xAEEB, 0x050F, 0xAEEC, 0xAEEC, 0x268F, 0xAEED, 0xAEED, 0x0510,
- 0xAEEE, 0xAEF3, 0x2690, 0xAEF4, 0xAEF4, 0x0511, 0xAEF5, 0xAEF7, 0x2696,
- 0xAEF8, 0xAEF8, 0x0512, 0xAEF9, 0xAEFB, 0x2699, 0xAEFC, 0xAEFC, 0x0513,
- 0xAEFD, 0xAEFF, 0x269C, 0xAF00, 0xAF06, 0x269F, 0xAF07, 0xAF08, 0x0514,
- 0xAF09, 0xAF0C, 0x26A6, 0xAF0D, 0xAF0D, 0x0516, 0xAF0E, 0xAF0F, 0x26AA,
- 0xAF10, 0xAF10, 0x0517, 0xAF11, 0xAF2B, 0x26AC, 0xAF2C, 0xAF2D, 0x0518,
- 0xAF2E, 0xAF2F, 0x26C7, 0xAF30, 0xAF30, 0x051A, 0xAF31, 0xAF31, 0x26C9,
- 0xAF32, 0xAF32, 0x051B, 0xAF33, 0xAF33, 0x26CA, 0xAF34, 0xAF34, 0x051C,
- 0xAF35, 0xAF3B, 0x26CB, 0xAF3C, 0xAF3D, 0x051D, 0xAF3E, 0xAF3E, 0x26D2,
- 0xAF3F, 0xAF3F, 0x051F, 0xAF40, 0xAF40, 0x26D3, 0xAF41, 0xAF43, 0x0520,
- 0xAF44, 0xAF47, 0x26D4, 0xAF48, 0xAF49, 0x0523, 0xAF4A, 0xAF4F, 0x26D8,
- 0xAF50, 0xAF50, 0x0525, 0xAF51, 0xAF5B, 0x26DE, 0xAF5C, 0xAF5D, 0x0526,
- 0xAF5E, 0xAF63, 0x26E9, 0xAF64, 0xAF65, 0x0528, 0xAF66, 0xAF78, 0x26EF,
- 0xAF79, 0xAF79, 0x052A, 0xAF7A, 0xAF7F, 0x2702, 0xAF80, 0xAF80, 0x052B,
- 0xAF81, 0xAF83, 0x2708, 0xAF84, 0xAF84, 0x052C, 0xAF85, 0xAF87, 0x270B,
- 0xAF88, 0xAF88, 0x052D, 0xAF89, 0xAF8F, 0x270E, 0xAF90, 0xAF91, 0x052E,
- 0xAF92, 0xAF94, 0x2715, 0xAF95, 0xAF95, 0x0530, 0xAF96, 0xAF9B, 0x2718,
- 0xAF9C, 0xAF9C, 0x0531, 0xAF9D, 0xAFB7, 0x271E, 0xAFB8, 0xAFB9, 0x0532,
- 0xAFBA, 0xAFBB, 0x2739, 0xAFBC, 0xAFBC, 0x0534, 0xAFBD, 0xAFBF, 0x273B,
- 0xAFC0, 0xAFC0, 0x0535, 0xAFC1, 0xAFC6, 0x273E, 0xAFC7, 0xAFC9, 0x0536,
- 0xAFCA, 0xAFCA, 0x2744, 0xAFCB, 0xAFCB, 0x0539, 0xAFCC, 0xAFCC, 0x2745,
- 0xAFCD, 0xAFCE, 0x053A, 0xAFCF, 0xAFD3, 0x2746, 0xAFD4, 0xAFD4, 0x053C,
- 0xAFD5, 0xAFDB, 0x274B, 0xAFDC, 0xAFDC, 0x053D, 0xAFDD, 0xAFE7, 0x2752,
- 0xAFE8, 0xAFE9, 0x053E, 0xAFEA, 0xAFEF, 0x275D, 0xAFF0, 0xAFF1, 0x0540,
- 0xAFF2, 0xAFF3, 0x2763, 0xAFF4, 0xAFF4, 0x0542, 0xAFF5, 0xAFF7, 0x2765,
- 0xAFF8, 0xAFF8, 0x0543, 0xAFF9, 0xAFFF, 0x2768, 0xB000, 0xB001, 0x0544,
- 0xB002, 0xB003, 0x276F, 0xB004, 0xB004, 0x0546, 0xB005, 0xB00B, 0x2771,
- 0xB00C, 0xB00C, 0x0547, 0xB00D, 0xB00F, 0x2778, 0xB010, 0xB010, 0x0548,
- 0xB011, 0xB013, 0x277B, 0xB014, 0xB014, 0x0549, 0xB015, 0xB01B, 0x277E,
- 0xB01C, 0xB01D, 0x054A, 0xB01E, 0xB027, 0x2785, 0xB028, 0xB028, 0x054C,
- 0xB029, 0xB043, 0x278F, 0xB044, 0xB045, 0x054D, 0xB046, 0xB047, 0x27AA,
- 0xB048, 0xB048, 0x054F, 0xB049, 0xB049, 0x27AC, 0xB04A, 0xB04A, 0x0550,
- 0xB04B, 0xB04B, 0x27AD, 0xB04C, 0xB04C, 0x0551, 0xB04D, 0xB04D, 0x27AE,
- 0xB04E, 0xB04E, 0x0552, 0xB04F, 0xB052, 0x27AF, 0xB053, 0xB055, 0x0553,
- 0xB056, 0xB056, 0x27B3, 0xB057, 0xB057, 0x0556, 0xB058, 0xB058, 0x27B4,
- 0xB059, 0xB059, 0x0557, 0xB05A, 0xB05C, 0x27B5, 0xB05D, 0xB05D, 0x0558,
- 0xB05E, 0xB07B, 0x27B8, 0xB07C, 0xB07D, 0x0559, 0xB07E, 0xB07F, 0x27D6,
- 0xB080, 0xB080, 0x055B, 0xB081, 0xB083, 0x27D8, 0xB084, 0xB084, 0x055C,
- 0xB085, 0xB08B, 0x27DB, 0xB08C, 0xB08D, 0x055D, 0xB08E, 0xB08E, 0x27E2,
- 0xB08F, 0xB08F, 0x055F, 0xB090, 0xB090, 0x27E3, 0xB091, 0xB091, 0x0560,
- 0xB092, 0xB097, 0x27E4, 0xB098, 0xB09A, 0x0561, 0xB09B, 0xB09B, 0x27EA,
- 0xB09C, 0xB09C, 0x0564, 0xB09D, 0xB09E, 0x27EB, 0xB09F, 0xB0A2, 0x0565,
- 0xB0A3, 0xB0A7, 0x27ED, 0xB0A8, 0xB0A9, 0x0569, 0xB0AA, 0xB0AA, 0x27F2,
- 0xB0AB, 0xB0AF, 0x056B, 0xB0B0, 0xB0B0, 0x27F3, 0xB0B1, 0xB0B1, 0x0570,
- 0xB0B2, 0xB0B2, 0x27F4, 0xB0B3, 0xB0B5, 0x0571, 0xB0B6, 0xB0B7, 0x27F5,
- 0xB0B8, 0xB0B8, 0x0574, 0xB0B9, 0xB0BB, 0x27F7, 0xB0BC, 0xB0BC, 0x0575,
- 0xB0BD, 0xB0C3, 0x27FA, 0xB0C4, 0xB0C5, 0x0576, 0xB0C6, 0xB0C6, 0x2801,
- 0xB0C7, 0xB0C9, 0x0578, 0xB0CA, 0xB0CF, 0x2802, 0xB0D0, 0xB0D1, 0x057B,
- 0xB0D2, 0xB0D3, 0x2808, 0xB0D4, 0xB0D4, 0x057D, 0xB0D5, 0xB0D7, 0x280A,
- 0xB0D8, 0xB0D8, 0x057E, 0xB0D9, 0xB0DF, 0x280D, 0xB0E0, 0xB0E0, 0x057F,
- 0xB0E1, 0xB0E4, 0x2814, 0xB0E5, 0xB0E5, 0x0580, 0xB0E6, 0xB0FF, 0x2818,
- 0xB100, 0xB107, 0x2832, 0xB108, 0xB109, 0x0581, 0xB10A, 0xB10A, 0x283A,
- 0xB10B, 0xB10C, 0x0583, 0xB10D, 0xB10F, 0x283B, 0xB110, 0xB110, 0x0585,
- 0xB111, 0xB111, 0x283E, 0xB112, 0xB113, 0x0586, 0xB114, 0xB117, 0x283F,
- 0xB118, 0xB119, 0x0588, 0xB11A, 0xB11A, 0x2843, 0xB11B, 0xB11D, 0x058A,
- 0xB11E, 0xB122, 0x2844, 0xB123, 0xB125, 0x058D, 0xB126, 0xB127, 0x2849,
- 0xB128, 0xB128, 0x0590, 0xB129, 0xB12B, 0x284B, 0xB12C, 0xB12C, 0x0591,
- 0xB12D, 0xB133, 0x284E, 0xB134, 0xB135, 0x0592, 0xB136, 0xB136, 0x2855,
- 0xB137, 0xB139, 0x0594, 0xB13A, 0xB13F, 0x2856, 0xB140, 0xB141, 0x0597,
- 0xB142, 0xB143, 0x285C, 0xB144, 0xB144, 0x0599, 0xB145, 0xB147, 0x285E,
- 0xB148, 0xB148, 0x059A, 0xB149, 0xB14F, 0x2861, 0xB150, 0xB151, 0x059B,
- 0xB152, 0xB153, 0x2868, 0xB154, 0xB155, 0x059D, 0xB156, 0xB157, 0x286A,
- 0xB158, 0xB158, 0x059F, 0xB159, 0xB15B, 0x286C, 0xB15C, 0xB15C, 0x05A0,
- 0xB15D, 0xB15F, 0x286F, 0xB160, 0xB160, 0x05A1, 0xB161, 0xB177, 0x2872,
- 0xB178, 0xB179, 0x05A2, 0xB17A, 0xB17B, 0x2889, 0xB17C, 0xB17C, 0x05A4,
- 0xB17D, 0xB17F, 0x288B, 0xB180, 0xB180, 0x05A5, 0xB181, 0xB181, 0x288E,
- 0xB182, 0xB182, 0x05A6, 0xB183, 0xB187, 0x288F, 0xB188, 0xB189, 0x05A7,
- 0xB18A, 0xB18A, 0x2894, 0xB18B, 0xB18B, 0x05A9, 0xB18C, 0xB18C, 0x2895,
- 0xB18D, 0xB18D, 0x05AA, 0xB18E, 0xB191, 0x2896, 0xB192, 0xB194, 0x05AB,
- 0xB195, 0xB197, 0x289A, 0xB198, 0xB198, 0x05AE, 0xB199, 0xB19B, 0x289D,
- 0xB19C, 0xB19C, 0x05AF, 0xB19D, 0xB1A7, 0x28A0, 0xB1A8, 0xB1A8, 0x05B0,
- 0xB1A9, 0xB1CB, 0x28AB, 0xB1CC, 0xB1CC, 0x05B1, 0xB1CD, 0xB1CF, 0x28CE,
- 0xB1D0, 0xB1D0, 0x05B2, 0xB1D1, 0xB1D3, 0x28D1, 0xB1D4, 0xB1D4, 0x05B3,
- 0xB1D5, 0xB1DB, 0x28D4, 0xB1DC, 0xB1DD, 0x05B4, 0xB1DE, 0xB1DE, 0x28DB,
- 0xB1DF, 0xB1DF, 0x05B6, 0xB1E0, 0xB1E7, 0x28DC, 0xB1E8, 0xB1E9, 0x05B7,
- 0xB1EA, 0xB1EB, 0x28E4, 0xB1EC, 0xB1EC, 0x05B9, 0xB1ED, 0xB1EF, 0x28E6,
- 0xB1F0, 0xB1F0, 0x05BA, 0xB1F1, 0xB1F8, 0x28E9, 0xB1F9, 0xB1F9, 0x05BB,
- 0xB1FA, 0xB1FA, 0x28F1, 0xB1FB, 0xB1FB, 0x05BC, 0xB1FC, 0xB1FC, 0x28F2,
- 0xB1FD, 0xB1FD, 0x05BD, 0xB1FE, 0xB1FF, 0x28F3, 0xB200, 0xB203, 0x28F5,
- 0xB204, 0xB205, 0x05BE, 0xB206, 0xB207, 0x28F9, 0xB208, 0xB208, 0x05C0,
- 0xB209, 0xB20A, 0x28FB, 0xB20B, 0xB20C, 0x05C1, 0xB20D, 0xB213, 0x28FD,
- 0xB214, 0xB215, 0x05C3, 0xB216, 0xB216, 0x2904, 0xB217, 0xB217, 0x05C5,
- 0xB218, 0xB218, 0x2905, 0xB219, 0xB219, 0x05C6, 0xB21A, 0xB21F, 0x2906,
- 0xB220, 0xB220, 0x05C7, 0xB221, 0xB233, 0x290C, 0xB234, 0xB234, 0x05C8,
- 0xB235, 0xB23B, 0x291F, 0xB23C, 0xB23C, 0x05C9, 0xB23D, 0xB257, 0x2926,
- 0xB258, 0xB258, 0x05CA, 0xB259, 0xB25B, 0x2941, 0xB25C, 0xB25C, 0x05CB,
- 0xB25D, 0xB25F, 0x2944, 0xB260, 0xB260, 0x05CC, 0xB261, 0xB267, 0x2947,
- 0xB268, 0xB269, 0x05CD, 0xB26A, 0xB273, 0x294E, 0xB274, 0xB275, 0x05CF,
- 0xB276, 0xB27B, 0x2958, 0xB27C, 0xB27C, 0x05D1, 0xB27D, 0xB283, 0x295E,
- 0xB284, 0xB285, 0x05D2, 0xB286, 0xB288, 0x2965, 0xB289, 0xB289, 0x05D4,
- 0xB28A, 0xB28F, 0x2968, 0xB290, 0xB291, 0x05D5, 0xB292, 0xB293, 0x296E,
- 0xB294, 0xB294, 0x05D7, 0xB295, 0xB297, 0x2970, 0xB298, 0xB29A, 0x05D8,
- 0xB29B, 0xB29F, 0x2973, 0xB2A0, 0xB2A1, 0x05DB, 0xB2A2, 0xB2A2, 0x2978,
- 0xB2A3, 0xB2A3, 0x05DD, 0xB2A4, 0xB2A4, 0x2979, 0xB2A5, 0xB2A6, 0x05DE,
- 0xB2A7, 0xB2A9, 0x297A, 0xB2AA, 0xB2AA, 0x05E0, 0xB2AB, 0xB2AB, 0x297D,
- 0xB2AC, 0xB2AC, 0x05E1, 0xB2AD, 0xB2AF, 0x297E, 0xB2B0, 0xB2B0, 0x05E2,
- 0xB2B1, 0xB2B3, 0x2981, 0xB2B4, 0xB2B4, 0x05E3, 0xB2B5, 0xB2C7, 0x2984,
- 0xB2C8, 0xB2C9, 0x05E4, 0xB2CA, 0xB2CB, 0x2997, 0xB2CC, 0xB2CC, 0x05E6,
- 0xB2CD, 0xB2CF, 0x2999, 0xB2D0, 0xB2D0, 0x05E7, 0xB2D1, 0xB2D1, 0x299C,
- 0xB2D2, 0xB2D2, 0x05E8, 0xB2D3, 0xB2D7, 0x299D, 0xB2D8, 0xB2D9, 0x05E9,
- 0xB2DA, 0xB2DA, 0x29A2, 0xB2DB, 0xB2DB, 0x05EB, 0xB2DC, 0xB2DC, 0x29A3,
- 0xB2DD, 0xB2DD, 0x05EC, 0xB2DE, 0xB2E1, 0x29A4, 0xB2E2, 0xB2E2, 0x05ED,
- 0xB2E3, 0xB2E3, 0x29A8, 0xB2E4, 0xB2E6, 0x05EE, 0xB2E7, 0xB2E7, 0x29A9,
- 0xB2E8, 0xB2E8, 0x05F1, 0xB2E9, 0xB2EA, 0x29AA, 0xB2EB, 0xB2EF, 0x05F2,
- 0xB2F0, 0xB2F2, 0x29AC, 0xB2F3, 0xB2F5, 0x05F7, 0xB2F6, 0xB2F6, 0x29AF,
- 0xB2F7, 0xB2FB, 0x05FA, 0xB2FC, 0xB2FE, 0x29B0, 0xB2FF, 0xB2FF, 0x05FF,
- 0xB300, 0xB301, 0x0600, 0xB302, 0xB303, 0x29B3, 0xB304, 0xB304, 0x0602,
- 0xB305, 0xB307, 0x29B5, 0xB308, 0xB308, 0x0603, 0xB309, 0xB30F, 0x29B8,
- 0xB310, 0xB311, 0x0604, 0xB312, 0xB312, 0x29BF, 0xB313, 0xB315, 0x0606,
- 0xB316, 0xB31B, 0x29C0, 0xB31C, 0xB31C, 0x0609, 0xB31D, 0xB353, 0x29C6,
- 0xB354, 0xB356, 0x060A, 0xB357, 0xB357, 0x29FD, 0xB358, 0xB358, 0x060D,
- 0xB359, 0xB35A, 0x29FE, 0xB35B, 0xB35C, 0x060E, 0xB35D, 0xB35D, 0x2A00,
- 0xB35E, 0xB35F, 0x0610, 0xB360, 0xB363, 0x2A01, 0xB364, 0xB365, 0x0612,
- 0xB366, 0xB366, 0x2A05, 0xB367, 0xB367, 0x0614, 0xB368, 0xB368, 0x2A06,
- 0xB369, 0xB369, 0x0615, 0xB36A, 0xB36A, 0x2A07, 0xB36B, 0xB36B, 0x0616,
- 0xB36C, 0xB36D, 0x2A08, 0xB36E, 0xB36E, 0x0617, 0xB36F, 0xB36F, 0x2A0A,
- 0xB370, 0xB371, 0x0618, 0xB372, 0xB373, 0x2A0B, 0xB374, 0xB374, 0x061A,
- 0xB375, 0xB377, 0x2A0D, 0xB378, 0xB378, 0x061B, 0xB379, 0xB37F, 0x2A10,
- 0xB380, 0xB381, 0x061C, 0xB382, 0xB382, 0x2A17, 0xB383, 0xB385, 0x061E,
- 0xB386, 0xB38B, 0x2A18, 0xB38C, 0xB38C, 0x0621, 0xB38D, 0xB38F, 0x2A1E,
- 0xB390, 0xB390, 0x0622, 0xB391, 0xB393, 0x2A21, 0xB394, 0xB394, 0x0623,
- 0xB395, 0xB39F, 0x2A24, 0xB3A0, 0xB3A1, 0x0624, 0xB3A2, 0xB3A7, 0x2A2F,
- 0xB3A8, 0xB3A8, 0x0626, 0xB3A9, 0xB3AB, 0x2A35, 0xB3AC, 0xB3AC, 0x0627,
- 0xB3AD, 0xB3C3, 0x2A38, 0xB3C4, 0xB3C5, 0x0628, 0xB3C6, 0xB3C7, 0x2A4F,
- 0xB3C8, 0xB3C8, 0x062A, 0xB3C9, 0xB3CA, 0x2A51, 0xB3CB, 0xB3CC, 0x062B,
- 0xB3CD, 0xB3CD, 0x2A53, 0xB3CE, 0xB3CE, 0x062D, 0xB3CF, 0xB3CF, 0x2A54,
- 0xB3D0, 0xB3D0, 0x062E, 0xB3D1, 0xB3D3, 0x2A55, 0xB3D4, 0xB3D5, 0x062F,
- 0xB3D6, 0xB3D6, 0x2A58, 0xB3D7, 0xB3D7, 0x0631, 0xB3D8, 0xB3D8, 0x2A59,
- 0xB3D9, 0xB3D9, 0x0632, 0xB3DA, 0xB3DA, 0x2A5A, 0xB3DB, 0xB3DB, 0x0633,
- 0xB3DC, 0xB3DC, 0x2A5B, 0xB3DD, 0xB3DD, 0x0634, 0xB3DE, 0xB3DF, 0x2A5C,
- 0xB3E0, 0xB3E0, 0x0635, 0xB3E1, 0xB3E3, 0x2A5E, 0xB3E4, 0xB3E4, 0x0636,
- 0xB3E5, 0xB3E7, 0x2A61, 0xB3E8, 0xB3E8, 0x0637, 0xB3E9, 0xB3FB, 0x2A64,
- 0xB3FC, 0xB3FC, 0x0638, 0xB3FD, 0xB3FF, 0x2A77, 0xB400, 0xB40F, 0x2A7A,
- 0xB410, 0xB410, 0x0639, 0xB411, 0xB417, 0x2A8A, 0xB418, 0xB418, 0x063A,
- 0xB419, 0xB41B, 0x2A91, 0xB41C, 0xB41C, 0x063B, 0xB41D, 0xB41F, 0x2A94,
- 0xB420, 0xB420, 0x063C, 0xB421, 0xB427, 0x2A97, 0xB428, 0xB429, 0x063D,
- 0xB42A, 0xB42A, 0x2A9E, 0xB42B, 0xB42B, 0x063F, 0xB42C, 0xB433, 0x2A9F,
- 0xB434, 0xB434, 0x0640, 0xB435, 0xB44F, 0x2AA7, 0xB450, 0xB451, 0x0641,
- 0xB452, 0xB453, 0x2AC2, 0xB454, 0xB454, 0x0643, 0xB455, 0xB457, 0x2AC4,
- 0xB458, 0xB458, 0x0644, 0xB459, 0xB45F, 0x2AC7, 0xB460, 0xB461, 0x0645,
- 0xB462, 0xB462, 0x2ACE, 0xB463, 0xB463, 0x0647, 0xB464, 0xB464, 0x2ACF,
- 0xB465, 0xB465, 0x0648, 0xB466, 0xB46B, 0x2AD0, 0xB46C, 0xB46C, 0x0649,
- 0xB46D, 0xB47F, 0x2AD6, 0xB480, 0xB480, 0x064A, 0xB481, 0xB487, 0x2AE9,
- 0xB488, 0xB488, 0x064B, 0xB489, 0xB49C, 0x2AF0, 0xB49D, 0xB49D, 0x064C,
- 0xB49E, 0xB4A3, 0x2B04, 0xB4A4, 0xB4A4, 0x064D, 0xB4A5, 0xB4A7, 0x2B0A,
- 0xB4A8, 0xB4A8, 0x064E, 0xB4A9, 0xB4AB, 0x2B0D, 0xB4AC, 0xB4AC, 0x064F,
- 0xB4AD, 0xB4B4, 0x2B10, 0xB4B5, 0xB4B5, 0x0650, 0xB4B6, 0xB4B6, 0x2B18,
- 0xB4B7, 0xB4B7, 0x0651, 0xB4B8, 0xB4B8, 0x2B19, 0xB4B9, 0xB4B9, 0x0652,
- 0xB4BA, 0xB4BF, 0x2B1A, 0xB4C0, 0xB4C0, 0x0653, 0xB4C1, 0xB4C3, 0x2B20,
- 0xB4C4, 0xB4C4, 0x0654, 0xB4C5, 0xB4C7, 0x2B23, 0xB4C8, 0xB4C8, 0x0655,
- 0xB4C9, 0xB4CF, 0x2B26, 0xB4D0, 0xB4D0, 0x0656, 0xB4D1, 0xB4D4, 0x2B2D,
- 0xB4D5, 0xB4D5, 0x0657, 0xB4D6, 0xB4DB, 0x2B31, 0xB4DC, 0xB4DD, 0x0658,
- 0xB4DE, 0xB4DF, 0x2B37, 0xB4E0, 0xB4E0, 0x065A, 0xB4E1, 0xB4E2, 0x2B39,
- 0xB4E3, 0xB4E4, 0x065B, 0xB4E5, 0xB4E5, 0x2B3B, 0xB4E6, 0xB4E6, 0x065D,
- 0xB4E7, 0xB4EB, 0x2B3C, 0xB4EC, 0xB4ED, 0x065E, 0xB4EE, 0xB4EE, 0x2B41,
- 0xB4EF, 0xB4EF, 0x0660, 0xB4F0, 0xB4F0, 0x2B42, 0xB4F1, 0xB4F1, 0x0661,
- 0xB4F2, 0xB4F7, 0x2B43, 0xB4F8, 0xB4F8, 0x0662, 0xB4F9, 0xB4FF, 0x2B49,
- 0xB500, 0xB513, 0x2B50, 0xB514, 0xB515, 0x0663, 0xB516, 0xB517, 0x2B64,
- 0xB518, 0xB518, 0x0665, 0xB519, 0xB51A, 0x2B66, 0xB51B, 0xB51C, 0x0666,
- 0xB51D, 0xB523, 0x2B68, 0xB524, 0xB525, 0x0668, 0xB526, 0xB526, 0x2B6F,
- 0xB527, 0xB52A, 0x066A, 0xB52B, 0xB52F, 0x2B70, 0xB530, 0xB531, 0x066E,
- 0xB532, 0xB533, 0x2B75, 0xB534, 0xB534, 0x0670, 0xB535, 0xB537, 0x2B77,
- 0xB538, 0xB538, 0x0671, 0xB539, 0xB53F, 0x2B7A, 0xB540, 0xB541, 0x0672,
- 0xB542, 0xB542, 0x2B81, 0xB543, 0xB545, 0x0674, 0xB546, 0xB54A, 0x2B82,
- 0xB54B, 0xB54D, 0x0677, 0xB54E, 0xB54F, 0x2B87, 0xB550, 0xB550, 0x067A,
- 0xB551, 0xB553, 0x2B89, 0xB554, 0xB554, 0x067B, 0xB555, 0xB55B, 0x2B8C,
- 0xB55C, 0xB55D, 0x067C, 0xB55E, 0xB55E, 0x2B93, 0xB55F, 0xB561, 0x067E,
- 0xB562, 0xB59F, 0x2B94, 0xB5A0, 0xB5A1, 0x0681, 0xB5A2, 0xB5A3, 0x2BD2,
- 0xB5A4, 0xB5A4, 0x0683, 0xB5A5, 0xB5A7, 0x2BD4, 0xB5A8, 0xB5A8, 0x0684,
- 0xB5A9, 0xB5A9, 0x2BD7, 0xB5AA, 0xB5AB, 0x0685, 0xB5AC, 0xB5AF, 0x2BD8,
- 0xB5B0, 0xB5B1, 0x0687, 0xB5B2, 0xB5B2, 0x2BDC, 0xB5B3, 0xB5B5, 0x0689,
- 0xB5B6, 0xB5BA, 0x2BDD, 0xB5BB, 0xB5BD, 0x068C, 0xB5BE, 0xB5BF, 0x2BE2,
- 0xB5C0, 0xB5C0, 0x068F, 0xB5C1, 0xB5C3, 0x2BE4, 0xB5C4, 0xB5C4, 0x0690,
- 0xB5C5, 0xB5CB, 0x2BE7, 0xB5CC, 0xB5CD, 0x0691, 0xB5CE, 0xB5CE, 0x2BEE,
- 0xB5CF, 0xB5D1, 0x0693, 0xB5D2, 0xB5D7, 0x2BEF, 0xB5D8, 0xB5D8, 0x0696,
- 0xB5D9, 0xB5EB, 0x2BF5, 0xB5EC, 0xB5EC, 0x0697, 0xB5ED, 0xB5FF, 0x2C08,
- 0xB600, 0xB60F, 0x2C1B, 0xB610, 0xB611, 0x0698, 0xB612, 0xB613, 0x2C2B,
- 0xB614, 0xB614, 0x069A, 0xB615, 0xB617, 0x2C2D, 0xB618, 0xB618, 0x069B,
- 0xB619, 0xB624, 0x2C30, 0xB625, 0xB625, 0x069C, 0xB626, 0xB62B, 0x2C3C,
- 0xB62C, 0xB62C, 0x069D, 0xB62D, 0xB633, 0x2C42, 0xB634, 0xB634, 0x069E,
- 0xB635, 0xB647, 0x2C49, 0xB648, 0xB648, 0x069F, 0xB649, 0xB663, 0x2C5C,
- 0xB664, 0xB664, 0x06A0, 0xB665, 0xB667, 0x2C77, 0xB668, 0xB668, 0x06A1,
- 0xB669, 0xB69B, 0x2C7A, 0xB69C, 0xB69D, 0x06A2, 0xB69E, 0xB69F, 0x2CAD,
- 0xB6A0, 0xB6A0, 0x06A4, 0xB6A1, 0xB6A3, 0x2CAF, 0xB6A4, 0xB6A4, 0x06A5,
- 0xB6A5, 0xB6AA, 0x2CB2, 0xB6AB, 0xB6AC, 0x06A6, 0xB6AD, 0xB6B0, 0x2CB8,
- 0xB6B1, 0xB6B1, 0x06A8, 0xB6B2, 0xB6D3, 0x2CBC, 0xB6D4, 0xB6D4, 0x06A9,
- 0xB6D5, 0xB6EF, 0x2CDE, 0xB6F0, 0xB6F0, 0x06AA, 0xB6F1, 0xB6F3, 0x2CF9,
- 0xB6F4, 0xB6F4, 0x06AB, 0xB6F5, 0xB6F7, 0x2CFC, 0xB6F8, 0xB6F8, 0x06AC,
- 0xB6F9, 0xB6FF, 0x2CFF, 0xB700, 0xB701, 0x06AD, 0xB702, 0xB704, 0x2D06,
- 0xB705, 0xB705, 0x06AF, 0xB706, 0xB727, 0x2D09, 0xB728, 0xB729, 0x06B0,
- 0xB72A, 0xB72B, 0x2D2B, 0xB72C, 0xB72C, 0x06B2, 0xB72D, 0xB72E, 0x2D2D,
- 0xB72F, 0xB730, 0x06B3, 0xB731, 0xB737, 0x2D2F, 0xB738, 0xB739, 0x06B5,
- 0xB73A, 0xB73A, 0x2D36, 0xB73B, 0xB73B, 0x06B7, 0xB73C, 0xB743, 0x2D37,
- 0xB744, 0xB744, 0x06B8, 0xB745, 0xB747, 0x2D3F, 0xB748, 0xB748, 0x06B9,
- 0xB749, 0xB74B, 0x2D42, 0xB74C, 0xB74C, 0x06BA, 0xB74D, 0xB753, 0x2D45,
- 0xB754, 0xB755, 0x06BB, 0xB756, 0xB75F, 0x2D4C, 0xB760, 0xB760, 0x06BD,
- 0xB761, 0xB763, 0x2D56, 0xB764, 0xB764, 0x06BE, 0xB765, 0xB767, 0x2D59,
- 0xB768, 0xB768, 0x06BF, 0xB769, 0xB76F, 0x2D5C, 0xB770, 0xB771, 0x06C0,
- 0xB772, 0xB772, 0x2D63, 0xB773, 0xB773, 0x06C2, 0xB774, 0xB774, 0x2D64,
- 0xB775, 0xB775, 0x06C3, 0xB776, 0xB77B, 0x2D65, 0xB77C, 0xB77D, 0x06C4,
- 0xB77E, 0xB77F, 0x2D6B, 0xB780, 0xB780, 0x06C6, 0xB781, 0xB783, 0x2D6D,
- 0xB784, 0xB784, 0x06C7, 0xB785, 0xB78B, 0x2D70, 0xB78C, 0xB78D, 0x06C8,
- 0xB78E, 0xB78E, 0x2D77, 0xB78F, 0xB792, 0x06CA, 0xB793, 0xB795, 0x2D78,
- 0xB796, 0xB799, 0x06CE, 0xB79A, 0xB79B, 0x2D7B, 0xB79C, 0xB79C, 0x06D2,
- 0xB79D, 0xB79F, 0x2D7D, 0xB7A0, 0xB7A0, 0x06D3, 0xB7A1, 0xB7A7, 0x2D80,
- 0xB7A8, 0xB7A9, 0x06D4, 0xB7AA, 0xB7AA, 0x2D87, 0xB7AB, 0xB7AD, 0x06D6,
- 0xB7AE, 0xB7B3, 0x2D88, 0xB7B4, 0xB7B5, 0x06D9, 0xB7B6, 0xB7B7, 0x2D8E,
- 0xB7B8, 0xB7B8, 0x06DB, 0xB7B9, 0xB7C6, 0x2D90, 0xB7C7, 0xB7C7, 0x06DC,
- 0xB7C8, 0xB7C8, 0x2D9E, 0xB7C9, 0xB7C9, 0x06DD, 0xB7CA, 0xB7EB, 0x2D9F,
- 0xB7EC, 0xB7ED, 0x06DE, 0xB7EE, 0xB7EF, 0x2DC1, 0xB7F0, 0xB7F0, 0x06E0,
- 0xB7F1, 0xB7F3, 0x2DC3, 0xB7F4, 0xB7F4, 0x06E1, 0xB7F5, 0xB7FB, 0x2DC6,
- 0xB7FC, 0xB7FD, 0x06E2, 0xB7FE, 0xB7FE, 0x2DCD, 0xB7FF, 0xB7FF, 0x06E4,
- 0xB800, 0xB801, 0x06E5, 0xB802, 0xB806, 0x2DCE, 0xB807, 0xB809, 0x06E7,
- 0xB80A, 0xB80B, 0x2DD3, 0xB80C, 0xB80C, 0x06EA, 0xB80D, 0xB80F, 0x2DD5,
- 0xB810, 0xB810, 0x06EB, 0xB811, 0xB817, 0x2DD8, 0xB818, 0xB819, 0x06EC,
- 0xB81A, 0xB81A, 0x2DDF, 0xB81B, 0xB81B, 0x06EE, 0xB81C, 0xB81C, 0x2DE0,
- 0xB81D, 0xB81D, 0x06EF, 0xB81E, 0xB823, 0x2DE1, 0xB824, 0xB825, 0x06F0,
- 0xB826, 0xB827, 0x2DE7, 0xB828, 0xB828, 0x06F2, 0xB829, 0xB82B, 0x2DE9,
- 0xB82C, 0xB82C, 0x06F3, 0xB82D, 0xB833, 0x2DEC, 0xB834, 0xB835, 0x06F4,
- 0xB836, 0xB836, 0x2DF3, 0xB837, 0xB839, 0x06F6, 0xB83A, 0xB83F, 0x2DF4,
- 0xB840, 0xB840, 0x06F9, 0xB841, 0xB843, 0x2DFA, 0xB844, 0xB844, 0x06FA,
- 0xB845, 0xB850, 0x2DFD, 0xB851, 0xB851, 0x06FB, 0xB852, 0xB852, 0x2E09,
- 0xB853, 0xB853, 0x06FC, 0xB854, 0xB85B, 0x2E0A, 0xB85C, 0xB85D, 0x06FD,
- 0xB85E, 0xB85F, 0x2E12, 0xB860, 0xB860, 0x06FF, 0xB861, 0xB863, 0x2E14,
- 0xB864, 0xB864, 0x0700, 0xB865, 0xB86B, 0x2E17, 0xB86C, 0xB86D, 0x0701,
- 0xB86E, 0xB86E, 0x2E1E, 0xB86F, 0xB86F, 0x0703, 0xB870, 0xB870, 0x2E1F,
- 0xB871, 0xB871, 0x0704, 0xB872, 0xB877, 0x2E20, 0xB878, 0xB878, 0x0705,
- 0xB879, 0xB87B, 0x2E26, 0xB87C, 0xB87C, 0x0706, 0xB87D, 0xB88C, 0x2E29,
- 0xB88D, 0xB88D, 0x0707, 0xB88E, 0xB8A7, 0x2E39, 0xB8A8, 0xB8A8, 0x0708,
- 0xB8A9, 0xB8AF, 0x2E53, 0xB8B0, 0xB8B0, 0x0709, 0xB8B1, 0xB8B3, 0x2E5A,
- 0xB8B4, 0xB8B4, 0x070A, 0xB8B5, 0xB8B7, 0x2E5D, 0xB8B8, 0xB8B8, 0x070B,
- 0xB8B9, 0xB8BF, 0x2E60, 0xB8C0, 0xB8C1, 0x070C, 0xB8C2, 0xB8C2, 0x2E67,
- 0xB8C3, 0xB8C3, 0x070E, 0xB8C4, 0xB8C4, 0x2E68, 0xB8C5, 0xB8C5, 0x070F,
- 0xB8C6, 0xB8CB, 0x2E69, 0xB8CC, 0xB8CC, 0x0710, 0xB8CD, 0xB8CF, 0x2E6F,
- 0xB8D0, 0xB8D0, 0x0711, 0xB8D1, 0xB8D3, 0x2E72, 0xB8D4, 0xB8D4, 0x0712,
- 0xB8D5, 0xB8DC, 0x2E75, 0xB8DD, 0xB8DD, 0x0713, 0xB8DE, 0xB8DE, 0x2E7D,
- 0xB8DF, 0xB8DF, 0x0714, 0xB8E0, 0xB8E0, 0x2E7E, 0xB8E1, 0xB8E1, 0x0715,
- 0xB8E2, 0xB8E7, 0x2E7F, 0xB8E8, 0xB8E9, 0x0716, 0xB8EA, 0xB8EB, 0x2E85,
- 0xB8EC, 0xB8EC, 0x0718, 0xB8ED, 0xB8EF, 0x2E87, 0xB8F0, 0xB8F0, 0x0719,
- 0xB8F1, 0xB8F7, 0x2E8A, 0xB8F8, 0xB8F9, 0x071A, 0xB8FA, 0xB8FA, 0x2E91,
- 0xB8FB, 0xB8FB, 0x071C, 0xB8FC, 0xB8FC, 0x2E92, 0xB8FD, 0xB8FD, 0x071D,
- 0xB8FE, 0xB8FF, 0x2E93, 0xB900, 0xB903, 0x2E95, 0xB904, 0xB904, 0x071E,
- 0xB905, 0xB917, 0x2E99, 0xB918, 0xB918, 0x071F, 0xB919, 0xB91F, 0x2EAC,
- 0xB920, 0xB920, 0x0720, 0xB921, 0xB93B, 0x2EB3, 0xB93C, 0xB93D, 0x0721,
- 0xB93E, 0xB93F, 0x2ECE, 0xB940, 0xB940, 0x0723, 0xB941, 0xB943, 0x2ED0,
- 0xB944, 0xB944, 0x0724, 0xB945, 0xB94B, 0x2ED3, 0xB94C, 0xB94C, 0x0725,
- 0xB94D, 0xB94E, 0x2EDA, 0xB94F, 0xB94F, 0x0726, 0xB950, 0xB950, 0x2EDC,
- 0xB951, 0xB951, 0x0727, 0xB952, 0xB957, 0x2EDD, 0xB958, 0xB959, 0x0728,
- 0xB95A, 0xB95B, 0x2EE3, 0xB95C, 0xB95C, 0x072A, 0xB95D, 0xB95F, 0x2EE5,
- 0xB960, 0xB960, 0x072B, 0xB961, 0xB967, 0x2EE8, 0xB968, 0xB969, 0x072C,
- 0xB96A, 0xB96A, 0x2EEF, 0xB96B, 0xB96B, 0x072E, 0xB96C, 0xB96C, 0x2EF0,
- 0xB96D, 0xB96D, 0x072F, 0xB96E, 0xB973, 0x2EF1, 0xB974, 0xB975, 0x0730,
- 0xB976, 0xB977, 0x2EF7, 0xB978, 0xB978, 0x0732, 0xB979, 0xB97B, 0x2EF9,
- 0xB97C, 0xB97C, 0x0733, 0xB97D, 0xB983, 0x2EFC, 0xB984, 0xB985, 0x0734,
- 0xB986, 0xB986, 0x2F03, 0xB987, 0xB987, 0x0736, 0xB988, 0xB988, 0x2F04,
- 0xB989, 0xB98A, 0x0737, 0xB98B, 0xB98C, 0x2F05, 0xB98D, 0xB98E, 0x0739,
- 0xB98F, 0xB9AB, 0x2F07, 0xB9AC, 0xB9AD, 0x073B, 0xB9AE, 0xB9AF, 0x2F24,
- 0xB9B0, 0xB9B0, 0x073D, 0xB9B1, 0xB9B3, 0x2F26, 0xB9B4, 0xB9B4, 0x073E,
- 0xB9B5, 0xB9BB, 0x2F29, 0xB9BC, 0xB9BD, 0x073F, 0xB9BE, 0xB9BE, 0x2F30,
- 0xB9BF, 0xB9BF, 0x0741, 0xB9C0, 0xB9C0, 0x2F31, 0xB9C1, 0xB9C1, 0x0742,
- 0xB9C2, 0xB9C7, 0x2F32, 0xB9C8, 0xB9C9, 0x0743, 0xB9CA, 0xB9CB, 0x2F38,
- 0xB9CC, 0xB9CC, 0x0745, 0xB9CD, 0xB9CD, 0x2F3A, 0xB9CE, 0xB9D2, 0x0746,
- 0xB9D3, 0xB9D7, 0x2F3B, 0xB9D8, 0xB9D9, 0x074B, 0xB9DA, 0xB9DA, 0x2F40,
- 0xB9DB, 0xB9DB, 0x074D, 0xB9DC, 0xB9DC, 0x2F41, 0xB9DD, 0xB9DE, 0x074E,
- 0xB9DF, 0xB9E0, 0x2F42, 0xB9E1, 0xB9E1, 0x0750, 0xB9E2, 0xB9E2, 0x2F44,
- 0xB9E3, 0xB9E5, 0x0751, 0xB9E6, 0xB9E7, 0x2F45, 0xB9E8, 0xB9E8, 0x0754,
- 0xB9E9, 0xB9EB, 0x2F47, 0xB9EC, 0xB9EC, 0x0755, 0xB9ED, 0xB9F3, 0x2F4A,
- 0xB9F4, 0xB9F5, 0x0756, 0xB9F6, 0xB9F6, 0x2F51, 0xB9F7, 0xB9FA, 0x0758,
- 0xB9FB, 0xB9FF, 0x2F52, 0xBA00, 0xBA01, 0x075C, 0xBA02, 0xBA07, 0x2F57,
- 0xBA08, 0xBA08, 0x075E, 0xBA09, 0xBA14, 0x2F5D, 0xBA15, 0xBA15, 0x075F,
- 0xBA16, 0xBA37, 0x2F69, 0xBA38, 0xBA39, 0x0760, 0xBA3A, 0xBA3B, 0x2F8B,
- 0xBA3C, 0xBA3C, 0x0762, 0xBA3D, 0xBA3F, 0x2F8D, 0xBA40, 0xBA40, 0x0763,
- 0xBA41, 0xBA41, 0x2F90, 0xBA42, 0xBA42, 0x0764, 0xBA43, 0xBA47, 0x2F91,
- 0xBA48, 0xBA49, 0x0765, 0xBA4A, 0xBA4A, 0x2F96, 0xBA4B, 0xBA4B, 0x0767,
- 0xBA4C, 0xBA4C, 0x2F97, 0xBA4D, 0xBA4E, 0x0768, 0xBA4F, 0xBA52, 0x2F98,
- 0xBA53, 0xBA55, 0x076A, 0xBA56, 0xBA57, 0x2F9C, 0xBA58, 0xBA58, 0x076D,
- 0xBA59, 0xBA5B, 0x2F9E, 0xBA5C, 0xBA5C, 0x076E, 0xBA5D, 0xBA63, 0x2FA1,
- 0xBA64, 0xBA65, 0x076F, 0xBA66, 0xBA66, 0x2FA8, 0xBA67, 0xBA69, 0x0771,
- 0xBA6A, 0xBA6F, 0x2FA9, 0xBA70, 0xBA71, 0x0774, 0xBA72, 0xBA73, 0x2FAF,
- 0xBA74, 0xBA74, 0x0776, 0xBA75, 0xBA77, 0x2FB1, 0xBA78, 0xBA78, 0x0777,
- 0xBA79, 0xBA82, 0x2FB4, 0xBA83, 0xBA85, 0x0778, 0xBA86, 0xBA86, 0x2FBE,
- 0xBA87, 0xBA87, 0x077B, 0xBA88, 0xBA8B, 0x2FBF, 0xBA8C, 0xBA8C, 0x077C,
- 0xBA8D, 0xBAA7, 0x2FC3, 0xBAA8, 0xBAA9, 0x077D, 0xBAAA, 0xBAAA, 0x2FDE,
- 0xBAAB, 0xBAAC, 0x077F, 0xBAAD, 0xBAAF, 0x2FDF, 0xBAB0, 0xBAB0, 0x0781,
- 0xBAB1, 0xBAB1, 0x2FE2, 0xBAB2, 0xBAB2, 0x0782, 0xBAB3, 0xBAB7, 0x2FE3,
- 0xBAB8, 0xBAB9, 0x0783, 0xBABA, 0xBABA, 0x2FE8, 0xBABB, 0xBABB, 0x0785,
- 0xBABC, 0xBABC, 0x2FE9, 0xBABD, 0xBABD, 0x0786, 0xBABE, 0xBAC3, 0x2FEA,
- 0xBAC4, 0xBAC4, 0x0787, 0xBAC5, 0xBAC7, 0x2FF0, 0xBAC8, 0xBAC8, 0x0788,
- 0xBAC9, 0xBAD7, 0x2FF3, 0xBAD8, 0xBAD9, 0x0789, 0xBADA, 0xBAFB, 0x3002,
- 0xBAFC, 0xBAFC, 0x078B, 0xBAFD, 0xBAFF, 0x3024, 0xBB00, 0xBB00, 0x078C,
- 0xBB01, 0xBB03, 0x3027, 0xBB04, 0xBB04, 0x078D, 0xBB05, 0xBB0C, 0x302A,
- 0xBB0D, 0xBB0D, 0x078E, 0xBB0E, 0xBB0E, 0x3032, 0xBB0F, 0xBB0F, 0x078F,
- 0xBB10, 0xBB10, 0x3033, 0xBB11, 0xBB11, 0x0790, 0xBB12, 0xBB17, 0x3034,
- 0xBB18, 0xBB18, 0x0791, 0xBB19, 0xBB1B, 0x303A, 0xBB1C, 0xBB1C, 0x0792,
- 0xBB1D, 0xBB1F, 0x303D, 0xBB20, 0xBB20, 0x0793, 0xBB21, 0xBB28, 0x3040,
- 0xBB29, 0xBB29, 0x0794, 0xBB2A, 0xBB2A, 0x3048, 0xBB2B, 0xBB2B, 0x0795,
- 0xBB2C, 0xBB33, 0x3049, 0xBB34, 0xBB36, 0x0796, 0xBB37, 0xBB37, 0x3051,
- 0xBB38, 0xBB38, 0x0799, 0xBB39, 0xBB3A, 0x3052, 0xBB3B, 0xBB3E, 0x079A,
- 0xBB3F, 0xBB43, 0x3054, 0xBB44, 0xBB45, 0x079E, 0xBB46, 0xBB46, 0x3059,
- 0xBB47, 0xBB47, 0x07A0, 0xBB48, 0xBB48, 0x305A, 0xBB49, 0xBB49, 0x07A1,
- 0xBB4A, 0xBB4C, 0x305B, 0xBB4D, 0xBB4D, 0x07A2, 0xBB4E, 0xBB4E, 0x305E,
- 0xBB4F, 0xBB50, 0x07A3, 0xBB51, 0xBB53, 0x305F, 0xBB54, 0xBB54, 0x07A5,
- 0xBB55, 0xBB57, 0x3062, 0xBB58, 0xBB58, 0x07A6, 0xBB59, 0xBB60, 0x3065,
- 0xBB61, 0xBB61, 0x07A7, 0xBB62, 0xBB62, 0x306D, 0xBB63, 0xBB63, 0x07A8,
- 0xBB64, 0xBB6B, 0x306E, 0xBB6C, 0xBB6C, 0x07A9, 0xBB6D, 0xBB87, 0x3076,
- 0xBB88, 0xBB88, 0x07AA, 0xBB89, 0xBB8B, 0x3091, 0xBB8C, 0xBB8C, 0x07AB,
- 0xBB8D, 0xBB8F, 0x3094, 0xBB90, 0xBB90, 0x07AC, 0xBB91, 0xBBA3, 0x3097,
- 0xBBA4, 0xBBA4, 0x07AD, 0xBBA5, 0xBBA7, 0x30AA, 0xBBA8, 0xBBA8, 0x07AE,
- 0xBBA9, 0xBBAB, 0x30AD, 0xBBAC, 0xBBAC, 0x07AF, 0xBBAD, 0xBBB3, 0x30B0,
- 0xBBB4, 0xBBB4, 0x07B0, 0xBBB5, 0xBBB6, 0x30B7, 0xBBB7, 0xBBB7, 0x07B1,
- 0xBBB8, 0xBBBF, 0x30B9, 0xBBC0, 0xBBC0, 0x07B2, 0xBBC1, 0xBBC3, 0x30C1,
- 0xBBC4, 0xBBC4, 0x07B3, 0xBBC5, 0xBBC7, 0x30C4, 0xBBC8, 0xBBC8, 0x07B4,
- 0xBBC9, 0xBBCF, 0x30C7, 0xBBD0, 0xBBD0, 0x07B5, 0xBBD1, 0xBBD2, 0x30CE,
- 0xBBD3, 0xBBD3, 0x07B6, 0xBBD4, 0xBBF7, 0x30D0, 0xBBF8, 0xBBF9, 0x07B7,
- 0xBBFA, 0xBBFB, 0x30F4, 0xBBFC, 0xBBFC, 0x07B9, 0xBBFD, 0xBBFE, 0x30F6,
- 0xBBFF, 0xBBFF, 0x07BA, 0xBC00, 0xBC00, 0x07BB, 0xBC01, 0xBC01, 0x30F8,
- 0xBC02, 0xBC02, 0x07BC, 0xBC03, 0xBC07, 0x30F9, 0xBC08, 0xBC09, 0x07BD,
- 0xBC0A, 0xBC0A, 0x30FE, 0xBC0B, 0xBC0D, 0x07BF, 0xBC0E, 0xBC0E, 0x30FF,
- 0xBC0F, 0xBC0F, 0x07C2, 0xBC10, 0xBC10, 0x3100, 0xBC11, 0xBC11, 0x07C3,
- 0xBC12, 0xBC13, 0x3101, 0xBC14, 0xBC18, 0x07C4, 0xBC19, 0xBC1A, 0x3103,
- 0xBC1B, 0xBC1F, 0x07C9, 0xBC20, 0xBC23, 0x3105, 0xBC24, 0xBC25, 0x07CE,
- 0xBC26, 0xBC26, 0x3109, 0xBC27, 0xBC27, 0x07D0, 0xBC28, 0xBC28, 0x310A,
- 0xBC29, 0xBC29, 0x07D1, 0xBC2A, 0xBC2C, 0x310B, 0xBC2D, 0xBC2D, 0x07D2,
- 0xBC2E, 0xBC2F, 0x310E, 0xBC30, 0xBC31, 0x07D3, 0xBC32, 0xBC33, 0x3110,
- 0xBC34, 0xBC34, 0x07D5, 0xBC35, 0xBC37, 0x3112, 0xBC38, 0xBC38, 0x07D6,
- 0xBC39, 0xBC3F, 0x3115, 0xBC40, 0xBC41, 0x07D7, 0xBC42, 0xBC42, 0x311C,
- 0xBC43, 0xBC45, 0x07D9, 0xBC46, 0xBC48, 0x311D, 0xBC49, 0xBC49, 0x07DC,
- 0xBC4A, 0xBC4B, 0x3120, 0xBC4C, 0xBC4D, 0x07DD, 0xBC4E, 0xBC4F, 0x3122,
- 0xBC50, 0xBC50, 0x07DF, 0xBC51, 0xBC5C, 0x3124, 0xBC5D, 0xBC5D, 0x07E0,
- 0xBC5E, 0xBC83, 0x3130, 0xBC84, 0xBC85, 0x07E1, 0xBC86, 0xBC87, 0x3156,
- 0xBC88, 0xBC88, 0x07E3, 0xBC89, 0xBC8A, 0x3158, 0xBC8B, 0xBC8C, 0x07E4,
- 0xBC8D, 0xBC8D, 0x315A, 0xBC8E, 0xBC8E, 0x07E6, 0xBC8F, 0xBC93, 0x315B,
- 0xBC94, 0xBC95, 0x07E7, 0xBC96, 0xBC96, 0x3160, 0xBC97, 0xBC97, 0x07E9,
- 0xBC98, 0xBC98, 0x3161, 0xBC99, 0xBC9A, 0x07EA, 0xBC9B, 0xBC9F, 0x3162,
- 0xBCA0, 0xBCA1, 0x07EC, 0xBCA2, 0xBCA3, 0x3167, 0xBCA4, 0xBCA4, 0x07EE,
- 0xBCA5, 0xBCA6, 0x3169, 0xBCA7, 0xBCA8, 0x07EF, 0xBCA9, 0xBCAF, 0x316B,
- 0xBCB0, 0xBCB1, 0x07F1, 0xBCB2, 0xBCB2, 0x3172, 0xBCB3, 0xBCB5, 0x07F3,
- 0xBCB6, 0xBCBB, 0x3173, 0xBCBC, 0xBCBD, 0x07F6, 0xBCBE, 0xBCBF, 0x3179,
- 0xBCC0, 0xBCC0, 0x07F8, 0xBCC1, 0xBCC3, 0x317B, 0xBCC4, 0xBCC4, 0x07F9,
- 0xBCC5, 0xBCCC, 0x317E, 0xBCCD, 0xBCCD, 0x07FA, 0xBCCE, 0xBCCE, 0x3186,
- 0xBCCF, 0xBCD1, 0x07FB, 0xBCD2, 0xBCD4, 0x3187, 0xBCD5, 0xBCD5, 0x07FE,
- 0xBCD6, 0xBCD7, 0x318A, 0xBCD8, 0xBCD8, 0x07FF, 0xBCD9, 0xBCDB, 0x318C,
- 0xBCDC, 0xBCDC, 0x0800, 0xBCDD, 0xBCF3, 0x318F, 0xBCF4, 0xBCF6, 0x0801,
- 0xBCF7, 0xBCF7, 0x31A6, 0xBCF8, 0xBCF8, 0x0804, 0xBCF9, 0xBCFB, 0x31A7,
- 0xBCFC, 0xBCFC, 0x0805, 0xBCFD, 0xBCFF, 0x31AA, 0xBD00, 0xBD03, 0x31AD,
- 0xBD04, 0xBD05, 0x0806, 0xBD06, 0xBD06, 0x31B1, 0xBD07, 0xBD07, 0x0808,
- 0xBD08, 0xBD08, 0x31B2, 0xBD09, 0xBD09, 0x0809, 0xBD0A, 0xBD0F, 0x31B3,
- 0xBD10, 0xBD10, 0x080A, 0xBD11, 0xBD13, 0x31B9, 0xBD14, 0xBD14, 0x080B,
- 0xBD15, 0xBD23, 0x31BC, 0xBD24, 0xBD24, 0x080C, 0xBD25, 0xBD2B, 0x31CB,
- 0xBD2C, 0xBD2C, 0x080D, 0xBD2D, 0xBD3F, 0x31D2, 0xBD40, 0xBD40, 0x080E,
- 0xBD41, 0xBD47, 0x31E5, 0xBD48, 0xBD49, 0x080F, 0xBD4A, 0xBD4B, 0x31EC,
- 0xBD4C, 0xBD4C, 0x0811, 0xBD4D, 0xBD4F, 0x31EE, 0xBD50, 0xBD50, 0x0812,
- 0xBD51, 0xBD57, 0x31F1, 0xBD58, 0xBD59, 0x0813, 0xBD5A, 0xBD63, 0x31F8,
- 0xBD64, 0xBD64, 0x0815, 0xBD65, 0xBD67, 0x3202, 0xBD68, 0xBD68, 0x0816,
- 0xBD69, 0xBD7F, 0x3205, 0xBD80, 0xBD81, 0x0817, 0xBD82, 0xBD83, 0x321C,
- 0xBD84, 0xBD84, 0x0819, 0xBD85, 0xBD86, 0x321E, 0xBD87, 0xBD8A, 0x081A,
- 0xBD8B, 0xBD8F, 0x3220, 0xBD90, 0xBD91, 0x081E, 0xBD92, 0xBD92, 0x3225,
- 0xBD93, 0xBD93, 0x0820, 0xBD94, 0xBD94, 0x3226, 0xBD95, 0xBD95, 0x0821,
- 0xBD96, 0xBD98, 0x3227, 0xBD99, 0xBD9A, 0x0822, 0xBD9B, 0xBD9B, 0x322A,
- 0xBD9C, 0xBD9C, 0x0824, 0xBD9D, 0xBDA3, 0x322B, 0xBDA4, 0xBDA4, 0x0825,
- 0xBDA5, 0xBDAF, 0x3232, 0xBDB0, 0xBDB0, 0x0826, 0xBDB1, 0xBDB7, 0x323D,
- 0xBDB8, 0xBDB8, 0x0827, 0xBDB9, 0xBDD3, 0x3244, 0xBDD4, 0xBDD5, 0x0828,
- 0xBDD6, 0xBDD7, 0x325F, 0xBDD8, 0xBDD8, 0x082A, 0xBDD9, 0xBDDB, 0x3261,
- 0xBDDC, 0xBDDC, 0x082B, 0xBDDD, 0xBDE8, 0x3264, 0xBDE9, 0xBDE9, 0x082C,
- 0xBDEA, 0xBDEF, 0x3270, 0xBDF0, 0xBDF0, 0x082D, 0xBDF1, 0xBDF3, 0x3276,
- 0xBDF4, 0xBDF4, 0x082E, 0xBDF5, 0xBDF7, 0x3279, 0xBDF8, 0xBDF8, 0x082F,
- 0xBDF9, 0xBDFF, 0x327C, 0xBE00, 0xBE00, 0x0830, 0xBE01, 0xBE02, 0x3283,
- 0xBE03, 0xBE03, 0x0831, 0xBE04, 0xBE04, 0x3285, 0xBE05, 0xBE05, 0x0832,
- 0xBE06, 0xBE0B, 0x3286, 0xBE0C, 0xBE0D, 0x0833, 0xBE0E, 0xBE0F, 0x328C,
- 0xBE10, 0xBE10, 0x0835, 0xBE11, 0xBE13, 0x328E, 0xBE14, 0xBE14, 0x0836,
- 0xBE15, 0xBE1B, 0x3291, 0xBE1C, 0xBE1D, 0x0837, 0xBE1E, 0xBE1E, 0x3298,
- 0xBE1F, 0xBE1F, 0x0839, 0xBE20, 0xBE43, 0x3299, 0xBE44, 0xBE45, 0x083A,
- 0xBE46, 0xBE47, 0x32BD, 0xBE48, 0xBE48, 0x083C, 0xBE49, 0xBE4B, 0x32BF,
- 0xBE4C, 0xBE4C, 0x083D, 0xBE4D, 0xBE4D, 0x32C2, 0xBE4E, 0xBE4E, 0x083E,
- 0xBE4F, 0xBE53, 0x32C3, 0xBE54, 0xBE55, 0x083F, 0xBE56, 0xBE56, 0x32C8,
- 0xBE57, 0xBE57, 0x0841, 0xBE58, 0xBE58, 0x32C9, 0xBE59, 0xBE5B, 0x0842,
- 0xBE5C, 0xBE5F, 0x32CA, 0xBE60, 0xBE61, 0x0845, 0xBE62, 0xBE63, 0x32CE,
- 0xBE64, 0xBE64, 0x0847, 0xBE65, 0xBE67, 0x32D0, 0xBE68, 0xBE68, 0x0848,
- 0xBE69, 0xBE69, 0x32D3, 0xBE6A, 0xBE6A, 0x0849, 0xBE6B, 0xBE6F, 0x32D4,
- 0xBE70, 0xBE71, 0x084A, 0xBE72, 0xBE72, 0x32D9, 0xBE73, 0xBE75, 0x084C,
- 0xBE76, 0xBE7A, 0x32DA, 0xBE7B, 0xBE7D, 0x084F, 0xBE7E, 0xBE7F, 0x32DF,
- 0xBE80, 0xBE80, 0x0852, 0xBE81, 0xBE83, 0x32E1, 0xBE84, 0xBE84, 0x0853,
- 0xBE85, 0xBE8B, 0x32E4, 0xBE8C, 0xBE8D, 0x0854, 0xBE8E, 0xBE8E, 0x32EB,
- 0xBE8F, 0xBE91, 0x0856, 0xBE92, 0xBE97, 0x32EC, 0xBE98, 0xBE99, 0x0859,
- 0xBE9A, 0xBEA7, 0x32F2, 0xBEA8, 0xBEA8, 0x085B, 0xBEA9, 0xBECF, 0x3300,
- 0xBED0, 0xBED1, 0x085C, 0xBED2, 0xBED3, 0x3327, 0xBED4, 0xBED4, 0x085E,
- 0xBED5, 0xBED6, 0x3329, 0xBED7, 0xBED8, 0x085F, 0xBED9, 0xBEDF, 0x332B,
- 0xBEE0, 0xBEE0, 0x0861, 0xBEE1, 0xBEE2, 0x3332, 0xBEE3, 0xBEE5, 0x0862,
- 0xBEE6, 0xBEEB, 0x3334, 0xBEEC, 0xBEEC, 0x0865, 0xBEED, 0xBEFF, 0x333A,
- 0xBF00, 0xBF00, 0x334D, 0xBF01, 0xBF01, 0x0866, 0xBF02, 0xBF07, 0x334E,
- 0xBF08, 0xBF09, 0x0867, 0xBF0A, 0xBF17, 0x3354, 0xBF18, 0xBF19, 0x0869,
- 0xBF1A, 0xBF1A, 0x3362, 0xBF1B, 0xBF1D, 0x086B, 0xBF1E, 0xBF3F, 0x3363,
- 0xBF40, 0xBF41, 0x086E, 0xBF42, 0xBF43, 0x3385, 0xBF44, 0xBF44, 0x0870,
- 0xBF45, 0xBF47, 0x3387, 0xBF48, 0xBF48, 0x0871, 0xBF49, 0xBF4F, 0x338A,
- 0xBF50, 0xBF51, 0x0872, 0xBF52, 0xBF54, 0x3391, 0xBF55, 0xBF55, 0x0874,
- 0xBF56, 0xBF93, 0x3394, 0xBF94, 0xBF94, 0x0875, 0xBF95, 0xBFAF, 0x33D2,
- 0xBFB0, 0xBFB0, 0x0876, 0xBFB1, 0xBFC4, 0x33ED, 0xBFC5, 0xBFC5, 0x0877,
- 0xBFC6, 0xBFCB, 0x3401, 0xBFCC, 0xBFCD, 0x0878, 0xBFCE, 0xBFCF, 0x3407,
- 0xBFD0, 0xBFD0, 0x087A, 0xBFD1, 0xBFD3, 0x3409, 0xBFD4, 0xBFD4, 0x087B,
- 0xBFD5, 0xBFDB, 0x340C, 0xBFDC, 0xBFDC, 0x087C, 0xBFDD, 0xBFDE, 0x3413,
- 0xBFDF, 0xBFDF, 0x087D, 0xBFE0, 0xBFE0, 0x3415, 0xBFE1, 0xBFE1, 0x087E,
- 0xBFE2, 0xBFFF, 0x3416, 0xC000, 0xC03B, 0x3434, 0xC03C, 0xC03C, 0x087F,
- 0xC03D, 0xC050, 0x3470, 0xC051, 0xC051, 0x0880, 0xC052, 0xC057, 0x3484,
- 0xC058, 0xC058, 0x0881, 0xC059, 0xC05B, 0x348A, 0xC05C, 0xC05C, 0x0882,
- 0xC05D, 0xC05F, 0x348D, 0xC060, 0xC060, 0x0883, 0xC061, 0xC067, 0x3490,
- 0xC068, 0xC069, 0x0884, 0xC06A, 0xC08F, 0x3497, 0xC090, 0xC091, 0x0886,
- 0xC092, 0xC093, 0x34BD, 0xC094, 0xC094, 0x0888, 0xC095, 0xC097, 0x34BF,
- 0xC098, 0xC098, 0x0889, 0xC099, 0xC09F, 0x34C2, 0xC0A0, 0xC0A1, 0x088A,
- 0xC0A2, 0xC0A2, 0x34C9, 0xC0A3, 0xC0A3, 0x088C, 0xC0A4, 0xC0A4, 0x34CA,
- 0xC0A5, 0xC0A5, 0x088D, 0xC0A6, 0xC0AB, 0x34CB, 0xC0AC, 0xC0AD, 0x088E,
- 0xC0AE, 0xC0AE, 0x34D1, 0xC0AF, 0xC0B0, 0x0890, 0xC0B1, 0xC0B2, 0x34D2,
- 0xC0B3, 0xC0B6, 0x0892, 0xC0B7, 0xC0BB, 0x34D4, 0xC0BC, 0xC0BD, 0x0896,
- 0xC0BE, 0xC0BE, 0x34D9, 0xC0BF, 0xC0C1, 0x0898, 0xC0C2, 0xC0C4, 0x34DA,
- 0xC0C5, 0xC0C5, 0x089B, 0xC0C6, 0xC0C7, 0x34DD, 0xC0C8, 0xC0C9, 0x089C,
- 0xC0CA, 0xC0CB, 0x34DF, 0xC0CC, 0xC0CC, 0x089E, 0xC0CD, 0xC0CF, 0x34E1,
- 0xC0D0, 0xC0D0, 0x089F, 0xC0D1, 0xC0D7, 0x34E4, 0xC0D8, 0xC0D9, 0x08A0,
- 0xC0DA, 0xC0DA, 0x34EB, 0xC0DB, 0xC0DD, 0x08A2, 0xC0DE, 0xC0E3, 0x34EC,
- 0xC0E4, 0xC0E5, 0x08A5, 0xC0E6, 0xC0E7, 0x34F2, 0xC0E8, 0xC0E8, 0x08A7,
- 0xC0E9, 0xC0EB, 0x34F4, 0xC0EC, 0xC0EC, 0x08A8, 0xC0ED, 0xC0F3, 0x34F7,
- 0xC0F4, 0xC0F5, 0x08A9, 0xC0F6, 0xC0F6, 0x34FE, 0xC0F7, 0xC0F7, 0x08AB,
- 0xC0F8, 0xC0F8, 0x34FF, 0xC0F9, 0xC0F9, 0x08AC, 0xC0FA, 0xC0FF, 0x3500,
- 0xC100, 0xC100, 0x08AD, 0xC101, 0xC103, 0x3506, 0xC104, 0xC104, 0x08AE,
- 0xC105, 0xC107, 0x3509, 0xC108, 0xC108, 0x08AF, 0xC109, 0xC10F, 0x350C,
- 0xC110, 0xC110, 0x08B0, 0xC111, 0xC114, 0x3513, 0xC115, 0xC115, 0x08B1,
- 0xC116, 0xC11B, 0x3517, 0xC11C, 0xC120, 0x08B2, 0xC121, 0xC122, 0x351D,
- 0xC123, 0xC124, 0x08B7, 0xC125, 0xC125, 0x351F, 0xC126, 0xC127, 0x08B9,
- 0xC128, 0xC12B, 0x3520, 0xC12C, 0xC12D, 0x08BB, 0xC12E, 0xC12E, 0x3524,
- 0xC12F, 0xC131, 0x08BD, 0xC132, 0xC135, 0x3525, 0xC136, 0xC136, 0x08C0,
- 0xC137, 0xC137, 0x3529, 0xC138, 0xC139, 0x08C1, 0xC13A, 0xC13B, 0x352A,
- 0xC13C, 0xC13C, 0x08C3, 0xC13D, 0xC13F, 0x352C, 0xC140, 0xC140, 0x08C4,
- 0xC141, 0xC147, 0x352F, 0xC148, 0xC149, 0x08C5, 0xC14A, 0xC14A, 0x3536,
- 0xC14B, 0xC14D, 0x08C7, 0xC14E, 0xC153, 0x3537, 0xC154, 0xC155, 0x08CA,
- 0xC156, 0xC157, 0x353D, 0xC158, 0xC158, 0x08CC, 0xC159, 0xC15B, 0x353F,
- 0xC15C, 0xC15C, 0x08CD, 0xC15D, 0xC163, 0x3542, 0xC164, 0xC165, 0x08CE,
- 0xC166, 0xC166, 0x3549, 0xC167, 0xC169, 0x08D0, 0xC16A, 0xC16F, 0x354A,
- 0xC170, 0xC170, 0x08D3, 0xC171, 0xC173, 0x3550, 0xC174, 0xC174, 0x08D4,
- 0xC175, 0xC177, 0x3553, 0xC178, 0xC178, 0x08D5, 0xC179, 0xC184, 0x3556,
- 0xC185, 0xC185, 0x08D6, 0xC186, 0xC18B, 0x3562, 0xC18C, 0xC18E, 0x08D7,
- 0xC18F, 0xC18F, 0x3568, 0xC190, 0xC190, 0x08DA, 0xC191, 0xC193, 0x3569,
- 0xC194, 0xC194, 0x08DB, 0xC195, 0xC195, 0x356C, 0xC196, 0xC196, 0x08DC,
- 0xC197, 0xC19B, 0x356D, 0xC19C, 0xC19D, 0x08DD, 0xC19E, 0xC19E, 0x3572,
- 0xC19F, 0xC19F, 0x08DF, 0xC1A0, 0xC1A0, 0x3573, 0xC1A1, 0xC1A1, 0x08E0,
- 0xC1A2, 0xC1A4, 0x3574, 0xC1A5, 0xC1A5, 0x08E1, 0xC1A6, 0xC1A7, 0x3577,
- 0xC1A8, 0xC1A9, 0x08E2, 0xC1AA, 0xC1AB, 0x3579, 0xC1AC, 0xC1AC, 0x08E4,
- 0xC1AD, 0xC1AF, 0x357B, 0xC1B0, 0xC1B0, 0x08E5, 0xC1B1, 0xC1BC, 0x357E,
- 0xC1BD, 0xC1BD, 0x08E6, 0xC1BE, 0xC1C3, 0x358A, 0xC1C4, 0xC1C4, 0x08E7,
- 0xC1C5, 0xC1C7, 0x3590, 0xC1C8, 0xC1C8, 0x08E8, 0xC1C9, 0xC1CB, 0x3593,
- 0xC1CC, 0xC1CC, 0x08E9, 0xC1CD, 0xC1D3, 0x3596, 0xC1D4, 0xC1D4, 0x08EA,
- 0xC1D5, 0xC1D6, 0x359D, 0xC1D7, 0xC1D8, 0x08EB, 0xC1D9, 0xC1DF, 0x359F,
- 0xC1E0, 0xC1E0, 0x08ED, 0xC1E1, 0xC1E3, 0x35A6, 0xC1E4, 0xC1E4, 0x08EE,
- 0xC1E5, 0xC1E7, 0x35A9, 0xC1E8, 0xC1E8, 0x08EF, 0xC1E9, 0xC1EF, 0x35AC,
- 0xC1F0, 0xC1F1, 0x08F0, 0xC1F2, 0xC1F2, 0x35B3, 0xC1F3, 0xC1F3, 0x08F2,
- 0xC1F4, 0xC1FB, 0x35B4, 0xC1FC, 0xC1FD, 0x08F3, 0xC1FE, 0xC1FF, 0x35BC,
- 0xC200, 0xC200, 0x08F5, 0xC201, 0xC203, 0x35BE, 0xC204, 0xC204, 0x08F6,
- 0xC205, 0xC20B, 0x35C1, 0xC20C, 0xC20D, 0x08F7, 0xC20E, 0xC20E, 0x35C8,
- 0xC20F, 0xC20F, 0x08F9, 0xC210, 0xC210, 0x35C9, 0xC211, 0xC211, 0x08FA,
- 0xC212, 0xC217, 0x35CA, 0xC218, 0xC219, 0x08FB, 0xC21A, 0xC21B, 0x35D0,
- 0xC21C, 0xC21C, 0x08FD, 0xC21D, 0xC21E, 0x35D2, 0xC21F, 0xC220, 0x08FE,
- 0xC221, 0xC227, 0x35D4, 0xC228, 0xC229, 0x0900, 0xC22A, 0xC22A, 0x35DB,
- 0xC22B, 0xC22B, 0x0902, 0xC22C, 0xC22C, 0x35DC, 0xC22D, 0xC22D, 0x0903,
- 0xC22E, 0xC22E, 0x35DD, 0xC22F, 0xC22F, 0x0904, 0xC230, 0xC230, 0x35DE,
- 0xC231, 0xC232, 0x0905, 0xC233, 0xC233, 0x35DF, 0xC234, 0xC234, 0x0907,
- 0xC235, 0xC247, 0x35E0, 0xC248, 0xC248, 0x0908, 0xC249, 0xC24F, 0x35F3,
- 0xC250, 0xC251, 0x0909, 0xC252, 0xC253, 0x35FA, 0xC254, 0xC254, 0x090B,
- 0xC255, 0xC257, 0x35FC, 0xC258, 0xC258, 0x090C, 0xC259, 0xC25F, 0x35FF,
- 0xC260, 0xC260, 0x090D, 0xC261, 0xC264, 0x3606, 0xC265, 0xC265, 0x090E,
- 0xC266, 0xC26B, 0x360A, 0xC26C, 0xC26D, 0x090F, 0xC26E, 0xC26F, 0x3610,
- 0xC270, 0xC270, 0x0911, 0xC271, 0xC273, 0x3612, 0xC274, 0xC274, 0x0912,
- 0xC275, 0xC27B, 0x3615, 0xC27C, 0xC27D, 0x0913, 0xC27E, 0xC27E, 0x361C,
- 0xC27F, 0xC27F, 0x0915, 0xC280, 0xC280, 0x361D, 0xC281, 0xC281, 0x0916,
- 0xC282, 0xC287, 0x361E, 0xC288, 0xC289, 0x0917, 0xC28A, 0xC28F, 0x3624,
- 0xC290, 0xC290, 0x0919, 0xC291, 0xC297, 0x362A, 0xC298, 0xC298, 0x091A,
- 0xC299, 0xC29A, 0x3631, 0xC29B, 0xC29B, 0x091B, 0xC29C, 0xC29C, 0x3633,
- 0xC29D, 0xC29D, 0x091C, 0xC29E, 0xC2A3, 0x3634, 0xC2A4, 0xC2A5, 0x091D,
- 0xC2A6, 0xC2A7, 0x363A, 0xC2A8, 0xC2A8, 0x091F, 0xC2A9, 0xC2AB, 0x363C,
- 0xC2AC, 0xC2AD, 0x0920, 0xC2AE, 0xC2B3, 0x363F, 0xC2B4, 0xC2B5, 0x0922,
- 0xC2B6, 0xC2B6, 0x3645, 0xC2B7, 0xC2B7, 0x0924, 0xC2B8, 0xC2B8, 0x3646,
- 0xC2B9, 0xC2B9, 0x0925, 0xC2BA, 0xC2DB, 0x3647, 0xC2DC, 0xC2DD, 0x0926,
- 0xC2DE, 0xC2DF, 0x3669, 0xC2E0, 0xC2E0, 0x0928, 0xC2E1, 0xC2E2, 0x366B,
- 0xC2E3, 0xC2E4, 0x0929, 0xC2E5, 0xC2EA, 0x366D, 0xC2EB, 0xC2ED, 0x092B,
- 0xC2EE, 0xC2EE, 0x3673, 0xC2EF, 0xC2EF, 0x092E, 0xC2F0, 0xC2F0, 0x3674,
- 0xC2F1, 0xC2F1, 0x092F, 0xC2F2, 0xC2F5, 0x3675, 0xC2F6, 0xC2F6, 0x0930,
- 0xC2F7, 0xC2F7, 0x3679, 0xC2F8, 0xC2F9, 0x0931, 0xC2FA, 0xC2FA, 0x367A,
- 0xC2FB, 0xC2FC, 0x0933, 0xC2FD, 0xC2FF, 0x367B, 0xC300, 0xC300, 0x0935,
- 0xC301, 0xC307, 0x367E, 0xC308, 0xC309, 0x0936, 0xC30A, 0xC30B, 0x3685,
- 0xC30C, 0xC30D, 0x0938, 0xC30E, 0xC312, 0x3687, 0xC313, 0xC315, 0x093A,
- 0xC316, 0xC317, 0x368C, 0xC318, 0xC318, 0x093D, 0xC319, 0xC31B, 0x368E,
- 0xC31C, 0xC31C, 0x093E, 0xC31D, 0xC323, 0x3691, 0xC324, 0xC325, 0x093F,
- 0xC326, 0xC327, 0x3698, 0xC328, 0xC329, 0x0941, 0xC32A, 0xC344, 0x369A,
- 0xC345, 0xC345, 0x0943, 0xC346, 0xC367, 0x36B5, 0xC368, 0xC369, 0x0944,
- 0xC36A, 0xC36B, 0x36D7, 0xC36C, 0xC36C, 0x0946, 0xC36D, 0xC36F, 0x36D9,
- 0xC370, 0xC370, 0x0947, 0xC371, 0xC371, 0x36DC, 0xC372, 0xC372, 0x0948,
- 0xC373, 0xC377, 0x36DD, 0xC378, 0xC379, 0x0949, 0xC37A, 0xC37B, 0x36E2,
- 0xC37C, 0xC37D, 0x094B, 0xC37E, 0xC383, 0x36E4, 0xC384, 0xC384, 0x094D,
- 0xC385, 0xC387, 0x36EA, 0xC388, 0xC388, 0x094E, 0xC389, 0xC38B, 0x36ED,
- 0xC38C, 0xC38C, 0x094F, 0xC38D, 0xC3BF, 0x36F0, 0xC3C0, 0xC3C0, 0x0950,
- 0xC3C1, 0xC3D7, 0x3723, 0xC3D8, 0xC3D9, 0x0951, 0xC3DA, 0xC3DB, 0x373A,
- 0xC3DC, 0xC3DC, 0x0953, 0xC3DD, 0xC3DE, 0x373C, 0xC3DF, 0xC3E0, 0x0954,
- 0xC3E1, 0xC3E1, 0x373E, 0xC3E2, 0xC3E2, 0x0956, 0xC3E3, 0xC3E7, 0x373F,
- 0xC3E8, 0xC3E9, 0x0957, 0xC3EA, 0xC3EC, 0x3744, 0xC3ED, 0xC3ED, 0x0959,
- 0xC3EE, 0xC3F3, 0x3747, 0xC3F4, 0xC3F5, 0x095A, 0xC3F6, 0xC3F7, 0x374D,
- 0xC3F8, 0xC3F8, 0x095C, 0xC3F9, 0xC3FF, 0x374F, 0xC400, 0xC407, 0x3756,
- 0xC408, 0xC408, 0x095D, 0xC409, 0xC40F, 0x375E, 0xC410, 0xC410, 0x095E,
- 0xC411, 0xC423, 0x3765, 0xC424, 0xC424, 0x095F, 0xC425, 0xC42B, 0x3778,
- 0xC42C, 0xC42C, 0x0960, 0xC42D, 0xC42F, 0x377F, 0xC430, 0xC430, 0x0961,
- 0xC431, 0xC433, 0x3782, 0xC434, 0xC434, 0x0962, 0xC435, 0xC43B, 0x3785,
- 0xC43C, 0xC43D, 0x0963, 0xC43E, 0xC447, 0x378C, 0xC448, 0xC448, 0x0965,
- 0xC449, 0xC463, 0x3796, 0xC464, 0xC465, 0x0966, 0xC466, 0xC467, 0x37B1,
- 0xC468, 0xC468, 0x0968, 0xC469, 0xC46B, 0x37B3, 0xC46C, 0xC46C, 0x0969,
- 0xC46D, 0xC473, 0x37B6, 0xC474, 0xC475, 0x096A, 0xC476, 0xC478, 0x37BD,
- 0xC479, 0xC479, 0x096C, 0xC47A, 0xC47F, 0x37C0, 0xC480, 0xC480, 0x096D,
- 0xC481, 0xC493, 0x37C6, 0xC494, 0xC494, 0x096E, 0xC495, 0xC49B, 0x37D9,
- 0xC49C, 0xC49C, 0x096F, 0xC49D, 0xC4B7, 0x37E0, 0xC4B8, 0xC4B8, 0x0970,
- 0xC4B9, 0xC4BB, 0x37FB, 0xC4BC, 0xC4BC, 0x0971, 0xC4BD, 0xC4E8, 0x37FE,
- 0xC4E9, 0xC4E9, 0x0972, 0xC4EA, 0xC4EF, 0x382A, 0xC4F0, 0xC4F1, 0x0973,
- 0xC4F2, 0xC4F3, 0x3830, 0xC4F4, 0xC4F4, 0x0975, 0xC4F5, 0xC4F7, 0x3832,
- 0xC4F8, 0xC4F8, 0x0976, 0xC4F9, 0xC4F9, 0x3835, 0xC4FA, 0xC4FA, 0x0977,
- 0xC4FB, 0xC4FE, 0x3836, 0xC4FF, 0xC4FF, 0x0978, 0xC500, 0xC501, 0x0979,
- 0xC502, 0xC50B, 0x383A, 0xC50C, 0xC50C, 0x097B, 0xC50D, 0xC50F, 0x3844,
- 0xC510, 0xC510, 0x097C, 0xC511, 0xC513, 0x3847, 0xC514, 0xC514, 0x097D,
- 0xC515, 0xC51B, 0x384A, 0xC51C, 0xC51C, 0x097E, 0xC51D, 0xC527, 0x3851,
- 0xC528, 0xC529, 0x097F, 0xC52A, 0xC52B, 0x385C, 0xC52C, 0xC52C, 0x0981,
- 0xC52D, 0xC52F, 0x385E, 0xC530, 0xC530, 0x0982, 0xC531, 0xC537, 0x3861,
- 0xC538, 0xC539, 0x0983, 0xC53A, 0xC53A, 0x3868, 0xC53B, 0xC53B, 0x0985,
- 0xC53C, 0xC53C, 0x3869, 0xC53D, 0xC53D, 0x0986, 0xC53E, 0xC543, 0x386A,
- 0xC544, 0xC545, 0x0987, 0xC546, 0xC547, 0x3870, 0xC548, 0xC54A, 0x0989,
- 0xC54B, 0xC54B, 0x3872, 0xC54C, 0xC54E, 0x098C, 0xC54F, 0xC552, 0x3873,
- 0xC553, 0xC555, 0x098F, 0xC556, 0xC556, 0x3877, 0xC557, 0xC559, 0x0992,
- 0xC55A, 0xC55C, 0x3878, 0xC55D, 0xC55E, 0x0995, 0xC55F, 0xC55F, 0x387B,
- 0xC560, 0xC561, 0x0997, 0xC562, 0xC563, 0x387C, 0xC564, 0xC564, 0x0999,
- 0xC565, 0xC567, 0x387E, 0xC568, 0xC568, 0x099A, 0xC569, 0xC56F, 0x3881,
- 0xC570, 0xC571, 0x099B, 0xC572, 0xC572, 0x3888, 0xC573, 0xC575, 0x099D,
- 0xC576, 0xC57B, 0x3889, 0xC57C, 0xC57D, 0x09A0, 0xC57E, 0xC57F, 0x388F,
- 0xC580, 0xC580, 0x09A2, 0xC581, 0xC583, 0x3891, 0xC584, 0xC584, 0x09A3,
- 0xC585, 0xC586, 0x3894, 0xC587, 0xC587, 0x09A4, 0xC588, 0xC58B, 0x3896,
- 0xC58C, 0xC58D, 0x09A5, 0xC58E, 0xC58E, 0x389A, 0xC58F, 0xC58F, 0x09A7,
- 0xC590, 0xC590, 0x389B, 0xC591, 0xC591, 0x09A8, 0xC592, 0xC594, 0x389C,
- 0xC595, 0xC595, 0x09A9, 0xC596, 0xC596, 0x389F, 0xC597, 0xC598, 0x09AA,
- 0xC599, 0xC59B, 0x38A0, 0xC59C, 0xC59C, 0x09AC, 0xC59D, 0xC59F, 0x38A3,
- 0xC5A0, 0xC5A0, 0x09AD, 0xC5A1, 0xC5A8, 0x38A6, 0xC5A9, 0xC5A9, 0x09AE,
- 0xC5AA, 0xC5B3, 0x38AE, 0xC5B4, 0xC5B5, 0x09AF, 0xC5B6, 0xC5B7, 0x38B8,
- 0xC5B8, 0xC5B9, 0x09B1, 0xC5BA, 0xC5BA, 0x38BA, 0xC5BB, 0xC5BE, 0x09B3,
- 0xC5BF, 0xC5C3, 0x38BB, 0xC5C4, 0xC5CA, 0x09B7, 0xC5CB, 0xC5CB, 0x38C0,
- 0xC5CC, 0xC5CC, 0x09BE, 0xC5CD, 0xC5CD, 0x38C1, 0xC5CE, 0xC5CE, 0x09BF,
- 0xC5CF, 0xC5CF, 0x38C2, 0xC5D0, 0xC5D1, 0x09C0, 0xC5D2, 0xC5D3, 0x38C3,
- 0xC5D4, 0xC5D4, 0x09C2, 0xC5D5, 0xC5D7, 0x38C5, 0xC5D8, 0xC5D8, 0x09C3,
- 0xC5D9, 0xC5DF, 0x38C8, 0xC5E0, 0xC5E1, 0x09C4, 0xC5E2, 0xC5E2, 0x38CF,
- 0xC5E3, 0xC5E3, 0x09C6, 0xC5E4, 0xC5E4, 0x38D0, 0xC5E5, 0xC5E5, 0x09C7,
- 0xC5E6, 0xC5EB, 0x38D1, 0xC5EC, 0xC5EE, 0x09C8, 0xC5EF, 0xC5EF, 0x38D7,
- 0xC5F0, 0xC5F0, 0x09CB, 0xC5F1, 0xC5F3, 0x38D8, 0xC5F4, 0xC5F4, 0x09CC,
- 0xC5F5, 0xC5F5, 0x38DB, 0xC5F6, 0xC5F7, 0x09CD, 0xC5F8, 0xC5FB, 0x38DC,
- 0xC5FC, 0xC5FF, 0x09CF, 0xC600, 0xC601, 0x09D3, 0xC602, 0xC604, 0x38E0,
- 0xC605, 0xC608, 0x09D5, 0xC609, 0xC60B, 0x38E3, 0xC60C, 0xC60C, 0x09D9,
- 0xC60D, 0xC60F, 0x38E6, 0xC610, 0xC610, 0x09DA, 0xC611, 0xC617, 0x38E9,
- 0xC618, 0xC619, 0x09DB, 0xC61A, 0xC61A, 0x38F0, 0xC61B, 0xC61C, 0x09DD,
- 0xC61D, 0xC623, 0x38F1, 0xC624, 0xC625, 0x09DF, 0xC626, 0xC627, 0x38F8,
- 0xC628, 0xC628, 0x09E1, 0xC629, 0xC62B, 0x38FA, 0xC62C, 0xC62E, 0x09E2,
- 0xC62F, 0xC62F, 0x38FD, 0xC630, 0xC630, 0x09E5, 0xC631, 0xC632, 0x38FE,
- 0xC633, 0xC635, 0x09E6, 0xC636, 0xC636, 0x3900, 0xC637, 0xC637, 0x09E9,
- 0xC638, 0xC638, 0x3901, 0xC639, 0xC639, 0x09EA, 0xC63A, 0xC63A, 0x3902,
- 0xC63B, 0xC63B, 0x09EB, 0xC63C, 0xC63F, 0x3903, 0xC640, 0xC641, 0x09EC,
- 0xC642, 0xC643, 0x3907, 0xC644, 0xC644, 0x09EE, 0xC645, 0xC647, 0x3909,
- 0xC648, 0xC648, 0x09EF, 0xC649, 0xC64F, 0x390C, 0xC650, 0xC651, 0x09F0,
- 0xC652, 0xC652, 0x3913, 0xC653, 0xC655, 0x09F2, 0xC656, 0xC65B, 0x3914,
- 0xC65C, 0xC65D, 0x09F5, 0xC65E, 0xC65F, 0x391A, 0xC660, 0xC660, 0x09F7,
- 0xC661, 0xC66B, 0x391C, 0xC66C, 0xC66C, 0x09F8, 0xC66D, 0xC66E, 0x3927,
- 0xC66F, 0xC66F, 0x09F9, 0xC670, 0xC670, 0x3929, 0xC671, 0xC671, 0x09FA,
- 0xC672, 0xC677, 0x392A, 0xC678, 0xC679, 0x09FB, 0xC67A, 0xC67B, 0x3930,
- 0xC67C, 0xC67C, 0x09FD, 0xC67D, 0xC67F, 0x3932, 0xC680, 0xC680, 0x09FE,
- 0xC681, 0xC687, 0x3935, 0xC688, 0xC689, 0x09FF, 0xC68A, 0xC68A, 0x393C,
- 0xC68B, 0xC68B, 0x0A01, 0xC68C, 0xC68C, 0x393D, 0xC68D, 0xC68D, 0x0A02,
- 0xC68E, 0xC693, 0x393E, 0xC694, 0xC695, 0x0A03, 0xC696, 0xC697, 0x3944,
- 0xC698, 0xC698, 0x0A05, 0xC699, 0xC69B, 0x3946, 0xC69C, 0xC69C, 0x0A06,
- 0xC69D, 0xC6A3, 0x3949, 0xC6A4, 0xC6A5, 0x0A07, 0xC6A6, 0xC6A6, 0x3950,
- 0xC6A7, 0xC6A7, 0x0A09, 0xC6A8, 0xC6A8, 0x3951, 0xC6A9, 0xC6A9, 0x0A0A,
- 0xC6AA, 0xC6AF, 0x3952, 0xC6B0, 0xC6B1, 0x0A0B, 0xC6B2, 0xC6B3, 0x3958,
- 0xC6B4, 0xC6B4, 0x0A0D, 0xC6B5, 0xC6B7, 0x395A, 0xC6B8, 0xC6BA, 0x0A0E,
- 0xC6BB, 0xC6BF, 0x395D, 0xC6C0, 0xC6C1, 0x0A11, 0xC6C2, 0xC6C2, 0x3962,
- 0xC6C3, 0xC6C3, 0x0A13, 0xC6C4, 0xC6C4, 0x3963, 0xC6C5, 0xC6C5, 0x0A14,
- 0xC6C6, 0xC6CB, 0x3964, 0xC6CC, 0xC6CD, 0x0A15, 0xC6CE, 0xC6CF, 0x396A,
- 0xC6D0, 0xC6D0, 0x0A17, 0xC6D1, 0xC6D3, 0x396C, 0xC6D4, 0xC6D4, 0x0A18,
- 0xC6D5, 0xC6DB, 0x396F, 0xC6DC, 0xC6DD, 0x0A19, 0xC6DE, 0xC6DF, 0x3976,
- 0xC6E0, 0xC6E1, 0x0A1B, 0xC6E2, 0xC6E7, 0x3978, 0xC6E8, 0xC6E9, 0x0A1D,
- 0xC6EA, 0xC6EB, 0x397E, 0xC6EC, 0xC6EC, 0x0A1F, 0xC6ED, 0xC6EF, 0x3980,
- 0xC6F0, 0xC6F0, 0x0A20, 0xC6F1, 0xC6F7, 0x3983, 0xC6F8, 0xC6F9, 0x0A21,
- 0xC6FA, 0xC6FC, 0x398A, 0xC6FD, 0xC6FD, 0x0A23, 0xC6FE, 0xC6FF, 0x398D,
- 0xC700, 0xC703, 0x398F, 0xC704, 0xC705, 0x0A24, 0xC706, 0xC707, 0x3993,
- 0xC708, 0xC708, 0x0A26, 0xC709, 0xC70B, 0x3995, 0xC70C, 0xC70C, 0x0A27,
- 0xC70D, 0xC713, 0x3998, 0xC714, 0xC715, 0x0A28, 0xC716, 0xC716, 0x399F,
- 0xC717, 0xC717, 0x0A2A, 0xC718, 0xC718, 0x39A0, 0xC719, 0xC719, 0x0A2B,
- 0xC71A, 0xC71F, 0x39A1, 0xC720, 0xC721, 0x0A2C, 0xC722, 0xC723, 0x39A7,
- 0xC724, 0xC724, 0x0A2E, 0xC725, 0xC727, 0x39A9, 0xC728, 0xC728, 0x0A2F,
- 0xC729, 0xC72F, 0x39AC, 0xC730, 0xC731, 0x0A30, 0xC732, 0xC732, 0x39B3,
- 0xC733, 0xC733, 0x0A32, 0xC734, 0xC734, 0x39B4, 0xC735, 0xC735, 0x0A33,
- 0xC736, 0xC736, 0x39B5, 0xC737, 0xC737, 0x0A34, 0xC738, 0xC73B, 0x39B6,
- 0xC73C, 0xC73D, 0x0A35, 0xC73E, 0xC73F, 0x39BA, 0xC740, 0xC740, 0x0A37,
- 0xC741, 0xC743, 0x39BC, 0xC744, 0xC744, 0x0A38, 0xC745, 0xC749, 0x39BF,
- 0xC74A, 0xC74A, 0x0A39, 0xC74B, 0xC74B, 0x39C4, 0xC74C, 0xC74D, 0x0A3A,
- 0xC74E, 0xC74E, 0x39C5, 0xC74F, 0xC74F, 0x0A3C, 0xC750, 0xC750, 0x39C6,
- 0xC751, 0xC758, 0x0A3D, 0xC759, 0xC75B, 0x39C7, 0xC75C, 0xC75C, 0x0A45,
- 0xC75D, 0xC75F, 0x39CA, 0xC760, 0xC760, 0x0A46, 0xC761, 0xC767, 0x39CD,
- 0xC768, 0xC768, 0x0A47, 0xC769, 0xC76A, 0x39D4, 0xC76B, 0xC76B, 0x0A48,
- 0xC76C, 0xC773, 0x39D6, 0xC774, 0xC775, 0x0A49, 0xC776, 0xC777, 0x39DE,
- 0xC778, 0xC778, 0x0A4B, 0xC779, 0xC77B, 0x39E0, 0xC77C, 0xC77E, 0x0A4C,
- 0xC77F, 0xC782, 0x39E3, 0xC783, 0xC785, 0x0A4F, 0xC786, 0xC786, 0x39E7,
- 0xC787, 0xC78A, 0x0A52, 0xC78B, 0xC78D, 0x39E8, 0xC78E, 0xC78E, 0x0A56,
- 0xC78F, 0xC78F, 0x39EB, 0xC790, 0xC791, 0x0A57, 0xC792, 0xC793, 0x39EC,
- 0xC794, 0xC794, 0x0A59, 0xC795, 0xC795, 0x39EE, 0xC796, 0xC798, 0x0A5A,
- 0xC799, 0xC799, 0x39EF, 0xC79A, 0xC79A, 0x0A5D, 0xC79B, 0xC79F, 0x39F0,
- 0xC7A0, 0xC7A1, 0x0A5E, 0xC7A2, 0xC7A2, 0x39F5, 0xC7A3, 0xC7A6, 0x0A60,
- 0xC7A7, 0xC7AB, 0x39F6, 0xC7AC, 0xC7AD, 0x0A64, 0xC7AE, 0xC7AF, 0x39FB,
- 0xC7B0, 0xC7B0, 0x0A66, 0xC7B1, 0xC7B3, 0x39FD, 0xC7B4, 0xC7B4, 0x0A67,
- 0xC7B5, 0xC7BB, 0x3A00, 0xC7BC, 0xC7BD, 0x0A68, 0xC7BE, 0xC7BE, 0x3A07,
- 0xC7BF, 0xC7C1, 0x0A6A, 0xC7C2, 0xC7C7, 0x3A08, 0xC7C8, 0xC7C9, 0x0A6D,
- 0xC7CA, 0xC7CB, 0x3A0E, 0xC7CC, 0xC7CC, 0x0A6F, 0xC7CD, 0xC7CD, 0x3A10,
- 0xC7CE, 0xC7CE, 0x0A70, 0xC7CF, 0xC7CF, 0x3A11, 0xC7D0, 0xC7D0, 0x0A71,
- 0xC7D1, 0xC7D7, 0x3A12, 0xC7D8, 0xC7D8, 0x0A72, 0xC7D9, 0xC7DC, 0x3A19,
- 0xC7DD, 0xC7DD, 0x0A73, 0xC7DE, 0xC7E3, 0x3A1D, 0xC7E4, 0xC7E4, 0x0A74,
- 0xC7E5, 0xC7E7, 0x3A23, 0xC7E8, 0xC7E8, 0x0A75, 0xC7E9, 0xC7EB, 0x3A26,
- 0xC7EC, 0xC7EC, 0x0A76, 0xC7ED, 0xC7FF, 0x3A29, 0xC800, 0xC801, 0x0A77,
- 0xC802, 0xC803, 0x3A3C, 0xC804, 0xC804, 0x0A79, 0xC805, 0xC807, 0x3A3E,
- 0xC808, 0xC808, 0x0A7A, 0xC809, 0xC809, 0x3A41, 0xC80A, 0xC80A, 0x0A7B,
- 0xC80B, 0xC80F, 0x3A42, 0xC810, 0xC811, 0x0A7C, 0xC812, 0xC812, 0x3A47,
- 0xC813, 0xC813, 0x0A7E, 0xC814, 0xC814, 0x3A48, 0xC815, 0xC816, 0x0A7F,
- 0xC817, 0xC81B, 0x3A49, 0xC81C, 0xC81D, 0x0A81, 0xC81E, 0xC81F, 0x3A4E,
- 0xC820, 0xC820, 0x0A83, 0xC821, 0xC823, 0x3A50, 0xC824, 0xC824, 0x0A84,
- 0xC825, 0xC82B, 0x3A53, 0xC82C, 0xC82D, 0x0A85, 0xC82E, 0xC82E, 0x3A5A,
- 0xC82F, 0xC82F, 0x0A87, 0xC830, 0xC830, 0x3A5B, 0xC831, 0xC831, 0x0A88,
- 0xC832, 0xC837, 0x3A5C, 0xC838, 0xC838, 0x0A89, 0xC839, 0xC83B, 0x3A62,
- 0xC83C, 0xC83C, 0x0A8A, 0xC83D, 0xC83F, 0x3A65, 0xC840, 0xC840, 0x0A8B,
- 0xC841, 0xC847, 0x3A68, 0xC848, 0xC849, 0x0A8C, 0xC84A, 0xC84B, 0x3A6F,
- 0xC84C, 0xC84D, 0x0A8E, 0xC84E, 0xC853, 0x3A71, 0xC854, 0xC854, 0x0A90,
- 0xC855, 0xC86F, 0x3A77, 0xC870, 0xC871, 0x0A91, 0xC872, 0xC873, 0x3A92,
- 0xC874, 0xC874, 0x0A93, 0xC875, 0xC877, 0x3A94, 0xC878, 0xC878, 0x0A94,
- 0xC879, 0xC879, 0x3A97, 0xC87A, 0xC87A, 0x0A95, 0xC87B, 0xC87F, 0x3A98,
- 0xC880, 0xC881, 0x0A96, 0xC882, 0xC882, 0x3A9D, 0xC883, 0xC883, 0x0A98,
- 0xC884, 0xC884, 0x3A9E, 0xC885, 0xC887, 0x0A99, 0xC888, 0xC88A, 0x3A9F,
- 0xC88B, 0xC88D, 0x0A9C, 0xC88E, 0xC893, 0x3AA2, 0xC894, 0xC894, 0x0A9F,
- 0xC895, 0xC89C, 0x3AA8, 0xC89D, 0xC89D, 0x0AA0, 0xC89E, 0xC89E, 0x3AB0,
- 0xC89F, 0xC89F, 0x0AA1, 0xC8A0, 0xC8A0, 0x3AB1, 0xC8A1, 0xC8A1, 0x0AA2,
- 0xC8A2, 0xC8A7, 0x3AB2, 0xC8A8, 0xC8A8, 0x0AA3, 0xC8A9, 0xC8BB, 0x3AB8,
- 0xC8BC, 0xC8BD, 0x0AA4, 0xC8BE, 0xC8C3, 0x3ACB, 0xC8C4, 0xC8C4, 0x0AA6,
- 0xC8C5, 0xC8C7, 0x3AD1, 0xC8C8, 0xC8C8, 0x0AA7, 0xC8C9, 0xC8CB, 0x3AD4,
- 0xC8CC, 0xC8CC, 0x0AA8, 0xC8CD, 0xC8D3, 0x3AD7, 0xC8D4, 0xC8D5, 0x0AA9,
- 0xC8D6, 0xC8D6, 0x3ADE, 0xC8D7, 0xC8D7, 0x0AAB, 0xC8D8, 0xC8D8, 0x3ADF,
- 0xC8D9, 0xC8D9, 0x0AAC, 0xC8DA, 0xC8DF, 0x3AE0, 0xC8E0, 0xC8E1, 0x0AAD,
- 0xC8E2, 0xC8E3, 0x3AE6, 0xC8E4, 0xC8E4, 0x0AAF, 0xC8E5, 0xC8F4, 0x3AE8,
- 0xC8F5, 0xC8F5, 0x0AB0, 0xC8F6, 0xC8FB, 0x3AF8, 0xC8FC, 0xC8FD, 0x0AB1,
- 0xC8FE, 0xC8FF, 0x3AFE, 0xC900, 0xC900, 0x0AB3, 0xC901, 0xC903, 0x3B00,
- 0xC904, 0xC906, 0x0AB4, 0xC907, 0xC90B, 0x3B03, 0xC90C, 0xC90D, 0x0AB7,
- 0xC90E, 0xC90E, 0x3B08, 0xC90F, 0xC90F, 0x0AB9, 0xC910, 0xC910, 0x3B09,
- 0xC911, 0xC911, 0x0ABA, 0xC912, 0xC917, 0x3B0A, 0xC918, 0xC918, 0x0ABB,
- 0xC919, 0xC92B, 0x3B10, 0xC92C, 0xC92C, 0x0ABC, 0xC92D, 0xC933, 0x3B23,
- 0xC934, 0xC934, 0x0ABD, 0xC935, 0xC94F, 0x3B2A, 0xC950, 0xC951, 0x0ABE,
- 0xC952, 0xC953, 0x3B45, 0xC954, 0xC954, 0x0AC0, 0xC955, 0xC957, 0x3B47,
- 0xC958, 0xC958, 0x0AC1, 0xC959, 0xC95F, 0x3B4A, 0xC960, 0xC961, 0x0AC2,
- 0xC962, 0xC962, 0x3B51, 0xC963, 0xC963, 0x0AC4, 0xC964, 0xC96B, 0x3B52,
- 0xC96C, 0xC96C, 0x0AC5, 0xC96D, 0xC96F, 0x3B5A, 0xC970, 0xC970, 0x0AC6,
- 0xC971, 0xC973, 0x3B5D, 0xC974, 0xC974, 0x0AC7, 0xC975, 0xC97B, 0x3B60,
- 0xC97C, 0xC97C, 0x0AC8, 0xC97D, 0xC987, 0x3B67, 0xC988, 0xC989, 0x0AC9,
- 0xC98A, 0xC98B, 0x3B72, 0xC98C, 0xC98C, 0x0ACB, 0xC98D, 0xC98F, 0x3B74,
- 0xC990, 0xC990, 0x0ACC, 0xC991, 0xC997, 0x3B77, 0xC998, 0xC999, 0x0ACD,
- 0xC99A, 0xC99A, 0x3B7E, 0xC99B, 0xC99B, 0x0ACF, 0xC99C, 0xC99C, 0x3B7F,
- 0xC99D, 0xC99D, 0x0AD0, 0xC99E, 0xC9BF, 0x3B80, 0xC9C0, 0xC9C1, 0x0AD1,
- 0xC9C2, 0xC9C3, 0x3BA2, 0xC9C4, 0xC9C4, 0x0AD3, 0xC9C5, 0xC9C6, 0x3BA4,
- 0xC9C7, 0xC9C8, 0x0AD4, 0xC9C9, 0xC9C9, 0x3BA6, 0xC9CA, 0xC9CA, 0x0AD6,
- 0xC9CB, 0xC9CF, 0x3BA7, 0xC9D0, 0xC9D1, 0x0AD7, 0xC9D2, 0xC9D2, 0x3BAC,
- 0xC9D3, 0xC9D3, 0x0AD9, 0xC9D4, 0xC9D4, 0x3BAD, 0xC9D5, 0xC9D6, 0x0ADA,
- 0xC9D7, 0xC9D8, 0x3BAE, 0xC9D9, 0xC9DA, 0x0ADC, 0xC9DB, 0xC9DB, 0x3BB0,
- 0xC9DC, 0xC9DD, 0x0ADE, 0xC9DE, 0xC9DF, 0x3BB1, 0xC9E0, 0xC9E0, 0x0AE0,
- 0xC9E1, 0xC9E1, 0x3BB3, 0xC9E2, 0xC9E2, 0x0AE1, 0xC9E3, 0xC9E3, 0x3BB4,
- 0xC9E4, 0xC9E4, 0x0AE2, 0xC9E5, 0xC9E6, 0x3BB5, 0xC9E7, 0xC9E7, 0x0AE3,
- 0xC9E8, 0xC9EB, 0x3BB7, 0xC9EC, 0xC9ED, 0x0AE4, 0xC9EE, 0xC9EE, 0x3BBB,
- 0xC9EF, 0xC9F1, 0x0AE6, 0xC9F2, 0xC9F7, 0x3BBC, 0xC9F8, 0xC9F9, 0x0AE9,
- 0xC9FA, 0xC9FB, 0x3BC2, 0xC9FC, 0xC9FC, 0x0AEB, 0xC9FD, 0xC9FF, 0x3BC4,
- 0xCA00, 0xCA00, 0x0AEC, 0xCA01, 0xCA07, 0x3BC7, 0xCA08, 0xCA09, 0x0AED,
- 0xCA0A, 0xCA0A, 0x3BCE, 0xCA0B, 0xCA0D, 0x0AEF, 0xCA0E, 0xCA13, 0x3BCF,
- 0xCA14, 0xCA14, 0x0AF2, 0xCA15, 0xCA17, 0x3BD5, 0xCA18, 0xCA18, 0x0AF3,
- 0xCA19, 0xCA28, 0x3BD8, 0xCA29, 0xCA29, 0x0AF4, 0xCA2A, 0xCA4B, 0x3BE8,
- 0xCA4C, 0xCA4D, 0x0AF5, 0xCA4E, 0xCA4F, 0x3C0A, 0xCA50, 0xCA50, 0x0AF7,
- 0xCA51, 0xCA53, 0x3C0C, 0xCA54, 0xCA54, 0x0AF8, 0xCA55, 0xCA5B, 0x3C0F,
- 0xCA5C, 0xCA5D, 0x0AF9, 0xCA5E, 0xCA5E, 0x3C16, 0xCA5F, 0xCA61, 0x0AFB,
- 0xCA62, 0xCA67, 0x3C17, 0xCA68, 0xCA68, 0x0AFE, 0xCA69, 0xCA7C, 0x3C1D,
- 0xCA7D, 0xCA7D, 0x0AFF, 0xCA7E, 0xCA83, 0x3C31, 0xCA84, 0xCA84, 0x0B00,
- 0xCA85, 0xCA97, 0x3C37, 0xCA98, 0xCA98, 0x0B01, 0xCA99, 0xCABB, 0x3C4A,
- 0xCABC, 0xCABD, 0x0B02, 0xCABE, 0xCABF, 0x3C6D, 0xCAC0, 0xCAC0, 0x0B04,
- 0xCAC1, 0xCAC3, 0x3C6F, 0xCAC4, 0xCAC4, 0x0B05, 0xCAC5, 0xCACB, 0x3C72,
- 0xCACC, 0xCACD, 0x0B06, 0xCACE, 0xCACE, 0x3C79, 0xCACF, 0xCACF, 0x0B08,
- 0xCAD0, 0xCAD0, 0x3C7A, 0xCAD1, 0xCAD1, 0x0B09, 0xCAD2, 0xCAD2, 0x3C7B,
- 0xCAD3, 0xCAD3, 0x0B0A, 0xCAD4, 0xCAD7, 0x3C7C, 0xCAD8, 0xCAD9, 0x0B0B,
- 0xCADA, 0xCADF, 0x3C80, 0xCAE0, 0xCAE0, 0x0B0D, 0xCAE1, 0xCAEB, 0x3C86,
- 0xCAEC, 0xCAEC, 0x0B0E, 0xCAED, 0xCAF3, 0x3C91, 0xCAF4, 0xCAF4, 0x0B0F,
- 0xCAF5, 0xCAFF, 0x3C98, 0xCB00, 0xCB07, 0x3CA3, 0xCB08, 0xCB08, 0x0B10,
- 0xCB09, 0xCB0F, 0x3CAB, 0xCB10, 0xCB10, 0x0B11, 0xCB11, 0xCB13, 0x3CB2,
- 0xCB14, 0xCB14, 0x0B12, 0xCB15, 0xCB17, 0x3CB5, 0xCB18, 0xCB18, 0x0B13,
- 0xCB19, 0xCB1F, 0x3CB8, 0xCB20, 0xCB21, 0x0B14, 0xCB22, 0xCB40, 0x3CBF,
- 0xCB41, 0xCB41, 0x0B16, 0xCB42, 0xCB47, 0x3CDE, 0xCB48, 0xCB49, 0x0B17,
- 0xCB4A, 0xCB4B, 0x3CE4, 0xCB4C, 0xCB4C, 0x0B19, 0xCB4D, 0xCB4F, 0x3CE6,
- 0xCB50, 0xCB50, 0x0B1A, 0xCB51, 0xCB57, 0x3CE9, 0xCB58, 0xCB59, 0x0B1B,
- 0xCB5A, 0xCB5C, 0x3CF0, 0xCB5D, 0xCB5D, 0x0B1D, 0xCB5E, 0xCB63, 0x3CF3,
- 0xCB64, 0xCB64, 0x0B1E, 0xCB65, 0xCB77, 0x3CF9, 0xCB78, 0xCB79, 0x0B1F,
- 0xCB7A, 0xCB9B, 0x3D0C, 0xCB9C, 0xCB9C, 0x0B21, 0xCB9D, 0xCBB7, 0x3D2E,
- 0xCBB8, 0xCBB8, 0x0B22, 0xCBB9, 0xCBD3, 0x3D49, 0xCBD4, 0xCBD4, 0x0B23,
- 0xCBD5, 0xCBE3, 0x3D64, 0xCBE4, 0xCBE4, 0x0B24, 0xCBE5, 0xCBE6, 0x3D73,
- 0xCBE7, 0xCBE7, 0x0B25, 0xCBE8, 0xCBE8, 0x3D75, 0xCBE9, 0xCBE9, 0x0B26,
- 0xCBEA, 0xCBFF, 0x3D76, 0xCC00, 0xCC0B, 0x3D8C, 0xCC0C, 0xCC0D, 0x0B27,
- 0xCC0E, 0xCC0F, 0x3D98, 0xCC10, 0xCC10, 0x0B29, 0xCC11, 0xCC13, 0x3D9A,
- 0xCC14, 0xCC14, 0x0B2A, 0xCC15, 0xCC1B, 0x3D9D, 0xCC1C, 0xCC1D, 0x0B2B,
- 0xCC1E, 0xCC20, 0x3DA4, 0xCC21, 0xCC22, 0x0B2D, 0xCC23, 0xCC26, 0x3DA7,
- 0xCC27, 0xCC29, 0x0B2F, 0xCC2A, 0xCC2B, 0x3DAB, 0xCC2C, 0xCC2C, 0x0B32,
- 0xCC2D, 0xCC2D, 0x3DAD, 0xCC2E, 0xCC2E, 0x0B33, 0xCC2F, 0xCC2F, 0x3DAE,
- 0xCC30, 0xCC30, 0x0B34, 0xCC31, 0xCC37, 0x3DAF, 0xCC38, 0xCC39, 0x0B35,
- 0xCC3A, 0xCC3A, 0x3DB6, 0xCC3B, 0xCC3E, 0x0B37, 0xCC3F, 0xCC43, 0x3DB7,
- 0xCC44, 0xCC45, 0x0B3B, 0xCC46, 0xCC47, 0x3DBC, 0xCC48, 0xCC48, 0x0B3D,
- 0xCC49, 0xCC4B, 0x3DBE, 0xCC4C, 0xCC4C, 0x0B3E, 0xCC4D, 0xCC53, 0x3DC1,
- 0xCC54, 0xCC55, 0x0B3F, 0xCC56, 0xCC56, 0x3DC8, 0xCC57, 0xCC59, 0x0B41,
- 0xCC5A, 0xCC5F, 0x3DC9, 0xCC60, 0xCC60, 0x0B44, 0xCC61, 0xCC63, 0x3DCF,
- 0xCC64, 0xCC64, 0x0B45, 0xCC65, 0xCC65, 0x3DD2, 0xCC66, 0xCC66, 0x0B46,
- 0xCC67, 0xCC67, 0x3DD3, 0xCC68, 0xCC68, 0x0B47, 0xCC69, 0xCC6F, 0x3DD4,
- 0xCC70, 0xCC70, 0x0B48, 0xCC71, 0xCC74, 0x3DDB, 0xCC75, 0xCC75, 0x0B49,
- 0xCC76, 0xCC97, 0x3DDF, 0xCC98, 0xCC99, 0x0B4A, 0xCC9A, 0xCC9B, 0x3E01,
- 0xCC9C, 0xCC9C, 0x0B4C, 0xCC9D, 0xCC9F, 0x3E03, 0xCCA0, 0xCCA0, 0x0B4D,
- 0xCCA1, 0xCCA7, 0x3E06, 0xCCA8, 0xCCA9, 0x0B4E, 0xCCAA, 0xCCAA, 0x3E0D,
- 0xCCAB, 0xCCAD, 0x0B50, 0xCCAE, 0xCCB3, 0x3E0E, 0xCCB4, 0xCCB5, 0x0B53,
- 0xCCB6, 0xCCB7, 0x3E14, 0xCCB8, 0xCCB8, 0x0B55, 0xCCB9, 0xCCBB, 0x3E16,
- 0xCCBC, 0xCCBC, 0x0B56, 0xCCBD, 0xCCC3, 0x3E19, 0xCCC4, 0xCCC5, 0x0B57,
- 0xCCC6, 0xCCC6, 0x3E20, 0xCCC7, 0xCCC7, 0x0B59, 0xCCC8, 0xCCC8, 0x3E21,
- 0xCCC9, 0xCCC9, 0x0B5A, 0xCCCA, 0xCCCF, 0x3E22, 0xCCD0, 0xCCD0, 0x0B5B,
- 0xCCD1, 0xCCD3, 0x3E28, 0xCCD4, 0xCCD4, 0x0B5C, 0xCCD5, 0xCCE3, 0x3E2B,
- 0xCCE4, 0xCCE4, 0x0B5D, 0xCCE5, 0xCCEB, 0x3E3A, 0xCCEC, 0xCCEC, 0x0B5E,
- 0xCCED, 0xCCEF, 0x3E41, 0xCCF0, 0xCCF0, 0x0B5F, 0xCCF1, 0xCCFF, 0x3E44,
- 0xCD00, 0xCD00, 0x3E53, 0xCD01, 0xCD01, 0x0B60, 0xCD02, 0xCD07, 0x3E54,
- 0xCD08, 0xCD09, 0x0B61, 0xCD0A, 0xCD0B, 0x3E5A, 0xCD0C, 0xCD0C, 0x0B63,
- 0xCD0D, 0xCD0F, 0x3E5C, 0xCD10, 0xCD10, 0x0B64, 0xCD11, 0xCD17, 0x3E5F,
- 0xCD18, 0xCD19, 0x0B65, 0xCD1A, 0xCD1A, 0x3E66, 0xCD1B, 0xCD1B, 0x0B67,
- 0xCD1C, 0xCD1C, 0x3E67, 0xCD1D, 0xCD1D, 0x0B68, 0xCD1E, 0xCD23, 0x3E68,
- 0xCD24, 0xCD24, 0x0B69, 0xCD25, 0xCD27, 0x3E6E, 0xCD28, 0xCD28, 0x0B6A,
- 0xCD29, 0xCD2B, 0x3E71, 0xCD2C, 0xCD2C, 0x0B6B, 0xCD2D, 0xCD38, 0x3E74,
- 0xCD39, 0xCD39, 0x0B6C, 0xCD3A, 0xCD5B, 0x3E80, 0xCD5C, 0xCD5C, 0x0B6D,
- 0xCD5D, 0xCD5F, 0x3EA2, 0xCD60, 0xCD60, 0x0B6E, 0xCD61, 0xCD63, 0x3EA5,
- 0xCD64, 0xCD64, 0x0B6F, 0xCD65, 0xCD6B, 0x3EA8, 0xCD6C, 0xCD6D, 0x0B70,
- 0xCD6E, 0xCD6E, 0x3EAF, 0xCD6F, 0xCD6F, 0x0B72, 0xCD70, 0xCD70, 0x3EB0,
- 0xCD71, 0xCD71, 0x0B73, 0xCD72, 0xCD77, 0x3EB1, 0xCD78, 0xCD78, 0x0B74,
- 0xCD79, 0xCD87, 0x3EB7, 0xCD88, 0xCD88, 0x0B75, 0xCD89, 0xCD93, 0x3EC6,
- 0xCD94, 0xCD95, 0x0B76, 0xCD96, 0xCD97, 0x3ED1, 0xCD98, 0xCD98, 0x0B78,
- 0xCD99, 0xCD9B, 0x3ED3, 0xCD9C, 0xCD9C, 0x0B79, 0xCD9D, 0xCDA3, 0x3ED6,
- 0xCDA4, 0xCDA5, 0x0B7A, 0xCDA6, 0xCDA6, 0x3EDD, 0xCDA7, 0xCDA7, 0x0B7C,
- 0xCDA8, 0xCDA8, 0x3EDE, 0xCDA9, 0xCDA9, 0x0B7D, 0xCDAA, 0xCDAF, 0x3EDF,
- 0xCDB0, 0xCDB0, 0x0B7E, 0xCDB1, 0xCDC3, 0x3EE5, 0xCDC4, 0xCDC4, 0x0B7F,
- 0xCDC5, 0xCDCB, 0x3EF8, 0xCDCC, 0xCDCC, 0x0B80, 0xCDCD, 0xCDCF, 0x3EFF,
- 0xCDD0, 0xCDD0, 0x0B81, 0xCDD1, 0xCDE7, 0x3F02, 0xCDE8, 0xCDE8, 0x0B82,
- 0xCDE9, 0xCDEB, 0x3F19, 0xCDEC, 0xCDEC, 0x0B83, 0xCDED, 0xCDEF, 0x3F1C,
- 0xCDF0, 0xCDF0, 0x0B84, 0xCDF1, 0xCDF7, 0x3F1F, 0xCDF8, 0xCDF9, 0x0B85,
- 0xCDFA, 0xCDFA, 0x3F26, 0xCDFB, 0xCDFB, 0x0B87, 0xCDFC, 0xCDFC, 0x3F27,
- 0xCDFD, 0xCDFD, 0x0B88, 0xCDFE, 0xCDFF, 0x3F28, 0xCE00, 0xCE03, 0x3F2A,
- 0xCE04, 0xCE04, 0x0B89, 0xCE05, 0xCE07, 0x3F2E, 0xCE08, 0xCE08, 0x0B8A,
- 0xCE09, 0xCE0B, 0x3F31, 0xCE0C, 0xCE0C, 0x0B8B, 0xCE0D, 0xCE13, 0x3F34,
- 0xCE14, 0xCE14, 0x0B8C, 0xCE15, 0xCE18, 0x3F3B, 0xCE19, 0xCE19, 0x0B8D,
- 0xCE1A, 0xCE1F, 0x3F3F, 0xCE20, 0xCE21, 0x0B8E, 0xCE22, 0xCE23, 0x3F45,
- 0xCE24, 0xCE24, 0x0B90, 0xCE25, 0xCE27, 0x3F47, 0xCE28, 0xCE28, 0x0B91,
- 0xCE29, 0xCE2F, 0x3F4A, 0xCE30, 0xCE31, 0x0B92, 0xCE32, 0xCE32, 0x3F51,
- 0xCE33, 0xCE33, 0x0B94, 0xCE34, 0xCE34, 0x3F52, 0xCE35, 0xCE35, 0x0B95,
- 0xCE36, 0xCE57, 0x3F53, 0xCE58, 0xCE59, 0x0B96, 0xCE5A, 0xCE5B, 0x3F75,
- 0xCE5C, 0xCE5C, 0x0B98, 0xCE5D, 0xCE5E, 0x3F77, 0xCE5F, 0xCE61, 0x0B99,
- 0xCE62, 0xCE67, 0x3F79, 0xCE68, 0xCE69, 0x0B9C, 0xCE6A, 0xCE6A, 0x3F7F,
- 0xCE6B, 0xCE6B, 0x0B9E, 0xCE6C, 0xCE6C, 0x3F80, 0xCE6D, 0xCE6D, 0x0B9F,
- 0xCE6E, 0xCE73, 0x3F81, 0xCE74, 0xCE75, 0x0BA0, 0xCE76, 0xCE77, 0x3F87,
- 0xCE78, 0xCE78, 0x0BA2, 0xCE79, 0xCE7B, 0x3F89, 0xCE7C, 0xCE7C, 0x0BA3,
- 0xCE7D, 0xCE83, 0x3F8C, 0xCE84, 0xCE85, 0x0BA4, 0xCE86, 0xCE86, 0x3F93,
- 0xCE87, 0xCE87, 0x0BA6, 0xCE88, 0xCE88, 0x3F94, 0xCE89, 0xCE89, 0x0BA7,
- 0xCE8A, 0xCE8F, 0x3F95, 0xCE90, 0xCE91, 0x0BA8, 0xCE92, 0xCE93, 0x3F9B,
- 0xCE94, 0xCE94, 0x0BAA, 0xCE95, 0xCE97, 0x3F9D, 0xCE98, 0xCE98, 0x0BAB,
- 0xCE99, 0xCE9F, 0x3FA0, 0xCEA0, 0xCEA1, 0x0BAC, 0xCEA2, 0xCEA2, 0x3FA7,
- 0xCEA3, 0xCEA5, 0x0BAE, 0xCEA6, 0xCEAB, 0x3FA8, 0xCEAC, 0xCEAD, 0x0BB1,
- 0xCEAE, 0xCEC0, 0x3FAE, 0xCEC1, 0xCEC1, 0x0BB3, 0xCEC2, 0xCEE3, 0x3FC1,
- 0xCEE4, 0xCEE5, 0x0BB4, 0xCEE6, 0xCEE7, 0x3FE3, 0xCEE8, 0xCEE8, 0x0BB6,
- 0xCEE9, 0xCEEA, 0x3FE5, 0xCEEB, 0xCEEC, 0x0BB7, 0xCEED, 0xCEF3, 0x3FE7,
- 0xCEF4, 0xCEF5, 0x0BB9, 0xCEF6, 0xCEF6, 0x3FEE, 0xCEF7, 0xCEF9, 0x0BBB,
- 0xCEFA, 0xCEFF, 0x3FEF, 0xCF00, 0xCF01, 0x0BBE, 0xCF02, 0xCF03, 0x3FF5,
- 0xCF04, 0xCF04, 0x0BC0, 0xCF05, 0xCF07, 0x3FF7, 0xCF08, 0xCF08, 0x0BC1,
- 0xCF09, 0xCF0F, 0x3FFA, 0xCF10, 0xCF11, 0x0BC2, 0xCF12, 0xCF12, 0x4001,
- 0xCF13, 0xCF13, 0x0BC4, 0xCF14, 0xCF14, 0x4002, 0xCF15, 0xCF15, 0x0BC5,
- 0xCF16, 0xCF1B, 0x4003, 0xCF1C, 0xCF1C, 0x0BC6, 0xCF1D, 0xCF1F, 0x4009,
- 0xCF20, 0xCF20, 0x0BC7, 0xCF21, 0xCF23, 0x400C, 0xCF24, 0xCF24, 0x0BC8,
- 0xCF25, 0xCF2B, 0x400F, 0xCF2C, 0xCF2D, 0x0BC9, 0xCF2E, 0xCF2E, 0x4016,
- 0xCF2F, 0xCF31, 0x0BCB, 0xCF32, 0xCF37, 0x4017, 0xCF38, 0xCF38, 0x0BCE,
- 0xCF39, 0xCF53, 0x401D, 0xCF54, 0xCF55, 0x0BCF, 0xCF56, 0xCF57, 0x4038,
- 0xCF58, 0xCF58, 0x0BD1, 0xCF59, 0xCF5B, 0x403A, 0xCF5C, 0xCF5C, 0x0BD2,
- 0xCF5D, 0xCF63, 0x403D, 0xCF64, 0xCF65, 0x0BD3, 0xCF66, 0xCF66, 0x4044,
- 0xCF67, 0xCF67, 0x0BD5, 0xCF68, 0xCF68, 0x4045, 0xCF69, 0xCF69, 0x0BD6,
- 0xCF6A, 0xCF6F, 0x4046, 0xCF70, 0xCF71, 0x0BD7, 0xCF72, 0xCF73, 0x404C,
- 0xCF74, 0xCF74, 0x0BD9, 0xCF75, 0xCF77, 0x404E, 0xCF78, 0xCF78, 0x0BDA,
- 0xCF79, 0xCF7F, 0x4051, 0xCF80, 0xCF80, 0x0BDB, 0xCF81, 0xCF84, 0x4058,
- 0xCF85, 0xCF85, 0x0BDC, 0xCF86, 0xCF8B, 0x405C, 0xCF8C, 0xCF8C, 0x0BDD,
- 0xCF8D, 0xCFA0, 0x4062, 0xCFA1, 0xCFA1, 0x0BDE, 0xCFA2, 0xCFA7, 0x4076,
- 0xCFA8, 0xCFA8, 0x0BDF, 0xCFA9, 0xCFAF, 0x407C, 0xCFB0, 0xCFB0, 0x0BE0,
- 0xCFB1, 0xCFC3, 0x4083, 0xCFC4, 0xCFC4, 0x0BE1, 0xCFC5, 0xCFDF, 0x4096,
- 0xCFE0, 0xCFE1, 0x0BE2, 0xCFE2, 0xCFE3, 0x40B1, 0xCFE4, 0xCFE4, 0x0BE4,
- 0xCFE5, 0xCFE7, 0x40B3, 0xCFE8, 0xCFE8, 0x0BE5, 0xCFE9, 0xCFEF, 0x40B6,
- 0xCFF0, 0xCFF1, 0x0BE6, 0xCFF2, 0xCFF2, 0x40BD, 0xCFF3, 0xCFF3, 0x0BE8,
- 0xCFF4, 0xCFF4, 0x40BE, 0xCFF5, 0xCFF5, 0x0BE9, 0xCFF6, 0xCFFB, 0x40BF,
- 0xCFFC, 0xCFFC, 0x0BEA, 0xCFFD, 0xCFFF, 0x40C5, 0xD000, 0xD000, 0x0BEB,
- 0xD001, 0xD003, 0x40C8, 0xD004, 0xD004, 0x0BEC, 0xD005, 0xD010, 0x40CB,
- 0xD011, 0xD011, 0x0BED, 0xD012, 0xD017, 0x40D7, 0xD018, 0xD018, 0x0BEE,
- 0xD019, 0xD02C, 0x40DD, 0xD02D, 0xD02D, 0x0BEF, 0xD02E, 0xD033, 0x40F1,
- 0xD034, 0xD035, 0x0BF0, 0xD036, 0xD037, 0x40F7, 0xD038, 0xD038, 0x0BF2,
- 0xD039, 0xD03B, 0x40F9, 0xD03C, 0xD03C, 0x0BF3, 0xD03D, 0xD043, 0x40FC,
- 0xD044, 0xD045, 0x0BF4, 0xD046, 0xD046, 0x4103, 0xD047, 0xD047, 0x0BF6,
- 0xD048, 0xD048, 0x4104, 0xD049, 0xD049, 0x0BF7, 0xD04A, 0xD04F, 0x4105,
- 0xD050, 0xD050, 0x0BF8, 0xD051, 0xD053, 0x410B, 0xD054, 0xD054, 0x0BF9,
- 0xD055, 0xD057, 0x410E, 0xD058, 0xD058, 0x0BFA, 0xD059, 0xD05F, 0x4111,
- 0xD060, 0xD060, 0x0BFB, 0xD061, 0xD06B, 0x4118, 0xD06C, 0xD06D, 0x0BFC,
- 0xD06E, 0xD06F, 0x4123, 0xD070, 0xD070, 0x0BFE, 0xD071, 0xD073, 0x4125,
- 0xD074, 0xD074, 0x0BFF, 0xD075, 0xD07B, 0x4128, 0xD07C, 0xD07D, 0x0C00,
- 0xD07E, 0xD080, 0x412F, 0xD081, 0xD081, 0x0C02, 0xD082, 0xD0A3, 0x4132,
- 0xD0A4, 0xD0A5, 0x0C03, 0xD0A6, 0xD0A7, 0x4154, 0xD0A8, 0xD0A8, 0x0C05,
- 0xD0A9, 0xD0AB, 0x4156, 0xD0AC, 0xD0AC, 0x0C06, 0xD0AD, 0xD0B3, 0x4159,
- 0xD0B4, 0xD0B5, 0x0C07, 0xD0B6, 0xD0B6, 0x4160, 0xD0B7, 0xD0B7, 0x0C09,
- 0xD0B8, 0xD0B8, 0x4161, 0xD0B9, 0xD0B9, 0x0C0A, 0xD0BA, 0xD0BF, 0x4162,
- 0xD0C0, 0xD0C1, 0x0C0B, 0xD0C2, 0xD0C3, 0x4168, 0xD0C4, 0xD0C4, 0x0C0D,
- 0xD0C5, 0xD0C7, 0x416A, 0xD0C8, 0xD0C9, 0x0C0E, 0xD0CA, 0xD0CF, 0x416D,
- 0xD0D0, 0xD0D1, 0x0C10, 0xD0D2, 0xD0D2, 0x4173, 0xD0D3, 0xD0D5, 0x0C12,
- 0xD0D6, 0xD0DB, 0x4174, 0xD0DC, 0xD0DD, 0x0C15, 0xD0DE, 0xD0DF, 0x417A,
- 0xD0E0, 0xD0E0, 0x0C17, 0xD0E1, 0xD0E3, 0x417C, 0xD0E4, 0xD0E4, 0x0C18,
- 0xD0E5, 0xD0EB, 0x417F, 0xD0EC, 0xD0ED, 0x0C19, 0xD0EE, 0xD0EE, 0x4186,
- 0xD0EF, 0xD0F1, 0x0C1B, 0xD0F2, 0xD0F7, 0x4187, 0xD0F8, 0xD0F8, 0x0C1E,
- 0xD0F9, 0xD0FF, 0x418D, 0xD100, 0xD10C, 0x4194, 0xD10D, 0xD10D, 0x0C1F,
- 0xD10E, 0xD12F, 0x41A1, 0xD130, 0xD131, 0x0C20, 0xD132, 0xD133, 0x41C3,
- 0xD134, 0xD134, 0x0C22, 0xD135, 0xD137, 0x41C5, 0xD138, 0xD138, 0x0C23,
- 0xD139, 0xD139, 0x41C8, 0xD13A, 0xD13A, 0x0C24, 0xD13B, 0xD13F, 0x41C9,
- 0xD140, 0xD141, 0x0C25, 0xD142, 0xD142, 0x41CE, 0xD143, 0xD145, 0x0C27,
- 0xD146, 0xD14B, 0x41CF, 0xD14C, 0xD14D, 0x0C2A, 0xD14E, 0xD14F, 0x41D5,
- 0xD150, 0xD150, 0x0C2C, 0xD151, 0xD153, 0x41D7, 0xD154, 0xD154, 0x0C2D,
- 0xD155, 0xD15B, 0x41DA, 0xD15C, 0xD15D, 0x0C2E, 0xD15E, 0xD15E, 0x41E1,
- 0xD15F, 0xD15F, 0x0C30, 0xD160, 0xD160, 0x41E2, 0xD161, 0xD161, 0x0C31,
- 0xD162, 0xD167, 0x41E3, 0xD168, 0xD168, 0x0C32, 0xD169, 0xD16B, 0x41E9,
- 0xD16C, 0xD16C, 0x0C33, 0xD16D, 0xD17B, 0x41EC, 0xD17C, 0xD17C, 0x0C34,
- 0xD17D, 0xD183, 0x41FB, 0xD184, 0xD184, 0x0C35, 0xD185, 0xD187, 0x4202,
- 0xD188, 0xD188, 0x0C36, 0xD189, 0xD19F, 0x4205, 0xD1A0, 0xD1A1, 0x0C37,
- 0xD1A2, 0xD1A3, 0x421C, 0xD1A4, 0xD1A4, 0x0C39, 0xD1A5, 0xD1A7, 0x421E,
- 0xD1A8, 0xD1A8, 0x0C3A, 0xD1A9, 0xD1AF, 0x4221, 0xD1B0, 0xD1B1, 0x0C3B,
- 0xD1B2, 0xD1B2, 0x4228, 0xD1B3, 0xD1B3, 0x0C3D, 0xD1B4, 0xD1B4, 0x4229,
- 0xD1B5, 0xD1B5, 0x0C3E, 0xD1B6, 0xD1B9, 0x422A, 0xD1BA, 0xD1BA, 0x0C3F,
- 0xD1BB, 0xD1BB, 0x422E, 0xD1BC, 0xD1BC, 0x0C40, 0xD1BD, 0xD1BF, 0x422F,
- 0xD1C0, 0xD1C0, 0x0C41, 0xD1C1, 0xD1D7, 0x4232, 0xD1D8, 0xD1D8, 0x0C42,
- 0xD1D9, 0xD1F3, 0x4249, 0xD1F4, 0xD1F4, 0x0C43, 0xD1F5, 0xD1F7, 0x4264,
- 0xD1F8, 0xD1F8, 0x0C44, 0xD1F9, 0xD1FF, 0x4267, 0xD200, 0xD206, 0x426E,
- 0xD207, 0xD207, 0x0C45, 0xD208, 0xD208, 0x4275, 0xD209, 0xD209, 0x0C46,
- 0xD20A, 0xD20F, 0x4276, 0xD210, 0xD210, 0x0C47, 0xD211, 0xD22B, 0x427C,
- 0xD22C, 0xD22D, 0x0C48, 0xD22E, 0xD22F, 0x4297, 0xD230, 0xD230, 0x0C4A,
- 0xD231, 0xD233, 0x4299, 0xD234, 0xD234, 0x0C4B, 0xD235, 0xD23B, 0x429C,
- 0xD23C, 0xD23D, 0x0C4C, 0xD23E, 0xD23E, 0x42A3, 0xD23F, 0xD23F, 0x0C4E,
- 0xD240, 0xD240, 0x42A4, 0xD241, 0xD241, 0x0C4F, 0xD242, 0xD247, 0x42A5,
- 0xD248, 0xD248, 0x0C50, 0xD249, 0xD25B, 0x42AB, 0xD25C, 0xD25C, 0x0C51,
- 0xD25D, 0xD263, 0x42BE, 0xD264, 0xD264, 0x0C52, 0xD265, 0xD27F, 0x42C5,
- 0xD280, 0xD281, 0x0C53, 0xD282, 0xD283, 0x42E0, 0xD284, 0xD284, 0x0C55,
- 0xD285, 0xD287, 0x42E2, 0xD288, 0xD288, 0x0C56, 0xD289, 0xD28F, 0x42E5,
- 0xD290, 0xD291, 0x0C57, 0xD292, 0xD294, 0x42EC, 0xD295, 0xD295, 0x0C59,
- 0xD296, 0xD29B, 0x42EF, 0xD29C, 0xD29C, 0x0C5A, 0xD29D, 0xD29F, 0x42F5,
- 0xD2A0, 0xD2A0, 0x0C5B, 0xD2A1, 0xD2A3, 0x42F8, 0xD2A4, 0xD2A4, 0x0C5C,
- 0xD2A5, 0xD2AB, 0x42FB, 0xD2AC, 0xD2AC, 0x0C5D, 0xD2AD, 0xD2B0, 0x4302,
- 0xD2B1, 0xD2B1, 0x0C5E, 0xD2B2, 0xD2B7, 0x4306, 0xD2B8, 0xD2B9, 0x0C5F,
- 0xD2BA, 0xD2BB, 0x430C, 0xD2BC, 0xD2BC, 0x0C61, 0xD2BD, 0xD2BE, 0x430E,
- 0xD2BF, 0xD2C0, 0x0C62, 0xD2C1, 0xD2C1, 0x4310, 0xD2C2, 0xD2C2, 0x0C64,
- 0xD2C3, 0xD2C7, 0x4311, 0xD2C8, 0xD2C9, 0x0C65, 0xD2CA, 0xD2CA, 0x4316,
- 0xD2CB, 0xD2CB, 0x0C67, 0xD2CC, 0xD2D3, 0x4317, 0xD2D4, 0xD2D4, 0x0C68,
- 0xD2D5, 0xD2D7, 0x431F, 0xD2D8, 0xD2D8, 0x0C69, 0xD2D9, 0xD2DB, 0x4322,
- 0xD2DC, 0xD2DC, 0x0C6A, 0xD2DD, 0xD2E3, 0x4325, 0xD2E4, 0xD2E5, 0x0C6B,
- 0xD2E6, 0xD2EF, 0x432C, 0xD2F0, 0xD2F1, 0x0C6D, 0xD2F2, 0xD2F3, 0x4336,
- 0xD2F4, 0xD2F4, 0x0C6F, 0xD2F5, 0xD2F7, 0x4338, 0xD2F8, 0xD2F8, 0x0C70,
- 0xD2F9, 0xD2FF, 0x433B, 0xD300, 0xD301, 0x0C71, 0xD302, 0xD302, 0x4342,
- 0xD303, 0xD303, 0x0C73, 0xD304, 0xD304, 0x4343, 0xD305, 0xD305, 0x0C74,
- 0xD306, 0xD30B, 0x4344, 0xD30C, 0xD30E, 0x0C75, 0xD30F, 0xD30F, 0x434A,
- 0xD310, 0xD310, 0x0C78, 0xD311, 0xD313, 0x434B, 0xD314, 0xD314, 0x0C79,
- 0xD315, 0xD315, 0x434E, 0xD316, 0xD316, 0x0C7A, 0xD317, 0xD31B, 0x434F,
- 0xD31C, 0xD31D, 0x0C7B, 0xD31E, 0xD31E, 0x4354, 0xD31F, 0xD321, 0x0C7D,
- 0xD322, 0xD324, 0x4355, 0xD325, 0xD325, 0x0C80, 0xD326, 0xD327, 0x4358,
- 0xD328, 0xD329, 0x0C81, 0xD32A, 0xD32B, 0x435A, 0xD32C, 0xD32C, 0x0C83,
- 0xD32D, 0xD32F, 0x435C, 0xD330, 0xD330, 0x0C84, 0xD331, 0xD337, 0x435F,
- 0xD338, 0xD339, 0x0C85, 0xD33A, 0xD33A, 0x4366, 0xD33B, 0xD33D, 0x0C87,
- 0xD33E, 0xD343, 0x4367, 0xD344, 0xD345, 0x0C8A, 0xD346, 0xD37B, 0x436D,
- 0xD37C, 0xD37D, 0x0C8C, 0xD37E, 0xD37F, 0x43A3, 0xD380, 0xD380, 0x0C8E,
- 0xD381, 0xD383, 0x43A5, 0xD384, 0xD384, 0x0C8F, 0xD385, 0xD38B, 0x43A8,
- 0xD38C, 0xD38D, 0x0C90, 0xD38E, 0xD38E, 0x43AF, 0xD38F, 0xD391, 0x0C92,
- 0xD392, 0xD397, 0x43B0, 0xD398, 0xD399, 0x0C95, 0xD39A, 0xD39B, 0x43B6,
- 0xD39C, 0xD39C, 0x0C97, 0xD39D, 0xD39F, 0x43B8, 0xD3A0, 0xD3A0, 0x0C98,
- 0xD3A1, 0xD3A7, 0x43BB, 0xD3A8, 0xD3A9, 0x0C99, 0xD3AA, 0xD3AA, 0x43C2,
- 0xD3AB, 0xD3AB, 0x0C9B, 0xD3AC, 0xD3AC, 0x43C3, 0xD3AD, 0xD3AD, 0x0C9C,
- 0xD3AE, 0xD3B3, 0x43C4, 0xD3B4, 0xD3B4, 0x0C9D, 0xD3B5, 0xD3B7, 0x43CA,
- 0xD3B8, 0xD3B8, 0x0C9E, 0xD3B9, 0xD3BB, 0x43CD, 0xD3BC, 0xD3BC, 0x0C9F,
- 0xD3BD, 0xD3C3, 0x43D0, 0xD3C4, 0xD3C5, 0x0CA0, 0xD3C6, 0xD3C7, 0x43D7,
- 0xD3C8, 0xD3C9, 0x0CA2, 0xD3CA, 0xD3CF, 0x43D9, 0xD3D0, 0xD3D0, 0x0CA4,
- 0xD3D1, 0xD3D7, 0x43DF, 0xD3D8, 0xD3D8, 0x0CA5, 0xD3D9, 0xD3E0, 0x43E6,
- 0xD3E1, 0xD3E1, 0x0CA6, 0xD3E2, 0xD3E2, 0x43EE, 0xD3E3, 0xD3E3, 0x0CA7,
- 0xD3E4, 0xD3EB, 0x43EF, 0xD3EC, 0xD3ED, 0x0CA8, 0xD3EE, 0xD3EF, 0x43F7,
- 0xD3F0, 0xD3F0, 0x0CAA, 0xD3F1, 0xD3F3, 0x43F9, 0xD3F4, 0xD3F4, 0x0CAB,
- 0xD3F5, 0xD3FB, 0x43FC, 0xD3FC, 0xD3FD, 0x0CAC, 0xD3FE, 0xD3FE, 0x4403,
- 0xD3FF, 0xD3FF, 0x0CAE, 0xD400, 0xD400, 0x4404, 0xD401, 0xD401, 0x0CAF,
- 0xD402, 0xD407, 0x4405, 0xD408, 0xD408, 0x0CB0, 0xD409, 0xD41C, 0x440B,
- 0xD41D, 0xD41D, 0x0CB1, 0xD41E, 0xD43F, 0x441F, 0xD440, 0xD440, 0x0CB2,
- 0xD441, 0xD443, 0x4441, 0xD444, 0xD444, 0x0CB3, 0xD445, 0xD45B, 0x4444,
- 0xD45C, 0xD45C, 0x0CB4, 0xD45D, 0xD45F, 0x445B, 0xD460, 0xD460, 0x0CB5,
- 0xD461, 0xD463, 0x445E, 0xD464, 0xD464, 0x0CB6, 0xD465, 0xD46C, 0x4461,
- 0xD46D, 0xD46D, 0x0CB7, 0xD46E, 0xD46E, 0x4469, 0xD46F, 0xD46F, 0x0CB8,
- 0xD470, 0xD477, 0x446A, 0xD478, 0xD479, 0x0CB9, 0xD47A, 0xD47B, 0x4472,
- 0xD47C, 0xD47C, 0x0CBB, 0xD47D, 0xD47E, 0x4474, 0xD47F, 0xD480, 0x0CBC,
- 0xD481, 0xD481, 0x4476, 0xD482, 0xD482, 0x0CBE, 0xD483, 0xD487, 0x4477,
- 0xD488, 0xD489, 0x0CBF, 0xD48A, 0xD48A, 0x447C, 0xD48B, 0xD48B, 0x0CC1,
- 0xD48C, 0xD48C, 0x447D, 0xD48D, 0xD48D, 0x0CC2, 0xD48E, 0xD493, 0x447E,
- 0xD494, 0xD494, 0x0CC3, 0xD495, 0xD4A8, 0x4484, 0xD4A9, 0xD4A9, 0x0CC4,
- 0xD4AA, 0xD4CB, 0x4498, 0xD4CC, 0xD4CC, 0x0CC5, 0xD4CD, 0xD4CF, 0x44BA,
- 0xD4D0, 0xD4D0, 0x0CC6, 0xD4D1, 0xD4D3, 0x44BD, 0xD4D4, 0xD4D4, 0x0CC7,
- 0xD4D5, 0xD4DB, 0x44C0, 0xD4DC, 0xD4DC, 0x0CC8, 0xD4DD, 0xD4DE, 0x44C7,
- 0xD4DF, 0xD4DF, 0x0CC9, 0xD4E0, 0xD4E7, 0x44C9, 0xD4E8, 0xD4E8, 0x0CCA,
- 0xD4E9, 0xD4EB, 0x44D1, 0xD4EC, 0xD4EC, 0x0CCB, 0xD4ED, 0xD4EF, 0x44D4,
- 0xD4F0, 0xD4F0, 0x0CCC, 0xD4F1, 0xD4F7, 0x44D7, 0xD4F8, 0xD4F8, 0x0CCD,
- 0xD4F9, 0xD4FA, 0x44DE, 0xD4FB, 0xD4FB, 0x0CCE, 0xD4FC, 0xD4FC, 0x44E0,
- 0xD4FD, 0xD4FD, 0x0CCF, 0xD4FE, 0xD4FF, 0x44E1, 0xD500, 0xD503, 0x44E3,
- 0xD504, 0xD504, 0x0CD0, 0xD505, 0xD507, 0x44E7, 0xD508, 0xD508, 0x0CD1,
- 0xD509, 0xD50B, 0x44EA, 0xD50C, 0xD50C, 0x0CD2, 0xD50D, 0xD513, 0x44ED,
- 0xD514, 0xD515, 0x0CD3, 0xD516, 0xD516, 0x44F4, 0xD517, 0xD517, 0x0CD5,
- 0xD518, 0xD53B, 0x44F5, 0xD53C, 0xD53D, 0x0CD6, 0xD53E, 0xD53F, 0x4519,
- 0xD540, 0xD540, 0x0CD8, 0xD541, 0xD543, 0x451B, 0xD544, 0xD544, 0x0CD9,
- 0xD545, 0xD54B, 0x451E, 0xD54C, 0xD54D, 0x0CDA, 0xD54E, 0xD54E, 0x4525,
- 0xD54F, 0xD54F, 0x0CDC, 0xD550, 0xD550, 0x4526, 0xD551, 0xD551, 0x0CDD,
- 0xD552, 0xD557, 0x4527, 0xD558, 0xD559, 0x0CDE, 0xD55A, 0xD55B, 0x452D,
- 0xD55C, 0xD55C, 0x0CE0, 0xD55D, 0xD55F, 0x452F, 0xD560, 0xD560, 0x0CE1,
- 0xD561, 0xD564, 0x4532, 0xD565, 0xD565, 0x0CE2, 0xD566, 0xD567, 0x4536,
- 0xD568, 0xD569, 0x0CE3, 0xD56A, 0xD56A, 0x4538, 0xD56B, 0xD56B, 0x0CE5,
- 0xD56C, 0xD56C, 0x4539, 0xD56D, 0xD56D, 0x0CE6, 0xD56E, 0xD573, 0x453A,
- 0xD574, 0xD575, 0x0CE7, 0xD576, 0xD577, 0x4540, 0xD578, 0xD578, 0x0CE9,
- 0xD579, 0xD57B, 0x4542, 0xD57C, 0xD57C, 0x0CEA, 0xD57D, 0xD583, 0x4545,
- 0xD584, 0xD585, 0x0CEB, 0xD586, 0xD586, 0x454C, 0xD587, 0xD589, 0x0CED,
- 0xD58A, 0xD58F, 0x454D, 0xD590, 0xD590, 0x0CF0, 0xD591, 0xD5A4, 0x4553,
- 0xD5A5, 0xD5A5, 0x0CF1, 0xD5A6, 0xD5C7, 0x4567, 0xD5C8, 0xD5C9, 0x0CF2,
- 0xD5CA, 0xD5CB, 0x4589, 0xD5CC, 0xD5CC, 0x0CF4, 0xD5CD, 0xD5CF, 0x458B,
- 0xD5D0, 0xD5D0, 0x0CF5, 0xD5D1, 0xD5D1, 0x458E, 0xD5D2, 0xD5D2, 0x0CF6,
- 0xD5D3, 0xD5D7, 0x458F, 0xD5D8, 0xD5D9, 0x0CF7, 0xD5DA, 0xD5DA, 0x4594,
- 0xD5DB, 0xD5DB, 0x0CF9, 0xD5DC, 0xD5DC, 0x4595, 0xD5DD, 0xD5DD, 0x0CFA,
- 0xD5DE, 0xD5E3, 0x4596, 0xD5E4, 0xD5E5, 0x0CFB, 0xD5E6, 0xD5E7, 0x459C,
- 0xD5E8, 0xD5E8, 0x0CFD, 0xD5E9, 0xD5EB, 0x459E, 0xD5EC, 0xD5EC, 0x0CFE,
- 0xD5ED, 0xD5F3, 0x45A1, 0xD5F4, 0xD5F5, 0x0CFF, 0xD5F6, 0xD5F6, 0x45A8,
- 0xD5F7, 0xD5F7, 0x0D01, 0xD5F8, 0xD5F8, 0x45A9, 0xD5F9, 0xD5F9, 0x0D02,
- 0xD5FA, 0xD5FF, 0x45AA, 0xD600, 0xD601, 0x0D03, 0xD602, 0xD603, 0x45B0,
- 0xD604, 0xD604, 0x0D05, 0xD605, 0xD607, 0x45B2, 0xD608, 0xD608, 0x0D06,
- 0xD609, 0xD60F, 0x45B5, 0xD610, 0xD611, 0x0D07, 0xD612, 0xD612, 0x45BC,
- 0xD613, 0xD615, 0x0D09, 0xD616, 0xD61B, 0x45BD, 0xD61C, 0xD61C, 0x0D0C,
- 0xD61D, 0xD61F, 0x45C3, 0xD620, 0xD620, 0x0D0D, 0xD621, 0xD623, 0x45C6,
- 0xD624, 0xD624, 0x0D0E, 0xD625, 0xD62C, 0x45C9, 0xD62D, 0xD62D, 0x0D0F,
- 0xD62E, 0xD637, 0x45D1, 0xD638, 0xD639, 0x0D10, 0xD63A, 0xD63B, 0x45DB,
- 0xD63C, 0xD63C, 0x0D12, 0xD63D, 0xD63F, 0x45DD, 0xD640, 0xD640, 0x0D13,
- 0xD641, 0xD644, 0x45E0, 0xD645, 0xD645, 0x0D14, 0xD646, 0xD647, 0x45E4,
- 0xD648, 0xD649, 0x0D15, 0xD64A, 0xD64A, 0x45E6, 0xD64B, 0xD64B, 0x0D17,
- 0xD64C, 0xD64C, 0x45E7, 0xD64D, 0xD64D, 0x0D18, 0xD64E, 0xD650, 0x45E8,
- 0xD651, 0xD651, 0x0D19, 0xD652, 0xD653, 0x45EB, 0xD654, 0xD655, 0x0D1A,
- 0xD656, 0xD657, 0x45ED, 0xD658, 0xD658, 0x0D1C, 0xD659, 0xD65B, 0x45EF,
- 0xD65C, 0xD65C, 0x0D1D, 0xD65D, 0xD666, 0x45F2, 0xD667, 0xD667, 0x0D1E,
- 0xD668, 0xD668, 0x45FC, 0xD669, 0xD669, 0x0D1F, 0xD66A, 0xD66F, 0x45FD,
- 0xD670, 0xD671, 0x0D20, 0xD672, 0xD673, 0x4603, 0xD674, 0xD674, 0x0D22,
- 0xD675, 0xD682, 0x4605, 0xD683, 0xD683, 0x0D23, 0xD684, 0xD684, 0x4613,
- 0xD685, 0xD685, 0x0D24, 0xD686, 0xD68B, 0x4614, 0xD68C, 0xD68D, 0x0D25,
- 0xD68E, 0xD68F, 0x461A, 0xD690, 0xD690, 0x0D27, 0xD691, 0xD693, 0x461C,
- 0xD694, 0xD694, 0x0D28, 0xD695, 0xD69C, 0x461F, 0xD69D, 0xD69D, 0x0D29,
- 0xD69E, 0xD69E, 0x4627, 0xD69F, 0xD69F, 0x0D2A, 0xD6A0, 0xD6A0, 0x4628,
- 0xD6A1, 0xD6A1, 0x0D2B, 0xD6A2, 0xD6A7, 0x4629, 0xD6A8, 0xD6A8, 0x0D2C,
- 0xD6A9, 0xD6AB, 0x462F, 0xD6AC, 0xD6AC, 0x0D2D, 0xD6AD, 0xD6AF, 0x4632,
- 0xD6B0, 0xD6B0, 0x0D2E, 0xD6B1, 0xD6B8, 0x4635, 0xD6B9, 0xD6B9, 0x0D2F,
- 0xD6BA, 0xD6BA, 0x463D, 0xD6BB, 0xD6BB, 0x0D30, 0xD6BC, 0xD6C3, 0x463E,
- 0xD6C4, 0xD6C5, 0x0D31, 0xD6C6, 0xD6C7, 0x4646, 0xD6C8, 0xD6C8, 0x0D33,
- 0xD6C9, 0xD6CB, 0x4648, 0xD6CC, 0xD6CC, 0x0D34, 0xD6CD, 0xD6D0, 0x464B,
- 0xD6D1, 0xD6D1, 0x0D35, 0xD6D2, 0xD6D3, 0x464F, 0xD6D4, 0xD6D4, 0x0D36,
- 0xD6D5, 0xD6D6, 0x4651, 0xD6D7, 0xD6D7, 0x0D37, 0xD6D8, 0xD6D8, 0x4653,
- 0xD6D9, 0xD6D9, 0x0D38, 0xD6DA, 0xD6DF, 0x4654, 0xD6E0, 0xD6E0, 0x0D39,
- 0xD6E1, 0xD6E3, 0x465A, 0xD6E4, 0xD6E4, 0x0D3A, 0xD6E5, 0xD6E7, 0x465D,
- 0xD6E8, 0xD6E8, 0x0D3B, 0xD6E9, 0xD6EF, 0x4660, 0xD6F0, 0xD6F0, 0x0D3C,
- 0xD6F1, 0xD6F4, 0x4667, 0xD6F5, 0xD6F5, 0x0D3D, 0xD6F6, 0xD6FB, 0x466B,
- 0xD6FC, 0xD6FD, 0x0D3E, 0xD6FE, 0xD6FF, 0x4671, 0xD700, 0xD700, 0x0D40,
- 0xD701, 0xD703, 0x4673, 0xD704, 0xD704, 0x0D41, 0xD705, 0xD710, 0x4676,
- 0xD711, 0xD711, 0x0D42, 0xD712, 0xD717, 0x4682, 0xD718, 0xD719, 0x0D43,
- 0xD71A, 0xD71B, 0x4688, 0xD71C, 0xD71C, 0x0D45, 0xD71D, 0xD71F, 0x468A,
- 0xD720, 0xD720, 0x0D46, 0xD721, 0xD727, 0x468D, 0xD728, 0xD729, 0x0D47,
- 0xD72A, 0xD72A, 0x4694, 0xD72B, 0xD72B, 0x0D49, 0xD72C, 0xD72C, 0x4695,
- 0xD72D, 0xD72D, 0x0D4A, 0xD72E, 0xD733, 0x4696, 0xD734, 0xD735, 0x0D4B,
- 0xD736, 0xD737, 0x469C, 0xD738, 0xD738, 0x0D4D, 0xD739, 0xD73B, 0x469E,
- 0xD73C, 0xD73C, 0x0D4E, 0xD73D, 0xD743, 0x46A1, 0xD744, 0xD744, 0x0D4F,
- 0xD745, 0xD746, 0x46A8, 0xD747, 0xD747, 0x0D50, 0xD748, 0xD748, 0x46AA,
- 0xD749, 0xD749, 0x0D51, 0xD74A, 0xD74F, 0x46AB, 0xD750, 0xD751, 0x0D52,
- 0xD752, 0xD753, 0x46B1, 0xD754, 0xD754, 0x0D54, 0xD755, 0xD755, 0x46B3,
- 0xD756, 0xD759, 0x0D55, 0xD75A, 0xD75F, 0x46B4, 0xD760, 0xD761, 0x0D59,
- 0xD762, 0xD762, 0x46BA, 0xD763, 0xD763, 0x0D5B, 0xD764, 0xD764, 0x46BB,
- 0xD765, 0xD765, 0x0D5C, 0xD766, 0xD768, 0x46BC, 0xD769, 0xD769, 0x0D5D,
- 0xD76A, 0xD76B, 0x46BF, 0xD76C, 0xD76C, 0x0D5E, 0xD76D, 0xD76F, 0x46C1,
- 0xD770, 0xD770, 0x0D5F, 0xD771, 0xD773, 0x46C4, 0xD774, 0xD774, 0x0D60,
- 0xD775, 0xD77B, 0x46C7, 0xD77C, 0xD77D, 0x0D61, 0xD77E, 0xD780, 0x46CE,
- 0xD781, 0xD781, 0x0D63, 0xD782, 0xD787, 0x46D1, 0xD788, 0xD789, 0x0D64,
- 0xD78A, 0xD78B, 0x46D7, 0xD78C, 0xD78C, 0x0D66, 0xD78D, 0xD78F, 0x46D9,
- 0xD790, 0xD790, 0x0D67, 0xD791, 0xD797, 0x46DC, 0xD798, 0xD799, 0x0D68,
- 0xD79A, 0xD79A, 0x46E3, 0xD79B, 0xD79B, 0x0D6A, 0xD79C, 0xD79C, 0x46E4,
- 0xD79D, 0xD79D, 0x0D6B, 0xD79E, 0xD7A3, 0x46E5, 0xF900, 0xF900, 0x1014,
- 0xF901, 0xF901, 0x0E5E, 0xF902, 0xF902, 0x1B8D, 0xF903, 0xF903, 0x0D84,
- 0xF904, 0xF904, 0x1EDC, 0xF905, 0xF905, 0x0EDA, 0xF906, 0xF906, 0x0F3E,
- 0xF907, 0xF907, 0x0F6A, 0xF908, 0xF908, 0x0F6A, 0xF909, 0xF909, 0x0E7C,
- 0xF90A, 0xF90A, 0x1023, 0xF90B, 0xF90B, 0x1116, 0xF90C, 0xF90C, 0x103C,
- 0xF90D, 0xF913, 0x1117, 0xF914, 0xF914, 0x16A8, 0xF915, 0xF917, 0x111E,
- 0xF918, 0xF91D, 0x1122, 0xF91E, 0xF920, 0x112A, 0xF921, 0xF921, 0x112F,
- 0xF922, 0xF922, 0x1133, 0xF923, 0xF924, 0x1136, 0xF925, 0xF92B, 0x1139,
- 0xF92C, 0xF92D, 0x1143, 0xF92E, 0xF92E, 0x1148, 0xF92F, 0xF92F, 0x119F,
- 0xF930, 0xF931, 0x11A1, 0xF932, 0xF937, 0x11A5, 0xF938, 0xF93A, 0x11AC,
- 0xF93B, 0xF940, 0x11B0, 0xF941, 0xF943, 0x11B7, 0xF944, 0xF945, 0x11BD,
- 0xF946, 0xF948, 0x11C1, 0xF949, 0xF949, 0x11C6, 0xF94A, 0xF94A, 0x11D4,
- 0xF94B, 0xF94E, 0x11D6, 0xF94F, 0xF950, 0x11DB, 0xF951, 0xF951, 0x11E0,
- 0xF952, 0xF955, 0x11FC, 0xF956, 0xF959, 0x1201, 0xF95A, 0xF95A, 0x10DE,
- 0xF95B, 0xF95B, 0x1028, 0xF95C, 0xF95C, 0x16A8, 0xF95D, 0xF95D, 0x102B,
- 0xF95E, 0xF95E, 0x1060, 0xF95F, 0xF95F, 0x1047, 0xF960, 0xF960, 0x104C,
- 0xF961, 0xF961, 0x15B0, 0xF962, 0xF962, 0x1918, 0xF963, 0xF963, 0x141F,
- 0xF964, 0xF964, 0x133A, 0xF965, 0xF965, 0x1D5E, 0xF966, 0xF966, 0x13D7,
- 0xF967, 0xF967, 0x13F5, 0xF968, 0xF968, 0x1DB7, 0xF969, 0xF969, 0x15D0,
- 0xF96A, 0xF96A, 0x14F7, 0xF96B, 0xF96B, 0x1BAB, 0xF96C, 0xF96C, 0x14F2,
- 0xF96D, 0xF96D, 0x156D, 0xF96E, 0xF96E, 0x1771, 0xF96F, 0xF96F, 0x1554,
- 0xF970, 0xF970, 0x14C5, 0xF971, 0xF971, 0x1B61, 0xF972, 0xF972, 0x1CCA,
- 0xF973, 0xF973, 0x162E, 0xF974, 0xF974, 0x16F2, 0xF975, 0xF977, 0x1149,
- 0xF978, 0xF97A, 0x114D, 0xF97B, 0xF97D, 0x1153, 0xF97E, 0xF97E, 0x1157,
- 0xF97F, 0xF980, 0x115A, 0xF981, 0xF981, 0x103F, 0xF982, 0xF982, 0x115C,
- 0xF983, 0xF983, 0x115F, 0xF984, 0xF985, 0x1161, 0xF986, 0xF986, 0x1165,
- 0xF987, 0xF98C, 0x1167, 0xF98D, 0xF98D, 0x116F, 0xF98E, 0xF98E, 0x1040,
- 0xF98F, 0xF990, 0x1171, 0xF991, 0xF991, 0x1041, 0xF992, 0xF994, 0x1174,
- 0xF995, 0xF995, 0x1042, 0xF996, 0xF997, 0x1177, 0xF998, 0xF998, 0x117A,
- 0xF999, 0xF999, 0x1179, 0xF99A, 0xF99B, 0x117B, 0xF99C, 0xF99D, 0x117E,
- 0xF99E, 0xF99E, 0x192F, 0xF99F, 0xF9A0, 0x1181, 0xF9A1, 0xF9A1, 0x1554,
- 0xF9A2, 0xF9A2, 0x1183, 0xF9A3, 0xF9A3, 0x1043, 0xF9A4, 0xF9A4, 0x1046,
- 0xF9A5, 0xF9A5, 0x1185, 0xF9A6, 0xF9A8, 0x1187, 0xF9A9, 0xF9A9, 0x118B,
- 0xF9AA, 0xF9AA, 0x1047, 0xF9AB, 0xF9AD, 0x118D, 0xF9AE, 0xF9AE, 0x1E67,
- 0xF9AF, 0xF9AF, 0x1191, 0xF9B0, 0xF9B0, 0x1193, 0xF9B1, 0xF9B4, 0x1195,
- 0xF9B5, 0xF9B5, 0x119A, 0xF9B6, 0xF9B8, 0x119C, 0xF9B9, 0xF9B9, 0x16A5,
- 0xF9BA, 0xF9BC, 0x11C7, 0xF9BD, 0xF9BD, 0x1054, 0xF9BE, 0xF9BE, 0x11CB,
- 0xF9BF, 0xF9BF, 0x16A8, 0xF9C0, 0xF9C1, 0x11CC, 0xF9C2, 0xF9C3, 0x11D0,
- 0xF9C4, 0xF9C4, 0x11D3, 0xF9C5, 0xF9C5, 0x1F34, 0xF9C6, 0xF9C6, 0x17EB,
- 0xF9C7, 0xF9C7, 0x11E1, 0xF9C8, 0xF9C8, 0x1057, 0xF9C9, 0xF9C9, 0x11E3,
- 0xF9CA, 0xF9CB, 0x11E5, 0xF9CC, 0xF9CC, 0x11E8, 0xF9CD, 0xF9CD, 0x11EA,
- 0xF9CE, 0xF9CE, 0x11EC, 0xF9CF, 0xF9CF, 0x1058, 0xF9D0, 0xF9D3, 0x11EE,
- 0xF9D4, 0xF9D6, 0x11F3, 0xF9D7, 0xF9DA, 0x11F7, 0xF9DB, 0xF9DB, 0x15B0,
- 0xF9DC, 0xF9DC, 0x11FB, 0xF9DD, 0xF9DD, 0x1206, 0xF9DE, 0xF9DE, 0x1208,
- 0xF9DF, 0xF9DF, 0x120A, 0xF9E0, 0xF9E0, 0x173E, 0xF9E1, 0xF9E2, 0x120C,
- 0xF9E3, 0xF9E3, 0x105B, 0xF9E4, 0xF9E4, 0x1211, 0xF9E5, 0xF9E5, 0x1213,
- 0xF9E6, 0xF9E6, 0x1215, 0xF9E7, 0xF9E9, 0x1218, 0xF9EA, 0xF9EA, 0x121C,
- 0xF9EB, 0xF9EC, 0x105C, 0xF9ED, 0xF9ED, 0x121E, 0xF9EE, 0xF9F0, 0x1220,
- 0xF9F1, 0xF9F5, 0x1224, 0xF9F6, 0xF9F6, 0x122A, 0xF9F7, 0xF9F9, 0x122D,
- 0xF9FA, 0xF9FA, 0x14E7, 0xF9FB, 0xF9FB, 0x195E, 0xF9FC, 0xF9FC, 0x1663,
- 0xF9FD, 0xF9FD, 0x168B, 0xF9FE, 0xF9FE, 0x105F, 0xF9FF, 0xF9FF, 0x1954,
- 0xFA00, 0xFA00, 0x1A1C, 0xFA01, 0xFA01, 0x10B7, 0xFA02, 0xFA02, 0x1BE3,
- 0xFA03, 0xFA03, 0x1097, 0xFA04, 0xFA04, 0x10AA, 0xFA05, 0xFA05, 0x10F4,
- 0xFA06, 0xFA06, 0x1D94, 0xFA07, 0xFA07, 0x13E0, 0xFA08, 0xFA08, 0x1E1D,
- 0xFA09, 0xFA09, 0x0DE6, 0xFA0A, 0xFA0A, 0x0E3C, 0xFA0B, 0xFA0B, 0x0EE7,
- 0xFF01, 0xFF3B, 0x0108, 0xFF3C, 0xFF3C, 0x0070, 0xFF3D, 0xFF5D, 0x0144,
- 0xFF5E, 0xFF5E, 0x0071, 0xFFE0, 0xFFE1, 0x008F, 0xFFE2, 0xFFE2, 0x00C2,
- 0xFFE3, 0xFFE3, 0x0165, 0xFFE5, 0xFFE5, 0x0091, 0xFFE6, 0xFFE6, 0x0143,
-};
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_UniKS_UCS2_H_1[8394 * 3] = {
+ 0x0020, 0x007E, 0x0001, 0x00A1, 0x00A1, 0x00D0, 0x00A4, 0x00A4, 0x00D6,
+ 0x00A7, 0x00A7, 0x009B, 0x00A8, 0x00A8, 0x006B, 0x00AA, 0x00AA, 0x029C,
+ 0x00AB, 0x00AB, 0x00B0, 0x00B0, 0x00B0, 0x008A, 0x00B1, 0x00B1, 0x0082,
+ 0x00B2, 0x00B3, 0x034B, 0x00B4, 0x00B4, 0x00C7, 0x00B6, 0x00B6, 0x00F4,
+ 0x00B8, 0x00B8, 0x00CE, 0x00B9, 0x00B9, 0x034A, 0x00BA, 0x00BA, 0x02A3,
+ 0x00BB, 0x00BB, 0x00B1, 0x00BC, 0x00BC, 0x02EF, 0x00BD, 0x00BD, 0x02EC,
+ 0x00BE, 0x00BE, 0x02F0, 0x00BF, 0x00BF, 0x00D1, 0x00C6, 0x00C6, 0x029A,
+ 0x00D0, 0x00D0, 0x029B, 0x00D7, 0x00D7, 0x0083, 0x00D8, 0x00D8, 0x02A1,
+ 0x00DE, 0x00DE, 0x02A4, 0x00DF, 0x00DF, 0x0300, 0x00E6, 0x00E6, 0x02F5,
+ 0x00F0, 0x00F0, 0x02F7, 0x00F7, 0x00F7, 0x0084, 0x00F8, 0x00F8, 0x02FE,
+ 0x00FE, 0x00FE, 0x0301, 0x0111, 0x0111, 0x02F6, 0x0126, 0x0126, 0x029D,
+ 0x0127, 0x0127, 0x02F8, 0x0131, 0x0131, 0x02F9, 0x0132, 0x0132, 0x029E,
+ 0x0133, 0x0133, 0x02FA, 0x0138, 0x0138, 0x02FB, 0x013F, 0x013F, 0x029F,
+ 0x0140, 0x0140, 0x02FC, 0x0141, 0x0141, 0x02A0, 0x0142, 0x0142, 0x02FD,
+ 0x0149, 0x0149, 0x0304, 0x014A, 0x014A, 0x02A6, 0x014B, 0x014B, 0x0303,
+ 0x0152, 0x0152, 0x02A2, 0x0153, 0x0153, 0x02FF, 0x0166, 0x0166, 0x02A5,
+ 0x0167, 0x0167, 0x0302, 0x02BC, 0x02BC, 0x2053, 0x02C7, 0x02C7, 0x00C9,
+ 0x02D8, 0x02D8, 0x00CA, 0x02D9, 0x02D9, 0x00CD, 0x02DA, 0x02DA, 0x00CC,
+ 0x02DB, 0x02DB, 0x00CF, 0x02DC, 0x02DC, 0x00C8, 0x02DD, 0x02DD, 0x00CB,
+ 0x0391, 0x03A1, 0x01D7, 0x03A3, 0x03A9, 0x01E8, 0x03B1, 0x03C1, 0x01EF,
+ 0x03C3, 0x03C9, 0x0200, 0x0401, 0x0401, 0x0402, 0x0410, 0x0415, 0x03FC,
+ 0x0416, 0x0435, 0x0403, 0x0436, 0x044F, 0x0424, 0x0451, 0x0451, 0x0423,
+ 0x2013, 0x2014, 0x006D, 0x2016, 0x2016, 0x006F, 0x2018, 0x2019, 0x0072,
+ 0x201B, 0x201B, 0x202E, 0x201C, 0x201D, 0x0074, 0x201F, 0x201F, 0x202D,
+ 0x2020, 0x2021, 0x00F5, 0x2022, 0x2022, 0x219F, 0x2025, 0x2026, 0x0069,
+ 0x2030, 0x2030, 0x00D8, 0x2032, 0x2033, 0x008B, 0x2034, 0x2034, 0x2186,
+ 0x2035, 0x2035, 0x246E, 0x2036, 0x2036, 0x246C, 0x2039, 0x203A, 0x21A4,
+ 0x203B, 0x203B, 0x009C, 0x203C, 0x203C, 0x223B, 0x2042, 0x2042, 0x2197,
+ 0x2074, 0x2074, 0x034D, 0x207A, 0x207B, 0x202F, 0x207C, 0x207C, 0x2038,
+ 0x207D, 0x207E, 0x203A, 0x207F, 0x207F, 0x034E, 0x2081, 0x2084, 0x034F,
+ 0x2103, 0x2103, 0x008D, 0x2109, 0x2109, 0x00D7, 0x2113, 0x2113, 0x024E,
+ 0x2116, 0x2116, 0x0102, 0x2121, 0x2121, 0x0107, 0x2122, 0x2122, 0x0104,
+ 0x2126, 0x2126, 0x0283, 0x212B, 0x212B, 0x008E, 0x2153, 0x2154, 0x02ED,
+ 0x215B, 0x215E, 0x02F1, 0x2160, 0x2169, 0x01CD, 0x2170, 0x2179, 0x01C3,
+ 0x2190, 0x2191, 0x00AB, 0x2192, 0x2192, 0x00AA, 0x2193, 0x2194, 0x00AD,
+ 0x2195, 0x2195, 0x00F7, 0x2196, 0x2196, 0x00FA, 0x2197, 0x2197, 0x00F8,
+ 0x2198, 0x2198, 0x00FB, 0x2199, 0x2199, 0x00F9, 0x21B0, 0x21B0, 0x22A4,
+ 0x21B1, 0x21B1, 0x22A1, 0x21B2, 0x21B2, 0x22A0, 0x21B3, 0x21B3, 0x22A5,
+ 0x21B4, 0x21B4, 0x22A3, 0x21BC, 0x21BC, 0x22B4, 0x21C0, 0x21C0, 0x22B5,
+ 0x21C4, 0x21C5, 0x22C0, 0x21CD, 0x21CD, 0x2270, 0x21CF, 0x21CF, 0x226F,
+ 0x21D0, 0x21D0, 0x226E, 0x21D1, 0x21D1, 0x2296, 0x21D2, 0x21D2, 0x00C3,
+ 0x21D3, 0x21D3, 0x2297, 0x21D4, 0x21D4, 0x00C4, 0x21E0, 0x21E0, 0x23E6,
+ 0x21E1, 0x21E1, 0x23E8, 0x21E2, 0x21E2, 0x23E7, 0x21E3, 0x21E3, 0x23E9,
+ 0x21E6, 0x21E6, 0x23EE, 0x21E7, 0x21E7, 0x23F0, 0x21E8, 0x21E8, 0x23EF,
+ 0x21E9, 0x21E9, 0x23F1, 0x2200, 0x2200, 0x00C5, 0x2202, 0x2202, 0x0097,
+ 0x2203, 0x2203, 0x00C6, 0x2206, 0x2206, 0x220B, 0x2207, 0x2207, 0x0098,
+ 0x2208, 0x2208, 0x00B8, 0x2209, 0x2209, 0x222D, 0x220B, 0x220B, 0x00B9,
+ 0x220C, 0x220C, 0x222E, 0x220F, 0x220F, 0x00D5, 0x2211, 0x2211, 0x00D4,
+ 0x2213, 0x2213, 0x2216, 0x221A, 0x221A, 0x00B2, 0x221D, 0x221D, 0x00B4,
+ 0x221E, 0x221E, 0x0088, 0x221F, 0x221F, 0x220D, 0x2220, 0x2220, 0x0094,
+ 0x2222, 0x2222, 0x2222, 0x2225, 0x2226, 0x220F, 0x2227, 0x2228, 0x00C0,
+ 0x2229, 0x2229, 0x00BF, 0x222A, 0x222A, 0x00BE, 0x222B, 0x222C, 0x00B6,
+ 0x222E, 0x222E, 0x00D3, 0x2234, 0x2234, 0x0089, 0x2235, 0x2235, 0x00B5,
+ 0x2236, 0x2236, 0x00D2, 0x2237, 0x2237, 0x2081, 0x223D, 0x223D, 0x00B3,
+ 0x2243, 0x2243, 0x2134, 0x2245, 0x2245, 0x2133, 0x2248, 0x2248, 0x2135,
+ 0x2250, 0x2250, 0x2223, 0x2251, 0x2251, 0x2213, 0x2252, 0x2252, 0x009A,
+ 0x2253, 0x2253, 0x2212, 0x225A, 0x225A, 0x2231, 0x2260, 0x2260, 0x0085,
+ 0x2261, 0x2261, 0x0099, 0x2262, 0x2262, 0x221E, 0x2264, 0x2265, 0x0086,
+ 0x2266, 0x2267, 0x2214, 0x226E, 0x226F, 0x2229, 0x2270, 0x2273, 0x2121,
+ 0x2276, 0x2277, 0x2129, 0x2279, 0x2279, 0x212B, 0x227A, 0x227B, 0x211B,
+ 0x2280, 0x2281, 0x211F, 0x2282, 0x2283, 0x00BC, 0x2284, 0x2284, 0x222C,
+ 0x2285, 0x2285, 0x222B, 0x2286, 0x2287, 0x00BA, 0x228A, 0x228A, 0x2126,
+ 0x228B, 0x228B, 0x2128, 0x2295, 0x2297, 0x2217, 0x22A3, 0x22A3, 0x2226,
+ 0x22A4, 0x22A4, 0x2137, 0x22A5, 0x22A5, 0x0095, 0x22BB, 0x22BC, 0x222F,
+ 0x22CE, 0x22CF, 0x211D, 0x22DA, 0x22DB, 0x212C, 0x22EE, 0x22EE, 0x2080,
+ 0x22EF, 0x22EF, 0x006A, 0x2306, 0x2306, 0x2232, 0x2312, 0x2312, 0x0096,
+ 0x2314, 0x2314, 0x221B, 0x2460, 0x246E, 0x02DD, 0x246F, 0x2473, 0x2257,
+ 0x2474, 0x2482, 0x033B, 0x2483, 0x2487, 0x2352, 0x249C, 0x24B5, 0x0321,
+ 0x24B6, 0x24CF, 0x20C4, 0x24D0, 0x24E9, 0x02C3, 0x2500, 0x2500, 0x0207,
+ 0x2501, 0x2501, 0x0212, 0x2502, 0x2502, 0x0208, 0x2503, 0x2503, 0x0213,
+ 0x250C, 0x250C, 0x0209, 0x250D, 0x250D, 0x022E, 0x250E, 0x250E, 0x022D,
+ 0x250F, 0x250F, 0x0214, 0x2510, 0x2510, 0x020A, 0x2511, 0x2511, 0x0228,
+ 0x2512, 0x2512, 0x0227, 0x2513, 0x2513, 0x0215, 0x2514, 0x2514, 0x020C,
+ 0x2515, 0x2515, 0x022C, 0x2516, 0x2516, 0x022B, 0x2517, 0x2517, 0x0217,
+ 0x2518, 0x2518, 0x020B, 0x2519, 0x2519, 0x022A, 0x251A, 0x251A, 0x0229,
+ 0x251B, 0x251B, 0x0216, 0x251C, 0x251C, 0x020D, 0x251D, 0x251D, 0x0222,
+ 0x251E, 0x251F, 0x022F, 0x2520, 0x2520, 0x021D, 0x2521, 0x2522, 0x0231,
+ 0x2523, 0x2523, 0x0218, 0x2524, 0x2524, 0x020F, 0x2525, 0x2525, 0x0224,
+ 0x2526, 0x2527, 0x0233, 0x2528, 0x2528, 0x021F, 0x2529, 0x252A, 0x0235,
+ 0x252B, 0x252B, 0x021A, 0x252C, 0x252C, 0x020E, 0x252D, 0x252E, 0x0237,
+ 0x252F, 0x252F, 0x021E, 0x2530, 0x2530, 0x0223, 0x2531, 0x2532, 0x0239,
+ 0x2533, 0x2533, 0x0219, 0x2534, 0x2534, 0x0210, 0x2535, 0x2536, 0x023B,
+ 0x2537, 0x2537, 0x0220, 0x2538, 0x2538, 0x0225, 0x2539, 0x253A, 0x023D,
+ 0x253B, 0x253B, 0x021B, 0x253C, 0x253C, 0x0211, 0x253D, 0x253E, 0x023F,
+ 0x253F, 0x253F, 0x0221, 0x2540, 0x2541, 0x0241, 0x2542, 0x2542, 0x0226,
+ 0x2543, 0x254A, 0x0243, 0x254B, 0x254B, 0x021C, 0x2592, 0x2592, 0x00E8,
+ 0x25A0, 0x25A0, 0x00A5, 0x25A1, 0x25A1, 0x00A4, 0x25A3, 0x25A3, 0x00E5,
+ 0x25A4, 0x25A5, 0x00E9, 0x25A6, 0x25A6, 0x00ED, 0x25A7, 0x25A7, 0x00EC,
+ 0x25A8, 0x25A8, 0x00EB, 0x25A9, 0x25A9, 0x00EE, 0x25B1, 0x25B1, 0x2220,
+ 0x25B2, 0x25B2, 0x00A7, 0x25B3, 0x25B3, 0x00A6, 0x25B5, 0x25B5, 0x224C,
+ 0x25B6, 0x25B6, 0x00DC, 0x25B7, 0x25B7, 0x00DB, 0x25B9, 0x25B9, 0x224D,
+ 0x25BC, 0x25BC, 0x00A9, 0x25BD, 0x25BD, 0x00A8, 0x25BF, 0x25BF, 0x224B,
+ 0x25C0, 0x25C0, 0x00DA, 0x25C1, 0x25C1, 0x00D9, 0x25C3, 0x25C3, 0x224E,
+ 0x25C6, 0x25C6, 0x00A3, 0x25C7, 0x25C7, 0x00A2, 0x25C8, 0x25C8, 0x00E4,
+ 0x25C9, 0x25C9, 0x00E3, 0x25CA, 0x25CA, 0x2253, 0x25CB, 0x25CB, 0x009F,
+ 0x25CC, 0x25CC, 0x21BF, 0x25CE, 0x25CE, 0x00A1, 0x25CF, 0x25CF, 0x00A0,
+ 0x25D0, 0x25D1, 0x00E6, 0x25E6, 0x25E6, 0x2247, 0x25EF, 0x25EF, 0x21B9,
+ 0x2605, 0x2605, 0x009E, 0x2606, 0x2606, 0x009D, 0x260E, 0x260E, 0x00F1,
+ 0x260F, 0x260F, 0x00F0, 0x261C, 0x261C, 0x00F2, 0x261D, 0x261D, 0x2406,
+ 0x261E, 0x261E, 0x00F3, 0x261F, 0x261F, 0x2407, 0x262F, 0x262F, 0x21D8,
+ 0x2640, 0x2640, 0x0093, 0x2642, 0x2642, 0x0092, 0x2660, 0x2661, 0x00DE,
+ 0x2663, 0x2663, 0x00E2, 0x2664, 0x2664, 0x00DD, 0x2665, 0x2665, 0x00E0,
+ 0x2667, 0x2667, 0x00E1, 0x2668, 0x2668, 0x00EF, 0x2669, 0x266A, 0x00FD,
+ 0x266C, 0x266C, 0x00FF, 0x266D, 0x266D, 0x00FC, 0x266F, 0x266F, 0x2192,
+ 0x2716, 0x2716, 0x21B7, 0x271A, 0x271A, 0x21B6, 0x273D, 0x273D, 0x219C,
+ 0x2756, 0x2756, 0x21BD, 0x2776, 0x277F, 0x21E1, 0x278A, 0x2793, 0x2096,
+ 0x3000, 0x3002, 0x0065, 0x3003, 0x3003, 0x006C, 0x3008, 0x3011, 0x0078,
+ 0x3012, 0x3012, 0x21FC, 0x3013, 0x3013, 0x00AF, 0x3014, 0x3015, 0x0076,
+ 0x3016, 0x3019, 0x201B, 0x301E, 0x301F, 0x246A, 0x3020, 0x3020, 0x21DF,
+ 0x3036, 0x3036, 0x21FD, 0x3041, 0x3093, 0x0353, 0x30A1, 0x30F6, 0x03A6,
+ 0x30FB, 0x30FB, 0x0068, 0x30FC, 0x30FC, 0x2472, 0x3131, 0x3163, 0x0166,
+ 0x3164, 0x3164, 0x0065, 0x3165, 0x318E, 0x0199, 0x3200, 0x321B, 0x0305,
+ 0x321C, 0x321C, 0x0101, 0x3231, 0x3231, 0x2254, 0x3239, 0x3239, 0x2255,
+ 0x3260, 0x327B, 0x02A7, 0x327F, 0x327F, 0x0100, 0x328A, 0x328F, 0x2455,
+ 0x3290, 0x3290, 0x2454, 0x3294, 0x3294, 0x2378, 0x329E, 0x329E, 0x2239,
+ 0x32A5, 0x32A5, 0x2388, 0x3380, 0x3384, 0x0273, 0x3388, 0x3389, 0x0264,
+ 0x338A, 0x338C, 0x0286, 0x338D, 0x338F, 0x0260, 0x3390, 0x3394, 0x027E,
+ 0x3395, 0x3397, 0x024B, 0x3398, 0x3398, 0x024F, 0x3399, 0x33A2, 0x0255,
+ 0x33A3, 0x33A6, 0x0251, 0x33A7, 0x33A8, 0x0267, 0x33A9, 0x33AC, 0x028F,
+ 0x33AD, 0x33AF, 0x028B, 0x33B0, 0x33B9, 0x0269, 0x33BA, 0x33BF, 0x0278,
+ 0x33C0, 0x33C1, 0x0284, 0x33C2, 0x33C2, 0x0105, 0x33C3, 0x33C3, 0x0296,
+ 0x33C4, 0x33C4, 0x0250, 0x33C5, 0x33C5, 0x028A, 0x33C6, 0x33C6, 0x0299,
+ 0x33C7, 0x33C7, 0x0103, 0x33C8, 0x33C8, 0x0266, 0x33C9, 0x33C9, 0x0297,
+ 0x33CA, 0x33CA, 0x025F, 0x33CB, 0x33CB, 0x2256, 0x33CF, 0x33CF, 0x0263,
+ 0x33D0, 0x33D0, 0x0294, 0x33D3, 0x33D3, 0x0295, 0x33D6, 0x33D6, 0x0289,
+ 0x33D8, 0x33D8, 0x0106, 0x33DB, 0x33DB, 0x028E, 0x33DC, 0x33DC, 0x0298,
+ 0x33DD, 0x33DD, 0x0293, 0x4E00, 0x4E00, 0x193C, 0x4E01, 0x4E01, 0x1A30,
+ 0x4E03, 0x4E03, 0x1CC4, 0x4E07, 0x4E07, 0x123E, 0x4E08, 0x4E08, 0x1986,
+ 0x4E09, 0x4E09, 0x14C8, 0x4E0A, 0x4E0A, 0x14D3, 0x4E0B, 0x4E0B, 0x1DC0,
+ 0x4E0D, 0x4E0D, 0x13F5, 0x4E11, 0x4E11, 0x1C78, 0x4E14, 0x4E14, 0x1B81,
+ 0x4E15, 0x4E15, 0x143D, 0x4E16, 0x4E16, 0x1574, 0x4E18, 0x4E18, 0x0F35,
+ 0x4E19, 0x4E19, 0x13B1, 0x4E1E, 0x4E1E, 0x1632, 0x4E2D, 0x4E2D, 0x1B0A,
+ 0x4E32, 0x4E32, 0x0EDA, 0x4E38, 0x4E38, 0x1ECA, 0x4E39, 0x4E39, 0x1060,
+ 0x4E3B, 0x4E3B, 0x1ACC, 0x4E42, 0x4E42, 0x178D, 0x4E43, 0x4E43, 0x103A,
+ 0x4E45, 0x4E45, 0x0F36, 0x4E4B, 0x4E4B, 0x1B1E, 0x4E4D, 0x4E4D, 0x1479,
+ 0x4E4E, 0x4E4E, 0x1E78, 0x4E4F, 0x4E4F, 0x1DBE, 0x4E56, 0x4E56, 0x0F0F,
+ 0x4E58, 0x4E58, 0x1633, 0x4E59, 0x4E59, 0x18EC, 0x4E5D, 0x4E5D, 0x0F37,
+ 0x4E5E, 0x4E5E, 0x0E1D, 0x4E5F, 0x4E5F, 0x16E6, 0x4E6B, 0x4E6B, 0x0DAC,
+ 0x4E6D, 0x4E6D, 0x10E9, 0x4E73, 0x4E73, 0x18A5, 0x4E76, 0x4E76, 0x13E4,
+ 0x4E77, 0x4E77, 0x14C3, 0x4E7E, 0x4E7E, 0x0E11, 0x4E82, 0x4E82, 0x1125,
+ 0x4E86, 0x4E86, 0x11C7, 0x4E88, 0x4E88, 0x172E, 0x4E8B, 0x4E8B, 0x147A,
+ 0x4E8C, 0x4E8C, 0x190D, 0x4E8E, 0x4E8E, 0x1835, 0x4E90, 0x4E90, 0x186C,
+ 0x4E91, 0x4E91, 0x185E, 0x4E92, 0x4E92, 0x1E79, 0x4E94, 0x4E94, 0x17A1,
+ 0x4E95, 0x4E95, 0x1A31, 0x4E98, 0x4E98, 0x0FDA, 0x4E9B, 0x4E9B, 0x147B,
+ 0x4E9E, 0x4E9E, 0x168F, 0x4EA1, 0x4EA1, 0x1258, 0x4EA2, 0x4EA2, 0x1DF6,
+ 0x4EA4, 0x4EA4, 0x0F1C, 0x4EA5, 0x4EA5, 0x1E05, 0x4EA6, 0x4EA6, 0x173B,
+ 0x4EA8, 0x4EA8, 0x1E5B, 0x4EAB, 0x4EAB, 0x1E1E, 0x4EAC, 0x4EAC, 0x0E4C,
+ 0x4EAD, 0x4EAD, 0x1A32, 0x4EAE, 0x4EAE, 0x114B, 0x4EB6, 0x4EB6, 0x1061,
+ 0x4EBA, 0x4EBA, 0x192B, 0x4EC0, 0x4EC0, 0x168B, 0x4EC1, 0x4EC1, 0x192C,
+ 0x4EC4, 0x4EC4, 0x1CA3, 0x4EC7, 0x4EC7, 0x0F38, 0x4ECA, 0x4ECA, 0x0FC6,
+ 0x4ECB, 0x4ECB, 0x0DE8, 0x4ECD, 0x4ECD, 0x194F, 0x4ED4, 0x4ED4, 0x1953,
+ 0x4ED5, 0x4ED5, 0x147C, 0x4ED6, 0x4ED6, 0x1CD4, 0x4ED7, 0x4ED7, 0x1987,
+ 0x4ED8, 0x4ED8, 0x13F6, 0x4ED9, 0x4ED9, 0x152A, 0x4EDD, 0x4EDD, 0x10EB,
+ 0x4EDF, 0x4EDF, 0x1BEC, 0x4EE3, 0x4EE3, 0x109A, 0x4EE4, 0x4EE4, 0x1189,
+ 0x4EE5, 0x4EE5, 0x190E, 0x4EF0, 0x4EF0, 0x16C9, 0x4EF2, 0x4EF2, 0x1B0B,
+ 0x4EF6, 0x4EF6, 0x0E12, 0x4EF7, 0x4EF7, 0x0DE9, 0x4EFB, 0x4EFB, 0x1945,
+ 0x4F01, 0x4F01, 0x0FDE, 0x4F09, 0x4F09, 0x1DF7, 0x4F0A, 0x4F0A, 0x190F,
+ 0x4F0B, 0x4F0B, 0x0FD3, 0x4F0D, 0x4F0D, 0x17A2, 0x4F0E, 0x4F0E, 0x0FDF,
+ 0x4F0F, 0x4F0F, 0x13D2, 0x4F10, 0x4F10, 0x138D, 0x4F11, 0x4F11, 0x1F45,
+ 0x4F2F, 0x4F2F, 0x137C, 0x4F34, 0x4F34, 0x1329, 0x4F36, 0x4F36, 0x118A,
+ 0x4F38, 0x4F38, 0x1667, 0x4F3A, 0x4F3A, 0x147D, 0x4F3C, 0x4F3C, 0x147E,
+ 0x4F3D, 0x4F3D, 0x0D6C, 0x4F43, 0x4F43, 0x19F3, 0x4F46, 0x4F46, 0x1062,
+ 0x4F47, 0x4F47, 0x19BF, 0x4F48, 0x4F48, 0x1D78, 0x4F4D, 0x4F4D, 0x188C,
+ 0x4F4E, 0x4F4E, 0x19C0, 0x4F4F, 0x4F4F, 0x1ACD, 0x4F50, 0x4F50, 0x1AC6,
+ 0x4F51, 0x4F51, 0x1836, 0x4F55, 0x4F55, 0x1DC1, 0x4F59, 0x4F59, 0x172F,
+ 0x4F5A, 0x4F5A, 0x193D, 0x4F5B, 0x4F5B, 0x1433, 0x4F5C, 0x4F5C, 0x196D,
+ 0x4F69, 0x4F69, 0x1D4E, 0x4F6F, 0x4F6F, 0x16F7, 0x4F70, 0x4F70, 0x137D,
+ 0x4F73, 0x4F73, 0x0D6D, 0x4F76, 0x4F76, 0x101F, 0x4F7A, 0x4F7A, 0x19F4,
+ 0x4F7E, 0x4F7E, 0x193E, 0x4F7F, 0x4F7F, 0x147F, 0x4F81, 0x4F81, 0x1668,
+ 0x4F83, 0x4F83, 0x0D94, 0x4F84, 0x4F84, 0x1B67, 0x4F86, 0x4F86, 0x1144,
+ 0x4F88, 0x4F88, 0x1CA8, 0x4F8A, 0x4F8A, 0x0EFF, 0x4F8B, 0x4F8B, 0x119A,
+ 0x4F8D, 0x4F8D, 0x163C, 0x4F8F, 0x4F8F, 0x1ACE, 0x4F91, 0x4F91, 0x18A6,
+ 0x4F96, 0x4F96, 0x11F2, 0x4F98, 0x4F98, 0x1B82, 0x4F9B, 0x4F9B, 0x0ECA,
+ 0x4F9D, 0x4F9D, 0x18FA, 0x4FAE, 0x4FAE, 0x129C, 0x4FAF, 0x4FAF, 0x1F1E,
+ 0x4FB5, 0x4FB5, 0x1CC7, 0x4FB6, 0x4FB6, 0x1158, 0x4FBF, 0x4FBF, 0x1D5E,
+ 0x4FC2, 0x4FC2, 0x0E79, 0x4FC3, 0x4FC3, 0x1C49, 0x4FC4, 0x4FC4, 0x1690,
+ 0x4FC9, 0x4FC9, 0x17A3, 0x4FCA, 0x4FCA, 0x1AF6, 0x4FCE, 0x4FCE, 0x1A7E,
+ 0x4FD1, 0x4FD1, 0x181E, 0x4FD3, 0x4FD3, 0x0E4D, 0x4FD4, 0x4FD4, 0x1E36,
+ 0x4FD7, 0x4FD7, 0x15A1, 0x4FDA, 0x4FDA, 0x1205, 0x4FDD, 0x4FDD, 0x13C2,
+ 0x4FDF, 0x4FDF, 0x1480, 0x4FE0, 0x4FE0, 0x1E4F, 0x4FE1, 0x4FE1, 0x1669,
+ 0x4FEE, 0x4FEE, 0x15BF, 0x4FEF, 0x4FEF, 0x13F7, 0x4FF1, 0x4FF1, 0x0F39,
+ 0x4FF3, 0x4FF3, 0x136A, 0x4FF5, 0x4FF5, 0x1D98, 0x4FF8, 0x4FF8, 0x13E5,
+ 0x4FFA, 0x4FFA, 0x1725, 0x5002, 0x5002, 0x13B2, 0x5006, 0x5006, 0x114C,
+ 0x5009, 0x5009, 0x1BB4, 0x500B, 0x500B, 0x0DEA, 0x500D, 0x500D, 0x1369,
+ 0x5011, 0x5011, 0x12E4, 0x5012, 0x5012, 0x10AD, 0x5016, 0x5016, 0x1E19,
+ 0x5019, 0x5019, 0x1F1F, 0x501A, 0x501A, 0x18FB, 0x501C, 0x501C, 0x1BDE,
+ 0x501E, 0x501E, 0x0E4E, 0x501F, 0x501F, 0x1B83, 0x5021, 0x5021, 0x1BB5,
+ 0x5023, 0x5023, 0x134D, 0x5024, 0x5024, 0x1CA9, 0x5026, 0x5026, 0x0F81,
+ 0x5027, 0x5027, 0x1AB5, 0x5028, 0x5028, 0x0E01, 0x502A, 0x502A, 0x178E,
+ 0x502B, 0x502B, 0x11F3, 0x502C, 0x502C, 0x1CE2, 0x502D, 0x502D, 0x17F3,
+ 0x503B, 0x503B, 0x16E7, 0x5043, 0x5043, 0x171D, 0x5047, 0x5047, 0x0D6E,
+ 0x5048, 0x5048, 0x0E2B, 0x5049, 0x5049, 0x188D, 0x504F, 0x504F, 0x1D5F,
+ 0x5055, 0x5055, 0x1E06, 0x505A, 0x505A, 0x1ACF, 0x505C, 0x505C, 0x1A33,
+ 0x5065, 0x5065, 0x0E13, 0x5074, 0x5074, 0x1CA2, 0x5075, 0x5075, 0x1A34,
+ 0x5076, 0x5076, 0x1837, 0x5078, 0x5078, 0x1D29, 0x5080, 0x5080, 0x0F10,
+ 0x5085, 0x5085, 0x13F8, 0x508D, 0x508D, 0x134E, 0x5091, 0x5091, 0x0E1E,
+ 0x5098, 0x5098, 0x14B7, 0x5099, 0x5099, 0x143E, 0x50AC, 0x50AC, 0x1C5E,
+ 0x50AD, 0x50AD, 0x181F, 0x50B2, 0x50B2, 0x17A4, 0x50B3, 0x50B3, 0x19F5,
+ 0x50B5, 0x50B5, 0x1BCA, 0x50B7, 0x50B7, 0x14D4, 0x50BE, 0x50BE, 0x0E4F,
+ 0x50C5, 0x50C5, 0x0FB7, 0x50C9, 0x50C9, 0x1C09, 0x50CA, 0x50CA, 0x152B,
+ 0x50CF, 0x50CF, 0x14D5, 0x50D1, 0x50D1, 0x0F1D, 0x50D5, 0x50D5, 0x13D3,
+ 0x50D6, 0x50D6, 0x1F63, 0x50DA, 0x50DA, 0x11C8, 0x50DE, 0x50DE, 0x188E,
+ 0x50E5, 0x50E5, 0x17FC, 0x50E7, 0x50E7, 0x1634, 0x50ED, 0x50ED, 0x1BAA,
+ 0x50F9, 0x50F9, 0x0D6F, 0x50FB, 0x50FB, 0x139C, 0x50FF, 0x50FF, 0x1481,
+ 0x5100, 0x5100, 0x18FC, 0x5101, 0x5101, 0x1AF7, 0x5104, 0x5104, 0x1718,
+ 0x5106, 0x5106, 0x0E50, 0x5109, 0x5109, 0x0E21, 0x5112, 0x5112, 0x18A7,
+ 0x511F, 0x511F, 0x14D6, 0x5121, 0x5121, 0x11BF, 0x512A, 0x512A, 0x1838,
+ 0x5132, 0x5132, 0x19C1, 0x5137, 0x5137, 0x1159, 0x513A, 0x513A, 0x1025,
+ 0x513C, 0x513C, 0x1726, 0x5140, 0x5140, 0x17C9, 0x5141, 0x5141, 0x18D7,
+ 0x5143, 0x5143, 0x186F, 0x5144, 0x5144, 0x1E5C, 0x5145, 0x5145, 0x1C8A,
+ 0x5146, 0x5146, 0x1A7F, 0x5147, 0x5147, 0x1F4D, 0x5148, 0x5148, 0x152C,
+ 0x5149, 0x5149, 0x0F00, 0x514B, 0x514B, 0x0FB0, 0x514C, 0x514C, 0x1D07,
+ 0x514D, 0x514D, 0x127F, 0x514E, 0x514E, 0x1D19, 0x5152, 0x5152, 0x1691,
+ 0x515C, 0x515C, 0x10FC, 0x5162, 0x5162, 0x0FDB, 0x5165, 0x5165, 0x194D,
+ 0x5167, 0x5167, 0x103B, 0x5168, 0x5168, 0x19F6, 0x5169, 0x5169, 0x114D,
+ 0x516A, 0x516A, 0x18A8, 0x516B, 0x516B, 0x1D4B, 0x516C, 0x516C, 0x0ECB,
+ 0x516D, 0x516D, 0x11EF, 0x516E, 0x516E, 0x1E6F, 0x5171, 0x5171, 0x0ECC,
+ 0x5175, 0x5175, 0x13B3, 0x5176, 0x5176, 0x0FE0, 0x5177, 0x5177, 0x0F3A,
+ 0x5178, 0x5178, 0x19F7, 0x517C, 0x517C, 0x0E46, 0x5180, 0x5180, 0x0FE1,
+ 0x5186, 0x5186, 0x172D, 0x518A, 0x518A, 0x1BD6, 0x518D, 0x518D, 0x19AA,
+ 0x5192, 0x5192, 0x129D, 0x5195, 0x5195, 0x1280, 0x5197, 0x5197, 0x1820,
+ 0x51A0, 0x51A0, 0x0EEB, 0x51A5, 0x51A5, 0x128C, 0x51AA, 0x51AA, 0x127D,
+ 0x51AC, 0x51AC, 0x10EC, 0x51B6, 0x51B6, 0x16E8, 0x51B7, 0x51B7, 0x1148,
+ 0x51BD, 0x51BD, 0x117D, 0x51C4, 0x51C4, 0x1BDA, 0x51C6, 0x51C6, 0x1AF8,
+ 0x51C9, 0x51C9, 0x114E, 0x51CB, 0x51CB, 0x1A80, 0x51CC, 0x51CC, 0x11FF,
+ 0x51CD, 0x51CD, 0x10ED, 0x51DC, 0x51DC, 0x11FE, 0x51DD, 0x51DD, 0x18F6,
+ 0x51DE, 0x51DE, 0x1F64, 0x51E1, 0x51E1, 0x1391, 0x51F0, 0x51F0, 0x1EE0,
+ 0x51F1, 0x51F1, 0x0DEB, 0x51F6, 0x51F6, 0x1F4E, 0x51F8, 0x51F8, 0x1BFF,
+ 0x51F9, 0x51F9, 0x17FD, 0x51FA, 0x51FA, 0x1C87, 0x51FD, 0x51FD, 0x1DE3,
+ 0x5200, 0x5200, 0x10AE, 0x5203, 0x5203, 0x192D, 0x5206, 0x5206, 0x1420,
+ 0x5207, 0x5207, 0x1A1C, 0x5208, 0x5208, 0x178F, 0x520A, 0x520A, 0x0D95,
+ 0x520E, 0x520E, 0x12E5, 0x5211, 0x5211, 0x1E5D, 0x5217, 0x5217, 0x117E,
+ 0x521D, 0x521D, 0x1C2E, 0x5224, 0x5224, 0x1D42, 0x5225, 0x5225, 0x13AD,
+ 0x5229, 0x5229, 0x1206, 0x522A, 0x522A, 0x14B8, 0x522E, 0x522E, 0x0EFB,
+ 0x5230, 0x5230, 0x10AF, 0x5236, 0x5236, 0x1A67, 0x5237, 0x5237, 0x15B9,
+ 0x5238, 0x5238, 0x0F82, 0x5239, 0x5239, 0x1BA5, 0x523A, 0x523A, 0x1954,
+ 0x523B, 0x523B, 0x0D89, 0x5243, 0x5243, 0x1C25, 0x5247, 0x5247, 0x1CC0,
+ 0x524A, 0x524A, 0x14B5, 0x524B, 0x524B, 0x0FB1, 0x524C, 0x524C, 0x112D,
+ 0x524D, 0x524D, 0x19F8, 0x5254, 0x5254, 0x1BDF, 0x5256, 0x5256, 0x13F9,
+ 0x525B, 0x525B, 0x0DD0, 0x525D, 0x525D, 0x1316, 0x5261, 0x5261, 0x1557,
+ 0x5269, 0x5269, 0x1950, 0x526A, 0x526A, 0x19F9, 0x526F, 0x526F, 0x13FA,
+ 0x5272, 0x5272, 0x1DE1, 0x5275, 0x5275, 0x1BB6, 0x527D, 0x527D, 0x1D99,
+ 0x527F, 0x527F, 0x1C2F, 0x5283, 0x5283, 0x1F0C, 0x5287, 0x5287, 0x0FB2,
+ 0x5288, 0x5288, 0x139D, 0x5289, 0x5289, 0x11E1, 0x528D, 0x528D, 0x0E22,
+ 0x5291, 0x5291, 0x1A68, 0x5292, 0x5292, 0x0E23, 0x529B, 0x529B, 0x116A,
+ 0x529F, 0x529F, 0x0ECD, 0x52A0, 0x52A0, 0x0D70, 0x52A3, 0x52A3, 0x117F,
+ 0x52A4, 0x52A4, 0x0FB8, 0x52A9, 0x52A9, 0x1A81, 0x52AA, 0x52AA, 0x1049,
+ 0x52AB, 0x52AB, 0x0E28, 0x52BE, 0x52BE, 0x1E17, 0x52C1, 0x52C1, 0x0E51,
+ 0x52C3, 0x52C3, 0x1342, 0x52C5, 0x52C5, 0x1CC1, 0x52C7, 0x52C7, 0x1821,
+ 0x52C9, 0x52C9, 0x1281, 0x52CD, 0x52CD, 0x0E52, 0x52D2, 0x52D2, 0x11FC,
+ 0x52D5, 0x52D5, 0x10EE, 0x52D6, 0x52D6, 0x1855, 0x52D8, 0x52D8, 0x0DB6,
+ 0x52D9, 0x52D9, 0x12CC, 0x52DB, 0x52DB, 0x1F2B, 0x52DD, 0x52DD, 0x1635,
+ 0x52DE, 0x52DE, 0x119F, 0x52DF, 0x52DF, 0x129E, 0x52E2, 0x52E2, 0x1575,
+ 0x52E3, 0x52E3, 0x19DB, 0x52E4, 0x52E4, 0x0FB9, 0x52F3, 0x52F3, 0x1F2C,
+ 0x52F5, 0x52F5, 0x115A, 0x52F8, 0x52F8, 0x0F83, 0x52FA, 0x52FA, 0x196E,
+ 0x52FB, 0x52FB, 0x0FA9, 0x52FE, 0x52FE, 0x0F3B, 0x52FF, 0x52FF, 0x12F0,
+ 0x5305, 0x5305, 0x1D79, 0x5308, 0x5308, 0x1F4F, 0x530D, 0x530D, 0x1D7A,
+ 0x530F, 0x530F, 0x1D7B, 0x5310, 0x5310, 0x13D4, 0x5315, 0x5315, 0x143F,
+ 0x5316, 0x5316, 0x1EB7, 0x5317, 0x5317, 0x141F, 0x5319, 0x5319, 0x163D,
+ 0x5320, 0x5320, 0x1988, 0x5321, 0x5321, 0x0F01, 0x5323, 0x5323, 0x0DCA,
+ 0x532A, 0x532A, 0x1440, 0x532F, 0x532F, 0x1EF8, 0x5339, 0x5339, 0x1DB4,
+ 0x533F, 0x533F, 0x105C, 0x5340, 0x5340, 0x0F3C, 0x5341, 0x5341, 0x168C,
+ 0x5343, 0x5343, 0x1BED, 0x5344, 0x5344, 0x194E, 0x5347, 0x5347, 0x1636,
+ 0x5348, 0x5348, 0x17A5, 0x5349, 0x5349, 0x1F3A, 0x534A, 0x534A, 0x132A,
+ 0x534D, 0x534D, 0x123F, 0x5351, 0x5351, 0x1441, 0x5352, 0x5352, 0x1AB2,
+ 0x5353, 0x5353, 0x1CE3, 0x5354, 0x5354, 0x1E50, 0x5357, 0x5357, 0x1031,
+ 0x535A, 0x535A, 0x1317, 0x535C, 0x535C, 0x13D5, 0x535E, 0x535E, 0x13A7,
+ 0x5360, 0x5360, 0x1A24, 0x5366, 0x5366, 0x0F0C, 0x5368, 0x5368, 0x154A,
+ 0x536F, 0x536F, 0x12C0, 0x5370, 0x5370, 0x192E, 0x5371, 0x5371, 0x188F,
+ 0x5374, 0x5374, 0x0D8A, 0x5375, 0x5375, 0x1126, 0x5377, 0x5377, 0x0F84,
+ 0x537D, 0x537D, 0x1B0E, 0x537F, 0x537F, 0x0E53, 0x5384, 0x5384, 0x16DB,
+ 0x5393, 0x5393, 0x16D0, 0x5398, 0x5398, 0x1207, 0x539A, 0x539A, 0x1F20,
+ 0x539F, 0x539F, 0x1870, 0x53A0, 0x53A0, 0x1CA4, 0x53A5, 0x53A5, 0x0F8B,
+ 0x53A6, 0x53A6, 0x1DC2, 0x53AD, 0x53AD, 0x1765, 0x53BB, 0x53BB, 0x0E02,
+ 0x53C3, 0x53C3, 0x1BAB, 0x53C8, 0x53C8, 0x1839, 0x53C9, 0x53C9, 0x1B84,
+ 0x53CA, 0x53CA, 0x0FD4, 0x53CB, 0x53CB, 0x183A, 0x53CD, 0x53CD, 0x132B,
+ 0x53D4, 0x53D4, 0x15FC, 0x53D6, 0x53D6, 0x1C94, 0x53D7, 0x53D7, 0x15C0,
+ 0x53DB, 0x53DB, 0x132C, 0x53E1, 0x53E1, 0x1790, 0x53E2, 0x53E2, 0x1C53,
+ 0x53E3, 0x53E3, 0x0F3D, 0x53E4, 0x53E4, 0x0E91, 0x53E5, 0x53E5, 0x0F3E,
+ 0x53E9, 0x53E9, 0x0E92, 0x53EA, 0x53EA, 0x1B1F, 0x53EB, 0x53EB, 0x0F9A,
+ 0x53EC, 0x53EC, 0x157C, 0x53ED, 0x53ED, 0x1D4C, 0x53EF, 0x53EF, 0x0D71,
+ 0x53F0, 0x53F0, 0x1D08, 0x53F1, 0x53F1, 0x1B68, 0x53F2, 0x53F2, 0x1482,
+ 0x53F3, 0x53F3, 0x183B, 0x53F8, 0x53F8, 0x1483, 0x5403, 0x5403, 0x1F57,
+ 0x5404, 0x5404, 0x0D8B, 0x5408, 0x5408, 0x1DEF, 0x5409, 0x5409, 0x1020,
+ 0x540A, 0x540A, 0x19DC, 0x540C, 0x540C, 0x10EF, 0x540D, 0x540D, 0x128D,
+ 0x540E, 0x540E, 0x1F21, 0x540F, 0x540F, 0x1208, 0x5410, 0x5410, 0x1D1A,
+ 0x5411, 0x5411, 0x1E1F, 0x541B, 0x541B, 0x0F71, 0x541D, 0x541D, 0x121E,
+ 0x541F, 0x541F, 0x18ED, 0x5420, 0x5420, 0x1D6E, 0x5426, 0x5426, 0x13FB,
+ 0x5429, 0x5429, 0x1421, 0x542B, 0x542B, 0x1DE4, 0x5433, 0x5433, 0x17A7,
+ 0x5438, 0x5438, 0x1F5E, 0x5439, 0x5439, 0x1C95, 0x543B, 0x543B, 0x12E6,
+ 0x543C, 0x543C, 0x1F22, 0x543E, 0x543E, 0x17A6, 0x5442, 0x5442, 0x115B,
+ 0x5448, 0x5448, 0x1A35, 0x544A, 0x544A, 0x0E93, 0x5451, 0x5451, 0x1CF0,
+ 0x5468, 0x5468, 0x1AD3, 0x546A, 0x546A, 0x1AD2, 0x5471, 0x5471, 0x0E94,
+ 0x5473, 0x5473, 0x12F3, 0x5475, 0x5475, 0x0D72, 0x547B, 0x547B, 0x166A,
+ 0x547C, 0x547C, 0x1E7A, 0x547D, 0x547D, 0x128E, 0x5480, 0x5480, 0x19C2,
+ 0x5486, 0x5486, 0x1D7C, 0x548C, 0x548C, 0x1EB8, 0x548E, 0x548E, 0x0F3F,
+ 0x5490, 0x5490, 0x13FC, 0x54A4, 0x54A4, 0x1CD5, 0x54A8, 0x54A8, 0x1955,
+ 0x54AB, 0x54AB, 0x1B20, 0x54AC, 0x54AC, 0x0F1E, 0x54B3, 0x54B3, 0x1E07,
+ 0x54B8, 0x54B8, 0x1DE5, 0x54BD, 0x54BD, 0x192F, 0x54C0, 0x54C0, 0x16D1,
+ 0x54C1, 0x54C1, 0x1DA6, 0x54C4, 0x54C4, 0x1EAD, 0x54C8, 0x54C8, 0x1DF0,
+ 0x54C9, 0x54C9, 0x19AB, 0x54E1, 0x54E1, 0x1871, 0x54E5, 0x54E5, 0x0D73,
+ 0x54E8, 0x54E8, 0x1C30, 0x54ED, 0x54ED, 0x0EB7, 0x54EE, 0x54EE, 0x1F11,
+ 0x54F2, 0x54F2, 0x1C00, 0x54FA, 0x54FA, 0x1D7D, 0x5504, 0x5504, 0x1D4F,
+ 0x5506, 0x5506, 0x1484, 0x5507, 0x5507, 0x1B44, 0x550E, 0x550E, 0x1209,
+ 0x5510, 0x5510, 0x108F, 0x551C, 0x551C, 0x1251, 0x552F, 0x552F, 0x18A9,
+ 0x5531, 0x5531, 0x1BB7, 0x5535, 0x5535, 0x16BD, 0x553E, 0x553E, 0x1CD6,
+ 0x5544, 0x5544, 0x1CE4, 0x5546, 0x5546, 0x14D7, 0x554F, 0x554F, 0x12E7,
+ 0x5553, 0x5553, 0x0E7A, 0x5556, 0x5556, 0x1079, 0x555E, 0x555E, 0x1692,
+ 0x5563, 0x5563, 0x1DE6, 0x557C, 0x557C, 0x1A69, 0x5580, 0x5580, 0x0DFB,
+ 0x5584, 0x5584, 0x152D, 0x5586, 0x5586, 0x1C01, 0x5587, 0x5587, 0x1116,
+ 0x5589, 0x5589, 0x1F23, 0x558A, 0x558A, 0x1DE7, 0x5598, 0x5598, 0x1BEE,
+ 0x5599, 0x5599, 0x1F3B, 0x559A, 0x559A, 0x1ECB, 0x559C, 0x559C, 0x1F65,
+ 0x559D, 0x559D, 0x0DAD, 0x55A7, 0x55A7, 0x1F36, 0x55A9, 0x55A9, 0x18AA,
+ 0x55AA, 0x55AA, 0x14D8, 0x55AB, 0x55AB, 0x1024, 0x55AC, 0x55AC, 0x0F1F,
+ 0x55AE, 0x55AE, 0x1063, 0x55C5, 0x55C5, 0x1F24, 0x55C7, 0x55C7, 0x14F5,
+ 0x55D4, 0x55D4, 0x1B45, 0x55DA, 0x55DA, 0x17A8, 0x55DC, 0x55DC, 0x0FE2,
+ 0x55DF, 0x55DF, 0x1B85, 0x55E3, 0x55E3, 0x1485, 0x55E4, 0x55E4, 0x1CAA,
+ 0x55FD, 0x55FD, 0x15C1, 0x55FE, 0x55FE, 0x1AD4, 0x5606, 0x5606, 0x1CF1,
+ 0x5609, 0x5609, 0x0D74, 0x5614, 0x5614, 0x0F40, 0x5617, 0x5617, 0x14D9,
+ 0x562F, 0x562F, 0x157D, 0x5632, 0x5632, 0x1A82, 0x5634, 0x5634, 0x1C96,
+ 0x5636, 0x5636, 0x163E, 0x5653, 0x5653, 0x1E27, 0x5668, 0x5668, 0x0FE3,
+ 0x566B, 0x566B, 0x1F66, 0x5674, 0x5674, 0x1422, 0x5686, 0x5686, 0x1F12,
+ 0x56A5, 0x56A5, 0x1744, 0x56AC, 0x56AC, 0x1467, 0x56AE, 0x56AE, 0x1E20,
+ 0x56B4, 0x56B4, 0x1727, 0x56BC, 0x56BC, 0x196F, 0x56CA, 0x56CA, 0x1038,
+ 0x56CD, 0x56CD, 0x1F67, 0x56D1, 0x56D1, 0x1C4A, 0x56DA, 0x56DA, 0x15C2,
+ 0x56DB, 0x56DB, 0x1486, 0x56DE, 0x56DE, 0x1EF9, 0x56E0, 0x56E0, 0x1930,
+ 0x56F0, 0x56F0, 0x0EBE, 0x56F9, 0x56F9, 0x118B, 0x56FA, 0x56FA, 0x0E95,
+ 0x5703, 0x5703, 0x1D7E, 0x5704, 0x5704, 0x170E, 0x5708, 0x5708, 0x0F85,
+ 0x570B, 0x570B, 0x0F6B, 0x570D, 0x570D, 0x1890, 0x5712, 0x5712, 0x1873,
+ 0x5713, 0x5713, 0x1872, 0x5716, 0x5716, 0x10B0, 0x5718, 0x5718, 0x1064,
+ 0x571F, 0x571F, 0x1D1B, 0x5728, 0x5728, 0x19AC, 0x572D, 0x572D, 0x0F9B,
+ 0x5730, 0x5730, 0x1B21, 0x573B, 0x573B, 0x0FE4, 0x5740, 0x5740, 0x1B22,
+ 0x5742, 0x5742, 0x1D43, 0x5747, 0x5747, 0x0FAA, 0x574A, 0x574A, 0x134F,
+ 0x574D, 0x574D, 0x107A, 0x574E, 0x574E, 0x0DB7, 0x5750, 0x5750, 0x1AC7,
+ 0x5751, 0x5751, 0x0DFD, 0x5761, 0x5761, 0x1D32, 0x5764, 0x5764, 0x0EBF,
+ 0x5766, 0x5766, 0x1CF2, 0x576A, 0x576A, 0x1D69, 0x576E, 0x576E, 0x109C,
+ 0x5770, 0x5770, 0x0E54, 0x5775, 0x5775, 0x0F41, 0x577C, 0x577C, 0x1CE5,
+ 0x5782, 0x5782, 0x15C3, 0x5788, 0x5788, 0x109B, 0x578B, 0x578B, 0x1E5E,
+ 0x5793, 0x5793, 0x1E08, 0x57A0, 0x57A0, 0x18E5, 0x57A2, 0x57A2, 0x0F42,
+ 0x57A3, 0x57A3, 0x1874, 0x57C3, 0x57C3, 0x16D2, 0x57C7, 0x57C7, 0x1822,
+ 0x57C8, 0x57C8, 0x1AF9, 0x57CB, 0x57CB, 0x1264, 0x57CE, 0x57CE, 0x1562,
+ 0x57DF, 0x57DF, 0x173C, 0x57E0, 0x57E0, 0x13FD, 0x57F0, 0x57F0, 0x1BCB,
+ 0x57F4, 0x57F4, 0x1658, 0x57F7, 0x57F7, 0x1B78, 0x57F9, 0x57F9, 0x136B,
+ 0x57FA, 0x57FA, 0x0FE5, 0x57FC, 0x57FC, 0x0FE6, 0x5800, 0x5800, 0x0F77,
+ 0x5802, 0x5802, 0x1090, 0x5805, 0x5805, 0x0E35, 0x5806, 0x5806, 0x1D23,
+ 0x5808, 0x5808, 0x0DD1, 0x5809, 0x5809, 0x18D3, 0x580A, 0x580A, 0x16A1,
+ 0x581E, 0x581E, 0x1C13, 0x5821, 0x5821, 0x13C3, 0x5824, 0x5824, 0x1A6A,
+ 0x5827, 0x5827, 0x1745, 0x582A, 0x582A, 0x0DB8, 0x582F, 0x582F, 0x17FE,
+ 0x5830, 0x5830, 0x171E, 0x5831, 0x5831, 0x13C4, 0x5834, 0x5834, 0x1989,
+ 0x5835, 0x5835, 0x10B1, 0x583A, 0x583A, 0x0E7B, 0x584A, 0x584A, 0x0F11,
+ 0x584B, 0x584B, 0x1772, 0x584F, 0x584F, 0x0DEC, 0x5851, 0x5851, 0x157E,
+ 0x5854, 0x5854, 0x1D00, 0x5857, 0x5857, 0x10B2, 0x5858, 0x5858, 0x1091,
+ 0x585A, 0x585A, 0x1C54, 0x585E, 0x585E, 0x14F2, 0x5861, 0x5861, 0x19FA,
+ 0x5862, 0x5862, 0x17A9, 0x5864, 0x5864, 0x1F2D, 0x5875, 0x5875, 0x1B46,
+ 0x5879, 0x5879, 0x1BAC, 0x587C, 0x587C, 0x19FB, 0x587E, 0x587E, 0x15FD,
+ 0x5883, 0x5883, 0x0E55, 0x5885, 0x5885, 0x14FD, 0x5889, 0x5889, 0x1823,
+ 0x5893, 0x5893, 0x12C1, 0x589C, 0x589C, 0x1C61, 0x589E, 0x589E, 0x1B13,
+ 0x589F, 0x589F, 0x1E28, 0x58A8, 0x58A8, 0x12E2, 0x58A9, 0x58A9, 0x10DF,
+ 0x58AE, 0x58AE, 0x1CD7, 0x58B3, 0x58B3, 0x1423, 0x58BA, 0x58BA, 0x17AA,
+ 0x58BB, 0x58BB, 0x198A, 0x58BE, 0x58BE, 0x0D96, 0x58C1, 0x58C1, 0x139E,
+ 0x58C5, 0x58C5, 0x17CA, 0x58C7, 0x58C7, 0x1065, 0x58CE, 0x58CE, 0x1F2E,
+ 0x58D1, 0x58D1, 0x1DCE, 0x58D3, 0x58D3, 0x16C5, 0x58D5, 0x58D5, 0x1E7B,
+ 0x58D8, 0x58D8, 0x11D4, 0x58D9, 0x58D9, 0x0F02, 0x58DE, 0x58DE, 0x0F12,
+ 0x58DF, 0x58DF, 0x11B8, 0x58E4, 0x58E4, 0x16F8, 0x58EB, 0x58EB, 0x1487,
+ 0x58EC, 0x58EC, 0x1946, 0x58EF, 0x58EF, 0x198B, 0x58F9, 0x58F9, 0x193F,
+ 0x58FA, 0x58FA, 0x1E7C, 0x58FB, 0x58FB, 0x14FE, 0x58FD, 0x58FD, 0x15C4,
+ 0x590F, 0x590F, 0x1DC3, 0x5914, 0x5914, 0x0FE7, 0x5915, 0x5915, 0x151B,
+ 0x5916, 0x5916, 0x17F7, 0x5919, 0x5919, 0x15FE, 0x591A, 0x591A, 0x105E,
+ 0x591C, 0x591C, 0x16E9, 0x5922, 0x5922, 0x12BD, 0x5927, 0x5927, 0x109D,
+ 0x5929, 0x5929, 0x1BEF, 0x592A, 0x592A, 0x1D09, 0x592B, 0x592B, 0x13FE,
+ 0x592D, 0x592D, 0x17FF, 0x592E, 0x592E, 0x16CA, 0x5931, 0x5931, 0x167E,
+ 0x5937, 0x5937, 0x1910, 0x593E, 0x593E, 0x1E51, 0x5944, 0x5944, 0x1728,
+ 0x5947, 0x5947, 0x0FE8, 0x5948, 0x5948, 0x103C, 0x5949, 0x5949, 0x13E6,
+ 0x594E, 0x594E, 0x0F9C, 0x594F, 0x594F, 0x1AD5, 0x5950, 0x5950, 0x1ECC,
+ 0x5951, 0x5951, 0x0E7C, 0x5954, 0x5954, 0x1424, 0x5955, 0x5955, 0x1E32,
+ 0x5957, 0x5957, 0x1D2A, 0x595A, 0x595A, 0x1E09, 0x5960, 0x5960, 0x19FC,
+ 0x5962, 0x5962, 0x1488, 0x5967, 0x5967, 0x17AB, 0x596A, 0x596A, 0x1CFA,
+ 0x596B, 0x596B, 0x18D8, 0x596C, 0x596C, 0x198C, 0x596D, 0x596D, 0x151C,
+ 0x596E, 0x596E, 0x1425, 0x5973, 0x5973, 0x103F, 0x5974, 0x5974, 0x104A,
+ 0x5978, 0x5978, 0x0D97, 0x597D, 0x597D, 0x1E7D, 0x5982, 0x5982, 0x1730,
+ 0x5983, 0x5983, 0x1442, 0x5984, 0x5984, 0x1259, 0x598A, 0x598A, 0x1947,
+ 0x5993, 0x5993, 0x0FE9, 0x5996, 0x5996, 0x1800, 0x5997, 0x5997, 0x0FC7,
+ 0x5999, 0x5999, 0x12C2, 0x59A5, 0x59A5, 0x1CD8, 0x59A8, 0x59A8, 0x1350,
+ 0x59AC, 0x59AC, 0x1D2B, 0x59B9, 0x59B9, 0x1265, 0x59BB, 0x59BB, 0x1BDB,
+ 0x59BE, 0x59BE, 0x1C14, 0x59C3, 0x59C3, 0x1A36, 0x59C6, 0x59C6, 0x129F,
+ 0x59C9, 0x59C9, 0x1956, 0x59CB, 0x59CB, 0x163F, 0x59D0, 0x59D0, 0x19C3,
+ 0x59D1, 0x59D1, 0x0E96, 0x59D3, 0x59D3, 0x1563, 0x59D4, 0x59D4, 0x1891,
+ 0x59D9, 0x59D9, 0x1948, 0x59DA, 0x59DA, 0x1801, 0x59DC, 0x59DC, 0x0DD2,
+ 0x59DD, 0x59DD, 0x1AD0, 0x59E6, 0x59E6, 0x0D98, 0x59E8, 0x59E8, 0x1911,
+ 0x59EA, 0x59EA, 0x1B69, 0x59EC, 0x59EC, 0x1F68, 0x59EE, 0x59EE, 0x1DF8,
+ 0x59F8, 0x59F8, 0x1746, 0x59FB, 0x59FB, 0x1931, 0x59FF, 0x59FF, 0x1957,
+ 0x5A01, 0x5A01, 0x1892, 0x5A03, 0x5A03, 0x17F4, 0x5A11, 0x5A11, 0x1489,
+ 0x5A18, 0x5A18, 0x1039, 0x5A1B, 0x5A1B, 0x17AC, 0x5A1C, 0x5A1C, 0x1026,
+ 0x5A1F, 0x5A1F, 0x1747, 0x5A20, 0x5A20, 0x166B, 0x5A25, 0x5A25, 0x1693,
+ 0x5A29, 0x5A29, 0x1240, 0x5A36, 0x5A36, 0x1C97, 0x5A3C, 0x5A3C, 0x1BB8,
+ 0x5A41, 0x5A41, 0x11D5, 0x5A46, 0x5A46, 0x1D33, 0x5A49, 0x5A49, 0x17DB,
+ 0x5A5A, 0x5A5A, 0x1EA4, 0x5A62, 0x5A62, 0x1443, 0x5A66, 0x5A66, 0x13FF,
+ 0x5A92, 0x5A92, 0x1266, 0x5A9A, 0x5A9A, 0x12F4, 0x5A9B, 0x5A9B, 0x1875,
+ 0x5AA4, 0x5AA4, 0x1640, 0x5AC1, 0x5AC1, 0x0D75, 0x5AC2, 0x5AC2, 0x15C5,
+ 0x5AC4, 0x5AC4, 0x1876, 0x5AC9, 0x5AC9, 0x1B6A, 0x5ACC, 0x5ACC, 0x1E4E,
+ 0x5AE1, 0x5AE1, 0x19DD, 0x5AE6, 0x5AE6, 0x1DF9, 0x5AE9, 0x5AE9, 0x1055,
+ 0x5B05, 0x5B05, 0x1EB9, 0x5B09, 0x5B09, 0x1F69, 0x5B0B, 0x5B0B, 0x152E,
+ 0x5B0C, 0x5B0C, 0x0F20, 0x5B16, 0x5B16, 0x1D6F, 0x5B2A, 0x5B2A, 0x1468,
+ 0x5B40, 0x5B40, 0x14DA, 0x5B43, 0x5B43, 0x16F9, 0x5B50, 0x5B50, 0x1958,
+ 0x5B51, 0x5B51, 0x1E4A, 0x5B54, 0x5B54, 0x0ECE, 0x5B55, 0x5B55, 0x1951,
+ 0x5B57, 0x5B57, 0x1959, 0x5B58, 0x5B58, 0x1AB0, 0x5B5A, 0x5B5A, 0x1400,
+ 0x5B5C, 0x5B5C, 0x195A, 0x5B5D, 0x5B5D, 0x1F13, 0x5B5F, 0x5B5F, 0x1277,
+ 0x5B63, 0x5B63, 0x0E7D, 0x5B64, 0x5B64, 0x0E97, 0x5B69, 0x5B69, 0x1E0A,
+ 0x5B6B, 0x5B6B, 0x15AA, 0x5B70, 0x5B70, 0x15FF, 0x5B71, 0x5B71, 0x197A,
+ 0x5B75, 0x5B75, 0x1401, 0x5B78, 0x5B78, 0x1DCF, 0x5B7A, 0x5B7A, 0x18AB,
+ 0x5B7C, 0x5B7C, 0x1723, 0x5B85, 0x5B85, 0x10AA, 0x5B87, 0x5B87, 0x183C,
+ 0x5B88, 0x5B88, 0x15C6, 0x5B89, 0x5B89, 0x16AF, 0x5B8B, 0x5B8B, 0x15B1,
+ 0x5B8C, 0x5B8C, 0x17DC, 0x5B8F, 0x5B8F, 0x0F18, 0x5B93, 0x5B93, 0x13D6,
+ 0x5B95, 0x5B95, 0x1D03, 0x5B96, 0x5B96, 0x1F0E, 0x5B97, 0x5B97, 0x1AB6,
+ 0x5B98, 0x5B98, 0x0EEC, 0x5B99, 0x5B99, 0x1AD6, 0x5B9A, 0x5B9A, 0x1A37,
+ 0x5B9B, 0x5B9B, 0x17DD, 0x5B9C, 0x5B9C, 0x18FD, 0x5BA2, 0x5BA2, 0x0DFC,
+ 0x5BA3, 0x5BA3, 0x152F, 0x5BA4, 0x5BA4, 0x167F, 0x5BA5, 0x5BA5, 0x18AC,
+ 0x5BA6, 0x5BA6, 0x1ECD, 0x5BAC, 0x5BAC, 0x1564, 0x5BAE, 0x5BAE, 0x0F7B,
+ 0x5BB0, 0x5BB0, 0x19AD, 0x5BB3, 0x5BB3, 0x1E0B, 0x5BB4, 0x5BB4, 0x1748,
+ 0x5BB5, 0x5BB5, 0x157F, 0x5BB6, 0x5BB6, 0x0D76, 0x5BB8, 0x5BB8, 0x166C,
+ 0x5BB9, 0x5BB9, 0x1824, 0x5BBF, 0x5BBF, 0x1600, 0x5BC0, 0x5BC0, 0x1BCC,
+ 0x5BC2, 0x5BC2, 0x19DE, 0x5BC3, 0x5BC3, 0x1877, 0x5BC4, 0x5BC4, 0x0FEA,
+ 0x5BC5, 0x5BC5, 0x1932, 0x5BC6, 0x5BC6, 0x1313, 0x5BC7, 0x5BC7, 0x0F43,
+ 0x5BCC, 0x5BCC, 0x1402, 0x5BD0, 0x5BD0, 0x1267, 0x5BD2, 0x5BD2, 0x1DD3,
+ 0x5BD3, 0x5BD3, 0x183D, 0x5BD4, 0x5BD4, 0x1659, 0x5BD7, 0x5BD7, 0x1048,
+ 0x5BDE, 0x5BDE, 0x1238, 0x5BDF, 0x5BDF, 0x1BA6, 0x5BE1, 0x5BE1, 0x0EDB,
+ 0x5BE2, 0x5BE2, 0x1CC8, 0x5BE4, 0x5BE4, 0x17AD, 0x5BE5, 0x5BE5, 0x1802,
+ 0x5BE6, 0x5BE6, 0x1680, 0x5BE7, 0x5BE7, 0x1047, 0x5BE8, 0x5BE8, 0x1BCD,
+ 0x5BE9, 0x5BE9, 0x1682, 0x5BEB, 0x5BEB, 0x148A, 0x5BEC, 0x5BEC, 0x0EED,
+ 0x5BEE, 0x5BEE, 0x11C9, 0x5BEF, 0x5BEF, 0x1AFA, 0x5BF5, 0x5BF5, 0x1C55,
+ 0x5BF6, 0x5BF6, 0x13C5, 0x5BF8, 0x5BF8, 0x1C4F, 0x5BFA, 0x5BFA, 0x148B,
+ 0x5C01, 0x5C01, 0x13E7, 0x5C04, 0x5C04, 0x148C, 0x5C07, 0x5C07, 0x198D,
+ 0x5C08, 0x5C08, 0x19FD, 0x5C09, 0x5C09, 0x1893, 0x5C0A, 0x5C0A, 0x1AB1,
+ 0x5C0B, 0x5C0B, 0x1683, 0x5C0D, 0x5C0D, 0x109E, 0x5C0E, 0x5C0E, 0x10B3,
+ 0x5C0F, 0x5C0F, 0x1580, 0x5C11, 0x5C11, 0x1581, 0x5C16, 0x5C16, 0x1C0A,
+ 0x5C19, 0x5C19, 0x14DB, 0x5C24, 0x5C24, 0x183E, 0x5C28, 0x5C28, 0x1351,
+ 0x5C31, 0x5C31, 0x1C98, 0x5C38, 0x5C38, 0x1641, 0x5C39, 0x5C39, 0x18D9,
+ 0x5C3A, 0x5C3A, 0x1BE0, 0x5C3B, 0x5C3B, 0x0E98, 0x5C3C, 0x5C3C, 0x105A,
+ 0x5C3E, 0x5C3E, 0x12F5, 0x5C3F, 0x5C3F, 0x1054, 0x5C40, 0x5C40, 0x0F6C,
+ 0x5C45, 0x5C45, 0x0E03, 0x5C46, 0x5C46, 0x0E7E, 0x5C48, 0x5C48, 0x0F78,
+ 0x5C4B, 0x5C4B, 0x17BE, 0x5C4D, 0x5C4D, 0x1643, 0x5C4E, 0x5C4E, 0x1642,
+ 0x5C51, 0x5C51, 0x154B, 0x5C55, 0x5C55, 0x19FE, 0x5C5B, 0x5C5B, 0x13B4,
+ 0x5C60, 0x5C60, 0x10B4, 0x5C62, 0x5C62, 0x11D6, 0x5C64, 0x5C64, 0x1CA7,
+ 0x5C65, 0x5C65, 0x120A, 0x5C6C, 0x5C6C, 0x15A2, 0x5C6F, 0x5C6F, 0x1106,
+ 0x5C71, 0x5C71, 0x14B9, 0x5C79, 0x5C79, 0x1F58, 0x5C90, 0x5C90, 0x0FEB,
+ 0x5C91, 0x5C91, 0x197F, 0x5CA1, 0x5CA1, 0x0DD3, 0x5CA9, 0x5CA9, 0x16BE,
+ 0x5CAB, 0x5CAB, 0x15C7, 0x5CAC, 0x5CAC, 0x0DCB, 0x5CB1, 0x5CB1, 0x109F,
+ 0x5CB3, 0x5CB3, 0x16A2, 0x5CB5, 0x5CB5, 0x1E7E, 0x5CB7, 0x5CB7, 0x1306,
+ 0x5CB8, 0x5CB8, 0x16B0, 0x5CBA, 0x5CBA, 0x118C, 0x5CBE, 0x5CBE, 0x1A25,
+ 0x5CC0, 0x5CC0, 0x15C8, 0x5CD9, 0x5CD9, 0x1CAB, 0x5CE0, 0x5CE0, 0x14DC,
+ 0x5CE8, 0x5CE8, 0x1694, 0x5CEF, 0x5CF0, 0x13E8, 0x5CF4, 0x5CF4, 0x1E37,
+ 0x5CF6, 0x5CF6, 0x10B5, 0x5CFB, 0x5CFB, 0x1AFB, 0x5CFD, 0x5CFD, 0x1E52,
+ 0x5D07, 0x5D07, 0x1627, 0x5D0D, 0x5D0D, 0x1145, 0x5D0E, 0x5D0E, 0x0FEC,
+ 0x5D11, 0x5D11, 0x0EC0, 0x5D14, 0x5D14, 0x1C5F, 0x5D16, 0x5D16, 0x16D3,
+ 0x5D17, 0x5D17, 0x0DD4, 0x5D19, 0x5D19, 0x11F4, 0x5D27, 0x5D27, 0x1628,
+ 0x5D29, 0x5D29, 0x1437, 0x5D4B, 0x5D4B, 0x12F6, 0x5D4C, 0x5D4C, 0x0DB9,
+ 0x5D50, 0x5D50, 0x112F, 0x5D69, 0x5D69, 0x1629, 0x5D6C, 0x5D6C, 0x17F8,
+ 0x5D6F, 0x5D6F, 0x1B86, 0x5D87, 0x5D87, 0x0F44, 0x5D8B, 0x5D8B, 0x10B6,
+ 0x5D9D, 0x5D9D, 0x110D, 0x5DA0, 0x5DA0, 0x0F21, 0x5DA2, 0x5DA2, 0x1803,
+ 0x5DAA, 0x5DAA, 0x172B, 0x5DB8, 0x5DB8, 0x1773, 0x5DBA, 0x5DBA, 0x118D,
+ 0x5DBC, 0x5DBC, 0x14FF, 0x5DBD, 0x5DBD, 0x16A3, 0x5DCD, 0x5DCD, 0x17F9,
+ 0x5DD2, 0x5DD2, 0x1241, 0x5DD6, 0x5DD6, 0x16BF, 0x5DDD, 0x5DDD, 0x1BF0,
+ 0x5DDE, 0x5DDE, 0x1AD7, 0x5DE1, 0x5DE1, 0x1608, 0x5DE2, 0x5DE2, 0x1582,
+ 0x5DE5, 0x5DE5, 0x0ECF, 0x5DE6, 0x5DE6, 0x1AC8, 0x5DE7, 0x5DE7, 0x0F22,
+ 0x5DE8, 0x5DE8, 0x0E04, 0x5DEB, 0x5DEB, 0x12CD, 0x5DEE, 0x5DEE, 0x1B87,
+ 0x5DF1, 0x5DF1, 0x0FED, 0x5DF2, 0x5DF2, 0x1912, 0x5DF3, 0x5DF3, 0x148D,
+ 0x5DF4, 0x5DF4, 0x1D34, 0x5DF7, 0x5DF7, 0x1DFA, 0x5DFD, 0x5DFD, 0x15AB,
+ 0x5DFE, 0x5DFE, 0x0E14, 0x5E02, 0x5E02, 0x1644, 0x5E03, 0x5E03, 0x1D7F,
+ 0x5E06, 0x5E06, 0x1392, 0x5E0C, 0x5E0C, 0x1F6A, 0x5E11, 0x5E11, 0x1D04,
+ 0x5E16, 0x5E16, 0x1C15, 0x5E19, 0x5E19, 0x1B6B, 0x5E1B, 0x5E1B, 0x137E,
+ 0x5E1D, 0x5E1D, 0x1A6B, 0x5E25, 0x5E25, 0x15C9, 0x5E2B, 0x5E2B, 0x148E,
+ 0x5E2D, 0x5E2D, 0x151D, 0x5E33, 0x5E33, 0x198E, 0x5E36, 0x5E36, 0x10A0,
+ 0x5E38, 0x5E38, 0x14DD, 0x5E3D, 0x5E3D, 0x12A0, 0x5E3F, 0x5E3F, 0x1F25,
+ 0x5E40, 0x5E40, 0x1A38, 0x5E44, 0x5E44, 0x16A4, 0x5E45, 0x5E45, 0x1D93,
+ 0x5E47, 0x5E47, 0x1352, 0x5E4C, 0x5E4C, 0x1EE1, 0x5E55, 0x5E55, 0x1239,
+ 0x5E5F, 0x5E5F, 0x1CAC, 0x5E61, 0x5E61, 0x1384, 0x5E62, 0x5E62, 0x1092,
+ 0x5E63, 0x5E63, 0x1D70, 0x5E72, 0x5E72, 0x0D99, 0x5E73, 0x5E73, 0x1D6A,
+ 0x5E74, 0x5E74, 0x1040, 0x5E77, 0x5E77, 0x13B5, 0x5E78, 0x5E78, 0x1E1A,
+ 0x5E79, 0x5E79, 0x0D9A, 0x5E7B, 0x5E7B, 0x1ECE, 0x5E7C, 0x5E7D, 0x18AD,
+ 0x5E7E, 0x5E7E, 0x0FEE, 0x5E84, 0x5E84, 0x198F, 0x5E87, 0x5E87, 0x1444,
+ 0x5E8A, 0x5E8A, 0x14DE, 0x5E8F, 0x5E8F, 0x1500, 0x5E95, 0x5E95, 0x19C4,
+ 0x5E97, 0x5E97, 0x1A26, 0x5E9A, 0x5E9A, 0x0E56, 0x5E9C, 0x5E9C, 0x1403,
+ 0x5EA0, 0x5EA0, 0x14DF, 0x5EA6, 0x5EA6, 0x10B7, 0x5EA7, 0x5EA7, 0x1AC9,
+ 0x5EAB, 0x5EAB, 0x0E99, 0x5EAD, 0x5EAD, 0x1A39, 0x5EB5, 0x5EB5, 0x16C0,
+ 0x5EB6, 0x5EB6, 0x1501, 0x5EB7, 0x5EB7, 0x0DD5, 0x5EB8, 0x5EB8, 0x1825,
+ 0x5EBE, 0x5EBE, 0x18AF, 0x5EC2, 0x5EC2, 0x14E0, 0x5EC8, 0x5EC8, 0x1DC4,
+ 0x5EC9, 0x5EC9, 0x1183, 0x5ECA, 0x5ECA, 0x113C, 0x5ED0, 0x5ED0, 0x0F45,
+ 0x5ED3, 0x5ED3, 0x0EE7, 0x5ED6, 0x5ED6, 0x11CA, 0x5EDA, 0x5EDA, 0x1AD8,
+ 0x5EDB, 0x5EDB, 0x19FF, 0x5EDF, 0x5EDF, 0x12C3, 0x5EE0, 0x5EE0, 0x1BB9,
+ 0x5EE2, 0x5EE2, 0x1D71, 0x5EE3, 0x5EE3, 0x0F03, 0x5EEC, 0x5EEC, 0x115C,
+ 0x5EF3, 0x5EF3, 0x1C1D, 0x5EF6, 0x5EF6, 0x1749, 0x5EF7, 0x5EF7, 0x1A3A,
+ 0x5EFA, 0x5EFA, 0x0E15, 0x5EFB, 0x5EFB, 0x1EFA, 0x5F01, 0x5F01, 0x13A8,
+ 0x5F04, 0x5F04, 0x11B9, 0x5F0A, 0x5F0A, 0x1D72, 0x5F0F, 0x5F0F, 0x165A,
+ 0x5F11, 0x5F11, 0x1645, 0x5F13, 0x5F13, 0x0F7C, 0x5F14, 0x5F14, 0x1A83,
+ 0x5F15, 0x5F15, 0x1933, 0x5F17, 0x5F17, 0x1434, 0x5F18, 0x5F18, 0x1EAE,
+ 0x5F1B, 0x5F1B, 0x1913, 0x5F1F, 0x5F1F, 0x1A6C, 0x5F26, 0x5F26, 0x1E38,
+ 0x5F27, 0x5F27, 0x1E7F, 0x5F29, 0x5F29, 0x104B, 0x5F31, 0x5F31, 0x16F0,
+ 0x5F35, 0x5F35, 0x1990, 0x5F3A, 0x5F3A, 0x0DD6, 0x5F3C, 0x5F3C, 0x1DB5,
+ 0x5F48, 0x5F48, 0x1CF3, 0x5F4A, 0x5F4A, 0x0DD7, 0x5F4C, 0x5F4C, 0x12F7,
+ 0x5F4E, 0x5F4E, 0x1242, 0x5F56, 0x5F56, 0x1066, 0x5F57, 0x5F57, 0x1E70,
+ 0x5F59, 0x5F59, 0x1F3D, 0x5F5B, 0x5F5B, 0x1914, 0x5F62, 0x5F62, 0x1E5F,
+ 0x5F66, 0x5F66, 0x171F, 0x5F67, 0x5F67, 0x1856, 0x5F69, 0x5F69, 0x1BCE,
+ 0x5F6A, 0x5F6A, 0x1D9A, 0x5F6B, 0x5F6B, 0x1A84, 0x5F6C, 0x5F6C, 0x1469,
+ 0x5F6D, 0x5F6D, 0x1D59, 0x5F70, 0x5F70, 0x1BBA, 0x5F71, 0x5F71, 0x1774,
+ 0x5F77, 0x5F77, 0x1353, 0x5F79, 0x5F79, 0x173D, 0x5F7C, 0x5F7C, 0x1DAD,
+ 0x5F7F, 0x5F7F, 0x1435, 0x5F80, 0x5F80, 0x17EE, 0x5F81, 0x5F81, 0x1A3B,
+ 0x5F85, 0x5F85, 0x10A1, 0x5F87, 0x5F87, 0x1609, 0x5F8A, 0x5F8A, 0x1EFB,
+ 0x5F8B, 0x5F8B, 0x11F8, 0x5F8C, 0x5F8C, 0x1F26, 0x5F90, 0x5F90, 0x1502,
+ 0x5F91, 0x5F91, 0x0E57, 0x5F92, 0x5F92, 0x10B8, 0x5F97, 0x5F97, 0x110C,
+ 0x5F98, 0x5F98, 0x136C, 0x5F99, 0x5F99, 0x148F, 0x5F9E, 0x5F9E, 0x1AB7,
+ 0x5FA0, 0x5FA0, 0x1146, 0x5FA1, 0x5FA1, 0x170F, 0x5FA8, 0x5FA8, 0x1EE2,
+ 0x5FA9, 0x5FA9, 0x13D7, 0x5FAA, 0x5FAA, 0x160A, 0x5FAE, 0x5FAE, 0x12F8,
+ 0x5FB5, 0x5FB5, 0x1B7E, 0x5FB7, 0x5FB7, 0x10AB, 0x5FB9, 0x5FB9, 0x1C02,
+ 0x5FBD, 0x5FBD, 0x1F3E, 0x5FC3, 0x5FC3, 0x1684, 0x5FC5, 0x5FC5, 0x1DB6,
+ 0x5FCC, 0x5FCC, 0x0FEF, 0x5FCD, 0x5FCD, 0x1934, 0x5FD6, 0x5FD6, 0x1C50,
+ 0x5FD7, 0x5FD7, 0x1B23, 0x5FD8, 0x5FD9, 0x125A, 0x5FE0, 0x5FE0, 0x1C8B,
+ 0x5FEB, 0x5FEB, 0x1CD3, 0x5FF5, 0x5FF5, 0x1043, 0x5FFD, 0x5FFD, 0x1EAA,
+ 0x5FFF, 0x5FFF, 0x1426, 0x600F, 0x600F, 0x16CB, 0x6012, 0x6012, 0x104C,
+ 0x6016, 0x6016, 0x1D80, 0x601C, 0x601C, 0x118E, 0x601D, 0x601D, 0x1490,
+ 0x6020, 0x6020, 0x1D0A, 0x6021, 0x6021, 0x1915, 0x6025, 0x6025, 0x0FD5,
+ 0x6027, 0x6027, 0x1565, 0x6028, 0x6028, 0x1878, 0x602A, 0x602A, 0x0F13,
+ 0x602F, 0x602F, 0x0E29, 0x6041, 0x6041, 0x1949, 0x6042, 0x6042, 0x160B,
+ 0x6043, 0x6043, 0x1646, 0x604D, 0x604D, 0x1EE3, 0x6050, 0x6050, 0x0ED0,
+ 0x6052, 0x6052, 0x1DFB, 0x6055, 0x6055, 0x1503, 0x6059, 0x6059, 0x16FA,
+ 0x605D, 0x605D, 0x0EFC, 0x6062, 0x6062, 0x1EFC, 0x6063, 0x6063, 0x195B,
+ 0x6064, 0x6064, 0x1F4A, 0x6065, 0x6065, 0x1CAD, 0x6068, 0x6068, 0x1DD4,
+ 0x6069, 0x6069, 0x18E6, 0x606A, 0x606A, 0x0D8C, 0x606C, 0x606C, 0x1044,
+ 0x606D, 0x606D, 0x0ED1, 0x606F, 0x606F, 0x165B, 0x6070, 0x6070, 0x1F5F,
+ 0x6085, 0x6085, 0x1761, 0x6089, 0x6089, 0x1681, 0x608C, 0x608C, 0x1A6D,
+ 0x608D, 0x608D, 0x1DD5, 0x6094, 0x6094, 0x1EFD, 0x6096, 0x6096, 0x1D50,
+ 0x609A, 0x609A, 0x15B2, 0x609B, 0x609B, 0x1A00, 0x609F, 0x609F, 0x17AE,
+ 0x60A0, 0x60A0, 0x18B0, 0x60A3, 0x60A3, 0x1ECF, 0x60A4, 0x60A4, 0x1C56,
+ 0x60A7, 0x60A7, 0x120B, 0x60B0, 0x60B0, 0x1AB8, 0x60B2, 0x60B2, 0x1445,
+ 0x60B3, 0x60B3, 0x10AC, 0x60B4, 0x60B4, 0x1C90, 0x60B6, 0x60B6, 0x1307,
+ 0x60B8, 0x60B8, 0x0E7F, 0x60BC, 0x60BC, 0x10B9, 0x60BD, 0x60BD, 0x1BDC,
+ 0x60C5, 0x60C5, 0x1A3C, 0x60C7, 0x60C7, 0x10E0, 0x60D1, 0x60D1, 0x1EA1,
+ 0x60DA, 0x60DA, 0x1EAB, 0x60DC, 0x60DC, 0x151E, 0x60DF, 0x60DF, 0x18B1,
+ 0x60E0, 0x60E0, 0x1E71, 0x60E1, 0x60E1, 0x16A5, 0x60F0, 0x60F0, 0x1CD9,
+ 0x60F1, 0x60F1, 0x1052, 0x60F3, 0x60F3, 0x14E1, 0x60F6, 0x60F6, 0x1EE4,
+ 0x60F9, 0x60F9, 0x16EA, 0x60FA, 0x60FA, 0x1566, 0x60FB, 0x60FB, 0x1CA5,
+ 0x6101, 0x6101, 0x15CA, 0x6106, 0x6106, 0x0E16, 0x6108, 0x6109, 0x18B2,
+ 0x610D, 0x610D, 0x1308, 0x610E, 0x610E, 0x1D5D, 0x610F, 0x610F, 0x18FE,
+ 0x6115, 0x6115, 0x16A6, 0x611A, 0x611A, 0x183F, 0x611B, 0x611B, 0x16D4,
+ 0x611F, 0x611F, 0x0DBA, 0x6127, 0x6127, 0x0F14, 0x6130, 0x6130, 0x1EE5,
+ 0x6134, 0x6134, 0x1BBB, 0x6137, 0x6137, 0x0DED, 0x613C, 0x613C, 0x166D,
+ 0x613E, 0x613E, 0x0DEE, 0x613F, 0x613F, 0x1879, 0x6142, 0x6142, 0x1826,
+ 0x6144, 0x6144, 0x11F9, 0x6147, 0x6147, 0x18E7, 0x6148, 0x6148, 0x195C,
+ 0x614A, 0x614A, 0x0E47, 0x614B, 0x614B, 0x1D0B, 0x614C, 0x614C, 0x1EE6,
+ 0x6153, 0x6153, 0x1D9B, 0x6155, 0x6155, 0x12A1, 0x6158, 0x6159, 0x1BAD,
+ 0x615D, 0x615D, 0x1D2F, 0x615F, 0x615F, 0x1D1D, 0x6162, 0x6162, 0x1243,
+ 0x6163, 0x6163, 0x0EEE, 0x6164, 0x6164, 0x0D8D, 0x6167, 0x6167, 0x1E72,
+ 0x6168, 0x6168, 0x0DEF, 0x616B, 0x616B, 0x1AB9, 0x616E, 0x616E, 0x115D,
+ 0x6170, 0x6170, 0x1894, 0x6176, 0x6176, 0x0E58, 0x6177, 0x6177, 0x0DD8,
+ 0x617D, 0x617D, 0x1BE1, 0x617E, 0x617E, 0x1818, 0x6181, 0x6181, 0x1C57,
+ 0x6182, 0x6182, 0x1840, 0x618A, 0x618A, 0x1446, 0x618E, 0x618E, 0x1B14,
+ 0x6190, 0x6190, 0x1171, 0x6191, 0x6191, 0x1475, 0x6194, 0x6194, 0x1C31,
+ 0x6198, 0x6198, 0x1F6C, 0x6199, 0x6199, 0x1F6B, 0x619A, 0x619A, 0x1CF4,
+ 0x61A4, 0x61A4, 0x1427, 0x61A7, 0x61A7, 0x10F0, 0x61A9, 0x61A9, 0x0E2C,
+ 0x61AB, 0x61AB, 0x1309, 0x61AC, 0x61AC, 0x0E59, 0x61AE, 0x61AE, 0x12CE,
+ 0x61B2, 0x61B2, 0x1E2B, 0x61B6, 0x61B6, 0x1719, 0x61BA, 0x61BA, 0x107B,
+ 0x61BE, 0x61BE, 0x0DBB, 0x61C3, 0x61C3, 0x0FBA, 0x61C7, 0x61C7, 0x0D9B,
+ 0x61C8, 0x61C8, 0x1E0C, 0x61C9, 0x61C9, 0x18F7, 0x61CA, 0x61CA, 0x17AF,
+ 0x61CB, 0x61CB, 0x12CF, 0x61E6, 0x61E6, 0x1027, 0x61F2, 0x61F2, 0x1B7F,
+ 0x61F6, 0x61F6, 0x1117, 0x61F7, 0x61F7, 0x1EFE, 0x61F8, 0x61F8, 0x1E39,
+ 0x61FA, 0x61FA, 0x1BAF, 0x61FC, 0x61FC, 0x0F46, 0x61FF, 0x61FF, 0x18FF,
+ 0x6200, 0x6200, 0x1172, 0x6207, 0x6207, 0x1093, 0x6208, 0x6208, 0x0EDC,
+ 0x620A, 0x620A, 0x12D0, 0x620C, 0x620C, 0x1623, 0x620D, 0x620D, 0x15CB,
+ 0x620E, 0x620E, 0x18E1, 0x6210, 0x6210, 0x1567, 0x6211, 0x6211, 0x1695,
+ 0x6212, 0x6212, 0x0E80, 0x6216, 0x6216, 0x1EA2, 0x621A, 0x621A, 0x1BE2,
+ 0x621F, 0x621F, 0x0FB3, 0x6221, 0x6221, 0x0DBC, 0x622A, 0x622A, 0x1A1D,
+ 0x622E, 0x622E, 0x11F0, 0x6230, 0x6230, 0x1A01, 0x6231, 0x6231, 0x1F6D,
+ 0x6234, 0x6234, 0x10A2, 0x6236, 0x6236, 0x1E80, 0x623E, 0x623E, 0x115E,
+ 0x623F, 0x623F, 0x1354, 0x6240, 0x6240, 0x1583, 0x6241, 0x6241, 0x1D60,
+ 0x6247, 0x6247, 0x1530, 0x6248, 0x6248, 0x1E81, 0x6249, 0x6249, 0x1447,
+ 0x624B, 0x624B, 0x15CC, 0x624D, 0x624D, 0x19AE, 0x6253, 0x6253, 0x1CDA,
+ 0x6258, 0x6258, 0x1CE6, 0x626E, 0x626E, 0x1428, 0x6271, 0x6271, 0x0FD6,
+ 0x6276, 0x6276, 0x1404, 0x6279, 0x6279, 0x1448, 0x627C, 0x627C, 0x16DC,
+ 0x627F, 0x627F, 0x1637, 0x6280, 0x6280, 0x0FF0, 0x6284, 0x6284, 0x1C32,
+ 0x6289, 0x6289, 0x0E40, 0x628A, 0x628A, 0x1D35, 0x6291, 0x6291, 0x171A,
+ 0x6292, 0x6292, 0x1504, 0x6295, 0x6295, 0x1D2C, 0x6297, 0x6297, 0x1DFC,
+ 0x6298, 0x6298, 0x1A1E, 0x629B, 0x629B, 0x1D81, 0x62AB, 0x62AB, 0x1DAE,
+ 0x62B1, 0x62B1, 0x1D82, 0x62B5, 0x62B5, 0x19C5, 0x62B9, 0x62B9, 0x1252,
+ 0x62BC, 0x62BC, 0x16C6, 0x62BD, 0x62BD, 0x1C62, 0x62C2, 0x62C2, 0x1436,
+ 0x62C7, 0x62C7, 0x12D1, 0x62C8, 0x62C8, 0x1045, 0x62C9, 0x62C9, 0x1139,
+ 0x62CC, 0x62CC, 0x132D, 0x62CD, 0x62CD, 0x1318, 0x62CF, 0x62CF, 0x1028,
+ 0x62D0, 0x62D0, 0x0F15, 0x62D2, 0x62D2, 0x0E05, 0x62D3, 0x62D3, 0x1BE3,
+ 0x62D4, 0x62D4, 0x1343, 0x62D6, 0x62D6, 0x1CDB, 0x62D7, 0x62D7, 0x1804,
+ 0x62D8, 0x62D8, 0x0F47, 0x62D9, 0x62D9, 0x1AB3, 0x62DB, 0x62DB, 0x1C33,
+ 0x62DC, 0x62DC, 0x136D, 0x62EC, 0x62EC, 0x0EFD, 0x62ED, 0x62ED, 0x165C,
+ 0x62EE, 0x62EE, 0x1021, 0x62EF, 0x62EF, 0x1B16, 0x62F1, 0x62F1, 0x0ED2,
+ 0x62F3, 0x62F3, 0x0F86, 0x62F7, 0x62F7, 0x0E9A, 0x62FE, 0x62FE, 0x162E,
+ 0x62FF, 0x62FF, 0x1029, 0x6301, 0x6301, 0x1B24, 0x6307, 0x6307, 0x1B25,
+ 0x6309, 0x6309, 0x16B1, 0x6311, 0x6311, 0x10BA, 0x632B, 0x632B, 0x1ACA,
+ 0x632F, 0x632F, 0x1B47, 0x633A, 0x633A, 0x1A3D, 0x633B, 0x633B, 0x174B,
+ 0x633D, 0x633D, 0x1244, 0x633E, 0x633E, 0x1E53, 0x6349, 0x6349, 0x1B8F,
+ 0x634C, 0x634C, 0x1D4D, 0x634F, 0x634F, 0x102F, 0x6350, 0x6350, 0x174A,
+ 0x6355, 0x6355, 0x1D83, 0x6367, 0x6367, 0x13EA, 0x6368, 0x6368, 0x1491,
+ 0x636E, 0x636E, 0x0E06, 0x6372, 0x6372, 0x0F87, 0x6377, 0x6377, 0x1C16,
+ 0x637A, 0x637A, 0x1030, 0x637B, 0x637B, 0x1046, 0x637F, 0x637F, 0x1505,
+ 0x6383, 0x6383, 0x1584, 0x6388, 0x6388, 0x15CD, 0x6389, 0x6389, 0x10BB,
+ 0x638C, 0x638C, 0x1991, 0x6392, 0x6392, 0x136E, 0x6396, 0x6396, 0x16DD,
+ 0x6398, 0x6398, 0x0F79, 0x639B, 0x639B, 0x0F0D, 0x63A0, 0x63A0, 0x1149,
+ 0x63A1, 0x63A1, 0x1BCF, 0x63A2, 0x63A2, 0x1CFC, 0x63A5, 0x63A5, 0x1A2D,
+ 0x63A7, 0x63A7, 0x0ED3, 0x63A8, 0x63A8, 0x1C63, 0x63A9, 0x63A9, 0x1729,
+ 0x63AA, 0x63AA, 0x1A85, 0x63C0, 0x63C0, 0x0D9C, 0x63C4, 0x63C4, 0x18B4,
+ 0x63C6, 0x63C6, 0x0F9D, 0x63CF, 0x63CF, 0x12C4, 0x63D0, 0x63D0, 0x1A6E,
+ 0x63D6, 0x63D6, 0x18F3, 0x63DA, 0x63DA, 0x16FB, 0x63DB, 0x63DB, 0x1ED0,
+ 0x63E1, 0x63E1, 0x16A7, 0x63ED, 0x63ED, 0x0E2D, 0x63EE, 0x63EE, 0x1F3F,
+ 0x63F4, 0x63F4, 0x187A, 0x63F6, 0x63F6, 0x16EB, 0x63F7, 0x63F7, 0x14CF,
+ 0x640D, 0x640D, 0x15AC, 0x640F, 0x640F, 0x1319, 0x6414, 0x6414, 0x1585,
+ 0x6416, 0x6416, 0x1805, 0x6417, 0x6417, 0x10BC, 0x641C, 0x641C, 0x15CE,
+ 0x6422, 0x6422, 0x1B48, 0x642C, 0x642C, 0x132E, 0x642D, 0x642D, 0x1D01,
+ 0x643A, 0x643A, 0x1F46, 0x643E, 0x643E, 0x1B90, 0x6458, 0x6458, 0x19DF,
+ 0x6460, 0x6460, 0x1C58, 0x6469, 0x6469, 0x1230, 0x646F, 0x646F, 0x1B26,
+ 0x6478, 0x6479, 0x12A2, 0x647A, 0x647A, 0x1A2E, 0x6488, 0x6488, 0x11A0,
+ 0x6491, 0x6491, 0x1D17, 0x6492, 0x6492, 0x14C4, 0x6493, 0x6493, 0x1806,
+ 0x649A, 0x649A, 0x1041, 0x649E, 0x649E, 0x1094, 0x64A4, 0x64A4, 0x1C03,
+ 0x64A5, 0x64A5, 0x1344, 0x64AB, 0x64AB, 0x12D2, 0x64AD, 0x64AD, 0x1D36,
+ 0x64AE, 0x64AE, 0x1C5D, 0x64B0, 0x64B0, 0x1B96, 0x64B2, 0x64B2, 0x131A,
+ 0x64BB, 0x64BB, 0x1074, 0x64C1, 0x64C1, 0x17CB, 0x64C4, 0x64C4, 0x11A1,
+ 0x64C5, 0x64C5, 0x1BF1, 0x64C7, 0x64C7, 0x1D15, 0x64CA, 0x64CA, 0x0E2E,
+ 0x64CD, 0x64CD, 0x1A86, 0x64CE, 0x64CE, 0x0E5A, 0x64D2, 0x64D2, 0x0FC8,
+ 0x64D4, 0x64D4, 0x107C, 0x64D8, 0x64D8, 0x139F, 0x64DA, 0x64DA, 0x0E07,
+ 0x64E1, 0x64E1, 0x10A3, 0x64E2, 0x64E2, 0x1CE7, 0x64E5, 0x64E5, 0x1130,
+ 0x64E6, 0x64E6, 0x1BA7, 0x64E7, 0x64E7, 0x0E08, 0x64EC, 0x64EC, 0x1900,
+ 0x64F2, 0x64F2, 0x1BE4, 0x64F4, 0x64F4, 0x1EC5, 0x64FA, 0x64FA, 0x1D37,
+ 0x64FE, 0x64FE, 0x1807, 0x6500, 0x6500, 0x132F, 0x6504, 0x6504, 0x1D18,
+ 0x6518, 0x6518, 0x16FC, 0x651D, 0x651D, 0x155F, 0x6523, 0x6523, 0x1173,
+ 0x652A, 0x652A, 0x0F23, 0x652B, 0x652B, 0x1EC6, 0x652C, 0x652C, 0x1131,
+ 0x652F, 0x652F, 0x1B27, 0x6536, 0x6536, 0x15CF, 0x6537, 0x6537, 0x0E9B,
+ 0x6538, 0x6538, 0x18B5, 0x6539, 0x6539, 0x0DF0, 0x653B, 0x653B, 0x0ED4,
+ 0x653E, 0x653E, 0x1355, 0x653F, 0x653F, 0x1A3E, 0x6545, 0x6545, 0x0E9C,
+ 0x6548, 0x6548, 0x1F14, 0x654D, 0x654D, 0x1506, 0x654E, 0x654E, 0x0F24,
+ 0x654F, 0x654F, 0x130A, 0x6551, 0x6551, 0x0F48, 0x6556, 0x6556, 0x17B0,
+ 0x6557, 0x6557, 0x1D51, 0x655E, 0x655E, 0x1BBC, 0x6562, 0x6562, 0x0DBD,
+ 0x6563, 0x6563, 0x14BA, 0x6566, 0x6566, 0x10E1, 0x656C, 0x656C, 0x0E5B,
+ 0x656D, 0x656D, 0x16FD, 0x6572, 0x6572, 0x0E9D, 0x6574, 0x6574, 0x1A3F,
+ 0x6575, 0x6575, 0x19E0, 0x6577, 0x6577, 0x1405, 0x6578, 0x6578, 0x15D0,
+ 0x657E, 0x657E, 0x1531, 0x6582, 0x6582, 0x1184, 0x6583, 0x6583, 0x1D73,
+ 0x6585, 0x6585, 0x1F15, 0x6587, 0x6587, 0x12E8, 0x658C, 0x658C, 0x146A,
+ 0x6590, 0x6590, 0x1449, 0x6591, 0x6591, 0x1330, 0x6597, 0x6597, 0x10FD,
+ 0x6599, 0x6599, 0x11CB, 0x659B, 0x659B, 0x0EB8, 0x659C, 0x659C, 0x1492,
+ 0x659F, 0x659F, 0x1B76, 0x65A1, 0x65A1, 0x16B9, 0x65A4, 0x65A4, 0x0FBB,
+ 0x65A5, 0x65A5, 0x1BE5, 0x65A7, 0x65A7, 0x1406, 0x65AB, 0x65AB, 0x1970,
+ 0x65AC, 0x65AC, 0x1BB0, 0x65AF, 0x65AF, 0x1493, 0x65B0, 0x65B0, 0x166E,
+ 0x65B7, 0x65B7, 0x1067, 0x65B9, 0x65B9, 0x1356, 0x65BC, 0x65BC, 0x1710,
+ 0x65BD, 0x65BD, 0x1647, 0x65C1, 0x65C1, 0x1357, 0x65C5, 0x65C5, 0x115F,
+ 0x65CB, 0x65CB, 0x1532, 0x65CC, 0x65CC, 0x1A40, 0x65CF, 0x65CF, 0x1AAC,
+ 0x65D2, 0x65D2, 0x11E2, 0x65D7, 0x65D7, 0x0FF1, 0x65E0, 0x65E0, 0x12D3,
+ 0x65E3, 0x65E3, 0x0FF2, 0x65E5, 0x65E5, 0x1940, 0x65E6, 0x65E6, 0x1068,
+ 0x65E8, 0x65E8, 0x1B28, 0x65E9, 0x65E9, 0x1A87, 0x65EC, 0x65EC, 0x160C,
+ 0x65ED, 0x65ED, 0x1857, 0x65F1, 0x65F1, 0x1DD6, 0x65F4, 0x65F4, 0x1841,
+ 0x65FA, 0x65FA, 0x17EF, 0x65FB, 0x65FC, 0x130B, 0x65FD, 0x65FD, 0x10E2,
+ 0x65FF, 0x65FF, 0x17B1, 0x6606, 0x6606, 0x0EC1, 0x6607, 0x6607, 0x1638,
+ 0x6609, 0x6609, 0x1358, 0x660A, 0x660A, 0x1E82, 0x660C, 0x660C, 0x1BBD,
+ 0x660E, 0x660E, 0x128F, 0x660F, 0x660F, 0x1EA5, 0x6610, 0x6610, 0x1429,
+ 0x6611, 0x6611, 0x0FC9, 0x6613, 0x6613, 0x173E, 0x6614, 0x6614, 0x151F,
+ 0x6615, 0x6615, 0x1F53, 0x661E, 0x661E, 0x13B6, 0x661F, 0x661F, 0x1568,
+ 0x6620, 0x6620, 0x1775, 0x6625, 0x6625, 0x1C84, 0x6627, 0x6627, 0x1268,
+ 0x6628, 0x6628, 0x1971, 0x662D, 0x662D, 0x1586, 0x662F, 0x662F, 0x1648,
+ 0x6630, 0x6630, 0x1DC5, 0x6631, 0x6631, 0x1858, 0x6634, 0x6634, 0x12C5,
+ 0x6636, 0x6636, 0x1BBE, 0x663A, 0x663A, 0x13B7, 0x663B, 0x663B, 0x16CC,
+ 0x6641, 0x6641, 0x1A88, 0x6642, 0x6642, 0x1649, 0x6643, 0x6644, 0x1EE7,
+ 0x6649, 0x6649, 0x1B49, 0x664B, 0x664B, 0x1B4A, 0x664F, 0x664F, 0x16B2,
+ 0x6659, 0x6659, 0x1AFC, 0x665B, 0x665B, 0x1E3A, 0x665D, 0x665D, 0x1AD9,
+ 0x665E, 0x665E, 0x1F6E, 0x665F, 0x665F, 0x1569, 0x6664, 0x6664, 0x17B2,
+ 0x6665, 0x6665, 0x1ED2, 0x6666, 0x6666, 0x1EFF, 0x6667, 0x6667, 0x1E83,
+ 0x6668, 0x6668, 0x166F, 0x6669, 0x6669, 0x1245, 0x666B, 0x666B, 0x1CE8,
+ 0x666E, 0x666E, 0x13C6, 0x666F, 0x666F, 0x0E5C, 0x6673, 0x6673, 0x1520,
+ 0x6674, 0x6674, 0x1C1E, 0x6676, 0x6676, 0x1A41, 0x6677, 0x6677, 0x0F96,
+ 0x6678, 0x6678, 0x1A42, 0x667A, 0x667A, 0x1B29, 0x6684, 0x6684, 0x1F37,
+ 0x6687, 0x6687, 0x0D77, 0x6688, 0x6688, 0x1F34, 0x6689, 0x6689, 0x1F40,
+ 0x668E, 0x668E, 0x1776, 0x6690, 0x6690, 0x1895, 0x6691, 0x6691, 0x1507,
+ 0x6696, 0x6696, 0x102C, 0x6697, 0x6697, 0x16C1, 0x6698, 0x6698, 0x16FE,
+ 0x669D, 0x669D, 0x1290, 0x66A0, 0x66A0, 0x0E9E, 0x66A2, 0x66A2, 0x1BBF,
+ 0x66AB, 0x66AB, 0x1980, 0x66AE, 0x66AE, 0x12A4, 0x66B2, 0x66B2, 0x1992,
+ 0x66B3, 0x66B3, 0x1E73, 0x66B4, 0x66B4, 0x1D94, 0x66B9, 0x66B9, 0x1558,
+ 0x66BB, 0x66BB, 0x0E5D, 0x66BE, 0x66BE, 0x10E3, 0x66C4, 0x66C4, 0x176F,
+ 0x66C6, 0x66C6, 0x116B, 0x66C7, 0x66C7, 0x107D, 0x66C9, 0x66C9, 0x1F16,
+ 0x66D6, 0x66D6, 0x16D5, 0x66D9, 0x66D9, 0x1508, 0x66DC, 0x66DC, 0x1808,
+ 0x66DD, 0x66DD, 0x1D95, 0x66E0, 0x66E0, 0x0F04, 0x66E6, 0x66E6, 0x1F6F,
+ 0x66F0, 0x66F0, 0x17ED, 0x66F2, 0x66F2, 0x0EB9, 0x66F3, 0x66F3, 0x1791,
+ 0x66F4, 0x66F4, 0x0E5E, 0x66F7, 0x66F7, 0x0DAE, 0x66F8, 0x66F8, 0x1509,
+ 0x66F9, 0x66F9, 0x1A8A, 0x66FA, 0x66FA, 0x1A89, 0x66FC, 0x66FC, 0x1246,
+ 0x66FE, 0x66FE, 0x1B15, 0x66FF, 0x66FF, 0x1C26, 0x6700, 0x6700, 0x1C60,
+ 0x6703, 0x6703, 0x1F00, 0x6708, 0x6708, 0x1889, 0x6709, 0x6709, 0x18B6,
+ 0x670B, 0x670B, 0x1438, 0x670D, 0x670D, 0x13D8, 0x6714, 0x6714, 0x14B6,
+ 0x6715, 0x6715, 0x1B77, 0x6717, 0x6717, 0x113D, 0x671B, 0x671B, 0x125C,
+ 0x671D, 0x671D, 0x1A8B, 0x671E, 0x671F, 0x0FF3, 0x6726, 0x6726, 0x12BE,
+ 0x6727, 0x6727, 0x11BA, 0x6728, 0x6728, 0x12B4, 0x672A, 0x672A, 0x12F9,
+ 0x672B, 0x672B, 0x1253, 0x672C, 0x672C, 0x13E3, 0x672D, 0x672D, 0x1BA8,
+ 0x672E, 0x672E, 0x1C88, 0x6731, 0x6731, 0x1ADA, 0x6734, 0x6734, 0x131B,
+ 0x6736, 0x6736, 0x1CDC, 0x673A, 0x673A, 0x0F90, 0x673D, 0x673D, 0x1F27,
+ 0x6746, 0x6746, 0x0D9D, 0x6749, 0x6749, 0x14C9, 0x674E, 0x674E, 0x120C,
+ 0x674F, 0x674F, 0x1E1B, 0x6750, 0x6750, 0x19AF, 0x6751, 0x6751, 0x1C51,
+ 0x6753, 0x6753, 0x1D9C, 0x6756, 0x6756, 0x1993, 0x675C, 0x675C, 0x10FE,
+ 0x675E, 0x675E, 0x0FF5, 0x675F, 0x675F, 0x15A3, 0x676D, 0x676D, 0x1DFD,
+ 0x676F, 0x676F, 0x136F, 0x6770, 0x6770, 0x0E1F, 0x6771, 0x6771, 0x10F1,
+ 0x6773, 0x6773, 0x12C6, 0x6775, 0x6775, 0x19C6, 0x6777, 0x6777, 0x1D38,
+ 0x677B, 0x677B, 0x1057, 0x677E, 0x677E, 0x15B3, 0x677F, 0x677F, 0x1D44,
+ 0x6787, 0x6787, 0x144A, 0x6789, 0x6789, 0x17F0, 0x678B, 0x678B, 0x1359,
+ 0x678F, 0x678F, 0x1032, 0x6790, 0x6790, 0x1521, 0x6793, 0x6793, 0x10FF,
+ 0x6795, 0x6795, 0x1CC9, 0x6797, 0x6797, 0x1227, 0x679A, 0x679A, 0x1269,
+ 0x679C, 0x679C, 0x0EDD, 0x679D, 0x679D, 0x1B2A, 0x67AF, 0x67AF, 0x0E9F,
+ 0x67B0, 0x67B0, 0x1D6B, 0x67B3, 0x67B3, 0x1B2B, 0x67B6, 0x67B7, 0x0D78,
+ 0x67B8, 0x67B8, 0x0F49, 0x67BE, 0x67BE, 0x164A, 0x67C4, 0x67C4, 0x13B8,
+ 0x67CF, 0x67CF, 0x137F, 0x67D0, 0x67D0, 0x12A5, 0x67D1, 0x67D1, 0x0DBE,
+ 0x67D2, 0x67D2, 0x1CC5, 0x67D3, 0x67D3, 0x1766, 0x67D4, 0x67D4, 0x18B7,
+ 0x67DA, 0x67DA, 0x18B8, 0x67DD, 0x67DD, 0x1CE9, 0x67E9, 0x67E9, 0x0F4A,
+ 0x67EC, 0x67EC, 0x0D9E, 0x67EF, 0x67EF, 0x0D7A, 0x67F0, 0x67F0, 0x103D,
+ 0x67F1, 0x67F1, 0x1ADB, 0x67F3, 0x67F3, 0x11E3, 0x67F4, 0x67F4, 0x164B,
+ 0x67F5, 0x67F5, 0x1BD7, 0x67F6, 0x67F6, 0x1494, 0x67FB, 0x67FB, 0x1495,
+ 0x67FE, 0x67FE, 0x1A43, 0x6812, 0x6812, 0x160D, 0x6813, 0x6813, 0x1A02,
+ 0x6816, 0x6816, 0x150A, 0x6817, 0x6817, 0x11FA, 0x6821, 0x6821, 0x0F25,
+ 0x6822, 0x6822, 0x1380, 0x682A, 0x682A, 0x1ADC, 0x682F, 0x682F, 0x1859,
+ 0x6838, 0x6838, 0x1E18, 0x6839, 0x6839, 0x0FBC, 0x683C, 0x683C, 0x0E2F,
+ 0x683D, 0x683D, 0x19B0, 0x6840, 0x6840, 0x0E20, 0x6841, 0x6841, 0x1DFE,
+ 0x6842, 0x6842, 0x0E81, 0x6843, 0x6843, 0x10BD, 0x6848, 0x6848, 0x16B3,
+ 0x684E, 0x684E, 0x1B6C, 0x6850, 0x6850, 0x10F2, 0x6851, 0x6851, 0x14E2,
+ 0x6853, 0x6853, 0x1ED3, 0x6854, 0x6854, 0x1022, 0x686D, 0x686D, 0x1B4B,
+ 0x6876, 0x6876, 0x1D1E, 0x687F, 0x687F, 0x0D9F, 0x6881, 0x6881, 0x114F,
+ 0x6885, 0x6885, 0x126A, 0x688F, 0x688F, 0x0EBA, 0x6893, 0x6893, 0x19B1,
+ 0x6894, 0x6894, 0x1CAE, 0x6897, 0x6897, 0x0E5F, 0x689D, 0x689D, 0x1A8C,
+ 0x689F, 0x689F, 0x1F17, 0x68A1, 0x68A1, 0x17DE, 0x68A2, 0x68A2, 0x1C34,
+ 0x68A7, 0x68A7, 0x17B3, 0x68A8, 0x68A8, 0x120D, 0x68AD, 0x68AD, 0x1496,
+ 0x68AF, 0x68AF, 0x1A6F, 0x68B0, 0x68B0, 0x0E82, 0x68B1, 0x68B1, 0x0EC2,
+ 0x68B3, 0x68B3, 0x1587, 0x68B5, 0x68B5, 0x1393, 0x68B6, 0x68B6, 0x12FA,
+ 0x68C4, 0x68C4, 0x0FF7, 0x68C5, 0x68C5, 0x13B9, 0x68C9, 0x68C9, 0x1282,
+ 0x68CB, 0x68CB, 0x0FF6, 0x68CD, 0x68CD, 0x0EC3, 0x68D2, 0x68D2, 0x13EB,
+ 0x68D5, 0x68D5, 0x1ABA, 0x68D7, 0x68D7, 0x1A8D, 0x68D8, 0x68D8, 0x0FB4,
+ 0x68DA, 0x68DA, 0x1439, 0x68DF, 0x68DF, 0x10F3, 0x68E0, 0x68E0, 0x1095,
+ 0x68E7, 0x68E7, 0x197B, 0x68E8, 0x68E8, 0x0E83, 0x68EE, 0x68EE, 0x14CA,
+ 0x68F2, 0x68F2, 0x150B, 0x68F9, 0x68F9, 0x10BE, 0x68FA, 0x68FA, 0x0EEF,
+ 0x6900, 0x6900, 0x17DF, 0x6905, 0x6905, 0x1901, 0x690D, 0x690D, 0x165D,
+ 0x690E, 0x690E, 0x1C64, 0x6912, 0x6912, 0x1C35, 0x6927, 0x6927, 0x1291,
+ 0x6930, 0x6930, 0x16EC, 0x693D, 0x693D, 0x174C, 0x693F, 0x693F, 0x1C85,
+ 0x694A, 0x694A, 0x16FF, 0x6953, 0x6953, 0x1DA8, 0x6954, 0x6954, 0x154C,
+ 0x6955, 0x6955, 0x1CDD, 0x6957, 0x6957, 0x0E17, 0x6959, 0x6959, 0x12D4,
+ 0x695A, 0x695A, 0x1C36, 0x695E, 0x695E, 0x1200, 0x6960, 0x6960, 0x1033,
+ 0x6961, 0x6962, 0x18B9, 0x6963, 0x6963, 0x12FB, 0x6968, 0x6968, 0x1A44,
+ 0x696B, 0x696B, 0x1B10, 0x696D, 0x696D, 0x172C, 0x696E, 0x696E, 0x19C7,
+ 0x696F, 0x696F, 0x160E, 0x6975, 0x6975, 0x0FB5, 0x6977, 0x6977, 0x1E0D,
+ 0x6978, 0x6978, 0x1C65, 0x6979, 0x6979, 0x1777, 0x6995, 0x6995, 0x1827,
+ 0x699B, 0x699B, 0x1B4C, 0x699C, 0x699C, 0x135A, 0x69A5, 0x69A5, 0x1EE9,
+ 0x69A7, 0x69A7, 0x144B, 0x69AE, 0x69AE, 0x1778, 0x69B4, 0x69B4, 0x11E4,
+ 0x69BB, 0x69BB, 0x1D02, 0x69C1, 0x69C1, 0x0EA0, 0x69C3, 0x69C3, 0x1331,
+ 0x69CB, 0x69CB, 0x0F4B, 0x69CC, 0x69CC, 0x1D24, 0x69CD, 0x69CD, 0x1BC0,
+ 0x69D0, 0x69D0, 0x0F16, 0x69E8, 0x69E8, 0x0EE8, 0x69EA, 0x69EA, 0x0DF1,
+ 0x69FB, 0x69FB, 0x0F9E, 0x69FD, 0x69FD, 0x1A8E, 0x69FF, 0x69FF, 0x0FBD,
+ 0x6A02, 0x6A02, 0x16A8, 0x6A0A, 0x6A0A, 0x1385, 0x6A11, 0x6A11, 0x1150,
+ 0x6A13, 0x6A13, 0x11D7, 0x6A17, 0x6A17, 0x19C8, 0x6A19, 0x6A19, 0x1D9D,
+ 0x6A1E, 0x6A1E, 0x1C66, 0x6A1F, 0x6A1F, 0x1994, 0x6A21, 0x6A21, 0x12A6,
+ 0x6A23, 0x6A23, 0x1700, 0x6A35, 0x6A35, 0x1C37, 0x6A38, 0x6A38, 0x131C,
+ 0x6A39, 0x6A39, 0x15D1, 0x6A3A, 0x6A3A, 0x1EBA, 0x6A3D, 0x6A3D, 0x1AFD,
+ 0x6A44, 0x6A44, 0x0DBF, 0x6A48, 0x6A48, 0x1809, 0x6A4B, 0x6A4B, 0x0F26,
+ 0x6A52, 0x6A52, 0x185F, 0x6A53, 0x6A53, 0x160F, 0x6A58, 0x6A58, 0x0FAF,
+ 0x6A59, 0x6A59, 0x110E, 0x6A5F, 0x6A5F, 0x0FF8, 0x6A61, 0x6A61, 0x14E3,
+ 0x6A6B, 0x6A6B, 0x1F0F, 0x6A80, 0x6A80, 0x1069, 0x6A84, 0x6A84, 0x0E30,
+ 0x6A89, 0x6A89, 0x1A45, 0x6A8D, 0x6A8D, 0x171B, 0x6A8E, 0x6A8E, 0x0FCA,
+ 0x6A97, 0x6A97, 0x13A0, 0x6A9C, 0x6A9C, 0x1F01, 0x6AA2, 0x6AA2, 0x0E24,
+ 0x6AA3, 0x6AA3, 0x1995, 0x6AB3, 0x6AB3, 0x146B, 0x6ABB, 0x6ABB, 0x1DE8,
+ 0x6AC2, 0x6AC2, 0x10BF, 0x6AC3, 0x6AC3, 0x0F91, 0x6AD3, 0x6AD3, 0x11A2,
+ 0x6ADA, 0x6ADA, 0x1160, 0x6ADB, 0x6ADB, 0x1B0F, 0x6AF6, 0x6AF6, 0x1E2C,
+ 0x6AFB, 0x6AFB, 0x16E2, 0x6B04, 0x6B04, 0x1127, 0x6B0A, 0x6B0A, 0x0F88,
+ 0x6B0C, 0x6B0C, 0x1996, 0x6B12, 0x6B12, 0x1128, 0x6B16, 0x6B16, 0x1132,
+ 0x6B20, 0x6B20, 0x1F5B, 0x6B21, 0x6B21, 0x1B88, 0x6B23, 0x6B23, 0x1F54,
+ 0x6B32, 0x6B32, 0x1819, 0x6B3A, 0x6B3A, 0x0FF9, 0x6B3D, 0x6B3D, 0x1F5C,
+ 0x6B3E, 0x6B3E, 0x0EF0, 0x6B46, 0x6B46, 0x1F5D, 0x6B47, 0x6B47, 0x1E2F,
+ 0x6B4C, 0x6B4C, 0x0D7B, 0x6B4E, 0x6B4E, 0x1CF5, 0x6B50, 0x6B50, 0x0F4C,
+ 0x6B5F, 0x6B5F, 0x1731, 0x6B61, 0x6B61, 0x1ED1, 0x6B62, 0x6B62, 0x1B2C,
+ 0x6B63, 0x6B63, 0x1A46, 0x6B64, 0x6B64, 0x1B89, 0x6B65, 0x6B65, 0x13C7,
+ 0x6B66, 0x6B66, 0x12D5, 0x6B6A, 0x6B6A, 0x17F5, 0x6B72, 0x6B72, 0x1576,
+ 0x6B77, 0x6B77, 0x116C, 0x6B78, 0x6B78, 0x0F97, 0x6B7B, 0x6B7B, 0x1497,
+ 0x6B7F, 0x6B7F, 0x12BB, 0x6B83, 0x6B83, 0x16CD, 0x6B84, 0x6B84, 0x1B4D,
+ 0x6B86, 0x6B86, 0x1D0C, 0x6B89, 0x6B89, 0x1610, 0x6B8A, 0x6B8A, 0x15D2,
+ 0x6B96, 0x6B96, 0x165E, 0x6B98, 0x6B98, 0x197C, 0x6B9E, 0x6B9E, 0x1860,
+ 0x6BAE, 0x6BAE, 0x1185, 0x6BAF, 0x6BAF, 0x146C, 0x6BB2, 0x6BB2, 0x1559,
+ 0x6BB5, 0x6BB5, 0x106A, 0x6BB7, 0x6BB7, 0x18E8, 0x6BBA, 0x6BBA, 0x14C5,
+ 0x6BBC, 0x6BBC, 0x0D8E, 0x6BBF, 0x6BBF, 0x1A03, 0x6BC1, 0x6BC1, 0x1F3C,
+ 0x6BC5, 0x6BC5, 0x1902, 0x6BC6, 0x6BC6, 0x0F4D, 0x6BCB, 0x6BCB, 0x12D6,
+ 0x6BCD, 0x6BCD, 0x12A7, 0x6BCF, 0x6BCF, 0x126B, 0x6BD2, 0x6BD2, 0x10D5,
+ 0x6BD3, 0x6BD3, 0x18D4, 0x6BD4, 0x6BD4, 0x144C, 0x6BD6, 0x6BD8, 0x144D,
+ 0x6BDB, 0x6BDB, 0x12A8, 0x6BEB, 0x6BEB, 0x1E84, 0x6BEC, 0x6BEC, 0x0F4E,
+ 0x6C08, 0x6C08, 0x1A04, 0x6C0F, 0x6C0F, 0x168E, 0x6C11, 0x6C11, 0x130D,
+ 0x6C13, 0x6C13, 0x1278, 0x6C23, 0x6C23, 0x0FFA, 0x6C34, 0x6C34, 0x15D3,
+ 0x6C37, 0x6C37, 0x1476, 0x6C38, 0x6C38, 0x1779, 0x6C3E, 0x6C3E, 0x1394,
+ 0x6C40, 0x6C40, 0x1A47, 0x6C41, 0x6C41, 0x1B11, 0x6C42, 0x6C42, 0x0F4F,
+ 0x6C4E, 0x6C4E, 0x1395, 0x6C50, 0x6C50, 0x1522, 0x6C55, 0x6C55, 0x14BB,
+ 0x6C57, 0x6C57, 0x1DD7, 0x6C5A, 0x6C5A, 0x17B4, 0x6C5D, 0x6C5D, 0x1732,
+ 0x6C5E, 0x6C5E, 0x1EAF, 0x6C5F, 0x6C5F, 0x0DD9, 0x6C60, 0x6C60, 0x1B2D,
+ 0x6C68, 0x6C68, 0x0EC8, 0x6C6A, 0x6C6A, 0x17F1, 0x6C6D, 0x6C6D, 0x1792,
+ 0x6C70, 0x6C70, 0x1D0D, 0x6C72, 0x6C72, 0x0FD7, 0x6C76, 0x6C76, 0x12E9,
+ 0x6C7A, 0x6C7A, 0x0E41, 0x6C7D, 0x6C7D, 0x0FFB, 0x6C7E, 0x6C7E, 0x142A,
+ 0x6C81, 0x6C81, 0x1685, 0x6C82, 0x6C82, 0x0FFC, 0x6C83, 0x6C83, 0x17BF,
+ 0x6C85, 0x6C85, 0x187B, 0x6C86, 0x6C86, 0x1DFF, 0x6C87, 0x6C87, 0x174D,
+ 0x6C88, 0x6C88, 0x1CCA, 0x6C8C, 0x6C8C, 0x10E4, 0x6C90, 0x6C90, 0x12B5,
+ 0x6C92, 0x6C92, 0x12BC, 0x6C93, 0x6C93, 0x108A, 0x6C94, 0x6C94, 0x1283,
+ 0x6C95, 0x6C95, 0x12F1, 0x6C96, 0x6C96, 0x1C8C, 0x6C99, 0x6C99, 0x1498,
+ 0x6C9A, 0x6C9A, 0x1B2E, 0x6C9B, 0x6C9B, 0x1D52, 0x6CAB, 0x6CAB, 0x1254,
+ 0x6CAE, 0x6CAE, 0x19C9, 0x6CB3, 0x6CB3, 0x1DC6, 0x6CB8, 0x6CB8, 0x1450,
+ 0x6CB9, 0x6CB9, 0x18BB, 0x6CBB, 0x6CBB, 0x1CAF, 0x6CBC, 0x6CBC, 0x1588,
+ 0x6CBD, 0x6CBD, 0x0EA1, 0x6CBE, 0x6CBE, 0x1C0B, 0x6CBF, 0x6CBF, 0x174E,
+ 0x6CC1, 0x6CC1, 0x1EEA, 0x6CC2, 0x6CC2, 0x1E60, 0x6CC4, 0x6CC4, 0x154D,
+ 0x6CC9, 0x6CC9, 0x1BF2, 0x6CCA, 0x6CCA, 0x131D, 0x6CCC, 0x6CCC, 0x1DB7,
+ 0x6CD3, 0x6CD3, 0x1EB0, 0x6CD5, 0x6CD5, 0x139A, 0x6CD7, 0x6CD7, 0x1499,
+ 0x6CDB, 0x6CDB, 0x1396, 0x6CE1, 0x6CE1, 0x1D84, 0x6CE2, 0x6CE2, 0x1D39,
+ 0x6CE3, 0x6CE3, 0x18F4, 0x6CE5, 0x6CE5, 0x105B, 0x6CE8, 0x6CE8, 0x1ADD,
+ 0x6CEB, 0x6CEB, 0x1E3B, 0x6CEE, 0x6CEE, 0x1332, 0x6CEF, 0x6CEF, 0x130E,
+ 0x6CF0, 0x6CF0, 0x1D0E, 0x6CF3, 0x6CF3, 0x177A, 0x6D0B, 0x6D0B, 0x1701,
+ 0x6D0C, 0x6D0C, 0x1180, 0x6D11, 0x6D11, 0x13C8, 0x6D17, 0x6D17, 0x1577,
+ 0x6D19, 0x6D19, 0x15D4, 0x6D1B, 0x6D1B, 0x111E, 0x6D1E, 0x6D1E, 0x10F4,
+ 0x6D25, 0x6D25, 0x1B4E, 0x6D27, 0x6D27, 0x18BC, 0x6D29, 0x6D29, 0x154E,
+ 0x6D2A, 0x6D2A, 0x1EB1, 0x6D32, 0x6D32, 0x1ADE, 0x6D35, 0x6D35, 0x1611,
+ 0x6D36, 0x6D36, 0x1F50, 0x6D38, 0x6D38, 0x0F05, 0x6D39, 0x6D39, 0x187C,
+ 0x6D3B, 0x6D3B, 0x1EDB, 0x6D3D, 0x6D3D, 0x1F60, 0x6D3E, 0x6D3E, 0x1D3A,
+ 0x6D41, 0x6D41, 0x11E5, 0x6D59, 0x6D59, 0x1A1F, 0x6D5A, 0x6D5A, 0x1AFE,
+ 0x6D5C, 0x6D5C, 0x146D, 0x6D63, 0x6D63, 0x17E0, 0x6D66, 0x6D66, 0x1D85,
+ 0x6D69, 0x6D69, 0x1E85, 0x6D6A, 0x6D6A, 0x113E, 0x6D6C, 0x6D6C, 0x120E,
+ 0x6D6E, 0x6D6E, 0x1407, 0x6D74, 0x6D74, 0x181A, 0x6D77, 0x6D77, 0x1E0E,
+ 0x6D78, 0x6D78, 0x1CCB, 0x6D79, 0x6D79, 0x1E54, 0x6D7F, 0x6D7F, 0x1D53,
+ 0x6D85, 0x6D85, 0x1762, 0x6D87, 0x6D87, 0x0E60, 0x6D88, 0x6D88, 0x1589,
+ 0x6D89, 0x6D89, 0x1560, 0x6D8C, 0x6D8C, 0x1828, 0x6D8D, 0x6D8D, 0x1F18,
+ 0x6D8E, 0x6D8E, 0x174F, 0x6D91, 0x6D91, 0x15A4, 0x6D93, 0x6D93, 0x1750,
+ 0x6D95, 0x6D95, 0x1C27, 0x6DAF, 0x6DAF, 0x16D6, 0x6DB2, 0x6DB2, 0x16DE,
+ 0x6DB5, 0x6DB5, 0x1DE9, 0x6DC0, 0x6DC0, 0x1A48, 0x6DC3, 0x6DC3, 0x0F89,
+ 0x6DC4, 0x6DC4, 0x1CB0, 0x6DC5, 0x6DC5, 0x1523, 0x6DC6, 0x6DC6, 0x1F19,
+ 0x6DC7, 0x6DC7, 0x0FFD, 0x6DCB, 0x6DCB, 0x1228, 0x6DCF, 0x6DCF, 0x1E86,
+ 0x6DD1, 0x6DD1, 0x1601, 0x6DD8, 0x6DD8, 0x10C0, 0x6DD9, 0x6DD9, 0x1ABB,
+ 0x6DDA, 0x6DDA, 0x11D8, 0x6DDE, 0x6DDE, 0x15B4, 0x6DE1, 0x6DE1, 0x107E,
+ 0x6DE8, 0x6DE8, 0x1A49, 0x6DEA, 0x6DEA, 0x11F5, 0x6DEB, 0x6DEB, 0x18EE,
+ 0x6DEE, 0x6DEE, 0x1F02, 0x6DF1, 0x6DF1, 0x1686, 0x6DF3, 0x6DF3, 0x1612,
+ 0x6DF5, 0x6DF5, 0x1751, 0x6DF7, 0x6DF7, 0x1EA6, 0x6DF8, 0x6DF8, 0x1C1F,
+ 0x6DF9, 0x6DF9, 0x172A, 0x6DFA, 0x6DFA, 0x1BF3, 0x6DFB, 0x6DFB, 0x1C0C,
+ 0x6E17, 0x6E17, 0x14CB, 0x6E19, 0x6E19, 0x1ED4, 0x6E1A, 0x6E1A, 0x19CA,
+ 0x6E1B, 0x6E1B, 0x0DC0, 0x6E1F, 0x6E1F, 0x1A4A, 0x6E20, 0x6E20, 0x0E09,
+ 0x6E21, 0x6E21, 0x10C1, 0x6E23, 0x6E23, 0x149A, 0x6E24, 0x6E24, 0x1345,
+ 0x6E25, 0x6E25, 0x16A9, 0x6E26, 0x6E26, 0x17D3, 0x6E2B, 0x6E2B, 0x154F,
+ 0x6E2C, 0x6E2C, 0x1CA6, 0x6E2D, 0x6E2D, 0x1896, 0x6E2F, 0x6E2F, 0x1E00,
+ 0x6E32, 0x6E32, 0x1533, 0x6E34, 0x6E34, 0x0DAF, 0x6E36, 0x6E36, 0x177B,
+ 0x6E38, 0x6E38, 0x18BD, 0x6E3A, 0x6E3A, 0x12C7, 0x6E3C, 0x6E3C, 0x12FC,
+ 0x6E3D, 0x6E3D, 0x19B2, 0x6E3E, 0x6E3E, 0x1EA7, 0x6E43, 0x6E43, 0x1370,
+ 0x6E44, 0x6E44, 0x12FD, 0x6E4A, 0x6E4A, 0x1ADF, 0x6E4D, 0x6E4D, 0x106B,
+ 0x6E56, 0x6E56, 0x1E87, 0x6E58, 0x6E58, 0x14E4, 0x6E5B, 0x6E5B, 0x107F,
+ 0x6E5C, 0x6E5C, 0x165F, 0x6E5E, 0x6E5E, 0x1A4B, 0x6E5F, 0x6E5F, 0x1EEB,
+ 0x6E67, 0x6E67, 0x1829, 0x6E6B, 0x6E6B, 0x1C67, 0x6E6E, 0x6E6E, 0x1935,
+ 0x6E6F, 0x6E6F, 0x1D05, 0x6E72, 0x6E72, 0x187D, 0x6E73, 0x6E73, 0x1034,
+ 0x6E7A, 0x6E7A, 0x13C9, 0x6E90, 0x6E90, 0x187E, 0x6E96, 0x6E96, 0x1AFF,
+ 0x6E9C, 0x6E9C, 0x11E6, 0x6E9D, 0x6E9D, 0x0F50, 0x6E9F, 0x6E9F, 0x1292,
+ 0x6EA2, 0x6EA2, 0x1941, 0x6EA5, 0x6EA5, 0x1408, 0x6EAA, 0x6EAA, 0x0E84,
+ 0x6EAB, 0x6EAB, 0x17C3, 0x6EAF, 0x6EAF, 0x158A, 0x6EB1, 0x6EB1, 0x1B4F,
+ 0x6EB6, 0x6EB6, 0x182A, 0x6EBA, 0x6EBA, 0x105D, 0x6EC2, 0x6EC2, 0x135B,
+ 0x6EC4, 0x6EC4, 0x1BC1, 0x6EC5, 0x6EC5, 0x128A, 0x6EC9, 0x6EC9, 0x1EEC,
+ 0x6ECB, 0x6ECB, 0x195D, 0x6ECC, 0x6ECC, 0x1BE6, 0x6ECE, 0x6ECE, 0x1E61,
+ 0x6ED1, 0x6ED1, 0x1EDC, 0x6ED3, 0x6ED3, 0x19B3, 0x6ED4, 0x6ED4, 0x10C2,
+ 0x6EEF, 0x6EEF, 0x1C28, 0x6EF4, 0x6EF4, 0x19E1, 0x6EF8, 0x6EF8, 0x1E88,
+ 0x6EFE, 0x6EFE, 0x0EC4, 0x6EFF, 0x6EFF, 0x1247, 0x6F01, 0x6F01, 0x1711,
+ 0x6F02, 0x6F02, 0x1D9E, 0x6F06, 0x6F06, 0x1CC6, 0x6F0F, 0x6F0F, 0x11D9,
+ 0x6F11, 0x6F11, 0x0DF2, 0x6F14, 0x6F14, 0x1752, 0x6F15, 0x6F15, 0x1A8F,
+ 0x6F20, 0x6F20, 0x123A, 0x6F22, 0x6F22, 0x1DD8, 0x6F23, 0x6F23, 0x1174,
+ 0x6F2B, 0x6F2B, 0x1248, 0x6F2C, 0x6F2C, 0x1B2F, 0x6F31, 0x6F31, 0x15D5,
+ 0x6F32, 0x6F32, 0x1BC2, 0x6F38, 0x6F38, 0x1A27, 0x6F3F, 0x6F3F, 0x1997,
+ 0x6F41, 0x6F41, 0x177C, 0x6F51, 0x6F51, 0x1346, 0x6F54, 0x6F54, 0x0E42,
+ 0x6F57, 0x6F57, 0x1B79, 0x6F58, 0x6F58, 0x1333, 0x6F5A, 0x6F5A, 0x1602,
+ 0x6F5B, 0x6F5B, 0x1981, 0x6F5E, 0x6F5E, 0x11A3, 0x6F5F, 0x6F5F, 0x1524,
+ 0x6F62, 0x6F62, 0x1EED, 0x6F64, 0x6F64, 0x18DA, 0x6F6D, 0x6F6D, 0x1080,
+ 0x6F6E, 0x6F6E, 0x1A90, 0x6F70, 0x6F70, 0x0F92, 0x6F7A, 0x6F7A, 0x197D,
+ 0x6F7C, 0x6F7C, 0x10F5, 0x6F7D, 0x6F7D, 0x13CA, 0x6F7E, 0x6F7E, 0x121F,
+ 0x6F81, 0x6F81, 0x14D0, 0x6F84, 0x6F84, 0x1B80, 0x6F88, 0x6F88, 0x1C04,
+ 0x6F8D, 0x6F8D, 0x1AE0, 0x6F8E, 0x6F8E, 0x1D5A, 0x6F90, 0x6F90, 0x1861,
+ 0x6F94, 0x6F94, 0x1E89, 0x6F97, 0x6F97, 0x0DA0, 0x6FA3, 0x6FA3, 0x1DD9,
+ 0x6FA4, 0x6FA4, 0x1D16, 0x6FA7, 0x6FA7, 0x119B, 0x6FAE, 0x6FAE, 0x1F03,
+ 0x6FAF, 0x6FAF, 0x1B97, 0x6FB1, 0x6FB1, 0x1A05, 0x6FB3, 0x6FB3, 0x17B5,
+ 0x6FB9, 0x6FB9, 0x1081, 0x6FBE, 0x6FBE, 0x1075, 0x6FC0, 0x6FC0, 0x0E31,
+ 0x6FC1, 0x6FC1, 0x1CEA, 0x6FC2, 0x6FC2, 0x1186, 0x6FC3, 0x6FC3, 0x104F,
+ 0x6FCA, 0x6FCA, 0x1793, 0x6FD5, 0x6FD5, 0x162D, 0x6FDA, 0x6FDA, 0x177D,
+ 0x6FDF, 0x6FDF, 0x1A70, 0x6FE0, 0x6FE0, 0x1E8A, 0x6FE1, 0x6FE1, 0x18BE,
+ 0x6FE4, 0x6FE4, 0x10C3, 0x6FE9, 0x6FE9, 0x1E8B, 0x6FEB, 0x6FEB, 0x1133,
+ 0x6FEC, 0x6FEC, 0x1B00, 0x6FEF, 0x6FEF, 0x1CEB, 0x6FF1, 0x6FF1, 0x146E,
+ 0x6FFE, 0x6FFE, 0x1161, 0x7001, 0x7001, 0x1702, 0x7005, 0x7005, 0x1E62,
+ 0x7006, 0x7006, 0x10D6, 0x7009, 0x7009, 0x149B, 0x700B, 0x700B, 0x1687,
+ 0x700F, 0x700F, 0x11E7, 0x7011, 0x7011, 0x1D96, 0x7015, 0x7015, 0x146F,
+ 0x7018, 0x7018, 0x11A4, 0x701A, 0x701A, 0x1DDA, 0x701B, 0x701B, 0x177E,
+ 0x701C, 0x701C, 0x18E2, 0x701D, 0x701D, 0x116D, 0x701E, 0x701E, 0x1A4C,
+ 0x701F, 0x701F, 0x158B, 0x7023, 0x7023, 0x1E0F, 0x7027, 0x7027, 0x11BB,
+ 0x7028, 0x7028, 0x11C0, 0x702F, 0x702F, 0x177F, 0x7037, 0x7037, 0x1925,
+ 0x703E, 0x703E, 0x1129, 0x704C, 0x704C, 0x0EF1, 0x7050, 0x7050, 0x1E63,
+ 0x7051, 0x7051, 0x15BA, 0x7058, 0x7058, 0x1CF6, 0x705D, 0x705D, 0x1E8C,
+ 0x7063, 0x7063, 0x1249, 0x706B, 0x706B, 0x1EBB, 0x7070, 0x7070, 0x1F04,
+ 0x7078, 0x7078, 0x0F51, 0x707C, 0x707C, 0x1972, 0x707D, 0x707D, 0x19B4,
+ 0x7085, 0x7085, 0x0E61, 0x708A, 0x708A, 0x1C99, 0x708E, 0x708E, 0x1767,
+ 0x7092, 0x7092, 0x1C38, 0x7098, 0x7098, 0x1F55, 0x7099, 0x7099, 0x195E,
+ 0x709A, 0x709A, 0x0F06, 0x70A1, 0x70A1, 0x1A4D, 0x70A4, 0x70A4, 0x158C,
+ 0x70AB, 0x70AB, 0x1E3C, 0x70AC, 0x70AC, 0x0E0A, 0x70AD, 0x70AD, 0x1CF7,
+ 0x70AF, 0x70AF, 0x1E64, 0x70B3, 0x70B3, 0x13BA, 0x70B7, 0x70B7, 0x1AE1,
+ 0x70B8, 0x70B8, 0x1973, 0x70B9, 0x70B9, 0x1A28, 0x70C8, 0x70C8, 0x1181,
+ 0x70CB, 0x70CB, 0x1F47, 0x70CF, 0x70CF, 0x17B6, 0x70D8, 0x70D8, 0x1EB2,
+ 0x70D9, 0x70D9, 0x111F, 0x70DD, 0x70DD, 0x1B17, 0x70DF, 0x70DF, 0x1753,
+ 0x70F1, 0x70F1, 0x0E62, 0x70F9, 0x70F9, 0x1D5B, 0x70FD, 0x70FD, 0x13EC,
+ 0x7104, 0x7104, 0x1F2F, 0x7109, 0x7109, 0x1720, 0x710C, 0x710C, 0x1B01,
+ 0x7119, 0x7119, 0x1371, 0x711A, 0x711A, 0x142B, 0x711E, 0x711E, 0x10E5,
+ 0x7121, 0x7121, 0x12D7, 0x7126, 0x7126, 0x1C39, 0x7130, 0x7130, 0x1768,
+ 0x7136, 0x7136, 0x1754, 0x7147, 0x7147, 0x1F41, 0x7149, 0x7149, 0x1175,
+ 0x714A, 0x714A, 0x1F38, 0x714C, 0x714C, 0x1EEE, 0x714E, 0x714E, 0x1A06,
+ 0x7150, 0x7150, 0x1780, 0x7156, 0x7156, 0x102D, 0x7159, 0x7159, 0x1755,
+ 0x715C, 0x715C, 0x185A, 0x715E, 0x715E, 0x14C6, 0x7164, 0x7164, 0x126C,
+ 0x7165, 0x7165, 0x1ED5, 0x7166, 0x7166, 0x1F28, 0x7167, 0x7167, 0x1A91,
+ 0x7169, 0x7169, 0x1386, 0x716C, 0x716C, 0x1703, 0x716E, 0x716E, 0x195F,
+ 0x717D, 0x717D, 0x1534, 0x7184, 0x7184, 0x1660, 0x7189, 0x7189, 0x1862,
+ 0x718A, 0x718A, 0x186D, 0x718F, 0x718F, 0x1F30, 0x7192, 0x7192, 0x1E65,
+ 0x7194, 0x7194, 0x182B, 0x7199, 0x7199, 0x1F70, 0x719F, 0x719F, 0x1603,
+ 0x71A2, 0x71A2, 0x13ED, 0x71AC, 0x71AC, 0x17B7, 0x71B1, 0x71B1, 0x1763,
+ 0x71B9, 0x71BA, 0x1F71, 0x71BE, 0x71BE, 0x1CB1, 0x71C1, 0x71C1, 0x1770,
+ 0x71C3, 0x71C3, 0x1756, 0x71C8, 0x71C8, 0x110F, 0x71C9, 0x71C9, 0x10E6,
+ 0x71CE, 0x71CE, 0x11CC, 0x71D0, 0x71D0, 0x1220, 0x71D2, 0x71D2, 0x158D,
+ 0x71D4, 0x71D4, 0x1387, 0x71D5, 0x71D5, 0x1757, 0x71DF, 0x71DF, 0x1781,
+ 0x71E5, 0x71E5, 0x1A92, 0x71E6, 0x71E6, 0x1B98, 0x71E7, 0x71E7, 0x15D6,
+ 0x71ED, 0x71ED, 0x1C4B, 0x71EE, 0x71EE, 0x1561, 0x71FB, 0x71FB, 0x1F31,
+ 0x71FC, 0x71FC, 0x1670, 0x71FE, 0x71FE, 0x10C4, 0x71FF, 0x71FF, 0x180A,
+ 0x7200, 0x7200, 0x1E33, 0x7206, 0x7206, 0x1D97, 0x7210, 0x7210, 0x11A5,
+ 0x721B, 0x721B, 0x112A, 0x722A, 0x722A, 0x1A93, 0x722C, 0x722C, 0x1D3B,
+ 0x722D, 0x722D, 0x19BB, 0x7230, 0x7230, 0x187F, 0x7232, 0x7232, 0x1897,
+ 0x7235, 0x7235, 0x1974, 0x7236, 0x7236, 0x1409, 0x723A, 0x723A, 0x16ED,
+ 0x723B, 0x723B, 0x1F1A, 0x723D, 0x723D, 0x14E5, 0x723E, 0x723E, 0x1916,
+ 0x7240, 0x7240, 0x14E6, 0x7246, 0x7246, 0x1998, 0x7247, 0x7247, 0x1D61,
+ 0x7248, 0x7248, 0x1D45, 0x724C, 0x724C, 0x1D54, 0x7252, 0x7252, 0x1C17,
+ 0x7258, 0x7258, 0x10D7, 0x7259, 0x7259, 0x1696, 0x725B, 0x725B, 0x1842,
+ 0x725D, 0x725D, 0x1470, 0x725F, 0x725F, 0x12A9, 0x7261, 0x7261, 0x12AA,
+ 0x7262, 0x7262, 0x11C1, 0x7267, 0x7267, 0x12B6, 0x7269, 0x7269, 0x12F2,
+ 0x7272, 0x7272, 0x14F9, 0x7279, 0x7279, 0x1D30, 0x727D, 0x727D, 0x0E36,
+ 0x7280, 0x7280, 0x150C, 0x7281, 0x7281, 0x120F, 0x72A2, 0x72A2, 0x10D8,
+ 0x72A7, 0x72A7, 0x1F73, 0x72AC, 0x72AC, 0x0E37, 0x72AF, 0x72AF, 0x1397,
+ 0x72C0, 0x72C0, 0x14E7, 0x72C2, 0x72C2, 0x0F07, 0x72C4, 0x72C4, 0x19E2,
+ 0x72CE, 0x72CE, 0x16C7, 0x72D0, 0x72D0, 0x1E8D, 0x72D7, 0x72D7, 0x0F52,
+ 0x72D9, 0x72D9, 0x19CB, 0x72E1, 0x72E1, 0x0F27, 0x72E9, 0x72E9, 0x15D7,
+ 0x72F8, 0x72F8, 0x1210, 0x72F9, 0x72F9, 0x1E55, 0x72FC, 0x72FC, 0x113F,
+ 0x72FD, 0x72FD, 0x1D55, 0x730A, 0x730A, 0x1794, 0x7316, 0x7316, 0x1BC3,
+ 0x731B, 0x731B, 0x1279, 0x731C, 0x731C, 0x164C, 0x731D, 0x731D, 0x1AB4,
+ 0x7325, 0x7325, 0x17FA, 0x7329, 0x7329, 0x156A, 0x732A, 0x732A, 0x19CC,
+ 0x732B, 0x732B, 0x12C8, 0x7336, 0x7337, 0x18BF, 0x733E, 0x733E, 0x1EDD,
+ 0x733F, 0x733F, 0x1880, 0x7344, 0x7344, 0x17C0, 0x7345, 0x7345, 0x149C,
+ 0x7350, 0x7350, 0x1999, 0x7352, 0x7352, 0x17B8, 0x7357, 0x7357, 0x0F8C,
+ 0x7368, 0x7368, 0x10D9, 0x736A, 0x736A, 0x1F05, 0x7370, 0x7370, 0x1782,
+ 0x7372, 0x7372, 0x1F0D, 0x7375, 0x7375, 0x1188, 0x7378, 0x7378, 0x15D8,
+ 0x737A, 0x737A, 0x1076, 0x737B, 0x737B, 0x1E2D, 0x7384, 0x7384, 0x1E3D,
+ 0x7386, 0x7386, 0x1960, 0x7387, 0x7387, 0x15B0, 0x7389, 0x7389, 0x17C1,
+ 0x738B, 0x738B, 0x17F2, 0x738E, 0x738E, 0x1A4E, 0x7394, 0x7394, 0x1BF4,
+ 0x7396, 0x7396, 0x0F53, 0x7397, 0x7397, 0x1843, 0x7398, 0x7398, 0x0FFE,
+ 0x739F, 0x739F, 0x130F, 0x73A7, 0x73A7, 0x18DB, 0x73A9, 0x73A9, 0x17E1,
+ 0x73AD, 0x73AD, 0x1471, 0x73B2, 0x73B2, 0x118F, 0x73B3, 0x73B3, 0x10A4,
+ 0x73B9, 0x73B9, 0x1E3E, 0x73C0, 0x73C0, 0x131E, 0x73C2, 0x73C2, 0x0D7C,
+ 0x73C9, 0x73C9, 0x1310, 0x73CA, 0x73CA, 0x14BC, 0x73CC, 0x73CC, 0x1DB8,
+ 0x73CD, 0x73CD, 0x1B50, 0x73CF, 0x73CF, 0x0D8F, 0x73D6, 0x73D6, 0x0F08,
+ 0x73D9, 0x73D9, 0x0ED5, 0x73DD, 0x73DD, 0x1F29, 0x73DE, 0x73DE, 0x1120,
+ 0x73E0, 0x73E0, 0x1AE2, 0x73E3, 0x73E3, 0x1613, 0x73E4, 0x73E4, 0x13CB,
+ 0x73E5, 0x73E5, 0x1917, 0x73E6, 0x73E6, 0x1E21, 0x73E9, 0x73E9, 0x1E66,
+ 0x73EA, 0x73EA, 0x0F9F, 0x73ED, 0x73ED, 0x1334, 0x73F7, 0x73F7, 0x12D8,
+ 0x73F9, 0x73F9, 0x156B, 0x73FD, 0x73FD, 0x1A4F, 0x73FE, 0x73FE, 0x1E3F,
+ 0x7401, 0x7401, 0x1535, 0x7403, 0x7403, 0x0F54, 0x7405, 0x7405, 0x1140,
+ 0x7406, 0x7406, 0x1211, 0x7407, 0x7407, 0x15D9, 0x7409, 0x7409, 0x11E8,
+ 0x7413, 0x7413, 0x17E2, 0x741B, 0x741B, 0x1CCC, 0x7420, 0x7420, 0x1A07,
+ 0x7421, 0x7421, 0x1604, 0x7422, 0x7422, 0x1CEC, 0x7425, 0x7425, 0x1E8E,
+ 0x7426, 0x7426, 0x0FFF, 0x7428, 0x7428, 0x0EC5, 0x742A, 0x742A, 0x1000,
+ 0x742B, 0x742B, 0x13EE, 0x742C, 0x742C, 0x17E3, 0x742E, 0x742E, 0x1ABC,
+ 0x742F, 0x742F, 0x0EF2, 0x7430, 0x7430, 0x1769, 0x7433, 0x7433, 0x1229,
+ 0x7434, 0x7434, 0x0FCB, 0x7435, 0x7435, 0x1451, 0x7436, 0x7436, 0x1D3C,
+ 0x7438, 0x7438, 0x1CED, 0x743A, 0x743A, 0x139B, 0x743F, 0x743F, 0x1EA8,
+ 0x7440, 0x7440, 0x1844, 0x7441, 0x7441, 0x12AB, 0x7443, 0x7443, 0x1C86,
+ 0x7444, 0x7444, 0x1536, 0x744B, 0x744B, 0x1898, 0x7455, 0x7455, 0x1DC7,
+ 0x7457, 0x7457, 0x1881, 0x7459, 0x7459, 0x104D, 0x745A, 0x745A, 0x1E8F,
+ 0x745B, 0x745B, 0x1783, 0x745C, 0x745C, 0x18C1, 0x745E, 0x745E, 0x150D,
+ 0x745F, 0x745F, 0x162A, 0x7460, 0x7460, 0x11E9, 0x7462, 0x7462, 0x182C,
+ 0x7464, 0x7464, 0x180B, 0x7465, 0x7465, 0x17C4, 0x7468, 0x7468, 0x1B51,
+ 0x7469, 0x7469, 0x1E67, 0x746A, 0x746A, 0x1231, 0x746F, 0x746F, 0x1141,
+ 0x747E, 0x747E, 0x0FBE, 0x7482, 0x7482, 0x1001, 0x7483, 0x7483, 0x1212,
+ 0x7487, 0x7487, 0x1537, 0x7489, 0x7489, 0x1176, 0x748B, 0x748B, 0x199A,
+ 0x7498, 0x7498, 0x1221, 0x749C, 0x749C, 0x1EEF, 0x749E, 0x749E, 0x131F,
+ 0x749F, 0x749F, 0x0E63, 0x74A1, 0x74A1, 0x1B52, 0x74A3, 0x74A3, 0x1002,
+ 0x74A5, 0x74A5, 0x0E64, 0x74A7, 0x74A7, 0x13A1, 0x74A8, 0x74A8, 0x1B99,
+ 0x74AA, 0x74AA, 0x1A94, 0x74B0, 0x74B0, 0x1ED6, 0x74B2, 0x74B2, 0x15DA,
+ 0x74B5, 0x74B5, 0x1733, 0x74B9, 0x74B9, 0x1605, 0x74BD, 0x74BD, 0x14F3,
+ 0x74BF, 0x74BF, 0x1538, 0x74C6, 0x74C6, 0x1B6D, 0x74CA, 0x74CA, 0x0E65,
+ 0x74CF, 0x74CF, 0x11BC, 0x74D4, 0x74D4, 0x1784, 0x74D8, 0x74D8, 0x0EF3,
+ 0x74DA, 0x74DA, 0x1B9A, 0x74DC, 0x74DC, 0x0EDE, 0x74E0, 0x74E0, 0x1E90,
+ 0x74E2, 0x74E2, 0x1D9F, 0x74E3, 0x74E3, 0x1D46, 0x74E6, 0x74E6, 0x17D4,
+ 0x74EE, 0x74EE, 0x17CC, 0x74F7, 0x74F7, 0x1961, 0x7501, 0x7501, 0x13BB,
+ 0x7504, 0x7504, 0x0E38, 0x7511, 0x7511, 0x1B18, 0x7515, 0x7515, 0x17CD,
+ 0x7518, 0x7518, 0x0DC1, 0x751A, 0x751A, 0x1688, 0x751B, 0x751B, 0x1C0D,
+ 0x751F, 0x751F, 0x14FA, 0x7523, 0x7523, 0x14BD, 0x7525, 0x7525, 0x14FB,
+ 0x7526, 0x7526, 0x158E, 0x7528, 0x7528, 0x182D, 0x752B, 0x752B, 0x13CC,
+ 0x752C, 0x752C, 0x182E, 0x7530, 0x7530, 0x1A08, 0x7531, 0x7531, 0x18C2,
+ 0x7532, 0x7532, 0x0DCC, 0x7533, 0x7533, 0x1671, 0x7537, 0x7537, 0x1035,
+ 0x7538, 0x7538, 0x1A09, 0x753A, 0x753A, 0x1A50, 0x7547, 0x7547, 0x0FAB,
+ 0x754C, 0x754C, 0x0E85, 0x754F, 0x754F, 0x17FB, 0x7551, 0x7551, 0x1A0A,
+ 0x7553, 0x7553, 0x108B, 0x7554, 0x7554, 0x1335, 0x7559, 0x7559, 0x11EA,
+ 0x755B, 0x755B, 0x1B53, 0x755C, 0x755C, 0x1C79, 0x755D, 0x755D, 0x12D9,
+ 0x7562, 0x7562, 0x1DB9, 0x7565, 0x7565, 0x114A, 0x7566, 0x7566, 0x1F48,
+ 0x756A, 0x756A, 0x1388, 0x756F, 0x756F, 0x1B02, 0x7570, 0x7570, 0x1918,
+ 0x7575, 0x7575, 0x1EBC, 0x7576, 0x7576, 0x1096, 0x7578, 0x7578, 0x1003,
+ 0x757A, 0x757A, 0x0DDA, 0x757F, 0x757F, 0x1004, 0x7586, 0x7586, 0x0DDB,
+ 0x7587, 0x7587, 0x1AE3, 0x758A, 0x758A, 0x1C18, 0x758B, 0x758B, 0x1DBA,
+ 0x758E, 0x758E, 0x1590, 0x758F, 0x758F, 0x158F, 0x7591, 0x7591, 0x1903,
+ 0x759D, 0x759D, 0x14BE, 0x75A5, 0x75A5, 0x0DF3, 0x75AB, 0x75AB, 0x173F,
+ 0x75B1, 0x75B1, 0x1D86, 0x75B2, 0x75B2, 0x1DAF, 0x75B3, 0x75B3, 0x0DC2,
+ 0x75B5, 0x75B5, 0x1962, 0x75B8, 0x75B8, 0x1077, 0x75B9, 0x75B9, 0x1B54,
+ 0x75BC, 0x75BC, 0x10F6, 0x75BD, 0x75BD, 0x19CD, 0x75BE, 0x75BE, 0x1B6E,
+ 0x75C2, 0x75C2, 0x0D7D, 0x75C5, 0x75C5, 0x13BC, 0x75C7, 0x75C7, 0x1B19,
+ 0x75CD, 0x75CD, 0x1919, 0x75D2, 0x75D2, 0x1704, 0x75D4, 0x75D4, 0x1CB2,
+ 0x75D5, 0x75D5, 0x1F56, 0x75D8, 0x75D8, 0x1100, 0x75D9, 0x75D9, 0x0E66,
+ 0x75DB, 0x75DB, 0x1D1F, 0x75E2, 0x75E2, 0x1213, 0x75F0, 0x75F0, 0x1082,
+ 0x75F2, 0x75F2, 0x1232, 0x75F4, 0x75F4, 0x1CB3, 0x75FA, 0x75FA, 0x1452,
+ 0x75FC, 0x75FC, 0x0EA2, 0x7600, 0x7600, 0x1712, 0x760D, 0x760D, 0x1705,
+ 0x7619, 0x7619, 0x1591, 0x761F, 0x761F, 0x17C5, 0x7620, 0x7620, 0x1BE7,
+ 0x7621, 0x7621, 0x1BC4, 0x7622, 0x7622, 0x1336, 0x7624, 0x7624, 0x11EB,
+ 0x7626, 0x7626, 0x15DB, 0x763B, 0x763B, 0x11DA, 0x7642, 0x7642, 0x11CD,
+ 0x764C, 0x764C, 0x16C2, 0x764E, 0x764E, 0x0DA1, 0x7652, 0x7652, 0x18C3,
+ 0x7656, 0x7656, 0x13A2, 0x7661, 0x7661, 0x1CB4, 0x7664, 0x7664, 0x1A20,
+ 0x7669, 0x7669, 0x1118, 0x766C, 0x766C, 0x1539, 0x7670, 0x7670, 0x17CE,
+ 0x7672, 0x7672, 0x1A0B, 0x7678, 0x7678, 0x0E86, 0x767B, 0x767B, 0x1110,
+ 0x767C, 0x767C, 0x1347, 0x767D, 0x767E, 0x1381, 0x7684, 0x7684, 0x19E3,
+ 0x7686, 0x7686, 0x0DF4, 0x7687, 0x7687, 0x1EF0, 0x768E, 0x768E, 0x0F28,
+ 0x7690, 0x7690, 0x0EA3, 0x7693, 0x7693, 0x1E91, 0x76AE, 0x76AE, 0x1DB0,
+ 0x76BA, 0x76BA, 0x1C68, 0x76BF, 0x76BF, 0x1293, 0x76C2, 0x76C2, 0x1845,
+ 0x76C3, 0x76C3, 0x1372, 0x76C6, 0x76C6, 0x142C, 0x76C8, 0x76C8, 0x1785,
+ 0x76CA, 0x76CA, 0x1926, 0x76D2, 0x76D2, 0x1DF1, 0x76D6, 0x76D6, 0x0DF5,
+ 0x76DB, 0x76DB, 0x156C, 0x76DC, 0x76DC, 0x10C5, 0x76DE, 0x76DE, 0x197E,
+ 0x76DF, 0x76DF, 0x127B, 0x76E1, 0x76E1, 0x1B55, 0x76E3, 0x76E3, 0x0DC3,
+ 0x76E4, 0x76E4, 0x1337, 0x76E7, 0x76E7, 0x11A6, 0x76EE, 0x76EE, 0x12B7,
+ 0x76F2, 0x76F2, 0x127A, 0x76F4, 0x76F4, 0x1B3F, 0x76F8, 0x76F8, 0x14E8,
+ 0x76FC, 0x76FC, 0x1338, 0x76FE, 0x76FE, 0x1614, 0x7701, 0x7701, 0x156D,
+ 0x7704, 0x7704, 0x1284, 0x7708, 0x7708, 0x1CFD, 0x7709, 0x7709, 0x12FE,
+ 0x770B, 0x770B, 0x0DA2, 0x771E, 0x771E, 0x1B56, 0x7720, 0x7720, 0x1285,
+ 0x7729, 0x7729, 0x1E40, 0x7737, 0x7737, 0x0F8A, 0x7738, 0x7738, 0x12AC,
+ 0x773A, 0x773A, 0x1A95, 0x773C, 0x773C, 0x16B4, 0x7740, 0x7740, 0x1B91,
+ 0x774D, 0x774D, 0x1E41, 0x775B, 0x775B, 0x1A51, 0x7761, 0x7761, 0x15DC,
+ 0x7763, 0x7763, 0x10DA, 0x7766, 0x7766, 0x12B8, 0x776B, 0x776B, 0x1C19,
+ 0x7779, 0x7779, 0x10C6, 0x777E, 0x777E, 0x0EA4, 0x777F, 0x777F, 0x1795,
+ 0x778B, 0x778B, 0x1B57, 0x7791, 0x7791, 0x1294, 0x779E, 0x779E, 0x124A,
+ 0x77A5, 0x77A5, 0x13AE, 0x77AC, 0x77AC, 0x1615, 0x77AD, 0x77AD, 0x11CE,
+ 0x77B0, 0x77B0, 0x0DC4, 0x77B3, 0x77B3, 0x10F7, 0x77BB, 0x77BB, 0x1C0E,
+ 0x77BC, 0x77BC, 0x0E25, 0x77BF, 0x77BF, 0x0F55, 0x77D7, 0x77D7, 0x1C4C,
+ 0x77DB, 0x77DB, 0x12AD, 0x77DC, 0x77DC, 0x0FDC, 0x77E2, 0x77E2, 0x164D,
+ 0x77E3, 0x77E3, 0x1904, 0x77E5, 0x77E5, 0x1B30, 0x77E9, 0x77E9, 0x0F56,
+ 0x77ED, 0x77ED, 0x106C, 0x77EE, 0x77EE, 0x17F6, 0x77EF, 0x77EF, 0x0F29,
+ 0x77F3, 0x77F3, 0x1525, 0x7802, 0x7802, 0x149D, 0x7812, 0x7812, 0x1453,
+ 0x7825, 0x7825, 0x1B31, 0x7826, 0x7826, 0x1BD0, 0x7827, 0x7827, 0x1CCD,
+ 0x782C, 0x782C, 0x122C, 0x7832, 0x7832, 0x1D87, 0x7834, 0x7834, 0x1D3D,
+ 0x7845, 0x7845, 0x0FA0, 0x784F, 0x784F, 0x1758, 0x785D, 0x785D, 0x1C3A,
+ 0x786B, 0x786B, 0x11EC, 0x786C, 0x786C, 0x0E67, 0x786F, 0x786F, 0x1759,
+ 0x787C, 0x787C, 0x143A, 0x7881, 0x7881, 0x1005, 0x7887, 0x7887, 0x1A52,
+ 0x788C, 0x788C, 0x11B0, 0x788D, 0x788D, 0x16D7, 0x788E, 0x788E, 0x15BB,
+ 0x7891, 0x7891, 0x1454, 0x7897, 0x7897, 0x17E4, 0x78A3, 0x78A3, 0x0DB0,
+ 0x78A7, 0x78A7, 0x13A3, 0x78A9, 0x78A9, 0x1526, 0x78BA, 0x78BB, 0x1EC7,
+ 0x78BC, 0x78BC, 0x1233, 0x78C1, 0x78C1, 0x1963, 0x78C5, 0x78C5, 0x135C,
+ 0x78CA, 0x78CA, 0x11C2, 0x78CB, 0x78CB, 0x1B8A, 0x78CE, 0x78CE, 0x0E87,
+ 0x78D0, 0x78D0, 0x1339, 0x78E8, 0x78E8, 0x1234, 0x78EC, 0x78EC, 0x0E68,
+ 0x78EF, 0x78EF, 0x1006, 0x78F5, 0x78F5, 0x0DA3, 0x78FB, 0x78FB, 0x133A,
+ 0x7901, 0x7901, 0x1C3B, 0x790E, 0x790E, 0x1C3C, 0x7916, 0x7916, 0x1734,
+ 0x792A, 0x792A, 0x1162, 0x792B, 0x792B, 0x116E, 0x792C, 0x792C, 0x133B,
+ 0x793A, 0x793A, 0x164E, 0x793E, 0x793E, 0x149E, 0x7940, 0x7940, 0x149F,
+ 0x7941, 0x7941, 0x1007, 0x7947, 0x7948, 0x1008, 0x7949, 0x7949, 0x1B32,
+ 0x7950, 0x7950, 0x1846, 0x7956, 0x7956, 0x1A96, 0x7957, 0x7957, 0x1B33,
+ 0x795A, 0x795A, 0x1A97, 0x795B, 0x795B, 0x0E0B, 0x795C, 0x795C, 0x1E92,
+ 0x795D, 0x795D, 0x1C7A, 0x795E, 0x795E, 0x1672, 0x7960, 0x7960, 0x14A0,
+ 0x7965, 0x7965, 0x14E9, 0x7968, 0x7968, 0x1DA0, 0x796D, 0x796D, 0x1A71,
+ 0x797A, 0x797A, 0x100A, 0x797F, 0x797F, 0x11B1, 0x7981, 0x7981, 0x0FCC,
+ 0x798D, 0x798D, 0x1EBD, 0x798E, 0x798E, 0x1A53, 0x798F, 0x798F, 0x13D9,
+ 0x7991, 0x7991, 0x1847, 0x79A6, 0x79A6, 0x1713, 0x79A7, 0x79A7, 0x1F74,
+ 0x79AA, 0x79AA, 0x153A, 0x79AE, 0x79AE, 0x119C, 0x79B1, 0x79B1, 0x10C7,
+ 0x79B3, 0x79B3, 0x1706, 0x79B9, 0x79B9, 0x1848, 0x79BD, 0x79BD, 0x0FCD,
+ 0x79BE, 0x79BE, 0x1EBE, 0x79BF, 0x79BF, 0x10DB, 0x79C0, 0x79C0, 0x15DD,
+ 0x79C1, 0x79C1, 0x14A1, 0x79C9, 0x79C9, 0x13BD, 0x79CA, 0x79CA, 0x1042,
+ 0x79CB, 0x79CB, 0x1C69, 0x79D1, 0x79D1, 0x0EDF, 0x79D2, 0x79D2, 0x1C3D,
+ 0x79D5, 0x79D5, 0x1455, 0x79D8, 0x79D8, 0x1456, 0x79DF, 0x79DF, 0x1A98,
+ 0x79E4, 0x79E4, 0x1CD1, 0x79E6, 0x79E6, 0x1B58, 0x79E7, 0x79E7, 0x16CE,
+ 0x79E9, 0x79E9, 0x1B6F, 0x79FB, 0x79FB, 0x191A, 0x7A00, 0x7A00, 0x1F75,
+ 0x7A05, 0x7A05, 0x1578, 0x7A08, 0x7A08, 0x0DA4, 0x7A0B, 0x7A0B, 0x1A54,
+ 0x7A0D, 0x7A0D, 0x1C3E, 0x7A14, 0x7A14, 0x194A, 0x7A17, 0x7A17, 0x1D56,
+ 0x7A19, 0x7A19, 0x1B40, 0x7A1A, 0x7A1A, 0x1CB5, 0x7A1C, 0x7A1C, 0x1201,
+ 0x7A1F, 0x7A1F, 0x1DA7, 0x7A20, 0x7A20, 0x1A99, 0x7A2E, 0x7A2E, 0x1ABD,
+ 0x7A31, 0x7A31, 0x1CD2, 0x7A36, 0x7A36, 0x185B, 0x7A37, 0x7A37, 0x1B41,
+ 0x7A3B, 0x7A3B, 0x10C8, 0x7A3C, 0x7A3C, 0x0D7E, 0x7A3D, 0x7A3D, 0x0E88,
+ 0x7A3F, 0x7A3F, 0x0EA5, 0x7A40, 0x7A40, 0x0EBB, 0x7A46, 0x7A46, 0x12B9,
+ 0x7A49, 0x7A49, 0x1CB6, 0x7A4D, 0x7A4D, 0x19E4, 0x7A4E, 0x7A4E, 0x1786,
+ 0x7A57, 0x7A57, 0x15DE, 0x7A61, 0x7A61, 0x14F6, 0x7A62, 0x7A62, 0x1796,
+ 0x7A69, 0x7A69, 0x17C6, 0x7A6B, 0x7A6B, 0x1EC9, 0x7A70, 0x7A70, 0x1707,
+ 0x7A74, 0x7A74, 0x1E4B, 0x7A76, 0x7A76, 0x0F57, 0x7A79, 0x7A79, 0x0F7D,
+ 0x7A7A, 0x7A7A, 0x0ED6, 0x7A7D, 0x7A7D, 0x1A55, 0x7A7F, 0x7A7F, 0x1BF5,
+ 0x7A81, 0x7A81, 0x10EA, 0x7A84, 0x7A84, 0x1B92, 0x7A88, 0x7A88, 0x180C,
+ 0x7A92, 0x7A92, 0x1B70, 0x7A93, 0x7A93, 0x1BC5, 0x7A95, 0x7A95, 0x1A9A,
+ 0x7A98, 0x7A98, 0x0F72, 0x7A9F, 0x7A9F, 0x0F7A, 0x7AA9, 0x7AAA, 0x17D5,
+ 0x7AAE, 0x7AAE, 0x0F7E, 0x7AAF, 0x7AAF, 0x180D, 0x7ABA, 0x7ABA, 0x0FA1,
+ 0x7AC4, 0x7AC4, 0x1B9B, 0x7AC5, 0x7AC5, 0x0FA2, 0x7AC7, 0x7AC7, 0x1101,
+ 0x7ACA, 0x7ACA, 0x1A21, 0x7ACB, 0x7ACB, 0x122D, 0x7AD7, 0x7AD7, 0x12C9,
+ 0x7AD9, 0x7AD9, 0x1BB1, 0x7ADD, 0x7ADD, 0x13BE, 0x7ADF, 0x7ADF, 0x0E69,
+ 0x7AE0, 0x7AE0, 0x199B, 0x7AE3, 0x7AE3, 0x1B03, 0x7AE5, 0x7AE5, 0x10F8,
+ 0x7AEA, 0x7AEA, 0x15DF, 0x7AED, 0x7AED, 0x0DB1, 0x7AEF, 0x7AEF, 0x106D,
+ 0x7AF6, 0x7AF6, 0x0E6A, 0x7AF9, 0x7AF9, 0x1AF4, 0x7AFA, 0x7AFA, 0x1C7B,
+ 0x7AFF, 0x7AFF, 0x0DA5, 0x7B0F, 0x7B0F, 0x1EAC, 0x7B11, 0x7B11, 0x1592,
+ 0x7B19, 0x7B19, 0x14FC, 0x7B1B, 0x7B1B, 0x19E5, 0x7B1E, 0x7B1E, 0x1D0F,
+ 0x7B20, 0x7B20, 0x122E, 0x7B26, 0x7B26, 0x140A, 0x7B2C, 0x7B2C, 0x1A72,
+ 0x7B2D, 0x7B2D, 0x1190, 0x7B39, 0x7B39, 0x1579, 0x7B46, 0x7B46, 0x1DBB,
+ 0x7B49, 0x7B49, 0x1111, 0x7B4B, 0x7B4B, 0x0FBF, 0x7B4C, 0x7B4C, 0x1A0C,
+ 0x7B4D, 0x7B4D, 0x1616, 0x7B4F, 0x7B4F, 0x138E, 0x7B50, 0x7B50, 0x0F09,
+ 0x7B51, 0x7B51, 0x1C7C, 0x7B52, 0x7B52, 0x1D20, 0x7B54, 0x7B54, 0x108C,
+ 0x7B56, 0x7B56, 0x1BD8, 0x7B60, 0x7B60, 0x0FAC, 0x7B6C, 0x7B6C, 0x156E,
+ 0x7B6E, 0x7B6E, 0x150E, 0x7B75, 0x7B75, 0x175A, 0x7B7D, 0x7B7D, 0x17B9,
+ 0x7B87, 0x7B87, 0x0DF6, 0x7B8B, 0x7B8B, 0x1A0D, 0x7B8F, 0x7B8F, 0x19BC,
+ 0x7B94, 0x7B94, 0x1320, 0x7B95, 0x7B95, 0x100B, 0x7B97, 0x7B97, 0x14BF,
+ 0x7B9A, 0x7B9A, 0x1B8B, 0x7B9D, 0x7B9D, 0x0E48, 0x7BA1, 0x7BA1, 0x0EF4,
+ 0x7BAD, 0x7BAD, 0x1A0E, 0x7BB1, 0x7BB1, 0x14EA, 0x7BB4, 0x7BB4, 0x1982,
+ 0x7BB8, 0x7BB8, 0x19CE, 0x7BC0, 0x7BC0, 0x1A22, 0x7BC1, 0x7BC1, 0x1EF1,
+ 0x7BC4, 0x7BC4, 0x1398, 0x7BC6, 0x7BC6, 0x1A0F, 0x7BC7, 0x7BC7, 0x1D62,
+ 0x7BC9, 0x7BC9, 0x1C7D, 0x7BD2, 0x7BD2, 0x1661, 0x7BE0, 0x7BE0, 0x1593,
+ 0x7BE4, 0x7BE4, 0x10DC, 0x7BE9, 0x7BE9, 0x14A2, 0x7C07, 0x7C07, 0x1AAD,
+ 0x7C12, 0x7C12, 0x1B9C, 0x7C1E, 0x7C1E, 0x106E, 0x7C21, 0x7C21, 0x0DA6,
+ 0x7C27, 0x7C27, 0x1EF2, 0x7C2A, 0x7C2A, 0x1983, 0x7C2B, 0x7C2B, 0x1594,
+ 0x7C3D, 0x7C3D, 0x1C0F, 0x7C3E, 0x7C3E, 0x1187, 0x7C3F, 0x7C3F, 0x140B,
+ 0x7C43, 0x7C43, 0x1134, 0x7C4C, 0x7C4C, 0x1AE4, 0x7C4D, 0x7C4D, 0x19E6,
+ 0x7C60, 0x7C60, 0x11BD, 0x7C64, 0x7C64, 0x1C10, 0x7C6C, 0x7C6C, 0x1214,
+ 0x7C73, 0x7C73, 0x12FF, 0x7C83, 0x7C83, 0x1457, 0x7C89, 0x7C89, 0x142D,
+ 0x7C92, 0x7C92, 0x122F, 0x7C95, 0x7C95, 0x1321, 0x7C97, 0x7C97, 0x1A9B,
+ 0x7C98, 0x7C98, 0x1A29, 0x7C9F, 0x7C9F, 0x15A5, 0x7CA5, 0x7CA5, 0x1AF5,
+ 0x7CA7, 0x7CA7, 0x199C, 0x7CAE, 0x7CAE, 0x1151, 0x7CB1, 0x7CB1, 0x1152,
+ 0x7CB2, 0x7CB2, 0x1B9E, 0x7CB3, 0x7CB3, 0x0DFE, 0x7CB9, 0x7CB9, 0x15E0,
+ 0x7CBE, 0x7CBE, 0x1A56, 0x7CCA, 0x7CCA, 0x1E93, 0x7CD6, 0x7CD6, 0x1097,
+ 0x7CDE, 0x7CDE, 0x142E, 0x7CDF, 0x7CDF, 0x1A9C, 0x7CE0, 0x7CE0, 0x0DDC,
+ 0x7CE7, 0x7CE7, 0x1153, 0x7CFB, 0x7CFB, 0x0E89, 0x7CFE, 0x7CFE, 0x0FA3,
+ 0x7D00, 0x7D00, 0x100C, 0x7D02, 0x7D02, 0x1AE5, 0x7D04, 0x7D04, 0x16F1,
+ 0x7D05, 0x7D05, 0x1EB3, 0x7D06, 0x7D06, 0x1849, 0x7D07, 0x7D07, 0x1F59,
+ 0x7D08, 0x7D08, 0x1ED7, 0x7D0A, 0x7D0B, 0x12EA, 0x7D0D, 0x7D0D, 0x1036,
+ 0x7D10, 0x7D10, 0x1058, 0x7D14, 0x7D14, 0x1617, 0x7D17, 0x7D17, 0x14A3,
+ 0x7D18, 0x7D18, 0x0F19, 0x7D19, 0x7D19, 0x1B34, 0x7D1A, 0x7D1A, 0x0FD8,
+ 0x7D1B, 0x7D1B, 0x142F, 0x7D20, 0x7D20, 0x1595, 0x7D21, 0x7D21, 0x135D,
+ 0x7D22, 0x7D22, 0x14F7, 0x7D2B, 0x7D2B, 0x1964, 0x7D2C, 0x7D2C, 0x1AE6,
+ 0x7D2E, 0x7D2E, 0x1BA9, 0x7D2F, 0x7D2F, 0x11DB, 0x7D30, 0x7D30, 0x157A,
+ 0x7D33, 0x7D33, 0x1673, 0x7D35, 0x7D35, 0x19CF, 0x7D39, 0x7D39, 0x1596,
+ 0x7D3A, 0x7D3A, 0x0DC5, 0x7D42, 0x7D42, 0x1ABE, 0x7D43, 0x7D43, 0x1E42,
+ 0x7D44, 0x7D44, 0x1A9D, 0x7D45, 0x7D45, 0x0E6B, 0x7D46, 0x7D46, 0x133C,
+ 0x7D50, 0x7D50, 0x0E43, 0x7D5E, 0x7D5E, 0x0F2A, 0x7D61, 0x7D61, 0x1121,
+ 0x7D62, 0x7D62, 0x1E43, 0x7D66, 0x7D66, 0x0FD9, 0x7D68, 0x7D68, 0x18E3,
+ 0x7D6A, 0x7D6A, 0x1936, 0x7D6E, 0x7D6E, 0x150F, 0x7D71, 0x7D71, 0x1D21,
+ 0x7D72, 0x7D72, 0x14A4, 0x7D73, 0x7D73, 0x0DDD, 0x7D76, 0x7D76, 0x1A23,
+ 0x7D79, 0x7D79, 0x0E39, 0x7D7F, 0x7D7F, 0x0F58, 0x7D8E, 0x7D8E, 0x1A57,
+ 0x7D8F, 0x7D8F, 0x15E1, 0x7D93, 0x7D93, 0x0E6C, 0x7D9C, 0x7D9C, 0x1ABF,
+ 0x7DA0, 0x7DA0, 0x11B2, 0x7DA2, 0x7DA2, 0x1AE7, 0x7DAC, 0x7DAC, 0x15E2,
+ 0x7DAD, 0x7DAD, 0x18C4, 0x7DB1, 0x7DB1, 0x0DDE, 0x7DB2, 0x7DB2, 0x125D,
+ 0x7DB4, 0x7DB4, 0x1C05, 0x7DB5, 0x7DB5, 0x1BD1, 0x7DB8, 0x7DB8, 0x11F6,
+ 0x7DBA, 0x7DBA, 0x100D, 0x7DBB, 0x7DBB, 0x1CF8, 0x7DBD, 0x7DBD, 0x1975,
+ 0x7DBE, 0x7DBE, 0x1202, 0x7DBF, 0x7DBF, 0x1286, 0x7DC7, 0x7DC7, 0x1CB7,
+ 0x7DCA, 0x7DCA, 0x101E, 0x7DCB, 0x7DCB, 0x1458, 0x7DD6, 0x7DD6, 0x1510,
+ 0x7DD8, 0x7DD8, 0x1DEA, 0x7DDA, 0x7DDA, 0x153B, 0x7DDD, 0x7DDD, 0x1B7A,
+ 0x7DDE, 0x7DDE, 0x106F, 0x7DE0, 0x7DE0, 0x1C29, 0x7DE1, 0x7DE1, 0x1311,
+ 0x7DE3, 0x7DE3, 0x175B, 0x7DE8, 0x7DE8, 0x1D63, 0x7DE9, 0x7DE9, 0x17E5,
+ 0x7DEC, 0x7DEC, 0x1287, 0x7DEF, 0x7DEF, 0x1899, 0x7DF4, 0x7DF4, 0x1177,
+ 0x7DFB, 0x7DFB, 0x1CB8, 0x7E09, 0x7E09, 0x1B59, 0x7E0A, 0x7E0A, 0x16DF,
+ 0x7E15, 0x7E15, 0x17C7, 0x7E1B, 0x7E1B, 0x1322, 0x7E1D, 0x7E1D, 0x1B5A,
+ 0x7E1E, 0x7E1E, 0x1E94, 0x7E1F, 0x7E1F, 0x181B, 0x7E21, 0x7E21, 0x19B5,
+ 0x7E23, 0x7E23, 0x1E44, 0x7E2B, 0x7E2B, 0x13EF, 0x7E2E, 0x7E2E, 0x1C7E,
+ 0x7E2F, 0x7E2F, 0x175C, 0x7E31, 0x7E31, 0x1AC0, 0x7E37, 0x7E37, 0x11DC,
+ 0x7E3D, 0x7E3D, 0x1C59, 0x7E3E, 0x7E3E, 0x19E7, 0x7E41, 0x7E41, 0x1389,
+ 0x7E43, 0x7E43, 0x143B, 0x7E46, 0x7E46, 0x12DA, 0x7E47, 0x7E47, 0x180E,
+ 0x7E52, 0x7E52, 0x1B1A, 0x7E54, 0x7E54, 0x1B42, 0x7E55, 0x7E55, 0x153C,
+ 0x7E5E, 0x7E5E, 0x180F, 0x7E61, 0x7E61, 0x15E3, 0x7E69, 0x7E69, 0x1639,
+ 0x7E6A, 0x7E6A, 0x1F06, 0x7E6B, 0x7E6B, 0x0E8A, 0x7E6D, 0x7E6D, 0x0E3A,
+ 0x7E70, 0x7E70, 0x1A9E, 0x7E79, 0x7E79, 0x1740, 0x7E7C, 0x7E7C, 0x0E8B,
+ 0x7E82, 0x7E82, 0x1B9D, 0x7E8C, 0x7E8C, 0x15A6, 0x7E8F, 0x7E8F, 0x1A10,
+ 0x7E93, 0x7E93, 0x1787, 0x7E96, 0x7E96, 0x155A, 0x7E98, 0x7E98, 0x1B9F,
+ 0x7E9B, 0x7E9B, 0x10DD, 0x7E9C, 0x7E9C, 0x1135, 0x7F36, 0x7F36, 0x140C,
+ 0x7F38, 0x7F38, 0x1E01, 0x7F3A, 0x7F3A, 0x0E44, 0x7F4C, 0x7F4C, 0x16E3,
+ 0x7F50, 0x7F50, 0x0EF5, 0x7F54, 0x7F54, 0x125E, 0x7F55, 0x7F55, 0x1DDB,
+ 0x7F6A, 0x7F6A, 0x1ACB, 0x7F6B, 0x7F6B, 0x0F0E, 0x7F6E, 0x7F6E, 0x1CB9,
+ 0x7F70, 0x7F70, 0x138F, 0x7F72, 0x7F72, 0x1511, 0x7F75, 0x7F75, 0x126D,
+ 0x7F77, 0x7F77, 0x1D3E, 0x7F79, 0x7F79, 0x1215, 0x7F85, 0x7F85, 0x1119,
+ 0x7F88, 0x7F88, 0x100E, 0x7F8A, 0x7F8A, 0x1708, 0x7F8C, 0x7F8C, 0x0DDF,
+ 0x7F8E, 0x7F8E, 0x1300, 0x7F94, 0x7F94, 0x0EA6, 0x7F9A, 0x7F9A, 0x1191,
+ 0x7F9E, 0x7F9E, 0x15E4, 0x7FA4, 0x7FA4, 0x0F73, 0x7FA8, 0x7FA8, 0x153D,
+ 0x7FA9, 0x7FA9, 0x1905, 0x7FB2, 0x7FB2, 0x1F76, 0x7FB8, 0x7FB8, 0x1216,
+ 0x7FB9, 0x7FB9, 0x0DFF, 0x7FBD, 0x7FBD, 0x184A, 0x7FC1, 0x7FC1, 0x17CF,
+ 0x7FC5, 0x7FC5, 0x164F, 0x7FCA, 0x7FCA, 0x1927, 0x7FCC, 0x7FCC, 0x1928,
+ 0x7FCE, 0x7FCE, 0x1192, 0x7FD2, 0x7FD2, 0x162F, 0x7FD4, 0x7FD4, 0x14EB,
+ 0x7FD5, 0x7FD5, 0x1F61, 0x7FDF, 0x7FDF, 0x19E8, 0x7FE0, 0x7FE0, 0x1C9A,
+ 0x7FE1, 0x7FE1, 0x1459, 0x7FE9, 0x7FE9, 0x1D64, 0x7FEB, 0x7FEB, 0x17E6,
+ 0x7FF0, 0x7FF0, 0x1DDC, 0x7FF9, 0x7FF9, 0x0F2B, 0x7FFC, 0x7FFC, 0x1929,
+ 0x8000, 0x8000, 0x1810, 0x8001, 0x8001, 0x11A7, 0x8003, 0x8003, 0x0EA7,
+ 0x8005, 0x8005, 0x1965, 0x8006, 0x8006, 0x100F, 0x8009, 0x8009, 0x0F59,
+ 0x800C, 0x800C, 0x191B, 0x8010, 0x8010, 0x103E, 0x8015, 0x8015, 0x0E6D,
+ 0x8017, 0x8017, 0x12AE, 0x8018, 0x8018, 0x1863, 0x802D, 0x802D, 0x1010,
+ 0x8033, 0x8033, 0x191C, 0x8036, 0x8036, 0x16EE, 0x803D, 0x803D, 0x1CFE,
+ 0x803F, 0x803F, 0x0E6E, 0x8043, 0x8043, 0x1083, 0x8046, 0x8046, 0x1193,
+ 0x804A, 0x804A, 0x11CF, 0x8056, 0x8056, 0x156F, 0x8058, 0x8058, 0x1477,
+ 0x805A, 0x805A, 0x1C9B, 0x805E, 0x805E, 0x12EC, 0x806F, 0x806F, 0x1178,
+ 0x8070, 0x8070, 0x1C5A, 0x8072, 0x8072, 0x1570, 0x8073, 0x8073, 0x182F,
+ 0x8077, 0x8077, 0x1B43, 0x807D, 0x807D, 0x1C20, 0x807E, 0x807E, 0x11BE,
+ 0x807F, 0x807F, 0x18E0, 0x8084, 0x8084, 0x191D, 0x8085, 0x8085, 0x1606,
+ 0x8086, 0x8086, 0x14A5, 0x8087, 0x8087, 0x1A9F, 0x8089, 0x8089, 0x18D5,
+ 0x808B, 0x808B, 0x11FD, 0x808C, 0x808C, 0x1011, 0x8096, 0x8096, 0x1C3F,
+ 0x809B, 0x809B, 0x1E02, 0x809D, 0x809D, 0x0DA7, 0x80A1, 0x80A1, 0x0EA8,
+ 0x80A2, 0x80A2, 0x1B35, 0x80A5, 0x80A5, 0x145A, 0x80A9, 0x80A9, 0x0E3B,
+ 0x80AA, 0x80AA, 0x135E, 0x80AF, 0x80AF, 0x0FDD, 0x80B1, 0x80B1, 0x0F1A,
+ 0x80B2, 0x80B2, 0x18D6, 0x80B4, 0x80B4, 0x1F1B, 0x80BA, 0x80BA, 0x1D74,
+ 0x80C3, 0x80C3, 0x189A, 0x80C4, 0x80C4, 0x1AD1, 0x80CC, 0x80CC, 0x1373,
+ 0x80CE, 0x80CE, 0x1D10, 0x80DA, 0x80DA, 0x1374, 0x80DB, 0x80DB, 0x0DCD,
+ 0x80DE, 0x80DE, 0x1D88, 0x80E1, 0x80E1, 0x1E95, 0x80E4, 0x80E4, 0x18DC,
+ 0x80E5, 0x80E5, 0x1512, 0x80F1, 0x80F1, 0x0F0A, 0x80F4, 0x80F4, 0x10F9,
+ 0x80F8, 0x80F8, 0x1F51, 0x80FD, 0x80FD, 0x1059, 0x8102, 0x8102, 0x1B36,
+ 0x8105, 0x8105, 0x1E56, 0x8106, 0x8106, 0x1C9C, 0x8107, 0x8107, 0x1E57,
+ 0x8108, 0x8108, 0x1272, 0x810A, 0x810A, 0x1BE8, 0x8118, 0x8118, 0x17E7,
+ 0x811A, 0x811A, 0x0D90, 0x811B, 0x811B, 0x0E6F, 0x8123, 0x8123, 0x1618,
+ 0x8129, 0x8129, 0x15E5, 0x812B, 0x812B, 0x1CFB, 0x812F, 0x812F, 0x1D89,
+ 0x8139, 0x8139, 0x1BC6, 0x813E, 0x813E, 0x145B, 0x814B, 0x814B, 0x16E0,
+ 0x814E, 0x814E, 0x1674, 0x8150, 0x8151, 0x140D, 0x8154, 0x8154, 0x0DE0,
+ 0x8155, 0x8155, 0x17E8, 0x8165, 0x8165, 0x1571, 0x8166, 0x8166, 0x1053,
+ 0x816B, 0x816B, 0x1AC1, 0x8170, 0x8170, 0x1811, 0x8171, 0x8171, 0x0E18,
+ 0x8178, 0x8178, 0x199D, 0x8179, 0x8179, 0x13DA, 0x817A, 0x817A, 0x153E,
+ 0x817F, 0x817F, 0x1D25, 0x8180, 0x8180, 0x135F, 0x8188, 0x8188, 0x0E32,
+ 0x818A, 0x818A, 0x1323, 0x818F, 0x818F, 0x0EA9, 0x819A, 0x819A, 0x140F,
+ 0x819C, 0x819C, 0x123B, 0x819D, 0x819D, 0x162B, 0x81A0, 0x81A0, 0x0F2C,
+ 0x81A3, 0x81A3, 0x1B71, 0x81A8, 0x81A8, 0x1D5C, 0x81B3, 0x81B3, 0x153F,
+ 0x81B5, 0x81B5, 0x1C91, 0x81BA, 0x81BA, 0x18F8, 0x81BD, 0x81BD, 0x1084,
+ 0x81BE, 0x81BE, 0x1F07, 0x81BF, 0x81BF, 0x1050, 0x81C0, 0x81C0, 0x1107,
+ 0x81C2, 0x81C2, 0x145C, 0x81C6, 0x81C6, 0x171C, 0x81CD, 0x81CD, 0x1A73,
+ 0x81D8, 0x81D8, 0x113A, 0x81DF, 0x81DF, 0x199E, 0x81E3, 0x81E3, 0x1675,
+ 0x81E5, 0x81E5, 0x17D7, 0x81E7, 0x81E7, 0x199F, 0x81E8, 0x81E8, 0x122A,
+ 0x81EA, 0x81EA, 0x1966, 0x81ED, 0x81ED, 0x1C9D, 0x81F3, 0x81F3, 0x1B37,
+ 0x81F4, 0x81F4, 0x1CBA, 0x81FA, 0x81FA, 0x10A5, 0x81FB, 0x81FB, 0x1B5B,
+ 0x81FC, 0x81FC, 0x0F5A, 0x81FE, 0x81FE, 0x18C5, 0x8205, 0x8205, 0x0F5B,
+ 0x8207, 0x8207, 0x1735, 0x8208, 0x8208, 0x1F62, 0x820A, 0x820A, 0x0F5C,
+ 0x820C, 0x820C, 0x1550, 0x820D, 0x820D, 0x14A6, 0x8212, 0x8212, 0x1513,
+ 0x821B, 0x821B, 0x1BF6, 0x821C, 0x821C, 0x1619, 0x821E, 0x821E, 0x12DB,
+ 0x821F, 0x821F, 0x1AE8, 0x8221, 0x8221, 0x0DE1, 0x822A, 0x822A, 0x1E03,
+ 0x822B, 0x822B, 0x1360, 0x822C, 0x822C, 0x133D, 0x8235, 0x8235, 0x1CDE,
+ 0x8236, 0x8236, 0x1324, 0x8237, 0x8237, 0x1E45, 0x8239, 0x8239, 0x1540,
+ 0x8240, 0x8240, 0x1410, 0x8245, 0x8245, 0x1736, 0x8247, 0x8247, 0x1A58,
+ 0x8259, 0x8259, 0x1BC7, 0x8264, 0x8264, 0x1906, 0x8266, 0x8266, 0x1DEB,
+ 0x826E, 0x826E, 0x0DA8, 0x826F, 0x826F, 0x1154, 0x8271, 0x8271, 0x0DA9,
+ 0x8272, 0x8272, 0x14F8, 0x8276, 0x8276, 0x176A, 0x8278, 0x8278, 0x1C40,
+ 0x827E, 0x827E, 0x16D8, 0x828B, 0x828B, 0x184B, 0x828D, 0x828D, 0x1976,
+ 0x828E, 0x828E, 0x0F7F, 0x8292, 0x8292, 0x125F, 0x8299, 0x8299, 0x1411,
+ 0x829A, 0x829A, 0x1108, 0x829D, 0x829D, 0x1B38, 0x829F, 0x829F, 0x14CC,
+ 0x82A5, 0x82A5, 0x0DF7, 0x82A6, 0x82A6, 0x1E96, 0x82A9, 0x82A9, 0x0FCE,
+ 0x82AC, 0x82AC, 0x1430, 0x82AD, 0x82AD, 0x1D3F, 0x82AE, 0x82AE, 0x1797,
+ 0x82AF, 0x82AF, 0x1689, 0x82B1, 0x82B1, 0x1EBF, 0x82B3, 0x82B3, 0x1361,
+ 0x82B7, 0x82B7, 0x1B39, 0x82B8, 0x82B8, 0x1864, 0x82B9, 0x82B9, 0x0FC0,
+ 0x82BB, 0x82BB, 0x1C6A, 0x82BC, 0x82BC, 0x12AF, 0x82BD, 0x82BD, 0x1697,
+ 0x82BF, 0x82BF, 0x1952, 0x82D1, 0x82D1, 0x1882, 0x82D2, 0x82D2, 0x176B,
+ 0x82D4, 0x82D4, 0x1D11, 0x82D5, 0x82D5, 0x1C41, 0x82D7, 0x82D7, 0x12CA,
+ 0x82DB, 0x82DB, 0x0D7F, 0x82DE, 0x82DE, 0x1D8A, 0x82DF, 0x82DF, 0x0F5D,
+ 0x82E1, 0x82E1, 0x191E, 0x82E5, 0x82E5, 0x16F2, 0x82E6, 0x82E6, 0x0EAA,
+ 0x82E7, 0x82E7, 0x19D0, 0x82F1, 0x82F1, 0x1788, 0x82FD, 0x82FD, 0x0EAB,
+ 0x82FE, 0x82FE, 0x1DBC, 0x8301, 0x8301, 0x1B09, 0x8302, 0x8302, 0x12DC,
+ 0x8303, 0x8303, 0x1399, 0x8304, 0x8304, 0x0D80, 0x8305, 0x8305, 0x12B0,
+ 0x8309, 0x8309, 0x1255, 0x8317, 0x8317, 0x1295, 0x8328, 0x8328, 0x1967,
+ 0x832B, 0x832B, 0x1260, 0x832F, 0x832F, 0x13DB, 0x8331, 0x8331, 0x15E6,
+ 0x8334, 0x8334, 0x1F08, 0x8335, 0x8335, 0x1937, 0x8336, 0x8336, 0x105F,
+ 0x8338, 0x8338, 0x1830, 0x8339, 0x8339, 0x1737, 0x8340, 0x8340, 0x161A,
+ 0x8347, 0x8347, 0x1E1C, 0x8349, 0x8349, 0x1C42, 0x834A, 0x834A, 0x1E68,
+ 0x834F, 0x834F, 0x194B, 0x8351, 0x8351, 0x191F, 0x8352, 0x8352, 0x1EF3,
+ 0x8373, 0x8373, 0x1102, 0x8377, 0x8377, 0x1DC8, 0x837B, 0x837B, 0x19E9,
+ 0x8389, 0x8389, 0x1217, 0x838A, 0x838A, 0x19A0, 0x838E, 0x838E, 0x14A7,
+ 0x8396, 0x8396, 0x0E70, 0x8398, 0x8398, 0x1676, 0x839E, 0x839E, 0x17E9,
+ 0x83A2, 0x83A2, 0x1E58, 0x83A9, 0x83A9, 0x1412, 0x83AA, 0x83AA, 0x1698,
+ 0x83AB, 0x83AB, 0x123C, 0x83BD, 0x83BD, 0x1261, 0x83C1, 0x83C1, 0x1C21,
+ 0x83C5, 0x83C5, 0x0EF6, 0x83C9, 0x83C9, 0x11B3, 0x83CA, 0x83CA, 0x0F6D,
+ 0x83CC, 0x83CC, 0x0FAD, 0x83D3, 0x83D3, 0x0EE0, 0x83D6, 0x83D6, 0x1BC8,
+ 0x83DC, 0x83DC, 0x1BD2, 0x83E9, 0x83E9, 0x13CD, 0x83EB, 0x83EB, 0x0FC1,
+ 0x83EF, 0x83EF, 0x1EC0, 0x83F0, 0x83F0, 0x0EAC, 0x83F1, 0x83F1, 0x1203,
+ 0x83F2, 0x83F2, 0x145D, 0x83F4, 0x83F4, 0x16C3, 0x83F9, 0x83F9, 0x19D1,
+ 0x83FD, 0x83FD, 0x1607, 0x8403, 0x8403, 0x1C92, 0x8404, 0x8404, 0x10C9,
+ 0x840A, 0x840A, 0x1147, 0x840C, 0x840C, 0x127C, 0x840D, 0x840D, 0x1D6C,
+ 0x840E, 0x840E, 0x189B, 0x8429, 0x8429, 0x1C6B, 0x842C, 0x842C, 0x124B,
+ 0x8431, 0x8431, 0x1F39, 0x8438, 0x8438, 0x18C6, 0x843D, 0x843D, 0x1122,
+ 0x8449, 0x8449, 0x1771, 0x8457, 0x8457, 0x19D2, 0x845B, 0x845B, 0x0DB2,
+ 0x8461, 0x8461, 0x1D8B, 0x8463, 0x8463, 0x10FA, 0x8466, 0x8466, 0x189C,
+ 0x846B, 0x846B, 0x1E97, 0x846C, 0x846C, 0x19A1, 0x846F, 0x846F, 0x16F3,
+ 0x8475, 0x8475, 0x0FA4, 0x847A, 0x847A, 0x1B12, 0x8490, 0x8490, 0x15E7,
+ 0x8494, 0x8494, 0x1650, 0x8499, 0x8499, 0x12BF, 0x849C, 0x849C, 0x14C0,
+ 0x84A1, 0x84A1, 0x1362, 0x84B2, 0x84B2, 0x1D8C, 0x84B8, 0x84B8, 0x1B1B,
+ 0x84BB, 0x84BB, 0x16F4, 0x84BC, 0x84BC, 0x1BC9, 0x84BF, 0x84BF, 0x1E98,
+ 0x84C0, 0x84C0, 0x15AD, 0x84C2, 0x84C2, 0x1296, 0x84C4, 0x84C4, 0x1C7F,
+ 0x84C6, 0x84C6, 0x1527, 0x84C9, 0x84C9, 0x1831, 0x84CB, 0x84CB, 0x0DF8,
+ 0x84CD, 0x84CD, 0x1651, 0x84D1, 0x84D1, 0x14A8, 0x84DA, 0x84DA, 0x15E8,
+ 0x84EC, 0x84EC, 0x13F0, 0x84EE, 0x84EE, 0x1179, 0x84F4, 0x84F4, 0x161B,
+ 0x84FC, 0x84FC, 0x11D0, 0x8511, 0x8511, 0x128B, 0x8513, 0x8513, 0x124C,
+ 0x8514, 0x8514, 0x13DC, 0x8517, 0x8517, 0x1968, 0x8518, 0x8518, 0x14CD,
+ 0x851A, 0x851A, 0x186A, 0x851E, 0x851E, 0x11DD, 0x8521, 0x8521, 0x1BD3,
+ 0x8523, 0x8523, 0x19A2, 0x8525, 0x8525, 0x1C5B, 0x852C, 0x852C, 0x1597,
+ 0x852D, 0x852D, 0x18EF, 0x852F, 0x852F, 0x1B5C, 0x853D, 0x853D, 0x1D75,
+ 0x853F, 0x853F, 0x189D, 0x8541, 0x8541, 0x1085, 0x8543, 0x8543, 0x138A,
+ 0x8549, 0x8549, 0x1C43, 0x854E, 0x854E, 0x0F2D, 0x8553, 0x8553, 0x1865,
+ 0x8559, 0x8559, 0x1E74, 0x8563, 0x8563, 0x161C, 0x8568, 0x8568, 0x0F8D,
+ 0x8569, 0x8569, 0x1D06, 0x856A, 0x856A, 0x12DD, 0x856D, 0x856D, 0x1598,
+ 0x8584, 0x8584, 0x1325, 0x8587, 0x8587, 0x1301, 0x858F, 0x858F, 0x1907,
+ 0x8591, 0x8591, 0x0DE2, 0x8594, 0x8594, 0x19A3, 0x859B, 0x859B, 0x1551,
+ 0x85A6, 0x85A6, 0x1BF7, 0x85A8, 0x85A8, 0x1F35, 0x85A9, 0x85A9, 0x14C7,
+ 0x85AA, 0x85AA, 0x1677, 0x85AF, 0x85AF, 0x1514, 0x85B0, 0x85B0, 0x1F32,
+ 0x85BA, 0x85BA, 0x1A74, 0x85C1, 0x85C1, 0x0EAD, 0x85C9, 0x85C9, 0x1969,
+ 0x85CD, 0x85CD, 0x1136, 0x85CE, 0x85CE, 0x1678, 0x85CF, 0x85CF, 0x19A4,
+ 0x85D5, 0x85D5, 0x184C, 0x85DC, 0x85DC, 0x1163, 0x85DD, 0x85DD, 0x1798,
+ 0x85E4, 0x85E4, 0x1112, 0x85E5, 0x85E5, 0x16F5, 0x85E9, 0x85E9, 0x138B,
+ 0x85EA, 0x85EA, 0x15E9, 0x85F7, 0x85F7, 0x19D3, 0x85FA, 0x85FA, 0x1222,
+ 0x85FB, 0x85FB, 0x1AA0, 0x85FF, 0x85FF, 0x0EE9, 0x8602, 0x8602, 0x1799,
+ 0x8606, 0x8606, 0x11A8, 0x8607, 0x8607, 0x1599, 0x860A, 0x860A, 0x17C8,
+ 0x8616, 0x8616, 0x1724, 0x8617, 0x8617, 0x13A4, 0x861A, 0x861A, 0x1541,
+ 0x862D, 0x862D, 0x112B, 0x863F, 0x863F, 0x111A, 0x864E, 0x864E, 0x1E99,
+ 0x8650, 0x8650, 0x1DD0, 0x8654, 0x8654, 0x0E19, 0x8655, 0x8655, 0x1BDD,
+ 0x865B, 0x865B, 0x1E29, 0x865C, 0x865C, 0x11A9, 0x865E, 0x865E, 0x184D,
+ 0x865F, 0x865F, 0x1E9A, 0x8667, 0x8667, 0x1F49, 0x8679, 0x8679, 0x1EB4,
+ 0x868A, 0x868A, 0x12ED, 0x868C, 0x868C, 0x1363, 0x8693, 0x8693, 0x1938,
+ 0x86A3, 0x86A3, 0x0ED7, 0x86A4, 0x86A4, 0x1AA1, 0x86A9, 0x86A9, 0x1CBB,
+ 0x86C7, 0x86C7, 0x14A9, 0x86CB, 0x86CB, 0x1070, 0x86D4, 0x86D4, 0x1F09,
+ 0x86D9, 0x86D9, 0x17D8, 0x86DB, 0x86DB, 0x1AE9, 0x86DF, 0x86DF, 0x0F2E,
+ 0x86E4, 0x86E4, 0x1DF2, 0x86ED, 0x86ED, 0x1B72, 0x86FE, 0x86FE, 0x1699,
+ 0x8700, 0x8700, 0x1C4D, 0x8702, 0x8702, 0x13F1, 0x8703, 0x8703, 0x1679,
+ 0x8708, 0x8708, 0x17BA, 0x8718, 0x8718, 0x1B3A, 0x871A, 0x871A, 0x145E,
+ 0x871C, 0x871C, 0x1314, 0x874E, 0x874E, 0x0DB4, 0x8755, 0x8755, 0x1662,
+ 0x8757, 0x8757, 0x1EF4, 0x875F, 0x875F, 0x189E, 0x8766, 0x8766, 0x1DC9,
+ 0x8768, 0x8768, 0x162C, 0x8774, 0x8774, 0x1E9B, 0x8776, 0x8776, 0x1A2F,
+ 0x8778, 0x8778, 0x17D9, 0x8782, 0x8782, 0x1142, 0x878D, 0x878D, 0x18E4,
+ 0x879F, 0x879F, 0x1297, 0x87A2, 0x87A2, 0x1E69, 0x87B3, 0x87B3, 0x1098,
+ 0x87BA, 0x87BA, 0x111B, 0x87C4, 0x87C4, 0x1CD0, 0x87E0, 0x87E0, 0x133E,
+ 0x87EC, 0x87EC, 0x1542, 0x87EF, 0x87EF, 0x1812, 0x87F2, 0x87F2, 0x1C8D,
+ 0x87F9, 0x87F9, 0x1E10, 0x87FB, 0x87FB, 0x1908, 0x87FE, 0x87FE, 0x155B,
+ 0x8805, 0x8805, 0x163A, 0x881F, 0x881F, 0x113B, 0x8822, 0x8822, 0x1B04,
+ 0x8823, 0x8823, 0x1164, 0x8831, 0x8831, 0x0EAE, 0x8836, 0x8836, 0x1984,
+ 0x883B, 0x883B, 0x124D, 0x8840, 0x8840, 0x1E4C, 0x8846, 0x8846, 0x1B0C,
+ 0x884C, 0x884C, 0x1E1D, 0x884D, 0x884D, 0x175D, 0x8852, 0x8852, 0x1E46,
+ 0x8853, 0x8853, 0x1624, 0x8857, 0x8857, 0x0D81, 0x8859, 0x8859, 0x169A,
+ 0x885B, 0x885B, 0x189F, 0x885D, 0x885D, 0x1C8E, 0x8861, 0x8861, 0x1E6A,
+ 0x8862, 0x8862, 0x0F5E, 0x8863, 0x8863, 0x1909, 0x8868, 0x8868, 0x1DA1,
+ 0x886B, 0x886B, 0x14CE, 0x8870, 0x8870, 0x15BD, 0x8872, 0x8872, 0x1037,
+ 0x8877, 0x8877, 0x1C8F, 0x887E, 0x887F, 0x0FCF, 0x8881, 0x8881, 0x1883,
+ 0x8882, 0x8882, 0x129B, 0x8888, 0x8888, 0x0D82, 0x888B, 0x888B, 0x10A6,
+ 0x888D, 0x888D, 0x1D8D, 0x8892, 0x8892, 0x1071, 0x8896, 0x8896, 0x15EA,
+ 0x8897, 0x8897, 0x1B5D, 0x889E, 0x889E, 0x0EC6, 0x88AB, 0x88AB, 0x1DB1,
+ 0x88B4, 0x88B4, 0x0EAF, 0x88C1, 0x88C1, 0x19B6, 0x88C2, 0x88C2, 0x1182,
+ 0x88CF, 0x88CF, 0x1218, 0x88D4, 0x88D4, 0x179A, 0x88D5, 0x88D5, 0x18C7,
+ 0x88D9, 0x88D9, 0x0F74, 0x88DC, 0x88DC, 0x13CE, 0x88DD, 0x88DD, 0x19A5,
+ 0x88DF, 0x88DF, 0x14AA, 0x88E1, 0x88E1, 0x1219, 0x88E8, 0x88E8, 0x145F,
+ 0x88F3, 0x88F3, 0x14EC, 0x88F4, 0x88F5, 0x1375, 0x88F8, 0x88F8, 0x111C,
+ 0x88FD, 0x88FD, 0x1A75, 0x8907, 0x8907, 0x13DD, 0x8910, 0x8910, 0x0DB3,
+ 0x8912, 0x8912, 0x1D8E, 0x8913, 0x8913, 0x13CF, 0x8918, 0x8918, 0x18A0,
+ 0x8919, 0x8919, 0x1377, 0x8925, 0x8925, 0x181C, 0x892A, 0x892A, 0x1D26,
+ 0x8936, 0x8936, 0x1630, 0x8938, 0x8938, 0x11DE, 0x893B, 0x893B, 0x1552,
+ 0x8941, 0x8941, 0x0DE3, 0x8944, 0x8944, 0x1709, 0x895F, 0x895F, 0x0FD1,
+ 0x8964, 0x8964, 0x1137, 0x896A, 0x896A, 0x1256, 0x8972, 0x8972, 0x1631,
+ 0x897F, 0x897F, 0x1515, 0x8981, 0x8981, 0x1813, 0x8983, 0x8983, 0x1086,
+ 0x8986, 0x8986, 0x13DE, 0x8987, 0x8987, 0x1D57, 0x898B, 0x898B, 0x0E3C,
+ 0x898F, 0x898F, 0x0FA5, 0x8993, 0x8993, 0x127E, 0x8996, 0x8996, 0x1652,
+ 0x89A1, 0x89A1, 0x0E33, 0x89A9, 0x89A9, 0x10CA, 0x89AA, 0x89AA, 0x1CC3,
+ 0x89B2, 0x89B2, 0x0FC2, 0x89BA, 0x89BA, 0x0D91, 0x89BD, 0x89BD, 0x1138,
+ 0x89C0, 0x89C0, 0x0EF7, 0x89D2, 0x89D2, 0x0D92, 0x89E3, 0x89E3, 0x1E11,
+ 0x89F4, 0x89F4, 0x14ED, 0x89F8, 0x89F8, 0x1C4E, 0x8A00, 0x8A00, 0x1721,
+ 0x8A02, 0x8A02, 0x1A59, 0x8A03, 0x8A03, 0x1413, 0x8A08, 0x8A08, 0x0E8C,
+ 0x8A0A, 0x8A0A, 0x167A, 0x8A0C, 0x8A0C, 0x1EB5, 0x8A0E, 0x8A0E, 0x1D1C,
+ 0x8A13, 0x8A13, 0x1F33, 0x8A16, 0x8A16, 0x1F5A, 0x8A17, 0x8A17, 0x1CEE,
+ 0x8A18, 0x8A18, 0x1012, 0x8A1B, 0x8A1B, 0x17DA, 0x8A1D, 0x8A1D, 0x169B,
+ 0x8A1F, 0x8A1F, 0x15B5, 0x8A23, 0x8A23, 0x0E45, 0x8A25, 0x8A25, 0x1056,
+ 0x8A2A, 0x8A2A, 0x1364, 0x8A2D, 0x8A2D, 0x1553, 0x8A31, 0x8A31, 0x1E2A,
+ 0x8A34, 0x8A34, 0x159A, 0x8A36, 0x8A36, 0x0D83, 0x8A3A, 0x8A3A, 0x1B5E,
+ 0x8A3B, 0x8A3B, 0x1AEA, 0x8A50, 0x8A50, 0x14AB, 0x8A54, 0x8A54, 0x1AA2,
+ 0x8A55, 0x8A55, 0x1D6D, 0x8A5B, 0x8A5B, 0x19D4, 0x8A5E, 0x8A5E, 0x14AC,
+ 0x8A60, 0x8A60, 0x1789, 0x8A62, 0x8A62, 0x161D, 0x8A63, 0x8A63, 0x179B,
+ 0x8A66, 0x8A66, 0x1653, 0x8A69, 0x8A69, 0x1654, 0x8A6D, 0x8A6D, 0x0F93,
+ 0x8A6E, 0x8A6E, 0x1A11, 0x8A70, 0x8A70, 0x1F77, 0x8A71, 0x8A71, 0x1EC1,
+ 0x8A72, 0x8A72, 0x1E12, 0x8A73, 0x8A73, 0x14EE, 0x8A75, 0x8A75, 0x1543,
+ 0x8A79, 0x8A79, 0x1C11, 0x8A85, 0x8A85, 0x1AEB, 0x8A87, 0x8A87, 0x0EE1,
+ 0x8A8C, 0x8A8C, 0x1B3B, 0x8A8D, 0x8A8D, 0x1939, 0x8A93, 0x8A93, 0x1516,
+ 0x8A95, 0x8A95, 0x1CF9, 0x8A98, 0x8A98, 0x18C8, 0x8A9E, 0x8A9E, 0x1714,
+ 0x8AA0, 0x8AA0, 0x1572, 0x8AA1, 0x8AA1, 0x0E8D, 0x8AA3, 0x8AA3, 0x12DE,
+ 0x8AA4, 0x8AA4, 0x17BB, 0x8AA5, 0x8AA5, 0x0EB0, 0x8AA6, 0x8AA6, 0x15B6,
+ 0x8AA8, 0x8AA8, 0x1F0A, 0x8AAA, 0x8AAA, 0x1554, 0x8AB0, 0x8AB0, 0x15EB,
+ 0x8AB2, 0x8AB2, 0x0EE2, 0x8AB9, 0x8AB9, 0x1460, 0x8ABC, 0x8ABC, 0x190A,
+ 0x8ABE, 0x8ABE, 0x18E9, 0x8ABF, 0x8ABF, 0x1AA3, 0x8AC2, 0x8AC2, 0x1C12,
+ 0x8AC4, 0x8AC4, 0x161E, 0x8AC7, 0x8AC7, 0x1087, 0x8ACB, 0x8ACB, 0x1C22,
+ 0x8ACD, 0x8ACD, 0x19BD, 0x8ACF, 0x8ACF, 0x1C6C, 0x8AD2, 0x8AD2, 0x1155,
+ 0x8AD6, 0x8AD6, 0x11B7, 0x8ADB, 0x8ADB, 0x18C9, 0x8ADC, 0x8ADC, 0x1C1A,
+ 0x8AE1, 0x8AE1, 0x1655, 0x8AE6, 0x8AE6, 0x1C2A, 0x8AE7, 0x8AE7, 0x1E13,
+ 0x8AEA, 0x8AEA, 0x1A5A, 0x8AEB, 0x8AEB, 0x0DAA, 0x8AED, 0x8AED, 0x18CA,
+ 0x8AEE, 0x8AEE, 0x196A, 0x8AF1, 0x8AF1, 0x1F42, 0x8AF6, 0x8AF6, 0x168A,
+ 0x8AF7, 0x8AF7, 0x1DA9, 0x8AF8, 0x8AF8, 0x1A76, 0x8AFA, 0x8AFA, 0x1722,
+ 0x8AFE, 0x8AFE, 0x102B, 0x8B00, 0x8B00, 0x12B1, 0x8B01, 0x8B01, 0x16BA,
+ 0x8B02, 0x8B02, 0x18A1, 0x8B04, 0x8B04, 0x1113, 0x8B0E, 0x8B0E, 0x1302,
+ 0x8B10, 0x8B10, 0x1315, 0x8B14, 0x8B14, 0x1DD1, 0x8B16, 0x8B16, 0x15A7,
+ 0x8B17, 0x8B17, 0x1365, 0x8B19, 0x8B19, 0x0E49, 0x8B1A, 0x8B1A, 0x192A,
+ 0x8B1B, 0x8B1B, 0x0DE4, 0x8B1D, 0x8B1D, 0x14AD, 0x8B20, 0x8B20, 0x1814,
+ 0x8B28, 0x8B28, 0x12B2, 0x8B2B, 0x8B2B, 0x19EA, 0x8B2C, 0x8B2C, 0x11ED,
+ 0x8B33, 0x8B33, 0x0F5F, 0x8B39, 0x8B39, 0x0FC3, 0x8B41, 0x8B41, 0x1EC2,
+ 0x8B49, 0x8B49, 0x1B1C, 0x8B4E, 0x8B4E, 0x1F4B, 0x8B4F, 0x8B4F, 0x1013,
+ 0x8B58, 0x8B58, 0x1663, 0x8B5A, 0x8B5A, 0x1088, 0x8B5C, 0x8B5C, 0x13D0,
+ 0x8B66, 0x8B66, 0x0E71, 0x8B6C, 0x8B6C, 0x1461, 0x8B6F, 0x8B6F, 0x1741,
+ 0x8B70, 0x8B70, 0x190B, 0x8B74, 0x8B74, 0x0E3D, 0x8B77, 0x8B77, 0x1E9C,
+ 0x8B7D, 0x8B7D, 0x179C, 0x8B80, 0x8B80, 0x10DE, 0x8B8A, 0x8B8A, 0x13A9,
+ 0x8B90, 0x8B90, 0x15EC, 0x8B92, 0x8B92, 0x1BB2, 0x8B93, 0x8B93, 0x170A,
+ 0x8B96, 0x8B96, 0x1BB3, 0x8B9A, 0x8B9A, 0x1BA0, 0x8C37, 0x8C37, 0x0EBC,
+ 0x8C3F, 0x8C3F, 0x0E8E, 0x8C41, 0x8C41, 0x1EDE, 0x8C46, 0x8C46, 0x1103,
+ 0x8C48, 0x8C48, 0x1014, 0x8C4A, 0x8C4A, 0x1DAA, 0x8C4C, 0x8C4C, 0x17EA,
+ 0x8C55, 0x8C55, 0x1656, 0x8C5A, 0x8C5A, 0x10E7, 0x8C61, 0x8C61, 0x14EF,
+ 0x8C6A, 0x8C6A, 0x1E9D, 0x8C6B, 0x8C6B, 0x179D, 0x8C79, 0x8C79, 0x1DA2,
+ 0x8C7A, 0x8C7A, 0x1657, 0x8C82, 0x8C82, 0x1C44, 0x8C8A, 0x8C8A, 0x1273,
+ 0x8C8C, 0x8C8C, 0x12B3, 0x8C9D, 0x8C9D, 0x1D58, 0x8C9E, 0x8C9E, 0x1A5B,
+ 0x8CA0, 0x8CA0, 0x1414, 0x8CA1, 0x8CA1, 0x19B7, 0x8CA2, 0x8CA2, 0x0ED8,
+ 0x8CA7, 0x8CA7, 0x1472, 0x8CA8, 0x8CA8, 0x1EC3, 0x8CA9, 0x8CA9, 0x1D47,
+ 0x8CAA, 0x8CAA, 0x1CFF, 0x8CAB, 0x8CAB, 0x0EF8, 0x8CAC, 0x8CAC, 0x1BD9,
+ 0x8CAF, 0x8CAF, 0x19D5, 0x8CB0, 0x8CB0, 0x157B, 0x8CB3, 0x8CB3, 0x1921,
+ 0x8CB4, 0x8CB4, 0x0F98, 0x8CB6, 0x8CB6, 0x1D68, 0x8CB7, 0x8CB7, 0x126E,
+ 0x8CB8, 0x8CB8, 0x10A7, 0x8CBB, 0x8CBB, 0x1462, 0x8CBC, 0x8CBC, 0x1C1B,
+ 0x8CBD, 0x8CBD, 0x1920, 0x8CBF, 0x8CBF, 0x12DF, 0x8CC0, 0x8CC0, 0x1DCA,
+ 0x8CC1, 0x8CC1, 0x1431, 0x8CC2, 0x8CC2, 0x11C3, 0x8CC3, 0x8CC3, 0x194C,
+ 0x8CC4, 0x8CC4, 0x1F0B, 0x8CC7, 0x8CC7, 0x196B, 0x8CC8, 0x8CC8, 0x0D84,
+ 0x8CCA, 0x8CCA, 0x19EB, 0x8CD1, 0x8CD1, 0x1B5F, 0x8CD3, 0x8CD3, 0x1473,
+ 0x8CDA, 0x8CDA, 0x11C4, 0x8CDC, 0x8CDC, 0x14AE, 0x8CDE, 0x8CDE, 0x14F0,
+ 0x8CE0, 0x8CE0, 0x1378, 0x8CE2, 0x8CE2, 0x1E47, 0x8CE3, 0x8CE3, 0x126F,
+ 0x8CE4, 0x8CE4, 0x1BF8, 0x8CE6, 0x8CE6, 0x1415, 0x8CEA, 0x8CEA, 0x1B73,
+ 0x8CED, 0x8CED, 0x10CB, 0x8CF4, 0x8CF4, 0x11C5, 0x8CFB, 0x8CFB, 0x1416,
+ 0x8CFC, 0x8CFC, 0x0F60, 0x8CFD, 0x8CFD, 0x14F4, 0x8D04, 0x8D04, 0x1B3C,
+ 0x8D05, 0x8D05, 0x1C93, 0x8D07, 0x8D07, 0x18DD, 0x8D08, 0x8D08, 0x1B1D,
+ 0x8D0A, 0x8D0A, 0x1BA1, 0x8D0D, 0x8D0D, 0x155C, 0x8D13, 0x8D13, 0x19A6,
+ 0x8D16, 0x8D16, 0x15A8, 0x8D64, 0x8D64, 0x19EC, 0x8D66, 0x8D66, 0x14AF,
+ 0x8D6B, 0x8D6B, 0x1E34, 0x8D70, 0x8D70, 0x1AEC, 0x8D73, 0x8D73, 0x0FA6,
+ 0x8D74, 0x8D74, 0x1417, 0x8D77, 0x8D77, 0x1015, 0x8D85, 0x8D85, 0x1C45,
+ 0x8D8A, 0x8D8A, 0x188A, 0x8D99, 0x8D99, 0x1AA4, 0x8DA3, 0x8DA3, 0x1C9E,
+ 0x8DA8, 0x8DA8, 0x1C6D, 0x8DB3, 0x8DB3, 0x1AAE, 0x8DBA, 0x8DBA, 0x1418,
+ 0x8DBE, 0x8DBE, 0x1B3D, 0x8DC6, 0x8DC6, 0x1D12, 0x8DCB, 0x8DCB, 0x1348,
+ 0x8DCC, 0x8DCC, 0x1B74, 0x8DCF, 0x8DCF, 0x0D85, 0x8DDB, 0x8DDB, 0x1D40,
+ 0x8DDD, 0x8DDD, 0x0E0C, 0x8DE1, 0x8DE1, 0x19ED, 0x8DE3, 0x8DE3, 0x1544,
+ 0x8DE8, 0x8DE8, 0x0EE3, 0x8DEF, 0x8DEF, 0x11AA, 0x8DF3, 0x8DF3, 0x10CC,
+ 0x8E0A, 0x8E0A, 0x1832, 0x8E0F, 0x8E0F, 0x108D, 0x8E10, 0x8E10, 0x1BF9,
+ 0x8E1E, 0x8E1E, 0x0E0D, 0x8E2A, 0x8E2A, 0x1AC2, 0x8E30, 0x8E30, 0x18CB,
+ 0x8E35, 0x8E35, 0x1AC3, 0x8E42, 0x8E42, 0x18CC, 0x8E44, 0x8E44, 0x1A77,
+ 0x8E47, 0x8E47, 0x0E1A, 0x8E48, 0x8E48, 0x10CD, 0x8E49, 0x8E49, 0x1B8C,
+ 0x8E4A, 0x8E4A, 0x1E75, 0x8E59, 0x8E59, 0x1C80, 0x8E5F, 0x8E5F, 0x19EE,
+ 0x8E60, 0x8E60, 0x1BE9, 0x8E74, 0x8E74, 0x1C81, 0x8E76, 0x8E76, 0x0F8E,
+ 0x8E81, 0x8E81, 0x1AA5, 0x8E87, 0x8E87, 0x19D6, 0x8E8A, 0x8E8A, 0x1AED,
+ 0x8E8D, 0x8E8D, 0x16F6, 0x8EAA, 0x8EAA, 0x1223, 0x8EAB, 0x8EAB, 0x167B,
+ 0x8EAC, 0x8EAC, 0x0F80, 0x8EC0, 0x8EC0, 0x0F61, 0x8ECA, 0x8ECA, 0x1B8D,
+ 0x8ECB, 0x8ECB, 0x16BB, 0x8ECC, 0x8ECC, 0x0F94, 0x8ECD, 0x8ECD, 0x0F75,
+ 0x8ED2, 0x8ED2, 0x1E2E, 0x8EDF, 0x8EDF, 0x175E, 0x8EEB, 0x8EEB, 0x1B60,
+ 0x8EF8, 0x8EF8, 0x1C82, 0x8EFB, 0x8EFB, 0x0D86, 0x8EFE, 0x8EFE, 0x1664,
+ 0x8F03, 0x8F03, 0x0F2F, 0x8F05, 0x8F05, 0x11AB, 0x8F09, 0x8F09, 0x19B8,
+ 0x8F12, 0x8F12, 0x1C1C, 0x8F13, 0x8F13, 0x124E, 0x8F14, 0x8F14, 0x13D1,
+ 0x8F15, 0x8F15, 0x0E72, 0x8F1B, 0x8F1B, 0x1156, 0x8F1C, 0x8F1C, 0x1CBC,
+ 0x8F1D, 0x8F1D, 0x1F43, 0x8F1E, 0x8F1E, 0x1262, 0x8F1F, 0x8F1F, 0x1C06,
+ 0x8F26, 0x8F26, 0x117A, 0x8F27, 0x8F27, 0x13BF, 0x8F29, 0x8F29, 0x1379,
+ 0x8F2A, 0x8F2A, 0x11F7, 0x8F2F, 0x8F2F, 0x1B7B, 0x8F33, 0x8F33, 0x1AEE,
+ 0x8F38, 0x8F38, 0x15ED, 0x8F39, 0x8F39, 0x13DF, 0x8F3B, 0x8F3B, 0x13E0,
+ 0x8F3E, 0x8F3E, 0x1A12, 0x8F3F, 0x8F3F, 0x1738, 0x8F44, 0x8F44, 0x1DE2,
+ 0x8F45, 0x8F45, 0x1884, 0x8F49, 0x8F49, 0x1A13, 0x8F4D, 0x8F4D, 0x1C07,
+ 0x8F4E, 0x8F4E, 0x0F30, 0x8F5D, 0x8F5D, 0x1739, 0x8F5F, 0x8F5F, 0x0F1B,
+ 0x8F62, 0x8F62, 0x116F, 0x8F9B, 0x8F9B, 0x167C, 0x8F9C, 0x8F9C, 0x0EB1,
+ 0x8FA3, 0x8FA3, 0x112E, 0x8FA6, 0x8FA6, 0x1D48, 0x8FA8, 0x8FA8, 0x13AA,
+ 0x8FAD, 0x8FAD, 0x14B0, 0x8FAF, 0x8FAF, 0x13AB, 0x8FB0, 0x8FB0, 0x1B61,
+ 0x8FB1, 0x8FB1, 0x181D, 0x8FB2, 0x8FB2, 0x1051, 0x8FC2, 0x8FC2, 0x184E,
+ 0x8FC5, 0x8FC5, 0x167D, 0x8FCE, 0x8FCE, 0x178A, 0x8FD1, 0x8FD1, 0x0FC4,
+ 0x8FD4, 0x8FD4, 0x133F, 0x8FE6, 0x8FE6, 0x0D87, 0x8FEA, 0x8FEA, 0x19EF,
+ 0x8FEB, 0x8FEB, 0x1326, 0x8FED, 0x8FED, 0x1B75, 0x8FF0, 0x8FF0, 0x1625,
+ 0x8FF2, 0x8FF2, 0x0E2A, 0x8FF7, 0x8FF7, 0x1303, 0x8FF9, 0x8FF9, 0x19F0,
+ 0x8FFD, 0x8FFD, 0x1C6E, 0x9000, 0x9000, 0x1D27, 0x9001, 0x9001, 0x15B7,
+ 0x9002, 0x9002, 0x0EFE, 0x9003, 0x9003, 0x10CE, 0x9005, 0x9005, 0x1F2A,
+ 0x9006, 0x9006, 0x1742, 0x9008, 0x9008, 0x1E6B, 0x900B, 0x900B, 0x1D8F,
+ 0x900D, 0x900D, 0x159B, 0x900F, 0x900F, 0x1D2D, 0x9010, 0x9010, 0x1C83,
+ 0x9011, 0x9011, 0x0F62, 0x9014, 0x9014, 0x10CF, 0x9015, 0x9015, 0x0E73,
+ 0x9017, 0x9017, 0x1104, 0x9019, 0x9019, 0x19D7, 0x901A, 0x901A, 0x1D22,
+ 0x901D, 0x901D, 0x1517, 0x901E, 0x901E, 0x1194, 0x901F, 0x901F, 0x15A9,
+ 0x9020, 0x9020, 0x1AA6, 0x9021, 0x9021, 0x1B05, 0x9022, 0x9022, 0x13F2,
+ 0x9023, 0x9023, 0x117B, 0x902E, 0x902E, 0x1C2B, 0x9031, 0x9031, 0x1AEF,
+ 0x9032, 0x9032, 0x1B62, 0x9035, 0x9035, 0x0FA7, 0x9038, 0x9038, 0x1942,
+ 0x903C, 0x903C, 0x1DBF, 0x903E, 0x903E, 0x18CE, 0x9041, 0x9041, 0x1109,
+ 0x9042, 0x9042, 0x15EE, 0x9047, 0x9047, 0x184F, 0x904A, 0x904A, 0x18CD,
+ 0x904B, 0x904B, 0x1866, 0x904D, 0x904D, 0x1D65, 0x904E, 0x904E, 0x0EE4,
+ 0x9050, 0x9050, 0x1DCB, 0x9051, 0x9051, 0x1EF5, 0x9053, 0x9053, 0x10D0,
+ 0x9054, 0x9054, 0x1078, 0x9055, 0x9055, 0x18A2, 0x9059, 0x9059, 0x1815,
+ 0x905C, 0x905C, 0x15AE, 0x905D, 0x905D, 0x108E, 0x905E, 0x905E, 0x1C2C,
+ 0x9060, 0x9060, 0x1885, 0x9061, 0x9061, 0x159C, 0x9063, 0x9063, 0x0E3E,
+ 0x9069, 0x9069, 0x19F1, 0x906D, 0x906D, 0x1AA7, 0x906E, 0x906E, 0x1B8E,
+ 0x906F, 0x906F, 0x110A, 0x9072, 0x9072, 0x1B3E, 0x9075, 0x9075, 0x1B06,
+ 0x9077, 0x9077, 0x1BFA, 0x9078, 0x9078, 0x1545, 0x907A, 0x907A, 0x18CF,
+ 0x907C, 0x907C, 0x11D1, 0x907D, 0x907D, 0x0E0E, 0x907F, 0x907F, 0x1DB2,
+ 0x9080, 0x9080, 0x1816, 0x9081, 0x9081, 0x1270, 0x9082, 0x9082, 0x1E14,
+ 0x9083, 0x9083, 0x15EF, 0x9084, 0x9084, 0x1ED8, 0x9087, 0x9087, 0x1922,
+ 0x9088, 0x9088, 0x123D, 0x908A, 0x908A, 0x13AC, 0x908F, 0x908F, 0x111D,
+ 0x9091, 0x9091, 0x18F5, 0x9095, 0x9095, 0x17D0, 0x9099, 0x9099, 0x1263,
+ 0x90A2, 0x90A2, 0x1E6C, 0x90A3, 0x90A3, 0x102A, 0x90A6, 0x90A6, 0x1366,
+ 0x90A8, 0x90A8, 0x1C52, 0x90AA, 0x90AA, 0x14B1, 0x90AF, 0x90AF, 0x0DC6,
+ 0x90B0, 0x90B0, 0x1D13, 0x90B1, 0x90B1, 0x0F63, 0x90B5, 0x90B5, 0x159D,
+ 0x90B8, 0x90B8, 0x19D8, 0x90C1, 0x90C1, 0x185C, 0x90CA, 0x90CA, 0x0F31,
+ 0x90DE, 0x90DE, 0x1143, 0x90E1, 0x90E1, 0x0F76, 0x90E8, 0x90E8, 0x1419,
+ 0x90ED, 0x90ED, 0x0EEA, 0x90F5, 0x90F5, 0x1850, 0x90FD, 0x90FD, 0x10D1,
+ 0x9102, 0x9102, 0x16AA, 0x9112, 0x9112, 0x1C6F, 0x9115, 0x9115, 0x1E22,
+ 0x9119, 0x9119, 0x1463, 0x9127, 0x9127, 0x1114, 0x912D, 0x912D, 0x1A5C,
+ 0x9132, 0x9132, 0x1072, 0x9149, 0x9149, 0x18D0, 0x914A, 0x914A, 0x1A5D,
+ 0x914B, 0x914B, 0x1C70, 0x914C, 0x914C, 0x1977, 0x914D, 0x914D, 0x137A,
+ 0x914E, 0x914E, 0x1AF0, 0x9152, 0x9152, 0x1AF1, 0x9162, 0x9162, 0x1C46,
+ 0x9169, 0x9169, 0x1298, 0x916A, 0x916A, 0x1123, 0x916C, 0x916C, 0x15F0,
+ 0x9175, 0x9175, 0x1F1C, 0x9177, 0x9177, 0x1EA3, 0x9178, 0x9178, 0x14C1,
+ 0x9187, 0x9187, 0x161F, 0x9189, 0x9189, 0x1C9F, 0x918B, 0x918B, 0x1C47,
+ 0x918D, 0x918D, 0x1A78, 0x9192, 0x9192, 0x1573, 0x919C, 0x919C, 0x1C71,
+ 0x91AB, 0x91AB, 0x190C, 0x91AC, 0x91AC, 0x19A7, 0x91AE, 0x91AE, 0x1C48,
+ 0x91AF, 0x91AF, 0x1E76, 0x91B1, 0x91B1, 0x1349, 0x91B4, 0x91B4, 0x119D,
+ 0x91B5, 0x91B5, 0x0E00, 0x91C0, 0x91C0, 0x170B, 0x91C7, 0x91C7, 0x1BD4,
+ 0x91C9, 0x91C9, 0x18D1, 0x91CB, 0x91CB, 0x1528, 0x91CC, 0x91CC, 0x121A,
+ 0x91CD, 0x91CD, 0x1B0D, 0x91CE, 0x91CE, 0x16EF, 0x91CF, 0x91CF, 0x1157,
+ 0x91D0, 0x91D0, 0x121B, 0x91D1, 0x91D1, 0x1023, 0x91D7, 0x91D7, 0x15BE,
+ 0x91D8, 0x91D8, 0x1A5E, 0x91DC, 0x91DC, 0x141A, 0x91DD, 0x91DD, 0x1CCE,
+ 0x91E3, 0x91E3, 0x1AA8, 0x91E7, 0x91E7, 0x1BFB, 0x91EA, 0x91EA, 0x1851,
+ 0x91F5, 0x91F5, 0x1BD5, 0x920D, 0x920D, 0x110B, 0x9210, 0x9210, 0x0E26,
+ 0x9211, 0x9211, 0x1D49, 0x9212, 0x9212, 0x14D1, 0x9217, 0x9217, 0x18DE,
+ 0x921E, 0x921E, 0x0FAE, 0x9234, 0x9234, 0x1195, 0x923A, 0x923A, 0x17C2,
+ 0x923F, 0x923F, 0x1A14, 0x9240, 0x9240, 0x0DCE, 0x9245, 0x9245, 0x0E0F,
+ 0x9249, 0x9249, 0x1E48, 0x9257, 0x9257, 0x0E4A, 0x925B, 0x925B, 0x175F,
+ 0x925E, 0x925E, 0x188B, 0x9262, 0x9262, 0x134A, 0x9264, 0x9264, 0x0F64,
+ 0x9265, 0x9265, 0x1626, 0x9266, 0x9266, 0x1A5F, 0x9280, 0x9280, 0x18EA,
+ 0x9283, 0x9283, 0x1C5C, 0x9285, 0x9285, 0x10FB, 0x9291, 0x9291, 0x1546,
+ 0x9293, 0x9293, 0x1A15, 0x9296, 0x9296, 0x15F1, 0x9298, 0x9298, 0x1299,
+ 0x929C, 0x929C, 0x1DEC, 0x92B3, 0x92B3, 0x179E, 0x92B6, 0x92B6, 0x0F65,
+ 0x92B7, 0x92B7, 0x159E, 0x92B9, 0x92B9, 0x15F2, 0x92CC, 0x92CC, 0x1A60,
+ 0x92CF, 0x92CF, 0x1E59, 0x92D2, 0x92D2, 0x13F3, 0x92E4, 0x92E4, 0x1518,
+ 0x92EA, 0x92EA, 0x1D90, 0x92F8, 0x92F8, 0x0E10, 0x92FC, 0x92FC, 0x0DE5,
+ 0x9304, 0x9304, 0x11B4, 0x9310, 0x9310, 0x1C72, 0x9318, 0x9318, 0x1C73,
+ 0x931A, 0x931A, 0x19BE, 0x931E, 0x931E, 0x1620, 0x931F, 0x931F, 0x1089,
+ 0x9320, 0x9320, 0x1A61, 0x9321, 0x9321, 0x1016, 0x9322, 0x9322, 0x1A16,
+ 0x9324, 0x9324, 0x1017, 0x9326, 0x9326, 0x0FD2, 0x9328, 0x9328, 0x12CB,
+ 0x932B, 0x932B, 0x1529, 0x932E, 0x932E, 0x0EB2, 0x932F, 0x932F, 0x1B93,
+ 0x9348, 0x9348, 0x178B, 0x934A, 0x934A, 0x117C, 0x934B, 0x934B, 0x0EE5,
+ 0x934D, 0x934D, 0x10D2, 0x9354, 0x9354, 0x16AB, 0x935B, 0x935B, 0x1073,
+ 0x936E, 0x936E, 0x18D2, 0x9375, 0x9375, 0x0E1B, 0x937C, 0x937C, 0x1CCF,
+ 0x937E, 0x937E, 0x1AC4, 0x938C, 0x938C, 0x0E4B, 0x9394, 0x9394, 0x1833,
+ 0x9396, 0x9396, 0x15BC, 0x939A, 0x939A, 0x1C74, 0x93A3, 0x93A3, 0x1E6D,
+ 0x93A7, 0x93A7, 0x0DF9, 0x93AC, 0x93AC, 0x1E9E, 0x93AD, 0x93AD, 0x1B63,
+ 0x93B0, 0x93B0, 0x1943, 0x93C3, 0x93C3, 0x1AAF, 0x93D1, 0x93D1, 0x19F2,
+ 0x93DE, 0x93DE, 0x1834, 0x93E1, 0x93E1, 0x0E74, 0x93E4, 0x93E4, 0x11DF,
+ 0x93F6, 0x93F6, 0x1B7C, 0x9404, 0x9404, 0x1F10, 0x9418, 0x9418, 0x1AC5,
+ 0x9425, 0x9425, 0x1547, 0x942B, 0x942B, 0x1A17, 0x9435, 0x9435, 0x1C08,
+ 0x9438, 0x9438, 0x1CEF, 0x9444, 0x9444, 0x1AF2, 0x9451, 0x9452, 0x0DC7,
+ 0x945B, 0x945B, 0x0F0B, 0x947D, 0x947D, 0x1BA2, 0x947F, 0x947F, 0x1B94,
+ 0x9577, 0x9577, 0x19A8, 0x9580, 0x9580, 0x12EE, 0x9583, 0x9583, 0x155D,
+ 0x9589, 0x9589, 0x1D76, 0x958B, 0x958B, 0x0DFA, 0x958F, 0x958F, 0x18DF,
+ 0x9591, 0x9592, 0x1DDD, 0x9593, 0x9593, 0x0DAB, 0x9594, 0x9594, 0x1312,
+ 0x9598, 0x9598, 0x0DCF, 0x95A3, 0x95A3, 0x0D93, 0x95A4, 0x95A4, 0x1DF3,
+ 0x95A5, 0x95A5, 0x1390, 0x95A8, 0x95A8, 0x0FA8, 0x95AD, 0x95AD, 0x1165,
+ 0x95B1, 0x95B1, 0x1764, 0x95BB, 0x95BB, 0x176C, 0x95BC, 0x95BC, 0x16BC,
+ 0x95C7, 0x95C7, 0x16C4, 0x95CA, 0x95CA, 0x1EDF, 0x95D4, 0x95D4, 0x1DF4,
+ 0x95D5, 0x95D5, 0x0F8F, 0x95D6, 0x95D6, 0x1D31, 0x95DC, 0x95DC, 0x0EF9,
+ 0x95E1, 0x95E1, 0x1BFC, 0x95E2, 0x95E2, 0x13A5, 0x961C, 0x961C, 0x141B,
+ 0x9621, 0x9621, 0x1BFD, 0x962A, 0x962A, 0x1D4A, 0x962E, 0x962E, 0x17EB,
+ 0x9632, 0x9632, 0x1367, 0x963B, 0x963B, 0x1AA9, 0x963F, 0x963F, 0x169C,
+ 0x9640, 0x9640, 0x1CDF, 0x9642, 0x9642, 0x1DB3, 0x9644, 0x9644, 0x141C,
+ 0x964B, 0x964B, 0x11E0, 0x964C, 0x964C, 0x1274, 0x964D, 0x964D, 0x0DE6,
+ 0x9650, 0x9650, 0x1DDF, 0x965B, 0x965B, 0x1D77, 0x965C, 0x965C, 0x1DF5,
+ 0x965D, 0x965D, 0x155E, 0x965E, 0x965E, 0x163B, 0x965F, 0x965F, 0x1BEA,
+ 0x9662, 0x9662, 0x1886, 0x9663, 0x9663, 0x1B64, 0x9664, 0x9664, 0x1A79,
+ 0x966A, 0x966A, 0x137B, 0x9670, 0x9670, 0x18F0, 0x9673, 0x9673, 0x1B65,
+ 0x9675, 0x9675, 0x1204, 0x9676, 0x9676, 0x10D3, 0x9677, 0x9677, 0x1DED,
+ 0x9678, 0x9678, 0x11F1, 0x967D, 0x967D, 0x170C, 0x9685, 0x9685, 0x1852,
+ 0x9686, 0x9686, 0x11FB, 0x968A, 0x968A, 0x10A8, 0x968B, 0x968B, 0x15F3,
+ 0x968D, 0x968D, 0x1EF6, 0x968E, 0x968E, 0x0E8F, 0x9694, 0x9694, 0x0E34,
+ 0x9695, 0x9695, 0x1867, 0x9698, 0x9698, 0x16D9, 0x9699, 0x9699, 0x0FB6,
+ 0x969B, 0x969B, 0x1A7A, 0x969C, 0x969C, 0x19A9, 0x96A3, 0x96A3, 0x1224,
+ 0x96A7, 0x96A8, 0x15F4, 0x96AA, 0x96AA, 0x1E30, 0x96B1, 0x96B1, 0x18EB,
+ 0x96B7, 0x96B7, 0x119E, 0x96BB, 0x96BB, 0x1BEB, 0x96C0, 0x96C0, 0x1978,
+ 0x96C1, 0x96C1, 0x16B5, 0x96C4, 0x96C4, 0x186E, 0x96C5, 0x96C5, 0x169D,
+ 0x96C6, 0x96C6, 0x1B7D, 0x96C7, 0x96C7, 0x0EB3, 0x96C9, 0x96C9, 0x1CBD,
+ 0x96CB, 0x96CB, 0x1B07, 0x96CC, 0x96CC, 0x196C, 0x96CD, 0x96CD, 0x17D1,
+ 0x96CE, 0x96CE, 0x19D9, 0x96D5, 0x96D5, 0x1AAA, 0x96D6, 0x96D6, 0x15F6,
+ 0x96D9, 0x96D9, 0x168D, 0x96DB, 0x96DB, 0x1C75, 0x96DC, 0x96DC, 0x1985,
+ 0x96E2, 0x96E2, 0x121C, 0x96E3, 0x96E3, 0x102E, 0x96E8, 0x96E9, 0x1853,
+ 0x96EA, 0x96EA, 0x1555, 0x96EF, 0x96EF, 0x12EF, 0x96F0, 0x96F0, 0x1432,
+ 0x96F2, 0x96F2, 0x1868, 0x96F6, 0x96F6, 0x1196, 0x96F7, 0x96F7, 0x11C6,
+ 0x96F9, 0x96F9, 0x1327, 0x96FB, 0x96FB, 0x1A18, 0x9700, 0x9700, 0x15F7,
+ 0x9706, 0x9706, 0x1A62, 0x9707, 0x9707, 0x1B66, 0x9711, 0x9711, 0x1A2A,
+ 0x9713, 0x9713, 0x179F, 0x9716, 0x9716, 0x122B, 0x9719, 0x9719, 0x178C,
+ 0x971C, 0x971C, 0x14F1, 0x971E, 0x971E, 0x1DCC, 0x9727, 0x9727, 0x12E0,
+ 0x9730, 0x9730, 0x14C2, 0x9732, 0x9732, 0x11AC, 0x9739, 0x9739, 0x13A6,
+ 0x973D, 0x973D, 0x1A7B, 0x9742, 0x9742, 0x1170, 0x9744, 0x9744, 0x16DA,
+ 0x9748, 0x9748, 0x1197, 0x9751, 0x9751, 0x1C23, 0x9756, 0x9756, 0x1A63,
+ 0x975C, 0x975C, 0x1A64, 0x975E, 0x975E, 0x1464, 0x9761, 0x9761, 0x1304,
+ 0x9762, 0x9762, 0x1288, 0x9769, 0x9769, 0x1E35, 0x976D, 0x976D, 0x193A,
+ 0x9774, 0x9774, 0x1EC4, 0x9777, 0x9777, 0x193B, 0x977A, 0x977A, 0x1257,
+ 0x978B, 0x978B, 0x1E77, 0x978D, 0x978D, 0x16B6, 0x978F, 0x978F, 0x0ED9,
+ 0x97A0, 0x97A0, 0x0F6E, 0x97A8, 0x97A8, 0x0DB5, 0x97AB, 0x97AB, 0x0F6F,
+ 0x97AD, 0x97AD, 0x1D66, 0x97C6, 0x97C6, 0x1BFE, 0x97CB, 0x97CB, 0x18A3,
+ 0x97D3, 0x97D3, 0x1DE0, 0x97DC, 0x97DC, 0x10D4, 0x97F3, 0x97F3, 0x18F1,
+ 0x97F6, 0x97F6, 0x159F, 0x97FB, 0x97FB, 0x1869, 0x97FF, 0x97FF, 0x1E23,
+ 0x9800, 0x9800, 0x1E9F, 0x9801, 0x9801, 0x1E4D, 0x9802, 0x9802, 0x1A65,
+ 0x9803, 0x9803, 0x0E75, 0x9805, 0x9805, 0x1E04, 0x9806, 0x9806, 0x1621,
+ 0x9808, 0x9808, 0x15F8, 0x980A, 0x980A, 0x185D, 0x980C, 0x980C, 0x15B8,
+ 0x9810, 0x9810, 0x17A0, 0x9811, 0x9811, 0x17EC, 0x9812, 0x9812, 0x1340,
+ 0x9813, 0x9813, 0x10E8, 0x9817, 0x9817, 0x1D41, 0x9818, 0x9818, 0x1198,
+ 0x982D, 0x982D, 0x1105, 0x9830, 0x9830, 0x1E5A, 0x9838, 0x9838, 0x0E76,
+ 0x9839, 0x9839, 0x1D28, 0x983B, 0x983B, 0x1474, 0x9846, 0x9846, 0x0EE6,
+ 0x984C, 0x984C, 0x1A7C, 0x984D, 0x984D, 0x16E1, 0x984E, 0x984E, 0x16AC,
+ 0x9854, 0x9854, 0x16B7, 0x9858, 0x9858, 0x1887, 0x985A, 0x985A, 0x1A19,
+ 0x985E, 0x985E, 0x11EE, 0x9865, 0x9865, 0x1EA0, 0x9867, 0x9867, 0x0EB4,
+ 0x986B, 0x986B, 0x1A1A, 0x986F, 0x986F, 0x1E49, 0x98A8, 0x98A8, 0x1DAB,
+ 0x98AF, 0x98AF, 0x14D2, 0x98B1, 0x98B1, 0x1D14, 0x98C4, 0x98C4, 0x1DA4,
+ 0x98C7, 0x98C7, 0x1DA3, 0x98DB, 0x98DB, 0x1465, 0x98DC, 0x98DC, 0x138C,
+ 0x98DF, 0x98DF, 0x1665, 0x98E1, 0x98E1, 0x15AF, 0x98E2, 0x98E2, 0x1018,
+ 0x98ED, 0x98ED, 0x1CC2, 0x98EE, 0x98EE, 0x18F2, 0x98EF, 0x98EF, 0x1341,
+ 0x98F4, 0x98F4, 0x1923, 0x98FC, 0x98FC, 0x14B2, 0x98FD, 0x98FD, 0x1D91,
+ 0x98FE, 0x98FE, 0x1666, 0x9903, 0x9903, 0x0F32, 0x9909, 0x9909, 0x1E24,
+ 0x990A, 0x990A, 0x170D, 0x990C, 0x990C, 0x1924, 0x9910, 0x9910, 0x1BA3,
+ 0x9913, 0x9913, 0x169E, 0x9918, 0x9918, 0x173A, 0x991E, 0x991E, 0x1A1B,
+ 0x9920, 0x9920, 0x13C0, 0x9928, 0x9928, 0x0EFA, 0x9945, 0x9945, 0x124F,
+ 0x9949, 0x9949, 0x0FC5, 0x994B, 0x994B, 0x0F95, 0x994C, 0x994C, 0x1BA4,
+ 0x994D, 0x994D, 0x1548, 0x9951, 0x9951, 0x1019, 0x9952, 0x9952, 0x1817,
+ 0x9954, 0x9954, 0x17D2, 0x9957, 0x9957, 0x1E25, 0x9996, 0x9996, 0x15F9,
+ 0x9999, 0x9999, 0x1E26, 0x999D, 0x999D, 0x1DBD, 0x99A5, 0x99A5, 0x13E1,
+ 0x99A8, 0x99A8, 0x1E6E, 0x99AC, 0x99AC, 0x1235, 0x99AD, 0x99AD, 0x1715,
+ 0x99AE, 0x99AE, 0x1DAC, 0x99B1, 0x99B1, 0x1CE0, 0x99B3, 0x99B3, 0x1CBE,
+ 0x99B4, 0x99B4, 0x1622, 0x99B9, 0x99B9, 0x1944, 0x99C1, 0x99C1, 0x1328,
+ 0x99D0, 0x99D0, 0x1AF3, 0x99D1, 0x99D1, 0x104E, 0x99D2, 0x99D2, 0x0F66,
+ 0x99D5, 0x99D5, 0x0D88, 0x99D9, 0x99D9, 0x141D, 0x99DD, 0x99DD, 0x1CE1,
+ 0x99DF, 0x99DF, 0x14B3, 0x99ED, 0x99ED, 0x1E15, 0x99F1, 0x99F1, 0x1124,
+ 0x99FF, 0x99FF, 0x1B08, 0x9A01, 0x9A01, 0x1478, 0x9A08, 0x9A08, 0x13C1,
+ 0x9A0E, 0x9A0F, 0x101A, 0x9A19, 0x9A19, 0x1D67, 0x9A2B, 0x9A2B, 0x0E1C,
+ 0x9A30, 0x9A30, 0x1115, 0x9A36, 0x9A36, 0x1C76, 0x9A37, 0x9A37, 0x15A0,
+ 0x9A40, 0x9A40, 0x1275, 0x9A43, 0x9A43, 0x1DA5, 0x9A45, 0x9A45, 0x0F67,
+ 0x9A4D, 0x9A4D, 0x1F1D, 0x9A55, 0x9A55, 0x0F33, 0x9A57, 0x9A57, 0x1E31,
+ 0x9A5A, 0x9A5A, 0x0E77, 0x9A5B, 0x9A5B, 0x1743, 0x9A5F, 0x9A5F, 0x1CA0,
+ 0x9A62, 0x9A62, 0x1166, 0x9A65, 0x9A65, 0x101C, 0x9A69, 0x9A69, 0x1ED9,
+ 0x9A6A, 0x9A6A, 0x1167, 0x9AA8, 0x9AA8, 0x0EC9, 0x9AB8, 0x9AB8, 0x1E16,
+ 0x9AD3, 0x9AD3, 0x15FA, 0x9AD4, 0x9AD4, 0x1C2D, 0x9AD8, 0x9AD8, 0x0EB5,
+ 0x9AE5, 0x9AE5, 0x176D, 0x9AEE, 0x9AEE, 0x134B, 0x9B1A, 0x9B1A, 0x15FB,
+ 0x9B27, 0x9B27, 0x11D2, 0x9B2A, 0x9B2A, 0x1D2E, 0x9B31, 0x9B31, 0x186B,
+ 0x9B3C, 0x9B3C, 0x0F99, 0x9B41, 0x9B41, 0x0F17, 0x9B42, 0x9B42, 0x1EA9,
+ 0x9B43, 0x9B43, 0x134C, 0x9B44, 0x9B44, 0x1383, 0x9B45, 0x9B45, 0x1271,
+ 0x9B4F, 0x9B4F, 0x18A4, 0x9B54, 0x9B54, 0x1236, 0x9B5A, 0x9B5A, 0x1716,
+ 0x9B6F, 0x9B6F, 0x11AD, 0x9B8E, 0x9B8E, 0x1A2B, 0x9B91, 0x9B91, 0x1D92,
+ 0x9B9F, 0x9B9F, 0x16B8, 0x9BAB, 0x9BAB, 0x0F34, 0x9BAE, 0x9BAE, 0x1549,
+ 0x9BC9, 0x9BC9, 0x121D, 0x9BD6, 0x9BD6, 0x1C24, 0x9BE4, 0x9BE4, 0x0EC7,
+ 0x9BE8, 0x9BE8, 0x0E78, 0x9C0D, 0x9C0D, 0x1C77, 0x9C10, 0x9C10, 0x16AD,
+ 0x9C12, 0x9C12, 0x13E2, 0x9C15, 0x9C15, 0x1DCD, 0x9C25, 0x9C25, 0x1EDA,
+ 0x9C32, 0x9C32, 0x17BC, 0x9C3B, 0x9C3B, 0x1250, 0x9C47, 0x9C47, 0x0DE7,
+ 0x9C49, 0x9C49, 0x13AF, 0x9C57, 0x9C57, 0x1225, 0x9CE5, 0x9CE5, 0x1AAB,
+ 0x9CE7, 0x9CE7, 0x141E, 0x9CE9, 0x9CE9, 0x0F68, 0x9CF3, 0x9CF3, 0x13F4,
+ 0x9CF4, 0x9CF4, 0x129A, 0x9CF6, 0x9CF6, 0x1760, 0x9D09, 0x9D09, 0x169F,
+ 0x9D1B, 0x9D1B, 0x1888, 0x9D26, 0x9D26, 0x16CF, 0x9D28, 0x9D28, 0x16C8,
+ 0x9D3B, 0x9D3B, 0x1EB6, 0x9D51, 0x9D51, 0x0E3F, 0x9D5D, 0x9D5D, 0x16A0,
+ 0x9D60, 0x9D60, 0x0EBD, 0x9D61, 0x9D61, 0x12E1, 0x9D6C, 0x9D6C, 0x143C,
+ 0x9D72, 0x9D72, 0x1979, 0x9DA9, 0x9DA9, 0x12BA, 0x9DAF, 0x9DAF, 0x16E4,
+ 0x9DB4, 0x9DB4, 0x1DD2, 0x9DC4, 0x9DC4, 0x0E90, 0x9DD7, 0x9DD7, 0x0F69,
+ 0x9DF2, 0x9DF2, 0x1CA1, 0x9DF8, 0x9DF8, 0x1F4C, 0x9DF9, 0x9DF9, 0x18F9,
+ 0x9DFA, 0x9DFA, 0x11AE, 0x9E1A, 0x9E1A, 0x16E5, 0x9E1E, 0x9E1E, 0x112C,
+ 0x9E75, 0x9E75, 0x11AF, 0x9E79, 0x9E79, 0x1DEE, 0x9E7D, 0x9E7D, 0x176E,
+ 0x9E7F, 0x9E7F, 0x11B5, 0x9E92, 0x9E92, 0x101D, 0x9E93, 0x9E93, 0x11B6,
+ 0x9E97, 0x9E97, 0x1168, 0x9E9D, 0x9E9D, 0x14B4, 0x9E9F, 0x9E9F, 0x1226,
+ 0x9EA5, 0x9EA5, 0x1276, 0x9EB4, 0x9EB4, 0x0F70, 0x9EB5, 0x9EB5, 0x1289,
+ 0x9EBB, 0x9EBB, 0x1237, 0x9EBE, 0x9EBE, 0x1F44, 0x9EC3, 0x9EC3, 0x1EF7,
+ 0x9ECD, 0x9ECD, 0x1519, 0x9ECE, 0x9ECE, 0x1169, 0x9ED1, 0x9ED1, 0x1F52,
+ 0x9ED4, 0x9ED4, 0x0E27, 0x9ED8, 0x9ED8, 0x12E3, 0x9EDB, 0x9EDB, 0x10A9,
+ 0x9EDC, 0x9EDC, 0x1C89, 0x9EDE, 0x9EDE, 0x1A2C, 0x9EE8, 0x9EE8, 0x1099,
+ 0x9EF4, 0x9EF4, 0x1305, 0x9F07, 0x9F07, 0x17BD, 0x9F08, 0x9F08, 0x13B0,
+ 0x9F0E, 0x9F0E, 0x1A66, 0x9F13, 0x9F13, 0x0EB6, 0x9F20, 0x9F20, 0x151A,
+ 0x9F3B, 0x9F3B, 0x1466, 0x9F4A, 0x9F4A, 0x1A7D, 0x9F4B, 0x9F4B, 0x19B9,
+ 0x9F4E, 0x9F4E, 0x19BA, 0x9F52, 0x9F52, 0x1CBF, 0x9F5F, 0x9F5F, 0x19DA,
+ 0x9F61, 0x9F61, 0x1199, 0x9F67, 0x9F67, 0x1556, 0x9F6A, 0x9F6A, 0x1B95,
+ 0x9F6C, 0x9F6C, 0x1717, 0x9F77, 0x9F77, 0x16AE, 0x9F8D, 0x9F8D, 0x11D3,
+ 0x9F90, 0x9F90, 0x1368, 0x9F95, 0x9F95, 0x0DC9, 0x9F9C, 0x9F9C, 0x0F6A,
+ 0xAC00, 0xAC01, 0x043E, 0xAC02, 0xAC03, 0x2475, 0xAC04, 0xAC04, 0x0440,
+ 0xAC05, 0xAC06, 0x2477, 0xAC07, 0xAC0A, 0x0441, 0xAC0B, 0xAC0F, 0x2479,
+ 0xAC10, 0xAC17, 0x0445, 0xAC18, 0xAC18, 0x247E, 0xAC19, 0xAC1D, 0x044D,
+ 0xAC1E, 0xAC1F, 0x247F, 0xAC20, 0xAC20, 0x0452, 0xAC21, 0xAC23, 0x2481,
+ 0xAC24, 0xAC24, 0x0453, 0xAC25, 0xAC2B, 0x2484, 0xAC2C, 0xAC2D, 0x0454,
+ 0xAC2E, 0xAC2E, 0x248B, 0xAC2F, 0xAC31, 0x0456, 0xAC32, 0xAC37, 0x248C,
+ 0xAC38, 0xAC39, 0x0459, 0xAC3A, 0xAC3B, 0x2492, 0xAC3C, 0xAC3C, 0x045B,
+ 0xAC3D, 0xAC3F, 0x2494, 0xAC40, 0xAC40, 0x045C, 0xAC41, 0xAC4A, 0x2497,
+ 0xAC4B, 0xAC4B, 0x045D, 0xAC4C, 0xAC4C, 0x24A1, 0xAC4D, 0xAC4D, 0x045E,
+ 0xAC4E, 0xAC53, 0x24A2, 0xAC54, 0xAC54, 0x045F, 0xAC55, 0xAC57, 0x24A8,
+ 0xAC58, 0xAC58, 0x0460, 0xAC59, 0xAC5B, 0x24AB, 0xAC5C, 0xAC5C, 0x0461,
+ 0xAC5D, 0xAC6F, 0x24AE, 0xAC70, 0xAC71, 0x0462, 0xAC72, 0xAC73, 0x24C1,
+ 0xAC74, 0xAC74, 0x0464, 0xAC75, 0xAC76, 0x24C3, 0xAC77, 0xAC78, 0x0465,
+ 0xAC79, 0xAC79, 0x24C5, 0xAC7A, 0xAC7A, 0x0467, 0xAC7B, 0xAC7F, 0x24C6,
+ 0xAC80, 0xAC81, 0x0468, 0xAC82, 0xAC82, 0x24CB, 0xAC83, 0xAC86, 0x046A,
+ 0xAC87, 0xAC88, 0x24CC, 0xAC89, 0xAC8C, 0x046E, 0xAC8D, 0xAC8F, 0x24CE,
+ 0xAC90, 0xAC90, 0x0472, 0xAC91, 0xAC93, 0x24D1, 0xAC94, 0xAC94, 0x0473,
+ 0xAC95, 0xAC9B, 0x24D4, 0xAC9C, 0xAC9D, 0x0474, 0xAC9E, 0xAC9E, 0x24DB,
+ 0xAC9F, 0xACA1, 0x0476, 0xACA2, 0xACA7, 0x24DC, 0xACA8, 0xACAA, 0x0479,
+ 0xACAB, 0xACAB, 0x24E2, 0xACAC, 0xACAC, 0x047C, 0xACAD, 0xACAE, 0x24E3,
+ 0xACAF, 0xACB0, 0x047D, 0xACB1, 0xACB7, 0x24E5, 0xACB8, 0xACB9, 0x047F,
+ 0xACBA, 0xACBA, 0x24EC, 0xACBB, 0xACBD, 0x0481, 0xACBE, 0xACC0, 0x24ED,
+ 0xACC1, 0xACC1, 0x0484, 0xACC2, 0xACC3, 0x24F0, 0xACC4, 0xACC4, 0x0485,
+ 0xACC5, 0xACC7, 0x24F2, 0xACC8, 0xACC8, 0x0486, 0xACC9, 0xACCB, 0x24F5,
+ 0xACCC, 0xACCC, 0x0487, 0xACCD, 0xACD4, 0x24F8, 0xACD5, 0xACD5, 0x0488,
+ 0xACD6, 0xACD6, 0x2500, 0xACD7, 0xACD7, 0x0489, 0xACD8, 0xACDF, 0x2501,
+ 0xACE0, 0xACE1, 0x048A, 0xACE2, 0xACE3, 0x2509, 0xACE4, 0xACE4, 0x048C,
+ 0xACE5, 0xACE6, 0x250B, 0xACE7, 0xACE8, 0x048D, 0xACE9, 0xACE9, 0x250D,
+ 0xACEA, 0xACEA, 0x048F, 0xACEB, 0xACEB, 0x250E, 0xACEC, 0xACEC, 0x0490,
+ 0xACED, 0xACEE, 0x250F, 0xACEF, 0xACF1, 0x0491, 0xACF2, 0xACF2, 0x2511,
+ 0xACF3, 0xACF3, 0x0494, 0xACF4, 0xACF4, 0x2512, 0xACF5, 0xACF6, 0x0495,
+ 0xACF7, 0xACFB, 0x2513, 0xACFC, 0xACFD, 0x0497, 0xACFE, 0xACFF, 0x2518,
+ 0xAD00, 0xAD00, 0x0499, 0xAD01, 0xAD03, 0x251A, 0xAD04, 0xAD04, 0x049A,
+ 0xAD05, 0xAD05, 0x251D, 0xAD06, 0xAD06, 0x049B, 0xAD07, 0xAD0B, 0x251E,
+ 0xAD0C, 0xAD0D, 0x049C, 0xAD0E, 0xAD0E, 0x2523, 0xAD0F, 0xAD0F, 0x049E,
+ 0xAD10, 0xAD10, 0x2524, 0xAD11, 0xAD11, 0x049F, 0xAD12, 0xAD17, 0x2525,
+ 0xAD18, 0xAD18, 0x04A0, 0xAD19, 0xAD1B, 0x252B, 0xAD1C, 0xAD1C, 0x04A1,
+ 0xAD1D, 0xAD1F, 0x252E, 0xAD20, 0xAD20, 0x04A2, 0xAD21, 0xAD28, 0x2531,
+ 0xAD29, 0xAD29, 0x04A3, 0xAD2A, 0xAD2B, 0x2539, 0xAD2C, 0xAD2D, 0x04A4,
+ 0xAD2E, 0xAD33, 0x253B, 0xAD34, 0xAD35, 0x04A6, 0xAD36, 0xAD37, 0x2541,
+ 0xAD38, 0xAD38, 0x04A8, 0xAD39, 0xAD3B, 0x2543, 0xAD3C, 0xAD3C, 0x04A9,
+ 0xAD3D, 0xAD43, 0x2546, 0xAD44, 0xAD45, 0x04AA, 0xAD46, 0xAD46, 0x254D,
+ 0xAD47, 0xAD47, 0x04AC, 0xAD48, 0xAD48, 0x254E, 0xAD49, 0xAD49, 0x04AD,
+ 0xAD4A, 0xAD4F, 0x254F, 0xAD50, 0xAD50, 0x04AE, 0xAD51, 0xAD53, 0x2555,
+ 0xAD54, 0xAD54, 0x04AF, 0xAD55, 0xAD57, 0x2558, 0xAD58, 0xAD58, 0x04B0,
+ 0xAD59, 0xAD60, 0x255B, 0xAD61, 0xAD61, 0x04B1, 0xAD62, 0xAD62, 0x2563,
+ 0xAD63, 0xAD63, 0x04B2, 0xAD64, 0xAD6B, 0x2564, 0xAD6C, 0xAD6D, 0x04B3,
+ 0xAD6E, 0xAD6F, 0x256C, 0xAD70, 0xAD70, 0x04B5, 0xAD71, 0xAD72, 0x256E,
+ 0xAD73, 0xAD76, 0x04B6, 0xAD77, 0xAD7A, 0x2570, 0xAD7B, 0xAD7D, 0x04BA,
+ 0xAD7E, 0xAD7E, 0x2574, 0xAD7F, 0xAD7F, 0x04BD, 0xAD80, 0xAD80, 0x2575,
+ 0xAD81, 0xAD82, 0x04BE, 0xAD83, 0xAD87, 0x2576, 0xAD88, 0xAD89, 0x04C0,
+ 0xAD8A, 0xAD8B, 0x257B, 0xAD8C, 0xAD8C, 0x04C2, 0xAD8D, 0xAD8F, 0x257D,
+ 0xAD90, 0xAD90, 0x04C3, 0xAD91, 0xAD9B, 0x2580, 0xAD9C, 0xAD9D, 0x04C4,
+ 0xAD9E, 0xADA3, 0x258B, 0xADA4, 0xADA4, 0x04C6, 0xADA5, 0xADB6, 0x2591,
+ 0xADB7, 0xADB7, 0x04C7, 0xADB8, 0xADBF, 0x25A3, 0xADC0, 0xADC1, 0x04C8,
+ 0xADC2, 0xADC3, 0x25AB, 0xADC4, 0xADC4, 0x04CA, 0xADC5, 0xADC7, 0x25AD,
+ 0xADC8, 0xADC8, 0x04CB, 0xADC9, 0xADCF, 0x25B0, 0xADD0, 0xADD1, 0x04CC,
+ 0xADD2, 0xADD2, 0x25B7, 0xADD3, 0xADD3, 0x04CE, 0xADD4, 0xADDB, 0x25B8,
+ 0xADDC, 0xADDC, 0x04CF, 0xADDD, 0xADDF, 0x25C0, 0xADE0, 0xADE0, 0x04D0,
+ 0xADE1, 0xADE3, 0x25C3, 0xADE4, 0xADE4, 0x04D1, 0xADE5, 0xADF7, 0x25C6,
+ 0xADF8, 0xADF9, 0x04D2, 0xADFA, 0xADFB, 0x25D9, 0xADFC, 0xADFC, 0x04D4,
+ 0xADFD, 0xADFE, 0x25DB, 0xADFF, 0xADFF, 0x04D5, 0xAE00, 0xAE01, 0x04D6,
+ 0xAE02, 0xAE07, 0x25DD, 0xAE08, 0xAE09, 0x04D8, 0xAE0A, 0xAE0A, 0x25E3,
+ 0xAE0B, 0xAE0B, 0x04DA, 0xAE0C, 0xAE0C, 0x25E4, 0xAE0D, 0xAE0D, 0x04DB,
+ 0xAE0E, 0xAE13, 0x25E5, 0xAE14, 0xAE14, 0x04DC, 0xAE15, 0xAE2F, 0x25EB,
+ 0xAE30, 0xAE31, 0x04DD, 0xAE32, 0xAE33, 0x2606, 0xAE34, 0xAE34, 0x04DF,
+ 0xAE35, 0xAE36, 0x2608, 0xAE37, 0xAE38, 0x04E0, 0xAE39, 0xAE39, 0x260A,
+ 0xAE3A, 0xAE3A, 0x04E2, 0xAE3B, 0xAE3F, 0x260B, 0xAE40, 0xAE41, 0x04E3,
+ 0xAE42, 0xAE42, 0x2610, 0xAE43, 0xAE43, 0x04E5, 0xAE44, 0xAE44, 0x2611,
+ 0xAE45, 0xAE46, 0x04E6, 0xAE47, 0xAE49, 0x2612, 0xAE4A, 0xAE4A, 0x04E8,
+ 0xAE4B, 0xAE4B, 0x2615, 0xAE4C, 0xAE4E, 0x04E9, 0xAE4F, 0xAE4F, 0x2616,
+ 0xAE50, 0xAE50, 0x04EC, 0xAE51, 0xAE53, 0x2617, 0xAE54, 0xAE54, 0x04ED,
+ 0xAE55, 0xAE55, 0x261A, 0xAE56, 0xAE56, 0x04EE, 0xAE57, 0xAE5B, 0x261B,
+ 0xAE5C, 0xAE5D, 0x04EF, 0xAE5E, 0xAE5E, 0x2620, 0xAE5F, 0xAE61, 0x04F1,
+ 0xAE62, 0xAE64, 0x2621, 0xAE65, 0xAE65, 0x04F4, 0xAE66, 0xAE67, 0x2624,
+ 0xAE68, 0xAE69, 0x04F5, 0xAE6A, 0xAE6B, 0x2626, 0xAE6C, 0xAE6C, 0x04F7,
+ 0xAE6D, 0xAE6F, 0x2628, 0xAE70, 0xAE70, 0x04F8, 0xAE71, 0xAE77, 0x262B,
+ 0xAE78, 0xAE79, 0x04F9, 0xAE7A, 0xAE7A, 0x2632, 0xAE7B, 0xAE7D, 0x04FB,
+ 0xAE7E, 0xAE83, 0x2633, 0xAE84, 0xAE85, 0x04FE, 0xAE86, 0xAE8B, 0x2639,
+ 0xAE8C, 0xAE8C, 0x0500, 0xAE8D, 0xAEBB, 0x263F, 0xAEBC, 0xAEBE, 0x0501,
+ 0xAEBF, 0xAEBF, 0x266E, 0xAEC0, 0xAEC0, 0x0504, 0xAEC1, 0xAEC3, 0x266F,
+ 0xAEC4, 0xAEC4, 0x0505, 0xAEC5, 0xAECB, 0x2672, 0xAECC, 0xAECD, 0x0506,
+ 0xAECE, 0xAECE, 0x2679, 0xAECF, 0xAED1, 0x0508, 0xAED2, 0xAED7, 0x267A,
+ 0xAED8, 0xAED9, 0x050B, 0xAEDA, 0xAEDB, 0x2680, 0xAEDC, 0xAEDC, 0x050D,
+ 0xAEDD, 0xAEE7, 0x2682, 0xAEE8, 0xAEE8, 0x050E, 0xAEE9, 0xAEEA, 0x268D,
+ 0xAEEB, 0xAEEB, 0x050F, 0xAEEC, 0xAEEC, 0x268F, 0xAEED, 0xAEED, 0x0510,
+ 0xAEEE, 0xAEF3, 0x2690, 0xAEF4, 0xAEF4, 0x0511, 0xAEF5, 0xAEF7, 0x2696,
+ 0xAEF8, 0xAEF8, 0x0512, 0xAEF9, 0xAEFB, 0x2699, 0xAEFC, 0xAEFC, 0x0513,
+ 0xAEFD, 0xAEFF, 0x269C, 0xAF00, 0xAF06, 0x269F, 0xAF07, 0xAF08, 0x0514,
+ 0xAF09, 0xAF0C, 0x26A6, 0xAF0D, 0xAF0D, 0x0516, 0xAF0E, 0xAF0F, 0x26AA,
+ 0xAF10, 0xAF10, 0x0517, 0xAF11, 0xAF2B, 0x26AC, 0xAF2C, 0xAF2D, 0x0518,
+ 0xAF2E, 0xAF2F, 0x26C7, 0xAF30, 0xAF30, 0x051A, 0xAF31, 0xAF31, 0x26C9,
+ 0xAF32, 0xAF32, 0x051B, 0xAF33, 0xAF33, 0x26CA, 0xAF34, 0xAF34, 0x051C,
+ 0xAF35, 0xAF3B, 0x26CB, 0xAF3C, 0xAF3D, 0x051D, 0xAF3E, 0xAF3E, 0x26D2,
+ 0xAF3F, 0xAF3F, 0x051F, 0xAF40, 0xAF40, 0x26D3, 0xAF41, 0xAF43, 0x0520,
+ 0xAF44, 0xAF47, 0x26D4, 0xAF48, 0xAF49, 0x0523, 0xAF4A, 0xAF4F, 0x26D8,
+ 0xAF50, 0xAF50, 0x0525, 0xAF51, 0xAF5B, 0x26DE, 0xAF5C, 0xAF5D, 0x0526,
+ 0xAF5E, 0xAF63, 0x26E9, 0xAF64, 0xAF65, 0x0528, 0xAF66, 0xAF78, 0x26EF,
+ 0xAF79, 0xAF79, 0x052A, 0xAF7A, 0xAF7F, 0x2702, 0xAF80, 0xAF80, 0x052B,
+ 0xAF81, 0xAF83, 0x2708, 0xAF84, 0xAF84, 0x052C, 0xAF85, 0xAF87, 0x270B,
+ 0xAF88, 0xAF88, 0x052D, 0xAF89, 0xAF8F, 0x270E, 0xAF90, 0xAF91, 0x052E,
+ 0xAF92, 0xAF94, 0x2715, 0xAF95, 0xAF95, 0x0530, 0xAF96, 0xAF9B, 0x2718,
+ 0xAF9C, 0xAF9C, 0x0531, 0xAF9D, 0xAFB7, 0x271E, 0xAFB8, 0xAFB9, 0x0532,
+ 0xAFBA, 0xAFBB, 0x2739, 0xAFBC, 0xAFBC, 0x0534, 0xAFBD, 0xAFBF, 0x273B,
+ 0xAFC0, 0xAFC0, 0x0535, 0xAFC1, 0xAFC6, 0x273E, 0xAFC7, 0xAFC9, 0x0536,
+ 0xAFCA, 0xAFCA, 0x2744, 0xAFCB, 0xAFCB, 0x0539, 0xAFCC, 0xAFCC, 0x2745,
+ 0xAFCD, 0xAFCE, 0x053A, 0xAFCF, 0xAFD3, 0x2746, 0xAFD4, 0xAFD4, 0x053C,
+ 0xAFD5, 0xAFDB, 0x274B, 0xAFDC, 0xAFDC, 0x053D, 0xAFDD, 0xAFE7, 0x2752,
+ 0xAFE8, 0xAFE9, 0x053E, 0xAFEA, 0xAFEF, 0x275D, 0xAFF0, 0xAFF1, 0x0540,
+ 0xAFF2, 0xAFF3, 0x2763, 0xAFF4, 0xAFF4, 0x0542, 0xAFF5, 0xAFF7, 0x2765,
+ 0xAFF8, 0xAFF8, 0x0543, 0xAFF9, 0xAFFF, 0x2768, 0xB000, 0xB001, 0x0544,
+ 0xB002, 0xB003, 0x276F, 0xB004, 0xB004, 0x0546, 0xB005, 0xB00B, 0x2771,
+ 0xB00C, 0xB00C, 0x0547, 0xB00D, 0xB00F, 0x2778, 0xB010, 0xB010, 0x0548,
+ 0xB011, 0xB013, 0x277B, 0xB014, 0xB014, 0x0549, 0xB015, 0xB01B, 0x277E,
+ 0xB01C, 0xB01D, 0x054A, 0xB01E, 0xB027, 0x2785, 0xB028, 0xB028, 0x054C,
+ 0xB029, 0xB043, 0x278F, 0xB044, 0xB045, 0x054D, 0xB046, 0xB047, 0x27AA,
+ 0xB048, 0xB048, 0x054F, 0xB049, 0xB049, 0x27AC, 0xB04A, 0xB04A, 0x0550,
+ 0xB04B, 0xB04B, 0x27AD, 0xB04C, 0xB04C, 0x0551, 0xB04D, 0xB04D, 0x27AE,
+ 0xB04E, 0xB04E, 0x0552, 0xB04F, 0xB052, 0x27AF, 0xB053, 0xB055, 0x0553,
+ 0xB056, 0xB056, 0x27B3, 0xB057, 0xB057, 0x0556, 0xB058, 0xB058, 0x27B4,
+ 0xB059, 0xB059, 0x0557, 0xB05A, 0xB05C, 0x27B5, 0xB05D, 0xB05D, 0x0558,
+ 0xB05E, 0xB07B, 0x27B8, 0xB07C, 0xB07D, 0x0559, 0xB07E, 0xB07F, 0x27D6,
+ 0xB080, 0xB080, 0x055B, 0xB081, 0xB083, 0x27D8, 0xB084, 0xB084, 0x055C,
+ 0xB085, 0xB08B, 0x27DB, 0xB08C, 0xB08D, 0x055D, 0xB08E, 0xB08E, 0x27E2,
+ 0xB08F, 0xB08F, 0x055F, 0xB090, 0xB090, 0x27E3, 0xB091, 0xB091, 0x0560,
+ 0xB092, 0xB097, 0x27E4, 0xB098, 0xB09A, 0x0561, 0xB09B, 0xB09B, 0x27EA,
+ 0xB09C, 0xB09C, 0x0564, 0xB09D, 0xB09E, 0x27EB, 0xB09F, 0xB0A2, 0x0565,
+ 0xB0A3, 0xB0A7, 0x27ED, 0xB0A8, 0xB0A9, 0x0569, 0xB0AA, 0xB0AA, 0x27F2,
+ 0xB0AB, 0xB0AF, 0x056B, 0xB0B0, 0xB0B0, 0x27F3, 0xB0B1, 0xB0B1, 0x0570,
+ 0xB0B2, 0xB0B2, 0x27F4, 0xB0B3, 0xB0B5, 0x0571, 0xB0B6, 0xB0B7, 0x27F5,
+ 0xB0B8, 0xB0B8, 0x0574, 0xB0B9, 0xB0BB, 0x27F7, 0xB0BC, 0xB0BC, 0x0575,
+ 0xB0BD, 0xB0C3, 0x27FA, 0xB0C4, 0xB0C5, 0x0576, 0xB0C6, 0xB0C6, 0x2801,
+ 0xB0C7, 0xB0C9, 0x0578, 0xB0CA, 0xB0CF, 0x2802, 0xB0D0, 0xB0D1, 0x057B,
+ 0xB0D2, 0xB0D3, 0x2808, 0xB0D4, 0xB0D4, 0x057D, 0xB0D5, 0xB0D7, 0x280A,
+ 0xB0D8, 0xB0D8, 0x057E, 0xB0D9, 0xB0DF, 0x280D, 0xB0E0, 0xB0E0, 0x057F,
+ 0xB0E1, 0xB0E4, 0x2814, 0xB0E5, 0xB0E5, 0x0580, 0xB0E6, 0xB0FF, 0x2818,
+ 0xB100, 0xB107, 0x2832, 0xB108, 0xB109, 0x0581, 0xB10A, 0xB10A, 0x283A,
+ 0xB10B, 0xB10C, 0x0583, 0xB10D, 0xB10F, 0x283B, 0xB110, 0xB110, 0x0585,
+ 0xB111, 0xB111, 0x283E, 0xB112, 0xB113, 0x0586, 0xB114, 0xB117, 0x283F,
+ 0xB118, 0xB119, 0x0588, 0xB11A, 0xB11A, 0x2843, 0xB11B, 0xB11D, 0x058A,
+ 0xB11E, 0xB122, 0x2844, 0xB123, 0xB125, 0x058D, 0xB126, 0xB127, 0x2849,
+ 0xB128, 0xB128, 0x0590, 0xB129, 0xB12B, 0x284B, 0xB12C, 0xB12C, 0x0591,
+ 0xB12D, 0xB133, 0x284E, 0xB134, 0xB135, 0x0592, 0xB136, 0xB136, 0x2855,
+ 0xB137, 0xB139, 0x0594, 0xB13A, 0xB13F, 0x2856, 0xB140, 0xB141, 0x0597,
+ 0xB142, 0xB143, 0x285C, 0xB144, 0xB144, 0x0599, 0xB145, 0xB147, 0x285E,
+ 0xB148, 0xB148, 0x059A, 0xB149, 0xB14F, 0x2861, 0xB150, 0xB151, 0x059B,
+ 0xB152, 0xB153, 0x2868, 0xB154, 0xB155, 0x059D, 0xB156, 0xB157, 0x286A,
+ 0xB158, 0xB158, 0x059F, 0xB159, 0xB15B, 0x286C, 0xB15C, 0xB15C, 0x05A0,
+ 0xB15D, 0xB15F, 0x286F, 0xB160, 0xB160, 0x05A1, 0xB161, 0xB177, 0x2872,
+ 0xB178, 0xB179, 0x05A2, 0xB17A, 0xB17B, 0x2889, 0xB17C, 0xB17C, 0x05A4,
+ 0xB17D, 0xB17F, 0x288B, 0xB180, 0xB180, 0x05A5, 0xB181, 0xB181, 0x288E,
+ 0xB182, 0xB182, 0x05A6, 0xB183, 0xB187, 0x288F, 0xB188, 0xB189, 0x05A7,
+ 0xB18A, 0xB18A, 0x2894, 0xB18B, 0xB18B, 0x05A9, 0xB18C, 0xB18C, 0x2895,
+ 0xB18D, 0xB18D, 0x05AA, 0xB18E, 0xB191, 0x2896, 0xB192, 0xB194, 0x05AB,
+ 0xB195, 0xB197, 0x289A, 0xB198, 0xB198, 0x05AE, 0xB199, 0xB19B, 0x289D,
+ 0xB19C, 0xB19C, 0x05AF, 0xB19D, 0xB1A7, 0x28A0, 0xB1A8, 0xB1A8, 0x05B0,
+ 0xB1A9, 0xB1CB, 0x28AB, 0xB1CC, 0xB1CC, 0x05B1, 0xB1CD, 0xB1CF, 0x28CE,
+ 0xB1D0, 0xB1D0, 0x05B2, 0xB1D1, 0xB1D3, 0x28D1, 0xB1D4, 0xB1D4, 0x05B3,
+ 0xB1D5, 0xB1DB, 0x28D4, 0xB1DC, 0xB1DD, 0x05B4, 0xB1DE, 0xB1DE, 0x28DB,
+ 0xB1DF, 0xB1DF, 0x05B6, 0xB1E0, 0xB1E7, 0x28DC, 0xB1E8, 0xB1E9, 0x05B7,
+ 0xB1EA, 0xB1EB, 0x28E4, 0xB1EC, 0xB1EC, 0x05B9, 0xB1ED, 0xB1EF, 0x28E6,
+ 0xB1F0, 0xB1F0, 0x05BA, 0xB1F1, 0xB1F8, 0x28E9, 0xB1F9, 0xB1F9, 0x05BB,
+ 0xB1FA, 0xB1FA, 0x28F1, 0xB1FB, 0xB1FB, 0x05BC, 0xB1FC, 0xB1FC, 0x28F2,
+ 0xB1FD, 0xB1FD, 0x05BD, 0xB1FE, 0xB1FF, 0x28F3, 0xB200, 0xB203, 0x28F5,
+ 0xB204, 0xB205, 0x05BE, 0xB206, 0xB207, 0x28F9, 0xB208, 0xB208, 0x05C0,
+ 0xB209, 0xB20A, 0x28FB, 0xB20B, 0xB20C, 0x05C1, 0xB20D, 0xB213, 0x28FD,
+ 0xB214, 0xB215, 0x05C3, 0xB216, 0xB216, 0x2904, 0xB217, 0xB217, 0x05C5,
+ 0xB218, 0xB218, 0x2905, 0xB219, 0xB219, 0x05C6, 0xB21A, 0xB21F, 0x2906,
+ 0xB220, 0xB220, 0x05C7, 0xB221, 0xB233, 0x290C, 0xB234, 0xB234, 0x05C8,
+ 0xB235, 0xB23B, 0x291F, 0xB23C, 0xB23C, 0x05C9, 0xB23D, 0xB257, 0x2926,
+ 0xB258, 0xB258, 0x05CA, 0xB259, 0xB25B, 0x2941, 0xB25C, 0xB25C, 0x05CB,
+ 0xB25D, 0xB25F, 0x2944, 0xB260, 0xB260, 0x05CC, 0xB261, 0xB267, 0x2947,
+ 0xB268, 0xB269, 0x05CD, 0xB26A, 0xB273, 0x294E, 0xB274, 0xB275, 0x05CF,
+ 0xB276, 0xB27B, 0x2958, 0xB27C, 0xB27C, 0x05D1, 0xB27D, 0xB283, 0x295E,
+ 0xB284, 0xB285, 0x05D2, 0xB286, 0xB288, 0x2965, 0xB289, 0xB289, 0x05D4,
+ 0xB28A, 0xB28F, 0x2968, 0xB290, 0xB291, 0x05D5, 0xB292, 0xB293, 0x296E,
+ 0xB294, 0xB294, 0x05D7, 0xB295, 0xB297, 0x2970, 0xB298, 0xB29A, 0x05D8,
+ 0xB29B, 0xB29F, 0x2973, 0xB2A0, 0xB2A1, 0x05DB, 0xB2A2, 0xB2A2, 0x2978,
+ 0xB2A3, 0xB2A3, 0x05DD, 0xB2A4, 0xB2A4, 0x2979, 0xB2A5, 0xB2A6, 0x05DE,
+ 0xB2A7, 0xB2A9, 0x297A, 0xB2AA, 0xB2AA, 0x05E0, 0xB2AB, 0xB2AB, 0x297D,
+ 0xB2AC, 0xB2AC, 0x05E1, 0xB2AD, 0xB2AF, 0x297E, 0xB2B0, 0xB2B0, 0x05E2,
+ 0xB2B1, 0xB2B3, 0x2981, 0xB2B4, 0xB2B4, 0x05E3, 0xB2B5, 0xB2C7, 0x2984,
+ 0xB2C8, 0xB2C9, 0x05E4, 0xB2CA, 0xB2CB, 0x2997, 0xB2CC, 0xB2CC, 0x05E6,
+ 0xB2CD, 0xB2CF, 0x2999, 0xB2D0, 0xB2D0, 0x05E7, 0xB2D1, 0xB2D1, 0x299C,
+ 0xB2D2, 0xB2D2, 0x05E8, 0xB2D3, 0xB2D7, 0x299D, 0xB2D8, 0xB2D9, 0x05E9,
+ 0xB2DA, 0xB2DA, 0x29A2, 0xB2DB, 0xB2DB, 0x05EB, 0xB2DC, 0xB2DC, 0x29A3,
+ 0xB2DD, 0xB2DD, 0x05EC, 0xB2DE, 0xB2E1, 0x29A4, 0xB2E2, 0xB2E2, 0x05ED,
+ 0xB2E3, 0xB2E3, 0x29A8, 0xB2E4, 0xB2E6, 0x05EE, 0xB2E7, 0xB2E7, 0x29A9,
+ 0xB2E8, 0xB2E8, 0x05F1, 0xB2E9, 0xB2EA, 0x29AA, 0xB2EB, 0xB2EF, 0x05F2,
+ 0xB2F0, 0xB2F2, 0x29AC, 0xB2F3, 0xB2F5, 0x05F7, 0xB2F6, 0xB2F6, 0x29AF,
+ 0xB2F7, 0xB2FB, 0x05FA, 0xB2FC, 0xB2FE, 0x29B0, 0xB2FF, 0xB2FF, 0x05FF,
+ 0xB300, 0xB301, 0x0600, 0xB302, 0xB303, 0x29B3, 0xB304, 0xB304, 0x0602,
+ 0xB305, 0xB307, 0x29B5, 0xB308, 0xB308, 0x0603, 0xB309, 0xB30F, 0x29B8,
+ 0xB310, 0xB311, 0x0604, 0xB312, 0xB312, 0x29BF, 0xB313, 0xB315, 0x0606,
+ 0xB316, 0xB31B, 0x29C0, 0xB31C, 0xB31C, 0x0609, 0xB31D, 0xB353, 0x29C6,
+ 0xB354, 0xB356, 0x060A, 0xB357, 0xB357, 0x29FD, 0xB358, 0xB358, 0x060D,
+ 0xB359, 0xB35A, 0x29FE, 0xB35B, 0xB35C, 0x060E, 0xB35D, 0xB35D, 0x2A00,
+ 0xB35E, 0xB35F, 0x0610, 0xB360, 0xB363, 0x2A01, 0xB364, 0xB365, 0x0612,
+ 0xB366, 0xB366, 0x2A05, 0xB367, 0xB367, 0x0614, 0xB368, 0xB368, 0x2A06,
+ 0xB369, 0xB369, 0x0615, 0xB36A, 0xB36A, 0x2A07, 0xB36B, 0xB36B, 0x0616,
+ 0xB36C, 0xB36D, 0x2A08, 0xB36E, 0xB36E, 0x0617, 0xB36F, 0xB36F, 0x2A0A,
+ 0xB370, 0xB371, 0x0618, 0xB372, 0xB373, 0x2A0B, 0xB374, 0xB374, 0x061A,
+ 0xB375, 0xB377, 0x2A0D, 0xB378, 0xB378, 0x061B, 0xB379, 0xB37F, 0x2A10,
+ 0xB380, 0xB381, 0x061C, 0xB382, 0xB382, 0x2A17, 0xB383, 0xB385, 0x061E,
+ 0xB386, 0xB38B, 0x2A18, 0xB38C, 0xB38C, 0x0621, 0xB38D, 0xB38F, 0x2A1E,
+ 0xB390, 0xB390, 0x0622, 0xB391, 0xB393, 0x2A21, 0xB394, 0xB394, 0x0623,
+ 0xB395, 0xB39F, 0x2A24, 0xB3A0, 0xB3A1, 0x0624, 0xB3A2, 0xB3A7, 0x2A2F,
+ 0xB3A8, 0xB3A8, 0x0626, 0xB3A9, 0xB3AB, 0x2A35, 0xB3AC, 0xB3AC, 0x0627,
+ 0xB3AD, 0xB3C3, 0x2A38, 0xB3C4, 0xB3C5, 0x0628, 0xB3C6, 0xB3C7, 0x2A4F,
+ 0xB3C8, 0xB3C8, 0x062A, 0xB3C9, 0xB3CA, 0x2A51, 0xB3CB, 0xB3CC, 0x062B,
+ 0xB3CD, 0xB3CD, 0x2A53, 0xB3CE, 0xB3CE, 0x062D, 0xB3CF, 0xB3CF, 0x2A54,
+ 0xB3D0, 0xB3D0, 0x062E, 0xB3D1, 0xB3D3, 0x2A55, 0xB3D4, 0xB3D5, 0x062F,
+ 0xB3D6, 0xB3D6, 0x2A58, 0xB3D7, 0xB3D7, 0x0631, 0xB3D8, 0xB3D8, 0x2A59,
+ 0xB3D9, 0xB3D9, 0x0632, 0xB3DA, 0xB3DA, 0x2A5A, 0xB3DB, 0xB3DB, 0x0633,
+ 0xB3DC, 0xB3DC, 0x2A5B, 0xB3DD, 0xB3DD, 0x0634, 0xB3DE, 0xB3DF, 0x2A5C,
+ 0xB3E0, 0xB3E0, 0x0635, 0xB3E1, 0xB3E3, 0x2A5E, 0xB3E4, 0xB3E4, 0x0636,
+ 0xB3E5, 0xB3E7, 0x2A61, 0xB3E8, 0xB3E8, 0x0637, 0xB3E9, 0xB3FB, 0x2A64,
+ 0xB3FC, 0xB3FC, 0x0638, 0xB3FD, 0xB3FF, 0x2A77, 0xB400, 0xB40F, 0x2A7A,
+ 0xB410, 0xB410, 0x0639, 0xB411, 0xB417, 0x2A8A, 0xB418, 0xB418, 0x063A,
+ 0xB419, 0xB41B, 0x2A91, 0xB41C, 0xB41C, 0x063B, 0xB41D, 0xB41F, 0x2A94,
+ 0xB420, 0xB420, 0x063C, 0xB421, 0xB427, 0x2A97, 0xB428, 0xB429, 0x063D,
+ 0xB42A, 0xB42A, 0x2A9E, 0xB42B, 0xB42B, 0x063F, 0xB42C, 0xB433, 0x2A9F,
+ 0xB434, 0xB434, 0x0640, 0xB435, 0xB44F, 0x2AA7, 0xB450, 0xB451, 0x0641,
+ 0xB452, 0xB453, 0x2AC2, 0xB454, 0xB454, 0x0643, 0xB455, 0xB457, 0x2AC4,
+ 0xB458, 0xB458, 0x0644, 0xB459, 0xB45F, 0x2AC7, 0xB460, 0xB461, 0x0645,
+ 0xB462, 0xB462, 0x2ACE, 0xB463, 0xB463, 0x0647, 0xB464, 0xB464, 0x2ACF,
+ 0xB465, 0xB465, 0x0648, 0xB466, 0xB46B, 0x2AD0, 0xB46C, 0xB46C, 0x0649,
+ 0xB46D, 0xB47F, 0x2AD6, 0xB480, 0xB480, 0x064A, 0xB481, 0xB487, 0x2AE9,
+ 0xB488, 0xB488, 0x064B, 0xB489, 0xB49C, 0x2AF0, 0xB49D, 0xB49D, 0x064C,
+ 0xB49E, 0xB4A3, 0x2B04, 0xB4A4, 0xB4A4, 0x064D, 0xB4A5, 0xB4A7, 0x2B0A,
+ 0xB4A8, 0xB4A8, 0x064E, 0xB4A9, 0xB4AB, 0x2B0D, 0xB4AC, 0xB4AC, 0x064F,
+ 0xB4AD, 0xB4B4, 0x2B10, 0xB4B5, 0xB4B5, 0x0650, 0xB4B6, 0xB4B6, 0x2B18,
+ 0xB4B7, 0xB4B7, 0x0651, 0xB4B8, 0xB4B8, 0x2B19, 0xB4B9, 0xB4B9, 0x0652,
+ 0xB4BA, 0xB4BF, 0x2B1A, 0xB4C0, 0xB4C0, 0x0653, 0xB4C1, 0xB4C3, 0x2B20,
+ 0xB4C4, 0xB4C4, 0x0654, 0xB4C5, 0xB4C7, 0x2B23, 0xB4C8, 0xB4C8, 0x0655,
+ 0xB4C9, 0xB4CF, 0x2B26, 0xB4D0, 0xB4D0, 0x0656, 0xB4D1, 0xB4D4, 0x2B2D,
+ 0xB4D5, 0xB4D5, 0x0657, 0xB4D6, 0xB4DB, 0x2B31, 0xB4DC, 0xB4DD, 0x0658,
+ 0xB4DE, 0xB4DF, 0x2B37, 0xB4E0, 0xB4E0, 0x065A, 0xB4E1, 0xB4E2, 0x2B39,
+ 0xB4E3, 0xB4E4, 0x065B, 0xB4E5, 0xB4E5, 0x2B3B, 0xB4E6, 0xB4E6, 0x065D,
+ 0xB4E7, 0xB4EB, 0x2B3C, 0xB4EC, 0xB4ED, 0x065E, 0xB4EE, 0xB4EE, 0x2B41,
+ 0xB4EF, 0xB4EF, 0x0660, 0xB4F0, 0xB4F0, 0x2B42, 0xB4F1, 0xB4F1, 0x0661,
+ 0xB4F2, 0xB4F7, 0x2B43, 0xB4F8, 0xB4F8, 0x0662, 0xB4F9, 0xB4FF, 0x2B49,
+ 0xB500, 0xB513, 0x2B50, 0xB514, 0xB515, 0x0663, 0xB516, 0xB517, 0x2B64,
+ 0xB518, 0xB518, 0x0665, 0xB519, 0xB51A, 0x2B66, 0xB51B, 0xB51C, 0x0666,
+ 0xB51D, 0xB523, 0x2B68, 0xB524, 0xB525, 0x0668, 0xB526, 0xB526, 0x2B6F,
+ 0xB527, 0xB52A, 0x066A, 0xB52B, 0xB52F, 0x2B70, 0xB530, 0xB531, 0x066E,
+ 0xB532, 0xB533, 0x2B75, 0xB534, 0xB534, 0x0670, 0xB535, 0xB537, 0x2B77,
+ 0xB538, 0xB538, 0x0671, 0xB539, 0xB53F, 0x2B7A, 0xB540, 0xB541, 0x0672,
+ 0xB542, 0xB542, 0x2B81, 0xB543, 0xB545, 0x0674, 0xB546, 0xB54A, 0x2B82,
+ 0xB54B, 0xB54D, 0x0677, 0xB54E, 0xB54F, 0x2B87, 0xB550, 0xB550, 0x067A,
+ 0xB551, 0xB553, 0x2B89, 0xB554, 0xB554, 0x067B, 0xB555, 0xB55B, 0x2B8C,
+ 0xB55C, 0xB55D, 0x067C, 0xB55E, 0xB55E, 0x2B93, 0xB55F, 0xB561, 0x067E,
+ 0xB562, 0xB59F, 0x2B94, 0xB5A0, 0xB5A1, 0x0681, 0xB5A2, 0xB5A3, 0x2BD2,
+ 0xB5A4, 0xB5A4, 0x0683, 0xB5A5, 0xB5A7, 0x2BD4, 0xB5A8, 0xB5A8, 0x0684,
+ 0xB5A9, 0xB5A9, 0x2BD7, 0xB5AA, 0xB5AB, 0x0685, 0xB5AC, 0xB5AF, 0x2BD8,
+ 0xB5B0, 0xB5B1, 0x0687, 0xB5B2, 0xB5B2, 0x2BDC, 0xB5B3, 0xB5B5, 0x0689,
+ 0xB5B6, 0xB5BA, 0x2BDD, 0xB5BB, 0xB5BD, 0x068C, 0xB5BE, 0xB5BF, 0x2BE2,
+ 0xB5C0, 0xB5C0, 0x068F, 0xB5C1, 0xB5C3, 0x2BE4, 0xB5C4, 0xB5C4, 0x0690,
+ 0xB5C5, 0xB5CB, 0x2BE7, 0xB5CC, 0xB5CD, 0x0691, 0xB5CE, 0xB5CE, 0x2BEE,
+ 0xB5CF, 0xB5D1, 0x0693, 0xB5D2, 0xB5D7, 0x2BEF, 0xB5D8, 0xB5D8, 0x0696,
+ 0xB5D9, 0xB5EB, 0x2BF5, 0xB5EC, 0xB5EC, 0x0697, 0xB5ED, 0xB5FF, 0x2C08,
+ 0xB600, 0xB60F, 0x2C1B, 0xB610, 0xB611, 0x0698, 0xB612, 0xB613, 0x2C2B,
+ 0xB614, 0xB614, 0x069A, 0xB615, 0xB617, 0x2C2D, 0xB618, 0xB618, 0x069B,
+ 0xB619, 0xB624, 0x2C30, 0xB625, 0xB625, 0x069C, 0xB626, 0xB62B, 0x2C3C,
+ 0xB62C, 0xB62C, 0x069D, 0xB62D, 0xB633, 0x2C42, 0xB634, 0xB634, 0x069E,
+ 0xB635, 0xB647, 0x2C49, 0xB648, 0xB648, 0x069F, 0xB649, 0xB663, 0x2C5C,
+ 0xB664, 0xB664, 0x06A0, 0xB665, 0xB667, 0x2C77, 0xB668, 0xB668, 0x06A1,
+ 0xB669, 0xB69B, 0x2C7A, 0xB69C, 0xB69D, 0x06A2, 0xB69E, 0xB69F, 0x2CAD,
+ 0xB6A0, 0xB6A0, 0x06A4, 0xB6A1, 0xB6A3, 0x2CAF, 0xB6A4, 0xB6A4, 0x06A5,
+ 0xB6A5, 0xB6AA, 0x2CB2, 0xB6AB, 0xB6AC, 0x06A6, 0xB6AD, 0xB6B0, 0x2CB8,
+ 0xB6B1, 0xB6B1, 0x06A8, 0xB6B2, 0xB6D3, 0x2CBC, 0xB6D4, 0xB6D4, 0x06A9,
+ 0xB6D5, 0xB6EF, 0x2CDE, 0xB6F0, 0xB6F0, 0x06AA, 0xB6F1, 0xB6F3, 0x2CF9,
+ 0xB6F4, 0xB6F4, 0x06AB, 0xB6F5, 0xB6F7, 0x2CFC, 0xB6F8, 0xB6F8, 0x06AC,
+ 0xB6F9, 0xB6FF, 0x2CFF, 0xB700, 0xB701, 0x06AD, 0xB702, 0xB704, 0x2D06,
+ 0xB705, 0xB705, 0x06AF, 0xB706, 0xB727, 0x2D09, 0xB728, 0xB729, 0x06B0,
+ 0xB72A, 0xB72B, 0x2D2B, 0xB72C, 0xB72C, 0x06B2, 0xB72D, 0xB72E, 0x2D2D,
+ 0xB72F, 0xB730, 0x06B3, 0xB731, 0xB737, 0x2D2F, 0xB738, 0xB739, 0x06B5,
+ 0xB73A, 0xB73A, 0x2D36, 0xB73B, 0xB73B, 0x06B7, 0xB73C, 0xB743, 0x2D37,
+ 0xB744, 0xB744, 0x06B8, 0xB745, 0xB747, 0x2D3F, 0xB748, 0xB748, 0x06B9,
+ 0xB749, 0xB74B, 0x2D42, 0xB74C, 0xB74C, 0x06BA, 0xB74D, 0xB753, 0x2D45,
+ 0xB754, 0xB755, 0x06BB, 0xB756, 0xB75F, 0x2D4C, 0xB760, 0xB760, 0x06BD,
+ 0xB761, 0xB763, 0x2D56, 0xB764, 0xB764, 0x06BE, 0xB765, 0xB767, 0x2D59,
+ 0xB768, 0xB768, 0x06BF, 0xB769, 0xB76F, 0x2D5C, 0xB770, 0xB771, 0x06C0,
+ 0xB772, 0xB772, 0x2D63, 0xB773, 0xB773, 0x06C2, 0xB774, 0xB774, 0x2D64,
+ 0xB775, 0xB775, 0x06C3, 0xB776, 0xB77B, 0x2D65, 0xB77C, 0xB77D, 0x06C4,
+ 0xB77E, 0xB77F, 0x2D6B, 0xB780, 0xB780, 0x06C6, 0xB781, 0xB783, 0x2D6D,
+ 0xB784, 0xB784, 0x06C7, 0xB785, 0xB78B, 0x2D70, 0xB78C, 0xB78D, 0x06C8,
+ 0xB78E, 0xB78E, 0x2D77, 0xB78F, 0xB792, 0x06CA, 0xB793, 0xB795, 0x2D78,
+ 0xB796, 0xB799, 0x06CE, 0xB79A, 0xB79B, 0x2D7B, 0xB79C, 0xB79C, 0x06D2,
+ 0xB79D, 0xB79F, 0x2D7D, 0xB7A0, 0xB7A0, 0x06D3, 0xB7A1, 0xB7A7, 0x2D80,
+ 0xB7A8, 0xB7A9, 0x06D4, 0xB7AA, 0xB7AA, 0x2D87, 0xB7AB, 0xB7AD, 0x06D6,
+ 0xB7AE, 0xB7B3, 0x2D88, 0xB7B4, 0xB7B5, 0x06D9, 0xB7B6, 0xB7B7, 0x2D8E,
+ 0xB7B8, 0xB7B8, 0x06DB, 0xB7B9, 0xB7C6, 0x2D90, 0xB7C7, 0xB7C7, 0x06DC,
+ 0xB7C8, 0xB7C8, 0x2D9E, 0xB7C9, 0xB7C9, 0x06DD, 0xB7CA, 0xB7EB, 0x2D9F,
+ 0xB7EC, 0xB7ED, 0x06DE, 0xB7EE, 0xB7EF, 0x2DC1, 0xB7F0, 0xB7F0, 0x06E0,
+ 0xB7F1, 0xB7F3, 0x2DC3, 0xB7F4, 0xB7F4, 0x06E1, 0xB7F5, 0xB7FB, 0x2DC6,
+ 0xB7FC, 0xB7FD, 0x06E2, 0xB7FE, 0xB7FE, 0x2DCD, 0xB7FF, 0xB7FF, 0x06E4,
+ 0xB800, 0xB801, 0x06E5, 0xB802, 0xB806, 0x2DCE, 0xB807, 0xB809, 0x06E7,
+ 0xB80A, 0xB80B, 0x2DD3, 0xB80C, 0xB80C, 0x06EA, 0xB80D, 0xB80F, 0x2DD5,
+ 0xB810, 0xB810, 0x06EB, 0xB811, 0xB817, 0x2DD8, 0xB818, 0xB819, 0x06EC,
+ 0xB81A, 0xB81A, 0x2DDF, 0xB81B, 0xB81B, 0x06EE, 0xB81C, 0xB81C, 0x2DE0,
+ 0xB81D, 0xB81D, 0x06EF, 0xB81E, 0xB823, 0x2DE1, 0xB824, 0xB825, 0x06F0,
+ 0xB826, 0xB827, 0x2DE7, 0xB828, 0xB828, 0x06F2, 0xB829, 0xB82B, 0x2DE9,
+ 0xB82C, 0xB82C, 0x06F3, 0xB82D, 0xB833, 0x2DEC, 0xB834, 0xB835, 0x06F4,
+ 0xB836, 0xB836, 0x2DF3, 0xB837, 0xB839, 0x06F6, 0xB83A, 0xB83F, 0x2DF4,
+ 0xB840, 0xB840, 0x06F9, 0xB841, 0xB843, 0x2DFA, 0xB844, 0xB844, 0x06FA,
+ 0xB845, 0xB850, 0x2DFD, 0xB851, 0xB851, 0x06FB, 0xB852, 0xB852, 0x2E09,
+ 0xB853, 0xB853, 0x06FC, 0xB854, 0xB85B, 0x2E0A, 0xB85C, 0xB85D, 0x06FD,
+ 0xB85E, 0xB85F, 0x2E12, 0xB860, 0xB860, 0x06FF, 0xB861, 0xB863, 0x2E14,
+ 0xB864, 0xB864, 0x0700, 0xB865, 0xB86B, 0x2E17, 0xB86C, 0xB86D, 0x0701,
+ 0xB86E, 0xB86E, 0x2E1E, 0xB86F, 0xB86F, 0x0703, 0xB870, 0xB870, 0x2E1F,
+ 0xB871, 0xB871, 0x0704, 0xB872, 0xB877, 0x2E20, 0xB878, 0xB878, 0x0705,
+ 0xB879, 0xB87B, 0x2E26, 0xB87C, 0xB87C, 0x0706, 0xB87D, 0xB88C, 0x2E29,
+ 0xB88D, 0xB88D, 0x0707, 0xB88E, 0xB8A7, 0x2E39, 0xB8A8, 0xB8A8, 0x0708,
+ 0xB8A9, 0xB8AF, 0x2E53, 0xB8B0, 0xB8B0, 0x0709, 0xB8B1, 0xB8B3, 0x2E5A,
+ 0xB8B4, 0xB8B4, 0x070A, 0xB8B5, 0xB8B7, 0x2E5D, 0xB8B8, 0xB8B8, 0x070B,
+ 0xB8B9, 0xB8BF, 0x2E60, 0xB8C0, 0xB8C1, 0x070C, 0xB8C2, 0xB8C2, 0x2E67,
+ 0xB8C3, 0xB8C3, 0x070E, 0xB8C4, 0xB8C4, 0x2E68, 0xB8C5, 0xB8C5, 0x070F,
+ 0xB8C6, 0xB8CB, 0x2E69, 0xB8CC, 0xB8CC, 0x0710, 0xB8CD, 0xB8CF, 0x2E6F,
+ 0xB8D0, 0xB8D0, 0x0711, 0xB8D1, 0xB8D3, 0x2E72, 0xB8D4, 0xB8D4, 0x0712,
+ 0xB8D5, 0xB8DC, 0x2E75, 0xB8DD, 0xB8DD, 0x0713, 0xB8DE, 0xB8DE, 0x2E7D,
+ 0xB8DF, 0xB8DF, 0x0714, 0xB8E0, 0xB8E0, 0x2E7E, 0xB8E1, 0xB8E1, 0x0715,
+ 0xB8E2, 0xB8E7, 0x2E7F, 0xB8E8, 0xB8E9, 0x0716, 0xB8EA, 0xB8EB, 0x2E85,
+ 0xB8EC, 0xB8EC, 0x0718, 0xB8ED, 0xB8EF, 0x2E87, 0xB8F0, 0xB8F0, 0x0719,
+ 0xB8F1, 0xB8F7, 0x2E8A, 0xB8F8, 0xB8F9, 0x071A, 0xB8FA, 0xB8FA, 0x2E91,
+ 0xB8FB, 0xB8FB, 0x071C, 0xB8FC, 0xB8FC, 0x2E92, 0xB8FD, 0xB8FD, 0x071D,
+ 0xB8FE, 0xB8FF, 0x2E93, 0xB900, 0xB903, 0x2E95, 0xB904, 0xB904, 0x071E,
+ 0xB905, 0xB917, 0x2E99, 0xB918, 0xB918, 0x071F, 0xB919, 0xB91F, 0x2EAC,
+ 0xB920, 0xB920, 0x0720, 0xB921, 0xB93B, 0x2EB3, 0xB93C, 0xB93D, 0x0721,
+ 0xB93E, 0xB93F, 0x2ECE, 0xB940, 0xB940, 0x0723, 0xB941, 0xB943, 0x2ED0,
+ 0xB944, 0xB944, 0x0724, 0xB945, 0xB94B, 0x2ED3, 0xB94C, 0xB94C, 0x0725,
+ 0xB94D, 0xB94E, 0x2EDA, 0xB94F, 0xB94F, 0x0726, 0xB950, 0xB950, 0x2EDC,
+ 0xB951, 0xB951, 0x0727, 0xB952, 0xB957, 0x2EDD, 0xB958, 0xB959, 0x0728,
+ 0xB95A, 0xB95B, 0x2EE3, 0xB95C, 0xB95C, 0x072A, 0xB95D, 0xB95F, 0x2EE5,
+ 0xB960, 0xB960, 0x072B, 0xB961, 0xB967, 0x2EE8, 0xB968, 0xB969, 0x072C,
+ 0xB96A, 0xB96A, 0x2EEF, 0xB96B, 0xB96B, 0x072E, 0xB96C, 0xB96C, 0x2EF0,
+ 0xB96D, 0xB96D, 0x072F, 0xB96E, 0xB973, 0x2EF1, 0xB974, 0xB975, 0x0730,
+ 0xB976, 0xB977, 0x2EF7, 0xB978, 0xB978, 0x0732, 0xB979, 0xB97B, 0x2EF9,
+ 0xB97C, 0xB97C, 0x0733, 0xB97D, 0xB983, 0x2EFC, 0xB984, 0xB985, 0x0734,
+ 0xB986, 0xB986, 0x2F03, 0xB987, 0xB987, 0x0736, 0xB988, 0xB988, 0x2F04,
+ 0xB989, 0xB98A, 0x0737, 0xB98B, 0xB98C, 0x2F05, 0xB98D, 0xB98E, 0x0739,
+ 0xB98F, 0xB9AB, 0x2F07, 0xB9AC, 0xB9AD, 0x073B, 0xB9AE, 0xB9AF, 0x2F24,
+ 0xB9B0, 0xB9B0, 0x073D, 0xB9B1, 0xB9B3, 0x2F26, 0xB9B4, 0xB9B4, 0x073E,
+ 0xB9B5, 0xB9BB, 0x2F29, 0xB9BC, 0xB9BD, 0x073F, 0xB9BE, 0xB9BE, 0x2F30,
+ 0xB9BF, 0xB9BF, 0x0741, 0xB9C0, 0xB9C0, 0x2F31, 0xB9C1, 0xB9C1, 0x0742,
+ 0xB9C2, 0xB9C7, 0x2F32, 0xB9C8, 0xB9C9, 0x0743, 0xB9CA, 0xB9CB, 0x2F38,
+ 0xB9CC, 0xB9CC, 0x0745, 0xB9CD, 0xB9CD, 0x2F3A, 0xB9CE, 0xB9D2, 0x0746,
+ 0xB9D3, 0xB9D7, 0x2F3B, 0xB9D8, 0xB9D9, 0x074B, 0xB9DA, 0xB9DA, 0x2F40,
+ 0xB9DB, 0xB9DB, 0x074D, 0xB9DC, 0xB9DC, 0x2F41, 0xB9DD, 0xB9DE, 0x074E,
+ 0xB9DF, 0xB9E0, 0x2F42, 0xB9E1, 0xB9E1, 0x0750, 0xB9E2, 0xB9E2, 0x2F44,
+ 0xB9E3, 0xB9E5, 0x0751, 0xB9E6, 0xB9E7, 0x2F45, 0xB9E8, 0xB9E8, 0x0754,
+ 0xB9E9, 0xB9EB, 0x2F47, 0xB9EC, 0xB9EC, 0x0755, 0xB9ED, 0xB9F3, 0x2F4A,
+ 0xB9F4, 0xB9F5, 0x0756, 0xB9F6, 0xB9F6, 0x2F51, 0xB9F7, 0xB9FA, 0x0758,
+ 0xB9FB, 0xB9FF, 0x2F52, 0xBA00, 0xBA01, 0x075C, 0xBA02, 0xBA07, 0x2F57,
+ 0xBA08, 0xBA08, 0x075E, 0xBA09, 0xBA14, 0x2F5D, 0xBA15, 0xBA15, 0x075F,
+ 0xBA16, 0xBA37, 0x2F69, 0xBA38, 0xBA39, 0x0760, 0xBA3A, 0xBA3B, 0x2F8B,
+ 0xBA3C, 0xBA3C, 0x0762, 0xBA3D, 0xBA3F, 0x2F8D, 0xBA40, 0xBA40, 0x0763,
+ 0xBA41, 0xBA41, 0x2F90, 0xBA42, 0xBA42, 0x0764, 0xBA43, 0xBA47, 0x2F91,
+ 0xBA48, 0xBA49, 0x0765, 0xBA4A, 0xBA4A, 0x2F96, 0xBA4B, 0xBA4B, 0x0767,
+ 0xBA4C, 0xBA4C, 0x2F97, 0xBA4D, 0xBA4E, 0x0768, 0xBA4F, 0xBA52, 0x2F98,
+ 0xBA53, 0xBA55, 0x076A, 0xBA56, 0xBA57, 0x2F9C, 0xBA58, 0xBA58, 0x076D,
+ 0xBA59, 0xBA5B, 0x2F9E, 0xBA5C, 0xBA5C, 0x076E, 0xBA5D, 0xBA63, 0x2FA1,
+ 0xBA64, 0xBA65, 0x076F, 0xBA66, 0xBA66, 0x2FA8, 0xBA67, 0xBA69, 0x0771,
+ 0xBA6A, 0xBA6F, 0x2FA9, 0xBA70, 0xBA71, 0x0774, 0xBA72, 0xBA73, 0x2FAF,
+ 0xBA74, 0xBA74, 0x0776, 0xBA75, 0xBA77, 0x2FB1, 0xBA78, 0xBA78, 0x0777,
+ 0xBA79, 0xBA82, 0x2FB4, 0xBA83, 0xBA85, 0x0778, 0xBA86, 0xBA86, 0x2FBE,
+ 0xBA87, 0xBA87, 0x077B, 0xBA88, 0xBA8B, 0x2FBF, 0xBA8C, 0xBA8C, 0x077C,
+ 0xBA8D, 0xBAA7, 0x2FC3, 0xBAA8, 0xBAA9, 0x077D, 0xBAAA, 0xBAAA, 0x2FDE,
+ 0xBAAB, 0xBAAC, 0x077F, 0xBAAD, 0xBAAF, 0x2FDF, 0xBAB0, 0xBAB0, 0x0781,
+ 0xBAB1, 0xBAB1, 0x2FE2, 0xBAB2, 0xBAB2, 0x0782, 0xBAB3, 0xBAB7, 0x2FE3,
+ 0xBAB8, 0xBAB9, 0x0783, 0xBABA, 0xBABA, 0x2FE8, 0xBABB, 0xBABB, 0x0785,
+ 0xBABC, 0xBABC, 0x2FE9, 0xBABD, 0xBABD, 0x0786, 0xBABE, 0xBAC3, 0x2FEA,
+ 0xBAC4, 0xBAC4, 0x0787, 0xBAC5, 0xBAC7, 0x2FF0, 0xBAC8, 0xBAC8, 0x0788,
+ 0xBAC9, 0xBAD7, 0x2FF3, 0xBAD8, 0xBAD9, 0x0789, 0xBADA, 0xBAFB, 0x3002,
+ 0xBAFC, 0xBAFC, 0x078B, 0xBAFD, 0xBAFF, 0x3024, 0xBB00, 0xBB00, 0x078C,
+ 0xBB01, 0xBB03, 0x3027, 0xBB04, 0xBB04, 0x078D, 0xBB05, 0xBB0C, 0x302A,
+ 0xBB0D, 0xBB0D, 0x078E, 0xBB0E, 0xBB0E, 0x3032, 0xBB0F, 0xBB0F, 0x078F,
+ 0xBB10, 0xBB10, 0x3033, 0xBB11, 0xBB11, 0x0790, 0xBB12, 0xBB17, 0x3034,
+ 0xBB18, 0xBB18, 0x0791, 0xBB19, 0xBB1B, 0x303A, 0xBB1C, 0xBB1C, 0x0792,
+ 0xBB1D, 0xBB1F, 0x303D, 0xBB20, 0xBB20, 0x0793, 0xBB21, 0xBB28, 0x3040,
+ 0xBB29, 0xBB29, 0x0794, 0xBB2A, 0xBB2A, 0x3048, 0xBB2B, 0xBB2B, 0x0795,
+ 0xBB2C, 0xBB33, 0x3049, 0xBB34, 0xBB36, 0x0796, 0xBB37, 0xBB37, 0x3051,
+ 0xBB38, 0xBB38, 0x0799, 0xBB39, 0xBB3A, 0x3052, 0xBB3B, 0xBB3E, 0x079A,
+ 0xBB3F, 0xBB43, 0x3054, 0xBB44, 0xBB45, 0x079E, 0xBB46, 0xBB46, 0x3059,
+ 0xBB47, 0xBB47, 0x07A0, 0xBB48, 0xBB48, 0x305A, 0xBB49, 0xBB49, 0x07A1,
+ 0xBB4A, 0xBB4C, 0x305B, 0xBB4D, 0xBB4D, 0x07A2, 0xBB4E, 0xBB4E, 0x305E,
+ 0xBB4F, 0xBB50, 0x07A3, 0xBB51, 0xBB53, 0x305F, 0xBB54, 0xBB54, 0x07A5,
+ 0xBB55, 0xBB57, 0x3062, 0xBB58, 0xBB58, 0x07A6, 0xBB59, 0xBB60, 0x3065,
+ 0xBB61, 0xBB61, 0x07A7, 0xBB62, 0xBB62, 0x306D, 0xBB63, 0xBB63, 0x07A8,
+ 0xBB64, 0xBB6B, 0x306E, 0xBB6C, 0xBB6C, 0x07A9, 0xBB6D, 0xBB87, 0x3076,
+ 0xBB88, 0xBB88, 0x07AA, 0xBB89, 0xBB8B, 0x3091, 0xBB8C, 0xBB8C, 0x07AB,
+ 0xBB8D, 0xBB8F, 0x3094, 0xBB90, 0xBB90, 0x07AC, 0xBB91, 0xBBA3, 0x3097,
+ 0xBBA4, 0xBBA4, 0x07AD, 0xBBA5, 0xBBA7, 0x30AA, 0xBBA8, 0xBBA8, 0x07AE,
+ 0xBBA9, 0xBBAB, 0x30AD, 0xBBAC, 0xBBAC, 0x07AF, 0xBBAD, 0xBBB3, 0x30B0,
+ 0xBBB4, 0xBBB4, 0x07B0, 0xBBB5, 0xBBB6, 0x30B7, 0xBBB7, 0xBBB7, 0x07B1,
+ 0xBBB8, 0xBBBF, 0x30B9, 0xBBC0, 0xBBC0, 0x07B2, 0xBBC1, 0xBBC3, 0x30C1,
+ 0xBBC4, 0xBBC4, 0x07B3, 0xBBC5, 0xBBC7, 0x30C4, 0xBBC8, 0xBBC8, 0x07B4,
+ 0xBBC9, 0xBBCF, 0x30C7, 0xBBD0, 0xBBD0, 0x07B5, 0xBBD1, 0xBBD2, 0x30CE,
+ 0xBBD3, 0xBBD3, 0x07B6, 0xBBD4, 0xBBF7, 0x30D0, 0xBBF8, 0xBBF9, 0x07B7,
+ 0xBBFA, 0xBBFB, 0x30F4, 0xBBFC, 0xBBFC, 0x07B9, 0xBBFD, 0xBBFE, 0x30F6,
+ 0xBBFF, 0xBBFF, 0x07BA, 0xBC00, 0xBC00, 0x07BB, 0xBC01, 0xBC01, 0x30F8,
+ 0xBC02, 0xBC02, 0x07BC, 0xBC03, 0xBC07, 0x30F9, 0xBC08, 0xBC09, 0x07BD,
+ 0xBC0A, 0xBC0A, 0x30FE, 0xBC0B, 0xBC0D, 0x07BF, 0xBC0E, 0xBC0E, 0x30FF,
+ 0xBC0F, 0xBC0F, 0x07C2, 0xBC10, 0xBC10, 0x3100, 0xBC11, 0xBC11, 0x07C3,
+ 0xBC12, 0xBC13, 0x3101, 0xBC14, 0xBC18, 0x07C4, 0xBC19, 0xBC1A, 0x3103,
+ 0xBC1B, 0xBC1F, 0x07C9, 0xBC20, 0xBC23, 0x3105, 0xBC24, 0xBC25, 0x07CE,
+ 0xBC26, 0xBC26, 0x3109, 0xBC27, 0xBC27, 0x07D0, 0xBC28, 0xBC28, 0x310A,
+ 0xBC29, 0xBC29, 0x07D1, 0xBC2A, 0xBC2C, 0x310B, 0xBC2D, 0xBC2D, 0x07D2,
+ 0xBC2E, 0xBC2F, 0x310E, 0xBC30, 0xBC31, 0x07D3, 0xBC32, 0xBC33, 0x3110,
+ 0xBC34, 0xBC34, 0x07D5, 0xBC35, 0xBC37, 0x3112, 0xBC38, 0xBC38, 0x07D6,
+ 0xBC39, 0xBC3F, 0x3115, 0xBC40, 0xBC41, 0x07D7, 0xBC42, 0xBC42, 0x311C,
+ 0xBC43, 0xBC45, 0x07D9, 0xBC46, 0xBC48, 0x311D, 0xBC49, 0xBC49, 0x07DC,
+ 0xBC4A, 0xBC4B, 0x3120, 0xBC4C, 0xBC4D, 0x07DD, 0xBC4E, 0xBC4F, 0x3122,
+ 0xBC50, 0xBC50, 0x07DF, 0xBC51, 0xBC5C, 0x3124, 0xBC5D, 0xBC5D, 0x07E0,
+ 0xBC5E, 0xBC83, 0x3130, 0xBC84, 0xBC85, 0x07E1, 0xBC86, 0xBC87, 0x3156,
+ 0xBC88, 0xBC88, 0x07E3, 0xBC89, 0xBC8A, 0x3158, 0xBC8B, 0xBC8C, 0x07E4,
+ 0xBC8D, 0xBC8D, 0x315A, 0xBC8E, 0xBC8E, 0x07E6, 0xBC8F, 0xBC93, 0x315B,
+ 0xBC94, 0xBC95, 0x07E7, 0xBC96, 0xBC96, 0x3160, 0xBC97, 0xBC97, 0x07E9,
+ 0xBC98, 0xBC98, 0x3161, 0xBC99, 0xBC9A, 0x07EA, 0xBC9B, 0xBC9F, 0x3162,
+ 0xBCA0, 0xBCA1, 0x07EC, 0xBCA2, 0xBCA3, 0x3167, 0xBCA4, 0xBCA4, 0x07EE,
+ 0xBCA5, 0xBCA6, 0x3169, 0xBCA7, 0xBCA8, 0x07EF, 0xBCA9, 0xBCAF, 0x316B,
+ 0xBCB0, 0xBCB1, 0x07F1, 0xBCB2, 0xBCB2, 0x3172, 0xBCB3, 0xBCB5, 0x07F3,
+ 0xBCB6, 0xBCBB, 0x3173, 0xBCBC, 0xBCBD, 0x07F6, 0xBCBE, 0xBCBF, 0x3179,
+ 0xBCC0, 0xBCC0, 0x07F8, 0xBCC1, 0xBCC3, 0x317B, 0xBCC4, 0xBCC4, 0x07F9,
+ 0xBCC5, 0xBCCC, 0x317E, 0xBCCD, 0xBCCD, 0x07FA, 0xBCCE, 0xBCCE, 0x3186,
+ 0xBCCF, 0xBCD1, 0x07FB, 0xBCD2, 0xBCD4, 0x3187, 0xBCD5, 0xBCD5, 0x07FE,
+ 0xBCD6, 0xBCD7, 0x318A, 0xBCD8, 0xBCD8, 0x07FF, 0xBCD9, 0xBCDB, 0x318C,
+ 0xBCDC, 0xBCDC, 0x0800, 0xBCDD, 0xBCF3, 0x318F, 0xBCF4, 0xBCF6, 0x0801,
+ 0xBCF7, 0xBCF7, 0x31A6, 0xBCF8, 0xBCF8, 0x0804, 0xBCF9, 0xBCFB, 0x31A7,
+ 0xBCFC, 0xBCFC, 0x0805, 0xBCFD, 0xBCFF, 0x31AA, 0xBD00, 0xBD03, 0x31AD,
+ 0xBD04, 0xBD05, 0x0806, 0xBD06, 0xBD06, 0x31B1, 0xBD07, 0xBD07, 0x0808,
+ 0xBD08, 0xBD08, 0x31B2, 0xBD09, 0xBD09, 0x0809, 0xBD0A, 0xBD0F, 0x31B3,
+ 0xBD10, 0xBD10, 0x080A, 0xBD11, 0xBD13, 0x31B9, 0xBD14, 0xBD14, 0x080B,
+ 0xBD15, 0xBD23, 0x31BC, 0xBD24, 0xBD24, 0x080C, 0xBD25, 0xBD2B, 0x31CB,
+ 0xBD2C, 0xBD2C, 0x080D, 0xBD2D, 0xBD3F, 0x31D2, 0xBD40, 0xBD40, 0x080E,
+ 0xBD41, 0xBD47, 0x31E5, 0xBD48, 0xBD49, 0x080F, 0xBD4A, 0xBD4B, 0x31EC,
+ 0xBD4C, 0xBD4C, 0x0811, 0xBD4D, 0xBD4F, 0x31EE, 0xBD50, 0xBD50, 0x0812,
+ 0xBD51, 0xBD57, 0x31F1, 0xBD58, 0xBD59, 0x0813, 0xBD5A, 0xBD63, 0x31F8,
+ 0xBD64, 0xBD64, 0x0815, 0xBD65, 0xBD67, 0x3202, 0xBD68, 0xBD68, 0x0816,
+ 0xBD69, 0xBD7F, 0x3205, 0xBD80, 0xBD81, 0x0817, 0xBD82, 0xBD83, 0x321C,
+ 0xBD84, 0xBD84, 0x0819, 0xBD85, 0xBD86, 0x321E, 0xBD87, 0xBD8A, 0x081A,
+ 0xBD8B, 0xBD8F, 0x3220, 0xBD90, 0xBD91, 0x081E, 0xBD92, 0xBD92, 0x3225,
+ 0xBD93, 0xBD93, 0x0820, 0xBD94, 0xBD94, 0x3226, 0xBD95, 0xBD95, 0x0821,
+ 0xBD96, 0xBD98, 0x3227, 0xBD99, 0xBD9A, 0x0822, 0xBD9B, 0xBD9B, 0x322A,
+ 0xBD9C, 0xBD9C, 0x0824, 0xBD9D, 0xBDA3, 0x322B, 0xBDA4, 0xBDA4, 0x0825,
+ 0xBDA5, 0xBDAF, 0x3232, 0xBDB0, 0xBDB0, 0x0826, 0xBDB1, 0xBDB7, 0x323D,
+ 0xBDB8, 0xBDB8, 0x0827, 0xBDB9, 0xBDD3, 0x3244, 0xBDD4, 0xBDD5, 0x0828,
+ 0xBDD6, 0xBDD7, 0x325F, 0xBDD8, 0xBDD8, 0x082A, 0xBDD9, 0xBDDB, 0x3261,
+ 0xBDDC, 0xBDDC, 0x082B, 0xBDDD, 0xBDE8, 0x3264, 0xBDE9, 0xBDE9, 0x082C,
+ 0xBDEA, 0xBDEF, 0x3270, 0xBDF0, 0xBDF0, 0x082D, 0xBDF1, 0xBDF3, 0x3276,
+ 0xBDF4, 0xBDF4, 0x082E, 0xBDF5, 0xBDF7, 0x3279, 0xBDF8, 0xBDF8, 0x082F,
+ 0xBDF9, 0xBDFF, 0x327C, 0xBE00, 0xBE00, 0x0830, 0xBE01, 0xBE02, 0x3283,
+ 0xBE03, 0xBE03, 0x0831, 0xBE04, 0xBE04, 0x3285, 0xBE05, 0xBE05, 0x0832,
+ 0xBE06, 0xBE0B, 0x3286, 0xBE0C, 0xBE0D, 0x0833, 0xBE0E, 0xBE0F, 0x328C,
+ 0xBE10, 0xBE10, 0x0835, 0xBE11, 0xBE13, 0x328E, 0xBE14, 0xBE14, 0x0836,
+ 0xBE15, 0xBE1B, 0x3291, 0xBE1C, 0xBE1D, 0x0837, 0xBE1E, 0xBE1E, 0x3298,
+ 0xBE1F, 0xBE1F, 0x0839, 0xBE20, 0xBE43, 0x3299, 0xBE44, 0xBE45, 0x083A,
+ 0xBE46, 0xBE47, 0x32BD, 0xBE48, 0xBE48, 0x083C, 0xBE49, 0xBE4B, 0x32BF,
+ 0xBE4C, 0xBE4C, 0x083D, 0xBE4D, 0xBE4D, 0x32C2, 0xBE4E, 0xBE4E, 0x083E,
+ 0xBE4F, 0xBE53, 0x32C3, 0xBE54, 0xBE55, 0x083F, 0xBE56, 0xBE56, 0x32C8,
+ 0xBE57, 0xBE57, 0x0841, 0xBE58, 0xBE58, 0x32C9, 0xBE59, 0xBE5B, 0x0842,
+ 0xBE5C, 0xBE5F, 0x32CA, 0xBE60, 0xBE61, 0x0845, 0xBE62, 0xBE63, 0x32CE,
+ 0xBE64, 0xBE64, 0x0847, 0xBE65, 0xBE67, 0x32D0, 0xBE68, 0xBE68, 0x0848,
+ 0xBE69, 0xBE69, 0x32D3, 0xBE6A, 0xBE6A, 0x0849, 0xBE6B, 0xBE6F, 0x32D4,
+ 0xBE70, 0xBE71, 0x084A, 0xBE72, 0xBE72, 0x32D9, 0xBE73, 0xBE75, 0x084C,
+ 0xBE76, 0xBE7A, 0x32DA, 0xBE7B, 0xBE7D, 0x084F, 0xBE7E, 0xBE7F, 0x32DF,
+ 0xBE80, 0xBE80, 0x0852, 0xBE81, 0xBE83, 0x32E1, 0xBE84, 0xBE84, 0x0853,
+ 0xBE85, 0xBE8B, 0x32E4, 0xBE8C, 0xBE8D, 0x0854, 0xBE8E, 0xBE8E, 0x32EB,
+ 0xBE8F, 0xBE91, 0x0856, 0xBE92, 0xBE97, 0x32EC, 0xBE98, 0xBE99, 0x0859,
+ 0xBE9A, 0xBEA7, 0x32F2, 0xBEA8, 0xBEA8, 0x085B, 0xBEA9, 0xBECF, 0x3300,
+ 0xBED0, 0xBED1, 0x085C, 0xBED2, 0xBED3, 0x3327, 0xBED4, 0xBED4, 0x085E,
+ 0xBED5, 0xBED6, 0x3329, 0xBED7, 0xBED8, 0x085F, 0xBED9, 0xBEDF, 0x332B,
+ 0xBEE0, 0xBEE0, 0x0861, 0xBEE1, 0xBEE2, 0x3332, 0xBEE3, 0xBEE5, 0x0862,
+ 0xBEE6, 0xBEEB, 0x3334, 0xBEEC, 0xBEEC, 0x0865, 0xBEED, 0xBEFF, 0x333A,
+ 0xBF00, 0xBF00, 0x334D, 0xBF01, 0xBF01, 0x0866, 0xBF02, 0xBF07, 0x334E,
+ 0xBF08, 0xBF09, 0x0867, 0xBF0A, 0xBF17, 0x3354, 0xBF18, 0xBF19, 0x0869,
+ 0xBF1A, 0xBF1A, 0x3362, 0xBF1B, 0xBF1D, 0x086B, 0xBF1E, 0xBF3F, 0x3363,
+ 0xBF40, 0xBF41, 0x086E, 0xBF42, 0xBF43, 0x3385, 0xBF44, 0xBF44, 0x0870,
+ 0xBF45, 0xBF47, 0x3387, 0xBF48, 0xBF48, 0x0871, 0xBF49, 0xBF4F, 0x338A,
+ 0xBF50, 0xBF51, 0x0872, 0xBF52, 0xBF54, 0x3391, 0xBF55, 0xBF55, 0x0874,
+ 0xBF56, 0xBF93, 0x3394, 0xBF94, 0xBF94, 0x0875, 0xBF95, 0xBFAF, 0x33D2,
+ 0xBFB0, 0xBFB0, 0x0876, 0xBFB1, 0xBFC4, 0x33ED, 0xBFC5, 0xBFC5, 0x0877,
+ 0xBFC6, 0xBFCB, 0x3401, 0xBFCC, 0xBFCD, 0x0878, 0xBFCE, 0xBFCF, 0x3407,
+ 0xBFD0, 0xBFD0, 0x087A, 0xBFD1, 0xBFD3, 0x3409, 0xBFD4, 0xBFD4, 0x087B,
+ 0xBFD5, 0xBFDB, 0x340C, 0xBFDC, 0xBFDC, 0x087C, 0xBFDD, 0xBFDE, 0x3413,
+ 0xBFDF, 0xBFDF, 0x087D, 0xBFE0, 0xBFE0, 0x3415, 0xBFE1, 0xBFE1, 0x087E,
+ 0xBFE2, 0xBFFF, 0x3416, 0xC000, 0xC03B, 0x3434, 0xC03C, 0xC03C, 0x087F,
+ 0xC03D, 0xC050, 0x3470, 0xC051, 0xC051, 0x0880, 0xC052, 0xC057, 0x3484,
+ 0xC058, 0xC058, 0x0881, 0xC059, 0xC05B, 0x348A, 0xC05C, 0xC05C, 0x0882,
+ 0xC05D, 0xC05F, 0x348D, 0xC060, 0xC060, 0x0883, 0xC061, 0xC067, 0x3490,
+ 0xC068, 0xC069, 0x0884, 0xC06A, 0xC08F, 0x3497, 0xC090, 0xC091, 0x0886,
+ 0xC092, 0xC093, 0x34BD, 0xC094, 0xC094, 0x0888, 0xC095, 0xC097, 0x34BF,
+ 0xC098, 0xC098, 0x0889, 0xC099, 0xC09F, 0x34C2, 0xC0A0, 0xC0A1, 0x088A,
+ 0xC0A2, 0xC0A2, 0x34C9, 0xC0A3, 0xC0A3, 0x088C, 0xC0A4, 0xC0A4, 0x34CA,
+ 0xC0A5, 0xC0A5, 0x088D, 0xC0A6, 0xC0AB, 0x34CB, 0xC0AC, 0xC0AD, 0x088E,
+ 0xC0AE, 0xC0AE, 0x34D1, 0xC0AF, 0xC0B0, 0x0890, 0xC0B1, 0xC0B2, 0x34D2,
+ 0xC0B3, 0xC0B6, 0x0892, 0xC0B7, 0xC0BB, 0x34D4, 0xC0BC, 0xC0BD, 0x0896,
+ 0xC0BE, 0xC0BE, 0x34D9, 0xC0BF, 0xC0C1, 0x0898, 0xC0C2, 0xC0C4, 0x34DA,
+ 0xC0C5, 0xC0C5, 0x089B, 0xC0C6, 0xC0C7, 0x34DD, 0xC0C8, 0xC0C9, 0x089C,
+ 0xC0CA, 0xC0CB, 0x34DF, 0xC0CC, 0xC0CC, 0x089E, 0xC0CD, 0xC0CF, 0x34E1,
+ 0xC0D0, 0xC0D0, 0x089F, 0xC0D1, 0xC0D7, 0x34E4, 0xC0D8, 0xC0D9, 0x08A0,
+ 0xC0DA, 0xC0DA, 0x34EB, 0xC0DB, 0xC0DD, 0x08A2, 0xC0DE, 0xC0E3, 0x34EC,
+ 0xC0E4, 0xC0E5, 0x08A5, 0xC0E6, 0xC0E7, 0x34F2, 0xC0E8, 0xC0E8, 0x08A7,
+ 0xC0E9, 0xC0EB, 0x34F4, 0xC0EC, 0xC0EC, 0x08A8, 0xC0ED, 0xC0F3, 0x34F7,
+ 0xC0F4, 0xC0F5, 0x08A9, 0xC0F6, 0xC0F6, 0x34FE, 0xC0F7, 0xC0F7, 0x08AB,
+ 0xC0F8, 0xC0F8, 0x34FF, 0xC0F9, 0xC0F9, 0x08AC, 0xC0FA, 0xC0FF, 0x3500,
+ 0xC100, 0xC100, 0x08AD, 0xC101, 0xC103, 0x3506, 0xC104, 0xC104, 0x08AE,
+ 0xC105, 0xC107, 0x3509, 0xC108, 0xC108, 0x08AF, 0xC109, 0xC10F, 0x350C,
+ 0xC110, 0xC110, 0x08B0, 0xC111, 0xC114, 0x3513, 0xC115, 0xC115, 0x08B1,
+ 0xC116, 0xC11B, 0x3517, 0xC11C, 0xC120, 0x08B2, 0xC121, 0xC122, 0x351D,
+ 0xC123, 0xC124, 0x08B7, 0xC125, 0xC125, 0x351F, 0xC126, 0xC127, 0x08B9,
+ 0xC128, 0xC12B, 0x3520, 0xC12C, 0xC12D, 0x08BB, 0xC12E, 0xC12E, 0x3524,
+ 0xC12F, 0xC131, 0x08BD, 0xC132, 0xC135, 0x3525, 0xC136, 0xC136, 0x08C0,
+ 0xC137, 0xC137, 0x3529, 0xC138, 0xC139, 0x08C1, 0xC13A, 0xC13B, 0x352A,
+ 0xC13C, 0xC13C, 0x08C3, 0xC13D, 0xC13F, 0x352C, 0xC140, 0xC140, 0x08C4,
+ 0xC141, 0xC147, 0x352F, 0xC148, 0xC149, 0x08C5, 0xC14A, 0xC14A, 0x3536,
+ 0xC14B, 0xC14D, 0x08C7, 0xC14E, 0xC153, 0x3537, 0xC154, 0xC155, 0x08CA,
+ 0xC156, 0xC157, 0x353D, 0xC158, 0xC158, 0x08CC, 0xC159, 0xC15B, 0x353F,
+ 0xC15C, 0xC15C, 0x08CD, 0xC15D, 0xC163, 0x3542, 0xC164, 0xC165, 0x08CE,
+ 0xC166, 0xC166, 0x3549, 0xC167, 0xC169, 0x08D0, 0xC16A, 0xC16F, 0x354A,
+ 0xC170, 0xC170, 0x08D3, 0xC171, 0xC173, 0x3550, 0xC174, 0xC174, 0x08D4,
+ 0xC175, 0xC177, 0x3553, 0xC178, 0xC178, 0x08D5, 0xC179, 0xC184, 0x3556,
+ 0xC185, 0xC185, 0x08D6, 0xC186, 0xC18B, 0x3562, 0xC18C, 0xC18E, 0x08D7,
+ 0xC18F, 0xC18F, 0x3568, 0xC190, 0xC190, 0x08DA, 0xC191, 0xC193, 0x3569,
+ 0xC194, 0xC194, 0x08DB, 0xC195, 0xC195, 0x356C, 0xC196, 0xC196, 0x08DC,
+ 0xC197, 0xC19B, 0x356D, 0xC19C, 0xC19D, 0x08DD, 0xC19E, 0xC19E, 0x3572,
+ 0xC19F, 0xC19F, 0x08DF, 0xC1A0, 0xC1A0, 0x3573, 0xC1A1, 0xC1A1, 0x08E0,
+ 0xC1A2, 0xC1A4, 0x3574, 0xC1A5, 0xC1A5, 0x08E1, 0xC1A6, 0xC1A7, 0x3577,
+ 0xC1A8, 0xC1A9, 0x08E2, 0xC1AA, 0xC1AB, 0x3579, 0xC1AC, 0xC1AC, 0x08E4,
+ 0xC1AD, 0xC1AF, 0x357B, 0xC1B0, 0xC1B0, 0x08E5, 0xC1B1, 0xC1BC, 0x357E,
+ 0xC1BD, 0xC1BD, 0x08E6, 0xC1BE, 0xC1C3, 0x358A, 0xC1C4, 0xC1C4, 0x08E7,
+ 0xC1C5, 0xC1C7, 0x3590, 0xC1C8, 0xC1C8, 0x08E8, 0xC1C9, 0xC1CB, 0x3593,
+ 0xC1CC, 0xC1CC, 0x08E9, 0xC1CD, 0xC1D3, 0x3596, 0xC1D4, 0xC1D4, 0x08EA,
+ 0xC1D5, 0xC1D6, 0x359D, 0xC1D7, 0xC1D8, 0x08EB, 0xC1D9, 0xC1DF, 0x359F,
+ 0xC1E0, 0xC1E0, 0x08ED, 0xC1E1, 0xC1E3, 0x35A6, 0xC1E4, 0xC1E4, 0x08EE,
+ 0xC1E5, 0xC1E7, 0x35A9, 0xC1E8, 0xC1E8, 0x08EF, 0xC1E9, 0xC1EF, 0x35AC,
+ 0xC1F0, 0xC1F1, 0x08F0, 0xC1F2, 0xC1F2, 0x35B3, 0xC1F3, 0xC1F3, 0x08F2,
+ 0xC1F4, 0xC1FB, 0x35B4, 0xC1FC, 0xC1FD, 0x08F3, 0xC1FE, 0xC1FF, 0x35BC,
+ 0xC200, 0xC200, 0x08F5, 0xC201, 0xC203, 0x35BE, 0xC204, 0xC204, 0x08F6,
+ 0xC205, 0xC20B, 0x35C1, 0xC20C, 0xC20D, 0x08F7, 0xC20E, 0xC20E, 0x35C8,
+ 0xC20F, 0xC20F, 0x08F9, 0xC210, 0xC210, 0x35C9, 0xC211, 0xC211, 0x08FA,
+ 0xC212, 0xC217, 0x35CA, 0xC218, 0xC219, 0x08FB, 0xC21A, 0xC21B, 0x35D0,
+ 0xC21C, 0xC21C, 0x08FD, 0xC21D, 0xC21E, 0x35D2, 0xC21F, 0xC220, 0x08FE,
+ 0xC221, 0xC227, 0x35D4, 0xC228, 0xC229, 0x0900, 0xC22A, 0xC22A, 0x35DB,
+ 0xC22B, 0xC22B, 0x0902, 0xC22C, 0xC22C, 0x35DC, 0xC22D, 0xC22D, 0x0903,
+ 0xC22E, 0xC22E, 0x35DD, 0xC22F, 0xC22F, 0x0904, 0xC230, 0xC230, 0x35DE,
+ 0xC231, 0xC232, 0x0905, 0xC233, 0xC233, 0x35DF, 0xC234, 0xC234, 0x0907,
+ 0xC235, 0xC247, 0x35E0, 0xC248, 0xC248, 0x0908, 0xC249, 0xC24F, 0x35F3,
+ 0xC250, 0xC251, 0x0909, 0xC252, 0xC253, 0x35FA, 0xC254, 0xC254, 0x090B,
+ 0xC255, 0xC257, 0x35FC, 0xC258, 0xC258, 0x090C, 0xC259, 0xC25F, 0x35FF,
+ 0xC260, 0xC260, 0x090D, 0xC261, 0xC264, 0x3606, 0xC265, 0xC265, 0x090E,
+ 0xC266, 0xC26B, 0x360A, 0xC26C, 0xC26D, 0x090F, 0xC26E, 0xC26F, 0x3610,
+ 0xC270, 0xC270, 0x0911, 0xC271, 0xC273, 0x3612, 0xC274, 0xC274, 0x0912,
+ 0xC275, 0xC27B, 0x3615, 0xC27C, 0xC27D, 0x0913, 0xC27E, 0xC27E, 0x361C,
+ 0xC27F, 0xC27F, 0x0915, 0xC280, 0xC280, 0x361D, 0xC281, 0xC281, 0x0916,
+ 0xC282, 0xC287, 0x361E, 0xC288, 0xC289, 0x0917, 0xC28A, 0xC28F, 0x3624,
+ 0xC290, 0xC290, 0x0919, 0xC291, 0xC297, 0x362A, 0xC298, 0xC298, 0x091A,
+ 0xC299, 0xC29A, 0x3631, 0xC29B, 0xC29B, 0x091B, 0xC29C, 0xC29C, 0x3633,
+ 0xC29D, 0xC29D, 0x091C, 0xC29E, 0xC2A3, 0x3634, 0xC2A4, 0xC2A5, 0x091D,
+ 0xC2A6, 0xC2A7, 0x363A, 0xC2A8, 0xC2A8, 0x091F, 0xC2A9, 0xC2AB, 0x363C,
+ 0xC2AC, 0xC2AD, 0x0920, 0xC2AE, 0xC2B3, 0x363F, 0xC2B4, 0xC2B5, 0x0922,
+ 0xC2B6, 0xC2B6, 0x3645, 0xC2B7, 0xC2B7, 0x0924, 0xC2B8, 0xC2B8, 0x3646,
+ 0xC2B9, 0xC2B9, 0x0925, 0xC2BA, 0xC2DB, 0x3647, 0xC2DC, 0xC2DD, 0x0926,
+ 0xC2DE, 0xC2DF, 0x3669, 0xC2E0, 0xC2E0, 0x0928, 0xC2E1, 0xC2E2, 0x366B,
+ 0xC2E3, 0xC2E4, 0x0929, 0xC2E5, 0xC2EA, 0x366D, 0xC2EB, 0xC2ED, 0x092B,
+ 0xC2EE, 0xC2EE, 0x3673, 0xC2EF, 0xC2EF, 0x092E, 0xC2F0, 0xC2F0, 0x3674,
+ 0xC2F1, 0xC2F1, 0x092F, 0xC2F2, 0xC2F5, 0x3675, 0xC2F6, 0xC2F6, 0x0930,
+ 0xC2F7, 0xC2F7, 0x3679, 0xC2F8, 0xC2F9, 0x0931, 0xC2FA, 0xC2FA, 0x367A,
+ 0xC2FB, 0xC2FC, 0x0933, 0xC2FD, 0xC2FF, 0x367B, 0xC300, 0xC300, 0x0935,
+ 0xC301, 0xC307, 0x367E, 0xC308, 0xC309, 0x0936, 0xC30A, 0xC30B, 0x3685,
+ 0xC30C, 0xC30D, 0x0938, 0xC30E, 0xC312, 0x3687, 0xC313, 0xC315, 0x093A,
+ 0xC316, 0xC317, 0x368C, 0xC318, 0xC318, 0x093D, 0xC319, 0xC31B, 0x368E,
+ 0xC31C, 0xC31C, 0x093E, 0xC31D, 0xC323, 0x3691, 0xC324, 0xC325, 0x093F,
+ 0xC326, 0xC327, 0x3698, 0xC328, 0xC329, 0x0941, 0xC32A, 0xC344, 0x369A,
+ 0xC345, 0xC345, 0x0943, 0xC346, 0xC367, 0x36B5, 0xC368, 0xC369, 0x0944,
+ 0xC36A, 0xC36B, 0x36D7, 0xC36C, 0xC36C, 0x0946, 0xC36D, 0xC36F, 0x36D9,
+ 0xC370, 0xC370, 0x0947, 0xC371, 0xC371, 0x36DC, 0xC372, 0xC372, 0x0948,
+ 0xC373, 0xC377, 0x36DD, 0xC378, 0xC379, 0x0949, 0xC37A, 0xC37B, 0x36E2,
+ 0xC37C, 0xC37D, 0x094B, 0xC37E, 0xC383, 0x36E4, 0xC384, 0xC384, 0x094D,
+ 0xC385, 0xC387, 0x36EA, 0xC388, 0xC388, 0x094E, 0xC389, 0xC38B, 0x36ED,
+ 0xC38C, 0xC38C, 0x094F, 0xC38D, 0xC3BF, 0x36F0, 0xC3C0, 0xC3C0, 0x0950,
+ 0xC3C1, 0xC3D7, 0x3723, 0xC3D8, 0xC3D9, 0x0951, 0xC3DA, 0xC3DB, 0x373A,
+ 0xC3DC, 0xC3DC, 0x0953, 0xC3DD, 0xC3DE, 0x373C, 0xC3DF, 0xC3E0, 0x0954,
+ 0xC3E1, 0xC3E1, 0x373E, 0xC3E2, 0xC3E2, 0x0956, 0xC3E3, 0xC3E7, 0x373F,
+ 0xC3E8, 0xC3E9, 0x0957, 0xC3EA, 0xC3EC, 0x3744, 0xC3ED, 0xC3ED, 0x0959,
+ 0xC3EE, 0xC3F3, 0x3747, 0xC3F4, 0xC3F5, 0x095A, 0xC3F6, 0xC3F7, 0x374D,
+ 0xC3F8, 0xC3F8, 0x095C, 0xC3F9, 0xC3FF, 0x374F, 0xC400, 0xC407, 0x3756,
+ 0xC408, 0xC408, 0x095D, 0xC409, 0xC40F, 0x375E, 0xC410, 0xC410, 0x095E,
+ 0xC411, 0xC423, 0x3765, 0xC424, 0xC424, 0x095F, 0xC425, 0xC42B, 0x3778,
+ 0xC42C, 0xC42C, 0x0960, 0xC42D, 0xC42F, 0x377F, 0xC430, 0xC430, 0x0961,
+ 0xC431, 0xC433, 0x3782, 0xC434, 0xC434, 0x0962, 0xC435, 0xC43B, 0x3785,
+ 0xC43C, 0xC43D, 0x0963, 0xC43E, 0xC447, 0x378C, 0xC448, 0xC448, 0x0965,
+ 0xC449, 0xC463, 0x3796, 0xC464, 0xC465, 0x0966, 0xC466, 0xC467, 0x37B1,
+ 0xC468, 0xC468, 0x0968, 0xC469, 0xC46B, 0x37B3, 0xC46C, 0xC46C, 0x0969,
+ 0xC46D, 0xC473, 0x37B6, 0xC474, 0xC475, 0x096A, 0xC476, 0xC478, 0x37BD,
+ 0xC479, 0xC479, 0x096C, 0xC47A, 0xC47F, 0x37C0, 0xC480, 0xC480, 0x096D,
+ 0xC481, 0xC493, 0x37C6, 0xC494, 0xC494, 0x096E, 0xC495, 0xC49B, 0x37D9,
+ 0xC49C, 0xC49C, 0x096F, 0xC49D, 0xC4B7, 0x37E0, 0xC4B8, 0xC4B8, 0x0970,
+ 0xC4B9, 0xC4BB, 0x37FB, 0xC4BC, 0xC4BC, 0x0971, 0xC4BD, 0xC4E8, 0x37FE,
+ 0xC4E9, 0xC4E9, 0x0972, 0xC4EA, 0xC4EF, 0x382A, 0xC4F0, 0xC4F1, 0x0973,
+ 0xC4F2, 0xC4F3, 0x3830, 0xC4F4, 0xC4F4, 0x0975, 0xC4F5, 0xC4F7, 0x3832,
+ 0xC4F8, 0xC4F8, 0x0976, 0xC4F9, 0xC4F9, 0x3835, 0xC4FA, 0xC4FA, 0x0977,
+ 0xC4FB, 0xC4FE, 0x3836, 0xC4FF, 0xC4FF, 0x0978, 0xC500, 0xC501, 0x0979,
+ 0xC502, 0xC50B, 0x383A, 0xC50C, 0xC50C, 0x097B, 0xC50D, 0xC50F, 0x3844,
+ 0xC510, 0xC510, 0x097C, 0xC511, 0xC513, 0x3847, 0xC514, 0xC514, 0x097D,
+ 0xC515, 0xC51B, 0x384A, 0xC51C, 0xC51C, 0x097E, 0xC51D, 0xC527, 0x3851,
+ 0xC528, 0xC529, 0x097F, 0xC52A, 0xC52B, 0x385C, 0xC52C, 0xC52C, 0x0981,
+ 0xC52D, 0xC52F, 0x385E, 0xC530, 0xC530, 0x0982, 0xC531, 0xC537, 0x3861,
+ 0xC538, 0xC539, 0x0983, 0xC53A, 0xC53A, 0x3868, 0xC53B, 0xC53B, 0x0985,
+ 0xC53C, 0xC53C, 0x3869, 0xC53D, 0xC53D, 0x0986, 0xC53E, 0xC543, 0x386A,
+ 0xC544, 0xC545, 0x0987, 0xC546, 0xC547, 0x3870, 0xC548, 0xC54A, 0x0989,
+ 0xC54B, 0xC54B, 0x3872, 0xC54C, 0xC54E, 0x098C, 0xC54F, 0xC552, 0x3873,
+ 0xC553, 0xC555, 0x098F, 0xC556, 0xC556, 0x3877, 0xC557, 0xC559, 0x0992,
+ 0xC55A, 0xC55C, 0x3878, 0xC55D, 0xC55E, 0x0995, 0xC55F, 0xC55F, 0x387B,
+ 0xC560, 0xC561, 0x0997, 0xC562, 0xC563, 0x387C, 0xC564, 0xC564, 0x0999,
+ 0xC565, 0xC567, 0x387E, 0xC568, 0xC568, 0x099A, 0xC569, 0xC56F, 0x3881,
+ 0xC570, 0xC571, 0x099B, 0xC572, 0xC572, 0x3888, 0xC573, 0xC575, 0x099D,
+ 0xC576, 0xC57B, 0x3889, 0xC57C, 0xC57D, 0x09A0, 0xC57E, 0xC57F, 0x388F,
+ 0xC580, 0xC580, 0x09A2, 0xC581, 0xC583, 0x3891, 0xC584, 0xC584, 0x09A3,
+ 0xC585, 0xC586, 0x3894, 0xC587, 0xC587, 0x09A4, 0xC588, 0xC58B, 0x3896,
+ 0xC58C, 0xC58D, 0x09A5, 0xC58E, 0xC58E, 0x389A, 0xC58F, 0xC58F, 0x09A7,
+ 0xC590, 0xC590, 0x389B, 0xC591, 0xC591, 0x09A8, 0xC592, 0xC594, 0x389C,
+ 0xC595, 0xC595, 0x09A9, 0xC596, 0xC596, 0x389F, 0xC597, 0xC598, 0x09AA,
+ 0xC599, 0xC59B, 0x38A0, 0xC59C, 0xC59C, 0x09AC, 0xC59D, 0xC59F, 0x38A3,
+ 0xC5A0, 0xC5A0, 0x09AD, 0xC5A1, 0xC5A8, 0x38A6, 0xC5A9, 0xC5A9, 0x09AE,
+ 0xC5AA, 0xC5B3, 0x38AE, 0xC5B4, 0xC5B5, 0x09AF, 0xC5B6, 0xC5B7, 0x38B8,
+ 0xC5B8, 0xC5B9, 0x09B1, 0xC5BA, 0xC5BA, 0x38BA, 0xC5BB, 0xC5BE, 0x09B3,
+ 0xC5BF, 0xC5C3, 0x38BB, 0xC5C4, 0xC5CA, 0x09B7, 0xC5CB, 0xC5CB, 0x38C0,
+ 0xC5CC, 0xC5CC, 0x09BE, 0xC5CD, 0xC5CD, 0x38C1, 0xC5CE, 0xC5CE, 0x09BF,
+ 0xC5CF, 0xC5CF, 0x38C2, 0xC5D0, 0xC5D1, 0x09C0, 0xC5D2, 0xC5D3, 0x38C3,
+ 0xC5D4, 0xC5D4, 0x09C2, 0xC5D5, 0xC5D7, 0x38C5, 0xC5D8, 0xC5D8, 0x09C3,
+ 0xC5D9, 0xC5DF, 0x38C8, 0xC5E0, 0xC5E1, 0x09C4, 0xC5E2, 0xC5E2, 0x38CF,
+ 0xC5E3, 0xC5E3, 0x09C6, 0xC5E4, 0xC5E4, 0x38D0, 0xC5E5, 0xC5E5, 0x09C7,
+ 0xC5E6, 0xC5EB, 0x38D1, 0xC5EC, 0xC5EE, 0x09C8, 0xC5EF, 0xC5EF, 0x38D7,
+ 0xC5F0, 0xC5F0, 0x09CB, 0xC5F1, 0xC5F3, 0x38D8, 0xC5F4, 0xC5F4, 0x09CC,
+ 0xC5F5, 0xC5F5, 0x38DB, 0xC5F6, 0xC5F7, 0x09CD, 0xC5F8, 0xC5FB, 0x38DC,
+ 0xC5FC, 0xC5FF, 0x09CF, 0xC600, 0xC601, 0x09D3, 0xC602, 0xC604, 0x38E0,
+ 0xC605, 0xC608, 0x09D5, 0xC609, 0xC60B, 0x38E3, 0xC60C, 0xC60C, 0x09D9,
+ 0xC60D, 0xC60F, 0x38E6, 0xC610, 0xC610, 0x09DA, 0xC611, 0xC617, 0x38E9,
+ 0xC618, 0xC619, 0x09DB, 0xC61A, 0xC61A, 0x38F0, 0xC61B, 0xC61C, 0x09DD,
+ 0xC61D, 0xC623, 0x38F1, 0xC624, 0xC625, 0x09DF, 0xC626, 0xC627, 0x38F8,
+ 0xC628, 0xC628, 0x09E1, 0xC629, 0xC62B, 0x38FA, 0xC62C, 0xC62E, 0x09E2,
+ 0xC62F, 0xC62F, 0x38FD, 0xC630, 0xC630, 0x09E5, 0xC631, 0xC632, 0x38FE,
+ 0xC633, 0xC635, 0x09E6, 0xC636, 0xC636, 0x3900, 0xC637, 0xC637, 0x09E9,
+ 0xC638, 0xC638, 0x3901, 0xC639, 0xC639, 0x09EA, 0xC63A, 0xC63A, 0x3902,
+ 0xC63B, 0xC63B, 0x09EB, 0xC63C, 0xC63F, 0x3903, 0xC640, 0xC641, 0x09EC,
+ 0xC642, 0xC643, 0x3907, 0xC644, 0xC644, 0x09EE, 0xC645, 0xC647, 0x3909,
+ 0xC648, 0xC648, 0x09EF, 0xC649, 0xC64F, 0x390C, 0xC650, 0xC651, 0x09F0,
+ 0xC652, 0xC652, 0x3913, 0xC653, 0xC655, 0x09F2, 0xC656, 0xC65B, 0x3914,
+ 0xC65C, 0xC65D, 0x09F5, 0xC65E, 0xC65F, 0x391A, 0xC660, 0xC660, 0x09F7,
+ 0xC661, 0xC66B, 0x391C, 0xC66C, 0xC66C, 0x09F8, 0xC66D, 0xC66E, 0x3927,
+ 0xC66F, 0xC66F, 0x09F9, 0xC670, 0xC670, 0x3929, 0xC671, 0xC671, 0x09FA,
+ 0xC672, 0xC677, 0x392A, 0xC678, 0xC679, 0x09FB, 0xC67A, 0xC67B, 0x3930,
+ 0xC67C, 0xC67C, 0x09FD, 0xC67D, 0xC67F, 0x3932, 0xC680, 0xC680, 0x09FE,
+ 0xC681, 0xC687, 0x3935, 0xC688, 0xC689, 0x09FF, 0xC68A, 0xC68A, 0x393C,
+ 0xC68B, 0xC68B, 0x0A01, 0xC68C, 0xC68C, 0x393D, 0xC68D, 0xC68D, 0x0A02,
+ 0xC68E, 0xC693, 0x393E, 0xC694, 0xC695, 0x0A03, 0xC696, 0xC697, 0x3944,
+ 0xC698, 0xC698, 0x0A05, 0xC699, 0xC69B, 0x3946, 0xC69C, 0xC69C, 0x0A06,
+ 0xC69D, 0xC6A3, 0x3949, 0xC6A4, 0xC6A5, 0x0A07, 0xC6A6, 0xC6A6, 0x3950,
+ 0xC6A7, 0xC6A7, 0x0A09, 0xC6A8, 0xC6A8, 0x3951, 0xC6A9, 0xC6A9, 0x0A0A,
+ 0xC6AA, 0xC6AF, 0x3952, 0xC6B0, 0xC6B1, 0x0A0B, 0xC6B2, 0xC6B3, 0x3958,
+ 0xC6B4, 0xC6B4, 0x0A0D, 0xC6B5, 0xC6B7, 0x395A, 0xC6B8, 0xC6BA, 0x0A0E,
+ 0xC6BB, 0xC6BF, 0x395D, 0xC6C0, 0xC6C1, 0x0A11, 0xC6C2, 0xC6C2, 0x3962,
+ 0xC6C3, 0xC6C3, 0x0A13, 0xC6C4, 0xC6C4, 0x3963, 0xC6C5, 0xC6C5, 0x0A14,
+ 0xC6C6, 0xC6CB, 0x3964, 0xC6CC, 0xC6CD, 0x0A15, 0xC6CE, 0xC6CF, 0x396A,
+ 0xC6D0, 0xC6D0, 0x0A17, 0xC6D1, 0xC6D3, 0x396C, 0xC6D4, 0xC6D4, 0x0A18,
+ 0xC6D5, 0xC6DB, 0x396F, 0xC6DC, 0xC6DD, 0x0A19, 0xC6DE, 0xC6DF, 0x3976,
+ 0xC6E0, 0xC6E1, 0x0A1B, 0xC6E2, 0xC6E7, 0x3978, 0xC6E8, 0xC6E9, 0x0A1D,
+ 0xC6EA, 0xC6EB, 0x397E, 0xC6EC, 0xC6EC, 0x0A1F, 0xC6ED, 0xC6EF, 0x3980,
+ 0xC6F0, 0xC6F0, 0x0A20, 0xC6F1, 0xC6F7, 0x3983, 0xC6F8, 0xC6F9, 0x0A21,
+ 0xC6FA, 0xC6FC, 0x398A, 0xC6FD, 0xC6FD, 0x0A23, 0xC6FE, 0xC6FF, 0x398D,
+ 0xC700, 0xC703, 0x398F, 0xC704, 0xC705, 0x0A24, 0xC706, 0xC707, 0x3993,
+ 0xC708, 0xC708, 0x0A26, 0xC709, 0xC70B, 0x3995, 0xC70C, 0xC70C, 0x0A27,
+ 0xC70D, 0xC713, 0x3998, 0xC714, 0xC715, 0x0A28, 0xC716, 0xC716, 0x399F,
+ 0xC717, 0xC717, 0x0A2A, 0xC718, 0xC718, 0x39A0, 0xC719, 0xC719, 0x0A2B,
+ 0xC71A, 0xC71F, 0x39A1, 0xC720, 0xC721, 0x0A2C, 0xC722, 0xC723, 0x39A7,
+ 0xC724, 0xC724, 0x0A2E, 0xC725, 0xC727, 0x39A9, 0xC728, 0xC728, 0x0A2F,
+ 0xC729, 0xC72F, 0x39AC, 0xC730, 0xC731, 0x0A30, 0xC732, 0xC732, 0x39B3,
+ 0xC733, 0xC733, 0x0A32, 0xC734, 0xC734, 0x39B4, 0xC735, 0xC735, 0x0A33,
+ 0xC736, 0xC736, 0x39B5, 0xC737, 0xC737, 0x0A34, 0xC738, 0xC73B, 0x39B6,
+ 0xC73C, 0xC73D, 0x0A35, 0xC73E, 0xC73F, 0x39BA, 0xC740, 0xC740, 0x0A37,
+ 0xC741, 0xC743, 0x39BC, 0xC744, 0xC744, 0x0A38, 0xC745, 0xC749, 0x39BF,
+ 0xC74A, 0xC74A, 0x0A39, 0xC74B, 0xC74B, 0x39C4, 0xC74C, 0xC74D, 0x0A3A,
+ 0xC74E, 0xC74E, 0x39C5, 0xC74F, 0xC74F, 0x0A3C, 0xC750, 0xC750, 0x39C6,
+ 0xC751, 0xC758, 0x0A3D, 0xC759, 0xC75B, 0x39C7, 0xC75C, 0xC75C, 0x0A45,
+ 0xC75D, 0xC75F, 0x39CA, 0xC760, 0xC760, 0x0A46, 0xC761, 0xC767, 0x39CD,
+ 0xC768, 0xC768, 0x0A47, 0xC769, 0xC76A, 0x39D4, 0xC76B, 0xC76B, 0x0A48,
+ 0xC76C, 0xC773, 0x39D6, 0xC774, 0xC775, 0x0A49, 0xC776, 0xC777, 0x39DE,
+ 0xC778, 0xC778, 0x0A4B, 0xC779, 0xC77B, 0x39E0, 0xC77C, 0xC77E, 0x0A4C,
+ 0xC77F, 0xC782, 0x39E3, 0xC783, 0xC785, 0x0A4F, 0xC786, 0xC786, 0x39E7,
+ 0xC787, 0xC78A, 0x0A52, 0xC78B, 0xC78D, 0x39E8, 0xC78E, 0xC78E, 0x0A56,
+ 0xC78F, 0xC78F, 0x39EB, 0xC790, 0xC791, 0x0A57, 0xC792, 0xC793, 0x39EC,
+ 0xC794, 0xC794, 0x0A59, 0xC795, 0xC795, 0x39EE, 0xC796, 0xC798, 0x0A5A,
+ 0xC799, 0xC799, 0x39EF, 0xC79A, 0xC79A, 0x0A5D, 0xC79B, 0xC79F, 0x39F0,
+ 0xC7A0, 0xC7A1, 0x0A5E, 0xC7A2, 0xC7A2, 0x39F5, 0xC7A3, 0xC7A6, 0x0A60,
+ 0xC7A7, 0xC7AB, 0x39F6, 0xC7AC, 0xC7AD, 0x0A64, 0xC7AE, 0xC7AF, 0x39FB,
+ 0xC7B0, 0xC7B0, 0x0A66, 0xC7B1, 0xC7B3, 0x39FD, 0xC7B4, 0xC7B4, 0x0A67,
+ 0xC7B5, 0xC7BB, 0x3A00, 0xC7BC, 0xC7BD, 0x0A68, 0xC7BE, 0xC7BE, 0x3A07,
+ 0xC7BF, 0xC7C1, 0x0A6A, 0xC7C2, 0xC7C7, 0x3A08, 0xC7C8, 0xC7C9, 0x0A6D,
+ 0xC7CA, 0xC7CB, 0x3A0E, 0xC7CC, 0xC7CC, 0x0A6F, 0xC7CD, 0xC7CD, 0x3A10,
+ 0xC7CE, 0xC7CE, 0x0A70, 0xC7CF, 0xC7CF, 0x3A11, 0xC7D0, 0xC7D0, 0x0A71,
+ 0xC7D1, 0xC7D7, 0x3A12, 0xC7D8, 0xC7D8, 0x0A72, 0xC7D9, 0xC7DC, 0x3A19,
+ 0xC7DD, 0xC7DD, 0x0A73, 0xC7DE, 0xC7E3, 0x3A1D, 0xC7E4, 0xC7E4, 0x0A74,
+ 0xC7E5, 0xC7E7, 0x3A23, 0xC7E8, 0xC7E8, 0x0A75, 0xC7E9, 0xC7EB, 0x3A26,
+ 0xC7EC, 0xC7EC, 0x0A76, 0xC7ED, 0xC7FF, 0x3A29, 0xC800, 0xC801, 0x0A77,
+ 0xC802, 0xC803, 0x3A3C, 0xC804, 0xC804, 0x0A79, 0xC805, 0xC807, 0x3A3E,
+ 0xC808, 0xC808, 0x0A7A, 0xC809, 0xC809, 0x3A41, 0xC80A, 0xC80A, 0x0A7B,
+ 0xC80B, 0xC80F, 0x3A42, 0xC810, 0xC811, 0x0A7C, 0xC812, 0xC812, 0x3A47,
+ 0xC813, 0xC813, 0x0A7E, 0xC814, 0xC814, 0x3A48, 0xC815, 0xC816, 0x0A7F,
+ 0xC817, 0xC81B, 0x3A49, 0xC81C, 0xC81D, 0x0A81, 0xC81E, 0xC81F, 0x3A4E,
+ 0xC820, 0xC820, 0x0A83, 0xC821, 0xC823, 0x3A50, 0xC824, 0xC824, 0x0A84,
+ 0xC825, 0xC82B, 0x3A53, 0xC82C, 0xC82D, 0x0A85, 0xC82E, 0xC82E, 0x3A5A,
+ 0xC82F, 0xC82F, 0x0A87, 0xC830, 0xC830, 0x3A5B, 0xC831, 0xC831, 0x0A88,
+ 0xC832, 0xC837, 0x3A5C, 0xC838, 0xC838, 0x0A89, 0xC839, 0xC83B, 0x3A62,
+ 0xC83C, 0xC83C, 0x0A8A, 0xC83D, 0xC83F, 0x3A65, 0xC840, 0xC840, 0x0A8B,
+ 0xC841, 0xC847, 0x3A68, 0xC848, 0xC849, 0x0A8C, 0xC84A, 0xC84B, 0x3A6F,
+ 0xC84C, 0xC84D, 0x0A8E, 0xC84E, 0xC853, 0x3A71, 0xC854, 0xC854, 0x0A90,
+ 0xC855, 0xC86F, 0x3A77, 0xC870, 0xC871, 0x0A91, 0xC872, 0xC873, 0x3A92,
+ 0xC874, 0xC874, 0x0A93, 0xC875, 0xC877, 0x3A94, 0xC878, 0xC878, 0x0A94,
+ 0xC879, 0xC879, 0x3A97, 0xC87A, 0xC87A, 0x0A95, 0xC87B, 0xC87F, 0x3A98,
+ 0xC880, 0xC881, 0x0A96, 0xC882, 0xC882, 0x3A9D, 0xC883, 0xC883, 0x0A98,
+ 0xC884, 0xC884, 0x3A9E, 0xC885, 0xC887, 0x0A99, 0xC888, 0xC88A, 0x3A9F,
+ 0xC88B, 0xC88D, 0x0A9C, 0xC88E, 0xC893, 0x3AA2, 0xC894, 0xC894, 0x0A9F,
+ 0xC895, 0xC89C, 0x3AA8, 0xC89D, 0xC89D, 0x0AA0, 0xC89E, 0xC89E, 0x3AB0,
+ 0xC89F, 0xC89F, 0x0AA1, 0xC8A0, 0xC8A0, 0x3AB1, 0xC8A1, 0xC8A1, 0x0AA2,
+ 0xC8A2, 0xC8A7, 0x3AB2, 0xC8A8, 0xC8A8, 0x0AA3, 0xC8A9, 0xC8BB, 0x3AB8,
+ 0xC8BC, 0xC8BD, 0x0AA4, 0xC8BE, 0xC8C3, 0x3ACB, 0xC8C4, 0xC8C4, 0x0AA6,
+ 0xC8C5, 0xC8C7, 0x3AD1, 0xC8C8, 0xC8C8, 0x0AA7, 0xC8C9, 0xC8CB, 0x3AD4,
+ 0xC8CC, 0xC8CC, 0x0AA8, 0xC8CD, 0xC8D3, 0x3AD7, 0xC8D4, 0xC8D5, 0x0AA9,
+ 0xC8D6, 0xC8D6, 0x3ADE, 0xC8D7, 0xC8D7, 0x0AAB, 0xC8D8, 0xC8D8, 0x3ADF,
+ 0xC8D9, 0xC8D9, 0x0AAC, 0xC8DA, 0xC8DF, 0x3AE0, 0xC8E0, 0xC8E1, 0x0AAD,
+ 0xC8E2, 0xC8E3, 0x3AE6, 0xC8E4, 0xC8E4, 0x0AAF, 0xC8E5, 0xC8F4, 0x3AE8,
+ 0xC8F5, 0xC8F5, 0x0AB0, 0xC8F6, 0xC8FB, 0x3AF8, 0xC8FC, 0xC8FD, 0x0AB1,
+ 0xC8FE, 0xC8FF, 0x3AFE, 0xC900, 0xC900, 0x0AB3, 0xC901, 0xC903, 0x3B00,
+ 0xC904, 0xC906, 0x0AB4, 0xC907, 0xC90B, 0x3B03, 0xC90C, 0xC90D, 0x0AB7,
+ 0xC90E, 0xC90E, 0x3B08, 0xC90F, 0xC90F, 0x0AB9, 0xC910, 0xC910, 0x3B09,
+ 0xC911, 0xC911, 0x0ABA, 0xC912, 0xC917, 0x3B0A, 0xC918, 0xC918, 0x0ABB,
+ 0xC919, 0xC92B, 0x3B10, 0xC92C, 0xC92C, 0x0ABC, 0xC92D, 0xC933, 0x3B23,
+ 0xC934, 0xC934, 0x0ABD, 0xC935, 0xC94F, 0x3B2A, 0xC950, 0xC951, 0x0ABE,
+ 0xC952, 0xC953, 0x3B45, 0xC954, 0xC954, 0x0AC0, 0xC955, 0xC957, 0x3B47,
+ 0xC958, 0xC958, 0x0AC1, 0xC959, 0xC95F, 0x3B4A, 0xC960, 0xC961, 0x0AC2,
+ 0xC962, 0xC962, 0x3B51, 0xC963, 0xC963, 0x0AC4, 0xC964, 0xC96B, 0x3B52,
+ 0xC96C, 0xC96C, 0x0AC5, 0xC96D, 0xC96F, 0x3B5A, 0xC970, 0xC970, 0x0AC6,
+ 0xC971, 0xC973, 0x3B5D, 0xC974, 0xC974, 0x0AC7, 0xC975, 0xC97B, 0x3B60,
+ 0xC97C, 0xC97C, 0x0AC8, 0xC97D, 0xC987, 0x3B67, 0xC988, 0xC989, 0x0AC9,
+ 0xC98A, 0xC98B, 0x3B72, 0xC98C, 0xC98C, 0x0ACB, 0xC98D, 0xC98F, 0x3B74,
+ 0xC990, 0xC990, 0x0ACC, 0xC991, 0xC997, 0x3B77, 0xC998, 0xC999, 0x0ACD,
+ 0xC99A, 0xC99A, 0x3B7E, 0xC99B, 0xC99B, 0x0ACF, 0xC99C, 0xC99C, 0x3B7F,
+ 0xC99D, 0xC99D, 0x0AD0, 0xC99E, 0xC9BF, 0x3B80, 0xC9C0, 0xC9C1, 0x0AD1,
+ 0xC9C2, 0xC9C3, 0x3BA2, 0xC9C4, 0xC9C4, 0x0AD3, 0xC9C5, 0xC9C6, 0x3BA4,
+ 0xC9C7, 0xC9C8, 0x0AD4, 0xC9C9, 0xC9C9, 0x3BA6, 0xC9CA, 0xC9CA, 0x0AD6,
+ 0xC9CB, 0xC9CF, 0x3BA7, 0xC9D0, 0xC9D1, 0x0AD7, 0xC9D2, 0xC9D2, 0x3BAC,
+ 0xC9D3, 0xC9D3, 0x0AD9, 0xC9D4, 0xC9D4, 0x3BAD, 0xC9D5, 0xC9D6, 0x0ADA,
+ 0xC9D7, 0xC9D8, 0x3BAE, 0xC9D9, 0xC9DA, 0x0ADC, 0xC9DB, 0xC9DB, 0x3BB0,
+ 0xC9DC, 0xC9DD, 0x0ADE, 0xC9DE, 0xC9DF, 0x3BB1, 0xC9E0, 0xC9E0, 0x0AE0,
+ 0xC9E1, 0xC9E1, 0x3BB3, 0xC9E2, 0xC9E2, 0x0AE1, 0xC9E3, 0xC9E3, 0x3BB4,
+ 0xC9E4, 0xC9E4, 0x0AE2, 0xC9E5, 0xC9E6, 0x3BB5, 0xC9E7, 0xC9E7, 0x0AE3,
+ 0xC9E8, 0xC9EB, 0x3BB7, 0xC9EC, 0xC9ED, 0x0AE4, 0xC9EE, 0xC9EE, 0x3BBB,
+ 0xC9EF, 0xC9F1, 0x0AE6, 0xC9F2, 0xC9F7, 0x3BBC, 0xC9F8, 0xC9F9, 0x0AE9,
+ 0xC9FA, 0xC9FB, 0x3BC2, 0xC9FC, 0xC9FC, 0x0AEB, 0xC9FD, 0xC9FF, 0x3BC4,
+ 0xCA00, 0xCA00, 0x0AEC, 0xCA01, 0xCA07, 0x3BC7, 0xCA08, 0xCA09, 0x0AED,
+ 0xCA0A, 0xCA0A, 0x3BCE, 0xCA0B, 0xCA0D, 0x0AEF, 0xCA0E, 0xCA13, 0x3BCF,
+ 0xCA14, 0xCA14, 0x0AF2, 0xCA15, 0xCA17, 0x3BD5, 0xCA18, 0xCA18, 0x0AF3,
+ 0xCA19, 0xCA28, 0x3BD8, 0xCA29, 0xCA29, 0x0AF4, 0xCA2A, 0xCA4B, 0x3BE8,
+ 0xCA4C, 0xCA4D, 0x0AF5, 0xCA4E, 0xCA4F, 0x3C0A, 0xCA50, 0xCA50, 0x0AF7,
+ 0xCA51, 0xCA53, 0x3C0C, 0xCA54, 0xCA54, 0x0AF8, 0xCA55, 0xCA5B, 0x3C0F,
+ 0xCA5C, 0xCA5D, 0x0AF9, 0xCA5E, 0xCA5E, 0x3C16, 0xCA5F, 0xCA61, 0x0AFB,
+ 0xCA62, 0xCA67, 0x3C17, 0xCA68, 0xCA68, 0x0AFE, 0xCA69, 0xCA7C, 0x3C1D,
+ 0xCA7D, 0xCA7D, 0x0AFF, 0xCA7E, 0xCA83, 0x3C31, 0xCA84, 0xCA84, 0x0B00,
+ 0xCA85, 0xCA97, 0x3C37, 0xCA98, 0xCA98, 0x0B01, 0xCA99, 0xCABB, 0x3C4A,
+ 0xCABC, 0xCABD, 0x0B02, 0xCABE, 0xCABF, 0x3C6D, 0xCAC0, 0xCAC0, 0x0B04,
+ 0xCAC1, 0xCAC3, 0x3C6F, 0xCAC4, 0xCAC4, 0x0B05, 0xCAC5, 0xCACB, 0x3C72,
+ 0xCACC, 0xCACD, 0x0B06, 0xCACE, 0xCACE, 0x3C79, 0xCACF, 0xCACF, 0x0B08,
+ 0xCAD0, 0xCAD0, 0x3C7A, 0xCAD1, 0xCAD1, 0x0B09, 0xCAD2, 0xCAD2, 0x3C7B,
+ 0xCAD3, 0xCAD3, 0x0B0A, 0xCAD4, 0xCAD7, 0x3C7C, 0xCAD8, 0xCAD9, 0x0B0B,
+ 0xCADA, 0xCADF, 0x3C80, 0xCAE0, 0xCAE0, 0x0B0D, 0xCAE1, 0xCAEB, 0x3C86,
+ 0xCAEC, 0xCAEC, 0x0B0E, 0xCAED, 0xCAF3, 0x3C91, 0xCAF4, 0xCAF4, 0x0B0F,
+ 0xCAF5, 0xCAFF, 0x3C98, 0xCB00, 0xCB07, 0x3CA3, 0xCB08, 0xCB08, 0x0B10,
+ 0xCB09, 0xCB0F, 0x3CAB, 0xCB10, 0xCB10, 0x0B11, 0xCB11, 0xCB13, 0x3CB2,
+ 0xCB14, 0xCB14, 0x0B12, 0xCB15, 0xCB17, 0x3CB5, 0xCB18, 0xCB18, 0x0B13,
+ 0xCB19, 0xCB1F, 0x3CB8, 0xCB20, 0xCB21, 0x0B14, 0xCB22, 0xCB40, 0x3CBF,
+ 0xCB41, 0xCB41, 0x0B16, 0xCB42, 0xCB47, 0x3CDE, 0xCB48, 0xCB49, 0x0B17,
+ 0xCB4A, 0xCB4B, 0x3CE4, 0xCB4C, 0xCB4C, 0x0B19, 0xCB4D, 0xCB4F, 0x3CE6,
+ 0xCB50, 0xCB50, 0x0B1A, 0xCB51, 0xCB57, 0x3CE9, 0xCB58, 0xCB59, 0x0B1B,
+ 0xCB5A, 0xCB5C, 0x3CF0, 0xCB5D, 0xCB5D, 0x0B1D, 0xCB5E, 0xCB63, 0x3CF3,
+ 0xCB64, 0xCB64, 0x0B1E, 0xCB65, 0xCB77, 0x3CF9, 0xCB78, 0xCB79, 0x0B1F,
+ 0xCB7A, 0xCB9B, 0x3D0C, 0xCB9C, 0xCB9C, 0x0B21, 0xCB9D, 0xCBB7, 0x3D2E,
+ 0xCBB8, 0xCBB8, 0x0B22, 0xCBB9, 0xCBD3, 0x3D49, 0xCBD4, 0xCBD4, 0x0B23,
+ 0xCBD5, 0xCBE3, 0x3D64, 0xCBE4, 0xCBE4, 0x0B24, 0xCBE5, 0xCBE6, 0x3D73,
+ 0xCBE7, 0xCBE7, 0x0B25, 0xCBE8, 0xCBE8, 0x3D75, 0xCBE9, 0xCBE9, 0x0B26,
+ 0xCBEA, 0xCBFF, 0x3D76, 0xCC00, 0xCC0B, 0x3D8C, 0xCC0C, 0xCC0D, 0x0B27,
+ 0xCC0E, 0xCC0F, 0x3D98, 0xCC10, 0xCC10, 0x0B29, 0xCC11, 0xCC13, 0x3D9A,
+ 0xCC14, 0xCC14, 0x0B2A, 0xCC15, 0xCC1B, 0x3D9D, 0xCC1C, 0xCC1D, 0x0B2B,
+ 0xCC1E, 0xCC20, 0x3DA4, 0xCC21, 0xCC22, 0x0B2D, 0xCC23, 0xCC26, 0x3DA7,
+ 0xCC27, 0xCC29, 0x0B2F, 0xCC2A, 0xCC2B, 0x3DAB, 0xCC2C, 0xCC2C, 0x0B32,
+ 0xCC2D, 0xCC2D, 0x3DAD, 0xCC2E, 0xCC2E, 0x0B33, 0xCC2F, 0xCC2F, 0x3DAE,
+ 0xCC30, 0xCC30, 0x0B34, 0xCC31, 0xCC37, 0x3DAF, 0xCC38, 0xCC39, 0x0B35,
+ 0xCC3A, 0xCC3A, 0x3DB6, 0xCC3B, 0xCC3E, 0x0B37, 0xCC3F, 0xCC43, 0x3DB7,
+ 0xCC44, 0xCC45, 0x0B3B, 0xCC46, 0xCC47, 0x3DBC, 0xCC48, 0xCC48, 0x0B3D,
+ 0xCC49, 0xCC4B, 0x3DBE, 0xCC4C, 0xCC4C, 0x0B3E, 0xCC4D, 0xCC53, 0x3DC1,
+ 0xCC54, 0xCC55, 0x0B3F, 0xCC56, 0xCC56, 0x3DC8, 0xCC57, 0xCC59, 0x0B41,
+ 0xCC5A, 0xCC5F, 0x3DC9, 0xCC60, 0xCC60, 0x0B44, 0xCC61, 0xCC63, 0x3DCF,
+ 0xCC64, 0xCC64, 0x0B45, 0xCC65, 0xCC65, 0x3DD2, 0xCC66, 0xCC66, 0x0B46,
+ 0xCC67, 0xCC67, 0x3DD3, 0xCC68, 0xCC68, 0x0B47, 0xCC69, 0xCC6F, 0x3DD4,
+ 0xCC70, 0xCC70, 0x0B48, 0xCC71, 0xCC74, 0x3DDB, 0xCC75, 0xCC75, 0x0B49,
+ 0xCC76, 0xCC97, 0x3DDF, 0xCC98, 0xCC99, 0x0B4A, 0xCC9A, 0xCC9B, 0x3E01,
+ 0xCC9C, 0xCC9C, 0x0B4C, 0xCC9D, 0xCC9F, 0x3E03, 0xCCA0, 0xCCA0, 0x0B4D,
+ 0xCCA1, 0xCCA7, 0x3E06, 0xCCA8, 0xCCA9, 0x0B4E, 0xCCAA, 0xCCAA, 0x3E0D,
+ 0xCCAB, 0xCCAD, 0x0B50, 0xCCAE, 0xCCB3, 0x3E0E, 0xCCB4, 0xCCB5, 0x0B53,
+ 0xCCB6, 0xCCB7, 0x3E14, 0xCCB8, 0xCCB8, 0x0B55, 0xCCB9, 0xCCBB, 0x3E16,
+ 0xCCBC, 0xCCBC, 0x0B56, 0xCCBD, 0xCCC3, 0x3E19, 0xCCC4, 0xCCC5, 0x0B57,
+ 0xCCC6, 0xCCC6, 0x3E20, 0xCCC7, 0xCCC7, 0x0B59, 0xCCC8, 0xCCC8, 0x3E21,
+ 0xCCC9, 0xCCC9, 0x0B5A, 0xCCCA, 0xCCCF, 0x3E22, 0xCCD0, 0xCCD0, 0x0B5B,
+ 0xCCD1, 0xCCD3, 0x3E28, 0xCCD4, 0xCCD4, 0x0B5C, 0xCCD5, 0xCCE3, 0x3E2B,
+ 0xCCE4, 0xCCE4, 0x0B5D, 0xCCE5, 0xCCEB, 0x3E3A, 0xCCEC, 0xCCEC, 0x0B5E,
+ 0xCCED, 0xCCEF, 0x3E41, 0xCCF0, 0xCCF0, 0x0B5F, 0xCCF1, 0xCCFF, 0x3E44,
+ 0xCD00, 0xCD00, 0x3E53, 0xCD01, 0xCD01, 0x0B60, 0xCD02, 0xCD07, 0x3E54,
+ 0xCD08, 0xCD09, 0x0B61, 0xCD0A, 0xCD0B, 0x3E5A, 0xCD0C, 0xCD0C, 0x0B63,
+ 0xCD0D, 0xCD0F, 0x3E5C, 0xCD10, 0xCD10, 0x0B64, 0xCD11, 0xCD17, 0x3E5F,
+ 0xCD18, 0xCD19, 0x0B65, 0xCD1A, 0xCD1A, 0x3E66, 0xCD1B, 0xCD1B, 0x0B67,
+ 0xCD1C, 0xCD1C, 0x3E67, 0xCD1D, 0xCD1D, 0x0B68, 0xCD1E, 0xCD23, 0x3E68,
+ 0xCD24, 0xCD24, 0x0B69, 0xCD25, 0xCD27, 0x3E6E, 0xCD28, 0xCD28, 0x0B6A,
+ 0xCD29, 0xCD2B, 0x3E71, 0xCD2C, 0xCD2C, 0x0B6B, 0xCD2D, 0xCD38, 0x3E74,
+ 0xCD39, 0xCD39, 0x0B6C, 0xCD3A, 0xCD5B, 0x3E80, 0xCD5C, 0xCD5C, 0x0B6D,
+ 0xCD5D, 0xCD5F, 0x3EA2, 0xCD60, 0xCD60, 0x0B6E, 0xCD61, 0xCD63, 0x3EA5,
+ 0xCD64, 0xCD64, 0x0B6F, 0xCD65, 0xCD6B, 0x3EA8, 0xCD6C, 0xCD6D, 0x0B70,
+ 0xCD6E, 0xCD6E, 0x3EAF, 0xCD6F, 0xCD6F, 0x0B72, 0xCD70, 0xCD70, 0x3EB0,
+ 0xCD71, 0xCD71, 0x0B73, 0xCD72, 0xCD77, 0x3EB1, 0xCD78, 0xCD78, 0x0B74,
+ 0xCD79, 0xCD87, 0x3EB7, 0xCD88, 0xCD88, 0x0B75, 0xCD89, 0xCD93, 0x3EC6,
+ 0xCD94, 0xCD95, 0x0B76, 0xCD96, 0xCD97, 0x3ED1, 0xCD98, 0xCD98, 0x0B78,
+ 0xCD99, 0xCD9B, 0x3ED3, 0xCD9C, 0xCD9C, 0x0B79, 0xCD9D, 0xCDA3, 0x3ED6,
+ 0xCDA4, 0xCDA5, 0x0B7A, 0xCDA6, 0xCDA6, 0x3EDD, 0xCDA7, 0xCDA7, 0x0B7C,
+ 0xCDA8, 0xCDA8, 0x3EDE, 0xCDA9, 0xCDA9, 0x0B7D, 0xCDAA, 0xCDAF, 0x3EDF,
+ 0xCDB0, 0xCDB0, 0x0B7E, 0xCDB1, 0xCDC3, 0x3EE5, 0xCDC4, 0xCDC4, 0x0B7F,
+ 0xCDC5, 0xCDCB, 0x3EF8, 0xCDCC, 0xCDCC, 0x0B80, 0xCDCD, 0xCDCF, 0x3EFF,
+ 0xCDD0, 0xCDD0, 0x0B81, 0xCDD1, 0xCDE7, 0x3F02, 0xCDE8, 0xCDE8, 0x0B82,
+ 0xCDE9, 0xCDEB, 0x3F19, 0xCDEC, 0xCDEC, 0x0B83, 0xCDED, 0xCDEF, 0x3F1C,
+ 0xCDF0, 0xCDF0, 0x0B84, 0xCDF1, 0xCDF7, 0x3F1F, 0xCDF8, 0xCDF9, 0x0B85,
+ 0xCDFA, 0xCDFA, 0x3F26, 0xCDFB, 0xCDFB, 0x0B87, 0xCDFC, 0xCDFC, 0x3F27,
+ 0xCDFD, 0xCDFD, 0x0B88, 0xCDFE, 0xCDFF, 0x3F28, 0xCE00, 0xCE03, 0x3F2A,
+ 0xCE04, 0xCE04, 0x0B89, 0xCE05, 0xCE07, 0x3F2E, 0xCE08, 0xCE08, 0x0B8A,
+ 0xCE09, 0xCE0B, 0x3F31, 0xCE0C, 0xCE0C, 0x0B8B, 0xCE0D, 0xCE13, 0x3F34,
+ 0xCE14, 0xCE14, 0x0B8C, 0xCE15, 0xCE18, 0x3F3B, 0xCE19, 0xCE19, 0x0B8D,
+ 0xCE1A, 0xCE1F, 0x3F3F, 0xCE20, 0xCE21, 0x0B8E, 0xCE22, 0xCE23, 0x3F45,
+ 0xCE24, 0xCE24, 0x0B90, 0xCE25, 0xCE27, 0x3F47, 0xCE28, 0xCE28, 0x0B91,
+ 0xCE29, 0xCE2F, 0x3F4A, 0xCE30, 0xCE31, 0x0B92, 0xCE32, 0xCE32, 0x3F51,
+ 0xCE33, 0xCE33, 0x0B94, 0xCE34, 0xCE34, 0x3F52, 0xCE35, 0xCE35, 0x0B95,
+ 0xCE36, 0xCE57, 0x3F53, 0xCE58, 0xCE59, 0x0B96, 0xCE5A, 0xCE5B, 0x3F75,
+ 0xCE5C, 0xCE5C, 0x0B98, 0xCE5D, 0xCE5E, 0x3F77, 0xCE5F, 0xCE61, 0x0B99,
+ 0xCE62, 0xCE67, 0x3F79, 0xCE68, 0xCE69, 0x0B9C, 0xCE6A, 0xCE6A, 0x3F7F,
+ 0xCE6B, 0xCE6B, 0x0B9E, 0xCE6C, 0xCE6C, 0x3F80, 0xCE6D, 0xCE6D, 0x0B9F,
+ 0xCE6E, 0xCE73, 0x3F81, 0xCE74, 0xCE75, 0x0BA0, 0xCE76, 0xCE77, 0x3F87,
+ 0xCE78, 0xCE78, 0x0BA2, 0xCE79, 0xCE7B, 0x3F89, 0xCE7C, 0xCE7C, 0x0BA3,
+ 0xCE7D, 0xCE83, 0x3F8C, 0xCE84, 0xCE85, 0x0BA4, 0xCE86, 0xCE86, 0x3F93,
+ 0xCE87, 0xCE87, 0x0BA6, 0xCE88, 0xCE88, 0x3F94, 0xCE89, 0xCE89, 0x0BA7,
+ 0xCE8A, 0xCE8F, 0x3F95, 0xCE90, 0xCE91, 0x0BA8, 0xCE92, 0xCE93, 0x3F9B,
+ 0xCE94, 0xCE94, 0x0BAA, 0xCE95, 0xCE97, 0x3F9D, 0xCE98, 0xCE98, 0x0BAB,
+ 0xCE99, 0xCE9F, 0x3FA0, 0xCEA0, 0xCEA1, 0x0BAC, 0xCEA2, 0xCEA2, 0x3FA7,
+ 0xCEA3, 0xCEA5, 0x0BAE, 0xCEA6, 0xCEAB, 0x3FA8, 0xCEAC, 0xCEAD, 0x0BB1,
+ 0xCEAE, 0xCEC0, 0x3FAE, 0xCEC1, 0xCEC1, 0x0BB3, 0xCEC2, 0xCEE3, 0x3FC1,
+ 0xCEE4, 0xCEE5, 0x0BB4, 0xCEE6, 0xCEE7, 0x3FE3, 0xCEE8, 0xCEE8, 0x0BB6,
+ 0xCEE9, 0xCEEA, 0x3FE5, 0xCEEB, 0xCEEC, 0x0BB7, 0xCEED, 0xCEF3, 0x3FE7,
+ 0xCEF4, 0xCEF5, 0x0BB9, 0xCEF6, 0xCEF6, 0x3FEE, 0xCEF7, 0xCEF9, 0x0BBB,
+ 0xCEFA, 0xCEFF, 0x3FEF, 0xCF00, 0xCF01, 0x0BBE, 0xCF02, 0xCF03, 0x3FF5,
+ 0xCF04, 0xCF04, 0x0BC0, 0xCF05, 0xCF07, 0x3FF7, 0xCF08, 0xCF08, 0x0BC1,
+ 0xCF09, 0xCF0F, 0x3FFA, 0xCF10, 0xCF11, 0x0BC2, 0xCF12, 0xCF12, 0x4001,
+ 0xCF13, 0xCF13, 0x0BC4, 0xCF14, 0xCF14, 0x4002, 0xCF15, 0xCF15, 0x0BC5,
+ 0xCF16, 0xCF1B, 0x4003, 0xCF1C, 0xCF1C, 0x0BC6, 0xCF1D, 0xCF1F, 0x4009,
+ 0xCF20, 0xCF20, 0x0BC7, 0xCF21, 0xCF23, 0x400C, 0xCF24, 0xCF24, 0x0BC8,
+ 0xCF25, 0xCF2B, 0x400F, 0xCF2C, 0xCF2D, 0x0BC9, 0xCF2E, 0xCF2E, 0x4016,
+ 0xCF2F, 0xCF31, 0x0BCB, 0xCF32, 0xCF37, 0x4017, 0xCF38, 0xCF38, 0x0BCE,
+ 0xCF39, 0xCF53, 0x401D, 0xCF54, 0xCF55, 0x0BCF, 0xCF56, 0xCF57, 0x4038,
+ 0xCF58, 0xCF58, 0x0BD1, 0xCF59, 0xCF5B, 0x403A, 0xCF5C, 0xCF5C, 0x0BD2,
+ 0xCF5D, 0xCF63, 0x403D, 0xCF64, 0xCF65, 0x0BD3, 0xCF66, 0xCF66, 0x4044,
+ 0xCF67, 0xCF67, 0x0BD5, 0xCF68, 0xCF68, 0x4045, 0xCF69, 0xCF69, 0x0BD6,
+ 0xCF6A, 0xCF6F, 0x4046, 0xCF70, 0xCF71, 0x0BD7, 0xCF72, 0xCF73, 0x404C,
+ 0xCF74, 0xCF74, 0x0BD9, 0xCF75, 0xCF77, 0x404E, 0xCF78, 0xCF78, 0x0BDA,
+ 0xCF79, 0xCF7F, 0x4051, 0xCF80, 0xCF80, 0x0BDB, 0xCF81, 0xCF84, 0x4058,
+ 0xCF85, 0xCF85, 0x0BDC, 0xCF86, 0xCF8B, 0x405C, 0xCF8C, 0xCF8C, 0x0BDD,
+ 0xCF8D, 0xCFA0, 0x4062, 0xCFA1, 0xCFA1, 0x0BDE, 0xCFA2, 0xCFA7, 0x4076,
+ 0xCFA8, 0xCFA8, 0x0BDF, 0xCFA9, 0xCFAF, 0x407C, 0xCFB0, 0xCFB0, 0x0BE0,
+ 0xCFB1, 0xCFC3, 0x4083, 0xCFC4, 0xCFC4, 0x0BE1, 0xCFC5, 0xCFDF, 0x4096,
+ 0xCFE0, 0xCFE1, 0x0BE2, 0xCFE2, 0xCFE3, 0x40B1, 0xCFE4, 0xCFE4, 0x0BE4,
+ 0xCFE5, 0xCFE7, 0x40B3, 0xCFE8, 0xCFE8, 0x0BE5, 0xCFE9, 0xCFEF, 0x40B6,
+ 0xCFF0, 0xCFF1, 0x0BE6, 0xCFF2, 0xCFF2, 0x40BD, 0xCFF3, 0xCFF3, 0x0BE8,
+ 0xCFF4, 0xCFF4, 0x40BE, 0xCFF5, 0xCFF5, 0x0BE9, 0xCFF6, 0xCFFB, 0x40BF,
+ 0xCFFC, 0xCFFC, 0x0BEA, 0xCFFD, 0xCFFF, 0x40C5, 0xD000, 0xD000, 0x0BEB,
+ 0xD001, 0xD003, 0x40C8, 0xD004, 0xD004, 0x0BEC, 0xD005, 0xD010, 0x40CB,
+ 0xD011, 0xD011, 0x0BED, 0xD012, 0xD017, 0x40D7, 0xD018, 0xD018, 0x0BEE,
+ 0xD019, 0xD02C, 0x40DD, 0xD02D, 0xD02D, 0x0BEF, 0xD02E, 0xD033, 0x40F1,
+ 0xD034, 0xD035, 0x0BF0, 0xD036, 0xD037, 0x40F7, 0xD038, 0xD038, 0x0BF2,
+ 0xD039, 0xD03B, 0x40F9, 0xD03C, 0xD03C, 0x0BF3, 0xD03D, 0xD043, 0x40FC,
+ 0xD044, 0xD045, 0x0BF4, 0xD046, 0xD046, 0x4103, 0xD047, 0xD047, 0x0BF6,
+ 0xD048, 0xD048, 0x4104, 0xD049, 0xD049, 0x0BF7, 0xD04A, 0xD04F, 0x4105,
+ 0xD050, 0xD050, 0x0BF8, 0xD051, 0xD053, 0x410B, 0xD054, 0xD054, 0x0BF9,
+ 0xD055, 0xD057, 0x410E, 0xD058, 0xD058, 0x0BFA, 0xD059, 0xD05F, 0x4111,
+ 0xD060, 0xD060, 0x0BFB, 0xD061, 0xD06B, 0x4118, 0xD06C, 0xD06D, 0x0BFC,
+ 0xD06E, 0xD06F, 0x4123, 0xD070, 0xD070, 0x0BFE, 0xD071, 0xD073, 0x4125,
+ 0xD074, 0xD074, 0x0BFF, 0xD075, 0xD07B, 0x4128, 0xD07C, 0xD07D, 0x0C00,
+ 0xD07E, 0xD080, 0x412F, 0xD081, 0xD081, 0x0C02, 0xD082, 0xD0A3, 0x4132,
+ 0xD0A4, 0xD0A5, 0x0C03, 0xD0A6, 0xD0A7, 0x4154, 0xD0A8, 0xD0A8, 0x0C05,
+ 0xD0A9, 0xD0AB, 0x4156, 0xD0AC, 0xD0AC, 0x0C06, 0xD0AD, 0xD0B3, 0x4159,
+ 0xD0B4, 0xD0B5, 0x0C07, 0xD0B6, 0xD0B6, 0x4160, 0xD0B7, 0xD0B7, 0x0C09,
+ 0xD0B8, 0xD0B8, 0x4161, 0xD0B9, 0xD0B9, 0x0C0A, 0xD0BA, 0xD0BF, 0x4162,
+ 0xD0C0, 0xD0C1, 0x0C0B, 0xD0C2, 0xD0C3, 0x4168, 0xD0C4, 0xD0C4, 0x0C0D,
+ 0xD0C5, 0xD0C7, 0x416A, 0xD0C8, 0xD0C9, 0x0C0E, 0xD0CA, 0xD0CF, 0x416D,
+ 0xD0D0, 0xD0D1, 0x0C10, 0xD0D2, 0xD0D2, 0x4173, 0xD0D3, 0xD0D5, 0x0C12,
+ 0xD0D6, 0xD0DB, 0x4174, 0xD0DC, 0xD0DD, 0x0C15, 0xD0DE, 0xD0DF, 0x417A,
+ 0xD0E0, 0xD0E0, 0x0C17, 0xD0E1, 0xD0E3, 0x417C, 0xD0E4, 0xD0E4, 0x0C18,
+ 0xD0E5, 0xD0EB, 0x417F, 0xD0EC, 0xD0ED, 0x0C19, 0xD0EE, 0xD0EE, 0x4186,
+ 0xD0EF, 0xD0F1, 0x0C1B, 0xD0F2, 0xD0F7, 0x4187, 0xD0F8, 0xD0F8, 0x0C1E,
+ 0xD0F9, 0xD0FF, 0x418D, 0xD100, 0xD10C, 0x4194, 0xD10D, 0xD10D, 0x0C1F,
+ 0xD10E, 0xD12F, 0x41A1, 0xD130, 0xD131, 0x0C20, 0xD132, 0xD133, 0x41C3,
+ 0xD134, 0xD134, 0x0C22, 0xD135, 0xD137, 0x41C5, 0xD138, 0xD138, 0x0C23,
+ 0xD139, 0xD139, 0x41C8, 0xD13A, 0xD13A, 0x0C24, 0xD13B, 0xD13F, 0x41C9,
+ 0xD140, 0xD141, 0x0C25, 0xD142, 0xD142, 0x41CE, 0xD143, 0xD145, 0x0C27,
+ 0xD146, 0xD14B, 0x41CF, 0xD14C, 0xD14D, 0x0C2A, 0xD14E, 0xD14F, 0x41D5,
+ 0xD150, 0xD150, 0x0C2C, 0xD151, 0xD153, 0x41D7, 0xD154, 0xD154, 0x0C2D,
+ 0xD155, 0xD15B, 0x41DA, 0xD15C, 0xD15D, 0x0C2E, 0xD15E, 0xD15E, 0x41E1,
+ 0xD15F, 0xD15F, 0x0C30, 0xD160, 0xD160, 0x41E2, 0xD161, 0xD161, 0x0C31,
+ 0xD162, 0xD167, 0x41E3, 0xD168, 0xD168, 0x0C32, 0xD169, 0xD16B, 0x41E9,
+ 0xD16C, 0xD16C, 0x0C33, 0xD16D, 0xD17B, 0x41EC, 0xD17C, 0xD17C, 0x0C34,
+ 0xD17D, 0xD183, 0x41FB, 0xD184, 0xD184, 0x0C35, 0xD185, 0xD187, 0x4202,
+ 0xD188, 0xD188, 0x0C36, 0xD189, 0xD19F, 0x4205, 0xD1A0, 0xD1A1, 0x0C37,
+ 0xD1A2, 0xD1A3, 0x421C, 0xD1A4, 0xD1A4, 0x0C39, 0xD1A5, 0xD1A7, 0x421E,
+ 0xD1A8, 0xD1A8, 0x0C3A, 0xD1A9, 0xD1AF, 0x4221, 0xD1B0, 0xD1B1, 0x0C3B,
+ 0xD1B2, 0xD1B2, 0x4228, 0xD1B3, 0xD1B3, 0x0C3D, 0xD1B4, 0xD1B4, 0x4229,
+ 0xD1B5, 0xD1B5, 0x0C3E, 0xD1B6, 0xD1B9, 0x422A, 0xD1BA, 0xD1BA, 0x0C3F,
+ 0xD1BB, 0xD1BB, 0x422E, 0xD1BC, 0xD1BC, 0x0C40, 0xD1BD, 0xD1BF, 0x422F,
+ 0xD1C0, 0xD1C0, 0x0C41, 0xD1C1, 0xD1D7, 0x4232, 0xD1D8, 0xD1D8, 0x0C42,
+ 0xD1D9, 0xD1F3, 0x4249, 0xD1F4, 0xD1F4, 0x0C43, 0xD1F5, 0xD1F7, 0x4264,
+ 0xD1F8, 0xD1F8, 0x0C44, 0xD1F9, 0xD1FF, 0x4267, 0xD200, 0xD206, 0x426E,
+ 0xD207, 0xD207, 0x0C45, 0xD208, 0xD208, 0x4275, 0xD209, 0xD209, 0x0C46,
+ 0xD20A, 0xD20F, 0x4276, 0xD210, 0xD210, 0x0C47, 0xD211, 0xD22B, 0x427C,
+ 0xD22C, 0xD22D, 0x0C48, 0xD22E, 0xD22F, 0x4297, 0xD230, 0xD230, 0x0C4A,
+ 0xD231, 0xD233, 0x4299, 0xD234, 0xD234, 0x0C4B, 0xD235, 0xD23B, 0x429C,
+ 0xD23C, 0xD23D, 0x0C4C, 0xD23E, 0xD23E, 0x42A3, 0xD23F, 0xD23F, 0x0C4E,
+ 0xD240, 0xD240, 0x42A4, 0xD241, 0xD241, 0x0C4F, 0xD242, 0xD247, 0x42A5,
+ 0xD248, 0xD248, 0x0C50, 0xD249, 0xD25B, 0x42AB, 0xD25C, 0xD25C, 0x0C51,
+ 0xD25D, 0xD263, 0x42BE, 0xD264, 0xD264, 0x0C52, 0xD265, 0xD27F, 0x42C5,
+ 0xD280, 0xD281, 0x0C53, 0xD282, 0xD283, 0x42E0, 0xD284, 0xD284, 0x0C55,
+ 0xD285, 0xD287, 0x42E2, 0xD288, 0xD288, 0x0C56, 0xD289, 0xD28F, 0x42E5,
+ 0xD290, 0xD291, 0x0C57, 0xD292, 0xD294, 0x42EC, 0xD295, 0xD295, 0x0C59,
+ 0xD296, 0xD29B, 0x42EF, 0xD29C, 0xD29C, 0x0C5A, 0xD29D, 0xD29F, 0x42F5,
+ 0xD2A0, 0xD2A0, 0x0C5B, 0xD2A1, 0xD2A3, 0x42F8, 0xD2A4, 0xD2A4, 0x0C5C,
+ 0xD2A5, 0xD2AB, 0x42FB, 0xD2AC, 0xD2AC, 0x0C5D, 0xD2AD, 0xD2B0, 0x4302,
+ 0xD2B1, 0xD2B1, 0x0C5E, 0xD2B2, 0xD2B7, 0x4306, 0xD2B8, 0xD2B9, 0x0C5F,
+ 0xD2BA, 0xD2BB, 0x430C, 0xD2BC, 0xD2BC, 0x0C61, 0xD2BD, 0xD2BE, 0x430E,
+ 0xD2BF, 0xD2C0, 0x0C62, 0xD2C1, 0xD2C1, 0x4310, 0xD2C2, 0xD2C2, 0x0C64,
+ 0xD2C3, 0xD2C7, 0x4311, 0xD2C8, 0xD2C9, 0x0C65, 0xD2CA, 0xD2CA, 0x4316,
+ 0xD2CB, 0xD2CB, 0x0C67, 0xD2CC, 0xD2D3, 0x4317, 0xD2D4, 0xD2D4, 0x0C68,
+ 0xD2D5, 0xD2D7, 0x431F, 0xD2D8, 0xD2D8, 0x0C69, 0xD2D9, 0xD2DB, 0x4322,
+ 0xD2DC, 0xD2DC, 0x0C6A, 0xD2DD, 0xD2E3, 0x4325, 0xD2E4, 0xD2E5, 0x0C6B,
+ 0xD2E6, 0xD2EF, 0x432C, 0xD2F0, 0xD2F1, 0x0C6D, 0xD2F2, 0xD2F3, 0x4336,
+ 0xD2F4, 0xD2F4, 0x0C6F, 0xD2F5, 0xD2F7, 0x4338, 0xD2F8, 0xD2F8, 0x0C70,
+ 0xD2F9, 0xD2FF, 0x433B, 0xD300, 0xD301, 0x0C71, 0xD302, 0xD302, 0x4342,
+ 0xD303, 0xD303, 0x0C73, 0xD304, 0xD304, 0x4343, 0xD305, 0xD305, 0x0C74,
+ 0xD306, 0xD30B, 0x4344, 0xD30C, 0xD30E, 0x0C75, 0xD30F, 0xD30F, 0x434A,
+ 0xD310, 0xD310, 0x0C78, 0xD311, 0xD313, 0x434B, 0xD314, 0xD314, 0x0C79,
+ 0xD315, 0xD315, 0x434E, 0xD316, 0xD316, 0x0C7A, 0xD317, 0xD31B, 0x434F,
+ 0xD31C, 0xD31D, 0x0C7B, 0xD31E, 0xD31E, 0x4354, 0xD31F, 0xD321, 0x0C7D,
+ 0xD322, 0xD324, 0x4355, 0xD325, 0xD325, 0x0C80, 0xD326, 0xD327, 0x4358,
+ 0xD328, 0xD329, 0x0C81, 0xD32A, 0xD32B, 0x435A, 0xD32C, 0xD32C, 0x0C83,
+ 0xD32D, 0xD32F, 0x435C, 0xD330, 0xD330, 0x0C84, 0xD331, 0xD337, 0x435F,
+ 0xD338, 0xD339, 0x0C85, 0xD33A, 0xD33A, 0x4366, 0xD33B, 0xD33D, 0x0C87,
+ 0xD33E, 0xD343, 0x4367, 0xD344, 0xD345, 0x0C8A, 0xD346, 0xD37B, 0x436D,
+ 0xD37C, 0xD37D, 0x0C8C, 0xD37E, 0xD37F, 0x43A3, 0xD380, 0xD380, 0x0C8E,
+ 0xD381, 0xD383, 0x43A5, 0xD384, 0xD384, 0x0C8F, 0xD385, 0xD38B, 0x43A8,
+ 0xD38C, 0xD38D, 0x0C90, 0xD38E, 0xD38E, 0x43AF, 0xD38F, 0xD391, 0x0C92,
+ 0xD392, 0xD397, 0x43B0, 0xD398, 0xD399, 0x0C95, 0xD39A, 0xD39B, 0x43B6,
+ 0xD39C, 0xD39C, 0x0C97, 0xD39D, 0xD39F, 0x43B8, 0xD3A0, 0xD3A0, 0x0C98,
+ 0xD3A1, 0xD3A7, 0x43BB, 0xD3A8, 0xD3A9, 0x0C99, 0xD3AA, 0xD3AA, 0x43C2,
+ 0xD3AB, 0xD3AB, 0x0C9B, 0xD3AC, 0xD3AC, 0x43C3, 0xD3AD, 0xD3AD, 0x0C9C,
+ 0xD3AE, 0xD3B3, 0x43C4, 0xD3B4, 0xD3B4, 0x0C9D, 0xD3B5, 0xD3B7, 0x43CA,
+ 0xD3B8, 0xD3B8, 0x0C9E, 0xD3B9, 0xD3BB, 0x43CD, 0xD3BC, 0xD3BC, 0x0C9F,
+ 0xD3BD, 0xD3C3, 0x43D0, 0xD3C4, 0xD3C5, 0x0CA0, 0xD3C6, 0xD3C7, 0x43D7,
+ 0xD3C8, 0xD3C9, 0x0CA2, 0xD3CA, 0xD3CF, 0x43D9, 0xD3D0, 0xD3D0, 0x0CA4,
+ 0xD3D1, 0xD3D7, 0x43DF, 0xD3D8, 0xD3D8, 0x0CA5, 0xD3D9, 0xD3E0, 0x43E6,
+ 0xD3E1, 0xD3E1, 0x0CA6, 0xD3E2, 0xD3E2, 0x43EE, 0xD3E3, 0xD3E3, 0x0CA7,
+ 0xD3E4, 0xD3EB, 0x43EF, 0xD3EC, 0xD3ED, 0x0CA8, 0xD3EE, 0xD3EF, 0x43F7,
+ 0xD3F0, 0xD3F0, 0x0CAA, 0xD3F1, 0xD3F3, 0x43F9, 0xD3F4, 0xD3F4, 0x0CAB,
+ 0xD3F5, 0xD3FB, 0x43FC, 0xD3FC, 0xD3FD, 0x0CAC, 0xD3FE, 0xD3FE, 0x4403,
+ 0xD3FF, 0xD3FF, 0x0CAE, 0xD400, 0xD400, 0x4404, 0xD401, 0xD401, 0x0CAF,
+ 0xD402, 0xD407, 0x4405, 0xD408, 0xD408, 0x0CB0, 0xD409, 0xD41C, 0x440B,
+ 0xD41D, 0xD41D, 0x0CB1, 0xD41E, 0xD43F, 0x441F, 0xD440, 0xD440, 0x0CB2,
+ 0xD441, 0xD443, 0x4441, 0xD444, 0xD444, 0x0CB3, 0xD445, 0xD45B, 0x4444,
+ 0xD45C, 0xD45C, 0x0CB4, 0xD45D, 0xD45F, 0x445B, 0xD460, 0xD460, 0x0CB5,
+ 0xD461, 0xD463, 0x445E, 0xD464, 0xD464, 0x0CB6, 0xD465, 0xD46C, 0x4461,
+ 0xD46D, 0xD46D, 0x0CB7, 0xD46E, 0xD46E, 0x4469, 0xD46F, 0xD46F, 0x0CB8,
+ 0xD470, 0xD477, 0x446A, 0xD478, 0xD479, 0x0CB9, 0xD47A, 0xD47B, 0x4472,
+ 0xD47C, 0xD47C, 0x0CBB, 0xD47D, 0xD47E, 0x4474, 0xD47F, 0xD480, 0x0CBC,
+ 0xD481, 0xD481, 0x4476, 0xD482, 0xD482, 0x0CBE, 0xD483, 0xD487, 0x4477,
+ 0xD488, 0xD489, 0x0CBF, 0xD48A, 0xD48A, 0x447C, 0xD48B, 0xD48B, 0x0CC1,
+ 0xD48C, 0xD48C, 0x447D, 0xD48D, 0xD48D, 0x0CC2, 0xD48E, 0xD493, 0x447E,
+ 0xD494, 0xD494, 0x0CC3, 0xD495, 0xD4A8, 0x4484, 0xD4A9, 0xD4A9, 0x0CC4,
+ 0xD4AA, 0xD4CB, 0x4498, 0xD4CC, 0xD4CC, 0x0CC5, 0xD4CD, 0xD4CF, 0x44BA,
+ 0xD4D0, 0xD4D0, 0x0CC6, 0xD4D1, 0xD4D3, 0x44BD, 0xD4D4, 0xD4D4, 0x0CC7,
+ 0xD4D5, 0xD4DB, 0x44C0, 0xD4DC, 0xD4DC, 0x0CC8, 0xD4DD, 0xD4DE, 0x44C7,
+ 0xD4DF, 0xD4DF, 0x0CC9, 0xD4E0, 0xD4E7, 0x44C9, 0xD4E8, 0xD4E8, 0x0CCA,
+ 0xD4E9, 0xD4EB, 0x44D1, 0xD4EC, 0xD4EC, 0x0CCB, 0xD4ED, 0xD4EF, 0x44D4,
+ 0xD4F0, 0xD4F0, 0x0CCC, 0xD4F1, 0xD4F7, 0x44D7, 0xD4F8, 0xD4F8, 0x0CCD,
+ 0xD4F9, 0xD4FA, 0x44DE, 0xD4FB, 0xD4FB, 0x0CCE, 0xD4FC, 0xD4FC, 0x44E0,
+ 0xD4FD, 0xD4FD, 0x0CCF, 0xD4FE, 0xD4FF, 0x44E1, 0xD500, 0xD503, 0x44E3,
+ 0xD504, 0xD504, 0x0CD0, 0xD505, 0xD507, 0x44E7, 0xD508, 0xD508, 0x0CD1,
+ 0xD509, 0xD50B, 0x44EA, 0xD50C, 0xD50C, 0x0CD2, 0xD50D, 0xD513, 0x44ED,
+ 0xD514, 0xD515, 0x0CD3, 0xD516, 0xD516, 0x44F4, 0xD517, 0xD517, 0x0CD5,
+ 0xD518, 0xD53B, 0x44F5, 0xD53C, 0xD53D, 0x0CD6, 0xD53E, 0xD53F, 0x4519,
+ 0xD540, 0xD540, 0x0CD8, 0xD541, 0xD543, 0x451B, 0xD544, 0xD544, 0x0CD9,
+ 0xD545, 0xD54B, 0x451E, 0xD54C, 0xD54D, 0x0CDA, 0xD54E, 0xD54E, 0x4525,
+ 0xD54F, 0xD54F, 0x0CDC, 0xD550, 0xD550, 0x4526, 0xD551, 0xD551, 0x0CDD,
+ 0xD552, 0xD557, 0x4527, 0xD558, 0xD559, 0x0CDE, 0xD55A, 0xD55B, 0x452D,
+ 0xD55C, 0xD55C, 0x0CE0, 0xD55D, 0xD55F, 0x452F, 0xD560, 0xD560, 0x0CE1,
+ 0xD561, 0xD564, 0x4532, 0xD565, 0xD565, 0x0CE2, 0xD566, 0xD567, 0x4536,
+ 0xD568, 0xD569, 0x0CE3, 0xD56A, 0xD56A, 0x4538, 0xD56B, 0xD56B, 0x0CE5,
+ 0xD56C, 0xD56C, 0x4539, 0xD56D, 0xD56D, 0x0CE6, 0xD56E, 0xD573, 0x453A,
+ 0xD574, 0xD575, 0x0CE7, 0xD576, 0xD577, 0x4540, 0xD578, 0xD578, 0x0CE9,
+ 0xD579, 0xD57B, 0x4542, 0xD57C, 0xD57C, 0x0CEA, 0xD57D, 0xD583, 0x4545,
+ 0xD584, 0xD585, 0x0CEB, 0xD586, 0xD586, 0x454C, 0xD587, 0xD589, 0x0CED,
+ 0xD58A, 0xD58F, 0x454D, 0xD590, 0xD590, 0x0CF0, 0xD591, 0xD5A4, 0x4553,
+ 0xD5A5, 0xD5A5, 0x0CF1, 0xD5A6, 0xD5C7, 0x4567, 0xD5C8, 0xD5C9, 0x0CF2,
+ 0xD5CA, 0xD5CB, 0x4589, 0xD5CC, 0xD5CC, 0x0CF4, 0xD5CD, 0xD5CF, 0x458B,
+ 0xD5D0, 0xD5D0, 0x0CF5, 0xD5D1, 0xD5D1, 0x458E, 0xD5D2, 0xD5D2, 0x0CF6,
+ 0xD5D3, 0xD5D7, 0x458F, 0xD5D8, 0xD5D9, 0x0CF7, 0xD5DA, 0xD5DA, 0x4594,
+ 0xD5DB, 0xD5DB, 0x0CF9, 0xD5DC, 0xD5DC, 0x4595, 0xD5DD, 0xD5DD, 0x0CFA,
+ 0xD5DE, 0xD5E3, 0x4596, 0xD5E4, 0xD5E5, 0x0CFB, 0xD5E6, 0xD5E7, 0x459C,
+ 0xD5E8, 0xD5E8, 0x0CFD, 0xD5E9, 0xD5EB, 0x459E, 0xD5EC, 0xD5EC, 0x0CFE,
+ 0xD5ED, 0xD5F3, 0x45A1, 0xD5F4, 0xD5F5, 0x0CFF, 0xD5F6, 0xD5F6, 0x45A8,
+ 0xD5F7, 0xD5F7, 0x0D01, 0xD5F8, 0xD5F8, 0x45A9, 0xD5F9, 0xD5F9, 0x0D02,
+ 0xD5FA, 0xD5FF, 0x45AA, 0xD600, 0xD601, 0x0D03, 0xD602, 0xD603, 0x45B0,
+ 0xD604, 0xD604, 0x0D05, 0xD605, 0xD607, 0x45B2, 0xD608, 0xD608, 0x0D06,
+ 0xD609, 0xD60F, 0x45B5, 0xD610, 0xD611, 0x0D07, 0xD612, 0xD612, 0x45BC,
+ 0xD613, 0xD615, 0x0D09, 0xD616, 0xD61B, 0x45BD, 0xD61C, 0xD61C, 0x0D0C,
+ 0xD61D, 0xD61F, 0x45C3, 0xD620, 0xD620, 0x0D0D, 0xD621, 0xD623, 0x45C6,
+ 0xD624, 0xD624, 0x0D0E, 0xD625, 0xD62C, 0x45C9, 0xD62D, 0xD62D, 0x0D0F,
+ 0xD62E, 0xD637, 0x45D1, 0xD638, 0xD639, 0x0D10, 0xD63A, 0xD63B, 0x45DB,
+ 0xD63C, 0xD63C, 0x0D12, 0xD63D, 0xD63F, 0x45DD, 0xD640, 0xD640, 0x0D13,
+ 0xD641, 0xD644, 0x45E0, 0xD645, 0xD645, 0x0D14, 0xD646, 0xD647, 0x45E4,
+ 0xD648, 0xD649, 0x0D15, 0xD64A, 0xD64A, 0x45E6, 0xD64B, 0xD64B, 0x0D17,
+ 0xD64C, 0xD64C, 0x45E7, 0xD64D, 0xD64D, 0x0D18, 0xD64E, 0xD650, 0x45E8,
+ 0xD651, 0xD651, 0x0D19, 0xD652, 0xD653, 0x45EB, 0xD654, 0xD655, 0x0D1A,
+ 0xD656, 0xD657, 0x45ED, 0xD658, 0xD658, 0x0D1C, 0xD659, 0xD65B, 0x45EF,
+ 0xD65C, 0xD65C, 0x0D1D, 0xD65D, 0xD666, 0x45F2, 0xD667, 0xD667, 0x0D1E,
+ 0xD668, 0xD668, 0x45FC, 0xD669, 0xD669, 0x0D1F, 0xD66A, 0xD66F, 0x45FD,
+ 0xD670, 0xD671, 0x0D20, 0xD672, 0xD673, 0x4603, 0xD674, 0xD674, 0x0D22,
+ 0xD675, 0xD682, 0x4605, 0xD683, 0xD683, 0x0D23, 0xD684, 0xD684, 0x4613,
+ 0xD685, 0xD685, 0x0D24, 0xD686, 0xD68B, 0x4614, 0xD68C, 0xD68D, 0x0D25,
+ 0xD68E, 0xD68F, 0x461A, 0xD690, 0xD690, 0x0D27, 0xD691, 0xD693, 0x461C,
+ 0xD694, 0xD694, 0x0D28, 0xD695, 0xD69C, 0x461F, 0xD69D, 0xD69D, 0x0D29,
+ 0xD69E, 0xD69E, 0x4627, 0xD69F, 0xD69F, 0x0D2A, 0xD6A0, 0xD6A0, 0x4628,
+ 0xD6A1, 0xD6A1, 0x0D2B, 0xD6A2, 0xD6A7, 0x4629, 0xD6A8, 0xD6A8, 0x0D2C,
+ 0xD6A9, 0xD6AB, 0x462F, 0xD6AC, 0xD6AC, 0x0D2D, 0xD6AD, 0xD6AF, 0x4632,
+ 0xD6B0, 0xD6B0, 0x0D2E, 0xD6B1, 0xD6B8, 0x4635, 0xD6B9, 0xD6B9, 0x0D2F,
+ 0xD6BA, 0xD6BA, 0x463D, 0xD6BB, 0xD6BB, 0x0D30, 0xD6BC, 0xD6C3, 0x463E,
+ 0xD6C4, 0xD6C5, 0x0D31, 0xD6C6, 0xD6C7, 0x4646, 0xD6C8, 0xD6C8, 0x0D33,
+ 0xD6C9, 0xD6CB, 0x4648, 0xD6CC, 0xD6CC, 0x0D34, 0xD6CD, 0xD6D0, 0x464B,
+ 0xD6D1, 0xD6D1, 0x0D35, 0xD6D2, 0xD6D3, 0x464F, 0xD6D4, 0xD6D4, 0x0D36,
+ 0xD6D5, 0xD6D6, 0x4651, 0xD6D7, 0xD6D7, 0x0D37, 0xD6D8, 0xD6D8, 0x4653,
+ 0xD6D9, 0xD6D9, 0x0D38, 0xD6DA, 0xD6DF, 0x4654, 0xD6E0, 0xD6E0, 0x0D39,
+ 0xD6E1, 0xD6E3, 0x465A, 0xD6E4, 0xD6E4, 0x0D3A, 0xD6E5, 0xD6E7, 0x465D,
+ 0xD6E8, 0xD6E8, 0x0D3B, 0xD6E9, 0xD6EF, 0x4660, 0xD6F0, 0xD6F0, 0x0D3C,
+ 0xD6F1, 0xD6F4, 0x4667, 0xD6F5, 0xD6F5, 0x0D3D, 0xD6F6, 0xD6FB, 0x466B,
+ 0xD6FC, 0xD6FD, 0x0D3E, 0xD6FE, 0xD6FF, 0x4671, 0xD700, 0xD700, 0x0D40,
+ 0xD701, 0xD703, 0x4673, 0xD704, 0xD704, 0x0D41, 0xD705, 0xD710, 0x4676,
+ 0xD711, 0xD711, 0x0D42, 0xD712, 0xD717, 0x4682, 0xD718, 0xD719, 0x0D43,
+ 0xD71A, 0xD71B, 0x4688, 0xD71C, 0xD71C, 0x0D45, 0xD71D, 0xD71F, 0x468A,
+ 0xD720, 0xD720, 0x0D46, 0xD721, 0xD727, 0x468D, 0xD728, 0xD729, 0x0D47,
+ 0xD72A, 0xD72A, 0x4694, 0xD72B, 0xD72B, 0x0D49, 0xD72C, 0xD72C, 0x4695,
+ 0xD72D, 0xD72D, 0x0D4A, 0xD72E, 0xD733, 0x4696, 0xD734, 0xD735, 0x0D4B,
+ 0xD736, 0xD737, 0x469C, 0xD738, 0xD738, 0x0D4D, 0xD739, 0xD73B, 0x469E,
+ 0xD73C, 0xD73C, 0x0D4E, 0xD73D, 0xD743, 0x46A1, 0xD744, 0xD744, 0x0D4F,
+ 0xD745, 0xD746, 0x46A8, 0xD747, 0xD747, 0x0D50, 0xD748, 0xD748, 0x46AA,
+ 0xD749, 0xD749, 0x0D51, 0xD74A, 0xD74F, 0x46AB, 0xD750, 0xD751, 0x0D52,
+ 0xD752, 0xD753, 0x46B1, 0xD754, 0xD754, 0x0D54, 0xD755, 0xD755, 0x46B3,
+ 0xD756, 0xD759, 0x0D55, 0xD75A, 0xD75F, 0x46B4, 0xD760, 0xD761, 0x0D59,
+ 0xD762, 0xD762, 0x46BA, 0xD763, 0xD763, 0x0D5B, 0xD764, 0xD764, 0x46BB,
+ 0xD765, 0xD765, 0x0D5C, 0xD766, 0xD768, 0x46BC, 0xD769, 0xD769, 0x0D5D,
+ 0xD76A, 0xD76B, 0x46BF, 0xD76C, 0xD76C, 0x0D5E, 0xD76D, 0xD76F, 0x46C1,
+ 0xD770, 0xD770, 0x0D5F, 0xD771, 0xD773, 0x46C4, 0xD774, 0xD774, 0x0D60,
+ 0xD775, 0xD77B, 0x46C7, 0xD77C, 0xD77D, 0x0D61, 0xD77E, 0xD780, 0x46CE,
+ 0xD781, 0xD781, 0x0D63, 0xD782, 0xD787, 0x46D1, 0xD788, 0xD789, 0x0D64,
+ 0xD78A, 0xD78B, 0x46D7, 0xD78C, 0xD78C, 0x0D66, 0xD78D, 0xD78F, 0x46D9,
+ 0xD790, 0xD790, 0x0D67, 0xD791, 0xD797, 0x46DC, 0xD798, 0xD799, 0x0D68,
+ 0xD79A, 0xD79A, 0x46E3, 0xD79B, 0xD79B, 0x0D6A, 0xD79C, 0xD79C, 0x46E4,
+ 0xD79D, 0xD79D, 0x0D6B, 0xD79E, 0xD7A3, 0x46E5, 0xF900, 0xF900, 0x1014,
+ 0xF901, 0xF901, 0x0E5E, 0xF902, 0xF902, 0x1B8D, 0xF903, 0xF903, 0x0D84,
+ 0xF904, 0xF904, 0x1EDC, 0xF905, 0xF905, 0x0EDA, 0xF906, 0xF906, 0x0F3E,
+ 0xF907, 0xF907, 0x0F6A, 0xF908, 0xF908, 0x0F6A, 0xF909, 0xF909, 0x0E7C,
+ 0xF90A, 0xF90A, 0x1023, 0xF90B, 0xF90B, 0x1116, 0xF90C, 0xF90C, 0x103C,
+ 0xF90D, 0xF913, 0x1117, 0xF914, 0xF914, 0x16A8, 0xF915, 0xF917, 0x111E,
+ 0xF918, 0xF91D, 0x1122, 0xF91E, 0xF920, 0x112A, 0xF921, 0xF921, 0x112F,
+ 0xF922, 0xF922, 0x1133, 0xF923, 0xF924, 0x1136, 0xF925, 0xF92B, 0x1139,
+ 0xF92C, 0xF92D, 0x1143, 0xF92E, 0xF92E, 0x1148, 0xF92F, 0xF92F, 0x119F,
+ 0xF930, 0xF931, 0x11A1, 0xF932, 0xF937, 0x11A5, 0xF938, 0xF93A, 0x11AC,
+ 0xF93B, 0xF940, 0x11B0, 0xF941, 0xF943, 0x11B7, 0xF944, 0xF945, 0x11BD,
+ 0xF946, 0xF948, 0x11C1, 0xF949, 0xF949, 0x11C6, 0xF94A, 0xF94A, 0x11D4,
+ 0xF94B, 0xF94E, 0x11D6, 0xF94F, 0xF950, 0x11DB, 0xF951, 0xF951, 0x11E0,
+ 0xF952, 0xF955, 0x11FC, 0xF956, 0xF959, 0x1201, 0xF95A, 0xF95A, 0x10DE,
+ 0xF95B, 0xF95B, 0x1028, 0xF95C, 0xF95C, 0x16A8, 0xF95D, 0xF95D, 0x102B,
+ 0xF95E, 0xF95E, 0x1060, 0xF95F, 0xF95F, 0x1047, 0xF960, 0xF960, 0x104C,
+ 0xF961, 0xF961, 0x15B0, 0xF962, 0xF962, 0x1918, 0xF963, 0xF963, 0x141F,
+ 0xF964, 0xF964, 0x133A, 0xF965, 0xF965, 0x1D5E, 0xF966, 0xF966, 0x13D7,
+ 0xF967, 0xF967, 0x13F5, 0xF968, 0xF968, 0x1DB7, 0xF969, 0xF969, 0x15D0,
+ 0xF96A, 0xF96A, 0x14F7, 0xF96B, 0xF96B, 0x1BAB, 0xF96C, 0xF96C, 0x14F2,
+ 0xF96D, 0xF96D, 0x156D, 0xF96E, 0xF96E, 0x1771, 0xF96F, 0xF96F, 0x1554,
+ 0xF970, 0xF970, 0x14C5, 0xF971, 0xF971, 0x1B61, 0xF972, 0xF972, 0x1CCA,
+ 0xF973, 0xF973, 0x162E, 0xF974, 0xF974, 0x16F2, 0xF975, 0xF977, 0x1149,
+ 0xF978, 0xF97A, 0x114D, 0xF97B, 0xF97D, 0x1153, 0xF97E, 0xF97E, 0x1157,
+ 0xF97F, 0xF980, 0x115A, 0xF981, 0xF981, 0x103F, 0xF982, 0xF982, 0x115C,
+ 0xF983, 0xF983, 0x115F, 0xF984, 0xF985, 0x1161, 0xF986, 0xF986, 0x1165,
+ 0xF987, 0xF98C, 0x1167, 0xF98D, 0xF98D, 0x116F, 0xF98E, 0xF98E, 0x1040,
+ 0xF98F, 0xF990, 0x1171, 0xF991, 0xF991, 0x1041, 0xF992, 0xF994, 0x1174,
+ 0xF995, 0xF995, 0x1042, 0xF996, 0xF997, 0x1177, 0xF998, 0xF998, 0x117A,
+ 0xF999, 0xF999, 0x1179, 0xF99A, 0xF99B, 0x117B, 0xF99C, 0xF99D, 0x117E,
+ 0xF99E, 0xF99E, 0x192F, 0xF99F, 0xF9A0, 0x1181, 0xF9A1, 0xF9A1, 0x1554,
+ 0xF9A2, 0xF9A2, 0x1183, 0xF9A3, 0xF9A3, 0x1043, 0xF9A4, 0xF9A4, 0x1046,
+ 0xF9A5, 0xF9A5, 0x1185, 0xF9A6, 0xF9A8, 0x1187, 0xF9A9, 0xF9A9, 0x118B,
+ 0xF9AA, 0xF9AA, 0x1047, 0xF9AB, 0xF9AD, 0x118D, 0xF9AE, 0xF9AE, 0x1E67,
+ 0xF9AF, 0xF9AF, 0x1191, 0xF9B0, 0xF9B0, 0x1193, 0xF9B1, 0xF9B4, 0x1195,
+ 0xF9B5, 0xF9B5, 0x119A, 0xF9B6, 0xF9B8, 0x119C, 0xF9B9, 0xF9B9, 0x16A5,
+ 0xF9BA, 0xF9BC, 0x11C7, 0xF9BD, 0xF9BD, 0x1054, 0xF9BE, 0xF9BE, 0x11CB,
+ 0xF9BF, 0xF9BF, 0x16A8, 0xF9C0, 0xF9C1, 0x11CC, 0xF9C2, 0xF9C3, 0x11D0,
+ 0xF9C4, 0xF9C4, 0x11D3, 0xF9C5, 0xF9C5, 0x1F34, 0xF9C6, 0xF9C6, 0x17EB,
+ 0xF9C7, 0xF9C7, 0x11E1, 0xF9C8, 0xF9C8, 0x1057, 0xF9C9, 0xF9C9, 0x11E3,
+ 0xF9CA, 0xF9CB, 0x11E5, 0xF9CC, 0xF9CC, 0x11E8, 0xF9CD, 0xF9CD, 0x11EA,
+ 0xF9CE, 0xF9CE, 0x11EC, 0xF9CF, 0xF9CF, 0x1058, 0xF9D0, 0xF9D3, 0x11EE,
+ 0xF9D4, 0xF9D6, 0x11F3, 0xF9D7, 0xF9DA, 0x11F7, 0xF9DB, 0xF9DB, 0x15B0,
+ 0xF9DC, 0xF9DC, 0x11FB, 0xF9DD, 0xF9DD, 0x1206, 0xF9DE, 0xF9DE, 0x1208,
+ 0xF9DF, 0xF9DF, 0x120A, 0xF9E0, 0xF9E0, 0x173E, 0xF9E1, 0xF9E2, 0x120C,
+ 0xF9E3, 0xF9E3, 0x105B, 0xF9E4, 0xF9E4, 0x1211, 0xF9E5, 0xF9E5, 0x1213,
+ 0xF9E6, 0xF9E6, 0x1215, 0xF9E7, 0xF9E9, 0x1218, 0xF9EA, 0xF9EA, 0x121C,
+ 0xF9EB, 0xF9EC, 0x105C, 0xF9ED, 0xF9ED, 0x121E, 0xF9EE, 0xF9F0, 0x1220,
+ 0xF9F1, 0xF9F5, 0x1224, 0xF9F6, 0xF9F6, 0x122A, 0xF9F7, 0xF9F9, 0x122D,
+ 0xF9FA, 0xF9FA, 0x14E7, 0xF9FB, 0xF9FB, 0x195E, 0xF9FC, 0xF9FC, 0x1663,
+ 0xF9FD, 0xF9FD, 0x168B, 0xF9FE, 0xF9FE, 0x105F, 0xF9FF, 0xF9FF, 0x1954,
+ 0xFA00, 0xFA00, 0x1A1C, 0xFA01, 0xFA01, 0x10B7, 0xFA02, 0xFA02, 0x1BE3,
+ 0xFA03, 0xFA03, 0x1097, 0xFA04, 0xFA04, 0x10AA, 0xFA05, 0xFA05, 0x10F4,
+ 0xFA06, 0xFA06, 0x1D94, 0xFA07, 0xFA07, 0x13E0, 0xFA08, 0xFA08, 0x1E1D,
+ 0xFA09, 0xFA09, 0x0DE6, 0xFA0A, 0xFA0A, 0x0E3C, 0xFA0B, 0xFA0B, 0x0EE7,
+ 0xFF01, 0xFF3B, 0x0108, 0xFF3C, 0xFF3C, 0x0070, 0xFF3D, 0xFF5D, 0x0144,
+ 0xFF5E, 0xFF5E, 0x0071, 0xFFE0, 0xFFE1, 0x008F, 0xFFE2, 0xFFE2, 0x00C2,
+ 0xFFE3, 0xFFE3, 0x0165, 0xFFE5, 0xFFE5, 0x0091, 0xFFE6, 0xFFE6, 0x0143,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/Korea1/UniKS-UTF16-H_0.cpp b/core/src/fpdfapi/fpdf_cmaps/Korea1/UniKS-UTF16-H_0.cpp
index 1154f553eb..c977e86f98 100644
--- a/core/src/fpdfapi/fpdf_cmaps/Korea1/UniKS-UTF16-H_0.cpp
+++ b/core/src/fpdfapi/fpdf_cmaps/Korea1/UniKS-UTF16-H_0.cpp
@@ -1,48 +1,48 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-extern const unsigned short g_FXCMAP_UniKS_UTF16_H_0[158 * 2] = {
- 0x00A9, 0x0062, 0x2010, 0x0061, 0x20A9, 0x0060, 0x2F00, 0x193C,
- 0x2F04, 0x18EC, 0x2F06, 0x190D, 0x2F08, 0x192B, 0x2F0A, 0x194D,
- 0x2F0B, 0x1D4B, 0x2F11, 0x10AE, 0x2F12, 0x116A, 0x2F14, 0x143F,
- 0x2F17, 0x168C, 0x2F18, 0x13D5, 0x2F1C, 0x1839, 0x2F1D, 0x0F3D,
- 0x2F1F, 0x1D1B, 0x2F20, 0x1487, 0x2F23, 0x151B, 0x2F24, 0x109D,
- 0x2F25, 0x103F, 0x2F26, 0x1958, 0x2F28, 0x1C4F, 0x2F29, 0x1580,
- 0x2F2B, 0x1641, 0x2F2D, 0x14B9, 0x2F2F, 0x0ECF, 0x2F30, 0x0FED,
- 0x2F31, 0x0E14, 0x2F32, 0x0D99, 0x2F38, 0x0F7C, 0x2F3C, 0x1684,
- 0x2F3D, 0x0EDC, 0x2F3E, 0x1E80, 0x2F3F, 0x15CC, 0x2F40, 0x1B27,
- 0x2F42, 0x12E8, 0x2F43, 0x10FD, 0x2F44, 0x0FBB, 0x2F45, 0x1356,
- 0x2F46, 0x12D3, 0x2F47, 0x1940, 0x2F48, 0x17ED, 0x2F49, 0x1889,
- 0x2F4A, 0x12B4, 0x2F4B, 0x1F5B, 0x2F4C, 0x1B2C, 0x2F4F, 0x12D6,
- 0x2F50, 0x144C, 0x2F51, 0x12A8, 0x2F52, 0x168E, 0x2F54, 0x15D3,
- 0x2F55, 0x1EBB, 0x2F56, 0x1A93, 0x2F57, 0x1409, 0x2F58, 0x1F1A,
- 0x2F5A, 0x1D61, 0x2F5B, 0x1696, 0x2F5C, 0x1842, 0x2F5D, 0x0E37,
- 0x2F5E, 0x1E3D, 0x2F5F, 0x17C1, 0x2F60, 0x0EDE, 0x2F61, 0x17D4,
- 0x2F62, 0x0DC1, 0x2F63, 0x14FA, 0x2F64, 0x182D, 0x2F65, 0x1A08,
- 0x2F66, 0x1DBA, 0x2F69, 0x1381, 0x2F6A, 0x1DB0, 0x2F6B, 0x1293,
- 0x2F6C, 0x12B7, 0x2F6D, 0x12AD, 0x2F6E, 0x164D, 0x2F6F, 0x1525,
- 0x2F70, 0x164E, 0x2F72, 0x1EBE, 0x2F73, 0x1E4B, 0x2F74, 0x122D,
- 0x2F75, 0x1AF4, 0x2F76, 0x12FF, 0x2F78, 0x140C, 0x2F7A, 0x1708,
- 0x2F7B, 0x184A, 0x2F7C, 0x11A7, 0x2F7D, 0x191B, 0x2F7F, 0x191C,
- 0x2F80, 0x18E0, 0x2F81, 0x18D5, 0x2F82, 0x1675, 0x2F83, 0x1966,
- 0x2F84, 0x1B37, 0x2F85, 0x0F5A, 0x2F86, 0x1550, 0x2F87, 0x1BF6,
- 0x2F88, 0x1AE8, 0x2F89, 0x0DA8, 0x2F8A, 0x14F8, 0x2F8B, 0x1C40,
- 0x2F8E, 0x1E4C, 0x2F8F, 0x1E1D, 0x2F90, 0x1909, 0x2F92, 0x0E3C,
- 0x2F93, 0x0D92, 0x2F94, 0x1721, 0x2F95, 0x0EBC, 0x2F96, 0x1103,
- 0x2F97, 0x1656, 0x2F99, 0x1D58, 0x2F9A, 0x19EC, 0x2F9B, 0x1AEC,
- 0x2F9C, 0x1AAE, 0x2F9D, 0x167B, 0x2F9E, 0x1B8D, 0x2F9F, 0x167C,
- 0x2FA0, 0x1B61, 0x2FA2, 0x18F5, 0x2FA3, 0x18D0, 0x2FA5, 0x121A,
- 0x2FA6, 0x1023, 0x2FA7, 0x19A8, 0x2FA8, 0x12EE, 0x2FA9, 0x141B,
- 0x2FAC, 0x1853, 0x2FAD, 0x1C23, 0x2FAE, 0x1464, 0x2FAF, 0x1288,
- 0x2FB0, 0x1E35, 0x2FB1, 0x18A3, 0x2FB3, 0x18F1, 0x2FB4, 0x1E4D,
- 0x2FB5, 0x1DAB, 0x2FB6, 0x1465, 0x2FB7, 0x1665, 0x2FB8, 0x15F9,
- 0x2FB9, 0x1E26, 0x2FBA, 0x1235, 0x2FBB, 0x0EC9, 0x2FBC, 0x0EB5,
- 0x2FC1, 0x0F99, 0x2FC2, 0x1716, 0x2FC3, 0x1AAB, 0x2FC4, 0x11AF,
- 0x2FC5, 0x11B5, 0x2FC6, 0x1276, 0x2FC7, 0x1237, 0x2FC8, 0x1EF7,
- 0x2FC9, 0x1519, 0x2FCA, 0x1F52, 0x2FCD, 0x1A66, 0x2FCE, 0x0EB6,
- 0x2FCF, 0x151A, 0x2FD0, 0x1466, 0x2FD1, 0x1A7D, 0x2FD2, 0x1CBF,
- 0x2FD3, 0x11D3, 0x2FD4, 0x0F6A,
-};
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_UniKS_UTF16_H_0[158 * 2] = {
+ 0x00A9, 0x0062, 0x2010, 0x0061, 0x20A9, 0x0060, 0x2F00, 0x193C,
+ 0x2F04, 0x18EC, 0x2F06, 0x190D, 0x2F08, 0x192B, 0x2F0A, 0x194D,
+ 0x2F0B, 0x1D4B, 0x2F11, 0x10AE, 0x2F12, 0x116A, 0x2F14, 0x143F,
+ 0x2F17, 0x168C, 0x2F18, 0x13D5, 0x2F1C, 0x1839, 0x2F1D, 0x0F3D,
+ 0x2F1F, 0x1D1B, 0x2F20, 0x1487, 0x2F23, 0x151B, 0x2F24, 0x109D,
+ 0x2F25, 0x103F, 0x2F26, 0x1958, 0x2F28, 0x1C4F, 0x2F29, 0x1580,
+ 0x2F2B, 0x1641, 0x2F2D, 0x14B9, 0x2F2F, 0x0ECF, 0x2F30, 0x0FED,
+ 0x2F31, 0x0E14, 0x2F32, 0x0D99, 0x2F38, 0x0F7C, 0x2F3C, 0x1684,
+ 0x2F3D, 0x0EDC, 0x2F3E, 0x1E80, 0x2F3F, 0x15CC, 0x2F40, 0x1B27,
+ 0x2F42, 0x12E8, 0x2F43, 0x10FD, 0x2F44, 0x0FBB, 0x2F45, 0x1356,
+ 0x2F46, 0x12D3, 0x2F47, 0x1940, 0x2F48, 0x17ED, 0x2F49, 0x1889,
+ 0x2F4A, 0x12B4, 0x2F4B, 0x1F5B, 0x2F4C, 0x1B2C, 0x2F4F, 0x12D6,
+ 0x2F50, 0x144C, 0x2F51, 0x12A8, 0x2F52, 0x168E, 0x2F54, 0x15D3,
+ 0x2F55, 0x1EBB, 0x2F56, 0x1A93, 0x2F57, 0x1409, 0x2F58, 0x1F1A,
+ 0x2F5A, 0x1D61, 0x2F5B, 0x1696, 0x2F5C, 0x1842, 0x2F5D, 0x0E37,
+ 0x2F5E, 0x1E3D, 0x2F5F, 0x17C1, 0x2F60, 0x0EDE, 0x2F61, 0x17D4,
+ 0x2F62, 0x0DC1, 0x2F63, 0x14FA, 0x2F64, 0x182D, 0x2F65, 0x1A08,
+ 0x2F66, 0x1DBA, 0x2F69, 0x1381, 0x2F6A, 0x1DB0, 0x2F6B, 0x1293,
+ 0x2F6C, 0x12B7, 0x2F6D, 0x12AD, 0x2F6E, 0x164D, 0x2F6F, 0x1525,
+ 0x2F70, 0x164E, 0x2F72, 0x1EBE, 0x2F73, 0x1E4B, 0x2F74, 0x122D,
+ 0x2F75, 0x1AF4, 0x2F76, 0x12FF, 0x2F78, 0x140C, 0x2F7A, 0x1708,
+ 0x2F7B, 0x184A, 0x2F7C, 0x11A7, 0x2F7D, 0x191B, 0x2F7F, 0x191C,
+ 0x2F80, 0x18E0, 0x2F81, 0x18D5, 0x2F82, 0x1675, 0x2F83, 0x1966,
+ 0x2F84, 0x1B37, 0x2F85, 0x0F5A, 0x2F86, 0x1550, 0x2F87, 0x1BF6,
+ 0x2F88, 0x1AE8, 0x2F89, 0x0DA8, 0x2F8A, 0x14F8, 0x2F8B, 0x1C40,
+ 0x2F8E, 0x1E4C, 0x2F8F, 0x1E1D, 0x2F90, 0x1909, 0x2F92, 0x0E3C,
+ 0x2F93, 0x0D92, 0x2F94, 0x1721, 0x2F95, 0x0EBC, 0x2F96, 0x1103,
+ 0x2F97, 0x1656, 0x2F99, 0x1D58, 0x2F9A, 0x19EC, 0x2F9B, 0x1AEC,
+ 0x2F9C, 0x1AAE, 0x2F9D, 0x167B, 0x2F9E, 0x1B8D, 0x2F9F, 0x167C,
+ 0x2FA0, 0x1B61, 0x2FA2, 0x18F5, 0x2FA3, 0x18D0, 0x2FA5, 0x121A,
+ 0x2FA6, 0x1023, 0x2FA7, 0x19A8, 0x2FA8, 0x12EE, 0x2FA9, 0x141B,
+ 0x2FAC, 0x1853, 0x2FAD, 0x1C23, 0x2FAE, 0x1464, 0x2FAF, 0x1288,
+ 0x2FB0, 0x1E35, 0x2FB1, 0x18A3, 0x2FB3, 0x18F1, 0x2FB4, 0x1E4D,
+ 0x2FB5, 0x1DAB, 0x2FB6, 0x1465, 0x2FB7, 0x1665, 0x2FB8, 0x15F9,
+ 0x2FB9, 0x1E26, 0x2FBA, 0x1235, 0x2FBB, 0x0EC9, 0x2FBC, 0x0EB5,
+ 0x2FC1, 0x0F99, 0x2FC2, 0x1716, 0x2FC3, 0x1AAB, 0x2FC4, 0x11AF,
+ 0x2FC5, 0x11B5, 0x2FC6, 0x1276, 0x2FC7, 0x1237, 0x2FC8, 0x1EF7,
+ 0x2FC9, 0x1519, 0x2FCA, 0x1F52, 0x2FCD, 0x1A66, 0x2FCE, 0x0EB6,
+ 0x2FCF, 0x151A, 0x2FD0, 0x1466, 0x2FD1, 0x1A7D, 0x2FD2, 0x1CBF,
+ 0x2FD3, 0x11D3, 0x2FD4, 0x0F6A,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/cmap_int.h b/core/src/fpdfapi/fpdf_cmaps/cmap_int.h
index 2ce1522dd0..c7dcfc9bf1 100644
--- a/core/src/fpdfapi/fpdf_cmaps/cmap_int.h
+++ b/core/src/fpdfapi/fpdf_cmaps/cmap_int.h
@@ -1,20 +1,20 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef _FPDFAPI_CMAP_INT_H_
-#define _FPDFAPI_CMAP_INT_H_
-struct FXCMAP_CMap {
- typedef enum { None, Single, Range, Reverse } MapType;
- const char* m_Name;
- MapType m_WordMapType;
- const FX_WORD* m_pWordMap;
- int m_WordCount;
- MapType m_DWordMapType;
- const FX_WORD* m_pDWordMap;
- int m_DWordCount;
- int m_UseOffset;
-};
-#endif
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FPDFAPI_CMAP_INT_H_
+#define _FPDFAPI_CMAP_INT_H_
+struct FXCMAP_CMap {
+ typedef enum { None, Single, Range, Reverse } MapType;
+ const char* m_Name;
+ MapType m_WordMapType;
+ const FX_WORD* m_pWordMap;
+ int m_WordCount;
+ MapType m_DWordMapType;
+ const FX_WORD* m_pDWordMap;
+ int m_DWordCount;
+ int m_UseOffset;
+};
+#endif
diff --git a/core/src/fpdfapi/fpdf_cmaps/fpdf_cmaps.cpp b/core/src/fpdfapi/fpdf_cmaps/fpdf_cmaps.cpp
index 9ab324b666..afa5131f66 100644
--- a/core/src/fpdfapi/fpdf_cmaps/fpdf_cmaps.cpp
+++ b/core/src/fpdfapi/fpdf_cmaps/fpdf_cmaps.cpp
@@ -1,183 +1,183 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../../include/fpdfapi/fpdf_resource.h"
-#include "../../../include/fpdfapi/fpdf_module.h"
-#include "../fpdf_font/font_int.h"
-#include "cmap_int.h"
-void FPDFAPI_FindEmbeddedCMap(const char* name, int charset, int coding, const FXCMAP_CMap*& pMap)
-{
- pMap = NULL;
- CPDF_FontGlobals* pFontGlobals = CPDF_ModuleMgr::Get()->GetPageModule()->GetFontGlobals();
- const FXCMAP_CMap* pCMaps = pFontGlobals->m_EmbeddedCharsets[charset].m_pMapList;
- int nCMaps = pFontGlobals->m_EmbeddedCharsets[charset].m_Count;
- for (int i = 0; i < nCMaps; i ++) {
- if (FXSYS_strcmp(name, pCMaps[i].m_Name)) {
- continue;
- }
- pMap = &pCMaps[i];
- break;
- }
-}
-extern "C" {
- static int compareWord(const void* p1, const void* p2)
- {
- return (*(FX_WORD*)p1) - (*(FX_WORD*)p2);
- }
-};
-extern "C" {
- static int compareWordRange(const void* key, const void* element)
- {
- if (*(FX_WORD*)key < * (FX_WORD*)element) {
- return -1;
- }
- if (*(FX_WORD*)key > ((FX_WORD*)element)[1]) {
- return 1;
- }
- return 0;
- }
-};
-extern "C" {
- static int compareDWordRange(const void* p1, const void* p2)
- {
- FX_DWORD key = *(FX_DWORD*)p1;
- FX_WORD hiword = (FX_WORD)(key >> 16);
- FX_WORD* element = (FX_WORD*)p2;
- if (hiword < element[0]) {
- return -1;
- }
- if (hiword > element[0]) {
- return 1;
- }
- FX_WORD loword = (FX_WORD)key;
- if (loword < element[1]) {
- return -1;
- }
- if (loword > element[2]) {
- return 1;
- }
- return 0;
- }
-};
-extern "C" {
- static int compareDWordSingle(const void* p1, const void* p2)
- {
- FX_DWORD key = *(FX_DWORD*)p1;
- FX_DWORD value = ((*(FX_WORD*)p2) << 16) | ((FX_WORD*)p2)[1];
- if (key < value) {
- return -1;
- }
- if (key > value) {
- return 1;
- }
- return 0;
- }
-};
-FX_WORD FPDFAPI_CIDFromCharCode(const FXCMAP_CMap* pMap, FX_DWORD charcode)
-{
- if (charcode >> 16) {
- while (1) {
- if (pMap->m_DWordMapType == FXCMAP_CMap::Range) {
- FX_WORD* found = (FX_WORD*)FXSYS_bsearch(&charcode, pMap->m_pDWordMap, pMap->m_DWordCount, 8, compareDWordRange);
- if (found) {
- return found[3] + (FX_WORD)charcode - found[1];
- }
- } else if (pMap->m_DWordMapType == FXCMAP_CMap::Single) {
- FX_WORD* found = (FX_WORD*)FXSYS_bsearch(&charcode, pMap->m_pDWordMap, pMap->m_DWordCount, 6, compareDWordSingle);
- if (found) {
- return found[2];
- }
- }
- if (pMap->m_UseOffset == 0) {
- return 0;
- }
- pMap = pMap + pMap->m_UseOffset;
- }
- return 0;
- }
- FX_WORD code = (FX_WORD)charcode;
- while (1) {
- if (pMap->m_pWordMap == NULL) {
- return 0;
- }
- if (pMap->m_WordMapType == FXCMAP_CMap::Single) {
- FX_WORD* found = (FX_WORD*)FXSYS_bsearch(&code, pMap->m_pWordMap, pMap->m_WordCount, 4, compareWord);
- if (found) {
- return found[1];
- }
- } else if (pMap->m_WordMapType == FXCMAP_CMap::Range) {
- FX_WORD* found = (FX_WORD*)FXSYS_bsearch(&code, pMap->m_pWordMap, pMap->m_WordCount, 6, compareWordRange);
- if (found) {
- return found[2] + code - found[0];
- }
- }
- if (pMap->m_UseOffset == 0) {
- return 0;
- }
- pMap = pMap + pMap->m_UseOffset;
- }
- return 0;
-}
-FX_DWORD FPDFAPI_CharCodeFromCID(const FXCMAP_CMap* pMap, FX_WORD cid)
-{
- while (1) {
- if (pMap->m_WordMapType == FXCMAP_CMap::Single) {
- const FX_WORD *pCur = pMap->m_pWordMap;
- const FX_WORD *pEnd = pMap->m_pWordMap + pMap->m_WordCount * 2;
- while (pCur < pEnd) {
- if (pCur[1] == cid) {
- return pCur[0];
- }
- pCur += 2;
- }
- } else if (pMap->m_WordMapType == FXCMAP_CMap::Range) {
- const FX_WORD *pCur = pMap->m_pWordMap;
- const FX_WORD *pEnd = pMap->m_pWordMap + pMap->m_WordCount * 3;
- while (pCur < pEnd) {
- if (cid >= pCur[2] && cid <= pCur[2] + pCur[1] - pCur[0]) {
- return pCur[0] + cid - pCur[2];
- }
- pCur += 3;
- }
- }
- if (pMap->m_UseOffset == 0) {
- return 0;
- }
- pMap = pMap + pMap->m_UseOffset;
- }
- while (1) {
- if (pMap->m_DWordMapType == FXCMAP_CMap::Range) {
- const FX_WORD *pCur = pMap->m_pDWordMap;
- const FX_WORD *pEnd = pMap->m_pDWordMap + pMap->m_DWordCount * 4;
- while (pCur < pEnd) {
- if (cid >= pCur[3] && cid <= pCur[3] + pCur[2] - pCur[1]) {
- return (((FX_DWORD)pCur[0] << 16) | pCur[1]) + cid - pCur[3];
- }
- pCur += 4;
- }
- } else if (pMap->m_DWordMapType == FXCMAP_CMap::Single) {
- const FX_WORD *pCur = pMap->m_pDWordMap;
- const FX_WORD *pEnd = pMap->m_pDWordMap + pMap->m_DWordCount * 3;
- while (pCur < pEnd) {
- if (pCur[2] == cid) {
- return ((FX_DWORD)pCur[0] << 16) | pCur[1];
- }
- pCur += 3;
- }
- }
- if (pMap->m_UseOffset == 0) {
- return 0;
- }
- pMap = pMap + pMap->m_UseOffset;
- }
- return 0;
-}
-void FPDFAPI_LoadCID2UnicodeMap(int charset, const FX_WORD*& pMap, FX_DWORD& count)
-{
- CPDF_FontGlobals* pFontGlobals = CPDF_ModuleMgr::Get()->GetPageModule()->GetFontGlobals();
- pMap = pFontGlobals->m_EmbeddedToUnicodes[charset].m_pMap;
- count = pFontGlobals->m_EmbeddedToUnicodes[charset].m_Count;
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fpdfapi/fpdf_resource.h"
+#include "../../../include/fpdfapi/fpdf_module.h"
+#include "../fpdf_font/font_int.h"
+#include "cmap_int.h"
+void FPDFAPI_FindEmbeddedCMap(const char* name, int charset, int coding, const FXCMAP_CMap*& pMap)
+{
+ pMap = NULL;
+ CPDF_FontGlobals* pFontGlobals = CPDF_ModuleMgr::Get()->GetPageModule()->GetFontGlobals();
+ const FXCMAP_CMap* pCMaps = pFontGlobals->m_EmbeddedCharsets[charset].m_pMapList;
+ int nCMaps = pFontGlobals->m_EmbeddedCharsets[charset].m_Count;
+ for (int i = 0; i < nCMaps; i ++) {
+ if (FXSYS_strcmp(name, pCMaps[i].m_Name)) {
+ continue;
+ }
+ pMap = &pCMaps[i];
+ break;
+ }
+}
+extern "C" {
+ static int compareWord(const void* p1, const void* p2)
+ {
+ return (*(FX_WORD*)p1) - (*(FX_WORD*)p2);
+ }
+};
+extern "C" {
+ static int compareWordRange(const void* key, const void* element)
+ {
+ if (*(FX_WORD*)key < * (FX_WORD*)element) {
+ return -1;
+ }
+ if (*(FX_WORD*)key > ((FX_WORD*)element)[1]) {
+ return 1;
+ }
+ return 0;
+ }
+};
+extern "C" {
+ static int compareDWordRange(const void* p1, const void* p2)
+ {
+ FX_DWORD key = *(FX_DWORD*)p1;
+ FX_WORD hiword = (FX_WORD)(key >> 16);
+ FX_WORD* element = (FX_WORD*)p2;
+ if (hiword < element[0]) {
+ return -1;
+ }
+ if (hiword > element[0]) {
+ return 1;
+ }
+ FX_WORD loword = (FX_WORD)key;
+ if (loword < element[1]) {
+ return -1;
+ }
+ if (loword > element[2]) {
+ return 1;
+ }
+ return 0;
+ }
+};
+extern "C" {
+ static int compareDWordSingle(const void* p1, const void* p2)
+ {
+ FX_DWORD key = *(FX_DWORD*)p1;
+ FX_DWORD value = ((*(FX_WORD*)p2) << 16) | ((FX_WORD*)p2)[1];
+ if (key < value) {
+ return -1;
+ }
+ if (key > value) {
+ return 1;
+ }
+ return 0;
+ }
+};
+FX_WORD FPDFAPI_CIDFromCharCode(const FXCMAP_CMap* pMap, FX_DWORD charcode)
+{
+ if (charcode >> 16) {
+ while (1) {
+ if (pMap->m_DWordMapType == FXCMAP_CMap::Range) {
+ FX_WORD* found = (FX_WORD*)FXSYS_bsearch(&charcode, pMap->m_pDWordMap, pMap->m_DWordCount, 8, compareDWordRange);
+ if (found) {
+ return found[3] + (FX_WORD)charcode - found[1];
+ }
+ } else if (pMap->m_DWordMapType == FXCMAP_CMap::Single) {
+ FX_WORD* found = (FX_WORD*)FXSYS_bsearch(&charcode, pMap->m_pDWordMap, pMap->m_DWordCount, 6, compareDWordSingle);
+ if (found) {
+ return found[2];
+ }
+ }
+ if (pMap->m_UseOffset == 0) {
+ return 0;
+ }
+ pMap = pMap + pMap->m_UseOffset;
+ }
+ return 0;
+ }
+ FX_WORD code = (FX_WORD)charcode;
+ while (1) {
+ if (pMap->m_pWordMap == NULL) {
+ return 0;
+ }
+ if (pMap->m_WordMapType == FXCMAP_CMap::Single) {
+ FX_WORD* found = (FX_WORD*)FXSYS_bsearch(&code, pMap->m_pWordMap, pMap->m_WordCount, 4, compareWord);
+ if (found) {
+ return found[1];
+ }
+ } else if (pMap->m_WordMapType == FXCMAP_CMap::Range) {
+ FX_WORD* found = (FX_WORD*)FXSYS_bsearch(&code, pMap->m_pWordMap, pMap->m_WordCount, 6, compareWordRange);
+ if (found) {
+ return found[2] + code - found[0];
+ }
+ }
+ if (pMap->m_UseOffset == 0) {
+ return 0;
+ }
+ pMap = pMap + pMap->m_UseOffset;
+ }
+ return 0;
+}
+FX_DWORD FPDFAPI_CharCodeFromCID(const FXCMAP_CMap* pMap, FX_WORD cid)
+{
+ while (1) {
+ if (pMap->m_WordMapType == FXCMAP_CMap::Single) {
+ const FX_WORD *pCur = pMap->m_pWordMap;
+ const FX_WORD *pEnd = pMap->m_pWordMap + pMap->m_WordCount * 2;
+ while (pCur < pEnd) {
+ if (pCur[1] == cid) {
+ return pCur[0];
+ }
+ pCur += 2;
+ }
+ } else if (pMap->m_WordMapType == FXCMAP_CMap::Range) {
+ const FX_WORD *pCur = pMap->m_pWordMap;
+ const FX_WORD *pEnd = pMap->m_pWordMap + pMap->m_WordCount * 3;
+ while (pCur < pEnd) {
+ if (cid >= pCur[2] && cid <= pCur[2] + pCur[1] - pCur[0]) {
+ return pCur[0] + cid - pCur[2];
+ }
+ pCur += 3;
+ }
+ }
+ if (pMap->m_UseOffset == 0) {
+ return 0;
+ }
+ pMap = pMap + pMap->m_UseOffset;
+ }
+ while (1) {
+ if (pMap->m_DWordMapType == FXCMAP_CMap::Range) {
+ const FX_WORD *pCur = pMap->m_pDWordMap;
+ const FX_WORD *pEnd = pMap->m_pDWordMap + pMap->m_DWordCount * 4;
+ while (pCur < pEnd) {
+ if (cid >= pCur[3] && cid <= pCur[3] + pCur[2] - pCur[1]) {
+ return (((FX_DWORD)pCur[0] << 16) | pCur[1]) + cid - pCur[3];
+ }
+ pCur += 4;
+ }
+ } else if (pMap->m_DWordMapType == FXCMAP_CMap::Single) {
+ const FX_WORD *pCur = pMap->m_pDWordMap;
+ const FX_WORD *pEnd = pMap->m_pDWordMap + pMap->m_DWordCount * 3;
+ while (pCur < pEnd) {
+ if (pCur[2] == cid) {
+ return ((FX_DWORD)pCur[0] << 16) | pCur[1];
+ }
+ pCur += 3;
+ }
+ }
+ if (pMap->m_UseOffset == 0) {
+ return 0;
+ }
+ pMap = pMap + pMap->m_UseOffset;
+ }
+ return 0;
+}
+void FPDFAPI_LoadCID2UnicodeMap(int charset, const FX_WORD*& pMap, FX_DWORD& count)
+{
+ CPDF_FontGlobals* pFontGlobals = CPDF_ModuleMgr::Get()->GetPageModule()->GetFontGlobals();
+ pMap = pFontGlobals->m_EmbeddedToUnicodes[charset].m_pMap;
+ count = pFontGlobals->m_EmbeddedToUnicodes[charset].m_Count;
+}
diff --git a/core/src/fpdfapi/fpdf_edit/editint.h b/core/src/fpdfapi/fpdf_edit/editint.h
index bceba1a745..6346f06136 100644
--- a/core/src/fpdfapi/fpdf_edit/editint.h
+++ b/core/src/fpdfapi/fpdf_edit/editint.h
@@ -1,59 +1,59 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef _FPDF_EDITINT_
-#define _FPDF_EDITINT_
-class CPDF_ObjectStream : public CFX_Object
-{
-public:
- CPDF_ObjectStream();
-
- FX_BOOL Start();
-
- FX_INT32 CompressIndirectObject(FX_DWORD dwObjNum, const CPDF_Object *pObj);
- FX_INT32 CompressIndirectObject(FX_DWORD dwObjNum, FX_LPCBYTE pBuffer, FX_DWORD dwSize);
-
- FX_FILESIZE End(CPDF_Creator* pCreator);
-
- CFX_DWordArray m_ObjNumArray;
-
- CFX_ByteTextBuf m_Buffer;
- FX_DWORD m_dwObjNum;
- FX_INT32 m_index;
-protected:
-
- CFX_DWordArray m_OffsetArray;
-};
-class CPDF_XRefStream : public CFX_Object
-{
-public:
-
- CPDF_XRefStream();
-
- FX_BOOL Start();
-
- FX_INT32 CompressIndirectObject(FX_DWORD dwObjNum, const CPDF_Object *pObj, CPDF_Creator *pCreator);
-
- FX_INT32 CompressIndirectObject(FX_DWORD dwObjNum, FX_LPCBYTE pBuffer, FX_DWORD dwSize, CPDF_Creator *pCreator);
-
- FX_BOOL End(CPDF_Creator *pCreator, FX_BOOL bEOF = FALSE);
- FX_BOOL AddObjectNumberToIndexArray(FX_DWORD objnum);
- FX_BOOL EndXRefStream(CPDF_Creator* pCreator);
-
-
- CFX_DWordArray m_IndexArray;
-
- FX_FILESIZE m_PrevOffset;
- FX_DWORD m_dwTempObjNum;
-
-protected:
- FX_INT32 EndObjectStream(CPDF_Creator *pCreator, FX_BOOL bEOF = TRUE);
- FX_BOOL GenerateXRefStream(CPDF_Creator* pCreator, FX_BOOL bEOF);
- FX_INT32 m_iSeg;
- CPDF_ObjectStream m_ObjStream;
- CFX_ByteTextBuf m_Buffer;
-};
-#endif
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FPDF_EDITINT_
+#define _FPDF_EDITINT_
+class CPDF_ObjectStream : public CFX_Object
+{
+public:
+ CPDF_ObjectStream();
+
+ FX_BOOL Start();
+
+ FX_INT32 CompressIndirectObject(FX_DWORD dwObjNum, const CPDF_Object *pObj);
+ FX_INT32 CompressIndirectObject(FX_DWORD dwObjNum, FX_LPCBYTE pBuffer, FX_DWORD dwSize);
+
+ FX_FILESIZE End(CPDF_Creator* pCreator);
+
+ CFX_DWordArray m_ObjNumArray;
+
+ CFX_ByteTextBuf m_Buffer;
+ FX_DWORD m_dwObjNum;
+ FX_INT32 m_index;
+protected:
+
+ CFX_DWordArray m_OffsetArray;
+};
+class CPDF_XRefStream : public CFX_Object
+{
+public:
+
+ CPDF_XRefStream();
+
+ FX_BOOL Start();
+
+ FX_INT32 CompressIndirectObject(FX_DWORD dwObjNum, const CPDF_Object *pObj, CPDF_Creator *pCreator);
+
+ FX_INT32 CompressIndirectObject(FX_DWORD dwObjNum, FX_LPCBYTE pBuffer, FX_DWORD dwSize, CPDF_Creator *pCreator);
+
+ FX_BOOL End(CPDF_Creator *pCreator, FX_BOOL bEOF = FALSE);
+ FX_BOOL AddObjectNumberToIndexArray(FX_DWORD objnum);
+ FX_BOOL EndXRefStream(CPDF_Creator* pCreator);
+
+
+ CFX_DWordArray m_IndexArray;
+
+ FX_FILESIZE m_PrevOffset;
+ FX_DWORD m_dwTempObjNum;
+
+protected:
+ FX_INT32 EndObjectStream(CPDF_Creator *pCreator, FX_BOOL bEOF = TRUE);
+ FX_BOOL GenerateXRefStream(CPDF_Creator* pCreator, FX_BOOL bEOF);
+ FX_INT32 m_iSeg;
+ CPDF_ObjectStream m_ObjStream;
+ CFX_ByteTextBuf m_Buffer;
+};
+#endif
diff --git a/core/src/fpdfapi/fpdf_edit/fpdf_edit_content.cpp b/core/src/fpdfapi/fpdf_edit/fpdf_edit_content.cpp
index 798c77261b..243c23fabf 100644
--- a/core/src/fpdfapi/fpdf_edit/fpdf_edit_content.cpp
+++ b/core/src/fpdfapi/fpdf_edit/fpdf_edit_content.cpp
@@ -1,164 +1,164 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../../include/fpdfapi/fpdf_page.h"
-#include "../../../include/fpdfapi/fpdf_serial.h"
-#include "../../../include/fpdfapi/fpdf_module.h"
-#include "../../../include/fxcodec/fx_codec.h"
-#include "../fpdf_page/pageint.h"
-CFX_ByteTextBuf& operator << (CFX_ByteTextBuf& ar, CFX_AffineMatrix& matrix)
-{
- ar << matrix.a << " " << matrix.b << " " << matrix.c << " " << matrix.d << " " << matrix.e << " " << matrix.f;
- return ar;
-}
-CPDF_PageContentGenerate::CPDF_PageContentGenerate(CPDF_Page* pPage) : m_pPage(pPage)
-{
- m_pDocument = NULL;
- if (m_pPage) {
- m_pDocument = m_pPage->m_pDocument;
- }
-}
-CPDF_PageContentGenerate::~CPDF_PageContentGenerate()
-{
- for (int i = 0; i < m_pageObjects.GetSize(); ++i) {
- CPDF_PageObject* pPageObj = (CPDF_PageObject*)m_pageObjects[i];
- if (pPageObj) {
- pPageObj->Release();
- }
- }
-}
-FX_BOOL CPDF_PageContentGenerate::InsertPageObject(CPDF_PageObject* pPageObject)
-{
- if (!pPageObject) {
- return FALSE;
- }
- return m_pageObjects.Add(pPageObject);
-}
-void CPDF_PageContentGenerate::GenerateContent()
-{
- CFX_ByteTextBuf buf;
- CPDF_Dictionary* pPageDict = m_pPage->m_pFormDict;
- for (int i = 0; i < m_pageObjects.GetSize(); ++i) {
- CPDF_PageObject* pPageObj = (CPDF_PageObject*)m_pageObjects[i];
- if (!pPageObj || pPageObj->m_Type != PDFPAGE_IMAGE) {
- continue;
- }
- ProcessImage(buf, (CPDF_ImageObject*)pPageObj);
- }
- CPDF_Object* pContent = pPageDict->GetElementValue("Contents");
- if (pContent != NULL) {
- pPageDict->RemoveAt("Contents");
- }
- CPDF_Stream* pStream = FX_NEW CPDF_Stream(NULL, 0, NULL);
- pStream->SetData(buf.GetBuffer(), buf.GetLength(), FALSE, FALSE);
- m_pDocument->AddIndirectObject(pStream);
- pPageDict->SetAtReference("Contents", m_pDocument, pStream->GetObjNum());
-}
-CFX_ByteString CPDF_PageContentGenerate::RealizeResource(CPDF_Object* pResourceObj, const FX_CHAR* szType)
-{
- if (m_pPage->m_pResources == NULL) {
- m_pPage->m_pResources = FX_NEW CPDF_Dictionary;
- int objnum = m_pDocument->AddIndirectObject(m_pPage->m_pResources);
- m_pPage->m_pFormDict->SetAtReference("Resources", m_pDocument, objnum);
- }
- CPDF_Dictionary* pResList = m_pPage->m_pResources->GetDict(szType);
- if (pResList == NULL) {
- pResList = FX_NEW CPDF_Dictionary;
- m_pPage->m_pResources->SetAt(szType, pResList);
- }
- m_pDocument->AddIndirectObject(pResourceObj);
- CFX_ByteString name;
- int idnum = 1;
- while (1) {
- name.Format("FX%c%d", szType[0], idnum);
- if (!pResList->KeyExist(name)) {
- break;
- }
- idnum ++;
- }
- pResList->AddReference(name, m_pDocument, pResourceObj->GetObjNum());
- return name;
-}
-void CPDF_PageContentGenerate::ProcessImage(CFX_ByteTextBuf& buf, CPDF_ImageObject* pImageObj)
-{
- if ((pImageObj->m_Matrix.a == 0 && pImageObj->m_Matrix.b == 0) ||
- (pImageObj->m_Matrix.c == 0 && pImageObj->m_Matrix.d == 0)) {
- return;
- }
- buf << "q " << pImageObj->m_Matrix << " cm ";
- if (!pImageObj->m_pImage->IsInline()) {
- CPDF_Stream* pStream = pImageObj->m_pImage->GetStream();
- FX_DWORD dwSavedObjNum = pStream->GetObjNum();
- CFX_ByteString name = RealizeResource(pStream, "XObject");
- if (dwSavedObjNum == 0) {
- pImageObj->m_pImage->Release();
- pImageObj->m_pImage = m_pDocument->GetPageData()->GetImage(pStream);
- }
- buf << "/" << PDF_NameEncode(name) << " Do Q\n";
- }
-}
-void CPDF_PageContentGenerate::ProcessForm(CFX_ByteTextBuf& buf, FX_LPCBYTE data, FX_DWORD size, CFX_Matrix& matrix)
-{
- if (!data || !size) {
- return;
- }
- CPDF_Stream* pStream = FX_NEW CPDF_Stream(NULL, 0, NULL);
- CPDF_Dictionary* pFormDict = CPDF_Dictionary::Create();
- pFormDict->SetAtName(FX_BSTR("Type"), FX_BSTR("XObject"));
- pFormDict->SetAtName(FX_BSTR("Subtype"), FX_BSTR("Form"));
- CFX_FloatRect bbox = m_pPage->GetPageBBox();
- matrix.TransformRect(bbox);
- pFormDict->SetAtRect(FX_BSTR("BBox"), bbox);
- pStream->InitStream((FX_LPBYTE)data, size, pFormDict);
- buf << "q " << matrix << " cm ";
- CFX_ByteString name = RealizeResource(pStream, "XObject");
- buf << "/" << PDF_NameEncode(name) << " Do Q\n";
-}
-void CPDF_PageContentGenerate::TransformContent(CFX_Matrix& matrix)
-{
- CPDF_Object* pContent = m_pPage->m_pFormDict->GetElementValue("Contents");
- if (!pContent) {
- return;
- }
- CFX_ByteTextBuf buf;
- int type = pContent->GetType();
- if (type == PDFOBJ_ARRAY) {
- CPDF_Array* pArray = (CPDF_Array*)pContent;
- int iCount = pArray->GetCount();
- CPDF_StreamAcc** pContentArray = (CPDF_StreamAcc**)FX_Alloc(CPDF_StreamAcc*, iCount);
- int size = 0;
- int i = 0;
- for (i = 0; i < iCount; ++i) {
- pContent = pArray->GetElement(i);
- if (!pContent || pContent->GetType() != PDFOBJ_STREAM) {
- continue;
- }
- CPDF_StreamAcc* pStream = FX_NEW CPDF_StreamAcc();
- pStream->LoadAllData((CPDF_Stream*)pContent);
- pContentArray[i] = pStream;
- size += pContentArray[i]->GetSize() + 1;
- }
- int pos = 0;
- FX_LPBYTE pBuf = FX_Alloc(FX_BYTE, size);
- for (i = 0; i < iCount; ++i) {
- FXSYS_memcpy32(pBuf + pos, pContentArray[i]->GetData(), pContentArray[i]->GetSize());
- pos += pContentArray[i]->GetSize() + 1;
- pBuf[pos - 1] = ' ';
- delete pContentArray[i];
- }
- ProcessForm(buf, pBuf, size, matrix);
- FX_Free(pBuf);
- FX_Free(pContentArray);
- } else if (type == PDFOBJ_STREAM) {
- CPDF_StreamAcc contentStream;
- contentStream.LoadAllData((CPDF_Stream*)pContent);
- ProcessForm(buf, contentStream.GetData(), contentStream.GetSize(), matrix);
- }
- CPDF_Stream* pStream = FX_NEW CPDF_Stream(NULL, 0, NULL);
- pStream->SetData(buf.GetBuffer(), buf.GetLength(), FALSE, FALSE);
- m_pDocument->AddIndirectObject(pStream);
- m_pPage->m_pFormDict->SetAtReference("Contents", m_pDocument, pStream->GetObjNum());
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fpdfapi/fpdf_page.h"
+#include "../../../include/fpdfapi/fpdf_serial.h"
+#include "../../../include/fpdfapi/fpdf_module.h"
+#include "../../../include/fxcodec/fx_codec.h"
+#include "../fpdf_page/pageint.h"
+CFX_ByteTextBuf& operator << (CFX_ByteTextBuf& ar, CFX_AffineMatrix& matrix)
+{
+ ar << matrix.a << " " << matrix.b << " " << matrix.c << " " << matrix.d << " " << matrix.e << " " << matrix.f;
+ return ar;
+}
+CPDF_PageContentGenerate::CPDF_PageContentGenerate(CPDF_Page* pPage) : m_pPage(pPage)
+{
+ m_pDocument = NULL;
+ if (m_pPage) {
+ m_pDocument = m_pPage->m_pDocument;
+ }
+}
+CPDF_PageContentGenerate::~CPDF_PageContentGenerate()
+{
+ for (int i = 0; i < m_pageObjects.GetSize(); ++i) {
+ CPDF_PageObject* pPageObj = (CPDF_PageObject*)m_pageObjects[i];
+ if (pPageObj) {
+ pPageObj->Release();
+ }
+ }
+}
+FX_BOOL CPDF_PageContentGenerate::InsertPageObject(CPDF_PageObject* pPageObject)
+{
+ if (!pPageObject) {
+ return FALSE;
+ }
+ return m_pageObjects.Add(pPageObject);
+}
+void CPDF_PageContentGenerate::GenerateContent()
+{
+ CFX_ByteTextBuf buf;
+ CPDF_Dictionary* pPageDict = m_pPage->m_pFormDict;
+ for (int i = 0; i < m_pageObjects.GetSize(); ++i) {
+ CPDF_PageObject* pPageObj = (CPDF_PageObject*)m_pageObjects[i];
+ if (!pPageObj || pPageObj->m_Type != PDFPAGE_IMAGE) {
+ continue;
+ }
+ ProcessImage(buf, (CPDF_ImageObject*)pPageObj);
+ }
+ CPDF_Object* pContent = pPageDict->GetElementValue("Contents");
+ if (pContent != NULL) {
+ pPageDict->RemoveAt("Contents");
+ }
+ CPDF_Stream* pStream = FX_NEW CPDF_Stream(NULL, 0, NULL);
+ pStream->SetData(buf.GetBuffer(), buf.GetLength(), FALSE, FALSE);
+ m_pDocument->AddIndirectObject(pStream);
+ pPageDict->SetAtReference("Contents", m_pDocument, pStream->GetObjNum());
+}
+CFX_ByteString CPDF_PageContentGenerate::RealizeResource(CPDF_Object* pResourceObj, const FX_CHAR* szType)
+{
+ if (m_pPage->m_pResources == NULL) {
+ m_pPage->m_pResources = FX_NEW CPDF_Dictionary;
+ int objnum = m_pDocument->AddIndirectObject(m_pPage->m_pResources);
+ m_pPage->m_pFormDict->SetAtReference("Resources", m_pDocument, objnum);
+ }
+ CPDF_Dictionary* pResList = m_pPage->m_pResources->GetDict(szType);
+ if (pResList == NULL) {
+ pResList = FX_NEW CPDF_Dictionary;
+ m_pPage->m_pResources->SetAt(szType, pResList);
+ }
+ m_pDocument->AddIndirectObject(pResourceObj);
+ CFX_ByteString name;
+ int idnum = 1;
+ while (1) {
+ name.Format("FX%c%d", szType[0], idnum);
+ if (!pResList->KeyExist(name)) {
+ break;
+ }
+ idnum ++;
+ }
+ pResList->AddReference(name, m_pDocument, pResourceObj->GetObjNum());
+ return name;
+}
+void CPDF_PageContentGenerate::ProcessImage(CFX_ByteTextBuf& buf, CPDF_ImageObject* pImageObj)
+{
+ if ((pImageObj->m_Matrix.a == 0 && pImageObj->m_Matrix.b == 0) ||
+ (pImageObj->m_Matrix.c == 0 && pImageObj->m_Matrix.d == 0)) {
+ return;
+ }
+ buf << "q " << pImageObj->m_Matrix << " cm ";
+ if (!pImageObj->m_pImage->IsInline()) {
+ CPDF_Stream* pStream = pImageObj->m_pImage->GetStream();
+ FX_DWORD dwSavedObjNum = pStream->GetObjNum();
+ CFX_ByteString name = RealizeResource(pStream, "XObject");
+ if (dwSavedObjNum == 0) {
+ pImageObj->m_pImage->Release();
+ pImageObj->m_pImage = m_pDocument->GetPageData()->GetImage(pStream);
+ }
+ buf << "/" << PDF_NameEncode(name) << " Do Q\n";
+ }
+}
+void CPDF_PageContentGenerate::ProcessForm(CFX_ByteTextBuf& buf, FX_LPCBYTE data, FX_DWORD size, CFX_Matrix& matrix)
+{
+ if (!data || !size) {
+ return;
+ }
+ CPDF_Stream* pStream = FX_NEW CPDF_Stream(NULL, 0, NULL);
+ CPDF_Dictionary* pFormDict = CPDF_Dictionary::Create();
+ pFormDict->SetAtName(FX_BSTR("Type"), FX_BSTR("XObject"));
+ pFormDict->SetAtName(FX_BSTR("Subtype"), FX_BSTR("Form"));
+ CFX_FloatRect bbox = m_pPage->GetPageBBox();
+ matrix.TransformRect(bbox);
+ pFormDict->SetAtRect(FX_BSTR("BBox"), bbox);
+ pStream->InitStream((FX_LPBYTE)data, size, pFormDict);
+ buf << "q " << matrix << " cm ";
+ CFX_ByteString name = RealizeResource(pStream, "XObject");
+ buf << "/" << PDF_NameEncode(name) << " Do Q\n";
+}
+void CPDF_PageContentGenerate::TransformContent(CFX_Matrix& matrix)
+{
+ CPDF_Object* pContent = m_pPage->m_pFormDict->GetElementValue("Contents");
+ if (!pContent) {
+ return;
+ }
+ CFX_ByteTextBuf buf;
+ int type = pContent->GetType();
+ if (type == PDFOBJ_ARRAY) {
+ CPDF_Array* pArray = (CPDF_Array*)pContent;
+ int iCount = pArray->GetCount();
+ CPDF_StreamAcc** pContentArray = (CPDF_StreamAcc**)FX_Alloc(CPDF_StreamAcc*, iCount);
+ int size = 0;
+ int i = 0;
+ for (i = 0; i < iCount; ++i) {
+ pContent = pArray->GetElement(i);
+ if (!pContent || pContent->GetType() != PDFOBJ_STREAM) {
+ continue;
+ }
+ CPDF_StreamAcc* pStream = FX_NEW CPDF_StreamAcc();
+ pStream->LoadAllData((CPDF_Stream*)pContent);
+ pContentArray[i] = pStream;
+ size += pContentArray[i]->GetSize() + 1;
+ }
+ int pos = 0;
+ FX_LPBYTE pBuf = FX_Alloc(FX_BYTE, size);
+ for (i = 0; i < iCount; ++i) {
+ FXSYS_memcpy32(pBuf + pos, pContentArray[i]->GetData(), pContentArray[i]->GetSize());
+ pos += pContentArray[i]->GetSize() + 1;
+ pBuf[pos - 1] = ' ';
+ delete pContentArray[i];
+ }
+ ProcessForm(buf, pBuf, size, matrix);
+ FX_Free(pBuf);
+ FX_Free(pContentArray);
+ } else if (type == PDFOBJ_STREAM) {
+ CPDF_StreamAcc contentStream;
+ contentStream.LoadAllData((CPDF_Stream*)pContent);
+ ProcessForm(buf, contentStream.GetData(), contentStream.GetSize(), matrix);
+ }
+ CPDF_Stream* pStream = FX_NEW CPDF_Stream(NULL, 0, NULL);
+ pStream->SetData(buf.GetBuffer(), buf.GetLength(), FALSE, FALSE);
+ m_pDocument->AddIndirectObject(pStream);
+ m_pPage->m_pFormDict->SetAtReference("Contents", m_pDocument, pStream->GetObjNum());
+}
diff --git a/core/src/fpdfapi/fpdf_edit/fpdf_edit_create.cpp b/core/src/fpdfapi/fpdf_edit/fpdf_edit_create.cpp
index 4ec3aa6e5e..e5bb1cf985 100644
--- a/core/src/fpdfapi/fpdf_edit/fpdf_edit_create.cpp
+++ b/core/src/fpdfapi/fpdf_edit/fpdf_edit_create.cpp
@@ -1,2131 +1,2131 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../../include/fpdfapi/fpdf_serial.h"
-#include "editint.h"
-#define PDF_OBJECTSTREAM_MAXLENGTH (256 * 1024)
-#define PDF_XREFSTREAM_MAXSIZE 10000
-extern void FlateEncode(const FX_BYTE* src_buf, FX_DWORD src_data, FX_LPBYTE& dest_buf, FX_DWORD& dest_size);
-extern void FlateEncode(FX_LPCBYTE src_buf, FX_DWORD src_size, int predictor, int Colors, int BitsPerComponent, int Columns,
- FX_LPBYTE& dest_buf, FX_DWORD& dest_size);
-extern FX_BOOL IsSignatureDict(const CPDF_Dictionary* pDict);
-FX_INT32 PDF_CreatorAppendObject(const CPDF_Object* pObj, CFX_FileBufferArchive *pFile, FX_FILESIZE& offset)
-{
- FX_INT32 len = 0;
- if (pObj == NULL) {
- if (pFile->AppendString(FX_BSTRC(" null")) < 0) {
- return -1;
- }
- offset += 5;
- return 1;
- }
- switch (pObj->GetType()) {
- case PDFOBJ_NULL:
- if (pFile->AppendString(FX_BSTRC(" null")) < 0) {
- return -1;
- }
- offset += 5;
- break;
- case PDFOBJ_BOOLEAN:
- case PDFOBJ_NUMBER:
- if (pFile->AppendString(FX_BSTRC(" ")) < 0) {
- return -1;
- }
- if ((len = pFile->AppendString(pObj->GetString())) < 0) {
- return -1;
- }
- offset += len + 1;
- break;
- case PDFOBJ_STRING: {
- CFX_ByteString str = pObj->GetString();
- FX_BOOL bHex = ((CPDF_String*)pObj)->IsHex();
- if ((len = pFile->AppendString(PDF_EncodeString(str, bHex))) < 0) {
- return -1;
- }
- offset += len;
- break;
- }
- case PDFOBJ_NAME: {
- if (pFile->AppendString(FX_BSTRC("/")) < 0) {
- return -1;
- }
- CFX_ByteString str = pObj->GetString();
- if ((len = pFile->AppendString(PDF_NameEncode(str))) < 0) {
- return -1;
- }
- offset += len + 1;
- break;
- }
- case PDFOBJ_REFERENCE: {
- if (pFile->AppendString(FX_BSTRC(" ")) < 0) {
- return -1;
- }
- CPDF_Reference* p = (CPDF_Reference*)pObj;
- if ((len = pFile->AppendDWord(p->GetRefObjNum())) < 0) {
- return -1;
- }
- if (pFile->AppendString(FX_BSTRC(" 0 R ")) < 0) {
- return -1;
- }
- offset += len + 6;
- break;
- }
- case PDFOBJ_ARRAY: {
- if (pFile->AppendString(FX_BSTRC("[")) < 0) {
- return -1;
- }
- offset += 1;
- CPDF_Array* p = (CPDF_Array*)pObj;
- for (FX_DWORD i = 0; i < p->GetCount(); i ++) {
- CPDF_Object* pElement = p->GetElement(i);
- if (pElement->GetObjNum()) {
- if (pFile->AppendString(FX_BSTRC(" ")) < 0) {
- return -1;
- }
- if ((len = pFile->AppendDWord(pElement->GetObjNum())) < 0) {
- return -1;
- }
- if (pFile->AppendString(FX_BSTRC(" 0 R")) < 0) {
- return -1;
- }
- offset += len + 5;
- } else {
- if (PDF_CreatorAppendObject(pElement, pFile, offset) < 0) {
- return -1;
- }
- }
- }
- if (pFile->AppendString(FX_BSTRC("]")) < 0) {
- return -1;
- }
- offset += 1;
- break;
- }
- case PDFOBJ_DICTIONARY: {
- if (pFile->AppendString(FX_BSTRC("<<")) < 0) {
- return -1;
- }
- offset += 2;
- CPDF_Dictionary* p = (CPDF_Dictionary*)pObj;
- FX_POSITION pos = p->GetStartPos();
- while (pos) {
- CFX_ByteString key;
- CPDF_Object* pValue = p->GetNextElement(pos, key);
- if (pFile->AppendString(FX_BSTRC("/")) < 0) {
- return -1;
- }
- if ((len = pFile->AppendString(PDF_NameEncode(key))) < 0) {
- return -1;
- }
- offset += len + 1;
- if (pValue->GetObjNum()) {
- if (pFile->AppendString(FX_BSTRC(" ")) < 0) {
- return -1;
- }
- if ((len = pFile->AppendDWord(pValue->GetObjNum())) < 0) {
- return -1;
- }
- if (pFile->AppendString(FX_BSTRC(" 0 R")) < 0) {
- return -1;
- }
- offset += len + 5;
- } else {
- if (PDF_CreatorAppendObject(pValue, pFile, offset) < 0) {
- return -1;
- }
- }
- }
- if (pFile->AppendString(FX_BSTRC(">>")) < 0) {
- return -1;
- }
- offset += 2;
- break;
- }
- case PDFOBJ_STREAM: {
- CPDF_Stream* p = (CPDF_Stream*)pObj;
- if (PDF_CreatorAppendObject(p->GetDict(), pFile, offset) < 0) {
- return -1;
- }
- if (pFile->AppendString(FX_BSTRC("stream\r\n")) < 0) {
- return -1;
- }
- offset += 8;
- CPDF_StreamAcc acc;
- acc.LoadAllData(p, TRUE);
- if (pFile->AppendBlock(acc.GetData(), acc.GetSize()) < 0) {
- return -1;
- }
- offset += acc.GetSize();
- if ((len = pFile->AppendString(FX_BSTRC("\r\nendstream"))) < 0) {
- return -1;
- }
- offset += len;
- break;
- }
- default:
- ASSERT(FALSE);
- break;
- }
- return 1;
-}
-FX_INT32 PDF_CreatorWriteTrailer(CPDF_Document* pDocument, CFX_FileBufferArchive* pFile, CPDF_Array* pIDArray, FX_BOOL bCompress)
-{
- FX_FILESIZE offset = 0;
- FX_INT32 len = 0;
- FXSYS_assert(pDocument && pFile);
- CPDF_Parser *pParser = (CPDF_Parser*)pDocument->GetParser();
- if (pParser) {
- CPDF_Dictionary* p = pParser->GetTrailer();
- FX_POSITION pos = p->GetStartPos();
- while (pos) {
- CFX_ByteString key;
- CPDF_Object* pValue = p->GetNextElement(pos, key);
- if (key == FX_BSTRC("Encrypt") || key == FX_BSTRC("Size") || key == FX_BSTRC("Filter") ||
- key == FX_BSTRC("Index") || key == FX_BSTRC("Length") || key == FX_BSTRC("Prev") ||
- key == FX_BSTRC("W") || key == FX_BSTRC("XRefStm") || key == FX_BSTRC("Type") || key == FX_BSTRC("ID")) {
- continue;
- }
- if (bCompress && key == FX_BSTRC("DecodeParms")) {
- continue;
- }
- if (pFile->AppendString((FX_BSTRC("/"))) < 0) {
- return -1;
- }
- if ((len = pFile->AppendString(PDF_NameEncode(key))) < 0) {
- return -1;
- }
- offset += len + 1;
- if (pValue->GetObjNum()) {
- if (pFile->AppendString(FX_BSTRC(" ")) < 0) {
- return -1;
- }
- if ((len = pFile->AppendDWord(pValue->GetObjNum())) < 0) {
- return -1;
- }
- if (pFile->AppendString(FX_BSTRC(" 0 R ")) < 0) {
- return -1;
- }
- offset += len + 6;
- } else {
- if (PDF_CreatorAppendObject(pValue, pFile, offset) < 0) {
- return -1;
- }
- }
- }
- if (pIDArray) {
- if (pFile->AppendString((FX_BSTRC("/ID"))) < 0) {
- return -1;
- }
- offset += 3;
- if (PDF_CreatorAppendObject(pIDArray, pFile, offset) < 0) {
- return -1;
- }
- }
- return offset;
- }
- if (pFile->AppendString(FX_BSTRC("\r\n/Root ")) < 0) {
- return -1;
- }
- if ((len = pFile->AppendDWord(pDocument->GetRoot()->GetObjNum())) < 0) {
- return -1;
- }
- if (pFile->AppendString(FX_BSTRC(" 0 R\r\n")) < 0) {
- return -1;
- }
- offset += len + 14;
- if (pDocument->GetInfo()) {
- if (pFile->AppendString(FX_BSTRC("/Info ")) < 0) {
- return -1;
- }
- if ((len = pFile->AppendDWord(pDocument->GetInfo()->GetObjNum())) < 0) {
- return -1;
- }
- if (pFile->AppendString(FX_BSTRC(" 0 R\r\n")) < 0) {
- return -1;
- }
- offset += len + 12;
- }
- if (pIDArray) {
- if (pFile->AppendString((FX_BSTRC("/ID"))) < 0) {
- return -1;
- }
- offset += 3;
- if (PDF_CreatorAppendObject(pIDArray, pFile, offset) < 0) {
- return -1;
- }
- }
- return offset;
-}
-FX_INT32 PDF_CreatorWriteEncrypt(const CPDF_Dictionary* pEncryptDict, FX_DWORD dwObjNum, CFX_FileBufferArchive *pFile)
-{
- if (!pEncryptDict) {
- return 0;
- }
- FXSYS_assert(pFile);
- FX_FILESIZE offset = 0;
- FX_INT32 len = 0;
- if (pFile->AppendString(FX_BSTRC("/Encrypt")) < 0) {
- return -1;
- }
- offset += 8;
- if (pFile->AppendString(FX_BSTRC(" ")) < 0) {
- return -1;
- }
- if ((len = pFile->AppendDWord(dwObjNum)) < 0) {
- return -1;
- }
- if (pFile->AppendString(FX_BSTRC(" 0 R ")) < 0) {
- return -1;
- }
- offset += len + 6;
- return offset;
-}
-FX_BOOL PDF_GenerateFileID(FX_DWORD dwSeed1, FX_DWORD dwSeed2, FX_LPDWORD pBuffer)
-{
- if (!pBuffer) {
- return FALSE;
- }
- FX_LPVOID pContext = FX_Random_MT_Start(dwSeed1);
- FX_INT32 i = 0;
- for (i = 0; i < 2; i++) {
- *pBuffer++ = FX_Random_MT_Generate(pContext);
- }
- FX_Random_MT_Close(pContext);
- pContext = FX_Random_MT_Start(dwSeed2);
- for (i = 0; i < 2; i++) {
- *pBuffer++ = FX_Random_MT_Generate(pContext);
- }
- FX_Random_MT_Close(pContext);
- return TRUE;
-}
-class CPDF_FlateEncoder
-{
-public:
- CPDF_FlateEncoder();
- ~CPDF_FlateEncoder();
- FX_BOOL Initialize(CPDF_Stream* pStream, FX_BOOL bFlateEncode);
- FX_BOOL Initialize(FX_LPCBYTE pBuffer, FX_DWORD size, FX_BOOL bFlateEncode, FX_BOOL bXRefStream = FALSE);
- void CloneDict();
- FX_LPBYTE m_pData;
- FX_DWORD m_dwSize;
- CPDF_Dictionary* m_pDict;
- FX_BOOL m_bCloned;
- FX_BOOL m_bNewData;
- CPDF_StreamAcc m_Acc;
-};
-CPDF_FlateEncoder::CPDF_FlateEncoder()
-{
- m_pData = NULL;
- m_dwSize = 0;
- m_pDict = NULL;
- m_bCloned = FALSE;
- m_bNewData = FALSE;
-}
-void CPDF_FlateEncoder::CloneDict()
-{
- if (!m_bCloned) {
- m_pDict = (CPDF_Dictionary*)m_pDict->Clone();
- m_bCloned = TRUE;
- }
-}
-FX_BOOL CPDF_FlateEncoder::Initialize(CPDF_Stream* pStream, FX_BOOL bFlateEncode)
-{
- m_Acc.LoadAllData(pStream, TRUE);
- if (pStream->GetDict()->KeyExist("Filter") || !bFlateEncode) {
- if (pStream->GetDict()->KeyExist("Filter") && !bFlateEncode) {
- CPDF_StreamAcc destAcc;
- destAcc.LoadAllData(pStream);
- m_dwSize = destAcc.GetSize();
- m_pData = (FX_LPBYTE)destAcc.DetachData();
- m_pDict = (CPDF_Dictionary*)pStream->GetDict()->Clone();
- m_pDict->RemoveAt(FX_BSTRC("Filter"));
- m_bNewData = TRUE;
- m_bCloned = TRUE;
- } else {
- m_pData = (FX_LPBYTE)m_Acc.GetData();
- m_dwSize = m_Acc.GetSize();
- m_pDict = pStream->GetDict();
- }
- return TRUE;
- }
- m_pData = NULL;
- m_dwSize = 0;
- m_bNewData = TRUE;
- m_bCloned = TRUE;
- ::FlateEncode(m_Acc.GetData(), m_Acc.GetSize(), m_pData, m_dwSize);
- m_pDict = (CPDF_Dictionary*)pStream->GetDict()->Clone();
- m_pDict->SetAtInteger("Length", m_dwSize);
- m_pDict->SetAtName("Filter", "FlateDecode");
- m_pDict->RemoveAt("DecodeParms");
- return TRUE;
-}
-FX_BOOL CPDF_FlateEncoder::Initialize(FX_LPCBYTE pBuffer, FX_DWORD size, FX_BOOL bFlateEncode, FX_BOOL bXRefStream)
-{
- if (!bFlateEncode) {
- m_pData = (FX_LPBYTE)pBuffer;
- m_dwSize = size;
- return TRUE;
- }
- m_bNewData = TRUE;
- if (bXRefStream) {
- ::FlateEncode(pBuffer, size, 12, 1, 8, 7, m_pData, m_dwSize);
- } else {
- ::FlateEncode(pBuffer, size, m_pData, m_dwSize);
- }
- return TRUE;
-}
-CPDF_FlateEncoder::~CPDF_FlateEncoder()
-{
- if (m_bCloned && m_pDict) {
- m_pDict->Release();
- }
- if (m_bNewData && m_pData) {
- FX_Free(m_pData);
- }
-}
-class CPDF_Encryptor
-{
-public:
- CPDF_Encryptor();
- ~CPDF_Encryptor();
- FX_BOOL Initialize(CPDF_CryptoHandler* pHandler, int objnum, FX_LPBYTE src_data, FX_DWORD src_size);
- FX_LPBYTE m_pData;
- FX_DWORD m_dwSize;
- FX_BOOL m_bNewBuf;
-};
-CPDF_Encryptor::CPDF_Encryptor()
-{
- m_pData = NULL;
- m_dwSize = 0;
- m_bNewBuf = FALSE;
-}
-FX_BOOL CPDF_Encryptor::Initialize(CPDF_CryptoHandler* pHandler, int objnum, FX_LPBYTE src_data, FX_DWORD src_size)
-{
- if (src_size == 0) {
- return TRUE;
- }
- if (pHandler == NULL) {
- m_pData = (FX_LPBYTE)src_data;
- m_dwSize = src_size;
- m_bNewBuf = FALSE;
- return TRUE;
- }
- m_dwSize = pHandler->EncryptGetSize(objnum, 0, src_data, src_size);
- m_pData = FX_Alloc(FX_BYTE, m_dwSize);
- if(!m_pData) {
- return FALSE;
- }
- pHandler->EncryptContent(objnum, 0, src_data, src_size, m_pData, m_dwSize);
- m_bNewBuf = TRUE;
- return TRUE;
-}
-CPDF_Encryptor::~CPDF_Encryptor()
-{
- if (m_bNewBuf) {
- FX_Free(m_pData);
- }
-}
-CPDF_ObjectStream::CPDF_ObjectStream()
- : m_dwObjNum(0)
- , m_index(0)
-{
-}
-FX_BOOL CPDF_ObjectStream::Start()
-{
- m_ObjNumArray.RemoveAll();
- m_OffsetArray.RemoveAll();
- m_Buffer.Clear();
- m_dwObjNum = 0;
- m_index = 0;
- return TRUE;
-}
-FX_INT32 CPDF_ObjectStream::CompressIndirectObject(FX_DWORD dwObjNum, const CPDF_Object *pObj)
-{
- m_ObjNumArray.Add(dwObjNum);
- m_OffsetArray.Add(m_Buffer.GetLength());
- m_Buffer << pObj;
- return 1;
-}
-FX_INT32 CPDF_ObjectStream::CompressIndirectObject(FX_DWORD dwObjNum, FX_LPCBYTE pBuffer, FX_DWORD dwSize)
-{
- m_ObjNumArray.Add(dwObjNum);
- m_OffsetArray.Add(m_Buffer.GetLength());
- m_Buffer.AppendBlock(pBuffer, dwSize);
- return 1;
-}
-FX_FILESIZE CPDF_ObjectStream::End(CPDF_Creator* pCreator)
-{
- FXSYS_assert(pCreator);
- if (m_ObjNumArray.GetSize() == 0) {
- return 0;
- }
- CFX_FileBufferArchive *pFile = &pCreator->m_File;
- CPDF_CryptoHandler *pHandler = pCreator->m_pCryptoHandler;
- FX_FILESIZE ObjOffset = pCreator->m_Offset;
- if (!m_dwObjNum) {
- m_dwObjNum = ++pCreator->m_dwLastObjNum;
- }
- CFX_ByteTextBuf tempBuffer;
- FX_INT32 iCount = m_ObjNumArray.GetSize();
- for (FX_INT32 i = 0; i < iCount; i++) {
- tempBuffer << m_ObjNumArray.ElementAt(i) << FX_BSTRC(" ") << m_OffsetArray.ElementAt(i) << FX_BSTRC(" ");
- }
- FX_FILESIZE &offset = pCreator->m_Offset;
- FX_INT32 len = pFile->AppendDWord(m_dwObjNum);
- if (len < 0) {
- return -1;
- }
- offset += len;
- if ((len = pFile->AppendString(FX_BSTRC(" 0 obj\r\n<</Type /ObjStm /N "))) < 0) {
- return -1;
- }
- offset += len;
- if ((len = pFile->AppendDWord((FX_DWORD)iCount)) < 0) {
- return -1;
- }
- offset += len;
- if (pFile->AppendString(FX_BSTRC("/First ")) < 0) {
- return -1;
- }
- if ((len = pFile->AppendDWord((FX_DWORD)tempBuffer.GetLength())) < 0) {
- return -1;
- }
- if (pFile->AppendString(FX_BSTRC("/Length ")) < 0) {
- return -1;
- }
- offset += len + 15;
- if (!pCreator->m_bCompress && !pHandler) {
- if ((len = pFile->AppendDWord((FX_DWORD)(tempBuffer.GetLength() + m_Buffer.GetLength()))) < 0) {
- return -1;
- }
- offset += len;
- if ((len = pFile->AppendString(FX_BSTRC(">>stream\r\n"))) < 0) {
- return -1;
- }
- if (pFile->AppendBlock(tempBuffer.GetBuffer(), tempBuffer.GetLength()) < 0) {
- return -1;
- }
- if (pFile->AppendBlock(m_Buffer.GetBuffer(), m_Buffer.GetLength()) < 0) {
- return -1;
- }
- offset += len + tempBuffer.GetLength() + m_Buffer.GetLength();
- } else {
- tempBuffer << m_Buffer;
- CPDF_FlateEncoder encoder;
- encoder.Initialize(tempBuffer.GetBuffer(), tempBuffer.GetLength(), pCreator->m_bCompress);
- CPDF_Encryptor encryptor;
- encryptor.Initialize(pHandler, m_dwObjNum, encoder.m_pData, encoder.m_dwSize);
- if ((len = pFile->AppendDWord(encryptor.m_dwSize)) < 0) {
- return -1;
- }
- offset += len;
- if (pCreator->m_bCompress) {
- if (pFile->AppendString(FX_BSTRC("/Filter /FlateDecode")) < 0) {
- return -1;
- }
- offset += 20;
- }
- if ((len = pFile->AppendString(FX_BSTRC(">>stream\r\n"))) < 0) {
- return -1;
- }
- if (pFile->AppendBlock(encryptor.m_pData, encryptor.m_dwSize) < 0) {
- return -1;
- }
- offset += len + encryptor.m_dwSize;
- }
- if ((len = pFile->AppendString(FX_BSTRC("\r\nendstream\r\nendobj\r\n"))) < 0) {
- return -1;
- }
- offset += len;
- return ObjOffset;
-}
-CPDF_XRefStream::CPDF_XRefStream()
- : m_PrevOffset(0)
- , m_iSeg(0)
- , m_dwTempObjNum(0)
-{
-}
-FX_BOOL CPDF_XRefStream::Start()
-{
- m_IndexArray.RemoveAll();
- m_Buffer.Clear();
- m_iSeg = 0;
- return TRUE;
-}
-FX_INT32 CPDF_XRefStream::CompressIndirectObject(FX_DWORD dwObjNum, const CPDF_Object *pObj, CPDF_Creator *pCreator)
-{
- if (!pCreator) {
- return 0;
- }
- m_ObjStream.CompressIndirectObject(dwObjNum, pObj);
- if (m_ObjStream.m_ObjNumArray.GetSize() < pCreator->m_ObjectStreamSize &&
- m_ObjStream.m_Buffer.GetLength() < PDF_OBJECTSTREAM_MAXLENGTH) {
- return 1;
- }
- return EndObjectStream(pCreator);
-}
-FX_INT32 CPDF_XRefStream::CompressIndirectObject(FX_DWORD dwObjNum, FX_LPCBYTE pBuffer, FX_DWORD dwSize, CPDF_Creator *pCreator)
-{
- if (!pCreator) {
- return 0;
- }
- m_ObjStream.CompressIndirectObject(dwObjNum, pBuffer, dwSize);
- if (m_ObjStream.m_ObjNumArray.GetSize() < pCreator->m_ObjectStreamSize &&
- m_ObjStream.m_Buffer.GetLength() < PDF_OBJECTSTREAM_MAXLENGTH) {
- return 1;
- }
- return EndObjectStream(pCreator);
-}
-static void _AppendIndex0(CFX_ByteTextBuf& buffer, FX_BOOL bFirstObject = TRUE)
-{
- buffer.AppendByte(0);
- buffer.AppendByte(0);
- buffer.AppendByte(0);
- buffer.AppendByte(0);
- buffer.AppendByte(0);
- if (bFirstObject) {
- buffer.AppendByte(0xFF);
- buffer.AppendByte(0xFF);
- } else {
- buffer.AppendByte(0);
- buffer.AppendByte(0);
- }
-}
-static void _AppendIndex1(CFX_ByteTextBuf& buffer, FX_FILESIZE offset)
-{
- buffer.AppendByte(1);
- buffer.AppendByte(FX_GETBYTEOFFSET24(offset));
- buffer.AppendByte(FX_GETBYTEOFFSET16(offset));
- buffer.AppendByte(FX_GETBYTEOFFSET8(offset));
- buffer.AppendByte(FX_GETBYTEOFFSET0(offset));
- buffer.AppendByte(0);
- buffer.AppendByte(0);
-}
-static void _AppendIndex2(CFX_ByteTextBuf& buffer, FX_DWORD objnum, FX_INT32 index)
-{
- buffer.AppendByte(2);
- buffer.AppendByte(FX_GETBYTEOFFSET24(objnum));
- buffer.AppendByte(FX_GETBYTEOFFSET16(objnum));
- buffer.AppendByte(FX_GETBYTEOFFSET8(objnum));
- buffer.AppendByte(FX_GETBYTEOFFSET0(objnum));
- buffer.AppendByte(FX_GETBYTEOFFSET8(index));
- buffer.AppendByte(FX_GETBYTEOFFSET0(index));
-}
-FX_INT32 CPDF_XRefStream::EndObjectStream(CPDF_Creator *pCreator, FX_BOOL bEOF)
-{
- FX_FILESIZE objOffset = 0;
- if (bEOF) {
- objOffset = m_ObjStream.End(pCreator);
- if (objOffset < 0) {
- return -1;
- }
- }
- FX_DWORD &dwObjStmNum = m_ObjStream.m_dwObjNum;
- if (!dwObjStmNum) {
- dwObjStmNum = ++pCreator->m_dwLastObjNum;
- }
- FX_INT32 iSize = m_ObjStream.m_ObjNumArray.GetSize();
- FX_INT32 iSeg = m_IndexArray.GetSize() / 2;
- if (!(pCreator->m_dwFlags & FPDFCREATE_INCREMENTAL)) {
- if (m_dwTempObjNum == 0) {
- _AppendIndex0(m_Buffer);
- m_dwTempObjNum++;
- }
- FX_DWORD end_num = m_IndexArray.GetAt((iSeg - 1) * 2) + m_IndexArray.GetAt((iSeg - 1) * 2 + 1);
- int index = 0;
- for (; m_dwTempObjNum < end_num; m_dwTempObjNum++) {
- FX_FILESIZE* offset = pCreator->m_ObjectOffset.GetPtrAt(m_dwTempObjNum);
- if (offset) {
- if (index >= iSize || m_dwTempObjNum != m_ObjStream.m_ObjNumArray[index]) {
- _AppendIndex1(m_Buffer, *offset);
- } else {
- _AppendIndex2(m_Buffer, dwObjStmNum, index++);
- }
- } else {
- _AppendIndex0(m_Buffer, FALSE);
- }
- }
- if (iSize > 0 && bEOF) {
- pCreator->m_ObjectOffset.Add(dwObjStmNum, 1);
- pCreator->m_ObjectSize.Add(dwObjStmNum, 1);
- pCreator->m_ObjectOffset[dwObjStmNum] = objOffset;
- }
- m_iSeg = iSeg;
- if (bEOF) {
- m_ObjStream.Start();
- }
- return 1;
- }
- FX_INT32 &j = m_ObjStream.m_index;
- for (int i = m_iSeg; i < iSeg; i++) {
- FX_DWORD start = m_IndexArray.ElementAt(i * 2);
- FX_DWORD end = m_IndexArray.ElementAt(i * 2 + 1) + start;
- for (FX_DWORD m = start; m < end; m++) {
- if (j >= iSize || m != m_ObjStream.m_ObjNumArray.ElementAt(j)) {
- _AppendIndex1(m_Buffer, pCreator->m_ObjectOffset[m]);
- } else {
- _AppendIndex2(m_Buffer, dwObjStmNum, j++);
- }
- }
- }
- if (iSize > 0 && bEOF) {
- _AppendIndex1(m_Buffer, objOffset);
- m_IndexArray.Add(dwObjStmNum);
- m_IndexArray.Add(1);
- iSeg += 1;
- }
- m_iSeg = iSeg;
- if (bEOF) {
- m_ObjStream.Start();
- }
- return 1;
-}
-FX_BOOL CPDF_XRefStream::GenerateXRefStream(CPDF_Creator* pCreator, FX_BOOL bEOF)
-{
- FX_FILESIZE offset_tmp = pCreator->m_Offset;
- FX_DWORD objnum = ++pCreator->m_dwLastObjNum;
- CFX_FileBufferArchive *pFile = &pCreator->m_File;
- FX_BOOL bIncremental = (pCreator->m_dwFlags & FPDFCREATE_INCREMENTAL) != 0;
- if (bIncremental) {
- AddObjectNumberToIndexArray(objnum);
- } else {
- for (; m_dwTempObjNum < pCreator->m_dwLastObjNum; m_dwTempObjNum++) {
- FX_FILESIZE* offset = pCreator->m_ObjectOffset.GetPtrAt(m_dwTempObjNum);
- if (offset) {
- _AppendIndex1(m_Buffer, *offset);
- } else {
- _AppendIndex0(m_Buffer, FALSE);
- }
- }
- }
- _AppendIndex1(m_Buffer, offset_tmp);
- FX_FILESIZE &offset = pCreator->m_Offset;
- FX_INT32 len = pFile->AppendDWord(objnum);
- if (len < 0) {
- return FALSE;
- }
- offset += len;
- if ((len = pFile->AppendString(FX_BSTRC(" 0 obj\r\n<</Type /XRef/W[1 4 2]/Index["))) < 0) {
- return FALSE;
- }
- offset += len;
- if (!bIncremental) {
- if ((len = pFile->AppendDWord(0)) < 0) {
- return FALSE;
- }
- if ((len = pFile->AppendString(FX_BSTRC(" "))) < 0) {
- return FALSE;
- }
- offset += len + 1;
- if ((len = pFile->AppendDWord(objnum + 1)) < 0) {
- return FALSE;
- }
- offset += len;
- } else {
- FX_INT32 iSeg = m_IndexArray.GetSize() / 2;
- for (FX_INT32 i = 0; i < iSeg; i++) {
- if ((len = pFile->AppendDWord(m_IndexArray.ElementAt(i * 2))) < 0) {
- return FALSE;
- }
- if (pFile->AppendString(FX_BSTRC(" ")) < 0) {
- return FALSE;
- }
- offset += len + 1;
- if ((len = pFile->AppendDWord(m_IndexArray.ElementAt(i * 2 + 1))) < 0) {
- return FALSE;
- }
- if (pFile->AppendString(FX_BSTRC(" ")) < 0) {
- return FALSE;
- }
- offset += len + 1;
- }
- }
- if (pFile->AppendString(FX_BSTRC("]/Size ")) < 0) {
- return FALSE;
- }
- if ((len = pFile->AppendDWord(objnum + 1)) < 0) {
- return FALSE;
- }
- offset += len + 7;
- if (m_PrevOffset > 0) {
- if (pFile->AppendString(FX_BSTRC("/Prev ")) < 0) {
- return -1;
- }
- FX_CHAR offset_buf[20];
- FXSYS_memset32(offset_buf, 0, sizeof(offset_buf));
- FXSYS_i64toa(m_PrevOffset, offset_buf, 10);
- FX_INT32 len = (FX_INT32)FXSYS_strlen(offset_buf);
- if (pFile->AppendBlock(offset_buf, len) < 0) {
- return -1;
- }
- offset += len + 6;
- }
- FX_BOOL bPredictor = TRUE;
- CPDF_FlateEncoder encoder;
- encoder.Initialize(m_Buffer.GetBuffer(), m_Buffer.GetLength(), pCreator->m_bCompress, bPredictor);
- if (pCreator->m_bCompress) {
- if (pFile->AppendString(FX_BSTRC("/Filter /FlateDecode")) < 0) {
- return FALSE;
- }
- offset += 20;
- if (bPredictor) {
- if ((len = pFile->AppendString(FX_BSTRC("/DecodeParms<</Columns 7/Predictor 12>>"))) < 0) {
- return FALSE;
- }
- offset += len;
- }
- }
- if (pFile->AppendString(FX_BSTRC("/Length ")) < 0) {
- return FALSE;
- }
- if ((len = pFile->AppendDWord(encoder.m_dwSize)) < 0) {
- return FALSE;
- }
- offset += len + 8;
- if (bEOF) {
- if ((len = PDF_CreatorWriteTrailer(pCreator->m_pDocument, pFile, pCreator->m_pIDArray, pCreator->m_bCompress)) < 0) {
- return -1;
- }
- offset += len;
- if (pCreator->m_pEncryptDict) {
- FX_DWORD dwEncryptObjNum = pCreator->m_pEncryptDict->GetObjNum();
- if (dwEncryptObjNum == 0) {
- dwEncryptObjNum = pCreator->m_dwEnryptObjNum;
- }
- if ((len = PDF_CreatorWriteEncrypt(pCreator->m_pEncryptDict, dwEncryptObjNum, pFile)) < 0) {
- return -1;
- }
- offset += len;
- }
- }
- if ((len = pFile->AppendString(FX_BSTRC(">>stream\r\n"))) < 0) {
- return FALSE;
- }
- offset += len;
- if (pFile->AppendBlock(encoder.m_pData, encoder.m_dwSize) < 0) {
- return FALSE;
- }
- if ((len = pFile->AppendString(FX_BSTRC("\r\nendstream\r\nendobj\r\n"))) < 0) {
- return FALSE;
- }
- offset += encoder.m_dwSize + len;
- m_PrevOffset = offset_tmp;
- return TRUE;
-}
-FX_BOOL CPDF_XRefStream::End(CPDF_Creator *pCreator, FX_BOOL bEOF )
-{
- if (EndObjectStream(pCreator, bEOF) < 0) {
- return FALSE;
- }
- return GenerateXRefStream(pCreator, bEOF);
-}
-FX_BOOL CPDF_XRefStream::EndXRefStream(CPDF_Creator* pCreator)
-{
- if (!(pCreator->m_dwFlags & FPDFCREATE_INCREMENTAL)) {
- _AppendIndex0(m_Buffer);
- for (FX_DWORD i = 1; i < pCreator->m_dwLastObjNum + 1; i++) {
- FX_FILESIZE* offset = pCreator->m_ObjectOffset.GetPtrAt(i);
- if (offset) {
- _AppendIndex1(m_Buffer, *offset);
- } else {
- _AppendIndex0(m_Buffer, FALSE);
- }
- }
- } else {
- FX_INT32 iSeg = m_IndexArray.GetSize() / 2;
- for (int i = 0; i < iSeg; i++) {
- FX_DWORD start = m_IndexArray.ElementAt(i * 2);
- FX_DWORD end = m_IndexArray.ElementAt(i * 2 + 1) + start;
- for (FX_DWORD j = start; j < end; j++) {
- _AppendIndex1(m_Buffer, pCreator->m_ObjectOffset[j]);
- }
- }
- }
- return GenerateXRefStream(pCreator, FALSE);
-}
-FX_BOOL CPDF_XRefStream::AddObjectNumberToIndexArray(FX_DWORD objnum)
-{
- FX_INT32 iSize = m_IndexArray.GetSize();
- if (iSize == 0) {
- m_IndexArray.Add(objnum);
- m_IndexArray.Add(1);
- } else {
- FXSYS_assert(iSize > 1);
- FX_DWORD startobjnum = m_IndexArray.ElementAt(iSize - 2);
- FX_INT32 iCount = m_IndexArray.ElementAt(iSize - 1);
- if (objnum == startobjnum + iCount) {
- m_IndexArray[iSize - 1] = iCount + 1;
- } else {
- m_IndexArray.Add(objnum);
- m_IndexArray.Add(1);
- }
- }
- return TRUE;
-}
-CPDF_Creator::CPDF_Creator(CPDF_Document* pDoc)
-{
- m_pDocument = pDoc;
- m_pParser = (CPDF_Parser*)pDoc->m_pParser;
- m_bCompress = TRUE;
- if (m_pParser) {
- m_pEncryptDict = m_pParser->GetEncryptDict();
- m_pCryptoHandler = m_pParser->GetCryptoHandler();
- } else {
- m_pEncryptDict = NULL;
- m_pCryptoHandler = NULL;
- }
- m_bSecurityChanged = FALSE;
- m_bStandardSecurity = FALSE;
- m_pMetadata = NULL;
- m_bEncryptCloned = FALSE;
- m_bEncryptMetadata = FALSE;
- m_Offset = 0;
- m_iStage = -1;
- m_dwFlags = 0;
- m_Pos = NULL;
- m_XrefStart = 0;
- m_pXRefStream = NULL;
- m_ObjectStreamSize = 200;
- m_dwLastObjNum = m_pDocument->GetLastObjNum();
- m_pIDArray = NULL;
- m_FileVersion = 0;
- m_dwEnryptObjNum = 0;
- m_bNewCrypto = FALSE;
-}
-CPDF_Creator::~CPDF_Creator()
-{
- ResetStandardSecurity();
- if (m_bEncryptCloned && m_pEncryptDict) {
- m_pEncryptDict->Release();
- m_pEncryptDict = NULL;
- }
- Clear();
-}
-static FX_BOOL _IsXRefNeedEnd(CPDF_XRefStream* pXRef, FX_DWORD flag)
-{
- if (!(flag & FPDFCREATE_INCREMENTAL)) {
- return FALSE;
- }
- FX_INT32 iSize = pXRef->m_IndexArray.GetSize() / 2;
- FX_INT32 iCount = 0;
- for (FX_INT32 i = 0; i < iSize; i++) {
- iCount += pXRef->m_IndexArray.ElementAt(i * 2 + 1);
- }
- return (iCount >= PDF_XREFSTREAM_MAXSIZE);
-}
-FX_INT32 CPDF_Creator::WriteIndirectObjectToStream(const CPDF_Object* pObj)
-{
- if (!m_pXRefStream) {
- return 1;
- }
- FX_DWORD objnum = pObj->GetObjNum();
- if (m_pParser && m_pParser->m_ObjVersion.GetSize() > (FX_INT32)objnum && m_pParser->m_ObjVersion[objnum] > 0) {
- return 1;
- }
- if (pObj->GetType() == PDFOBJ_NUMBER) {
- return 1;
- }
- CPDF_Dictionary *pDict = pObj->GetDict();
- if (pObj->GetType() == PDFOBJ_STREAM) {
- if (pDict && pDict->GetString(FX_BSTRC("Type")) == FX_BSTRC("XRef")) {
- return 0;
- }
- return 1;
- }
- if (pDict) {
- if (pDict == m_pDocument->m_pRootDict || pDict == m_pEncryptDict) {
- return 1;
- }
- if (IsSignatureDict(pDict)) {
- return 1;
- }
- if (pDict->GetString(FX_BSTRC("Type")) == FX_BSTRC("Page")) {
- return 1;
- }
- }
- m_pXRefStream->AddObjectNumberToIndexArray(objnum);
- if (m_pXRefStream->CompressIndirectObject(objnum, pObj, this) < 0) {
- return -1;
- }
- if (!_IsXRefNeedEnd(m_pXRefStream, m_dwFlags)) {
- return 0;
- }
- if (!m_pXRefStream->End(this)) {
- return -1;
- }
- if (!m_pXRefStream->Start()) {
- return -1;
- }
- return 0;
-}
-FX_INT32 CPDF_Creator::WriteIndirectObjectToStream(FX_DWORD objnum, FX_LPCBYTE pBuffer, FX_DWORD dwSize)
-{
- if (!m_pXRefStream) {
- return 1;
- }
- m_pXRefStream->AddObjectNumberToIndexArray(objnum);
- FX_INT32 iRet = m_pXRefStream->CompressIndirectObject(objnum, pBuffer, dwSize, this);
- if (iRet < 1) {
- return iRet;
- }
- if (!_IsXRefNeedEnd(m_pXRefStream, m_dwFlags)) {
- return 0;
- }
- if (!m_pXRefStream->End(this)) {
- return -1;
- }
- if (!m_pXRefStream->Start()) {
- return -1;
- }
- return 0;
-}
-FX_INT32 CPDF_Creator::AppendObjectNumberToXRef(FX_DWORD objnum)
-{
- if (!m_pXRefStream) {
- return 1;
- }
- m_pXRefStream->AddObjectNumberToIndexArray(objnum);
- if (!_IsXRefNeedEnd(m_pXRefStream, m_dwFlags)) {
- return 0;
- }
- if (!m_pXRefStream->End(this)) {
- return -1;
- }
- if (!m_pXRefStream->Start()) {
- return -1;
- }
- return 0;
-}
-FX_INT32 CPDF_Creator::WriteStream(const CPDF_Object* pStream, FX_DWORD objnum, CPDF_CryptoHandler* pCrypto)
-{
- CPDF_FlateEncoder encoder;
- encoder.Initialize((CPDF_Stream*)pStream, pStream == m_pMetadata ? FALSE : m_bCompress);
- CPDF_Encryptor encryptor;
- if(!encryptor.Initialize(pCrypto, objnum, encoder.m_pData, encoder.m_dwSize)) {
- return -1;
- }
- if ((FX_DWORD)encoder.m_pDict->GetInteger(FX_BSTRC("Length")) != encryptor.m_dwSize) {
- encoder.CloneDict();
- encoder.m_pDict->SetAtInteger(FX_BSTRC("Length"), encryptor.m_dwSize);
- }
- if (WriteDirectObj(objnum, encoder.m_pDict) < 0) {
- return -1;
- }
- int len = m_File.AppendString(FX_BSTRC("stream\r\n"));
- if (len < 0) {
- return -1;
- }
- m_Offset += len;
- if (m_File.AppendBlock(encryptor.m_pData, encryptor.m_dwSize) < 0) {
- return -1;
- }
- m_Offset += encryptor.m_dwSize;
- if ((len = m_File.AppendString(FX_BSTRC("\r\nendstream"))) < 0) {
- return -1;
- }
- m_Offset += len;
- return 1;
-}
-FX_INT32 CPDF_Creator::WriteIndirectObj(FX_DWORD objnum, const CPDF_Object* pObj)
-{
- FX_INT32 len = m_File.AppendDWord(objnum);
- if (len < 0) {
- return -1;
- }
- m_Offset += len;
- if ((len = m_File.AppendString(FX_BSTRC(" 0 obj\r\n"))) < 0) {
- return -1;
- }
- m_Offset += len;
- if (pObj->GetType() == PDFOBJ_STREAM) {
- CPDF_CryptoHandler *pHandler = NULL;
- pHandler = (pObj == m_pMetadata && !m_bEncryptMetadata) ? NULL : m_pCryptoHandler;
- if (WriteStream(pObj, objnum, pHandler) < 0) {
- return -1;
- }
- } else {
- if (WriteDirectObj(objnum, pObj) < 0) {
- return -1;
- }
- }
- if ((len = m_File.AppendString(FX_BSTRC("\r\nendobj\r\n"))) < 0) {
- return -1;
- }
- m_Offset += len;
- if (AppendObjectNumberToXRef(objnum) < 0) {
- return -1;
- }
- return 0;
-}
-FX_INT32 CPDF_Creator::WriteIndirectObj(const CPDF_Object* pObj)
-{
- FX_INT32 iRet = WriteIndirectObjectToStream(pObj);
- if (iRet < 1) {
- return iRet;
- }
- return WriteIndirectObj(pObj->GetObjNum(), pObj);
-}
-FX_INT32 CPDF_Creator::WriteDirectObj(FX_DWORD objnum, const CPDF_Object* pObj, FX_BOOL bEncrypt)
-{
- FX_INT32 len = 0;
- if (pObj == NULL) {
- if (m_File.AppendString(FX_BSTRC(" null")) < 0) {
- return -1;
- }
- m_Offset += 5;
- return 1;
- }
- switch (pObj->GetType()) {
- case PDFOBJ_NULL:
- if (m_File.AppendString(FX_BSTRC(" null")) < 0) {
- return -1;
- }
- m_Offset += 5;
- break;
- case PDFOBJ_BOOLEAN:
- case PDFOBJ_NUMBER:
- if (m_File.AppendString(FX_BSTRC(" ")) < 0) {
- return -1;
- }
- if ((len = m_File.AppendString(pObj->GetString())) < 0) {
- return -1;
- }
- m_Offset += len + 1;
- break;
- case PDFOBJ_STRING: {
- CFX_ByteString str = pObj->GetString();
- FX_BOOL bHex = ((CPDF_String*)pObj)->IsHex();
- if (m_pCryptoHandler == NULL || !bEncrypt) {
- CFX_ByteString content = PDF_EncodeString(str, bHex);
- if ((len = m_File.AppendString(content)) < 0) {
- return -1;
- }
- m_Offset += len;
- break;
- }
- CPDF_Encryptor encryptor;
- encryptor.Initialize(m_pCryptoHandler, objnum, (FX_LPBYTE)(FX_LPCSTR)str, str.GetLength());
- CFX_ByteString content = PDF_EncodeString(CFX_ByteString((FX_LPCSTR)encryptor.m_pData, encryptor.m_dwSize), bHex);
- if ((len = m_File.AppendString(content)) < 0) {
- return -1;
- }
- m_Offset += len;
- break;
- }
- case PDFOBJ_STREAM: {
- CPDF_FlateEncoder encoder;
- encoder.Initialize((CPDF_Stream*)pObj, m_bCompress);
- CPDF_Encryptor encryptor;
- CPDF_CryptoHandler* pHandler = m_pCryptoHandler;
- encryptor.Initialize(pHandler, objnum, encoder.m_pData, encoder.m_dwSize);
- if ((FX_DWORD)encoder.m_pDict->GetInteger(FX_BSTRC("Length")) != encryptor.m_dwSize) {
- encoder.CloneDict();
- encoder.m_pDict->SetAtInteger(FX_BSTRC("Length"), encryptor.m_dwSize);
- }
- if (WriteDirectObj(objnum, encoder.m_pDict) < 0) {
- return -1;
- }
- if ((len = m_File.AppendString(FX_BSTRC("stream\r\n"))) < 0) {
- return -1;
- }
- m_Offset += len;
- if (m_File.AppendBlock(encryptor.m_pData, encryptor.m_dwSize) < 0) {
- return -1;
- }
- m_Offset += encryptor.m_dwSize;
- if ((len = m_File.AppendString(FX_BSTRC("\r\nendstream"))) < 0) {
- return -1;
- }
- m_Offset += len;
- break;
- }
- case PDFOBJ_NAME: {
- if (m_File.AppendString(FX_BSTRC("/")) < 0) {
- return -1;
- }
- CFX_ByteString str = pObj->GetString();
- if ((len = m_File.AppendString(PDF_NameEncode(str))) < 0) {
- return -1;
- }
- m_Offset += len + 1;
- break;
- }
- case PDFOBJ_REFERENCE: {
- if (m_File.AppendString(FX_BSTRC(" ")) < 0) {
- return -1;
- }
- CPDF_Reference* p = (CPDF_Reference*)pObj;
- if ((len = m_File.AppendDWord(p->GetRefObjNum())) < 0) {
- return -1;
- }
- if (m_File.AppendString(FX_BSTRC(" 0 R")) < 0) {
- return -1;
- }
- m_Offset += len + 5;
- break;
- }
- case PDFOBJ_ARRAY: {
- if (m_File.AppendString(FX_BSTRC("[")) < 0) {
- return -1;
- }
- m_Offset += 1;
- CPDF_Array* p = (CPDF_Array*)pObj;
- for (FX_DWORD i = 0; i < p->GetCount(); i ++) {
- CPDF_Object* pElement = p->GetElement(i);
- if (pElement->GetObjNum()) {
- if (m_File.AppendString(FX_BSTRC(" ")) < 0) {
- return -1;
- }
- if ((len = m_File.AppendDWord(pElement->GetObjNum())) < 0) {
- return -1;
- }
- if (m_File.AppendString(FX_BSTRC(" 0 R")) < 0) {
- return -1;
- }
- m_Offset += len + 5;
- } else {
- if (WriteDirectObj(objnum, pElement) < 0) {
- return -1;
- }
- }
- }
- if (m_File.AppendString(FX_BSTRC("]")) < 0) {
- return -1;
- }
- m_Offset += 1;
- break;
- }
- case PDFOBJ_DICTIONARY: {
- if (m_pCryptoHandler == NULL || pObj == m_pEncryptDict) {
- return PDF_CreatorAppendObject(pObj, &m_File, m_Offset);
- }
- if (m_File.AppendString(FX_BSTRC("<<")) < 0) {
- return -1;
- }
- m_Offset += 2;
- CPDF_Dictionary* p = (CPDF_Dictionary*)pObj;
- FX_BOOL bSignDict = IsSignatureDict(p);
- FX_POSITION pos = p->GetStartPos();
- while (pos) {
- FX_BOOL bSignValue = FALSE;
- CFX_ByteString key;
- CPDF_Object* pValue = p->GetNextElement(pos, key);
- if (m_File.AppendString(FX_BSTRC("/")) < 0) {
- return -1;
- }
- if ((len = m_File.AppendString(PDF_NameEncode(key))) < 0) {
- return -1;
- }
- m_Offset += len + 1;
- if (bSignDict && key == FX_BSTRC("Contents")) {
- bSignValue = TRUE;
- }
- if (pValue->GetObjNum()) {
- if (m_File.AppendString(FX_BSTRC(" ")) < 0) {
- return -1;
- }
- if ((len = m_File.AppendDWord(pValue->GetObjNum())) < 0) {
- return -1;
- }
- if (m_File.AppendString(FX_BSTRC(" 0 R ")) < 0) {
- return -1;
- }
- m_Offset += len + 6;
- } else {
- if (WriteDirectObj(objnum, pValue, !bSignValue) < 0) {
- return -1;
- }
- }
- }
- if (m_File.AppendString(FX_BSTRC(">>")) < 0) {
- return -1;
- }
- m_Offset += 2;
- break;
- }
- }
- return 1;
-}
-FX_INT32 CPDF_Creator::WriteOldIndirectObject(FX_DWORD objnum)
-{
- if(m_pParser->m_V5Type[objnum] == 0 || m_pParser->m_V5Type[objnum] == 255) {
- return 0;
- }
- m_ObjectOffset[objnum] = m_Offset;
- FX_LPVOID valuetemp = NULL;
- FX_BOOL bExistInMap = m_pDocument->m_IndirectObjs.Lookup((FX_LPVOID)(FX_UINTPTR)objnum, valuetemp);
- FX_BOOL bObjStm = (m_pParser->m_V5Type[objnum] == 2) && m_pEncryptDict && !m_pXRefStream;
- if(m_pParser->m_bVersionUpdated || m_bSecurityChanged || bExistInMap || bObjStm) {
- CPDF_Object* pObj = m_pDocument->GetIndirectObject(objnum);
- if (pObj == NULL) {
- m_ObjectOffset[objnum] = 0;
- m_ObjectSize[objnum] = 0;
- return 0;
- }
- if (WriteIndirectObj(pObj)) {
- return -1;
- }
- if (!bExistInMap) {
- m_pDocument->ReleaseIndirectObject(objnum);
- }
- } else {
- FX_BYTE* pBuffer;
- FX_DWORD size;
- m_pParser->GetIndirectBinary(objnum, pBuffer, size);
- if (pBuffer == NULL) {
- return 0;
- }
- if (m_pParser->m_V5Type[objnum] == 2) {
- if (m_pXRefStream) {
- if (WriteIndirectObjectToStream(objnum, pBuffer, size) < 0) {
- FX_Free(pBuffer);
- return -1;
- }
- } else {
- FX_INT32 len = m_File.AppendDWord(objnum);
- if (len < 0) {
- return -1;
- }
- if (m_File.AppendString(FX_BSTRC(" 0 obj ")) < 0) {
- return -1;
- }
- m_Offset += len + 7;
- if (m_File.AppendBlock(pBuffer, size) < 0) {
- return -1;
- }
- m_Offset += size;
- if (m_File.AppendString(FX_BSTRC("\r\nendobj\r\n")) < 0) {
- return -1;
- }
- m_Offset += 10;
- }
- } else {
- if (m_File.AppendBlock(pBuffer, size) < 0) {
- return -1;
- }
- m_Offset += size;
- if(AppendObjectNumberToXRef(objnum) < 0) {
- return -1;
- }
- }
- FX_Free(pBuffer);
- }
- return 1;
-}
-FX_INT32 CPDF_Creator::WriteOldObjs(IFX_Pause *pPause)
-{
- FX_DWORD nOldSize = m_pParser->m_CrossRef.GetSize();
- FX_DWORD objnum = (FX_DWORD)(FX_UINTPTR)m_Pos;
- for(; objnum < nOldSize; objnum ++) {
- FX_INT32 iRet = WriteOldIndirectObject(objnum);
- if (!iRet) {
- continue;
- }
- if (iRet < 0) {
- return iRet;
- }
- m_ObjectSize[objnum] = (FX_DWORD)(m_Offset - m_ObjectOffset[objnum]);
- if (pPause && pPause->NeedToPauseNow()) {
- m_Pos = (FX_LPVOID)(FX_UINTPTR)(objnum + 1);
- return 1;
- }
- }
- return 0;
-}
-FX_INT32 CPDF_Creator::WriteNewObjs(FX_BOOL bIncremental, IFX_Pause *pPause)
-{
- FX_INT32 iCount = m_NewObjNumArray.GetSize();
- FX_INT32 index = (FX_INT32)(FX_UINTPTR)m_Pos;
- while (index < iCount) {
- FX_DWORD objnum = m_NewObjNumArray.ElementAt(index);
- CPDF_Object *pObj = NULL;
- m_pDocument->m_IndirectObjs.Lookup((FX_LPVOID)(FX_UINTPTR)objnum, (FX_LPVOID&)pObj);
- if (NULL == pObj) {
- ++index;
- continue;
- }
- m_ObjectOffset[objnum] = m_Offset;
- if (WriteIndirectObj(pObj)) {
- return -1;
- }
- m_ObjectSize[objnum] = (FX_DWORD)(m_Offset - m_ObjectOffset[objnum]);
- index++;
- if (pPause && pPause->NeedToPauseNow()) {
- m_Pos = (FX_POSITION)(FX_UINTPTR)index;
- return 1;
- }
- }
- return 0;
-}
-void CPDF_Creator::InitOldObjNumOffsets()
-{
- if (!m_pParser) {
- return;
- }
- FX_DWORD j = 0;
- FX_DWORD dwStart = 0;
- FX_DWORD dwEnd = m_pParser->GetLastObjNum();
- while (dwStart <= dwEnd) {
- while (dwStart <= dwEnd && (m_pParser->m_V5Type[dwStart] == 0 || m_pParser->m_V5Type[dwStart] == 255)) {
- dwStart++;
- }
- if (dwStart > dwEnd) {
- break;
- }
- j = dwStart;
- while (j <= dwEnd && m_pParser->m_V5Type[j] != 0 && m_pParser->m_V5Type[j] != 255) {
- j++;
- }
- m_ObjectOffset.Add(dwStart, j - dwStart);
- m_ObjectSize.Add(dwStart, j - dwStart);
- dwStart = j;
- }
-}
-void CPDF_Creator::InitNewObjNumOffsets()
-{
- FX_BOOL bIncremental = (m_dwFlags & FPDFCREATE_INCREMENTAL) != 0;
- FX_BOOL bNoOriginal = (m_dwFlags & FPDFCREATE_NO_ORIGINAL) != 0;
- FX_DWORD nOldSize = m_pParser ? m_pParser->m_CrossRef.GetSize() : 0;
- FX_POSITION pos = m_pDocument->m_IndirectObjs.GetStartPosition();
- while (pos) {
- size_t key = 0;
- CPDF_Object* pObj;
- m_pDocument->m_IndirectObjs.GetNextAssoc(pos, (FX_LPVOID&)key, (FX_LPVOID&)pObj);
- FX_DWORD objnum = (FX_DWORD)key;
- if (pObj->GetObjNum() == -1) {
- continue;
- }
- if (bIncremental) {
- if (!pObj->IsModified()) {
- continue;
- }
- } else {
- if (objnum < nOldSize && m_pParser->m_V5Type[objnum] != 0) {
- continue;
- }
- }
- AppendNewObjNum(objnum);
- }
- FX_INT32 iCount = m_NewObjNumArray.GetSize();
- if (iCount == 0) {
- return;
- }
- FX_INT32 i = 0;
- FX_DWORD dwStartObjNum = 0;
- FX_BOOL bCrossRefValid = m_pParser && m_pParser->GetLastXRefOffset() > 0;
- while (i < iCount) {
- dwStartObjNum = m_NewObjNumArray.ElementAt(i);
- if ((bIncremental && (bNoOriginal || bCrossRefValid)) || !m_ObjectOffset.GetPtrAt(dwStartObjNum)) {
- break;
- }
- i++;
- }
- if (i >= iCount) {
- return;
- }
- FX_DWORD dwLastObjNum = dwStartObjNum;
- i++;
- FX_BOOL bNewStart = FALSE;
- for (; i < iCount; i++) {
- FX_DWORD dwCurObjNum = m_NewObjNumArray.ElementAt(i);
- FX_BOOL bExist = (dwCurObjNum < nOldSize && m_ObjectOffset.GetPtrAt(dwCurObjNum) != NULL);
- if (bExist || dwCurObjNum - dwLastObjNum > 1) {
- if (!bNewStart) {
- m_ObjectOffset.Add(dwStartObjNum, dwLastObjNum - dwStartObjNum + 1);
- m_ObjectSize.Add(dwStartObjNum, dwLastObjNum - dwStartObjNum + 1);
- }
- dwStartObjNum = dwCurObjNum;
- }
- if (bNewStart) {
- dwStartObjNum = dwCurObjNum;
- }
- bNewStart = bExist;
- dwLastObjNum = dwCurObjNum;
- }
- m_ObjectOffset.Add(dwStartObjNum, dwLastObjNum - dwStartObjNum + 1);
- m_ObjectSize.Add(dwStartObjNum, dwLastObjNum - dwStartObjNum + 1);
-}
-void CPDF_Creator::AppendNewObjNum(FX_DWORD objbum)
-{
- FX_INT32 iStart = 0, iFind = 0;
- FX_INT32 iEnd = m_NewObjNumArray.GetUpperBound();
- while (iStart <= iEnd) {
- FX_INT32 iMid = (iStart + iEnd) / 2;
- FX_DWORD dwMid = m_NewObjNumArray.ElementAt(iMid);
- if (objbum < dwMid) {
- iEnd = iMid - 1;
- } else {
- if (iMid == iEnd) {
- iFind = iMid + 1;
- break;
- }
- FX_DWORD dwNext = m_NewObjNumArray.ElementAt(iMid + 1);
- if (objbum < dwNext) {
- iFind = iMid + 1;
- break;
- }
- iStart = iMid + 1;
- }
- }
- m_NewObjNumArray.InsertAt(iFind, objbum);
-}
-FX_INT32 CPDF_Creator::WriteDoc_Stage1(IFX_Pause *pPause)
-{
- FXSYS_assert(m_iStage > -1 || m_iStage < 20);
- if (m_iStage == 0) {
- if (m_pParser == NULL) {
- m_dwFlags &= ~FPDFCREATE_INCREMENTAL;
- }
- if (m_bSecurityChanged && (m_dwFlags & FPDFCREATE_NO_ORIGINAL) == 0) {
- m_dwFlags &= ~FPDFCREATE_INCREMENTAL;
- }
- m_pMetadata = m_pDocument->GetRoot()->GetElementValue(FX_BSTRC("Metadata"));
- if (m_dwFlags & FPDFCREATE_OBJECTSTREAM) {
- m_pXRefStream = FX_NEW CPDF_XRefStream;
- m_pXRefStream->Start();
- if ((m_dwFlags & FPDFCREATE_INCREMENTAL) != 0 && m_pParser) {
- FX_FILESIZE prev = m_pParser->GetLastXRefOffset();
- m_pXRefStream->m_PrevOffset = prev;
- }
- }
- m_iStage = 10;
- }
- if (m_iStage == 10) {
- if ((m_dwFlags & FPDFCREATE_INCREMENTAL) == 0) {
- if (m_File.AppendString(FX_BSTRC("%PDF-1.")) < 0) {
- return -1;
- }
- m_Offset += 7;
- FX_INT32 version = 7;
- if (m_FileVersion) {
- version = m_FileVersion;
- } else if (m_pParser) {
- version = m_pParser->GetFileVersion();
- }
- FX_INT32 len = m_File.AppendDWord(version % 10);
- if (len < 0) {
- return -1;
- }
- m_Offset += len;
- if ((len = m_File.AppendString(FX_BSTRC("\r\n%\xA1\xB3\xC5\xD7\r\n"))) < 0) {
- return -1;
- }
- m_Offset += len;
- InitOldObjNumOffsets();
- m_iStage = 20;
- } else {
- IFX_FileRead* pSrcFile = m_pParser->GetFileAccess();
- m_Offset = pSrcFile->GetSize();
- m_Pos = (FX_LPVOID)(FX_UINTPTR)m_Offset;
- m_iStage = 15;
- }
- }
- if (m_iStage == 15) {
- if ((m_dwFlags & FPDFCREATE_NO_ORIGINAL) == 0 && m_Pos) {
- IFX_FileRead* pSrcFile = m_pParser->GetFileAccess();
- FX_BYTE buffer[4096];
- FX_DWORD src_size = (FX_DWORD)(FX_UINTPTR)m_Pos;
- while (src_size) {
- FX_DWORD block_size = src_size > 4096 ? 4096 : src_size;
- if (!pSrcFile->ReadBlock(buffer, m_Offset - src_size, block_size)) {
- return -1;
- }
- if (m_File.AppendBlock(buffer, block_size) < 0) {
- return -1;
- }
- src_size -= block_size;
- if (pPause && pPause->NeedToPauseNow()) {
- m_Pos = (FX_LPVOID)(FX_UINTPTR)src_size;
- return 1;
- }
- }
- }
- if ((m_dwFlags & FPDFCREATE_NO_ORIGINAL) == 0 && m_pParser->GetLastXRefOffset() == 0) {
- InitOldObjNumOffsets();
- FX_DWORD dwEnd = m_pParser->GetLastObjNum();
- FX_BOOL bObjStm = (m_dwFlags & FPDFCREATE_OBJECTSTREAM) != 0;
- for (FX_DWORD objnum = 0; objnum <= dwEnd; objnum++) {
- if (m_pParser->m_V5Type[objnum] == 0 || m_pParser->m_V5Type[objnum] == 255) {
- continue;
- }
- m_ObjectOffset[objnum] = m_pParser->m_CrossRef[objnum];
- if (bObjStm) {
- m_pXRefStream->AddObjectNumberToIndexArray(objnum);
- }
- }
- if (bObjStm) {
- m_pXRefStream->EndXRefStream(this);
- m_pXRefStream->Start();
- }
- }
- m_iStage = 20;
- }
- InitNewObjNumOffsets();
- return m_iStage;
-}
-FX_INT32 CPDF_Creator::WriteDoc_Stage2(IFX_Pause *pPause)
-{
- FXSYS_assert(m_iStage >= 20 || m_iStage < 30);
- if (m_iStage == 20) {
- if ((m_dwFlags & FPDFCREATE_INCREMENTAL) == 0 && m_pParser) {
- m_Pos = (FX_LPVOID)(FX_UINTPTR)0;
- m_iStage = 21;
- } else {
- m_iStage = 25;
- }
- }
- if (m_iStage == 21) {
- FX_INT32 iRet = WriteOldObjs(pPause);
- if (iRet) {
- return iRet;
- }
- m_iStage = 25;
- }
- if (m_iStage == 25) {
- m_Pos = (FX_LPVOID)(FX_UINTPTR)0;
- m_iStage = 26;
- }
- if (m_iStage == 26) {
- FX_INT32 iRet = WriteNewObjs((m_dwFlags & FPDFCREATE_INCREMENTAL) != 0, pPause);
- if (iRet) {
- return iRet;
- }
- m_iStage = 27;
- }
- if (m_iStage == 27) {
- if (NULL != m_pEncryptDict && 0 == m_pEncryptDict->GetObjNum()) {
- m_dwLastObjNum += 1;
- FX_FILESIZE saveOffset = m_Offset;
- if (WriteIndirectObj(m_dwLastObjNum, m_pEncryptDict) < 0) {
- return -1;
- }
- m_ObjectOffset.Add(m_dwLastObjNum, 1);
- m_ObjectOffset[m_dwLastObjNum] = saveOffset;
- m_ObjectSize.Add(m_dwLastObjNum, 1);
- m_ObjectSize[m_dwLastObjNum] = m_Offset - saveOffset;
- m_dwEnryptObjNum = m_dwLastObjNum;
- if (m_dwFlags & FPDFCREATE_INCREMENTAL) {
- m_NewObjNumArray.Add(m_dwLastObjNum);
- }
- }
- m_iStage = 80;
- }
- return m_iStage;
-}
-FX_INT32 CPDF_Creator::WriteDoc_Stage3(IFX_Pause *pPause)
-{
- FXSYS_assert(m_iStage >= 80 || m_iStage < 90);
- FX_DWORD dwLastObjNum = m_dwLastObjNum;
- if (m_iStage == 80) {
- m_XrefStart = m_Offset;
- if (m_dwFlags & FPDFCREATE_OBJECTSTREAM) {
- m_pXRefStream->End(this, TRUE);
- m_XrefStart = m_pXRefStream->m_PrevOffset;
- m_iStage = 90;
- } else if ((m_dwFlags & FPDFCREATE_INCREMENTAL) == 0 || !m_pParser->IsXRefStream()) {
- if ((m_dwFlags & FPDFCREATE_INCREMENTAL) == 0 || m_pParser->GetLastXRefOffset() == 0) {
- CFX_ByteString str;
- str = m_ObjectOffset.GetPtrAt(1) ? FX_BSTRC("xref\r\n") : FX_BSTRC("xref\r\n0 1\r\n0000000000 65536 f\r\n");
- if (m_File.AppendString(str) < 0) {
- return -1;
- }
- m_Pos = (FX_LPVOID)(FX_UINTPTR)1;
- m_iStage = 81;
- } else {
- if (m_File.AppendString(FX_BSTRC("xref\r\n")) < 0) {
- return -1;
- }
- m_Pos = (FX_LPVOID)(FX_UINTPTR)0;
- m_iStage = 82;
- }
- } else {
- m_iStage = 90;
- }
- }
- if (m_iStage == 81) {
- CFX_ByteString str;
- FX_DWORD i = (FX_DWORD)(FX_UINTPTR)m_Pos, j;
- while (i <= dwLastObjNum) {
- while (i <= dwLastObjNum && !m_ObjectOffset.GetPtrAt(i)) {
- i++;
- }
- if (i > dwLastObjNum) {
- break;
- }
- j = i;
- while (j <= dwLastObjNum && m_ObjectOffset.GetPtrAt(j)) {
- j++;
- }
- if (i == 1) {
- str.Format("0 %d\r\n0000000000 65536 f\r\n", j);
- } else {
- str.Format("%d %d\r\n", i, j - i);
- }
- if (m_File.AppendBlock((FX_LPCSTR)str, str.GetLength()) < 0) {
- return -1;
- }
- while (i < j) {
- str.Format("%010d 00000 n\r\n", m_ObjectOffset[i ++]);
- if (m_File.AppendBlock((FX_LPCSTR)str, str.GetLength()) < 0) {
- return -1;
- }
- }
- if (i > dwLastObjNum) {
- break;
- }
- if (pPause && pPause->NeedToPauseNow()) {
- m_Pos = (FX_LPVOID)(FX_UINTPTR)i;
- return 1;
- }
- }
- m_iStage = 90;
- }
- if (m_iStage == 82) {
- CFX_ByteString str;
- FX_INT32 iCount = m_NewObjNumArray.GetSize();
- FX_INT32 i = (FX_INT32)(FX_UINTPTR)m_Pos;
- while (i < iCount) {
- FX_INT32 j = i;
- FX_DWORD objnum = m_NewObjNumArray.ElementAt(i);
- while (j < iCount) {
- if (++j == iCount) {
- break;
- }
- FX_DWORD dwCurrent = m_NewObjNumArray.ElementAt(j);
- if (dwCurrent - objnum > 1) {
- break;
- }
- objnum = dwCurrent;
- }
- objnum = m_NewObjNumArray.ElementAt(i);
- if (objnum == 1) {
- str.Format("0 %d\r\n0000000000 65536 f\r\n", j - i + 1);
- } else {
- str.Format("%d %d\r\n", objnum, j - i);
- }
- if (m_File.AppendBlock((FX_LPCSTR)str, str.GetLength()) < 0) {
- return -1;
- }
- while (i < j) {
- objnum = m_NewObjNumArray.ElementAt(i++);
- str.Format("%010d 00000 n\r\n", m_ObjectOffset[objnum]);
- if (m_File.AppendBlock((FX_LPCSTR)str, str.GetLength()) < 0) {
- return -1;
- }
- }
- if (pPause && (i % 100) == 0 && pPause->NeedToPauseNow()) {
- m_Pos = (FX_LPVOID)(FX_UINTPTR)i;
- return 1;
- }
- }
- m_iStage = 90;
- }
- return m_iStage;
-}
-static FX_INT32 _OutPutIndex(CFX_FileBufferArchive* pFile, FX_FILESIZE offset)
-{
- FXSYS_assert(pFile);
- if (sizeof(offset) > 4) {
- if (FX_GETBYTEOFFSET32(offset)) {
- if (pFile->AppendByte(FX_GETBYTEOFFSET56(offset)) < 0) {
- return -1;
- }
- if (pFile->AppendByte(FX_GETBYTEOFFSET48(offset)) < 0) {
- return -1;
- }
- if (pFile->AppendByte(FX_GETBYTEOFFSET40(offset)) < 0) {
- return -1;
- }
- if (pFile->AppendByte(FX_GETBYTEOFFSET32(offset)) < 0) {
- return -1;
- }
- }
- }
- if (pFile->AppendByte(FX_GETBYTEOFFSET24(offset)) < 0) {
- return -1;
- }
- if (pFile->AppendByte(FX_GETBYTEOFFSET16(offset)) < 0) {
- return -1;
- }
- if (pFile->AppendByte(FX_GETBYTEOFFSET8(offset)) < 0) {
- return -1;
- }
- if (pFile->AppendByte(FX_GETBYTEOFFSET0(offset)) < 0) {
- return -1;
- }
- if (pFile->AppendByte(0) < 0) {
- return -1;
- }
- return 0;
-}
-FX_INT32 CPDF_Creator::WriteDoc_Stage4(IFX_Pause *pPause)
-{
- FXSYS_assert(m_iStage >= 90);
- if ((m_dwFlags & FPDFCREATE_OBJECTSTREAM) == 0) {
- FX_BOOL bXRefStream = (m_dwFlags & FPDFCREATE_INCREMENTAL) != 0 && m_pParser->IsXRefStream();
- if (!bXRefStream) {
- if (m_File.AppendString(FX_BSTRC("trailer\r\n<<")) < 0) {
- return -1;
- }
- } else {
- if (m_File.AppendDWord(m_pDocument->m_LastObjNum + 1) < 0) {
- return -1;
- }
- if (m_File.AppendString(FX_BSTRC(" 0 obj <<")) < 0) {
- return -1;
- }
- }
- if (m_pParser) {
- CPDF_Dictionary* p = m_pParser->m_pTrailer;
- FX_POSITION pos = p->GetStartPos();
- while (pos) {
- CFX_ByteString key;
- CPDF_Object* pValue = p->GetNextElement(pos, key);
- if (key == FX_BSTRC("Encrypt") || key == FX_BSTRC("Size") || key == FX_BSTRC("Filter") ||
- key == FX_BSTRC("Index") || key == FX_BSTRC("Length") || key == FX_BSTRC("Prev") ||
- key == FX_BSTRC("W") || key == FX_BSTRC("XRefStm") || key == FX_BSTRC("ID")) {
- continue;
- }
- if (m_File.AppendString((FX_BSTRC("/"))) < 0) {
- return -1;
- }
- if (m_File.AppendString(PDF_NameEncode(key)) < 0) {
- return -1;
- }
- if (pValue->GetObjNum()) {
- if (m_File.AppendString(FX_BSTRC(" ")) < 0) {
- return -1;
- }
- if (m_File.AppendDWord(pValue->GetObjNum()) < 0) {
- return -1;
- }
- if (m_File.AppendString(FX_BSTRC(" 0 R ")) < 0) {
- return -1;
- }
- } else {
- FX_FILESIZE offset = 0;
- if (PDF_CreatorAppendObject(pValue, &m_File, offset) < 0) {
- return -1;
- }
- }
- }
- } else {
- if (m_File.AppendString(FX_BSTRC("\r\n/Root ")) < 0) {
- return -1;
- }
- if (m_File.AppendDWord(m_pDocument->m_pRootDict->GetObjNum()) < 0) {
- return -1;
- }
- if (m_File.AppendString(FX_BSTRC(" 0 R\r\n")) < 0) {
- return -1;
- }
- if (m_pDocument->m_pInfoDict) {
- if (m_File.AppendString(FX_BSTRC("/Info ")) < 0) {
- return -1;
- }
- if (m_File.AppendDWord(m_pDocument->m_pInfoDict->GetObjNum()) < 0) {
- return -1;
- }
- if (m_File.AppendString(FX_BSTRC(" 0 R\r\n")) < 0) {
- return -1;
- }
- }
- }
- if (m_pEncryptDict) {
- if (m_File.AppendString(FX_BSTRC("/Encrypt")) < 0) {
- return -1;
- }
- FX_DWORD dwObjNum = m_pEncryptDict->GetObjNum();
- if (dwObjNum == 0) {
- dwObjNum = m_pDocument->GetLastObjNum() + 1;
- }
- if (m_File.AppendString(FX_BSTRC(" ")) < 0) {
- return -1;
- }
- if (m_File.AppendDWord(dwObjNum) < 0) {
- return -1;
- }
- if (m_File.AppendString(FX_BSTRC(" 0 R ")) < 0) {
- return -1;
- }
- }
- if (m_File.AppendString(FX_BSTRC("/Size ")) < 0) {
- return -1;
- }
- if (m_File.AppendDWord(m_dwLastObjNum + (bXRefStream ? 2 : 1)) < 0) {
- return -1;
- }
- if ((m_dwFlags & FPDFCREATE_INCREMENTAL) != 0) {
- FX_FILESIZE prev = m_pParser->GetLastXRefOffset();
- if (prev) {
- if (m_File.AppendString(FX_BSTRC("/Prev ")) < 0) {
- return -1;
- }
- FX_CHAR offset_buf[20];
- FXSYS_memset32(offset_buf, 0, sizeof(offset_buf));
- FXSYS_i64toa(prev, offset_buf, 10);
- if (m_File.AppendBlock(offset_buf, FXSYS_strlen(offset_buf)) < 0) {
- return -1;
- }
- }
- }
- if (m_pIDArray) {
- if (m_File.AppendString((FX_BSTRC("/ID"))) < 0) {
- return -1;
- }
- FX_FILESIZE offset = 0;
- if (PDF_CreatorAppendObject(m_pIDArray, &m_File, offset) < 0) {
- return -1;
- }
- }
- if (!bXRefStream) {
- if (m_File.AppendString(FX_BSTRC(">>")) < 0) {
- return -1;
- }
- } else {
- if (m_File.AppendString(FX_BSTRC("/W[0 4 1]/Index[")) < 0) {
- return -1;
- }
- if ((m_dwFlags & FPDFCREATE_INCREMENTAL) != 0 && m_pParser && m_pParser->GetLastXRefOffset() == 0) {
- FX_DWORD i = 0;
- for (i = 0; i < m_dwLastObjNum; i++) {
- if (!m_ObjectOffset.GetPtrAt(i)) {
- continue;
- }
- if (m_File.AppendDWord(i) < 0) {
- return -1;
- }
- if (m_File.AppendString(FX_BSTRC(" 1 ")) < 0) {
- return -1;
- }
- }
- if (m_File.AppendString(FX_BSTRC("]/Length ")) < 0) {
- return -1;
- }
- if (m_File.AppendDWord(m_dwLastObjNum * 5) < 0) {
- return -1;
- }
- if (m_File.AppendString(FX_BSTRC(">>stream\r\n")) < 0) {
- return -1;
- }
- for (i = 0; i < m_dwLastObjNum; i++) {
- FX_FILESIZE* offset = m_ObjectOffset.GetPtrAt(i);
- if (!offset) {
- continue;
- }
- _OutPutIndex(&m_File, *offset);
- }
- } else {
- int count = m_NewObjNumArray.GetSize();
- FX_INT32 i = 0;
- for (i = 0; i < count; i++) {
- FX_DWORD objnum = m_NewObjNumArray.ElementAt(i);
- if (m_File.AppendDWord(objnum) < 0) {
- return -1;
- }
- if (m_File.AppendString(FX_BSTRC(" 1 ")) < 0) {
- return -1;
- }
- }
- if (m_File.AppendString(FX_BSTRC("]/Length ")) < 0) {
- return -1;
- }
- if (m_File.AppendDWord(count * 5) < 0) {
- return -1;
- }
- if (m_File.AppendString(FX_BSTRC(">>stream\r\n")) < 0) {
- return -1;
- }
- for (i = 0; i < count; i++) {
- FX_DWORD objnum = m_NewObjNumArray.ElementAt(i);
- FX_FILESIZE offset = m_ObjectOffset[objnum];
- _OutPutIndex(&m_File, offset);
- }
- }
- if (m_File.AppendString(FX_BSTRC("\r\nendstream")) < 0) {
- return -1;
- }
- }
- }
- if (m_File.AppendString(FX_BSTRC("\r\nstartxref\r\n")) < 0) {
- return -1;
- }
- FX_CHAR offset_buf[20];
- FXSYS_memset32(offset_buf, 0, sizeof(offset_buf));
- FXSYS_i64toa(m_XrefStart, offset_buf, 10);
- if (m_File.AppendBlock(offset_buf, FXSYS_strlen(offset_buf)) < 0) {
- return -1;
- }
- if (m_File.AppendString(FX_BSTRC("\r\n%%EOF\r\n")) < 0) {
- return -1;
- }
- m_File.Flush();
- return m_iStage = 100;
-}
-void CPDF_Creator::Clear()
-{
- if (m_pXRefStream) {
- delete m_pXRefStream;
- m_pXRefStream = NULL;
- }
- m_File.Clear();
- m_NewObjNumArray.RemoveAll();
- if (m_pIDArray) {
- m_pIDArray->Release();
- m_pIDArray = NULL;
- }
-}
-FX_BOOL CPDF_Creator::Create(FX_LPCSTR filename, FX_DWORD flags)
-{
- if (!m_File.AttachFile(filename)) {
- return FALSE;
- }
- FX_BOOL bRet = Create(flags);
- if (!bRet || !(flags & FPDFCREATE_PROGRESSIVE)) {
- Clear();
- }
- return bRet;
-}
-FX_BOOL CPDF_Creator::Create(FX_LPCWSTR filename, FX_DWORD flags)
-{
- if (!m_File.AttachFile(filename)) {
- return FALSE;
- }
- FX_BOOL bRet = Create(flags);
- if (!bRet || !(flags & FPDFCREATE_PROGRESSIVE)) {
- Clear();
- }
- return bRet;
-}
-FX_BOOL CPDF_Creator::Create(IFX_StreamWrite* pFile, FX_DWORD flags)
-{
- if (!pFile) {
- return FALSE;
- }
- if (!m_File.AttachFile(pFile, FALSE)) {
- return FALSE;
- }
- return Create(flags);
-}
-FX_BOOL CPDF_Creator::Create(FX_DWORD flags)
-{
- m_dwFlags = flags;
- m_iStage = 0;
- m_Offset = 0;
- m_dwLastObjNum = m_pDocument->GetLastObjNum();
- m_ObjectOffset.Clear();
- m_ObjectSize.Clear();
- m_NewObjNumArray.RemoveAll();
- InitID();
- if (flags & FPDFCREATE_PROGRESSIVE) {
- return TRUE;
- }
- return Continue(NULL) > -1;
-}
-void CPDF_Creator::InitID(FX_BOOL bDefault )
-{
- CPDF_Array* pOldIDArray = m_pParser ? m_pParser->GetIDArray() : NULL;
- FX_BOOL bNewId = !m_pIDArray;
- if (!m_pIDArray) {
- FX_LPDWORD pBuffer = NULL;
- m_pIDArray = CPDF_Array::Create();
- CPDF_Object* pID1 = pOldIDArray->GetElement(0);
- if (pID1) {
- m_pIDArray->Add(pID1->Clone());
- } else {
- pBuffer = FX_Alloc(FX_DWORD, 4);
- PDF_GenerateFileID((FX_DWORD)(FX_UINTPTR)this, m_dwLastObjNum, pBuffer);
- CFX_ByteStringC bsBuffer((FX_LPCBYTE)pBuffer, 4 * sizeof(FX_DWORD));
- m_pIDArray->Add(CPDF_String::Create(bsBuffer, TRUE), m_pDocument);
- }
- if (pBuffer) {
- FX_Free(pBuffer);
- }
- }
- if (!bDefault) {
- return;
- }
- if (pOldIDArray) {
- CPDF_Object* pID2 = pOldIDArray->GetElement(1);
- if ((m_dwFlags & FPDFCREATE_INCREMENTAL) && m_pEncryptDict && pID2) {
- m_pIDArray->Add(pID2->Clone());
- return;
- }
- FX_LPDWORD pBuffer = FX_Alloc(FX_DWORD, 4);
- PDF_GenerateFileID((FX_DWORD)(FX_UINTPTR)this, m_dwLastObjNum, pBuffer);
- CFX_ByteStringC bsBuffer((FX_LPCBYTE)pBuffer, 4 * sizeof(FX_DWORD));
- m_pIDArray->Add(CPDF_String::Create(bsBuffer, TRUE), m_pDocument);
- FX_Free(pBuffer);
- return;
- }
- m_pIDArray->Add(m_pIDArray->GetElement(0)->Clone());
- if (m_pEncryptDict && !pOldIDArray && m_pParser && bNewId) {
- if (m_pEncryptDict->GetString(FX_BSTRC("Filter")) == FX_BSTRC("Standard")) {
- CPDF_StandardSecurityHandler handler;
- CFX_ByteString user_pass = m_pParser->GetPassword();
- FX_DWORD flag = PDF_ENCRYPT_CONTENT;
- handler.OnCreate(m_pEncryptDict, m_pIDArray, (FX_LPCBYTE)user_pass, user_pass.GetLength(), flag);
- if (m_pCryptoHandler && m_bNewCrypto) {
- delete m_pCryptoHandler;
- }
- m_pCryptoHandler = FX_NEW CPDF_StandardCryptoHandler;
- m_pCryptoHandler->Init(m_pEncryptDict, &handler);
- m_bNewCrypto = TRUE;
- m_bSecurityChanged = TRUE;
- }
- }
-}
-FX_INT32 CPDF_Creator::Continue(IFX_Pause *pPause)
-{
- if (m_iStage < 0) {
- return m_iStage;
- }
- FX_INT32 iRet;
- while (m_iStage < 100) {
- if (m_iStage < 20) {
- iRet = WriteDoc_Stage1(pPause);
- } else if (m_iStage < 30) {
- iRet = WriteDoc_Stage2(pPause);
- } else if (m_iStage < 90) {
- iRet = WriteDoc_Stage3(pPause);
- } else {
- iRet = WriteDoc_Stage4(pPause);
- }
- if (iRet < m_iStage) {
- break;
- }
- }
- if (iRet < 1 || m_iStage == 100) {
- m_iStage = -1;
- Clear();
- return iRet > 99 ? 0 : (iRet < 1 ? -1 : iRet);
- }
- return m_iStage;
-}
-FX_BOOL CPDF_Creator::SetFileVersion(FX_INT32 fileVersion )
-{
- if (fileVersion < 10 || fileVersion > 17) {
- return FALSE;
- }
- m_FileVersion = fileVersion;
- return TRUE;
-}
-void CPDF_Creator::ResetStandardSecurity()
-{
- if ((m_bStandardSecurity || m_bNewCrypto) && m_pCryptoHandler) {
- delete m_pCryptoHandler;
- m_pCryptoHandler = NULL;
- }
- m_bNewCrypto = FALSE;
- if (!m_bStandardSecurity) {
- return;
- }
- if (m_pEncryptDict) {
- m_pEncryptDict->Release();
- m_pEncryptDict = NULL;
- }
- m_bStandardSecurity = FALSE;
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fpdfapi/fpdf_serial.h"
+#include "editint.h"
+#define PDF_OBJECTSTREAM_MAXLENGTH (256 * 1024)
+#define PDF_XREFSTREAM_MAXSIZE 10000
+extern void FlateEncode(const FX_BYTE* src_buf, FX_DWORD src_data, FX_LPBYTE& dest_buf, FX_DWORD& dest_size);
+extern void FlateEncode(FX_LPCBYTE src_buf, FX_DWORD src_size, int predictor, int Colors, int BitsPerComponent, int Columns,
+ FX_LPBYTE& dest_buf, FX_DWORD& dest_size);
+extern FX_BOOL IsSignatureDict(const CPDF_Dictionary* pDict);
+FX_INT32 PDF_CreatorAppendObject(const CPDF_Object* pObj, CFX_FileBufferArchive *pFile, FX_FILESIZE& offset)
+{
+ FX_INT32 len = 0;
+ if (pObj == NULL) {
+ if (pFile->AppendString(FX_BSTRC(" null")) < 0) {
+ return -1;
+ }
+ offset += 5;
+ return 1;
+ }
+ switch (pObj->GetType()) {
+ case PDFOBJ_NULL:
+ if (pFile->AppendString(FX_BSTRC(" null")) < 0) {
+ return -1;
+ }
+ offset += 5;
+ break;
+ case PDFOBJ_BOOLEAN:
+ case PDFOBJ_NUMBER:
+ if (pFile->AppendString(FX_BSTRC(" ")) < 0) {
+ return -1;
+ }
+ if ((len = pFile->AppendString(pObj->GetString())) < 0) {
+ return -1;
+ }
+ offset += len + 1;
+ break;
+ case PDFOBJ_STRING: {
+ CFX_ByteString str = pObj->GetString();
+ FX_BOOL bHex = ((CPDF_String*)pObj)->IsHex();
+ if ((len = pFile->AppendString(PDF_EncodeString(str, bHex))) < 0) {
+ return -1;
+ }
+ offset += len;
+ break;
+ }
+ case PDFOBJ_NAME: {
+ if (pFile->AppendString(FX_BSTRC("/")) < 0) {
+ return -1;
+ }
+ CFX_ByteString str = pObj->GetString();
+ if ((len = pFile->AppendString(PDF_NameEncode(str))) < 0) {
+ return -1;
+ }
+ offset += len + 1;
+ break;
+ }
+ case PDFOBJ_REFERENCE: {
+ if (pFile->AppendString(FX_BSTRC(" ")) < 0) {
+ return -1;
+ }
+ CPDF_Reference* p = (CPDF_Reference*)pObj;
+ if ((len = pFile->AppendDWord(p->GetRefObjNum())) < 0) {
+ return -1;
+ }
+ if (pFile->AppendString(FX_BSTRC(" 0 R ")) < 0) {
+ return -1;
+ }
+ offset += len + 6;
+ break;
+ }
+ case PDFOBJ_ARRAY: {
+ if (pFile->AppendString(FX_BSTRC("[")) < 0) {
+ return -1;
+ }
+ offset += 1;
+ CPDF_Array* p = (CPDF_Array*)pObj;
+ for (FX_DWORD i = 0; i < p->GetCount(); i ++) {
+ CPDF_Object* pElement = p->GetElement(i);
+ if (pElement->GetObjNum()) {
+ if (pFile->AppendString(FX_BSTRC(" ")) < 0) {
+ return -1;
+ }
+ if ((len = pFile->AppendDWord(pElement->GetObjNum())) < 0) {
+ return -1;
+ }
+ if (pFile->AppendString(FX_BSTRC(" 0 R")) < 0) {
+ return -1;
+ }
+ offset += len + 5;
+ } else {
+ if (PDF_CreatorAppendObject(pElement, pFile, offset) < 0) {
+ return -1;
+ }
+ }
+ }
+ if (pFile->AppendString(FX_BSTRC("]")) < 0) {
+ return -1;
+ }
+ offset += 1;
+ break;
+ }
+ case PDFOBJ_DICTIONARY: {
+ if (pFile->AppendString(FX_BSTRC("<<")) < 0) {
+ return -1;
+ }
+ offset += 2;
+ CPDF_Dictionary* p = (CPDF_Dictionary*)pObj;
+ FX_POSITION pos = p->GetStartPos();
+ while (pos) {
+ CFX_ByteString key;
+ CPDF_Object* pValue = p->GetNextElement(pos, key);
+ if (pFile->AppendString(FX_BSTRC("/")) < 0) {
+ return -1;
+ }
+ if ((len = pFile->AppendString(PDF_NameEncode(key))) < 0) {
+ return -1;
+ }
+ offset += len + 1;
+ if (pValue->GetObjNum()) {
+ if (pFile->AppendString(FX_BSTRC(" ")) < 0) {
+ return -1;
+ }
+ if ((len = pFile->AppendDWord(pValue->GetObjNum())) < 0) {
+ return -1;
+ }
+ if (pFile->AppendString(FX_BSTRC(" 0 R")) < 0) {
+ return -1;
+ }
+ offset += len + 5;
+ } else {
+ if (PDF_CreatorAppendObject(pValue, pFile, offset) < 0) {
+ return -1;
+ }
+ }
+ }
+ if (pFile->AppendString(FX_BSTRC(">>")) < 0) {
+ return -1;
+ }
+ offset += 2;
+ break;
+ }
+ case PDFOBJ_STREAM: {
+ CPDF_Stream* p = (CPDF_Stream*)pObj;
+ if (PDF_CreatorAppendObject(p->GetDict(), pFile, offset) < 0) {
+ return -1;
+ }
+ if (pFile->AppendString(FX_BSTRC("stream\r\n")) < 0) {
+ return -1;
+ }
+ offset += 8;
+ CPDF_StreamAcc acc;
+ acc.LoadAllData(p, TRUE);
+ if (pFile->AppendBlock(acc.GetData(), acc.GetSize()) < 0) {
+ return -1;
+ }
+ offset += acc.GetSize();
+ if ((len = pFile->AppendString(FX_BSTRC("\r\nendstream"))) < 0) {
+ return -1;
+ }
+ offset += len;
+ break;
+ }
+ default:
+ ASSERT(FALSE);
+ break;
+ }
+ return 1;
+}
+FX_INT32 PDF_CreatorWriteTrailer(CPDF_Document* pDocument, CFX_FileBufferArchive* pFile, CPDF_Array* pIDArray, FX_BOOL bCompress)
+{
+ FX_FILESIZE offset = 0;
+ FX_INT32 len = 0;
+ FXSYS_assert(pDocument && pFile);
+ CPDF_Parser *pParser = (CPDF_Parser*)pDocument->GetParser();
+ if (pParser) {
+ CPDF_Dictionary* p = pParser->GetTrailer();
+ FX_POSITION pos = p->GetStartPos();
+ while (pos) {
+ CFX_ByteString key;
+ CPDF_Object* pValue = p->GetNextElement(pos, key);
+ if (key == FX_BSTRC("Encrypt") || key == FX_BSTRC("Size") || key == FX_BSTRC("Filter") ||
+ key == FX_BSTRC("Index") || key == FX_BSTRC("Length") || key == FX_BSTRC("Prev") ||
+ key == FX_BSTRC("W") || key == FX_BSTRC("XRefStm") || key == FX_BSTRC("Type") || key == FX_BSTRC("ID")) {
+ continue;
+ }
+ if (bCompress && key == FX_BSTRC("DecodeParms")) {
+ continue;
+ }
+ if (pFile->AppendString((FX_BSTRC("/"))) < 0) {
+ return -1;
+ }
+ if ((len = pFile->AppendString(PDF_NameEncode(key))) < 0) {
+ return -1;
+ }
+ offset += len + 1;
+ if (pValue->GetObjNum()) {
+ if (pFile->AppendString(FX_BSTRC(" ")) < 0) {
+ return -1;
+ }
+ if ((len = pFile->AppendDWord(pValue->GetObjNum())) < 0) {
+ return -1;
+ }
+ if (pFile->AppendString(FX_BSTRC(" 0 R ")) < 0) {
+ return -1;
+ }
+ offset += len + 6;
+ } else {
+ if (PDF_CreatorAppendObject(pValue, pFile, offset) < 0) {
+ return -1;
+ }
+ }
+ }
+ if (pIDArray) {
+ if (pFile->AppendString((FX_BSTRC("/ID"))) < 0) {
+ return -1;
+ }
+ offset += 3;
+ if (PDF_CreatorAppendObject(pIDArray, pFile, offset) < 0) {
+ return -1;
+ }
+ }
+ return offset;
+ }
+ if (pFile->AppendString(FX_BSTRC("\r\n/Root ")) < 0) {
+ return -1;
+ }
+ if ((len = pFile->AppendDWord(pDocument->GetRoot()->GetObjNum())) < 0) {
+ return -1;
+ }
+ if (pFile->AppendString(FX_BSTRC(" 0 R\r\n")) < 0) {
+ return -1;
+ }
+ offset += len + 14;
+ if (pDocument->GetInfo()) {
+ if (pFile->AppendString(FX_BSTRC("/Info ")) < 0) {
+ return -1;
+ }
+ if ((len = pFile->AppendDWord(pDocument->GetInfo()->GetObjNum())) < 0) {
+ return -1;
+ }
+ if (pFile->AppendString(FX_BSTRC(" 0 R\r\n")) < 0) {
+ return -1;
+ }
+ offset += len + 12;
+ }
+ if (pIDArray) {
+ if (pFile->AppendString((FX_BSTRC("/ID"))) < 0) {
+ return -1;
+ }
+ offset += 3;
+ if (PDF_CreatorAppendObject(pIDArray, pFile, offset) < 0) {
+ return -1;
+ }
+ }
+ return offset;
+}
+FX_INT32 PDF_CreatorWriteEncrypt(const CPDF_Dictionary* pEncryptDict, FX_DWORD dwObjNum, CFX_FileBufferArchive *pFile)
+{
+ if (!pEncryptDict) {
+ return 0;
+ }
+ FXSYS_assert(pFile);
+ FX_FILESIZE offset = 0;
+ FX_INT32 len = 0;
+ if (pFile->AppendString(FX_BSTRC("/Encrypt")) < 0) {
+ return -1;
+ }
+ offset += 8;
+ if (pFile->AppendString(FX_BSTRC(" ")) < 0) {
+ return -1;
+ }
+ if ((len = pFile->AppendDWord(dwObjNum)) < 0) {
+ return -1;
+ }
+ if (pFile->AppendString(FX_BSTRC(" 0 R ")) < 0) {
+ return -1;
+ }
+ offset += len + 6;
+ return offset;
+}
+FX_BOOL PDF_GenerateFileID(FX_DWORD dwSeed1, FX_DWORD dwSeed2, FX_LPDWORD pBuffer)
+{
+ if (!pBuffer) {
+ return FALSE;
+ }
+ FX_LPVOID pContext = FX_Random_MT_Start(dwSeed1);
+ FX_INT32 i = 0;
+ for (i = 0; i < 2; i++) {
+ *pBuffer++ = FX_Random_MT_Generate(pContext);
+ }
+ FX_Random_MT_Close(pContext);
+ pContext = FX_Random_MT_Start(dwSeed2);
+ for (i = 0; i < 2; i++) {
+ *pBuffer++ = FX_Random_MT_Generate(pContext);
+ }
+ FX_Random_MT_Close(pContext);
+ return TRUE;
+}
+class CPDF_FlateEncoder
+{
+public:
+ CPDF_FlateEncoder();
+ ~CPDF_FlateEncoder();
+ FX_BOOL Initialize(CPDF_Stream* pStream, FX_BOOL bFlateEncode);
+ FX_BOOL Initialize(FX_LPCBYTE pBuffer, FX_DWORD size, FX_BOOL bFlateEncode, FX_BOOL bXRefStream = FALSE);
+ void CloneDict();
+ FX_LPBYTE m_pData;
+ FX_DWORD m_dwSize;
+ CPDF_Dictionary* m_pDict;
+ FX_BOOL m_bCloned;
+ FX_BOOL m_bNewData;
+ CPDF_StreamAcc m_Acc;
+};
+CPDF_FlateEncoder::CPDF_FlateEncoder()
+{
+ m_pData = NULL;
+ m_dwSize = 0;
+ m_pDict = NULL;
+ m_bCloned = FALSE;
+ m_bNewData = FALSE;
+}
+void CPDF_FlateEncoder::CloneDict()
+{
+ if (!m_bCloned) {
+ m_pDict = (CPDF_Dictionary*)m_pDict->Clone();
+ m_bCloned = TRUE;
+ }
+}
+FX_BOOL CPDF_FlateEncoder::Initialize(CPDF_Stream* pStream, FX_BOOL bFlateEncode)
+{
+ m_Acc.LoadAllData(pStream, TRUE);
+ if (pStream->GetDict()->KeyExist("Filter") || !bFlateEncode) {
+ if (pStream->GetDict()->KeyExist("Filter") && !bFlateEncode) {
+ CPDF_StreamAcc destAcc;
+ destAcc.LoadAllData(pStream);
+ m_dwSize = destAcc.GetSize();
+ m_pData = (FX_LPBYTE)destAcc.DetachData();
+ m_pDict = (CPDF_Dictionary*)pStream->GetDict()->Clone();
+ m_pDict->RemoveAt(FX_BSTRC("Filter"));
+ m_bNewData = TRUE;
+ m_bCloned = TRUE;
+ } else {
+ m_pData = (FX_LPBYTE)m_Acc.GetData();
+ m_dwSize = m_Acc.GetSize();
+ m_pDict = pStream->GetDict();
+ }
+ return TRUE;
+ }
+ m_pData = NULL;
+ m_dwSize = 0;
+ m_bNewData = TRUE;
+ m_bCloned = TRUE;
+ ::FlateEncode(m_Acc.GetData(), m_Acc.GetSize(), m_pData, m_dwSize);
+ m_pDict = (CPDF_Dictionary*)pStream->GetDict()->Clone();
+ m_pDict->SetAtInteger("Length", m_dwSize);
+ m_pDict->SetAtName("Filter", "FlateDecode");
+ m_pDict->RemoveAt("DecodeParms");
+ return TRUE;
+}
+FX_BOOL CPDF_FlateEncoder::Initialize(FX_LPCBYTE pBuffer, FX_DWORD size, FX_BOOL bFlateEncode, FX_BOOL bXRefStream)
+{
+ if (!bFlateEncode) {
+ m_pData = (FX_LPBYTE)pBuffer;
+ m_dwSize = size;
+ return TRUE;
+ }
+ m_bNewData = TRUE;
+ if (bXRefStream) {
+ ::FlateEncode(pBuffer, size, 12, 1, 8, 7, m_pData, m_dwSize);
+ } else {
+ ::FlateEncode(pBuffer, size, m_pData, m_dwSize);
+ }
+ return TRUE;
+}
+CPDF_FlateEncoder::~CPDF_FlateEncoder()
+{
+ if (m_bCloned && m_pDict) {
+ m_pDict->Release();
+ }
+ if (m_bNewData && m_pData) {
+ FX_Free(m_pData);
+ }
+}
+class CPDF_Encryptor
+{
+public:
+ CPDF_Encryptor();
+ ~CPDF_Encryptor();
+ FX_BOOL Initialize(CPDF_CryptoHandler* pHandler, int objnum, FX_LPBYTE src_data, FX_DWORD src_size);
+ FX_LPBYTE m_pData;
+ FX_DWORD m_dwSize;
+ FX_BOOL m_bNewBuf;
+};
+CPDF_Encryptor::CPDF_Encryptor()
+{
+ m_pData = NULL;
+ m_dwSize = 0;
+ m_bNewBuf = FALSE;
+}
+FX_BOOL CPDF_Encryptor::Initialize(CPDF_CryptoHandler* pHandler, int objnum, FX_LPBYTE src_data, FX_DWORD src_size)
+{
+ if (src_size == 0) {
+ return TRUE;
+ }
+ if (pHandler == NULL) {
+ m_pData = (FX_LPBYTE)src_data;
+ m_dwSize = src_size;
+ m_bNewBuf = FALSE;
+ return TRUE;
+ }
+ m_dwSize = pHandler->EncryptGetSize(objnum, 0, src_data, src_size);
+ m_pData = FX_Alloc(FX_BYTE, m_dwSize);
+ if(!m_pData) {
+ return FALSE;
+ }
+ pHandler->EncryptContent(objnum, 0, src_data, src_size, m_pData, m_dwSize);
+ m_bNewBuf = TRUE;
+ return TRUE;
+}
+CPDF_Encryptor::~CPDF_Encryptor()
+{
+ if (m_bNewBuf) {
+ FX_Free(m_pData);
+ }
+}
+CPDF_ObjectStream::CPDF_ObjectStream()
+ : m_dwObjNum(0)
+ , m_index(0)
+{
+}
+FX_BOOL CPDF_ObjectStream::Start()
+{
+ m_ObjNumArray.RemoveAll();
+ m_OffsetArray.RemoveAll();
+ m_Buffer.Clear();
+ m_dwObjNum = 0;
+ m_index = 0;
+ return TRUE;
+}
+FX_INT32 CPDF_ObjectStream::CompressIndirectObject(FX_DWORD dwObjNum, const CPDF_Object *pObj)
+{
+ m_ObjNumArray.Add(dwObjNum);
+ m_OffsetArray.Add(m_Buffer.GetLength());
+ m_Buffer << pObj;
+ return 1;
+}
+FX_INT32 CPDF_ObjectStream::CompressIndirectObject(FX_DWORD dwObjNum, FX_LPCBYTE pBuffer, FX_DWORD dwSize)
+{
+ m_ObjNumArray.Add(dwObjNum);
+ m_OffsetArray.Add(m_Buffer.GetLength());
+ m_Buffer.AppendBlock(pBuffer, dwSize);
+ return 1;
+}
+FX_FILESIZE CPDF_ObjectStream::End(CPDF_Creator* pCreator)
+{
+ FXSYS_assert(pCreator);
+ if (m_ObjNumArray.GetSize() == 0) {
+ return 0;
+ }
+ CFX_FileBufferArchive *pFile = &pCreator->m_File;
+ CPDF_CryptoHandler *pHandler = pCreator->m_pCryptoHandler;
+ FX_FILESIZE ObjOffset = pCreator->m_Offset;
+ if (!m_dwObjNum) {
+ m_dwObjNum = ++pCreator->m_dwLastObjNum;
+ }
+ CFX_ByteTextBuf tempBuffer;
+ FX_INT32 iCount = m_ObjNumArray.GetSize();
+ for (FX_INT32 i = 0; i < iCount; i++) {
+ tempBuffer << m_ObjNumArray.ElementAt(i) << FX_BSTRC(" ") << m_OffsetArray.ElementAt(i) << FX_BSTRC(" ");
+ }
+ FX_FILESIZE &offset = pCreator->m_Offset;
+ FX_INT32 len = pFile->AppendDWord(m_dwObjNum);
+ if (len < 0) {
+ return -1;
+ }
+ offset += len;
+ if ((len = pFile->AppendString(FX_BSTRC(" 0 obj\r\n<</Type /ObjStm /N "))) < 0) {
+ return -1;
+ }
+ offset += len;
+ if ((len = pFile->AppendDWord((FX_DWORD)iCount)) < 0) {
+ return -1;
+ }
+ offset += len;
+ if (pFile->AppendString(FX_BSTRC("/First ")) < 0) {
+ return -1;
+ }
+ if ((len = pFile->AppendDWord((FX_DWORD)tempBuffer.GetLength())) < 0) {
+ return -1;
+ }
+ if (pFile->AppendString(FX_BSTRC("/Length ")) < 0) {
+ return -1;
+ }
+ offset += len + 15;
+ if (!pCreator->m_bCompress && !pHandler) {
+ if ((len = pFile->AppendDWord((FX_DWORD)(tempBuffer.GetLength() + m_Buffer.GetLength()))) < 0) {
+ return -1;
+ }
+ offset += len;
+ if ((len = pFile->AppendString(FX_BSTRC(">>stream\r\n"))) < 0) {
+ return -1;
+ }
+ if (pFile->AppendBlock(tempBuffer.GetBuffer(), tempBuffer.GetLength()) < 0) {
+ return -1;
+ }
+ if (pFile->AppendBlock(m_Buffer.GetBuffer(), m_Buffer.GetLength()) < 0) {
+ return -1;
+ }
+ offset += len + tempBuffer.GetLength() + m_Buffer.GetLength();
+ } else {
+ tempBuffer << m_Buffer;
+ CPDF_FlateEncoder encoder;
+ encoder.Initialize(tempBuffer.GetBuffer(), tempBuffer.GetLength(), pCreator->m_bCompress);
+ CPDF_Encryptor encryptor;
+ encryptor.Initialize(pHandler, m_dwObjNum, encoder.m_pData, encoder.m_dwSize);
+ if ((len = pFile->AppendDWord(encryptor.m_dwSize)) < 0) {
+ return -1;
+ }
+ offset += len;
+ if (pCreator->m_bCompress) {
+ if (pFile->AppendString(FX_BSTRC("/Filter /FlateDecode")) < 0) {
+ return -1;
+ }
+ offset += 20;
+ }
+ if ((len = pFile->AppendString(FX_BSTRC(">>stream\r\n"))) < 0) {
+ return -1;
+ }
+ if (pFile->AppendBlock(encryptor.m_pData, encryptor.m_dwSize) < 0) {
+ return -1;
+ }
+ offset += len + encryptor.m_dwSize;
+ }
+ if ((len = pFile->AppendString(FX_BSTRC("\r\nendstream\r\nendobj\r\n"))) < 0) {
+ return -1;
+ }
+ offset += len;
+ return ObjOffset;
+}
+CPDF_XRefStream::CPDF_XRefStream()
+ : m_PrevOffset(0)
+ , m_iSeg(0)
+ , m_dwTempObjNum(0)
+{
+}
+FX_BOOL CPDF_XRefStream::Start()
+{
+ m_IndexArray.RemoveAll();
+ m_Buffer.Clear();
+ m_iSeg = 0;
+ return TRUE;
+}
+FX_INT32 CPDF_XRefStream::CompressIndirectObject(FX_DWORD dwObjNum, const CPDF_Object *pObj, CPDF_Creator *pCreator)
+{
+ if (!pCreator) {
+ return 0;
+ }
+ m_ObjStream.CompressIndirectObject(dwObjNum, pObj);
+ if (m_ObjStream.m_ObjNumArray.GetSize() < pCreator->m_ObjectStreamSize &&
+ m_ObjStream.m_Buffer.GetLength() < PDF_OBJECTSTREAM_MAXLENGTH) {
+ return 1;
+ }
+ return EndObjectStream(pCreator);
+}
+FX_INT32 CPDF_XRefStream::CompressIndirectObject(FX_DWORD dwObjNum, FX_LPCBYTE pBuffer, FX_DWORD dwSize, CPDF_Creator *pCreator)
+{
+ if (!pCreator) {
+ return 0;
+ }
+ m_ObjStream.CompressIndirectObject(dwObjNum, pBuffer, dwSize);
+ if (m_ObjStream.m_ObjNumArray.GetSize() < pCreator->m_ObjectStreamSize &&
+ m_ObjStream.m_Buffer.GetLength() < PDF_OBJECTSTREAM_MAXLENGTH) {
+ return 1;
+ }
+ return EndObjectStream(pCreator);
+}
+static void _AppendIndex0(CFX_ByteTextBuf& buffer, FX_BOOL bFirstObject = TRUE)
+{
+ buffer.AppendByte(0);
+ buffer.AppendByte(0);
+ buffer.AppendByte(0);
+ buffer.AppendByte(0);
+ buffer.AppendByte(0);
+ if (bFirstObject) {
+ buffer.AppendByte(0xFF);
+ buffer.AppendByte(0xFF);
+ } else {
+ buffer.AppendByte(0);
+ buffer.AppendByte(0);
+ }
+}
+static void _AppendIndex1(CFX_ByteTextBuf& buffer, FX_FILESIZE offset)
+{
+ buffer.AppendByte(1);
+ buffer.AppendByte(FX_GETBYTEOFFSET24(offset));
+ buffer.AppendByte(FX_GETBYTEOFFSET16(offset));
+ buffer.AppendByte(FX_GETBYTEOFFSET8(offset));
+ buffer.AppendByte(FX_GETBYTEOFFSET0(offset));
+ buffer.AppendByte(0);
+ buffer.AppendByte(0);
+}
+static void _AppendIndex2(CFX_ByteTextBuf& buffer, FX_DWORD objnum, FX_INT32 index)
+{
+ buffer.AppendByte(2);
+ buffer.AppendByte(FX_GETBYTEOFFSET24(objnum));
+ buffer.AppendByte(FX_GETBYTEOFFSET16(objnum));
+ buffer.AppendByte(FX_GETBYTEOFFSET8(objnum));
+ buffer.AppendByte(FX_GETBYTEOFFSET0(objnum));
+ buffer.AppendByte(FX_GETBYTEOFFSET8(index));
+ buffer.AppendByte(FX_GETBYTEOFFSET0(index));
+}
+FX_INT32 CPDF_XRefStream::EndObjectStream(CPDF_Creator *pCreator, FX_BOOL bEOF)
+{
+ FX_FILESIZE objOffset = 0;
+ if (bEOF) {
+ objOffset = m_ObjStream.End(pCreator);
+ if (objOffset < 0) {
+ return -1;
+ }
+ }
+ FX_DWORD &dwObjStmNum = m_ObjStream.m_dwObjNum;
+ if (!dwObjStmNum) {
+ dwObjStmNum = ++pCreator->m_dwLastObjNum;
+ }
+ FX_INT32 iSize = m_ObjStream.m_ObjNumArray.GetSize();
+ FX_INT32 iSeg = m_IndexArray.GetSize() / 2;
+ if (!(pCreator->m_dwFlags & FPDFCREATE_INCREMENTAL)) {
+ if (m_dwTempObjNum == 0) {
+ _AppendIndex0(m_Buffer);
+ m_dwTempObjNum++;
+ }
+ FX_DWORD end_num = m_IndexArray.GetAt((iSeg - 1) * 2) + m_IndexArray.GetAt((iSeg - 1) * 2 + 1);
+ int index = 0;
+ for (; m_dwTempObjNum < end_num; m_dwTempObjNum++) {
+ FX_FILESIZE* offset = pCreator->m_ObjectOffset.GetPtrAt(m_dwTempObjNum);
+ if (offset) {
+ if (index >= iSize || m_dwTempObjNum != m_ObjStream.m_ObjNumArray[index]) {
+ _AppendIndex1(m_Buffer, *offset);
+ } else {
+ _AppendIndex2(m_Buffer, dwObjStmNum, index++);
+ }
+ } else {
+ _AppendIndex0(m_Buffer, FALSE);
+ }
+ }
+ if (iSize > 0 && bEOF) {
+ pCreator->m_ObjectOffset.Add(dwObjStmNum, 1);
+ pCreator->m_ObjectSize.Add(dwObjStmNum, 1);
+ pCreator->m_ObjectOffset[dwObjStmNum] = objOffset;
+ }
+ m_iSeg = iSeg;
+ if (bEOF) {
+ m_ObjStream.Start();
+ }
+ return 1;
+ }
+ FX_INT32 &j = m_ObjStream.m_index;
+ for (int i = m_iSeg; i < iSeg; i++) {
+ FX_DWORD start = m_IndexArray.ElementAt(i * 2);
+ FX_DWORD end = m_IndexArray.ElementAt(i * 2 + 1) + start;
+ for (FX_DWORD m = start; m < end; m++) {
+ if (j >= iSize || m != m_ObjStream.m_ObjNumArray.ElementAt(j)) {
+ _AppendIndex1(m_Buffer, pCreator->m_ObjectOffset[m]);
+ } else {
+ _AppendIndex2(m_Buffer, dwObjStmNum, j++);
+ }
+ }
+ }
+ if (iSize > 0 && bEOF) {
+ _AppendIndex1(m_Buffer, objOffset);
+ m_IndexArray.Add(dwObjStmNum);
+ m_IndexArray.Add(1);
+ iSeg += 1;
+ }
+ m_iSeg = iSeg;
+ if (bEOF) {
+ m_ObjStream.Start();
+ }
+ return 1;
+}
+FX_BOOL CPDF_XRefStream::GenerateXRefStream(CPDF_Creator* pCreator, FX_BOOL bEOF)
+{
+ FX_FILESIZE offset_tmp = pCreator->m_Offset;
+ FX_DWORD objnum = ++pCreator->m_dwLastObjNum;
+ CFX_FileBufferArchive *pFile = &pCreator->m_File;
+ FX_BOOL bIncremental = (pCreator->m_dwFlags & FPDFCREATE_INCREMENTAL) != 0;
+ if (bIncremental) {
+ AddObjectNumberToIndexArray(objnum);
+ } else {
+ for (; m_dwTempObjNum < pCreator->m_dwLastObjNum; m_dwTempObjNum++) {
+ FX_FILESIZE* offset = pCreator->m_ObjectOffset.GetPtrAt(m_dwTempObjNum);
+ if (offset) {
+ _AppendIndex1(m_Buffer, *offset);
+ } else {
+ _AppendIndex0(m_Buffer, FALSE);
+ }
+ }
+ }
+ _AppendIndex1(m_Buffer, offset_tmp);
+ FX_FILESIZE &offset = pCreator->m_Offset;
+ FX_INT32 len = pFile->AppendDWord(objnum);
+ if (len < 0) {
+ return FALSE;
+ }
+ offset += len;
+ if ((len = pFile->AppendString(FX_BSTRC(" 0 obj\r\n<</Type /XRef/W[1 4 2]/Index["))) < 0) {
+ return FALSE;
+ }
+ offset += len;
+ if (!bIncremental) {
+ if ((len = pFile->AppendDWord(0)) < 0) {
+ return FALSE;
+ }
+ if ((len = pFile->AppendString(FX_BSTRC(" "))) < 0) {
+ return FALSE;
+ }
+ offset += len + 1;
+ if ((len = pFile->AppendDWord(objnum + 1)) < 0) {
+ return FALSE;
+ }
+ offset += len;
+ } else {
+ FX_INT32 iSeg = m_IndexArray.GetSize() / 2;
+ for (FX_INT32 i = 0; i < iSeg; i++) {
+ if ((len = pFile->AppendDWord(m_IndexArray.ElementAt(i * 2))) < 0) {
+ return FALSE;
+ }
+ if (pFile->AppendString(FX_BSTRC(" ")) < 0) {
+ return FALSE;
+ }
+ offset += len + 1;
+ if ((len = pFile->AppendDWord(m_IndexArray.ElementAt(i * 2 + 1))) < 0) {
+ return FALSE;
+ }
+ if (pFile->AppendString(FX_BSTRC(" ")) < 0) {
+ return FALSE;
+ }
+ offset += len + 1;
+ }
+ }
+ if (pFile->AppendString(FX_BSTRC("]/Size ")) < 0) {
+ return FALSE;
+ }
+ if ((len = pFile->AppendDWord(objnum + 1)) < 0) {
+ return FALSE;
+ }
+ offset += len + 7;
+ if (m_PrevOffset > 0) {
+ if (pFile->AppendString(FX_BSTRC("/Prev ")) < 0) {
+ return -1;
+ }
+ FX_CHAR offset_buf[20];
+ FXSYS_memset32(offset_buf, 0, sizeof(offset_buf));
+ FXSYS_i64toa(m_PrevOffset, offset_buf, 10);
+ FX_INT32 len = (FX_INT32)FXSYS_strlen(offset_buf);
+ if (pFile->AppendBlock(offset_buf, len) < 0) {
+ return -1;
+ }
+ offset += len + 6;
+ }
+ FX_BOOL bPredictor = TRUE;
+ CPDF_FlateEncoder encoder;
+ encoder.Initialize(m_Buffer.GetBuffer(), m_Buffer.GetLength(), pCreator->m_bCompress, bPredictor);
+ if (pCreator->m_bCompress) {
+ if (pFile->AppendString(FX_BSTRC("/Filter /FlateDecode")) < 0) {
+ return FALSE;
+ }
+ offset += 20;
+ if (bPredictor) {
+ if ((len = pFile->AppendString(FX_BSTRC("/DecodeParms<</Columns 7/Predictor 12>>"))) < 0) {
+ return FALSE;
+ }
+ offset += len;
+ }
+ }
+ if (pFile->AppendString(FX_BSTRC("/Length ")) < 0) {
+ return FALSE;
+ }
+ if ((len = pFile->AppendDWord(encoder.m_dwSize)) < 0) {
+ return FALSE;
+ }
+ offset += len + 8;
+ if (bEOF) {
+ if ((len = PDF_CreatorWriteTrailer(pCreator->m_pDocument, pFile, pCreator->m_pIDArray, pCreator->m_bCompress)) < 0) {
+ return -1;
+ }
+ offset += len;
+ if (pCreator->m_pEncryptDict) {
+ FX_DWORD dwEncryptObjNum = pCreator->m_pEncryptDict->GetObjNum();
+ if (dwEncryptObjNum == 0) {
+ dwEncryptObjNum = pCreator->m_dwEnryptObjNum;
+ }
+ if ((len = PDF_CreatorWriteEncrypt(pCreator->m_pEncryptDict, dwEncryptObjNum, pFile)) < 0) {
+ return -1;
+ }
+ offset += len;
+ }
+ }
+ if ((len = pFile->AppendString(FX_BSTRC(">>stream\r\n"))) < 0) {
+ return FALSE;
+ }
+ offset += len;
+ if (pFile->AppendBlock(encoder.m_pData, encoder.m_dwSize) < 0) {
+ return FALSE;
+ }
+ if ((len = pFile->AppendString(FX_BSTRC("\r\nendstream\r\nendobj\r\n"))) < 0) {
+ return FALSE;
+ }
+ offset += encoder.m_dwSize + len;
+ m_PrevOffset = offset_tmp;
+ return TRUE;
+}
+FX_BOOL CPDF_XRefStream::End(CPDF_Creator *pCreator, FX_BOOL bEOF )
+{
+ if (EndObjectStream(pCreator, bEOF) < 0) {
+ return FALSE;
+ }
+ return GenerateXRefStream(pCreator, bEOF);
+}
+FX_BOOL CPDF_XRefStream::EndXRefStream(CPDF_Creator* pCreator)
+{
+ if (!(pCreator->m_dwFlags & FPDFCREATE_INCREMENTAL)) {
+ _AppendIndex0(m_Buffer);
+ for (FX_DWORD i = 1; i < pCreator->m_dwLastObjNum + 1; i++) {
+ FX_FILESIZE* offset = pCreator->m_ObjectOffset.GetPtrAt(i);
+ if (offset) {
+ _AppendIndex1(m_Buffer, *offset);
+ } else {
+ _AppendIndex0(m_Buffer, FALSE);
+ }
+ }
+ } else {
+ FX_INT32 iSeg = m_IndexArray.GetSize() / 2;
+ for (int i = 0; i < iSeg; i++) {
+ FX_DWORD start = m_IndexArray.ElementAt(i * 2);
+ FX_DWORD end = m_IndexArray.ElementAt(i * 2 + 1) + start;
+ for (FX_DWORD j = start; j < end; j++) {
+ _AppendIndex1(m_Buffer, pCreator->m_ObjectOffset[j]);
+ }
+ }
+ }
+ return GenerateXRefStream(pCreator, FALSE);
+}
+FX_BOOL CPDF_XRefStream::AddObjectNumberToIndexArray(FX_DWORD objnum)
+{
+ FX_INT32 iSize = m_IndexArray.GetSize();
+ if (iSize == 0) {
+ m_IndexArray.Add(objnum);
+ m_IndexArray.Add(1);
+ } else {
+ FXSYS_assert(iSize > 1);
+ FX_DWORD startobjnum = m_IndexArray.ElementAt(iSize - 2);
+ FX_INT32 iCount = m_IndexArray.ElementAt(iSize - 1);
+ if (objnum == startobjnum + iCount) {
+ m_IndexArray[iSize - 1] = iCount + 1;
+ } else {
+ m_IndexArray.Add(objnum);
+ m_IndexArray.Add(1);
+ }
+ }
+ return TRUE;
+}
+CPDF_Creator::CPDF_Creator(CPDF_Document* pDoc)
+{
+ m_pDocument = pDoc;
+ m_pParser = (CPDF_Parser*)pDoc->m_pParser;
+ m_bCompress = TRUE;
+ if (m_pParser) {
+ m_pEncryptDict = m_pParser->GetEncryptDict();
+ m_pCryptoHandler = m_pParser->GetCryptoHandler();
+ } else {
+ m_pEncryptDict = NULL;
+ m_pCryptoHandler = NULL;
+ }
+ m_bSecurityChanged = FALSE;
+ m_bStandardSecurity = FALSE;
+ m_pMetadata = NULL;
+ m_bEncryptCloned = FALSE;
+ m_bEncryptMetadata = FALSE;
+ m_Offset = 0;
+ m_iStage = -1;
+ m_dwFlags = 0;
+ m_Pos = NULL;
+ m_XrefStart = 0;
+ m_pXRefStream = NULL;
+ m_ObjectStreamSize = 200;
+ m_dwLastObjNum = m_pDocument->GetLastObjNum();
+ m_pIDArray = NULL;
+ m_FileVersion = 0;
+ m_dwEnryptObjNum = 0;
+ m_bNewCrypto = FALSE;
+}
+CPDF_Creator::~CPDF_Creator()
+{
+ ResetStandardSecurity();
+ if (m_bEncryptCloned && m_pEncryptDict) {
+ m_pEncryptDict->Release();
+ m_pEncryptDict = NULL;
+ }
+ Clear();
+}
+static FX_BOOL _IsXRefNeedEnd(CPDF_XRefStream* pXRef, FX_DWORD flag)
+{
+ if (!(flag & FPDFCREATE_INCREMENTAL)) {
+ return FALSE;
+ }
+ FX_INT32 iSize = pXRef->m_IndexArray.GetSize() / 2;
+ FX_INT32 iCount = 0;
+ for (FX_INT32 i = 0; i < iSize; i++) {
+ iCount += pXRef->m_IndexArray.ElementAt(i * 2 + 1);
+ }
+ return (iCount >= PDF_XREFSTREAM_MAXSIZE);
+}
+FX_INT32 CPDF_Creator::WriteIndirectObjectToStream(const CPDF_Object* pObj)
+{
+ if (!m_pXRefStream) {
+ return 1;
+ }
+ FX_DWORD objnum = pObj->GetObjNum();
+ if (m_pParser && m_pParser->m_ObjVersion.GetSize() > (FX_INT32)objnum && m_pParser->m_ObjVersion[objnum] > 0) {
+ return 1;
+ }
+ if (pObj->GetType() == PDFOBJ_NUMBER) {
+ return 1;
+ }
+ CPDF_Dictionary *pDict = pObj->GetDict();
+ if (pObj->GetType() == PDFOBJ_STREAM) {
+ if (pDict && pDict->GetString(FX_BSTRC("Type")) == FX_BSTRC("XRef")) {
+ return 0;
+ }
+ return 1;
+ }
+ if (pDict) {
+ if (pDict == m_pDocument->m_pRootDict || pDict == m_pEncryptDict) {
+ return 1;
+ }
+ if (IsSignatureDict(pDict)) {
+ return 1;
+ }
+ if (pDict->GetString(FX_BSTRC("Type")) == FX_BSTRC("Page")) {
+ return 1;
+ }
+ }
+ m_pXRefStream->AddObjectNumberToIndexArray(objnum);
+ if (m_pXRefStream->CompressIndirectObject(objnum, pObj, this) < 0) {
+ return -1;
+ }
+ if (!_IsXRefNeedEnd(m_pXRefStream, m_dwFlags)) {
+ return 0;
+ }
+ if (!m_pXRefStream->End(this)) {
+ return -1;
+ }
+ if (!m_pXRefStream->Start()) {
+ return -1;
+ }
+ return 0;
+}
+FX_INT32 CPDF_Creator::WriteIndirectObjectToStream(FX_DWORD objnum, FX_LPCBYTE pBuffer, FX_DWORD dwSize)
+{
+ if (!m_pXRefStream) {
+ return 1;
+ }
+ m_pXRefStream->AddObjectNumberToIndexArray(objnum);
+ FX_INT32 iRet = m_pXRefStream->CompressIndirectObject(objnum, pBuffer, dwSize, this);
+ if (iRet < 1) {
+ return iRet;
+ }
+ if (!_IsXRefNeedEnd(m_pXRefStream, m_dwFlags)) {
+ return 0;
+ }
+ if (!m_pXRefStream->End(this)) {
+ return -1;
+ }
+ if (!m_pXRefStream->Start()) {
+ return -1;
+ }
+ return 0;
+}
+FX_INT32 CPDF_Creator::AppendObjectNumberToXRef(FX_DWORD objnum)
+{
+ if (!m_pXRefStream) {
+ return 1;
+ }
+ m_pXRefStream->AddObjectNumberToIndexArray(objnum);
+ if (!_IsXRefNeedEnd(m_pXRefStream, m_dwFlags)) {
+ return 0;
+ }
+ if (!m_pXRefStream->End(this)) {
+ return -1;
+ }
+ if (!m_pXRefStream->Start()) {
+ return -1;
+ }
+ return 0;
+}
+FX_INT32 CPDF_Creator::WriteStream(const CPDF_Object* pStream, FX_DWORD objnum, CPDF_CryptoHandler* pCrypto)
+{
+ CPDF_FlateEncoder encoder;
+ encoder.Initialize((CPDF_Stream*)pStream, pStream == m_pMetadata ? FALSE : m_bCompress);
+ CPDF_Encryptor encryptor;
+ if(!encryptor.Initialize(pCrypto, objnum, encoder.m_pData, encoder.m_dwSize)) {
+ return -1;
+ }
+ if ((FX_DWORD)encoder.m_pDict->GetInteger(FX_BSTRC("Length")) != encryptor.m_dwSize) {
+ encoder.CloneDict();
+ encoder.m_pDict->SetAtInteger(FX_BSTRC("Length"), encryptor.m_dwSize);
+ }
+ if (WriteDirectObj(objnum, encoder.m_pDict) < 0) {
+ return -1;
+ }
+ int len = m_File.AppendString(FX_BSTRC("stream\r\n"));
+ if (len < 0) {
+ return -1;
+ }
+ m_Offset += len;
+ if (m_File.AppendBlock(encryptor.m_pData, encryptor.m_dwSize) < 0) {
+ return -1;
+ }
+ m_Offset += encryptor.m_dwSize;
+ if ((len = m_File.AppendString(FX_BSTRC("\r\nendstream"))) < 0) {
+ return -1;
+ }
+ m_Offset += len;
+ return 1;
+}
+FX_INT32 CPDF_Creator::WriteIndirectObj(FX_DWORD objnum, const CPDF_Object* pObj)
+{
+ FX_INT32 len = m_File.AppendDWord(objnum);
+ if (len < 0) {
+ return -1;
+ }
+ m_Offset += len;
+ if ((len = m_File.AppendString(FX_BSTRC(" 0 obj\r\n"))) < 0) {
+ return -1;
+ }
+ m_Offset += len;
+ if (pObj->GetType() == PDFOBJ_STREAM) {
+ CPDF_CryptoHandler *pHandler = NULL;
+ pHandler = (pObj == m_pMetadata && !m_bEncryptMetadata) ? NULL : m_pCryptoHandler;
+ if (WriteStream(pObj, objnum, pHandler) < 0) {
+ return -1;
+ }
+ } else {
+ if (WriteDirectObj(objnum, pObj) < 0) {
+ return -1;
+ }
+ }
+ if ((len = m_File.AppendString(FX_BSTRC("\r\nendobj\r\n"))) < 0) {
+ return -1;
+ }
+ m_Offset += len;
+ if (AppendObjectNumberToXRef(objnum) < 0) {
+ return -1;
+ }
+ return 0;
+}
+FX_INT32 CPDF_Creator::WriteIndirectObj(const CPDF_Object* pObj)
+{
+ FX_INT32 iRet = WriteIndirectObjectToStream(pObj);
+ if (iRet < 1) {
+ return iRet;
+ }
+ return WriteIndirectObj(pObj->GetObjNum(), pObj);
+}
+FX_INT32 CPDF_Creator::WriteDirectObj(FX_DWORD objnum, const CPDF_Object* pObj, FX_BOOL bEncrypt)
+{
+ FX_INT32 len = 0;
+ if (pObj == NULL) {
+ if (m_File.AppendString(FX_BSTRC(" null")) < 0) {
+ return -1;
+ }
+ m_Offset += 5;
+ return 1;
+ }
+ switch (pObj->GetType()) {
+ case PDFOBJ_NULL:
+ if (m_File.AppendString(FX_BSTRC(" null")) < 0) {
+ return -1;
+ }
+ m_Offset += 5;
+ break;
+ case PDFOBJ_BOOLEAN:
+ case PDFOBJ_NUMBER:
+ if (m_File.AppendString(FX_BSTRC(" ")) < 0) {
+ return -1;
+ }
+ if ((len = m_File.AppendString(pObj->GetString())) < 0) {
+ return -1;
+ }
+ m_Offset += len + 1;
+ break;
+ case PDFOBJ_STRING: {
+ CFX_ByteString str = pObj->GetString();
+ FX_BOOL bHex = ((CPDF_String*)pObj)->IsHex();
+ if (m_pCryptoHandler == NULL || !bEncrypt) {
+ CFX_ByteString content = PDF_EncodeString(str, bHex);
+ if ((len = m_File.AppendString(content)) < 0) {
+ return -1;
+ }
+ m_Offset += len;
+ break;
+ }
+ CPDF_Encryptor encryptor;
+ encryptor.Initialize(m_pCryptoHandler, objnum, (FX_LPBYTE)(FX_LPCSTR)str, str.GetLength());
+ CFX_ByteString content = PDF_EncodeString(CFX_ByteString((FX_LPCSTR)encryptor.m_pData, encryptor.m_dwSize), bHex);
+ if ((len = m_File.AppendString(content)) < 0) {
+ return -1;
+ }
+ m_Offset += len;
+ break;
+ }
+ case PDFOBJ_STREAM: {
+ CPDF_FlateEncoder encoder;
+ encoder.Initialize((CPDF_Stream*)pObj, m_bCompress);
+ CPDF_Encryptor encryptor;
+ CPDF_CryptoHandler* pHandler = m_pCryptoHandler;
+ encryptor.Initialize(pHandler, objnum, encoder.m_pData, encoder.m_dwSize);
+ if ((FX_DWORD)encoder.m_pDict->GetInteger(FX_BSTRC("Length")) != encryptor.m_dwSize) {
+ encoder.CloneDict();
+ encoder.m_pDict->SetAtInteger(FX_BSTRC("Length"), encryptor.m_dwSize);
+ }
+ if (WriteDirectObj(objnum, encoder.m_pDict) < 0) {
+ return -1;
+ }
+ if ((len = m_File.AppendString(FX_BSTRC("stream\r\n"))) < 0) {
+ return -1;
+ }
+ m_Offset += len;
+ if (m_File.AppendBlock(encryptor.m_pData, encryptor.m_dwSize) < 0) {
+ return -1;
+ }
+ m_Offset += encryptor.m_dwSize;
+ if ((len = m_File.AppendString(FX_BSTRC("\r\nendstream"))) < 0) {
+ return -1;
+ }
+ m_Offset += len;
+ break;
+ }
+ case PDFOBJ_NAME: {
+ if (m_File.AppendString(FX_BSTRC("/")) < 0) {
+ return -1;
+ }
+ CFX_ByteString str = pObj->GetString();
+ if ((len = m_File.AppendString(PDF_NameEncode(str))) < 0) {
+ return -1;
+ }
+ m_Offset += len + 1;
+ break;
+ }
+ case PDFOBJ_REFERENCE: {
+ if (m_File.AppendString(FX_BSTRC(" ")) < 0) {
+ return -1;
+ }
+ CPDF_Reference* p = (CPDF_Reference*)pObj;
+ if ((len = m_File.AppendDWord(p->GetRefObjNum())) < 0) {
+ return -1;
+ }
+ if (m_File.AppendString(FX_BSTRC(" 0 R")) < 0) {
+ return -1;
+ }
+ m_Offset += len + 5;
+ break;
+ }
+ case PDFOBJ_ARRAY: {
+ if (m_File.AppendString(FX_BSTRC("[")) < 0) {
+ return -1;
+ }
+ m_Offset += 1;
+ CPDF_Array* p = (CPDF_Array*)pObj;
+ for (FX_DWORD i = 0; i < p->GetCount(); i ++) {
+ CPDF_Object* pElement = p->GetElement(i);
+ if (pElement->GetObjNum()) {
+ if (m_File.AppendString(FX_BSTRC(" ")) < 0) {
+ return -1;
+ }
+ if ((len = m_File.AppendDWord(pElement->GetObjNum())) < 0) {
+ return -1;
+ }
+ if (m_File.AppendString(FX_BSTRC(" 0 R")) < 0) {
+ return -1;
+ }
+ m_Offset += len + 5;
+ } else {
+ if (WriteDirectObj(objnum, pElement) < 0) {
+ return -1;
+ }
+ }
+ }
+ if (m_File.AppendString(FX_BSTRC("]")) < 0) {
+ return -1;
+ }
+ m_Offset += 1;
+ break;
+ }
+ case PDFOBJ_DICTIONARY: {
+ if (m_pCryptoHandler == NULL || pObj == m_pEncryptDict) {
+ return PDF_CreatorAppendObject(pObj, &m_File, m_Offset);
+ }
+ if (m_File.AppendString(FX_BSTRC("<<")) < 0) {
+ return -1;
+ }
+ m_Offset += 2;
+ CPDF_Dictionary* p = (CPDF_Dictionary*)pObj;
+ FX_BOOL bSignDict = IsSignatureDict(p);
+ FX_POSITION pos = p->GetStartPos();
+ while (pos) {
+ FX_BOOL bSignValue = FALSE;
+ CFX_ByteString key;
+ CPDF_Object* pValue = p->GetNextElement(pos, key);
+ if (m_File.AppendString(FX_BSTRC("/")) < 0) {
+ return -1;
+ }
+ if ((len = m_File.AppendString(PDF_NameEncode(key))) < 0) {
+ return -1;
+ }
+ m_Offset += len + 1;
+ if (bSignDict && key == FX_BSTRC("Contents")) {
+ bSignValue = TRUE;
+ }
+ if (pValue->GetObjNum()) {
+ if (m_File.AppendString(FX_BSTRC(" ")) < 0) {
+ return -1;
+ }
+ if ((len = m_File.AppendDWord(pValue->GetObjNum())) < 0) {
+ return -1;
+ }
+ if (m_File.AppendString(FX_BSTRC(" 0 R ")) < 0) {
+ return -1;
+ }
+ m_Offset += len + 6;
+ } else {
+ if (WriteDirectObj(objnum, pValue, !bSignValue) < 0) {
+ return -1;
+ }
+ }
+ }
+ if (m_File.AppendString(FX_BSTRC(">>")) < 0) {
+ return -1;
+ }
+ m_Offset += 2;
+ break;
+ }
+ }
+ return 1;
+}
+FX_INT32 CPDF_Creator::WriteOldIndirectObject(FX_DWORD objnum)
+{
+ if(m_pParser->m_V5Type[objnum] == 0 || m_pParser->m_V5Type[objnum] == 255) {
+ return 0;
+ }
+ m_ObjectOffset[objnum] = m_Offset;
+ FX_LPVOID valuetemp = NULL;
+ FX_BOOL bExistInMap = m_pDocument->m_IndirectObjs.Lookup((FX_LPVOID)(FX_UINTPTR)objnum, valuetemp);
+ FX_BOOL bObjStm = (m_pParser->m_V5Type[objnum] == 2) && m_pEncryptDict && !m_pXRefStream;
+ if(m_pParser->m_bVersionUpdated || m_bSecurityChanged || bExistInMap || bObjStm) {
+ CPDF_Object* pObj = m_pDocument->GetIndirectObject(objnum);
+ if (pObj == NULL) {
+ m_ObjectOffset[objnum] = 0;
+ m_ObjectSize[objnum] = 0;
+ return 0;
+ }
+ if (WriteIndirectObj(pObj)) {
+ return -1;
+ }
+ if (!bExistInMap) {
+ m_pDocument->ReleaseIndirectObject(objnum);
+ }
+ } else {
+ FX_BYTE* pBuffer;
+ FX_DWORD size;
+ m_pParser->GetIndirectBinary(objnum, pBuffer, size);
+ if (pBuffer == NULL) {
+ return 0;
+ }
+ if (m_pParser->m_V5Type[objnum] == 2) {
+ if (m_pXRefStream) {
+ if (WriteIndirectObjectToStream(objnum, pBuffer, size) < 0) {
+ FX_Free(pBuffer);
+ return -1;
+ }
+ } else {
+ FX_INT32 len = m_File.AppendDWord(objnum);
+ if (len < 0) {
+ return -1;
+ }
+ if (m_File.AppendString(FX_BSTRC(" 0 obj ")) < 0) {
+ return -1;
+ }
+ m_Offset += len + 7;
+ if (m_File.AppendBlock(pBuffer, size) < 0) {
+ return -1;
+ }
+ m_Offset += size;
+ if (m_File.AppendString(FX_BSTRC("\r\nendobj\r\n")) < 0) {
+ return -1;
+ }
+ m_Offset += 10;
+ }
+ } else {
+ if (m_File.AppendBlock(pBuffer, size) < 0) {
+ return -1;
+ }
+ m_Offset += size;
+ if(AppendObjectNumberToXRef(objnum) < 0) {
+ return -1;
+ }
+ }
+ FX_Free(pBuffer);
+ }
+ return 1;
+}
+FX_INT32 CPDF_Creator::WriteOldObjs(IFX_Pause *pPause)
+{
+ FX_DWORD nOldSize = m_pParser->m_CrossRef.GetSize();
+ FX_DWORD objnum = (FX_DWORD)(FX_UINTPTR)m_Pos;
+ for(; objnum < nOldSize; objnum ++) {
+ FX_INT32 iRet = WriteOldIndirectObject(objnum);
+ if (!iRet) {
+ continue;
+ }
+ if (iRet < 0) {
+ return iRet;
+ }
+ m_ObjectSize[objnum] = (FX_DWORD)(m_Offset - m_ObjectOffset[objnum]);
+ if (pPause && pPause->NeedToPauseNow()) {
+ m_Pos = (FX_LPVOID)(FX_UINTPTR)(objnum + 1);
+ return 1;
+ }
+ }
+ return 0;
+}
+FX_INT32 CPDF_Creator::WriteNewObjs(FX_BOOL bIncremental, IFX_Pause *pPause)
+{
+ FX_INT32 iCount = m_NewObjNumArray.GetSize();
+ FX_INT32 index = (FX_INT32)(FX_UINTPTR)m_Pos;
+ while (index < iCount) {
+ FX_DWORD objnum = m_NewObjNumArray.ElementAt(index);
+ CPDF_Object *pObj = NULL;
+ m_pDocument->m_IndirectObjs.Lookup((FX_LPVOID)(FX_UINTPTR)objnum, (FX_LPVOID&)pObj);
+ if (NULL == pObj) {
+ ++index;
+ continue;
+ }
+ m_ObjectOffset[objnum] = m_Offset;
+ if (WriteIndirectObj(pObj)) {
+ return -1;
+ }
+ m_ObjectSize[objnum] = (FX_DWORD)(m_Offset - m_ObjectOffset[objnum]);
+ index++;
+ if (pPause && pPause->NeedToPauseNow()) {
+ m_Pos = (FX_POSITION)(FX_UINTPTR)index;
+ return 1;
+ }
+ }
+ return 0;
+}
+void CPDF_Creator::InitOldObjNumOffsets()
+{
+ if (!m_pParser) {
+ return;
+ }
+ FX_DWORD j = 0;
+ FX_DWORD dwStart = 0;
+ FX_DWORD dwEnd = m_pParser->GetLastObjNum();
+ while (dwStart <= dwEnd) {
+ while (dwStart <= dwEnd && (m_pParser->m_V5Type[dwStart] == 0 || m_pParser->m_V5Type[dwStart] == 255)) {
+ dwStart++;
+ }
+ if (dwStart > dwEnd) {
+ break;
+ }
+ j = dwStart;
+ while (j <= dwEnd && m_pParser->m_V5Type[j] != 0 && m_pParser->m_V5Type[j] != 255) {
+ j++;
+ }
+ m_ObjectOffset.Add(dwStart, j - dwStart);
+ m_ObjectSize.Add(dwStart, j - dwStart);
+ dwStart = j;
+ }
+}
+void CPDF_Creator::InitNewObjNumOffsets()
+{
+ FX_BOOL bIncremental = (m_dwFlags & FPDFCREATE_INCREMENTAL) != 0;
+ FX_BOOL bNoOriginal = (m_dwFlags & FPDFCREATE_NO_ORIGINAL) != 0;
+ FX_DWORD nOldSize = m_pParser ? m_pParser->m_CrossRef.GetSize() : 0;
+ FX_POSITION pos = m_pDocument->m_IndirectObjs.GetStartPosition();
+ while (pos) {
+ size_t key = 0;
+ CPDF_Object* pObj;
+ m_pDocument->m_IndirectObjs.GetNextAssoc(pos, (FX_LPVOID&)key, (FX_LPVOID&)pObj);
+ FX_DWORD objnum = (FX_DWORD)key;
+ if (pObj->GetObjNum() == -1) {
+ continue;
+ }
+ if (bIncremental) {
+ if (!pObj->IsModified()) {
+ continue;
+ }
+ } else {
+ if (objnum < nOldSize && m_pParser->m_V5Type[objnum] != 0) {
+ continue;
+ }
+ }
+ AppendNewObjNum(objnum);
+ }
+ FX_INT32 iCount = m_NewObjNumArray.GetSize();
+ if (iCount == 0) {
+ return;
+ }
+ FX_INT32 i = 0;
+ FX_DWORD dwStartObjNum = 0;
+ FX_BOOL bCrossRefValid = m_pParser && m_pParser->GetLastXRefOffset() > 0;
+ while (i < iCount) {
+ dwStartObjNum = m_NewObjNumArray.ElementAt(i);
+ if ((bIncremental && (bNoOriginal || bCrossRefValid)) || !m_ObjectOffset.GetPtrAt(dwStartObjNum)) {
+ break;
+ }
+ i++;
+ }
+ if (i >= iCount) {
+ return;
+ }
+ FX_DWORD dwLastObjNum = dwStartObjNum;
+ i++;
+ FX_BOOL bNewStart = FALSE;
+ for (; i < iCount; i++) {
+ FX_DWORD dwCurObjNum = m_NewObjNumArray.ElementAt(i);
+ FX_BOOL bExist = (dwCurObjNum < nOldSize && m_ObjectOffset.GetPtrAt(dwCurObjNum) != NULL);
+ if (bExist || dwCurObjNum - dwLastObjNum > 1) {
+ if (!bNewStart) {
+ m_ObjectOffset.Add(dwStartObjNum, dwLastObjNum - dwStartObjNum + 1);
+ m_ObjectSize.Add(dwStartObjNum, dwLastObjNum - dwStartObjNum + 1);
+ }
+ dwStartObjNum = dwCurObjNum;
+ }
+ if (bNewStart) {
+ dwStartObjNum = dwCurObjNum;
+ }
+ bNewStart = bExist;
+ dwLastObjNum = dwCurObjNum;
+ }
+ m_ObjectOffset.Add(dwStartObjNum, dwLastObjNum - dwStartObjNum + 1);
+ m_ObjectSize.Add(dwStartObjNum, dwLastObjNum - dwStartObjNum + 1);
+}
+void CPDF_Creator::AppendNewObjNum(FX_DWORD objbum)
+{
+ FX_INT32 iStart = 0, iFind = 0;
+ FX_INT32 iEnd = m_NewObjNumArray.GetUpperBound();
+ while (iStart <= iEnd) {
+ FX_INT32 iMid = (iStart + iEnd) / 2;
+ FX_DWORD dwMid = m_NewObjNumArray.ElementAt(iMid);
+ if (objbum < dwMid) {
+ iEnd = iMid - 1;
+ } else {
+ if (iMid == iEnd) {
+ iFind = iMid + 1;
+ break;
+ }
+ FX_DWORD dwNext = m_NewObjNumArray.ElementAt(iMid + 1);
+ if (objbum < dwNext) {
+ iFind = iMid + 1;
+ break;
+ }
+ iStart = iMid + 1;
+ }
+ }
+ m_NewObjNumArray.InsertAt(iFind, objbum);
+}
+FX_INT32 CPDF_Creator::WriteDoc_Stage1(IFX_Pause *pPause)
+{
+ FXSYS_assert(m_iStage > -1 || m_iStage < 20);
+ if (m_iStage == 0) {
+ if (m_pParser == NULL) {
+ m_dwFlags &= ~FPDFCREATE_INCREMENTAL;
+ }
+ if (m_bSecurityChanged && (m_dwFlags & FPDFCREATE_NO_ORIGINAL) == 0) {
+ m_dwFlags &= ~FPDFCREATE_INCREMENTAL;
+ }
+ m_pMetadata = m_pDocument->GetRoot()->GetElementValue(FX_BSTRC("Metadata"));
+ if (m_dwFlags & FPDFCREATE_OBJECTSTREAM) {
+ m_pXRefStream = FX_NEW CPDF_XRefStream;
+ m_pXRefStream->Start();
+ if ((m_dwFlags & FPDFCREATE_INCREMENTAL) != 0 && m_pParser) {
+ FX_FILESIZE prev = m_pParser->GetLastXRefOffset();
+ m_pXRefStream->m_PrevOffset = prev;
+ }
+ }
+ m_iStage = 10;
+ }
+ if (m_iStage == 10) {
+ if ((m_dwFlags & FPDFCREATE_INCREMENTAL) == 0) {
+ if (m_File.AppendString(FX_BSTRC("%PDF-1.")) < 0) {
+ return -1;
+ }
+ m_Offset += 7;
+ FX_INT32 version = 7;
+ if (m_FileVersion) {
+ version = m_FileVersion;
+ } else if (m_pParser) {
+ version = m_pParser->GetFileVersion();
+ }
+ FX_INT32 len = m_File.AppendDWord(version % 10);
+ if (len < 0) {
+ return -1;
+ }
+ m_Offset += len;
+ if ((len = m_File.AppendString(FX_BSTRC("\r\n%\xA1\xB3\xC5\xD7\r\n"))) < 0) {
+ return -1;
+ }
+ m_Offset += len;
+ InitOldObjNumOffsets();
+ m_iStage = 20;
+ } else {
+ IFX_FileRead* pSrcFile = m_pParser->GetFileAccess();
+ m_Offset = pSrcFile->GetSize();
+ m_Pos = (FX_LPVOID)(FX_UINTPTR)m_Offset;
+ m_iStage = 15;
+ }
+ }
+ if (m_iStage == 15) {
+ if ((m_dwFlags & FPDFCREATE_NO_ORIGINAL) == 0 && m_Pos) {
+ IFX_FileRead* pSrcFile = m_pParser->GetFileAccess();
+ FX_BYTE buffer[4096];
+ FX_DWORD src_size = (FX_DWORD)(FX_UINTPTR)m_Pos;
+ while (src_size) {
+ FX_DWORD block_size = src_size > 4096 ? 4096 : src_size;
+ if (!pSrcFile->ReadBlock(buffer, m_Offset - src_size, block_size)) {
+ return -1;
+ }
+ if (m_File.AppendBlock(buffer, block_size) < 0) {
+ return -1;
+ }
+ src_size -= block_size;
+ if (pPause && pPause->NeedToPauseNow()) {
+ m_Pos = (FX_LPVOID)(FX_UINTPTR)src_size;
+ return 1;
+ }
+ }
+ }
+ if ((m_dwFlags & FPDFCREATE_NO_ORIGINAL) == 0 && m_pParser->GetLastXRefOffset() == 0) {
+ InitOldObjNumOffsets();
+ FX_DWORD dwEnd = m_pParser->GetLastObjNum();
+ FX_BOOL bObjStm = (m_dwFlags & FPDFCREATE_OBJECTSTREAM) != 0;
+ for (FX_DWORD objnum = 0; objnum <= dwEnd; objnum++) {
+ if (m_pParser->m_V5Type[objnum] == 0 || m_pParser->m_V5Type[objnum] == 255) {
+ continue;
+ }
+ m_ObjectOffset[objnum] = m_pParser->m_CrossRef[objnum];
+ if (bObjStm) {
+ m_pXRefStream->AddObjectNumberToIndexArray(objnum);
+ }
+ }
+ if (bObjStm) {
+ m_pXRefStream->EndXRefStream(this);
+ m_pXRefStream->Start();
+ }
+ }
+ m_iStage = 20;
+ }
+ InitNewObjNumOffsets();
+ return m_iStage;
+}
+FX_INT32 CPDF_Creator::WriteDoc_Stage2(IFX_Pause *pPause)
+{
+ FXSYS_assert(m_iStage >= 20 || m_iStage < 30);
+ if (m_iStage == 20) {
+ if ((m_dwFlags & FPDFCREATE_INCREMENTAL) == 0 && m_pParser) {
+ m_Pos = (FX_LPVOID)(FX_UINTPTR)0;
+ m_iStage = 21;
+ } else {
+ m_iStage = 25;
+ }
+ }
+ if (m_iStage == 21) {
+ FX_INT32 iRet = WriteOldObjs(pPause);
+ if (iRet) {
+ return iRet;
+ }
+ m_iStage = 25;
+ }
+ if (m_iStage == 25) {
+ m_Pos = (FX_LPVOID)(FX_UINTPTR)0;
+ m_iStage = 26;
+ }
+ if (m_iStage == 26) {
+ FX_INT32 iRet = WriteNewObjs((m_dwFlags & FPDFCREATE_INCREMENTAL) != 0, pPause);
+ if (iRet) {
+ return iRet;
+ }
+ m_iStage = 27;
+ }
+ if (m_iStage == 27) {
+ if (NULL != m_pEncryptDict && 0 == m_pEncryptDict->GetObjNum()) {
+ m_dwLastObjNum += 1;
+ FX_FILESIZE saveOffset = m_Offset;
+ if (WriteIndirectObj(m_dwLastObjNum, m_pEncryptDict) < 0) {
+ return -1;
+ }
+ m_ObjectOffset.Add(m_dwLastObjNum, 1);
+ m_ObjectOffset[m_dwLastObjNum] = saveOffset;
+ m_ObjectSize.Add(m_dwLastObjNum, 1);
+ m_ObjectSize[m_dwLastObjNum] = m_Offset - saveOffset;
+ m_dwEnryptObjNum = m_dwLastObjNum;
+ if (m_dwFlags & FPDFCREATE_INCREMENTAL) {
+ m_NewObjNumArray.Add(m_dwLastObjNum);
+ }
+ }
+ m_iStage = 80;
+ }
+ return m_iStage;
+}
+FX_INT32 CPDF_Creator::WriteDoc_Stage3(IFX_Pause *pPause)
+{
+ FXSYS_assert(m_iStage >= 80 || m_iStage < 90);
+ FX_DWORD dwLastObjNum = m_dwLastObjNum;
+ if (m_iStage == 80) {
+ m_XrefStart = m_Offset;
+ if (m_dwFlags & FPDFCREATE_OBJECTSTREAM) {
+ m_pXRefStream->End(this, TRUE);
+ m_XrefStart = m_pXRefStream->m_PrevOffset;
+ m_iStage = 90;
+ } else if ((m_dwFlags & FPDFCREATE_INCREMENTAL) == 0 || !m_pParser->IsXRefStream()) {
+ if ((m_dwFlags & FPDFCREATE_INCREMENTAL) == 0 || m_pParser->GetLastXRefOffset() == 0) {
+ CFX_ByteString str;
+ str = m_ObjectOffset.GetPtrAt(1) ? FX_BSTRC("xref\r\n") : FX_BSTRC("xref\r\n0 1\r\n0000000000 65536 f\r\n");
+ if (m_File.AppendString(str) < 0) {
+ return -1;
+ }
+ m_Pos = (FX_LPVOID)(FX_UINTPTR)1;
+ m_iStage = 81;
+ } else {
+ if (m_File.AppendString(FX_BSTRC("xref\r\n")) < 0) {
+ return -1;
+ }
+ m_Pos = (FX_LPVOID)(FX_UINTPTR)0;
+ m_iStage = 82;
+ }
+ } else {
+ m_iStage = 90;
+ }
+ }
+ if (m_iStage == 81) {
+ CFX_ByteString str;
+ FX_DWORD i = (FX_DWORD)(FX_UINTPTR)m_Pos, j;
+ while (i <= dwLastObjNum) {
+ while (i <= dwLastObjNum && !m_ObjectOffset.GetPtrAt(i)) {
+ i++;
+ }
+ if (i > dwLastObjNum) {
+ break;
+ }
+ j = i;
+ while (j <= dwLastObjNum && m_ObjectOffset.GetPtrAt(j)) {
+ j++;
+ }
+ if (i == 1) {
+ str.Format("0 %d\r\n0000000000 65536 f\r\n", j);
+ } else {
+ str.Format("%d %d\r\n", i, j - i);
+ }
+ if (m_File.AppendBlock((FX_LPCSTR)str, str.GetLength()) < 0) {
+ return -1;
+ }
+ while (i < j) {
+ str.Format("%010d 00000 n\r\n", m_ObjectOffset[i ++]);
+ if (m_File.AppendBlock((FX_LPCSTR)str, str.GetLength()) < 0) {
+ return -1;
+ }
+ }
+ if (i > dwLastObjNum) {
+ break;
+ }
+ if (pPause && pPause->NeedToPauseNow()) {
+ m_Pos = (FX_LPVOID)(FX_UINTPTR)i;
+ return 1;
+ }
+ }
+ m_iStage = 90;
+ }
+ if (m_iStage == 82) {
+ CFX_ByteString str;
+ FX_INT32 iCount = m_NewObjNumArray.GetSize();
+ FX_INT32 i = (FX_INT32)(FX_UINTPTR)m_Pos;
+ while (i < iCount) {
+ FX_INT32 j = i;
+ FX_DWORD objnum = m_NewObjNumArray.ElementAt(i);
+ while (j < iCount) {
+ if (++j == iCount) {
+ break;
+ }
+ FX_DWORD dwCurrent = m_NewObjNumArray.ElementAt(j);
+ if (dwCurrent - objnum > 1) {
+ break;
+ }
+ objnum = dwCurrent;
+ }
+ objnum = m_NewObjNumArray.ElementAt(i);
+ if (objnum == 1) {
+ str.Format("0 %d\r\n0000000000 65536 f\r\n", j - i + 1);
+ } else {
+ str.Format("%d %d\r\n", objnum, j - i);
+ }
+ if (m_File.AppendBlock((FX_LPCSTR)str, str.GetLength()) < 0) {
+ return -1;
+ }
+ while (i < j) {
+ objnum = m_NewObjNumArray.ElementAt(i++);
+ str.Format("%010d 00000 n\r\n", m_ObjectOffset[objnum]);
+ if (m_File.AppendBlock((FX_LPCSTR)str, str.GetLength()) < 0) {
+ return -1;
+ }
+ }
+ if (pPause && (i % 100) == 0 && pPause->NeedToPauseNow()) {
+ m_Pos = (FX_LPVOID)(FX_UINTPTR)i;
+ return 1;
+ }
+ }
+ m_iStage = 90;
+ }
+ return m_iStage;
+}
+static FX_INT32 _OutPutIndex(CFX_FileBufferArchive* pFile, FX_FILESIZE offset)
+{
+ FXSYS_assert(pFile);
+ if (sizeof(offset) > 4) {
+ if (FX_GETBYTEOFFSET32(offset)) {
+ if (pFile->AppendByte(FX_GETBYTEOFFSET56(offset)) < 0) {
+ return -1;
+ }
+ if (pFile->AppendByte(FX_GETBYTEOFFSET48(offset)) < 0) {
+ return -1;
+ }
+ if (pFile->AppendByte(FX_GETBYTEOFFSET40(offset)) < 0) {
+ return -1;
+ }
+ if (pFile->AppendByte(FX_GETBYTEOFFSET32(offset)) < 0) {
+ return -1;
+ }
+ }
+ }
+ if (pFile->AppendByte(FX_GETBYTEOFFSET24(offset)) < 0) {
+ return -1;
+ }
+ if (pFile->AppendByte(FX_GETBYTEOFFSET16(offset)) < 0) {
+ return -1;
+ }
+ if (pFile->AppendByte(FX_GETBYTEOFFSET8(offset)) < 0) {
+ return -1;
+ }
+ if (pFile->AppendByte(FX_GETBYTEOFFSET0(offset)) < 0) {
+ return -1;
+ }
+ if (pFile->AppendByte(0) < 0) {
+ return -1;
+ }
+ return 0;
+}
+FX_INT32 CPDF_Creator::WriteDoc_Stage4(IFX_Pause *pPause)
+{
+ FXSYS_assert(m_iStage >= 90);
+ if ((m_dwFlags & FPDFCREATE_OBJECTSTREAM) == 0) {
+ FX_BOOL bXRefStream = (m_dwFlags & FPDFCREATE_INCREMENTAL) != 0 && m_pParser->IsXRefStream();
+ if (!bXRefStream) {
+ if (m_File.AppendString(FX_BSTRC("trailer\r\n<<")) < 0) {
+ return -1;
+ }
+ } else {
+ if (m_File.AppendDWord(m_pDocument->m_LastObjNum + 1) < 0) {
+ return -1;
+ }
+ if (m_File.AppendString(FX_BSTRC(" 0 obj <<")) < 0) {
+ return -1;
+ }
+ }
+ if (m_pParser) {
+ CPDF_Dictionary* p = m_pParser->m_pTrailer;
+ FX_POSITION pos = p->GetStartPos();
+ while (pos) {
+ CFX_ByteString key;
+ CPDF_Object* pValue = p->GetNextElement(pos, key);
+ if (key == FX_BSTRC("Encrypt") || key == FX_BSTRC("Size") || key == FX_BSTRC("Filter") ||
+ key == FX_BSTRC("Index") || key == FX_BSTRC("Length") || key == FX_BSTRC("Prev") ||
+ key == FX_BSTRC("W") || key == FX_BSTRC("XRefStm") || key == FX_BSTRC("ID")) {
+ continue;
+ }
+ if (m_File.AppendString((FX_BSTRC("/"))) < 0) {
+ return -1;
+ }
+ if (m_File.AppendString(PDF_NameEncode(key)) < 0) {
+ return -1;
+ }
+ if (pValue->GetObjNum()) {
+ if (m_File.AppendString(FX_BSTRC(" ")) < 0) {
+ return -1;
+ }
+ if (m_File.AppendDWord(pValue->GetObjNum()) < 0) {
+ return -1;
+ }
+ if (m_File.AppendString(FX_BSTRC(" 0 R ")) < 0) {
+ return -1;
+ }
+ } else {
+ FX_FILESIZE offset = 0;
+ if (PDF_CreatorAppendObject(pValue, &m_File, offset) < 0) {
+ return -1;
+ }
+ }
+ }
+ } else {
+ if (m_File.AppendString(FX_BSTRC("\r\n/Root ")) < 0) {
+ return -1;
+ }
+ if (m_File.AppendDWord(m_pDocument->m_pRootDict->GetObjNum()) < 0) {
+ return -1;
+ }
+ if (m_File.AppendString(FX_BSTRC(" 0 R\r\n")) < 0) {
+ return -1;
+ }
+ if (m_pDocument->m_pInfoDict) {
+ if (m_File.AppendString(FX_BSTRC("/Info ")) < 0) {
+ return -1;
+ }
+ if (m_File.AppendDWord(m_pDocument->m_pInfoDict->GetObjNum()) < 0) {
+ return -1;
+ }
+ if (m_File.AppendString(FX_BSTRC(" 0 R\r\n")) < 0) {
+ return -1;
+ }
+ }
+ }
+ if (m_pEncryptDict) {
+ if (m_File.AppendString(FX_BSTRC("/Encrypt")) < 0) {
+ return -1;
+ }
+ FX_DWORD dwObjNum = m_pEncryptDict->GetObjNum();
+ if (dwObjNum == 0) {
+ dwObjNum = m_pDocument->GetLastObjNum() + 1;
+ }
+ if (m_File.AppendString(FX_BSTRC(" ")) < 0) {
+ return -1;
+ }
+ if (m_File.AppendDWord(dwObjNum) < 0) {
+ return -1;
+ }
+ if (m_File.AppendString(FX_BSTRC(" 0 R ")) < 0) {
+ return -1;
+ }
+ }
+ if (m_File.AppendString(FX_BSTRC("/Size ")) < 0) {
+ return -1;
+ }
+ if (m_File.AppendDWord(m_dwLastObjNum + (bXRefStream ? 2 : 1)) < 0) {
+ return -1;
+ }
+ if ((m_dwFlags & FPDFCREATE_INCREMENTAL) != 0) {
+ FX_FILESIZE prev = m_pParser->GetLastXRefOffset();
+ if (prev) {
+ if (m_File.AppendString(FX_BSTRC("/Prev ")) < 0) {
+ return -1;
+ }
+ FX_CHAR offset_buf[20];
+ FXSYS_memset32(offset_buf, 0, sizeof(offset_buf));
+ FXSYS_i64toa(prev, offset_buf, 10);
+ if (m_File.AppendBlock(offset_buf, FXSYS_strlen(offset_buf)) < 0) {
+ return -1;
+ }
+ }
+ }
+ if (m_pIDArray) {
+ if (m_File.AppendString((FX_BSTRC("/ID"))) < 0) {
+ return -1;
+ }
+ FX_FILESIZE offset = 0;
+ if (PDF_CreatorAppendObject(m_pIDArray, &m_File, offset) < 0) {
+ return -1;
+ }
+ }
+ if (!bXRefStream) {
+ if (m_File.AppendString(FX_BSTRC(">>")) < 0) {
+ return -1;
+ }
+ } else {
+ if (m_File.AppendString(FX_BSTRC("/W[0 4 1]/Index[")) < 0) {
+ return -1;
+ }
+ if ((m_dwFlags & FPDFCREATE_INCREMENTAL) != 0 && m_pParser && m_pParser->GetLastXRefOffset() == 0) {
+ FX_DWORD i = 0;
+ for (i = 0; i < m_dwLastObjNum; i++) {
+ if (!m_ObjectOffset.GetPtrAt(i)) {
+ continue;
+ }
+ if (m_File.AppendDWord(i) < 0) {
+ return -1;
+ }
+ if (m_File.AppendString(FX_BSTRC(" 1 ")) < 0) {
+ return -1;
+ }
+ }
+ if (m_File.AppendString(FX_BSTRC("]/Length ")) < 0) {
+ return -1;
+ }
+ if (m_File.AppendDWord(m_dwLastObjNum * 5) < 0) {
+ return -1;
+ }
+ if (m_File.AppendString(FX_BSTRC(">>stream\r\n")) < 0) {
+ return -1;
+ }
+ for (i = 0; i < m_dwLastObjNum; i++) {
+ FX_FILESIZE* offset = m_ObjectOffset.GetPtrAt(i);
+ if (!offset) {
+ continue;
+ }
+ _OutPutIndex(&m_File, *offset);
+ }
+ } else {
+ int count = m_NewObjNumArray.GetSize();
+ FX_INT32 i = 0;
+ for (i = 0; i < count; i++) {
+ FX_DWORD objnum = m_NewObjNumArray.ElementAt(i);
+ if (m_File.AppendDWord(objnum) < 0) {
+ return -1;
+ }
+ if (m_File.AppendString(FX_BSTRC(" 1 ")) < 0) {
+ return -1;
+ }
+ }
+ if (m_File.AppendString(FX_BSTRC("]/Length ")) < 0) {
+ return -1;
+ }
+ if (m_File.AppendDWord(count * 5) < 0) {
+ return -1;
+ }
+ if (m_File.AppendString(FX_BSTRC(">>stream\r\n")) < 0) {
+ return -1;
+ }
+ for (i = 0; i < count; i++) {
+ FX_DWORD objnum = m_NewObjNumArray.ElementAt(i);
+ FX_FILESIZE offset = m_ObjectOffset[objnum];
+ _OutPutIndex(&m_File, offset);
+ }
+ }
+ if (m_File.AppendString(FX_BSTRC("\r\nendstream")) < 0) {
+ return -1;
+ }
+ }
+ }
+ if (m_File.AppendString(FX_BSTRC("\r\nstartxref\r\n")) < 0) {
+ return -1;
+ }
+ FX_CHAR offset_buf[20];
+ FXSYS_memset32(offset_buf, 0, sizeof(offset_buf));
+ FXSYS_i64toa(m_XrefStart, offset_buf, 10);
+ if (m_File.AppendBlock(offset_buf, FXSYS_strlen(offset_buf)) < 0) {
+ return -1;
+ }
+ if (m_File.AppendString(FX_BSTRC("\r\n%%EOF\r\n")) < 0) {
+ return -1;
+ }
+ m_File.Flush();
+ return m_iStage = 100;
+}
+void CPDF_Creator::Clear()
+{
+ if (m_pXRefStream) {
+ delete m_pXRefStream;
+ m_pXRefStream = NULL;
+ }
+ m_File.Clear();
+ m_NewObjNumArray.RemoveAll();
+ if (m_pIDArray) {
+ m_pIDArray->Release();
+ m_pIDArray = NULL;
+ }
+}
+FX_BOOL CPDF_Creator::Create(FX_LPCSTR filename, FX_DWORD flags)
+{
+ if (!m_File.AttachFile(filename)) {
+ return FALSE;
+ }
+ FX_BOOL bRet = Create(flags);
+ if (!bRet || !(flags & FPDFCREATE_PROGRESSIVE)) {
+ Clear();
+ }
+ return bRet;
+}
+FX_BOOL CPDF_Creator::Create(FX_LPCWSTR filename, FX_DWORD flags)
+{
+ if (!m_File.AttachFile(filename)) {
+ return FALSE;
+ }
+ FX_BOOL bRet = Create(flags);
+ if (!bRet || !(flags & FPDFCREATE_PROGRESSIVE)) {
+ Clear();
+ }
+ return bRet;
+}
+FX_BOOL CPDF_Creator::Create(IFX_StreamWrite* pFile, FX_DWORD flags)
+{
+ if (!pFile) {
+ return FALSE;
+ }
+ if (!m_File.AttachFile(pFile, FALSE)) {
+ return FALSE;
+ }
+ return Create(flags);
+}
+FX_BOOL CPDF_Creator::Create(FX_DWORD flags)
+{
+ m_dwFlags = flags;
+ m_iStage = 0;
+ m_Offset = 0;
+ m_dwLastObjNum = m_pDocument->GetLastObjNum();
+ m_ObjectOffset.Clear();
+ m_ObjectSize.Clear();
+ m_NewObjNumArray.RemoveAll();
+ InitID();
+ if (flags & FPDFCREATE_PROGRESSIVE) {
+ return TRUE;
+ }
+ return Continue(NULL) > -1;
+}
+void CPDF_Creator::InitID(FX_BOOL bDefault )
+{
+ CPDF_Array* pOldIDArray = m_pParser ? m_pParser->GetIDArray() : NULL;
+ FX_BOOL bNewId = !m_pIDArray;
+ if (!m_pIDArray) {
+ FX_LPDWORD pBuffer = NULL;
+ m_pIDArray = CPDF_Array::Create();
+ CPDF_Object* pID1 = pOldIDArray->GetElement(0);
+ if (pID1) {
+ m_pIDArray->Add(pID1->Clone());
+ } else {
+ pBuffer = FX_Alloc(FX_DWORD, 4);
+ PDF_GenerateFileID((FX_DWORD)(FX_UINTPTR)this, m_dwLastObjNum, pBuffer);
+ CFX_ByteStringC bsBuffer((FX_LPCBYTE)pBuffer, 4 * sizeof(FX_DWORD));
+ m_pIDArray->Add(CPDF_String::Create(bsBuffer, TRUE), m_pDocument);
+ }
+ if (pBuffer) {
+ FX_Free(pBuffer);
+ }
+ }
+ if (!bDefault) {
+ return;
+ }
+ if (pOldIDArray) {
+ CPDF_Object* pID2 = pOldIDArray->GetElement(1);
+ if ((m_dwFlags & FPDFCREATE_INCREMENTAL) && m_pEncryptDict && pID2) {
+ m_pIDArray->Add(pID2->Clone());
+ return;
+ }
+ FX_LPDWORD pBuffer = FX_Alloc(FX_DWORD, 4);
+ PDF_GenerateFileID((FX_DWORD)(FX_UINTPTR)this, m_dwLastObjNum, pBuffer);
+ CFX_ByteStringC bsBuffer((FX_LPCBYTE)pBuffer, 4 * sizeof(FX_DWORD));
+ m_pIDArray->Add(CPDF_String::Create(bsBuffer, TRUE), m_pDocument);
+ FX_Free(pBuffer);
+ return;
+ }
+ m_pIDArray->Add(m_pIDArray->GetElement(0)->Clone());
+ if (m_pEncryptDict && !pOldIDArray && m_pParser && bNewId) {
+ if (m_pEncryptDict->GetString(FX_BSTRC("Filter")) == FX_BSTRC("Standard")) {
+ CPDF_StandardSecurityHandler handler;
+ CFX_ByteString user_pass = m_pParser->GetPassword();
+ FX_DWORD flag = PDF_ENCRYPT_CONTENT;
+ handler.OnCreate(m_pEncryptDict, m_pIDArray, (FX_LPCBYTE)user_pass, user_pass.GetLength(), flag);
+ if (m_pCryptoHandler && m_bNewCrypto) {
+ delete m_pCryptoHandler;
+ }
+ m_pCryptoHandler = FX_NEW CPDF_StandardCryptoHandler;
+ m_pCryptoHandler->Init(m_pEncryptDict, &handler);
+ m_bNewCrypto = TRUE;
+ m_bSecurityChanged = TRUE;
+ }
+ }
+}
+FX_INT32 CPDF_Creator::Continue(IFX_Pause *pPause)
+{
+ if (m_iStage < 0) {
+ return m_iStage;
+ }
+ FX_INT32 iRet;
+ while (m_iStage < 100) {
+ if (m_iStage < 20) {
+ iRet = WriteDoc_Stage1(pPause);
+ } else if (m_iStage < 30) {
+ iRet = WriteDoc_Stage2(pPause);
+ } else if (m_iStage < 90) {
+ iRet = WriteDoc_Stage3(pPause);
+ } else {
+ iRet = WriteDoc_Stage4(pPause);
+ }
+ if (iRet < m_iStage) {
+ break;
+ }
+ }
+ if (iRet < 1 || m_iStage == 100) {
+ m_iStage = -1;
+ Clear();
+ return iRet > 99 ? 0 : (iRet < 1 ? -1 : iRet);
+ }
+ return m_iStage;
+}
+FX_BOOL CPDF_Creator::SetFileVersion(FX_INT32 fileVersion )
+{
+ if (fileVersion < 10 || fileVersion > 17) {
+ return FALSE;
+ }
+ m_FileVersion = fileVersion;
+ return TRUE;
+}
+void CPDF_Creator::ResetStandardSecurity()
+{
+ if ((m_bStandardSecurity || m_bNewCrypto) && m_pCryptoHandler) {
+ delete m_pCryptoHandler;
+ m_pCryptoHandler = NULL;
+ }
+ m_bNewCrypto = FALSE;
+ if (!m_bStandardSecurity) {
+ return;
+ }
+ if (m_pEncryptDict) {
+ m_pEncryptDict->Release();
+ m_pEncryptDict = NULL;
+ }
+ m_bStandardSecurity = FALSE;
+}
diff --git a/core/src/fpdfapi/fpdf_edit/fpdf_edit_doc.cpp b/core/src/fpdfapi/fpdf_edit/fpdf_edit_doc.cpp
index e11d93380a..2672116e4f 100644
--- a/core/src/fpdfapi/fpdf_edit/fpdf_edit_doc.cpp
+++ b/core/src/fpdfapi/fpdf_edit/fpdf_edit_doc.cpp
@@ -1,1205 +1,1205 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../../include/fpdfapi/fpdf_page.h"
-#include "../../../include/fpdfapi/fpdf_module.h"
-#include "../fpdf_page/pageint.h"
-#include <limits.h>
-CPDF_Document::CPDF_Document() : CPDF_IndirectObjects(NULL)
-{
- m_pRootDict = NULL;
- m_pInfoDict = NULL;
- m_bLinearized = FALSE;
- m_dwFirstPageNo = 0;
- m_dwFirstPageObjNum = 0;
- m_pDocPage = CPDF_ModuleMgr::Get()->GetPageModule()->CreateDocData(this);
- m_pDocRender = CPDF_ModuleMgr::Get()->GetRenderModule()->CreateDocData(this);
-}
-void CPDF_Document::CreateNewDoc()
-{
- ASSERT(m_pRootDict == NULL && m_pInfoDict == NULL);
- m_pRootDict = FX_NEW CPDF_Dictionary;
- m_pRootDict->SetAtName("Type", "Catalog");
- int objnum = AddIndirectObject(m_pRootDict);
- CPDF_Dictionary* pPages = FX_NEW CPDF_Dictionary;
- pPages->SetAtName("Type", "Pages");
- pPages->SetAtNumber("Count", 0);
- pPages->SetAt("Kids", FX_NEW CPDF_Array);
- objnum = AddIndirectObject(pPages);
- m_pRootDict->SetAtReference("Pages", this, objnum);
- m_pInfoDict = FX_NEW CPDF_Dictionary;
- AddIndirectObject(m_pInfoDict);
-}
-static const FX_WCHAR g_FX_CP874Unicodes[128] = {
- 0x20AC, 0x0000, 0x0000, 0x0000, 0x0000, 0x2026, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x00A0, 0x0E01, 0x0E02, 0x0E03, 0x0E04, 0x0E05, 0x0E06, 0x0E07,
- 0x0E08, 0x0E09, 0x0E0A, 0x0E0B, 0x0E0C, 0x0E0D, 0x0E0E, 0x0E0F,
- 0x0E10, 0x0E11, 0x0E12, 0x0E13, 0x0E14, 0x0E15, 0x0E16, 0x0E17,
- 0x0E18, 0x0E19, 0x0E1A, 0x0E1B, 0x0E1C, 0x0E1D, 0x0E1E, 0x0E1F,
- 0x0E20, 0x0E21, 0x0E22, 0x0E23, 0x0E24, 0x0E25, 0x0E26, 0x0E27,
- 0x0E28, 0x0E29, 0x0E2A, 0x0E2B, 0x0E2C, 0x0E2D, 0x0E2E, 0x0E2F,
- 0x0E30, 0x0E31, 0x0E32, 0x0E33, 0x0E34, 0x0E35, 0x0E36, 0x0E37,
- 0x0E38, 0x0E39, 0x0E3A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0E3F,
- 0x0E40, 0x0E41, 0x0E42, 0x0E43, 0x0E44, 0x0E45, 0x0E46, 0x0E47,
- 0x0E48, 0x0E49, 0x0E4A, 0x0E4B, 0x0E4C, 0x0E4D, 0x0E4E, 0x0E4F,
- 0x0E50, 0x0E51, 0x0E52, 0x0E53, 0x0E54, 0x0E55, 0x0E56, 0x0E57,
- 0x0E58, 0x0E59, 0x0E5A, 0x0E5B, 0x0000, 0x0000, 0x0000, 0x0000,
-};
-static const FX_WCHAR g_FX_CP1250Unicodes[128] = {
- 0x20AC, 0x0000, 0x201A, 0x0000, 0x201E, 0x2026, 0x2020, 0x2021,
- 0x0000, 0x2030, 0x0160, 0x2039, 0x015A, 0x0164, 0x017D, 0x0179,
- 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
- 0x0000, 0x2122, 0x0161, 0x203A, 0x015B, 0x0165, 0x017E, 0x017A,
- 0x00A0, 0x02C7, 0x02D8, 0x0141, 0x00A4, 0x0104, 0x00A6, 0x00A7,
- 0x00A8, 0x00A9, 0x015E, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x017B,
- 0x00B0, 0x00B1, 0x02DB, 0x0142, 0x00B4, 0x00B5, 0x00B6, 0x00B7,
- 0x00B8, 0x0105, 0x015F, 0x00BB, 0x013D, 0x02DD, 0x013E, 0x017C,
- 0x0154, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x0139, 0x0106, 0x00C7,
- 0x010C, 0x00C9, 0x0118, 0x00CB, 0x011A, 0x00CD, 0x00CE, 0x010E,
- 0x0110, 0x0143, 0x0147, 0x00D3, 0x00D4, 0x0150, 0x00D6, 0x00D7,
- 0x0158, 0x016E, 0x00DA, 0x0170, 0x00DC, 0x00DD, 0x0162, 0x00DF,
- 0x0155, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x013A, 0x0107, 0x00E7,
- 0x010D, 0x00E9, 0x0119, 0x00EB, 0x011B, 0x00ED, 0x00EE, 0x010F,
- 0x0111, 0x0144, 0x0148, 0x00F3, 0x00F4, 0x0151, 0x00F6, 0x00F7,
- 0x0159, 0x016F, 0x00FA, 0x0171, 0x00FC, 0x00FD, 0x0163, 0x02D9,
-};
-static const FX_WCHAR g_FX_CP1251Unicodes[128] = {
- 0x0402, 0x0403, 0x201A, 0x0453, 0x201E, 0x2026, 0x2020, 0x2021,
- 0x20AC, 0x2030, 0x0409, 0x2039, 0x040A, 0x040C, 0x040B, 0x040F,
- 0x0452, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
- 0x0000, 0x2122, 0x0459, 0x203A, 0x045A, 0x045C, 0x045B, 0x045F,
- 0x00A0, 0x040E, 0x045E, 0x0408, 0x00A4, 0x0490, 0x00A6, 0x00A7,
- 0x0401, 0x00A9, 0x0404, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x0407,
- 0x00B0, 0x00B1, 0x0406, 0x0456, 0x0491, 0x00B5, 0x00B6, 0x00B7,
- 0x0451, 0x2116, 0x0454, 0x00BB, 0x0458, 0x0405, 0x0455, 0x0457,
- 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417,
- 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F,
- 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427,
- 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F,
- 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437,
- 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F,
- 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447,
- 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F,
-};
-static const FX_WCHAR g_FX_CP1253Unicodes[128] = {
- 0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021,
- 0x0000, 0x2030, 0x0000, 0x2039, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
- 0x0000, 0x2122, 0x0000, 0x203A, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x00A0, 0x0385, 0x0386, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7,
- 0x00A8, 0x00A9, 0x0000, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x2015,
- 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x0384, 0x00B5, 0x00B6, 0x00B7,
- 0x0388, 0x0389, 0x038A, 0x00BB, 0x038C, 0x00BD, 0x038E, 0x038F,
- 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397,
- 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F,
- 0x03A0, 0x03A1, 0x0000, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7,
- 0x03A8, 0x03A9, 0x03AA, 0x03AB, 0x03AC, 0x03AD, 0x03AE, 0x03AF,
- 0x03B0, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7,
- 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF,
- 0x03C0, 0x03C1, 0x03C2, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7,
- 0x03C8, 0x03C9, 0x03CA, 0x03CB, 0x03CC, 0x03CD, 0x03CE, 0x0000,
-};
-static const FX_WCHAR g_FX_CP1254Unicodes[128] = {
- 0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021,
- 0x02C6, 0x2030, 0x0160, 0x2039, 0x0152, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
- 0x02DC, 0x2122, 0x0161, 0x203A, 0x0153, 0x0000, 0x0000, 0x0178,
- 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7,
- 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
- 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7,
- 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF,
- 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7,
- 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF,
- 0x011E, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7,
- 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x0130, 0x015E, 0x00DF,
- 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7,
- 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,
- 0x011F, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7,
- 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x0131, 0x015F, 0x00FF,
-};
-static const FX_WCHAR g_FX_CP1255Unicodes[128] = {
- 0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021,
- 0x02C6, 0x2030, 0x0000, 0x2039, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
- 0x02DC, 0x2122, 0x0000, 0x203A, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x20AA, 0x00A5, 0x00A6, 0x00A7,
- 0x00A8, 0x00A9, 0x00D7, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
- 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7,
- 0x00B8, 0x00B9, 0x00F7, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF,
- 0x05B0, 0x05B1, 0x05B2, 0x05B3, 0x05B4, 0x05B5, 0x05B6, 0x05B7,
- 0x05B8, 0x05B9, 0x0000, 0x05BB, 0x05BC, 0x05BD, 0x05BE, 0x05BF,
- 0x05C0, 0x05C1, 0x05C2, 0x05C3, 0x05F0, 0x05F1, 0x05F2, 0x05F3,
- 0x05F4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x05D0, 0x05D1, 0x05D2, 0x05D3, 0x05D4, 0x05D5, 0x05D6, 0x05D7,
- 0x05D8, 0x05D9, 0x05DA, 0x05DB, 0x05DC, 0x05DD, 0x05DE, 0x05DF,
- 0x05E0, 0x05E1, 0x05E2, 0x05E3, 0x05E4, 0x05E5, 0x05E6, 0x05E7,
- 0x05E8, 0x05E9, 0x05EA, 0x0000, 0x0000, 0x200E, 0x200F, 0x0000,
-};
-static const FX_WCHAR g_FX_CP1256Unicodes[128] = {
- 0x20AC, 0x067E, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021,
- 0x02C6, 0x2030, 0x0679, 0x2039, 0x0152, 0x0686, 0x0698, 0x0688,
- 0x06AF, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
- 0x06A9, 0x2122, 0x0691, 0x203A, 0x0153, 0x200C, 0x200D, 0x06BA,
- 0x00A0, 0x060C, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7,
- 0x00A8, 0x00A9, 0x06BE, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
- 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7,
- 0x00B8, 0x00B9, 0x061B, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x061F,
- 0x06C1, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627,
- 0x0628, 0x0629, 0x062A, 0x062B, 0x062C, 0x062D, 0x062E, 0x062F,
- 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x00D7,
- 0x0637, 0x0638, 0x0639, 0x063A, 0x0640, 0x0641, 0x0642, 0x0643,
- 0x00E0, 0x0644, 0x00E2, 0x0645, 0x0646, 0x0647, 0x0648, 0x00E7,
- 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x0649, 0x064A, 0x00EE, 0x00EF,
- 0x064B, 0x064C, 0x064D, 0x064E, 0x00F4, 0x064F, 0x0650, 0x00F7,
- 0x0651, 0x00F9, 0x0652, 0x00FB, 0x00FC, 0x200E, 0x200F, 0x06D2,
-};
-static const FX_WCHAR g_FX_CP1257Unicodes[128] = {
- 0x20AC, 0x0000, 0x201A, 0x0000, 0x201E, 0x2026, 0x2020, 0x2021,
- 0x0000, 0x2030, 0x0000, 0x2039, 0x0000, 0x00A8, 0x02C7, 0x00B8,
- 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
- 0x0000, 0x2122, 0x0000, 0x203A, 0x0000, 0x00AF, 0x02DB, 0x0000,
- 0x00A0, 0x0000, 0x00A2, 0x00A3, 0x00A4, 0x0000, 0x00A6, 0x00A7,
- 0x00D8, 0x00A9, 0x0156, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00C6,
- 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7,
- 0x00F8, 0x00B9, 0x0157, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00E6,
- 0x0104, 0x012E, 0x0100, 0x0106, 0x00C4, 0x00C5, 0x0118, 0x0112,
- 0x010C, 0x00C9, 0x0179, 0x0116, 0x0122, 0x0136, 0x012A, 0x013B,
- 0x0160, 0x0143, 0x0145, 0x00D3, 0x014C, 0x00D5, 0x00D6, 0x00D7,
- 0x0172, 0x0141, 0x015A, 0x016A, 0x00DC, 0x017B, 0x017D, 0x00DF,
- 0x0105, 0x012F, 0x0101, 0x0107, 0x00E4, 0x00E5, 0x0119, 0x0113,
- 0x010D, 0x00E9, 0x017A, 0x0117, 0x0123, 0x0137, 0x012B, 0x013C,
- 0x0161, 0x0144, 0x0146, 0x00F3, 0x014D, 0x00F5, 0x00F6, 0x00F7,
- 0x0173, 0x0142, 0x015B, 0x016B, 0x00FC, 0x017C, 0x017E, 0x02D9,
-};
-typedef struct {
- FX_BYTE m_Charset;
- const FX_WCHAR* m_pUnicodes;
-} FX_CharsetUnicodes;
-const FX_CharsetUnicodes g_FX_CharsetUnicodes[] = {
- { FXFONT_THAI_CHARSET, g_FX_CP874Unicodes },
- { FXFONT_EASTEUROPE_CHARSET, g_FX_CP1250Unicodes },
- { FXFONT_RUSSIAN_CHARSET, g_FX_CP1251Unicodes },
- { FXFONT_GREEK_CHARSET, g_FX_CP1253Unicodes },
- { FXFONT_TURKISH_CHARSET, g_FX_CP1254Unicodes },
- { FXFONT_HEBREW_CHARSET, g_FX_CP1255Unicodes },
- { FXFONT_ARABIC_CHARSET, g_FX_CP1256Unicodes },
- { FXFONT_BALTIC_CHARSET, g_FX_CP1257Unicodes },
-};
-#if (_FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN32_MOBILE_ || _FX_OS_ == _FX_WIN64_)
-static void _InsertWidthArray(HDC hDC, int start, int end, CPDF_Array* pWidthArray)
-{
- int size = end - start + 1;
- int* widths = FX_Alloc(int, size);
- GetCharWidth(hDC, start, end, widths);
- int i;
- for (i = 1; i < size; i ++)
- if (widths[i] != *widths) {
- break;
- }
- if (i == size) {
- int first = pWidthArray->GetInteger(pWidthArray->GetCount() - 1);
- pWidthArray->AddInteger(first + size - 1);
- pWidthArray->AddInteger(*widths);
- } else {
- CPDF_Array* pWidthArray1 = FX_NEW CPDF_Array;
- pWidthArray->Add(pWidthArray1);
- for (i = 0; i < size; i ++) {
- pWidthArray1->AddInteger(widths[i]);
- }
- }
- FX_Free(widths);
-}
-CPDF_Font* CPDF_Document::AddWindowsFont(LOGFONTW* pLogFont, FX_BOOL bVert, FX_BOOL bTranslateName)
-{
- LOGFONTA lfa;
- FXSYS_memcpy32(&lfa, pLogFont, (char*)lfa.lfFaceName - (char*)&lfa);
- CFX_ByteString face = CFX_ByteString::FromUnicode(pLogFont->lfFaceName);
- if (face.GetLength() >= LF_FACESIZE) {
- return NULL;
- }
- FXSYS_strcpy(lfa.lfFaceName, (FX_LPCSTR)face);
- return AddWindowsFont(&lfa, bVert, bTranslateName);
-}
-extern CFX_ByteString _FPDF_GetNameFromTT(FX_LPCBYTE name_table, FX_DWORD name);
-CFX_ByteString _FPDF_GetPSNameFromTT(HDC hDC)
-{
- CFX_ByteString result;
- DWORD size = ::GetFontData(hDC, 'eman', 0, NULL, 0);
- if (size != GDI_ERROR) {
- LPBYTE buffer = FX_Alloc(BYTE, size);
- ::GetFontData(hDC, 'eman', 0, buffer, size);
- result = _FPDF_GetNameFromTT(buffer, 6);
- FX_Free(buffer);
- }
- return result;
-}
-CPDF_Font* CPDF_Document::AddWindowsFont(LOGFONTA* pLogFont, FX_BOOL bVert, FX_BOOL bTranslateName)
-{
- pLogFont->lfHeight = -1000;
- pLogFont->lfWidth = 0;
- HGDIOBJ hFont = CreateFontIndirectA(pLogFont);
- HDC hDC = CreateCompatibleDC(NULL);
- hFont = SelectObject(hDC, hFont);
- int tm_size = GetOutlineTextMetrics(hDC, 0, NULL);
- if (tm_size == 0) {
- hFont = SelectObject(hDC, hFont);
- DeleteObject(hFont);
- DeleteDC(hDC);
- return NULL;
- }
- LPBYTE tm_buf = FX_Alloc(BYTE, tm_size);
- OUTLINETEXTMETRIC* ptm = (OUTLINETEXTMETRIC*)tm_buf;
- GetOutlineTextMetrics(hDC, tm_size, ptm);
- int flags = 0, italicangle, ascend, descend, capheight, bbox[4];
- if (pLogFont->lfItalic) {
- flags |= PDFFONT_ITALIC;
- }
- if ((pLogFont->lfPitchAndFamily & 3) == FIXED_PITCH) {
- flags |= PDFFONT_FIXEDPITCH;
- }
- if ((pLogFont->lfPitchAndFamily & 0xf8) == FF_ROMAN) {
- flags |= PDFFONT_SERIF;
- }
- if ((pLogFont->lfPitchAndFamily & 0xf8) == FF_SCRIPT) {
- flags |= PDFFONT_SCRIPT;
- }
- FX_BOOL bCJK = pLogFont->lfCharSet == CHINESEBIG5_CHARSET || pLogFont->lfCharSet == GB2312_CHARSET ||
- pLogFont->lfCharSet == HANGEUL_CHARSET || pLogFont->lfCharSet == SHIFTJIS_CHARSET;
- CFX_ByteString basefont;
- if (bTranslateName && bCJK) {
- basefont = _FPDF_GetPSNameFromTT(hDC);
- }
- if (basefont.IsEmpty()) {
- basefont = pLogFont->lfFaceName;
- }
- italicangle = ptm->otmItalicAngle / 10;
- ascend = ptm->otmrcFontBox.top;
- descend = ptm->otmrcFontBox.bottom;
- capheight = ptm->otmsCapEmHeight;
- bbox[0] = ptm->otmrcFontBox.left;
- bbox[1] = ptm->otmrcFontBox.bottom;
- bbox[2] = ptm->otmrcFontBox.right;
- bbox[3] = ptm->otmrcFontBox.top;
- FX_Free(tm_buf);
- basefont.Replace(" ", "");
- CPDF_Dictionary* pBaseDict = FX_NEW CPDF_Dictionary;
- pBaseDict->SetAtName("Type", "Font");
- CPDF_Dictionary* pFontDict = pBaseDict;
- if (!bCJK) {
- if (pLogFont->lfCharSet == ANSI_CHARSET || pLogFont->lfCharSet == DEFAULT_CHARSET ||
- pLogFont->lfCharSet == SYMBOL_CHARSET) {
- if (pLogFont->lfCharSet == SYMBOL_CHARSET) {
- flags |= PDFFONT_SYMBOLIC;
- } else {
- flags |= PDFFONT_NONSYMBOLIC;
- }
- pBaseDict->SetAtName(FX_BSTRC("Encoding"), "WinAnsiEncoding");
- } else {
- flags |= PDFFONT_NONSYMBOLIC;
- int i;
- for (i = 0; i < sizeof g_FX_CharsetUnicodes / sizeof(FX_CharsetUnicodes); i ++)
- if (g_FX_CharsetUnicodes[i].m_Charset == pLogFont->lfCharSet) {
- break;
- }
- if (i < sizeof g_FX_CharsetUnicodes / sizeof(FX_CharsetUnicodes)) {
- CPDF_Dictionary* pEncoding = FX_NEW CPDF_Dictionary;
- pEncoding->SetAtName(FX_BSTRC("BaseEncoding"), "WinAnsiEncoding");
- CPDF_Array* pArray = FX_NEW CPDF_Array;
- pArray->AddInteger(128);
- const FX_WCHAR* pUnicodes = g_FX_CharsetUnicodes[i].m_pUnicodes;
- for (int j = 0; j < 128; j ++) {
- CFX_ByteString name = PDF_AdobeNameFromUnicode(pUnicodes[j]);
- if (name.IsEmpty()) {
- pArray->AddName(FX_BSTRC(".notdef"));
- } else {
- pArray->AddName(name);
- }
- }
- pEncoding->SetAt(FX_BSTRC("Differences"), pArray);
- AddIndirectObject(pEncoding);
- pBaseDict->SetAtReference(FX_BSTRC("Encoding"), this, pEncoding);
- }
- }
- if (pLogFont->lfWeight > FW_MEDIUM && pLogFont->lfItalic) {
- basefont += ",BoldItalic";
- } else if (pLogFont->lfWeight > FW_MEDIUM) {
- basefont += ",Bold";
- } else if (pLogFont->lfItalic) {
- basefont += ",Italic";
- }
- pBaseDict->SetAtName("Subtype", "TrueType");
- pBaseDict->SetAtName("BaseFont", basefont);
- pBaseDict->SetAtNumber("FirstChar", 32);
- pBaseDict->SetAtNumber("LastChar", 255);
- int char_widths[224];
- GetCharWidth(hDC, 32, 255, char_widths);
- CPDF_Array* pWidths = FX_NEW CPDF_Array;
- for (int i = 0; i < 224; i ++) {
- pWidths->AddInteger(char_widths[i]);
- }
- pBaseDict->SetAt("Widths", pWidths);
- } else {
- flags |= PDFFONT_NONSYMBOLIC;
- pFontDict = FX_NEW CPDF_Dictionary;
- CFX_ByteString cmap;
- CFX_ByteString ordering;
- int supplement;
- CPDF_Array* pWidthArray = FX_NEW CPDF_Array;
- switch (pLogFont->lfCharSet) {
- case CHINESEBIG5_CHARSET:
- cmap = bVert ? "ETenms-B5-V" : "ETenms-B5-H";
- ordering = "CNS1";
- supplement = 4;
- pWidthArray->AddInteger(1);
- _InsertWidthArray(hDC, 0x20, 0x7e, pWidthArray);
- break;
- case GB2312_CHARSET:
- cmap = bVert ? "GBK-EUC-V" : "GBK-EUC-H";
- ordering = "GB1", supplement = 2;
- pWidthArray->AddInteger(7716);
- _InsertWidthArray(hDC, 0x20, 0x20, pWidthArray);
- pWidthArray->AddInteger(814);
- _InsertWidthArray(hDC, 0x21, 0x7e, pWidthArray);
- break;
- case HANGEUL_CHARSET:
- cmap = bVert ? "KSCms-UHC-V" : "KSCms-UHC-H";
- ordering = "Korea1";
- supplement = 2;
- pWidthArray->AddInteger(1);
- _InsertWidthArray(hDC, 0x20, 0x7e, pWidthArray);
- break;
- case SHIFTJIS_CHARSET:
- cmap = bVert ? "90ms-RKSJ-V" : "90ms-RKSJ-H";
- ordering = "Japan1";
- supplement = 5;
- pWidthArray->AddInteger(231);
- _InsertWidthArray(hDC, 0x20, 0x7d, pWidthArray);
- pWidthArray->AddInteger(326);
- _InsertWidthArray(hDC, 0xa0, 0xa0, pWidthArray);
- pWidthArray->AddInteger(327);
- _InsertWidthArray(hDC, 0xa1, 0xdf, pWidthArray);
- pWidthArray->AddInteger(631);
- _InsertWidthArray(hDC, 0x7e, 0x7e, pWidthArray);
- break;
- }
- pBaseDict->SetAtName("Subtype", "Type0");
- pBaseDict->SetAtName("BaseFont", basefont);
- pBaseDict->SetAtName("Encoding", cmap);
- pFontDict->SetAt("W", pWidthArray);
- pFontDict->SetAtName("Type", "Font");
- pFontDict->SetAtName("Subtype", "CIDFontType2");
- pFontDict->SetAtName("BaseFont", basefont);
- CPDF_Dictionary* pCIDSysInfo = FX_NEW CPDF_Dictionary;
- pCIDSysInfo->SetAtString("Registry", "Adobe");
- pCIDSysInfo->SetAtString("Ordering", ordering);
- pCIDSysInfo->SetAtInteger("Supplement", supplement);
- pFontDict->SetAt("CIDSystemInfo", pCIDSysInfo);
- CPDF_Array* pArray = FX_NEW CPDF_Array;
- pBaseDict->SetAt("DescendantFonts", pArray);
- AddIndirectObject(pFontDict);
- pArray->AddReference(this, pFontDict);
- }
- AddIndirectObject(pBaseDict);
- CPDF_Dictionary* pFontDesc = FX_NEW CPDF_Dictionary;
- pFontDesc->SetAtName("Type", "FontDescriptor");
- pFontDesc->SetAtName("FontName", basefont);
- pFontDesc->SetAtInteger("Flags", flags);
- CPDF_Array* pBBox = FX_NEW CPDF_Array;
- for (int i = 0; i < 4; i ++) {
- pBBox->AddInteger(bbox[i]);
- }
- pFontDesc->SetAt("FontBBox", pBBox);
- pFontDesc->SetAtInteger("ItalicAngle", italicangle);
- pFontDesc->SetAtInteger("Ascent", ascend);
- pFontDesc->SetAtInteger("Descent", descend);
- pFontDesc->SetAtInteger("CapHeight", capheight);
- pFontDesc->SetAtInteger("StemV", pLogFont->lfWeight / 5);
- AddIndirectObject(pFontDesc);
- pFontDict->SetAtReference("FontDescriptor", this, pFontDesc);
- hFont = SelectObject(hDC, hFont);
- DeleteObject(hFont);
- DeleteDC(hDC);
- return LoadFont(pBaseDict);
-}
-#endif
-#if (_FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_)
-FX_UINT32 FX_GetLangHashCode( FX_LPCSTR pStr)
-{
- FXSYS_assert( pStr != NULL);
- FX_INT32 iLength = FXSYS_strlen(pStr);
- FX_LPCSTR pStrEnd = pStr + iLength;
- FX_UINT32 uHashCode = 0;
- while ( pStr < pStrEnd) {
- uHashCode = 31 * uHashCode + tolower(*pStr++);
- }
- return uHashCode;
-}
-struct FX_LANG2CS {
- FX_DWORD uLang;
- int uCharset;
-}*FX_LPLANG2CS;
-static const FX_LANG2CS gs_FXLang2CharsetTable[] = {
- {3109, 0},
- {3121, 178},
- {3129, 162},
- {3139, 204},
- {3141, 204},
- {3166, 0},
- {3184, 238},
- {3197, 0},
- {3201, 0},
- {3239, 161},
- {3241, 0},
- {3246, 0},
- {3247, 186},
- {3248, 0},
- {3259, 178},
- {3267, 0},
- {3273, 0},
- {3276, 0},
- {3301, 0},
- {3310, 1},
- {3325, 177},
- {3329, 1},
- {3338, 238},
- {3341, 238},
- {3345, 1},
- {3355, 0},
- {3370, 0},
- {3371, 0},
- {3383, 128},
- {3424, 204},
- {3427, 1},
- {3428, 129},
- {3436, 178},
- {3464, 186},
- {3466, 186},
- {3486, 204},
- {3487, 0},
- {3493, 1},
- {3494, 0},
- {3508, 0},
- {3518, 0},
- {3520, 0},
- {3569, 1},
- {3580, 238},
- {3588, 0},
- {3645, 238},
- {3651, 204},
- {3672, 238},
- {3673, 238},
- {3678, 238},
- {3679, 238},
- {3683, 0},
- {3684, 0},
- {3693, 1},
- {3697, 1},
- {3700, 222},
- {3710, 162},
- {3734, 204},
- {3741, 178},
- {3749, 162},
- {3763, 163},
- {3886, 134},
- {105943, 0},
- {106375, 1},
- {3923451837, 134},
- {3923451838, 136},
-};
-static FX_WORD FX_GetCsFromLangCode(FX_UINT32 uCode)
-{
- FX_INT32 iStart = 0;
- FX_INT32 iEnd = sizeof(gs_FXLang2CharsetTable) / sizeof(FX_LANG2CS) - 1;
- while (iStart <= iEnd) {
- FX_INT32 iMid = (iStart + iEnd) / 2;
- const FX_LANG2CS &charset = gs_FXLang2CharsetTable[iMid];
- if (uCode == charset.uLang) {
- return charset.uCharset;
- } else if (uCode < charset.uLang) {
- iEnd = iMid - 1;
- } else {
- iStart = iMid + 1;
- }
- };
- return 0;
-}
-static FX_WORD FX_GetCharsetFromLang(FX_LPCSTR pLang, FX_INT32 iLength)
-{
- FXSYS_assert(pLang);
- if (iLength < 0) {
- iLength = FXSYS_strlen(pLang);
- }
- FX_UINT32 uHash = FX_GetLangHashCode(pLang);
- return FX_GetCsFromLangCode(uHash);
-}
-static void _CFString2CFXByteString(CFStringRef src, CFX_ByteString &dest)
-{
- SInt32 len = CFStringGetLength(src);
- CFRange range = CFRangeMake(0, len);
- CFIndex used = 0;
- UInt8* pBuffer = (UInt8*)malloc(sizeof(UInt8) * (len + 1));
- FXSYS_memset32(pBuffer, 0, sizeof(UInt8) * (len + 1));
- CFStringGetBytes(src, range, kCFStringEncodingASCII, 0, false, pBuffer, len, &used);
- dest = (FX_LPSTR)pBuffer;
- free(pBuffer);
-}
-FX_BOOL IsHasCharSet(CFArrayRef languages, const CFX_DWordArray &charSets)
-{
- int iCount = charSets.GetSize();
- for (int i = 0; i < CFArrayGetCount(languages); ++i) {
- CFStringRef language = (CFStringRef)CFArrayGetValueAtIndex(languages, i);
- FX_DWORD CharSet = FX_GetCharsetFromLang(CFStringGetCStringPtr(language, kCFStringEncodingMacRoman), -1);
- for (int j = 0; j < iCount; ++j) {
- if (CharSet == charSets[j]) {
- return TRUE;
- }
- }
- }
- return FALSE;
-}
-void FX_GetCharWidth(CTFontRef font, UniChar start, UniChar end, int* width)
-{
- CGFloat size = CTFontGetSize(font);
- for (; start <= end; ++start) {
- CGGlyph pGlyph = 0;
- CFIndex count = 1;
- CTFontGetGlyphsForCharacters(font, &start, &pGlyph, count);
- CGSize advances;
- CTFontGetAdvancesForGlyphs(font, kCTFontDefaultOrientation, &pGlyph, &advances, 1);
- *width = (int)(advances.width / size * 1000) ;
- width++;
- }
-}
-static void _InsertWidthArray(CTFontRef font, int start, int end, CPDF_Array* pWidthArray)
-{
- int size = end - start + 1;
- int* widths = FX_Alloc(int, size);
- FX_GetCharWidth(font, start, end, widths);
- int i;
- for (i = 1; i < size; i ++)
- if (widths[i] != *widths) {
- break;
- }
- if (i == size) {
- int first = pWidthArray->GetInteger(pWidthArray->GetCount() - 1);
- pWidthArray->AddInteger(first + size - 1);
- pWidthArray->AddInteger(*widths);
- } else {
- CPDF_Array* pWidthArray1 = FX_NEW CPDF_Array;
- pWidthArray->Add(pWidthArray1);
- for (i = 0; i < size; i ++) {
- pWidthArray1->AddInteger(widths[i]);
- }
- }
- FX_Free(widths);
-}
-CPDF_Font* CPDF_Document::AddMacFont(CTFontRef pFont, FX_BOOL bVert, FX_BOOL bTranslateName)
-{
- CTFontRef font = (CTFontRef)pFont;
- CTFontDescriptorRef descriptor = CTFontCopyFontDescriptor(font);
- if (descriptor == NULL) {
- return NULL;
- }
- CFX_ByteString basefont;
- FX_BOOL bCJK = FALSE;
- int flags = 0, italicangle = 0, ascend = 0, descend = 0, capheight = 0, bbox[4];
- FXSYS_memset32(bbox, 0, sizeof(int) * 4);
- CFArrayRef languages = (CFArrayRef)CTFontDescriptorCopyAttribute(descriptor, kCTFontLanguagesAttribute);
- if (languages == NULL) {
- CFRelease(descriptor);
- return NULL;
- }
- CFX_DWordArray charSets;
- charSets.Add(FXFONT_CHINESEBIG5_CHARSET);
- charSets.Add(FXFONT_GB2312_CHARSET);
- charSets.Add(FXFONT_HANGEUL_CHARSET);
- charSets.Add(FXFONT_SHIFTJIS_CHARSET);
- if (IsHasCharSet(languages, charSets)) {
- bCJK = TRUE;
- }
- CFRelease(descriptor);
- CFDictionaryRef traits = (CFDictionaryRef)CTFontCopyTraits(font);
- if (traits == NULL) {
- CFRelease(languages);
- return NULL;
- }
- CFNumberRef sybolicTrait = (CFNumberRef)CFDictionaryGetValue(traits, kCTFontSymbolicTrait);
- CTFontSymbolicTraits trait = 0;
- CFNumberGetValue(sybolicTrait, kCFNumberSInt32Type, &trait);
- if (trait & kCTFontItalicTrait) {
- flags |= PDFFONT_ITALIC;
- }
- if (trait & kCTFontMonoSpaceTrait) {
- flags |= PDFFONT_FIXEDPITCH;
- }
- if (trait & kCTFontModernSerifsClass) {
- flags |= PDFFONT_SERIF;
- }
- if (trait & kCTFontScriptsClass) {
- flags |= PDFFONT_SCRIPT;
- }
- CFNumberRef weightTrait = (CFNumberRef)CFDictionaryGetValue(traits, kCTFontWeightTrait);
- Float32 weight = 0;
- CFNumberGetValue(weightTrait, kCFNumberFloat32Type, &weight);
- italicangle = CTFontGetSlantAngle(font);
- ascend = CTFontGetAscent(font);
- descend = CTFontGetDescent(font);
- capheight = CTFontGetCapHeight(font);
- CGRect box = CTFontGetBoundingBox(font);
- bbox[0] = box.origin.x;
- bbox[1] = box.origin.y;
- bbox[2] = box.origin.x + box.size.width;
- bbox[3] = box.origin.y + box.size.height;
- if (bTranslateName && bCJK) {
- CFStringRef postName = CTFontCopyPostScriptName(font);
- _CFString2CFXByteString(postName, basefont);
- CFRelease(postName);
- }
- if (basefont.IsEmpty()) {
- CFStringRef fullName = CTFontCopyFullName(font);
- _CFString2CFXByteString(fullName, basefont);
- CFRelease(fullName);
- }
- basefont.Replace(" ", "");
- CPDF_Dictionary* pFontDict = NULL;
- CPDF_Dictionary* pBaseDict = FX_NEW CPDF_Dictionary;
- pFontDict = pBaseDict;
- if (!bCJK) {
- charSets.RemoveAll();
- charSets.Add(FXFONT_ANSI_CHARSET);
- charSets.Add(FXFONT_DEFAULT_CHARSET);
- charSets.Add(FXFONT_SYMBOL_CHARSET);
- if (IsHasCharSet(languages, charSets)) {
- charSets.RemoveAll();
- charSets.Add(FXFONT_SYMBOL_CHARSET);
- if (IsHasCharSet(languages, charSets)) {
- flags |= PDFFONT_SYMBOLIC;
- } else {
- flags |= PDFFONT_NONSYMBOLIC;
- }
- pBaseDict->SetAtName(FX_BSTRC("Encoding"), "WinAnsiEncoding");
- } else {
- flags |= PDFFONT_NONSYMBOLIC;
- int i;
- for (i = 0; i < sizeof g_FX_CharsetUnicodes / sizeof(FX_CharsetUnicodes); i ++) {
- charSets.RemoveAll();
- charSets.Add(g_FX_CharsetUnicodes[i].m_Charset);
- if (IsHasCharSet(languages, charSets)) {
- break;
- }
- }
- if (i < sizeof g_FX_CharsetUnicodes / sizeof(FX_CharsetUnicodes)) {
- CPDF_Dictionary* pEncoding = FX_NEW CPDF_Dictionary;
- pEncoding->SetAtName(FX_BSTRC("BaseEncoding"), "WinAnsiEncoding");
- CPDF_Array* pArray = FX_NEW CPDF_Array;
- pArray->AddInteger(128);
- const FX_WCHAR* pUnicodes = g_FX_CharsetUnicodes[i].m_pUnicodes;
- for (int j = 0; j < 128; j ++) {
- CFX_ByteString name = PDF_AdobeNameFromUnicode(pUnicodes[j]);
- if (name.IsEmpty()) {
- pArray->AddName(FX_BSTRC(".notdef"));
- } else {
- pArray->AddName(name);
- }
- }
- pEncoding->SetAt(FX_BSTRC("Differences"), pArray);
- AddIndirectObject(pEncoding);
- pBaseDict->SetAtReference(FX_BSTRC("Encoding"), this, pEncoding);
- }
- }
- if (weight > 0.0 && trait & kCTFontItalicTrait) {
- basefont += ",BoldItalic";
- } else if (weight > 0.0) {
- basefont += ",Bold";
- } else if (trait & kCTFontItalicTrait) {
- basefont += ",Italic";
- }
- pBaseDict->SetAtName("Subtype", "TrueType");
- pBaseDict->SetAtName("BaseFont", basefont);
- pBaseDict->SetAtNumber("FirstChar", 32);
- pBaseDict->SetAtNumber("LastChar", 255);
- int char_widths[224];
- FX_GetCharWidth(font, 32, 255, char_widths);
- CPDF_Array* pWidths = FX_NEW CPDF_Array;
- for (int i = 0; i < 224; i ++) {
- pWidths->AddInteger(char_widths[i]);
- }
- pBaseDict->SetAt("Widths", pWidths);
- } else {
- flags |= PDFFONT_NONSYMBOLIC;
- CPDF_Array* pArray = NULL;
- pFontDict = FX_NEW CPDF_Dictionary;
- CFX_ByteString cmap;
- CFX_ByteString ordering;
- int supplement;
- FX_BOOL bFound = FALSE;
- CPDF_Array* pWidthArray = FX_NEW CPDF_Array;
- charSets.RemoveAll();
- charSets.Add(FXFONT_CHINESEBIG5_CHARSET);
- if (IsHasCharSet(languages, charSets)) {
- cmap = bVert ? "ETenms-B5-V" : "ETenms-B5-H";
- ordering = "CNS1";
- supplement = 4;
- pWidthArray->AddInteger(1);
- _InsertWidthArray(font, 0x20, 0x7e, pWidthArray);
- bFound = TRUE;
- }
- charSets.RemoveAll();
- charSets.Add(FXFONT_GB2312_CHARSET);
- if (!bFound && IsHasCharSet(languages, charSets)) {
- cmap = bVert ? "GBK-EUC-V" : "GBK-EUC-H";
- ordering = "GB1", supplement = 2;
- pWidthArray->AddInteger(7716);
- _InsertWidthArray(font, 0x20, 0x20, pWidthArray);
- pWidthArray->AddInteger(814);
- _InsertWidthArray(font, 0x21, 0x7e, pWidthArray);
- bFound = TRUE;
- }
- charSets.RemoveAll();
- charSets.Add(FXFONT_HANGEUL_CHARSET);
- if (!bFound && IsHasCharSet(languages, charSets)) {
- cmap = bVert ? "KSCms-UHC-V" : "KSCms-UHC-H";
- ordering = "Korea1";
- supplement = 2;
- pWidthArray->AddInteger(1);
- _InsertWidthArray(font, 0x20, 0x7e, pWidthArray);
- bFound = TRUE;
- }
- charSets.RemoveAll();
- charSets.Add(FXFONT_SHIFTJIS_CHARSET);
- if (!bFound && IsHasCharSet(languages, charSets)) {
- cmap = bVert ? "90ms-RKSJ-V" : "90ms-RKSJ-H";
- ordering = "Japan1";
- supplement = 5;
- pWidthArray->AddInteger(231);
- _InsertWidthArray(font, 0x20, 0x7d, pWidthArray);
- pWidthArray->AddInteger(326);
- _InsertWidthArray(font, 0xa0, 0xa0, pWidthArray);
- pWidthArray->AddInteger(327);
- _InsertWidthArray(font, 0xa1, 0xdf, pWidthArray);
- pWidthArray->AddInteger(631);
- _InsertWidthArray(font, 0x7e, 0x7e, pWidthArray);
- }
- pBaseDict->SetAtName("Subtype", "Type0");
- pBaseDict->SetAtName("BaseFont", basefont);
- pBaseDict->SetAtName("Encoding", cmap);
- pFontDict->SetAt("W", pWidthArray);
- pFontDict->SetAtName("Type", "Font");
- pFontDict->SetAtName("Subtype", "CIDFontType2");
- pFontDict->SetAtName("BaseFont", basefont);
- CPDF_Dictionary* pCIDSysInfo = FX_NEW CPDF_Dictionary;
- pCIDSysInfo->SetAtString("Registry", "Adobe");
- pCIDSysInfo->SetAtString("Ordering", ordering);
- pCIDSysInfo->SetAtInteger("Supplement", supplement);
- pFontDict->SetAt("CIDSystemInfo", pCIDSysInfo);
- pArray = FX_NEW CPDF_Array;
- pBaseDict->SetAt("DescendantFonts", pArray);
- AddIndirectObject(pFontDict);
- pArray->AddReference(this, pFontDict);
- }
- AddIndirectObject(pBaseDict);
- CPDF_Dictionary* pFontDesc = FX_NEW CPDF_Dictionary;
- pFontDesc->SetAtName("Type", "FontDescriptor");
- pFontDesc->SetAtName("FontName", basefont);
- pFontDesc->SetAtInteger("Flags", flags);
- CPDF_Array* pBBox = FX_NEW CPDF_Array;
- for (int i = 0; i < 4; i ++) {
- pBBox->AddInteger(bbox[i]);
- }
- pFontDesc->SetAt("FontBBox", pBBox);
- pFontDesc->SetAtInteger("ItalicAngle", italicangle);
- pFontDesc->SetAtInteger("Ascent", ascend);
- pFontDesc->SetAtInteger("Descent", descend);
- pFontDesc->SetAtInteger("CapHeight", capheight);
- CGFloat fStemV = 0;
- int16_t min_width = SHRT_MAX;
- static const UniChar stem_chars[] = {'i', 'I', '!', '1'};
- const size_t count = sizeof(stem_chars) / sizeof(stem_chars[0]);
- CGGlyph glyphs[count];
- CGRect boundingRects[count];
- if (CTFontGetGlyphsForCharacters(font, stem_chars, glyphs, count)) {
- CTFontGetBoundingRectsForGlyphs(font, kCTFontHorizontalOrientation,
- glyphs, boundingRects, count);
- for (size_t i = 0; i < count; i++) {
- int16_t width = boundingRects[i].size.width;
- if (width > 0 && width < min_width) {
- min_width = width;
- fStemV = min_width;
- }
- }
- }
- pFontDesc->SetAtInteger("StemV", fStemV);
- AddIndirectObject(pFontDesc);
- pFontDict->SetAtReference("FontDescriptor", this, pFontDesc);
- CFRelease(traits);
- CFRelease(languages);
- return LoadFont(pBaseDict);
-}
-#endif
-static void _InsertWidthArray1(CFX_Font* pFont, IFX_FontEncoding* pEncoding, FX_WCHAR start, FX_WCHAR end, CPDF_Array* pWidthArray)
-{
- int size = end - start + 1;
- int* widths = FX_Alloc(int, size);
- int i;
- for (i = 0; i < size; i ++) {
- int glyph_index = pEncoding->GlyphFromCharCode(start + i);
- widths[i] = pFont->GetGlyphWidth(glyph_index);
- }
- for (i = 1; i < size; i ++)
- if (widths[i] != *widths) {
- break;
- }
- if (i == size) {
- int first = pWidthArray->GetInteger(pWidthArray->GetCount() - 1);
- pWidthArray->AddInteger(first + size - 1);
- pWidthArray->AddInteger(*widths);
- } else {
- CPDF_Array* pWidthArray1 = FX_NEW CPDF_Array;
- pWidthArray->Add(pWidthArray1);
- for (i = 0; i < size; i ++) {
- pWidthArray1->AddInteger(widths[i]);
- }
- }
- FX_Free(widths);
-}
-CPDF_Font* CPDF_Document::AddFont(CFX_Font* pFont, int charset, FX_BOOL bVert)
-{
- if (pFont == NULL) {
- return NULL;
- }
- FX_BOOL bCJK = charset == FXFONT_CHINESEBIG5_CHARSET || charset == FXFONT_GB2312_CHARSET ||
- charset == FXFONT_HANGEUL_CHARSET || charset == FXFONT_SHIFTJIS_CHARSET;
- CFX_ByteString basefont = pFont->GetFamilyName();
- basefont.Replace(" ", "");
- int flags = 0;
- if (pFont->IsBold()) {
- flags |= PDFFONT_FORCEBOLD;
- }
- if (pFont->IsItalic()) {
- flags |= PDFFONT_ITALIC;
- }
- if (pFont->IsFixedWidth()) {
- flags |= PDFFONT_FIXEDPITCH;
- }
- CPDF_Dictionary* pBaseDict = FX_NEW CPDF_Dictionary;
- pBaseDict->SetAtName("Type", "Font");
- IFX_FontEncoding* pEncoding = FXGE_CreateUnicodeEncoding(pFont);
- CPDF_Dictionary* pFontDict = pBaseDict;
- if (!bCJK) {
- CPDF_Array* pWidths = FX_NEW CPDF_Array;
- int charcode;
- for (charcode = 32; charcode < 128; charcode ++) {
- int glyph_index = pEncoding->GlyphFromCharCode(charcode);
- int char_width = pFont->GetGlyphWidth(glyph_index);
- pWidths->AddInteger(char_width);
- }
- if (charset == FXFONT_ANSI_CHARSET || charset == FXFONT_DEFAULT_CHARSET ||
- charset == FXFONT_SYMBOL_CHARSET) {
- if (charset == FXFONT_SYMBOL_CHARSET) {
- flags |= PDFFONT_SYMBOLIC;
- } else {
- flags |= PDFFONT_NONSYMBOLIC;
- }
- pBaseDict->SetAtName(FX_BSTRC("Encoding"), "WinAnsiEncoding");
- for (charcode = 128; charcode <= 255; charcode ++) {
- int glyph_index = pEncoding->GlyphFromCharCode(charcode);
- int char_width = pFont->GetGlyphWidth(glyph_index);
- pWidths->AddInteger(char_width);
- }
- } else {
- flags |= PDFFONT_NONSYMBOLIC;
- int i;
- for (i = 0; i < sizeof g_FX_CharsetUnicodes / sizeof(FX_CharsetUnicodes); i ++)
- if (g_FX_CharsetUnicodes[i].m_Charset == charset) {
- break;
- }
- if (i < sizeof g_FX_CharsetUnicodes / sizeof(FX_CharsetUnicodes)) {
- CPDF_Dictionary* pEncodingDict = FX_NEW CPDF_Dictionary;
- pEncodingDict->SetAtName(FX_BSTRC("BaseEncoding"), "WinAnsiEncoding");
- CPDF_Array* pArray = FX_NEW CPDF_Array;
- pArray->AddInteger(128);
- const FX_WCHAR* pUnicodes = g_FX_CharsetUnicodes[i].m_pUnicodes;
- for (int j = 0; j < 128; j ++) {
- CFX_ByteString name = PDF_AdobeNameFromUnicode(pUnicodes[j]);
- if (name.IsEmpty()) {
- pArray->AddName(FX_BSTRC(".notdef"));
- } else {
- pArray->AddName(name);
- }
- int glyph_index = pEncoding->GlyphFromCharCode(pUnicodes[j]);
- int char_width = pFont->GetGlyphWidth(glyph_index);
- pWidths->AddInteger(char_width);
- }
- pEncodingDict->SetAt(FX_BSTRC("Differences"), pArray);
- AddIndirectObject(pEncodingDict);
- pBaseDict->SetAtReference(FX_BSTRC("Encoding"), this, pEncodingDict);
- }
- }
- if (pFont->IsBold() && pFont->IsItalic()) {
- basefont += ",BoldItalic";
- } else if (pFont->IsBold()) {
- basefont += ",Bold";
- } else if (pFont->IsItalic()) {
- basefont += ",Italic";
- }
- pBaseDict->SetAtName("Subtype", "TrueType");
- pBaseDict->SetAtName("BaseFont", basefont);
- pBaseDict->SetAtNumber("FirstChar", 32);
- pBaseDict->SetAtNumber("LastChar", 255);
- pBaseDict->SetAt("Widths", pWidths);
- } else {
- flags |= PDFFONT_NONSYMBOLIC;
- pFontDict = FX_NEW CPDF_Dictionary;
- CFX_ByteString cmap;
- CFX_ByteString ordering;
- int supplement;
- CPDF_Array* pWidthArray = FX_NEW CPDF_Array;
- switch (charset) {
- case FXFONT_CHINESEBIG5_CHARSET:
- cmap = bVert ? "ETenms-B5-V" : "ETenms-B5-H";
- ordering = "CNS1";
- supplement = 4;
- pWidthArray->AddInteger(1);
- _InsertWidthArray1(pFont, pEncoding, 0x20, 0x7e, pWidthArray);
- break;
- case FXFONT_GB2312_CHARSET:
- cmap = bVert ? "GBK-EUC-V" : "GBK-EUC-H";
- ordering = "GB1", supplement = 2;
- pWidthArray->AddInteger(7716);
- _InsertWidthArray1(pFont, pEncoding, 0x20, 0x20, pWidthArray);
- pWidthArray->AddInteger(814);
- _InsertWidthArray1(pFont, pEncoding, 0x21, 0x7e, pWidthArray);
- break;
- case FXFONT_HANGEUL_CHARSET:
- cmap = bVert ? "KSCms-UHC-V" : "KSCms-UHC-H";
- ordering = "Korea1";
- supplement = 2;
- pWidthArray->AddInteger(1);
- _InsertWidthArray1(pFont, pEncoding, 0x20, 0x7e, pWidthArray);
- break;
- case FXFONT_SHIFTJIS_CHARSET:
- cmap = bVert ? "90ms-RKSJ-V" : "90ms-RKSJ-H";
- ordering = "Japan1";
- supplement = 5;
- pWidthArray->AddInteger(231);
- _InsertWidthArray1(pFont, pEncoding, 0x20, 0x7d, pWidthArray);
- pWidthArray->AddInteger(326);
- _InsertWidthArray1(pFont, pEncoding, 0xa0, 0xa0, pWidthArray);
- pWidthArray->AddInteger(327);
- _InsertWidthArray1(pFont, pEncoding, 0xa1, 0xdf, pWidthArray);
- pWidthArray->AddInteger(631);
- _InsertWidthArray1(pFont, pEncoding, 0x7e, 0x7e, pWidthArray);
- break;
- }
- pBaseDict->SetAtName("Subtype", "Type0");
- pBaseDict->SetAtName("BaseFont", basefont);
- pBaseDict->SetAtName("Encoding", cmap);
- pFontDict->SetAt("W", pWidthArray);
- pFontDict->SetAtName("Type", "Font");
- pFontDict->SetAtName("Subtype", "CIDFontType2");
- pFontDict->SetAtName("BaseFont", basefont);
- CPDF_Dictionary* pCIDSysInfo = FX_NEW CPDF_Dictionary;
- pCIDSysInfo->SetAtString("Registry", "Adobe");
- pCIDSysInfo->SetAtString("Ordering", ordering);
- pCIDSysInfo->SetAtInteger("Supplement", supplement);
- pFontDict->SetAt("CIDSystemInfo", pCIDSysInfo);
- CPDF_Array* pArray = FX_NEW CPDF_Array;
- pBaseDict->SetAt("DescendantFonts", pArray);
- AddIndirectObject(pFontDict);
- pArray->AddReference(this, pFontDict);
- }
- AddIndirectObject(pBaseDict);
- CPDF_Dictionary* pFontDesc = FX_NEW CPDF_Dictionary;
- pFontDesc->SetAtName("Type", "FontDescriptor");
- pFontDesc->SetAtName("FontName", basefont);
- pFontDesc->SetAtInteger("Flags", flags);
- pFontDesc->SetAtInteger("ItalicAngle", pFont->m_pSubstFont ? pFont->m_pSubstFont->m_ItalicAngle : 0);
- pFontDesc->SetAtInteger("Ascent", pFont->GetAscent());
- pFontDesc->SetAtInteger("Descent", pFont->GetDescent());
- FX_RECT bbox;
- pFont->GetBBox(bbox);
- CPDF_Array* pBBox = FX_NEW CPDF_Array;
- pBBox->AddInteger(bbox.left);
- pBBox->AddInteger(bbox.bottom);
- pBBox->AddInteger(bbox.right);
- pBBox->AddInteger(bbox.top);
- pFontDesc->SetAt("FontBBox", pBBox);
- FX_INT32 nStemV = 0;
- if (pFont->m_pSubstFont) {
- nStemV = pFont->m_pSubstFont->m_Weight / 5;
- } else {
- static const FX_CHAR stem_chars[] = {'i', 'I', '!', '1'};
- const size_t count = sizeof(stem_chars) / sizeof(stem_chars[0]);
- FX_DWORD glyph = pEncoding->GlyphFromCharCode(stem_chars[0]);
- nStemV = pFont->GetGlyphWidth(glyph);
- for (size_t i = 1; i < count; i++) {
- glyph = pEncoding->GlyphFromCharCode(stem_chars[i]);
- int width = pFont->GetGlyphWidth(glyph);
- if (width > 0 && width < nStemV) {
- nStemV = width;
- }
- }
- }
- if (pEncoding) {
- delete pEncoding;
- }
- pFontDesc->SetAtInteger("StemV", nStemV);
- AddIndirectObject(pFontDesc);
- pFontDict->SetAtReference("FontDescriptor", this, pFontDesc);
- return LoadFont(pBaseDict);
-}
-static CPDF_Stream* GetFormStream(CPDF_Document* pDoc, CPDF_Object* pResObj)
-{
- if (pResObj->GetType() != PDFOBJ_REFERENCE) {
- return NULL;
- }
- CPDF_Reference* pRef = (CPDF_Reference*)pResObj;
- FX_BOOL bForm;
- if (pDoc->IsFormStream(pRef->GetRefObjNum(), bForm) && !bForm) {
- return NULL;
- }
- pResObj = pRef->GetDirect();
- if (pResObj->GetType() != PDFOBJ_STREAM) {
- return NULL;
- }
- CPDF_Stream* pXObject = (CPDF_Stream*)pResObj;
- if (pXObject->GetDict()->GetString(FX_BSTRC("Subtype")) != FX_BSTRC("Form")) {
- return NULL;
- }
- return pXObject;
-}
-static int InsertDeletePDFPage(CPDF_Document* pDoc, CPDF_Dictionary* pPages,
- int nPagesToGo, CPDF_Dictionary* pPage, FX_BOOL bInsert, CFX_PtrArray& stackList)
-{
- CPDF_Array* pKidList = pPages->GetArray("Kids");
- if (!pKidList) {
- return -1;
- }
- int nKids = pKidList->GetCount();
- for (int i = 0; i < nKids; i ++) {
- CPDF_Dictionary* pKid = pKidList->GetDict(i);
- if (pKid->GetString("Type") == FX_BSTRC("Page")) {
- if (nPagesToGo == 0) {
- if (bInsert) {
- pKidList->InsertAt(i, CPDF_Reference::Create(pDoc, pPage->GetObjNum()));
- pPage->SetAtReference("Parent", pDoc, pPages->GetObjNum());
- } else {
- pKidList->RemoveAt(i);
- }
- pPages->SetAtInteger("Count", pPages->GetInteger("Count") + (bInsert ? 1 : -1));
- return 1;
- }
- nPagesToGo --;
- } else {
- int nPages = pKid->GetInteger("Count");
- if (nPagesToGo < nPages) {
- int stackCount = stackList.GetSize();
- for (int j = 0; j < stackCount; ++j) {
- if (pKid == stackList[j]) {
- return -1;
- }
- }
- stackList.Add(pKid);
- if (InsertDeletePDFPage(pDoc, pKid, nPagesToGo, pPage, bInsert, stackList) < 0) {
- return -1;
- }
- stackList.RemoveAt(stackCount);
- pPages->SetAtInteger("Count", pPages->GetInteger("Count") + (bInsert ? 1 : -1));
- return 1;
- }
- nPagesToGo -= nPages;
- }
- }
- return 0;
-}
-static int InsertNewPage(CPDF_Document* pDoc, int iPage, CPDF_Dictionary* pPageDict, CFX_DWordArray &pageList)
-{
- CPDF_Dictionary* pRoot = pDoc->GetRoot();
- if (!pRoot) {
- return -1;
- }
- CPDF_Dictionary* pPages = pRoot->GetDict(FX_BSTRC("Pages"));
- if (!pPages) {
- return -1;
- }
- int nPages = pDoc->GetPageCount();
- if (iPage < 0 || iPage > nPages) {
- return -1;
- }
- if (iPage == nPages) {
- CPDF_Array* pPagesList = pPages->GetArray(FX_BSTRC("Kids"));
- if (!pPagesList) {
- pPagesList = FX_NEW CPDF_Array;
- pPages->SetAt(FX_BSTRC("Kids"), pPagesList);
- }
- pPagesList->Add(pPageDict, pDoc);
- pPages->SetAtInteger(FX_BSTRC("Count"), nPages + 1);
- pPageDict->SetAtReference(FX_BSTRC("Parent"), pDoc, pPages->GetObjNum());
- } else {
- CFX_PtrArray stack;
- stack.Add(pPages);
- if (InsertDeletePDFPage(pDoc, pPages, iPage, pPageDict, TRUE, stack) < 0) {
- return -1;
- }
- }
- pageList.InsertAt(iPage, pPageDict->GetObjNum());
- return iPage;
-}
-CPDF_Dictionary* CPDF_Document::CreateNewPage(int iPage)
-{
- CPDF_Dictionary* pDict = FX_NEW CPDF_Dictionary;
- pDict->SetAtName("Type", "Page");
- FX_DWORD dwObjNum = AddIndirectObject(pDict);
- if (InsertNewPage(this, iPage, pDict, m_PageList) < 0) {
- ReleaseIndirectObject(dwObjNum);
- return NULL;
- }
- return pDict;
-}
-int _PDF_GetStandardFontName(CFX_ByteString& name);
-CPDF_Font* CPDF_Document::AddStandardFont(FX_LPCSTR font, CPDF_FontEncoding* pEncoding)
-{
- CFX_ByteString name(font, -1);
- if (_PDF_GetStandardFontName(name) < 0) {
- return NULL;
- }
- return GetPageData()->GetStandardFont(name, pEncoding);
-}
-void CPDF_Document::DeletePage(int iPage)
-{
- CPDF_Dictionary* pRoot = GetRoot();
- if (pRoot == NULL) {
- return;
- }
- CPDF_Dictionary* pPages = pRoot->GetDict("Pages");
- if (pPages == NULL) {
- return;
- }
- int nPages = pPages->GetInteger("Count");
- if (iPage < 0 || iPage >= nPages) {
- return;
- }
- CFX_PtrArray stack;
- stack.Add(pPages);
- if (InsertDeletePDFPage(this, pPages, iPage, NULL, FALSE, stack) < 0) {
- return;
- }
- m_PageList.RemoveAt(iPage);
-}
-CPDF_Object* FPDFAPI_GetPageAttr(CPDF_Dictionary* pPageDict, FX_BSTR name);
-void FPDFAPI_FlatPageAttr(CPDF_Dictionary* pPageDict, FX_BSTR name)
-{
- if (pPageDict->KeyExist(name)) {
- return;
- }
- CPDF_Object* pObj = FPDFAPI_GetPageAttr(pPageDict, name);
- if (pObj) {
- pPageDict->SetAt(name, pObj->Clone());
- }
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fpdfapi/fpdf_page.h"
+#include "../../../include/fpdfapi/fpdf_module.h"
+#include "../fpdf_page/pageint.h"
+#include <limits.h>
+CPDF_Document::CPDF_Document() : CPDF_IndirectObjects(NULL)
+{
+ m_pRootDict = NULL;
+ m_pInfoDict = NULL;
+ m_bLinearized = FALSE;
+ m_dwFirstPageNo = 0;
+ m_dwFirstPageObjNum = 0;
+ m_pDocPage = CPDF_ModuleMgr::Get()->GetPageModule()->CreateDocData(this);
+ m_pDocRender = CPDF_ModuleMgr::Get()->GetRenderModule()->CreateDocData(this);
+}
+void CPDF_Document::CreateNewDoc()
+{
+ ASSERT(m_pRootDict == NULL && m_pInfoDict == NULL);
+ m_pRootDict = FX_NEW CPDF_Dictionary;
+ m_pRootDict->SetAtName("Type", "Catalog");
+ int objnum = AddIndirectObject(m_pRootDict);
+ CPDF_Dictionary* pPages = FX_NEW CPDF_Dictionary;
+ pPages->SetAtName("Type", "Pages");
+ pPages->SetAtNumber("Count", 0);
+ pPages->SetAt("Kids", FX_NEW CPDF_Array);
+ objnum = AddIndirectObject(pPages);
+ m_pRootDict->SetAtReference("Pages", this, objnum);
+ m_pInfoDict = FX_NEW CPDF_Dictionary;
+ AddIndirectObject(m_pInfoDict);
+}
+static const FX_WCHAR g_FX_CP874Unicodes[128] = {
+ 0x20AC, 0x0000, 0x0000, 0x0000, 0x0000, 0x2026, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x00A0, 0x0E01, 0x0E02, 0x0E03, 0x0E04, 0x0E05, 0x0E06, 0x0E07,
+ 0x0E08, 0x0E09, 0x0E0A, 0x0E0B, 0x0E0C, 0x0E0D, 0x0E0E, 0x0E0F,
+ 0x0E10, 0x0E11, 0x0E12, 0x0E13, 0x0E14, 0x0E15, 0x0E16, 0x0E17,
+ 0x0E18, 0x0E19, 0x0E1A, 0x0E1B, 0x0E1C, 0x0E1D, 0x0E1E, 0x0E1F,
+ 0x0E20, 0x0E21, 0x0E22, 0x0E23, 0x0E24, 0x0E25, 0x0E26, 0x0E27,
+ 0x0E28, 0x0E29, 0x0E2A, 0x0E2B, 0x0E2C, 0x0E2D, 0x0E2E, 0x0E2F,
+ 0x0E30, 0x0E31, 0x0E32, 0x0E33, 0x0E34, 0x0E35, 0x0E36, 0x0E37,
+ 0x0E38, 0x0E39, 0x0E3A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0E3F,
+ 0x0E40, 0x0E41, 0x0E42, 0x0E43, 0x0E44, 0x0E45, 0x0E46, 0x0E47,
+ 0x0E48, 0x0E49, 0x0E4A, 0x0E4B, 0x0E4C, 0x0E4D, 0x0E4E, 0x0E4F,
+ 0x0E50, 0x0E51, 0x0E52, 0x0E53, 0x0E54, 0x0E55, 0x0E56, 0x0E57,
+ 0x0E58, 0x0E59, 0x0E5A, 0x0E5B, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+static const FX_WCHAR g_FX_CP1250Unicodes[128] = {
+ 0x20AC, 0x0000, 0x201A, 0x0000, 0x201E, 0x2026, 0x2020, 0x2021,
+ 0x0000, 0x2030, 0x0160, 0x2039, 0x015A, 0x0164, 0x017D, 0x0179,
+ 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
+ 0x0000, 0x2122, 0x0161, 0x203A, 0x015B, 0x0165, 0x017E, 0x017A,
+ 0x00A0, 0x02C7, 0x02D8, 0x0141, 0x00A4, 0x0104, 0x00A6, 0x00A7,
+ 0x00A8, 0x00A9, 0x015E, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x017B,
+ 0x00B0, 0x00B1, 0x02DB, 0x0142, 0x00B4, 0x00B5, 0x00B6, 0x00B7,
+ 0x00B8, 0x0105, 0x015F, 0x00BB, 0x013D, 0x02DD, 0x013E, 0x017C,
+ 0x0154, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x0139, 0x0106, 0x00C7,
+ 0x010C, 0x00C9, 0x0118, 0x00CB, 0x011A, 0x00CD, 0x00CE, 0x010E,
+ 0x0110, 0x0143, 0x0147, 0x00D3, 0x00D4, 0x0150, 0x00D6, 0x00D7,
+ 0x0158, 0x016E, 0x00DA, 0x0170, 0x00DC, 0x00DD, 0x0162, 0x00DF,
+ 0x0155, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x013A, 0x0107, 0x00E7,
+ 0x010D, 0x00E9, 0x0119, 0x00EB, 0x011B, 0x00ED, 0x00EE, 0x010F,
+ 0x0111, 0x0144, 0x0148, 0x00F3, 0x00F4, 0x0151, 0x00F6, 0x00F7,
+ 0x0159, 0x016F, 0x00FA, 0x0171, 0x00FC, 0x00FD, 0x0163, 0x02D9,
+};
+static const FX_WCHAR g_FX_CP1251Unicodes[128] = {
+ 0x0402, 0x0403, 0x201A, 0x0453, 0x201E, 0x2026, 0x2020, 0x2021,
+ 0x20AC, 0x2030, 0x0409, 0x2039, 0x040A, 0x040C, 0x040B, 0x040F,
+ 0x0452, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
+ 0x0000, 0x2122, 0x0459, 0x203A, 0x045A, 0x045C, 0x045B, 0x045F,
+ 0x00A0, 0x040E, 0x045E, 0x0408, 0x00A4, 0x0490, 0x00A6, 0x00A7,
+ 0x0401, 0x00A9, 0x0404, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x0407,
+ 0x00B0, 0x00B1, 0x0406, 0x0456, 0x0491, 0x00B5, 0x00B6, 0x00B7,
+ 0x0451, 0x2116, 0x0454, 0x00BB, 0x0458, 0x0405, 0x0455, 0x0457,
+ 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417,
+ 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F,
+ 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427,
+ 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F,
+ 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437,
+ 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F,
+ 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447,
+ 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F,
+};
+static const FX_WCHAR g_FX_CP1253Unicodes[128] = {
+ 0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021,
+ 0x0000, 0x2030, 0x0000, 0x2039, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
+ 0x0000, 0x2122, 0x0000, 0x203A, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x00A0, 0x0385, 0x0386, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7,
+ 0x00A8, 0x00A9, 0x0000, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x2015,
+ 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x0384, 0x00B5, 0x00B6, 0x00B7,
+ 0x0388, 0x0389, 0x038A, 0x00BB, 0x038C, 0x00BD, 0x038E, 0x038F,
+ 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397,
+ 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F,
+ 0x03A0, 0x03A1, 0x0000, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7,
+ 0x03A8, 0x03A9, 0x03AA, 0x03AB, 0x03AC, 0x03AD, 0x03AE, 0x03AF,
+ 0x03B0, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7,
+ 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF,
+ 0x03C0, 0x03C1, 0x03C2, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7,
+ 0x03C8, 0x03C9, 0x03CA, 0x03CB, 0x03CC, 0x03CD, 0x03CE, 0x0000,
+};
+static const FX_WCHAR g_FX_CP1254Unicodes[128] = {
+ 0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021,
+ 0x02C6, 0x2030, 0x0160, 0x2039, 0x0152, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
+ 0x02DC, 0x2122, 0x0161, 0x203A, 0x0153, 0x0000, 0x0000, 0x0178,
+ 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7,
+ 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
+ 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7,
+ 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF,
+ 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7,
+ 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF,
+ 0x011E, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7,
+ 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x0130, 0x015E, 0x00DF,
+ 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7,
+ 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,
+ 0x011F, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7,
+ 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x0131, 0x015F, 0x00FF,
+};
+static const FX_WCHAR g_FX_CP1255Unicodes[128] = {
+ 0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021,
+ 0x02C6, 0x2030, 0x0000, 0x2039, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
+ 0x02DC, 0x2122, 0x0000, 0x203A, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x20AA, 0x00A5, 0x00A6, 0x00A7,
+ 0x00A8, 0x00A9, 0x00D7, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
+ 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7,
+ 0x00B8, 0x00B9, 0x00F7, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF,
+ 0x05B0, 0x05B1, 0x05B2, 0x05B3, 0x05B4, 0x05B5, 0x05B6, 0x05B7,
+ 0x05B8, 0x05B9, 0x0000, 0x05BB, 0x05BC, 0x05BD, 0x05BE, 0x05BF,
+ 0x05C0, 0x05C1, 0x05C2, 0x05C3, 0x05F0, 0x05F1, 0x05F2, 0x05F3,
+ 0x05F4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x05D0, 0x05D1, 0x05D2, 0x05D3, 0x05D4, 0x05D5, 0x05D6, 0x05D7,
+ 0x05D8, 0x05D9, 0x05DA, 0x05DB, 0x05DC, 0x05DD, 0x05DE, 0x05DF,
+ 0x05E0, 0x05E1, 0x05E2, 0x05E3, 0x05E4, 0x05E5, 0x05E6, 0x05E7,
+ 0x05E8, 0x05E9, 0x05EA, 0x0000, 0x0000, 0x200E, 0x200F, 0x0000,
+};
+static const FX_WCHAR g_FX_CP1256Unicodes[128] = {
+ 0x20AC, 0x067E, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021,
+ 0x02C6, 0x2030, 0x0679, 0x2039, 0x0152, 0x0686, 0x0698, 0x0688,
+ 0x06AF, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
+ 0x06A9, 0x2122, 0x0691, 0x203A, 0x0153, 0x200C, 0x200D, 0x06BA,
+ 0x00A0, 0x060C, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7,
+ 0x00A8, 0x00A9, 0x06BE, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
+ 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7,
+ 0x00B8, 0x00B9, 0x061B, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x061F,
+ 0x06C1, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627,
+ 0x0628, 0x0629, 0x062A, 0x062B, 0x062C, 0x062D, 0x062E, 0x062F,
+ 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x00D7,
+ 0x0637, 0x0638, 0x0639, 0x063A, 0x0640, 0x0641, 0x0642, 0x0643,
+ 0x00E0, 0x0644, 0x00E2, 0x0645, 0x0646, 0x0647, 0x0648, 0x00E7,
+ 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x0649, 0x064A, 0x00EE, 0x00EF,
+ 0x064B, 0x064C, 0x064D, 0x064E, 0x00F4, 0x064F, 0x0650, 0x00F7,
+ 0x0651, 0x00F9, 0x0652, 0x00FB, 0x00FC, 0x200E, 0x200F, 0x06D2,
+};
+static const FX_WCHAR g_FX_CP1257Unicodes[128] = {
+ 0x20AC, 0x0000, 0x201A, 0x0000, 0x201E, 0x2026, 0x2020, 0x2021,
+ 0x0000, 0x2030, 0x0000, 0x2039, 0x0000, 0x00A8, 0x02C7, 0x00B8,
+ 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
+ 0x0000, 0x2122, 0x0000, 0x203A, 0x0000, 0x00AF, 0x02DB, 0x0000,
+ 0x00A0, 0x0000, 0x00A2, 0x00A3, 0x00A4, 0x0000, 0x00A6, 0x00A7,
+ 0x00D8, 0x00A9, 0x0156, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00C6,
+ 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7,
+ 0x00F8, 0x00B9, 0x0157, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00E6,
+ 0x0104, 0x012E, 0x0100, 0x0106, 0x00C4, 0x00C5, 0x0118, 0x0112,
+ 0x010C, 0x00C9, 0x0179, 0x0116, 0x0122, 0x0136, 0x012A, 0x013B,
+ 0x0160, 0x0143, 0x0145, 0x00D3, 0x014C, 0x00D5, 0x00D6, 0x00D7,
+ 0x0172, 0x0141, 0x015A, 0x016A, 0x00DC, 0x017B, 0x017D, 0x00DF,
+ 0x0105, 0x012F, 0x0101, 0x0107, 0x00E4, 0x00E5, 0x0119, 0x0113,
+ 0x010D, 0x00E9, 0x017A, 0x0117, 0x0123, 0x0137, 0x012B, 0x013C,
+ 0x0161, 0x0144, 0x0146, 0x00F3, 0x014D, 0x00F5, 0x00F6, 0x00F7,
+ 0x0173, 0x0142, 0x015B, 0x016B, 0x00FC, 0x017C, 0x017E, 0x02D9,
+};
+typedef struct {
+ FX_BYTE m_Charset;
+ const FX_WCHAR* m_pUnicodes;
+} FX_CharsetUnicodes;
+const FX_CharsetUnicodes g_FX_CharsetUnicodes[] = {
+ { FXFONT_THAI_CHARSET, g_FX_CP874Unicodes },
+ { FXFONT_EASTEUROPE_CHARSET, g_FX_CP1250Unicodes },
+ { FXFONT_RUSSIAN_CHARSET, g_FX_CP1251Unicodes },
+ { FXFONT_GREEK_CHARSET, g_FX_CP1253Unicodes },
+ { FXFONT_TURKISH_CHARSET, g_FX_CP1254Unicodes },
+ { FXFONT_HEBREW_CHARSET, g_FX_CP1255Unicodes },
+ { FXFONT_ARABIC_CHARSET, g_FX_CP1256Unicodes },
+ { FXFONT_BALTIC_CHARSET, g_FX_CP1257Unicodes },
+};
+#if (_FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN32_MOBILE_ || _FX_OS_ == _FX_WIN64_)
+static void _InsertWidthArray(HDC hDC, int start, int end, CPDF_Array* pWidthArray)
+{
+ int size = end - start + 1;
+ int* widths = FX_Alloc(int, size);
+ GetCharWidth(hDC, start, end, widths);
+ int i;
+ for (i = 1; i < size; i ++)
+ if (widths[i] != *widths) {
+ break;
+ }
+ if (i == size) {
+ int first = pWidthArray->GetInteger(pWidthArray->GetCount() - 1);
+ pWidthArray->AddInteger(first + size - 1);
+ pWidthArray->AddInteger(*widths);
+ } else {
+ CPDF_Array* pWidthArray1 = FX_NEW CPDF_Array;
+ pWidthArray->Add(pWidthArray1);
+ for (i = 0; i < size; i ++) {
+ pWidthArray1->AddInteger(widths[i]);
+ }
+ }
+ FX_Free(widths);
+}
+CPDF_Font* CPDF_Document::AddWindowsFont(LOGFONTW* pLogFont, FX_BOOL bVert, FX_BOOL bTranslateName)
+{
+ LOGFONTA lfa;
+ FXSYS_memcpy32(&lfa, pLogFont, (char*)lfa.lfFaceName - (char*)&lfa);
+ CFX_ByteString face = CFX_ByteString::FromUnicode(pLogFont->lfFaceName);
+ if (face.GetLength() >= LF_FACESIZE) {
+ return NULL;
+ }
+ FXSYS_strcpy(lfa.lfFaceName, (FX_LPCSTR)face);
+ return AddWindowsFont(&lfa, bVert, bTranslateName);
+}
+extern CFX_ByteString _FPDF_GetNameFromTT(FX_LPCBYTE name_table, FX_DWORD name);
+CFX_ByteString _FPDF_GetPSNameFromTT(HDC hDC)
+{
+ CFX_ByteString result;
+ DWORD size = ::GetFontData(hDC, 'eman', 0, NULL, 0);
+ if (size != GDI_ERROR) {
+ LPBYTE buffer = FX_Alloc(BYTE, size);
+ ::GetFontData(hDC, 'eman', 0, buffer, size);
+ result = _FPDF_GetNameFromTT(buffer, 6);
+ FX_Free(buffer);
+ }
+ return result;
+}
+CPDF_Font* CPDF_Document::AddWindowsFont(LOGFONTA* pLogFont, FX_BOOL bVert, FX_BOOL bTranslateName)
+{
+ pLogFont->lfHeight = -1000;
+ pLogFont->lfWidth = 0;
+ HGDIOBJ hFont = CreateFontIndirectA(pLogFont);
+ HDC hDC = CreateCompatibleDC(NULL);
+ hFont = SelectObject(hDC, hFont);
+ int tm_size = GetOutlineTextMetrics(hDC, 0, NULL);
+ if (tm_size == 0) {
+ hFont = SelectObject(hDC, hFont);
+ DeleteObject(hFont);
+ DeleteDC(hDC);
+ return NULL;
+ }
+ LPBYTE tm_buf = FX_Alloc(BYTE, tm_size);
+ OUTLINETEXTMETRIC* ptm = (OUTLINETEXTMETRIC*)tm_buf;
+ GetOutlineTextMetrics(hDC, tm_size, ptm);
+ int flags = 0, italicangle, ascend, descend, capheight, bbox[4];
+ if (pLogFont->lfItalic) {
+ flags |= PDFFONT_ITALIC;
+ }
+ if ((pLogFont->lfPitchAndFamily & 3) == FIXED_PITCH) {
+ flags |= PDFFONT_FIXEDPITCH;
+ }
+ if ((pLogFont->lfPitchAndFamily & 0xf8) == FF_ROMAN) {
+ flags |= PDFFONT_SERIF;
+ }
+ if ((pLogFont->lfPitchAndFamily & 0xf8) == FF_SCRIPT) {
+ flags |= PDFFONT_SCRIPT;
+ }
+ FX_BOOL bCJK = pLogFont->lfCharSet == CHINESEBIG5_CHARSET || pLogFont->lfCharSet == GB2312_CHARSET ||
+ pLogFont->lfCharSet == HANGEUL_CHARSET || pLogFont->lfCharSet == SHIFTJIS_CHARSET;
+ CFX_ByteString basefont;
+ if (bTranslateName && bCJK) {
+ basefont = _FPDF_GetPSNameFromTT(hDC);
+ }
+ if (basefont.IsEmpty()) {
+ basefont = pLogFont->lfFaceName;
+ }
+ italicangle = ptm->otmItalicAngle / 10;
+ ascend = ptm->otmrcFontBox.top;
+ descend = ptm->otmrcFontBox.bottom;
+ capheight = ptm->otmsCapEmHeight;
+ bbox[0] = ptm->otmrcFontBox.left;
+ bbox[1] = ptm->otmrcFontBox.bottom;
+ bbox[2] = ptm->otmrcFontBox.right;
+ bbox[3] = ptm->otmrcFontBox.top;
+ FX_Free(tm_buf);
+ basefont.Replace(" ", "");
+ CPDF_Dictionary* pBaseDict = FX_NEW CPDF_Dictionary;
+ pBaseDict->SetAtName("Type", "Font");
+ CPDF_Dictionary* pFontDict = pBaseDict;
+ if (!bCJK) {
+ if (pLogFont->lfCharSet == ANSI_CHARSET || pLogFont->lfCharSet == DEFAULT_CHARSET ||
+ pLogFont->lfCharSet == SYMBOL_CHARSET) {
+ if (pLogFont->lfCharSet == SYMBOL_CHARSET) {
+ flags |= PDFFONT_SYMBOLIC;
+ } else {
+ flags |= PDFFONT_NONSYMBOLIC;
+ }
+ pBaseDict->SetAtName(FX_BSTRC("Encoding"), "WinAnsiEncoding");
+ } else {
+ flags |= PDFFONT_NONSYMBOLIC;
+ int i;
+ for (i = 0; i < sizeof g_FX_CharsetUnicodes / sizeof(FX_CharsetUnicodes); i ++)
+ if (g_FX_CharsetUnicodes[i].m_Charset == pLogFont->lfCharSet) {
+ break;
+ }
+ if (i < sizeof g_FX_CharsetUnicodes / sizeof(FX_CharsetUnicodes)) {
+ CPDF_Dictionary* pEncoding = FX_NEW CPDF_Dictionary;
+ pEncoding->SetAtName(FX_BSTRC("BaseEncoding"), "WinAnsiEncoding");
+ CPDF_Array* pArray = FX_NEW CPDF_Array;
+ pArray->AddInteger(128);
+ const FX_WCHAR* pUnicodes = g_FX_CharsetUnicodes[i].m_pUnicodes;
+ for (int j = 0; j < 128; j ++) {
+ CFX_ByteString name = PDF_AdobeNameFromUnicode(pUnicodes[j]);
+ if (name.IsEmpty()) {
+ pArray->AddName(FX_BSTRC(".notdef"));
+ } else {
+ pArray->AddName(name);
+ }
+ }
+ pEncoding->SetAt(FX_BSTRC("Differences"), pArray);
+ AddIndirectObject(pEncoding);
+ pBaseDict->SetAtReference(FX_BSTRC("Encoding"), this, pEncoding);
+ }
+ }
+ if (pLogFont->lfWeight > FW_MEDIUM && pLogFont->lfItalic) {
+ basefont += ",BoldItalic";
+ } else if (pLogFont->lfWeight > FW_MEDIUM) {
+ basefont += ",Bold";
+ } else if (pLogFont->lfItalic) {
+ basefont += ",Italic";
+ }
+ pBaseDict->SetAtName("Subtype", "TrueType");
+ pBaseDict->SetAtName("BaseFont", basefont);
+ pBaseDict->SetAtNumber("FirstChar", 32);
+ pBaseDict->SetAtNumber("LastChar", 255);
+ int char_widths[224];
+ GetCharWidth(hDC, 32, 255, char_widths);
+ CPDF_Array* pWidths = FX_NEW CPDF_Array;
+ for (int i = 0; i < 224; i ++) {
+ pWidths->AddInteger(char_widths[i]);
+ }
+ pBaseDict->SetAt("Widths", pWidths);
+ } else {
+ flags |= PDFFONT_NONSYMBOLIC;
+ pFontDict = FX_NEW CPDF_Dictionary;
+ CFX_ByteString cmap;
+ CFX_ByteString ordering;
+ int supplement;
+ CPDF_Array* pWidthArray = FX_NEW CPDF_Array;
+ switch (pLogFont->lfCharSet) {
+ case CHINESEBIG5_CHARSET:
+ cmap = bVert ? "ETenms-B5-V" : "ETenms-B5-H";
+ ordering = "CNS1";
+ supplement = 4;
+ pWidthArray->AddInteger(1);
+ _InsertWidthArray(hDC, 0x20, 0x7e, pWidthArray);
+ break;
+ case GB2312_CHARSET:
+ cmap = bVert ? "GBK-EUC-V" : "GBK-EUC-H";
+ ordering = "GB1", supplement = 2;
+ pWidthArray->AddInteger(7716);
+ _InsertWidthArray(hDC, 0x20, 0x20, pWidthArray);
+ pWidthArray->AddInteger(814);
+ _InsertWidthArray(hDC, 0x21, 0x7e, pWidthArray);
+ break;
+ case HANGEUL_CHARSET:
+ cmap = bVert ? "KSCms-UHC-V" : "KSCms-UHC-H";
+ ordering = "Korea1";
+ supplement = 2;
+ pWidthArray->AddInteger(1);
+ _InsertWidthArray(hDC, 0x20, 0x7e, pWidthArray);
+ break;
+ case SHIFTJIS_CHARSET:
+ cmap = bVert ? "90ms-RKSJ-V" : "90ms-RKSJ-H";
+ ordering = "Japan1";
+ supplement = 5;
+ pWidthArray->AddInteger(231);
+ _InsertWidthArray(hDC, 0x20, 0x7d, pWidthArray);
+ pWidthArray->AddInteger(326);
+ _InsertWidthArray(hDC, 0xa0, 0xa0, pWidthArray);
+ pWidthArray->AddInteger(327);
+ _InsertWidthArray(hDC, 0xa1, 0xdf, pWidthArray);
+ pWidthArray->AddInteger(631);
+ _InsertWidthArray(hDC, 0x7e, 0x7e, pWidthArray);
+ break;
+ }
+ pBaseDict->SetAtName("Subtype", "Type0");
+ pBaseDict->SetAtName("BaseFont", basefont);
+ pBaseDict->SetAtName("Encoding", cmap);
+ pFontDict->SetAt("W", pWidthArray);
+ pFontDict->SetAtName("Type", "Font");
+ pFontDict->SetAtName("Subtype", "CIDFontType2");
+ pFontDict->SetAtName("BaseFont", basefont);
+ CPDF_Dictionary* pCIDSysInfo = FX_NEW CPDF_Dictionary;
+ pCIDSysInfo->SetAtString("Registry", "Adobe");
+ pCIDSysInfo->SetAtString("Ordering", ordering);
+ pCIDSysInfo->SetAtInteger("Supplement", supplement);
+ pFontDict->SetAt("CIDSystemInfo", pCIDSysInfo);
+ CPDF_Array* pArray = FX_NEW CPDF_Array;
+ pBaseDict->SetAt("DescendantFonts", pArray);
+ AddIndirectObject(pFontDict);
+ pArray->AddReference(this, pFontDict);
+ }
+ AddIndirectObject(pBaseDict);
+ CPDF_Dictionary* pFontDesc = FX_NEW CPDF_Dictionary;
+ pFontDesc->SetAtName("Type", "FontDescriptor");
+ pFontDesc->SetAtName("FontName", basefont);
+ pFontDesc->SetAtInteger("Flags", flags);
+ CPDF_Array* pBBox = FX_NEW CPDF_Array;
+ for (int i = 0; i < 4; i ++) {
+ pBBox->AddInteger(bbox[i]);
+ }
+ pFontDesc->SetAt("FontBBox", pBBox);
+ pFontDesc->SetAtInteger("ItalicAngle", italicangle);
+ pFontDesc->SetAtInteger("Ascent", ascend);
+ pFontDesc->SetAtInteger("Descent", descend);
+ pFontDesc->SetAtInteger("CapHeight", capheight);
+ pFontDesc->SetAtInteger("StemV", pLogFont->lfWeight / 5);
+ AddIndirectObject(pFontDesc);
+ pFontDict->SetAtReference("FontDescriptor", this, pFontDesc);
+ hFont = SelectObject(hDC, hFont);
+ DeleteObject(hFont);
+ DeleteDC(hDC);
+ return LoadFont(pBaseDict);
+}
+#endif
+#if (_FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_)
+FX_UINT32 FX_GetLangHashCode( FX_LPCSTR pStr)
+{
+ FXSYS_assert( pStr != NULL);
+ FX_INT32 iLength = FXSYS_strlen(pStr);
+ FX_LPCSTR pStrEnd = pStr + iLength;
+ FX_UINT32 uHashCode = 0;
+ while ( pStr < pStrEnd) {
+ uHashCode = 31 * uHashCode + tolower(*pStr++);
+ }
+ return uHashCode;
+}
+struct FX_LANG2CS {
+ FX_DWORD uLang;
+ int uCharset;
+}*FX_LPLANG2CS;
+static const FX_LANG2CS gs_FXLang2CharsetTable[] = {
+ {3109, 0},
+ {3121, 178},
+ {3129, 162},
+ {3139, 204},
+ {3141, 204},
+ {3166, 0},
+ {3184, 238},
+ {3197, 0},
+ {3201, 0},
+ {3239, 161},
+ {3241, 0},
+ {3246, 0},
+ {3247, 186},
+ {3248, 0},
+ {3259, 178},
+ {3267, 0},
+ {3273, 0},
+ {3276, 0},
+ {3301, 0},
+ {3310, 1},
+ {3325, 177},
+ {3329, 1},
+ {3338, 238},
+ {3341, 238},
+ {3345, 1},
+ {3355, 0},
+ {3370, 0},
+ {3371, 0},
+ {3383, 128},
+ {3424, 204},
+ {3427, 1},
+ {3428, 129},
+ {3436, 178},
+ {3464, 186},
+ {3466, 186},
+ {3486, 204},
+ {3487, 0},
+ {3493, 1},
+ {3494, 0},
+ {3508, 0},
+ {3518, 0},
+ {3520, 0},
+ {3569, 1},
+ {3580, 238},
+ {3588, 0},
+ {3645, 238},
+ {3651, 204},
+ {3672, 238},
+ {3673, 238},
+ {3678, 238},
+ {3679, 238},
+ {3683, 0},
+ {3684, 0},
+ {3693, 1},
+ {3697, 1},
+ {3700, 222},
+ {3710, 162},
+ {3734, 204},
+ {3741, 178},
+ {3749, 162},
+ {3763, 163},
+ {3886, 134},
+ {105943, 0},
+ {106375, 1},
+ {3923451837, 134},
+ {3923451838, 136},
+};
+static FX_WORD FX_GetCsFromLangCode(FX_UINT32 uCode)
+{
+ FX_INT32 iStart = 0;
+ FX_INT32 iEnd = sizeof(gs_FXLang2CharsetTable) / sizeof(FX_LANG2CS) - 1;
+ while (iStart <= iEnd) {
+ FX_INT32 iMid = (iStart + iEnd) / 2;
+ const FX_LANG2CS &charset = gs_FXLang2CharsetTable[iMid];
+ if (uCode == charset.uLang) {
+ return charset.uCharset;
+ } else if (uCode < charset.uLang) {
+ iEnd = iMid - 1;
+ } else {
+ iStart = iMid + 1;
+ }
+ };
+ return 0;
+}
+static FX_WORD FX_GetCharsetFromLang(FX_LPCSTR pLang, FX_INT32 iLength)
+{
+ FXSYS_assert(pLang);
+ if (iLength < 0) {
+ iLength = FXSYS_strlen(pLang);
+ }
+ FX_UINT32 uHash = FX_GetLangHashCode(pLang);
+ return FX_GetCsFromLangCode(uHash);
+}
+static void _CFString2CFXByteString(CFStringRef src, CFX_ByteString &dest)
+{
+ SInt32 len = CFStringGetLength(src);
+ CFRange range = CFRangeMake(0, len);
+ CFIndex used = 0;
+ UInt8* pBuffer = (UInt8*)malloc(sizeof(UInt8) * (len + 1));
+ FXSYS_memset32(pBuffer, 0, sizeof(UInt8) * (len + 1));
+ CFStringGetBytes(src, range, kCFStringEncodingASCII, 0, false, pBuffer, len, &used);
+ dest = (FX_LPSTR)pBuffer;
+ free(pBuffer);
+}
+FX_BOOL IsHasCharSet(CFArrayRef languages, const CFX_DWordArray &charSets)
+{
+ int iCount = charSets.GetSize();
+ for (int i = 0; i < CFArrayGetCount(languages); ++i) {
+ CFStringRef language = (CFStringRef)CFArrayGetValueAtIndex(languages, i);
+ FX_DWORD CharSet = FX_GetCharsetFromLang(CFStringGetCStringPtr(language, kCFStringEncodingMacRoman), -1);
+ for (int j = 0; j < iCount; ++j) {
+ if (CharSet == charSets[j]) {
+ return TRUE;
+ }
+ }
+ }
+ return FALSE;
+}
+void FX_GetCharWidth(CTFontRef font, UniChar start, UniChar end, int* width)
+{
+ CGFloat size = CTFontGetSize(font);
+ for (; start <= end; ++start) {
+ CGGlyph pGlyph = 0;
+ CFIndex count = 1;
+ CTFontGetGlyphsForCharacters(font, &start, &pGlyph, count);
+ CGSize advances;
+ CTFontGetAdvancesForGlyphs(font, kCTFontDefaultOrientation, &pGlyph, &advances, 1);
+ *width = (int)(advances.width / size * 1000) ;
+ width++;
+ }
+}
+static void _InsertWidthArray(CTFontRef font, int start, int end, CPDF_Array* pWidthArray)
+{
+ int size = end - start + 1;
+ int* widths = FX_Alloc(int, size);
+ FX_GetCharWidth(font, start, end, widths);
+ int i;
+ for (i = 1; i < size; i ++)
+ if (widths[i] != *widths) {
+ break;
+ }
+ if (i == size) {
+ int first = pWidthArray->GetInteger(pWidthArray->GetCount() - 1);
+ pWidthArray->AddInteger(first + size - 1);
+ pWidthArray->AddInteger(*widths);
+ } else {
+ CPDF_Array* pWidthArray1 = FX_NEW CPDF_Array;
+ pWidthArray->Add(pWidthArray1);
+ for (i = 0; i < size; i ++) {
+ pWidthArray1->AddInteger(widths[i]);
+ }
+ }
+ FX_Free(widths);
+}
+CPDF_Font* CPDF_Document::AddMacFont(CTFontRef pFont, FX_BOOL bVert, FX_BOOL bTranslateName)
+{
+ CTFontRef font = (CTFontRef)pFont;
+ CTFontDescriptorRef descriptor = CTFontCopyFontDescriptor(font);
+ if (descriptor == NULL) {
+ return NULL;
+ }
+ CFX_ByteString basefont;
+ FX_BOOL bCJK = FALSE;
+ int flags = 0, italicangle = 0, ascend = 0, descend = 0, capheight = 0, bbox[4];
+ FXSYS_memset32(bbox, 0, sizeof(int) * 4);
+ CFArrayRef languages = (CFArrayRef)CTFontDescriptorCopyAttribute(descriptor, kCTFontLanguagesAttribute);
+ if (languages == NULL) {
+ CFRelease(descriptor);
+ return NULL;
+ }
+ CFX_DWordArray charSets;
+ charSets.Add(FXFONT_CHINESEBIG5_CHARSET);
+ charSets.Add(FXFONT_GB2312_CHARSET);
+ charSets.Add(FXFONT_HANGEUL_CHARSET);
+ charSets.Add(FXFONT_SHIFTJIS_CHARSET);
+ if (IsHasCharSet(languages, charSets)) {
+ bCJK = TRUE;
+ }
+ CFRelease(descriptor);
+ CFDictionaryRef traits = (CFDictionaryRef)CTFontCopyTraits(font);
+ if (traits == NULL) {
+ CFRelease(languages);
+ return NULL;
+ }
+ CFNumberRef sybolicTrait = (CFNumberRef)CFDictionaryGetValue(traits, kCTFontSymbolicTrait);
+ CTFontSymbolicTraits trait = 0;
+ CFNumberGetValue(sybolicTrait, kCFNumberSInt32Type, &trait);
+ if (trait & kCTFontItalicTrait) {
+ flags |= PDFFONT_ITALIC;
+ }
+ if (trait & kCTFontMonoSpaceTrait) {
+ flags |= PDFFONT_FIXEDPITCH;
+ }
+ if (trait & kCTFontModernSerifsClass) {
+ flags |= PDFFONT_SERIF;
+ }
+ if (trait & kCTFontScriptsClass) {
+ flags |= PDFFONT_SCRIPT;
+ }
+ CFNumberRef weightTrait = (CFNumberRef)CFDictionaryGetValue(traits, kCTFontWeightTrait);
+ Float32 weight = 0;
+ CFNumberGetValue(weightTrait, kCFNumberFloat32Type, &weight);
+ italicangle = CTFontGetSlantAngle(font);
+ ascend = CTFontGetAscent(font);
+ descend = CTFontGetDescent(font);
+ capheight = CTFontGetCapHeight(font);
+ CGRect box = CTFontGetBoundingBox(font);
+ bbox[0] = box.origin.x;
+ bbox[1] = box.origin.y;
+ bbox[2] = box.origin.x + box.size.width;
+ bbox[3] = box.origin.y + box.size.height;
+ if (bTranslateName && bCJK) {
+ CFStringRef postName = CTFontCopyPostScriptName(font);
+ _CFString2CFXByteString(postName, basefont);
+ CFRelease(postName);
+ }
+ if (basefont.IsEmpty()) {
+ CFStringRef fullName = CTFontCopyFullName(font);
+ _CFString2CFXByteString(fullName, basefont);
+ CFRelease(fullName);
+ }
+ basefont.Replace(" ", "");
+ CPDF_Dictionary* pFontDict = NULL;
+ CPDF_Dictionary* pBaseDict = FX_NEW CPDF_Dictionary;
+ pFontDict = pBaseDict;
+ if (!bCJK) {
+ charSets.RemoveAll();
+ charSets.Add(FXFONT_ANSI_CHARSET);
+ charSets.Add(FXFONT_DEFAULT_CHARSET);
+ charSets.Add(FXFONT_SYMBOL_CHARSET);
+ if (IsHasCharSet(languages, charSets)) {
+ charSets.RemoveAll();
+ charSets.Add(FXFONT_SYMBOL_CHARSET);
+ if (IsHasCharSet(languages, charSets)) {
+ flags |= PDFFONT_SYMBOLIC;
+ } else {
+ flags |= PDFFONT_NONSYMBOLIC;
+ }
+ pBaseDict->SetAtName(FX_BSTRC("Encoding"), "WinAnsiEncoding");
+ } else {
+ flags |= PDFFONT_NONSYMBOLIC;
+ int i;
+ for (i = 0; i < sizeof g_FX_CharsetUnicodes / sizeof(FX_CharsetUnicodes); i ++) {
+ charSets.RemoveAll();
+ charSets.Add(g_FX_CharsetUnicodes[i].m_Charset);
+ if (IsHasCharSet(languages, charSets)) {
+ break;
+ }
+ }
+ if (i < sizeof g_FX_CharsetUnicodes / sizeof(FX_CharsetUnicodes)) {
+ CPDF_Dictionary* pEncoding = FX_NEW CPDF_Dictionary;
+ pEncoding->SetAtName(FX_BSTRC("BaseEncoding"), "WinAnsiEncoding");
+ CPDF_Array* pArray = FX_NEW CPDF_Array;
+ pArray->AddInteger(128);
+ const FX_WCHAR* pUnicodes = g_FX_CharsetUnicodes[i].m_pUnicodes;
+ for (int j = 0; j < 128; j ++) {
+ CFX_ByteString name = PDF_AdobeNameFromUnicode(pUnicodes[j]);
+ if (name.IsEmpty()) {
+ pArray->AddName(FX_BSTRC(".notdef"));
+ } else {
+ pArray->AddName(name);
+ }
+ }
+ pEncoding->SetAt(FX_BSTRC("Differences"), pArray);
+ AddIndirectObject(pEncoding);
+ pBaseDict->SetAtReference(FX_BSTRC("Encoding"), this, pEncoding);
+ }
+ }
+ if (weight > 0.0 && trait & kCTFontItalicTrait) {
+ basefont += ",BoldItalic";
+ } else if (weight > 0.0) {
+ basefont += ",Bold";
+ } else if (trait & kCTFontItalicTrait) {
+ basefont += ",Italic";
+ }
+ pBaseDict->SetAtName("Subtype", "TrueType");
+ pBaseDict->SetAtName("BaseFont", basefont);
+ pBaseDict->SetAtNumber("FirstChar", 32);
+ pBaseDict->SetAtNumber("LastChar", 255);
+ int char_widths[224];
+ FX_GetCharWidth(font, 32, 255, char_widths);
+ CPDF_Array* pWidths = FX_NEW CPDF_Array;
+ for (int i = 0; i < 224; i ++) {
+ pWidths->AddInteger(char_widths[i]);
+ }
+ pBaseDict->SetAt("Widths", pWidths);
+ } else {
+ flags |= PDFFONT_NONSYMBOLIC;
+ CPDF_Array* pArray = NULL;
+ pFontDict = FX_NEW CPDF_Dictionary;
+ CFX_ByteString cmap;
+ CFX_ByteString ordering;
+ int supplement;
+ FX_BOOL bFound = FALSE;
+ CPDF_Array* pWidthArray = FX_NEW CPDF_Array;
+ charSets.RemoveAll();
+ charSets.Add(FXFONT_CHINESEBIG5_CHARSET);
+ if (IsHasCharSet(languages, charSets)) {
+ cmap = bVert ? "ETenms-B5-V" : "ETenms-B5-H";
+ ordering = "CNS1";
+ supplement = 4;
+ pWidthArray->AddInteger(1);
+ _InsertWidthArray(font, 0x20, 0x7e, pWidthArray);
+ bFound = TRUE;
+ }
+ charSets.RemoveAll();
+ charSets.Add(FXFONT_GB2312_CHARSET);
+ if (!bFound && IsHasCharSet(languages, charSets)) {
+ cmap = bVert ? "GBK-EUC-V" : "GBK-EUC-H";
+ ordering = "GB1", supplement = 2;
+ pWidthArray->AddInteger(7716);
+ _InsertWidthArray(font, 0x20, 0x20, pWidthArray);
+ pWidthArray->AddInteger(814);
+ _InsertWidthArray(font, 0x21, 0x7e, pWidthArray);
+ bFound = TRUE;
+ }
+ charSets.RemoveAll();
+ charSets.Add(FXFONT_HANGEUL_CHARSET);
+ if (!bFound && IsHasCharSet(languages, charSets)) {
+ cmap = bVert ? "KSCms-UHC-V" : "KSCms-UHC-H";
+ ordering = "Korea1";
+ supplement = 2;
+ pWidthArray->AddInteger(1);
+ _InsertWidthArray(font, 0x20, 0x7e, pWidthArray);
+ bFound = TRUE;
+ }
+ charSets.RemoveAll();
+ charSets.Add(FXFONT_SHIFTJIS_CHARSET);
+ if (!bFound && IsHasCharSet(languages, charSets)) {
+ cmap = bVert ? "90ms-RKSJ-V" : "90ms-RKSJ-H";
+ ordering = "Japan1";
+ supplement = 5;
+ pWidthArray->AddInteger(231);
+ _InsertWidthArray(font, 0x20, 0x7d, pWidthArray);
+ pWidthArray->AddInteger(326);
+ _InsertWidthArray(font, 0xa0, 0xa0, pWidthArray);
+ pWidthArray->AddInteger(327);
+ _InsertWidthArray(font, 0xa1, 0xdf, pWidthArray);
+ pWidthArray->AddInteger(631);
+ _InsertWidthArray(font, 0x7e, 0x7e, pWidthArray);
+ }
+ pBaseDict->SetAtName("Subtype", "Type0");
+ pBaseDict->SetAtName("BaseFont", basefont);
+ pBaseDict->SetAtName("Encoding", cmap);
+ pFontDict->SetAt("W", pWidthArray);
+ pFontDict->SetAtName("Type", "Font");
+ pFontDict->SetAtName("Subtype", "CIDFontType2");
+ pFontDict->SetAtName("BaseFont", basefont);
+ CPDF_Dictionary* pCIDSysInfo = FX_NEW CPDF_Dictionary;
+ pCIDSysInfo->SetAtString("Registry", "Adobe");
+ pCIDSysInfo->SetAtString("Ordering", ordering);
+ pCIDSysInfo->SetAtInteger("Supplement", supplement);
+ pFontDict->SetAt("CIDSystemInfo", pCIDSysInfo);
+ pArray = FX_NEW CPDF_Array;
+ pBaseDict->SetAt("DescendantFonts", pArray);
+ AddIndirectObject(pFontDict);
+ pArray->AddReference(this, pFontDict);
+ }
+ AddIndirectObject(pBaseDict);
+ CPDF_Dictionary* pFontDesc = FX_NEW CPDF_Dictionary;
+ pFontDesc->SetAtName("Type", "FontDescriptor");
+ pFontDesc->SetAtName("FontName", basefont);
+ pFontDesc->SetAtInteger("Flags", flags);
+ CPDF_Array* pBBox = FX_NEW CPDF_Array;
+ for (int i = 0; i < 4; i ++) {
+ pBBox->AddInteger(bbox[i]);
+ }
+ pFontDesc->SetAt("FontBBox", pBBox);
+ pFontDesc->SetAtInteger("ItalicAngle", italicangle);
+ pFontDesc->SetAtInteger("Ascent", ascend);
+ pFontDesc->SetAtInteger("Descent", descend);
+ pFontDesc->SetAtInteger("CapHeight", capheight);
+ CGFloat fStemV = 0;
+ int16_t min_width = SHRT_MAX;
+ static const UniChar stem_chars[] = {'i', 'I', '!', '1'};
+ const size_t count = sizeof(stem_chars) / sizeof(stem_chars[0]);
+ CGGlyph glyphs[count];
+ CGRect boundingRects[count];
+ if (CTFontGetGlyphsForCharacters(font, stem_chars, glyphs, count)) {
+ CTFontGetBoundingRectsForGlyphs(font, kCTFontHorizontalOrientation,
+ glyphs, boundingRects, count);
+ for (size_t i = 0; i < count; i++) {
+ int16_t width = boundingRects[i].size.width;
+ if (width > 0 && width < min_width) {
+ min_width = width;
+ fStemV = min_width;
+ }
+ }
+ }
+ pFontDesc->SetAtInteger("StemV", fStemV);
+ AddIndirectObject(pFontDesc);
+ pFontDict->SetAtReference("FontDescriptor", this, pFontDesc);
+ CFRelease(traits);
+ CFRelease(languages);
+ return LoadFont(pBaseDict);
+}
+#endif
+static void _InsertWidthArray1(CFX_Font* pFont, IFX_FontEncoding* pEncoding, FX_WCHAR start, FX_WCHAR end, CPDF_Array* pWidthArray)
+{
+ int size = end - start + 1;
+ int* widths = FX_Alloc(int, size);
+ int i;
+ for (i = 0; i < size; i ++) {
+ int glyph_index = pEncoding->GlyphFromCharCode(start + i);
+ widths[i] = pFont->GetGlyphWidth(glyph_index);
+ }
+ for (i = 1; i < size; i ++)
+ if (widths[i] != *widths) {
+ break;
+ }
+ if (i == size) {
+ int first = pWidthArray->GetInteger(pWidthArray->GetCount() - 1);
+ pWidthArray->AddInteger(first + size - 1);
+ pWidthArray->AddInteger(*widths);
+ } else {
+ CPDF_Array* pWidthArray1 = FX_NEW CPDF_Array;
+ pWidthArray->Add(pWidthArray1);
+ for (i = 0; i < size; i ++) {
+ pWidthArray1->AddInteger(widths[i]);
+ }
+ }
+ FX_Free(widths);
+}
+CPDF_Font* CPDF_Document::AddFont(CFX_Font* pFont, int charset, FX_BOOL bVert)
+{
+ if (pFont == NULL) {
+ return NULL;
+ }
+ FX_BOOL bCJK = charset == FXFONT_CHINESEBIG5_CHARSET || charset == FXFONT_GB2312_CHARSET ||
+ charset == FXFONT_HANGEUL_CHARSET || charset == FXFONT_SHIFTJIS_CHARSET;
+ CFX_ByteString basefont = pFont->GetFamilyName();
+ basefont.Replace(" ", "");
+ int flags = 0;
+ if (pFont->IsBold()) {
+ flags |= PDFFONT_FORCEBOLD;
+ }
+ if (pFont->IsItalic()) {
+ flags |= PDFFONT_ITALIC;
+ }
+ if (pFont->IsFixedWidth()) {
+ flags |= PDFFONT_FIXEDPITCH;
+ }
+ CPDF_Dictionary* pBaseDict = FX_NEW CPDF_Dictionary;
+ pBaseDict->SetAtName("Type", "Font");
+ IFX_FontEncoding* pEncoding = FXGE_CreateUnicodeEncoding(pFont);
+ CPDF_Dictionary* pFontDict = pBaseDict;
+ if (!bCJK) {
+ CPDF_Array* pWidths = FX_NEW CPDF_Array;
+ int charcode;
+ for (charcode = 32; charcode < 128; charcode ++) {
+ int glyph_index = pEncoding->GlyphFromCharCode(charcode);
+ int char_width = pFont->GetGlyphWidth(glyph_index);
+ pWidths->AddInteger(char_width);
+ }
+ if (charset == FXFONT_ANSI_CHARSET || charset == FXFONT_DEFAULT_CHARSET ||
+ charset == FXFONT_SYMBOL_CHARSET) {
+ if (charset == FXFONT_SYMBOL_CHARSET) {
+ flags |= PDFFONT_SYMBOLIC;
+ } else {
+ flags |= PDFFONT_NONSYMBOLIC;
+ }
+ pBaseDict->SetAtName(FX_BSTRC("Encoding"), "WinAnsiEncoding");
+ for (charcode = 128; charcode <= 255; charcode ++) {
+ int glyph_index = pEncoding->GlyphFromCharCode(charcode);
+ int char_width = pFont->GetGlyphWidth(glyph_index);
+ pWidths->AddInteger(char_width);
+ }
+ } else {
+ flags |= PDFFONT_NONSYMBOLIC;
+ int i;
+ for (i = 0; i < sizeof g_FX_CharsetUnicodes / sizeof(FX_CharsetUnicodes); i ++)
+ if (g_FX_CharsetUnicodes[i].m_Charset == charset) {
+ break;
+ }
+ if (i < sizeof g_FX_CharsetUnicodes / sizeof(FX_CharsetUnicodes)) {
+ CPDF_Dictionary* pEncodingDict = FX_NEW CPDF_Dictionary;
+ pEncodingDict->SetAtName(FX_BSTRC("BaseEncoding"), "WinAnsiEncoding");
+ CPDF_Array* pArray = FX_NEW CPDF_Array;
+ pArray->AddInteger(128);
+ const FX_WCHAR* pUnicodes = g_FX_CharsetUnicodes[i].m_pUnicodes;
+ for (int j = 0; j < 128; j ++) {
+ CFX_ByteString name = PDF_AdobeNameFromUnicode(pUnicodes[j]);
+ if (name.IsEmpty()) {
+ pArray->AddName(FX_BSTRC(".notdef"));
+ } else {
+ pArray->AddName(name);
+ }
+ int glyph_index = pEncoding->GlyphFromCharCode(pUnicodes[j]);
+ int char_width = pFont->GetGlyphWidth(glyph_index);
+ pWidths->AddInteger(char_width);
+ }
+ pEncodingDict->SetAt(FX_BSTRC("Differences"), pArray);
+ AddIndirectObject(pEncodingDict);
+ pBaseDict->SetAtReference(FX_BSTRC("Encoding"), this, pEncodingDict);
+ }
+ }
+ if (pFont->IsBold() && pFont->IsItalic()) {
+ basefont += ",BoldItalic";
+ } else if (pFont->IsBold()) {
+ basefont += ",Bold";
+ } else if (pFont->IsItalic()) {
+ basefont += ",Italic";
+ }
+ pBaseDict->SetAtName("Subtype", "TrueType");
+ pBaseDict->SetAtName("BaseFont", basefont);
+ pBaseDict->SetAtNumber("FirstChar", 32);
+ pBaseDict->SetAtNumber("LastChar", 255);
+ pBaseDict->SetAt("Widths", pWidths);
+ } else {
+ flags |= PDFFONT_NONSYMBOLIC;
+ pFontDict = FX_NEW CPDF_Dictionary;
+ CFX_ByteString cmap;
+ CFX_ByteString ordering;
+ int supplement;
+ CPDF_Array* pWidthArray = FX_NEW CPDF_Array;
+ switch (charset) {
+ case FXFONT_CHINESEBIG5_CHARSET:
+ cmap = bVert ? "ETenms-B5-V" : "ETenms-B5-H";
+ ordering = "CNS1";
+ supplement = 4;
+ pWidthArray->AddInteger(1);
+ _InsertWidthArray1(pFont, pEncoding, 0x20, 0x7e, pWidthArray);
+ break;
+ case FXFONT_GB2312_CHARSET:
+ cmap = bVert ? "GBK-EUC-V" : "GBK-EUC-H";
+ ordering = "GB1", supplement = 2;
+ pWidthArray->AddInteger(7716);
+ _InsertWidthArray1(pFont, pEncoding, 0x20, 0x20, pWidthArray);
+ pWidthArray->AddInteger(814);
+ _InsertWidthArray1(pFont, pEncoding, 0x21, 0x7e, pWidthArray);
+ break;
+ case FXFONT_HANGEUL_CHARSET:
+ cmap = bVert ? "KSCms-UHC-V" : "KSCms-UHC-H";
+ ordering = "Korea1";
+ supplement = 2;
+ pWidthArray->AddInteger(1);
+ _InsertWidthArray1(pFont, pEncoding, 0x20, 0x7e, pWidthArray);
+ break;
+ case FXFONT_SHIFTJIS_CHARSET:
+ cmap = bVert ? "90ms-RKSJ-V" : "90ms-RKSJ-H";
+ ordering = "Japan1";
+ supplement = 5;
+ pWidthArray->AddInteger(231);
+ _InsertWidthArray1(pFont, pEncoding, 0x20, 0x7d, pWidthArray);
+ pWidthArray->AddInteger(326);
+ _InsertWidthArray1(pFont, pEncoding, 0xa0, 0xa0, pWidthArray);
+ pWidthArray->AddInteger(327);
+ _InsertWidthArray1(pFont, pEncoding, 0xa1, 0xdf, pWidthArray);
+ pWidthArray->AddInteger(631);
+ _InsertWidthArray1(pFont, pEncoding, 0x7e, 0x7e, pWidthArray);
+ break;
+ }
+ pBaseDict->SetAtName("Subtype", "Type0");
+ pBaseDict->SetAtName("BaseFont", basefont);
+ pBaseDict->SetAtName("Encoding", cmap);
+ pFontDict->SetAt("W", pWidthArray);
+ pFontDict->SetAtName("Type", "Font");
+ pFontDict->SetAtName("Subtype", "CIDFontType2");
+ pFontDict->SetAtName("BaseFont", basefont);
+ CPDF_Dictionary* pCIDSysInfo = FX_NEW CPDF_Dictionary;
+ pCIDSysInfo->SetAtString("Registry", "Adobe");
+ pCIDSysInfo->SetAtString("Ordering", ordering);
+ pCIDSysInfo->SetAtInteger("Supplement", supplement);
+ pFontDict->SetAt("CIDSystemInfo", pCIDSysInfo);
+ CPDF_Array* pArray = FX_NEW CPDF_Array;
+ pBaseDict->SetAt("DescendantFonts", pArray);
+ AddIndirectObject(pFontDict);
+ pArray->AddReference(this, pFontDict);
+ }
+ AddIndirectObject(pBaseDict);
+ CPDF_Dictionary* pFontDesc = FX_NEW CPDF_Dictionary;
+ pFontDesc->SetAtName("Type", "FontDescriptor");
+ pFontDesc->SetAtName("FontName", basefont);
+ pFontDesc->SetAtInteger("Flags", flags);
+ pFontDesc->SetAtInteger("ItalicAngle", pFont->m_pSubstFont ? pFont->m_pSubstFont->m_ItalicAngle : 0);
+ pFontDesc->SetAtInteger("Ascent", pFont->GetAscent());
+ pFontDesc->SetAtInteger("Descent", pFont->GetDescent());
+ FX_RECT bbox;
+ pFont->GetBBox(bbox);
+ CPDF_Array* pBBox = FX_NEW CPDF_Array;
+ pBBox->AddInteger(bbox.left);
+ pBBox->AddInteger(bbox.bottom);
+ pBBox->AddInteger(bbox.right);
+ pBBox->AddInteger(bbox.top);
+ pFontDesc->SetAt("FontBBox", pBBox);
+ FX_INT32 nStemV = 0;
+ if (pFont->m_pSubstFont) {
+ nStemV = pFont->m_pSubstFont->m_Weight / 5;
+ } else {
+ static const FX_CHAR stem_chars[] = {'i', 'I', '!', '1'};
+ const size_t count = sizeof(stem_chars) / sizeof(stem_chars[0]);
+ FX_DWORD glyph = pEncoding->GlyphFromCharCode(stem_chars[0]);
+ nStemV = pFont->GetGlyphWidth(glyph);
+ for (size_t i = 1; i < count; i++) {
+ glyph = pEncoding->GlyphFromCharCode(stem_chars[i]);
+ int width = pFont->GetGlyphWidth(glyph);
+ if (width > 0 && width < nStemV) {
+ nStemV = width;
+ }
+ }
+ }
+ if (pEncoding) {
+ delete pEncoding;
+ }
+ pFontDesc->SetAtInteger("StemV", nStemV);
+ AddIndirectObject(pFontDesc);
+ pFontDict->SetAtReference("FontDescriptor", this, pFontDesc);
+ return LoadFont(pBaseDict);
+}
+static CPDF_Stream* GetFormStream(CPDF_Document* pDoc, CPDF_Object* pResObj)
+{
+ if (pResObj->GetType() != PDFOBJ_REFERENCE) {
+ return NULL;
+ }
+ CPDF_Reference* pRef = (CPDF_Reference*)pResObj;
+ FX_BOOL bForm;
+ if (pDoc->IsFormStream(pRef->GetRefObjNum(), bForm) && !bForm) {
+ return NULL;
+ }
+ pResObj = pRef->GetDirect();
+ if (pResObj->GetType() != PDFOBJ_STREAM) {
+ return NULL;
+ }
+ CPDF_Stream* pXObject = (CPDF_Stream*)pResObj;
+ if (pXObject->GetDict()->GetString(FX_BSTRC("Subtype")) != FX_BSTRC("Form")) {
+ return NULL;
+ }
+ return pXObject;
+}
+static int InsertDeletePDFPage(CPDF_Document* pDoc, CPDF_Dictionary* pPages,
+ int nPagesToGo, CPDF_Dictionary* pPage, FX_BOOL bInsert, CFX_PtrArray& stackList)
+{
+ CPDF_Array* pKidList = pPages->GetArray("Kids");
+ if (!pKidList) {
+ return -1;
+ }
+ int nKids = pKidList->GetCount();
+ for (int i = 0; i < nKids; i ++) {
+ CPDF_Dictionary* pKid = pKidList->GetDict(i);
+ if (pKid->GetString("Type") == FX_BSTRC("Page")) {
+ if (nPagesToGo == 0) {
+ if (bInsert) {
+ pKidList->InsertAt(i, CPDF_Reference::Create(pDoc, pPage->GetObjNum()));
+ pPage->SetAtReference("Parent", pDoc, pPages->GetObjNum());
+ } else {
+ pKidList->RemoveAt(i);
+ }
+ pPages->SetAtInteger("Count", pPages->GetInteger("Count") + (bInsert ? 1 : -1));
+ return 1;
+ }
+ nPagesToGo --;
+ } else {
+ int nPages = pKid->GetInteger("Count");
+ if (nPagesToGo < nPages) {
+ int stackCount = stackList.GetSize();
+ for (int j = 0; j < stackCount; ++j) {
+ if (pKid == stackList[j]) {
+ return -1;
+ }
+ }
+ stackList.Add(pKid);
+ if (InsertDeletePDFPage(pDoc, pKid, nPagesToGo, pPage, bInsert, stackList) < 0) {
+ return -1;
+ }
+ stackList.RemoveAt(stackCount);
+ pPages->SetAtInteger("Count", pPages->GetInteger("Count") + (bInsert ? 1 : -1));
+ return 1;
+ }
+ nPagesToGo -= nPages;
+ }
+ }
+ return 0;
+}
+static int InsertNewPage(CPDF_Document* pDoc, int iPage, CPDF_Dictionary* pPageDict, CFX_DWordArray &pageList)
+{
+ CPDF_Dictionary* pRoot = pDoc->GetRoot();
+ if (!pRoot) {
+ return -1;
+ }
+ CPDF_Dictionary* pPages = pRoot->GetDict(FX_BSTRC("Pages"));
+ if (!pPages) {
+ return -1;
+ }
+ int nPages = pDoc->GetPageCount();
+ if (iPage < 0 || iPage > nPages) {
+ return -1;
+ }
+ if (iPage == nPages) {
+ CPDF_Array* pPagesList = pPages->GetArray(FX_BSTRC("Kids"));
+ if (!pPagesList) {
+ pPagesList = FX_NEW CPDF_Array;
+ pPages->SetAt(FX_BSTRC("Kids"), pPagesList);
+ }
+ pPagesList->Add(pPageDict, pDoc);
+ pPages->SetAtInteger(FX_BSTRC("Count"), nPages + 1);
+ pPageDict->SetAtReference(FX_BSTRC("Parent"), pDoc, pPages->GetObjNum());
+ } else {
+ CFX_PtrArray stack;
+ stack.Add(pPages);
+ if (InsertDeletePDFPage(pDoc, pPages, iPage, pPageDict, TRUE, stack) < 0) {
+ return -1;
+ }
+ }
+ pageList.InsertAt(iPage, pPageDict->GetObjNum());
+ return iPage;
+}
+CPDF_Dictionary* CPDF_Document::CreateNewPage(int iPage)
+{
+ CPDF_Dictionary* pDict = FX_NEW CPDF_Dictionary;
+ pDict->SetAtName("Type", "Page");
+ FX_DWORD dwObjNum = AddIndirectObject(pDict);
+ if (InsertNewPage(this, iPage, pDict, m_PageList) < 0) {
+ ReleaseIndirectObject(dwObjNum);
+ return NULL;
+ }
+ return pDict;
+}
+int _PDF_GetStandardFontName(CFX_ByteString& name);
+CPDF_Font* CPDF_Document::AddStandardFont(FX_LPCSTR font, CPDF_FontEncoding* pEncoding)
+{
+ CFX_ByteString name(font, -1);
+ if (_PDF_GetStandardFontName(name) < 0) {
+ return NULL;
+ }
+ return GetPageData()->GetStandardFont(name, pEncoding);
+}
+void CPDF_Document::DeletePage(int iPage)
+{
+ CPDF_Dictionary* pRoot = GetRoot();
+ if (pRoot == NULL) {
+ return;
+ }
+ CPDF_Dictionary* pPages = pRoot->GetDict("Pages");
+ if (pPages == NULL) {
+ return;
+ }
+ int nPages = pPages->GetInteger("Count");
+ if (iPage < 0 || iPage >= nPages) {
+ return;
+ }
+ CFX_PtrArray stack;
+ stack.Add(pPages);
+ if (InsertDeletePDFPage(this, pPages, iPage, NULL, FALSE, stack) < 0) {
+ return;
+ }
+ m_PageList.RemoveAt(iPage);
+}
+CPDF_Object* FPDFAPI_GetPageAttr(CPDF_Dictionary* pPageDict, FX_BSTR name);
+void FPDFAPI_FlatPageAttr(CPDF_Dictionary* pPageDict, FX_BSTR name)
+{
+ if (pPageDict->KeyExist(name)) {
+ return;
+ }
+ CPDF_Object* pObj = FPDFAPI_GetPageAttr(pPageDict, name);
+ if (pObj) {
+ pPageDict->SetAt(name, pObj->Clone());
+ }
+}
diff --git a/core/src/fpdfapi/fpdf_edit/fpdf_edit_image.cpp b/core/src/fpdfapi/fpdf_edit/fpdf_edit_image.cpp
index cb50601226..d73d7614da 100644
--- a/core/src/fpdfapi/fpdf_edit/fpdf_edit_image.cpp
+++ b/core/src/fpdfapi/fpdf_edit/fpdf_edit_image.cpp
@@ -1,374 +1,374 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../../include/fpdfapi/fpdf_module.h"
-#include "../../../include/fpdfapi/fpdf_page.h"
-#include "../../../include/fxcodec/fx_codec.h"
-#include "../../../include/fpdfapi/fpdf_render.h"
-#include "../fpdf_page/pageint.h"
-#include "../fpdf_render/render_int.h"
-CPDF_Dictionary* CPDF_Image::InitJPEG(FX_LPBYTE pData, FX_DWORD size)
-{
- FX_INT32 width, height, color_trans, num_comps, bits;
- if (!CPDF_ModuleMgr::Get()->GetJpegModule()->
- LoadInfo(pData, size, width, height, num_comps, bits, color_trans)) {
- return NULL;
- }
- CPDF_Dictionary* pDict = FX_NEW CPDF_Dictionary;
- pDict->SetAtName("Type", "XObject");
- pDict->SetAtName("Subtype", "Image");
- pDict->SetAtInteger("Width", width);
- pDict->SetAtInteger("Height", height);
- FX_LPCSTR csname = NULL;
- if (num_comps == 1) {
- csname = "DeviceGray";
- } else if (num_comps == 3) {
- csname = "DeviceRGB";
- } else if (num_comps == 4) {
- csname = "DeviceCMYK";
- CPDF_Array* pDecode = CPDF_Array::Create();
- for (int n = 0; n < 4; n ++) {
- pDecode->AddInteger(1);
- pDecode->AddInteger(0);
- }
- pDict->SetAt(FX_BSTRC("Decode"), pDecode);
- }
- pDict->SetAtName("ColorSpace", csname);
- pDict->SetAtInteger("BitsPerComponent", bits);
- pDict->SetAtName("Filter", "DCTDecode");
- if (!color_trans) {
- CPDF_Dictionary* pParms = FX_NEW CPDF_Dictionary;
- pDict->SetAt("DecodeParms", pParms);
- pParms->SetAtInteger("ColorTransform", 0);
- }
- m_bIsMask = FALSE;
- m_Width = width;
- m_Height = height;
- if (m_pStream == NULL) {
- m_pStream = FX_NEW CPDF_Stream(NULL, 0, NULL);
- }
- return pDict;
-}
-void CPDF_Image::SetJpegImage(FX_LPBYTE pData, FX_DWORD size)
-{
- CPDF_Dictionary *pDict = InitJPEG(pData, size);
- if (!pDict) {
- return;
- }
- m_pStream->InitStream(pData, size, pDict);
-}
-void CPDF_Image::SetJpegImage(IFX_FileRead *pFile)
-{
- FX_DWORD size = (FX_DWORD)pFile->GetSize();
- if (!size) {
- return;
- }
- FX_DWORD dwEstimateSize = size;
- if (dwEstimateSize > 8192) {
- dwEstimateSize = 8192;
- }
- FX_LPBYTE pData = FX_Alloc(FX_BYTE, dwEstimateSize);
- if (!pData) {
- return;
- }
- pFile->ReadBlock(pData, 0, dwEstimateSize);
- CPDF_Dictionary *pDict = InitJPEG(pData, dwEstimateSize);
- FX_Free(pData);
- if (!pDict && size > dwEstimateSize) {
- pData = FX_Alloc(FX_BYTE, size);
- if (!pData) {
- return;
- }
- pFile->ReadBlock(pData, 0, size);
- pDict = InitJPEG(pData, size);
- FX_Free(pData);
- }
- if (!pDict) {
- return;
- }
- m_pStream->InitStream(pFile, pDict);
-}
-void _DCTEncodeBitmap(CPDF_Dictionary *pBitmapDict, const CFX_DIBitmap* pBitmap, int quality, FX_LPBYTE &buf, FX_STRSIZE &size)
-{
-}
-void _JBIG2EncodeBitmap(CPDF_Dictionary *pBitmapDict, const CFX_DIBitmap *pBitmap, CPDF_Document *pDoc, FX_LPBYTE &buf, FX_STRSIZE &size, FX_BOOL bLossLess)
-{
-}
-void CPDF_Image::SetImage(const CFX_DIBitmap* pBitmap, FX_INT32 iCompress, IFX_FileWrite *pFileWrite, IFX_FileRead *pFileRead, const CFX_DIBitmap* pMask, const CPDF_ImageSetParam* pParam)
-{
- FX_INT32 BitmapWidth = pBitmap->GetWidth();
- FX_INT32 BitmapHeight = pBitmap->GetHeight();
- if (BitmapWidth < 1 || BitmapHeight < 1) {
- return;
- }
- FX_LPBYTE src_buf = pBitmap->GetBuffer();
- FX_INT32 src_pitch = pBitmap->GetPitch();
- FX_INT32 bpp = pBitmap->GetBPP();
- FX_BOOL bUseMatte = pParam && pParam->pMatteColor && (pBitmap->GetFormat() == FXDIB_Argb);
- CPDF_Dictionary* pDict = FX_NEW CPDF_Dictionary;
- pDict->SetAtName(FX_BSTRC("Type"), FX_BSTRC("XObject"));
- pDict->SetAtName(FX_BSTRC("Subtype"), FX_BSTRC("Image"));
- pDict->SetAtInteger(FX_BSTRC("Width"), BitmapWidth);
- pDict->SetAtInteger(FX_BSTRC("Height"), BitmapHeight);
- FX_LPBYTE dest_buf = NULL;
- FX_STRSIZE dest_pitch = 0, dest_size = 0, opType = -1;
- if (bpp == 1) {
- FX_INT32 reset_a = 0, reset_r = 0, reset_g = 0, reset_b = 0;
- FX_INT32 set_a = 0, set_r = 0, set_g = 0, set_b = 0;
- if (!pBitmap->IsAlphaMask()) {
- ArgbDecode(pBitmap->GetPaletteArgb(0), reset_a, reset_r, reset_g, reset_b);
- ArgbDecode(pBitmap->GetPaletteArgb(1), set_a, set_r, set_g, set_b);
- }
- if (set_a == 0 || reset_a == 0) {
- pDict->SetAt(FX_BSTRC("ImageMask"), FX_NEW CPDF_Boolean(TRUE));
- if (reset_a == 0) {
- CPDF_Array* pArray = FX_NEW CPDF_Array;
- pArray->AddInteger(1);
- pArray->AddInteger(0);
- pDict->SetAt(FX_BSTRC("Decode"), pArray);
- }
- } else {
- CPDF_Array* pCS = FX_NEW CPDF_Array;
- pCS->AddName(FX_BSTRC("Indexed"));
- pCS->AddName(FX_BSTRC("DeviceRGB"));
- pCS->AddInteger(1);
- CFX_ByteString ct;
- FX_LPSTR pBuf = ct.GetBuffer(6);
- pBuf[0] = (FX_CHAR)reset_r;
- pBuf[1] = (FX_CHAR)reset_g;
- pBuf[2] = (FX_CHAR)reset_b;
- pBuf[3] = (FX_CHAR)set_r;
- pBuf[4] = (FX_CHAR)set_g;
- pBuf[5] = (FX_CHAR)set_b;
- ct.ReleaseBuffer(6);
- pCS->Add(CPDF_String::Create(ct, TRUE));
- pDict->SetAt(FX_BSTRC("ColorSpace"), pCS);
- }
- pDict->SetAtInteger(FX_BSTRC("BitsPerComponent"), 1);
- dest_pitch = (BitmapWidth + 7) / 8;
- if ((iCompress & 0x03) == PDF_IMAGE_NO_COMPRESS) {
- opType = 1;
- } else {
- opType = 0;
- }
- } else if (bpp == 8) {
- FX_INT32 iPalette = pBitmap->GetPaletteSize();
- if (iPalette > 0) {
- CPDF_Array* pCS = FX_NEW CPDF_Array;
- m_pDocument->AddIndirectObject(pCS);
- pCS->AddName(FX_BSTRC("Indexed"));
- pCS->AddName(FX_BSTRC("DeviceRGB"));
- pCS->AddInteger(iPalette - 1);
- FX_LPBYTE pColorTable = FX_Alloc(FX_BYTE, iPalette * 3);
- FX_LPBYTE ptr = pColorTable;
- for (FX_INT32 i = 0; i < iPalette; i ++) {
- FX_DWORD argb = pBitmap->GetPaletteArgb(i);
- ptr[0] = (FX_BYTE)(argb >> 16);
- ptr[1] = (FX_BYTE)(argb >> 8);
- ptr[2] = (FX_BYTE)argb;
- ptr += 3;
- }
- CPDF_Stream *pCTS = CPDF_Stream::Create(pColorTable, iPalette * 3, CPDF_Dictionary::Create());
- m_pDocument->AddIndirectObject(pCTS);
- pCS->AddReference(m_pDocument, pCTS);
- pDict->SetAtReference(FX_BSTRC("ColorSpace"), m_pDocument, pCS);
- } else {
- pDict->SetAtName(FX_BSTRC("ColorSpace"), FX_BSTRC("DeviceGray"));
- }
- pDict->SetAtInteger(FX_BSTRC("BitsPerComponent"), 8);
- if ((iCompress & 0x03) == PDF_IMAGE_NO_COMPRESS) {
- dest_pitch = BitmapWidth;
- opType = 1;
- } else {
- opType = 0;
- }
- } else {
- pDict->SetAtName(FX_BSTRC("ColorSpace"), FX_BSTRC("DeviceRGB"));
- pDict->SetAtInteger(FX_BSTRC("BitsPerComponent"), 8);
- if ((iCompress & 0x03) == PDF_IMAGE_NO_COMPRESS) {
- dest_pitch = BitmapWidth * 3;
- opType = 2;
- } else {
- opType = 0;
- }
- }
- const CFX_DIBitmap* pMaskBitmap = NULL;
- if (pBitmap->HasAlpha()) {
- pMaskBitmap = pBitmap->GetAlphaMask();
- }
- if (!pMaskBitmap && pMask) {
- FXDIB_Format maskFormat = pMask->GetFormat();
- if (maskFormat == FXDIB_1bppMask || maskFormat == FXDIB_8bppMask) {
- pMaskBitmap = pMask;
- }
- }
- if (pMaskBitmap) {
- FX_INT32 maskWidth = pMaskBitmap->GetWidth();
- FX_INT32 maskHeight = pMaskBitmap->GetHeight();
- FX_LPBYTE mask_buf = NULL;
- FX_STRSIZE mask_size;
- FX_BOOL bDeleteMask = TRUE;
- CPDF_Dictionary* pMaskDict = FX_NEW CPDF_Dictionary;
- pMaskDict->SetAtName(FX_BSTRC("Type"), FX_BSTRC("XObject"));
- pMaskDict->SetAtName(FX_BSTRC("Subtype"), FX_BSTRC("Image"));
- pMaskDict->SetAtInteger(FX_BSTRC("Width"), maskWidth);
- pMaskDict->SetAtInteger(FX_BSTRC("Height"), maskHeight);
- pMaskDict->SetAtName(FX_BSTRC("ColorSpace"), FX_BSTRC("DeviceGray"));
- pMaskDict->SetAtInteger(FX_BSTRC("BitsPerComponent"), 8);
- if (pMaskBitmap->GetBPP() == 8 && (iCompress & PDF_IMAGE_MASK_LOSSY_COMPRESS) != 0) {
- _DCTEncodeBitmap(pMaskDict, pMaskBitmap, pParam ? pParam->nQuality : 75, mask_buf, mask_size);
- } else if (pMaskBitmap->GetFormat() == FXDIB_1bppMask) {
- _JBIG2EncodeBitmap(pMaskDict, pMaskBitmap, m_pDocument, mask_buf, mask_size, TRUE);
- } else {
- mask_size = maskHeight * maskWidth;
- mask_buf = FX_Alloc(FX_BYTE, mask_size);
- for (FX_INT32 a = 0; a < maskHeight; a ++) {
- FXSYS_memcpy32(mask_buf + a * maskWidth, pMaskBitmap->GetScanline(a), maskWidth);
- }
- }
- if (pMaskDict) {
- pMaskDict->SetAtInteger(FX_BSTRC("Length"), mask_size);
- CPDF_Stream* pMaskStream = NULL;
- if (bUseMatte) {
- int a, r, g, b;
- ArgbDecode(*(pParam->pMatteColor), a, r, g, b);
- CPDF_Array* pMatte = FX_NEW CPDF_Array;
- pMatte->AddInteger(r);
- pMatte->AddInteger(g);
- pMatte->AddInteger(b);
- pMaskDict->SetAt(FX_BSTRC("Matte"), pMatte);
- }
- pMaskStream = FX_NEW CPDF_Stream(mask_buf, mask_size, pMaskDict);
- m_pDocument->AddIndirectObject(pMaskStream);
- bDeleteMask = FALSE;
- pDict->SetAtReference(FX_BSTRC("SMask"), m_pDocument, pMaskStream);
- }
- if (pBitmap->HasAlpha()) {
- delete pMaskBitmap;
- }
- }
- FX_BOOL bStream = pFileWrite != NULL && pFileRead != NULL;
- if (opType == 0) {
- if (iCompress & PDF_IMAGE_LOSSLESS_COMPRESS) {
- if (pBitmap->GetBPP() == 1) {
- _JBIG2EncodeBitmap(pDict, pBitmap, m_pDocument, dest_buf, dest_size, TRUE);
- }
- } else {
- if (pBitmap->GetBPP() == 1) {
- _JBIG2EncodeBitmap(pDict, pBitmap, m_pDocument, dest_buf, dest_size, FALSE);
- } else if (pBitmap->GetBPP() >= 8 && pBitmap->GetPalette() != NULL) {
- CFX_DIBitmap *pNewBitmap = FX_NEW CFX_DIBitmap();
- pNewBitmap->Copy(pBitmap);
- pNewBitmap->ConvertFormat(FXDIB_Rgb);
- SetImage(pNewBitmap, iCompress, pFileWrite, pFileRead);
- if (pDict) {
- pDict->Release();
- pDict = NULL;
- }
- if (dest_buf) {
- FX_Free(dest_buf);
- dest_buf = NULL;
- }
- dest_size = 0;
- delete pNewBitmap;
- return;
- } else {
- if (bUseMatte) {
- CFX_DIBitmap *pNewBitmap = FX_NEW CFX_DIBitmap();
- pNewBitmap->Create(BitmapWidth, BitmapHeight, FXDIB_Argb);
- FX_LPBYTE dst_buf = pNewBitmap->GetBuffer();
- FX_INT32 src_offset = 0;
- for (FX_INT32 row = 0; row < BitmapHeight; row ++) {
- src_offset = row * src_pitch;
- for (FX_INT32 column = 0; column < BitmapWidth; column ++) {
- FX_FLOAT alpha = src_buf[src_offset + 3] / 255.0f;
- dst_buf[src_offset] = (FX_BYTE)(src_buf[src_offset] * alpha);
- dst_buf[src_offset + 1] = (FX_BYTE)(src_buf[src_offset + 1] * alpha);
- dst_buf[src_offset + 2] = (FX_BYTE)(src_buf[src_offset + 2] * alpha);
- dst_buf[src_offset + 3] = (FX_BYTE)(src_buf[src_offset + 3]);
- src_offset += 4;
- }
- }
- _DCTEncodeBitmap(pDict, pNewBitmap, pParam ? pParam->nQuality : 75, dest_buf, dest_size);
- delete pNewBitmap;
- } else {
- _DCTEncodeBitmap(pDict, pBitmap, pParam ? pParam->nQuality : 75, dest_buf, dest_size);
- }
- }
- }
- if (bStream) {
- pFileWrite->WriteBlock(dest_buf, dest_size);
- FX_Free(dest_buf);
- dest_buf = NULL;
- }
- } else if (opType == 1) {
- if (!bStream) {
- dest_size = dest_pitch * BitmapHeight;
- dest_buf = FX_Alloc(FX_BYTE, dest_size);
- }
- FX_LPBYTE pDest = dest_buf;
- for (FX_INT32 i = 0; i < BitmapHeight; i ++) {
- if (!bStream) {
- FXSYS_memcpy32(pDest, src_buf, dest_pitch);
- pDest += dest_pitch;
- } else {
- pFileWrite->WriteBlock(src_buf, dest_pitch);
- }
- src_buf += src_pitch;
- }
- } else if (opType == 2) {
- if (!bStream) {
- dest_size = dest_pitch * BitmapHeight;
- dest_buf = FX_Alloc(FX_BYTE, dest_size);
- } else {
- dest_buf = FX_Alloc(FX_BYTE, dest_pitch);
- }
- FX_LPBYTE pDest = dest_buf;
- FX_INT32 src_offset = 0;
- FX_INT32 dest_offset = 0;
- for (FX_INT32 row = 0; row < BitmapHeight; row ++) {
- src_offset = row * src_pitch;
- for (FX_INT32 column = 0; column < BitmapWidth; column ++) {
- FX_FLOAT alpha = bUseMatte ? src_buf[src_offset + 3] / 255.0f : 1;
- pDest[dest_offset] = (FX_BYTE)(src_buf[src_offset + 2] * alpha);
- pDest[dest_offset + 1] = (FX_BYTE)(src_buf[src_offset + 1] * alpha);
- pDest[dest_offset + 2] = (FX_BYTE)(src_buf[src_offset] * alpha);
- dest_offset += 3;
- src_offset += bpp == 24 ? 3 : 4;
- }
- if (bStream) {
- pFileWrite->WriteBlock(pDest, dest_pitch);
- pDest = dest_buf;
- } else {
- pDest += dest_pitch;
- }
- dest_offset = 0;
- }
- if (bStream) {
- FX_Free(dest_buf);
- dest_buf = NULL;
- }
- }
- if (m_pStream == NULL) {
- m_pStream = FX_NEW CPDF_Stream(NULL, 0, NULL);
- }
- if (!bStream) {
- m_pStream->InitStream(dest_buf, dest_size, pDict);
- } else {
- pFileWrite->Flush();
- m_pStream->InitStream(pFileRead, pDict);
- }
- m_bIsMask = pBitmap->IsAlphaMask();
- m_Width = BitmapWidth;
- m_Height = BitmapHeight;
- if (dest_buf) {
- FX_Free(dest_buf);
- }
-}
-void CPDF_Image::ResetCache(CPDF_Page* pPage, const CFX_DIBitmap* pBitmap)
-{
- pPage->GetRenderCache()->ResetBitmap(m_pStream, pBitmap);
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fpdfapi/fpdf_module.h"
+#include "../../../include/fpdfapi/fpdf_page.h"
+#include "../../../include/fxcodec/fx_codec.h"
+#include "../../../include/fpdfapi/fpdf_render.h"
+#include "../fpdf_page/pageint.h"
+#include "../fpdf_render/render_int.h"
+CPDF_Dictionary* CPDF_Image::InitJPEG(FX_LPBYTE pData, FX_DWORD size)
+{
+ FX_INT32 width, height, color_trans, num_comps, bits;
+ if (!CPDF_ModuleMgr::Get()->GetJpegModule()->
+ LoadInfo(pData, size, width, height, num_comps, bits, color_trans)) {
+ return NULL;
+ }
+ CPDF_Dictionary* pDict = FX_NEW CPDF_Dictionary;
+ pDict->SetAtName("Type", "XObject");
+ pDict->SetAtName("Subtype", "Image");
+ pDict->SetAtInteger("Width", width);
+ pDict->SetAtInteger("Height", height);
+ FX_LPCSTR csname = NULL;
+ if (num_comps == 1) {
+ csname = "DeviceGray";
+ } else if (num_comps == 3) {
+ csname = "DeviceRGB";
+ } else if (num_comps == 4) {
+ csname = "DeviceCMYK";
+ CPDF_Array* pDecode = CPDF_Array::Create();
+ for (int n = 0; n < 4; n ++) {
+ pDecode->AddInteger(1);
+ pDecode->AddInteger(0);
+ }
+ pDict->SetAt(FX_BSTRC("Decode"), pDecode);
+ }
+ pDict->SetAtName("ColorSpace", csname);
+ pDict->SetAtInteger("BitsPerComponent", bits);
+ pDict->SetAtName("Filter", "DCTDecode");
+ if (!color_trans) {
+ CPDF_Dictionary* pParms = FX_NEW CPDF_Dictionary;
+ pDict->SetAt("DecodeParms", pParms);
+ pParms->SetAtInteger("ColorTransform", 0);
+ }
+ m_bIsMask = FALSE;
+ m_Width = width;
+ m_Height = height;
+ if (m_pStream == NULL) {
+ m_pStream = FX_NEW CPDF_Stream(NULL, 0, NULL);
+ }
+ return pDict;
+}
+void CPDF_Image::SetJpegImage(FX_LPBYTE pData, FX_DWORD size)
+{
+ CPDF_Dictionary *pDict = InitJPEG(pData, size);
+ if (!pDict) {
+ return;
+ }
+ m_pStream->InitStream(pData, size, pDict);
+}
+void CPDF_Image::SetJpegImage(IFX_FileRead *pFile)
+{
+ FX_DWORD size = (FX_DWORD)pFile->GetSize();
+ if (!size) {
+ return;
+ }
+ FX_DWORD dwEstimateSize = size;
+ if (dwEstimateSize > 8192) {
+ dwEstimateSize = 8192;
+ }
+ FX_LPBYTE pData = FX_Alloc(FX_BYTE, dwEstimateSize);
+ if (!pData) {
+ return;
+ }
+ pFile->ReadBlock(pData, 0, dwEstimateSize);
+ CPDF_Dictionary *pDict = InitJPEG(pData, dwEstimateSize);
+ FX_Free(pData);
+ if (!pDict && size > dwEstimateSize) {
+ pData = FX_Alloc(FX_BYTE, size);
+ if (!pData) {
+ return;
+ }
+ pFile->ReadBlock(pData, 0, size);
+ pDict = InitJPEG(pData, size);
+ FX_Free(pData);
+ }
+ if (!pDict) {
+ return;
+ }
+ m_pStream->InitStream(pFile, pDict);
+}
+void _DCTEncodeBitmap(CPDF_Dictionary *pBitmapDict, const CFX_DIBitmap* pBitmap, int quality, FX_LPBYTE &buf, FX_STRSIZE &size)
+{
+}
+void _JBIG2EncodeBitmap(CPDF_Dictionary *pBitmapDict, const CFX_DIBitmap *pBitmap, CPDF_Document *pDoc, FX_LPBYTE &buf, FX_STRSIZE &size, FX_BOOL bLossLess)
+{
+}
+void CPDF_Image::SetImage(const CFX_DIBitmap* pBitmap, FX_INT32 iCompress, IFX_FileWrite *pFileWrite, IFX_FileRead *pFileRead, const CFX_DIBitmap* pMask, const CPDF_ImageSetParam* pParam)
+{
+ FX_INT32 BitmapWidth = pBitmap->GetWidth();
+ FX_INT32 BitmapHeight = pBitmap->GetHeight();
+ if (BitmapWidth < 1 || BitmapHeight < 1) {
+ return;
+ }
+ FX_LPBYTE src_buf = pBitmap->GetBuffer();
+ FX_INT32 src_pitch = pBitmap->GetPitch();
+ FX_INT32 bpp = pBitmap->GetBPP();
+ FX_BOOL bUseMatte = pParam && pParam->pMatteColor && (pBitmap->GetFormat() == FXDIB_Argb);
+ CPDF_Dictionary* pDict = FX_NEW CPDF_Dictionary;
+ pDict->SetAtName(FX_BSTRC("Type"), FX_BSTRC("XObject"));
+ pDict->SetAtName(FX_BSTRC("Subtype"), FX_BSTRC("Image"));
+ pDict->SetAtInteger(FX_BSTRC("Width"), BitmapWidth);
+ pDict->SetAtInteger(FX_BSTRC("Height"), BitmapHeight);
+ FX_LPBYTE dest_buf = NULL;
+ FX_STRSIZE dest_pitch = 0, dest_size = 0, opType = -1;
+ if (bpp == 1) {
+ FX_INT32 reset_a = 0, reset_r = 0, reset_g = 0, reset_b = 0;
+ FX_INT32 set_a = 0, set_r = 0, set_g = 0, set_b = 0;
+ if (!pBitmap->IsAlphaMask()) {
+ ArgbDecode(pBitmap->GetPaletteArgb(0), reset_a, reset_r, reset_g, reset_b);
+ ArgbDecode(pBitmap->GetPaletteArgb(1), set_a, set_r, set_g, set_b);
+ }
+ if (set_a == 0 || reset_a == 0) {
+ pDict->SetAt(FX_BSTRC("ImageMask"), FX_NEW CPDF_Boolean(TRUE));
+ if (reset_a == 0) {
+ CPDF_Array* pArray = FX_NEW CPDF_Array;
+ pArray->AddInteger(1);
+ pArray->AddInteger(0);
+ pDict->SetAt(FX_BSTRC("Decode"), pArray);
+ }
+ } else {
+ CPDF_Array* pCS = FX_NEW CPDF_Array;
+ pCS->AddName(FX_BSTRC("Indexed"));
+ pCS->AddName(FX_BSTRC("DeviceRGB"));
+ pCS->AddInteger(1);
+ CFX_ByteString ct;
+ FX_LPSTR pBuf = ct.GetBuffer(6);
+ pBuf[0] = (FX_CHAR)reset_r;
+ pBuf[1] = (FX_CHAR)reset_g;
+ pBuf[2] = (FX_CHAR)reset_b;
+ pBuf[3] = (FX_CHAR)set_r;
+ pBuf[4] = (FX_CHAR)set_g;
+ pBuf[5] = (FX_CHAR)set_b;
+ ct.ReleaseBuffer(6);
+ pCS->Add(CPDF_String::Create(ct, TRUE));
+ pDict->SetAt(FX_BSTRC("ColorSpace"), pCS);
+ }
+ pDict->SetAtInteger(FX_BSTRC("BitsPerComponent"), 1);
+ dest_pitch = (BitmapWidth + 7) / 8;
+ if ((iCompress & 0x03) == PDF_IMAGE_NO_COMPRESS) {
+ opType = 1;
+ } else {
+ opType = 0;
+ }
+ } else if (bpp == 8) {
+ FX_INT32 iPalette = pBitmap->GetPaletteSize();
+ if (iPalette > 0) {
+ CPDF_Array* pCS = FX_NEW CPDF_Array;
+ m_pDocument->AddIndirectObject(pCS);
+ pCS->AddName(FX_BSTRC("Indexed"));
+ pCS->AddName(FX_BSTRC("DeviceRGB"));
+ pCS->AddInteger(iPalette - 1);
+ FX_LPBYTE pColorTable = FX_Alloc(FX_BYTE, iPalette * 3);
+ FX_LPBYTE ptr = pColorTable;
+ for (FX_INT32 i = 0; i < iPalette; i ++) {
+ FX_DWORD argb = pBitmap->GetPaletteArgb(i);
+ ptr[0] = (FX_BYTE)(argb >> 16);
+ ptr[1] = (FX_BYTE)(argb >> 8);
+ ptr[2] = (FX_BYTE)argb;
+ ptr += 3;
+ }
+ CPDF_Stream *pCTS = CPDF_Stream::Create(pColorTable, iPalette * 3, CPDF_Dictionary::Create());
+ m_pDocument->AddIndirectObject(pCTS);
+ pCS->AddReference(m_pDocument, pCTS);
+ pDict->SetAtReference(FX_BSTRC("ColorSpace"), m_pDocument, pCS);
+ } else {
+ pDict->SetAtName(FX_BSTRC("ColorSpace"), FX_BSTRC("DeviceGray"));
+ }
+ pDict->SetAtInteger(FX_BSTRC("BitsPerComponent"), 8);
+ if ((iCompress & 0x03) == PDF_IMAGE_NO_COMPRESS) {
+ dest_pitch = BitmapWidth;
+ opType = 1;
+ } else {
+ opType = 0;
+ }
+ } else {
+ pDict->SetAtName(FX_BSTRC("ColorSpace"), FX_BSTRC("DeviceRGB"));
+ pDict->SetAtInteger(FX_BSTRC("BitsPerComponent"), 8);
+ if ((iCompress & 0x03) == PDF_IMAGE_NO_COMPRESS) {
+ dest_pitch = BitmapWidth * 3;
+ opType = 2;
+ } else {
+ opType = 0;
+ }
+ }
+ const CFX_DIBitmap* pMaskBitmap = NULL;
+ if (pBitmap->HasAlpha()) {
+ pMaskBitmap = pBitmap->GetAlphaMask();
+ }
+ if (!pMaskBitmap && pMask) {
+ FXDIB_Format maskFormat = pMask->GetFormat();
+ if (maskFormat == FXDIB_1bppMask || maskFormat == FXDIB_8bppMask) {
+ pMaskBitmap = pMask;
+ }
+ }
+ if (pMaskBitmap) {
+ FX_INT32 maskWidth = pMaskBitmap->GetWidth();
+ FX_INT32 maskHeight = pMaskBitmap->GetHeight();
+ FX_LPBYTE mask_buf = NULL;
+ FX_STRSIZE mask_size;
+ FX_BOOL bDeleteMask = TRUE;
+ CPDF_Dictionary* pMaskDict = FX_NEW CPDF_Dictionary;
+ pMaskDict->SetAtName(FX_BSTRC("Type"), FX_BSTRC("XObject"));
+ pMaskDict->SetAtName(FX_BSTRC("Subtype"), FX_BSTRC("Image"));
+ pMaskDict->SetAtInteger(FX_BSTRC("Width"), maskWidth);
+ pMaskDict->SetAtInteger(FX_BSTRC("Height"), maskHeight);
+ pMaskDict->SetAtName(FX_BSTRC("ColorSpace"), FX_BSTRC("DeviceGray"));
+ pMaskDict->SetAtInteger(FX_BSTRC("BitsPerComponent"), 8);
+ if (pMaskBitmap->GetBPP() == 8 && (iCompress & PDF_IMAGE_MASK_LOSSY_COMPRESS) != 0) {
+ _DCTEncodeBitmap(pMaskDict, pMaskBitmap, pParam ? pParam->nQuality : 75, mask_buf, mask_size);
+ } else if (pMaskBitmap->GetFormat() == FXDIB_1bppMask) {
+ _JBIG2EncodeBitmap(pMaskDict, pMaskBitmap, m_pDocument, mask_buf, mask_size, TRUE);
+ } else {
+ mask_size = maskHeight * maskWidth;
+ mask_buf = FX_Alloc(FX_BYTE, mask_size);
+ for (FX_INT32 a = 0; a < maskHeight; a ++) {
+ FXSYS_memcpy32(mask_buf + a * maskWidth, pMaskBitmap->GetScanline(a), maskWidth);
+ }
+ }
+ if (pMaskDict) {
+ pMaskDict->SetAtInteger(FX_BSTRC("Length"), mask_size);
+ CPDF_Stream* pMaskStream = NULL;
+ if (bUseMatte) {
+ int a, r, g, b;
+ ArgbDecode(*(pParam->pMatteColor), a, r, g, b);
+ CPDF_Array* pMatte = FX_NEW CPDF_Array;
+ pMatte->AddInteger(r);
+ pMatte->AddInteger(g);
+ pMatte->AddInteger(b);
+ pMaskDict->SetAt(FX_BSTRC("Matte"), pMatte);
+ }
+ pMaskStream = FX_NEW CPDF_Stream(mask_buf, mask_size, pMaskDict);
+ m_pDocument->AddIndirectObject(pMaskStream);
+ bDeleteMask = FALSE;
+ pDict->SetAtReference(FX_BSTRC("SMask"), m_pDocument, pMaskStream);
+ }
+ if (pBitmap->HasAlpha()) {
+ delete pMaskBitmap;
+ }
+ }
+ FX_BOOL bStream = pFileWrite != NULL && pFileRead != NULL;
+ if (opType == 0) {
+ if (iCompress & PDF_IMAGE_LOSSLESS_COMPRESS) {
+ if (pBitmap->GetBPP() == 1) {
+ _JBIG2EncodeBitmap(pDict, pBitmap, m_pDocument, dest_buf, dest_size, TRUE);
+ }
+ } else {
+ if (pBitmap->GetBPP() == 1) {
+ _JBIG2EncodeBitmap(pDict, pBitmap, m_pDocument, dest_buf, dest_size, FALSE);
+ } else if (pBitmap->GetBPP() >= 8 && pBitmap->GetPalette() != NULL) {
+ CFX_DIBitmap *pNewBitmap = FX_NEW CFX_DIBitmap();
+ pNewBitmap->Copy(pBitmap);
+ pNewBitmap->ConvertFormat(FXDIB_Rgb);
+ SetImage(pNewBitmap, iCompress, pFileWrite, pFileRead);
+ if (pDict) {
+ pDict->Release();
+ pDict = NULL;
+ }
+ if (dest_buf) {
+ FX_Free(dest_buf);
+ dest_buf = NULL;
+ }
+ dest_size = 0;
+ delete pNewBitmap;
+ return;
+ } else {
+ if (bUseMatte) {
+ CFX_DIBitmap *pNewBitmap = FX_NEW CFX_DIBitmap();
+ pNewBitmap->Create(BitmapWidth, BitmapHeight, FXDIB_Argb);
+ FX_LPBYTE dst_buf = pNewBitmap->GetBuffer();
+ FX_INT32 src_offset = 0;
+ for (FX_INT32 row = 0; row < BitmapHeight; row ++) {
+ src_offset = row * src_pitch;
+ for (FX_INT32 column = 0; column < BitmapWidth; column ++) {
+ FX_FLOAT alpha = src_buf[src_offset + 3] / 255.0f;
+ dst_buf[src_offset] = (FX_BYTE)(src_buf[src_offset] * alpha);
+ dst_buf[src_offset + 1] = (FX_BYTE)(src_buf[src_offset + 1] * alpha);
+ dst_buf[src_offset + 2] = (FX_BYTE)(src_buf[src_offset + 2] * alpha);
+ dst_buf[src_offset + 3] = (FX_BYTE)(src_buf[src_offset + 3]);
+ src_offset += 4;
+ }
+ }
+ _DCTEncodeBitmap(pDict, pNewBitmap, pParam ? pParam->nQuality : 75, dest_buf, dest_size);
+ delete pNewBitmap;
+ } else {
+ _DCTEncodeBitmap(pDict, pBitmap, pParam ? pParam->nQuality : 75, dest_buf, dest_size);
+ }
+ }
+ }
+ if (bStream) {
+ pFileWrite->WriteBlock(dest_buf, dest_size);
+ FX_Free(dest_buf);
+ dest_buf = NULL;
+ }
+ } else if (opType == 1) {
+ if (!bStream) {
+ dest_size = dest_pitch * BitmapHeight;
+ dest_buf = FX_Alloc(FX_BYTE, dest_size);
+ }
+ FX_LPBYTE pDest = dest_buf;
+ for (FX_INT32 i = 0; i < BitmapHeight; i ++) {
+ if (!bStream) {
+ FXSYS_memcpy32(pDest, src_buf, dest_pitch);
+ pDest += dest_pitch;
+ } else {
+ pFileWrite->WriteBlock(src_buf, dest_pitch);
+ }
+ src_buf += src_pitch;
+ }
+ } else if (opType == 2) {
+ if (!bStream) {
+ dest_size = dest_pitch * BitmapHeight;
+ dest_buf = FX_Alloc(FX_BYTE, dest_size);
+ } else {
+ dest_buf = FX_Alloc(FX_BYTE, dest_pitch);
+ }
+ FX_LPBYTE pDest = dest_buf;
+ FX_INT32 src_offset = 0;
+ FX_INT32 dest_offset = 0;
+ for (FX_INT32 row = 0; row < BitmapHeight; row ++) {
+ src_offset = row * src_pitch;
+ for (FX_INT32 column = 0; column < BitmapWidth; column ++) {
+ FX_FLOAT alpha = bUseMatte ? src_buf[src_offset + 3] / 255.0f : 1;
+ pDest[dest_offset] = (FX_BYTE)(src_buf[src_offset + 2] * alpha);
+ pDest[dest_offset + 1] = (FX_BYTE)(src_buf[src_offset + 1] * alpha);
+ pDest[dest_offset + 2] = (FX_BYTE)(src_buf[src_offset] * alpha);
+ dest_offset += 3;
+ src_offset += bpp == 24 ? 3 : 4;
+ }
+ if (bStream) {
+ pFileWrite->WriteBlock(pDest, dest_pitch);
+ pDest = dest_buf;
+ } else {
+ pDest += dest_pitch;
+ }
+ dest_offset = 0;
+ }
+ if (bStream) {
+ FX_Free(dest_buf);
+ dest_buf = NULL;
+ }
+ }
+ if (m_pStream == NULL) {
+ m_pStream = FX_NEW CPDF_Stream(NULL, 0, NULL);
+ }
+ if (!bStream) {
+ m_pStream->InitStream(dest_buf, dest_size, pDict);
+ } else {
+ pFileWrite->Flush();
+ m_pStream->InitStream(pFileRead, pDict);
+ }
+ m_bIsMask = pBitmap->IsAlphaMask();
+ m_Width = BitmapWidth;
+ m_Height = BitmapHeight;
+ if (dest_buf) {
+ FX_Free(dest_buf);
+ }
+}
+void CPDF_Image::ResetCache(CPDF_Page* pPage, const CFX_DIBitmap* pBitmap)
+{
+ pPage->GetRenderCache()->ResetBitmap(m_pStream, pBitmap);
+}
diff --git a/core/src/fpdfapi/fpdf_font/common.h b/core/src/fpdfapi/fpdf_font/common.h
index 1c11b281a4..4b37a44ccc 100644
--- a/core/src/fpdfapi/fpdf_font/common.h
+++ b/core/src/fpdfapi/fpdf_font/common.h
@@ -1,17 +1,17 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef COMMON_H
-#define COMMON_H
-typedef signed char TT_int8_t;
-typedef unsigned char TT_uint8_t;
-typedef signed short TT_int16_t;
-typedef unsigned short TT_uint16_t;
-typedef FX_INT32 TT_int32_t;
-typedef FX_DWORD TT_uint32_t;
-typedef FX_INT64 TT_int64_t;
-typedef FX_UINT64 TT_uint64_t;
-#endif
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef COMMON_H
+#define COMMON_H
+typedef signed char TT_int8_t;
+typedef unsigned char TT_uint8_t;
+typedef signed short TT_int16_t;
+typedef unsigned short TT_uint16_t;
+typedef FX_INT32 TT_int32_t;
+typedef FX_DWORD TT_uint32_t;
+typedef FX_INT64 TT_int64_t;
+typedef FX_UINT64 TT_uint64_t;
+#endif
diff --git a/core/src/fpdfapi/fpdf_font/font_int.h b/core/src/fpdfapi/fpdf_font/font_int.h
index 779f58ee5d..b151d78b51 100644
--- a/core/src/fpdfapi/fpdf_font/font_int.h
+++ b/core/src/fpdfapi/fpdf_font/font_int.h
@@ -1,201 +1,201 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-typedef void* FXFT_Library;
-class CPDF_CMapManager : public CFX_Object
-{
-public:
- CPDF_CMapManager();
- ~CPDF_CMapManager();
- FX_LPVOID GetPackage(FX_BOOL bPrompt);
- CPDF_CMap* GetPredefinedCMap(const CFX_ByteString& name, FX_BOOL bPrompt);
- CPDF_CID2UnicodeMap* GetCID2UnicodeMap(int charset, FX_BOOL bPrompt);
- void ReloadAll();
-private:
- CPDF_CMap* LoadPredefinedCMap(const CFX_ByteString& name, FX_BOOL bPrompt);
- CPDF_CID2UnicodeMap* LoadCID2UnicodeMap(int charset, FX_BOOL bPrompt);
- void DropAll(FX_BOOL bReload);
-#ifndef _FPDFAPI_MINI_
- FX_BOOL m_bPrompted;
- FX_LPVOID m_pPackage;
-#endif
- CFX_MapByteStringToPtr m_CMaps;
- CPDF_CID2UnicodeMap* m_CID2UnicodeMaps[6];
-};
-class CPDF_FontGlobals : public CFX_Object
-{
-public:
- CPDF_FontGlobals();
- ~CPDF_FontGlobals();
- void ClearAll();
- void Clear(void* key);
- CPDF_Font* Find(void* key, int index);
- void Set(void* key, int index, CPDF_Font* pFont);
- CFX_MapPtrToPtr m_pStockMap;
- CPDF_CMapManager m_CMapManager;
- struct {
- const struct FXCMAP_CMap* m_pMapList;
- int m_Count;
- } m_EmbeddedCharsets[5];
- struct {
- const FX_WORD* m_pMap;
- int m_Count;
- } m_EmbeddedToUnicodes[5];
- FX_LPBYTE m_pContrastRamps;
-};
-struct _CMap_CodeRange {
- int m_CharSize;
- FX_BYTE m_Lower[4];
- FX_BYTE m_Upper[4];
-};
-class CPDF_CMapParser : public CFX_Object
-{
-public:
- CPDF_CMapParser();
- ~CPDF_CMapParser() {}
- FX_BOOL Initialize(CPDF_CMap*);
- void ParseWord(FX_BSTR str);
- CFX_BinaryBuf m_AddMaps;
-private:
- CPDF_CMap* m_pCMap;
- int m_Status;
- int m_CodeSeq;
- FX_DWORD m_CodePoints[4];
- CFX_ArrayTemplate<_CMap_CodeRange> m_CodeRanges;
- CFX_ByteString m_Registry, m_Ordering, m_Supplement;
- CFX_ByteString m_LastWord;
-};
-#define CIDCODING_UNKNOWN 0
-#define CIDCODING_GB 1
-#define CIDCODING_BIG5 2
-#define CIDCODING_JIS 3
-#define CIDCODING_KOREA 4
-#define CIDCODING_UCS2 5
-#define CIDCODING_CID 6
-#define CIDCODING_UTF16 7
-class CPDF_CMap : public CFX_Object
-{
-public:
- CPDF_CMap();
- FX_BOOL LoadPredefined(CPDF_CMapManager* pMgr, const FX_CHAR* name, FX_BOOL bPromptCJK);
- FX_BOOL LoadEmbedded(FX_LPCBYTE pData, FX_DWORD dwSize);
- void Release();
- FX_BOOL IsLoaded() const
- {
- return m_bLoaded;
- }
- int GetCharset()
- {
- return m_Charset;
- }
- FX_BOOL IsVertWriting() const
- {
- return m_bVertical;
- }
- FX_WORD CIDFromCharCode(FX_DWORD charcode) const;
- FX_DWORD CharCodeFromCID(FX_WORD CID) const;
- int GetCharSize(FX_DWORD charcode) const;
- FX_DWORD GetNextChar(const FX_CHAR* pString, int& offset) const;
- int CountChar(const FX_CHAR* pString, int size) const;
- int AppendChar(FX_LPSTR str, FX_DWORD charcode) const;
- typedef enum {OneByte, TwoBytes, MixedTwoBytes, MixedFourBytes} CodingScheme;
-protected:
- ~CPDF_CMap();
- friend class CPDF_CMapParser;
- friend class CPDF_CMapManager;
- friend class CPDF_CIDFont;
-protected:
- CFX_ByteString m_PredefinedCMap;
- FX_BOOL m_bVertical;
- int m_Charset, m_Coding;
- CodingScheme m_CodingScheme;
- int m_nCodeRanges;
- FX_BYTE* m_pLeadingBytes;
- FX_WORD* m_pMapping;
- FX_LPBYTE m_pAddMapping;
- FX_BOOL m_bLoaded;
- const FXCMAP_CMap* m_pEmbedMap;
- CPDF_CMap* m_pUseMap;
-};
-class CPDF_PredefinedCMap
-{
-public:
- FX_LPCSTR m_pName;
- int m_Charset;
- int m_Coding;
- CPDF_CMap::CodingScheme m_CodingScheme;
- FX_DWORD m_LeadingSegCount;
- FX_BYTE m_LeadingSegs[4];
-};
-typedef struct _FileHeader {
- FX_BYTE btTag[4];
- FX_BYTE btVersion;
- FX_BYTE btFormat;
- FX_BYTE btReserved1[2];
- FX_DWORD dwStartIndex;
- FX_DWORD dwEndIndex;
- FX_DWORD dwDataSize;
- FX_DWORD dwDataOffset;
- FX_DWORD dwRecordSize;
-} FXMP_FILEHEADER;
-class CPDF_FXMP : public CFX_Object
-{
-public:
- CPDF_FXMP()
- {
- m_pHeader = NULL;
- m_pTable = NULL;
- }
- ~CPDF_FXMP()
- {
- if (m_pHeader) {
- FX_Free(m_pHeader);
- }
- }
- FX_BOOL IsLoaded()
- {
- return m_pTable != NULL;
- }
- FX_BOOL LoadFile(FX_LPVOID pPackage, FX_LPCSTR fileid);
- FX_LPBYTE GetRecord(FX_DWORD index);
-private:
- FXMP_FILEHEADER* m_pHeader;
- FX_LPBYTE m_pTable;
-};
-class CPDF_CID2UnicodeMap : public CFX_Object
-{
-public:
- CPDF_CID2UnicodeMap();
- ~CPDF_CID2UnicodeMap();
- FX_BOOL Initialize();
- FX_BOOL IsLoaded();
- void Load(CPDF_CMapManager* pMgr, int charset, FX_BOOL bPromptCJK);
- FX_WCHAR UnicodeFromCID(FX_WORD CID);
-protected:
- int m_Charset;
- const FX_WORD* m_pEmbeddedMap;
- FX_DWORD m_EmbeddedCount;
-#ifndef _FPDFAPI_MINI_
- CPDF_FXMP* m_pExternalMap;
-#endif
-};
-class CPDF_ToUnicodeMap : public CFX_Object
-{
-public:
- void Load(CPDF_Stream* pStream);
- CFX_WideString Lookup(FX_DWORD charcode);
- FX_DWORD ReverseLookup(FX_WCHAR unicode);
-protected:
- CFX_CMapDWordToDWord m_Map;
- CPDF_CID2UnicodeMap* m_pBaseMap;
- CFX_WideTextBuf m_MultiCharBuf;
-};
-class CPDF_FontCharMap : public CFX_CharMap, public CFX_Object
-{
-public:
- CPDF_FontCharMap(CPDF_Font* pFont);
- CPDF_Font* m_pFont;
-};
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+typedef void* FXFT_Library;
+class CPDF_CMapManager : public CFX_Object
+{
+public:
+ CPDF_CMapManager();
+ ~CPDF_CMapManager();
+ FX_LPVOID GetPackage(FX_BOOL bPrompt);
+ CPDF_CMap* GetPredefinedCMap(const CFX_ByteString& name, FX_BOOL bPrompt);
+ CPDF_CID2UnicodeMap* GetCID2UnicodeMap(int charset, FX_BOOL bPrompt);
+ void ReloadAll();
+private:
+ CPDF_CMap* LoadPredefinedCMap(const CFX_ByteString& name, FX_BOOL bPrompt);
+ CPDF_CID2UnicodeMap* LoadCID2UnicodeMap(int charset, FX_BOOL bPrompt);
+ void DropAll(FX_BOOL bReload);
+#ifndef _FPDFAPI_MINI_
+ FX_BOOL m_bPrompted;
+ FX_LPVOID m_pPackage;
+#endif
+ CFX_MapByteStringToPtr m_CMaps;
+ CPDF_CID2UnicodeMap* m_CID2UnicodeMaps[6];
+};
+class CPDF_FontGlobals : public CFX_Object
+{
+public:
+ CPDF_FontGlobals();
+ ~CPDF_FontGlobals();
+ void ClearAll();
+ void Clear(void* key);
+ CPDF_Font* Find(void* key, int index);
+ void Set(void* key, int index, CPDF_Font* pFont);
+ CFX_MapPtrToPtr m_pStockMap;
+ CPDF_CMapManager m_CMapManager;
+ struct {
+ const struct FXCMAP_CMap* m_pMapList;
+ int m_Count;
+ } m_EmbeddedCharsets[5];
+ struct {
+ const FX_WORD* m_pMap;
+ int m_Count;
+ } m_EmbeddedToUnicodes[5];
+ FX_LPBYTE m_pContrastRamps;
+};
+struct _CMap_CodeRange {
+ int m_CharSize;
+ FX_BYTE m_Lower[4];
+ FX_BYTE m_Upper[4];
+};
+class CPDF_CMapParser : public CFX_Object
+{
+public:
+ CPDF_CMapParser();
+ ~CPDF_CMapParser() {}
+ FX_BOOL Initialize(CPDF_CMap*);
+ void ParseWord(FX_BSTR str);
+ CFX_BinaryBuf m_AddMaps;
+private:
+ CPDF_CMap* m_pCMap;
+ int m_Status;
+ int m_CodeSeq;
+ FX_DWORD m_CodePoints[4];
+ CFX_ArrayTemplate<_CMap_CodeRange> m_CodeRanges;
+ CFX_ByteString m_Registry, m_Ordering, m_Supplement;
+ CFX_ByteString m_LastWord;
+};
+#define CIDCODING_UNKNOWN 0
+#define CIDCODING_GB 1
+#define CIDCODING_BIG5 2
+#define CIDCODING_JIS 3
+#define CIDCODING_KOREA 4
+#define CIDCODING_UCS2 5
+#define CIDCODING_CID 6
+#define CIDCODING_UTF16 7
+class CPDF_CMap : public CFX_Object
+{
+public:
+ CPDF_CMap();
+ FX_BOOL LoadPredefined(CPDF_CMapManager* pMgr, const FX_CHAR* name, FX_BOOL bPromptCJK);
+ FX_BOOL LoadEmbedded(FX_LPCBYTE pData, FX_DWORD dwSize);
+ void Release();
+ FX_BOOL IsLoaded() const
+ {
+ return m_bLoaded;
+ }
+ int GetCharset()
+ {
+ return m_Charset;
+ }
+ FX_BOOL IsVertWriting() const
+ {
+ return m_bVertical;
+ }
+ FX_WORD CIDFromCharCode(FX_DWORD charcode) const;
+ FX_DWORD CharCodeFromCID(FX_WORD CID) const;
+ int GetCharSize(FX_DWORD charcode) const;
+ FX_DWORD GetNextChar(const FX_CHAR* pString, int& offset) const;
+ int CountChar(const FX_CHAR* pString, int size) const;
+ int AppendChar(FX_LPSTR str, FX_DWORD charcode) const;
+ typedef enum {OneByte, TwoBytes, MixedTwoBytes, MixedFourBytes} CodingScheme;
+protected:
+ ~CPDF_CMap();
+ friend class CPDF_CMapParser;
+ friend class CPDF_CMapManager;
+ friend class CPDF_CIDFont;
+protected:
+ CFX_ByteString m_PredefinedCMap;
+ FX_BOOL m_bVertical;
+ int m_Charset, m_Coding;
+ CodingScheme m_CodingScheme;
+ int m_nCodeRanges;
+ FX_BYTE* m_pLeadingBytes;
+ FX_WORD* m_pMapping;
+ FX_LPBYTE m_pAddMapping;
+ FX_BOOL m_bLoaded;
+ const FXCMAP_CMap* m_pEmbedMap;
+ CPDF_CMap* m_pUseMap;
+};
+class CPDF_PredefinedCMap
+{
+public:
+ FX_LPCSTR m_pName;
+ int m_Charset;
+ int m_Coding;
+ CPDF_CMap::CodingScheme m_CodingScheme;
+ FX_DWORD m_LeadingSegCount;
+ FX_BYTE m_LeadingSegs[4];
+};
+typedef struct _FileHeader {
+ FX_BYTE btTag[4];
+ FX_BYTE btVersion;
+ FX_BYTE btFormat;
+ FX_BYTE btReserved1[2];
+ FX_DWORD dwStartIndex;
+ FX_DWORD dwEndIndex;
+ FX_DWORD dwDataSize;
+ FX_DWORD dwDataOffset;
+ FX_DWORD dwRecordSize;
+} FXMP_FILEHEADER;
+class CPDF_FXMP : public CFX_Object
+{
+public:
+ CPDF_FXMP()
+ {
+ m_pHeader = NULL;
+ m_pTable = NULL;
+ }
+ ~CPDF_FXMP()
+ {
+ if (m_pHeader) {
+ FX_Free(m_pHeader);
+ }
+ }
+ FX_BOOL IsLoaded()
+ {
+ return m_pTable != NULL;
+ }
+ FX_BOOL LoadFile(FX_LPVOID pPackage, FX_LPCSTR fileid);
+ FX_LPBYTE GetRecord(FX_DWORD index);
+private:
+ FXMP_FILEHEADER* m_pHeader;
+ FX_LPBYTE m_pTable;
+};
+class CPDF_CID2UnicodeMap : public CFX_Object
+{
+public:
+ CPDF_CID2UnicodeMap();
+ ~CPDF_CID2UnicodeMap();
+ FX_BOOL Initialize();
+ FX_BOOL IsLoaded();
+ void Load(CPDF_CMapManager* pMgr, int charset, FX_BOOL bPromptCJK);
+ FX_WCHAR UnicodeFromCID(FX_WORD CID);
+protected:
+ int m_Charset;
+ const FX_WORD* m_pEmbeddedMap;
+ FX_DWORD m_EmbeddedCount;
+#ifndef _FPDFAPI_MINI_
+ CPDF_FXMP* m_pExternalMap;
+#endif
+};
+class CPDF_ToUnicodeMap : public CFX_Object
+{
+public:
+ void Load(CPDF_Stream* pStream);
+ CFX_WideString Lookup(FX_DWORD charcode);
+ FX_DWORD ReverseLookup(FX_WCHAR unicode);
+protected:
+ CFX_CMapDWordToDWord m_Map;
+ CPDF_CID2UnicodeMap* m_pBaseMap;
+ CFX_WideTextBuf m_MultiCharBuf;
+};
+class CPDF_FontCharMap : public CFX_CharMap, public CFX_Object
+{
+public:
+ CPDF_FontCharMap(CPDF_Font* pFont);
+ CPDF_Font* m_pFont;
+};
diff --git a/core/src/fpdfapi/fpdf_font/fpdf_font.cpp b/core/src/fpdfapi/fpdf_font/fpdf_font.cpp
index 886199b120..4bec3337b1 100644
--- a/core/src/fpdfapi/fpdf_font/fpdf_font.cpp
+++ b/core/src/fpdfapi/fpdf_font/fpdf_font.cpp
@@ -1,1763 +1,1763 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../../include/fpdfapi/fpdf_page.h"
-#include "../../../include/fpdfapi/fpdf_module.h"
-#include "../../../include/fpdfapi/fpdf_pageobj.h"
-#include "font_int.h"
-#include "../fpdf_page/pageint.h"
-#include "../../../include/fxge/fx_freetype.h"
-FX_BOOL FT_UseTTCharmap(FXFT_Face face, int platform_id, int encoding_id)
-{
- for (int i = 0; i < FXFT_Get_Face_CharmapCount(face); i ++) {
- if (FXFT_Get_Charmap_PlatformID(FXFT_Get_Face_Charmaps(face)[i]) == platform_id &&
- FXFT_Get_Charmap_EncodingID(FXFT_Get_Face_Charmaps(face)[i]) == encoding_id) {
- FXFT_Set_Charmap(face, FXFT_Get_Face_Charmaps(face)[i]);
- return TRUE;
- }
- }
- return FALSE;
-}
-extern const FX_WORD* PDF_UnicodesForPredefinedCharSet(int);
-CPDF_FontGlobals::CPDF_FontGlobals()
-{
- FXSYS_memset32(m_EmbeddedCharsets, 0, sizeof m_EmbeddedCharsets);
- FXSYS_memset32(m_EmbeddedToUnicodes, 0, sizeof m_EmbeddedToUnicodes);
- m_pContrastRamps = NULL;
-}
-CPDF_FontGlobals::~CPDF_FontGlobals()
-{
- ClearAll();
- if (m_pContrastRamps) {
- FX_Free(m_pContrastRamps);
- }
-}
-class CFX_StockFontArray : public CFX_Object
-{
-public:
- CFX_StockFontArray()
- {
- FXSYS_memset32(m_pStockFonts, 0, sizeof(CPDF_Font*) * 14);
- }
- CPDF_Font* m_pStockFonts[14];
-};
-CPDF_Font* CPDF_FontGlobals::Find(void* key, int index)
-{
- void* value = NULL;
- if (!m_pStockMap.Lookup(key, value)) {
- return NULL;
- }
- if (!value) {
- return NULL;
- }
- return ((CFX_StockFontArray*)value)->m_pStockFonts[index];
-}
-void CPDF_FontGlobals::Set(void* key, int index, CPDF_Font* pFont)
-{
- void* value = NULL;
- if (m_pStockMap.Lookup(key, value)) {
- ((CFX_StockFontArray*)value)->m_pStockFonts[index] = pFont;
- return;
- }
- CFX_StockFontArray* pFonts = FX_NEW CFX_StockFontArray();
- if (pFonts) {
- pFonts->m_pStockFonts[index] = pFont;
- }
- m_pStockMap.SetAt(key, pFonts);
-}
-void CPDF_FontGlobals::Clear(void* key)
-{
- void* value = NULL;
- if (!m_pStockMap.Lookup(key, value)) {
- return;
- }
- if (value) {
- CFX_StockFontArray* pStockFonts = (CFX_StockFontArray*)value;
- for (int i = 0; i < 14; i ++) {
- if (pStockFonts->m_pStockFonts[i]) {
- pStockFonts->m_pStockFonts[i]->GetFontDict()->Release();
- delete pStockFonts->m_pStockFonts[i];
- }
- }
- delete pStockFonts;
- }
- m_pStockMap.RemoveKey(key);
-}
-void CPDF_FontGlobals::ClearAll()
-{
- FX_POSITION pos = m_pStockMap.GetStartPosition();
- while (pos) {
- void *key = NULL;
- void* value = NULL;
- m_pStockMap.GetNextAssoc(pos, key, value);
- if (value) {
- CFX_StockFontArray* pStockFonts = (CFX_StockFontArray*)value;
- for (int i = 0; i < 14; i ++) {
- if (pStockFonts->m_pStockFonts[i]) {
- pStockFonts->m_pStockFonts[i]->GetFontDict()->Release();
- delete pStockFonts->m_pStockFonts[i];
- }
- }
- delete pStockFonts;
- }
- m_pStockMap.RemoveKey(key);
- }
-}
-CPDF_Font::CPDF_Font()
-{
- m_FontType = 0;
- m_FontBBox.left = m_FontBBox.right = m_FontBBox.top = m_FontBBox.bottom = 0;
- m_StemV = m_Ascent = m_Descent = m_ItalicAngle = 0;
- m_pFontFile = NULL;
- m_Flags = 0;
- m_pToUnicodeMap = NULL;
- m_bToUnicodeLoaded = FALSE;
- m_pCharMap = NULL;
-}
-FX_BOOL CPDF_Font::Initialize()
-{
- m_pCharMap = FX_NEW CPDF_FontCharMap(this);
- return TRUE;
-}
-CPDF_Font::~CPDF_Font()
-{
- if (m_pCharMap) {
- FX_Free(m_pCharMap);
- m_pCharMap = NULL;
- }
- if (m_pToUnicodeMap) {
- delete m_pToUnicodeMap;
- m_pToUnicodeMap = NULL;
- }
- if (m_pFontFile) {
- m_pDocument->GetPageData()->ReleaseFontFileStreamAcc((CPDF_Stream*)m_pFontFile->GetStream());
- }
-}
-FX_BOOL CPDF_Font::IsVertWriting() const
-{
- FX_BOOL bVertWriting = FALSE;
- CPDF_CIDFont* pCIDFont = GetCIDFont();
- if (pCIDFont) {
- bVertWriting = pCIDFont->IsVertWriting();
- } else {
- bVertWriting = m_Font.IsVertical();
- }
- return bVertWriting;
-}
-CFX_ByteString CPDF_Font::GetFontTypeName() const
-{
- switch (m_FontType) {
- case PDFFONT_TYPE1:
- return FX_BSTRC("Type1");
- case PDFFONT_TRUETYPE:
- return FX_BSTRC("TrueType");
- case PDFFONT_TYPE3:
- return FX_BSTRC("Type3");
- case PDFFONT_CIDFONT:
- return FX_BSTRC("Type0");
- }
- return CFX_ByteString();
-}
-void CPDF_Font::AppendChar(CFX_ByteString& str, FX_DWORD charcode) const
-{
- char buf[4];
- int len = AppendChar(buf, charcode);
- if (len == 1) {
- str += buf[0];
- } else {
- str += CFX_ByteString(buf, len);
- }
-}
-CFX_WideString CPDF_Font::UnicodeFromCharCode(FX_DWORD charcode) const
-{
- if (!m_bToUnicodeLoaded) {
- ((CPDF_Font*)this)->LoadUnicodeMap();
- }
- if (m_pToUnicodeMap) {
- CFX_WideString wsRet = m_pToUnicodeMap->Lookup(charcode);
- if (!wsRet.IsEmpty()) {
- return wsRet;
- }
- }
- FX_WCHAR unicode = _UnicodeFromCharCode(charcode);
- if (unicode == 0) {
- return CFX_WideString();
- }
- return unicode;
-}
-FX_DWORD CPDF_Font::CharCodeFromUnicode(FX_WCHAR unicode) const
-{
- if (!m_bToUnicodeLoaded) {
- ((CPDF_Font*)this)->LoadUnicodeMap();
- }
- if (m_pToUnicodeMap) {
- FX_DWORD charcode = m_pToUnicodeMap->ReverseLookup(unicode);
- if (charcode) {
- return charcode;
- }
- }
- return _CharCodeFromUnicode(unicode);
-}
-CFX_WideString CPDF_Font::DecodeString(const CFX_ByteString& str) const
-{
- CFX_WideString result;
- int src_len = str.GetLength();
- result.Reserve(src_len);
- FX_LPCSTR src_buf = str;
- int src_pos = 0;
- while (src_pos < src_len) {
- FX_DWORD charcode = GetNextChar(src_buf, src_pos);
- CFX_WideString unicode = UnicodeFromCharCode(charcode);
- if (!unicode.IsEmpty()) {
- result += unicode;
- } else {
- result += (FX_WCHAR)charcode;
- }
- }
- return result;
-}
-CFX_ByteString CPDF_Font::EncodeString(const CFX_WideString& str) const
-{
- CFX_ByteString result;
- int src_len = str.GetLength();
- FX_LPSTR dest_buf = result.GetBuffer(src_len * 2);
- FX_LPCWSTR src_buf = str;
- int dest_pos = 0;
- for (int src_pos = 0; src_pos < src_len; src_pos ++) {
- FX_DWORD charcode = CharCodeFromUnicode(src_buf[src_pos]);
- dest_pos += AppendChar(dest_buf + dest_pos, charcode);
- }
- result.ReleaseBuffer(dest_pos);
- return result;
-}
-void CPDF_Font::LoadFontDescriptor(CPDF_Dictionary* pFontDesc)
-{
- m_Flags = pFontDesc->GetInteger(FX_BSTRC("Flags"), PDFFONT_NONSYMBOLIC);
- int ItalicAngle = 0;
- FX_BOOL bExistItalicAngle = FALSE;
- if (pFontDesc->KeyExist(FX_BSTRC("ItalicAngle"))) {
- ItalicAngle = pFontDesc->GetInteger(FX_BSTRC("ItalicAngle"));
- bExistItalicAngle = TRUE;
- }
- if (ItalicAngle < 0) {
- m_Flags |= PDFFONT_ITALIC;
- m_ItalicAngle = ItalicAngle;
- }
- FX_BOOL bExistStemV = FALSE;
- if (pFontDesc->KeyExist(FX_BSTRC("StemV"))) {
- m_StemV = pFontDesc->GetInteger(FX_BSTRC("StemV"));
- bExistStemV = TRUE;
- }
- FX_BOOL bExistAscent = FALSE;
- if (pFontDesc->KeyExist(FX_BSTRC("Ascent"))) {
- m_Ascent = pFontDesc->GetInteger(FX_BSTRC("Ascent"));
- bExistAscent = TRUE;
- }
- FX_BOOL bExistDescent = FALSE;
- if (pFontDesc->KeyExist(FX_BSTRC("Descent"))) {
- m_Descent = pFontDesc->GetInteger(FX_BSTRC("Descent"));
- bExistDescent = TRUE;
- }
- FX_BOOL bExistCapHeight = FALSE;
- if (pFontDesc->KeyExist(FX_BSTRC("CapHeight"))) {
- bExistCapHeight = TRUE;
- }
- if (bExistItalicAngle && bExistAscent && bExistCapHeight && bExistDescent && bExistStemV) {
- m_Flags |= PDFFONT_USEEXTERNATTR;
- }
- if (m_Descent > 10) {
- m_Descent = -m_Descent;
- }
- CPDF_Array* pBBox = pFontDesc->GetArray(FX_BSTRC("FontBBox"));
- if (pBBox) {
- m_FontBBox.left = pBBox->GetInteger(0);
- m_FontBBox.bottom = pBBox->GetInteger(1);
- m_FontBBox.right = pBBox->GetInteger(2);
- m_FontBBox.top = pBBox->GetInteger(3);
- }
- CPDF_Stream* pFontFile = pFontDesc->GetStream(FX_BSTRC("FontFile"));
- if (pFontFile == NULL) {
- pFontFile = pFontDesc->GetStream(FX_BSTRC("FontFile2"));
- }
- if (pFontFile == NULL) {
- pFontFile = pFontDesc->GetStream(FX_BSTRC("FontFile3"));
- }
- if (pFontFile) {
- m_pFontFile = m_pDocument->LoadFontFile(pFontFile);
- if (m_pFontFile == NULL) {
- return;
- }
- FX_LPCBYTE pFontData = m_pFontFile->GetData();
- FX_DWORD dwFontSize = m_pFontFile->GetSize();
- m_Font.LoadEmbedded(pFontData, dwFontSize);
- if (m_Font.m_Face == NULL) {
- m_pFontFile = NULL;
- }
- }
-}
-short TT2PDF(int m, FXFT_Face face)
-{
- int upm = FXFT_Get_Face_UnitsPerEM(face);
- if (upm == 0) {
- return (short)m;
- }
- return (m * 1000 + upm / 2) / upm;
-}
-void CPDF_Font::CheckFontMetrics()
-{
- if (m_FontBBox.top == 0 && m_FontBBox.bottom == 0 && m_FontBBox.left == 0 && m_FontBBox.right == 0) {
- if (m_Font.m_Face) {
- m_FontBBox.left = TT2PDF(FXFT_Get_Face_xMin(m_Font.m_Face), m_Font.m_Face);
- m_FontBBox.bottom = TT2PDF(FXFT_Get_Face_yMin(m_Font.m_Face), m_Font.m_Face);
- m_FontBBox.right = TT2PDF(FXFT_Get_Face_xMax(m_Font.m_Face), m_Font.m_Face);
- m_FontBBox.top = TT2PDF(FXFT_Get_Face_yMax(m_Font.m_Face), m_Font.m_Face);
- m_Ascent = TT2PDF(FXFT_Get_Face_Ascender(m_Font.m_Face), m_Font.m_Face);
- m_Descent = TT2PDF(FXFT_Get_Face_Descender(m_Font.m_Face), m_Font.m_Face);
- } else {
- FX_BOOL bFirst = TRUE;
- for (int i = 0; i < 256; i ++) {
- FX_RECT rect;
- GetCharBBox(i, rect);
- if (rect.left == rect.right) {
- continue;
- }
- if (bFirst) {
- m_FontBBox = rect;
- bFirst = FALSE;
- } else {
- if (m_FontBBox.top < rect.top) {
- m_FontBBox.top = rect.top;
- }
- if (m_FontBBox.right < rect.right) {
- m_FontBBox.right = rect.right;
- }
- if (m_FontBBox.left > rect.left) {
- m_FontBBox.left = rect.left;
- }
- if (m_FontBBox.bottom > rect.bottom) {
- m_FontBBox.bottom = rect.bottom;
- }
- }
- }
- }
- }
- if (m_Ascent == 0 && m_Descent == 0) {
- FX_RECT rect;
- GetCharBBox('A', rect);
- if (rect.bottom == rect.top) {
- m_Ascent = m_FontBBox.top;
- } else {
- m_Ascent = rect.top;
- }
- GetCharBBox('g', rect);
- if (rect.bottom == rect.top) {
- m_Descent = m_FontBBox.bottom;
- } else {
- m_Descent = rect.bottom;
- }
- }
-}
-void CPDF_Font::LoadUnicodeMap()
-{
- m_bToUnicodeLoaded = TRUE;
- CPDF_Stream* pStream = m_pFontDict->GetStream(FX_BSTRC("ToUnicode"));
- if (pStream == NULL) {
- return;
- }
- m_pToUnicodeMap = FX_NEW CPDF_ToUnicodeMap;
- m_pToUnicodeMap->Load(pStream);
-}
-int CPDF_Font::GetStringWidth(FX_LPCSTR pString, int size)
-{
- int offset = 0;
- int width = 0;
- while (offset < size) {
- FX_DWORD charcode = GetNextChar(pString, offset);
- width += GetCharWidthF(charcode);
- }
- return width;
-}
-int CPDF_Font::GetCharTypeWidth(FX_DWORD charcode)
-{
- if (m_Font.m_Face == NULL) {
- return 0;
- }
- int glyph_index = GlyphFromCharCode(charcode);
- if (glyph_index == 0xffff) {
- return 0;
- }
- return m_Font.GetGlyphWidth(glyph_index);
-}
-int _PDF_GetStandardFontName(CFX_ByteString& name);
-CPDF_Font* CPDF_Font::GetStockFont(CPDF_Document* pDoc, FX_BSTR name)
-{
- CFX_ByteString fontname(name);
- int font_id = _PDF_GetStandardFontName(fontname);
- if (font_id < 0) {
- return NULL;
- }
- CPDF_FontGlobals* pFontGlobals = CPDF_ModuleMgr::Get()->GetPageModule()->GetFontGlobals();
- CPDF_Font* pFont = pFontGlobals->Find(pDoc, font_id);
- if (pFont) {
- return pFont;
- }
- CPDF_Dictionary* pDict = CPDF_Dictionary::Create();
- pDict->SetAtName(FX_BSTRC("Type"), FX_BSTRC("Font"));
- pDict->SetAtName(FX_BSTRC("Subtype"), FX_BSTRC("Type1"));
- pDict->SetAtName(FX_BSTRC("BaseFont"), fontname);
- pDict->SetAtName(FX_BSTRC("Encoding"), FX_BSTRC("WinAnsiEncoding"));
- pFont = CPDF_Font::CreateFontF(NULL, pDict);
- pFontGlobals->Set(pDoc, font_id, pFont);
- return pFont;
-}
-const FX_BYTE ChineseFontNames[][5] = {
- {0xCB, 0xCE, 0xCC, 0xE5, 0x00},
- {0xBF, 0xAC, 0xCC, 0xE5, 0x00},
- {0xBA, 0xDA, 0xCC, 0xE5, 0x00},
- {0xB7, 0xC2, 0xCB, 0xCE, 0x00},
- {0xD0, 0xC2, 0xCB, 0xCE, 0x00}
-};
-CPDF_Font* CPDF_Font::CreateFontF(CPDF_Document* pDoc, CPDF_Dictionary* pFontDict)
-{
- CFX_ByteString type = pFontDict->GetString(FX_BSTRC("Subtype"));
- CPDF_Font* pFont;
- if (type == FX_BSTRC("TrueType")) {
- {
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ || _FXM_PLATFORM_ == _FXM_PLATFORM_LINUX_ || _FXM_PLATFORM_ == _FXM_PLATFORM_ANDROID_ || _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
- CFX_ByteString basefont = pFontDict->GetString(FX_BSTRC("BaseFont"));
- CFX_ByteString tag = basefont.Left(4);
- int i;
- int count = sizeof(ChineseFontNames) / sizeof(ChineseFontNames[0]);
- for (i = 0; i < count; ++i) {
- if (tag == CFX_ByteString((FX_LPCSTR)ChineseFontNames[i])) {
- break;
- }
- }
- if (i < count) {
- CPDF_Dictionary* pFontDesc = pFontDict->GetDict(FX_BSTRC("FontDescriptor"));
- if (pFontDesc == NULL || !pFontDesc->KeyExist(FX_BSTRC("FontFile2"))) {
- pFont = FX_NEW CPDF_CIDFont;
- pFont->Initialize();
- pFont->m_FontType = PDFFONT_CIDFONT;
- pFont->m_pFontDict = pFontDict;
- pFont->m_pDocument = pDoc;
- if (!pFont->Load()) {
- delete pFont;
- return NULL;
- }
- return pFont;
- }
- }
-#endif
- }
- pFont = FX_NEW CPDF_TrueTypeFont;
- pFont->Initialize();
- pFont->m_FontType = PDFFONT_TRUETYPE;
- } else if (type == FX_BSTRC("Type3")) {
- pFont = FX_NEW CPDF_Type3Font;
- pFont->Initialize();
- pFont->m_FontType = PDFFONT_TYPE3;
- } else if (type == FX_BSTRC("Type0")) {
- pFont = FX_NEW CPDF_CIDFont;
- pFont->Initialize();
- pFont->m_FontType = PDFFONT_CIDFONT;
- } else {
- pFont = FX_NEW CPDF_Type1Font;
- pFont->Initialize();
- pFont->m_FontType = PDFFONT_TYPE1;
- }
- pFont->m_pFontDict = pFontDict;
- pFont->m_pDocument = pDoc;
- if (!pFont->Load()) {
- delete pFont;
- return NULL;
- }
- return pFont;
-}
-FX_BOOL CPDF_Font::Load()
-{
- if (m_pFontDict == NULL) {
- return FALSE;
- }
- CFX_ByteString type = m_pFontDict->GetString(FX_BSTRC("Subtype"));
- m_BaseFont = m_pFontDict->GetString(FX_BSTRC("BaseFont"));
- if (type == FX_BSTRC("MMType1")) {
- type = FX_BSTRC("Type1");
- }
- return _Load();
-}
-static CFX_WideString _FontMap_GetWideString(CFX_CharMap* pMap, const CFX_ByteString& bytestr)
-{
- return ((CPDF_FontCharMap*)pMap)->m_pFont->DecodeString(bytestr);
-}
-static CFX_ByteString _FontMap_GetByteString(CFX_CharMap* pMap, const CFX_WideString& widestr)
-{
- return ((CPDF_FontCharMap*)pMap)->m_pFont->EncodeString(widestr);
-}
-CPDF_FontCharMap::CPDF_FontCharMap(CPDF_Font* pFont)
-{
- m_GetByteString = _FontMap_GetByteString;
- m_GetWideString = _FontMap_GetWideString;
- m_pFont = pFont;
-}
-CFX_WideString CPDF_ToUnicodeMap::Lookup(FX_DWORD charcode)
-{
- FX_DWORD value;
- if (m_Map.Lookup(charcode, value)) {
- FX_WCHAR unicode = (FX_WCHAR)(value & 0xffff);
- if (unicode != 0xffff) {
- return unicode;
- }
- FX_LPCWSTR buf = m_MultiCharBuf.GetBuffer();
- FX_DWORD buf_len = m_MultiCharBuf.GetLength();
- if (buf == NULL || buf_len == 0) {
- return CFX_WideString();
- }
- FX_DWORD index = value >> 16;
- if (index >= buf_len) {
- return CFX_WideString();
- }
- FX_DWORD len = buf[index];
- if (index + len < index || index + len >= buf_len) {
- return CFX_WideString();
- }
- return CFX_WideString(buf + index + 1, len);
- }
- if (m_pBaseMap) {
- return m_pBaseMap->UnicodeFromCID((FX_WORD)charcode);
- }
- return CFX_WideString();
-}
-FX_DWORD CPDF_ToUnicodeMap::ReverseLookup(FX_WCHAR unicode)
-{
- FX_POSITION pos = m_Map.GetStartPosition();
- while (pos) {
- FX_DWORD key, value;
- m_Map.GetNextAssoc(pos, key, value);
- if ((FX_WCHAR)value == unicode) {
- return key;
- }
- }
- return 0;
-}
-static FX_DWORD _StringToCode(FX_BSTR str)
-{
- FX_LPCSTR buf = str.GetCStr();
- int len = str.GetLength();
- if (len == 0) {
- return 0;
- }
- int result = 0;
- if (buf[0] == '<') {
- for (int i = 1; i < len; i ++) {
- int digit;
- if (buf[i] >= '0' && buf[i] <= '9') {
- digit = buf[i] - '0';
- } else if (buf[i] >= 'a' && buf[i] <= 'f') {
- digit = buf[i] - 'a' + 10;
- } else if (buf[i] >= 'A' && buf[i] <= 'F') {
- digit = buf[i] - 'A' + 10;
- } else {
- break;
- }
- result = result * 16 + digit;
- }
- return result;
- } else {
- for (int i = 0; i < len; i ++) {
- if (buf[i] < '0' || buf[i] > '9') {
- break;
- }
- result = result * 10 + buf[i] - '0';
- }
- }
- return result;
-}
-static CFX_WideString _StringDataAdd(CFX_WideString str)
-{
- CFX_WideString ret;
- int len = str.GetLength();
- FX_WCHAR value = 1;
- for (int i = len - 1; i >= 0 ; --i) {
- FX_WCHAR ch = str[i] + value;
- if (ch < str[i]) {
- ret.Insert(0, 0);
- } else {
- ret.Insert(0, ch);
- value = 0;
- }
- }
- if (value) {
- ret.Insert(0, value);
- }
- return ret;
-}
-static CFX_WideString _StringToWideString(FX_BSTR str)
-{
- FX_LPCSTR buf = str.GetCStr();
- int len = str.GetLength();
- if (len == 0) {
- return CFX_WideString();
- }
- CFX_WideString result;
- if (buf[0] == '<') {
- int byte_pos = 0;
- FX_WCHAR ch = 0;
- for (int i = 1; i < len; i ++) {
- int digit;
- if (buf[i] >= '0' && buf[i] <= '9') {
- digit = buf[i] - '0';
- } else if (buf[i] >= 'a' && buf[i] <= 'f') {
- digit = buf[i] - 'a' + 10;
- } else if (buf[i] >= 'A' && buf[i] <= 'F') {
- digit = buf[i] - 'A' + 10;
- } else {
- break;
- }
- ch = ch * 16 + digit;
- byte_pos ++;
- if (byte_pos == 4) {
- result += ch;
- byte_pos = 0;
- ch = 0;
- }
- }
- return result;
- }
- if (buf[0] == '(') {
- }
- return result;
-}
-void CPDF_ToUnicodeMap::Load(CPDF_Stream* pStream)
-{
- int CIDSet = 0;
- CPDF_StreamAcc stream;
- stream.LoadAllData(pStream, FALSE);
- CPDF_SimpleParser parser(stream.GetData(), stream.GetSize());
- m_Map.EstimateSize(stream.GetSize() / 8, 1024);
- while (1) {
- CFX_ByteStringC word = parser.GetWord();
- if (word.IsEmpty()) {
- break;
- }
- if (word == FX_BSTRC("beginbfchar")) {
- while (1) {
- word = parser.GetWord();
- if (word.IsEmpty() || word == FX_BSTRC("endbfchar")) {
- break;
- }
- FX_DWORD srccode = _StringToCode(word);
- word = parser.GetWord();
- CFX_WideString destcode = _StringToWideString(word);
- int len = destcode.GetLength();
- if (len == 0) {
- continue;
- }
- if (len == 1) {
- m_Map.SetAt(srccode, destcode.GetAt(0));
- } else {
- m_Map.SetAt(srccode, m_MultiCharBuf.GetLength() * 0x10000 + 0xffff);
- m_MultiCharBuf.AppendChar(destcode.GetLength());
- m_MultiCharBuf << destcode;
- }
- }
- } else if (word == FX_BSTRC("beginbfrange")) {
- while (1) {
- CFX_ByteString low, high;
- low = parser.GetWord();
- if (low.IsEmpty() || low == FX_BSTRC("endbfrange")) {
- break;
- }
- high = parser.GetWord();
- FX_DWORD lowcode = _StringToCode(low);
- FX_DWORD highcode = (lowcode & 0xffffff00) | (_StringToCode(high) & 0xff);
- if (highcode == (FX_DWORD) - 1) {
- break;
- }
- CFX_ByteString start = parser.GetWord();
- if (start == FX_BSTRC("[")) {
- for (FX_DWORD code = lowcode; code <= highcode; code ++) {
- CFX_ByteString dest = parser.GetWord();
- CFX_WideString destcode = _StringToWideString(dest);
- int len = destcode.GetLength();
- if (len == 0) {
- continue;
- }
- if (len == 1) {
- m_Map.SetAt(code, destcode.GetAt(0));
- } else {
- m_Map.SetAt(code, m_MultiCharBuf.GetLength() * 0x10000 + 0xffff);
- m_MultiCharBuf.AppendChar(destcode.GetLength());
- m_MultiCharBuf << destcode;
- }
- }
- parser.GetWord();
- } else {
- CFX_WideString destcode = _StringToWideString(start);
- int len = destcode.GetLength();
- FX_DWORD value = 0;
- if (len == 1) {
- value = _StringToCode(start);
- for (FX_DWORD code = lowcode; code <= highcode; code ++) {
- m_Map.SetAt(code, value++);
- }
- } else {
- for (FX_DWORD code = lowcode; code <= highcode; code ++) {
- CFX_WideString retcode;
- if (code == lowcode) {
- retcode = destcode;
- } else {
- retcode = _StringDataAdd(destcode);
- }
- m_Map.SetAt(code, m_MultiCharBuf.GetLength() * 0x10000 + 0xffff);
- m_MultiCharBuf.AppendChar(retcode.GetLength());
- m_MultiCharBuf << retcode;
- destcode = retcode;
- }
- }
- }
- }
- } else if (word == FX_BSTRC("/Adobe-Korea1-UCS2")) {
- CIDSet = CIDSET_KOREA1;
- } else if (word == FX_BSTRC("/Adobe-Japan1-UCS2")) {
- CIDSet = CIDSET_JAPAN1;
- } else if (word == FX_BSTRC("/Adobe-CNS1-UCS2")) {
- CIDSet = CIDSET_CNS1;
- } else if (word == FX_BSTRC("/Adobe-GB1-UCS2")) {
- CIDSet = CIDSET_GB1;
- }
- }
- if (CIDSet) {
- m_pBaseMap = CPDF_ModuleMgr::Get()->GetPageModule()->GetFontGlobals()->m_CMapManager.GetCID2UnicodeMap(CIDSet, FALSE);
- } else {
- m_pBaseMap = NULL;
- }
-}
-static FX_BOOL GetPredefinedEncoding(int& basemap, const CFX_ByteString& value)
-{
- if (value == FX_BSTRC("WinAnsiEncoding")) {
- basemap = PDFFONT_ENCODING_WINANSI;
- } else if (value == FX_BSTRC("MacRomanEncoding")) {
- basemap = PDFFONT_ENCODING_MACROMAN;
- } else if (value == FX_BSTRC("MacExpertEncoding")) {
- basemap = PDFFONT_ENCODING_MACEXPERT;
- } else if (value == FX_BSTRC("PDFDocEncoding")) {
- basemap = PDFFONT_ENCODING_PDFDOC;
- } else {
- return FALSE;
- }
- return TRUE;
-}
-void CPDF_Font::LoadPDFEncoding(CPDF_Object* pEncoding, int& iBaseEncoding, CFX_ByteString*& pCharNames,
- FX_BOOL bEmbedded, FX_BOOL bTrueType)
-{
- if (pEncoding == NULL) {
- if (m_BaseFont == FX_BSTRC("Symbol")) {
- iBaseEncoding = bTrueType ? PDFFONT_ENCODING_MS_SYMBOL : PDFFONT_ENCODING_ADOBE_SYMBOL;
- } else if (!bEmbedded && iBaseEncoding == PDFFONT_ENCODING_BUILTIN) {
- iBaseEncoding = PDFFONT_ENCODING_WINANSI;
- }
- return;
- }
- if (pEncoding->GetType() == PDFOBJ_NAME) {
- if (iBaseEncoding == PDFFONT_ENCODING_ADOBE_SYMBOL || iBaseEncoding == PDFFONT_ENCODING_ZAPFDINGBATS) {
- return;
- }
- if ((m_Flags & PDFFONT_SYMBOLIC) && m_BaseFont == FX_BSTRC("Symbol")) {
- if (!bTrueType) {
- iBaseEncoding = PDFFONT_ENCODING_ADOBE_SYMBOL;
- }
- return;
- }
- CFX_ByteString bsEncoding = pEncoding->GetString();
- if (bsEncoding.Compare(FX_BSTRC("MacExpertEncoding")) == 0) {
- bsEncoding = FX_BSTRC("WinAnsiEncoding");
- }
- GetPredefinedEncoding(iBaseEncoding, bsEncoding);
- return;
- }
- if (pEncoding->GetType() != PDFOBJ_DICTIONARY) {
- return;
- }
- CPDF_Dictionary* pDict = (CPDF_Dictionary*)pEncoding;
- if (iBaseEncoding != PDFFONT_ENCODING_ADOBE_SYMBOL && iBaseEncoding != PDFFONT_ENCODING_ZAPFDINGBATS) {
- CFX_ByteString bsEncoding = pDict->GetString(FX_BSTRC("BaseEncoding"));
- if (bsEncoding.Compare(FX_BSTRC("MacExpertEncoding")) == 0 && bTrueType) {
- bsEncoding = FX_BSTRC("WinAnsiEncoding");
- }
- GetPredefinedEncoding(iBaseEncoding, bsEncoding);
- }
- if ((!bEmbedded || bTrueType) && iBaseEncoding == PDFFONT_ENCODING_BUILTIN) {
- iBaseEncoding = PDFFONT_ENCODING_STANDARD;
- }
- CPDF_Array* pDiffs = pDict->GetArray(FX_BSTRC("Differences"));
- if (pDiffs == NULL) {
- return;
- }
- FX_NEW_VECTOR(pCharNames, CFX_ByteString, 256);
- FX_DWORD cur_code = 0;
- for (FX_DWORD i = 0; i < pDiffs->GetCount(); i ++) {
- CPDF_Object* pElement = pDiffs->GetElementValue(i);
- if (pElement == NULL) {
- continue;
- }
- if (pElement->GetType() == PDFOBJ_NAME) {
- if (cur_code < 256) {
- pCharNames[cur_code] = ((CPDF_Name*)pElement)->GetString();
- }
- cur_code ++;
- } else {
- cur_code = pElement->GetInteger();
- }
- }
-}
-FX_BOOL CPDF_Font::IsStandardFont() const
-{
- if (m_FontType != PDFFONT_TYPE1) {
- return FALSE;
- }
- if (m_pFontFile != NULL) {
- return FALSE;
- }
- if (((CPDF_Type1Font*)this)->GetBase14Font() < 0) {
- return FALSE;
- }
- return TRUE;
-}
-extern FX_LPCSTR PDF_CharNameFromPredefinedCharSet(int encoding, FX_BYTE charcode);
-CPDF_SimpleFont::CPDF_SimpleFont()
-{
- FXSYS_memset8(m_CharBBox, 0xff, sizeof m_CharBBox);
- FXSYS_memset8(m_CharWidth, 0xff, sizeof m_CharWidth);
- FXSYS_memset8(m_GlyphIndex, 0xff, sizeof m_GlyphIndex);
- FXSYS_memset8(m_ExtGID, 0xff, sizeof m_ExtGID);
- m_pCharNames = NULL;
- m_BaseEncoding = PDFFONT_ENCODING_BUILTIN;
-}
-CPDF_SimpleFont::~CPDF_SimpleFont()
-{
- if (m_pCharNames) {
- FX_DELETE_VECTOR(m_pCharNames, CFX_ByteString, 256);
- }
-}
-int CPDF_SimpleFont::GlyphFromCharCode(FX_DWORD charcode, FX_BOOL *pVertGlyph)
-{
- if (pVertGlyph) {
- *pVertGlyph = FALSE;
- }
- if (charcode > 0xff) {
- return -1;
- }
- int index = m_GlyphIndex[(FX_BYTE)charcode];
- if (index == 0xffff) {
- return -1;
- }
- return index;
-}
-void CPDF_SimpleFont::LoadCharMetrics(int charcode)
-{
- if (m_Font.m_Face == NULL) {
- return;
- }
- if (charcode < 0 || charcode > 0xff) {
- return;
- }
- int glyph_index = m_GlyphIndex[charcode];
- if (glyph_index == 0xffff) {
- if (m_pFontFile == NULL && charcode != 32) {
- LoadCharMetrics(32);
- m_CharBBox[charcode] = m_CharBBox[32];
- if (m_bUseFontWidth) {
- m_CharWidth[charcode] = m_CharWidth[32];
- }
- }
- return;
- }
- int err = FXFT_Load_Glyph(m_Font.m_Face, glyph_index, FXFT_LOAD_NO_SCALE | FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH);
- if (err) {
- return;
- }
- m_CharBBox[charcode].Left = TT2PDF(FXFT_Get_Glyph_HoriBearingX(m_Font.m_Face), m_Font.m_Face);
- m_CharBBox[charcode].Right = TT2PDF(FXFT_Get_Glyph_HoriBearingX(m_Font.m_Face) + FXFT_Get_Glyph_Width(m_Font.m_Face), m_Font.m_Face);
- m_CharBBox[charcode].Top = TT2PDF(FXFT_Get_Glyph_HoriBearingY(m_Font.m_Face), m_Font.m_Face);
- m_CharBBox[charcode].Bottom = TT2PDF(FXFT_Get_Glyph_HoriBearingY(m_Font.m_Face) - FXFT_Get_Glyph_Height(m_Font.m_Face), m_Font.m_Face);
- if (m_bUseFontWidth) {
- int TT_Width = TT2PDF(FXFT_Get_Glyph_HoriAdvance(m_Font.m_Face), m_Font.m_Face);
- if (m_CharWidth[charcode] == 0xffff) {
- m_CharWidth[charcode] = TT_Width;
- } else if (TT_Width && !IsEmbedded()) {
- m_CharBBox[charcode].Right = m_CharBBox[charcode].Right * m_CharWidth[charcode] / TT_Width;
- m_CharBBox[charcode].Left = m_CharBBox[charcode].Left * m_CharWidth[charcode] / TT_Width;
- }
- }
-}
-int CPDF_SimpleFont::GetCharWidthF(FX_DWORD charcode, int level)
-{
- if (charcode > 0xff) {
- charcode = 0;
- }
- if (m_CharWidth[charcode] == 0xffff) {
- LoadCharMetrics(charcode);
- if (m_CharWidth[charcode] == 0xffff) {
- m_CharWidth[charcode] = 0;
- }
- }
- return (FX_INT16)m_CharWidth[charcode];
-}
-void CPDF_SimpleFont::GetCharBBox(FX_DWORD charcode, FX_RECT& rect, int level)
-{
- if (charcode > 0xff) {
- charcode = 0;
- }
- if (m_CharBBox[charcode].Left == (FX_SHORT)0xffff) {
- LoadCharMetrics(charcode);
- }
- rect.left = m_CharBBox[charcode].Left;
- rect.right = m_CharBBox[charcode].Right;
- rect.bottom = m_CharBBox[charcode].Bottom;
- rect.top = m_CharBBox[charcode].Top;
-}
-FX_LPCSTR GetAdobeCharName(int iBaseEncoding, const CFX_ByteString* pCharNames, int charcode)
-{
- ASSERT(charcode >= 0 && charcode < 256);
- if (charcode < 0 || charcode >= 256) {
- return NULL;
- }
- FX_LPCSTR name = NULL;
- if (pCharNames) {
- name = pCharNames[charcode];
- }
- if ((name == NULL || name[0] == 0) && iBaseEncoding) {
- name = PDF_CharNameFromPredefinedCharSet(iBaseEncoding, charcode);
- }
- if (name == NULL || name[0] == 0) {
- return NULL;
- }
- return name;
-}
-FX_BOOL CPDF_SimpleFont::LoadCommon()
-{
- CPDF_Dictionary* pFontDesc = m_pFontDict->GetDict(FX_BSTRC("FontDescriptor"));
- if (pFontDesc) {
- LoadFontDescriptor(pFontDesc);
- }
- CPDF_Array* pWidthArray = m_pFontDict->GetArray(FX_BSTRC("Widths"));
- int width_start = 0, width_end = -1;
- m_bUseFontWidth = TRUE;
- if (pWidthArray) {
- m_bUseFontWidth = FALSE;
- if (pFontDesc && pFontDesc->KeyExist(FX_BSTRC("MissingWidth"))) {
- int MissingWidth = pFontDesc->GetInteger(FX_BSTRC("MissingWidth"));
- for (int i = 0; i < 256; i ++) {
- m_CharWidth[i] = MissingWidth;
- }
- }
- width_start = m_pFontDict->GetInteger(FX_BSTRC("FirstChar"), 0);
- width_end = m_pFontDict->GetInteger(FX_BSTRC("LastChar"), 0);
- if (width_start >= 0 && width_start <= 255) {
- if (width_end <= 0 || width_end >= width_start + (int)pWidthArray->GetCount()) {
- width_end = width_start + pWidthArray->GetCount() - 1;
- }
- if (width_end > 255) {
- width_end = 255;
- }
- for (int i = width_start; i <= width_end; i ++) {
- m_CharWidth[i] = pWidthArray->GetInteger(i - width_start);
- }
- }
- }
- if (m_pFontFile == NULL) {
- LoadSubstFont();
- } else {
- if (m_BaseFont.GetLength() > 8 && m_BaseFont[7] == '+') {
- m_BaseFont = m_BaseFont.Mid(8);
- }
- }
- if (!(m_Flags & PDFFONT_SYMBOLIC)) {
- m_BaseEncoding = PDFFONT_ENCODING_STANDARD;
- }
- CPDF_Object* pEncoding = m_pFontDict->GetElementValue(FX_BSTRC("Encoding"));
- LoadPDFEncoding(pEncoding, m_BaseEncoding, m_pCharNames, m_pFontFile != NULL, m_Font.IsTTFont());
- LoadGlyphMap();
- if (m_pCharNames) {
- FX_DELETE_VECTOR(m_pCharNames, CFX_ByteString, 256);
- m_pCharNames = NULL;
- }
- if (m_Font.m_Face == NULL) {
- return TRUE;
- }
- if (m_Flags & PDFFONT_ALLCAP) {
- unsigned char lowercases[] = {'a', 'z', 0xe0, 0xf6, 0xf8, 0xfd};
- for (int range = 0; range < sizeof lowercases / 2; range ++) {
- for (int i = lowercases[range * 2]; i <= lowercases[range * 2 + 1]; i ++) {
- if (m_GlyphIndex[i] != 0xffff && m_pFontFile != NULL) {
- continue;
- }
- m_GlyphIndex[i] = m_GlyphIndex[i - 32];
- if (m_CharWidth[i - 32]) {
- m_CharWidth[i] = m_CharWidth[i - 32];
- m_CharBBox[i] = m_CharBBox[i - 32];
- }
- }
- }
- }
- CheckFontMetrics();
- return TRUE;
-}
-void CPDF_SimpleFont::LoadSubstFont()
-{
- if (!m_bUseFontWidth && !(m_Flags & PDFFONT_FIXEDPITCH)) {
- int width = 0, i;
- for (i = 0; i < 256; i ++) {
- if (m_CharWidth[i] == 0 || m_CharWidth[i] == 0xffff) {
- continue;
- }
- if (width == 0) {
- width = m_CharWidth[i];
- } else if (width != m_CharWidth[i]) {
- break;
- }
- }
- if (i == 256 && width) {
- m_Flags |= PDFFONT_FIXEDPITCH;
- }
- }
- int weight = m_StemV < 140 ? m_StemV * 5 : (m_StemV * 4 + 140);
- m_Font.LoadSubst(m_BaseFont, m_FontType == PDFFONT_TRUETYPE, m_Flags, weight, m_ItalicAngle, 0);
- if (m_Font.m_pSubstFont->m_SubstFlags & FXFONT_SUBST_NONSYMBOL) {
- }
-}
-FX_BOOL CPDF_SimpleFont::IsUnicodeCompatible() const
-{
- return m_BaseEncoding != PDFFONT_ENCODING_BUILTIN && m_BaseEncoding != PDFFONT_ENCODING_ADOBE_SYMBOL &&
- m_BaseEncoding != PDFFONT_ENCODING_ZAPFDINGBATS;
-}
-CPDF_Type1Font::CPDF_Type1Font()
-{
- m_Base14Font = -1;
-}
-FX_BOOL CPDF_Type1Font::_Load()
-{
- m_Base14Font = _PDF_GetStandardFontName(m_BaseFont);
- if (m_Base14Font >= 0) {
- CPDF_Dictionary* pFontDesc = m_pFontDict->GetDict(FX_BSTRC("FontDescriptor"));
- if (pFontDesc && pFontDesc->KeyExist(FX_BSTRC("Flags"))) {
- m_Flags = pFontDesc->GetInteger(FX_BSTRC("Flags"));
- } else {
- m_Flags = m_Base14Font >= 12 ? PDFFONT_SYMBOLIC : PDFFONT_NONSYMBOLIC;
- }
- if (m_Base14Font < 4)
- for (int i = 0; i < 256; i ++) {
- m_CharWidth[i] = 600;
- }
- if (m_Base14Font == 12) {
- m_BaseEncoding = PDFFONT_ENCODING_ADOBE_SYMBOL;
- } else if (m_Base14Font == 13) {
- m_BaseEncoding = PDFFONT_ENCODING_ZAPFDINGBATS;
- } else if (m_Flags & PDFFONT_NONSYMBOLIC) {
- m_BaseEncoding = PDFFONT_ENCODING_STANDARD;
- }
- }
- return LoadCommon();
-}
-static FX_BOOL FT_UseType1Charmap(FXFT_Face face)
-{
- if (FXFT_Get_Face_CharmapCount(face) == 0) {
- return FALSE;
- }
- if (FXFT_Get_Face_CharmapCount(face) == 1 &&
- FXFT_Get_Charmap_Encoding(FXFT_Get_Face_Charmaps(face)[0]) == FXFT_ENCODING_UNICODE) {
- return FALSE;
- }
- if (FXFT_Get_Charmap_Encoding(FXFT_Get_Face_Charmaps(face)[0]) == FXFT_ENCODING_UNICODE) {
- FXFT_Set_Charmap(face, FXFT_Get_Face_Charmaps(face)[1]);
- } else {
- FXFT_Set_Charmap(face, FXFT_Get_Face_Charmaps(face)[0]);
- }
- return TRUE;
-}
-extern FX_WCHAR FT_UnicodeFromCharCode(int encoding, FX_DWORD charcode);
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
-#include "../../fxge/apple/apple_int.h"
-#endif
-int CPDF_Type1Font::GlyphFromCharCodeExt(FX_DWORD charcode)
-{
- if (charcode > 0xff) {
- return -1;
- }
- int index = m_ExtGID[(FX_BYTE)charcode];
- if (index == 0xffff) {
- return -1;
- }
- return index;
-}
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
-struct _GlyphNameMap {
- FX_LPCSTR m_pStrAdobe;
- FX_LPCSTR m_pStrUnicode;
-};
-static const _GlyphNameMap g_GlyphNameSubsts[] = {
- {"ff", "uniFB00"},
- {"fi", "uniFB01"},
- {"fl", "uniFB02"},
- {"ffi", "uniFB03"},
- {"ffl", "uniFB04"}
-};
-extern "C" {
- static int compareString(const void* key, const void* element)
- {
- return FXSYS_stricmp((FX_LPCSTR)key, ((_GlyphNameMap*)element)->m_pStrAdobe);
- }
-}
-static FX_LPCSTR _GlyphNameRemap(FX_LPCSTR pStrAdobe)
-{
- _GlyphNameMap* found = (_GlyphNameMap*)FXSYS_bsearch(pStrAdobe, g_GlyphNameSubsts,
- sizeof g_GlyphNameSubsts / sizeof(_GlyphNameMap), sizeof(_GlyphNameMap),
- compareString);
- if (found) {
- return found->m_pStrUnicode;
- }
- return NULL;
-}
-#endif
-void CPDF_Type1Font::LoadGlyphMap()
-{
- if (m_Font.m_Face == NULL) {
- return;
- }
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
- FX_BOOL bCoreText = TRUE;
- CQuartz2D & quartz2d = ((CApplePlatform *) CFX_GEModule::Get()->GetPlatformData())->_quartz2d;
- if (!m_Font.m_pPlatformFont) {
- if (m_Font.GetPsName() == CFX_WideString::FromLocal("DFHeiStd-W5")) {
- bCoreText = FALSE;
- }
- m_Font.m_pPlatformFont = quartz2d.CreateFont(m_Font.m_pFontData, m_Font.m_dwSize);
- if (NULL == m_Font.m_pPlatformFont) {
- bCoreText = FALSE;
- }
- }
-#endif
- if (!IsEmbedded() && (m_Base14Font < 12) && m_Font.IsTTFont()) {
- if (FT_UseTTCharmap(m_Font.m_Face, 3, 0)) {
- FX_BOOL bGotOne = FALSE;
- for (int charcode = 0; charcode < 256; charcode ++) {
- const FX_BYTE prefix[4] = {0x00, 0xf0, 0xf1, 0xf2};
- for (int j = 0; j < 4; j ++) {
- FX_WORD unicode = prefix[j] * 256 + charcode;
- m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, unicode);
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
- FX_CHAR name_glyph[256];
- FXFT_Get_Glyph_Name(m_Font.m_Face, m_GlyphIndex[charcode], name_glyph, 256);
- name_glyph[255] = 0;
- CFStringRef name_ct = CFStringCreateWithCStringNoCopy(kCFAllocatorDefault, name_glyph, kCFStringEncodingASCII, kCFAllocatorNull);
- m_ExtGID[charcode] = CGFontGetGlyphWithGlyphName((CGFontRef)m_Font.m_pPlatformFont, name_ct);
- if (name_ct) {
- CFRelease(name_ct);
- }
-#endif
- if (m_GlyphIndex[charcode]) {
- bGotOne = TRUE;
- break;
- }
- }
- }
- if (bGotOne) {
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
- if (!bCoreText) {
- FXSYS_memcpy32(m_ExtGID, m_GlyphIndex, 256);
- }
-#endif
- return;
- }
- }
- FXFT_Select_Charmap(m_Font.m_Face, FXFT_ENCODING_UNICODE);
- if (m_BaseEncoding == 0) {
- m_BaseEncoding = PDFFONT_ENCODING_STANDARD;
- }
- for (int charcode = 0; charcode < 256; charcode ++) {
- FX_LPCSTR name = GetAdobeCharName(m_BaseEncoding, m_pCharNames, charcode);
- if (name == NULL) {
- continue;
- }
- m_Encoding.m_Unicodes[charcode] = PDF_UnicodeFromAdobeName(name);
- m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, m_Encoding.m_Unicodes[charcode]);
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
- FX_CHAR name_glyph[256];
- FXFT_Get_Glyph_Name(m_Font.m_Face, m_GlyphIndex[charcode], name_glyph, 256);
- name_glyph[255] = 0;
- CFStringRef name_ct = CFStringCreateWithCStringNoCopy(kCFAllocatorDefault, name_glyph, kCFStringEncodingASCII, kCFAllocatorNull);
- m_ExtGID[charcode] = CGFontGetGlyphWithGlyphName((CGFontRef)m_Font.m_pPlatformFont, name_ct);
- if (name_ct) {
- CFRelease(name_ct);
- }
-#endif
- if (m_GlyphIndex[charcode] == 0 && FXSYS_strcmp(name, ".notdef") == 0) {
- m_Encoding.m_Unicodes[charcode] = 0x20;
- m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, 0x20);
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
- FX_CHAR name_glyph[256];
- FXFT_Get_Glyph_Name(m_Font.m_Face, m_GlyphIndex[charcode], name_glyph, 256);
- name_glyph[255] = 0;
- CFStringRef name_ct = CFStringCreateWithCStringNoCopy(kCFAllocatorDefault, name_glyph, kCFStringEncodingASCII, kCFAllocatorNull);
- m_ExtGID[charcode] = CGFontGetGlyphWithGlyphName((CGFontRef)m_Font.m_pPlatformFont, name_ct);
- if (name_ct) {
- CFRelease(name_ct);
- }
-#endif
- }
- }
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
- if (!bCoreText) {
- FXSYS_memcpy32(m_ExtGID, m_GlyphIndex, 256);
- }
-#endif
- return;
- }
- FT_UseType1Charmap(m_Font.m_Face);
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
- if (bCoreText) {
- if (m_Flags & PDFFONT_SYMBOLIC) {
- for (int charcode = 0; charcode < 256; charcode ++) {
- FX_LPCSTR name = GetAdobeCharName(m_BaseEncoding, m_pCharNames, charcode);
- if (name) {
- m_Encoding.m_Unicodes[charcode] = PDF_UnicodeFromAdobeName(name);
- m_GlyphIndex[charcode] = FXFT_Get_Name_Index(m_Font.m_Face, (char*)name);
- CFStringRef name_ct = CFStringCreateWithCStringNoCopy(kCFAllocatorDefault, name, kCFStringEncodingASCII, kCFAllocatorNull);
- m_ExtGID[charcode] = CGFontGetGlyphWithGlyphName((CGFontRef)m_Font.m_pPlatformFont, name_ct);
- if (name_ct) {
- CFRelease(name_ct);
- }
- } else {
- m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, charcode);
- FX_WCHAR unicode = 0;
- if (m_GlyphIndex[charcode]) {
- unicode = FT_UnicodeFromCharCode(PDFFONT_ENCODING_STANDARD, charcode);
- }
- FX_CHAR name_glyph[256];
- FXSYS_memset32(name_glyph, 0, sizeof(name_glyph));
- FXFT_Get_Glyph_Name(m_Font.m_Face, m_GlyphIndex[charcode], name_glyph, 256);
- name_glyph[255] = 0;
- if (unicode == 0 && name_glyph[0] != 0) {
- unicode = PDF_UnicodeFromAdobeName(name_glyph);
- }
- m_Encoding.m_Unicodes[charcode] = unicode;
- CFStringRef name_ct = CFStringCreateWithCStringNoCopy(kCFAllocatorDefault, name_glyph, kCFStringEncodingASCII, kCFAllocatorNull);
- m_ExtGID[charcode] = CGFontGetGlyphWithGlyphName((CGFontRef)m_Font.m_pPlatformFont, name_ct);
- if (name_ct) {
- CFRelease(name_ct);
- }
- }
- }
- return;
- }
- FX_BOOL bUnicode = FALSE;
- if (0 == FXFT_Select_Charmap(m_Font.m_Face, FXFT_ENCODING_UNICODE)) {
- bUnicode = TRUE;
- }
- for (int charcode = 0; charcode < 256; charcode ++) {
- FX_LPCSTR name = GetAdobeCharName(m_BaseEncoding, m_pCharNames, charcode);
- if (name == NULL) {
- continue;
- }
- m_Encoding.m_Unicodes[charcode] = PDF_UnicodeFromAdobeName(name);
- FX_LPCSTR pStrUnicode = _GlyphNameRemap(name);
- if (pStrUnicode && 0 == FXFT_Get_Name_Index(m_Font.m_Face, (char*)name)) {
- name = pStrUnicode;
- }
- m_GlyphIndex[charcode] = FXFT_Get_Name_Index(m_Font.m_Face, (char*)name);
- CFStringRef name_ct = CFStringCreateWithCStringNoCopy(kCFAllocatorDefault, name, kCFStringEncodingASCII, kCFAllocatorNull);
- m_ExtGID[charcode] = CGFontGetGlyphWithGlyphName((CGFontRef)m_Font.m_pPlatformFont, name_ct);
- if (name_ct) {
- CFRelease(name_ct);
- }
- if (m_GlyphIndex[charcode] == 0) {
- if (FXSYS_strcmp(name, ".notdef") != 0 && FXSYS_strcmp(name, "space") != 0) {
- m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, bUnicode ? m_Encoding.m_Unicodes[charcode] : charcode);
- FX_CHAR name_glyph[256];
- FXFT_Get_Glyph_Name(m_Font.m_Face, m_GlyphIndex[charcode], name_glyph, 256);
- name_glyph[255] = 0;
- CFStringRef name_ct = CFStringCreateWithCStringNoCopy(kCFAllocatorDefault, name_glyph, kCFStringEncodingASCII, kCFAllocatorNull);
- m_ExtGID[charcode] = CGFontGetGlyphWithGlyphName((CGFontRef)m_Font.m_pPlatformFont, name_ct);
- if (name_ct) {
- CFRelease(name_ct);
- }
- } else {
- m_Encoding.m_Unicodes[charcode] = 0x20;
- m_GlyphIndex[charcode] = bUnicode ? FXFT_Get_Char_Index(m_Font.m_Face, 0x20) : 0xffff;
- FX_CHAR name_glyph[256];
- FXFT_Get_Glyph_Name(m_Font.m_Face, m_GlyphIndex[charcode], name_glyph, 256);
- name_glyph[255] = 0;
- CFStringRef name_ct = CFStringCreateWithCStringNoCopy(kCFAllocatorDefault, name_glyph, kCFStringEncodingASCII, kCFAllocatorNull);
- m_ExtGID[charcode] = CGFontGetGlyphWithGlyphName((CGFontRef)m_Font.m_pPlatformFont, name_ct);
- if (name_ct) {
- CFRelease(name_ct);
- }
- }
- }
- }
- return;
- }
-#endif
- if (m_Flags & PDFFONT_SYMBOLIC) {
- for (int charcode = 0; charcode < 256; charcode ++) {
- FX_LPCSTR name = GetAdobeCharName(m_BaseEncoding, m_pCharNames, charcode);
- if (name) {
- m_Encoding.m_Unicodes[charcode] = PDF_UnicodeFromAdobeName(name);
- m_GlyphIndex[charcode] = FXFT_Get_Name_Index(m_Font.m_Face, (char*)name);
- } else {
- m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, charcode);
- if (m_GlyphIndex[charcode]) {
- FX_WCHAR unicode = FT_UnicodeFromCharCode(PDFFONT_ENCODING_STANDARD, charcode);
- if (unicode == 0) {
- FX_CHAR name_glyph[256];
- FXSYS_memset32(name_glyph, 0, sizeof(name_glyph));
- FXFT_Get_Glyph_Name(m_Font.m_Face, m_GlyphIndex[charcode], name_glyph, 256);
- name_glyph[255] = 0;
- if (name_glyph[0] != 0) {
- unicode = PDF_UnicodeFromAdobeName(name_glyph);
- }
- }
- m_Encoding.m_Unicodes[charcode] = unicode;
- }
- }
- }
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
- if (!bCoreText) {
- FXSYS_memcpy32(m_ExtGID, m_GlyphIndex, 256);
- }
-#endif
- return;
- }
- FX_BOOL bUnicode = FALSE;
- if (0 == FXFT_Select_Charmap(m_Font.m_Face, FXFT_ENCODING_UNICODE)) {
- bUnicode = TRUE;
- }
- for (int charcode = 0; charcode < 256; charcode ++) {
- FX_LPCSTR name = GetAdobeCharName(m_BaseEncoding, m_pCharNames, charcode);
- if (name == NULL) {
- continue;
- }
- m_Encoding.m_Unicodes[charcode] = PDF_UnicodeFromAdobeName(name);
- m_GlyphIndex[charcode] = FXFT_Get_Name_Index(m_Font.m_Face, (char*)name);
- if (m_GlyphIndex[charcode] == 0) {
- if (FXSYS_strcmp(name, ".notdef") != 0 && FXSYS_strcmp(name, "space") != 0) {
- m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, bUnicode ? m_Encoding.m_Unicodes[charcode] : charcode);
- } else {
- m_Encoding.m_Unicodes[charcode] = 0x20;
- m_GlyphIndex[charcode] = 0xffff;
- }
- }
- }
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
- if (!bCoreText) {
- FXSYS_memcpy32(m_ExtGID, m_GlyphIndex, 256);
- }
-#endif
-}
-CPDF_FontEncoding::CPDF_FontEncoding()
-{
- FXSYS_memset32(m_Unicodes, 0, sizeof(m_Unicodes));
-}
-int CPDF_FontEncoding::CharCodeFromUnicode(FX_WCHAR unicode) const
-{
- for (int i = 0; i < 256; i ++)
- if (m_Unicodes[i] == unicode) {
- return i;
- }
- return -1;
-}
-CPDF_FontEncoding::CPDF_FontEncoding(int PredefinedEncoding)
-{
- const FX_WORD* pSrc = PDF_UnicodesForPredefinedCharSet(PredefinedEncoding);
- if (!pSrc) {
- FXSYS_memset32(m_Unicodes, 0, sizeof(m_Unicodes));
- } else
- for (int i = 0; i < 256; i++) {
- m_Unicodes[i] = pSrc[i];
- }
-}
-FX_BOOL CPDF_FontEncoding::IsIdentical(CPDF_FontEncoding* pAnother) const
-{
- return FXSYS_memcmp32(m_Unicodes, pAnother->m_Unicodes, sizeof(m_Unicodes)) == 0;
-}
-CPDF_Object* CPDF_FontEncoding::Realize()
-{
- int predefined = 0;
- for (int cs = PDFFONT_ENCODING_WINANSI; cs < PDFFONT_ENCODING_ZAPFDINGBATS; cs ++) {
- const FX_WORD* pSrc = PDF_UnicodesForPredefinedCharSet(cs);
- FX_BOOL match = TRUE;
- for (int i = 0; i < 256; ++i) {
- if (m_Unicodes[i] != pSrc[i]) {
- match = FALSE;
- break;
- }
- }
- if (match) {
- predefined = cs;
- break;
- }
- }
- if (predefined) {
- if (predefined == PDFFONT_ENCODING_WINANSI) {
- return CPDF_Name::Create("WinAnsiEncoding");
- }
- if (predefined == PDFFONT_ENCODING_MACROMAN) {
- return CPDF_Name::Create("MacRomanEncoding");
- }
- if (predefined == PDFFONT_ENCODING_MACEXPERT) {
- return CPDF_Name::Create("MacExpertEncoding");
- }
- return NULL;
- }
- CPDF_Dictionary* pDict = CPDF_Dictionary::Create();
- pDict->SetAtName(FX_BSTRC("BaseEncoding"), FX_BSTRC("WinAnsiEncoding"));
- const FX_WORD* pStandard = PDF_UnicodesForPredefinedCharSet(PDFFONT_ENCODING_WINANSI);
- CPDF_Array* pDiff = CPDF_Array::Create();
- for (int i = 0; i < 256; i ++) {
- if (pStandard[i] == m_Unicodes[i]) {
- continue;
- }
- pDiff->Add(CPDF_Number::Create(i));
- pDiff->Add(CPDF_Name::Create(PDF_AdobeNameFromUnicode(m_Unicodes[i])));
- }
- pDict->SetAt(FX_BSTRC("Differences"), pDiff);
- return pDict;
-}
-CPDF_TrueTypeFont::CPDF_TrueTypeFont()
-{
-}
-FX_BOOL CPDF_TrueTypeFont::_Load()
-{
- return LoadCommon();
-}
-extern FX_DWORD FT_CharCodeFromUnicode(int encoding, FX_WCHAR unicode);
-void CPDF_TrueTypeFont::LoadGlyphMap()
-{
- if (m_Font.m_Face == NULL) {
- return;
- }
- int baseEncoding = m_BaseEncoding;
- if (m_pFontFile && m_Font.m_Face->num_charmaps > 0
- && (baseEncoding == PDFFONT_ENCODING_MACROMAN || baseEncoding == PDFFONT_ENCODING_WINANSI)
- && (m_Flags & PDFFONT_SYMBOLIC)) {
- FX_BOOL bSupportWin = FALSE;
- FX_BOOL bSupportMac = FALSE;
- for (int i = 0; i < FXFT_Get_Face_CharmapCount(m_Font.m_Face); i++) {
- int platform_id = FXFT_Get_Charmap_PlatformID(FXFT_Get_Face_Charmaps(m_Font.m_Face)[i]);
- if (platform_id == 0 || platform_id == 3) {
- bSupportWin = TRUE;
- } else if (platform_id == 0 || platform_id == 1) {
- bSupportMac = TRUE;
- }
- }
- if (baseEncoding == PDFFONT_ENCODING_WINANSI && !bSupportWin) {
- baseEncoding = bSupportMac ? PDFFONT_ENCODING_MACROMAN : PDFFONT_ENCODING_BUILTIN;
- } else if (baseEncoding == PDFFONT_ENCODING_MACROMAN && !bSupportMac) {
- baseEncoding = bSupportWin ? PDFFONT_ENCODING_WINANSI : PDFFONT_ENCODING_BUILTIN;
- }
- }
- if (((baseEncoding == PDFFONT_ENCODING_MACROMAN || baseEncoding == PDFFONT_ENCODING_WINANSI)
- && m_pCharNames == NULL) || (m_Flags & PDFFONT_NONSYMBOLIC)) {
- if (!FXFT_Has_Glyph_Names(m_Font.m_Face) && (!m_Font.m_Face->num_charmaps || !m_Font.m_Face->charmaps)) {
- int nStartChar = m_pFontDict->GetInteger(FX_BSTRC("FirstChar"));
- int charcode = 0;
- for (; charcode < nStartChar; charcode ++) {
- m_GlyphIndex[charcode] = 0;
- }
- FX_WORD nGlyph = charcode - nStartChar + 3;
- for (; charcode < 256; charcode ++, nGlyph ++) {
- m_GlyphIndex[charcode] = nGlyph;
- }
- return;
- }
- FX_BOOL bMSUnicode = FT_UseTTCharmap(m_Font.m_Face, 3, 1);
- FX_BOOL bMacRoman = FALSE, bMSSymbol = FALSE;
- if (!bMSUnicode) {
- if (m_Flags & PDFFONT_NONSYMBOLIC) {
- bMacRoman = FT_UseTTCharmap(m_Font.m_Face, 1, 0);
- bMSSymbol = !bMacRoman && FT_UseTTCharmap(m_Font.m_Face, 3, 0);
- } else {
- bMSSymbol = FT_UseTTCharmap(m_Font.m_Face, 3, 0);
- bMacRoman = !bMSSymbol && FT_UseTTCharmap(m_Font.m_Face, 1, 0);
- }
- }
- FX_BOOL bToUnicode = m_pFontDict->KeyExist(FX_BSTRC("ToUnicode"));
- for (int charcode = 0; charcode < 256; charcode ++) {
- FX_LPCSTR name = GetAdobeCharName(baseEncoding, m_pCharNames, charcode);
- if (name == NULL) {
- m_GlyphIndex[charcode] = m_pFontFile ? FXFT_Get_Char_Index(m_Font.m_Face, charcode) : -1;
- continue;
- }
- m_Encoding.m_Unicodes[charcode] = PDF_UnicodeFromAdobeName(name);
- if (bMSSymbol) {
- const FX_BYTE prefix[4] = {0x00, 0xf0, 0xf1, 0xf2};
- for (int j = 0; j < 4; j ++) {
- FX_WORD unicode = prefix[j] * 256 + charcode;
- m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, unicode);
- if (m_GlyphIndex[charcode]) {
- break;
- }
- }
- } else if (m_Encoding.m_Unicodes[charcode]) {
- if (bMSUnicode) {
- m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, m_Encoding.m_Unicodes[charcode]);
- } else if (bMacRoman) {
- FX_DWORD maccode = FT_CharCodeFromUnicode(FXFT_ENCODING_APPLE_ROMAN, m_Encoding.m_Unicodes[charcode]);
- if (!maccode) {
- m_GlyphIndex[charcode] = FXFT_Get_Name_Index(m_Font.m_Face, (char *)name);
- } else {
- m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, maccode);
- }
- }
- }
- if ((m_GlyphIndex[charcode] == 0 || m_GlyphIndex[charcode] == 0xffff) && name != NULL) {
- if (name[0] == '.' && FXSYS_strcmp(name, ".notdef") == 0) {
- m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, 32);
- } else {
- m_GlyphIndex[charcode] = FXFT_Get_Name_Index(m_Font.m_Face, (char*)name);
- if (m_GlyphIndex[charcode] == 0) {
- if (bToUnicode) {
- CFX_WideString wsUnicode = UnicodeFromCharCode(charcode);
- if (!wsUnicode.IsEmpty()) {
- m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, wsUnicode[0]);
- m_Encoding.m_Unicodes[charcode] = wsUnicode[0];
- }
- }
- if (m_GlyphIndex[charcode] == 0) {
- m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, charcode);
- }
- }
- }
- }
- }
- return;
- }
- if (FT_UseTTCharmap(m_Font.m_Face, 3, 0)) {
- const FX_BYTE prefix[4] = {0x00, 0xf0, 0xf1, 0xf2};
- FX_BOOL bGotOne = FALSE;
- for (int charcode = 0; charcode < 256; charcode ++) {
- for (int j = 0; j < 4; j ++) {
- FX_WORD unicode = prefix[j] * 256 + charcode;
- m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, unicode);
- if (m_GlyphIndex[charcode]) {
- bGotOne = TRUE;
- break;
- }
- }
- }
- if (bGotOne) {
- if (baseEncoding != PDFFONT_ENCODING_BUILTIN) {
- for (int charcode = 0; charcode < 256; charcode ++) {
- FX_LPCSTR name = GetAdobeCharName(baseEncoding, m_pCharNames, charcode);
- if (name == NULL) {
- continue;
- }
- m_Encoding.m_Unicodes[charcode] = PDF_UnicodeFromAdobeName(name);
- }
- } else if (FT_UseTTCharmap(m_Font.m_Face, 1, 0)) {
- for (int charcode = 0; charcode < 256; charcode ++) {
- m_Encoding.m_Unicodes[charcode] = FT_UnicodeFromCharCode(FXFT_ENCODING_APPLE_ROMAN, charcode);
- }
- }
- return;
- }
- }
- if (FT_UseTTCharmap(m_Font.m_Face, 1, 0)) {
- FX_BOOL bGotOne = FALSE;
- for (int charcode = 0; charcode < 256; charcode ++) {
- m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, charcode);
- m_Encoding.m_Unicodes[charcode] = FT_UnicodeFromCharCode(FXFT_ENCODING_APPLE_ROMAN, charcode);
- if (m_GlyphIndex[charcode]) {
- bGotOne = TRUE;
- }
- }
- if (m_pFontFile || bGotOne) {
- return;
- }
- }
- if (FXFT_Select_Charmap(m_Font.m_Face, FXFT_ENCODING_UNICODE) == 0) {
- FX_BOOL bGotOne = FALSE;
- const FX_WORD* pUnicodes = PDF_UnicodesForPredefinedCharSet(baseEncoding);
- for (int charcode = 0; charcode < 256; charcode ++) {
- if (m_pFontFile == NULL) {
- FX_LPCSTR name = GetAdobeCharName(0, m_pCharNames, charcode);
- if (name != NULL) {
- m_Encoding.m_Unicodes[charcode] = PDF_UnicodeFromAdobeName(name);
- } else if (pUnicodes) {
- m_Encoding.m_Unicodes[charcode] = pUnicodes[charcode];
- }
- } else {
- m_Encoding.m_Unicodes[charcode] = charcode;
- }
- m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, m_Encoding.m_Unicodes[charcode]);
- if (m_GlyphIndex[charcode]) {
- bGotOne = TRUE;
- }
- }
- if (bGotOne) {
- return;
- }
- }
- for (int charcode = 0; charcode < 256; charcode ++) {
- m_GlyphIndex[charcode] = charcode;
- }
-}
-CPDF_Type3Font::CPDF_Type3Font()
-{
- m_pPageResources = NULL;
- FXSYS_memset32(m_CharWidthL, 0, sizeof m_CharWidthL);
-}
-CPDF_Type3Font::~CPDF_Type3Font()
-{
- FX_POSITION pos = m_CacheMap.GetStartPosition();
- while (pos) {
- FX_LPVOID key, value;
- m_CacheMap.GetNextAssoc(pos, key, value);
- delete (CPDF_Type3Char*)value;
- }
- m_CacheMap.RemoveAll();
- pos = m_DeletedMap.GetStartPosition();
- while (pos) {
- FX_LPVOID key, value;
- m_DeletedMap.GetNextAssoc(pos, key, value);
- delete (CPDF_Type3Char*)key;
- }
-}
-FX_BOOL CPDF_Type3Font::_Load()
-{
- m_pFontResources = m_pFontDict->GetDict(FX_BSTRC("Resources"));
- CPDF_Array* pMatrix = m_pFontDict->GetArray(FX_BSTRC("FontMatrix"));
- FX_FLOAT xscale = 1.0f, yscale = 1.0f;
- if (pMatrix) {
- m_FontMatrix = pMatrix->GetMatrix();
- xscale = m_FontMatrix.a;
- yscale = m_FontMatrix.d;
- }
- CPDF_Array* pBBox = m_pFontDict->GetArray(FX_BSTRC("FontBBox"));
- if (pBBox) {
- m_FontBBox.left = (FX_INT32)(FXSYS_Mul(pBBox->GetNumber(0), xscale) * 1000);
- m_FontBBox.bottom = (FX_INT32)(FXSYS_Mul(pBBox->GetNumber(1), yscale) * 1000);
- m_FontBBox.right = (FX_INT32)(FXSYS_Mul(pBBox->GetNumber(2), xscale) * 1000);
- m_FontBBox.top = (FX_INT32)(FXSYS_Mul(pBBox->GetNumber(3), yscale) * 1000);
- }
- int StartChar = m_pFontDict->GetInteger(FX_BSTRC("FirstChar"));
- CPDF_Array* pWidthArray = m_pFontDict->GetArray(FX_BSTRC("Widths"));
- if (pWidthArray && (StartChar >= 0 && StartChar < 256)) {
- FX_DWORD count = pWidthArray->GetCount();
- if (count > 256) {
- count = 256;
- }
- if (StartChar + count > 256) {
- count = 256 - StartChar;
- }
- for (FX_DWORD i = 0; i < count; i ++) {
- m_CharWidthL[StartChar + i] = FXSYS_round(FXSYS_Mul(pWidthArray->GetNumber(i), xscale) * 1000);
- }
- }
- m_pCharProcs = m_pFontDict->GetDict(FX_BSTRC("CharProcs"));
- CPDF_Object* pEncoding = m_pFontDict->GetElementValue(FX_BSTRC("Encoding"));
- if (pEncoding) {
- LoadPDFEncoding(pEncoding, m_BaseEncoding, m_pCharNames, FALSE, FALSE);
- if (m_pCharNames) {
- for (int i = 0; i < 256; i ++) {
- m_Encoding.m_Unicodes[i] = PDF_UnicodeFromAdobeName(m_pCharNames[i]);
- if (m_Encoding.m_Unicodes[i] == 0) {
- m_Encoding.m_Unicodes[i] = i;
- }
- }
- }
- }
- return TRUE;
-}
-void CPDF_Type3Font::CheckType3FontMetrics()
-{
- CheckFontMetrics();
-}
-CPDF_Type3Char* CPDF_Type3Font::LoadChar(FX_DWORD charcode, int level)
-{
- if (level >= _FPDF_MAX_TYPE3_FORM_LEVEL_) {
- return NULL;
- }
- CPDF_Type3Char* pChar = NULL;
- if (m_CacheMap.Lookup((FX_LPVOID)(FX_UINTPTR)charcode, (FX_LPVOID&)pChar)) {
- if (pChar->m_bPageRequired && m_pPageResources) {
- delete pChar;
- m_CacheMap.RemoveKey((FX_LPVOID)(FX_UINTPTR)charcode);
- return LoadChar(charcode, level + 1);
- }
- return pChar;
- }
- FX_LPCSTR name = GetAdobeCharName(m_BaseEncoding, m_pCharNames, charcode);
- if (name == NULL) {
- return NULL;
- }
- CPDF_Stream* pStream = (CPDF_Stream*)m_pCharProcs->GetElementValue(name);
- if (pStream == NULL || pStream->GetType() != PDFOBJ_STREAM) {
- return NULL;
- }
- pChar = FX_NEW CPDF_Type3Char;
- pChar->m_pForm = FX_NEW CPDF_Form(m_pDocument, m_pFontResources ? m_pFontResources : m_pPageResources, pStream, NULL);
- pChar->m_pForm->ParseContent(NULL, NULL, pChar, NULL, level + 1);
- FX_FLOAT scale = m_FontMatrix.GetXUnit();
- pChar->m_Width = (FX_INT32)(pChar->m_Width * scale + 0.5f);
- FX_RECT &rcBBox = pChar->m_BBox;
- CFX_FloatRect char_rect((FX_FLOAT)rcBBox.left / 1000.0f, (FX_FLOAT)rcBBox.bottom / 1000.0f,
- (FX_FLOAT)rcBBox.right / 1000.0f, (FX_FLOAT)rcBBox.top / 1000.0f);
- if (rcBBox.right <= rcBBox.left || rcBBox.bottom >= rcBBox.top) {
- char_rect = pChar->m_pForm->CalcBoundingBox();
- }
- char_rect.Transform(&m_FontMatrix);
- rcBBox.left = FXSYS_round(char_rect.left * 1000);
- rcBBox.right = FXSYS_round(char_rect.right * 1000);
- rcBBox.top = FXSYS_round(char_rect.top * 1000);
- rcBBox.bottom = FXSYS_round(char_rect.bottom * 1000);
- m_CacheMap.SetAt((FX_LPVOID)(FX_UINTPTR)charcode, pChar);
- if (pChar->m_pForm->CountObjects() == 0) {
- delete pChar->m_pForm;
- pChar->m_pForm = NULL;
- }
- return pChar;
-}
-int CPDF_Type3Font::GetCharWidthF(FX_DWORD charcode, int level)
-{
- if (charcode > 0xff) {
- charcode = 0;
- }
- if (m_CharWidthL[charcode]) {
- return m_CharWidthL[charcode];
- }
- CPDF_Type3Char* pChar = LoadChar(charcode, level);
- if (pChar == NULL) {
- return 0;
- }
- return pChar->m_Width;
-}
-void CPDF_Type3Font::GetCharBBox(FX_DWORD charcode, FX_RECT& rect, int level)
-{
- CPDF_Type3Char* pChar = LoadChar(charcode, level);
- if (pChar == NULL) {
- rect.left = rect.right = rect.top = rect.bottom = 0;
- return;
- }
- rect = pChar->m_BBox;
-}
-CPDF_Type3Char::CPDF_Type3Char()
-{
- m_pForm = NULL;
- m_pBitmap = NULL;
- m_bPageRequired = FALSE;
- m_bColored = FALSE;
-}
-CPDF_Type3Char::~CPDF_Type3Char()
-{
- if (m_pForm) {
- delete m_pForm;
- }
- if (m_pBitmap) {
- delete m_pBitmap;
- }
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fpdfapi/fpdf_page.h"
+#include "../../../include/fpdfapi/fpdf_module.h"
+#include "../../../include/fpdfapi/fpdf_pageobj.h"
+#include "font_int.h"
+#include "../fpdf_page/pageint.h"
+#include "../../../include/fxge/fx_freetype.h"
+FX_BOOL FT_UseTTCharmap(FXFT_Face face, int platform_id, int encoding_id)
+{
+ for (int i = 0; i < FXFT_Get_Face_CharmapCount(face); i ++) {
+ if (FXFT_Get_Charmap_PlatformID(FXFT_Get_Face_Charmaps(face)[i]) == platform_id &&
+ FXFT_Get_Charmap_EncodingID(FXFT_Get_Face_Charmaps(face)[i]) == encoding_id) {
+ FXFT_Set_Charmap(face, FXFT_Get_Face_Charmaps(face)[i]);
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+extern const FX_WORD* PDF_UnicodesForPredefinedCharSet(int);
+CPDF_FontGlobals::CPDF_FontGlobals()
+{
+ FXSYS_memset32(m_EmbeddedCharsets, 0, sizeof m_EmbeddedCharsets);
+ FXSYS_memset32(m_EmbeddedToUnicodes, 0, sizeof m_EmbeddedToUnicodes);
+ m_pContrastRamps = NULL;
+}
+CPDF_FontGlobals::~CPDF_FontGlobals()
+{
+ ClearAll();
+ if (m_pContrastRamps) {
+ FX_Free(m_pContrastRamps);
+ }
+}
+class CFX_StockFontArray : public CFX_Object
+{
+public:
+ CFX_StockFontArray()
+ {
+ FXSYS_memset32(m_pStockFonts, 0, sizeof(CPDF_Font*) * 14);
+ }
+ CPDF_Font* m_pStockFonts[14];
+};
+CPDF_Font* CPDF_FontGlobals::Find(void* key, int index)
+{
+ void* value = NULL;
+ if (!m_pStockMap.Lookup(key, value)) {
+ return NULL;
+ }
+ if (!value) {
+ return NULL;
+ }
+ return ((CFX_StockFontArray*)value)->m_pStockFonts[index];
+}
+void CPDF_FontGlobals::Set(void* key, int index, CPDF_Font* pFont)
+{
+ void* value = NULL;
+ if (m_pStockMap.Lookup(key, value)) {
+ ((CFX_StockFontArray*)value)->m_pStockFonts[index] = pFont;
+ return;
+ }
+ CFX_StockFontArray* pFonts = FX_NEW CFX_StockFontArray();
+ if (pFonts) {
+ pFonts->m_pStockFonts[index] = pFont;
+ }
+ m_pStockMap.SetAt(key, pFonts);
+}
+void CPDF_FontGlobals::Clear(void* key)
+{
+ void* value = NULL;
+ if (!m_pStockMap.Lookup(key, value)) {
+ return;
+ }
+ if (value) {
+ CFX_StockFontArray* pStockFonts = (CFX_StockFontArray*)value;
+ for (int i = 0; i < 14; i ++) {
+ if (pStockFonts->m_pStockFonts[i]) {
+ pStockFonts->m_pStockFonts[i]->GetFontDict()->Release();
+ delete pStockFonts->m_pStockFonts[i];
+ }
+ }
+ delete pStockFonts;
+ }
+ m_pStockMap.RemoveKey(key);
+}
+void CPDF_FontGlobals::ClearAll()
+{
+ FX_POSITION pos = m_pStockMap.GetStartPosition();
+ while (pos) {
+ void *key = NULL;
+ void* value = NULL;
+ m_pStockMap.GetNextAssoc(pos, key, value);
+ if (value) {
+ CFX_StockFontArray* pStockFonts = (CFX_StockFontArray*)value;
+ for (int i = 0; i < 14; i ++) {
+ if (pStockFonts->m_pStockFonts[i]) {
+ pStockFonts->m_pStockFonts[i]->GetFontDict()->Release();
+ delete pStockFonts->m_pStockFonts[i];
+ }
+ }
+ delete pStockFonts;
+ }
+ m_pStockMap.RemoveKey(key);
+ }
+}
+CPDF_Font::CPDF_Font()
+{
+ m_FontType = 0;
+ m_FontBBox.left = m_FontBBox.right = m_FontBBox.top = m_FontBBox.bottom = 0;
+ m_StemV = m_Ascent = m_Descent = m_ItalicAngle = 0;
+ m_pFontFile = NULL;
+ m_Flags = 0;
+ m_pToUnicodeMap = NULL;
+ m_bToUnicodeLoaded = FALSE;
+ m_pCharMap = NULL;
+}
+FX_BOOL CPDF_Font::Initialize()
+{
+ m_pCharMap = FX_NEW CPDF_FontCharMap(this);
+ return TRUE;
+}
+CPDF_Font::~CPDF_Font()
+{
+ if (m_pCharMap) {
+ FX_Free(m_pCharMap);
+ m_pCharMap = NULL;
+ }
+ if (m_pToUnicodeMap) {
+ delete m_pToUnicodeMap;
+ m_pToUnicodeMap = NULL;
+ }
+ if (m_pFontFile) {
+ m_pDocument->GetPageData()->ReleaseFontFileStreamAcc((CPDF_Stream*)m_pFontFile->GetStream());
+ }
+}
+FX_BOOL CPDF_Font::IsVertWriting() const
+{
+ FX_BOOL bVertWriting = FALSE;
+ CPDF_CIDFont* pCIDFont = GetCIDFont();
+ if (pCIDFont) {
+ bVertWriting = pCIDFont->IsVertWriting();
+ } else {
+ bVertWriting = m_Font.IsVertical();
+ }
+ return bVertWriting;
+}
+CFX_ByteString CPDF_Font::GetFontTypeName() const
+{
+ switch (m_FontType) {
+ case PDFFONT_TYPE1:
+ return FX_BSTRC("Type1");
+ case PDFFONT_TRUETYPE:
+ return FX_BSTRC("TrueType");
+ case PDFFONT_TYPE3:
+ return FX_BSTRC("Type3");
+ case PDFFONT_CIDFONT:
+ return FX_BSTRC("Type0");
+ }
+ return CFX_ByteString();
+}
+void CPDF_Font::AppendChar(CFX_ByteString& str, FX_DWORD charcode) const
+{
+ char buf[4];
+ int len = AppendChar(buf, charcode);
+ if (len == 1) {
+ str += buf[0];
+ } else {
+ str += CFX_ByteString(buf, len);
+ }
+}
+CFX_WideString CPDF_Font::UnicodeFromCharCode(FX_DWORD charcode) const
+{
+ if (!m_bToUnicodeLoaded) {
+ ((CPDF_Font*)this)->LoadUnicodeMap();
+ }
+ if (m_pToUnicodeMap) {
+ CFX_WideString wsRet = m_pToUnicodeMap->Lookup(charcode);
+ if (!wsRet.IsEmpty()) {
+ return wsRet;
+ }
+ }
+ FX_WCHAR unicode = _UnicodeFromCharCode(charcode);
+ if (unicode == 0) {
+ return CFX_WideString();
+ }
+ return unicode;
+}
+FX_DWORD CPDF_Font::CharCodeFromUnicode(FX_WCHAR unicode) const
+{
+ if (!m_bToUnicodeLoaded) {
+ ((CPDF_Font*)this)->LoadUnicodeMap();
+ }
+ if (m_pToUnicodeMap) {
+ FX_DWORD charcode = m_pToUnicodeMap->ReverseLookup(unicode);
+ if (charcode) {
+ return charcode;
+ }
+ }
+ return _CharCodeFromUnicode(unicode);
+}
+CFX_WideString CPDF_Font::DecodeString(const CFX_ByteString& str) const
+{
+ CFX_WideString result;
+ int src_len = str.GetLength();
+ result.Reserve(src_len);
+ FX_LPCSTR src_buf = str;
+ int src_pos = 0;
+ while (src_pos < src_len) {
+ FX_DWORD charcode = GetNextChar(src_buf, src_pos);
+ CFX_WideString unicode = UnicodeFromCharCode(charcode);
+ if (!unicode.IsEmpty()) {
+ result += unicode;
+ } else {
+ result += (FX_WCHAR)charcode;
+ }
+ }
+ return result;
+}
+CFX_ByteString CPDF_Font::EncodeString(const CFX_WideString& str) const
+{
+ CFX_ByteString result;
+ int src_len = str.GetLength();
+ FX_LPSTR dest_buf = result.GetBuffer(src_len * 2);
+ FX_LPCWSTR src_buf = str;
+ int dest_pos = 0;
+ for (int src_pos = 0; src_pos < src_len; src_pos ++) {
+ FX_DWORD charcode = CharCodeFromUnicode(src_buf[src_pos]);
+ dest_pos += AppendChar(dest_buf + dest_pos, charcode);
+ }
+ result.ReleaseBuffer(dest_pos);
+ return result;
+}
+void CPDF_Font::LoadFontDescriptor(CPDF_Dictionary* pFontDesc)
+{
+ m_Flags = pFontDesc->GetInteger(FX_BSTRC("Flags"), PDFFONT_NONSYMBOLIC);
+ int ItalicAngle = 0;
+ FX_BOOL bExistItalicAngle = FALSE;
+ if (pFontDesc->KeyExist(FX_BSTRC("ItalicAngle"))) {
+ ItalicAngle = pFontDesc->GetInteger(FX_BSTRC("ItalicAngle"));
+ bExistItalicAngle = TRUE;
+ }
+ if (ItalicAngle < 0) {
+ m_Flags |= PDFFONT_ITALIC;
+ m_ItalicAngle = ItalicAngle;
+ }
+ FX_BOOL bExistStemV = FALSE;
+ if (pFontDesc->KeyExist(FX_BSTRC("StemV"))) {
+ m_StemV = pFontDesc->GetInteger(FX_BSTRC("StemV"));
+ bExistStemV = TRUE;
+ }
+ FX_BOOL bExistAscent = FALSE;
+ if (pFontDesc->KeyExist(FX_BSTRC("Ascent"))) {
+ m_Ascent = pFontDesc->GetInteger(FX_BSTRC("Ascent"));
+ bExistAscent = TRUE;
+ }
+ FX_BOOL bExistDescent = FALSE;
+ if (pFontDesc->KeyExist(FX_BSTRC("Descent"))) {
+ m_Descent = pFontDesc->GetInteger(FX_BSTRC("Descent"));
+ bExistDescent = TRUE;
+ }
+ FX_BOOL bExistCapHeight = FALSE;
+ if (pFontDesc->KeyExist(FX_BSTRC("CapHeight"))) {
+ bExistCapHeight = TRUE;
+ }
+ if (bExistItalicAngle && bExistAscent && bExistCapHeight && bExistDescent && bExistStemV) {
+ m_Flags |= PDFFONT_USEEXTERNATTR;
+ }
+ if (m_Descent > 10) {
+ m_Descent = -m_Descent;
+ }
+ CPDF_Array* pBBox = pFontDesc->GetArray(FX_BSTRC("FontBBox"));
+ if (pBBox) {
+ m_FontBBox.left = pBBox->GetInteger(0);
+ m_FontBBox.bottom = pBBox->GetInteger(1);
+ m_FontBBox.right = pBBox->GetInteger(2);
+ m_FontBBox.top = pBBox->GetInteger(3);
+ }
+ CPDF_Stream* pFontFile = pFontDesc->GetStream(FX_BSTRC("FontFile"));
+ if (pFontFile == NULL) {
+ pFontFile = pFontDesc->GetStream(FX_BSTRC("FontFile2"));
+ }
+ if (pFontFile == NULL) {
+ pFontFile = pFontDesc->GetStream(FX_BSTRC("FontFile3"));
+ }
+ if (pFontFile) {
+ m_pFontFile = m_pDocument->LoadFontFile(pFontFile);
+ if (m_pFontFile == NULL) {
+ return;
+ }
+ FX_LPCBYTE pFontData = m_pFontFile->GetData();
+ FX_DWORD dwFontSize = m_pFontFile->GetSize();
+ m_Font.LoadEmbedded(pFontData, dwFontSize);
+ if (m_Font.m_Face == NULL) {
+ m_pFontFile = NULL;
+ }
+ }
+}
+short TT2PDF(int m, FXFT_Face face)
+{
+ int upm = FXFT_Get_Face_UnitsPerEM(face);
+ if (upm == 0) {
+ return (short)m;
+ }
+ return (m * 1000 + upm / 2) / upm;
+}
+void CPDF_Font::CheckFontMetrics()
+{
+ if (m_FontBBox.top == 0 && m_FontBBox.bottom == 0 && m_FontBBox.left == 0 && m_FontBBox.right == 0) {
+ if (m_Font.m_Face) {
+ m_FontBBox.left = TT2PDF(FXFT_Get_Face_xMin(m_Font.m_Face), m_Font.m_Face);
+ m_FontBBox.bottom = TT2PDF(FXFT_Get_Face_yMin(m_Font.m_Face), m_Font.m_Face);
+ m_FontBBox.right = TT2PDF(FXFT_Get_Face_xMax(m_Font.m_Face), m_Font.m_Face);
+ m_FontBBox.top = TT2PDF(FXFT_Get_Face_yMax(m_Font.m_Face), m_Font.m_Face);
+ m_Ascent = TT2PDF(FXFT_Get_Face_Ascender(m_Font.m_Face), m_Font.m_Face);
+ m_Descent = TT2PDF(FXFT_Get_Face_Descender(m_Font.m_Face), m_Font.m_Face);
+ } else {
+ FX_BOOL bFirst = TRUE;
+ for (int i = 0; i < 256; i ++) {
+ FX_RECT rect;
+ GetCharBBox(i, rect);
+ if (rect.left == rect.right) {
+ continue;
+ }
+ if (bFirst) {
+ m_FontBBox = rect;
+ bFirst = FALSE;
+ } else {
+ if (m_FontBBox.top < rect.top) {
+ m_FontBBox.top = rect.top;
+ }
+ if (m_FontBBox.right < rect.right) {
+ m_FontBBox.right = rect.right;
+ }
+ if (m_FontBBox.left > rect.left) {
+ m_FontBBox.left = rect.left;
+ }
+ if (m_FontBBox.bottom > rect.bottom) {
+ m_FontBBox.bottom = rect.bottom;
+ }
+ }
+ }
+ }
+ }
+ if (m_Ascent == 0 && m_Descent == 0) {
+ FX_RECT rect;
+ GetCharBBox('A', rect);
+ if (rect.bottom == rect.top) {
+ m_Ascent = m_FontBBox.top;
+ } else {
+ m_Ascent = rect.top;
+ }
+ GetCharBBox('g', rect);
+ if (rect.bottom == rect.top) {
+ m_Descent = m_FontBBox.bottom;
+ } else {
+ m_Descent = rect.bottom;
+ }
+ }
+}
+void CPDF_Font::LoadUnicodeMap()
+{
+ m_bToUnicodeLoaded = TRUE;
+ CPDF_Stream* pStream = m_pFontDict->GetStream(FX_BSTRC("ToUnicode"));
+ if (pStream == NULL) {
+ return;
+ }
+ m_pToUnicodeMap = FX_NEW CPDF_ToUnicodeMap;
+ m_pToUnicodeMap->Load(pStream);
+}
+int CPDF_Font::GetStringWidth(FX_LPCSTR pString, int size)
+{
+ int offset = 0;
+ int width = 0;
+ while (offset < size) {
+ FX_DWORD charcode = GetNextChar(pString, offset);
+ width += GetCharWidthF(charcode);
+ }
+ return width;
+}
+int CPDF_Font::GetCharTypeWidth(FX_DWORD charcode)
+{
+ if (m_Font.m_Face == NULL) {
+ return 0;
+ }
+ int glyph_index = GlyphFromCharCode(charcode);
+ if (glyph_index == 0xffff) {
+ return 0;
+ }
+ return m_Font.GetGlyphWidth(glyph_index);
+}
+int _PDF_GetStandardFontName(CFX_ByteString& name);
+CPDF_Font* CPDF_Font::GetStockFont(CPDF_Document* pDoc, FX_BSTR name)
+{
+ CFX_ByteString fontname(name);
+ int font_id = _PDF_GetStandardFontName(fontname);
+ if (font_id < 0) {
+ return NULL;
+ }
+ CPDF_FontGlobals* pFontGlobals = CPDF_ModuleMgr::Get()->GetPageModule()->GetFontGlobals();
+ CPDF_Font* pFont = pFontGlobals->Find(pDoc, font_id);
+ if (pFont) {
+ return pFont;
+ }
+ CPDF_Dictionary* pDict = CPDF_Dictionary::Create();
+ pDict->SetAtName(FX_BSTRC("Type"), FX_BSTRC("Font"));
+ pDict->SetAtName(FX_BSTRC("Subtype"), FX_BSTRC("Type1"));
+ pDict->SetAtName(FX_BSTRC("BaseFont"), fontname);
+ pDict->SetAtName(FX_BSTRC("Encoding"), FX_BSTRC("WinAnsiEncoding"));
+ pFont = CPDF_Font::CreateFontF(NULL, pDict);
+ pFontGlobals->Set(pDoc, font_id, pFont);
+ return pFont;
+}
+const FX_BYTE ChineseFontNames[][5] = {
+ {0xCB, 0xCE, 0xCC, 0xE5, 0x00},
+ {0xBF, 0xAC, 0xCC, 0xE5, 0x00},
+ {0xBA, 0xDA, 0xCC, 0xE5, 0x00},
+ {0xB7, 0xC2, 0xCB, 0xCE, 0x00},
+ {0xD0, 0xC2, 0xCB, 0xCE, 0x00}
+};
+CPDF_Font* CPDF_Font::CreateFontF(CPDF_Document* pDoc, CPDF_Dictionary* pFontDict)
+{
+ CFX_ByteString type = pFontDict->GetString(FX_BSTRC("Subtype"));
+ CPDF_Font* pFont;
+ if (type == FX_BSTRC("TrueType")) {
+ {
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ || _FXM_PLATFORM_ == _FXM_PLATFORM_LINUX_ || _FXM_PLATFORM_ == _FXM_PLATFORM_ANDROID_ || _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+ CFX_ByteString basefont = pFontDict->GetString(FX_BSTRC("BaseFont"));
+ CFX_ByteString tag = basefont.Left(4);
+ int i;
+ int count = sizeof(ChineseFontNames) / sizeof(ChineseFontNames[0]);
+ for (i = 0; i < count; ++i) {
+ if (tag == CFX_ByteString((FX_LPCSTR)ChineseFontNames[i])) {
+ break;
+ }
+ }
+ if (i < count) {
+ CPDF_Dictionary* pFontDesc = pFontDict->GetDict(FX_BSTRC("FontDescriptor"));
+ if (pFontDesc == NULL || !pFontDesc->KeyExist(FX_BSTRC("FontFile2"))) {
+ pFont = FX_NEW CPDF_CIDFont;
+ pFont->Initialize();
+ pFont->m_FontType = PDFFONT_CIDFONT;
+ pFont->m_pFontDict = pFontDict;
+ pFont->m_pDocument = pDoc;
+ if (!pFont->Load()) {
+ delete pFont;
+ return NULL;
+ }
+ return pFont;
+ }
+ }
+#endif
+ }
+ pFont = FX_NEW CPDF_TrueTypeFont;
+ pFont->Initialize();
+ pFont->m_FontType = PDFFONT_TRUETYPE;
+ } else if (type == FX_BSTRC("Type3")) {
+ pFont = FX_NEW CPDF_Type3Font;
+ pFont->Initialize();
+ pFont->m_FontType = PDFFONT_TYPE3;
+ } else if (type == FX_BSTRC("Type0")) {
+ pFont = FX_NEW CPDF_CIDFont;
+ pFont->Initialize();
+ pFont->m_FontType = PDFFONT_CIDFONT;
+ } else {
+ pFont = FX_NEW CPDF_Type1Font;
+ pFont->Initialize();
+ pFont->m_FontType = PDFFONT_TYPE1;
+ }
+ pFont->m_pFontDict = pFontDict;
+ pFont->m_pDocument = pDoc;
+ if (!pFont->Load()) {
+ delete pFont;
+ return NULL;
+ }
+ return pFont;
+}
+FX_BOOL CPDF_Font::Load()
+{
+ if (m_pFontDict == NULL) {
+ return FALSE;
+ }
+ CFX_ByteString type = m_pFontDict->GetString(FX_BSTRC("Subtype"));
+ m_BaseFont = m_pFontDict->GetString(FX_BSTRC("BaseFont"));
+ if (type == FX_BSTRC("MMType1")) {
+ type = FX_BSTRC("Type1");
+ }
+ return _Load();
+}
+static CFX_WideString _FontMap_GetWideString(CFX_CharMap* pMap, const CFX_ByteString& bytestr)
+{
+ return ((CPDF_FontCharMap*)pMap)->m_pFont->DecodeString(bytestr);
+}
+static CFX_ByteString _FontMap_GetByteString(CFX_CharMap* pMap, const CFX_WideString& widestr)
+{
+ return ((CPDF_FontCharMap*)pMap)->m_pFont->EncodeString(widestr);
+}
+CPDF_FontCharMap::CPDF_FontCharMap(CPDF_Font* pFont)
+{
+ m_GetByteString = _FontMap_GetByteString;
+ m_GetWideString = _FontMap_GetWideString;
+ m_pFont = pFont;
+}
+CFX_WideString CPDF_ToUnicodeMap::Lookup(FX_DWORD charcode)
+{
+ FX_DWORD value;
+ if (m_Map.Lookup(charcode, value)) {
+ FX_WCHAR unicode = (FX_WCHAR)(value & 0xffff);
+ if (unicode != 0xffff) {
+ return unicode;
+ }
+ FX_LPCWSTR buf = m_MultiCharBuf.GetBuffer();
+ FX_DWORD buf_len = m_MultiCharBuf.GetLength();
+ if (buf == NULL || buf_len == 0) {
+ return CFX_WideString();
+ }
+ FX_DWORD index = value >> 16;
+ if (index >= buf_len) {
+ return CFX_WideString();
+ }
+ FX_DWORD len = buf[index];
+ if (index + len < index || index + len >= buf_len) {
+ return CFX_WideString();
+ }
+ return CFX_WideString(buf + index + 1, len);
+ }
+ if (m_pBaseMap) {
+ return m_pBaseMap->UnicodeFromCID((FX_WORD)charcode);
+ }
+ return CFX_WideString();
+}
+FX_DWORD CPDF_ToUnicodeMap::ReverseLookup(FX_WCHAR unicode)
+{
+ FX_POSITION pos = m_Map.GetStartPosition();
+ while (pos) {
+ FX_DWORD key, value;
+ m_Map.GetNextAssoc(pos, key, value);
+ if ((FX_WCHAR)value == unicode) {
+ return key;
+ }
+ }
+ return 0;
+}
+static FX_DWORD _StringToCode(FX_BSTR str)
+{
+ FX_LPCSTR buf = str.GetCStr();
+ int len = str.GetLength();
+ if (len == 0) {
+ return 0;
+ }
+ int result = 0;
+ if (buf[0] == '<') {
+ for (int i = 1; i < len; i ++) {
+ int digit;
+ if (buf[i] >= '0' && buf[i] <= '9') {
+ digit = buf[i] - '0';
+ } else if (buf[i] >= 'a' && buf[i] <= 'f') {
+ digit = buf[i] - 'a' + 10;
+ } else if (buf[i] >= 'A' && buf[i] <= 'F') {
+ digit = buf[i] - 'A' + 10;
+ } else {
+ break;
+ }
+ result = result * 16 + digit;
+ }
+ return result;
+ } else {
+ for (int i = 0; i < len; i ++) {
+ if (buf[i] < '0' || buf[i] > '9') {
+ break;
+ }
+ result = result * 10 + buf[i] - '0';
+ }
+ }
+ return result;
+}
+static CFX_WideString _StringDataAdd(CFX_WideString str)
+{
+ CFX_WideString ret;
+ int len = str.GetLength();
+ FX_WCHAR value = 1;
+ for (int i = len - 1; i >= 0 ; --i) {
+ FX_WCHAR ch = str[i] + value;
+ if (ch < str[i]) {
+ ret.Insert(0, 0);
+ } else {
+ ret.Insert(0, ch);
+ value = 0;
+ }
+ }
+ if (value) {
+ ret.Insert(0, value);
+ }
+ return ret;
+}
+static CFX_WideString _StringToWideString(FX_BSTR str)
+{
+ FX_LPCSTR buf = str.GetCStr();
+ int len = str.GetLength();
+ if (len == 0) {
+ return CFX_WideString();
+ }
+ CFX_WideString result;
+ if (buf[0] == '<') {
+ int byte_pos = 0;
+ FX_WCHAR ch = 0;
+ for (int i = 1; i < len; i ++) {
+ int digit;
+ if (buf[i] >= '0' && buf[i] <= '9') {
+ digit = buf[i] - '0';
+ } else if (buf[i] >= 'a' && buf[i] <= 'f') {
+ digit = buf[i] - 'a' + 10;
+ } else if (buf[i] >= 'A' && buf[i] <= 'F') {
+ digit = buf[i] - 'A' + 10;
+ } else {
+ break;
+ }
+ ch = ch * 16 + digit;
+ byte_pos ++;
+ if (byte_pos == 4) {
+ result += ch;
+ byte_pos = 0;
+ ch = 0;
+ }
+ }
+ return result;
+ }
+ if (buf[0] == '(') {
+ }
+ return result;
+}
+void CPDF_ToUnicodeMap::Load(CPDF_Stream* pStream)
+{
+ int CIDSet = 0;
+ CPDF_StreamAcc stream;
+ stream.LoadAllData(pStream, FALSE);
+ CPDF_SimpleParser parser(stream.GetData(), stream.GetSize());
+ m_Map.EstimateSize(stream.GetSize() / 8, 1024);
+ while (1) {
+ CFX_ByteStringC word = parser.GetWord();
+ if (word.IsEmpty()) {
+ break;
+ }
+ if (word == FX_BSTRC("beginbfchar")) {
+ while (1) {
+ word = parser.GetWord();
+ if (word.IsEmpty() || word == FX_BSTRC("endbfchar")) {
+ break;
+ }
+ FX_DWORD srccode = _StringToCode(word);
+ word = parser.GetWord();
+ CFX_WideString destcode = _StringToWideString(word);
+ int len = destcode.GetLength();
+ if (len == 0) {
+ continue;
+ }
+ if (len == 1) {
+ m_Map.SetAt(srccode, destcode.GetAt(0));
+ } else {
+ m_Map.SetAt(srccode, m_MultiCharBuf.GetLength() * 0x10000 + 0xffff);
+ m_MultiCharBuf.AppendChar(destcode.GetLength());
+ m_MultiCharBuf << destcode;
+ }
+ }
+ } else if (word == FX_BSTRC("beginbfrange")) {
+ while (1) {
+ CFX_ByteString low, high;
+ low = parser.GetWord();
+ if (low.IsEmpty() || low == FX_BSTRC("endbfrange")) {
+ break;
+ }
+ high = parser.GetWord();
+ FX_DWORD lowcode = _StringToCode(low);
+ FX_DWORD highcode = (lowcode & 0xffffff00) | (_StringToCode(high) & 0xff);
+ if (highcode == (FX_DWORD) - 1) {
+ break;
+ }
+ CFX_ByteString start = parser.GetWord();
+ if (start == FX_BSTRC("[")) {
+ for (FX_DWORD code = lowcode; code <= highcode; code ++) {
+ CFX_ByteString dest = parser.GetWord();
+ CFX_WideString destcode = _StringToWideString(dest);
+ int len = destcode.GetLength();
+ if (len == 0) {
+ continue;
+ }
+ if (len == 1) {
+ m_Map.SetAt(code, destcode.GetAt(0));
+ } else {
+ m_Map.SetAt(code, m_MultiCharBuf.GetLength() * 0x10000 + 0xffff);
+ m_MultiCharBuf.AppendChar(destcode.GetLength());
+ m_MultiCharBuf << destcode;
+ }
+ }
+ parser.GetWord();
+ } else {
+ CFX_WideString destcode = _StringToWideString(start);
+ int len = destcode.GetLength();
+ FX_DWORD value = 0;
+ if (len == 1) {
+ value = _StringToCode(start);
+ for (FX_DWORD code = lowcode; code <= highcode; code ++) {
+ m_Map.SetAt(code, value++);
+ }
+ } else {
+ for (FX_DWORD code = lowcode; code <= highcode; code ++) {
+ CFX_WideString retcode;
+ if (code == lowcode) {
+ retcode = destcode;
+ } else {
+ retcode = _StringDataAdd(destcode);
+ }
+ m_Map.SetAt(code, m_MultiCharBuf.GetLength() * 0x10000 + 0xffff);
+ m_MultiCharBuf.AppendChar(retcode.GetLength());
+ m_MultiCharBuf << retcode;
+ destcode = retcode;
+ }
+ }
+ }
+ }
+ } else if (word == FX_BSTRC("/Adobe-Korea1-UCS2")) {
+ CIDSet = CIDSET_KOREA1;
+ } else if (word == FX_BSTRC("/Adobe-Japan1-UCS2")) {
+ CIDSet = CIDSET_JAPAN1;
+ } else if (word == FX_BSTRC("/Adobe-CNS1-UCS2")) {
+ CIDSet = CIDSET_CNS1;
+ } else if (word == FX_BSTRC("/Adobe-GB1-UCS2")) {
+ CIDSet = CIDSET_GB1;
+ }
+ }
+ if (CIDSet) {
+ m_pBaseMap = CPDF_ModuleMgr::Get()->GetPageModule()->GetFontGlobals()->m_CMapManager.GetCID2UnicodeMap(CIDSet, FALSE);
+ } else {
+ m_pBaseMap = NULL;
+ }
+}
+static FX_BOOL GetPredefinedEncoding(int& basemap, const CFX_ByteString& value)
+{
+ if (value == FX_BSTRC("WinAnsiEncoding")) {
+ basemap = PDFFONT_ENCODING_WINANSI;
+ } else if (value == FX_BSTRC("MacRomanEncoding")) {
+ basemap = PDFFONT_ENCODING_MACROMAN;
+ } else if (value == FX_BSTRC("MacExpertEncoding")) {
+ basemap = PDFFONT_ENCODING_MACEXPERT;
+ } else if (value == FX_BSTRC("PDFDocEncoding")) {
+ basemap = PDFFONT_ENCODING_PDFDOC;
+ } else {
+ return FALSE;
+ }
+ return TRUE;
+}
+void CPDF_Font::LoadPDFEncoding(CPDF_Object* pEncoding, int& iBaseEncoding, CFX_ByteString*& pCharNames,
+ FX_BOOL bEmbedded, FX_BOOL bTrueType)
+{
+ if (pEncoding == NULL) {
+ if (m_BaseFont == FX_BSTRC("Symbol")) {
+ iBaseEncoding = bTrueType ? PDFFONT_ENCODING_MS_SYMBOL : PDFFONT_ENCODING_ADOBE_SYMBOL;
+ } else if (!bEmbedded && iBaseEncoding == PDFFONT_ENCODING_BUILTIN) {
+ iBaseEncoding = PDFFONT_ENCODING_WINANSI;
+ }
+ return;
+ }
+ if (pEncoding->GetType() == PDFOBJ_NAME) {
+ if (iBaseEncoding == PDFFONT_ENCODING_ADOBE_SYMBOL || iBaseEncoding == PDFFONT_ENCODING_ZAPFDINGBATS) {
+ return;
+ }
+ if ((m_Flags & PDFFONT_SYMBOLIC) && m_BaseFont == FX_BSTRC("Symbol")) {
+ if (!bTrueType) {
+ iBaseEncoding = PDFFONT_ENCODING_ADOBE_SYMBOL;
+ }
+ return;
+ }
+ CFX_ByteString bsEncoding = pEncoding->GetString();
+ if (bsEncoding.Compare(FX_BSTRC("MacExpertEncoding")) == 0) {
+ bsEncoding = FX_BSTRC("WinAnsiEncoding");
+ }
+ GetPredefinedEncoding(iBaseEncoding, bsEncoding);
+ return;
+ }
+ if (pEncoding->GetType() != PDFOBJ_DICTIONARY) {
+ return;
+ }
+ CPDF_Dictionary* pDict = (CPDF_Dictionary*)pEncoding;
+ if (iBaseEncoding != PDFFONT_ENCODING_ADOBE_SYMBOL && iBaseEncoding != PDFFONT_ENCODING_ZAPFDINGBATS) {
+ CFX_ByteString bsEncoding = pDict->GetString(FX_BSTRC("BaseEncoding"));
+ if (bsEncoding.Compare(FX_BSTRC("MacExpertEncoding")) == 0 && bTrueType) {
+ bsEncoding = FX_BSTRC("WinAnsiEncoding");
+ }
+ GetPredefinedEncoding(iBaseEncoding, bsEncoding);
+ }
+ if ((!bEmbedded || bTrueType) && iBaseEncoding == PDFFONT_ENCODING_BUILTIN) {
+ iBaseEncoding = PDFFONT_ENCODING_STANDARD;
+ }
+ CPDF_Array* pDiffs = pDict->GetArray(FX_BSTRC("Differences"));
+ if (pDiffs == NULL) {
+ return;
+ }
+ FX_NEW_VECTOR(pCharNames, CFX_ByteString, 256);
+ FX_DWORD cur_code = 0;
+ for (FX_DWORD i = 0; i < pDiffs->GetCount(); i ++) {
+ CPDF_Object* pElement = pDiffs->GetElementValue(i);
+ if (pElement == NULL) {
+ continue;
+ }
+ if (pElement->GetType() == PDFOBJ_NAME) {
+ if (cur_code < 256) {
+ pCharNames[cur_code] = ((CPDF_Name*)pElement)->GetString();
+ }
+ cur_code ++;
+ } else {
+ cur_code = pElement->GetInteger();
+ }
+ }
+}
+FX_BOOL CPDF_Font::IsStandardFont() const
+{
+ if (m_FontType != PDFFONT_TYPE1) {
+ return FALSE;
+ }
+ if (m_pFontFile != NULL) {
+ return FALSE;
+ }
+ if (((CPDF_Type1Font*)this)->GetBase14Font() < 0) {
+ return FALSE;
+ }
+ return TRUE;
+}
+extern FX_LPCSTR PDF_CharNameFromPredefinedCharSet(int encoding, FX_BYTE charcode);
+CPDF_SimpleFont::CPDF_SimpleFont()
+{
+ FXSYS_memset8(m_CharBBox, 0xff, sizeof m_CharBBox);
+ FXSYS_memset8(m_CharWidth, 0xff, sizeof m_CharWidth);
+ FXSYS_memset8(m_GlyphIndex, 0xff, sizeof m_GlyphIndex);
+ FXSYS_memset8(m_ExtGID, 0xff, sizeof m_ExtGID);
+ m_pCharNames = NULL;
+ m_BaseEncoding = PDFFONT_ENCODING_BUILTIN;
+}
+CPDF_SimpleFont::~CPDF_SimpleFont()
+{
+ if (m_pCharNames) {
+ FX_DELETE_VECTOR(m_pCharNames, CFX_ByteString, 256);
+ }
+}
+int CPDF_SimpleFont::GlyphFromCharCode(FX_DWORD charcode, FX_BOOL *pVertGlyph)
+{
+ if (pVertGlyph) {
+ *pVertGlyph = FALSE;
+ }
+ if (charcode > 0xff) {
+ return -1;
+ }
+ int index = m_GlyphIndex[(FX_BYTE)charcode];
+ if (index == 0xffff) {
+ return -1;
+ }
+ return index;
+}
+void CPDF_SimpleFont::LoadCharMetrics(int charcode)
+{
+ if (m_Font.m_Face == NULL) {
+ return;
+ }
+ if (charcode < 0 || charcode > 0xff) {
+ return;
+ }
+ int glyph_index = m_GlyphIndex[charcode];
+ if (glyph_index == 0xffff) {
+ if (m_pFontFile == NULL && charcode != 32) {
+ LoadCharMetrics(32);
+ m_CharBBox[charcode] = m_CharBBox[32];
+ if (m_bUseFontWidth) {
+ m_CharWidth[charcode] = m_CharWidth[32];
+ }
+ }
+ return;
+ }
+ int err = FXFT_Load_Glyph(m_Font.m_Face, glyph_index, FXFT_LOAD_NO_SCALE | FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH);
+ if (err) {
+ return;
+ }
+ m_CharBBox[charcode].Left = TT2PDF(FXFT_Get_Glyph_HoriBearingX(m_Font.m_Face), m_Font.m_Face);
+ m_CharBBox[charcode].Right = TT2PDF(FXFT_Get_Glyph_HoriBearingX(m_Font.m_Face) + FXFT_Get_Glyph_Width(m_Font.m_Face), m_Font.m_Face);
+ m_CharBBox[charcode].Top = TT2PDF(FXFT_Get_Glyph_HoriBearingY(m_Font.m_Face), m_Font.m_Face);
+ m_CharBBox[charcode].Bottom = TT2PDF(FXFT_Get_Glyph_HoriBearingY(m_Font.m_Face) - FXFT_Get_Glyph_Height(m_Font.m_Face), m_Font.m_Face);
+ if (m_bUseFontWidth) {
+ int TT_Width = TT2PDF(FXFT_Get_Glyph_HoriAdvance(m_Font.m_Face), m_Font.m_Face);
+ if (m_CharWidth[charcode] == 0xffff) {
+ m_CharWidth[charcode] = TT_Width;
+ } else if (TT_Width && !IsEmbedded()) {
+ m_CharBBox[charcode].Right = m_CharBBox[charcode].Right * m_CharWidth[charcode] / TT_Width;
+ m_CharBBox[charcode].Left = m_CharBBox[charcode].Left * m_CharWidth[charcode] / TT_Width;
+ }
+ }
+}
+int CPDF_SimpleFont::GetCharWidthF(FX_DWORD charcode, int level)
+{
+ if (charcode > 0xff) {
+ charcode = 0;
+ }
+ if (m_CharWidth[charcode] == 0xffff) {
+ LoadCharMetrics(charcode);
+ if (m_CharWidth[charcode] == 0xffff) {
+ m_CharWidth[charcode] = 0;
+ }
+ }
+ return (FX_INT16)m_CharWidth[charcode];
+}
+void CPDF_SimpleFont::GetCharBBox(FX_DWORD charcode, FX_RECT& rect, int level)
+{
+ if (charcode > 0xff) {
+ charcode = 0;
+ }
+ if (m_CharBBox[charcode].Left == (FX_SHORT)0xffff) {
+ LoadCharMetrics(charcode);
+ }
+ rect.left = m_CharBBox[charcode].Left;
+ rect.right = m_CharBBox[charcode].Right;
+ rect.bottom = m_CharBBox[charcode].Bottom;
+ rect.top = m_CharBBox[charcode].Top;
+}
+FX_LPCSTR GetAdobeCharName(int iBaseEncoding, const CFX_ByteString* pCharNames, int charcode)
+{
+ ASSERT(charcode >= 0 && charcode < 256);
+ if (charcode < 0 || charcode >= 256) {
+ return NULL;
+ }
+ FX_LPCSTR name = NULL;
+ if (pCharNames) {
+ name = pCharNames[charcode];
+ }
+ if ((name == NULL || name[0] == 0) && iBaseEncoding) {
+ name = PDF_CharNameFromPredefinedCharSet(iBaseEncoding, charcode);
+ }
+ if (name == NULL || name[0] == 0) {
+ return NULL;
+ }
+ return name;
+}
+FX_BOOL CPDF_SimpleFont::LoadCommon()
+{
+ CPDF_Dictionary* pFontDesc = m_pFontDict->GetDict(FX_BSTRC("FontDescriptor"));
+ if (pFontDesc) {
+ LoadFontDescriptor(pFontDesc);
+ }
+ CPDF_Array* pWidthArray = m_pFontDict->GetArray(FX_BSTRC("Widths"));
+ int width_start = 0, width_end = -1;
+ m_bUseFontWidth = TRUE;
+ if (pWidthArray) {
+ m_bUseFontWidth = FALSE;
+ if (pFontDesc && pFontDesc->KeyExist(FX_BSTRC("MissingWidth"))) {
+ int MissingWidth = pFontDesc->GetInteger(FX_BSTRC("MissingWidth"));
+ for (int i = 0; i < 256; i ++) {
+ m_CharWidth[i] = MissingWidth;
+ }
+ }
+ width_start = m_pFontDict->GetInteger(FX_BSTRC("FirstChar"), 0);
+ width_end = m_pFontDict->GetInteger(FX_BSTRC("LastChar"), 0);
+ if (width_start >= 0 && width_start <= 255) {
+ if (width_end <= 0 || width_end >= width_start + (int)pWidthArray->GetCount()) {
+ width_end = width_start + pWidthArray->GetCount() - 1;
+ }
+ if (width_end > 255) {
+ width_end = 255;
+ }
+ for (int i = width_start; i <= width_end; i ++) {
+ m_CharWidth[i] = pWidthArray->GetInteger(i - width_start);
+ }
+ }
+ }
+ if (m_pFontFile == NULL) {
+ LoadSubstFont();
+ } else {
+ if (m_BaseFont.GetLength() > 8 && m_BaseFont[7] == '+') {
+ m_BaseFont = m_BaseFont.Mid(8);
+ }
+ }
+ if (!(m_Flags & PDFFONT_SYMBOLIC)) {
+ m_BaseEncoding = PDFFONT_ENCODING_STANDARD;
+ }
+ CPDF_Object* pEncoding = m_pFontDict->GetElementValue(FX_BSTRC("Encoding"));
+ LoadPDFEncoding(pEncoding, m_BaseEncoding, m_pCharNames, m_pFontFile != NULL, m_Font.IsTTFont());
+ LoadGlyphMap();
+ if (m_pCharNames) {
+ FX_DELETE_VECTOR(m_pCharNames, CFX_ByteString, 256);
+ m_pCharNames = NULL;
+ }
+ if (m_Font.m_Face == NULL) {
+ return TRUE;
+ }
+ if (m_Flags & PDFFONT_ALLCAP) {
+ unsigned char lowercases[] = {'a', 'z', 0xe0, 0xf6, 0xf8, 0xfd};
+ for (int range = 0; range < sizeof lowercases / 2; range ++) {
+ for (int i = lowercases[range * 2]; i <= lowercases[range * 2 + 1]; i ++) {
+ if (m_GlyphIndex[i] != 0xffff && m_pFontFile != NULL) {
+ continue;
+ }
+ m_GlyphIndex[i] = m_GlyphIndex[i - 32];
+ if (m_CharWidth[i - 32]) {
+ m_CharWidth[i] = m_CharWidth[i - 32];
+ m_CharBBox[i] = m_CharBBox[i - 32];
+ }
+ }
+ }
+ }
+ CheckFontMetrics();
+ return TRUE;
+}
+void CPDF_SimpleFont::LoadSubstFont()
+{
+ if (!m_bUseFontWidth && !(m_Flags & PDFFONT_FIXEDPITCH)) {
+ int width = 0, i;
+ for (i = 0; i < 256; i ++) {
+ if (m_CharWidth[i] == 0 || m_CharWidth[i] == 0xffff) {
+ continue;
+ }
+ if (width == 0) {
+ width = m_CharWidth[i];
+ } else if (width != m_CharWidth[i]) {
+ break;
+ }
+ }
+ if (i == 256 && width) {
+ m_Flags |= PDFFONT_FIXEDPITCH;
+ }
+ }
+ int weight = m_StemV < 140 ? m_StemV * 5 : (m_StemV * 4 + 140);
+ m_Font.LoadSubst(m_BaseFont, m_FontType == PDFFONT_TRUETYPE, m_Flags, weight, m_ItalicAngle, 0);
+ if (m_Font.m_pSubstFont->m_SubstFlags & FXFONT_SUBST_NONSYMBOL) {
+ }
+}
+FX_BOOL CPDF_SimpleFont::IsUnicodeCompatible() const
+{
+ return m_BaseEncoding != PDFFONT_ENCODING_BUILTIN && m_BaseEncoding != PDFFONT_ENCODING_ADOBE_SYMBOL &&
+ m_BaseEncoding != PDFFONT_ENCODING_ZAPFDINGBATS;
+}
+CPDF_Type1Font::CPDF_Type1Font()
+{
+ m_Base14Font = -1;
+}
+FX_BOOL CPDF_Type1Font::_Load()
+{
+ m_Base14Font = _PDF_GetStandardFontName(m_BaseFont);
+ if (m_Base14Font >= 0) {
+ CPDF_Dictionary* pFontDesc = m_pFontDict->GetDict(FX_BSTRC("FontDescriptor"));
+ if (pFontDesc && pFontDesc->KeyExist(FX_BSTRC("Flags"))) {
+ m_Flags = pFontDesc->GetInteger(FX_BSTRC("Flags"));
+ } else {
+ m_Flags = m_Base14Font >= 12 ? PDFFONT_SYMBOLIC : PDFFONT_NONSYMBOLIC;
+ }
+ if (m_Base14Font < 4)
+ for (int i = 0; i < 256; i ++) {
+ m_CharWidth[i] = 600;
+ }
+ if (m_Base14Font == 12) {
+ m_BaseEncoding = PDFFONT_ENCODING_ADOBE_SYMBOL;
+ } else if (m_Base14Font == 13) {
+ m_BaseEncoding = PDFFONT_ENCODING_ZAPFDINGBATS;
+ } else if (m_Flags & PDFFONT_NONSYMBOLIC) {
+ m_BaseEncoding = PDFFONT_ENCODING_STANDARD;
+ }
+ }
+ return LoadCommon();
+}
+static FX_BOOL FT_UseType1Charmap(FXFT_Face face)
+{
+ if (FXFT_Get_Face_CharmapCount(face) == 0) {
+ return FALSE;
+ }
+ if (FXFT_Get_Face_CharmapCount(face) == 1 &&
+ FXFT_Get_Charmap_Encoding(FXFT_Get_Face_Charmaps(face)[0]) == FXFT_ENCODING_UNICODE) {
+ return FALSE;
+ }
+ if (FXFT_Get_Charmap_Encoding(FXFT_Get_Face_Charmaps(face)[0]) == FXFT_ENCODING_UNICODE) {
+ FXFT_Set_Charmap(face, FXFT_Get_Face_Charmaps(face)[1]);
+ } else {
+ FXFT_Set_Charmap(face, FXFT_Get_Face_Charmaps(face)[0]);
+ }
+ return TRUE;
+}
+extern FX_WCHAR FT_UnicodeFromCharCode(int encoding, FX_DWORD charcode);
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+#include "../../fxge/apple/apple_int.h"
+#endif
+int CPDF_Type1Font::GlyphFromCharCodeExt(FX_DWORD charcode)
+{
+ if (charcode > 0xff) {
+ return -1;
+ }
+ int index = m_ExtGID[(FX_BYTE)charcode];
+ if (index == 0xffff) {
+ return -1;
+ }
+ return index;
+}
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+struct _GlyphNameMap {
+ FX_LPCSTR m_pStrAdobe;
+ FX_LPCSTR m_pStrUnicode;
+};
+static const _GlyphNameMap g_GlyphNameSubsts[] = {
+ {"ff", "uniFB00"},
+ {"fi", "uniFB01"},
+ {"fl", "uniFB02"},
+ {"ffi", "uniFB03"},
+ {"ffl", "uniFB04"}
+};
+extern "C" {
+ static int compareString(const void* key, const void* element)
+ {
+ return FXSYS_stricmp((FX_LPCSTR)key, ((_GlyphNameMap*)element)->m_pStrAdobe);
+ }
+}
+static FX_LPCSTR _GlyphNameRemap(FX_LPCSTR pStrAdobe)
+{
+ _GlyphNameMap* found = (_GlyphNameMap*)FXSYS_bsearch(pStrAdobe, g_GlyphNameSubsts,
+ sizeof g_GlyphNameSubsts / sizeof(_GlyphNameMap), sizeof(_GlyphNameMap),
+ compareString);
+ if (found) {
+ return found->m_pStrUnicode;
+ }
+ return NULL;
+}
+#endif
+void CPDF_Type1Font::LoadGlyphMap()
+{
+ if (m_Font.m_Face == NULL) {
+ return;
+ }
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+ FX_BOOL bCoreText = TRUE;
+ CQuartz2D & quartz2d = ((CApplePlatform *) CFX_GEModule::Get()->GetPlatformData())->_quartz2d;
+ if (!m_Font.m_pPlatformFont) {
+ if (m_Font.GetPsName() == CFX_WideString::FromLocal("DFHeiStd-W5")) {
+ bCoreText = FALSE;
+ }
+ m_Font.m_pPlatformFont = quartz2d.CreateFont(m_Font.m_pFontData, m_Font.m_dwSize);
+ if (NULL == m_Font.m_pPlatformFont) {
+ bCoreText = FALSE;
+ }
+ }
+#endif
+ if (!IsEmbedded() && (m_Base14Font < 12) && m_Font.IsTTFont()) {
+ if (FT_UseTTCharmap(m_Font.m_Face, 3, 0)) {
+ FX_BOOL bGotOne = FALSE;
+ for (int charcode = 0; charcode < 256; charcode ++) {
+ const FX_BYTE prefix[4] = {0x00, 0xf0, 0xf1, 0xf2};
+ for (int j = 0; j < 4; j ++) {
+ FX_WORD unicode = prefix[j] * 256 + charcode;
+ m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, unicode);
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+ FX_CHAR name_glyph[256];
+ FXFT_Get_Glyph_Name(m_Font.m_Face, m_GlyphIndex[charcode], name_glyph, 256);
+ name_glyph[255] = 0;
+ CFStringRef name_ct = CFStringCreateWithCStringNoCopy(kCFAllocatorDefault, name_glyph, kCFStringEncodingASCII, kCFAllocatorNull);
+ m_ExtGID[charcode] = CGFontGetGlyphWithGlyphName((CGFontRef)m_Font.m_pPlatformFont, name_ct);
+ if (name_ct) {
+ CFRelease(name_ct);
+ }
+#endif
+ if (m_GlyphIndex[charcode]) {
+ bGotOne = TRUE;
+ break;
+ }
+ }
+ }
+ if (bGotOne) {
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+ if (!bCoreText) {
+ FXSYS_memcpy32(m_ExtGID, m_GlyphIndex, 256);
+ }
+#endif
+ return;
+ }
+ }
+ FXFT_Select_Charmap(m_Font.m_Face, FXFT_ENCODING_UNICODE);
+ if (m_BaseEncoding == 0) {
+ m_BaseEncoding = PDFFONT_ENCODING_STANDARD;
+ }
+ for (int charcode = 0; charcode < 256; charcode ++) {
+ FX_LPCSTR name = GetAdobeCharName(m_BaseEncoding, m_pCharNames, charcode);
+ if (name == NULL) {
+ continue;
+ }
+ m_Encoding.m_Unicodes[charcode] = PDF_UnicodeFromAdobeName(name);
+ m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, m_Encoding.m_Unicodes[charcode]);
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+ FX_CHAR name_glyph[256];
+ FXFT_Get_Glyph_Name(m_Font.m_Face, m_GlyphIndex[charcode], name_glyph, 256);
+ name_glyph[255] = 0;
+ CFStringRef name_ct = CFStringCreateWithCStringNoCopy(kCFAllocatorDefault, name_glyph, kCFStringEncodingASCII, kCFAllocatorNull);
+ m_ExtGID[charcode] = CGFontGetGlyphWithGlyphName((CGFontRef)m_Font.m_pPlatformFont, name_ct);
+ if (name_ct) {
+ CFRelease(name_ct);
+ }
+#endif
+ if (m_GlyphIndex[charcode] == 0 && FXSYS_strcmp(name, ".notdef") == 0) {
+ m_Encoding.m_Unicodes[charcode] = 0x20;
+ m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, 0x20);
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+ FX_CHAR name_glyph[256];
+ FXFT_Get_Glyph_Name(m_Font.m_Face, m_GlyphIndex[charcode], name_glyph, 256);
+ name_glyph[255] = 0;
+ CFStringRef name_ct = CFStringCreateWithCStringNoCopy(kCFAllocatorDefault, name_glyph, kCFStringEncodingASCII, kCFAllocatorNull);
+ m_ExtGID[charcode] = CGFontGetGlyphWithGlyphName((CGFontRef)m_Font.m_pPlatformFont, name_ct);
+ if (name_ct) {
+ CFRelease(name_ct);
+ }
+#endif
+ }
+ }
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+ if (!bCoreText) {
+ FXSYS_memcpy32(m_ExtGID, m_GlyphIndex, 256);
+ }
+#endif
+ return;
+ }
+ FT_UseType1Charmap(m_Font.m_Face);
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+ if (bCoreText) {
+ if (m_Flags & PDFFONT_SYMBOLIC) {
+ for (int charcode = 0; charcode < 256; charcode ++) {
+ FX_LPCSTR name = GetAdobeCharName(m_BaseEncoding, m_pCharNames, charcode);
+ if (name) {
+ m_Encoding.m_Unicodes[charcode] = PDF_UnicodeFromAdobeName(name);
+ m_GlyphIndex[charcode] = FXFT_Get_Name_Index(m_Font.m_Face, (char*)name);
+ CFStringRef name_ct = CFStringCreateWithCStringNoCopy(kCFAllocatorDefault, name, kCFStringEncodingASCII, kCFAllocatorNull);
+ m_ExtGID[charcode] = CGFontGetGlyphWithGlyphName((CGFontRef)m_Font.m_pPlatformFont, name_ct);
+ if (name_ct) {
+ CFRelease(name_ct);
+ }
+ } else {
+ m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, charcode);
+ FX_WCHAR unicode = 0;
+ if (m_GlyphIndex[charcode]) {
+ unicode = FT_UnicodeFromCharCode(PDFFONT_ENCODING_STANDARD, charcode);
+ }
+ FX_CHAR name_glyph[256];
+ FXSYS_memset32(name_glyph, 0, sizeof(name_glyph));
+ FXFT_Get_Glyph_Name(m_Font.m_Face, m_GlyphIndex[charcode], name_glyph, 256);
+ name_glyph[255] = 0;
+ if (unicode == 0 && name_glyph[0] != 0) {
+ unicode = PDF_UnicodeFromAdobeName(name_glyph);
+ }
+ m_Encoding.m_Unicodes[charcode] = unicode;
+ CFStringRef name_ct = CFStringCreateWithCStringNoCopy(kCFAllocatorDefault, name_glyph, kCFStringEncodingASCII, kCFAllocatorNull);
+ m_ExtGID[charcode] = CGFontGetGlyphWithGlyphName((CGFontRef)m_Font.m_pPlatformFont, name_ct);
+ if (name_ct) {
+ CFRelease(name_ct);
+ }
+ }
+ }
+ return;
+ }
+ FX_BOOL bUnicode = FALSE;
+ if (0 == FXFT_Select_Charmap(m_Font.m_Face, FXFT_ENCODING_UNICODE)) {
+ bUnicode = TRUE;
+ }
+ for (int charcode = 0; charcode < 256; charcode ++) {
+ FX_LPCSTR name = GetAdobeCharName(m_BaseEncoding, m_pCharNames, charcode);
+ if (name == NULL) {
+ continue;
+ }
+ m_Encoding.m_Unicodes[charcode] = PDF_UnicodeFromAdobeName(name);
+ FX_LPCSTR pStrUnicode = _GlyphNameRemap(name);
+ if (pStrUnicode && 0 == FXFT_Get_Name_Index(m_Font.m_Face, (char*)name)) {
+ name = pStrUnicode;
+ }
+ m_GlyphIndex[charcode] = FXFT_Get_Name_Index(m_Font.m_Face, (char*)name);
+ CFStringRef name_ct = CFStringCreateWithCStringNoCopy(kCFAllocatorDefault, name, kCFStringEncodingASCII, kCFAllocatorNull);
+ m_ExtGID[charcode] = CGFontGetGlyphWithGlyphName((CGFontRef)m_Font.m_pPlatformFont, name_ct);
+ if (name_ct) {
+ CFRelease(name_ct);
+ }
+ if (m_GlyphIndex[charcode] == 0) {
+ if (FXSYS_strcmp(name, ".notdef") != 0 && FXSYS_strcmp(name, "space") != 0) {
+ m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, bUnicode ? m_Encoding.m_Unicodes[charcode] : charcode);
+ FX_CHAR name_glyph[256];
+ FXFT_Get_Glyph_Name(m_Font.m_Face, m_GlyphIndex[charcode], name_glyph, 256);
+ name_glyph[255] = 0;
+ CFStringRef name_ct = CFStringCreateWithCStringNoCopy(kCFAllocatorDefault, name_glyph, kCFStringEncodingASCII, kCFAllocatorNull);
+ m_ExtGID[charcode] = CGFontGetGlyphWithGlyphName((CGFontRef)m_Font.m_pPlatformFont, name_ct);
+ if (name_ct) {
+ CFRelease(name_ct);
+ }
+ } else {
+ m_Encoding.m_Unicodes[charcode] = 0x20;
+ m_GlyphIndex[charcode] = bUnicode ? FXFT_Get_Char_Index(m_Font.m_Face, 0x20) : 0xffff;
+ FX_CHAR name_glyph[256];
+ FXFT_Get_Glyph_Name(m_Font.m_Face, m_GlyphIndex[charcode], name_glyph, 256);
+ name_glyph[255] = 0;
+ CFStringRef name_ct = CFStringCreateWithCStringNoCopy(kCFAllocatorDefault, name_glyph, kCFStringEncodingASCII, kCFAllocatorNull);
+ m_ExtGID[charcode] = CGFontGetGlyphWithGlyphName((CGFontRef)m_Font.m_pPlatformFont, name_ct);
+ if (name_ct) {
+ CFRelease(name_ct);
+ }
+ }
+ }
+ }
+ return;
+ }
+#endif
+ if (m_Flags & PDFFONT_SYMBOLIC) {
+ for (int charcode = 0; charcode < 256; charcode ++) {
+ FX_LPCSTR name = GetAdobeCharName(m_BaseEncoding, m_pCharNames, charcode);
+ if (name) {
+ m_Encoding.m_Unicodes[charcode] = PDF_UnicodeFromAdobeName(name);
+ m_GlyphIndex[charcode] = FXFT_Get_Name_Index(m_Font.m_Face, (char*)name);
+ } else {
+ m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, charcode);
+ if (m_GlyphIndex[charcode]) {
+ FX_WCHAR unicode = FT_UnicodeFromCharCode(PDFFONT_ENCODING_STANDARD, charcode);
+ if (unicode == 0) {
+ FX_CHAR name_glyph[256];
+ FXSYS_memset32(name_glyph, 0, sizeof(name_glyph));
+ FXFT_Get_Glyph_Name(m_Font.m_Face, m_GlyphIndex[charcode], name_glyph, 256);
+ name_glyph[255] = 0;
+ if (name_glyph[0] != 0) {
+ unicode = PDF_UnicodeFromAdobeName(name_glyph);
+ }
+ }
+ m_Encoding.m_Unicodes[charcode] = unicode;
+ }
+ }
+ }
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+ if (!bCoreText) {
+ FXSYS_memcpy32(m_ExtGID, m_GlyphIndex, 256);
+ }
+#endif
+ return;
+ }
+ FX_BOOL bUnicode = FALSE;
+ if (0 == FXFT_Select_Charmap(m_Font.m_Face, FXFT_ENCODING_UNICODE)) {
+ bUnicode = TRUE;
+ }
+ for (int charcode = 0; charcode < 256; charcode ++) {
+ FX_LPCSTR name = GetAdobeCharName(m_BaseEncoding, m_pCharNames, charcode);
+ if (name == NULL) {
+ continue;
+ }
+ m_Encoding.m_Unicodes[charcode] = PDF_UnicodeFromAdobeName(name);
+ m_GlyphIndex[charcode] = FXFT_Get_Name_Index(m_Font.m_Face, (char*)name);
+ if (m_GlyphIndex[charcode] == 0) {
+ if (FXSYS_strcmp(name, ".notdef") != 0 && FXSYS_strcmp(name, "space") != 0) {
+ m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, bUnicode ? m_Encoding.m_Unicodes[charcode] : charcode);
+ } else {
+ m_Encoding.m_Unicodes[charcode] = 0x20;
+ m_GlyphIndex[charcode] = 0xffff;
+ }
+ }
+ }
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+ if (!bCoreText) {
+ FXSYS_memcpy32(m_ExtGID, m_GlyphIndex, 256);
+ }
+#endif
+}
+CPDF_FontEncoding::CPDF_FontEncoding()
+{
+ FXSYS_memset32(m_Unicodes, 0, sizeof(m_Unicodes));
+}
+int CPDF_FontEncoding::CharCodeFromUnicode(FX_WCHAR unicode) const
+{
+ for (int i = 0; i < 256; i ++)
+ if (m_Unicodes[i] == unicode) {
+ return i;
+ }
+ return -1;
+}
+CPDF_FontEncoding::CPDF_FontEncoding(int PredefinedEncoding)
+{
+ const FX_WORD* pSrc = PDF_UnicodesForPredefinedCharSet(PredefinedEncoding);
+ if (!pSrc) {
+ FXSYS_memset32(m_Unicodes, 0, sizeof(m_Unicodes));
+ } else
+ for (int i = 0; i < 256; i++) {
+ m_Unicodes[i] = pSrc[i];
+ }
+}
+FX_BOOL CPDF_FontEncoding::IsIdentical(CPDF_FontEncoding* pAnother) const
+{
+ return FXSYS_memcmp32(m_Unicodes, pAnother->m_Unicodes, sizeof(m_Unicodes)) == 0;
+}
+CPDF_Object* CPDF_FontEncoding::Realize()
+{
+ int predefined = 0;
+ for (int cs = PDFFONT_ENCODING_WINANSI; cs < PDFFONT_ENCODING_ZAPFDINGBATS; cs ++) {
+ const FX_WORD* pSrc = PDF_UnicodesForPredefinedCharSet(cs);
+ FX_BOOL match = TRUE;
+ for (int i = 0; i < 256; ++i) {
+ if (m_Unicodes[i] != pSrc[i]) {
+ match = FALSE;
+ break;
+ }
+ }
+ if (match) {
+ predefined = cs;
+ break;
+ }
+ }
+ if (predefined) {
+ if (predefined == PDFFONT_ENCODING_WINANSI) {
+ return CPDF_Name::Create("WinAnsiEncoding");
+ }
+ if (predefined == PDFFONT_ENCODING_MACROMAN) {
+ return CPDF_Name::Create("MacRomanEncoding");
+ }
+ if (predefined == PDFFONT_ENCODING_MACEXPERT) {
+ return CPDF_Name::Create("MacExpertEncoding");
+ }
+ return NULL;
+ }
+ CPDF_Dictionary* pDict = CPDF_Dictionary::Create();
+ pDict->SetAtName(FX_BSTRC("BaseEncoding"), FX_BSTRC("WinAnsiEncoding"));
+ const FX_WORD* pStandard = PDF_UnicodesForPredefinedCharSet(PDFFONT_ENCODING_WINANSI);
+ CPDF_Array* pDiff = CPDF_Array::Create();
+ for (int i = 0; i < 256; i ++) {
+ if (pStandard[i] == m_Unicodes[i]) {
+ continue;
+ }
+ pDiff->Add(CPDF_Number::Create(i));
+ pDiff->Add(CPDF_Name::Create(PDF_AdobeNameFromUnicode(m_Unicodes[i])));
+ }
+ pDict->SetAt(FX_BSTRC("Differences"), pDiff);
+ return pDict;
+}
+CPDF_TrueTypeFont::CPDF_TrueTypeFont()
+{
+}
+FX_BOOL CPDF_TrueTypeFont::_Load()
+{
+ return LoadCommon();
+}
+extern FX_DWORD FT_CharCodeFromUnicode(int encoding, FX_WCHAR unicode);
+void CPDF_TrueTypeFont::LoadGlyphMap()
+{
+ if (m_Font.m_Face == NULL) {
+ return;
+ }
+ int baseEncoding = m_BaseEncoding;
+ if (m_pFontFile && m_Font.m_Face->num_charmaps > 0
+ && (baseEncoding == PDFFONT_ENCODING_MACROMAN || baseEncoding == PDFFONT_ENCODING_WINANSI)
+ && (m_Flags & PDFFONT_SYMBOLIC)) {
+ FX_BOOL bSupportWin = FALSE;
+ FX_BOOL bSupportMac = FALSE;
+ for (int i = 0; i < FXFT_Get_Face_CharmapCount(m_Font.m_Face); i++) {
+ int platform_id = FXFT_Get_Charmap_PlatformID(FXFT_Get_Face_Charmaps(m_Font.m_Face)[i]);
+ if (platform_id == 0 || platform_id == 3) {
+ bSupportWin = TRUE;
+ } else if (platform_id == 0 || platform_id == 1) {
+ bSupportMac = TRUE;
+ }
+ }
+ if (baseEncoding == PDFFONT_ENCODING_WINANSI && !bSupportWin) {
+ baseEncoding = bSupportMac ? PDFFONT_ENCODING_MACROMAN : PDFFONT_ENCODING_BUILTIN;
+ } else if (baseEncoding == PDFFONT_ENCODING_MACROMAN && !bSupportMac) {
+ baseEncoding = bSupportWin ? PDFFONT_ENCODING_WINANSI : PDFFONT_ENCODING_BUILTIN;
+ }
+ }
+ if (((baseEncoding == PDFFONT_ENCODING_MACROMAN || baseEncoding == PDFFONT_ENCODING_WINANSI)
+ && m_pCharNames == NULL) || (m_Flags & PDFFONT_NONSYMBOLIC)) {
+ if (!FXFT_Has_Glyph_Names(m_Font.m_Face) && (!m_Font.m_Face->num_charmaps || !m_Font.m_Face->charmaps)) {
+ int nStartChar = m_pFontDict->GetInteger(FX_BSTRC("FirstChar"));
+ int charcode = 0;
+ for (; charcode < nStartChar; charcode ++) {
+ m_GlyphIndex[charcode] = 0;
+ }
+ FX_WORD nGlyph = charcode - nStartChar + 3;
+ for (; charcode < 256; charcode ++, nGlyph ++) {
+ m_GlyphIndex[charcode] = nGlyph;
+ }
+ return;
+ }
+ FX_BOOL bMSUnicode = FT_UseTTCharmap(m_Font.m_Face, 3, 1);
+ FX_BOOL bMacRoman = FALSE, bMSSymbol = FALSE;
+ if (!bMSUnicode) {
+ if (m_Flags & PDFFONT_NONSYMBOLIC) {
+ bMacRoman = FT_UseTTCharmap(m_Font.m_Face, 1, 0);
+ bMSSymbol = !bMacRoman && FT_UseTTCharmap(m_Font.m_Face, 3, 0);
+ } else {
+ bMSSymbol = FT_UseTTCharmap(m_Font.m_Face, 3, 0);
+ bMacRoman = !bMSSymbol && FT_UseTTCharmap(m_Font.m_Face, 1, 0);
+ }
+ }
+ FX_BOOL bToUnicode = m_pFontDict->KeyExist(FX_BSTRC("ToUnicode"));
+ for (int charcode = 0; charcode < 256; charcode ++) {
+ FX_LPCSTR name = GetAdobeCharName(baseEncoding, m_pCharNames, charcode);
+ if (name == NULL) {
+ m_GlyphIndex[charcode] = m_pFontFile ? FXFT_Get_Char_Index(m_Font.m_Face, charcode) : -1;
+ continue;
+ }
+ m_Encoding.m_Unicodes[charcode] = PDF_UnicodeFromAdobeName(name);
+ if (bMSSymbol) {
+ const FX_BYTE prefix[4] = {0x00, 0xf0, 0xf1, 0xf2};
+ for (int j = 0; j < 4; j ++) {
+ FX_WORD unicode = prefix[j] * 256 + charcode;
+ m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, unicode);
+ if (m_GlyphIndex[charcode]) {
+ break;
+ }
+ }
+ } else if (m_Encoding.m_Unicodes[charcode]) {
+ if (bMSUnicode) {
+ m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, m_Encoding.m_Unicodes[charcode]);
+ } else if (bMacRoman) {
+ FX_DWORD maccode = FT_CharCodeFromUnicode(FXFT_ENCODING_APPLE_ROMAN, m_Encoding.m_Unicodes[charcode]);
+ if (!maccode) {
+ m_GlyphIndex[charcode] = FXFT_Get_Name_Index(m_Font.m_Face, (char *)name);
+ } else {
+ m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, maccode);
+ }
+ }
+ }
+ if ((m_GlyphIndex[charcode] == 0 || m_GlyphIndex[charcode] == 0xffff) && name != NULL) {
+ if (name[0] == '.' && FXSYS_strcmp(name, ".notdef") == 0) {
+ m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, 32);
+ } else {
+ m_GlyphIndex[charcode] = FXFT_Get_Name_Index(m_Font.m_Face, (char*)name);
+ if (m_GlyphIndex[charcode] == 0) {
+ if (bToUnicode) {
+ CFX_WideString wsUnicode = UnicodeFromCharCode(charcode);
+ if (!wsUnicode.IsEmpty()) {
+ m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, wsUnicode[0]);
+ m_Encoding.m_Unicodes[charcode] = wsUnicode[0];
+ }
+ }
+ if (m_GlyphIndex[charcode] == 0) {
+ m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, charcode);
+ }
+ }
+ }
+ }
+ }
+ return;
+ }
+ if (FT_UseTTCharmap(m_Font.m_Face, 3, 0)) {
+ const FX_BYTE prefix[4] = {0x00, 0xf0, 0xf1, 0xf2};
+ FX_BOOL bGotOne = FALSE;
+ for (int charcode = 0; charcode < 256; charcode ++) {
+ for (int j = 0; j < 4; j ++) {
+ FX_WORD unicode = prefix[j] * 256 + charcode;
+ m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, unicode);
+ if (m_GlyphIndex[charcode]) {
+ bGotOne = TRUE;
+ break;
+ }
+ }
+ }
+ if (bGotOne) {
+ if (baseEncoding != PDFFONT_ENCODING_BUILTIN) {
+ for (int charcode = 0; charcode < 256; charcode ++) {
+ FX_LPCSTR name = GetAdobeCharName(baseEncoding, m_pCharNames, charcode);
+ if (name == NULL) {
+ continue;
+ }
+ m_Encoding.m_Unicodes[charcode] = PDF_UnicodeFromAdobeName(name);
+ }
+ } else if (FT_UseTTCharmap(m_Font.m_Face, 1, 0)) {
+ for (int charcode = 0; charcode < 256; charcode ++) {
+ m_Encoding.m_Unicodes[charcode] = FT_UnicodeFromCharCode(FXFT_ENCODING_APPLE_ROMAN, charcode);
+ }
+ }
+ return;
+ }
+ }
+ if (FT_UseTTCharmap(m_Font.m_Face, 1, 0)) {
+ FX_BOOL bGotOne = FALSE;
+ for (int charcode = 0; charcode < 256; charcode ++) {
+ m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, charcode);
+ m_Encoding.m_Unicodes[charcode] = FT_UnicodeFromCharCode(FXFT_ENCODING_APPLE_ROMAN, charcode);
+ if (m_GlyphIndex[charcode]) {
+ bGotOne = TRUE;
+ }
+ }
+ if (m_pFontFile || bGotOne) {
+ return;
+ }
+ }
+ if (FXFT_Select_Charmap(m_Font.m_Face, FXFT_ENCODING_UNICODE) == 0) {
+ FX_BOOL bGotOne = FALSE;
+ const FX_WORD* pUnicodes = PDF_UnicodesForPredefinedCharSet(baseEncoding);
+ for (int charcode = 0; charcode < 256; charcode ++) {
+ if (m_pFontFile == NULL) {
+ FX_LPCSTR name = GetAdobeCharName(0, m_pCharNames, charcode);
+ if (name != NULL) {
+ m_Encoding.m_Unicodes[charcode] = PDF_UnicodeFromAdobeName(name);
+ } else if (pUnicodes) {
+ m_Encoding.m_Unicodes[charcode] = pUnicodes[charcode];
+ }
+ } else {
+ m_Encoding.m_Unicodes[charcode] = charcode;
+ }
+ m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, m_Encoding.m_Unicodes[charcode]);
+ if (m_GlyphIndex[charcode]) {
+ bGotOne = TRUE;
+ }
+ }
+ if (bGotOne) {
+ return;
+ }
+ }
+ for (int charcode = 0; charcode < 256; charcode ++) {
+ m_GlyphIndex[charcode] = charcode;
+ }
+}
+CPDF_Type3Font::CPDF_Type3Font()
+{
+ m_pPageResources = NULL;
+ FXSYS_memset32(m_CharWidthL, 0, sizeof m_CharWidthL);
+}
+CPDF_Type3Font::~CPDF_Type3Font()
+{
+ FX_POSITION pos = m_CacheMap.GetStartPosition();
+ while (pos) {
+ FX_LPVOID key, value;
+ m_CacheMap.GetNextAssoc(pos, key, value);
+ delete (CPDF_Type3Char*)value;
+ }
+ m_CacheMap.RemoveAll();
+ pos = m_DeletedMap.GetStartPosition();
+ while (pos) {
+ FX_LPVOID key, value;
+ m_DeletedMap.GetNextAssoc(pos, key, value);
+ delete (CPDF_Type3Char*)key;
+ }
+}
+FX_BOOL CPDF_Type3Font::_Load()
+{
+ m_pFontResources = m_pFontDict->GetDict(FX_BSTRC("Resources"));
+ CPDF_Array* pMatrix = m_pFontDict->GetArray(FX_BSTRC("FontMatrix"));
+ FX_FLOAT xscale = 1.0f, yscale = 1.0f;
+ if (pMatrix) {
+ m_FontMatrix = pMatrix->GetMatrix();
+ xscale = m_FontMatrix.a;
+ yscale = m_FontMatrix.d;
+ }
+ CPDF_Array* pBBox = m_pFontDict->GetArray(FX_BSTRC("FontBBox"));
+ if (pBBox) {
+ m_FontBBox.left = (FX_INT32)(FXSYS_Mul(pBBox->GetNumber(0), xscale) * 1000);
+ m_FontBBox.bottom = (FX_INT32)(FXSYS_Mul(pBBox->GetNumber(1), yscale) * 1000);
+ m_FontBBox.right = (FX_INT32)(FXSYS_Mul(pBBox->GetNumber(2), xscale) * 1000);
+ m_FontBBox.top = (FX_INT32)(FXSYS_Mul(pBBox->GetNumber(3), yscale) * 1000);
+ }
+ int StartChar = m_pFontDict->GetInteger(FX_BSTRC("FirstChar"));
+ CPDF_Array* pWidthArray = m_pFontDict->GetArray(FX_BSTRC("Widths"));
+ if (pWidthArray && (StartChar >= 0 && StartChar < 256)) {
+ FX_DWORD count = pWidthArray->GetCount();
+ if (count > 256) {
+ count = 256;
+ }
+ if (StartChar + count > 256) {
+ count = 256 - StartChar;
+ }
+ for (FX_DWORD i = 0; i < count; i ++) {
+ m_CharWidthL[StartChar + i] = FXSYS_round(FXSYS_Mul(pWidthArray->GetNumber(i), xscale) * 1000);
+ }
+ }
+ m_pCharProcs = m_pFontDict->GetDict(FX_BSTRC("CharProcs"));
+ CPDF_Object* pEncoding = m_pFontDict->GetElementValue(FX_BSTRC("Encoding"));
+ if (pEncoding) {
+ LoadPDFEncoding(pEncoding, m_BaseEncoding, m_pCharNames, FALSE, FALSE);
+ if (m_pCharNames) {
+ for (int i = 0; i < 256; i ++) {
+ m_Encoding.m_Unicodes[i] = PDF_UnicodeFromAdobeName(m_pCharNames[i]);
+ if (m_Encoding.m_Unicodes[i] == 0) {
+ m_Encoding.m_Unicodes[i] = i;
+ }
+ }
+ }
+ }
+ return TRUE;
+}
+void CPDF_Type3Font::CheckType3FontMetrics()
+{
+ CheckFontMetrics();
+}
+CPDF_Type3Char* CPDF_Type3Font::LoadChar(FX_DWORD charcode, int level)
+{
+ if (level >= _FPDF_MAX_TYPE3_FORM_LEVEL_) {
+ return NULL;
+ }
+ CPDF_Type3Char* pChar = NULL;
+ if (m_CacheMap.Lookup((FX_LPVOID)(FX_UINTPTR)charcode, (FX_LPVOID&)pChar)) {
+ if (pChar->m_bPageRequired && m_pPageResources) {
+ delete pChar;
+ m_CacheMap.RemoveKey((FX_LPVOID)(FX_UINTPTR)charcode);
+ return LoadChar(charcode, level + 1);
+ }
+ return pChar;
+ }
+ FX_LPCSTR name = GetAdobeCharName(m_BaseEncoding, m_pCharNames, charcode);
+ if (name == NULL) {
+ return NULL;
+ }
+ CPDF_Stream* pStream = (CPDF_Stream*)m_pCharProcs->GetElementValue(name);
+ if (pStream == NULL || pStream->GetType() != PDFOBJ_STREAM) {
+ return NULL;
+ }
+ pChar = FX_NEW CPDF_Type3Char;
+ pChar->m_pForm = FX_NEW CPDF_Form(m_pDocument, m_pFontResources ? m_pFontResources : m_pPageResources, pStream, NULL);
+ pChar->m_pForm->ParseContent(NULL, NULL, pChar, NULL, level + 1);
+ FX_FLOAT scale = m_FontMatrix.GetXUnit();
+ pChar->m_Width = (FX_INT32)(pChar->m_Width * scale + 0.5f);
+ FX_RECT &rcBBox = pChar->m_BBox;
+ CFX_FloatRect char_rect((FX_FLOAT)rcBBox.left / 1000.0f, (FX_FLOAT)rcBBox.bottom / 1000.0f,
+ (FX_FLOAT)rcBBox.right / 1000.0f, (FX_FLOAT)rcBBox.top / 1000.0f);
+ if (rcBBox.right <= rcBBox.left || rcBBox.bottom >= rcBBox.top) {
+ char_rect = pChar->m_pForm->CalcBoundingBox();
+ }
+ char_rect.Transform(&m_FontMatrix);
+ rcBBox.left = FXSYS_round(char_rect.left * 1000);
+ rcBBox.right = FXSYS_round(char_rect.right * 1000);
+ rcBBox.top = FXSYS_round(char_rect.top * 1000);
+ rcBBox.bottom = FXSYS_round(char_rect.bottom * 1000);
+ m_CacheMap.SetAt((FX_LPVOID)(FX_UINTPTR)charcode, pChar);
+ if (pChar->m_pForm->CountObjects() == 0) {
+ delete pChar->m_pForm;
+ pChar->m_pForm = NULL;
+ }
+ return pChar;
+}
+int CPDF_Type3Font::GetCharWidthF(FX_DWORD charcode, int level)
+{
+ if (charcode > 0xff) {
+ charcode = 0;
+ }
+ if (m_CharWidthL[charcode]) {
+ return m_CharWidthL[charcode];
+ }
+ CPDF_Type3Char* pChar = LoadChar(charcode, level);
+ if (pChar == NULL) {
+ return 0;
+ }
+ return pChar->m_Width;
+}
+void CPDF_Type3Font::GetCharBBox(FX_DWORD charcode, FX_RECT& rect, int level)
+{
+ CPDF_Type3Char* pChar = LoadChar(charcode, level);
+ if (pChar == NULL) {
+ rect.left = rect.right = rect.top = rect.bottom = 0;
+ return;
+ }
+ rect = pChar->m_BBox;
+}
+CPDF_Type3Char::CPDF_Type3Char()
+{
+ m_pForm = NULL;
+ m_pBitmap = NULL;
+ m_bPageRequired = FALSE;
+ m_bColored = FALSE;
+}
+CPDF_Type3Char::~CPDF_Type3Char()
+{
+ if (m_pForm) {
+ delete m_pForm;
+ }
+ if (m_pBitmap) {
+ delete m_pBitmap;
+ }
+}
diff --git a/core/src/fpdfapi/fpdf_font/fpdf_font_charset.cpp b/core/src/fpdfapi/fpdf_font/fpdf_font_charset.cpp
index bd09cfc75d..981018b33a 100644
--- a/core/src/fpdfapi/fpdf_font/fpdf_font_charset.cpp
+++ b/core/src/fpdfapi/fpdf_font/fpdf_font_charset.cpp
@@ -1,625 +1,625 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../../include/fpdfapi/fpdf_page.h"
-#include "../../../include/fxge/fx_freetype.h"
-extern FX_WCHAR PDF_UnicodeFromAdobeName(const FX_CHAR*);
-const struct _UnicodeAlt {
- FX_WORD m_Unicode;
- const FX_CHAR* m_Alter;
-}
-UnicodeAlts[] = {
- {0x00a0, " "}, {0x00a1, "!"}, {0x00a2, "c"}, {0x00a3, "P"}, {0x00a4, "o"},
- {0x00a5, "Y"}, {0x00a6, "|"}, {0x00a7, "S"}, {0x00a9, "(C)"}, {0x00aa, "a"},
- {0x00ab, "<<"}, {0x00ac, "-|"}, {0x00ae, "(R)"}, {0x00af, "-"},
- {0x00b0, "o"}, {0x00b1, "+/-"}, {0x00b2, "^2"}, { 0x00b3, "^3"},
- {0x00b4, "'"}, {0x00b5, "u"}, {0x00b6, "P"}, {0x00b7, "."},
- {0x00b9, "^1"}, {0x00ba, "o"}, {0x00bb, ">>"}, {0x00bc, "1/4"},
- {0x00bd, "1/2"}, {0x00be, "3/4"}, {0x00bf, "?"}, {0x00c0, "A"},
- {0x00c1, "A"}, {0x00c2, "A"}, {0x00c3, "A"}, {0x00c4, "A"},
- {0x00c5, "A"}, {0x00c6, "AE"}, {0x00c7, "C"}, {0x00c8, "E"},
- {0x00c9, "E"}, {0x00ca, "E"}, {0x00cb, "E"}, {0x00cc, "I"},
- {0x00cd, "I"}, {0x00ce, "I"}, {0x00cf, "I"},
- {0x00d1, "N"}, {0x00d2, "O"}, {0x00d3, "O"}, {0x00d4, "O"},
- {0x00d5, "O"}, {0x00d6, "O"}, {0x00d7, "x"}, {0x00d8, "O"},
- {0x00d9, "U"}, {0x00da, "U"}, {0x00db, "U"}, {0x00dc, "U"},
- {0x00dd, "Y"}, {0x00df, "S"}, {0x00e0, "a"},
- {0x00e1, "a"}, {0x00e2, "a"}, {0x00e3, "a"}, {0x00e4, "a"},
- {0x00e5, "a"}, {0x00e6, "ae"}, {0x00e7, "c"}, {0x00e8, "e"},
- {0x00e9, "e"}, {0x00ea, "e"}, {0x00eb, "e"}, {0x00ec, "i"},
- {0x00ed, "i"}, {0x00ee, "i"}, {0x00ef, "i"},
- {0x00f1, "n"}, {0x00f2, "o"}, {0x00f3, "o"}, {0x00f4, "o"},
- {0x00f5, "o"}, {0x00f6, "o"}, {0x00f7, "/"}, {0x00f8, "o"},
- {0x00f9, "u"}, {0x00fa, "u"}, {0x00fb, "u"}, {0x00fc, "u"},
- {0x00fd, "y"}, {0x00ff, "y"},
- {0x02b0, "h"}, {0x02b2, "j"}, {0x02b3, "r"}, {0x02b7, "w"},
- {0x02b8, "y"}, {0x02b9, "'"}, {0x02ba, "\""}, {0x02bb, "'"},
- {0x02bc, "'"}, {0x02bd, "'"}, {0x02be, "'"}, {0x02bf, "'"},
- {0x02c2, "<"}, {0x02c3, ">"}, {0x02c4, "^"}, {0x02c5, "v"},
- {0x02c6, "^"}, {0x02c7, "v"}, {0x02c8, "'"}, {0x02c9, "-"},
- {0x02ca, "'"}, {0x02cb, "'"}, {0x02cc, "."}, {0x02cd, "_"},
- {0x2010, "-"}, {0x2012, "-"}, {0x2013, "-"}, {0x2014, "--"},
- {0x2015, "--"}, {0x2016, "|"}, {0x2017, "_"},
- {0x2018, "'"}, {0x2019, "'"}, {0x201a, ","}, {0x201b, "'"},
- {0x201c, "\""}, {0x201d, "\""}, {0x201e, ","}, {0x201f, "'"},
- {0x2020, "+"}, {0x2021, "+"}, {0x2022, "*"}, {0x2023, ">"},
- {0x2024, "."}, {0x2025, ".."}, {0x2027, "."}, {0x2032, "'"},
- {0x2033, "\""}, {0x2035, "'"}, {0x2036, "\""}, {0x2038, "^"},
- {0x2039, "<"}, {0x203a, ">"}, {0x203b, "*"}, {0x203c, "!!"},
- {0x203d, "?!"}, {0x203e, "-"}, {0x2044, "/"}, {0x2047, "??"},
- {0x2048, "?!"}, {0x2049, "!?"}, {0x204e, "*"}, {0x2052, "%"},
- {0x2122, "(TM)"},
- {0x2212, "-"}, {0x2215, "/"}, {0x2216, "\\"}, {0x2217, "*"},
- {0x2218, "*"}, {0x2219, "*"}, {0x2223, "|"}, {0x22c5, "."},
- {0x266f, "#"},
- {0XF6D9, "(C)"}, {0XF6DA, "(C)"}, {0XF6DB, "(TM)"},
- {0XF8E8, "(C)"}, {0xf8e9, "(C)"}, {0XF8EA, "(TM)"},
-
- {0xfb01, "fi"}, {0xfb02, "fl"}
-};
-const FX_CHAR* FCS_GetAltStr(FX_WCHAR unicode)
-{
- int begin = 0;
- int end = sizeof UnicodeAlts / sizeof(struct _UnicodeAlt) - 1;
- while (begin <= end) {
- int middle = (begin + end) / 2;
- FX_WORD middlecode = UnicodeAlts[middle].m_Unicode;
- if (middlecode > unicode) {
- end = middle - 1;
- } else if (middlecode < unicode) {
- begin = middle + 1;
- } else {
- return UnicodeAlts[middle].m_Alter;
- }
- }
- return NULL;
-}
-const FX_WORD StandardEncoding[256] = {
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x2019,
- 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, 0x0030, 0x0031,
- 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b,
- 0x003c, 0x003d, 0x003e, 0x003f, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045,
- 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
- 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059,
- 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, 0x2018, 0x0061, 0x0062, 0x0063,
- 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d,
- 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
- 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x00a1, 0x00a2, 0x00a3, 0x2044, 0x00a5, 0x0192, 0x00a7, 0x00a4, 0x0027,
- 0x201c, 0x00ab, 0x2039, 0x203a, 0xfb01, 0xfb02, 0x0000, 0x2013, 0x2020, 0x2021,
- 0x00b7, 0x0000, 0x00b6, 0x2022, 0x201a, 0x201e, 0x201d, 0x00bb, 0x2026, 0x2030,
- 0x0000, 0x00bf, 0x0000, 0x0060, 0x00b4, 0x02c6, 0x02dc, 0x00af, 0x02d8, 0x02d9,
- 0x00a8, 0x0000, 0x02da, 0x00b8, 0x0000, 0x02dd, 0x02db, 0x02c7, 0x2014, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00c6, 0x0000, 0x00aa, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0141, 0x00d8, 0x0152, 0x00ba, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x00e6, 0x0000, 0x0000, 0x0000, 0x0131, 0x0000, 0x0000, 0x0142, 0x00f8,
- 0x0153, 0x00df, 0x0000, 0x0000, 0x0000, 0x0000
-};
-const FX_WORD MacRomanEncoding[256] = {
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
- 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, 0x0030, 0x0031,
- 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b,
- 0x003c, 0x003d, 0x003e, 0x003f, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045,
- 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
- 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059,
- 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, 0x0060, 0x0061, 0x0062, 0x0063,
- 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d,
- 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
- 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x0000, 0x00c4, 0x00c5,
- 0x00c7, 0x00c9, 0x00d1, 0x00d6, 0x00dc, 0x00e1, 0x00e0, 0x00e2, 0x00e4, 0x00e3,
- 0x00e5, 0x00e7, 0x00e9, 0x00e8, 0x00ea, 0x00eb, 0x00ed, 0x00ec, 0x00ee, 0x00ef,
- 0x00f1, 0x00f3, 0x00f2, 0x00f4, 0x00f6, 0x00f5, 0x00fa, 0x00f9, 0x00fb, 0x00fc,
- 0x2020, 0x00b0, 0x00a2, 0x00a3, 0x00a7, 0x2022, 0x00b6, 0x00df, 0x00ae, 0x00a9,
- 0x2122, 0x00b4, 0x00a8, 0x0000, 0x00c6, 0x00d8, 0x0000, 0x00b1, 0x0000, 0x0000,
- 0x00a5, 0x00b5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00aa, 0x00ba, 0x0000,
- 0x00e6, 0x00f8, 0x00bf, 0x00a3, 0x00ac, 0x0000, 0x0192, 0x0000, 0x0000, 0x00ab,
- 0x00bb, 0x2026, 0x0020, 0x00c0, 0x00c3, 0x00d5, 0x0152, 0x0153, 0x2013, 0x2014,
- 0x201c, 0x201d, 0x2018, 0x2019, 0x00f7, 0x0000, 0x00ff, 0x0178, 0x2044, 0x00a4,
- 0x2039, 0x203a, 0xfb01, 0xfb02, 0x2021, 0x00b7, 0x201a, 0x201e, 0x2030, 0x00c2,
- 0x00ca, 0x00c1, 0x00cb, 0x00c8, 0x00cd, 0x00ce, 0x00cf, 0x00cc, 0x00d3, 0x00d4,
- 0x0000, 0x00d2, 0x00da, 0x00db, 0x00d9, 0x0131, 0x02c6, 0x02dc, 0x00af, 0x02d8,
- 0x02d9, 0x02da, 0x00b8, 0x02dd, 0x02db, 0x02c7
-};
-const FX_WORD AdobeWinAnsiEncoding[256] = {
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
- 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
- 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
- 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
- 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
- 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
- 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
- 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
- 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
- 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
- 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
- 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x2022,
- 0x20ac, 0x2022, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021,
- 0x02c6, 0x2030, 0x0160, 0x2039, 0x0152, 0x2022, 0x017d, 0x2022,
- 0x2022, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014,
- 0x02dc, 0x2122, 0x0161, 0x203a, 0x0153, 0x2022, 0x017e, 0x0178,
- 0x0020, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7,
- 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x002d, 0x00ae, 0x00af,
- 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7,
- 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf,
- 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7,
- 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
- 0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7,
- 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df,
- 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7,
- 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
- 0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7,
- 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff
-};
-extern const FX_WORD PDFDocEncoding[256];
-const FX_WORD MacExpertEncoding[256] = {
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0020, 0xf721, 0xf6f8, 0xf7a2, 0xf724, 0xf6e4, 0xf726, 0xf7b4,
- 0x207d, 0x207e, 0x2025, 0x2024, 0x002c, 0x002d, 0x002e, 0x2044, 0xf730, 0xf731,
- 0xf732, 0xf733, 0xf734, 0xf735, 0xf736, 0xf737, 0xf738, 0xf739, 0x003a, 0x003b,
- 0x0000, 0xf6de, 0x0000, 0xf73f, 0x0000, 0x0000, 0x0000, 0x0000, 0xf7f0, 0x0000,
- 0x0000, 0x00bc, 0x00bd, 0x00be, 0x215b, 0x215c, 0x215d, 0x215e, 0x2153, 0x2154,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfb00, 0xfb01, 0xfb02, 0xfb03,
- 0xfb04, 0x208d, 0x0000, 0x208e, 0xf6f6, 0xf6e5, 0xf760, 0xf761, 0xf762, 0xf763,
- 0xf764, 0xf765, 0xf766, 0xf767, 0xf768, 0xf769, 0xf76a, 0xf76b, 0xf76c, 0xf76d,
- 0xf76e, 0xf76f, 0xf770, 0xf771, 0xf772, 0xf773, 0xf774, 0xf775, 0xf776, 0xf777,
- 0xf778, 0xf779, 0xf77a, 0x20a1, 0xf6dc, 0xf6dd, 0xf6fe, 0x0000, 0x0000, 0xf6e9,
- 0xf6e0, 0x0000, 0x0000, 0x0000, 0x0000, 0xf7e1, 0xf7e0, 0xf7e2, 0xf7e4, 0xf7e3,
- 0xf7e5, 0xf7e7, 0xf7e9, 0xf7e8, 0xf7ea, 0xf7eb, 0xf7ed, 0xf7ec, 0xf7ee, 0xf7ef,
- 0xf7f1, 0xf7f3, 0xf7f2, 0xf7f4, 0xf7f6, 0xf7f5, 0xf7fa, 0xf7f9, 0xf7fb, 0xf7fc,
- 0x0000, 0x2078, 0x2084, 0x2083, 0x2086, 0x2088, 0x2087, 0xf6fd, 0x0000, 0xf6df,
- 0x2082, 0x0000, 0xf7a8, 0x0000, 0xf6f5, 0xf6fd, 0x2085, 0x0000, 0xf6e1, 0xf6e7,
- 0xf7fd, 0x0000, 0xf6e3, 0x0000, 0x0000, 0xf7fe, 0x0000, 0x2089, 0x2080, 0xf6ff,
- 0xf7e6, 0xf7f8, 0xf7bf, 0x2081, 0xf6e9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0xf7b8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf6fa, 0x2012, 0xf6e6,
- 0x0000, 0x0000, 0x0000, 0x0000, 0xf7a1, 0x0000, 0xf7ff, 0x0000, 0x00b9, 0x00b2,
- 0x00b3, 0x2074, 0x2075, 0x2076, 0x2077, 0x2079, 0x2070, 0x0000, 0xf6ec, 0xf6f1,
- 0x0000, 0x0000, 0x0000, 0xf6ed, 0xf6f2, 0xf6eb, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0xf6ee, 0xf6fb, 0xf6f4, 0xf7af, 0xf6ea, 0x207f, 0xf6ef, 0xf6e2, 0xf6e8,
- 0xf6f7, 0xf6fc, 0x0000, 0x0000, 0x0000, 0x0000
-};
-const FX_WORD AdobeSymbolEncoding[256] = {
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0020, 0x0021, 0x2200, 0x0023, 0x2203, 0x0025, 0x0026, 0x220B,
- 0x0028, 0x0029, 0x2217, 0x002B, 0x002C, 0x2212, 0x002E, 0x002F,
- 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
- 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
- 0x2245, 0x0391, 0x0392, 0x03A7, 0x0394, 0x0395, 0x03A6, 0x0393,
- 0x0397, 0x0399, 0x03D1, 0x039A, 0x039B, 0x039C, 0x039D, 0x039F,
- 0x03A0, 0x0398, 0x03A1, 0x03A3, 0x03A4, 0x03A5, 0x03C2, 0x03A9,
- 0x039E, 0x03A8, 0x0396, 0x005B, 0x2234, 0x005D, 0x22A5, 0x005F,
- 0xF8E5, 0x03B1, 0x03B2, 0x03C7, 0x03B4, 0x03B5, 0x03C6, 0x03B3,
- 0x03B7, 0x03B9, 0x03D5, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BF,
- 0x03C0, 0x03B8, 0x03C1, 0x03C3, 0x03C4, 0x03C5, 0x03D6, 0x03C9,
- 0x03BE, 0x03C8, 0x03B6, 0x007B, 0x007C, 0x007D, 0x223C, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x20AC, 0x03D2, 0x2032, 0x2264, 0x2044, 0x221E, 0x0192, 0x2663,
- 0x2666, 0x2665, 0x2660, 0x2194, 0x2190, 0x2191, 0x2192, 0x2193,
- 0x00B0, 0x00B1, 0x2033, 0x2265, 0x00D7, 0x221D, 0x2202, 0x2022,
- 0x00F7, 0x2260, 0x2261, 0x2248, 0x2026, 0xF8E6, 0xF8E7, 0x21B5,
- 0x2135, 0x2111, 0x211C, 0x2118, 0x2297, 0x2295, 0x2205, 0x2229,
- 0x222A, 0x2283, 0x2287, 0x2284, 0x2282, 0x2286, 0x2208, 0x2209,
- 0x2220, 0x2207, 0xF6DA, 0xF6D9, 0xF6DB, 0x220F, 0x221A, 0x22C5,
- 0x00AC, 0x2227, 0x2228, 0x21D4, 0x21D0, 0x21D1, 0x21D2, 0x21D3,
- 0x25CA, 0x2329, 0xF8E8, 0xF8E9, 0xF8EA, 0x2211, 0xF8EB, 0xF8EC,
- 0xF8ED, 0xF8EE, 0xF8EF, 0xF8F0, 0xF8F1, 0xF8F2, 0xF8F3, 0xF8F4,
- 0x0000, 0x232A, 0x222B, 0x2320, 0xF8F5, 0x2321, 0xF8F6, 0xF8F7,
- 0xF8F8, 0xF8F9, 0xF8FA, 0xF8FB, 0xF8FC, 0xF8FD, 0xF8FE, 0x0000,
-};
-const FX_WORD ZapfEncoding[256] = {
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0020, 0x2701, 0x2702, 0x2703, 0x2704, 0x260E, 0x2706, 0x2707,
- 0x2708, 0x2709, 0x261B, 0x261E, 0x270C, 0x270D, 0x270E, 0x270F,
- 0x2710, 0x2711, 0x2712, 0x2713, 0x2714, 0x2715, 0x2716, 0x2717,
- 0x2718, 0x2719, 0x271A, 0x271B, 0x271C, 0x271D, 0x271E, 0x271F,
- 0x2720, 0x2721, 0x2722, 0x2723, 0x2724, 0x2725, 0x2726, 0x2727,
- 0x2605, 0x2729, 0x272A, 0x272B, 0x272C, 0x272D, 0x272E, 0x272F,
- 0x2730, 0x2731, 0x2732, 0x2733, 0x2734, 0x2735, 0x2736, 0x2737,
- 0x2738, 0x2739, 0x273A, 0x273B, 0x273C, 0x273D, 0x273E, 0x273F,
- 0x2740, 0x2741, 0x2742, 0x2743, 0x2744, 0x2745, 0x2746, 0x2747,
- 0x2748, 0x2749, 0x274A, 0x274B, 0x25CF, 0x274D, 0x25A0, 0x274F,
- 0x2750, 0x2751, 0x2752, 0x25B2, 0x25BC, 0x25C6, 0x2756, 0x25D7,
- 0x2758, 0x2759, 0x275A, 0x275B, 0x275C, 0x275D, 0x275E, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x2761, 0x2762, 0x2763, 0x2764, 0x2765, 0x2766, 0x2767,
- 0x2663, 0x2666, 0x2665, 0x2660, 0x2460, 0x2461, 0x2462, 0x2463,
- 0x2464, 0x2465, 0x2466, 0x2467, 0x2468, 0x2469, 0x2776, 0x2777,
- 0x2778, 0x2779, 0x277A, 0x277B, 0x277C, 0x277D, 0x277E, 0x277F,
- 0x2780, 0x2781, 0x2782, 0x2783, 0x2784, 0x2785, 0x2786, 0x2787,
- 0x2788, 0x2789, 0x278A, 0x278B, 0x278C, 0x278D, 0x278E, 0x278F,
- 0x2790, 0x2791, 0x2792, 0x2793, 0x2794, 0x2192, 0x2194, 0x2195,
- 0x2798, 0x2799, 0x279A, 0x279B, 0x279C, 0x279D, 0x279E, 0x279F,
- 0x27A0, 0x27A1, 0x27A2, 0x27A3, 0x27A4, 0x27A5, 0x27A6, 0x27A7,
- 0x27A8, 0x27A9, 0x27AA, 0x27AB, 0x27AC, 0x27AD, 0x27AE, 0x27AF,
- 0x0000, 0x27B1, 0x27B2, 0x27B3, 0x27B4, 0x27B5, 0x27B6, 0x27B7,
- 0x27B8, 0x27B9, 0x27BA, 0x27BB, 0x27BC, 0x27BD, 0x27BE, 0x0000,
-};
-const FX_LPCSTR StandardEncodingNames[224] = {
- "space", "exclam", "quotedbl", "numbersign", "dollar", "percent", "ampersand", "quoteright",
- "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",
- "quoteleft", "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", NULL,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, "exclamdown", "cent", "sterling", "fraction", "yen", "florin", "section",
- "currency", "quotesingle", "quotedblleft", "guillemotleft", "guilsinglleft", "guilsinglright", "fi", "fl",
- NULL, "endash", "dagger", "daggerdbl", "periodcentered", NULL, "paragraph", "bullet",
- "quotesinglbase", "quotedblbase", "quotedblright", "guillemotright", "ellipsis", "perthousand", NULL, "questiondown",
- NULL, "grave", "acute", "circumflex", "tilde", "macron", "breve", "dotaccent",
- "dieresis", NULL, "ring", "cedilla", NULL, "hungarumlaut", "ogonek", "caron",
- "emdash", NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, "AE", NULL, "ordfeminine", NULL, NULL, NULL, NULL,
- "Lslash", "Oslash", "OE", "ordmasculine", NULL, NULL, NULL, NULL,
- NULL, "ae", NULL, NULL, NULL, "dotlessi", NULL, NULL,
- "lslash", "oslash", "oe", "germandbls", NULL, NULL, NULL, NULL,
-};
-const FX_LPCSTR AdobeWinAnsiEncodingNames[224] = {
- "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", "bullet",
- "Euro", "bullet", "quotesinglbase", "florin", "quotedblbase", "ellipsis", "dagger", "daggerdbl",
- "circumflex", "perthousand", "Scaron", "guilsinglleft", "OE", "bullet", "Zcaron", "bullet",
- "bullet", "quoteleft", "quoteright", "quotedblleft", "quotedblright", "bullet", "endash", "emdash",
- "tilde", "trademark", "scaron", "guilsinglright", "oe", "bullet", "zcaron", "Ydieresis",
- "space", "exclamdown", "cent", "sterling", "currency", "yen", "brokenbar", "section",
- "dieresis", "copyright", "ordfeminine", "guillemotleft", "logicalnot", "hyphen", "registered", "macron",
- "degree", "plusminus", "twosuperior", "threesuperior", "acute", "mu", "paragraph", "periodcentered",
- "cedilla", "onesuperior", "ordmasculine", "guillemotright", "onequarter", "onehalf", "threequarters", "questiondown",
- "Agrave", "Aacute", "Acircumflex", "Atilde", "Adieresis", "Aring", "AE", "Ccedilla",
- "Egrave", "Eacute", "Ecircumflex", "Edieresis", "Igrave", "Iacute", "Icircumflex", "Idieresis",
- "Eth", "Ntilde", "Ograve", "Oacute", "Ocircumflex", "Otilde", "Odieresis", "multiply",
- "Oslash", "Ugrave", "Uacute", "Ucircumflex", "Udieresis", "Yacute", "Thorn", "germandbls",
- "agrave", "aacute", "acircumflex", "atilde", "adieresis", "aring", "ae", "ccedilla",
- "egrave", "eacute", "ecircumflex", "edieresis", "igrave", "iacute", "icircumflex", "idieresis",
- "eth", "ntilde", "ograve", "oacute", "ocircumflex", "otilde", "odieresis", "divide",
- "oslash", "ugrave", "uacute", "ucircumflex", "udieresis", "yacute", "thorn", "ydieresis",
-};
-const FX_LPCSTR MacRomanEncodingNames[224] = {
- "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", NULL,
- "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", "space", "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",
-};
-const FX_LPCSTR MacExpertEncodingNames[224] = {
- "space", "exclamsmall", "Hungarumlautsmall", "centoldstyle", "dollaroldstyle", "dollarsuperior", "ampersandsmall", "Acutesmall",
- "parenleftsuperior", "parenrightsuperior", "twodotenleader", "onedotenleader", "comma", "hyphen", "period", "fraction",
- "zerooldstyle", "oneoldstyle", "twooldstyle", "threeoldstyle", "fouroldstyle", "fiveoldstyle", "sixoldstyle", "sevenoldstyle",
- "eightoldstyle", "nineoldstyle", "colon", "semicolon", NULL, "threequartersemdash", NULL, "questionsmall",
- NULL, NULL, NULL, NULL, "Ethsmall", NULL, NULL, "onequarter",
- "onehalf", "threequarters", "oneeighth", "threeeighths", "fiveeighths", "seveneighths", "onethird", "twothirds",
- NULL, NULL, NULL, NULL, NULL, NULL, "ff", "fi",
- "fl", "ffi", "ffl", "parenleftinferior", NULL, "parenrightinferior", "Circumflexsmall", "hypheninferior",
- "Gravesmall", "Asmall", "Bsmall", "Csmall", "Dsmall", "Esmall", "Fsmall", "Gsmall",
- "Hsmall", "Ismall", "Jsmall", "Ksmall", "Lsmall", "Msmall", "Nsmall", "Osmall",
- "Psmall", "Qsmall", "Rsmall", "Ssmall", "Tsmall", "Usmall", "Vsmall", "Wsmall",
- "Xsmall", "Ysmall", "Zsmall", "colonmonetary", "onefitted", "rupiah", "Tildesmall", NULL,
- NULL, "asuperior", "centsuperior", NULL, NULL, NULL, NULL, "Aacutesmall",
- "Agravesmall", "Acircumflexsmall", "Adieresissmall", "Atildesmall", "Aringsmall", "Ccedillasmall", "Eacutesmall", "Egravesmall",
- "Ecircumflexsmall", "Edieresissmall", "Iacutesmall", "Igravesmall", "Icircumflexsmall", "Idieresissmall", "Ntildesmall", "Oacutesmall",
- "Ogravesmall", "Ocircumflexsmall", "Odieresissmall", "Otildesmall", "Uacutesmall", "Ugravesmall", "Ucircumflexsmall", "Udieresissmall",
- NULL, "eightsuperior", "fourinferior", "threeinferior", "sixinferior", "eightinferior", "seveninferior", "Scaronsmall",
- NULL, "centinferior", "twoinferior", NULL, "Dieresissmall", NULL, "Caronsmall", "Scaronsmall",
- "fiveinferior", NULL, "commainferior", "periodinferior", "Yacutesmall", NULL, "dollarinferior", NULL,
- NULL, "Thornsmall", NULL, "nineinferior", "zeroinferior", "Zcaronsmall", "AEsmall", "Oslashsmall",
- "questiondownsmall", "oneinferior", "asuperior", NULL, NULL, NULL, NULL, NULL,
- NULL, "Cedillasmall", NULL, NULL, NULL, NULL, NULL, "OEsmall",
- "figuredash", "hyphensuperior", NULL, NULL, NULL, NULL, "exclamdownsmall", NULL,
- "Ydieresissmall", NULL, "onesuperior", "twosuperior", "threesuperior", "foursuperior", "fivesuperior", "sixsuperior",
- "sevensuperior", "ninesuperior", "zerosuperior", NULL, "esuperior", "rsuperior", NULL, NULL,
- NULL, "isuperior", "ssuperior", "dsuperior", NULL, NULL, NULL, NULL,
- NULL, "lsuperior", "Ogoneksmall", "Brevesmall", "Macronsmall", "bsuperior", "nsuperior", "msuperior",
- "commasuperior", "periodsuperior", "Dotaccentsmall", "Ringsmall", NULL, NULL, NULL, NULL,
-};
-const FX_LPCSTR PDFDocEncodingNames[232] = {
- "breve", "caron", "circumflex", "dotaccent", "hungarumlaut", "ogonek", "ring", "tilde",
- "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", NULL,
- "bullet3", "dagger", "daggerdbl", "ellipsis", "emdash", "endash", "florin", "fraction",
- "guilsinglleft", "guilsinglright", "minus", "perthousand", "quotedblbase", "quotedblleft", "quotedblright", "quoteleft",
- "quoteright", "quotesinglbase", "trademark", "fi", "fl", "Lslash", "OE", "Scaron",
- "Ydieresis", "Zcaron2", "dotlessi", "lslash", "oe", "scaron", "zcaron2", NULL,
- "Euro", "exclamdown", "cent", "sterling", "currency", "yen", "brokenbar", "section",
- "dieresis", "copyright", "ordfeminine", "guillemotleft4", "logicalnot", NULL, "registered", "macron",
- "degree", "plusminus", "twosuperior", "threesuperior", "acute", "mu", "paragraph", "periodcentered",
- "cedilla", "onesuperior", "ordmasculine", "guillemotright4", "onequarter", "onehalf", "threequarters", "questiondown",
- "Agrave", "Aacute", "Acircumflex", "Atilde", "Adieresis", "Aring", "AE", "Ccedilla",
- "Egrave", "Eacute", "Ecircumflex", "Edieresis", "Igrave", "Iacute", "Icircumflex", "Idieresis",
- "Eth", "Ntilde", "Ograve", "Oacute", "Ocircumflex", "Otilde", "Odieresis", "multiply",
- "Oslash", "Ugrave", "Uacute", "Ucircumflex", "Udieresis", "Yacute", "Thorn", "germandbls",
- "agrave", "aacute", "acircumflex", "atilde", "adieresis", "aring", "ae", "ccedilla",
- "egrave", "eacute", "ecircumflex", "edieresis", "igrave", "iacute", "icircumflex", "idieresis",
- "eth", "ntilde", "ograve", "oacute", "ocircumflex", "otilde", "odieresis", "divide",
- "oslash", "ugrave", "uacute", "ucircumflex", "udieresis", "yacute", "thorn", "ydieresis",
-};
-const FX_LPCSTR AdobeSymbolEncodingNames[224] = {
- "space", "exclam", "universal", "numbersign", "existential", "percent", "ampersand", "suchthat",
- "parenleft", "parenright", "asteriskmath", "plus", "comma", "minus", "period", "slash",
- "zero", "one", "two", "three", "four", "five", "six", "seven",
- "eight", "nine", "colon", "semicolon", "less", "equal", "greater", "question",
- "congruent", "Alpha", "Beta", "Chi", "Delta", "Epsilon", "Phi", "Gamma",
- "Eta", "Iota", "theta1", "Kappa", "Lambda", "Mu", "Nu", "Omicron",
- "Pi", "Theta", "Rho", "Sigma", "Tau", "Upsilon", "sigma1", "Omega",
- "Xi", "Psi", "Zeta", "bracketleft", "therefore", "bracketright", "perpendicular", "underscore",
- "radicalex", "alpha", "beta", "chi", "delta", "epsilon", "phi", "gamma",
- "eta", "iota", "phi1", "kappa", "lambda", "mu", "nu", "omicron",
- "pi", "theta", "rho", "sigma", "tau", "upsilon", "omega1", "omega",
- "xi", "psi", "zeta", "braceleft", "bar", "braceright", "similar", NULL,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- "Euro", "Upsilon1", "minute", "lessequal", "fraction", "infinity", "florin", "club",
- "diamond", "heart", "spade", "arrowboth", "arrowleft", "arrowup", "arrowright", "arrowdown",
- "degree", "plusminus", "second", "greaterequal", "multiply", "proportional", "partialdiff", "bullet",
- "divide", "notequal", "equivalence", "approxequal", "ellipsis", "arrowvertex", "arrowhorizex", "carriagereturn",
- "aleph", "Ifraktur", "Rfraktur", "weierstrass", "circlemultiply", "circleplus", "emptyset", "intersection",
- "union", "propersuperset", "reflexsuperset", "notsubset", "propersubset", "reflexsubset", "element", "notelement",
- "angle", "gradient", "registerserif", "copyrightserif", "trademarkserif", "product", "radical", "dotmath",
- "logicalnot", "logicaland", "logicalor", "arrowdblboth", "arrowdblleft", "arrowdblup", "arrowdblright", "arrowdbldown",
- "lozenge", "angleleft", "registersans", "copyrightsans", "trademarksans", "summation", "parenlefttp", "parenleftex",
- "parenleftbt", "bracketlefttp", "bracketleftex", "bracketleftbt", "bracelefttp", "braceleftmid", "braceleftbt", "braceex",
- NULL, "angleright", "integral", "integraltp", "integralex", "integralbt", "parenrighttp", "parenrightex",
- "parenrightbt", "bracketrighttp", "bracketrightex", "bracketrightbt", "bracerighttp", "bracerightmid", "bracerightbt", NULL,
-};
-const FX_LPCSTR ZapfEncodingNames[224] = {
- "space", "a1", "a2", "a202", "a3", "a4", "a5", "a119",
- "a118", "a117", "a11", "a12", "a13", "a14", "a15", "a16",
- "a105", "a17", "a18", "a19", "a20", "a21", "a22", "a23",
- "a24", "a25", "a26", "a27", "a28", "a6", "a7", "a8",
- "a9", "a10", "a29", "a30", "a31", "a32", "a33", "a34",
- "a35", "a36", "a37", "a38", "a39", "a40", "a41", "a42",
- "a43", "a44", "a45", "a46", "a47", "a48", "a49", "a50",
- "a51", "a52", "a53", "a54", "a55", "a56", "a57", "a58",
- "a59", "a60", "a61", "a62", "a63", "a64", "a65", "a66",
- "a67", "a68", "a69", "a70", "a71", "a72", "a73", "a74",
- "a203", "a75", "a204", "a76", "a77", "a78", "a79", "a81",
- "a82", "a83", "a84", "a97", "a98", "a99", "a100", NULL,
- "a89", "a90", "a93", "a94", "a91", "a92", "a205", "a85",
- "a206", "a86", "a87", "a88", "a95", "a96", NULL, NULL,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, "a101", "a102", "a103", "a104", "a106", "a107", "a108",
- "a112", "a111", "a110", "a109", "a120", "a121", "a122", "a123",
- "a124", "a125", "a126", "a127", "a128", "a129", "a130", "a131",
- "a132", "a133", "a134", "a135", "a136", "a137", "a138", "a139",
- "a140", "a141", "a142", "a143", "a144", "a145", "a146", "a147",
- "a148", "a149", "a150", "a151", "a152", "a153", "a154", "a155",
- "a156", "a157", "a158", "a159", "a160", "a161", "a163", "a164",
- "a196", "a165", "a192", "a166", "a167", "a168", "a169", "a170",
- "a171", "a172", "a173", "a162", "a174", "a175", "a176", "a177",
- "a178", "a179", "a193", "a180", "a199", "a181", "a200", "a182",
- NULL, "a201", "a183", "a184", "a197", "a185", "a194", "a198",
- "a186", "a195", "a187", "a188", "a189", "a190", "a191", NULL
-};
-const FX_CHAR* PDF_CharNameFromPredefinedCharSet(int encoding, FX_BYTE charcode)
-{
- if (encoding == PDFFONT_ENCODING_PDFDOC) {
- if (charcode < 24) {
- return NULL;
- }
- charcode -= 24;
- } else {
- if (charcode < 32) {
- return NULL;
- }
- charcode -= 32;
- }
- switch (encoding) {
- case PDFFONT_ENCODING_WINANSI:
- return AdobeWinAnsiEncodingNames[charcode];
- case PDFFONT_ENCODING_MACROMAN:
- return MacRomanEncodingNames[charcode];
- case PDFFONT_ENCODING_MACEXPERT:
- return MacExpertEncodingNames[charcode];
- case PDFFONT_ENCODING_STANDARD:
- return StandardEncodingNames[charcode];
- case PDFFONT_ENCODING_ADOBE_SYMBOL:
- return AdobeSymbolEncodingNames[charcode];
- case PDFFONT_ENCODING_ZAPFDINGBATS:
- return ZapfEncodingNames[charcode];
- case PDFFONT_ENCODING_PDFDOC:
- return PDFDocEncodingNames[charcode];
- }
- return NULL;
-}
-FX_WCHAR FT_UnicodeFromCharCode(int encoding, FX_DWORD charcode)
-{
- switch (encoding) {
- case FXFT_ENCODING_UNICODE:
- return (FX_WORD)charcode;
- case FXFT_ENCODING_ADOBE_STANDARD:
- return StandardEncoding[(FX_BYTE)charcode];
- case FXFT_ENCODING_ADOBE_EXPERT:
- return MacExpertEncoding[(FX_BYTE)charcode];
- case FXFT_ENCODING_ADOBE_LATIN_1:
- return AdobeWinAnsiEncoding[(FX_BYTE)charcode];
- case FXFT_ENCODING_APPLE_ROMAN:
- return MacRomanEncoding[(FX_BYTE)charcode];
- case PDFFONT_ENCODING_PDFDOC:
- return PDFDocEncoding[(FX_BYTE)charcode];
- }
- return 0;
-}
-static FX_DWORD PDF_FindCode(const FX_WORD* pCodes, FX_WORD unicode)
-{
- for (FX_DWORD i = 0; i < 256; i ++)
- if (pCodes[i] == unicode) {
- return i;
- }
- return 0;
-}
-const FX_WORD MSSymbolEncoding[256] = {
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 32, 33, 8704, 35, 8707, 37, 38, 8715,
- 40, 41, 8727, 43, 44, 8722, 46, 47, 48, 49,
- 50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
- 60, 61, 62, 63, 8773, 913, 914, 935, 916, 917,
- 934, 915, 919, 921, 977, 922, 923, 924, 925, 927,
- 928, 920, 929, 931, 932, 933, 962, 937, 926, 936,
- 918, 91, 8756, 93, 8869, 95, 8254, 945, 946, 967,
- 948, 949, 966, 947, 951, 953, 981, 954, 955, 956,
- 957, 959, 960, 952, 961, 963, 964, 965, 982, 969,
- 958, 968, 950, 123, 124, 125, 8764, 0, 0, 0,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 978, 8242, 8804, 8725, 8734, 402, 9827, 9830, 9828,
- 9824, 8596, 8592, 8593, 8594, 8595, 176, 177, 8243, 8805,
- 215, 8733, 8706, 8729, 247, 8800, 8801, 8776, 8943, 0,
- 0, 8629, 0, 8465, 8476, 8472, 8855, 8853, 8709, 8745,
- 8746, 8835, 8839, 8836, 8834, 8838, 8712, 8713, 8736, 8711,
- 174, 169, 8482, 8719, 8730, 8901, 172, 8743, 8744, 8660,
- 8656, 8657, 8658, 8659, 9674, 9001, 0, 0, 0, 8721,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0x0000, 9002, 8747, 8992, 0, 8993, 0, 0, 0, 0,
- 0, 0, 0x0000, 0x0000, 0x0000, 0x0000
-};
-FX_DWORD FT_CharCodeFromUnicode(int encoding, FX_WCHAR unicode)
-{
- switch (encoding) {
- case FXFT_ENCODING_UNICODE:
- return unicode;
- case FXFT_ENCODING_ADOBE_STANDARD:
- return PDF_FindCode(StandardEncoding, unicode);
- case FXFT_ENCODING_ADOBE_EXPERT:
- return PDF_FindCode(MacExpertEncoding, unicode);
- case FXFT_ENCODING_ADOBE_LATIN_1:
- return PDF_FindCode(AdobeWinAnsiEncoding, unicode);
- case FXFT_ENCODING_APPLE_ROMAN:
- return PDF_FindCode(MacRomanEncoding, unicode);
- case FXFT_ENCODING_ADOBE_CUSTOM:
- return PDF_FindCode(PDFDocEncoding, unicode);
- case FXFT_ENCODING_MS_SYMBOL:
- return PDF_FindCode(MSSymbolEncoding, unicode);
- }
- return 0;
-}
-const FX_WORD* PDF_UnicodesForPredefinedCharSet(int encoding)
-{
- switch (encoding) {
- case PDFFONT_ENCODING_WINANSI:
- return AdobeWinAnsiEncoding;
- case PDFFONT_ENCODING_MACROMAN:
- return MacRomanEncoding;
- case PDFFONT_ENCODING_MACEXPERT:
- return MacExpertEncoding;
- case PDFFONT_ENCODING_STANDARD:
- return StandardEncoding;
- case PDFFONT_ENCODING_ADOBE_SYMBOL:
- return AdobeSymbolEncoding;
- case PDFFONT_ENCODING_ZAPFDINGBATS:
- return ZapfEncoding;
- case PDFFONT_ENCODING_PDFDOC:
- return PDFDocEncoding;
- case PDFFONT_ENCODING_MS_SYMBOL:
- return MSSymbolEncoding;
- }
- return NULL;
-}
-FX_DWORD PDF_PredefinedCharCodeFromUnicode(int encoding, FX_WCHAR unicode)
-{
- return PDF_FindCode(PDF_UnicodesForPredefinedCharSet(encoding), unicode);
-}
-#ifdef __cplusplus
-extern "C" {
-#endif
-extern int FXFT_unicode_from_adobe_name(const char* name);
-#ifdef __cplusplus
-}
-#endif
-FX_WCHAR PDF_UnicodeFromAdobeName(const FX_CHAR* name)
-{
- return (FX_WCHAR)(FXFT_unicode_from_adobe_name(name) & 0x7FFFFFFF);
-}
-CFX_ByteString PDF_AdobeNameFromUnicode(FX_WCHAR unicode)
-{
- char glyph_name[64];
- FXFT_adobe_name_from_unicode(glyph_name, unicode);
- return CFX_ByteString(glyph_name, -1);
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fpdfapi/fpdf_page.h"
+#include "../../../include/fxge/fx_freetype.h"
+extern FX_WCHAR PDF_UnicodeFromAdobeName(const FX_CHAR*);
+const struct _UnicodeAlt {
+ FX_WORD m_Unicode;
+ const FX_CHAR* m_Alter;
+}
+UnicodeAlts[] = {
+ {0x00a0, " "}, {0x00a1, "!"}, {0x00a2, "c"}, {0x00a3, "P"}, {0x00a4, "o"},
+ {0x00a5, "Y"}, {0x00a6, "|"}, {0x00a7, "S"}, {0x00a9, "(C)"}, {0x00aa, "a"},
+ {0x00ab, "<<"}, {0x00ac, "-|"}, {0x00ae, "(R)"}, {0x00af, "-"},
+ {0x00b0, "o"}, {0x00b1, "+/-"}, {0x00b2, "^2"}, { 0x00b3, "^3"},
+ {0x00b4, "'"}, {0x00b5, "u"}, {0x00b6, "P"}, {0x00b7, "."},
+ {0x00b9, "^1"}, {0x00ba, "o"}, {0x00bb, ">>"}, {0x00bc, "1/4"},
+ {0x00bd, "1/2"}, {0x00be, "3/4"}, {0x00bf, "?"}, {0x00c0, "A"},
+ {0x00c1, "A"}, {0x00c2, "A"}, {0x00c3, "A"}, {0x00c4, "A"},
+ {0x00c5, "A"}, {0x00c6, "AE"}, {0x00c7, "C"}, {0x00c8, "E"},
+ {0x00c9, "E"}, {0x00ca, "E"}, {0x00cb, "E"}, {0x00cc, "I"},
+ {0x00cd, "I"}, {0x00ce, "I"}, {0x00cf, "I"},
+ {0x00d1, "N"}, {0x00d2, "O"}, {0x00d3, "O"}, {0x00d4, "O"},
+ {0x00d5, "O"}, {0x00d6, "O"}, {0x00d7, "x"}, {0x00d8, "O"},
+ {0x00d9, "U"}, {0x00da, "U"}, {0x00db, "U"}, {0x00dc, "U"},
+ {0x00dd, "Y"}, {0x00df, "S"}, {0x00e0, "a"},
+ {0x00e1, "a"}, {0x00e2, "a"}, {0x00e3, "a"}, {0x00e4, "a"},
+ {0x00e5, "a"}, {0x00e6, "ae"}, {0x00e7, "c"}, {0x00e8, "e"},
+ {0x00e9, "e"}, {0x00ea, "e"}, {0x00eb, "e"}, {0x00ec, "i"},
+ {0x00ed, "i"}, {0x00ee, "i"}, {0x00ef, "i"},
+ {0x00f1, "n"}, {0x00f2, "o"}, {0x00f3, "o"}, {0x00f4, "o"},
+ {0x00f5, "o"}, {0x00f6, "o"}, {0x00f7, "/"}, {0x00f8, "o"},
+ {0x00f9, "u"}, {0x00fa, "u"}, {0x00fb, "u"}, {0x00fc, "u"},
+ {0x00fd, "y"}, {0x00ff, "y"},
+ {0x02b0, "h"}, {0x02b2, "j"}, {0x02b3, "r"}, {0x02b7, "w"},
+ {0x02b8, "y"}, {0x02b9, "'"}, {0x02ba, "\""}, {0x02bb, "'"},
+ {0x02bc, "'"}, {0x02bd, "'"}, {0x02be, "'"}, {0x02bf, "'"},
+ {0x02c2, "<"}, {0x02c3, ">"}, {0x02c4, "^"}, {0x02c5, "v"},
+ {0x02c6, "^"}, {0x02c7, "v"}, {0x02c8, "'"}, {0x02c9, "-"},
+ {0x02ca, "'"}, {0x02cb, "'"}, {0x02cc, "."}, {0x02cd, "_"},
+ {0x2010, "-"}, {0x2012, "-"}, {0x2013, "-"}, {0x2014, "--"},
+ {0x2015, "--"}, {0x2016, "|"}, {0x2017, "_"},
+ {0x2018, "'"}, {0x2019, "'"}, {0x201a, ","}, {0x201b, "'"},
+ {0x201c, "\""}, {0x201d, "\""}, {0x201e, ","}, {0x201f, "'"},
+ {0x2020, "+"}, {0x2021, "+"}, {0x2022, "*"}, {0x2023, ">"},
+ {0x2024, "."}, {0x2025, ".."}, {0x2027, "."}, {0x2032, "'"},
+ {0x2033, "\""}, {0x2035, "'"}, {0x2036, "\""}, {0x2038, "^"},
+ {0x2039, "<"}, {0x203a, ">"}, {0x203b, "*"}, {0x203c, "!!"},
+ {0x203d, "?!"}, {0x203e, "-"}, {0x2044, "/"}, {0x2047, "??"},
+ {0x2048, "?!"}, {0x2049, "!?"}, {0x204e, "*"}, {0x2052, "%"},
+ {0x2122, "(TM)"},
+ {0x2212, "-"}, {0x2215, "/"}, {0x2216, "\\"}, {0x2217, "*"},
+ {0x2218, "*"}, {0x2219, "*"}, {0x2223, "|"}, {0x22c5, "."},
+ {0x266f, "#"},
+ {0XF6D9, "(C)"}, {0XF6DA, "(C)"}, {0XF6DB, "(TM)"},
+ {0XF8E8, "(C)"}, {0xf8e9, "(C)"}, {0XF8EA, "(TM)"},
+
+ {0xfb01, "fi"}, {0xfb02, "fl"}
+};
+const FX_CHAR* FCS_GetAltStr(FX_WCHAR unicode)
+{
+ int begin = 0;
+ int end = sizeof UnicodeAlts / sizeof(struct _UnicodeAlt) - 1;
+ while (begin <= end) {
+ int middle = (begin + end) / 2;
+ FX_WORD middlecode = UnicodeAlts[middle].m_Unicode;
+ if (middlecode > unicode) {
+ end = middle - 1;
+ } else if (middlecode < unicode) {
+ begin = middle + 1;
+ } else {
+ return UnicodeAlts[middle].m_Alter;
+ }
+ }
+ return NULL;
+}
+const FX_WORD StandardEncoding[256] = {
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x2019,
+ 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, 0x0030, 0x0031,
+ 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b,
+ 0x003c, 0x003d, 0x003e, 0x003f, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045,
+ 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059,
+ 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, 0x2018, 0x0061, 0x0062, 0x0063,
+ 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d,
+ 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
+ 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x00a1, 0x00a2, 0x00a3, 0x2044, 0x00a5, 0x0192, 0x00a7, 0x00a4, 0x0027,
+ 0x201c, 0x00ab, 0x2039, 0x203a, 0xfb01, 0xfb02, 0x0000, 0x2013, 0x2020, 0x2021,
+ 0x00b7, 0x0000, 0x00b6, 0x2022, 0x201a, 0x201e, 0x201d, 0x00bb, 0x2026, 0x2030,
+ 0x0000, 0x00bf, 0x0000, 0x0060, 0x00b4, 0x02c6, 0x02dc, 0x00af, 0x02d8, 0x02d9,
+ 0x00a8, 0x0000, 0x02da, 0x00b8, 0x0000, 0x02dd, 0x02db, 0x02c7, 0x2014, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00c6, 0x0000, 0x00aa, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0141, 0x00d8, 0x0152, 0x00ba, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x00e6, 0x0000, 0x0000, 0x0000, 0x0131, 0x0000, 0x0000, 0x0142, 0x00f8,
+ 0x0153, 0x00df, 0x0000, 0x0000, 0x0000, 0x0000
+};
+const FX_WORD MacRomanEncoding[256] = {
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
+ 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, 0x0030, 0x0031,
+ 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b,
+ 0x003c, 0x003d, 0x003e, 0x003f, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045,
+ 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059,
+ 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, 0x0060, 0x0061, 0x0062, 0x0063,
+ 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d,
+ 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
+ 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x0000, 0x00c4, 0x00c5,
+ 0x00c7, 0x00c9, 0x00d1, 0x00d6, 0x00dc, 0x00e1, 0x00e0, 0x00e2, 0x00e4, 0x00e3,
+ 0x00e5, 0x00e7, 0x00e9, 0x00e8, 0x00ea, 0x00eb, 0x00ed, 0x00ec, 0x00ee, 0x00ef,
+ 0x00f1, 0x00f3, 0x00f2, 0x00f4, 0x00f6, 0x00f5, 0x00fa, 0x00f9, 0x00fb, 0x00fc,
+ 0x2020, 0x00b0, 0x00a2, 0x00a3, 0x00a7, 0x2022, 0x00b6, 0x00df, 0x00ae, 0x00a9,
+ 0x2122, 0x00b4, 0x00a8, 0x0000, 0x00c6, 0x00d8, 0x0000, 0x00b1, 0x0000, 0x0000,
+ 0x00a5, 0x00b5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00aa, 0x00ba, 0x0000,
+ 0x00e6, 0x00f8, 0x00bf, 0x00a3, 0x00ac, 0x0000, 0x0192, 0x0000, 0x0000, 0x00ab,
+ 0x00bb, 0x2026, 0x0020, 0x00c0, 0x00c3, 0x00d5, 0x0152, 0x0153, 0x2013, 0x2014,
+ 0x201c, 0x201d, 0x2018, 0x2019, 0x00f7, 0x0000, 0x00ff, 0x0178, 0x2044, 0x00a4,
+ 0x2039, 0x203a, 0xfb01, 0xfb02, 0x2021, 0x00b7, 0x201a, 0x201e, 0x2030, 0x00c2,
+ 0x00ca, 0x00c1, 0x00cb, 0x00c8, 0x00cd, 0x00ce, 0x00cf, 0x00cc, 0x00d3, 0x00d4,
+ 0x0000, 0x00d2, 0x00da, 0x00db, 0x00d9, 0x0131, 0x02c6, 0x02dc, 0x00af, 0x02d8,
+ 0x02d9, 0x02da, 0x00b8, 0x02dd, 0x02db, 0x02c7
+};
+const FX_WORD AdobeWinAnsiEncoding[256] = {
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
+ 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
+ 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
+ 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
+ 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
+ 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
+ 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x2022,
+ 0x20ac, 0x2022, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021,
+ 0x02c6, 0x2030, 0x0160, 0x2039, 0x0152, 0x2022, 0x017d, 0x2022,
+ 0x2022, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014,
+ 0x02dc, 0x2122, 0x0161, 0x203a, 0x0153, 0x2022, 0x017e, 0x0178,
+ 0x0020, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7,
+ 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x002d, 0x00ae, 0x00af,
+ 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7,
+ 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf,
+ 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7,
+ 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
+ 0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7,
+ 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df,
+ 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7,
+ 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
+ 0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7,
+ 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff
+};
+extern const FX_WORD PDFDocEncoding[256];
+const FX_WORD MacExpertEncoding[256] = {
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0020, 0xf721, 0xf6f8, 0xf7a2, 0xf724, 0xf6e4, 0xf726, 0xf7b4,
+ 0x207d, 0x207e, 0x2025, 0x2024, 0x002c, 0x002d, 0x002e, 0x2044, 0xf730, 0xf731,
+ 0xf732, 0xf733, 0xf734, 0xf735, 0xf736, 0xf737, 0xf738, 0xf739, 0x003a, 0x003b,
+ 0x0000, 0xf6de, 0x0000, 0xf73f, 0x0000, 0x0000, 0x0000, 0x0000, 0xf7f0, 0x0000,
+ 0x0000, 0x00bc, 0x00bd, 0x00be, 0x215b, 0x215c, 0x215d, 0x215e, 0x2153, 0x2154,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfb00, 0xfb01, 0xfb02, 0xfb03,
+ 0xfb04, 0x208d, 0x0000, 0x208e, 0xf6f6, 0xf6e5, 0xf760, 0xf761, 0xf762, 0xf763,
+ 0xf764, 0xf765, 0xf766, 0xf767, 0xf768, 0xf769, 0xf76a, 0xf76b, 0xf76c, 0xf76d,
+ 0xf76e, 0xf76f, 0xf770, 0xf771, 0xf772, 0xf773, 0xf774, 0xf775, 0xf776, 0xf777,
+ 0xf778, 0xf779, 0xf77a, 0x20a1, 0xf6dc, 0xf6dd, 0xf6fe, 0x0000, 0x0000, 0xf6e9,
+ 0xf6e0, 0x0000, 0x0000, 0x0000, 0x0000, 0xf7e1, 0xf7e0, 0xf7e2, 0xf7e4, 0xf7e3,
+ 0xf7e5, 0xf7e7, 0xf7e9, 0xf7e8, 0xf7ea, 0xf7eb, 0xf7ed, 0xf7ec, 0xf7ee, 0xf7ef,
+ 0xf7f1, 0xf7f3, 0xf7f2, 0xf7f4, 0xf7f6, 0xf7f5, 0xf7fa, 0xf7f9, 0xf7fb, 0xf7fc,
+ 0x0000, 0x2078, 0x2084, 0x2083, 0x2086, 0x2088, 0x2087, 0xf6fd, 0x0000, 0xf6df,
+ 0x2082, 0x0000, 0xf7a8, 0x0000, 0xf6f5, 0xf6fd, 0x2085, 0x0000, 0xf6e1, 0xf6e7,
+ 0xf7fd, 0x0000, 0xf6e3, 0x0000, 0x0000, 0xf7fe, 0x0000, 0x2089, 0x2080, 0xf6ff,
+ 0xf7e6, 0xf7f8, 0xf7bf, 0x2081, 0xf6e9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0xf7b8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf6fa, 0x2012, 0xf6e6,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0xf7a1, 0x0000, 0xf7ff, 0x0000, 0x00b9, 0x00b2,
+ 0x00b3, 0x2074, 0x2075, 0x2076, 0x2077, 0x2079, 0x2070, 0x0000, 0xf6ec, 0xf6f1,
+ 0x0000, 0x0000, 0x0000, 0xf6ed, 0xf6f2, 0xf6eb, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0xf6ee, 0xf6fb, 0xf6f4, 0xf7af, 0xf6ea, 0x207f, 0xf6ef, 0xf6e2, 0xf6e8,
+ 0xf6f7, 0xf6fc, 0x0000, 0x0000, 0x0000, 0x0000
+};
+const FX_WORD AdobeSymbolEncoding[256] = {
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0020, 0x0021, 0x2200, 0x0023, 0x2203, 0x0025, 0x0026, 0x220B,
+ 0x0028, 0x0029, 0x2217, 0x002B, 0x002C, 0x2212, 0x002E, 0x002F,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
+ 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
+ 0x2245, 0x0391, 0x0392, 0x03A7, 0x0394, 0x0395, 0x03A6, 0x0393,
+ 0x0397, 0x0399, 0x03D1, 0x039A, 0x039B, 0x039C, 0x039D, 0x039F,
+ 0x03A0, 0x0398, 0x03A1, 0x03A3, 0x03A4, 0x03A5, 0x03C2, 0x03A9,
+ 0x039E, 0x03A8, 0x0396, 0x005B, 0x2234, 0x005D, 0x22A5, 0x005F,
+ 0xF8E5, 0x03B1, 0x03B2, 0x03C7, 0x03B4, 0x03B5, 0x03C6, 0x03B3,
+ 0x03B7, 0x03B9, 0x03D5, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BF,
+ 0x03C0, 0x03B8, 0x03C1, 0x03C3, 0x03C4, 0x03C5, 0x03D6, 0x03C9,
+ 0x03BE, 0x03C8, 0x03B6, 0x007B, 0x007C, 0x007D, 0x223C, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x20AC, 0x03D2, 0x2032, 0x2264, 0x2044, 0x221E, 0x0192, 0x2663,
+ 0x2666, 0x2665, 0x2660, 0x2194, 0x2190, 0x2191, 0x2192, 0x2193,
+ 0x00B0, 0x00B1, 0x2033, 0x2265, 0x00D7, 0x221D, 0x2202, 0x2022,
+ 0x00F7, 0x2260, 0x2261, 0x2248, 0x2026, 0xF8E6, 0xF8E7, 0x21B5,
+ 0x2135, 0x2111, 0x211C, 0x2118, 0x2297, 0x2295, 0x2205, 0x2229,
+ 0x222A, 0x2283, 0x2287, 0x2284, 0x2282, 0x2286, 0x2208, 0x2209,
+ 0x2220, 0x2207, 0xF6DA, 0xF6D9, 0xF6DB, 0x220F, 0x221A, 0x22C5,
+ 0x00AC, 0x2227, 0x2228, 0x21D4, 0x21D0, 0x21D1, 0x21D2, 0x21D3,
+ 0x25CA, 0x2329, 0xF8E8, 0xF8E9, 0xF8EA, 0x2211, 0xF8EB, 0xF8EC,
+ 0xF8ED, 0xF8EE, 0xF8EF, 0xF8F0, 0xF8F1, 0xF8F2, 0xF8F3, 0xF8F4,
+ 0x0000, 0x232A, 0x222B, 0x2320, 0xF8F5, 0x2321, 0xF8F6, 0xF8F7,
+ 0xF8F8, 0xF8F9, 0xF8FA, 0xF8FB, 0xF8FC, 0xF8FD, 0xF8FE, 0x0000,
+};
+const FX_WORD ZapfEncoding[256] = {
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0020, 0x2701, 0x2702, 0x2703, 0x2704, 0x260E, 0x2706, 0x2707,
+ 0x2708, 0x2709, 0x261B, 0x261E, 0x270C, 0x270D, 0x270E, 0x270F,
+ 0x2710, 0x2711, 0x2712, 0x2713, 0x2714, 0x2715, 0x2716, 0x2717,
+ 0x2718, 0x2719, 0x271A, 0x271B, 0x271C, 0x271D, 0x271E, 0x271F,
+ 0x2720, 0x2721, 0x2722, 0x2723, 0x2724, 0x2725, 0x2726, 0x2727,
+ 0x2605, 0x2729, 0x272A, 0x272B, 0x272C, 0x272D, 0x272E, 0x272F,
+ 0x2730, 0x2731, 0x2732, 0x2733, 0x2734, 0x2735, 0x2736, 0x2737,
+ 0x2738, 0x2739, 0x273A, 0x273B, 0x273C, 0x273D, 0x273E, 0x273F,
+ 0x2740, 0x2741, 0x2742, 0x2743, 0x2744, 0x2745, 0x2746, 0x2747,
+ 0x2748, 0x2749, 0x274A, 0x274B, 0x25CF, 0x274D, 0x25A0, 0x274F,
+ 0x2750, 0x2751, 0x2752, 0x25B2, 0x25BC, 0x25C6, 0x2756, 0x25D7,
+ 0x2758, 0x2759, 0x275A, 0x275B, 0x275C, 0x275D, 0x275E, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x2761, 0x2762, 0x2763, 0x2764, 0x2765, 0x2766, 0x2767,
+ 0x2663, 0x2666, 0x2665, 0x2660, 0x2460, 0x2461, 0x2462, 0x2463,
+ 0x2464, 0x2465, 0x2466, 0x2467, 0x2468, 0x2469, 0x2776, 0x2777,
+ 0x2778, 0x2779, 0x277A, 0x277B, 0x277C, 0x277D, 0x277E, 0x277F,
+ 0x2780, 0x2781, 0x2782, 0x2783, 0x2784, 0x2785, 0x2786, 0x2787,
+ 0x2788, 0x2789, 0x278A, 0x278B, 0x278C, 0x278D, 0x278E, 0x278F,
+ 0x2790, 0x2791, 0x2792, 0x2793, 0x2794, 0x2192, 0x2194, 0x2195,
+ 0x2798, 0x2799, 0x279A, 0x279B, 0x279C, 0x279D, 0x279E, 0x279F,
+ 0x27A0, 0x27A1, 0x27A2, 0x27A3, 0x27A4, 0x27A5, 0x27A6, 0x27A7,
+ 0x27A8, 0x27A9, 0x27AA, 0x27AB, 0x27AC, 0x27AD, 0x27AE, 0x27AF,
+ 0x0000, 0x27B1, 0x27B2, 0x27B3, 0x27B4, 0x27B5, 0x27B6, 0x27B7,
+ 0x27B8, 0x27B9, 0x27BA, 0x27BB, 0x27BC, 0x27BD, 0x27BE, 0x0000,
+};
+const FX_LPCSTR StandardEncodingNames[224] = {
+ "space", "exclam", "quotedbl", "numbersign", "dollar", "percent", "ampersand", "quoteright",
+ "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",
+ "quoteleft", "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", NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, "exclamdown", "cent", "sterling", "fraction", "yen", "florin", "section",
+ "currency", "quotesingle", "quotedblleft", "guillemotleft", "guilsinglleft", "guilsinglright", "fi", "fl",
+ NULL, "endash", "dagger", "daggerdbl", "periodcentered", NULL, "paragraph", "bullet",
+ "quotesinglbase", "quotedblbase", "quotedblright", "guillemotright", "ellipsis", "perthousand", NULL, "questiondown",
+ NULL, "grave", "acute", "circumflex", "tilde", "macron", "breve", "dotaccent",
+ "dieresis", NULL, "ring", "cedilla", NULL, "hungarumlaut", "ogonek", "caron",
+ "emdash", NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, "AE", NULL, "ordfeminine", NULL, NULL, NULL, NULL,
+ "Lslash", "Oslash", "OE", "ordmasculine", NULL, NULL, NULL, NULL,
+ NULL, "ae", NULL, NULL, NULL, "dotlessi", NULL, NULL,
+ "lslash", "oslash", "oe", "germandbls", NULL, NULL, NULL, NULL,
+};
+const FX_LPCSTR AdobeWinAnsiEncodingNames[224] = {
+ "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", "bullet",
+ "Euro", "bullet", "quotesinglbase", "florin", "quotedblbase", "ellipsis", "dagger", "daggerdbl",
+ "circumflex", "perthousand", "Scaron", "guilsinglleft", "OE", "bullet", "Zcaron", "bullet",
+ "bullet", "quoteleft", "quoteright", "quotedblleft", "quotedblright", "bullet", "endash", "emdash",
+ "tilde", "trademark", "scaron", "guilsinglright", "oe", "bullet", "zcaron", "Ydieresis",
+ "space", "exclamdown", "cent", "sterling", "currency", "yen", "brokenbar", "section",
+ "dieresis", "copyright", "ordfeminine", "guillemotleft", "logicalnot", "hyphen", "registered", "macron",
+ "degree", "plusminus", "twosuperior", "threesuperior", "acute", "mu", "paragraph", "periodcentered",
+ "cedilla", "onesuperior", "ordmasculine", "guillemotright", "onequarter", "onehalf", "threequarters", "questiondown",
+ "Agrave", "Aacute", "Acircumflex", "Atilde", "Adieresis", "Aring", "AE", "Ccedilla",
+ "Egrave", "Eacute", "Ecircumflex", "Edieresis", "Igrave", "Iacute", "Icircumflex", "Idieresis",
+ "Eth", "Ntilde", "Ograve", "Oacute", "Ocircumflex", "Otilde", "Odieresis", "multiply",
+ "Oslash", "Ugrave", "Uacute", "Ucircumflex", "Udieresis", "Yacute", "Thorn", "germandbls",
+ "agrave", "aacute", "acircumflex", "atilde", "adieresis", "aring", "ae", "ccedilla",
+ "egrave", "eacute", "ecircumflex", "edieresis", "igrave", "iacute", "icircumflex", "idieresis",
+ "eth", "ntilde", "ograve", "oacute", "ocircumflex", "otilde", "odieresis", "divide",
+ "oslash", "ugrave", "uacute", "ucircumflex", "udieresis", "yacute", "thorn", "ydieresis",
+};
+const FX_LPCSTR MacRomanEncodingNames[224] = {
+ "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", NULL,
+ "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", "space", "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",
+};
+const FX_LPCSTR MacExpertEncodingNames[224] = {
+ "space", "exclamsmall", "Hungarumlautsmall", "centoldstyle", "dollaroldstyle", "dollarsuperior", "ampersandsmall", "Acutesmall",
+ "parenleftsuperior", "parenrightsuperior", "twodotenleader", "onedotenleader", "comma", "hyphen", "period", "fraction",
+ "zerooldstyle", "oneoldstyle", "twooldstyle", "threeoldstyle", "fouroldstyle", "fiveoldstyle", "sixoldstyle", "sevenoldstyle",
+ "eightoldstyle", "nineoldstyle", "colon", "semicolon", NULL, "threequartersemdash", NULL, "questionsmall",
+ NULL, NULL, NULL, NULL, "Ethsmall", NULL, NULL, "onequarter",
+ "onehalf", "threequarters", "oneeighth", "threeeighths", "fiveeighths", "seveneighths", "onethird", "twothirds",
+ NULL, NULL, NULL, NULL, NULL, NULL, "ff", "fi",
+ "fl", "ffi", "ffl", "parenleftinferior", NULL, "parenrightinferior", "Circumflexsmall", "hypheninferior",
+ "Gravesmall", "Asmall", "Bsmall", "Csmall", "Dsmall", "Esmall", "Fsmall", "Gsmall",
+ "Hsmall", "Ismall", "Jsmall", "Ksmall", "Lsmall", "Msmall", "Nsmall", "Osmall",
+ "Psmall", "Qsmall", "Rsmall", "Ssmall", "Tsmall", "Usmall", "Vsmall", "Wsmall",
+ "Xsmall", "Ysmall", "Zsmall", "colonmonetary", "onefitted", "rupiah", "Tildesmall", NULL,
+ NULL, "asuperior", "centsuperior", NULL, NULL, NULL, NULL, "Aacutesmall",
+ "Agravesmall", "Acircumflexsmall", "Adieresissmall", "Atildesmall", "Aringsmall", "Ccedillasmall", "Eacutesmall", "Egravesmall",
+ "Ecircumflexsmall", "Edieresissmall", "Iacutesmall", "Igravesmall", "Icircumflexsmall", "Idieresissmall", "Ntildesmall", "Oacutesmall",
+ "Ogravesmall", "Ocircumflexsmall", "Odieresissmall", "Otildesmall", "Uacutesmall", "Ugravesmall", "Ucircumflexsmall", "Udieresissmall",
+ NULL, "eightsuperior", "fourinferior", "threeinferior", "sixinferior", "eightinferior", "seveninferior", "Scaronsmall",
+ NULL, "centinferior", "twoinferior", NULL, "Dieresissmall", NULL, "Caronsmall", "Scaronsmall",
+ "fiveinferior", NULL, "commainferior", "periodinferior", "Yacutesmall", NULL, "dollarinferior", NULL,
+ NULL, "Thornsmall", NULL, "nineinferior", "zeroinferior", "Zcaronsmall", "AEsmall", "Oslashsmall",
+ "questiondownsmall", "oneinferior", "asuperior", NULL, NULL, NULL, NULL, NULL,
+ NULL, "Cedillasmall", NULL, NULL, NULL, NULL, NULL, "OEsmall",
+ "figuredash", "hyphensuperior", NULL, NULL, NULL, NULL, "exclamdownsmall", NULL,
+ "Ydieresissmall", NULL, "onesuperior", "twosuperior", "threesuperior", "foursuperior", "fivesuperior", "sixsuperior",
+ "sevensuperior", "ninesuperior", "zerosuperior", NULL, "esuperior", "rsuperior", NULL, NULL,
+ NULL, "isuperior", "ssuperior", "dsuperior", NULL, NULL, NULL, NULL,
+ NULL, "lsuperior", "Ogoneksmall", "Brevesmall", "Macronsmall", "bsuperior", "nsuperior", "msuperior",
+ "commasuperior", "periodsuperior", "Dotaccentsmall", "Ringsmall", NULL, NULL, NULL, NULL,
+};
+const FX_LPCSTR PDFDocEncodingNames[232] = {
+ "breve", "caron", "circumflex", "dotaccent", "hungarumlaut", "ogonek", "ring", "tilde",
+ "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", NULL,
+ "bullet3", "dagger", "daggerdbl", "ellipsis", "emdash", "endash", "florin", "fraction",
+ "guilsinglleft", "guilsinglright", "minus", "perthousand", "quotedblbase", "quotedblleft", "quotedblright", "quoteleft",
+ "quoteright", "quotesinglbase", "trademark", "fi", "fl", "Lslash", "OE", "Scaron",
+ "Ydieresis", "Zcaron2", "dotlessi", "lslash", "oe", "scaron", "zcaron2", NULL,
+ "Euro", "exclamdown", "cent", "sterling", "currency", "yen", "brokenbar", "section",
+ "dieresis", "copyright", "ordfeminine", "guillemotleft4", "logicalnot", NULL, "registered", "macron",
+ "degree", "plusminus", "twosuperior", "threesuperior", "acute", "mu", "paragraph", "periodcentered",
+ "cedilla", "onesuperior", "ordmasculine", "guillemotright4", "onequarter", "onehalf", "threequarters", "questiondown",
+ "Agrave", "Aacute", "Acircumflex", "Atilde", "Adieresis", "Aring", "AE", "Ccedilla",
+ "Egrave", "Eacute", "Ecircumflex", "Edieresis", "Igrave", "Iacute", "Icircumflex", "Idieresis",
+ "Eth", "Ntilde", "Ograve", "Oacute", "Ocircumflex", "Otilde", "Odieresis", "multiply",
+ "Oslash", "Ugrave", "Uacute", "Ucircumflex", "Udieresis", "Yacute", "Thorn", "germandbls",
+ "agrave", "aacute", "acircumflex", "atilde", "adieresis", "aring", "ae", "ccedilla",
+ "egrave", "eacute", "ecircumflex", "edieresis", "igrave", "iacute", "icircumflex", "idieresis",
+ "eth", "ntilde", "ograve", "oacute", "ocircumflex", "otilde", "odieresis", "divide",
+ "oslash", "ugrave", "uacute", "ucircumflex", "udieresis", "yacute", "thorn", "ydieresis",
+};
+const FX_LPCSTR AdobeSymbolEncodingNames[224] = {
+ "space", "exclam", "universal", "numbersign", "existential", "percent", "ampersand", "suchthat",
+ "parenleft", "parenright", "asteriskmath", "plus", "comma", "minus", "period", "slash",
+ "zero", "one", "two", "three", "four", "five", "six", "seven",
+ "eight", "nine", "colon", "semicolon", "less", "equal", "greater", "question",
+ "congruent", "Alpha", "Beta", "Chi", "Delta", "Epsilon", "Phi", "Gamma",
+ "Eta", "Iota", "theta1", "Kappa", "Lambda", "Mu", "Nu", "Omicron",
+ "Pi", "Theta", "Rho", "Sigma", "Tau", "Upsilon", "sigma1", "Omega",
+ "Xi", "Psi", "Zeta", "bracketleft", "therefore", "bracketright", "perpendicular", "underscore",
+ "radicalex", "alpha", "beta", "chi", "delta", "epsilon", "phi", "gamma",
+ "eta", "iota", "phi1", "kappa", "lambda", "mu", "nu", "omicron",
+ "pi", "theta", "rho", "sigma", "tau", "upsilon", "omega1", "omega",
+ "xi", "psi", "zeta", "braceleft", "bar", "braceright", "similar", NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ "Euro", "Upsilon1", "minute", "lessequal", "fraction", "infinity", "florin", "club",
+ "diamond", "heart", "spade", "arrowboth", "arrowleft", "arrowup", "arrowright", "arrowdown",
+ "degree", "plusminus", "second", "greaterequal", "multiply", "proportional", "partialdiff", "bullet",
+ "divide", "notequal", "equivalence", "approxequal", "ellipsis", "arrowvertex", "arrowhorizex", "carriagereturn",
+ "aleph", "Ifraktur", "Rfraktur", "weierstrass", "circlemultiply", "circleplus", "emptyset", "intersection",
+ "union", "propersuperset", "reflexsuperset", "notsubset", "propersubset", "reflexsubset", "element", "notelement",
+ "angle", "gradient", "registerserif", "copyrightserif", "trademarkserif", "product", "radical", "dotmath",
+ "logicalnot", "logicaland", "logicalor", "arrowdblboth", "arrowdblleft", "arrowdblup", "arrowdblright", "arrowdbldown",
+ "lozenge", "angleleft", "registersans", "copyrightsans", "trademarksans", "summation", "parenlefttp", "parenleftex",
+ "parenleftbt", "bracketlefttp", "bracketleftex", "bracketleftbt", "bracelefttp", "braceleftmid", "braceleftbt", "braceex",
+ NULL, "angleright", "integral", "integraltp", "integralex", "integralbt", "parenrighttp", "parenrightex",
+ "parenrightbt", "bracketrighttp", "bracketrightex", "bracketrightbt", "bracerighttp", "bracerightmid", "bracerightbt", NULL,
+};
+const FX_LPCSTR ZapfEncodingNames[224] = {
+ "space", "a1", "a2", "a202", "a3", "a4", "a5", "a119",
+ "a118", "a117", "a11", "a12", "a13", "a14", "a15", "a16",
+ "a105", "a17", "a18", "a19", "a20", "a21", "a22", "a23",
+ "a24", "a25", "a26", "a27", "a28", "a6", "a7", "a8",
+ "a9", "a10", "a29", "a30", "a31", "a32", "a33", "a34",
+ "a35", "a36", "a37", "a38", "a39", "a40", "a41", "a42",
+ "a43", "a44", "a45", "a46", "a47", "a48", "a49", "a50",
+ "a51", "a52", "a53", "a54", "a55", "a56", "a57", "a58",
+ "a59", "a60", "a61", "a62", "a63", "a64", "a65", "a66",
+ "a67", "a68", "a69", "a70", "a71", "a72", "a73", "a74",
+ "a203", "a75", "a204", "a76", "a77", "a78", "a79", "a81",
+ "a82", "a83", "a84", "a97", "a98", "a99", "a100", NULL,
+ "a89", "a90", "a93", "a94", "a91", "a92", "a205", "a85",
+ "a206", "a86", "a87", "a88", "a95", "a96", NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, "a101", "a102", "a103", "a104", "a106", "a107", "a108",
+ "a112", "a111", "a110", "a109", "a120", "a121", "a122", "a123",
+ "a124", "a125", "a126", "a127", "a128", "a129", "a130", "a131",
+ "a132", "a133", "a134", "a135", "a136", "a137", "a138", "a139",
+ "a140", "a141", "a142", "a143", "a144", "a145", "a146", "a147",
+ "a148", "a149", "a150", "a151", "a152", "a153", "a154", "a155",
+ "a156", "a157", "a158", "a159", "a160", "a161", "a163", "a164",
+ "a196", "a165", "a192", "a166", "a167", "a168", "a169", "a170",
+ "a171", "a172", "a173", "a162", "a174", "a175", "a176", "a177",
+ "a178", "a179", "a193", "a180", "a199", "a181", "a200", "a182",
+ NULL, "a201", "a183", "a184", "a197", "a185", "a194", "a198",
+ "a186", "a195", "a187", "a188", "a189", "a190", "a191", NULL
+};
+const FX_CHAR* PDF_CharNameFromPredefinedCharSet(int encoding, FX_BYTE charcode)
+{
+ if (encoding == PDFFONT_ENCODING_PDFDOC) {
+ if (charcode < 24) {
+ return NULL;
+ }
+ charcode -= 24;
+ } else {
+ if (charcode < 32) {
+ return NULL;
+ }
+ charcode -= 32;
+ }
+ switch (encoding) {
+ case PDFFONT_ENCODING_WINANSI:
+ return AdobeWinAnsiEncodingNames[charcode];
+ case PDFFONT_ENCODING_MACROMAN:
+ return MacRomanEncodingNames[charcode];
+ case PDFFONT_ENCODING_MACEXPERT:
+ return MacExpertEncodingNames[charcode];
+ case PDFFONT_ENCODING_STANDARD:
+ return StandardEncodingNames[charcode];
+ case PDFFONT_ENCODING_ADOBE_SYMBOL:
+ return AdobeSymbolEncodingNames[charcode];
+ case PDFFONT_ENCODING_ZAPFDINGBATS:
+ return ZapfEncodingNames[charcode];
+ case PDFFONT_ENCODING_PDFDOC:
+ return PDFDocEncodingNames[charcode];
+ }
+ return NULL;
+}
+FX_WCHAR FT_UnicodeFromCharCode(int encoding, FX_DWORD charcode)
+{
+ switch (encoding) {
+ case FXFT_ENCODING_UNICODE:
+ return (FX_WORD)charcode;
+ case FXFT_ENCODING_ADOBE_STANDARD:
+ return StandardEncoding[(FX_BYTE)charcode];
+ case FXFT_ENCODING_ADOBE_EXPERT:
+ return MacExpertEncoding[(FX_BYTE)charcode];
+ case FXFT_ENCODING_ADOBE_LATIN_1:
+ return AdobeWinAnsiEncoding[(FX_BYTE)charcode];
+ case FXFT_ENCODING_APPLE_ROMAN:
+ return MacRomanEncoding[(FX_BYTE)charcode];
+ case PDFFONT_ENCODING_PDFDOC:
+ return PDFDocEncoding[(FX_BYTE)charcode];
+ }
+ return 0;
+}
+static FX_DWORD PDF_FindCode(const FX_WORD* pCodes, FX_WORD unicode)
+{
+ for (FX_DWORD i = 0; i < 256; i ++)
+ if (pCodes[i] == unicode) {
+ return i;
+ }
+ return 0;
+}
+const FX_WORD MSSymbolEncoding[256] = {
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 32, 33, 8704, 35, 8707, 37, 38, 8715,
+ 40, 41, 8727, 43, 44, 8722, 46, 47, 48, 49,
+ 50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
+ 60, 61, 62, 63, 8773, 913, 914, 935, 916, 917,
+ 934, 915, 919, 921, 977, 922, 923, 924, 925, 927,
+ 928, 920, 929, 931, 932, 933, 962, 937, 926, 936,
+ 918, 91, 8756, 93, 8869, 95, 8254, 945, 946, 967,
+ 948, 949, 966, 947, 951, 953, 981, 954, 955, 956,
+ 957, 959, 960, 952, 961, 963, 964, 965, 982, 969,
+ 958, 968, 950, 123, 124, 125, 8764, 0, 0, 0,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 978, 8242, 8804, 8725, 8734, 402, 9827, 9830, 9828,
+ 9824, 8596, 8592, 8593, 8594, 8595, 176, 177, 8243, 8805,
+ 215, 8733, 8706, 8729, 247, 8800, 8801, 8776, 8943, 0,
+ 0, 8629, 0, 8465, 8476, 8472, 8855, 8853, 8709, 8745,
+ 8746, 8835, 8839, 8836, 8834, 8838, 8712, 8713, 8736, 8711,
+ 174, 169, 8482, 8719, 8730, 8901, 172, 8743, 8744, 8660,
+ 8656, 8657, 8658, 8659, 9674, 9001, 0, 0, 0, 8721,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x0000, 9002, 8747, 8992, 0, 8993, 0, 0, 0, 0,
+ 0, 0, 0x0000, 0x0000, 0x0000, 0x0000
+};
+FX_DWORD FT_CharCodeFromUnicode(int encoding, FX_WCHAR unicode)
+{
+ switch (encoding) {
+ case FXFT_ENCODING_UNICODE:
+ return unicode;
+ case FXFT_ENCODING_ADOBE_STANDARD:
+ return PDF_FindCode(StandardEncoding, unicode);
+ case FXFT_ENCODING_ADOBE_EXPERT:
+ return PDF_FindCode(MacExpertEncoding, unicode);
+ case FXFT_ENCODING_ADOBE_LATIN_1:
+ return PDF_FindCode(AdobeWinAnsiEncoding, unicode);
+ case FXFT_ENCODING_APPLE_ROMAN:
+ return PDF_FindCode(MacRomanEncoding, unicode);
+ case FXFT_ENCODING_ADOBE_CUSTOM:
+ return PDF_FindCode(PDFDocEncoding, unicode);
+ case FXFT_ENCODING_MS_SYMBOL:
+ return PDF_FindCode(MSSymbolEncoding, unicode);
+ }
+ return 0;
+}
+const FX_WORD* PDF_UnicodesForPredefinedCharSet(int encoding)
+{
+ switch (encoding) {
+ case PDFFONT_ENCODING_WINANSI:
+ return AdobeWinAnsiEncoding;
+ case PDFFONT_ENCODING_MACROMAN:
+ return MacRomanEncoding;
+ case PDFFONT_ENCODING_MACEXPERT:
+ return MacExpertEncoding;
+ case PDFFONT_ENCODING_STANDARD:
+ return StandardEncoding;
+ case PDFFONT_ENCODING_ADOBE_SYMBOL:
+ return AdobeSymbolEncoding;
+ case PDFFONT_ENCODING_ZAPFDINGBATS:
+ return ZapfEncoding;
+ case PDFFONT_ENCODING_PDFDOC:
+ return PDFDocEncoding;
+ case PDFFONT_ENCODING_MS_SYMBOL:
+ return MSSymbolEncoding;
+ }
+ return NULL;
+}
+FX_DWORD PDF_PredefinedCharCodeFromUnicode(int encoding, FX_WCHAR unicode)
+{
+ return PDF_FindCode(PDF_UnicodesForPredefinedCharSet(encoding), unicode);
+}
+#ifdef __cplusplus
+extern "C" {
+#endif
+extern int FXFT_unicode_from_adobe_name(const char* name);
+#ifdef __cplusplus
+}
+#endif
+FX_WCHAR PDF_UnicodeFromAdobeName(const FX_CHAR* name)
+{
+ return (FX_WCHAR)(FXFT_unicode_from_adobe_name(name) & 0x7FFFFFFF);
+}
+CFX_ByteString PDF_AdobeNameFromUnicode(FX_WCHAR unicode)
+{
+ char glyph_name[64];
+ FXFT_adobe_name_from_unicode(glyph_name, unicode);
+ return CFX_ByteString(glyph_name, -1);
+}
diff --git a/core/src/fpdfapi/fpdf_font/fpdf_font_cid.cpp b/core/src/fpdfapi/fpdf_font/fpdf_font_cid.cpp
index 891d82fa1a..23bbc4aab9 100644
--- a/core/src/fpdfapi/fpdf_font/fpdf_font_cid.cpp
+++ b/core/src/fpdfapi/fpdf_font/fpdf_font_cid.cpp
@@ -1,1716 +1,1716 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../../include/fpdfapi/fpdf_module.h"
-#include "../../../include/fpdfapi/fpdf_page.h"
-#include "font_int.h"
-#include "../fpdf_cmaps/cmap_int.h"
-#include "../../../include/fxge/fx_ge.h"
-#include "../../../include/fxge/fx_freetype.h"
-extern FX_DWORD FT_CharCodeFromUnicode(int encoding, FX_WCHAR unicode);
-extern FX_LPVOID FXFC_LoadPackage(FX_LPCSTR name);
-extern FX_BOOL FXFC_LoadFile(FX_LPVOID pPackage, FX_LPCSTR name, FX_LPBYTE& pBuffer, FX_DWORD& size);
-extern void FXFC_ClosePackage(FX_LPVOID pPackage);
-extern short TT2PDF(int m, FXFT_Face face);
-extern FX_BOOL FT_UseTTCharmap(FXFT_Face face, int platform_id, int encoding_id);
-extern FX_LPCSTR GetAdobeCharName(int iBaseEncoding, const CFX_ByteString* pCharNames, int charcode);
-CPDF_CMapManager::CPDF_CMapManager()
-{
-#ifndef _FPDFAPI_MINI_
- m_bPrompted = FALSE;
- m_pPackage = NULL;
-#endif
- FXSYS_memset32(m_CID2UnicodeMaps, 0, sizeof m_CID2UnicodeMaps);
-}
-CPDF_CMapManager::~CPDF_CMapManager()
-{
- DropAll(FALSE);
-#ifndef _FPDFAPI_MINI_
- if (m_pPackage) {
- FXFC_ClosePackage(m_pPackage);
- }
-#endif
-}
-#ifndef _FPDFAPI_MINI_
-FX_LPVOID CPDF_CMapManager::GetPackage(FX_BOOL bPrompt)
-{
-#ifndef FOXIT_CHROME_BUILD
- if (m_pPackage == NULL) {
- CFX_ByteString filename = CPDF_ModuleMgr::Get()->GetModuleFilePath(ADDIN_NAME_CJK, "FPDFCJK.BIN");
- m_pPackage = FXFC_LoadPackage(filename);
- if (bPrompt && m_pPackage == NULL && !m_bPrompted) {
- m_bPrompted = TRUE;
- if (!CPDF_ModuleMgr::Get()->DownloadModule(ADDIN_NAME_CJK)) {
- return NULL;
- }
- m_pPackage = FXFC_LoadPackage(filename);
- }
- }
-#endif
- return m_pPackage;
-}
-#endif
-CPDF_CMap* CPDF_CMapManager::GetPredefinedCMap(const CFX_ByteString& name, FX_BOOL bPromptCJK)
-{
- CPDF_CMap* pCMap;
- if (m_CMaps.Lookup(name, (FX_LPVOID&)pCMap)) {
- return pCMap;
- }
- pCMap = LoadPredefinedCMap(name, bPromptCJK);
- if (name.IsEmpty()) {
- return pCMap;
- }
- m_CMaps.SetAt(name, pCMap);
- return pCMap;
-}
-CPDF_CMap* CPDF_CMapManager::LoadPredefinedCMap(const CFX_ByteString& name, FX_BOOL bPromptCJK)
-{
- CPDF_CMap* pCMap = FX_NEW CPDF_CMap;
- FX_LPCSTR pname = name;
- if (*pname == '/') {
- pname ++;
- }
- pCMap->LoadPredefined(this, pname, bPromptCJK);
- return pCMap;
-}
-const FX_LPCSTR g_CharsetNames[] = {NULL, "GB1", "CNS1", "Japan1", "Korea1", "UCS", NULL};
-const int g_CharsetCPs[] = {0, 936, 950, 932, 949, 1200, 0};
-int _CharsetFromOrdering(const CFX_ByteString& Ordering)
-{
- int charset = 1;
- while (g_CharsetNames[charset] && Ordering != CFX_ByteStringC(g_CharsetNames[charset])) {
- charset ++;
- }
- if (g_CharsetNames[charset] == NULL) {
- return CIDSET_UNKNOWN;
- }
- return charset;
-}
-void CPDF_CMapManager::ReloadAll()
-{
- DropAll(TRUE);
-}
-void CPDF_CMapManager::DropAll(FX_BOOL bReload)
-{
- FX_POSITION pos = m_CMaps.GetStartPosition();
- while (pos) {
- CFX_ByteString name;
- CPDF_CMap* pCMap;
- m_CMaps.GetNextAssoc(pos, name, (FX_LPVOID&)pCMap);
- if (pCMap == NULL) {
- continue;
- }
- if (bReload) {
- pCMap->LoadPredefined(this, name, FALSE);
- } else {
- delete pCMap;
- }
- }
- for (int i = 0; i < sizeof m_CID2UnicodeMaps / sizeof(CPDF_CID2UnicodeMap*); i ++) {
- CPDF_CID2UnicodeMap* pMap = m_CID2UnicodeMaps[i];
- if (pMap == NULL) {
- continue;
- }
- if (bReload) {
- pMap->Load(this, i, FALSE);
- } else {
- delete pMap;
- }
- }
-}
-CPDF_CID2UnicodeMap* CPDF_CMapManager::GetCID2UnicodeMap(int charset, FX_BOOL bPromptCJK)
-{
- if (m_CID2UnicodeMaps[charset] == NULL) {
- m_CID2UnicodeMaps[charset] = LoadCID2UnicodeMap(charset, bPromptCJK);
- }
- return m_CID2UnicodeMaps[charset];
-}
-CPDF_CID2UnicodeMap* CPDF_CMapManager::LoadCID2UnicodeMap(int charset, FX_BOOL bPromptCJK)
-{
- CPDF_CID2UnicodeMap* pMap = FX_NEW CPDF_CID2UnicodeMap();
- if (!pMap->Initialize()) {
- delete pMap;
- return NULL;
- }
- pMap->Load(this, charset, bPromptCJK);
- return pMap;
-}
-CPDF_CMapParser::CPDF_CMapParser()
-{
- m_pCMap = NULL;
- m_Status = 0;
- m_CodeSeq = 0;
-}
-FX_BOOL CPDF_CMapParser::Initialize(CPDF_CMap* pCMap)
-{
- m_pCMap = pCMap;
- m_Status = 0;
- m_CodeSeq = 0;
- m_AddMaps.EstimateSize(0, 10240);
- return TRUE;
-}
-static FX_DWORD CMap_GetCode(FX_BSTR word)
-{
- int num = 0;
- if (word.GetAt(0) == '<') {
- for (int i = 1; i < word.GetLength(); i ++) {
- FX_BYTE digit = word.GetAt(i);
- if (digit >= '0' && digit <= '9') {
- digit = digit - '0';
- } else if (digit >= 'a' && digit <= 'f') {
- digit = digit - 'a' + 10;
- } else if (digit >= 'A' && digit <= 'F') {
- digit = digit - 'A' + 10;
- } else {
- return num;
- }
- num = num * 16 + digit;
- }
- } else {
- for (int i = 0; i < word.GetLength(); i ++) {
- if (word.GetAt(i) < '0' || word.GetAt(i) > '9') {
- return num;
- }
- num = num * 10 + word.GetAt(i) - '0';
- }
- }
- return num;
-}
-static FX_BOOL _CMap_GetCodeRange(_CMap_CodeRange& range, FX_BSTR first, FX_BSTR second)
-{
- if (first.GetLength() == 0 || first.GetAt(0) != '<') {
- return FALSE;
- }
- int num = 0;
- int i;
- for (i = 1; i < first.GetLength(); i ++)
- if (first.GetAt(i) == '>') {
- break;
- }
- range.m_CharSize = (i - 1) / 2;
- if (range.m_CharSize > 4) {
- return FALSE;
- }
- for (i = 0; i < range.m_CharSize; i ++) {
- FX_BYTE digit1 = first.GetAt(i * 2 + 1);
- FX_BYTE digit2 = first.GetAt(i * 2 + 2);
- FX_BYTE byte = (digit1 >= '0' && digit1 <= '9') ? (digit1 - '0') : ((digit1 & 0xdf) - 'A' + 10);
- byte = byte * 16 + ((digit2 >= '0' && digit2 <= '9') ? (digit2 - '0') : ((digit2 & 0xdf) - 'A' + 10));
- range.m_Lower[i] = byte;
- }
- FX_DWORD size = second.GetLength();
- for (i = 0; i < range.m_CharSize; i ++) {
- FX_BYTE digit1 = ((FX_DWORD)i * 2 + 1 < size) ? second.GetAt((FX_STRSIZE)i * 2 + 1) : 0;
- FX_BYTE digit2 = ((FX_DWORD)i * 2 + 2 < size) ? second.GetAt((FX_STRSIZE)i * 2 + 2) : 0;
- FX_BYTE byte = (digit1 >= '0' && digit1 <= '9') ? (digit1 - '0') : ((digit1 & 0xdf) - 'A' + 10);
- byte = byte * 16 + ((digit2 >= '0' && digit2 <= '9') ? (digit2 - '0') : ((digit2 & 0xdf) - 'A' + 10));
- range.m_Upper[i] = byte;
- }
- return TRUE;
-}
-static CFX_ByteString CMap_GetString(FX_BSTR word)
-{
- return word.Mid(1, word.GetLength() - 2);
-}
-void CPDF_CMapParser::ParseWord(FX_BSTR word)
-{
- if (word.IsEmpty()) {
- return;
- }
- if (word == FX_BSTRC("begincidchar")) {
- m_Status = 1;
- m_CodeSeq = 0;
- } else if (word == FX_BSTRC("begincidrange")) {
- m_Status = 2;
- m_CodeSeq = 0;
- } else if (word == FX_BSTRC("endcidrange") || word == FX_BSTRC("endcidchar")) {
- m_Status = 0;
- } else if (word == FX_BSTRC("/WMode")) {
- m_Status = 6;
- } else if (word == FX_BSTRC("/Registry")) {
- m_Status = 3;
- } else if (word == FX_BSTRC("/Ordering")) {
- m_Status = 4;
- } else if (word == FX_BSTRC("/Supplement")) {
- m_Status = 5;
- } else if (word == FX_BSTRC("begincodespacerange")) {
- m_Status = 7;
- m_CodeSeq = 0;
- } else if (word == FX_BSTRC("usecmap")) {
- } else if (m_Status == 1 || m_Status == 2) {
- m_CodePoints[m_CodeSeq] = CMap_GetCode(word);
- m_CodeSeq ++;
- FX_DWORD StartCode, EndCode;
- FX_WORD StartCID;
- if (m_Status == 1) {
- if (m_CodeSeq < 2) {
- return;
- }
- EndCode = StartCode = m_CodePoints[0];
- StartCID = (FX_WORD)m_CodePoints[1];
- } else {
- if (m_CodeSeq < 3) {
- return;
- }
- StartCode = m_CodePoints[0];
- EndCode = m_CodePoints[1];
- StartCID = (FX_WORD)m_CodePoints[2];
- }
- if (EndCode < 0x10000) {
- for (FX_DWORD code = StartCode; code <= EndCode; code ++) {
- m_pCMap->m_pMapping[code] = (FX_WORD)(StartCID + code - StartCode);
- }
- } else {
- FX_DWORD buf[2];
- buf[0] = StartCode;
- buf[1] = ((EndCode - StartCode) << 16) + StartCID;
- m_AddMaps.AppendBlock(buf, sizeof buf);
- }
- m_CodeSeq = 0;
- } else if (m_Status == 3) {
- CMap_GetString(word);
- m_Status = 0;
- } else if (m_Status == 4) {
- m_pCMap->m_Charset = _CharsetFromOrdering(CMap_GetString(word));
- m_Status = 0;
- } else if (m_Status == 5) {
- CMap_GetCode(word);
- m_Status = 0;
- } else if (m_Status == 6) {
- m_pCMap->m_bVertical = CMap_GetCode(word);
- m_Status = 0;
- } else if (m_Status == 7) {
- if (word == FX_BSTRC("endcodespacerange")) {
- int nSegs = m_CodeRanges.GetSize();
- if (nSegs > 1) {
- m_pCMap->m_CodingScheme = CPDF_CMap::MixedFourBytes;
- m_pCMap->m_nCodeRanges = nSegs;
- m_pCMap->m_pLeadingBytes = FX_Alloc(FX_BYTE, nSegs * sizeof(_CMap_CodeRange));
- FXSYS_memcpy32(m_pCMap->m_pLeadingBytes, m_CodeRanges.GetData(), nSegs * sizeof(_CMap_CodeRange));
- } else if (nSegs == 1) {
- m_pCMap->m_CodingScheme = (m_CodeRanges[0].m_CharSize == 2) ? CPDF_CMap::TwoBytes : CPDF_CMap::OneByte;
- }
- m_Status = 0;
- } else {
- if (word.GetLength() == 0 || word.GetAt(0) != '<') {
- return;
- }
- if (m_CodeSeq % 2) {
- _CMap_CodeRange range;
- if (_CMap_GetCodeRange(range, m_LastWord, word)) {
- m_CodeRanges.Add(range);
- }
- }
- m_CodeSeq ++;
- }
- }
- m_LastWord = word;
-}
-CPDF_CMap::CPDF_CMap()
-{
- m_Charset = CIDSET_UNKNOWN;
- m_Coding = CIDCODING_UNKNOWN;
- m_CodingScheme = TwoBytes;
- m_bVertical = 0;
- m_bLoaded = FALSE;
- m_pMapping = NULL;
- m_pLeadingBytes = NULL;
- m_pAddMapping = NULL;
- m_pEmbedMap = NULL;
- m_pUseMap = NULL;
- m_nCodeRanges = 0;
-}
-CPDF_CMap::~CPDF_CMap()
-{
- if (m_pMapping) {
- FX_Free(m_pMapping);
- }
- if (m_pAddMapping) {
- FX_Free(m_pAddMapping);
- }
- if (m_pLeadingBytes) {
- FX_Free(m_pLeadingBytes);
- }
- if (m_pUseMap) {
- delete m_pUseMap;
- }
-}
-void CPDF_CMap::Release()
-{
- if (m_PredefinedCMap.IsEmpty()) {
- delete this;
- }
-}
-const CPDF_PredefinedCMap g_PredefinedCMaps[] = {
- { "GB-EUC", CIDSET_GB1, CIDCODING_GB, CPDF_CMap::MixedTwoBytes, 1, {0xa1, 0xfe} },
- { "GBpc-EUC", CIDSET_GB1, CIDCODING_GB, CPDF_CMap::MixedTwoBytes, 1, {0xa1, 0xfc} },
- { "GBK-EUC", CIDSET_GB1, CIDCODING_GB, CPDF_CMap::MixedTwoBytes, 1, {0x81, 0xfe} },
- { "GBKp-EUC", CIDSET_GB1, CIDCODING_GB, CPDF_CMap::MixedTwoBytes, 1, {0x81, 0xfe} },
- { "GBK2K-EUC", CIDSET_GB1, CIDCODING_GB, CPDF_CMap::MixedTwoBytes, 1, {0x81, 0xfe} },
- { "GBK2K", CIDSET_GB1, CIDCODING_GB, CPDF_CMap::MixedTwoBytes, 1, {0x81, 0xfe} },
- { "UniGB-UCS2", CIDSET_GB1, CIDCODING_UCS2, CPDF_CMap::TwoBytes },
- { "UniGB-UTF16", CIDSET_GB1, CIDCODING_UTF16, CPDF_CMap::TwoBytes },
- { "B5pc", CIDSET_CNS1, CIDCODING_BIG5, CPDF_CMap::MixedTwoBytes, 1, {0xa1, 0xfc} },
- { "HKscs-B5", CIDSET_CNS1, CIDCODING_BIG5, CPDF_CMap::MixedTwoBytes, 1, {0x88, 0xfe} },
- { "ETen-B5", CIDSET_CNS1, CIDCODING_BIG5, CPDF_CMap::MixedTwoBytes, 1, {0xa1, 0xfe} },
- { "ETenms-B5", CIDSET_CNS1, CIDCODING_BIG5, CPDF_CMap::MixedTwoBytes, 1, {0xa1, 0xfe} },
- { "UniCNS-UCS2", CIDSET_CNS1, CIDCODING_UCS2, CPDF_CMap::TwoBytes },
- { "UniCNS-UTF16", CIDSET_CNS1, CIDCODING_UTF16, CPDF_CMap::TwoBytes },
- { "83pv-RKSJ", CIDSET_JAPAN1, CIDCODING_JIS, CPDF_CMap::MixedTwoBytes, 2, {0x81, 0x9f, 0xe0, 0xfc} },
- { "90ms-RKSJ", CIDSET_JAPAN1, CIDCODING_JIS, CPDF_CMap::MixedTwoBytes, 2, {0x81, 0x9f, 0xe0, 0xfc} },
- { "90msp-RKSJ", CIDSET_JAPAN1, CIDCODING_JIS, CPDF_CMap::MixedTwoBytes, 2, {0x81, 0x9f, 0xe0, 0xfc} },
- { "90pv-RKSJ", CIDSET_JAPAN1, CIDCODING_JIS, CPDF_CMap::MixedTwoBytes, 2, {0x81, 0x9f, 0xe0, 0xfc} },
- { "Add-RKSJ", CIDSET_JAPAN1, CIDCODING_JIS, CPDF_CMap::MixedTwoBytes, 2, {0x81, 0x9f, 0xe0, 0xfc} },
- { "EUC", CIDSET_JAPAN1, CIDCODING_JIS, CPDF_CMap::MixedTwoBytes, 2, {0x8e, 0x8e, 0xa1, 0xfe} },
- { "H", CIDSET_JAPAN1, CIDCODING_JIS, CPDF_CMap::TwoBytes, 1, {0x21, 0x7e} },
- { "V", CIDSET_JAPAN1, CIDCODING_JIS, CPDF_CMap::TwoBytes, 1, {0x21, 0x7e} },
- { "Ext-RKSJ", CIDSET_JAPAN1, CIDCODING_JIS, CPDF_CMap::MixedTwoBytes, 2, {0x81, 0x9f, 0xe0, 0xfc} },
- { "UniJIS-UCS2", CIDSET_JAPAN1, CIDCODING_UCS2, CPDF_CMap::TwoBytes },
- { "UniJIS-UCS2-HW", CIDSET_JAPAN1, CIDCODING_UCS2, CPDF_CMap::TwoBytes },
- { "UniJIS-UTF16", CIDSET_JAPAN1, CIDCODING_UTF16, CPDF_CMap::TwoBytes },
- { "KSC-EUC", CIDSET_KOREA1, CIDCODING_KOREA, CPDF_CMap::MixedTwoBytes, 1, {0xa1, 0xfe} },
- { "KSCms-UHC", CIDSET_KOREA1, CIDCODING_KOREA, CPDF_CMap::MixedTwoBytes, 1, {0x81, 0xfe} },
- { "KSCms-UHC-HW", CIDSET_KOREA1, CIDCODING_KOREA, CPDF_CMap::MixedTwoBytes, 1, {0x81, 0xfe} },
- { "KSCpc-EUC", CIDSET_KOREA1, CIDCODING_KOREA, CPDF_CMap::MixedTwoBytes, 1, {0xa1, 0xfd} },
- { "UniKS-UCS2", CIDSET_KOREA1, CIDCODING_UCS2, CPDF_CMap::TwoBytes },
- { "UniKS-UTF16", CIDSET_KOREA1, CIDCODING_UTF16, CPDF_CMap::TwoBytes },
- { NULL, 0, 0 }
-};
-extern void FPDFAPI_FindEmbeddedCMap(const char* name, int charset, int coding, const FXCMAP_CMap*& pMap);
-extern FX_WORD FPDFAPI_CIDFromCharCode(const FXCMAP_CMap* pMap, FX_DWORD charcode);
-FX_BOOL CPDF_CMap::LoadPredefined(CPDF_CMapManager* pMgr, FX_LPCSTR pName, FX_BOOL bPromptCJK)
-{
- m_PredefinedCMap = pName;
- if (m_PredefinedCMap == FX_BSTRC("Identity-H") || m_PredefinedCMap == FX_BSTRC("Identity-V")) {
- m_Coding = CIDCODING_CID;
- m_bVertical = pName[9] == 'V';
- m_bLoaded = TRUE;
- return TRUE;
- }
- CFX_ByteString cmapid = m_PredefinedCMap;
- m_bVertical = cmapid.Right(1) == FX_BSTRC("V");
- if (cmapid.GetLength() > 2) {
- cmapid = cmapid.Left(cmapid.GetLength() - 2);
- }
- int index = 0;
- while (1) {
- if (g_PredefinedCMaps[index].m_pName == NULL) {
- return FALSE;
- }
- if (cmapid == CFX_ByteStringC(g_PredefinedCMaps[index].m_pName)) {
- break;
- }
- index ++;
- }
- const CPDF_PredefinedCMap& map = g_PredefinedCMaps[index];
- m_Charset = map.m_Charset;
- m_Coding = map.m_Coding;
- m_CodingScheme = map.m_CodingScheme;
- if (m_CodingScheme == MixedTwoBytes) {
- m_pLeadingBytes = FX_Alloc(FX_BYTE, 256);
- FXSYS_memset32(m_pLeadingBytes, 0, 256);
- for (FX_DWORD i = 0; i < map.m_LeadingSegCount; i ++) {
- for (int b = map.m_LeadingSegs[i * 2]; b <= map.m_LeadingSegs[i * 2 + 1]; b ++) {
- m_pLeadingBytes[b] = 1;
- }
- }
- }
- FPDFAPI_FindEmbeddedCMap(pName, m_Charset, m_Coding, m_pEmbedMap);
- if (m_pEmbedMap) {
- m_bLoaded = TRUE;
- return TRUE;
- }
-#ifndef _FPDFAPI_MINI_
- FX_LPVOID pPackage = pMgr->GetPackage(bPromptCJK);
- FX_LPBYTE pBuffer;
- FX_DWORD size;
- if (pPackage == NULL || !FXFC_LoadFile(pPackage, m_PredefinedCMap, pBuffer, size)) {
- return FALSE;
- }
- m_pMapping = FX_Alloc(FX_WORD, 65536);
- FXSYS_memset32(m_pMapping, 0, 65536 * sizeof(FX_WORD));
- FX_DWORD dwRecodeEndPos = 0;
- if (pBuffer[5] == 0) {
- FX_DWORD dwStartIndex = *(FX_DWORD*)(pBuffer + 8);
- FX_DWORD dwRecordCount = *(FX_DWORD*)(pBuffer + 16);
- FX_DWORD dwDataOffset = *(FX_DWORD*)(pBuffer + 20);
- if (dwRecordCount * 2 + dwStartIndex * 2 < 65536) {
- FXSYS_memcpy32(m_pMapping + dwStartIndex * 2, pBuffer + dwDataOffset, dwRecordCount * 2);
- }
- dwRecodeEndPos = dwDataOffset + dwRecordCount * 2;
- } else if (pBuffer[5] == 2) {
- FX_DWORD nSegments = *(FX_DWORD*)(pBuffer + 16);
- FX_DWORD dwDataOffset = *(FX_DWORD*)(pBuffer + 20);
- dwRecodeEndPos = dwDataOffset + 6 * nSegments;
- for (FX_DWORD i = 0; i < nSegments; i ++) {
- FX_LPBYTE pRecord = pBuffer + dwDataOffset + i * 6;
- FX_WORD IndexStart = *(FX_WORD*)pRecord;
- FX_WORD IndexCount = *(FX_WORD*)(pRecord + 2);
- FX_WORD CodeStart = *(FX_WORD*)(pRecord + 4);
- if (IndexStart + IndexCount < 65536)
- for (FX_DWORD j = 0; j < IndexCount; j ++) {
- m_pMapping[IndexStart + j ] = (FX_WORD)(CodeStart + j);
- }
- }
- }
- if (dwRecodeEndPos < size) {
- FX_DWORD dwMapLen = *(FX_DWORD*)(pBuffer + dwRecodeEndPos);
- if (dwMapLen) {
- m_pUseMap = FX_NEW CPDF_CMap;
- CFX_ByteString bsName(pBuffer + dwRecodeEndPos + 4 , dwMapLen);
- if (m_pUseMap) {
- m_pUseMap->LoadPredefined(pMgr, bsName, bPromptCJK);
- }
- }
- }
- FX_Free(pBuffer);
- m_bLoaded = TRUE;
-#endif
- return TRUE;
-}
-extern "C" {
- static int compare_dword(const void* data1, const void* data2)
- {
- return (*(FX_DWORD*)data1) - (*(FX_DWORD*)data2);
- }
-};
-FX_BOOL CPDF_CMap::LoadEmbedded(FX_LPCBYTE pData, FX_DWORD size)
-{
- m_pMapping = FX_Alloc(FX_WORD, 65536);
- FXSYS_memset32(m_pMapping, 0, 65536 * sizeof(FX_WORD));
- CPDF_CMapParser parser;
- parser.Initialize(this);
- CPDF_SimpleParser syntax(pData, size);
- while (1) {
- CFX_ByteStringC word = syntax.GetWord();
- if (word.IsEmpty()) {
- break;
- }
- parser.ParseWord(word);
- }
- if (m_CodingScheme == MixedFourBytes && parser.m_AddMaps.GetSize()) {
- m_pAddMapping = FX_Alloc(FX_BYTE, parser.m_AddMaps.GetSize() + 4);
- *(FX_DWORD*)m_pAddMapping = parser.m_AddMaps.GetSize() / 8;
- FXSYS_memcpy32(m_pAddMapping + 4, parser.m_AddMaps.GetBuffer(), parser.m_AddMaps.GetSize());
- FXSYS_qsort(m_pAddMapping + 4, parser.m_AddMaps.GetSize() / 8, 8, compare_dword);
- }
- return TRUE;
-}
-extern "C" {
- static int compareCID(const void* key, const void* element)
- {
- if ((*(FX_DWORD*)key) < (*(FX_DWORD*)element)) {
- return -1;
- }
- if ((*(FX_DWORD*)key) > (*(FX_DWORD*)element) + ((FX_DWORD*)element)[1] / 65536) {
- return 1;
- }
- return 0;
- }
-};
-FX_WORD CPDF_CMap::CIDFromCharCode(FX_DWORD charcode) const
-{
- if (m_Coding == CIDCODING_CID) {
- return (FX_WORD)charcode;
- }
- if (m_pEmbedMap) {
- return FPDFAPI_CIDFromCharCode(m_pEmbedMap, charcode);
- }
- if (m_pMapping == NULL) {
- return (FX_WORD)charcode;
- }
- if (charcode >> 16) {
- if (m_pAddMapping) {
- void* found = FXSYS_bsearch(&charcode, m_pAddMapping + 4, *(FX_DWORD*)m_pAddMapping, 8, compareCID);
- if (found == NULL) {
- if (m_pUseMap) {
- return m_pUseMap->CIDFromCharCode(charcode);
- }
- return 0;
- }
- return (FX_WORD)(((FX_DWORD*)found)[1] % 65536 + charcode - * (FX_DWORD*)found);
- }
- if (m_pUseMap) {
- return m_pUseMap->CIDFromCharCode(charcode);
- }
- return 0;
- }
- FX_DWORD CID = m_pMapping[charcode];
- if (!CID && m_pUseMap) {
- return m_pUseMap->CIDFromCharCode(charcode);
- }
- return (FX_WORD)CID;
-}
-static int _CheckCodeRange(FX_LPBYTE codes, int size, _CMap_CodeRange* pRanges, int nRanges)
-{
- int iSeg = nRanges - 1;
- while (iSeg >= 0) {
- if (pRanges[iSeg].m_CharSize < size) {
- iSeg --;
- continue;
- }
- int iChar = 0;
- while (iChar < size) {
- if (codes[iChar] < pRanges[iSeg].m_Lower[iChar] ||
- codes[iChar] > pRanges[iSeg].m_Upper[iChar]) {
- break;
- }
- iChar ++;
- }
- if (iChar == pRanges[iSeg].m_CharSize) {
- return 2;
- }
- if (iChar) {
- if (size == pRanges[iSeg].m_CharSize) {
- return 2;
- }
- return 1;
- }
- iSeg --;
- }
- return 0;
-}
-FX_DWORD CPDF_CMap::GetNextChar(FX_LPCSTR pString, int& offset) const
-{
- switch (m_CodingScheme) {
- case OneByte:
- return ((FX_LPBYTE)pString)[offset++];
- case TwoBytes:
- offset += 2;
- return ((FX_LPBYTE)pString)[offset - 2] * 256 + ((FX_LPBYTE)pString)[offset - 1];
- case MixedTwoBytes: {
- FX_BYTE byte1 = ((FX_LPBYTE)pString)[offset++];
- if (!m_pLeadingBytes[byte1]) {
- return byte1;
- }
- FX_BYTE byte2 = ((FX_LPBYTE)pString)[offset++];
- return byte1 * 256 + byte2;
- }
- case MixedFourBytes: {
- FX_BYTE codes[4];
- int char_size = 1;
- codes[0] = ((FX_LPBYTE)pString)[offset++];
- _CMap_CodeRange* pRanges = (_CMap_CodeRange*)m_pLeadingBytes;
- while (1) {
- int ret = _CheckCodeRange(codes, char_size, pRanges, m_nCodeRanges);
- if (ret == 0) {
- return 0;
- }
- if (ret == 2) {
- FX_DWORD charcode = 0;
- for (int i = 0; i < char_size; i ++) {
- charcode = (charcode << 8) + codes[i];
- }
- return charcode;
- }
- if (char_size == 4) {
- return 0;
- }
- codes[char_size ++] = ((FX_LPBYTE)pString)[offset++];
- }
- break;
- }
- }
- return 0;
-}
-int CPDF_CMap::GetCharSize(FX_DWORD charcode) const
-{
- switch (m_CodingScheme) {
- case OneByte:
- return 1;
- case TwoBytes:
- return 2;
- case MixedTwoBytes:
- case MixedFourBytes:
- if (charcode < 0x100) {
- return 1;
- }
- if (charcode < 0x10000) {
- return 2;
- }
- if (charcode < 0x1000000) {
- return 3;
- }
- return 4;
- }
- return 1;
-}
-int CPDF_CMap::CountChar(FX_LPCSTR pString, int size) const
-{
- switch (m_CodingScheme) {
- case OneByte:
- return size;
- case TwoBytes:
- return (size + 1) / 2;
- case MixedTwoBytes: {
- int count = 0;
- for (int i = 0; i < size; i ++) {
- count ++;
- if (m_pLeadingBytes[((FX_LPBYTE)pString)[i]]) {
- i ++;
- }
- }
- return count;
- }
- case MixedFourBytes: {
- int count = 0, offset = 0;
- while (offset < size) {
- GetNextChar(pString, offset);
- count ++;
- }
- return count;
- }
- }
- return size;
-}
-int _GetCharSize(FX_DWORD charcode, _CMap_CodeRange* pRanges, int iRangesSize)
-{
- if (!iRangesSize) {
- return 1;
- }
- FX_BYTE codes[4];
- codes[0] = codes[1] = 0x00;
- codes[2] = (FX_BYTE)(charcode >> 8 & 0xFF);
- codes[3] = (FX_BYTE)charcode;
- int offset = 0, size = 4;
- for (int i = 0; i < 4; ++i) {
- int iSeg = iRangesSize - 1;
- while (iSeg >= 0) {
- if (pRanges[iSeg].m_CharSize < size) {
- iSeg --;
- continue;
- }
- int iChar = 0;
- while (iChar < size) {
- if (codes[offset + iChar] < pRanges[iSeg].m_Lower[iChar] ||
- codes[offset + iChar] > pRanges[iSeg].m_Upper[iChar]) {
- break;
- }
- iChar ++;
- }
- if (iChar == pRanges[iSeg].m_CharSize) {
- return size;
- }
- iSeg --;
- }
- size --;
- offset ++;
- }
- return 1;
-}
-int CPDF_CMap::AppendChar(FX_LPSTR str, FX_DWORD charcode) const
-{
- switch (m_CodingScheme) {
- case OneByte:
- str[0] = (FX_BYTE)charcode;
- return 1;
- case TwoBytes:
- str[0] = (FX_BYTE)(charcode / 256);
- str[1] = (FX_BYTE)(charcode % 256);
- return 2;
- case MixedTwoBytes:
- case MixedFourBytes:
- if (charcode < 0x100) {
- _CMap_CodeRange* pRanges = (_CMap_CodeRange*)m_pLeadingBytes;
- int iSize = _GetCharSize(charcode, pRanges, m_nCodeRanges);
- if (iSize == 0) {
- iSize = 1;
- }
- if (iSize > 1) {
- FXSYS_memset32(str, 0, sizeof(FX_BYTE) * iSize);
- }
- str[iSize - 1] = (FX_BYTE)charcode;
- return iSize;
- } else if (charcode < 0x10000) {
- str[0] = (FX_BYTE)(charcode >> 8);
- str[1] = (FX_BYTE)charcode;
- return 2;
- } else if (charcode < 0x1000000) {
- str[0] = (FX_BYTE)(charcode >> 16);
- str[1] = (FX_BYTE)(charcode >> 8);
- str[2] = (FX_BYTE)charcode;
- return 3;
- } else {
- str[0] = (FX_BYTE)(charcode >> 24);
- str[1] = (FX_BYTE)(charcode >> 16);
- str[2] = (FX_BYTE)(charcode >> 8);
- str[3] = (FX_BYTE)charcode;
- return 4;
- }
- }
- return 0;
-}
-CPDF_CID2UnicodeMap::CPDF_CID2UnicodeMap()
-{
- m_EmbeddedCount = 0;
-#ifndef _FPDFAPI_MINI_
- m_pExternalMap = NULL;
-#endif
-}
-CPDF_CID2UnicodeMap::~CPDF_CID2UnicodeMap()
-{
-#ifndef _FPDFAPI_MINI_
- if (m_pExternalMap) {
- delete m_pExternalMap;
- }
-#endif
-}
-FX_BOOL CPDF_CID2UnicodeMap::Initialize()
-{
-#ifndef _FPDFAPI_MINI_
- m_pExternalMap = FX_NEW CPDF_FXMP;
-#endif
- return TRUE;
-}
-FX_BOOL CPDF_CID2UnicodeMap::IsLoaded()
-{
-#ifdef _FPDFAPI_MINI_
- return m_EmbeddedCount != 0;
-#else
- return m_EmbeddedCount != 0 || (m_pExternalMap != NULL && m_pExternalMap->IsLoaded());
-#endif
-}
-FX_WCHAR CPDF_CID2UnicodeMap::UnicodeFromCID(FX_WORD CID)
-{
- if (m_Charset == CIDSET_UNICODE) {
- return CID;
- }
- if (CID < m_EmbeddedCount) {
- return m_pEmbeddedMap[CID];
- }
-#ifdef _FPDFAPI_MINI_
- return 0;
-#else
- FX_LPCBYTE record = m_pExternalMap->GetRecord(CID);
- if (record == NULL) {
- return 0;
- }
- return *(FX_WORD*)record;
-#endif
-}
-void FPDFAPI_LoadCID2UnicodeMap(int charset, const FX_WORD*& pMap, FX_DWORD& count);
-void CPDF_CID2UnicodeMap::Load(CPDF_CMapManager* pMgr, int charset, FX_BOOL bPromptCJK)
-{
- m_Charset = charset;
- FPDFAPI_LoadCID2UnicodeMap(charset, m_pEmbeddedMap, m_EmbeddedCount);
- if (m_EmbeddedCount) {
- return;
- }
-#ifndef _FPDFAPI_MINI_
- FX_LPVOID pPackage = pMgr->GetPackage(bPromptCJK);
- if (pPackage == NULL) {
- return;
- }
- m_pExternalMap->LoadFile(pPackage, FX_BSTRC("CIDInfo_") + g_CharsetNames[charset]);
-#endif
-}
-#include "ttgsubtable.h"
-CPDF_CIDFont::CPDF_CIDFont()
-{
- m_pCMap = NULL;
- m_pAllocatedCMap = NULL;
- m_pCID2UnicodeMap = NULL;
- m_pAnsiWidths = NULL;
- m_pCIDToGIDMap = NULL;
- m_bCIDIsGID = FALSE;
- m_bAdobeCourierStd = FALSE;
- m_pTTGSUBTable = NULL;
- FXSYS_memset8(m_CharBBox, 0xff, 256 * sizeof(FX_SMALL_RECT));
-}
-CPDF_CIDFont::~CPDF_CIDFont()
-{
- if (m_pAnsiWidths) {
- FX_Free(m_pAnsiWidths);
- }
- if (m_pAllocatedCMap) {
- delete m_pAllocatedCMap;
- }
- if (m_pCIDToGIDMap) {
- delete m_pCIDToGIDMap;
- }
- if (m_pTTGSUBTable) {
- delete m_pTTGSUBTable;
- }
-}
-FX_WORD CPDF_CIDFont::CIDFromCharCode(FX_DWORD charcode) const
-{
- if (m_pCMap == NULL) {
- return (FX_WORD)charcode;
- }
- return m_pCMap->CIDFromCharCode(charcode);
-}
-FX_BOOL CPDF_CIDFont::IsVertWriting() const
-{
- return m_pCMap ? m_pCMap->IsVertWriting() : FALSE;
-}
-extern FX_DWORD FPDFAPI_CharCodeFromCID(const FXCMAP_CMap* pMap, FX_WORD cid);
-static FX_DWORD _EmbeddedCharcodeFromUnicode(const FXCMAP_CMap* pEmbedMap, int charset, FX_WCHAR unicode)
-{
- if (charset <= 0 || charset > 4) {
- return 0;
- }
- CPDF_FontGlobals* pFontGlobals = CPDF_ModuleMgr::Get()->GetPageModule()->GetFontGlobals();
- const FX_WORD* pCodes = pFontGlobals->m_EmbeddedToUnicodes[charset].m_pMap;
- if (pCodes == NULL) {
- return 0;
- }
- int nCodes = pFontGlobals->m_EmbeddedToUnicodes[charset].m_Count;
- for (int i = 0; i < nCodes; i++) {
- if (pCodes[i] == unicode) {
- FX_DWORD CharCode = FPDFAPI_CharCodeFromCID(pEmbedMap, i);
- if (CharCode == 0) {
- continue;
- }
- return CharCode;
- }
- }
- return 0;
-}
-static FX_WCHAR _EmbeddedUnicodeFromCharcode(const FXCMAP_CMap* pEmbedMap, int charset, FX_DWORD charcode)
-{
- if (charset <= 0 || charset > 4) {
- return 0;
- }
- FX_WORD cid = FPDFAPI_CIDFromCharCode(pEmbedMap, charcode);
- if (cid == 0) {
- return 0;
- }
- CPDF_FontGlobals* pFontGlobals = CPDF_ModuleMgr::Get()->GetPageModule()->GetFontGlobals();
- const FX_WORD* pCodes = pFontGlobals->m_EmbeddedToUnicodes[charset].m_pMap;
- if (pCodes == NULL) {
- return 0;
- }
- if (cid < pFontGlobals->m_EmbeddedToUnicodes[charset].m_Count) {
- return pCodes[cid];
- }
- return 0;
-}
-FX_WCHAR CPDF_CIDFont::_UnicodeFromCharCode(FX_DWORD charcode) const
-{
- switch (m_pCMap->m_Coding) {
- case CIDCODING_UCS2:
- case CIDCODING_UTF16:
- return (FX_WCHAR)charcode;
- case CIDCODING_CID:
- if (m_pCID2UnicodeMap == NULL || !m_pCID2UnicodeMap->IsLoaded()) {
- return 0;
- }
- return m_pCID2UnicodeMap->UnicodeFromCID((FX_WORD)charcode);
- }
- if (!m_pCMap->IsLoaded() || m_pCID2UnicodeMap == NULL || !m_pCID2UnicodeMap->IsLoaded()) {
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
- FX_WCHAR unicode;
- int charsize = 1;
- if (charcode > 255) {
- charcode = (charcode % 256) * 256 + (charcode / 256);
- charsize = 2;
- }
- int ret = FXSYS_MultiByteToWideChar(g_CharsetCPs[m_pCMap->m_Coding], 0, (FX_LPCSTR)&charcode, charsize, &unicode, 1);
- if (ret != 1) {
- return 0;
- }
- return unicode;
-#endif
- if (m_pCMap->m_pEmbedMap) {
- return _EmbeddedUnicodeFromCharcode(m_pCMap->m_pEmbedMap, m_pCMap->m_Charset, charcode);
- } else {
- return 0;
- }
- }
- return m_pCID2UnicodeMap->UnicodeFromCID(CIDFromCharCode(charcode));
-}
-FX_DWORD CPDF_CIDFont::_CharCodeFromUnicode(FX_WCHAR unicode) const
-{
- switch (m_pCMap->m_Coding) {
- case CIDCODING_UNKNOWN:
- return 0;
- case CIDCODING_UCS2:
- case CIDCODING_UTF16:
- return unicode;
- case CIDCODING_CID: {
- if (m_pCID2UnicodeMap == NULL || !m_pCID2UnicodeMap->IsLoaded()) {
- return 0;
- }
- FX_DWORD CID = 0;
- while (CID < 65536) {
- FX_WCHAR this_unicode = m_pCID2UnicodeMap->UnicodeFromCID((FX_WORD)CID);
- if (this_unicode == unicode) {
- return CID;
- }
- CID ++;
- }
- break;
- }
- }
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
- FX_BYTE buffer[32];
- int ret = FXSYS_WideCharToMultiByte(g_CharsetCPs[m_pCMap->m_Coding], 0, &unicode, 1, (char*)buffer, 4, NULL, NULL);
- if (ret == 1) {
- return buffer[0];
- } else if (ret == 2) {
- return buffer[0] * 256 + buffer[1];
- }
- return 0;
-#endif
- if (unicode < 0x80) {
- return (FX_DWORD)unicode;
- } else {
- if (m_pCMap->m_pEmbedMap) {
- return _EmbeddedCharcodeFromUnicode(m_pCMap->m_pEmbedMap, m_pCMap->m_Charset, unicode);
- } else {
- return 0;
- }
- }
-}
-static void FT_UseCIDCharmap(FXFT_Face face, int coding)
-{
- int encoding;
- switch (coding) {
- case CIDCODING_GB:
- encoding = FXFT_ENCODING_GB2312;
- break;
- case CIDCODING_BIG5:
- encoding = FXFT_ENCODING_BIG5;
- break;
- case CIDCODING_JIS:
- encoding = FXFT_ENCODING_SJIS;
- break;
- case CIDCODING_KOREA:
- encoding = FXFT_ENCODING_JOHAB;
- break;
- default:
- encoding = FXFT_ENCODING_UNICODE;
- }
- int err = FXFT_Select_Charmap(face, encoding);
- if (err) {
- err = FXFT_Select_Charmap(face, FXFT_ENCODING_UNICODE);
- }
- if (err && FXFT_Get_Face_Charmaps(face)) {
- FXFT_Set_Charmap(face, *FXFT_Get_Face_Charmaps(face));
- }
-}
-FX_BOOL CPDF_CIDFont::_Load()
-{
- if (m_pFontDict->GetString(FX_BSTRC("Subtype")) == FX_BSTRC("TrueType")) {
- return LoadGB2312();
- }
- CPDF_Array* pFonts = m_pFontDict->GetArray(FX_BSTRC("DescendantFonts"));
- if (pFonts == NULL) {
- return FALSE;
- }
- if (pFonts->GetCount() != 1) {
- return FALSE;
- }
- CPDF_Dictionary* pCIDFontDict = pFonts->GetDict(0);
- if (pCIDFontDict == NULL) {
- return FALSE;
- }
- m_BaseFont = pCIDFontDict->GetString(FX_BSTRC("BaseFont"));
- if ((m_BaseFont.Compare("CourierStd") == 0 || m_BaseFont.Compare("CourierStd-Bold") == 0
- || m_BaseFont.Compare("CourierStd-BoldOblique") == 0 || m_BaseFont.Compare("CourierStd-Oblique") == 0)
- && !IsEmbedded()) {
- m_bAdobeCourierStd = TRUE;
- }
- CPDF_Dictionary* pFontDesc = pCIDFontDict->GetDict(FX_BSTRC("FontDescriptor"));
- if (pFontDesc) {
- LoadFontDescriptor(pFontDesc);
- }
- CPDF_Object* pEncoding = m_pFontDict->GetElementValue(FX_BSTRC("Encoding"));
- if (pEncoding == NULL) {
- return FALSE;
- }
- CFX_ByteString subtype = pCIDFontDict->GetString(FX_BSTRC("Subtype"));
- m_bType1 = FALSE;
- if (subtype == FX_BSTRC("CIDFontType0")) {
- m_bType1 = TRUE;
- }
- if (pEncoding->GetType() == PDFOBJ_NAME) {
- CFX_ByteString cmap = pEncoding->GetString();
- m_pCMap = CPDF_ModuleMgr::Get()->GetPageModule()->GetFontGlobals()->m_CMapManager.GetPredefinedCMap(cmap,
- m_pFontFile && m_bType1);
- } else if (pEncoding->GetType() == PDFOBJ_STREAM) {
- m_pAllocatedCMap = m_pCMap = FX_NEW CPDF_CMap;
- CPDF_Stream* pStream = (CPDF_Stream*)pEncoding;
- CPDF_StreamAcc acc;
- acc.LoadAllData(pStream, FALSE);
- m_pCMap->LoadEmbedded(acc.GetData(), acc.GetSize());
- } else {
- return FALSE;
- }
- if (m_pCMap == NULL) {
- return FALSE;
- }
- m_Charset = m_pCMap->m_Charset;
- if (m_Charset == CIDSET_UNKNOWN) {
- CPDF_Dictionary* pCIDInfo = pCIDFontDict->GetDict(FX_BSTRC("CIDSystemInfo"));
- if (pCIDInfo) {
- m_Charset = _CharsetFromOrdering(pCIDInfo->GetString(FX_BSTRC("Ordering")));
- }
- }
- if (m_Charset != CIDSET_UNKNOWN)
- m_pCID2UnicodeMap = CPDF_ModuleMgr::Get()->GetPageModule()->GetFontGlobals()->m_CMapManager.GetCID2UnicodeMap(m_Charset,
- m_pFontFile == NULL && (m_pCMap->m_Coding == CIDCODING_CID || pCIDFontDict->KeyExist(FX_BSTRC("W"))));
- if (m_Font.GetFace()) {
- if (m_bType1) {
- FXFT_Select_Charmap(m_Font.GetFace(), FXFT_ENCODING_UNICODE);
- } else {
- FT_UseCIDCharmap(m_Font.GetFace(), m_pCMap->m_Coding);
- }
- }
- m_DefaultWidth = pCIDFontDict->GetInteger(FX_BSTRC("DW"), 1000);
- CPDF_Array* pWidthArray = pCIDFontDict->GetArray(FX_BSTRC("W"));
- if (pWidthArray) {
- LoadMetricsArray(pWidthArray, m_WidthList, 1);
- }
- if (!IsEmbedded()) {
- LoadSubstFont();
- }
- if (1) {
- if (m_pFontFile || (GetSubstFont()->m_SubstFlags & FXFONT_SUBST_EXACT)) {
- CPDF_Object* pmap = pCIDFontDict->GetElementValue(FX_BSTRC("CIDToGIDMap"));
- if (pmap) {
- if (pmap->GetType() == PDFOBJ_STREAM) {
- m_pCIDToGIDMap = FX_NEW CPDF_StreamAcc;
- m_pCIDToGIDMap->LoadAllData((CPDF_Stream*)pmap, FALSE);
- } else if (pmap->GetString() == FX_BSTRC("Identity")) {
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
- if (m_pFontFile) {
- m_bCIDIsGID = TRUE;
- }
-#else
- m_bCIDIsGID = TRUE;
-#endif
- }
- }
- }
- }
- CheckFontMetrics();
- if (IsVertWriting()) {
- pWidthArray = pCIDFontDict->GetArray(FX_BSTRC("W2"));
- if (pWidthArray) {
- LoadMetricsArray(pWidthArray, m_VertMetrics, 3);
- }
- CPDF_Array* pDefaultArray = pCIDFontDict->GetArray(FX_BSTRC("DW2"));
- if (pDefaultArray) {
- m_DefaultVY = pDefaultArray->GetInteger(0);
- m_DefaultW1 = pDefaultArray->GetInteger(1);
- } else {
- m_DefaultVY = 880;
- m_DefaultW1 = -1000;
- }
- }
- return TRUE;
-}
-FX_FLOAT _CIDTransformToFloat(FX_BYTE ch)
-{
- if (ch < 128) {
- return ch * 1.0f / 127;
- }
- return (-255 + ch) * 1.0f / 127;
-}
-void CPDF_CIDFont::GetCharBBox(FX_DWORD charcode, FX_RECT& rect, int level)
-{
- if (charcode < 256 && m_CharBBox[charcode].Right != -1) {
- rect.bottom = m_CharBBox[charcode].Bottom;
- rect.left = m_CharBBox[charcode].Left;
- rect.right = m_CharBBox[charcode].Right;
- rect.top = m_CharBBox[charcode].Top;
- return;
- }
- FX_BOOL bVert = FALSE;
- int glyph_index = GlyphFromCharCode(charcode, &bVert);
- if (m_Font.m_Face == NULL) {
- rect = FX_RECT(0, 0, 0, 0);
- } else {
- rect.left = rect.bottom = rect.right = rect.top = 0;
- FXFT_Face face = m_Font.m_Face;
- if (FXFT_Is_Face_Tricky(face)) {
- int err = FXFT_Load_Glyph(face, glyph_index, FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH);
- if (!err) {
- FXFT_BBox cbox;
- FXFT_Glyph glyph;
- err = FXFT_Get_Glyph(((FXFT_Face)face)->glyph, &glyph);
- if (!err) {
- FXFT_Glyph_Get_CBox(glyph, FXFT_GLYPH_BBOX_PIXELS, &cbox);
- int pixel_size_x = ((FXFT_Face)face)->size->metrics.x_ppem;
- int pixel_size_y = ((FXFT_Face)face)->size->metrics.y_ppem;
- if (pixel_size_x == 0 || pixel_size_y == 0) {
- rect.left = cbox.xMin;
- rect.right = cbox.xMax;
- rect.top = cbox.yMax;
- rect.bottom = cbox.yMin;
- } else {
- rect.left = cbox.xMin * 1000 / pixel_size_x;
- rect.right = cbox.xMax * 1000 / pixel_size_x;
- rect.top = cbox.yMax * 1000 / pixel_size_y;
- rect.bottom = cbox.yMin * 1000 / pixel_size_y;
- }
- if (rect.top > FXFT_Get_Face_Ascender(face)) {
- rect.top = FXFT_Get_Face_Ascender(face);
- }
- if (rect.bottom < FXFT_Get_Face_Descender(face)) {
- rect.bottom = FXFT_Get_Face_Descender(face);
- }
- FXFT_Done_Glyph(glyph);
- }
- }
- } else {
- int err = FXFT_Load_Glyph(face, glyph_index, FXFT_LOAD_NO_SCALE);
- if (err == 0) {
- rect.left = TT2PDF(FXFT_Get_Glyph_HoriBearingX(face), face);
- rect.right = TT2PDF(FXFT_Get_Glyph_HoriBearingX(face) + FXFT_Get_Glyph_Width(face), face);
- rect.top = TT2PDF(FXFT_Get_Glyph_HoriBearingY(face), face);
- rect.top += rect.top / 64;
- rect.bottom = TT2PDF(FXFT_Get_Glyph_HoriBearingY(face) - FXFT_Get_Glyph_Height(face), face);
- }
- }
- }
- if (m_pFontFile == NULL && m_Charset == CIDSET_JAPAN1) {
- FX_WORD CID = CIDFromCharCode(charcode);
- FX_LPCBYTE pTransform = GetCIDTransform(CID);
- if (pTransform && !bVert) {
- CFX_AffineMatrix matrix(_CIDTransformToFloat(pTransform[0]), _CIDTransformToFloat(pTransform[1]),
- _CIDTransformToFloat(pTransform[2]), _CIDTransformToFloat(pTransform[3]),
- _CIDTransformToFloat(pTransform[4]) * 1000 , _CIDTransformToFloat(pTransform[5]) * 1000);
- CFX_FloatRect rect_f(rect);
- rect_f.Transform(&matrix);
- rect = rect_f.GetOutterRect();
- }
- }
- if (charcode < 256) {
- m_CharBBox[charcode].Bottom = (short)rect.bottom;
- m_CharBBox[charcode].Left = (short)rect.left;
- m_CharBBox[charcode].Right = (short)rect.right;
- m_CharBBox[charcode].Top = (short)rect.top;
- }
-}
-int CPDF_CIDFont::GetCharWidthF(FX_DWORD charcode, int level)
-{
- if (m_pAnsiWidths && charcode < 0x80) {
- return m_pAnsiWidths[charcode];
- }
- FX_WORD cid = CIDFromCharCode(charcode);
- int size = m_WidthList.GetSize();
- FX_DWORD* list = m_WidthList.GetData();
- for (int i = 0; i < size; i += 3) {
- if (cid >= list[i] && cid <= list[i + 1]) {
- return (int)list[i + 2];
- }
- }
- return m_DefaultWidth;
-}
-short CPDF_CIDFont::GetVertWidth(FX_WORD CID) const
-{
- FX_DWORD vertsize = m_VertMetrics.GetSize() / 5;
- if (vertsize == 0) {
- return m_DefaultW1;
- }
- const FX_DWORD* pTable = m_VertMetrics.GetData();
- for (FX_DWORD i = 0; i < vertsize; i ++)
- if (pTable[i * 5] <= CID && pTable[i * 5 + 1] >= CID) {
- return (short)(int)pTable[i * 5 + 2];
- }
- return m_DefaultW1;
-}
-void CPDF_CIDFont::GetVertOrigin(FX_WORD CID, short& vx, short &vy) const
-{
- FX_DWORD vertsize = m_VertMetrics.GetSize() / 5;
- if (vertsize) {
- const FX_DWORD* pTable = m_VertMetrics.GetData();
- for (FX_DWORD i = 0; i < vertsize; i ++)
- if (pTable[i * 5] <= CID && pTable[i * 5 + 1] >= CID) {
- vx = (short)(int)pTable[i * 5 + 3];
- vy = (short)(int)pTable[i * 5 + 4];
- return;
- }
- }
- FX_DWORD dwWidth = m_DefaultWidth;
- int size = m_WidthList.GetSize();
- const FX_DWORD* list = m_WidthList.GetData();
- for (int i = 0; i < size; i += 3) {
- if (CID >= list[i] && CID <= list[i + 1]) {
- dwWidth = (FX_WORD)list[i + 2];
- break;
- }
- }
- vx = (short)dwWidth / 2;
- vy = (short)m_DefaultVY;
-}
-int CPDF_CIDFont::GetGlyphIndex(FX_DWORD unicode, FX_BOOL *pVertGlyph)
-{
- if (pVertGlyph) {
- *pVertGlyph = FALSE;
- }
- int index = FXFT_Get_Char_Index(m_Font.m_Face, unicode );
- if (unicode == 0x2502) {
- return index;
- }
- if (index && IsVertWriting()) {
- if (m_pTTGSUBTable) {
- TT_uint32_t vindex = 0;
- m_pTTGSUBTable->GetVerticalGlyph(index, &vindex);
- if (vindex) {
- index = vindex;
- if (pVertGlyph) {
- *pVertGlyph = TRUE;
- }
- }
- return index;
- }
- if (NULL == m_Font.m_pGsubData) {
- unsigned long length = 0;
- int error = FXFT_Load_Sfnt_Table( m_Font.m_Face, FT_MAKE_TAG('G', 'S', 'U', 'B'), 0, NULL, &length);
- if (!error) {
- m_Font.m_pGsubData = (unsigned char*)FX_Alloc(FX_BYTE, length);
- }
- }
- int error = FXFT_Load_Sfnt_Table( m_Font.m_Face, FT_MAKE_TAG('G', 'S', 'U', 'B'), 0, m_Font.m_pGsubData, NULL);
- if (!error && m_Font.m_pGsubData) {
- m_pTTGSUBTable = FX_NEW CFX_CTTGSUBTable;
- m_pTTGSUBTable->LoadGSUBTable((FT_Bytes)m_Font.m_pGsubData);
- TT_uint32_t vindex = 0;
- m_pTTGSUBTable->GetVerticalGlyph(index, &vindex);
- if (vindex) {
- index = vindex;
- if (pVertGlyph) {
- *pVertGlyph = TRUE;
- }
- }
- }
- return index;
- }
- if (pVertGlyph) {
- *pVertGlyph = FALSE;
- }
- return index;
-}
-int CPDF_CIDFont::GlyphFromCharCode(FX_DWORD charcode, FX_BOOL *pVertGlyph)
-{
- if (pVertGlyph) {
- *pVertGlyph = FALSE;
- }
- if (m_pFontFile == NULL && m_pCIDToGIDMap == NULL) {
- FX_WORD cid = CIDFromCharCode(charcode);
- FX_WCHAR unicode = 0;
- if (m_bCIDIsGID) {
-#if _FXM_PLATFORM_ != _FXM_PLATFORM_APPLE_
- return cid;
-#else
- if (m_Flags & PDFFONT_SYMBOLIC) {
- return cid;
- }
- CFX_WideString uni_str = UnicodeFromCharCode(charcode);
- if (uni_str.IsEmpty()) {
- return cid;
- }
- unicode = uni_str.GetAt(0);
-#endif
- } else {
- if (cid && m_pCID2UnicodeMap && m_pCID2UnicodeMap->IsLoaded()) {
- unicode = m_pCID2UnicodeMap->UnicodeFromCID(cid);
- }
- if (unicode == 0) {
- unicode = _UnicodeFromCharCode(charcode);
- }
- if (unicode == 0 && !(m_Flags & PDFFONT_SYMBOLIC)) {
- unicode = UnicodeFromCharCode(charcode).GetAt(0);
- }
- }
- if (unicode == 0) {
- if (!m_bAdobeCourierStd) {
- return charcode == 0 ? -1 : (int)charcode;
- }
- charcode += 31;
- int index = 0, iBaseEncoding;
- FX_BOOL bMSUnicode = FT_UseTTCharmap(m_Font.m_Face, 3, 1);
- FX_BOOL bMacRoman = FALSE;
- if (!bMSUnicode) {
- bMacRoman = FT_UseTTCharmap(m_Font.m_Face, 1, 0);
- }
- iBaseEncoding = PDFFONT_ENCODING_STANDARD;
- if (bMSUnicode) {
- iBaseEncoding = PDFFONT_ENCODING_WINANSI;
- } else if (bMacRoman) {
- iBaseEncoding = PDFFONT_ENCODING_MACROMAN;
- }
- FX_LPCSTR name = GetAdobeCharName(iBaseEncoding, NULL, charcode);
- if (name == NULL) {
- return charcode == 0 ? -1 : (int)charcode;
- }
- FX_WORD unicode = PDF_UnicodeFromAdobeName(name);
- if (unicode) {
- if (bMSUnicode) {
- index = FXFT_Get_Char_Index(m_Font.m_Face, unicode);
- } else if (bMacRoman) {
- FX_DWORD maccode = FT_CharCodeFromUnicode(FXFT_ENCODING_APPLE_ROMAN, unicode);
- index = !maccode ? FXFT_Get_Name_Index(m_Font.m_Face, (char *)name) : FXFT_Get_Char_Index(m_Font.m_Face, maccode);
- } else {
- return FXFT_Get_Char_Index(m_Font.m_Face, unicode);
- }
- } else {
- return charcode == 0 ? -1 : (int)charcode;
- }
- if (index == 0 || index == 0xffff) {
- return charcode == 0 ? -1 : (int)charcode;
- } else {
- return index;
- }
- }
- if (m_Charset == CIDSET_JAPAN1) {
- if (unicode == '\\') {
- unicode = '/';
- }
-#if !defined(_FPDFAPI_MINI_) && _FXM_PLATFORM_ != _FXM_PLATFORM_APPLE_
- else if (unicode == 0xa5) {
- unicode = 0x5c;
- }
-#endif
- }
- if (m_Font.m_Face == NULL) {
- return unicode;
- }
- int err = FXFT_Select_Charmap(m_Font.m_Face, FXFT_ENCODING_UNICODE);
- if (err != 0) {
- int i;
- for (i = 0; i < FXFT_Get_Face_CharmapCount(m_Font.m_Face); i ++) {
- FX_DWORD ret = FT_CharCodeFromUnicode(FXFT_Get_Charmap_Encoding(FXFT_Get_Face_Charmaps(m_Font.m_Face)[i]), (FX_WCHAR)charcode);
- if (ret == 0) {
- continue;
- }
- FXFT_Set_Charmap(m_Font.m_Face, FXFT_Get_Face_Charmaps(m_Font.m_Face)[i]);
- unicode = (FX_WCHAR)ret;
- break;
- }
- if (i == FXFT_Get_Face_CharmapCount(m_Font.m_Face) && i) {
- FXFT_Set_Charmap(m_Font.m_Face, FXFT_Get_Face_Charmaps(m_Font.m_Face)[0]);
- unicode = (FX_WCHAR)charcode;
- }
- }
- if (FXFT_Get_Face_Charmap(m_Font.m_Face)) {
- int index = GetGlyphIndex(unicode, pVertGlyph);
- if (index == 0) {
- return -1;
- }
- return index;
- }
- return unicode ;
- }
- if (m_Font.m_Face == NULL) {
- return -1;
- }
- FX_WORD cid = CIDFromCharCode(charcode);
- if (m_bType1) {
- if (NULL == m_pCIDToGIDMap) {
- return cid;
- }
- } else {
- if (m_pCIDToGIDMap == NULL) {
- if (m_pFontFile && m_pCMap->m_pMapping == NULL) {
- return cid;
- }
- if (m_pCMap->m_Coding == CIDCODING_UNKNOWN || FXFT_Get_Face_Charmap(m_Font.m_Face) == NULL) {
- return cid;
- }
- if (FXFT_Get_Charmap_Encoding(FXFT_Get_Face_Charmap(m_Font.m_Face)) == FXFT_ENCODING_UNICODE) {
- CFX_WideString unicode_str = UnicodeFromCharCode(charcode);
- if (unicode_str.IsEmpty()) {
- return -1;
- }
- charcode = unicode_str.GetAt(0);
- }
- return GetGlyphIndex(charcode, pVertGlyph);
- }
- }
- FX_DWORD byte_pos = cid * 2;
- if (byte_pos + 2 > m_pCIDToGIDMap->GetSize()) {
- return -1;
- }
- FX_LPCBYTE pdata = m_pCIDToGIDMap->GetData() + byte_pos;
- return pdata[0] * 256 + pdata[1];
-}
-FX_DWORD CPDF_CIDFont::GetNextChar(FX_LPCSTR pString, int& offset) const
-{
- return m_pCMap->GetNextChar(pString, offset);
-}
-int CPDF_CIDFont::GetCharSize(FX_DWORD charcode) const
-{
- return m_pCMap->GetCharSize(charcode);
-}
-int CPDF_CIDFont::CountChar(FX_LPCSTR pString, int size) const
-{
- return m_pCMap->CountChar(pString, size);
-}
-int CPDF_CIDFont::AppendChar(FX_LPSTR str, FX_DWORD charcode) const
-{
- return m_pCMap->AppendChar(str, charcode);
-}
-FX_BOOL CPDF_CIDFont::IsUnicodeCompatible() const
-{
- if (!m_pCMap->IsLoaded() || m_pCID2UnicodeMap == NULL || !m_pCID2UnicodeMap->IsLoaded()) {
- return m_pCMap->m_Coding != CIDCODING_UNKNOWN;
- }
- return TRUE;
-}
-FX_BOOL CPDF_CIDFont::IsFontStyleFromCharCode(FX_DWORD charcode) const
-{
- return TRUE;
-}
-void CPDF_CIDFont::LoadSubstFont()
-{
- m_Font.LoadSubst(m_BaseFont, !m_bType1, m_Flags, m_StemV * 5, m_ItalicAngle, g_CharsetCPs[m_Charset], IsVertWriting());
-}
-void CPDF_CIDFont::LoadMetricsArray(CPDF_Array* pArray, CFX_DWordArray& result, int nElements)
-{
- int width_status = 0;
- int iCurElement = 0;
- int first_code = 0, last_code;
- FX_DWORD count = pArray->GetCount();
- for (FX_DWORD i = 0; i < count; i ++) {
- CPDF_Object* pObj = pArray->GetElementValue(i);
- if (pObj == NULL) {
- continue;
- }
- if (pObj->GetType() == PDFOBJ_ARRAY) {
- if (width_status != 1) {
- return;
- }
- CPDF_Array* pArray = (CPDF_Array*)pObj;
- FX_DWORD count = pArray->GetCount();
- for (FX_DWORD j = 0; j < count; j += nElements) {
- result.Add(first_code);
- result.Add(first_code);
- for (int k = 0; k < nElements; k ++) {
- result.Add(pArray->GetInteger(j + k));
- }
- first_code ++;
- }
- width_status = 0;
- } else {
- if (width_status == 0) {
- first_code = pObj->GetInteger();
- width_status = 1;
- } else if (width_status == 1) {
- last_code = pObj->GetInteger();
- width_status = 2;
- iCurElement = 0;
- } else {
- if (!iCurElement) {
- result.Add(first_code);
- result.Add(last_code);
- }
- result.Add(pObj->GetInteger());
- iCurElement ++;
- if (iCurElement == nElements) {
- width_status = 0;
- }
- }
- }
- }
-}
-FX_BOOL CPDF_CIDFont::LoadGB2312()
-{
- m_BaseFont = m_pFontDict->GetString(FX_BSTRC("BaseFont"));
- CPDF_Dictionary* pFontDesc = m_pFontDict->GetDict(FX_BSTRC("FontDescriptor"));
- if (pFontDesc) {
- LoadFontDescriptor(pFontDesc);
- }
- m_Charset = CIDSET_GB1;
- m_bType1 = FALSE;
- m_pCMap = CPDF_ModuleMgr::Get()->GetPageModule()->GetFontGlobals()->m_CMapManager.GetPredefinedCMap(
- FX_BSTRC("GBK-EUC-H"), FALSE);
- m_pCID2UnicodeMap = CPDF_ModuleMgr::Get()->GetPageModule()->GetFontGlobals()->m_CMapManager.GetCID2UnicodeMap(m_Charset, FALSE);
- if (!IsEmbedded()) {
- LoadSubstFont();
- }
- CheckFontMetrics();
- m_DefaultWidth = 1000;
- m_pAnsiWidths = FX_Alloc(FX_WORD, 128);
- FXSYS_memset32(m_pAnsiWidths, 0, 128 * sizeof(FX_WORD));
- for (int i = 32; i < 127; i ++) {
- m_pAnsiWidths[i] = 500;
- }
- return TRUE;
-}
-const struct _CIDTransform {
- FX_WORD CID;
- FX_BYTE a, b, c, d, e, f;
-}
-Japan1_VertCIDs[] = {
- {97, 129, 0, 0, 127, 55, 0},
- {7887, 127, 0, 0, 127, 76, 89},
- {7888, 127, 0, 0, 127, 79, 94},
- {7889, 0, 129, 127, 0, 17, 127},
- {7890, 0, 129, 127, 0, 17, 127},
- {7891, 0, 129, 127, 0, 17, 127},
- {7892, 0, 129, 127, 0, 17, 127},
- {7893, 0, 129, 127, 0, 17, 127},
- {7894, 0, 129, 127, 0, 17, 127},
- {7895, 0, 129, 127, 0, 17, 127},
- {7896, 0, 129, 127, 0, 17, 127},
- {7897, 0, 129, 127, 0, 17, 127},
- {7898, 0, 129, 127, 0, 17, 127},
- {7899, 0, 129, 127, 0, 17, 104},
- {7900, 0, 129, 127, 0, 17, 127},
- {7901, 0, 129, 127, 0, 17, 104},
- {7902, 0, 129, 127, 0, 17, 127},
- {7903, 0, 129, 127, 0, 17, 127},
- {7904, 0, 129, 127, 0, 17, 127},
- {7905, 0, 129, 127, 0, 17, 114},
- {7906, 0, 129, 127, 0, 17, 127},
- {7907, 0, 129, 127, 0, 17, 127},
- {7908, 0, 129, 127, 0, 17, 127},
- {7909, 0, 129, 127, 0, 17, 127},
- {7910, 0, 129, 127, 0, 17, 127},
- {7911, 0, 129, 127, 0, 17, 127},
- {7912, 0, 129, 127, 0, 17, 127},
- {7913, 0, 129, 127, 0, 17, 127},
- {7914, 0, 129, 127, 0, 17, 127},
- {7915, 0, 129, 127, 0, 17, 114},
- {7916, 0, 129, 127, 0, 17, 127},
- {7917, 0, 129, 127, 0, 17, 127},
- {7918, 127, 0, 0, 127, 18, 25},
- {7919, 127, 0, 0, 127, 18, 25},
- {7920, 127, 0, 0, 127, 18, 25},
- {7921, 127, 0, 0, 127, 18, 25},
- {7922, 127, 0, 0, 127, 18, 25},
- {7923, 127, 0, 0, 127, 18, 25},
- {7924, 127, 0, 0, 127, 18, 25},
- {7925, 127, 0, 0, 127, 18, 25},
- {7926, 127, 0, 0, 127, 18, 25},
- {7927, 127, 0, 0, 127, 18, 25},
- {7928, 127, 0, 0, 127, 18, 25},
- {7929, 127, 0, 0, 127, 18, 25},
- {7930, 127, 0, 0, 127, 18, 25},
- {7931, 127, 0, 0, 127, 18, 25},
- {7932, 127, 0, 0, 127, 18, 25},
- {7933, 127, 0, 0, 127, 18, 25},
- {7934, 127, 0, 0, 127, 18, 25},
- {7935, 127, 0, 0, 127, 18, 25},
- {7936, 127, 0, 0, 127, 18, 25},
- {7937, 127, 0, 0, 127, 18, 25},
- {7938, 127, 0, 0, 127, 18, 25},
- {7939, 127, 0, 0, 127, 18, 25},
- {8720, 0, 129, 127, 0, 19, 102},
- {8721, 0, 129, 127, 0, 13, 127},
- {8722, 0, 129, 127, 0, 19, 108},
- {8723, 0, 129, 127, 0, 19, 102},
- {8724, 0, 129, 127, 0, 19, 102},
- {8725, 0, 129, 127, 0, 19, 102},
- {8726, 0, 129, 127, 0, 19, 102},
- {8727, 0, 129, 127, 0, 19, 102},
- {8728, 0, 129, 127, 0, 19, 114},
- {8729, 0, 129, 127, 0, 19, 114},
- {8730, 0, 129, 127, 0, 38, 108},
- {8731, 0, 129, 127, 0, 13, 108},
- {8732, 0, 129, 127, 0, 19, 108},
- {8733, 0, 129, 127, 0, 19, 108},
- {8734, 0, 129, 127, 0, 19, 108},
- {8735, 0, 129, 127, 0, 19, 108},
- {8736, 0, 129, 127, 0, 19, 102},
- {8737, 0, 129, 127, 0, 19, 102},
- {8738, 0, 129, 127, 0, 19, 102},
- {8739, 0, 129, 127, 0, 19, 102},
- {8740, 0, 129, 127, 0, 19, 102},
- {8741, 0, 129, 127, 0, 19, 102},
- {8742, 0, 129, 127, 0, 19, 102},
- {8743, 0, 129, 127, 0, 19, 102},
- {8744, 0, 129, 127, 0, 19, 102},
- {8745, 0, 129, 127, 0, 19, 102},
- {8746, 0, 129, 127, 0, 19, 114},
- {8747, 0, 129, 127, 0, 19, 114},
- {8748, 0, 129, 127, 0, 19, 102},
- {8749, 0, 129, 127, 0, 19, 102},
- {8750, 0, 129, 127, 0, 19, 102},
- {8751, 0, 129, 127, 0, 19, 102},
- {8752, 0, 129, 127, 0, 19, 102},
- {8753, 0, 129, 127, 0, 19, 102},
- {8754, 0, 129, 127, 0, 19, 102},
- {8755, 0, 129, 127, 0, 19, 102},
- {8756, 0, 129, 127, 0, 19, 102},
- {8757, 0, 129, 127, 0, 19, 102},
- {8758, 0, 129, 127, 0, 19, 102},
- {8759, 0, 129, 127, 0, 19, 102},
- {8760, 0, 129, 127, 0, 19, 102},
- {8761, 0, 129, 127, 0, 19, 102},
- {8762, 0, 129, 127, 0, 19, 102},
- {8763, 0, 129, 127, 0, 19, 102},
- {8764, 0, 129, 127, 0, 19, 102},
- {8765, 0, 129, 127, 0, 19, 102},
- {8766, 0, 129, 127, 0, 19, 102},
- {8767, 0, 129, 127, 0, 19, 102},
- {8768, 0, 129, 127, 0, 19, 102},
- {8769, 0, 129, 127, 0, 19, 102},
- {8770, 0, 129, 127, 0, 19, 102},
- {8771, 0, 129, 127, 0, 19, 102},
- {8772, 0, 129, 127, 0, 19, 102},
- {8773, 0, 129, 127, 0, 19, 102},
- {8774, 0, 129, 127, 0, 19, 102},
- {8775, 0, 129, 127, 0, 19, 102},
- {8776, 0, 129, 127, 0, 19, 102},
- {8777, 0, 129, 127, 0, 19, 102},
- {8778, 0, 129, 127, 0, 19, 102},
- {8779, 0, 129, 127, 0, 19, 114},
- {8780, 0, 129, 127, 0, 19, 108},
- {8781, 0, 129, 127, 0, 19, 114},
- {8782, 0, 129, 127, 0, 13, 114},
- {8783, 0, 129, 127, 0, 19, 108},
- {8784, 0, 129, 127, 0, 13, 114},
- {8785, 0, 129, 127, 0, 19, 108},
- {8786, 0, 129, 127, 0, 19, 108},
- {8787, 0, 129, 127, 0, 19, 108},
- {8788, 0, 129, 127, 0, 19, 108},
- {8789, 0, 129, 127, 0, 19, 108},
- {8790, 0, 129, 127, 0, 19, 108},
- {8791, 0, 129, 127, 0, 19, 108},
- {8792, 0, 129, 127, 0, 19, 108},
- {8793, 0, 129, 127, 0, 19, 108},
- {8794, 0, 129, 127, 0, 19, 108},
- {8795, 0, 129, 127, 0, 19, 108},
- {8796, 0, 129, 127, 0, 19, 108},
- {8797, 0, 129, 127, 0, 19, 108},
- {8798, 0, 129, 127, 0, 19, 108},
- {8799, 0, 129, 127, 0, 19, 108},
- {8800, 0, 129, 127, 0, 19, 108},
- {8801, 0, 129, 127, 0, 19, 108},
- {8802, 0, 129, 127, 0, 19, 108},
- {8803, 0, 129, 127, 0, 19, 108},
- {8804, 0, 129, 127, 0, 19, 108},
- {8805, 0, 129, 127, 0, 19, 108},
- {8806, 0, 129, 127, 0, 19, 108},
- {8807, 0, 129, 127, 0, 19, 108},
- {8808, 0, 129, 127, 0, 19, 108},
- {8809, 0, 129, 127, 0, 19, 108},
- {8810, 0, 129, 127, 0, 19, 108},
- {8811, 0, 129, 127, 0, 19, 114},
- {8812, 0, 129, 127, 0, 19, 102},
- {8813, 0, 129, 127, 0, 19, 114},
- {8814, 0, 129, 127, 0, 76, 102},
- {8815, 0, 129, 127, 0, 13, 121},
- {8816, 0, 129, 127, 0, 19, 114},
- {8817, 0, 129, 127, 0, 19, 127},
- {8818, 0, 129, 127, 0, 19, 114},
- {8819, 0, 129, 127, 0, 218, 108},
-};
-FX_LPCBYTE CPDF_CIDFont::GetCIDTransform(FX_WORD CID) const
-{
- if (m_Charset != CIDSET_JAPAN1 || m_pFontFile != NULL) {
- return NULL;
- }
- int begin = 0;
- int end = sizeof Japan1_VertCIDs / sizeof(struct _CIDTransform) - 1;
- while (begin <= end) {
- int middle = (begin + end) / 2;
- FX_WORD middlecode = Japan1_VertCIDs[middle].CID;
- if (middlecode > CID) {
- end = middle - 1;
- } else if (middlecode < CID) {
- begin = middle + 1;
- } else {
- return &Japan1_VertCIDs[middle].a;
- }
- }
- return NULL;
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fpdfapi/fpdf_module.h"
+#include "../../../include/fpdfapi/fpdf_page.h"
+#include "font_int.h"
+#include "../fpdf_cmaps/cmap_int.h"
+#include "../../../include/fxge/fx_ge.h"
+#include "../../../include/fxge/fx_freetype.h"
+extern FX_DWORD FT_CharCodeFromUnicode(int encoding, FX_WCHAR unicode);
+extern FX_LPVOID FXFC_LoadPackage(FX_LPCSTR name);
+extern FX_BOOL FXFC_LoadFile(FX_LPVOID pPackage, FX_LPCSTR name, FX_LPBYTE& pBuffer, FX_DWORD& size);
+extern void FXFC_ClosePackage(FX_LPVOID pPackage);
+extern short TT2PDF(int m, FXFT_Face face);
+extern FX_BOOL FT_UseTTCharmap(FXFT_Face face, int platform_id, int encoding_id);
+extern FX_LPCSTR GetAdobeCharName(int iBaseEncoding, const CFX_ByteString* pCharNames, int charcode);
+CPDF_CMapManager::CPDF_CMapManager()
+{
+#ifndef _FPDFAPI_MINI_
+ m_bPrompted = FALSE;
+ m_pPackage = NULL;
+#endif
+ FXSYS_memset32(m_CID2UnicodeMaps, 0, sizeof m_CID2UnicodeMaps);
+}
+CPDF_CMapManager::~CPDF_CMapManager()
+{
+ DropAll(FALSE);
+#ifndef _FPDFAPI_MINI_
+ if (m_pPackage) {
+ FXFC_ClosePackage(m_pPackage);
+ }
+#endif
+}
+#ifndef _FPDFAPI_MINI_
+FX_LPVOID CPDF_CMapManager::GetPackage(FX_BOOL bPrompt)
+{
+#ifndef FOXIT_CHROME_BUILD
+ if (m_pPackage == NULL) {
+ CFX_ByteString filename = CPDF_ModuleMgr::Get()->GetModuleFilePath(ADDIN_NAME_CJK, "FPDFCJK.BIN");
+ m_pPackage = FXFC_LoadPackage(filename);
+ if (bPrompt && m_pPackage == NULL && !m_bPrompted) {
+ m_bPrompted = TRUE;
+ if (!CPDF_ModuleMgr::Get()->DownloadModule(ADDIN_NAME_CJK)) {
+ return NULL;
+ }
+ m_pPackage = FXFC_LoadPackage(filename);
+ }
+ }
+#endif
+ return m_pPackage;
+}
+#endif
+CPDF_CMap* CPDF_CMapManager::GetPredefinedCMap(const CFX_ByteString& name, FX_BOOL bPromptCJK)
+{
+ CPDF_CMap* pCMap;
+ if (m_CMaps.Lookup(name, (FX_LPVOID&)pCMap)) {
+ return pCMap;
+ }
+ pCMap = LoadPredefinedCMap(name, bPromptCJK);
+ if (name.IsEmpty()) {
+ return pCMap;
+ }
+ m_CMaps.SetAt(name, pCMap);
+ return pCMap;
+}
+CPDF_CMap* CPDF_CMapManager::LoadPredefinedCMap(const CFX_ByteString& name, FX_BOOL bPromptCJK)
+{
+ CPDF_CMap* pCMap = FX_NEW CPDF_CMap;
+ FX_LPCSTR pname = name;
+ if (*pname == '/') {
+ pname ++;
+ }
+ pCMap->LoadPredefined(this, pname, bPromptCJK);
+ return pCMap;
+}
+const FX_LPCSTR g_CharsetNames[] = {NULL, "GB1", "CNS1", "Japan1", "Korea1", "UCS", NULL};
+const int g_CharsetCPs[] = {0, 936, 950, 932, 949, 1200, 0};
+int _CharsetFromOrdering(const CFX_ByteString& Ordering)
+{
+ int charset = 1;
+ while (g_CharsetNames[charset] && Ordering != CFX_ByteStringC(g_CharsetNames[charset])) {
+ charset ++;
+ }
+ if (g_CharsetNames[charset] == NULL) {
+ return CIDSET_UNKNOWN;
+ }
+ return charset;
+}
+void CPDF_CMapManager::ReloadAll()
+{
+ DropAll(TRUE);
+}
+void CPDF_CMapManager::DropAll(FX_BOOL bReload)
+{
+ FX_POSITION pos = m_CMaps.GetStartPosition();
+ while (pos) {
+ CFX_ByteString name;
+ CPDF_CMap* pCMap;
+ m_CMaps.GetNextAssoc(pos, name, (FX_LPVOID&)pCMap);
+ if (pCMap == NULL) {
+ continue;
+ }
+ if (bReload) {
+ pCMap->LoadPredefined(this, name, FALSE);
+ } else {
+ delete pCMap;
+ }
+ }
+ for (int i = 0; i < sizeof m_CID2UnicodeMaps / sizeof(CPDF_CID2UnicodeMap*); i ++) {
+ CPDF_CID2UnicodeMap* pMap = m_CID2UnicodeMaps[i];
+ if (pMap == NULL) {
+ continue;
+ }
+ if (bReload) {
+ pMap->Load(this, i, FALSE);
+ } else {
+ delete pMap;
+ }
+ }
+}
+CPDF_CID2UnicodeMap* CPDF_CMapManager::GetCID2UnicodeMap(int charset, FX_BOOL bPromptCJK)
+{
+ if (m_CID2UnicodeMaps[charset] == NULL) {
+ m_CID2UnicodeMaps[charset] = LoadCID2UnicodeMap(charset, bPromptCJK);
+ }
+ return m_CID2UnicodeMaps[charset];
+}
+CPDF_CID2UnicodeMap* CPDF_CMapManager::LoadCID2UnicodeMap(int charset, FX_BOOL bPromptCJK)
+{
+ CPDF_CID2UnicodeMap* pMap = FX_NEW CPDF_CID2UnicodeMap();
+ if (!pMap->Initialize()) {
+ delete pMap;
+ return NULL;
+ }
+ pMap->Load(this, charset, bPromptCJK);
+ return pMap;
+}
+CPDF_CMapParser::CPDF_CMapParser()
+{
+ m_pCMap = NULL;
+ m_Status = 0;
+ m_CodeSeq = 0;
+}
+FX_BOOL CPDF_CMapParser::Initialize(CPDF_CMap* pCMap)
+{
+ m_pCMap = pCMap;
+ m_Status = 0;
+ m_CodeSeq = 0;
+ m_AddMaps.EstimateSize(0, 10240);
+ return TRUE;
+}
+static FX_DWORD CMap_GetCode(FX_BSTR word)
+{
+ int num = 0;
+ if (word.GetAt(0) == '<') {
+ for (int i = 1; i < word.GetLength(); i ++) {
+ FX_BYTE digit = word.GetAt(i);
+ if (digit >= '0' && digit <= '9') {
+ digit = digit - '0';
+ } else if (digit >= 'a' && digit <= 'f') {
+ digit = digit - 'a' + 10;
+ } else if (digit >= 'A' && digit <= 'F') {
+ digit = digit - 'A' + 10;
+ } else {
+ return num;
+ }
+ num = num * 16 + digit;
+ }
+ } else {
+ for (int i = 0; i < word.GetLength(); i ++) {
+ if (word.GetAt(i) < '0' || word.GetAt(i) > '9') {
+ return num;
+ }
+ num = num * 10 + word.GetAt(i) - '0';
+ }
+ }
+ return num;
+}
+static FX_BOOL _CMap_GetCodeRange(_CMap_CodeRange& range, FX_BSTR first, FX_BSTR second)
+{
+ if (first.GetLength() == 0 || first.GetAt(0) != '<') {
+ return FALSE;
+ }
+ int num = 0;
+ int i;
+ for (i = 1; i < first.GetLength(); i ++)
+ if (first.GetAt(i) == '>') {
+ break;
+ }
+ range.m_CharSize = (i - 1) / 2;
+ if (range.m_CharSize > 4) {
+ return FALSE;
+ }
+ for (i = 0; i < range.m_CharSize; i ++) {
+ FX_BYTE digit1 = first.GetAt(i * 2 + 1);
+ FX_BYTE digit2 = first.GetAt(i * 2 + 2);
+ FX_BYTE byte = (digit1 >= '0' && digit1 <= '9') ? (digit1 - '0') : ((digit1 & 0xdf) - 'A' + 10);
+ byte = byte * 16 + ((digit2 >= '0' && digit2 <= '9') ? (digit2 - '0') : ((digit2 & 0xdf) - 'A' + 10));
+ range.m_Lower[i] = byte;
+ }
+ FX_DWORD size = second.GetLength();
+ for (i = 0; i < range.m_CharSize; i ++) {
+ FX_BYTE digit1 = ((FX_DWORD)i * 2 + 1 < size) ? second.GetAt((FX_STRSIZE)i * 2 + 1) : 0;
+ FX_BYTE digit2 = ((FX_DWORD)i * 2 + 2 < size) ? second.GetAt((FX_STRSIZE)i * 2 + 2) : 0;
+ FX_BYTE byte = (digit1 >= '0' && digit1 <= '9') ? (digit1 - '0') : ((digit1 & 0xdf) - 'A' + 10);
+ byte = byte * 16 + ((digit2 >= '0' && digit2 <= '9') ? (digit2 - '0') : ((digit2 & 0xdf) - 'A' + 10));
+ range.m_Upper[i] = byte;
+ }
+ return TRUE;
+}
+static CFX_ByteString CMap_GetString(FX_BSTR word)
+{
+ return word.Mid(1, word.GetLength() - 2);
+}
+void CPDF_CMapParser::ParseWord(FX_BSTR word)
+{
+ if (word.IsEmpty()) {
+ return;
+ }
+ if (word == FX_BSTRC("begincidchar")) {
+ m_Status = 1;
+ m_CodeSeq = 0;
+ } else if (word == FX_BSTRC("begincidrange")) {
+ m_Status = 2;
+ m_CodeSeq = 0;
+ } else if (word == FX_BSTRC("endcidrange") || word == FX_BSTRC("endcidchar")) {
+ m_Status = 0;
+ } else if (word == FX_BSTRC("/WMode")) {
+ m_Status = 6;
+ } else if (word == FX_BSTRC("/Registry")) {
+ m_Status = 3;
+ } else if (word == FX_BSTRC("/Ordering")) {
+ m_Status = 4;
+ } else if (word == FX_BSTRC("/Supplement")) {
+ m_Status = 5;
+ } else if (word == FX_BSTRC("begincodespacerange")) {
+ m_Status = 7;
+ m_CodeSeq = 0;
+ } else if (word == FX_BSTRC("usecmap")) {
+ } else if (m_Status == 1 || m_Status == 2) {
+ m_CodePoints[m_CodeSeq] = CMap_GetCode(word);
+ m_CodeSeq ++;
+ FX_DWORD StartCode, EndCode;
+ FX_WORD StartCID;
+ if (m_Status == 1) {
+ if (m_CodeSeq < 2) {
+ return;
+ }
+ EndCode = StartCode = m_CodePoints[0];
+ StartCID = (FX_WORD)m_CodePoints[1];
+ } else {
+ if (m_CodeSeq < 3) {
+ return;
+ }
+ StartCode = m_CodePoints[0];
+ EndCode = m_CodePoints[1];
+ StartCID = (FX_WORD)m_CodePoints[2];
+ }
+ if (EndCode < 0x10000) {
+ for (FX_DWORD code = StartCode; code <= EndCode; code ++) {
+ m_pCMap->m_pMapping[code] = (FX_WORD)(StartCID + code - StartCode);
+ }
+ } else {
+ FX_DWORD buf[2];
+ buf[0] = StartCode;
+ buf[1] = ((EndCode - StartCode) << 16) + StartCID;
+ m_AddMaps.AppendBlock(buf, sizeof buf);
+ }
+ m_CodeSeq = 0;
+ } else if (m_Status == 3) {
+ CMap_GetString(word);
+ m_Status = 0;
+ } else if (m_Status == 4) {
+ m_pCMap->m_Charset = _CharsetFromOrdering(CMap_GetString(word));
+ m_Status = 0;
+ } else if (m_Status == 5) {
+ CMap_GetCode(word);
+ m_Status = 0;
+ } else if (m_Status == 6) {
+ m_pCMap->m_bVertical = CMap_GetCode(word);
+ m_Status = 0;
+ } else if (m_Status == 7) {
+ if (word == FX_BSTRC("endcodespacerange")) {
+ int nSegs = m_CodeRanges.GetSize();
+ if (nSegs > 1) {
+ m_pCMap->m_CodingScheme = CPDF_CMap::MixedFourBytes;
+ m_pCMap->m_nCodeRanges = nSegs;
+ m_pCMap->m_pLeadingBytes = FX_Alloc(FX_BYTE, nSegs * sizeof(_CMap_CodeRange));
+ FXSYS_memcpy32(m_pCMap->m_pLeadingBytes, m_CodeRanges.GetData(), nSegs * sizeof(_CMap_CodeRange));
+ } else if (nSegs == 1) {
+ m_pCMap->m_CodingScheme = (m_CodeRanges[0].m_CharSize == 2) ? CPDF_CMap::TwoBytes : CPDF_CMap::OneByte;
+ }
+ m_Status = 0;
+ } else {
+ if (word.GetLength() == 0 || word.GetAt(0) != '<') {
+ return;
+ }
+ if (m_CodeSeq % 2) {
+ _CMap_CodeRange range;
+ if (_CMap_GetCodeRange(range, m_LastWord, word)) {
+ m_CodeRanges.Add(range);
+ }
+ }
+ m_CodeSeq ++;
+ }
+ }
+ m_LastWord = word;
+}
+CPDF_CMap::CPDF_CMap()
+{
+ m_Charset = CIDSET_UNKNOWN;
+ m_Coding = CIDCODING_UNKNOWN;
+ m_CodingScheme = TwoBytes;
+ m_bVertical = 0;
+ m_bLoaded = FALSE;
+ m_pMapping = NULL;
+ m_pLeadingBytes = NULL;
+ m_pAddMapping = NULL;
+ m_pEmbedMap = NULL;
+ m_pUseMap = NULL;
+ m_nCodeRanges = 0;
+}
+CPDF_CMap::~CPDF_CMap()
+{
+ if (m_pMapping) {
+ FX_Free(m_pMapping);
+ }
+ if (m_pAddMapping) {
+ FX_Free(m_pAddMapping);
+ }
+ if (m_pLeadingBytes) {
+ FX_Free(m_pLeadingBytes);
+ }
+ if (m_pUseMap) {
+ delete m_pUseMap;
+ }
+}
+void CPDF_CMap::Release()
+{
+ if (m_PredefinedCMap.IsEmpty()) {
+ delete this;
+ }
+}
+const CPDF_PredefinedCMap g_PredefinedCMaps[] = {
+ { "GB-EUC", CIDSET_GB1, CIDCODING_GB, CPDF_CMap::MixedTwoBytes, 1, {0xa1, 0xfe} },
+ { "GBpc-EUC", CIDSET_GB1, CIDCODING_GB, CPDF_CMap::MixedTwoBytes, 1, {0xa1, 0xfc} },
+ { "GBK-EUC", CIDSET_GB1, CIDCODING_GB, CPDF_CMap::MixedTwoBytes, 1, {0x81, 0xfe} },
+ { "GBKp-EUC", CIDSET_GB1, CIDCODING_GB, CPDF_CMap::MixedTwoBytes, 1, {0x81, 0xfe} },
+ { "GBK2K-EUC", CIDSET_GB1, CIDCODING_GB, CPDF_CMap::MixedTwoBytes, 1, {0x81, 0xfe} },
+ { "GBK2K", CIDSET_GB1, CIDCODING_GB, CPDF_CMap::MixedTwoBytes, 1, {0x81, 0xfe} },
+ { "UniGB-UCS2", CIDSET_GB1, CIDCODING_UCS2, CPDF_CMap::TwoBytes },
+ { "UniGB-UTF16", CIDSET_GB1, CIDCODING_UTF16, CPDF_CMap::TwoBytes },
+ { "B5pc", CIDSET_CNS1, CIDCODING_BIG5, CPDF_CMap::MixedTwoBytes, 1, {0xa1, 0xfc} },
+ { "HKscs-B5", CIDSET_CNS1, CIDCODING_BIG5, CPDF_CMap::MixedTwoBytes, 1, {0x88, 0xfe} },
+ { "ETen-B5", CIDSET_CNS1, CIDCODING_BIG5, CPDF_CMap::MixedTwoBytes, 1, {0xa1, 0xfe} },
+ { "ETenms-B5", CIDSET_CNS1, CIDCODING_BIG5, CPDF_CMap::MixedTwoBytes, 1, {0xa1, 0xfe} },
+ { "UniCNS-UCS2", CIDSET_CNS1, CIDCODING_UCS2, CPDF_CMap::TwoBytes },
+ { "UniCNS-UTF16", CIDSET_CNS1, CIDCODING_UTF16, CPDF_CMap::TwoBytes },
+ { "83pv-RKSJ", CIDSET_JAPAN1, CIDCODING_JIS, CPDF_CMap::MixedTwoBytes, 2, {0x81, 0x9f, 0xe0, 0xfc} },
+ { "90ms-RKSJ", CIDSET_JAPAN1, CIDCODING_JIS, CPDF_CMap::MixedTwoBytes, 2, {0x81, 0x9f, 0xe0, 0xfc} },
+ { "90msp-RKSJ", CIDSET_JAPAN1, CIDCODING_JIS, CPDF_CMap::MixedTwoBytes, 2, {0x81, 0x9f, 0xe0, 0xfc} },
+ { "90pv-RKSJ", CIDSET_JAPAN1, CIDCODING_JIS, CPDF_CMap::MixedTwoBytes, 2, {0x81, 0x9f, 0xe0, 0xfc} },
+ { "Add-RKSJ", CIDSET_JAPAN1, CIDCODING_JIS, CPDF_CMap::MixedTwoBytes, 2, {0x81, 0x9f, 0xe0, 0xfc} },
+ { "EUC", CIDSET_JAPAN1, CIDCODING_JIS, CPDF_CMap::MixedTwoBytes, 2, {0x8e, 0x8e, 0xa1, 0xfe} },
+ { "H", CIDSET_JAPAN1, CIDCODING_JIS, CPDF_CMap::TwoBytes, 1, {0x21, 0x7e} },
+ { "V", CIDSET_JAPAN1, CIDCODING_JIS, CPDF_CMap::TwoBytes, 1, {0x21, 0x7e} },
+ { "Ext-RKSJ", CIDSET_JAPAN1, CIDCODING_JIS, CPDF_CMap::MixedTwoBytes, 2, {0x81, 0x9f, 0xe0, 0xfc} },
+ { "UniJIS-UCS2", CIDSET_JAPAN1, CIDCODING_UCS2, CPDF_CMap::TwoBytes },
+ { "UniJIS-UCS2-HW", CIDSET_JAPAN1, CIDCODING_UCS2, CPDF_CMap::TwoBytes },
+ { "UniJIS-UTF16", CIDSET_JAPAN1, CIDCODING_UTF16, CPDF_CMap::TwoBytes },
+ { "KSC-EUC", CIDSET_KOREA1, CIDCODING_KOREA, CPDF_CMap::MixedTwoBytes, 1, {0xa1, 0xfe} },
+ { "KSCms-UHC", CIDSET_KOREA1, CIDCODING_KOREA, CPDF_CMap::MixedTwoBytes, 1, {0x81, 0xfe} },
+ { "KSCms-UHC-HW", CIDSET_KOREA1, CIDCODING_KOREA, CPDF_CMap::MixedTwoBytes, 1, {0x81, 0xfe} },
+ { "KSCpc-EUC", CIDSET_KOREA1, CIDCODING_KOREA, CPDF_CMap::MixedTwoBytes, 1, {0xa1, 0xfd} },
+ { "UniKS-UCS2", CIDSET_KOREA1, CIDCODING_UCS2, CPDF_CMap::TwoBytes },
+ { "UniKS-UTF16", CIDSET_KOREA1, CIDCODING_UTF16, CPDF_CMap::TwoBytes },
+ { NULL, 0, 0 }
+};
+extern void FPDFAPI_FindEmbeddedCMap(const char* name, int charset, int coding, const FXCMAP_CMap*& pMap);
+extern FX_WORD FPDFAPI_CIDFromCharCode(const FXCMAP_CMap* pMap, FX_DWORD charcode);
+FX_BOOL CPDF_CMap::LoadPredefined(CPDF_CMapManager* pMgr, FX_LPCSTR pName, FX_BOOL bPromptCJK)
+{
+ m_PredefinedCMap = pName;
+ if (m_PredefinedCMap == FX_BSTRC("Identity-H") || m_PredefinedCMap == FX_BSTRC("Identity-V")) {
+ m_Coding = CIDCODING_CID;
+ m_bVertical = pName[9] == 'V';
+ m_bLoaded = TRUE;
+ return TRUE;
+ }
+ CFX_ByteString cmapid = m_PredefinedCMap;
+ m_bVertical = cmapid.Right(1) == FX_BSTRC("V");
+ if (cmapid.GetLength() > 2) {
+ cmapid = cmapid.Left(cmapid.GetLength() - 2);
+ }
+ int index = 0;
+ while (1) {
+ if (g_PredefinedCMaps[index].m_pName == NULL) {
+ return FALSE;
+ }
+ if (cmapid == CFX_ByteStringC(g_PredefinedCMaps[index].m_pName)) {
+ break;
+ }
+ index ++;
+ }
+ const CPDF_PredefinedCMap& map = g_PredefinedCMaps[index];
+ m_Charset = map.m_Charset;
+ m_Coding = map.m_Coding;
+ m_CodingScheme = map.m_CodingScheme;
+ if (m_CodingScheme == MixedTwoBytes) {
+ m_pLeadingBytes = FX_Alloc(FX_BYTE, 256);
+ FXSYS_memset32(m_pLeadingBytes, 0, 256);
+ for (FX_DWORD i = 0; i < map.m_LeadingSegCount; i ++) {
+ for (int b = map.m_LeadingSegs[i * 2]; b <= map.m_LeadingSegs[i * 2 + 1]; b ++) {
+ m_pLeadingBytes[b] = 1;
+ }
+ }
+ }
+ FPDFAPI_FindEmbeddedCMap(pName, m_Charset, m_Coding, m_pEmbedMap);
+ if (m_pEmbedMap) {
+ m_bLoaded = TRUE;
+ return TRUE;
+ }
+#ifndef _FPDFAPI_MINI_
+ FX_LPVOID pPackage = pMgr->GetPackage(bPromptCJK);
+ FX_LPBYTE pBuffer;
+ FX_DWORD size;
+ if (pPackage == NULL || !FXFC_LoadFile(pPackage, m_PredefinedCMap, pBuffer, size)) {
+ return FALSE;
+ }
+ m_pMapping = FX_Alloc(FX_WORD, 65536);
+ FXSYS_memset32(m_pMapping, 0, 65536 * sizeof(FX_WORD));
+ FX_DWORD dwRecodeEndPos = 0;
+ if (pBuffer[5] == 0) {
+ FX_DWORD dwStartIndex = *(FX_DWORD*)(pBuffer + 8);
+ FX_DWORD dwRecordCount = *(FX_DWORD*)(pBuffer + 16);
+ FX_DWORD dwDataOffset = *(FX_DWORD*)(pBuffer + 20);
+ if (dwRecordCount * 2 + dwStartIndex * 2 < 65536) {
+ FXSYS_memcpy32(m_pMapping + dwStartIndex * 2, pBuffer + dwDataOffset, dwRecordCount * 2);
+ }
+ dwRecodeEndPos = dwDataOffset + dwRecordCount * 2;
+ } else if (pBuffer[5] == 2) {
+ FX_DWORD nSegments = *(FX_DWORD*)(pBuffer + 16);
+ FX_DWORD dwDataOffset = *(FX_DWORD*)(pBuffer + 20);
+ dwRecodeEndPos = dwDataOffset + 6 * nSegments;
+ for (FX_DWORD i = 0; i < nSegments; i ++) {
+ FX_LPBYTE pRecord = pBuffer + dwDataOffset + i * 6;
+ FX_WORD IndexStart = *(FX_WORD*)pRecord;
+ FX_WORD IndexCount = *(FX_WORD*)(pRecord + 2);
+ FX_WORD CodeStart = *(FX_WORD*)(pRecord + 4);
+ if (IndexStart + IndexCount < 65536)
+ for (FX_DWORD j = 0; j < IndexCount; j ++) {
+ m_pMapping[IndexStart + j ] = (FX_WORD)(CodeStart + j);
+ }
+ }
+ }
+ if (dwRecodeEndPos < size) {
+ FX_DWORD dwMapLen = *(FX_DWORD*)(pBuffer + dwRecodeEndPos);
+ if (dwMapLen) {
+ m_pUseMap = FX_NEW CPDF_CMap;
+ CFX_ByteString bsName(pBuffer + dwRecodeEndPos + 4 , dwMapLen);
+ if (m_pUseMap) {
+ m_pUseMap->LoadPredefined(pMgr, bsName, bPromptCJK);
+ }
+ }
+ }
+ FX_Free(pBuffer);
+ m_bLoaded = TRUE;
+#endif
+ return TRUE;
+}
+extern "C" {
+ static int compare_dword(const void* data1, const void* data2)
+ {
+ return (*(FX_DWORD*)data1) - (*(FX_DWORD*)data2);
+ }
+};
+FX_BOOL CPDF_CMap::LoadEmbedded(FX_LPCBYTE pData, FX_DWORD size)
+{
+ m_pMapping = FX_Alloc(FX_WORD, 65536);
+ FXSYS_memset32(m_pMapping, 0, 65536 * sizeof(FX_WORD));
+ CPDF_CMapParser parser;
+ parser.Initialize(this);
+ CPDF_SimpleParser syntax(pData, size);
+ while (1) {
+ CFX_ByteStringC word = syntax.GetWord();
+ if (word.IsEmpty()) {
+ break;
+ }
+ parser.ParseWord(word);
+ }
+ if (m_CodingScheme == MixedFourBytes && parser.m_AddMaps.GetSize()) {
+ m_pAddMapping = FX_Alloc(FX_BYTE, parser.m_AddMaps.GetSize() + 4);
+ *(FX_DWORD*)m_pAddMapping = parser.m_AddMaps.GetSize() / 8;
+ FXSYS_memcpy32(m_pAddMapping + 4, parser.m_AddMaps.GetBuffer(), parser.m_AddMaps.GetSize());
+ FXSYS_qsort(m_pAddMapping + 4, parser.m_AddMaps.GetSize() / 8, 8, compare_dword);
+ }
+ return TRUE;
+}
+extern "C" {
+ static int compareCID(const void* key, const void* element)
+ {
+ if ((*(FX_DWORD*)key) < (*(FX_DWORD*)element)) {
+ return -1;
+ }
+ if ((*(FX_DWORD*)key) > (*(FX_DWORD*)element) + ((FX_DWORD*)element)[1] / 65536) {
+ return 1;
+ }
+ return 0;
+ }
+};
+FX_WORD CPDF_CMap::CIDFromCharCode(FX_DWORD charcode) const
+{
+ if (m_Coding == CIDCODING_CID) {
+ return (FX_WORD)charcode;
+ }
+ if (m_pEmbedMap) {
+ return FPDFAPI_CIDFromCharCode(m_pEmbedMap, charcode);
+ }
+ if (m_pMapping == NULL) {
+ return (FX_WORD)charcode;
+ }
+ if (charcode >> 16) {
+ if (m_pAddMapping) {
+ void* found = FXSYS_bsearch(&charcode, m_pAddMapping + 4, *(FX_DWORD*)m_pAddMapping, 8, compareCID);
+ if (found == NULL) {
+ if (m_pUseMap) {
+ return m_pUseMap->CIDFromCharCode(charcode);
+ }
+ return 0;
+ }
+ return (FX_WORD)(((FX_DWORD*)found)[1] % 65536 + charcode - * (FX_DWORD*)found);
+ }
+ if (m_pUseMap) {
+ return m_pUseMap->CIDFromCharCode(charcode);
+ }
+ return 0;
+ }
+ FX_DWORD CID = m_pMapping[charcode];
+ if (!CID && m_pUseMap) {
+ return m_pUseMap->CIDFromCharCode(charcode);
+ }
+ return (FX_WORD)CID;
+}
+static int _CheckCodeRange(FX_LPBYTE codes, int size, _CMap_CodeRange* pRanges, int nRanges)
+{
+ int iSeg = nRanges - 1;
+ while (iSeg >= 0) {
+ if (pRanges[iSeg].m_CharSize < size) {
+ iSeg --;
+ continue;
+ }
+ int iChar = 0;
+ while (iChar < size) {
+ if (codes[iChar] < pRanges[iSeg].m_Lower[iChar] ||
+ codes[iChar] > pRanges[iSeg].m_Upper[iChar]) {
+ break;
+ }
+ iChar ++;
+ }
+ if (iChar == pRanges[iSeg].m_CharSize) {
+ return 2;
+ }
+ if (iChar) {
+ if (size == pRanges[iSeg].m_CharSize) {
+ return 2;
+ }
+ return 1;
+ }
+ iSeg --;
+ }
+ return 0;
+}
+FX_DWORD CPDF_CMap::GetNextChar(FX_LPCSTR pString, int& offset) const
+{
+ switch (m_CodingScheme) {
+ case OneByte:
+ return ((FX_LPBYTE)pString)[offset++];
+ case TwoBytes:
+ offset += 2;
+ return ((FX_LPBYTE)pString)[offset - 2] * 256 + ((FX_LPBYTE)pString)[offset - 1];
+ case MixedTwoBytes: {
+ FX_BYTE byte1 = ((FX_LPBYTE)pString)[offset++];
+ if (!m_pLeadingBytes[byte1]) {
+ return byte1;
+ }
+ FX_BYTE byte2 = ((FX_LPBYTE)pString)[offset++];
+ return byte1 * 256 + byte2;
+ }
+ case MixedFourBytes: {
+ FX_BYTE codes[4];
+ int char_size = 1;
+ codes[0] = ((FX_LPBYTE)pString)[offset++];
+ _CMap_CodeRange* pRanges = (_CMap_CodeRange*)m_pLeadingBytes;
+ while (1) {
+ int ret = _CheckCodeRange(codes, char_size, pRanges, m_nCodeRanges);
+ if (ret == 0) {
+ return 0;
+ }
+ if (ret == 2) {
+ FX_DWORD charcode = 0;
+ for (int i = 0; i < char_size; i ++) {
+ charcode = (charcode << 8) + codes[i];
+ }
+ return charcode;
+ }
+ if (char_size == 4) {
+ return 0;
+ }
+ codes[char_size ++] = ((FX_LPBYTE)pString)[offset++];
+ }
+ break;
+ }
+ }
+ return 0;
+}
+int CPDF_CMap::GetCharSize(FX_DWORD charcode) const
+{
+ switch (m_CodingScheme) {
+ case OneByte:
+ return 1;
+ case TwoBytes:
+ return 2;
+ case MixedTwoBytes:
+ case MixedFourBytes:
+ if (charcode < 0x100) {
+ return 1;
+ }
+ if (charcode < 0x10000) {
+ return 2;
+ }
+ if (charcode < 0x1000000) {
+ return 3;
+ }
+ return 4;
+ }
+ return 1;
+}
+int CPDF_CMap::CountChar(FX_LPCSTR pString, int size) const
+{
+ switch (m_CodingScheme) {
+ case OneByte:
+ return size;
+ case TwoBytes:
+ return (size + 1) / 2;
+ case MixedTwoBytes: {
+ int count = 0;
+ for (int i = 0; i < size; i ++) {
+ count ++;
+ if (m_pLeadingBytes[((FX_LPBYTE)pString)[i]]) {
+ i ++;
+ }
+ }
+ return count;
+ }
+ case MixedFourBytes: {
+ int count = 0, offset = 0;
+ while (offset < size) {
+ GetNextChar(pString, offset);
+ count ++;
+ }
+ return count;
+ }
+ }
+ return size;
+}
+int _GetCharSize(FX_DWORD charcode, _CMap_CodeRange* pRanges, int iRangesSize)
+{
+ if (!iRangesSize) {
+ return 1;
+ }
+ FX_BYTE codes[4];
+ codes[0] = codes[1] = 0x00;
+ codes[2] = (FX_BYTE)(charcode >> 8 & 0xFF);
+ codes[3] = (FX_BYTE)charcode;
+ int offset = 0, size = 4;
+ for (int i = 0; i < 4; ++i) {
+ int iSeg = iRangesSize - 1;
+ while (iSeg >= 0) {
+ if (pRanges[iSeg].m_CharSize < size) {
+ iSeg --;
+ continue;
+ }
+ int iChar = 0;
+ while (iChar < size) {
+ if (codes[offset + iChar] < pRanges[iSeg].m_Lower[iChar] ||
+ codes[offset + iChar] > pRanges[iSeg].m_Upper[iChar]) {
+ break;
+ }
+ iChar ++;
+ }
+ if (iChar == pRanges[iSeg].m_CharSize) {
+ return size;
+ }
+ iSeg --;
+ }
+ size --;
+ offset ++;
+ }
+ return 1;
+}
+int CPDF_CMap::AppendChar(FX_LPSTR str, FX_DWORD charcode) const
+{
+ switch (m_CodingScheme) {
+ case OneByte:
+ str[0] = (FX_BYTE)charcode;
+ return 1;
+ case TwoBytes:
+ str[0] = (FX_BYTE)(charcode / 256);
+ str[1] = (FX_BYTE)(charcode % 256);
+ return 2;
+ case MixedTwoBytes:
+ case MixedFourBytes:
+ if (charcode < 0x100) {
+ _CMap_CodeRange* pRanges = (_CMap_CodeRange*)m_pLeadingBytes;
+ int iSize = _GetCharSize(charcode, pRanges, m_nCodeRanges);
+ if (iSize == 0) {
+ iSize = 1;
+ }
+ if (iSize > 1) {
+ FXSYS_memset32(str, 0, sizeof(FX_BYTE) * iSize);
+ }
+ str[iSize - 1] = (FX_BYTE)charcode;
+ return iSize;
+ } else if (charcode < 0x10000) {
+ str[0] = (FX_BYTE)(charcode >> 8);
+ str[1] = (FX_BYTE)charcode;
+ return 2;
+ } else if (charcode < 0x1000000) {
+ str[0] = (FX_BYTE)(charcode >> 16);
+ str[1] = (FX_BYTE)(charcode >> 8);
+ str[2] = (FX_BYTE)charcode;
+ return 3;
+ } else {
+ str[0] = (FX_BYTE)(charcode >> 24);
+ str[1] = (FX_BYTE)(charcode >> 16);
+ str[2] = (FX_BYTE)(charcode >> 8);
+ str[3] = (FX_BYTE)charcode;
+ return 4;
+ }
+ }
+ return 0;
+}
+CPDF_CID2UnicodeMap::CPDF_CID2UnicodeMap()
+{
+ m_EmbeddedCount = 0;
+#ifndef _FPDFAPI_MINI_
+ m_pExternalMap = NULL;
+#endif
+}
+CPDF_CID2UnicodeMap::~CPDF_CID2UnicodeMap()
+{
+#ifndef _FPDFAPI_MINI_
+ if (m_pExternalMap) {
+ delete m_pExternalMap;
+ }
+#endif
+}
+FX_BOOL CPDF_CID2UnicodeMap::Initialize()
+{
+#ifndef _FPDFAPI_MINI_
+ m_pExternalMap = FX_NEW CPDF_FXMP;
+#endif
+ return TRUE;
+}
+FX_BOOL CPDF_CID2UnicodeMap::IsLoaded()
+{
+#ifdef _FPDFAPI_MINI_
+ return m_EmbeddedCount != 0;
+#else
+ return m_EmbeddedCount != 0 || (m_pExternalMap != NULL && m_pExternalMap->IsLoaded());
+#endif
+}
+FX_WCHAR CPDF_CID2UnicodeMap::UnicodeFromCID(FX_WORD CID)
+{
+ if (m_Charset == CIDSET_UNICODE) {
+ return CID;
+ }
+ if (CID < m_EmbeddedCount) {
+ return m_pEmbeddedMap[CID];
+ }
+#ifdef _FPDFAPI_MINI_
+ return 0;
+#else
+ FX_LPCBYTE record = m_pExternalMap->GetRecord(CID);
+ if (record == NULL) {
+ return 0;
+ }
+ return *(FX_WORD*)record;
+#endif
+}
+void FPDFAPI_LoadCID2UnicodeMap(int charset, const FX_WORD*& pMap, FX_DWORD& count);
+void CPDF_CID2UnicodeMap::Load(CPDF_CMapManager* pMgr, int charset, FX_BOOL bPromptCJK)
+{
+ m_Charset = charset;
+ FPDFAPI_LoadCID2UnicodeMap(charset, m_pEmbeddedMap, m_EmbeddedCount);
+ if (m_EmbeddedCount) {
+ return;
+ }
+#ifndef _FPDFAPI_MINI_
+ FX_LPVOID pPackage = pMgr->GetPackage(bPromptCJK);
+ if (pPackage == NULL) {
+ return;
+ }
+ m_pExternalMap->LoadFile(pPackage, FX_BSTRC("CIDInfo_") + g_CharsetNames[charset]);
+#endif
+}
+#include "ttgsubtable.h"
+CPDF_CIDFont::CPDF_CIDFont()
+{
+ m_pCMap = NULL;
+ m_pAllocatedCMap = NULL;
+ m_pCID2UnicodeMap = NULL;
+ m_pAnsiWidths = NULL;
+ m_pCIDToGIDMap = NULL;
+ m_bCIDIsGID = FALSE;
+ m_bAdobeCourierStd = FALSE;
+ m_pTTGSUBTable = NULL;
+ FXSYS_memset8(m_CharBBox, 0xff, 256 * sizeof(FX_SMALL_RECT));
+}
+CPDF_CIDFont::~CPDF_CIDFont()
+{
+ if (m_pAnsiWidths) {
+ FX_Free(m_pAnsiWidths);
+ }
+ if (m_pAllocatedCMap) {
+ delete m_pAllocatedCMap;
+ }
+ if (m_pCIDToGIDMap) {
+ delete m_pCIDToGIDMap;
+ }
+ if (m_pTTGSUBTable) {
+ delete m_pTTGSUBTable;
+ }
+}
+FX_WORD CPDF_CIDFont::CIDFromCharCode(FX_DWORD charcode) const
+{
+ if (m_pCMap == NULL) {
+ return (FX_WORD)charcode;
+ }
+ return m_pCMap->CIDFromCharCode(charcode);
+}
+FX_BOOL CPDF_CIDFont::IsVertWriting() const
+{
+ return m_pCMap ? m_pCMap->IsVertWriting() : FALSE;
+}
+extern FX_DWORD FPDFAPI_CharCodeFromCID(const FXCMAP_CMap* pMap, FX_WORD cid);
+static FX_DWORD _EmbeddedCharcodeFromUnicode(const FXCMAP_CMap* pEmbedMap, int charset, FX_WCHAR unicode)
+{
+ if (charset <= 0 || charset > 4) {
+ return 0;
+ }
+ CPDF_FontGlobals* pFontGlobals = CPDF_ModuleMgr::Get()->GetPageModule()->GetFontGlobals();
+ const FX_WORD* pCodes = pFontGlobals->m_EmbeddedToUnicodes[charset].m_pMap;
+ if (pCodes == NULL) {
+ return 0;
+ }
+ int nCodes = pFontGlobals->m_EmbeddedToUnicodes[charset].m_Count;
+ for (int i = 0; i < nCodes; i++) {
+ if (pCodes[i] == unicode) {
+ FX_DWORD CharCode = FPDFAPI_CharCodeFromCID(pEmbedMap, i);
+ if (CharCode == 0) {
+ continue;
+ }
+ return CharCode;
+ }
+ }
+ return 0;
+}
+static FX_WCHAR _EmbeddedUnicodeFromCharcode(const FXCMAP_CMap* pEmbedMap, int charset, FX_DWORD charcode)
+{
+ if (charset <= 0 || charset > 4) {
+ return 0;
+ }
+ FX_WORD cid = FPDFAPI_CIDFromCharCode(pEmbedMap, charcode);
+ if (cid == 0) {
+ return 0;
+ }
+ CPDF_FontGlobals* pFontGlobals = CPDF_ModuleMgr::Get()->GetPageModule()->GetFontGlobals();
+ const FX_WORD* pCodes = pFontGlobals->m_EmbeddedToUnicodes[charset].m_pMap;
+ if (pCodes == NULL) {
+ return 0;
+ }
+ if (cid < pFontGlobals->m_EmbeddedToUnicodes[charset].m_Count) {
+ return pCodes[cid];
+ }
+ return 0;
+}
+FX_WCHAR CPDF_CIDFont::_UnicodeFromCharCode(FX_DWORD charcode) const
+{
+ switch (m_pCMap->m_Coding) {
+ case CIDCODING_UCS2:
+ case CIDCODING_UTF16:
+ return (FX_WCHAR)charcode;
+ case CIDCODING_CID:
+ if (m_pCID2UnicodeMap == NULL || !m_pCID2UnicodeMap->IsLoaded()) {
+ return 0;
+ }
+ return m_pCID2UnicodeMap->UnicodeFromCID((FX_WORD)charcode);
+ }
+ if (!m_pCMap->IsLoaded() || m_pCID2UnicodeMap == NULL || !m_pCID2UnicodeMap->IsLoaded()) {
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+ FX_WCHAR unicode;
+ int charsize = 1;
+ if (charcode > 255) {
+ charcode = (charcode % 256) * 256 + (charcode / 256);
+ charsize = 2;
+ }
+ int ret = FXSYS_MultiByteToWideChar(g_CharsetCPs[m_pCMap->m_Coding], 0, (FX_LPCSTR)&charcode, charsize, &unicode, 1);
+ if (ret != 1) {
+ return 0;
+ }
+ return unicode;
+#endif
+ if (m_pCMap->m_pEmbedMap) {
+ return _EmbeddedUnicodeFromCharcode(m_pCMap->m_pEmbedMap, m_pCMap->m_Charset, charcode);
+ } else {
+ return 0;
+ }
+ }
+ return m_pCID2UnicodeMap->UnicodeFromCID(CIDFromCharCode(charcode));
+}
+FX_DWORD CPDF_CIDFont::_CharCodeFromUnicode(FX_WCHAR unicode) const
+{
+ switch (m_pCMap->m_Coding) {
+ case CIDCODING_UNKNOWN:
+ return 0;
+ case CIDCODING_UCS2:
+ case CIDCODING_UTF16:
+ return unicode;
+ case CIDCODING_CID: {
+ if (m_pCID2UnicodeMap == NULL || !m_pCID2UnicodeMap->IsLoaded()) {
+ return 0;
+ }
+ FX_DWORD CID = 0;
+ while (CID < 65536) {
+ FX_WCHAR this_unicode = m_pCID2UnicodeMap->UnicodeFromCID((FX_WORD)CID);
+ if (this_unicode == unicode) {
+ return CID;
+ }
+ CID ++;
+ }
+ break;
+ }
+ }
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+ FX_BYTE buffer[32];
+ int ret = FXSYS_WideCharToMultiByte(g_CharsetCPs[m_pCMap->m_Coding], 0, &unicode, 1, (char*)buffer, 4, NULL, NULL);
+ if (ret == 1) {
+ return buffer[0];
+ } else if (ret == 2) {
+ return buffer[0] * 256 + buffer[1];
+ }
+ return 0;
+#endif
+ if (unicode < 0x80) {
+ return (FX_DWORD)unicode;
+ } else {
+ if (m_pCMap->m_pEmbedMap) {
+ return _EmbeddedCharcodeFromUnicode(m_pCMap->m_pEmbedMap, m_pCMap->m_Charset, unicode);
+ } else {
+ return 0;
+ }
+ }
+}
+static void FT_UseCIDCharmap(FXFT_Face face, int coding)
+{
+ int encoding;
+ switch (coding) {
+ case CIDCODING_GB:
+ encoding = FXFT_ENCODING_GB2312;
+ break;
+ case CIDCODING_BIG5:
+ encoding = FXFT_ENCODING_BIG5;
+ break;
+ case CIDCODING_JIS:
+ encoding = FXFT_ENCODING_SJIS;
+ break;
+ case CIDCODING_KOREA:
+ encoding = FXFT_ENCODING_JOHAB;
+ break;
+ default:
+ encoding = FXFT_ENCODING_UNICODE;
+ }
+ int err = FXFT_Select_Charmap(face, encoding);
+ if (err) {
+ err = FXFT_Select_Charmap(face, FXFT_ENCODING_UNICODE);
+ }
+ if (err && FXFT_Get_Face_Charmaps(face)) {
+ FXFT_Set_Charmap(face, *FXFT_Get_Face_Charmaps(face));
+ }
+}
+FX_BOOL CPDF_CIDFont::_Load()
+{
+ if (m_pFontDict->GetString(FX_BSTRC("Subtype")) == FX_BSTRC("TrueType")) {
+ return LoadGB2312();
+ }
+ CPDF_Array* pFonts = m_pFontDict->GetArray(FX_BSTRC("DescendantFonts"));
+ if (pFonts == NULL) {
+ return FALSE;
+ }
+ if (pFonts->GetCount() != 1) {
+ return FALSE;
+ }
+ CPDF_Dictionary* pCIDFontDict = pFonts->GetDict(0);
+ if (pCIDFontDict == NULL) {
+ return FALSE;
+ }
+ m_BaseFont = pCIDFontDict->GetString(FX_BSTRC("BaseFont"));
+ if ((m_BaseFont.Compare("CourierStd") == 0 || m_BaseFont.Compare("CourierStd-Bold") == 0
+ || m_BaseFont.Compare("CourierStd-BoldOblique") == 0 || m_BaseFont.Compare("CourierStd-Oblique") == 0)
+ && !IsEmbedded()) {
+ m_bAdobeCourierStd = TRUE;
+ }
+ CPDF_Dictionary* pFontDesc = pCIDFontDict->GetDict(FX_BSTRC("FontDescriptor"));
+ if (pFontDesc) {
+ LoadFontDescriptor(pFontDesc);
+ }
+ CPDF_Object* pEncoding = m_pFontDict->GetElementValue(FX_BSTRC("Encoding"));
+ if (pEncoding == NULL) {
+ return FALSE;
+ }
+ CFX_ByteString subtype = pCIDFontDict->GetString(FX_BSTRC("Subtype"));
+ m_bType1 = FALSE;
+ if (subtype == FX_BSTRC("CIDFontType0")) {
+ m_bType1 = TRUE;
+ }
+ if (pEncoding->GetType() == PDFOBJ_NAME) {
+ CFX_ByteString cmap = pEncoding->GetString();
+ m_pCMap = CPDF_ModuleMgr::Get()->GetPageModule()->GetFontGlobals()->m_CMapManager.GetPredefinedCMap(cmap,
+ m_pFontFile && m_bType1);
+ } else if (pEncoding->GetType() == PDFOBJ_STREAM) {
+ m_pAllocatedCMap = m_pCMap = FX_NEW CPDF_CMap;
+ CPDF_Stream* pStream = (CPDF_Stream*)pEncoding;
+ CPDF_StreamAcc acc;
+ acc.LoadAllData(pStream, FALSE);
+ m_pCMap->LoadEmbedded(acc.GetData(), acc.GetSize());
+ } else {
+ return FALSE;
+ }
+ if (m_pCMap == NULL) {
+ return FALSE;
+ }
+ m_Charset = m_pCMap->m_Charset;
+ if (m_Charset == CIDSET_UNKNOWN) {
+ CPDF_Dictionary* pCIDInfo = pCIDFontDict->GetDict(FX_BSTRC("CIDSystemInfo"));
+ if (pCIDInfo) {
+ m_Charset = _CharsetFromOrdering(pCIDInfo->GetString(FX_BSTRC("Ordering")));
+ }
+ }
+ if (m_Charset != CIDSET_UNKNOWN)
+ m_pCID2UnicodeMap = CPDF_ModuleMgr::Get()->GetPageModule()->GetFontGlobals()->m_CMapManager.GetCID2UnicodeMap(m_Charset,
+ m_pFontFile == NULL && (m_pCMap->m_Coding == CIDCODING_CID || pCIDFontDict->KeyExist(FX_BSTRC("W"))));
+ if (m_Font.GetFace()) {
+ if (m_bType1) {
+ FXFT_Select_Charmap(m_Font.GetFace(), FXFT_ENCODING_UNICODE);
+ } else {
+ FT_UseCIDCharmap(m_Font.GetFace(), m_pCMap->m_Coding);
+ }
+ }
+ m_DefaultWidth = pCIDFontDict->GetInteger(FX_BSTRC("DW"), 1000);
+ CPDF_Array* pWidthArray = pCIDFontDict->GetArray(FX_BSTRC("W"));
+ if (pWidthArray) {
+ LoadMetricsArray(pWidthArray, m_WidthList, 1);
+ }
+ if (!IsEmbedded()) {
+ LoadSubstFont();
+ }
+ if (1) {
+ if (m_pFontFile || (GetSubstFont()->m_SubstFlags & FXFONT_SUBST_EXACT)) {
+ CPDF_Object* pmap = pCIDFontDict->GetElementValue(FX_BSTRC("CIDToGIDMap"));
+ if (pmap) {
+ if (pmap->GetType() == PDFOBJ_STREAM) {
+ m_pCIDToGIDMap = FX_NEW CPDF_StreamAcc;
+ m_pCIDToGIDMap->LoadAllData((CPDF_Stream*)pmap, FALSE);
+ } else if (pmap->GetString() == FX_BSTRC("Identity")) {
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+ if (m_pFontFile) {
+ m_bCIDIsGID = TRUE;
+ }
+#else
+ m_bCIDIsGID = TRUE;
+#endif
+ }
+ }
+ }
+ }
+ CheckFontMetrics();
+ if (IsVertWriting()) {
+ pWidthArray = pCIDFontDict->GetArray(FX_BSTRC("W2"));
+ if (pWidthArray) {
+ LoadMetricsArray(pWidthArray, m_VertMetrics, 3);
+ }
+ CPDF_Array* pDefaultArray = pCIDFontDict->GetArray(FX_BSTRC("DW2"));
+ if (pDefaultArray) {
+ m_DefaultVY = pDefaultArray->GetInteger(0);
+ m_DefaultW1 = pDefaultArray->GetInteger(1);
+ } else {
+ m_DefaultVY = 880;
+ m_DefaultW1 = -1000;
+ }
+ }
+ return TRUE;
+}
+FX_FLOAT _CIDTransformToFloat(FX_BYTE ch)
+{
+ if (ch < 128) {
+ return ch * 1.0f / 127;
+ }
+ return (-255 + ch) * 1.0f / 127;
+}
+void CPDF_CIDFont::GetCharBBox(FX_DWORD charcode, FX_RECT& rect, int level)
+{
+ if (charcode < 256 && m_CharBBox[charcode].Right != -1) {
+ rect.bottom = m_CharBBox[charcode].Bottom;
+ rect.left = m_CharBBox[charcode].Left;
+ rect.right = m_CharBBox[charcode].Right;
+ rect.top = m_CharBBox[charcode].Top;
+ return;
+ }
+ FX_BOOL bVert = FALSE;
+ int glyph_index = GlyphFromCharCode(charcode, &bVert);
+ if (m_Font.m_Face == NULL) {
+ rect = FX_RECT(0, 0, 0, 0);
+ } else {
+ rect.left = rect.bottom = rect.right = rect.top = 0;
+ FXFT_Face face = m_Font.m_Face;
+ if (FXFT_Is_Face_Tricky(face)) {
+ int err = FXFT_Load_Glyph(face, glyph_index, FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH);
+ if (!err) {
+ FXFT_BBox cbox;
+ FXFT_Glyph glyph;
+ err = FXFT_Get_Glyph(((FXFT_Face)face)->glyph, &glyph);
+ if (!err) {
+ FXFT_Glyph_Get_CBox(glyph, FXFT_GLYPH_BBOX_PIXELS, &cbox);
+ int pixel_size_x = ((FXFT_Face)face)->size->metrics.x_ppem;
+ int pixel_size_y = ((FXFT_Face)face)->size->metrics.y_ppem;
+ if (pixel_size_x == 0 || pixel_size_y == 0) {
+ rect.left = cbox.xMin;
+ rect.right = cbox.xMax;
+ rect.top = cbox.yMax;
+ rect.bottom = cbox.yMin;
+ } else {
+ rect.left = cbox.xMin * 1000 / pixel_size_x;
+ rect.right = cbox.xMax * 1000 / pixel_size_x;
+ rect.top = cbox.yMax * 1000 / pixel_size_y;
+ rect.bottom = cbox.yMin * 1000 / pixel_size_y;
+ }
+ if (rect.top > FXFT_Get_Face_Ascender(face)) {
+ rect.top = FXFT_Get_Face_Ascender(face);
+ }
+ if (rect.bottom < FXFT_Get_Face_Descender(face)) {
+ rect.bottom = FXFT_Get_Face_Descender(face);
+ }
+ FXFT_Done_Glyph(glyph);
+ }
+ }
+ } else {
+ int err = FXFT_Load_Glyph(face, glyph_index, FXFT_LOAD_NO_SCALE);
+ if (err == 0) {
+ rect.left = TT2PDF(FXFT_Get_Glyph_HoriBearingX(face), face);
+ rect.right = TT2PDF(FXFT_Get_Glyph_HoriBearingX(face) + FXFT_Get_Glyph_Width(face), face);
+ rect.top = TT2PDF(FXFT_Get_Glyph_HoriBearingY(face), face);
+ rect.top += rect.top / 64;
+ rect.bottom = TT2PDF(FXFT_Get_Glyph_HoriBearingY(face) - FXFT_Get_Glyph_Height(face), face);
+ }
+ }
+ }
+ if (m_pFontFile == NULL && m_Charset == CIDSET_JAPAN1) {
+ FX_WORD CID = CIDFromCharCode(charcode);
+ FX_LPCBYTE pTransform = GetCIDTransform(CID);
+ if (pTransform && !bVert) {
+ CFX_AffineMatrix matrix(_CIDTransformToFloat(pTransform[0]), _CIDTransformToFloat(pTransform[1]),
+ _CIDTransformToFloat(pTransform[2]), _CIDTransformToFloat(pTransform[3]),
+ _CIDTransformToFloat(pTransform[4]) * 1000 , _CIDTransformToFloat(pTransform[5]) * 1000);
+ CFX_FloatRect rect_f(rect);
+ rect_f.Transform(&matrix);
+ rect = rect_f.GetOutterRect();
+ }
+ }
+ if (charcode < 256) {
+ m_CharBBox[charcode].Bottom = (short)rect.bottom;
+ m_CharBBox[charcode].Left = (short)rect.left;
+ m_CharBBox[charcode].Right = (short)rect.right;
+ m_CharBBox[charcode].Top = (short)rect.top;
+ }
+}
+int CPDF_CIDFont::GetCharWidthF(FX_DWORD charcode, int level)
+{
+ if (m_pAnsiWidths && charcode < 0x80) {
+ return m_pAnsiWidths[charcode];
+ }
+ FX_WORD cid = CIDFromCharCode(charcode);
+ int size = m_WidthList.GetSize();
+ FX_DWORD* list = m_WidthList.GetData();
+ for (int i = 0; i < size; i += 3) {
+ if (cid >= list[i] && cid <= list[i + 1]) {
+ return (int)list[i + 2];
+ }
+ }
+ return m_DefaultWidth;
+}
+short CPDF_CIDFont::GetVertWidth(FX_WORD CID) const
+{
+ FX_DWORD vertsize = m_VertMetrics.GetSize() / 5;
+ if (vertsize == 0) {
+ return m_DefaultW1;
+ }
+ const FX_DWORD* pTable = m_VertMetrics.GetData();
+ for (FX_DWORD i = 0; i < vertsize; i ++)
+ if (pTable[i * 5] <= CID && pTable[i * 5 + 1] >= CID) {
+ return (short)(int)pTable[i * 5 + 2];
+ }
+ return m_DefaultW1;
+}
+void CPDF_CIDFont::GetVertOrigin(FX_WORD CID, short& vx, short &vy) const
+{
+ FX_DWORD vertsize = m_VertMetrics.GetSize() / 5;
+ if (vertsize) {
+ const FX_DWORD* pTable = m_VertMetrics.GetData();
+ for (FX_DWORD i = 0; i < vertsize; i ++)
+ if (pTable[i * 5] <= CID && pTable[i * 5 + 1] >= CID) {
+ vx = (short)(int)pTable[i * 5 + 3];
+ vy = (short)(int)pTable[i * 5 + 4];
+ return;
+ }
+ }
+ FX_DWORD dwWidth = m_DefaultWidth;
+ int size = m_WidthList.GetSize();
+ const FX_DWORD* list = m_WidthList.GetData();
+ for (int i = 0; i < size; i += 3) {
+ if (CID >= list[i] && CID <= list[i + 1]) {
+ dwWidth = (FX_WORD)list[i + 2];
+ break;
+ }
+ }
+ vx = (short)dwWidth / 2;
+ vy = (short)m_DefaultVY;
+}
+int CPDF_CIDFont::GetGlyphIndex(FX_DWORD unicode, FX_BOOL *pVertGlyph)
+{
+ if (pVertGlyph) {
+ *pVertGlyph = FALSE;
+ }
+ int index = FXFT_Get_Char_Index(m_Font.m_Face, unicode );
+ if (unicode == 0x2502) {
+ return index;
+ }
+ if (index && IsVertWriting()) {
+ if (m_pTTGSUBTable) {
+ TT_uint32_t vindex = 0;
+ m_pTTGSUBTable->GetVerticalGlyph(index, &vindex);
+ if (vindex) {
+ index = vindex;
+ if (pVertGlyph) {
+ *pVertGlyph = TRUE;
+ }
+ }
+ return index;
+ }
+ if (NULL == m_Font.m_pGsubData) {
+ unsigned long length = 0;
+ int error = FXFT_Load_Sfnt_Table( m_Font.m_Face, FT_MAKE_TAG('G', 'S', 'U', 'B'), 0, NULL, &length);
+ if (!error) {
+ m_Font.m_pGsubData = (unsigned char*)FX_Alloc(FX_BYTE, length);
+ }
+ }
+ int error = FXFT_Load_Sfnt_Table( m_Font.m_Face, FT_MAKE_TAG('G', 'S', 'U', 'B'), 0, m_Font.m_pGsubData, NULL);
+ if (!error && m_Font.m_pGsubData) {
+ m_pTTGSUBTable = FX_NEW CFX_CTTGSUBTable;
+ m_pTTGSUBTable->LoadGSUBTable((FT_Bytes)m_Font.m_pGsubData);
+ TT_uint32_t vindex = 0;
+ m_pTTGSUBTable->GetVerticalGlyph(index, &vindex);
+ if (vindex) {
+ index = vindex;
+ if (pVertGlyph) {
+ *pVertGlyph = TRUE;
+ }
+ }
+ }
+ return index;
+ }
+ if (pVertGlyph) {
+ *pVertGlyph = FALSE;
+ }
+ return index;
+}
+int CPDF_CIDFont::GlyphFromCharCode(FX_DWORD charcode, FX_BOOL *pVertGlyph)
+{
+ if (pVertGlyph) {
+ *pVertGlyph = FALSE;
+ }
+ if (m_pFontFile == NULL && m_pCIDToGIDMap == NULL) {
+ FX_WORD cid = CIDFromCharCode(charcode);
+ FX_WCHAR unicode = 0;
+ if (m_bCIDIsGID) {
+#if _FXM_PLATFORM_ != _FXM_PLATFORM_APPLE_
+ return cid;
+#else
+ if (m_Flags & PDFFONT_SYMBOLIC) {
+ return cid;
+ }
+ CFX_WideString uni_str = UnicodeFromCharCode(charcode);
+ if (uni_str.IsEmpty()) {
+ return cid;
+ }
+ unicode = uni_str.GetAt(0);
+#endif
+ } else {
+ if (cid && m_pCID2UnicodeMap && m_pCID2UnicodeMap->IsLoaded()) {
+ unicode = m_pCID2UnicodeMap->UnicodeFromCID(cid);
+ }
+ if (unicode == 0) {
+ unicode = _UnicodeFromCharCode(charcode);
+ }
+ if (unicode == 0 && !(m_Flags & PDFFONT_SYMBOLIC)) {
+ unicode = UnicodeFromCharCode(charcode).GetAt(0);
+ }
+ }
+ if (unicode == 0) {
+ if (!m_bAdobeCourierStd) {
+ return charcode == 0 ? -1 : (int)charcode;
+ }
+ charcode += 31;
+ int index = 0, iBaseEncoding;
+ FX_BOOL bMSUnicode = FT_UseTTCharmap(m_Font.m_Face, 3, 1);
+ FX_BOOL bMacRoman = FALSE;
+ if (!bMSUnicode) {
+ bMacRoman = FT_UseTTCharmap(m_Font.m_Face, 1, 0);
+ }
+ iBaseEncoding = PDFFONT_ENCODING_STANDARD;
+ if (bMSUnicode) {
+ iBaseEncoding = PDFFONT_ENCODING_WINANSI;
+ } else if (bMacRoman) {
+ iBaseEncoding = PDFFONT_ENCODING_MACROMAN;
+ }
+ FX_LPCSTR name = GetAdobeCharName(iBaseEncoding, NULL, charcode);
+ if (name == NULL) {
+ return charcode == 0 ? -1 : (int)charcode;
+ }
+ FX_WORD unicode = PDF_UnicodeFromAdobeName(name);
+ if (unicode) {
+ if (bMSUnicode) {
+ index = FXFT_Get_Char_Index(m_Font.m_Face, unicode);
+ } else if (bMacRoman) {
+ FX_DWORD maccode = FT_CharCodeFromUnicode(FXFT_ENCODING_APPLE_ROMAN, unicode);
+ index = !maccode ? FXFT_Get_Name_Index(m_Font.m_Face, (char *)name) : FXFT_Get_Char_Index(m_Font.m_Face, maccode);
+ } else {
+ return FXFT_Get_Char_Index(m_Font.m_Face, unicode);
+ }
+ } else {
+ return charcode == 0 ? -1 : (int)charcode;
+ }
+ if (index == 0 || index == 0xffff) {
+ return charcode == 0 ? -1 : (int)charcode;
+ } else {
+ return index;
+ }
+ }
+ if (m_Charset == CIDSET_JAPAN1) {
+ if (unicode == '\\') {
+ unicode = '/';
+ }
+#if !defined(_FPDFAPI_MINI_) && _FXM_PLATFORM_ != _FXM_PLATFORM_APPLE_
+ else if (unicode == 0xa5) {
+ unicode = 0x5c;
+ }
+#endif
+ }
+ if (m_Font.m_Face == NULL) {
+ return unicode;
+ }
+ int err = FXFT_Select_Charmap(m_Font.m_Face, FXFT_ENCODING_UNICODE);
+ if (err != 0) {
+ int i;
+ for (i = 0; i < FXFT_Get_Face_CharmapCount(m_Font.m_Face); i ++) {
+ FX_DWORD ret = FT_CharCodeFromUnicode(FXFT_Get_Charmap_Encoding(FXFT_Get_Face_Charmaps(m_Font.m_Face)[i]), (FX_WCHAR)charcode);
+ if (ret == 0) {
+ continue;
+ }
+ FXFT_Set_Charmap(m_Font.m_Face, FXFT_Get_Face_Charmaps(m_Font.m_Face)[i]);
+ unicode = (FX_WCHAR)ret;
+ break;
+ }
+ if (i == FXFT_Get_Face_CharmapCount(m_Font.m_Face) && i) {
+ FXFT_Set_Charmap(m_Font.m_Face, FXFT_Get_Face_Charmaps(m_Font.m_Face)[0]);
+ unicode = (FX_WCHAR)charcode;
+ }
+ }
+ if (FXFT_Get_Face_Charmap(m_Font.m_Face)) {
+ int index = GetGlyphIndex(unicode, pVertGlyph);
+ if (index == 0) {
+ return -1;
+ }
+ return index;
+ }
+ return unicode ;
+ }
+ if (m_Font.m_Face == NULL) {
+ return -1;
+ }
+ FX_WORD cid = CIDFromCharCode(charcode);
+ if (m_bType1) {
+ if (NULL == m_pCIDToGIDMap) {
+ return cid;
+ }
+ } else {
+ if (m_pCIDToGIDMap == NULL) {
+ if (m_pFontFile && m_pCMap->m_pMapping == NULL) {
+ return cid;
+ }
+ if (m_pCMap->m_Coding == CIDCODING_UNKNOWN || FXFT_Get_Face_Charmap(m_Font.m_Face) == NULL) {
+ return cid;
+ }
+ if (FXFT_Get_Charmap_Encoding(FXFT_Get_Face_Charmap(m_Font.m_Face)) == FXFT_ENCODING_UNICODE) {
+ CFX_WideString unicode_str = UnicodeFromCharCode(charcode);
+ if (unicode_str.IsEmpty()) {
+ return -1;
+ }
+ charcode = unicode_str.GetAt(0);
+ }
+ return GetGlyphIndex(charcode, pVertGlyph);
+ }
+ }
+ FX_DWORD byte_pos = cid * 2;
+ if (byte_pos + 2 > m_pCIDToGIDMap->GetSize()) {
+ return -1;
+ }
+ FX_LPCBYTE pdata = m_pCIDToGIDMap->GetData() + byte_pos;
+ return pdata[0] * 256 + pdata[1];
+}
+FX_DWORD CPDF_CIDFont::GetNextChar(FX_LPCSTR pString, int& offset) const
+{
+ return m_pCMap->GetNextChar(pString, offset);
+}
+int CPDF_CIDFont::GetCharSize(FX_DWORD charcode) const
+{
+ return m_pCMap->GetCharSize(charcode);
+}
+int CPDF_CIDFont::CountChar(FX_LPCSTR pString, int size) const
+{
+ return m_pCMap->CountChar(pString, size);
+}
+int CPDF_CIDFont::AppendChar(FX_LPSTR str, FX_DWORD charcode) const
+{
+ return m_pCMap->AppendChar(str, charcode);
+}
+FX_BOOL CPDF_CIDFont::IsUnicodeCompatible() const
+{
+ if (!m_pCMap->IsLoaded() || m_pCID2UnicodeMap == NULL || !m_pCID2UnicodeMap->IsLoaded()) {
+ return m_pCMap->m_Coding != CIDCODING_UNKNOWN;
+ }
+ return TRUE;
+}
+FX_BOOL CPDF_CIDFont::IsFontStyleFromCharCode(FX_DWORD charcode) const
+{
+ return TRUE;
+}
+void CPDF_CIDFont::LoadSubstFont()
+{
+ m_Font.LoadSubst(m_BaseFont, !m_bType1, m_Flags, m_StemV * 5, m_ItalicAngle, g_CharsetCPs[m_Charset], IsVertWriting());
+}
+void CPDF_CIDFont::LoadMetricsArray(CPDF_Array* pArray, CFX_DWordArray& result, int nElements)
+{
+ int width_status = 0;
+ int iCurElement = 0;
+ int first_code = 0, last_code;
+ FX_DWORD count = pArray->GetCount();
+ for (FX_DWORD i = 0; i < count; i ++) {
+ CPDF_Object* pObj = pArray->GetElementValue(i);
+ if (pObj == NULL) {
+ continue;
+ }
+ if (pObj->GetType() == PDFOBJ_ARRAY) {
+ if (width_status != 1) {
+ return;
+ }
+ CPDF_Array* pArray = (CPDF_Array*)pObj;
+ FX_DWORD count = pArray->GetCount();
+ for (FX_DWORD j = 0; j < count; j += nElements) {
+ result.Add(first_code);
+ result.Add(first_code);
+ for (int k = 0; k < nElements; k ++) {
+ result.Add(pArray->GetInteger(j + k));
+ }
+ first_code ++;
+ }
+ width_status = 0;
+ } else {
+ if (width_status == 0) {
+ first_code = pObj->GetInteger();
+ width_status = 1;
+ } else if (width_status == 1) {
+ last_code = pObj->GetInteger();
+ width_status = 2;
+ iCurElement = 0;
+ } else {
+ if (!iCurElement) {
+ result.Add(first_code);
+ result.Add(last_code);
+ }
+ result.Add(pObj->GetInteger());
+ iCurElement ++;
+ if (iCurElement == nElements) {
+ width_status = 0;
+ }
+ }
+ }
+ }
+}
+FX_BOOL CPDF_CIDFont::LoadGB2312()
+{
+ m_BaseFont = m_pFontDict->GetString(FX_BSTRC("BaseFont"));
+ CPDF_Dictionary* pFontDesc = m_pFontDict->GetDict(FX_BSTRC("FontDescriptor"));
+ if (pFontDesc) {
+ LoadFontDescriptor(pFontDesc);
+ }
+ m_Charset = CIDSET_GB1;
+ m_bType1 = FALSE;
+ m_pCMap = CPDF_ModuleMgr::Get()->GetPageModule()->GetFontGlobals()->m_CMapManager.GetPredefinedCMap(
+ FX_BSTRC("GBK-EUC-H"), FALSE);
+ m_pCID2UnicodeMap = CPDF_ModuleMgr::Get()->GetPageModule()->GetFontGlobals()->m_CMapManager.GetCID2UnicodeMap(m_Charset, FALSE);
+ if (!IsEmbedded()) {
+ LoadSubstFont();
+ }
+ CheckFontMetrics();
+ m_DefaultWidth = 1000;
+ m_pAnsiWidths = FX_Alloc(FX_WORD, 128);
+ FXSYS_memset32(m_pAnsiWidths, 0, 128 * sizeof(FX_WORD));
+ for (int i = 32; i < 127; i ++) {
+ m_pAnsiWidths[i] = 500;
+ }
+ return TRUE;
+}
+const struct _CIDTransform {
+ FX_WORD CID;
+ FX_BYTE a, b, c, d, e, f;
+}
+Japan1_VertCIDs[] = {
+ {97, 129, 0, 0, 127, 55, 0},
+ {7887, 127, 0, 0, 127, 76, 89},
+ {7888, 127, 0, 0, 127, 79, 94},
+ {7889, 0, 129, 127, 0, 17, 127},
+ {7890, 0, 129, 127, 0, 17, 127},
+ {7891, 0, 129, 127, 0, 17, 127},
+ {7892, 0, 129, 127, 0, 17, 127},
+ {7893, 0, 129, 127, 0, 17, 127},
+ {7894, 0, 129, 127, 0, 17, 127},
+ {7895, 0, 129, 127, 0, 17, 127},
+ {7896, 0, 129, 127, 0, 17, 127},
+ {7897, 0, 129, 127, 0, 17, 127},
+ {7898, 0, 129, 127, 0, 17, 127},
+ {7899, 0, 129, 127, 0, 17, 104},
+ {7900, 0, 129, 127, 0, 17, 127},
+ {7901, 0, 129, 127, 0, 17, 104},
+ {7902, 0, 129, 127, 0, 17, 127},
+ {7903, 0, 129, 127, 0, 17, 127},
+ {7904, 0, 129, 127, 0, 17, 127},
+ {7905, 0, 129, 127, 0, 17, 114},
+ {7906, 0, 129, 127, 0, 17, 127},
+ {7907, 0, 129, 127, 0, 17, 127},
+ {7908, 0, 129, 127, 0, 17, 127},
+ {7909, 0, 129, 127, 0, 17, 127},
+ {7910, 0, 129, 127, 0, 17, 127},
+ {7911, 0, 129, 127, 0, 17, 127},
+ {7912, 0, 129, 127, 0, 17, 127},
+ {7913, 0, 129, 127, 0, 17, 127},
+ {7914, 0, 129, 127, 0, 17, 127},
+ {7915, 0, 129, 127, 0, 17, 114},
+ {7916, 0, 129, 127, 0, 17, 127},
+ {7917, 0, 129, 127, 0, 17, 127},
+ {7918, 127, 0, 0, 127, 18, 25},
+ {7919, 127, 0, 0, 127, 18, 25},
+ {7920, 127, 0, 0, 127, 18, 25},
+ {7921, 127, 0, 0, 127, 18, 25},
+ {7922, 127, 0, 0, 127, 18, 25},
+ {7923, 127, 0, 0, 127, 18, 25},
+ {7924, 127, 0, 0, 127, 18, 25},
+ {7925, 127, 0, 0, 127, 18, 25},
+ {7926, 127, 0, 0, 127, 18, 25},
+ {7927, 127, 0, 0, 127, 18, 25},
+ {7928, 127, 0, 0, 127, 18, 25},
+ {7929, 127, 0, 0, 127, 18, 25},
+ {7930, 127, 0, 0, 127, 18, 25},
+ {7931, 127, 0, 0, 127, 18, 25},
+ {7932, 127, 0, 0, 127, 18, 25},
+ {7933, 127, 0, 0, 127, 18, 25},
+ {7934, 127, 0, 0, 127, 18, 25},
+ {7935, 127, 0, 0, 127, 18, 25},
+ {7936, 127, 0, 0, 127, 18, 25},
+ {7937, 127, 0, 0, 127, 18, 25},
+ {7938, 127, 0, 0, 127, 18, 25},
+ {7939, 127, 0, 0, 127, 18, 25},
+ {8720, 0, 129, 127, 0, 19, 102},
+ {8721, 0, 129, 127, 0, 13, 127},
+ {8722, 0, 129, 127, 0, 19, 108},
+ {8723, 0, 129, 127, 0, 19, 102},
+ {8724, 0, 129, 127, 0, 19, 102},
+ {8725, 0, 129, 127, 0, 19, 102},
+ {8726, 0, 129, 127, 0, 19, 102},
+ {8727, 0, 129, 127, 0, 19, 102},
+ {8728, 0, 129, 127, 0, 19, 114},
+ {8729, 0, 129, 127, 0, 19, 114},
+ {8730, 0, 129, 127, 0, 38, 108},
+ {8731, 0, 129, 127, 0, 13, 108},
+ {8732, 0, 129, 127, 0, 19, 108},
+ {8733, 0, 129, 127, 0, 19, 108},
+ {8734, 0, 129, 127, 0, 19, 108},
+ {8735, 0, 129, 127, 0, 19, 108},
+ {8736, 0, 129, 127, 0, 19, 102},
+ {8737, 0, 129, 127, 0, 19, 102},
+ {8738, 0, 129, 127, 0, 19, 102},
+ {8739, 0, 129, 127, 0, 19, 102},
+ {8740, 0, 129, 127, 0, 19, 102},
+ {8741, 0, 129, 127, 0, 19, 102},
+ {8742, 0, 129, 127, 0, 19, 102},
+ {8743, 0, 129, 127, 0, 19, 102},
+ {8744, 0, 129, 127, 0, 19, 102},
+ {8745, 0, 129, 127, 0, 19, 102},
+ {8746, 0, 129, 127, 0, 19, 114},
+ {8747, 0, 129, 127, 0, 19, 114},
+ {8748, 0, 129, 127, 0, 19, 102},
+ {8749, 0, 129, 127, 0, 19, 102},
+ {8750, 0, 129, 127, 0, 19, 102},
+ {8751, 0, 129, 127, 0, 19, 102},
+ {8752, 0, 129, 127, 0, 19, 102},
+ {8753, 0, 129, 127, 0, 19, 102},
+ {8754, 0, 129, 127, 0, 19, 102},
+ {8755, 0, 129, 127, 0, 19, 102},
+ {8756, 0, 129, 127, 0, 19, 102},
+ {8757, 0, 129, 127, 0, 19, 102},
+ {8758, 0, 129, 127, 0, 19, 102},
+ {8759, 0, 129, 127, 0, 19, 102},
+ {8760, 0, 129, 127, 0, 19, 102},
+ {8761, 0, 129, 127, 0, 19, 102},
+ {8762, 0, 129, 127, 0, 19, 102},
+ {8763, 0, 129, 127, 0, 19, 102},
+ {8764, 0, 129, 127, 0, 19, 102},
+ {8765, 0, 129, 127, 0, 19, 102},
+ {8766, 0, 129, 127, 0, 19, 102},
+ {8767, 0, 129, 127, 0, 19, 102},
+ {8768, 0, 129, 127, 0, 19, 102},
+ {8769, 0, 129, 127, 0, 19, 102},
+ {8770, 0, 129, 127, 0, 19, 102},
+ {8771, 0, 129, 127, 0, 19, 102},
+ {8772, 0, 129, 127, 0, 19, 102},
+ {8773, 0, 129, 127, 0, 19, 102},
+ {8774, 0, 129, 127, 0, 19, 102},
+ {8775, 0, 129, 127, 0, 19, 102},
+ {8776, 0, 129, 127, 0, 19, 102},
+ {8777, 0, 129, 127, 0, 19, 102},
+ {8778, 0, 129, 127, 0, 19, 102},
+ {8779, 0, 129, 127, 0, 19, 114},
+ {8780, 0, 129, 127, 0, 19, 108},
+ {8781, 0, 129, 127, 0, 19, 114},
+ {8782, 0, 129, 127, 0, 13, 114},
+ {8783, 0, 129, 127, 0, 19, 108},
+ {8784, 0, 129, 127, 0, 13, 114},
+ {8785, 0, 129, 127, 0, 19, 108},
+ {8786, 0, 129, 127, 0, 19, 108},
+ {8787, 0, 129, 127, 0, 19, 108},
+ {8788, 0, 129, 127, 0, 19, 108},
+ {8789, 0, 129, 127, 0, 19, 108},
+ {8790, 0, 129, 127, 0, 19, 108},
+ {8791, 0, 129, 127, 0, 19, 108},
+ {8792, 0, 129, 127, 0, 19, 108},
+ {8793, 0, 129, 127, 0, 19, 108},
+ {8794, 0, 129, 127, 0, 19, 108},
+ {8795, 0, 129, 127, 0, 19, 108},
+ {8796, 0, 129, 127, 0, 19, 108},
+ {8797, 0, 129, 127, 0, 19, 108},
+ {8798, 0, 129, 127, 0, 19, 108},
+ {8799, 0, 129, 127, 0, 19, 108},
+ {8800, 0, 129, 127, 0, 19, 108},
+ {8801, 0, 129, 127, 0, 19, 108},
+ {8802, 0, 129, 127, 0, 19, 108},
+ {8803, 0, 129, 127, 0, 19, 108},
+ {8804, 0, 129, 127, 0, 19, 108},
+ {8805, 0, 129, 127, 0, 19, 108},
+ {8806, 0, 129, 127, 0, 19, 108},
+ {8807, 0, 129, 127, 0, 19, 108},
+ {8808, 0, 129, 127, 0, 19, 108},
+ {8809, 0, 129, 127, 0, 19, 108},
+ {8810, 0, 129, 127, 0, 19, 108},
+ {8811, 0, 129, 127, 0, 19, 114},
+ {8812, 0, 129, 127, 0, 19, 102},
+ {8813, 0, 129, 127, 0, 19, 114},
+ {8814, 0, 129, 127, 0, 76, 102},
+ {8815, 0, 129, 127, 0, 13, 121},
+ {8816, 0, 129, 127, 0, 19, 114},
+ {8817, 0, 129, 127, 0, 19, 127},
+ {8818, 0, 129, 127, 0, 19, 114},
+ {8819, 0, 129, 127, 0, 218, 108},
+};
+FX_LPCBYTE CPDF_CIDFont::GetCIDTransform(FX_WORD CID) const
+{
+ if (m_Charset != CIDSET_JAPAN1 || m_pFontFile != NULL) {
+ return NULL;
+ }
+ int begin = 0;
+ int end = sizeof Japan1_VertCIDs / sizeof(struct _CIDTransform) - 1;
+ while (begin <= end) {
+ int middle = (begin + end) / 2;
+ FX_WORD middlecode = Japan1_VertCIDs[middle].CID;
+ if (middlecode > CID) {
+ end = middle - 1;
+ } else if (middlecode < CID) {
+ begin = middle + 1;
+ } else {
+ return &Japan1_VertCIDs[middle].a;
+ }
+ }
+ return NULL;
+}
diff --git a/core/src/fpdfapi/fpdf_font/fpdf_font_utility.cpp b/core/src/fpdfapi/fpdf_font/fpdf_font_utility.cpp
index 7810fe80a9..b10bff7ebe 100644
--- a/core/src/fpdfapi/fpdf_font/fpdf_font_utility.cpp
+++ b/core/src/fpdfapi/fpdf_font/fpdf_font_utility.cpp
@@ -1,97 +1,97 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../../include/fpdfapi/fpdf_module.h"
-#include "../../../include/fpdfapi/fpdf_resource.h"
-#include "../../../include/fxcodec/fx_codec.h"
-#include "font_int.h"
-#ifndef _FPDFAPI_MINI_
-typedef struct {
- FXSYS_FILE* m_pFile;
- int m_nFiles;
- int m_IndexSize;
- int m_IndexOffset;
-} FXFC_PACKAGE;
-FX_LPVOID FXFC_LoadPackage(FX_LPCSTR name)
-{
- FXSYS_FILE* file = FXSYS_fopen(name, (FX_LPCSTR)"rb");
- if (file == NULL) {
- return NULL;
- }
- FX_BYTE buf[256];
- size_t read = FXSYS_fread(buf, 1, 20, file);
- if (*(FX_DWORD*)buf != 0x43465846) {
- FXSYS_fclose(file);
- return NULL;
- }
- FXFC_PACKAGE* pPackage = FX_Alloc(FXFC_PACKAGE, 1);
- pPackage->m_pFile = file;
- pPackage->m_nFiles = *(int*)(buf + 8);
- pPackage->m_IndexSize = *(int*)(buf + 12);
- pPackage->m_IndexOffset = *(int*)(buf + 16);
- return pPackage;
-}
-void FXFC_ClosePackage(FX_LPVOID p)
-{
- FXFC_PACKAGE* pPackage = (FXFC_PACKAGE*)p;
- FXSYS_fclose(pPackage->m_pFile);
- FX_Free(pPackage);
-}
-FX_BOOL FXFC_LoadFile(FX_LPVOID p, FX_LPCSTR name, FX_LPBYTE& pBuffer, FX_DWORD& size)
-{
- FXFC_PACKAGE* pPackage = (FXFC_PACKAGE*)p;
- FXSYS_fseek(pPackage->m_pFile, pPackage->m_IndexOffset, FXSYS_SEEK_SET);
- FX_BYTE buf[128];
- size_t read = 0;
- for (int i = 0; i < pPackage->m_nFiles; i ++) {
- read = FXSYS_fread(buf, pPackage->m_IndexSize, 1, pPackage->m_pFile);
- if (FXSYS_stricmp((FX_LPCSTR)buf, name) == 0) {
- FX_DWORD offset = *(FX_DWORD*)&buf[64];
- size = *(FX_DWORD*)&buf[68];
- pBuffer = FX_Alloc(FX_BYTE, size);
- FXSYS_fseek(pPackage->m_pFile, offset, FXSYS_SEEK_SET);
- read = FXSYS_fread(pBuffer, size, 1, pPackage->m_pFile);
- if (buf[72]) {
- FX_DWORD orig_size;
- FX_LPBYTE comp_buf = pBuffer;
- CPDF_ModuleMgr::Get()->GetFlateModule()->FlateOrLZWDecode(FALSE, comp_buf, size, FALSE,
- 0, 0, 0, 0, 0, pBuffer, orig_size);
- FX_Free(comp_buf);
- size = orig_size;
- }
- return TRUE;
- }
- }
- return FALSE;
-}
-FX_BOOL CPDF_FXMP::LoadFile(FX_LPVOID pPackage, FX_LPCSTR fileid)
-{
- if (m_pHeader) {
- FX_Free(m_pHeader);
- m_pHeader = NULL;
- }
- m_pTable = NULL;
- FX_DWORD size;
- if (!FXFC_LoadFile(pPackage, fileid, (FX_LPBYTE&)m_pHeader, size)) {
- return FALSE;
- }
- if (FXSYS_memcmp32(m_pHeader, "FXMP", 4)) {
- return FALSE;
- }
- m_pTable = (FX_LPBYTE)m_pHeader + m_pHeader->dwDataOffset;
- return TRUE;
-}
-FX_LPBYTE CPDF_FXMP::GetRecord(FX_DWORD index)
-{
- if (m_pTable == NULL) {
- return NULL;
- }
- if ((int)index < (int)m_pHeader->dwStartIndex || index > m_pHeader->dwEndIndex) {
- return NULL;
- }
- return m_pTable + (index - m_pHeader->dwStartIndex) * m_pHeader->dwRecordSize;
-}
-#endif
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fpdfapi/fpdf_module.h"
+#include "../../../include/fpdfapi/fpdf_resource.h"
+#include "../../../include/fxcodec/fx_codec.h"
+#include "font_int.h"
+#ifndef _FPDFAPI_MINI_
+typedef struct {
+ FXSYS_FILE* m_pFile;
+ int m_nFiles;
+ int m_IndexSize;
+ int m_IndexOffset;
+} FXFC_PACKAGE;
+FX_LPVOID FXFC_LoadPackage(FX_LPCSTR name)
+{
+ FXSYS_FILE* file = FXSYS_fopen(name, (FX_LPCSTR)"rb");
+ if (file == NULL) {
+ return NULL;
+ }
+ FX_BYTE buf[256];
+ size_t read = FXSYS_fread(buf, 1, 20, file);
+ if (*(FX_DWORD*)buf != 0x43465846) {
+ FXSYS_fclose(file);
+ return NULL;
+ }
+ FXFC_PACKAGE* pPackage = FX_Alloc(FXFC_PACKAGE, 1);
+ pPackage->m_pFile = file;
+ pPackage->m_nFiles = *(int*)(buf + 8);
+ pPackage->m_IndexSize = *(int*)(buf + 12);
+ pPackage->m_IndexOffset = *(int*)(buf + 16);
+ return pPackage;
+}
+void FXFC_ClosePackage(FX_LPVOID p)
+{
+ FXFC_PACKAGE* pPackage = (FXFC_PACKAGE*)p;
+ FXSYS_fclose(pPackage->m_pFile);
+ FX_Free(pPackage);
+}
+FX_BOOL FXFC_LoadFile(FX_LPVOID p, FX_LPCSTR name, FX_LPBYTE& pBuffer, FX_DWORD& size)
+{
+ FXFC_PACKAGE* pPackage = (FXFC_PACKAGE*)p;
+ FXSYS_fseek(pPackage->m_pFile, pPackage->m_IndexOffset, FXSYS_SEEK_SET);
+ FX_BYTE buf[128];
+ size_t read = 0;
+ for (int i = 0; i < pPackage->m_nFiles; i ++) {
+ read = FXSYS_fread(buf, pPackage->m_IndexSize, 1, pPackage->m_pFile);
+ if (FXSYS_stricmp((FX_LPCSTR)buf, name) == 0) {
+ FX_DWORD offset = *(FX_DWORD*)&buf[64];
+ size = *(FX_DWORD*)&buf[68];
+ pBuffer = FX_Alloc(FX_BYTE, size);
+ FXSYS_fseek(pPackage->m_pFile, offset, FXSYS_SEEK_SET);
+ read = FXSYS_fread(pBuffer, size, 1, pPackage->m_pFile);
+ if (buf[72]) {
+ FX_DWORD orig_size;
+ FX_LPBYTE comp_buf = pBuffer;
+ CPDF_ModuleMgr::Get()->GetFlateModule()->FlateOrLZWDecode(FALSE, comp_buf, size, FALSE,
+ 0, 0, 0, 0, 0, pBuffer, orig_size);
+ FX_Free(comp_buf);
+ size = orig_size;
+ }
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+FX_BOOL CPDF_FXMP::LoadFile(FX_LPVOID pPackage, FX_LPCSTR fileid)
+{
+ if (m_pHeader) {
+ FX_Free(m_pHeader);
+ m_pHeader = NULL;
+ }
+ m_pTable = NULL;
+ FX_DWORD size;
+ if (!FXFC_LoadFile(pPackage, fileid, (FX_LPBYTE&)m_pHeader, size)) {
+ return FALSE;
+ }
+ if (FXSYS_memcmp32(m_pHeader, "FXMP", 4)) {
+ return FALSE;
+ }
+ m_pTable = (FX_LPBYTE)m_pHeader + m_pHeader->dwDataOffset;
+ return TRUE;
+}
+FX_LPBYTE CPDF_FXMP::GetRecord(FX_DWORD index)
+{
+ if (m_pTable == NULL) {
+ return NULL;
+ }
+ if ((int)index < (int)m_pHeader->dwStartIndex || index > m_pHeader->dwEndIndex) {
+ return NULL;
+ }
+ return m_pTable + (index - m_pHeader->dwStartIndex) * m_pHeader->dwRecordSize;
+}
+#endif
diff --git a/core/src/fpdfapi/fpdf_font/ttgsubtable.cpp b/core/src/fpdfapi/fpdf_font/ttgsubtable.cpp
index b7a7864c2d..42f77de57b 100644
--- a/core/src/fpdfapi/fpdf_font/ttgsubtable.cpp
+++ b/core/src/fpdfapi/fpdf_font/ttgsubtable.cpp
@@ -1,452 +1,452 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../../include/fxge/fx_ge.h"
-#include "../../../include/fxge/fx_freetype.h"
-#include "ttgsubtable.h"
-CFX_GlyphMap::CFX_GlyphMap()
-{
-}
-CFX_GlyphMap::~CFX_GlyphMap()
-{
-}
-extern "C" {
- static int _CompareInt(const void* p1, const void* p2)
- {
- return (*(FX_DWORD*)p1) - (*(FX_DWORD*)p2);
- }
-};
-struct _IntPair {
- FX_INT32 key;
- FX_INT32 value;
-};
-void CFX_GlyphMap::SetAt(int key, int value)
-{
- FX_DWORD count = m_Buffer.GetSize() / sizeof(_IntPair);
- _IntPair* buf = (_IntPair*)m_Buffer.GetBuffer();
- _IntPair pair = {key, value};
- if (count == 0 || key > buf[count - 1].key) {
- m_Buffer.AppendBlock(&pair, sizeof(_IntPair));
- return;
- }
- int low = 0, high = count - 1;
- while (low <= high) {
- int mid = (low + high) / 2;
- if (buf[mid].key < key) {
- low = mid + 1;
- } else if (buf[mid].key > key) {
- high = mid - 1;
- } else {
- buf[mid].value = value;
- return;
- }
- }
- m_Buffer.InsertBlock(low * sizeof(_IntPair), &pair, sizeof(_IntPair));
-}
-FX_BOOL CFX_GlyphMap::Lookup(int key, int &value)
-{
- FX_LPVOID pResult = FXSYS_bsearch(&key, m_Buffer.GetBuffer(), m_Buffer.GetSize() / sizeof(_IntPair),
- sizeof(_IntPair), _CompareInt);
- if (pResult == NULL) {
- return FALSE;
- }
- value = ((FX_DWORD*)pResult)[1];
- return TRUE;
-}
-bool CFX_CTTGSUBTable::LoadGSUBTable(FT_Bytes gsub)
-{
- header.Version = gsub[0] << 24 | gsub[1] << 16 | gsub[2] << 8 | gsub[3];
- if(header.Version != 0x00010000) {
- return false;
- }
- header.ScriptList = gsub[4] << 8 | gsub[5];
- header.FeatureList = gsub[6] << 8 | gsub[7];
- header.LookupList = gsub[8] << 8 | gsub[9];
- return Parse(
- &gsub[header.ScriptList],
- &gsub[header.FeatureList],
- &gsub[header.LookupList]);
-}
-bool CFX_CTTGSUBTable::GetVerticalGlyph(TT_uint32_t glyphnum, TT_uint32_t *vglyphnum)
-{
- TT_uint32_t tag[] = {
- (TT_uint8_t)'v' << 24 |
- (TT_uint8_t)'r' << 16 |
- (TT_uint8_t)'t' << 8 |
- (TT_uint8_t)'2',
- (TT_uint8_t)'v' << 24 |
- (TT_uint8_t)'e' << 16 |
- (TT_uint8_t)'r' << 8 |
- (TT_uint8_t)'t',
- };
- if (!m_bFeautureMapLoad) {
- for (int i = 0; i < ScriptList.ScriptCount; i++) {
- for (int j = 0; j < (ScriptList.ScriptRecord + i)->Script.LangSysCount; ++j) {
- for (int k = 0; k < ((ScriptList.ScriptRecord + i)->Script.LangSysRecord + j)->LangSys.FeatureCount; ++k) {
- FX_DWORD index = *(((ScriptList.ScriptRecord + i)->Script.LangSysRecord + j)->LangSys.FeatureIndex + k);
- if (FeatureList.FeatureRecord[index].FeatureTag == tag[0] || FeatureList.FeatureRecord[index].FeatureTag == tag[1]) {
- FX_DWORD value;
- if (!m_featureMap.Lookup(index, value)) {
- m_featureMap.SetAt(index, index);
- }
- }
- }
- }
- }
- if (!m_featureMap.GetStartPosition()) {
- for (int i = 0; i < FeatureList.FeatureCount; i ++) {
- if (FeatureList.FeatureRecord[i].FeatureTag == tag[0] || FeatureList.FeatureRecord[i].FeatureTag == tag[1]) {
- FX_DWORD value;
- if (!m_featureMap.Lookup(i, value)) {
- m_featureMap.SetAt(i, i);
- }
- }
- }
- }
- m_bFeautureMapLoad = TRUE;
- }
- FX_POSITION pos = m_featureMap.GetStartPosition();
- while (pos) {
- FX_DWORD index, value;
- m_featureMap.GetNextAssoc(pos, index, value);
- if(GetVerticalGlyphSub(glyphnum, vglyphnum, &FeatureList.FeatureRecord[value].Feature)) {
- return true;
- }
- }
- return false;
-}
-bool CFX_CTTGSUBTable::GetVerticalGlyphSub(
- TT_uint32_t glyphnum,
- TT_uint32_t *vglyphnum,
- struct TFeature *Feature)
-{
- for(int i = 0; i < Feature->LookupCount; i++) {
- int index = Feature->LookupListIndex[i];
- if(index < 0 || LookupList.LookupCount < index) {
- continue;
- }
- if(LookupList.Lookup[index].LookupType == 1) {
- if(GetVerticalGlyphSub2(
- glyphnum,
- vglyphnum,
- &LookupList.Lookup[index])) {
- return true;
- }
- }
- }
- return false;
-}
-bool CFX_CTTGSUBTable::GetVerticalGlyphSub2(
- TT_uint32_t glyphnum,
- TT_uint32_t *vglyphnum,
- struct TLookup *Lookup)
-{
- for(int i = 0; i < Lookup->SubTableCount; i++) {
- switch(Lookup->SubTable[i]->SubstFormat) {
- case 1: {
- TSingleSubstFormat1 *tbl1 = (TSingleSubstFormat1*)Lookup->SubTable[i];
- if(GetCoverageIndex(tbl1->Coverage, glyphnum) >= 0) {
- *vglyphnum = glyphnum + tbl1->DeltaGlyphID;
- return true;
- }
- break;
- }
- case 2: {
- TSingleSubstFormat2 *tbl2 = (TSingleSubstFormat2*)Lookup->SubTable[i];
- int index = -1;
- index = GetCoverageIndex(tbl2->Coverage, glyphnum);
- if(0 <= index && index < tbl2->GlyphCount) {
- *vglyphnum = tbl2->Substitute[index];
- return true;
- }
- break;
- }
- }
- }
- return false;
-}
-int CFX_CTTGSUBTable::GetCoverageIndex(struct TCoverageFormatBase *Coverage, TT_uint32_t g)
-{
- int i = 0;
- if(Coverage == NULL) {
- return -1;
- }
- switch(Coverage->CoverageFormat) {
- case 1: {
- TCoverageFormat1 *c1 = (TCoverageFormat1*)Coverage;
- for(i = 0; i < c1->GlyphCount; i++) {
- if((TT_uint32_t)c1->GlyphArray[i] == g) {
- return i;
- }
- }
- return -1;
- }
- case 2: {
- TCoverageFormat2 *c2 = (TCoverageFormat2*)Coverage;
- for(i = 0; i < c2->RangeCount; i++) {
- TT_uint32_t s = c2->RangeRecord[i].Start;
- TT_uint32_t e = c2->RangeRecord[i].End;
- TT_uint32_t si = c2->RangeRecord[i].StartCoverageIndex;
- if (s <= g && g <= e) {
- return si + g - s;
- }
- }
- return -1;
- }
- }
- return -1;
-}
-bool CFX_CTTGSUBTable::Parse(
- FT_Bytes scriptlist,
- FT_Bytes featurelist,
- FT_Bytes lookuplist)
-{
- ParseScriptList(scriptlist, &ScriptList);
- ParseFeatureList(featurelist, &FeatureList);
- ParseLookupList(lookuplist, &LookupList);
- return true;
-}
-void CFX_CTTGSUBTable::ParseScriptList(FT_Bytes raw, struct TScriptList *rec)
-{
- int i;
- FT_Bytes sp = raw;
- rec->ScriptCount = GetUInt16(sp);
- if(rec->ScriptCount <= 0) {
- return;
- }
- rec->ScriptRecord = new struct TScriptRecord[rec->ScriptCount];
- for(i = 0; i < rec->ScriptCount; i++) {
- rec->ScriptRecord[i].ScriptTag = GetUInt32(sp);
- TT_uint16_t offset = GetUInt16(sp);
- ParseScript(
- &raw[offset],
- &rec->ScriptRecord[i].Script);
- }
-}
-void CFX_CTTGSUBTable::ParseScript(FT_Bytes raw, struct TScript *rec)
-{
- int i;
- FT_Bytes sp = raw;
- rec->DefaultLangSys = GetUInt16(sp);
- rec->LangSysCount = GetUInt16(sp);
- if(rec->LangSysCount <= 0) {
- return;
- }
- rec->LangSysRecord = new struct TLangSysRecord[rec->LangSysCount];
- for(i = 0; i < rec->LangSysCount; i++) {
- rec->LangSysRecord[i].LangSysTag = GetUInt32(sp);
- TT_uint16_t offset = GetUInt16(sp);
- ParseLangSys(
- &raw[offset],
- &rec->LangSysRecord[i].LangSys);
- }
-}
-void CFX_CTTGSUBTable::ParseLangSys(FT_Bytes raw, struct TLangSys *rec)
-{
- FT_Bytes sp = raw;
- rec->LookupOrder = GetUInt16(sp);
- rec->ReqFeatureIndex = GetUInt16(sp);
- rec->FeatureCount = GetUInt16(sp);
- if(rec->FeatureCount <= 0) {
- return;
- }
- rec->FeatureIndex = new TT_uint16_t[rec->FeatureCount];
- FXSYS_memset32(rec->FeatureIndex, 0, sizeof(TT_uint16_t) * rec->FeatureCount);
- for (int i = 0; i < rec->FeatureCount; ++i) {
- rec->FeatureIndex[i] = GetUInt16(sp);
- }
-}
-void CFX_CTTGSUBTable::ParseFeatureList(FT_Bytes raw, TFeatureList *rec)
-{
- int i;
- FT_Bytes sp = raw;
- rec->FeatureCount = GetUInt16(sp);
- if(rec->FeatureCount <= 0) {
- return;
- }
- rec->FeatureRecord = new struct TFeatureRecord[rec->FeatureCount];
- for(i = 0; i < rec->FeatureCount; i++) {
- rec->FeatureRecord[i].FeatureTag = GetUInt32(sp);
- TT_uint16_t offset = GetUInt16(sp);
- ParseFeature(
- &raw[offset],
- &rec->FeatureRecord[i].Feature);
- }
-}
-void CFX_CTTGSUBTable::ParseFeature(FT_Bytes raw, TFeature *rec)
-{
- int i;
- FT_Bytes sp = raw;
- rec->FeatureParams = GetUInt16(sp);
- rec->LookupCount = GetUInt16(sp);
- if(rec->LookupCount <= 0) {
- return;
- }
- rec->LookupListIndex = new TT_uint16_t[rec->LookupCount];
- for(i = 0; i < rec->LookupCount; i++) {
- rec->LookupListIndex[i] = GetUInt16(sp);
- }
-}
-void CFX_CTTGSUBTable::ParseLookupList(FT_Bytes raw, TLookupList *rec)
-{
- int i;
- FT_Bytes sp = raw;
- rec->LookupCount = GetUInt16(sp);
- if(rec->LookupCount <= 0) {
- return;
- }
- rec->Lookup = new struct TLookup[rec->LookupCount];
- for(i = 0; i < rec->LookupCount; i++) {
- TT_uint16_t offset = GetUInt16(sp);
- ParseLookup(
- &raw[offset],
- &rec->Lookup[i]);
- }
-}
-void CFX_CTTGSUBTable::ParseLookup(FT_Bytes raw, TLookup *rec)
-{
- int i;
- FT_Bytes sp = raw;
- rec->LookupType = GetUInt16(sp);
- rec->LookupFlag = GetUInt16(sp);
- rec->SubTableCount = GetUInt16(sp);
- if(rec->SubTableCount <= 0) {
- return;
- }
- rec->SubTable = new struct TSubTableBase*[rec->SubTableCount];
- for(i = 0; i < rec->SubTableCount; i++) {
- rec->SubTable[i] = NULL;
- }
- if(rec->LookupType != 1) {
- return;
- }
- for(i = 0; i < rec->SubTableCount; i++) {
- TT_uint16_t offset = GetUInt16(sp);
- ParseSingleSubst(
- &raw[offset],
- &rec->SubTable[i]);
- }
-}
-void CFX_CTTGSUBTable::ParseCoverage(FT_Bytes raw, TCoverageFormatBase **rec)
-{
- FT_Bytes sp = raw;
- TT_uint16_t Format = GetUInt16(sp);
- switch(Format) {
- case 1:
- *rec = new TCoverageFormat1();
- ParseCoverageFormat1(raw, (TCoverageFormat1*)*rec);
- break;
- case 2:
- *rec = new TCoverageFormat2();
- ParseCoverageFormat2(raw, (TCoverageFormat2*)*rec);
- break;
- }
-}
-void CFX_CTTGSUBTable::ParseCoverageFormat1(FT_Bytes raw, TCoverageFormat1 *rec)
-{
- int i;
- FT_Bytes sp = raw;
- GetUInt16(sp);
- rec->GlyphCount = GetUInt16(sp);
- if(rec->GlyphCount <= 0) {
- return;
- }
- rec->GlyphArray = new TT_uint16_t[rec->GlyphCount];
- for(i = 0; i < rec->GlyphCount; i++) {
- rec->GlyphArray[i] = GetUInt16(sp);
- }
-}
-void CFX_CTTGSUBTable::ParseCoverageFormat2(FT_Bytes raw, TCoverageFormat2 *rec)
-{
- int i;
- FT_Bytes sp = raw;
- GetUInt16(sp);
- rec->RangeCount = GetUInt16(sp);
- if(rec->RangeCount <= 0) {
- return;
- }
- rec->RangeRecord = new TRangeRecord[rec->RangeCount];
- for(i = 0; i < rec->RangeCount; i++) {
- rec->RangeRecord[i].Start = GetUInt16(sp);
- rec->RangeRecord[i].End = GetUInt16(sp);
- rec->RangeRecord[i].StartCoverageIndex = GetUInt16(sp);
- }
-}
-void CFX_CTTGSUBTable::ParseSingleSubst(FT_Bytes raw, TSubTableBase **rec)
-{
- FT_Bytes sp = raw;
- TT_uint16_t Format = GetUInt16(sp);
- switch(Format) {
- case 1:
- *rec = new TSingleSubstFormat1();
- ParseSingleSubstFormat1(raw, (TSingleSubstFormat1*)*rec);
- break;
- case 2:
- *rec = new TSingleSubstFormat2();
- ParseSingleSubstFormat2(raw, (TSingleSubstFormat2*)*rec);
- break;
- }
-}
-void CFX_CTTGSUBTable::ParseSingleSubstFormat1(FT_Bytes raw, TSingleSubstFormat1 *rec)
-{
- FT_Bytes sp = raw;
- GetUInt16(sp);
- TT_uint16_t offset = GetUInt16(sp);
- ParseCoverage(
- &raw[offset],
- &rec->Coverage);
- rec->DeltaGlyphID = GetInt16(sp);
-}
-void CFX_CTTGSUBTable::ParseSingleSubstFormat2(FT_Bytes raw, TSingleSubstFormat2 *rec)
-{
- int i;
- FT_Bytes sp = raw;
- GetUInt16(sp);
- TT_uint16_t offset = GetUInt16(sp);
- ParseCoverage(
- &raw[offset],
- &rec->Coverage);
- rec->GlyphCount = GetUInt16(sp);
- if(rec->GlyphCount <= 0) {
- return;
- }
- rec->Substitute = new TT_uint16_t[rec->GlyphCount];
- for(i = 0; i < rec->GlyphCount; i++) {
- rec->Substitute[i] = GetUInt16(sp);
- }
-}
-FX_BOOL CFX_GSUBTable::GetVerticalGlyph(FX_DWORD glyphnum, FX_DWORD* vglyphnum)
-{
- return m_GsubImp.GetVerticalGlyph(glyphnum, vglyphnum);
-}
-IFX_GSUBTable* FXGE_CreateGSUBTable(CFX_Font* pFont)
-{
- if (!pFont) {
- return NULL;
- }
- if (NULL == pFont->m_pGsubData) {
- unsigned long length = 0;
- int error = FXFT_Load_Sfnt_Table(pFont->m_Face, FT_MAKE_TAG('G', 'S', 'U', 'B'), 0, NULL, &length);
- if (!error) {
- pFont->m_pGsubData = (unsigned char*)FX_Alloc(FX_BYTE, length);
- }
- if (!pFont->m_pGsubData) {
- return NULL;
- }
- }
- int error = FXFT_Load_Sfnt_Table(pFont->m_Face, FT_MAKE_TAG('G', 'S', 'U', 'B'), 0, pFont->m_pGsubData, NULL);
- if (!error && pFont->m_pGsubData) {
- CFX_GSUBTable* pGsubTable = FX_NEW CFX_GSUBTable;
- if (!pGsubTable) {
- return NULL;
- }
- if (pGsubTable->m_GsubImp.LoadGSUBTable((FT_Bytes)pFont->m_pGsubData)) {
- return pGsubTable;
- }
- delete pGsubTable;
- }
- return NULL;
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxge/fx_ge.h"
+#include "../../../include/fxge/fx_freetype.h"
+#include "ttgsubtable.h"
+CFX_GlyphMap::CFX_GlyphMap()
+{
+}
+CFX_GlyphMap::~CFX_GlyphMap()
+{
+}
+extern "C" {
+ static int _CompareInt(const void* p1, const void* p2)
+ {
+ return (*(FX_DWORD*)p1) - (*(FX_DWORD*)p2);
+ }
+};
+struct _IntPair {
+ FX_INT32 key;
+ FX_INT32 value;
+};
+void CFX_GlyphMap::SetAt(int key, int value)
+{
+ FX_DWORD count = m_Buffer.GetSize() / sizeof(_IntPair);
+ _IntPair* buf = (_IntPair*)m_Buffer.GetBuffer();
+ _IntPair pair = {key, value};
+ if (count == 0 || key > buf[count - 1].key) {
+ m_Buffer.AppendBlock(&pair, sizeof(_IntPair));
+ return;
+ }
+ int low = 0, high = count - 1;
+ while (low <= high) {
+ int mid = (low + high) / 2;
+ if (buf[mid].key < key) {
+ low = mid + 1;
+ } else if (buf[mid].key > key) {
+ high = mid - 1;
+ } else {
+ buf[mid].value = value;
+ return;
+ }
+ }
+ m_Buffer.InsertBlock(low * sizeof(_IntPair), &pair, sizeof(_IntPair));
+}
+FX_BOOL CFX_GlyphMap::Lookup(int key, int &value)
+{
+ FX_LPVOID pResult = FXSYS_bsearch(&key, m_Buffer.GetBuffer(), m_Buffer.GetSize() / sizeof(_IntPair),
+ sizeof(_IntPair), _CompareInt);
+ if (pResult == NULL) {
+ return FALSE;
+ }
+ value = ((FX_DWORD*)pResult)[1];
+ return TRUE;
+}
+bool CFX_CTTGSUBTable::LoadGSUBTable(FT_Bytes gsub)
+{
+ header.Version = gsub[0] << 24 | gsub[1] << 16 | gsub[2] << 8 | gsub[3];
+ if(header.Version != 0x00010000) {
+ return false;
+ }
+ header.ScriptList = gsub[4] << 8 | gsub[5];
+ header.FeatureList = gsub[6] << 8 | gsub[7];
+ header.LookupList = gsub[8] << 8 | gsub[9];
+ return Parse(
+ &gsub[header.ScriptList],
+ &gsub[header.FeatureList],
+ &gsub[header.LookupList]);
+}
+bool CFX_CTTGSUBTable::GetVerticalGlyph(TT_uint32_t glyphnum, TT_uint32_t *vglyphnum)
+{
+ TT_uint32_t tag[] = {
+ (TT_uint8_t)'v' << 24 |
+ (TT_uint8_t)'r' << 16 |
+ (TT_uint8_t)'t' << 8 |
+ (TT_uint8_t)'2',
+ (TT_uint8_t)'v' << 24 |
+ (TT_uint8_t)'e' << 16 |
+ (TT_uint8_t)'r' << 8 |
+ (TT_uint8_t)'t',
+ };
+ if (!m_bFeautureMapLoad) {
+ for (int i = 0; i < ScriptList.ScriptCount; i++) {
+ for (int j = 0; j < (ScriptList.ScriptRecord + i)->Script.LangSysCount; ++j) {
+ for (int k = 0; k < ((ScriptList.ScriptRecord + i)->Script.LangSysRecord + j)->LangSys.FeatureCount; ++k) {
+ FX_DWORD index = *(((ScriptList.ScriptRecord + i)->Script.LangSysRecord + j)->LangSys.FeatureIndex + k);
+ if (FeatureList.FeatureRecord[index].FeatureTag == tag[0] || FeatureList.FeatureRecord[index].FeatureTag == tag[1]) {
+ FX_DWORD value;
+ if (!m_featureMap.Lookup(index, value)) {
+ m_featureMap.SetAt(index, index);
+ }
+ }
+ }
+ }
+ }
+ if (!m_featureMap.GetStartPosition()) {
+ for (int i = 0; i < FeatureList.FeatureCount; i ++) {
+ if (FeatureList.FeatureRecord[i].FeatureTag == tag[0] || FeatureList.FeatureRecord[i].FeatureTag == tag[1]) {
+ FX_DWORD value;
+ if (!m_featureMap.Lookup(i, value)) {
+ m_featureMap.SetAt(i, i);
+ }
+ }
+ }
+ }
+ m_bFeautureMapLoad = TRUE;
+ }
+ FX_POSITION pos = m_featureMap.GetStartPosition();
+ while (pos) {
+ FX_DWORD index, value;
+ m_featureMap.GetNextAssoc(pos, index, value);
+ if(GetVerticalGlyphSub(glyphnum, vglyphnum, &FeatureList.FeatureRecord[value].Feature)) {
+ return true;
+ }
+ }
+ return false;
+}
+bool CFX_CTTGSUBTable::GetVerticalGlyphSub(
+ TT_uint32_t glyphnum,
+ TT_uint32_t *vglyphnum,
+ struct TFeature *Feature)
+{
+ for(int i = 0; i < Feature->LookupCount; i++) {
+ int index = Feature->LookupListIndex[i];
+ if(index < 0 || LookupList.LookupCount < index) {
+ continue;
+ }
+ if(LookupList.Lookup[index].LookupType == 1) {
+ if(GetVerticalGlyphSub2(
+ glyphnum,
+ vglyphnum,
+ &LookupList.Lookup[index])) {
+ return true;
+ }
+ }
+ }
+ return false;
+}
+bool CFX_CTTGSUBTable::GetVerticalGlyphSub2(
+ TT_uint32_t glyphnum,
+ TT_uint32_t *vglyphnum,
+ struct TLookup *Lookup)
+{
+ for(int i = 0; i < Lookup->SubTableCount; i++) {
+ switch(Lookup->SubTable[i]->SubstFormat) {
+ case 1: {
+ TSingleSubstFormat1 *tbl1 = (TSingleSubstFormat1*)Lookup->SubTable[i];
+ if(GetCoverageIndex(tbl1->Coverage, glyphnum) >= 0) {
+ *vglyphnum = glyphnum + tbl1->DeltaGlyphID;
+ return true;
+ }
+ break;
+ }
+ case 2: {
+ TSingleSubstFormat2 *tbl2 = (TSingleSubstFormat2*)Lookup->SubTable[i];
+ int index = -1;
+ index = GetCoverageIndex(tbl2->Coverage, glyphnum);
+ if(0 <= index && index < tbl2->GlyphCount) {
+ *vglyphnum = tbl2->Substitute[index];
+ return true;
+ }
+ break;
+ }
+ }
+ }
+ return false;
+}
+int CFX_CTTGSUBTable::GetCoverageIndex(struct TCoverageFormatBase *Coverage, TT_uint32_t g)
+{
+ int i = 0;
+ if(Coverage == NULL) {
+ return -1;
+ }
+ switch(Coverage->CoverageFormat) {
+ case 1: {
+ TCoverageFormat1 *c1 = (TCoverageFormat1*)Coverage;
+ for(i = 0; i < c1->GlyphCount; i++) {
+ if((TT_uint32_t)c1->GlyphArray[i] == g) {
+ return i;
+ }
+ }
+ return -1;
+ }
+ case 2: {
+ TCoverageFormat2 *c2 = (TCoverageFormat2*)Coverage;
+ for(i = 0; i < c2->RangeCount; i++) {
+ TT_uint32_t s = c2->RangeRecord[i].Start;
+ TT_uint32_t e = c2->RangeRecord[i].End;
+ TT_uint32_t si = c2->RangeRecord[i].StartCoverageIndex;
+ if (s <= g && g <= e) {
+ return si + g - s;
+ }
+ }
+ return -1;
+ }
+ }
+ return -1;
+}
+bool CFX_CTTGSUBTable::Parse(
+ FT_Bytes scriptlist,
+ FT_Bytes featurelist,
+ FT_Bytes lookuplist)
+{
+ ParseScriptList(scriptlist, &ScriptList);
+ ParseFeatureList(featurelist, &FeatureList);
+ ParseLookupList(lookuplist, &LookupList);
+ return true;
+}
+void CFX_CTTGSUBTable::ParseScriptList(FT_Bytes raw, struct TScriptList *rec)
+{
+ int i;
+ FT_Bytes sp = raw;
+ rec->ScriptCount = GetUInt16(sp);
+ if(rec->ScriptCount <= 0) {
+ return;
+ }
+ rec->ScriptRecord = new struct TScriptRecord[rec->ScriptCount];
+ for(i = 0; i < rec->ScriptCount; i++) {
+ rec->ScriptRecord[i].ScriptTag = GetUInt32(sp);
+ TT_uint16_t offset = GetUInt16(sp);
+ ParseScript(
+ &raw[offset],
+ &rec->ScriptRecord[i].Script);
+ }
+}
+void CFX_CTTGSUBTable::ParseScript(FT_Bytes raw, struct TScript *rec)
+{
+ int i;
+ FT_Bytes sp = raw;
+ rec->DefaultLangSys = GetUInt16(sp);
+ rec->LangSysCount = GetUInt16(sp);
+ if(rec->LangSysCount <= 0) {
+ return;
+ }
+ rec->LangSysRecord = new struct TLangSysRecord[rec->LangSysCount];
+ for(i = 0; i < rec->LangSysCount; i++) {
+ rec->LangSysRecord[i].LangSysTag = GetUInt32(sp);
+ TT_uint16_t offset = GetUInt16(sp);
+ ParseLangSys(
+ &raw[offset],
+ &rec->LangSysRecord[i].LangSys);
+ }
+}
+void CFX_CTTGSUBTable::ParseLangSys(FT_Bytes raw, struct TLangSys *rec)
+{
+ FT_Bytes sp = raw;
+ rec->LookupOrder = GetUInt16(sp);
+ rec->ReqFeatureIndex = GetUInt16(sp);
+ rec->FeatureCount = GetUInt16(sp);
+ if(rec->FeatureCount <= 0) {
+ return;
+ }
+ rec->FeatureIndex = new TT_uint16_t[rec->FeatureCount];
+ FXSYS_memset32(rec->FeatureIndex, 0, sizeof(TT_uint16_t) * rec->FeatureCount);
+ for (int i = 0; i < rec->FeatureCount; ++i) {
+ rec->FeatureIndex[i] = GetUInt16(sp);
+ }
+}
+void CFX_CTTGSUBTable::ParseFeatureList(FT_Bytes raw, TFeatureList *rec)
+{
+ int i;
+ FT_Bytes sp = raw;
+ rec->FeatureCount = GetUInt16(sp);
+ if(rec->FeatureCount <= 0) {
+ return;
+ }
+ rec->FeatureRecord = new struct TFeatureRecord[rec->FeatureCount];
+ for(i = 0; i < rec->FeatureCount; i++) {
+ rec->FeatureRecord[i].FeatureTag = GetUInt32(sp);
+ TT_uint16_t offset = GetUInt16(sp);
+ ParseFeature(
+ &raw[offset],
+ &rec->FeatureRecord[i].Feature);
+ }
+}
+void CFX_CTTGSUBTable::ParseFeature(FT_Bytes raw, TFeature *rec)
+{
+ int i;
+ FT_Bytes sp = raw;
+ rec->FeatureParams = GetUInt16(sp);
+ rec->LookupCount = GetUInt16(sp);
+ if(rec->LookupCount <= 0) {
+ return;
+ }
+ rec->LookupListIndex = new TT_uint16_t[rec->LookupCount];
+ for(i = 0; i < rec->LookupCount; i++) {
+ rec->LookupListIndex[i] = GetUInt16(sp);
+ }
+}
+void CFX_CTTGSUBTable::ParseLookupList(FT_Bytes raw, TLookupList *rec)
+{
+ int i;
+ FT_Bytes sp = raw;
+ rec->LookupCount = GetUInt16(sp);
+ if(rec->LookupCount <= 0) {
+ return;
+ }
+ rec->Lookup = new struct TLookup[rec->LookupCount];
+ for(i = 0; i < rec->LookupCount; i++) {
+ TT_uint16_t offset = GetUInt16(sp);
+ ParseLookup(
+ &raw[offset],
+ &rec->Lookup[i]);
+ }
+}
+void CFX_CTTGSUBTable::ParseLookup(FT_Bytes raw, TLookup *rec)
+{
+ int i;
+ FT_Bytes sp = raw;
+ rec->LookupType = GetUInt16(sp);
+ rec->LookupFlag = GetUInt16(sp);
+ rec->SubTableCount = GetUInt16(sp);
+ if(rec->SubTableCount <= 0) {
+ return;
+ }
+ rec->SubTable = new struct TSubTableBase*[rec->SubTableCount];
+ for(i = 0; i < rec->SubTableCount; i++) {
+ rec->SubTable[i] = NULL;
+ }
+ if(rec->LookupType != 1) {
+ return;
+ }
+ for(i = 0; i < rec->SubTableCount; i++) {
+ TT_uint16_t offset = GetUInt16(sp);
+ ParseSingleSubst(
+ &raw[offset],
+ &rec->SubTable[i]);
+ }
+}
+void CFX_CTTGSUBTable::ParseCoverage(FT_Bytes raw, TCoverageFormatBase **rec)
+{
+ FT_Bytes sp = raw;
+ TT_uint16_t Format = GetUInt16(sp);
+ switch(Format) {
+ case 1:
+ *rec = new TCoverageFormat1();
+ ParseCoverageFormat1(raw, (TCoverageFormat1*)*rec);
+ break;
+ case 2:
+ *rec = new TCoverageFormat2();
+ ParseCoverageFormat2(raw, (TCoverageFormat2*)*rec);
+ break;
+ }
+}
+void CFX_CTTGSUBTable::ParseCoverageFormat1(FT_Bytes raw, TCoverageFormat1 *rec)
+{
+ int i;
+ FT_Bytes sp = raw;
+ GetUInt16(sp);
+ rec->GlyphCount = GetUInt16(sp);
+ if(rec->GlyphCount <= 0) {
+ return;
+ }
+ rec->GlyphArray = new TT_uint16_t[rec->GlyphCount];
+ for(i = 0; i < rec->GlyphCount; i++) {
+ rec->GlyphArray[i] = GetUInt16(sp);
+ }
+}
+void CFX_CTTGSUBTable::ParseCoverageFormat2(FT_Bytes raw, TCoverageFormat2 *rec)
+{
+ int i;
+ FT_Bytes sp = raw;
+ GetUInt16(sp);
+ rec->RangeCount = GetUInt16(sp);
+ if(rec->RangeCount <= 0) {
+ return;
+ }
+ rec->RangeRecord = new TRangeRecord[rec->RangeCount];
+ for(i = 0; i < rec->RangeCount; i++) {
+ rec->RangeRecord[i].Start = GetUInt16(sp);
+ rec->RangeRecord[i].End = GetUInt16(sp);
+ rec->RangeRecord[i].StartCoverageIndex = GetUInt16(sp);
+ }
+}
+void CFX_CTTGSUBTable::ParseSingleSubst(FT_Bytes raw, TSubTableBase **rec)
+{
+ FT_Bytes sp = raw;
+ TT_uint16_t Format = GetUInt16(sp);
+ switch(Format) {
+ case 1:
+ *rec = new TSingleSubstFormat1();
+ ParseSingleSubstFormat1(raw, (TSingleSubstFormat1*)*rec);
+ break;
+ case 2:
+ *rec = new TSingleSubstFormat2();
+ ParseSingleSubstFormat2(raw, (TSingleSubstFormat2*)*rec);
+ break;
+ }
+}
+void CFX_CTTGSUBTable::ParseSingleSubstFormat1(FT_Bytes raw, TSingleSubstFormat1 *rec)
+{
+ FT_Bytes sp = raw;
+ GetUInt16(sp);
+ TT_uint16_t offset = GetUInt16(sp);
+ ParseCoverage(
+ &raw[offset],
+ &rec->Coverage);
+ rec->DeltaGlyphID = GetInt16(sp);
+}
+void CFX_CTTGSUBTable::ParseSingleSubstFormat2(FT_Bytes raw, TSingleSubstFormat2 *rec)
+{
+ int i;
+ FT_Bytes sp = raw;
+ GetUInt16(sp);
+ TT_uint16_t offset = GetUInt16(sp);
+ ParseCoverage(
+ &raw[offset],
+ &rec->Coverage);
+ rec->GlyphCount = GetUInt16(sp);
+ if(rec->GlyphCount <= 0) {
+ return;
+ }
+ rec->Substitute = new TT_uint16_t[rec->GlyphCount];
+ for(i = 0; i < rec->GlyphCount; i++) {
+ rec->Substitute[i] = GetUInt16(sp);
+ }
+}
+FX_BOOL CFX_GSUBTable::GetVerticalGlyph(FX_DWORD glyphnum, FX_DWORD* vglyphnum)
+{
+ return m_GsubImp.GetVerticalGlyph(glyphnum, vglyphnum);
+}
+IFX_GSUBTable* FXGE_CreateGSUBTable(CFX_Font* pFont)
+{
+ if (!pFont) {
+ return NULL;
+ }
+ if (NULL == pFont->m_pGsubData) {
+ unsigned long length = 0;
+ int error = FXFT_Load_Sfnt_Table(pFont->m_Face, FT_MAKE_TAG('G', 'S', 'U', 'B'), 0, NULL, &length);
+ if (!error) {
+ pFont->m_pGsubData = (unsigned char*)FX_Alloc(FX_BYTE, length);
+ }
+ if (!pFont->m_pGsubData) {
+ return NULL;
+ }
+ }
+ int error = FXFT_Load_Sfnt_Table(pFont->m_Face, FT_MAKE_TAG('G', 'S', 'U', 'B'), 0, pFont->m_pGsubData, NULL);
+ if (!error && pFont->m_pGsubData) {
+ CFX_GSUBTable* pGsubTable = FX_NEW CFX_GSUBTable;
+ if (!pGsubTable) {
+ return NULL;
+ }
+ if (pGsubTable->m_GsubImp.LoadGSUBTable((FT_Bytes)pFont->m_pGsubData)) {
+ return pGsubTable;
+ }
+ delete pGsubTable;
+ }
+ return NULL;
+}
diff --git a/core/src/fpdfapi/fpdf_font/ttgsubtable.h b/core/src/fpdfapi/fpdf_font/ttgsubtable.h
index a1f0e8867a..bf9c7a4c42 100644
--- a/core/src/fpdfapi/fpdf_font/ttgsubtable.h
+++ b/core/src/fpdfapi/fpdf_font/ttgsubtable.h
@@ -1,419 +1,419 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef TTGSUBTable_H
-#define TTGSUBTable_H
-#include "../../fx_freetype.h"
-#include "../../../include/fxcrt/fx_basic.h"
-#include "common.h"
-class CFX_GlyphMap
-{
-public:
- CFX_GlyphMap();
- ~CFX_GlyphMap();
- void SetAt(int key, int value);
- FX_BOOL Lookup(int key, int &value);
-protected:
- CFX_BinaryBuf m_Buffer;
-};
-class CFX_CTTGSUBTable : public CFX_Object
-{
-public:
- CFX_CTTGSUBTable(void): loaded(false), m_bFeautureMapLoad(FALSE) {};
- CFX_CTTGSUBTable(FT_Bytes gsub): loaded(false), m_bFeautureMapLoad(FALSE)
- {
- LoadGSUBTable(gsub);
- }
- virtual ~CFX_CTTGSUBTable() {}
- bool IsOk(void) const
- {
- return loaded;
- }
- bool LoadGSUBTable(FT_Bytes gsub);
- bool GetVerticalGlyph(TT_uint32_t glyphnum, TT_uint32_t *vglyphnum);
-private:
- struct tt_gsub_header {
- TT_uint32_t Version;
- TT_uint16_t ScriptList;
- TT_uint16_t FeatureList;
- TT_uint16_t LookupList;
- };
- struct TLangSys {
- TT_uint16_t LookupOrder;
- TT_uint16_t ReqFeatureIndex;
- TT_uint16_t FeatureCount;
- TT_uint16_t *FeatureIndex;
- TLangSys(): LookupOrder(0), ReqFeatureIndex(0), FeatureCount(0), FeatureIndex(NULL) {}
- ~TLangSys()
- {
- if(FeatureIndex) {
- delete[] FeatureIndex;
- }
- }
- private:
- TLangSys(const TLangSys&);
- TLangSys& operator=(const TLangSys&);
- };
- struct TLangSysRecord {
- TT_uint32_t LangSysTag;
- struct TLangSys LangSys;
- TLangSysRecord(): LangSysTag(0) {}
- private:
- TLangSysRecord(const TLangSysRecord&);
- TLangSysRecord& operator=(const TLangSysRecord&);
- };
- struct TScript {
- TT_uint16_t DefaultLangSys;
- TT_uint16_t LangSysCount;
- struct TLangSysRecord *LangSysRecord;
- TScript(): DefaultLangSys(0), LangSysCount(0), LangSysRecord(NULL) {}
- ~TScript()
- {
- if(LangSysRecord) {
- delete[] LangSysRecord;
- }
- }
- private:
- TScript(const TScript&);
- TScript& operator=(const TScript&);
- };
- struct TScriptRecord {
- TT_uint32_t ScriptTag;
- struct TScript Script;
- TScriptRecord(): ScriptTag(0) {}
- private:
- TScriptRecord(const TScriptRecord&);
- TScriptRecord& operator=(const TScriptRecord&);
- };
- struct TScriptList {
- TT_uint16_t ScriptCount;
- struct TScriptRecord *ScriptRecord;
- TScriptList(): ScriptCount(0), ScriptRecord(NULL) {}
- ~TScriptList()
- {
- if(ScriptRecord) {
- delete[] ScriptRecord;
- }
- }
- private:
- TScriptList(const TScriptList&);
- TScriptList& operator=(const TScriptList&);
- };
- struct TFeature {
- TT_uint16_t FeatureParams;
- int LookupCount;
- TT_uint16_t *LookupListIndex;
- TFeature(): FeatureParams(0), LookupCount(0), LookupListIndex(NULL) {}
- ~TFeature()
- {
- if(LookupListIndex) {
- delete[] LookupListIndex;
- }
- }
- private:
- TFeature(const TFeature&);
- TFeature& operator=(const TFeature&);
- };
- struct TFeatureRecord {
- TT_uint32_t FeatureTag;
- struct TFeature Feature;
- TFeatureRecord(): FeatureTag(0) {}
- private:
- TFeatureRecord(const TFeatureRecord&);
- TFeatureRecord& operator=(const TFeatureRecord&);
- };
- struct TFeatureList {
- int FeatureCount;
- struct TFeatureRecord *FeatureRecord;
- TFeatureList(): FeatureCount(0), FeatureRecord(NULL) {}
- ~TFeatureList()
- {
- if(FeatureRecord) {
- delete[] FeatureRecord;
- }
- }
- private:
- TFeatureList(const TFeatureList&);
- TFeatureList& operator=(const TFeatureList&);
- };
- enum TLookupFlag {
- LOOKUPFLAG_RightToLeft = 0x0001,
- LOOKUPFLAG_IgnoreBaseGlyphs = 0x0002,
- LOOKUPFLAG_IgnoreLigatures = 0x0004,
- LOOKUPFLAG_IgnoreMarks = 0x0008,
- LOOKUPFLAG_Reserved = 0x00F0,
- LOOKUPFLAG_MarkAttachmentType = 0xFF00,
- };
- struct TCoverageFormatBase {
- TT_uint16_t CoverageFormat;
- CFX_GlyphMap m_glyphMap;
- TCoverageFormatBase(): CoverageFormat(0) {}
- virtual ~TCoverageFormatBase() {}
- private:
- TCoverageFormatBase(const TCoverageFormatBase&);
- TCoverageFormatBase& operator=(const TCoverageFormatBase&);
- };
- struct TCoverageFormat1: public TCoverageFormatBase {
- TT_uint16_t GlyphCount;
- TT_uint16_t *GlyphArray;
- TCoverageFormat1(): GlyphCount(0), GlyphArray(NULL)
- {
- CoverageFormat = 1;
- }
- ~TCoverageFormat1()
- {
- if(GlyphArray) {
- delete[] GlyphArray;
- }
- }
- private:
- TCoverageFormat1(const TCoverageFormat1&);
- TCoverageFormat1& operator=(const TCoverageFormat1&);
- };
- struct TRangeRecord {
- TT_uint16_t Start;
- TT_uint16_t End;
- TT_uint16_t StartCoverageIndex;
- TRangeRecord(): Start(0), End(0), StartCoverageIndex(0) {}
- friend bool operator > (const TRangeRecord &r1, const TRangeRecord &r2)
- {
- return r1.Start > r2.Start;
- }
- private:
- TRangeRecord(const TRangeRecord&);
- };
- struct TCoverageFormat2: public TCoverageFormatBase {
- TT_uint16_t RangeCount;
- struct TRangeRecord *RangeRecord;
- TCoverageFormat2(): RangeCount(0), RangeRecord(NULL)
- {
- CoverageFormat = 2;
- }
- ~TCoverageFormat2()
- {
- if(RangeRecord) {
- delete[] RangeRecord;
- }
- }
- private:
- TCoverageFormat2(const TCoverageFormat2&);
- TCoverageFormat2& operator=(const TCoverageFormat2&);
- };
- struct TClassDefFormatBase {
- TT_uint16_t ClassFormat;
- TClassDefFormatBase(): ClassFormat(0) {}
- virtual ~TClassDefFormatBase() {}
- private:
- TClassDefFormatBase(const TClassDefFormatBase&);
- TClassDefFormatBase& operator=(const TClassDefFormatBase&);
- };
- struct TClassDefFormat1: public TClassDefFormatBase {
- TT_uint16_t StartGlyph;
- TT_uint16_t GlyphCount;
- TT_uint16_t *ClassValueArray;
- TClassDefFormat1(): StartGlyph(0), GlyphCount(0), ClassValueArray(NULL)
- {
- ClassFormat = 1;
- }
- ~TClassDefFormat1()
- {
- if(ClassValueArray) {
- delete[] ClassValueArray;
- }
- }
- private:
- TClassDefFormat1(const TClassDefFormat1&);
- TClassDefFormat1& operator=(const TClassDefFormat1&);
- };
- struct TClassRangeRecord {
- TT_uint16_t Start;
- TT_uint16_t End;
- TT_uint16_t Class;
- TClassRangeRecord(): Start(0), End(0), Class(0) {}
- private:
- TClassRangeRecord(const TClassRangeRecord&);
- TClassRangeRecord& operator=(const TClassRangeRecord&);
- };
- struct TClassDefFormat2: public TClassDefFormatBase {
- TT_uint16_t ClassRangeCount;
- struct TClassRangeRecord *ClassRangeRecord;
- TClassDefFormat2(): ClassRangeCount(0), ClassRangeRecord(NULL)
- {
- ClassFormat = 2;
- }
- ~TClassDefFormat2()
- {
- if(ClassRangeRecord) {
- delete[] ClassRangeRecord;
- }
- }
- private:
- TClassDefFormat2(const TClassDefFormat2&);
- TClassDefFormat2& operator=(const TClassDefFormat2&);
- };
- struct TDevice {
- TT_uint16_t StartSize;
- TT_uint16_t EndSize;
- TT_uint16_t DeltaFormat;
- TDevice(): StartSize(0), EndSize(0), DeltaFormat(0) {}
- private:
- TDevice(const TDevice&);
- TDevice& operator=(const TDevice&);
- };
- struct TSubTableBase {
- TT_uint16_t SubstFormat;
- TSubTableBase(): SubstFormat(0) {}
- virtual ~TSubTableBase() {}
- private:
- TSubTableBase(const TSubTableBase&);
- TSubTableBase& operator=(const TSubTableBase&);
- };
- struct TSingleSubstFormat1: public TSubTableBase {
- TCoverageFormatBase *Coverage;
- TT_int16_t DeltaGlyphID;
- TSingleSubstFormat1(): DeltaGlyphID(0), Coverage(NULL)
- {
- SubstFormat = 1;
- }
- ~TSingleSubstFormat1()
- {
- if(Coverage) {
- delete Coverage;
- }
- }
- private:
- TSingleSubstFormat1(const TSingleSubstFormat1&);
- TSingleSubstFormat1& operator=(const TSingleSubstFormat1&);
- };
- struct TSingleSubstFormat2: public TSubTableBase {
- TCoverageFormatBase *Coverage;
- TT_uint16_t GlyphCount;
- TT_uint16_t *Substitute;
- TSingleSubstFormat2(): Coverage(NULL), GlyphCount(0), Substitute(NULL)
- {
- SubstFormat = 2;
- }
- ~TSingleSubstFormat2()
- {
- if(Coverage) {
- delete Coverage;
- }
- if(Substitute) {
- delete[] Substitute;
- }
- }
- private:
- TSingleSubstFormat2(const TSingleSubstFormat2&);
- TSingleSubstFormat2& operator=(const TSingleSubstFormat2&);
- };
- struct TLookup {
- TT_uint16_t LookupType;
- TT_uint16_t LookupFlag;
- TT_uint16_t SubTableCount;
- struct TSubTableBase **SubTable;
- TLookup(): LookupType(0), LookupFlag(0), SubTableCount(0), SubTable(NULL) {}
- ~TLookup()
- {
- if(SubTableCount > 0 && SubTable != NULL) {
- for(int i = 0; i < SubTableCount; i++) {
- delete SubTable[i];
- }
- delete[] SubTable;
- }
- }
- private:
- TLookup(const TLookup&);
- TLookup& operator=(const TLookup&);
- };
- struct TLookupList {
- int LookupCount;
- struct TLookup *Lookup;
- TLookupList(): LookupCount(0), Lookup(NULL) {}
- ~TLookupList()
- {
- if(Lookup) {
- delete[] Lookup;
- }
- }
- private:
- TLookupList(const TLookupList&);
- TLookupList& operator=(const TLookupList&);
- };
- bool Parse(
- FT_Bytes scriptlist,
- FT_Bytes featurelist,
- FT_Bytes lookuplist);
- void ParseScriptList(FT_Bytes raw, TScriptList *rec);
- void ParseScript(FT_Bytes raw, TScript *rec);
- void ParseLangSys(FT_Bytes raw, TLangSys *rec);
- void ParseFeatureList(FT_Bytes raw, TFeatureList *rec);
- void ParseFeature(FT_Bytes raw, TFeature *rec);
- void ParseLookupList(FT_Bytes raw, TLookupList *rec);
- void ParseLookup(FT_Bytes raw, TLookup *rec);
- void ParseCoverage(FT_Bytes raw, TCoverageFormatBase **rec);
- void ParseCoverageFormat1(FT_Bytes raw, TCoverageFormat1 *rec);
- void ParseCoverageFormat2(FT_Bytes raw, TCoverageFormat2 *rec);
- void ParseSingleSubst(FT_Bytes raw, TSubTableBase **rec);
- void ParseSingleSubstFormat1(FT_Bytes raw, TSingleSubstFormat1 *rec);
- void ParseSingleSubstFormat2(FT_Bytes raw, TSingleSubstFormat2 *rec);
- bool GetVerticalGlyphSub(
- TT_uint32_t glyphnum,
- TT_uint32_t *vglyphnum,
- struct TFeature *Feature);
- bool GetVerticalGlyphSub2(
- TT_uint32_t glyphnum,
- TT_uint32_t *vglyphnum,
- struct TLookup *Lookup);
- int GetCoverageIndex(struct TCoverageFormatBase *Coverage, TT_uint32_t g);
- TT_uint8_t GetUInt8(FT_Bytes& p) const
- {
- TT_uint8_t ret = p[0];
- p += 1;
- return ret;
- }
- TT_int16_t GetInt16(FT_Bytes& p) const
- {
- TT_uint16_t ret = p[0] << 8 | p[1];
- p += 2;
- return *(TT_int16_t*)&ret;
- }
- TT_uint16_t GetUInt16(FT_Bytes& p) const
- {
- TT_uint16_t ret = p[0] << 8 | p[1];
- p += 2;
- return ret;
- }
- TT_int32_t GetInt32(FT_Bytes& p) const
- {
- TT_uint32_t ret = p[0] << 24 | p[1] << 16 | p[2] << 8 | p[3];
- p += 4;
- return *(TT_int32_t*)&ret;
- }
- TT_uint32_t GetUInt32(FT_Bytes& p) const
- {
- TT_uint32_t ret = p[0] << 24 | p[1] << 16 | p[2] << 8 | p[3];
- p += 4;
- return ret;
- }
- CFX_CMapDWordToDWord m_featureMap;
- FX_BOOL m_bFeautureMapLoad;
- bool loaded;
- struct tt_gsub_header header;
- struct TScriptList ScriptList;
- struct TFeatureList FeatureList;
- struct TLookupList LookupList;
-};
-class CFX_GSUBTable : public IFX_GSUBTable, public CFX_Object
-{
-public:
- virtual void Release()
- {
- delete this;
- }
- virtual FX_BOOL GetVerticalGlyph(FX_DWORD glyphnum, FX_DWORD* vglyphnum);
- CFX_CTTGSUBTable m_GsubImp;
-};
-#endif
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef TTGSUBTable_H
+#define TTGSUBTable_H
+#include "../../fx_freetype.h"
+#include "../../../include/fxcrt/fx_basic.h"
+#include "common.h"
+class CFX_GlyphMap
+{
+public:
+ CFX_GlyphMap();
+ ~CFX_GlyphMap();
+ void SetAt(int key, int value);
+ FX_BOOL Lookup(int key, int &value);
+protected:
+ CFX_BinaryBuf m_Buffer;
+};
+class CFX_CTTGSUBTable : public CFX_Object
+{
+public:
+ CFX_CTTGSUBTable(void): loaded(false), m_bFeautureMapLoad(FALSE) {};
+ CFX_CTTGSUBTable(FT_Bytes gsub): loaded(false), m_bFeautureMapLoad(FALSE)
+ {
+ LoadGSUBTable(gsub);
+ }
+ virtual ~CFX_CTTGSUBTable() {}
+ bool IsOk(void) const
+ {
+ return loaded;
+ }
+ bool LoadGSUBTable(FT_Bytes gsub);
+ bool GetVerticalGlyph(TT_uint32_t glyphnum, TT_uint32_t *vglyphnum);
+private:
+ struct tt_gsub_header {
+ TT_uint32_t Version;
+ TT_uint16_t ScriptList;
+ TT_uint16_t FeatureList;
+ TT_uint16_t LookupList;
+ };
+ struct TLangSys {
+ TT_uint16_t LookupOrder;
+ TT_uint16_t ReqFeatureIndex;
+ TT_uint16_t FeatureCount;
+ TT_uint16_t *FeatureIndex;
+ TLangSys(): LookupOrder(0), ReqFeatureIndex(0), FeatureCount(0), FeatureIndex(NULL) {}
+ ~TLangSys()
+ {
+ if(FeatureIndex) {
+ delete[] FeatureIndex;
+ }
+ }
+ private:
+ TLangSys(const TLangSys&);
+ TLangSys& operator=(const TLangSys&);
+ };
+ struct TLangSysRecord {
+ TT_uint32_t LangSysTag;
+ struct TLangSys LangSys;
+ TLangSysRecord(): LangSysTag(0) {}
+ private:
+ TLangSysRecord(const TLangSysRecord&);
+ TLangSysRecord& operator=(const TLangSysRecord&);
+ };
+ struct TScript {
+ TT_uint16_t DefaultLangSys;
+ TT_uint16_t LangSysCount;
+ struct TLangSysRecord *LangSysRecord;
+ TScript(): DefaultLangSys(0), LangSysCount(0), LangSysRecord(NULL) {}
+ ~TScript()
+ {
+ if(LangSysRecord) {
+ delete[] LangSysRecord;
+ }
+ }
+ private:
+ TScript(const TScript&);
+ TScript& operator=(const TScript&);
+ };
+ struct TScriptRecord {
+ TT_uint32_t ScriptTag;
+ struct TScript Script;
+ TScriptRecord(): ScriptTag(0) {}
+ private:
+ TScriptRecord(const TScriptRecord&);
+ TScriptRecord& operator=(const TScriptRecord&);
+ };
+ struct TScriptList {
+ TT_uint16_t ScriptCount;
+ struct TScriptRecord *ScriptRecord;
+ TScriptList(): ScriptCount(0), ScriptRecord(NULL) {}
+ ~TScriptList()
+ {
+ if(ScriptRecord) {
+ delete[] ScriptRecord;
+ }
+ }
+ private:
+ TScriptList(const TScriptList&);
+ TScriptList& operator=(const TScriptList&);
+ };
+ struct TFeature {
+ TT_uint16_t FeatureParams;
+ int LookupCount;
+ TT_uint16_t *LookupListIndex;
+ TFeature(): FeatureParams(0), LookupCount(0), LookupListIndex(NULL) {}
+ ~TFeature()
+ {
+ if(LookupListIndex) {
+ delete[] LookupListIndex;
+ }
+ }
+ private:
+ TFeature(const TFeature&);
+ TFeature& operator=(const TFeature&);
+ };
+ struct TFeatureRecord {
+ TT_uint32_t FeatureTag;
+ struct TFeature Feature;
+ TFeatureRecord(): FeatureTag(0) {}
+ private:
+ TFeatureRecord(const TFeatureRecord&);
+ TFeatureRecord& operator=(const TFeatureRecord&);
+ };
+ struct TFeatureList {
+ int FeatureCount;
+ struct TFeatureRecord *FeatureRecord;
+ TFeatureList(): FeatureCount(0), FeatureRecord(NULL) {}
+ ~TFeatureList()
+ {
+ if(FeatureRecord) {
+ delete[] FeatureRecord;
+ }
+ }
+ private:
+ TFeatureList(const TFeatureList&);
+ TFeatureList& operator=(const TFeatureList&);
+ };
+ enum TLookupFlag {
+ LOOKUPFLAG_RightToLeft = 0x0001,
+ LOOKUPFLAG_IgnoreBaseGlyphs = 0x0002,
+ LOOKUPFLAG_IgnoreLigatures = 0x0004,
+ LOOKUPFLAG_IgnoreMarks = 0x0008,
+ LOOKUPFLAG_Reserved = 0x00F0,
+ LOOKUPFLAG_MarkAttachmentType = 0xFF00,
+ };
+ struct TCoverageFormatBase {
+ TT_uint16_t CoverageFormat;
+ CFX_GlyphMap m_glyphMap;
+ TCoverageFormatBase(): CoverageFormat(0) {}
+ virtual ~TCoverageFormatBase() {}
+ private:
+ TCoverageFormatBase(const TCoverageFormatBase&);
+ TCoverageFormatBase& operator=(const TCoverageFormatBase&);
+ };
+ struct TCoverageFormat1: public TCoverageFormatBase {
+ TT_uint16_t GlyphCount;
+ TT_uint16_t *GlyphArray;
+ TCoverageFormat1(): GlyphCount(0), GlyphArray(NULL)
+ {
+ CoverageFormat = 1;
+ }
+ ~TCoverageFormat1()
+ {
+ if(GlyphArray) {
+ delete[] GlyphArray;
+ }
+ }
+ private:
+ TCoverageFormat1(const TCoverageFormat1&);
+ TCoverageFormat1& operator=(const TCoverageFormat1&);
+ };
+ struct TRangeRecord {
+ TT_uint16_t Start;
+ TT_uint16_t End;
+ TT_uint16_t StartCoverageIndex;
+ TRangeRecord(): Start(0), End(0), StartCoverageIndex(0) {}
+ friend bool operator > (const TRangeRecord &r1, const TRangeRecord &r2)
+ {
+ return r1.Start > r2.Start;
+ }
+ private:
+ TRangeRecord(const TRangeRecord&);
+ };
+ struct TCoverageFormat2: public TCoverageFormatBase {
+ TT_uint16_t RangeCount;
+ struct TRangeRecord *RangeRecord;
+ TCoverageFormat2(): RangeCount(0), RangeRecord(NULL)
+ {
+ CoverageFormat = 2;
+ }
+ ~TCoverageFormat2()
+ {
+ if(RangeRecord) {
+ delete[] RangeRecord;
+ }
+ }
+ private:
+ TCoverageFormat2(const TCoverageFormat2&);
+ TCoverageFormat2& operator=(const TCoverageFormat2&);
+ };
+ struct TClassDefFormatBase {
+ TT_uint16_t ClassFormat;
+ TClassDefFormatBase(): ClassFormat(0) {}
+ virtual ~TClassDefFormatBase() {}
+ private:
+ TClassDefFormatBase(const TClassDefFormatBase&);
+ TClassDefFormatBase& operator=(const TClassDefFormatBase&);
+ };
+ struct TClassDefFormat1: public TClassDefFormatBase {
+ TT_uint16_t StartGlyph;
+ TT_uint16_t GlyphCount;
+ TT_uint16_t *ClassValueArray;
+ TClassDefFormat1(): StartGlyph(0), GlyphCount(0), ClassValueArray(NULL)
+ {
+ ClassFormat = 1;
+ }
+ ~TClassDefFormat1()
+ {
+ if(ClassValueArray) {
+ delete[] ClassValueArray;
+ }
+ }
+ private:
+ TClassDefFormat1(const TClassDefFormat1&);
+ TClassDefFormat1& operator=(const TClassDefFormat1&);
+ };
+ struct TClassRangeRecord {
+ TT_uint16_t Start;
+ TT_uint16_t End;
+ TT_uint16_t Class;
+ TClassRangeRecord(): Start(0), End(0), Class(0) {}
+ private:
+ TClassRangeRecord(const TClassRangeRecord&);
+ TClassRangeRecord& operator=(const TClassRangeRecord&);
+ };
+ struct TClassDefFormat2: public TClassDefFormatBase {
+ TT_uint16_t ClassRangeCount;
+ struct TClassRangeRecord *ClassRangeRecord;
+ TClassDefFormat2(): ClassRangeCount(0), ClassRangeRecord(NULL)
+ {
+ ClassFormat = 2;
+ }
+ ~TClassDefFormat2()
+ {
+ if(ClassRangeRecord) {
+ delete[] ClassRangeRecord;
+ }
+ }
+ private:
+ TClassDefFormat2(const TClassDefFormat2&);
+ TClassDefFormat2& operator=(const TClassDefFormat2&);
+ };
+ struct TDevice {
+ TT_uint16_t StartSize;
+ TT_uint16_t EndSize;
+ TT_uint16_t DeltaFormat;
+ TDevice(): StartSize(0), EndSize(0), DeltaFormat(0) {}
+ private:
+ TDevice(const TDevice&);
+ TDevice& operator=(const TDevice&);
+ };
+ struct TSubTableBase {
+ TT_uint16_t SubstFormat;
+ TSubTableBase(): SubstFormat(0) {}
+ virtual ~TSubTableBase() {}
+ private:
+ TSubTableBase(const TSubTableBase&);
+ TSubTableBase& operator=(const TSubTableBase&);
+ };
+ struct TSingleSubstFormat1: public TSubTableBase {
+ TCoverageFormatBase *Coverage;
+ TT_int16_t DeltaGlyphID;
+ TSingleSubstFormat1(): DeltaGlyphID(0), Coverage(NULL)
+ {
+ SubstFormat = 1;
+ }
+ ~TSingleSubstFormat1()
+ {
+ if(Coverage) {
+ delete Coverage;
+ }
+ }
+ private:
+ TSingleSubstFormat1(const TSingleSubstFormat1&);
+ TSingleSubstFormat1& operator=(const TSingleSubstFormat1&);
+ };
+ struct TSingleSubstFormat2: public TSubTableBase {
+ TCoverageFormatBase *Coverage;
+ TT_uint16_t GlyphCount;
+ TT_uint16_t *Substitute;
+ TSingleSubstFormat2(): Coverage(NULL), GlyphCount(0), Substitute(NULL)
+ {
+ SubstFormat = 2;
+ }
+ ~TSingleSubstFormat2()
+ {
+ if(Coverage) {
+ delete Coverage;
+ }
+ if(Substitute) {
+ delete[] Substitute;
+ }
+ }
+ private:
+ TSingleSubstFormat2(const TSingleSubstFormat2&);
+ TSingleSubstFormat2& operator=(const TSingleSubstFormat2&);
+ };
+ struct TLookup {
+ TT_uint16_t LookupType;
+ TT_uint16_t LookupFlag;
+ TT_uint16_t SubTableCount;
+ struct TSubTableBase **SubTable;
+ TLookup(): LookupType(0), LookupFlag(0), SubTableCount(0), SubTable(NULL) {}
+ ~TLookup()
+ {
+ if(SubTableCount > 0 && SubTable != NULL) {
+ for(int i = 0; i < SubTableCount; i++) {
+ delete SubTable[i];
+ }
+ delete[] SubTable;
+ }
+ }
+ private:
+ TLookup(const TLookup&);
+ TLookup& operator=(const TLookup&);
+ };
+ struct TLookupList {
+ int LookupCount;
+ struct TLookup *Lookup;
+ TLookupList(): LookupCount(0), Lookup(NULL) {}
+ ~TLookupList()
+ {
+ if(Lookup) {
+ delete[] Lookup;
+ }
+ }
+ private:
+ TLookupList(const TLookupList&);
+ TLookupList& operator=(const TLookupList&);
+ };
+ bool Parse(
+ FT_Bytes scriptlist,
+ FT_Bytes featurelist,
+ FT_Bytes lookuplist);
+ void ParseScriptList(FT_Bytes raw, TScriptList *rec);
+ void ParseScript(FT_Bytes raw, TScript *rec);
+ void ParseLangSys(FT_Bytes raw, TLangSys *rec);
+ void ParseFeatureList(FT_Bytes raw, TFeatureList *rec);
+ void ParseFeature(FT_Bytes raw, TFeature *rec);
+ void ParseLookupList(FT_Bytes raw, TLookupList *rec);
+ void ParseLookup(FT_Bytes raw, TLookup *rec);
+ void ParseCoverage(FT_Bytes raw, TCoverageFormatBase **rec);
+ void ParseCoverageFormat1(FT_Bytes raw, TCoverageFormat1 *rec);
+ void ParseCoverageFormat2(FT_Bytes raw, TCoverageFormat2 *rec);
+ void ParseSingleSubst(FT_Bytes raw, TSubTableBase **rec);
+ void ParseSingleSubstFormat1(FT_Bytes raw, TSingleSubstFormat1 *rec);
+ void ParseSingleSubstFormat2(FT_Bytes raw, TSingleSubstFormat2 *rec);
+ bool GetVerticalGlyphSub(
+ TT_uint32_t glyphnum,
+ TT_uint32_t *vglyphnum,
+ struct TFeature *Feature);
+ bool GetVerticalGlyphSub2(
+ TT_uint32_t glyphnum,
+ TT_uint32_t *vglyphnum,
+ struct TLookup *Lookup);
+ int GetCoverageIndex(struct TCoverageFormatBase *Coverage, TT_uint32_t g);
+ TT_uint8_t GetUInt8(FT_Bytes& p) const
+ {
+ TT_uint8_t ret = p[0];
+ p += 1;
+ return ret;
+ }
+ TT_int16_t GetInt16(FT_Bytes& p) const
+ {
+ TT_uint16_t ret = p[0] << 8 | p[1];
+ p += 2;
+ return *(TT_int16_t*)&ret;
+ }
+ TT_uint16_t GetUInt16(FT_Bytes& p) const
+ {
+ TT_uint16_t ret = p[0] << 8 | p[1];
+ p += 2;
+ return ret;
+ }
+ TT_int32_t GetInt32(FT_Bytes& p) const
+ {
+ TT_uint32_t ret = p[0] << 24 | p[1] << 16 | p[2] << 8 | p[3];
+ p += 4;
+ return *(TT_int32_t*)&ret;
+ }
+ TT_uint32_t GetUInt32(FT_Bytes& p) const
+ {
+ TT_uint32_t ret = p[0] << 24 | p[1] << 16 | p[2] << 8 | p[3];
+ p += 4;
+ return ret;
+ }
+ CFX_CMapDWordToDWord m_featureMap;
+ FX_BOOL m_bFeautureMapLoad;
+ bool loaded;
+ struct tt_gsub_header header;
+ struct TScriptList ScriptList;
+ struct TFeatureList FeatureList;
+ struct TLookupList LookupList;
+};
+class CFX_GSUBTable : public IFX_GSUBTable, public CFX_Object
+{
+public:
+ virtual void Release()
+ {
+ delete this;
+ }
+ virtual FX_BOOL GetVerticalGlyph(FX_DWORD glyphnum, FX_DWORD* vglyphnum);
+ CFX_CTTGSUBTable m_GsubImp;
+};
+#endif
diff --git a/core/src/fpdfapi/fpdf_page/fpdf_page.cpp b/core/src/fpdfapi/fpdf_page/fpdf_page.cpp
index 232e5619a7..3cfb93e4bc 100644
--- a/core/src/fpdfapi/fpdf_page/fpdf_page.cpp
+++ b/core/src/fpdfapi/fpdf_page/fpdf_page.cpp
@@ -1,1047 +1,1047 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../../include/fpdfapi/fpdf_page.h"
-#include "../../../include/fpdfapi/fpdf_module.h"
-#include "pageint.h"
-void CPDF_PageObject::Release()
-{
- delete this;
-}
-CPDF_PageObject* CPDF_PageObject::Create(int type)
-{
- switch (type) {
- case PDFPAGE_TEXT:
- return FX_NEW CPDF_TextObject;
- case PDFPAGE_IMAGE:
- return FX_NEW CPDF_ImageObject;
- case PDFPAGE_PATH:
- return FX_NEW CPDF_PathObject;
- case PDFPAGE_SHADING:
- return FX_NEW CPDF_ShadingObject;
- case PDFPAGE_FORM:
- return FX_NEW CPDF_FormObject;
- }
- return NULL;
-}
-CPDF_PageObject* CPDF_PageObject::Clone() const
-{
- CPDF_PageObject* pObj = Create(m_Type);
- pObj->Copy(this);
- return pObj;
-}
-void CPDF_PageObject::Copy(const CPDF_PageObject* pSrc)
-{
- if (m_Type != pSrc->m_Type) {
- return;
- }
- CopyData(pSrc);
- CopyStates(*pSrc);
- m_Left = pSrc->m_Left;
- m_Right = pSrc->m_Right;
- m_Top = pSrc->m_Top;
- m_Bottom = pSrc->m_Bottom;
-}
-void CPDF_PageObject::AppendClipPath(CPDF_Path path, int type, FX_BOOL bAutoMerge)
-{
- m_ClipPath.AppendPath(path, type, bAutoMerge);
-}
-void CPDF_PageObject::CopyClipPath(CPDF_PageObject* pObj)
-{
- m_ClipPath = pObj->m_ClipPath;
-}
-void CPDF_PageObject::RemoveClipPath()
-{
- m_ClipPath.SetNull();
-}
-void CPDF_PageObject::RecalcBBox()
-{
- switch (m_Type) {
- case PDFPAGE_TEXT:
- ((CPDF_TextObject*)this)->RecalcPositionData();
- break;
- case PDFPAGE_PATH:
- ((CPDF_PathObject*)this)->CalcBoundingBox();
- break;
- case PDFPAGE_SHADING:
- ((CPDF_ShadingObject*)this)->CalcBoundingBox();
- break;
- }
-}
-void CPDF_PageObject::TransformClipPath(CFX_AffineMatrix& matrix)
-{
- if (m_ClipPath.IsNull()) {
- return;
- }
- m_ClipPath.GetModify();
- m_ClipPath.Transform(matrix);
-}
-void CPDF_PageObject::TransformGeneralState(CFX_AffineMatrix& matrix)
-{
- if(m_GeneralState.IsNull()) {
- return;
- }
- CPDF_GeneralStateData* pGS = m_GeneralState.GetModify();
- pGS->m_Matrix.Concat(matrix);
-}
-FX_RECT CPDF_PageObject::GetBBox(const CFX_AffineMatrix* pMatrix) const
-{
- CFX_FloatRect rect(m_Left, m_Bottom, m_Right, m_Top);
- if (pMatrix) {
- pMatrix->TransformRect(rect);
- }
- return rect.GetOutterRect();
-}
-CPDF_TextObject::CPDF_TextObject()
-{
- m_Type = PDFPAGE_TEXT;
- m_pCharCodes = NULL;
- m_pCharPos = NULL;
- m_nChars = 0;
- m_PosX = m_PosY = 0;
-}
-CPDF_TextObject::~CPDF_TextObject()
-{
- if (m_nChars > 1 && m_pCharCodes) {
- FX_Free(m_pCharCodes);
- }
- if (m_pCharPos) {
- FX_Free(m_pCharPos);
- }
-}
-void CPDF_TextObject::GetItemInfo(int index, CPDF_TextObjectItem* pInfo) const
-{
- pInfo->m_CharCode = m_nChars == 1 ? (FX_DWORD)(FX_UINTPTR)m_pCharCodes : m_pCharCodes[index];
- pInfo->m_OriginX = index ? m_pCharPos[index - 1] : 0;
- pInfo->m_OriginY = 0;
- if (pInfo->m_CharCode == -1) {
- return;
- }
- CPDF_Font* pFont = m_TextState.GetFont();
- if (pFont->GetFontType() != PDFFONT_CIDFONT) {
- return;
- }
- if (!((CPDF_CIDFont*)pFont)->IsVertWriting()) {
- return;
- }
- FX_WORD CID = ((CPDF_CIDFont*)pFont)->CIDFromCharCode(pInfo->m_CharCode);
- pInfo->m_OriginY = pInfo->m_OriginX;
- pInfo->m_OriginX = 0;
- short vx, vy;
- ((CPDF_CIDFont*)pFont)->GetVertOrigin(CID, vx, vy);
- FX_FLOAT fontsize = m_TextState.GetFontSize();
- pInfo->m_OriginX -= fontsize * vx / 1000;
- pInfo->m_OriginY -= fontsize * vy / 1000;
-}
-int CPDF_TextObject::CountChars() const
-{
- if (m_nChars == 1) {
- return 1;
- }
- int count = 0;
- for (int i = 0; i < m_nChars; i ++)
- if (m_pCharCodes[i] != (FX_DWORD) - 1) {
- count ++;
- }
- return count;
-}
-void CPDF_TextObject::GetCharInfo(int index, FX_DWORD& charcode, FX_FLOAT& kerning) const
-{
- if (m_nChars == 1) {
- charcode = (FX_DWORD)(FX_UINTPTR)m_pCharCodes;
- kerning = 0;
- return;
- }
- int count = 0;
- for (int i = 0; i < m_nChars; i ++) {
- if (m_pCharCodes[i] != (FX_DWORD) - 1) {
- if (count == index) {
- charcode = m_pCharCodes[i];
- if (i == m_nChars - 1 || m_pCharCodes[i + 1] != (FX_DWORD) - 1) {
- kerning = 0;
- } else {
- kerning = m_pCharPos[i];
- }
- return;
- }
- count ++;
- }
- }
-}
-void CPDF_TextObject::GetCharInfo(int index, CPDF_TextObjectItem* pInfo) const
-{
- if (m_nChars == 1) {
- GetItemInfo(0, pInfo);
- return;
- }
- int count = 0;
- for (int i = 0; i < m_nChars; i ++) {
- FX_DWORD charcode = m_pCharCodes[i];
- if (charcode == (FX_DWORD) - 1) {
- continue;
- }
- if (count == index) {
- GetItemInfo(i, pInfo);
- break;
- }
- count ++;
- }
-}
-void CPDF_TextObject::CopyData(const CPDF_PageObject* pSrc)
-{
- const CPDF_TextObject* pSrcObj = (const CPDF_TextObject*)pSrc;
- if (m_nChars > 1 && m_pCharCodes) {
- FX_Free(m_pCharCodes);
- m_pCharCodes = NULL;
- }
- if (m_pCharPos) {
- FX_Free(m_pCharPos);
- m_pCharPos = NULL;
- }
- m_nChars = pSrcObj->m_nChars;
- if (m_nChars > 1) {
- m_pCharCodes = FX_Alloc(FX_DWORD, m_nChars);
- m_pCharPos = FX_Alloc(FX_FLOAT, m_nChars - 1);
- int i;
- for (i = 0; i < m_nChars; i ++) {
- m_pCharCodes[i] = pSrcObj->m_pCharCodes[i];
- }
- for (i = 0; i < m_nChars - 1; i ++) {
- m_pCharPos[i] = pSrcObj->m_pCharPos[i];
- }
- } else {
- m_pCharCodes = pSrcObj->m_pCharCodes;
- }
- m_PosX = pSrcObj->m_PosX;
- m_PosY = pSrcObj->m_PosY;
-}
-void CPDF_TextObject::GetTextMatrix(CFX_AffineMatrix* pMatrix) const
-{
- FX_FLOAT* pTextMatrix = m_TextState.GetMatrix();
- pMatrix->Set(pTextMatrix[0], pTextMatrix[2], pTextMatrix[1], pTextMatrix[3], m_PosX, m_PosY);
-}
-void CPDF_TextObject::SetSegments(const CFX_ByteString* pStrs, FX_FLOAT* pKerning, int nsegs)
-{
- if (m_nChars > 1 && m_pCharCodes) {
- FX_Free(m_pCharCodes);
- m_pCharCodes = NULL;
- }
- if (m_pCharPos) {
- FX_Free(m_pCharPos);
- m_pCharPos = NULL;
- }
- CPDF_Font* pFont = m_TextState.GetFont();
- m_nChars = 0;
- for (int i = 0; i < nsegs; i ++) {
- m_nChars += pFont->CountChar(pStrs[i], pStrs[i].GetLength());
- }
- m_nChars += nsegs - 1;
- if (m_nChars > 1) {
- m_pCharCodes = FX_Alloc(FX_DWORD, m_nChars);
- m_pCharPos = FX_Alloc(FX_FLOAT, m_nChars - 1);
- int index = 0;
- for (int i = 0; i < nsegs; i ++) {
- FX_LPCSTR segment = pStrs[i];
- int offset = 0, len = pStrs[i].GetLength();
- while (offset < len) {
- m_pCharCodes[index++] = pFont->GetNextChar(segment, offset);
- }
- if (i != nsegs - 1) {
- m_pCharPos[index - 1] = pKerning[i];
- m_pCharCodes[index ++] = (FX_DWORD) - 1;
- }
- }
- } else {
- int offset = 0;
- m_pCharCodes = (FX_DWORD*)(FX_UINTPTR)pFont->GetNextChar(pStrs[0], offset);
- }
-}
-void CPDF_TextObject::SetText(const CFX_ByteString& str)
-{
- SetSegments(&str, NULL, 1);
- RecalcPositionData();
-}
-void CPDF_TextObject::SetEmpty()
-{
- if (m_nChars > 1 && m_pCharCodes) {
- FX_Free(m_pCharCodes);
- }
- if (m_nChars > 1 && m_pCharPos) {
- FX_Free(m_pCharPos);
- }
- m_nChars = 0;
- m_pCharCodes = NULL;
- m_pCharPos = NULL;
- m_Left = m_Right = m_PosX;
- m_Top = m_Bottom = m_PosY;
-}
-void CPDF_TextObject::SetText(CFX_ByteString* pStrs, FX_FLOAT* pKerning, int nSegs)
-{
- SetSegments(pStrs, pKerning, nSegs);
- RecalcPositionData();
-}
-void CPDF_TextObject::SetText(int nChars, FX_DWORD* pCharCodes, FX_FLOAT* pKernings)
-{
- if (m_nChars > 1 && m_pCharCodes) {
- FX_Free(m_pCharCodes);
- m_pCharCodes = NULL;
- }
- if (m_pCharPos) {
- FX_Free(m_pCharPos);
- m_pCharPos = NULL;
- }
- int nKernings = 0;
- int i;
- for (i = 0; i < nChars - 1; i ++)
- if (pKernings[i] != 0) {
- nKernings ++;
- }
- m_nChars = nChars + nKernings;
- if (m_nChars > 1) {
- m_pCharCodes = FX_Alloc(FX_DWORD, m_nChars);
- m_pCharPos = FX_Alloc(FX_FLOAT, m_nChars - 1);
- int index = 0;
- for (int i = 0; i < nChars; i ++) {
- m_pCharCodes[index++] = pCharCodes[i];
- if (pKernings[i] != 0 && i != nChars - 1) {
- m_pCharCodes[index] = (FX_DWORD) - 1;
- m_pCharPos[index - 1] = pKernings[i];
- index ++;
- }
- }
- } else {
- int offset = 0;
- m_pCharCodes = (FX_DWORD*)(FX_UINTPTR)pCharCodes[0];
- }
- RecalcPositionData();
-}
-FX_FLOAT CPDF_TextObject::GetCharWidth(FX_DWORD charcode) const
-{
- FX_FLOAT fontsize = m_TextState.GetFontSize() / 1000;
- CPDF_Font* pFont = m_TextState.GetFont();
- FX_BOOL bVertWriting = FALSE;
- CPDF_CIDFont* pCIDFont = pFont->GetCIDFont();
- if (pCIDFont) {
- bVertWriting = pCIDFont->IsVertWriting();
- }
- if (!bVertWriting) {
- return pFont->GetCharWidthF(charcode, 0) * fontsize;
- } else {
- FX_WORD CID = pCIDFont->CIDFromCharCode(charcode);
- return pCIDFont->GetVertWidth(CID) * fontsize;
- }
-}
-FX_FLOAT CPDF_TextObject::GetSpaceCharWidth() const
-{
- CPDF_Font* pFont = m_TextState.GetFont();
- FX_DWORD charCode = m_TextState.GetFont()->CharCodeFromUnicode(32);
- if (charCode != (FX_DWORD) - 1) {
- return GetCharWidth(charCode);
- }
- FX_FLOAT fontSize = m_TextState.GetFontSize() / 4000.0f;
- FX_BOOL bVertWriting = FALSE;
- CPDF_CIDFont* pCIDFont = pFont->GetCIDFont();
- if (pCIDFont) {
- bVertWriting = pCIDFont->IsVertWriting();
- }
- FX_RECT fontRect;
- pFont->GetFontBBox(fontRect);
- fontSize *= bVertWriting ? (FX_FLOAT)fontRect.Height() : (FX_FLOAT)fontRect.Width();
- return fontSize;
-}
-void CPDF_TextObject::GetCharRect(int index, CFX_FloatRect& rect) const
-{
- FX_FLOAT curpos = 0;
- CPDF_Font* pFont = m_TextState.GetFont();
- FX_BOOL bVertWriting = FALSE;
- CPDF_CIDFont* pCIDFont = pFont->GetCIDFont();
- if (pCIDFont) {
- bVertWriting = pCIDFont->IsVertWriting();
- }
- FX_FLOAT fontsize = m_TextState.GetFontSize() / 1000;
- int count = 0;
- for (int i = 0; i < m_nChars; i ++) {
- FX_DWORD charcode = m_nChars == 1 ? (FX_DWORD)(FX_UINTPTR)m_pCharCodes : m_pCharCodes[i];
- if (charcode == (FX_DWORD) - 1) {
- continue;
- }
- if( count != index) {
- count++;
- continue;
- }
- FX_FLOAT curpos = i > 0 ? m_pCharPos[i - 1] : 0;
- FX_RECT char_rect;
- pFont->GetCharBBox(charcode, char_rect, 0);
- if (!bVertWriting) {
- rect.left = curpos + char_rect.left * fontsize;
- rect.right = curpos + char_rect.right * fontsize;
- rect.top = char_rect.top * fontsize;
- rect.bottom = char_rect.bottom * fontsize;
- } else {
- FX_WORD CID = pCIDFont->CIDFromCharCode(charcode);
- short vx, vy;
- pCIDFont->GetVertOrigin(CID, vx, vy);
- char_rect.left -= vx;
- char_rect.right -= vx;
- char_rect.top -= vy;
- char_rect.bottom -= vy;
- rect.left = char_rect.left * fontsize;
- rect.right = char_rect.right * fontsize;
- rect.top = curpos + char_rect.top * fontsize;
- rect.bottom = curpos + char_rect.bottom * fontsize;
- }
- return;
- }
-}
-void CPDF_TextObject::CalcPositionData(FX_FLOAT* pTextAdvanceX, FX_FLOAT* pTextAdvanceY, FX_FLOAT horz_scale, int level)
-{
- FX_FLOAT curpos = 0;
- FX_FLOAT min_x = 10000 * 1.0f, max_x = -10000 * 1.0f, min_y = 10000 * 1.0f, max_y = -10000 * 1.0f;
- CPDF_Font* pFont = m_TextState.GetFont();
- FX_BOOL bVertWriting = FALSE;
- CPDF_CIDFont* pCIDFont = pFont->GetCIDFont();
- if (pCIDFont) {
- bVertWriting = pCIDFont->IsVertWriting();
- }
- FX_FLOAT fontsize = m_TextState.GetFontSize();
- for (int i = 0; i < m_nChars; i ++) {
- FX_DWORD charcode = m_nChars == 1 ? (FX_DWORD)(FX_UINTPTR)m_pCharCodes : m_pCharCodes[i];
- if (charcode == (FX_DWORD) - 1) {
- curpos -= FXSYS_Mul(m_pCharPos[i - 1], fontsize) / 1000;
- continue;
- }
- if (i) {
- m_pCharPos[i - 1] = curpos;
- }
- FX_RECT char_rect;
- pFont->GetCharBBox(charcode, char_rect, level);
- FX_FLOAT charwidth;
- if (!bVertWriting) {
- if (min_y > char_rect.top) {
- min_y = (FX_FLOAT)char_rect.top;
- }
- if (max_y < char_rect.top) {
- max_y = (FX_FLOAT)char_rect.top;
- }
- if (min_y > char_rect.bottom) {
- min_y = (FX_FLOAT)char_rect.bottom;
- }
- if (max_y < char_rect.bottom) {
- max_y = (FX_FLOAT)char_rect.bottom;
- }
- FX_FLOAT char_left = curpos + char_rect.left * fontsize / 1000;
- FX_FLOAT char_right = curpos + char_rect.right * fontsize / 1000;
- if (min_x > char_left) {
- min_x = char_left;
- }
- if (max_x < char_left) {
- max_x = char_left;
- }
- if (min_x > char_right) {
- min_x = char_right;
- }
- if (max_x < char_right) {
- max_x = char_right;
- }
- charwidth = pFont->GetCharWidthF(charcode, level) * fontsize / 1000;
- } else {
- FX_WORD CID = pCIDFont->CIDFromCharCode(charcode);
- short vx, vy;
- pCIDFont->GetVertOrigin(CID, vx, vy);
- char_rect.left -= vx;
- char_rect.right -= vx;
- char_rect.top -= vy;
- char_rect.bottom -= vy;
- if (min_x > char_rect.left) {
- min_x = (FX_FLOAT)char_rect.left;
- }
- if (max_x < char_rect.left) {
- max_x = (FX_FLOAT)char_rect.left;
- }
- if (min_x > char_rect.right) {
- min_x = (FX_FLOAT)char_rect.right;
- }
- if (max_x < char_rect.right) {
- max_x = (FX_FLOAT)char_rect.right;
- }
- FX_FLOAT char_top = curpos + char_rect.top * fontsize / 1000;
- FX_FLOAT char_bottom = curpos + char_rect.bottom * fontsize / 1000;
- if (min_y > char_top) {
- min_y = char_top;
- }
- if (max_y < char_top) {
- max_y = char_top;
- }
- if (min_y > char_bottom) {
- min_y = char_bottom;
- }
- if (max_y < char_bottom) {
- max_y = char_bottom;
- }
- charwidth = pCIDFont->GetVertWidth(CID) * fontsize / 1000;
- }
- curpos += charwidth;
- if (charcode == ' ' && (pCIDFont == NULL || pCIDFont->GetCharSize(32) == 1)) {
- curpos += m_TextState.GetObject()->m_WordSpace;
- }
- curpos += m_TextState.GetObject()->m_CharSpace;
- }
- if (bVertWriting) {
- if (pTextAdvanceX) {
- *pTextAdvanceX = 0;
- }
- if (pTextAdvanceY) {
- *pTextAdvanceY = curpos;
- }
- min_x = min_x * fontsize / 1000;
- max_x = max_x * fontsize / 1000;
- } else {
- if (pTextAdvanceX) {
- *pTextAdvanceX = FXSYS_Mul(curpos, horz_scale);
- }
- if (pTextAdvanceY) {
- *pTextAdvanceY = 0;
- }
- min_y = min_y * fontsize / 1000;
- max_y = max_y * fontsize / 1000;
- }
- CFX_AffineMatrix matrix;
- GetTextMatrix(&matrix);
- m_Left = min_x;
- m_Right = max_x;
- m_Bottom = min_y;
- m_Top = max_y;
- matrix.TransformRect(m_Left, m_Right, m_Top, m_Bottom);
- int textmode = m_TextState.GetObject()->m_TextMode;
- if (textmode == 1 || textmode == 2 || textmode == 5 || textmode == 6) {
- FX_FLOAT half_width = m_GraphState.GetObject()->m_LineWidth / 2;
- m_Left -= half_width;
- m_Right += half_width;
- m_Top += half_width;
- m_Bottom -= half_width;
- }
-}
-void CPDF_TextObject::CalcCharPos(FX_FLOAT* pPosArray) const
-{
- FX_FLOAT curpos = 0;
- int count = 0;
- CPDF_Font* pFont = m_TextState.GetFont();
- FX_BOOL bVertWriting = FALSE;
- CPDF_CIDFont* pCIDFont = pFont->GetCIDFont();
- if (pCIDFont) {
- bVertWriting = pCIDFont->IsVertWriting();
- }
- FX_FLOAT fontsize = m_TextState.GetFontSize();
- int index = 0;
- for (int i = 0; i < m_nChars; i ++) {
- FX_DWORD charcode = m_nChars == 1 ? (FX_DWORD)(FX_UINTPTR)m_pCharCodes : m_pCharCodes[i];
- if (charcode == (FX_DWORD) - 1) {
- continue;
- }
- pPosArray[index++] = i ? m_pCharPos[i - 1] : 0;
- FX_FLOAT charwidth;
- if (bVertWriting) {
- FX_WORD CID = pCIDFont->CIDFromCharCode(charcode);
- charwidth = pCIDFont->GetVertWidth(CID) * fontsize / 1000;
- } else {
- charwidth = pFont->GetCharWidthF(charcode) * fontsize / 1000;
- }
- pPosArray[index] = pPosArray[index - 1] + charwidth;
- index++;
- }
-}
-void CPDF_TextObject::Transform(const CFX_AffineMatrix& matrix)
-{
- m_TextState.GetModify();
- CFX_AffineMatrix text_matrix;
- GetTextMatrix(&text_matrix);
- text_matrix.Concat(matrix);
- FX_FLOAT* pTextMatrix = m_TextState.GetMatrix();
- pTextMatrix[0] = text_matrix.GetA();
- pTextMatrix[1] = text_matrix.GetC();
- pTextMatrix[2] = text_matrix.GetB();
- pTextMatrix[3] = text_matrix.GetD();
- m_PosX = text_matrix.GetE();
- m_PosY = text_matrix.GetF();
- CalcPositionData(NULL, NULL, 0);
-}
-void CPDF_TextObject::SetPosition(FX_FLOAT x, FX_FLOAT y)
-{
- FX_FLOAT dx = x - m_PosX;
- FX_FLOAT dy = y - m_PosY;
- m_PosX = x;
- m_PosY = y;
- m_Left += dx;
- m_Right += dx;
- m_Top += dy;
- m_Bottom += dy;
-}
-void CPDF_TextObject::SetData(int nChars, FX_DWORD* pCharCodes, FX_FLOAT* pCharPos, FX_FLOAT x, FX_FLOAT y)
-{
- ASSERT(m_nChars == 0);
- m_nChars = nChars;
- m_PosX = x;
- m_PosY = y;
- if (nChars == 0) {
- return;
- }
- if (nChars == 1) {
- m_pCharCodes = (FX_DWORD*)(FX_UINTPTR) * pCharCodes;
- } else {
- m_pCharCodes = FX_Alloc(FX_DWORD, nChars);
- FXSYS_memcpy32(m_pCharCodes, pCharCodes, sizeof(FX_DWORD)*nChars);
- m_pCharPos = FX_Alloc(FX_FLOAT, nChars - 1);
- FXSYS_memcpy32(m_pCharPos, pCharPos, sizeof(FX_FLOAT) * (nChars - 1));
- }
- RecalcPositionData();
-}
-void CPDF_TextObject::SetTextState(CPDF_TextState TextState)
-{
- m_TextState = TextState;
- CalcPositionData(NULL, NULL, 0);
-}
-CPDF_ShadingObject::CPDF_ShadingObject()
-{
- m_pShading = NULL;
- m_Type = PDFPAGE_SHADING;
-}
-CPDF_ShadingObject::~CPDF_ShadingObject()
-{
- CPDF_ShadingPattern* pShading = m_pShading;
- if (pShading && pShading->m_pDocument) {
- pShading->m_pDocument->GetPageData()->ReleasePattern(pShading->m_pShadingObj);
- }
-}
-void CPDF_ShadingObject::CopyData(const CPDF_PageObject* pSrc)
-{
- CPDF_ShadingObject* pSrcObj = (CPDF_ShadingObject*)pSrc;
- m_pShading = pSrcObj->m_pShading;
- if (m_pShading && m_pShading->m_pDocument) {
- CPDF_DocPageData* pDocPageData = m_pShading->m_pDocument->GetPageData();
- m_pShading = (CPDF_ShadingPattern*)pDocPageData->GetPattern(m_pShading->m_pShadingObj, m_pShading->m_bShadingObj, &m_pShading->m_ParentMatrix);
- }
- m_Matrix = pSrcObj->m_Matrix;
-}
-void CPDF_ShadingObject::Transform(const CFX_AffineMatrix& matrix)
-{
- if (!m_ClipPath.IsNull()) {
- m_ClipPath.GetModify();
- m_ClipPath.Transform(matrix);
- }
- m_Matrix.Concat(matrix);
- if (!m_ClipPath.IsNull()) {
- CalcBoundingBox();
- } else {
- matrix.TransformRect(m_Left, m_Right, m_Top, m_Bottom);
- }
-}
-void CPDF_ShadingObject::CalcBoundingBox()
-{
- if (m_ClipPath.IsNull()) {
- return;
- }
- CFX_FloatRect rect = m_ClipPath.GetClipBox();
- m_Left = rect.left;
- m_Bottom = rect.bottom;
- m_Right = rect.right;
- m_Top = rect.top;
-}
-CPDF_FormObject::~CPDF_FormObject()
-{
- if (m_pForm) {
- delete m_pForm;
- }
-}
-void CPDF_FormObject::Transform(const CFX_AffineMatrix& matrix)
-{
- m_FormMatrix.Concat(matrix);
- CalcBoundingBox();
-}
-void CPDF_FormObject::CopyData(const CPDF_PageObject* pSrc)
-{
- const CPDF_FormObject* pSrcObj = (const CPDF_FormObject*)pSrc;
- if (m_pForm) {
- delete m_pForm;
- }
- m_pForm = pSrcObj->m_pForm->Clone();
- m_FormMatrix = pSrcObj->m_FormMatrix;
-}
-void CPDF_FormObject::CalcBoundingBox()
-{
- CFX_FloatRect form_rect = m_pForm->CalcBoundingBox();
- form_rect.Transform(&m_FormMatrix);
- m_Left = form_rect.left;
- m_Bottom = form_rect.bottom;
- m_Right = form_rect.right;
- m_Top = form_rect.top;
-}
-CPDF_PageObjects::CPDF_PageObjects(FX_BOOL bReleaseMembers) : m_ObjectList(128)
-{
- m_bBackgroundAlphaNeeded = FALSE;
- m_bReleaseMembers = bReleaseMembers;
- m_ParseState = PDF_CONTENT_NOT_PARSED;
- m_pParser = NULL;
- m_pFormStream = NULL;
- m_pResources = NULL;
-}
-CPDF_PageObjects::~CPDF_PageObjects()
-{
- if (m_pParser) {
- delete m_pParser;
- }
- if (!m_bReleaseMembers) {
- return;
- }
- FX_POSITION pos = m_ObjectList.GetHeadPosition();
- while (pos) {
- CPDF_PageObject* pPageObj = (CPDF_PageObject*)m_ObjectList.GetNext(pos);
- if (!pPageObj) {
- continue;
- }
- pPageObj->Release();
- }
-}
-void CPDF_PageObjects::ContinueParse(IFX_Pause* pPause)
-{
- if (m_pParser == NULL) {
- return;
- }
- m_pParser->Continue(pPause);
- if (m_pParser->GetStatus() == CPDF_ContentParser::Done) {
- m_ParseState = PDF_CONTENT_PARSED;
- delete m_pParser;
- m_pParser = NULL;
- }
-}
-int CPDF_PageObjects::EstimateParseProgress() const
-{
- if (m_pParser == NULL) {
- return m_ParseState == PDF_CONTENT_PARSED ? 100 : 0;
- }
- return m_pParser->EstimateProgress();
-}
-FX_POSITION CPDF_PageObjects::InsertObject(FX_POSITION posInsertAfter, CPDF_PageObject* pNewObject)
-{
- if (posInsertAfter == NULL) {
- return m_ObjectList.AddHead(pNewObject);
- } else {
- return m_ObjectList.InsertAfter(posInsertAfter, pNewObject);
- }
-}
-int CPDF_PageObjects::GetObjectIndex(CPDF_PageObject* pObj) const
-{
- int index = 0;
- FX_POSITION pos = m_ObjectList.GetHeadPosition();
- while (pos) {
- CPDF_PageObject* pThisObj = (CPDF_PageObject*)m_ObjectList.GetNext(pos);
- if (pThisObj == pObj) {
- return index;
- }
- index ++;
- }
- return -1;
-}
-CPDF_PageObject* CPDF_PageObjects::GetObjectByIndex(int index) const
-{
- FX_POSITION pos = m_ObjectList.FindIndex(index);
- if (pos == NULL) {
- return NULL;
- }
- return (CPDF_PageObject*)m_ObjectList.GetAt(pos);
-}
-void CPDF_PageObjects::Transform(const CFX_AffineMatrix& matrix)
-{
- FX_POSITION pos = m_ObjectList.GetHeadPosition();
- while (pos) {
- CPDF_PageObject* pObj = (CPDF_PageObject*)m_ObjectList.GetNext(pos);
- pObj->Transform(matrix);
- }
-}
-CFX_FloatRect CPDF_PageObjects::CalcBoundingBox() const
-{
- if (m_ObjectList.GetCount() == 0) {
- return CFX_FloatRect(0, 0, 0, 0);
- }
- FX_FLOAT left, right, top, bottom;
- left = bottom = 1000000 * 1.0f;
- right = top = -1000000 * 1.0f;
- FX_POSITION pos = m_ObjectList.GetHeadPosition();
- while (pos) {
- CPDF_PageObject* pObj = (CPDF_PageObject*)m_ObjectList.GetNext(pos);
- if (left > pObj->m_Left) {
- left = pObj->m_Left;
- }
- if (right < pObj->m_Right) {
- right = pObj->m_Right;
- }
- if (top < pObj->m_Top) {
- top = pObj->m_Top;
- }
- if (bottom > pObj->m_Bottom) {
- bottom = pObj->m_Bottom;
- }
- }
- return CFX_FloatRect(left, bottom, right, top);
-}
-void CPDF_PageObjects::LoadTransInfo()
-{
- if (m_pFormDict == NULL) {
- return;
- }
- CPDF_Dictionary* pGroup = m_pFormDict->GetDict(FX_BSTRC("Group"));
- if (pGroup == NULL) {
- return;
- }
- if (pGroup->GetString(FX_BSTRC("S")) != FX_BSTRC("Transparency")) {
- return;
- }
- m_Transparency |= PDFTRANS_GROUP;
- if (pGroup->GetInteger(FX_BSTRC("I"))) {
- m_Transparency |= PDFTRANS_ISOLATED;
- }
- if (pGroup->GetInteger(FX_BSTRC("K"))) {
- m_Transparency |= PDFTRANS_KNOCKOUT;
- }
-}
-void CPDF_PageObjects::ClearCacheObjects()
-{
- m_ParseState = PDF_CONTENT_NOT_PARSED;
- if (m_pParser) {
- delete m_pParser;
- }
- m_pParser = NULL;
- if (m_bReleaseMembers) {
- FX_POSITION pos = m_ObjectList.GetHeadPosition();
- while (pos) {
- CPDF_PageObject* pPageObj = (CPDF_PageObject*)m_ObjectList.GetNext(pos);
- if (!pPageObj) {
- continue;
- }
- pPageObj->Release();
- }
- }
- m_ObjectList.RemoveAll();
-}
-CPDF_Page::CPDF_Page()
-{
- m_pPageRender = NULL;
-}
-void CPDF_Page::Load(CPDF_Document* pDocument, CPDF_Dictionary* pPageDict, FX_BOOL bPageCache)
-{
- m_pDocument = (CPDF_Document*)pDocument;
- m_pFormDict = pPageDict;
- if (bPageCache) {
- m_pPageRender = CPDF_ModuleMgr::Get()->GetRenderModule()->CreatePageCache(this);
- }
- if (pPageDict == NULL) {
- m_PageWidth = m_PageHeight = 100 * 1.0f;
- m_pPageResources = m_pResources = NULL;
- return;
- }
- m_pResources = GetPageAttr(FX_BSTRC("Resources"))->GetDict();
- m_pPageResources = m_pResources;
- CPDF_Object* pRotate = GetPageAttr(FX_BSTRC("Rotate"));
- int rotate = 0;
- if (pRotate) {
- rotate = pRotate->GetInteger() / 90 % 4;
- }
- if (rotate < 0) {
- rotate += 4;
- }
- CPDF_Array* pMediaBox, *pCropBox;
- pMediaBox = (CPDF_Array*)GetPageAttr(FX_BSTRC("MediaBox"));
- CFX_FloatRect mediabox;
- if (pMediaBox) {
- mediabox = pMediaBox->GetRect();
- mediabox.Normalize();
- }
- if (mediabox.IsEmpty()) {
- mediabox = CFX_FloatRect(0, 0, 612, 792);
- }
- pCropBox = (CPDF_Array*)GetPageAttr(FX_BSTRC("CropBox"));
- if (pCropBox) {
- m_BBox = pCropBox->GetRect();
- m_BBox.Normalize();
- }
- if (m_BBox.IsEmpty()) {
- m_BBox = mediabox;
- } else {
- m_BBox.Intersect(mediabox);
- }
- if (rotate % 2) {
- m_PageHeight = m_BBox.right - m_BBox.left;
- m_PageWidth = m_BBox.top - m_BBox.bottom;
- } else {
- m_PageWidth = m_BBox.right - m_BBox.left;
- m_PageHeight = m_BBox.top - m_BBox.bottom;
- }
- switch (rotate) {
- case 0:
- m_PageMatrix.Set(1.0f, 0, 0, 1.0f, -m_BBox.left, -m_BBox.bottom);
- break;
- case 1:
- m_PageMatrix.Set(0, -1.0f, 1.0f, 0, -m_BBox.bottom, m_BBox.right);
- break;
- case 2:
- m_PageMatrix.Set(-1.0f, 0, 0, -1.0f, m_BBox.right, m_BBox.top);
- break;
- case 3:
- m_PageMatrix.Set(0, 1.0f, -1.0f, 0, m_BBox.top, -m_BBox.left);
- break;
- }
- m_Transparency = PDFTRANS_ISOLATED;
- LoadTransInfo();
-}
-void CPDF_Page::StartParse(CPDF_ParseOptions* pOptions, FX_BOOL bReParse)
-{
- if (bReParse) {
- ClearCacheObjects();
- }
- if (m_ParseState == PDF_CONTENT_PARSED || m_ParseState == PDF_CONTENT_PARSING) {
- return;
- }
- m_pParser = FX_NEW CPDF_ContentParser;
- m_pParser->Start(this, pOptions);
- m_ParseState = PDF_CONTENT_PARSING;
-}
-void CPDF_Page::ParseContent(CPDF_ParseOptions* pOptions, FX_BOOL bReParse)
-{
- StartParse(pOptions, bReParse);
- ContinueParse(NULL);
-}
-CPDF_Page::~CPDF_Page()
-{
- if (m_pPageRender) {
- CPDF_RenderModuleDef* pModule = CPDF_ModuleMgr::Get()->GetRenderModule();
- pModule->DestroyPageCache(m_pPageRender);
- }
-}
-CPDF_Object* FPDFAPI_GetPageAttr(CPDF_Dictionary* pPageDict, FX_BSTR name)
-{
- int level = 0;
- while (1) {
- CPDF_Object* pObj = pPageDict->GetElementValue(name);
- if (pObj) {
- return pObj;
- }
- CPDF_Dictionary* pParent = pPageDict->GetDict(FX_BSTRC("Parent"));
- if (!pParent || pParent == pPageDict) {
- return NULL;
- }
- pPageDict = pParent;
- level ++;
- if (level == 1000) {
- return NULL;
- }
- }
-}
-CPDF_Object* CPDF_Page::GetPageAttr(FX_BSTR name) const
-{
- return FPDFAPI_GetPageAttr(m_pFormDict, name);
-}
-CPDF_Form::CPDF_Form(CPDF_Document* pDoc, CPDF_Dictionary* pPageResources, CPDF_Stream* pFormStream, CPDF_Dictionary* pParentResources)
-{
- m_pDocument = pDoc;
- m_pFormStream = pFormStream;
- m_pFormDict = pFormStream->GetDict();
- m_pResources = m_pFormDict->GetDict(FX_BSTRC("Resources"));
- m_pPageResources = pPageResources;
- if (m_pResources == NULL) {
- m_pResources = pParentResources;
- }
- if (m_pResources == NULL) {
- m_pResources = pPageResources;
- }
- m_Transparency = 0;
- LoadTransInfo();
-}
-CPDF_Form::~CPDF_Form()
-{
-}
-void CPDF_Form::StartParse(CPDF_AllStates* pGraphicStates, CFX_AffineMatrix* pParentMatrix,
- CPDF_Type3Char* pType3Char, CPDF_ParseOptions* pOptions, int level)
-{
- if (m_ParseState == PDF_CONTENT_PARSED || m_ParseState == PDF_CONTENT_PARSING) {
- return;
- }
- m_pParser = FX_NEW CPDF_ContentParser;
- m_pParser->Start(this, pGraphicStates, pParentMatrix, pType3Char, pOptions, level);
- m_ParseState = PDF_CONTENT_PARSING;
-}
-void CPDF_Form::ParseContent(CPDF_AllStates* pGraphicStates, CFX_AffineMatrix* pParentMatrix,
- CPDF_Type3Char* pType3Char, CPDF_ParseOptions* pOptions, int level)
-{
- StartParse(pGraphicStates, pParentMatrix, pType3Char, pOptions, level);
- ContinueParse(NULL);
-}
-CPDF_Form* CPDF_Form::Clone() const
-{
- CPDF_Form* pClone = FX_NEW CPDF_Form(m_pDocument, m_pPageResources, m_pFormStream, m_pResources);
- FX_POSITION pos = m_ObjectList.GetHeadPosition();
- while (pos) {
- CPDF_PageObject* pObj = (CPDF_PageObject*)m_ObjectList.GetNext(pos);
- pClone->m_ObjectList.AddTail(pObj->Clone());
- }
- return pClone;
-}
-void CPDF_Page::GetDisplayMatrix(CFX_AffineMatrix& matrix, int xPos, int yPos,
- int xSize, int ySize, int iRotate) const
-{
- if (m_PageWidth == 0 || m_PageHeight == 0) {
- return;
- }
- CFX_AffineMatrix display_matrix;
- int x0, y0, x1, y1, x2, y2;
- iRotate %= 4;
- switch (iRotate) {
- case 0:
- x0 = xPos;
- y0 = yPos + ySize;
- x1 = xPos;
- y1 = yPos;
- x2 = xPos + xSize;
- y2 = yPos + ySize;
- break;
- case 1:
- x0 = xPos;
- y0 = yPos;
- x1 = xPos + xSize;
- y1 = yPos;
- x2 = xPos;
- y2 = yPos + ySize;
- break;
- case 2:
- x0 = xPos + xSize;
- y0 = yPos;
- x1 = xPos + xSize;
- y1 = yPos + ySize;
- x2 = xPos;
- y2 = yPos;
- break;
- case 3:
- x0 = xPos + xSize;
- y0 = yPos + ySize;
- x1 = xPos;
- y1 = yPos + ySize;
- x2 = xPos + xSize;
- y2 = yPos;
- break;
- }
- display_matrix.Set(FXSYS_Div((FX_FLOAT)(x2 - x0), m_PageWidth),
- FXSYS_Div((FX_FLOAT)(y2 - y0), m_PageWidth),
- FXSYS_Div((FX_FLOAT)(x1 - x0), m_PageHeight),
- FXSYS_Div((FX_FLOAT)(y1 - y0), m_PageHeight),
- (FX_FLOAT)x0, (FX_FLOAT)y0);
- matrix = m_PageMatrix;
- matrix.Concat(display_matrix);
-}
-CPDF_ParseOptions::CPDF_ParseOptions()
-{
- m_bTextOnly = FALSE;
- m_bMarkedContent = TRUE;
- m_bSeparateForm = TRUE;
- m_bDecodeInlineImage = FALSE;
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fpdfapi/fpdf_page.h"
+#include "../../../include/fpdfapi/fpdf_module.h"
+#include "pageint.h"
+void CPDF_PageObject::Release()
+{
+ delete this;
+}
+CPDF_PageObject* CPDF_PageObject::Create(int type)
+{
+ switch (type) {
+ case PDFPAGE_TEXT:
+ return FX_NEW CPDF_TextObject;
+ case PDFPAGE_IMAGE:
+ return FX_NEW CPDF_ImageObject;
+ case PDFPAGE_PATH:
+ return FX_NEW CPDF_PathObject;
+ case PDFPAGE_SHADING:
+ return FX_NEW CPDF_ShadingObject;
+ case PDFPAGE_FORM:
+ return FX_NEW CPDF_FormObject;
+ }
+ return NULL;
+}
+CPDF_PageObject* CPDF_PageObject::Clone() const
+{
+ CPDF_PageObject* pObj = Create(m_Type);
+ pObj->Copy(this);
+ return pObj;
+}
+void CPDF_PageObject::Copy(const CPDF_PageObject* pSrc)
+{
+ if (m_Type != pSrc->m_Type) {
+ return;
+ }
+ CopyData(pSrc);
+ CopyStates(*pSrc);
+ m_Left = pSrc->m_Left;
+ m_Right = pSrc->m_Right;
+ m_Top = pSrc->m_Top;
+ m_Bottom = pSrc->m_Bottom;
+}
+void CPDF_PageObject::AppendClipPath(CPDF_Path path, int type, FX_BOOL bAutoMerge)
+{
+ m_ClipPath.AppendPath(path, type, bAutoMerge);
+}
+void CPDF_PageObject::CopyClipPath(CPDF_PageObject* pObj)
+{
+ m_ClipPath = pObj->m_ClipPath;
+}
+void CPDF_PageObject::RemoveClipPath()
+{
+ m_ClipPath.SetNull();
+}
+void CPDF_PageObject::RecalcBBox()
+{
+ switch (m_Type) {
+ case PDFPAGE_TEXT:
+ ((CPDF_TextObject*)this)->RecalcPositionData();
+ break;
+ case PDFPAGE_PATH:
+ ((CPDF_PathObject*)this)->CalcBoundingBox();
+ break;
+ case PDFPAGE_SHADING:
+ ((CPDF_ShadingObject*)this)->CalcBoundingBox();
+ break;
+ }
+}
+void CPDF_PageObject::TransformClipPath(CFX_AffineMatrix& matrix)
+{
+ if (m_ClipPath.IsNull()) {
+ return;
+ }
+ m_ClipPath.GetModify();
+ m_ClipPath.Transform(matrix);
+}
+void CPDF_PageObject::TransformGeneralState(CFX_AffineMatrix& matrix)
+{
+ if(m_GeneralState.IsNull()) {
+ return;
+ }
+ CPDF_GeneralStateData* pGS = m_GeneralState.GetModify();
+ pGS->m_Matrix.Concat(matrix);
+}
+FX_RECT CPDF_PageObject::GetBBox(const CFX_AffineMatrix* pMatrix) const
+{
+ CFX_FloatRect rect(m_Left, m_Bottom, m_Right, m_Top);
+ if (pMatrix) {
+ pMatrix->TransformRect(rect);
+ }
+ return rect.GetOutterRect();
+}
+CPDF_TextObject::CPDF_TextObject()
+{
+ m_Type = PDFPAGE_TEXT;
+ m_pCharCodes = NULL;
+ m_pCharPos = NULL;
+ m_nChars = 0;
+ m_PosX = m_PosY = 0;
+}
+CPDF_TextObject::~CPDF_TextObject()
+{
+ if (m_nChars > 1 && m_pCharCodes) {
+ FX_Free(m_pCharCodes);
+ }
+ if (m_pCharPos) {
+ FX_Free(m_pCharPos);
+ }
+}
+void CPDF_TextObject::GetItemInfo(int index, CPDF_TextObjectItem* pInfo) const
+{
+ pInfo->m_CharCode = m_nChars == 1 ? (FX_DWORD)(FX_UINTPTR)m_pCharCodes : m_pCharCodes[index];
+ pInfo->m_OriginX = index ? m_pCharPos[index - 1] : 0;
+ pInfo->m_OriginY = 0;
+ if (pInfo->m_CharCode == -1) {
+ return;
+ }
+ CPDF_Font* pFont = m_TextState.GetFont();
+ if (pFont->GetFontType() != PDFFONT_CIDFONT) {
+ return;
+ }
+ if (!((CPDF_CIDFont*)pFont)->IsVertWriting()) {
+ return;
+ }
+ FX_WORD CID = ((CPDF_CIDFont*)pFont)->CIDFromCharCode(pInfo->m_CharCode);
+ pInfo->m_OriginY = pInfo->m_OriginX;
+ pInfo->m_OriginX = 0;
+ short vx, vy;
+ ((CPDF_CIDFont*)pFont)->GetVertOrigin(CID, vx, vy);
+ FX_FLOAT fontsize = m_TextState.GetFontSize();
+ pInfo->m_OriginX -= fontsize * vx / 1000;
+ pInfo->m_OriginY -= fontsize * vy / 1000;
+}
+int CPDF_TextObject::CountChars() const
+{
+ if (m_nChars == 1) {
+ return 1;
+ }
+ int count = 0;
+ for (int i = 0; i < m_nChars; i ++)
+ if (m_pCharCodes[i] != (FX_DWORD) - 1) {
+ count ++;
+ }
+ return count;
+}
+void CPDF_TextObject::GetCharInfo(int index, FX_DWORD& charcode, FX_FLOAT& kerning) const
+{
+ if (m_nChars == 1) {
+ charcode = (FX_DWORD)(FX_UINTPTR)m_pCharCodes;
+ kerning = 0;
+ return;
+ }
+ int count = 0;
+ for (int i = 0; i < m_nChars; i ++) {
+ if (m_pCharCodes[i] != (FX_DWORD) - 1) {
+ if (count == index) {
+ charcode = m_pCharCodes[i];
+ if (i == m_nChars - 1 || m_pCharCodes[i + 1] != (FX_DWORD) - 1) {
+ kerning = 0;
+ } else {
+ kerning = m_pCharPos[i];
+ }
+ return;
+ }
+ count ++;
+ }
+ }
+}
+void CPDF_TextObject::GetCharInfo(int index, CPDF_TextObjectItem* pInfo) const
+{
+ if (m_nChars == 1) {
+ GetItemInfo(0, pInfo);
+ return;
+ }
+ int count = 0;
+ for (int i = 0; i < m_nChars; i ++) {
+ FX_DWORD charcode = m_pCharCodes[i];
+ if (charcode == (FX_DWORD) - 1) {
+ continue;
+ }
+ if (count == index) {
+ GetItemInfo(i, pInfo);
+ break;
+ }
+ count ++;
+ }
+}
+void CPDF_TextObject::CopyData(const CPDF_PageObject* pSrc)
+{
+ const CPDF_TextObject* pSrcObj = (const CPDF_TextObject*)pSrc;
+ if (m_nChars > 1 && m_pCharCodes) {
+ FX_Free(m_pCharCodes);
+ m_pCharCodes = NULL;
+ }
+ if (m_pCharPos) {
+ FX_Free(m_pCharPos);
+ m_pCharPos = NULL;
+ }
+ m_nChars = pSrcObj->m_nChars;
+ if (m_nChars > 1) {
+ m_pCharCodes = FX_Alloc(FX_DWORD, m_nChars);
+ m_pCharPos = FX_Alloc(FX_FLOAT, m_nChars - 1);
+ int i;
+ for (i = 0; i < m_nChars; i ++) {
+ m_pCharCodes[i] = pSrcObj->m_pCharCodes[i];
+ }
+ for (i = 0; i < m_nChars - 1; i ++) {
+ m_pCharPos[i] = pSrcObj->m_pCharPos[i];
+ }
+ } else {
+ m_pCharCodes = pSrcObj->m_pCharCodes;
+ }
+ m_PosX = pSrcObj->m_PosX;
+ m_PosY = pSrcObj->m_PosY;
+}
+void CPDF_TextObject::GetTextMatrix(CFX_AffineMatrix* pMatrix) const
+{
+ FX_FLOAT* pTextMatrix = m_TextState.GetMatrix();
+ pMatrix->Set(pTextMatrix[0], pTextMatrix[2], pTextMatrix[1], pTextMatrix[3], m_PosX, m_PosY);
+}
+void CPDF_TextObject::SetSegments(const CFX_ByteString* pStrs, FX_FLOAT* pKerning, int nsegs)
+{
+ if (m_nChars > 1 && m_pCharCodes) {
+ FX_Free(m_pCharCodes);
+ m_pCharCodes = NULL;
+ }
+ if (m_pCharPos) {
+ FX_Free(m_pCharPos);
+ m_pCharPos = NULL;
+ }
+ CPDF_Font* pFont = m_TextState.GetFont();
+ m_nChars = 0;
+ for (int i = 0; i < nsegs; i ++) {
+ m_nChars += pFont->CountChar(pStrs[i], pStrs[i].GetLength());
+ }
+ m_nChars += nsegs - 1;
+ if (m_nChars > 1) {
+ m_pCharCodes = FX_Alloc(FX_DWORD, m_nChars);
+ m_pCharPos = FX_Alloc(FX_FLOAT, m_nChars - 1);
+ int index = 0;
+ for (int i = 0; i < nsegs; i ++) {
+ FX_LPCSTR segment = pStrs[i];
+ int offset = 0, len = pStrs[i].GetLength();
+ while (offset < len) {
+ m_pCharCodes[index++] = pFont->GetNextChar(segment, offset);
+ }
+ if (i != nsegs - 1) {
+ m_pCharPos[index - 1] = pKerning[i];
+ m_pCharCodes[index ++] = (FX_DWORD) - 1;
+ }
+ }
+ } else {
+ int offset = 0;
+ m_pCharCodes = (FX_DWORD*)(FX_UINTPTR)pFont->GetNextChar(pStrs[0], offset);
+ }
+}
+void CPDF_TextObject::SetText(const CFX_ByteString& str)
+{
+ SetSegments(&str, NULL, 1);
+ RecalcPositionData();
+}
+void CPDF_TextObject::SetEmpty()
+{
+ if (m_nChars > 1 && m_pCharCodes) {
+ FX_Free(m_pCharCodes);
+ }
+ if (m_nChars > 1 && m_pCharPos) {
+ FX_Free(m_pCharPos);
+ }
+ m_nChars = 0;
+ m_pCharCodes = NULL;
+ m_pCharPos = NULL;
+ m_Left = m_Right = m_PosX;
+ m_Top = m_Bottom = m_PosY;
+}
+void CPDF_TextObject::SetText(CFX_ByteString* pStrs, FX_FLOAT* pKerning, int nSegs)
+{
+ SetSegments(pStrs, pKerning, nSegs);
+ RecalcPositionData();
+}
+void CPDF_TextObject::SetText(int nChars, FX_DWORD* pCharCodes, FX_FLOAT* pKernings)
+{
+ if (m_nChars > 1 && m_pCharCodes) {
+ FX_Free(m_pCharCodes);
+ m_pCharCodes = NULL;
+ }
+ if (m_pCharPos) {
+ FX_Free(m_pCharPos);
+ m_pCharPos = NULL;
+ }
+ int nKernings = 0;
+ int i;
+ for (i = 0; i < nChars - 1; i ++)
+ if (pKernings[i] != 0) {
+ nKernings ++;
+ }
+ m_nChars = nChars + nKernings;
+ if (m_nChars > 1) {
+ m_pCharCodes = FX_Alloc(FX_DWORD, m_nChars);
+ m_pCharPos = FX_Alloc(FX_FLOAT, m_nChars - 1);
+ int index = 0;
+ for (int i = 0; i < nChars; i ++) {
+ m_pCharCodes[index++] = pCharCodes[i];
+ if (pKernings[i] != 0 && i != nChars - 1) {
+ m_pCharCodes[index] = (FX_DWORD) - 1;
+ m_pCharPos[index - 1] = pKernings[i];
+ index ++;
+ }
+ }
+ } else {
+ int offset = 0;
+ m_pCharCodes = (FX_DWORD*)(FX_UINTPTR)pCharCodes[0];
+ }
+ RecalcPositionData();
+}
+FX_FLOAT CPDF_TextObject::GetCharWidth(FX_DWORD charcode) const
+{
+ FX_FLOAT fontsize = m_TextState.GetFontSize() / 1000;
+ CPDF_Font* pFont = m_TextState.GetFont();
+ FX_BOOL bVertWriting = FALSE;
+ CPDF_CIDFont* pCIDFont = pFont->GetCIDFont();
+ if (pCIDFont) {
+ bVertWriting = pCIDFont->IsVertWriting();
+ }
+ if (!bVertWriting) {
+ return pFont->GetCharWidthF(charcode, 0) * fontsize;
+ } else {
+ FX_WORD CID = pCIDFont->CIDFromCharCode(charcode);
+ return pCIDFont->GetVertWidth(CID) * fontsize;
+ }
+}
+FX_FLOAT CPDF_TextObject::GetSpaceCharWidth() const
+{
+ CPDF_Font* pFont = m_TextState.GetFont();
+ FX_DWORD charCode = m_TextState.GetFont()->CharCodeFromUnicode(32);
+ if (charCode != (FX_DWORD) - 1) {
+ return GetCharWidth(charCode);
+ }
+ FX_FLOAT fontSize = m_TextState.GetFontSize() / 4000.0f;
+ FX_BOOL bVertWriting = FALSE;
+ CPDF_CIDFont* pCIDFont = pFont->GetCIDFont();
+ if (pCIDFont) {
+ bVertWriting = pCIDFont->IsVertWriting();
+ }
+ FX_RECT fontRect;
+ pFont->GetFontBBox(fontRect);
+ fontSize *= bVertWriting ? (FX_FLOAT)fontRect.Height() : (FX_FLOAT)fontRect.Width();
+ return fontSize;
+}
+void CPDF_TextObject::GetCharRect(int index, CFX_FloatRect& rect) const
+{
+ FX_FLOAT curpos = 0;
+ CPDF_Font* pFont = m_TextState.GetFont();
+ FX_BOOL bVertWriting = FALSE;
+ CPDF_CIDFont* pCIDFont = pFont->GetCIDFont();
+ if (pCIDFont) {
+ bVertWriting = pCIDFont->IsVertWriting();
+ }
+ FX_FLOAT fontsize = m_TextState.GetFontSize() / 1000;
+ int count = 0;
+ for (int i = 0; i < m_nChars; i ++) {
+ FX_DWORD charcode = m_nChars == 1 ? (FX_DWORD)(FX_UINTPTR)m_pCharCodes : m_pCharCodes[i];
+ if (charcode == (FX_DWORD) - 1) {
+ continue;
+ }
+ if( count != index) {
+ count++;
+ continue;
+ }
+ FX_FLOAT curpos = i > 0 ? m_pCharPos[i - 1] : 0;
+ FX_RECT char_rect;
+ pFont->GetCharBBox(charcode, char_rect, 0);
+ if (!bVertWriting) {
+ rect.left = curpos + char_rect.left * fontsize;
+ rect.right = curpos + char_rect.right * fontsize;
+ rect.top = char_rect.top * fontsize;
+ rect.bottom = char_rect.bottom * fontsize;
+ } else {
+ FX_WORD CID = pCIDFont->CIDFromCharCode(charcode);
+ short vx, vy;
+ pCIDFont->GetVertOrigin(CID, vx, vy);
+ char_rect.left -= vx;
+ char_rect.right -= vx;
+ char_rect.top -= vy;
+ char_rect.bottom -= vy;
+ rect.left = char_rect.left * fontsize;
+ rect.right = char_rect.right * fontsize;
+ rect.top = curpos + char_rect.top * fontsize;
+ rect.bottom = curpos + char_rect.bottom * fontsize;
+ }
+ return;
+ }
+}
+void CPDF_TextObject::CalcPositionData(FX_FLOAT* pTextAdvanceX, FX_FLOAT* pTextAdvanceY, FX_FLOAT horz_scale, int level)
+{
+ FX_FLOAT curpos = 0;
+ FX_FLOAT min_x = 10000 * 1.0f, max_x = -10000 * 1.0f, min_y = 10000 * 1.0f, max_y = -10000 * 1.0f;
+ CPDF_Font* pFont = m_TextState.GetFont();
+ FX_BOOL bVertWriting = FALSE;
+ CPDF_CIDFont* pCIDFont = pFont->GetCIDFont();
+ if (pCIDFont) {
+ bVertWriting = pCIDFont->IsVertWriting();
+ }
+ FX_FLOAT fontsize = m_TextState.GetFontSize();
+ for (int i = 0; i < m_nChars; i ++) {
+ FX_DWORD charcode = m_nChars == 1 ? (FX_DWORD)(FX_UINTPTR)m_pCharCodes : m_pCharCodes[i];
+ if (charcode == (FX_DWORD) - 1) {
+ curpos -= FXSYS_Mul(m_pCharPos[i - 1], fontsize) / 1000;
+ continue;
+ }
+ if (i) {
+ m_pCharPos[i - 1] = curpos;
+ }
+ FX_RECT char_rect;
+ pFont->GetCharBBox(charcode, char_rect, level);
+ FX_FLOAT charwidth;
+ if (!bVertWriting) {
+ if (min_y > char_rect.top) {
+ min_y = (FX_FLOAT)char_rect.top;
+ }
+ if (max_y < char_rect.top) {
+ max_y = (FX_FLOAT)char_rect.top;
+ }
+ if (min_y > char_rect.bottom) {
+ min_y = (FX_FLOAT)char_rect.bottom;
+ }
+ if (max_y < char_rect.bottom) {
+ max_y = (FX_FLOAT)char_rect.bottom;
+ }
+ FX_FLOAT char_left = curpos + char_rect.left * fontsize / 1000;
+ FX_FLOAT char_right = curpos + char_rect.right * fontsize / 1000;
+ if (min_x > char_left) {
+ min_x = char_left;
+ }
+ if (max_x < char_left) {
+ max_x = char_left;
+ }
+ if (min_x > char_right) {
+ min_x = char_right;
+ }
+ if (max_x < char_right) {
+ max_x = char_right;
+ }
+ charwidth = pFont->GetCharWidthF(charcode, level) * fontsize / 1000;
+ } else {
+ FX_WORD CID = pCIDFont->CIDFromCharCode(charcode);
+ short vx, vy;
+ pCIDFont->GetVertOrigin(CID, vx, vy);
+ char_rect.left -= vx;
+ char_rect.right -= vx;
+ char_rect.top -= vy;
+ char_rect.bottom -= vy;
+ if (min_x > char_rect.left) {
+ min_x = (FX_FLOAT)char_rect.left;
+ }
+ if (max_x < char_rect.left) {
+ max_x = (FX_FLOAT)char_rect.left;
+ }
+ if (min_x > char_rect.right) {
+ min_x = (FX_FLOAT)char_rect.right;
+ }
+ if (max_x < char_rect.right) {
+ max_x = (FX_FLOAT)char_rect.right;
+ }
+ FX_FLOAT char_top = curpos + char_rect.top * fontsize / 1000;
+ FX_FLOAT char_bottom = curpos + char_rect.bottom * fontsize / 1000;
+ if (min_y > char_top) {
+ min_y = char_top;
+ }
+ if (max_y < char_top) {
+ max_y = char_top;
+ }
+ if (min_y > char_bottom) {
+ min_y = char_bottom;
+ }
+ if (max_y < char_bottom) {
+ max_y = char_bottom;
+ }
+ charwidth = pCIDFont->GetVertWidth(CID) * fontsize / 1000;
+ }
+ curpos += charwidth;
+ if (charcode == ' ' && (pCIDFont == NULL || pCIDFont->GetCharSize(32) == 1)) {
+ curpos += m_TextState.GetObject()->m_WordSpace;
+ }
+ curpos += m_TextState.GetObject()->m_CharSpace;
+ }
+ if (bVertWriting) {
+ if (pTextAdvanceX) {
+ *pTextAdvanceX = 0;
+ }
+ if (pTextAdvanceY) {
+ *pTextAdvanceY = curpos;
+ }
+ min_x = min_x * fontsize / 1000;
+ max_x = max_x * fontsize / 1000;
+ } else {
+ if (pTextAdvanceX) {
+ *pTextAdvanceX = FXSYS_Mul(curpos, horz_scale);
+ }
+ if (pTextAdvanceY) {
+ *pTextAdvanceY = 0;
+ }
+ min_y = min_y * fontsize / 1000;
+ max_y = max_y * fontsize / 1000;
+ }
+ CFX_AffineMatrix matrix;
+ GetTextMatrix(&matrix);
+ m_Left = min_x;
+ m_Right = max_x;
+ m_Bottom = min_y;
+ m_Top = max_y;
+ matrix.TransformRect(m_Left, m_Right, m_Top, m_Bottom);
+ int textmode = m_TextState.GetObject()->m_TextMode;
+ if (textmode == 1 || textmode == 2 || textmode == 5 || textmode == 6) {
+ FX_FLOAT half_width = m_GraphState.GetObject()->m_LineWidth / 2;
+ m_Left -= half_width;
+ m_Right += half_width;
+ m_Top += half_width;
+ m_Bottom -= half_width;
+ }
+}
+void CPDF_TextObject::CalcCharPos(FX_FLOAT* pPosArray) const
+{
+ FX_FLOAT curpos = 0;
+ int count = 0;
+ CPDF_Font* pFont = m_TextState.GetFont();
+ FX_BOOL bVertWriting = FALSE;
+ CPDF_CIDFont* pCIDFont = pFont->GetCIDFont();
+ if (pCIDFont) {
+ bVertWriting = pCIDFont->IsVertWriting();
+ }
+ FX_FLOAT fontsize = m_TextState.GetFontSize();
+ int index = 0;
+ for (int i = 0; i < m_nChars; i ++) {
+ FX_DWORD charcode = m_nChars == 1 ? (FX_DWORD)(FX_UINTPTR)m_pCharCodes : m_pCharCodes[i];
+ if (charcode == (FX_DWORD) - 1) {
+ continue;
+ }
+ pPosArray[index++] = i ? m_pCharPos[i - 1] : 0;
+ FX_FLOAT charwidth;
+ if (bVertWriting) {
+ FX_WORD CID = pCIDFont->CIDFromCharCode(charcode);
+ charwidth = pCIDFont->GetVertWidth(CID) * fontsize / 1000;
+ } else {
+ charwidth = pFont->GetCharWidthF(charcode) * fontsize / 1000;
+ }
+ pPosArray[index] = pPosArray[index - 1] + charwidth;
+ index++;
+ }
+}
+void CPDF_TextObject::Transform(const CFX_AffineMatrix& matrix)
+{
+ m_TextState.GetModify();
+ CFX_AffineMatrix text_matrix;
+ GetTextMatrix(&text_matrix);
+ text_matrix.Concat(matrix);
+ FX_FLOAT* pTextMatrix = m_TextState.GetMatrix();
+ pTextMatrix[0] = text_matrix.GetA();
+ pTextMatrix[1] = text_matrix.GetC();
+ pTextMatrix[2] = text_matrix.GetB();
+ pTextMatrix[3] = text_matrix.GetD();
+ m_PosX = text_matrix.GetE();
+ m_PosY = text_matrix.GetF();
+ CalcPositionData(NULL, NULL, 0);
+}
+void CPDF_TextObject::SetPosition(FX_FLOAT x, FX_FLOAT y)
+{
+ FX_FLOAT dx = x - m_PosX;
+ FX_FLOAT dy = y - m_PosY;
+ m_PosX = x;
+ m_PosY = y;
+ m_Left += dx;
+ m_Right += dx;
+ m_Top += dy;
+ m_Bottom += dy;
+}
+void CPDF_TextObject::SetData(int nChars, FX_DWORD* pCharCodes, FX_FLOAT* pCharPos, FX_FLOAT x, FX_FLOAT y)
+{
+ ASSERT(m_nChars == 0);
+ m_nChars = nChars;
+ m_PosX = x;
+ m_PosY = y;
+ if (nChars == 0) {
+ return;
+ }
+ if (nChars == 1) {
+ m_pCharCodes = (FX_DWORD*)(FX_UINTPTR) * pCharCodes;
+ } else {
+ m_pCharCodes = FX_Alloc(FX_DWORD, nChars);
+ FXSYS_memcpy32(m_pCharCodes, pCharCodes, sizeof(FX_DWORD)*nChars);
+ m_pCharPos = FX_Alloc(FX_FLOAT, nChars - 1);
+ FXSYS_memcpy32(m_pCharPos, pCharPos, sizeof(FX_FLOAT) * (nChars - 1));
+ }
+ RecalcPositionData();
+}
+void CPDF_TextObject::SetTextState(CPDF_TextState TextState)
+{
+ m_TextState = TextState;
+ CalcPositionData(NULL, NULL, 0);
+}
+CPDF_ShadingObject::CPDF_ShadingObject()
+{
+ m_pShading = NULL;
+ m_Type = PDFPAGE_SHADING;
+}
+CPDF_ShadingObject::~CPDF_ShadingObject()
+{
+ CPDF_ShadingPattern* pShading = m_pShading;
+ if (pShading && pShading->m_pDocument) {
+ pShading->m_pDocument->GetPageData()->ReleasePattern(pShading->m_pShadingObj);
+ }
+}
+void CPDF_ShadingObject::CopyData(const CPDF_PageObject* pSrc)
+{
+ CPDF_ShadingObject* pSrcObj = (CPDF_ShadingObject*)pSrc;
+ m_pShading = pSrcObj->m_pShading;
+ if (m_pShading && m_pShading->m_pDocument) {
+ CPDF_DocPageData* pDocPageData = m_pShading->m_pDocument->GetPageData();
+ m_pShading = (CPDF_ShadingPattern*)pDocPageData->GetPattern(m_pShading->m_pShadingObj, m_pShading->m_bShadingObj, &m_pShading->m_ParentMatrix);
+ }
+ m_Matrix = pSrcObj->m_Matrix;
+}
+void CPDF_ShadingObject::Transform(const CFX_AffineMatrix& matrix)
+{
+ if (!m_ClipPath.IsNull()) {
+ m_ClipPath.GetModify();
+ m_ClipPath.Transform(matrix);
+ }
+ m_Matrix.Concat(matrix);
+ if (!m_ClipPath.IsNull()) {
+ CalcBoundingBox();
+ } else {
+ matrix.TransformRect(m_Left, m_Right, m_Top, m_Bottom);
+ }
+}
+void CPDF_ShadingObject::CalcBoundingBox()
+{
+ if (m_ClipPath.IsNull()) {
+ return;
+ }
+ CFX_FloatRect rect = m_ClipPath.GetClipBox();
+ m_Left = rect.left;
+ m_Bottom = rect.bottom;
+ m_Right = rect.right;
+ m_Top = rect.top;
+}
+CPDF_FormObject::~CPDF_FormObject()
+{
+ if (m_pForm) {
+ delete m_pForm;
+ }
+}
+void CPDF_FormObject::Transform(const CFX_AffineMatrix& matrix)
+{
+ m_FormMatrix.Concat(matrix);
+ CalcBoundingBox();
+}
+void CPDF_FormObject::CopyData(const CPDF_PageObject* pSrc)
+{
+ const CPDF_FormObject* pSrcObj = (const CPDF_FormObject*)pSrc;
+ if (m_pForm) {
+ delete m_pForm;
+ }
+ m_pForm = pSrcObj->m_pForm->Clone();
+ m_FormMatrix = pSrcObj->m_FormMatrix;
+}
+void CPDF_FormObject::CalcBoundingBox()
+{
+ CFX_FloatRect form_rect = m_pForm->CalcBoundingBox();
+ form_rect.Transform(&m_FormMatrix);
+ m_Left = form_rect.left;
+ m_Bottom = form_rect.bottom;
+ m_Right = form_rect.right;
+ m_Top = form_rect.top;
+}
+CPDF_PageObjects::CPDF_PageObjects(FX_BOOL bReleaseMembers) : m_ObjectList(128)
+{
+ m_bBackgroundAlphaNeeded = FALSE;
+ m_bReleaseMembers = bReleaseMembers;
+ m_ParseState = PDF_CONTENT_NOT_PARSED;
+ m_pParser = NULL;
+ m_pFormStream = NULL;
+ m_pResources = NULL;
+}
+CPDF_PageObjects::~CPDF_PageObjects()
+{
+ if (m_pParser) {
+ delete m_pParser;
+ }
+ if (!m_bReleaseMembers) {
+ return;
+ }
+ FX_POSITION pos = m_ObjectList.GetHeadPosition();
+ while (pos) {
+ CPDF_PageObject* pPageObj = (CPDF_PageObject*)m_ObjectList.GetNext(pos);
+ if (!pPageObj) {
+ continue;
+ }
+ pPageObj->Release();
+ }
+}
+void CPDF_PageObjects::ContinueParse(IFX_Pause* pPause)
+{
+ if (m_pParser == NULL) {
+ return;
+ }
+ m_pParser->Continue(pPause);
+ if (m_pParser->GetStatus() == CPDF_ContentParser::Done) {
+ m_ParseState = PDF_CONTENT_PARSED;
+ delete m_pParser;
+ m_pParser = NULL;
+ }
+}
+int CPDF_PageObjects::EstimateParseProgress() const
+{
+ if (m_pParser == NULL) {
+ return m_ParseState == PDF_CONTENT_PARSED ? 100 : 0;
+ }
+ return m_pParser->EstimateProgress();
+}
+FX_POSITION CPDF_PageObjects::InsertObject(FX_POSITION posInsertAfter, CPDF_PageObject* pNewObject)
+{
+ if (posInsertAfter == NULL) {
+ return m_ObjectList.AddHead(pNewObject);
+ } else {
+ return m_ObjectList.InsertAfter(posInsertAfter, pNewObject);
+ }
+}
+int CPDF_PageObjects::GetObjectIndex(CPDF_PageObject* pObj) const
+{
+ int index = 0;
+ FX_POSITION pos = m_ObjectList.GetHeadPosition();
+ while (pos) {
+ CPDF_PageObject* pThisObj = (CPDF_PageObject*)m_ObjectList.GetNext(pos);
+ if (pThisObj == pObj) {
+ return index;
+ }
+ index ++;
+ }
+ return -1;
+}
+CPDF_PageObject* CPDF_PageObjects::GetObjectByIndex(int index) const
+{
+ FX_POSITION pos = m_ObjectList.FindIndex(index);
+ if (pos == NULL) {
+ return NULL;
+ }
+ return (CPDF_PageObject*)m_ObjectList.GetAt(pos);
+}
+void CPDF_PageObjects::Transform(const CFX_AffineMatrix& matrix)
+{
+ FX_POSITION pos = m_ObjectList.GetHeadPosition();
+ while (pos) {
+ CPDF_PageObject* pObj = (CPDF_PageObject*)m_ObjectList.GetNext(pos);
+ pObj->Transform(matrix);
+ }
+}
+CFX_FloatRect CPDF_PageObjects::CalcBoundingBox() const
+{
+ if (m_ObjectList.GetCount() == 0) {
+ return CFX_FloatRect(0, 0, 0, 0);
+ }
+ FX_FLOAT left, right, top, bottom;
+ left = bottom = 1000000 * 1.0f;
+ right = top = -1000000 * 1.0f;
+ FX_POSITION pos = m_ObjectList.GetHeadPosition();
+ while (pos) {
+ CPDF_PageObject* pObj = (CPDF_PageObject*)m_ObjectList.GetNext(pos);
+ if (left > pObj->m_Left) {
+ left = pObj->m_Left;
+ }
+ if (right < pObj->m_Right) {
+ right = pObj->m_Right;
+ }
+ if (top < pObj->m_Top) {
+ top = pObj->m_Top;
+ }
+ if (bottom > pObj->m_Bottom) {
+ bottom = pObj->m_Bottom;
+ }
+ }
+ return CFX_FloatRect(left, bottom, right, top);
+}
+void CPDF_PageObjects::LoadTransInfo()
+{
+ if (m_pFormDict == NULL) {
+ return;
+ }
+ CPDF_Dictionary* pGroup = m_pFormDict->GetDict(FX_BSTRC("Group"));
+ if (pGroup == NULL) {
+ return;
+ }
+ if (pGroup->GetString(FX_BSTRC("S")) != FX_BSTRC("Transparency")) {
+ return;
+ }
+ m_Transparency |= PDFTRANS_GROUP;
+ if (pGroup->GetInteger(FX_BSTRC("I"))) {
+ m_Transparency |= PDFTRANS_ISOLATED;
+ }
+ if (pGroup->GetInteger(FX_BSTRC("K"))) {
+ m_Transparency |= PDFTRANS_KNOCKOUT;
+ }
+}
+void CPDF_PageObjects::ClearCacheObjects()
+{
+ m_ParseState = PDF_CONTENT_NOT_PARSED;
+ if (m_pParser) {
+ delete m_pParser;
+ }
+ m_pParser = NULL;
+ if (m_bReleaseMembers) {
+ FX_POSITION pos = m_ObjectList.GetHeadPosition();
+ while (pos) {
+ CPDF_PageObject* pPageObj = (CPDF_PageObject*)m_ObjectList.GetNext(pos);
+ if (!pPageObj) {
+ continue;
+ }
+ pPageObj->Release();
+ }
+ }
+ m_ObjectList.RemoveAll();
+}
+CPDF_Page::CPDF_Page()
+{
+ m_pPageRender = NULL;
+}
+void CPDF_Page::Load(CPDF_Document* pDocument, CPDF_Dictionary* pPageDict, FX_BOOL bPageCache)
+{
+ m_pDocument = (CPDF_Document*)pDocument;
+ m_pFormDict = pPageDict;
+ if (bPageCache) {
+ m_pPageRender = CPDF_ModuleMgr::Get()->GetRenderModule()->CreatePageCache(this);
+ }
+ if (pPageDict == NULL) {
+ m_PageWidth = m_PageHeight = 100 * 1.0f;
+ m_pPageResources = m_pResources = NULL;
+ return;
+ }
+ m_pResources = GetPageAttr(FX_BSTRC("Resources"))->GetDict();
+ m_pPageResources = m_pResources;
+ CPDF_Object* pRotate = GetPageAttr(FX_BSTRC("Rotate"));
+ int rotate = 0;
+ if (pRotate) {
+ rotate = pRotate->GetInteger() / 90 % 4;
+ }
+ if (rotate < 0) {
+ rotate += 4;
+ }
+ CPDF_Array* pMediaBox, *pCropBox;
+ pMediaBox = (CPDF_Array*)GetPageAttr(FX_BSTRC("MediaBox"));
+ CFX_FloatRect mediabox;
+ if (pMediaBox) {
+ mediabox = pMediaBox->GetRect();
+ mediabox.Normalize();
+ }
+ if (mediabox.IsEmpty()) {
+ mediabox = CFX_FloatRect(0, 0, 612, 792);
+ }
+ pCropBox = (CPDF_Array*)GetPageAttr(FX_BSTRC("CropBox"));
+ if (pCropBox) {
+ m_BBox = pCropBox->GetRect();
+ m_BBox.Normalize();
+ }
+ if (m_BBox.IsEmpty()) {
+ m_BBox = mediabox;
+ } else {
+ m_BBox.Intersect(mediabox);
+ }
+ if (rotate % 2) {
+ m_PageHeight = m_BBox.right - m_BBox.left;
+ m_PageWidth = m_BBox.top - m_BBox.bottom;
+ } else {
+ m_PageWidth = m_BBox.right - m_BBox.left;
+ m_PageHeight = m_BBox.top - m_BBox.bottom;
+ }
+ switch (rotate) {
+ case 0:
+ m_PageMatrix.Set(1.0f, 0, 0, 1.0f, -m_BBox.left, -m_BBox.bottom);
+ break;
+ case 1:
+ m_PageMatrix.Set(0, -1.0f, 1.0f, 0, -m_BBox.bottom, m_BBox.right);
+ break;
+ case 2:
+ m_PageMatrix.Set(-1.0f, 0, 0, -1.0f, m_BBox.right, m_BBox.top);
+ break;
+ case 3:
+ m_PageMatrix.Set(0, 1.0f, -1.0f, 0, m_BBox.top, -m_BBox.left);
+ break;
+ }
+ m_Transparency = PDFTRANS_ISOLATED;
+ LoadTransInfo();
+}
+void CPDF_Page::StartParse(CPDF_ParseOptions* pOptions, FX_BOOL bReParse)
+{
+ if (bReParse) {
+ ClearCacheObjects();
+ }
+ if (m_ParseState == PDF_CONTENT_PARSED || m_ParseState == PDF_CONTENT_PARSING) {
+ return;
+ }
+ m_pParser = FX_NEW CPDF_ContentParser;
+ m_pParser->Start(this, pOptions);
+ m_ParseState = PDF_CONTENT_PARSING;
+}
+void CPDF_Page::ParseContent(CPDF_ParseOptions* pOptions, FX_BOOL bReParse)
+{
+ StartParse(pOptions, bReParse);
+ ContinueParse(NULL);
+}
+CPDF_Page::~CPDF_Page()
+{
+ if (m_pPageRender) {
+ CPDF_RenderModuleDef* pModule = CPDF_ModuleMgr::Get()->GetRenderModule();
+ pModule->DestroyPageCache(m_pPageRender);
+ }
+}
+CPDF_Object* FPDFAPI_GetPageAttr(CPDF_Dictionary* pPageDict, FX_BSTR name)
+{
+ int level = 0;
+ while (1) {
+ CPDF_Object* pObj = pPageDict->GetElementValue(name);
+ if (pObj) {
+ return pObj;
+ }
+ CPDF_Dictionary* pParent = pPageDict->GetDict(FX_BSTRC("Parent"));
+ if (!pParent || pParent == pPageDict) {
+ return NULL;
+ }
+ pPageDict = pParent;
+ level ++;
+ if (level == 1000) {
+ return NULL;
+ }
+ }
+}
+CPDF_Object* CPDF_Page::GetPageAttr(FX_BSTR name) const
+{
+ return FPDFAPI_GetPageAttr(m_pFormDict, name);
+}
+CPDF_Form::CPDF_Form(CPDF_Document* pDoc, CPDF_Dictionary* pPageResources, CPDF_Stream* pFormStream, CPDF_Dictionary* pParentResources)
+{
+ m_pDocument = pDoc;
+ m_pFormStream = pFormStream;
+ m_pFormDict = pFormStream->GetDict();
+ m_pResources = m_pFormDict->GetDict(FX_BSTRC("Resources"));
+ m_pPageResources = pPageResources;
+ if (m_pResources == NULL) {
+ m_pResources = pParentResources;
+ }
+ if (m_pResources == NULL) {
+ m_pResources = pPageResources;
+ }
+ m_Transparency = 0;
+ LoadTransInfo();
+}
+CPDF_Form::~CPDF_Form()
+{
+}
+void CPDF_Form::StartParse(CPDF_AllStates* pGraphicStates, CFX_AffineMatrix* pParentMatrix,
+ CPDF_Type3Char* pType3Char, CPDF_ParseOptions* pOptions, int level)
+{
+ if (m_ParseState == PDF_CONTENT_PARSED || m_ParseState == PDF_CONTENT_PARSING) {
+ return;
+ }
+ m_pParser = FX_NEW CPDF_ContentParser;
+ m_pParser->Start(this, pGraphicStates, pParentMatrix, pType3Char, pOptions, level);
+ m_ParseState = PDF_CONTENT_PARSING;
+}
+void CPDF_Form::ParseContent(CPDF_AllStates* pGraphicStates, CFX_AffineMatrix* pParentMatrix,
+ CPDF_Type3Char* pType3Char, CPDF_ParseOptions* pOptions, int level)
+{
+ StartParse(pGraphicStates, pParentMatrix, pType3Char, pOptions, level);
+ ContinueParse(NULL);
+}
+CPDF_Form* CPDF_Form::Clone() const
+{
+ CPDF_Form* pClone = FX_NEW CPDF_Form(m_pDocument, m_pPageResources, m_pFormStream, m_pResources);
+ FX_POSITION pos = m_ObjectList.GetHeadPosition();
+ while (pos) {
+ CPDF_PageObject* pObj = (CPDF_PageObject*)m_ObjectList.GetNext(pos);
+ pClone->m_ObjectList.AddTail(pObj->Clone());
+ }
+ return pClone;
+}
+void CPDF_Page::GetDisplayMatrix(CFX_AffineMatrix& matrix, int xPos, int yPos,
+ int xSize, int ySize, int iRotate) const
+{
+ if (m_PageWidth == 0 || m_PageHeight == 0) {
+ return;
+ }
+ CFX_AffineMatrix display_matrix;
+ int x0, y0, x1, y1, x2, y2;
+ iRotate %= 4;
+ switch (iRotate) {
+ case 0:
+ x0 = xPos;
+ y0 = yPos + ySize;
+ x1 = xPos;
+ y1 = yPos;
+ x2 = xPos + xSize;
+ y2 = yPos + ySize;
+ break;
+ case 1:
+ x0 = xPos;
+ y0 = yPos;
+ x1 = xPos + xSize;
+ y1 = yPos;
+ x2 = xPos;
+ y2 = yPos + ySize;
+ break;
+ case 2:
+ x0 = xPos + xSize;
+ y0 = yPos;
+ x1 = xPos + xSize;
+ y1 = yPos + ySize;
+ x2 = xPos;
+ y2 = yPos;
+ break;
+ case 3:
+ x0 = xPos + xSize;
+ y0 = yPos + ySize;
+ x1 = xPos;
+ y1 = yPos + ySize;
+ x2 = xPos + xSize;
+ y2 = yPos;
+ break;
+ }
+ display_matrix.Set(FXSYS_Div((FX_FLOAT)(x2 - x0), m_PageWidth),
+ FXSYS_Div((FX_FLOAT)(y2 - y0), m_PageWidth),
+ FXSYS_Div((FX_FLOAT)(x1 - x0), m_PageHeight),
+ FXSYS_Div((FX_FLOAT)(y1 - y0), m_PageHeight),
+ (FX_FLOAT)x0, (FX_FLOAT)y0);
+ matrix = m_PageMatrix;
+ matrix.Concat(display_matrix);
+}
+CPDF_ParseOptions::CPDF_ParseOptions()
+{
+ m_bTextOnly = FALSE;
+ m_bMarkedContent = TRUE;
+ m_bSeparateForm = TRUE;
+ m_bDecodeInlineImage = FALSE;
+}
diff --git a/core/src/fpdfapi/fpdf_page/fpdf_page_colors.cpp b/core/src/fpdfapi/fpdf_page/fpdf_page_colors.cpp
index 44b4fc0b1d..8c274b2607 100644
--- a/core/src/fpdfapi/fpdf_page/fpdf_page_colors.cpp
+++ b/core/src/fpdfapi/fpdf_page/fpdf_page_colors.cpp
@@ -1,1401 +1,1401 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../../include/fpdfapi/fpdf_page.h"
-#include "../../../include/fpdfapi/fpdf_module.h"
-#include "../../../include/fxcodec/fx_codec.h"
-#include "pageint.h"
-#include <limits.h>
-void sRGB_to_AdobeCMYK(FX_FLOAT R, FX_FLOAT G, FX_FLOAT B, FX_FLOAT& c, FX_FLOAT& m, FX_FLOAT& y, FX_FLOAT& k)
-{
- c = 1.0f - R;
- m = 1.0f - G;
- y = 1.0f - B;
- k = c;
- if (m < k) {
- k = m;
- }
- if (y < k) {
- k = y;
- }
-}
-CPDF_DeviceCS::CPDF_DeviceCS(int family)
-{
- m_Family = family;
- if (m_Family == PDFCS_DEVICERGB) {
- m_nComponents = 3;
- } else if (m_Family == PDFCS_DEVICEGRAY) {
- m_nComponents = 1;
- } else {
- m_nComponents = 4;
- }
-}
-FX_BOOL CPDF_DeviceCS::GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const
-{
- if (m_Family == PDFCS_DEVICERGB) {
- R = pBuf[0];
- if (R < 0) {
- R = 0;
- } else if (R > 1) {
- R = 1;
- }
- G = pBuf[1];
- if (G < 0) {
- G = 0;
- } else if (G > 1) {
- G = 1;
- }
- B = pBuf[2];
- if (B < 0) {
- B = 0;
- } else if (B > 1) {
- B = 1;
- }
- } else if (m_Family == PDFCS_DEVICEGRAY) {
- R = *pBuf;
- if (R < 0) {
- R = 0;
- } else if (R > 1) {
- R = 1;
- }
- G = B = R;
- } else if (m_Family == PDFCS_DEVICECMYK) {
- if (!m_dwStdConversion) {
- AdobeCMYK_to_sRGB(pBuf[0], pBuf[1], pBuf[2], pBuf[3], R, G, B);
- } else {
- FX_FLOAT k = pBuf[3];
- R = 1.0f - FX_MIN(1.0f, pBuf[0] + k);
- G = 1.0f - FX_MIN(1.0f, pBuf[1] + k);
- B = 1.0f - FX_MIN(1.0f, pBuf[2] + k);
- }
- } else {
- ASSERT(m_Family == PDFCS_PATTERN);
- R = G = B = 0;
- return FALSE;
- }
- return TRUE;
-}
-FX_BOOL CPDF_DeviceCS::v_GetCMYK(FX_FLOAT* pBuf, FX_FLOAT& c, FX_FLOAT& m, FX_FLOAT& y, FX_FLOAT& k) const
-{
- if (m_Family != PDFCS_DEVICECMYK) {
- return FALSE;
- }
- c = pBuf[0];
- m = pBuf[1];
- y = pBuf[2];
- k = pBuf[3];
- return TRUE;
-}
-FX_BOOL CPDF_DeviceCS::SetRGB(FX_FLOAT* pBuf, FX_FLOAT R, FX_FLOAT G, FX_FLOAT B) const
-{
- if (m_Family == PDFCS_DEVICERGB) {
- pBuf[0] = R;
- pBuf[1] = G;
- pBuf[2] = B;
- return TRUE;
- } else if (m_Family == PDFCS_DEVICEGRAY) {
- if (R == G && R == B) {
- *pBuf = R;
- return TRUE;
- } else {
- return FALSE;
- }
- } else if (m_Family == PDFCS_DEVICECMYK) {
- sRGB_to_AdobeCMYK(R, G, B, pBuf[0], pBuf[1], pBuf[2], pBuf[3]);
- return TRUE;
- }
- return FALSE;
-}
-FX_BOOL CPDF_DeviceCS::v_SetCMYK(FX_FLOAT* pBuf, FX_FLOAT c, FX_FLOAT m, FX_FLOAT y, FX_FLOAT k) const
-{
- if (m_Family == PDFCS_DEVICERGB) {
- AdobeCMYK_to_sRGB(c, m, y, k, pBuf[0], pBuf[1], pBuf[2]);
- return TRUE;
- } else if (m_Family == PDFCS_DEVICEGRAY) {
- return FALSE;
- } else if (m_Family == PDFCS_DEVICECMYK) {
- pBuf[0] = c;
- pBuf[1] = m;
- pBuf[2] = y;
- pBuf[3] = k;
- return TRUE;
- }
- return FALSE;
-}
-static void ReverseRGB(FX_LPBYTE pDestBuf, FX_LPCBYTE pSrcBuf, int pixels)
-{
- if (pDestBuf == pSrcBuf)
- for (int i = 0; i < pixels; i ++) {
- FX_BYTE temp = pDestBuf[2];
- pDestBuf[2] = pDestBuf[0];
- pDestBuf[0] = temp;
- pDestBuf += 3;
- }
- else
- for (int i = 0; i < pixels; i ++) {
- *pDestBuf ++ = pSrcBuf[2];
- *pDestBuf ++ = pSrcBuf[1];
- *pDestBuf ++ = pSrcBuf[0];
- pSrcBuf += 3;
- }
-}
-void CPDF_DeviceCS::TranslateImageLine(FX_LPBYTE pDestBuf, FX_LPCBYTE pSrcBuf, int pixels, int image_width, int image_height, FX_BOOL bTransMask) const
-{
- if (bTransMask && m_Family == PDFCS_DEVICECMYK) {
- for (int i = 0; i < pixels; i ++) {
- int k = 255 - pSrcBuf[3];
- pDestBuf[0] = ((255 - pSrcBuf[0]) * k) / 255;
- pDestBuf[1] = ((255 - pSrcBuf[1]) * k) / 255;
- pDestBuf[2] = ((255 - pSrcBuf[2]) * k) / 255;
- pDestBuf += 3;
- pSrcBuf += 4;
- }
- return;
- }
- if (m_Family == PDFCS_DEVICERGB) {
- ReverseRGB(pDestBuf, pSrcBuf, pixels);
- } else if (m_Family == PDFCS_DEVICEGRAY) {
- for (int i = 0; i < pixels; i ++) {
- *pDestBuf ++ = pSrcBuf[i];
- *pDestBuf ++ = pSrcBuf[i];
- *pDestBuf ++ = pSrcBuf[i];
- }
- } else {
- for (int i = 0; i < pixels; i ++) {
- if (!m_dwStdConversion) {
- AdobeCMYK_to_sRGB1(pSrcBuf[0], pSrcBuf[1], pSrcBuf[2], pSrcBuf[3], pDestBuf[2], pDestBuf[1], pDestBuf[0]);
- } else {
- FX_BYTE k = pSrcBuf[3];
- pDestBuf[2] = 255 - FX_MIN(255, pSrcBuf[0] + k);
- pDestBuf[1] = 255 - FX_MIN(255, pSrcBuf[1] + k);
- pDestBuf[0] = 255 - FX_MIN(255, pSrcBuf[2] + k);
- }
- pSrcBuf += 4;
- pDestBuf += 3;
- }
- }
-}
-const FX_BYTE g_sRGBSamples1[] = {
- 0, 3, 6, 10, 13, 15, 18, 20, 22, 23, 25, 27, 28, 30, 31, 32,
- 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49,
- 49, 50, 51, 52, 53, 53, 54, 55, 56, 56, 57, 58, 58, 59, 60, 61,
- 61, 62, 62, 63, 64, 64, 65, 66, 66, 67, 67, 68, 68, 69, 70, 70,
- 71, 71, 72, 72, 73, 73, 74, 74, 75, 76, 76, 77, 77, 78, 78, 79,
- 79, 79, 80, 80, 81, 81, 82, 82, 83, 83, 84, 84, 85, 85, 85, 86,
- 86, 87, 87, 88, 88, 88, 89, 89, 90, 90, 91, 91, 91, 92, 92, 93,
- 93, 93, 94, 94, 95, 95, 95, 96, 96, 97, 97, 97, 98, 98, 98, 99,
- 99, 99, 100, 100, 101, 101, 101, 102, 102, 102, 103, 103, 103, 104, 104, 104,
- 105, 105, 106, 106, 106, 107, 107, 107, 108, 108, 108, 109, 109, 109, 110, 110,
- 110, 110, 111, 111, 111, 112, 112, 112, 113, 113, 113, 114, 114, 114, 115, 115,
- 115, 115, 116, 116, 116, 117, 117, 117, 118, 118, 118, 118, 119, 119, 119, 120,
-};
-const FX_BYTE g_sRGBSamples2[] = {
- 120, 121, 122, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136,
- 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 148, 149, 150, 151,
- 152, 153, 154, 155, 155, 156, 157, 158, 159, 159, 160, 161, 162, 163, 163, 164,
- 165, 166, 167, 167, 168, 169, 170, 170, 171, 172, 173, 173, 174, 175, 175, 176,
- 177, 178, 178, 179, 180, 180, 181, 182, 182, 183, 184, 185, 185, 186, 187, 187,
- 188, 189, 189, 190, 190, 191, 192, 192, 193, 194, 194, 195, 196, 196, 197, 197,
- 198, 199, 199, 200, 200, 201, 202, 202, 203, 203, 204, 205, 205, 206, 206, 207,
- 208, 208, 209, 209, 210, 210, 211, 212, 212, 213, 213, 214, 214, 215, 215, 216,
- 216, 217, 218, 218, 219, 219, 220, 220, 221, 221, 222, 222, 223, 223, 224, 224,
- 225, 226, 226, 227, 227, 228, 228, 229, 229, 230, 230, 231, 231, 232, 232, 233,
- 233, 234, 234, 235, 235, 236, 236, 237, 237, 238, 238, 238, 239, 239, 240, 240,
- 241, 241, 242, 242, 243, 243, 244, 244, 245, 245, 246, 246, 246, 247, 247, 248,
- 248, 249, 249, 250, 250, 251, 251, 251, 252, 252, 253, 253, 254, 254, 255, 255,
-};
-static void XYZ_to_sRGB(FX_FLOAT X, FX_FLOAT Y, FX_FLOAT Z, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B)
-{
- FX_FLOAT R1 = 3.2410f * X - 1.5374f * Y - 0.4986f * Z;
- FX_FLOAT G1 = -0.9692f * X + 1.8760f * Y + 0.0416f * Z;
- FX_FLOAT B1 = 0.0556f * X - 0.2040f * Y + 1.0570f * Z;
- if (R1 > 1) {
- R1 = 1;
- }
- if (R1 < 0) {
- R1 = 0;
- }
- if (G1 > 1) {
- G1 = 1;
- }
- if (G1 < 0) {
- G1 = 0;
- }
- if (B1 > 1) {
- B1 = 1;
- }
- if (B1 < 0) {
- B1 = 0;
- }
- int scale = (int)(R1 * 1023);
- if (scale < 0) {
- scale = 0;
- }
- if (scale < 192) {
- R = (g_sRGBSamples1[scale] / 255.0f);
- } else {
- R = (g_sRGBSamples2[scale / 4 - 48] / 255.0f);
- }
- scale = (int)(G1 * 1023);
- if (scale < 0) {
- scale = 0;
- }
- if (scale < 192) {
- G = (g_sRGBSamples1[scale] / 255.0f);
- } else {
- G = (g_sRGBSamples2[scale / 4 - 48] / 255.0f);
- }
- scale = (int)(B1 * 1023);
- if (scale < 0) {
- scale = 0;
- }
- if (scale < 192) {
- B = (g_sRGBSamples1[scale] / 255.0f);
- } else {
- B = (g_sRGBSamples2[scale / 4 - 48] / 255.0f);
- }
-}
-class CPDF_CalGray : public CPDF_ColorSpace
-{
-public:
- CPDF_CalGray();
- virtual FX_BOOL v_Load(CPDF_Document* pDoc, CPDF_Array* pArray);
- virtual FX_BOOL GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const;
- virtual void TranslateImageLine(FX_LPBYTE pDestBuf, FX_LPCBYTE pSrcBuf, int pixels, int image_width, int image_height, FX_BOOL bTransMask = FALSE) const;
- FX_BOOL SetRGB(FX_FLOAT* pBuf, FX_FLOAT R, FX_FLOAT G, FX_FLOAT B) const;
- FX_FLOAT m_WhitePoint[3];
- FX_FLOAT m_BlackPoint[3];
- FX_FLOAT m_Gamma;
-};
-CPDF_CalGray::CPDF_CalGray()
-{
- m_Family = PDFCS_CALGRAY;
- m_nComponents = 1;
-}
-FX_BOOL CPDF_CalGray::v_Load(CPDF_Document* pDoc, CPDF_Array* pArray)
-{
- CPDF_Dictionary* pDict = pArray->GetDict(1);
- CPDF_Array* pParam = pDict->GetArray(FX_BSTRC("WhitePoint"));
- int i;
- for (i = 0; i < 3; i ++) {
- m_WhitePoint[i] = pParam->GetNumber(i);
- }
- pParam = pDict->GetArray(FX_BSTRC("BlackPoint"));
- for (i = 0; i < 3; i ++) {
- m_BlackPoint[i] = pParam ? pParam->GetNumber(i) : 0;
- }
- m_Gamma = pDict->GetNumber(FX_BSTRC("Gamma"));
- if (m_Gamma == 0) {
- m_Gamma = 1.0f;
- }
- return TRUE;
-}
-FX_BOOL CPDF_CalGray::GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const
-{
- R = G = B = *pBuf;
- return TRUE;
-}
-FX_BOOL CPDF_CalGray::SetRGB(FX_FLOAT* pBuf, FX_FLOAT R, FX_FLOAT G, FX_FLOAT B) const
-{
- if (R == G && R == B) {
- *pBuf = R;
- return TRUE;
- } else {
- return FALSE;
- }
-}
-void CPDF_CalGray::TranslateImageLine(FX_LPBYTE pDestBuf, FX_LPCBYTE pSrcBuf, int pixels, int image_width, int image_height, FX_BOOL bTransMask) const
-{
- for (int i = 0; i < pixels; i ++) {
- *pDestBuf ++ = pSrcBuf[i];
- *pDestBuf ++ = pSrcBuf[i];
- *pDestBuf ++ = pSrcBuf[i];
- }
-}
-class CPDF_CalRGB : public CPDF_ColorSpace
-{
-public:
- CPDF_CalRGB();
- virtual FX_BOOL v_Load(CPDF_Document* pDoc, CPDF_Array* pArray);
- virtual FX_BOOL GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const;
- virtual void TranslateImageLine(FX_LPBYTE pDestBuf, FX_LPCBYTE pSrcBuf, int pixels, int image_width, int image_height, FX_BOOL bTransMask = FALSE) const;
- FX_BOOL SetRGB(FX_FLOAT* pBuf, FX_FLOAT R, FX_FLOAT G, FX_FLOAT B) const;
- FX_FLOAT m_WhitePoint[3];
- FX_FLOAT m_BlackPoint[3];
- FX_FLOAT m_Gamma[3];
- FX_FLOAT m_Matrix[9];
- FX_BOOL m_bGamma, m_bMatrix;
-};
-CPDF_CalRGB::CPDF_CalRGB()
-{
- m_Family = PDFCS_CALRGB;
- m_nComponents = 3;
-}
-FX_BOOL CPDF_CalRGB::v_Load(CPDF_Document* pDoc, CPDF_Array* pArray)
-{
- CPDF_Dictionary* pDict = pArray->GetDict(1);
- CPDF_Array* pParam = pDict->GetArray(FX_BSTRC("WhitePoint"));
- int i;
- for (i = 0; i < 3; i ++) {
- m_WhitePoint[i] = pParam->GetNumber(i);
- }
- pParam = pDict->GetArray(FX_BSTRC("BlackPoint"));
- for (i = 0; i < 3; i ++) {
- m_BlackPoint[i] = pParam ? pParam->GetNumber(i) : 0;
- }
- pParam = pDict->GetArray(FX_BSTRC("Gamma"));
- if (pParam) {
- m_bGamma = TRUE;
- for (i = 0; i < 3; i ++) {
- m_Gamma[i] = pParam->GetNumber(i);
- }
- } else {
- m_bGamma = FALSE;
- }
- pParam = pDict->GetArray(FX_BSTRC("Matrix"));
- if (pParam) {
- m_bMatrix = TRUE;
- for (i = 0; i < 9; i ++) {
- m_Matrix[i] = pParam->GetNumber(i);
- }
- } else {
- m_bMatrix = FALSE;
- }
- return TRUE;
-}
-FX_BOOL CPDF_CalRGB::GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const
-{
- FX_FLOAT A_ = pBuf[0];
- FX_FLOAT B_ = pBuf[1];
- FX_FLOAT C_ = pBuf[2];
- if (m_bGamma) {
- A_ = (FX_FLOAT)FXSYS_pow(A_, m_Gamma[0]);
- B_ = (FX_FLOAT)FXSYS_pow(B_, m_Gamma[1]);
- C_ = (FX_FLOAT)FXSYS_pow(C_, m_Gamma[2]);
- }
- FX_FLOAT X, Y, Z;
- if (m_bMatrix) {
- X = m_Matrix[0] * A_ + m_Matrix[3] * B_ + m_Matrix[6] * C_;
- Y = m_Matrix[1] * A_ + m_Matrix[4] * B_ + m_Matrix[7] * C_;
- Z = m_Matrix[2] * A_ + m_Matrix[5] * B_ + m_Matrix[8] * C_;
- } else {
- X = A_;
- Y = B_;
- Z = C_;
- }
- XYZ_to_sRGB(X, Y, Z, R, G, B);
- return TRUE;
-}
-FX_BOOL CPDF_CalRGB::SetRGB(FX_FLOAT* pBuf, FX_FLOAT R, FX_FLOAT G, FX_FLOAT B) const
-{
- pBuf[0] = R;
- pBuf[1] = G;
- pBuf[2] = B;
- return TRUE;
-}
-void CPDF_CalRGB::TranslateImageLine(FX_LPBYTE pDestBuf, FX_LPCBYTE pSrcBuf, int pixels, int image_width, int image_height, FX_BOOL bTransMask) const
-{
- if (bTransMask) {
- FX_FLOAT Cal[3];
- FX_FLOAT R, G, B;
- for(int i = 0; i < pixels; i ++) {
- Cal[0] = ((FX_FLOAT)pSrcBuf[2]) / 255;
- Cal[1] = ((FX_FLOAT)pSrcBuf[1]) / 255;
- Cal[2] = ((FX_FLOAT)pSrcBuf[0]) / 255;
- GetRGB(Cal, R, G, B);
- pDestBuf[0] = FXSYS_round(B * 255);
- pDestBuf[1] = FXSYS_round(G * 255);
- pDestBuf[2] = FXSYS_round(R * 255);
- pSrcBuf += 3;
- pDestBuf += 3;
- }
- }
- ReverseRGB(pDestBuf, pSrcBuf, pixels);
-}
-class CPDF_LabCS : public CPDF_ColorSpace
-{
-public:
- CPDF_LabCS()
- {
- m_Family = PDFCS_LAB;
- m_nComponents = 3;
- }
- virtual FX_BOOL v_Load(CPDF_Document* pDoc, CPDF_Array* pArray);
- virtual void GetDefaultValue(int iComponent, FX_FLOAT& value, FX_FLOAT& min, FX_FLOAT& max) const;
- virtual FX_BOOL GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const;
- FX_BOOL SetRGB(FX_FLOAT* pBuf, FX_FLOAT R, FX_FLOAT G, FX_FLOAT B) const;
- virtual void TranslateImageLine(FX_LPBYTE pDestBuf, FX_LPCBYTE pSrcBuf, int pixels, int image_width, int image_height, FX_BOOL bTransMask = FALSE) const;
- FX_FLOAT m_WhitePoint[3];
- FX_FLOAT m_BlackPoint[3];
- FX_FLOAT m_Ranges[4];
-};
-FX_BOOL CPDF_LabCS::v_Load(CPDF_Document* pDoc, CPDF_Array* pArray)
-{
- CPDF_Dictionary* pDict = pArray->GetDict(1);
- CPDF_Array* pParam = pDict->GetArray(FX_BSTRC("WhitePoint"));
- int i;
- for (i = 0; i < 3; i ++) {
- m_WhitePoint[i] = pParam->GetNumber(i);
- }
- pParam = pDict->GetArray(FX_BSTRC("BlackPoint"));
- for (i = 0; i < 3; i ++) {
- m_BlackPoint[i] = pParam ? pParam->GetNumber(i) : 0;
- }
- pParam = pDict->GetArray(FX_BSTRC("Range"));
- const FX_FLOAT def_ranges[4] = { -100 * 1.0f, 100 * 1.0f, -100 * 1.0f, 100 * 1.0f};
- for (i = 0; i < 4; i ++) {
- m_Ranges[i] = pParam ? pParam->GetNumber(i) : def_ranges[i];
- }
- return TRUE;
-}
-void CPDF_LabCS::GetDefaultValue(int iComponent, FX_FLOAT& value, FX_FLOAT& min, FX_FLOAT& max) const
-{
- value = 0;
- if (iComponent == 0) {
- min = 0;
- max = 100 * 1.0f;
- } else {
- min = m_Ranges[iComponent * 2 - 2];
- max = m_Ranges[iComponent * 2 - 1];
- if (value < min) {
- value = min;
- } else if (value > max) {
- value = max;
- }
- }
-}
-FX_BOOL CPDF_LabCS::GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const
-{
- FX_FLOAT Lstar = pBuf[0];
- FX_FLOAT astar = pBuf[1];
- FX_FLOAT bstar = pBuf[2];
- FX_FLOAT M = (Lstar + 16.0f) / 116.0f;
- FX_FLOAT L = M + astar / 500.0f;
- FX_FLOAT N = M - bstar / 200.0f;
- FX_FLOAT X, Y, Z;
- if (L < 0.2069f) {
- X = 0.957f * 0.12842f * (L - 0.1379f);
- } else {
- X = 0.957f * L * L * L;
- }
- if (M < 0.2069f) {
- Y = 0.12842f * (M - 0.1379f);
- } else {
- Y = M * M * M;
- }
- if (N < 0.2069f) {
- Z = 1.0889f * 0.12842f * (N - 0.1379f);
- } else {
- Z = 1.0889f * N * N * N;
- }
- XYZ_to_sRGB(X, Y, Z, R, G, B);
- return TRUE;
-}
-FX_BOOL CPDF_LabCS::SetRGB(FX_FLOAT* pBuf, FX_FLOAT R, FX_FLOAT G, FX_FLOAT B) const
-{
- return FALSE;
-}
-void CPDF_LabCS::TranslateImageLine(FX_LPBYTE pDestBuf, FX_LPCBYTE pSrcBuf, int pixels, int image_width, int image_height, FX_BOOL bTransMask) const
-{
- for (int i = 0; i < pixels; i ++) {
- FX_FLOAT lab[3];
- FX_FLOAT R, G, B;
- lab[0] = (pSrcBuf[0] * 100 / 255.0f);
- lab[1] = (FX_FLOAT)(pSrcBuf[1] - 128);
- lab[2] = (FX_FLOAT)(pSrcBuf[2] - 128);
- GetRGB(lab, R, G, B);
- pDestBuf[0] = (FX_INT32)(B * 255);
- pDestBuf[1] = (FX_INT32)(G * 255);
- pDestBuf[2] = (FX_INT32)(R * 255);
- pDestBuf += 3;
- pSrcBuf += 3;
- }
-}
-CPDF_IccProfile::CPDF_IccProfile(FX_LPCBYTE pData, FX_DWORD dwSize, int nComponents)
-{
- m_bsRGB = nComponents == 3 && dwSize == 3144 && FXSYS_memcmp32(pData + 0x190, "sRGB IEC61966-2.1", 17) == 0;
- m_pTransform = NULL;
- if (!m_bsRGB && CPDF_ModuleMgr::Get()->GetIccModule()) {
- m_pTransform = CPDF_ModuleMgr::Get()->GetIccModule()->CreateTransform_sRGB(pData, dwSize, nComponents);
- }
-}
-CPDF_IccProfile::~CPDF_IccProfile()
-{
- if (m_pTransform) {
- CPDF_ModuleMgr::Get()->GetIccModule()->DestroyTransform(m_pTransform);
- }
-}
-class CPDF_ICCBasedCS : public CPDF_ColorSpace
-{
-public:
- CPDF_ICCBasedCS();
- virtual ~CPDF_ICCBasedCS();
- virtual FX_BOOL v_Load(CPDF_Document* pDoc, CPDF_Array* pArray);
- void GetDefaultValue(int i, FX_FLOAT& min, FX_FLOAT& max) const
- {
- min = m_pRanges[i * 2];
- max = m_pRanges[i * 2 + 1];
- }
- virtual FX_BOOL GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const;
- FX_BOOL v_GetCMYK(FX_FLOAT* pBuf, FX_FLOAT& c, FX_FLOAT& m, FX_FLOAT& y, FX_FLOAT& k) const;
- FX_BOOL SetRGB(FX_FLOAT* pBuf, FX_FLOAT R, FX_FLOAT G, FX_FLOAT B) const;
- virtual void EnableStdConversion(FX_BOOL bEnabled);
- virtual void TranslateImageLine(FX_LPBYTE pDestBuf, FX_LPCBYTE pSrcBuf, int pixels, int image_width, int image_height, FX_BOOL bTransMask = FALSE) const;
- FX_FLOAT* m_pRanges;
- CPDF_IccProfile* m_pProfile;
- CPDF_ColorSpace* m_pAlterCS;
- FX_LPBYTE m_pCache;
- FX_BOOL m_bOwn;
-};
-CPDF_ICCBasedCS::CPDF_ICCBasedCS()
-{
- m_pAlterCS = NULL;
- m_pProfile = NULL;
- m_Family = PDFCS_ICCBASED;
- m_pCache = NULL;
- m_pRanges = NULL;
- m_bOwn = FALSE;
-}
-CPDF_ICCBasedCS::~CPDF_ICCBasedCS()
-{
- if (m_pCache) {
- FX_Free(m_pCache);
- }
- if (m_pRanges) {
- FX_Free(m_pRanges);
- }
- if (m_pAlterCS && m_bOwn) {
- m_pAlterCS->ReleaseCS();
- }
- if (m_pProfile && m_pDocument) {
- m_pDocument->GetPageData()->ReleaseIccProfile(NULL, m_pProfile);
- }
-}
-FX_BOOL CPDF_ICCBasedCS::v_Load(CPDF_Document* pDoc, CPDF_Array* pArray)
-{
- CPDF_Stream* pStream = pArray->GetStream(1);
- if (pStream == NULL) {
- return FALSE;
- }
- m_nComponents = pStream->GetDict()->GetInteger(FX_BSTRC("N"));
- if (m_nComponents < 0 || m_nComponents > (1 << 16)) {
- return FALSE;
- }
- CPDF_Array* pRanges = pStream->GetDict()->GetArray(FX_BSTRC("Range"));
- m_pRanges = FX_Alloc(FX_FLOAT, m_nComponents * 2);
- for (int i = 0; i < m_nComponents * 2; i ++) {
- if (pRanges) {
- m_pRanges[i] = pRanges->GetNumber(i);
- } else if (i % 2) {
- m_pRanges[i] = 1.0f;
- } else {
- m_pRanges[i] = 0;
- }
- }
- m_pProfile = pDoc->LoadIccProfile(pStream, m_nComponents);
- if (!m_pProfile) {
- return FALSE;
- }
- if (m_pProfile->m_pTransform == NULL) {
- CPDF_Object* pAlterCSObj = pStream->GetDict()->GetElementValue(FX_BSTRC("Alternate"));
- if (pAlterCSObj) {
- CPDF_ColorSpace* alter_cs = CPDF_ColorSpace::Load(pDoc, pAlterCSObj);
- if (alter_cs) {
- if (alter_cs->CountComponents() > m_nComponents) {
- alter_cs->ReleaseCS();
- } else {
- m_pAlterCS = alter_cs;
- m_bOwn = TRUE;
- }
- }
- }
- if (!m_pAlterCS) {
- if (m_nComponents == 3) {
- m_pAlterCS = GetStockCS(PDFCS_DEVICERGB);
- } else if (m_nComponents == 4) {
- m_pAlterCS = GetStockCS(PDFCS_DEVICECMYK);
- } else {
- m_pAlterCS = GetStockCS(PDFCS_DEVICEGRAY);
- }
- }
- }
- return TRUE;
-}
-FX_BOOL CPDF_ICCBasedCS::GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const
-{
- if (m_pProfile && m_pProfile->m_bsRGB) {
- R = pBuf[0];
- G = pBuf[1];
- B = pBuf[2];
- return TRUE;
- }
- ICodec_IccModule *pIccModule = CPDF_ModuleMgr::Get()->GetIccModule();
- if (m_pProfile->m_pTransform == NULL || pIccModule == NULL) {
- if (m_pAlterCS) {
- m_pAlterCS->GetRGB(pBuf, R, G, B);
- } else {
- R = G = B = 0.0f;
- }
- return TRUE;
- }
- FX_FLOAT rgb[3];
- pIccModule->Translate(m_pProfile->m_pTransform, pBuf, rgb);
- R = rgb[0];
- G = rgb[1];
- B = rgb[2];
- return TRUE;
-}
-FX_BOOL CPDF_ICCBasedCS::v_GetCMYK(FX_FLOAT* pBuf, FX_FLOAT& c, FX_FLOAT& m, FX_FLOAT& y, FX_FLOAT& k) const
-{
- if (m_nComponents != 4) {
- return FALSE;
- }
- c = pBuf[0];
- m = pBuf[1];
- y = pBuf[2];
- k = pBuf[3];
- return TRUE;
-}
-FX_BOOL CPDF_ICCBasedCS::SetRGB(FX_FLOAT* pBuf, FX_FLOAT R, FX_FLOAT G, FX_FLOAT B) const
-{
- return FALSE;
-}
-void CPDF_ICCBasedCS::EnableStdConversion(FX_BOOL bEnabled)
-{
- CPDF_ColorSpace::EnableStdConversion(bEnabled);
- if (m_pAlterCS) {
- m_pAlterCS->EnableStdConversion(bEnabled);
- }
-}
-void CPDF_ICCBasedCS::TranslateImageLine(FX_LPBYTE pDestBuf, FX_LPCBYTE pSrcBuf, int pixels, int image_width, int image_height, FX_BOOL bTransMask) const
-{
- if (m_pProfile->m_bsRGB) {
- ReverseRGB(pDestBuf, pSrcBuf, pixels);
- } else if (m_pProfile->m_pTransform) {
- int nMaxColors = 1;
- for (int i = 0; i < m_nComponents; i ++) {
- nMaxColors *= 52;
- }
- if (m_nComponents > 3 || image_width * image_height < nMaxColors * 3 / 2) {
- CPDF_ModuleMgr::Get()->GetIccModule()->TranslateScanline(m_pProfile->m_pTransform, pDestBuf, pSrcBuf, pixels);
- } else {
- if (m_pCache == NULL) {
- ((CPDF_ICCBasedCS*)this)->m_pCache = FX_Alloc(FX_BYTE, nMaxColors * 3);
- FX_LPBYTE temp_src = FX_Alloc(FX_BYTE, nMaxColors * m_nComponents);
- FX_LPBYTE pSrc = temp_src;
- for (int i = 0; i < nMaxColors; i ++) {
- FX_DWORD color = i;
- FX_DWORD order = nMaxColors / 52;
- for (int c = 0; c < m_nComponents; c ++) {
- *pSrc++ = (FX_BYTE)(color / order * 5);
- color %= order;
- order /= 52;
- }
- }
- CPDF_ModuleMgr::Get()->GetIccModule()->TranslateScanline(m_pProfile->m_pTransform, m_pCache, temp_src, nMaxColors);
- FX_Free(temp_src);
- }
- for (int i = 0; i < pixels; i ++) {
- int index = 0;
- for (int c = 0; c < m_nComponents; c ++) {
- index = index * 52 + (*pSrcBuf) / 5;
- pSrcBuf ++;
- }
- index *= 3;
- *pDestBuf++ = m_pCache[index];
- *pDestBuf++ = m_pCache[index + 1];
- *pDestBuf++ = m_pCache[index + 2];
- }
- }
- } else if (m_pAlterCS) {
- m_pAlterCS->TranslateImageLine(pDestBuf, pSrcBuf, pixels, image_width, image_height);
- }
-}
-class CPDF_IndexedCS : public CPDF_ColorSpace
-{
-public:
- CPDF_IndexedCS();
- virtual ~CPDF_IndexedCS();
- virtual FX_BOOL v_Load(CPDF_Document* pDoc, CPDF_Array* pArray);
- void GetDefaultValue(int iComponent, FX_FLOAT& min, FX_FLOAT& max) const
- {
- min = 0;
- max = (FX_FLOAT)m_MaxIndex;
- }
- virtual FX_BOOL GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const;
- virtual CPDF_ColorSpace* GetBaseCS() const
- {
- return m_pBaseCS;
- }
- virtual void EnableStdConversion(FX_BOOL bEnabled);
- CPDF_ColorSpace* m_pBaseCS;
- int m_nBaseComponents;
- int m_MaxIndex;
- CFX_ByteString m_Table;
- FX_FLOAT* m_pCompMinMax;
-};
-CPDF_IndexedCS::CPDF_IndexedCS()
-{
- m_pBaseCS = NULL;
- m_Family = PDFCS_INDEXED;
- m_nComponents = 1;
- m_pCompMinMax = NULL;
-}
-CPDF_IndexedCS::~CPDF_IndexedCS()
-{
- if (m_pCompMinMax) {
- FX_Free(m_pCompMinMax);
- }
- CPDF_ColorSpace* pCS = m_pBaseCS;
- if (pCS && m_pDocument) {
- m_pDocument->GetPageData()->ReleaseColorSpace(pCS->GetArray());
- }
-}
-FX_BOOL CPDF_IndexedCS::v_Load(CPDF_Document* pDoc, CPDF_Array* pArray)
-{
- if (pArray->GetCount() < 4) {
- return FALSE;
- }
- CPDF_Object* pBaseObj = pArray->GetElementValue(1);
- if (pBaseObj == m_pArray) {
- return FALSE;
- }
- CPDF_DocPageData* pDocPageData = pDoc->GetPageData();
- m_pBaseCS = pDocPageData->GetColorSpace(pBaseObj, NULL);
- if (m_pBaseCS == NULL) {
- return FALSE;
- }
- m_nBaseComponents = m_pBaseCS->CountComponents();
- m_pCompMinMax = FX_Alloc(FX_FLOAT, m_nBaseComponents * 2);
- FX_FLOAT defvalue;
- for (int i = 0; i < m_nBaseComponents; i ++) {
- m_pBaseCS->GetDefaultValue(i, defvalue, m_pCompMinMax[i * 2], m_pCompMinMax[i * 2 + 1]);
- m_pCompMinMax[i * 2 + 1] -= m_pCompMinMax[i * 2];
- }
- m_MaxIndex = pArray->GetInteger(2);
- CPDF_Object* pTableObj = pArray->GetElementValue(3);
- if (pTableObj == NULL) {
- return FALSE;
- }
- FX_LPCBYTE pTable = NULL;
- FX_DWORD size = 0;
- CPDF_StreamAcc* pStreamAcc = NULL;
- if (pTableObj->GetType() == PDFOBJ_STRING) {
- m_Table = ((CPDF_String*)pTableObj)->GetString();
- } else if (pTableObj->GetType() == PDFOBJ_STREAM) {
- CPDF_StreamAcc acc;
- acc.LoadAllData((CPDF_Stream*)pTableObj, FALSE);
- m_Table = CFX_ByteStringC(acc.GetData(), acc.GetSize());
- }
- return TRUE;
-}
-FX_BOOL CPDF_IndexedCS::GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const
-{
- int index = (FX_INT32)(*pBuf);
- if (index < 0 || index > m_MaxIndex) {
- return FALSE;
- }
- if (m_nBaseComponents) {
- if (index == INT_MAX || (index + 1) > INT_MAX / m_nBaseComponents ||
- (index + 1)*m_nBaseComponents > (int)m_Table.GetLength()) {
- R = G = B = 0;
- return FALSE;
- }
- }
- CFX_FixedBufGrow<FX_FLOAT, 16> Comps(m_nBaseComponents);
- FX_FLOAT* comps = Comps;
- FX_LPCBYTE pTable = m_Table;
- for (int i = 0; i < m_nBaseComponents; i ++) {
- comps[i] = m_pCompMinMax[i * 2] + m_pCompMinMax[i * 2 + 1] * pTable[index * m_nBaseComponents + i] / 255;
- }
- m_pBaseCS->GetRGB(comps, R, G, B);
- return TRUE;
-}
-void CPDF_IndexedCS::EnableStdConversion(FX_BOOL bEnabled)
-{
- CPDF_ColorSpace::EnableStdConversion(bEnabled);
- if (m_pBaseCS) {
- m_pBaseCS->EnableStdConversion(bEnabled);
- }
-}
-#define MAX_PATTERN_COLORCOMPS 16
-typedef struct _PatternValue {
- CPDF_Pattern* m_pPattern;
- int m_nComps;
- FX_FLOAT m_Comps[MAX_PATTERN_COLORCOMPS];
-} PatternValue;
-CPDF_PatternCS::CPDF_PatternCS()
-{
- m_Family = PDFCS_PATTERN;
- m_pBaseCS = NULL;
- m_nComponents = 1;
-}
-CPDF_PatternCS::~CPDF_PatternCS()
-{
- CPDF_ColorSpace* pCS = m_pBaseCS;
- if (pCS && m_pDocument) {
- m_pDocument->GetPageData()->ReleaseColorSpace(pCS->GetArray());
- }
-}
-FX_BOOL CPDF_PatternCS::v_Load(CPDF_Document* pDoc, CPDF_Array* pArray)
-{
- CPDF_Object* pBaseCS = pArray->GetElementValue(1);
- if (pBaseCS == m_pArray) {
- return FALSE;
- }
- CPDF_DocPageData* pDocPageData = pDoc->GetPageData();
- m_pBaseCS = pDocPageData->GetColorSpace(pBaseCS, NULL);
- if (m_pBaseCS) {
- m_nComponents = m_pBaseCS->CountComponents() + 1;
- if (m_pBaseCS->CountComponents() > MAX_PATTERN_COLORCOMPS) {
- return FALSE;
- }
- } else {
- m_nComponents = 1;
- }
- return TRUE;
-}
-FX_BOOL CPDF_PatternCS::GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const
-{
- if (m_pBaseCS) {
- PatternValue* pvalue = (PatternValue*)pBuf;
- m_pBaseCS->GetRGB(pvalue->m_Comps, R, G, B);
- return TRUE;
- }
- R = G = B = 0.75f;
- return FALSE;
-}
-class CPDF_SeparationCS : public CPDF_ColorSpace
-{
-public:
- CPDF_SeparationCS();
- virtual ~CPDF_SeparationCS();
- virtual void GetDefaultValue(int iComponent, FX_FLOAT& value, FX_FLOAT& min, FX_FLOAT& max) const
- {
- value = 1.0f;
- min = 0;
- max = 1.0f;
- }
- virtual FX_BOOL v_Load(CPDF_Document* pDoc, CPDF_Array* pArray);
- virtual FX_BOOL GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const;
- virtual void EnableStdConversion(FX_BOOL bEnabled);
- CPDF_ColorSpace* m_pAltCS;
- CPDF_Function* m_pFunc;
- enum {None, All, Colorant} m_Type;
-};
-CPDF_SeparationCS::CPDF_SeparationCS()
-{
- m_Family = PDFCS_SEPARATION;
- m_pAltCS = NULL;
- m_pFunc = NULL;
- m_nComponents = 1;
-}
-CPDF_SeparationCS::~CPDF_SeparationCS()
-{
- if (m_pAltCS) {
- m_pAltCS->ReleaseCS();
- }
- if (m_pFunc) {
- delete m_pFunc;
- }
-}
-FX_BOOL CPDF_SeparationCS::v_Load(CPDF_Document* pDoc, CPDF_Array* pArray)
-{
- CFX_ByteString name = pArray->GetString(1);
- if (name == FX_BSTRC("None")) {
- m_Type = None;
- } else {
- m_Type = Colorant;
- CPDF_Object* pAltCS = pArray->GetElementValue(2);
- if (pAltCS == m_pArray) {
- return FALSE;
- }
- m_pAltCS = Load(pDoc, pAltCS);
- CPDF_Object* pFuncObj = pArray->GetElementValue(3);
- if (pFuncObj && pFuncObj->GetType() != PDFOBJ_NAME) {
- m_pFunc = CPDF_Function::Load(pFuncObj);
- }
- if (m_pFunc && m_pAltCS && m_pFunc->CountOutputs() < m_pAltCS->CountComponents()) {
- delete m_pFunc;
- m_pFunc = NULL;
- }
- }
- return TRUE;
-}
-FX_BOOL CPDF_SeparationCS::GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const
-{
- if (m_Type == None) {
- return FALSE;
- }
- if (m_pFunc == NULL) {
- if (m_pAltCS == NULL) {
- return FALSE;
- }
- int nComps = m_pAltCS->CountComponents();
- CFX_FixedBufGrow<FX_FLOAT, 16> results(nComps);
- for (int i = 0; i < nComps; i ++) {
- results[i] = *pBuf;
- }
- m_pAltCS->GetRGB(results, R, G, B);
- return TRUE;
- }
- CFX_FixedBufGrow<FX_FLOAT, 16> results(m_pFunc->CountOutputs());
- int nresults;
- m_pFunc->Call(pBuf, 1, results, nresults);
- if (nresults == 0) {
- return FALSE;
- }
- if (m_pAltCS) {
- m_pAltCS->GetRGB(results, R, G, B);
- return TRUE;
- } else {
- R = G = B = 0;
- return FALSE;
- }
-}
-void CPDF_SeparationCS::EnableStdConversion(FX_BOOL bEnabled)
-{
- CPDF_ColorSpace::EnableStdConversion(bEnabled);
- if (m_pAltCS) {
- m_pAltCS->EnableStdConversion(bEnabled);
- }
-}
-class CPDF_DeviceNCS : public CPDF_ColorSpace
-{
-public:
- CPDF_DeviceNCS();
- virtual ~CPDF_DeviceNCS();
- virtual void GetDefaultValue(int iComponent, FX_FLOAT& value, FX_FLOAT& min, FX_FLOAT& max) const
- {
- value = 1.0f;
- min = 0;
- max = 1.0f;
- }
- virtual FX_BOOL v_Load(CPDF_Document* pDoc, CPDF_Array* pArray);
- virtual FX_BOOL GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const;
- virtual void EnableStdConversion(FX_BOOL bEnabled);
- CPDF_ColorSpace* m_pAltCS;
- CPDF_Function* m_pFunc;
-};
-CPDF_DeviceNCS::CPDF_DeviceNCS()
-{
- m_Family = PDFCS_DEVICEN;
- m_pAltCS = NULL;
- m_pFunc = NULL;
-}
-CPDF_DeviceNCS::~CPDF_DeviceNCS()
-{
- if (m_pFunc) {
- delete m_pFunc;
- }
- if (m_pAltCS) {
- m_pAltCS->ReleaseCS();
- }
-}
-FX_BOOL CPDF_DeviceNCS::v_Load(CPDF_Document* pDoc, CPDF_Array* pArray)
-{
- CPDF_Object* pObj = pArray->GetElementValue(1);
- if (!pObj) {
- return FALSE;
- }
- if (pObj->GetType() != PDFOBJ_ARRAY) {
- return FALSE;
- }
- m_nComponents = ((CPDF_Array*)pObj)->GetCount();
- CPDF_Object* pAltCS = pArray->GetElementValue(2);
- if (!pAltCS || pAltCS == m_pArray) {
- return FALSE;
- }
- m_pAltCS = Load(pDoc, pAltCS);
- m_pFunc = CPDF_Function::Load(pArray->GetElementValue(3));
- if (m_pAltCS == NULL || m_pFunc == NULL) {
- return FALSE;
- }
- if (m_pFunc->CountOutputs() < m_pAltCS->CountComponents()) {
- return FALSE;
- }
- return TRUE;
-}
-FX_BOOL CPDF_DeviceNCS::GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const
-{
- if (m_pFunc == NULL) {
- return FALSE;
- }
- CFX_FixedBufGrow<FX_FLOAT, 16> results(m_pFunc->CountOutputs());
- int nresults;
- m_pFunc->Call(pBuf, m_nComponents, results, nresults);
- if (nresults == 0) {
- return FALSE;
- }
- m_pAltCS->GetRGB(results, R, G, B);
- return TRUE;
-}
-void CPDF_DeviceNCS::EnableStdConversion(FX_BOOL bEnabled)
-{
- CPDF_ColorSpace::EnableStdConversion(bEnabled);
- if (m_pAltCS) {
- m_pAltCS->EnableStdConversion(bEnabled);
- }
-}
-CPDF_ColorSpace* CPDF_ColorSpace::GetStockCS(int family)
-{
- return CPDF_ModuleMgr::Get()->GetPageModule()->GetStockCS(family);;
-}
-CPDF_ColorSpace* _CSFromName(const CFX_ByteString& name)
-{
- if (name == FX_BSTRC("DeviceRGB") || name == FX_BSTRC("RGB")) {
- return CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB);
- }
- if (name == FX_BSTRC("DeviceGray") || name == FX_BSTRC("G")) {
- return CPDF_ColorSpace::GetStockCS(PDFCS_DEVICEGRAY);
- }
- if (name == FX_BSTRC("DeviceCMYK") || name == FX_BSTRC("CMYK")) {
- return CPDF_ColorSpace::GetStockCS(PDFCS_DEVICECMYK);
- }
- if (name == FX_BSTRC("Pattern")) {
- return CPDF_ColorSpace::GetStockCS(PDFCS_PATTERN);
- }
- return NULL;
-}
-CPDF_ColorSpace* CPDF_ColorSpace::Load(CPDF_Document* pDoc, CPDF_Object* pObj)
-{
- if (pObj == NULL) {
- return NULL;
- }
- if (pObj->GetType() == PDFOBJ_NAME) {
- return _CSFromName(pObj->GetString());
- }
- if (pObj->GetType() == PDFOBJ_STREAM) {
- CPDF_Dictionary *pDict = ((CPDF_Stream *)pObj)->GetDict();
- if (!pDict) {
- return NULL;
- }
- CPDF_ColorSpace *pRet = NULL;
- FX_POSITION pos = pDict->GetStartPos();
- while (pos) {
- CFX_ByteString bsKey;
- CPDF_Object *pValue = pDict->GetNextElement(pos, bsKey);
- if (pValue->GetType() == PDFOBJ_NAME) {
- pRet = _CSFromName(pValue->GetString());
- }
- if (pRet) {
- return pRet;
- }
- }
- return NULL;
- }
- if (pObj->GetType() != PDFOBJ_ARRAY) {
- return NULL;
- }
- CPDF_Array* pArray = (CPDF_Array*)pObj;
- if (pArray->GetCount() == 0) {
- return NULL;
- }
- CFX_ByteString familyname = pArray->GetElementValue(0)->GetString();
- if (pArray->GetCount() == 1) {
- return _CSFromName(familyname);
- }
- CPDF_ColorSpace* pCS = NULL;
- FX_DWORD id = familyname.GetID();
- if (id == FXBSTR_ID('C', 'a', 'l', 'G')) {
- pCS = FX_NEW CPDF_CalGray();
- } else if (id == FXBSTR_ID('C', 'a', 'l', 'R')) {
- pCS = FX_NEW CPDF_CalRGB();
- } else if (id == FXBSTR_ID('L', 'a', 'b', 0)) {
- pCS = FX_NEW CPDF_LabCS();
- } else if (id == FXBSTR_ID('I', 'C', 'C', 'B')) {
- pCS = FX_NEW CPDF_ICCBasedCS();
- } else if (id == FXBSTR_ID('I', 'n', 'd', 'e') || id == FXBSTR_ID('I', 0, 0, 0)) {
- pCS = FX_NEW CPDF_IndexedCS();
- } else if (id == FXBSTR_ID('S', 'e', 'p', 'a')) {
- pCS = FX_NEW CPDF_SeparationCS();
- } else if (id == FXBSTR_ID('D', 'e', 'v', 'i')) {
- pCS = FX_NEW CPDF_DeviceNCS();
- } else if (id == FXBSTR_ID('P', 'a', 't', 't')) {
- pCS = FX_NEW CPDF_PatternCS();
- } else {
- return NULL;
- }
- pCS->m_pDocument = pDoc;
- pCS->m_pArray = pArray;
- if (!pCS->v_Load(pDoc, pArray)) {
- pCS->ReleaseCS();
- return NULL;
- }
- return pCS;
-}
-CPDF_ColorSpace::CPDF_ColorSpace()
-{
- m_Family = 0;
- m_pArray = NULL;
- m_dwStdConversion = 0;
- m_pDocument = NULL;
-}
-void CPDF_ColorSpace::ReleaseCS()
-{
- if (this == GetStockCS(PDFCS_DEVICERGB)) {
- return;
- }
- if (this == GetStockCS(PDFCS_DEVICEGRAY)) {
- return;
- }
- if (this == GetStockCS(PDFCS_DEVICECMYK)) {
- return;
- }
- if (this == GetStockCS(PDFCS_PATTERN)) {
- return;
- }
- delete this;
-}
-int CPDF_ColorSpace::GetBufSize() const
-{
- if (m_Family == PDFCS_PATTERN) {
- return sizeof(PatternValue);
- }
- return m_nComponents * sizeof(FX_FLOAT);
-}
-FX_FLOAT* CPDF_ColorSpace::CreateBuf()
-{
- int size = GetBufSize();
- FX_BYTE* pBuf = FX_Alloc(FX_BYTE, size);
- FXSYS_memset32(pBuf, 0, size);
- return (FX_FLOAT*)pBuf;
-}
-FX_BOOL CPDF_ColorSpace::sRGB() const
-{
- if (m_Family == PDFCS_DEVICERGB) {
- return TRUE;
- }
- if (m_Family != PDFCS_ICCBASED) {
- return FALSE;
- }
- CPDF_ICCBasedCS* pCS = (CPDF_ICCBasedCS*)this;
- return pCS->m_pProfile->m_bsRGB;
-}
-FX_BOOL CPDF_ColorSpace::GetCMYK(FX_FLOAT* pBuf, FX_FLOAT& c, FX_FLOAT& m, FX_FLOAT& y, FX_FLOAT& k) const
-{
- if (v_GetCMYK(pBuf, c, m, y, k)) {
- return TRUE;
- }
- FX_FLOAT R, G, B;
- if (!GetRGB(pBuf, R, G, B)) {
- return FALSE;
- }
- sRGB_to_AdobeCMYK(R, G, B, c, m, y, k);
- return TRUE;
-}
-FX_BOOL CPDF_ColorSpace::SetCMYK(FX_FLOAT* pBuf, FX_FLOAT c, FX_FLOAT m, FX_FLOAT y, FX_FLOAT k) const
-{
- if (v_SetCMYK(pBuf, c, m, y, k)) {
- return TRUE;
- }
- FX_FLOAT R, G, B;
- AdobeCMYK_to_sRGB(c, m, y, k, R, G, B);
- return SetRGB(pBuf, R, G, B);
-}
-void CPDF_ColorSpace::GetDefaultColor(FX_FLOAT* buf) const
-{
- if (buf == NULL || m_Family == PDFCS_PATTERN) {
- return;
- }
- FX_FLOAT min, max;
- for (int i = 0; i < m_nComponents; i ++) {
- GetDefaultValue(i, buf[i], min, max);
- }
-}
-int CPDF_ColorSpace::GetMaxIndex() const
-{
- if (m_Family != PDFCS_INDEXED) {
- return 0;
- }
- CPDF_IndexedCS* pCS = (CPDF_IndexedCS*)this;
- return pCS->m_MaxIndex;
-}
-void CPDF_ColorSpace::TranslateImageLine(FX_LPBYTE dest_buf, FX_LPCBYTE src_buf, int pixels, int image_width, int image_height, FX_BOOL bTransMask) const
-{
- CFX_FixedBufGrow<FX_FLOAT, 16> srcbuf(m_nComponents);
- FX_FLOAT* src = srcbuf;
- FX_FLOAT R, G, B;
- for (int i = 0; i < pixels; i ++) {
- for (int j = 0; j < m_nComponents; j ++)
- if (m_Family == PDFCS_INDEXED) {
- src[j] = (FX_FLOAT)(*src_buf ++);
- } else {
- src[j] = (FX_FLOAT)(*src_buf ++) / 255;
- }
- GetRGB(src, R, G, B);
- *dest_buf ++ = (FX_INT32)(B * 255);
- *dest_buf ++ = (FX_INT32)(G * 255);
- *dest_buf ++ = (FX_INT32)(R * 255);
- }
-}
-void CPDF_ColorSpace::EnableStdConversion(FX_BOOL bEnabled)
-{
- if (bEnabled) {
- m_dwStdConversion ++;
- } else if (m_dwStdConversion) {
- m_dwStdConversion --;
- }
-}
-CPDF_Color::CPDF_Color(int family)
-{
- m_pCS = CPDF_ColorSpace::GetStockCS(family);
- int nComps = 3;
- if (family == PDFCS_DEVICEGRAY) {
- nComps = 1;
- } else if (family == PDFCS_DEVICECMYK) {
- nComps = 4;
- }
- m_pBuffer = FX_Alloc(FX_FLOAT, nComps);
- for (int i = 0; i < nComps; i ++) {
- m_pBuffer[i] = 0;
- }
-}
-CPDF_Color::~CPDF_Color()
-{
- ReleaseBuffer();
- ReleaseColorSpace();
-}
-void CPDF_Color::ReleaseBuffer()
-{
- if (!m_pBuffer) {
- return;
- }
- if (m_pCS->GetFamily() == PDFCS_PATTERN) {
- PatternValue* pvalue = (PatternValue*)m_pBuffer;
- CPDF_Pattern* pPattern = pvalue->m_pPattern;
- if (pPattern && pPattern->m_pDocument) {
- pPattern->m_pDocument->GetPageData()->ReleasePattern(pPattern->m_pPatternObj);
- }
- }
- FX_Free(m_pBuffer);
- m_pBuffer = NULL;
-}
-void CPDF_Color::ReleaseColorSpace()
-{
- if (m_pCS && m_pCS->m_pDocument && m_pCS->GetArray()) {
- m_pCS->m_pDocument->GetPageData()->ReleaseColorSpace(m_pCS->GetArray());
- m_pCS = NULL;
- }
-}
-void CPDF_Color::SetColorSpace(CPDF_ColorSpace* pCS)
-{
- if (m_pCS == pCS) {
- if (m_pBuffer == NULL) {
- m_pBuffer = pCS->CreateBuf();
- }
- ReleaseColorSpace();
- m_pCS = pCS;
- return;
- }
- ReleaseBuffer();
- ReleaseColorSpace();
- m_pCS = pCS;
- if (m_pCS) {
- m_pBuffer = pCS->CreateBuf();
- pCS->GetDefaultColor(m_pBuffer);
- }
-}
-void CPDF_Color::SetValue(FX_FLOAT* comps)
-{
- if (m_pBuffer == NULL) {
- return;
- }
- if (m_pCS->GetFamily() != PDFCS_PATTERN) {
- FXSYS_memcpy32(m_pBuffer, comps, m_pCS->CountComponents() * sizeof(FX_FLOAT));
- }
-}
-void CPDF_Color::SetValue(CPDF_Pattern* pPattern, FX_FLOAT* comps, int ncomps)
-{
- if (ncomps > MAX_PATTERN_COLORCOMPS) {
- return;
- }
- if (m_pCS == NULL || m_pCS->GetFamily() != PDFCS_PATTERN) {
- if (m_pBuffer) {
- FX_Free(m_pBuffer);
- }
- m_pCS = CPDF_ColorSpace::GetStockCS(PDFCS_PATTERN);
- m_pBuffer = m_pCS->CreateBuf();
- }
- CPDF_DocPageData* pDocPageData = NULL;
- PatternValue* pvalue = (PatternValue*)m_pBuffer;
- if (pvalue->m_pPattern && pvalue->m_pPattern->m_pDocument) {
- pDocPageData = pvalue->m_pPattern->m_pDocument->GetPageData();
- pDocPageData->ReleasePattern(pvalue->m_pPattern->m_pPatternObj);
- }
- pvalue->m_nComps = ncomps;
- pvalue->m_pPattern = pPattern;
- if (ncomps) {
- FXSYS_memcpy32(pvalue->m_Comps, comps, ncomps * sizeof(FX_FLOAT));
- }
-}
-void CPDF_Color::Copy(const CPDF_Color* pSrc)
-{
- ReleaseBuffer();
- ReleaseColorSpace();
- m_pCS = pSrc->m_pCS;
- if (m_pCS && m_pCS->m_pDocument) {
- CPDF_Array* pArray = m_pCS->GetArray();
- if (pArray) {
- m_pCS = m_pCS->m_pDocument->GetPageData()->GetCopiedColorSpace(pArray);
- }
- }
- if (m_pCS == NULL) {
- return;
- }
- m_pBuffer = m_pCS->CreateBuf();
- FXSYS_memcpy32(m_pBuffer, pSrc->m_pBuffer, m_pCS->GetBufSize());
- if (m_pCS->GetFamily() == PDFCS_PATTERN) {
- PatternValue* pvalue = (PatternValue*)m_pBuffer;
- if (pvalue->m_pPattern && pvalue->m_pPattern->m_pDocument) {
- pvalue->m_pPattern = pvalue->m_pPattern->m_pDocument->GetPageData()->GetPattern(pvalue->m_pPattern->m_pPatternObj, FALSE, &pvalue->m_pPattern->m_ParentMatrix);
- }
- }
-}
-FX_BOOL CPDF_Color::GetRGB(int& R, int& G, int& B) const
-{
- if (m_pCS == NULL || m_pBuffer == NULL) {
- return FALSE;
- }
- FX_FLOAT r, g, b;
- if (!m_pCS->GetRGB(m_pBuffer, r, g, b)) {
- return FALSE;
- }
- R = (FX_INT32)(r * 255 + 0.5f);
- G = (FX_INT32)(g * 255 + 0.5f);
- B = (FX_INT32)(b * 255 + 0.5f);
- return TRUE;
-}
-CPDF_Pattern* CPDF_Color::GetPattern() const
-{
- if (m_pBuffer == NULL || m_pCS->GetFamily() != PDFCS_PATTERN) {
- return NULL;
- }
- PatternValue* pvalue = (PatternValue*)m_pBuffer;
- return pvalue->m_pPattern;
-}
-CPDF_ColorSpace* CPDF_Color::GetPatternCS() const
-{
- if (m_pBuffer == NULL || m_pCS->GetFamily() != PDFCS_PATTERN) {
- return NULL;
- }
- return m_pCS->GetBaseCS();
-}
-FX_FLOAT* CPDF_Color::GetPatternColor() const
-{
- if (m_pBuffer == NULL || m_pCS->GetFamily() != PDFCS_PATTERN) {
- return NULL;
- }
- PatternValue* pvalue = (PatternValue*)m_pBuffer;
- return pvalue->m_nComps ? pvalue->m_Comps : NULL;
-}
-FX_BOOL CPDF_Color::IsEqual(const CPDF_Color& other) const
-{
- if (m_pCS != other.m_pCS || m_pCS == NULL) {
- return FALSE;
- }
- return FXSYS_memcmp32(m_pBuffer, other.m_pBuffer, m_pCS->GetBufSize()) == 0;
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fpdfapi/fpdf_page.h"
+#include "../../../include/fpdfapi/fpdf_module.h"
+#include "../../../include/fxcodec/fx_codec.h"
+#include "pageint.h"
+#include <limits.h>
+void sRGB_to_AdobeCMYK(FX_FLOAT R, FX_FLOAT G, FX_FLOAT B, FX_FLOAT& c, FX_FLOAT& m, FX_FLOAT& y, FX_FLOAT& k)
+{
+ c = 1.0f - R;
+ m = 1.0f - G;
+ y = 1.0f - B;
+ k = c;
+ if (m < k) {
+ k = m;
+ }
+ if (y < k) {
+ k = y;
+ }
+}
+CPDF_DeviceCS::CPDF_DeviceCS(int family)
+{
+ m_Family = family;
+ if (m_Family == PDFCS_DEVICERGB) {
+ m_nComponents = 3;
+ } else if (m_Family == PDFCS_DEVICEGRAY) {
+ m_nComponents = 1;
+ } else {
+ m_nComponents = 4;
+ }
+}
+FX_BOOL CPDF_DeviceCS::GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const
+{
+ if (m_Family == PDFCS_DEVICERGB) {
+ R = pBuf[0];
+ if (R < 0) {
+ R = 0;
+ } else if (R > 1) {
+ R = 1;
+ }
+ G = pBuf[1];
+ if (G < 0) {
+ G = 0;
+ } else if (G > 1) {
+ G = 1;
+ }
+ B = pBuf[2];
+ if (B < 0) {
+ B = 0;
+ } else if (B > 1) {
+ B = 1;
+ }
+ } else if (m_Family == PDFCS_DEVICEGRAY) {
+ R = *pBuf;
+ if (R < 0) {
+ R = 0;
+ } else if (R > 1) {
+ R = 1;
+ }
+ G = B = R;
+ } else if (m_Family == PDFCS_DEVICECMYK) {
+ if (!m_dwStdConversion) {
+ AdobeCMYK_to_sRGB(pBuf[0], pBuf[1], pBuf[2], pBuf[3], R, G, B);
+ } else {
+ FX_FLOAT k = pBuf[3];
+ R = 1.0f - FX_MIN(1.0f, pBuf[0] + k);
+ G = 1.0f - FX_MIN(1.0f, pBuf[1] + k);
+ B = 1.0f - FX_MIN(1.0f, pBuf[2] + k);
+ }
+ } else {
+ ASSERT(m_Family == PDFCS_PATTERN);
+ R = G = B = 0;
+ return FALSE;
+ }
+ return TRUE;
+}
+FX_BOOL CPDF_DeviceCS::v_GetCMYK(FX_FLOAT* pBuf, FX_FLOAT& c, FX_FLOAT& m, FX_FLOAT& y, FX_FLOAT& k) const
+{
+ if (m_Family != PDFCS_DEVICECMYK) {
+ return FALSE;
+ }
+ c = pBuf[0];
+ m = pBuf[1];
+ y = pBuf[2];
+ k = pBuf[3];
+ return TRUE;
+}
+FX_BOOL CPDF_DeviceCS::SetRGB(FX_FLOAT* pBuf, FX_FLOAT R, FX_FLOAT G, FX_FLOAT B) const
+{
+ if (m_Family == PDFCS_DEVICERGB) {
+ pBuf[0] = R;
+ pBuf[1] = G;
+ pBuf[2] = B;
+ return TRUE;
+ } else if (m_Family == PDFCS_DEVICEGRAY) {
+ if (R == G && R == B) {
+ *pBuf = R;
+ return TRUE;
+ } else {
+ return FALSE;
+ }
+ } else if (m_Family == PDFCS_DEVICECMYK) {
+ sRGB_to_AdobeCMYK(R, G, B, pBuf[0], pBuf[1], pBuf[2], pBuf[3]);
+ return TRUE;
+ }
+ return FALSE;
+}
+FX_BOOL CPDF_DeviceCS::v_SetCMYK(FX_FLOAT* pBuf, FX_FLOAT c, FX_FLOAT m, FX_FLOAT y, FX_FLOAT k) const
+{
+ if (m_Family == PDFCS_DEVICERGB) {
+ AdobeCMYK_to_sRGB(c, m, y, k, pBuf[0], pBuf[1], pBuf[2]);
+ return TRUE;
+ } else if (m_Family == PDFCS_DEVICEGRAY) {
+ return FALSE;
+ } else if (m_Family == PDFCS_DEVICECMYK) {
+ pBuf[0] = c;
+ pBuf[1] = m;
+ pBuf[2] = y;
+ pBuf[3] = k;
+ return TRUE;
+ }
+ return FALSE;
+}
+static void ReverseRGB(FX_LPBYTE pDestBuf, FX_LPCBYTE pSrcBuf, int pixels)
+{
+ if (pDestBuf == pSrcBuf)
+ for (int i = 0; i < pixels; i ++) {
+ FX_BYTE temp = pDestBuf[2];
+ pDestBuf[2] = pDestBuf[0];
+ pDestBuf[0] = temp;
+ pDestBuf += 3;
+ }
+ else
+ for (int i = 0; i < pixels; i ++) {
+ *pDestBuf ++ = pSrcBuf[2];
+ *pDestBuf ++ = pSrcBuf[1];
+ *pDestBuf ++ = pSrcBuf[0];
+ pSrcBuf += 3;
+ }
+}
+void CPDF_DeviceCS::TranslateImageLine(FX_LPBYTE pDestBuf, FX_LPCBYTE pSrcBuf, int pixels, int image_width, int image_height, FX_BOOL bTransMask) const
+{
+ if (bTransMask && m_Family == PDFCS_DEVICECMYK) {
+ for (int i = 0; i < pixels; i ++) {
+ int k = 255 - pSrcBuf[3];
+ pDestBuf[0] = ((255 - pSrcBuf[0]) * k) / 255;
+ pDestBuf[1] = ((255 - pSrcBuf[1]) * k) / 255;
+ pDestBuf[2] = ((255 - pSrcBuf[2]) * k) / 255;
+ pDestBuf += 3;
+ pSrcBuf += 4;
+ }
+ return;
+ }
+ if (m_Family == PDFCS_DEVICERGB) {
+ ReverseRGB(pDestBuf, pSrcBuf, pixels);
+ } else if (m_Family == PDFCS_DEVICEGRAY) {
+ for (int i = 0; i < pixels; i ++) {
+ *pDestBuf ++ = pSrcBuf[i];
+ *pDestBuf ++ = pSrcBuf[i];
+ *pDestBuf ++ = pSrcBuf[i];
+ }
+ } else {
+ for (int i = 0; i < pixels; i ++) {
+ if (!m_dwStdConversion) {
+ AdobeCMYK_to_sRGB1(pSrcBuf[0], pSrcBuf[1], pSrcBuf[2], pSrcBuf[3], pDestBuf[2], pDestBuf[1], pDestBuf[0]);
+ } else {
+ FX_BYTE k = pSrcBuf[3];
+ pDestBuf[2] = 255 - FX_MIN(255, pSrcBuf[0] + k);
+ pDestBuf[1] = 255 - FX_MIN(255, pSrcBuf[1] + k);
+ pDestBuf[0] = 255 - FX_MIN(255, pSrcBuf[2] + k);
+ }
+ pSrcBuf += 4;
+ pDestBuf += 3;
+ }
+ }
+}
+const FX_BYTE g_sRGBSamples1[] = {
+ 0, 3, 6, 10, 13, 15, 18, 20, 22, 23, 25, 27, 28, 30, 31, 32,
+ 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49,
+ 49, 50, 51, 52, 53, 53, 54, 55, 56, 56, 57, 58, 58, 59, 60, 61,
+ 61, 62, 62, 63, 64, 64, 65, 66, 66, 67, 67, 68, 68, 69, 70, 70,
+ 71, 71, 72, 72, 73, 73, 74, 74, 75, 76, 76, 77, 77, 78, 78, 79,
+ 79, 79, 80, 80, 81, 81, 82, 82, 83, 83, 84, 84, 85, 85, 85, 86,
+ 86, 87, 87, 88, 88, 88, 89, 89, 90, 90, 91, 91, 91, 92, 92, 93,
+ 93, 93, 94, 94, 95, 95, 95, 96, 96, 97, 97, 97, 98, 98, 98, 99,
+ 99, 99, 100, 100, 101, 101, 101, 102, 102, 102, 103, 103, 103, 104, 104, 104,
+ 105, 105, 106, 106, 106, 107, 107, 107, 108, 108, 108, 109, 109, 109, 110, 110,
+ 110, 110, 111, 111, 111, 112, 112, 112, 113, 113, 113, 114, 114, 114, 115, 115,
+ 115, 115, 116, 116, 116, 117, 117, 117, 118, 118, 118, 118, 119, 119, 119, 120,
+};
+const FX_BYTE g_sRGBSamples2[] = {
+ 120, 121, 122, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136,
+ 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 148, 149, 150, 151,
+ 152, 153, 154, 155, 155, 156, 157, 158, 159, 159, 160, 161, 162, 163, 163, 164,
+ 165, 166, 167, 167, 168, 169, 170, 170, 171, 172, 173, 173, 174, 175, 175, 176,
+ 177, 178, 178, 179, 180, 180, 181, 182, 182, 183, 184, 185, 185, 186, 187, 187,
+ 188, 189, 189, 190, 190, 191, 192, 192, 193, 194, 194, 195, 196, 196, 197, 197,
+ 198, 199, 199, 200, 200, 201, 202, 202, 203, 203, 204, 205, 205, 206, 206, 207,
+ 208, 208, 209, 209, 210, 210, 211, 212, 212, 213, 213, 214, 214, 215, 215, 216,
+ 216, 217, 218, 218, 219, 219, 220, 220, 221, 221, 222, 222, 223, 223, 224, 224,
+ 225, 226, 226, 227, 227, 228, 228, 229, 229, 230, 230, 231, 231, 232, 232, 233,
+ 233, 234, 234, 235, 235, 236, 236, 237, 237, 238, 238, 238, 239, 239, 240, 240,
+ 241, 241, 242, 242, 243, 243, 244, 244, 245, 245, 246, 246, 246, 247, 247, 248,
+ 248, 249, 249, 250, 250, 251, 251, 251, 252, 252, 253, 253, 254, 254, 255, 255,
+};
+static void XYZ_to_sRGB(FX_FLOAT X, FX_FLOAT Y, FX_FLOAT Z, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B)
+{
+ FX_FLOAT R1 = 3.2410f * X - 1.5374f * Y - 0.4986f * Z;
+ FX_FLOAT G1 = -0.9692f * X + 1.8760f * Y + 0.0416f * Z;
+ FX_FLOAT B1 = 0.0556f * X - 0.2040f * Y + 1.0570f * Z;
+ if (R1 > 1) {
+ R1 = 1;
+ }
+ if (R1 < 0) {
+ R1 = 0;
+ }
+ if (G1 > 1) {
+ G1 = 1;
+ }
+ if (G1 < 0) {
+ G1 = 0;
+ }
+ if (B1 > 1) {
+ B1 = 1;
+ }
+ if (B1 < 0) {
+ B1 = 0;
+ }
+ int scale = (int)(R1 * 1023);
+ if (scale < 0) {
+ scale = 0;
+ }
+ if (scale < 192) {
+ R = (g_sRGBSamples1[scale] / 255.0f);
+ } else {
+ R = (g_sRGBSamples2[scale / 4 - 48] / 255.0f);
+ }
+ scale = (int)(G1 * 1023);
+ if (scale < 0) {
+ scale = 0;
+ }
+ if (scale < 192) {
+ G = (g_sRGBSamples1[scale] / 255.0f);
+ } else {
+ G = (g_sRGBSamples2[scale / 4 - 48] / 255.0f);
+ }
+ scale = (int)(B1 * 1023);
+ if (scale < 0) {
+ scale = 0;
+ }
+ if (scale < 192) {
+ B = (g_sRGBSamples1[scale] / 255.0f);
+ } else {
+ B = (g_sRGBSamples2[scale / 4 - 48] / 255.0f);
+ }
+}
+class CPDF_CalGray : public CPDF_ColorSpace
+{
+public:
+ CPDF_CalGray();
+ virtual FX_BOOL v_Load(CPDF_Document* pDoc, CPDF_Array* pArray);
+ virtual FX_BOOL GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const;
+ virtual void TranslateImageLine(FX_LPBYTE pDestBuf, FX_LPCBYTE pSrcBuf, int pixels, int image_width, int image_height, FX_BOOL bTransMask = FALSE) const;
+ FX_BOOL SetRGB(FX_FLOAT* pBuf, FX_FLOAT R, FX_FLOAT G, FX_FLOAT B) const;
+ FX_FLOAT m_WhitePoint[3];
+ FX_FLOAT m_BlackPoint[3];
+ FX_FLOAT m_Gamma;
+};
+CPDF_CalGray::CPDF_CalGray()
+{
+ m_Family = PDFCS_CALGRAY;
+ m_nComponents = 1;
+}
+FX_BOOL CPDF_CalGray::v_Load(CPDF_Document* pDoc, CPDF_Array* pArray)
+{
+ CPDF_Dictionary* pDict = pArray->GetDict(1);
+ CPDF_Array* pParam = pDict->GetArray(FX_BSTRC("WhitePoint"));
+ int i;
+ for (i = 0; i < 3; i ++) {
+ m_WhitePoint[i] = pParam->GetNumber(i);
+ }
+ pParam = pDict->GetArray(FX_BSTRC("BlackPoint"));
+ for (i = 0; i < 3; i ++) {
+ m_BlackPoint[i] = pParam ? pParam->GetNumber(i) : 0;
+ }
+ m_Gamma = pDict->GetNumber(FX_BSTRC("Gamma"));
+ if (m_Gamma == 0) {
+ m_Gamma = 1.0f;
+ }
+ return TRUE;
+}
+FX_BOOL CPDF_CalGray::GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const
+{
+ R = G = B = *pBuf;
+ return TRUE;
+}
+FX_BOOL CPDF_CalGray::SetRGB(FX_FLOAT* pBuf, FX_FLOAT R, FX_FLOAT G, FX_FLOAT B) const
+{
+ if (R == G && R == B) {
+ *pBuf = R;
+ return TRUE;
+ } else {
+ return FALSE;
+ }
+}
+void CPDF_CalGray::TranslateImageLine(FX_LPBYTE pDestBuf, FX_LPCBYTE pSrcBuf, int pixels, int image_width, int image_height, FX_BOOL bTransMask) const
+{
+ for (int i = 0; i < pixels; i ++) {
+ *pDestBuf ++ = pSrcBuf[i];
+ *pDestBuf ++ = pSrcBuf[i];
+ *pDestBuf ++ = pSrcBuf[i];
+ }
+}
+class CPDF_CalRGB : public CPDF_ColorSpace
+{
+public:
+ CPDF_CalRGB();
+ virtual FX_BOOL v_Load(CPDF_Document* pDoc, CPDF_Array* pArray);
+ virtual FX_BOOL GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const;
+ virtual void TranslateImageLine(FX_LPBYTE pDestBuf, FX_LPCBYTE pSrcBuf, int pixels, int image_width, int image_height, FX_BOOL bTransMask = FALSE) const;
+ FX_BOOL SetRGB(FX_FLOAT* pBuf, FX_FLOAT R, FX_FLOAT G, FX_FLOAT B) const;
+ FX_FLOAT m_WhitePoint[3];
+ FX_FLOAT m_BlackPoint[3];
+ FX_FLOAT m_Gamma[3];
+ FX_FLOAT m_Matrix[9];
+ FX_BOOL m_bGamma, m_bMatrix;
+};
+CPDF_CalRGB::CPDF_CalRGB()
+{
+ m_Family = PDFCS_CALRGB;
+ m_nComponents = 3;
+}
+FX_BOOL CPDF_CalRGB::v_Load(CPDF_Document* pDoc, CPDF_Array* pArray)
+{
+ CPDF_Dictionary* pDict = pArray->GetDict(1);
+ CPDF_Array* pParam = pDict->GetArray(FX_BSTRC("WhitePoint"));
+ int i;
+ for (i = 0; i < 3; i ++) {
+ m_WhitePoint[i] = pParam->GetNumber(i);
+ }
+ pParam = pDict->GetArray(FX_BSTRC("BlackPoint"));
+ for (i = 0; i < 3; i ++) {
+ m_BlackPoint[i] = pParam ? pParam->GetNumber(i) : 0;
+ }
+ pParam = pDict->GetArray(FX_BSTRC("Gamma"));
+ if (pParam) {
+ m_bGamma = TRUE;
+ for (i = 0; i < 3; i ++) {
+ m_Gamma[i] = pParam->GetNumber(i);
+ }
+ } else {
+ m_bGamma = FALSE;
+ }
+ pParam = pDict->GetArray(FX_BSTRC("Matrix"));
+ if (pParam) {
+ m_bMatrix = TRUE;
+ for (i = 0; i < 9; i ++) {
+ m_Matrix[i] = pParam->GetNumber(i);
+ }
+ } else {
+ m_bMatrix = FALSE;
+ }
+ return TRUE;
+}
+FX_BOOL CPDF_CalRGB::GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const
+{
+ FX_FLOAT A_ = pBuf[0];
+ FX_FLOAT B_ = pBuf[1];
+ FX_FLOAT C_ = pBuf[2];
+ if (m_bGamma) {
+ A_ = (FX_FLOAT)FXSYS_pow(A_, m_Gamma[0]);
+ B_ = (FX_FLOAT)FXSYS_pow(B_, m_Gamma[1]);
+ C_ = (FX_FLOAT)FXSYS_pow(C_, m_Gamma[2]);
+ }
+ FX_FLOAT X, Y, Z;
+ if (m_bMatrix) {
+ X = m_Matrix[0] * A_ + m_Matrix[3] * B_ + m_Matrix[6] * C_;
+ Y = m_Matrix[1] * A_ + m_Matrix[4] * B_ + m_Matrix[7] * C_;
+ Z = m_Matrix[2] * A_ + m_Matrix[5] * B_ + m_Matrix[8] * C_;
+ } else {
+ X = A_;
+ Y = B_;
+ Z = C_;
+ }
+ XYZ_to_sRGB(X, Y, Z, R, G, B);
+ return TRUE;
+}
+FX_BOOL CPDF_CalRGB::SetRGB(FX_FLOAT* pBuf, FX_FLOAT R, FX_FLOAT G, FX_FLOAT B) const
+{
+ pBuf[0] = R;
+ pBuf[1] = G;
+ pBuf[2] = B;
+ return TRUE;
+}
+void CPDF_CalRGB::TranslateImageLine(FX_LPBYTE pDestBuf, FX_LPCBYTE pSrcBuf, int pixels, int image_width, int image_height, FX_BOOL bTransMask) const
+{
+ if (bTransMask) {
+ FX_FLOAT Cal[3];
+ FX_FLOAT R, G, B;
+ for(int i = 0; i < pixels; i ++) {
+ Cal[0] = ((FX_FLOAT)pSrcBuf[2]) / 255;
+ Cal[1] = ((FX_FLOAT)pSrcBuf[1]) / 255;
+ Cal[2] = ((FX_FLOAT)pSrcBuf[0]) / 255;
+ GetRGB(Cal, R, G, B);
+ pDestBuf[0] = FXSYS_round(B * 255);
+ pDestBuf[1] = FXSYS_round(G * 255);
+ pDestBuf[2] = FXSYS_round(R * 255);
+ pSrcBuf += 3;
+ pDestBuf += 3;
+ }
+ }
+ ReverseRGB(pDestBuf, pSrcBuf, pixels);
+}
+class CPDF_LabCS : public CPDF_ColorSpace
+{
+public:
+ CPDF_LabCS()
+ {
+ m_Family = PDFCS_LAB;
+ m_nComponents = 3;
+ }
+ virtual FX_BOOL v_Load(CPDF_Document* pDoc, CPDF_Array* pArray);
+ virtual void GetDefaultValue(int iComponent, FX_FLOAT& value, FX_FLOAT& min, FX_FLOAT& max) const;
+ virtual FX_BOOL GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const;
+ FX_BOOL SetRGB(FX_FLOAT* pBuf, FX_FLOAT R, FX_FLOAT G, FX_FLOAT B) const;
+ virtual void TranslateImageLine(FX_LPBYTE pDestBuf, FX_LPCBYTE pSrcBuf, int pixels, int image_width, int image_height, FX_BOOL bTransMask = FALSE) const;
+ FX_FLOAT m_WhitePoint[3];
+ FX_FLOAT m_BlackPoint[3];
+ FX_FLOAT m_Ranges[4];
+};
+FX_BOOL CPDF_LabCS::v_Load(CPDF_Document* pDoc, CPDF_Array* pArray)
+{
+ CPDF_Dictionary* pDict = pArray->GetDict(1);
+ CPDF_Array* pParam = pDict->GetArray(FX_BSTRC("WhitePoint"));
+ int i;
+ for (i = 0; i < 3; i ++) {
+ m_WhitePoint[i] = pParam->GetNumber(i);
+ }
+ pParam = pDict->GetArray(FX_BSTRC("BlackPoint"));
+ for (i = 0; i < 3; i ++) {
+ m_BlackPoint[i] = pParam ? pParam->GetNumber(i) : 0;
+ }
+ pParam = pDict->GetArray(FX_BSTRC("Range"));
+ const FX_FLOAT def_ranges[4] = { -100 * 1.0f, 100 * 1.0f, -100 * 1.0f, 100 * 1.0f};
+ for (i = 0; i < 4; i ++) {
+ m_Ranges[i] = pParam ? pParam->GetNumber(i) : def_ranges[i];
+ }
+ return TRUE;
+}
+void CPDF_LabCS::GetDefaultValue(int iComponent, FX_FLOAT& value, FX_FLOAT& min, FX_FLOAT& max) const
+{
+ value = 0;
+ if (iComponent == 0) {
+ min = 0;
+ max = 100 * 1.0f;
+ } else {
+ min = m_Ranges[iComponent * 2 - 2];
+ max = m_Ranges[iComponent * 2 - 1];
+ if (value < min) {
+ value = min;
+ } else if (value > max) {
+ value = max;
+ }
+ }
+}
+FX_BOOL CPDF_LabCS::GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const
+{
+ FX_FLOAT Lstar = pBuf[0];
+ FX_FLOAT astar = pBuf[1];
+ FX_FLOAT bstar = pBuf[2];
+ FX_FLOAT M = (Lstar + 16.0f) / 116.0f;
+ FX_FLOAT L = M + astar / 500.0f;
+ FX_FLOAT N = M - bstar / 200.0f;
+ FX_FLOAT X, Y, Z;
+ if (L < 0.2069f) {
+ X = 0.957f * 0.12842f * (L - 0.1379f);
+ } else {
+ X = 0.957f * L * L * L;
+ }
+ if (M < 0.2069f) {
+ Y = 0.12842f * (M - 0.1379f);
+ } else {
+ Y = M * M * M;
+ }
+ if (N < 0.2069f) {
+ Z = 1.0889f * 0.12842f * (N - 0.1379f);
+ } else {
+ Z = 1.0889f * N * N * N;
+ }
+ XYZ_to_sRGB(X, Y, Z, R, G, B);
+ return TRUE;
+}
+FX_BOOL CPDF_LabCS::SetRGB(FX_FLOAT* pBuf, FX_FLOAT R, FX_FLOAT G, FX_FLOAT B) const
+{
+ return FALSE;
+}
+void CPDF_LabCS::TranslateImageLine(FX_LPBYTE pDestBuf, FX_LPCBYTE pSrcBuf, int pixels, int image_width, int image_height, FX_BOOL bTransMask) const
+{
+ for (int i = 0; i < pixels; i ++) {
+ FX_FLOAT lab[3];
+ FX_FLOAT R, G, B;
+ lab[0] = (pSrcBuf[0] * 100 / 255.0f);
+ lab[1] = (FX_FLOAT)(pSrcBuf[1] - 128);
+ lab[2] = (FX_FLOAT)(pSrcBuf[2] - 128);
+ GetRGB(lab, R, G, B);
+ pDestBuf[0] = (FX_INT32)(B * 255);
+ pDestBuf[1] = (FX_INT32)(G * 255);
+ pDestBuf[2] = (FX_INT32)(R * 255);
+ pDestBuf += 3;
+ pSrcBuf += 3;
+ }
+}
+CPDF_IccProfile::CPDF_IccProfile(FX_LPCBYTE pData, FX_DWORD dwSize, int nComponents)
+{
+ m_bsRGB = nComponents == 3 && dwSize == 3144 && FXSYS_memcmp32(pData + 0x190, "sRGB IEC61966-2.1", 17) == 0;
+ m_pTransform = NULL;
+ if (!m_bsRGB && CPDF_ModuleMgr::Get()->GetIccModule()) {
+ m_pTransform = CPDF_ModuleMgr::Get()->GetIccModule()->CreateTransform_sRGB(pData, dwSize, nComponents);
+ }
+}
+CPDF_IccProfile::~CPDF_IccProfile()
+{
+ if (m_pTransform) {
+ CPDF_ModuleMgr::Get()->GetIccModule()->DestroyTransform(m_pTransform);
+ }
+}
+class CPDF_ICCBasedCS : public CPDF_ColorSpace
+{
+public:
+ CPDF_ICCBasedCS();
+ virtual ~CPDF_ICCBasedCS();
+ virtual FX_BOOL v_Load(CPDF_Document* pDoc, CPDF_Array* pArray);
+ void GetDefaultValue(int i, FX_FLOAT& min, FX_FLOAT& max) const
+ {
+ min = m_pRanges[i * 2];
+ max = m_pRanges[i * 2 + 1];
+ }
+ virtual FX_BOOL GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const;
+ FX_BOOL v_GetCMYK(FX_FLOAT* pBuf, FX_FLOAT& c, FX_FLOAT& m, FX_FLOAT& y, FX_FLOAT& k) const;
+ FX_BOOL SetRGB(FX_FLOAT* pBuf, FX_FLOAT R, FX_FLOAT G, FX_FLOAT B) const;
+ virtual void EnableStdConversion(FX_BOOL bEnabled);
+ virtual void TranslateImageLine(FX_LPBYTE pDestBuf, FX_LPCBYTE pSrcBuf, int pixels, int image_width, int image_height, FX_BOOL bTransMask = FALSE) const;
+ FX_FLOAT* m_pRanges;
+ CPDF_IccProfile* m_pProfile;
+ CPDF_ColorSpace* m_pAlterCS;
+ FX_LPBYTE m_pCache;
+ FX_BOOL m_bOwn;
+};
+CPDF_ICCBasedCS::CPDF_ICCBasedCS()
+{
+ m_pAlterCS = NULL;
+ m_pProfile = NULL;
+ m_Family = PDFCS_ICCBASED;
+ m_pCache = NULL;
+ m_pRanges = NULL;
+ m_bOwn = FALSE;
+}
+CPDF_ICCBasedCS::~CPDF_ICCBasedCS()
+{
+ if (m_pCache) {
+ FX_Free(m_pCache);
+ }
+ if (m_pRanges) {
+ FX_Free(m_pRanges);
+ }
+ if (m_pAlterCS && m_bOwn) {
+ m_pAlterCS->ReleaseCS();
+ }
+ if (m_pProfile && m_pDocument) {
+ m_pDocument->GetPageData()->ReleaseIccProfile(NULL, m_pProfile);
+ }
+}
+FX_BOOL CPDF_ICCBasedCS::v_Load(CPDF_Document* pDoc, CPDF_Array* pArray)
+{
+ CPDF_Stream* pStream = pArray->GetStream(1);
+ if (pStream == NULL) {
+ return FALSE;
+ }
+ m_nComponents = pStream->GetDict()->GetInteger(FX_BSTRC("N"));
+ if (m_nComponents < 0 || m_nComponents > (1 << 16)) {
+ return FALSE;
+ }
+ CPDF_Array* pRanges = pStream->GetDict()->GetArray(FX_BSTRC("Range"));
+ m_pRanges = FX_Alloc(FX_FLOAT, m_nComponents * 2);
+ for (int i = 0; i < m_nComponents * 2; i ++) {
+ if (pRanges) {
+ m_pRanges[i] = pRanges->GetNumber(i);
+ } else if (i % 2) {
+ m_pRanges[i] = 1.0f;
+ } else {
+ m_pRanges[i] = 0;
+ }
+ }
+ m_pProfile = pDoc->LoadIccProfile(pStream, m_nComponents);
+ if (!m_pProfile) {
+ return FALSE;
+ }
+ if (m_pProfile->m_pTransform == NULL) {
+ CPDF_Object* pAlterCSObj = pStream->GetDict()->GetElementValue(FX_BSTRC("Alternate"));
+ if (pAlterCSObj) {
+ CPDF_ColorSpace* alter_cs = CPDF_ColorSpace::Load(pDoc, pAlterCSObj);
+ if (alter_cs) {
+ if (alter_cs->CountComponents() > m_nComponents) {
+ alter_cs->ReleaseCS();
+ } else {
+ m_pAlterCS = alter_cs;
+ m_bOwn = TRUE;
+ }
+ }
+ }
+ if (!m_pAlterCS) {
+ if (m_nComponents == 3) {
+ m_pAlterCS = GetStockCS(PDFCS_DEVICERGB);
+ } else if (m_nComponents == 4) {
+ m_pAlterCS = GetStockCS(PDFCS_DEVICECMYK);
+ } else {
+ m_pAlterCS = GetStockCS(PDFCS_DEVICEGRAY);
+ }
+ }
+ }
+ return TRUE;
+}
+FX_BOOL CPDF_ICCBasedCS::GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const
+{
+ if (m_pProfile && m_pProfile->m_bsRGB) {
+ R = pBuf[0];
+ G = pBuf[1];
+ B = pBuf[2];
+ return TRUE;
+ }
+ ICodec_IccModule *pIccModule = CPDF_ModuleMgr::Get()->GetIccModule();
+ if (m_pProfile->m_pTransform == NULL || pIccModule == NULL) {
+ if (m_pAlterCS) {
+ m_pAlterCS->GetRGB(pBuf, R, G, B);
+ } else {
+ R = G = B = 0.0f;
+ }
+ return TRUE;
+ }
+ FX_FLOAT rgb[3];
+ pIccModule->Translate(m_pProfile->m_pTransform, pBuf, rgb);
+ R = rgb[0];
+ G = rgb[1];
+ B = rgb[2];
+ return TRUE;
+}
+FX_BOOL CPDF_ICCBasedCS::v_GetCMYK(FX_FLOAT* pBuf, FX_FLOAT& c, FX_FLOAT& m, FX_FLOAT& y, FX_FLOAT& k) const
+{
+ if (m_nComponents != 4) {
+ return FALSE;
+ }
+ c = pBuf[0];
+ m = pBuf[1];
+ y = pBuf[2];
+ k = pBuf[3];
+ return TRUE;
+}
+FX_BOOL CPDF_ICCBasedCS::SetRGB(FX_FLOAT* pBuf, FX_FLOAT R, FX_FLOAT G, FX_FLOAT B) const
+{
+ return FALSE;
+}
+void CPDF_ICCBasedCS::EnableStdConversion(FX_BOOL bEnabled)
+{
+ CPDF_ColorSpace::EnableStdConversion(bEnabled);
+ if (m_pAlterCS) {
+ m_pAlterCS->EnableStdConversion(bEnabled);
+ }
+}
+void CPDF_ICCBasedCS::TranslateImageLine(FX_LPBYTE pDestBuf, FX_LPCBYTE pSrcBuf, int pixels, int image_width, int image_height, FX_BOOL bTransMask) const
+{
+ if (m_pProfile->m_bsRGB) {
+ ReverseRGB(pDestBuf, pSrcBuf, pixels);
+ } else if (m_pProfile->m_pTransform) {
+ int nMaxColors = 1;
+ for (int i = 0; i < m_nComponents; i ++) {
+ nMaxColors *= 52;
+ }
+ if (m_nComponents > 3 || image_width * image_height < nMaxColors * 3 / 2) {
+ CPDF_ModuleMgr::Get()->GetIccModule()->TranslateScanline(m_pProfile->m_pTransform, pDestBuf, pSrcBuf, pixels);
+ } else {
+ if (m_pCache == NULL) {
+ ((CPDF_ICCBasedCS*)this)->m_pCache = FX_Alloc(FX_BYTE, nMaxColors * 3);
+ FX_LPBYTE temp_src = FX_Alloc(FX_BYTE, nMaxColors * m_nComponents);
+ FX_LPBYTE pSrc = temp_src;
+ for (int i = 0; i < nMaxColors; i ++) {
+ FX_DWORD color = i;
+ FX_DWORD order = nMaxColors / 52;
+ for (int c = 0; c < m_nComponents; c ++) {
+ *pSrc++ = (FX_BYTE)(color / order * 5);
+ color %= order;
+ order /= 52;
+ }
+ }
+ CPDF_ModuleMgr::Get()->GetIccModule()->TranslateScanline(m_pProfile->m_pTransform, m_pCache, temp_src, nMaxColors);
+ FX_Free(temp_src);
+ }
+ for (int i = 0; i < pixels; i ++) {
+ int index = 0;
+ for (int c = 0; c < m_nComponents; c ++) {
+ index = index * 52 + (*pSrcBuf) / 5;
+ pSrcBuf ++;
+ }
+ index *= 3;
+ *pDestBuf++ = m_pCache[index];
+ *pDestBuf++ = m_pCache[index + 1];
+ *pDestBuf++ = m_pCache[index + 2];
+ }
+ }
+ } else if (m_pAlterCS) {
+ m_pAlterCS->TranslateImageLine(pDestBuf, pSrcBuf, pixels, image_width, image_height);
+ }
+}
+class CPDF_IndexedCS : public CPDF_ColorSpace
+{
+public:
+ CPDF_IndexedCS();
+ virtual ~CPDF_IndexedCS();
+ virtual FX_BOOL v_Load(CPDF_Document* pDoc, CPDF_Array* pArray);
+ void GetDefaultValue(int iComponent, FX_FLOAT& min, FX_FLOAT& max) const
+ {
+ min = 0;
+ max = (FX_FLOAT)m_MaxIndex;
+ }
+ virtual FX_BOOL GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const;
+ virtual CPDF_ColorSpace* GetBaseCS() const
+ {
+ return m_pBaseCS;
+ }
+ virtual void EnableStdConversion(FX_BOOL bEnabled);
+ CPDF_ColorSpace* m_pBaseCS;
+ int m_nBaseComponents;
+ int m_MaxIndex;
+ CFX_ByteString m_Table;
+ FX_FLOAT* m_pCompMinMax;
+};
+CPDF_IndexedCS::CPDF_IndexedCS()
+{
+ m_pBaseCS = NULL;
+ m_Family = PDFCS_INDEXED;
+ m_nComponents = 1;
+ m_pCompMinMax = NULL;
+}
+CPDF_IndexedCS::~CPDF_IndexedCS()
+{
+ if (m_pCompMinMax) {
+ FX_Free(m_pCompMinMax);
+ }
+ CPDF_ColorSpace* pCS = m_pBaseCS;
+ if (pCS && m_pDocument) {
+ m_pDocument->GetPageData()->ReleaseColorSpace(pCS->GetArray());
+ }
+}
+FX_BOOL CPDF_IndexedCS::v_Load(CPDF_Document* pDoc, CPDF_Array* pArray)
+{
+ if (pArray->GetCount() < 4) {
+ return FALSE;
+ }
+ CPDF_Object* pBaseObj = pArray->GetElementValue(1);
+ if (pBaseObj == m_pArray) {
+ return FALSE;
+ }
+ CPDF_DocPageData* pDocPageData = pDoc->GetPageData();
+ m_pBaseCS = pDocPageData->GetColorSpace(pBaseObj, NULL);
+ if (m_pBaseCS == NULL) {
+ return FALSE;
+ }
+ m_nBaseComponents = m_pBaseCS->CountComponents();
+ m_pCompMinMax = FX_Alloc(FX_FLOAT, m_nBaseComponents * 2);
+ FX_FLOAT defvalue;
+ for (int i = 0; i < m_nBaseComponents; i ++) {
+ m_pBaseCS->GetDefaultValue(i, defvalue, m_pCompMinMax[i * 2], m_pCompMinMax[i * 2 + 1]);
+ m_pCompMinMax[i * 2 + 1] -= m_pCompMinMax[i * 2];
+ }
+ m_MaxIndex = pArray->GetInteger(2);
+ CPDF_Object* pTableObj = pArray->GetElementValue(3);
+ if (pTableObj == NULL) {
+ return FALSE;
+ }
+ FX_LPCBYTE pTable = NULL;
+ FX_DWORD size = 0;
+ CPDF_StreamAcc* pStreamAcc = NULL;
+ if (pTableObj->GetType() == PDFOBJ_STRING) {
+ m_Table = ((CPDF_String*)pTableObj)->GetString();
+ } else if (pTableObj->GetType() == PDFOBJ_STREAM) {
+ CPDF_StreamAcc acc;
+ acc.LoadAllData((CPDF_Stream*)pTableObj, FALSE);
+ m_Table = CFX_ByteStringC(acc.GetData(), acc.GetSize());
+ }
+ return TRUE;
+}
+FX_BOOL CPDF_IndexedCS::GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const
+{
+ int index = (FX_INT32)(*pBuf);
+ if (index < 0 || index > m_MaxIndex) {
+ return FALSE;
+ }
+ if (m_nBaseComponents) {
+ if (index == INT_MAX || (index + 1) > INT_MAX / m_nBaseComponents ||
+ (index + 1)*m_nBaseComponents > (int)m_Table.GetLength()) {
+ R = G = B = 0;
+ return FALSE;
+ }
+ }
+ CFX_FixedBufGrow<FX_FLOAT, 16> Comps(m_nBaseComponents);
+ FX_FLOAT* comps = Comps;
+ FX_LPCBYTE pTable = m_Table;
+ for (int i = 0; i < m_nBaseComponents; i ++) {
+ comps[i] = m_pCompMinMax[i * 2] + m_pCompMinMax[i * 2 + 1] * pTable[index * m_nBaseComponents + i] / 255;
+ }
+ m_pBaseCS->GetRGB(comps, R, G, B);
+ return TRUE;
+}
+void CPDF_IndexedCS::EnableStdConversion(FX_BOOL bEnabled)
+{
+ CPDF_ColorSpace::EnableStdConversion(bEnabled);
+ if (m_pBaseCS) {
+ m_pBaseCS->EnableStdConversion(bEnabled);
+ }
+}
+#define MAX_PATTERN_COLORCOMPS 16
+typedef struct _PatternValue {
+ CPDF_Pattern* m_pPattern;
+ int m_nComps;
+ FX_FLOAT m_Comps[MAX_PATTERN_COLORCOMPS];
+} PatternValue;
+CPDF_PatternCS::CPDF_PatternCS()
+{
+ m_Family = PDFCS_PATTERN;
+ m_pBaseCS = NULL;
+ m_nComponents = 1;
+}
+CPDF_PatternCS::~CPDF_PatternCS()
+{
+ CPDF_ColorSpace* pCS = m_pBaseCS;
+ if (pCS && m_pDocument) {
+ m_pDocument->GetPageData()->ReleaseColorSpace(pCS->GetArray());
+ }
+}
+FX_BOOL CPDF_PatternCS::v_Load(CPDF_Document* pDoc, CPDF_Array* pArray)
+{
+ CPDF_Object* pBaseCS = pArray->GetElementValue(1);
+ if (pBaseCS == m_pArray) {
+ return FALSE;
+ }
+ CPDF_DocPageData* pDocPageData = pDoc->GetPageData();
+ m_pBaseCS = pDocPageData->GetColorSpace(pBaseCS, NULL);
+ if (m_pBaseCS) {
+ m_nComponents = m_pBaseCS->CountComponents() + 1;
+ if (m_pBaseCS->CountComponents() > MAX_PATTERN_COLORCOMPS) {
+ return FALSE;
+ }
+ } else {
+ m_nComponents = 1;
+ }
+ return TRUE;
+}
+FX_BOOL CPDF_PatternCS::GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const
+{
+ if (m_pBaseCS) {
+ PatternValue* pvalue = (PatternValue*)pBuf;
+ m_pBaseCS->GetRGB(pvalue->m_Comps, R, G, B);
+ return TRUE;
+ }
+ R = G = B = 0.75f;
+ return FALSE;
+}
+class CPDF_SeparationCS : public CPDF_ColorSpace
+{
+public:
+ CPDF_SeparationCS();
+ virtual ~CPDF_SeparationCS();
+ virtual void GetDefaultValue(int iComponent, FX_FLOAT& value, FX_FLOAT& min, FX_FLOAT& max) const
+ {
+ value = 1.0f;
+ min = 0;
+ max = 1.0f;
+ }
+ virtual FX_BOOL v_Load(CPDF_Document* pDoc, CPDF_Array* pArray);
+ virtual FX_BOOL GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const;
+ virtual void EnableStdConversion(FX_BOOL bEnabled);
+ CPDF_ColorSpace* m_pAltCS;
+ CPDF_Function* m_pFunc;
+ enum {None, All, Colorant} m_Type;
+};
+CPDF_SeparationCS::CPDF_SeparationCS()
+{
+ m_Family = PDFCS_SEPARATION;
+ m_pAltCS = NULL;
+ m_pFunc = NULL;
+ m_nComponents = 1;
+}
+CPDF_SeparationCS::~CPDF_SeparationCS()
+{
+ if (m_pAltCS) {
+ m_pAltCS->ReleaseCS();
+ }
+ if (m_pFunc) {
+ delete m_pFunc;
+ }
+}
+FX_BOOL CPDF_SeparationCS::v_Load(CPDF_Document* pDoc, CPDF_Array* pArray)
+{
+ CFX_ByteString name = pArray->GetString(1);
+ if (name == FX_BSTRC("None")) {
+ m_Type = None;
+ } else {
+ m_Type = Colorant;
+ CPDF_Object* pAltCS = pArray->GetElementValue(2);
+ if (pAltCS == m_pArray) {
+ return FALSE;
+ }
+ m_pAltCS = Load(pDoc, pAltCS);
+ CPDF_Object* pFuncObj = pArray->GetElementValue(3);
+ if (pFuncObj && pFuncObj->GetType() != PDFOBJ_NAME) {
+ m_pFunc = CPDF_Function::Load(pFuncObj);
+ }
+ if (m_pFunc && m_pAltCS && m_pFunc->CountOutputs() < m_pAltCS->CountComponents()) {
+ delete m_pFunc;
+ m_pFunc = NULL;
+ }
+ }
+ return TRUE;
+}
+FX_BOOL CPDF_SeparationCS::GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const
+{
+ if (m_Type == None) {
+ return FALSE;
+ }
+ if (m_pFunc == NULL) {
+ if (m_pAltCS == NULL) {
+ return FALSE;
+ }
+ int nComps = m_pAltCS->CountComponents();
+ CFX_FixedBufGrow<FX_FLOAT, 16> results(nComps);
+ for (int i = 0; i < nComps; i ++) {
+ results[i] = *pBuf;
+ }
+ m_pAltCS->GetRGB(results, R, G, B);
+ return TRUE;
+ }
+ CFX_FixedBufGrow<FX_FLOAT, 16> results(m_pFunc->CountOutputs());
+ int nresults;
+ m_pFunc->Call(pBuf, 1, results, nresults);
+ if (nresults == 0) {
+ return FALSE;
+ }
+ if (m_pAltCS) {
+ m_pAltCS->GetRGB(results, R, G, B);
+ return TRUE;
+ } else {
+ R = G = B = 0;
+ return FALSE;
+ }
+}
+void CPDF_SeparationCS::EnableStdConversion(FX_BOOL bEnabled)
+{
+ CPDF_ColorSpace::EnableStdConversion(bEnabled);
+ if (m_pAltCS) {
+ m_pAltCS->EnableStdConversion(bEnabled);
+ }
+}
+class CPDF_DeviceNCS : public CPDF_ColorSpace
+{
+public:
+ CPDF_DeviceNCS();
+ virtual ~CPDF_DeviceNCS();
+ virtual void GetDefaultValue(int iComponent, FX_FLOAT& value, FX_FLOAT& min, FX_FLOAT& max) const
+ {
+ value = 1.0f;
+ min = 0;
+ max = 1.0f;
+ }
+ virtual FX_BOOL v_Load(CPDF_Document* pDoc, CPDF_Array* pArray);
+ virtual FX_BOOL GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const;
+ virtual void EnableStdConversion(FX_BOOL bEnabled);
+ CPDF_ColorSpace* m_pAltCS;
+ CPDF_Function* m_pFunc;
+};
+CPDF_DeviceNCS::CPDF_DeviceNCS()
+{
+ m_Family = PDFCS_DEVICEN;
+ m_pAltCS = NULL;
+ m_pFunc = NULL;
+}
+CPDF_DeviceNCS::~CPDF_DeviceNCS()
+{
+ if (m_pFunc) {
+ delete m_pFunc;
+ }
+ if (m_pAltCS) {
+ m_pAltCS->ReleaseCS();
+ }
+}
+FX_BOOL CPDF_DeviceNCS::v_Load(CPDF_Document* pDoc, CPDF_Array* pArray)
+{
+ CPDF_Object* pObj = pArray->GetElementValue(1);
+ if (!pObj) {
+ return FALSE;
+ }
+ if (pObj->GetType() != PDFOBJ_ARRAY) {
+ return FALSE;
+ }
+ m_nComponents = ((CPDF_Array*)pObj)->GetCount();
+ CPDF_Object* pAltCS = pArray->GetElementValue(2);
+ if (!pAltCS || pAltCS == m_pArray) {
+ return FALSE;
+ }
+ m_pAltCS = Load(pDoc, pAltCS);
+ m_pFunc = CPDF_Function::Load(pArray->GetElementValue(3));
+ if (m_pAltCS == NULL || m_pFunc == NULL) {
+ return FALSE;
+ }
+ if (m_pFunc->CountOutputs() < m_pAltCS->CountComponents()) {
+ return FALSE;
+ }
+ return TRUE;
+}
+FX_BOOL CPDF_DeviceNCS::GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const
+{
+ if (m_pFunc == NULL) {
+ return FALSE;
+ }
+ CFX_FixedBufGrow<FX_FLOAT, 16> results(m_pFunc->CountOutputs());
+ int nresults;
+ m_pFunc->Call(pBuf, m_nComponents, results, nresults);
+ if (nresults == 0) {
+ return FALSE;
+ }
+ m_pAltCS->GetRGB(results, R, G, B);
+ return TRUE;
+}
+void CPDF_DeviceNCS::EnableStdConversion(FX_BOOL bEnabled)
+{
+ CPDF_ColorSpace::EnableStdConversion(bEnabled);
+ if (m_pAltCS) {
+ m_pAltCS->EnableStdConversion(bEnabled);
+ }
+}
+CPDF_ColorSpace* CPDF_ColorSpace::GetStockCS(int family)
+{
+ return CPDF_ModuleMgr::Get()->GetPageModule()->GetStockCS(family);;
+}
+CPDF_ColorSpace* _CSFromName(const CFX_ByteString& name)
+{
+ if (name == FX_BSTRC("DeviceRGB") || name == FX_BSTRC("RGB")) {
+ return CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB);
+ }
+ if (name == FX_BSTRC("DeviceGray") || name == FX_BSTRC("G")) {
+ return CPDF_ColorSpace::GetStockCS(PDFCS_DEVICEGRAY);
+ }
+ if (name == FX_BSTRC("DeviceCMYK") || name == FX_BSTRC("CMYK")) {
+ return CPDF_ColorSpace::GetStockCS(PDFCS_DEVICECMYK);
+ }
+ if (name == FX_BSTRC("Pattern")) {
+ return CPDF_ColorSpace::GetStockCS(PDFCS_PATTERN);
+ }
+ return NULL;
+}
+CPDF_ColorSpace* CPDF_ColorSpace::Load(CPDF_Document* pDoc, CPDF_Object* pObj)
+{
+ if (pObj == NULL) {
+ return NULL;
+ }
+ if (pObj->GetType() == PDFOBJ_NAME) {
+ return _CSFromName(pObj->GetString());
+ }
+ if (pObj->GetType() == PDFOBJ_STREAM) {
+ CPDF_Dictionary *pDict = ((CPDF_Stream *)pObj)->GetDict();
+ if (!pDict) {
+ return NULL;
+ }
+ CPDF_ColorSpace *pRet = NULL;
+ FX_POSITION pos = pDict->GetStartPos();
+ while (pos) {
+ CFX_ByteString bsKey;
+ CPDF_Object *pValue = pDict->GetNextElement(pos, bsKey);
+ if (pValue->GetType() == PDFOBJ_NAME) {
+ pRet = _CSFromName(pValue->GetString());
+ }
+ if (pRet) {
+ return pRet;
+ }
+ }
+ return NULL;
+ }
+ if (pObj->GetType() != PDFOBJ_ARRAY) {
+ return NULL;
+ }
+ CPDF_Array* pArray = (CPDF_Array*)pObj;
+ if (pArray->GetCount() == 0) {
+ return NULL;
+ }
+ CFX_ByteString familyname = pArray->GetElementValue(0)->GetString();
+ if (pArray->GetCount() == 1) {
+ return _CSFromName(familyname);
+ }
+ CPDF_ColorSpace* pCS = NULL;
+ FX_DWORD id = familyname.GetID();
+ if (id == FXBSTR_ID('C', 'a', 'l', 'G')) {
+ pCS = FX_NEW CPDF_CalGray();
+ } else if (id == FXBSTR_ID('C', 'a', 'l', 'R')) {
+ pCS = FX_NEW CPDF_CalRGB();
+ } else if (id == FXBSTR_ID('L', 'a', 'b', 0)) {
+ pCS = FX_NEW CPDF_LabCS();
+ } else if (id == FXBSTR_ID('I', 'C', 'C', 'B')) {
+ pCS = FX_NEW CPDF_ICCBasedCS();
+ } else if (id == FXBSTR_ID('I', 'n', 'd', 'e') || id == FXBSTR_ID('I', 0, 0, 0)) {
+ pCS = FX_NEW CPDF_IndexedCS();
+ } else if (id == FXBSTR_ID('S', 'e', 'p', 'a')) {
+ pCS = FX_NEW CPDF_SeparationCS();
+ } else if (id == FXBSTR_ID('D', 'e', 'v', 'i')) {
+ pCS = FX_NEW CPDF_DeviceNCS();
+ } else if (id == FXBSTR_ID('P', 'a', 't', 't')) {
+ pCS = FX_NEW CPDF_PatternCS();
+ } else {
+ return NULL;
+ }
+ pCS->m_pDocument = pDoc;
+ pCS->m_pArray = pArray;
+ if (!pCS->v_Load(pDoc, pArray)) {
+ pCS->ReleaseCS();
+ return NULL;
+ }
+ return pCS;
+}
+CPDF_ColorSpace::CPDF_ColorSpace()
+{
+ m_Family = 0;
+ m_pArray = NULL;
+ m_dwStdConversion = 0;
+ m_pDocument = NULL;
+}
+void CPDF_ColorSpace::ReleaseCS()
+{
+ if (this == GetStockCS(PDFCS_DEVICERGB)) {
+ return;
+ }
+ if (this == GetStockCS(PDFCS_DEVICEGRAY)) {
+ return;
+ }
+ if (this == GetStockCS(PDFCS_DEVICECMYK)) {
+ return;
+ }
+ if (this == GetStockCS(PDFCS_PATTERN)) {
+ return;
+ }
+ delete this;
+}
+int CPDF_ColorSpace::GetBufSize() const
+{
+ if (m_Family == PDFCS_PATTERN) {
+ return sizeof(PatternValue);
+ }
+ return m_nComponents * sizeof(FX_FLOAT);
+}
+FX_FLOAT* CPDF_ColorSpace::CreateBuf()
+{
+ int size = GetBufSize();
+ FX_BYTE* pBuf = FX_Alloc(FX_BYTE, size);
+ FXSYS_memset32(pBuf, 0, size);
+ return (FX_FLOAT*)pBuf;
+}
+FX_BOOL CPDF_ColorSpace::sRGB() const
+{
+ if (m_Family == PDFCS_DEVICERGB) {
+ return TRUE;
+ }
+ if (m_Family != PDFCS_ICCBASED) {
+ return FALSE;
+ }
+ CPDF_ICCBasedCS* pCS = (CPDF_ICCBasedCS*)this;
+ return pCS->m_pProfile->m_bsRGB;
+}
+FX_BOOL CPDF_ColorSpace::GetCMYK(FX_FLOAT* pBuf, FX_FLOAT& c, FX_FLOAT& m, FX_FLOAT& y, FX_FLOAT& k) const
+{
+ if (v_GetCMYK(pBuf, c, m, y, k)) {
+ return TRUE;
+ }
+ FX_FLOAT R, G, B;
+ if (!GetRGB(pBuf, R, G, B)) {
+ return FALSE;
+ }
+ sRGB_to_AdobeCMYK(R, G, B, c, m, y, k);
+ return TRUE;
+}
+FX_BOOL CPDF_ColorSpace::SetCMYK(FX_FLOAT* pBuf, FX_FLOAT c, FX_FLOAT m, FX_FLOAT y, FX_FLOAT k) const
+{
+ if (v_SetCMYK(pBuf, c, m, y, k)) {
+ return TRUE;
+ }
+ FX_FLOAT R, G, B;
+ AdobeCMYK_to_sRGB(c, m, y, k, R, G, B);
+ return SetRGB(pBuf, R, G, B);
+}
+void CPDF_ColorSpace::GetDefaultColor(FX_FLOAT* buf) const
+{
+ if (buf == NULL || m_Family == PDFCS_PATTERN) {
+ return;
+ }
+ FX_FLOAT min, max;
+ for (int i = 0; i < m_nComponents; i ++) {
+ GetDefaultValue(i, buf[i], min, max);
+ }
+}
+int CPDF_ColorSpace::GetMaxIndex() const
+{
+ if (m_Family != PDFCS_INDEXED) {
+ return 0;
+ }
+ CPDF_IndexedCS* pCS = (CPDF_IndexedCS*)this;
+ return pCS->m_MaxIndex;
+}
+void CPDF_ColorSpace::TranslateImageLine(FX_LPBYTE dest_buf, FX_LPCBYTE src_buf, int pixels, int image_width, int image_height, FX_BOOL bTransMask) const
+{
+ CFX_FixedBufGrow<FX_FLOAT, 16> srcbuf(m_nComponents);
+ FX_FLOAT* src = srcbuf;
+ FX_FLOAT R, G, B;
+ for (int i = 0; i < pixels; i ++) {
+ for (int j = 0; j < m_nComponents; j ++)
+ if (m_Family == PDFCS_INDEXED) {
+ src[j] = (FX_FLOAT)(*src_buf ++);
+ } else {
+ src[j] = (FX_FLOAT)(*src_buf ++) / 255;
+ }
+ GetRGB(src, R, G, B);
+ *dest_buf ++ = (FX_INT32)(B * 255);
+ *dest_buf ++ = (FX_INT32)(G * 255);
+ *dest_buf ++ = (FX_INT32)(R * 255);
+ }
+}
+void CPDF_ColorSpace::EnableStdConversion(FX_BOOL bEnabled)
+{
+ if (bEnabled) {
+ m_dwStdConversion ++;
+ } else if (m_dwStdConversion) {
+ m_dwStdConversion --;
+ }
+}
+CPDF_Color::CPDF_Color(int family)
+{
+ m_pCS = CPDF_ColorSpace::GetStockCS(family);
+ int nComps = 3;
+ if (family == PDFCS_DEVICEGRAY) {
+ nComps = 1;
+ } else if (family == PDFCS_DEVICECMYK) {
+ nComps = 4;
+ }
+ m_pBuffer = FX_Alloc(FX_FLOAT, nComps);
+ for (int i = 0; i < nComps; i ++) {
+ m_pBuffer[i] = 0;
+ }
+}
+CPDF_Color::~CPDF_Color()
+{
+ ReleaseBuffer();
+ ReleaseColorSpace();
+}
+void CPDF_Color::ReleaseBuffer()
+{
+ if (!m_pBuffer) {
+ return;
+ }
+ if (m_pCS->GetFamily() == PDFCS_PATTERN) {
+ PatternValue* pvalue = (PatternValue*)m_pBuffer;
+ CPDF_Pattern* pPattern = pvalue->m_pPattern;
+ if (pPattern && pPattern->m_pDocument) {
+ pPattern->m_pDocument->GetPageData()->ReleasePattern(pPattern->m_pPatternObj);
+ }
+ }
+ FX_Free(m_pBuffer);
+ m_pBuffer = NULL;
+}
+void CPDF_Color::ReleaseColorSpace()
+{
+ if (m_pCS && m_pCS->m_pDocument && m_pCS->GetArray()) {
+ m_pCS->m_pDocument->GetPageData()->ReleaseColorSpace(m_pCS->GetArray());
+ m_pCS = NULL;
+ }
+}
+void CPDF_Color::SetColorSpace(CPDF_ColorSpace* pCS)
+{
+ if (m_pCS == pCS) {
+ if (m_pBuffer == NULL) {
+ m_pBuffer = pCS->CreateBuf();
+ }
+ ReleaseColorSpace();
+ m_pCS = pCS;
+ return;
+ }
+ ReleaseBuffer();
+ ReleaseColorSpace();
+ m_pCS = pCS;
+ if (m_pCS) {
+ m_pBuffer = pCS->CreateBuf();
+ pCS->GetDefaultColor(m_pBuffer);
+ }
+}
+void CPDF_Color::SetValue(FX_FLOAT* comps)
+{
+ if (m_pBuffer == NULL) {
+ return;
+ }
+ if (m_pCS->GetFamily() != PDFCS_PATTERN) {
+ FXSYS_memcpy32(m_pBuffer, comps, m_pCS->CountComponents() * sizeof(FX_FLOAT));
+ }
+}
+void CPDF_Color::SetValue(CPDF_Pattern* pPattern, FX_FLOAT* comps, int ncomps)
+{
+ if (ncomps > MAX_PATTERN_COLORCOMPS) {
+ return;
+ }
+ if (m_pCS == NULL || m_pCS->GetFamily() != PDFCS_PATTERN) {
+ if (m_pBuffer) {
+ FX_Free(m_pBuffer);
+ }
+ m_pCS = CPDF_ColorSpace::GetStockCS(PDFCS_PATTERN);
+ m_pBuffer = m_pCS->CreateBuf();
+ }
+ CPDF_DocPageData* pDocPageData = NULL;
+ PatternValue* pvalue = (PatternValue*)m_pBuffer;
+ if (pvalue->m_pPattern && pvalue->m_pPattern->m_pDocument) {
+ pDocPageData = pvalue->m_pPattern->m_pDocument->GetPageData();
+ pDocPageData->ReleasePattern(pvalue->m_pPattern->m_pPatternObj);
+ }
+ pvalue->m_nComps = ncomps;
+ pvalue->m_pPattern = pPattern;
+ if (ncomps) {
+ FXSYS_memcpy32(pvalue->m_Comps, comps, ncomps * sizeof(FX_FLOAT));
+ }
+}
+void CPDF_Color::Copy(const CPDF_Color* pSrc)
+{
+ ReleaseBuffer();
+ ReleaseColorSpace();
+ m_pCS = pSrc->m_pCS;
+ if (m_pCS && m_pCS->m_pDocument) {
+ CPDF_Array* pArray = m_pCS->GetArray();
+ if (pArray) {
+ m_pCS = m_pCS->m_pDocument->GetPageData()->GetCopiedColorSpace(pArray);
+ }
+ }
+ if (m_pCS == NULL) {
+ return;
+ }
+ m_pBuffer = m_pCS->CreateBuf();
+ FXSYS_memcpy32(m_pBuffer, pSrc->m_pBuffer, m_pCS->GetBufSize());
+ if (m_pCS->GetFamily() == PDFCS_PATTERN) {
+ PatternValue* pvalue = (PatternValue*)m_pBuffer;
+ if (pvalue->m_pPattern && pvalue->m_pPattern->m_pDocument) {
+ pvalue->m_pPattern = pvalue->m_pPattern->m_pDocument->GetPageData()->GetPattern(pvalue->m_pPattern->m_pPatternObj, FALSE, &pvalue->m_pPattern->m_ParentMatrix);
+ }
+ }
+}
+FX_BOOL CPDF_Color::GetRGB(int& R, int& G, int& B) const
+{
+ if (m_pCS == NULL || m_pBuffer == NULL) {
+ return FALSE;
+ }
+ FX_FLOAT r, g, b;
+ if (!m_pCS->GetRGB(m_pBuffer, r, g, b)) {
+ return FALSE;
+ }
+ R = (FX_INT32)(r * 255 + 0.5f);
+ G = (FX_INT32)(g * 255 + 0.5f);
+ B = (FX_INT32)(b * 255 + 0.5f);
+ return TRUE;
+}
+CPDF_Pattern* CPDF_Color::GetPattern() const
+{
+ if (m_pBuffer == NULL || m_pCS->GetFamily() != PDFCS_PATTERN) {
+ return NULL;
+ }
+ PatternValue* pvalue = (PatternValue*)m_pBuffer;
+ return pvalue->m_pPattern;
+}
+CPDF_ColorSpace* CPDF_Color::GetPatternCS() const
+{
+ if (m_pBuffer == NULL || m_pCS->GetFamily() != PDFCS_PATTERN) {
+ return NULL;
+ }
+ return m_pCS->GetBaseCS();
+}
+FX_FLOAT* CPDF_Color::GetPatternColor() const
+{
+ if (m_pBuffer == NULL || m_pCS->GetFamily() != PDFCS_PATTERN) {
+ return NULL;
+ }
+ PatternValue* pvalue = (PatternValue*)m_pBuffer;
+ return pvalue->m_nComps ? pvalue->m_Comps : NULL;
+}
+FX_BOOL CPDF_Color::IsEqual(const CPDF_Color& other) const
+{
+ if (m_pCS != other.m_pCS || m_pCS == NULL) {
+ return FALSE;
+ }
+ return FXSYS_memcmp32(m_pBuffer, other.m_pBuffer, m_pCS->GetBufSize()) == 0;
+}
diff --git a/core/src/fpdfapi/fpdf_page/fpdf_page_doc.cpp b/core/src/fpdfapi/fpdf_page/fpdf_page_doc.cpp
index d4e5bef400..a9d2c4d695 100644
--- a/core/src/fpdfapi/fpdf_page/fpdf_page_doc.cpp
+++ b/core/src/fpdfapi/fpdf_page/fpdf_page_doc.cpp
@@ -1,647 +1,647 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../../include/fpdfapi/fpdf_page.h"
-#include "../../../include/fpdfapi/fpdf_module.h"
-#include "../../../include/fdrm/fx_crypt.h"
-#include "../fpdf_font/font_int.h"
-#include "pageint.h"
-class CPDF_PageModule : public CPDF_PageModuleDef
-{
-public:
- CPDF_PageModule() : m_StockGrayCS(PDFCS_DEVICEGRAY), m_StockRGBCS(PDFCS_DEVICERGB),
- m_StockCMYKCS(PDFCS_DEVICECMYK) {}
- virtual ~CPDF_PageModule() {}
- virtual FX_BOOL Installed()
- {
- return TRUE;
- }
- virtual CPDF_DocPageData* CreateDocData(CPDF_Document* pDoc)
- {
- return FX_NEW CPDF_DocPageData(pDoc);
- }
- virtual void ReleaseDoc(CPDF_Document* pDoc);
- virtual void ClearDoc(CPDF_Document* pDoc);
- virtual CPDF_FontGlobals* GetFontGlobals()
- {
- return &m_FontGlobals;
- }
- virtual void ClearStockFont(CPDF_Document* pDoc)
- {
- m_FontGlobals.Clear(pDoc);
- }
- virtual CPDF_ColorSpace* GetStockCS(int family);
- virtual void NotifyCJKAvailable();
- CPDF_FontGlobals m_FontGlobals;
- CPDF_DeviceCS m_StockGrayCS;
- CPDF_DeviceCS m_StockRGBCS;
- CPDF_DeviceCS m_StockCMYKCS;
- CPDF_PatternCS m_StockPatternCS;
-};
-CPDF_ColorSpace* CPDF_PageModule::GetStockCS(int family)
-{
- if (family == PDFCS_DEVICEGRAY) {
- return &m_StockGrayCS;
- }
- if (family == PDFCS_DEVICERGB) {
- return &m_StockRGBCS;
- }
- if (family == PDFCS_DEVICECMYK) {
- return &m_StockCMYKCS;
- }
- if (family == PDFCS_PATTERN) {
- return &m_StockPatternCS;
- }
- return NULL;
-}
-void CPDF_ModuleMgr::InitPageModule()
-{
- if (m_pPageModule) {
- delete m_pPageModule;
- }
- CPDF_PageModule* pPageModule = FX_NEW CPDF_PageModule;
- m_pPageModule = pPageModule;
-}
-void CPDF_PageModule::ReleaseDoc(CPDF_Document* pDoc)
-{
- delete pDoc->GetPageData();
-}
-void CPDF_PageModule::ClearDoc(CPDF_Document* pDoc)
-{
- pDoc->GetPageData()->Clear(FALSE);
-}
-void CPDF_PageModule::NotifyCJKAvailable()
-{
- m_FontGlobals.m_CMapManager.ReloadAll();
-}
-CPDF_Font* CPDF_Document::LoadFont(CPDF_Dictionary* pFontDict)
-{
- if (!pFontDict) {
- return NULL;
- }
- return GetValidatePageData()->GetFont(pFontDict, FALSE);
-}
-CPDF_Font* CPDF_Document::FindFont(CPDF_Dictionary* pFontDict)
-{
- if (!pFontDict) {
- return NULL;
- }
- return GetValidatePageData()->GetFont(pFontDict, TRUE);
-}
-CPDF_StreamAcc* CPDF_Document::LoadFontFile(CPDF_Stream* pStream)
-{
- if (pStream == NULL) {
- return NULL;
- }
- return GetValidatePageData()->GetFontFileStreamAcc(pStream);
-}
-CPDF_ColorSpace* _CSFromName(const CFX_ByteString& name);
-CPDF_ColorSpace* CPDF_Document::LoadColorSpace(CPDF_Object* pCSObj, CPDF_Dictionary* pResources)
-{
- return GetValidatePageData()->GetColorSpace(pCSObj, pResources);
-}
-CPDF_Pattern* CPDF_Document::LoadPattern(CPDF_Object* pPatternObj, FX_BOOL bShading, const CFX_AffineMatrix* matrix)
-{
- return GetValidatePageData()->GetPattern(pPatternObj, bShading, matrix);
-}
-CPDF_IccProfile* CPDF_Document::LoadIccProfile(CPDF_Stream* pStream, int nComponents)
-{
- return GetValidatePageData()->GetIccProfile(pStream, nComponents);
-}
-CPDF_Image* CPDF_Document::LoadImageF(CPDF_Object* pObj)
-{
- if (!pObj) {
- return NULL;
- }
- FXSYS_assert(pObj->GetObjNum());
- return GetValidatePageData()->GetImage(pObj);
-}
-void CPDF_Document::RemoveColorSpaceFromPageData(CPDF_Object* pCSObj)
-{
- if (!pCSObj) {
- return;
- }
- GetPageData()->ReleaseColorSpace(pCSObj);
-}
-CPDF_DocPageData::CPDF_DocPageData(CPDF_Document *pPDFDoc)
- : m_pPDFDoc(pPDFDoc)
- , m_FontMap()
- , m_ColorSpaceMap()
- , m_PatternMap()
- , m_ImageMap()
- , m_IccProfileMap()
- , m_FontFileMap()
-{
- m_FontMap.InitHashTable(64);
- m_ColorSpaceMap.InitHashTable(32);
- m_PatternMap.InitHashTable(16);
- m_ImageMap.InitHashTable(64);
- m_IccProfileMap.InitHashTable(16);
- m_FontFileMap.InitHashTable(32);
-}
-CPDF_DocPageData::~CPDF_DocPageData()
-{
- Clear(FALSE);
- Clear(TRUE);
- FX_POSITION pos = NULL;
-}
-void CPDF_DocPageData::Clear(FX_BOOL bRelease)
-{
- FX_POSITION pos;
- FX_DWORD nCount;
- {
- pos = m_PatternMap.GetStartPosition();
- while (pos) {
- CPDF_Object* ptObj;
- CPDF_CountedObject<CPDF_Pattern*>* ptData;
- m_PatternMap.GetNextAssoc(pos, ptObj, ptData);
- nCount = ptData->m_nCount;
- if (bRelease || nCount < 2) {
- delete ptData->m_Obj;
- ptData->m_Obj = NULL;
- }
- }
- }
- {
- pos = m_FontMap.GetStartPosition();
- while (pos) {
- CPDF_Dictionary* fontDict;
- CPDF_CountedObject<CPDF_Font*>* fontData;
- m_FontMap.GetNextAssoc(pos, fontDict, fontData);
- nCount = fontData->m_nCount;
- if (bRelease || nCount < 2) {
- delete fontData->m_Obj;
- fontData->m_Obj = NULL;
- }
- }
- }
- {
- pos = m_ImageMap.GetStartPosition();
- while (pos) {
- FX_DWORD objNum;
- CPDF_CountedObject<CPDF_Image*>* imageData;
- m_ImageMap.GetNextAssoc(pos, objNum, imageData);
- nCount = imageData->m_nCount;
- if (bRelease || nCount < 2) {
- delete imageData->m_Obj;
- delete imageData;
- m_ImageMap.RemoveKey(objNum);
- }
- }
- }
- {
- pos = m_ColorSpaceMap.GetStartPosition();
- while (pos) {
- CPDF_Object* csKey;
- CPDF_CountedObject<CPDF_ColorSpace*>* csData;
- m_ColorSpaceMap.GetNextAssoc(pos, csKey, csData);
- nCount = csData->m_nCount;
- if (bRelease || nCount < 2) {
- csData->m_Obj->ReleaseCS();
- csData->m_Obj = NULL;
- }
- }
- }
- {
- pos = m_IccProfileMap.GetStartPosition();
- while (pos) {
- CPDF_Stream* ipKey;
- CPDF_CountedObject<CPDF_IccProfile*>* ipData;
- m_IccProfileMap.GetNextAssoc(pos, ipKey, ipData);
- nCount = ipData->m_nCount;
- if (bRelease || nCount < 2) {
- FX_POSITION pos2 = m_HashProfileMap.GetStartPosition();
- while (pos2) {
- CFX_ByteString bsKey;
- CPDF_Stream* pFindStream = NULL;
- m_HashProfileMap.GetNextAssoc(pos2, bsKey, (void*&)pFindStream);
- if (ipKey == pFindStream) {
- m_HashProfileMap.RemoveKey(bsKey);
- break;
- }
- }
- delete ipData->m_Obj;
- delete ipData;
- m_IccProfileMap.RemoveKey(ipKey);
- }
- }
- }
- {
- pos = m_FontFileMap.GetStartPosition();
- while (pos) {
- CPDF_Stream* ftKey;
- CPDF_CountedObject<CPDF_StreamAcc*>* ftData;
- m_FontFileMap.GetNextAssoc(pos, ftKey, ftData);
- nCount = ftData->m_nCount;
- if (bRelease || nCount < 2) {
- delete ftData->m_Obj;
- delete ftData;
- m_FontFileMap.RemoveKey(ftKey);
- }
- }
- }
-}
-CPDF_Font* CPDF_DocPageData::GetFont(CPDF_Dictionary* pFontDict, FX_BOOL findOnly)
-{
- if (!pFontDict) {
- return NULL;
- }
- if (findOnly) {
- CPDF_CountedObject<CPDF_Font*>* fontData;
- if (m_FontMap.Lookup(pFontDict, fontData)) {
- if (!fontData->m_Obj) {
- return NULL;
- }
- fontData->m_nCount ++;
- return fontData->m_Obj;
- }
- return NULL;
- }
- CPDF_CountedObject<CPDF_Font*>* fontData = NULL;
- if (m_FontMap.Lookup(pFontDict, fontData)) {
- if (fontData->m_Obj) {
- fontData->m_nCount ++;
- return fontData->m_Obj;
- }
- }
- FX_BOOL bNew = FALSE;
- if (!fontData) {
- fontData = FX_NEW CPDF_CountedObject<CPDF_Font*>;
- bNew = TRUE;
- if (!fontData) {
- return NULL;
- }
- }
- CPDF_Font* pFont = CPDF_Font::CreateFontF(m_pPDFDoc, pFontDict);
- if (!pFont) {
- if (bNew) {
- delete fontData;
- }
- return NULL;
- }
- fontData->m_nCount = 2;
- fontData->m_Obj = pFont;
- m_FontMap.SetAt(pFontDict, fontData);
- return pFont;
-}
-CPDF_Font* CPDF_DocPageData::GetStandardFont(FX_BSTR fontName, CPDF_FontEncoding* pEncoding)
-{
- if (fontName.IsEmpty()) {
- return NULL;
- }
- FX_POSITION pos = m_FontMap.GetStartPosition();
- while (pos) {
- CPDF_Dictionary* fontDict;
- CPDF_CountedObject<CPDF_Font*>* fontData;
- m_FontMap.GetNextAssoc(pos, fontDict, fontData);
- CPDF_Font* pFont = fontData->m_Obj;
- if (!pFont) {
- continue;
- }
- if (pFont->GetBaseFont() != fontName) {
- continue;
- }
- if (pFont->IsEmbedded()) {
- continue;
- }
- if (pFont->GetFontType() != PDFFONT_TYPE1) {
- continue;
- }
- if (pFont->GetFontDict()->KeyExist(FX_BSTRC("Widths"))) {
- continue;
- }
- CPDF_Type1Font* pT1Font = pFont->GetType1Font();
- if (pEncoding && !pT1Font->GetEncoding()->IsIdentical(pEncoding)) {
- continue;
- }
- fontData->m_nCount ++;
- return pFont;
- }
- CPDF_Dictionary* pDict = FX_NEW CPDF_Dictionary;
- pDict->SetAtName(FX_BSTRC("Type"), FX_BSTRC("Font"));
- pDict->SetAtName(FX_BSTRC("Subtype"), FX_BSTRC("Type1"));
- pDict->SetAtName(FX_BSTRC("BaseFont"), fontName);
- if (pEncoding) {
- pDict->SetAt(FX_BSTRC("Encoding"), pEncoding->Realize());
- }
- m_pPDFDoc->AddIndirectObject(pDict);
- CPDF_CountedObject<CPDF_Font*>* fontData = FX_NEW CPDF_CountedObject<CPDF_Font*>;
- if (!fontData) {
- return NULL;
- }
- CPDF_Font* pFont = CPDF_Font::CreateFontF(m_pPDFDoc, pDict);
- if (!pFont) {
- delete fontData;
- return NULL;
- }
- fontData->m_nCount = 2;
- fontData->m_Obj = pFont;
- m_FontMap.SetAt(pDict, fontData);
- return pFont;
-}
-void CPDF_DocPageData::ReleaseFont(CPDF_Dictionary* pFontDict)
-{
- if (!pFontDict) {
- return;
- }
- CPDF_CountedObject<CPDF_Font*>* fontData;
- if (!m_FontMap.Lookup(pFontDict, fontData)) {
- return;
- }
- if (fontData->m_Obj && --fontData->m_nCount == 0) {
- delete fontData->m_Obj;
- fontData->m_Obj = NULL;
- }
-}
-CPDF_ColorSpace* CPDF_DocPageData::GetColorSpace(CPDF_Object* pCSObj, CPDF_Dictionary* pResources)
-{
- if (!pCSObj) {
- return NULL;
- }
- if (pCSObj->GetType() == PDFOBJ_NAME) {
- CFX_ByteString name = pCSObj->GetConstString();
- CPDF_ColorSpace* pCS = _CSFromName(name);
- if (!pCS && pResources) {
- CPDF_Dictionary* pList = pResources->GetDict(FX_BSTRC("ColorSpace"));
- if (pList) {
- pCSObj = pList->GetElementValue(name);
- return GetColorSpace(pCSObj, NULL);
- }
- }
- if (pCS == NULL || pResources == NULL) {
- return pCS;
- }
- CPDF_Dictionary* pColorSpaces = pResources->GetDict(FX_BSTRC("ColorSpace"));
- if (pColorSpaces == NULL) {
- return pCS;
- }
- CPDF_Object* pDefaultCS = NULL;
- switch (pCS->GetFamily()) {
- case PDFCS_DEVICERGB:
- pDefaultCS = pColorSpaces->GetElementValue(FX_BSTRC("DefaultRGB"));
- break;
- case PDFCS_DEVICEGRAY:
- pDefaultCS = pColorSpaces->GetElementValue(FX_BSTRC("DefaultGray"));
- break;
- case PDFCS_DEVICECMYK:
- pDefaultCS = pColorSpaces->GetElementValue(FX_BSTRC("DefaultCMYK"));
- break;
- }
- if (pDefaultCS == NULL) {
- return pCS;
- }
- return GetColorSpace(pDefaultCS, NULL);
- }
- if (pCSObj->GetType() != PDFOBJ_ARRAY) {
- return NULL;
- }
- CPDF_Array* pArray = (CPDF_Array*)pCSObj;
- if (pArray->GetCount() == 0) {
- return NULL;
- }
- if (pArray->GetCount() == 1) {
- return GetColorSpace(pArray->GetElementValue(0), pResources);
- }
- CPDF_CountedObject<CPDF_ColorSpace*>* csData = NULL;
- if (m_ColorSpaceMap.Lookup(pCSObj, csData)) {
- if (csData->m_Obj) {
- csData->m_nCount++;
- return csData->m_Obj;
- }
- }
- FX_BOOL bNew = FALSE;
- if (!csData) {
- csData = FX_NEW CPDF_CountedObject<CPDF_ColorSpace*>;
- if (!csData) {
- return NULL;
- }
- bNew = TRUE;
- }
- CPDF_ColorSpace* pCS = CPDF_ColorSpace::Load(m_pPDFDoc, pArray);
- if (!pCS) {
- if (bNew) {
- delete csData;
- }
- return NULL;
- }
- csData->m_nCount = 2;
- csData->m_Obj = pCS;
- m_ColorSpaceMap.SetAt(pCSObj, csData);
- return pCS;
-}
-CPDF_ColorSpace* CPDF_DocPageData::GetCopiedColorSpace(CPDF_Object* pCSObj)
-{
- if (!pCSObj) {
- return NULL;
- }
- CPDF_CountedObject<CPDF_ColorSpace*>* csData;
- if (!m_ColorSpaceMap.Lookup(pCSObj, csData)) {
- return NULL;
- }
- if (!csData->m_Obj) {
- return NULL;
- }
- csData->m_nCount ++;
- return csData->m_Obj;
-}
-void CPDF_DocPageData::ReleaseColorSpace(CPDF_Object* pColorSpace)
-{
- if (!pColorSpace) {
- return;
- }
- CPDF_CountedObject<CPDF_ColorSpace*>* csData;
- if (!m_ColorSpaceMap.Lookup(pColorSpace, csData)) {
- return;
- }
- if (csData->m_Obj && --csData->m_nCount == 0) {
- csData->m_Obj->ReleaseCS();
- csData->m_Obj = NULL;
- }
-}
-CPDF_Pattern* CPDF_DocPageData::GetPattern(CPDF_Object* pPatternObj, FX_BOOL bShading, const CFX_AffineMatrix* matrix)
-{
- if (!pPatternObj) {
- return NULL;
- }
- CPDF_CountedObject<CPDF_Pattern*>* ptData = NULL;
- if (m_PatternMap.Lookup(pPatternObj, ptData)) {
- if (ptData->m_Obj) {
- ptData->m_nCount++;
- return ptData->m_Obj;
- }
- }
- FX_BOOL bNew = FALSE;
- if (!ptData) {
- ptData = FX_NEW CPDF_CountedObject<CPDF_Pattern*>;
- bNew = TRUE;
- if (!ptData) {
- return NULL;
- }
- }
- CPDF_Pattern* pPattern = NULL;
- if (bShading) {
- pPattern = FX_NEW CPDF_ShadingPattern(m_pPDFDoc, pPatternObj, bShading, matrix);
- } else {
- CPDF_Dictionary* pDict = pPatternObj->GetDict();
- if (pDict) {
- int type = pDict->GetInteger(FX_BSTRC("PatternType"));
- if (type == 1) {
- pPattern = FX_NEW CPDF_TilingPattern(m_pPDFDoc, pPatternObj, matrix);
- } else if (type == 2) {
- pPattern = FX_NEW CPDF_ShadingPattern(m_pPDFDoc, pPatternObj, FALSE, matrix);
- }
- }
- }
- if (!pPattern) {
- if (bNew) {
- delete ptData;
- }
- return NULL;
- }
- ptData->m_nCount = 2;
- ptData->m_Obj = pPattern;
- m_PatternMap.SetAt(pPatternObj, ptData);
- return pPattern;
-}
-void CPDF_DocPageData::ReleasePattern(CPDF_Object* pPatternObj)
-{
- if (!pPatternObj) {
- return;
- }
- CPDF_CountedObject<CPDF_Pattern*>* ptData;
- if (!m_PatternMap.Lookup(pPatternObj, ptData)) {
- return;
- }
- if (ptData->m_Obj && --ptData->m_nCount == 0) {
- delete ptData->m_Obj;
- ptData->m_Obj = NULL;
- }
-}
-CPDF_Image* CPDF_DocPageData::GetImage(CPDF_Object* pImageStream)
-{
- if (!pImageStream) {
- return NULL;
- }
- FX_DWORD dwImageObjNum = pImageStream->GetObjNum();
- CPDF_CountedObject<CPDF_Image*>* imageData;
- if (m_ImageMap.Lookup(dwImageObjNum, imageData)) {
- imageData->m_nCount ++;
- return imageData->m_Obj;
- }
- imageData = FX_NEW CPDF_CountedObject<CPDF_Image*>;
- if (!imageData) {
- return NULL;
- }
- CPDF_Image* pImage = FX_NEW CPDF_Image(m_pPDFDoc);
- if (!pImage) {
- delete imageData;
- return NULL;
- }
- pImage->LoadImageF((CPDF_Stream*)pImageStream, FALSE);
- imageData->m_nCount = 2;
- imageData->m_Obj = pImage;
- m_ImageMap.SetAt(dwImageObjNum, imageData);
- return pImage;
-}
-void CPDF_DocPageData::ReleaseImage(CPDF_Object* pImageStream)
-{
- if (!pImageStream) {
- return;
- }
- PDF_DocPageData_Release<FX_DWORD, CPDF_Image*>(m_ImageMap, pImageStream->GetObjNum(), NULL);
-}
-CPDF_IccProfile* CPDF_DocPageData::GetIccProfile(CPDF_Stream* pIccProfileStream, FX_INT32 nComponents)
-{
- if (!pIccProfileStream) {
- return NULL;
- }
- CPDF_CountedObject<CPDF_IccProfile*>* ipData = NULL;
- if (m_IccProfileMap.Lookup(pIccProfileStream, ipData)) {
- ipData->m_nCount++;
- return ipData->m_Obj;
- }
- CPDF_StreamAcc stream;
- stream.LoadAllData(pIccProfileStream, FALSE);
- FX_BYTE digest[20];
- CPDF_Stream* pCopiedStream = NULL;
- CRYPT_SHA1Generate(stream.GetData(), stream.GetSize(), digest);
- if (m_HashProfileMap.Lookup(CFX_ByteStringC(digest, 20), (void*&)pCopiedStream)) {
- m_IccProfileMap.Lookup(pCopiedStream, ipData);
- ipData->m_nCount++;
- return ipData->m_Obj;
- }
- CPDF_IccProfile* pProfile = FX_NEW CPDF_IccProfile(stream.GetData(), stream.GetSize(), nComponents);
- if (!pProfile) {
- return NULL;
- }
- ipData = FX_NEW CPDF_CountedObject<CPDF_IccProfile*>;
- if (!ipData) {
- delete pProfile;
- return NULL;
- }
- ipData->m_nCount = 2;
- ipData->m_Obj = pProfile;
- m_IccProfileMap.SetAt(pIccProfileStream, ipData);
- m_HashProfileMap.SetAt(CFX_ByteStringC(digest, 20), pIccProfileStream);
- return pProfile;
-}
-void CPDF_DocPageData::ReleaseIccProfile(CPDF_Stream* pIccProfileStream, CPDF_IccProfile* pIccProfile)
-{
- if (!pIccProfileStream && !pIccProfile) {
- return;
- }
- CPDF_CountedObject<CPDF_IccProfile*>* ipData = NULL;
- if (m_IccProfileMap.Lookup(pIccProfileStream, ipData) && ipData->m_nCount < 2) {
- FX_POSITION pos = m_HashProfileMap.GetStartPosition();
- while (pos) {
- CFX_ByteString key;
- CPDF_Stream* pFindStream = NULL;
- m_HashProfileMap.GetNextAssoc(pos, key, (void*&)pFindStream);
- if (pIccProfileStream == pFindStream) {
- m_HashProfileMap.RemoveKey(key);
- break;
- }
- }
- }
- PDF_DocPageData_Release<CPDF_Stream*, CPDF_IccProfile*>(m_IccProfileMap, pIccProfileStream, pIccProfile);
-}
-CPDF_StreamAcc* CPDF_DocPageData::GetFontFileStreamAcc(CPDF_Stream* pFontStream)
-{
- if (!pFontStream) {
- return NULL;
- }
- CPDF_CountedObject<CPDF_StreamAcc*>* ftData;
- if (m_FontFileMap.Lookup(pFontStream, ftData)) {
- ftData->m_nCount ++;
- return ftData->m_Obj;
- }
- ftData = FX_NEW CPDF_CountedObject<CPDF_StreamAcc*>;
- if (!ftData) {
- return NULL;
- }
- CPDF_StreamAcc* pFontFile = FX_NEW CPDF_StreamAcc;
- if (!pFontFile) {
- delete ftData;
- return NULL;
- }
- CPDF_Dictionary* pFontDict = pFontStream->GetDict();
- FX_INT32 org_size = pFontDict->GetInteger(FX_BSTRC("Length1")) + pFontDict->GetInteger(FX_BSTRC("Length2")) + pFontDict->GetInteger(FX_BSTRC("Length3"));
- if (org_size < 0) {
- org_size = 0;
- }
- pFontFile->LoadAllData(pFontStream, FALSE, org_size);
- ftData->m_nCount = 2;
- ftData->m_Obj = pFontFile;
- m_FontFileMap.SetAt(pFontStream, ftData);
- return pFontFile;
-}
-void CPDF_DocPageData::ReleaseFontFileStreamAcc(CPDF_Stream* pFontStream, FX_BOOL bForce)
-{
- if (!pFontStream) {
- return;
- }
- PDF_DocPageData_Release<CPDF_Stream*, CPDF_StreamAcc*>(m_FontFileMap, pFontStream, NULL, bForce);
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fpdfapi/fpdf_page.h"
+#include "../../../include/fpdfapi/fpdf_module.h"
+#include "../../../include/fdrm/fx_crypt.h"
+#include "../fpdf_font/font_int.h"
+#include "pageint.h"
+class CPDF_PageModule : public CPDF_PageModuleDef
+{
+public:
+ CPDF_PageModule() : m_StockGrayCS(PDFCS_DEVICEGRAY), m_StockRGBCS(PDFCS_DEVICERGB),
+ m_StockCMYKCS(PDFCS_DEVICECMYK) {}
+ virtual ~CPDF_PageModule() {}
+ virtual FX_BOOL Installed()
+ {
+ return TRUE;
+ }
+ virtual CPDF_DocPageData* CreateDocData(CPDF_Document* pDoc)
+ {
+ return FX_NEW CPDF_DocPageData(pDoc);
+ }
+ virtual void ReleaseDoc(CPDF_Document* pDoc);
+ virtual void ClearDoc(CPDF_Document* pDoc);
+ virtual CPDF_FontGlobals* GetFontGlobals()
+ {
+ return &m_FontGlobals;
+ }
+ virtual void ClearStockFont(CPDF_Document* pDoc)
+ {
+ m_FontGlobals.Clear(pDoc);
+ }
+ virtual CPDF_ColorSpace* GetStockCS(int family);
+ virtual void NotifyCJKAvailable();
+ CPDF_FontGlobals m_FontGlobals;
+ CPDF_DeviceCS m_StockGrayCS;
+ CPDF_DeviceCS m_StockRGBCS;
+ CPDF_DeviceCS m_StockCMYKCS;
+ CPDF_PatternCS m_StockPatternCS;
+};
+CPDF_ColorSpace* CPDF_PageModule::GetStockCS(int family)
+{
+ if (family == PDFCS_DEVICEGRAY) {
+ return &m_StockGrayCS;
+ }
+ if (family == PDFCS_DEVICERGB) {
+ return &m_StockRGBCS;
+ }
+ if (family == PDFCS_DEVICECMYK) {
+ return &m_StockCMYKCS;
+ }
+ if (family == PDFCS_PATTERN) {
+ return &m_StockPatternCS;
+ }
+ return NULL;
+}
+void CPDF_ModuleMgr::InitPageModule()
+{
+ if (m_pPageModule) {
+ delete m_pPageModule;
+ }
+ CPDF_PageModule* pPageModule = FX_NEW CPDF_PageModule;
+ m_pPageModule = pPageModule;
+}
+void CPDF_PageModule::ReleaseDoc(CPDF_Document* pDoc)
+{
+ delete pDoc->GetPageData();
+}
+void CPDF_PageModule::ClearDoc(CPDF_Document* pDoc)
+{
+ pDoc->GetPageData()->Clear(FALSE);
+}
+void CPDF_PageModule::NotifyCJKAvailable()
+{
+ m_FontGlobals.m_CMapManager.ReloadAll();
+}
+CPDF_Font* CPDF_Document::LoadFont(CPDF_Dictionary* pFontDict)
+{
+ if (!pFontDict) {
+ return NULL;
+ }
+ return GetValidatePageData()->GetFont(pFontDict, FALSE);
+}
+CPDF_Font* CPDF_Document::FindFont(CPDF_Dictionary* pFontDict)
+{
+ if (!pFontDict) {
+ return NULL;
+ }
+ return GetValidatePageData()->GetFont(pFontDict, TRUE);
+}
+CPDF_StreamAcc* CPDF_Document::LoadFontFile(CPDF_Stream* pStream)
+{
+ if (pStream == NULL) {
+ return NULL;
+ }
+ return GetValidatePageData()->GetFontFileStreamAcc(pStream);
+}
+CPDF_ColorSpace* _CSFromName(const CFX_ByteString& name);
+CPDF_ColorSpace* CPDF_Document::LoadColorSpace(CPDF_Object* pCSObj, CPDF_Dictionary* pResources)
+{
+ return GetValidatePageData()->GetColorSpace(pCSObj, pResources);
+}
+CPDF_Pattern* CPDF_Document::LoadPattern(CPDF_Object* pPatternObj, FX_BOOL bShading, const CFX_AffineMatrix* matrix)
+{
+ return GetValidatePageData()->GetPattern(pPatternObj, bShading, matrix);
+}
+CPDF_IccProfile* CPDF_Document::LoadIccProfile(CPDF_Stream* pStream, int nComponents)
+{
+ return GetValidatePageData()->GetIccProfile(pStream, nComponents);
+}
+CPDF_Image* CPDF_Document::LoadImageF(CPDF_Object* pObj)
+{
+ if (!pObj) {
+ return NULL;
+ }
+ FXSYS_assert(pObj->GetObjNum());
+ return GetValidatePageData()->GetImage(pObj);
+}
+void CPDF_Document::RemoveColorSpaceFromPageData(CPDF_Object* pCSObj)
+{
+ if (!pCSObj) {
+ return;
+ }
+ GetPageData()->ReleaseColorSpace(pCSObj);
+}
+CPDF_DocPageData::CPDF_DocPageData(CPDF_Document *pPDFDoc)
+ : m_pPDFDoc(pPDFDoc)
+ , m_FontMap()
+ , m_ColorSpaceMap()
+ , m_PatternMap()
+ , m_ImageMap()
+ , m_IccProfileMap()
+ , m_FontFileMap()
+{
+ m_FontMap.InitHashTable(64);
+ m_ColorSpaceMap.InitHashTable(32);
+ m_PatternMap.InitHashTable(16);
+ m_ImageMap.InitHashTable(64);
+ m_IccProfileMap.InitHashTable(16);
+ m_FontFileMap.InitHashTable(32);
+}
+CPDF_DocPageData::~CPDF_DocPageData()
+{
+ Clear(FALSE);
+ Clear(TRUE);
+ FX_POSITION pos = NULL;
+}
+void CPDF_DocPageData::Clear(FX_BOOL bRelease)
+{
+ FX_POSITION pos;
+ FX_DWORD nCount;
+ {
+ pos = m_PatternMap.GetStartPosition();
+ while (pos) {
+ CPDF_Object* ptObj;
+ CPDF_CountedObject<CPDF_Pattern*>* ptData;
+ m_PatternMap.GetNextAssoc(pos, ptObj, ptData);
+ nCount = ptData->m_nCount;
+ if (bRelease || nCount < 2) {
+ delete ptData->m_Obj;
+ ptData->m_Obj = NULL;
+ }
+ }
+ }
+ {
+ pos = m_FontMap.GetStartPosition();
+ while (pos) {
+ CPDF_Dictionary* fontDict;
+ CPDF_CountedObject<CPDF_Font*>* fontData;
+ m_FontMap.GetNextAssoc(pos, fontDict, fontData);
+ nCount = fontData->m_nCount;
+ if (bRelease || nCount < 2) {
+ delete fontData->m_Obj;
+ fontData->m_Obj = NULL;
+ }
+ }
+ }
+ {
+ pos = m_ImageMap.GetStartPosition();
+ while (pos) {
+ FX_DWORD objNum;
+ CPDF_CountedObject<CPDF_Image*>* imageData;
+ m_ImageMap.GetNextAssoc(pos, objNum, imageData);
+ nCount = imageData->m_nCount;
+ if (bRelease || nCount < 2) {
+ delete imageData->m_Obj;
+ delete imageData;
+ m_ImageMap.RemoveKey(objNum);
+ }
+ }
+ }
+ {
+ pos = m_ColorSpaceMap.GetStartPosition();
+ while (pos) {
+ CPDF_Object* csKey;
+ CPDF_CountedObject<CPDF_ColorSpace*>* csData;
+ m_ColorSpaceMap.GetNextAssoc(pos, csKey, csData);
+ nCount = csData->m_nCount;
+ if (bRelease || nCount < 2) {
+ csData->m_Obj->ReleaseCS();
+ csData->m_Obj = NULL;
+ }
+ }
+ }
+ {
+ pos = m_IccProfileMap.GetStartPosition();
+ while (pos) {
+ CPDF_Stream* ipKey;
+ CPDF_CountedObject<CPDF_IccProfile*>* ipData;
+ m_IccProfileMap.GetNextAssoc(pos, ipKey, ipData);
+ nCount = ipData->m_nCount;
+ if (bRelease || nCount < 2) {
+ FX_POSITION pos2 = m_HashProfileMap.GetStartPosition();
+ while (pos2) {
+ CFX_ByteString bsKey;
+ CPDF_Stream* pFindStream = NULL;
+ m_HashProfileMap.GetNextAssoc(pos2, bsKey, (void*&)pFindStream);
+ if (ipKey == pFindStream) {
+ m_HashProfileMap.RemoveKey(bsKey);
+ break;
+ }
+ }
+ delete ipData->m_Obj;
+ delete ipData;
+ m_IccProfileMap.RemoveKey(ipKey);
+ }
+ }
+ }
+ {
+ pos = m_FontFileMap.GetStartPosition();
+ while (pos) {
+ CPDF_Stream* ftKey;
+ CPDF_CountedObject<CPDF_StreamAcc*>* ftData;
+ m_FontFileMap.GetNextAssoc(pos, ftKey, ftData);
+ nCount = ftData->m_nCount;
+ if (bRelease || nCount < 2) {
+ delete ftData->m_Obj;
+ delete ftData;
+ m_FontFileMap.RemoveKey(ftKey);
+ }
+ }
+ }
+}
+CPDF_Font* CPDF_DocPageData::GetFont(CPDF_Dictionary* pFontDict, FX_BOOL findOnly)
+{
+ if (!pFontDict) {
+ return NULL;
+ }
+ if (findOnly) {
+ CPDF_CountedObject<CPDF_Font*>* fontData;
+ if (m_FontMap.Lookup(pFontDict, fontData)) {
+ if (!fontData->m_Obj) {
+ return NULL;
+ }
+ fontData->m_nCount ++;
+ return fontData->m_Obj;
+ }
+ return NULL;
+ }
+ CPDF_CountedObject<CPDF_Font*>* fontData = NULL;
+ if (m_FontMap.Lookup(pFontDict, fontData)) {
+ if (fontData->m_Obj) {
+ fontData->m_nCount ++;
+ return fontData->m_Obj;
+ }
+ }
+ FX_BOOL bNew = FALSE;
+ if (!fontData) {
+ fontData = FX_NEW CPDF_CountedObject<CPDF_Font*>;
+ bNew = TRUE;
+ if (!fontData) {
+ return NULL;
+ }
+ }
+ CPDF_Font* pFont = CPDF_Font::CreateFontF(m_pPDFDoc, pFontDict);
+ if (!pFont) {
+ if (bNew) {
+ delete fontData;
+ }
+ return NULL;
+ }
+ fontData->m_nCount = 2;
+ fontData->m_Obj = pFont;
+ m_FontMap.SetAt(pFontDict, fontData);
+ return pFont;
+}
+CPDF_Font* CPDF_DocPageData::GetStandardFont(FX_BSTR fontName, CPDF_FontEncoding* pEncoding)
+{
+ if (fontName.IsEmpty()) {
+ return NULL;
+ }
+ FX_POSITION pos = m_FontMap.GetStartPosition();
+ while (pos) {
+ CPDF_Dictionary* fontDict;
+ CPDF_CountedObject<CPDF_Font*>* fontData;
+ m_FontMap.GetNextAssoc(pos, fontDict, fontData);
+ CPDF_Font* pFont = fontData->m_Obj;
+ if (!pFont) {
+ continue;
+ }
+ if (pFont->GetBaseFont() != fontName) {
+ continue;
+ }
+ if (pFont->IsEmbedded()) {
+ continue;
+ }
+ if (pFont->GetFontType() != PDFFONT_TYPE1) {
+ continue;
+ }
+ if (pFont->GetFontDict()->KeyExist(FX_BSTRC("Widths"))) {
+ continue;
+ }
+ CPDF_Type1Font* pT1Font = pFont->GetType1Font();
+ if (pEncoding && !pT1Font->GetEncoding()->IsIdentical(pEncoding)) {
+ continue;
+ }
+ fontData->m_nCount ++;
+ return pFont;
+ }
+ CPDF_Dictionary* pDict = FX_NEW CPDF_Dictionary;
+ pDict->SetAtName(FX_BSTRC("Type"), FX_BSTRC("Font"));
+ pDict->SetAtName(FX_BSTRC("Subtype"), FX_BSTRC("Type1"));
+ pDict->SetAtName(FX_BSTRC("BaseFont"), fontName);
+ if (pEncoding) {
+ pDict->SetAt(FX_BSTRC("Encoding"), pEncoding->Realize());
+ }
+ m_pPDFDoc->AddIndirectObject(pDict);
+ CPDF_CountedObject<CPDF_Font*>* fontData = FX_NEW CPDF_CountedObject<CPDF_Font*>;
+ if (!fontData) {
+ return NULL;
+ }
+ CPDF_Font* pFont = CPDF_Font::CreateFontF(m_pPDFDoc, pDict);
+ if (!pFont) {
+ delete fontData;
+ return NULL;
+ }
+ fontData->m_nCount = 2;
+ fontData->m_Obj = pFont;
+ m_FontMap.SetAt(pDict, fontData);
+ return pFont;
+}
+void CPDF_DocPageData::ReleaseFont(CPDF_Dictionary* pFontDict)
+{
+ if (!pFontDict) {
+ return;
+ }
+ CPDF_CountedObject<CPDF_Font*>* fontData;
+ if (!m_FontMap.Lookup(pFontDict, fontData)) {
+ return;
+ }
+ if (fontData->m_Obj && --fontData->m_nCount == 0) {
+ delete fontData->m_Obj;
+ fontData->m_Obj = NULL;
+ }
+}
+CPDF_ColorSpace* CPDF_DocPageData::GetColorSpace(CPDF_Object* pCSObj, CPDF_Dictionary* pResources)
+{
+ if (!pCSObj) {
+ return NULL;
+ }
+ if (pCSObj->GetType() == PDFOBJ_NAME) {
+ CFX_ByteString name = pCSObj->GetConstString();
+ CPDF_ColorSpace* pCS = _CSFromName(name);
+ if (!pCS && pResources) {
+ CPDF_Dictionary* pList = pResources->GetDict(FX_BSTRC("ColorSpace"));
+ if (pList) {
+ pCSObj = pList->GetElementValue(name);
+ return GetColorSpace(pCSObj, NULL);
+ }
+ }
+ if (pCS == NULL || pResources == NULL) {
+ return pCS;
+ }
+ CPDF_Dictionary* pColorSpaces = pResources->GetDict(FX_BSTRC("ColorSpace"));
+ if (pColorSpaces == NULL) {
+ return pCS;
+ }
+ CPDF_Object* pDefaultCS = NULL;
+ switch (pCS->GetFamily()) {
+ case PDFCS_DEVICERGB:
+ pDefaultCS = pColorSpaces->GetElementValue(FX_BSTRC("DefaultRGB"));
+ break;
+ case PDFCS_DEVICEGRAY:
+ pDefaultCS = pColorSpaces->GetElementValue(FX_BSTRC("DefaultGray"));
+ break;
+ case PDFCS_DEVICECMYK:
+ pDefaultCS = pColorSpaces->GetElementValue(FX_BSTRC("DefaultCMYK"));
+ break;
+ }
+ if (pDefaultCS == NULL) {
+ return pCS;
+ }
+ return GetColorSpace(pDefaultCS, NULL);
+ }
+ if (pCSObj->GetType() != PDFOBJ_ARRAY) {
+ return NULL;
+ }
+ CPDF_Array* pArray = (CPDF_Array*)pCSObj;
+ if (pArray->GetCount() == 0) {
+ return NULL;
+ }
+ if (pArray->GetCount() == 1) {
+ return GetColorSpace(pArray->GetElementValue(0), pResources);
+ }
+ CPDF_CountedObject<CPDF_ColorSpace*>* csData = NULL;
+ if (m_ColorSpaceMap.Lookup(pCSObj, csData)) {
+ if (csData->m_Obj) {
+ csData->m_nCount++;
+ return csData->m_Obj;
+ }
+ }
+ FX_BOOL bNew = FALSE;
+ if (!csData) {
+ csData = FX_NEW CPDF_CountedObject<CPDF_ColorSpace*>;
+ if (!csData) {
+ return NULL;
+ }
+ bNew = TRUE;
+ }
+ CPDF_ColorSpace* pCS = CPDF_ColorSpace::Load(m_pPDFDoc, pArray);
+ if (!pCS) {
+ if (bNew) {
+ delete csData;
+ }
+ return NULL;
+ }
+ csData->m_nCount = 2;
+ csData->m_Obj = pCS;
+ m_ColorSpaceMap.SetAt(pCSObj, csData);
+ return pCS;
+}
+CPDF_ColorSpace* CPDF_DocPageData::GetCopiedColorSpace(CPDF_Object* pCSObj)
+{
+ if (!pCSObj) {
+ return NULL;
+ }
+ CPDF_CountedObject<CPDF_ColorSpace*>* csData;
+ if (!m_ColorSpaceMap.Lookup(pCSObj, csData)) {
+ return NULL;
+ }
+ if (!csData->m_Obj) {
+ return NULL;
+ }
+ csData->m_nCount ++;
+ return csData->m_Obj;
+}
+void CPDF_DocPageData::ReleaseColorSpace(CPDF_Object* pColorSpace)
+{
+ if (!pColorSpace) {
+ return;
+ }
+ CPDF_CountedObject<CPDF_ColorSpace*>* csData;
+ if (!m_ColorSpaceMap.Lookup(pColorSpace, csData)) {
+ return;
+ }
+ if (csData->m_Obj && --csData->m_nCount == 0) {
+ csData->m_Obj->ReleaseCS();
+ csData->m_Obj = NULL;
+ }
+}
+CPDF_Pattern* CPDF_DocPageData::GetPattern(CPDF_Object* pPatternObj, FX_BOOL bShading, const CFX_AffineMatrix* matrix)
+{
+ if (!pPatternObj) {
+ return NULL;
+ }
+ CPDF_CountedObject<CPDF_Pattern*>* ptData = NULL;
+ if (m_PatternMap.Lookup(pPatternObj, ptData)) {
+ if (ptData->m_Obj) {
+ ptData->m_nCount++;
+ return ptData->m_Obj;
+ }
+ }
+ FX_BOOL bNew = FALSE;
+ if (!ptData) {
+ ptData = FX_NEW CPDF_CountedObject<CPDF_Pattern*>;
+ bNew = TRUE;
+ if (!ptData) {
+ return NULL;
+ }
+ }
+ CPDF_Pattern* pPattern = NULL;
+ if (bShading) {
+ pPattern = FX_NEW CPDF_ShadingPattern(m_pPDFDoc, pPatternObj, bShading, matrix);
+ } else {
+ CPDF_Dictionary* pDict = pPatternObj->GetDict();
+ if (pDict) {
+ int type = pDict->GetInteger(FX_BSTRC("PatternType"));
+ if (type == 1) {
+ pPattern = FX_NEW CPDF_TilingPattern(m_pPDFDoc, pPatternObj, matrix);
+ } else if (type == 2) {
+ pPattern = FX_NEW CPDF_ShadingPattern(m_pPDFDoc, pPatternObj, FALSE, matrix);
+ }
+ }
+ }
+ if (!pPattern) {
+ if (bNew) {
+ delete ptData;
+ }
+ return NULL;
+ }
+ ptData->m_nCount = 2;
+ ptData->m_Obj = pPattern;
+ m_PatternMap.SetAt(pPatternObj, ptData);
+ return pPattern;
+}
+void CPDF_DocPageData::ReleasePattern(CPDF_Object* pPatternObj)
+{
+ if (!pPatternObj) {
+ return;
+ }
+ CPDF_CountedObject<CPDF_Pattern*>* ptData;
+ if (!m_PatternMap.Lookup(pPatternObj, ptData)) {
+ return;
+ }
+ if (ptData->m_Obj && --ptData->m_nCount == 0) {
+ delete ptData->m_Obj;
+ ptData->m_Obj = NULL;
+ }
+}
+CPDF_Image* CPDF_DocPageData::GetImage(CPDF_Object* pImageStream)
+{
+ if (!pImageStream) {
+ return NULL;
+ }
+ FX_DWORD dwImageObjNum = pImageStream->GetObjNum();
+ CPDF_CountedObject<CPDF_Image*>* imageData;
+ if (m_ImageMap.Lookup(dwImageObjNum, imageData)) {
+ imageData->m_nCount ++;
+ return imageData->m_Obj;
+ }
+ imageData = FX_NEW CPDF_CountedObject<CPDF_Image*>;
+ if (!imageData) {
+ return NULL;
+ }
+ CPDF_Image* pImage = FX_NEW CPDF_Image(m_pPDFDoc);
+ if (!pImage) {
+ delete imageData;
+ return NULL;
+ }
+ pImage->LoadImageF((CPDF_Stream*)pImageStream, FALSE);
+ imageData->m_nCount = 2;
+ imageData->m_Obj = pImage;
+ m_ImageMap.SetAt(dwImageObjNum, imageData);
+ return pImage;
+}
+void CPDF_DocPageData::ReleaseImage(CPDF_Object* pImageStream)
+{
+ if (!pImageStream) {
+ return;
+ }
+ PDF_DocPageData_Release<FX_DWORD, CPDF_Image*>(m_ImageMap, pImageStream->GetObjNum(), NULL);
+}
+CPDF_IccProfile* CPDF_DocPageData::GetIccProfile(CPDF_Stream* pIccProfileStream, FX_INT32 nComponents)
+{
+ if (!pIccProfileStream) {
+ return NULL;
+ }
+ CPDF_CountedObject<CPDF_IccProfile*>* ipData = NULL;
+ if (m_IccProfileMap.Lookup(pIccProfileStream, ipData)) {
+ ipData->m_nCount++;
+ return ipData->m_Obj;
+ }
+ CPDF_StreamAcc stream;
+ stream.LoadAllData(pIccProfileStream, FALSE);
+ FX_BYTE digest[20];
+ CPDF_Stream* pCopiedStream = NULL;
+ CRYPT_SHA1Generate(stream.GetData(), stream.GetSize(), digest);
+ if (m_HashProfileMap.Lookup(CFX_ByteStringC(digest, 20), (void*&)pCopiedStream)) {
+ m_IccProfileMap.Lookup(pCopiedStream, ipData);
+ ipData->m_nCount++;
+ return ipData->m_Obj;
+ }
+ CPDF_IccProfile* pProfile = FX_NEW CPDF_IccProfile(stream.GetData(), stream.GetSize(), nComponents);
+ if (!pProfile) {
+ return NULL;
+ }
+ ipData = FX_NEW CPDF_CountedObject<CPDF_IccProfile*>;
+ if (!ipData) {
+ delete pProfile;
+ return NULL;
+ }
+ ipData->m_nCount = 2;
+ ipData->m_Obj = pProfile;
+ m_IccProfileMap.SetAt(pIccProfileStream, ipData);
+ m_HashProfileMap.SetAt(CFX_ByteStringC(digest, 20), pIccProfileStream);
+ return pProfile;
+}
+void CPDF_DocPageData::ReleaseIccProfile(CPDF_Stream* pIccProfileStream, CPDF_IccProfile* pIccProfile)
+{
+ if (!pIccProfileStream && !pIccProfile) {
+ return;
+ }
+ CPDF_CountedObject<CPDF_IccProfile*>* ipData = NULL;
+ if (m_IccProfileMap.Lookup(pIccProfileStream, ipData) && ipData->m_nCount < 2) {
+ FX_POSITION pos = m_HashProfileMap.GetStartPosition();
+ while (pos) {
+ CFX_ByteString key;
+ CPDF_Stream* pFindStream = NULL;
+ m_HashProfileMap.GetNextAssoc(pos, key, (void*&)pFindStream);
+ if (pIccProfileStream == pFindStream) {
+ m_HashProfileMap.RemoveKey(key);
+ break;
+ }
+ }
+ }
+ PDF_DocPageData_Release<CPDF_Stream*, CPDF_IccProfile*>(m_IccProfileMap, pIccProfileStream, pIccProfile);
+}
+CPDF_StreamAcc* CPDF_DocPageData::GetFontFileStreamAcc(CPDF_Stream* pFontStream)
+{
+ if (!pFontStream) {
+ return NULL;
+ }
+ CPDF_CountedObject<CPDF_StreamAcc*>* ftData;
+ if (m_FontFileMap.Lookup(pFontStream, ftData)) {
+ ftData->m_nCount ++;
+ return ftData->m_Obj;
+ }
+ ftData = FX_NEW CPDF_CountedObject<CPDF_StreamAcc*>;
+ if (!ftData) {
+ return NULL;
+ }
+ CPDF_StreamAcc* pFontFile = FX_NEW CPDF_StreamAcc;
+ if (!pFontFile) {
+ delete ftData;
+ return NULL;
+ }
+ CPDF_Dictionary* pFontDict = pFontStream->GetDict();
+ FX_INT32 org_size = pFontDict->GetInteger(FX_BSTRC("Length1")) + pFontDict->GetInteger(FX_BSTRC("Length2")) + pFontDict->GetInteger(FX_BSTRC("Length3"));
+ if (org_size < 0) {
+ org_size = 0;
+ }
+ pFontFile->LoadAllData(pFontStream, FALSE, org_size);
+ ftData->m_nCount = 2;
+ ftData->m_Obj = pFontFile;
+ m_FontFileMap.SetAt(pFontStream, ftData);
+ return pFontFile;
+}
+void CPDF_DocPageData::ReleaseFontFileStreamAcc(CPDF_Stream* pFontStream, FX_BOOL bForce)
+{
+ if (!pFontStream) {
+ return;
+ }
+ PDF_DocPageData_Release<CPDF_Stream*, CPDF_StreamAcc*>(m_FontFileMap, pFontStream, NULL, bForce);
+}
diff --git a/core/src/fpdfapi/fpdf_page/fpdf_page_func.cpp b/core/src/fpdfapi/fpdf_page/fpdf_page_func.cpp
index 335460f320..5b178f955e 100644
--- a/core/src/fpdfapi/fpdf_page/fpdf_page_func.cpp
+++ b/core/src/fpdfapi/fpdf_page/fpdf_page_func.cpp
@@ -1,886 +1,886 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../../include/fpdfapi/fpdf_page.h"
-#include "../../../include/fpdfapi/fpdf_module.h"
-#include "pageint.h"
-#include <limits.h>
-class CPDF_PSEngine;
-typedef enum {PSOP_ADD, PSOP_SUB, PSOP_MUL, PSOP_DIV, PSOP_IDIV, PSOP_MOD,
- PSOP_NEG, PSOP_ABS, PSOP_CEILING, PSOP_FLOOR, PSOP_ROUND, PSOP_TRUNCATE,
- PSOP_SQRT, PSOP_SIN, PSOP_COS, PSOP_ATAN, PSOP_EXP, PSOP_LN, PSOP_LOG,
- PSOP_CVI, PSOP_CVR, PSOP_EQ, PSOP_NE, PSOP_GT, PSOP_GE, PSOP_LT, PSOP_LE,
- PSOP_AND, PSOP_OR, PSOP_XOR, PSOP_NOT, PSOP_BITSHIFT, PSOP_TRUE, PSOP_FALSE,
- PSOP_IF, PSOP_IFELSE, PSOP_POP, PSOP_EXCH, PSOP_DUP, PSOP_COPY,
- PSOP_INDEX, PSOP_ROLL, PSOP_PROC, PSOP_CONST
- } PDF_PSOP;
-class CPDF_PSProc : public CFX_Object
-{
-public:
- ~CPDF_PSProc();
- FX_BOOL Parse(CPDF_SimpleParser& parser);
- FX_BOOL Execute(CPDF_PSEngine* pEngine);
- CFX_PtrArray m_Operators;
-};
-#define PSENGINE_STACKSIZE 100
-class CPDF_PSEngine : public CFX_Object
-{
-public:
- CPDF_PSEngine();
- ~CPDF_PSEngine();
- FX_BOOL Parse(const FX_CHAR* string, int size);
- FX_BOOL Execute()
- {
- return m_MainProc.Execute(this);
- }
- FX_BOOL DoOperator(PDF_PSOP op);
- void Reset()
- {
- m_StackCount = 0;
- }
- void Push(FX_FLOAT value);
- void Push(int value)
- {
- Push((FX_FLOAT)value);
- }
- FX_FLOAT Pop();
- int GetStackSize()
- {
- return m_StackCount;
- }
-private:
- FX_FLOAT m_Stack[PSENGINE_STACKSIZE];
- int m_StackCount;
- CPDF_PSProc m_MainProc;
-};
-CPDF_PSProc::~CPDF_PSProc()
-{
- int size = m_Operators.GetSize();
- for (int i = 0; i < size; i ++) {
- if (m_Operators[i] == (FX_LPVOID)PSOP_PROC) {
- delete (CPDF_PSProc*)m_Operators[i + 1];
- i ++;
- } else if (m_Operators[i] == (FX_LPVOID)PSOP_CONST) {
- FX_Free((FX_FLOAT*)m_Operators[i + 1]);
- i ++;
- }
- }
-}
-#pragma optimize( "", off )
-FX_BOOL CPDF_PSProc::Execute(CPDF_PSEngine* pEngine)
-{
- int size = m_Operators.GetSize();
- for (int i = 0; i < size; i ++) {
- PDF_PSOP op = (PDF_PSOP)(FX_UINTPTR)m_Operators[i];
- if (op == PSOP_PROC) {
- i ++;
- } else if (op == PSOP_CONST) {
- pEngine->Push(*(FX_FLOAT*)m_Operators[i + 1]);
- i ++;
- } else if (op == PSOP_IF) {
- if (i < 2 || m_Operators[i - 2] != (FX_LPVOID)PSOP_PROC) {
- return FALSE;
- }
- if ((int)pEngine->Pop()) {
- ((CPDF_PSProc*)m_Operators[i - 1])->Execute(pEngine);
- }
- } else if (op == PSOP_IFELSE) {
- if (i < 4 || m_Operators[i - 2] != (FX_LPVOID)PSOP_PROC ||
- m_Operators[i - 4] != (FX_LPVOID)PSOP_PROC) {
- return FALSE;
- }
- if ((int)pEngine->Pop()) {
- ((CPDF_PSProc*)m_Operators[i - 3])->Execute(pEngine);
- } else {
- ((CPDF_PSProc*)m_Operators[i - 1])->Execute(pEngine);
- }
- } else {
- pEngine->DoOperator(op);
- }
- }
- return TRUE;
-}
-#pragma optimize( "", on )
-CPDF_PSEngine::CPDF_PSEngine()
-{
- m_StackCount = 0;
-}
-CPDF_PSEngine::~CPDF_PSEngine()
-{
-}
-void CPDF_PSEngine::Push(FX_FLOAT v)
-{
- if (m_StackCount == 100) {
- return;
- }
- m_Stack[m_StackCount++] = v;
-}
-FX_FLOAT CPDF_PSEngine::Pop()
-{
- if (m_StackCount == 0) {
- return 0;
- }
- return m_Stack[--m_StackCount];
-}
-const struct _PDF_PSOpName {
- const FX_CHAR* name;
- PDF_PSOP op;
-} _PDF_PSOpNames[] = {
- {"add", PSOP_ADD}, {"sub", PSOP_SUB}, {"mul", PSOP_MUL}, {"div", PSOP_DIV},
- {"idiv", PSOP_IDIV}, {"mod", PSOP_MOD}, {"neg", PSOP_NEG}, {"abs", PSOP_ABS},
- {"ceiling", PSOP_CEILING}, {"floor", PSOP_FLOOR}, {"round", PSOP_ROUND},
- {"truncate", PSOP_TRUNCATE}, {"sqrt", PSOP_SQRT}, {"sin", PSOP_SIN},
- {"cos", PSOP_COS}, {"atan", PSOP_ATAN}, {"exp", PSOP_EXP}, {"ln", PSOP_LN},
- {"log", PSOP_LOG}, {"cvi", PSOP_CVI}, {"cvr", PSOP_CVR}, {"eq", PSOP_EQ},
- {"ne", PSOP_NE}, {"gt", PSOP_GT}, {"ge", PSOP_GE}, {"lt", PSOP_LT},
- {"le", PSOP_LE}, {"and", PSOP_AND}, {"or", PSOP_OR}, {"xor", PSOP_XOR},
- {"not", PSOP_NOT}, {"bitshift", PSOP_BITSHIFT}, {"true", PSOP_TRUE},
- {"false", PSOP_FALSE}, {"if", PSOP_IF}, {"ifelse", PSOP_IFELSE},
- {"pop", PSOP_POP}, {"exch", PSOP_EXCH}, {"dup", PSOP_DUP},
- {"copy", PSOP_COPY}, {"index", PSOP_INDEX}, {"roll", PSOP_ROLL},
- {NULL, PSOP_PROC}
-};
-FX_BOOL CPDF_PSEngine::Parse(const FX_CHAR* string, int size)
-{
- CPDF_SimpleParser parser((FX_LPBYTE)string, size);
- CFX_ByteStringC word = parser.GetWord();
- if (word != FX_BSTRC("{")) {
- return FALSE;
- }
- return m_MainProc.Parse(parser);
-}
-FX_BOOL CPDF_PSProc::Parse(CPDF_SimpleParser& parser)
-{
- while (1) {
- CFX_ByteStringC word = parser.GetWord();
- if (word.IsEmpty()) {
- return FALSE;
- }
- if (word == FX_BSTRC("}")) {
- return TRUE;
- }
- if (word == FX_BSTRC("{")) {
- CPDF_PSProc* pProc = FX_NEW CPDF_PSProc;
- m_Operators.Add((FX_LPVOID)PSOP_PROC);
- m_Operators.Add(pProc);
- if (!pProc->Parse(parser)) {
- return FALSE;
- }
- } else {
- int i = 0;
- while (_PDF_PSOpNames[i].name) {
- if (word == CFX_ByteStringC(_PDF_PSOpNames[i].name)) {
- m_Operators.Add((FX_LPVOID)_PDF_PSOpNames[i].op);
- break;
- }
- i ++;
- }
- if (_PDF_PSOpNames[i].name == NULL) {
- FX_FLOAT* pd = FX_Alloc(FX_FLOAT, 1);
- *pd = FX_atof(word);
- m_Operators.Add((FX_LPVOID)PSOP_CONST);
- m_Operators.Add(pd);
- }
- }
- }
-}
-#define PI 3.1415926535897932384626433832795f
-FX_BOOL CPDF_PSEngine::DoOperator(PDF_PSOP op)
-{
- int i1, i2;
- FX_FLOAT d1, d2;
- switch (op) {
- case PSOP_ADD:
- d1 = Pop();
- d2 = Pop();
- Push(d1 + d2);
- break;
- case PSOP_SUB:
- d2 = Pop();
- d1 = Pop();
- Push(d1 - d2);
- break;
- case PSOP_MUL:
- d1 = Pop();
- d2 = Pop();
- Push(d1 * d2);
- break;
- case PSOP_DIV:
- d2 = Pop();
- d1 = Pop();
- Push(d1 / d2);
- break;
- case PSOP_IDIV:
- i2 = (int)Pop();
- i1 = (int)Pop();
- Push(i1 / i2);
- break;
- case PSOP_MOD:
- i2 = (int)Pop();
- i1 = (int)Pop();
- Push(i1 % i2);
- break;
- case PSOP_NEG:
- d1 = Pop();
- Push(-d1);
- break;
- case PSOP_ABS:
- d1 = Pop();
- Push((FX_FLOAT)FXSYS_fabs(d1));
- break;
- case PSOP_CEILING:
- d1 = Pop();
- Push((FX_FLOAT)FXSYS_ceil(d1));
- break;
- case PSOP_FLOOR:
- d1 = Pop();
- Push((FX_FLOAT)FXSYS_floor(d1));
- break;
- case PSOP_ROUND:
- d1 = Pop();
- Push(FXSYS_round(d1));
- break;
- case PSOP_TRUNCATE:
- i1 = (int)Pop();
- Push(i1);
- break;
- case PSOP_SQRT:
- d1 = Pop();
- Push((FX_FLOAT)FXSYS_sqrt(d1));
- break;
- case PSOP_SIN:
- d1 = Pop();
- Push((FX_FLOAT)FXSYS_sin(d1 * PI / 180.0f));
- break;
- case PSOP_COS:
- d1 = Pop();
- Push((FX_FLOAT)FXSYS_cos(d1 * PI / 180.0f));
- break;
- case PSOP_ATAN:
- d2 = Pop();
- d1 = Pop();
- d1 = (FX_FLOAT)(FXSYS_atan2(d1, d2) * 180.0 / PI);
- if (d1 < 0) {
- d1 += 360;
- }
- Push(d1);
- break;
- case PSOP_EXP:
- d2 = Pop();
- d1 = Pop();
- Push((FX_FLOAT)FXSYS_pow(d1, d2));
- break;
- case PSOP_LN:
- d1 = Pop();
- Push((FX_FLOAT)FXSYS_log(d1));
- break;
- case PSOP_LOG:
- d1 = Pop();
- Push((FX_FLOAT)FXSYS_log10(d1));
- break;
- case PSOP_CVI:
- i1 = (int)Pop();
- Push(i1);
- break;
- case PSOP_CVR:
- break;
- case PSOP_EQ:
- d2 = Pop();
- d1 = Pop();
- Push((int)(d1 == d2));
- break;
- case PSOP_NE:
- d2 = Pop();
- d1 = Pop();
- Push((int)(d1 != d2));
- break;
- case PSOP_GT:
- d2 = Pop();
- d1 = Pop();
- Push((int)(d1 > d2));
- break;
- case PSOP_GE:
- d2 = Pop();
- d1 = Pop();
- Push((int)(d1 >= d2));
- break;
- case PSOP_LT:
- d2 = Pop();
- d1 = Pop();
- Push((int)(d1 < d2));
- break;
- case PSOP_LE:
- d2 = Pop();
- d1 = Pop();
- Push((int)(d1 <= d2));
- break;
- case PSOP_AND:
- i1 = (int)Pop();
- i2 = (int)Pop();
- Push(i1 & i2);
- break;
- case PSOP_OR:
- i1 = (int)Pop();
- i2 = (int)Pop();
- Push(i1 | i2);
- break;
- case PSOP_XOR:
- i1 = (int)Pop();
- i2 = (int)Pop();
- Push(i1 ^ i2);
- break;
- case PSOP_NOT:
- i1 = (int)Pop();
- Push((int)!i1);
- break;
- case PSOP_BITSHIFT: {
- int shift = (int)Pop();
- int i = (int)Pop();
- if (shift > 0) {
- Push(i << shift);
- } else {
- Push(i >> -shift);
- }
- break;
- }
- case PSOP_TRUE:
- Push(1);
- break;
- case PSOP_FALSE:
- Push(0);
- break;
- case PSOP_POP:
- Pop();
- break;
- case PSOP_EXCH:
- d2 = Pop();
- d1 = Pop();
- Push(d2);
- Push(d1);
- break;
- case PSOP_DUP:
- d1 = Pop();
- Push(d1);
- Push(d1);
- break;
- case PSOP_COPY: {
- int n = (int)Pop();
- if (n < 0 || n > PSENGINE_STACKSIZE || m_StackCount + n > PSENGINE_STACKSIZE || n > m_StackCount) {
- break;
- }
- for (int i = 0; i < n; i ++) {
- m_Stack[m_StackCount + i] = m_Stack[m_StackCount + i - n];
- }
- m_StackCount += n;
- break;
- }
- case PSOP_INDEX: {
- int n = (int)Pop();
- if (n < 0 || n >= m_StackCount) {
- break;
- }
- Push(m_Stack[m_StackCount - n - 1]);
- break;
- }
- case PSOP_ROLL: {
- int j = (int)Pop();
- int n = (int)Pop();
- if (m_StackCount == 0) {
- break;
- }
- if (n < 0 || n > m_StackCount) {
- break;
- }
- if (j < 0)
- for (int i = 0; i < -j; i ++) {
- FX_FLOAT first = m_Stack[m_StackCount - n];
- for (int ii = 0; ii < n - 1; ii ++) {
- m_Stack[m_StackCount - n + ii] = m_Stack[m_StackCount - n + ii + 1];
- }
- m_Stack[m_StackCount - 1] = first;
- }
- else
- for (int i = 0; i < j; i ++) {
- FX_FLOAT last = m_Stack[m_StackCount - 1];
- int ii;
- for (ii = 0; ii < n - 1; ii ++) {
- m_Stack[m_StackCount - ii - 1] = m_Stack[m_StackCount - ii - 2];
- }
- m_Stack[m_StackCount - ii - 1] = last;
- }
- break;
- }
- default:
- break;
- }
- return TRUE;
-}
-static FX_FLOAT PDF_Interpolate(FX_FLOAT x, FX_FLOAT xmin, FX_FLOAT xmax, FX_FLOAT ymin, FX_FLOAT ymax)
-{
- return ((x - xmin) * (ymax - ymin) / (xmax - xmin)) + ymin;
-}
-static FX_DWORD _GetBits32(FX_LPCBYTE pData, int bitpos, int nbits)
-{
- int result = 0;
- for (int i = 0; i < nbits; i ++)
- if (pData[(bitpos + i) / 8] & (1 << (7 - (bitpos + i) % 8))) {
- result |= 1 << (nbits - i - 1);
- }
- return result;
-}
-typedef struct {
- FX_FLOAT encode_max, encode_min;
- int sizes;
-} SampleEncodeInfo;
-typedef struct {
- FX_FLOAT decode_max, decode_min;
-} SampleDecodeInfo;
-class CPDF_SampledFunc : public CPDF_Function
-{
-public:
- CPDF_SampledFunc();
- virtual ~CPDF_SampledFunc();
- virtual FX_BOOL v_Init(CPDF_Object* pObj);
- virtual FX_BOOL v_Call(FX_FLOAT* inputs, FX_FLOAT* results) const;
- SampleEncodeInfo* m_pEncodeInfo;
- SampleDecodeInfo* m_pDecodeInfo;
- FX_DWORD m_nBitsPerSample, m_SampleMax;
- CPDF_StreamAcc* m_pSampleStream;
-};
-CPDF_SampledFunc::CPDF_SampledFunc()
-{
- m_pSampleStream = NULL;
- m_pEncodeInfo = NULL;
- m_pDecodeInfo = NULL;
-}
-CPDF_SampledFunc::~CPDF_SampledFunc()
-{
- if (m_pSampleStream) {
- delete m_pSampleStream;
- }
- if (m_pEncodeInfo) {
- FX_Free(m_pEncodeInfo);
- }
- if (m_pDecodeInfo) {
- FX_Free(m_pDecodeInfo);
- }
-}
-FX_BOOL CPDF_SampledFunc::v_Init(CPDF_Object* pObj)
-{
- if (pObj->GetType() != PDFOBJ_STREAM) {
- return FALSE;
- }
- CPDF_Stream* pStream = (CPDF_Stream*)pObj;
- CPDF_Dictionary* pDict = pStream->GetDict();
- CPDF_Array* pSize = pDict->GetArray(FX_BSTRC("Size"));
- CPDF_Array* pEncode = pDict->GetArray(FX_BSTRC("Encode"));
- CPDF_Array* pDecode = pDict->GetArray(FX_BSTRC("Decode"));
- m_nBitsPerSample = pDict->GetInteger(FX_BSTRC("BitsPerSample"));
- m_SampleMax = 0xffffffff >> (32 - m_nBitsPerSample);
- m_pSampleStream = FX_NEW CPDF_StreamAcc;
- m_pSampleStream->LoadAllData(pStream, FALSE);
- m_pEncodeInfo = FX_Alloc(SampleEncodeInfo, m_nInputs);
- int i;
- FX_DWORD nTotalSamples = 1;
- for (i = 0; i < m_nInputs; i ++) {
- m_pEncodeInfo[i].sizes = pSize->GetInteger(i);
- if (!pSize && i == 0) {
- m_pEncodeInfo[i].sizes = pDict->GetInteger(FX_BSTRC("Size"));
- }
- if (nTotalSamples > 0 && (FX_UINT32)(m_pEncodeInfo[i].sizes) > UINT_MAX / nTotalSamples) {
- return FALSE;
- }
- nTotalSamples *= m_pEncodeInfo[i].sizes;
- if (pEncode) {
- m_pEncodeInfo[i].encode_min = pEncode->GetFloat(i * 2);
- m_pEncodeInfo[i].encode_max = pEncode->GetFloat(i * 2 + 1);
- } else {
- m_pEncodeInfo[i].encode_min = 0;
- if (m_pEncodeInfo[i].sizes == 1) {
- m_pEncodeInfo[i].encode_max = 1;
- } else {
- m_pEncodeInfo[i].encode_max = (FX_FLOAT)m_pEncodeInfo[i].sizes - 1;
- }
- }
- }
- if (nTotalSamples > 0 && m_nBitsPerSample > UINT_MAX / nTotalSamples) {
- return FALSE;
- }
- nTotalSamples *= m_nBitsPerSample;
- if (nTotalSamples > 0 && ((FX_UINT32)m_nOutputs) > UINT_MAX / nTotalSamples) {
- return FALSE;
- }
- nTotalSamples *= m_nOutputs;
- if (nTotalSamples == 0 || m_pSampleStream->GetSize() * 8 < nTotalSamples) {
- return FALSE;
- }
- m_pDecodeInfo = FX_Alloc(SampleDecodeInfo, m_nOutputs);
- for (i = 0; i < m_nOutputs; i ++) {
- if (pDecode) {
- m_pDecodeInfo[i].decode_min = pDecode->GetFloat(2 * i);
- m_pDecodeInfo[i].decode_max = pDecode->GetFloat(2 * i + 1);
- } else {
- m_pDecodeInfo[i].decode_min = m_pRanges[i * 2];
- m_pDecodeInfo[i].decode_max = m_pRanges[i * 2 + 1];
- }
- }
- return TRUE;
-}
-FX_BOOL CPDF_SampledFunc::v_Call(FX_FLOAT* inputs, FX_FLOAT* results) const
-{
- int pos = 0;
- CFX_FixedBufGrow<FX_FLOAT, 16> encoded_input_buf(m_nInputs);
- FX_FLOAT* encoded_input = encoded_input_buf;
- CFX_FixedBufGrow<int, 32> int_buf(m_nInputs * 2);
- int* index = int_buf;
- int* blocksize = index + m_nInputs;
- for (int i = 0; i < m_nInputs; i ++) {
- if (i == 0) {
- blocksize[i] = 1;
- } else {
- blocksize[i] = blocksize[i - 1] * m_pEncodeInfo[i - 1].sizes;
- }
- encoded_input[i] = PDF_Interpolate(inputs[i], m_pDomains[i * 2], m_pDomains[i * 2 + 1],
- m_pEncodeInfo[i].encode_min, m_pEncodeInfo[i].encode_max);
- index[i] = (int)encoded_input[i];
- if (index[i] < 0) {
- index[i] = 0;
- } else if (index[i] > m_pEncodeInfo[i].sizes - 1) {
- index[i] = m_pEncodeInfo[i].sizes - 1;
- }
- pos += index[i] * blocksize[i];
- }
- int bitpos = pos * m_nBitsPerSample * m_nOutputs;
- FX_LPCBYTE pSampleData = m_pSampleStream->GetData();
- if (pSampleData == NULL) {
- return FALSE;
- }
- for (int j = 0; j < m_nOutputs; j ++) {
- FX_DWORD sample = _GetBits32(pSampleData, bitpos + j * m_nBitsPerSample, m_nBitsPerSample);
- FX_FLOAT encoded = (FX_FLOAT)sample;
- for (int i = 0; i < m_nInputs; i ++) {
- if (index[i] == m_pEncodeInfo[i].sizes - 1) {
- if (index[i] == 0) {
- encoded = encoded_input[i] * (FX_FLOAT)sample;
- }
- } else {
- int bitpos1 = bitpos + m_nBitsPerSample * m_nOutputs * blocksize[i];
- FX_DWORD sample1 = _GetBits32(pSampleData, bitpos1 + j * m_nBitsPerSample, m_nBitsPerSample);
- encoded += (encoded_input[i] - index[i]) * ((FX_FLOAT)sample1 - (FX_FLOAT)sample);
- }
- }
- results[j] = PDF_Interpolate(encoded, 0, (FX_FLOAT)m_SampleMax,
- m_pDecodeInfo[j].decode_min, m_pDecodeInfo[j].decode_max);
- }
- return TRUE;
-}
-class CPDF_PSFunc : public CPDF_Function
-{
-public:
- virtual FX_BOOL v_Init(CPDF_Object* pObj);
- virtual FX_BOOL v_Call(FX_FLOAT* inputs, FX_FLOAT* results) const;
- CPDF_PSEngine m_PS;
-};
-FX_BOOL CPDF_PSFunc::v_Init(CPDF_Object* pObj)
-{
- CPDF_Stream* pStream = (CPDF_Stream*)pObj;
- CPDF_StreamAcc acc;
- acc.LoadAllData(pStream, FALSE);
- return m_PS.Parse((const FX_CHAR*)acc.GetData(), acc.GetSize());
-}
-FX_BOOL CPDF_PSFunc::v_Call(FX_FLOAT* inputs, FX_FLOAT* results) const
-{
- CPDF_PSEngine& PS = (CPDF_PSEngine&)m_PS;
- PS.Reset();
- int i;
- for (i = 0; i < m_nInputs; i ++) {
- PS.Push(inputs[i]);
- }
- PS.Execute();
- if (PS.GetStackSize() < m_nOutputs) {
- return FALSE;
- }
- for (i = 0; i < m_nOutputs; i ++) {
- results[m_nOutputs - i - 1] = PS.Pop();
- }
- return TRUE;
-}
-class CPDF_ExpIntFunc : public CPDF_Function
-{
-public:
- CPDF_ExpIntFunc();
- virtual ~CPDF_ExpIntFunc();
- virtual FX_BOOL v_Init(CPDF_Object* pObj);
- virtual FX_BOOL v_Call(FX_FLOAT* inputs, FX_FLOAT* results) const;
- FX_FLOAT m_Exponent;
- FX_FLOAT* m_pBeginValues;
- FX_FLOAT* m_pEndValues;
- int m_nOrigOutputs;
-};
-CPDF_ExpIntFunc::CPDF_ExpIntFunc()
-{
- m_pBeginValues = NULL;
- m_pEndValues = NULL;
-}
-CPDF_ExpIntFunc::~CPDF_ExpIntFunc()
-{
- if (m_pBeginValues) {
- FX_Free(m_pBeginValues);
- }
- if (m_pEndValues) {
- FX_Free(m_pEndValues);
- }
-}
-FX_BOOL CPDF_ExpIntFunc::v_Init(CPDF_Object* pObj)
-{
- CPDF_Dictionary* pDict = pObj->GetDict();
- if (pDict == NULL) {
- return FALSE;
- }
- CPDF_Array* pArray0 = pDict->GetArray(FX_BSTRC("C0"));
- if (m_nOutputs == 0) {
- m_nOutputs = 1;
- if (pArray0) {
- m_nOutputs = pArray0->GetCount();
- }
- }
- CPDF_Array* pArray1 = pDict->GetArray(FX_BSTRC("C1"));
- m_pBeginValues = FX_Alloc(FX_FLOAT, m_nOutputs * 2);
- m_pEndValues = FX_Alloc(FX_FLOAT, m_nOutputs * 2);
- for (int i = 0; i < m_nOutputs; i ++) {
- m_pBeginValues[i] = pArray0 ? pArray0->GetFloat(i) : 0.0f;
- m_pEndValues[i] = pArray1 ? pArray1->GetFloat(i) : 1.0f;
- }
- m_Exponent = pDict->GetFloat(FX_BSTRC("N"));
- m_nOrigOutputs = m_nOutputs;
- if (m_nOutputs && m_nInputs > INT_MAX / m_nOutputs) {
- return FALSE;
- }
- m_nOutputs *= m_nInputs;
- return TRUE;
-}
-FX_BOOL CPDF_ExpIntFunc::v_Call(FX_FLOAT* inputs, FX_FLOAT* results) const
-{
- for (int i = 0; i < m_nInputs; i ++)
- for (int j = 0; j < m_nOrigOutputs; j ++) {
- results[i * m_nOrigOutputs + j] = m_pBeginValues[j] + (FX_FLOAT)FXSYS_pow(inputs[i], m_Exponent) *
- (m_pEndValues[j] - m_pBeginValues[j]);
- }
- return TRUE;
-}
-class CPDF_StitchFunc : public CPDF_Function
-{
-public:
- CPDF_StitchFunc();
- virtual ~CPDF_StitchFunc();
- virtual FX_BOOL v_Init(CPDF_Object* pObj);
- virtual FX_BOOL v_Call(FX_FLOAT* inputs, FX_FLOAT* results) const;
- int m_nSubs;
- CPDF_Function** m_pSubFunctions;
- FX_FLOAT* m_pBounds;
- FX_FLOAT* m_pEncode;
-};
-CPDF_StitchFunc::CPDF_StitchFunc()
-{
- m_nSubs = 0;
- m_pSubFunctions = NULL;
- m_pBounds = NULL;
- m_pEncode = NULL;
-}
-CPDF_StitchFunc::~CPDF_StitchFunc()
-{
- for (int i = 0; i < m_nSubs; i ++)
- if (m_pSubFunctions[i]) {
- delete m_pSubFunctions[i];
- }
- if (m_pSubFunctions) {
- FX_Free(m_pSubFunctions);
- }
- if (m_pBounds) {
- FX_Free(m_pBounds);
- }
- if (m_pEncode) {
- FX_Free(m_pEncode);
- }
-}
-FX_BOOL CPDF_StitchFunc::v_Init(CPDF_Object* pObj)
-{
- CPDF_Dictionary* pDict = pObj->GetDict();
- if (pDict == NULL) {
- return FALSE;
- }
- CPDF_Array* pArray = pDict->GetArray(FX_BSTRC("Functions"));
- if (pArray == NULL) {
- return FALSE;
- }
- m_nSubs = pArray->GetCount();
- if (m_nSubs == 0) {
- return FALSE;
- }
- m_pSubFunctions = FX_Alloc(CPDF_Function*, m_nSubs);
- FXSYS_memset32(m_pSubFunctions, 0, sizeof(CPDF_Function*)*m_nSubs);
- m_nOutputs = 0;
- int i;
- for (i = 0; i < m_nSubs; i ++) {
- CPDF_Object* pSub = pArray->GetElementValue(i);
- if (pSub == pObj) {
- return FALSE;
- }
- m_pSubFunctions[i] = CPDF_Function::Load(pSub);
- if (m_pSubFunctions[i] == NULL) {
- return FALSE;
- }
- if (m_pSubFunctions[i]->CountOutputs() > m_nOutputs) {
- m_nOutputs = m_pSubFunctions[i]->CountOutputs();
- }
- }
- m_pBounds = FX_Alloc(FX_FLOAT, m_nSubs + 1);
- m_pBounds[0] = m_pDomains[0];
- pArray = pDict->GetArray(FX_BSTRC("Bounds"));
- if (pArray == NULL) {
- return FALSE;
- }
- for (i = 0; i < m_nSubs - 1; i ++) {
- m_pBounds[i + 1] = pArray->GetFloat(i);
- }
- m_pBounds[m_nSubs] = m_pDomains[1];
- m_pEncode = FX_Alloc(FX_FLOAT, m_nSubs * 2);
- pArray = pDict->GetArray(FX_BSTRC("Encode"));
- if (pArray == NULL) {
- return FALSE;
- }
- for (i = 0; i < m_nSubs * 2; i ++) {
- m_pEncode[i] = pArray->GetFloat(i);
- }
- return TRUE;
-}
-FX_BOOL CPDF_StitchFunc::v_Call(FX_FLOAT* inputs, FX_FLOAT* outputs) const
-{
- FX_FLOAT input = inputs[0];
- int i;
- for (i = 0; i < m_nSubs - 1; i ++)
- if (input < m_pBounds[i + 1]) {
- break;
- }
- if (m_pSubFunctions[i] == NULL) {
- return FALSE;
- }
- input = PDF_Interpolate(input, m_pBounds[i], m_pBounds[i + 1], m_pEncode[i * 2], m_pEncode[i * 2 + 1]);
- int nresults;
- m_pSubFunctions[i]->Call(&input, m_nInputs, outputs, nresults);
- return TRUE;
-}
-CPDF_Function* CPDF_Function::Load(CPDF_Object* pFuncObj)
-{
- if (pFuncObj == NULL) {
- return NULL;
- }
- CPDF_Function* pFunc = NULL;
- int type;
- if (pFuncObj->GetType() == PDFOBJ_STREAM) {
- type = ((CPDF_Stream*)pFuncObj)->GetDict()->GetInteger(FX_BSTRC("FunctionType"));
- } else if (pFuncObj->GetType() == PDFOBJ_DICTIONARY) {
- type = ((CPDF_Dictionary*)pFuncObj)->GetInteger(FX_BSTRC("FunctionType"));
- } else {
- return NULL;
- }
- if (type == 0) {
- pFunc = FX_NEW CPDF_SampledFunc;
- } else if (type == 2) {
- pFunc = FX_NEW CPDF_ExpIntFunc;
- } else if (type == 3) {
- pFunc = FX_NEW CPDF_StitchFunc;
- } else if (type == 4) {
- pFunc = FX_NEW CPDF_PSFunc;
- } else {
- return NULL;
- }
- if (!pFunc->Init(pFuncObj)) {
- delete pFunc;
- return NULL;
- }
- return pFunc;
-}
-CPDF_Function::CPDF_Function()
-{
- m_pDomains = NULL;
- m_pRanges = NULL;
-}
-CPDF_Function::~CPDF_Function()
-{
- if (m_pDomains) {
- FX_Free(m_pDomains);
- m_pDomains = NULL;
- }
- if (m_pRanges) {
- FX_Free(m_pRanges);
- m_pRanges = NULL;
- }
-}
-FX_BOOL CPDF_Function::Init(CPDF_Object* pObj)
-{
- CPDF_Dictionary* pDict;
- if (pObj->GetType() == PDFOBJ_STREAM) {
- pDict = ((CPDF_Stream*)pObj)->GetDict();
- } else {
- pDict = (CPDF_Dictionary*)pObj;
- }
- CPDF_Array* pDomains = pDict->GetArray(FX_BSTRC("Domain"));
- if (pDomains == NULL) {
- return FALSE;
- }
- m_nInputs = pDomains->GetCount() / 2;
- if (m_nInputs == 0) {
- return FALSE;
- }
- m_pDomains = FX_Alloc(FX_FLOAT, m_nInputs * 2);
- for (int i = 0; i < m_nInputs * 2; i ++) {
- m_pDomains[i] = pDomains->GetFloat(i);
- }
- CPDF_Array* pRanges = pDict->GetArray(FX_BSTRC("Range"));
- m_nOutputs = 0;
- if (pRanges) {
- m_nOutputs = pRanges->GetCount() / 2;
- m_pRanges = FX_Alloc(FX_FLOAT, m_nOutputs * 2);
- for (int i = 0; i < m_nOutputs * 2; i ++) {
- m_pRanges[i] = pRanges->GetFloat(i);
- }
- }
- FX_DWORD old_outputs = m_nOutputs;
- FX_BOOL ret = v_Init(pObj);
- if (m_pRanges && m_nOutputs > (int)old_outputs) {
- m_pRanges = FX_Realloc(FX_FLOAT, m_pRanges, m_nOutputs * 2);
- if (m_pRanges) {
- FXSYS_memset32(m_pRanges + (old_outputs * 2), 0, sizeof(FX_FLOAT) * (m_nOutputs - old_outputs) * 2);
- }
- }
- return ret;
-}
-FX_BOOL CPDF_Function::Call(FX_FLOAT* inputs, int ninputs, FX_FLOAT* results, int& nresults) const
-{
- if (m_nInputs != ninputs) {
- return FALSE;
- }
- nresults = m_nOutputs;
- for (int i = 0; i < m_nInputs; i ++) {
- if (inputs[i] < m_pDomains[i * 2]) {
- inputs[i] = m_pDomains[i * 2];
- } else if (inputs[i] > m_pDomains[i * 2 + 1]) {
- inputs[i] = m_pDomains[i * 2] + 1;
- }
- }
- v_Call(inputs, results);
- if (m_pRanges) {
- for (int i = 0; i < m_nOutputs; i ++) {
- if (results[i] < m_pRanges[i * 2]) {
- results[i] = m_pRanges[i * 2];
- } else if (results[i] > m_pRanges[i * 2 + 1]) {
- results[i] = m_pRanges[i * 2 + 1];
- }
- }
- }
- return TRUE;
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fpdfapi/fpdf_page.h"
+#include "../../../include/fpdfapi/fpdf_module.h"
+#include "pageint.h"
+#include <limits.h>
+class CPDF_PSEngine;
+typedef enum {PSOP_ADD, PSOP_SUB, PSOP_MUL, PSOP_DIV, PSOP_IDIV, PSOP_MOD,
+ PSOP_NEG, PSOP_ABS, PSOP_CEILING, PSOP_FLOOR, PSOP_ROUND, PSOP_TRUNCATE,
+ PSOP_SQRT, PSOP_SIN, PSOP_COS, PSOP_ATAN, PSOP_EXP, PSOP_LN, PSOP_LOG,
+ PSOP_CVI, PSOP_CVR, PSOP_EQ, PSOP_NE, PSOP_GT, PSOP_GE, PSOP_LT, PSOP_LE,
+ PSOP_AND, PSOP_OR, PSOP_XOR, PSOP_NOT, PSOP_BITSHIFT, PSOP_TRUE, PSOP_FALSE,
+ PSOP_IF, PSOP_IFELSE, PSOP_POP, PSOP_EXCH, PSOP_DUP, PSOP_COPY,
+ PSOP_INDEX, PSOP_ROLL, PSOP_PROC, PSOP_CONST
+ } PDF_PSOP;
+class CPDF_PSProc : public CFX_Object
+{
+public:
+ ~CPDF_PSProc();
+ FX_BOOL Parse(CPDF_SimpleParser& parser);
+ FX_BOOL Execute(CPDF_PSEngine* pEngine);
+ CFX_PtrArray m_Operators;
+};
+#define PSENGINE_STACKSIZE 100
+class CPDF_PSEngine : public CFX_Object
+{
+public:
+ CPDF_PSEngine();
+ ~CPDF_PSEngine();
+ FX_BOOL Parse(const FX_CHAR* string, int size);
+ FX_BOOL Execute()
+ {
+ return m_MainProc.Execute(this);
+ }
+ FX_BOOL DoOperator(PDF_PSOP op);
+ void Reset()
+ {
+ m_StackCount = 0;
+ }
+ void Push(FX_FLOAT value);
+ void Push(int value)
+ {
+ Push((FX_FLOAT)value);
+ }
+ FX_FLOAT Pop();
+ int GetStackSize()
+ {
+ return m_StackCount;
+ }
+private:
+ FX_FLOAT m_Stack[PSENGINE_STACKSIZE];
+ int m_StackCount;
+ CPDF_PSProc m_MainProc;
+};
+CPDF_PSProc::~CPDF_PSProc()
+{
+ int size = m_Operators.GetSize();
+ for (int i = 0; i < size; i ++) {
+ if (m_Operators[i] == (FX_LPVOID)PSOP_PROC) {
+ delete (CPDF_PSProc*)m_Operators[i + 1];
+ i ++;
+ } else if (m_Operators[i] == (FX_LPVOID)PSOP_CONST) {
+ FX_Free((FX_FLOAT*)m_Operators[i + 1]);
+ i ++;
+ }
+ }
+}
+#pragma optimize( "", off )
+FX_BOOL CPDF_PSProc::Execute(CPDF_PSEngine* pEngine)
+{
+ int size = m_Operators.GetSize();
+ for (int i = 0; i < size; i ++) {
+ PDF_PSOP op = (PDF_PSOP)(FX_UINTPTR)m_Operators[i];
+ if (op == PSOP_PROC) {
+ i ++;
+ } else if (op == PSOP_CONST) {
+ pEngine->Push(*(FX_FLOAT*)m_Operators[i + 1]);
+ i ++;
+ } else if (op == PSOP_IF) {
+ if (i < 2 || m_Operators[i - 2] != (FX_LPVOID)PSOP_PROC) {
+ return FALSE;
+ }
+ if ((int)pEngine->Pop()) {
+ ((CPDF_PSProc*)m_Operators[i - 1])->Execute(pEngine);
+ }
+ } else if (op == PSOP_IFELSE) {
+ if (i < 4 || m_Operators[i - 2] != (FX_LPVOID)PSOP_PROC ||
+ m_Operators[i - 4] != (FX_LPVOID)PSOP_PROC) {
+ return FALSE;
+ }
+ if ((int)pEngine->Pop()) {
+ ((CPDF_PSProc*)m_Operators[i - 3])->Execute(pEngine);
+ } else {
+ ((CPDF_PSProc*)m_Operators[i - 1])->Execute(pEngine);
+ }
+ } else {
+ pEngine->DoOperator(op);
+ }
+ }
+ return TRUE;
+}
+#pragma optimize( "", on )
+CPDF_PSEngine::CPDF_PSEngine()
+{
+ m_StackCount = 0;
+}
+CPDF_PSEngine::~CPDF_PSEngine()
+{
+}
+void CPDF_PSEngine::Push(FX_FLOAT v)
+{
+ if (m_StackCount == 100) {
+ return;
+ }
+ m_Stack[m_StackCount++] = v;
+}
+FX_FLOAT CPDF_PSEngine::Pop()
+{
+ if (m_StackCount == 0) {
+ return 0;
+ }
+ return m_Stack[--m_StackCount];
+}
+const struct _PDF_PSOpName {
+ const FX_CHAR* name;
+ PDF_PSOP op;
+} _PDF_PSOpNames[] = {
+ {"add", PSOP_ADD}, {"sub", PSOP_SUB}, {"mul", PSOP_MUL}, {"div", PSOP_DIV},
+ {"idiv", PSOP_IDIV}, {"mod", PSOP_MOD}, {"neg", PSOP_NEG}, {"abs", PSOP_ABS},
+ {"ceiling", PSOP_CEILING}, {"floor", PSOP_FLOOR}, {"round", PSOP_ROUND},
+ {"truncate", PSOP_TRUNCATE}, {"sqrt", PSOP_SQRT}, {"sin", PSOP_SIN},
+ {"cos", PSOP_COS}, {"atan", PSOP_ATAN}, {"exp", PSOP_EXP}, {"ln", PSOP_LN},
+ {"log", PSOP_LOG}, {"cvi", PSOP_CVI}, {"cvr", PSOP_CVR}, {"eq", PSOP_EQ},
+ {"ne", PSOP_NE}, {"gt", PSOP_GT}, {"ge", PSOP_GE}, {"lt", PSOP_LT},
+ {"le", PSOP_LE}, {"and", PSOP_AND}, {"or", PSOP_OR}, {"xor", PSOP_XOR},
+ {"not", PSOP_NOT}, {"bitshift", PSOP_BITSHIFT}, {"true", PSOP_TRUE},
+ {"false", PSOP_FALSE}, {"if", PSOP_IF}, {"ifelse", PSOP_IFELSE},
+ {"pop", PSOP_POP}, {"exch", PSOP_EXCH}, {"dup", PSOP_DUP},
+ {"copy", PSOP_COPY}, {"index", PSOP_INDEX}, {"roll", PSOP_ROLL},
+ {NULL, PSOP_PROC}
+};
+FX_BOOL CPDF_PSEngine::Parse(const FX_CHAR* string, int size)
+{
+ CPDF_SimpleParser parser((FX_LPBYTE)string, size);
+ CFX_ByteStringC word = parser.GetWord();
+ if (word != FX_BSTRC("{")) {
+ return FALSE;
+ }
+ return m_MainProc.Parse(parser);
+}
+FX_BOOL CPDF_PSProc::Parse(CPDF_SimpleParser& parser)
+{
+ while (1) {
+ CFX_ByteStringC word = parser.GetWord();
+ if (word.IsEmpty()) {
+ return FALSE;
+ }
+ if (word == FX_BSTRC("}")) {
+ return TRUE;
+ }
+ if (word == FX_BSTRC("{")) {
+ CPDF_PSProc* pProc = FX_NEW CPDF_PSProc;
+ m_Operators.Add((FX_LPVOID)PSOP_PROC);
+ m_Operators.Add(pProc);
+ if (!pProc->Parse(parser)) {
+ return FALSE;
+ }
+ } else {
+ int i = 0;
+ while (_PDF_PSOpNames[i].name) {
+ if (word == CFX_ByteStringC(_PDF_PSOpNames[i].name)) {
+ m_Operators.Add((FX_LPVOID)_PDF_PSOpNames[i].op);
+ break;
+ }
+ i ++;
+ }
+ if (_PDF_PSOpNames[i].name == NULL) {
+ FX_FLOAT* pd = FX_Alloc(FX_FLOAT, 1);
+ *pd = FX_atof(word);
+ m_Operators.Add((FX_LPVOID)PSOP_CONST);
+ m_Operators.Add(pd);
+ }
+ }
+ }
+}
+#define PI 3.1415926535897932384626433832795f
+FX_BOOL CPDF_PSEngine::DoOperator(PDF_PSOP op)
+{
+ int i1, i2;
+ FX_FLOAT d1, d2;
+ switch (op) {
+ case PSOP_ADD:
+ d1 = Pop();
+ d2 = Pop();
+ Push(d1 + d2);
+ break;
+ case PSOP_SUB:
+ d2 = Pop();
+ d1 = Pop();
+ Push(d1 - d2);
+ break;
+ case PSOP_MUL:
+ d1 = Pop();
+ d2 = Pop();
+ Push(d1 * d2);
+ break;
+ case PSOP_DIV:
+ d2 = Pop();
+ d1 = Pop();
+ Push(d1 / d2);
+ break;
+ case PSOP_IDIV:
+ i2 = (int)Pop();
+ i1 = (int)Pop();
+ Push(i1 / i2);
+ break;
+ case PSOP_MOD:
+ i2 = (int)Pop();
+ i1 = (int)Pop();
+ Push(i1 % i2);
+ break;
+ case PSOP_NEG:
+ d1 = Pop();
+ Push(-d1);
+ break;
+ case PSOP_ABS:
+ d1 = Pop();
+ Push((FX_FLOAT)FXSYS_fabs(d1));
+ break;
+ case PSOP_CEILING:
+ d1 = Pop();
+ Push((FX_FLOAT)FXSYS_ceil(d1));
+ break;
+ case PSOP_FLOOR:
+ d1 = Pop();
+ Push((FX_FLOAT)FXSYS_floor(d1));
+ break;
+ case PSOP_ROUND:
+ d1 = Pop();
+ Push(FXSYS_round(d1));
+ break;
+ case PSOP_TRUNCATE:
+ i1 = (int)Pop();
+ Push(i1);
+ break;
+ case PSOP_SQRT:
+ d1 = Pop();
+ Push((FX_FLOAT)FXSYS_sqrt(d1));
+ break;
+ case PSOP_SIN:
+ d1 = Pop();
+ Push((FX_FLOAT)FXSYS_sin(d1 * PI / 180.0f));
+ break;
+ case PSOP_COS:
+ d1 = Pop();
+ Push((FX_FLOAT)FXSYS_cos(d1 * PI / 180.0f));
+ break;
+ case PSOP_ATAN:
+ d2 = Pop();
+ d1 = Pop();
+ d1 = (FX_FLOAT)(FXSYS_atan2(d1, d2) * 180.0 / PI);
+ if (d1 < 0) {
+ d1 += 360;
+ }
+ Push(d1);
+ break;
+ case PSOP_EXP:
+ d2 = Pop();
+ d1 = Pop();
+ Push((FX_FLOAT)FXSYS_pow(d1, d2));
+ break;
+ case PSOP_LN:
+ d1 = Pop();
+ Push((FX_FLOAT)FXSYS_log(d1));
+ break;
+ case PSOP_LOG:
+ d1 = Pop();
+ Push((FX_FLOAT)FXSYS_log10(d1));
+ break;
+ case PSOP_CVI:
+ i1 = (int)Pop();
+ Push(i1);
+ break;
+ case PSOP_CVR:
+ break;
+ case PSOP_EQ:
+ d2 = Pop();
+ d1 = Pop();
+ Push((int)(d1 == d2));
+ break;
+ case PSOP_NE:
+ d2 = Pop();
+ d1 = Pop();
+ Push((int)(d1 != d2));
+ break;
+ case PSOP_GT:
+ d2 = Pop();
+ d1 = Pop();
+ Push((int)(d1 > d2));
+ break;
+ case PSOP_GE:
+ d2 = Pop();
+ d1 = Pop();
+ Push((int)(d1 >= d2));
+ break;
+ case PSOP_LT:
+ d2 = Pop();
+ d1 = Pop();
+ Push((int)(d1 < d2));
+ break;
+ case PSOP_LE:
+ d2 = Pop();
+ d1 = Pop();
+ Push((int)(d1 <= d2));
+ break;
+ case PSOP_AND:
+ i1 = (int)Pop();
+ i2 = (int)Pop();
+ Push(i1 & i2);
+ break;
+ case PSOP_OR:
+ i1 = (int)Pop();
+ i2 = (int)Pop();
+ Push(i1 | i2);
+ break;
+ case PSOP_XOR:
+ i1 = (int)Pop();
+ i2 = (int)Pop();
+ Push(i1 ^ i2);
+ break;
+ case PSOP_NOT:
+ i1 = (int)Pop();
+ Push((int)!i1);
+ break;
+ case PSOP_BITSHIFT: {
+ int shift = (int)Pop();
+ int i = (int)Pop();
+ if (shift > 0) {
+ Push(i << shift);
+ } else {
+ Push(i >> -shift);
+ }
+ break;
+ }
+ case PSOP_TRUE:
+ Push(1);
+ break;
+ case PSOP_FALSE:
+ Push(0);
+ break;
+ case PSOP_POP:
+ Pop();
+ break;
+ case PSOP_EXCH:
+ d2 = Pop();
+ d1 = Pop();
+ Push(d2);
+ Push(d1);
+ break;
+ case PSOP_DUP:
+ d1 = Pop();
+ Push(d1);
+ Push(d1);
+ break;
+ case PSOP_COPY: {
+ int n = (int)Pop();
+ if (n < 0 || n > PSENGINE_STACKSIZE || m_StackCount + n > PSENGINE_STACKSIZE || n > m_StackCount) {
+ break;
+ }
+ for (int i = 0; i < n; i ++) {
+ m_Stack[m_StackCount + i] = m_Stack[m_StackCount + i - n];
+ }
+ m_StackCount += n;
+ break;
+ }
+ case PSOP_INDEX: {
+ int n = (int)Pop();
+ if (n < 0 || n >= m_StackCount) {
+ break;
+ }
+ Push(m_Stack[m_StackCount - n - 1]);
+ break;
+ }
+ case PSOP_ROLL: {
+ int j = (int)Pop();
+ int n = (int)Pop();
+ if (m_StackCount == 0) {
+ break;
+ }
+ if (n < 0 || n > m_StackCount) {
+ break;
+ }
+ if (j < 0)
+ for (int i = 0; i < -j; i ++) {
+ FX_FLOAT first = m_Stack[m_StackCount - n];
+ for (int ii = 0; ii < n - 1; ii ++) {
+ m_Stack[m_StackCount - n + ii] = m_Stack[m_StackCount - n + ii + 1];
+ }
+ m_Stack[m_StackCount - 1] = first;
+ }
+ else
+ for (int i = 0; i < j; i ++) {
+ FX_FLOAT last = m_Stack[m_StackCount - 1];
+ int ii;
+ for (ii = 0; ii < n - 1; ii ++) {
+ m_Stack[m_StackCount - ii - 1] = m_Stack[m_StackCount - ii - 2];
+ }
+ m_Stack[m_StackCount - ii - 1] = last;
+ }
+ break;
+ }
+ default:
+ break;
+ }
+ return TRUE;
+}
+static FX_FLOAT PDF_Interpolate(FX_FLOAT x, FX_FLOAT xmin, FX_FLOAT xmax, FX_FLOAT ymin, FX_FLOAT ymax)
+{
+ return ((x - xmin) * (ymax - ymin) / (xmax - xmin)) + ymin;
+}
+static FX_DWORD _GetBits32(FX_LPCBYTE pData, int bitpos, int nbits)
+{
+ int result = 0;
+ for (int i = 0; i < nbits; i ++)
+ if (pData[(bitpos + i) / 8] & (1 << (7 - (bitpos + i) % 8))) {
+ result |= 1 << (nbits - i - 1);
+ }
+ return result;
+}
+typedef struct {
+ FX_FLOAT encode_max, encode_min;
+ int sizes;
+} SampleEncodeInfo;
+typedef struct {
+ FX_FLOAT decode_max, decode_min;
+} SampleDecodeInfo;
+class CPDF_SampledFunc : public CPDF_Function
+{
+public:
+ CPDF_SampledFunc();
+ virtual ~CPDF_SampledFunc();
+ virtual FX_BOOL v_Init(CPDF_Object* pObj);
+ virtual FX_BOOL v_Call(FX_FLOAT* inputs, FX_FLOAT* results) const;
+ SampleEncodeInfo* m_pEncodeInfo;
+ SampleDecodeInfo* m_pDecodeInfo;
+ FX_DWORD m_nBitsPerSample, m_SampleMax;
+ CPDF_StreamAcc* m_pSampleStream;
+};
+CPDF_SampledFunc::CPDF_SampledFunc()
+{
+ m_pSampleStream = NULL;
+ m_pEncodeInfo = NULL;
+ m_pDecodeInfo = NULL;
+}
+CPDF_SampledFunc::~CPDF_SampledFunc()
+{
+ if (m_pSampleStream) {
+ delete m_pSampleStream;
+ }
+ if (m_pEncodeInfo) {
+ FX_Free(m_pEncodeInfo);
+ }
+ if (m_pDecodeInfo) {
+ FX_Free(m_pDecodeInfo);
+ }
+}
+FX_BOOL CPDF_SampledFunc::v_Init(CPDF_Object* pObj)
+{
+ if (pObj->GetType() != PDFOBJ_STREAM) {
+ return FALSE;
+ }
+ CPDF_Stream* pStream = (CPDF_Stream*)pObj;
+ CPDF_Dictionary* pDict = pStream->GetDict();
+ CPDF_Array* pSize = pDict->GetArray(FX_BSTRC("Size"));
+ CPDF_Array* pEncode = pDict->GetArray(FX_BSTRC("Encode"));
+ CPDF_Array* pDecode = pDict->GetArray(FX_BSTRC("Decode"));
+ m_nBitsPerSample = pDict->GetInteger(FX_BSTRC("BitsPerSample"));
+ m_SampleMax = 0xffffffff >> (32 - m_nBitsPerSample);
+ m_pSampleStream = FX_NEW CPDF_StreamAcc;
+ m_pSampleStream->LoadAllData(pStream, FALSE);
+ m_pEncodeInfo = FX_Alloc(SampleEncodeInfo, m_nInputs);
+ int i;
+ FX_DWORD nTotalSamples = 1;
+ for (i = 0; i < m_nInputs; i ++) {
+ m_pEncodeInfo[i].sizes = pSize->GetInteger(i);
+ if (!pSize && i == 0) {
+ m_pEncodeInfo[i].sizes = pDict->GetInteger(FX_BSTRC("Size"));
+ }
+ if (nTotalSamples > 0 && (FX_UINT32)(m_pEncodeInfo[i].sizes) > UINT_MAX / nTotalSamples) {
+ return FALSE;
+ }
+ nTotalSamples *= m_pEncodeInfo[i].sizes;
+ if (pEncode) {
+ m_pEncodeInfo[i].encode_min = pEncode->GetFloat(i * 2);
+ m_pEncodeInfo[i].encode_max = pEncode->GetFloat(i * 2 + 1);
+ } else {
+ m_pEncodeInfo[i].encode_min = 0;
+ if (m_pEncodeInfo[i].sizes == 1) {
+ m_pEncodeInfo[i].encode_max = 1;
+ } else {
+ m_pEncodeInfo[i].encode_max = (FX_FLOAT)m_pEncodeInfo[i].sizes - 1;
+ }
+ }
+ }
+ if (nTotalSamples > 0 && m_nBitsPerSample > UINT_MAX / nTotalSamples) {
+ return FALSE;
+ }
+ nTotalSamples *= m_nBitsPerSample;
+ if (nTotalSamples > 0 && ((FX_UINT32)m_nOutputs) > UINT_MAX / nTotalSamples) {
+ return FALSE;
+ }
+ nTotalSamples *= m_nOutputs;
+ if (nTotalSamples == 0 || m_pSampleStream->GetSize() * 8 < nTotalSamples) {
+ return FALSE;
+ }
+ m_pDecodeInfo = FX_Alloc(SampleDecodeInfo, m_nOutputs);
+ for (i = 0; i < m_nOutputs; i ++) {
+ if (pDecode) {
+ m_pDecodeInfo[i].decode_min = pDecode->GetFloat(2 * i);
+ m_pDecodeInfo[i].decode_max = pDecode->GetFloat(2 * i + 1);
+ } else {
+ m_pDecodeInfo[i].decode_min = m_pRanges[i * 2];
+ m_pDecodeInfo[i].decode_max = m_pRanges[i * 2 + 1];
+ }
+ }
+ return TRUE;
+}
+FX_BOOL CPDF_SampledFunc::v_Call(FX_FLOAT* inputs, FX_FLOAT* results) const
+{
+ int pos = 0;
+ CFX_FixedBufGrow<FX_FLOAT, 16> encoded_input_buf(m_nInputs);
+ FX_FLOAT* encoded_input = encoded_input_buf;
+ CFX_FixedBufGrow<int, 32> int_buf(m_nInputs * 2);
+ int* index = int_buf;
+ int* blocksize = index + m_nInputs;
+ for (int i = 0; i < m_nInputs; i ++) {
+ if (i == 0) {
+ blocksize[i] = 1;
+ } else {
+ blocksize[i] = blocksize[i - 1] * m_pEncodeInfo[i - 1].sizes;
+ }
+ encoded_input[i] = PDF_Interpolate(inputs[i], m_pDomains[i * 2], m_pDomains[i * 2 + 1],
+ m_pEncodeInfo[i].encode_min, m_pEncodeInfo[i].encode_max);
+ index[i] = (int)encoded_input[i];
+ if (index[i] < 0) {
+ index[i] = 0;
+ } else if (index[i] > m_pEncodeInfo[i].sizes - 1) {
+ index[i] = m_pEncodeInfo[i].sizes - 1;
+ }
+ pos += index[i] * blocksize[i];
+ }
+ int bitpos = pos * m_nBitsPerSample * m_nOutputs;
+ FX_LPCBYTE pSampleData = m_pSampleStream->GetData();
+ if (pSampleData == NULL) {
+ return FALSE;
+ }
+ for (int j = 0; j < m_nOutputs; j ++) {
+ FX_DWORD sample = _GetBits32(pSampleData, bitpos + j * m_nBitsPerSample, m_nBitsPerSample);
+ FX_FLOAT encoded = (FX_FLOAT)sample;
+ for (int i = 0; i < m_nInputs; i ++) {
+ if (index[i] == m_pEncodeInfo[i].sizes - 1) {
+ if (index[i] == 0) {
+ encoded = encoded_input[i] * (FX_FLOAT)sample;
+ }
+ } else {
+ int bitpos1 = bitpos + m_nBitsPerSample * m_nOutputs * blocksize[i];
+ FX_DWORD sample1 = _GetBits32(pSampleData, bitpos1 + j * m_nBitsPerSample, m_nBitsPerSample);
+ encoded += (encoded_input[i] - index[i]) * ((FX_FLOAT)sample1 - (FX_FLOAT)sample);
+ }
+ }
+ results[j] = PDF_Interpolate(encoded, 0, (FX_FLOAT)m_SampleMax,
+ m_pDecodeInfo[j].decode_min, m_pDecodeInfo[j].decode_max);
+ }
+ return TRUE;
+}
+class CPDF_PSFunc : public CPDF_Function
+{
+public:
+ virtual FX_BOOL v_Init(CPDF_Object* pObj);
+ virtual FX_BOOL v_Call(FX_FLOAT* inputs, FX_FLOAT* results) const;
+ CPDF_PSEngine m_PS;
+};
+FX_BOOL CPDF_PSFunc::v_Init(CPDF_Object* pObj)
+{
+ CPDF_Stream* pStream = (CPDF_Stream*)pObj;
+ CPDF_StreamAcc acc;
+ acc.LoadAllData(pStream, FALSE);
+ return m_PS.Parse((const FX_CHAR*)acc.GetData(), acc.GetSize());
+}
+FX_BOOL CPDF_PSFunc::v_Call(FX_FLOAT* inputs, FX_FLOAT* results) const
+{
+ CPDF_PSEngine& PS = (CPDF_PSEngine&)m_PS;
+ PS.Reset();
+ int i;
+ for (i = 0; i < m_nInputs; i ++) {
+ PS.Push(inputs[i]);
+ }
+ PS.Execute();
+ if (PS.GetStackSize() < m_nOutputs) {
+ return FALSE;
+ }
+ for (i = 0; i < m_nOutputs; i ++) {
+ results[m_nOutputs - i - 1] = PS.Pop();
+ }
+ return TRUE;
+}
+class CPDF_ExpIntFunc : public CPDF_Function
+{
+public:
+ CPDF_ExpIntFunc();
+ virtual ~CPDF_ExpIntFunc();
+ virtual FX_BOOL v_Init(CPDF_Object* pObj);
+ virtual FX_BOOL v_Call(FX_FLOAT* inputs, FX_FLOAT* results) const;
+ FX_FLOAT m_Exponent;
+ FX_FLOAT* m_pBeginValues;
+ FX_FLOAT* m_pEndValues;
+ int m_nOrigOutputs;
+};
+CPDF_ExpIntFunc::CPDF_ExpIntFunc()
+{
+ m_pBeginValues = NULL;
+ m_pEndValues = NULL;
+}
+CPDF_ExpIntFunc::~CPDF_ExpIntFunc()
+{
+ if (m_pBeginValues) {
+ FX_Free(m_pBeginValues);
+ }
+ if (m_pEndValues) {
+ FX_Free(m_pEndValues);
+ }
+}
+FX_BOOL CPDF_ExpIntFunc::v_Init(CPDF_Object* pObj)
+{
+ CPDF_Dictionary* pDict = pObj->GetDict();
+ if (pDict == NULL) {
+ return FALSE;
+ }
+ CPDF_Array* pArray0 = pDict->GetArray(FX_BSTRC("C0"));
+ if (m_nOutputs == 0) {
+ m_nOutputs = 1;
+ if (pArray0) {
+ m_nOutputs = pArray0->GetCount();
+ }
+ }
+ CPDF_Array* pArray1 = pDict->GetArray(FX_BSTRC("C1"));
+ m_pBeginValues = FX_Alloc(FX_FLOAT, m_nOutputs * 2);
+ m_pEndValues = FX_Alloc(FX_FLOAT, m_nOutputs * 2);
+ for (int i = 0; i < m_nOutputs; i ++) {
+ m_pBeginValues[i] = pArray0 ? pArray0->GetFloat(i) : 0.0f;
+ m_pEndValues[i] = pArray1 ? pArray1->GetFloat(i) : 1.0f;
+ }
+ m_Exponent = pDict->GetFloat(FX_BSTRC("N"));
+ m_nOrigOutputs = m_nOutputs;
+ if (m_nOutputs && m_nInputs > INT_MAX / m_nOutputs) {
+ return FALSE;
+ }
+ m_nOutputs *= m_nInputs;
+ return TRUE;
+}
+FX_BOOL CPDF_ExpIntFunc::v_Call(FX_FLOAT* inputs, FX_FLOAT* results) const
+{
+ for (int i = 0; i < m_nInputs; i ++)
+ for (int j = 0; j < m_nOrigOutputs; j ++) {
+ results[i * m_nOrigOutputs + j] = m_pBeginValues[j] + (FX_FLOAT)FXSYS_pow(inputs[i], m_Exponent) *
+ (m_pEndValues[j] - m_pBeginValues[j]);
+ }
+ return TRUE;
+}
+class CPDF_StitchFunc : public CPDF_Function
+{
+public:
+ CPDF_StitchFunc();
+ virtual ~CPDF_StitchFunc();
+ virtual FX_BOOL v_Init(CPDF_Object* pObj);
+ virtual FX_BOOL v_Call(FX_FLOAT* inputs, FX_FLOAT* results) const;
+ int m_nSubs;
+ CPDF_Function** m_pSubFunctions;
+ FX_FLOAT* m_pBounds;
+ FX_FLOAT* m_pEncode;
+};
+CPDF_StitchFunc::CPDF_StitchFunc()
+{
+ m_nSubs = 0;
+ m_pSubFunctions = NULL;
+ m_pBounds = NULL;
+ m_pEncode = NULL;
+}
+CPDF_StitchFunc::~CPDF_StitchFunc()
+{
+ for (int i = 0; i < m_nSubs; i ++)
+ if (m_pSubFunctions[i]) {
+ delete m_pSubFunctions[i];
+ }
+ if (m_pSubFunctions) {
+ FX_Free(m_pSubFunctions);
+ }
+ if (m_pBounds) {
+ FX_Free(m_pBounds);
+ }
+ if (m_pEncode) {
+ FX_Free(m_pEncode);
+ }
+}
+FX_BOOL CPDF_StitchFunc::v_Init(CPDF_Object* pObj)
+{
+ CPDF_Dictionary* pDict = pObj->GetDict();
+ if (pDict == NULL) {
+ return FALSE;
+ }
+ CPDF_Array* pArray = pDict->GetArray(FX_BSTRC("Functions"));
+ if (pArray == NULL) {
+ return FALSE;
+ }
+ m_nSubs = pArray->GetCount();
+ if (m_nSubs == 0) {
+ return FALSE;
+ }
+ m_pSubFunctions = FX_Alloc(CPDF_Function*, m_nSubs);
+ FXSYS_memset32(m_pSubFunctions, 0, sizeof(CPDF_Function*)*m_nSubs);
+ m_nOutputs = 0;
+ int i;
+ for (i = 0; i < m_nSubs; i ++) {
+ CPDF_Object* pSub = pArray->GetElementValue(i);
+ if (pSub == pObj) {
+ return FALSE;
+ }
+ m_pSubFunctions[i] = CPDF_Function::Load(pSub);
+ if (m_pSubFunctions[i] == NULL) {
+ return FALSE;
+ }
+ if (m_pSubFunctions[i]->CountOutputs() > m_nOutputs) {
+ m_nOutputs = m_pSubFunctions[i]->CountOutputs();
+ }
+ }
+ m_pBounds = FX_Alloc(FX_FLOAT, m_nSubs + 1);
+ m_pBounds[0] = m_pDomains[0];
+ pArray = pDict->GetArray(FX_BSTRC("Bounds"));
+ if (pArray == NULL) {
+ return FALSE;
+ }
+ for (i = 0; i < m_nSubs - 1; i ++) {
+ m_pBounds[i + 1] = pArray->GetFloat(i);
+ }
+ m_pBounds[m_nSubs] = m_pDomains[1];
+ m_pEncode = FX_Alloc(FX_FLOAT, m_nSubs * 2);
+ pArray = pDict->GetArray(FX_BSTRC("Encode"));
+ if (pArray == NULL) {
+ return FALSE;
+ }
+ for (i = 0; i < m_nSubs * 2; i ++) {
+ m_pEncode[i] = pArray->GetFloat(i);
+ }
+ return TRUE;
+}
+FX_BOOL CPDF_StitchFunc::v_Call(FX_FLOAT* inputs, FX_FLOAT* outputs) const
+{
+ FX_FLOAT input = inputs[0];
+ int i;
+ for (i = 0; i < m_nSubs - 1; i ++)
+ if (input < m_pBounds[i + 1]) {
+ break;
+ }
+ if (m_pSubFunctions[i] == NULL) {
+ return FALSE;
+ }
+ input = PDF_Interpolate(input, m_pBounds[i], m_pBounds[i + 1], m_pEncode[i * 2], m_pEncode[i * 2 + 1]);
+ int nresults;
+ m_pSubFunctions[i]->Call(&input, m_nInputs, outputs, nresults);
+ return TRUE;
+}
+CPDF_Function* CPDF_Function::Load(CPDF_Object* pFuncObj)
+{
+ if (pFuncObj == NULL) {
+ return NULL;
+ }
+ CPDF_Function* pFunc = NULL;
+ int type;
+ if (pFuncObj->GetType() == PDFOBJ_STREAM) {
+ type = ((CPDF_Stream*)pFuncObj)->GetDict()->GetInteger(FX_BSTRC("FunctionType"));
+ } else if (pFuncObj->GetType() == PDFOBJ_DICTIONARY) {
+ type = ((CPDF_Dictionary*)pFuncObj)->GetInteger(FX_BSTRC("FunctionType"));
+ } else {
+ return NULL;
+ }
+ if (type == 0) {
+ pFunc = FX_NEW CPDF_SampledFunc;
+ } else if (type == 2) {
+ pFunc = FX_NEW CPDF_ExpIntFunc;
+ } else if (type == 3) {
+ pFunc = FX_NEW CPDF_StitchFunc;
+ } else if (type == 4) {
+ pFunc = FX_NEW CPDF_PSFunc;
+ } else {
+ return NULL;
+ }
+ if (!pFunc->Init(pFuncObj)) {
+ delete pFunc;
+ return NULL;
+ }
+ return pFunc;
+}
+CPDF_Function::CPDF_Function()
+{
+ m_pDomains = NULL;
+ m_pRanges = NULL;
+}
+CPDF_Function::~CPDF_Function()
+{
+ if (m_pDomains) {
+ FX_Free(m_pDomains);
+ m_pDomains = NULL;
+ }
+ if (m_pRanges) {
+ FX_Free(m_pRanges);
+ m_pRanges = NULL;
+ }
+}
+FX_BOOL CPDF_Function::Init(CPDF_Object* pObj)
+{
+ CPDF_Dictionary* pDict;
+ if (pObj->GetType() == PDFOBJ_STREAM) {
+ pDict = ((CPDF_Stream*)pObj)->GetDict();
+ } else {
+ pDict = (CPDF_Dictionary*)pObj;
+ }
+ CPDF_Array* pDomains = pDict->GetArray(FX_BSTRC("Domain"));
+ if (pDomains == NULL) {
+ return FALSE;
+ }
+ m_nInputs = pDomains->GetCount() / 2;
+ if (m_nInputs == 0) {
+ return FALSE;
+ }
+ m_pDomains = FX_Alloc(FX_FLOAT, m_nInputs * 2);
+ for (int i = 0; i < m_nInputs * 2; i ++) {
+ m_pDomains[i] = pDomains->GetFloat(i);
+ }
+ CPDF_Array* pRanges = pDict->GetArray(FX_BSTRC("Range"));
+ m_nOutputs = 0;
+ if (pRanges) {
+ m_nOutputs = pRanges->GetCount() / 2;
+ m_pRanges = FX_Alloc(FX_FLOAT, m_nOutputs * 2);
+ for (int i = 0; i < m_nOutputs * 2; i ++) {
+ m_pRanges[i] = pRanges->GetFloat(i);
+ }
+ }
+ FX_DWORD old_outputs = m_nOutputs;
+ FX_BOOL ret = v_Init(pObj);
+ if (m_pRanges && m_nOutputs > (int)old_outputs) {
+ m_pRanges = FX_Realloc(FX_FLOAT, m_pRanges, m_nOutputs * 2);
+ if (m_pRanges) {
+ FXSYS_memset32(m_pRanges + (old_outputs * 2), 0, sizeof(FX_FLOAT) * (m_nOutputs - old_outputs) * 2);
+ }
+ }
+ return ret;
+}
+FX_BOOL CPDF_Function::Call(FX_FLOAT* inputs, int ninputs, FX_FLOAT* results, int& nresults) const
+{
+ if (m_nInputs != ninputs) {
+ return FALSE;
+ }
+ nresults = m_nOutputs;
+ for (int i = 0; i < m_nInputs; i ++) {
+ if (inputs[i] < m_pDomains[i * 2]) {
+ inputs[i] = m_pDomains[i * 2];
+ } else if (inputs[i] > m_pDomains[i * 2 + 1]) {
+ inputs[i] = m_pDomains[i * 2] + 1;
+ }
+ }
+ v_Call(inputs, results);
+ if (m_pRanges) {
+ for (int i = 0; i < m_nOutputs; i ++) {
+ if (results[i] < m_pRanges[i * 2]) {
+ results[i] = m_pRanges[i * 2];
+ } else if (results[i] > m_pRanges[i * 2 + 1]) {
+ results[i] = m_pRanges[i * 2 + 1];
+ }
+ }
+ }
+ return TRUE;
+}
diff --git a/core/src/fpdfapi/fpdf_page/fpdf_page_graph_state.cpp b/core/src/fpdfapi/fpdf_page/fpdf_page_graph_state.cpp
index e9115e6342..f53a5b23a4 100644
--- a/core/src/fpdfapi/fpdf_page/fpdf_page_graph_state.cpp
+++ b/core/src/fpdfapi/fpdf_page/fpdf_page_graph_state.cpp
@@ -1,707 +1,707 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../../include/fpdfapi/fpdf_page.h"
-#include "../../../include/fpdfapi/fpdf_pageobj.h"
-#include "../../../include/fpdfapi/fpdf_module.h"
-#include "../../../include/fpdfapi/fpdf_render.h"
-#include "pageint.h"
-#include "../fpdf_render/render_int.h"
-void CPDF_GraphicStates::DefaultStates()
-{
- m_ColorState.New()->Default();
-}
-void CPDF_GraphicStates::CopyStates(const CPDF_GraphicStates& src)
-{
- m_ClipPath = src.m_ClipPath;
- m_GraphState = src.m_GraphState;
- m_ColorState = src.m_ColorState;
- m_TextState = src.m_TextState;
- m_GeneralState = src.m_GeneralState;
-}
-CPDF_ClipPathData::CPDF_ClipPathData()
-{
- m_PathCount = 0;
- m_pPathList = NULL;
- m_pTypeList = NULL;
- m_TextCount = 0;
- m_pTextList = NULL;
-}
-CPDF_ClipPathData::~CPDF_ClipPathData()
-{
- int i;
- if (m_pPathList) {
- FX_DELETE_VECTOR(m_pPathList, CPDF_Path, m_PathCount);
- }
- if (m_pTypeList) {
- FX_Free(m_pTypeList);
- }
- for (i = m_TextCount - 1; i > -1; i --)
- if (m_pTextList[i]) {
- delete m_pTextList[i];
- }
- if (m_pTextList) {
- FX_Free(m_pTextList);
- }
-}
-CPDF_ClipPathData::CPDF_ClipPathData(const CPDF_ClipPathData& src)
-{
- m_pPathList = NULL;
- m_pPathList = NULL;
- m_pTextList = NULL;
- m_PathCount = src.m_PathCount;
- if (m_PathCount) {
- int alloc_size = m_PathCount;
- if (alloc_size % 8) {
- alloc_size += 8 - (alloc_size % 8);
- }
- FX_NEW_VECTOR(m_pPathList, CPDF_Path, alloc_size);
- for (int i = 0; i < m_PathCount; i ++) {
- m_pPathList[i] = src.m_pPathList[i];
- }
- m_pTypeList = FX_Alloc(FX_BYTE, alloc_size);
- FXSYS_memcpy32(m_pTypeList, src.m_pTypeList, m_PathCount);
- } else {
- m_pPathList = NULL;
- m_pTypeList = NULL;
- }
- m_TextCount = src.m_TextCount;
- if (m_TextCount) {
- m_pTextList = FX_Alloc(CPDF_TextObject*, m_TextCount);
- FXSYS_memset32(m_pTextList, 0, sizeof(CPDF_TextObject*) * m_TextCount);
- for (int i = 0; i < m_TextCount; i ++) {
- if (src.m_pTextList[i]) {
- m_pTextList[i] = FX_NEW CPDF_TextObject;
- m_pTextList[i]->Copy(src.m_pTextList[i]);
- } else {
- m_pTextList[i] = NULL;
- }
- }
- } else {
- m_pTextList = NULL;
- }
-}
-void CPDF_ClipPathData::SetCount(int path_count, int text_count)
-{
- ASSERT(m_TextCount == 0 && m_PathCount == 0);
- if (path_count) {
- m_PathCount = path_count;
- int alloc_size = (path_count + 7) / 8 * 8;
- FX_NEW_VECTOR(m_pPathList, CPDF_Path, alloc_size);
- m_pTypeList = FX_Alloc(FX_BYTE, alloc_size);
- }
- if (text_count) {
- m_TextCount = text_count;
- m_pTextList = FX_Alloc(CPDF_TextObject*, text_count);
- FXSYS_memset32(m_pTextList, 0, sizeof(void*) * text_count);
- }
-}
-CPDF_Rect CPDF_ClipPath::GetClipBox() const
-{
- CPDF_Rect rect;
- FX_BOOL bStarted = FALSE;
- int count = GetPathCount();
- if (count) {
- rect = GetPath(0).GetBoundingBox();
- for (int i = 1; i < count; i ++) {
- CPDF_Rect path_rect = GetPath(i).GetBoundingBox();
- rect.Intersect(path_rect);
- }
- bStarted = TRUE;
- }
- count = GetTextCount();
- if (count) {
- CPDF_Rect layer_rect;
- FX_BOOL bLayerStarted = FALSE;
- for (int i = 0; i < count; i ++) {
- CPDF_TextObject* pTextObj = GetText(i);
- if (pTextObj == NULL) {
- if (!bStarted) {
- rect = layer_rect;
- bStarted = TRUE;
- } else {
- rect.Intersect(layer_rect);
- }
- bLayerStarted = FALSE;
- } else {
- if (!bLayerStarted) {
- layer_rect = pTextObj->GetBBox(NULL);
- bLayerStarted = TRUE;
- } else {
- layer_rect.Union(pTextObj->GetBBox(NULL));
- }
- }
- }
- }
- return rect;
-}
-void CPDF_ClipPath::AppendPath(CPDF_Path path, int type, FX_BOOL bAutoMerge)
-{
- CPDF_ClipPathData* pData = GetModify();
- if (pData->m_PathCount && bAutoMerge) {
- CPDF_Path old_path = pData->m_pPathList[pData->m_PathCount - 1];
- if (old_path.IsRect()) {
- CPDF_Rect old_rect(old_path.GetPointX(0), old_path.GetPointY(0),
- old_path.GetPointX(2), old_path.GetPointY(2));
- CPDF_Rect new_rect = path.GetBoundingBox();
- if (old_rect.Contains(new_rect)) {
- pData->m_PathCount --;
- pData->m_pPathList[pData->m_PathCount].SetNull();
- }
- }
- }
- if (pData->m_PathCount % 8 == 0) {
- CPDF_Path* pNewPath;
- FX_NEW_VECTOR(pNewPath, CPDF_Path, pData->m_PathCount + 8);
- for (int i = 0; i < pData->m_PathCount; i ++) {
- pNewPath[i] = pData->m_pPathList[i];
- }
- if (pData->m_pPathList) {
- FX_DELETE_VECTOR(pData->m_pPathList, CPDF_Path, pData->m_PathCount);
- }
- FX_BYTE* pNewType = FX_Alloc(FX_BYTE, pData->m_PathCount + 8);
- FXSYS_memcpy32(pNewType, pData->m_pTypeList, pData->m_PathCount);
- if (pData->m_pTypeList) {
- FX_Free(pData->m_pTypeList);
- }
- pData->m_pPathList = pNewPath;
- pData->m_pTypeList = pNewType;
- }
- pData->m_pPathList[pData->m_PathCount] = path;
- pData->m_pTypeList[pData->m_PathCount] = (FX_BYTE)type;
- pData->m_PathCount ++;
-}
-void CPDF_ClipPath::DeletePath(int index)
-{
- CPDF_ClipPathData* pData = GetModify();
- if (index >= pData->m_PathCount) {
- return;
- }
- pData->m_pPathList[index].SetNull();
- for (int i = index; i < pData->m_PathCount - 1; i ++) {
- pData->m_pPathList[i] = pData->m_pPathList[i + 1];
- }
- pData->m_pPathList[pData->m_PathCount - 1].SetNull();
- FXSYS_memmove32(pData->m_pTypeList + index, pData->m_pTypeList + index + 1, pData->m_PathCount - index - 1);
- pData->m_PathCount --;
-}
-#define FPDF_CLIPPATH_MAX_TEXTS 1024
-void CPDF_ClipPath::AppendTexts(CPDF_TextObject** pTexts, int count)
-{
- CPDF_ClipPathData* pData = GetModify();
- if (pData->m_TextCount + count > FPDF_CLIPPATH_MAX_TEXTS) {
- for (int i = 0; i < count; i ++) {
- pTexts[i]->Release();
- }
- return;
- }
- CPDF_TextObject** pNewList = FX_Alloc(CPDF_TextObject*, pData->m_TextCount + count + 1);
- if (pData->m_pTextList) {
- FXSYS_memcpy32(pNewList, pData->m_pTextList, pData->m_TextCount * sizeof(CPDF_TextObject*));
- FX_Free(pData->m_pTextList);
- }
- pData->m_pTextList = pNewList;
- for (int i = 0; i < count; i ++) {
- pData->m_pTextList[pData->m_TextCount + i] = pTexts[i];
- }
- pData->m_pTextList[pData->m_TextCount + count] = NULL;
- pData->m_TextCount += count + 1;
-}
-void CPDF_ClipPath::Transform(const CPDF_Matrix& matrix)
-{
- CPDF_ClipPathData* pData = GetModify();
- int i;
- for (i = 0; i < pData->m_PathCount; i ++) {
- pData->m_pPathList[i].Transform(&matrix);
- }
- for (i = 0; i < pData->m_TextCount; i ++)
- if (pData->m_pTextList[i]) {
- pData->m_pTextList[i]->Transform(matrix);
- }
-}
-CPDF_ColorStateData::CPDF_ColorStateData(const CPDF_ColorStateData& src)
-{
- m_FillColor.Copy(&src.m_FillColor);
- m_FillRGB = src.m_FillRGB;
- m_StrokeColor.Copy(&src.m_StrokeColor);
- m_StrokeRGB = src.m_StrokeRGB;
-}
-void CPDF_ColorStateData::Default()
-{
- m_FillRGB = m_StrokeRGB = 0;
- m_FillColor.SetColorSpace(CPDF_ColorSpace::GetStockCS(PDFCS_DEVICEGRAY));
- m_StrokeColor.SetColorSpace(CPDF_ColorSpace::GetStockCS(PDFCS_DEVICEGRAY));
-}
-void CPDF_ColorState::SetFillColor(CPDF_ColorSpace* pCS, FX_FLOAT* pValue, int nValues)
-{
- CPDF_ColorStateData* pData = GetModify();
- SetColor(pData->m_FillColor, pData->m_FillRGB, pCS, pValue, nValues);
-}
-void CPDF_ColorState::SetStrokeColor(CPDF_ColorSpace* pCS, FX_FLOAT* pValue, int nValues)
-{
- CPDF_ColorStateData* pData = GetModify();
- SetColor(pData->m_StrokeColor, pData->m_StrokeRGB, pCS, pValue, nValues);
-}
-void CPDF_ColorState::SetColor(CPDF_Color& color, FX_DWORD& rgb, CPDF_ColorSpace* pCS, FX_FLOAT* pValue, int nValues)
-{
- if (pCS) {
- color.SetColorSpace(pCS);
- } else if (color.IsNull()) {
- color.SetColorSpace(CPDF_ColorSpace::GetStockCS(PDFCS_DEVICEGRAY));
- }
- if (color.m_pCS->CountComponents() > nValues) {
- return;
- }
- color.SetValue(pValue);
- int R, G, B;
- rgb = color.GetRGB(R, G, B) ? FXSYS_RGB(R, G, B) : (FX_DWORD) - 1;
-}
-void CPDF_ColorState::SetFillPattern(CPDF_Pattern* pPattern, FX_FLOAT* pValue, int nValues)
-{
- CPDF_ColorStateData* pData = GetModify();
- pData->m_FillColor.SetValue(pPattern, pValue, nValues);
- int R, G, B;
- FX_BOOL ret = pData->m_FillColor.GetRGB(R, G, B);
- if (pPattern->m_PatternType == 1 && ((CPDF_TilingPattern*)pPattern)->m_bColored && !ret) {
- pData->m_FillRGB = 0x00BFBFBF;
- return;
- }
- pData->m_FillRGB = ret ? FXSYS_RGB(R, G, B) : (FX_DWORD) - 1;
-}
-void CPDF_ColorState::SetStrokePattern(CPDF_Pattern* pPattern, FX_FLOAT* pValue, int nValues)
-{
- CPDF_ColorStateData* pData = GetModify();
- pData->m_StrokeColor.SetValue(pPattern, pValue, nValues);
- int R, G, B;
- FX_BOOL ret = pData->m_StrokeColor.GetRGB(R, G, B);
- if (pPattern->m_PatternType == 1 && ((CPDF_TilingPattern*)pPattern)->m_bColored && !ret) {
- pData->m_StrokeRGB = 0x00BFBFBF;
- return;
- }
- pData->m_StrokeRGB = pData->m_StrokeColor.GetRGB(R, G, B) ? FXSYS_RGB(R, G, B) : (FX_DWORD) - 1;
-}
-CPDF_TextStateData::CPDF_TextStateData()
-{
- m_pFont = NULL;
- m_FontSize = 1.0f;
- m_WordSpace = 0;
- m_CharSpace = 0;
- m_TextMode = 0;
- m_Matrix[0] = m_Matrix[3] = 1.0f;
- m_Matrix[1] = m_Matrix[2] = 0;
- m_CTM[0] = m_CTM[3] = 1.0f;
- m_CTM[1] = m_CTM[2] = 0;
-}
-CPDF_TextStateData::CPDF_TextStateData(const CPDF_TextStateData& src)
-{
- FXSYS_memcpy32(this, &src, sizeof(CPDF_TextStateData));
- if (m_pFont && m_pFont->m_pDocument) {
- m_pFont = m_pFont->m_pDocument->GetPageData()->GetFont(m_pFont->GetFontDict(), FALSE);
- }
-}
-CPDF_TextStateData::~CPDF_TextStateData()
-{
- CPDF_Font* pFont = m_pFont;
- if (pFont && pFont->m_pDocument) {
- pFont->m_pDocument->GetPageData()->ReleaseFont(pFont->GetFontDict());
- }
-}
-void CPDF_TextState::SetFont(CPDF_Font* pFont)
-{
- CPDF_Font*& pStateFont = GetModify()->m_pFont;
- CPDF_DocPageData* pDocPageData = NULL;
- if (pStateFont && pStateFont->m_pDocument) {
- pDocPageData = pStateFont->m_pDocument->GetPageData();
- pDocPageData->ReleaseFont(pStateFont->GetFontDict());
- }
- pStateFont = pFont;
-}
-FX_FLOAT CPDF_TextState::GetFontSizeV() const
-{
- FX_FLOAT* pMatrix = GetMatrix();
- FX_FLOAT unit = FXSYS_sqrt2(pMatrix[1], pMatrix[3]);
- FX_FLOAT size = FXSYS_Mul(unit, GetFontSize());
- return (FX_FLOAT)FXSYS_fabs(size);
-}
-FX_FLOAT CPDF_TextState::GetFontSizeH() const
-{
- FX_FLOAT* pMatrix = GetMatrix();
- FX_FLOAT unit = FXSYS_sqrt2(pMatrix[0], pMatrix[2]);
- FX_FLOAT size = FXSYS_Mul(unit, GetFontSize());
- return (FX_FLOAT)FXSYS_fabs(size);
-}
-FX_FLOAT CPDF_TextState::GetBaselineAngle() const
-{
- FX_FLOAT* m_Matrix = GetMatrix();
- return FXSYS_atan2(m_Matrix[2], m_Matrix[0]);
-}
-FX_FLOAT CPDF_TextState::GetShearAngle() const
-{
- FX_FLOAT* m_Matrix = GetMatrix();
- FX_FLOAT shear_angle = FXSYS_atan2(m_Matrix[1], m_Matrix[3]);
- return GetBaselineAngle() + shear_angle;
-}
-CPDF_GeneralStateData::CPDF_GeneralStateData()
-{
- FXSYS_memset32(this, 0, sizeof(CPDF_GeneralStateData));
- FXSYS_strcpy((FX_LPSTR)m_BlendMode, (FX_LPCSTR)"Normal");
- m_StrokeAlpha = 1.0f;
- m_FillAlpha = 1.0f;
- m_Flatness = 1.0f;
- m_Matrix.SetIdentity();
-}
-CPDF_GeneralStateData::CPDF_GeneralStateData(const CPDF_GeneralStateData& src)
-{
- FXSYS_memcpy32(this, &src, sizeof(CPDF_GeneralStateData));
- if (src.m_pTransferFunc && src.m_pTransferFunc->m_pPDFDoc) {
- CPDF_DocRenderData* pDocCache = src.m_pTransferFunc->m_pPDFDoc->GetRenderData();
- if (!pDocCache) {
- return;
- }
- m_pTransferFunc = pDocCache->GetTransferFunc(m_pTR);
- }
-}
-CPDF_GeneralStateData::~CPDF_GeneralStateData()
-{
- if (m_pTransferFunc && m_pTransferFunc->m_pPDFDoc) {
- CPDF_DocRenderData* pDocCache = m_pTransferFunc->m_pPDFDoc->GetRenderData();
- if (!pDocCache) {
- return;
- }
- pDocCache->ReleaseTransferFunc(m_pTR);
- }
-}
-static int GetBlendType(FX_BSTR mode)
-{
- switch (mode.GetID()) {
- case FXBSTR_ID('N', 'o', 'r', 'm'):
- case FXBSTR_ID('C', 'o', 'm', 'p'):
- return FXDIB_BLEND_NORMAL;
- case FXBSTR_ID('M', 'u', 'l', 't'):
- return FXDIB_BLEND_MULTIPLY;
- case FXBSTR_ID('S', 'c', 'r', 'e'):
- return FXDIB_BLEND_SCREEN;
- case FXBSTR_ID('O', 'v', 'e', 'r'):
- return FXDIB_BLEND_OVERLAY;
- case FXBSTR_ID('D', 'a', 'r', 'k'):
- return FXDIB_BLEND_DARKEN;
- case FXBSTR_ID('L', 'i', 'g', 'h'):
- return FXDIB_BLEND_LIGHTEN;
- case FXBSTR_ID('C', 'o', 'l', 'o'):
- if (mode.GetLength() == 10) {
- return FXDIB_BLEND_COLORDODGE;
- }
- if (mode.GetLength() == 9) {
- return FXDIB_BLEND_COLORBURN;
- }
- return FXDIB_BLEND_COLOR;
- case FXBSTR_ID('H', 'a', 'r', 'd'):
- return FXDIB_BLEND_HARDLIGHT;
- case FXBSTR_ID('S', 'o', 'f', 't'):
- return FXDIB_BLEND_SOFTLIGHT;
- case FXBSTR_ID('D', 'i', 'f', 'f'):
- return FXDIB_BLEND_DIFFERENCE;
- case FXBSTR_ID('E', 'x', 'c', 'l'):
- return FXDIB_BLEND_EXCLUSION;
- case FXBSTR_ID('H', 'u', 'e', 0):
- return FXDIB_BLEND_HUE;
- case FXBSTR_ID('S', 'a', 't', 'u'):
- return FXDIB_BLEND_SATURATION;
- case FXBSTR_ID('L', 'u', 'm', 'i'):
- return FXDIB_BLEND_LUMINOSITY;
- }
- return FXDIB_BLEND_NORMAL;
-}
-void CPDF_GeneralStateData::SetBlendMode(FX_BSTR blend_mode)
-{
- if (blend_mode.GetLength() > 15) {
- return;
- }
- FXSYS_memcpy32(m_BlendMode, (FX_LPCBYTE)blend_mode, blend_mode.GetLength());
- m_BlendMode[blend_mode.GetLength()] = 0;
- m_BlendType = ::GetBlendType(blend_mode);
-}
-int RI_StringToId(const CFX_ByteString& ri)
-{
- FX_DWORD id = ri.GetID();
- if (id == FXBSTR_ID('A', 'b', 's', 'o')) {
- return 1;
- }
- if (id == FXBSTR_ID('S', 'a', 't', 'u')) {
- return 2;
- }
- if (id == FXBSTR_ID('P', 'e', 'r', 'c')) {
- return 3;
- }
- return 0;
-}
-void CPDF_GeneralState::SetRenderIntent(const CFX_ByteString& ri)
-{
- GetModify()->m_RenderIntent = RI_StringToId(ri);
-}
-CPDF_AllStates::CPDF_AllStates()
-{
- m_TextX = m_TextY = m_TextLineX = m_TextLineY = 0;
- m_TextLeading = 0;
- m_TextRise = 0;
- m_TextHorzScale = 1.0f;
-}
-CPDF_AllStates::~CPDF_AllStates()
-{
-}
-void CPDF_AllStates::Copy(const CPDF_AllStates& src)
-{
- CopyStates(src);
- m_TextMatrix.Copy(src.m_TextMatrix);
- m_ParentMatrix.Copy(src.m_ParentMatrix);
- m_CTM.Copy(src.m_CTM);
- m_TextX = src.m_TextX;
- m_TextY = src.m_TextY;
- m_TextLineX = src.m_TextLineX;
- m_TextLineY = src.m_TextLineY;
- m_TextLeading = src.m_TextLeading;
- m_TextRise = src.m_TextRise;
- m_TextHorzScale = src.m_TextHorzScale;
-}
-void CPDF_AllStates::SetLineDash(CPDF_Array* pArray, FX_FLOAT phase, FX_FLOAT scale)
-{
- CFX_GraphStateData* pData = m_GraphState.GetModify();
- pData->m_DashPhase = FXSYS_Mul(phase, scale);
- pData->SetDashCount(pArray->GetCount());
- for (FX_DWORD i = 0; i < pArray->GetCount(); i ++) {
- pData->m_DashArray[i] = FXSYS_Mul(pArray->GetNumber(i), scale);
- }
-}
-void CPDF_AllStates::ProcessExtGS(CPDF_Dictionary* pGS, CPDF_StreamContentParser* pParser)
-{
- CPDF_GeneralStateData* pGeneralState = m_GeneralState.GetModify();
- FX_POSITION pos = pGS->GetStartPos();
- while (pos) {
- CFX_ByteString key_str;
- CPDF_Object* pObject = pGS->GetNextElement(pos, key_str)->GetDirect();
- if (pObject == NULL) {
- continue;
- }
- FX_DWORD key = key_str.GetID();
- switch (key) {
- case FXBSTR_ID('L', 'W', 0, 0):
- m_GraphState.GetModify()->m_LineWidth = pObject->GetNumber();
- break;
- case FXBSTR_ID('L', 'C', 0, 0):
- m_GraphState.GetModify()->m_LineCap = (CFX_GraphStateData::LineCap)pObject->GetInteger();
- break;
- case FXBSTR_ID('L', 'J', 0, 0):
- m_GraphState.GetModify()->m_LineJoin = (CFX_GraphStateData::LineJoin)pObject->GetInteger();
- break;
- case FXBSTR_ID('M', 'L', 0, 0):
- m_GraphState.GetModify()->m_MiterLimit = pObject->GetNumber();
- break;
- case FXBSTR_ID('D', 0, 0, 0): {
- if (pObject->GetType() != PDFOBJ_ARRAY) {
- break;
- }
- CPDF_Array* pDash = (CPDF_Array*)pObject;
- CPDF_Array* pArray = pDash->GetArray(0);
- if (pArray == NULL) {
- break;
- }
- SetLineDash(pArray, pDash->GetNumber(1), 1.0f);
- break;
- }
- case FXBSTR_ID('R', 'I', 0, 0):
- m_GeneralState.SetRenderIntent(pObject->GetString());
- break;
- case FXBSTR_ID('F', 'o', 'n', 't'): {
- if (pObject->GetType() != PDFOBJ_ARRAY) {
- break;
- }
- CPDF_Array* pFont = (CPDF_Array*)pObject;
- m_TextState.GetModify()->m_FontSize = pFont->GetNumber(1);
- m_TextState.SetFont(pParser->FindFont(pFont->GetString(0)));
- break;
- }
- case FXBSTR_ID('T', 'R', 0, 0):
- if (pGS->KeyExist(FX_BSTRC("TR2"))) {
- continue;
- }
- case FXBSTR_ID('T', 'R', '2', 0):
- if (pObject && pObject->GetType() != PDFOBJ_NAME) {
- pGeneralState->m_pTR = pObject;
- } else {
- pGeneralState->m_pTR = NULL;
- }
- break;
- case FXBSTR_ID('B', 'M', 0, 0): {
- CFX_ByteString mode;
- if (pObject->GetType() == PDFOBJ_ARRAY) {
- mode = ((CPDF_Array*)pObject)->GetString(0);
- } else {
- mode = pObject->GetString();
- }
- pGeneralState->SetBlendMode(mode);
- if (pGeneralState->m_BlendType > FXDIB_BLEND_MULTIPLY) {
- pParser->m_pObjectList->m_bBackgroundAlphaNeeded = TRUE;
- }
- break;
- }
- case FXBSTR_ID('S', 'M', 'a', 's'):
- if (pObject && pObject->GetType() == PDFOBJ_DICTIONARY) {
- pGeneralState->m_pSoftMask = pObject;
- FXSYS_memcpy32(pGeneralState->m_SMaskMatrix, &pParser->m_pCurStates->m_CTM, sizeof(CPDF_Matrix));
- } else {
- pGeneralState->m_pSoftMask = NULL;
- }
- break;
- case FXBSTR_ID('C', 'A', 0, 0):
- pGeneralState->m_StrokeAlpha = PDF_ClipFloat(pObject->GetNumber());
- break;
- case FXBSTR_ID('c', 'a', 0, 0):
- pGeneralState->m_FillAlpha = PDF_ClipFloat(pObject->GetNumber());
- break;
- case FXBSTR_ID('O', 'P', 0, 0):
- pGeneralState->m_StrokeOP = pObject->GetInteger();
- if (!pGS->KeyExist(FX_BSTRC("op"))) {
- pGeneralState->m_FillOP = pObject->GetInteger();
- }
- break;
- case FXBSTR_ID('o', 'p', 0, 0):
- pGeneralState->m_FillOP = pObject->GetInteger();
- break;
- case FXBSTR_ID('O', 'P', 'M', 0):
- pGeneralState->m_OPMode = pObject->GetInteger();
- break;
- case FXBSTR_ID('B', 'G', 0, 0):
- if (pGS->KeyExist(FX_BSTRC("BG2"))) {
- continue;
- }
- case FXBSTR_ID('B', 'G', '2', 0):
- pGeneralState->m_pBG = pObject;
- break;
- case FXBSTR_ID('U', 'C', 'R', 0):
- if (pGS->KeyExist(FX_BSTRC("UCR2"))) {
- continue;
- }
- case FXBSTR_ID('U', 'C', 'R', '2'):
- pGeneralState->m_pUCR = pObject;
- break;
- case FXBSTR_ID('H', 'T', 0, 0):
- pGeneralState->m_pHT = pObject;
- break;
- case FXBSTR_ID('F', 'L', 0, 0):
- pGeneralState->m_Flatness = pObject->GetNumber();
- break;
- case FXBSTR_ID('S', 'M', 0, 0):
- pGeneralState->m_Smoothness = pObject->GetNumber();
- break;
- case FXBSTR_ID('S', 'A', 0, 0):
- pGeneralState->m_StrokeAdjust = pObject->GetInteger();
- break;
- case FXBSTR_ID('A', 'I', 'S', 0):
- pGeneralState->m_AlphaSource = pObject->GetInteger();
- break;
- case FXBSTR_ID('T', 'K', 0, 0):
- pGeneralState->m_TextKnockout = pObject->GetInteger();
- break;
- }
- }
- pGeneralState->m_Matrix = m_CTM;
-}
-CPDF_ContentMarkItem::CPDF_ContentMarkItem()
-{
- m_ParamType = None;
-}
-CPDF_ContentMarkItem::CPDF_ContentMarkItem(const CPDF_ContentMarkItem& src)
-{
- m_MarkName = src.m_MarkName;
- m_ParamType = src.m_ParamType;
- if (m_ParamType == DirectDict) {
- m_pParam = ((CPDF_Dictionary*)src.m_pParam)->Clone();
- } else {
- m_pParam = src.m_pParam;
- }
-}
-CPDF_ContentMarkItem::~CPDF_ContentMarkItem()
-{
- if (m_ParamType == DirectDict) {
- ((CPDF_Dictionary*)m_pParam)->Release();
- }
-}
-FX_BOOL CPDF_ContentMarkItem::HasMCID() const
-{
- if (m_pParam && (m_ParamType == DirectDict || m_ParamType == PropertiesDict)) {
- return ((CPDF_Dictionary *)m_pParam)->KeyExist(FX_BSTRC("MCID"));
- }
- return FALSE;
-}
-CPDF_ContentMarkData::CPDF_ContentMarkData(const CPDF_ContentMarkData& src)
-{
- for (int i = 0; i < src.m_Marks.GetSize(); i ++) {
- m_Marks.Add(src.m_Marks[i]);
- }
-}
-int CPDF_ContentMarkData::GetMCID() const
-{
- CPDF_ContentMarkItem::ParamType type = CPDF_ContentMarkItem::None;
- for (int i = 0; i < m_Marks.GetSize(); i ++) {
- type = m_Marks[i].GetParamType();
- if (type == CPDF_ContentMarkItem::PropertiesDict || type == CPDF_ContentMarkItem::DirectDict) {
- CPDF_Dictionary *pDict = (CPDF_Dictionary *)m_Marks[i].GetParam();
- if (pDict->KeyExist(FX_BSTRC("MCID"))) {
- return pDict->GetInteger(FX_BSTRC("MCID"));
- }
- }
- }
- return -1;
-}
-void CPDF_ContentMarkData::AddMark(const CFX_ByteString& name, CPDF_Dictionary* pDict, FX_BOOL bDirect)
-{
- CPDF_ContentMarkItem& item = m_Marks.Add();
- item.SetName(name);
- if (pDict == NULL) {
- return;
- }
- item.SetParam(bDirect ? CPDF_ContentMarkItem::DirectDict : CPDF_ContentMarkItem::PropertiesDict,
- bDirect ? pDict->Clone() : pDict);
-}
-void CPDF_ContentMarkData::DeleteLastMark()
-{
- int size = m_Marks.GetSize();
- if (size == 0) {
- return;
- }
- m_Marks.RemoveAt(size - 1);
-}
-FX_BOOL CPDF_ContentMark::HasMark(FX_BSTR mark) const
-{
- if (m_pObject == NULL) {
- return FALSE;
- }
- for (int i = 0; i < m_pObject->CountItems(); i ++) {
- CPDF_ContentMarkItem& item = m_pObject->GetItem(i);
- if (item.GetName() == mark) {
- return TRUE;
- }
- }
- return FALSE;
-}
-FX_BOOL CPDF_ContentMark::LookupMark(FX_BSTR mark, CPDF_Dictionary*& pDict) const
-{
- if (m_pObject == NULL) {
- return FALSE;
- }
- for (int i = 0; i < m_pObject->CountItems(); i ++) {
- CPDF_ContentMarkItem& item = m_pObject->GetItem(i);
- if (item.GetName() == mark) {
- pDict = NULL;
- if (item.GetParamType() == CPDF_ContentMarkItem::PropertiesDict ||
- item.GetParamType() == CPDF_ContentMarkItem::DirectDict) {
- pDict = (CPDF_Dictionary*)item.GetParam();
- }
- return TRUE;
- }
- }
- return FALSE;
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fpdfapi/fpdf_page.h"
+#include "../../../include/fpdfapi/fpdf_pageobj.h"
+#include "../../../include/fpdfapi/fpdf_module.h"
+#include "../../../include/fpdfapi/fpdf_render.h"
+#include "pageint.h"
+#include "../fpdf_render/render_int.h"
+void CPDF_GraphicStates::DefaultStates()
+{
+ m_ColorState.New()->Default();
+}
+void CPDF_GraphicStates::CopyStates(const CPDF_GraphicStates& src)
+{
+ m_ClipPath = src.m_ClipPath;
+ m_GraphState = src.m_GraphState;
+ m_ColorState = src.m_ColorState;
+ m_TextState = src.m_TextState;
+ m_GeneralState = src.m_GeneralState;
+}
+CPDF_ClipPathData::CPDF_ClipPathData()
+{
+ m_PathCount = 0;
+ m_pPathList = NULL;
+ m_pTypeList = NULL;
+ m_TextCount = 0;
+ m_pTextList = NULL;
+}
+CPDF_ClipPathData::~CPDF_ClipPathData()
+{
+ int i;
+ if (m_pPathList) {
+ FX_DELETE_VECTOR(m_pPathList, CPDF_Path, m_PathCount);
+ }
+ if (m_pTypeList) {
+ FX_Free(m_pTypeList);
+ }
+ for (i = m_TextCount - 1; i > -1; i --)
+ if (m_pTextList[i]) {
+ delete m_pTextList[i];
+ }
+ if (m_pTextList) {
+ FX_Free(m_pTextList);
+ }
+}
+CPDF_ClipPathData::CPDF_ClipPathData(const CPDF_ClipPathData& src)
+{
+ m_pPathList = NULL;
+ m_pPathList = NULL;
+ m_pTextList = NULL;
+ m_PathCount = src.m_PathCount;
+ if (m_PathCount) {
+ int alloc_size = m_PathCount;
+ if (alloc_size % 8) {
+ alloc_size += 8 - (alloc_size % 8);
+ }
+ FX_NEW_VECTOR(m_pPathList, CPDF_Path, alloc_size);
+ for (int i = 0; i < m_PathCount; i ++) {
+ m_pPathList[i] = src.m_pPathList[i];
+ }
+ m_pTypeList = FX_Alloc(FX_BYTE, alloc_size);
+ FXSYS_memcpy32(m_pTypeList, src.m_pTypeList, m_PathCount);
+ } else {
+ m_pPathList = NULL;
+ m_pTypeList = NULL;
+ }
+ m_TextCount = src.m_TextCount;
+ if (m_TextCount) {
+ m_pTextList = FX_Alloc(CPDF_TextObject*, m_TextCount);
+ FXSYS_memset32(m_pTextList, 0, sizeof(CPDF_TextObject*) * m_TextCount);
+ for (int i = 0; i < m_TextCount; i ++) {
+ if (src.m_pTextList[i]) {
+ m_pTextList[i] = FX_NEW CPDF_TextObject;
+ m_pTextList[i]->Copy(src.m_pTextList[i]);
+ } else {
+ m_pTextList[i] = NULL;
+ }
+ }
+ } else {
+ m_pTextList = NULL;
+ }
+}
+void CPDF_ClipPathData::SetCount(int path_count, int text_count)
+{
+ ASSERT(m_TextCount == 0 && m_PathCount == 0);
+ if (path_count) {
+ m_PathCount = path_count;
+ int alloc_size = (path_count + 7) / 8 * 8;
+ FX_NEW_VECTOR(m_pPathList, CPDF_Path, alloc_size);
+ m_pTypeList = FX_Alloc(FX_BYTE, alloc_size);
+ }
+ if (text_count) {
+ m_TextCount = text_count;
+ m_pTextList = FX_Alloc(CPDF_TextObject*, text_count);
+ FXSYS_memset32(m_pTextList, 0, sizeof(void*) * text_count);
+ }
+}
+CPDF_Rect CPDF_ClipPath::GetClipBox() const
+{
+ CPDF_Rect rect;
+ FX_BOOL bStarted = FALSE;
+ int count = GetPathCount();
+ if (count) {
+ rect = GetPath(0).GetBoundingBox();
+ for (int i = 1; i < count; i ++) {
+ CPDF_Rect path_rect = GetPath(i).GetBoundingBox();
+ rect.Intersect(path_rect);
+ }
+ bStarted = TRUE;
+ }
+ count = GetTextCount();
+ if (count) {
+ CPDF_Rect layer_rect;
+ FX_BOOL bLayerStarted = FALSE;
+ for (int i = 0; i < count; i ++) {
+ CPDF_TextObject* pTextObj = GetText(i);
+ if (pTextObj == NULL) {
+ if (!bStarted) {
+ rect = layer_rect;
+ bStarted = TRUE;
+ } else {
+ rect.Intersect(layer_rect);
+ }
+ bLayerStarted = FALSE;
+ } else {
+ if (!bLayerStarted) {
+ layer_rect = pTextObj->GetBBox(NULL);
+ bLayerStarted = TRUE;
+ } else {
+ layer_rect.Union(pTextObj->GetBBox(NULL));
+ }
+ }
+ }
+ }
+ return rect;
+}
+void CPDF_ClipPath::AppendPath(CPDF_Path path, int type, FX_BOOL bAutoMerge)
+{
+ CPDF_ClipPathData* pData = GetModify();
+ if (pData->m_PathCount && bAutoMerge) {
+ CPDF_Path old_path = pData->m_pPathList[pData->m_PathCount - 1];
+ if (old_path.IsRect()) {
+ CPDF_Rect old_rect(old_path.GetPointX(0), old_path.GetPointY(0),
+ old_path.GetPointX(2), old_path.GetPointY(2));
+ CPDF_Rect new_rect = path.GetBoundingBox();
+ if (old_rect.Contains(new_rect)) {
+ pData->m_PathCount --;
+ pData->m_pPathList[pData->m_PathCount].SetNull();
+ }
+ }
+ }
+ if (pData->m_PathCount % 8 == 0) {
+ CPDF_Path* pNewPath;
+ FX_NEW_VECTOR(pNewPath, CPDF_Path, pData->m_PathCount + 8);
+ for (int i = 0; i < pData->m_PathCount; i ++) {
+ pNewPath[i] = pData->m_pPathList[i];
+ }
+ if (pData->m_pPathList) {
+ FX_DELETE_VECTOR(pData->m_pPathList, CPDF_Path, pData->m_PathCount);
+ }
+ FX_BYTE* pNewType = FX_Alloc(FX_BYTE, pData->m_PathCount + 8);
+ FXSYS_memcpy32(pNewType, pData->m_pTypeList, pData->m_PathCount);
+ if (pData->m_pTypeList) {
+ FX_Free(pData->m_pTypeList);
+ }
+ pData->m_pPathList = pNewPath;
+ pData->m_pTypeList = pNewType;
+ }
+ pData->m_pPathList[pData->m_PathCount] = path;
+ pData->m_pTypeList[pData->m_PathCount] = (FX_BYTE)type;
+ pData->m_PathCount ++;
+}
+void CPDF_ClipPath::DeletePath(int index)
+{
+ CPDF_ClipPathData* pData = GetModify();
+ if (index >= pData->m_PathCount) {
+ return;
+ }
+ pData->m_pPathList[index].SetNull();
+ for (int i = index; i < pData->m_PathCount - 1; i ++) {
+ pData->m_pPathList[i] = pData->m_pPathList[i + 1];
+ }
+ pData->m_pPathList[pData->m_PathCount - 1].SetNull();
+ FXSYS_memmove32(pData->m_pTypeList + index, pData->m_pTypeList + index + 1, pData->m_PathCount - index - 1);
+ pData->m_PathCount --;
+}
+#define FPDF_CLIPPATH_MAX_TEXTS 1024
+void CPDF_ClipPath::AppendTexts(CPDF_TextObject** pTexts, int count)
+{
+ CPDF_ClipPathData* pData = GetModify();
+ if (pData->m_TextCount + count > FPDF_CLIPPATH_MAX_TEXTS) {
+ for (int i = 0; i < count; i ++) {
+ pTexts[i]->Release();
+ }
+ return;
+ }
+ CPDF_TextObject** pNewList = FX_Alloc(CPDF_TextObject*, pData->m_TextCount + count + 1);
+ if (pData->m_pTextList) {
+ FXSYS_memcpy32(pNewList, pData->m_pTextList, pData->m_TextCount * sizeof(CPDF_TextObject*));
+ FX_Free(pData->m_pTextList);
+ }
+ pData->m_pTextList = pNewList;
+ for (int i = 0; i < count; i ++) {
+ pData->m_pTextList[pData->m_TextCount + i] = pTexts[i];
+ }
+ pData->m_pTextList[pData->m_TextCount + count] = NULL;
+ pData->m_TextCount += count + 1;
+}
+void CPDF_ClipPath::Transform(const CPDF_Matrix& matrix)
+{
+ CPDF_ClipPathData* pData = GetModify();
+ int i;
+ for (i = 0; i < pData->m_PathCount; i ++) {
+ pData->m_pPathList[i].Transform(&matrix);
+ }
+ for (i = 0; i < pData->m_TextCount; i ++)
+ if (pData->m_pTextList[i]) {
+ pData->m_pTextList[i]->Transform(matrix);
+ }
+}
+CPDF_ColorStateData::CPDF_ColorStateData(const CPDF_ColorStateData& src)
+{
+ m_FillColor.Copy(&src.m_FillColor);
+ m_FillRGB = src.m_FillRGB;
+ m_StrokeColor.Copy(&src.m_StrokeColor);
+ m_StrokeRGB = src.m_StrokeRGB;
+}
+void CPDF_ColorStateData::Default()
+{
+ m_FillRGB = m_StrokeRGB = 0;
+ m_FillColor.SetColorSpace(CPDF_ColorSpace::GetStockCS(PDFCS_DEVICEGRAY));
+ m_StrokeColor.SetColorSpace(CPDF_ColorSpace::GetStockCS(PDFCS_DEVICEGRAY));
+}
+void CPDF_ColorState::SetFillColor(CPDF_ColorSpace* pCS, FX_FLOAT* pValue, int nValues)
+{
+ CPDF_ColorStateData* pData = GetModify();
+ SetColor(pData->m_FillColor, pData->m_FillRGB, pCS, pValue, nValues);
+}
+void CPDF_ColorState::SetStrokeColor(CPDF_ColorSpace* pCS, FX_FLOAT* pValue, int nValues)
+{
+ CPDF_ColorStateData* pData = GetModify();
+ SetColor(pData->m_StrokeColor, pData->m_StrokeRGB, pCS, pValue, nValues);
+}
+void CPDF_ColorState::SetColor(CPDF_Color& color, FX_DWORD& rgb, CPDF_ColorSpace* pCS, FX_FLOAT* pValue, int nValues)
+{
+ if (pCS) {
+ color.SetColorSpace(pCS);
+ } else if (color.IsNull()) {
+ color.SetColorSpace(CPDF_ColorSpace::GetStockCS(PDFCS_DEVICEGRAY));
+ }
+ if (color.m_pCS->CountComponents() > nValues) {
+ return;
+ }
+ color.SetValue(pValue);
+ int R, G, B;
+ rgb = color.GetRGB(R, G, B) ? FXSYS_RGB(R, G, B) : (FX_DWORD) - 1;
+}
+void CPDF_ColorState::SetFillPattern(CPDF_Pattern* pPattern, FX_FLOAT* pValue, int nValues)
+{
+ CPDF_ColorStateData* pData = GetModify();
+ pData->m_FillColor.SetValue(pPattern, pValue, nValues);
+ int R, G, B;
+ FX_BOOL ret = pData->m_FillColor.GetRGB(R, G, B);
+ if (pPattern->m_PatternType == 1 && ((CPDF_TilingPattern*)pPattern)->m_bColored && !ret) {
+ pData->m_FillRGB = 0x00BFBFBF;
+ return;
+ }
+ pData->m_FillRGB = ret ? FXSYS_RGB(R, G, B) : (FX_DWORD) - 1;
+}
+void CPDF_ColorState::SetStrokePattern(CPDF_Pattern* pPattern, FX_FLOAT* pValue, int nValues)
+{
+ CPDF_ColorStateData* pData = GetModify();
+ pData->m_StrokeColor.SetValue(pPattern, pValue, nValues);
+ int R, G, B;
+ FX_BOOL ret = pData->m_StrokeColor.GetRGB(R, G, B);
+ if (pPattern->m_PatternType == 1 && ((CPDF_TilingPattern*)pPattern)->m_bColored && !ret) {
+ pData->m_StrokeRGB = 0x00BFBFBF;
+ return;
+ }
+ pData->m_StrokeRGB = pData->m_StrokeColor.GetRGB(R, G, B) ? FXSYS_RGB(R, G, B) : (FX_DWORD) - 1;
+}
+CPDF_TextStateData::CPDF_TextStateData()
+{
+ m_pFont = NULL;
+ m_FontSize = 1.0f;
+ m_WordSpace = 0;
+ m_CharSpace = 0;
+ m_TextMode = 0;
+ m_Matrix[0] = m_Matrix[3] = 1.0f;
+ m_Matrix[1] = m_Matrix[2] = 0;
+ m_CTM[0] = m_CTM[3] = 1.0f;
+ m_CTM[1] = m_CTM[2] = 0;
+}
+CPDF_TextStateData::CPDF_TextStateData(const CPDF_TextStateData& src)
+{
+ FXSYS_memcpy32(this, &src, sizeof(CPDF_TextStateData));
+ if (m_pFont && m_pFont->m_pDocument) {
+ m_pFont = m_pFont->m_pDocument->GetPageData()->GetFont(m_pFont->GetFontDict(), FALSE);
+ }
+}
+CPDF_TextStateData::~CPDF_TextStateData()
+{
+ CPDF_Font* pFont = m_pFont;
+ if (pFont && pFont->m_pDocument) {
+ pFont->m_pDocument->GetPageData()->ReleaseFont(pFont->GetFontDict());
+ }
+}
+void CPDF_TextState::SetFont(CPDF_Font* pFont)
+{
+ CPDF_Font*& pStateFont = GetModify()->m_pFont;
+ CPDF_DocPageData* pDocPageData = NULL;
+ if (pStateFont && pStateFont->m_pDocument) {
+ pDocPageData = pStateFont->m_pDocument->GetPageData();
+ pDocPageData->ReleaseFont(pStateFont->GetFontDict());
+ }
+ pStateFont = pFont;
+}
+FX_FLOAT CPDF_TextState::GetFontSizeV() const
+{
+ FX_FLOAT* pMatrix = GetMatrix();
+ FX_FLOAT unit = FXSYS_sqrt2(pMatrix[1], pMatrix[3]);
+ FX_FLOAT size = FXSYS_Mul(unit, GetFontSize());
+ return (FX_FLOAT)FXSYS_fabs(size);
+}
+FX_FLOAT CPDF_TextState::GetFontSizeH() const
+{
+ FX_FLOAT* pMatrix = GetMatrix();
+ FX_FLOAT unit = FXSYS_sqrt2(pMatrix[0], pMatrix[2]);
+ FX_FLOAT size = FXSYS_Mul(unit, GetFontSize());
+ return (FX_FLOAT)FXSYS_fabs(size);
+}
+FX_FLOAT CPDF_TextState::GetBaselineAngle() const
+{
+ FX_FLOAT* m_Matrix = GetMatrix();
+ return FXSYS_atan2(m_Matrix[2], m_Matrix[0]);
+}
+FX_FLOAT CPDF_TextState::GetShearAngle() const
+{
+ FX_FLOAT* m_Matrix = GetMatrix();
+ FX_FLOAT shear_angle = FXSYS_atan2(m_Matrix[1], m_Matrix[3]);
+ return GetBaselineAngle() + shear_angle;
+}
+CPDF_GeneralStateData::CPDF_GeneralStateData()
+{
+ FXSYS_memset32(this, 0, sizeof(CPDF_GeneralStateData));
+ FXSYS_strcpy((FX_LPSTR)m_BlendMode, (FX_LPCSTR)"Normal");
+ m_StrokeAlpha = 1.0f;
+ m_FillAlpha = 1.0f;
+ m_Flatness = 1.0f;
+ m_Matrix.SetIdentity();
+}
+CPDF_GeneralStateData::CPDF_GeneralStateData(const CPDF_GeneralStateData& src)
+{
+ FXSYS_memcpy32(this, &src, sizeof(CPDF_GeneralStateData));
+ if (src.m_pTransferFunc && src.m_pTransferFunc->m_pPDFDoc) {
+ CPDF_DocRenderData* pDocCache = src.m_pTransferFunc->m_pPDFDoc->GetRenderData();
+ if (!pDocCache) {
+ return;
+ }
+ m_pTransferFunc = pDocCache->GetTransferFunc(m_pTR);
+ }
+}
+CPDF_GeneralStateData::~CPDF_GeneralStateData()
+{
+ if (m_pTransferFunc && m_pTransferFunc->m_pPDFDoc) {
+ CPDF_DocRenderData* pDocCache = m_pTransferFunc->m_pPDFDoc->GetRenderData();
+ if (!pDocCache) {
+ return;
+ }
+ pDocCache->ReleaseTransferFunc(m_pTR);
+ }
+}
+static int GetBlendType(FX_BSTR mode)
+{
+ switch (mode.GetID()) {
+ case FXBSTR_ID('N', 'o', 'r', 'm'):
+ case FXBSTR_ID('C', 'o', 'm', 'p'):
+ return FXDIB_BLEND_NORMAL;
+ case FXBSTR_ID('M', 'u', 'l', 't'):
+ return FXDIB_BLEND_MULTIPLY;
+ case FXBSTR_ID('S', 'c', 'r', 'e'):
+ return FXDIB_BLEND_SCREEN;
+ case FXBSTR_ID('O', 'v', 'e', 'r'):
+ return FXDIB_BLEND_OVERLAY;
+ case FXBSTR_ID('D', 'a', 'r', 'k'):
+ return FXDIB_BLEND_DARKEN;
+ case FXBSTR_ID('L', 'i', 'g', 'h'):
+ return FXDIB_BLEND_LIGHTEN;
+ case FXBSTR_ID('C', 'o', 'l', 'o'):
+ if (mode.GetLength() == 10) {
+ return FXDIB_BLEND_COLORDODGE;
+ }
+ if (mode.GetLength() == 9) {
+ return FXDIB_BLEND_COLORBURN;
+ }
+ return FXDIB_BLEND_COLOR;
+ case FXBSTR_ID('H', 'a', 'r', 'd'):
+ return FXDIB_BLEND_HARDLIGHT;
+ case FXBSTR_ID('S', 'o', 'f', 't'):
+ return FXDIB_BLEND_SOFTLIGHT;
+ case FXBSTR_ID('D', 'i', 'f', 'f'):
+ return FXDIB_BLEND_DIFFERENCE;
+ case FXBSTR_ID('E', 'x', 'c', 'l'):
+ return FXDIB_BLEND_EXCLUSION;
+ case FXBSTR_ID('H', 'u', 'e', 0):
+ return FXDIB_BLEND_HUE;
+ case FXBSTR_ID('S', 'a', 't', 'u'):
+ return FXDIB_BLEND_SATURATION;
+ case FXBSTR_ID('L', 'u', 'm', 'i'):
+ return FXDIB_BLEND_LUMINOSITY;
+ }
+ return FXDIB_BLEND_NORMAL;
+}
+void CPDF_GeneralStateData::SetBlendMode(FX_BSTR blend_mode)
+{
+ if (blend_mode.GetLength() > 15) {
+ return;
+ }
+ FXSYS_memcpy32(m_BlendMode, (FX_LPCBYTE)blend_mode, blend_mode.GetLength());
+ m_BlendMode[blend_mode.GetLength()] = 0;
+ m_BlendType = ::GetBlendType(blend_mode);
+}
+int RI_StringToId(const CFX_ByteString& ri)
+{
+ FX_DWORD id = ri.GetID();
+ if (id == FXBSTR_ID('A', 'b', 's', 'o')) {
+ return 1;
+ }
+ if (id == FXBSTR_ID('S', 'a', 't', 'u')) {
+ return 2;
+ }
+ if (id == FXBSTR_ID('P', 'e', 'r', 'c')) {
+ return 3;
+ }
+ return 0;
+}
+void CPDF_GeneralState::SetRenderIntent(const CFX_ByteString& ri)
+{
+ GetModify()->m_RenderIntent = RI_StringToId(ri);
+}
+CPDF_AllStates::CPDF_AllStates()
+{
+ m_TextX = m_TextY = m_TextLineX = m_TextLineY = 0;
+ m_TextLeading = 0;
+ m_TextRise = 0;
+ m_TextHorzScale = 1.0f;
+}
+CPDF_AllStates::~CPDF_AllStates()
+{
+}
+void CPDF_AllStates::Copy(const CPDF_AllStates& src)
+{
+ CopyStates(src);
+ m_TextMatrix.Copy(src.m_TextMatrix);
+ m_ParentMatrix.Copy(src.m_ParentMatrix);
+ m_CTM.Copy(src.m_CTM);
+ m_TextX = src.m_TextX;
+ m_TextY = src.m_TextY;
+ m_TextLineX = src.m_TextLineX;
+ m_TextLineY = src.m_TextLineY;
+ m_TextLeading = src.m_TextLeading;
+ m_TextRise = src.m_TextRise;
+ m_TextHorzScale = src.m_TextHorzScale;
+}
+void CPDF_AllStates::SetLineDash(CPDF_Array* pArray, FX_FLOAT phase, FX_FLOAT scale)
+{
+ CFX_GraphStateData* pData = m_GraphState.GetModify();
+ pData->m_DashPhase = FXSYS_Mul(phase, scale);
+ pData->SetDashCount(pArray->GetCount());
+ for (FX_DWORD i = 0; i < pArray->GetCount(); i ++) {
+ pData->m_DashArray[i] = FXSYS_Mul(pArray->GetNumber(i), scale);
+ }
+}
+void CPDF_AllStates::ProcessExtGS(CPDF_Dictionary* pGS, CPDF_StreamContentParser* pParser)
+{
+ CPDF_GeneralStateData* pGeneralState = m_GeneralState.GetModify();
+ FX_POSITION pos = pGS->GetStartPos();
+ while (pos) {
+ CFX_ByteString key_str;
+ CPDF_Object* pObject = pGS->GetNextElement(pos, key_str)->GetDirect();
+ if (pObject == NULL) {
+ continue;
+ }
+ FX_DWORD key = key_str.GetID();
+ switch (key) {
+ case FXBSTR_ID('L', 'W', 0, 0):
+ m_GraphState.GetModify()->m_LineWidth = pObject->GetNumber();
+ break;
+ case FXBSTR_ID('L', 'C', 0, 0):
+ m_GraphState.GetModify()->m_LineCap = (CFX_GraphStateData::LineCap)pObject->GetInteger();
+ break;
+ case FXBSTR_ID('L', 'J', 0, 0):
+ m_GraphState.GetModify()->m_LineJoin = (CFX_GraphStateData::LineJoin)pObject->GetInteger();
+ break;
+ case FXBSTR_ID('M', 'L', 0, 0):
+ m_GraphState.GetModify()->m_MiterLimit = pObject->GetNumber();
+ break;
+ case FXBSTR_ID('D', 0, 0, 0): {
+ if (pObject->GetType() != PDFOBJ_ARRAY) {
+ break;
+ }
+ CPDF_Array* pDash = (CPDF_Array*)pObject;
+ CPDF_Array* pArray = pDash->GetArray(0);
+ if (pArray == NULL) {
+ break;
+ }
+ SetLineDash(pArray, pDash->GetNumber(1), 1.0f);
+ break;
+ }
+ case FXBSTR_ID('R', 'I', 0, 0):
+ m_GeneralState.SetRenderIntent(pObject->GetString());
+ break;
+ case FXBSTR_ID('F', 'o', 'n', 't'): {
+ if (pObject->GetType() != PDFOBJ_ARRAY) {
+ break;
+ }
+ CPDF_Array* pFont = (CPDF_Array*)pObject;
+ m_TextState.GetModify()->m_FontSize = pFont->GetNumber(1);
+ m_TextState.SetFont(pParser->FindFont(pFont->GetString(0)));
+ break;
+ }
+ case FXBSTR_ID('T', 'R', 0, 0):
+ if (pGS->KeyExist(FX_BSTRC("TR2"))) {
+ continue;
+ }
+ case FXBSTR_ID('T', 'R', '2', 0):
+ if (pObject && pObject->GetType() != PDFOBJ_NAME) {
+ pGeneralState->m_pTR = pObject;
+ } else {
+ pGeneralState->m_pTR = NULL;
+ }
+ break;
+ case FXBSTR_ID('B', 'M', 0, 0): {
+ CFX_ByteString mode;
+ if (pObject->GetType() == PDFOBJ_ARRAY) {
+ mode = ((CPDF_Array*)pObject)->GetString(0);
+ } else {
+ mode = pObject->GetString();
+ }
+ pGeneralState->SetBlendMode(mode);
+ if (pGeneralState->m_BlendType > FXDIB_BLEND_MULTIPLY) {
+ pParser->m_pObjectList->m_bBackgroundAlphaNeeded = TRUE;
+ }
+ break;
+ }
+ case FXBSTR_ID('S', 'M', 'a', 's'):
+ if (pObject && pObject->GetType() == PDFOBJ_DICTIONARY) {
+ pGeneralState->m_pSoftMask = pObject;
+ FXSYS_memcpy32(pGeneralState->m_SMaskMatrix, &pParser->m_pCurStates->m_CTM, sizeof(CPDF_Matrix));
+ } else {
+ pGeneralState->m_pSoftMask = NULL;
+ }
+ break;
+ case FXBSTR_ID('C', 'A', 0, 0):
+ pGeneralState->m_StrokeAlpha = PDF_ClipFloat(pObject->GetNumber());
+ break;
+ case FXBSTR_ID('c', 'a', 0, 0):
+ pGeneralState->m_FillAlpha = PDF_ClipFloat(pObject->GetNumber());
+ break;
+ case FXBSTR_ID('O', 'P', 0, 0):
+ pGeneralState->m_StrokeOP = pObject->GetInteger();
+ if (!pGS->KeyExist(FX_BSTRC("op"))) {
+ pGeneralState->m_FillOP = pObject->GetInteger();
+ }
+ break;
+ case FXBSTR_ID('o', 'p', 0, 0):
+ pGeneralState->m_FillOP = pObject->GetInteger();
+ break;
+ case FXBSTR_ID('O', 'P', 'M', 0):
+ pGeneralState->m_OPMode = pObject->GetInteger();
+ break;
+ case FXBSTR_ID('B', 'G', 0, 0):
+ if (pGS->KeyExist(FX_BSTRC("BG2"))) {
+ continue;
+ }
+ case FXBSTR_ID('B', 'G', '2', 0):
+ pGeneralState->m_pBG = pObject;
+ break;
+ case FXBSTR_ID('U', 'C', 'R', 0):
+ if (pGS->KeyExist(FX_BSTRC("UCR2"))) {
+ continue;
+ }
+ case FXBSTR_ID('U', 'C', 'R', '2'):
+ pGeneralState->m_pUCR = pObject;
+ break;
+ case FXBSTR_ID('H', 'T', 0, 0):
+ pGeneralState->m_pHT = pObject;
+ break;
+ case FXBSTR_ID('F', 'L', 0, 0):
+ pGeneralState->m_Flatness = pObject->GetNumber();
+ break;
+ case FXBSTR_ID('S', 'M', 0, 0):
+ pGeneralState->m_Smoothness = pObject->GetNumber();
+ break;
+ case FXBSTR_ID('S', 'A', 0, 0):
+ pGeneralState->m_StrokeAdjust = pObject->GetInteger();
+ break;
+ case FXBSTR_ID('A', 'I', 'S', 0):
+ pGeneralState->m_AlphaSource = pObject->GetInteger();
+ break;
+ case FXBSTR_ID('T', 'K', 0, 0):
+ pGeneralState->m_TextKnockout = pObject->GetInteger();
+ break;
+ }
+ }
+ pGeneralState->m_Matrix = m_CTM;
+}
+CPDF_ContentMarkItem::CPDF_ContentMarkItem()
+{
+ m_ParamType = None;
+}
+CPDF_ContentMarkItem::CPDF_ContentMarkItem(const CPDF_ContentMarkItem& src)
+{
+ m_MarkName = src.m_MarkName;
+ m_ParamType = src.m_ParamType;
+ if (m_ParamType == DirectDict) {
+ m_pParam = ((CPDF_Dictionary*)src.m_pParam)->Clone();
+ } else {
+ m_pParam = src.m_pParam;
+ }
+}
+CPDF_ContentMarkItem::~CPDF_ContentMarkItem()
+{
+ if (m_ParamType == DirectDict) {
+ ((CPDF_Dictionary*)m_pParam)->Release();
+ }
+}
+FX_BOOL CPDF_ContentMarkItem::HasMCID() const
+{
+ if (m_pParam && (m_ParamType == DirectDict || m_ParamType == PropertiesDict)) {
+ return ((CPDF_Dictionary *)m_pParam)->KeyExist(FX_BSTRC("MCID"));
+ }
+ return FALSE;
+}
+CPDF_ContentMarkData::CPDF_ContentMarkData(const CPDF_ContentMarkData& src)
+{
+ for (int i = 0; i < src.m_Marks.GetSize(); i ++) {
+ m_Marks.Add(src.m_Marks[i]);
+ }
+}
+int CPDF_ContentMarkData::GetMCID() const
+{
+ CPDF_ContentMarkItem::ParamType type = CPDF_ContentMarkItem::None;
+ for (int i = 0; i < m_Marks.GetSize(); i ++) {
+ type = m_Marks[i].GetParamType();
+ if (type == CPDF_ContentMarkItem::PropertiesDict || type == CPDF_ContentMarkItem::DirectDict) {
+ CPDF_Dictionary *pDict = (CPDF_Dictionary *)m_Marks[i].GetParam();
+ if (pDict->KeyExist(FX_BSTRC("MCID"))) {
+ return pDict->GetInteger(FX_BSTRC("MCID"));
+ }
+ }
+ }
+ return -1;
+}
+void CPDF_ContentMarkData::AddMark(const CFX_ByteString& name, CPDF_Dictionary* pDict, FX_BOOL bDirect)
+{
+ CPDF_ContentMarkItem& item = m_Marks.Add();
+ item.SetName(name);
+ if (pDict == NULL) {
+ return;
+ }
+ item.SetParam(bDirect ? CPDF_ContentMarkItem::DirectDict : CPDF_ContentMarkItem::PropertiesDict,
+ bDirect ? pDict->Clone() : pDict);
+}
+void CPDF_ContentMarkData::DeleteLastMark()
+{
+ int size = m_Marks.GetSize();
+ if (size == 0) {
+ return;
+ }
+ m_Marks.RemoveAt(size - 1);
+}
+FX_BOOL CPDF_ContentMark::HasMark(FX_BSTR mark) const
+{
+ if (m_pObject == NULL) {
+ return FALSE;
+ }
+ for (int i = 0; i < m_pObject->CountItems(); i ++) {
+ CPDF_ContentMarkItem& item = m_pObject->GetItem(i);
+ if (item.GetName() == mark) {
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+FX_BOOL CPDF_ContentMark::LookupMark(FX_BSTR mark, CPDF_Dictionary*& pDict) const
+{
+ if (m_pObject == NULL) {
+ return FALSE;
+ }
+ for (int i = 0; i < m_pObject->CountItems(); i ++) {
+ CPDF_ContentMarkItem& item = m_pObject->GetItem(i);
+ if (item.GetName() == mark) {
+ pDict = NULL;
+ if (item.GetParamType() == CPDF_ContentMarkItem::PropertiesDict ||
+ item.GetParamType() == CPDF_ContentMarkItem::DirectDict) {
+ pDict = (CPDF_Dictionary*)item.GetParam();
+ }
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
diff --git a/core/src/fpdfapi/fpdf_page/fpdf_page_image.cpp b/core/src/fpdfapi/fpdf_page/fpdf_page_image.cpp
index ec351058ac..b1fbe01b90 100644
--- a/core/src/fpdfapi/fpdf_page/fpdf_page_image.cpp
+++ b/core/src/fpdfapi/fpdf_page/fpdf_page_image.cpp
@@ -1,116 +1,116 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../../include/fpdfapi/fpdf_page.h"
-#include "../../../include/fpdfapi/fpdf_pageobj.h"
-#include "pageint.h"
-CPDF_ImageObject::CPDF_ImageObject()
-{
- m_pImage = NULL;
- m_Type = PDFPAGE_IMAGE;
-}
-CPDF_ImageObject::~CPDF_ImageObject()
-{
- if (!m_pImage) {
- return;
- }
- if (m_pImage->IsInline() || (m_pImage->GetStream() && m_pImage->GetStream()->GetObjNum() == 0)) {
- delete m_pImage;
- } else {
- m_pImage->GetDocument()->GetPageData()->ReleaseImage(m_pImage->GetStream());
- }
-}
-void CPDF_ImageObject::CopyData(const CPDF_PageObject* pSrc)
-{
- const CPDF_ImageObject* pSrcObj = (const CPDF_ImageObject*)pSrc;
- if (m_pImage) {
- m_pImage->Release();
- }
- m_pImage = pSrcObj->m_pImage->Clone();
- m_Matrix = pSrcObj->m_Matrix;
-}
-void CPDF_ImageObject::Transform(const CFX_AffineMatrix& matrix)
-{
- m_Matrix.Concat(matrix);
- CalcBoundingBox();
-}
-void CPDF_ImageObject::CalcBoundingBox()
-{
- m_Left = m_Bottom = 0;
- m_Right = m_Top = 1.0f;
- m_Matrix.TransformRect(m_Left, m_Right, m_Top, m_Bottom);
-}
-void CPDF_Image::Release()
-{
- if (m_bInline || (m_pStream && m_pStream->GetObjNum() == 0)) {
- delete this;
- }
-}
-CPDF_Image* CPDF_Image::Clone()
-{
- if (m_pStream->GetObjNum()) {
- return m_pDocument->GetPageData()->GetImage(m_pStream);
- }
- CPDF_Image* pImage = FX_NEW CPDF_Image(m_pDocument);
- pImage->LoadImageF((CPDF_Stream*)((CPDF_Object*)m_pStream)->Clone(), m_bInline);
- if (m_bInline) {
- CPDF_Dictionary *pInlineDict = (CPDF_Dictionary*)m_pInlineDict->Clone(TRUE);
- pImage->SetInlineDict(pInlineDict);
- }
- return pImage;
-}
-CPDF_Image::CPDF_Image(CPDF_Document* pDoc)
-{
- m_pDocument = pDoc;
- m_pStream = NULL;
- m_pOC = NULL;
- m_bInline = FALSE;
- m_pInlineDict = NULL;
- m_pDIBSource = NULL;
- m_pMask = NULL;
- m_MatteColor = 0;
-}
-CPDF_Image::~CPDF_Image()
-{
- if (m_bInline) {
- if (m_pStream) {
-#ifndef FOXIT_CHROME_BUILD
- CPDF_Dictionary* pDict = m_pStream->GetDict();
- if (pDict) {
- CPDF_Object* pCSObj = pDict->GetElementValue(FX_BSTRC("ColorSpace"));
- if (pCSObj && m_pDocument) {
- m_pDocument->RemoveColorSpaceFromPageData(pCSObj);
- }
- }
-#endif
- m_pStream->Release();
- }
- if (m_pInlineDict) {
- m_pInlineDict->Release();
- }
- }
-}
-FX_BOOL CPDF_Image::LoadImageF(CPDF_Stream* pStream, FX_BOOL bInline)
-{
- m_pStream = pStream;
- if (m_bInline && m_pInlineDict) {
- m_pInlineDict->Release();
- m_pInlineDict = NULL;
- }
- m_bInline = bInline;
- CPDF_Dictionary* pDict = pStream->GetDict();
- if (m_bInline) {
- m_pInlineDict = (CPDF_Dictionary*)pDict->Clone();
- }
- m_pOC = pDict->GetDict(FX_BSTRC("OC"));
- m_bIsMask = !pDict->KeyExist(FX_BSTRC("ColorSpace")) || pDict->GetInteger(FX_BSTRC("ImageMask"));
-#ifndef _FPDFAPI_MINI_
- m_bInterpolate = pDict->GetInteger(FX_BSTRC("Interpolate"));
-#endif
- m_Height = pDict->GetInteger(FX_BSTRC("Height"));
- m_Width = pDict->GetInteger(FX_BSTRC("Width"));
- return TRUE;
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fpdfapi/fpdf_page.h"
+#include "../../../include/fpdfapi/fpdf_pageobj.h"
+#include "pageint.h"
+CPDF_ImageObject::CPDF_ImageObject()
+{
+ m_pImage = NULL;
+ m_Type = PDFPAGE_IMAGE;
+}
+CPDF_ImageObject::~CPDF_ImageObject()
+{
+ if (!m_pImage) {
+ return;
+ }
+ if (m_pImage->IsInline() || (m_pImage->GetStream() && m_pImage->GetStream()->GetObjNum() == 0)) {
+ delete m_pImage;
+ } else {
+ m_pImage->GetDocument()->GetPageData()->ReleaseImage(m_pImage->GetStream());
+ }
+}
+void CPDF_ImageObject::CopyData(const CPDF_PageObject* pSrc)
+{
+ const CPDF_ImageObject* pSrcObj = (const CPDF_ImageObject*)pSrc;
+ if (m_pImage) {
+ m_pImage->Release();
+ }
+ m_pImage = pSrcObj->m_pImage->Clone();
+ m_Matrix = pSrcObj->m_Matrix;
+}
+void CPDF_ImageObject::Transform(const CFX_AffineMatrix& matrix)
+{
+ m_Matrix.Concat(matrix);
+ CalcBoundingBox();
+}
+void CPDF_ImageObject::CalcBoundingBox()
+{
+ m_Left = m_Bottom = 0;
+ m_Right = m_Top = 1.0f;
+ m_Matrix.TransformRect(m_Left, m_Right, m_Top, m_Bottom);
+}
+void CPDF_Image::Release()
+{
+ if (m_bInline || (m_pStream && m_pStream->GetObjNum() == 0)) {
+ delete this;
+ }
+}
+CPDF_Image* CPDF_Image::Clone()
+{
+ if (m_pStream->GetObjNum()) {
+ return m_pDocument->GetPageData()->GetImage(m_pStream);
+ }
+ CPDF_Image* pImage = FX_NEW CPDF_Image(m_pDocument);
+ pImage->LoadImageF((CPDF_Stream*)((CPDF_Object*)m_pStream)->Clone(), m_bInline);
+ if (m_bInline) {
+ CPDF_Dictionary *pInlineDict = (CPDF_Dictionary*)m_pInlineDict->Clone(TRUE);
+ pImage->SetInlineDict(pInlineDict);
+ }
+ return pImage;
+}
+CPDF_Image::CPDF_Image(CPDF_Document* pDoc)
+{
+ m_pDocument = pDoc;
+ m_pStream = NULL;
+ m_pOC = NULL;
+ m_bInline = FALSE;
+ m_pInlineDict = NULL;
+ m_pDIBSource = NULL;
+ m_pMask = NULL;
+ m_MatteColor = 0;
+}
+CPDF_Image::~CPDF_Image()
+{
+ if (m_bInline) {
+ if (m_pStream) {
+#ifndef FOXIT_CHROME_BUILD
+ CPDF_Dictionary* pDict = m_pStream->GetDict();
+ if (pDict) {
+ CPDF_Object* pCSObj = pDict->GetElementValue(FX_BSTRC("ColorSpace"));
+ if (pCSObj && m_pDocument) {
+ m_pDocument->RemoveColorSpaceFromPageData(pCSObj);
+ }
+ }
+#endif
+ m_pStream->Release();
+ }
+ if (m_pInlineDict) {
+ m_pInlineDict->Release();
+ }
+ }
+}
+FX_BOOL CPDF_Image::LoadImageF(CPDF_Stream* pStream, FX_BOOL bInline)
+{
+ m_pStream = pStream;
+ if (m_bInline && m_pInlineDict) {
+ m_pInlineDict->Release();
+ m_pInlineDict = NULL;
+ }
+ m_bInline = bInline;
+ CPDF_Dictionary* pDict = pStream->GetDict();
+ if (m_bInline) {
+ m_pInlineDict = (CPDF_Dictionary*)pDict->Clone();
+ }
+ m_pOC = pDict->GetDict(FX_BSTRC("OC"));
+ m_bIsMask = !pDict->KeyExist(FX_BSTRC("ColorSpace")) || pDict->GetInteger(FX_BSTRC("ImageMask"));
+#ifndef _FPDFAPI_MINI_
+ m_bInterpolate = pDict->GetInteger(FX_BSTRC("Interpolate"));
+#endif
+ m_Height = pDict->GetInteger(FX_BSTRC("Height"));
+ m_Width = pDict->GetInteger(FX_BSTRC("Width"));
+ return TRUE;
+}
diff --git a/core/src/fpdfapi/fpdf_page/fpdf_page_parser.cpp b/core/src/fpdfapi/fpdf_page/fpdf_page_parser.cpp
index 40f6d04212..ff670965ec 100644
--- a/core/src/fpdfapi/fpdf_page/fpdf_page_parser.cpp
+++ b/core/src/fpdfapi/fpdf_page/fpdf_page_parser.cpp
@@ -1,1681 +1,1681 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../../include/fpdfapi/fpdf_page.h"
-#include "../../../include/fpdfapi/fpdf_module.h"
-#include "../../../include/fpdfapi/fpdf_serial.h"
-#include "pageint.h"
-#define REQUIRE_PARAMS(count) if (m_ParamCount != count) { m_bAbort = TRUE; return; }
-CPDF_StreamContentParser::CPDF_StreamContentParser()
-{
- m_DefFontSize = 0;
- m_pCurStates = NULL;
- m_pLastTextObject = NULL;
- m_pPathPoints = NULL;
- m_PathClipType = 0;
- m_PathPointCount = m_PathAllocSize = 0;
- m_PathCurrentX = m_PathCurrentY = 0.0f;
- m_bResourceMissing = FALSE;
- m_bColored = FALSE;
- FXSYS_memset32(m_Type3Data, 0, sizeof(FX_FLOAT) * 6);
- m_ParamCount = 0;
- m_ParamStartPos = 0;
- m_bAbort = FALSE;
- m_pLastImageDict = NULL;
- m_pLastCloneImageDict = NULL;
- m_pLastImage = NULL;
- m_bReleaseLastDict = TRUE;
- m_pParentResources = NULL;
-#ifdef _FPDFAPI_MINI_
- m_pObjectState = NULL;
- m_pObjectStack = NULL;
- m_pWordBuf = NULL;
- m_pDictName = NULL;
- m_pStreamBuf = NULL;
- m_WordState = 0;
- m_ObjectSize = 0;
-#endif
-}
-FX_BOOL CPDF_StreamContentParser::Initialize()
-{
-#ifdef _FPDFAPI_MINI_
- m_pObjectState = FX_Alloc(FX_BOOL, _FPDF_MAX_OBJECT_STACK_SIZE_);
- FXSYS_memset32(m_pObjectState, 0, _FPDF_MAX_OBJECT_STACK_SIZE_ * sizeof(FX_BOOL));
- m_pObjectStack = FX_Alloc(CPDF_Object*, _FPDF_MAX_OBJECT_STACK_SIZE_);
- FXSYS_memset32(m_pObjectStack, 0, _FPDF_MAX_OBJECT_STACK_SIZE_ * sizeof(CPDF_Object*));
- m_pWordBuf = FX_Alloc(FX_BYTE, 256);
- FXSYS_memset32(m_pWordBuf, 0, 256 * sizeof(FX_BYTE));
- m_pDictName = FX_Alloc(FX_BYTE, 256);
- FXSYS_memset32(m_pDictName, 0, 256 * sizeof(FX_BYTE));
- m_pStreamBuf = FX_Alloc(FX_BYTE, STREAM_PARSE_BUFSIZE);
- FXSYS_memset32(m_pStreamBuf, 0, STREAM_PARSE_BUFSIZE * sizeof(FX_BYTE));
- m_StringBuf.EstimateSize(1024);
- m_ObjectSize = 0;
- m_ImageSrcBuf.EstimateSize(STREAM_PARSE_BUFSIZE);
-#endif
- return TRUE;
-}
-CPDF_StreamContentParser::~CPDF_StreamContentParser()
-{
- ClearAllParams();
- int i = 0;
- for (i = 0; i < m_StateStack.GetSize(); i ++) {
- delete (CPDF_AllStates*)m_StateStack[i];
- }
- if (m_pPathPoints) {
- FX_Free(m_pPathPoints);
- }
- if (m_pCurStates) {
- delete m_pCurStates;
- }
- if (m_pLastImageDict) {
- m_pLastImageDict->Release();
- }
- if (m_pLastCloneImageDict) {
- m_pLastCloneImageDict->Release();
- }
-#ifdef _FPDFAPI_MINI_
- for (i = 0; i < (int)m_ObjectSize; ++i) {
- if (!m_pObjectState[i]) {
- m_pObjectStack[i]->Release();
- }
- }
- FX_Free(m_pObjectStack);
- FX_Free(m_pObjectState);
- FX_Free(m_pStreamBuf);
- FX_Free(m_pWordBuf);
- FX_Free(m_pDictName);
-#endif
-}
-void CPDF_StreamContentParser::PrepareParse(CPDF_Document* pDocument,
- CPDF_Dictionary* pPageResources, CPDF_Dictionary* pParentResources, CFX_AffineMatrix* pmtContentToUser, CPDF_PageObjects* pObjList,
- CPDF_Dictionary* pResources, CPDF_Rect* pBBox, CPDF_ParseOptions* pOptions,
- CPDF_AllStates* pStates, int level)
-{
- for (int i = 0; i < 6; i ++) {
- m_Type3Data[i] = 0;
- }
- m_pDocument = pDocument;
- m_pPageResources = pPageResources;
- m_pParentResources = pParentResources;
- if (pmtContentToUser) {
- m_mtContentToUser = *pmtContentToUser;
- }
- if (pOptions) {
- m_Options = *pOptions;
- }
- m_pObjectList = pObjList;
- m_pResources = pResources;
- if (pResources == NULL) {
- m_pResources = m_pParentResources;
- }
- if (m_pResources == NULL) {
- m_pResources = pPageResources;
- }
- if (pBBox) {
- m_BBox = *pBBox;
- }
- m_Level = level;
- m_pCurStates = FX_NEW CPDF_AllStates;
- if (pStates) {
- m_pCurStates->Copy(*pStates);
- } else {
- m_pCurStates->m_GeneralState.New();
- m_pCurStates->m_GraphState.New();
- m_pCurStates->m_TextState.New();
- m_pCurStates->m_ColorState.New();
- }
-#ifdef _FPDFAPI_MINI_
- FXSYS_memset32(m_pObjectState, 0, _FPDF_MAX_OBJECT_STACK_SIZE_ * sizeof(FX_BOOL));
-#endif
-}
-int CPDF_StreamContentParser::GetNextParamPos()
-{
- if (m_ParamCount == PARAM_BUF_SIZE) {
- m_ParamStartPos ++;
- if (m_ParamStartPos == PARAM_BUF_SIZE) {
- m_ParamStartPos = 0;
- }
- if (m_ParamBuf1[m_ParamStartPos].m_Type == 0) {
- m_ParamBuf1[m_ParamStartPos].m_pObject->Release();
- }
- return m_ParamStartPos;
- }
- int index = m_ParamStartPos + m_ParamCount;
- if (index >= PARAM_BUF_SIZE) {
- index -= PARAM_BUF_SIZE;
- }
- m_ParamCount ++;
- return index;
-}
-void CPDF_StreamContentParser::AddNameParam(FX_LPCSTR name, int len)
-{
- int index = GetNextParamPos();
- if (len > 32) {
- m_ParamBuf1[index].m_Type = 0;
- m_ParamBuf1[index].m_pObject = CPDF_Name::Create(PDF_NameDecode(CFX_ByteStringC(name, len)));
- } else {
- m_ParamBuf1[index].m_Type = PDFOBJ_NAME;
- if (FXSYS_memchr(name, '#', len) == NULL) {
- FXSYS_memcpy32(m_ParamBuf1[index].m_Name.m_Buffer, name, len);
- m_ParamBuf1[index].m_Name.m_Len = len;
- } else {
- CFX_ByteString str = PDF_NameDecode(CFX_ByteStringC(name, len));
- FXSYS_memcpy32(m_ParamBuf1[index].m_Name.m_Buffer, (FX_LPCSTR)str, str.GetLength());
- m_ParamBuf1[index].m_Name.m_Len = str.GetLength();
- }
- }
-}
-void CPDF_StreamContentParser::AddNumberParam(FX_LPCSTR str, int len)
-{
- int index = GetNextParamPos();
- m_ParamBuf1[index].m_Type = PDFOBJ_NUMBER;
- FX_atonum(CFX_ByteStringC(str, len), m_ParamBuf1[index].m_Number.m_bInteger,
- &m_ParamBuf1[index].m_Number.m_Integer);
-}
-void CPDF_StreamContentParser::AddObjectParam(CPDF_Object* pObj)
-{
- int index = GetNextParamPos();
- m_ParamBuf1[index].m_Type = 0;
- m_ParamBuf1[index].m_pObject = pObj;
-}
-void CPDF_StreamContentParser::ClearAllParams()
-{
- FX_DWORD index = m_ParamStartPos;
- for (FX_DWORD i = 0; i < m_ParamCount; i ++) {
- if (m_ParamBuf1[index].m_Type == 0) {
- m_ParamBuf1[index].m_pObject->Release();
- }
- index ++;
- if (index == PARAM_BUF_SIZE) {
- index = 0;
- }
- }
- m_ParamStartPos = 0;
- m_ParamCount = 0;
-}
-CPDF_Object* CPDF_StreamContentParser::GetObject(FX_DWORD index)
-{
- if (index >= m_ParamCount) {
- return NULL;
- }
- int real_index = m_ParamStartPos + m_ParamCount - index - 1;
- if (real_index >= PARAM_BUF_SIZE) {
- real_index -= PARAM_BUF_SIZE;
- }
- _ContentParam& param = m_ParamBuf1[real_index];
- if (param.m_Type == PDFOBJ_NUMBER) {
- CPDF_Number* pNumber = CPDF_Number::Create(param.m_Number.m_bInteger, &param.m_Number.m_Integer);
- param.m_Type = 0;
- param.m_pObject = pNumber;
- return pNumber;
- }
- if (param.m_Type == PDFOBJ_NAME) {
- CPDF_Name* pName = CPDF_Name::Create(CFX_ByteString(param.m_Name.m_Buffer, param.m_Name.m_Len));
- param.m_Type = 0;
- param.m_pObject = pName;
- return pName;
- }
- if (param.m_Type == 0) {
- return param.m_pObject;
- }
- ASSERT(FALSE);
- return NULL;
-}
-CFX_ByteString CPDF_StreamContentParser::GetString(FX_DWORD index)
-{
- if (index >= m_ParamCount) {
- return CFX_ByteString();
- }
- int real_index = m_ParamStartPos + m_ParamCount - index - 1;
- if (real_index >= PARAM_BUF_SIZE) {
- real_index -= PARAM_BUF_SIZE;
- }
- _ContentParam& param = m_ParamBuf1[real_index];
- if (param.m_Type == PDFOBJ_NAME) {
- return CFX_ByteString(param.m_Name.m_Buffer, param.m_Name.m_Len);
- }
- if (param.m_Type == 0) {
- return param.m_pObject->GetString();
- }
- return CFX_ByteString();
-}
-FX_FLOAT CPDF_StreamContentParser::GetNumber(FX_DWORD index)
-{
- if (index >= m_ParamCount) {
- return 0;
- }
- int real_index = m_ParamStartPos + m_ParamCount - index - 1;
- if (real_index >= PARAM_BUF_SIZE) {
- real_index -= PARAM_BUF_SIZE;
- }
- _ContentParam& param = m_ParamBuf1[real_index];
- if (param.m_Type == PDFOBJ_NUMBER) {
- return param.m_Number.m_bInteger ? (FX_FLOAT)param.m_Number.m_Integer : param.m_Number.m_Float;
- }
- if (param.m_Type == 0) {
- return param.m_pObject->GetNumber();
- }
- return 0;
-}
-FX_FLOAT CPDF_StreamContentParser::GetNumber16(FX_DWORD index)
-{
- return GetNumber(index);
-}
-void CPDF_StreamContentParser::SetGraphicStates(CPDF_PageObject* pObj, FX_BOOL bColor, FX_BOOL bText, FX_BOOL bGraph)
-{
- pObj->m_GeneralState = m_pCurStates->m_GeneralState;
- pObj->m_ClipPath = m_pCurStates->m_ClipPath;
- pObj->m_ContentMark = m_CurContentMark;
- if (bColor) {
- pObj->m_ColorState = m_pCurStates->m_ColorState;
- }
- if (bGraph) {
- pObj->m_GraphState = m_pCurStates->m_GraphState;
- }
- if (bText) {
- pObj->m_TextState = m_pCurStates->m_TextState;
- }
-}
-const struct _OpCode {
- FX_DWORD m_OpId;
- void (CPDF_StreamContentParser::*m_OpHandler)();
-} g_OpCodes[] = {
- {FXBSTR_ID('"', 0, 0, 0), &CPDF_StreamContentParser::Handle_NextLineShowText_Space},
- {FXBSTR_ID('\'', 0, 0, 0), &CPDF_StreamContentParser::Handle_NextLineShowText},
- {FXBSTR_ID('B', 0, 0, 0), &CPDF_StreamContentParser::Handle_FillStrokePath},
- {FXBSTR_ID('B', '*', 0, 0), &CPDF_StreamContentParser::Handle_EOFillStrokePath},
- {FXBSTR_ID('B', 'D', 'C', 0), &CPDF_StreamContentParser::Handle_BeginMarkedContent_Dictionary},
- {FXBSTR_ID('B', 'I', 0, 0), &CPDF_StreamContentParser::Handle_BeginImage},
- {FXBSTR_ID('B', 'M', 'C', 0), &CPDF_StreamContentParser::Handle_BeginMarkedContent},
- {FXBSTR_ID('B', 'T', 0, 0), &CPDF_StreamContentParser::Handle_BeginText},
- {FXBSTR_ID('B', 'X', 0, 0), &CPDF_StreamContentParser::Handle_BeginSectionUndefined},
- {FXBSTR_ID('C', 'S', 0, 0), &CPDF_StreamContentParser::Handle_SetColorSpace_Stroke},
- {FXBSTR_ID('D', 'P', 0, 0), &CPDF_StreamContentParser::Handle_MarkPlace_Dictionary},
- {FXBSTR_ID('D', 'o', 0, 0), &CPDF_StreamContentParser::Handle_ExecuteXObject},
- {FXBSTR_ID('E', 'I', 0, 0), &CPDF_StreamContentParser::Handle_EndImage},
- {FXBSTR_ID('E', 'M', 'C', 0), &CPDF_StreamContentParser::Handle_EndMarkedContent},
- {FXBSTR_ID('E', 'T', 0, 0), &CPDF_StreamContentParser::Handle_EndText},
- {FXBSTR_ID('E', 'X', 0, 0), &CPDF_StreamContentParser::Handle_EndSectionUndefined},
- {FXBSTR_ID('F', 0, 0, 0), &CPDF_StreamContentParser::Handle_FillPathOld},
- {FXBSTR_ID('G', 0, 0, 0), &CPDF_StreamContentParser::Handle_SetGray_Stroke},
- {FXBSTR_ID('I', 'D', 0, 0), &CPDF_StreamContentParser::Handle_BeginImageData},
- {FXBSTR_ID('J', 0, 0, 0), &CPDF_StreamContentParser::Handle_SetLineCap},
- {FXBSTR_ID('K', 0, 0, 0), &CPDF_StreamContentParser::Handle_SetCMYKColor_Stroke},
- {FXBSTR_ID('M', 0, 0, 0), &CPDF_StreamContentParser::Handle_SetMiterLimit},
- {FXBSTR_ID('M', 'P', 0, 0), &CPDF_StreamContentParser::Handle_MarkPlace},
- {FXBSTR_ID('Q', 0, 0, 0), &CPDF_StreamContentParser::Handle_RestoreGraphState},
- {FXBSTR_ID('R', 'G', 0, 0), &CPDF_StreamContentParser::Handle_SetRGBColor_Stroke},
- {FXBSTR_ID('S', 0, 0, 0), &CPDF_StreamContentParser::Handle_StrokePath},
- {FXBSTR_ID('S', 'C', 0, 0), &CPDF_StreamContentParser::Handle_SetColor_Stroke},
- {FXBSTR_ID('S', 'C', 'N', 0), &CPDF_StreamContentParser::Handle_SetColorPS_Stroke},
- {FXBSTR_ID('T', '*', 0, 0), &CPDF_StreamContentParser::Handle_MoveToNextLine},
- {FXBSTR_ID('T', 'D', 0, 0), &CPDF_StreamContentParser::Handle_MoveTextPoint_SetLeading},
- {FXBSTR_ID('T', 'J', 0, 0), &CPDF_StreamContentParser::Handle_ShowText_Positioning},
- {FXBSTR_ID('T', 'L', 0, 0), &CPDF_StreamContentParser::Handle_SetTextLeading},
- {FXBSTR_ID('T', 'c', 0, 0), &CPDF_StreamContentParser::Handle_SetCharSpace},
- {FXBSTR_ID('T', 'd', 0, 0), &CPDF_StreamContentParser::Handle_MoveTextPoint},
- {FXBSTR_ID('T', 'f', 0, 0), &CPDF_StreamContentParser::Handle_SetFont},
- {FXBSTR_ID('T', 'j', 0, 0), &CPDF_StreamContentParser::Handle_ShowText},
- {FXBSTR_ID('T', 'm', 0, 0), &CPDF_StreamContentParser::Handle_SetTextMatrix},
- {FXBSTR_ID('T', 'r', 0, 0), &CPDF_StreamContentParser::Handle_SetTextRenderMode},
- {FXBSTR_ID('T', 's', 0, 0), &CPDF_StreamContentParser::Handle_SetTextRise},
- {FXBSTR_ID('T', 'w', 0, 0), &CPDF_StreamContentParser::Handle_SetWordSpace},
- {FXBSTR_ID('T', 'z', 0, 0), &CPDF_StreamContentParser::Handle_SetHorzScale},
- {FXBSTR_ID('W', 0, 0, 0), &CPDF_StreamContentParser::Handle_Clip},
- {FXBSTR_ID('W', '*', 0, 0), &CPDF_StreamContentParser::Handle_EOClip},
- {FXBSTR_ID('b', 0, 0, 0), &CPDF_StreamContentParser::Handle_CloseFillStrokePath},
- {FXBSTR_ID('b', '*', 0, 0), &CPDF_StreamContentParser::Handle_CloseEOFillStrokePath},
- {FXBSTR_ID('c', 0, 0, 0), &CPDF_StreamContentParser::Handle_CurveTo_123},
- {FXBSTR_ID('c', 'm', 0, 0), &CPDF_StreamContentParser::Handle_ConcatMatrix},
- {FXBSTR_ID('c', 's', 0, 0), &CPDF_StreamContentParser::Handle_SetColorSpace_Fill},
- {FXBSTR_ID('d', 0, 0, 0), &CPDF_StreamContentParser::Handle_SetDash},
- {FXBSTR_ID('d', '0', 0, 0), &CPDF_StreamContentParser::Handle_SetCharWidth},
- {FXBSTR_ID('d', '1', 0, 0), &CPDF_StreamContentParser::Handle_SetCachedDevice},
- {FXBSTR_ID('f', 0, 0, 0), &CPDF_StreamContentParser::Handle_FillPath},
- {FXBSTR_ID('f', '*', 0, 0), &CPDF_StreamContentParser::Handle_EOFillPath},
- {FXBSTR_ID('g', 0, 0, 0), &CPDF_StreamContentParser::Handle_SetGray_Fill},
- {FXBSTR_ID('g', 's', 0, 0), &CPDF_StreamContentParser::Handle_SetExtendGraphState},
- {FXBSTR_ID('h', 0, 0, 0), &CPDF_StreamContentParser::Handle_ClosePath},
- {FXBSTR_ID('i', 0, 0, 0), &CPDF_StreamContentParser::Handle_SetFlat},
- {FXBSTR_ID('j', 0, 0, 0), &CPDF_StreamContentParser::Handle_SetLineJoin},
- {FXBSTR_ID('k', 0, 0, 0), &CPDF_StreamContentParser::Handle_SetCMYKColor_Fill},
- {FXBSTR_ID('l', 0, 0, 0), &CPDF_StreamContentParser::Handle_LineTo},
- {FXBSTR_ID('m', 0, 0, 0), &CPDF_StreamContentParser::Handle_MoveTo},
- {FXBSTR_ID('n', 0, 0, 0), &CPDF_StreamContentParser::Handle_EndPath},
- {FXBSTR_ID('q', 0, 0, 0), &CPDF_StreamContentParser::Handle_SaveGraphState},
- {FXBSTR_ID('r', 'e', 0, 0), &CPDF_StreamContentParser::Handle_Rectangle},
- {FXBSTR_ID('r', 'g', 0, 0), &CPDF_StreamContentParser::Handle_SetRGBColor_Fill},
- {FXBSTR_ID('r', 'i', 0, 0), &CPDF_StreamContentParser::Handle_SetRenderIntent},
- {FXBSTR_ID('s', 0, 0, 0), &CPDF_StreamContentParser::Handle_CloseStrokePath},
- {FXBSTR_ID('s', 'c', 0, 0), &CPDF_StreamContentParser::Handle_SetColor_Fill},
- {FXBSTR_ID('s', 'c', 'n', 0), &CPDF_StreamContentParser::Handle_SetColorPS_Fill},
- {FXBSTR_ID('s', 'h', 0, 0), &CPDF_StreamContentParser::Handle_ShadeFill},
- {FXBSTR_ID('v', 0, 0, 0), &CPDF_StreamContentParser::Handle_CurveTo_23},
- {FXBSTR_ID('w', 0, 0, 0), &CPDF_StreamContentParser::Handle_SetLineWidth},
- {FXBSTR_ID('y', 0, 0, 0), &CPDF_StreamContentParser::Handle_CurveTo_13},
-};
-FX_BOOL CPDF_StreamContentParser::OnOperator(FX_LPCSTR op)
-{
- int i = 0;
- FX_DWORD opid = 0;
- while (i < 4 && op[i]) {
- opid = (opid << 8) + op[i];
- i ++;
- }
- while (i < 4) {
- opid <<= 8;
- i ++;
- };
- int low = 0, high = sizeof g_OpCodes / sizeof(struct _OpCode) - 1;
- while (low <= high) {
- int middle = (low + high) / 2;
- int compare = opid - g_OpCodes[middle].m_OpId;
- if (compare == 0) {
- (this->*g_OpCodes[middle].m_OpHandler)();
- return TRUE;
- } else if (compare < 0) {
- high = middle - 1;
- } else {
- low = middle + 1;
- }
- }
- return m_CompatCount != 0;
-}
-void CPDF_StreamContentParser::Handle_CloseFillStrokePath()
-{
- if (m_Options.m_bTextOnly) {
- return;
- }
- Handle_ClosePath();
- AddPathObject(FXFILL_WINDING, TRUE);
-}
-void CPDF_StreamContentParser::Handle_FillStrokePath()
-{
- if (m_Options.m_bTextOnly) {
- return;
- }
- AddPathObject(FXFILL_WINDING, TRUE);
-}
-void CPDF_StreamContentParser::Handle_CloseEOFillStrokePath()
-{
- if (m_Options.m_bTextOnly) {
- return;
- }
- AddPathPoint(m_PathStartX, m_PathStartY, FXPT_LINETO | FXPT_CLOSEFIGURE);
- AddPathObject(FXFILL_ALTERNATE, TRUE);
-}
-void CPDF_StreamContentParser::Handle_EOFillStrokePath()
-{
- if (m_Options.m_bTextOnly) {
- return;
- }
- AddPathObject(FXFILL_ALTERNATE, TRUE);
-}
-void CPDF_StreamContentParser::Handle_BeginMarkedContent_Dictionary()
-{
- if (!m_Options.m_bMarkedContent) {
- return;
- }
- CFX_ByteString tag = GetString(1);
- CPDF_Object* pProperty = GetObject(0);
- if (pProperty == NULL) {
- return;
- }
- FX_BOOL bDirect = TRUE;
- if (pProperty->GetType() == PDFOBJ_NAME) {
- pProperty = FindResourceObj(FX_BSTRC("Properties"), pProperty->GetString());
- if (pProperty == NULL) {
- return;
- }
- bDirect = FALSE;
- }
- if (pProperty->GetType() != PDFOBJ_DICTIONARY) {
- return;
- }
- m_CurContentMark.GetModify()->AddMark(tag, (CPDF_Dictionary*)pProperty, bDirect);
-}
-void CPDF_StreamContentParser::Handle_BeginMarkedContent()
-{
- if (!m_Options.m_bMarkedContent) {
- return;
- }
- CFX_ByteString tag = GetString(0);
- m_CurContentMark.GetModify()->AddMark(tag, NULL, FALSE);
-}
-struct _FX_BSTR {
- FX_LPCSTR m_Ptr;
- int m_Size;
-};
-#define _FX_BSTRC(str) {str, sizeof(str)-1}
-const _FX_BSTR _PDF_InlineKeyAbbr[] = {
- _FX_BSTRC("BitsPerComponent"), _FX_BSTRC("BPC"),
- _FX_BSTRC("ColorSpace"), _FX_BSTRC("CS"),
- _FX_BSTRC("Decode"), _FX_BSTRC("D"),
- _FX_BSTRC("DecodeParms"), _FX_BSTRC("DP"),
- _FX_BSTRC("Filter"), _FX_BSTRC("F"),
- _FX_BSTRC("Height"), _FX_BSTRC("H"),
- _FX_BSTRC("ImageMask"), _FX_BSTRC("IM"),
- _FX_BSTRC("Interpolate"), _FX_BSTRC("I"),
- _FX_BSTRC("Width"), _FX_BSTRC("W"),
-};
-const _FX_BSTR _PDF_InlineValueAbbr[] = {
- _FX_BSTRC("DeviceGray"), _FX_BSTRC("G"),
- _FX_BSTRC("DeviceRGB"), _FX_BSTRC("RGB"),
- _FX_BSTRC("DeviceCMYK"), _FX_BSTRC("CMYK"),
- _FX_BSTRC("Indexed"), _FX_BSTRC("I"),
- _FX_BSTRC("ASCIIHexDecode"), _FX_BSTRC("AHx"),
- _FX_BSTRC("ASCII85Decode"), _FX_BSTRC("A85"),
- _FX_BSTRC("LZWDecode"), _FX_BSTRC("LZW"),
- _FX_BSTRC("FlateDecode"), _FX_BSTRC("Fl"),
- _FX_BSTRC("RunLengthDecode"), _FX_BSTRC("RL"),
- _FX_BSTRC("CCITTFaxDecode"), _FX_BSTRC("CCF"),
- _FX_BSTRC("DCTDecode"), _FX_BSTRC("DCT"),
-};
-static CFX_ByteStringC _PDF_FindFullName(const _FX_BSTR* table, int count, FX_BSTR abbr)
-{
- int i = 0;
- while (i < count) {
- if (abbr.GetLength() == table[i + 1].m_Size && FXSYS_memcmp32(abbr.GetPtr(), table[i + 1].m_Ptr, abbr.GetLength()) == 0) {
- return CFX_ByteStringC(table[i].m_Ptr, table[i].m_Size);
- }
- i += 2;
- }
- return CFX_ByteStringC();
-}
-void _PDF_ReplaceAbbr(CPDF_Object* pObj)
-{
- switch (pObj->GetType()) {
- case PDFOBJ_DICTIONARY: {
- CPDF_Dictionary* pDict = (CPDF_Dictionary*)pObj;
- FX_POSITION pos = pDict->GetStartPos();
- while (pos) {
- CFX_ByteString key;
- CPDF_Object* value = pDict->GetNextElement(pos, key);
- CFX_ByteStringC fullname = _PDF_FindFullName(_PDF_InlineKeyAbbr,
- sizeof _PDF_InlineKeyAbbr / sizeof(_FX_BSTR), key);
- if (!fullname.IsEmpty()) {
- pDict->ReplaceKey(key, fullname);
- key = fullname;
- }
- if (value->GetType() == PDFOBJ_NAME) {
- CFX_ByteString name = value->GetString();
- fullname = _PDF_FindFullName(_PDF_InlineValueAbbr,
- sizeof _PDF_InlineValueAbbr / sizeof(_FX_BSTR), name);
- if (!fullname.IsEmpty()) {
- pDict->SetAtName(key, fullname);
- }
- } else {
- _PDF_ReplaceAbbr(value);
- }
- }
- break;
- }
- case PDFOBJ_ARRAY: {
- CPDF_Array* pArray = (CPDF_Array*)pObj;
- for (FX_DWORD i = 0; i < pArray->GetCount(); i ++) {
- CPDF_Object* pElement = pArray->GetElement(i);
- if (pElement->GetType() == PDFOBJ_NAME) {
- CFX_ByteString name = pElement->GetString();
- CFX_ByteStringC fullname = _PDF_FindFullName(_PDF_InlineValueAbbr,
- sizeof _PDF_InlineValueAbbr / sizeof(_FX_BSTR), name);
- if (!fullname.IsEmpty()) {
- pArray->SetAt(i, CPDF_Name::Create(fullname));
- }
- } else {
- _PDF_ReplaceAbbr(pElement);
- }
- }
- break;
- }
- }
-}
-static CFX_ByteStringC _PDF_FindAbbrName(const _FX_BSTR* table, int count, FX_BSTR fullName)
-{
- int i = 0;
- while (i < count) {
- if (fullName.GetLength() == table[i].m_Size && FXSYS_memcmp32(fullName.GetPtr(), table[i].m_Ptr, fullName.GetLength()) == 0) {
- return CFX_ByteStringC(table[i + 1].m_Ptr, table[i + 1].m_Size);
- }
- i += 2;
- }
- return CFX_ByteStringC();
-}
-void _PDF_ReplaceFull(CPDF_Object* pObj)
-{
- switch (pObj->GetType()) {
- case PDFOBJ_DICTIONARY: {
- CPDF_Dictionary* pDict = (CPDF_Dictionary*)pObj;
- FX_POSITION pos = pDict->GetStartPos();
- while (pos) {
- CFX_ByteString key;
- CPDF_Object* value = pDict->GetNextElement(pos, key);
- CFX_ByteStringC abbrName = _PDF_FindAbbrName(_PDF_InlineKeyAbbr,
- sizeof(_PDF_InlineKeyAbbr) / sizeof(_FX_BSTR), key);
- if (!abbrName.IsEmpty()) {
- pDict->ReplaceKey(key, abbrName);
- key = abbrName;
- }
- if (value->GetType() == PDFOBJ_NAME) {
- CFX_ByteString name = value->GetString();
- abbrName = _PDF_FindAbbrName(_PDF_InlineValueAbbr,
- sizeof(_PDF_InlineValueAbbr) / sizeof(_FX_BSTR), name);
- if (!abbrName.IsEmpty()) {
- pDict->SetAtName(key, abbrName);
- }
- } else {
- _PDF_ReplaceFull(value);
- }
- }
- break;
- }
- case PDFOBJ_ARRAY: {
- CPDF_Array* pArray = (CPDF_Array*)pObj;
- for (FX_DWORD i = 0; i < pArray->GetCount(); i ++) {
- CPDF_Object* pElement = pArray->GetElement(i);
- if (pElement->GetType() == PDFOBJ_NAME) {
- CFX_ByteString name = pElement->GetString();
- CFX_ByteStringC abbrName = _PDF_FindAbbrName(_PDF_InlineValueAbbr,
- sizeof _PDF_InlineValueAbbr / sizeof(_FX_BSTR), name);
- if (!abbrName.IsEmpty()) {
- pArray->SetAt(i, CPDF_Name::Create(abbrName));
- }
- } else {
- _PDF_ReplaceFull(pElement);
- }
- }
- break;
- }
- }
-}
-void CPDF_StreamContentParser::Handle_BeginText()
-{
- m_pCurStates->m_TextMatrix.Set(1.0f, 0, 0, 1.0f, 0, 0);
- OnChangeTextMatrix();
- m_pCurStates->m_TextX = 0;
- m_pCurStates->m_TextY = 0;
- m_pCurStates->m_TextLineX = 0;
- m_pCurStates->m_TextLineY = 0;
-}
-void CPDF_StreamContentParser::Handle_BeginSectionUndefined()
-{
- m_CompatCount ++;
-}
-void CPDF_StreamContentParser::Handle_CurveTo_123()
-{
- if (m_Options.m_bTextOnly) {
- return;
- }
- AddPathPoint(GetNumber(5), GetNumber(4), FXPT_BEZIERTO);
- AddPathPoint(GetNumber(3), GetNumber(2), FXPT_BEZIERTO);
- AddPathPoint(GetNumber(1), GetNumber(0), FXPT_BEZIERTO);
-}
-void CPDF_StreamContentParser::Handle_ConcatMatrix()
-{
- FX_FLOAT a2 = GetNumber16(5), b2 = GetNumber16(4), c2 = GetNumber16(3), d2 = GetNumber16(2);
- FX_FLOAT e2 = GetNumber(1), f2 = GetNumber(0);
- FX_FLOAT old_width_scale = m_pCurStates->m_CTM.GetXUnit();
- CFX_AffineMatrix new_matrix(a2, b2, c2, d2, e2, f2);
- new_matrix.Concat(m_pCurStates->m_CTM);
- m_pCurStates->m_CTM = new_matrix;
- FX_FLOAT new_width_scale = m_pCurStates->m_CTM.GetXUnit();
- OnChangeTextMatrix();
-}
-void CPDF_StreamContentParser::Handle_SetColorSpace_Fill()
-{
- if (m_Options.m_bTextOnly) {
- return;
- }
- CFX_ByteString csname = GetString(0);
- CPDF_ColorSpace* pCS = FindColorSpace(csname);
- if (pCS == NULL) {
- return;
- }
- m_pCurStates->m_ColorState.GetModify()->m_FillColor.SetColorSpace(pCS);
-}
-void CPDF_StreamContentParser::Handle_SetColorSpace_Stroke()
-{
- if (m_Options.m_bTextOnly) {
- return;
- }
- CFX_ByteString csname = GetString(0);
- CPDF_ColorSpace* pCS = FindColorSpace(csname);
- if (pCS == NULL) {
- return;
- }
- m_pCurStates->m_ColorState.GetModify()->m_StrokeColor.SetColorSpace(pCS);
-}
-void CPDF_StreamContentParser::Handle_SetDash()
-{
- if (m_Options.m_bTextOnly) {
- return;
- }
- CPDF_Array* pArray = GetObject(1)->GetArray();
- if (pArray == NULL) {
- return;
- }
- m_pCurStates->SetLineDash(pArray, GetNumber(0), 1.0f);
-}
-void CPDF_StreamContentParser::Handle_SetCharWidth()
-{
- m_Type3Data[0] = GetNumber(1);
- m_Type3Data[1] = GetNumber(0);
- m_bColored = TRUE;
-}
-void CPDF_StreamContentParser::Handle_SetCachedDevice()
-{
- for (int i = 0; i < 6; i ++) {
- m_Type3Data[i] = GetNumber(5 - i);
- }
- m_bColored = FALSE;
-}
-void CPDF_StreamContentParser::Handle_ExecuteXObject()
-{
- CFX_ByteString name = GetString(0);
- if (name == m_LastImageName && m_pLastImage && m_pLastImage->GetStream() && m_pLastImage->GetStream()->GetObjNum()) {
-#if defined(_FPDFAPI_MINI_) && !defined(_FXCORE_FEATURE_ALL_)
- AddDuplicateImage();
-#else
- AddImage(NULL, m_pLastImage, FALSE);
-#endif
- return;
- }
- if (m_Options.m_bTextOnly) {
- CPDF_Object* pRes = NULL;
- if (m_pResources == NULL) {
- return;
- }
- if (m_pResources == m_pPageResources) {
- CPDF_Dictionary* pList = m_pResources->GetDict(FX_BSTRC("XObject"));
- if (pList == NULL) {
- return;
- }
- pRes = pList->GetElement(name);
- if (pRes == NULL || pRes->GetType() != PDFOBJ_REFERENCE) {
- return;
- }
- } else {
- CPDF_Dictionary* pList = m_pResources->GetDict(FX_BSTRC("XObject"));
- if (pList == NULL) {
- if (m_pPageResources == NULL) {
- return;
- }
- CPDF_Dictionary* pList = m_pPageResources->GetDict(FX_BSTRC("XObject"));
- if (pList == NULL) {
- return;
- }
- pRes = pList->GetElement(name);
- if (pRes == NULL || pRes->GetType() != PDFOBJ_REFERENCE) {
- return;
- }
- } else {
- pRes = pList->GetElement(name);
- if (pRes == NULL || pRes->GetType() != PDFOBJ_REFERENCE) {
- return;
- }
- }
- }
- FX_BOOL bForm;
- if (m_pDocument->IsFormStream(((CPDF_Reference*)pRes)->GetRefObjNum(), bForm) && !bForm) {
- return;
- }
- }
- CPDF_Stream* pXObject = (CPDF_Stream*)FindResourceObj(FX_BSTRC("XObject"), name);
- if (pXObject == NULL || pXObject->GetType() != PDFOBJ_STREAM) {
- m_bResourceMissing = TRUE;
- return;
- }
- CFX_ByteStringC type = pXObject->GetDict()->GetConstString(FX_BSTRC("Subtype"));
- if (type == FX_BSTRC("Image")) {
- if (m_Options.m_bTextOnly) {
- return;
- }
- CPDF_ImageObject* pObj = AddImage(pXObject, NULL, FALSE);
- m_LastImageName = name;
- m_pLastImage = pObj->m_pImage;
- } else if (type == FX_BSTRC("Form")) {
- AddForm(pXObject);
- } else {
- return;
- }
-}
-void CPDF_StreamContentParser::AddForm(CPDF_Stream* pStream)
-{
-#if !defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_)
- if (!m_Options.m_bSeparateForm) {
- CPDF_Dictionary* pResources = pStream->GetDict()->GetDict(FX_BSTRC("Resources"));
- CFX_AffineMatrix form_matrix = pStream->GetDict()->GetMatrix(FX_BSTRC("Matrix"));
- form_matrix.Concat(m_pCurStates->m_CTM);
- CPDF_Array* pBBox = pStream->GetDict()->GetArray(FX_BSTRC("BBox"));
- CFX_FloatRect form_bbox;
- CPDF_Path ClipPath;
- if (pBBox) {
- form_bbox = pStream->GetDict()->GetRect(FX_BSTRC("BBox"));
- ClipPath.New();
- ClipPath.AppendRect(form_bbox.left, form_bbox.bottom, form_bbox.right, form_bbox.top);
- ClipPath.Transform(&form_matrix);
- form_bbox.Transform(&form_matrix);
- }
- CPDF_StreamContentParser parser;
- parser.Initialize();
- parser.PrepareParse(m_pDocument, m_pPageResources, m_pResources, &m_mtContentToUser,
- m_pObjectList, pResources, &form_bbox, &m_Options, m_pCurStates, m_Level + 1);
- parser.m_pCurStates->m_CTM = form_matrix;
- if (ClipPath.NotNull()) {
- parser.m_pCurStates->m_ClipPath.AppendPath(ClipPath, FXFILL_WINDING, TRUE);
- }
- CPDF_StreamAcc stream;
- stream.LoadAllData(pStream, FALSE);
- if (stream.GetSize() == 0) {
- return;
- }
-#ifdef _FPDFAPI_MINI_
- parser.InputData(stream.GetData(), stream.GetSize());
- parser.Finish();
-#else
- parser.Parse(stream.GetData(), stream.GetSize(), 0);
-#endif
- return;
- }
-#endif
- CPDF_FormObject* pFormObj = FX_NEW CPDF_FormObject;
- pFormObj->m_pForm = FX_NEW CPDF_Form(m_pDocument, m_pPageResources, pStream, m_pResources);
- pFormObj->m_FormMatrix = m_pCurStates->m_CTM;
- pFormObj->m_FormMatrix.Concat(m_mtContentToUser);
- CPDF_AllStates status;
- status.m_GeneralState = m_pCurStates->m_GeneralState;
- status.m_GraphState = m_pCurStates->m_GraphState;
- status.m_ColorState = m_pCurStates->m_ColorState;
- status.m_TextState = m_pCurStates->m_TextState;
- pFormObj->m_pForm->ParseContent(&status, NULL, NULL, &m_Options, m_Level + 1);
- if (!m_pObjectList->m_bBackgroundAlphaNeeded && pFormObj->m_pForm->m_bBackgroundAlphaNeeded) {
- m_pObjectList->m_bBackgroundAlphaNeeded = TRUE;
- }
- pFormObj->CalcBoundingBox();
- SetGraphicStates(pFormObj, TRUE, TRUE, TRUE);
- m_pObjectList->m_ObjectList.AddTail(pFormObj);
-}
-#if defined(_FPDFAPI_MINI_) && !defined(_FXCORE_FEATURE_ALL_)
-void CPDF_StreamContentParser::AddDuplicateImage()
-{
- FX_POSITION tailpos = m_pObjectList->m_ObjectList.GetTailPosition();
- CPDF_PageObject* pLastObj = (CPDF_PageObject*)m_pObjectList->m_ObjectList.GetAt(tailpos);
- if (pLastObj == NULL || (pLastObj->m_Type != PDFPAGE_INLINES && pLastObj->m_Type != PDFPAGE_IMAGE)) {
- AddImage(NULL, m_pLastImage, FALSE);
- return;
- }
- if (pLastObj->m_GeneralState != m_pCurStates->m_GeneralState ||
- pLastObj->m_ClipPath != m_pCurStates->m_ClipPath ||
- pLastObj->m_ColorState != m_pCurStates->m_ColorState) {
- AddImage(NULL, m_pLastImage, FALSE);
- return;
- }
- CFX_AffineMatrix ImageMatrix;
- ImageMatrix.Copy(m_pCurStates->m_CTM);
- ImageMatrix.Concat(m_mtContentToUser);
- if (pLastObj->m_Type == PDFPAGE_INLINES) {
- CPDF_InlineImages* pInlines = (CPDF_InlineImages*)pLastObj;
- if (pInlines->m_pStream != m_pLastImage->GetStream()) {
- AddImage(NULL, m_pLastImage, FALSE);
- return;
- }
- pInlines->AddMatrix(ImageMatrix);
- } else {
- CPDF_ImageObject* pImageObj = (CPDF_ImageObject*)pLastObj;
- CPDF_InlineImages* pInlines = FX_NEW CPDF_InlineImages;
- pInlines->m_pStream = m_pLastImage->GetStream();
- SetGraphicStates(pInlines, !pInlines->m_pStream->GetDict()->KeyExist(FX_BSTRC("ColorSpace")), FALSE, FALSE);
- pInlines->AddMatrix(pImageObj->m_Matrix);
- pInlines->AddMatrix(ImageMatrix);
- m_pObjectList->m_ObjectList.RemoveAt(tailpos);
- m_pObjectList->m_ObjectList.AddTail(pInlines);
- pLastObj->Release();
- }
-}
-#endif
-CPDF_ImageObject* CPDF_StreamContentParser::AddImage(CPDF_Stream* pStream, CPDF_Image* pImage, FX_BOOL bInline)
-{
- if (pStream == NULL && pImage == NULL) {
- return NULL;
- }
- CFX_AffineMatrix ImageMatrix;
- ImageMatrix.Copy(m_pCurStates->m_CTM);
- ImageMatrix.Concat(m_mtContentToUser);
- CPDF_ImageObject* pImageObj = FX_NEW CPDF_ImageObject;
- if (pImage) {
- pImageObj->m_pImage = m_pDocument->GetPageData()->GetImage(pImage->GetStream());
- } else if (pStream->GetObjNum()) {
- pImageObj->m_pImage = m_pDocument->LoadImageF(pStream);
- } else {
- pImageObj->m_pImage = FX_NEW CPDF_Image(m_pDocument);
- pImageObj->m_pImage->LoadImageF(pStream, bInline);
- }
- SetGraphicStates(pImageObj, pImageObj->m_pImage->IsMask(), FALSE, FALSE);
- pImageObj->m_Matrix = ImageMatrix;
- pImageObj->CalcBoundingBox();
- m_pObjectList->m_ObjectList.AddTail(pImageObj);
- return pImageObj;
-}
-void CPDF_StreamContentParser::Handle_MarkPlace_Dictionary()
-{
-}
-void CPDF_StreamContentParser::Handle_EndImage()
-{
-}
-void CPDF_StreamContentParser::Handle_EndMarkedContent()
-{
- if (!m_Options.m_bMarkedContent) {
- return;
- }
- if (m_CurContentMark.IsNull()) {
- return;
- }
- int count = m_CurContentMark.GetObject()->CountItems();
- if (count == 1) {
- m_CurContentMark.SetNull();
- return;
- }
- m_CurContentMark.GetModify()->DeleteLastMark();
-}
-void CPDF_StreamContentParser::Handle_EndText()
-{
- int count = m_ClipTextList.GetSize();
- if (count == 0) {
- return;
- }
- if (m_pCurStates->m_TextState.GetObject()->m_TextMode < 4) {
- for (int i = 0; i < count; i ++) {
- CPDF_TextObject* pText = (CPDF_TextObject*)m_ClipTextList.GetAt(i);
- if (pText) {
- delete pText;
- }
- }
- } else {
- m_pCurStates->m_ClipPath.AppendTexts((CPDF_TextObject**)m_ClipTextList.GetData(), count);
- }
- m_ClipTextList.RemoveAll();
-}
-void CPDF_StreamContentParser::Handle_EndSectionUndefined()
-{
- if (m_CompatCount) {
- m_CompatCount --;
- }
-}
-void CPDF_StreamContentParser::Handle_FillPath()
-{
- if (m_Options.m_bTextOnly) {
- return;
- }
- AddPathObject(FXFILL_WINDING, FALSE);
-}
-void CPDF_StreamContentParser::Handle_FillPathOld()
-{
- if (m_Options.m_bTextOnly) {
- return;
- }
- AddPathObject(FXFILL_WINDING, FALSE);
-}
-void CPDF_StreamContentParser::Handle_EOFillPath()
-{
- if (m_Options.m_bTextOnly) {
- return;
- }
- AddPathObject(FXFILL_ALTERNATE, FALSE);
-}
-void CPDF_StreamContentParser::Handle_SetGray_Fill()
-{
- FX_FLOAT value = GetNumber(0);
- CPDF_ColorSpace* pCS = CPDF_ColorSpace::GetStockCS(PDFCS_DEVICEGRAY);
- m_pCurStates->m_ColorState.SetFillColor(pCS, &value, 1);
-}
-void CPDF_StreamContentParser::Handle_SetGray_Stroke()
-{
- FX_FLOAT value = GetNumber(0);
- CPDF_ColorSpace* pCS = CPDF_ColorSpace::GetStockCS(PDFCS_DEVICEGRAY);
- m_pCurStates->m_ColorState.SetStrokeColor(pCS, &value, 1);
-}
-void CPDF_StreamContentParser::Handle_SetExtendGraphState()
-{
- CFX_ByteString name = GetString(0);
- CPDF_Dictionary* pGS = (CPDF_Dictionary*)FindResourceObj(FX_BSTRC("ExtGState"), name);
- if (pGS == NULL || pGS->GetType() != PDFOBJ_DICTIONARY) {
- m_bResourceMissing = TRUE;
- return;
- }
- m_pCurStates->ProcessExtGS(pGS, this);
-}
-void CPDF_StreamContentParser::Handle_ClosePath()
-{
- if (m_Options.m_bTextOnly) {
- return;
- }
- if (m_PathPointCount == 0) {
- return;
- }
- if (m_PathStartX != m_PathCurrentX || m_PathStartY != m_PathCurrentY) {
- AddPathPoint(m_PathStartX, m_PathStartY, FXPT_LINETO | FXPT_CLOSEFIGURE);
- } else if (m_pPathPoints[m_PathPointCount - 1].m_Flag != FXPT_MOVETO) {
- m_pPathPoints[m_PathPointCount - 1].m_Flag |= FXPT_CLOSEFIGURE;
- }
-}
-void CPDF_StreamContentParser::Handle_SetFlat()
-{
-#if !defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_)
- m_pCurStates->m_GeneralState.GetModify()->m_Flatness = GetNumber(0);
-#endif
-}
-void CPDF_StreamContentParser::Handle_BeginImageData()
-{
-}
-void CPDF_StreamContentParser::Handle_SetLineJoin()
-{
- m_pCurStates->m_GraphState.GetModify()->m_LineJoin = (CFX_GraphStateData::LineJoin)GetInteger(0);
-}
-void CPDF_StreamContentParser::Handle_SetLineCap()
-{
- m_pCurStates->m_GraphState.GetModify()->m_LineCap = (CFX_GraphStateData::LineCap)GetInteger(0);
-}
-void CPDF_StreamContentParser::Handle_SetCMYKColor_Fill()
-{
- REQUIRE_PARAMS(4);
- FX_FLOAT values[4];
- for (int i = 0; i < 4; i ++) {
- values[i] = GetNumber(3 - i);
- }
- CPDF_ColorSpace* pCS = CPDF_ColorSpace::GetStockCS(PDFCS_DEVICECMYK);
- m_pCurStates->m_ColorState.SetFillColor(pCS, values, 4);
-}
-void CPDF_StreamContentParser::Handle_SetCMYKColor_Stroke()
-{
- REQUIRE_PARAMS(4);
- FX_FLOAT values[4];
- for (int i = 0; i < 4; i ++) {
- values[i] = GetNumber(3 - i);
- }
- CPDF_ColorSpace* pCS = CPDF_ColorSpace::GetStockCS(PDFCS_DEVICECMYK);
- m_pCurStates->m_ColorState.SetStrokeColor(pCS, values, 4);
-}
-void CPDF_StreamContentParser::Handle_LineTo()
-{
- REQUIRE_PARAMS(2);
- if (m_Options.m_bTextOnly) {
- return;
- }
- AddPathPoint(GetNumber(1), GetNumber(0), FXPT_LINETO);
-}
-void CPDF_StreamContentParser::Handle_MoveTo()
-{
- REQUIRE_PARAMS(2);
- if (m_Options.m_bTextOnly) {
-#ifndef _FPDFAPI_MINI_
- m_pSyntax->SkipPathObject();
-#endif
- return;
- }
- AddPathPoint(GetNumber(1), GetNumber(0), FXPT_MOVETO);
-#ifndef _FPDFAPI_MINI_
- ParsePathObject();
-#endif
-}
-void CPDF_StreamContentParser::Handle_SetMiterLimit()
-{
- m_pCurStates->m_GraphState.GetModify()->m_MiterLimit = GetNumber(0);
-}
-void CPDF_StreamContentParser::Handle_MarkPlace()
-{
-}
-void CPDF_StreamContentParser::Handle_EndPath()
-{
- if (m_Options.m_bTextOnly) {
- return;
- }
- AddPathObject(0, FALSE);
-}
-void CPDF_StreamContentParser::Handle_SaveGraphState()
-{
- CPDF_AllStates* pStates = FX_NEW CPDF_AllStates;
- pStates->Copy(*m_pCurStates);
- m_StateStack.Add(pStates);
-}
-void CPDF_StreamContentParser::Handle_RestoreGraphState()
-{
- int size = m_StateStack.GetSize();
- if (size == 0) {
- return;
- }
- CPDF_AllStates* pStates = (CPDF_AllStates*)m_StateStack.GetAt(size - 1);
- m_pCurStates->Copy(*pStates);
- delete pStates;
- m_StateStack.RemoveAt(size - 1);
-}
-void CPDF_StreamContentParser::Handle_Rectangle()
-{
- if (m_Options.m_bTextOnly) {
- return;
- }
- FX_FLOAT x = GetNumber(3), y = GetNumber(2);
- FX_FLOAT w = GetNumber(1), h = GetNumber(0);
- AddPathRect(x, y, w, h);
-}
-void CPDF_StreamContentParser::AddPathRect(FX_FLOAT x, FX_FLOAT y, FX_FLOAT w, FX_FLOAT h)
-{
- AddPathPoint(x, y, FXPT_MOVETO);
- AddPathPoint(x + w, y, FXPT_LINETO);
- AddPathPoint(x + w, y + h, FXPT_LINETO);
- AddPathPoint(x, y + h, FXPT_LINETO);
- AddPathPoint(x, y, FXPT_LINETO | FXPT_CLOSEFIGURE);
-}
-void CPDF_StreamContentParser::Handle_SetRGBColor_Fill()
-{
- REQUIRE_PARAMS(3);
- FX_FLOAT values[3];
- for (int i = 0; i < 3; i ++) {
- values[i] = GetNumber(2 - i);
- }
- CPDF_ColorSpace* pCS = CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB);
- m_pCurStates->m_ColorState.SetFillColor(pCS, values, 3);
-}
-void CPDF_StreamContentParser::Handle_SetRGBColor_Stroke()
-{
- REQUIRE_PARAMS(3);
- FX_FLOAT values[3];
- for (int i = 0; i < 3; i ++) {
- values[i] = GetNumber(2 - i);
- }
- CPDF_ColorSpace* pCS = CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB);
- m_pCurStates->m_ColorState.SetStrokeColor(pCS, values, 3);
-}
-void CPDF_StreamContentParser::Handle_SetRenderIntent()
-{
-}
-void CPDF_StreamContentParser::Handle_CloseStrokePath()
-{
- if (m_Options.m_bTextOnly) {
- return;
- }
- Handle_ClosePath();
- AddPathObject(0, TRUE);
-}
-void CPDF_StreamContentParser::Handle_StrokePath()
-{
- if (m_Options.m_bTextOnly) {
- return;
- }
- AddPathObject(0, TRUE);
-}
-void CPDF_StreamContentParser::Handle_SetColor_Fill()
-{
- if (m_Options.m_bTextOnly) {
- return;
- }
- FX_FLOAT values[4];
- int nargs = m_ParamCount;
- if (nargs > 4) {
- nargs = 4;
- }
- for (int i = 0; i < nargs; i ++) {
- values[i] = GetNumber(nargs - i - 1);
- }
- m_pCurStates->m_ColorState.SetFillColor(NULL, values, nargs);
-}
-void CPDF_StreamContentParser::Handle_SetColor_Stroke()
-{
- if (m_Options.m_bTextOnly) {
- return;
- }
- FX_FLOAT values[4];
- int nargs = m_ParamCount;
- if (nargs > 4) {
- nargs = 4;
- }
- for (int i = 0; i < nargs; i ++) {
- values[i] = GetNumber(nargs - i - 1);
- }
- m_pCurStates->m_ColorState.SetStrokeColor(NULL, values, nargs);
-}
-void CPDF_StreamContentParser::Handle_SetColorPS_Fill()
-{
- if (m_Options.m_bTextOnly) {
- return;
- }
- CPDF_Object* pLastParam = GetObject(0);
- if (pLastParam == NULL) {
- return;
- }
- int nargs = m_ParamCount;
- int nvalues = nargs;
- if (pLastParam->GetType() == PDFOBJ_NAME) {
- nvalues --;
- }
- FX_FLOAT* values = NULL;
- if (nvalues) {
- values = FX_Alloc(FX_FLOAT, nvalues);
- for (int i = 0; i < nvalues; i ++) {
- values[i] = GetNumber(nargs - i - 1);
- }
- }
- if (nvalues != nargs) {
- CPDF_Pattern* pPattern = FindPattern(GetString(0), FALSE);
- if (pPattern) {
- m_pCurStates->m_ColorState.SetFillPattern(pPattern, values, nvalues);
- }
- } else {
- m_pCurStates->m_ColorState.SetFillColor(NULL, values, nvalues);
- }
- if (values) {
- FX_Free(values);
- }
-}
-void CPDF_StreamContentParser::Handle_SetColorPS_Stroke()
-{
- if (m_Options.m_bTextOnly) {
- return;
- }
- CPDF_Object* pLastParam = GetObject(0);
- if (pLastParam == NULL) {
- return;
- }
- int nargs = m_ParamCount;
- int nvalues = nargs;
- if (pLastParam->GetType() == PDFOBJ_NAME) {
- nvalues --;
- }
- FX_FLOAT* values = NULL;
- if (nvalues) {
- values = FX_Alloc(FX_FLOAT, nvalues);
- for (int i = 0; i < nvalues; i ++) {
- values[i] = GetNumber(nargs - i - 1);
- }
- }
- if (nvalues != nargs) {
- CPDF_Pattern* pPattern = FindPattern(GetString(0), FALSE);
- if (pPattern) {
- m_pCurStates->m_ColorState.SetStrokePattern(pPattern, values, nvalues);
- }
- } else {
- m_pCurStates->m_ColorState.SetStrokeColor(NULL, values, nvalues);
- }
- if (values) {
- FX_Free(values);
- }
-}
-CFX_FloatRect _GetShadingBBox(CPDF_Stream* pStream, int type, const CFX_AffineMatrix* pMatrix,
- CPDF_Function** pFuncs, int nFuncs, CPDF_ColorSpace* pCS);
-void CPDF_StreamContentParser::Handle_ShadeFill()
-{
- if (m_Options.m_bTextOnly) {
- return;
- }
- CPDF_Pattern* pPattern = FindPattern(GetString(0), TRUE);
- if (pPattern == NULL) {
- return;
- }
- if (pPattern->m_PatternType != PATTERN_SHADING) {
- return;
- }
- CPDF_ShadingPattern* pShading = (CPDF_ShadingPattern*)pPattern;
- if (!pShading->m_bShadingObj) {
- return;
- }
- if (!pShading->Load()) {
- return;
- }
- CPDF_ShadingObject* pObj = FX_NEW CPDF_ShadingObject;
- pObj->m_pShading = pShading;
- SetGraphicStates(pObj, FALSE, FALSE, FALSE);
- pObj->m_Matrix = m_pCurStates->m_CTM;
- pObj->m_Matrix.Concat(m_mtContentToUser);
- CFX_FloatRect bbox;
- if (!pObj->m_ClipPath.IsNull()) {
- bbox = pObj->m_ClipPath.GetClipBox();
- } else {
- bbox = m_BBox;
- }
- if (pShading->m_ShadingType >= 4) {
- bbox.Intersect(_GetShadingBBox((CPDF_Stream*)pShading->m_pShadingObj, pShading->m_ShadingType, &pObj->m_Matrix,
- pShading->m_pFunctions, pShading->m_nFuncs, pShading->m_pCS));
- }
- pObj->m_Left = bbox.left;
- pObj->m_Right = bbox.right;
- pObj->m_Top = bbox.top;
- pObj->m_Bottom = bbox.bottom;
- m_pObjectList->m_ObjectList.AddTail(pObj);
-}
-void CPDF_StreamContentParser::Handle_SetCharSpace()
-{
- m_pCurStates->m_TextState.GetModify()->m_CharSpace = GetNumber(0);
-}
-void CPDF_StreamContentParser::Handle_MoveTextPoint()
-{
- m_pCurStates->m_TextLineX += GetNumber(1);
- m_pCurStates->m_TextLineY += GetNumber(0);
- m_pCurStates->m_TextX = m_pCurStates->m_TextLineX;
- m_pCurStates->m_TextY = m_pCurStates->m_TextLineY;
-}
-void CPDF_StreamContentParser::Handle_MoveTextPoint_SetLeading()
-{
- Handle_MoveTextPoint();
- m_pCurStates->m_TextLeading = -GetNumber(0);
-}
-void CPDF_StreamContentParser::Handle_SetFont()
-{
- FX_FLOAT fs = GetNumber(0);
- if (fs == 0) {
- fs = m_DefFontSize;
- }
- m_pCurStates->m_TextState.GetModify()->m_FontSize = fs;
- CPDF_Font* pFont = FindFont(GetString(1));
- if (pFont) {
- m_pCurStates->m_TextState.SetFont(pFont);
- }
-}
-CPDF_Object* CPDF_StreamContentParser::FindResourceObj(FX_BSTR type, const CFX_ByteString& name)
-{
- if (m_pResources == NULL) {
- return NULL;
- }
- if (m_pResources == m_pPageResources) {
- CPDF_Dictionary* pList = m_pResources->GetDict(type);
- if (pList == NULL) {
- return NULL;
- }
- CPDF_Object* pRes = pList->GetElementValue(name);
- return pRes;
- }
- CPDF_Dictionary* pList = m_pResources->GetDict(type);
- if (pList == NULL) {
- if (m_pPageResources == NULL) {
- return NULL;
- }
- CPDF_Dictionary* pList = m_pPageResources->GetDict(type);
- if (pList == NULL) {
- return NULL;
- }
- CPDF_Object* pRes = pList->GetElementValue(name);
- return pRes;
- }
- CPDF_Object* pRes = pList->GetElementValue(name);
- return pRes;
-}
-CPDF_Font* CPDF_StreamContentParser::FindFont(const CFX_ByteString& name)
-{
- CPDF_Dictionary* pFontDict = (CPDF_Dictionary*)FindResourceObj(FX_BSTRC("Font"), name);
- if (pFontDict == NULL || pFontDict->GetType() != PDFOBJ_DICTIONARY) {
- m_bResourceMissing = TRUE;
- return CPDF_Font::GetStockFont(m_pDocument, FX_BSTRC("Helvetica"));
- }
- CPDF_Font* pFont = m_pDocument->LoadFont(pFontDict);
- if (pFont && pFont->GetType3Font()) {
- pFont->GetType3Font()->SetPageResources(m_pResources);
- pFont->GetType3Font()->CheckType3FontMetrics();
- }
- return pFont;
-}
-CPDF_ColorSpace* CPDF_StreamContentParser::FindColorSpace(const CFX_ByteString& name)
-{
- if (name == FX_BSTRC("Pattern")) {
- return CPDF_ColorSpace::GetStockCS(PDFCS_PATTERN);
- }
- if (name == FX_BSTRC("DeviceGray") || name == FX_BSTRC("DeviceCMYK") || name == FX_BSTRC("DeviceRGB")) {
- CFX_ByteString defname = "Default";
- defname += name.Mid(7);
- CPDF_Object* pDefObj = FindResourceObj(FX_BSTRC("ColorSpace"), defname);
- if (pDefObj == NULL) {
- if (name == FX_BSTRC("DeviceGray")) {
- return CPDF_ColorSpace::GetStockCS(PDFCS_DEVICEGRAY);
- }
- if (name == FX_BSTRC("DeviceRGB")) {
- return CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB);
- }
- return CPDF_ColorSpace::GetStockCS(PDFCS_DEVICECMYK);
- }
- return m_pDocument->LoadColorSpace(pDefObj);
- }
- CPDF_Object* pCSObj = FindResourceObj(FX_BSTRC("ColorSpace"), name);
- if (pCSObj == NULL) {
- m_bResourceMissing = TRUE;
- return NULL;
- }
- return m_pDocument->LoadColorSpace(pCSObj);
-}
-CPDF_Pattern* CPDF_StreamContentParser::FindPattern(const CFX_ByteString& name, FX_BOOL bShading)
-{
- CPDF_Object* pPattern = FindResourceObj(bShading ? FX_BSTRC("Shading") : FX_BSTRC("Pattern"), name);
- if (pPattern == NULL || (pPattern->GetType() != PDFOBJ_DICTIONARY &&
- pPattern->GetType() != PDFOBJ_STREAM)) {
- m_bResourceMissing = TRUE;
- return NULL;
- }
- return m_pDocument->LoadPattern(pPattern, bShading, &m_pCurStates->m_ParentMatrix);
-}
-void CPDF_StreamContentParser::ConvertTextSpace(FX_FLOAT& x, FX_FLOAT& y)
-{
- m_pCurStates->m_TextMatrix.Transform(x, y, x, y);
- ConvertUserSpace(x, y);
-}
-void CPDF_StreamContentParser::ConvertUserSpace(FX_FLOAT& x, FX_FLOAT& y)
-{
- m_pCurStates->m_CTM.Transform(x, y, x, y);
- m_mtContentToUser.Transform(x, y, x, y);
-}
-void CPDF_StreamContentParser::AddTextObject(CFX_ByteString* pStrs, FX_FLOAT fInitKerning, FX_FLOAT* pKerning, int nsegs)
-{
- CPDF_Font* pFont = m_pCurStates->m_TextState.GetFont();
- if (pFont == NULL) {
- return;
- }
- if (fInitKerning != 0) {
- if (!pFont->IsVertWriting()) {
- m_pCurStates->m_TextX -= FXSYS_Mul(fInitKerning, m_pCurStates->m_TextState.GetFontSize()) / 1000;
- } else {
- m_pCurStates->m_TextY -= FXSYS_Mul(fInitKerning, m_pCurStates->m_TextState.GetFontSize()) / 1000;
- }
- }
- if (nsegs == 0) {
- return;
- }
- int textmode;
- if (pFont->GetFontType() == PDFFONT_TYPE3) {
- textmode = 0;
- } else {
- textmode = m_pCurStates->m_TextState.GetObject()->m_TextMode;
- }
- CPDF_TextObject* pText = FX_NEW CPDF_TextObject;
- m_pLastTextObject = pText;
- SetGraphicStates(pText, TRUE, TRUE, TRUE);
- if (textmode && textmode != 3 && textmode != 4 && textmode != 7) {
- FX_FLOAT* pCTM = pText->m_TextState.GetModify()->m_CTM;
- pCTM[0] = m_pCurStates->m_CTM.a;
- pCTM[1] = m_pCurStates->m_CTM.c;
- pCTM[2] = m_pCurStates->m_CTM.b;
- pCTM[3] = m_pCurStates->m_CTM.d;
- }
- pText->SetSegments(pStrs, pKerning, nsegs);
- pText->m_PosX = m_pCurStates->m_TextX;
- pText->m_PosY = m_pCurStates->m_TextY + m_pCurStates->m_TextRise;
- ConvertTextSpace(pText->m_PosX, pText->m_PosY);
- FX_FLOAT x_advance, y_advance;
- pText->CalcPositionData(&x_advance, &y_advance, m_pCurStates->m_TextHorzScale, m_Level);
- m_pCurStates->m_TextX += x_advance;
- m_pCurStates->m_TextY += y_advance;
- if (textmode > 3) {
- CPDF_TextObject* pCopy = FX_NEW CPDF_TextObject;
- pCopy->Copy(pText);
- m_ClipTextList.Add(pCopy);
- }
- m_pObjectList->m_ObjectList.AddTail(pText);
- if (pKerning && pKerning[nsegs - 1] != 0) {
- if (!pFont->IsVertWriting()) {
- m_pCurStates->m_TextX -= FXSYS_Mul(pKerning[nsegs - 1], m_pCurStates->m_TextState.GetFontSize()) / 1000;
- } else {
- m_pCurStates->m_TextY -= FXSYS_Mul(pKerning[nsegs - 1], m_pCurStates->m_TextState.GetFontSize()) / 1000;
- }
- }
-}
-void CPDF_StreamContentParser::Handle_ShowText()
-{
- CFX_ByteString str = GetString(0);
- if (str.IsEmpty()) {
- return;
- }
- AddTextObject(&str, 0, NULL, 1);
-}
-void CPDF_StreamContentParser::Handle_ShowText_Positioning()
-{
- CPDF_Array* pArray = GetObject(0)->GetArray();
- if (pArray == NULL) {
- return;
- }
- int n = pArray->GetCount(), nsegs = 0, i;
- for (i = 0; i < n; i ++) {
- CPDF_Object* pObj = pArray->GetElementValue(i);
- if (pObj->GetType() == PDFOBJ_STRING) {
- nsegs ++;
- }
- }
- if (nsegs == 0) {
- for (i = 0; i < n; i ++) {
- m_pCurStates->m_TextX -= FXSYS_Mul(pArray->GetNumber(i), m_pCurStates->m_TextState.GetFontSize()) / 1000;
- };
- return;
- }
- CFX_ByteString* pStrs;
- FX_NEW_VECTOR(pStrs, CFX_ByteString, nsegs);
- FX_FLOAT* pKerning = FX_Alloc(FX_FLOAT, nsegs);
- int iSegment = 0;
- FX_FLOAT fInitKerning = 0;
- for (i = 0; i < n; i ++) {
- CPDF_Object* pObj = pArray->GetElementValue(i);
- if (pObj->GetType() == PDFOBJ_STRING) {
- CFX_ByteString str = pObj->GetString();
- if (str.IsEmpty()) {
- continue;
- }
- pStrs[iSegment] = str;
- pKerning[iSegment ++] = 0;
- } else {
- if (iSegment == 0) {
- fInitKerning += pObj->GetNumber();
- } else {
- pKerning[iSegment - 1] += pObj->GetNumber();
- }
- }
- }
- AddTextObject(pStrs, fInitKerning, pKerning, iSegment);
- FX_DELETE_VECTOR(pStrs, CFX_ByteString, nsegs);
- FX_Free(pKerning);
-}
-void CPDF_StreamContentParser::Handle_SetTextLeading()
-{
- m_pCurStates->m_TextLeading = GetNumber(0);
-}
-void CPDF_StreamContentParser::Handle_SetTextMatrix()
-{
- m_pCurStates->m_TextMatrix.Set(GetNumber16(5), GetNumber16(4), GetNumber16(3),
- GetNumber16(2), GetNumber(1), GetNumber(0));
- OnChangeTextMatrix();
- m_pCurStates->m_TextX = 0;
- m_pCurStates->m_TextY = 0;
- m_pCurStates->m_TextLineX = 0;
- m_pCurStates->m_TextLineY = 0;
-}
-void CPDF_StreamContentParser::OnChangeTextMatrix()
-{
- CFX_AffineMatrix text_matrix(m_pCurStates->m_TextHorzScale, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f);
- text_matrix.Concat(m_pCurStates->m_TextMatrix);
- text_matrix.Concat(m_pCurStates->m_CTM);
- text_matrix.Concat(m_mtContentToUser);
- FX_FLOAT* pTextMatrix = m_pCurStates->m_TextState.GetModify()->m_Matrix;
- pTextMatrix[0] = text_matrix.a;
- pTextMatrix[1] = text_matrix.c;
- pTextMatrix[2] = text_matrix.b;
- pTextMatrix[3] = text_matrix.d;
-}
-void CPDF_StreamContentParser::Handle_SetTextRenderMode()
-{
- int mode = GetInteger(0);
- if (mode < 0 || mode > 7) {
- return;
- }
- m_pCurStates->m_TextState.GetModify()->m_TextMode = mode;
-}
-void CPDF_StreamContentParser::Handle_SetTextRise()
-{
- m_pCurStates->m_TextRise = GetNumber(0);
-}
-void CPDF_StreamContentParser::Handle_SetWordSpace()
-{
- m_pCurStates->m_TextState.GetModify()->m_WordSpace = GetNumber(0);
-}
-void CPDF_StreamContentParser::Handle_SetHorzScale()
-{
- if (m_ParamCount != 1) {
- return;
- }
- m_pCurStates->m_TextHorzScale = GetNumber(0) / 100;
- OnChangeTextMatrix();
-}
-void CPDF_StreamContentParser::Handle_MoveToNextLine()
-{
- m_pCurStates->m_TextLineY -= m_pCurStates->m_TextLeading;
- m_pCurStates->m_TextX = m_pCurStates->m_TextLineX;
- m_pCurStates->m_TextY = m_pCurStates->m_TextLineY;
-}
-void CPDF_StreamContentParser::Handle_CurveTo_23()
-{
- if (m_Options.m_bTextOnly) {
- return;
- }
- AddPathPoint(m_PathCurrentX, m_PathCurrentY, FXPT_BEZIERTO);
- AddPathPoint(GetNumber(3), GetNumber(2), FXPT_BEZIERTO);
- AddPathPoint(GetNumber(1), GetNumber(0), FXPT_BEZIERTO);
-}
-void CPDF_StreamContentParser::Handle_SetLineWidth()
-{
- FX_FLOAT width = GetNumber(0);
- m_pCurStates->m_GraphState.GetModify()->m_LineWidth = width;
-}
-void CPDF_StreamContentParser::Handle_Clip()
-{
- m_PathClipType = FXFILL_WINDING;
-}
-void CPDF_StreamContentParser::Handle_EOClip()
-{
- m_PathClipType = FXFILL_ALTERNATE;
-}
-void CPDF_StreamContentParser::Handle_CurveTo_13()
-{
- if (m_Options.m_bTextOnly) {
- return;
- }
- AddPathPoint(GetNumber(3), GetNumber(2), FXPT_BEZIERTO);
- AddPathPoint(GetNumber(1), GetNumber(0), FXPT_BEZIERTO);
- AddPathPoint(GetNumber(1), GetNumber(0), FXPT_BEZIERTO);
-}
-void CPDF_StreamContentParser::Handle_NextLineShowText()
-{
- Handle_MoveToNextLine();
- Handle_ShowText();
-}
-void CPDF_StreamContentParser::Handle_NextLineShowText_Space()
-{
- m_pCurStates->m_TextState.GetModify()->m_WordSpace = GetNumber(2);
- m_pCurStates->m_TextState.GetModify()->m_CharSpace = GetNumber(1);
- Handle_NextLineShowText();
-}
-void CPDF_StreamContentParser::Handle_Invalid()
-{
-}
-void CPDF_StreamContentParser::AddPathPoint(FX_FLOAT x, FX_FLOAT y, int flag)
-{
- m_PathCurrentX = x;
- m_PathCurrentY = y;
- if (flag == FXPT_MOVETO) {
- m_PathStartX = x;
- m_PathStartY = y;
- if (m_PathPointCount && m_pPathPoints[m_PathPointCount - 1].m_Flag == FXPT_MOVETO) {
- m_pPathPoints[m_PathPointCount - 1].m_PointX = x;
- m_pPathPoints[m_PathPointCount - 1].m_PointY = y;
- return;
- }
- } else if (m_PathPointCount == 0) {
- return;
- }
- m_PathPointCount ++;
- if (m_PathPointCount > m_PathAllocSize) {
- int newsize = m_PathPointCount + 256;
- FX_PATHPOINT* pNewPoints = FX_Alloc(FX_PATHPOINT, newsize);
- if (m_PathAllocSize) {
- FXSYS_memcpy32(pNewPoints, m_pPathPoints, m_PathAllocSize * sizeof(FX_PATHPOINT));
- FX_Free(m_pPathPoints);
- }
- m_pPathPoints = pNewPoints;
- m_PathAllocSize = newsize;
- }
- m_pPathPoints[m_PathPointCount - 1].m_Flag = flag;
- m_pPathPoints[m_PathPointCount - 1].m_PointX = x;
- m_pPathPoints[m_PathPointCount - 1].m_PointY = y;
-}
-void CPDF_StreamContentParser::AddPathObject(int FillType, FX_BOOL bStroke)
-{
- int PathPointCount = m_PathPointCount, PathClipType = m_PathClipType;
- m_PathPointCount = 0;
- m_PathClipType = 0;
- if (PathPointCount <= 1) {
- if (PathPointCount && PathClipType) {
- CPDF_Path path;
- path.New()->AppendRect(0, 0, 0, 0);
- m_pCurStates->m_ClipPath.AppendPath(path, FXFILL_WINDING, TRUE);
- }
- return;
- }
- if (PathPointCount && m_pPathPoints[PathPointCount - 1].m_Flag == FXPT_MOVETO) {
- PathPointCount --;
- }
- CPDF_Path Path;
- CFX_PathData* pPathData = Path.New();
- pPathData->SetPointCount(PathPointCount);
- FXSYS_memcpy32(pPathData->GetPoints(), m_pPathPoints, sizeof(FX_PATHPOINT) * PathPointCount);
- CFX_AffineMatrix matrix = m_pCurStates->m_CTM;
- matrix.Concat(m_mtContentToUser);
- if (bStroke || FillType) {
- CPDF_PathObject* pPathObj = FX_NEW CPDF_PathObject;
- pPathObj->m_bStroke = bStroke;
- pPathObj->m_FillType = FillType;
- pPathObj->m_Path = Path;
- pPathObj->m_Matrix = matrix;
- SetGraphicStates(pPathObj, TRUE, FALSE, TRUE);
- pPathObj->CalcBoundingBox();
- m_pObjectList->m_ObjectList.AddTail(pPathObj);
- }
- if (PathClipType) {
- if (!matrix.IsIdentity()) {
- Path.Transform(&matrix);
- matrix.SetIdentity();
- }
- m_pCurStates->m_ClipPath.AppendPath(Path, PathClipType, TRUE);
- }
-}
-CFX_ByteString _FPDF_ByteStringFromHex(CFX_BinaryBuf& src_buf)
-{
- CFX_ByteTextBuf buf;
- FX_BOOL bFirst = TRUE;
- int code = 0;
- FX_LPCBYTE str = src_buf.GetBuffer();
- FX_DWORD size = src_buf.GetSize();
- for (FX_DWORD i = 0; i < size; i ++) {
- FX_BYTE ch = str[i];
- if (ch >= '0' && ch <= '9') {
- if (bFirst) {
- code = (ch - '0') * 16;
- } else {
- code += ch - '0';
- buf.AppendChar((char)code);
- }
- bFirst = !bFirst;
- } else if (ch >= 'A' && ch <= 'F') {
- if (bFirst) {
- code = (ch - 'A' + 10) * 16;
- } else {
- code += ch - 'A' + 10;
- buf.AppendChar((char)code);
- }
- bFirst = !bFirst;
- } else if (ch >= 'a' && ch <= 'f') {
- if (bFirst) {
- code = (ch - 'a' + 10) * 16;
- } else {
- code += ch - 'a' + 10;
- buf.AppendChar((char)code);
- }
- bFirst = !bFirst;
- }
- }
- if (!bFirst) {
- buf.AppendChar((char)code);
- }
- return buf.GetByteString();
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fpdfapi/fpdf_page.h"
+#include "../../../include/fpdfapi/fpdf_module.h"
+#include "../../../include/fpdfapi/fpdf_serial.h"
+#include "pageint.h"
+#define REQUIRE_PARAMS(count) if (m_ParamCount != count) { m_bAbort = TRUE; return; }
+CPDF_StreamContentParser::CPDF_StreamContentParser()
+{
+ m_DefFontSize = 0;
+ m_pCurStates = NULL;
+ m_pLastTextObject = NULL;
+ m_pPathPoints = NULL;
+ m_PathClipType = 0;
+ m_PathPointCount = m_PathAllocSize = 0;
+ m_PathCurrentX = m_PathCurrentY = 0.0f;
+ m_bResourceMissing = FALSE;
+ m_bColored = FALSE;
+ FXSYS_memset32(m_Type3Data, 0, sizeof(FX_FLOAT) * 6);
+ m_ParamCount = 0;
+ m_ParamStartPos = 0;
+ m_bAbort = FALSE;
+ m_pLastImageDict = NULL;
+ m_pLastCloneImageDict = NULL;
+ m_pLastImage = NULL;
+ m_bReleaseLastDict = TRUE;
+ m_pParentResources = NULL;
+#ifdef _FPDFAPI_MINI_
+ m_pObjectState = NULL;
+ m_pObjectStack = NULL;
+ m_pWordBuf = NULL;
+ m_pDictName = NULL;
+ m_pStreamBuf = NULL;
+ m_WordState = 0;
+ m_ObjectSize = 0;
+#endif
+}
+FX_BOOL CPDF_StreamContentParser::Initialize()
+{
+#ifdef _FPDFAPI_MINI_
+ m_pObjectState = FX_Alloc(FX_BOOL, _FPDF_MAX_OBJECT_STACK_SIZE_);
+ FXSYS_memset32(m_pObjectState, 0, _FPDF_MAX_OBJECT_STACK_SIZE_ * sizeof(FX_BOOL));
+ m_pObjectStack = FX_Alloc(CPDF_Object*, _FPDF_MAX_OBJECT_STACK_SIZE_);
+ FXSYS_memset32(m_pObjectStack, 0, _FPDF_MAX_OBJECT_STACK_SIZE_ * sizeof(CPDF_Object*));
+ m_pWordBuf = FX_Alloc(FX_BYTE, 256);
+ FXSYS_memset32(m_pWordBuf, 0, 256 * sizeof(FX_BYTE));
+ m_pDictName = FX_Alloc(FX_BYTE, 256);
+ FXSYS_memset32(m_pDictName, 0, 256 * sizeof(FX_BYTE));
+ m_pStreamBuf = FX_Alloc(FX_BYTE, STREAM_PARSE_BUFSIZE);
+ FXSYS_memset32(m_pStreamBuf, 0, STREAM_PARSE_BUFSIZE * sizeof(FX_BYTE));
+ m_StringBuf.EstimateSize(1024);
+ m_ObjectSize = 0;
+ m_ImageSrcBuf.EstimateSize(STREAM_PARSE_BUFSIZE);
+#endif
+ return TRUE;
+}
+CPDF_StreamContentParser::~CPDF_StreamContentParser()
+{
+ ClearAllParams();
+ int i = 0;
+ for (i = 0; i < m_StateStack.GetSize(); i ++) {
+ delete (CPDF_AllStates*)m_StateStack[i];
+ }
+ if (m_pPathPoints) {
+ FX_Free(m_pPathPoints);
+ }
+ if (m_pCurStates) {
+ delete m_pCurStates;
+ }
+ if (m_pLastImageDict) {
+ m_pLastImageDict->Release();
+ }
+ if (m_pLastCloneImageDict) {
+ m_pLastCloneImageDict->Release();
+ }
+#ifdef _FPDFAPI_MINI_
+ for (i = 0; i < (int)m_ObjectSize; ++i) {
+ if (!m_pObjectState[i]) {
+ m_pObjectStack[i]->Release();
+ }
+ }
+ FX_Free(m_pObjectStack);
+ FX_Free(m_pObjectState);
+ FX_Free(m_pStreamBuf);
+ FX_Free(m_pWordBuf);
+ FX_Free(m_pDictName);
+#endif
+}
+void CPDF_StreamContentParser::PrepareParse(CPDF_Document* pDocument,
+ CPDF_Dictionary* pPageResources, CPDF_Dictionary* pParentResources, CFX_AffineMatrix* pmtContentToUser, CPDF_PageObjects* pObjList,
+ CPDF_Dictionary* pResources, CPDF_Rect* pBBox, CPDF_ParseOptions* pOptions,
+ CPDF_AllStates* pStates, int level)
+{
+ for (int i = 0; i < 6; i ++) {
+ m_Type3Data[i] = 0;
+ }
+ m_pDocument = pDocument;
+ m_pPageResources = pPageResources;
+ m_pParentResources = pParentResources;
+ if (pmtContentToUser) {
+ m_mtContentToUser = *pmtContentToUser;
+ }
+ if (pOptions) {
+ m_Options = *pOptions;
+ }
+ m_pObjectList = pObjList;
+ m_pResources = pResources;
+ if (pResources == NULL) {
+ m_pResources = m_pParentResources;
+ }
+ if (m_pResources == NULL) {
+ m_pResources = pPageResources;
+ }
+ if (pBBox) {
+ m_BBox = *pBBox;
+ }
+ m_Level = level;
+ m_pCurStates = FX_NEW CPDF_AllStates;
+ if (pStates) {
+ m_pCurStates->Copy(*pStates);
+ } else {
+ m_pCurStates->m_GeneralState.New();
+ m_pCurStates->m_GraphState.New();
+ m_pCurStates->m_TextState.New();
+ m_pCurStates->m_ColorState.New();
+ }
+#ifdef _FPDFAPI_MINI_
+ FXSYS_memset32(m_pObjectState, 0, _FPDF_MAX_OBJECT_STACK_SIZE_ * sizeof(FX_BOOL));
+#endif
+}
+int CPDF_StreamContentParser::GetNextParamPos()
+{
+ if (m_ParamCount == PARAM_BUF_SIZE) {
+ m_ParamStartPos ++;
+ if (m_ParamStartPos == PARAM_BUF_SIZE) {
+ m_ParamStartPos = 0;
+ }
+ if (m_ParamBuf1[m_ParamStartPos].m_Type == 0) {
+ m_ParamBuf1[m_ParamStartPos].m_pObject->Release();
+ }
+ return m_ParamStartPos;
+ }
+ int index = m_ParamStartPos + m_ParamCount;
+ if (index >= PARAM_BUF_SIZE) {
+ index -= PARAM_BUF_SIZE;
+ }
+ m_ParamCount ++;
+ return index;
+}
+void CPDF_StreamContentParser::AddNameParam(FX_LPCSTR name, int len)
+{
+ int index = GetNextParamPos();
+ if (len > 32) {
+ m_ParamBuf1[index].m_Type = 0;
+ m_ParamBuf1[index].m_pObject = CPDF_Name::Create(PDF_NameDecode(CFX_ByteStringC(name, len)));
+ } else {
+ m_ParamBuf1[index].m_Type = PDFOBJ_NAME;
+ if (FXSYS_memchr(name, '#', len) == NULL) {
+ FXSYS_memcpy32(m_ParamBuf1[index].m_Name.m_Buffer, name, len);
+ m_ParamBuf1[index].m_Name.m_Len = len;
+ } else {
+ CFX_ByteString str = PDF_NameDecode(CFX_ByteStringC(name, len));
+ FXSYS_memcpy32(m_ParamBuf1[index].m_Name.m_Buffer, (FX_LPCSTR)str, str.GetLength());
+ m_ParamBuf1[index].m_Name.m_Len = str.GetLength();
+ }
+ }
+}
+void CPDF_StreamContentParser::AddNumberParam(FX_LPCSTR str, int len)
+{
+ int index = GetNextParamPos();
+ m_ParamBuf1[index].m_Type = PDFOBJ_NUMBER;
+ FX_atonum(CFX_ByteStringC(str, len), m_ParamBuf1[index].m_Number.m_bInteger,
+ &m_ParamBuf1[index].m_Number.m_Integer);
+}
+void CPDF_StreamContentParser::AddObjectParam(CPDF_Object* pObj)
+{
+ int index = GetNextParamPos();
+ m_ParamBuf1[index].m_Type = 0;
+ m_ParamBuf1[index].m_pObject = pObj;
+}
+void CPDF_StreamContentParser::ClearAllParams()
+{
+ FX_DWORD index = m_ParamStartPos;
+ for (FX_DWORD i = 0; i < m_ParamCount; i ++) {
+ if (m_ParamBuf1[index].m_Type == 0) {
+ m_ParamBuf1[index].m_pObject->Release();
+ }
+ index ++;
+ if (index == PARAM_BUF_SIZE) {
+ index = 0;
+ }
+ }
+ m_ParamStartPos = 0;
+ m_ParamCount = 0;
+}
+CPDF_Object* CPDF_StreamContentParser::GetObject(FX_DWORD index)
+{
+ if (index >= m_ParamCount) {
+ return NULL;
+ }
+ int real_index = m_ParamStartPos + m_ParamCount - index - 1;
+ if (real_index >= PARAM_BUF_SIZE) {
+ real_index -= PARAM_BUF_SIZE;
+ }
+ _ContentParam& param = m_ParamBuf1[real_index];
+ if (param.m_Type == PDFOBJ_NUMBER) {
+ CPDF_Number* pNumber = CPDF_Number::Create(param.m_Number.m_bInteger, &param.m_Number.m_Integer);
+ param.m_Type = 0;
+ param.m_pObject = pNumber;
+ return pNumber;
+ }
+ if (param.m_Type == PDFOBJ_NAME) {
+ CPDF_Name* pName = CPDF_Name::Create(CFX_ByteString(param.m_Name.m_Buffer, param.m_Name.m_Len));
+ param.m_Type = 0;
+ param.m_pObject = pName;
+ return pName;
+ }
+ if (param.m_Type == 0) {
+ return param.m_pObject;
+ }
+ ASSERT(FALSE);
+ return NULL;
+}
+CFX_ByteString CPDF_StreamContentParser::GetString(FX_DWORD index)
+{
+ if (index >= m_ParamCount) {
+ return CFX_ByteString();
+ }
+ int real_index = m_ParamStartPos + m_ParamCount - index - 1;
+ if (real_index >= PARAM_BUF_SIZE) {
+ real_index -= PARAM_BUF_SIZE;
+ }
+ _ContentParam& param = m_ParamBuf1[real_index];
+ if (param.m_Type == PDFOBJ_NAME) {
+ return CFX_ByteString(param.m_Name.m_Buffer, param.m_Name.m_Len);
+ }
+ if (param.m_Type == 0) {
+ return param.m_pObject->GetString();
+ }
+ return CFX_ByteString();
+}
+FX_FLOAT CPDF_StreamContentParser::GetNumber(FX_DWORD index)
+{
+ if (index >= m_ParamCount) {
+ return 0;
+ }
+ int real_index = m_ParamStartPos + m_ParamCount - index - 1;
+ if (real_index >= PARAM_BUF_SIZE) {
+ real_index -= PARAM_BUF_SIZE;
+ }
+ _ContentParam& param = m_ParamBuf1[real_index];
+ if (param.m_Type == PDFOBJ_NUMBER) {
+ return param.m_Number.m_bInteger ? (FX_FLOAT)param.m_Number.m_Integer : param.m_Number.m_Float;
+ }
+ if (param.m_Type == 0) {
+ return param.m_pObject->GetNumber();
+ }
+ return 0;
+}
+FX_FLOAT CPDF_StreamContentParser::GetNumber16(FX_DWORD index)
+{
+ return GetNumber(index);
+}
+void CPDF_StreamContentParser::SetGraphicStates(CPDF_PageObject* pObj, FX_BOOL bColor, FX_BOOL bText, FX_BOOL bGraph)
+{
+ pObj->m_GeneralState = m_pCurStates->m_GeneralState;
+ pObj->m_ClipPath = m_pCurStates->m_ClipPath;
+ pObj->m_ContentMark = m_CurContentMark;
+ if (bColor) {
+ pObj->m_ColorState = m_pCurStates->m_ColorState;
+ }
+ if (bGraph) {
+ pObj->m_GraphState = m_pCurStates->m_GraphState;
+ }
+ if (bText) {
+ pObj->m_TextState = m_pCurStates->m_TextState;
+ }
+}
+const struct _OpCode {
+ FX_DWORD m_OpId;
+ void (CPDF_StreamContentParser::*m_OpHandler)();
+} g_OpCodes[] = {
+ {FXBSTR_ID('"', 0, 0, 0), &CPDF_StreamContentParser::Handle_NextLineShowText_Space},
+ {FXBSTR_ID('\'', 0, 0, 0), &CPDF_StreamContentParser::Handle_NextLineShowText},
+ {FXBSTR_ID('B', 0, 0, 0), &CPDF_StreamContentParser::Handle_FillStrokePath},
+ {FXBSTR_ID('B', '*', 0, 0), &CPDF_StreamContentParser::Handle_EOFillStrokePath},
+ {FXBSTR_ID('B', 'D', 'C', 0), &CPDF_StreamContentParser::Handle_BeginMarkedContent_Dictionary},
+ {FXBSTR_ID('B', 'I', 0, 0), &CPDF_StreamContentParser::Handle_BeginImage},
+ {FXBSTR_ID('B', 'M', 'C', 0), &CPDF_StreamContentParser::Handle_BeginMarkedContent},
+ {FXBSTR_ID('B', 'T', 0, 0), &CPDF_StreamContentParser::Handle_BeginText},
+ {FXBSTR_ID('B', 'X', 0, 0), &CPDF_StreamContentParser::Handle_BeginSectionUndefined},
+ {FXBSTR_ID('C', 'S', 0, 0), &CPDF_StreamContentParser::Handle_SetColorSpace_Stroke},
+ {FXBSTR_ID('D', 'P', 0, 0), &CPDF_StreamContentParser::Handle_MarkPlace_Dictionary},
+ {FXBSTR_ID('D', 'o', 0, 0), &CPDF_StreamContentParser::Handle_ExecuteXObject},
+ {FXBSTR_ID('E', 'I', 0, 0), &CPDF_StreamContentParser::Handle_EndImage},
+ {FXBSTR_ID('E', 'M', 'C', 0), &CPDF_StreamContentParser::Handle_EndMarkedContent},
+ {FXBSTR_ID('E', 'T', 0, 0), &CPDF_StreamContentParser::Handle_EndText},
+ {FXBSTR_ID('E', 'X', 0, 0), &CPDF_StreamContentParser::Handle_EndSectionUndefined},
+ {FXBSTR_ID('F', 0, 0, 0), &CPDF_StreamContentParser::Handle_FillPathOld},
+ {FXBSTR_ID('G', 0, 0, 0), &CPDF_StreamContentParser::Handle_SetGray_Stroke},
+ {FXBSTR_ID('I', 'D', 0, 0), &CPDF_StreamContentParser::Handle_BeginImageData},
+ {FXBSTR_ID('J', 0, 0, 0), &CPDF_StreamContentParser::Handle_SetLineCap},
+ {FXBSTR_ID('K', 0, 0, 0), &CPDF_StreamContentParser::Handle_SetCMYKColor_Stroke},
+ {FXBSTR_ID('M', 0, 0, 0), &CPDF_StreamContentParser::Handle_SetMiterLimit},
+ {FXBSTR_ID('M', 'P', 0, 0), &CPDF_StreamContentParser::Handle_MarkPlace},
+ {FXBSTR_ID('Q', 0, 0, 0), &CPDF_StreamContentParser::Handle_RestoreGraphState},
+ {FXBSTR_ID('R', 'G', 0, 0), &CPDF_StreamContentParser::Handle_SetRGBColor_Stroke},
+ {FXBSTR_ID('S', 0, 0, 0), &CPDF_StreamContentParser::Handle_StrokePath},
+ {FXBSTR_ID('S', 'C', 0, 0), &CPDF_StreamContentParser::Handle_SetColor_Stroke},
+ {FXBSTR_ID('S', 'C', 'N', 0), &CPDF_StreamContentParser::Handle_SetColorPS_Stroke},
+ {FXBSTR_ID('T', '*', 0, 0), &CPDF_StreamContentParser::Handle_MoveToNextLine},
+ {FXBSTR_ID('T', 'D', 0, 0), &CPDF_StreamContentParser::Handle_MoveTextPoint_SetLeading},
+ {FXBSTR_ID('T', 'J', 0, 0), &CPDF_StreamContentParser::Handle_ShowText_Positioning},
+ {FXBSTR_ID('T', 'L', 0, 0), &CPDF_StreamContentParser::Handle_SetTextLeading},
+ {FXBSTR_ID('T', 'c', 0, 0), &CPDF_StreamContentParser::Handle_SetCharSpace},
+ {FXBSTR_ID('T', 'd', 0, 0), &CPDF_StreamContentParser::Handle_MoveTextPoint},
+ {FXBSTR_ID('T', 'f', 0, 0), &CPDF_StreamContentParser::Handle_SetFont},
+ {FXBSTR_ID('T', 'j', 0, 0), &CPDF_StreamContentParser::Handle_ShowText},
+ {FXBSTR_ID('T', 'm', 0, 0), &CPDF_StreamContentParser::Handle_SetTextMatrix},
+ {FXBSTR_ID('T', 'r', 0, 0), &CPDF_StreamContentParser::Handle_SetTextRenderMode},
+ {FXBSTR_ID('T', 's', 0, 0), &CPDF_StreamContentParser::Handle_SetTextRise},
+ {FXBSTR_ID('T', 'w', 0, 0), &CPDF_StreamContentParser::Handle_SetWordSpace},
+ {FXBSTR_ID('T', 'z', 0, 0), &CPDF_StreamContentParser::Handle_SetHorzScale},
+ {FXBSTR_ID('W', 0, 0, 0), &CPDF_StreamContentParser::Handle_Clip},
+ {FXBSTR_ID('W', '*', 0, 0), &CPDF_StreamContentParser::Handle_EOClip},
+ {FXBSTR_ID('b', 0, 0, 0), &CPDF_StreamContentParser::Handle_CloseFillStrokePath},
+ {FXBSTR_ID('b', '*', 0, 0), &CPDF_StreamContentParser::Handle_CloseEOFillStrokePath},
+ {FXBSTR_ID('c', 0, 0, 0), &CPDF_StreamContentParser::Handle_CurveTo_123},
+ {FXBSTR_ID('c', 'm', 0, 0), &CPDF_StreamContentParser::Handle_ConcatMatrix},
+ {FXBSTR_ID('c', 's', 0, 0), &CPDF_StreamContentParser::Handle_SetColorSpace_Fill},
+ {FXBSTR_ID('d', 0, 0, 0), &CPDF_StreamContentParser::Handle_SetDash},
+ {FXBSTR_ID('d', '0', 0, 0), &CPDF_StreamContentParser::Handle_SetCharWidth},
+ {FXBSTR_ID('d', '1', 0, 0), &CPDF_StreamContentParser::Handle_SetCachedDevice},
+ {FXBSTR_ID('f', 0, 0, 0), &CPDF_StreamContentParser::Handle_FillPath},
+ {FXBSTR_ID('f', '*', 0, 0), &CPDF_StreamContentParser::Handle_EOFillPath},
+ {FXBSTR_ID('g', 0, 0, 0), &CPDF_StreamContentParser::Handle_SetGray_Fill},
+ {FXBSTR_ID('g', 's', 0, 0), &CPDF_StreamContentParser::Handle_SetExtendGraphState},
+ {FXBSTR_ID('h', 0, 0, 0), &CPDF_StreamContentParser::Handle_ClosePath},
+ {FXBSTR_ID('i', 0, 0, 0), &CPDF_StreamContentParser::Handle_SetFlat},
+ {FXBSTR_ID('j', 0, 0, 0), &CPDF_StreamContentParser::Handle_SetLineJoin},
+ {FXBSTR_ID('k', 0, 0, 0), &CPDF_StreamContentParser::Handle_SetCMYKColor_Fill},
+ {FXBSTR_ID('l', 0, 0, 0), &CPDF_StreamContentParser::Handle_LineTo},
+ {FXBSTR_ID('m', 0, 0, 0), &CPDF_StreamContentParser::Handle_MoveTo},
+ {FXBSTR_ID('n', 0, 0, 0), &CPDF_StreamContentParser::Handle_EndPath},
+ {FXBSTR_ID('q', 0, 0, 0), &CPDF_StreamContentParser::Handle_SaveGraphState},
+ {FXBSTR_ID('r', 'e', 0, 0), &CPDF_StreamContentParser::Handle_Rectangle},
+ {FXBSTR_ID('r', 'g', 0, 0), &CPDF_StreamContentParser::Handle_SetRGBColor_Fill},
+ {FXBSTR_ID('r', 'i', 0, 0), &CPDF_StreamContentParser::Handle_SetRenderIntent},
+ {FXBSTR_ID('s', 0, 0, 0), &CPDF_StreamContentParser::Handle_CloseStrokePath},
+ {FXBSTR_ID('s', 'c', 0, 0), &CPDF_StreamContentParser::Handle_SetColor_Fill},
+ {FXBSTR_ID('s', 'c', 'n', 0), &CPDF_StreamContentParser::Handle_SetColorPS_Fill},
+ {FXBSTR_ID('s', 'h', 0, 0), &CPDF_StreamContentParser::Handle_ShadeFill},
+ {FXBSTR_ID('v', 0, 0, 0), &CPDF_StreamContentParser::Handle_CurveTo_23},
+ {FXBSTR_ID('w', 0, 0, 0), &CPDF_StreamContentParser::Handle_SetLineWidth},
+ {FXBSTR_ID('y', 0, 0, 0), &CPDF_StreamContentParser::Handle_CurveTo_13},
+};
+FX_BOOL CPDF_StreamContentParser::OnOperator(FX_LPCSTR op)
+{
+ int i = 0;
+ FX_DWORD opid = 0;
+ while (i < 4 && op[i]) {
+ opid = (opid << 8) + op[i];
+ i ++;
+ }
+ while (i < 4) {
+ opid <<= 8;
+ i ++;
+ };
+ int low = 0, high = sizeof g_OpCodes / sizeof(struct _OpCode) - 1;
+ while (low <= high) {
+ int middle = (low + high) / 2;
+ int compare = opid - g_OpCodes[middle].m_OpId;
+ if (compare == 0) {
+ (this->*g_OpCodes[middle].m_OpHandler)();
+ return TRUE;
+ } else if (compare < 0) {
+ high = middle - 1;
+ } else {
+ low = middle + 1;
+ }
+ }
+ return m_CompatCount != 0;
+}
+void CPDF_StreamContentParser::Handle_CloseFillStrokePath()
+{
+ if (m_Options.m_bTextOnly) {
+ return;
+ }
+ Handle_ClosePath();
+ AddPathObject(FXFILL_WINDING, TRUE);
+}
+void CPDF_StreamContentParser::Handle_FillStrokePath()
+{
+ if (m_Options.m_bTextOnly) {
+ return;
+ }
+ AddPathObject(FXFILL_WINDING, TRUE);
+}
+void CPDF_StreamContentParser::Handle_CloseEOFillStrokePath()
+{
+ if (m_Options.m_bTextOnly) {
+ return;
+ }
+ AddPathPoint(m_PathStartX, m_PathStartY, FXPT_LINETO | FXPT_CLOSEFIGURE);
+ AddPathObject(FXFILL_ALTERNATE, TRUE);
+}
+void CPDF_StreamContentParser::Handle_EOFillStrokePath()
+{
+ if (m_Options.m_bTextOnly) {
+ return;
+ }
+ AddPathObject(FXFILL_ALTERNATE, TRUE);
+}
+void CPDF_StreamContentParser::Handle_BeginMarkedContent_Dictionary()
+{
+ if (!m_Options.m_bMarkedContent) {
+ return;
+ }
+ CFX_ByteString tag = GetString(1);
+ CPDF_Object* pProperty = GetObject(0);
+ if (pProperty == NULL) {
+ return;
+ }
+ FX_BOOL bDirect = TRUE;
+ if (pProperty->GetType() == PDFOBJ_NAME) {
+ pProperty = FindResourceObj(FX_BSTRC("Properties"), pProperty->GetString());
+ if (pProperty == NULL) {
+ return;
+ }
+ bDirect = FALSE;
+ }
+ if (pProperty->GetType() != PDFOBJ_DICTIONARY) {
+ return;
+ }
+ m_CurContentMark.GetModify()->AddMark(tag, (CPDF_Dictionary*)pProperty, bDirect);
+}
+void CPDF_StreamContentParser::Handle_BeginMarkedContent()
+{
+ if (!m_Options.m_bMarkedContent) {
+ return;
+ }
+ CFX_ByteString tag = GetString(0);
+ m_CurContentMark.GetModify()->AddMark(tag, NULL, FALSE);
+}
+struct _FX_BSTR {
+ FX_LPCSTR m_Ptr;
+ int m_Size;
+};
+#define _FX_BSTRC(str) {str, sizeof(str)-1}
+const _FX_BSTR _PDF_InlineKeyAbbr[] = {
+ _FX_BSTRC("BitsPerComponent"), _FX_BSTRC("BPC"),
+ _FX_BSTRC("ColorSpace"), _FX_BSTRC("CS"),
+ _FX_BSTRC("Decode"), _FX_BSTRC("D"),
+ _FX_BSTRC("DecodeParms"), _FX_BSTRC("DP"),
+ _FX_BSTRC("Filter"), _FX_BSTRC("F"),
+ _FX_BSTRC("Height"), _FX_BSTRC("H"),
+ _FX_BSTRC("ImageMask"), _FX_BSTRC("IM"),
+ _FX_BSTRC("Interpolate"), _FX_BSTRC("I"),
+ _FX_BSTRC("Width"), _FX_BSTRC("W"),
+};
+const _FX_BSTR _PDF_InlineValueAbbr[] = {
+ _FX_BSTRC("DeviceGray"), _FX_BSTRC("G"),
+ _FX_BSTRC("DeviceRGB"), _FX_BSTRC("RGB"),
+ _FX_BSTRC("DeviceCMYK"), _FX_BSTRC("CMYK"),
+ _FX_BSTRC("Indexed"), _FX_BSTRC("I"),
+ _FX_BSTRC("ASCIIHexDecode"), _FX_BSTRC("AHx"),
+ _FX_BSTRC("ASCII85Decode"), _FX_BSTRC("A85"),
+ _FX_BSTRC("LZWDecode"), _FX_BSTRC("LZW"),
+ _FX_BSTRC("FlateDecode"), _FX_BSTRC("Fl"),
+ _FX_BSTRC("RunLengthDecode"), _FX_BSTRC("RL"),
+ _FX_BSTRC("CCITTFaxDecode"), _FX_BSTRC("CCF"),
+ _FX_BSTRC("DCTDecode"), _FX_BSTRC("DCT"),
+};
+static CFX_ByteStringC _PDF_FindFullName(const _FX_BSTR* table, int count, FX_BSTR abbr)
+{
+ int i = 0;
+ while (i < count) {
+ if (abbr.GetLength() == table[i + 1].m_Size && FXSYS_memcmp32(abbr.GetPtr(), table[i + 1].m_Ptr, abbr.GetLength()) == 0) {
+ return CFX_ByteStringC(table[i].m_Ptr, table[i].m_Size);
+ }
+ i += 2;
+ }
+ return CFX_ByteStringC();
+}
+void _PDF_ReplaceAbbr(CPDF_Object* pObj)
+{
+ switch (pObj->GetType()) {
+ case PDFOBJ_DICTIONARY: {
+ CPDF_Dictionary* pDict = (CPDF_Dictionary*)pObj;
+ FX_POSITION pos = pDict->GetStartPos();
+ while (pos) {
+ CFX_ByteString key;
+ CPDF_Object* value = pDict->GetNextElement(pos, key);
+ CFX_ByteStringC fullname = _PDF_FindFullName(_PDF_InlineKeyAbbr,
+ sizeof _PDF_InlineKeyAbbr / sizeof(_FX_BSTR), key);
+ if (!fullname.IsEmpty()) {
+ pDict->ReplaceKey(key, fullname);
+ key = fullname;
+ }
+ if (value->GetType() == PDFOBJ_NAME) {
+ CFX_ByteString name = value->GetString();
+ fullname = _PDF_FindFullName(_PDF_InlineValueAbbr,
+ sizeof _PDF_InlineValueAbbr / sizeof(_FX_BSTR), name);
+ if (!fullname.IsEmpty()) {
+ pDict->SetAtName(key, fullname);
+ }
+ } else {
+ _PDF_ReplaceAbbr(value);
+ }
+ }
+ break;
+ }
+ case PDFOBJ_ARRAY: {
+ CPDF_Array* pArray = (CPDF_Array*)pObj;
+ for (FX_DWORD i = 0; i < pArray->GetCount(); i ++) {
+ CPDF_Object* pElement = pArray->GetElement(i);
+ if (pElement->GetType() == PDFOBJ_NAME) {
+ CFX_ByteString name = pElement->GetString();
+ CFX_ByteStringC fullname = _PDF_FindFullName(_PDF_InlineValueAbbr,
+ sizeof _PDF_InlineValueAbbr / sizeof(_FX_BSTR), name);
+ if (!fullname.IsEmpty()) {
+ pArray->SetAt(i, CPDF_Name::Create(fullname));
+ }
+ } else {
+ _PDF_ReplaceAbbr(pElement);
+ }
+ }
+ break;
+ }
+ }
+}
+static CFX_ByteStringC _PDF_FindAbbrName(const _FX_BSTR* table, int count, FX_BSTR fullName)
+{
+ int i = 0;
+ while (i < count) {
+ if (fullName.GetLength() == table[i].m_Size && FXSYS_memcmp32(fullName.GetPtr(), table[i].m_Ptr, fullName.GetLength()) == 0) {
+ return CFX_ByteStringC(table[i + 1].m_Ptr, table[i + 1].m_Size);
+ }
+ i += 2;
+ }
+ return CFX_ByteStringC();
+}
+void _PDF_ReplaceFull(CPDF_Object* pObj)
+{
+ switch (pObj->GetType()) {
+ case PDFOBJ_DICTIONARY: {
+ CPDF_Dictionary* pDict = (CPDF_Dictionary*)pObj;
+ FX_POSITION pos = pDict->GetStartPos();
+ while (pos) {
+ CFX_ByteString key;
+ CPDF_Object* value = pDict->GetNextElement(pos, key);
+ CFX_ByteStringC abbrName = _PDF_FindAbbrName(_PDF_InlineKeyAbbr,
+ sizeof(_PDF_InlineKeyAbbr) / sizeof(_FX_BSTR), key);
+ if (!abbrName.IsEmpty()) {
+ pDict->ReplaceKey(key, abbrName);
+ key = abbrName;
+ }
+ if (value->GetType() == PDFOBJ_NAME) {
+ CFX_ByteString name = value->GetString();
+ abbrName = _PDF_FindAbbrName(_PDF_InlineValueAbbr,
+ sizeof(_PDF_InlineValueAbbr) / sizeof(_FX_BSTR), name);
+ if (!abbrName.IsEmpty()) {
+ pDict->SetAtName(key, abbrName);
+ }
+ } else {
+ _PDF_ReplaceFull(value);
+ }
+ }
+ break;
+ }
+ case PDFOBJ_ARRAY: {
+ CPDF_Array* pArray = (CPDF_Array*)pObj;
+ for (FX_DWORD i = 0; i < pArray->GetCount(); i ++) {
+ CPDF_Object* pElement = pArray->GetElement(i);
+ if (pElement->GetType() == PDFOBJ_NAME) {
+ CFX_ByteString name = pElement->GetString();
+ CFX_ByteStringC abbrName = _PDF_FindAbbrName(_PDF_InlineValueAbbr,
+ sizeof _PDF_InlineValueAbbr / sizeof(_FX_BSTR), name);
+ if (!abbrName.IsEmpty()) {
+ pArray->SetAt(i, CPDF_Name::Create(abbrName));
+ }
+ } else {
+ _PDF_ReplaceFull(pElement);
+ }
+ }
+ break;
+ }
+ }
+}
+void CPDF_StreamContentParser::Handle_BeginText()
+{
+ m_pCurStates->m_TextMatrix.Set(1.0f, 0, 0, 1.0f, 0, 0);
+ OnChangeTextMatrix();
+ m_pCurStates->m_TextX = 0;
+ m_pCurStates->m_TextY = 0;
+ m_pCurStates->m_TextLineX = 0;
+ m_pCurStates->m_TextLineY = 0;
+}
+void CPDF_StreamContentParser::Handle_BeginSectionUndefined()
+{
+ m_CompatCount ++;
+}
+void CPDF_StreamContentParser::Handle_CurveTo_123()
+{
+ if (m_Options.m_bTextOnly) {
+ return;
+ }
+ AddPathPoint(GetNumber(5), GetNumber(4), FXPT_BEZIERTO);
+ AddPathPoint(GetNumber(3), GetNumber(2), FXPT_BEZIERTO);
+ AddPathPoint(GetNumber(1), GetNumber(0), FXPT_BEZIERTO);
+}
+void CPDF_StreamContentParser::Handle_ConcatMatrix()
+{
+ FX_FLOAT a2 = GetNumber16(5), b2 = GetNumber16(4), c2 = GetNumber16(3), d2 = GetNumber16(2);
+ FX_FLOAT e2 = GetNumber(1), f2 = GetNumber(0);
+ FX_FLOAT old_width_scale = m_pCurStates->m_CTM.GetXUnit();
+ CFX_AffineMatrix new_matrix(a2, b2, c2, d2, e2, f2);
+ new_matrix.Concat(m_pCurStates->m_CTM);
+ m_pCurStates->m_CTM = new_matrix;
+ FX_FLOAT new_width_scale = m_pCurStates->m_CTM.GetXUnit();
+ OnChangeTextMatrix();
+}
+void CPDF_StreamContentParser::Handle_SetColorSpace_Fill()
+{
+ if (m_Options.m_bTextOnly) {
+ return;
+ }
+ CFX_ByteString csname = GetString(0);
+ CPDF_ColorSpace* pCS = FindColorSpace(csname);
+ if (pCS == NULL) {
+ return;
+ }
+ m_pCurStates->m_ColorState.GetModify()->m_FillColor.SetColorSpace(pCS);
+}
+void CPDF_StreamContentParser::Handle_SetColorSpace_Stroke()
+{
+ if (m_Options.m_bTextOnly) {
+ return;
+ }
+ CFX_ByteString csname = GetString(0);
+ CPDF_ColorSpace* pCS = FindColorSpace(csname);
+ if (pCS == NULL) {
+ return;
+ }
+ m_pCurStates->m_ColorState.GetModify()->m_StrokeColor.SetColorSpace(pCS);
+}
+void CPDF_StreamContentParser::Handle_SetDash()
+{
+ if (m_Options.m_bTextOnly) {
+ return;
+ }
+ CPDF_Array* pArray = GetObject(1)->GetArray();
+ if (pArray == NULL) {
+ return;
+ }
+ m_pCurStates->SetLineDash(pArray, GetNumber(0), 1.0f);
+}
+void CPDF_StreamContentParser::Handle_SetCharWidth()
+{
+ m_Type3Data[0] = GetNumber(1);
+ m_Type3Data[1] = GetNumber(0);
+ m_bColored = TRUE;
+}
+void CPDF_StreamContentParser::Handle_SetCachedDevice()
+{
+ for (int i = 0; i < 6; i ++) {
+ m_Type3Data[i] = GetNumber(5 - i);
+ }
+ m_bColored = FALSE;
+}
+void CPDF_StreamContentParser::Handle_ExecuteXObject()
+{
+ CFX_ByteString name = GetString(0);
+ if (name == m_LastImageName && m_pLastImage && m_pLastImage->GetStream() && m_pLastImage->GetStream()->GetObjNum()) {
+#if defined(_FPDFAPI_MINI_) && !defined(_FXCORE_FEATURE_ALL_)
+ AddDuplicateImage();
+#else
+ AddImage(NULL, m_pLastImage, FALSE);
+#endif
+ return;
+ }
+ if (m_Options.m_bTextOnly) {
+ CPDF_Object* pRes = NULL;
+ if (m_pResources == NULL) {
+ return;
+ }
+ if (m_pResources == m_pPageResources) {
+ CPDF_Dictionary* pList = m_pResources->GetDict(FX_BSTRC("XObject"));
+ if (pList == NULL) {
+ return;
+ }
+ pRes = pList->GetElement(name);
+ if (pRes == NULL || pRes->GetType() != PDFOBJ_REFERENCE) {
+ return;
+ }
+ } else {
+ CPDF_Dictionary* pList = m_pResources->GetDict(FX_BSTRC("XObject"));
+ if (pList == NULL) {
+ if (m_pPageResources == NULL) {
+ return;
+ }
+ CPDF_Dictionary* pList = m_pPageResources->GetDict(FX_BSTRC("XObject"));
+ if (pList == NULL) {
+ return;
+ }
+ pRes = pList->GetElement(name);
+ if (pRes == NULL || pRes->GetType() != PDFOBJ_REFERENCE) {
+ return;
+ }
+ } else {
+ pRes = pList->GetElement(name);
+ if (pRes == NULL || pRes->GetType() != PDFOBJ_REFERENCE) {
+ return;
+ }
+ }
+ }
+ FX_BOOL bForm;
+ if (m_pDocument->IsFormStream(((CPDF_Reference*)pRes)->GetRefObjNum(), bForm) && !bForm) {
+ return;
+ }
+ }
+ CPDF_Stream* pXObject = (CPDF_Stream*)FindResourceObj(FX_BSTRC("XObject"), name);
+ if (pXObject == NULL || pXObject->GetType() != PDFOBJ_STREAM) {
+ m_bResourceMissing = TRUE;
+ return;
+ }
+ CFX_ByteStringC type = pXObject->GetDict()->GetConstString(FX_BSTRC("Subtype"));
+ if (type == FX_BSTRC("Image")) {
+ if (m_Options.m_bTextOnly) {
+ return;
+ }
+ CPDF_ImageObject* pObj = AddImage(pXObject, NULL, FALSE);
+ m_LastImageName = name;
+ m_pLastImage = pObj->m_pImage;
+ } else if (type == FX_BSTRC("Form")) {
+ AddForm(pXObject);
+ } else {
+ return;
+ }
+}
+void CPDF_StreamContentParser::AddForm(CPDF_Stream* pStream)
+{
+#if !defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_)
+ if (!m_Options.m_bSeparateForm) {
+ CPDF_Dictionary* pResources = pStream->GetDict()->GetDict(FX_BSTRC("Resources"));
+ CFX_AffineMatrix form_matrix = pStream->GetDict()->GetMatrix(FX_BSTRC("Matrix"));
+ form_matrix.Concat(m_pCurStates->m_CTM);
+ CPDF_Array* pBBox = pStream->GetDict()->GetArray(FX_BSTRC("BBox"));
+ CFX_FloatRect form_bbox;
+ CPDF_Path ClipPath;
+ if (pBBox) {
+ form_bbox = pStream->GetDict()->GetRect(FX_BSTRC("BBox"));
+ ClipPath.New();
+ ClipPath.AppendRect(form_bbox.left, form_bbox.bottom, form_bbox.right, form_bbox.top);
+ ClipPath.Transform(&form_matrix);
+ form_bbox.Transform(&form_matrix);
+ }
+ CPDF_StreamContentParser parser;
+ parser.Initialize();
+ parser.PrepareParse(m_pDocument, m_pPageResources, m_pResources, &m_mtContentToUser,
+ m_pObjectList, pResources, &form_bbox, &m_Options, m_pCurStates, m_Level + 1);
+ parser.m_pCurStates->m_CTM = form_matrix;
+ if (ClipPath.NotNull()) {
+ parser.m_pCurStates->m_ClipPath.AppendPath(ClipPath, FXFILL_WINDING, TRUE);
+ }
+ CPDF_StreamAcc stream;
+ stream.LoadAllData(pStream, FALSE);
+ if (stream.GetSize() == 0) {
+ return;
+ }
+#ifdef _FPDFAPI_MINI_
+ parser.InputData(stream.GetData(), stream.GetSize());
+ parser.Finish();
+#else
+ parser.Parse(stream.GetData(), stream.GetSize(), 0);
+#endif
+ return;
+ }
+#endif
+ CPDF_FormObject* pFormObj = FX_NEW CPDF_FormObject;
+ pFormObj->m_pForm = FX_NEW CPDF_Form(m_pDocument, m_pPageResources, pStream, m_pResources);
+ pFormObj->m_FormMatrix = m_pCurStates->m_CTM;
+ pFormObj->m_FormMatrix.Concat(m_mtContentToUser);
+ CPDF_AllStates status;
+ status.m_GeneralState = m_pCurStates->m_GeneralState;
+ status.m_GraphState = m_pCurStates->m_GraphState;
+ status.m_ColorState = m_pCurStates->m_ColorState;
+ status.m_TextState = m_pCurStates->m_TextState;
+ pFormObj->m_pForm->ParseContent(&status, NULL, NULL, &m_Options, m_Level + 1);
+ if (!m_pObjectList->m_bBackgroundAlphaNeeded && pFormObj->m_pForm->m_bBackgroundAlphaNeeded) {
+ m_pObjectList->m_bBackgroundAlphaNeeded = TRUE;
+ }
+ pFormObj->CalcBoundingBox();
+ SetGraphicStates(pFormObj, TRUE, TRUE, TRUE);
+ m_pObjectList->m_ObjectList.AddTail(pFormObj);
+}
+#if defined(_FPDFAPI_MINI_) && !defined(_FXCORE_FEATURE_ALL_)
+void CPDF_StreamContentParser::AddDuplicateImage()
+{
+ FX_POSITION tailpos = m_pObjectList->m_ObjectList.GetTailPosition();
+ CPDF_PageObject* pLastObj = (CPDF_PageObject*)m_pObjectList->m_ObjectList.GetAt(tailpos);
+ if (pLastObj == NULL || (pLastObj->m_Type != PDFPAGE_INLINES && pLastObj->m_Type != PDFPAGE_IMAGE)) {
+ AddImage(NULL, m_pLastImage, FALSE);
+ return;
+ }
+ if (pLastObj->m_GeneralState != m_pCurStates->m_GeneralState ||
+ pLastObj->m_ClipPath != m_pCurStates->m_ClipPath ||
+ pLastObj->m_ColorState != m_pCurStates->m_ColorState) {
+ AddImage(NULL, m_pLastImage, FALSE);
+ return;
+ }
+ CFX_AffineMatrix ImageMatrix;
+ ImageMatrix.Copy(m_pCurStates->m_CTM);
+ ImageMatrix.Concat(m_mtContentToUser);
+ if (pLastObj->m_Type == PDFPAGE_INLINES) {
+ CPDF_InlineImages* pInlines = (CPDF_InlineImages*)pLastObj;
+ if (pInlines->m_pStream != m_pLastImage->GetStream()) {
+ AddImage(NULL, m_pLastImage, FALSE);
+ return;
+ }
+ pInlines->AddMatrix(ImageMatrix);
+ } else {
+ CPDF_ImageObject* pImageObj = (CPDF_ImageObject*)pLastObj;
+ CPDF_InlineImages* pInlines = FX_NEW CPDF_InlineImages;
+ pInlines->m_pStream = m_pLastImage->GetStream();
+ SetGraphicStates(pInlines, !pInlines->m_pStream->GetDict()->KeyExist(FX_BSTRC("ColorSpace")), FALSE, FALSE);
+ pInlines->AddMatrix(pImageObj->m_Matrix);
+ pInlines->AddMatrix(ImageMatrix);
+ m_pObjectList->m_ObjectList.RemoveAt(tailpos);
+ m_pObjectList->m_ObjectList.AddTail(pInlines);
+ pLastObj->Release();
+ }
+}
+#endif
+CPDF_ImageObject* CPDF_StreamContentParser::AddImage(CPDF_Stream* pStream, CPDF_Image* pImage, FX_BOOL bInline)
+{
+ if (pStream == NULL && pImage == NULL) {
+ return NULL;
+ }
+ CFX_AffineMatrix ImageMatrix;
+ ImageMatrix.Copy(m_pCurStates->m_CTM);
+ ImageMatrix.Concat(m_mtContentToUser);
+ CPDF_ImageObject* pImageObj = FX_NEW CPDF_ImageObject;
+ if (pImage) {
+ pImageObj->m_pImage = m_pDocument->GetPageData()->GetImage(pImage->GetStream());
+ } else if (pStream->GetObjNum()) {
+ pImageObj->m_pImage = m_pDocument->LoadImageF(pStream);
+ } else {
+ pImageObj->m_pImage = FX_NEW CPDF_Image(m_pDocument);
+ pImageObj->m_pImage->LoadImageF(pStream, bInline);
+ }
+ SetGraphicStates(pImageObj, pImageObj->m_pImage->IsMask(), FALSE, FALSE);
+ pImageObj->m_Matrix = ImageMatrix;
+ pImageObj->CalcBoundingBox();
+ m_pObjectList->m_ObjectList.AddTail(pImageObj);
+ return pImageObj;
+}
+void CPDF_StreamContentParser::Handle_MarkPlace_Dictionary()
+{
+}
+void CPDF_StreamContentParser::Handle_EndImage()
+{
+}
+void CPDF_StreamContentParser::Handle_EndMarkedContent()
+{
+ if (!m_Options.m_bMarkedContent) {
+ return;
+ }
+ if (m_CurContentMark.IsNull()) {
+ return;
+ }
+ int count = m_CurContentMark.GetObject()->CountItems();
+ if (count == 1) {
+ m_CurContentMark.SetNull();
+ return;
+ }
+ m_CurContentMark.GetModify()->DeleteLastMark();
+}
+void CPDF_StreamContentParser::Handle_EndText()
+{
+ int count = m_ClipTextList.GetSize();
+ if (count == 0) {
+ return;
+ }
+ if (m_pCurStates->m_TextState.GetObject()->m_TextMode < 4) {
+ for (int i = 0; i < count; i ++) {
+ CPDF_TextObject* pText = (CPDF_TextObject*)m_ClipTextList.GetAt(i);
+ if (pText) {
+ delete pText;
+ }
+ }
+ } else {
+ m_pCurStates->m_ClipPath.AppendTexts((CPDF_TextObject**)m_ClipTextList.GetData(), count);
+ }
+ m_ClipTextList.RemoveAll();
+}
+void CPDF_StreamContentParser::Handle_EndSectionUndefined()
+{
+ if (m_CompatCount) {
+ m_CompatCount --;
+ }
+}
+void CPDF_StreamContentParser::Handle_FillPath()
+{
+ if (m_Options.m_bTextOnly) {
+ return;
+ }
+ AddPathObject(FXFILL_WINDING, FALSE);
+}
+void CPDF_StreamContentParser::Handle_FillPathOld()
+{
+ if (m_Options.m_bTextOnly) {
+ return;
+ }
+ AddPathObject(FXFILL_WINDING, FALSE);
+}
+void CPDF_StreamContentParser::Handle_EOFillPath()
+{
+ if (m_Options.m_bTextOnly) {
+ return;
+ }
+ AddPathObject(FXFILL_ALTERNATE, FALSE);
+}
+void CPDF_StreamContentParser::Handle_SetGray_Fill()
+{
+ FX_FLOAT value = GetNumber(0);
+ CPDF_ColorSpace* pCS = CPDF_ColorSpace::GetStockCS(PDFCS_DEVICEGRAY);
+ m_pCurStates->m_ColorState.SetFillColor(pCS, &value, 1);
+}
+void CPDF_StreamContentParser::Handle_SetGray_Stroke()
+{
+ FX_FLOAT value = GetNumber(0);
+ CPDF_ColorSpace* pCS = CPDF_ColorSpace::GetStockCS(PDFCS_DEVICEGRAY);
+ m_pCurStates->m_ColorState.SetStrokeColor(pCS, &value, 1);
+}
+void CPDF_StreamContentParser::Handle_SetExtendGraphState()
+{
+ CFX_ByteString name = GetString(0);
+ CPDF_Dictionary* pGS = (CPDF_Dictionary*)FindResourceObj(FX_BSTRC("ExtGState"), name);
+ if (pGS == NULL || pGS->GetType() != PDFOBJ_DICTIONARY) {
+ m_bResourceMissing = TRUE;
+ return;
+ }
+ m_pCurStates->ProcessExtGS(pGS, this);
+}
+void CPDF_StreamContentParser::Handle_ClosePath()
+{
+ if (m_Options.m_bTextOnly) {
+ return;
+ }
+ if (m_PathPointCount == 0) {
+ return;
+ }
+ if (m_PathStartX != m_PathCurrentX || m_PathStartY != m_PathCurrentY) {
+ AddPathPoint(m_PathStartX, m_PathStartY, FXPT_LINETO | FXPT_CLOSEFIGURE);
+ } else if (m_pPathPoints[m_PathPointCount - 1].m_Flag != FXPT_MOVETO) {
+ m_pPathPoints[m_PathPointCount - 1].m_Flag |= FXPT_CLOSEFIGURE;
+ }
+}
+void CPDF_StreamContentParser::Handle_SetFlat()
+{
+#if !defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_)
+ m_pCurStates->m_GeneralState.GetModify()->m_Flatness = GetNumber(0);
+#endif
+}
+void CPDF_StreamContentParser::Handle_BeginImageData()
+{
+}
+void CPDF_StreamContentParser::Handle_SetLineJoin()
+{
+ m_pCurStates->m_GraphState.GetModify()->m_LineJoin = (CFX_GraphStateData::LineJoin)GetInteger(0);
+}
+void CPDF_StreamContentParser::Handle_SetLineCap()
+{
+ m_pCurStates->m_GraphState.GetModify()->m_LineCap = (CFX_GraphStateData::LineCap)GetInteger(0);
+}
+void CPDF_StreamContentParser::Handle_SetCMYKColor_Fill()
+{
+ REQUIRE_PARAMS(4);
+ FX_FLOAT values[4];
+ for (int i = 0; i < 4; i ++) {
+ values[i] = GetNumber(3 - i);
+ }
+ CPDF_ColorSpace* pCS = CPDF_ColorSpace::GetStockCS(PDFCS_DEVICECMYK);
+ m_pCurStates->m_ColorState.SetFillColor(pCS, values, 4);
+}
+void CPDF_StreamContentParser::Handle_SetCMYKColor_Stroke()
+{
+ REQUIRE_PARAMS(4);
+ FX_FLOAT values[4];
+ for (int i = 0; i < 4; i ++) {
+ values[i] = GetNumber(3 - i);
+ }
+ CPDF_ColorSpace* pCS = CPDF_ColorSpace::GetStockCS(PDFCS_DEVICECMYK);
+ m_pCurStates->m_ColorState.SetStrokeColor(pCS, values, 4);
+}
+void CPDF_StreamContentParser::Handle_LineTo()
+{
+ REQUIRE_PARAMS(2);
+ if (m_Options.m_bTextOnly) {
+ return;
+ }
+ AddPathPoint(GetNumber(1), GetNumber(0), FXPT_LINETO);
+}
+void CPDF_StreamContentParser::Handle_MoveTo()
+{
+ REQUIRE_PARAMS(2);
+ if (m_Options.m_bTextOnly) {
+#ifndef _FPDFAPI_MINI_
+ m_pSyntax->SkipPathObject();
+#endif
+ return;
+ }
+ AddPathPoint(GetNumber(1), GetNumber(0), FXPT_MOVETO);
+#ifndef _FPDFAPI_MINI_
+ ParsePathObject();
+#endif
+}
+void CPDF_StreamContentParser::Handle_SetMiterLimit()
+{
+ m_pCurStates->m_GraphState.GetModify()->m_MiterLimit = GetNumber(0);
+}
+void CPDF_StreamContentParser::Handle_MarkPlace()
+{
+}
+void CPDF_StreamContentParser::Handle_EndPath()
+{
+ if (m_Options.m_bTextOnly) {
+ return;
+ }
+ AddPathObject(0, FALSE);
+}
+void CPDF_StreamContentParser::Handle_SaveGraphState()
+{
+ CPDF_AllStates* pStates = FX_NEW CPDF_AllStates;
+ pStates->Copy(*m_pCurStates);
+ m_StateStack.Add(pStates);
+}
+void CPDF_StreamContentParser::Handle_RestoreGraphState()
+{
+ int size = m_StateStack.GetSize();
+ if (size == 0) {
+ return;
+ }
+ CPDF_AllStates* pStates = (CPDF_AllStates*)m_StateStack.GetAt(size - 1);
+ m_pCurStates->Copy(*pStates);
+ delete pStates;
+ m_StateStack.RemoveAt(size - 1);
+}
+void CPDF_StreamContentParser::Handle_Rectangle()
+{
+ if (m_Options.m_bTextOnly) {
+ return;
+ }
+ FX_FLOAT x = GetNumber(3), y = GetNumber(2);
+ FX_FLOAT w = GetNumber(1), h = GetNumber(0);
+ AddPathRect(x, y, w, h);
+}
+void CPDF_StreamContentParser::AddPathRect(FX_FLOAT x, FX_FLOAT y, FX_FLOAT w, FX_FLOAT h)
+{
+ AddPathPoint(x, y, FXPT_MOVETO);
+ AddPathPoint(x + w, y, FXPT_LINETO);
+ AddPathPoint(x + w, y + h, FXPT_LINETO);
+ AddPathPoint(x, y + h, FXPT_LINETO);
+ AddPathPoint(x, y, FXPT_LINETO | FXPT_CLOSEFIGURE);
+}
+void CPDF_StreamContentParser::Handle_SetRGBColor_Fill()
+{
+ REQUIRE_PARAMS(3);
+ FX_FLOAT values[3];
+ for (int i = 0; i < 3; i ++) {
+ values[i] = GetNumber(2 - i);
+ }
+ CPDF_ColorSpace* pCS = CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB);
+ m_pCurStates->m_ColorState.SetFillColor(pCS, values, 3);
+}
+void CPDF_StreamContentParser::Handle_SetRGBColor_Stroke()
+{
+ REQUIRE_PARAMS(3);
+ FX_FLOAT values[3];
+ for (int i = 0; i < 3; i ++) {
+ values[i] = GetNumber(2 - i);
+ }
+ CPDF_ColorSpace* pCS = CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB);
+ m_pCurStates->m_ColorState.SetStrokeColor(pCS, values, 3);
+}
+void CPDF_StreamContentParser::Handle_SetRenderIntent()
+{
+}
+void CPDF_StreamContentParser::Handle_CloseStrokePath()
+{
+ if (m_Options.m_bTextOnly) {
+ return;
+ }
+ Handle_ClosePath();
+ AddPathObject(0, TRUE);
+}
+void CPDF_StreamContentParser::Handle_StrokePath()
+{
+ if (m_Options.m_bTextOnly) {
+ return;
+ }
+ AddPathObject(0, TRUE);
+}
+void CPDF_StreamContentParser::Handle_SetColor_Fill()
+{
+ if (m_Options.m_bTextOnly) {
+ return;
+ }
+ FX_FLOAT values[4];
+ int nargs = m_ParamCount;
+ if (nargs > 4) {
+ nargs = 4;
+ }
+ for (int i = 0; i < nargs; i ++) {
+ values[i] = GetNumber(nargs - i - 1);
+ }
+ m_pCurStates->m_ColorState.SetFillColor(NULL, values, nargs);
+}
+void CPDF_StreamContentParser::Handle_SetColor_Stroke()
+{
+ if (m_Options.m_bTextOnly) {
+ return;
+ }
+ FX_FLOAT values[4];
+ int nargs = m_ParamCount;
+ if (nargs > 4) {
+ nargs = 4;
+ }
+ for (int i = 0; i < nargs; i ++) {
+ values[i] = GetNumber(nargs - i - 1);
+ }
+ m_pCurStates->m_ColorState.SetStrokeColor(NULL, values, nargs);
+}
+void CPDF_StreamContentParser::Handle_SetColorPS_Fill()
+{
+ if (m_Options.m_bTextOnly) {
+ return;
+ }
+ CPDF_Object* pLastParam = GetObject(0);
+ if (pLastParam == NULL) {
+ return;
+ }
+ int nargs = m_ParamCount;
+ int nvalues = nargs;
+ if (pLastParam->GetType() == PDFOBJ_NAME) {
+ nvalues --;
+ }
+ FX_FLOAT* values = NULL;
+ if (nvalues) {
+ values = FX_Alloc(FX_FLOAT, nvalues);
+ for (int i = 0; i < nvalues; i ++) {
+ values[i] = GetNumber(nargs - i - 1);
+ }
+ }
+ if (nvalues != nargs) {
+ CPDF_Pattern* pPattern = FindPattern(GetString(0), FALSE);
+ if (pPattern) {
+ m_pCurStates->m_ColorState.SetFillPattern(pPattern, values, nvalues);
+ }
+ } else {
+ m_pCurStates->m_ColorState.SetFillColor(NULL, values, nvalues);
+ }
+ if (values) {
+ FX_Free(values);
+ }
+}
+void CPDF_StreamContentParser::Handle_SetColorPS_Stroke()
+{
+ if (m_Options.m_bTextOnly) {
+ return;
+ }
+ CPDF_Object* pLastParam = GetObject(0);
+ if (pLastParam == NULL) {
+ return;
+ }
+ int nargs = m_ParamCount;
+ int nvalues = nargs;
+ if (pLastParam->GetType() == PDFOBJ_NAME) {
+ nvalues --;
+ }
+ FX_FLOAT* values = NULL;
+ if (nvalues) {
+ values = FX_Alloc(FX_FLOAT, nvalues);
+ for (int i = 0; i < nvalues; i ++) {
+ values[i] = GetNumber(nargs - i - 1);
+ }
+ }
+ if (nvalues != nargs) {
+ CPDF_Pattern* pPattern = FindPattern(GetString(0), FALSE);
+ if (pPattern) {
+ m_pCurStates->m_ColorState.SetStrokePattern(pPattern, values, nvalues);
+ }
+ } else {
+ m_pCurStates->m_ColorState.SetStrokeColor(NULL, values, nvalues);
+ }
+ if (values) {
+ FX_Free(values);
+ }
+}
+CFX_FloatRect _GetShadingBBox(CPDF_Stream* pStream, int type, const CFX_AffineMatrix* pMatrix,
+ CPDF_Function** pFuncs, int nFuncs, CPDF_ColorSpace* pCS);
+void CPDF_StreamContentParser::Handle_ShadeFill()
+{
+ if (m_Options.m_bTextOnly) {
+ return;
+ }
+ CPDF_Pattern* pPattern = FindPattern(GetString(0), TRUE);
+ if (pPattern == NULL) {
+ return;
+ }
+ if (pPattern->m_PatternType != PATTERN_SHADING) {
+ return;
+ }
+ CPDF_ShadingPattern* pShading = (CPDF_ShadingPattern*)pPattern;
+ if (!pShading->m_bShadingObj) {
+ return;
+ }
+ if (!pShading->Load()) {
+ return;
+ }
+ CPDF_ShadingObject* pObj = FX_NEW CPDF_ShadingObject;
+ pObj->m_pShading = pShading;
+ SetGraphicStates(pObj, FALSE, FALSE, FALSE);
+ pObj->m_Matrix = m_pCurStates->m_CTM;
+ pObj->m_Matrix.Concat(m_mtContentToUser);
+ CFX_FloatRect bbox;
+ if (!pObj->m_ClipPath.IsNull()) {
+ bbox = pObj->m_ClipPath.GetClipBox();
+ } else {
+ bbox = m_BBox;
+ }
+ if (pShading->m_ShadingType >= 4) {
+ bbox.Intersect(_GetShadingBBox((CPDF_Stream*)pShading->m_pShadingObj, pShading->m_ShadingType, &pObj->m_Matrix,
+ pShading->m_pFunctions, pShading->m_nFuncs, pShading->m_pCS));
+ }
+ pObj->m_Left = bbox.left;
+ pObj->m_Right = bbox.right;
+ pObj->m_Top = bbox.top;
+ pObj->m_Bottom = bbox.bottom;
+ m_pObjectList->m_ObjectList.AddTail(pObj);
+}
+void CPDF_StreamContentParser::Handle_SetCharSpace()
+{
+ m_pCurStates->m_TextState.GetModify()->m_CharSpace = GetNumber(0);
+}
+void CPDF_StreamContentParser::Handle_MoveTextPoint()
+{
+ m_pCurStates->m_TextLineX += GetNumber(1);
+ m_pCurStates->m_TextLineY += GetNumber(0);
+ m_pCurStates->m_TextX = m_pCurStates->m_TextLineX;
+ m_pCurStates->m_TextY = m_pCurStates->m_TextLineY;
+}
+void CPDF_StreamContentParser::Handle_MoveTextPoint_SetLeading()
+{
+ Handle_MoveTextPoint();
+ m_pCurStates->m_TextLeading = -GetNumber(0);
+}
+void CPDF_StreamContentParser::Handle_SetFont()
+{
+ FX_FLOAT fs = GetNumber(0);
+ if (fs == 0) {
+ fs = m_DefFontSize;
+ }
+ m_pCurStates->m_TextState.GetModify()->m_FontSize = fs;
+ CPDF_Font* pFont = FindFont(GetString(1));
+ if (pFont) {
+ m_pCurStates->m_TextState.SetFont(pFont);
+ }
+}
+CPDF_Object* CPDF_StreamContentParser::FindResourceObj(FX_BSTR type, const CFX_ByteString& name)
+{
+ if (m_pResources == NULL) {
+ return NULL;
+ }
+ if (m_pResources == m_pPageResources) {
+ CPDF_Dictionary* pList = m_pResources->GetDict(type);
+ if (pList == NULL) {
+ return NULL;
+ }
+ CPDF_Object* pRes = pList->GetElementValue(name);
+ return pRes;
+ }
+ CPDF_Dictionary* pList = m_pResources->GetDict(type);
+ if (pList == NULL) {
+ if (m_pPageResources == NULL) {
+ return NULL;
+ }
+ CPDF_Dictionary* pList = m_pPageResources->GetDict(type);
+ if (pList == NULL) {
+ return NULL;
+ }
+ CPDF_Object* pRes = pList->GetElementValue(name);
+ return pRes;
+ }
+ CPDF_Object* pRes = pList->GetElementValue(name);
+ return pRes;
+}
+CPDF_Font* CPDF_StreamContentParser::FindFont(const CFX_ByteString& name)
+{
+ CPDF_Dictionary* pFontDict = (CPDF_Dictionary*)FindResourceObj(FX_BSTRC("Font"), name);
+ if (pFontDict == NULL || pFontDict->GetType() != PDFOBJ_DICTIONARY) {
+ m_bResourceMissing = TRUE;
+ return CPDF_Font::GetStockFont(m_pDocument, FX_BSTRC("Helvetica"));
+ }
+ CPDF_Font* pFont = m_pDocument->LoadFont(pFontDict);
+ if (pFont && pFont->GetType3Font()) {
+ pFont->GetType3Font()->SetPageResources(m_pResources);
+ pFont->GetType3Font()->CheckType3FontMetrics();
+ }
+ return pFont;
+}
+CPDF_ColorSpace* CPDF_StreamContentParser::FindColorSpace(const CFX_ByteString& name)
+{
+ if (name == FX_BSTRC("Pattern")) {
+ return CPDF_ColorSpace::GetStockCS(PDFCS_PATTERN);
+ }
+ if (name == FX_BSTRC("DeviceGray") || name == FX_BSTRC("DeviceCMYK") || name == FX_BSTRC("DeviceRGB")) {
+ CFX_ByteString defname = "Default";
+ defname += name.Mid(7);
+ CPDF_Object* pDefObj = FindResourceObj(FX_BSTRC("ColorSpace"), defname);
+ if (pDefObj == NULL) {
+ if (name == FX_BSTRC("DeviceGray")) {
+ return CPDF_ColorSpace::GetStockCS(PDFCS_DEVICEGRAY);
+ }
+ if (name == FX_BSTRC("DeviceRGB")) {
+ return CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB);
+ }
+ return CPDF_ColorSpace::GetStockCS(PDFCS_DEVICECMYK);
+ }
+ return m_pDocument->LoadColorSpace(pDefObj);
+ }
+ CPDF_Object* pCSObj = FindResourceObj(FX_BSTRC("ColorSpace"), name);
+ if (pCSObj == NULL) {
+ m_bResourceMissing = TRUE;
+ return NULL;
+ }
+ return m_pDocument->LoadColorSpace(pCSObj);
+}
+CPDF_Pattern* CPDF_StreamContentParser::FindPattern(const CFX_ByteString& name, FX_BOOL bShading)
+{
+ CPDF_Object* pPattern = FindResourceObj(bShading ? FX_BSTRC("Shading") : FX_BSTRC("Pattern"), name);
+ if (pPattern == NULL || (pPattern->GetType() != PDFOBJ_DICTIONARY &&
+ pPattern->GetType() != PDFOBJ_STREAM)) {
+ m_bResourceMissing = TRUE;
+ return NULL;
+ }
+ return m_pDocument->LoadPattern(pPattern, bShading, &m_pCurStates->m_ParentMatrix);
+}
+void CPDF_StreamContentParser::ConvertTextSpace(FX_FLOAT& x, FX_FLOAT& y)
+{
+ m_pCurStates->m_TextMatrix.Transform(x, y, x, y);
+ ConvertUserSpace(x, y);
+}
+void CPDF_StreamContentParser::ConvertUserSpace(FX_FLOAT& x, FX_FLOAT& y)
+{
+ m_pCurStates->m_CTM.Transform(x, y, x, y);
+ m_mtContentToUser.Transform(x, y, x, y);
+}
+void CPDF_StreamContentParser::AddTextObject(CFX_ByteString* pStrs, FX_FLOAT fInitKerning, FX_FLOAT* pKerning, int nsegs)
+{
+ CPDF_Font* pFont = m_pCurStates->m_TextState.GetFont();
+ if (pFont == NULL) {
+ return;
+ }
+ if (fInitKerning != 0) {
+ if (!pFont->IsVertWriting()) {
+ m_pCurStates->m_TextX -= FXSYS_Mul(fInitKerning, m_pCurStates->m_TextState.GetFontSize()) / 1000;
+ } else {
+ m_pCurStates->m_TextY -= FXSYS_Mul(fInitKerning, m_pCurStates->m_TextState.GetFontSize()) / 1000;
+ }
+ }
+ if (nsegs == 0) {
+ return;
+ }
+ int textmode;
+ if (pFont->GetFontType() == PDFFONT_TYPE3) {
+ textmode = 0;
+ } else {
+ textmode = m_pCurStates->m_TextState.GetObject()->m_TextMode;
+ }
+ CPDF_TextObject* pText = FX_NEW CPDF_TextObject;
+ m_pLastTextObject = pText;
+ SetGraphicStates(pText, TRUE, TRUE, TRUE);
+ if (textmode && textmode != 3 && textmode != 4 && textmode != 7) {
+ FX_FLOAT* pCTM = pText->m_TextState.GetModify()->m_CTM;
+ pCTM[0] = m_pCurStates->m_CTM.a;
+ pCTM[1] = m_pCurStates->m_CTM.c;
+ pCTM[2] = m_pCurStates->m_CTM.b;
+ pCTM[3] = m_pCurStates->m_CTM.d;
+ }
+ pText->SetSegments(pStrs, pKerning, nsegs);
+ pText->m_PosX = m_pCurStates->m_TextX;
+ pText->m_PosY = m_pCurStates->m_TextY + m_pCurStates->m_TextRise;
+ ConvertTextSpace(pText->m_PosX, pText->m_PosY);
+ FX_FLOAT x_advance, y_advance;
+ pText->CalcPositionData(&x_advance, &y_advance, m_pCurStates->m_TextHorzScale, m_Level);
+ m_pCurStates->m_TextX += x_advance;
+ m_pCurStates->m_TextY += y_advance;
+ if (textmode > 3) {
+ CPDF_TextObject* pCopy = FX_NEW CPDF_TextObject;
+ pCopy->Copy(pText);
+ m_ClipTextList.Add(pCopy);
+ }
+ m_pObjectList->m_ObjectList.AddTail(pText);
+ if (pKerning && pKerning[nsegs - 1] != 0) {
+ if (!pFont->IsVertWriting()) {
+ m_pCurStates->m_TextX -= FXSYS_Mul(pKerning[nsegs - 1], m_pCurStates->m_TextState.GetFontSize()) / 1000;
+ } else {
+ m_pCurStates->m_TextY -= FXSYS_Mul(pKerning[nsegs - 1], m_pCurStates->m_TextState.GetFontSize()) / 1000;
+ }
+ }
+}
+void CPDF_StreamContentParser::Handle_ShowText()
+{
+ CFX_ByteString str = GetString(0);
+ if (str.IsEmpty()) {
+ return;
+ }
+ AddTextObject(&str, 0, NULL, 1);
+}
+void CPDF_StreamContentParser::Handle_ShowText_Positioning()
+{
+ CPDF_Array* pArray = GetObject(0)->GetArray();
+ if (pArray == NULL) {
+ return;
+ }
+ int n = pArray->GetCount(), nsegs = 0, i;
+ for (i = 0; i < n; i ++) {
+ CPDF_Object* pObj = pArray->GetElementValue(i);
+ if (pObj->GetType() == PDFOBJ_STRING) {
+ nsegs ++;
+ }
+ }
+ if (nsegs == 0) {
+ for (i = 0; i < n; i ++) {
+ m_pCurStates->m_TextX -= FXSYS_Mul(pArray->GetNumber(i), m_pCurStates->m_TextState.GetFontSize()) / 1000;
+ };
+ return;
+ }
+ CFX_ByteString* pStrs;
+ FX_NEW_VECTOR(pStrs, CFX_ByteString, nsegs);
+ FX_FLOAT* pKerning = FX_Alloc(FX_FLOAT, nsegs);
+ int iSegment = 0;
+ FX_FLOAT fInitKerning = 0;
+ for (i = 0; i < n; i ++) {
+ CPDF_Object* pObj = pArray->GetElementValue(i);
+ if (pObj->GetType() == PDFOBJ_STRING) {
+ CFX_ByteString str = pObj->GetString();
+ if (str.IsEmpty()) {
+ continue;
+ }
+ pStrs[iSegment] = str;
+ pKerning[iSegment ++] = 0;
+ } else {
+ if (iSegment == 0) {
+ fInitKerning += pObj->GetNumber();
+ } else {
+ pKerning[iSegment - 1] += pObj->GetNumber();
+ }
+ }
+ }
+ AddTextObject(pStrs, fInitKerning, pKerning, iSegment);
+ FX_DELETE_VECTOR(pStrs, CFX_ByteString, nsegs);
+ FX_Free(pKerning);
+}
+void CPDF_StreamContentParser::Handle_SetTextLeading()
+{
+ m_pCurStates->m_TextLeading = GetNumber(0);
+}
+void CPDF_StreamContentParser::Handle_SetTextMatrix()
+{
+ m_pCurStates->m_TextMatrix.Set(GetNumber16(5), GetNumber16(4), GetNumber16(3),
+ GetNumber16(2), GetNumber(1), GetNumber(0));
+ OnChangeTextMatrix();
+ m_pCurStates->m_TextX = 0;
+ m_pCurStates->m_TextY = 0;
+ m_pCurStates->m_TextLineX = 0;
+ m_pCurStates->m_TextLineY = 0;
+}
+void CPDF_StreamContentParser::OnChangeTextMatrix()
+{
+ CFX_AffineMatrix text_matrix(m_pCurStates->m_TextHorzScale, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f);
+ text_matrix.Concat(m_pCurStates->m_TextMatrix);
+ text_matrix.Concat(m_pCurStates->m_CTM);
+ text_matrix.Concat(m_mtContentToUser);
+ FX_FLOAT* pTextMatrix = m_pCurStates->m_TextState.GetModify()->m_Matrix;
+ pTextMatrix[0] = text_matrix.a;
+ pTextMatrix[1] = text_matrix.c;
+ pTextMatrix[2] = text_matrix.b;
+ pTextMatrix[3] = text_matrix.d;
+}
+void CPDF_StreamContentParser::Handle_SetTextRenderMode()
+{
+ int mode = GetInteger(0);
+ if (mode < 0 || mode > 7) {
+ return;
+ }
+ m_pCurStates->m_TextState.GetModify()->m_TextMode = mode;
+}
+void CPDF_StreamContentParser::Handle_SetTextRise()
+{
+ m_pCurStates->m_TextRise = GetNumber(0);
+}
+void CPDF_StreamContentParser::Handle_SetWordSpace()
+{
+ m_pCurStates->m_TextState.GetModify()->m_WordSpace = GetNumber(0);
+}
+void CPDF_StreamContentParser::Handle_SetHorzScale()
+{
+ if (m_ParamCount != 1) {
+ return;
+ }
+ m_pCurStates->m_TextHorzScale = GetNumber(0) / 100;
+ OnChangeTextMatrix();
+}
+void CPDF_StreamContentParser::Handle_MoveToNextLine()
+{
+ m_pCurStates->m_TextLineY -= m_pCurStates->m_TextLeading;
+ m_pCurStates->m_TextX = m_pCurStates->m_TextLineX;
+ m_pCurStates->m_TextY = m_pCurStates->m_TextLineY;
+}
+void CPDF_StreamContentParser::Handle_CurveTo_23()
+{
+ if (m_Options.m_bTextOnly) {
+ return;
+ }
+ AddPathPoint(m_PathCurrentX, m_PathCurrentY, FXPT_BEZIERTO);
+ AddPathPoint(GetNumber(3), GetNumber(2), FXPT_BEZIERTO);
+ AddPathPoint(GetNumber(1), GetNumber(0), FXPT_BEZIERTO);
+}
+void CPDF_StreamContentParser::Handle_SetLineWidth()
+{
+ FX_FLOAT width = GetNumber(0);
+ m_pCurStates->m_GraphState.GetModify()->m_LineWidth = width;
+}
+void CPDF_StreamContentParser::Handle_Clip()
+{
+ m_PathClipType = FXFILL_WINDING;
+}
+void CPDF_StreamContentParser::Handle_EOClip()
+{
+ m_PathClipType = FXFILL_ALTERNATE;
+}
+void CPDF_StreamContentParser::Handle_CurveTo_13()
+{
+ if (m_Options.m_bTextOnly) {
+ return;
+ }
+ AddPathPoint(GetNumber(3), GetNumber(2), FXPT_BEZIERTO);
+ AddPathPoint(GetNumber(1), GetNumber(0), FXPT_BEZIERTO);
+ AddPathPoint(GetNumber(1), GetNumber(0), FXPT_BEZIERTO);
+}
+void CPDF_StreamContentParser::Handle_NextLineShowText()
+{
+ Handle_MoveToNextLine();
+ Handle_ShowText();
+}
+void CPDF_StreamContentParser::Handle_NextLineShowText_Space()
+{
+ m_pCurStates->m_TextState.GetModify()->m_WordSpace = GetNumber(2);
+ m_pCurStates->m_TextState.GetModify()->m_CharSpace = GetNumber(1);
+ Handle_NextLineShowText();
+}
+void CPDF_StreamContentParser::Handle_Invalid()
+{
+}
+void CPDF_StreamContentParser::AddPathPoint(FX_FLOAT x, FX_FLOAT y, int flag)
+{
+ m_PathCurrentX = x;
+ m_PathCurrentY = y;
+ if (flag == FXPT_MOVETO) {
+ m_PathStartX = x;
+ m_PathStartY = y;
+ if (m_PathPointCount && m_pPathPoints[m_PathPointCount - 1].m_Flag == FXPT_MOVETO) {
+ m_pPathPoints[m_PathPointCount - 1].m_PointX = x;
+ m_pPathPoints[m_PathPointCount - 1].m_PointY = y;
+ return;
+ }
+ } else if (m_PathPointCount == 0) {
+ return;
+ }
+ m_PathPointCount ++;
+ if (m_PathPointCount > m_PathAllocSize) {
+ int newsize = m_PathPointCount + 256;
+ FX_PATHPOINT* pNewPoints = FX_Alloc(FX_PATHPOINT, newsize);
+ if (m_PathAllocSize) {
+ FXSYS_memcpy32(pNewPoints, m_pPathPoints, m_PathAllocSize * sizeof(FX_PATHPOINT));
+ FX_Free(m_pPathPoints);
+ }
+ m_pPathPoints = pNewPoints;
+ m_PathAllocSize = newsize;
+ }
+ m_pPathPoints[m_PathPointCount - 1].m_Flag = flag;
+ m_pPathPoints[m_PathPointCount - 1].m_PointX = x;
+ m_pPathPoints[m_PathPointCount - 1].m_PointY = y;
+}
+void CPDF_StreamContentParser::AddPathObject(int FillType, FX_BOOL bStroke)
+{
+ int PathPointCount = m_PathPointCount, PathClipType = m_PathClipType;
+ m_PathPointCount = 0;
+ m_PathClipType = 0;
+ if (PathPointCount <= 1) {
+ if (PathPointCount && PathClipType) {
+ CPDF_Path path;
+ path.New()->AppendRect(0, 0, 0, 0);
+ m_pCurStates->m_ClipPath.AppendPath(path, FXFILL_WINDING, TRUE);
+ }
+ return;
+ }
+ if (PathPointCount && m_pPathPoints[PathPointCount - 1].m_Flag == FXPT_MOVETO) {
+ PathPointCount --;
+ }
+ CPDF_Path Path;
+ CFX_PathData* pPathData = Path.New();
+ pPathData->SetPointCount(PathPointCount);
+ FXSYS_memcpy32(pPathData->GetPoints(), m_pPathPoints, sizeof(FX_PATHPOINT) * PathPointCount);
+ CFX_AffineMatrix matrix = m_pCurStates->m_CTM;
+ matrix.Concat(m_mtContentToUser);
+ if (bStroke || FillType) {
+ CPDF_PathObject* pPathObj = FX_NEW CPDF_PathObject;
+ pPathObj->m_bStroke = bStroke;
+ pPathObj->m_FillType = FillType;
+ pPathObj->m_Path = Path;
+ pPathObj->m_Matrix = matrix;
+ SetGraphicStates(pPathObj, TRUE, FALSE, TRUE);
+ pPathObj->CalcBoundingBox();
+ m_pObjectList->m_ObjectList.AddTail(pPathObj);
+ }
+ if (PathClipType) {
+ if (!matrix.IsIdentity()) {
+ Path.Transform(&matrix);
+ matrix.SetIdentity();
+ }
+ m_pCurStates->m_ClipPath.AppendPath(Path, PathClipType, TRUE);
+ }
+}
+CFX_ByteString _FPDF_ByteStringFromHex(CFX_BinaryBuf& src_buf)
+{
+ CFX_ByteTextBuf buf;
+ FX_BOOL bFirst = TRUE;
+ int code = 0;
+ FX_LPCBYTE str = src_buf.GetBuffer();
+ FX_DWORD size = src_buf.GetSize();
+ for (FX_DWORD i = 0; i < size; i ++) {
+ FX_BYTE ch = str[i];
+ if (ch >= '0' && ch <= '9') {
+ if (bFirst) {
+ code = (ch - '0') * 16;
+ } else {
+ code += ch - '0';
+ buf.AppendChar((char)code);
+ }
+ bFirst = !bFirst;
+ } else if (ch >= 'A' && ch <= 'F') {
+ if (bFirst) {
+ code = (ch - 'A' + 10) * 16;
+ } else {
+ code += ch - 'A' + 10;
+ buf.AppendChar((char)code);
+ }
+ bFirst = !bFirst;
+ } else if (ch >= 'a' && ch <= 'f') {
+ if (bFirst) {
+ code = (ch - 'a' + 10) * 16;
+ } else {
+ code += ch - 'a' + 10;
+ buf.AppendChar((char)code);
+ }
+ bFirst = !bFirst;
+ }
+ }
+ if (!bFirst) {
+ buf.AppendChar((char)code);
+ }
+ return buf.GetByteString();
+}
diff --git a/core/src/fpdfapi/fpdf_page/fpdf_page_parser_new.cpp b/core/src/fpdfapi/fpdf_page/fpdf_page_parser_new.cpp
index 2eeb1feff5..5442f9b4ec 100644
--- a/core/src/fpdfapi/fpdf_page/fpdf_page_parser_new.cpp
+++ b/core/src/fpdfapi/fpdf_page/fpdf_page_parser_new.cpp
@@ -1,822 +1,822 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../../include/fpdfapi/fpdf_page.h"
-#include "../../../include/fpdfapi/fpdf_module.h"
-#include "pageint.h"
-#if defined(_FPDFAPI_MINI_)
-extern const FX_LPCSTR _PDF_CharType;
-void CPDF_StreamContentParser::InputData(FX_LPCBYTE src_buf, FX_DWORD src_size)
-{
- if (m_Level > _FPDF_MAX_FORM_LEVEL_) {
- return;
- }
- for (FX_DWORD i = 0; i < src_size; i ++) {
- int ch = src_buf[i];
- int type = _PDF_CharType[ch];
-start:
- switch (m_WordState) {
- case 0:
- if (type == 'W') {
- } else if (type == 'N') {
- m_WordState = 5;
- m_pWordBuf[0] = ch;
- m_WordSize = 1;
- } else if (type == 'R') {
- m_WordState = 4;
- m_pWordBuf[0] = ch;
- m_WordSize = 1;
- } else switch (ch) {
- case '/':
- m_WordState = 2;
- m_WordSize = 0;
- break;
- case '[':
- StartArray();
- break;
- case ']':
- EndArray();
- break;
- case '(':
- m_WordState = 7;
- m_StringLevel = 1;
- m_StringState = 0;
- m_StringBuf.Clear();
- break;
- case '<':
- m_WordState = 3;
- break;
- case '>':
- m_WordState = 8;
- break;
- case '%':
- m_WordState = 1;
- break;
- }
- break;
- case 1:
- if (ch == '\n' || ch == '\r') {
- m_WordState = 0;
- }
- break;
- case 2:
- if (type != 'R' && type != 'N') {
- EndName();
- m_WordState = 0;
- goto start;
- }
- if (m_WordSize < 256) {
- m_pWordBuf[m_WordSize++] = ch;
- }
- break;
- case 3:
- if (ch == '<') {
- StartDict();
- m_WordState = 0;
- } else {
- m_StringBuf.Clear();
- m_WordState = 6;
- goto start;
- }
- break;
- case 4:
- if (type != 'R' && type != 'N') {
- m_WordState = 0;
- EndKeyword();
- if (m_bAbort) {
- return;
- }
- goto start;
- }
- if (m_WordSize < 256) {
- m_pWordBuf[m_WordSize++] = ch;
- }
- break;
- case 5:
- if (type != 'N') {
- EndNumber();
- m_WordState = 0;
- goto start;
- }
- if (m_WordSize < 256) {
- m_pWordBuf[m_WordSize++] = ch;
- }
- break;
- case 6:
- if (ch == '>') {
- EndHexString();
- m_WordState = 0;
- } else {
- m_StringBuf.AppendByte(ch);
- }
- break;
- case 7:
- switch (m_StringState) {
- case 0:
- if (ch == ')') {
- m_StringLevel --;
- if (m_StringLevel == 0) {
- EndString();
- m_WordState = 0;
- break;
- }
- m_StringBuf.AppendByte(')');
- } else if (ch == '(') {
- m_StringLevel ++;
- m_StringBuf.AppendByte('(');
- } else if (ch == '\\') {
- m_StringState = 1;
- } else {
- m_StringBuf.AppendByte((char)ch);
- }
- break;
- case 1:
- if (ch >= '0' && ch <= '7') {
- m_EscCode = ch - '0';
- m_StringState = 2;
- break;
- }
- if (ch == 'n') {
- m_StringBuf.AppendByte('\n');
- } else if (ch == 'r') {
- m_StringBuf.AppendByte('\r');
- } else if (ch == 't') {
- m_StringBuf.AppendByte('\t');
- } else if (ch == 'b') {
- m_StringBuf.AppendByte('\b');
- } else if (ch == 'f') {
- m_StringBuf.AppendByte('\f');
- } else if (ch == '\\') {
- m_StringBuf.AppendByte('\\');
- } else if (ch == '(') {
- m_StringBuf.AppendByte('(');
- } else if (ch == ')') {
- m_StringBuf.AppendByte(')');
- } else if (ch == '\r') {
- m_StringState = 4;
- break;
- } else if (ch == '\n') {
- } else {
- m_StringBuf.AppendByte(ch);
- }
- m_StringState = 0;
- break;
- case 2:
- if (ch >= '0' && ch <= '7') {
- m_EscCode = m_EscCode * 8 + ch - '0';
- m_StringState = 3;
- } else {
- m_StringBuf.AppendByte(m_EscCode);
- m_StringState = 0;
- goto start;
- }
- break;
- case 3:
- if (ch >= '0' && ch <= '7') {
- m_EscCode = m_EscCode * 8 + ch - '0';
- m_StringBuf.AppendByte(m_EscCode);
- m_StringState = 0;
- } else {
- m_StringBuf.AppendByte(m_EscCode);
- m_StringState = 0;
- goto start;
- }
- break;
- case 4:
- m_StringState = 0;
- if (ch != '\n') {
- goto start;
- }
- break;
- }
- break;
- case 8:
- m_WordState = 0;
- if (ch == '>') {
- EndDict();
- } else {
- goto start;
- }
- break;
- case 9:
- switch (m_InlineImageState) {
- case 0:
- if (type == 'W' || type == 'D') {
- m_InlineImageState = 1;
- m_InlineWhiteChar = ch;
- } else {
- m_StringBuf.AppendByte(ch);
- }
- break;
- case 1:
- m_StringBuf.AppendByte(m_InlineWhiteChar);
- if (ch == 'I') {
- m_InlineImageState = 2;
- } else {
- m_InlineImageState = 0;
- goto start;
- }
- break;
- case 2:
- if (ch == 'D') {
- m_InlineImageState = 3;
- } else {
- m_StringBuf.AppendByte('I');
- m_InlineImageState = 0;
- goto start;
- }
- break;
- case 3:
- EndImageDict();
- break;
- }
- break;
- case 10:
- switch (m_InlineImageState) {
- case 0:
- if (type == 'W') {
- m_InlineImageState = 1;
- m_InlineWhiteChar = ch;
- } else {
- m_ImageSrcBuf.AppendByte(ch);
- }
- break;
- case 1:
- if (ch == 'E') {
- m_InlineImageState = 2;
- } else {
- m_ImageSrcBuf.AppendByte(m_InlineWhiteChar);
- m_InlineImageState = 0;
- goto start;
- }
- break;
- case 2:
- if (ch == 'I') {
- m_InlineImageState = 3;
- } else {
- m_ImageSrcBuf.AppendByte(m_InlineWhiteChar);
- m_ImageSrcBuf.AppendByte('E');
- m_InlineImageState = 0;
- goto start;
- }
- break;
- case 3:
- if (type == 'W') {
- EndInlineImage();
- } else {
- m_ImageSrcBuf.AppendByte(m_InlineWhiteChar);
- m_ImageSrcBuf.AppendByte('E');
- m_ImageSrcBuf.AppendByte('I');
- m_InlineImageState = 0;
- goto start;
- }
- break;
- }
- break;
- case 11:
- if (m_InlineImageState < m_ImageSrcBuf.GetSize()) {
- m_ImageSrcBuf.GetBuffer()[m_InlineImageState ++] = ch;
- } else {
- if (ch == 'I') {
- EndInlineImage();
- }
- }
- break;
- }
- }
-}
-void CPDF_StreamContentParser::Finish()
-{
- switch (m_WordState) {
- case 0:
- break;
- case 1:
- break;
- case 2:
- EndName();
- break;
- case 3:
- break;
- case 4:
- EndKeyword();
- break;
- case 5:
- EndNumber();
- break;
- case 6:
- EndHexString();
- break;
- case 7:
- EndString();
- break;
- case 8:
- break;
- case 9:
- break;
- case 10:
- EndInlineImage();
- break;
- }
- m_WordState = 0;
-}
-void CPDF_StreamContentParser::AddContainer(CPDF_Object* pObject)
-{
- if (m_ObjectSize) {
- m_pObjectState[m_ObjectSize] = SetToCurObj(pObject);
- }
- FXSYS_assert(m_ObjectSize < _FPDF_MAX_OBJECT_STACK_SIZE_);
- m_pObjectStack[m_ObjectSize++] = pObject;
-}
-FX_BOOL CPDF_StreamContentParser::SetToCurObj(CPDF_Object* pObject)
-{
- if (m_ObjectSize == 0) {
- AddObjectParam(pObject);
- return TRUE;
- }
- FX_BOOL bInArrayOrDict = TRUE;
- CPDF_Object* pCurObj = m_pObjectStack[m_ObjectSize - 1];
- if (pCurObj->GetType() == PDFOBJ_ARRAY) {
- ((CPDF_Array*)pCurObj)->Add(pObject, m_pDocument);
- } else {
- if (!m_bDictName && m_pDictName[0]) {
- ((CPDF_Dictionary*)pCurObj)->SetAt((FX_LPCSTR)m_pDictName, pObject, m_pDocument);
- } else {
- bInArrayOrDict = FALSE;
- }
- m_bDictName = TRUE;
- }
- return bInArrayOrDict;
-}
-void CPDF_StreamContentParser::StartArray()
-{
- if (m_ObjectSize)
- if (m_pObjectStack[0]->GetType() != PDFOBJ_DICTIONARY && m_pObjectStack[m_ObjectSize - 1]->GetType() == PDFOBJ_ARRAY) {
- return;
- }
- CPDF_Array* pArray = FX_NEW CPDF_Array;
- AddContainer(pArray);
-}
-void CPDF_StreamContentParser::EndArray()
-{
- if (m_ObjectSize == 0) {
- return;
- }
- CPDF_Object* pCurObj = m_pObjectStack[m_ObjectSize - 1];
- if (pCurObj->GetType() != PDFOBJ_ARRAY) {
- return;
- }
- m_ObjectSize --;
- if (m_ObjectSize == 0) {
- AddObjectParam(pCurObj);
- } else {
- if (!m_pObjectState[m_ObjectSize]) {
- pCurObj->Release();
- }
- }
- m_pObjectState[m_ObjectSize] = FALSE;
-}
-void CPDF_StreamContentParser::StartDict()
-{
- CPDF_Dictionary* pDict = FX_NEW CPDF_Dictionary;
- AddContainer(pDict);
- m_bDictName = TRUE;
-}
-void CPDF_StreamContentParser::EndDict()
-{
- if (m_ObjectSize == 0) {
- return;
- }
- CPDF_Object* pCurObj = m_pObjectStack[m_ObjectSize - 1];
- if (pCurObj->GetType() != PDFOBJ_DICTIONARY) {
- return;
- }
- m_ObjectSize --;
- if (m_ObjectSize == 0) {
- AddObjectParam(pCurObj);
- } else {
- if (!m_pObjectState[m_ObjectSize]) {
- pCurObj->Release();
- }
- }
- m_pObjectState[m_ObjectSize] = FALSE;
-}
-void CPDF_StreamContentParser::EndName()
-{
- if (m_ObjectSize == 0) {
- AddNameParam((FX_LPCSTR)m_pWordBuf, m_WordSize);
- return;
- }
- CPDF_Object* pCurObj = m_pObjectStack[m_ObjectSize - 1];
- if (pCurObj->GetType() == PDFOBJ_ARRAY) {
- ((CPDF_Array*)pCurObj)->AddName(CFX_ByteString(m_pWordBuf, m_WordSize));
- } else {
- if (m_bDictName) {
- FXSYS_memcpy32(m_pDictName, m_pWordBuf, m_WordSize);
- m_pDictName[m_WordSize] = 0;
- } else {
- if (m_pDictName[0] != 0) {
- ((CPDF_Dictionary*)pCurObj)->SetAtName((FX_LPCSTR)m_pDictName, CFX_ByteString(m_pWordBuf, m_WordSize));
- }
- }
- m_bDictName = !m_bDictName;
- }
-}
-void CPDF_StreamContentParser::EndNumber()
-{
- if (m_ObjectSize == 0) {
- AddNumberParam((FX_LPCSTR)m_pWordBuf, m_WordSize);
- return;
- }
- CPDF_Number *pObj = FX_NEW CPDF_Number(CFX_ByteStringC(m_pWordBuf, m_WordSize));
- if (!SetToCurObj(pObj)) {
- pObj->Release();
- }
-}
-extern CFX_ByteString _FPDF_ByteStringFromHex(CFX_BinaryBuf& src_buf);
-void CPDF_StreamContentParser::EndHexString()
-{
- CPDF_String *pObj = FX_NEW CPDF_String(_FPDF_ByteStringFromHex(m_StringBuf), TRUE);
- if (!SetToCurObj(pObj)) {
- pObj->Release();
- }
-}
-void CPDF_StreamContentParser::EndString()
-{
- CPDF_String *pObj = FX_NEW CPDF_String(m_StringBuf.GetByteString());
- if (!SetToCurObj(pObj)) {
- pObj->Release();
- }
-}
-void CPDF_StreamContentParser::Handle_BeginImage(void)
-{
- m_WordState = 9;
- m_InlineImageState = 0;
- m_StringBuf.Clear();
-}
-void _PDF_ReplaceAbbr(CPDF_Object* pObj);
-void CPDF_StreamContentParser::EndImageDict()
-{
- if (m_StringBuf.GetSize() != m_LastImageDict.GetSize() ||
- FXSYS_memcmp32(m_StringBuf.GetBuffer(), m_LastImageDict.GetBuffer(), m_StringBuf.GetSize())) {
- m_WordState = 0;
- StartDict();
- InputData(m_StringBuf.GetBuffer(), m_StringBuf.GetSize());
- Finish();
- m_bSameLastDict = FALSE;
- if (m_pLastImageDict && m_bReleaseLastDict) {
- m_pLastImageDict->Release();
- m_pLastImageDict = NULL;
- }
- if (!m_ObjectSize) {
- m_InlineImageState = 0;
- return;
- }
- m_pLastImageDict = (CPDF_Dictionary*)m_pObjectStack[--m_ObjectSize];
- m_bReleaseLastDict = !m_pObjectState[m_ObjectSize];
- m_pObjectState[m_ObjectSize] = FALSE;
- _PDF_ReplaceAbbr(m_pLastImageDict);
- m_LastImageDict.TakeOver(m_StringBuf);
- if (m_pLastImageDict->KeyExist(FX_BSTRC("ColorSpace"))) {
- CPDF_Object* pCSObj = m_pLastImageDict->GetElementValue(FX_BSTRC("ColorSpace"));
- if (pCSObj->GetType() == PDFOBJ_NAME) {
- CFX_ByteString name = pCSObj->GetString();
- if (name != FX_BSTRC("DeviceRGB") && name != FX_BSTRC("DeviceGray") && name != FX_BSTRC("DeviceCMYK")) {
- pCSObj = FindResourceObj(FX_BSTRC("ColorSpace"), name);
- if (pCSObj) {
- if (!pCSObj->GetObjNum()) {
- pCSObj = pCSObj->Clone();
- }
- m_pLastImageDict->SetAt(FX_BSTRC("ColorSpace"), pCSObj, m_pDocument);
- }
- }
- }
- }
- } else {
- m_bSameLastDict = TRUE;
- }
- m_ImageSrcBuf.Clear();
- if (m_pLastCloneImageDict) {
- m_pLastCloneImageDict->Release();
- }
- m_pLastCloneImageDict = (CPDF_Dictionary*)m_pLastImageDict->Clone();
- if (m_pLastCloneImageDict->KeyExist(FX_BSTRC("Filter"))) {
- m_WordState = 10;
- m_InlineImageState = 0;
- } else {
- int width = m_pLastCloneImageDict->GetInteger(FX_BSTRC("Width"));
- int height = m_pLastCloneImageDict->GetInteger(FX_BSTRC("Height"));
- int OrigSize = 0;
- CPDF_Object* pCSObj = m_pLastCloneImageDict->GetElementValue(FX_BSTRC("ColorSpace"));
- if (pCSObj != NULL) {
- int bpc = m_pLastCloneImageDict->GetInteger(FX_BSTRC("BitsPerComponent"));
- int nComponents = 1;
- CPDF_ColorSpace* pCS = m_pDocument->LoadColorSpace(pCSObj);
- if (pCS == NULL) {
- nComponents = 3;
- } else {
- nComponents = pCS->CountComponents();
- m_pDocument->GetPageData()->ReleaseColorSpace(pCSObj);
- }
- int pitch = (width * bpc * nComponents + 7) / 8;
- OrigSize = pitch * height;
- } else {
- OrigSize = ((width + 7) / 8) * height;
- }
- m_ImageSrcBuf.AppendBlock(NULL, OrigSize);
- m_WordState = 11;
- m_InlineImageState = 0;
- }
-}
-void CPDF_StreamContentParser::EndInlineImage()
-{
- CFX_AffineMatrix ImageMatrix;
- ImageMatrix.Copy(m_pCurStates->m_CTM);
- ImageMatrix.Concat(m_mtContentToUser);
- m_LastImageData.CopyData(m_ImageSrcBuf.GetBuffer(), m_ImageSrcBuf.GetSize());
- CPDF_Stream* pStream = CPDF_Stream::Create(m_ImageSrcBuf.GetBuffer(), m_ImageSrcBuf.GetSize(),
- m_pLastCloneImageDict);
- m_ImageSrcBuf.DetachBuffer();
- m_pLastCloneImageDict = NULL;
- CPDF_InlineImages* pImages = FX_NEW CPDF_InlineImages;
- pImages->m_pStream = pStream;
- SetGraphicStates(pImages, !m_pLastCloneImageDict->KeyExist(FX_BSTRC("ColorSpace")), FALSE, FALSE);
- pImages->AddMatrix(ImageMatrix);
- m_pObjectList->m_ObjectList.AddTail(pImages);
- m_WordState = 0;
-}
-#define FXDWORD_TRUE FXDWORD_FROM_LSBFIRST(0x65757274)
-#define FXDWORD_NULL FXDWORD_FROM_LSBFIRST(0x6c6c756e)
-#define FXDWORD_FALS FXDWORD_FROM_LSBFIRST(0x736c6166)
-void CPDF_StreamContentParser::EndKeyword()
-{
- CPDF_Object *pObj = NULL;
- if (m_WordSize == 4) {
- if (*(FX_DWORD*)m_pWordBuf == FXDWORD_TRUE) {
- pObj = CPDF_Boolean::Create(TRUE);
- if (!SetToCurObj(pObj)) {
- pObj->Release();
- }
- return;
- } else if (*(FX_DWORD*)m_pWordBuf == FXDWORD_NULL) {
- pObj = CPDF_Null::Create();
- if (!SetToCurObj(pObj)) {
- pObj->Release();
- }
- return;
- }
- } else if (m_WordSize == 5) {
- if (*(FX_DWORD*)m_pWordBuf == FXDWORD_FALS && m_pWordBuf[4] == 'e') {
- pObj = CPDF_Boolean::Create(FALSE);
- if (!SetToCurObj(pObj)) {
- pObj->Release();
- }
- return;
- }
- }
- m_pWordBuf[m_WordSize] = 0;
- OnOperator((char*)m_pWordBuf);
- ClearAllParams();
-}
-#define PAGEPARSE_STAGE_PARSE 2
-#define PAGEPARSE_STAGE_CHECKCLIP 3
-CPDF_ContentParser::CPDF_ContentParser()
-{
- m_pParser = NULL;
- m_Status = Ready;
- m_pStreamFilter = NULL;
- m_pType3Char = NULL;
-}
-CPDF_ContentParser::~CPDF_ContentParser()
-{
- Clear();
-}
-void CPDF_ContentParser::Clear()
-{
- if (m_pParser) {
- delete m_pParser;
- }
- if (m_pStreamFilter) {
- delete m_pStreamFilter;
- }
- m_pParser = NULL;
- m_Status = Ready;
-}
-void CPDF_ContentParser::Start(CPDF_Page* pPage, CPDF_ParseOptions* pOptions)
-{
- if (m_Status != Ready || pPage == NULL || pPage->m_pDocument == NULL || pPage->m_pFormDict == NULL) {
- m_Status = Done;
- return;
- }
- m_pObjects = pPage;
- m_bForm = FALSE;
- if (pOptions) {
- m_Options = *pOptions;
- }
- CPDF_Object* pContent = pPage->m_pFormDict->GetElementValue(FX_BSTRC("Contents"));
- if (pContent == NULL) {
- m_Status = Done;
- return;
- }
- if (pContent->GetType() == PDFOBJ_STREAM) {
- m_nStreams = 1;
- } else if (pContent->GetType() == PDFOBJ_ARRAY) {
- m_nStreams = ((CPDF_Array*)pContent)->GetCount();
- } else {
- m_Status = Done;
- return;
- }
- m_Status = ToBeContinued;
- m_InternalStage = PAGEPARSE_STAGE_PARSE;
- m_CurrentOffset = 0;
- m_pParser = FX_NEW CPDF_StreamContentParser;
- m_pParser->Initialize();
- m_pParser->PrepareParse(pPage->m_pDocument, pPage->m_pResources, NULL, NULL, pPage,
- pPage->m_pResources, &pPage->m_BBox, &m_Options, NULL, 0);
- m_pParser->m_pCurStates->m_ColorState.GetModify()->Default();
-}
-void CPDF_ContentParser::Start(CPDF_Form* pForm, CPDF_AllStates* pGraphicStates, CFX_AffineMatrix* pParentMatrix,
- CPDF_Type3Char* pType3Char, CPDF_ParseOptions* pOptions, int level)
-{
- m_pType3Char = pType3Char;
- m_pObjects = pForm;
- m_bForm = TRUE;
- CFX_AffineMatrix form_matrix = pForm->m_pFormDict->GetMatrix(FX_BSTRC("Matrix"));
- if (pGraphicStates) {
- form_matrix.Concat(pGraphicStates->m_CTM);
- }
- CPDF_Array* pBBox = pForm->m_pFormDict->GetArray(FX_BSTRC("BBox"));
- CFX_FloatRect form_bbox;
- CPDF_Path ClipPath;
- if (pBBox) {
- form_bbox = pBBox->GetRect();
- ClipPath.New();
- ClipPath.AppendRect(form_bbox.left, form_bbox.bottom, form_bbox.right, form_bbox.top);
- ClipPath.Transform(&form_matrix);
- if (pParentMatrix) {
- ClipPath.Transform(pParentMatrix);
- }
- form_bbox.Transform(&form_matrix);
- }
- CPDF_Dictionary* pResources = pForm->m_pFormDict->GetDict(FX_BSTRC("Resources"));
- m_pParser = FX_NEW CPDF_StreamContentParser;
- m_pParser->Initialize();
- m_pParser->PrepareParse(pForm->m_pDocument, pForm->m_pPageResources, pForm->m_pResources, pParentMatrix, pForm,
- pResources, &form_bbox, pOptions, pGraphicStates, level);
- m_pParser->m_pCurStates->m_CTM = form_matrix;
- if (ClipPath.NotNull()) {
- m_pParser->m_pCurStates->m_ClipPath.AppendPath(ClipPath, FXFILL_WINDING, TRUE);
- }
- if (pForm->m_Transparency & PDFTRANS_GROUP) {
- CPDF_GeneralStateData* pData = m_pParser->m_pCurStates->m_GeneralState.GetModify();
- pData->m_BlendType = FXDIB_BLEND_NORMAL;
- pData->m_StrokeAlpha = 1.0f;
- pData->m_FillAlpha = 1.0f;
- pData->m_pSoftMask = NULL;
- }
- m_pStreamFilter = pForm->m_pFormStream->GetStreamFilter();
- m_nStreams = 1;
- m_Status = ToBeContinued;
- m_InternalStage = PAGEPARSE_STAGE_PARSE;
- m_CurrentOffset = 0;
-}
-void CPDF_ContentParser::Continue(IFX_Pause* pPause)
-{
- while (m_Status == ToBeContinued) {
- if (m_InternalStage == PAGEPARSE_STAGE_PARSE) {
- if (m_pStreamFilter == NULL) {
- if (m_CurrentOffset == m_nStreams) {
- m_InternalStage = PAGEPARSE_STAGE_CHECKCLIP;
- if (m_pType3Char) {
- m_pType3Char->m_bColored = m_pParser->m_bColored;
- m_pType3Char->m_Width = FXSYS_round(m_pParser->m_Type3Data[0] * 1000);
- m_pType3Char->m_BBox.left = FXSYS_round(m_pParser->m_Type3Data[2] * 1000);
- m_pType3Char->m_BBox.bottom = FXSYS_round(m_pParser->m_Type3Data[3] * 1000);
- m_pType3Char->m_BBox.right = FXSYS_round(m_pParser->m_Type3Data[4] * 1000);
- m_pType3Char->m_BBox.top = FXSYS_round(m_pParser->m_Type3Data[5] * 1000);
- m_pType3Char->m_bPageRequired = m_pParser->m_bResourceMissing;
- }
- delete m_pParser;
- m_pParser = NULL;
- continue;
- }
- CPDF_Object* pContent = m_pObjects->m_pFormDict->GetElementValue(FX_BSTRC("Contents"));
- if (pContent->GetType() == PDFOBJ_STREAM) {
- m_pStreamFilter = ((CPDF_Stream*)pContent)->GetStreamFilter();
- } else {
- CPDF_Stream* pStream = ((CPDF_Array*)pContent)->GetStream(m_CurrentOffset);
- if (pStream == NULL) {
- m_CurrentOffset ++;
- continue;
- }
- m_pStreamFilter = pStream->GetStreamFilter();
- }
- }
- FX_DWORD len = m_pStreamFilter->ReadBlock(m_pParser->m_pStreamBuf, STREAM_PARSE_BUFSIZE);
- m_pParser->InputData(m_pParser->m_pStreamBuf, len);
- if (m_pParser->m_bAbort) {
- delete m_pStreamFilter;
- m_pStreamFilter = NULL;
- m_Status = Done;
- delete m_pParser;
- m_pParser = NULL;
- return;
- }
- if (len < STREAM_PARSE_BUFSIZE) {
- m_pParser->Finish();
- m_CurrentOffset ++;
- delete m_pStreamFilter;
- m_pStreamFilter = NULL;
- }
- if (pPause && pPause->NeedToPauseNow()) {
- return;
- }
- }
- if (m_InternalStage == PAGEPARSE_STAGE_CHECKCLIP) {
- FX_POSITION pos = m_pObjects->m_ObjectList.GetHeadPosition();
- while (pos) {
- CPDF_PageObject* pObj = (CPDF_PageObject*)m_pObjects->m_ObjectList.GetNext(pos);
- if (pObj == NULL) {
- continue;
- }
- if (pObj->m_ClipPath.IsNull()) {
- continue;
- }
- if (pObj->m_ClipPath.GetPathCount() != 1) {
- continue;
- }
- if (pObj->m_ClipPath.GetTextCount()) {
- continue;
- }
- CPDF_Path ClipPath = pObj->m_ClipPath.GetPath(0);
- if (!ClipPath.IsRect() || pObj->m_Type == PDFPAGE_SHADING) {
- continue;
- }
- CFX_FloatRect old_rect(ClipPath.GetPointX(0), ClipPath.GetPointY(0),
- ClipPath.GetPointX(2), ClipPath.GetPointY(2));
- CFX_FloatRect obj_rect(pObj->m_Left, pObj->m_Bottom, pObj->m_Right, pObj->m_Top);
- if (old_rect.Contains(obj_rect)) {
- pObj->m_ClipPath.SetNull();
- }
- }
- if (m_pObjects->m_ObjectList.GetCount() == 1) {
- CPDF_PageObject* pObj = (CPDF_PageObject*)m_pObjects->m_ObjectList.GetAt(m_pObjects->m_ObjectList.GetHeadPosition());
- if (pObj && pObj->m_Type == PDFPAGE_TEXT) {
- CPDF_TextObject* pText = (CPDF_TextObject*)pObj;
- }
- }
- m_Status = Done;
- return;
- }
- }
-}
-int CPDF_ContentParser::EstimateProgress()
-{
- if (m_Status == Ready) {
- return 0;
- }
- if (m_Status == Done) {
- return 100;
- }
- if (m_InternalStage == PAGEPARSE_STAGE_CHECKCLIP) {
- return 90;
- }
- if (m_pStreamFilter == NULL) {
- return 90 * m_CurrentOffset / m_nStreams;
- }
- int total_raw_size = m_pStreamFilter->GetStream()->GetRawSize() * m_nStreams;
- int parsed_raw_size = m_pStreamFilter->GetStream()->GetRawSize() * m_CurrentOffset +
- m_pStreamFilter->GetSrcPos();
- return 90 * parsed_raw_size / total_raw_size;
-}
-CPDF_InlineImages::CPDF_InlineImages()
-{
- m_Type = PDFPAGE_INLINES;
- m_pStream = NULL;
- m_pBitmap = NULL;
-}
-CPDF_InlineImages::~CPDF_InlineImages()
-{
- if (m_pStream) {
- m_pStream->Release();
- }
- if (m_pBitmap) {
- delete m_pBitmap;
- }
-}
-void CPDF_InlineImages::AddMatrix(CFX_AffineMatrix& matrix)
-{
- m_Matrices.Add(matrix);
- CFX_FloatRect rect = matrix.GetUnitRect();
- if (m_Matrices.GetSize() > 1) {
- CFX_FloatRect rect1(m_Left, m_Bottom, m_Right, m_Top);
- rect.Union(rect1);
- }
- m_Left = rect.left;
- m_Right = rect.right;
- m_Top = rect.top;
- m_Bottom = rect.bottom;
-}
-#endif
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fpdfapi/fpdf_page.h"
+#include "../../../include/fpdfapi/fpdf_module.h"
+#include "pageint.h"
+#if defined(_FPDFAPI_MINI_)
+extern const FX_LPCSTR _PDF_CharType;
+void CPDF_StreamContentParser::InputData(FX_LPCBYTE src_buf, FX_DWORD src_size)
+{
+ if (m_Level > _FPDF_MAX_FORM_LEVEL_) {
+ return;
+ }
+ for (FX_DWORD i = 0; i < src_size; i ++) {
+ int ch = src_buf[i];
+ int type = _PDF_CharType[ch];
+start:
+ switch (m_WordState) {
+ case 0:
+ if (type == 'W') {
+ } else if (type == 'N') {
+ m_WordState = 5;
+ m_pWordBuf[0] = ch;
+ m_WordSize = 1;
+ } else if (type == 'R') {
+ m_WordState = 4;
+ m_pWordBuf[0] = ch;
+ m_WordSize = 1;
+ } else switch (ch) {
+ case '/':
+ m_WordState = 2;
+ m_WordSize = 0;
+ break;
+ case '[':
+ StartArray();
+ break;
+ case ']':
+ EndArray();
+ break;
+ case '(':
+ m_WordState = 7;
+ m_StringLevel = 1;
+ m_StringState = 0;
+ m_StringBuf.Clear();
+ break;
+ case '<':
+ m_WordState = 3;
+ break;
+ case '>':
+ m_WordState = 8;
+ break;
+ case '%':
+ m_WordState = 1;
+ break;
+ }
+ break;
+ case 1:
+ if (ch == '\n' || ch == '\r') {
+ m_WordState = 0;
+ }
+ break;
+ case 2:
+ if (type != 'R' && type != 'N') {
+ EndName();
+ m_WordState = 0;
+ goto start;
+ }
+ if (m_WordSize < 256) {
+ m_pWordBuf[m_WordSize++] = ch;
+ }
+ break;
+ case 3:
+ if (ch == '<') {
+ StartDict();
+ m_WordState = 0;
+ } else {
+ m_StringBuf.Clear();
+ m_WordState = 6;
+ goto start;
+ }
+ break;
+ case 4:
+ if (type != 'R' && type != 'N') {
+ m_WordState = 0;
+ EndKeyword();
+ if (m_bAbort) {
+ return;
+ }
+ goto start;
+ }
+ if (m_WordSize < 256) {
+ m_pWordBuf[m_WordSize++] = ch;
+ }
+ break;
+ case 5:
+ if (type != 'N') {
+ EndNumber();
+ m_WordState = 0;
+ goto start;
+ }
+ if (m_WordSize < 256) {
+ m_pWordBuf[m_WordSize++] = ch;
+ }
+ break;
+ case 6:
+ if (ch == '>') {
+ EndHexString();
+ m_WordState = 0;
+ } else {
+ m_StringBuf.AppendByte(ch);
+ }
+ break;
+ case 7:
+ switch (m_StringState) {
+ case 0:
+ if (ch == ')') {
+ m_StringLevel --;
+ if (m_StringLevel == 0) {
+ EndString();
+ m_WordState = 0;
+ break;
+ }
+ m_StringBuf.AppendByte(')');
+ } else if (ch == '(') {
+ m_StringLevel ++;
+ m_StringBuf.AppendByte('(');
+ } else if (ch == '\\') {
+ m_StringState = 1;
+ } else {
+ m_StringBuf.AppendByte((char)ch);
+ }
+ break;
+ case 1:
+ if (ch >= '0' && ch <= '7') {
+ m_EscCode = ch - '0';
+ m_StringState = 2;
+ break;
+ }
+ if (ch == 'n') {
+ m_StringBuf.AppendByte('\n');
+ } else if (ch == 'r') {
+ m_StringBuf.AppendByte('\r');
+ } else if (ch == 't') {
+ m_StringBuf.AppendByte('\t');
+ } else if (ch == 'b') {
+ m_StringBuf.AppendByte('\b');
+ } else if (ch == 'f') {
+ m_StringBuf.AppendByte('\f');
+ } else if (ch == '\\') {
+ m_StringBuf.AppendByte('\\');
+ } else if (ch == '(') {
+ m_StringBuf.AppendByte('(');
+ } else if (ch == ')') {
+ m_StringBuf.AppendByte(')');
+ } else if (ch == '\r') {
+ m_StringState = 4;
+ break;
+ } else if (ch == '\n') {
+ } else {
+ m_StringBuf.AppendByte(ch);
+ }
+ m_StringState = 0;
+ break;
+ case 2:
+ if (ch >= '0' && ch <= '7') {
+ m_EscCode = m_EscCode * 8 + ch - '0';
+ m_StringState = 3;
+ } else {
+ m_StringBuf.AppendByte(m_EscCode);
+ m_StringState = 0;
+ goto start;
+ }
+ break;
+ case 3:
+ if (ch >= '0' && ch <= '7') {
+ m_EscCode = m_EscCode * 8 + ch - '0';
+ m_StringBuf.AppendByte(m_EscCode);
+ m_StringState = 0;
+ } else {
+ m_StringBuf.AppendByte(m_EscCode);
+ m_StringState = 0;
+ goto start;
+ }
+ break;
+ case 4:
+ m_StringState = 0;
+ if (ch != '\n') {
+ goto start;
+ }
+ break;
+ }
+ break;
+ case 8:
+ m_WordState = 0;
+ if (ch == '>') {
+ EndDict();
+ } else {
+ goto start;
+ }
+ break;
+ case 9:
+ switch (m_InlineImageState) {
+ case 0:
+ if (type == 'W' || type == 'D') {
+ m_InlineImageState = 1;
+ m_InlineWhiteChar = ch;
+ } else {
+ m_StringBuf.AppendByte(ch);
+ }
+ break;
+ case 1:
+ m_StringBuf.AppendByte(m_InlineWhiteChar);
+ if (ch == 'I') {
+ m_InlineImageState = 2;
+ } else {
+ m_InlineImageState = 0;
+ goto start;
+ }
+ break;
+ case 2:
+ if (ch == 'D') {
+ m_InlineImageState = 3;
+ } else {
+ m_StringBuf.AppendByte('I');
+ m_InlineImageState = 0;
+ goto start;
+ }
+ break;
+ case 3:
+ EndImageDict();
+ break;
+ }
+ break;
+ case 10:
+ switch (m_InlineImageState) {
+ case 0:
+ if (type == 'W') {
+ m_InlineImageState = 1;
+ m_InlineWhiteChar = ch;
+ } else {
+ m_ImageSrcBuf.AppendByte(ch);
+ }
+ break;
+ case 1:
+ if (ch == 'E') {
+ m_InlineImageState = 2;
+ } else {
+ m_ImageSrcBuf.AppendByte(m_InlineWhiteChar);
+ m_InlineImageState = 0;
+ goto start;
+ }
+ break;
+ case 2:
+ if (ch == 'I') {
+ m_InlineImageState = 3;
+ } else {
+ m_ImageSrcBuf.AppendByte(m_InlineWhiteChar);
+ m_ImageSrcBuf.AppendByte('E');
+ m_InlineImageState = 0;
+ goto start;
+ }
+ break;
+ case 3:
+ if (type == 'W') {
+ EndInlineImage();
+ } else {
+ m_ImageSrcBuf.AppendByte(m_InlineWhiteChar);
+ m_ImageSrcBuf.AppendByte('E');
+ m_ImageSrcBuf.AppendByte('I');
+ m_InlineImageState = 0;
+ goto start;
+ }
+ break;
+ }
+ break;
+ case 11:
+ if (m_InlineImageState < m_ImageSrcBuf.GetSize()) {
+ m_ImageSrcBuf.GetBuffer()[m_InlineImageState ++] = ch;
+ } else {
+ if (ch == 'I') {
+ EndInlineImage();
+ }
+ }
+ break;
+ }
+ }
+}
+void CPDF_StreamContentParser::Finish()
+{
+ switch (m_WordState) {
+ case 0:
+ break;
+ case 1:
+ break;
+ case 2:
+ EndName();
+ break;
+ case 3:
+ break;
+ case 4:
+ EndKeyword();
+ break;
+ case 5:
+ EndNumber();
+ break;
+ case 6:
+ EndHexString();
+ break;
+ case 7:
+ EndString();
+ break;
+ case 8:
+ break;
+ case 9:
+ break;
+ case 10:
+ EndInlineImage();
+ break;
+ }
+ m_WordState = 0;
+}
+void CPDF_StreamContentParser::AddContainer(CPDF_Object* pObject)
+{
+ if (m_ObjectSize) {
+ m_pObjectState[m_ObjectSize] = SetToCurObj(pObject);
+ }
+ FXSYS_assert(m_ObjectSize < _FPDF_MAX_OBJECT_STACK_SIZE_);
+ m_pObjectStack[m_ObjectSize++] = pObject;
+}
+FX_BOOL CPDF_StreamContentParser::SetToCurObj(CPDF_Object* pObject)
+{
+ if (m_ObjectSize == 0) {
+ AddObjectParam(pObject);
+ return TRUE;
+ }
+ FX_BOOL bInArrayOrDict = TRUE;
+ CPDF_Object* pCurObj = m_pObjectStack[m_ObjectSize - 1];
+ if (pCurObj->GetType() == PDFOBJ_ARRAY) {
+ ((CPDF_Array*)pCurObj)->Add(pObject, m_pDocument);
+ } else {
+ if (!m_bDictName && m_pDictName[0]) {
+ ((CPDF_Dictionary*)pCurObj)->SetAt((FX_LPCSTR)m_pDictName, pObject, m_pDocument);
+ } else {
+ bInArrayOrDict = FALSE;
+ }
+ m_bDictName = TRUE;
+ }
+ return bInArrayOrDict;
+}
+void CPDF_StreamContentParser::StartArray()
+{
+ if (m_ObjectSize)
+ if (m_pObjectStack[0]->GetType() != PDFOBJ_DICTIONARY && m_pObjectStack[m_ObjectSize - 1]->GetType() == PDFOBJ_ARRAY) {
+ return;
+ }
+ CPDF_Array* pArray = FX_NEW CPDF_Array;
+ AddContainer(pArray);
+}
+void CPDF_StreamContentParser::EndArray()
+{
+ if (m_ObjectSize == 0) {
+ return;
+ }
+ CPDF_Object* pCurObj = m_pObjectStack[m_ObjectSize - 1];
+ if (pCurObj->GetType() != PDFOBJ_ARRAY) {
+ return;
+ }
+ m_ObjectSize --;
+ if (m_ObjectSize == 0) {
+ AddObjectParam(pCurObj);
+ } else {
+ if (!m_pObjectState[m_ObjectSize]) {
+ pCurObj->Release();
+ }
+ }
+ m_pObjectState[m_ObjectSize] = FALSE;
+}
+void CPDF_StreamContentParser::StartDict()
+{
+ CPDF_Dictionary* pDict = FX_NEW CPDF_Dictionary;
+ AddContainer(pDict);
+ m_bDictName = TRUE;
+}
+void CPDF_StreamContentParser::EndDict()
+{
+ if (m_ObjectSize == 0) {
+ return;
+ }
+ CPDF_Object* pCurObj = m_pObjectStack[m_ObjectSize - 1];
+ if (pCurObj->GetType() != PDFOBJ_DICTIONARY) {
+ return;
+ }
+ m_ObjectSize --;
+ if (m_ObjectSize == 0) {
+ AddObjectParam(pCurObj);
+ } else {
+ if (!m_pObjectState[m_ObjectSize]) {
+ pCurObj->Release();
+ }
+ }
+ m_pObjectState[m_ObjectSize] = FALSE;
+}
+void CPDF_StreamContentParser::EndName()
+{
+ if (m_ObjectSize == 0) {
+ AddNameParam((FX_LPCSTR)m_pWordBuf, m_WordSize);
+ return;
+ }
+ CPDF_Object* pCurObj = m_pObjectStack[m_ObjectSize - 1];
+ if (pCurObj->GetType() == PDFOBJ_ARRAY) {
+ ((CPDF_Array*)pCurObj)->AddName(CFX_ByteString(m_pWordBuf, m_WordSize));
+ } else {
+ if (m_bDictName) {
+ FXSYS_memcpy32(m_pDictName, m_pWordBuf, m_WordSize);
+ m_pDictName[m_WordSize] = 0;
+ } else {
+ if (m_pDictName[0] != 0) {
+ ((CPDF_Dictionary*)pCurObj)->SetAtName((FX_LPCSTR)m_pDictName, CFX_ByteString(m_pWordBuf, m_WordSize));
+ }
+ }
+ m_bDictName = !m_bDictName;
+ }
+}
+void CPDF_StreamContentParser::EndNumber()
+{
+ if (m_ObjectSize == 0) {
+ AddNumberParam((FX_LPCSTR)m_pWordBuf, m_WordSize);
+ return;
+ }
+ CPDF_Number *pObj = FX_NEW CPDF_Number(CFX_ByteStringC(m_pWordBuf, m_WordSize));
+ if (!SetToCurObj(pObj)) {
+ pObj->Release();
+ }
+}
+extern CFX_ByteString _FPDF_ByteStringFromHex(CFX_BinaryBuf& src_buf);
+void CPDF_StreamContentParser::EndHexString()
+{
+ CPDF_String *pObj = FX_NEW CPDF_String(_FPDF_ByteStringFromHex(m_StringBuf), TRUE);
+ if (!SetToCurObj(pObj)) {
+ pObj->Release();
+ }
+}
+void CPDF_StreamContentParser::EndString()
+{
+ CPDF_String *pObj = FX_NEW CPDF_String(m_StringBuf.GetByteString());
+ if (!SetToCurObj(pObj)) {
+ pObj->Release();
+ }
+}
+void CPDF_StreamContentParser::Handle_BeginImage(void)
+{
+ m_WordState = 9;
+ m_InlineImageState = 0;
+ m_StringBuf.Clear();
+}
+void _PDF_ReplaceAbbr(CPDF_Object* pObj);
+void CPDF_StreamContentParser::EndImageDict()
+{
+ if (m_StringBuf.GetSize() != m_LastImageDict.GetSize() ||
+ FXSYS_memcmp32(m_StringBuf.GetBuffer(), m_LastImageDict.GetBuffer(), m_StringBuf.GetSize())) {
+ m_WordState = 0;
+ StartDict();
+ InputData(m_StringBuf.GetBuffer(), m_StringBuf.GetSize());
+ Finish();
+ m_bSameLastDict = FALSE;
+ if (m_pLastImageDict && m_bReleaseLastDict) {
+ m_pLastImageDict->Release();
+ m_pLastImageDict = NULL;
+ }
+ if (!m_ObjectSize) {
+ m_InlineImageState = 0;
+ return;
+ }
+ m_pLastImageDict = (CPDF_Dictionary*)m_pObjectStack[--m_ObjectSize];
+ m_bReleaseLastDict = !m_pObjectState[m_ObjectSize];
+ m_pObjectState[m_ObjectSize] = FALSE;
+ _PDF_ReplaceAbbr(m_pLastImageDict);
+ m_LastImageDict.TakeOver(m_StringBuf);
+ if (m_pLastImageDict->KeyExist(FX_BSTRC("ColorSpace"))) {
+ CPDF_Object* pCSObj = m_pLastImageDict->GetElementValue(FX_BSTRC("ColorSpace"));
+ if (pCSObj->GetType() == PDFOBJ_NAME) {
+ CFX_ByteString name = pCSObj->GetString();
+ if (name != FX_BSTRC("DeviceRGB") && name != FX_BSTRC("DeviceGray") && name != FX_BSTRC("DeviceCMYK")) {
+ pCSObj = FindResourceObj(FX_BSTRC("ColorSpace"), name);
+ if (pCSObj) {
+ if (!pCSObj->GetObjNum()) {
+ pCSObj = pCSObj->Clone();
+ }
+ m_pLastImageDict->SetAt(FX_BSTRC("ColorSpace"), pCSObj, m_pDocument);
+ }
+ }
+ }
+ }
+ } else {
+ m_bSameLastDict = TRUE;
+ }
+ m_ImageSrcBuf.Clear();
+ if (m_pLastCloneImageDict) {
+ m_pLastCloneImageDict->Release();
+ }
+ m_pLastCloneImageDict = (CPDF_Dictionary*)m_pLastImageDict->Clone();
+ if (m_pLastCloneImageDict->KeyExist(FX_BSTRC("Filter"))) {
+ m_WordState = 10;
+ m_InlineImageState = 0;
+ } else {
+ int width = m_pLastCloneImageDict->GetInteger(FX_BSTRC("Width"));
+ int height = m_pLastCloneImageDict->GetInteger(FX_BSTRC("Height"));
+ int OrigSize = 0;
+ CPDF_Object* pCSObj = m_pLastCloneImageDict->GetElementValue(FX_BSTRC("ColorSpace"));
+ if (pCSObj != NULL) {
+ int bpc = m_pLastCloneImageDict->GetInteger(FX_BSTRC("BitsPerComponent"));
+ int nComponents = 1;
+ CPDF_ColorSpace* pCS = m_pDocument->LoadColorSpace(pCSObj);
+ if (pCS == NULL) {
+ nComponents = 3;
+ } else {
+ nComponents = pCS->CountComponents();
+ m_pDocument->GetPageData()->ReleaseColorSpace(pCSObj);
+ }
+ int pitch = (width * bpc * nComponents + 7) / 8;
+ OrigSize = pitch * height;
+ } else {
+ OrigSize = ((width + 7) / 8) * height;
+ }
+ m_ImageSrcBuf.AppendBlock(NULL, OrigSize);
+ m_WordState = 11;
+ m_InlineImageState = 0;
+ }
+}
+void CPDF_StreamContentParser::EndInlineImage()
+{
+ CFX_AffineMatrix ImageMatrix;
+ ImageMatrix.Copy(m_pCurStates->m_CTM);
+ ImageMatrix.Concat(m_mtContentToUser);
+ m_LastImageData.CopyData(m_ImageSrcBuf.GetBuffer(), m_ImageSrcBuf.GetSize());
+ CPDF_Stream* pStream = CPDF_Stream::Create(m_ImageSrcBuf.GetBuffer(), m_ImageSrcBuf.GetSize(),
+ m_pLastCloneImageDict);
+ m_ImageSrcBuf.DetachBuffer();
+ m_pLastCloneImageDict = NULL;
+ CPDF_InlineImages* pImages = FX_NEW CPDF_InlineImages;
+ pImages->m_pStream = pStream;
+ SetGraphicStates(pImages, !m_pLastCloneImageDict->KeyExist(FX_BSTRC("ColorSpace")), FALSE, FALSE);
+ pImages->AddMatrix(ImageMatrix);
+ m_pObjectList->m_ObjectList.AddTail(pImages);
+ m_WordState = 0;
+}
+#define FXDWORD_TRUE FXDWORD_FROM_LSBFIRST(0x65757274)
+#define FXDWORD_NULL FXDWORD_FROM_LSBFIRST(0x6c6c756e)
+#define FXDWORD_FALS FXDWORD_FROM_LSBFIRST(0x736c6166)
+void CPDF_StreamContentParser::EndKeyword()
+{
+ CPDF_Object *pObj = NULL;
+ if (m_WordSize == 4) {
+ if (*(FX_DWORD*)m_pWordBuf == FXDWORD_TRUE) {
+ pObj = CPDF_Boolean::Create(TRUE);
+ if (!SetToCurObj(pObj)) {
+ pObj->Release();
+ }
+ return;
+ } else if (*(FX_DWORD*)m_pWordBuf == FXDWORD_NULL) {
+ pObj = CPDF_Null::Create();
+ if (!SetToCurObj(pObj)) {
+ pObj->Release();
+ }
+ return;
+ }
+ } else if (m_WordSize == 5) {
+ if (*(FX_DWORD*)m_pWordBuf == FXDWORD_FALS && m_pWordBuf[4] == 'e') {
+ pObj = CPDF_Boolean::Create(FALSE);
+ if (!SetToCurObj(pObj)) {
+ pObj->Release();
+ }
+ return;
+ }
+ }
+ m_pWordBuf[m_WordSize] = 0;
+ OnOperator((char*)m_pWordBuf);
+ ClearAllParams();
+}
+#define PAGEPARSE_STAGE_PARSE 2
+#define PAGEPARSE_STAGE_CHECKCLIP 3
+CPDF_ContentParser::CPDF_ContentParser()
+{
+ m_pParser = NULL;
+ m_Status = Ready;
+ m_pStreamFilter = NULL;
+ m_pType3Char = NULL;
+}
+CPDF_ContentParser::~CPDF_ContentParser()
+{
+ Clear();
+}
+void CPDF_ContentParser::Clear()
+{
+ if (m_pParser) {
+ delete m_pParser;
+ }
+ if (m_pStreamFilter) {
+ delete m_pStreamFilter;
+ }
+ m_pParser = NULL;
+ m_Status = Ready;
+}
+void CPDF_ContentParser::Start(CPDF_Page* pPage, CPDF_ParseOptions* pOptions)
+{
+ if (m_Status != Ready || pPage == NULL || pPage->m_pDocument == NULL || pPage->m_pFormDict == NULL) {
+ m_Status = Done;
+ return;
+ }
+ m_pObjects = pPage;
+ m_bForm = FALSE;
+ if (pOptions) {
+ m_Options = *pOptions;
+ }
+ CPDF_Object* pContent = pPage->m_pFormDict->GetElementValue(FX_BSTRC("Contents"));
+ if (pContent == NULL) {
+ m_Status = Done;
+ return;
+ }
+ if (pContent->GetType() == PDFOBJ_STREAM) {
+ m_nStreams = 1;
+ } else if (pContent->GetType() == PDFOBJ_ARRAY) {
+ m_nStreams = ((CPDF_Array*)pContent)->GetCount();
+ } else {
+ m_Status = Done;
+ return;
+ }
+ m_Status = ToBeContinued;
+ m_InternalStage = PAGEPARSE_STAGE_PARSE;
+ m_CurrentOffset = 0;
+ m_pParser = FX_NEW CPDF_StreamContentParser;
+ m_pParser->Initialize();
+ m_pParser->PrepareParse(pPage->m_pDocument, pPage->m_pResources, NULL, NULL, pPage,
+ pPage->m_pResources, &pPage->m_BBox, &m_Options, NULL, 0);
+ m_pParser->m_pCurStates->m_ColorState.GetModify()->Default();
+}
+void CPDF_ContentParser::Start(CPDF_Form* pForm, CPDF_AllStates* pGraphicStates, CFX_AffineMatrix* pParentMatrix,
+ CPDF_Type3Char* pType3Char, CPDF_ParseOptions* pOptions, int level)
+{
+ m_pType3Char = pType3Char;
+ m_pObjects = pForm;
+ m_bForm = TRUE;
+ CFX_AffineMatrix form_matrix = pForm->m_pFormDict->GetMatrix(FX_BSTRC("Matrix"));
+ if (pGraphicStates) {
+ form_matrix.Concat(pGraphicStates->m_CTM);
+ }
+ CPDF_Array* pBBox = pForm->m_pFormDict->GetArray(FX_BSTRC("BBox"));
+ CFX_FloatRect form_bbox;
+ CPDF_Path ClipPath;
+ if (pBBox) {
+ form_bbox = pBBox->GetRect();
+ ClipPath.New();
+ ClipPath.AppendRect(form_bbox.left, form_bbox.bottom, form_bbox.right, form_bbox.top);
+ ClipPath.Transform(&form_matrix);
+ if (pParentMatrix) {
+ ClipPath.Transform(pParentMatrix);
+ }
+ form_bbox.Transform(&form_matrix);
+ }
+ CPDF_Dictionary* pResources = pForm->m_pFormDict->GetDict(FX_BSTRC("Resources"));
+ m_pParser = FX_NEW CPDF_StreamContentParser;
+ m_pParser->Initialize();
+ m_pParser->PrepareParse(pForm->m_pDocument, pForm->m_pPageResources, pForm->m_pResources, pParentMatrix, pForm,
+ pResources, &form_bbox, pOptions, pGraphicStates, level);
+ m_pParser->m_pCurStates->m_CTM = form_matrix;
+ if (ClipPath.NotNull()) {
+ m_pParser->m_pCurStates->m_ClipPath.AppendPath(ClipPath, FXFILL_WINDING, TRUE);
+ }
+ if (pForm->m_Transparency & PDFTRANS_GROUP) {
+ CPDF_GeneralStateData* pData = m_pParser->m_pCurStates->m_GeneralState.GetModify();
+ pData->m_BlendType = FXDIB_BLEND_NORMAL;
+ pData->m_StrokeAlpha = 1.0f;
+ pData->m_FillAlpha = 1.0f;
+ pData->m_pSoftMask = NULL;
+ }
+ m_pStreamFilter = pForm->m_pFormStream->GetStreamFilter();
+ m_nStreams = 1;
+ m_Status = ToBeContinued;
+ m_InternalStage = PAGEPARSE_STAGE_PARSE;
+ m_CurrentOffset = 0;
+}
+void CPDF_ContentParser::Continue(IFX_Pause* pPause)
+{
+ while (m_Status == ToBeContinued) {
+ if (m_InternalStage == PAGEPARSE_STAGE_PARSE) {
+ if (m_pStreamFilter == NULL) {
+ if (m_CurrentOffset == m_nStreams) {
+ m_InternalStage = PAGEPARSE_STAGE_CHECKCLIP;
+ if (m_pType3Char) {
+ m_pType3Char->m_bColored = m_pParser->m_bColored;
+ m_pType3Char->m_Width = FXSYS_round(m_pParser->m_Type3Data[0] * 1000);
+ m_pType3Char->m_BBox.left = FXSYS_round(m_pParser->m_Type3Data[2] * 1000);
+ m_pType3Char->m_BBox.bottom = FXSYS_round(m_pParser->m_Type3Data[3] * 1000);
+ m_pType3Char->m_BBox.right = FXSYS_round(m_pParser->m_Type3Data[4] * 1000);
+ m_pType3Char->m_BBox.top = FXSYS_round(m_pParser->m_Type3Data[5] * 1000);
+ m_pType3Char->m_bPageRequired = m_pParser->m_bResourceMissing;
+ }
+ delete m_pParser;
+ m_pParser = NULL;
+ continue;
+ }
+ CPDF_Object* pContent = m_pObjects->m_pFormDict->GetElementValue(FX_BSTRC("Contents"));
+ if (pContent->GetType() == PDFOBJ_STREAM) {
+ m_pStreamFilter = ((CPDF_Stream*)pContent)->GetStreamFilter();
+ } else {
+ CPDF_Stream* pStream = ((CPDF_Array*)pContent)->GetStream(m_CurrentOffset);
+ if (pStream == NULL) {
+ m_CurrentOffset ++;
+ continue;
+ }
+ m_pStreamFilter = pStream->GetStreamFilter();
+ }
+ }
+ FX_DWORD len = m_pStreamFilter->ReadBlock(m_pParser->m_pStreamBuf, STREAM_PARSE_BUFSIZE);
+ m_pParser->InputData(m_pParser->m_pStreamBuf, len);
+ if (m_pParser->m_bAbort) {
+ delete m_pStreamFilter;
+ m_pStreamFilter = NULL;
+ m_Status = Done;
+ delete m_pParser;
+ m_pParser = NULL;
+ return;
+ }
+ if (len < STREAM_PARSE_BUFSIZE) {
+ m_pParser->Finish();
+ m_CurrentOffset ++;
+ delete m_pStreamFilter;
+ m_pStreamFilter = NULL;
+ }
+ if (pPause && pPause->NeedToPauseNow()) {
+ return;
+ }
+ }
+ if (m_InternalStage == PAGEPARSE_STAGE_CHECKCLIP) {
+ FX_POSITION pos = m_pObjects->m_ObjectList.GetHeadPosition();
+ while (pos) {
+ CPDF_PageObject* pObj = (CPDF_PageObject*)m_pObjects->m_ObjectList.GetNext(pos);
+ if (pObj == NULL) {
+ continue;
+ }
+ if (pObj->m_ClipPath.IsNull()) {
+ continue;
+ }
+ if (pObj->m_ClipPath.GetPathCount() != 1) {
+ continue;
+ }
+ if (pObj->m_ClipPath.GetTextCount()) {
+ continue;
+ }
+ CPDF_Path ClipPath = pObj->m_ClipPath.GetPath(0);
+ if (!ClipPath.IsRect() || pObj->m_Type == PDFPAGE_SHADING) {
+ continue;
+ }
+ CFX_FloatRect old_rect(ClipPath.GetPointX(0), ClipPath.GetPointY(0),
+ ClipPath.GetPointX(2), ClipPath.GetPointY(2));
+ CFX_FloatRect obj_rect(pObj->m_Left, pObj->m_Bottom, pObj->m_Right, pObj->m_Top);
+ if (old_rect.Contains(obj_rect)) {
+ pObj->m_ClipPath.SetNull();
+ }
+ }
+ if (m_pObjects->m_ObjectList.GetCount() == 1) {
+ CPDF_PageObject* pObj = (CPDF_PageObject*)m_pObjects->m_ObjectList.GetAt(m_pObjects->m_ObjectList.GetHeadPosition());
+ if (pObj && pObj->m_Type == PDFPAGE_TEXT) {
+ CPDF_TextObject* pText = (CPDF_TextObject*)pObj;
+ }
+ }
+ m_Status = Done;
+ return;
+ }
+ }
+}
+int CPDF_ContentParser::EstimateProgress()
+{
+ if (m_Status == Ready) {
+ return 0;
+ }
+ if (m_Status == Done) {
+ return 100;
+ }
+ if (m_InternalStage == PAGEPARSE_STAGE_CHECKCLIP) {
+ return 90;
+ }
+ if (m_pStreamFilter == NULL) {
+ return 90 * m_CurrentOffset / m_nStreams;
+ }
+ int total_raw_size = m_pStreamFilter->GetStream()->GetRawSize() * m_nStreams;
+ int parsed_raw_size = m_pStreamFilter->GetStream()->GetRawSize() * m_CurrentOffset +
+ m_pStreamFilter->GetSrcPos();
+ return 90 * parsed_raw_size / total_raw_size;
+}
+CPDF_InlineImages::CPDF_InlineImages()
+{
+ m_Type = PDFPAGE_INLINES;
+ m_pStream = NULL;
+ m_pBitmap = NULL;
+}
+CPDF_InlineImages::~CPDF_InlineImages()
+{
+ if (m_pStream) {
+ m_pStream->Release();
+ }
+ if (m_pBitmap) {
+ delete m_pBitmap;
+ }
+}
+void CPDF_InlineImages::AddMatrix(CFX_AffineMatrix& matrix)
+{
+ m_Matrices.Add(matrix);
+ CFX_FloatRect rect = matrix.GetUnitRect();
+ if (m_Matrices.GetSize() > 1) {
+ CFX_FloatRect rect1(m_Left, m_Bottom, m_Right, m_Top);
+ rect.Union(rect1);
+ }
+ m_Left = rect.left;
+ m_Right = rect.right;
+ m_Top = rect.top;
+ m_Bottom = rect.bottom;
+}
+#endif
diff --git a/core/src/fpdfapi/fpdf_page/fpdf_page_parser_old.cpp b/core/src/fpdfapi/fpdf_page/fpdf_page_parser_old.cpp
index 2f0a18d62e..cafca2623c 100644
--- a/core/src/fpdfapi/fpdf_page/fpdf_page_parser_old.cpp
+++ b/core/src/fpdfapi/fpdf_page/fpdf_page_parser_old.cpp
@@ -1,1146 +1,1146 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../../include/fpdfapi/fpdf_page.h"
-#include "../../../include/fpdfapi/fpdf_module.h"
-#include "../../../include/fxcodec/fx_codec.h"
-#include "pageint.h"
-#include <limits.h>
-extern const FX_LPCSTR _PDF_OpCharType =
- "IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII"
- "IIVIIIIVIIVIIIIIVVIIIIIIIIIIIIII"
- "IIVVVVVVIVVVVVVIVVVVVIIVVIIIIIII"
- "IIVVVVVVVVVVVVVVIVVVIIVVIVVIIIII"
- "IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII"
- "IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII"
- "IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII"
- "IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII";
-FX_BOOL _PDF_HasInvalidOpChar(FX_LPCSTR op)
-{
- if(!op) {
- return FALSE;
- }
- FX_BYTE ch;
- while((ch = *op++)) {
- if(_PDF_OpCharType[ch] == 'I') {
- return TRUE;
- }
- }
- return FALSE;
-}
-FX_DWORD CPDF_StreamContentParser::Parse(FX_LPCBYTE pData, FX_DWORD dwSize, FX_DWORD max_cost)
-{
- if (m_Level > _FPDF_MAX_FORM_LEVEL_) {
- return dwSize;
- }
- FX_DWORD InitObjCount = m_pObjectList->CountObjects();
- CPDF_StreamParser syntax(pData, dwSize);
- m_pSyntax = &syntax;
- m_CompatCount = 0;
- while (1) {
- FX_DWORD cost = m_pObjectList->CountObjects() - InitObjCount;
- if (max_cost && cost >= max_cost) {
- break;
- }
- switch (syntax.ParseNextElement()) {
- case CPDF_StreamParser::EndOfData:
- return m_pSyntax->GetPos();
- case CPDF_StreamParser::Keyword:
- if(!OnOperator((char*)syntax.GetWordBuf()) && _PDF_HasInvalidOpChar((char*)syntax.GetWordBuf())) {
- m_bAbort = TRUE;
- }
- if (m_bAbort) {
- return m_pSyntax->GetPos();
- }
- ClearAllParams();
- break;
- case CPDF_StreamParser::Number:
- AddNumberParam((char*)syntax.GetWordBuf(), syntax.GetWordSize());
- break;
- case CPDF_StreamParser::Name:
- AddNameParam((FX_LPCSTR)syntax.GetWordBuf() + 1, syntax.GetWordSize() - 1);
- break;
- default:
- AddObjectParam(syntax.GetObject());
- }
- }
- return m_pSyntax->GetPos();
-}
-void _PDF_ReplaceAbbr(CPDF_Object* pObj);
-void CPDF_StreamContentParser::Handle_BeginImage()
-{
- FX_FILESIZE savePos = m_pSyntax->GetPos();
- CPDF_Dictionary* pDict = CPDF_Dictionary::Create();
- while (1) {
- CPDF_StreamParser::SyntaxType type = m_pSyntax->ParseNextElement();
- if (type == CPDF_StreamParser::Keyword) {
- CFX_ByteString bsKeyword(m_pSyntax->GetWordBuf(), m_pSyntax->GetWordSize());
- if (bsKeyword != FX_BSTRC("ID")) {
- m_pSyntax->SetPos(savePos);
- pDict->Release();
- return;
- }
- }
- if (type != CPDF_StreamParser::Name) {
- break;
- }
- CFX_ByteString key((FX_LPCSTR)m_pSyntax->GetWordBuf() + 1, m_pSyntax->GetWordSize() - 1);
- CPDF_Object* pObj = m_pSyntax->ReadNextObject();
- if (!key.IsEmpty()) {
- pDict->SetAt(key, pObj, m_pDocument);
- } else {
- pObj->Release();
- }
- }
- _PDF_ReplaceAbbr(pDict);
- CPDF_Object* pCSObj = NULL;
- if (pDict->KeyExist(FX_BSTRC("ColorSpace"))) {
- pCSObj = pDict->GetElementValue(FX_BSTRC("ColorSpace"));
- if (pCSObj->GetType() == PDFOBJ_NAME) {
- CFX_ByteString name = pCSObj->GetString();
- if (name != FX_BSTRC("DeviceRGB") && name != FX_BSTRC("DeviceGray") && name != FX_BSTRC("DeviceCMYK")) {
- pCSObj = FindResourceObj(FX_BSTRC("ColorSpace"), name);
- if (pCSObj && !pCSObj->GetObjNum()) {
- pCSObj = pCSObj->Clone();
- pDict->SetAt(FX_BSTRC("ColorSpace"), pCSObj, m_pDocument);
- }
- }
- }
- }
- CPDF_Stream* pStream = m_pSyntax->ReadInlineStream(m_pDocument, pDict, pCSObj, m_Options.m_bDecodeInlineImage);
- while (1) {
- CPDF_StreamParser::SyntaxType type = m_pSyntax->ParseNextElement();
- if (type == CPDF_StreamParser::EndOfData) {
- break;
- }
- if (type != CPDF_StreamParser::Keyword) {
- continue;
- }
- if (m_pSyntax->GetWordSize() == 2 && m_pSyntax->GetWordBuf()[0] == 'E' &&
- m_pSyntax->GetWordBuf()[1] == 'I') {
- break;
- }
- }
- if (m_Options.m_bTextOnly) {
- if (pStream) {
- pStream->Release();
- } else {
- pDict->Release();
- }
- return;
- }
- pDict->SetAtName(FX_BSTRC("Subtype"), FX_BSTRC("Image"));
- CPDF_ImageObject *pImgObj = AddImage(pStream, NULL, TRUE);
- if (!pImgObj) {
- if (pStream) {
- pStream->Release();
- } else {
- pDict->Release();
- }
- }
-}
-void CPDF_StreamContentParser::ParsePathObject()
-{
- FX_FLOAT params[6] = {0};
- int nParams = 0;
- int last_pos = m_pSyntax->GetPos();
- while (1) {
- CPDF_StreamParser::SyntaxType type = m_pSyntax->ParseNextElement();
- FX_BOOL bProcessed = TRUE;
- switch (type) {
- case CPDF_StreamParser::EndOfData:
- return;
- case CPDF_StreamParser::Keyword: {
- int len = m_pSyntax->GetWordSize();
- if (len == 1) {
- switch (m_pSyntax->GetWordBuf()[0]) {
- case 'm':
- AddPathPoint(params[0], params[1], FXPT_MOVETO);
- nParams = 0;
- break;
- case 'l':
- AddPathPoint(params[0], params[1], FXPT_LINETO);
- nParams = 0;
- break;
- case 'c':
- AddPathPoint(params[0], params[1], FXPT_BEZIERTO);
- AddPathPoint(params[2], params[3], FXPT_BEZIERTO);
- AddPathPoint(params[4], params[5], FXPT_BEZIERTO);
- nParams = 0;
- break;
- case 'v':
- AddPathPoint(m_PathCurrentX, m_PathCurrentY, FXPT_BEZIERTO);
- AddPathPoint(params[0], params[1], FXPT_BEZIERTO);
- AddPathPoint(params[2], params[3], FXPT_BEZIERTO);
- nParams = 0;
- break;
- case 'y':
- AddPathPoint(params[0], params[1], FXPT_BEZIERTO);
- AddPathPoint(params[2], params[3], FXPT_BEZIERTO);
- AddPathPoint(params[2], params[3], FXPT_BEZIERTO);
- nParams = 0;
- break;
- case 'h':
- Handle_ClosePath();
- nParams = 0;
- break;
- default:
- bProcessed = FALSE;
- break;
- }
- } else if (len == 2) {
- if (m_pSyntax->GetWordBuf()[0] == 'r' && m_pSyntax->GetWordBuf()[1] == 'e') {
- AddPathRect(params[0], params[1], params[2], params[3]);
- nParams = 0;
- } else {
- bProcessed = FALSE;
- }
- } else {
- bProcessed = FALSE;
- }
- if (bProcessed) {
- last_pos = m_pSyntax->GetPos();
- }
- break;
- }
- case CPDF_StreamParser::Number: {
- if (nParams == 6) {
- break;
- }
- FX_BOOL bInteger;
- int value;
- FX_atonum(CFX_ByteStringC(m_pSyntax->GetWordBuf(), m_pSyntax->GetWordSize()), bInteger, &value);
- params[nParams++] = bInteger ? (FX_FLOAT)value : *(FX_FLOAT*)&value;
- break;
- }
- default:
- bProcessed = FALSE;
- }
- if (!bProcessed) {
- m_pSyntax->SetPos(last_pos);
- return;
- }
- }
-}
-CPDF_StreamParser::CPDF_StreamParser(const FX_BYTE* pData, FX_DWORD dwSize)
-{
- m_pBuf = pData;
- m_Size = dwSize;
- m_Pos = 0;
- m_pLastObj = NULL;
-}
-CPDF_StreamParser::~CPDF_StreamParser()
-{
- if (m_pLastObj) {
- m_pLastObj->Release();
- }
-}
-FX_DWORD _DecodeAllScanlines(ICodec_ScanlineDecoder* pDecoder, FX_LPBYTE& dest_buf, FX_DWORD& dest_size)
-{
- if (pDecoder == NULL) {
- return (FX_DWORD) - 1;
- }
- int ncomps = pDecoder->CountComps();
- int bpc = pDecoder->GetBPC();
- int width = pDecoder->GetWidth();
- int height = pDecoder->GetHeight();
- int pitch = (width * ncomps * bpc + 7) / 8;
- if (height == 0 || pitch > (1 << 30) / height) {
- delete pDecoder;
- return -1;
- }
- dest_size = pitch * height;
- dest_buf = FX_Alloc( FX_BYTE, dest_size);
- for (int row = 0; row < height; row ++) {
- FX_LPBYTE pLine = pDecoder->GetScanline(row);
- if (pLine == NULL) {
- break;
- }
- FXSYS_memcpy32(dest_buf + row * pitch, pLine, pitch);
- }
- FX_DWORD srcoff = pDecoder->GetSrcOffset();
- delete pDecoder;
- return srcoff;
-}
-ICodec_ScanlineDecoder* FPDFAPI_CreateFaxDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,
- const CPDF_Dictionary* pParams);
-FX_DWORD _A85Decode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size);
-FX_DWORD _HexDecode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size);
-FX_DWORD FPDFAPI_FlateOrLZWDecode(FX_BOOL bLZW, const FX_BYTE* src_buf, FX_DWORD src_size, CPDF_Dictionary* pParams,
- FX_DWORD estimated_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size);
-FX_DWORD PDF_DecodeInlineStream(const FX_BYTE* src_buf, FX_DWORD limit,
- int width, int height, CFX_ByteString& decoder,
- CPDF_Dictionary* pParam, FX_LPBYTE& dest_buf, FX_DWORD& dest_size)
-{
- if (decoder == FX_BSTRC("CCITTFaxDecode") || decoder == FX_BSTRC("CCF")) {
- ICodec_ScanlineDecoder* pDecoder = FPDFAPI_CreateFaxDecoder(src_buf, limit, width, height, pParam);
- return _DecodeAllScanlines(pDecoder, dest_buf, dest_size);
- } else if (decoder == FX_BSTRC("ASCII85Decode") || decoder == FX_BSTRC("A85")) {
- return _A85Decode(src_buf, limit, dest_buf, dest_size);
- } else if (decoder == FX_BSTRC("ASCIIHexDecode") || decoder == FX_BSTRC("AHx")) {
- return _HexDecode(src_buf, limit, dest_buf, dest_size);
- } else if (decoder == FX_BSTRC("FlateDecode") || decoder == FX_BSTRC("Fl")) {
- return FPDFAPI_FlateOrLZWDecode(FALSE, src_buf, limit, pParam, dest_size, dest_buf, dest_size);
- } else if (decoder == FX_BSTRC("LZWDecode") || decoder == FX_BSTRC("LZW")) {
- return FPDFAPI_FlateOrLZWDecode(TRUE, src_buf, limit, pParam, 0, dest_buf, dest_size);
- } else if (decoder == FX_BSTRC("DCTDecode") || decoder == FX_BSTRC("DCT")) {
- ICodec_ScanlineDecoder* pDecoder = CPDF_ModuleMgr::Get()->GetJpegModule()->CreateDecoder(
- src_buf, limit, width, height, 0, pParam ? pParam->GetInteger(FX_BSTRC("ColorTransform"), 1) : 1);
- return _DecodeAllScanlines(pDecoder, dest_buf, dest_size);
- } else if (decoder == FX_BSTRC("RunLengthDecode") || decoder == FX_BSTRC("RL")) {
- return RunLengthDecode(src_buf, limit, dest_buf, dest_size);
- }
- dest_size = 0;
- dest_buf = 0;
- return (FX_DWORD) - 1;
-}
-extern const FX_LPCSTR _PDF_CharType;
-CPDF_Stream* CPDF_StreamParser::ReadInlineStream(CPDF_Document* pDoc, CPDF_Dictionary* pDict, CPDF_Object* pCSObj, FX_BOOL bDecode)
-{
- if (m_Pos == m_Size) {
- return NULL;
- }
- if (_PDF_CharType[m_pBuf[m_Pos]] == 'W') {
- m_Pos ++;
- }
- CFX_ByteString Decoder;
- CPDF_Dictionary* pParam = NULL;
- CPDF_Object* pFilter = pDict->GetElementValue(FX_BSTRC("Filter"));
- if (pFilter == NULL) {
- } else if (pFilter->GetType() == PDFOBJ_ARRAY) {
- Decoder = ((CPDF_Array*)pFilter)->GetString(0);
- CPDF_Array* pParams = pDict->GetArray(FX_BSTRC("DecodeParms"));
- if (pParams) {
- pParam = pParams->GetDict(0);
- }
- } else {
- Decoder = pFilter->GetString();
- pParam = pDict->GetDict(FX_BSTRC("DecodeParms"));
- }
- FX_DWORD width = pDict->GetInteger(FX_BSTRC("Width"));
- FX_DWORD height = pDict->GetInteger(FX_BSTRC("Height"));
- FX_DWORD OrigSize = 0;
- if (pCSObj != NULL) {
- FX_DWORD bpc = pDict->GetInteger(FX_BSTRC("BitsPerComponent"));
- FX_DWORD nComponents = 1;
- CPDF_ColorSpace* pCS = pDoc->LoadColorSpace(pCSObj);
- if (pCS == NULL) {
- nComponents = 3;
- } else {
- nComponents = pCS->CountComponents();
- pDoc->GetPageData()->ReleaseColorSpace(pCSObj);
- }
- FX_DWORD pitch = width;
- if (bpc && pitch > INT_MAX / bpc) {
- return NULL;
- }
- pitch *= bpc;
- if (nComponents && pitch > INT_MAX / nComponents) {
- return NULL;
- }
- pitch *= nComponents;
- if (pitch > INT_MAX - 7) {
- return NULL;
- }
- pitch += 7;
- pitch /= 8;
- OrigSize = pitch;
- } else {
- if (width > INT_MAX - 7) {
- return NULL;
- }
- OrigSize = ((width + 7) / 8);
- }
- if (height && OrigSize > INT_MAX / height) {
- return NULL;
- }
- OrigSize *= height;
- FX_LPBYTE pData = NULL;
- FX_DWORD dwStreamSize;
- if (Decoder.IsEmpty()) {
- if (OrigSize > m_Size - m_Pos) {
- OrigSize = m_Size - m_Pos;
- }
- pData = FX_Alloc(FX_BYTE, OrigSize);
- FXSYS_memcpy32(pData, m_pBuf + m_Pos, OrigSize);
- dwStreamSize = OrigSize;
- m_Pos += OrigSize;
- } else {
- FX_DWORD dwDestSize = OrigSize;
- dwStreamSize = PDF_DecodeInlineStream(m_pBuf + m_Pos, m_Size - m_Pos, width, height, Decoder, pParam,
- pData, dwDestSize);
- if ((int)dwStreamSize < 0) {
- return NULL;
- }
- if (bDecode) {
- m_Pos += dwStreamSize;
- dwStreamSize = dwDestSize;
- if (pFilter->GetType() == PDFOBJ_ARRAY) {
- ((CPDF_Array*)pFilter)->RemoveAt(0);
- CPDF_Array* pParams = pDict->GetArray(FX_BSTRC("DecodeParms"));
- if (pParams) {
- pParams->RemoveAt(0);
- }
- } else {
- pDict->RemoveAt(FX_BSTRC("Filter"));
- pDict->RemoveAt(FX_BSTRC("DecodeParms"));
- }
- } else {
- if (pData) {
- FX_Free(pData);
- }
- FX_DWORD dwSavePos = m_Pos;
- m_Pos += dwStreamSize;
- while (1) {
- FX_DWORD dwPrevPos = m_Pos;
- CPDF_StreamParser::SyntaxType type = ParseNextElement();
- if (type == CPDF_StreamParser::EndOfData) {
- break;
- }
- if (type != CPDF_StreamParser::Keyword) {
- dwStreamSize += m_Pos - dwPrevPos;
- continue;
- }
- if (GetWordSize() == 2 && GetWordBuf()[0] == 'E' &&
- GetWordBuf()[1] == 'I') {
- m_Pos = dwPrevPos;
- break;
- }
- dwStreamSize += m_Pos - dwPrevPos;
- }
- m_Pos = dwSavePos;
- pData = FX_Alloc(FX_BYTE, dwStreamSize);
- FXSYS_memcpy32(pData, m_pBuf + m_Pos, dwStreamSize);
- m_Pos += dwStreamSize;
- }
- }
- pDict->SetAtInteger(FX_BSTRC("Length"), (int)dwStreamSize);
- return CPDF_Stream::Create(pData, dwStreamSize, pDict);
-}
-#define MAX_WORD_BUFFER 256
-#define MAX_STRING_LENGTH 32767
-#define FXDWORD_TRUE FXDWORD_FROM_LSBFIRST(0x65757274)
-#define FXDWORD_NULL FXDWORD_FROM_LSBFIRST(0x6c6c756e)
-#define FXDWORD_FALS FXDWORD_FROM_LSBFIRST(0x736c6166)
-CPDF_StreamParser::SyntaxType CPDF_StreamParser::ParseNextElement()
-{
- if (m_pLastObj) {
- m_pLastObj->Release();
- m_pLastObj = NULL;
- }
- m_WordSize = 0;
- FX_BOOL bIsNumber = TRUE;
- if (m_Pos >= m_Size) {
- return EndOfData;
- }
- int ch = m_pBuf[m_Pos++];
- int type = _PDF_CharType[ch];
- while (1) {
- while (type == 'W') {
- if (m_Size <= m_Pos) {
- return EndOfData;
- }
- ch = m_pBuf[m_Pos++];
- type = _PDF_CharType[ch];
- }
- if (ch != '%') {
- break;
- }
- while (1) {
- if (m_Size <= m_Pos) {
- return EndOfData;
- }
- ch = m_pBuf[m_Pos++];
- if (ch == '\r' || ch == '\n') {
- break;
- }
- }
- type = _PDF_CharType[ch];
- }
- if (type == 'D' && ch != '/') {
- m_Pos --;
- m_pLastObj = ReadNextObject();
- return Others;
- }
- while (1) {
- if (m_WordSize < MAX_WORD_BUFFER) {
- m_WordBuffer[m_WordSize++] = ch;
- }
- if (type != 'N') {
- bIsNumber = FALSE;
- }
- if (m_Size <= m_Pos) {
- break;
- }
- ch = m_pBuf[m_Pos++];
- type = _PDF_CharType[ch];
- if (type == 'D' || type == 'W') {
- m_Pos --;
- break;
- }
- }
- m_WordBuffer[m_WordSize] = 0;
- if (bIsNumber) {
- return Number;
- }
- if (m_WordBuffer[0] == '/') {
- return Name;
- }
- if (m_WordSize == 4) {
- if (*(FX_DWORD*)m_WordBuffer == FXDWORD_TRUE) {
- m_pLastObj = CPDF_Boolean::Create(TRUE);
- return Others;
- }
- if (*(FX_DWORD*)m_WordBuffer == FXDWORD_NULL) {
- m_pLastObj = CPDF_Null::Create();
- return Others;
- }
- } else if (m_WordSize == 5) {
- if (*(FX_DWORD*)m_WordBuffer == FXDWORD_FALS && m_WordBuffer[4] == 'e') {
- m_pLastObj = CPDF_Boolean::Create(FALSE);
- return Others;
- }
- }
- return Keyword;
-}
-void CPDF_StreamParser::SkipPathObject()
-{
- FX_DWORD command_startpos = m_Pos;
- if (m_Pos >= m_Size) {
- return;
- }
- int ch = m_pBuf[m_Pos++];
- int type = _PDF_CharType[ch];
- while (1) {
- while (type == 'W') {
- if (m_Pos >= m_Size) {
- return;
- }
- ch = m_pBuf[m_Pos++];
- type = _PDF_CharType[ch];
- }
- if (type != 'N') {
- m_Pos = command_startpos;
- return;
- }
- while (1) {
- while (type != 'W') {
- if (m_Pos >= m_Size) {
- return;
- }
- ch = m_pBuf[m_Pos++];
- type = _PDF_CharType[ch];
- }
- while (type == 'W') {
- if (m_Pos >= m_Size) {
- return;
- }
- ch = m_pBuf[m_Pos++];
- type = _PDF_CharType[ch];
- }
- if (type == 'N') {
- continue;
- }
- FX_DWORD op_startpos = m_Pos - 1;
- while (type != 'W' && type != 'D') {
- if (m_Pos >= m_Size) {
- return;
- }
- ch = m_pBuf[m_Pos++];
- type = _PDF_CharType[ch];
- }
- if (m_Pos - op_startpos == 2) {
- int op = m_pBuf[op_startpos];
- if (op == 'm' || op == 'l' || op == 'c' || op == 'v' || op == 'y') {
- command_startpos = m_Pos;
- break;
- }
- } else if (m_Pos - op_startpos == 3) {
- if (m_pBuf[op_startpos] == 'r' && m_pBuf[op_startpos + 1] == 'e') {
- command_startpos = m_Pos;
- break;
- }
- }
- m_Pos = command_startpos;
- return;
- }
- }
-}
-CPDF_Object* CPDF_StreamParser::ReadNextObject(FX_BOOL bAllowNestedArray, FX_BOOL bInArray)
-{
- FX_BOOL bIsNumber;
- GetNextWord(bIsNumber);
- if (m_WordSize == 0) {
- return NULL;
- }
- if (bIsNumber) {
- m_WordBuffer[m_WordSize] = 0;
- return CPDF_Number::Create(CFX_ByteStringC(m_WordBuffer, m_WordSize));
- }
- int first_char = m_WordBuffer[0];
- if (first_char == '/') {
- return CPDF_Name::Create(PDF_NameDecode(CFX_ByteStringC(m_WordBuffer + 1, m_WordSize - 1)));
- }
- if (first_char == '(') {
- return CPDF_String::Create(ReadString());
- }
- if (first_char == '<') {
- if (m_WordSize == 1) {
- return CPDF_String::Create(ReadHexString(), TRUE);
- }
- CPDF_Dictionary* pDict = CPDF_Dictionary::Create();
- while (1) {
- GetNextWord(bIsNumber);
- if (m_WordSize == 0) {
- pDict->Release();
- return NULL;
- }
- if (m_WordSize == 2 && m_WordBuffer[0] == '>') {
- break;
- }
- if (m_WordBuffer[0] != '/') {
- pDict->Release();
- return NULL;
- }
- CFX_ByteString key = PDF_NameDecode(CFX_ByteStringC(m_WordBuffer + 1, m_WordSize - 1));
- CPDF_Object* pObj = ReadNextObject(TRUE);
- if (pObj == NULL) {
- if (pDict) {
- pDict->Release();
- }
- return NULL;
- }
- if (!key.IsEmpty()) {
- pDict->SetAt(key, pObj);
- } else {
- pObj->Release();
- }
- }
- return pDict;
- }
- if (first_char == '[') {
- if (!bAllowNestedArray && bInArray) {
- return NULL;
- }
- CPDF_Array* pArray = CPDF_Array::Create();
- while (1) {
- CPDF_Object* pObj = ReadNextObject(bAllowNestedArray, TRUE);
- if (pObj == NULL) {
- if (m_WordSize == 0 || m_WordBuffer[0] == ']') {
- return pArray;
- }
- if (m_WordBuffer[0] == '[') {
- continue;
- }
- } else {
- pArray->Add(pObj);
- }
- }
- }
- if (m_WordSize == 4) {
- if (*(FX_DWORD*)m_WordBuffer == FXDWORD_TRUE) {
- return CPDF_Boolean::Create(TRUE);
- }
- if (*(FX_DWORD*)m_WordBuffer == FXDWORD_NULL) {
- return CPDF_Null::Create();
- }
- } else if (m_WordSize == 5) {
- if (*(FX_DWORD*)m_WordBuffer == FXDWORD_FALS && m_WordBuffer[4] == 'e') {
- return CPDF_Boolean::Create(FALSE);
- }
- }
- return NULL;
-}
-void CPDF_StreamParser::GetNextWord(FX_BOOL& bIsNumber)
-{
- m_WordSize = 0;
- bIsNumber = TRUE;
- if (m_Size <= m_Pos) {
- return;
- }
- int ch = m_pBuf[m_Pos++];
- int type = _PDF_CharType[ch];
- while (1) {
- while (type == 'W') {
- if (m_Size <= m_Pos) {
- return;
- }
- ch = m_pBuf[m_Pos++];
- type = _PDF_CharType[ch];
- }
- if (ch != '%') {
- break;
- }
- while (1) {
- if (m_Size <= m_Pos) {
- return;
- }
- ch = m_pBuf[m_Pos++];
- if (ch == '\r' || ch == '\n') {
- break;
- }
- }
- type = _PDF_CharType[ch];
- }
- if (type == 'D') {
- bIsNumber = FALSE;
- m_WordBuffer[m_WordSize++] = ch;
- if (ch == '/') {
- while (1) {
- if (m_Size <= m_Pos) {
- return;
- }
- ch = m_pBuf[m_Pos++];
- type = _PDF_CharType[ch];
- if (type != 'R' && type != 'N') {
- m_Pos --;
- return;
- }
- if (m_WordSize < MAX_WORD_BUFFER) {
- m_WordBuffer[m_WordSize++] = ch;
- }
- }
- } else if (ch == '<') {
- if (m_Size <= m_Pos) {
- return;
- }
- ch = m_pBuf[m_Pos++];
- if (ch == '<') {
- m_WordBuffer[m_WordSize++] = ch;
- } else {
- m_Pos --;
- }
- } else if (ch == '>') {
- if (m_Size <= m_Pos) {
- return;
- }
- ch = m_pBuf[m_Pos++];
- if (ch == '>') {
- m_WordBuffer[m_WordSize++] = ch;
- } else {
- m_Pos --;
- }
- }
- return;
- }
- while (1) {
- if (m_WordSize < MAX_WORD_BUFFER) {
- m_WordBuffer[m_WordSize++] = ch;
- }
- if (type != 'N') {
- bIsNumber = FALSE;
- }
- if (m_Size <= m_Pos) {
- return;
- }
- ch = m_pBuf[m_Pos++];
- type = _PDF_CharType[ch];
- if (type == 'D' || type == 'W') {
- m_Pos --;
- break;
- }
- }
-}
-CFX_ByteString CPDF_StreamParser::ReadString()
-{
- if (m_Size <= m_Pos) {
- return CFX_ByteString();
- }
- int ch = m_pBuf[m_Pos++];
- CFX_ByteTextBuf buf;
- int parlevel = 0;
- int status = 0, iEscCode = 0;
- while (1) {
- switch (status) {
- case 0:
- if (ch == ')') {
- if (parlevel == 0) {
- if (buf.GetLength() > MAX_STRING_LENGTH) {
- return CFX_ByteString(buf.GetBuffer(), MAX_STRING_LENGTH);
- }
- return buf.GetByteString();
- }
- parlevel --;
- buf.AppendChar(')');
- } else if (ch == '(') {
- parlevel ++;
- buf.AppendChar('(');
- } else if (ch == '\\') {
- status = 1;
- } else {
- buf.AppendChar((char)ch);
- }
- break;
- case 1:
- if (ch >= '0' && ch <= '7') {
- iEscCode = ch - '0';
- status = 2;
- break;
- }
- if (ch == 'n') {
- buf.AppendChar('\n');
- } else if (ch == 'r') {
- buf.AppendChar('\r');
- } else if (ch == 't') {
- buf.AppendChar('\t');
- } else if (ch == 'b') {
- buf.AppendChar('\b');
- } else if (ch == 'f') {
- buf.AppendChar('\f');
- } else if (ch == '\r') {
- status = 4;
- break;
- } else if (ch == '\n') {
- } else {
- buf.AppendChar(ch);
- }
- status = 0;
- break;
- case 2:
- if (ch >= '0' && ch <= '7') {
- iEscCode = iEscCode * 8 + ch - '0';
- status = 3;
- } else {
- buf.AppendChar(iEscCode);
- status = 0;
- continue;
- }
- break;
- case 3:
- if (ch >= '0' && ch <= '7') {
- iEscCode = iEscCode * 8 + ch - '0';
- buf.AppendChar(iEscCode);
- status = 0;
- } else {
- buf.AppendChar(iEscCode);
- status = 0;
- continue;
- }
- break;
- case 4:
- status = 0;
- if (ch != '\n') {
- continue;
- }
- break;
- }
- if (m_Size <= m_Pos) {
- break;
- }
- ch = m_pBuf[m_Pos++];
- }
- if (m_Size > m_Pos) {
- ch = m_pBuf[m_Pos++];
- }
- if (buf.GetLength() > MAX_STRING_LENGTH) {
- return CFX_ByteString(buf.GetBuffer(), MAX_STRING_LENGTH);
- }
- return buf.GetByteString();
-}
-CFX_ByteString CPDF_StreamParser::ReadHexString()
-{
- if (m_Size <= m_Pos) {
- return CFX_ByteString();
- }
- int ch = m_pBuf[m_Pos++];
- CFX_ByteTextBuf buf;
- FX_BOOL bFirst = TRUE;
- int code = 0;
- while (1) {
- if (ch == '>') {
- break;
- }
- if (ch >= '0' && ch <= '9') {
- if (bFirst) {
- code = (ch - '0') * 16;
- } else {
- code += ch - '0';
- buf.AppendChar((char)code);
- }
- bFirst = !bFirst;
- } else if (ch >= 'A' && ch <= 'F') {
- if (bFirst) {
- code = (ch - 'A' + 10) * 16;
- } else {
- code += ch - 'A' + 10;
- buf.AppendChar((char)code);
- }
- bFirst = !bFirst;
- } else if (ch >= 'a' && ch <= 'f') {
- if (bFirst) {
- code = (ch - 'a' + 10) * 16;
- } else {
- code += ch - 'a' + 10;
- buf.AppendChar((char)code);
- }
- bFirst = !bFirst;
- }
- if (m_Size <= m_Pos) {
- break;
- }
- ch = m_pBuf[m_Pos++];
- }
- if (!bFirst) {
- buf.AppendChar((char)code);
- }
- if (buf.GetLength() > MAX_STRING_LENGTH) {
- return CFX_ByteString(buf.GetBuffer(), MAX_STRING_LENGTH);
- }
- return buf.GetByteString();
-}
-#define PAGEPARSE_STAGE_GETCONTENT 1
-#define PAGEPARSE_STAGE_PARSE 2
-#define PAGEPARSE_STAGE_CHECKCLIP 3
-CPDF_ContentParser::CPDF_ContentParser()
-{
- m_pParser = NULL;
- m_pStreamArray = NULL;
- m_pSingleStream = NULL;
- m_pData = NULL;
- m_Status = Ready;
- m_pType3Char = NULL;
-}
-CPDF_ContentParser::~CPDF_ContentParser()
-{
- Clear();
-}
-void CPDF_ContentParser::Clear()
-{
- if (m_pParser) {
- delete m_pParser;
- }
- if (m_pSingleStream) {
- delete m_pSingleStream;
- }
- if (m_pStreamArray) {
- for (FX_DWORD i = 0; i < m_nStreams; i ++)
- if (m_pStreamArray[i]) {
- delete m_pStreamArray[i];
- }
- FX_Free(m_pStreamArray);
- }
- if (m_pData && m_pSingleStream == NULL) {
- FX_Free((void*)m_pData);
- }
- m_pParser = NULL;
- m_pStreamArray = NULL;
- m_pSingleStream = NULL;
- m_pData = NULL;
- m_Status = Ready;
-}
-void CPDF_ContentParser::Start(CPDF_Page* pPage, CPDF_ParseOptions* pOptions)
-{
- if (m_Status != Ready || pPage == NULL || pPage->m_pDocument == NULL || pPage->m_pFormDict == NULL) {
- m_Status = Done;
- return;
- }
- m_pObjects = pPage;
- m_bForm = FALSE;
- if (pOptions) {
- m_Options = *pOptions;
- }
- m_Status = ToBeContinued;
- m_InternalStage = PAGEPARSE_STAGE_GETCONTENT;
- m_CurrentOffset = 0;
- CPDF_Object* pContent = pPage->m_pFormDict->GetElementValue(FX_BSTRC("Contents"));
- if (pContent == NULL) {
- m_Status = Done;
- return;
- }
- if (pContent->GetType() == PDFOBJ_STREAM) {
- m_nStreams = 0;
- m_pSingleStream = FX_NEW CPDF_StreamAcc;
- m_pSingleStream->LoadAllData((CPDF_Stream*)pContent, FALSE);
- } else if (pContent->GetType() == PDFOBJ_ARRAY) {
- CPDF_Array* pArray = (CPDF_Array*)pContent;
- m_nStreams = pArray->GetCount();
- if (m_nStreams == 0) {
- m_Status = Done;
- return;
- }
- m_pStreamArray = FX_Alloc(CPDF_StreamAcc*, m_nStreams);
- FXSYS_memset32(m_pStreamArray, 0, sizeof(CPDF_StreamAcc*) * m_nStreams);
- } else {
- m_Status = Done;
- return;
- }
-}
-void CPDF_ContentParser::Start(CPDF_Form* pForm, CPDF_AllStates* pGraphicStates,
- CFX_AffineMatrix* pParentMatrix, CPDF_Type3Char* pType3Char, CPDF_ParseOptions* pOptions, int level)
-{
- m_pType3Char = pType3Char;
- m_pObjects = pForm;
- m_bForm = TRUE;
- CFX_AffineMatrix form_matrix = pForm->m_pFormDict->GetMatrix(FX_BSTRC("Matrix"));
- if (pGraphicStates) {
- form_matrix.Concat(pGraphicStates->m_CTM);
- }
- CPDF_Array* pBBox = pForm->m_pFormDict->GetArray(FX_BSTRC("BBox"));
- CFX_FloatRect form_bbox;
- CPDF_Path ClipPath;
- if (pBBox) {
- form_bbox = pBBox->GetRect();
- ClipPath.New();
- ClipPath.AppendRect(form_bbox.left, form_bbox.bottom, form_bbox.right, form_bbox.top);
- ClipPath.Transform(&form_matrix);
- if (pParentMatrix) {
- ClipPath.Transform(pParentMatrix);
- }
- form_bbox.Transform(&form_matrix);
- if (pParentMatrix) {
- form_bbox.Transform(pParentMatrix);
- }
- }
- CPDF_Dictionary* pResources = pForm->m_pFormDict->GetDict(FX_BSTRC("Resources"));
- m_pParser = FX_NEW CPDF_StreamContentParser;
- m_pParser->Initialize();
- m_pParser->PrepareParse(pForm->m_pDocument, pForm->m_pPageResources, pForm->m_pResources, pParentMatrix, pForm,
- pResources, &form_bbox, pOptions, pGraphicStates, level);
- m_pParser->m_pCurStates->m_CTM = form_matrix;
- m_pParser->m_pCurStates->m_ParentMatrix = form_matrix;
- if (ClipPath.NotNull()) {
- m_pParser->m_pCurStates->m_ClipPath.AppendPath(ClipPath, FXFILL_WINDING, TRUE);
- }
- if (pForm->m_Transparency & PDFTRANS_GROUP) {
- CPDF_GeneralStateData* pData = m_pParser->m_pCurStates->m_GeneralState.GetModify();
- pData->m_BlendType = FXDIB_BLEND_NORMAL;
- pData->m_StrokeAlpha = 1.0f;
- pData->m_FillAlpha = 1.0f;
- pData->m_pSoftMask = NULL;
- }
- m_nStreams = 0;
- m_pSingleStream = FX_NEW CPDF_StreamAcc;
- if (pForm->m_pDocument) {
- m_pSingleStream->LoadAllData(pForm->m_pFormStream, FALSE);
- } else {
- m_pSingleStream->LoadAllData(pForm->m_pFormStream, FALSE);
- }
- m_pData = (FX_LPBYTE)m_pSingleStream->GetData();
- m_Size = m_pSingleStream->GetSize();
- m_Status = ToBeContinued;
- m_InternalStage = PAGEPARSE_STAGE_PARSE;
- m_CurrentOffset = 0;
-}
-void CPDF_ContentParser::Continue(IFX_Pause* pPause)
-{
- int steps = 0;
- while (m_Status == ToBeContinued) {
- if (m_InternalStage == PAGEPARSE_STAGE_GETCONTENT) {
- if (m_CurrentOffset == m_nStreams) {
- if (m_pStreamArray) {
- m_Size = 0;
- FX_DWORD i;
- for (i = 0; i < m_nStreams; i ++) {
- FX_DWORD size = m_pStreamArray[i]->GetSize();
- if (m_Size + size + 1 <= m_Size) {
- m_Status = Done;
- return;
- }
- m_Size += size + 1;
- }
- m_pData = FX_Alloc(FX_BYTE, m_Size);
- if (!m_pData) {
- m_Status = Done;
- return;
- }
- FX_DWORD pos = 0;
- for (i = 0; i < m_nStreams; i ++) {
- FXSYS_memcpy32(m_pData + pos, m_pStreamArray[i]->GetData(), m_pStreamArray[i]->GetSize());
- pos += m_pStreamArray[i]->GetSize() + 1;
- m_pData[pos - 1] = ' ';
- delete m_pStreamArray[i];
- }
- FX_Free(m_pStreamArray);
- m_pStreamArray = NULL;
- } else {
- m_pData = (FX_LPBYTE)m_pSingleStream->GetData();
- m_Size = m_pSingleStream->GetSize();
- }
- m_InternalStage = PAGEPARSE_STAGE_PARSE;
- m_CurrentOffset = 0;
- } else {
- CPDF_Array* pContent = m_pObjects->m_pFormDict->GetArray(FX_BSTRC("Contents"));
- m_pStreamArray[m_CurrentOffset] = FX_NEW CPDF_StreamAcc;
- CPDF_Stream* pStreamObj = (CPDF_Stream*)pContent->GetElementValue(m_CurrentOffset);
- m_pStreamArray[m_CurrentOffset]->LoadAllData(pStreamObj, FALSE);
- m_CurrentOffset ++;
- }
- }
- if (m_InternalStage == PAGEPARSE_STAGE_PARSE) {
- if (m_pParser == NULL) {
- m_pParser = FX_NEW CPDF_StreamContentParser;
- m_pParser->Initialize();
- m_pParser->PrepareParse(m_pObjects->m_pDocument, m_pObjects->m_pPageResources, NULL, NULL, m_pObjects,
- m_pObjects->m_pResources, &m_pObjects->m_BBox, &m_Options, NULL, 0);
- m_pParser->m_pCurStates->m_ColorState.GetModify()->Default();
- }
- if (m_CurrentOffset >= m_Size) {
- m_InternalStage = PAGEPARSE_STAGE_CHECKCLIP;
- } else {
- m_CurrentOffset += m_pParser->Parse(m_pData + m_CurrentOffset, m_Size - m_CurrentOffset, PARSE_STEP_LIMIT);
- if (m_pParser->m_bAbort) {
- m_InternalStage = PAGEPARSE_STAGE_CHECKCLIP;
- continue;
- }
- }
- }
- if (m_InternalStage == PAGEPARSE_STAGE_CHECKCLIP) {
- if (m_pType3Char) {
- m_pType3Char->m_bColored = m_pParser->m_bColored;
- m_pType3Char->m_Width = FXSYS_round(m_pParser->m_Type3Data[0] * 1000);
- m_pType3Char->m_BBox.left = FXSYS_round(m_pParser->m_Type3Data[2] * 1000);
- m_pType3Char->m_BBox.bottom = FXSYS_round(m_pParser->m_Type3Data[3] * 1000);
- m_pType3Char->m_BBox.right = FXSYS_round(m_pParser->m_Type3Data[4] * 1000);
- m_pType3Char->m_BBox.top = FXSYS_round(m_pParser->m_Type3Data[5] * 1000);
- }
- FX_POSITION pos = m_pObjects->m_ObjectList.GetHeadPosition();
- while (pos) {
- CPDF_PageObject* pObj = (CPDF_PageObject*)m_pObjects->m_ObjectList.GetNext(pos);
- if (pObj->m_ClipPath.IsNull()) {
- continue;
- }
- if (pObj->m_ClipPath.GetPathCount() != 1) {
- continue;
- }
- if (pObj->m_ClipPath.GetTextCount()) {
- continue;
- }
- CPDF_Path ClipPath = pObj->m_ClipPath.GetPath(0);
- if (!ClipPath.IsRect() || pObj->m_Type == PDFPAGE_SHADING) {
- continue;
- }
- CFX_FloatRect old_rect(ClipPath.GetPointX(0), ClipPath.GetPointY(0),
- ClipPath.GetPointX(2), ClipPath.GetPointY(2));
- CFX_FloatRect obj_rect(pObj->m_Left, pObj->m_Bottom, pObj->m_Right, pObj->m_Top);
- if (old_rect.Contains(obj_rect)) {
- pObj->m_ClipPath.SetNull();
- }
- }
- m_Status = Done;
- return;
- }
- steps ++;
- if (pPause && pPause->NeedToPauseNow()) {
- break;
- }
- }
-}
-int CPDF_ContentParser::EstimateProgress()
-{
- if (m_Status == Ready) {
- return 0;
- }
- if (m_Status == Done) {
- return 100;
- }
- if (m_InternalStage == PAGEPARSE_STAGE_GETCONTENT) {
- return 10;
- }
- if (m_InternalStage == PAGEPARSE_STAGE_CHECKCLIP) {
- return 90;
- }
- return 10 + 80 * m_CurrentOffset / m_Size;
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fpdfapi/fpdf_page.h"
+#include "../../../include/fpdfapi/fpdf_module.h"
+#include "../../../include/fxcodec/fx_codec.h"
+#include "pageint.h"
+#include <limits.h>
+extern const FX_LPCSTR _PDF_OpCharType =
+ "IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII"
+ "IIVIIIIVIIVIIIIIVVIIIIIIIIIIIIII"
+ "IIVVVVVVIVVVVVVIVVVVVIIVVIIIIIII"
+ "IIVVVVVVVVVVVVVVIVVVIIVVIVVIIIII"
+ "IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII"
+ "IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII"
+ "IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII"
+ "IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII";
+FX_BOOL _PDF_HasInvalidOpChar(FX_LPCSTR op)
+{
+ if(!op) {
+ return FALSE;
+ }
+ FX_BYTE ch;
+ while((ch = *op++)) {
+ if(_PDF_OpCharType[ch] == 'I') {
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+FX_DWORD CPDF_StreamContentParser::Parse(FX_LPCBYTE pData, FX_DWORD dwSize, FX_DWORD max_cost)
+{
+ if (m_Level > _FPDF_MAX_FORM_LEVEL_) {
+ return dwSize;
+ }
+ FX_DWORD InitObjCount = m_pObjectList->CountObjects();
+ CPDF_StreamParser syntax(pData, dwSize);
+ m_pSyntax = &syntax;
+ m_CompatCount = 0;
+ while (1) {
+ FX_DWORD cost = m_pObjectList->CountObjects() - InitObjCount;
+ if (max_cost && cost >= max_cost) {
+ break;
+ }
+ switch (syntax.ParseNextElement()) {
+ case CPDF_StreamParser::EndOfData:
+ return m_pSyntax->GetPos();
+ case CPDF_StreamParser::Keyword:
+ if(!OnOperator((char*)syntax.GetWordBuf()) && _PDF_HasInvalidOpChar((char*)syntax.GetWordBuf())) {
+ m_bAbort = TRUE;
+ }
+ if (m_bAbort) {
+ return m_pSyntax->GetPos();
+ }
+ ClearAllParams();
+ break;
+ case CPDF_StreamParser::Number:
+ AddNumberParam((char*)syntax.GetWordBuf(), syntax.GetWordSize());
+ break;
+ case CPDF_StreamParser::Name:
+ AddNameParam((FX_LPCSTR)syntax.GetWordBuf() + 1, syntax.GetWordSize() - 1);
+ break;
+ default:
+ AddObjectParam(syntax.GetObject());
+ }
+ }
+ return m_pSyntax->GetPos();
+}
+void _PDF_ReplaceAbbr(CPDF_Object* pObj);
+void CPDF_StreamContentParser::Handle_BeginImage()
+{
+ FX_FILESIZE savePos = m_pSyntax->GetPos();
+ CPDF_Dictionary* pDict = CPDF_Dictionary::Create();
+ while (1) {
+ CPDF_StreamParser::SyntaxType type = m_pSyntax->ParseNextElement();
+ if (type == CPDF_StreamParser::Keyword) {
+ CFX_ByteString bsKeyword(m_pSyntax->GetWordBuf(), m_pSyntax->GetWordSize());
+ if (bsKeyword != FX_BSTRC("ID")) {
+ m_pSyntax->SetPos(savePos);
+ pDict->Release();
+ return;
+ }
+ }
+ if (type != CPDF_StreamParser::Name) {
+ break;
+ }
+ CFX_ByteString key((FX_LPCSTR)m_pSyntax->GetWordBuf() + 1, m_pSyntax->GetWordSize() - 1);
+ CPDF_Object* pObj = m_pSyntax->ReadNextObject();
+ if (!key.IsEmpty()) {
+ pDict->SetAt(key, pObj, m_pDocument);
+ } else {
+ pObj->Release();
+ }
+ }
+ _PDF_ReplaceAbbr(pDict);
+ CPDF_Object* pCSObj = NULL;
+ if (pDict->KeyExist(FX_BSTRC("ColorSpace"))) {
+ pCSObj = pDict->GetElementValue(FX_BSTRC("ColorSpace"));
+ if (pCSObj->GetType() == PDFOBJ_NAME) {
+ CFX_ByteString name = pCSObj->GetString();
+ if (name != FX_BSTRC("DeviceRGB") && name != FX_BSTRC("DeviceGray") && name != FX_BSTRC("DeviceCMYK")) {
+ pCSObj = FindResourceObj(FX_BSTRC("ColorSpace"), name);
+ if (pCSObj && !pCSObj->GetObjNum()) {
+ pCSObj = pCSObj->Clone();
+ pDict->SetAt(FX_BSTRC("ColorSpace"), pCSObj, m_pDocument);
+ }
+ }
+ }
+ }
+ CPDF_Stream* pStream = m_pSyntax->ReadInlineStream(m_pDocument, pDict, pCSObj, m_Options.m_bDecodeInlineImage);
+ while (1) {
+ CPDF_StreamParser::SyntaxType type = m_pSyntax->ParseNextElement();
+ if (type == CPDF_StreamParser::EndOfData) {
+ break;
+ }
+ if (type != CPDF_StreamParser::Keyword) {
+ continue;
+ }
+ if (m_pSyntax->GetWordSize() == 2 && m_pSyntax->GetWordBuf()[0] == 'E' &&
+ m_pSyntax->GetWordBuf()[1] == 'I') {
+ break;
+ }
+ }
+ if (m_Options.m_bTextOnly) {
+ if (pStream) {
+ pStream->Release();
+ } else {
+ pDict->Release();
+ }
+ return;
+ }
+ pDict->SetAtName(FX_BSTRC("Subtype"), FX_BSTRC("Image"));
+ CPDF_ImageObject *pImgObj = AddImage(pStream, NULL, TRUE);
+ if (!pImgObj) {
+ if (pStream) {
+ pStream->Release();
+ } else {
+ pDict->Release();
+ }
+ }
+}
+void CPDF_StreamContentParser::ParsePathObject()
+{
+ FX_FLOAT params[6] = {0};
+ int nParams = 0;
+ int last_pos = m_pSyntax->GetPos();
+ while (1) {
+ CPDF_StreamParser::SyntaxType type = m_pSyntax->ParseNextElement();
+ FX_BOOL bProcessed = TRUE;
+ switch (type) {
+ case CPDF_StreamParser::EndOfData:
+ return;
+ case CPDF_StreamParser::Keyword: {
+ int len = m_pSyntax->GetWordSize();
+ if (len == 1) {
+ switch (m_pSyntax->GetWordBuf()[0]) {
+ case 'm':
+ AddPathPoint(params[0], params[1], FXPT_MOVETO);
+ nParams = 0;
+ break;
+ case 'l':
+ AddPathPoint(params[0], params[1], FXPT_LINETO);
+ nParams = 0;
+ break;
+ case 'c':
+ AddPathPoint(params[0], params[1], FXPT_BEZIERTO);
+ AddPathPoint(params[2], params[3], FXPT_BEZIERTO);
+ AddPathPoint(params[4], params[5], FXPT_BEZIERTO);
+ nParams = 0;
+ break;
+ case 'v':
+ AddPathPoint(m_PathCurrentX, m_PathCurrentY, FXPT_BEZIERTO);
+ AddPathPoint(params[0], params[1], FXPT_BEZIERTO);
+ AddPathPoint(params[2], params[3], FXPT_BEZIERTO);
+ nParams = 0;
+ break;
+ case 'y':
+ AddPathPoint(params[0], params[1], FXPT_BEZIERTO);
+ AddPathPoint(params[2], params[3], FXPT_BEZIERTO);
+ AddPathPoint(params[2], params[3], FXPT_BEZIERTO);
+ nParams = 0;
+ break;
+ case 'h':
+ Handle_ClosePath();
+ nParams = 0;
+ break;
+ default:
+ bProcessed = FALSE;
+ break;
+ }
+ } else if (len == 2) {
+ if (m_pSyntax->GetWordBuf()[0] == 'r' && m_pSyntax->GetWordBuf()[1] == 'e') {
+ AddPathRect(params[0], params[1], params[2], params[3]);
+ nParams = 0;
+ } else {
+ bProcessed = FALSE;
+ }
+ } else {
+ bProcessed = FALSE;
+ }
+ if (bProcessed) {
+ last_pos = m_pSyntax->GetPos();
+ }
+ break;
+ }
+ case CPDF_StreamParser::Number: {
+ if (nParams == 6) {
+ break;
+ }
+ FX_BOOL bInteger;
+ int value;
+ FX_atonum(CFX_ByteStringC(m_pSyntax->GetWordBuf(), m_pSyntax->GetWordSize()), bInteger, &value);
+ params[nParams++] = bInteger ? (FX_FLOAT)value : *(FX_FLOAT*)&value;
+ break;
+ }
+ default:
+ bProcessed = FALSE;
+ }
+ if (!bProcessed) {
+ m_pSyntax->SetPos(last_pos);
+ return;
+ }
+ }
+}
+CPDF_StreamParser::CPDF_StreamParser(const FX_BYTE* pData, FX_DWORD dwSize)
+{
+ m_pBuf = pData;
+ m_Size = dwSize;
+ m_Pos = 0;
+ m_pLastObj = NULL;
+}
+CPDF_StreamParser::~CPDF_StreamParser()
+{
+ if (m_pLastObj) {
+ m_pLastObj->Release();
+ }
+}
+FX_DWORD _DecodeAllScanlines(ICodec_ScanlineDecoder* pDecoder, FX_LPBYTE& dest_buf, FX_DWORD& dest_size)
+{
+ if (pDecoder == NULL) {
+ return (FX_DWORD) - 1;
+ }
+ int ncomps = pDecoder->CountComps();
+ int bpc = pDecoder->GetBPC();
+ int width = pDecoder->GetWidth();
+ int height = pDecoder->GetHeight();
+ int pitch = (width * ncomps * bpc + 7) / 8;
+ if (height == 0 || pitch > (1 << 30) / height) {
+ delete pDecoder;
+ return -1;
+ }
+ dest_size = pitch * height;
+ dest_buf = FX_Alloc( FX_BYTE, dest_size);
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE pLine = pDecoder->GetScanline(row);
+ if (pLine == NULL) {
+ break;
+ }
+ FXSYS_memcpy32(dest_buf + row * pitch, pLine, pitch);
+ }
+ FX_DWORD srcoff = pDecoder->GetSrcOffset();
+ delete pDecoder;
+ return srcoff;
+}
+ICodec_ScanlineDecoder* FPDFAPI_CreateFaxDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,
+ const CPDF_Dictionary* pParams);
+FX_DWORD _A85Decode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size);
+FX_DWORD _HexDecode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size);
+FX_DWORD FPDFAPI_FlateOrLZWDecode(FX_BOOL bLZW, const FX_BYTE* src_buf, FX_DWORD src_size, CPDF_Dictionary* pParams,
+ FX_DWORD estimated_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size);
+FX_DWORD PDF_DecodeInlineStream(const FX_BYTE* src_buf, FX_DWORD limit,
+ int width, int height, CFX_ByteString& decoder,
+ CPDF_Dictionary* pParam, FX_LPBYTE& dest_buf, FX_DWORD& dest_size)
+{
+ if (decoder == FX_BSTRC("CCITTFaxDecode") || decoder == FX_BSTRC("CCF")) {
+ ICodec_ScanlineDecoder* pDecoder = FPDFAPI_CreateFaxDecoder(src_buf, limit, width, height, pParam);
+ return _DecodeAllScanlines(pDecoder, dest_buf, dest_size);
+ } else if (decoder == FX_BSTRC("ASCII85Decode") || decoder == FX_BSTRC("A85")) {
+ return _A85Decode(src_buf, limit, dest_buf, dest_size);
+ } else if (decoder == FX_BSTRC("ASCIIHexDecode") || decoder == FX_BSTRC("AHx")) {
+ return _HexDecode(src_buf, limit, dest_buf, dest_size);
+ } else if (decoder == FX_BSTRC("FlateDecode") || decoder == FX_BSTRC("Fl")) {
+ return FPDFAPI_FlateOrLZWDecode(FALSE, src_buf, limit, pParam, dest_size, dest_buf, dest_size);
+ } else if (decoder == FX_BSTRC("LZWDecode") || decoder == FX_BSTRC("LZW")) {
+ return FPDFAPI_FlateOrLZWDecode(TRUE, src_buf, limit, pParam, 0, dest_buf, dest_size);
+ } else if (decoder == FX_BSTRC("DCTDecode") || decoder == FX_BSTRC("DCT")) {
+ ICodec_ScanlineDecoder* pDecoder = CPDF_ModuleMgr::Get()->GetJpegModule()->CreateDecoder(
+ src_buf, limit, width, height, 0, pParam ? pParam->GetInteger(FX_BSTRC("ColorTransform"), 1) : 1);
+ return _DecodeAllScanlines(pDecoder, dest_buf, dest_size);
+ } else if (decoder == FX_BSTRC("RunLengthDecode") || decoder == FX_BSTRC("RL")) {
+ return RunLengthDecode(src_buf, limit, dest_buf, dest_size);
+ }
+ dest_size = 0;
+ dest_buf = 0;
+ return (FX_DWORD) - 1;
+}
+extern const FX_LPCSTR _PDF_CharType;
+CPDF_Stream* CPDF_StreamParser::ReadInlineStream(CPDF_Document* pDoc, CPDF_Dictionary* pDict, CPDF_Object* pCSObj, FX_BOOL bDecode)
+{
+ if (m_Pos == m_Size) {
+ return NULL;
+ }
+ if (_PDF_CharType[m_pBuf[m_Pos]] == 'W') {
+ m_Pos ++;
+ }
+ CFX_ByteString Decoder;
+ CPDF_Dictionary* pParam = NULL;
+ CPDF_Object* pFilter = pDict->GetElementValue(FX_BSTRC("Filter"));
+ if (pFilter == NULL) {
+ } else if (pFilter->GetType() == PDFOBJ_ARRAY) {
+ Decoder = ((CPDF_Array*)pFilter)->GetString(0);
+ CPDF_Array* pParams = pDict->GetArray(FX_BSTRC("DecodeParms"));
+ if (pParams) {
+ pParam = pParams->GetDict(0);
+ }
+ } else {
+ Decoder = pFilter->GetString();
+ pParam = pDict->GetDict(FX_BSTRC("DecodeParms"));
+ }
+ FX_DWORD width = pDict->GetInteger(FX_BSTRC("Width"));
+ FX_DWORD height = pDict->GetInteger(FX_BSTRC("Height"));
+ FX_DWORD OrigSize = 0;
+ if (pCSObj != NULL) {
+ FX_DWORD bpc = pDict->GetInteger(FX_BSTRC("BitsPerComponent"));
+ FX_DWORD nComponents = 1;
+ CPDF_ColorSpace* pCS = pDoc->LoadColorSpace(pCSObj);
+ if (pCS == NULL) {
+ nComponents = 3;
+ } else {
+ nComponents = pCS->CountComponents();
+ pDoc->GetPageData()->ReleaseColorSpace(pCSObj);
+ }
+ FX_DWORD pitch = width;
+ if (bpc && pitch > INT_MAX / bpc) {
+ return NULL;
+ }
+ pitch *= bpc;
+ if (nComponents && pitch > INT_MAX / nComponents) {
+ return NULL;
+ }
+ pitch *= nComponents;
+ if (pitch > INT_MAX - 7) {
+ return NULL;
+ }
+ pitch += 7;
+ pitch /= 8;
+ OrigSize = pitch;
+ } else {
+ if (width > INT_MAX - 7) {
+ return NULL;
+ }
+ OrigSize = ((width + 7) / 8);
+ }
+ if (height && OrigSize > INT_MAX / height) {
+ return NULL;
+ }
+ OrigSize *= height;
+ FX_LPBYTE pData = NULL;
+ FX_DWORD dwStreamSize;
+ if (Decoder.IsEmpty()) {
+ if (OrigSize > m_Size - m_Pos) {
+ OrigSize = m_Size - m_Pos;
+ }
+ pData = FX_Alloc(FX_BYTE, OrigSize);
+ FXSYS_memcpy32(pData, m_pBuf + m_Pos, OrigSize);
+ dwStreamSize = OrigSize;
+ m_Pos += OrigSize;
+ } else {
+ FX_DWORD dwDestSize = OrigSize;
+ dwStreamSize = PDF_DecodeInlineStream(m_pBuf + m_Pos, m_Size - m_Pos, width, height, Decoder, pParam,
+ pData, dwDestSize);
+ if ((int)dwStreamSize < 0) {
+ return NULL;
+ }
+ if (bDecode) {
+ m_Pos += dwStreamSize;
+ dwStreamSize = dwDestSize;
+ if (pFilter->GetType() == PDFOBJ_ARRAY) {
+ ((CPDF_Array*)pFilter)->RemoveAt(0);
+ CPDF_Array* pParams = pDict->GetArray(FX_BSTRC("DecodeParms"));
+ if (pParams) {
+ pParams->RemoveAt(0);
+ }
+ } else {
+ pDict->RemoveAt(FX_BSTRC("Filter"));
+ pDict->RemoveAt(FX_BSTRC("DecodeParms"));
+ }
+ } else {
+ if (pData) {
+ FX_Free(pData);
+ }
+ FX_DWORD dwSavePos = m_Pos;
+ m_Pos += dwStreamSize;
+ while (1) {
+ FX_DWORD dwPrevPos = m_Pos;
+ CPDF_StreamParser::SyntaxType type = ParseNextElement();
+ if (type == CPDF_StreamParser::EndOfData) {
+ break;
+ }
+ if (type != CPDF_StreamParser::Keyword) {
+ dwStreamSize += m_Pos - dwPrevPos;
+ continue;
+ }
+ if (GetWordSize() == 2 && GetWordBuf()[0] == 'E' &&
+ GetWordBuf()[1] == 'I') {
+ m_Pos = dwPrevPos;
+ break;
+ }
+ dwStreamSize += m_Pos - dwPrevPos;
+ }
+ m_Pos = dwSavePos;
+ pData = FX_Alloc(FX_BYTE, dwStreamSize);
+ FXSYS_memcpy32(pData, m_pBuf + m_Pos, dwStreamSize);
+ m_Pos += dwStreamSize;
+ }
+ }
+ pDict->SetAtInteger(FX_BSTRC("Length"), (int)dwStreamSize);
+ return CPDF_Stream::Create(pData, dwStreamSize, pDict);
+}
+#define MAX_WORD_BUFFER 256
+#define MAX_STRING_LENGTH 32767
+#define FXDWORD_TRUE FXDWORD_FROM_LSBFIRST(0x65757274)
+#define FXDWORD_NULL FXDWORD_FROM_LSBFIRST(0x6c6c756e)
+#define FXDWORD_FALS FXDWORD_FROM_LSBFIRST(0x736c6166)
+CPDF_StreamParser::SyntaxType CPDF_StreamParser::ParseNextElement()
+{
+ if (m_pLastObj) {
+ m_pLastObj->Release();
+ m_pLastObj = NULL;
+ }
+ m_WordSize = 0;
+ FX_BOOL bIsNumber = TRUE;
+ if (m_Pos >= m_Size) {
+ return EndOfData;
+ }
+ int ch = m_pBuf[m_Pos++];
+ int type = _PDF_CharType[ch];
+ while (1) {
+ while (type == 'W') {
+ if (m_Size <= m_Pos) {
+ return EndOfData;
+ }
+ ch = m_pBuf[m_Pos++];
+ type = _PDF_CharType[ch];
+ }
+ if (ch != '%') {
+ break;
+ }
+ while (1) {
+ if (m_Size <= m_Pos) {
+ return EndOfData;
+ }
+ ch = m_pBuf[m_Pos++];
+ if (ch == '\r' || ch == '\n') {
+ break;
+ }
+ }
+ type = _PDF_CharType[ch];
+ }
+ if (type == 'D' && ch != '/') {
+ m_Pos --;
+ m_pLastObj = ReadNextObject();
+ return Others;
+ }
+ while (1) {
+ if (m_WordSize < MAX_WORD_BUFFER) {
+ m_WordBuffer[m_WordSize++] = ch;
+ }
+ if (type != 'N') {
+ bIsNumber = FALSE;
+ }
+ if (m_Size <= m_Pos) {
+ break;
+ }
+ ch = m_pBuf[m_Pos++];
+ type = _PDF_CharType[ch];
+ if (type == 'D' || type == 'W') {
+ m_Pos --;
+ break;
+ }
+ }
+ m_WordBuffer[m_WordSize] = 0;
+ if (bIsNumber) {
+ return Number;
+ }
+ if (m_WordBuffer[0] == '/') {
+ return Name;
+ }
+ if (m_WordSize == 4) {
+ if (*(FX_DWORD*)m_WordBuffer == FXDWORD_TRUE) {
+ m_pLastObj = CPDF_Boolean::Create(TRUE);
+ return Others;
+ }
+ if (*(FX_DWORD*)m_WordBuffer == FXDWORD_NULL) {
+ m_pLastObj = CPDF_Null::Create();
+ return Others;
+ }
+ } else if (m_WordSize == 5) {
+ if (*(FX_DWORD*)m_WordBuffer == FXDWORD_FALS && m_WordBuffer[4] == 'e') {
+ m_pLastObj = CPDF_Boolean::Create(FALSE);
+ return Others;
+ }
+ }
+ return Keyword;
+}
+void CPDF_StreamParser::SkipPathObject()
+{
+ FX_DWORD command_startpos = m_Pos;
+ if (m_Pos >= m_Size) {
+ return;
+ }
+ int ch = m_pBuf[m_Pos++];
+ int type = _PDF_CharType[ch];
+ while (1) {
+ while (type == 'W') {
+ if (m_Pos >= m_Size) {
+ return;
+ }
+ ch = m_pBuf[m_Pos++];
+ type = _PDF_CharType[ch];
+ }
+ if (type != 'N') {
+ m_Pos = command_startpos;
+ return;
+ }
+ while (1) {
+ while (type != 'W') {
+ if (m_Pos >= m_Size) {
+ return;
+ }
+ ch = m_pBuf[m_Pos++];
+ type = _PDF_CharType[ch];
+ }
+ while (type == 'W') {
+ if (m_Pos >= m_Size) {
+ return;
+ }
+ ch = m_pBuf[m_Pos++];
+ type = _PDF_CharType[ch];
+ }
+ if (type == 'N') {
+ continue;
+ }
+ FX_DWORD op_startpos = m_Pos - 1;
+ while (type != 'W' && type != 'D') {
+ if (m_Pos >= m_Size) {
+ return;
+ }
+ ch = m_pBuf[m_Pos++];
+ type = _PDF_CharType[ch];
+ }
+ if (m_Pos - op_startpos == 2) {
+ int op = m_pBuf[op_startpos];
+ if (op == 'm' || op == 'l' || op == 'c' || op == 'v' || op == 'y') {
+ command_startpos = m_Pos;
+ break;
+ }
+ } else if (m_Pos - op_startpos == 3) {
+ if (m_pBuf[op_startpos] == 'r' && m_pBuf[op_startpos + 1] == 'e') {
+ command_startpos = m_Pos;
+ break;
+ }
+ }
+ m_Pos = command_startpos;
+ return;
+ }
+ }
+}
+CPDF_Object* CPDF_StreamParser::ReadNextObject(FX_BOOL bAllowNestedArray, FX_BOOL bInArray)
+{
+ FX_BOOL bIsNumber;
+ GetNextWord(bIsNumber);
+ if (m_WordSize == 0) {
+ return NULL;
+ }
+ if (bIsNumber) {
+ m_WordBuffer[m_WordSize] = 0;
+ return CPDF_Number::Create(CFX_ByteStringC(m_WordBuffer, m_WordSize));
+ }
+ int first_char = m_WordBuffer[0];
+ if (first_char == '/') {
+ return CPDF_Name::Create(PDF_NameDecode(CFX_ByteStringC(m_WordBuffer + 1, m_WordSize - 1)));
+ }
+ if (first_char == '(') {
+ return CPDF_String::Create(ReadString());
+ }
+ if (first_char == '<') {
+ if (m_WordSize == 1) {
+ return CPDF_String::Create(ReadHexString(), TRUE);
+ }
+ CPDF_Dictionary* pDict = CPDF_Dictionary::Create();
+ while (1) {
+ GetNextWord(bIsNumber);
+ if (m_WordSize == 0) {
+ pDict->Release();
+ return NULL;
+ }
+ if (m_WordSize == 2 && m_WordBuffer[0] == '>') {
+ break;
+ }
+ if (m_WordBuffer[0] != '/') {
+ pDict->Release();
+ return NULL;
+ }
+ CFX_ByteString key = PDF_NameDecode(CFX_ByteStringC(m_WordBuffer + 1, m_WordSize - 1));
+ CPDF_Object* pObj = ReadNextObject(TRUE);
+ if (pObj == NULL) {
+ if (pDict) {
+ pDict->Release();
+ }
+ return NULL;
+ }
+ if (!key.IsEmpty()) {
+ pDict->SetAt(key, pObj);
+ } else {
+ pObj->Release();
+ }
+ }
+ return pDict;
+ }
+ if (first_char == '[') {
+ if (!bAllowNestedArray && bInArray) {
+ return NULL;
+ }
+ CPDF_Array* pArray = CPDF_Array::Create();
+ while (1) {
+ CPDF_Object* pObj = ReadNextObject(bAllowNestedArray, TRUE);
+ if (pObj == NULL) {
+ if (m_WordSize == 0 || m_WordBuffer[0] == ']') {
+ return pArray;
+ }
+ if (m_WordBuffer[0] == '[') {
+ continue;
+ }
+ } else {
+ pArray->Add(pObj);
+ }
+ }
+ }
+ if (m_WordSize == 4) {
+ if (*(FX_DWORD*)m_WordBuffer == FXDWORD_TRUE) {
+ return CPDF_Boolean::Create(TRUE);
+ }
+ if (*(FX_DWORD*)m_WordBuffer == FXDWORD_NULL) {
+ return CPDF_Null::Create();
+ }
+ } else if (m_WordSize == 5) {
+ if (*(FX_DWORD*)m_WordBuffer == FXDWORD_FALS && m_WordBuffer[4] == 'e') {
+ return CPDF_Boolean::Create(FALSE);
+ }
+ }
+ return NULL;
+}
+void CPDF_StreamParser::GetNextWord(FX_BOOL& bIsNumber)
+{
+ m_WordSize = 0;
+ bIsNumber = TRUE;
+ if (m_Size <= m_Pos) {
+ return;
+ }
+ int ch = m_pBuf[m_Pos++];
+ int type = _PDF_CharType[ch];
+ while (1) {
+ while (type == 'W') {
+ if (m_Size <= m_Pos) {
+ return;
+ }
+ ch = m_pBuf[m_Pos++];
+ type = _PDF_CharType[ch];
+ }
+ if (ch != '%') {
+ break;
+ }
+ while (1) {
+ if (m_Size <= m_Pos) {
+ return;
+ }
+ ch = m_pBuf[m_Pos++];
+ if (ch == '\r' || ch == '\n') {
+ break;
+ }
+ }
+ type = _PDF_CharType[ch];
+ }
+ if (type == 'D') {
+ bIsNumber = FALSE;
+ m_WordBuffer[m_WordSize++] = ch;
+ if (ch == '/') {
+ while (1) {
+ if (m_Size <= m_Pos) {
+ return;
+ }
+ ch = m_pBuf[m_Pos++];
+ type = _PDF_CharType[ch];
+ if (type != 'R' && type != 'N') {
+ m_Pos --;
+ return;
+ }
+ if (m_WordSize < MAX_WORD_BUFFER) {
+ m_WordBuffer[m_WordSize++] = ch;
+ }
+ }
+ } else if (ch == '<') {
+ if (m_Size <= m_Pos) {
+ return;
+ }
+ ch = m_pBuf[m_Pos++];
+ if (ch == '<') {
+ m_WordBuffer[m_WordSize++] = ch;
+ } else {
+ m_Pos --;
+ }
+ } else if (ch == '>') {
+ if (m_Size <= m_Pos) {
+ return;
+ }
+ ch = m_pBuf[m_Pos++];
+ if (ch == '>') {
+ m_WordBuffer[m_WordSize++] = ch;
+ } else {
+ m_Pos --;
+ }
+ }
+ return;
+ }
+ while (1) {
+ if (m_WordSize < MAX_WORD_BUFFER) {
+ m_WordBuffer[m_WordSize++] = ch;
+ }
+ if (type != 'N') {
+ bIsNumber = FALSE;
+ }
+ if (m_Size <= m_Pos) {
+ return;
+ }
+ ch = m_pBuf[m_Pos++];
+ type = _PDF_CharType[ch];
+ if (type == 'D' || type == 'W') {
+ m_Pos --;
+ break;
+ }
+ }
+}
+CFX_ByteString CPDF_StreamParser::ReadString()
+{
+ if (m_Size <= m_Pos) {
+ return CFX_ByteString();
+ }
+ int ch = m_pBuf[m_Pos++];
+ CFX_ByteTextBuf buf;
+ int parlevel = 0;
+ int status = 0, iEscCode = 0;
+ while (1) {
+ switch (status) {
+ case 0:
+ if (ch == ')') {
+ if (parlevel == 0) {
+ if (buf.GetLength() > MAX_STRING_LENGTH) {
+ return CFX_ByteString(buf.GetBuffer(), MAX_STRING_LENGTH);
+ }
+ return buf.GetByteString();
+ }
+ parlevel --;
+ buf.AppendChar(')');
+ } else if (ch == '(') {
+ parlevel ++;
+ buf.AppendChar('(');
+ } else if (ch == '\\') {
+ status = 1;
+ } else {
+ buf.AppendChar((char)ch);
+ }
+ break;
+ case 1:
+ if (ch >= '0' && ch <= '7') {
+ iEscCode = ch - '0';
+ status = 2;
+ break;
+ }
+ if (ch == 'n') {
+ buf.AppendChar('\n');
+ } else if (ch == 'r') {
+ buf.AppendChar('\r');
+ } else if (ch == 't') {
+ buf.AppendChar('\t');
+ } else if (ch == 'b') {
+ buf.AppendChar('\b');
+ } else if (ch == 'f') {
+ buf.AppendChar('\f');
+ } else if (ch == '\r') {
+ status = 4;
+ break;
+ } else if (ch == '\n') {
+ } else {
+ buf.AppendChar(ch);
+ }
+ status = 0;
+ break;
+ case 2:
+ if (ch >= '0' && ch <= '7') {
+ iEscCode = iEscCode * 8 + ch - '0';
+ status = 3;
+ } else {
+ buf.AppendChar(iEscCode);
+ status = 0;
+ continue;
+ }
+ break;
+ case 3:
+ if (ch >= '0' && ch <= '7') {
+ iEscCode = iEscCode * 8 + ch - '0';
+ buf.AppendChar(iEscCode);
+ status = 0;
+ } else {
+ buf.AppendChar(iEscCode);
+ status = 0;
+ continue;
+ }
+ break;
+ case 4:
+ status = 0;
+ if (ch != '\n') {
+ continue;
+ }
+ break;
+ }
+ if (m_Size <= m_Pos) {
+ break;
+ }
+ ch = m_pBuf[m_Pos++];
+ }
+ if (m_Size > m_Pos) {
+ ch = m_pBuf[m_Pos++];
+ }
+ if (buf.GetLength() > MAX_STRING_LENGTH) {
+ return CFX_ByteString(buf.GetBuffer(), MAX_STRING_LENGTH);
+ }
+ return buf.GetByteString();
+}
+CFX_ByteString CPDF_StreamParser::ReadHexString()
+{
+ if (m_Size <= m_Pos) {
+ return CFX_ByteString();
+ }
+ int ch = m_pBuf[m_Pos++];
+ CFX_ByteTextBuf buf;
+ FX_BOOL bFirst = TRUE;
+ int code = 0;
+ while (1) {
+ if (ch == '>') {
+ break;
+ }
+ if (ch >= '0' && ch <= '9') {
+ if (bFirst) {
+ code = (ch - '0') * 16;
+ } else {
+ code += ch - '0';
+ buf.AppendChar((char)code);
+ }
+ bFirst = !bFirst;
+ } else if (ch >= 'A' && ch <= 'F') {
+ if (bFirst) {
+ code = (ch - 'A' + 10) * 16;
+ } else {
+ code += ch - 'A' + 10;
+ buf.AppendChar((char)code);
+ }
+ bFirst = !bFirst;
+ } else if (ch >= 'a' && ch <= 'f') {
+ if (bFirst) {
+ code = (ch - 'a' + 10) * 16;
+ } else {
+ code += ch - 'a' + 10;
+ buf.AppendChar((char)code);
+ }
+ bFirst = !bFirst;
+ }
+ if (m_Size <= m_Pos) {
+ break;
+ }
+ ch = m_pBuf[m_Pos++];
+ }
+ if (!bFirst) {
+ buf.AppendChar((char)code);
+ }
+ if (buf.GetLength() > MAX_STRING_LENGTH) {
+ return CFX_ByteString(buf.GetBuffer(), MAX_STRING_LENGTH);
+ }
+ return buf.GetByteString();
+}
+#define PAGEPARSE_STAGE_GETCONTENT 1
+#define PAGEPARSE_STAGE_PARSE 2
+#define PAGEPARSE_STAGE_CHECKCLIP 3
+CPDF_ContentParser::CPDF_ContentParser()
+{
+ m_pParser = NULL;
+ m_pStreamArray = NULL;
+ m_pSingleStream = NULL;
+ m_pData = NULL;
+ m_Status = Ready;
+ m_pType3Char = NULL;
+}
+CPDF_ContentParser::~CPDF_ContentParser()
+{
+ Clear();
+}
+void CPDF_ContentParser::Clear()
+{
+ if (m_pParser) {
+ delete m_pParser;
+ }
+ if (m_pSingleStream) {
+ delete m_pSingleStream;
+ }
+ if (m_pStreamArray) {
+ for (FX_DWORD i = 0; i < m_nStreams; i ++)
+ if (m_pStreamArray[i]) {
+ delete m_pStreamArray[i];
+ }
+ FX_Free(m_pStreamArray);
+ }
+ if (m_pData && m_pSingleStream == NULL) {
+ FX_Free((void*)m_pData);
+ }
+ m_pParser = NULL;
+ m_pStreamArray = NULL;
+ m_pSingleStream = NULL;
+ m_pData = NULL;
+ m_Status = Ready;
+}
+void CPDF_ContentParser::Start(CPDF_Page* pPage, CPDF_ParseOptions* pOptions)
+{
+ if (m_Status != Ready || pPage == NULL || pPage->m_pDocument == NULL || pPage->m_pFormDict == NULL) {
+ m_Status = Done;
+ return;
+ }
+ m_pObjects = pPage;
+ m_bForm = FALSE;
+ if (pOptions) {
+ m_Options = *pOptions;
+ }
+ m_Status = ToBeContinued;
+ m_InternalStage = PAGEPARSE_STAGE_GETCONTENT;
+ m_CurrentOffset = 0;
+ CPDF_Object* pContent = pPage->m_pFormDict->GetElementValue(FX_BSTRC("Contents"));
+ if (pContent == NULL) {
+ m_Status = Done;
+ return;
+ }
+ if (pContent->GetType() == PDFOBJ_STREAM) {
+ m_nStreams = 0;
+ m_pSingleStream = FX_NEW CPDF_StreamAcc;
+ m_pSingleStream->LoadAllData((CPDF_Stream*)pContent, FALSE);
+ } else if (pContent->GetType() == PDFOBJ_ARRAY) {
+ CPDF_Array* pArray = (CPDF_Array*)pContent;
+ m_nStreams = pArray->GetCount();
+ if (m_nStreams == 0) {
+ m_Status = Done;
+ return;
+ }
+ m_pStreamArray = FX_Alloc(CPDF_StreamAcc*, m_nStreams);
+ FXSYS_memset32(m_pStreamArray, 0, sizeof(CPDF_StreamAcc*) * m_nStreams);
+ } else {
+ m_Status = Done;
+ return;
+ }
+}
+void CPDF_ContentParser::Start(CPDF_Form* pForm, CPDF_AllStates* pGraphicStates,
+ CFX_AffineMatrix* pParentMatrix, CPDF_Type3Char* pType3Char, CPDF_ParseOptions* pOptions, int level)
+{
+ m_pType3Char = pType3Char;
+ m_pObjects = pForm;
+ m_bForm = TRUE;
+ CFX_AffineMatrix form_matrix = pForm->m_pFormDict->GetMatrix(FX_BSTRC("Matrix"));
+ if (pGraphicStates) {
+ form_matrix.Concat(pGraphicStates->m_CTM);
+ }
+ CPDF_Array* pBBox = pForm->m_pFormDict->GetArray(FX_BSTRC("BBox"));
+ CFX_FloatRect form_bbox;
+ CPDF_Path ClipPath;
+ if (pBBox) {
+ form_bbox = pBBox->GetRect();
+ ClipPath.New();
+ ClipPath.AppendRect(form_bbox.left, form_bbox.bottom, form_bbox.right, form_bbox.top);
+ ClipPath.Transform(&form_matrix);
+ if (pParentMatrix) {
+ ClipPath.Transform(pParentMatrix);
+ }
+ form_bbox.Transform(&form_matrix);
+ if (pParentMatrix) {
+ form_bbox.Transform(pParentMatrix);
+ }
+ }
+ CPDF_Dictionary* pResources = pForm->m_pFormDict->GetDict(FX_BSTRC("Resources"));
+ m_pParser = FX_NEW CPDF_StreamContentParser;
+ m_pParser->Initialize();
+ m_pParser->PrepareParse(pForm->m_pDocument, pForm->m_pPageResources, pForm->m_pResources, pParentMatrix, pForm,
+ pResources, &form_bbox, pOptions, pGraphicStates, level);
+ m_pParser->m_pCurStates->m_CTM = form_matrix;
+ m_pParser->m_pCurStates->m_ParentMatrix = form_matrix;
+ if (ClipPath.NotNull()) {
+ m_pParser->m_pCurStates->m_ClipPath.AppendPath(ClipPath, FXFILL_WINDING, TRUE);
+ }
+ if (pForm->m_Transparency & PDFTRANS_GROUP) {
+ CPDF_GeneralStateData* pData = m_pParser->m_pCurStates->m_GeneralState.GetModify();
+ pData->m_BlendType = FXDIB_BLEND_NORMAL;
+ pData->m_StrokeAlpha = 1.0f;
+ pData->m_FillAlpha = 1.0f;
+ pData->m_pSoftMask = NULL;
+ }
+ m_nStreams = 0;
+ m_pSingleStream = FX_NEW CPDF_StreamAcc;
+ if (pForm->m_pDocument) {
+ m_pSingleStream->LoadAllData(pForm->m_pFormStream, FALSE);
+ } else {
+ m_pSingleStream->LoadAllData(pForm->m_pFormStream, FALSE);
+ }
+ m_pData = (FX_LPBYTE)m_pSingleStream->GetData();
+ m_Size = m_pSingleStream->GetSize();
+ m_Status = ToBeContinued;
+ m_InternalStage = PAGEPARSE_STAGE_PARSE;
+ m_CurrentOffset = 0;
+}
+void CPDF_ContentParser::Continue(IFX_Pause* pPause)
+{
+ int steps = 0;
+ while (m_Status == ToBeContinued) {
+ if (m_InternalStage == PAGEPARSE_STAGE_GETCONTENT) {
+ if (m_CurrentOffset == m_nStreams) {
+ if (m_pStreamArray) {
+ m_Size = 0;
+ FX_DWORD i;
+ for (i = 0; i < m_nStreams; i ++) {
+ FX_DWORD size = m_pStreamArray[i]->GetSize();
+ if (m_Size + size + 1 <= m_Size) {
+ m_Status = Done;
+ return;
+ }
+ m_Size += size + 1;
+ }
+ m_pData = FX_Alloc(FX_BYTE, m_Size);
+ if (!m_pData) {
+ m_Status = Done;
+ return;
+ }
+ FX_DWORD pos = 0;
+ for (i = 0; i < m_nStreams; i ++) {
+ FXSYS_memcpy32(m_pData + pos, m_pStreamArray[i]->GetData(), m_pStreamArray[i]->GetSize());
+ pos += m_pStreamArray[i]->GetSize() + 1;
+ m_pData[pos - 1] = ' ';
+ delete m_pStreamArray[i];
+ }
+ FX_Free(m_pStreamArray);
+ m_pStreamArray = NULL;
+ } else {
+ m_pData = (FX_LPBYTE)m_pSingleStream->GetData();
+ m_Size = m_pSingleStream->GetSize();
+ }
+ m_InternalStage = PAGEPARSE_STAGE_PARSE;
+ m_CurrentOffset = 0;
+ } else {
+ CPDF_Array* pContent = m_pObjects->m_pFormDict->GetArray(FX_BSTRC("Contents"));
+ m_pStreamArray[m_CurrentOffset] = FX_NEW CPDF_StreamAcc;
+ CPDF_Stream* pStreamObj = (CPDF_Stream*)pContent->GetElementValue(m_CurrentOffset);
+ m_pStreamArray[m_CurrentOffset]->LoadAllData(pStreamObj, FALSE);
+ m_CurrentOffset ++;
+ }
+ }
+ if (m_InternalStage == PAGEPARSE_STAGE_PARSE) {
+ if (m_pParser == NULL) {
+ m_pParser = FX_NEW CPDF_StreamContentParser;
+ m_pParser->Initialize();
+ m_pParser->PrepareParse(m_pObjects->m_pDocument, m_pObjects->m_pPageResources, NULL, NULL, m_pObjects,
+ m_pObjects->m_pResources, &m_pObjects->m_BBox, &m_Options, NULL, 0);
+ m_pParser->m_pCurStates->m_ColorState.GetModify()->Default();
+ }
+ if (m_CurrentOffset >= m_Size) {
+ m_InternalStage = PAGEPARSE_STAGE_CHECKCLIP;
+ } else {
+ m_CurrentOffset += m_pParser->Parse(m_pData + m_CurrentOffset, m_Size - m_CurrentOffset, PARSE_STEP_LIMIT);
+ if (m_pParser->m_bAbort) {
+ m_InternalStage = PAGEPARSE_STAGE_CHECKCLIP;
+ continue;
+ }
+ }
+ }
+ if (m_InternalStage == PAGEPARSE_STAGE_CHECKCLIP) {
+ if (m_pType3Char) {
+ m_pType3Char->m_bColored = m_pParser->m_bColored;
+ m_pType3Char->m_Width = FXSYS_round(m_pParser->m_Type3Data[0] * 1000);
+ m_pType3Char->m_BBox.left = FXSYS_round(m_pParser->m_Type3Data[2] * 1000);
+ m_pType3Char->m_BBox.bottom = FXSYS_round(m_pParser->m_Type3Data[3] * 1000);
+ m_pType3Char->m_BBox.right = FXSYS_round(m_pParser->m_Type3Data[4] * 1000);
+ m_pType3Char->m_BBox.top = FXSYS_round(m_pParser->m_Type3Data[5] * 1000);
+ }
+ FX_POSITION pos = m_pObjects->m_ObjectList.GetHeadPosition();
+ while (pos) {
+ CPDF_PageObject* pObj = (CPDF_PageObject*)m_pObjects->m_ObjectList.GetNext(pos);
+ if (pObj->m_ClipPath.IsNull()) {
+ continue;
+ }
+ if (pObj->m_ClipPath.GetPathCount() != 1) {
+ continue;
+ }
+ if (pObj->m_ClipPath.GetTextCount()) {
+ continue;
+ }
+ CPDF_Path ClipPath = pObj->m_ClipPath.GetPath(0);
+ if (!ClipPath.IsRect() || pObj->m_Type == PDFPAGE_SHADING) {
+ continue;
+ }
+ CFX_FloatRect old_rect(ClipPath.GetPointX(0), ClipPath.GetPointY(0),
+ ClipPath.GetPointX(2), ClipPath.GetPointY(2));
+ CFX_FloatRect obj_rect(pObj->m_Left, pObj->m_Bottom, pObj->m_Right, pObj->m_Top);
+ if (old_rect.Contains(obj_rect)) {
+ pObj->m_ClipPath.SetNull();
+ }
+ }
+ m_Status = Done;
+ return;
+ }
+ steps ++;
+ if (pPause && pPause->NeedToPauseNow()) {
+ break;
+ }
+ }
+}
+int CPDF_ContentParser::EstimateProgress()
+{
+ if (m_Status == Ready) {
+ return 0;
+ }
+ if (m_Status == Done) {
+ return 100;
+ }
+ if (m_InternalStage == PAGEPARSE_STAGE_GETCONTENT) {
+ return 10;
+ }
+ if (m_InternalStage == PAGEPARSE_STAGE_CHECKCLIP) {
+ return 90;
+ }
+ return 10 + 80 * m_CurrentOffset / m_Size;
+}
diff --git a/core/src/fpdfapi/fpdf_page/fpdf_page_path.cpp b/core/src/fpdfapi/fpdf_page/fpdf_page_path.cpp
index 836c940f5e..8b4d42236b 100644
--- a/core/src/fpdfapi/fpdf_page/fpdf_page_path.cpp
+++ b/core/src/fpdfapi/fpdf_page/fpdf_page_path.cpp
@@ -1,52 +1,52 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../../include/fpdfapi/fpdf_page.h"
-#include "../../../include/fpdfapi/fpdf_pageobj.h"
-#include "../../../include/fpdfapi/fpdf_module.h"
-#include "pageint.h"
-void CPDF_PathObject::CopyData(const CPDF_PageObject* pSrc)
-{
- const CPDF_PathObject* pSrcObj = (const CPDF_PathObject*)pSrc;
- m_Path = pSrcObj->m_Path;
- m_FillType = pSrcObj->m_FillType;
- m_bStroke = pSrcObj->m_bStroke;
- m_Matrix = pSrcObj->m_Matrix;
-}
-void CPDF_PathObject::Transform(const CPDF_Matrix& matrix)
-{
- m_Matrix.Concat(matrix);
- CalcBoundingBox();
-}
-void CPDF_PathObject::SetGraphState(CPDF_GraphState GraphState)
-{
- m_GraphState = GraphState;
- CalcBoundingBox();
-}
-void CPDF_PathObject::CalcBoundingBox()
-{
- if (m_Path.IsNull()) {
- return;
- }
- CFX_FloatRect rect;
- FX_FLOAT width = m_GraphState.GetObject()->m_LineWidth;
- if (m_bStroke && width != 0) {
- rect = m_Path.GetBoundingBox(width, m_GraphState.GetObject()->m_MiterLimit);
- } else {
- rect = m_Path.GetBoundingBox();
- }
- rect.Transform(&m_Matrix);
- if (width == 0 && m_bStroke) {
- rect.left += -0.5f;
- rect.right += 0.5f;
- rect.bottom += -0.5f;
- rect.top += 0.5f;
- }
- m_Left = rect.left;
- m_Right = rect.right;
- m_Top = rect.top;
- m_Bottom = rect.bottom;
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fpdfapi/fpdf_page.h"
+#include "../../../include/fpdfapi/fpdf_pageobj.h"
+#include "../../../include/fpdfapi/fpdf_module.h"
+#include "pageint.h"
+void CPDF_PathObject::CopyData(const CPDF_PageObject* pSrc)
+{
+ const CPDF_PathObject* pSrcObj = (const CPDF_PathObject*)pSrc;
+ m_Path = pSrcObj->m_Path;
+ m_FillType = pSrcObj->m_FillType;
+ m_bStroke = pSrcObj->m_bStroke;
+ m_Matrix = pSrcObj->m_Matrix;
+}
+void CPDF_PathObject::Transform(const CPDF_Matrix& matrix)
+{
+ m_Matrix.Concat(matrix);
+ CalcBoundingBox();
+}
+void CPDF_PathObject::SetGraphState(CPDF_GraphState GraphState)
+{
+ m_GraphState = GraphState;
+ CalcBoundingBox();
+}
+void CPDF_PathObject::CalcBoundingBox()
+{
+ if (m_Path.IsNull()) {
+ return;
+ }
+ CFX_FloatRect rect;
+ FX_FLOAT width = m_GraphState.GetObject()->m_LineWidth;
+ if (m_bStroke && width != 0) {
+ rect = m_Path.GetBoundingBox(width, m_GraphState.GetObject()->m_MiterLimit);
+ } else {
+ rect = m_Path.GetBoundingBox();
+ }
+ rect.Transform(&m_Matrix);
+ if (width == 0 && m_bStroke) {
+ rect.left += -0.5f;
+ rect.right += 0.5f;
+ rect.bottom += -0.5f;
+ rect.top += 0.5f;
+ }
+ m_Left = rect.left;
+ m_Right = rect.right;
+ m_Top = rect.top;
+ m_Bottom = rect.bottom;
+}
diff --git a/core/src/fpdfapi/fpdf_page/fpdf_page_pattern.cpp b/core/src/fpdfapi/fpdf_page/fpdf_page_pattern.cpp
index aee0367acb..6c6c095980 100644
--- a/core/src/fpdfapi/fpdf_page/fpdf_page_pattern.cpp
+++ b/core/src/fpdfapi/fpdf_page/fpdf_page_pattern.cpp
@@ -1,278 +1,278 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../../include/fpdfapi/fpdf_page.h"
-#include "pageint.h"
-CPDF_TilingPattern::CPDF_TilingPattern(CPDF_Document* pDoc, CPDF_Object* pPatternObj, const CFX_AffineMatrix* parentMatrix) :
- CPDF_Pattern(parentMatrix)
-{
- m_PatternType = PATTERN_TILING;
- m_pPatternObj = pPatternObj;
- m_pDocument = pDoc;
- CPDF_Dictionary* pDict = m_pPatternObj->GetDict();
- ASSERT(pDict != NULL);
- m_Pattern2Form = pDict->GetMatrix(FX_BSTRC("Matrix"));
- m_bColored = pDict->GetInteger(FX_BSTRC("PaintType")) == 1;
- if (parentMatrix) {
- m_Pattern2Form.Concat(*parentMatrix);
- }
- m_pForm = NULL;
-}
-CPDF_TilingPattern::~CPDF_TilingPattern()
-{
- if (m_pForm) {
- delete m_pForm;
- }
-}
-FX_BOOL CPDF_TilingPattern::Load()
-{
- if (m_pForm != NULL) {
- return TRUE;
- }
- CPDF_Dictionary* pDict = m_pPatternObj->GetDict();
- if (pDict == NULL) {
- return FALSE;
- }
- m_bColored = pDict->GetInteger(FX_BSTRC("PaintType")) == 1;
- m_XStep = (FX_FLOAT)FXSYS_fabs(pDict->GetNumber(FX_BSTRC("XStep")));
- m_YStep = (FX_FLOAT)FXSYS_fabs(pDict->GetNumber(FX_BSTRC("YStep")));
- if (m_pPatternObj->GetType() != PDFOBJ_STREAM) {
- return FALSE;
- }
- CPDF_Stream* pStream = (CPDF_Stream*)m_pPatternObj;
- m_pForm = FX_NEW CPDF_Form(m_pDocument, NULL, pStream);
- m_pForm->ParseContent(NULL, &m_ParentMatrix, NULL, NULL);
- m_BBox = pDict->GetRect(FX_BSTRC("BBox"));
- return TRUE;
-}
-CPDF_ShadingPattern::CPDF_ShadingPattern(CPDF_Document* pDoc, CPDF_Object* pPatternObj, FX_BOOL bShading, const CFX_AffineMatrix* parentMatrix) : CPDF_Pattern(parentMatrix)
-{
- m_PatternType = PATTERN_SHADING;
- m_pPatternObj = bShading ? NULL : pPatternObj;
- m_pDocument = pDoc;
- m_bShadingObj = bShading;
- if (!bShading) {
- CPDF_Dictionary* pDict = m_pPatternObj->GetDict();
- ASSERT(pDict != NULL);
- m_Pattern2Form = pDict->GetMatrix(FX_BSTRC("Matrix"));
- m_pShadingObj = pDict->GetElementValue(FX_BSTRC("Shading"));
- if (parentMatrix) {
- m_Pattern2Form.Concat(*parentMatrix);
- }
- } else {
- m_pShadingObj = pPatternObj;
- }
- m_ShadingType = 0;
- m_pCS = NULL;
- m_nFuncs = 0;
- for (int i = 0; i < 4; i ++) {
- m_pFunctions[i] = NULL;
- }
-}
-CPDF_ShadingPattern::~CPDF_ShadingPattern()
-{
- Clear();
-}
-void CPDF_ShadingPattern::Clear()
-{
- for (int i = 0; i < m_nFuncs; i ++) {
- if (m_pFunctions[i]) {
- delete m_pFunctions[i];
- }
- m_pFunctions[i] = NULL;
- }
- CPDF_ColorSpace* pCS = m_pCS;
- if (pCS && m_pDocument) {
- m_pDocument->GetPageData()->ReleaseColorSpace(pCS->GetArray());
- }
- m_ShadingType = 0;
- m_pCS = NULL;
- m_nFuncs = 0;
-}
-FX_BOOL CPDF_ShadingPattern::Load()
-{
- if (m_ShadingType != 0) {
- return TRUE;
- }
- CPDF_Dictionary* pShadingDict = m_pShadingObj->GetDict();
- if (pShadingDict == NULL) {
- return FALSE;
- }
- if (m_nFuncs) {
- for (int i = 0; i < m_nFuncs; i ++)
- if (m_pFunctions[i]) {
- delete m_pFunctions[i];
- }
- m_nFuncs = 0;
- }
- CPDF_Object* pFunc = pShadingDict->GetElementValue(FX_BSTRC("Function"));
- if (pFunc) {
- if (pFunc->GetType() == PDFOBJ_ARRAY) {
- m_nFuncs = ((CPDF_Array*)pFunc)->GetCount();
- if (m_nFuncs > 4) {
- m_nFuncs = 4;
- }
- for (int i = 0; i < m_nFuncs; i ++) {
- m_pFunctions[i] = CPDF_Function::Load(((CPDF_Array*)pFunc)->GetElementValue(i));
- }
- } else {
- m_pFunctions[0] = CPDF_Function::Load(pFunc);
- m_nFuncs = 1;
- }
- }
- CPDF_Object* pCSObj = pShadingDict->GetElementValue(FX_BSTRC("ColorSpace"));
- if (pCSObj == NULL) {
- return FALSE;
- }
- CPDF_DocPageData* pDocPageData = m_pDocument->GetPageData();
- m_pCS = pDocPageData->GetColorSpace(pCSObj, NULL);
- m_ShadingType = pShadingDict->GetInteger(FX_BSTRC("ShadingType"));
- return TRUE;
-}
-FX_BOOL CPDF_ShadingPattern::Reload()
-{
- Clear();
- return Load();
-}
-FX_BOOL CPDF_MeshStream::Load(CPDF_Stream* pShadingStream, CPDF_Function** pFuncs, int nFuncs, CPDF_ColorSpace* pCS)
-{
- m_Stream.LoadAllData(pShadingStream);
- m_BitStream.Init(m_Stream.GetData(), m_Stream.GetSize());
- m_pFuncs = pFuncs;
- m_nFuncs = nFuncs;
- m_pCS = pCS;
- CPDF_Dictionary* pDict = pShadingStream->GetDict();
- m_nCoordBits = pDict->GetInteger(FX_BSTRC("BitsPerCoordinate"));
- m_nCompBits = pDict->GetInteger(FX_BSTRC("BitsPerComponent"));
- m_nFlagBits = pDict->GetInteger(FX_BSTRC("BitsPerFlag"));
- if (!m_nCoordBits || !m_nCompBits) {
- return FALSE;
- }
- int nComps = pCS->CountComponents();
- if (nComps > 8) {
- return FALSE;
- }
- m_nComps = nFuncs ? 1 : nComps;
- if (((int)m_nComps < 0) || m_nComps > 8) {
- return FALSE;
- }
- m_CoordMax = m_nCoordBits == 32 ? -1 : (1 << m_nCoordBits) - 1;
- m_CompMax = (1 << m_nCompBits) - 1;
- CPDF_Array* pDecode = pDict->GetArray(FX_BSTRC("Decode"));
- if (pDecode == NULL || pDecode->GetCount() != 4 + m_nComps * 2) {
- return FALSE;
- }
- m_xmin = pDecode->GetNumber(0);
- m_xmax = pDecode->GetNumber(1);
- m_ymin = pDecode->GetNumber(2);
- m_ymax = pDecode->GetNumber(3);
- for (FX_DWORD i = 0; i < m_nComps; i ++) {
- m_ColorMin[i] = pDecode->GetNumber(i * 2 + 4);
- m_ColorMax[i] = pDecode->GetNumber(i * 2 + 5);
- }
- return TRUE;
-}
-FX_DWORD CPDF_MeshStream::GetFlag()
-{
- return m_BitStream.GetBits(m_nFlagBits) & 0x03;
-}
-void CPDF_MeshStream::GetCoords(FX_FLOAT& x, FX_FLOAT& y)
-{
- if (m_nCoordBits == 32) {
- x = m_xmin + (FX_FLOAT)(m_BitStream.GetBits(m_nCoordBits) * (m_xmax - m_xmin) / (double)m_CoordMax);
- y = m_ymin + (FX_FLOAT)(m_BitStream.GetBits(m_nCoordBits) * (m_ymax - m_ymin) / (double)m_CoordMax);
- } else {
- x = m_xmin + m_BitStream.GetBits(m_nCoordBits) * (m_xmax - m_xmin) / m_CoordMax;
- y = m_ymin + m_BitStream.GetBits(m_nCoordBits) * (m_ymax - m_ymin) / m_CoordMax;
- }
-}
-void CPDF_MeshStream::GetColor(FX_FLOAT& r, FX_FLOAT& g, FX_FLOAT& b)
-{
- FX_DWORD i;
- FX_FLOAT color_value[8];
- for (i = 0; i < m_nComps; i ++) {
- color_value[i] = m_ColorMin[i] + m_BitStream.GetBits(m_nCompBits) * (m_ColorMax[i] - m_ColorMin[i]) / m_CompMax;
- }
- if (m_nFuncs) {
- static const int kMaxResults = 8;
- FX_FLOAT result[kMaxResults];
- int nResults;
- FXSYS_memset32(result, 0, sizeof(result));
- for (FX_DWORD i = 0; i < m_nFuncs; i ++) {
- if (m_pFuncs[i] && m_pFuncs[i]->CountOutputs() <= kMaxResults) {
- m_pFuncs[i]->Call(color_value, 1, result, nResults);
- }
- }
- m_pCS->GetRGB(result, r, g, b);
- } else {
- m_pCS->GetRGB(color_value, r, g, b);
- }
-}
-FX_DWORD CPDF_MeshStream::GetVertex(CPDF_MeshVertex& vertex, CFX_AffineMatrix* pObject2Bitmap)
-{
- FX_DWORD flag = GetFlag();
- GetCoords(vertex.x, vertex.y);
- pObject2Bitmap->Transform(vertex.x, vertex.y);
- GetColor(vertex.r, vertex.g, vertex.b);
- m_BitStream.ByteAlign();
- return flag;
-}
-FX_BOOL CPDF_MeshStream::GetVertexRow(CPDF_MeshVertex* vertex, int count, CFX_AffineMatrix* pObject2Bitmap)
-{
- for (int i = 0; i < count; i ++) {
- if (m_BitStream.IsEOF()) {
- return FALSE;
- }
- GetCoords(vertex[i].x, vertex[i].y);
- pObject2Bitmap->Transform(vertex[i].x, vertex[i].y);
- GetColor(vertex[i].r, vertex[i].g, vertex[i].b);
- m_BitStream.ByteAlign();
- }
- return TRUE;
-}
-CFX_FloatRect _GetShadingBBox(CPDF_Stream* pStream, int type, const CFX_AffineMatrix* pMatrix,
- CPDF_Function** pFuncs, int nFuncs, CPDF_ColorSpace* pCS)
-{
- if (pStream == NULL || pStream->GetType() != PDFOBJ_STREAM || pFuncs == NULL || pCS == NULL) {
- return CFX_FloatRect(0, 0, 0, 0);
- }
- CPDF_MeshStream stream;
- if (!stream.Load(pStream, pFuncs, nFuncs, pCS)) {
- return CFX_FloatRect(0, 0, 0, 0);
- }
- CFX_FloatRect rect;
- FX_BOOL bStarted = FALSE;
- FX_BOOL bGouraud = type == 4 || type == 5;
- int full_point_count = type == 7 ? 16 : (type == 6 ? 12 : 1);
- int full_color_count = (type == 6 || type == 7) ? 4 : 1;
- while (!stream.m_BitStream.IsEOF()) {
- FX_DWORD flag;
- if (type != 5) {
- flag = stream.GetFlag();
- }
- int point_count = full_point_count, color_count = full_color_count;
- if (!bGouraud && flag) {
- point_count -= 4;
- color_count -= 2;
- }
- for (int i = 0; i < point_count; i ++) {
- FX_FLOAT x, y;
- stream.GetCoords(x, y);
- if (bStarted) {
- rect.UpdateRect(x, y);
- } else {
- rect.InitRect(x, y);
- bStarted = TRUE;
- }
- }
- stream.m_BitStream.SkipBits(stream.m_nComps * stream.m_nCompBits * color_count);
- if (bGouraud) {
- stream.m_BitStream.ByteAlign();
- }
- }
- rect.Transform(pMatrix);
- return rect;
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fpdfapi/fpdf_page.h"
+#include "pageint.h"
+CPDF_TilingPattern::CPDF_TilingPattern(CPDF_Document* pDoc, CPDF_Object* pPatternObj, const CFX_AffineMatrix* parentMatrix) :
+ CPDF_Pattern(parentMatrix)
+{
+ m_PatternType = PATTERN_TILING;
+ m_pPatternObj = pPatternObj;
+ m_pDocument = pDoc;
+ CPDF_Dictionary* pDict = m_pPatternObj->GetDict();
+ ASSERT(pDict != NULL);
+ m_Pattern2Form = pDict->GetMatrix(FX_BSTRC("Matrix"));
+ m_bColored = pDict->GetInteger(FX_BSTRC("PaintType")) == 1;
+ if (parentMatrix) {
+ m_Pattern2Form.Concat(*parentMatrix);
+ }
+ m_pForm = NULL;
+}
+CPDF_TilingPattern::~CPDF_TilingPattern()
+{
+ if (m_pForm) {
+ delete m_pForm;
+ }
+}
+FX_BOOL CPDF_TilingPattern::Load()
+{
+ if (m_pForm != NULL) {
+ return TRUE;
+ }
+ CPDF_Dictionary* pDict = m_pPatternObj->GetDict();
+ if (pDict == NULL) {
+ return FALSE;
+ }
+ m_bColored = pDict->GetInteger(FX_BSTRC("PaintType")) == 1;
+ m_XStep = (FX_FLOAT)FXSYS_fabs(pDict->GetNumber(FX_BSTRC("XStep")));
+ m_YStep = (FX_FLOAT)FXSYS_fabs(pDict->GetNumber(FX_BSTRC("YStep")));
+ if (m_pPatternObj->GetType() != PDFOBJ_STREAM) {
+ return FALSE;
+ }
+ CPDF_Stream* pStream = (CPDF_Stream*)m_pPatternObj;
+ m_pForm = FX_NEW CPDF_Form(m_pDocument, NULL, pStream);
+ m_pForm->ParseContent(NULL, &m_ParentMatrix, NULL, NULL);
+ m_BBox = pDict->GetRect(FX_BSTRC("BBox"));
+ return TRUE;
+}
+CPDF_ShadingPattern::CPDF_ShadingPattern(CPDF_Document* pDoc, CPDF_Object* pPatternObj, FX_BOOL bShading, const CFX_AffineMatrix* parentMatrix) : CPDF_Pattern(parentMatrix)
+{
+ m_PatternType = PATTERN_SHADING;
+ m_pPatternObj = bShading ? NULL : pPatternObj;
+ m_pDocument = pDoc;
+ m_bShadingObj = bShading;
+ if (!bShading) {
+ CPDF_Dictionary* pDict = m_pPatternObj->GetDict();
+ ASSERT(pDict != NULL);
+ m_Pattern2Form = pDict->GetMatrix(FX_BSTRC("Matrix"));
+ m_pShadingObj = pDict->GetElementValue(FX_BSTRC("Shading"));
+ if (parentMatrix) {
+ m_Pattern2Form.Concat(*parentMatrix);
+ }
+ } else {
+ m_pShadingObj = pPatternObj;
+ }
+ m_ShadingType = 0;
+ m_pCS = NULL;
+ m_nFuncs = 0;
+ for (int i = 0; i < 4; i ++) {
+ m_pFunctions[i] = NULL;
+ }
+}
+CPDF_ShadingPattern::~CPDF_ShadingPattern()
+{
+ Clear();
+}
+void CPDF_ShadingPattern::Clear()
+{
+ for (int i = 0; i < m_nFuncs; i ++) {
+ if (m_pFunctions[i]) {
+ delete m_pFunctions[i];
+ }
+ m_pFunctions[i] = NULL;
+ }
+ CPDF_ColorSpace* pCS = m_pCS;
+ if (pCS && m_pDocument) {
+ m_pDocument->GetPageData()->ReleaseColorSpace(pCS->GetArray());
+ }
+ m_ShadingType = 0;
+ m_pCS = NULL;
+ m_nFuncs = 0;
+}
+FX_BOOL CPDF_ShadingPattern::Load()
+{
+ if (m_ShadingType != 0) {
+ return TRUE;
+ }
+ CPDF_Dictionary* pShadingDict = m_pShadingObj->GetDict();
+ if (pShadingDict == NULL) {
+ return FALSE;
+ }
+ if (m_nFuncs) {
+ for (int i = 0; i < m_nFuncs; i ++)
+ if (m_pFunctions[i]) {
+ delete m_pFunctions[i];
+ }
+ m_nFuncs = 0;
+ }
+ CPDF_Object* pFunc = pShadingDict->GetElementValue(FX_BSTRC("Function"));
+ if (pFunc) {
+ if (pFunc->GetType() == PDFOBJ_ARRAY) {
+ m_nFuncs = ((CPDF_Array*)pFunc)->GetCount();
+ if (m_nFuncs > 4) {
+ m_nFuncs = 4;
+ }
+ for (int i = 0; i < m_nFuncs; i ++) {
+ m_pFunctions[i] = CPDF_Function::Load(((CPDF_Array*)pFunc)->GetElementValue(i));
+ }
+ } else {
+ m_pFunctions[0] = CPDF_Function::Load(pFunc);
+ m_nFuncs = 1;
+ }
+ }
+ CPDF_Object* pCSObj = pShadingDict->GetElementValue(FX_BSTRC("ColorSpace"));
+ if (pCSObj == NULL) {
+ return FALSE;
+ }
+ CPDF_DocPageData* pDocPageData = m_pDocument->GetPageData();
+ m_pCS = pDocPageData->GetColorSpace(pCSObj, NULL);
+ m_ShadingType = pShadingDict->GetInteger(FX_BSTRC("ShadingType"));
+ return TRUE;
+}
+FX_BOOL CPDF_ShadingPattern::Reload()
+{
+ Clear();
+ return Load();
+}
+FX_BOOL CPDF_MeshStream::Load(CPDF_Stream* pShadingStream, CPDF_Function** pFuncs, int nFuncs, CPDF_ColorSpace* pCS)
+{
+ m_Stream.LoadAllData(pShadingStream);
+ m_BitStream.Init(m_Stream.GetData(), m_Stream.GetSize());
+ m_pFuncs = pFuncs;
+ m_nFuncs = nFuncs;
+ m_pCS = pCS;
+ CPDF_Dictionary* pDict = pShadingStream->GetDict();
+ m_nCoordBits = pDict->GetInteger(FX_BSTRC("BitsPerCoordinate"));
+ m_nCompBits = pDict->GetInteger(FX_BSTRC("BitsPerComponent"));
+ m_nFlagBits = pDict->GetInteger(FX_BSTRC("BitsPerFlag"));
+ if (!m_nCoordBits || !m_nCompBits) {
+ return FALSE;
+ }
+ int nComps = pCS->CountComponents();
+ if (nComps > 8) {
+ return FALSE;
+ }
+ m_nComps = nFuncs ? 1 : nComps;
+ if (((int)m_nComps < 0) || m_nComps > 8) {
+ return FALSE;
+ }
+ m_CoordMax = m_nCoordBits == 32 ? -1 : (1 << m_nCoordBits) - 1;
+ m_CompMax = (1 << m_nCompBits) - 1;
+ CPDF_Array* pDecode = pDict->GetArray(FX_BSTRC("Decode"));
+ if (pDecode == NULL || pDecode->GetCount() != 4 + m_nComps * 2) {
+ return FALSE;
+ }
+ m_xmin = pDecode->GetNumber(0);
+ m_xmax = pDecode->GetNumber(1);
+ m_ymin = pDecode->GetNumber(2);
+ m_ymax = pDecode->GetNumber(3);
+ for (FX_DWORD i = 0; i < m_nComps; i ++) {
+ m_ColorMin[i] = pDecode->GetNumber(i * 2 + 4);
+ m_ColorMax[i] = pDecode->GetNumber(i * 2 + 5);
+ }
+ return TRUE;
+}
+FX_DWORD CPDF_MeshStream::GetFlag()
+{
+ return m_BitStream.GetBits(m_nFlagBits) & 0x03;
+}
+void CPDF_MeshStream::GetCoords(FX_FLOAT& x, FX_FLOAT& y)
+{
+ if (m_nCoordBits == 32) {
+ x = m_xmin + (FX_FLOAT)(m_BitStream.GetBits(m_nCoordBits) * (m_xmax - m_xmin) / (double)m_CoordMax);
+ y = m_ymin + (FX_FLOAT)(m_BitStream.GetBits(m_nCoordBits) * (m_ymax - m_ymin) / (double)m_CoordMax);
+ } else {
+ x = m_xmin + m_BitStream.GetBits(m_nCoordBits) * (m_xmax - m_xmin) / m_CoordMax;
+ y = m_ymin + m_BitStream.GetBits(m_nCoordBits) * (m_ymax - m_ymin) / m_CoordMax;
+ }
+}
+void CPDF_MeshStream::GetColor(FX_FLOAT& r, FX_FLOAT& g, FX_FLOAT& b)
+{
+ FX_DWORD i;
+ FX_FLOAT color_value[8];
+ for (i = 0; i < m_nComps; i ++) {
+ color_value[i] = m_ColorMin[i] + m_BitStream.GetBits(m_nCompBits) * (m_ColorMax[i] - m_ColorMin[i]) / m_CompMax;
+ }
+ if (m_nFuncs) {
+ static const int kMaxResults = 8;
+ FX_FLOAT result[kMaxResults];
+ int nResults;
+ FXSYS_memset32(result, 0, sizeof(result));
+ for (FX_DWORD i = 0; i < m_nFuncs; i ++) {
+ if (m_pFuncs[i] && m_pFuncs[i]->CountOutputs() <= kMaxResults) {
+ m_pFuncs[i]->Call(color_value, 1, result, nResults);
+ }
+ }
+ m_pCS->GetRGB(result, r, g, b);
+ } else {
+ m_pCS->GetRGB(color_value, r, g, b);
+ }
+}
+FX_DWORD CPDF_MeshStream::GetVertex(CPDF_MeshVertex& vertex, CFX_AffineMatrix* pObject2Bitmap)
+{
+ FX_DWORD flag = GetFlag();
+ GetCoords(vertex.x, vertex.y);
+ pObject2Bitmap->Transform(vertex.x, vertex.y);
+ GetColor(vertex.r, vertex.g, vertex.b);
+ m_BitStream.ByteAlign();
+ return flag;
+}
+FX_BOOL CPDF_MeshStream::GetVertexRow(CPDF_MeshVertex* vertex, int count, CFX_AffineMatrix* pObject2Bitmap)
+{
+ for (int i = 0; i < count; i ++) {
+ if (m_BitStream.IsEOF()) {
+ return FALSE;
+ }
+ GetCoords(vertex[i].x, vertex[i].y);
+ pObject2Bitmap->Transform(vertex[i].x, vertex[i].y);
+ GetColor(vertex[i].r, vertex[i].g, vertex[i].b);
+ m_BitStream.ByteAlign();
+ }
+ return TRUE;
+}
+CFX_FloatRect _GetShadingBBox(CPDF_Stream* pStream, int type, const CFX_AffineMatrix* pMatrix,
+ CPDF_Function** pFuncs, int nFuncs, CPDF_ColorSpace* pCS)
+{
+ if (pStream == NULL || pStream->GetType() != PDFOBJ_STREAM || pFuncs == NULL || pCS == NULL) {
+ return CFX_FloatRect(0, 0, 0, 0);
+ }
+ CPDF_MeshStream stream;
+ if (!stream.Load(pStream, pFuncs, nFuncs, pCS)) {
+ return CFX_FloatRect(0, 0, 0, 0);
+ }
+ CFX_FloatRect rect;
+ FX_BOOL bStarted = FALSE;
+ FX_BOOL bGouraud = type == 4 || type == 5;
+ int full_point_count = type == 7 ? 16 : (type == 6 ? 12 : 1);
+ int full_color_count = (type == 6 || type == 7) ? 4 : 1;
+ while (!stream.m_BitStream.IsEOF()) {
+ FX_DWORD flag;
+ if (type != 5) {
+ flag = stream.GetFlag();
+ }
+ int point_count = full_point_count, color_count = full_color_count;
+ if (!bGouraud && flag) {
+ point_count -= 4;
+ color_count -= 2;
+ }
+ for (int i = 0; i < point_count; i ++) {
+ FX_FLOAT x, y;
+ stream.GetCoords(x, y);
+ if (bStarted) {
+ rect.UpdateRect(x, y);
+ } else {
+ rect.InitRect(x, y);
+ bStarted = TRUE;
+ }
+ }
+ stream.m_BitStream.SkipBits(stream.m_nComps * stream.m_nCompBits * color_count);
+ if (bGouraud) {
+ stream.m_BitStream.ByteAlign();
+ }
+ }
+ rect.Transform(pMatrix);
+ return rect;
+}
diff --git a/core/src/fpdfapi/fpdf_page/pageint.h b/core/src/fpdfapi/fpdf_page/pageint.h
index b1a83ec236..4e097ca49e 100644
--- a/core/src/fpdfapi/fpdf_page/pageint.h
+++ b/core/src/fpdfapi/fpdf_page/pageint.h
@@ -1,505 +1,505 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../../include/fpdfapi/fpdf_pageobj.h"
-#define PARSE_STEP_LIMIT 100
-#define STREAM_PARSE_BUFSIZE 20480
-class CPDF_QuickFontCache;
-#ifndef _FPDFAPI_MINI_
-class CPDF_StreamParser : public CFX_Object
-{
-public:
-
- CPDF_StreamParser(const FX_BYTE* pData, FX_DWORD dwSize);
- ~CPDF_StreamParser();
-
- CPDF_Stream* ReadInlineStream(CPDF_Document* pDoc, CPDF_Dictionary* pDict, CPDF_Object* pCSObj, FX_BOOL bDecode);
- typedef enum { EndOfData, Number, Keyword, Name, Others } SyntaxType;
-
- SyntaxType ParseNextElement();
- FX_LPBYTE GetWordBuf()
- {
- return m_WordBuffer;
- }
- FX_DWORD GetWordSize()
- {
- return m_WordSize;
- }
- CPDF_Object* GetObject()
- {
- CPDF_Object* pObj = m_pLastObj;
- m_pLastObj = NULL;
- return pObj;
- }
- FX_DWORD GetPos()
- {
- return m_Pos;
- }
- void SetPos(FX_DWORD pos)
- {
- m_Pos = pos;
- }
-
- CPDF_Object* ReadNextObject(FX_BOOL bAllowNestedArray = FALSE, FX_BOOL bInArray = FALSE);
- void SkipPathObject();
-protected:
- void GetNextWord(FX_BOOL& bIsNumber);
- CFX_ByteString ReadString();
- CFX_ByteString ReadHexString();
- const FX_BYTE* m_pBuf;
- FX_DWORD m_Size;
- FX_DWORD m_Pos;
- FX_BYTE m_WordBuffer[256];
- FX_DWORD m_WordSize;
- CPDF_Object* m_pLastObj;
-};
-#endif
-typedef enum {
- PDFOP_CloseFillStrokePath = 0, PDFOP_FillStrokePath,
- PDFOP_CloseEOFillStrokePath, PDFOP_EOFillStrokePath,
- PDFOP_BeginMarkedContent_Dictionary, PDFOP_BeginImage,
- PDFOP_BeginMarkedContent, PDFOP_BeginText,
- PDFOP_BeginSectionUndefined, PDFOP_CurveTo_123,
- PDFOP_ConcatMatrix, PDFOP_SetColorSpace_Fill,
- PDFOP_SetColorSpace_Stroke, PDFOP_SetDash,
- PDFOP_SetCharWidth, PDFOP_SetCachedDevice,
- PDFOP_ExecuteXObject, PDFOP_MarkPlace_Dictionary,
- PDFOP_EndImage, PDFOP_EndMarkedContent,
- PDFOP_EndText, PDFOP_EndSectionUndefined,
- PDFOP_FillPath, PDFOP_FillPathOld,
- PDFOP_EOFillPath, PDFOP_SetGray_Fill,
- PDFOP_SetGray_Stroke, PDFOP_SetExtendGraphState,
- PDFOP_ClosePath, PDFOP_SetFlat,
- PDFOP_BeginImageData, PDFOP_SetLineJoin,
- PDFOP_SetLineCap, PDFOP_SetCMYKColor_Fill,
- PDFOP_SetCMYKColor_Stroke, PDFOP_LineTo,
- PDFOP_MoveTo, PDFOP_SetMiterLimit,
- PDFOP_MarkPlace, PDFOP_EndPath,
- PDFOP_SaveGraphState, PDFOP_RestoreGraphState,
- PDFOP_Rectangle, PDFOP_SetRGBColor_Fill,
- PDFOP_SetRGBColor_Stroke, PDFOP_SetRenderIntent,
- PDFOP_CloseStrokePath, PDFOP_StrokePath,
- PDFOP_SetColor_Fill, PDFOP_SetColor_Stroke,
- PDFOP_SetColorPS_Fill, PDFOP_SetColorPS_Stroke,
- PDFOP_ShadeFill, PDFOP_SetCharSpace,
- PDFOP_MoveTextPoint, PDFOP_MoveTextPoint_SetLeading,
- PDFOP_SetFont, PDFOP_ShowText,
- PDFOP_ShowText_Positioning, PDFOP_SetTextLeading,
- PDFOP_SetTextMatrix, PDFOP_SetTextRenderMode,
- PDFOP_SetTextRise, PDFOP_SetWordSpace,
- PDFOP_SetHorzScale, PDFOP_MoveToNextLine,
- PDFOP_CurveTo_23, PDFOP_SetLineWidth,
- PDFOP_Clip, PDFOP_EOClip,
- PDFOP_CurveTo_13, PDFOP_NextLineShowText,
- PDFOP_NextLineShowText_Space, PDFOP_Invalid
-} PDFOP;
-#define PARAM_BUF_SIZE 16
-typedef struct {
- int m_Type;
- union {
- struct {
- FX_BOOL m_bInteger;
- union {
- int m_Integer;
- FX_FLOAT m_Float;
- };
- } m_Number;
- CPDF_Object* m_pObject;
- struct {
- int m_Len;
- char m_Buffer[32];
- } m_Name;
- };
-} _ContentParam;
-#if defined(_FPDFAPI_MINI_)
-#define _FPDF_MAX_FORM_LEVEL_ 17
-#else
-#define _FPDF_MAX_FORM_LEVEL_ 30
-#endif
-#define _FPDF_MAX_TYPE3_FORM_LEVEL_ 4
-#define _FPDF_MAX_OBJECT_STACK_SIZE_ 512
-class CPDF_StreamContentParser : public CFX_Object
-{
-public:
- CPDF_StreamContentParser();
- ~CPDF_StreamContentParser();
- FX_BOOL Initialize();
- void PrepareParse(CPDF_Document* pDoc, CPDF_Dictionary* pPageResources, CPDF_Dictionary* pParentResources,
- CFX_AffineMatrix* pmtContentToUser,
- CPDF_PageObjects* pObjList, CPDF_Dictionary* pResources,
- CFX_FloatRect* pBBox, CPDF_ParseOptions* pOptions,
- CPDF_AllStates* pAllStates, int level);
- CPDF_Document* m_pDocument;
- CPDF_Dictionary* m_pPageResources;
- CPDF_Dictionary* m_pParentResources;
- CPDF_PageObjects* m_pObjectList;
- CPDF_Dictionary* m_pResources;
- int m_Level;
- CFX_AffineMatrix m_mtContentToUser;
- CFX_FloatRect m_BBox;
- CPDF_ParseOptions m_Options;
- _ContentParam m_ParamBuf1[PARAM_BUF_SIZE];
- FX_DWORD m_ParamStartPos;
- FX_DWORD m_ParamCount;
- void AddNumberParam(FX_LPCSTR str, int len);
- void AddObjectParam(CPDF_Object* pObj);
- void AddNameParam(FX_LPCSTR name, int size);
- int GetNextParamPos();
- void ClearAllParams();
- CPDF_Object* GetObject(FX_DWORD index);
- CFX_ByteString GetString(FX_DWORD index);
- FX_FLOAT GetNumber(FX_DWORD index);
- FX_FLOAT GetNumber16(FX_DWORD index);
- int GetInteger(FX_DWORD index)
- {
- return (FX_INT32)(GetNumber(index));
- }
- FX_BOOL OnOperator(FX_LPCSTR op);
- void BigCaseCaller(int index);
- FX_BOOL m_bAbort;
-#ifndef _FPDFAPI_MINI_
- CPDF_StreamParser* m_pSyntax;
- FX_DWORD GetParsePos()
- {
- return m_pSyntax->GetPos();
- }
-#else
- int m_WordState;
- void InputData(FX_LPCBYTE src_buf, FX_DWORD src_size);
- void Finish();
- void StartArray();
- void EndArray();
- void StartDict();
- void EndDict();
- void EndName();
- void EndNumber();
- void EndKeyword();
- void EndHexString();
- void EndString();
- void EndImageDict();
- void EndInlineImage();
- FX_LPBYTE m_pWordBuf;
- FX_DWORD m_WordSize;
- CFX_BinaryBuf m_StringBuf;
- int m_StringLevel, m_StringState, m_EscCode;
- void AddContainer(CPDF_Object* pObject);
- FX_BOOL SetToCurObj(CPDF_Object* pObject);
- FX_LPBYTE m_pDictName;
- FX_BOOL m_bDictName;
- CPDF_Object** m_pObjectStack;
- FX_BOOL* m_pObjectState;
- FX_DWORD m_ObjectSize;
- int m_InlineImageState;
- FX_BYTE m_InlineWhiteChar;
- CFX_BinaryBuf m_ImageSrcBuf;
- FX_LPBYTE m_pStreamBuf;
-#endif
- CPDF_AllStates* m_pCurStates;
- CPDF_ContentMark m_CurContentMark;
- CFX_PtrArray m_ClipTextList;
- CPDF_TextObject* m_pLastTextObject;
- FX_FLOAT m_DefFontSize;
- void AddTextObject(CFX_ByteString* pText, FX_FLOAT fInitKerning, FX_FLOAT* pKerning, int count);
-
- void ConvertUserSpace(FX_FLOAT& x, FX_FLOAT& y);
- void ConvertTextSpace(FX_FLOAT& x, FX_FLOAT& y);
- void OnChangeTextMatrix();
-#ifndef _FPDFAPI_MINI_
- FX_DWORD Parse(FX_LPCBYTE pData, FX_DWORD dwSize, FX_DWORD max_cost);
- void ParsePathObject();
-#endif
- int m_CompatCount;
- FX_PATHPOINT* m_pPathPoints;
- int m_PathPointCount;
- int m_PathAllocSize;
- FX_FLOAT m_PathStartX, m_PathStartY;
- FX_FLOAT m_PathCurrentX, m_PathCurrentY;
- int m_PathClipType;
- void AddPathPoint(FX_FLOAT x, FX_FLOAT y, int flag);
- void AddPathRect(FX_FLOAT x, FX_FLOAT y, FX_FLOAT w, FX_FLOAT h);
- void AddPathObject(int FillType, FX_BOOL bStroke);
- CPDF_ImageObject* AddImage(CPDF_Stream* pStream, CPDF_Image* pImage, FX_BOOL bInline);
- void AddDuplicateImage();
- void AddForm(CPDF_Stream*);
- CFX_ByteString m_LastImageName;
- CPDF_Image* m_pLastImage;
- CFX_BinaryBuf m_LastImageDict, m_LastImageData;
- CPDF_Dictionary* m_pLastImageDict;
- CPDF_Dictionary* m_pLastCloneImageDict;
- FX_BOOL m_bReleaseLastDict;
- FX_BOOL m_bSameLastDict;
- void SetGraphicStates(CPDF_PageObject* pObj, FX_BOOL bColor, FX_BOOL bText, FX_BOOL bGraph);
- FX_BOOL m_bColored;
- FX_FLOAT m_Type3Data[6];
- FX_BOOL m_bResourceMissing;
- CFX_PtrArray m_StateStack;
- void SaveStates(CPDF_AllStates*);
- void RestoreStates(CPDF_AllStates*);
- CPDF_Font* FindFont(const CFX_ByteString& name);
- CPDF_ColorSpace* FindColorSpace(const CFX_ByteString& name);
- CPDF_Pattern* FindPattern(const CFX_ByteString& name, FX_BOOL bShading);
- CPDF_Object* FindResourceObj(FX_BSTR type, const CFX_ByteString& name);
- void Handle_CloseFillStrokePath();
- void Handle_FillStrokePath();
- void Handle_CloseEOFillStrokePath();
- void Handle_EOFillStrokePath();
- void Handle_BeginMarkedContent_Dictionary();
- void Handle_BeginImage();
- void Handle_BeginMarkedContent();
- void Handle_BeginText();
- void Handle_BeginSectionUndefined();
- void Handle_CurveTo_123();
- void Handle_ConcatMatrix();
- void Handle_SetColorSpace_Fill();
- void Handle_SetColorSpace_Stroke();
- void Handle_SetDash();
- void Handle_SetCharWidth();
- void Handle_SetCachedDevice();
- void Handle_ExecuteXObject();
- void Handle_MarkPlace_Dictionary();
- void Handle_EndImage();
- void Handle_EndMarkedContent();
- void Handle_EndText();
- void Handle_EndSectionUndefined();
- void Handle_FillPath();
- void Handle_FillPathOld();
- void Handle_EOFillPath();
- void Handle_SetGray_Fill();
- void Handle_SetGray_Stroke();
- void Handle_SetExtendGraphState();
- void Handle_ClosePath();
- void Handle_SetFlat();
- void Handle_BeginImageData();
- void Handle_SetLineJoin();
- void Handle_SetLineCap();
- void Handle_SetCMYKColor_Fill();
- void Handle_SetCMYKColor_Stroke();
- void Handle_LineTo();
- void Handle_MoveTo();
- void Handle_SetMiterLimit();
- void Handle_MarkPlace();
- void Handle_EndPath();
- void Handle_SaveGraphState();
- void Handle_RestoreGraphState();
- void Handle_Rectangle();
- void Handle_SetRGBColor_Fill();
- void Handle_SetRGBColor_Stroke();
- void Handle_SetRenderIntent();
- void Handle_CloseStrokePath();
- void Handle_StrokePath();
- void Handle_SetColor_Fill();
- void Handle_SetColor_Stroke();
- void Handle_SetColorPS_Fill();
- void Handle_SetColorPS_Stroke();
- void Handle_ShadeFill();
- void Handle_SetCharSpace();
- void Handle_MoveTextPoint();
- void Handle_MoveTextPoint_SetLeading();
- void Handle_SetFont();
- void Handle_ShowText();
- void Handle_ShowText_Positioning();
- void Handle_SetTextLeading();
- void Handle_SetTextMatrix();
- void Handle_SetTextRenderMode();
- void Handle_SetTextRise();
- void Handle_SetWordSpace();
- void Handle_SetHorzScale();
- void Handle_MoveToNextLine();
- void Handle_CurveTo_23();
- void Handle_SetLineWidth();
- void Handle_Clip();
- void Handle_EOClip();
- void Handle_CurveTo_13();
- void Handle_NextLineShowText();
- void Handle_NextLineShowText_Space();
- void Handle_Invalid();
-};
-class CPDF_ContentParser : public CFX_Object
-{
-public:
- CPDF_ContentParser();
- ~CPDF_ContentParser();
- typedef enum { Ready, ToBeContinued, Done } ParseStatus;
- ParseStatus GetStatus()
- {
- return m_Status;
- }
- void Start(CPDF_Page* pPage, CPDF_ParseOptions* pOptions);
- void Start(CPDF_Form* pForm, CPDF_AllStates* pGraphicStates, CFX_AffineMatrix* pParentMatrix,
- CPDF_Type3Char* pType3Char, CPDF_ParseOptions* pOptions, int level);
- void Continue(IFX_Pause* pPause);
- int EstimateProgress();
-protected:
- void Clear();
- ParseStatus m_Status;
- CPDF_PageObjects* m_pObjects;
- FX_BOOL m_bForm;
- CPDF_ParseOptions m_Options;
- CPDF_Type3Char* m_pType3Char;
- int m_InternalStage;
- CPDF_StreamAcc* m_pSingleStream;
- CPDF_StreamAcc** m_pStreamArray;
- FX_DWORD m_nStreams;
- FX_LPBYTE m_pData;
- FX_DWORD m_Size;
- class CPDF_StreamContentParser* m_pParser;
- FX_DWORD m_CurrentOffset;
- CPDF_StreamFilter* m_pStreamFilter;
-};
-class CPDF_AllStates : public CPDF_GraphicStates
-{
-public:
- CPDF_AllStates();
- ~CPDF_AllStates();
- void Copy(const CPDF_AllStates& src);
- void ProcessExtGS(CPDF_Dictionary* pGS, CPDF_StreamContentParser* pParser);
- void SetLineDash(CPDF_Array*, FX_FLOAT, FX_FLOAT scale);
- CFX_AffineMatrix m_TextMatrix, m_CTM, m_ParentMatrix;
- FX_FLOAT m_TextX, m_TextY, m_TextLineX, m_TextLineY;
- FX_FLOAT m_TextLeading, m_TextRise, m_TextHorzScale;
-};
-template <class ObjClass> class CPDF_CountedObject : public CFX_Object
-{
-public:
- ObjClass m_Obj;
- FX_DWORD m_nCount;
-};
-typedef CFX_MapPtrTemplate<CPDF_Dictionary*, CPDF_CountedObject<CPDF_Font*>*> CPDF_FontMap;
-typedef CFX_MapPtrTemplate<CPDF_Object*, CPDF_CountedObject<CPDF_ColorSpace*>*> CPDF_ColorSpaceMap;
-typedef CFX_MapPtrTemplate<CPDF_Object*, CPDF_CountedObject<CPDF_Pattern*>*> CPDF_PatternMap;
-typedef CFX_MapPtrTemplate<FX_DWORD, CPDF_CountedObject<CPDF_Image*>*> CPDF_ImageMap;
-typedef CFX_MapPtrTemplate<CPDF_Stream*, CPDF_CountedObject<CPDF_IccProfile*>*> CPDF_IccProfileMap;
-typedef CFX_MapPtrTemplate<CPDF_Stream*, CPDF_CountedObject<CPDF_StreamAcc*>*> CPDF_FontFileMap;
-template <class KeyType, class ValueType>
-KeyType PDF_DocPageData_FindValue(const CFX_MapPtrTemplate<KeyType, CPDF_CountedObject<ValueType>*> &map, ValueType findValue, CPDF_CountedObject<ValueType>*& findData)
-{
- FX_POSITION pos = map.GetStartPosition();
- while (pos) {
- KeyType findKey;
- map.GetNextAssoc(pos, findKey, findData);
- if (findData->m_Obj == findValue) {
- return findKey;
- }
- }
- findData = NULL;
- return (KeyType)(FX_UINTPTR)NULL;
-}
-template <class KeyType, class ValueType>
-FX_BOOL PDF_DocPageData_Release(CFX_MapPtrTemplate<KeyType, CPDF_CountedObject<ValueType>*> &map, KeyType findKey, ValueType findValue, FX_BOOL bForce = FALSE)
-{
- if (!findKey && !findValue) {
- return FALSE;
- }
- CPDF_CountedObject<ValueType>* findData = NULL;
- if (!findKey) {
- findKey = PDF_DocPageData_FindValue<KeyType, ValueType>(map, findValue, findData);
- } else if (!map.Lookup(findKey, findData)) {
- return FALSE;
- }
- if (findData && ((-- findData->m_nCount) == 0 || bForce)) {
- delete findData->m_Obj;
- delete findData;
- map.RemoveKey(findKey);
- return TRUE;
- }
- return FALSE;
-}
-class CPDF_DocPageData : public CFX_Object
-{
-public:
- CPDF_DocPageData(CPDF_Document *pPDFDoc);
- ~CPDF_DocPageData();
- void Clear(FX_BOOL bRelease = FALSE);
- CPDF_Font* GetFont(CPDF_Dictionary* pFontDict, FX_BOOL findOnly);
- CPDF_Font* GetStandardFont(FX_BSTR fontName, CPDF_FontEncoding* pEncoding);
- void ReleaseFont(CPDF_Dictionary* pFontDict);
- CPDF_ColorSpace* GetColorSpace(CPDF_Object* pCSObj, CPDF_Dictionary* pResources);
- CPDF_ColorSpace* GetCopiedColorSpace(CPDF_Object* pCSObj);
- void ReleaseColorSpace(CPDF_Object* pColorSpace);
- CPDF_Pattern* GetPattern(CPDF_Object* pPatternObj, FX_BOOL bShading, const CFX_AffineMatrix* matrix);
- void ReleasePattern(CPDF_Object* pPatternObj);
- CPDF_Image* GetImage(CPDF_Object* pImageStream);
- void ReleaseImage(CPDF_Object* pImageStream);
- CPDF_IccProfile* GetIccProfile(CPDF_Stream* pIccProfileStream, FX_INT32 nComponents);
- void ReleaseIccProfile(CPDF_Stream* pIccProfileStream, CPDF_IccProfile* pIccProfile);
- CPDF_StreamAcc* GetFontFileStreamAcc(CPDF_Stream* pFontStream);
- void ReleaseFontFileStreamAcc(CPDF_Stream* pFontStream, FX_BOOL bForce = FALSE);
- CPDF_Document* m_pPDFDoc;
- CPDF_FontMap m_FontMap;
- CPDF_ColorSpaceMap m_ColorSpaceMap;
- CPDF_PatternMap m_PatternMap;
- CPDF_ImageMap m_ImageMap;
- CPDF_IccProfileMap m_IccProfileMap;
- CFX_MapByteStringToPtr m_HashProfileMap;
- CPDF_FontFileMap m_FontFileMap;
-};
-class CPDF_Function : public CFX_Object
-{
-public:
- static CPDF_Function* Load(CPDF_Object* pFuncObj);
- virtual ~CPDF_Function();
- FX_BOOL Call(FX_FLOAT* inputs, int ninputs, FX_FLOAT* results, int& nresults) const;
- int CountInputs()
- {
- return m_nInputs;
- }
- int CountOutputs()
- {
- return m_nOutputs;
- }
-protected:
- CPDF_Function();
- int m_nInputs, m_nOutputs;
- FX_FLOAT* m_pDomains;
- FX_FLOAT* m_pRanges;
- FX_BOOL Init(CPDF_Object* pObj);
- virtual FX_BOOL v_Init(CPDF_Object* pObj) = 0;
- virtual FX_BOOL v_Call(FX_FLOAT* inputs, FX_FLOAT* results) const = 0;
-};
-class CPDF_IccProfile : public CFX_Object
-{
-public:
- CPDF_IccProfile(FX_LPCBYTE pData, FX_DWORD dwSize, int nComponents);
- ~CPDF_IccProfile();
- FX_BOOL m_bsRGB;
- FX_LPVOID m_pTransform;
-};
-class CPDF_DeviceCS : public CPDF_ColorSpace
-{
-public:
- CPDF_DeviceCS(int family);
- virtual FX_BOOL GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const;
- FX_BOOL SetRGB(FX_FLOAT* pBuf, FX_FLOAT R, FX_FLOAT G, FX_FLOAT B) const;
- FX_BOOL v_GetCMYK(FX_FLOAT* pBuf, FX_FLOAT& c, FX_FLOAT& m, FX_FLOAT& y, FX_FLOAT& k) const;
- FX_BOOL v_SetCMYK(FX_FLOAT* pBuf, FX_FLOAT c, FX_FLOAT m, FX_FLOAT y, FX_FLOAT k) const;
- virtual void TranslateImageLine(FX_LPBYTE pDestBuf, FX_LPCBYTE pSrcBuf, int pixels, int image_width, int image_height, FX_BOOL bTransMask = FALSE) const;
-};
-class CPDF_PatternCS : public CPDF_ColorSpace
-{
-public:
- CPDF_PatternCS();
- ~CPDF_PatternCS();
- virtual FX_BOOL v_Load(CPDF_Document* pDoc, CPDF_Array* pArray);
- virtual FX_BOOL GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const;
- virtual CPDF_ColorSpace* GetBaseCS() const
- {
- return m_pBaseCS;
- }
- CPDF_ColorSpace* m_pBaseCS;
-};
-#define MAX_PAGE_OBJECTS_UNIFY_NAMING 4096
-class CPDF_ResourceNaming : public CFX_Object
-{
-public:
- struct _NamingState : public CFX_Object {
- CFX_ByteString m_Prefix;
- int m_nIndex;
- };
- ~CPDF_ResourceNaming();
- CFX_ByteString GetName(const CPDF_Dictionary* pResList, FX_LPCSTR szType);
-protected:
- CFX_MapByteStringToPtr m_NamingCache;
-};
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fpdfapi/fpdf_pageobj.h"
+#define PARSE_STEP_LIMIT 100
+#define STREAM_PARSE_BUFSIZE 20480
+class CPDF_QuickFontCache;
+#ifndef _FPDFAPI_MINI_
+class CPDF_StreamParser : public CFX_Object
+{
+public:
+
+ CPDF_StreamParser(const FX_BYTE* pData, FX_DWORD dwSize);
+ ~CPDF_StreamParser();
+
+ CPDF_Stream* ReadInlineStream(CPDF_Document* pDoc, CPDF_Dictionary* pDict, CPDF_Object* pCSObj, FX_BOOL bDecode);
+ typedef enum { EndOfData, Number, Keyword, Name, Others } SyntaxType;
+
+ SyntaxType ParseNextElement();
+ FX_LPBYTE GetWordBuf()
+ {
+ return m_WordBuffer;
+ }
+ FX_DWORD GetWordSize()
+ {
+ return m_WordSize;
+ }
+ CPDF_Object* GetObject()
+ {
+ CPDF_Object* pObj = m_pLastObj;
+ m_pLastObj = NULL;
+ return pObj;
+ }
+ FX_DWORD GetPos()
+ {
+ return m_Pos;
+ }
+ void SetPos(FX_DWORD pos)
+ {
+ m_Pos = pos;
+ }
+
+ CPDF_Object* ReadNextObject(FX_BOOL bAllowNestedArray = FALSE, FX_BOOL bInArray = FALSE);
+ void SkipPathObject();
+protected:
+ void GetNextWord(FX_BOOL& bIsNumber);
+ CFX_ByteString ReadString();
+ CFX_ByteString ReadHexString();
+ const FX_BYTE* m_pBuf;
+ FX_DWORD m_Size;
+ FX_DWORD m_Pos;
+ FX_BYTE m_WordBuffer[256];
+ FX_DWORD m_WordSize;
+ CPDF_Object* m_pLastObj;
+};
+#endif
+typedef enum {
+ PDFOP_CloseFillStrokePath = 0, PDFOP_FillStrokePath,
+ PDFOP_CloseEOFillStrokePath, PDFOP_EOFillStrokePath,
+ PDFOP_BeginMarkedContent_Dictionary, PDFOP_BeginImage,
+ PDFOP_BeginMarkedContent, PDFOP_BeginText,
+ PDFOP_BeginSectionUndefined, PDFOP_CurveTo_123,
+ PDFOP_ConcatMatrix, PDFOP_SetColorSpace_Fill,
+ PDFOP_SetColorSpace_Stroke, PDFOP_SetDash,
+ PDFOP_SetCharWidth, PDFOP_SetCachedDevice,
+ PDFOP_ExecuteXObject, PDFOP_MarkPlace_Dictionary,
+ PDFOP_EndImage, PDFOP_EndMarkedContent,
+ PDFOP_EndText, PDFOP_EndSectionUndefined,
+ PDFOP_FillPath, PDFOP_FillPathOld,
+ PDFOP_EOFillPath, PDFOP_SetGray_Fill,
+ PDFOP_SetGray_Stroke, PDFOP_SetExtendGraphState,
+ PDFOP_ClosePath, PDFOP_SetFlat,
+ PDFOP_BeginImageData, PDFOP_SetLineJoin,
+ PDFOP_SetLineCap, PDFOP_SetCMYKColor_Fill,
+ PDFOP_SetCMYKColor_Stroke, PDFOP_LineTo,
+ PDFOP_MoveTo, PDFOP_SetMiterLimit,
+ PDFOP_MarkPlace, PDFOP_EndPath,
+ PDFOP_SaveGraphState, PDFOP_RestoreGraphState,
+ PDFOP_Rectangle, PDFOP_SetRGBColor_Fill,
+ PDFOP_SetRGBColor_Stroke, PDFOP_SetRenderIntent,
+ PDFOP_CloseStrokePath, PDFOP_StrokePath,
+ PDFOP_SetColor_Fill, PDFOP_SetColor_Stroke,
+ PDFOP_SetColorPS_Fill, PDFOP_SetColorPS_Stroke,
+ PDFOP_ShadeFill, PDFOP_SetCharSpace,
+ PDFOP_MoveTextPoint, PDFOP_MoveTextPoint_SetLeading,
+ PDFOP_SetFont, PDFOP_ShowText,
+ PDFOP_ShowText_Positioning, PDFOP_SetTextLeading,
+ PDFOP_SetTextMatrix, PDFOP_SetTextRenderMode,
+ PDFOP_SetTextRise, PDFOP_SetWordSpace,
+ PDFOP_SetHorzScale, PDFOP_MoveToNextLine,
+ PDFOP_CurveTo_23, PDFOP_SetLineWidth,
+ PDFOP_Clip, PDFOP_EOClip,
+ PDFOP_CurveTo_13, PDFOP_NextLineShowText,
+ PDFOP_NextLineShowText_Space, PDFOP_Invalid
+} PDFOP;
+#define PARAM_BUF_SIZE 16
+typedef struct {
+ int m_Type;
+ union {
+ struct {
+ FX_BOOL m_bInteger;
+ union {
+ int m_Integer;
+ FX_FLOAT m_Float;
+ };
+ } m_Number;
+ CPDF_Object* m_pObject;
+ struct {
+ int m_Len;
+ char m_Buffer[32];
+ } m_Name;
+ };
+} _ContentParam;
+#if defined(_FPDFAPI_MINI_)
+#define _FPDF_MAX_FORM_LEVEL_ 17
+#else
+#define _FPDF_MAX_FORM_LEVEL_ 30
+#endif
+#define _FPDF_MAX_TYPE3_FORM_LEVEL_ 4
+#define _FPDF_MAX_OBJECT_STACK_SIZE_ 512
+class CPDF_StreamContentParser : public CFX_Object
+{
+public:
+ CPDF_StreamContentParser();
+ ~CPDF_StreamContentParser();
+ FX_BOOL Initialize();
+ void PrepareParse(CPDF_Document* pDoc, CPDF_Dictionary* pPageResources, CPDF_Dictionary* pParentResources,
+ CFX_AffineMatrix* pmtContentToUser,
+ CPDF_PageObjects* pObjList, CPDF_Dictionary* pResources,
+ CFX_FloatRect* pBBox, CPDF_ParseOptions* pOptions,
+ CPDF_AllStates* pAllStates, int level);
+ CPDF_Document* m_pDocument;
+ CPDF_Dictionary* m_pPageResources;
+ CPDF_Dictionary* m_pParentResources;
+ CPDF_PageObjects* m_pObjectList;
+ CPDF_Dictionary* m_pResources;
+ int m_Level;
+ CFX_AffineMatrix m_mtContentToUser;
+ CFX_FloatRect m_BBox;
+ CPDF_ParseOptions m_Options;
+ _ContentParam m_ParamBuf1[PARAM_BUF_SIZE];
+ FX_DWORD m_ParamStartPos;
+ FX_DWORD m_ParamCount;
+ void AddNumberParam(FX_LPCSTR str, int len);
+ void AddObjectParam(CPDF_Object* pObj);
+ void AddNameParam(FX_LPCSTR name, int size);
+ int GetNextParamPos();
+ void ClearAllParams();
+ CPDF_Object* GetObject(FX_DWORD index);
+ CFX_ByteString GetString(FX_DWORD index);
+ FX_FLOAT GetNumber(FX_DWORD index);
+ FX_FLOAT GetNumber16(FX_DWORD index);
+ int GetInteger(FX_DWORD index)
+ {
+ return (FX_INT32)(GetNumber(index));
+ }
+ FX_BOOL OnOperator(FX_LPCSTR op);
+ void BigCaseCaller(int index);
+ FX_BOOL m_bAbort;
+#ifndef _FPDFAPI_MINI_
+ CPDF_StreamParser* m_pSyntax;
+ FX_DWORD GetParsePos()
+ {
+ return m_pSyntax->GetPos();
+ }
+#else
+ int m_WordState;
+ void InputData(FX_LPCBYTE src_buf, FX_DWORD src_size);
+ void Finish();
+ void StartArray();
+ void EndArray();
+ void StartDict();
+ void EndDict();
+ void EndName();
+ void EndNumber();
+ void EndKeyword();
+ void EndHexString();
+ void EndString();
+ void EndImageDict();
+ void EndInlineImage();
+ FX_LPBYTE m_pWordBuf;
+ FX_DWORD m_WordSize;
+ CFX_BinaryBuf m_StringBuf;
+ int m_StringLevel, m_StringState, m_EscCode;
+ void AddContainer(CPDF_Object* pObject);
+ FX_BOOL SetToCurObj(CPDF_Object* pObject);
+ FX_LPBYTE m_pDictName;
+ FX_BOOL m_bDictName;
+ CPDF_Object** m_pObjectStack;
+ FX_BOOL* m_pObjectState;
+ FX_DWORD m_ObjectSize;
+ int m_InlineImageState;
+ FX_BYTE m_InlineWhiteChar;
+ CFX_BinaryBuf m_ImageSrcBuf;
+ FX_LPBYTE m_pStreamBuf;
+#endif
+ CPDF_AllStates* m_pCurStates;
+ CPDF_ContentMark m_CurContentMark;
+ CFX_PtrArray m_ClipTextList;
+ CPDF_TextObject* m_pLastTextObject;
+ FX_FLOAT m_DefFontSize;
+ void AddTextObject(CFX_ByteString* pText, FX_FLOAT fInitKerning, FX_FLOAT* pKerning, int count);
+
+ void ConvertUserSpace(FX_FLOAT& x, FX_FLOAT& y);
+ void ConvertTextSpace(FX_FLOAT& x, FX_FLOAT& y);
+ void OnChangeTextMatrix();
+#ifndef _FPDFAPI_MINI_
+ FX_DWORD Parse(FX_LPCBYTE pData, FX_DWORD dwSize, FX_DWORD max_cost);
+ void ParsePathObject();
+#endif
+ int m_CompatCount;
+ FX_PATHPOINT* m_pPathPoints;
+ int m_PathPointCount;
+ int m_PathAllocSize;
+ FX_FLOAT m_PathStartX, m_PathStartY;
+ FX_FLOAT m_PathCurrentX, m_PathCurrentY;
+ int m_PathClipType;
+ void AddPathPoint(FX_FLOAT x, FX_FLOAT y, int flag);
+ void AddPathRect(FX_FLOAT x, FX_FLOAT y, FX_FLOAT w, FX_FLOAT h);
+ void AddPathObject(int FillType, FX_BOOL bStroke);
+ CPDF_ImageObject* AddImage(CPDF_Stream* pStream, CPDF_Image* pImage, FX_BOOL bInline);
+ void AddDuplicateImage();
+ void AddForm(CPDF_Stream*);
+ CFX_ByteString m_LastImageName;
+ CPDF_Image* m_pLastImage;
+ CFX_BinaryBuf m_LastImageDict, m_LastImageData;
+ CPDF_Dictionary* m_pLastImageDict;
+ CPDF_Dictionary* m_pLastCloneImageDict;
+ FX_BOOL m_bReleaseLastDict;
+ FX_BOOL m_bSameLastDict;
+ void SetGraphicStates(CPDF_PageObject* pObj, FX_BOOL bColor, FX_BOOL bText, FX_BOOL bGraph);
+ FX_BOOL m_bColored;
+ FX_FLOAT m_Type3Data[6];
+ FX_BOOL m_bResourceMissing;
+ CFX_PtrArray m_StateStack;
+ void SaveStates(CPDF_AllStates*);
+ void RestoreStates(CPDF_AllStates*);
+ CPDF_Font* FindFont(const CFX_ByteString& name);
+ CPDF_ColorSpace* FindColorSpace(const CFX_ByteString& name);
+ CPDF_Pattern* FindPattern(const CFX_ByteString& name, FX_BOOL bShading);
+ CPDF_Object* FindResourceObj(FX_BSTR type, const CFX_ByteString& name);
+ void Handle_CloseFillStrokePath();
+ void Handle_FillStrokePath();
+ void Handle_CloseEOFillStrokePath();
+ void Handle_EOFillStrokePath();
+ void Handle_BeginMarkedContent_Dictionary();
+ void Handle_BeginImage();
+ void Handle_BeginMarkedContent();
+ void Handle_BeginText();
+ void Handle_BeginSectionUndefined();
+ void Handle_CurveTo_123();
+ void Handle_ConcatMatrix();
+ void Handle_SetColorSpace_Fill();
+ void Handle_SetColorSpace_Stroke();
+ void Handle_SetDash();
+ void Handle_SetCharWidth();
+ void Handle_SetCachedDevice();
+ void Handle_ExecuteXObject();
+ void Handle_MarkPlace_Dictionary();
+ void Handle_EndImage();
+ void Handle_EndMarkedContent();
+ void Handle_EndText();
+ void Handle_EndSectionUndefined();
+ void Handle_FillPath();
+ void Handle_FillPathOld();
+ void Handle_EOFillPath();
+ void Handle_SetGray_Fill();
+ void Handle_SetGray_Stroke();
+ void Handle_SetExtendGraphState();
+ void Handle_ClosePath();
+ void Handle_SetFlat();
+ void Handle_BeginImageData();
+ void Handle_SetLineJoin();
+ void Handle_SetLineCap();
+ void Handle_SetCMYKColor_Fill();
+ void Handle_SetCMYKColor_Stroke();
+ void Handle_LineTo();
+ void Handle_MoveTo();
+ void Handle_SetMiterLimit();
+ void Handle_MarkPlace();
+ void Handle_EndPath();
+ void Handle_SaveGraphState();
+ void Handle_RestoreGraphState();
+ void Handle_Rectangle();
+ void Handle_SetRGBColor_Fill();
+ void Handle_SetRGBColor_Stroke();
+ void Handle_SetRenderIntent();
+ void Handle_CloseStrokePath();
+ void Handle_StrokePath();
+ void Handle_SetColor_Fill();
+ void Handle_SetColor_Stroke();
+ void Handle_SetColorPS_Fill();
+ void Handle_SetColorPS_Stroke();
+ void Handle_ShadeFill();
+ void Handle_SetCharSpace();
+ void Handle_MoveTextPoint();
+ void Handle_MoveTextPoint_SetLeading();
+ void Handle_SetFont();
+ void Handle_ShowText();
+ void Handle_ShowText_Positioning();
+ void Handle_SetTextLeading();
+ void Handle_SetTextMatrix();
+ void Handle_SetTextRenderMode();
+ void Handle_SetTextRise();
+ void Handle_SetWordSpace();
+ void Handle_SetHorzScale();
+ void Handle_MoveToNextLine();
+ void Handle_CurveTo_23();
+ void Handle_SetLineWidth();
+ void Handle_Clip();
+ void Handle_EOClip();
+ void Handle_CurveTo_13();
+ void Handle_NextLineShowText();
+ void Handle_NextLineShowText_Space();
+ void Handle_Invalid();
+};
+class CPDF_ContentParser : public CFX_Object
+{
+public:
+ CPDF_ContentParser();
+ ~CPDF_ContentParser();
+ typedef enum { Ready, ToBeContinued, Done } ParseStatus;
+ ParseStatus GetStatus()
+ {
+ return m_Status;
+ }
+ void Start(CPDF_Page* pPage, CPDF_ParseOptions* pOptions);
+ void Start(CPDF_Form* pForm, CPDF_AllStates* pGraphicStates, CFX_AffineMatrix* pParentMatrix,
+ CPDF_Type3Char* pType3Char, CPDF_ParseOptions* pOptions, int level);
+ void Continue(IFX_Pause* pPause);
+ int EstimateProgress();
+protected:
+ void Clear();
+ ParseStatus m_Status;
+ CPDF_PageObjects* m_pObjects;
+ FX_BOOL m_bForm;
+ CPDF_ParseOptions m_Options;
+ CPDF_Type3Char* m_pType3Char;
+ int m_InternalStage;
+ CPDF_StreamAcc* m_pSingleStream;
+ CPDF_StreamAcc** m_pStreamArray;
+ FX_DWORD m_nStreams;
+ FX_LPBYTE m_pData;
+ FX_DWORD m_Size;
+ class CPDF_StreamContentParser* m_pParser;
+ FX_DWORD m_CurrentOffset;
+ CPDF_StreamFilter* m_pStreamFilter;
+};
+class CPDF_AllStates : public CPDF_GraphicStates
+{
+public:
+ CPDF_AllStates();
+ ~CPDF_AllStates();
+ void Copy(const CPDF_AllStates& src);
+ void ProcessExtGS(CPDF_Dictionary* pGS, CPDF_StreamContentParser* pParser);
+ void SetLineDash(CPDF_Array*, FX_FLOAT, FX_FLOAT scale);
+ CFX_AffineMatrix m_TextMatrix, m_CTM, m_ParentMatrix;
+ FX_FLOAT m_TextX, m_TextY, m_TextLineX, m_TextLineY;
+ FX_FLOAT m_TextLeading, m_TextRise, m_TextHorzScale;
+};
+template <class ObjClass> class CPDF_CountedObject : public CFX_Object
+{
+public:
+ ObjClass m_Obj;
+ FX_DWORD m_nCount;
+};
+typedef CFX_MapPtrTemplate<CPDF_Dictionary*, CPDF_CountedObject<CPDF_Font*>*> CPDF_FontMap;
+typedef CFX_MapPtrTemplate<CPDF_Object*, CPDF_CountedObject<CPDF_ColorSpace*>*> CPDF_ColorSpaceMap;
+typedef CFX_MapPtrTemplate<CPDF_Object*, CPDF_CountedObject<CPDF_Pattern*>*> CPDF_PatternMap;
+typedef CFX_MapPtrTemplate<FX_DWORD, CPDF_CountedObject<CPDF_Image*>*> CPDF_ImageMap;
+typedef CFX_MapPtrTemplate<CPDF_Stream*, CPDF_CountedObject<CPDF_IccProfile*>*> CPDF_IccProfileMap;
+typedef CFX_MapPtrTemplate<CPDF_Stream*, CPDF_CountedObject<CPDF_StreamAcc*>*> CPDF_FontFileMap;
+template <class KeyType, class ValueType>
+KeyType PDF_DocPageData_FindValue(const CFX_MapPtrTemplate<KeyType, CPDF_CountedObject<ValueType>*> &map, ValueType findValue, CPDF_CountedObject<ValueType>*& findData)
+{
+ FX_POSITION pos = map.GetStartPosition();
+ while (pos) {
+ KeyType findKey;
+ map.GetNextAssoc(pos, findKey, findData);
+ if (findData->m_Obj == findValue) {
+ return findKey;
+ }
+ }
+ findData = NULL;
+ return (KeyType)(FX_UINTPTR)NULL;
+}
+template <class KeyType, class ValueType>
+FX_BOOL PDF_DocPageData_Release(CFX_MapPtrTemplate<KeyType, CPDF_CountedObject<ValueType>*> &map, KeyType findKey, ValueType findValue, FX_BOOL bForce = FALSE)
+{
+ if (!findKey && !findValue) {
+ return FALSE;
+ }
+ CPDF_CountedObject<ValueType>* findData = NULL;
+ if (!findKey) {
+ findKey = PDF_DocPageData_FindValue<KeyType, ValueType>(map, findValue, findData);
+ } else if (!map.Lookup(findKey, findData)) {
+ return FALSE;
+ }
+ if (findData && ((-- findData->m_nCount) == 0 || bForce)) {
+ delete findData->m_Obj;
+ delete findData;
+ map.RemoveKey(findKey);
+ return TRUE;
+ }
+ return FALSE;
+}
+class CPDF_DocPageData : public CFX_Object
+{
+public:
+ CPDF_DocPageData(CPDF_Document *pPDFDoc);
+ ~CPDF_DocPageData();
+ void Clear(FX_BOOL bRelease = FALSE);
+ CPDF_Font* GetFont(CPDF_Dictionary* pFontDict, FX_BOOL findOnly);
+ CPDF_Font* GetStandardFont(FX_BSTR fontName, CPDF_FontEncoding* pEncoding);
+ void ReleaseFont(CPDF_Dictionary* pFontDict);
+ CPDF_ColorSpace* GetColorSpace(CPDF_Object* pCSObj, CPDF_Dictionary* pResources);
+ CPDF_ColorSpace* GetCopiedColorSpace(CPDF_Object* pCSObj);
+ void ReleaseColorSpace(CPDF_Object* pColorSpace);
+ CPDF_Pattern* GetPattern(CPDF_Object* pPatternObj, FX_BOOL bShading, const CFX_AffineMatrix* matrix);
+ void ReleasePattern(CPDF_Object* pPatternObj);
+ CPDF_Image* GetImage(CPDF_Object* pImageStream);
+ void ReleaseImage(CPDF_Object* pImageStream);
+ CPDF_IccProfile* GetIccProfile(CPDF_Stream* pIccProfileStream, FX_INT32 nComponents);
+ void ReleaseIccProfile(CPDF_Stream* pIccProfileStream, CPDF_IccProfile* pIccProfile);
+ CPDF_StreamAcc* GetFontFileStreamAcc(CPDF_Stream* pFontStream);
+ void ReleaseFontFileStreamAcc(CPDF_Stream* pFontStream, FX_BOOL bForce = FALSE);
+ CPDF_Document* m_pPDFDoc;
+ CPDF_FontMap m_FontMap;
+ CPDF_ColorSpaceMap m_ColorSpaceMap;
+ CPDF_PatternMap m_PatternMap;
+ CPDF_ImageMap m_ImageMap;
+ CPDF_IccProfileMap m_IccProfileMap;
+ CFX_MapByteStringToPtr m_HashProfileMap;
+ CPDF_FontFileMap m_FontFileMap;
+};
+class CPDF_Function : public CFX_Object
+{
+public:
+ static CPDF_Function* Load(CPDF_Object* pFuncObj);
+ virtual ~CPDF_Function();
+ FX_BOOL Call(FX_FLOAT* inputs, int ninputs, FX_FLOAT* results, int& nresults) const;
+ int CountInputs()
+ {
+ return m_nInputs;
+ }
+ int CountOutputs()
+ {
+ return m_nOutputs;
+ }
+protected:
+ CPDF_Function();
+ int m_nInputs, m_nOutputs;
+ FX_FLOAT* m_pDomains;
+ FX_FLOAT* m_pRanges;
+ FX_BOOL Init(CPDF_Object* pObj);
+ virtual FX_BOOL v_Init(CPDF_Object* pObj) = 0;
+ virtual FX_BOOL v_Call(FX_FLOAT* inputs, FX_FLOAT* results) const = 0;
+};
+class CPDF_IccProfile : public CFX_Object
+{
+public:
+ CPDF_IccProfile(FX_LPCBYTE pData, FX_DWORD dwSize, int nComponents);
+ ~CPDF_IccProfile();
+ FX_BOOL m_bsRGB;
+ FX_LPVOID m_pTransform;
+};
+class CPDF_DeviceCS : public CPDF_ColorSpace
+{
+public:
+ CPDF_DeviceCS(int family);
+ virtual FX_BOOL GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const;
+ FX_BOOL SetRGB(FX_FLOAT* pBuf, FX_FLOAT R, FX_FLOAT G, FX_FLOAT B) const;
+ FX_BOOL v_GetCMYK(FX_FLOAT* pBuf, FX_FLOAT& c, FX_FLOAT& m, FX_FLOAT& y, FX_FLOAT& k) const;
+ FX_BOOL v_SetCMYK(FX_FLOAT* pBuf, FX_FLOAT c, FX_FLOAT m, FX_FLOAT y, FX_FLOAT k) const;
+ virtual void TranslateImageLine(FX_LPBYTE pDestBuf, FX_LPCBYTE pSrcBuf, int pixels, int image_width, int image_height, FX_BOOL bTransMask = FALSE) const;
+};
+class CPDF_PatternCS : public CPDF_ColorSpace
+{
+public:
+ CPDF_PatternCS();
+ ~CPDF_PatternCS();
+ virtual FX_BOOL v_Load(CPDF_Document* pDoc, CPDF_Array* pArray);
+ virtual FX_BOOL GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const;
+ virtual CPDF_ColorSpace* GetBaseCS() const
+ {
+ return m_pBaseCS;
+ }
+ CPDF_ColorSpace* m_pBaseCS;
+};
+#define MAX_PAGE_OBJECTS_UNIFY_NAMING 4096
+class CPDF_ResourceNaming : public CFX_Object
+{
+public:
+ struct _NamingState : public CFX_Object {
+ CFX_ByteString m_Prefix;
+ int m_nIndex;
+ };
+ ~CPDF_ResourceNaming();
+ CFX_ByteString GetName(const CPDF_Dictionary* pResList, FX_LPCSTR szType);
+protected:
+ CFX_MapByteStringToPtr m_NamingCache;
+};
diff --git a/core/src/fpdfapi/fpdf_parser/filters_int.h b/core/src/fpdfapi/fpdf_parser/filters_int.h
index fa7d7db76e..d1dedc482c 100644
--- a/core/src/fpdfapi/fpdf_parser/filters_int.h
+++ b/core/src/fpdfapi/fpdf_parser/filters_int.h
@@ -1,119 +1,119 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-class CPDF_DecryptFilter : public CFX_DataFilter
-{
-public:
- CPDF_DecryptFilter(CPDF_CryptoHandler* pCryptoHandler, FX_DWORD objnum, FX_DWORD gennum);
- virtual ~CPDF_DecryptFilter();
- virtual void v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf);
- virtual void v_FilterFinish(CFX_BinaryBuf& dest_buf);
- CPDF_CryptoHandler* m_pCryptoHandler;
- FX_LPVOID m_pContext;
- FX_DWORD m_ObjNum, m_GenNum;
-};
-class CPDF_FlateFilter : public CFX_DataFilter
-{
-public:
- CPDF_FlateFilter();
- virtual ~CPDF_FlateFilter();
- virtual void v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf);
- virtual void v_FilterFinish(CFX_BinaryBuf& dest_buf) {}
- void* m_pContext;
- FX_BYTE m_DestBuffer[FPDF_FILTER_BUFFER_SIZE];
-};
-class CPDF_LzwFilter : public CFX_DataFilter
-{
-public:
- CPDF_LzwFilter(FX_BOOL bEarlyChange);
- virtual ~CPDF_LzwFilter() {}
- virtual void v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf);
- virtual void v_FilterFinish(CFX_BinaryBuf& dest_buf) {}
- FX_BOOL m_bEarlyChange;
- FX_DWORD m_CodeArray[5021];
- FX_DWORD m_nCodes;
- FX_DWORD m_CodeLen;
- FX_DWORD m_OldCode;
- FX_BYTE m_LastChar;
- FX_DWORD m_nLeftBits, m_LeftBits;
- FX_BYTE m_DecodeStack[4000];
- FX_DWORD m_StackLen;
- void AddCode(FX_DWORD prefix_code, FX_BYTE append_char);
- void DecodeString(FX_DWORD code);
-};
-class CPDF_PredictorFilter : public CFX_DataFilter
-{
-public:
- CPDF_PredictorFilter(int predictor, int colors, int bpc, int cols);
- virtual ~CPDF_PredictorFilter();
- virtual void v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf);
- virtual void v_FilterFinish(CFX_BinaryBuf& dest_buf) {}
- FX_BOOL m_bTiff;
- FX_DWORD m_Pitch, m_Bpp;
- FX_LPBYTE m_pRefLine, m_pCurLine;
- FX_DWORD m_iLine, m_LineInSize;
-};
-class CPDF_AsciiHexFilter : public CFX_DataFilter
-{
-public:
- CPDF_AsciiHexFilter();
- virtual ~CPDF_AsciiHexFilter() {}
- virtual void v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf);
- virtual void v_FilterFinish(CFX_BinaryBuf& dest_buf) {}
- int m_State;
- int m_FirstDigit;
-};
-class CPDF_Ascii85Filter : public CFX_DataFilter
-{
-public:
- CPDF_Ascii85Filter();
- virtual ~CPDF_Ascii85Filter() {}
- virtual void v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf);
- virtual void v_FilterFinish(CFX_BinaryBuf& dest_buf) {}
- int m_State;
- int m_CharCount;
- FX_DWORD m_CurDWord;
-};
-class CPDF_RunLenFilter : public CFX_DataFilter
-{
-public:
- CPDF_RunLenFilter();
- virtual ~CPDF_RunLenFilter() {}
- virtual void v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf);
- virtual void v_FilterFinish(CFX_BinaryBuf& dest_buf) {}
- int m_State;
- FX_DWORD m_Count;
-};
-class CPDF_JpegFilter : public CFX_DataFilter
-{
-public:
- CPDF_JpegFilter();
- virtual ~CPDF_JpegFilter();
- virtual void v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf);
- virtual void v_FilterFinish(CFX_BinaryBuf& dest_buf) {}
- void* m_pContext;
- CFX_BinaryBuf m_InputBuf;
- FX_LPBYTE m_pScanline;
- int m_Pitch, m_Height, m_Width, m_nComps, m_iLine;
- FX_BOOL m_bGotHeader;
-};
-class CPDF_FaxFilter : public CFX_DataFilter
-{
-public:
- CPDF_FaxFilter();
- virtual ~CPDF_FaxFilter();
- FX_BOOL Initialize(int Encoding, int bEndOfLine, int bByteAlign, int bBlack, int nRows, int nColumns);
- virtual void v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf);
- virtual void v_FilterFinish(CFX_BinaryBuf& dest_buf);
- int m_Encoding, m_bEndOfLine, m_bByteAlign, m_bBlack;
- int m_nRows, m_nColumns, m_Pitch, m_iRow;
- FX_LPBYTE m_pScanlineBuf, m_pRefBuf;
- CFX_BinaryBuf m_InputBuf;
- int m_InputBitPos;
- void ProcessData(FX_LPCBYTE src_buf, FX_DWORD src_size, int& bitpos, FX_BOOL bFinish,
- CFX_BinaryBuf& dest_buf);
- FX_BOOL ReadLine(FX_LPCBYTE src_buf, int bitsize, int& bitpos);
-};
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+class CPDF_DecryptFilter : public CFX_DataFilter
+{
+public:
+ CPDF_DecryptFilter(CPDF_CryptoHandler* pCryptoHandler, FX_DWORD objnum, FX_DWORD gennum);
+ virtual ~CPDF_DecryptFilter();
+ virtual void v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf);
+ virtual void v_FilterFinish(CFX_BinaryBuf& dest_buf);
+ CPDF_CryptoHandler* m_pCryptoHandler;
+ FX_LPVOID m_pContext;
+ FX_DWORD m_ObjNum, m_GenNum;
+};
+class CPDF_FlateFilter : public CFX_DataFilter
+{
+public:
+ CPDF_FlateFilter();
+ virtual ~CPDF_FlateFilter();
+ virtual void v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf);
+ virtual void v_FilterFinish(CFX_BinaryBuf& dest_buf) {}
+ void* m_pContext;
+ FX_BYTE m_DestBuffer[FPDF_FILTER_BUFFER_SIZE];
+};
+class CPDF_LzwFilter : public CFX_DataFilter
+{
+public:
+ CPDF_LzwFilter(FX_BOOL bEarlyChange);
+ virtual ~CPDF_LzwFilter() {}
+ virtual void v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf);
+ virtual void v_FilterFinish(CFX_BinaryBuf& dest_buf) {}
+ FX_BOOL m_bEarlyChange;
+ FX_DWORD m_CodeArray[5021];
+ FX_DWORD m_nCodes;
+ FX_DWORD m_CodeLen;
+ FX_DWORD m_OldCode;
+ FX_BYTE m_LastChar;
+ FX_DWORD m_nLeftBits, m_LeftBits;
+ FX_BYTE m_DecodeStack[4000];
+ FX_DWORD m_StackLen;
+ void AddCode(FX_DWORD prefix_code, FX_BYTE append_char);
+ void DecodeString(FX_DWORD code);
+};
+class CPDF_PredictorFilter : public CFX_DataFilter
+{
+public:
+ CPDF_PredictorFilter(int predictor, int colors, int bpc, int cols);
+ virtual ~CPDF_PredictorFilter();
+ virtual void v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf);
+ virtual void v_FilterFinish(CFX_BinaryBuf& dest_buf) {}
+ FX_BOOL m_bTiff;
+ FX_DWORD m_Pitch, m_Bpp;
+ FX_LPBYTE m_pRefLine, m_pCurLine;
+ FX_DWORD m_iLine, m_LineInSize;
+};
+class CPDF_AsciiHexFilter : public CFX_DataFilter
+{
+public:
+ CPDF_AsciiHexFilter();
+ virtual ~CPDF_AsciiHexFilter() {}
+ virtual void v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf);
+ virtual void v_FilterFinish(CFX_BinaryBuf& dest_buf) {}
+ int m_State;
+ int m_FirstDigit;
+};
+class CPDF_Ascii85Filter : public CFX_DataFilter
+{
+public:
+ CPDF_Ascii85Filter();
+ virtual ~CPDF_Ascii85Filter() {}
+ virtual void v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf);
+ virtual void v_FilterFinish(CFX_BinaryBuf& dest_buf) {}
+ int m_State;
+ int m_CharCount;
+ FX_DWORD m_CurDWord;
+};
+class CPDF_RunLenFilter : public CFX_DataFilter
+{
+public:
+ CPDF_RunLenFilter();
+ virtual ~CPDF_RunLenFilter() {}
+ virtual void v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf);
+ virtual void v_FilterFinish(CFX_BinaryBuf& dest_buf) {}
+ int m_State;
+ FX_DWORD m_Count;
+};
+class CPDF_JpegFilter : public CFX_DataFilter
+{
+public:
+ CPDF_JpegFilter();
+ virtual ~CPDF_JpegFilter();
+ virtual void v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf);
+ virtual void v_FilterFinish(CFX_BinaryBuf& dest_buf) {}
+ void* m_pContext;
+ CFX_BinaryBuf m_InputBuf;
+ FX_LPBYTE m_pScanline;
+ int m_Pitch, m_Height, m_Width, m_nComps, m_iLine;
+ FX_BOOL m_bGotHeader;
+};
+class CPDF_FaxFilter : public CFX_DataFilter
+{
+public:
+ CPDF_FaxFilter();
+ virtual ~CPDF_FaxFilter();
+ FX_BOOL Initialize(int Encoding, int bEndOfLine, int bByteAlign, int bBlack, int nRows, int nColumns);
+ virtual void v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf);
+ virtual void v_FilterFinish(CFX_BinaryBuf& dest_buf);
+ int m_Encoding, m_bEndOfLine, m_bByteAlign, m_bBlack;
+ int m_nRows, m_nColumns, m_Pitch, m_iRow;
+ FX_LPBYTE m_pScanlineBuf, m_pRefBuf;
+ CFX_BinaryBuf m_InputBuf;
+ int m_InputBitPos;
+ void ProcessData(FX_LPCBYTE src_buf, FX_DWORD src_size, int& bitpos, FX_BOOL bFinish,
+ CFX_BinaryBuf& dest_buf);
+ FX_BOOL ReadLine(FX_LPCBYTE src_buf, int bitsize, int& bitpos);
+};
diff --git a/core/src/fpdfapi/fpdf_parser/fpdf_parser_decode.cpp b/core/src/fpdfapi/fpdf_parser/fpdf_parser_decode.cpp
index 74e81d40fd..dfc26bc197 100644
--- a/core/src/fpdfapi/fpdf_parser/fpdf_parser_decode.cpp
+++ b/core/src/fpdfapi/fpdf_parser/fpdf_parser_decode.cpp
@@ -1,533 +1,533 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../../include/fpdfapi/fpdf_parser.h"
-#include "../../../include/fpdfapi/fpdf_module.h"
-#include "../../../include/fxcodec/fx_codec.h"
-#include <limits.h>
-#define _STREAM_MAX_SIZE_ 20 * 1024 * 1024
-FX_DWORD _A85Decode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size)
-{
- dest_size = 0;
- dest_buf = NULL;
- if (src_size == 0) {
- return 0;
- }
- FX_DWORD orig_size = dest_size;
- FX_DWORD zcount = 0;
- FX_DWORD pos = 0;
- while (pos < src_size) {
- FX_BYTE ch = src_buf[pos];
- if (ch < '!' && ch != '\n' && ch != '\r' && ch != ' ' && ch != '\t') {
- break;
- }
- if (ch == 'z') {
- zcount ++;
- } else if (ch > 'u') {
- break;
- }
- pos ++;
- }
- if (pos == 0) {
- return 0;
- }
- if (zcount > UINT_MAX / 4) {
- return (FX_DWORD) - 1;
- }
- if (zcount * 4 > UINT_MAX - (pos - zcount)) {
- return (FX_DWORD) - 1;
- }
- dest_buf = FX_Alloc(FX_BYTE, zcount * 4 + (pos - zcount));
- if (dest_buf == NULL) {
- return (FX_DWORD) - 1;
- }
- int state = 0, res = 0;
- pos = dest_size = 0;
- while (pos < src_size) {
- FX_BYTE ch = src_buf[pos++];
- if (ch == '\n' || ch == '\r' || ch == ' ' || ch == '\t') {
- continue;
- }
- if (ch == 'z') {
- FXSYS_memset32(dest_buf + dest_size, 0, 4);
- state = 0;
- res = 0;
- dest_size += 4;
- } else {
- if (ch < '!' || ch > 'u') {
- break;
- }
- res = res * 85 + ch - 33;
- state ++;
- if (state == 5) {
- for (int i = 0; i < 4; i ++) {
- dest_buf[dest_size++] = (FX_BYTE)(res >> (3 - i) * 8);
- }
- state = 0;
- res = 0;
- }
- }
- }
- if (state) {
- int i;
- for (i = state; i < 5; i ++) {
- res = res * 85 + 84;
- }
- for (i = 0; i < state - 1; i ++) {
- dest_buf[dest_size++] = (FX_BYTE)(res >> (3 - i) * 8);
- }
- }
- if (pos < src_size && src_buf[pos] == '>') {
- pos ++;
- }
- return pos;
-}
-FX_DWORD _HexDecode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size)
-{
- FX_DWORD orig_size = dest_size;
- FX_DWORD i;
- for (i = 0; i < src_size; i ++)
- if (src_buf[i] == '>') {
- break;
- }
- dest_buf = FX_Alloc( FX_BYTE, i / 2 + 1);
- dest_size = 0;
- FX_BOOL bFirstDigit = TRUE;
- for (i = 0; i < src_size; i ++) {
- FX_BYTE ch = src_buf[i];
- if (ch == ' ' || ch == '\n' || ch == '\t' || ch == '\r') {
- continue;
- }
- int digit;
- if (ch <= '9' && ch >= '0') {
- digit = ch - '0';
- } else if (ch <= 'f' && ch >= 'a') {
- digit = ch - 'a' + 10;
- } else if (ch <= 'F' && ch >= 'A') {
- digit = ch - 'A' + 10;
- } else if (ch == '>') {
- i ++;
- break;
- } else {
- continue;
- }
- if (bFirstDigit) {
- dest_buf[dest_size] = digit * 16;
- } else {
- dest_buf[dest_size ++] += digit;
- }
- bFirstDigit = !bFirstDigit;
- }
- if (!bFirstDigit) {
- dest_size ++;
- }
- return i;
-}
-FX_DWORD RunLengthDecode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size)
-{
- FX_DWORD orig_size = dest_size;
- FX_DWORD i = 0;
- FX_DWORD old;
- dest_size = 0;
- while (i < src_size) {
- if (src_buf[i] < 128) {
- old = dest_size;
- dest_size += src_buf[i] + 1;
- if (dest_size < old) {
- return (FX_DWORD) - 1;
- }
- i += src_buf[i] + 2;
- } else if (src_buf[i] > 128) {
- old = dest_size;
- dest_size += 257 - src_buf[i];
- if (dest_size < old) {
- return (FX_DWORD) - 1;
- }
- i += 2;
- } else {
- break;
- }
- }
- if (dest_size >= _STREAM_MAX_SIZE_) {
- return -1;
- }
- dest_buf = FX_Alloc( FX_BYTE, dest_size);
- if (!dest_buf) {
- return -1;
- }
- i = 0;
- int dest_count = 0;
- while (i < src_size) {
- if (src_buf[i] < 128) {
- FX_DWORD copy_len = src_buf[i] + 1;
- FX_DWORD buf_left = src_size - i - 1;
- if (buf_left < copy_len) {
- FX_DWORD delta = copy_len - buf_left;
- copy_len = buf_left;
- FXSYS_memset8(dest_buf + dest_count + copy_len, '\0', delta);
- }
- FXSYS_memcpy32(dest_buf + dest_count, src_buf + i + 1, copy_len);
- dest_count += src_buf[i] + 1;
- i += src_buf[i] + 2;
- } else if (src_buf[i] > 128) {
- int fill = 0;
- if (i < src_size - 1) {
- fill = src_buf[i + 1];
- }
- FXSYS_memset8(dest_buf + dest_count, fill, 257 - src_buf[i]);
- dest_count += 257 - src_buf[i];
- i += 2;
- } else {
- break;
- }
- }
- FX_DWORD ret = i + 1;
- if (ret > src_size) {
- ret = src_size;
- }
- return ret;
-}
-ICodec_ScanlineDecoder* FPDFAPI_CreateFaxDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,
- const CPDF_Dictionary* pParams)
-{
- int K = 0;
- FX_BOOL EndOfLine = FALSE;
- FX_BOOL ByteAlign = FALSE;
- FX_BOOL BlackIs1 = FALSE;
- FX_BOOL Columns = 1728;
- FX_BOOL Rows = 0;
- if (pParams) {
- K = pParams->GetInteger(FX_BSTRC("K"));
- EndOfLine = pParams->GetInteger(FX_BSTRC("EndOfLine"));
- ByteAlign = pParams->GetInteger(FX_BSTRC("EncodedByteAlign"));
- BlackIs1 = pParams->GetInteger(FX_BSTRC("BlackIs1"));
- Columns = pParams->GetInteger(FX_BSTRC("Columns"), 1728);
- Rows = pParams->GetInteger(FX_BSTRC("Rows"));
- if (Rows > USHRT_MAX) {
- Rows = 0;
- }
- if (Columns <= 0 || Rows < 0 || Columns > USHRT_MAX || Rows > USHRT_MAX) {
- return NULL;
- }
- }
- return CPDF_ModuleMgr::Get()->GetFaxModule()->CreateDecoder(src_buf, src_size, width, height,
- K, EndOfLine, ByteAlign, BlackIs1, Columns, Rows);
-}
-static FX_BOOL CheckFlateDecodeParams(int Colors, int BitsPerComponent, int Columns)
-{
- if (Columns < 0) {
- return FALSE;
- }
- int check = Columns;
- if (Colors < 0 || (check > 0 && Colors > INT_MAX / check)) {
- return FALSE;
- }
- check *= Colors;
- if (BitsPerComponent < 0 ||
- (check > 0 && BitsPerComponent > INT_MAX / check)) {
- return FALSE;
- }
- check *= BitsPerComponent;
- if (check > INT_MAX - 7) {
- return FALSE;
- }
- return TRUE;
-}
-ICodec_ScanlineDecoder* FPDFAPI_CreateFlateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,
- int nComps, int bpc, const CPDF_Dictionary* pParams)
-{
- int predictor = 0;
- FX_BOOL bEarlyChange = TRUE;
- int Colors = 0, BitsPerComponent = 0, Columns = 0;
- if (pParams) {
- predictor = ((CPDF_Dictionary*)pParams)->GetInteger(FX_BSTRC("Predictor"));
- bEarlyChange = ((CPDF_Dictionary*)pParams)->GetInteger(FX_BSTRC("EarlyChange"), 1);
- Colors = pParams->GetInteger(FX_BSTRC("Colors"), 1);
- BitsPerComponent = pParams->GetInteger(FX_BSTRC("BitsPerComponent"), 8);
- Columns = pParams->GetInteger(FX_BSTRC("Columns"), 1);
- if (!CheckFlateDecodeParams(Colors, BitsPerComponent, Columns)) {
- return NULL;
- }
- }
- return CPDF_ModuleMgr::Get()->GetFlateModule()->CreateDecoder(src_buf, src_size, width, height,
- nComps, bpc, predictor, Colors, BitsPerComponent, Columns);
-}
-FX_DWORD FPDFAPI_FlateOrLZWDecode(FX_BOOL bLZW, const FX_BYTE* src_buf, FX_DWORD src_size, CPDF_Dictionary* pParams,
- FX_DWORD estimated_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size)
-{
- int predictor = 0;
- FX_BOOL bEarlyChange = TRUE;
- int Colors = 0, BitsPerComponent = 0, Columns = 0;
- if (pParams) {
- predictor = ((CPDF_Dictionary*)pParams)->GetInteger(FX_BSTRC("Predictor"));
- bEarlyChange = ((CPDF_Dictionary*)pParams)->GetInteger(FX_BSTRC("EarlyChange"), 1);
- Colors = pParams->GetInteger(FX_BSTRC("Colors"), 1);
- BitsPerComponent = pParams->GetInteger(FX_BSTRC("BitsPerComponent"), 8);
- Columns = pParams->GetInteger(FX_BSTRC("Columns"), 1);
- if (!CheckFlateDecodeParams(Colors, BitsPerComponent, Columns)) {
- return (FX_DWORD) - 1;
- }
- }
- return CPDF_ModuleMgr::Get()->GetFlateModule()->FlateOrLZWDecode(bLZW, src_buf, src_size,
- bEarlyChange, predictor, Colors, BitsPerComponent, Columns, estimated_size,
- dest_buf, dest_size);
-}
-FX_BOOL PDF_DataDecode(FX_LPCBYTE src_buf, FX_DWORD src_size, const CPDF_Dictionary* pDict,
- FX_LPBYTE& dest_buf, FX_DWORD& dest_size, CFX_ByteString& ImageEncoding,
- CPDF_Dictionary*& pImageParms, FX_DWORD last_estimated_size, FX_BOOL bImageAcc)
-
-{
- CPDF_Object* pDecoder = pDict->GetElementValue(FX_BSTRC("Filter"));
- if (pDecoder == NULL || (pDecoder->GetType() != PDFOBJ_ARRAY && pDecoder->GetType() != PDFOBJ_NAME)) {
- return FALSE;
- }
- CPDF_Object* pParams = pDict->GetElementValue(FX_BSTRC("DecodeParms"));
- CFX_ByteStringArray DecoderList;
- CFX_PtrArray ParamList;
- if (pDecoder->GetType() == PDFOBJ_ARRAY) {
- if (pParams && pParams->GetType() != PDFOBJ_ARRAY) {
- pParams = NULL;
- }
- CPDF_Array* pDecoders = (CPDF_Array*)pDecoder;
- for (FX_DWORD i = 0; i < pDecoders->GetCount(); i ++) {
- CFX_ByteStringC str = pDecoders->GetConstString(i);
- DecoderList.Add(str);
- if (pParams) {
- ParamList.Add(((CPDF_Array*)pParams)->GetDict(i));
- } else {
- ParamList.Add(NULL);
- }
- }
- } else {
- DecoderList.Add(pDecoder->GetConstString());
- ParamList.Add(pParams->GetDict());
- }
- FX_LPBYTE last_buf = (FX_LPBYTE)src_buf;
- FX_DWORD last_size = src_size;
- for (int i = 0; i < DecoderList.GetSize(); i ++) {
- int estimated_size = i == DecoderList.GetSize() - 1 ? last_estimated_size : 0;
- CFX_ByteString decoder = DecoderList[i];
- CPDF_Dictionary* pParam = (CPDF_Dictionary*)ParamList[i];
- FX_LPBYTE new_buf = NULL;
- FX_DWORD new_size = (FX_DWORD) - 1;
- int offset = -1;
- if (decoder == FX_BSTRC("FlateDecode") || decoder == FX_BSTRC("Fl")) {
- if (bImageAcc && i == DecoderList.GetSize() - 1) {
- ImageEncoding = FX_BSTRC("FlateDecode");
- dest_buf = (FX_LPBYTE)last_buf;
- dest_size = last_size;
- pImageParms = pParam;
- return TRUE;
- } else {
- offset = FPDFAPI_FlateOrLZWDecode(FALSE, last_buf, last_size, pParam, estimated_size, new_buf, new_size);
- }
- } else if (decoder == FX_BSTRC("LZWDecode") || decoder == FX_BSTRC("LZW")) {
- offset = FPDFAPI_FlateOrLZWDecode(TRUE, last_buf, last_size, pParam, estimated_size, new_buf, new_size);
- } else if (decoder == FX_BSTRC("ASCII85Decode") || decoder == FX_BSTRC("A85")) {
- offset = _A85Decode(last_buf, last_size, new_buf, new_size);
- } else if (decoder == FX_BSTRC("ASCIIHexDecode") || decoder == FX_BSTRC("AHx")) {
- offset = _HexDecode(last_buf, last_size, new_buf, new_size);
- } else if (decoder == FX_BSTRC("RunLengthDecode") || decoder == FX_BSTRC("RL")) {
- if (bImageAcc && i == DecoderList.GetSize() - 1) {
- ImageEncoding = FX_BSTRC("RunLengthDecode");
- dest_buf = (FX_LPBYTE)last_buf;
- dest_size = last_size;
- pImageParms = pParam;
- return TRUE;
- }
- offset = RunLengthDecode(last_buf, last_size, new_buf, new_size);
- } else {
- if (decoder == FX_BSTRC("DCT")) {
- decoder = "DCTDecode";
- } else if (decoder == FX_BSTRC("CCF")) {
- decoder = "CCITTFaxDecode";
- } else if (decoder == FX_BSTRC("Crypt")) {
- continue;
- }
- ImageEncoding = decoder;
- pImageParms = pParam;
- dest_buf = (FX_LPBYTE)last_buf;
- dest_size = last_size;
- return TRUE;
- }
- if (last_buf != src_buf) {
- FX_Free(last_buf);
- }
- if (offset == -1) {
- return FALSE;
- }
- last_buf = new_buf;
- last_size = new_size;
- }
- ImageEncoding = "";
- pImageParms = NULL;
- dest_buf = last_buf;
- dest_size = last_size;
- return TRUE;
-}
-extern const FX_WORD PDFDocEncoding[256] = {
- 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009,
- 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, 0x0013,
- 0x0014, 0x0015, 0x0016, 0x0017, 0x02d8, 0x02c7, 0x02c6, 0x02d9, 0x02dd, 0x02db,
- 0x02da, 0x02dc, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
- 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, 0x0030, 0x0031,
- 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b,
- 0x003c, 0x003d, 0x003e, 0x003f, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045,
- 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
- 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059,
- 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, 0x0060, 0x0061, 0x0062, 0x0063,
- 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d,
- 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
- 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x0000, 0x2022, 0x2020,
- 0x2021, 0x2026, 0x2014, 0x2013, 0x0192, 0x2044, 0x2039, 0x203a, 0x2212, 0x2030,
- 0x201e, 0x201c, 0x201d, 0x2018, 0x2019, 0x201a, 0x2122, 0xfb01, 0xfb02, 0x0141,
- 0x0152, 0x0160, 0x0178, 0x017d, 0x0131, 0x0142, 0x0153, 0x0161, 0x017e, 0x0000,
- 0x20ac, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, 0x00a8, 0x00a9,
- 0x00aa, 0x00ab, 0x00ac, 0x0000, 0x00ae, 0x00af, 0x00b0, 0x00b1, 0x00b2, 0x00b3,
- 0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd,
- 0x00be, 0x00bf, 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7,
- 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, 0x00d0, 0x00d1,
- 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, 0x00d8, 0x00d9, 0x00da, 0x00db,
- 0x00dc, 0x00dd, 0x00de, 0x00df, 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5,
- 0x00e6, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
- 0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, 0x00f8, 0x00f9,
- 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff
-};
-CFX_WideString PDF_DecodeText(FX_LPCBYTE src_data, FX_DWORD src_len, CFX_CharMap* pCharMap)
-{
- CFX_WideString result;
- if (src_len >= 2 && ((src_data[0] == 0xfe && src_data[1] == 0xff) || (src_data[0] == 0xff && src_data[1] == 0xfe))) {
- FX_BOOL bBE = src_data[0] == 0xfe;
- int max_chars = (src_len - 2) / 2;
- if (!max_chars) {
- return result;
- }
- if (src_data[0] == 0xff) {
- bBE = !src_data[2];
- }
- FX_LPWSTR dest_buf = result.GetBuffer(max_chars);
- FX_LPCBYTE uni_str = src_data + 2;
- int dest_pos = 0;
- for (int i = 0; i < max_chars * 2; i += 2) {
- FX_WORD unicode = bBE ? (uni_str[i] << 8 | uni_str[i + 1]) : (uni_str[i + 1] << 8 | uni_str[i]);
- if (unicode == 0x1b) {
- i += 2;
- while (i < max_chars * 2) {
- FX_WORD unicode = bBE ? (uni_str[i] << 8 | uni_str[i + 1]) : (uni_str[i + 1] << 8 | uni_str[i]);
- i += 2;
- if (unicode == 0x1b) {
- break;
- }
- }
- } else {
- dest_buf[dest_pos++] = unicode;
- }
- }
- result.ReleaseBuffer(dest_pos);
- } else if (pCharMap == NULL) {
- FX_LPWSTR dest_buf = result.GetBuffer(src_len);
- for (FX_DWORD i = 0; i < src_len; i ++) {
- dest_buf[i] = PDFDocEncoding[src_data[i]];
- }
- result.ReleaseBuffer(src_len);
- } else {
- return (*pCharMap->m_GetWideString)(pCharMap, CFX_ByteString((FX_LPCSTR)src_data, src_len));
- }
- return result;
-}
-CFX_WideString PDF_DecodeText(const CFX_ByteString& bstr, CFX_CharMap* pCharMap)
-{
- return PDF_DecodeText((FX_LPCBYTE)(FX_LPCSTR)bstr, bstr.GetLength(), pCharMap);
-}
-CFX_ByteString PDF_EncodeText(FX_LPCWSTR pString, int len, CFX_CharMap* pCharMap)
-{
- if (len == -1) {
- len = (FX_STRSIZE)FXSYS_wcslen(pString);
- }
- CFX_ByteString result;
- if (pCharMap == NULL) {
- FX_LPSTR dest_buf1 = result.GetBuffer(len);
- int i;
- for (i = 0; i < len; i ++) {
- int code;
- for (code = 0; code < 256; code ++)
- if (PDFDocEncoding[code] == pString[i]) {
- break;
- }
- if (code == 256) {
- break;
- }
- dest_buf1[i] = code;
- }
- result.ReleaseBuffer(i);
- if (i == len) {
- return result;
- }
- }
- FX_LPBYTE dest_buf2 = (FX_LPBYTE)result.GetBuffer(len * 2 + 2);
- dest_buf2[0] = 0xfe;
- dest_buf2[1] = 0xff;
- dest_buf2 += 2;
- for (int i = 0; i < len; i ++) {
- *dest_buf2++ = pString[i] >> 8;
- *dest_buf2++ = (FX_BYTE)pString[i];
- }
- result.ReleaseBuffer(len * 2 + 2);
- return result;
-}
-CFX_ByteString PDF_EncodeString(const CFX_ByteString& src, FX_BOOL bHex)
-{
- CFX_ByteTextBuf result;
- int srclen = src.GetLength();
- if (bHex) {
- result.AppendChar('<');
- for (int i = 0; i < srclen; i ++) {
- result.AppendChar("0123456789ABCDEF"[src[i] / 16]);
- result.AppendChar("0123456789ABCDEF"[src[i] % 16]);
- }
- result.AppendChar('>');
- return result.GetByteString();
- }
- result.AppendChar('(');
- for (int i = 0; i < srclen; i ++) {
- FX_BYTE ch = src[i];
- if (ch == ')' || ch == '\\' || ch == '(') {
- result.AppendChar('\\');
- } else if (ch == 0x0a) {
- result << FX_BSTRC("\\n");
- continue;
- } else if (ch == 0x0d) {
- result << FX_BSTRC("\\r");
- continue;
- }
- result.AppendChar(ch);
- }
- result.AppendChar(')');
- return result.GetByteString();
-}
-void FlateEncode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size)
-{
- CCodec_ModuleMgr* pEncoders = CPDF_ModuleMgr::Get()->GetCodecModule();
- if (pEncoders) {
- pEncoders->GetFlateModule()->Encode(src_buf, src_size, dest_buf, dest_size);
- }
-}
-void FlateEncode(FX_LPCBYTE src_buf, FX_DWORD src_size, int predictor, int Colors, int BitsPerComponent, int Columns,
- FX_LPBYTE& dest_buf, FX_DWORD& dest_size)
-{
- CCodec_ModuleMgr* pEncoders = CPDF_ModuleMgr::Get()->GetCodecModule();
- if (pEncoders) {
- pEncoders->GetFlateModule()->Encode(src_buf, src_size, predictor, Colors, BitsPerComponent, Columns, dest_buf, dest_size);
- }
-}
-FX_DWORD FlateDecode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size)
-{
- CCodec_ModuleMgr* pEncoders = CPDF_ModuleMgr::Get()->GetCodecModule();
- if (pEncoders) {
- return pEncoders->GetFlateModule()->FlateOrLZWDecode(FALSE, src_buf, src_size, FALSE, 0, 0, 0, 0, 0, dest_buf, dest_size);
- }
- return 0;
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fpdfapi/fpdf_parser.h"
+#include "../../../include/fpdfapi/fpdf_module.h"
+#include "../../../include/fxcodec/fx_codec.h"
+#include <limits.h>
+#define _STREAM_MAX_SIZE_ 20 * 1024 * 1024
+FX_DWORD _A85Decode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size)
+{
+ dest_size = 0;
+ dest_buf = NULL;
+ if (src_size == 0) {
+ return 0;
+ }
+ FX_DWORD orig_size = dest_size;
+ FX_DWORD zcount = 0;
+ FX_DWORD pos = 0;
+ while (pos < src_size) {
+ FX_BYTE ch = src_buf[pos];
+ if (ch < '!' && ch != '\n' && ch != '\r' && ch != ' ' && ch != '\t') {
+ break;
+ }
+ if (ch == 'z') {
+ zcount ++;
+ } else if (ch > 'u') {
+ break;
+ }
+ pos ++;
+ }
+ if (pos == 0) {
+ return 0;
+ }
+ if (zcount > UINT_MAX / 4) {
+ return (FX_DWORD) - 1;
+ }
+ if (zcount * 4 > UINT_MAX - (pos - zcount)) {
+ return (FX_DWORD) - 1;
+ }
+ dest_buf = FX_Alloc(FX_BYTE, zcount * 4 + (pos - zcount));
+ if (dest_buf == NULL) {
+ return (FX_DWORD) - 1;
+ }
+ int state = 0, res = 0;
+ pos = dest_size = 0;
+ while (pos < src_size) {
+ FX_BYTE ch = src_buf[pos++];
+ if (ch == '\n' || ch == '\r' || ch == ' ' || ch == '\t') {
+ continue;
+ }
+ if (ch == 'z') {
+ FXSYS_memset32(dest_buf + dest_size, 0, 4);
+ state = 0;
+ res = 0;
+ dest_size += 4;
+ } else {
+ if (ch < '!' || ch > 'u') {
+ break;
+ }
+ res = res * 85 + ch - 33;
+ state ++;
+ if (state == 5) {
+ for (int i = 0; i < 4; i ++) {
+ dest_buf[dest_size++] = (FX_BYTE)(res >> (3 - i) * 8);
+ }
+ state = 0;
+ res = 0;
+ }
+ }
+ }
+ if (state) {
+ int i;
+ for (i = state; i < 5; i ++) {
+ res = res * 85 + 84;
+ }
+ for (i = 0; i < state - 1; i ++) {
+ dest_buf[dest_size++] = (FX_BYTE)(res >> (3 - i) * 8);
+ }
+ }
+ if (pos < src_size && src_buf[pos] == '>') {
+ pos ++;
+ }
+ return pos;
+}
+FX_DWORD _HexDecode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size)
+{
+ FX_DWORD orig_size = dest_size;
+ FX_DWORD i;
+ for (i = 0; i < src_size; i ++)
+ if (src_buf[i] == '>') {
+ break;
+ }
+ dest_buf = FX_Alloc( FX_BYTE, i / 2 + 1);
+ dest_size = 0;
+ FX_BOOL bFirstDigit = TRUE;
+ for (i = 0; i < src_size; i ++) {
+ FX_BYTE ch = src_buf[i];
+ if (ch == ' ' || ch == '\n' || ch == '\t' || ch == '\r') {
+ continue;
+ }
+ int digit;
+ if (ch <= '9' && ch >= '0') {
+ digit = ch - '0';
+ } else if (ch <= 'f' && ch >= 'a') {
+ digit = ch - 'a' + 10;
+ } else if (ch <= 'F' && ch >= 'A') {
+ digit = ch - 'A' + 10;
+ } else if (ch == '>') {
+ i ++;
+ break;
+ } else {
+ continue;
+ }
+ if (bFirstDigit) {
+ dest_buf[dest_size] = digit * 16;
+ } else {
+ dest_buf[dest_size ++] += digit;
+ }
+ bFirstDigit = !bFirstDigit;
+ }
+ if (!bFirstDigit) {
+ dest_size ++;
+ }
+ return i;
+}
+FX_DWORD RunLengthDecode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size)
+{
+ FX_DWORD orig_size = dest_size;
+ FX_DWORD i = 0;
+ FX_DWORD old;
+ dest_size = 0;
+ while (i < src_size) {
+ if (src_buf[i] < 128) {
+ old = dest_size;
+ dest_size += src_buf[i] + 1;
+ if (dest_size < old) {
+ return (FX_DWORD) - 1;
+ }
+ i += src_buf[i] + 2;
+ } else if (src_buf[i] > 128) {
+ old = dest_size;
+ dest_size += 257 - src_buf[i];
+ if (dest_size < old) {
+ return (FX_DWORD) - 1;
+ }
+ i += 2;
+ } else {
+ break;
+ }
+ }
+ if (dest_size >= _STREAM_MAX_SIZE_) {
+ return -1;
+ }
+ dest_buf = FX_Alloc( FX_BYTE, dest_size);
+ if (!dest_buf) {
+ return -1;
+ }
+ i = 0;
+ int dest_count = 0;
+ while (i < src_size) {
+ if (src_buf[i] < 128) {
+ FX_DWORD copy_len = src_buf[i] + 1;
+ FX_DWORD buf_left = src_size - i - 1;
+ if (buf_left < copy_len) {
+ FX_DWORD delta = copy_len - buf_left;
+ copy_len = buf_left;
+ FXSYS_memset8(dest_buf + dest_count + copy_len, '\0', delta);
+ }
+ FXSYS_memcpy32(dest_buf + dest_count, src_buf + i + 1, copy_len);
+ dest_count += src_buf[i] + 1;
+ i += src_buf[i] + 2;
+ } else if (src_buf[i] > 128) {
+ int fill = 0;
+ if (i < src_size - 1) {
+ fill = src_buf[i + 1];
+ }
+ FXSYS_memset8(dest_buf + dest_count, fill, 257 - src_buf[i]);
+ dest_count += 257 - src_buf[i];
+ i += 2;
+ } else {
+ break;
+ }
+ }
+ FX_DWORD ret = i + 1;
+ if (ret > src_size) {
+ ret = src_size;
+ }
+ return ret;
+}
+ICodec_ScanlineDecoder* FPDFAPI_CreateFaxDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,
+ const CPDF_Dictionary* pParams)
+{
+ int K = 0;
+ FX_BOOL EndOfLine = FALSE;
+ FX_BOOL ByteAlign = FALSE;
+ FX_BOOL BlackIs1 = FALSE;
+ FX_BOOL Columns = 1728;
+ FX_BOOL Rows = 0;
+ if (pParams) {
+ K = pParams->GetInteger(FX_BSTRC("K"));
+ EndOfLine = pParams->GetInteger(FX_BSTRC("EndOfLine"));
+ ByteAlign = pParams->GetInteger(FX_BSTRC("EncodedByteAlign"));
+ BlackIs1 = pParams->GetInteger(FX_BSTRC("BlackIs1"));
+ Columns = pParams->GetInteger(FX_BSTRC("Columns"), 1728);
+ Rows = pParams->GetInteger(FX_BSTRC("Rows"));
+ if (Rows > USHRT_MAX) {
+ Rows = 0;
+ }
+ if (Columns <= 0 || Rows < 0 || Columns > USHRT_MAX || Rows > USHRT_MAX) {
+ return NULL;
+ }
+ }
+ return CPDF_ModuleMgr::Get()->GetFaxModule()->CreateDecoder(src_buf, src_size, width, height,
+ K, EndOfLine, ByteAlign, BlackIs1, Columns, Rows);
+}
+static FX_BOOL CheckFlateDecodeParams(int Colors, int BitsPerComponent, int Columns)
+{
+ if (Columns < 0) {
+ return FALSE;
+ }
+ int check = Columns;
+ if (Colors < 0 || (check > 0 && Colors > INT_MAX / check)) {
+ return FALSE;
+ }
+ check *= Colors;
+ if (BitsPerComponent < 0 ||
+ (check > 0 && BitsPerComponent > INT_MAX / check)) {
+ return FALSE;
+ }
+ check *= BitsPerComponent;
+ if (check > INT_MAX - 7) {
+ return FALSE;
+ }
+ return TRUE;
+}
+ICodec_ScanlineDecoder* FPDFAPI_CreateFlateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,
+ int nComps, int bpc, const CPDF_Dictionary* pParams)
+{
+ int predictor = 0;
+ FX_BOOL bEarlyChange = TRUE;
+ int Colors = 0, BitsPerComponent = 0, Columns = 0;
+ if (pParams) {
+ predictor = ((CPDF_Dictionary*)pParams)->GetInteger(FX_BSTRC("Predictor"));
+ bEarlyChange = ((CPDF_Dictionary*)pParams)->GetInteger(FX_BSTRC("EarlyChange"), 1);
+ Colors = pParams->GetInteger(FX_BSTRC("Colors"), 1);
+ BitsPerComponent = pParams->GetInteger(FX_BSTRC("BitsPerComponent"), 8);
+ Columns = pParams->GetInteger(FX_BSTRC("Columns"), 1);
+ if (!CheckFlateDecodeParams(Colors, BitsPerComponent, Columns)) {
+ return NULL;
+ }
+ }
+ return CPDF_ModuleMgr::Get()->GetFlateModule()->CreateDecoder(src_buf, src_size, width, height,
+ nComps, bpc, predictor, Colors, BitsPerComponent, Columns);
+}
+FX_DWORD FPDFAPI_FlateOrLZWDecode(FX_BOOL bLZW, const FX_BYTE* src_buf, FX_DWORD src_size, CPDF_Dictionary* pParams,
+ FX_DWORD estimated_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size)
+{
+ int predictor = 0;
+ FX_BOOL bEarlyChange = TRUE;
+ int Colors = 0, BitsPerComponent = 0, Columns = 0;
+ if (pParams) {
+ predictor = ((CPDF_Dictionary*)pParams)->GetInteger(FX_BSTRC("Predictor"));
+ bEarlyChange = ((CPDF_Dictionary*)pParams)->GetInteger(FX_BSTRC("EarlyChange"), 1);
+ Colors = pParams->GetInteger(FX_BSTRC("Colors"), 1);
+ BitsPerComponent = pParams->GetInteger(FX_BSTRC("BitsPerComponent"), 8);
+ Columns = pParams->GetInteger(FX_BSTRC("Columns"), 1);
+ if (!CheckFlateDecodeParams(Colors, BitsPerComponent, Columns)) {
+ return (FX_DWORD) - 1;
+ }
+ }
+ return CPDF_ModuleMgr::Get()->GetFlateModule()->FlateOrLZWDecode(bLZW, src_buf, src_size,
+ bEarlyChange, predictor, Colors, BitsPerComponent, Columns, estimated_size,
+ dest_buf, dest_size);
+}
+FX_BOOL PDF_DataDecode(FX_LPCBYTE src_buf, FX_DWORD src_size, const CPDF_Dictionary* pDict,
+ FX_LPBYTE& dest_buf, FX_DWORD& dest_size, CFX_ByteString& ImageEncoding,
+ CPDF_Dictionary*& pImageParms, FX_DWORD last_estimated_size, FX_BOOL bImageAcc)
+
+{
+ CPDF_Object* pDecoder = pDict->GetElementValue(FX_BSTRC("Filter"));
+ if (pDecoder == NULL || (pDecoder->GetType() != PDFOBJ_ARRAY && pDecoder->GetType() != PDFOBJ_NAME)) {
+ return FALSE;
+ }
+ CPDF_Object* pParams = pDict->GetElementValue(FX_BSTRC("DecodeParms"));
+ CFX_ByteStringArray DecoderList;
+ CFX_PtrArray ParamList;
+ if (pDecoder->GetType() == PDFOBJ_ARRAY) {
+ if (pParams && pParams->GetType() != PDFOBJ_ARRAY) {
+ pParams = NULL;
+ }
+ CPDF_Array* pDecoders = (CPDF_Array*)pDecoder;
+ for (FX_DWORD i = 0; i < pDecoders->GetCount(); i ++) {
+ CFX_ByteStringC str = pDecoders->GetConstString(i);
+ DecoderList.Add(str);
+ if (pParams) {
+ ParamList.Add(((CPDF_Array*)pParams)->GetDict(i));
+ } else {
+ ParamList.Add(NULL);
+ }
+ }
+ } else {
+ DecoderList.Add(pDecoder->GetConstString());
+ ParamList.Add(pParams->GetDict());
+ }
+ FX_LPBYTE last_buf = (FX_LPBYTE)src_buf;
+ FX_DWORD last_size = src_size;
+ for (int i = 0; i < DecoderList.GetSize(); i ++) {
+ int estimated_size = i == DecoderList.GetSize() - 1 ? last_estimated_size : 0;
+ CFX_ByteString decoder = DecoderList[i];
+ CPDF_Dictionary* pParam = (CPDF_Dictionary*)ParamList[i];
+ FX_LPBYTE new_buf = NULL;
+ FX_DWORD new_size = (FX_DWORD) - 1;
+ int offset = -1;
+ if (decoder == FX_BSTRC("FlateDecode") || decoder == FX_BSTRC("Fl")) {
+ if (bImageAcc && i == DecoderList.GetSize() - 1) {
+ ImageEncoding = FX_BSTRC("FlateDecode");
+ dest_buf = (FX_LPBYTE)last_buf;
+ dest_size = last_size;
+ pImageParms = pParam;
+ return TRUE;
+ } else {
+ offset = FPDFAPI_FlateOrLZWDecode(FALSE, last_buf, last_size, pParam, estimated_size, new_buf, new_size);
+ }
+ } else if (decoder == FX_BSTRC("LZWDecode") || decoder == FX_BSTRC("LZW")) {
+ offset = FPDFAPI_FlateOrLZWDecode(TRUE, last_buf, last_size, pParam, estimated_size, new_buf, new_size);
+ } else if (decoder == FX_BSTRC("ASCII85Decode") || decoder == FX_BSTRC("A85")) {
+ offset = _A85Decode(last_buf, last_size, new_buf, new_size);
+ } else if (decoder == FX_BSTRC("ASCIIHexDecode") || decoder == FX_BSTRC("AHx")) {
+ offset = _HexDecode(last_buf, last_size, new_buf, new_size);
+ } else if (decoder == FX_BSTRC("RunLengthDecode") || decoder == FX_BSTRC("RL")) {
+ if (bImageAcc && i == DecoderList.GetSize() - 1) {
+ ImageEncoding = FX_BSTRC("RunLengthDecode");
+ dest_buf = (FX_LPBYTE)last_buf;
+ dest_size = last_size;
+ pImageParms = pParam;
+ return TRUE;
+ }
+ offset = RunLengthDecode(last_buf, last_size, new_buf, new_size);
+ } else {
+ if (decoder == FX_BSTRC("DCT")) {
+ decoder = "DCTDecode";
+ } else if (decoder == FX_BSTRC("CCF")) {
+ decoder = "CCITTFaxDecode";
+ } else if (decoder == FX_BSTRC("Crypt")) {
+ continue;
+ }
+ ImageEncoding = decoder;
+ pImageParms = pParam;
+ dest_buf = (FX_LPBYTE)last_buf;
+ dest_size = last_size;
+ return TRUE;
+ }
+ if (last_buf != src_buf) {
+ FX_Free(last_buf);
+ }
+ if (offset == -1) {
+ return FALSE;
+ }
+ last_buf = new_buf;
+ last_size = new_size;
+ }
+ ImageEncoding = "";
+ pImageParms = NULL;
+ dest_buf = last_buf;
+ dest_size = last_size;
+ return TRUE;
+}
+extern const FX_WORD PDFDocEncoding[256] = {
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009,
+ 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, 0x0013,
+ 0x0014, 0x0015, 0x0016, 0x0017, 0x02d8, 0x02c7, 0x02c6, 0x02d9, 0x02dd, 0x02db,
+ 0x02da, 0x02dc, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
+ 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, 0x0030, 0x0031,
+ 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b,
+ 0x003c, 0x003d, 0x003e, 0x003f, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045,
+ 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059,
+ 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, 0x0060, 0x0061, 0x0062, 0x0063,
+ 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d,
+ 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
+ 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x0000, 0x2022, 0x2020,
+ 0x2021, 0x2026, 0x2014, 0x2013, 0x0192, 0x2044, 0x2039, 0x203a, 0x2212, 0x2030,
+ 0x201e, 0x201c, 0x201d, 0x2018, 0x2019, 0x201a, 0x2122, 0xfb01, 0xfb02, 0x0141,
+ 0x0152, 0x0160, 0x0178, 0x017d, 0x0131, 0x0142, 0x0153, 0x0161, 0x017e, 0x0000,
+ 0x20ac, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, 0x00a8, 0x00a9,
+ 0x00aa, 0x00ab, 0x00ac, 0x0000, 0x00ae, 0x00af, 0x00b0, 0x00b1, 0x00b2, 0x00b3,
+ 0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd,
+ 0x00be, 0x00bf, 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7,
+ 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, 0x00d0, 0x00d1,
+ 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, 0x00d8, 0x00d9, 0x00da, 0x00db,
+ 0x00dc, 0x00dd, 0x00de, 0x00df, 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5,
+ 0x00e6, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
+ 0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, 0x00f8, 0x00f9,
+ 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff
+};
+CFX_WideString PDF_DecodeText(FX_LPCBYTE src_data, FX_DWORD src_len, CFX_CharMap* pCharMap)
+{
+ CFX_WideString result;
+ if (src_len >= 2 && ((src_data[0] == 0xfe && src_data[1] == 0xff) || (src_data[0] == 0xff && src_data[1] == 0xfe))) {
+ FX_BOOL bBE = src_data[0] == 0xfe;
+ int max_chars = (src_len - 2) / 2;
+ if (!max_chars) {
+ return result;
+ }
+ if (src_data[0] == 0xff) {
+ bBE = !src_data[2];
+ }
+ FX_LPWSTR dest_buf = result.GetBuffer(max_chars);
+ FX_LPCBYTE uni_str = src_data + 2;
+ int dest_pos = 0;
+ for (int i = 0; i < max_chars * 2; i += 2) {
+ FX_WORD unicode = bBE ? (uni_str[i] << 8 | uni_str[i + 1]) : (uni_str[i + 1] << 8 | uni_str[i]);
+ if (unicode == 0x1b) {
+ i += 2;
+ while (i < max_chars * 2) {
+ FX_WORD unicode = bBE ? (uni_str[i] << 8 | uni_str[i + 1]) : (uni_str[i + 1] << 8 | uni_str[i]);
+ i += 2;
+ if (unicode == 0x1b) {
+ break;
+ }
+ }
+ } else {
+ dest_buf[dest_pos++] = unicode;
+ }
+ }
+ result.ReleaseBuffer(dest_pos);
+ } else if (pCharMap == NULL) {
+ FX_LPWSTR dest_buf = result.GetBuffer(src_len);
+ for (FX_DWORD i = 0; i < src_len; i ++) {
+ dest_buf[i] = PDFDocEncoding[src_data[i]];
+ }
+ result.ReleaseBuffer(src_len);
+ } else {
+ return (*pCharMap->m_GetWideString)(pCharMap, CFX_ByteString((FX_LPCSTR)src_data, src_len));
+ }
+ return result;
+}
+CFX_WideString PDF_DecodeText(const CFX_ByteString& bstr, CFX_CharMap* pCharMap)
+{
+ return PDF_DecodeText((FX_LPCBYTE)(FX_LPCSTR)bstr, bstr.GetLength(), pCharMap);
+}
+CFX_ByteString PDF_EncodeText(FX_LPCWSTR pString, int len, CFX_CharMap* pCharMap)
+{
+ if (len == -1) {
+ len = (FX_STRSIZE)FXSYS_wcslen(pString);
+ }
+ CFX_ByteString result;
+ if (pCharMap == NULL) {
+ FX_LPSTR dest_buf1 = result.GetBuffer(len);
+ int i;
+ for (i = 0; i < len; i ++) {
+ int code;
+ for (code = 0; code < 256; code ++)
+ if (PDFDocEncoding[code] == pString[i]) {
+ break;
+ }
+ if (code == 256) {
+ break;
+ }
+ dest_buf1[i] = code;
+ }
+ result.ReleaseBuffer(i);
+ if (i == len) {
+ return result;
+ }
+ }
+ FX_LPBYTE dest_buf2 = (FX_LPBYTE)result.GetBuffer(len * 2 + 2);
+ dest_buf2[0] = 0xfe;
+ dest_buf2[1] = 0xff;
+ dest_buf2 += 2;
+ for (int i = 0; i < len; i ++) {
+ *dest_buf2++ = pString[i] >> 8;
+ *dest_buf2++ = (FX_BYTE)pString[i];
+ }
+ result.ReleaseBuffer(len * 2 + 2);
+ return result;
+}
+CFX_ByteString PDF_EncodeString(const CFX_ByteString& src, FX_BOOL bHex)
+{
+ CFX_ByteTextBuf result;
+ int srclen = src.GetLength();
+ if (bHex) {
+ result.AppendChar('<');
+ for (int i = 0; i < srclen; i ++) {
+ result.AppendChar("0123456789ABCDEF"[src[i] / 16]);
+ result.AppendChar("0123456789ABCDEF"[src[i] % 16]);
+ }
+ result.AppendChar('>');
+ return result.GetByteString();
+ }
+ result.AppendChar('(');
+ for (int i = 0; i < srclen; i ++) {
+ FX_BYTE ch = src[i];
+ if (ch == ')' || ch == '\\' || ch == '(') {
+ result.AppendChar('\\');
+ } else if (ch == 0x0a) {
+ result << FX_BSTRC("\\n");
+ continue;
+ } else if (ch == 0x0d) {
+ result << FX_BSTRC("\\r");
+ continue;
+ }
+ result.AppendChar(ch);
+ }
+ result.AppendChar(')');
+ return result.GetByteString();
+}
+void FlateEncode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size)
+{
+ CCodec_ModuleMgr* pEncoders = CPDF_ModuleMgr::Get()->GetCodecModule();
+ if (pEncoders) {
+ pEncoders->GetFlateModule()->Encode(src_buf, src_size, dest_buf, dest_size);
+ }
+}
+void FlateEncode(FX_LPCBYTE src_buf, FX_DWORD src_size, int predictor, int Colors, int BitsPerComponent, int Columns,
+ FX_LPBYTE& dest_buf, FX_DWORD& dest_size)
+{
+ CCodec_ModuleMgr* pEncoders = CPDF_ModuleMgr::Get()->GetCodecModule();
+ if (pEncoders) {
+ pEncoders->GetFlateModule()->Encode(src_buf, src_size, predictor, Colors, BitsPerComponent, Columns, dest_buf, dest_size);
+ }
+}
+FX_DWORD FlateDecode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size)
+{
+ CCodec_ModuleMgr* pEncoders = CPDF_ModuleMgr::Get()->GetCodecModule();
+ if (pEncoders) {
+ return pEncoders->GetFlateModule()->FlateOrLZWDecode(FALSE, src_buf, src_size, FALSE, 0, 0, 0, 0, 0, dest_buf, dest_size);
+ }
+ return 0;
+}
diff --git a/core/src/fpdfapi/fpdf_parser/fpdf_parser_document.cpp b/core/src/fpdfapi/fpdf_parser/fpdf_parser_document.cpp
index 068a60679a..a4982040bf 100644
--- a/core/src/fpdfapi/fpdf_parser/fpdf_parser_document.cpp
+++ b/core/src/fpdfapi/fpdf_parser/fpdf_parser_document.cpp
@@ -1,398 +1,398 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../../include/fpdfapi/fpdf_parser.h"
-#include "../../../include/fpdfapi/fpdf_module.h"
-extern FX_LPVOID PDFPreviewInitCache(CPDF_Document* pDoc);
-extern void PDFPreviewClearCache(FX_LPVOID pCache);
-CPDF_Document::CPDF_Document(IPDF_DocParser* pParser) : CPDF_IndirectObjects(pParser)
-{
- ASSERT(pParser != NULL);
- m_pRootDict = NULL;
- m_pInfoDict = NULL;
- m_bLinearized = FALSE;
- m_dwFirstPageNo = 0;
- m_dwFirstPageObjNum = 0;
- m_pDocPage = CPDF_ModuleMgr::Get()->GetPageModule()->CreateDocData(this);
- m_pDocRender = CPDF_ModuleMgr::Get()->GetRenderModule()->CreateDocData(this);
-}
-CPDF_DocPageData* CPDF_Document::GetValidatePageData()
-{
- if (m_pDocPage) {
- return m_pDocPage;
- }
- m_pDocPage = CPDF_ModuleMgr::Get()->GetPageModule()->CreateDocData(this);
- return m_pDocPage;
-}
-CPDF_DocRenderData* CPDF_Document::GetValidateRenderData()
-{
- if (m_pDocRender) {
- return m_pDocRender;
- }
- m_pDocRender = CPDF_ModuleMgr::Get()->GetRenderModule()->CreateDocData(this);
- return m_pDocRender;
-}
-void CPDF_Document::LoadDoc()
-{
- m_LastObjNum = m_pParser->GetLastObjNum();
- CPDF_Object* pRootObj = GetIndirectObject(m_pParser->GetRootObjNum());
- if (pRootObj == NULL) {
- return;
- }
- m_pRootDict = pRootObj->GetDict();
- if (m_pRootDict == NULL) {
- return;
- }
- CPDF_Object* pInfoObj = GetIndirectObject(m_pParser->GetInfoObjNum());
- if (pInfoObj) {
- m_pInfoDict = pInfoObj->GetDict();
- }
- CPDF_Array* pIDArray = m_pParser->GetIDArray();
- if (pIDArray) {
- m_ID1 = pIDArray->GetString(0);
- m_ID2 = pIDArray->GetString(1);
- }
- m_PageList.SetSize(_GetPageCount());
-}
-void CPDF_Document::LoadAsynDoc(CPDF_Dictionary *pLinearized)
-{
- m_bLinearized = TRUE;
- m_LastObjNum = m_pParser->GetLastObjNum();
- m_pRootDict = GetIndirectObject(m_pParser->GetRootObjNum())->GetDict();
- if (m_pRootDict == NULL) {
- return;
- }
- m_pInfoDict = GetIndirectObject(m_pParser->GetInfoObjNum())->GetDict();
- CPDF_Array* pIDArray = m_pParser->GetIDArray();
- if (pIDArray) {
- m_ID1 = pIDArray->GetString(0);
- m_ID2 = pIDArray->GetString(1);
- }
- FX_DWORD dwPageCount = 0;
- CPDF_Object *pCount = pLinearized->GetElement(FX_BSTRC("N"));
- if (pCount && pCount->GetType() == PDFOBJ_NUMBER) {
- dwPageCount = pCount->GetInteger();
- }
- m_PageList.SetSize(dwPageCount);
- CPDF_Object *pNo = pLinearized->GetElement(FX_BSTRC("P"));
- if (pNo && pNo->GetType() == PDFOBJ_NUMBER) {
- m_dwFirstPageNo = pNo->GetInteger();
- }
- CPDF_Object *pObjNum = pLinearized->GetElement(FX_BSTRC("O"));
- if (pObjNum && pObjNum->GetType() == PDFOBJ_NUMBER) {
- m_dwFirstPageObjNum = pObjNum->GetInteger();
- }
-}
-void CPDF_Document::LoadPages()
-{
- m_PageList.SetSize(_GetPageCount());
-}
-extern void FPDF_TTFaceMapper_ReleaseDoc(CPDF_Document*);
-CPDF_Document::~CPDF_Document()
-{
- if (m_pDocRender) {
- CPDF_ModuleMgr::Get()->GetRenderModule()->DestroyDocData(m_pDocRender);
- }
- if (m_pDocPage) {
- CPDF_ModuleMgr::Get()->GetPageModule()->ReleaseDoc(this);
- CPDF_ModuleMgr::Get()->GetPageModule()->ClearStockFont(this);
- }
-}
-#define FX_MAX_PAGE_LEVEL 1024
-CPDF_Dictionary* CPDF_Document::_FindPDFPage(CPDF_Dictionary* pPages, int iPage, int nPagesToGo, int level)
-{
- CPDF_Array* pKidList = pPages->GetArray(FX_BSTRC("Kids"));
- if (pKidList == NULL) {
- if (nPagesToGo == 0) {
- return pPages;
- }
- return NULL;
- }
- if (level >= FX_MAX_PAGE_LEVEL) {
- return NULL;
- }
- int nKids = pKidList->GetCount();
- for (int i = 0; i < nKids; i ++) {
- CPDF_Dictionary* pKid = pKidList->GetDict(i);
- if (pKid == NULL) {
- nPagesToGo --;
- continue;
- }
- if (pKid == pPages) {
- continue;
- }
- if (!pKid->KeyExist(FX_BSTRC("Kids"))) {
- if (nPagesToGo == 0) {
- return pKid;
- }
- m_PageList.SetAt(iPage - nPagesToGo, pKid->GetObjNum());
- nPagesToGo --;
- } else {
- int nPages = pKid->GetInteger(FX_BSTRC("Count"));
- if (nPagesToGo < nPages) {
- return _FindPDFPage(pKid, iPage, nPagesToGo, level + 1);
- }
- nPagesToGo -= nPages;
- }
- }
- return NULL;
-}
-CPDF_Dictionary* CPDF_Document::GetPage(int iPage)
-{
- if (iPage < 0 || iPage >= m_PageList.GetSize()) {
- return NULL;
- }
- if (m_bLinearized && (iPage == (int)m_dwFirstPageNo)) {
- CPDF_Object* pObj = GetIndirectObject(m_dwFirstPageObjNum);
- if (pObj && pObj->GetType() == PDFOBJ_DICTIONARY) {
- return (CPDF_Dictionary*)pObj;
- }
- }
- int objnum = m_PageList.GetAt(iPage);
- if (objnum) {
- CPDF_Object* pObj = GetIndirectObject(objnum);
- ASSERT(pObj->GetType() == PDFOBJ_DICTIONARY);
- return (CPDF_Dictionary*)pObj;
- }
- CPDF_Dictionary* pRoot = GetRoot();
- if (pRoot == NULL) {
- return NULL;
- }
- CPDF_Dictionary* pPages = pRoot->GetDict(FX_BSTRC("Pages"));
- if (pPages == NULL) {
- return NULL;
- }
- CPDF_Dictionary* pPage = _FindPDFPage(pPages, iPage, iPage, 0);
- if (pPage == NULL) {
- return NULL;
- }
- m_PageList.SetAt(iPage, pPage->GetObjNum());
- return pPage;
-}
-int CPDF_Document::_FindPageIndex(CPDF_Dictionary* pNode, FX_DWORD& skip_count, FX_DWORD objnum, int& index, int level)
-{
- if (pNode->KeyExist(FX_BSTRC("Kids"))) {
- CPDF_Array* pKidList = pNode->GetArray(FX_BSTRC("Kids"));
- if (pKidList == NULL) {
- return -1;
- }
- if (level >= FX_MAX_PAGE_LEVEL) {
- return -1;
- }
- FX_DWORD count = pNode->GetInteger(FX_BSTRC("Count"));
- if (count <= skip_count) {
- skip_count -= count;
- index += count;
- return -1;
- }
- if (count && count == pKidList->GetCount()) {
- for (FX_DWORD i = 0; i < count; i ++) {
- CPDF_Reference* pKid = (CPDF_Reference*)pKidList->GetElement(i);
- if (pKid && pKid->GetType() == PDFOBJ_REFERENCE) {
- if (pKid->GetRefObjNum() == objnum) {
- m_PageList.SetAt(index + i, objnum);
- return index + i;
- }
- }
- }
- }
- for (FX_DWORD i = 0; i < pKidList->GetCount(); i ++) {
- CPDF_Dictionary* pKid = pKidList->GetDict(i);
- if (pKid == NULL) {
- continue;
- }
- if (pKid == pNode) {
- continue;
- }
- int found_index = _FindPageIndex(pKid, skip_count, objnum, index, level + 1);
- if (found_index >= 0) {
- return found_index;
- }
- }
- } else {
- if (objnum == pNode->GetObjNum()) {
- return index;
- }
- if (skip_count) {
- skip_count--;
- }
- index ++;
- }
- return -1;
-}
-int CPDF_Document::GetPageIndex(FX_DWORD objnum)
-{
- FX_DWORD nPages = m_PageList.GetSize();
- FX_DWORD skip_count = 0;
- FX_BOOL bSkipped = FALSE;
- for (FX_DWORD i = 0; i < nPages; i ++) {
- FX_DWORD objnum1 = m_PageList.GetAt(i);
- if (objnum1 == objnum) {
- return i;
- }
- if (!bSkipped && objnum1 == 0) {
- skip_count = i;
- bSkipped = TRUE;
- }
- }
- CPDF_Dictionary* pRoot = GetRoot();
- if (pRoot == NULL) {
- return -1;
- }
- CPDF_Dictionary* pPages = pRoot->GetDict(FX_BSTRC("Pages"));
- if (pPages == NULL) {
- return -1;
- }
- int index = 0;
- return _FindPageIndex(pPages, skip_count, objnum, index);
-}
-int CPDF_Document::GetPageCount() const
-{
- return m_PageList.GetSize();
-}
-static int _CountPages(CPDF_Dictionary* pPages, int level)
-{
- if (level > 128) {
- return 0;
- }
- int count = pPages->GetInteger(FX_BSTRC("Count"));
- if (count > 0 && count < FPDF_PAGE_MAX_NUM) {
- return count;
- }
- CPDF_Array* pKidList = pPages->GetArray(FX_BSTRC("Kids"));
- if (pKidList == NULL) {
- return 0;
- }
- count = 0;
- for (FX_DWORD i = 0; i < pKidList->GetCount(); i ++) {
- CPDF_Dictionary* pKid = pKidList->GetDict(i);
- if (pKid == NULL) {
- continue;
- }
- if (!pKid->KeyExist(FX_BSTRC("Kids"))) {
- count ++;
- } else {
- count += _CountPages(pKid, level + 1);
- }
- }
- pPages->SetAtInteger(FX_BSTRC("Count"), count);
- return count;
-}
-int CPDF_Document::_GetPageCount() const
-{
- CPDF_Dictionary* pRoot = GetRoot();
- if (pRoot == NULL) {
- return 0;
- }
- CPDF_Dictionary* pPages = pRoot->GetDict(FX_BSTRC("Pages"));
- if (pPages == NULL) {
- return 0;
- }
- if (!pPages->KeyExist(FX_BSTRC("Kids"))) {
- return 1;
- }
- return _CountPages(pPages, 0);
-}
-static FX_BOOL _EnumPages(CPDF_Dictionary* pPages, IPDF_EnumPageHandler* pHandler)
-{
- CPDF_Array* pKidList = pPages->GetArray(FX_BSTRC("Kids"));
- if (pKidList == NULL) {
- return pHandler->EnumPage(pPages);
- }
- for (FX_DWORD i = 0; i < pKidList->GetCount(); i ++) {
- CPDF_Dictionary* pKid = pKidList->GetDict(i);
- if (pKid == NULL) {
- continue;
- }
- if (!pKid->KeyExist(FX_BSTRC("Kids"))) {
- if (!pHandler->EnumPage(pKid)) {
- return FALSE;
- }
- } else {
- return _EnumPages(pKid, pHandler);
- }
- }
- return TRUE;
-}
-void CPDF_Document::EnumPages(IPDF_EnumPageHandler* pHandler)
-{
- CPDF_Dictionary* pRoot = GetRoot();
- if (pRoot == NULL) {
- return;
- }
- CPDF_Dictionary* pPages = pRoot->GetDict(FX_BSTRC("Pages"));
- if (pPages == NULL) {
- return;
- }
- _EnumPages(pPages, pHandler);
-}
-FX_BOOL CPDF_Document::IsContentUsedElsewhere(FX_DWORD objnum, CPDF_Dictionary* pThisPageDict)
-{
- for (int i = 0; i < m_PageList.GetSize(); i ++) {
- CPDF_Dictionary* pPageDict = GetPage(i);
- if (pPageDict == pThisPageDict) {
- continue;
- }
- CPDF_Object* pContents = pPageDict->GetElement(FX_BSTRC("Contents"));
- if (pContents == NULL) {
- continue;
- }
- if (pContents->GetDirectType() == PDFOBJ_ARRAY) {
- CPDF_Array* pArray = (CPDF_Array*)pContents->GetDirect();
- for (FX_DWORD j = 0; j < pArray->GetCount(); j ++) {
- CPDF_Reference* pRef = (CPDF_Reference*)pArray->GetElement(j);
- if (pRef->GetRefObjNum() == objnum) {
- return TRUE;
- }
- }
- } else if (pContents->GetObjNum() == objnum) {
- return TRUE;
- }
- }
- return FALSE;
-}
-FX_DWORD CPDF_Document::GetUserPermissions(FX_BOOL bCheckRevision) const
-{
- if (m_pParser == NULL) {
- return (FX_DWORD) - 1;
- }
- return m_pParser->GetPermissions(bCheckRevision);
-}
-FX_BOOL CPDF_Document::IsOwner() const
-{
- if (m_pParser == NULL) {
- return TRUE;
- }
- return m_pParser->IsOwner();
-}
-FX_BOOL CPDF_Document::IsFormStream(FX_DWORD objnum, FX_BOOL& bForm) const
-{
- {
- CPDF_Object* pObj;
- if (m_IndirectObjs.Lookup((FX_LPVOID)(FX_UINTPTR)objnum, (FX_LPVOID&)pObj)) {
- bForm = pObj->GetType() == PDFOBJ_STREAM &&
- ((CPDF_Stream*)pObj)->GetDict()->GetString(FX_BSTRC("Subtype")) == FX_BSTRC("Form");
- return TRUE;
- }
- }
- if (m_pParser == NULL) {
- bForm = FALSE;
- return TRUE;
- }
- return m_pParser->IsFormStream(objnum, bForm);
-}
-void CPDF_Document::ClearPageData()
-{
- if (m_pDocPage) {
- CPDF_ModuleMgr::Get()->GetPageModule()->ClearDoc(this);
- }
-}
-void CPDF_Document::ClearRenderData()
-{
- if (m_pDocRender) {
- CPDF_ModuleMgr::Get()->GetRenderModule()->ClearDocData(m_pDocRender);
- }
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fpdfapi/fpdf_parser.h"
+#include "../../../include/fpdfapi/fpdf_module.h"
+extern FX_LPVOID PDFPreviewInitCache(CPDF_Document* pDoc);
+extern void PDFPreviewClearCache(FX_LPVOID pCache);
+CPDF_Document::CPDF_Document(IPDF_DocParser* pParser) : CPDF_IndirectObjects(pParser)
+{
+ ASSERT(pParser != NULL);
+ m_pRootDict = NULL;
+ m_pInfoDict = NULL;
+ m_bLinearized = FALSE;
+ m_dwFirstPageNo = 0;
+ m_dwFirstPageObjNum = 0;
+ m_pDocPage = CPDF_ModuleMgr::Get()->GetPageModule()->CreateDocData(this);
+ m_pDocRender = CPDF_ModuleMgr::Get()->GetRenderModule()->CreateDocData(this);
+}
+CPDF_DocPageData* CPDF_Document::GetValidatePageData()
+{
+ if (m_pDocPage) {
+ return m_pDocPage;
+ }
+ m_pDocPage = CPDF_ModuleMgr::Get()->GetPageModule()->CreateDocData(this);
+ return m_pDocPage;
+}
+CPDF_DocRenderData* CPDF_Document::GetValidateRenderData()
+{
+ if (m_pDocRender) {
+ return m_pDocRender;
+ }
+ m_pDocRender = CPDF_ModuleMgr::Get()->GetRenderModule()->CreateDocData(this);
+ return m_pDocRender;
+}
+void CPDF_Document::LoadDoc()
+{
+ m_LastObjNum = m_pParser->GetLastObjNum();
+ CPDF_Object* pRootObj = GetIndirectObject(m_pParser->GetRootObjNum());
+ if (pRootObj == NULL) {
+ return;
+ }
+ m_pRootDict = pRootObj->GetDict();
+ if (m_pRootDict == NULL) {
+ return;
+ }
+ CPDF_Object* pInfoObj = GetIndirectObject(m_pParser->GetInfoObjNum());
+ if (pInfoObj) {
+ m_pInfoDict = pInfoObj->GetDict();
+ }
+ CPDF_Array* pIDArray = m_pParser->GetIDArray();
+ if (pIDArray) {
+ m_ID1 = pIDArray->GetString(0);
+ m_ID2 = pIDArray->GetString(1);
+ }
+ m_PageList.SetSize(_GetPageCount());
+}
+void CPDF_Document::LoadAsynDoc(CPDF_Dictionary *pLinearized)
+{
+ m_bLinearized = TRUE;
+ m_LastObjNum = m_pParser->GetLastObjNum();
+ m_pRootDict = GetIndirectObject(m_pParser->GetRootObjNum())->GetDict();
+ if (m_pRootDict == NULL) {
+ return;
+ }
+ m_pInfoDict = GetIndirectObject(m_pParser->GetInfoObjNum())->GetDict();
+ CPDF_Array* pIDArray = m_pParser->GetIDArray();
+ if (pIDArray) {
+ m_ID1 = pIDArray->GetString(0);
+ m_ID2 = pIDArray->GetString(1);
+ }
+ FX_DWORD dwPageCount = 0;
+ CPDF_Object *pCount = pLinearized->GetElement(FX_BSTRC("N"));
+ if (pCount && pCount->GetType() == PDFOBJ_NUMBER) {
+ dwPageCount = pCount->GetInteger();
+ }
+ m_PageList.SetSize(dwPageCount);
+ CPDF_Object *pNo = pLinearized->GetElement(FX_BSTRC("P"));
+ if (pNo && pNo->GetType() == PDFOBJ_NUMBER) {
+ m_dwFirstPageNo = pNo->GetInteger();
+ }
+ CPDF_Object *pObjNum = pLinearized->GetElement(FX_BSTRC("O"));
+ if (pObjNum && pObjNum->GetType() == PDFOBJ_NUMBER) {
+ m_dwFirstPageObjNum = pObjNum->GetInteger();
+ }
+}
+void CPDF_Document::LoadPages()
+{
+ m_PageList.SetSize(_GetPageCount());
+}
+extern void FPDF_TTFaceMapper_ReleaseDoc(CPDF_Document*);
+CPDF_Document::~CPDF_Document()
+{
+ if (m_pDocRender) {
+ CPDF_ModuleMgr::Get()->GetRenderModule()->DestroyDocData(m_pDocRender);
+ }
+ if (m_pDocPage) {
+ CPDF_ModuleMgr::Get()->GetPageModule()->ReleaseDoc(this);
+ CPDF_ModuleMgr::Get()->GetPageModule()->ClearStockFont(this);
+ }
+}
+#define FX_MAX_PAGE_LEVEL 1024
+CPDF_Dictionary* CPDF_Document::_FindPDFPage(CPDF_Dictionary* pPages, int iPage, int nPagesToGo, int level)
+{
+ CPDF_Array* pKidList = pPages->GetArray(FX_BSTRC("Kids"));
+ if (pKidList == NULL) {
+ if (nPagesToGo == 0) {
+ return pPages;
+ }
+ return NULL;
+ }
+ if (level >= FX_MAX_PAGE_LEVEL) {
+ return NULL;
+ }
+ int nKids = pKidList->GetCount();
+ for (int i = 0; i < nKids; i ++) {
+ CPDF_Dictionary* pKid = pKidList->GetDict(i);
+ if (pKid == NULL) {
+ nPagesToGo --;
+ continue;
+ }
+ if (pKid == pPages) {
+ continue;
+ }
+ if (!pKid->KeyExist(FX_BSTRC("Kids"))) {
+ if (nPagesToGo == 0) {
+ return pKid;
+ }
+ m_PageList.SetAt(iPage - nPagesToGo, pKid->GetObjNum());
+ nPagesToGo --;
+ } else {
+ int nPages = pKid->GetInteger(FX_BSTRC("Count"));
+ if (nPagesToGo < nPages) {
+ return _FindPDFPage(pKid, iPage, nPagesToGo, level + 1);
+ }
+ nPagesToGo -= nPages;
+ }
+ }
+ return NULL;
+}
+CPDF_Dictionary* CPDF_Document::GetPage(int iPage)
+{
+ if (iPage < 0 || iPage >= m_PageList.GetSize()) {
+ return NULL;
+ }
+ if (m_bLinearized && (iPage == (int)m_dwFirstPageNo)) {
+ CPDF_Object* pObj = GetIndirectObject(m_dwFirstPageObjNum);
+ if (pObj && pObj->GetType() == PDFOBJ_DICTIONARY) {
+ return (CPDF_Dictionary*)pObj;
+ }
+ }
+ int objnum = m_PageList.GetAt(iPage);
+ if (objnum) {
+ CPDF_Object* pObj = GetIndirectObject(objnum);
+ ASSERT(pObj->GetType() == PDFOBJ_DICTIONARY);
+ return (CPDF_Dictionary*)pObj;
+ }
+ CPDF_Dictionary* pRoot = GetRoot();
+ if (pRoot == NULL) {
+ return NULL;
+ }
+ CPDF_Dictionary* pPages = pRoot->GetDict(FX_BSTRC("Pages"));
+ if (pPages == NULL) {
+ return NULL;
+ }
+ CPDF_Dictionary* pPage = _FindPDFPage(pPages, iPage, iPage, 0);
+ if (pPage == NULL) {
+ return NULL;
+ }
+ m_PageList.SetAt(iPage, pPage->GetObjNum());
+ return pPage;
+}
+int CPDF_Document::_FindPageIndex(CPDF_Dictionary* pNode, FX_DWORD& skip_count, FX_DWORD objnum, int& index, int level)
+{
+ if (pNode->KeyExist(FX_BSTRC("Kids"))) {
+ CPDF_Array* pKidList = pNode->GetArray(FX_BSTRC("Kids"));
+ if (pKidList == NULL) {
+ return -1;
+ }
+ if (level >= FX_MAX_PAGE_LEVEL) {
+ return -1;
+ }
+ FX_DWORD count = pNode->GetInteger(FX_BSTRC("Count"));
+ if (count <= skip_count) {
+ skip_count -= count;
+ index += count;
+ return -1;
+ }
+ if (count && count == pKidList->GetCount()) {
+ for (FX_DWORD i = 0; i < count; i ++) {
+ CPDF_Reference* pKid = (CPDF_Reference*)pKidList->GetElement(i);
+ if (pKid && pKid->GetType() == PDFOBJ_REFERENCE) {
+ if (pKid->GetRefObjNum() == objnum) {
+ m_PageList.SetAt(index + i, objnum);
+ return index + i;
+ }
+ }
+ }
+ }
+ for (FX_DWORD i = 0; i < pKidList->GetCount(); i ++) {
+ CPDF_Dictionary* pKid = pKidList->GetDict(i);
+ if (pKid == NULL) {
+ continue;
+ }
+ if (pKid == pNode) {
+ continue;
+ }
+ int found_index = _FindPageIndex(pKid, skip_count, objnum, index, level + 1);
+ if (found_index >= 0) {
+ return found_index;
+ }
+ }
+ } else {
+ if (objnum == pNode->GetObjNum()) {
+ return index;
+ }
+ if (skip_count) {
+ skip_count--;
+ }
+ index ++;
+ }
+ return -1;
+}
+int CPDF_Document::GetPageIndex(FX_DWORD objnum)
+{
+ FX_DWORD nPages = m_PageList.GetSize();
+ FX_DWORD skip_count = 0;
+ FX_BOOL bSkipped = FALSE;
+ for (FX_DWORD i = 0; i < nPages; i ++) {
+ FX_DWORD objnum1 = m_PageList.GetAt(i);
+ if (objnum1 == objnum) {
+ return i;
+ }
+ if (!bSkipped && objnum1 == 0) {
+ skip_count = i;
+ bSkipped = TRUE;
+ }
+ }
+ CPDF_Dictionary* pRoot = GetRoot();
+ if (pRoot == NULL) {
+ return -1;
+ }
+ CPDF_Dictionary* pPages = pRoot->GetDict(FX_BSTRC("Pages"));
+ if (pPages == NULL) {
+ return -1;
+ }
+ int index = 0;
+ return _FindPageIndex(pPages, skip_count, objnum, index);
+}
+int CPDF_Document::GetPageCount() const
+{
+ return m_PageList.GetSize();
+}
+static int _CountPages(CPDF_Dictionary* pPages, int level)
+{
+ if (level > 128) {
+ return 0;
+ }
+ int count = pPages->GetInteger(FX_BSTRC("Count"));
+ if (count > 0 && count < FPDF_PAGE_MAX_NUM) {
+ return count;
+ }
+ CPDF_Array* pKidList = pPages->GetArray(FX_BSTRC("Kids"));
+ if (pKidList == NULL) {
+ return 0;
+ }
+ count = 0;
+ for (FX_DWORD i = 0; i < pKidList->GetCount(); i ++) {
+ CPDF_Dictionary* pKid = pKidList->GetDict(i);
+ if (pKid == NULL) {
+ continue;
+ }
+ if (!pKid->KeyExist(FX_BSTRC("Kids"))) {
+ count ++;
+ } else {
+ count += _CountPages(pKid, level + 1);
+ }
+ }
+ pPages->SetAtInteger(FX_BSTRC("Count"), count);
+ return count;
+}
+int CPDF_Document::_GetPageCount() const
+{
+ CPDF_Dictionary* pRoot = GetRoot();
+ if (pRoot == NULL) {
+ return 0;
+ }
+ CPDF_Dictionary* pPages = pRoot->GetDict(FX_BSTRC("Pages"));
+ if (pPages == NULL) {
+ return 0;
+ }
+ if (!pPages->KeyExist(FX_BSTRC("Kids"))) {
+ return 1;
+ }
+ return _CountPages(pPages, 0);
+}
+static FX_BOOL _EnumPages(CPDF_Dictionary* pPages, IPDF_EnumPageHandler* pHandler)
+{
+ CPDF_Array* pKidList = pPages->GetArray(FX_BSTRC("Kids"));
+ if (pKidList == NULL) {
+ return pHandler->EnumPage(pPages);
+ }
+ for (FX_DWORD i = 0; i < pKidList->GetCount(); i ++) {
+ CPDF_Dictionary* pKid = pKidList->GetDict(i);
+ if (pKid == NULL) {
+ continue;
+ }
+ if (!pKid->KeyExist(FX_BSTRC("Kids"))) {
+ if (!pHandler->EnumPage(pKid)) {
+ return FALSE;
+ }
+ } else {
+ return _EnumPages(pKid, pHandler);
+ }
+ }
+ return TRUE;
+}
+void CPDF_Document::EnumPages(IPDF_EnumPageHandler* pHandler)
+{
+ CPDF_Dictionary* pRoot = GetRoot();
+ if (pRoot == NULL) {
+ return;
+ }
+ CPDF_Dictionary* pPages = pRoot->GetDict(FX_BSTRC("Pages"));
+ if (pPages == NULL) {
+ return;
+ }
+ _EnumPages(pPages, pHandler);
+}
+FX_BOOL CPDF_Document::IsContentUsedElsewhere(FX_DWORD objnum, CPDF_Dictionary* pThisPageDict)
+{
+ for (int i = 0; i < m_PageList.GetSize(); i ++) {
+ CPDF_Dictionary* pPageDict = GetPage(i);
+ if (pPageDict == pThisPageDict) {
+ continue;
+ }
+ CPDF_Object* pContents = pPageDict->GetElement(FX_BSTRC("Contents"));
+ if (pContents == NULL) {
+ continue;
+ }
+ if (pContents->GetDirectType() == PDFOBJ_ARRAY) {
+ CPDF_Array* pArray = (CPDF_Array*)pContents->GetDirect();
+ for (FX_DWORD j = 0; j < pArray->GetCount(); j ++) {
+ CPDF_Reference* pRef = (CPDF_Reference*)pArray->GetElement(j);
+ if (pRef->GetRefObjNum() == objnum) {
+ return TRUE;
+ }
+ }
+ } else if (pContents->GetObjNum() == objnum) {
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+FX_DWORD CPDF_Document::GetUserPermissions(FX_BOOL bCheckRevision) const
+{
+ if (m_pParser == NULL) {
+ return (FX_DWORD) - 1;
+ }
+ return m_pParser->GetPermissions(bCheckRevision);
+}
+FX_BOOL CPDF_Document::IsOwner() const
+{
+ if (m_pParser == NULL) {
+ return TRUE;
+ }
+ return m_pParser->IsOwner();
+}
+FX_BOOL CPDF_Document::IsFormStream(FX_DWORD objnum, FX_BOOL& bForm) const
+{
+ {
+ CPDF_Object* pObj;
+ if (m_IndirectObjs.Lookup((FX_LPVOID)(FX_UINTPTR)objnum, (FX_LPVOID&)pObj)) {
+ bForm = pObj->GetType() == PDFOBJ_STREAM &&
+ ((CPDF_Stream*)pObj)->GetDict()->GetString(FX_BSTRC("Subtype")) == FX_BSTRC("Form");
+ return TRUE;
+ }
+ }
+ if (m_pParser == NULL) {
+ bForm = FALSE;
+ return TRUE;
+ }
+ return m_pParser->IsFormStream(objnum, bForm);
+}
+void CPDF_Document::ClearPageData()
+{
+ if (m_pDocPage) {
+ CPDF_ModuleMgr::Get()->GetPageModule()->ClearDoc(this);
+ }
+}
+void CPDF_Document::ClearRenderData()
+{
+ if (m_pDocRender) {
+ CPDF_ModuleMgr::Get()->GetRenderModule()->ClearDocData(m_pDocRender);
+ }
+}
diff --git a/core/src/fpdfapi/fpdf_parser/fpdf_parser_encrypt.cpp b/core/src/fpdfapi/fpdf_parser/fpdf_parser_encrypt.cpp
index d1f1a24488..fadcd38b1b 100644
--- a/core/src/fpdfapi/fpdf_parser/fpdf_parser_encrypt.cpp
+++ b/core/src/fpdfapi/fpdf_parser/fpdf_parser_encrypt.cpp
@@ -1,957 +1,957 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include <time.h>
-#include "../../../include/fpdfapi/fpdf_parser.h"
-#include "../../../include/fdrm/fx_crypt.h"
-const FX_BYTE defpasscode[32] = {
- 0x28, 0xbf, 0x4e, 0x5e, 0x4e, 0x75, 0x8a, 0x41,
- 0x64, 0x00, 0x4e, 0x56, 0xff, 0xfa, 0x01, 0x08,
- 0x2e, 0x2e, 0x00, 0xb6, 0xd0, 0x68, 0x3e, 0x80,
- 0x2f, 0x0c, 0xa9, 0xfe, 0x64, 0x53, 0x69, 0x7a
-};
-void CalcEncryptKey(CPDF_Dictionary* pEncrypt, FX_LPCBYTE password, FX_DWORD pass_size,
- FX_LPBYTE key, int keylen, FX_BOOL bIgnoreMeta, CPDF_Array* pIdArray)
-{
- int revision = pEncrypt->GetInteger(FX_BSTRC("R"));
- FX_BYTE passcode[32];
- for (FX_DWORD i = 0; i < 32; i ++) {
- passcode[i] = i < pass_size ? password[i] : defpasscode[i - pass_size];
- }
- FX_BYTE md5[100];
- CRYPT_MD5Start(md5);
- CRYPT_MD5Update(md5, passcode, 32);
- CFX_ByteString okey = pEncrypt->GetString(FX_BSTRC("O"));
- CRYPT_MD5Update(md5, (FX_LPBYTE)(FX_LPCSTR)okey, okey.GetLength());
- FX_DWORD perm = pEncrypt->GetInteger(FX_BSTRC("P"));
- CRYPT_MD5Update(md5, (FX_LPBYTE)&perm, 4);
- if (pIdArray) {
- CFX_ByteString id = pIdArray->GetString(0);
- CRYPT_MD5Update(md5, (FX_LPBYTE)(FX_LPCSTR)id, id.GetLength());
- }
- if (!bIgnoreMeta && revision >= 3 && !pEncrypt->GetInteger(FX_BSTRC("EncryptMetadata"), 1)) {
- FX_DWORD tag = (FX_DWORD) - 1;
- CRYPT_MD5Update(md5, (FX_LPBYTE)&tag, 4);
- }
- FX_BYTE digest[16];
- CRYPT_MD5Finish(md5, digest);
- FX_DWORD copy_len = keylen;
- if (copy_len > sizeof(digest)) {
- copy_len = sizeof(digest);
- }
- if (revision >= 3) {
- for (int i = 0; i < 50; i ++) {
- CRYPT_MD5Generate(digest, copy_len, digest);
- }
- }
- FXSYS_memset32(key, 0, keylen);
- FXSYS_memcpy32(key, digest, copy_len);
-}
-CPDF_CryptoHandler* CPDF_StandardSecurityHandler::CreateCryptoHandler()
-{
- return FX_NEW CPDF_StandardCryptoHandler;
-}
-typedef struct _PDF_CRYPTOITEM : public CFX_Object {
- FX_INT32 m_Cipher;
- FX_INT32 m_KeyLen;
- FX_BOOL m_bChecked;
- CPDF_StandardCryptoHandler* m_pCryptoHandler;
-} PDF_CRYPTOITEM;
-CPDF_StandardSecurityHandler::CPDF_StandardSecurityHandler()
-{
- m_Version = 0;
- m_Revision = 0;
- m_pParser = NULL;
- m_pEncryptDict = NULL;
- m_bOwner = FALSE;
- m_Permissions = 0;
- m_Cipher = FXCIPHER_NONE;
- m_KeyLen = 0;
-}
-CPDF_StandardSecurityHandler::~CPDF_StandardSecurityHandler()
-{
-}
-FX_BOOL CPDF_StandardSecurityHandler::OnInit(CPDF_Parser* pParser, CPDF_Dictionary* pEncryptDict)
-{
- m_pParser = pParser;
- if (!LoadDict(pEncryptDict)) {
- return FALSE;
- }
- if (m_Cipher == FXCIPHER_NONE) {
- return TRUE;
- }
- return CheckSecurity(m_KeyLen);
-}
-FX_BOOL CPDF_StandardSecurityHandler::CheckSecurity(FX_INT32 key_len)
-{
- CFX_ByteString password = m_pParser->GetPassword();
- if (CheckPassword(password, password.GetLength(), TRUE, m_EncryptKey, key_len)) {
- if (password.IsEmpty()) {
- if (!CheckPassword(password, password.GetLength(), FALSE, m_EncryptKey, key_len)) {
- return FALSE;
- }
- }
- m_bOwner = TRUE;
- return TRUE;
- }
- return CheckPassword(password, password.GetLength(), FALSE, m_EncryptKey, key_len);
-}
-FX_DWORD CPDF_StandardSecurityHandler::GetPermissions()
-{
- return m_Permissions;
-}
-static FX_BOOL _LoadCryptInfo(CPDF_Dictionary* pEncryptDict, FX_BSTR name, int& cipher, int& keylen)
-{
- int Version = pEncryptDict->GetInteger(FX_BSTRC("V"));
- int Revision = pEncryptDict->GetInteger(FX_BSTRC("R"));
- cipher = FXCIPHER_RC4;
- keylen = 0;
- if (Version >= 4) {
- CPDF_Dictionary* pCryptFilters = pEncryptDict->GetDict(FX_BSTRC("CF"));
- if (pCryptFilters == NULL) {
- return FALSE;
- }
- if (name == FX_BSTRC("Identity")) {
- cipher = FXCIPHER_NONE;
- } else {
- CPDF_Dictionary* pDefFilter = pCryptFilters->GetDict(name);
- if (pDefFilter == NULL) {
- return FALSE;
- }
- int nKeyBits = 0;
- if (Version == 4) {
- nKeyBits = pDefFilter->GetInteger(FX_BSTRC("Length"), 0);
- if (nKeyBits == 0) {
- nKeyBits = pEncryptDict->GetInteger(FX_BSTRC("Length"), 128);
- }
- } else {
- nKeyBits = pEncryptDict->GetInteger(FX_BSTRC("Length"), 256);
- }
- if (nKeyBits < 40) {
- nKeyBits *= 8;
- }
- keylen = nKeyBits / 8;
- CFX_ByteString cipher_name = pDefFilter->GetString(FX_BSTRC("CFM"));
- if (cipher_name == FX_BSTRC("AESV2") || cipher_name == FX_BSTRC("AESV3")) {
- cipher = FXCIPHER_AES;
- }
- }
- } else {
- keylen = Version > 1 ? pEncryptDict->GetInteger(FX_BSTRC("Length"), 40) / 8 : 5;
- }
- if (keylen > 32 || keylen < 0) {
- return FALSE;
- }
- return TRUE;
-}
-FX_BOOL CPDF_StandardSecurityHandler::LoadDict(CPDF_Dictionary* pEncryptDict)
-{
- m_pEncryptDict = pEncryptDict;
- m_bOwner = FALSE;
- m_Version = pEncryptDict->GetInteger(FX_BSTRC("V"));
- m_Revision = pEncryptDict->GetInteger(FX_BSTRC("R"));
- m_Permissions = pEncryptDict->GetInteger(FX_BSTRC("P"), -1);
- if (m_Version < 4) {
- return _LoadCryptInfo(pEncryptDict, CFX_ByteString(), m_Cipher, m_KeyLen);
- }
- CFX_ByteString stmf_name = pEncryptDict->GetString(FX_BSTRC("StmF"));
- CFX_ByteString strf_name = pEncryptDict->GetString(FX_BSTRC("StrF"));
- if (stmf_name != strf_name) {
- return FALSE;
- }
- if (!_LoadCryptInfo(pEncryptDict, strf_name, m_Cipher, m_KeyLen)) {
- return FALSE;
- }
- return TRUE;
-}
-FX_BOOL CPDF_StandardSecurityHandler::LoadDict(CPDF_Dictionary* pEncryptDict, FX_DWORD type, int& cipher, int& key_len)
-{
- m_pEncryptDict = pEncryptDict;
- m_bOwner = FALSE;
- m_Version = pEncryptDict->GetInteger(FX_BSTRC("V"));
- m_Revision = pEncryptDict->GetInteger(FX_BSTRC("R"));
- m_Permissions = pEncryptDict->GetInteger(FX_BSTRC("P"), -1);
- CFX_ByteString strf_name, stmf_name;
- if (m_Version >= 4) {
- stmf_name = pEncryptDict->GetString(FX_BSTRC("StmF"));
- strf_name = pEncryptDict->GetString(FX_BSTRC("StrF"));
- if (stmf_name != strf_name) {
- return FALSE;
- }
- }
- if (!_LoadCryptInfo(pEncryptDict, strf_name, cipher, key_len)) {
- return FALSE;
- }
- m_Cipher = cipher;
- m_KeyLen = key_len;
- return TRUE;
- return TRUE;
-}
-FX_BOOL CPDF_StandardSecurityHandler::GetCryptInfo(int& cipher, FX_LPCBYTE& buffer, int& keylen)
-{
- cipher = m_Cipher;
- buffer = m_EncryptKey;
- keylen = m_KeyLen;
- return TRUE;
-}
-#define FX_GET_32WORD(n,b,i) \
- { \
- (n) = (FX_DWORD)(( (FX_UINT64) (b)[(i)] << 24 ) \
- | ( (FX_UINT64) (b)[(i) + 1] << 16 ) \
- | ( (FX_UINT64) (b)[(i) + 2] << 8 ) \
- | ( (FX_UINT64) (b)[(i) + 3] )); \
- }
-int BigOrder64BitsMod3(FX_LPBYTE data)
-{
- FX_UINT64 ret = 0;
- for (int i = 0; i < 4; ++i) {
- FX_DWORD value;
- FX_GET_32WORD(value, data, 4 * i);
- ret <<= 32;
- ret |= value;
- ret %= 3;
- }
- return (int)ret;
-}
-void Revision6_Hash(FX_LPCBYTE password, FX_DWORD size, FX_LPCBYTE salt, FX_LPCBYTE vector, FX_LPBYTE hash)
-{
- int iBlockSize = 32;
- FX_BYTE sha[128];
- CRYPT_SHA256Start(sha);
- CRYPT_SHA256Update(sha, password, size);
- CRYPT_SHA256Update(sha, salt, 8);
- if (vector) {
- CRYPT_SHA256Update(sha, vector, 48);
- }
- FX_BYTE digest[32];
- CRYPT_SHA256Finish(sha, digest);
- CFX_ByteTextBuf buf;
- FX_LPBYTE input = digest;
- FX_LPBYTE key = input;
- FX_LPBYTE iv = input + 16;
- FX_LPBYTE E = buf.GetBuffer();
- int iBufLen = buf.GetLength();
- CFX_ByteTextBuf interDigest;
- int i = 0;
- FX_LPBYTE aes = FX_Alloc(FX_BYTE, 2048);
- while (i < 64 || i < E[iBufLen - 1] + 32) {
- int iRoundSize = size + iBlockSize;
- if (vector) {
- iRoundSize += 48;
- }
- iBufLen = iRoundSize * 64;
- buf.EstimateSize(iBufLen);
- E = buf.GetBuffer();
- CFX_ByteTextBuf content;
- for (int j = 0; j < 64; ++j) {
- content.AppendBlock(password, size);
- content.AppendBlock(input, iBlockSize);
- if (vector) {
- content.AppendBlock(vector, 48);
- }
- }
- CRYPT_AESSetKey(aes, 16, key, 16, TRUE);
- CRYPT_AESSetIV(aes, iv);
- CRYPT_AESEncrypt(aes, E, content.GetBuffer(), iBufLen);
- int iHash = 0;
- switch (BigOrder64BitsMod3(E)) {
- case 0:
- iHash = 0;
- iBlockSize = 32;
- break;
- case 1:
- iHash = 1;
- iBlockSize = 48;
- break;
- default:
- iHash = 2;
- iBlockSize = 64;
- break;
- }
- interDigest.EstimateSize(iBlockSize);
- input = interDigest.GetBuffer();
- if (iHash == 0) {
- CRYPT_SHA256Generate(E, iBufLen, input);
- } else if (iHash == 1) {
- CRYPT_SHA384Generate(E, iBufLen, input);
- } else if (iHash == 2) {
- CRYPT_SHA512Generate(E, iBufLen, input);
- }
- key = input;
- iv = input + 16;
- ++i;
- }
- FX_Free(aes);
- if (hash) {
- FXSYS_memcpy32(hash, input, 32);
- }
-}
-FX_BOOL CPDF_StandardSecurityHandler::AES256_CheckPassword(FX_LPCBYTE password, FX_DWORD size,
- FX_BOOL bOwner, FX_LPBYTE key)
-{
- CFX_ByteString okey = m_pEncryptDict->GetString(FX_BSTRC("O"));
- if (okey.GetLength() < 48) {
- return FALSE;
- }
- CFX_ByteString ukey = m_pEncryptDict->GetString(FX_BSTRC("U"));
- if (ukey.GetLength() < 48) {
- return FALSE;
- }
- FX_LPCBYTE pkey = bOwner ? (FX_LPCBYTE)okey : (FX_LPCBYTE)ukey;
- FX_BYTE sha[128];
- FX_BYTE digest[32];
- if (m_Revision >= 6) {
- Revision6_Hash(password, size, (FX_LPCBYTE)pkey + 32, (bOwner ? (FX_LPCBYTE)ukey : NULL), digest);
- } else {
- CRYPT_SHA256Start(sha);
- CRYPT_SHA256Update(sha, password, size);
- CRYPT_SHA256Update(sha, pkey + 32, 8);
- if (bOwner) {
- CRYPT_SHA256Update(sha, ukey, 48);
- }
- CRYPT_SHA256Finish(sha, digest);
- }
- if (FXSYS_memcmp32(digest, pkey, 32) != 0) {
- return FALSE;
- }
- if (key == NULL) {
- return TRUE;
- }
- if (m_Revision >= 6) {
- Revision6_Hash(password, size, (FX_LPCBYTE)pkey + 40, (bOwner ? (FX_LPCBYTE)ukey : NULL), digest);
- } else {
- CRYPT_SHA256Start(sha);
- CRYPT_SHA256Update(sha, password, size);
- CRYPT_SHA256Update(sha, pkey + 40, 8);
- if (bOwner) {
- CRYPT_SHA256Update(sha, ukey, 48);
- }
- CRYPT_SHA256Finish(sha, digest);
- }
- CFX_ByteString ekey = m_pEncryptDict->GetString(bOwner ? FX_BSTRC("OE") : FX_BSTRC("UE"));
- if (ekey.GetLength() < 32) {
- return FALSE;
- }
- FX_BYTE* aes = FX_Alloc(FX_BYTE, 2048);
- CRYPT_AESSetKey(aes, 16, digest, 32, FALSE);
- FX_BYTE iv[16];
- FXSYS_memset32(iv, 0, 16);
- CRYPT_AESSetIV(aes, iv);
- CRYPT_AESDecrypt(aes, key, ekey, 32);
- CRYPT_AESSetKey(aes, 16, key, 32, FALSE);
- CRYPT_AESSetIV(aes, iv);
- CFX_ByteString perms = m_pEncryptDict->GetString(FX_BSTRC("Perms"));
- if (perms.IsEmpty()) {
- return FALSE;
- }
- FX_BYTE perms_buf[16];
- FXSYS_memset32(perms_buf, 0, sizeof(perms_buf));
- FX_DWORD copy_len = sizeof(perms_buf);
- if (copy_len > (FX_DWORD)perms.GetLength()) {
- copy_len = perms.GetLength();
- }
- FXSYS_memcpy32(perms_buf, (FX_LPCBYTE)perms, copy_len);
- FX_BYTE buf[16];
- CRYPT_AESDecrypt(aes, buf, perms_buf, 16);
- FX_Free(aes);
- if (buf[9] != 'a' || buf[10] != 'd' || buf[11] != 'b') {
- return FALSE;
- }
- if (FXDWORD_GET_LSBFIRST(buf) != m_Permissions) {
- return FALSE;
- }
- if ((buf[8] == 'T' && !IsMetadataEncrypted()) || (buf[8] == 'F' && IsMetadataEncrypted())) {
- return FALSE;
- }
- return TRUE;
-}
-int CPDF_StandardSecurityHandler::CheckPassword(FX_LPCBYTE password, FX_DWORD pass_size, FX_BOOL bOwner, FX_LPBYTE key)
-{
- return CheckPassword(password, pass_size, bOwner, key, m_KeyLen);
-}
-int CPDF_StandardSecurityHandler::CheckPassword(FX_LPCBYTE password, FX_DWORD size, FX_BOOL bOwner, FX_LPBYTE key, FX_INT32 key_len)
-{
- if (m_Revision >= 5) {
- return AES256_CheckPassword(password, size, bOwner, key);
- }
- FX_BYTE keybuf[32];
- if (key == NULL) {
- key = keybuf;
- }
- if (bOwner) {
- return CheckOwnerPassword(password, size, key, key_len);
- }
- return CheckUserPassword(password, size, FALSE, key, key_len) || CheckUserPassword(password, size, TRUE, key, key_len);
-}
-FX_BOOL CPDF_StandardSecurityHandler::CheckUserPassword(FX_LPCBYTE password, FX_DWORD pass_size,
- FX_BOOL bIgnoreEncryptMeta, FX_LPBYTE key, FX_INT32 key_len)
-{
- CalcEncryptKey(m_pEncryptDict, password, pass_size, key, key_len, bIgnoreEncryptMeta,
- m_pParser->GetIDArray());
- CFX_ByteString ukey = m_pEncryptDict->GetString(FX_BSTRC("U"));
- if (ukey.GetLength() < 16) {
- return FALSE;
- }
- FX_BYTE ukeybuf[32];
- if (m_Revision == 2) {
- FXSYS_memcpy32(ukeybuf, defpasscode, 32);
- CRYPT_ArcFourCryptBlock(ukeybuf, 32, key, key_len);
- } else {
- FX_BYTE test[32], tmpkey[32];
- FX_DWORD copy_len = sizeof(test);
- if (copy_len > (FX_DWORD)ukey.GetLength()) {
- copy_len = ukey.GetLength();
- }
- FXSYS_memset32(test, 0, sizeof(test));
- FXSYS_memcpy32(test, (FX_LPCSTR)ukey, copy_len);
- for (int i = 19; i >= 0; i --) {
- for (int j = 0; j < key_len; j ++) {
- tmpkey[j] = key[j] ^ i;
- }
- CRYPT_ArcFourCryptBlock(test, 32, tmpkey, key_len);
- }
- FX_BYTE md5[100];
- CRYPT_MD5Start(md5);
- CRYPT_MD5Update(md5, defpasscode, 32);
- CPDF_Array* pIdArray = m_pParser->GetIDArray();
- if (pIdArray) {
- CFX_ByteString id = pIdArray->GetString(0);
- CRYPT_MD5Update(md5, (FX_LPBYTE)(FX_LPCSTR)id, id.GetLength());
- }
- CRYPT_MD5Finish(md5, ukeybuf);
- return FXSYS_memcmp32(test, ukeybuf, 16) == 0;
- }
- if (FXSYS_memcmp32((FX_LPVOID)(FX_LPCSTR)ukey, ukeybuf, 16) == 0) {
- return TRUE;
- }
- return FALSE;
-}
-CFX_ByteString CPDF_StandardSecurityHandler::GetUserPassword(FX_LPCBYTE owner_pass, FX_DWORD pass_size)
-{
- return GetUserPassword(owner_pass, pass_size, m_KeyLen);
-}
-CFX_ByteString CPDF_StandardSecurityHandler::GetUserPassword(FX_LPCBYTE owner_pass, FX_DWORD pass_size, FX_INT32 key_len)
-{
- CFX_ByteString okey = m_pEncryptDict->GetString(FX_BSTRC("O"));
- FX_BYTE passcode[32];
- FX_DWORD i;
- for (i = 0; i < 32; i ++) {
- passcode[i] = i < pass_size ? owner_pass[i] : defpasscode[i - pass_size];
- }
- FX_BYTE digest[16];
- CRYPT_MD5Generate(passcode, 32, digest);
- if (m_Revision >= 3) {
- for (int i = 0; i < 50; i ++) {
- CRYPT_MD5Generate(digest, 16, digest);
- }
- }
- FX_BYTE enckey[32];
- FXSYS_memset32(enckey, 0, sizeof(enckey));
- FX_DWORD copy_len = key_len;
- if (copy_len > sizeof(digest)) {
- copy_len = sizeof(digest);
- }
- FXSYS_memcpy32(enckey, digest, copy_len);
- int okeylen = okey.GetLength();
- if (okeylen > 32) {
- okeylen = 32;
- }
- FX_BYTE okeybuf[64];
- FXSYS_memcpy32(okeybuf, (FX_LPCSTR)okey, okeylen);
- if (m_Revision == 2) {
- CRYPT_ArcFourCryptBlock(okeybuf, okeylen, enckey, key_len);
- } else {
- for (int i = 19; i >= 0; i --) {
- FX_BYTE tempkey[32];
- for (int j = 0; j < m_KeyLen; j ++) {
- tempkey[j] = enckey[j] ^ i;
- }
- CRYPT_ArcFourCryptBlock(okeybuf, okeylen, tempkey, key_len);
- }
- }
- int len = 32;
- while (len && defpasscode[len - 1] == okeybuf[len - 1]) {
- len --;
- }
- return CFX_ByteString(okeybuf, len);
-}
-FX_BOOL CPDF_StandardSecurityHandler::CheckOwnerPassword(FX_LPCBYTE password, FX_DWORD pass_size,
- FX_LPBYTE key, FX_INT32 key_len)
-{
- CFX_ByteString user_pass = GetUserPassword(password, pass_size, key_len);
- if (CheckUserPassword(user_pass, user_pass.GetLength(), FALSE, key, key_len)) {
- return TRUE;
- }
- return CheckUserPassword(user_pass, user_pass.GetLength(), TRUE, key, key_len);
-}
-FX_BOOL CPDF_StandardSecurityHandler::IsMetadataEncrypted()
-{
- return m_pEncryptDict->GetBoolean(FX_BSTRC("EncryptMetadata"), TRUE);
-}
-CPDF_SecurityHandler* FPDF_CreateStandardSecurityHandler()
-{
- return FX_NEW CPDF_StandardSecurityHandler;
-}
-void CPDF_StandardSecurityHandler::OnCreate(CPDF_Dictionary* pEncryptDict, CPDF_Array* pIdArray,
- FX_LPCBYTE user_pass, FX_DWORD user_size,
- FX_LPCBYTE owner_pass, FX_DWORD owner_size, FX_BOOL bDefault, FX_DWORD type)
-{
- int cipher = 0, key_len = 0;
- if (!LoadDict(pEncryptDict, type, cipher, key_len)) {
- return;
- }
- if (bDefault && (owner_pass == NULL || owner_size == 0)) {
- owner_pass = user_pass;
- owner_size = user_size;
- }
- if (m_Revision >= 5) {
- int t = (int)time(NULL);
- FX_BYTE sha[128];
- CRYPT_SHA256Start(sha);
- CRYPT_SHA256Update(sha, (FX_BYTE*)&t, sizeof t);
- CRYPT_SHA256Update(sha, m_EncryptKey, 32);
- CRYPT_SHA256Update(sha, (FX_BYTE*)"there", 5);
- CRYPT_SHA256Finish(sha, m_EncryptKey);
- AES256_SetPassword(pEncryptDict, user_pass, user_size, FALSE, m_EncryptKey);
- if (bDefault) {
- AES256_SetPassword(pEncryptDict, owner_pass, owner_size, TRUE, m_EncryptKey);
- AES256_SetPerms(pEncryptDict, m_Permissions, pEncryptDict->GetBoolean(FX_BSTRC("EncryptMetadata"), TRUE), m_EncryptKey);
- }
- return;
- }
- if (bDefault) {
- FX_BYTE passcode[32];
- FX_DWORD i;
- for (i = 0; i < 32; i ++) {
- passcode[i] = i < owner_size ? owner_pass[i] : defpasscode[i - owner_size];
- }
- FX_BYTE digest[16];
- CRYPT_MD5Generate(passcode, 32, digest);
- if (m_Revision >= 3) {
- for (int i = 0; i < 50; i ++) {
- CRYPT_MD5Generate(digest, 16, digest);
- }
- }
- FX_BYTE enckey[32];
- FXSYS_memcpy32(enckey, digest, key_len);
- for (i = 0; i < 32; i ++) {
- passcode[i] = i < user_size ? user_pass[i] : defpasscode[i - user_size];
- }
- CRYPT_ArcFourCryptBlock(passcode, 32, enckey, key_len);
- FX_BYTE tempkey[32];
- if (m_Revision >= 3) {
- for (i = 1; i <= 19; i ++) {
- for (int j = 0; j < key_len; j ++) {
- tempkey[j] = enckey[j] ^ (FX_BYTE)i;
- }
- CRYPT_ArcFourCryptBlock(passcode, 32, tempkey, key_len);
- }
- }
- pEncryptDict->SetAtString(FX_BSTRC("O"), CFX_ByteString(passcode, 32));
- }
- CalcEncryptKey(m_pEncryptDict, (FX_LPBYTE)user_pass, user_size, m_EncryptKey, key_len, FALSE, pIdArray);
- if (m_Revision < 3) {
- FX_BYTE tempbuf[32];
- FXSYS_memcpy32(tempbuf, defpasscode, 32);
- CRYPT_ArcFourCryptBlock(tempbuf, 32, m_EncryptKey, key_len);
- pEncryptDict->SetAtString(FX_BSTRC("U"), CFX_ByteString(tempbuf, 32));
- } else {
- FX_BYTE md5[100];
- CRYPT_MD5Start(md5);
- CRYPT_MD5Update(md5, defpasscode, 32);
- if (pIdArray) {
- CFX_ByteString id = pIdArray->GetString(0);
- CRYPT_MD5Update(md5, (FX_LPBYTE)(FX_LPCSTR)id, id.GetLength());
- }
- FX_BYTE digest[32];
- CRYPT_MD5Finish(md5, digest);
- CRYPT_ArcFourCryptBlock(digest, 16, m_EncryptKey, key_len);
- FX_BYTE tempkey[32];
- for (int i = 1; i <= 19; i ++) {
- for (int j = 0; j < key_len; j ++) {
- tempkey[j] = m_EncryptKey[j] ^ (FX_BYTE)i;
- }
- CRYPT_ArcFourCryptBlock(digest, 16, tempkey, key_len);
- }
- CRYPT_MD5Generate(digest, 16, digest + 16);
- pEncryptDict->SetAtString(FX_BSTRC("U"), CFX_ByteString(digest, 32));
- }
-}
-void CPDF_StandardSecurityHandler::OnCreate(CPDF_Dictionary* pEncryptDict, CPDF_Array* pIdArray,
- FX_LPCBYTE user_pass, FX_DWORD user_size,
- FX_LPCBYTE owner_pass, FX_DWORD owner_size, FX_DWORD type)
-{
- OnCreate(pEncryptDict, pIdArray, user_pass, user_size, owner_pass, owner_size, TRUE, type);
-}
-void CPDF_StandardSecurityHandler::OnCreate(CPDF_Dictionary* pEncryptDict, CPDF_Array* pIdArray, FX_LPCBYTE user_pass, FX_DWORD user_size, FX_DWORD type)
-{
- OnCreate(pEncryptDict, pIdArray, user_pass, user_size, NULL, 0, FALSE, type);
-}
-void CPDF_StandardSecurityHandler::AES256_SetPassword(CPDF_Dictionary* pEncryptDict, FX_LPCBYTE password, FX_DWORD size, FX_BOOL bOwner, FX_LPCBYTE key)
-{
- FX_BYTE sha[128];
- CRYPT_SHA1Start(sha);
- CRYPT_SHA1Update(sha, key, 32);
- CRYPT_SHA1Update(sha, (FX_BYTE*)"hello", 5);
- FX_BYTE digest[20];
- CRYPT_SHA1Finish(sha, digest);
- CFX_ByteString ukey = pEncryptDict->GetString(FX_BSTRC("U"));
- FX_BYTE digest1[48];
- if (m_Revision >= 6) {
- Revision6_Hash(password, size, digest, (bOwner ? (FX_LPCBYTE)ukey : NULL), digest1);
- } else {
- CRYPT_SHA256Start(sha);
- CRYPT_SHA256Update(sha, password, size);
- CRYPT_SHA256Update(sha, digest, 8);
- if (bOwner) {
- CRYPT_SHA256Update(sha, ukey, ukey.GetLength());
- }
- CRYPT_SHA256Finish(sha, digest1);
- }
- FXSYS_memcpy32(digest1 + 32, digest, 16);
- pEncryptDict->SetAtString(bOwner ? FX_BSTRC("O") : FX_BSTRC("U"), CFX_ByteString(digest1, 48));
- if (m_Revision >= 6) {
- Revision6_Hash(password, size, digest + 8, (bOwner ? (FX_LPCBYTE)ukey : NULL), digest1);
- } else {
- CRYPT_SHA256Start(sha);
- CRYPT_SHA256Update(sha, password, size);
- CRYPT_SHA256Update(sha, digest + 8, 8);
- if (bOwner) {
- CRYPT_SHA256Update(sha, ukey, ukey.GetLength());
- }
- CRYPT_SHA256Finish(sha, digest1);
- }
- FX_BYTE* aes = FX_Alloc(FX_BYTE, 2048);
- CRYPT_AESSetKey(aes, 16, digest1, 32, TRUE);
- FX_BYTE iv[16];
- FXSYS_memset32(iv, 0, 16);
- CRYPT_AESSetIV(aes, iv);
- CRYPT_AESEncrypt(aes, digest1, key, 32);
- FX_Free(aes);
- pEncryptDict->SetAtString(bOwner ? FX_BSTRC("OE") : FX_BSTRC("UE"), CFX_ByteString(digest1, 32));
-}
-void CPDF_StandardSecurityHandler::AES256_SetPerms(CPDF_Dictionary* pEncryptDict, FX_DWORD permissions,
- FX_BOOL bEncryptMetadata, FX_LPCBYTE key)
-{
- FX_BYTE buf[16];
- buf[0] = (FX_BYTE)permissions;
- buf[1] = (FX_BYTE)(permissions >> 8);
- buf[2] = (FX_BYTE)(permissions >> 16);
- buf[3] = (FX_BYTE)(permissions >> 24);
- buf[4] = 0xff;
- buf[5] = 0xff;
- buf[6] = 0xff;
- buf[7] = 0xff;
- buf[8] = bEncryptMetadata ? 'T' : 'F';
- buf[9] = 'a';
- buf[10] = 'd';
- buf[11] = 'b';
- FX_BYTE* aes = FX_Alloc(FX_BYTE, 2048);
- CRYPT_AESSetKey(aes, 16, key, 32, TRUE);
- FX_BYTE iv[16], buf1[16];
- FXSYS_memset32(iv, 0, 16);
- CRYPT_AESSetIV(aes, iv);
- CRYPT_AESEncrypt(aes, buf1, buf, 16);
- FX_Free(aes);
- pEncryptDict->SetAtString(FX_BSTRC("Perms"), CFX_ByteString(buf1, 16));
-}
-void CPDF_StandardCryptoHandler::CryptBlock(FX_BOOL bEncrypt, FX_DWORD objnum, FX_DWORD gennum, FX_LPCBYTE src_buf, FX_DWORD src_size,
- FX_LPBYTE dest_buf, FX_DWORD& dest_size)
-{
- if (m_Cipher == FXCIPHER_NONE) {
- FXSYS_memcpy32(dest_buf, src_buf, src_size);
- return;
- }
- FX_BYTE realkey[16];
- int realkeylen = 16;
- if (m_Cipher != FXCIPHER_AES || m_KeyLen != 32) {
- FX_BYTE key1[32];
- FXSYS_memcpy32(key1, m_EncryptKey, m_KeyLen);
- key1[m_KeyLen + 0] = (FX_BYTE)objnum;
- key1[m_KeyLen + 1] = (FX_BYTE)(objnum >> 8);
- key1[m_KeyLen + 2] = (FX_BYTE)(objnum >> 16);
- key1[m_KeyLen + 3] = (FX_BYTE)gennum;
- key1[m_KeyLen + 4] = (FX_BYTE)(gennum >> 8);
- FXSYS_memcpy32(key1 + m_KeyLen, &objnum, 3);
- FXSYS_memcpy32(key1 + m_KeyLen + 3, &gennum, 2);
- if (m_Cipher == FXCIPHER_AES) {
- FXSYS_memcpy32(key1 + m_KeyLen + 5, "sAlT", 4);
- }
- CRYPT_MD5Generate(key1, m_Cipher == FXCIPHER_AES ? m_KeyLen + 9 : m_KeyLen + 5, realkey);
- realkeylen = m_KeyLen + 5;
- if (realkeylen > 16) {
- realkeylen = 16;
- }
- }
- if (m_Cipher == FXCIPHER_AES) {
- CRYPT_AESSetKey(m_pAESContext, 16, m_KeyLen == 32 ? m_EncryptKey : realkey, m_KeyLen, bEncrypt);
- if (bEncrypt) {
- FX_BYTE iv[16];
- for (int i = 0; i < 16; i ++) {
- iv[i] = (FX_BYTE)rand();
- }
- CRYPT_AESSetIV(m_pAESContext, iv);
- FXSYS_memcpy32(dest_buf, iv, 16);
- int nblocks = src_size / 16;
- CRYPT_AESEncrypt(m_pAESContext, dest_buf + 16, src_buf, nblocks * 16);
- FX_BYTE padding[16];
- FXSYS_memcpy32(padding, src_buf + nblocks * 16, src_size % 16);
- FXSYS_memset8(padding + src_size % 16, 16 - src_size % 16, 16 - src_size % 16);
- CRYPT_AESEncrypt(m_pAESContext, dest_buf + nblocks * 16 + 16, padding, 16);
- dest_size = 32 + nblocks * 16;
- } else {
- CRYPT_AESSetIV(m_pAESContext, src_buf);
- CRYPT_AESDecrypt(m_pAESContext, dest_buf, src_buf + 16, src_size - 16);
- dest_size = src_size - 16;
- dest_size -= dest_buf[dest_size - 1];
- }
- } else {
- ASSERT(dest_size == src_size);
- if (dest_buf != src_buf) {
- FXSYS_memcpy32(dest_buf, src_buf, src_size);
- }
- CRYPT_ArcFourCryptBlock(dest_buf, dest_size, realkey, realkeylen);
- }
-}
-typedef struct _AESCryptContext {
- FX_BYTE m_Context[2048];
- FX_BOOL m_bIV;
- FX_BYTE m_Block[16];
- FX_DWORD m_BlockOffset;
-} AESCryptContext;
-FX_LPVOID CPDF_StandardCryptoHandler::CryptStart(FX_DWORD objnum, FX_DWORD gennum, FX_BOOL bEncrypt)
-{
- if (m_Cipher == FXCIPHER_NONE) {
- return this;
- }
- if (m_Cipher == FXCIPHER_AES && m_KeyLen == 32) {
- AESCryptContext* pContext = FX_Alloc(AESCryptContext, 1);
- pContext->m_bIV = TRUE;
- pContext->m_BlockOffset = 0;
- CRYPT_AESSetKey(pContext->m_Context, 16, m_EncryptKey, 32, bEncrypt);
- if (bEncrypt) {
- for (int i = 0; i < 16; i ++) {
- pContext->m_Block[i] = (FX_BYTE)rand();
- }
- CRYPT_AESSetIV(pContext->m_Context, pContext->m_Block);
- }
- return pContext;
- }
- FX_BYTE key1[48];
- FXSYS_memcpy32(key1, m_EncryptKey, m_KeyLen);
- FXSYS_memcpy32(key1 + m_KeyLen, &objnum, 3);
- FXSYS_memcpy32(key1 + m_KeyLen + 3, &gennum, 2);
- if (m_Cipher == FXCIPHER_AES) {
- FXSYS_memcpy32(key1 + m_KeyLen + 5, "sAlT", 4);
- }
- FX_BYTE realkey[16];
- CRYPT_MD5Generate(key1, m_Cipher == FXCIPHER_AES ? m_KeyLen + 9 : m_KeyLen + 5, realkey);
- int realkeylen = m_KeyLen + 5;
- if (realkeylen > 16) {
- realkeylen = 16;
- }
- if (m_Cipher == FXCIPHER_AES) {
- AESCryptContext* pContext = FX_Alloc(AESCryptContext, 1);
- pContext->m_bIV = TRUE;
- pContext->m_BlockOffset = 0;
- CRYPT_AESSetKey(pContext->m_Context, 16, realkey, 16, bEncrypt);
- if (bEncrypt) {
- for (int i = 0; i < 16; i ++) {
- pContext->m_Block[i] = (FX_BYTE)rand();
- }
- CRYPT_AESSetIV(pContext->m_Context, pContext->m_Block);
- }
- return pContext;
- }
- void* pContext = FX_Alloc(FX_BYTE, 1040);
- CRYPT_ArcFourSetup(pContext, realkey, realkeylen);
- return pContext;
-}
-FX_BOOL CPDF_StandardCryptoHandler::CryptStream(FX_LPVOID context, FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf, FX_BOOL bEncrypt)
-{
- if (!context) {
- return FALSE;
- }
- if (m_Cipher == FXCIPHER_NONE) {
- dest_buf.AppendBlock(src_buf, src_size);
- return TRUE;
- }
- if (m_Cipher == FXCIPHER_RC4) {
- int old_size = dest_buf.GetSize();
- dest_buf.AppendBlock(src_buf, src_size);
- CRYPT_ArcFourCrypt(context, dest_buf.GetBuffer() + old_size, src_size);
- return TRUE;
- }
- AESCryptContext* pContext = (AESCryptContext*)context;
- if (pContext->m_bIV && bEncrypt) {
- dest_buf.AppendBlock(pContext->m_Block, 16);
- pContext->m_bIV = FALSE;
- }
- FX_DWORD src_off = 0;
- FX_DWORD src_left = src_size;
- while (1) {
- FX_DWORD copy_size = 16 - pContext->m_BlockOffset;
- if (copy_size > src_left) {
- copy_size = src_left;
- }
- FXSYS_memcpy32(pContext->m_Block + pContext->m_BlockOffset, src_buf + src_off, copy_size);
- src_off += copy_size;
- src_left -= copy_size;
- pContext->m_BlockOffset += copy_size;
- if (pContext->m_BlockOffset == 16) {
- if (!bEncrypt && pContext->m_bIV) {
- CRYPT_AESSetIV(pContext->m_Context, pContext->m_Block);
- pContext->m_bIV = FALSE;
- pContext->m_BlockOffset = 0;
- } else if (src_off < src_size) {
- FX_BYTE block_buf[16];
- if (bEncrypt) {
- CRYPT_AESEncrypt(pContext->m_Context, block_buf, pContext->m_Block, 16);
- } else {
- CRYPT_AESDecrypt(pContext->m_Context, block_buf, pContext->m_Block, 16);
- }
- dest_buf.AppendBlock(block_buf, 16);
- pContext->m_BlockOffset = 0;
- }
- }
- if (!src_left) {
- break;
- }
- }
- return TRUE;
-}
-FX_BOOL CPDF_StandardCryptoHandler::CryptFinish(FX_LPVOID context, CFX_BinaryBuf& dest_buf, FX_BOOL bEncrypt)
-{
- if (!context) {
- return FALSE;
- }
- if (m_Cipher == FXCIPHER_NONE) {
- return TRUE;
- }
- if (m_Cipher == FXCIPHER_RC4) {
- FX_Free(context);
- return TRUE;
- }
- AESCryptContext* pContext = (AESCryptContext*)context;
- if (bEncrypt) {
- FX_BYTE block_buf[16];
- if (pContext->m_BlockOffset == 16) {
- CRYPT_AESEncrypt(pContext->m_Context, block_buf, pContext->m_Block, 16);
- dest_buf.AppendBlock(block_buf, 16);
- pContext->m_BlockOffset = 0;
- }
- FXSYS_memset8(pContext->m_Block + pContext->m_BlockOffset, (FX_BYTE)(16 - pContext->m_BlockOffset), 16 - pContext->m_BlockOffset);
- CRYPT_AESEncrypt(pContext->m_Context, block_buf, pContext->m_Block, 16);
- dest_buf.AppendBlock(block_buf, 16);
- } else if (pContext->m_BlockOffset == 16) {
- FX_BYTE block_buf[16];
- CRYPT_AESDecrypt(pContext->m_Context, block_buf, pContext->m_Block, 16);
- if (block_buf[15] <= 16) {
- dest_buf.AppendBlock(block_buf, 16 - block_buf[15]);
- }
- }
- FX_Free(pContext);
- return TRUE;
-}
-FX_LPVOID CPDF_StandardCryptoHandler::DecryptStart(FX_DWORD objnum, FX_DWORD gennum)
-{
- return CryptStart(objnum, gennum, FALSE);
-}
-FX_DWORD CPDF_StandardCryptoHandler::DecryptGetSize(FX_DWORD src_size)
-{
- return m_Cipher == FXCIPHER_AES ? src_size - 16 : src_size;
-}
-FX_BOOL CPDF_StandardCryptoHandler::Init(CPDF_Dictionary* pEncryptDict, CPDF_SecurityHandler* pSecurityHandler)
-{
- FX_LPCBYTE key;
- if (!pSecurityHandler->GetCryptInfo(m_Cipher, key, m_KeyLen)) {
- return FALSE;
- }
- if (m_KeyLen > 32 || m_KeyLen < 0) {
- return FALSE;
- }
- if (m_Cipher != FXCIPHER_NONE) {
- FXSYS_memcpy32(m_EncryptKey, key, m_KeyLen);
- }
- if (m_Cipher == FXCIPHER_AES) {
- m_pAESContext = FX_Alloc(FX_BYTE, 2048);
- }
- return TRUE;
-}
-FX_BOOL CPDF_StandardCryptoHandler::Init(int cipher, FX_LPCBYTE key, int keylen)
-{
- if (cipher == FXCIPHER_AES) {
- switch(keylen) {
- case 16:
- case 24:
- case 32:
- break;
- default:
- return FALSE;
- }
- } else if (cipher == FXCIPHER_AES2) {
- if (keylen != 32) {
- return FALSE;
- }
- } else if (cipher == FXCIPHER_RC4) {
- if (keylen < 5 || keylen > 16) {
- return FALSE;
- }
- } else {
- if (keylen > 32) {
- keylen = 32;
- }
- }
- m_Cipher = cipher;
- m_KeyLen = keylen;
- FXSYS_memcpy32(m_EncryptKey, key, keylen);
- if (m_Cipher == FXCIPHER_AES) {
- m_pAESContext = FX_Alloc(FX_BYTE, 2048);
- }
- return TRUE;
-}
-FX_BOOL CPDF_StandardCryptoHandler::DecryptStream(FX_LPVOID context, FX_LPCBYTE src_buf, FX_DWORD src_size,
- CFX_BinaryBuf& dest_buf)
-{
- return CryptStream(context, src_buf, src_size, dest_buf, FALSE);
-}
-FX_BOOL CPDF_StandardCryptoHandler::DecryptFinish(FX_LPVOID context, CFX_BinaryBuf& dest_buf)
-{
- return CryptFinish(context, dest_buf, FALSE);
-}
-FX_DWORD CPDF_StandardCryptoHandler::EncryptGetSize(FX_DWORD objnum, FX_DWORD version, FX_LPCBYTE src_buf, FX_DWORD src_size)
-{
- if (m_Cipher == FXCIPHER_AES) {
- return src_size + 32;
- }
- return src_size;
-}
-FX_BOOL CPDF_StandardCryptoHandler::EncryptContent(FX_DWORD objnum, FX_DWORD gennum, FX_LPCBYTE src_buf, FX_DWORD src_size,
- FX_LPBYTE dest_buf, FX_DWORD& dest_size)
-{
- CryptBlock(TRUE, objnum, gennum, src_buf, src_size, dest_buf, dest_size);
- return TRUE;
-}
-void CPDF_CryptoHandler::Decrypt(FX_DWORD objnum, FX_DWORD gennum, CFX_ByteString& str)
-{
- CFX_BinaryBuf dest_buf;
- FX_LPVOID context = DecryptStart(objnum, gennum);
- DecryptStream(context, (FX_LPCBYTE)str, str.GetLength(), dest_buf);
- DecryptFinish(context, dest_buf);
- str = dest_buf;
-}
-CPDF_StandardCryptoHandler::CPDF_StandardCryptoHandler()
-{
- m_pAESContext = NULL;
- m_Cipher = FXCIPHER_NONE;
- m_KeyLen = 0;
-}
-CPDF_StandardCryptoHandler::~CPDF_StandardCryptoHandler()
-{
- if (m_pAESContext) {
- FX_Free(m_pAESContext);
- }
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include <time.h>
+#include "../../../include/fpdfapi/fpdf_parser.h"
+#include "../../../include/fdrm/fx_crypt.h"
+const FX_BYTE defpasscode[32] = {
+ 0x28, 0xbf, 0x4e, 0x5e, 0x4e, 0x75, 0x8a, 0x41,
+ 0x64, 0x00, 0x4e, 0x56, 0xff, 0xfa, 0x01, 0x08,
+ 0x2e, 0x2e, 0x00, 0xb6, 0xd0, 0x68, 0x3e, 0x80,
+ 0x2f, 0x0c, 0xa9, 0xfe, 0x64, 0x53, 0x69, 0x7a
+};
+void CalcEncryptKey(CPDF_Dictionary* pEncrypt, FX_LPCBYTE password, FX_DWORD pass_size,
+ FX_LPBYTE key, int keylen, FX_BOOL bIgnoreMeta, CPDF_Array* pIdArray)
+{
+ int revision = pEncrypt->GetInteger(FX_BSTRC("R"));
+ FX_BYTE passcode[32];
+ for (FX_DWORD i = 0; i < 32; i ++) {
+ passcode[i] = i < pass_size ? password[i] : defpasscode[i - pass_size];
+ }
+ FX_BYTE md5[100];
+ CRYPT_MD5Start(md5);
+ CRYPT_MD5Update(md5, passcode, 32);
+ CFX_ByteString okey = pEncrypt->GetString(FX_BSTRC("O"));
+ CRYPT_MD5Update(md5, (FX_LPBYTE)(FX_LPCSTR)okey, okey.GetLength());
+ FX_DWORD perm = pEncrypt->GetInteger(FX_BSTRC("P"));
+ CRYPT_MD5Update(md5, (FX_LPBYTE)&perm, 4);
+ if (pIdArray) {
+ CFX_ByteString id = pIdArray->GetString(0);
+ CRYPT_MD5Update(md5, (FX_LPBYTE)(FX_LPCSTR)id, id.GetLength());
+ }
+ if (!bIgnoreMeta && revision >= 3 && !pEncrypt->GetInteger(FX_BSTRC("EncryptMetadata"), 1)) {
+ FX_DWORD tag = (FX_DWORD) - 1;
+ CRYPT_MD5Update(md5, (FX_LPBYTE)&tag, 4);
+ }
+ FX_BYTE digest[16];
+ CRYPT_MD5Finish(md5, digest);
+ FX_DWORD copy_len = keylen;
+ if (copy_len > sizeof(digest)) {
+ copy_len = sizeof(digest);
+ }
+ if (revision >= 3) {
+ for (int i = 0; i < 50; i ++) {
+ CRYPT_MD5Generate(digest, copy_len, digest);
+ }
+ }
+ FXSYS_memset32(key, 0, keylen);
+ FXSYS_memcpy32(key, digest, copy_len);
+}
+CPDF_CryptoHandler* CPDF_StandardSecurityHandler::CreateCryptoHandler()
+{
+ return FX_NEW CPDF_StandardCryptoHandler;
+}
+typedef struct _PDF_CRYPTOITEM : public CFX_Object {
+ FX_INT32 m_Cipher;
+ FX_INT32 m_KeyLen;
+ FX_BOOL m_bChecked;
+ CPDF_StandardCryptoHandler* m_pCryptoHandler;
+} PDF_CRYPTOITEM;
+CPDF_StandardSecurityHandler::CPDF_StandardSecurityHandler()
+{
+ m_Version = 0;
+ m_Revision = 0;
+ m_pParser = NULL;
+ m_pEncryptDict = NULL;
+ m_bOwner = FALSE;
+ m_Permissions = 0;
+ m_Cipher = FXCIPHER_NONE;
+ m_KeyLen = 0;
+}
+CPDF_StandardSecurityHandler::~CPDF_StandardSecurityHandler()
+{
+}
+FX_BOOL CPDF_StandardSecurityHandler::OnInit(CPDF_Parser* pParser, CPDF_Dictionary* pEncryptDict)
+{
+ m_pParser = pParser;
+ if (!LoadDict(pEncryptDict)) {
+ return FALSE;
+ }
+ if (m_Cipher == FXCIPHER_NONE) {
+ return TRUE;
+ }
+ return CheckSecurity(m_KeyLen);
+}
+FX_BOOL CPDF_StandardSecurityHandler::CheckSecurity(FX_INT32 key_len)
+{
+ CFX_ByteString password = m_pParser->GetPassword();
+ if (CheckPassword(password, password.GetLength(), TRUE, m_EncryptKey, key_len)) {
+ if (password.IsEmpty()) {
+ if (!CheckPassword(password, password.GetLength(), FALSE, m_EncryptKey, key_len)) {
+ return FALSE;
+ }
+ }
+ m_bOwner = TRUE;
+ return TRUE;
+ }
+ return CheckPassword(password, password.GetLength(), FALSE, m_EncryptKey, key_len);
+}
+FX_DWORD CPDF_StandardSecurityHandler::GetPermissions()
+{
+ return m_Permissions;
+}
+static FX_BOOL _LoadCryptInfo(CPDF_Dictionary* pEncryptDict, FX_BSTR name, int& cipher, int& keylen)
+{
+ int Version = pEncryptDict->GetInteger(FX_BSTRC("V"));
+ int Revision = pEncryptDict->GetInteger(FX_BSTRC("R"));
+ cipher = FXCIPHER_RC4;
+ keylen = 0;
+ if (Version >= 4) {
+ CPDF_Dictionary* pCryptFilters = pEncryptDict->GetDict(FX_BSTRC("CF"));
+ if (pCryptFilters == NULL) {
+ return FALSE;
+ }
+ if (name == FX_BSTRC("Identity")) {
+ cipher = FXCIPHER_NONE;
+ } else {
+ CPDF_Dictionary* pDefFilter = pCryptFilters->GetDict(name);
+ if (pDefFilter == NULL) {
+ return FALSE;
+ }
+ int nKeyBits = 0;
+ if (Version == 4) {
+ nKeyBits = pDefFilter->GetInteger(FX_BSTRC("Length"), 0);
+ if (nKeyBits == 0) {
+ nKeyBits = pEncryptDict->GetInteger(FX_BSTRC("Length"), 128);
+ }
+ } else {
+ nKeyBits = pEncryptDict->GetInteger(FX_BSTRC("Length"), 256);
+ }
+ if (nKeyBits < 40) {
+ nKeyBits *= 8;
+ }
+ keylen = nKeyBits / 8;
+ CFX_ByteString cipher_name = pDefFilter->GetString(FX_BSTRC("CFM"));
+ if (cipher_name == FX_BSTRC("AESV2") || cipher_name == FX_BSTRC("AESV3")) {
+ cipher = FXCIPHER_AES;
+ }
+ }
+ } else {
+ keylen = Version > 1 ? pEncryptDict->GetInteger(FX_BSTRC("Length"), 40) / 8 : 5;
+ }
+ if (keylen > 32 || keylen < 0) {
+ return FALSE;
+ }
+ return TRUE;
+}
+FX_BOOL CPDF_StandardSecurityHandler::LoadDict(CPDF_Dictionary* pEncryptDict)
+{
+ m_pEncryptDict = pEncryptDict;
+ m_bOwner = FALSE;
+ m_Version = pEncryptDict->GetInteger(FX_BSTRC("V"));
+ m_Revision = pEncryptDict->GetInteger(FX_BSTRC("R"));
+ m_Permissions = pEncryptDict->GetInteger(FX_BSTRC("P"), -1);
+ if (m_Version < 4) {
+ return _LoadCryptInfo(pEncryptDict, CFX_ByteString(), m_Cipher, m_KeyLen);
+ }
+ CFX_ByteString stmf_name = pEncryptDict->GetString(FX_BSTRC("StmF"));
+ CFX_ByteString strf_name = pEncryptDict->GetString(FX_BSTRC("StrF"));
+ if (stmf_name != strf_name) {
+ return FALSE;
+ }
+ if (!_LoadCryptInfo(pEncryptDict, strf_name, m_Cipher, m_KeyLen)) {
+ return FALSE;
+ }
+ return TRUE;
+}
+FX_BOOL CPDF_StandardSecurityHandler::LoadDict(CPDF_Dictionary* pEncryptDict, FX_DWORD type, int& cipher, int& key_len)
+{
+ m_pEncryptDict = pEncryptDict;
+ m_bOwner = FALSE;
+ m_Version = pEncryptDict->GetInteger(FX_BSTRC("V"));
+ m_Revision = pEncryptDict->GetInteger(FX_BSTRC("R"));
+ m_Permissions = pEncryptDict->GetInteger(FX_BSTRC("P"), -1);
+ CFX_ByteString strf_name, stmf_name;
+ if (m_Version >= 4) {
+ stmf_name = pEncryptDict->GetString(FX_BSTRC("StmF"));
+ strf_name = pEncryptDict->GetString(FX_BSTRC("StrF"));
+ if (stmf_name != strf_name) {
+ return FALSE;
+ }
+ }
+ if (!_LoadCryptInfo(pEncryptDict, strf_name, cipher, key_len)) {
+ return FALSE;
+ }
+ m_Cipher = cipher;
+ m_KeyLen = key_len;
+ return TRUE;
+ return TRUE;
+}
+FX_BOOL CPDF_StandardSecurityHandler::GetCryptInfo(int& cipher, FX_LPCBYTE& buffer, int& keylen)
+{
+ cipher = m_Cipher;
+ buffer = m_EncryptKey;
+ keylen = m_KeyLen;
+ return TRUE;
+}
+#define FX_GET_32WORD(n,b,i) \
+ { \
+ (n) = (FX_DWORD)(( (FX_UINT64) (b)[(i)] << 24 ) \
+ | ( (FX_UINT64) (b)[(i) + 1] << 16 ) \
+ | ( (FX_UINT64) (b)[(i) + 2] << 8 ) \
+ | ( (FX_UINT64) (b)[(i) + 3] )); \
+ }
+int BigOrder64BitsMod3(FX_LPBYTE data)
+{
+ FX_UINT64 ret = 0;
+ for (int i = 0; i < 4; ++i) {
+ FX_DWORD value;
+ FX_GET_32WORD(value, data, 4 * i);
+ ret <<= 32;
+ ret |= value;
+ ret %= 3;
+ }
+ return (int)ret;
+}
+void Revision6_Hash(FX_LPCBYTE password, FX_DWORD size, FX_LPCBYTE salt, FX_LPCBYTE vector, FX_LPBYTE hash)
+{
+ int iBlockSize = 32;
+ FX_BYTE sha[128];
+ CRYPT_SHA256Start(sha);
+ CRYPT_SHA256Update(sha, password, size);
+ CRYPT_SHA256Update(sha, salt, 8);
+ if (vector) {
+ CRYPT_SHA256Update(sha, vector, 48);
+ }
+ FX_BYTE digest[32];
+ CRYPT_SHA256Finish(sha, digest);
+ CFX_ByteTextBuf buf;
+ FX_LPBYTE input = digest;
+ FX_LPBYTE key = input;
+ FX_LPBYTE iv = input + 16;
+ FX_LPBYTE E = buf.GetBuffer();
+ int iBufLen = buf.GetLength();
+ CFX_ByteTextBuf interDigest;
+ int i = 0;
+ FX_LPBYTE aes = FX_Alloc(FX_BYTE, 2048);
+ while (i < 64 || i < E[iBufLen - 1] + 32) {
+ int iRoundSize = size + iBlockSize;
+ if (vector) {
+ iRoundSize += 48;
+ }
+ iBufLen = iRoundSize * 64;
+ buf.EstimateSize(iBufLen);
+ E = buf.GetBuffer();
+ CFX_ByteTextBuf content;
+ for (int j = 0; j < 64; ++j) {
+ content.AppendBlock(password, size);
+ content.AppendBlock(input, iBlockSize);
+ if (vector) {
+ content.AppendBlock(vector, 48);
+ }
+ }
+ CRYPT_AESSetKey(aes, 16, key, 16, TRUE);
+ CRYPT_AESSetIV(aes, iv);
+ CRYPT_AESEncrypt(aes, E, content.GetBuffer(), iBufLen);
+ int iHash = 0;
+ switch (BigOrder64BitsMod3(E)) {
+ case 0:
+ iHash = 0;
+ iBlockSize = 32;
+ break;
+ case 1:
+ iHash = 1;
+ iBlockSize = 48;
+ break;
+ default:
+ iHash = 2;
+ iBlockSize = 64;
+ break;
+ }
+ interDigest.EstimateSize(iBlockSize);
+ input = interDigest.GetBuffer();
+ if (iHash == 0) {
+ CRYPT_SHA256Generate(E, iBufLen, input);
+ } else if (iHash == 1) {
+ CRYPT_SHA384Generate(E, iBufLen, input);
+ } else if (iHash == 2) {
+ CRYPT_SHA512Generate(E, iBufLen, input);
+ }
+ key = input;
+ iv = input + 16;
+ ++i;
+ }
+ FX_Free(aes);
+ if (hash) {
+ FXSYS_memcpy32(hash, input, 32);
+ }
+}
+FX_BOOL CPDF_StandardSecurityHandler::AES256_CheckPassword(FX_LPCBYTE password, FX_DWORD size,
+ FX_BOOL bOwner, FX_LPBYTE key)
+{
+ CFX_ByteString okey = m_pEncryptDict->GetString(FX_BSTRC("O"));
+ if (okey.GetLength() < 48) {
+ return FALSE;
+ }
+ CFX_ByteString ukey = m_pEncryptDict->GetString(FX_BSTRC("U"));
+ if (ukey.GetLength() < 48) {
+ return FALSE;
+ }
+ FX_LPCBYTE pkey = bOwner ? (FX_LPCBYTE)okey : (FX_LPCBYTE)ukey;
+ FX_BYTE sha[128];
+ FX_BYTE digest[32];
+ if (m_Revision >= 6) {
+ Revision6_Hash(password, size, (FX_LPCBYTE)pkey + 32, (bOwner ? (FX_LPCBYTE)ukey : NULL), digest);
+ } else {
+ CRYPT_SHA256Start(sha);
+ CRYPT_SHA256Update(sha, password, size);
+ CRYPT_SHA256Update(sha, pkey + 32, 8);
+ if (bOwner) {
+ CRYPT_SHA256Update(sha, ukey, 48);
+ }
+ CRYPT_SHA256Finish(sha, digest);
+ }
+ if (FXSYS_memcmp32(digest, pkey, 32) != 0) {
+ return FALSE;
+ }
+ if (key == NULL) {
+ return TRUE;
+ }
+ if (m_Revision >= 6) {
+ Revision6_Hash(password, size, (FX_LPCBYTE)pkey + 40, (bOwner ? (FX_LPCBYTE)ukey : NULL), digest);
+ } else {
+ CRYPT_SHA256Start(sha);
+ CRYPT_SHA256Update(sha, password, size);
+ CRYPT_SHA256Update(sha, pkey + 40, 8);
+ if (bOwner) {
+ CRYPT_SHA256Update(sha, ukey, 48);
+ }
+ CRYPT_SHA256Finish(sha, digest);
+ }
+ CFX_ByteString ekey = m_pEncryptDict->GetString(bOwner ? FX_BSTRC("OE") : FX_BSTRC("UE"));
+ if (ekey.GetLength() < 32) {
+ return FALSE;
+ }
+ FX_BYTE* aes = FX_Alloc(FX_BYTE, 2048);
+ CRYPT_AESSetKey(aes, 16, digest, 32, FALSE);
+ FX_BYTE iv[16];
+ FXSYS_memset32(iv, 0, 16);
+ CRYPT_AESSetIV(aes, iv);
+ CRYPT_AESDecrypt(aes, key, ekey, 32);
+ CRYPT_AESSetKey(aes, 16, key, 32, FALSE);
+ CRYPT_AESSetIV(aes, iv);
+ CFX_ByteString perms = m_pEncryptDict->GetString(FX_BSTRC("Perms"));
+ if (perms.IsEmpty()) {
+ return FALSE;
+ }
+ FX_BYTE perms_buf[16];
+ FXSYS_memset32(perms_buf, 0, sizeof(perms_buf));
+ FX_DWORD copy_len = sizeof(perms_buf);
+ if (copy_len > (FX_DWORD)perms.GetLength()) {
+ copy_len = perms.GetLength();
+ }
+ FXSYS_memcpy32(perms_buf, (FX_LPCBYTE)perms, copy_len);
+ FX_BYTE buf[16];
+ CRYPT_AESDecrypt(aes, buf, perms_buf, 16);
+ FX_Free(aes);
+ if (buf[9] != 'a' || buf[10] != 'd' || buf[11] != 'b') {
+ return FALSE;
+ }
+ if (FXDWORD_GET_LSBFIRST(buf) != m_Permissions) {
+ return FALSE;
+ }
+ if ((buf[8] == 'T' && !IsMetadataEncrypted()) || (buf[8] == 'F' && IsMetadataEncrypted())) {
+ return FALSE;
+ }
+ return TRUE;
+}
+int CPDF_StandardSecurityHandler::CheckPassword(FX_LPCBYTE password, FX_DWORD pass_size, FX_BOOL bOwner, FX_LPBYTE key)
+{
+ return CheckPassword(password, pass_size, bOwner, key, m_KeyLen);
+}
+int CPDF_StandardSecurityHandler::CheckPassword(FX_LPCBYTE password, FX_DWORD size, FX_BOOL bOwner, FX_LPBYTE key, FX_INT32 key_len)
+{
+ if (m_Revision >= 5) {
+ return AES256_CheckPassword(password, size, bOwner, key);
+ }
+ FX_BYTE keybuf[32];
+ if (key == NULL) {
+ key = keybuf;
+ }
+ if (bOwner) {
+ return CheckOwnerPassword(password, size, key, key_len);
+ }
+ return CheckUserPassword(password, size, FALSE, key, key_len) || CheckUserPassword(password, size, TRUE, key, key_len);
+}
+FX_BOOL CPDF_StandardSecurityHandler::CheckUserPassword(FX_LPCBYTE password, FX_DWORD pass_size,
+ FX_BOOL bIgnoreEncryptMeta, FX_LPBYTE key, FX_INT32 key_len)
+{
+ CalcEncryptKey(m_pEncryptDict, password, pass_size, key, key_len, bIgnoreEncryptMeta,
+ m_pParser->GetIDArray());
+ CFX_ByteString ukey = m_pEncryptDict->GetString(FX_BSTRC("U"));
+ if (ukey.GetLength() < 16) {
+ return FALSE;
+ }
+ FX_BYTE ukeybuf[32];
+ if (m_Revision == 2) {
+ FXSYS_memcpy32(ukeybuf, defpasscode, 32);
+ CRYPT_ArcFourCryptBlock(ukeybuf, 32, key, key_len);
+ } else {
+ FX_BYTE test[32], tmpkey[32];
+ FX_DWORD copy_len = sizeof(test);
+ if (copy_len > (FX_DWORD)ukey.GetLength()) {
+ copy_len = ukey.GetLength();
+ }
+ FXSYS_memset32(test, 0, sizeof(test));
+ FXSYS_memcpy32(test, (FX_LPCSTR)ukey, copy_len);
+ for (int i = 19; i >= 0; i --) {
+ for (int j = 0; j < key_len; j ++) {
+ tmpkey[j] = key[j] ^ i;
+ }
+ CRYPT_ArcFourCryptBlock(test, 32, tmpkey, key_len);
+ }
+ FX_BYTE md5[100];
+ CRYPT_MD5Start(md5);
+ CRYPT_MD5Update(md5, defpasscode, 32);
+ CPDF_Array* pIdArray = m_pParser->GetIDArray();
+ if (pIdArray) {
+ CFX_ByteString id = pIdArray->GetString(0);
+ CRYPT_MD5Update(md5, (FX_LPBYTE)(FX_LPCSTR)id, id.GetLength());
+ }
+ CRYPT_MD5Finish(md5, ukeybuf);
+ return FXSYS_memcmp32(test, ukeybuf, 16) == 0;
+ }
+ if (FXSYS_memcmp32((FX_LPVOID)(FX_LPCSTR)ukey, ukeybuf, 16) == 0) {
+ return TRUE;
+ }
+ return FALSE;
+}
+CFX_ByteString CPDF_StandardSecurityHandler::GetUserPassword(FX_LPCBYTE owner_pass, FX_DWORD pass_size)
+{
+ return GetUserPassword(owner_pass, pass_size, m_KeyLen);
+}
+CFX_ByteString CPDF_StandardSecurityHandler::GetUserPassword(FX_LPCBYTE owner_pass, FX_DWORD pass_size, FX_INT32 key_len)
+{
+ CFX_ByteString okey = m_pEncryptDict->GetString(FX_BSTRC("O"));
+ FX_BYTE passcode[32];
+ FX_DWORD i;
+ for (i = 0; i < 32; i ++) {
+ passcode[i] = i < pass_size ? owner_pass[i] : defpasscode[i - pass_size];
+ }
+ FX_BYTE digest[16];
+ CRYPT_MD5Generate(passcode, 32, digest);
+ if (m_Revision >= 3) {
+ for (int i = 0; i < 50; i ++) {
+ CRYPT_MD5Generate(digest, 16, digest);
+ }
+ }
+ FX_BYTE enckey[32];
+ FXSYS_memset32(enckey, 0, sizeof(enckey));
+ FX_DWORD copy_len = key_len;
+ if (copy_len > sizeof(digest)) {
+ copy_len = sizeof(digest);
+ }
+ FXSYS_memcpy32(enckey, digest, copy_len);
+ int okeylen = okey.GetLength();
+ if (okeylen > 32) {
+ okeylen = 32;
+ }
+ FX_BYTE okeybuf[64];
+ FXSYS_memcpy32(okeybuf, (FX_LPCSTR)okey, okeylen);
+ if (m_Revision == 2) {
+ CRYPT_ArcFourCryptBlock(okeybuf, okeylen, enckey, key_len);
+ } else {
+ for (int i = 19; i >= 0; i --) {
+ FX_BYTE tempkey[32];
+ for (int j = 0; j < m_KeyLen; j ++) {
+ tempkey[j] = enckey[j] ^ i;
+ }
+ CRYPT_ArcFourCryptBlock(okeybuf, okeylen, tempkey, key_len);
+ }
+ }
+ int len = 32;
+ while (len && defpasscode[len - 1] == okeybuf[len - 1]) {
+ len --;
+ }
+ return CFX_ByteString(okeybuf, len);
+}
+FX_BOOL CPDF_StandardSecurityHandler::CheckOwnerPassword(FX_LPCBYTE password, FX_DWORD pass_size,
+ FX_LPBYTE key, FX_INT32 key_len)
+{
+ CFX_ByteString user_pass = GetUserPassword(password, pass_size, key_len);
+ if (CheckUserPassword(user_pass, user_pass.GetLength(), FALSE, key, key_len)) {
+ return TRUE;
+ }
+ return CheckUserPassword(user_pass, user_pass.GetLength(), TRUE, key, key_len);
+}
+FX_BOOL CPDF_StandardSecurityHandler::IsMetadataEncrypted()
+{
+ return m_pEncryptDict->GetBoolean(FX_BSTRC("EncryptMetadata"), TRUE);
+}
+CPDF_SecurityHandler* FPDF_CreateStandardSecurityHandler()
+{
+ return FX_NEW CPDF_StandardSecurityHandler;
+}
+void CPDF_StandardSecurityHandler::OnCreate(CPDF_Dictionary* pEncryptDict, CPDF_Array* pIdArray,
+ FX_LPCBYTE user_pass, FX_DWORD user_size,
+ FX_LPCBYTE owner_pass, FX_DWORD owner_size, FX_BOOL bDefault, FX_DWORD type)
+{
+ int cipher = 0, key_len = 0;
+ if (!LoadDict(pEncryptDict, type, cipher, key_len)) {
+ return;
+ }
+ if (bDefault && (owner_pass == NULL || owner_size == 0)) {
+ owner_pass = user_pass;
+ owner_size = user_size;
+ }
+ if (m_Revision >= 5) {
+ int t = (int)time(NULL);
+ FX_BYTE sha[128];
+ CRYPT_SHA256Start(sha);
+ CRYPT_SHA256Update(sha, (FX_BYTE*)&t, sizeof t);
+ CRYPT_SHA256Update(sha, m_EncryptKey, 32);
+ CRYPT_SHA256Update(sha, (FX_BYTE*)"there", 5);
+ CRYPT_SHA256Finish(sha, m_EncryptKey);
+ AES256_SetPassword(pEncryptDict, user_pass, user_size, FALSE, m_EncryptKey);
+ if (bDefault) {
+ AES256_SetPassword(pEncryptDict, owner_pass, owner_size, TRUE, m_EncryptKey);
+ AES256_SetPerms(pEncryptDict, m_Permissions, pEncryptDict->GetBoolean(FX_BSTRC("EncryptMetadata"), TRUE), m_EncryptKey);
+ }
+ return;
+ }
+ if (bDefault) {
+ FX_BYTE passcode[32];
+ FX_DWORD i;
+ for (i = 0; i < 32; i ++) {
+ passcode[i] = i < owner_size ? owner_pass[i] : defpasscode[i - owner_size];
+ }
+ FX_BYTE digest[16];
+ CRYPT_MD5Generate(passcode, 32, digest);
+ if (m_Revision >= 3) {
+ for (int i = 0; i < 50; i ++) {
+ CRYPT_MD5Generate(digest, 16, digest);
+ }
+ }
+ FX_BYTE enckey[32];
+ FXSYS_memcpy32(enckey, digest, key_len);
+ for (i = 0; i < 32; i ++) {
+ passcode[i] = i < user_size ? user_pass[i] : defpasscode[i - user_size];
+ }
+ CRYPT_ArcFourCryptBlock(passcode, 32, enckey, key_len);
+ FX_BYTE tempkey[32];
+ if (m_Revision >= 3) {
+ for (i = 1; i <= 19; i ++) {
+ for (int j = 0; j < key_len; j ++) {
+ tempkey[j] = enckey[j] ^ (FX_BYTE)i;
+ }
+ CRYPT_ArcFourCryptBlock(passcode, 32, tempkey, key_len);
+ }
+ }
+ pEncryptDict->SetAtString(FX_BSTRC("O"), CFX_ByteString(passcode, 32));
+ }
+ CalcEncryptKey(m_pEncryptDict, (FX_LPBYTE)user_pass, user_size, m_EncryptKey, key_len, FALSE, pIdArray);
+ if (m_Revision < 3) {
+ FX_BYTE tempbuf[32];
+ FXSYS_memcpy32(tempbuf, defpasscode, 32);
+ CRYPT_ArcFourCryptBlock(tempbuf, 32, m_EncryptKey, key_len);
+ pEncryptDict->SetAtString(FX_BSTRC("U"), CFX_ByteString(tempbuf, 32));
+ } else {
+ FX_BYTE md5[100];
+ CRYPT_MD5Start(md5);
+ CRYPT_MD5Update(md5, defpasscode, 32);
+ if (pIdArray) {
+ CFX_ByteString id = pIdArray->GetString(0);
+ CRYPT_MD5Update(md5, (FX_LPBYTE)(FX_LPCSTR)id, id.GetLength());
+ }
+ FX_BYTE digest[32];
+ CRYPT_MD5Finish(md5, digest);
+ CRYPT_ArcFourCryptBlock(digest, 16, m_EncryptKey, key_len);
+ FX_BYTE tempkey[32];
+ for (int i = 1; i <= 19; i ++) {
+ for (int j = 0; j < key_len; j ++) {
+ tempkey[j] = m_EncryptKey[j] ^ (FX_BYTE)i;
+ }
+ CRYPT_ArcFourCryptBlock(digest, 16, tempkey, key_len);
+ }
+ CRYPT_MD5Generate(digest, 16, digest + 16);
+ pEncryptDict->SetAtString(FX_BSTRC("U"), CFX_ByteString(digest, 32));
+ }
+}
+void CPDF_StandardSecurityHandler::OnCreate(CPDF_Dictionary* pEncryptDict, CPDF_Array* pIdArray,
+ FX_LPCBYTE user_pass, FX_DWORD user_size,
+ FX_LPCBYTE owner_pass, FX_DWORD owner_size, FX_DWORD type)
+{
+ OnCreate(pEncryptDict, pIdArray, user_pass, user_size, owner_pass, owner_size, TRUE, type);
+}
+void CPDF_StandardSecurityHandler::OnCreate(CPDF_Dictionary* pEncryptDict, CPDF_Array* pIdArray, FX_LPCBYTE user_pass, FX_DWORD user_size, FX_DWORD type)
+{
+ OnCreate(pEncryptDict, pIdArray, user_pass, user_size, NULL, 0, FALSE, type);
+}
+void CPDF_StandardSecurityHandler::AES256_SetPassword(CPDF_Dictionary* pEncryptDict, FX_LPCBYTE password, FX_DWORD size, FX_BOOL bOwner, FX_LPCBYTE key)
+{
+ FX_BYTE sha[128];
+ CRYPT_SHA1Start(sha);
+ CRYPT_SHA1Update(sha, key, 32);
+ CRYPT_SHA1Update(sha, (FX_BYTE*)"hello", 5);
+ FX_BYTE digest[20];
+ CRYPT_SHA1Finish(sha, digest);
+ CFX_ByteString ukey = pEncryptDict->GetString(FX_BSTRC("U"));
+ FX_BYTE digest1[48];
+ if (m_Revision >= 6) {
+ Revision6_Hash(password, size, digest, (bOwner ? (FX_LPCBYTE)ukey : NULL), digest1);
+ } else {
+ CRYPT_SHA256Start(sha);
+ CRYPT_SHA256Update(sha, password, size);
+ CRYPT_SHA256Update(sha, digest, 8);
+ if (bOwner) {
+ CRYPT_SHA256Update(sha, ukey, ukey.GetLength());
+ }
+ CRYPT_SHA256Finish(sha, digest1);
+ }
+ FXSYS_memcpy32(digest1 + 32, digest, 16);
+ pEncryptDict->SetAtString(bOwner ? FX_BSTRC("O") : FX_BSTRC("U"), CFX_ByteString(digest1, 48));
+ if (m_Revision >= 6) {
+ Revision6_Hash(password, size, digest + 8, (bOwner ? (FX_LPCBYTE)ukey : NULL), digest1);
+ } else {
+ CRYPT_SHA256Start(sha);
+ CRYPT_SHA256Update(sha, password, size);
+ CRYPT_SHA256Update(sha, digest + 8, 8);
+ if (bOwner) {
+ CRYPT_SHA256Update(sha, ukey, ukey.GetLength());
+ }
+ CRYPT_SHA256Finish(sha, digest1);
+ }
+ FX_BYTE* aes = FX_Alloc(FX_BYTE, 2048);
+ CRYPT_AESSetKey(aes, 16, digest1, 32, TRUE);
+ FX_BYTE iv[16];
+ FXSYS_memset32(iv, 0, 16);
+ CRYPT_AESSetIV(aes, iv);
+ CRYPT_AESEncrypt(aes, digest1, key, 32);
+ FX_Free(aes);
+ pEncryptDict->SetAtString(bOwner ? FX_BSTRC("OE") : FX_BSTRC("UE"), CFX_ByteString(digest1, 32));
+}
+void CPDF_StandardSecurityHandler::AES256_SetPerms(CPDF_Dictionary* pEncryptDict, FX_DWORD permissions,
+ FX_BOOL bEncryptMetadata, FX_LPCBYTE key)
+{
+ FX_BYTE buf[16];
+ buf[0] = (FX_BYTE)permissions;
+ buf[1] = (FX_BYTE)(permissions >> 8);
+ buf[2] = (FX_BYTE)(permissions >> 16);
+ buf[3] = (FX_BYTE)(permissions >> 24);
+ buf[4] = 0xff;
+ buf[5] = 0xff;
+ buf[6] = 0xff;
+ buf[7] = 0xff;
+ buf[8] = bEncryptMetadata ? 'T' : 'F';
+ buf[9] = 'a';
+ buf[10] = 'd';
+ buf[11] = 'b';
+ FX_BYTE* aes = FX_Alloc(FX_BYTE, 2048);
+ CRYPT_AESSetKey(aes, 16, key, 32, TRUE);
+ FX_BYTE iv[16], buf1[16];
+ FXSYS_memset32(iv, 0, 16);
+ CRYPT_AESSetIV(aes, iv);
+ CRYPT_AESEncrypt(aes, buf1, buf, 16);
+ FX_Free(aes);
+ pEncryptDict->SetAtString(FX_BSTRC("Perms"), CFX_ByteString(buf1, 16));
+}
+void CPDF_StandardCryptoHandler::CryptBlock(FX_BOOL bEncrypt, FX_DWORD objnum, FX_DWORD gennum, FX_LPCBYTE src_buf, FX_DWORD src_size,
+ FX_LPBYTE dest_buf, FX_DWORD& dest_size)
+{
+ if (m_Cipher == FXCIPHER_NONE) {
+ FXSYS_memcpy32(dest_buf, src_buf, src_size);
+ return;
+ }
+ FX_BYTE realkey[16];
+ int realkeylen = 16;
+ if (m_Cipher != FXCIPHER_AES || m_KeyLen != 32) {
+ FX_BYTE key1[32];
+ FXSYS_memcpy32(key1, m_EncryptKey, m_KeyLen);
+ key1[m_KeyLen + 0] = (FX_BYTE)objnum;
+ key1[m_KeyLen + 1] = (FX_BYTE)(objnum >> 8);
+ key1[m_KeyLen + 2] = (FX_BYTE)(objnum >> 16);
+ key1[m_KeyLen + 3] = (FX_BYTE)gennum;
+ key1[m_KeyLen + 4] = (FX_BYTE)(gennum >> 8);
+ FXSYS_memcpy32(key1 + m_KeyLen, &objnum, 3);
+ FXSYS_memcpy32(key1 + m_KeyLen + 3, &gennum, 2);
+ if (m_Cipher == FXCIPHER_AES) {
+ FXSYS_memcpy32(key1 + m_KeyLen + 5, "sAlT", 4);
+ }
+ CRYPT_MD5Generate(key1, m_Cipher == FXCIPHER_AES ? m_KeyLen + 9 : m_KeyLen + 5, realkey);
+ realkeylen = m_KeyLen + 5;
+ if (realkeylen > 16) {
+ realkeylen = 16;
+ }
+ }
+ if (m_Cipher == FXCIPHER_AES) {
+ CRYPT_AESSetKey(m_pAESContext, 16, m_KeyLen == 32 ? m_EncryptKey : realkey, m_KeyLen, bEncrypt);
+ if (bEncrypt) {
+ FX_BYTE iv[16];
+ for (int i = 0; i < 16; i ++) {
+ iv[i] = (FX_BYTE)rand();
+ }
+ CRYPT_AESSetIV(m_pAESContext, iv);
+ FXSYS_memcpy32(dest_buf, iv, 16);
+ int nblocks = src_size / 16;
+ CRYPT_AESEncrypt(m_pAESContext, dest_buf + 16, src_buf, nblocks * 16);
+ FX_BYTE padding[16];
+ FXSYS_memcpy32(padding, src_buf + nblocks * 16, src_size % 16);
+ FXSYS_memset8(padding + src_size % 16, 16 - src_size % 16, 16 - src_size % 16);
+ CRYPT_AESEncrypt(m_pAESContext, dest_buf + nblocks * 16 + 16, padding, 16);
+ dest_size = 32 + nblocks * 16;
+ } else {
+ CRYPT_AESSetIV(m_pAESContext, src_buf);
+ CRYPT_AESDecrypt(m_pAESContext, dest_buf, src_buf + 16, src_size - 16);
+ dest_size = src_size - 16;
+ dest_size -= dest_buf[dest_size - 1];
+ }
+ } else {
+ ASSERT(dest_size == src_size);
+ if (dest_buf != src_buf) {
+ FXSYS_memcpy32(dest_buf, src_buf, src_size);
+ }
+ CRYPT_ArcFourCryptBlock(dest_buf, dest_size, realkey, realkeylen);
+ }
+}
+typedef struct _AESCryptContext {
+ FX_BYTE m_Context[2048];
+ FX_BOOL m_bIV;
+ FX_BYTE m_Block[16];
+ FX_DWORD m_BlockOffset;
+} AESCryptContext;
+FX_LPVOID CPDF_StandardCryptoHandler::CryptStart(FX_DWORD objnum, FX_DWORD gennum, FX_BOOL bEncrypt)
+{
+ if (m_Cipher == FXCIPHER_NONE) {
+ return this;
+ }
+ if (m_Cipher == FXCIPHER_AES && m_KeyLen == 32) {
+ AESCryptContext* pContext = FX_Alloc(AESCryptContext, 1);
+ pContext->m_bIV = TRUE;
+ pContext->m_BlockOffset = 0;
+ CRYPT_AESSetKey(pContext->m_Context, 16, m_EncryptKey, 32, bEncrypt);
+ if (bEncrypt) {
+ for (int i = 0; i < 16; i ++) {
+ pContext->m_Block[i] = (FX_BYTE)rand();
+ }
+ CRYPT_AESSetIV(pContext->m_Context, pContext->m_Block);
+ }
+ return pContext;
+ }
+ FX_BYTE key1[48];
+ FXSYS_memcpy32(key1, m_EncryptKey, m_KeyLen);
+ FXSYS_memcpy32(key1 + m_KeyLen, &objnum, 3);
+ FXSYS_memcpy32(key1 + m_KeyLen + 3, &gennum, 2);
+ if (m_Cipher == FXCIPHER_AES) {
+ FXSYS_memcpy32(key1 + m_KeyLen + 5, "sAlT", 4);
+ }
+ FX_BYTE realkey[16];
+ CRYPT_MD5Generate(key1, m_Cipher == FXCIPHER_AES ? m_KeyLen + 9 : m_KeyLen + 5, realkey);
+ int realkeylen = m_KeyLen + 5;
+ if (realkeylen > 16) {
+ realkeylen = 16;
+ }
+ if (m_Cipher == FXCIPHER_AES) {
+ AESCryptContext* pContext = FX_Alloc(AESCryptContext, 1);
+ pContext->m_bIV = TRUE;
+ pContext->m_BlockOffset = 0;
+ CRYPT_AESSetKey(pContext->m_Context, 16, realkey, 16, bEncrypt);
+ if (bEncrypt) {
+ for (int i = 0; i < 16; i ++) {
+ pContext->m_Block[i] = (FX_BYTE)rand();
+ }
+ CRYPT_AESSetIV(pContext->m_Context, pContext->m_Block);
+ }
+ return pContext;
+ }
+ void* pContext = FX_Alloc(FX_BYTE, 1040);
+ CRYPT_ArcFourSetup(pContext, realkey, realkeylen);
+ return pContext;
+}
+FX_BOOL CPDF_StandardCryptoHandler::CryptStream(FX_LPVOID context, FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf, FX_BOOL bEncrypt)
+{
+ if (!context) {
+ return FALSE;
+ }
+ if (m_Cipher == FXCIPHER_NONE) {
+ dest_buf.AppendBlock(src_buf, src_size);
+ return TRUE;
+ }
+ if (m_Cipher == FXCIPHER_RC4) {
+ int old_size = dest_buf.GetSize();
+ dest_buf.AppendBlock(src_buf, src_size);
+ CRYPT_ArcFourCrypt(context, dest_buf.GetBuffer() + old_size, src_size);
+ return TRUE;
+ }
+ AESCryptContext* pContext = (AESCryptContext*)context;
+ if (pContext->m_bIV && bEncrypt) {
+ dest_buf.AppendBlock(pContext->m_Block, 16);
+ pContext->m_bIV = FALSE;
+ }
+ FX_DWORD src_off = 0;
+ FX_DWORD src_left = src_size;
+ while (1) {
+ FX_DWORD copy_size = 16 - pContext->m_BlockOffset;
+ if (copy_size > src_left) {
+ copy_size = src_left;
+ }
+ FXSYS_memcpy32(pContext->m_Block + pContext->m_BlockOffset, src_buf + src_off, copy_size);
+ src_off += copy_size;
+ src_left -= copy_size;
+ pContext->m_BlockOffset += copy_size;
+ if (pContext->m_BlockOffset == 16) {
+ if (!bEncrypt && pContext->m_bIV) {
+ CRYPT_AESSetIV(pContext->m_Context, pContext->m_Block);
+ pContext->m_bIV = FALSE;
+ pContext->m_BlockOffset = 0;
+ } else if (src_off < src_size) {
+ FX_BYTE block_buf[16];
+ if (bEncrypt) {
+ CRYPT_AESEncrypt(pContext->m_Context, block_buf, pContext->m_Block, 16);
+ } else {
+ CRYPT_AESDecrypt(pContext->m_Context, block_buf, pContext->m_Block, 16);
+ }
+ dest_buf.AppendBlock(block_buf, 16);
+ pContext->m_BlockOffset = 0;
+ }
+ }
+ if (!src_left) {
+ break;
+ }
+ }
+ return TRUE;
+}
+FX_BOOL CPDF_StandardCryptoHandler::CryptFinish(FX_LPVOID context, CFX_BinaryBuf& dest_buf, FX_BOOL bEncrypt)
+{
+ if (!context) {
+ return FALSE;
+ }
+ if (m_Cipher == FXCIPHER_NONE) {
+ return TRUE;
+ }
+ if (m_Cipher == FXCIPHER_RC4) {
+ FX_Free(context);
+ return TRUE;
+ }
+ AESCryptContext* pContext = (AESCryptContext*)context;
+ if (bEncrypt) {
+ FX_BYTE block_buf[16];
+ if (pContext->m_BlockOffset == 16) {
+ CRYPT_AESEncrypt(pContext->m_Context, block_buf, pContext->m_Block, 16);
+ dest_buf.AppendBlock(block_buf, 16);
+ pContext->m_BlockOffset = 0;
+ }
+ FXSYS_memset8(pContext->m_Block + pContext->m_BlockOffset, (FX_BYTE)(16 - pContext->m_BlockOffset), 16 - pContext->m_BlockOffset);
+ CRYPT_AESEncrypt(pContext->m_Context, block_buf, pContext->m_Block, 16);
+ dest_buf.AppendBlock(block_buf, 16);
+ } else if (pContext->m_BlockOffset == 16) {
+ FX_BYTE block_buf[16];
+ CRYPT_AESDecrypt(pContext->m_Context, block_buf, pContext->m_Block, 16);
+ if (block_buf[15] <= 16) {
+ dest_buf.AppendBlock(block_buf, 16 - block_buf[15]);
+ }
+ }
+ FX_Free(pContext);
+ return TRUE;
+}
+FX_LPVOID CPDF_StandardCryptoHandler::DecryptStart(FX_DWORD objnum, FX_DWORD gennum)
+{
+ return CryptStart(objnum, gennum, FALSE);
+}
+FX_DWORD CPDF_StandardCryptoHandler::DecryptGetSize(FX_DWORD src_size)
+{
+ return m_Cipher == FXCIPHER_AES ? src_size - 16 : src_size;
+}
+FX_BOOL CPDF_StandardCryptoHandler::Init(CPDF_Dictionary* pEncryptDict, CPDF_SecurityHandler* pSecurityHandler)
+{
+ FX_LPCBYTE key;
+ if (!pSecurityHandler->GetCryptInfo(m_Cipher, key, m_KeyLen)) {
+ return FALSE;
+ }
+ if (m_KeyLen > 32 || m_KeyLen < 0) {
+ return FALSE;
+ }
+ if (m_Cipher != FXCIPHER_NONE) {
+ FXSYS_memcpy32(m_EncryptKey, key, m_KeyLen);
+ }
+ if (m_Cipher == FXCIPHER_AES) {
+ m_pAESContext = FX_Alloc(FX_BYTE, 2048);
+ }
+ return TRUE;
+}
+FX_BOOL CPDF_StandardCryptoHandler::Init(int cipher, FX_LPCBYTE key, int keylen)
+{
+ if (cipher == FXCIPHER_AES) {
+ switch(keylen) {
+ case 16:
+ case 24:
+ case 32:
+ break;
+ default:
+ return FALSE;
+ }
+ } else if (cipher == FXCIPHER_AES2) {
+ if (keylen != 32) {
+ return FALSE;
+ }
+ } else if (cipher == FXCIPHER_RC4) {
+ if (keylen < 5 || keylen > 16) {
+ return FALSE;
+ }
+ } else {
+ if (keylen > 32) {
+ keylen = 32;
+ }
+ }
+ m_Cipher = cipher;
+ m_KeyLen = keylen;
+ FXSYS_memcpy32(m_EncryptKey, key, keylen);
+ if (m_Cipher == FXCIPHER_AES) {
+ m_pAESContext = FX_Alloc(FX_BYTE, 2048);
+ }
+ return TRUE;
+}
+FX_BOOL CPDF_StandardCryptoHandler::DecryptStream(FX_LPVOID context, FX_LPCBYTE src_buf, FX_DWORD src_size,
+ CFX_BinaryBuf& dest_buf)
+{
+ return CryptStream(context, src_buf, src_size, dest_buf, FALSE);
+}
+FX_BOOL CPDF_StandardCryptoHandler::DecryptFinish(FX_LPVOID context, CFX_BinaryBuf& dest_buf)
+{
+ return CryptFinish(context, dest_buf, FALSE);
+}
+FX_DWORD CPDF_StandardCryptoHandler::EncryptGetSize(FX_DWORD objnum, FX_DWORD version, FX_LPCBYTE src_buf, FX_DWORD src_size)
+{
+ if (m_Cipher == FXCIPHER_AES) {
+ return src_size + 32;
+ }
+ return src_size;
+}
+FX_BOOL CPDF_StandardCryptoHandler::EncryptContent(FX_DWORD objnum, FX_DWORD gennum, FX_LPCBYTE src_buf, FX_DWORD src_size,
+ FX_LPBYTE dest_buf, FX_DWORD& dest_size)
+{
+ CryptBlock(TRUE, objnum, gennum, src_buf, src_size, dest_buf, dest_size);
+ return TRUE;
+}
+void CPDF_CryptoHandler::Decrypt(FX_DWORD objnum, FX_DWORD gennum, CFX_ByteString& str)
+{
+ CFX_BinaryBuf dest_buf;
+ FX_LPVOID context = DecryptStart(objnum, gennum);
+ DecryptStream(context, (FX_LPCBYTE)str, str.GetLength(), dest_buf);
+ DecryptFinish(context, dest_buf);
+ str = dest_buf;
+}
+CPDF_StandardCryptoHandler::CPDF_StandardCryptoHandler()
+{
+ m_pAESContext = NULL;
+ m_Cipher = FXCIPHER_NONE;
+ m_KeyLen = 0;
+}
+CPDF_StandardCryptoHandler::~CPDF_StandardCryptoHandler()
+{
+ if (m_pAESContext) {
+ FX_Free(m_pAESContext);
+ }
+}
diff --git a/core/src/fpdfapi/fpdf_parser/fpdf_parser_fdf.cpp b/core/src/fpdfapi/fpdf_parser/fpdf_parser_fdf.cpp
index 22f9aa713f..36cc9db754 100644
--- a/core/src/fpdfapi/fpdf_parser/fpdf_parser_fdf.cpp
+++ b/core/src/fpdfapi/fpdf_parser/fpdf_parser_fdf.cpp
@@ -1,224 +1,224 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../../include/fpdfapi/fpdf_serial.h"
-CFDF_Document::CFDF_Document() : CPDF_IndirectObjects(NULL)
-{
- m_pRootDict = NULL;
- m_pFile = NULL;
- m_bOwnFile = FALSE;
-}
-CFDF_Document::~CFDF_Document()
-{
- if (m_bOwnFile && m_pFile) {
- m_pFile->Release();
- }
-}
-CFDF_Document* CFDF_Document::CreateNewDoc()
-{
- CFDF_Document* pDoc = FX_NEW CFDF_Document;
- pDoc->m_pRootDict = FX_NEW CPDF_Dictionary;
- pDoc->AddIndirectObject(pDoc->m_pRootDict);
- CPDF_Dictionary* pFDFDict = FX_NEW CPDF_Dictionary;
- pDoc->m_pRootDict->SetAt(FX_BSTRC("FDF"), pFDFDict);
- return pDoc;
-}
-CFDF_Document* CFDF_Document::ParseFile(FX_LPCSTR file_path)
-{
- return CFDF_Document::ParseFile(FX_CreateFileRead(file_path), TRUE);
-}
-CFDF_Document* CFDF_Document::ParseFile(FX_LPCWSTR file_path)
-{
- return CFDF_Document::ParseFile(FX_CreateFileRead(file_path), TRUE);
-}
-CFDF_Document* CFDF_Document::ParseFile(IFX_FileRead *pFile, FX_BOOL bOwnFile)
-{
- if (!pFile) {
- return NULL;
- }
- CFDF_Document* pDoc = FX_NEW CFDF_Document;
- pDoc->ParseStream(pFile, bOwnFile);
- if (pDoc->m_pRootDict == NULL) {
- delete pDoc;
- return NULL;
- }
- return pDoc;
-}
-CFDF_Document* CFDF_Document::ParseMemory(FX_LPCBYTE pData, FX_DWORD size)
-{
- return CFDF_Document::ParseFile(FX_CreateMemoryStream((FX_LPBYTE)pData, size), TRUE);
-}
-void CFDF_Document::ParseStream(IFX_FileRead *pFile, FX_BOOL bOwnFile)
-{
- m_pFile = pFile;
- m_bOwnFile = bOwnFile;
- CPDF_SyntaxParser parser;
- parser.InitParser(m_pFile, 0);
- while (1) {
- FX_BOOL bNumber;
- CFX_ByteString word = parser.GetNextWord(bNumber);
- if (bNumber) {
- FX_DWORD objnum = FXSYS_atoi(word);
- word = parser.GetNextWord(bNumber);
- if (!bNumber) {
- break;
- }
- word = parser.GetNextWord(bNumber);
- if (word != FX_BSTRC("obj")) {
- break;
- }
- CPDF_Object* pObj = parser.GetObject(this, objnum, 0, FALSE);
- if (pObj == NULL) {
- break;
- }
- InsertIndirectObject(objnum, pObj);
- word = parser.GetNextWord(bNumber);
- if (word != FX_BSTRC("endobj")) {
- break;
- }
- } else {
- if (word != FX_BSTRC("trailer")) {
- break;
- }
- CPDF_Dictionary* pMainDict = (CPDF_Dictionary*)parser.GetObject(this, 0, 0, 0);
- if (pMainDict == NULL || pMainDict->GetType() != PDFOBJ_DICTIONARY) {
- break;
- }
- m_pRootDict = pMainDict->GetDict(FX_BSTRC("Root"));
- pMainDict->Release();
- break;
- }
- }
-}
-FX_BOOL CFDF_Document::WriteBuf(CFX_ByteTextBuf& buf) const
-{
- if (m_pRootDict == NULL) {
- return FALSE;
- }
- buf << FX_BSTRC("%FDF-1.2\r\n");
- FX_POSITION pos = m_IndirectObjs.GetStartPosition();
- while(pos) {
- size_t objnum;
- CPDF_Object* pObj;
- m_IndirectObjs.GetNextAssoc(pos, (FX_LPVOID&)objnum, (FX_LPVOID&)pObj);
- buf << (FX_DWORD)objnum << FX_BSTRC(" 0 obj\r\n") << pObj << FX_BSTRC("\r\nendobj\r\n\r\n");
- }
- buf << FX_BSTRC("trailer\r\n<</Root ") << m_pRootDict->GetObjNum() << FX_BSTRC(" 0 R>>\r\n%%EOF\r\n");
- return TRUE;
-}
-CFX_WideString CFDF_Document::GetWin32Path() const
-{
- CPDF_Object* pFileSpec = m_pRootDict->GetDict(FX_BSTRC("FDF"))->GetElementValue(FX_BSTRC("F"));
- if (pFileSpec == NULL) {
- return CFX_WideString();
- }
- if (pFileSpec->GetType() == PDFOBJ_STRING) {
- return FPDF_FileSpec_GetWin32Path(m_pRootDict->GetDict(FX_BSTRC("FDF")));
- }
- return FPDF_FileSpec_GetWin32Path(pFileSpec);
-}
-FX_BOOL CFDF_Document::WriteFile(FX_LPCSTR file_path) const
-{
- IFX_FileWrite *pFile = FX_CreateFileWrite(file_path);
- if (!pFile) {
- return FALSE;
- }
- FX_BOOL bRet = WriteFile(pFile);
- pFile->Release();
- return bRet;
-}
-FX_BOOL CFDF_Document::WriteFile(FX_LPCWSTR file_path) const
-{
- IFX_FileWrite *pFile = FX_CreateFileWrite(file_path);
- if (!pFile) {
- return FALSE;
- }
- FX_BOOL bRet = WriteFile(pFile);
- pFile->Release();
- return bRet;
-}
-FX_BOOL CFDF_Document::WriteFile(IFX_FileWrite *pFile) const
-{
- CFX_ByteTextBuf buf;
- WriteBuf(buf);
- FX_BOOL bRet = pFile->WriteBlock(buf.GetBuffer(), buf.GetSize());
- if (bRet) {
- pFile->Flush();
- }
- return bRet;
-}
-static CFX_WideString ChangeSlash(FX_LPCWSTR str)
-{
- CFX_WideString result;
- while (*str) {
- if (*str == '\\') {
- result += '/';
- } else if (*str == '/') {
- result += '\\';
- } else {
- result += *str;
- }
- str ++;
- }
- return result;
-}
-void FPDF_FileSpec_SetWin32Path(CPDF_Object* pFileSpec, const CFX_WideString& filepath)
-{
- CFX_WideString result;
- if (filepath.GetLength() > 1 && filepath[1] == ':') {
- result = L"/";
- result += filepath[0];
- if (filepath[2] != '\\') {
- result += '/';
- }
- result += ChangeSlash((FX_LPCWSTR)filepath + 2);
- } else if (filepath.GetLength() > 1 && filepath[0] == '\\' && filepath[1] == '\\') {
- result = ChangeSlash((FX_LPCWSTR)filepath + 1);
- } else {
- result = ChangeSlash(filepath);
- }
- if (pFileSpec->GetType() == PDFOBJ_STRING) {
- pFileSpec->SetString(CFX_ByteString::FromUnicode(result));
- } else if (pFileSpec->GetType() == PDFOBJ_DICTIONARY) {
- ((CPDF_Dictionary*)pFileSpec)->SetAtString(FX_BSTRC("F"), CFX_ByteString::FromUnicode(result));
- ((CPDF_Dictionary*)pFileSpec)->SetAtString(FX_BSTRC("UF"), PDF_EncodeText(result));
- ((CPDF_Dictionary*)pFileSpec)->RemoveAt(FX_BSTRC("FS"));
- }
-}
-CFX_WideString FPDF_FileSpec_GetWin32Path(const CPDF_Object* pFileSpec)
-{
- CFX_WideString wsFileName;
- if (pFileSpec->GetType() == PDFOBJ_DICTIONARY) {
- CPDF_Dictionary* pDict = (CPDF_Dictionary*)pFileSpec;
- wsFileName = pDict->GetUnicodeText(FX_BSTRC("UF"));
- if (wsFileName.IsEmpty()) {
- wsFileName = CFX_WideString::FromLocal(pDict->GetString(FX_BSTRC("F")));
- }
- if (pDict->GetString(FX_BSTRC("FS")) == FX_BSTRC("URL")) {
- return wsFileName;
- }
- if (wsFileName.IsEmpty() && pDict->KeyExist(FX_BSTRC("DOS"))) {
- wsFileName = CFX_WideString::FromLocal(pDict->GetString(FX_BSTRC("DOS")));
- }
- } else {
- wsFileName = CFX_WideString::FromLocal(pFileSpec->GetString());
- }
- if (wsFileName[0] != '/') {
- return ChangeSlash(wsFileName);
- }
- if (wsFileName[2] == '/') {
- CFX_WideString result;
- result += wsFileName[1];
- result += ':';
- result += ChangeSlash(((FX_LPCWSTR)wsFileName) + 2);
- return result;
- } else {
- CFX_WideString result;
- result += '\\';
- result += ChangeSlash(wsFileName);
- return result;
- }
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fpdfapi/fpdf_serial.h"
+CFDF_Document::CFDF_Document() : CPDF_IndirectObjects(NULL)
+{
+ m_pRootDict = NULL;
+ m_pFile = NULL;
+ m_bOwnFile = FALSE;
+}
+CFDF_Document::~CFDF_Document()
+{
+ if (m_bOwnFile && m_pFile) {
+ m_pFile->Release();
+ }
+}
+CFDF_Document* CFDF_Document::CreateNewDoc()
+{
+ CFDF_Document* pDoc = FX_NEW CFDF_Document;
+ pDoc->m_pRootDict = FX_NEW CPDF_Dictionary;
+ pDoc->AddIndirectObject(pDoc->m_pRootDict);
+ CPDF_Dictionary* pFDFDict = FX_NEW CPDF_Dictionary;
+ pDoc->m_pRootDict->SetAt(FX_BSTRC("FDF"), pFDFDict);
+ return pDoc;
+}
+CFDF_Document* CFDF_Document::ParseFile(FX_LPCSTR file_path)
+{
+ return CFDF_Document::ParseFile(FX_CreateFileRead(file_path), TRUE);
+}
+CFDF_Document* CFDF_Document::ParseFile(FX_LPCWSTR file_path)
+{
+ return CFDF_Document::ParseFile(FX_CreateFileRead(file_path), TRUE);
+}
+CFDF_Document* CFDF_Document::ParseFile(IFX_FileRead *pFile, FX_BOOL bOwnFile)
+{
+ if (!pFile) {
+ return NULL;
+ }
+ CFDF_Document* pDoc = FX_NEW CFDF_Document;
+ pDoc->ParseStream(pFile, bOwnFile);
+ if (pDoc->m_pRootDict == NULL) {
+ delete pDoc;
+ return NULL;
+ }
+ return pDoc;
+}
+CFDF_Document* CFDF_Document::ParseMemory(FX_LPCBYTE pData, FX_DWORD size)
+{
+ return CFDF_Document::ParseFile(FX_CreateMemoryStream((FX_LPBYTE)pData, size), TRUE);
+}
+void CFDF_Document::ParseStream(IFX_FileRead *pFile, FX_BOOL bOwnFile)
+{
+ m_pFile = pFile;
+ m_bOwnFile = bOwnFile;
+ CPDF_SyntaxParser parser;
+ parser.InitParser(m_pFile, 0);
+ while (1) {
+ FX_BOOL bNumber;
+ CFX_ByteString word = parser.GetNextWord(bNumber);
+ if (bNumber) {
+ FX_DWORD objnum = FXSYS_atoi(word);
+ word = parser.GetNextWord(bNumber);
+ if (!bNumber) {
+ break;
+ }
+ word = parser.GetNextWord(bNumber);
+ if (word != FX_BSTRC("obj")) {
+ break;
+ }
+ CPDF_Object* pObj = parser.GetObject(this, objnum, 0, FALSE);
+ if (pObj == NULL) {
+ break;
+ }
+ InsertIndirectObject(objnum, pObj);
+ word = parser.GetNextWord(bNumber);
+ if (word != FX_BSTRC("endobj")) {
+ break;
+ }
+ } else {
+ if (word != FX_BSTRC("trailer")) {
+ break;
+ }
+ CPDF_Dictionary* pMainDict = (CPDF_Dictionary*)parser.GetObject(this, 0, 0, 0);
+ if (pMainDict == NULL || pMainDict->GetType() != PDFOBJ_DICTIONARY) {
+ break;
+ }
+ m_pRootDict = pMainDict->GetDict(FX_BSTRC("Root"));
+ pMainDict->Release();
+ break;
+ }
+ }
+}
+FX_BOOL CFDF_Document::WriteBuf(CFX_ByteTextBuf& buf) const
+{
+ if (m_pRootDict == NULL) {
+ return FALSE;
+ }
+ buf << FX_BSTRC("%FDF-1.2\r\n");
+ FX_POSITION pos = m_IndirectObjs.GetStartPosition();
+ while(pos) {
+ size_t objnum;
+ CPDF_Object* pObj;
+ m_IndirectObjs.GetNextAssoc(pos, (FX_LPVOID&)objnum, (FX_LPVOID&)pObj);
+ buf << (FX_DWORD)objnum << FX_BSTRC(" 0 obj\r\n") << pObj << FX_BSTRC("\r\nendobj\r\n\r\n");
+ }
+ buf << FX_BSTRC("trailer\r\n<</Root ") << m_pRootDict->GetObjNum() << FX_BSTRC(" 0 R>>\r\n%%EOF\r\n");
+ return TRUE;
+}
+CFX_WideString CFDF_Document::GetWin32Path() const
+{
+ CPDF_Object* pFileSpec = m_pRootDict->GetDict(FX_BSTRC("FDF"))->GetElementValue(FX_BSTRC("F"));
+ if (pFileSpec == NULL) {
+ return CFX_WideString();
+ }
+ if (pFileSpec->GetType() == PDFOBJ_STRING) {
+ return FPDF_FileSpec_GetWin32Path(m_pRootDict->GetDict(FX_BSTRC("FDF")));
+ }
+ return FPDF_FileSpec_GetWin32Path(pFileSpec);
+}
+FX_BOOL CFDF_Document::WriteFile(FX_LPCSTR file_path) const
+{
+ IFX_FileWrite *pFile = FX_CreateFileWrite(file_path);
+ if (!pFile) {
+ return FALSE;
+ }
+ FX_BOOL bRet = WriteFile(pFile);
+ pFile->Release();
+ return bRet;
+}
+FX_BOOL CFDF_Document::WriteFile(FX_LPCWSTR file_path) const
+{
+ IFX_FileWrite *pFile = FX_CreateFileWrite(file_path);
+ if (!pFile) {
+ return FALSE;
+ }
+ FX_BOOL bRet = WriteFile(pFile);
+ pFile->Release();
+ return bRet;
+}
+FX_BOOL CFDF_Document::WriteFile(IFX_FileWrite *pFile) const
+{
+ CFX_ByteTextBuf buf;
+ WriteBuf(buf);
+ FX_BOOL bRet = pFile->WriteBlock(buf.GetBuffer(), buf.GetSize());
+ if (bRet) {
+ pFile->Flush();
+ }
+ return bRet;
+}
+static CFX_WideString ChangeSlash(FX_LPCWSTR str)
+{
+ CFX_WideString result;
+ while (*str) {
+ if (*str == '\\') {
+ result += '/';
+ } else if (*str == '/') {
+ result += '\\';
+ } else {
+ result += *str;
+ }
+ str ++;
+ }
+ return result;
+}
+void FPDF_FileSpec_SetWin32Path(CPDF_Object* pFileSpec, const CFX_WideString& filepath)
+{
+ CFX_WideString result;
+ if (filepath.GetLength() > 1 && filepath[1] == ':') {
+ result = L"/";
+ result += filepath[0];
+ if (filepath[2] != '\\') {
+ result += '/';
+ }
+ result += ChangeSlash((FX_LPCWSTR)filepath + 2);
+ } else if (filepath.GetLength() > 1 && filepath[0] == '\\' && filepath[1] == '\\') {
+ result = ChangeSlash((FX_LPCWSTR)filepath + 1);
+ } else {
+ result = ChangeSlash(filepath);
+ }
+ if (pFileSpec->GetType() == PDFOBJ_STRING) {
+ pFileSpec->SetString(CFX_ByteString::FromUnicode(result));
+ } else if (pFileSpec->GetType() == PDFOBJ_DICTIONARY) {
+ ((CPDF_Dictionary*)pFileSpec)->SetAtString(FX_BSTRC("F"), CFX_ByteString::FromUnicode(result));
+ ((CPDF_Dictionary*)pFileSpec)->SetAtString(FX_BSTRC("UF"), PDF_EncodeText(result));
+ ((CPDF_Dictionary*)pFileSpec)->RemoveAt(FX_BSTRC("FS"));
+ }
+}
+CFX_WideString FPDF_FileSpec_GetWin32Path(const CPDF_Object* pFileSpec)
+{
+ CFX_WideString wsFileName;
+ if (pFileSpec->GetType() == PDFOBJ_DICTIONARY) {
+ CPDF_Dictionary* pDict = (CPDF_Dictionary*)pFileSpec;
+ wsFileName = pDict->GetUnicodeText(FX_BSTRC("UF"));
+ if (wsFileName.IsEmpty()) {
+ wsFileName = CFX_WideString::FromLocal(pDict->GetString(FX_BSTRC("F")));
+ }
+ if (pDict->GetString(FX_BSTRC("FS")) == FX_BSTRC("URL")) {
+ return wsFileName;
+ }
+ if (wsFileName.IsEmpty() && pDict->KeyExist(FX_BSTRC("DOS"))) {
+ wsFileName = CFX_WideString::FromLocal(pDict->GetString(FX_BSTRC("DOS")));
+ }
+ } else {
+ wsFileName = CFX_WideString::FromLocal(pFileSpec->GetString());
+ }
+ if (wsFileName[0] != '/') {
+ return ChangeSlash(wsFileName);
+ }
+ if (wsFileName[2] == '/') {
+ CFX_WideString result;
+ result += wsFileName[1];
+ result += ':';
+ result += ChangeSlash(((FX_LPCWSTR)wsFileName) + 2);
+ return result;
+ } else {
+ CFX_WideString result;
+ result += '\\';
+ result += ChangeSlash(wsFileName);
+ return result;
+ }
+}
diff --git a/core/src/fpdfapi/fpdf_parser/fpdf_parser_filters.cpp b/core/src/fpdfapi/fpdf_parser/fpdf_parser_filters.cpp
index 76a79f69cb..1e4e1570df 100644
--- a/core/src/fpdfapi/fpdf_parser/fpdf_parser_filters.cpp
+++ b/core/src/fpdfapi/fpdf_parser/fpdf_parser_filters.cpp
@@ -1,909 +1,909 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../fx_zlib.h"
-#include "../../../include/fpdfapi/fpdf_parser.h"
-#include "../../../include/fxcodec/fx_codec.h"
-#include "../../../include/fpdfapi/fpdf_module.h"
-#include "filters_int.h"
-CFX_DataFilter::CFX_DataFilter()
-{
- m_bEOF = FALSE;
- m_pDestFilter = NULL;
- m_SrcPos = 0;
-}
-CFX_DataFilter::~CFX_DataFilter()
-{
- if (m_pDestFilter) {
- delete m_pDestFilter;
- }
-}
-void CFX_DataFilter::SetDestFilter(CFX_DataFilter* pFilter)
-{
- if (m_pDestFilter) {
- m_pDestFilter->SetDestFilter(pFilter);
- } else {
- m_pDestFilter = pFilter;
- }
-}
-void CFX_DataFilter::FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf)
-{
- if (m_bEOF) {
- return;
- }
- m_SrcPos += src_size;
- if (m_pDestFilter) {
- CFX_BinaryBuf temp_buf;
- temp_buf.EstimateSize(FPDF_FILTER_BUFFER_SIZE, FPDF_FILTER_BUFFER_SIZE);
- v_FilterIn(src_buf, src_size, temp_buf);
- m_pDestFilter->FilterIn(temp_buf.GetBuffer(), temp_buf.GetSize(), dest_buf);
- } else {
- v_FilterIn(src_buf, src_size, dest_buf);
- }
-}
-void CFX_DataFilter::FilterFinish(CFX_BinaryBuf& dest_buf)
-{
- if (m_pDestFilter) {
- CFX_BinaryBuf temp_buf;
- v_FilterFinish(temp_buf);
- if (temp_buf.GetSize()) {
- m_pDestFilter->FilterIn(temp_buf.GetBuffer(), temp_buf.GetSize(), dest_buf);
- }
- m_pDestFilter->FilterFinish(dest_buf);
- } else {
- v_FilterFinish(dest_buf);
- }
- m_bEOF = TRUE;
-}
-void CFX_DataFilter::ReportEOF(FX_DWORD left_input)
-{
- if (m_bEOF) {
- return;
- }
- m_bEOF = TRUE;
- m_SrcPos -= left_input;
-}
-CFX_DataFilter* FPDF_CreateFilter(FX_BSTR name, const CPDF_Dictionary* pParam, int width, int height)
-{
- FX_DWORD id = name.GetID();
- switch (id) {
- case FXBSTR_ID('F', 'l', 'a', 't'):
- case FXBSTR_ID('F', 'l', 0, 0):
- case FXBSTR_ID('L', 'Z', 'W', 'D'):
- case FXBSTR_ID('L', 'Z', 'W', 0): {
- CFX_DataFilter* pFilter;
- if (id == FXBSTR_ID('L', 'Z', 'W', 'D') || id == FXBSTR_ID('L', 'Z', 'W', 0)) {
- pFilter = FX_NEW CPDF_LzwFilter(pParam->GetInteger("EarlyChange", 1));
- } else {
- pFilter = FX_NEW CPDF_FlateFilter;
- }
- if (pParam->GetInteger("Predictor", 1) > 1) {
- CFX_DataFilter* pPredictor = FX_NEW CPDF_PredictorFilter(pParam->GetInteger(FX_BSTRC("Predictor"), 1),
- pParam->GetInteger(FX_BSTRC("Colors"), 1), pParam->GetInteger(FX_BSTRC("BitsPerComponent"), 8),
- pParam->GetInteger(FX_BSTRC("Columns"), 1));
- pFilter->SetDestFilter(pPredictor);
- }
- return pFilter;
- }
- case FXBSTR_ID('A', 'S', 'C', 'I'):
- if (name == "ASCIIHexDecode") {
- return FX_NEW CPDF_AsciiHexFilter;
- }
- return FX_NEW CPDF_Ascii85Filter;
- case FXBSTR_ID('A', 'H', 'x', 0):
- return FX_NEW CPDF_AsciiHexFilter;
- case FXBSTR_ID('A', '8', '5', 0):
- return FX_NEW CPDF_Ascii85Filter;
- case FXBSTR_ID('R', 'u', 'n', 'L'):
- return FX_NEW CPDF_RunLenFilter;
- case FXBSTR_ID('C', 'C', 'I', 'T'): {
- int Encoding = 0;
- int bEndOfLine = FALSE;
- int bByteAlign = FALSE;
- int bBlack = FALSE;
- int nRows = 0;
- int nColumns = 1728;
- if (pParam) {
- Encoding = pParam->GetInteger(FX_BSTRC("K"));
- bEndOfLine = pParam->GetInteger(FX_BSTRC("EndOfLine"));
- bByteAlign = pParam->GetInteger(FX_BSTRC("EncodedByteAlign"));
- bBlack = pParam->GetInteger(FX_BSTRC("BlackIs1"));
- nColumns = pParam->GetInteger(FX_BSTRC("Columns"), 1728);
- nRows = pParam->GetInteger(FX_BSTRC("Rows"));
- }
- if (nColumns == 0) {
- nColumns = width;
- }
- if (nRows == 0) {
- nRows = height;
- }
- CPDF_FaxFilter* pFilter = FX_NEW CPDF_FaxFilter();
- pFilter->Initialize(Encoding, bEndOfLine, bByteAlign, bBlack, nRows, nColumns);
- return pFilter;
- }
- case FXBSTR_ID('D', 'C', 'T', 'D'):
- return FX_NEW CPDF_JpegFilter;
- default:
- return NULL;
- }
-}
-CFX_DataFilter* _FPDF_CreateFilterFromDict(CPDF_Dictionary* pDict)
-{
- CPDF_Object* pDecoder = pDict->GetElementValue("Filter");
- if (pDecoder == NULL) {
- return NULL;
- }
- CFX_DataFilter* pFirstFilter = NULL;
- int width = pDict->GetInteger(FX_BSTRC("Width")), height = pDict->GetInteger(FX_BSTRC("Height"));
- CPDF_Object* pParams = pDict->GetElementValue("DecodeParms");
- if (pDecoder->GetType() == PDFOBJ_ARRAY) {
- if (pParams && pParams->GetType() != PDFOBJ_ARRAY) {
- pParams = NULL;
- }
- for (FX_DWORD i = 0; i < ((CPDF_Array*)pDecoder)->GetCount(); i ++) {
- CFX_ByteString name = ((CPDF_Array*)pDecoder)->GetString(i);
- CPDF_Dictionary* pParam = NULL;
- if (pParams) {
- pParam = ((CPDF_Array*)pParams)->GetDict(i);
- }
- CFX_DataFilter* pDestFilter = FPDF_CreateFilter(name, pParam, width, height);
- if (pDestFilter) {
- if (pFirstFilter == NULL) {
- pFirstFilter = pDestFilter;
- } else {
- pFirstFilter->SetDestFilter(pDestFilter);
- }
- }
- }
- } else {
- if (pParams && pParams->GetType() != PDFOBJ_DICTIONARY) {
- pParams = NULL;
- }
- pFirstFilter = FPDF_CreateFilter(pDecoder->GetString(), (CPDF_Dictionary*)pParams, width, height);
- }
- return pFirstFilter;
-}
-CPDF_StreamFilter* CPDF_Stream::GetStreamFilter(FX_BOOL bRaw) const
-{
- CFX_DataFilter* pFirstFilter = NULL;
- if (m_pCryptoHandler) {
- pFirstFilter = FX_NEW CPDF_DecryptFilter(m_pCryptoHandler, m_ObjNum, m_GenNum);
- }
- if (!bRaw) {
- CFX_DataFilter* pFilter = _FPDF_CreateFilterFromDict(m_pDict);
- if (pFilter) {
- if (pFirstFilter == NULL) {
- pFirstFilter = pFilter;
- } else {
- pFirstFilter->SetDestFilter(pFilter);
- }
- }
- }
- CPDF_StreamFilter* pStreamFilter = FX_NEW CPDF_StreamFilter;
- pStreamFilter->m_pStream = this;
- pStreamFilter->m_pFilter = pFirstFilter;
- pStreamFilter->m_pBuffer = NULL;
- pStreamFilter->m_SrcOffset = 0;
- return pStreamFilter;
-}
-CPDF_StreamFilter::~CPDF_StreamFilter()
-{
- if (m_pFilter) {
- delete m_pFilter;
- }
- if (m_pBuffer) {
- delete m_pBuffer;
- }
-}
-#define FPDF_FILTER_BUFFER_IN_SIZE FPDF_FILTER_BUFFER_SIZE
-FX_DWORD CPDF_StreamFilter::ReadBlock(FX_LPBYTE buffer, FX_DWORD buf_size)
-{
- if (m_pFilter == NULL) {
- FX_DWORD read_size = m_pStream->GetRawSize() - m_SrcOffset;
- if (read_size == 0) {
- return 0;
- }
- if (read_size > buf_size) {
- read_size = buf_size;
- }
- m_pStream->ReadRawData(m_SrcOffset, buffer, read_size);
- m_SrcOffset += read_size;
- return read_size;
- }
- FX_DWORD read_size = 0;
- if (m_pBuffer) {
- read_size = ReadLeftOver(buffer, buf_size);
- if (read_size == buf_size) {
- return read_size;
- }
- buffer += read_size;
- buf_size -= read_size;
- }
- ASSERT(m_pBuffer == NULL);
- if (m_pFilter->IsEOF()) {
- return read_size;
- }
- m_pBuffer = FX_NEW CFX_BinaryBuf;
- m_pBuffer->EstimateSize(FPDF_FILTER_BUFFER_SIZE, FPDF_FILTER_BUFFER_SIZE);
- m_BufOffset = 0;
- while (1) {
- int src_size = m_pStream->GetRawSize() - m_SrcOffset;
- if (src_size == 0) {
- m_pFilter->FilterFinish(*m_pBuffer);
- break;
- }
- if (src_size > FPDF_FILTER_BUFFER_IN_SIZE) {
- src_size = FPDF_FILTER_BUFFER_IN_SIZE;
- }
- if (!m_pStream->ReadRawData(m_SrcOffset, m_SrcBuffer, src_size)) {
- return 0;
- }
- m_SrcOffset += src_size;
- m_pFilter->FilterIn(m_SrcBuffer, src_size, *m_pBuffer);
- if (m_pBuffer->GetSize() >= (int)buf_size) {
- break;
- }
- }
- return read_size + ReadLeftOver(buffer, buf_size);
-}
-FX_DWORD CPDF_StreamFilter::ReadLeftOver(FX_LPBYTE buffer, FX_DWORD buf_size)
-{
- FX_DWORD read_size = m_pBuffer->GetSize() - m_BufOffset;
- if (read_size > buf_size) {
- read_size = buf_size;
- }
- FXSYS_memcpy32(buffer, m_pBuffer->GetBuffer() + m_BufOffset, read_size);
- m_BufOffset += read_size;
- if (m_BufOffset == (FX_DWORD)m_pBuffer->GetSize()) {
- delete m_pBuffer;
- m_pBuffer = NULL;
- }
- return read_size;
-}
-CPDF_DecryptFilter::CPDF_DecryptFilter(CPDF_CryptoHandler* pCryptoHandler, FX_DWORD objnum, FX_DWORD gennum)
-{
- m_pCryptoHandler = pCryptoHandler;
- m_pContext = NULL;
- m_ObjNum = objnum;
- m_GenNum = gennum;
-}
-CPDF_DecryptFilter::~CPDF_DecryptFilter()
-{
- CFX_BinaryBuf buf;
- if (m_pContext) {
- m_pCryptoHandler->DecryptFinish(m_pContext, buf);
- }
-}
-void CPDF_DecryptFilter::v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf)
-{
- if (m_pContext == NULL) {
- m_pContext = m_pCryptoHandler->DecryptStart(m_ObjNum, m_GenNum);
- }
- m_pCryptoHandler->DecryptStream(m_pContext, src_buf, src_size, dest_buf);
-}
-void CPDF_DecryptFilter::v_FilterFinish(CFX_BinaryBuf& dest_buf)
-{
- m_bEOF = TRUE;
- if (m_pContext == NULL) {
- return;
- }
- m_pCryptoHandler->DecryptFinish(m_pContext, dest_buf);
- m_pContext = NULL;
-}
-extern "C" {
- static void* my_alloc_func (void* opaque, unsigned int items, unsigned int size)
- {
- return FX_Alloc(FX_BYTE, items * size);
- }
- static void my_free_func (void* opaque, void* address)
- {
- FX_Free(address);
- }
- void* FPDFAPI_FlateInit(void* (*alloc_func)(void*, unsigned int, unsigned int),
- void (*free_func)(void*, void*));
- void FPDFAPI_FlateInput(void* context, const unsigned char* src_buf, unsigned int src_size);
- int FPDFAPI_FlateOutput(void* context, unsigned char* dest_buf, unsigned int dest_size);
- int FPDFAPI_FlateGetAvailIn(void* context);
- int FPDFAPI_FlateGetAvailOut(void* context);
- void FPDFAPI_FlateEnd(void* context);
-}
-CPDF_FlateFilter::CPDF_FlateFilter()
-{
- m_pContext = NULL;
-}
-CPDF_FlateFilter::~CPDF_FlateFilter()
-{
- if (m_pContext) {
- FPDFAPI_FlateEnd(m_pContext);
- }
-}
-void CPDF_FlateFilter::v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf)
-{
- if (m_pContext == NULL) {
- m_pContext = FPDFAPI_FlateInit(my_alloc_func, my_free_func);
- }
- FPDFAPI_FlateInput(m_pContext, src_buf, src_size);
- while (1) {
- int ret = FPDFAPI_FlateOutput(m_pContext, m_DestBuffer, FPDF_FILTER_BUFFER_SIZE);
- int out_size = FPDF_FILTER_BUFFER_SIZE - FPDFAPI_FlateGetAvailOut(m_pContext);
- dest_buf.AppendBlock(m_DestBuffer, out_size);
- if (ret == Z_BUF_ERROR) {
- break;
- }
- if (ret != Z_OK) {
- ReportEOF(FPDFAPI_FlateGetAvailIn(m_pContext));
- break;
- }
- }
-}
-CPDF_LzwFilter::CPDF_LzwFilter(FX_BOOL bEarlyChange)
-{
- m_bEarlyChange = bEarlyChange ? 1 : 0;
- m_CodeLen = 9;
- m_nCodes = 0;
- m_nLeftBits = 0;
- m_LeftBits = 0;
- m_OldCode = (FX_DWORD) - 1;
-}
-void CPDF_LzwFilter::v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf)
-{
- for (FX_DWORD i = 0; i < src_size; i ++) {
- if (m_nLeftBits + 8 < m_CodeLen) {
- m_nLeftBits += 8;
- m_LeftBits = (m_LeftBits << 8) | src_buf[i];
- continue;
- }
- FX_DWORD new_bits = m_CodeLen - m_nLeftBits;
- FX_DWORD code = (m_LeftBits << new_bits) | (src_buf[i] >> (8 - new_bits));
- m_nLeftBits = 8 - new_bits;
- m_LeftBits = src_buf[i] % (1 << m_nLeftBits);
- if (code < 256) {
- dest_buf.AppendByte((FX_BYTE)code);
- m_LastChar = (FX_BYTE)code;
- if (m_OldCode != -1) {
- AddCode(m_OldCode, m_LastChar);
- }
- m_OldCode = code;
- } else if (code == 256) {
- m_CodeLen = 9;
- m_nCodes = 0;
- m_OldCode = (FX_DWORD) - 1;
- } else if (code == 257) {
- ReportEOF(src_size - i - 1);
- return;
- } else {
- if (m_OldCode == -1) {
- ReportEOF(src_size - i - 1);
- return;
- }
- m_StackLen = 0;
- if (code >= m_nCodes + 258) {
- if (m_StackLen < sizeof(m_DecodeStack)) {
- m_DecodeStack[m_StackLen++] = m_LastChar;
- }
- DecodeString(m_OldCode);
- } else {
- DecodeString(code);
- }
- dest_buf.AppendBlock(NULL, m_StackLen);
- FX_LPBYTE pOutput = dest_buf.GetBuffer() + dest_buf.GetSize() - m_StackLen;
- for (FX_DWORD cc = 0; cc < m_StackLen; cc ++) {
- pOutput[cc] = m_DecodeStack[m_StackLen - cc - 1];
- }
- m_LastChar = m_DecodeStack[m_StackLen - 1];
- if (m_OldCode < 256) {
- AddCode(m_OldCode, m_LastChar);
- } else if (m_OldCode - 258 >= m_nCodes) {
- ReportEOF(src_size - i - 1);
- return;
- } else {
- AddCode(m_OldCode, m_LastChar);
- }
- m_OldCode = code;
- }
- }
-}
-void CPDF_LzwFilter::AddCode(FX_DWORD prefix_code, FX_BYTE append_char)
-{
- if (m_nCodes + m_bEarlyChange == 4094) {
- return;
- }
- m_CodeArray[m_nCodes ++] = (prefix_code << 16) | append_char;
- if (m_nCodes + m_bEarlyChange == 512 - 258) {
- m_CodeLen = 10;
- } else if (m_nCodes + m_bEarlyChange == 1024 - 258) {
- m_CodeLen = 11;
- } else if (m_nCodes + m_bEarlyChange == 2048 - 258) {
- m_CodeLen = 12;
- }
-}
-void CPDF_LzwFilter::DecodeString(FX_DWORD code)
-{
- while (1) {
- int index = code - 258;
- if (index < 0 || index >= (int)m_nCodes) {
- break;
- }
- FX_DWORD data = m_CodeArray[index];
- if (m_StackLen >= sizeof(m_DecodeStack)) {
- return;
- }
- m_DecodeStack[m_StackLen++] = (FX_BYTE)data;
- code = data >> 16;
- }
- if (m_StackLen >= sizeof(m_DecodeStack)) {
- return;
- }
- m_DecodeStack[m_StackLen++] = (FX_BYTE)code;
-}
-CPDF_PredictorFilter::CPDF_PredictorFilter(int predictor, int colors, int bpc, int cols)
-{
- m_bTiff = predictor < 10;
- m_pRefLine = NULL;
- m_pCurLine = NULL;
- m_iLine = 0;
- m_LineInSize = 0;
- m_Bpp = (colors * bpc + 7) / 8;
- m_Pitch = (colors * bpc * cols + 7) / 8;
- if (!m_bTiff) {
- m_Pitch ++;
- }
-}
-CPDF_PredictorFilter::~CPDF_PredictorFilter()
-{
- if (m_pCurLine) {
- FX_Free(m_pCurLine);
- }
- if (m_pRefLine) {
- FX_Free(m_pRefLine);
- }
-}
-static FX_BYTE PaethPredictor(int a, int b, int c)
-{
- int p = a + b - c;
- int pa = FXSYS_abs(p - a);
- int pb = FXSYS_abs(p - b);
- int pc = FXSYS_abs(p - c);
- if (pa <= pb && pa <= pc) {
- return (FX_BYTE)a;
- }
- if (pb <= pc) {
- return (FX_BYTE)b;
- }
- return (FX_BYTE)c;
-}
-static void PNG_PredictorLine(FX_LPBYTE cur_buf, FX_LPBYTE ref_buf, int pitch, int Bpp)
-{
- FX_BYTE tag = cur_buf[0];
- if (tag == 0) {
- return;
- }
- cur_buf ++;
- if (ref_buf) {
- ref_buf ++;
- }
- for (int byte = 0; byte < pitch; byte ++) {
- FX_BYTE raw_byte = cur_buf[byte];
- switch (tag) {
- case 1: {
- FX_BYTE left = 0;
- if (byte >= Bpp) {
- left = cur_buf[byte - Bpp];
- }
- cur_buf[byte] = raw_byte + left;
- break;
- }
- case 2: {
- FX_BYTE up = 0;
- if (ref_buf) {
- up = ref_buf[byte];
- }
- cur_buf[byte] = raw_byte + up;
- break;
- }
- case 3: {
- FX_BYTE left = 0;
- if (byte >= Bpp) {
- left = cur_buf[byte - Bpp];
- }
- FX_BYTE up = 0;
- if (ref_buf) {
- up = ref_buf[byte];
- }
- cur_buf[byte] = raw_byte + (up + left) / 2;
- break;
- }
- case 4: {
- FX_BYTE left = 0;
- if (byte >= Bpp) {
- left = cur_buf[byte - Bpp];
- }
- FX_BYTE up = 0;
- if (ref_buf) {
- up = ref_buf[byte];
- }
- FX_BYTE upper_left = 0;
- if (byte >= Bpp && ref_buf) {
- upper_left = ref_buf[byte - Bpp];
- }
- cur_buf[byte] = raw_byte + PaethPredictor(left, up, upper_left);
- break;
- }
- }
- }
-}
-void CPDF_PredictorFilter::v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf)
-{
- if (m_pCurLine == NULL) {
- m_pCurLine = FX_Alloc(FX_BYTE, m_Pitch);
- if (!m_bTiff) {
- m_pRefLine = FX_Alloc(FX_BYTE, m_Pitch);
- }
- }
- while (1) {
- FX_DWORD read_size = m_Pitch - m_LineInSize;
- if (read_size > src_size) {
- read_size = src_size;
- }
- FXSYS_memcpy32(m_pCurLine + m_LineInSize, src_buf, read_size);
- m_LineInSize += read_size;
- if (m_LineInSize < m_Pitch) {
- break;
- }
- src_buf += read_size;
- src_size -= read_size;
- if (m_bTiff) {
- for (FX_DWORD byte = m_Bpp; byte < m_Pitch; byte ++) {
- m_pCurLine[byte] += m_pCurLine[byte - m_Bpp];
- }
- dest_buf.AppendBlock(m_pCurLine, m_Pitch);
- } else {
- PNG_PredictorLine(m_pCurLine, m_iLine ? m_pRefLine : NULL, m_Pitch - 1, m_Bpp);
- dest_buf.AppendBlock(m_pCurLine + 1, m_Pitch - 1);
- m_iLine ++;
- FX_LPBYTE temp = m_pCurLine;
- m_pCurLine = m_pRefLine;
- m_pRefLine = temp;
- }
- m_LineInSize = 0;
- }
-}
-CPDF_Ascii85Filter::CPDF_Ascii85Filter()
-{
- m_State = 0;
- m_CharCount = 0;
-}
-extern const FX_LPCSTR _PDF_CharType;
-void CPDF_Ascii85Filter::v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf)
-{
- for (FX_DWORD i = 0; i < src_size; i ++) {
- FX_BYTE byte = src_buf[i];
- if (_PDF_CharType[byte] == 'W') {
- continue;
- }
- switch (m_State) {
- case 0:
- if (byte >= '!' && byte <= 'u') {
- int digit = byte - '!';
- m_CurDWord = digit;
- m_CharCount = 1;
- m_State = 1;
- } else if (byte == 'z') {
- int zero = 0;
- dest_buf.AppendBlock(&zero, 4);
- } else if (byte == '~') {
- m_State = 2;
- }
- break;
- case 1: {
- if (byte >= '!' && byte <= 'u') {
- int digit = byte - '!';
- m_CurDWord = m_CurDWord * 85 + digit;
- m_CharCount ++;
- if (m_CharCount == 5) {
- for (int i = 0; i < 4; i ++) {
- dest_buf.AppendByte((FX_BYTE)(m_CurDWord >> (3 - i) * 8));
- }
- m_State = 0;
- }
- } else if (byte == '~') {
- if (m_CharCount > 1) {
- int i;
- for (i = m_CharCount; i < 5; i ++) {
- m_CurDWord = m_CurDWord * 85 + 84;
- }
- for (i = 0; i < m_CharCount - 1; i ++) {
- dest_buf.AppendByte((FX_BYTE)(m_CurDWord >> (3 - i) * 8));
- }
- }
- m_State = 2;
- }
- break;
- }
- case 2:
- if (byte == '>') {
- ReportEOF(src_size - i - 1);
- return;
- }
- break;
- }
- }
-}
-CPDF_AsciiHexFilter::CPDF_AsciiHexFilter()
-{
- m_State = 0;
-}
-void CPDF_AsciiHexFilter::v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf)
-{
- for (FX_DWORD i = 0; i < src_size; i ++) {
- FX_BYTE byte = src_buf[i];
- if (_PDF_CharType[byte] == 'W') {
- continue;
- }
- int digit;
- if (byte >= '0' && byte <= '9') {
- digit = byte - '0';
- } else if (byte >= 'a' && byte <= 'f') {
- digit = byte - 'a' + 10;
- } else if (byte >= 'A' && byte <= 'F') {
- digit = byte - 'A' + 10;
- } else {
- if (m_State) {
- dest_buf.AppendByte(m_FirstDigit * 16);
- }
- ReportEOF(src_size - i - 1);
- return;
- }
- if (m_State == 0) {
- m_FirstDigit = digit;
- m_State ++;
- } else {
- dest_buf.AppendByte(m_FirstDigit * 16 + digit);
- m_State --;
- }
- }
-}
-CPDF_RunLenFilter::CPDF_RunLenFilter()
-{
- m_State = 0;
- m_Count = 0;
-}
-void CPDF_RunLenFilter::v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf)
-{
- for (FX_DWORD i = 0; i < src_size; i ++) {
- FX_BYTE byte = src_buf[i];
- switch (m_State) {
- case 0:
- if (byte < 128) {
- m_State = 1;
- m_Count = byte + 1;
- } else if (byte == 128) {
- ReportEOF(src_size - i - 1);
- return;
- } else {
- m_State = 2;
- m_Count = 257 - byte;
- }
- break;
- case 1:
- dest_buf.AppendByte(byte);
- m_Count --;
- if (m_Count == 0) {
- m_State = 0;
- }
- break;
- case 2: {
- dest_buf.AppendBlock(NULL, m_Count);
- FXSYS_memset8(dest_buf.GetBuffer() + dest_buf.GetSize() - m_Count, byte, m_Count);
- m_State = 0;
- break;
- }
- }
- }
-}
-CPDF_JpegFilter::CPDF_JpegFilter()
-{
- m_pContext = NULL;
- m_bGotHeader = FALSE;
- m_pScanline = NULL;
- m_iLine = 0;
-}
-CPDF_JpegFilter::~CPDF_JpegFilter()
-{
- if (m_pScanline) {
- FX_Free(m_pScanline);
- }
- if (m_pContext) {
- CPDF_ModuleMgr::Get()->GetJpegModule()->Finish(m_pContext);
- }
-}
-void CPDF_JpegFilter::v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf)
-{
- if (m_pContext == NULL) {
- m_pContext = CPDF_ModuleMgr::Get()->GetJpegModule()->Start();
- }
- FX_LPCBYTE jpeg_src_buf;
- FX_DWORD jpeg_src_size;
- CFX_BinaryBuf temp_buf;
- if (m_InputBuf.GetSize()) {
- temp_buf.EstimateSize(m_InputBuf.GetSize() + src_size);
- temp_buf.AppendBlock(m_InputBuf.GetBuffer(), m_InputBuf.GetSize());
- m_InputBuf.Clear();
- temp_buf.AppendBlock(src_buf, src_size);
- jpeg_src_buf = temp_buf.GetBuffer();
- jpeg_src_size = temp_buf.GetSize();
- } else {
- jpeg_src_buf = src_buf;
- jpeg_src_size = src_size;
- }
- CPDF_ModuleMgr::Get()->GetJpegModule()->Input(m_pContext, jpeg_src_buf, jpeg_src_size);
- if (!m_bGotHeader) {
- int ret = CPDF_ModuleMgr::Get()->GetJpegModule()->ReadHeader(m_pContext, &m_Width, &m_Height, &m_nComps);
- int left_size = CPDF_ModuleMgr::Get()->GetJpegModule()->GetAvailInput(m_pContext);
- if (ret == 1) {
- ReportEOF(left_size);
- return;
- }
- if (ret == 2) {
- m_InputBuf.AppendBlock(jpeg_src_buf + jpeg_src_size - left_size, left_size);
- return;
- }
- CPDF_ModuleMgr::Get()->GetJpegModule()->StartScanline(m_pContext, 1);
- m_bGotHeader = TRUE;
- m_Pitch = m_Width * m_nComps;
- }
- if (m_pScanline == NULL) {
- m_pScanline = FX_Alloc(FX_BYTE, m_Pitch + 4);
- }
- while (1) {
- if (!CPDF_ModuleMgr::Get()->GetJpegModule()->ReadScanline(m_pContext, m_pScanline)) {
- int left_size = CPDF_ModuleMgr::Get()->GetJpegModule()->GetAvailInput(m_pContext);
- m_InputBuf.AppendBlock(jpeg_src_buf + jpeg_src_size - left_size, left_size);
- break;
- }
- dest_buf.AppendBlock(m_pScanline, m_Pitch);
- m_iLine ++;
- if (m_iLine == m_Height) {
- ReportEOF(CPDF_ModuleMgr::Get()->GetJpegModule()->GetAvailInput(m_pContext));
- return;
- }
- }
-}
-CPDF_FaxFilter::CPDF_FaxFilter()
-{
- m_Encoding = 0;
- m_bEndOfLine = FALSE;
- m_bByteAlign = FALSE;
- m_bBlack = FALSE;
- m_nRows = 0;
- m_nColumns = 0;
- m_Pitch = 0;
- m_pScanlineBuf = NULL;
- m_pRefBuf = NULL;
- m_iRow = 0;
- m_InputBitPos = 0;
-}
-CPDF_FaxFilter::~CPDF_FaxFilter()
-{
- if (m_pScanlineBuf) {
- FX_Free(m_pScanlineBuf);
- }
- if (m_pRefBuf) {
- FX_Free(m_pRefBuf);
- }
-}
-FX_BOOL CPDF_FaxFilter::Initialize(int Encoding, int bEndOfLine, int bByteAlign, int bBlack, int nRows, int nColumns)
-{
- m_Encoding = Encoding;
- m_bEndOfLine = bEndOfLine;
- m_bByteAlign = bByteAlign;
- m_bBlack = bBlack;
- m_nRows = nRows;
- m_nColumns = nColumns;
- m_Pitch = (m_nColumns + 7) / 8;
- m_pScanlineBuf = FX_Alloc(FX_BYTE, m_Pitch);
- m_pRefBuf = FX_Alloc(FX_BYTE, m_Pitch);
- FXSYS_memset8(m_pScanlineBuf, 0xff, m_Pitch);
- FXSYS_memset8(m_pRefBuf, 0xff, m_Pitch);
- m_iRow = 0;
- m_InputBitPos = 0;
- return TRUE;
-}
-void CPDF_FaxFilter::v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf)
-{
- FX_LPCBYTE fax_src_buf;
- FX_DWORD fax_src_size;
- CFX_BinaryBuf temp_buf;
- int bitpos;
- if (m_InputBuf.GetSize()) {
- temp_buf.EstimateSize(m_InputBuf.GetSize() + src_size);
- temp_buf.AppendBlock(m_InputBuf.GetBuffer(), m_InputBuf.GetSize());
- m_InputBuf.Clear();
- temp_buf.AppendBlock(src_buf, src_size);
- fax_src_buf = temp_buf.GetBuffer();
- fax_src_size = temp_buf.GetSize();
- bitpos = m_InputBitPos;
- } else {
- fax_src_buf = src_buf;
- fax_src_size = src_size;
- bitpos = 0;
- }
- ProcessData(fax_src_buf, fax_src_size, bitpos, FALSE, dest_buf);
- int left_bits = fax_src_size * 8 - bitpos;
- m_InputBuf.AppendBlock(fax_src_buf + bitpos / 8, (left_bits + 7) / 8);
- m_InputBitPos = bitpos % 8;
-}
-void CPDF_FaxFilter::v_FilterFinish(CFX_BinaryBuf& dest_buf)
-{
- ProcessData(m_InputBuf.GetBuffer(), m_InputBuf.GetSize(), m_InputBitPos, TRUE, dest_buf);
-}
-FX_BOOL _FaxSkipEOL(const FX_BYTE* src_buf, int bitsize, int& bitpos);
-FX_BOOL _FaxG4GetRow(const FX_BYTE* src_buf, int bitsize, int& bitpos, FX_LPBYTE dest_buf, const FX_BYTE* ref_buf, int columns);
-FX_BOOL _FaxGet1DLine(const FX_BYTE* src_buf, int bitsize, int& bitpos, FX_LPBYTE dest_buf, int columns);
-void CPDF_FaxFilter::ProcessData(FX_LPCBYTE src_buf, FX_DWORD src_size, int& bitpos, FX_BOOL bFinish,
- CFX_BinaryBuf& dest_buf)
-{
- int bitsize = src_size * 8;
- while (1) {
- if ((bitsize < bitpos + 256) && !bFinish) {
- return;
- }
- int start_bitpos = bitpos;
- FXSYS_memset8(m_pScanlineBuf, 0xff, m_Pitch);
- if (!ReadLine(src_buf, bitsize, bitpos)) {
- bitpos = start_bitpos;
- return;
- }
- if (m_Encoding) {
- FXSYS_memcpy32(m_pRefBuf, m_pScanlineBuf, m_Pitch);
- }
- if (m_bBlack) {
- for (int i = 0; i < m_Pitch; i ++) {
- m_pScanlineBuf[i] = ~m_pScanlineBuf[i];
- }
- }
- dest_buf.AppendBlock(m_pScanlineBuf, m_Pitch);
- m_iRow ++;
- if (m_iRow == m_nRows) {
- ReportEOF(src_size - (bitpos + 7) / 8);
- return;
- }
- }
-}
-FX_BOOL CPDF_FaxFilter::ReadLine(FX_LPCBYTE src_buf, int bitsize, int& bitpos)
-{
- if (!_FaxSkipEOL(src_buf, bitsize, bitpos)) {
- return FALSE;
- }
- FX_BOOL ret;
- if (m_Encoding < 0) {
- ret = _FaxG4GetRow(src_buf, bitsize, bitpos, m_pScanlineBuf, m_pRefBuf, m_nColumns);
- } else if (m_Encoding == 0) {
- ret = _FaxGet1DLine(src_buf, bitsize, bitpos, m_pScanlineBuf, m_nColumns);
- } else {
- if (bitpos == bitsize) {
- return FALSE;
- }
- FX_BOOL bNext1D = src_buf[bitpos / 8] & (1 << (7 - bitpos % 8));
- bitpos ++;
- if (bNext1D) {
- ret = _FaxGet1DLine(src_buf, bitsize, bitpos, m_pScanlineBuf, m_nColumns);
- } else {
- ret = _FaxG4GetRow(src_buf, bitsize, bitpos, m_pScanlineBuf, m_pRefBuf, m_nColumns);
- }
- }
- if (!ret) {
- return FALSE;
- }
- if (m_bEndOfLine)
- if (!_FaxSkipEOL(src_buf, bitsize, bitpos)) {
- return FALSE;
- }
- if (m_bByteAlign) {
- bitpos = (bitpos + 7) / 8 * 8;
- }
- return TRUE;
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../fx_zlib.h"
+#include "../../../include/fpdfapi/fpdf_parser.h"
+#include "../../../include/fxcodec/fx_codec.h"
+#include "../../../include/fpdfapi/fpdf_module.h"
+#include "filters_int.h"
+CFX_DataFilter::CFX_DataFilter()
+{
+ m_bEOF = FALSE;
+ m_pDestFilter = NULL;
+ m_SrcPos = 0;
+}
+CFX_DataFilter::~CFX_DataFilter()
+{
+ if (m_pDestFilter) {
+ delete m_pDestFilter;
+ }
+}
+void CFX_DataFilter::SetDestFilter(CFX_DataFilter* pFilter)
+{
+ if (m_pDestFilter) {
+ m_pDestFilter->SetDestFilter(pFilter);
+ } else {
+ m_pDestFilter = pFilter;
+ }
+}
+void CFX_DataFilter::FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf)
+{
+ if (m_bEOF) {
+ return;
+ }
+ m_SrcPos += src_size;
+ if (m_pDestFilter) {
+ CFX_BinaryBuf temp_buf;
+ temp_buf.EstimateSize(FPDF_FILTER_BUFFER_SIZE, FPDF_FILTER_BUFFER_SIZE);
+ v_FilterIn(src_buf, src_size, temp_buf);
+ m_pDestFilter->FilterIn(temp_buf.GetBuffer(), temp_buf.GetSize(), dest_buf);
+ } else {
+ v_FilterIn(src_buf, src_size, dest_buf);
+ }
+}
+void CFX_DataFilter::FilterFinish(CFX_BinaryBuf& dest_buf)
+{
+ if (m_pDestFilter) {
+ CFX_BinaryBuf temp_buf;
+ v_FilterFinish(temp_buf);
+ if (temp_buf.GetSize()) {
+ m_pDestFilter->FilterIn(temp_buf.GetBuffer(), temp_buf.GetSize(), dest_buf);
+ }
+ m_pDestFilter->FilterFinish(dest_buf);
+ } else {
+ v_FilterFinish(dest_buf);
+ }
+ m_bEOF = TRUE;
+}
+void CFX_DataFilter::ReportEOF(FX_DWORD left_input)
+{
+ if (m_bEOF) {
+ return;
+ }
+ m_bEOF = TRUE;
+ m_SrcPos -= left_input;
+}
+CFX_DataFilter* FPDF_CreateFilter(FX_BSTR name, const CPDF_Dictionary* pParam, int width, int height)
+{
+ FX_DWORD id = name.GetID();
+ switch (id) {
+ case FXBSTR_ID('F', 'l', 'a', 't'):
+ case FXBSTR_ID('F', 'l', 0, 0):
+ case FXBSTR_ID('L', 'Z', 'W', 'D'):
+ case FXBSTR_ID('L', 'Z', 'W', 0): {
+ CFX_DataFilter* pFilter;
+ if (id == FXBSTR_ID('L', 'Z', 'W', 'D') || id == FXBSTR_ID('L', 'Z', 'W', 0)) {
+ pFilter = FX_NEW CPDF_LzwFilter(pParam->GetInteger("EarlyChange", 1));
+ } else {
+ pFilter = FX_NEW CPDF_FlateFilter;
+ }
+ if (pParam->GetInteger("Predictor", 1) > 1) {
+ CFX_DataFilter* pPredictor = FX_NEW CPDF_PredictorFilter(pParam->GetInteger(FX_BSTRC("Predictor"), 1),
+ pParam->GetInteger(FX_BSTRC("Colors"), 1), pParam->GetInteger(FX_BSTRC("BitsPerComponent"), 8),
+ pParam->GetInteger(FX_BSTRC("Columns"), 1));
+ pFilter->SetDestFilter(pPredictor);
+ }
+ return pFilter;
+ }
+ case FXBSTR_ID('A', 'S', 'C', 'I'):
+ if (name == "ASCIIHexDecode") {
+ return FX_NEW CPDF_AsciiHexFilter;
+ }
+ return FX_NEW CPDF_Ascii85Filter;
+ case FXBSTR_ID('A', 'H', 'x', 0):
+ return FX_NEW CPDF_AsciiHexFilter;
+ case FXBSTR_ID('A', '8', '5', 0):
+ return FX_NEW CPDF_Ascii85Filter;
+ case FXBSTR_ID('R', 'u', 'n', 'L'):
+ return FX_NEW CPDF_RunLenFilter;
+ case FXBSTR_ID('C', 'C', 'I', 'T'): {
+ int Encoding = 0;
+ int bEndOfLine = FALSE;
+ int bByteAlign = FALSE;
+ int bBlack = FALSE;
+ int nRows = 0;
+ int nColumns = 1728;
+ if (pParam) {
+ Encoding = pParam->GetInteger(FX_BSTRC("K"));
+ bEndOfLine = pParam->GetInteger(FX_BSTRC("EndOfLine"));
+ bByteAlign = pParam->GetInteger(FX_BSTRC("EncodedByteAlign"));
+ bBlack = pParam->GetInteger(FX_BSTRC("BlackIs1"));
+ nColumns = pParam->GetInteger(FX_BSTRC("Columns"), 1728);
+ nRows = pParam->GetInteger(FX_BSTRC("Rows"));
+ }
+ if (nColumns == 0) {
+ nColumns = width;
+ }
+ if (nRows == 0) {
+ nRows = height;
+ }
+ CPDF_FaxFilter* pFilter = FX_NEW CPDF_FaxFilter();
+ pFilter->Initialize(Encoding, bEndOfLine, bByteAlign, bBlack, nRows, nColumns);
+ return pFilter;
+ }
+ case FXBSTR_ID('D', 'C', 'T', 'D'):
+ return FX_NEW CPDF_JpegFilter;
+ default:
+ return NULL;
+ }
+}
+CFX_DataFilter* _FPDF_CreateFilterFromDict(CPDF_Dictionary* pDict)
+{
+ CPDF_Object* pDecoder = pDict->GetElementValue("Filter");
+ if (pDecoder == NULL) {
+ return NULL;
+ }
+ CFX_DataFilter* pFirstFilter = NULL;
+ int width = pDict->GetInteger(FX_BSTRC("Width")), height = pDict->GetInteger(FX_BSTRC("Height"));
+ CPDF_Object* pParams = pDict->GetElementValue("DecodeParms");
+ if (pDecoder->GetType() == PDFOBJ_ARRAY) {
+ if (pParams && pParams->GetType() != PDFOBJ_ARRAY) {
+ pParams = NULL;
+ }
+ for (FX_DWORD i = 0; i < ((CPDF_Array*)pDecoder)->GetCount(); i ++) {
+ CFX_ByteString name = ((CPDF_Array*)pDecoder)->GetString(i);
+ CPDF_Dictionary* pParam = NULL;
+ if (pParams) {
+ pParam = ((CPDF_Array*)pParams)->GetDict(i);
+ }
+ CFX_DataFilter* pDestFilter = FPDF_CreateFilter(name, pParam, width, height);
+ if (pDestFilter) {
+ if (pFirstFilter == NULL) {
+ pFirstFilter = pDestFilter;
+ } else {
+ pFirstFilter->SetDestFilter(pDestFilter);
+ }
+ }
+ }
+ } else {
+ if (pParams && pParams->GetType() != PDFOBJ_DICTIONARY) {
+ pParams = NULL;
+ }
+ pFirstFilter = FPDF_CreateFilter(pDecoder->GetString(), (CPDF_Dictionary*)pParams, width, height);
+ }
+ return pFirstFilter;
+}
+CPDF_StreamFilter* CPDF_Stream::GetStreamFilter(FX_BOOL bRaw) const
+{
+ CFX_DataFilter* pFirstFilter = NULL;
+ if (m_pCryptoHandler) {
+ pFirstFilter = FX_NEW CPDF_DecryptFilter(m_pCryptoHandler, m_ObjNum, m_GenNum);
+ }
+ if (!bRaw) {
+ CFX_DataFilter* pFilter = _FPDF_CreateFilterFromDict(m_pDict);
+ if (pFilter) {
+ if (pFirstFilter == NULL) {
+ pFirstFilter = pFilter;
+ } else {
+ pFirstFilter->SetDestFilter(pFilter);
+ }
+ }
+ }
+ CPDF_StreamFilter* pStreamFilter = FX_NEW CPDF_StreamFilter;
+ pStreamFilter->m_pStream = this;
+ pStreamFilter->m_pFilter = pFirstFilter;
+ pStreamFilter->m_pBuffer = NULL;
+ pStreamFilter->m_SrcOffset = 0;
+ return pStreamFilter;
+}
+CPDF_StreamFilter::~CPDF_StreamFilter()
+{
+ if (m_pFilter) {
+ delete m_pFilter;
+ }
+ if (m_pBuffer) {
+ delete m_pBuffer;
+ }
+}
+#define FPDF_FILTER_BUFFER_IN_SIZE FPDF_FILTER_BUFFER_SIZE
+FX_DWORD CPDF_StreamFilter::ReadBlock(FX_LPBYTE buffer, FX_DWORD buf_size)
+{
+ if (m_pFilter == NULL) {
+ FX_DWORD read_size = m_pStream->GetRawSize() - m_SrcOffset;
+ if (read_size == 0) {
+ return 0;
+ }
+ if (read_size > buf_size) {
+ read_size = buf_size;
+ }
+ m_pStream->ReadRawData(m_SrcOffset, buffer, read_size);
+ m_SrcOffset += read_size;
+ return read_size;
+ }
+ FX_DWORD read_size = 0;
+ if (m_pBuffer) {
+ read_size = ReadLeftOver(buffer, buf_size);
+ if (read_size == buf_size) {
+ return read_size;
+ }
+ buffer += read_size;
+ buf_size -= read_size;
+ }
+ ASSERT(m_pBuffer == NULL);
+ if (m_pFilter->IsEOF()) {
+ return read_size;
+ }
+ m_pBuffer = FX_NEW CFX_BinaryBuf;
+ m_pBuffer->EstimateSize(FPDF_FILTER_BUFFER_SIZE, FPDF_FILTER_BUFFER_SIZE);
+ m_BufOffset = 0;
+ while (1) {
+ int src_size = m_pStream->GetRawSize() - m_SrcOffset;
+ if (src_size == 0) {
+ m_pFilter->FilterFinish(*m_pBuffer);
+ break;
+ }
+ if (src_size > FPDF_FILTER_BUFFER_IN_SIZE) {
+ src_size = FPDF_FILTER_BUFFER_IN_SIZE;
+ }
+ if (!m_pStream->ReadRawData(m_SrcOffset, m_SrcBuffer, src_size)) {
+ return 0;
+ }
+ m_SrcOffset += src_size;
+ m_pFilter->FilterIn(m_SrcBuffer, src_size, *m_pBuffer);
+ if (m_pBuffer->GetSize() >= (int)buf_size) {
+ break;
+ }
+ }
+ return read_size + ReadLeftOver(buffer, buf_size);
+}
+FX_DWORD CPDF_StreamFilter::ReadLeftOver(FX_LPBYTE buffer, FX_DWORD buf_size)
+{
+ FX_DWORD read_size = m_pBuffer->GetSize() - m_BufOffset;
+ if (read_size > buf_size) {
+ read_size = buf_size;
+ }
+ FXSYS_memcpy32(buffer, m_pBuffer->GetBuffer() + m_BufOffset, read_size);
+ m_BufOffset += read_size;
+ if (m_BufOffset == (FX_DWORD)m_pBuffer->GetSize()) {
+ delete m_pBuffer;
+ m_pBuffer = NULL;
+ }
+ return read_size;
+}
+CPDF_DecryptFilter::CPDF_DecryptFilter(CPDF_CryptoHandler* pCryptoHandler, FX_DWORD objnum, FX_DWORD gennum)
+{
+ m_pCryptoHandler = pCryptoHandler;
+ m_pContext = NULL;
+ m_ObjNum = objnum;
+ m_GenNum = gennum;
+}
+CPDF_DecryptFilter::~CPDF_DecryptFilter()
+{
+ CFX_BinaryBuf buf;
+ if (m_pContext) {
+ m_pCryptoHandler->DecryptFinish(m_pContext, buf);
+ }
+}
+void CPDF_DecryptFilter::v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf)
+{
+ if (m_pContext == NULL) {
+ m_pContext = m_pCryptoHandler->DecryptStart(m_ObjNum, m_GenNum);
+ }
+ m_pCryptoHandler->DecryptStream(m_pContext, src_buf, src_size, dest_buf);
+}
+void CPDF_DecryptFilter::v_FilterFinish(CFX_BinaryBuf& dest_buf)
+{
+ m_bEOF = TRUE;
+ if (m_pContext == NULL) {
+ return;
+ }
+ m_pCryptoHandler->DecryptFinish(m_pContext, dest_buf);
+ m_pContext = NULL;
+}
+extern "C" {
+ static void* my_alloc_func (void* opaque, unsigned int items, unsigned int size)
+ {
+ return FX_Alloc(FX_BYTE, items * size);
+ }
+ static void my_free_func (void* opaque, void* address)
+ {
+ FX_Free(address);
+ }
+ void* FPDFAPI_FlateInit(void* (*alloc_func)(void*, unsigned int, unsigned int),
+ void (*free_func)(void*, void*));
+ void FPDFAPI_FlateInput(void* context, const unsigned char* src_buf, unsigned int src_size);
+ int FPDFAPI_FlateOutput(void* context, unsigned char* dest_buf, unsigned int dest_size);
+ int FPDFAPI_FlateGetAvailIn(void* context);
+ int FPDFAPI_FlateGetAvailOut(void* context);
+ void FPDFAPI_FlateEnd(void* context);
+}
+CPDF_FlateFilter::CPDF_FlateFilter()
+{
+ m_pContext = NULL;
+}
+CPDF_FlateFilter::~CPDF_FlateFilter()
+{
+ if (m_pContext) {
+ FPDFAPI_FlateEnd(m_pContext);
+ }
+}
+void CPDF_FlateFilter::v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf)
+{
+ if (m_pContext == NULL) {
+ m_pContext = FPDFAPI_FlateInit(my_alloc_func, my_free_func);
+ }
+ FPDFAPI_FlateInput(m_pContext, src_buf, src_size);
+ while (1) {
+ int ret = FPDFAPI_FlateOutput(m_pContext, m_DestBuffer, FPDF_FILTER_BUFFER_SIZE);
+ int out_size = FPDF_FILTER_BUFFER_SIZE - FPDFAPI_FlateGetAvailOut(m_pContext);
+ dest_buf.AppendBlock(m_DestBuffer, out_size);
+ if (ret == Z_BUF_ERROR) {
+ break;
+ }
+ if (ret != Z_OK) {
+ ReportEOF(FPDFAPI_FlateGetAvailIn(m_pContext));
+ break;
+ }
+ }
+}
+CPDF_LzwFilter::CPDF_LzwFilter(FX_BOOL bEarlyChange)
+{
+ m_bEarlyChange = bEarlyChange ? 1 : 0;
+ m_CodeLen = 9;
+ m_nCodes = 0;
+ m_nLeftBits = 0;
+ m_LeftBits = 0;
+ m_OldCode = (FX_DWORD) - 1;
+}
+void CPDF_LzwFilter::v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf)
+{
+ for (FX_DWORD i = 0; i < src_size; i ++) {
+ if (m_nLeftBits + 8 < m_CodeLen) {
+ m_nLeftBits += 8;
+ m_LeftBits = (m_LeftBits << 8) | src_buf[i];
+ continue;
+ }
+ FX_DWORD new_bits = m_CodeLen - m_nLeftBits;
+ FX_DWORD code = (m_LeftBits << new_bits) | (src_buf[i] >> (8 - new_bits));
+ m_nLeftBits = 8 - new_bits;
+ m_LeftBits = src_buf[i] % (1 << m_nLeftBits);
+ if (code < 256) {
+ dest_buf.AppendByte((FX_BYTE)code);
+ m_LastChar = (FX_BYTE)code;
+ if (m_OldCode != -1) {
+ AddCode(m_OldCode, m_LastChar);
+ }
+ m_OldCode = code;
+ } else if (code == 256) {
+ m_CodeLen = 9;
+ m_nCodes = 0;
+ m_OldCode = (FX_DWORD) - 1;
+ } else if (code == 257) {
+ ReportEOF(src_size - i - 1);
+ return;
+ } else {
+ if (m_OldCode == -1) {
+ ReportEOF(src_size - i - 1);
+ return;
+ }
+ m_StackLen = 0;
+ if (code >= m_nCodes + 258) {
+ if (m_StackLen < sizeof(m_DecodeStack)) {
+ m_DecodeStack[m_StackLen++] = m_LastChar;
+ }
+ DecodeString(m_OldCode);
+ } else {
+ DecodeString(code);
+ }
+ dest_buf.AppendBlock(NULL, m_StackLen);
+ FX_LPBYTE pOutput = dest_buf.GetBuffer() + dest_buf.GetSize() - m_StackLen;
+ for (FX_DWORD cc = 0; cc < m_StackLen; cc ++) {
+ pOutput[cc] = m_DecodeStack[m_StackLen - cc - 1];
+ }
+ m_LastChar = m_DecodeStack[m_StackLen - 1];
+ if (m_OldCode < 256) {
+ AddCode(m_OldCode, m_LastChar);
+ } else if (m_OldCode - 258 >= m_nCodes) {
+ ReportEOF(src_size - i - 1);
+ return;
+ } else {
+ AddCode(m_OldCode, m_LastChar);
+ }
+ m_OldCode = code;
+ }
+ }
+}
+void CPDF_LzwFilter::AddCode(FX_DWORD prefix_code, FX_BYTE append_char)
+{
+ if (m_nCodes + m_bEarlyChange == 4094) {
+ return;
+ }
+ m_CodeArray[m_nCodes ++] = (prefix_code << 16) | append_char;
+ if (m_nCodes + m_bEarlyChange == 512 - 258) {
+ m_CodeLen = 10;
+ } else if (m_nCodes + m_bEarlyChange == 1024 - 258) {
+ m_CodeLen = 11;
+ } else if (m_nCodes + m_bEarlyChange == 2048 - 258) {
+ m_CodeLen = 12;
+ }
+}
+void CPDF_LzwFilter::DecodeString(FX_DWORD code)
+{
+ while (1) {
+ int index = code - 258;
+ if (index < 0 || index >= (int)m_nCodes) {
+ break;
+ }
+ FX_DWORD data = m_CodeArray[index];
+ if (m_StackLen >= sizeof(m_DecodeStack)) {
+ return;
+ }
+ m_DecodeStack[m_StackLen++] = (FX_BYTE)data;
+ code = data >> 16;
+ }
+ if (m_StackLen >= sizeof(m_DecodeStack)) {
+ return;
+ }
+ m_DecodeStack[m_StackLen++] = (FX_BYTE)code;
+}
+CPDF_PredictorFilter::CPDF_PredictorFilter(int predictor, int colors, int bpc, int cols)
+{
+ m_bTiff = predictor < 10;
+ m_pRefLine = NULL;
+ m_pCurLine = NULL;
+ m_iLine = 0;
+ m_LineInSize = 0;
+ m_Bpp = (colors * bpc + 7) / 8;
+ m_Pitch = (colors * bpc * cols + 7) / 8;
+ if (!m_bTiff) {
+ m_Pitch ++;
+ }
+}
+CPDF_PredictorFilter::~CPDF_PredictorFilter()
+{
+ if (m_pCurLine) {
+ FX_Free(m_pCurLine);
+ }
+ if (m_pRefLine) {
+ FX_Free(m_pRefLine);
+ }
+}
+static FX_BYTE PaethPredictor(int a, int b, int c)
+{
+ int p = a + b - c;
+ int pa = FXSYS_abs(p - a);
+ int pb = FXSYS_abs(p - b);
+ int pc = FXSYS_abs(p - c);
+ if (pa <= pb && pa <= pc) {
+ return (FX_BYTE)a;
+ }
+ if (pb <= pc) {
+ return (FX_BYTE)b;
+ }
+ return (FX_BYTE)c;
+}
+static void PNG_PredictorLine(FX_LPBYTE cur_buf, FX_LPBYTE ref_buf, int pitch, int Bpp)
+{
+ FX_BYTE tag = cur_buf[0];
+ if (tag == 0) {
+ return;
+ }
+ cur_buf ++;
+ if (ref_buf) {
+ ref_buf ++;
+ }
+ for (int byte = 0; byte < pitch; byte ++) {
+ FX_BYTE raw_byte = cur_buf[byte];
+ switch (tag) {
+ case 1: {
+ FX_BYTE left = 0;
+ if (byte >= Bpp) {
+ left = cur_buf[byte - Bpp];
+ }
+ cur_buf[byte] = raw_byte + left;
+ break;
+ }
+ case 2: {
+ FX_BYTE up = 0;
+ if (ref_buf) {
+ up = ref_buf[byte];
+ }
+ cur_buf[byte] = raw_byte + up;
+ break;
+ }
+ case 3: {
+ FX_BYTE left = 0;
+ if (byte >= Bpp) {
+ left = cur_buf[byte - Bpp];
+ }
+ FX_BYTE up = 0;
+ if (ref_buf) {
+ up = ref_buf[byte];
+ }
+ cur_buf[byte] = raw_byte + (up + left) / 2;
+ break;
+ }
+ case 4: {
+ FX_BYTE left = 0;
+ if (byte >= Bpp) {
+ left = cur_buf[byte - Bpp];
+ }
+ FX_BYTE up = 0;
+ if (ref_buf) {
+ up = ref_buf[byte];
+ }
+ FX_BYTE upper_left = 0;
+ if (byte >= Bpp && ref_buf) {
+ upper_left = ref_buf[byte - Bpp];
+ }
+ cur_buf[byte] = raw_byte + PaethPredictor(left, up, upper_left);
+ break;
+ }
+ }
+ }
+}
+void CPDF_PredictorFilter::v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf)
+{
+ if (m_pCurLine == NULL) {
+ m_pCurLine = FX_Alloc(FX_BYTE, m_Pitch);
+ if (!m_bTiff) {
+ m_pRefLine = FX_Alloc(FX_BYTE, m_Pitch);
+ }
+ }
+ while (1) {
+ FX_DWORD read_size = m_Pitch - m_LineInSize;
+ if (read_size > src_size) {
+ read_size = src_size;
+ }
+ FXSYS_memcpy32(m_pCurLine + m_LineInSize, src_buf, read_size);
+ m_LineInSize += read_size;
+ if (m_LineInSize < m_Pitch) {
+ break;
+ }
+ src_buf += read_size;
+ src_size -= read_size;
+ if (m_bTiff) {
+ for (FX_DWORD byte = m_Bpp; byte < m_Pitch; byte ++) {
+ m_pCurLine[byte] += m_pCurLine[byte - m_Bpp];
+ }
+ dest_buf.AppendBlock(m_pCurLine, m_Pitch);
+ } else {
+ PNG_PredictorLine(m_pCurLine, m_iLine ? m_pRefLine : NULL, m_Pitch - 1, m_Bpp);
+ dest_buf.AppendBlock(m_pCurLine + 1, m_Pitch - 1);
+ m_iLine ++;
+ FX_LPBYTE temp = m_pCurLine;
+ m_pCurLine = m_pRefLine;
+ m_pRefLine = temp;
+ }
+ m_LineInSize = 0;
+ }
+}
+CPDF_Ascii85Filter::CPDF_Ascii85Filter()
+{
+ m_State = 0;
+ m_CharCount = 0;
+}
+extern const FX_LPCSTR _PDF_CharType;
+void CPDF_Ascii85Filter::v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf)
+{
+ for (FX_DWORD i = 0; i < src_size; i ++) {
+ FX_BYTE byte = src_buf[i];
+ if (_PDF_CharType[byte] == 'W') {
+ continue;
+ }
+ switch (m_State) {
+ case 0:
+ if (byte >= '!' && byte <= 'u') {
+ int digit = byte - '!';
+ m_CurDWord = digit;
+ m_CharCount = 1;
+ m_State = 1;
+ } else if (byte == 'z') {
+ int zero = 0;
+ dest_buf.AppendBlock(&zero, 4);
+ } else if (byte == '~') {
+ m_State = 2;
+ }
+ break;
+ case 1: {
+ if (byte >= '!' && byte <= 'u') {
+ int digit = byte - '!';
+ m_CurDWord = m_CurDWord * 85 + digit;
+ m_CharCount ++;
+ if (m_CharCount == 5) {
+ for (int i = 0; i < 4; i ++) {
+ dest_buf.AppendByte((FX_BYTE)(m_CurDWord >> (3 - i) * 8));
+ }
+ m_State = 0;
+ }
+ } else if (byte == '~') {
+ if (m_CharCount > 1) {
+ int i;
+ for (i = m_CharCount; i < 5; i ++) {
+ m_CurDWord = m_CurDWord * 85 + 84;
+ }
+ for (i = 0; i < m_CharCount - 1; i ++) {
+ dest_buf.AppendByte((FX_BYTE)(m_CurDWord >> (3 - i) * 8));
+ }
+ }
+ m_State = 2;
+ }
+ break;
+ }
+ case 2:
+ if (byte == '>') {
+ ReportEOF(src_size - i - 1);
+ return;
+ }
+ break;
+ }
+ }
+}
+CPDF_AsciiHexFilter::CPDF_AsciiHexFilter()
+{
+ m_State = 0;
+}
+void CPDF_AsciiHexFilter::v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf)
+{
+ for (FX_DWORD i = 0; i < src_size; i ++) {
+ FX_BYTE byte = src_buf[i];
+ if (_PDF_CharType[byte] == 'W') {
+ continue;
+ }
+ int digit;
+ if (byte >= '0' && byte <= '9') {
+ digit = byte - '0';
+ } else if (byte >= 'a' && byte <= 'f') {
+ digit = byte - 'a' + 10;
+ } else if (byte >= 'A' && byte <= 'F') {
+ digit = byte - 'A' + 10;
+ } else {
+ if (m_State) {
+ dest_buf.AppendByte(m_FirstDigit * 16);
+ }
+ ReportEOF(src_size - i - 1);
+ return;
+ }
+ if (m_State == 0) {
+ m_FirstDigit = digit;
+ m_State ++;
+ } else {
+ dest_buf.AppendByte(m_FirstDigit * 16 + digit);
+ m_State --;
+ }
+ }
+}
+CPDF_RunLenFilter::CPDF_RunLenFilter()
+{
+ m_State = 0;
+ m_Count = 0;
+}
+void CPDF_RunLenFilter::v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf)
+{
+ for (FX_DWORD i = 0; i < src_size; i ++) {
+ FX_BYTE byte = src_buf[i];
+ switch (m_State) {
+ case 0:
+ if (byte < 128) {
+ m_State = 1;
+ m_Count = byte + 1;
+ } else if (byte == 128) {
+ ReportEOF(src_size - i - 1);
+ return;
+ } else {
+ m_State = 2;
+ m_Count = 257 - byte;
+ }
+ break;
+ case 1:
+ dest_buf.AppendByte(byte);
+ m_Count --;
+ if (m_Count == 0) {
+ m_State = 0;
+ }
+ break;
+ case 2: {
+ dest_buf.AppendBlock(NULL, m_Count);
+ FXSYS_memset8(dest_buf.GetBuffer() + dest_buf.GetSize() - m_Count, byte, m_Count);
+ m_State = 0;
+ break;
+ }
+ }
+ }
+}
+CPDF_JpegFilter::CPDF_JpegFilter()
+{
+ m_pContext = NULL;
+ m_bGotHeader = FALSE;
+ m_pScanline = NULL;
+ m_iLine = 0;
+}
+CPDF_JpegFilter::~CPDF_JpegFilter()
+{
+ if (m_pScanline) {
+ FX_Free(m_pScanline);
+ }
+ if (m_pContext) {
+ CPDF_ModuleMgr::Get()->GetJpegModule()->Finish(m_pContext);
+ }
+}
+void CPDF_JpegFilter::v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf)
+{
+ if (m_pContext == NULL) {
+ m_pContext = CPDF_ModuleMgr::Get()->GetJpegModule()->Start();
+ }
+ FX_LPCBYTE jpeg_src_buf;
+ FX_DWORD jpeg_src_size;
+ CFX_BinaryBuf temp_buf;
+ if (m_InputBuf.GetSize()) {
+ temp_buf.EstimateSize(m_InputBuf.GetSize() + src_size);
+ temp_buf.AppendBlock(m_InputBuf.GetBuffer(), m_InputBuf.GetSize());
+ m_InputBuf.Clear();
+ temp_buf.AppendBlock(src_buf, src_size);
+ jpeg_src_buf = temp_buf.GetBuffer();
+ jpeg_src_size = temp_buf.GetSize();
+ } else {
+ jpeg_src_buf = src_buf;
+ jpeg_src_size = src_size;
+ }
+ CPDF_ModuleMgr::Get()->GetJpegModule()->Input(m_pContext, jpeg_src_buf, jpeg_src_size);
+ if (!m_bGotHeader) {
+ int ret = CPDF_ModuleMgr::Get()->GetJpegModule()->ReadHeader(m_pContext, &m_Width, &m_Height, &m_nComps);
+ int left_size = CPDF_ModuleMgr::Get()->GetJpegModule()->GetAvailInput(m_pContext);
+ if (ret == 1) {
+ ReportEOF(left_size);
+ return;
+ }
+ if (ret == 2) {
+ m_InputBuf.AppendBlock(jpeg_src_buf + jpeg_src_size - left_size, left_size);
+ return;
+ }
+ CPDF_ModuleMgr::Get()->GetJpegModule()->StartScanline(m_pContext, 1);
+ m_bGotHeader = TRUE;
+ m_Pitch = m_Width * m_nComps;
+ }
+ if (m_pScanline == NULL) {
+ m_pScanline = FX_Alloc(FX_BYTE, m_Pitch + 4);
+ }
+ while (1) {
+ if (!CPDF_ModuleMgr::Get()->GetJpegModule()->ReadScanline(m_pContext, m_pScanline)) {
+ int left_size = CPDF_ModuleMgr::Get()->GetJpegModule()->GetAvailInput(m_pContext);
+ m_InputBuf.AppendBlock(jpeg_src_buf + jpeg_src_size - left_size, left_size);
+ break;
+ }
+ dest_buf.AppendBlock(m_pScanline, m_Pitch);
+ m_iLine ++;
+ if (m_iLine == m_Height) {
+ ReportEOF(CPDF_ModuleMgr::Get()->GetJpegModule()->GetAvailInput(m_pContext));
+ return;
+ }
+ }
+}
+CPDF_FaxFilter::CPDF_FaxFilter()
+{
+ m_Encoding = 0;
+ m_bEndOfLine = FALSE;
+ m_bByteAlign = FALSE;
+ m_bBlack = FALSE;
+ m_nRows = 0;
+ m_nColumns = 0;
+ m_Pitch = 0;
+ m_pScanlineBuf = NULL;
+ m_pRefBuf = NULL;
+ m_iRow = 0;
+ m_InputBitPos = 0;
+}
+CPDF_FaxFilter::~CPDF_FaxFilter()
+{
+ if (m_pScanlineBuf) {
+ FX_Free(m_pScanlineBuf);
+ }
+ if (m_pRefBuf) {
+ FX_Free(m_pRefBuf);
+ }
+}
+FX_BOOL CPDF_FaxFilter::Initialize(int Encoding, int bEndOfLine, int bByteAlign, int bBlack, int nRows, int nColumns)
+{
+ m_Encoding = Encoding;
+ m_bEndOfLine = bEndOfLine;
+ m_bByteAlign = bByteAlign;
+ m_bBlack = bBlack;
+ m_nRows = nRows;
+ m_nColumns = nColumns;
+ m_Pitch = (m_nColumns + 7) / 8;
+ m_pScanlineBuf = FX_Alloc(FX_BYTE, m_Pitch);
+ m_pRefBuf = FX_Alloc(FX_BYTE, m_Pitch);
+ FXSYS_memset8(m_pScanlineBuf, 0xff, m_Pitch);
+ FXSYS_memset8(m_pRefBuf, 0xff, m_Pitch);
+ m_iRow = 0;
+ m_InputBitPos = 0;
+ return TRUE;
+}
+void CPDF_FaxFilter::v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf)
+{
+ FX_LPCBYTE fax_src_buf;
+ FX_DWORD fax_src_size;
+ CFX_BinaryBuf temp_buf;
+ int bitpos;
+ if (m_InputBuf.GetSize()) {
+ temp_buf.EstimateSize(m_InputBuf.GetSize() + src_size);
+ temp_buf.AppendBlock(m_InputBuf.GetBuffer(), m_InputBuf.GetSize());
+ m_InputBuf.Clear();
+ temp_buf.AppendBlock(src_buf, src_size);
+ fax_src_buf = temp_buf.GetBuffer();
+ fax_src_size = temp_buf.GetSize();
+ bitpos = m_InputBitPos;
+ } else {
+ fax_src_buf = src_buf;
+ fax_src_size = src_size;
+ bitpos = 0;
+ }
+ ProcessData(fax_src_buf, fax_src_size, bitpos, FALSE, dest_buf);
+ int left_bits = fax_src_size * 8 - bitpos;
+ m_InputBuf.AppendBlock(fax_src_buf + bitpos / 8, (left_bits + 7) / 8);
+ m_InputBitPos = bitpos % 8;
+}
+void CPDF_FaxFilter::v_FilterFinish(CFX_BinaryBuf& dest_buf)
+{
+ ProcessData(m_InputBuf.GetBuffer(), m_InputBuf.GetSize(), m_InputBitPos, TRUE, dest_buf);
+}
+FX_BOOL _FaxSkipEOL(const FX_BYTE* src_buf, int bitsize, int& bitpos);
+FX_BOOL _FaxG4GetRow(const FX_BYTE* src_buf, int bitsize, int& bitpos, FX_LPBYTE dest_buf, const FX_BYTE* ref_buf, int columns);
+FX_BOOL _FaxGet1DLine(const FX_BYTE* src_buf, int bitsize, int& bitpos, FX_LPBYTE dest_buf, int columns);
+void CPDF_FaxFilter::ProcessData(FX_LPCBYTE src_buf, FX_DWORD src_size, int& bitpos, FX_BOOL bFinish,
+ CFX_BinaryBuf& dest_buf)
+{
+ int bitsize = src_size * 8;
+ while (1) {
+ if ((bitsize < bitpos + 256) && !bFinish) {
+ return;
+ }
+ int start_bitpos = bitpos;
+ FXSYS_memset8(m_pScanlineBuf, 0xff, m_Pitch);
+ if (!ReadLine(src_buf, bitsize, bitpos)) {
+ bitpos = start_bitpos;
+ return;
+ }
+ if (m_Encoding) {
+ FXSYS_memcpy32(m_pRefBuf, m_pScanlineBuf, m_Pitch);
+ }
+ if (m_bBlack) {
+ for (int i = 0; i < m_Pitch; i ++) {
+ m_pScanlineBuf[i] = ~m_pScanlineBuf[i];
+ }
+ }
+ dest_buf.AppendBlock(m_pScanlineBuf, m_Pitch);
+ m_iRow ++;
+ if (m_iRow == m_nRows) {
+ ReportEOF(src_size - (bitpos + 7) / 8);
+ return;
+ }
+ }
+}
+FX_BOOL CPDF_FaxFilter::ReadLine(FX_LPCBYTE src_buf, int bitsize, int& bitpos)
+{
+ if (!_FaxSkipEOL(src_buf, bitsize, bitpos)) {
+ return FALSE;
+ }
+ FX_BOOL ret;
+ if (m_Encoding < 0) {
+ ret = _FaxG4GetRow(src_buf, bitsize, bitpos, m_pScanlineBuf, m_pRefBuf, m_nColumns);
+ } else if (m_Encoding == 0) {
+ ret = _FaxGet1DLine(src_buf, bitsize, bitpos, m_pScanlineBuf, m_nColumns);
+ } else {
+ if (bitpos == bitsize) {
+ return FALSE;
+ }
+ FX_BOOL bNext1D = src_buf[bitpos / 8] & (1 << (7 - bitpos % 8));
+ bitpos ++;
+ if (bNext1D) {
+ ret = _FaxGet1DLine(src_buf, bitsize, bitpos, m_pScanlineBuf, m_nColumns);
+ } else {
+ ret = _FaxG4GetRow(src_buf, bitsize, bitpos, m_pScanlineBuf, m_pRefBuf, m_nColumns);
+ }
+ }
+ if (!ret) {
+ return FALSE;
+ }
+ if (m_bEndOfLine)
+ if (!_FaxSkipEOL(src_buf, bitsize, bitpos)) {
+ return FALSE;
+ }
+ if (m_bByteAlign) {
+ bitpos = (bitpos + 7) / 8 * 8;
+ }
+ return TRUE;
+}
diff --git a/core/src/fpdfapi/fpdf_parser/fpdf_parser_objects.cpp b/core/src/fpdfapi/fpdf_parser/fpdf_parser_objects.cpp
index 53cf892d7e..bd8b157bfa 100644
--- a/core/src/fpdfapi/fpdf_parser/fpdf_parser_objects.cpp
+++ b/core/src/fpdfapi/fpdf_parser/fpdf_parser_objects.cpp
@@ -1,1344 +1,1344 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../../include/fpdfapi/fpdf_parser.h"
-void CPDF_Object::Release()
-{
- if (this == NULL) {
- return;
- }
- if (m_ObjNum) {
- return;
- }
- Destroy();
-}
-void CPDF_Object::Destroy()
-{
- switch (m_Type) {
- case PDFOBJ_STRING:
- delete (CPDF_String*)this;
- break;
- case PDFOBJ_NAME:
- delete (CPDF_Name*)this;
- break;
- case PDFOBJ_ARRAY:
- delete (CPDF_Array*)this;
- break;
- case PDFOBJ_DICTIONARY:
- delete (CPDF_Dictionary*)this;
- break;
- case PDFOBJ_STREAM:
- delete (CPDF_Stream*)this;
- break;
- default:
- delete this;
- }
-}
-CFX_ByteString CPDF_Object::GetString() const
-{
- if (this == NULL) {
- return CFX_ByteString();
- }
- switch (m_Type) {
- case PDFOBJ_BOOLEAN:
- return ((CPDF_Boolean*)this)->m_bValue ? "true" : "false";
- case PDFOBJ_NUMBER:
- return ((CPDF_Number*)this)->GetString();
- case PDFOBJ_STRING:
- return ((CPDF_String*)this)->m_String;
- case PDFOBJ_NAME:
- return ((CPDF_Name*)this)->m_Name;
- case PDFOBJ_REFERENCE: {
- CPDF_Reference* pRef = (CPDF_Reference*)(FX_LPVOID)this;
- if (pRef->m_pObjList == NULL) {
- break;
- }
- CPDF_Object* pObj = pRef->m_pObjList->GetIndirectObject(pRef->m_RefObjNum);
- if (pObj == NULL) {
- return CFX_ByteString();
- }
- return pObj->GetString();
- }
- }
- return CFX_ByteString();
-}
-CFX_ByteStringC CPDF_Object::GetConstString() const
-{
- if (this == NULL) {
- return CFX_ByteStringC();
- }
- switch (m_Type) {
- case PDFOBJ_STRING:
- return CFX_ByteStringC((FX_LPCBYTE)((CPDF_String*)this)->m_String, ((CPDF_String*)this)->m_String.GetLength());
- case PDFOBJ_NAME:
- return CFX_ByteStringC((FX_LPCBYTE)((CPDF_Name*)this)->m_Name, ((CPDF_Name*)this)->m_Name.GetLength());
- case PDFOBJ_REFERENCE: {
- CPDF_Reference* pRef = (CPDF_Reference*)(FX_LPVOID)this;
- if (pRef->m_pObjList == NULL) {
- break;
- }
- CPDF_Object* pObj = pRef->m_pObjList->GetIndirectObject(pRef->m_RefObjNum);
- if (pObj == NULL) {
- return CFX_ByteStringC();
- }
- return pObj->GetConstString();
- }
- }
- return CFX_ByteStringC();
-}
-FX_FLOAT CPDF_Object::GetNumber() const
-{
- if (this == NULL) {
- return 0;
- }
- switch (m_Type) {
- case PDFOBJ_NUMBER:
- return ((CPDF_Number*)this)->GetNumber();
- case PDFOBJ_REFERENCE: {
- CPDF_Reference* pRef = (CPDF_Reference*)(FX_LPVOID)this;
- if (pRef->m_pObjList == NULL) {
- break;
- }
- CPDF_Object* pObj = pRef->m_pObjList->GetIndirectObject(pRef->m_RefObjNum);
- if (pObj == NULL) {
- return 0;
- }
- return pObj->GetNumber();
- }
- }
- return 0;
-}
-FX_FLOAT CPDF_Object::GetNumber16() const
-{
- return GetNumber();
-}
-int CPDF_Object::GetInteger() const
-{
- if (this == NULL) {
- return 0;
- }
- switch (m_Type) {
- case PDFOBJ_BOOLEAN:
- return ((CPDF_Boolean*)this)->m_bValue;
- case PDFOBJ_NUMBER:
- return ((CPDF_Number*)this)->GetInteger();
- case PDFOBJ_REFERENCE: {
- CPDF_Reference* pRef = (CPDF_Reference*)(FX_LPVOID)this;
- PARSE_CONTEXT context;
- FXSYS_memset32(&context, 0, sizeof(PARSE_CONTEXT));
- if (pRef->m_pObjList == NULL) {
- return 0;
- }
- CPDF_Object* pObj = pRef->m_pObjList->GetIndirectObject(pRef->m_RefObjNum, &context);
- if (pObj == NULL) {
- return 0;
- }
- return pObj->GetInteger();
- }
- }
- return 0;
-}
-CPDF_Dictionary* CPDF_Object::GetDict() const
-{
- if (this == NULL) {
- return NULL;
- }
- switch (m_Type) {
- case PDFOBJ_DICTIONARY:
- return (CPDF_Dictionary*)this;
- case PDFOBJ_STREAM:
- return ((CPDF_Stream*)this)->GetDict();
- case PDFOBJ_REFERENCE: {
- CPDF_Reference* pRef = (CPDF_Reference*)this;
- if (pRef->m_pObjList == NULL) {
- break;
- }
- CPDF_Object* pObj = pRef->m_pObjList->GetIndirectObject(pRef->m_RefObjNum);
- if (pObj == NULL) {
- return NULL;
- }
- return pObj->GetDict();
- }
- }
- return NULL;
-}
-CPDF_Array* CPDF_Object::GetArray() const
-{
- if (this == NULL) {
- return NULL;
- }
- if (m_Type == PDFOBJ_ARRAY) {
- return (CPDF_Array*)this;
- }
- return NULL;
-}
-void CPDF_Object::SetString(const CFX_ByteString& str)
-{
- ASSERT(this != NULL);
- switch (m_Type) {
- case PDFOBJ_BOOLEAN:
- ((CPDF_Boolean*)this)->m_bValue = str == FX_BSTRC("true") ? 1 : 0;
- return;
- case PDFOBJ_NUMBER:
- ((CPDF_Number*)this)->SetString(str);
- return;
- case PDFOBJ_STRING:
- ((CPDF_String*)this)->m_String = str;
- return;
- case PDFOBJ_NAME:
- ((CPDF_Name*)this)->m_Name = str;
- return;
- }
- ASSERT(FALSE);
-}
-int CPDF_Object::GetDirectType() const
-{
- if (m_Type != PDFOBJ_REFERENCE) {
- return m_Type;
- }
- CPDF_Reference* pRef = (CPDF_Reference*)this;
- return pRef->m_pObjList->GetIndirectType(pRef->m_RefObjNum);
-}
-FX_BOOL CPDF_Object::IsIdentical(CPDF_Object* pOther) const
-{
- if (this == pOther) {
- return TRUE;
- }
- if (this == NULL || pOther == NULL) {
- return FALSE;
- }
- if (pOther->m_Type != m_Type) {
- if (m_Type == PDFOBJ_REFERENCE) {
- return GetDirect()->IsIdentical(pOther);
- } else if (pOther->m_Type == PDFOBJ_REFERENCE) {
- return IsIdentical(pOther->GetDirect());
- }
- return FALSE;
- }
- switch (m_Type) {
- case PDFOBJ_BOOLEAN:
- return (((CPDF_Boolean*)this)->Identical((CPDF_Boolean*)pOther));
- case PDFOBJ_NUMBER:
- return (((CPDF_Number*)this)->Identical((CPDF_Number*)pOther));
- case PDFOBJ_STRING:
- return (((CPDF_String*)this)->Identical((CPDF_String*)pOther));
- case PDFOBJ_NAME:
- return (((CPDF_Name*)this)->Identical((CPDF_Name*)pOther));
- case PDFOBJ_ARRAY:
- return (((CPDF_Array*)this)->Identical((CPDF_Array*)pOther));
- case PDFOBJ_DICTIONARY:
- return (((CPDF_Dictionary*)this)->Identical((CPDF_Dictionary*)pOther));
- case PDFOBJ_NULL:
- return TRUE;
- case PDFOBJ_STREAM:
- return (((CPDF_Stream*)this)->Identical((CPDF_Stream*)pOther));
- case PDFOBJ_REFERENCE:
- return (((CPDF_Reference*)this)->Identical((CPDF_Reference*)pOther));
- }
- return FALSE;
-}
-CPDF_Object* CPDF_Object::GetDirect() const
-{
- if (this == NULL) {
- return NULL;
- }
- if (m_Type != PDFOBJ_REFERENCE) {
- return (CPDF_Object*)this;
- }
- CPDF_Reference* pRef = (CPDF_Reference*)(FX_LPVOID)this;
- if (pRef->m_pObjList == NULL) {
- return NULL;
- }
- return pRef->m_pObjList->GetIndirectObject(pRef->m_RefObjNum);
-}
-CPDF_Object* CPDF_Object::Clone(FX_BOOL bDirect) const
-{
- CFX_MapPtrToPtr visited;
- return CloneInternal(bDirect, &visited);
-}
-CPDF_Object* CPDF_Object::CloneInternal(FX_BOOL bDirect, CFX_MapPtrToPtr* visited) const
-{
- if (this == NULL) {
- return NULL;
- }
- switch (m_Type) {
- case PDFOBJ_BOOLEAN:
- return FX_NEW CPDF_Boolean(((CPDF_Boolean*)this)->m_bValue);
- case PDFOBJ_NUMBER:
- return FX_NEW CPDF_Number(((CPDF_Number*)this)->m_bInteger, &((CPDF_Number*)this)->m_Integer);
- case PDFOBJ_STRING:
- return FX_NEW CPDF_String(((CPDF_String*)this)->m_String, ((CPDF_String*)this)->IsHex());
- case PDFOBJ_NAME:
- return FX_NEW CPDF_Name(((CPDF_Name*)this)->m_Name);
- case PDFOBJ_ARRAY: {
- CPDF_Array* pCopy = FX_NEW CPDF_Array();
- CPDF_Array* pThis = (CPDF_Array*)this;
- int n = pThis->GetCount();
- for (int i = 0; i < n; i ++) {
- CPDF_Object* value = (CPDF_Object*)pThis->m_Objects.GetAt(i);
- pCopy->m_Objects.Add(value->CloneInternal(bDirect, visited));
- }
- return pCopy;
- }
- case PDFOBJ_DICTIONARY: {
- CPDF_Dictionary* pCopy = FX_NEW CPDF_Dictionary();
- CPDF_Dictionary* pThis = (CPDF_Dictionary*)this;
- FX_POSITION pos = pThis->m_Map.GetStartPosition();
- while (pos) {
- CFX_ByteString key;
- CPDF_Object* value;
- pThis->m_Map.GetNextAssoc(pos, key, (void*&)value);
- pCopy->m_Map.SetAt(key, value->CloneInternal(bDirect, visited));
- }
- return pCopy;
- }
- case PDFOBJ_NULL: {
- return FX_NEW CPDF_Null;
- }
- case PDFOBJ_STREAM: {
- CPDF_Stream* pThis = (CPDF_Stream*)this;
- CPDF_StreamAcc acc;
- acc.LoadAllData(pThis, TRUE);
- FX_DWORD streamSize = acc.GetSize();
- CPDF_Stream* pObj = FX_NEW CPDF_Stream(acc.DetachData(), streamSize, (CPDF_Dictionary*)((CPDF_Object*)pThis->GetDict())->CloneInternal(bDirect, visited));
- return pObj;
- }
- case PDFOBJ_REFERENCE: {
- CPDF_Reference* pRef = (CPDF_Reference*)this;
- FX_DWORD obj_num = pRef->m_RefObjNum;
- if (bDirect && !visited->GetValueAt((void*)(FX_UINTPTR)obj_num)) {
- visited->SetAt((void*)(FX_UINTPTR)obj_num, (void*)1);
- CPDF_Object* ret = pRef->GetDirect()->CloneInternal(TRUE, visited);
- return ret;
- } else {
- return FX_NEW CPDF_Reference(pRef->m_pObjList, obj_num);
- }
- }
- }
- return NULL;
-}
-CPDF_Object* CPDF_Object::CloneRef(CPDF_IndirectObjects* pDoc) const
-{
- if (this == NULL) {
- return NULL;
- }
- if (m_ObjNum) {
- return FX_NEW CPDF_Reference(pDoc, m_ObjNum);
- }
- return Clone();
-}
-CFX_WideString CPDF_Object::GetUnicodeText(CFX_CharMap* pCharMap) const
-{
- if (this == NULL) {
- return CFX_WideString();
- }
- if (m_Type == PDFOBJ_STRING) {
- return PDF_DecodeText(((CPDF_String*)this)->m_String, pCharMap);
- } else if (m_Type == PDFOBJ_STREAM) {
- CPDF_StreamAcc stream;
- stream.LoadAllData((CPDF_Stream*)this, FALSE);
- CFX_WideString result = PDF_DecodeText(stream.GetData(), stream.GetSize(), pCharMap);
- return result;
- } else if (m_Type == PDFOBJ_NAME) {
- return PDF_DecodeText(((CPDF_Name*)this)->m_Name, pCharMap);
- }
- return CFX_WideString();
-}
-void CPDF_Object::SetUnicodeText(FX_LPCWSTR pUnicodes, int len)
-{
- if (this == NULL) {
- return;
- }
- if (m_Type == PDFOBJ_STRING) {
- ((CPDF_String*)this)->m_String = PDF_EncodeText(pUnicodes, len);
- } else if (m_Type == PDFOBJ_STREAM) {
- CFX_ByteString result = PDF_EncodeText(pUnicodes, len);
- ((CPDF_Stream*)this)->SetData((FX_LPBYTE)(FX_LPCSTR)result, result.GetLength(), FALSE, FALSE);
- }
-}
-CPDF_Number::CPDF_Number(int value)
-{
- m_Type = PDFOBJ_NUMBER;
- m_bInteger = TRUE;
- m_Integer = value;
-}
-CPDF_Number::CPDF_Number(FX_FLOAT value)
-{
- m_Type = PDFOBJ_NUMBER;
- m_bInteger = FALSE;
- m_Float = value;
-}
-CPDF_Number::CPDF_Number(FX_BOOL bInteger, void* pData)
-{
- m_Type = PDFOBJ_NUMBER;
- m_bInteger = bInteger;
- m_Integer = *(int*)pData;
-}
-extern void FX_atonum(FX_BSTR, FX_BOOL&, void*);
-CPDF_Number::CPDF_Number(FX_BSTR str)
-{
- m_Type = PDFOBJ_NUMBER;
- FX_atonum(str, m_bInteger, &m_Integer);
-}
-void CPDF_Number::SetString(FX_BSTR str)
-{
- FX_atonum(str, m_bInteger, &m_Integer);
-}
-FX_BOOL CPDF_Number::Identical(CPDF_Number* pOther) const
-{
- return m_bInteger == pOther->m_bInteger && m_Integer == pOther->m_Integer;
-}
-CFX_ByteString CPDF_Number::GetString() const
-{
- return m_bInteger ? CFX_ByteString::FormatInteger(m_Integer, FXFORMAT_SIGNED) : CFX_ByteString::FormatFloat(m_Float);
-}
-void CPDF_Number::SetNumber(FX_FLOAT value)
-{
- m_bInteger = FALSE;
- m_Float = value;
-}
-CPDF_String::CPDF_String(const CFX_WideString& str)
-{
- m_Type = PDFOBJ_STRING;
- m_String = PDF_EncodeText(str, str.GetLength());
- m_bHex = FALSE;
-}
-CPDF_Array::~CPDF_Array()
-{
- int size = m_Objects.GetSize();
- CPDF_Object** pList = (CPDF_Object**)m_Objects.GetData();
- for (int i = 0; i < size; i ++) {
- pList[i]->Release();
- }
-}
-CFX_FloatRect CPDF_Array::GetRect()
-{
- CFX_FloatRect rect;
- if (this == NULL || m_Type != PDFOBJ_ARRAY || m_Objects.GetSize() != 4) {
- return rect;
- }
- rect.left = GetNumber(0);
- rect.bottom = GetNumber(1);
- rect.right = GetNumber(2);
- rect.top = GetNumber(3);
- return rect;
-}
-CFX_AffineMatrix CPDF_Array::GetMatrix()
-{
- CFX_AffineMatrix matrix;
- if (this == NULL || m_Type != PDFOBJ_ARRAY || m_Objects.GetSize() != 6) {
- return matrix;
- }
- matrix.Set(GetNumber(0), GetNumber(1), GetNumber(2), GetNumber(3), GetNumber(4), GetNumber(5));
- return matrix;
-}
-CPDF_Object* CPDF_Array::GetElement(FX_DWORD i) const
-{
- if (this == NULL) {
- return NULL;
- }
- if (i >= (FX_DWORD)m_Objects.GetSize()) {
- return NULL;
- }
- return (CPDF_Object*)m_Objects.GetAt(i);
-}
-CPDF_Object* CPDF_Array::GetElementValue(FX_DWORD i) const
-{
- if (this == NULL) {
- return NULL;
- }
- if (i >= (FX_DWORD)m_Objects.GetSize()) {
- return NULL;
- }
- return ((CPDF_Object*)m_Objects.GetAt(i))->GetDirect();
-}
-CFX_ByteString CPDF_Array::GetString(FX_DWORD i) const
-{
- if (this && i < (FX_DWORD)m_Objects.GetSize()) {
- CPDF_Object* p = (CPDF_Object*)m_Objects.GetAt(i);
- return p->GetString();
- }
- return CFX_ByteString();
-}
-CFX_ByteStringC CPDF_Array::GetConstString(FX_DWORD i) const
-{
- if (this && i < (FX_DWORD)m_Objects.GetSize()) {
- CPDF_Object* p = (CPDF_Object*)m_Objects.GetAt(i);
- return p->GetConstString();
- }
- return CFX_ByteStringC();
-}
-int CPDF_Array::GetInteger(FX_DWORD i) const
-{
- if (this == NULL || i >= (FX_DWORD)m_Objects.GetSize()) {
- return 0;
- }
- CPDF_Object* p = (CPDF_Object*)m_Objects.GetAt(i);
- return p->GetInteger();
-}
-FX_FLOAT CPDF_Array::GetNumber(FX_DWORD i) const
-{
- if (this == NULL || i >= (FX_DWORD)m_Objects.GetSize()) {
- return 0;
- }
- CPDF_Object* p = (CPDF_Object*)m_Objects.GetAt(i);
- return p->GetNumber();
-}
-CPDF_Dictionary* CPDF_Array::GetDict(FX_DWORD i) const
-{
- CPDF_Object* p = GetElementValue(i);
- if (p == NULL) {
- return NULL;
- } else if (p->GetType() == PDFOBJ_DICTIONARY) {
- return (CPDF_Dictionary*)p;
- } else if (p->GetType() == PDFOBJ_STREAM) {
- return ((CPDF_Stream*)p)->GetDict();
- }
- return NULL;
-}
-CPDF_Stream* CPDF_Array::GetStream(FX_DWORD i) const
-{
- CPDF_Object* p = GetElementValue(i);
- if (p == NULL || p->GetType() != PDFOBJ_STREAM) {
- return NULL;
- }
- return (CPDF_Stream*)p;
-}
-CPDF_Array* CPDF_Array::GetArray(FX_DWORD i) const
-{
- CPDF_Object* p = GetElementValue(i);
- if (p == NULL || p->GetType() != PDFOBJ_ARRAY) {
- return NULL;
- }
- return (CPDF_Array*)p;
-}
-void CPDF_Array::RemoveAt(FX_DWORD i)
-{
- ASSERT(this != NULL && m_Type == PDFOBJ_ARRAY);
- if (i >= (FX_DWORD)m_Objects.GetSize()) {
- return;
- }
- CPDF_Object* p = (CPDF_Object*)m_Objects.GetAt(i);
- p->Release();
- m_Objects.RemoveAt(i);
-}
-void CPDF_Array::SetAt(FX_DWORD i, CPDF_Object* pObj, CPDF_IndirectObjects* pObjs)
-{
- ASSERT(this != NULL && m_Type == PDFOBJ_ARRAY);
- ASSERT(i < (FX_DWORD)m_Objects.GetSize());
- if (i >= (FX_DWORD)m_Objects.GetSize()) {
- return;
- }
- CPDF_Object* pOld = (CPDF_Object*)m_Objects.GetAt(i);
- pOld->Release();
- if (pObj->GetObjNum()) {
- ASSERT(pObjs != NULL);
- pObj = CPDF_Reference::Create(pObjs, pObj->GetObjNum());
- }
- m_Objects.SetAt(i, pObj);
-}
-void CPDF_Array::InsertAt(FX_DWORD index, CPDF_Object* pObj, CPDF_IndirectObjects* pObjs)
-{
- ASSERT(pObj != NULL);
- if (pObj->GetObjNum()) {
- ASSERT(pObjs != NULL);
- pObj = CPDF_Reference::Create(pObjs, pObj->GetObjNum());
- }
- m_Objects.InsertAt(index, pObj);
-}
-void CPDF_Array::Add(CPDF_Object* pObj, CPDF_IndirectObjects* pObjs)
-{
- ASSERT(pObj != NULL);
- if (pObj->GetObjNum()) {
- ASSERT(pObjs != NULL);
- pObj = CPDF_Reference::Create(pObjs, pObj->GetObjNum());
- }
- m_Objects.Add(pObj);
-}
-void CPDF_Array::AddName(const CFX_ByteString& str)
-{
- ASSERT(this != NULL && m_Type == PDFOBJ_ARRAY);
- Add(FX_NEW CPDF_Name(str));
-}
-void CPDF_Array::AddString(const CFX_ByteString& str)
-{
- ASSERT(this != NULL && m_Type == PDFOBJ_ARRAY);
- Add(FX_NEW CPDF_String(str));
-}
-void CPDF_Array::AddInteger(int i)
-{
- ASSERT(this != NULL && m_Type == PDFOBJ_ARRAY);
- Add(FX_NEW CPDF_Number(i));
-}
-void CPDF_Array::AddNumber(FX_FLOAT f)
-{
- ASSERT(this != NULL && m_Type == PDFOBJ_ARRAY);
- CPDF_Number* pNumber = FX_NEW CPDF_Number;
- pNumber->SetNumber(f);
- Add(pNumber);
-}
-void CPDF_Array::AddReference(CPDF_IndirectObjects* pDoc, FX_DWORD objnum)
-{
- ASSERT(this != NULL && m_Type == PDFOBJ_ARRAY);
- Add(FX_NEW CPDF_Reference(pDoc, objnum));
-}
-FX_BOOL CPDF_Array::Identical(CPDF_Array* pOther) const
-{
- if (m_Objects.GetSize() != pOther->m_Objects.GetSize()) {
- return FALSE;
- }
- for (int i = 0; i < m_Objects.GetSize(); i ++)
- if (!((CPDF_Object*)m_Objects[i])->IsIdentical((CPDF_Object*)pOther->m_Objects[i])) {
- return FALSE;
- }
- return TRUE;
-}
-CPDF_Dictionary::~CPDF_Dictionary()
-{
- FX_POSITION pos = m_Map.GetStartPosition();
- while (pos) {
- FX_LPVOID value = m_Map.GetNextValue(pos);
- ((CPDF_Object*)value)->Release();
- }
-}
-FX_POSITION CPDF_Dictionary::GetStartPos() const
-{
- return m_Map.GetStartPosition();
-}
-CPDF_Object* CPDF_Dictionary::GetNextElement(FX_POSITION& pos, CFX_ByteString& key) const
-{
- if (pos == NULL) {
- return NULL;
- }
- CPDF_Object* p;
- m_Map.GetNextAssoc(pos, key, (FX_LPVOID&)p);
- return p;
-}
-CPDF_Object* CPDF_Dictionary::GetElement(FX_BSTR key) const
-{
- if (this == NULL) {
- return NULL;
- }
- CPDF_Object* p = NULL;
- m_Map.Lookup(key, (void*&)p);
- return p;
-}
-CPDF_Object* CPDF_Dictionary::GetElementValue(FX_BSTR key) const
-{
- if (this == NULL) {
- return NULL;
- }
- CPDF_Object* p = NULL;
- m_Map.Lookup(key, (void*&)p);
- return p->GetDirect();
-}
-CFX_ByteString CPDF_Dictionary::GetString(FX_BSTR key) const
-{
- if (this) {
- CPDF_Object* p = NULL;
- m_Map.Lookup(key, (void*&)p);
- if (p) {
- return p->GetString();
- }
- }
- return CFX_ByteString();
-}
-CFX_ByteStringC CPDF_Dictionary::GetConstString(FX_BSTR key) const
-{
- if (this) {
- CPDF_Object* p = NULL;
- m_Map.Lookup(key, (void*&)p);
- if (p) {
- return p->GetConstString();
- }
- }
- return CFX_ByteStringC();
-}
-CFX_WideString CPDF_Dictionary::GetUnicodeText(FX_BSTR key, CFX_CharMap* pCharMap) const
-{
- if (this) {
- CPDF_Object* p = NULL;
- m_Map.Lookup(key, (void*&)p);
- if (p) {
- if(p->GetType() == PDFOBJ_REFERENCE) {
- p = ((CPDF_Reference*)p)->GetDirect();
- return p->GetUnicodeText(pCharMap);
- } else {
- return p->GetUnicodeText(pCharMap);
- }
- }
- }
- return CFX_WideString();
-}
-CFX_ByteString CPDF_Dictionary::GetString(FX_BSTR key, FX_BSTR def) const
-{
- if (this) {
- CPDF_Object* p = NULL;
- m_Map.Lookup(key, (void*&)p);
- if (p) {
- return p->GetString();
- }
- }
- return CFX_ByteString(def);
-}
-CFX_ByteStringC CPDF_Dictionary::GetConstString(FX_BSTR key, FX_BSTR def) const
-{
- if (this) {
- CPDF_Object* p = NULL;
- m_Map.Lookup(key, (void*&)p);
- if (p) {
- return p->GetConstString();
- }
- }
- return CFX_ByteStringC(def);
-}
-int CPDF_Dictionary::GetInteger(FX_BSTR key) const
-{
- if (this) {
- CPDF_Object* p = NULL;
- m_Map.Lookup(key, (void*&)p);
- if (p) {
- return p->GetInteger();
- }
- }
- return 0;
-}
-int CPDF_Dictionary::GetInteger(FX_BSTR key, int def) const
-{
- if (this) {
- CPDF_Object* p = NULL;
- m_Map.Lookup(key, (void*&)p);
- if (p) {
- return p->GetInteger();
- }
- }
- return def;
-}
-FX_FLOAT CPDF_Dictionary::GetNumber(FX_BSTR key) const
-{
- if (this) {
- CPDF_Object* p = NULL;
- m_Map.Lookup(key, (void*&)p);
- if (p) {
- return p->GetNumber();
- }
- }
- return 0;
-}
-FX_BOOL CPDF_Dictionary::GetBoolean(FX_BSTR key, FX_BOOL bDefault) const
-{
- if (this) {
- CPDF_Object* p = NULL;
- m_Map.Lookup(key, (void*&)p);
- if (p && p->GetType() == PDFOBJ_BOOLEAN) {
- return p->GetInteger();
- }
- }
- return bDefault;
-}
-CPDF_Dictionary* CPDF_Dictionary::GetDict(FX_BSTR key) const
-{
- CPDF_Object* p = GetElementValue(key);
- if (p == NULL) {
- return NULL;
- } else if (p->GetType() == PDFOBJ_DICTIONARY) {
- return (CPDF_Dictionary*)p;
- } else if (p->GetType() == PDFOBJ_STREAM) {
- return ((CPDF_Stream*)p)->GetDict();
- }
- return NULL;
-}
-CPDF_Array* CPDF_Dictionary::GetArray(FX_BSTR key) const
-{
- CPDF_Object* p = GetElementValue(key);
- if (p == NULL || p->GetType() != PDFOBJ_ARRAY) {
- return NULL;
- }
- return (CPDF_Array*)p;
-}
-CPDF_Stream* CPDF_Dictionary::GetStream(FX_BSTR key) const
-{
- CPDF_Object* p = GetElementValue(key);
- if (p == NULL || p->GetType() != PDFOBJ_STREAM) {
- return NULL;
- }
- return (CPDF_Stream*)p;
-}
-CFX_FloatRect CPDF_Dictionary::GetRect(FX_BSTR key) const
-{
- CFX_FloatRect rect;
- CPDF_Array* pArray = GetArray(key);
- if (pArray) {
- rect = pArray->GetRect();
- }
- return rect;
-}
-CFX_AffineMatrix CPDF_Dictionary::GetMatrix(FX_BSTR key) const
-{
- CFX_AffineMatrix matrix;
- CPDF_Array* pArray = GetArray(key);
- if (pArray) {
- matrix = pArray->GetMatrix();
- }
- return matrix;
-}
-FX_BOOL CPDF_Dictionary::KeyExist(FX_BSTR key) const
-{
- if (this == NULL) {
- return FALSE;
- }
- FX_LPVOID value;
- return m_Map.Lookup(key, value);
-}
-void CPDF_Dictionary::SetAt(FX_BSTR key, CPDF_Object* pObj, CPDF_IndirectObjects* pObjs)
-{
- ASSERT(this != NULL && m_Type == PDFOBJ_DICTIONARY);
- CPDF_Object* p = NULL;
- m_Map.Lookup(key, (void*&)p);
- if (p == pObj) {
- return;
- }
- if (p) {
- p->Release();
- }
- if (pObj) {
- if (pObj->GetObjNum()) {
- ASSERT(pObjs != NULL);
- pObj = CPDF_Reference::Create(pObjs, pObj->GetObjNum());
- }
- m_Map.SetAt(key, pObj);
- } else {
- m_Map.RemoveKey(key);
- }
-}
-void CPDF_Dictionary::AddValue(FX_BSTR key, CPDF_Object* pObj)
-{
- ASSERT(this != NULL && m_Type == PDFOBJ_DICTIONARY);
- m_Map.AddValue(key, pObj);
-}
-void CPDF_Dictionary::RemoveAt(FX_BSTR key)
-{
- ASSERT(this != NULL && m_Type == PDFOBJ_DICTIONARY);
- CPDF_Object* p = NULL;
- m_Map.Lookup(key, (void*&)p);
- if (p == NULL) {
- return;
- }
- p->Release();
- m_Map.RemoveKey(key);
-}
-void CPDF_Dictionary::ReplaceKey(FX_BSTR oldkey, FX_BSTR newkey)
-{
- ASSERT(this != NULL && m_Type == PDFOBJ_DICTIONARY);
- CPDF_Object* p = NULL;
- m_Map.Lookup(oldkey, (void*&)p);
- if (p == NULL) {
- return;
- }
- m_Map.RemoveKey(oldkey);
- m_Map.SetAt(newkey, p);
-}
-FX_BOOL CPDF_Dictionary::Identical(CPDF_Dictionary* pOther) const
-{
- if (this == NULL) {
- if (pOther == NULL) {
- return TRUE;
- }
- return FALSE;
- }
- if (pOther == NULL) {
- return FALSE;
- }
- if (m_Map.GetCount() != pOther->m_Map.GetCount()) {
- return FALSE;
- }
- FX_POSITION pos = m_Map.GetStartPosition();
- while (pos) {
- CFX_ByteString key;
- FX_LPVOID value;
- m_Map.GetNextAssoc(pos, key, value);
- if (!((CPDF_Object*)value)->IsIdentical(pOther->GetElement(key))) {
- return FALSE;
- }
- }
- return TRUE;
-}
-void CPDF_Dictionary::SetAtInteger(FX_BSTR key, int i)
-{
- SetAt(key, FX_NEW CPDF_Number(i));
-}
-void CPDF_Dictionary::SetAtName(FX_BSTR key, const CFX_ByteString& name)
-{
- SetAt(key, FX_NEW CPDF_Name(name));
-}
-void CPDF_Dictionary::SetAtString(FX_BSTR key, const CFX_ByteString& str)
-{
- SetAt(key, FX_NEW CPDF_String(str));
-}
-void CPDF_Dictionary::SetAtReference(FX_BSTR key, CPDF_IndirectObjects* pDoc, FX_DWORD objnum)
-{
- SetAt(key, FX_NEW CPDF_Reference(pDoc, objnum));
-}
-void CPDF_Dictionary::AddReference(FX_BSTR key, CPDF_IndirectObjects* pDoc, FX_DWORD objnum)
-{
- AddValue(key, FX_NEW CPDF_Reference(pDoc, objnum));
-}
-void CPDF_Dictionary::SetAtNumber(FX_BSTR key, FX_FLOAT f)
-{
- CPDF_Number* pNumber = FX_NEW CPDF_Number;
- pNumber->SetNumber(f);
- SetAt(key, pNumber);
-}
-void CPDF_Dictionary::SetAtBoolean(FX_BSTR key, FX_BOOL bValue)
-{
- SetAt(key, FX_NEW CPDF_Boolean(bValue));
-}
-void CPDF_Dictionary::SetAtRect(FX_BSTR key, const CFX_FloatRect& rect)
-{
- CPDF_Array* pArray = FX_NEW CPDF_Array;
- pArray->AddNumber(rect.left);
- pArray->AddNumber(rect.bottom);
- pArray->AddNumber(rect.right);
- pArray->AddNumber(rect.top);
- SetAt(key, pArray);
-}
-void CPDF_Dictionary::SetAtMatrix(FX_BSTR key, const CFX_AffineMatrix& matrix)
-{
- CPDF_Array* pArray = FX_NEW CPDF_Array;
- pArray->AddNumber16(matrix.a);
- pArray->AddNumber16(matrix.b);
- pArray->AddNumber16(matrix.c);
- pArray->AddNumber16(matrix.d);
- pArray->AddNumber(matrix.e);
- pArray->AddNumber(matrix.f);
- SetAt(key, pArray);
-}
-CPDF_Stream::CPDF_Stream(FX_LPBYTE pData, FX_DWORD size, CPDF_Dictionary* pDict)
-{
- m_Type = PDFOBJ_STREAM;
- m_pDict = pDict;
- m_dwSize = size;
- m_GenNum = (FX_DWORD) - 1;
- m_pDataBuf = pData;
- m_pCryptoHandler = NULL;
-}
-CPDF_Stream::~CPDF_Stream()
-{
- if (m_GenNum == (FX_DWORD) - 1 && m_pDataBuf != NULL) {
- FX_Free(m_pDataBuf);
- }
- if (m_pDict) {
- m_pDict->Release();
- }
-}
-void CPDF_Stream::InitStream(CPDF_Dictionary* pDict)
-{
- if (pDict) {
- if (m_pDict) {
- m_pDict->Release();
- }
- m_pDict = pDict;
- }
- if (m_GenNum == (FX_DWORD) - 1) {
- if (m_pDataBuf) {
- FX_Free(m_pDataBuf);
- }
- }
- m_GenNum = 0;
- m_pFile = NULL;
- m_pCryptoHandler = NULL;
- m_FileOffset = 0;
-}
-void CPDF_Stream::InitStream(FX_LPBYTE pData, FX_DWORD size, CPDF_Dictionary* pDict)
-{
- InitStream(pDict);
- m_GenNum = (FX_DWORD) - 1;
- m_pDataBuf = FX_Alloc(FX_BYTE, size);
- if (pData) {
- FXSYS_memcpy32(m_pDataBuf, pData, size);
- }
- m_dwSize = size;
- if (m_pDict) {
- m_pDict->SetAtInteger(FX_BSTRC("Length"), size);
- }
-}
-void CPDF_Stream::SetData(FX_LPCBYTE pData, FX_DWORD size, FX_BOOL bCompressed, FX_BOOL bKeepBuf)
-{
- if (m_GenNum == (FX_DWORD) - 1) {
- if (m_pDataBuf) {
- FX_Free(m_pDataBuf);
- }
- } else {
- m_GenNum = (FX_DWORD) - 1;
- m_pCryptoHandler = NULL;
- }
- if (bKeepBuf) {
- m_pDataBuf = (FX_LPBYTE)pData;
- } else {
- m_pDataBuf = FX_Alloc(FX_BYTE, size);
- if (pData) {
- FXSYS_memcpy32(m_pDataBuf, pData, size);
- }
- }
- m_dwSize = size;
- if (m_pDict == NULL) {
- m_pDict = FX_NEW CPDF_Dictionary;
- }
- m_pDict->SetAtInteger(FX_BSTRC("Length"), size);
- if (!bCompressed) {
- m_pDict->RemoveAt(FX_BSTRC("Filter"));
- m_pDict->RemoveAt(FX_BSTRC("DecodeParms"));
- }
-}
-FX_BOOL CPDF_Stream::ReadRawData(FX_FILESIZE offset, FX_LPBYTE buf, FX_DWORD size) const
-{
- if ((m_GenNum != (FX_DWORD) - 1) && m_pFile) {
- return m_pFile->ReadBlock(buf, m_FileOffset + offset, size);
- }
- if (m_pDataBuf) {
- FXSYS_memcpy32(buf, m_pDataBuf + offset, size);
- }
- return TRUE;
-}
-void CPDF_Stream::InitStream(IFX_FileRead *pFile, CPDF_Dictionary* pDict)
-{
- InitStream(pDict);
- m_pFile = pFile;
- m_dwSize = (FX_DWORD)pFile->GetSize();
- if (m_pDict) {
- m_pDict->SetAtInteger(FX_BSTRC("Length"), m_dwSize);
- }
-}
-FX_BOOL CPDF_Stream::Identical(CPDF_Stream* pOther) const
-{
- if (!m_pDict->Identical(pOther->m_pDict)) {
- return FALSE;
- }
- if (m_dwSize != pOther->m_dwSize) {
- return FALSE;
- }
- if (m_GenNum != (FX_DWORD) - 1 && pOther->m_GenNum != (FX_DWORD) - 1) {
- if (m_pFile == pOther->m_pFile && m_pFile == NULL) {
- return TRUE;
- }
- if (!m_pFile || !pOther->m_pFile) {
- return FALSE;
- }
- FX_BYTE srcBuf[1024];
- FX_BYTE destBuf[1024];
- FX_DWORD size = m_dwSize;
- FX_DWORD srcOffset = m_FileOffset;
- FX_DWORD destOffset = pOther->m_FileOffset;
- if (m_pFile == pOther->m_pFile && srcOffset == destOffset) {
- return TRUE;
- }
- while (size > 0) {
- FX_DWORD actualSize = size > 1024 ? 1024 : size;
- m_pFile->ReadBlock(srcBuf, srcOffset, actualSize);
- pOther->m_pFile->ReadBlock(destBuf, destOffset, actualSize);
- if (FXSYS_memcmp32(srcBuf, destBuf, actualSize) != 0) {
- return FALSE;
- }
- size -= actualSize;
- srcOffset += actualSize;
- destOffset += actualSize;
- }
- return TRUE;
- }
- if (m_GenNum != (FX_DWORD) - 1 || pOther->m_GenNum != (FX_DWORD) - 1) {
- IFX_FileRead* pFile = NULL;
- FX_LPBYTE pBuf = NULL;
- FX_DWORD offset = 0;
- if (m_GenNum != (FX_DWORD) - 1) {
- pFile = m_pFile;
- pBuf = pOther->m_pDataBuf;
- offset = m_FileOffset;
- }
- if (pOther->m_GenNum != (FX_DWORD) - 1) {
- pFile = pOther->m_pFile;
- pBuf = m_pDataBuf;
- offset = pOther->m_FileOffset;
- }
- if (NULL == pBuf) {
- return FALSE;
- }
- FX_BYTE srcBuf[1024];
- FX_DWORD size = m_dwSize;
- while (size > 0) {
- FX_DWORD actualSize = size > 1024 ? 1024 : size;
- m_pFile->ReadBlock(srcBuf, offset, actualSize);
- if (FXSYS_memcmp32(srcBuf, pBuf, actualSize) != 0) {
- return FALSE;
- }
- pBuf += actualSize;
- size -= actualSize;
- offset += actualSize;
- }
- return TRUE;
- }
- return FXSYS_memcmp32(m_pDataBuf, pOther->m_pDataBuf, m_dwSize) == 0;
-}
-CPDF_Stream* CPDF_Stream::Clone(FX_BOOL bDirect, FPDF_LPFCloneStreamCallback lpfCallback, FX_LPVOID pUserData) const
-{
- CPDF_Dictionary *pCloneDict = (CPDF_Dictionary*)m_pDict->Clone(bDirect);
- IFX_FileStream *pFS = NULL;
- if (lpfCallback) {
- pFS = lpfCallback((CPDF_Stream*)this, pUserData);
- }
- if (!pFS) {
- CPDF_StreamAcc acc;
- acc.LoadAllData(this, TRUE);
- FX_DWORD streamSize = acc.GetSize();
- CPDF_Stream* pObj = FX_NEW CPDF_Stream(acc.DetachData(), streamSize, pCloneDict);
- return pObj;
- }
- CPDF_Stream* pObj = FX_NEW CPDF_Stream(NULL, 0, NULL);
- CPDF_StreamFilter *pSF = GetStreamFilter(TRUE);
- if (pSF) {
- FX_LPBYTE pBuf = FX_Alloc(FX_BYTE, 4096);
- FX_DWORD dwRead;
- do {
- dwRead = pSF->ReadBlock(pBuf, 4096);
- if (dwRead) {
- pFS->WriteBlock(pBuf, dwRead);
- }
- } while (dwRead == 4096);
- pFS->Flush();
- FX_Free(pBuf);
- delete pSF;
- }
- pObj->InitStream((IFX_FileRead*)pFS, pCloneDict);
- return pObj;
-}
-extern FX_BOOL PDF_DataDecode(FX_LPCBYTE src_buf, FX_DWORD src_size, const CPDF_Dictionary* pDict,
- FX_LPBYTE& dest_buf, FX_DWORD& dest_size, CFX_ByteString& ImageEncoding,
- CPDF_Dictionary*& pImageParms, FX_DWORD estimated_size, FX_BOOL bImageAcc);
-CPDF_StreamAcc::CPDF_StreamAcc()
-{
- m_bNewBuf = FALSE;
- m_pData = NULL;
- m_dwSize = 0;
- m_pImageParam = NULL;
- m_pStream = NULL;
- m_pSrcData = NULL;
-}
-void CPDF_StreamAcc::LoadAllData(const CPDF_Stream* pStream, FX_BOOL bRawAccess, FX_DWORD estimated_size,
- FX_BOOL bImageAcc)
-{
- if (pStream == NULL || pStream->GetType() != PDFOBJ_STREAM) {
- return;
- }
- m_pStream = pStream;
- if (pStream->IsMemoryBased() &&
- (!pStream->GetDict()->KeyExist(FX_BSTRC("Filter")) || bRawAccess)) {
- m_dwSize = pStream->m_dwSize;
- m_pData = (FX_LPBYTE)pStream->m_pDataBuf;
- return;
- }
- FX_LPBYTE pSrcData;
- FX_DWORD dwSrcSize = pStream->m_dwSize;
- if (dwSrcSize == 0) {
- return;
- }
- if (!pStream->IsMemoryBased()) {
- pSrcData = m_pSrcData = FX_Alloc(FX_BYTE, dwSrcSize);
- if (!pSrcData || !pStream->ReadRawData(0, pSrcData, dwSrcSize)) {
- return;
- }
- } else {
- pSrcData = pStream->m_pDataBuf;
- }
- FX_LPBYTE pDecryptedData;
- FX_DWORD dwDecryptedSize;
- if (pStream->m_pCryptoHandler) {
- CFX_BinaryBuf dest_buf;
- dest_buf.EstimateSize(pStream->m_pCryptoHandler->DecryptGetSize(dwSrcSize));
- FX_LPVOID context = pStream->m_pCryptoHandler->DecryptStart(pStream->GetObjNum(), pStream->m_GenNum);
- pStream->m_pCryptoHandler->DecryptStream(context, pSrcData, dwSrcSize, dest_buf);
- pStream->m_pCryptoHandler->DecryptFinish(context, dest_buf);
- pDecryptedData = dest_buf.GetBuffer();
- dwDecryptedSize = dest_buf.GetSize();
- dest_buf.DetachBuffer();
- } else {
- pDecryptedData = pSrcData;
- dwDecryptedSize = dwSrcSize;
- }
- if (!pStream->GetDict()->KeyExist(FX_BSTRC("Filter")) || bRawAccess) {
- m_pData = pDecryptedData;
- m_dwSize = dwDecryptedSize;
- } else {
- FX_BOOL bRet = PDF_DataDecode(pDecryptedData, dwDecryptedSize, m_pStream->GetDict(),
- m_pData, m_dwSize, m_ImageDecoder, m_pImageParam, estimated_size, bImageAcc);
- if (!bRet) {
- m_pData = pDecryptedData;
- m_dwSize = dwDecryptedSize;
- }
- }
- if (pSrcData != pStream->m_pDataBuf && pSrcData != m_pData) {
- FX_Free(pSrcData);
- }
- if (pDecryptedData != pSrcData && pDecryptedData != m_pData) {
- FX_Free(pDecryptedData);
- }
- m_pSrcData = NULL;
- m_bNewBuf = m_pData != pStream->m_pDataBuf;
-}
-CPDF_StreamAcc::~CPDF_StreamAcc()
-{
- if (m_bNewBuf && m_pData) {
- FX_Free(m_pData);
- }
- if (m_pSrcData) {
- FX_Free(m_pSrcData);
- }
-}
-FX_LPCBYTE CPDF_StreamAcc::GetData() const
-{
- if (m_bNewBuf) {
- return m_pData;
- }
- if (!m_pStream) {
- return NULL;
- }
- return m_pStream->m_pDataBuf;
-}
-FX_DWORD CPDF_StreamAcc::GetSize() const
-{
- if (m_bNewBuf) {
- return m_dwSize;
- }
- if (!m_pStream) {
- return 0;
- }
- return m_pStream->m_dwSize;
-}
-FX_LPBYTE CPDF_StreamAcc::DetachData()
-{
- if (m_bNewBuf) {
- FX_LPBYTE p = m_pData;
- m_pData = NULL;
- m_dwSize = 0;
- return p;
- }
- FX_LPBYTE p = FX_Alloc(FX_BYTE, m_dwSize);
- if (p == NULL) {
- return NULL;
- }
- FXSYS_memcpy32(p, m_pData, m_dwSize);
- return p;
-}
-void CPDF_Reference::SetRef(CPDF_IndirectObjects* pDoc, FX_DWORD objnum)
-{
- m_pObjList = pDoc;
- m_RefObjNum = objnum;
-}
-CPDF_IndirectObjects::CPDF_IndirectObjects(IPDF_DocParser* pParser)
-{
- m_pParser = pParser;
- m_IndirectObjs.InitHashTable(1013);
- if (pParser) {
- m_LastObjNum = m_pParser->GetLastObjNum();
- } else {
- m_LastObjNum = 0;
- }
-}
-CPDF_IndirectObjects::~CPDF_IndirectObjects()
-{
- FX_POSITION pos = m_IndirectObjs.GetStartPosition();
- while (pos) {
- FX_LPVOID key, value;
- m_IndirectObjs.GetNextAssoc(pos, key, value);
- ((CPDF_Object*)value)->Destroy();
- }
-}
-CPDF_Object* CPDF_IndirectObjects::GetIndirectObject(FX_DWORD objnum, struct PARSE_CONTEXT* pContext)
-{
- if (objnum == 0) {
- return NULL;
- }
- FX_LPVOID value;
- {
- if (m_IndirectObjs.Lookup((FX_LPVOID)(FX_UINTPTR)objnum, value)) {
- if (((CPDF_Object*)value)->GetObjNum() == -1) {
- return NULL;
- }
- return (CPDF_Object*)value;
- }
- }
- CPDF_Object* pObj = NULL;
- if (m_pParser) {
- pObj = m_pParser->ParseIndirectObject(this, objnum, pContext);
- }
- if (pObj == NULL) {
- return NULL;
- }
- pObj->m_ObjNum = objnum;
- if (m_LastObjNum < objnum) {
- m_LastObjNum = objnum;
- }
- if (m_IndirectObjs.Lookup((FX_LPVOID)(FX_UINTPTR)objnum, value)) {
- if (value) {
- ((CPDF_Object *)value)->Destroy();
- }
- }
- m_IndirectObjs.SetAt((FX_LPVOID)(FX_UINTPTR)objnum, pObj);
- return pObj;
-}
-int CPDF_IndirectObjects::GetIndirectType(FX_DWORD objnum)
-{
- FX_LPVOID value;
- if (m_IndirectObjs.Lookup((FX_LPVOID)(FX_UINTPTR)objnum, value)) {
- return ((CPDF_Object*)value)->GetType();
- }
- if (m_pParser) {
- PARSE_CONTEXT context;
- FXSYS_memset32(&context, 0, sizeof(PARSE_CONTEXT));
- context.m_Flags = PDFPARSE_TYPEONLY;
- return (int)(FX_UINTPTR)m_pParser->ParseIndirectObject(this, objnum, &context);
- }
- return 0;
-}
-FX_DWORD CPDF_IndirectObjects::AddIndirectObject(CPDF_Object* pObj)
-{
- if (pObj->m_ObjNum) {
- return pObj->m_ObjNum;
- }
- m_LastObjNum ++;
- m_IndirectObjs.SetAt((FX_LPVOID)(FX_UINTPTR)m_LastObjNum, pObj);
- pObj->m_ObjNum = m_LastObjNum;
- return m_LastObjNum;
-}
-void CPDF_IndirectObjects::ReleaseIndirectObject(FX_DWORD objnum)
-{
- FX_LPVOID value;
- if (!m_IndirectObjs.Lookup((FX_LPVOID)(FX_UINTPTR)objnum, value)) {
- return;
- }
- if (((CPDF_Object*)value)->GetObjNum() == -1) {
- return;
- }
- ((CPDF_Object*)value)->Destroy();
- m_IndirectObjs.RemoveKey((FX_LPVOID)(FX_UINTPTR)objnum);
-}
-void CPDF_IndirectObjects::InsertIndirectObject(FX_DWORD objnum, CPDF_Object* pObj)
-{
- if (objnum == 0 || pObj == NULL) {
- return;
- }
- FX_LPVOID value;
- if (m_IndirectObjs.Lookup((FX_LPVOID)(FX_UINTPTR)objnum, value)) {
- ((CPDF_Object*)value)->Destroy();
- }
- pObj->m_ObjNum = objnum;
- m_IndirectObjs.SetAt((FX_LPVOID)(FX_UINTPTR)objnum, pObj);
- if (m_LastObjNum < objnum) {
- m_LastObjNum = objnum;
- }
-}
-FX_DWORD CPDF_IndirectObjects::GetLastObjNum() const
-{
- return m_LastObjNum;
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fpdfapi/fpdf_parser.h"
+void CPDF_Object::Release()
+{
+ if (this == NULL) {
+ return;
+ }
+ if (m_ObjNum) {
+ return;
+ }
+ Destroy();
+}
+void CPDF_Object::Destroy()
+{
+ switch (m_Type) {
+ case PDFOBJ_STRING:
+ delete (CPDF_String*)this;
+ break;
+ case PDFOBJ_NAME:
+ delete (CPDF_Name*)this;
+ break;
+ case PDFOBJ_ARRAY:
+ delete (CPDF_Array*)this;
+ break;
+ case PDFOBJ_DICTIONARY:
+ delete (CPDF_Dictionary*)this;
+ break;
+ case PDFOBJ_STREAM:
+ delete (CPDF_Stream*)this;
+ break;
+ default:
+ delete this;
+ }
+}
+CFX_ByteString CPDF_Object::GetString() const
+{
+ if (this == NULL) {
+ return CFX_ByteString();
+ }
+ switch (m_Type) {
+ case PDFOBJ_BOOLEAN:
+ return ((CPDF_Boolean*)this)->m_bValue ? "true" : "false";
+ case PDFOBJ_NUMBER:
+ return ((CPDF_Number*)this)->GetString();
+ case PDFOBJ_STRING:
+ return ((CPDF_String*)this)->m_String;
+ case PDFOBJ_NAME:
+ return ((CPDF_Name*)this)->m_Name;
+ case PDFOBJ_REFERENCE: {
+ CPDF_Reference* pRef = (CPDF_Reference*)(FX_LPVOID)this;
+ if (pRef->m_pObjList == NULL) {
+ break;
+ }
+ CPDF_Object* pObj = pRef->m_pObjList->GetIndirectObject(pRef->m_RefObjNum);
+ if (pObj == NULL) {
+ return CFX_ByteString();
+ }
+ return pObj->GetString();
+ }
+ }
+ return CFX_ByteString();
+}
+CFX_ByteStringC CPDF_Object::GetConstString() const
+{
+ if (this == NULL) {
+ return CFX_ByteStringC();
+ }
+ switch (m_Type) {
+ case PDFOBJ_STRING:
+ return CFX_ByteStringC((FX_LPCBYTE)((CPDF_String*)this)->m_String, ((CPDF_String*)this)->m_String.GetLength());
+ case PDFOBJ_NAME:
+ return CFX_ByteStringC((FX_LPCBYTE)((CPDF_Name*)this)->m_Name, ((CPDF_Name*)this)->m_Name.GetLength());
+ case PDFOBJ_REFERENCE: {
+ CPDF_Reference* pRef = (CPDF_Reference*)(FX_LPVOID)this;
+ if (pRef->m_pObjList == NULL) {
+ break;
+ }
+ CPDF_Object* pObj = pRef->m_pObjList->GetIndirectObject(pRef->m_RefObjNum);
+ if (pObj == NULL) {
+ return CFX_ByteStringC();
+ }
+ return pObj->GetConstString();
+ }
+ }
+ return CFX_ByteStringC();
+}
+FX_FLOAT CPDF_Object::GetNumber() const
+{
+ if (this == NULL) {
+ return 0;
+ }
+ switch (m_Type) {
+ case PDFOBJ_NUMBER:
+ return ((CPDF_Number*)this)->GetNumber();
+ case PDFOBJ_REFERENCE: {
+ CPDF_Reference* pRef = (CPDF_Reference*)(FX_LPVOID)this;
+ if (pRef->m_pObjList == NULL) {
+ break;
+ }
+ CPDF_Object* pObj = pRef->m_pObjList->GetIndirectObject(pRef->m_RefObjNum);
+ if (pObj == NULL) {
+ return 0;
+ }
+ return pObj->GetNumber();
+ }
+ }
+ return 0;
+}
+FX_FLOAT CPDF_Object::GetNumber16() const
+{
+ return GetNumber();
+}
+int CPDF_Object::GetInteger() const
+{
+ if (this == NULL) {
+ return 0;
+ }
+ switch (m_Type) {
+ case PDFOBJ_BOOLEAN:
+ return ((CPDF_Boolean*)this)->m_bValue;
+ case PDFOBJ_NUMBER:
+ return ((CPDF_Number*)this)->GetInteger();
+ case PDFOBJ_REFERENCE: {
+ CPDF_Reference* pRef = (CPDF_Reference*)(FX_LPVOID)this;
+ PARSE_CONTEXT context;
+ FXSYS_memset32(&context, 0, sizeof(PARSE_CONTEXT));
+ if (pRef->m_pObjList == NULL) {
+ return 0;
+ }
+ CPDF_Object* pObj = pRef->m_pObjList->GetIndirectObject(pRef->m_RefObjNum, &context);
+ if (pObj == NULL) {
+ return 0;
+ }
+ return pObj->GetInteger();
+ }
+ }
+ return 0;
+}
+CPDF_Dictionary* CPDF_Object::GetDict() const
+{
+ if (this == NULL) {
+ return NULL;
+ }
+ switch (m_Type) {
+ case PDFOBJ_DICTIONARY:
+ return (CPDF_Dictionary*)this;
+ case PDFOBJ_STREAM:
+ return ((CPDF_Stream*)this)->GetDict();
+ case PDFOBJ_REFERENCE: {
+ CPDF_Reference* pRef = (CPDF_Reference*)this;
+ if (pRef->m_pObjList == NULL) {
+ break;
+ }
+ CPDF_Object* pObj = pRef->m_pObjList->GetIndirectObject(pRef->m_RefObjNum);
+ if (pObj == NULL) {
+ return NULL;
+ }
+ return pObj->GetDict();
+ }
+ }
+ return NULL;
+}
+CPDF_Array* CPDF_Object::GetArray() const
+{
+ if (this == NULL) {
+ return NULL;
+ }
+ if (m_Type == PDFOBJ_ARRAY) {
+ return (CPDF_Array*)this;
+ }
+ return NULL;
+}
+void CPDF_Object::SetString(const CFX_ByteString& str)
+{
+ ASSERT(this != NULL);
+ switch (m_Type) {
+ case PDFOBJ_BOOLEAN:
+ ((CPDF_Boolean*)this)->m_bValue = str == FX_BSTRC("true") ? 1 : 0;
+ return;
+ case PDFOBJ_NUMBER:
+ ((CPDF_Number*)this)->SetString(str);
+ return;
+ case PDFOBJ_STRING:
+ ((CPDF_String*)this)->m_String = str;
+ return;
+ case PDFOBJ_NAME:
+ ((CPDF_Name*)this)->m_Name = str;
+ return;
+ }
+ ASSERT(FALSE);
+}
+int CPDF_Object::GetDirectType() const
+{
+ if (m_Type != PDFOBJ_REFERENCE) {
+ return m_Type;
+ }
+ CPDF_Reference* pRef = (CPDF_Reference*)this;
+ return pRef->m_pObjList->GetIndirectType(pRef->m_RefObjNum);
+}
+FX_BOOL CPDF_Object::IsIdentical(CPDF_Object* pOther) const
+{
+ if (this == pOther) {
+ return TRUE;
+ }
+ if (this == NULL || pOther == NULL) {
+ return FALSE;
+ }
+ if (pOther->m_Type != m_Type) {
+ if (m_Type == PDFOBJ_REFERENCE) {
+ return GetDirect()->IsIdentical(pOther);
+ } else if (pOther->m_Type == PDFOBJ_REFERENCE) {
+ return IsIdentical(pOther->GetDirect());
+ }
+ return FALSE;
+ }
+ switch (m_Type) {
+ case PDFOBJ_BOOLEAN:
+ return (((CPDF_Boolean*)this)->Identical((CPDF_Boolean*)pOther));
+ case PDFOBJ_NUMBER:
+ return (((CPDF_Number*)this)->Identical((CPDF_Number*)pOther));
+ case PDFOBJ_STRING:
+ return (((CPDF_String*)this)->Identical((CPDF_String*)pOther));
+ case PDFOBJ_NAME:
+ return (((CPDF_Name*)this)->Identical((CPDF_Name*)pOther));
+ case PDFOBJ_ARRAY:
+ return (((CPDF_Array*)this)->Identical((CPDF_Array*)pOther));
+ case PDFOBJ_DICTIONARY:
+ return (((CPDF_Dictionary*)this)->Identical((CPDF_Dictionary*)pOther));
+ case PDFOBJ_NULL:
+ return TRUE;
+ case PDFOBJ_STREAM:
+ return (((CPDF_Stream*)this)->Identical((CPDF_Stream*)pOther));
+ case PDFOBJ_REFERENCE:
+ return (((CPDF_Reference*)this)->Identical((CPDF_Reference*)pOther));
+ }
+ return FALSE;
+}
+CPDF_Object* CPDF_Object::GetDirect() const
+{
+ if (this == NULL) {
+ return NULL;
+ }
+ if (m_Type != PDFOBJ_REFERENCE) {
+ return (CPDF_Object*)this;
+ }
+ CPDF_Reference* pRef = (CPDF_Reference*)(FX_LPVOID)this;
+ if (pRef->m_pObjList == NULL) {
+ return NULL;
+ }
+ return pRef->m_pObjList->GetIndirectObject(pRef->m_RefObjNum);
+}
+CPDF_Object* CPDF_Object::Clone(FX_BOOL bDirect) const
+{
+ CFX_MapPtrToPtr visited;
+ return CloneInternal(bDirect, &visited);
+}
+CPDF_Object* CPDF_Object::CloneInternal(FX_BOOL bDirect, CFX_MapPtrToPtr* visited) const
+{
+ if (this == NULL) {
+ return NULL;
+ }
+ switch (m_Type) {
+ case PDFOBJ_BOOLEAN:
+ return FX_NEW CPDF_Boolean(((CPDF_Boolean*)this)->m_bValue);
+ case PDFOBJ_NUMBER:
+ return FX_NEW CPDF_Number(((CPDF_Number*)this)->m_bInteger, &((CPDF_Number*)this)->m_Integer);
+ case PDFOBJ_STRING:
+ return FX_NEW CPDF_String(((CPDF_String*)this)->m_String, ((CPDF_String*)this)->IsHex());
+ case PDFOBJ_NAME:
+ return FX_NEW CPDF_Name(((CPDF_Name*)this)->m_Name);
+ case PDFOBJ_ARRAY: {
+ CPDF_Array* pCopy = FX_NEW CPDF_Array();
+ CPDF_Array* pThis = (CPDF_Array*)this;
+ int n = pThis->GetCount();
+ for (int i = 0; i < n; i ++) {
+ CPDF_Object* value = (CPDF_Object*)pThis->m_Objects.GetAt(i);
+ pCopy->m_Objects.Add(value->CloneInternal(bDirect, visited));
+ }
+ return pCopy;
+ }
+ case PDFOBJ_DICTIONARY: {
+ CPDF_Dictionary* pCopy = FX_NEW CPDF_Dictionary();
+ CPDF_Dictionary* pThis = (CPDF_Dictionary*)this;
+ FX_POSITION pos = pThis->m_Map.GetStartPosition();
+ while (pos) {
+ CFX_ByteString key;
+ CPDF_Object* value;
+ pThis->m_Map.GetNextAssoc(pos, key, (void*&)value);
+ pCopy->m_Map.SetAt(key, value->CloneInternal(bDirect, visited));
+ }
+ return pCopy;
+ }
+ case PDFOBJ_NULL: {
+ return FX_NEW CPDF_Null;
+ }
+ case PDFOBJ_STREAM: {
+ CPDF_Stream* pThis = (CPDF_Stream*)this;
+ CPDF_StreamAcc acc;
+ acc.LoadAllData(pThis, TRUE);
+ FX_DWORD streamSize = acc.GetSize();
+ CPDF_Stream* pObj = FX_NEW CPDF_Stream(acc.DetachData(), streamSize, (CPDF_Dictionary*)((CPDF_Object*)pThis->GetDict())->CloneInternal(bDirect, visited));
+ return pObj;
+ }
+ case PDFOBJ_REFERENCE: {
+ CPDF_Reference* pRef = (CPDF_Reference*)this;
+ FX_DWORD obj_num = pRef->m_RefObjNum;
+ if (bDirect && !visited->GetValueAt((void*)(FX_UINTPTR)obj_num)) {
+ visited->SetAt((void*)(FX_UINTPTR)obj_num, (void*)1);
+ CPDF_Object* ret = pRef->GetDirect()->CloneInternal(TRUE, visited);
+ return ret;
+ } else {
+ return FX_NEW CPDF_Reference(pRef->m_pObjList, obj_num);
+ }
+ }
+ }
+ return NULL;
+}
+CPDF_Object* CPDF_Object::CloneRef(CPDF_IndirectObjects* pDoc) const
+{
+ if (this == NULL) {
+ return NULL;
+ }
+ if (m_ObjNum) {
+ return FX_NEW CPDF_Reference(pDoc, m_ObjNum);
+ }
+ return Clone();
+}
+CFX_WideString CPDF_Object::GetUnicodeText(CFX_CharMap* pCharMap) const
+{
+ if (this == NULL) {
+ return CFX_WideString();
+ }
+ if (m_Type == PDFOBJ_STRING) {
+ return PDF_DecodeText(((CPDF_String*)this)->m_String, pCharMap);
+ } else if (m_Type == PDFOBJ_STREAM) {
+ CPDF_StreamAcc stream;
+ stream.LoadAllData((CPDF_Stream*)this, FALSE);
+ CFX_WideString result = PDF_DecodeText(stream.GetData(), stream.GetSize(), pCharMap);
+ return result;
+ } else if (m_Type == PDFOBJ_NAME) {
+ return PDF_DecodeText(((CPDF_Name*)this)->m_Name, pCharMap);
+ }
+ return CFX_WideString();
+}
+void CPDF_Object::SetUnicodeText(FX_LPCWSTR pUnicodes, int len)
+{
+ if (this == NULL) {
+ return;
+ }
+ if (m_Type == PDFOBJ_STRING) {
+ ((CPDF_String*)this)->m_String = PDF_EncodeText(pUnicodes, len);
+ } else if (m_Type == PDFOBJ_STREAM) {
+ CFX_ByteString result = PDF_EncodeText(pUnicodes, len);
+ ((CPDF_Stream*)this)->SetData((FX_LPBYTE)(FX_LPCSTR)result, result.GetLength(), FALSE, FALSE);
+ }
+}
+CPDF_Number::CPDF_Number(int value)
+{
+ m_Type = PDFOBJ_NUMBER;
+ m_bInteger = TRUE;
+ m_Integer = value;
+}
+CPDF_Number::CPDF_Number(FX_FLOAT value)
+{
+ m_Type = PDFOBJ_NUMBER;
+ m_bInteger = FALSE;
+ m_Float = value;
+}
+CPDF_Number::CPDF_Number(FX_BOOL bInteger, void* pData)
+{
+ m_Type = PDFOBJ_NUMBER;
+ m_bInteger = bInteger;
+ m_Integer = *(int*)pData;
+}
+extern void FX_atonum(FX_BSTR, FX_BOOL&, void*);
+CPDF_Number::CPDF_Number(FX_BSTR str)
+{
+ m_Type = PDFOBJ_NUMBER;
+ FX_atonum(str, m_bInteger, &m_Integer);
+}
+void CPDF_Number::SetString(FX_BSTR str)
+{
+ FX_atonum(str, m_bInteger, &m_Integer);
+}
+FX_BOOL CPDF_Number::Identical(CPDF_Number* pOther) const
+{
+ return m_bInteger == pOther->m_bInteger && m_Integer == pOther->m_Integer;
+}
+CFX_ByteString CPDF_Number::GetString() const
+{
+ return m_bInteger ? CFX_ByteString::FormatInteger(m_Integer, FXFORMAT_SIGNED) : CFX_ByteString::FormatFloat(m_Float);
+}
+void CPDF_Number::SetNumber(FX_FLOAT value)
+{
+ m_bInteger = FALSE;
+ m_Float = value;
+}
+CPDF_String::CPDF_String(const CFX_WideString& str)
+{
+ m_Type = PDFOBJ_STRING;
+ m_String = PDF_EncodeText(str, str.GetLength());
+ m_bHex = FALSE;
+}
+CPDF_Array::~CPDF_Array()
+{
+ int size = m_Objects.GetSize();
+ CPDF_Object** pList = (CPDF_Object**)m_Objects.GetData();
+ for (int i = 0; i < size; i ++) {
+ pList[i]->Release();
+ }
+}
+CFX_FloatRect CPDF_Array::GetRect()
+{
+ CFX_FloatRect rect;
+ if (this == NULL || m_Type != PDFOBJ_ARRAY || m_Objects.GetSize() != 4) {
+ return rect;
+ }
+ rect.left = GetNumber(0);
+ rect.bottom = GetNumber(1);
+ rect.right = GetNumber(2);
+ rect.top = GetNumber(3);
+ return rect;
+}
+CFX_AffineMatrix CPDF_Array::GetMatrix()
+{
+ CFX_AffineMatrix matrix;
+ if (this == NULL || m_Type != PDFOBJ_ARRAY || m_Objects.GetSize() != 6) {
+ return matrix;
+ }
+ matrix.Set(GetNumber(0), GetNumber(1), GetNumber(2), GetNumber(3), GetNumber(4), GetNumber(5));
+ return matrix;
+}
+CPDF_Object* CPDF_Array::GetElement(FX_DWORD i) const
+{
+ if (this == NULL) {
+ return NULL;
+ }
+ if (i >= (FX_DWORD)m_Objects.GetSize()) {
+ return NULL;
+ }
+ return (CPDF_Object*)m_Objects.GetAt(i);
+}
+CPDF_Object* CPDF_Array::GetElementValue(FX_DWORD i) const
+{
+ if (this == NULL) {
+ return NULL;
+ }
+ if (i >= (FX_DWORD)m_Objects.GetSize()) {
+ return NULL;
+ }
+ return ((CPDF_Object*)m_Objects.GetAt(i))->GetDirect();
+}
+CFX_ByteString CPDF_Array::GetString(FX_DWORD i) const
+{
+ if (this && i < (FX_DWORD)m_Objects.GetSize()) {
+ CPDF_Object* p = (CPDF_Object*)m_Objects.GetAt(i);
+ return p->GetString();
+ }
+ return CFX_ByteString();
+}
+CFX_ByteStringC CPDF_Array::GetConstString(FX_DWORD i) const
+{
+ if (this && i < (FX_DWORD)m_Objects.GetSize()) {
+ CPDF_Object* p = (CPDF_Object*)m_Objects.GetAt(i);
+ return p->GetConstString();
+ }
+ return CFX_ByteStringC();
+}
+int CPDF_Array::GetInteger(FX_DWORD i) const
+{
+ if (this == NULL || i >= (FX_DWORD)m_Objects.GetSize()) {
+ return 0;
+ }
+ CPDF_Object* p = (CPDF_Object*)m_Objects.GetAt(i);
+ return p->GetInteger();
+}
+FX_FLOAT CPDF_Array::GetNumber(FX_DWORD i) const
+{
+ if (this == NULL || i >= (FX_DWORD)m_Objects.GetSize()) {
+ return 0;
+ }
+ CPDF_Object* p = (CPDF_Object*)m_Objects.GetAt(i);
+ return p->GetNumber();
+}
+CPDF_Dictionary* CPDF_Array::GetDict(FX_DWORD i) const
+{
+ CPDF_Object* p = GetElementValue(i);
+ if (p == NULL) {
+ return NULL;
+ } else if (p->GetType() == PDFOBJ_DICTIONARY) {
+ return (CPDF_Dictionary*)p;
+ } else if (p->GetType() == PDFOBJ_STREAM) {
+ return ((CPDF_Stream*)p)->GetDict();
+ }
+ return NULL;
+}
+CPDF_Stream* CPDF_Array::GetStream(FX_DWORD i) const
+{
+ CPDF_Object* p = GetElementValue(i);
+ if (p == NULL || p->GetType() != PDFOBJ_STREAM) {
+ return NULL;
+ }
+ return (CPDF_Stream*)p;
+}
+CPDF_Array* CPDF_Array::GetArray(FX_DWORD i) const
+{
+ CPDF_Object* p = GetElementValue(i);
+ if (p == NULL || p->GetType() != PDFOBJ_ARRAY) {
+ return NULL;
+ }
+ return (CPDF_Array*)p;
+}
+void CPDF_Array::RemoveAt(FX_DWORD i)
+{
+ ASSERT(this != NULL && m_Type == PDFOBJ_ARRAY);
+ if (i >= (FX_DWORD)m_Objects.GetSize()) {
+ return;
+ }
+ CPDF_Object* p = (CPDF_Object*)m_Objects.GetAt(i);
+ p->Release();
+ m_Objects.RemoveAt(i);
+}
+void CPDF_Array::SetAt(FX_DWORD i, CPDF_Object* pObj, CPDF_IndirectObjects* pObjs)
+{
+ ASSERT(this != NULL && m_Type == PDFOBJ_ARRAY);
+ ASSERT(i < (FX_DWORD)m_Objects.GetSize());
+ if (i >= (FX_DWORD)m_Objects.GetSize()) {
+ return;
+ }
+ CPDF_Object* pOld = (CPDF_Object*)m_Objects.GetAt(i);
+ pOld->Release();
+ if (pObj->GetObjNum()) {
+ ASSERT(pObjs != NULL);
+ pObj = CPDF_Reference::Create(pObjs, pObj->GetObjNum());
+ }
+ m_Objects.SetAt(i, pObj);
+}
+void CPDF_Array::InsertAt(FX_DWORD index, CPDF_Object* pObj, CPDF_IndirectObjects* pObjs)
+{
+ ASSERT(pObj != NULL);
+ if (pObj->GetObjNum()) {
+ ASSERT(pObjs != NULL);
+ pObj = CPDF_Reference::Create(pObjs, pObj->GetObjNum());
+ }
+ m_Objects.InsertAt(index, pObj);
+}
+void CPDF_Array::Add(CPDF_Object* pObj, CPDF_IndirectObjects* pObjs)
+{
+ ASSERT(pObj != NULL);
+ if (pObj->GetObjNum()) {
+ ASSERT(pObjs != NULL);
+ pObj = CPDF_Reference::Create(pObjs, pObj->GetObjNum());
+ }
+ m_Objects.Add(pObj);
+}
+void CPDF_Array::AddName(const CFX_ByteString& str)
+{
+ ASSERT(this != NULL && m_Type == PDFOBJ_ARRAY);
+ Add(FX_NEW CPDF_Name(str));
+}
+void CPDF_Array::AddString(const CFX_ByteString& str)
+{
+ ASSERT(this != NULL && m_Type == PDFOBJ_ARRAY);
+ Add(FX_NEW CPDF_String(str));
+}
+void CPDF_Array::AddInteger(int i)
+{
+ ASSERT(this != NULL && m_Type == PDFOBJ_ARRAY);
+ Add(FX_NEW CPDF_Number(i));
+}
+void CPDF_Array::AddNumber(FX_FLOAT f)
+{
+ ASSERT(this != NULL && m_Type == PDFOBJ_ARRAY);
+ CPDF_Number* pNumber = FX_NEW CPDF_Number;
+ pNumber->SetNumber(f);
+ Add(pNumber);
+}
+void CPDF_Array::AddReference(CPDF_IndirectObjects* pDoc, FX_DWORD objnum)
+{
+ ASSERT(this != NULL && m_Type == PDFOBJ_ARRAY);
+ Add(FX_NEW CPDF_Reference(pDoc, objnum));
+}
+FX_BOOL CPDF_Array::Identical(CPDF_Array* pOther) const
+{
+ if (m_Objects.GetSize() != pOther->m_Objects.GetSize()) {
+ return FALSE;
+ }
+ for (int i = 0; i < m_Objects.GetSize(); i ++)
+ if (!((CPDF_Object*)m_Objects[i])->IsIdentical((CPDF_Object*)pOther->m_Objects[i])) {
+ return FALSE;
+ }
+ return TRUE;
+}
+CPDF_Dictionary::~CPDF_Dictionary()
+{
+ FX_POSITION pos = m_Map.GetStartPosition();
+ while (pos) {
+ FX_LPVOID value = m_Map.GetNextValue(pos);
+ ((CPDF_Object*)value)->Release();
+ }
+}
+FX_POSITION CPDF_Dictionary::GetStartPos() const
+{
+ return m_Map.GetStartPosition();
+}
+CPDF_Object* CPDF_Dictionary::GetNextElement(FX_POSITION& pos, CFX_ByteString& key) const
+{
+ if (pos == NULL) {
+ return NULL;
+ }
+ CPDF_Object* p;
+ m_Map.GetNextAssoc(pos, key, (FX_LPVOID&)p);
+ return p;
+}
+CPDF_Object* CPDF_Dictionary::GetElement(FX_BSTR key) const
+{
+ if (this == NULL) {
+ return NULL;
+ }
+ CPDF_Object* p = NULL;
+ m_Map.Lookup(key, (void*&)p);
+ return p;
+}
+CPDF_Object* CPDF_Dictionary::GetElementValue(FX_BSTR key) const
+{
+ if (this == NULL) {
+ return NULL;
+ }
+ CPDF_Object* p = NULL;
+ m_Map.Lookup(key, (void*&)p);
+ return p->GetDirect();
+}
+CFX_ByteString CPDF_Dictionary::GetString(FX_BSTR key) const
+{
+ if (this) {
+ CPDF_Object* p = NULL;
+ m_Map.Lookup(key, (void*&)p);
+ if (p) {
+ return p->GetString();
+ }
+ }
+ return CFX_ByteString();
+}
+CFX_ByteStringC CPDF_Dictionary::GetConstString(FX_BSTR key) const
+{
+ if (this) {
+ CPDF_Object* p = NULL;
+ m_Map.Lookup(key, (void*&)p);
+ if (p) {
+ return p->GetConstString();
+ }
+ }
+ return CFX_ByteStringC();
+}
+CFX_WideString CPDF_Dictionary::GetUnicodeText(FX_BSTR key, CFX_CharMap* pCharMap) const
+{
+ if (this) {
+ CPDF_Object* p = NULL;
+ m_Map.Lookup(key, (void*&)p);
+ if (p) {
+ if(p->GetType() == PDFOBJ_REFERENCE) {
+ p = ((CPDF_Reference*)p)->GetDirect();
+ return p->GetUnicodeText(pCharMap);
+ } else {
+ return p->GetUnicodeText(pCharMap);
+ }
+ }
+ }
+ return CFX_WideString();
+}
+CFX_ByteString CPDF_Dictionary::GetString(FX_BSTR key, FX_BSTR def) const
+{
+ if (this) {
+ CPDF_Object* p = NULL;
+ m_Map.Lookup(key, (void*&)p);
+ if (p) {
+ return p->GetString();
+ }
+ }
+ return CFX_ByteString(def);
+}
+CFX_ByteStringC CPDF_Dictionary::GetConstString(FX_BSTR key, FX_BSTR def) const
+{
+ if (this) {
+ CPDF_Object* p = NULL;
+ m_Map.Lookup(key, (void*&)p);
+ if (p) {
+ return p->GetConstString();
+ }
+ }
+ return CFX_ByteStringC(def);
+}
+int CPDF_Dictionary::GetInteger(FX_BSTR key) const
+{
+ if (this) {
+ CPDF_Object* p = NULL;
+ m_Map.Lookup(key, (void*&)p);
+ if (p) {
+ return p->GetInteger();
+ }
+ }
+ return 0;
+}
+int CPDF_Dictionary::GetInteger(FX_BSTR key, int def) const
+{
+ if (this) {
+ CPDF_Object* p = NULL;
+ m_Map.Lookup(key, (void*&)p);
+ if (p) {
+ return p->GetInteger();
+ }
+ }
+ return def;
+}
+FX_FLOAT CPDF_Dictionary::GetNumber(FX_BSTR key) const
+{
+ if (this) {
+ CPDF_Object* p = NULL;
+ m_Map.Lookup(key, (void*&)p);
+ if (p) {
+ return p->GetNumber();
+ }
+ }
+ return 0;
+}
+FX_BOOL CPDF_Dictionary::GetBoolean(FX_BSTR key, FX_BOOL bDefault) const
+{
+ if (this) {
+ CPDF_Object* p = NULL;
+ m_Map.Lookup(key, (void*&)p);
+ if (p && p->GetType() == PDFOBJ_BOOLEAN) {
+ return p->GetInteger();
+ }
+ }
+ return bDefault;
+}
+CPDF_Dictionary* CPDF_Dictionary::GetDict(FX_BSTR key) const
+{
+ CPDF_Object* p = GetElementValue(key);
+ if (p == NULL) {
+ return NULL;
+ } else if (p->GetType() == PDFOBJ_DICTIONARY) {
+ return (CPDF_Dictionary*)p;
+ } else if (p->GetType() == PDFOBJ_STREAM) {
+ return ((CPDF_Stream*)p)->GetDict();
+ }
+ return NULL;
+}
+CPDF_Array* CPDF_Dictionary::GetArray(FX_BSTR key) const
+{
+ CPDF_Object* p = GetElementValue(key);
+ if (p == NULL || p->GetType() != PDFOBJ_ARRAY) {
+ return NULL;
+ }
+ return (CPDF_Array*)p;
+}
+CPDF_Stream* CPDF_Dictionary::GetStream(FX_BSTR key) const
+{
+ CPDF_Object* p = GetElementValue(key);
+ if (p == NULL || p->GetType() != PDFOBJ_STREAM) {
+ return NULL;
+ }
+ return (CPDF_Stream*)p;
+}
+CFX_FloatRect CPDF_Dictionary::GetRect(FX_BSTR key) const
+{
+ CFX_FloatRect rect;
+ CPDF_Array* pArray = GetArray(key);
+ if (pArray) {
+ rect = pArray->GetRect();
+ }
+ return rect;
+}
+CFX_AffineMatrix CPDF_Dictionary::GetMatrix(FX_BSTR key) const
+{
+ CFX_AffineMatrix matrix;
+ CPDF_Array* pArray = GetArray(key);
+ if (pArray) {
+ matrix = pArray->GetMatrix();
+ }
+ return matrix;
+}
+FX_BOOL CPDF_Dictionary::KeyExist(FX_BSTR key) const
+{
+ if (this == NULL) {
+ return FALSE;
+ }
+ FX_LPVOID value;
+ return m_Map.Lookup(key, value);
+}
+void CPDF_Dictionary::SetAt(FX_BSTR key, CPDF_Object* pObj, CPDF_IndirectObjects* pObjs)
+{
+ ASSERT(this != NULL && m_Type == PDFOBJ_DICTIONARY);
+ CPDF_Object* p = NULL;
+ m_Map.Lookup(key, (void*&)p);
+ if (p == pObj) {
+ return;
+ }
+ if (p) {
+ p->Release();
+ }
+ if (pObj) {
+ if (pObj->GetObjNum()) {
+ ASSERT(pObjs != NULL);
+ pObj = CPDF_Reference::Create(pObjs, pObj->GetObjNum());
+ }
+ m_Map.SetAt(key, pObj);
+ } else {
+ m_Map.RemoveKey(key);
+ }
+}
+void CPDF_Dictionary::AddValue(FX_BSTR key, CPDF_Object* pObj)
+{
+ ASSERT(this != NULL && m_Type == PDFOBJ_DICTIONARY);
+ m_Map.AddValue(key, pObj);
+}
+void CPDF_Dictionary::RemoveAt(FX_BSTR key)
+{
+ ASSERT(this != NULL && m_Type == PDFOBJ_DICTIONARY);
+ CPDF_Object* p = NULL;
+ m_Map.Lookup(key, (void*&)p);
+ if (p == NULL) {
+ return;
+ }
+ p->Release();
+ m_Map.RemoveKey(key);
+}
+void CPDF_Dictionary::ReplaceKey(FX_BSTR oldkey, FX_BSTR newkey)
+{
+ ASSERT(this != NULL && m_Type == PDFOBJ_DICTIONARY);
+ CPDF_Object* p = NULL;
+ m_Map.Lookup(oldkey, (void*&)p);
+ if (p == NULL) {
+ return;
+ }
+ m_Map.RemoveKey(oldkey);
+ m_Map.SetAt(newkey, p);
+}
+FX_BOOL CPDF_Dictionary::Identical(CPDF_Dictionary* pOther) const
+{
+ if (this == NULL) {
+ if (pOther == NULL) {
+ return TRUE;
+ }
+ return FALSE;
+ }
+ if (pOther == NULL) {
+ return FALSE;
+ }
+ if (m_Map.GetCount() != pOther->m_Map.GetCount()) {
+ return FALSE;
+ }
+ FX_POSITION pos = m_Map.GetStartPosition();
+ while (pos) {
+ CFX_ByteString key;
+ FX_LPVOID value;
+ m_Map.GetNextAssoc(pos, key, value);
+ if (!((CPDF_Object*)value)->IsIdentical(pOther->GetElement(key))) {
+ return FALSE;
+ }
+ }
+ return TRUE;
+}
+void CPDF_Dictionary::SetAtInteger(FX_BSTR key, int i)
+{
+ SetAt(key, FX_NEW CPDF_Number(i));
+}
+void CPDF_Dictionary::SetAtName(FX_BSTR key, const CFX_ByteString& name)
+{
+ SetAt(key, FX_NEW CPDF_Name(name));
+}
+void CPDF_Dictionary::SetAtString(FX_BSTR key, const CFX_ByteString& str)
+{
+ SetAt(key, FX_NEW CPDF_String(str));
+}
+void CPDF_Dictionary::SetAtReference(FX_BSTR key, CPDF_IndirectObjects* pDoc, FX_DWORD objnum)
+{
+ SetAt(key, FX_NEW CPDF_Reference(pDoc, objnum));
+}
+void CPDF_Dictionary::AddReference(FX_BSTR key, CPDF_IndirectObjects* pDoc, FX_DWORD objnum)
+{
+ AddValue(key, FX_NEW CPDF_Reference(pDoc, objnum));
+}
+void CPDF_Dictionary::SetAtNumber(FX_BSTR key, FX_FLOAT f)
+{
+ CPDF_Number* pNumber = FX_NEW CPDF_Number;
+ pNumber->SetNumber(f);
+ SetAt(key, pNumber);
+}
+void CPDF_Dictionary::SetAtBoolean(FX_BSTR key, FX_BOOL bValue)
+{
+ SetAt(key, FX_NEW CPDF_Boolean(bValue));
+}
+void CPDF_Dictionary::SetAtRect(FX_BSTR key, const CFX_FloatRect& rect)
+{
+ CPDF_Array* pArray = FX_NEW CPDF_Array;
+ pArray->AddNumber(rect.left);
+ pArray->AddNumber(rect.bottom);
+ pArray->AddNumber(rect.right);
+ pArray->AddNumber(rect.top);
+ SetAt(key, pArray);
+}
+void CPDF_Dictionary::SetAtMatrix(FX_BSTR key, const CFX_AffineMatrix& matrix)
+{
+ CPDF_Array* pArray = FX_NEW CPDF_Array;
+ pArray->AddNumber16(matrix.a);
+ pArray->AddNumber16(matrix.b);
+ pArray->AddNumber16(matrix.c);
+ pArray->AddNumber16(matrix.d);
+ pArray->AddNumber(matrix.e);
+ pArray->AddNumber(matrix.f);
+ SetAt(key, pArray);
+}
+CPDF_Stream::CPDF_Stream(FX_LPBYTE pData, FX_DWORD size, CPDF_Dictionary* pDict)
+{
+ m_Type = PDFOBJ_STREAM;
+ m_pDict = pDict;
+ m_dwSize = size;
+ m_GenNum = (FX_DWORD) - 1;
+ m_pDataBuf = pData;
+ m_pCryptoHandler = NULL;
+}
+CPDF_Stream::~CPDF_Stream()
+{
+ if (m_GenNum == (FX_DWORD) - 1 && m_pDataBuf != NULL) {
+ FX_Free(m_pDataBuf);
+ }
+ if (m_pDict) {
+ m_pDict->Release();
+ }
+}
+void CPDF_Stream::InitStream(CPDF_Dictionary* pDict)
+{
+ if (pDict) {
+ if (m_pDict) {
+ m_pDict->Release();
+ }
+ m_pDict = pDict;
+ }
+ if (m_GenNum == (FX_DWORD) - 1) {
+ if (m_pDataBuf) {
+ FX_Free(m_pDataBuf);
+ }
+ }
+ m_GenNum = 0;
+ m_pFile = NULL;
+ m_pCryptoHandler = NULL;
+ m_FileOffset = 0;
+}
+void CPDF_Stream::InitStream(FX_LPBYTE pData, FX_DWORD size, CPDF_Dictionary* pDict)
+{
+ InitStream(pDict);
+ m_GenNum = (FX_DWORD) - 1;
+ m_pDataBuf = FX_Alloc(FX_BYTE, size);
+ if (pData) {
+ FXSYS_memcpy32(m_pDataBuf, pData, size);
+ }
+ m_dwSize = size;
+ if (m_pDict) {
+ m_pDict->SetAtInteger(FX_BSTRC("Length"), size);
+ }
+}
+void CPDF_Stream::SetData(FX_LPCBYTE pData, FX_DWORD size, FX_BOOL bCompressed, FX_BOOL bKeepBuf)
+{
+ if (m_GenNum == (FX_DWORD) - 1) {
+ if (m_pDataBuf) {
+ FX_Free(m_pDataBuf);
+ }
+ } else {
+ m_GenNum = (FX_DWORD) - 1;
+ m_pCryptoHandler = NULL;
+ }
+ if (bKeepBuf) {
+ m_pDataBuf = (FX_LPBYTE)pData;
+ } else {
+ m_pDataBuf = FX_Alloc(FX_BYTE, size);
+ if (pData) {
+ FXSYS_memcpy32(m_pDataBuf, pData, size);
+ }
+ }
+ m_dwSize = size;
+ if (m_pDict == NULL) {
+ m_pDict = FX_NEW CPDF_Dictionary;
+ }
+ m_pDict->SetAtInteger(FX_BSTRC("Length"), size);
+ if (!bCompressed) {
+ m_pDict->RemoveAt(FX_BSTRC("Filter"));
+ m_pDict->RemoveAt(FX_BSTRC("DecodeParms"));
+ }
+}
+FX_BOOL CPDF_Stream::ReadRawData(FX_FILESIZE offset, FX_LPBYTE buf, FX_DWORD size) const
+{
+ if ((m_GenNum != (FX_DWORD) - 1) && m_pFile) {
+ return m_pFile->ReadBlock(buf, m_FileOffset + offset, size);
+ }
+ if (m_pDataBuf) {
+ FXSYS_memcpy32(buf, m_pDataBuf + offset, size);
+ }
+ return TRUE;
+}
+void CPDF_Stream::InitStream(IFX_FileRead *pFile, CPDF_Dictionary* pDict)
+{
+ InitStream(pDict);
+ m_pFile = pFile;
+ m_dwSize = (FX_DWORD)pFile->GetSize();
+ if (m_pDict) {
+ m_pDict->SetAtInteger(FX_BSTRC("Length"), m_dwSize);
+ }
+}
+FX_BOOL CPDF_Stream::Identical(CPDF_Stream* pOther) const
+{
+ if (!m_pDict->Identical(pOther->m_pDict)) {
+ return FALSE;
+ }
+ if (m_dwSize != pOther->m_dwSize) {
+ return FALSE;
+ }
+ if (m_GenNum != (FX_DWORD) - 1 && pOther->m_GenNum != (FX_DWORD) - 1) {
+ if (m_pFile == pOther->m_pFile && m_pFile == NULL) {
+ return TRUE;
+ }
+ if (!m_pFile || !pOther->m_pFile) {
+ return FALSE;
+ }
+ FX_BYTE srcBuf[1024];
+ FX_BYTE destBuf[1024];
+ FX_DWORD size = m_dwSize;
+ FX_DWORD srcOffset = m_FileOffset;
+ FX_DWORD destOffset = pOther->m_FileOffset;
+ if (m_pFile == pOther->m_pFile && srcOffset == destOffset) {
+ return TRUE;
+ }
+ while (size > 0) {
+ FX_DWORD actualSize = size > 1024 ? 1024 : size;
+ m_pFile->ReadBlock(srcBuf, srcOffset, actualSize);
+ pOther->m_pFile->ReadBlock(destBuf, destOffset, actualSize);
+ if (FXSYS_memcmp32(srcBuf, destBuf, actualSize) != 0) {
+ return FALSE;
+ }
+ size -= actualSize;
+ srcOffset += actualSize;
+ destOffset += actualSize;
+ }
+ return TRUE;
+ }
+ if (m_GenNum != (FX_DWORD) - 1 || pOther->m_GenNum != (FX_DWORD) - 1) {
+ IFX_FileRead* pFile = NULL;
+ FX_LPBYTE pBuf = NULL;
+ FX_DWORD offset = 0;
+ if (m_GenNum != (FX_DWORD) - 1) {
+ pFile = m_pFile;
+ pBuf = pOther->m_pDataBuf;
+ offset = m_FileOffset;
+ }
+ if (pOther->m_GenNum != (FX_DWORD) - 1) {
+ pFile = pOther->m_pFile;
+ pBuf = m_pDataBuf;
+ offset = pOther->m_FileOffset;
+ }
+ if (NULL == pBuf) {
+ return FALSE;
+ }
+ FX_BYTE srcBuf[1024];
+ FX_DWORD size = m_dwSize;
+ while (size > 0) {
+ FX_DWORD actualSize = size > 1024 ? 1024 : size;
+ m_pFile->ReadBlock(srcBuf, offset, actualSize);
+ if (FXSYS_memcmp32(srcBuf, pBuf, actualSize) != 0) {
+ return FALSE;
+ }
+ pBuf += actualSize;
+ size -= actualSize;
+ offset += actualSize;
+ }
+ return TRUE;
+ }
+ return FXSYS_memcmp32(m_pDataBuf, pOther->m_pDataBuf, m_dwSize) == 0;
+}
+CPDF_Stream* CPDF_Stream::Clone(FX_BOOL bDirect, FPDF_LPFCloneStreamCallback lpfCallback, FX_LPVOID pUserData) const
+{
+ CPDF_Dictionary *pCloneDict = (CPDF_Dictionary*)m_pDict->Clone(bDirect);
+ IFX_FileStream *pFS = NULL;
+ if (lpfCallback) {
+ pFS = lpfCallback((CPDF_Stream*)this, pUserData);
+ }
+ if (!pFS) {
+ CPDF_StreamAcc acc;
+ acc.LoadAllData(this, TRUE);
+ FX_DWORD streamSize = acc.GetSize();
+ CPDF_Stream* pObj = FX_NEW CPDF_Stream(acc.DetachData(), streamSize, pCloneDict);
+ return pObj;
+ }
+ CPDF_Stream* pObj = FX_NEW CPDF_Stream(NULL, 0, NULL);
+ CPDF_StreamFilter *pSF = GetStreamFilter(TRUE);
+ if (pSF) {
+ FX_LPBYTE pBuf = FX_Alloc(FX_BYTE, 4096);
+ FX_DWORD dwRead;
+ do {
+ dwRead = pSF->ReadBlock(pBuf, 4096);
+ if (dwRead) {
+ pFS->WriteBlock(pBuf, dwRead);
+ }
+ } while (dwRead == 4096);
+ pFS->Flush();
+ FX_Free(pBuf);
+ delete pSF;
+ }
+ pObj->InitStream((IFX_FileRead*)pFS, pCloneDict);
+ return pObj;
+}
+extern FX_BOOL PDF_DataDecode(FX_LPCBYTE src_buf, FX_DWORD src_size, const CPDF_Dictionary* pDict,
+ FX_LPBYTE& dest_buf, FX_DWORD& dest_size, CFX_ByteString& ImageEncoding,
+ CPDF_Dictionary*& pImageParms, FX_DWORD estimated_size, FX_BOOL bImageAcc);
+CPDF_StreamAcc::CPDF_StreamAcc()
+{
+ m_bNewBuf = FALSE;
+ m_pData = NULL;
+ m_dwSize = 0;
+ m_pImageParam = NULL;
+ m_pStream = NULL;
+ m_pSrcData = NULL;
+}
+void CPDF_StreamAcc::LoadAllData(const CPDF_Stream* pStream, FX_BOOL bRawAccess, FX_DWORD estimated_size,
+ FX_BOOL bImageAcc)
+{
+ if (pStream == NULL || pStream->GetType() != PDFOBJ_STREAM) {
+ return;
+ }
+ m_pStream = pStream;
+ if (pStream->IsMemoryBased() &&
+ (!pStream->GetDict()->KeyExist(FX_BSTRC("Filter")) || bRawAccess)) {
+ m_dwSize = pStream->m_dwSize;
+ m_pData = (FX_LPBYTE)pStream->m_pDataBuf;
+ return;
+ }
+ FX_LPBYTE pSrcData;
+ FX_DWORD dwSrcSize = pStream->m_dwSize;
+ if (dwSrcSize == 0) {
+ return;
+ }
+ if (!pStream->IsMemoryBased()) {
+ pSrcData = m_pSrcData = FX_Alloc(FX_BYTE, dwSrcSize);
+ if (!pSrcData || !pStream->ReadRawData(0, pSrcData, dwSrcSize)) {
+ return;
+ }
+ } else {
+ pSrcData = pStream->m_pDataBuf;
+ }
+ FX_LPBYTE pDecryptedData;
+ FX_DWORD dwDecryptedSize;
+ if (pStream->m_pCryptoHandler) {
+ CFX_BinaryBuf dest_buf;
+ dest_buf.EstimateSize(pStream->m_pCryptoHandler->DecryptGetSize(dwSrcSize));
+ FX_LPVOID context = pStream->m_pCryptoHandler->DecryptStart(pStream->GetObjNum(), pStream->m_GenNum);
+ pStream->m_pCryptoHandler->DecryptStream(context, pSrcData, dwSrcSize, dest_buf);
+ pStream->m_pCryptoHandler->DecryptFinish(context, dest_buf);
+ pDecryptedData = dest_buf.GetBuffer();
+ dwDecryptedSize = dest_buf.GetSize();
+ dest_buf.DetachBuffer();
+ } else {
+ pDecryptedData = pSrcData;
+ dwDecryptedSize = dwSrcSize;
+ }
+ if (!pStream->GetDict()->KeyExist(FX_BSTRC("Filter")) || bRawAccess) {
+ m_pData = pDecryptedData;
+ m_dwSize = dwDecryptedSize;
+ } else {
+ FX_BOOL bRet = PDF_DataDecode(pDecryptedData, dwDecryptedSize, m_pStream->GetDict(),
+ m_pData, m_dwSize, m_ImageDecoder, m_pImageParam, estimated_size, bImageAcc);
+ if (!bRet) {
+ m_pData = pDecryptedData;
+ m_dwSize = dwDecryptedSize;
+ }
+ }
+ if (pSrcData != pStream->m_pDataBuf && pSrcData != m_pData) {
+ FX_Free(pSrcData);
+ }
+ if (pDecryptedData != pSrcData && pDecryptedData != m_pData) {
+ FX_Free(pDecryptedData);
+ }
+ m_pSrcData = NULL;
+ m_bNewBuf = m_pData != pStream->m_pDataBuf;
+}
+CPDF_StreamAcc::~CPDF_StreamAcc()
+{
+ if (m_bNewBuf && m_pData) {
+ FX_Free(m_pData);
+ }
+ if (m_pSrcData) {
+ FX_Free(m_pSrcData);
+ }
+}
+FX_LPCBYTE CPDF_StreamAcc::GetData() const
+{
+ if (m_bNewBuf) {
+ return m_pData;
+ }
+ if (!m_pStream) {
+ return NULL;
+ }
+ return m_pStream->m_pDataBuf;
+}
+FX_DWORD CPDF_StreamAcc::GetSize() const
+{
+ if (m_bNewBuf) {
+ return m_dwSize;
+ }
+ if (!m_pStream) {
+ return 0;
+ }
+ return m_pStream->m_dwSize;
+}
+FX_LPBYTE CPDF_StreamAcc::DetachData()
+{
+ if (m_bNewBuf) {
+ FX_LPBYTE p = m_pData;
+ m_pData = NULL;
+ m_dwSize = 0;
+ return p;
+ }
+ FX_LPBYTE p = FX_Alloc(FX_BYTE, m_dwSize);
+ if (p == NULL) {
+ return NULL;
+ }
+ FXSYS_memcpy32(p, m_pData, m_dwSize);
+ return p;
+}
+void CPDF_Reference::SetRef(CPDF_IndirectObjects* pDoc, FX_DWORD objnum)
+{
+ m_pObjList = pDoc;
+ m_RefObjNum = objnum;
+}
+CPDF_IndirectObjects::CPDF_IndirectObjects(IPDF_DocParser* pParser)
+{
+ m_pParser = pParser;
+ m_IndirectObjs.InitHashTable(1013);
+ if (pParser) {
+ m_LastObjNum = m_pParser->GetLastObjNum();
+ } else {
+ m_LastObjNum = 0;
+ }
+}
+CPDF_IndirectObjects::~CPDF_IndirectObjects()
+{
+ FX_POSITION pos = m_IndirectObjs.GetStartPosition();
+ while (pos) {
+ FX_LPVOID key, value;
+ m_IndirectObjs.GetNextAssoc(pos, key, value);
+ ((CPDF_Object*)value)->Destroy();
+ }
+}
+CPDF_Object* CPDF_IndirectObjects::GetIndirectObject(FX_DWORD objnum, struct PARSE_CONTEXT* pContext)
+{
+ if (objnum == 0) {
+ return NULL;
+ }
+ FX_LPVOID value;
+ {
+ if (m_IndirectObjs.Lookup((FX_LPVOID)(FX_UINTPTR)objnum, value)) {
+ if (((CPDF_Object*)value)->GetObjNum() == -1) {
+ return NULL;
+ }
+ return (CPDF_Object*)value;
+ }
+ }
+ CPDF_Object* pObj = NULL;
+ if (m_pParser) {
+ pObj = m_pParser->ParseIndirectObject(this, objnum, pContext);
+ }
+ if (pObj == NULL) {
+ return NULL;
+ }
+ pObj->m_ObjNum = objnum;
+ if (m_LastObjNum < objnum) {
+ m_LastObjNum = objnum;
+ }
+ if (m_IndirectObjs.Lookup((FX_LPVOID)(FX_UINTPTR)objnum, value)) {
+ if (value) {
+ ((CPDF_Object *)value)->Destroy();
+ }
+ }
+ m_IndirectObjs.SetAt((FX_LPVOID)(FX_UINTPTR)objnum, pObj);
+ return pObj;
+}
+int CPDF_IndirectObjects::GetIndirectType(FX_DWORD objnum)
+{
+ FX_LPVOID value;
+ if (m_IndirectObjs.Lookup((FX_LPVOID)(FX_UINTPTR)objnum, value)) {
+ return ((CPDF_Object*)value)->GetType();
+ }
+ if (m_pParser) {
+ PARSE_CONTEXT context;
+ FXSYS_memset32(&context, 0, sizeof(PARSE_CONTEXT));
+ context.m_Flags = PDFPARSE_TYPEONLY;
+ return (int)(FX_UINTPTR)m_pParser->ParseIndirectObject(this, objnum, &context);
+ }
+ return 0;
+}
+FX_DWORD CPDF_IndirectObjects::AddIndirectObject(CPDF_Object* pObj)
+{
+ if (pObj->m_ObjNum) {
+ return pObj->m_ObjNum;
+ }
+ m_LastObjNum ++;
+ m_IndirectObjs.SetAt((FX_LPVOID)(FX_UINTPTR)m_LastObjNum, pObj);
+ pObj->m_ObjNum = m_LastObjNum;
+ return m_LastObjNum;
+}
+void CPDF_IndirectObjects::ReleaseIndirectObject(FX_DWORD objnum)
+{
+ FX_LPVOID value;
+ if (!m_IndirectObjs.Lookup((FX_LPVOID)(FX_UINTPTR)objnum, value)) {
+ return;
+ }
+ if (((CPDF_Object*)value)->GetObjNum() == -1) {
+ return;
+ }
+ ((CPDF_Object*)value)->Destroy();
+ m_IndirectObjs.RemoveKey((FX_LPVOID)(FX_UINTPTR)objnum);
+}
+void CPDF_IndirectObjects::InsertIndirectObject(FX_DWORD objnum, CPDF_Object* pObj)
+{
+ if (objnum == 0 || pObj == NULL) {
+ return;
+ }
+ FX_LPVOID value;
+ if (m_IndirectObjs.Lookup((FX_LPVOID)(FX_UINTPTR)objnum, value)) {
+ ((CPDF_Object*)value)->Destroy();
+ }
+ pObj->m_ObjNum = objnum;
+ m_IndirectObjs.SetAt((FX_LPVOID)(FX_UINTPTR)objnum, pObj);
+ if (m_LastObjNum < objnum) {
+ m_LastObjNum = objnum;
+ }
+}
+FX_DWORD CPDF_IndirectObjects::GetLastObjNum() const
+{
+ return m_LastObjNum;
+}
diff --git a/core/src/fpdfapi/fpdf_parser/fpdf_parser_utility.cpp b/core/src/fpdfapi/fpdf_parser/fpdf_parser_utility.cpp
index cc3d29c9ed..7559bcee91 100644
--- a/core/src/fpdfapi/fpdf_parser/fpdf_parser_utility.cpp
+++ b/core/src/fpdfapi/fpdf_parser/fpdf_parser_utility.cpp
@@ -1,453 +1,453 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../../include/fpdfapi/fpdf_parser.h"
-extern const FX_LPCSTR _PDF_CharType =
- "WRRRRRRRRWWRWWRRRRRRRRRRRRRRRRRR"
- "WRRRRDRRDDRNRNNDNNNNNNNNNNRRDRDR"
- "RRRRRRRRRRRRRRRRRRRRRRRRRRRDRDRR"
- "RRRRRRRRRRRRRRRRRRRRRRRRRRRDRDRR"
- "WRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR"
- "RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR"
- "RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR"
- "RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRW";
-#ifndef MAX_PATH
-#define MAX_PATH 4096
-#endif
-CPDF_SimpleParser::CPDF_SimpleParser(FX_LPCBYTE pData, FX_DWORD dwSize)
-{
- m_pData = pData;
- m_dwSize = dwSize;
- m_dwCurPos = 0;
-}
-CPDF_SimpleParser::CPDF_SimpleParser(FX_BSTR str)
-{
- m_pData = str;
- m_dwSize = str.GetLength();
- m_dwCurPos = 0;
-}
-void CPDF_SimpleParser::ParseWord(FX_LPCBYTE& pStart, FX_DWORD& dwSize, int& type)
-{
- pStart = NULL;
- dwSize = 0;
- type = PDFWORD_EOF;
- FX_BYTE ch;
- char chartype;
- while (1) {
- if (m_dwSize <= m_dwCurPos) {
- return;
- }
- ch = m_pData[m_dwCurPos++];
- chartype = _PDF_CharType[ch];
- while (chartype == 'W') {
- if (m_dwSize <= m_dwCurPos) {
- return;
- }
- ch = m_pData[m_dwCurPos++];
- chartype = _PDF_CharType[ch];
- }
- if (ch != '%') {
- break;
- }
- while (1) {
- if (m_dwSize <= m_dwCurPos) {
- return;
- }
- ch = m_pData[m_dwCurPos++];
- if (ch == '\r' || ch == '\n') {
- break;
- }
- }
- chartype = _PDF_CharType[ch];
- }
- FX_DWORD start_pos = m_dwCurPos - 1;
- pStart = m_pData + start_pos;
- if (chartype == 'D') {
- if (ch == '/') {
- while (1) {
- if (m_dwSize <= m_dwCurPos) {
- return;
- }
- ch = m_pData[m_dwCurPos++];
- chartype = _PDF_CharType[ch];
- if (chartype != 'R' && chartype != 'N') {
- m_dwCurPos --;
- dwSize = m_dwCurPos - start_pos;
- type = PDFWORD_NAME;
- return;
- }
- }
- } else {
- type = PDFWORD_DELIMITER;
- dwSize = 1;
- if (ch == '<') {
- if (m_dwSize <= m_dwCurPos) {
- return;
- }
- ch = m_pData[m_dwCurPos++];
- if (ch == '<') {
- dwSize = 2;
- } else {
- m_dwCurPos --;
- }
- } else if (ch == '>') {
- if (m_dwSize <= m_dwCurPos) {
- return;
- }
- ch = m_pData[m_dwCurPos++];
- if (ch == '>') {
- dwSize = 2;
- } else {
- m_dwCurPos --;
- }
- }
- }
- return;
- }
- type = PDFWORD_NUMBER;
- dwSize = 1;
- while (1) {
- if (chartype != 'N') {
- type = PDFWORD_TEXT;
- }
- if (m_dwSize <= m_dwCurPos) {
- return;
- }
- ch = m_pData[m_dwCurPos++];
- chartype = _PDF_CharType[ch];
- if (chartype == 'D' || chartype == 'W') {
- m_dwCurPos --;
- break;
- }
- dwSize ++;
- }
-}
-CFX_ByteStringC CPDF_SimpleParser::GetWord()
-{
- FX_LPCBYTE pStart;
- FX_DWORD dwSize;
- int type;
- ParseWord(pStart, dwSize, type);
- if (dwSize == 1 && pStart[0] == '<') {
- while (m_dwCurPos < m_dwSize && m_pData[m_dwCurPos] != '>') {
- m_dwCurPos ++;
- }
- if (m_dwCurPos < m_dwSize) {
- m_dwCurPos ++;
- }
- return CFX_ByteStringC(pStart, (FX_STRSIZE)(m_dwCurPos - (pStart - m_pData)));
- } else if (dwSize == 1 && pStart[0] == '(') {
- int level = 1;
- while (m_dwCurPos < m_dwSize) {
- if (m_pData[m_dwCurPos] == ')') {
- level --;
- if (level == 0) {
- break;
- }
- }
- if (m_pData[m_dwCurPos] == '\\') {
- if (m_dwSize <= m_dwCurPos) {
- break;
- }
- m_dwCurPos ++;
- } else if (m_pData[m_dwCurPos] == '(') {
- level ++;
- }
- if (m_dwSize <= m_dwCurPos) {
- break;
- }
- m_dwCurPos ++;
- }
- if (m_dwCurPos < m_dwSize) {
- m_dwCurPos ++;
- }
- return CFX_ByteStringC(pStart, (FX_STRSIZE)(m_dwCurPos - (pStart - m_pData)));
- }
- return CFX_ByteStringC(pStart, dwSize);
-}
-FX_BOOL CPDF_SimpleParser::SearchToken(FX_BSTR token)
-{
- int token_len = token.GetLength();
- while (m_dwCurPos < m_dwSize - token_len) {
- if (FXSYS_memcmp32(m_pData + m_dwCurPos, token, token_len) == 0) {
- break;
- }
- m_dwCurPos ++;
- }
- if (m_dwCurPos == m_dwSize - token_len) {
- return FALSE;
- }
- m_dwCurPos += token_len;
- return TRUE;
-}
-FX_BOOL CPDF_SimpleParser::SkipWord(FX_BSTR token)
-{
- while (1) {
- CFX_ByteStringC word = GetWord();
- if (word.IsEmpty()) {
- return FALSE;
- }
- if (word == token) {
- return TRUE;
- }
- }
- return FALSE;
-}
-FX_BOOL CPDF_SimpleParser::FindTagPair(FX_BSTR start_token, FX_BSTR end_token,
- FX_DWORD& start_pos, FX_DWORD& end_pos)
-{
- if (!start_token.IsEmpty()) {
- if (!SkipWord(start_token)) {
- return FALSE;
- }
- start_pos = m_dwCurPos;
- }
- while (1) {
- end_pos = m_dwCurPos;
- CFX_ByteStringC word = GetWord();
- if (word.IsEmpty()) {
- return FALSE;
- }
- if (word == end_token) {
- return TRUE;
- }
- }
- return FALSE;
-}
-FX_BOOL CPDF_SimpleParser::FindTagParam(FX_BSTR token, int nParams)
-{
- nParams ++;
- FX_DWORD* pBuf = FX_Alloc(FX_DWORD, nParams);
- int buf_index = 0;
- int buf_count = 0;
- while (1) {
- pBuf[buf_index++] = m_dwCurPos;
- if (buf_index == nParams) {
- buf_index = 0;
- }
- buf_count ++;
- if (buf_count > nParams) {
- buf_count = nParams;
- }
- CFX_ByteStringC word = GetWord();
- if (word.IsEmpty()) {
- FX_Free(pBuf);
- return FALSE;
- }
- if (word == token) {
- if (buf_count < nParams) {
- continue;
- }
- m_dwCurPos = pBuf[buf_index];
- FX_Free(pBuf);
- return TRUE;
- }
- }
- return FALSE;
-}
-static int _hex2dec(char ch)
-{
- if (ch >= '0' && ch <= '9') {
- return ch - '0';
- }
- if (ch >= 'a' && ch <= 'f') {
- return ch - 'a' + 10;
- }
- if (ch >= 'A' && ch <= 'F') {
- return ch - 'A' + 10;
- }
- return 0;
-}
-CFX_ByteString PDF_NameDecode(FX_BSTR bstr)
-{
- int size = bstr.GetLength();
- FX_LPCSTR pSrc = bstr.GetCStr();
- if (FXSYS_memchr(pSrc, '#', size) == NULL) {
- return bstr;
- }
- CFX_ByteString result;
- FX_LPSTR pDestStart = result.GetBuffer(size);
- FX_LPSTR pDest = pDestStart;
- for (int i = 0; i < size; i ++) {
- if (pSrc[i] == '#' && i < size - 2) {
- *pDest ++ = _hex2dec(pSrc[i + 1]) * 16 + _hex2dec(pSrc[i + 2]);
- i += 2;
- } else {
- *pDest ++ = pSrc[i];
- }
- }
- result.ReleaseBuffer((FX_STRSIZE)(pDest - pDestStart));
- return result;
-}
-CFX_ByteString PDF_NameDecode(const CFX_ByteString& orig)
-{
- if (FXSYS_memchr((FX_LPCSTR)orig, '#', orig.GetLength()) == NULL) {
- return orig;
- }
- return PDF_NameDecode(CFX_ByteStringC(orig));
-}
-CFX_ByteString PDF_NameEncode(const CFX_ByteString& orig)
-{
- FX_LPBYTE src_buf = (FX_LPBYTE)(FX_LPCSTR)orig;
- int src_len = orig.GetLength();
- int dest_len = 0;
- int i;
- for (i = 0; i < src_len; i ++) {
- FX_BYTE ch = src_buf[i];
- if (ch >= 0x80 || _PDF_CharType[ch] == 'W' || ch == '#' ||
- _PDF_CharType[ch] == 'D') {
- dest_len += 3;
- } else {
- dest_len ++;
- }
- }
- if (dest_len == src_len) {
- return orig;
- }
- CFX_ByteString res;
- FX_LPSTR dest_buf = res.GetBuffer(dest_len);
- dest_len = 0;
- for (i = 0; i < src_len; i ++) {
- FX_BYTE ch = src_buf[i];
- if (ch >= 0x80 || _PDF_CharType[ch] == 'W' || ch == '#' ||
- _PDF_CharType[ch] == 'D') {
- dest_buf[dest_len++] = '#';
- dest_buf[dest_len++] = "0123456789ABCDEF"[ch / 16];
- dest_buf[dest_len++] = "0123456789ABCDEF"[ch % 16];
- } else {
- dest_buf[dest_len++] = ch;
- }
- }
- dest_buf[dest_len] = 0;
- res.ReleaseBuffer();
- return res;
-}
-CFX_ByteTextBuf& operator << (CFX_ByteTextBuf& buf, const CPDF_Object* pObj)
-{
- if (pObj == NULL) {
- buf << FX_BSTRC(" null");
- return buf;
- }
- switch (pObj->GetType()) {
- case PDFOBJ_NULL:
- buf << FX_BSTRC(" null");
- break;
- case PDFOBJ_BOOLEAN:
- case PDFOBJ_NUMBER:
- buf << " " << pObj->GetString();
- break;
- case PDFOBJ_STRING: {
- CFX_ByteString str = pObj->GetString();
- FX_BOOL bHex = ((CPDF_String*)pObj)->IsHex();
- buf << PDF_EncodeString(str, bHex);
- break;
- }
- case PDFOBJ_NAME: {
- CFX_ByteString str = pObj->GetString();
- buf << FX_BSTRC("/") << PDF_NameEncode(str);
- break;
- }
- case PDFOBJ_REFERENCE: {
- CPDF_Reference* p = (CPDF_Reference*)pObj;
- buf << " " << p->GetRefObjNum() << FX_BSTRC(" 0 R ");
- break;
- }
- case PDFOBJ_ARRAY: {
- CPDF_Array* p = (CPDF_Array*)pObj;
- buf << FX_BSTRC("[");
- for (FX_DWORD i = 0; i < p->GetCount(); i ++) {
- CPDF_Object* pElement = p->GetElement(i);
- if (pElement->GetObjNum()) {
- buf << " " << pElement->GetObjNum() << FX_BSTRC(" 0 R");
- } else {
- buf << pElement;
- }
- }
- buf << FX_BSTRC("]");
- break;
- }
- case PDFOBJ_DICTIONARY: {
- CPDF_Dictionary* p = (CPDF_Dictionary*)pObj;
- buf << FX_BSTRC("<<");
- FX_POSITION pos = p->GetStartPos();
- while (pos) {
- CFX_ByteString key;
- CPDF_Object* pValue = p->GetNextElement(pos, key);
- buf << FX_BSTRC("/") << PDF_NameEncode(key);
- if (pValue->GetObjNum()) {
- buf << " " << pValue->GetObjNum() << FX_BSTRC(" 0 R ");
- } else {
- buf << pValue;
- }
- }
- buf << FX_BSTRC(">>");
- break;
- }
- case PDFOBJ_STREAM: {
- CPDF_Stream* p = (CPDF_Stream*)pObj;
- buf << p->GetDict() << FX_BSTRC("stream\r\n");
- CPDF_StreamAcc acc;
- acc.LoadAllData(p, TRUE);
- buf.AppendBlock(acc.GetData(), acc.GetSize());
- buf << FX_BSTRC("\r\nendstream");
- break;
- }
- default:
- ASSERT(FALSE);
- break;
- }
- return buf;
-}
-FX_FLOAT PDF_ClipFloat(FX_FLOAT f)
-{
- if (f < 0) {
- return 0;
- }
- if (f > 1.0f) {
- return 1.0f;
- }
- return f;
-}
-static CPDF_Object* SearchNumberNode(CPDF_Dictionary* pNode, int num)
-{
- CPDF_Array* pLimits = pNode->GetArray("Limits");
- if (pLimits && (num < pLimits->GetInteger(0) || num > pLimits->GetInteger(1))) {
- return NULL;
- }
- CPDF_Array* pNumbers = pNode->GetArray("Nums");
- if (pNumbers) {
- FX_DWORD dwCount = pNumbers->GetCount() / 2;
- for (FX_DWORD i = 0; i < dwCount; i ++) {
- int index = pNumbers->GetInteger(i * 2);
- if (num == index) {
- return pNumbers->GetElementValue(i * 2 + 1);
- }
- if (index > num) {
- break;
- }
- }
- return NULL;
- }
- CPDF_Array* pKids = pNode->GetArray("Kids");
- if (pKids == NULL) {
- return NULL;
- }
- for (FX_DWORD i = 0; i < pKids->GetCount(); i ++) {
- CPDF_Dictionary* pKid = pKids->GetDict(i);
- if (pKid == NULL) {
- continue;
- }
- CPDF_Object* pFound = SearchNumberNode(pKid, num);
- if (pFound) {
- return pFound;
- }
- }
- return NULL;
-}
-CPDF_Object* CPDF_NumberTree::LookupValue(int num)
-{
- return SearchNumberNode(m_pRoot, num);
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fpdfapi/fpdf_parser.h"
+extern const FX_LPCSTR _PDF_CharType =
+ "WRRRRRRRRWWRWWRRRRRRRRRRRRRRRRRR"
+ "WRRRRDRRDDRNRNNDNNNNNNNNNNRRDRDR"
+ "RRRRRRRRRRRRRRRRRRRRRRRRRRRDRDRR"
+ "RRRRRRRRRRRRRRRRRRRRRRRRRRRDRDRR"
+ "WRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR"
+ "RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR"
+ "RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR"
+ "RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRW";
+#ifndef MAX_PATH
+#define MAX_PATH 4096
+#endif
+CPDF_SimpleParser::CPDF_SimpleParser(FX_LPCBYTE pData, FX_DWORD dwSize)
+{
+ m_pData = pData;
+ m_dwSize = dwSize;
+ m_dwCurPos = 0;
+}
+CPDF_SimpleParser::CPDF_SimpleParser(FX_BSTR str)
+{
+ m_pData = str;
+ m_dwSize = str.GetLength();
+ m_dwCurPos = 0;
+}
+void CPDF_SimpleParser::ParseWord(FX_LPCBYTE& pStart, FX_DWORD& dwSize, int& type)
+{
+ pStart = NULL;
+ dwSize = 0;
+ type = PDFWORD_EOF;
+ FX_BYTE ch;
+ char chartype;
+ while (1) {
+ if (m_dwSize <= m_dwCurPos) {
+ return;
+ }
+ ch = m_pData[m_dwCurPos++];
+ chartype = _PDF_CharType[ch];
+ while (chartype == 'W') {
+ if (m_dwSize <= m_dwCurPos) {
+ return;
+ }
+ ch = m_pData[m_dwCurPos++];
+ chartype = _PDF_CharType[ch];
+ }
+ if (ch != '%') {
+ break;
+ }
+ while (1) {
+ if (m_dwSize <= m_dwCurPos) {
+ return;
+ }
+ ch = m_pData[m_dwCurPos++];
+ if (ch == '\r' || ch == '\n') {
+ break;
+ }
+ }
+ chartype = _PDF_CharType[ch];
+ }
+ FX_DWORD start_pos = m_dwCurPos - 1;
+ pStart = m_pData + start_pos;
+ if (chartype == 'D') {
+ if (ch == '/') {
+ while (1) {
+ if (m_dwSize <= m_dwCurPos) {
+ return;
+ }
+ ch = m_pData[m_dwCurPos++];
+ chartype = _PDF_CharType[ch];
+ if (chartype != 'R' && chartype != 'N') {
+ m_dwCurPos --;
+ dwSize = m_dwCurPos - start_pos;
+ type = PDFWORD_NAME;
+ return;
+ }
+ }
+ } else {
+ type = PDFWORD_DELIMITER;
+ dwSize = 1;
+ if (ch == '<') {
+ if (m_dwSize <= m_dwCurPos) {
+ return;
+ }
+ ch = m_pData[m_dwCurPos++];
+ if (ch == '<') {
+ dwSize = 2;
+ } else {
+ m_dwCurPos --;
+ }
+ } else if (ch == '>') {
+ if (m_dwSize <= m_dwCurPos) {
+ return;
+ }
+ ch = m_pData[m_dwCurPos++];
+ if (ch == '>') {
+ dwSize = 2;
+ } else {
+ m_dwCurPos --;
+ }
+ }
+ }
+ return;
+ }
+ type = PDFWORD_NUMBER;
+ dwSize = 1;
+ while (1) {
+ if (chartype != 'N') {
+ type = PDFWORD_TEXT;
+ }
+ if (m_dwSize <= m_dwCurPos) {
+ return;
+ }
+ ch = m_pData[m_dwCurPos++];
+ chartype = _PDF_CharType[ch];
+ if (chartype == 'D' || chartype == 'W') {
+ m_dwCurPos --;
+ break;
+ }
+ dwSize ++;
+ }
+}
+CFX_ByteStringC CPDF_SimpleParser::GetWord()
+{
+ FX_LPCBYTE pStart;
+ FX_DWORD dwSize;
+ int type;
+ ParseWord(pStart, dwSize, type);
+ if (dwSize == 1 && pStart[0] == '<') {
+ while (m_dwCurPos < m_dwSize && m_pData[m_dwCurPos] != '>') {
+ m_dwCurPos ++;
+ }
+ if (m_dwCurPos < m_dwSize) {
+ m_dwCurPos ++;
+ }
+ return CFX_ByteStringC(pStart, (FX_STRSIZE)(m_dwCurPos - (pStart - m_pData)));
+ } else if (dwSize == 1 && pStart[0] == '(') {
+ int level = 1;
+ while (m_dwCurPos < m_dwSize) {
+ if (m_pData[m_dwCurPos] == ')') {
+ level --;
+ if (level == 0) {
+ break;
+ }
+ }
+ if (m_pData[m_dwCurPos] == '\\') {
+ if (m_dwSize <= m_dwCurPos) {
+ break;
+ }
+ m_dwCurPos ++;
+ } else if (m_pData[m_dwCurPos] == '(') {
+ level ++;
+ }
+ if (m_dwSize <= m_dwCurPos) {
+ break;
+ }
+ m_dwCurPos ++;
+ }
+ if (m_dwCurPos < m_dwSize) {
+ m_dwCurPos ++;
+ }
+ return CFX_ByteStringC(pStart, (FX_STRSIZE)(m_dwCurPos - (pStart - m_pData)));
+ }
+ return CFX_ByteStringC(pStart, dwSize);
+}
+FX_BOOL CPDF_SimpleParser::SearchToken(FX_BSTR token)
+{
+ int token_len = token.GetLength();
+ while (m_dwCurPos < m_dwSize - token_len) {
+ if (FXSYS_memcmp32(m_pData + m_dwCurPos, token, token_len) == 0) {
+ break;
+ }
+ m_dwCurPos ++;
+ }
+ if (m_dwCurPos == m_dwSize - token_len) {
+ return FALSE;
+ }
+ m_dwCurPos += token_len;
+ return TRUE;
+}
+FX_BOOL CPDF_SimpleParser::SkipWord(FX_BSTR token)
+{
+ while (1) {
+ CFX_ByteStringC word = GetWord();
+ if (word.IsEmpty()) {
+ return FALSE;
+ }
+ if (word == token) {
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+FX_BOOL CPDF_SimpleParser::FindTagPair(FX_BSTR start_token, FX_BSTR end_token,
+ FX_DWORD& start_pos, FX_DWORD& end_pos)
+{
+ if (!start_token.IsEmpty()) {
+ if (!SkipWord(start_token)) {
+ return FALSE;
+ }
+ start_pos = m_dwCurPos;
+ }
+ while (1) {
+ end_pos = m_dwCurPos;
+ CFX_ByteStringC word = GetWord();
+ if (word.IsEmpty()) {
+ return FALSE;
+ }
+ if (word == end_token) {
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+FX_BOOL CPDF_SimpleParser::FindTagParam(FX_BSTR token, int nParams)
+{
+ nParams ++;
+ FX_DWORD* pBuf = FX_Alloc(FX_DWORD, nParams);
+ int buf_index = 0;
+ int buf_count = 0;
+ while (1) {
+ pBuf[buf_index++] = m_dwCurPos;
+ if (buf_index == nParams) {
+ buf_index = 0;
+ }
+ buf_count ++;
+ if (buf_count > nParams) {
+ buf_count = nParams;
+ }
+ CFX_ByteStringC word = GetWord();
+ if (word.IsEmpty()) {
+ FX_Free(pBuf);
+ return FALSE;
+ }
+ if (word == token) {
+ if (buf_count < nParams) {
+ continue;
+ }
+ m_dwCurPos = pBuf[buf_index];
+ FX_Free(pBuf);
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+static int _hex2dec(char ch)
+{
+ if (ch >= '0' && ch <= '9') {
+ return ch - '0';
+ }
+ if (ch >= 'a' && ch <= 'f') {
+ return ch - 'a' + 10;
+ }
+ if (ch >= 'A' && ch <= 'F') {
+ return ch - 'A' + 10;
+ }
+ return 0;
+}
+CFX_ByteString PDF_NameDecode(FX_BSTR bstr)
+{
+ int size = bstr.GetLength();
+ FX_LPCSTR pSrc = bstr.GetCStr();
+ if (FXSYS_memchr(pSrc, '#', size) == NULL) {
+ return bstr;
+ }
+ CFX_ByteString result;
+ FX_LPSTR pDestStart = result.GetBuffer(size);
+ FX_LPSTR pDest = pDestStart;
+ for (int i = 0; i < size; i ++) {
+ if (pSrc[i] == '#' && i < size - 2) {
+ *pDest ++ = _hex2dec(pSrc[i + 1]) * 16 + _hex2dec(pSrc[i + 2]);
+ i += 2;
+ } else {
+ *pDest ++ = pSrc[i];
+ }
+ }
+ result.ReleaseBuffer((FX_STRSIZE)(pDest - pDestStart));
+ return result;
+}
+CFX_ByteString PDF_NameDecode(const CFX_ByteString& orig)
+{
+ if (FXSYS_memchr((FX_LPCSTR)orig, '#', orig.GetLength()) == NULL) {
+ return orig;
+ }
+ return PDF_NameDecode(CFX_ByteStringC(orig));
+}
+CFX_ByteString PDF_NameEncode(const CFX_ByteString& orig)
+{
+ FX_LPBYTE src_buf = (FX_LPBYTE)(FX_LPCSTR)orig;
+ int src_len = orig.GetLength();
+ int dest_len = 0;
+ int i;
+ for (i = 0; i < src_len; i ++) {
+ FX_BYTE ch = src_buf[i];
+ if (ch >= 0x80 || _PDF_CharType[ch] == 'W' || ch == '#' ||
+ _PDF_CharType[ch] == 'D') {
+ dest_len += 3;
+ } else {
+ dest_len ++;
+ }
+ }
+ if (dest_len == src_len) {
+ return orig;
+ }
+ CFX_ByteString res;
+ FX_LPSTR dest_buf = res.GetBuffer(dest_len);
+ dest_len = 0;
+ for (i = 0; i < src_len; i ++) {
+ FX_BYTE ch = src_buf[i];
+ if (ch >= 0x80 || _PDF_CharType[ch] == 'W' || ch == '#' ||
+ _PDF_CharType[ch] == 'D') {
+ dest_buf[dest_len++] = '#';
+ dest_buf[dest_len++] = "0123456789ABCDEF"[ch / 16];
+ dest_buf[dest_len++] = "0123456789ABCDEF"[ch % 16];
+ } else {
+ dest_buf[dest_len++] = ch;
+ }
+ }
+ dest_buf[dest_len] = 0;
+ res.ReleaseBuffer();
+ return res;
+}
+CFX_ByteTextBuf& operator << (CFX_ByteTextBuf& buf, const CPDF_Object* pObj)
+{
+ if (pObj == NULL) {
+ buf << FX_BSTRC(" null");
+ return buf;
+ }
+ switch (pObj->GetType()) {
+ case PDFOBJ_NULL:
+ buf << FX_BSTRC(" null");
+ break;
+ case PDFOBJ_BOOLEAN:
+ case PDFOBJ_NUMBER:
+ buf << " " << pObj->GetString();
+ break;
+ case PDFOBJ_STRING: {
+ CFX_ByteString str = pObj->GetString();
+ FX_BOOL bHex = ((CPDF_String*)pObj)->IsHex();
+ buf << PDF_EncodeString(str, bHex);
+ break;
+ }
+ case PDFOBJ_NAME: {
+ CFX_ByteString str = pObj->GetString();
+ buf << FX_BSTRC("/") << PDF_NameEncode(str);
+ break;
+ }
+ case PDFOBJ_REFERENCE: {
+ CPDF_Reference* p = (CPDF_Reference*)pObj;
+ buf << " " << p->GetRefObjNum() << FX_BSTRC(" 0 R ");
+ break;
+ }
+ case PDFOBJ_ARRAY: {
+ CPDF_Array* p = (CPDF_Array*)pObj;
+ buf << FX_BSTRC("[");
+ for (FX_DWORD i = 0; i < p->GetCount(); i ++) {
+ CPDF_Object* pElement = p->GetElement(i);
+ if (pElement->GetObjNum()) {
+ buf << " " << pElement->GetObjNum() << FX_BSTRC(" 0 R");
+ } else {
+ buf << pElement;
+ }
+ }
+ buf << FX_BSTRC("]");
+ break;
+ }
+ case PDFOBJ_DICTIONARY: {
+ CPDF_Dictionary* p = (CPDF_Dictionary*)pObj;
+ buf << FX_BSTRC("<<");
+ FX_POSITION pos = p->GetStartPos();
+ while (pos) {
+ CFX_ByteString key;
+ CPDF_Object* pValue = p->GetNextElement(pos, key);
+ buf << FX_BSTRC("/") << PDF_NameEncode(key);
+ if (pValue->GetObjNum()) {
+ buf << " " << pValue->GetObjNum() << FX_BSTRC(" 0 R ");
+ } else {
+ buf << pValue;
+ }
+ }
+ buf << FX_BSTRC(">>");
+ break;
+ }
+ case PDFOBJ_STREAM: {
+ CPDF_Stream* p = (CPDF_Stream*)pObj;
+ buf << p->GetDict() << FX_BSTRC("stream\r\n");
+ CPDF_StreamAcc acc;
+ acc.LoadAllData(p, TRUE);
+ buf.AppendBlock(acc.GetData(), acc.GetSize());
+ buf << FX_BSTRC("\r\nendstream");
+ break;
+ }
+ default:
+ ASSERT(FALSE);
+ break;
+ }
+ return buf;
+}
+FX_FLOAT PDF_ClipFloat(FX_FLOAT f)
+{
+ if (f < 0) {
+ return 0;
+ }
+ if (f > 1.0f) {
+ return 1.0f;
+ }
+ return f;
+}
+static CPDF_Object* SearchNumberNode(CPDF_Dictionary* pNode, int num)
+{
+ CPDF_Array* pLimits = pNode->GetArray("Limits");
+ if (pLimits && (num < pLimits->GetInteger(0) || num > pLimits->GetInteger(1))) {
+ return NULL;
+ }
+ CPDF_Array* pNumbers = pNode->GetArray("Nums");
+ if (pNumbers) {
+ FX_DWORD dwCount = pNumbers->GetCount() / 2;
+ for (FX_DWORD i = 0; i < dwCount; i ++) {
+ int index = pNumbers->GetInteger(i * 2);
+ if (num == index) {
+ return pNumbers->GetElementValue(i * 2 + 1);
+ }
+ if (index > num) {
+ break;
+ }
+ }
+ return NULL;
+ }
+ CPDF_Array* pKids = pNode->GetArray("Kids");
+ if (pKids == NULL) {
+ return NULL;
+ }
+ for (FX_DWORD i = 0; i < pKids->GetCount(); i ++) {
+ CPDF_Dictionary* pKid = pKids->GetDict(i);
+ if (pKid == NULL) {
+ continue;
+ }
+ CPDF_Object* pFound = SearchNumberNode(pKid, num);
+ if (pFound) {
+ return pFound;
+ }
+ }
+ return NULL;
+}
+CPDF_Object* CPDF_NumberTree::LookupValue(int num)
+{
+ return SearchNumberNode(m_pRoot, num);
+}
diff --git a/core/src/fpdfapi/fpdf_render/fpdf_render.cpp b/core/src/fpdfapi/fpdf_render/fpdf_render.cpp
index fba698ca62..19624329fb 100644
--- a/core/src/fpdfapi/fpdf_render/fpdf_render.cpp
+++ b/core/src/fpdfapi/fpdf_render/fpdf_render.cpp
@@ -1,1488 +1,1488 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../../include/fpdfapi/fpdf_render.h"
-#include "../../../include/fpdfapi/fpdf_module.h"
-#include "../fpdf_page/pageint.h"
-#include "../../../include/fxge/fx_ge.h"
-#include "../../../include/fxcodec/fx_codec.h"
-#include "render_int.h"
-CPDF_DocRenderData::CPDF_DocRenderData(CPDF_Document* pPDFDoc)
- : m_pPDFDoc(pPDFDoc)
- , m_pFontCache(NULL)
-{
-}
-CPDF_DocRenderData::~CPDF_DocRenderData()
-{
- Clear(TRUE);
-}
-void CPDF_DocRenderData::Clear(FX_BOOL bRelease)
-{
- FX_POSITION pos;
- {
- pos = m_Type3FaceMap.GetStartPosition();
- while (pos) {
- CPDF_Font* pFont;
- CPDF_CountedObject<CPDF_Type3Cache*>* cache;
- m_Type3FaceMap.GetNextAssoc(pos, pFont, cache);
- if (bRelease || cache->m_nCount < 2) {
- delete cache->m_Obj;
- delete cache;
- m_Type3FaceMap.RemoveKey(pFont);
- }
- }
- }
-#ifndef _FPDFAPI_MINI_
- {
- pos = m_TransferFuncMap.GetStartPosition();
- while (pos) {
- CPDF_Object* key;
- CPDF_CountedObject<CPDF_TransferFunc*>* value;
- m_TransferFuncMap.GetNextAssoc(pos, key, value);
- if (bRelease || value->m_nCount < 2) {
- delete value->m_Obj;
- delete value;
- m_TransferFuncMap.RemoveKey(key);
- }
- }
- }
-#endif
- if (m_pFontCache) {
- if (bRelease) {
- delete m_pFontCache;
- m_pFontCache = NULL;
- } else {
- m_pFontCache->FreeCache(FALSE);
- }
- }
-}
-FX_BOOL CPDF_DocRenderData::Initialize()
-{
- m_pFontCache = FX_NEW CFX_FontCache;
- return TRUE;
-}
-CPDF_Type3Cache* CPDF_DocRenderData::GetCachedType3(CPDF_Type3Font* pFont)
-{
- CPDF_CountedObject<CPDF_Type3Cache*>* pCache;
- if (!m_Type3FaceMap.Lookup(pFont, pCache)) {
- CPDF_Type3Cache* pType3 = FX_NEW CPDF_Type3Cache(pFont);
- pCache = FX_NEW CPDF_CountedObject<CPDF_Type3Cache*>;
- pCache->m_Obj = pType3;
- pCache->m_nCount = 1;
- m_Type3FaceMap.SetAt(pFont, pCache);
- }
- pCache->m_nCount++;
- return pCache->m_Obj;
-}
-void CPDF_DocRenderData::ReleaseCachedType3(CPDF_Type3Font* pFont)
-{
- CPDF_CountedObject<CPDF_Type3Cache*>* pCache;
- if (!m_Type3FaceMap.Lookup(pFont, pCache)) {
- return;
- }
- pCache->m_nCount--;
-}
-class CPDF_RenderModule : public CPDF_RenderModuleDef
-{
-public:
- virtual ~CPDF_RenderModule() {}
- virtual FX_BOOL Installed()
- {
- return TRUE;
- }
- virtual CPDF_DocRenderData* CreateDocData(CPDF_Document* pDoc);
- virtual void DestroyDocData(CPDF_DocRenderData* p);
- virtual void ClearDocData(CPDF_DocRenderData* p);
- virtual CPDF_DocRenderData* GetRenderData()
- {
- return &m_RenderData;
- }
- virtual CPDF_PageRenderCache* CreatePageCache(CPDF_Page* pPage)
- {
- return FX_NEW CPDF_PageRenderCache(pPage);
- }
- virtual void DestroyPageCache(CPDF_PageRenderCache* pCache);
- virtual CPDF_RenderConfig* GetConfig()
- {
- return &m_RenderConfig;
- }
-private:
- CPDF_DocRenderData m_RenderData;
- CPDF_RenderConfig m_RenderConfig;
-};
-CPDF_DocRenderData* CPDF_RenderModule::CreateDocData(CPDF_Document* pDoc)
-{
- CPDF_DocRenderData* pData = FX_NEW CPDF_DocRenderData(pDoc);
- pData->Initialize();
- return pData;
-}
-void CPDF_RenderModule::DestroyDocData(CPDF_DocRenderData* pDocData)
-{
- delete pDocData;
-}
-void CPDF_RenderModule::ClearDocData(CPDF_DocRenderData* p)
-{
- if (p) {
- p->Clear(FALSE);
- }
-}
-void CPDF_RenderModule::DestroyPageCache(CPDF_PageRenderCache* pCache)
-{
- delete pCache;
-}
-void CPDF_ModuleMgr::InitRenderModule()
-{
- if (m_pRenderModule) {
- delete m_pRenderModule;
- }
- m_pRenderModule = FX_NEW CPDF_RenderModule;
-}
-CPDF_RenderOptions::CPDF_RenderOptions()
- : m_ColorMode(RENDER_COLOR_NORMAL)
- , m_Flags(RENDER_CLEARTYPE)
- , m_Interpolation(0)
- , m_AddFlags(0)
- , m_pOCContext(NULL)
- , m_dwLimitCacheSize(1024 * 1024 * 100)
- , m_HalftoneLimit(-1)
-{
-#if defined(_FPDFAPI_MINI_)
- m_Flags |= RENDER_LIMITEDIMAGECACHE;
-#endif
-}
-FX_ARGB CPDF_RenderOptions::TranslateColor(FX_ARGB argb) const
-{
- if (m_ColorMode == RENDER_COLOR_NORMAL) {
- return argb;
- }
- if (m_ColorMode == RENDER_COLOR_ALPHA) {
- return argb;
- }
- int a, r, g, b;
- ArgbDecode(argb, a, r, g, b);
- int gray = FXRGB2GRAY(r, g, b);
- if (m_ColorMode == RENDER_COLOR_TWOCOLOR) {
- int color = (r - gray) * (r - gray) + (g - gray) * (g - gray) + (b - gray) * (b - gray);
- if (gray < 35 && color < 20) {
- return ArgbEncode(a, m_ForeColor);
- }
- if (gray > 221 && color < 20) {
- return ArgbEncode(a, m_BackColor);
- }
- return argb;
- }
- int fr = FXSYS_GetRValue(m_ForeColor);
- int fg = FXSYS_GetGValue(m_ForeColor);
- int fb = FXSYS_GetBValue(m_ForeColor);
- int br = FXSYS_GetRValue(m_BackColor);
- int bg = FXSYS_GetGValue(m_BackColor);
- int bb = FXSYS_GetBValue(m_BackColor);
- r = (br - fr) * gray / 255 + fr;
- g = (bg - fg) * gray / 255 + fg;
- b = (bb - fb) * gray / 255 + fb;
- return ArgbEncode(a, r, g, b);
-}
-CPDF_RenderStatus::CPDF_RenderStatus()
-{
- m_pContext = NULL;
- m_bStopped = FALSE;
- m_Level = 0;
- m_pDevice = NULL;
- m_pCurObj = NULL;
- m_pStopObj = NULL;
- m_HalftoneLimit = 0;
- m_pObjectRenderer = NULL;
- m_bPrint = FALSE;
- m_Transparency = 0;
- m_DitherBits = 0;
- m_bDropObjects = FALSE;
- m_bStdCS = FALSE;
- m_GroupFamily = 0;
- m_bLoadMask = FALSE;
- m_pType3Char = NULL;
- m_T3FillColor = 0;
- m_pFormResource = NULL;
- m_pPageResource = NULL;
- m_curBlend = FXDIB_BLEND_NORMAL;
-}
-CPDF_RenderStatus::~CPDF_RenderStatus()
-{
- if (m_pObjectRenderer) {
- delete m_pObjectRenderer;
- }
-}
-FX_BOOL CPDF_RenderStatus::Initialize(int level, CPDF_RenderContext* pContext, CFX_RenderDevice* pDevice,
- const CFX_AffineMatrix* pDeviceMatrix, const CPDF_PageObject* pStopObj,
- const CPDF_RenderStatus* pParentState, const CPDF_GraphicStates* pInitialStates,
- const CPDF_RenderOptions* pOptions, int transparency, FX_BOOL bDropObjects,
- CPDF_Dictionary* pFormResource, FX_BOOL bStdCS, CPDF_Type3Char* pType3Char,
- FX_ARGB fill_color, FX_DWORD GroupFamily,
- FX_BOOL bLoadMask)
-{
- m_Level = level;
- m_pContext = pContext;
- m_pDevice = pDevice;
- m_DitherBits = pDevice->GetDeviceCaps(FXDC_DITHER_BITS);
- m_bPrint = m_pDevice->GetDeviceClass() != FXDC_DISPLAY;
- if (pDeviceMatrix) {
- m_DeviceMatrix = *pDeviceMatrix;
- }
- m_pStopObj = pStopObj;
- if (pOptions) {
- m_Options = *pOptions;
- }
- m_bDropObjects = bDropObjects;
- m_bStdCS = bStdCS;
- m_T3FillColor = fill_color;
- m_pType3Char = pType3Char;
- m_GroupFamily = GroupFamily;
- m_bLoadMask = bLoadMask;
- m_pFormResource = pFormResource;
- m_pPageResource = m_pContext->m_pPageResources;
- if (pInitialStates && !m_pType3Char) {
- m_InitialStates.CopyStates(*pInitialStates);
- if (pParentState) {
- CPDF_ColorStateData* pColorData = (CPDF_ColorStateData*)(const CPDF_ColorStateData*)m_InitialStates.m_ColorState;
- CPDF_ColorStateData* pParentData = (CPDF_ColorStateData*)(const CPDF_ColorStateData*)pParentState->m_InitialStates.m_ColorState;
- if (!pColorData || pColorData->m_FillColor.IsNull()) {
- CPDF_ColorStateData* pData = m_InitialStates.m_ColorState.GetModify();
- pData->m_FillRGB = pParentData->m_FillRGB;
- pData->m_FillColor.Copy(&pParentData->m_FillColor);
- }
- if (!pColorData || pColorData->m_StrokeColor.IsNull()) {
- CPDF_ColorStateData* pData = m_InitialStates.m_ColorState.GetModify();
- pData->m_StrokeRGB = pParentData->m_FillRGB;
- pData->m_StrokeColor.Copy(&pParentData->m_StrokeColor);
- }
- }
- } else {
- m_InitialStates.DefaultStates();
- }
-#if defined(_FPDFAPI_MINI_)||defined(_FXCORE_LIMITED_CPU_)
- m_HalftoneLimit = CPDF_ModuleMgr::Get()->GetRenderModule()->GetConfig()->m_HalftoneLimit;
- if (pOptions && pOptions->m_HalftoneLimit >= 0) {
- m_HalftoneLimit = pOptions->m_HalftoneLimit;
- }
-#endif
- m_pObjectRenderer = NULL;
- m_Transparency = transparency;
- return TRUE;
-}
-void CPDF_RenderStatus::RenderObjectList(const CPDF_PageObjects* pObjs, const CFX_AffineMatrix* pObj2Device)
-{
- if (m_Level > 32) {
- return;
- }
- CFX_FloatRect clip_rect = m_pDevice->GetClipBox();
- CFX_AffineMatrix device2object;
- device2object.SetReverse(*pObj2Device);
- device2object.TransformRect(clip_rect);
- int index = 0;
- FX_POSITION pos = pObjs->GetFirstObjectPosition();
- while(pos) {
- index ++;
- CPDF_PageObject* pCurObj = pObjs->GetNextObject(pos);
- if (pCurObj == m_pStopObj) {
- m_bStopped = TRUE;
- return;
- }
- if (!pCurObj) {
- continue;
- }
- if(pCurObj == NULL || pCurObj->m_Left > clip_rect.right || pCurObj->m_Right < clip_rect.left ||
- pCurObj->m_Bottom > clip_rect.top || pCurObj->m_Top < clip_rect.bottom) {
- continue;
- }
- RenderSingleObject(pCurObj, pObj2Device);
- if (m_bStopped) {
- return;
- }
- }
-}
-void CPDF_RenderStatus::RenderSingleObject(const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device)
-{
- if (m_Level > 32) {
- return;
- }
- m_pCurObj = pObj;
- if (m_Options.m_pOCContext && pObj->m_ContentMark.NotNull())
- if (!m_Options.m_pOCContext->CheckObjectVisible(pObj)) {
- return;
- }
- ProcessClipPath(pObj->m_ClipPath, pObj2Device);
- if (ProcessTransparency(pObj, pObj2Device)) {
- return;
- }
- ProcessObjectNoClip(pObj, pObj2Device);
-}
-FX_BOOL CPDF_RenderStatus::ContinueSingleObject(const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device, IFX_Pause* pPause)
-{
- if (m_pObjectRenderer) {
- if (m_pObjectRenderer->Continue(pPause)) {
- return TRUE;
- }
- if (!m_pObjectRenderer->m_Result) {
- DrawObjWithBackground(pObj, pObj2Device);
- }
-#ifdef _FPDFAPI_MINI_
- if (m_DitherBits) {
- DitherObjectArea(pObj, pObj2Device);
- }
-#endif
- delete m_pObjectRenderer;
- m_pObjectRenderer = NULL;
- return FALSE;
- }
- m_pCurObj = pObj;
- if (m_Options.m_pOCContext && pObj->m_ContentMark.NotNull())
- if (!m_Options.m_pOCContext->CheckObjectVisible(pObj)) {
- return FALSE;
- }
- ProcessClipPath(pObj->m_ClipPath, pObj2Device);
- if (ProcessTransparency(pObj, pObj2Device)) {
- return FALSE;
- }
- if (pObj->m_Type == PDFPAGE_IMAGE) {
- m_pObjectRenderer = IPDF_ObjectRenderer::Create(pObj->m_Type);
- if (!m_pObjectRenderer->Start(this, pObj, pObj2Device, FALSE)) {
- if (!m_pObjectRenderer->m_Result) {
- DrawObjWithBackground(pObj, pObj2Device);
- }
-#ifdef _FPDFAPI_MINI_
- if (m_DitherBits) {
- DitherObjectArea(pObj, pObj2Device);
- }
-#endif
- delete m_pObjectRenderer;
- m_pObjectRenderer = NULL;
- return FALSE;
- }
- return ContinueSingleObject(pObj, pObj2Device, pPause);
- }
- ProcessObjectNoClip(pObj, pObj2Device);
- return FALSE;
-}
-IPDF_ObjectRenderer* IPDF_ObjectRenderer::Create(int type)
-{
- IPDF_ObjectRenderer* pRenderer = NULL;
- if (type == PDFPAGE_IMAGE) {
- pRenderer = FX_NEW CPDF_ImageRenderer;
- }
- return pRenderer;
-}
-FX_BOOL CPDF_RenderStatus::GetObjectClippedRect(const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device, FX_BOOL bLogical, FX_RECT &rect) const
-{
- rect = pObj->GetBBox(pObj2Device);
- FX_RECT rtClip = m_pDevice->GetClipBox();
- if (!bLogical) {
- CFX_Matrix dCTM = m_pDevice->GetCTM();
- FX_FLOAT a = FXSYS_fabs(dCTM.a);
- FX_FLOAT d = FXSYS_fabs(dCTM.d);
- if (a != 1.0f || d != 1.0f) {
- rect.right = rect.left + (FX_INT32)FXSYS_ceil((FX_FLOAT)rect.Width() * a);
- rect.bottom = rect.top + (FX_INT32)FXSYS_ceil((FX_FLOAT)rect.Height() * d);
- rtClip.right = rtClip.left + (FX_INT32)FXSYS_ceil((FX_FLOAT)rtClip.Width() * a);
- rtClip.bottom = rtClip.top + (FX_INT32)FXSYS_ceil((FX_FLOAT)rtClip.Height() * d);
- }
- }
- rect.Intersect(rtClip);
- return rect.IsEmpty();
-}
-void CPDF_RenderStatus::DitherObjectArea(const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device)
-{
- CFX_DIBitmap* pBitmap = m_pDevice->GetBitmap();
- if (pBitmap == NULL) {
- return;
- }
- FX_RECT rect;
- if (GetObjectClippedRect(pObj, pObj2Device, FALSE, rect)) {
- return;
- }
- if (m_DitherBits == 2) {
- static FX_ARGB pal[4] = {0, 85, 170, 255};
- pBitmap->DitherFS(pal, 4, &rect);
- } else if (m_DitherBits == 3) {
- static FX_ARGB pal[8] = {0, 36, 73, 109, 146, 182, 219, 255};
- pBitmap->DitherFS(pal, 8, &rect);
- } else if (m_DitherBits == 4) {
- static FX_ARGB pal[16] = {0, 17, 34, 51, 68, 85, 102, 119, 136, 153, 170, 187, 204, 221, 238, 255};
- pBitmap->DitherFS(pal, 16, &rect);
- }
-}
-void CPDF_RenderStatus::ProcessObjectNoClip(const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device)
-{
- FX_BOOL bRet = FALSE;
- switch (pObj->m_Type) {
- case PDFPAGE_TEXT:
- bRet = ProcessText((CPDF_TextObject*)pObj, pObj2Device, NULL);
- break;
- case PDFPAGE_PATH:
- bRet = ProcessPath((CPDF_PathObject*)pObj, pObj2Device);
- break;
- case PDFPAGE_IMAGE:
- bRet = ProcessImage((CPDF_ImageObject*)pObj, pObj2Device);
- break;
- case PDFPAGE_SHADING:
- bRet = ProcessShading((CPDF_ShadingObject*)pObj, pObj2Device);
- break;
- case PDFPAGE_FORM:
- bRet = ProcessForm((CPDF_FormObject*)pObj, pObj2Device);
- break;
-#if defined(_FPDFAPI_MINI_)
- case PDFPAGE_INLINES:
- bRet = ProcessInlines((CPDF_InlineImages*)pObj, pObj2Device);
- break;
-#endif
- }
- if (!bRet) {
- DrawObjWithBackground(pObj, pObj2Device);
- }
-}
-FX_BOOL CPDF_RenderStatus::DrawObjWithBlend(const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device)
-{
- FX_BOOL bRet = FALSE;
- switch (pObj->m_Type) {
- case PDFPAGE_PATH:
- bRet = ProcessPath((CPDF_PathObject*)pObj, pObj2Device);
- break;
- case PDFPAGE_IMAGE:
- bRet = ProcessImage((CPDF_ImageObject *)pObj, pObj2Device);
- break;
- case PDFPAGE_FORM:
- bRet = ProcessForm((CPDF_FormObject*)pObj, pObj2Device);
- break;
- }
- return bRet;
-}
-void CPDF_RenderStatus::GetScaledMatrix(CFX_Matrix &matrix) const
-{
- CFX_Matrix dCTM = m_pDevice->GetCTM();
- matrix.a *= FXSYS_fabs(dCTM.a);
- matrix.d *= FXSYS_fabs(dCTM.d);
-}
-void CPDF_RenderStatus::DrawObjWithBackground(const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device)
-{
-#if !defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_)
- FX_RECT rect;
- if (GetObjectClippedRect(pObj, pObj2Device, FALSE, rect)) {
- return;
- }
- int res = 300;
- if (pObj->m_Type == PDFPAGE_IMAGE && m_pDevice->GetDeviceCaps(FXDC_DEVICE_CLASS) == FXDC_PRINTER) {
- res = 0;
- }
- CPDF_ScaledRenderBuffer buffer;
- if (!buffer.Initialize(m_pContext, m_pDevice, &rect, pObj, &m_Options, res)) {
- return;
- }
- CFX_AffineMatrix matrix = *pObj2Device;
- matrix.Concat(*buffer.GetMatrix());
- GetScaledMatrix(matrix);
- CPDF_Dictionary* pFormResource = NULL;
- if (pObj->m_Type == PDFPAGE_FORM) {
- CPDF_FormObject* pFormObj = (CPDF_FormObject*)pObj;
- if (pFormObj->m_pForm && pFormObj->m_pForm->m_pFormDict) {
- pFormResource = pFormObj->m_pForm->m_pFormDict->GetDict(FX_BSTRC("Resources"));
- }
- }
- CPDF_RenderStatus status;
- status.Initialize(m_Level + 1, m_pContext, buffer.GetDevice(), buffer.GetMatrix(), NULL, NULL, NULL, &m_Options, m_Transparency, m_bDropObjects, pFormResource);
- status.RenderSingleObject(pObj, &matrix);
- buffer.OutputToDevice();
-#endif
-}
-FX_BOOL CPDF_RenderStatus::ProcessForm(CPDF_FormObject* pFormObj, const CFX_AffineMatrix* pObj2Device)
-{
- CPDF_Dictionary* pOC = pFormObj->m_pForm->m_pFormDict->GetDict(FX_BSTRC("OC"));
- if (pOC && m_Options.m_pOCContext && !m_Options.m_pOCContext->CheckOCGVisible(pOC)) {
- return TRUE;
- }
- CFX_AffineMatrix matrix = pFormObj->m_FormMatrix;
- matrix.Concat(*pObj2Device);
- CPDF_Dictionary* pResources = NULL;
- if (pFormObj->m_pForm && pFormObj->m_pForm->m_pFormDict) {
- pResources = pFormObj->m_pForm->m_pFormDict->GetDict(FX_BSTRC("Resources"));
- }
- CPDF_RenderStatus status;
- status.Initialize(m_Level + 1, m_pContext, m_pDevice, NULL, m_pStopObj,
- this, pFormObj, &m_Options, m_Transparency, m_bDropObjects, pResources, TRUE);
- status.m_curBlend = m_curBlend;
- m_pDevice->SaveState();
- status.RenderObjectList(pFormObj->m_pForm, &matrix);
- m_bStopped = status.m_bStopped;
- m_pDevice->RestoreState();
- return TRUE;
-}
-FX_BOOL IsAvailableMatrix(const CFX_AffineMatrix& matrix)
-{
- if (matrix.a == 0 || matrix.d == 0) {
- return matrix.b != 0 && matrix.c != 0;
- }
- if (matrix.b == 0 || matrix.c == 0) {
- return matrix.a != 0 && matrix.d != 0;
- }
- return TRUE;
-}
-FX_BOOL CPDF_RenderStatus::ProcessPath(CPDF_PathObject* pPathObj, const CFX_AffineMatrix* pObj2Device)
-{
- int FillType = pPathObj->m_FillType;
- FX_BOOL bStroke = pPathObj->m_bStroke;
- ProcessPathPattern(pPathObj, pObj2Device, FillType, bStroke);
- if (FillType == 0 && !bStroke) {
- return TRUE;
- }
- FX_DWORD fill_argb = 0;
- if (FillType) {
- fill_argb = GetFillArgb(pPathObj);
- }
- FX_DWORD stroke_argb = 0;
- if (bStroke) {
- stroke_argb = GetStrokeArgb(pPathObj);
- }
- CFX_AffineMatrix path_matrix = pPathObj->m_Matrix;
- path_matrix.Concat(*pObj2Device);
- if (!IsAvailableMatrix(path_matrix)) {
- return TRUE;
- }
- if (FillType && (m_Options.m_Flags & RENDER_RECT_AA)) {
- FillType |= FXFILL_RECT_AA;
- }
- if (m_Options.m_Flags & RENDER_FILL_FULLCOVER) {
- FillType |= FXFILL_FULLCOVER;
- }
- if (m_Options.m_Flags & RENDER_NOPATHSMOOTH) {
- FillType |= FXFILL_NOPATHSMOOTH;
- }
- if (bStroke) {
- FillType |= FX_FILL_STROKE;
- }
-#if !defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_)
- const CPDF_GeneralStateData* pGeneralData = ((CPDF_PageObject*)pPathObj)->m_GeneralState;
- if (pGeneralData && pGeneralData->m_StrokeAdjust) {
- FillType |= FX_STROKE_ADJUST;
- }
-#endif
- if (m_pType3Char) {
- FillType |= FX_FILL_TEXT_MODE;
- }
- CFX_GraphStateData graphState(*pPathObj->m_GraphState);
- if (m_Options.m_Flags & RENDER_THINLINE) {
- graphState.m_LineWidth = 0;
- }
- return m_pDevice->DrawPath(pPathObj->m_Path, &path_matrix, &graphState, fill_argb, stroke_argb, FillType, 0, NULL, m_curBlend);
-}
-CPDF_TransferFunc* CPDF_RenderStatus::GetTransferFunc(CPDF_Object* pObj) const
-{
- ASSERT(pObj != NULL);
- CPDF_DocRenderData* pDocCache = m_pContext->m_pDocument->GetRenderData();
- if (!pDocCache) {
- return NULL;
- }
- return pDocCache->GetTransferFunc(pObj);
-}
-FX_ARGB CPDF_RenderStatus::GetFillArgb(const CPDF_PageObject* pObj, FX_BOOL bType3) const
-{
- CPDF_ColorStateData* pColorData = (CPDF_ColorStateData*)(const CPDF_ColorStateData*)pObj->m_ColorState;
- if (m_pType3Char && !bType3 && (!m_pType3Char->m_bColored || (m_pType3Char->m_bColored && (!pColorData || pColorData->m_FillColor.IsNull())))) {
- return m_T3FillColor;
- } else if (!pColorData || pColorData->m_FillColor.IsNull()) {
- pColorData = (CPDF_ColorStateData*)(const CPDF_ColorStateData*)m_InitialStates.m_ColorState;
- }
- FX_COLORREF rgb = pColorData->m_FillRGB;
- if (rgb == (FX_DWORD) - 1) {
- return 0;
- }
- const CPDF_GeneralStateData* pGeneralData = pObj->m_GeneralState;
- int alpha;
- if (pGeneralData) {
- alpha = (FX_INT32)(pGeneralData->m_FillAlpha * 255);
-#ifndef _FPDFAPI_MINI_
- if (pGeneralData->m_pTR) {
- if (!pGeneralData->m_pTransferFunc) {
- ((CPDF_GeneralStateData*)pGeneralData)->m_pTransferFunc = GetTransferFunc(pGeneralData->m_pTR);
- }
- if (pGeneralData->m_pTransferFunc) {
- rgb = pGeneralData->m_pTransferFunc->TranslateColor(rgb);
- }
- }
-#endif
- } else {
- alpha = 255;
- }
- return m_Options.TranslateColor(ArgbEncode(alpha, rgb));
-}
-FX_ARGB CPDF_RenderStatus::GetStrokeArgb(const CPDF_PageObject* pObj) const
-{
- CPDF_ColorStateData* pColorData = (CPDF_ColorStateData*)(const CPDF_ColorStateData*)pObj->m_ColorState;
- if (m_pType3Char && (!m_pType3Char->m_bColored || (m_pType3Char->m_bColored && (!pColorData || pColorData->m_StrokeColor.IsNull())))) {
- return m_T3FillColor;
- } else if (!pColorData || pColorData->m_StrokeColor.IsNull()) {
- pColorData = (CPDF_ColorStateData*)(const CPDF_ColorStateData*)m_InitialStates.m_ColorState;
- }
- FX_COLORREF rgb = pColorData->m_StrokeRGB;
- if (rgb == (FX_DWORD) - 1) {
- return 0;
- }
- const CPDF_GeneralStateData* pGeneralData = pObj->m_GeneralState;
- int alpha;
- if (pGeneralData) {
- alpha = (FX_INT32)(pGeneralData->m_StrokeAlpha * 255);
-#ifndef _FPDFAPI_MINI_
- if (pGeneralData->m_pTR) {
- if (!pGeneralData->m_pTransferFunc) {
- ((CPDF_GeneralStateData*)pGeneralData)->m_pTransferFunc = GetTransferFunc(pGeneralData->m_pTR);
- }
- if (pGeneralData->m_pTransferFunc) {
- rgb = pGeneralData->m_pTransferFunc->TranslateColor(rgb);
- }
- }
-#endif
- } else {
- alpha = 255;
- }
- return m_Options.TranslateColor(ArgbEncode(alpha, rgb));
-}
-void CPDF_RenderStatus::ProcessClipPath(CPDF_ClipPath ClipPath, const CFX_AffineMatrix* pObj2Device)
-{
- if (ClipPath.IsNull()) {
- if (m_LastClipPath.IsNull()) {
- return;
- }
- m_pDevice->RestoreState(TRUE);
- m_LastClipPath.SetNull();
- return;
- }
- if (m_LastClipPath == ClipPath) {
- return;
- }
- m_LastClipPath = ClipPath;
- m_pDevice->RestoreState(TRUE);
- int nClipPath = ClipPath.GetPathCount();
- int i;
- for (i = 0; i < nClipPath; i++) {
- const CFX_PathData* pPathData = ClipPath.GetPath(i);
- if (pPathData == NULL) {
- continue;
- }
- if (pPathData->GetPointCount() == 0) {
- CFX_PathData EmptyPath;
- EmptyPath.AppendRect(-1, -1, 0, 0);
- int fill_mode = FXFILL_WINDING;
- m_pDevice->SetClip_PathFill(&EmptyPath, NULL, fill_mode);
- } else {
- int ClipType = ClipPath.GetClipType(i);
- m_pDevice->SetClip_PathFill(pPathData, pObj2Device, ClipType);
- }
- }
- int textcount = ClipPath.GetTextCount();
- if (textcount == 0) {
- return;
- }
- if (m_pDevice->GetDeviceClass() == FXDC_DISPLAY && !(m_pDevice->GetDeviceCaps(FXDC_RENDER_CAPS) & FXRC_SOFT_CLIP)) {
- return;
- }
- CFX_PathData* pTextClippingPath = NULL;
- for (i = 0; i < textcount; i ++) {
- CPDF_TextObject* pText = ClipPath.GetText(i);
- if (pText == NULL) {
- if (pTextClippingPath) {
- int fill_mode = FXFILL_WINDING;
- if (m_Options.m_Flags & RENDER_NOTEXTSMOOTH) {
- fill_mode |= FXFILL_NOPATHSMOOTH;
- }
- m_pDevice->SetClip_PathFill(pTextClippingPath, NULL, fill_mode);
- delete pTextClippingPath;
- pTextClippingPath = NULL;
- }
- } else {
- if (pTextClippingPath == NULL) {
- pTextClippingPath = FX_NEW CFX_PathData;
- }
- ProcessText(pText, pObj2Device, pTextClippingPath);
- }
- }
- if (pTextClippingPath) {
- delete pTextClippingPath;
- }
-}
-void CPDF_RenderStatus::DrawClipPath(CPDF_ClipPath ClipPath, const CFX_AffineMatrix* pObj2Device)
-{
- if (ClipPath.IsNull()) {
- return;
- }
- int fill_mode = 0;
- if (m_Options.m_Flags & RENDER_NOPATHSMOOTH) {
- fill_mode |= FXFILL_NOPATHSMOOTH;
- }
- int nClipPath = ClipPath.GetPathCount();
- int i;
- for (i = 0; i < nClipPath; i++) {
- const CFX_PathData* pPathData = ClipPath.GetPath(i);
- if (pPathData == NULL) {
- continue;
- }
- CFX_GraphStateData stroke_state;
- if (m_Options.m_Flags & RENDER_THINLINE) {
- stroke_state.m_LineWidth = 0;
- }
- m_pDevice->DrawPath(pPathData, pObj2Device, &stroke_state, 0, 0xffff0000, fill_mode);
- }
-}
-FX_BOOL CPDF_RenderStatus::SelectClipPath(CPDF_PathObject* pPathObj, const CFX_AffineMatrix* pObj2Device, FX_BOOL bStroke)
-{
- CFX_AffineMatrix path_matrix = pPathObj->m_Matrix;
- path_matrix.Concat(*pObj2Device);
- if (bStroke) {
- CFX_GraphStateData graphState(*pPathObj->m_GraphState);
- if (m_Options.m_Flags & RENDER_THINLINE) {
- graphState.m_LineWidth = 0;
- }
- return m_pDevice->SetClip_PathStroke(pPathObj->m_Path, &path_matrix, &graphState);
- }
- int fill_mode = pPathObj->m_FillType;
- if (m_Options.m_Flags & RENDER_NOPATHSMOOTH) {
- fill_mode |= FXFILL_NOPATHSMOOTH;
- }
- return m_pDevice->SetClip_PathFill(pPathObj->m_Path, &path_matrix, fill_mode);
-}
-FX_BOOL CPDF_RenderStatus::ProcessTransparency(const CPDF_PageObject* pPageObj, const CFX_AffineMatrix* pObj2Device)
-{
- const CPDF_GeneralStateData* pGeneralState = pPageObj->m_GeneralState;
- int blend_type = pGeneralState ? pGeneralState->m_BlendType : FXDIB_BLEND_NORMAL;
- if (blend_type == FXDIB_BLEND_UNSUPPORTED) {
- return TRUE;
- }
- CPDF_Dictionary* pSMaskDict = pGeneralState ? (CPDF_Dictionary*)pGeneralState->m_pSoftMask : NULL;
- if (pSMaskDict) {
- if (pPageObj->m_Type == PDFPAGE_IMAGE &&
- ((CPDF_ImageObject*)pPageObj)->m_pImage->GetDict()->KeyExist(FX_BSTRC("SMask"))) {
- pSMaskDict = NULL;
- }
- }
- CPDF_Dictionary* pFormResource = NULL;
- FX_FLOAT group_alpha = 1.0f;
- int Transparency = m_Transparency;
- FX_BOOL bGroupTransparent = FALSE;
- if (pPageObj->m_Type == PDFPAGE_FORM) {
- CPDF_FormObject* pFormObj = (CPDF_FormObject*)pPageObj;
- const CPDF_GeneralStateData *pStateData = pFormObj->m_GeneralState.GetObject();
- if (pStateData) {
- group_alpha = pStateData->m_FillAlpha;
- }
- Transparency = pFormObj->m_pForm->m_Transparency;
- bGroupTransparent = Transparency & PDFTRANS_ISOLATED ? TRUE : FALSE;
- if (pFormObj->m_pForm->m_pFormDict) {
- pFormResource = pFormObj->m_pForm->m_pFormDict->GetDict("Resources");
- }
- }
- FX_BOOL bTextClip = FALSE;
- if (pPageObj->m_ClipPath.NotNull() && pPageObj->m_ClipPath.GetTextCount() &&
- m_pDevice->GetDeviceClass() == FXDC_DISPLAY && !(m_pDevice->GetDeviceCaps(FXDC_RENDER_CAPS) & FXRC_SOFT_CLIP)) {
- bTextClip = TRUE;
- }
- if ((m_Options.m_Flags & RENDER_OVERPRINT) && pPageObj->m_Type == PDFPAGE_IMAGE && pGeneralState && pGeneralState->m_FillOP && pGeneralState->m_StrokeOP) {
- CPDF_Document* pDocument = NULL;
- CPDF_Page* pPage = NULL;
- if (m_pContext->m_pPageCache) {
- pPage = m_pContext->m_pPageCache->GetPage();
- pDocument = pPage->m_pDocument;
- } else {
- pDocument = ((CPDF_ImageObject*)pPageObj)->m_pImage->GetDocument();
- }
- CPDF_Dictionary* pPageResources = pPage ? pPage->m_pPageResources : NULL;
- CPDF_Object* pCSObj = ((CPDF_ImageObject*)pPageObj)->m_pImage->GetStream()->GetDict()->GetElementValue(FX_BSTRC("ColorSpace"));
- CPDF_ColorSpace* pColorSpace = pDocument->LoadColorSpace(pCSObj, pPageResources);
- if (pColorSpace) {
- int format = pColorSpace->GetFamily();
- if (format == PDFCS_DEVICECMYK || format == PDFCS_SEPARATION || format == PDFCS_DEVICEN) {
- blend_type = FXDIB_BLEND_DARKEN;
- }
- pDocument->GetPageData()->ReleaseColorSpace(pCSObj);
- }
- }
- if (pSMaskDict == NULL && group_alpha == 1.0f && blend_type == FXDIB_BLEND_NORMAL && !bTextClip && !bGroupTransparent) {
- return FALSE;
- }
- FX_BOOL isolated = Transparency & PDFTRANS_ISOLATED;
- if (m_bPrint) {
- FX_BOOL bRet = FALSE;
- int rendCaps = m_pDevice->GetRenderCaps();
- if (!((Transparency & PDFTRANS_ISOLATED) || pSMaskDict || bTextClip) && (rendCaps & FXRC_BLEND_MODE)) {
- int oldBlend = m_curBlend;
- m_curBlend = blend_type;
- bRet = DrawObjWithBlend(pPageObj, pObj2Device);
- m_curBlend = oldBlend;
- }
- if (!bRet) {
- DrawObjWithBackground(pPageObj, pObj2Device);
- }
- return TRUE;
- }
- FX_RECT rect = pPageObj->GetBBox(pObj2Device);
- rect.Intersect(m_pDevice->GetClipBox());
- if (rect.IsEmpty()) {
- return TRUE;
- }
- CFX_Matrix deviceCTM = m_pDevice->GetCTM();
- FX_FLOAT scaleX = FXSYS_fabs(deviceCTM.a);
- FX_FLOAT scaleY = FXSYS_fabs(deviceCTM.d);
- int width = FXSYS_round((FX_FLOAT)rect.Width() * scaleX);
- int height = FXSYS_round((FX_FLOAT)rect.Height() * scaleY);
- CFX_FxgeDevice bitmap_device;
- CFX_DIBitmap* oriDevice = NULL;
- if (!isolated && (m_pDevice->GetRenderCaps() & FXRC_GET_BITS)) {
- oriDevice = FX_NEW CFX_DIBitmap;
- if (!m_pDevice->CreateCompatibleBitmap(oriDevice, width, height)) {
- return TRUE;
- }
- m_pDevice->GetDIBits(oriDevice, rect.left, rect.top);
- }
- if (!bitmap_device.Create(width, height, FXDIB_Argb, 0, oriDevice)) {
- return TRUE;
- }
- CFX_DIBitmap* bitmap = bitmap_device.GetBitmap();
- bitmap->Clear(0);
- CFX_AffineMatrix new_matrix = *pObj2Device;
- new_matrix.TranslateI(-rect.left, -rect.top);
- new_matrix.Scale(scaleX, scaleY);
- CFX_DIBitmap* pTextMask = NULL;
- if (bTextClip) {
- pTextMask = FX_NEW CFX_DIBitmap;
- if (!pTextMask->Create(width, height, FXDIB_8bppMask)) {
- delete pTextMask;
- return TRUE;
- }
- pTextMask->Clear(0);
- CFX_FxgeDevice text_device;
- text_device.Attach(pTextMask);
- for (FX_DWORD i = 0; i < pPageObj->m_ClipPath.GetTextCount(); i ++) {
- CPDF_TextObject* textobj = pPageObj->m_ClipPath.GetText(i);
- if (textobj == NULL) {
- break;
- }
- CFX_AffineMatrix text_matrix;
- textobj->GetTextMatrix(&text_matrix);
- CPDF_TextRenderer::DrawTextPath(&text_device, textobj->m_nChars, textobj->m_pCharCodes, textobj->m_pCharPos,
- textobj->m_TextState.GetFont(), textobj->m_TextState.GetFontSize(),
- &text_matrix, &new_matrix, textobj->m_GraphState, (FX_ARGB) - 1, 0, NULL);
- }
- }
- CPDF_RenderStatus bitmap_render;
- bitmap_render.Initialize(m_Level + 1, m_pContext, &bitmap_device, NULL,
- m_pStopObj, NULL, NULL, &m_Options, 0, m_bDropObjects, pFormResource, TRUE);
- bitmap_render.ProcessObjectNoClip(pPageObj, &new_matrix);
- m_bStopped = bitmap_render.m_bStopped;
- if (pSMaskDict) {
- CFX_AffineMatrix smask_matrix;
- FXSYS_memcpy32(&smask_matrix, pGeneralState->m_SMaskMatrix, sizeof smask_matrix);
- smask_matrix.Concat(*pObj2Device);
- CFX_DIBSource* pSMaskSource = LoadSMask(pSMaskDict, &rect, &smask_matrix);
- if (pSMaskSource) {
- bitmap->MultiplyAlpha(pSMaskSource);
- delete pSMaskSource;
- }
- }
- if (pTextMask) {
- bitmap->MultiplyAlpha(pTextMask);
- delete pTextMask;
- pTextMask = NULL;
- }
- if (Transparency & PDFTRANS_GROUP && group_alpha != 1.0f) {
- bitmap->MultiplyAlpha((FX_INT32)(group_alpha * 255));
- }
- Transparency = m_Transparency;
- if (pPageObj->m_Type == PDFPAGE_FORM) {
- Transparency |= PDFTRANS_GROUP;
- }
- CompositeDIBitmap(bitmap, rect.left, rect.top, 0, 255, blend_type, Transparency);
- if (oriDevice) {
- delete oriDevice;
- }
- return TRUE;
-}
-CFX_DIBitmap* CPDF_RenderStatus::GetBackdrop(const CPDF_PageObject* pObj, const FX_RECT& rect, int& left, int& top,
- FX_BOOL bBackAlphaRequired)
-{
- FX_RECT bbox = rect;
- bbox.Intersect(m_pDevice->GetClipBox());
- left = bbox.left;
- top = bbox.top;
- CFX_Matrix deviceCTM = m_pDevice->GetCTM();
- FX_FLOAT scaleX = FXSYS_fabs(deviceCTM.a);
- FX_FLOAT scaleY = FXSYS_fabs(deviceCTM.d);
- int width = FXSYS_round(bbox.Width() * scaleX);
- int height = FXSYS_round(bbox.Height() * scaleY);
- CFX_DIBitmap* pBackdrop = FX_NEW CFX_DIBitmap;
- if (bBackAlphaRequired && !m_bDropObjects) {
- pBackdrop->Create(width, height, FXDIB_Argb);
- } else {
- m_pDevice->CreateCompatibleBitmap(pBackdrop, width, height);
- }
- if (pBackdrop->GetBuffer() == NULL) {
- delete pBackdrop;
- return NULL;
- }
- FX_BOOL bNeedDraw;
- if (pBackdrop->HasAlpha()) {
- bNeedDraw = !(m_pDevice->GetRenderCaps() & FXRC_ALPHA_OUTPUT);
- } else {
- bNeedDraw = !(m_pDevice->GetRenderCaps() & FXRC_GET_BITS);
- }
- if (!bNeedDraw) {
- m_pDevice->GetDIBits(pBackdrop, left, top);
- return pBackdrop;
- }
- CFX_AffineMatrix FinalMatrix = m_DeviceMatrix;
- FinalMatrix.TranslateI(-left, -top);
- FinalMatrix.Scale(scaleX, scaleY);
- pBackdrop->Clear(pBackdrop->HasAlpha() ? 0 : 0xffffffff);
- CFX_FxgeDevice device;
- device.Attach(pBackdrop);
- m_pContext->Render(&device, pObj, &m_Options, &FinalMatrix);
- return pBackdrop;
-}
-void CPDF_RenderContext::GetBackground(CFX_DIBitmap* pBuffer, const CPDF_PageObject* pObj,
- const CPDF_RenderOptions* pOptions, CFX_AffineMatrix* pFinalMatrix)
-{
- CFX_FxgeDevice device;
- device.Attach(pBuffer);
- if (m_pBackgroundDraw) {
- m_pBackgroundDraw->OnDrawBackground(&device, pFinalMatrix);
- } else {
- FX_RECT rect(0, 0, device.GetWidth(), device.GetHeight());
- device.FillRect(&rect, 0xffffffff);
- }
- Render(&device, pObj, pOptions, pFinalMatrix);
-}
-CPDF_GraphicStates* CPDF_RenderStatus::CloneObjStates(const CPDF_GraphicStates* pSrcStates, FX_BOOL bStroke)
-{
- if (!pSrcStates) {
- return NULL;
- }
- CPDF_GraphicStates* pStates = FX_NEW CPDF_GraphicStates;
- if (!pStates) {
- return NULL;
- }
- pStates->CopyStates(*pSrcStates);
- CPDF_Color* pObjColor = bStroke ? pSrcStates->m_ColorState.GetStrokeColor() :
- pSrcStates->m_ColorState.GetFillColor();
- if (!pObjColor->IsNull()) {
- CPDF_ColorStateData* pColorData = pStates->m_ColorState.GetModify();
- pColorData->m_FillRGB = bStroke ? pSrcStates->m_ColorState.GetObject()->m_StrokeRGB :
- pSrcStates->m_ColorState.GetObject()->m_FillRGB;
- pColorData->m_StrokeRGB = pColorData->m_FillRGB;
- }
- return pStates;
-}
-CPDF_RenderContext::CPDF_RenderContext()
-{
-}
-void CPDF_RenderContext::Create(CPDF_Document* pDoc, CPDF_PageRenderCache* pPageCache,
- CPDF_Dictionary* pPageResources, FX_BOOL bFirstLayer)
-{
- m_pBackgroundDraw = NULL;
- m_pDocument = pDoc;
- m_pPageResources = pPageResources;
- m_pPageCache = pPageCache;
- m_bFirstLayer = bFirstLayer;
-}
-void CPDF_RenderContext::Create(CPDF_Page* pPage, FX_BOOL bFirstLayer)
-{
- m_pBackgroundDraw = NULL;
- m_pDocument = pPage->m_pDocument;
- m_pPageResources = pPage->m_pPageResources;
- m_pPageCache = pPage->GetRenderCache();
- m_bFirstLayer = bFirstLayer;
-}
-CPDF_RenderContext::~CPDF_RenderContext()
-{
-}
-void CPDF_RenderContext::Clear()
-{
- m_pDocument = NULL;
- m_pPageResources = NULL;
- m_pPageCache = NULL;
- m_pBackgroundDraw = NULL;
- m_bFirstLayer = TRUE;
- m_ContentList.RemoveAll();
-}
-void CPDF_RenderContext::AppendObjectList(CPDF_PageObjects* pObjs, const CFX_AffineMatrix* pObject2Device)
-{
- _PDF_RenderItem* pItem = m_ContentList.AddSpace();
- pItem->m_pObjectList = pObjs;
- if (pObject2Device) {
- pItem->m_Matrix = *pObject2Device;
- } else {
- pItem->m_Matrix.SetIdentity();
- }
-}
-void CPDF_RenderContext::Render(CFX_RenderDevice* pDevice, const CPDF_RenderOptions* pOptions,
- const CFX_AffineMatrix* pLastMatrix)
-{
- Render(pDevice, NULL, pOptions, pLastMatrix);
-}
-void CPDF_RenderContext::Render(CFX_RenderDevice* pDevice, const CPDF_PageObject* pStopObj,
- const CPDF_RenderOptions* pOptions, const CFX_AffineMatrix* pLastMatrix)
-{
- int count = m_ContentList.GetSize();
- for (int j = 0; j < count; j ++) {
- pDevice->SaveState();
- _PDF_RenderItem* pItem = m_ContentList.GetDataPtr(j);
- if (pLastMatrix) {
- CFX_AffineMatrix FinalMatrix = pItem->m_Matrix;
- FinalMatrix.Concat(*pLastMatrix);
- CPDF_RenderStatus status;
- status.Initialize(0, this, pDevice, pLastMatrix, pStopObj, NULL, NULL, pOptions,
- pItem->m_pObjectList->m_Transparency, FALSE, NULL);
- status.RenderObjectList(pItem->m_pObjectList, &FinalMatrix);
-#if !defined(_FPDFAPI_MINI_)
- if (status.m_Options.m_Flags & RENDER_LIMITEDIMAGECACHE) {
- m_pPageCache->CacheOptimization(status.m_Options.m_dwLimitCacheSize);
- }
-#endif
- if (status.m_bStopped) {
- pDevice->RestoreState();
- break;
- }
- } else {
- CPDF_RenderStatus status;
- status.Initialize(0, this, pDevice, NULL, pStopObj, NULL, NULL, pOptions,
- pItem->m_pObjectList->m_Transparency, FALSE, NULL);
- status.RenderObjectList(pItem->m_pObjectList, &pItem->m_Matrix);
-#if !defined(_FPDFAPI_MINI_)
- if (status.m_Options.m_Flags & RENDER_LIMITEDIMAGECACHE) {
- m_pPageCache->CacheOptimization(status.m_Options.m_dwLimitCacheSize);
- }
-#endif
- if (status.m_bStopped) {
- pDevice->RestoreState();
- break;
- }
- }
- pDevice->RestoreState();
- }
-}
-void CPDF_RenderContext::DrawObjectList(CFX_RenderDevice* pDevice, CPDF_PageObjects* pObjs,
- const CFX_AffineMatrix* pObject2Device, const CPDF_RenderOptions* pOptions)
-{
- AppendObjectList(pObjs, pObject2Device);
- Render(pDevice, pOptions);
-}
-CPDF_ProgressiveRenderer::CPDF_ProgressiveRenderer()
-{
- m_pRenderer = NULL;
- m_pContext = NULL;
- m_pDevice = NULL;
- m_Status = Ready;
-}
-CPDF_ProgressiveRenderer::~CPDF_ProgressiveRenderer()
-{
- Clear();
-}
-void CPDF_ProgressiveRenderer::Clear()
-{
- if (m_pRenderer) {
- delete m_pRenderer;
- m_pDevice->RestoreState();
- m_pRenderer = NULL;
- }
- m_Status = Ready;
-}
-void CPDF_ProgressiveRenderer::Start(CPDF_RenderContext* pContext, CFX_RenderDevice* pDevice,
- const CPDF_RenderOptions* pOptions, IFX_Pause* pPause, FX_BOOL bDropObjects)
-{
- if (m_Status != Ready) {
- m_Status = Failed;
- return;
- }
- m_pContext = pContext;
- m_pDevice = pDevice;
- m_pOptions = pOptions;
- m_bDropObjects = bDropObjects;
- if (pContext == NULL || pDevice == NULL) {
- m_Status = Failed;
- return;
- }
- m_Status = ToBeContinued;
- m_ObjectPos = NULL;
- m_LayerIndex = 0;
- m_ObjectIndex = 0;
- m_PrevLastPos = NULL;
- Continue(pPause);
-}
-#ifdef _FPDFAPI_MINI_
-#define RENDER_STEP_LIMIT 20
-#else
-#define RENDER_STEP_LIMIT 100
-#endif
-void CPDF_ProgressiveRenderer::Continue(IFX_Pause* pPause)
-{
- if (m_Status != ToBeContinued) {
- return;
- }
- FX_DWORD nLayers = m_pContext->m_ContentList.GetSize();
- for (; m_LayerIndex < nLayers; m_LayerIndex ++) {
- _PDF_RenderItem* pItem = m_pContext->m_ContentList.GetDataPtr(m_LayerIndex);
- FX_POSITION LastPos = pItem->m_pObjectList->GetLastObjectPosition();
- if (m_ObjectPos == NULL) {
- if (LastPos == m_PrevLastPos) {
- if (!pItem->m_pObjectList->IsParsed()) {
- pItem->m_pObjectList->ContinueParse(pPause);
- if (!pItem->m_pObjectList->IsParsed()) {
- return;
- }
- LastPos = pItem->m_pObjectList->GetLastObjectPosition();
- }
- }
- if (LastPos == m_PrevLastPos) {
- if (m_pRenderer) {
- delete m_pRenderer;
- m_pRenderer = NULL;
- m_pDevice->RestoreState();
- m_ObjectPos = NULL;
- m_PrevLastPos = NULL;
- }
- continue;
- }
- if (m_PrevLastPos) {
- m_ObjectPos = m_PrevLastPos;
- pItem->m_pObjectList->GetNextObject(m_ObjectPos);
- } else {
- m_ObjectPos = pItem->m_pObjectList->GetFirstObjectPosition();
- }
- m_PrevLastPos = LastPos;
- }
- if (m_pRenderer == NULL) {
- m_ObjectPos = pItem->m_pObjectList->GetFirstObjectPosition();
- m_ObjectIndex = 0;
- m_pRenderer = FX_NEW CPDF_RenderStatus();
- m_pRenderer->Initialize(0, m_pContext, m_pDevice, NULL, NULL, NULL, NULL,
- m_pOptions, pItem->m_pObjectList->m_Transparency, m_bDropObjects, NULL);
- m_pDevice->SaveState();
- m_ClipRect = m_pDevice->GetClipBox();
- CFX_AffineMatrix device2object;
- device2object.SetReverse(pItem->m_Matrix);
- device2object.TransformRect(m_ClipRect);
- }
- int objs_to_go = CPDF_ModuleMgr::Get()->GetRenderModule()->GetConfig()->m_RenderStepLimit;
- while (m_ObjectPos) {
- CPDF_PageObject* pCurObj = pItem->m_pObjectList->GetObjectAt(m_ObjectPos);
- if (pCurObj && pCurObj->m_Left <= m_ClipRect.right && pCurObj->m_Right >= m_ClipRect.left &&
- pCurObj->m_Bottom <= m_ClipRect.top && pCurObj->m_Top >= m_ClipRect.bottom) {
- if (m_pRenderer->ContinueSingleObject(pCurObj, &pItem->m_Matrix, pPause)) {
- return;
- }
-#if !defined(_FPDFAPI_MINI_)
- if (pCurObj->m_Type == PDFPAGE_IMAGE && m_pRenderer->m_Options.m_Flags & RENDER_LIMITEDIMAGECACHE) {
- m_pContext->GetPageCache()->CacheOptimization(m_pRenderer->m_Options.m_dwLimitCacheSize);
- }
-#endif
- if (pCurObj->m_Type == PDFPAGE_FORM || pCurObj->m_Type == PDFPAGE_SHADING) {
- objs_to_go = 0;
- } else {
- objs_to_go --;
- }
- }
- m_ObjectIndex ++;
- pItem->m_pObjectList->GetNextObject(m_ObjectPos);
- if (objs_to_go == 0) {
- if (pPause && pPause->NeedToPauseNow()) {
- return;
- }
- objs_to_go = CPDF_ModuleMgr::Get()->GetRenderModule()->GetConfig()->m_RenderStepLimit;
- }
- }
- if (!pItem->m_pObjectList->IsParsed()) {
- return;
- }
- delete m_pRenderer;
- m_pRenderer = NULL;
- m_pDevice->RestoreState();
- m_ObjectPos = NULL;
- m_PrevLastPos = NULL;
- if (pPause && pPause->NeedToPauseNow()) {
- m_LayerIndex++;
- return;
- }
- }
- m_Status = Done;
-}
-int CPDF_ProgressiveRenderer::EstimateProgress()
-{
- if (!m_pContext) {
- return 0;
- }
- FX_DWORD nLayers = m_pContext->m_ContentList.GetSize();
- int nTotal = 0, nRendered = 0;
- for (FX_DWORD layer = 0; layer < nLayers; layer ++) {
- _PDF_RenderItem* pItem = m_pContext->m_ContentList.GetDataPtr(layer);
- int nObjs = pItem->m_pObjectList->CountObjects();
- if (layer == m_LayerIndex) {
- nRendered += m_ObjectIndex;
- } else if (layer < m_LayerIndex) {
- nRendered += nObjs;
- }
- nTotal += nObjs;
- }
- if (nTotal == 0) {
- return 0;
- }
- return 100 * nRendered / nTotal;
-}
-CPDF_TransferFunc* CPDF_DocRenderData::GetTransferFunc(CPDF_Object* pObj)
-{
- if (pObj == NULL) {
- return NULL;
- }
- CPDF_CountedObject<CPDF_TransferFunc*>* pTransferCounter;
- if (!m_TransferFuncMap.Lookup(pObj, pTransferCounter)) {
- CPDF_TransferFunc* pTransfer = NULL;
- CPDF_Function* pFuncs[3] = {NULL, NULL, NULL};
- FX_BOOL bUniTransfer = TRUE;
- int i;
- FX_BOOL bIdentity = TRUE;
- if (pObj->GetType() == PDFOBJ_ARRAY) {
- bUniTransfer = FALSE;
- CPDF_Array* pArray = (CPDF_Array*)pObj;
- if (pArray->GetCount() < 3) {
- return NULL;
- }
- for (FX_DWORD i = 0; i < 3; i ++) {
- pFuncs[2 - i] = CPDF_Function::Load(pArray->GetElementValue(i));
- if (pFuncs[2 - i] == NULL) {
- return NULL;
- }
- }
- } else {
- pFuncs[0] = CPDF_Function::Load(pObj);
- if (pFuncs[0] == NULL) {
- return NULL;
- }
- }
- pTransfer = FX_NEW CPDF_TransferFunc;
- pTransfer->m_pPDFDoc = m_pPDFDoc;
- pTransferCounter = FX_NEW CPDF_CountedObject<CPDF_TransferFunc*>;
- pTransferCounter->m_nCount = 1;
- pTransferCounter->m_Obj = pTransfer;
- m_TransferFuncMap.SetAt(pObj, pTransferCounter);
- static const int kMaxOutputs = 16;
- FX_FLOAT output[kMaxOutputs];
- FXSYS_memset32(output, 0, sizeof(output));
- FX_FLOAT input;
- int noutput;
- for (int v = 0; v < 256; v ++) {
- input = (FX_FLOAT)v / 255.0f;
- if (bUniTransfer) {
- if (pFuncs[0] && pFuncs[0]->CountOutputs() <= kMaxOutputs) {
- pFuncs[0]->Call(&input, 1, output, noutput);
- }
- int o = FXSYS_round(output[0] * 255);
- if (o != v) {
- bIdentity = FALSE;
- }
- for (i = 0; i < 3; i ++) {
- pTransfer->m_Samples[i * 256 + v] = o;
- }
- } else
- for (i = 0; i < 3; i ++) {
- if (pFuncs[i] && pFuncs[i]->CountOutputs() <= kMaxOutputs) {
- pFuncs[i]->Call(&input, 1, output, noutput);
- int o = FXSYS_round(output[0] * 255);
- if (o != v) {
- bIdentity = FALSE;
- }
- pTransfer->m_Samples[i * 256 + v] = o;
- } else {
- pTransfer->m_Samples[i * 256 + v] = v;
- }
- }
- }
- for (i = 0; i < 3; i ++)
- if (pFuncs[i]) {
- delete pFuncs[i];
- }
- pTransfer->m_bIdentity = bIdentity;
- }
- pTransferCounter->m_nCount++;
- return pTransferCounter->m_Obj;
-}
-void CPDF_DocRenderData::ReleaseTransferFunc(CPDF_Object* pObj)
-{
- CPDF_CountedObject<CPDF_TransferFunc*>* pTransferCounter;
- if (!m_TransferFuncMap.Lookup(pObj, pTransferCounter)) {
- return;
- }
- pTransferCounter->m_nCount--;
-}
-CPDF_RenderConfig::CPDF_RenderConfig()
-{
- m_HalftoneLimit = 0;
-#ifdef _FPDFAPI_MINI_
- m_RenderStepLimit = 20;
-#else
- m_RenderStepLimit = 100;
-#endif
-}
-CPDF_RenderConfig::~CPDF_RenderConfig()
-{
-}
-CPDF_DeviceBuffer::CPDF_DeviceBuffer()
-{
- m_pBitmap = NULL;
- m_pDevice = NULL;
- m_pContext = NULL;
- m_pObject = NULL;
-}
-CPDF_DeviceBuffer::~CPDF_DeviceBuffer()
-{
- if (m_pBitmap) {
- delete m_pBitmap;
- }
-}
-FX_BOOL CPDF_DeviceBuffer::Initialize(CPDF_RenderContext* pContext, CFX_RenderDevice* pDevice, FX_RECT* pRect,
- const CPDF_PageObject* pObj, int max_dpi)
-{
- m_pDevice = pDevice;
- m_pContext = pContext;
- m_Rect = *pRect;
- m_pObject = pObj;
- m_Matrix.TranslateI(-pRect->left, -pRect->top);
-#if _FXM_PLATFORM_ != _FXM_PLATFORM_APPLE_
- int horz_size = pDevice->GetDeviceCaps(FXDC_HORZ_SIZE);
- int vert_size = pDevice->GetDeviceCaps(FXDC_VERT_SIZE);
- if (horz_size && vert_size && max_dpi) {
- int dpih = pDevice->GetDeviceCaps(FXDC_PIXEL_WIDTH) * 254 / (horz_size * 10);
- int dpiv = pDevice->GetDeviceCaps(FXDC_PIXEL_HEIGHT) * 254 / (vert_size * 10);
- if (dpih > max_dpi) {
- m_Matrix.Scale((FX_FLOAT)(max_dpi) / dpih, 1.0f);
- }
- if (dpiv > max_dpi) {
- m_Matrix.Scale(1.0f, (FX_FLOAT)(max_dpi) / (FX_FLOAT)dpiv);
- }
- }
-#ifdef _FPDFAPI_MINI_
- m_Matrix.Scale(0.5f, 0.5f);
-#endif
-#endif
- CFX_Matrix ctm = m_pDevice->GetCTM();
- FX_FLOAT fScaleX = FXSYS_fabs(ctm.a);
- FX_FLOAT fScaleY = FXSYS_fabs(ctm.d);
- m_Matrix.Concat(fScaleX, 0, 0, fScaleY, 0, 0);
- CFX_FloatRect rect(*pRect);
- m_Matrix.TransformRect(rect);
- FX_RECT bitmap_rect = rect.GetOutterRect();
- m_pBitmap = FX_NEW CFX_DIBitmap;
- m_pBitmap->Create(bitmap_rect.Width(), bitmap_rect.Height(), FXDIB_Argb);
- return TRUE;
-}
-void CPDF_DeviceBuffer::OutputToDevice()
-{
- if (m_pDevice->GetDeviceCaps(FXDC_RENDER_CAPS) & FXRC_GET_BITS) {
- if (m_Matrix.a == 1.0f && m_Matrix.d == 1.0f) {
- m_pDevice->SetDIBits(m_pBitmap, m_Rect.left, m_Rect.top);
- } else {
- m_pDevice->StretchDIBits(m_pBitmap, m_Rect.left, m_Rect.top, m_Rect.Width(), m_Rect.Height());
- }
- } else {
-#if !defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_)
- CFX_DIBitmap buffer;
- m_pDevice->CreateCompatibleBitmap(&buffer, m_pBitmap->GetWidth(), m_pBitmap->GetHeight());
- m_pContext->GetBackground(&buffer, m_pObject, NULL, &m_Matrix);
- buffer.CompositeBitmap(0, 0, buffer.GetWidth(), buffer.GetHeight(), m_pBitmap, 0, 0);
- m_pDevice->StretchDIBits(&buffer, m_Rect.left, m_Rect.top, m_Rect.Width(), m_Rect.Height());
-#endif
- }
-}
-CPDF_ScaledRenderBuffer::CPDF_ScaledRenderBuffer()
-{
- m_pBitmapDevice = NULL;
-}
-CPDF_ScaledRenderBuffer::~CPDF_ScaledRenderBuffer()
-{
- if (m_pBitmapDevice) {
- delete m_pBitmapDevice;
- }
-}
-#ifndef _FPDFAPI_MINI_
-#define _FPDFAPI_IMAGESIZE_LIMIT_ (30 * 1024 * 1024)
-#else
-#define _FPDFAPI_IMAGESIZE_LIMIT_ (10 * 1024 * 1024)
-#endif
-FX_BOOL CPDF_ScaledRenderBuffer::Initialize(CPDF_RenderContext* pContext, CFX_RenderDevice* pDevice, FX_RECT* pRect,
- const CPDF_PageObject* pObj, const CPDF_RenderOptions *pOptions, int max_dpi)
-{
- FXSYS_assert(pRect != NULL);
- m_pDevice = pDevice;
- if (m_pDevice->GetDeviceCaps(FXDC_RENDER_CAPS) & FXRC_GET_BITS) {
- return TRUE;
- }
- m_pContext = pContext;
- m_Rect = *pRect;
- m_pObject = pObj;
- m_Matrix.TranslateI(-pRect->left, -pRect->top);
- int horz_size = pDevice->GetDeviceCaps(FXDC_HORZ_SIZE);
- int vert_size = pDevice->GetDeviceCaps(FXDC_VERT_SIZE);
- if (horz_size && vert_size && max_dpi) {
- int dpih = pDevice->GetDeviceCaps(FXDC_PIXEL_WIDTH) * 254 / (horz_size * 10);
- int dpiv = pDevice->GetDeviceCaps(FXDC_PIXEL_HEIGHT) * 254 / (vert_size * 10);
- if (dpih > max_dpi) {
- m_Matrix.Scale((FX_FLOAT)(max_dpi) / dpih, 1.0f);
- }
- if (dpiv > max_dpi) {
- m_Matrix.Scale(1.0f, (FX_FLOAT)(max_dpi) / (FX_FLOAT)dpiv);
- }
- }
- m_pBitmapDevice = FX_NEW CFX_FxgeDevice;
- FXDIB_Format dibFormat = FXDIB_Rgb;
- FX_INT32 bpp = 24;
- if (m_pDevice->GetDeviceCaps(FXDC_RENDER_CAPS) & FXRC_ALPHA_OUTPUT) {
- dibFormat = FXDIB_Argb;
- bpp = 32;
- }
- CFX_FloatRect rect;
- FX_INT32 iWidth, iHeight, iPitch;
- while (1) {
- rect = *pRect;
- m_Matrix.TransformRect(rect);
- FX_RECT bitmap_rect = rect.GetOutterRect();
- iWidth = bitmap_rect.Width();
- iHeight = bitmap_rect.Height();
- iPitch = (iWidth * bpp + 31) / 32 * 4;
- if (iWidth * iHeight < 1) {
- return FALSE;
- }
- if (iPitch * iHeight <= _FPDFAPI_IMAGESIZE_LIMIT_ &&
- m_pBitmapDevice->Create(iWidth, iHeight, dibFormat)) {
- break;
- }
- m_Matrix.Scale(0.5f, 0.5f);
- }
-#if !defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_)
- m_pContext->GetBackground(m_pBitmapDevice->GetBitmap(), m_pObject, pOptions, &m_Matrix);
-#endif
- return TRUE;
-}
-void CPDF_ScaledRenderBuffer::OutputToDevice()
-{
- if (m_pBitmapDevice) {
- m_pDevice->StretchDIBits(m_pBitmapDevice->GetBitmap(), m_Rect.left, m_Rect.top, m_Rect.Width(), m_Rect.Height());
- }
-}
-FX_BOOL IPDF_OCContext::CheckObjectVisible(const CPDF_PageObject* pObj)
-{
- const CPDF_ContentMarkData* pData = pObj->m_ContentMark;
- int nItems = pData->CountItems();
- for (int i = 0; i < nItems; i ++) {
- CPDF_ContentMarkItem& item = pData->GetItem(i);
- if (item.GetName() == FX_BSTRC("OC") && item.GetParamType() == CPDF_ContentMarkItem::PropertiesDict) {
- CPDF_Dictionary* pOCG = (CPDF_Dictionary*)item.GetParam();
- if (!CheckOCGVisible(pOCG)) {
- return FALSE;
- }
- }
- }
- return TRUE;
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fpdfapi/fpdf_render.h"
+#include "../../../include/fpdfapi/fpdf_module.h"
+#include "../fpdf_page/pageint.h"
+#include "../../../include/fxge/fx_ge.h"
+#include "../../../include/fxcodec/fx_codec.h"
+#include "render_int.h"
+CPDF_DocRenderData::CPDF_DocRenderData(CPDF_Document* pPDFDoc)
+ : m_pPDFDoc(pPDFDoc)
+ , m_pFontCache(NULL)
+{
+}
+CPDF_DocRenderData::~CPDF_DocRenderData()
+{
+ Clear(TRUE);
+}
+void CPDF_DocRenderData::Clear(FX_BOOL bRelease)
+{
+ FX_POSITION pos;
+ {
+ pos = m_Type3FaceMap.GetStartPosition();
+ while (pos) {
+ CPDF_Font* pFont;
+ CPDF_CountedObject<CPDF_Type3Cache*>* cache;
+ m_Type3FaceMap.GetNextAssoc(pos, pFont, cache);
+ if (bRelease || cache->m_nCount < 2) {
+ delete cache->m_Obj;
+ delete cache;
+ m_Type3FaceMap.RemoveKey(pFont);
+ }
+ }
+ }
+#ifndef _FPDFAPI_MINI_
+ {
+ pos = m_TransferFuncMap.GetStartPosition();
+ while (pos) {
+ CPDF_Object* key;
+ CPDF_CountedObject<CPDF_TransferFunc*>* value;
+ m_TransferFuncMap.GetNextAssoc(pos, key, value);
+ if (bRelease || value->m_nCount < 2) {
+ delete value->m_Obj;
+ delete value;
+ m_TransferFuncMap.RemoveKey(key);
+ }
+ }
+ }
+#endif
+ if (m_pFontCache) {
+ if (bRelease) {
+ delete m_pFontCache;
+ m_pFontCache = NULL;
+ } else {
+ m_pFontCache->FreeCache(FALSE);
+ }
+ }
+}
+FX_BOOL CPDF_DocRenderData::Initialize()
+{
+ m_pFontCache = FX_NEW CFX_FontCache;
+ return TRUE;
+}
+CPDF_Type3Cache* CPDF_DocRenderData::GetCachedType3(CPDF_Type3Font* pFont)
+{
+ CPDF_CountedObject<CPDF_Type3Cache*>* pCache;
+ if (!m_Type3FaceMap.Lookup(pFont, pCache)) {
+ CPDF_Type3Cache* pType3 = FX_NEW CPDF_Type3Cache(pFont);
+ pCache = FX_NEW CPDF_CountedObject<CPDF_Type3Cache*>;
+ pCache->m_Obj = pType3;
+ pCache->m_nCount = 1;
+ m_Type3FaceMap.SetAt(pFont, pCache);
+ }
+ pCache->m_nCount++;
+ return pCache->m_Obj;
+}
+void CPDF_DocRenderData::ReleaseCachedType3(CPDF_Type3Font* pFont)
+{
+ CPDF_CountedObject<CPDF_Type3Cache*>* pCache;
+ if (!m_Type3FaceMap.Lookup(pFont, pCache)) {
+ return;
+ }
+ pCache->m_nCount--;
+}
+class CPDF_RenderModule : public CPDF_RenderModuleDef
+{
+public:
+ virtual ~CPDF_RenderModule() {}
+ virtual FX_BOOL Installed()
+ {
+ return TRUE;
+ }
+ virtual CPDF_DocRenderData* CreateDocData(CPDF_Document* pDoc);
+ virtual void DestroyDocData(CPDF_DocRenderData* p);
+ virtual void ClearDocData(CPDF_DocRenderData* p);
+ virtual CPDF_DocRenderData* GetRenderData()
+ {
+ return &m_RenderData;
+ }
+ virtual CPDF_PageRenderCache* CreatePageCache(CPDF_Page* pPage)
+ {
+ return FX_NEW CPDF_PageRenderCache(pPage);
+ }
+ virtual void DestroyPageCache(CPDF_PageRenderCache* pCache);
+ virtual CPDF_RenderConfig* GetConfig()
+ {
+ return &m_RenderConfig;
+ }
+private:
+ CPDF_DocRenderData m_RenderData;
+ CPDF_RenderConfig m_RenderConfig;
+};
+CPDF_DocRenderData* CPDF_RenderModule::CreateDocData(CPDF_Document* pDoc)
+{
+ CPDF_DocRenderData* pData = FX_NEW CPDF_DocRenderData(pDoc);
+ pData->Initialize();
+ return pData;
+}
+void CPDF_RenderModule::DestroyDocData(CPDF_DocRenderData* pDocData)
+{
+ delete pDocData;
+}
+void CPDF_RenderModule::ClearDocData(CPDF_DocRenderData* p)
+{
+ if (p) {
+ p->Clear(FALSE);
+ }
+}
+void CPDF_RenderModule::DestroyPageCache(CPDF_PageRenderCache* pCache)
+{
+ delete pCache;
+}
+void CPDF_ModuleMgr::InitRenderModule()
+{
+ if (m_pRenderModule) {
+ delete m_pRenderModule;
+ }
+ m_pRenderModule = FX_NEW CPDF_RenderModule;
+}
+CPDF_RenderOptions::CPDF_RenderOptions()
+ : m_ColorMode(RENDER_COLOR_NORMAL)
+ , m_Flags(RENDER_CLEARTYPE)
+ , m_Interpolation(0)
+ , m_AddFlags(0)
+ , m_pOCContext(NULL)
+ , m_dwLimitCacheSize(1024 * 1024 * 100)
+ , m_HalftoneLimit(-1)
+{
+#if defined(_FPDFAPI_MINI_)
+ m_Flags |= RENDER_LIMITEDIMAGECACHE;
+#endif
+}
+FX_ARGB CPDF_RenderOptions::TranslateColor(FX_ARGB argb) const
+{
+ if (m_ColorMode == RENDER_COLOR_NORMAL) {
+ return argb;
+ }
+ if (m_ColorMode == RENDER_COLOR_ALPHA) {
+ return argb;
+ }
+ int a, r, g, b;
+ ArgbDecode(argb, a, r, g, b);
+ int gray = FXRGB2GRAY(r, g, b);
+ if (m_ColorMode == RENDER_COLOR_TWOCOLOR) {
+ int color = (r - gray) * (r - gray) + (g - gray) * (g - gray) + (b - gray) * (b - gray);
+ if (gray < 35 && color < 20) {
+ return ArgbEncode(a, m_ForeColor);
+ }
+ if (gray > 221 && color < 20) {
+ return ArgbEncode(a, m_BackColor);
+ }
+ return argb;
+ }
+ int fr = FXSYS_GetRValue(m_ForeColor);
+ int fg = FXSYS_GetGValue(m_ForeColor);
+ int fb = FXSYS_GetBValue(m_ForeColor);
+ int br = FXSYS_GetRValue(m_BackColor);
+ int bg = FXSYS_GetGValue(m_BackColor);
+ int bb = FXSYS_GetBValue(m_BackColor);
+ r = (br - fr) * gray / 255 + fr;
+ g = (bg - fg) * gray / 255 + fg;
+ b = (bb - fb) * gray / 255 + fb;
+ return ArgbEncode(a, r, g, b);
+}
+CPDF_RenderStatus::CPDF_RenderStatus()
+{
+ m_pContext = NULL;
+ m_bStopped = FALSE;
+ m_Level = 0;
+ m_pDevice = NULL;
+ m_pCurObj = NULL;
+ m_pStopObj = NULL;
+ m_HalftoneLimit = 0;
+ m_pObjectRenderer = NULL;
+ m_bPrint = FALSE;
+ m_Transparency = 0;
+ m_DitherBits = 0;
+ m_bDropObjects = FALSE;
+ m_bStdCS = FALSE;
+ m_GroupFamily = 0;
+ m_bLoadMask = FALSE;
+ m_pType3Char = NULL;
+ m_T3FillColor = 0;
+ m_pFormResource = NULL;
+ m_pPageResource = NULL;
+ m_curBlend = FXDIB_BLEND_NORMAL;
+}
+CPDF_RenderStatus::~CPDF_RenderStatus()
+{
+ if (m_pObjectRenderer) {
+ delete m_pObjectRenderer;
+ }
+}
+FX_BOOL CPDF_RenderStatus::Initialize(int level, CPDF_RenderContext* pContext, CFX_RenderDevice* pDevice,
+ const CFX_AffineMatrix* pDeviceMatrix, const CPDF_PageObject* pStopObj,
+ const CPDF_RenderStatus* pParentState, const CPDF_GraphicStates* pInitialStates,
+ const CPDF_RenderOptions* pOptions, int transparency, FX_BOOL bDropObjects,
+ CPDF_Dictionary* pFormResource, FX_BOOL bStdCS, CPDF_Type3Char* pType3Char,
+ FX_ARGB fill_color, FX_DWORD GroupFamily,
+ FX_BOOL bLoadMask)
+{
+ m_Level = level;
+ m_pContext = pContext;
+ m_pDevice = pDevice;
+ m_DitherBits = pDevice->GetDeviceCaps(FXDC_DITHER_BITS);
+ m_bPrint = m_pDevice->GetDeviceClass() != FXDC_DISPLAY;
+ if (pDeviceMatrix) {
+ m_DeviceMatrix = *pDeviceMatrix;
+ }
+ m_pStopObj = pStopObj;
+ if (pOptions) {
+ m_Options = *pOptions;
+ }
+ m_bDropObjects = bDropObjects;
+ m_bStdCS = bStdCS;
+ m_T3FillColor = fill_color;
+ m_pType3Char = pType3Char;
+ m_GroupFamily = GroupFamily;
+ m_bLoadMask = bLoadMask;
+ m_pFormResource = pFormResource;
+ m_pPageResource = m_pContext->m_pPageResources;
+ if (pInitialStates && !m_pType3Char) {
+ m_InitialStates.CopyStates(*pInitialStates);
+ if (pParentState) {
+ CPDF_ColorStateData* pColorData = (CPDF_ColorStateData*)(const CPDF_ColorStateData*)m_InitialStates.m_ColorState;
+ CPDF_ColorStateData* pParentData = (CPDF_ColorStateData*)(const CPDF_ColorStateData*)pParentState->m_InitialStates.m_ColorState;
+ if (!pColorData || pColorData->m_FillColor.IsNull()) {
+ CPDF_ColorStateData* pData = m_InitialStates.m_ColorState.GetModify();
+ pData->m_FillRGB = pParentData->m_FillRGB;
+ pData->m_FillColor.Copy(&pParentData->m_FillColor);
+ }
+ if (!pColorData || pColorData->m_StrokeColor.IsNull()) {
+ CPDF_ColorStateData* pData = m_InitialStates.m_ColorState.GetModify();
+ pData->m_StrokeRGB = pParentData->m_FillRGB;
+ pData->m_StrokeColor.Copy(&pParentData->m_StrokeColor);
+ }
+ }
+ } else {
+ m_InitialStates.DefaultStates();
+ }
+#if defined(_FPDFAPI_MINI_)||defined(_FXCORE_LIMITED_CPU_)
+ m_HalftoneLimit = CPDF_ModuleMgr::Get()->GetRenderModule()->GetConfig()->m_HalftoneLimit;
+ if (pOptions && pOptions->m_HalftoneLimit >= 0) {
+ m_HalftoneLimit = pOptions->m_HalftoneLimit;
+ }
+#endif
+ m_pObjectRenderer = NULL;
+ m_Transparency = transparency;
+ return TRUE;
+}
+void CPDF_RenderStatus::RenderObjectList(const CPDF_PageObjects* pObjs, const CFX_AffineMatrix* pObj2Device)
+{
+ if (m_Level > 32) {
+ return;
+ }
+ CFX_FloatRect clip_rect = m_pDevice->GetClipBox();
+ CFX_AffineMatrix device2object;
+ device2object.SetReverse(*pObj2Device);
+ device2object.TransformRect(clip_rect);
+ int index = 0;
+ FX_POSITION pos = pObjs->GetFirstObjectPosition();
+ while(pos) {
+ index ++;
+ CPDF_PageObject* pCurObj = pObjs->GetNextObject(pos);
+ if (pCurObj == m_pStopObj) {
+ m_bStopped = TRUE;
+ return;
+ }
+ if (!pCurObj) {
+ continue;
+ }
+ if(pCurObj == NULL || pCurObj->m_Left > clip_rect.right || pCurObj->m_Right < clip_rect.left ||
+ pCurObj->m_Bottom > clip_rect.top || pCurObj->m_Top < clip_rect.bottom) {
+ continue;
+ }
+ RenderSingleObject(pCurObj, pObj2Device);
+ if (m_bStopped) {
+ return;
+ }
+ }
+}
+void CPDF_RenderStatus::RenderSingleObject(const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device)
+{
+ if (m_Level > 32) {
+ return;
+ }
+ m_pCurObj = pObj;
+ if (m_Options.m_pOCContext && pObj->m_ContentMark.NotNull())
+ if (!m_Options.m_pOCContext->CheckObjectVisible(pObj)) {
+ return;
+ }
+ ProcessClipPath(pObj->m_ClipPath, pObj2Device);
+ if (ProcessTransparency(pObj, pObj2Device)) {
+ return;
+ }
+ ProcessObjectNoClip(pObj, pObj2Device);
+}
+FX_BOOL CPDF_RenderStatus::ContinueSingleObject(const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device, IFX_Pause* pPause)
+{
+ if (m_pObjectRenderer) {
+ if (m_pObjectRenderer->Continue(pPause)) {
+ return TRUE;
+ }
+ if (!m_pObjectRenderer->m_Result) {
+ DrawObjWithBackground(pObj, pObj2Device);
+ }
+#ifdef _FPDFAPI_MINI_
+ if (m_DitherBits) {
+ DitherObjectArea(pObj, pObj2Device);
+ }
+#endif
+ delete m_pObjectRenderer;
+ m_pObjectRenderer = NULL;
+ return FALSE;
+ }
+ m_pCurObj = pObj;
+ if (m_Options.m_pOCContext && pObj->m_ContentMark.NotNull())
+ if (!m_Options.m_pOCContext->CheckObjectVisible(pObj)) {
+ return FALSE;
+ }
+ ProcessClipPath(pObj->m_ClipPath, pObj2Device);
+ if (ProcessTransparency(pObj, pObj2Device)) {
+ return FALSE;
+ }
+ if (pObj->m_Type == PDFPAGE_IMAGE) {
+ m_pObjectRenderer = IPDF_ObjectRenderer::Create(pObj->m_Type);
+ if (!m_pObjectRenderer->Start(this, pObj, pObj2Device, FALSE)) {
+ if (!m_pObjectRenderer->m_Result) {
+ DrawObjWithBackground(pObj, pObj2Device);
+ }
+#ifdef _FPDFAPI_MINI_
+ if (m_DitherBits) {
+ DitherObjectArea(pObj, pObj2Device);
+ }
+#endif
+ delete m_pObjectRenderer;
+ m_pObjectRenderer = NULL;
+ return FALSE;
+ }
+ return ContinueSingleObject(pObj, pObj2Device, pPause);
+ }
+ ProcessObjectNoClip(pObj, pObj2Device);
+ return FALSE;
+}
+IPDF_ObjectRenderer* IPDF_ObjectRenderer::Create(int type)
+{
+ IPDF_ObjectRenderer* pRenderer = NULL;
+ if (type == PDFPAGE_IMAGE) {
+ pRenderer = FX_NEW CPDF_ImageRenderer;
+ }
+ return pRenderer;
+}
+FX_BOOL CPDF_RenderStatus::GetObjectClippedRect(const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device, FX_BOOL bLogical, FX_RECT &rect) const
+{
+ rect = pObj->GetBBox(pObj2Device);
+ FX_RECT rtClip = m_pDevice->GetClipBox();
+ if (!bLogical) {
+ CFX_Matrix dCTM = m_pDevice->GetCTM();
+ FX_FLOAT a = FXSYS_fabs(dCTM.a);
+ FX_FLOAT d = FXSYS_fabs(dCTM.d);
+ if (a != 1.0f || d != 1.0f) {
+ rect.right = rect.left + (FX_INT32)FXSYS_ceil((FX_FLOAT)rect.Width() * a);
+ rect.bottom = rect.top + (FX_INT32)FXSYS_ceil((FX_FLOAT)rect.Height() * d);
+ rtClip.right = rtClip.left + (FX_INT32)FXSYS_ceil((FX_FLOAT)rtClip.Width() * a);
+ rtClip.bottom = rtClip.top + (FX_INT32)FXSYS_ceil((FX_FLOAT)rtClip.Height() * d);
+ }
+ }
+ rect.Intersect(rtClip);
+ return rect.IsEmpty();
+}
+void CPDF_RenderStatus::DitherObjectArea(const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device)
+{
+ CFX_DIBitmap* pBitmap = m_pDevice->GetBitmap();
+ if (pBitmap == NULL) {
+ return;
+ }
+ FX_RECT rect;
+ if (GetObjectClippedRect(pObj, pObj2Device, FALSE, rect)) {
+ return;
+ }
+ if (m_DitherBits == 2) {
+ static FX_ARGB pal[4] = {0, 85, 170, 255};
+ pBitmap->DitherFS(pal, 4, &rect);
+ } else if (m_DitherBits == 3) {
+ static FX_ARGB pal[8] = {0, 36, 73, 109, 146, 182, 219, 255};
+ pBitmap->DitherFS(pal, 8, &rect);
+ } else if (m_DitherBits == 4) {
+ static FX_ARGB pal[16] = {0, 17, 34, 51, 68, 85, 102, 119, 136, 153, 170, 187, 204, 221, 238, 255};
+ pBitmap->DitherFS(pal, 16, &rect);
+ }
+}
+void CPDF_RenderStatus::ProcessObjectNoClip(const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device)
+{
+ FX_BOOL bRet = FALSE;
+ switch (pObj->m_Type) {
+ case PDFPAGE_TEXT:
+ bRet = ProcessText((CPDF_TextObject*)pObj, pObj2Device, NULL);
+ break;
+ case PDFPAGE_PATH:
+ bRet = ProcessPath((CPDF_PathObject*)pObj, pObj2Device);
+ break;
+ case PDFPAGE_IMAGE:
+ bRet = ProcessImage((CPDF_ImageObject*)pObj, pObj2Device);
+ break;
+ case PDFPAGE_SHADING:
+ bRet = ProcessShading((CPDF_ShadingObject*)pObj, pObj2Device);
+ break;
+ case PDFPAGE_FORM:
+ bRet = ProcessForm((CPDF_FormObject*)pObj, pObj2Device);
+ break;
+#if defined(_FPDFAPI_MINI_)
+ case PDFPAGE_INLINES:
+ bRet = ProcessInlines((CPDF_InlineImages*)pObj, pObj2Device);
+ break;
+#endif
+ }
+ if (!bRet) {
+ DrawObjWithBackground(pObj, pObj2Device);
+ }
+}
+FX_BOOL CPDF_RenderStatus::DrawObjWithBlend(const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device)
+{
+ FX_BOOL bRet = FALSE;
+ switch (pObj->m_Type) {
+ case PDFPAGE_PATH:
+ bRet = ProcessPath((CPDF_PathObject*)pObj, pObj2Device);
+ break;
+ case PDFPAGE_IMAGE:
+ bRet = ProcessImage((CPDF_ImageObject *)pObj, pObj2Device);
+ break;
+ case PDFPAGE_FORM:
+ bRet = ProcessForm((CPDF_FormObject*)pObj, pObj2Device);
+ break;
+ }
+ return bRet;
+}
+void CPDF_RenderStatus::GetScaledMatrix(CFX_Matrix &matrix) const
+{
+ CFX_Matrix dCTM = m_pDevice->GetCTM();
+ matrix.a *= FXSYS_fabs(dCTM.a);
+ matrix.d *= FXSYS_fabs(dCTM.d);
+}
+void CPDF_RenderStatus::DrawObjWithBackground(const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device)
+{
+#if !defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_)
+ FX_RECT rect;
+ if (GetObjectClippedRect(pObj, pObj2Device, FALSE, rect)) {
+ return;
+ }
+ int res = 300;
+ if (pObj->m_Type == PDFPAGE_IMAGE && m_pDevice->GetDeviceCaps(FXDC_DEVICE_CLASS) == FXDC_PRINTER) {
+ res = 0;
+ }
+ CPDF_ScaledRenderBuffer buffer;
+ if (!buffer.Initialize(m_pContext, m_pDevice, &rect, pObj, &m_Options, res)) {
+ return;
+ }
+ CFX_AffineMatrix matrix = *pObj2Device;
+ matrix.Concat(*buffer.GetMatrix());
+ GetScaledMatrix(matrix);
+ CPDF_Dictionary* pFormResource = NULL;
+ if (pObj->m_Type == PDFPAGE_FORM) {
+ CPDF_FormObject* pFormObj = (CPDF_FormObject*)pObj;
+ if (pFormObj->m_pForm && pFormObj->m_pForm->m_pFormDict) {
+ pFormResource = pFormObj->m_pForm->m_pFormDict->GetDict(FX_BSTRC("Resources"));
+ }
+ }
+ CPDF_RenderStatus status;
+ status.Initialize(m_Level + 1, m_pContext, buffer.GetDevice(), buffer.GetMatrix(), NULL, NULL, NULL, &m_Options, m_Transparency, m_bDropObjects, pFormResource);
+ status.RenderSingleObject(pObj, &matrix);
+ buffer.OutputToDevice();
+#endif
+}
+FX_BOOL CPDF_RenderStatus::ProcessForm(CPDF_FormObject* pFormObj, const CFX_AffineMatrix* pObj2Device)
+{
+ CPDF_Dictionary* pOC = pFormObj->m_pForm->m_pFormDict->GetDict(FX_BSTRC("OC"));
+ if (pOC && m_Options.m_pOCContext && !m_Options.m_pOCContext->CheckOCGVisible(pOC)) {
+ return TRUE;
+ }
+ CFX_AffineMatrix matrix = pFormObj->m_FormMatrix;
+ matrix.Concat(*pObj2Device);
+ CPDF_Dictionary* pResources = NULL;
+ if (pFormObj->m_pForm && pFormObj->m_pForm->m_pFormDict) {
+ pResources = pFormObj->m_pForm->m_pFormDict->GetDict(FX_BSTRC("Resources"));
+ }
+ CPDF_RenderStatus status;
+ status.Initialize(m_Level + 1, m_pContext, m_pDevice, NULL, m_pStopObj,
+ this, pFormObj, &m_Options, m_Transparency, m_bDropObjects, pResources, TRUE);
+ status.m_curBlend = m_curBlend;
+ m_pDevice->SaveState();
+ status.RenderObjectList(pFormObj->m_pForm, &matrix);
+ m_bStopped = status.m_bStopped;
+ m_pDevice->RestoreState();
+ return TRUE;
+}
+FX_BOOL IsAvailableMatrix(const CFX_AffineMatrix& matrix)
+{
+ if (matrix.a == 0 || matrix.d == 0) {
+ return matrix.b != 0 && matrix.c != 0;
+ }
+ if (matrix.b == 0 || matrix.c == 0) {
+ return matrix.a != 0 && matrix.d != 0;
+ }
+ return TRUE;
+}
+FX_BOOL CPDF_RenderStatus::ProcessPath(CPDF_PathObject* pPathObj, const CFX_AffineMatrix* pObj2Device)
+{
+ int FillType = pPathObj->m_FillType;
+ FX_BOOL bStroke = pPathObj->m_bStroke;
+ ProcessPathPattern(pPathObj, pObj2Device, FillType, bStroke);
+ if (FillType == 0 && !bStroke) {
+ return TRUE;
+ }
+ FX_DWORD fill_argb = 0;
+ if (FillType) {
+ fill_argb = GetFillArgb(pPathObj);
+ }
+ FX_DWORD stroke_argb = 0;
+ if (bStroke) {
+ stroke_argb = GetStrokeArgb(pPathObj);
+ }
+ CFX_AffineMatrix path_matrix = pPathObj->m_Matrix;
+ path_matrix.Concat(*pObj2Device);
+ if (!IsAvailableMatrix(path_matrix)) {
+ return TRUE;
+ }
+ if (FillType && (m_Options.m_Flags & RENDER_RECT_AA)) {
+ FillType |= FXFILL_RECT_AA;
+ }
+ if (m_Options.m_Flags & RENDER_FILL_FULLCOVER) {
+ FillType |= FXFILL_FULLCOVER;
+ }
+ if (m_Options.m_Flags & RENDER_NOPATHSMOOTH) {
+ FillType |= FXFILL_NOPATHSMOOTH;
+ }
+ if (bStroke) {
+ FillType |= FX_FILL_STROKE;
+ }
+#if !defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_)
+ const CPDF_GeneralStateData* pGeneralData = ((CPDF_PageObject*)pPathObj)->m_GeneralState;
+ if (pGeneralData && pGeneralData->m_StrokeAdjust) {
+ FillType |= FX_STROKE_ADJUST;
+ }
+#endif
+ if (m_pType3Char) {
+ FillType |= FX_FILL_TEXT_MODE;
+ }
+ CFX_GraphStateData graphState(*pPathObj->m_GraphState);
+ if (m_Options.m_Flags & RENDER_THINLINE) {
+ graphState.m_LineWidth = 0;
+ }
+ return m_pDevice->DrawPath(pPathObj->m_Path, &path_matrix, &graphState, fill_argb, stroke_argb, FillType, 0, NULL, m_curBlend);
+}
+CPDF_TransferFunc* CPDF_RenderStatus::GetTransferFunc(CPDF_Object* pObj) const
+{
+ ASSERT(pObj != NULL);
+ CPDF_DocRenderData* pDocCache = m_pContext->m_pDocument->GetRenderData();
+ if (!pDocCache) {
+ return NULL;
+ }
+ return pDocCache->GetTransferFunc(pObj);
+}
+FX_ARGB CPDF_RenderStatus::GetFillArgb(const CPDF_PageObject* pObj, FX_BOOL bType3) const
+{
+ CPDF_ColorStateData* pColorData = (CPDF_ColorStateData*)(const CPDF_ColorStateData*)pObj->m_ColorState;
+ if (m_pType3Char && !bType3 && (!m_pType3Char->m_bColored || (m_pType3Char->m_bColored && (!pColorData || pColorData->m_FillColor.IsNull())))) {
+ return m_T3FillColor;
+ } else if (!pColorData || pColorData->m_FillColor.IsNull()) {
+ pColorData = (CPDF_ColorStateData*)(const CPDF_ColorStateData*)m_InitialStates.m_ColorState;
+ }
+ FX_COLORREF rgb = pColorData->m_FillRGB;
+ if (rgb == (FX_DWORD) - 1) {
+ return 0;
+ }
+ const CPDF_GeneralStateData* pGeneralData = pObj->m_GeneralState;
+ int alpha;
+ if (pGeneralData) {
+ alpha = (FX_INT32)(pGeneralData->m_FillAlpha * 255);
+#ifndef _FPDFAPI_MINI_
+ if (pGeneralData->m_pTR) {
+ if (!pGeneralData->m_pTransferFunc) {
+ ((CPDF_GeneralStateData*)pGeneralData)->m_pTransferFunc = GetTransferFunc(pGeneralData->m_pTR);
+ }
+ if (pGeneralData->m_pTransferFunc) {
+ rgb = pGeneralData->m_pTransferFunc->TranslateColor(rgb);
+ }
+ }
+#endif
+ } else {
+ alpha = 255;
+ }
+ return m_Options.TranslateColor(ArgbEncode(alpha, rgb));
+}
+FX_ARGB CPDF_RenderStatus::GetStrokeArgb(const CPDF_PageObject* pObj) const
+{
+ CPDF_ColorStateData* pColorData = (CPDF_ColorStateData*)(const CPDF_ColorStateData*)pObj->m_ColorState;
+ if (m_pType3Char && (!m_pType3Char->m_bColored || (m_pType3Char->m_bColored && (!pColorData || pColorData->m_StrokeColor.IsNull())))) {
+ return m_T3FillColor;
+ } else if (!pColorData || pColorData->m_StrokeColor.IsNull()) {
+ pColorData = (CPDF_ColorStateData*)(const CPDF_ColorStateData*)m_InitialStates.m_ColorState;
+ }
+ FX_COLORREF rgb = pColorData->m_StrokeRGB;
+ if (rgb == (FX_DWORD) - 1) {
+ return 0;
+ }
+ const CPDF_GeneralStateData* pGeneralData = pObj->m_GeneralState;
+ int alpha;
+ if (pGeneralData) {
+ alpha = (FX_INT32)(pGeneralData->m_StrokeAlpha * 255);
+#ifndef _FPDFAPI_MINI_
+ if (pGeneralData->m_pTR) {
+ if (!pGeneralData->m_pTransferFunc) {
+ ((CPDF_GeneralStateData*)pGeneralData)->m_pTransferFunc = GetTransferFunc(pGeneralData->m_pTR);
+ }
+ if (pGeneralData->m_pTransferFunc) {
+ rgb = pGeneralData->m_pTransferFunc->TranslateColor(rgb);
+ }
+ }
+#endif
+ } else {
+ alpha = 255;
+ }
+ return m_Options.TranslateColor(ArgbEncode(alpha, rgb));
+}
+void CPDF_RenderStatus::ProcessClipPath(CPDF_ClipPath ClipPath, const CFX_AffineMatrix* pObj2Device)
+{
+ if (ClipPath.IsNull()) {
+ if (m_LastClipPath.IsNull()) {
+ return;
+ }
+ m_pDevice->RestoreState(TRUE);
+ m_LastClipPath.SetNull();
+ return;
+ }
+ if (m_LastClipPath == ClipPath) {
+ return;
+ }
+ m_LastClipPath = ClipPath;
+ m_pDevice->RestoreState(TRUE);
+ int nClipPath = ClipPath.GetPathCount();
+ int i;
+ for (i = 0; i < nClipPath; i++) {
+ const CFX_PathData* pPathData = ClipPath.GetPath(i);
+ if (pPathData == NULL) {
+ continue;
+ }
+ if (pPathData->GetPointCount() == 0) {
+ CFX_PathData EmptyPath;
+ EmptyPath.AppendRect(-1, -1, 0, 0);
+ int fill_mode = FXFILL_WINDING;
+ m_pDevice->SetClip_PathFill(&EmptyPath, NULL, fill_mode);
+ } else {
+ int ClipType = ClipPath.GetClipType(i);
+ m_pDevice->SetClip_PathFill(pPathData, pObj2Device, ClipType);
+ }
+ }
+ int textcount = ClipPath.GetTextCount();
+ if (textcount == 0) {
+ return;
+ }
+ if (m_pDevice->GetDeviceClass() == FXDC_DISPLAY && !(m_pDevice->GetDeviceCaps(FXDC_RENDER_CAPS) & FXRC_SOFT_CLIP)) {
+ return;
+ }
+ CFX_PathData* pTextClippingPath = NULL;
+ for (i = 0; i < textcount; i ++) {
+ CPDF_TextObject* pText = ClipPath.GetText(i);
+ if (pText == NULL) {
+ if (pTextClippingPath) {
+ int fill_mode = FXFILL_WINDING;
+ if (m_Options.m_Flags & RENDER_NOTEXTSMOOTH) {
+ fill_mode |= FXFILL_NOPATHSMOOTH;
+ }
+ m_pDevice->SetClip_PathFill(pTextClippingPath, NULL, fill_mode);
+ delete pTextClippingPath;
+ pTextClippingPath = NULL;
+ }
+ } else {
+ if (pTextClippingPath == NULL) {
+ pTextClippingPath = FX_NEW CFX_PathData;
+ }
+ ProcessText(pText, pObj2Device, pTextClippingPath);
+ }
+ }
+ if (pTextClippingPath) {
+ delete pTextClippingPath;
+ }
+}
+void CPDF_RenderStatus::DrawClipPath(CPDF_ClipPath ClipPath, const CFX_AffineMatrix* pObj2Device)
+{
+ if (ClipPath.IsNull()) {
+ return;
+ }
+ int fill_mode = 0;
+ if (m_Options.m_Flags & RENDER_NOPATHSMOOTH) {
+ fill_mode |= FXFILL_NOPATHSMOOTH;
+ }
+ int nClipPath = ClipPath.GetPathCount();
+ int i;
+ for (i = 0; i < nClipPath; i++) {
+ const CFX_PathData* pPathData = ClipPath.GetPath(i);
+ if (pPathData == NULL) {
+ continue;
+ }
+ CFX_GraphStateData stroke_state;
+ if (m_Options.m_Flags & RENDER_THINLINE) {
+ stroke_state.m_LineWidth = 0;
+ }
+ m_pDevice->DrawPath(pPathData, pObj2Device, &stroke_state, 0, 0xffff0000, fill_mode);
+ }
+}
+FX_BOOL CPDF_RenderStatus::SelectClipPath(CPDF_PathObject* pPathObj, const CFX_AffineMatrix* pObj2Device, FX_BOOL bStroke)
+{
+ CFX_AffineMatrix path_matrix = pPathObj->m_Matrix;
+ path_matrix.Concat(*pObj2Device);
+ if (bStroke) {
+ CFX_GraphStateData graphState(*pPathObj->m_GraphState);
+ if (m_Options.m_Flags & RENDER_THINLINE) {
+ graphState.m_LineWidth = 0;
+ }
+ return m_pDevice->SetClip_PathStroke(pPathObj->m_Path, &path_matrix, &graphState);
+ }
+ int fill_mode = pPathObj->m_FillType;
+ if (m_Options.m_Flags & RENDER_NOPATHSMOOTH) {
+ fill_mode |= FXFILL_NOPATHSMOOTH;
+ }
+ return m_pDevice->SetClip_PathFill(pPathObj->m_Path, &path_matrix, fill_mode);
+}
+FX_BOOL CPDF_RenderStatus::ProcessTransparency(const CPDF_PageObject* pPageObj, const CFX_AffineMatrix* pObj2Device)
+{
+ const CPDF_GeneralStateData* pGeneralState = pPageObj->m_GeneralState;
+ int blend_type = pGeneralState ? pGeneralState->m_BlendType : FXDIB_BLEND_NORMAL;
+ if (blend_type == FXDIB_BLEND_UNSUPPORTED) {
+ return TRUE;
+ }
+ CPDF_Dictionary* pSMaskDict = pGeneralState ? (CPDF_Dictionary*)pGeneralState->m_pSoftMask : NULL;
+ if (pSMaskDict) {
+ if (pPageObj->m_Type == PDFPAGE_IMAGE &&
+ ((CPDF_ImageObject*)pPageObj)->m_pImage->GetDict()->KeyExist(FX_BSTRC("SMask"))) {
+ pSMaskDict = NULL;
+ }
+ }
+ CPDF_Dictionary* pFormResource = NULL;
+ FX_FLOAT group_alpha = 1.0f;
+ int Transparency = m_Transparency;
+ FX_BOOL bGroupTransparent = FALSE;
+ if (pPageObj->m_Type == PDFPAGE_FORM) {
+ CPDF_FormObject* pFormObj = (CPDF_FormObject*)pPageObj;
+ const CPDF_GeneralStateData *pStateData = pFormObj->m_GeneralState.GetObject();
+ if (pStateData) {
+ group_alpha = pStateData->m_FillAlpha;
+ }
+ Transparency = pFormObj->m_pForm->m_Transparency;
+ bGroupTransparent = Transparency & PDFTRANS_ISOLATED ? TRUE : FALSE;
+ if (pFormObj->m_pForm->m_pFormDict) {
+ pFormResource = pFormObj->m_pForm->m_pFormDict->GetDict("Resources");
+ }
+ }
+ FX_BOOL bTextClip = FALSE;
+ if (pPageObj->m_ClipPath.NotNull() && pPageObj->m_ClipPath.GetTextCount() &&
+ m_pDevice->GetDeviceClass() == FXDC_DISPLAY && !(m_pDevice->GetDeviceCaps(FXDC_RENDER_CAPS) & FXRC_SOFT_CLIP)) {
+ bTextClip = TRUE;
+ }
+ if ((m_Options.m_Flags & RENDER_OVERPRINT) && pPageObj->m_Type == PDFPAGE_IMAGE && pGeneralState && pGeneralState->m_FillOP && pGeneralState->m_StrokeOP) {
+ CPDF_Document* pDocument = NULL;
+ CPDF_Page* pPage = NULL;
+ if (m_pContext->m_pPageCache) {
+ pPage = m_pContext->m_pPageCache->GetPage();
+ pDocument = pPage->m_pDocument;
+ } else {
+ pDocument = ((CPDF_ImageObject*)pPageObj)->m_pImage->GetDocument();
+ }
+ CPDF_Dictionary* pPageResources = pPage ? pPage->m_pPageResources : NULL;
+ CPDF_Object* pCSObj = ((CPDF_ImageObject*)pPageObj)->m_pImage->GetStream()->GetDict()->GetElementValue(FX_BSTRC("ColorSpace"));
+ CPDF_ColorSpace* pColorSpace = pDocument->LoadColorSpace(pCSObj, pPageResources);
+ if (pColorSpace) {
+ int format = pColorSpace->GetFamily();
+ if (format == PDFCS_DEVICECMYK || format == PDFCS_SEPARATION || format == PDFCS_DEVICEN) {
+ blend_type = FXDIB_BLEND_DARKEN;
+ }
+ pDocument->GetPageData()->ReleaseColorSpace(pCSObj);
+ }
+ }
+ if (pSMaskDict == NULL && group_alpha == 1.0f && blend_type == FXDIB_BLEND_NORMAL && !bTextClip && !bGroupTransparent) {
+ return FALSE;
+ }
+ FX_BOOL isolated = Transparency & PDFTRANS_ISOLATED;
+ if (m_bPrint) {
+ FX_BOOL bRet = FALSE;
+ int rendCaps = m_pDevice->GetRenderCaps();
+ if (!((Transparency & PDFTRANS_ISOLATED) || pSMaskDict || bTextClip) && (rendCaps & FXRC_BLEND_MODE)) {
+ int oldBlend = m_curBlend;
+ m_curBlend = blend_type;
+ bRet = DrawObjWithBlend(pPageObj, pObj2Device);
+ m_curBlend = oldBlend;
+ }
+ if (!bRet) {
+ DrawObjWithBackground(pPageObj, pObj2Device);
+ }
+ return TRUE;
+ }
+ FX_RECT rect = pPageObj->GetBBox(pObj2Device);
+ rect.Intersect(m_pDevice->GetClipBox());
+ if (rect.IsEmpty()) {
+ return TRUE;
+ }
+ CFX_Matrix deviceCTM = m_pDevice->GetCTM();
+ FX_FLOAT scaleX = FXSYS_fabs(deviceCTM.a);
+ FX_FLOAT scaleY = FXSYS_fabs(deviceCTM.d);
+ int width = FXSYS_round((FX_FLOAT)rect.Width() * scaleX);
+ int height = FXSYS_round((FX_FLOAT)rect.Height() * scaleY);
+ CFX_FxgeDevice bitmap_device;
+ CFX_DIBitmap* oriDevice = NULL;
+ if (!isolated && (m_pDevice->GetRenderCaps() & FXRC_GET_BITS)) {
+ oriDevice = FX_NEW CFX_DIBitmap;
+ if (!m_pDevice->CreateCompatibleBitmap(oriDevice, width, height)) {
+ return TRUE;
+ }
+ m_pDevice->GetDIBits(oriDevice, rect.left, rect.top);
+ }
+ if (!bitmap_device.Create(width, height, FXDIB_Argb, 0, oriDevice)) {
+ return TRUE;
+ }
+ CFX_DIBitmap* bitmap = bitmap_device.GetBitmap();
+ bitmap->Clear(0);
+ CFX_AffineMatrix new_matrix = *pObj2Device;
+ new_matrix.TranslateI(-rect.left, -rect.top);
+ new_matrix.Scale(scaleX, scaleY);
+ CFX_DIBitmap* pTextMask = NULL;
+ if (bTextClip) {
+ pTextMask = FX_NEW CFX_DIBitmap;
+ if (!pTextMask->Create(width, height, FXDIB_8bppMask)) {
+ delete pTextMask;
+ return TRUE;
+ }
+ pTextMask->Clear(0);
+ CFX_FxgeDevice text_device;
+ text_device.Attach(pTextMask);
+ for (FX_DWORD i = 0; i < pPageObj->m_ClipPath.GetTextCount(); i ++) {
+ CPDF_TextObject* textobj = pPageObj->m_ClipPath.GetText(i);
+ if (textobj == NULL) {
+ break;
+ }
+ CFX_AffineMatrix text_matrix;
+ textobj->GetTextMatrix(&text_matrix);
+ CPDF_TextRenderer::DrawTextPath(&text_device, textobj->m_nChars, textobj->m_pCharCodes, textobj->m_pCharPos,
+ textobj->m_TextState.GetFont(), textobj->m_TextState.GetFontSize(),
+ &text_matrix, &new_matrix, textobj->m_GraphState, (FX_ARGB) - 1, 0, NULL);
+ }
+ }
+ CPDF_RenderStatus bitmap_render;
+ bitmap_render.Initialize(m_Level + 1, m_pContext, &bitmap_device, NULL,
+ m_pStopObj, NULL, NULL, &m_Options, 0, m_bDropObjects, pFormResource, TRUE);
+ bitmap_render.ProcessObjectNoClip(pPageObj, &new_matrix);
+ m_bStopped = bitmap_render.m_bStopped;
+ if (pSMaskDict) {
+ CFX_AffineMatrix smask_matrix;
+ FXSYS_memcpy32(&smask_matrix, pGeneralState->m_SMaskMatrix, sizeof smask_matrix);
+ smask_matrix.Concat(*pObj2Device);
+ CFX_DIBSource* pSMaskSource = LoadSMask(pSMaskDict, &rect, &smask_matrix);
+ if (pSMaskSource) {
+ bitmap->MultiplyAlpha(pSMaskSource);
+ delete pSMaskSource;
+ }
+ }
+ if (pTextMask) {
+ bitmap->MultiplyAlpha(pTextMask);
+ delete pTextMask;
+ pTextMask = NULL;
+ }
+ if (Transparency & PDFTRANS_GROUP && group_alpha != 1.0f) {
+ bitmap->MultiplyAlpha((FX_INT32)(group_alpha * 255));
+ }
+ Transparency = m_Transparency;
+ if (pPageObj->m_Type == PDFPAGE_FORM) {
+ Transparency |= PDFTRANS_GROUP;
+ }
+ CompositeDIBitmap(bitmap, rect.left, rect.top, 0, 255, blend_type, Transparency);
+ if (oriDevice) {
+ delete oriDevice;
+ }
+ return TRUE;
+}
+CFX_DIBitmap* CPDF_RenderStatus::GetBackdrop(const CPDF_PageObject* pObj, const FX_RECT& rect, int& left, int& top,
+ FX_BOOL bBackAlphaRequired)
+{
+ FX_RECT bbox = rect;
+ bbox.Intersect(m_pDevice->GetClipBox());
+ left = bbox.left;
+ top = bbox.top;
+ CFX_Matrix deviceCTM = m_pDevice->GetCTM();
+ FX_FLOAT scaleX = FXSYS_fabs(deviceCTM.a);
+ FX_FLOAT scaleY = FXSYS_fabs(deviceCTM.d);
+ int width = FXSYS_round(bbox.Width() * scaleX);
+ int height = FXSYS_round(bbox.Height() * scaleY);
+ CFX_DIBitmap* pBackdrop = FX_NEW CFX_DIBitmap;
+ if (bBackAlphaRequired && !m_bDropObjects) {
+ pBackdrop->Create(width, height, FXDIB_Argb);
+ } else {
+ m_pDevice->CreateCompatibleBitmap(pBackdrop, width, height);
+ }
+ if (pBackdrop->GetBuffer() == NULL) {
+ delete pBackdrop;
+ return NULL;
+ }
+ FX_BOOL bNeedDraw;
+ if (pBackdrop->HasAlpha()) {
+ bNeedDraw = !(m_pDevice->GetRenderCaps() & FXRC_ALPHA_OUTPUT);
+ } else {
+ bNeedDraw = !(m_pDevice->GetRenderCaps() & FXRC_GET_BITS);
+ }
+ if (!bNeedDraw) {
+ m_pDevice->GetDIBits(pBackdrop, left, top);
+ return pBackdrop;
+ }
+ CFX_AffineMatrix FinalMatrix = m_DeviceMatrix;
+ FinalMatrix.TranslateI(-left, -top);
+ FinalMatrix.Scale(scaleX, scaleY);
+ pBackdrop->Clear(pBackdrop->HasAlpha() ? 0 : 0xffffffff);
+ CFX_FxgeDevice device;
+ device.Attach(pBackdrop);
+ m_pContext->Render(&device, pObj, &m_Options, &FinalMatrix);
+ return pBackdrop;
+}
+void CPDF_RenderContext::GetBackground(CFX_DIBitmap* pBuffer, const CPDF_PageObject* pObj,
+ const CPDF_RenderOptions* pOptions, CFX_AffineMatrix* pFinalMatrix)
+{
+ CFX_FxgeDevice device;
+ device.Attach(pBuffer);
+ if (m_pBackgroundDraw) {
+ m_pBackgroundDraw->OnDrawBackground(&device, pFinalMatrix);
+ } else {
+ FX_RECT rect(0, 0, device.GetWidth(), device.GetHeight());
+ device.FillRect(&rect, 0xffffffff);
+ }
+ Render(&device, pObj, pOptions, pFinalMatrix);
+}
+CPDF_GraphicStates* CPDF_RenderStatus::CloneObjStates(const CPDF_GraphicStates* pSrcStates, FX_BOOL bStroke)
+{
+ if (!pSrcStates) {
+ return NULL;
+ }
+ CPDF_GraphicStates* pStates = FX_NEW CPDF_GraphicStates;
+ if (!pStates) {
+ return NULL;
+ }
+ pStates->CopyStates(*pSrcStates);
+ CPDF_Color* pObjColor = bStroke ? pSrcStates->m_ColorState.GetStrokeColor() :
+ pSrcStates->m_ColorState.GetFillColor();
+ if (!pObjColor->IsNull()) {
+ CPDF_ColorStateData* pColorData = pStates->m_ColorState.GetModify();
+ pColorData->m_FillRGB = bStroke ? pSrcStates->m_ColorState.GetObject()->m_StrokeRGB :
+ pSrcStates->m_ColorState.GetObject()->m_FillRGB;
+ pColorData->m_StrokeRGB = pColorData->m_FillRGB;
+ }
+ return pStates;
+}
+CPDF_RenderContext::CPDF_RenderContext()
+{
+}
+void CPDF_RenderContext::Create(CPDF_Document* pDoc, CPDF_PageRenderCache* pPageCache,
+ CPDF_Dictionary* pPageResources, FX_BOOL bFirstLayer)
+{
+ m_pBackgroundDraw = NULL;
+ m_pDocument = pDoc;
+ m_pPageResources = pPageResources;
+ m_pPageCache = pPageCache;
+ m_bFirstLayer = bFirstLayer;
+}
+void CPDF_RenderContext::Create(CPDF_Page* pPage, FX_BOOL bFirstLayer)
+{
+ m_pBackgroundDraw = NULL;
+ m_pDocument = pPage->m_pDocument;
+ m_pPageResources = pPage->m_pPageResources;
+ m_pPageCache = pPage->GetRenderCache();
+ m_bFirstLayer = bFirstLayer;
+}
+CPDF_RenderContext::~CPDF_RenderContext()
+{
+}
+void CPDF_RenderContext::Clear()
+{
+ m_pDocument = NULL;
+ m_pPageResources = NULL;
+ m_pPageCache = NULL;
+ m_pBackgroundDraw = NULL;
+ m_bFirstLayer = TRUE;
+ m_ContentList.RemoveAll();
+}
+void CPDF_RenderContext::AppendObjectList(CPDF_PageObjects* pObjs, const CFX_AffineMatrix* pObject2Device)
+{
+ _PDF_RenderItem* pItem = m_ContentList.AddSpace();
+ pItem->m_pObjectList = pObjs;
+ if (pObject2Device) {
+ pItem->m_Matrix = *pObject2Device;
+ } else {
+ pItem->m_Matrix.SetIdentity();
+ }
+}
+void CPDF_RenderContext::Render(CFX_RenderDevice* pDevice, const CPDF_RenderOptions* pOptions,
+ const CFX_AffineMatrix* pLastMatrix)
+{
+ Render(pDevice, NULL, pOptions, pLastMatrix);
+}
+void CPDF_RenderContext::Render(CFX_RenderDevice* pDevice, const CPDF_PageObject* pStopObj,
+ const CPDF_RenderOptions* pOptions, const CFX_AffineMatrix* pLastMatrix)
+{
+ int count = m_ContentList.GetSize();
+ for (int j = 0; j < count; j ++) {
+ pDevice->SaveState();
+ _PDF_RenderItem* pItem = m_ContentList.GetDataPtr(j);
+ if (pLastMatrix) {
+ CFX_AffineMatrix FinalMatrix = pItem->m_Matrix;
+ FinalMatrix.Concat(*pLastMatrix);
+ CPDF_RenderStatus status;
+ status.Initialize(0, this, pDevice, pLastMatrix, pStopObj, NULL, NULL, pOptions,
+ pItem->m_pObjectList->m_Transparency, FALSE, NULL);
+ status.RenderObjectList(pItem->m_pObjectList, &FinalMatrix);
+#if !defined(_FPDFAPI_MINI_)
+ if (status.m_Options.m_Flags & RENDER_LIMITEDIMAGECACHE) {
+ m_pPageCache->CacheOptimization(status.m_Options.m_dwLimitCacheSize);
+ }
+#endif
+ if (status.m_bStopped) {
+ pDevice->RestoreState();
+ break;
+ }
+ } else {
+ CPDF_RenderStatus status;
+ status.Initialize(0, this, pDevice, NULL, pStopObj, NULL, NULL, pOptions,
+ pItem->m_pObjectList->m_Transparency, FALSE, NULL);
+ status.RenderObjectList(pItem->m_pObjectList, &pItem->m_Matrix);
+#if !defined(_FPDFAPI_MINI_)
+ if (status.m_Options.m_Flags & RENDER_LIMITEDIMAGECACHE) {
+ m_pPageCache->CacheOptimization(status.m_Options.m_dwLimitCacheSize);
+ }
+#endif
+ if (status.m_bStopped) {
+ pDevice->RestoreState();
+ break;
+ }
+ }
+ pDevice->RestoreState();
+ }
+}
+void CPDF_RenderContext::DrawObjectList(CFX_RenderDevice* pDevice, CPDF_PageObjects* pObjs,
+ const CFX_AffineMatrix* pObject2Device, const CPDF_RenderOptions* pOptions)
+{
+ AppendObjectList(pObjs, pObject2Device);
+ Render(pDevice, pOptions);
+}
+CPDF_ProgressiveRenderer::CPDF_ProgressiveRenderer()
+{
+ m_pRenderer = NULL;
+ m_pContext = NULL;
+ m_pDevice = NULL;
+ m_Status = Ready;
+}
+CPDF_ProgressiveRenderer::~CPDF_ProgressiveRenderer()
+{
+ Clear();
+}
+void CPDF_ProgressiveRenderer::Clear()
+{
+ if (m_pRenderer) {
+ delete m_pRenderer;
+ m_pDevice->RestoreState();
+ m_pRenderer = NULL;
+ }
+ m_Status = Ready;
+}
+void CPDF_ProgressiveRenderer::Start(CPDF_RenderContext* pContext, CFX_RenderDevice* pDevice,
+ const CPDF_RenderOptions* pOptions, IFX_Pause* pPause, FX_BOOL bDropObjects)
+{
+ if (m_Status != Ready) {
+ m_Status = Failed;
+ return;
+ }
+ m_pContext = pContext;
+ m_pDevice = pDevice;
+ m_pOptions = pOptions;
+ m_bDropObjects = bDropObjects;
+ if (pContext == NULL || pDevice == NULL) {
+ m_Status = Failed;
+ return;
+ }
+ m_Status = ToBeContinued;
+ m_ObjectPos = NULL;
+ m_LayerIndex = 0;
+ m_ObjectIndex = 0;
+ m_PrevLastPos = NULL;
+ Continue(pPause);
+}
+#ifdef _FPDFAPI_MINI_
+#define RENDER_STEP_LIMIT 20
+#else
+#define RENDER_STEP_LIMIT 100
+#endif
+void CPDF_ProgressiveRenderer::Continue(IFX_Pause* pPause)
+{
+ if (m_Status != ToBeContinued) {
+ return;
+ }
+ FX_DWORD nLayers = m_pContext->m_ContentList.GetSize();
+ for (; m_LayerIndex < nLayers; m_LayerIndex ++) {
+ _PDF_RenderItem* pItem = m_pContext->m_ContentList.GetDataPtr(m_LayerIndex);
+ FX_POSITION LastPos = pItem->m_pObjectList->GetLastObjectPosition();
+ if (m_ObjectPos == NULL) {
+ if (LastPos == m_PrevLastPos) {
+ if (!pItem->m_pObjectList->IsParsed()) {
+ pItem->m_pObjectList->ContinueParse(pPause);
+ if (!pItem->m_pObjectList->IsParsed()) {
+ return;
+ }
+ LastPos = pItem->m_pObjectList->GetLastObjectPosition();
+ }
+ }
+ if (LastPos == m_PrevLastPos) {
+ if (m_pRenderer) {
+ delete m_pRenderer;
+ m_pRenderer = NULL;
+ m_pDevice->RestoreState();
+ m_ObjectPos = NULL;
+ m_PrevLastPos = NULL;
+ }
+ continue;
+ }
+ if (m_PrevLastPos) {
+ m_ObjectPos = m_PrevLastPos;
+ pItem->m_pObjectList->GetNextObject(m_ObjectPos);
+ } else {
+ m_ObjectPos = pItem->m_pObjectList->GetFirstObjectPosition();
+ }
+ m_PrevLastPos = LastPos;
+ }
+ if (m_pRenderer == NULL) {
+ m_ObjectPos = pItem->m_pObjectList->GetFirstObjectPosition();
+ m_ObjectIndex = 0;
+ m_pRenderer = FX_NEW CPDF_RenderStatus();
+ m_pRenderer->Initialize(0, m_pContext, m_pDevice, NULL, NULL, NULL, NULL,
+ m_pOptions, pItem->m_pObjectList->m_Transparency, m_bDropObjects, NULL);
+ m_pDevice->SaveState();
+ m_ClipRect = m_pDevice->GetClipBox();
+ CFX_AffineMatrix device2object;
+ device2object.SetReverse(pItem->m_Matrix);
+ device2object.TransformRect(m_ClipRect);
+ }
+ int objs_to_go = CPDF_ModuleMgr::Get()->GetRenderModule()->GetConfig()->m_RenderStepLimit;
+ while (m_ObjectPos) {
+ CPDF_PageObject* pCurObj = pItem->m_pObjectList->GetObjectAt(m_ObjectPos);
+ if (pCurObj && pCurObj->m_Left <= m_ClipRect.right && pCurObj->m_Right >= m_ClipRect.left &&
+ pCurObj->m_Bottom <= m_ClipRect.top && pCurObj->m_Top >= m_ClipRect.bottom) {
+ if (m_pRenderer->ContinueSingleObject(pCurObj, &pItem->m_Matrix, pPause)) {
+ return;
+ }
+#if !defined(_FPDFAPI_MINI_)
+ if (pCurObj->m_Type == PDFPAGE_IMAGE && m_pRenderer->m_Options.m_Flags & RENDER_LIMITEDIMAGECACHE) {
+ m_pContext->GetPageCache()->CacheOptimization(m_pRenderer->m_Options.m_dwLimitCacheSize);
+ }
+#endif
+ if (pCurObj->m_Type == PDFPAGE_FORM || pCurObj->m_Type == PDFPAGE_SHADING) {
+ objs_to_go = 0;
+ } else {
+ objs_to_go --;
+ }
+ }
+ m_ObjectIndex ++;
+ pItem->m_pObjectList->GetNextObject(m_ObjectPos);
+ if (objs_to_go == 0) {
+ if (pPause && pPause->NeedToPauseNow()) {
+ return;
+ }
+ objs_to_go = CPDF_ModuleMgr::Get()->GetRenderModule()->GetConfig()->m_RenderStepLimit;
+ }
+ }
+ if (!pItem->m_pObjectList->IsParsed()) {
+ return;
+ }
+ delete m_pRenderer;
+ m_pRenderer = NULL;
+ m_pDevice->RestoreState();
+ m_ObjectPos = NULL;
+ m_PrevLastPos = NULL;
+ if (pPause && pPause->NeedToPauseNow()) {
+ m_LayerIndex++;
+ return;
+ }
+ }
+ m_Status = Done;
+}
+int CPDF_ProgressiveRenderer::EstimateProgress()
+{
+ if (!m_pContext) {
+ return 0;
+ }
+ FX_DWORD nLayers = m_pContext->m_ContentList.GetSize();
+ int nTotal = 0, nRendered = 0;
+ for (FX_DWORD layer = 0; layer < nLayers; layer ++) {
+ _PDF_RenderItem* pItem = m_pContext->m_ContentList.GetDataPtr(layer);
+ int nObjs = pItem->m_pObjectList->CountObjects();
+ if (layer == m_LayerIndex) {
+ nRendered += m_ObjectIndex;
+ } else if (layer < m_LayerIndex) {
+ nRendered += nObjs;
+ }
+ nTotal += nObjs;
+ }
+ if (nTotal == 0) {
+ return 0;
+ }
+ return 100 * nRendered / nTotal;
+}
+CPDF_TransferFunc* CPDF_DocRenderData::GetTransferFunc(CPDF_Object* pObj)
+{
+ if (pObj == NULL) {
+ return NULL;
+ }
+ CPDF_CountedObject<CPDF_TransferFunc*>* pTransferCounter;
+ if (!m_TransferFuncMap.Lookup(pObj, pTransferCounter)) {
+ CPDF_TransferFunc* pTransfer = NULL;
+ CPDF_Function* pFuncs[3] = {NULL, NULL, NULL};
+ FX_BOOL bUniTransfer = TRUE;
+ int i;
+ FX_BOOL bIdentity = TRUE;
+ if (pObj->GetType() == PDFOBJ_ARRAY) {
+ bUniTransfer = FALSE;
+ CPDF_Array* pArray = (CPDF_Array*)pObj;
+ if (pArray->GetCount() < 3) {
+ return NULL;
+ }
+ for (FX_DWORD i = 0; i < 3; i ++) {
+ pFuncs[2 - i] = CPDF_Function::Load(pArray->GetElementValue(i));
+ if (pFuncs[2 - i] == NULL) {
+ return NULL;
+ }
+ }
+ } else {
+ pFuncs[0] = CPDF_Function::Load(pObj);
+ if (pFuncs[0] == NULL) {
+ return NULL;
+ }
+ }
+ pTransfer = FX_NEW CPDF_TransferFunc;
+ pTransfer->m_pPDFDoc = m_pPDFDoc;
+ pTransferCounter = FX_NEW CPDF_CountedObject<CPDF_TransferFunc*>;
+ pTransferCounter->m_nCount = 1;
+ pTransferCounter->m_Obj = pTransfer;
+ m_TransferFuncMap.SetAt(pObj, pTransferCounter);
+ static const int kMaxOutputs = 16;
+ FX_FLOAT output[kMaxOutputs];
+ FXSYS_memset32(output, 0, sizeof(output));
+ FX_FLOAT input;
+ int noutput;
+ for (int v = 0; v < 256; v ++) {
+ input = (FX_FLOAT)v / 255.0f;
+ if (bUniTransfer) {
+ if (pFuncs[0] && pFuncs[0]->CountOutputs() <= kMaxOutputs) {
+ pFuncs[0]->Call(&input, 1, output, noutput);
+ }
+ int o = FXSYS_round(output[0] * 255);
+ if (o != v) {
+ bIdentity = FALSE;
+ }
+ for (i = 0; i < 3; i ++) {
+ pTransfer->m_Samples[i * 256 + v] = o;
+ }
+ } else
+ for (i = 0; i < 3; i ++) {
+ if (pFuncs[i] && pFuncs[i]->CountOutputs() <= kMaxOutputs) {
+ pFuncs[i]->Call(&input, 1, output, noutput);
+ int o = FXSYS_round(output[0] * 255);
+ if (o != v) {
+ bIdentity = FALSE;
+ }
+ pTransfer->m_Samples[i * 256 + v] = o;
+ } else {
+ pTransfer->m_Samples[i * 256 + v] = v;
+ }
+ }
+ }
+ for (i = 0; i < 3; i ++)
+ if (pFuncs[i]) {
+ delete pFuncs[i];
+ }
+ pTransfer->m_bIdentity = bIdentity;
+ }
+ pTransferCounter->m_nCount++;
+ return pTransferCounter->m_Obj;
+}
+void CPDF_DocRenderData::ReleaseTransferFunc(CPDF_Object* pObj)
+{
+ CPDF_CountedObject<CPDF_TransferFunc*>* pTransferCounter;
+ if (!m_TransferFuncMap.Lookup(pObj, pTransferCounter)) {
+ return;
+ }
+ pTransferCounter->m_nCount--;
+}
+CPDF_RenderConfig::CPDF_RenderConfig()
+{
+ m_HalftoneLimit = 0;
+#ifdef _FPDFAPI_MINI_
+ m_RenderStepLimit = 20;
+#else
+ m_RenderStepLimit = 100;
+#endif
+}
+CPDF_RenderConfig::~CPDF_RenderConfig()
+{
+}
+CPDF_DeviceBuffer::CPDF_DeviceBuffer()
+{
+ m_pBitmap = NULL;
+ m_pDevice = NULL;
+ m_pContext = NULL;
+ m_pObject = NULL;
+}
+CPDF_DeviceBuffer::~CPDF_DeviceBuffer()
+{
+ if (m_pBitmap) {
+ delete m_pBitmap;
+ }
+}
+FX_BOOL CPDF_DeviceBuffer::Initialize(CPDF_RenderContext* pContext, CFX_RenderDevice* pDevice, FX_RECT* pRect,
+ const CPDF_PageObject* pObj, int max_dpi)
+{
+ m_pDevice = pDevice;
+ m_pContext = pContext;
+ m_Rect = *pRect;
+ m_pObject = pObj;
+ m_Matrix.TranslateI(-pRect->left, -pRect->top);
+#if _FXM_PLATFORM_ != _FXM_PLATFORM_APPLE_
+ int horz_size = pDevice->GetDeviceCaps(FXDC_HORZ_SIZE);
+ int vert_size = pDevice->GetDeviceCaps(FXDC_VERT_SIZE);
+ if (horz_size && vert_size && max_dpi) {
+ int dpih = pDevice->GetDeviceCaps(FXDC_PIXEL_WIDTH) * 254 / (horz_size * 10);
+ int dpiv = pDevice->GetDeviceCaps(FXDC_PIXEL_HEIGHT) * 254 / (vert_size * 10);
+ if (dpih > max_dpi) {
+ m_Matrix.Scale((FX_FLOAT)(max_dpi) / dpih, 1.0f);
+ }
+ if (dpiv > max_dpi) {
+ m_Matrix.Scale(1.0f, (FX_FLOAT)(max_dpi) / (FX_FLOAT)dpiv);
+ }
+ }
+#ifdef _FPDFAPI_MINI_
+ m_Matrix.Scale(0.5f, 0.5f);
+#endif
+#endif
+ CFX_Matrix ctm = m_pDevice->GetCTM();
+ FX_FLOAT fScaleX = FXSYS_fabs(ctm.a);
+ FX_FLOAT fScaleY = FXSYS_fabs(ctm.d);
+ m_Matrix.Concat(fScaleX, 0, 0, fScaleY, 0, 0);
+ CFX_FloatRect rect(*pRect);
+ m_Matrix.TransformRect(rect);
+ FX_RECT bitmap_rect = rect.GetOutterRect();
+ m_pBitmap = FX_NEW CFX_DIBitmap;
+ m_pBitmap->Create(bitmap_rect.Width(), bitmap_rect.Height(), FXDIB_Argb);
+ return TRUE;
+}
+void CPDF_DeviceBuffer::OutputToDevice()
+{
+ if (m_pDevice->GetDeviceCaps(FXDC_RENDER_CAPS) & FXRC_GET_BITS) {
+ if (m_Matrix.a == 1.0f && m_Matrix.d == 1.0f) {
+ m_pDevice->SetDIBits(m_pBitmap, m_Rect.left, m_Rect.top);
+ } else {
+ m_pDevice->StretchDIBits(m_pBitmap, m_Rect.left, m_Rect.top, m_Rect.Width(), m_Rect.Height());
+ }
+ } else {
+#if !defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_)
+ CFX_DIBitmap buffer;
+ m_pDevice->CreateCompatibleBitmap(&buffer, m_pBitmap->GetWidth(), m_pBitmap->GetHeight());
+ m_pContext->GetBackground(&buffer, m_pObject, NULL, &m_Matrix);
+ buffer.CompositeBitmap(0, 0, buffer.GetWidth(), buffer.GetHeight(), m_pBitmap, 0, 0);
+ m_pDevice->StretchDIBits(&buffer, m_Rect.left, m_Rect.top, m_Rect.Width(), m_Rect.Height());
+#endif
+ }
+}
+CPDF_ScaledRenderBuffer::CPDF_ScaledRenderBuffer()
+{
+ m_pBitmapDevice = NULL;
+}
+CPDF_ScaledRenderBuffer::~CPDF_ScaledRenderBuffer()
+{
+ if (m_pBitmapDevice) {
+ delete m_pBitmapDevice;
+ }
+}
+#ifndef _FPDFAPI_MINI_
+#define _FPDFAPI_IMAGESIZE_LIMIT_ (30 * 1024 * 1024)
+#else
+#define _FPDFAPI_IMAGESIZE_LIMIT_ (10 * 1024 * 1024)
+#endif
+FX_BOOL CPDF_ScaledRenderBuffer::Initialize(CPDF_RenderContext* pContext, CFX_RenderDevice* pDevice, FX_RECT* pRect,
+ const CPDF_PageObject* pObj, const CPDF_RenderOptions *pOptions, int max_dpi)
+{
+ FXSYS_assert(pRect != NULL);
+ m_pDevice = pDevice;
+ if (m_pDevice->GetDeviceCaps(FXDC_RENDER_CAPS) & FXRC_GET_BITS) {
+ return TRUE;
+ }
+ m_pContext = pContext;
+ m_Rect = *pRect;
+ m_pObject = pObj;
+ m_Matrix.TranslateI(-pRect->left, -pRect->top);
+ int horz_size = pDevice->GetDeviceCaps(FXDC_HORZ_SIZE);
+ int vert_size = pDevice->GetDeviceCaps(FXDC_VERT_SIZE);
+ if (horz_size && vert_size && max_dpi) {
+ int dpih = pDevice->GetDeviceCaps(FXDC_PIXEL_WIDTH) * 254 / (horz_size * 10);
+ int dpiv = pDevice->GetDeviceCaps(FXDC_PIXEL_HEIGHT) * 254 / (vert_size * 10);
+ if (dpih > max_dpi) {
+ m_Matrix.Scale((FX_FLOAT)(max_dpi) / dpih, 1.0f);
+ }
+ if (dpiv > max_dpi) {
+ m_Matrix.Scale(1.0f, (FX_FLOAT)(max_dpi) / (FX_FLOAT)dpiv);
+ }
+ }
+ m_pBitmapDevice = FX_NEW CFX_FxgeDevice;
+ FXDIB_Format dibFormat = FXDIB_Rgb;
+ FX_INT32 bpp = 24;
+ if (m_pDevice->GetDeviceCaps(FXDC_RENDER_CAPS) & FXRC_ALPHA_OUTPUT) {
+ dibFormat = FXDIB_Argb;
+ bpp = 32;
+ }
+ CFX_FloatRect rect;
+ FX_INT32 iWidth, iHeight, iPitch;
+ while (1) {
+ rect = *pRect;
+ m_Matrix.TransformRect(rect);
+ FX_RECT bitmap_rect = rect.GetOutterRect();
+ iWidth = bitmap_rect.Width();
+ iHeight = bitmap_rect.Height();
+ iPitch = (iWidth * bpp + 31) / 32 * 4;
+ if (iWidth * iHeight < 1) {
+ return FALSE;
+ }
+ if (iPitch * iHeight <= _FPDFAPI_IMAGESIZE_LIMIT_ &&
+ m_pBitmapDevice->Create(iWidth, iHeight, dibFormat)) {
+ break;
+ }
+ m_Matrix.Scale(0.5f, 0.5f);
+ }
+#if !defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_)
+ m_pContext->GetBackground(m_pBitmapDevice->GetBitmap(), m_pObject, pOptions, &m_Matrix);
+#endif
+ return TRUE;
+}
+void CPDF_ScaledRenderBuffer::OutputToDevice()
+{
+ if (m_pBitmapDevice) {
+ m_pDevice->StretchDIBits(m_pBitmapDevice->GetBitmap(), m_Rect.left, m_Rect.top, m_Rect.Width(), m_Rect.Height());
+ }
+}
+FX_BOOL IPDF_OCContext::CheckObjectVisible(const CPDF_PageObject* pObj)
+{
+ const CPDF_ContentMarkData* pData = pObj->m_ContentMark;
+ int nItems = pData->CountItems();
+ for (int i = 0; i < nItems; i ++) {
+ CPDF_ContentMarkItem& item = pData->GetItem(i);
+ if (item.GetName() == FX_BSTRC("OC") && item.GetParamType() == CPDF_ContentMarkItem::PropertiesDict) {
+ CPDF_Dictionary* pOCG = (CPDF_Dictionary*)item.GetParam();
+ if (!CheckOCGVisible(pOCG)) {
+ return FALSE;
+ }
+ }
+ }
+ return TRUE;
+}
diff --git a/core/src/fpdfapi/fpdf_render/fpdf_render_cache.cpp b/core/src/fpdfapi/fpdf_render/fpdf_render_cache.cpp
index c5be3391b8..eb08bca8a7 100644
--- a/core/src/fpdfapi/fpdf_render/fpdf_render_cache.cpp
+++ b/core/src/fpdfapi/fpdf_render/fpdf_render_cache.cpp
@@ -1,389 +1,389 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../../include/fpdfapi/fpdf_render.h"
-#include "../../../include/fpdfapi/fpdf_pageobj.h"
-#include "../../../include/fxge/fx_ge.h"
-#include "../fpdf_page/pageint.h"
-#include "render_int.h"
-struct CACHEINFO {
- FX_DWORD time;
- CPDF_Stream* pStream;
-};
-extern "C" {
- static int compare(const void* data1, const void* data2)
- {
- return ((CACHEINFO*)data1)->time - ((CACHEINFO*)data2)->time;
- }
-};
-void CPDF_Page::ClearRenderCache()
-{
- if (m_pPageRender) {
- m_pPageRender->ClearAll();
- }
-}
-void CPDF_PageRenderCache::ClearAll()
-{
- FX_POSITION pos = m_ImageCaches.GetStartPosition();
- while (pos) {
- FX_LPVOID key, value;
- m_ImageCaches.GetNextAssoc(pos, key, value);
- delete (CPDF_ImageCache*)value;
- }
- m_ImageCaches.RemoveAll();
- m_nCacheSize = 0;
- m_nTimeCount = 0;
-}
-void CPDF_PageRenderCache::CacheOptimization(FX_INT32 dwLimitCacheSize)
-{
- if (m_nCacheSize <= (FX_DWORD)dwLimitCacheSize) {
- return;
- }
- int nCount = m_ImageCaches.GetCount();
- CACHEINFO* pCACHEINFO = (CACHEINFO*)FX_Alloc(FX_BYTE, (sizeof (CACHEINFO)) * nCount);
- FX_POSITION pos = m_ImageCaches.GetStartPosition();
- int i = 0;
- while (pos) {
- FX_LPVOID key, value;
- m_ImageCaches.GetNextAssoc(pos, key, value);
- pCACHEINFO[i].time = ((CPDF_ImageCache*)value)->GetTimeCount();
- pCACHEINFO[i++].pStream = ((CPDF_ImageCache*)value)->GetStream();
- }
- FXSYS_qsort(pCACHEINFO, nCount, sizeof (CACHEINFO), compare);
- FX_DWORD nTimeCount = m_nTimeCount;
- if (nTimeCount + 1 < nTimeCount) {
- for (i = 0; i < nCount; i ++) {
- ((CPDF_ImageCache*)(m_ImageCaches[pCACHEINFO[i].pStream]))->m_dwTimeCount = i;
- }
- m_nTimeCount = nCount;
- }
- i = 0;
- while(nCount > 15) {
- ClearImageCache(pCACHEINFO[i++].pStream);
- nCount--;
- }
- while (m_nCacheSize > (FX_DWORD)dwLimitCacheSize) {
- ClearImageCache(pCACHEINFO[i++].pStream);
- }
- FX_Free(pCACHEINFO);
-}
-void CPDF_PageRenderCache::ClearImageCache(CPDF_Stream* pStream)
-{
- FX_LPVOID value = m_ImageCaches.GetValueAt(pStream);
- if (value == NULL) {
- m_ImageCaches.RemoveKey(pStream);
- return;
- }
- m_nCacheSize -= ((CPDF_ImageCache*)value)->EstimateSize();
- delete (CPDF_ImageCache*)value;
- m_ImageCaches.RemoveKey(pStream);
-}
-FX_DWORD CPDF_PageRenderCache::EstimateSize()
-{
- FX_DWORD dwSize = 0;
- FX_POSITION pos = m_ImageCaches.GetStartPosition();
- while (pos) {
- FX_LPVOID key, value;
- m_ImageCaches.GetNextAssoc(pos, key, value);
- dwSize += ((CPDF_ImageCache*)value)->EstimateSize();
- }
- m_nCacheSize = dwSize;
- return dwSize;
-}
-FX_DWORD CPDF_PageRenderCache::GetCachedSize(CPDF_Stream* pStream) const
-{
- if (pStream == NULL) {
- return m_nCacheSize;
- }
- CPDF_ImageCache* pImageCache;
- if (!m_ImageCaches.Lookup(pStream, (FX_LPVOID&)pImageCache)) {
- return 0;
- }
- return pImageCache->EstimateSize();
-}
-void CPDF_PageRenderCache::GetCachedBitmap(CPDF_Stream* pStream, CFX_DIBSource*& pBitmap, CFX_DIBSource*& pMask, FX_DWORD& MatteColor,
- FX_BOOL bStdCS, FX_DWORD GroupFamily, FX_BOOL bLoadMask, CPDF_RenderStatus* pRenderStatus,
- FX_INT32 downsampleWidth, FX_INT32 downsampleHeight)
-{
- CPDF_ImageCache* pImageCache;
- FX_BOOL bFind = m_ImageCaches.Lookup(pStream, (FX_LPVOID&)pImageCache);
- if (!bFind) {
- pImageCache = FX_NEW CPDF_ImageCache(m_pPage->m_pDocument, pStream);
- }
- m_nTimeCount ++;
- FX_BOOL bCached = pImageCache->GetCachedBitmap(pBitmap, pMask, MatteColor, m_pPage->m_pPageResources, bStdCS, GroupFamily, bLoadMask, pRenderStatus, downsampleWidth, downsampleHeight);
- if (!bFind) {
- m_ImageCaches.SetAt(pStream, pImageCache);
- }
- if (!bCached) {
- m_nCacheSize += pImageCache->EstimateSize();
- }
-}
-FX_BOOL CPDF_PageRenderCache::StartGetCachedBitmap(CPDF_Stream* pStream, FX_BOOL bStdCS, FX_DWORD GroupFamily, FX_BOOL bLoadMask, CPDF_RenderStatus* pRenderStatus, FX_INT32 downsampleWidth, FX_INT32 downsampleHeight)
-{
- m_bCurFindCache = m_ImageCaches.Lookup(pStream, (FX_LPVOID&)m_pCurImageCache);
- if (!m_bCurFindCache) {
- m_pCurImageCache = FX_NEW CPDF_ImageCache(m_pPage->m_pDocument, pStream);
- }
- int ret = m_pCurImageCache->StartGetCachedBitmap(pRenderStatus->m_pFormResource, m_pPage->m_pPageResources, bStdCS, GroupFamily, bLoadMask, pRenderStatus, downsampleWidth, downsampleHeight);
- if (ret == 2) {
- return TRUE;
- }
- m_nTimeCount ++;
- if (!m_bCurFindCache) {
- m_ImageCaches.SetAt(pStream, m_pCurImageCache);
- }
- if (!ret) {
- m_nCacheSize += m_pCurImageCache->EstimateSize();
- }
- return FALSE;
-}
-FX_BOOL CPDF_PageRenderCache::Continue(IFX_Pause* pPause)
-{
- int ret = m_pCurImageCache->Continue(pPause);
- if (ret == 2) {
- return TRUE;
- }
- m_nTimeCount ++;
- if (!m_bCurFindCache) {
- m_ImageCaches.SetAt(m_pCurImageCache->GetStream(), m_pCurImageCache);
- }
- if (!ret) {
- m_nCacheSize += m_pCurImageCache->EstimateSize();
- }
- return FALSE;
-}
-void CPDF_PageRenderCache::ResetBitmap(CPDF_Stream* pStream, const CFX_DIBitmap* pBitmap)
-{
- CPDF_ImageCache* pImageCache;
- if (!m_ImageCaches.Lookup(pStream, (FX_LPVOID&)pImageCache)) {
- if (pBitmap == NULL) {
- return;
- }
- pImageCache = FX_NEW CPDF_ImageCache(m_pPage->m_pDocument, pStream);
- m_ImageCaches.SetAt(pStream, pImageCache);
- }
- int oldsize = pImageCache->EstimateSize();
- pImageCache->Reset(pBitmap);
- m_nCacheSize = pImageCache->EstimateSize() - oldsize;
-}
-CPDF_ImageCache::CPDF_ImageCache(CPDF_Document* pDoc, CPDF_Stream* pStream)
- : m_pDocument(pDoc)
- , m_pStream(pStream)
- , m_pCachedBitmap(NULL)
- , m_pCachedMask(NULL)
- , m_dwCacheSize(0)
- , m_dwTimeCount(0)
- , m_pCurBitmap(NULL)
- , m_pCurMask(NULL)
- , m_MatteColor(0)
- , m_pRenderStatus(NULL)
-{
-}
-CPDF_ImageCache::~CPDF_ImageCache()
-{
- if (m_pCachedBitmap) {
- delete m_pCachedBitmap;
- m_pCachedBitmap = NULL;
- }
- if (m_pCachedMask) {
- delete m_pCachedMask;
- m_pCachedMask = NULL;
- }
-}
-void CPDF_ImageCache::Reset(const CFX_DIBitmap* pBitmap)
-{
- if (m_pCachedBitmap) {
- delete m_pCachedBitmap;
- }
- m_pCachedBitmap = NULL;
- if (pBitmap) {
- m_pCachedBitmap = pBitmap->Clone();
- }
- CalcSize();
-}
-void CPDF_PageRenderCache::ClearImageData()
-{
- FX_POSITION pos = m_ImageCaches.GetStartPosition();
- while (pos) {
- FX_LPVOID key, value;
- m_ImageCaches.GetNextAssoc(pos, key, value);
- ((CPDF_ImageCache*)value)->ClearImageData();
- }
-}
-void CPDF_ImageCache::ClearImageData()
-{
- if (m_pCachedBitmap && m_pCachedBitmap->GetBuffer() == NULL) {
- ((CPDF_DIBSource*)m_pCachedBitmap)->ClearImageData();
- }
-}
-static FX_DWORD FPDF_ImageCache_EstimateImageSize(const CFX_DIBSource* pDIB)
-{
- return pDIB && pDIB->GetBuffer() ? (FX_DWORD)pDIB->GetHeight() * pDIB->GetPitch() + (FX_DWORD)pDIB->GetPaletteSize() * 4 : 0;
-}
-FX_BOOL CPDF_ImageCache::GetCachedBitmap(CFX_DIBSource*& pBitmap, CFX_DIBSource*& pMask, FX_DWORD& MatteColor, CPDF_Dictionary* pPageResources,
- FX_BOOL bStdCS, FX_DWORD GroupFamily, FX_BOOL bLoadMask, CPDF_RenderStatus* pRenderStatus,
- FX_INT32 downsampleWidth, FX_INT32 downsampleHeight)
-{
- if (m_pCachedBitmap) {
- pBitmap = m_pCachedBitmap;
- pMask = m_pCachedMask;
- MatteColor = m_MatteColor;
- return TRUE;
- }
- if (!pRenderStatus) {
- return FALSE;
- }
- CPDF_RenderContext*pContext = pRenderStatus->GetContext();
- CPDF_PageRenderCache* pPageRenderCache = pContext->m_pPageCache;
- m_dwTimeCount = pPageRenderCache->GetTimeCount();
- CPDF_DIBSource* pSrc = FX_NEW CPDF_DIBSource;
- CPDF_DIBSource* pMaskSrc = NULL;
- if (!pSrc->Load(m_pDocument, m_pStream, &pMaskSrc, &MatteColor, pRenderStatus->m_pFormResource, pPageResources, bStdCS, GroupFamily, bLoadMask)) {
- delete pSrc;
- pBitmap = NULL;
- return FALSE;
- }
- m_MatteColor = MatteColor;
-#if !defined(_FPDFAPI_MINI_)
- if (pSrc->GetPitch() * pSrc->GetHeight() < FPDF_HUGE_IMAGE_SIZE) {
- m_pCachedBitmap = pSrc->Clone();
- delete pSrc;
- } else {
- m_pCachedBitmap = pSrc;
- }
- if (pMaskSrc) {
- m_pCachedMask = pMaskSrc->Clone();
- delete pMaskSrc;
- }
-#else
- if (pSrc->GetFormat() == FXDIB_8bppRgb && pSrc->GetPalette() &&
- pSrc->GetHeight() * pSrc->GetWidth() * 3 < 1024) {
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
- m_pCachedBitmap = pSrc->CloneConvert(FXDIB_Rgb32);
-#else
- m_pCachedBitmap = pSrc->CloneConvert(FXDIB_Rgb);
-#endif
- delete pSrc;
- } else if (pSrc->GetPitch() * pSrc->GetHeight() < 102400) {
- m_pCachedBitmap = pSrc->Clone();
- delete pSrc;
- } else {
- m_pCachedBitmap = pSrc;
- }
- m_pCachedMask = pMaskSrc;
-#endif
- pBitmap = m_pCachedBitmap;
- pMask = m_pCachedMask;
- CalcSize();
- return FALSE;
-}
-CFX_DIBSource* CPDF_ImageCache::DetachBitmap()
-{
- CFX_DIBSource* pDIBSource = m_pCurBitmap;
- m_pCurBitmap = NULL;
- return pDIBSource;
-}
-CFX_DIBSource* CPDF_ImageCache::DetachMask()
-{
- CFX_DIBSource* pDIBSource = m_pCurMask;
- m_pCurMask = NULL;
- return pDIBSource;
-}
-int CPDF_ImageCache::StartGetCachedBitmap(CPDF_Dictionary* pFormResources, CPDF_Dictionary* pPageResources, FX_BOOL bStdCS,
- FX_DWORD GroupFamily, FX_BOOL bLoadMask, CPDF_RenderStatus* pRenderStatus,
- FX_INT32 downsampleWidth, FX_INT32 downsampleHeight)
-{
- if (m_pCachedBitmap) {
- m_pCurBitmap = m_pCachedBitmap;
- m_pCurMask = m_pCachedMask;
- return 1;
- }
- if (!pRenderStatus) {
- return 0;
- }
- m_pRenderStatus = pRenderStatus;
- m_pCurBitmap = FX_NEW CPDF_DIBSource;
- int ret = ((CPDF_DIBSource*)m_pCurBitmap)->StartLoadDIBSource(m_pDocument, m_pStream, TRUE, pFormResources, pPageResources, bStdCS, GroupFamily, bLoadMask);
- if (ret == 2) {
- return ret;
- }
- if (!ret) {
- delete m_pCurBitmap;
- m_pCurBitmap = NULL;
- return 0;
- }
- ContinueGetCachedBitmap();
- return 0;
-}
-int CPDF_ImageCache::ContinueGetCachedBitmap()
-{
- m_MatteColor = ((CPDF_DIBSource*)m_pCurBitmap)->m_MatteColor;
- m_pCurMask = ((CPDF_DIBSource*)m_pCurBitmap)->DetachMask();
- CPDF_RenderContext*pContext = m_pRenderStatus->GetContext();
- CPDF_PageRenderCache* pPageRenderCache = pContext->m_pPageCache;
- m_dwTimeCount = pPageRenderCache->GetTimeCount();
-#if !defined(_FPDFAPI_MINI_)
- if (m_pCurBitmap->GetPitch() * m_pCurBitmap->GetHeight() < FPDF_HUGE_IMAGE_SIZE) {
- m_pCachedBitmap = m_pCurBitmap->Clone();
- delete m_pCurBitmap;
- m_pCurBitmap = NULL;
- } else {
- m_pCachedBitmap = m_pCurBitmap;
- }
- if (m_pCurMask) {
- m_pCachedMask = m_pCurMask->Clone();
- delete m_pCurMask;
- m_pCurMask = NULL;
- }
-#else
- if (m_pCurBitmap->GetFormat() == FXDIB_8bppRgb && m_pCurBitmap->GetPalette() &&
- m_pCurBitmap->GetHeight() * m_pCurBitmap->GetWidth() * 3 < 1024) {
- m_pCachedBitmap = m_pCurBitmap->CloneConvert(FXDIB_Rgb32);
- m_pCachedBitmap = m_pCurBitmap->CloneConvert(FXDIB_Rgb);
- delete m_pCurBitmap;
- m_pCurBitmap = NULL;
- } else if (m_pCurBitmap->GetPitch() * m_pCurBitmap->GetHeight() < 102400) {
- m_pCachedBitmap = m_pCurBitmap->Clone();
- delete m_pCurBitmap;
- m_pCurBitmap = NULL;
- } else {
- m_pCachedBitmap = m_pCurBitmap;
- }
- m_pCachedMask = m_pCurMask;
-#endif
- m_pCurBitmap = m_pCachedBitmap;
- m_pCurMask = m_pCachedMask;
- CalcSize();
- return 0;
-}
-int CPDF_ImageCache::Continue(IFX_Pause* pPause)
-{
- int ret = ((CPDF_DIBSource*)m_pCurBitmap)->ContinueLoadDIBSource(pPause);
- if (ret == 2) {
- return ret;
- }
- if (!ret) {
- delete m_pCurBitmap;
- m_pCurBitmap = NULL;
- return 0;
- }
- ContinueGetCachedBitmap();
- return 0;
-}
-void CPDF_ImageCache::CalcSize()
-{
- m_dwCacheSize = FPDF_ImageCache_EstimateImageSize(m_pCachedBitmap) + FPDF_ImageCache_EstimateImageSize(m_pCachedMask);
-}
-void CPDF_Document::ClearRenderFont()
-{
- if (m_pDocRender) {
- CFX_FontCache* pCache = m_pDocRender->GetFontCache();
- if (pCache) {
- pCache->FreeCache(FALSE);
- }
- }
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fpdfapi/fpdf_render.h"
+#include "../../../include/fpdfapi/fpdf_pageobj.h"
+#include "../../../include/fxge/fx_ge.h"
+#include "../fpdf_page/pageint.h"
+#include "render_int.h"
+struct CACHEINFO {
+ FX_DWORD time;
+ CPDF_Stream* pStream;
+};
+extern "C" {
+ static int compare(const void* data1, const void* data2)
+ {
+ return ((CACHEINFO*)data1)->time - ((CACHEINFO*)data2)->time;
+ }
+};
+void CPDF_Page::ClearRenderCache()
+{
+ if (m_pPageRender) {
+ m_pPageRender->ClearAll();
+ }
+}
+void CPDF_PageRenderCache::ClearAll()
+{
+ FX_POSITION pos = m_ImageCaches.GetStartPosition();
+ while (pos) {
+ FX_LPVOID key, value;
+ m_ImageCaches.GetNextAssoc(pos, key, value);
+ delete (CPDF_ImageCache*)value;
+ }
+ m_ImageCaches.RemoveAll();
+ m_nCacheSize = 0;
+ m_nTimeCount = 0;
+}
+void CPDF_PageRenderCache::CacheOptimization(FX_INT32 dwLimitCacheSize)
+{
+ if (m_nCacheSize <= (FX_DWORD)dwLimitCacheSize) {
+ return;
+ }
+ int nCount = m_ImageCaches.GetCount();
+ CACHEINFO* pCACHEINFO = (CACHEINFO*)FX_Alloc(FX_BYTE, (sizeof (CACHEINFO)) * nCount);
+ FX_POSITION pos = m_ImageCaches.GetStartPosition();
+ int i = 0;
+ while (pos) {
+ FX_LPVOID key, value;
+ m_ImageCaches.GetNextAssoc(pos, key, value);
+ pCACHEINFO[i].time = ((CPDF_ImageCache*)value)->GetTimeCount();
+ pCACHEINFO[i++].pStream = ((CPDF_ImageCache*)value)->GetStream();
+ }
+ FXSYS_qsort(pCACHEINFO, nCount, sizeof (CACHEINFO), compare);
+ FX_DWORD nTimeCount = m_nTimeCount;
+ if (nTimeCount + 1 < nTimeCount) {
+ for (i = 0; i < nCount; i ++) {
+ ((CPDF_ImageCache*)(m_ImageCaches[pCACHEINFO[i].pStream]))->m_dwTimeCount = i;
+ }
+ m_nTimeCount = nCount;
+ }
+ i = 0;
+ while(nCount > 15) {
+ ClearImageCache(pCACHEINFO[i++].pStream);
+ nCount--;
+ }
+ while (m_nCacheSize > (FX_DWORD)dwLimitCacheSize) {
+ ClearImageCache(pCACHEINFO[i++].pStream);
+ }
+ FX_Free(pCACHEINFO);
+}
+void CPDF_PageRenderCache::ClearImageCache(CPDF_Stream* pStream)
+{
+ FX_LPVOID value = m_ImageCaches.GetValueAt(pStream);
+ if (value == NULL) {
+ m_ImageCaches.RemoveKey(pStream);
+ return;
+ }
+ m_nCacheSize -= ((CPDF_ImageCache*)value)->EstimateSize();
+ delete (CPDF_ImageCache*)value;
+ m_ImageCaches.RemoveKey(pStream);
+}
+FX_DWORD CPDF_PageRenderCache::EstimateSize()
+{
+ FX_DWORD dwSize = 0;
+ FX_POSITION pos = m_ImageCaches.GetStartPosition();
+ while (pos) {
+ FX_LPVOID key, value;
+ m_ImageCaches.GetNextAssoc(pos, key, value);
+ dwSize += ((CPDF_ImageCache*)value)->EstimateSize();
+ }
+ m_nCacheSize = dwSize;
+ return dwSize;
+}
+FX_DWORD CPDF_PageRenderCache::GetCachedSize(CPDF_Stream* pStream) const
+{
+ if (pStream == NULL) {
+ return m_nCacheSize;
+ }
+ CPDF_ImageCache* pImageCache;
+ if (!m_ImageCaches.Lookup(pStream, (FX_LPVOID&)pImageCache)) {
+ return 0;
+ }
+ return pImageCache->EstimateSize();
+}
+void CPDF_PageRenderCache::GetCachedBitmap(CPDF_Stream* pStream, CFX_DIBSource*& pBitmap, CFX_DIBSource*& pMask, FX_DWORD& MatteColor,
+ FX_BOOL bStdCS, FX_DWORD GroupFamily, FX_BOOL bLoadMask, CPDF_RenderStatus* pRenderStatus,
+ FX_INT32 downsampleWidth, FX_INT32 downsampleHeight)
+{
+ CPDF_ImageCache* pImageCache;
+ FX_BOOL bFind = m_ImageCaches.Lookup(pStream, (FX_LPVOID&)pImageCache);
+ if (!bFind) {
+ pImageCache = FX_NEW CPDF_ImageCache(m_pPage->m_pDocument, pStream);
+ }
+ m_nTimeCount ++;
+ FX_BOOL bCached = pImageCache->GetCachedBitmap(pBitmap, pMask, MatteColor, m_pPage->m_pPageResources, bStdCS, GroupFamily, bLoadMask, pRenderStatus, downsampleWidth, downsampleHeight);
+ if (!bFind) {
+ m_ImageCaches.SetAt(pStream, pImageCache);
+ }
+ if (!bCached) {
+ m_nCacheSize += pImageCache->EstimateSize();
+ }
+}
+FX_BOOL CPDF_PageRenderCache::StartGetCachedBitmap(CPDF_Stream* pStream, FX_BOOL bStdCS, FX_DWORD GroupFamily, FX_BOOL bLoadMask, CPDF_RenderStatus* pRenderStatus, FX_INT32 downsampleWidth, FX_INT32 downsampleHeight)
+{
+ m_bCurFindCache = m_ImageCaches.Lookup(pStream, (FX_LPVOID&)m_pCurImageCache);
+ if (!m_bCurFindCache) {
+ m_pCurImageCache = FX_NEW CPDF_ImageCache(m_pPage->m_pDocument, pStream);
+ }
+ int ret = m_pCurImageCache->StartGetCachedBitmap(pRenderStatus->m_pFormResource, m_pPage->m_pPageResources, bStdCS, GroupFamily, bLoadMask, pRenderStatus, downsampleWidth, downsampleHeight);
+ if (ret == 2) {
+ return TRUE;
+ }
+ m_nTimeCount ++;
+ if (!m_bCurFindCache) {
+ m_ImageCaches.SetAt(pStream, m_pCurImageCache);
+ }
+ if (!ret) {
+ m_nCacheSize += m_pCurImageCache->EstimateSize();
+ }
+ return FALSE;
+}
+FX_BOOL CPDF_PageRenderCache::Continue(IFX_Pause* pPause)
+{
+ int ret = m_pCurImageCache->Continue(pPause);
+ if (ret == 2) {
+ return TRUE;
+ }
+ m_nTimeCount ++;
+ if (!m_bCurFindCache) {
+ m_ImageCaches.SetAt(m_pCurImageCache->GetStream(), m_pCurImageCache);
+ }
+ if (!ret) {
+ m_nCacheSize += m_pCurImageCache->EstimateSize();
+ }
+ return FALSE;
+}
+void CPDF_PageRenderCache::ResetBitmap(CPDF_Stream* pStream, const CFX_DIBitmap* pBitmap)
+{
+ CPDF_ImageCache* pImageCache;
+ if (!m_ImageCaches.Lookup(pStream, (FX_LPVOID&)pImageCache)) {
+ if (pBitmap == NULL) {
+ return;
+ }
+ pImageCache = FX_NEW CPDF_ImageCache(m_pPage->m_pDocument, pStream);
+ m_ImageCaches.SetAt(pStream, pImageCache);
+ }
+ int oldsize = pImageCache->EstimateSize();
+ pImageCache->Reset(pBitmap);
+ m_nCacheSize = pImageCache->EstimateSize() - oldsize;
+}
+CPDF_ImageCache::CPDF_ImageCache(CPDF_Document* pDoc, CPDF_Stream* pStream)
+ : m_pDocument(pDoc)
+ , m_pStream(pStream)
+ , m_pCachedBitmap(NULL)
+ , m_pCachedMask(NULL)
+ , m_dwCacheSize(0)
+ , m_dwTimeCount(0)
+ , m_pCurBitmap(NULL)
+ , m_pCurMask(NULL)
+ , m_MatteColor(0)
+ , m_pRenderStatus(NULL)
+{
+}
+CPDF_ImageCache::~CPDF_ImageCache()
+{
+ if (m_pCachedBitmap) {
+ delete m_pCachedBitmap;
+ m_pCachedBitmap = NULL;
+ }
+ if (m_pCachedMask) {
+ delete m_pCachedMask;
+ m_pCachedMask = NULL;
+ }
+}
+void CPDF_ImageCache::Reset(const CFX_DIBitmap* pBitmap)
+{
+ if (m_pCachedBitmap) {
+ delete m_pCachedBitmap;
+ }
+ m_pCachedBitmap = NULL;
+ if (pBitmap) {
+ m_pCachedBitmap = pBitmap->Clone();
+ }
+ CalcSize();
+}
+void CPDF_PageRenderCache::ClearImageData()
+{
+ FX_POSITION pos = m_ImageCaches.GetStartPosition();
+ while (pos) {
+ FX_LPVOID key, value;
+ m_ImageCaches.GetNextAssoc(pos, key, value);
+ ((CPDF_ImageCache*)value)->ClearImageData();
+ }
+}
+void CPDF_ImageCache::ClearImageData()
+{
+ if (m_pCachedBitmap && m_pCachedBitmap->GetBuffer() == NULL) {
+ ((CPDF_DIBSource*)m_pCachedBitmap)->ClearImageData();
+ }
+}
+static FX_DWORD FPDF_ImageCache_EstimateImageSize(const CFX_DIBSource* pDIB)
+{
+ return pDIB && pDIB->GetBuffer() ? (FX_DWORD)pDIB->GetHeight() * pDIB->GetPitch() + (FX_DWORD)pDIB->GetPaletteSize() * 4 : 0;
+}
+FX_BOOL CPDF_ImageCache::GetCachedBitmap(CFX_DIBSource*& pBitmap, CFX_DIBSource*& pMask, FX_DWORD& MatteColor, CPDF_Dictionary* pPageResources,
+ FX_BOOL bStdCS, FX_DWORD GroupFamily, FX_BOOL bLoadMask, CPDF_RenderStatus* pRenderStatus,
+ FX_INT32 downsampleWidth, FX_INT32 downsampleHeight)
+{
+ if (m_pCachedBitmap) {
+ pBitmap = m_pCachedBitmap;
+ pMask = m_pCachedMask;
+ MatteColor = m_MatteColor;
+ return TRUE;
+ }
+ if (!pRenderStatus) {
+ return FALSE;
+ }
+ CPDF_RenderContext*pContext = pRenderStatus->GetContext();
+ CPDF_PageRenderCache* pPageRenderCache = pContext->m_pPageCache;
+ m_dwTimeCount = pPageRenderCache->GetTimeCount();
+ CPDF_DIBSource* pSrc = FX_NEW CPDF_DIBSource;
+ CPDF_DIBSource* pMaskSrc = NULL;
+ if (!pSrc->Load(m_pDocument, m_pStream, &pMaskSrc, &MatteColor, pRenderStatus->m_pFormResource, pPageResources, bStdCS, GroupFamily, bLoadMask)) {
+ delete pSrc;
+ pBitmap = NULL;
+ return FALSE;
+ }
+ m_MatteColor = MatteColor;
+#if !defined(_FPDFAPI_MINI_)
+ if (pSrc->GetPitch() * pSrc->GetHeight() < FPDF_HUGE_IMAGE_SIZE) {
+ m_pCachedBitmap = pSrc->Clone();
+ delete pSrc;
+ } else {
+ m_pCachedBitmap = pSrc;
+ }
+ if (pMaskSrc) {
+ m_pCachedMask = pMaskSrc->Clone();
+ delete pMaskSrc;
+ }
+#else
+ if (pSrc->GetFormat() == FXDIB_8bppRgb && pSrc->GetPalette() &&
+ pSrc->GetHeight() * pSrc->GetWidth() * 3 < 1024) {
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+ m_pCachedBitmap = pSrc->CloneConvert(FXDIB_Rgb32);
+#else
+ m_pCachedBitmap = pSrc->CloneConvert(FXDIB_Rgb);
+#endif
+ delete pSrc;
+ } else if (pSrc->GetPitch() * pSrc->GetHeight() < 102400) {
+ m_pCachedBitmap = pSrc->Clone();
+ delete pSrc;
+ } else {
+ m_pCachedBitmap = pSrc;
+ }
+ m_pCachedMask = pMaskSrc;
+#endif
+ pBitmap = m_pCachedBitmap;
+ pMask = m_pCachedMask;
+ CalcSize();
+ return FALSE;
+}
+CFX_DIBSource* CPDF_ImageCache::DetachBitmap()
+{
+ CFX_DIBSource* pDIBSource = m_pCurBitmap;
+ m_pCurBitmap = NULL;
+ return pDIBSource;
+}
+CFX_DIBSource* CPDF_ImageCache::DetachMask()
+{
+ CFX_DIBSource* pDIBSource = m_pCurMask;
+ m_pCurMask = NULL;
+ return pDIBSource;
+}
+int CPDF_ImageCache::StartGetCachedBitmap(CPDF_Dictionary* pFormResources, CPDF_Dictionary* pPageResources, FX_BOOL bStdCS,
+ FX_DWORD GroupFamily, FX_BOOL bLoadMask, CPDF_RenderStatus* pRenderStatus,
+ FX_INT32 downsampleWidth, FX_INT32 downsampleHeight)
+{
+ if (m_pCachedBitmap) {
+ m_pCurBitmap = m_pCachedBitmap;
+ m_pCurMask = m_pCachedMask;
+ return 1;
+ }
+ if (!pRenderStatus) {
+ return 0;
+ }
+ m_pRenderStatus = pRenderStatus;
+ m_pCurBitmap = FX_NEW CPDF_DIBSource;
+ int ret = ((CPDF_DIBSource*)m_pCurBitmap)->StartLoadDIBSource(m_pDocument, m_pStream, TRUE, pFormResources, pPageResources, bStdCS, GroupFamily, bLoadMask);
+ if (ret == 2) {
+ return ret;
+ }
+ if (!ret) {
+ delete m_pCurBitmap;
+ m_pCurBitmap = NULL;
+ return 0;
+ }
+ ContinueGetCachedBitmap();
+ return 0;
+}
+int CPDF_ImageCache::ContinueGetCachedBitmap()
+{
+ m_MatteColor = ((CPDF_DIBSource*)m_pCurBitmap)->m_MatteColor;
+ m_pCurMask = ((CPDF_DIBSource*)m_pCurBitmap)->DetachMask();
+ CPDF_RenderContext*pContext = m_pRenderStatus->GetContext();
+ CPDF_PageRenderCache* pPageRenderCache = pContext->m_pPageCache;
+ m_dwTimeCount = pPageRenderCache->GetTimeCount();
+#if !defined(_FPDFAPI_MINI_)
+ if (m_pCurBitmap->GetPitch() * m_pCurBitmap->GetHeight() < FPDF_HUGE_IMAGE_SIZE) {
+ m_pCachedBitmap = m_pCurBitmap->Clone();
+ delete m_pCurBitmap;
+ m_pCurBitmap = NULL;
+ } else {
+ m_pCachedBitmap = m_pCurBitmap;
+ }
+ if (m_pCurMask) {
+ m_pCachedMask = m_pCurMask->Clone();
+ delete m_pCurMask;
+ m_pCurMask = NULL;
+ }
+#else
+ if (m_pCurBitmap->GetFormat() == FXDIB_8bppRgb && m_pCurBitmap->GetPalette() &&
+ m_pCurBitmap->GetHeight() * m_pCurBitmap->GetWidth() * 3 < 1024) {
+ m_pCachedBitmap = m_pCurBitmap->CloneConvert(FXDIB_Rgb32);
+ m_pCachedBitmap = m_pCurBitmap->CloneConvert(FXDIB_Rgb);
+ delete m_pCurBitmap;
+ m_pCurBitmap = NULL;
+ } else if (m_pCurBitmap->GetPitch() * m_pCurBitmap->GetHeight() < 102400) {
+ m_pCachedBitmap = m_pCurBitmap->Clone();
+ delete m_pCurBitmap;
+ m_pCurBitmap = NULL;
+ } else {
+ m_pCachedBitmap = m_pCurBitmap;
+ }
+ m_pCachedMask = m_pCurMask;
+#endif
+ m_pCurBitmap = m_pCachedBitmap;
+ m_pCurMask = m_pCachedMask;
+ CalcSize();
+ return 0;
+}
+int CPDF_ImageCache::Continue(IFX_Pause* pPause)
+{
+ int ret = ((CPDF_DIBSource*)m_pCurBitmap)->ContinueLoadDIBSource(pPause);
+ if (ret == 2) {
+ return ret;
+ }
+ if (!ret) {
+ delete m_pCurBitmap;
+ m_pCurBitmap = NULL;
+ return 0;
+ }
+ ContinueGetCachedBitmap();
+ return 0;
+}
+void CPDF_ImageCache::CalcSize()
+{
+ m_dwCacheSize = FPDF_ImageCache_EstimateImageSize(m_pCachedBitmap) + FPDF_ImageCache_EstimateImageSize(m_pCachedMask);
+}
+void CPDF_Document::ClearRenderFont()
+{
+ if (m_pDocRender) {
+ CFX_FontCache* pCache = m_pDocRender->GetFontCache();
+ if (pCache) {
+ pCache->FreeCache(FALSE);
+ }
+ }
+}
diff --git a/core/src/fpdfapi/fpdf_render/fpdf_render_image.cpp b/core/src/fpdfapi/fpdf_render/fpdf_render_image.cpp
index c2a7393739..39241e10f4 100644
--- a/core/src/fpdfapi/fpdf_render/fpdf_render_image.cpp
+++ b/core/src/fpdfapi/fpdf_render/fpdf_render_image.cpp
@@ -1,1165 +1,1165 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../../include/fxge/fx_ge.h"
-#include "../../../include/fxcodec/fx_codec.h"
-#include "../../../include/fpdfapi/fpdf_module.h"
-#include "../../../include/fpdfapi/fpdf_render.h"
-#include "../../../include/fpdfapi/fpdf_pageobj.h"
-#include "../fpdf_page/pageint.h"
-#include "render_int.h"
-FX_BOOL CPDF_RenderStatus::ProcessImage(CPDF_ImageObject* pImageObj, const CFX_AffineMatrix* pObj2Device)
-{
- CPDF_ImageRenderer render;
- if (render.Start(this, pImageObj, pObj2Device, m_bStdCS, m_curBlend)) {
- render.Continue(NULL);
- }
-#ifdef _FPDFAPI_MINI_
- if (m_DitherBits) {
- DitherObjectArea(pImageObj, pObj2Device);
- }
-#endif
- return render.m_Result;
-}
-#if defined(_FPDFAPI_MINI_)
-FX_BOOL CPDF_RenderStatus::ProcessInlines(CPDF_InlineImages* pInlines, const CFX_AffineMatrix* pObj2Device)
-{
- int bitmap_alpha = 255;
- if (!pInlines->m_GeneralState.IsNull()) {
- bitmap_alpha = FXSYS_round(pInlines->m_GeneralState.GetObject()->m_FillAlpha * 255);
- }
- if (pInlines->m_pStream) {
- CPDF_DIBSource dibsrc;
- if (!dibsrc.Load(m_pContext->m_pDocument, pInlines->m_pStream, NULL, NULL, NULL, NULL)) {
- return TRUE;
- }
- pInlines->m_pBitmap = dibsrc.Clone();
- pInlines->m_pStream->Release();
- pInlines->m_pStream = NULL;
- }
- if (pInlines->m_pBitmap == NULL) {
- return TRUE;
- }
- FX_ARGB fill_argb = 0;
- if (pInlines->m_pBitmap->IsAlphaMask()) {
- fill_argb = GetFillArgb(pInlines);
- }
- int flags = 0;
- if (m_Options.m_Flags & RENDER_FORCE_DOWNSAMPLE) {
- flags |= RENDER_FORCE_DOWNSAMPLE;
- } else if (m_Options.m_Flags & RENDER_FORCE_HALFTONE) {
- flags = 0;
- }
- for (int i = 0; i < pInlines->m_Matrices.GetSize(); i ++) {
- CFX_AffineMatrix image_matrix = pInlines->m_Matrices.GetAt(i);
- image_matrix.Concat(*pObj2Device);
- CPDF_ImageRenderer renderer;
- if (renderer.Start(this, pInlines->m_pBitmap, fill_argb, bitmap_alpha, &image_matrix, flags, FALSE, m_curBlend)) {
- renderer.Continue(NULL);
- }
- }
- return TRUE;
-}
-#endif
-void CPDF_RenderStatus::CompositeDIBitmap(CFX_DIBitmap* pDIBitmap, int left, int top, FX_ARGB mask_argb,
- int bitmap_alpha, int blend_mode, int Transparency)
-{
- if (pDIBitmap == NULL) {
- return;
- }
- FX_BOOL bIsolated = Transparency & PDFTRANS_ISOLATED;
- FX_BOOL bGroup = Transparency & PDFTRANS_GROUP;
- if (blend_mode == FXDIB_BLEND_NORMAL) {
- if (!pDIBitmap->IsAlphaMask()) {
- if (bitmap_alpha < 255) {
- pDIBitmap->MultiplyAlpha(bitmap_alpha);
- }
- if (m_pDevice->SetDIBits(pDIBitmap, left, top)) {
- return;
- }
- } else {
- FX_DWORD fill_argb = m_Options.TranslateColor(mask_argb);
- if (bitmap_alpha < 255) {
- ((FX_BYTE*)&fill_argb)[3] = ((FX_BYTE*)&fill_argb)[3] * bitmap_alpha / 255;
- }
- if (m_pDevice->SetBitMask(pDIBitmap, left, top, fill_argb)) {
- return;
- }
- }
- }
- FX_BOOL bBackAlphaRequired = blend_mode && bIsolated && !m_bDropObjects;
- FX_BOOL bGetBackGround = ((m_pDevice->GetRenderCaps() & FXRC_ALPHA_OUTPUT)) ||
- (!(m_pDevice->GetRenderCaps() & FXRC_ALPHA_OUTPUT) && (m_pDevice->GetRenderCaps()
- & FXRC_GET_BITS) && !bBackAlphaRequired);
- if (bGetBackGround) {
- if (bIsolated || !bGroup) {
- if (pDIBitmap->IsAlphaMask()) {
- return;
- }
- m_pDevice->SetDIBits(pDIBitmap, left, top, blend_mode);
- } else {
- FX_RECT rect(left, top, left + pDIBitmap->GetWidth(), top + pDIBitmap->GetHeight());
- rect.Intersect(m_pDevice->GetClipBox());
- CFX_DIBitmap* pClone = NULL;
- FX_BOOL bClone = FALSE;
- if (m_pDevice->GetBackDrop() && m_pDevice->GetBitmap()) {
- bClone = TRUE;
- pClone = m_pDevice->GetBackDrop()->Clone(&rect);
- CFX_DIBitmap *pForeBitmap = m_pDevice->GetBitmap();
- pClone->CompositeBitmap(0, 0, pClone->GetWidth(), pClone->GetHeight(), pForeBitmap, rect.left, rect.top);
- left = left >= 0 ? 0 : left;
- top = top >= 0 ? 0 : top;
- if (!pDIBitmap->IsAlphaMask())
- pClone->CompositeBitmap(0, 0, pClone->GetWidth(), pClone->GetHeight(), pDIBitmap,
- left, top, blend_mode);
- else
- pClone->CompositeMask(0, 0, pClone->GetWidth(), pClone->GetHeight(), pDIBitmap,
- mask_argb, left, top, blend_mode);
- } else {
- pClone = pDIBitmap;
- }
- if (m_pDevice->GetBackDrop()) {
- m_pDevice->SetDIBits(pClone, rect.left, rect.top);
- } else {
- if (pDIBitmap->IsAlphaMask()) {
- return;
- }
- m_pDevice->SetDIBits(pDIBitmap, rect.left, rect.top, blend_mode);
- }
- if (bClone) {
- delete pClone;
- }
- }
- return;
- }
- int back_left, back_top;
- FX_RECT rect(left, top, left + pDIBitmap->GetWidth(), top + pDIBitmap->GetHeight());
- CFX_DIBitmap* pBackdrop = GetBackdrop(m_pCurObj, rect, back_left, back_top, blend_mode > FXDIB_BLEND_NORMAL && bIsolated);
- if (!pBackdrop) {
- return;
- }
- if (!pDIBitmap->IsAlphaMask())
- pBackdrop->CompositeBitmap(left - back_left, top - back_top, pDIBitmap->GetWidth(), pDIBitmap->GetHeight(), pDIBitmap,
- 0, 0, blend_mode);
- else
- pBackdrop->CompositeMask(left - back_left, top - back_top, pDIBitmap->GetWidth(), pDIBitmap->GetHeight(), pDIBitmap,
- mask_argb, 0, 0, blend_mode);
- CFX_DIBitmap* pBackdrop1 = FX_NEW CFX_DIBitmap;
- pBackdrop1->Create(pBackdrop->GetWidth(), pBackdrop->GetHeight(), FXDIB_Rgb32);
- pBackdrop1->Clear((FX_DWORD) - 1);
- pBackdrop1->CompositeBitmap(0, 0, pBackdrop->GetWidth(), pBackdrop->GetHeight(), pBackdrop, 0, 0);
- delete pBackdrop;
- pBackdrop = pBackdrop1;
- m_pDevice->SetDIBits(pBackdrop, back_left, back_top);
- delete pBackdrop;
-}
-FX_COLORREF CPDF_TransferFunc::TranslateColor(FX_COLORREF rgb)
-{
- return FXSYS_RGB(m_Samples[FXSYS_GetRValue(rgb)], m_Samples[256 + FXSYS_GetGValue(rgb)],
- m_Samples[512 + FXSYS_GetBValue(rgb)]);
-}
-CFX_DIBSource* CPDF_TransferFunc::TranslateImage(const CFX_DIBSource* pSrc, FX_BOOL bAutoDropSrc)
-{
- CPDF_DIBTransferFunc* pDest = FX_NEW CPDF_DIBTransferFunc(this);
- pDest->LoadSrc(pSrc, bAutoDropSrc);
- return pDest;
-}
-FXDIB_Format CPDF_DIBTransferFunc::GetDestFormat()
-{
- if (m_pSrc->IsAlphaMask()) {
- return FXDIB_8bppMask;
- }
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
- return (m_pSrc->HasAlpha()) ? FXDIB_Argb : FXDIB_Rgb32;
-#else
- return (m_pSrc->HasAlpha()) ? FXDIB_Argb : FXDIB_Rgb;
-#endif
-}
-CPDF_DIBTransferFunc::CPDF_DIBTransferFunc(const CPDF_TransferFunc* pTransferFunc)
-{
- m_RampR = pTransferFunc->m_Samples;
- m_RampG = &pTransferFunc->m_Samples[256];
- m_RampB = &pTransferFunc->m_Samples[512];
-}
-void CPDF_DIBTransferFunc::TranslateScanline(FX_LPBYTE dest_buf, FX_LPCBYTE src_buf) const
-{
- int i;
- FX_BOOL bSkip = FALSE;
- switch (m_pSrc->GetFormat()) {
- case FXDIB_1bppRgb: {
- int r0 = m_RampR[0], g0 = m_RampG[0], b0 = m_RampB[0];
- int r1 = m_RampR[255], g1 = m_RampG[255], b1 = m_RampB[255];
- for (i = 0; i < m_Width; i ++) {
- if (src_buf[i / 8] & (1 << (7 - i % 8))) {
- *dest_buf++ = b1;
- *dest_buf++ = g1;
- *dest_buf++ = r1;
- } else {
- *dest_buf++ = b0;
- *dest_buf++ = g0;
- *dest_buf++ = r0;
- }
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
- dest_buf++;
-#endif
- }
- break;
- }
- case FXDIB_1bppMask: {
- int m0 = m_RampR[0], m1 = m_RampR[255];
- for (i = 0; i < m_Width; i ++) {
- if (src_buf[i / 8] & (1 << (7 - i % 8))) {
- *dest_buf++ = m1;
- } else {
- *dest_buf++ = m0;
- }
- }
- break;
- }
- case FXDIB_8bppRgb: {
- FX_ARGB* pPal = m_pSrc->GetPalette();
- for (i = 0; i < m_Width; i ++) {
- if (pPal) {
- FX_ARGB src_argb = pPal[*src_buf];
- *dest_buf++ = m_RampB[FXARGB_R(src_argb)];
- *dest_buf++ = m_RampG[FXARGB_G(src_argb)];
- *dest_buf++ = m_RampR[FXARGB_B(src_argb)];
- } else {
- FX_DWORD src_byte = *src_buf;
- *dest_buf++ = m_RampB[src_byte];
- *dest_buf++ = m_RampG[src_byte];
- *dest_buf++ = m_RampR[src_byte];
- }
- src_buf ++;
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
- dest_buf++;
-#endif
- }
- break;
- }
- case FXDIB_8bppMask:
- for (i = 0; i < m_Width; i ++) {
- *dest_buf++ = m_RampR[*(src_buf++)];
- }
- break;
- case FXDIB_Rgb:
- for (i = 0; i < m_Width; i ++) {
- *dest_buf++ = m_RampB[*(src_buf++)];
- *dest_buf++ = m_RampG[*(src_buf++)];
- *dest_buf++ = m_RampR[*(src_buf++)];
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
- dest_buf++;
-#endif
- }
- break;
- case FXDIB_Rgb32:
- bSkip = TRUE;
- case FXDIB_Argb:
- for (i = 0; i < m_Width; i ++) {
- *dest_buf++ = m_RampB[*(src_buf++)];
- *dest_buf++ = m_RampG[*(src_buf++)];
- *dest_buf++ = m_RampR[*(src_buf++)];
- if (!bSkip) {
- *dest_buf++ = *src_buf;
- }
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
- else {
- dest_buf++;
- }
-#endif
- src_buf ++;
- }
- break;
- default:
- break;
- }
-}
-void CPDF_DIBTransferFunc::TranslateDownSamples(FX_LPBYTE dest_buf, FX_LPCBYTE src_buf, int pixels, int Bpp) const
-{
- if (Bpp == 8) {
- for (int i = 0; i < pixels; i ++) {
- *dest_buf++ = m_RampR[*(src_buf++)];
- }
- } else if (Bpp == 24) {
- for (int i = 0; i < pixels; i ++) {
- *dest_buf++ = m_RampB[*(src_buf++)];
- *dest_buf++ = m_RampG[*(src_buf++)];
- *dest_buf++ = m_RampR[*(src_buf++)];
- }
- } else {
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
- if (!m_pSrc->HasAlpha()) {
- for (int i = 0; i < pixels; i ++) {
- *dest_buf++ = m_RampB[*(src_buf++)];
- *dest_buf++ = m_RampG[*(src_buf++)];
- *dest_buf++ = m_RampR[*(src_buf++)];
- dest_buf++;
- src_buf++;
- }
- } else
-#endif
- for (int i = 0; i < pixels; i ++) {
- *dest_buf++ = m_RampB[*(src_buf++)];
- *dest_buf++ = m_RampG[*(src_buf++)];
- *dest_buf++ = m_RampR[*(src_buf++)];
- *dest_buf++ = *(src_buf++);
- }
- }
-}
-static FX_BOOL _IsSupported(CPDF_ColorSpace* pCS)
-{
- if (pCS->GetFamily() == PDFCS_DEVICERGB || pCS->GetFamily() == PDFCS_DEVICEGRAY ||
- pCS->GetFamily() == PDFCS_DEVICECMYK || pCS->GetFamily() == PDFCS_CALGRAY ||
- pCS->GetFamily() == PDFCS_CALRGB) {
- return TRUE;
- }
- if (pCS->GetFamily() == PDFCS_INDEXED && _IsSupported(pCS->GetBaseCS())) {
- return TRUE;
- }
- return FALSE;
-}
-CPDF_ImageRenderer::CPDF_ImageRenderer()
-{
- m_pRenderStatus = NULL;
- m_pImageObject = NULL;
- m_Result = TRUE;
- m_Status = 0;
- m_pQuickStretcher = NULL;
- m_pTransformer = NULL;
- m_DeviceHandle = NULL;
- m_LoadHandle = NULL;
- m_pClone = NULL;
- m_bStdCS = FALSE;
- m_bPatternColor = FALSE;
- m_BlendType = FXDIB_BLEND_NORMAL;
- m_pPattern = NULL;
- m_pObj2Device = NULL;
-}
-CPDF_ImageRenderer::~CPDF_ImageRenderer()
-{
- if (m_pQuickStretcher) {
- delete m_pQuickStretcher;
- }
- if (m_pTransformer) {
- delete m_pTransformer;
- }
- if (m_DeviceHandle) {
- m_pRenderStatus->m_pDevice->CancelDIBits(m_DeviceHandle);
- }
- if (m_LoadHandle) {
- delete (CPDF_ProgressiveImageLoaderHandle*)m_LoadHandle;
- }
- if (m_pClone) {
- delete m_pClone;
- }
-}
-FX_BOOL CPDF_ImageRenderer::StartLoadDIBSource()
-{
- CFX_FloatRect image_rect_f = m_ImageMatrix.GetUnitRect();
- FX_RECT image_rect = image_rect_f.GetOutterRect();
- int dest_width = image_rect.Width();
- int dest_height = image_rect.Height();
- if (m_ImageMatrix.a < 0) {
- dest_width = -dest_width;
- }
- if (m_ImageMatrix.d > 0) {
- dest_height = -dest_height;
- }
- if (m_Loader.StartLoadImage(m_pImageObject, m_pRenderStatus->m_pContext->m_pPageCache, m_LoadHandle, m_bStdCS,
- m_pRenderStatus->m_GroupFamily, m_pRenderStatus->m_bLoadMask, m_pRenderStatus, dest_width, dest_height)) {
- if (m_LoadHandle != NULL) {
- m_Status = 4;
- return TRUE;
- }
- return FALSE;
- }
- return FALSE;
-}
-FX_BOOL CPDF_ImageRenderer::StartRenderDIBSource()
-{
- if (m_Loader.m_pBitmap == NULL) {
- return FALSE;
- }
- m_BitmapAlpha = 255;
- const CPDF_GeneralStateData* pGeneralState = m_pImageObject->m_GeneralState;
- if (pGeneralState) {
- m_BitmapAlpha = FXSYS_round(pGeneralState->m_FillAlpha * 255);
- }
- m_pDIBSource = m_Loader.m_pBitmap;
- if (m_pRenderStatus->m_Options.m_ColorMode == RENDER_COLOR_ALPHA && m_Loader.m_pMask == NULL) {
- return StartBitmapAlpha();
- }
-#ifndef _FPDFAPI_MINI_
- if (pGeneralState && pGeneralState->m_pTR) {
- if (!pGeneralState->m_pTransferFunc) {
- ((CPDF_GeneralStateData*)pGeneralState)->m_pTransferFunc = m_pRenderStatus->GetTransferFunc(pGeneralState->m_pTR);
- }
- if (pGeneralState->m_pTransferFunc && !pGeneralState->m_pTransferFunc->m_bIdentity) {
- m_pDIBSource = m_Loader.m_pBitmap = pGeneralState->m_pTransferFunc->TranslateImage(m_Loader.m_pBitmap, !m_Loader.m_bCached);
- if (m_Loader.m_bCached && m_Loader.m_pMask) {
- m_Loader.m_pMask = m_Loader.m_pMask->Clone();
- }
- m_Loader.m_bCached = FALSE;
- }
- }
-#endif
- m_FillArgb = 0;
- m_bPatternColor = FALSE;
- m_pPattern = NULL;
- if (m_pDIBSource->IsAlphaMask()) {
- CPDF_Color* pColor = m_pImageObject->m_ColorState.GetFillColor();
- if (pColor && pColor->IsPattern()) {
- m_pPattern = pColor->GetPattern();
- if (m_pPattern != NULL) {
- m_bPatternColor = TRUE;
- }
- }
- m_FillArgb = m_pRenderStatus->GetFillArgb(m_pImageObject);
- } else if (m_pRenderStatus->m_Options.m_ColorMode == RENDER_COLOR_GRAY) {
- m_pClone = m_pDIBSource->Clone();
- m_pClone->ConvertColorScale(m_pRenderStatus->m_Options.m_BackColor, m_pRenderStatus->m_Options.m_ForeColor);
- m_pDIBSource = m_pClone;
- }
- m_Flags = 0;
-#if !defined(_FPDFAPI_MINI_)
- if (m_pRenderStatus->m_Options.m_Flags & RENDER_FORCE_DOWNSAMPLE) {
- m_Flags |= RENDER_FORCE_DOWNSAMPLE;
- } else if (m_pRenderStatus->m_Options.m_Flags & RENDER_FORCE_HALFTONE) {
- m_Flags |= RENDER_FORCE_HALFTONE;
- }
-#else
- if (!(m_pRenderStatus->m_Options.m_Flags & RENDER_FORCE_HALFTONE)) {
- if (m_pRenderStatus->m_HalftoneLimit) {
- CFX_FloatRect image_rect_f = m_ImageMatrix.GetUnitRect();
- FX_RECT image_rect = image_rect_f.GetOutterRect();
- FX_RECT image_clip = image_rect;
- image_rect.Intersect(m_pRenderStatus->m_pDevice->GetClipBox());
- if (image_rect.Width() && image_rect.Height()) {
- if ((image_clip.Width() * m_pDIBSource->GetWidth() / image_rect.Width()) *
- (image_clip.Height() * m_pDIBSource->GetHeight() / image_rect.Height()) >
- m_pRenderStatus->m_HalftoneLimit) {
- m_Flags |= RENDER_FORCE_DOWNSAMPLE;
- }
- }
- } else {
- m_Flags |= RENDER_FORCE_DOWNSAMPLE;
- }
- }
-#endif
-#ifndef _FPDFAPI_MINI_
- if (m_pRenderStatus->m_pDevice->GetDeviceClass() != FXDC_DISPLAY) {
- CPDF_Object* pFilters = m_pImageObject->m_pImage->GetStream()->GetDict()->GetElementValue(FX_BSTRC("Filter"));
- if (pFilters) {
- if (pFilters->GetType() == PDFOBJ_NAME) {
- CFX_ByteStringC bsDecodeType = pFilters->GetConstString();
- if (bsDecodeType == FX_BSTRC("DCTDecode") || bsDecodeType == FX_BSTRC("JPXDecode")) {
- m_Flags |= FXRENDER_IMAGE_LOSSY;
- }
- } else if (pFilters->GetType() == PDFOBJ_ARRAY) {
- CPDF_Array* pArray = (CPDF_Array*)pFilters;
- for (FX_DWORD i = 0; i < pArray->GetCount(); i ++) {
- CFX_ByteStringC bsDecodeType = pArray->GetConstString(i);
- if (bsDecodeType == FX_BSTRC("DCTDecode") || bsDecodeType == FX_BSTRC("JPXDecode")) {
- m_Flags |= FXRENDER_IMAGE_LOSSY;
- break;
- }
- }
- }
- }
- }
- if (m_pRenderStatus->m_Options.m_Flags & RENDER_NOIMAGESMOOTH) {
- m_Flags |= FXDIB_NOSMOOTH;
- } else if (m_pImageObject->m_pImage->IsInterpol()) {
- m_Flags |= FXDIB_INTERPOL;
- }
-#endif
- if (m_Loader.m_pMask) {
- return DrawMaskedImage();
- }
- if (m_bPatternColor) {
- return DrawPatternImage(m_pObj2Device);
- }
-#if !defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_)
- if (m_BitmapAlpha == 255 && pGeneralState && pGeneralState->m_FillOP &&
- pGeneralState->m_OPMode == 0 && pGeneralState->m_BlendType == FXDIB_BLEND_NORMAL && pGeneralState->m_StrokeAlpha == 1 && pGeneralState->m_FillAlpha == 1) {
- CPDF_Document* pDocument = NULL;
- CPDF_Page* pPage = NULL;
- if (m_pRenderStatus->m_pContext->m_pPageCache) {
- pPage = m_pRenderStatus->m_pContext->m_pPageCache->GetPage();
- pDocument = pPage->m_pDocument;
- } else {
- pDocument = m_pImageObject->m_pImage->GetDocument();
- }
- CPDF_Dictionary* pPageResources = pPage ? pPage->m_pPageResources : NULL;
- CPDF_Object* pCSObj = m_pImageObject->m_pImage->GetStream()->GetDict()->GetElementValue(FX_BSTRC("ColorSpace"));
- CPDF_ColorSpace* pColorSpace = pDocument->LoadColorSpace(pCSObj, pPageResources);
- if (pColorSpace) {
- int format = pColorSpace->GetFamily();
- if (format == PDFCS_DEVICECMYK || format == PDFCS_SEPARATION || format == PDFCS_DEVICEN) {
- m_BlendType = FXDIB_BLEND_DARKEN;
- }
- pDocument->GetPageData()->ReleaseColorSpace(pCSObj);
- }
- }
-#endif
- return StartDIBSource();
-}
-FX_BOOL CPDF_ImageRenderer::Start(CPDF_RenderStatus* pStatus, const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device, FX_BOOL bStdCS, int blendType)
-{
- m_pRenderStatus = pStatus;
- m_bStdCS = bStdCS;
- m_pImageObject = (CPDF_ImageObject*)pObj;
- m_BlendType = blendType;
- m_pObj2Device = pObj2Device;
-#ifndef _FPDFAPI_MINI_
- CPDF_Dictionary* pOC = m_pImageObject->m_pImage->GetOC();
- if (pOC && m_pRenderStatus->m_Options.m_pOCContext && !m_pRenderStatus->m_Options.m_pOCContext->CheckOCGVisible(pOC)) {
- return FALSE;
- }
-#endif
- m_ImageMatrix = m_pImageObject->m_Matrix;
- m_ImageMatrix.Concat(*pObj2Device);
- if (StartLoadDIBSource()) {
- return TRUE;
- }
- return StartRenderDIBSource();
-}
-FX_BOOL CPDF_ImageRenderer::Start(CPDF_RenderStatus* pStatus, const CFX_DIBSource* pDIBSource, FX_ARGB bitmap_argb,
- int bitmap_alpha, const CFX_AffineMatrix* pImage2Device, FX_DWORD flags, FX_BOOL bStdCS, int blendType)
-{
- m_pRenderStatus = pStatus;
- m_pDIBSource = pDIBSource;
- m_FillArgb = bitmap_argb;
- m_BitmapAlpha = bitmap_alpha;
- m_ImageMatrix = *pImage2Device;
- m_Flags = flags;
- m_bStdCS = bStdCS;
- m_BlendType = blendType;
- return StartDIBSource();
-}
-FX_BOOL CPDF_ImageRenderer::DrawPatternImage(const CFX_Matrix* pObj2Device)
-{
- if (m_pRenderStatus->m_bPrint && !(m_pRenderStatus->m_pDevice->GetRenderCaps() & FXRC_BLEND_MODE)) {
- m_Result = FALSE;
- return FALSE;
- }
- FX_RECT rect = m_ImageMatrix.GetUnitRect().GetOutterRect();
- rect.Intersect(m_pRenderStatus->m_pDevice->GetClipBox());
- if (rect.IsEmpty()) {
- return FALSE;
- }
- CFX_AffineMatrix new_matrix = m_ImageMatrix;
- new_matrix.TranslateI(-rect.left, -rect.top);
- int width = rect.Width();
- int height = rect.Height();
- CFX_FxgeDevice bitmap_device1;
- if (!bitmap_device1.Create(rect.Width(), rect.Height(), FXDIB_Rgb32)) {
- return TRUE;
- }
- bitmap_device1.GetBitmap()->Clear(0xffffff);
- {
- CPDF_RenderStatus bitmap_render;
- bitmap_render.Initialize(m_pRenderStatus->m_Level + 1, m_pRenderStatus->m_pContext, &bitmap_device1, NULL, NULL,
- NULL, NULL, &m_pRenderStatus->m_Options, 0, m_pRenderStatus->m_bDropObjects, NULL, TRUE);
- CFX_Matrix patternDevice = *pObj2Device;
- patternDevice.Translate((FX_FLOAT) - rect.left, (FX_FLOAT) - rect.top);
- if(m_pPattern->m_PatternType == PATTERN_TILING) {
- bitmap_render.DrawTilingPattern((CPDF_TilingPattern*)m_pPattern, m_pImageObject, &patternDevice, FALSE);
- } else {
- bitmap_render.DrawShadingPattern((CPDF_ShadingPattern*)m_pPattern, m_pImageObject, &patternDevice, FALSE);
- }
- }
- {
- CFX_FxgeDevice bitmap_device2;
- if (!bitmap_device2.Create(rect.Width(), rect.Height(), FXDIB_8bppRgb)) {
- return TRUE;
- }
- bitmap_device2.GetBitmap()->Clear(0);
- CPDF_RenderStatus bitmap_render;
- bitmap_render.Initialize(m_pRenderStatus->m_Level + 1, m_pRenderStatus->m_pContext, &bitmap_device2, NULL, NULL,
- NULL, NULL, NULL, 0, m_pRenderStatus->m_bDropObjects, NULL, TRUE);
- CPDF_ImageRenderer image_render;
- if (image_render.Start(&bitmap_render, m_pDIBSource, 0xffffffff, 255, &new_matrix, m_Flags, TRUE)) {
- image_render.Continue(NULL);
- }
- if (m_Loader.m_MatteColor != 0xffffffff) {
- int matte_r = FXARGB_R(m_Loader.m_MatteColor);
- int matte_g = FXARGB_G(m_Loader.m_MatteColor);
- int matte_b = FXARGB_B(m_Loader.m_MatteColor);
- for (int row = 0; row < height; row ++) {
- FX_LPBYTE dest_scan = (FX_LPBYTE)bitmap_device1.GetBitmap()->GetScanline(row);
- FX_LPCBYTE mask_scan = bitmap_device2.GetBitmap()->GetScanline(row);
- for (int col = 0; col < width; col ++) {
- int alpha = *mask_scan ++;
- if (alpha) {
- int orig = (*dest_scan - matte_b) * 255 / alpha + matte_b;
- if (orig < 0) {
- orig = 0;
- } else if (orig > 255) {
- orig = 255;
- }
- *dest_scan++ = orig;
- orig = (*dest_scan - matte_g) * 255 / alpha + matte_g;
- if (orig < 0) {
- orig = 0;
- } else if (orig > 255) {
- orig = 255;
- }
- *dest_scan++ = orig;
- orig = (*dest_scan - matte_r) * 255 / alpha + matte_r;
- if (orig < 0) {
- orig = 0;
- } else if (orig > 255) {
- orig = 255;
- }
- *dest_scan++ = orig;
- dest_scan ++;
- } else {
- dest_scan += 4;
- }
- }
- }
- }
- bitmap_device2.GetBitmap()->ConvertFormat(FXDIB_8bppMask);
- bitmap_device1.GetBitmap()->MultiplyAlpha(bitmap_device2.GetBitmap());
- bitmap_device1.GetBitmap()->MultiplyAlpha(255);
- }
- m_pRenderStatus->m_pDevice->SetDIBits(bitmap_device1.GetBitmap(), rect.left, rect.top, m_BlendType);
- return FALSE;
-}
-FX_BOOL CPDF_ImageRenderer::DrawMaskedImage()
-{
- if (m_pRenderStatus->m_bPrint && !(m_pRenderStatus->m_pDevice->GetRenderCaps() & FXRC_BLEND_MODE)) {
- m_Result = FALSE;
- return FALSE;
- }
- FX_RECT rect = m_ImageMatrix.GetUnitRect().GetOutterRect();
- rect.Intersect(m_pRenderStatus->m_pDevice->GetClipBox());
- if (rect.IsEmpty()) {
- return FALSE;
- }
- CFX_AffineMatrix new_matrix = m_ImageMatrix;
- new_matrix.TranslateI(-rect.left, -rect.top);
- int width = rect.Width();
- int height = rect.Height();
- CFX_FxgeDevice bitmap_device1;
- if (!bitmap_device1.Create(width, height, FXDIB_Rgb32)) {
- return TRUE;
- }
- bitmap_device1.GetBitmap()->Clear(0xffffff);
- {
- CPDF_RenderStatus bitmap_render;
- bitmap_render.Initialize(m_pRenderStatus->m_Level + 1, m_pRenderStatus->m_pContext, &bitmap_device1, NULL, NULL,
- NULL, NULL, NULL, 0, m_pRenderStatus->m_bDropObjects, NULL, TRUE);
- CPDF_ImageRenderer image_render;
- if (image_render.Start(&bitmap_render, m_pDIBSource, 0, 255, &new_matrix, m_Flags, TRUE)) {
- image_render.Continue(NULL);
- }
- }
- {
- CFX_FxgeDevice bitmap_device2;
- if (!bitmap_device2.Create(width, height, FXDIB_8bppRgb)) {
- return TRUE;
- }
- bitmap_device2.GetBitmap()->Clear(0);
- CPDF_RenderStatus bitmap_render;
- bitmap_render.Initialize(m_pRenderStatus->m_Level + 1, m_pRenderStatus->m_pContext, &bitmap_device2, NULL, NULL,
- NULL, NULL, NULL, 0, m_pRenderStatus->m_bDropObjects, NULL, TRUE);
- CPDF_ImageRenderer image_render;
- if (image_render.Start(&bitmap_render, m_Loader.m_pMask, 0xffffffff, 255, &new_matrix, m_Flags, TRUE)) {
- image_render.Continue(NULL);
- }
- if (m_Loader.m_MatteColor != 0xffffffff) {
- int matte_r = FXARGB_R(m_Loader.m_MatteColor);
- int matte_g = FXARGB_G(m_Loader.m_MatteColor);
- int matte_b = FXARGB_B(m_Loader.m_MatteColor);
- for (int row = 0; row < height; row ++) {
- FX_LPBYTE dest_scan = (FX_LPBYTE)bitmap_device1.GetBitmap()->GetScanline(row);
- FX_LPCBYTE mask_scan = bitmap_device2.GetBitmap()->GetScanline(row);
- for (int col = 0; col < width; col ++) {
- int alpha = *mask_scan ++;
- if (alpha) {
- int orig = (*dest_scan - matte_b) * 255 / alpha + matte_b;
- if (orig < 0) {
- orig = 0;
- } else if (orig > 255) {
- orig = 255;
- }
- *dest_scan++ = orig;
- orig = (*dest_scan - matte_g) * 255 / alpha + matte_g;
- if (orig < 0) {
- orig = 0;
- } else if (orig > 255) {
- orig = 255;
- }
- *dest_scan++ = orig;
- orig = (*dest_scan - matte_r) * 255 / alpha + matte_r;
- if (orig < 0) {
- orig = 0;
- } else if (orig > 255) {
- orig = 255;
- }
- *dest_scan++ = orig;
- dest_scan ++;
- } else {
- dest_scan += 4;
- }
- }
- }
- }
- bitmap_device2.GetBitmap()->ConvertFormat(FXDIB_8bppMask);
- bitmap_device1.GetBitmap()->MultiplyAlpha(bitmap_device2.GetBitmap());
- if (m_BitmapAlpha < 255) {
- bitmap_device1.GetBitmap()->MultiplyAlpha(m_BitmapAlpha);
- }
- }
- m_pRenderStatus->m_pDevice->SetDIBits(bitmap_device1.GetBitmap(), rect.left, rect.top, m_BlendType);
- return FALSE;
-}
-FX_BOOL CPDF_ImageRenderer::StartDIBSource()
-{
-#if !defined(_FPDFAPI_MINI_)
- if (!(m_Flags & RENDER_FORCE_DOWNSAMPLE) && m_pDIBSource->GetBPP() > 1) {
- int image_size = m_pDIBSource->GetBPP() / 8 * m_pDIBSource->GetWidth() * m_pDIBSource->GetHeight();
- if (image_size > FPDF_HUGE_IMAGE_SIZE && !(m_Flags & RENDER_FORCE_HALFTONE)) {
- m_Flags |= RENDER_FORCE_DOWNSAMPLE;
- }
- }
-#endif
- if (m_pRenderStatus->m_pDevice->StartDIBits(m_pDIBSource, m_BitmapAlpha, m_FillArgb,
- &m_ImageMatrix, m_Flags, m_DeviceHandle, 0, NULL, m_BlendType)) {
- if (m_DeviceHandle != NULL) {
- m_Status = 3;
- return TRUE;
- }
- return FALSE;
- }
-#if !defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_)
- CFX_FloatRect image_rect_f = m_ImageMatrix.GetUnitRect();
- FX_RECT image_rect = image_rect_f.GetOutterRect();
- int dest_width = image_rect.Width();
- int dest_height = image_rect.Height();
- if ((FXSYS_fabs(m_ImageMatrix.b) >= 0.5f || m_ImageMatrix.a == 0) ||
- (FXSYS_fabs(m_ImageMatrix.c) >= 0.5f || m_ImageMatrix.d == 0) ) {
- if (m_pRenderStatus->m_bPrint && !(m_pRenderStatus->m_pDevice->GetRenderCaps() & FXRC_BLEND_MODE)) {
- m_Result = FALSE;
- return FALSE;
- }
- FX_RECT clip_box = m_pRenderStatus->m_pDevice->GetClipBox();
- clip_box.Intersect(image_rect);
- m_Status = 2;
- m_pTransformer = FX_NEW CFX_ImageTransformer;
- m_pTransformer->Start(m_pDIBSource, &m_ImageMatrix, m_Flags, &clip_box);
- return TRUE;
- }
- if (m_ImageMatrix.a < 0) {
- dest_width = -dest_width;
- }
- if (m_ImageMatrix.d > 0) {
- dest_height = -dest_height;
- }
- int dest_left, dest_top;
- dest_left = dest_width > 0 ? image_rect.left : image_rect.right;
- dest_top = dest_height > 0 ? image_rect.top : image_rect.bottom;
- if (m_pDIBSource->IsOpaqueImage() && m_BitmapAlpha == 255) {
- if (m_pRenderStatus->m_pDevice->StretchDIBits(m_pDIBSource, dest_left, dest_top,
- dest_width, dest_height, m_Flags, NULL, m_BlendType)) {
- return FALSE;
- }
- }
- if (m_pDIBSource->IsAlphaMask()) {
- if (m_BitmapAlpha != 255) {
- m_FillArgb = FXARGB_MUL_ALPHA(m_FillArgb, m_BitmapAlpha);
- }
- if (m_pRenderStatus->m_pDevice->StretchBitMask(m_pDIBSource, dest_left, dest_top, dest_width, dest_height, m_FillArgb, m_Flags)) {
- return FALSE;
- }
- }
- if (m_pRenderStatus->m_bPrint && !(m_pRenderStatus->m_pDevice->GetRenderCaps() & FXRC_BLEND_MODE)) {
- m_Result = FALSE;
- return TRUE;
- }
- FX_RECT clip_box = m_pRenderStatus->m_pDevice->GetClipBox();
- FX_RECT dest_rect = clip_box;
- dest_rect.Intersect(image_rect);
- FX_RECT dest_clip(dest_rect.left - image_rect.left, dest_rect.top - image_rect.top,
- dest_rect.right - image_rect.left, dest_rect.bottom - image_rect.top);
- CFX_DIBitmap* pStretched = m_pDIBSource->StretchTo(dest_width, dest_height, m_Flags, &dest_clip);
- if (pStretched) {
- m_pRenderStatus->CompositeDIBitmap(pStretched, dest_rect.left, dest_rect.top, m_FillArgb,
- m_BitmapAlpha, m_BlendType, FALSE);
- delete pStretched;
- pStretched = NULL;
- }
-#endif
- return FALSE;
-}
-FX_BOOL CPDF_ImageRenderer::StartBitmapAlpha()
-{
-#ifndef _FPDFAPI_MINI_
- if (m_pDIBSource->IsOpaqueImage()) {
- CFX_PathData path;
- path.AppendRect(0, 0, 1, 1);
- path.Transform(&m_ImageMatrix);
- FX_DWORD fill_color = ArgbEncode(0xff, m_BitmapAlpha, m_BitmapAlpha, m_BitmapAlpha);
- m_pRenderStatus->m_pDevice->DrawPath(&path, NULL, NULL, fill_color, 0, FXFILL_WINDING);
- } else {
- const CFX_DIBSource* pAlphaMask = m_pDIBSource->IsAlphaMask() ? m_pDIBSource : m_pDIBSource->GetAlphaMask();
- if (FXSYS_fabs(m_ImageMatrix.b) >= 0.5f || FXSYS_fabs(m_ImageMatrix.c) >= 0.5f) {
- int left, top;
- CFX_DIBitmap* pTransformed = pAlphaMask->TransformTo(&m_ImageMatrix, left, top);
- if (pTransformed == NULL) {
- return TRUE;
- }
- m_pRenderStatus->m_pDevice->SetBitMask(pTransformed, left, top, ArgbEncode(0xff, m_BitmapAlpha, m_BitmapAlpha, m_BitmapAlpha));
- delete pTransformed;
- } else {
- CFX_FloatRect image_rect_f = m_ImageMatrix.GetUnitRect();
- FX_RECT image_rect = image_rect_f.GetOutterRect();
- int dest_width = m_ImageMatrix.a > 0 ? image_rect.Width() : -image_rect.Width();
- int dest_height = m_ImageMatrix.d > 0 ? -image_rect.Height() : image_rect.Height();
- int left = dest_width > 0 ? image_rect.left : image_rect.right;
- int top = dest_height > 0 ? image_rect.top : image_rect.bottom;
- m_pRenderStatus->m_pDevice->StretchBitMask(pAlphaMask, left, top, dest_width, dest_height,
- ArgbEncode(0xff, m_BitmapAlpha, m_BitmapAlpha, m_BitmapAlpha));
- }
- if (m_pDIBSource != pAlphaMask) {
- delete pAlphaMask;
- }
- }
-#endif
- return FALSE;
-}
-FX_BOOL CPDF_ImageRenderer::Continue(IFX_Pause* pPause)
-{
- if (m_Status == 1) {
-#ifndef _FPDFAPI_MINI_
- if (m_pQuickStretcher->Continue(pPause)) {
- return TRUE;
- }
- if (m_pQuickStretcher->m_pBitmap->IsAlphaMask())
- m_pRenderStatus->m_pDevice->SetBitMask(m_pQuickStretcher->m_pBitmap, m_pQuickStretcher->m_ResultLeft,
- m_pQuickStretcher->m_ResultTop, m_FillArgb);
- else
- m_pRenderStatus->m_pDevice->SetDIBits(m_pQuickStretcher->m_pBitmap, m_pQuickStretcher->m_ResultLeft,
- m_pQuickStretcher->m_ResultTop, m_BlendType);
- return FALSE;
-#endif
- } else if (m_Status == 2) {
-#if !defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_)
- if (m_pTransformer->Continue(pPause)) {
- return TRUE;
- }
- CFX_DIBitmap* pBitmap = m_pTransformer->m_Storer.Detach();
- if (pBitmap == NULL) {
- return FALSE;
- }
- if (pBitmap->IsAlphaMask()) {
- if (m_BitmapAlpha != 255) {
- m_FillArgb = FXARGB_MUL_ALPHA(m_FillArgb, m_BitmapAlpha);
- }
- m_Result = m_pRenderStatus->m_pDevice->SetBitMask(pBitmap,
- m_pTransformer->m_ResultLeft, m_pTransformer->m_ResultTop, m_FillArgb);
- } else {
- if (m_BitmapAlpha != 255) {
- pBitmap->MultiplyAlpha(m_BitmapAlpha);
- }
- m_Result = m_pRenderStatus->m_pDevice->SetDIBits(pBitmap,
- m_pTransformer->m_ResultLeft, m_pTransformer->m_ResultTop, m_BlendType);
- }
- delete pBitmap;
- return FALSE;
-#endif
- } else if (m_Status == 3) {
- return m_pRenderStatus->m_pDevice->ContinueDIBits(m_DeviceHandle, pPause);
- } else if (m_Status == 4) {
- if (m_Loader.Continue(m_LoadHandle, pPause)) {
- return TRUE;
- }
- if (StartRenderDIBSource()) {
- return Continue(pPause);
- }
- return FALSE;
- }
- return FALSE;
-}
-CPDF_QuickStretcher::CPDF_QuickStretcher()
-{
- m_pBitmap = NULL;
- m_pDecoder = NULL;
- m_pCS = NULL;
-}
-CPDF_QuickStretcher::~CPDF_QuickStretcher()
-{
- if (m_pBitmap) {
- delete m_pBitmap;
- }
- if (m_pCS) {
- m_pCS->ReleaseCS();
- }
- if (m_pDecoder) {
- delete m_pDecoder;
- }
-}
-ICodec_ScanlineDecoder* FPDFAPI_CreateFlateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,
- int nComps, int bpc, const CPDF_Dictionary* pParams);
-FX_BOOL CPDF_QuickStretcher::Start(CPDF_ImageObject* pImageObj, CFX_AffineMatrix* pImage2Device, const FX_RECT* pClipBox)
-{
- if (FXSYS_fabs(pImage2Device->a) < FXSYS_fabs(pImage2Device->b) * 10 && FXSYS_fabs(pImage2Device->d) < FXSYS_fabs(pImage2Device->c) * 10) {
- return FALSE;
- }
- CFX_FloatRect image_rect_f = pImage2Device->GetUnitRect();
- FX_RECT image_rect = image_rect_f.GetOutterRect();
- m_DestWidth = image_rect.Width();
- m_DestHeight = image_rect.Height();
- m_bFlipX = pImage2Device->a < 0;
- m_bFlipY = pImage2Device->d > 0;
- FX_RECT result_rect = *pClipBox;
- result_rect.Intersect(image_rect);
- if (result_rect.IsEmpty()) {
- return FALSE;
- }
- m_ResultWidth = result_rect.Width();
- m_ResultHeight = result_rect.Height();
- m_ResultLeft = result_rect.left;
- m_ResultTop = result_rect.top;
- m_ClipLeft = result_rect.left - image_rect.left;
- m_ClipTop = result_rect.top - image_rect.top;
- CPDF_Dictionary* pDict = pImageObj->m_pImage->GetDict();
- if (pDict->GetInteger(FX_BSTRC("BitsPerComponent")) != 8) {
- return FALSE;
- }
- if (pDict->KeyExist(FX_BSTRC("SMask")) || pDict->KeyExist(FX_BSTRC("Mask"))) {
- return FALSE;
- }
- m_SrcWidth = pDict->GetInteger(FX_BSTRC("Width"));
- m_SrcHeight = pDict->GetInteger(FX_BSTRC("Height"));
- m_pCS = NULL;
- m_Bpp = 3;
- CPDF_Object* pCSObj = pDict->GetElementValue(FX_BSTRC("ColorSpace"));
- if (pCSObj == NULL) {
- return FALSE;
- }
- m_pCS = CPDF_ColorSpace::Load(pImageObj->m_pImage->GetDocument(), pCSObj);
- if (m_pCS == NULL) {
- return FALSE;
- }
- if (!_IsSupported(m_pCS)) {
- return FALSE;
- }
- m_Bpp = m_pCS->CountComponents();
- if (m_pCS->sRGB()) {
- m_pCS->ReleaseCS();
- m_pCS = NULL;
- }
- CPDF_Stream* pStream = pImageObj->m_pImage->GetStream();
- m_StreamAcc.LoadAllData(pStream, FALSE, m_SrcWidth * m_SrcHeight * m_Bpp, TRUE);
- m_pDecoder = NULL;
- if (!m_StreamAcc.GetImageDecoder().IsEmpty()) {
- if (m_StreamAcc.GetImageDecoder() == FX_BSTRC("DCTDecode")) {
- const CPDF_Dictionary* pParam = m_StreamAcc.GetImageParam();
- m_pDecoder = CPDF_ModuleMgr::Get()->GetJpegModule()->CreateDecoder(
- m_StreamAcc.GetData(), m_StreamAcc.GetSize(), m_SrcWidth, m_SrcHeight, m_Bpp,
- pParam ? pParam->GetInteger(FX_BSTRC("ColorTransform"), 1) : 1);
- } else if (m_StreamAcc.GetImageDecoder() == FX_BSTRC("FlateDecode")) {
- m_pDecoder = FPDFAPI_CreateFlateDecoder(
- m_StreamAcc.GetData(), m_StreamAcc.GetSize(), m_SrcWidth, m_SrcHeight, m_Bpp, 8,
- m_StreamAcc.GetImageParam());
- } else {
- return FALSE;
- }
- m_pDecoder->DownScale(m_DestWidth, m_DestHeight);
- }
- m_pBitmap = FX_NEW CFX_DIBitmap;
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
- m_pBitmap->Create(m_ResultWidth, m_ResultHeight, FXDIB_Rgb32);
-#else
- m_pBitmap->Create(m_ResultWidth, m_ResultHeight, FXDIB_Rgb);
-#endif
- m_LineIndex = 0;
- return TRUE;
-}
-FX_BOOL CPDF_QuickStretcher::Continue(IFX_Pause* pPause)
-{
- FX_LPBYTE result_buf = m_pBitmap->GetBuffer();
- int src_width = m_pDecoder ? m_pDecoder->GetWidth() : m_SrcWidth;
- int src_height = m_pDecoder ? m_pDecoder->GetHeight() : m_SrcHeight;
- int src_pitch = src_width * m_Bpp;
- while (m_LineIndex < m_ResultHeight) {
- int dest_y, src_y;
- if (m_bFlipY) {
- dest_y = m_ResultHeight - m_LineIndex - 1;
- src_y = (m_DestHeight - (dest_y + m_ClipTop) - 1) * src_height / m_DestHeight;
- } else {
- dest_y = m_LineIndex;
- src_y = (dest_y + m_ClipTop) * src_height / m_DestHeight;
- }
- FX_LPCBYTE src_scan;
- if (m_pDecoder) {
- src_scan = m_pDecoder->GetScanline(src_y);
- if (src_scan == NULL) {
- break;
- }
- } else {
- src_scan = m_StreamAcc.GetData();
- if (src_scan == NULL) {
- break;
- }
- src_scan += src_y * src_pitch;
- }
- FX_LPBYTE result_scan = result_buf + dest_y * m_pBitmap->GetPitch();
- for (int x = 0; x < m_ResultWidth; x ++) {
- int dest_x = m_ClipLeft + x;
- int src_x = (m_bFlipX ? (m_DestWidth - dest_x - 1) : dest_x) * src_width / m_DestWidth;
- FX_LPCBYTE src_pixel = src_scan + src_x * m_Bpp;
- if (m_pCS == NULL) {
- *result_scan = src_pixel[2];
- result_scan ++;
- *result_scan = src_pixel[1];
- result_scan ++;
- *result_scan = src_pixel[0];
- result_scan ++;
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
- result_scan ++;
-#endif
- } else {
- m_pCS->TranslateImageLine(result_scan, src_pixel, 1, 0, 0);
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
- result_scan += 4;
-#else
- result_scan += 3;
-#endif
- }
- }
- m_LineIndex ++;
- if (pPause && pPause->NeedToPauseNow()) {
- return TRUE;
- }
- }
- return FALSE;
-}
-CFX_DIBitmap* CPDF_RenderStatus::LoadSMask(CPDF_Dictionary* pSMaskDict,
- FX_RECT* pClipRect, const CFX_AffineMatrix* pMatrix)
-{
- if (pSMaskDict == NULL) {
- return NULL;
- }
- CFX_DIBitmap* pMask = NULL;
- int width = pClipRect->right - pClipRect->left;
- int height = pClipRect->bottom - pClipRect->top;
- FX_BOOL bLuminosity = FALSE;
- bLuminosity = pSMaskDict->GetConstString(FX_BSTRC("S")) != FX_BSTRC("Alpha");
- CPDF_Stream* pGroup = pSMaskDict->GetStream(FX_BSTRC("G"));
- if (pGroup == NULL) {
- return NULL;
- }
- CPDF_Function* pFunc = NULL;
- CPDF_Object* pFuncObj = pSMaskDict->GetElementValue(FX_BSTRC("TR"));
- if (pFuncObj && (pFuncObj->GetType() == PDFOBJ_DICTIONARY || pFuncObj->GetType() == PDFOBJ_STREAM)) {
- pFunc = CPDF_Function::Load(pFuncObj);
- }
- CFX_AffineMatrix matrix = *pMatrix;
- matrix.TranslateI(-pClipRect->left, -pClipRect->top);
- CPDF_Form form(m_pContext->m_pDocument, m_pContext->m_pPageResources, pGroup);
- form.ParseContent(NULL, NULL, NULL, NULL);
- CFX_FxgeDevice bitmap_device;
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
- if (!bitmap_device.Create(width, height, bLuminosity ? FXDIB_Rgb32 : FXDIB_8bppMask)) {
- return NULL;
- }
-#else
- if (!bitmap_device.Create(width, height, bLuminosity ? FXDIB_Rgb : FXDIB_8bppMask)) {
- return NULL;
- }
-#endif
- CFX_DIBitmap& bitmap = *bitmap_device.GetBitmap();
- CPDF_Object* pCSObj = NULL;
- CPDF_ColorSpace* pCS = NULL;
- if (bLuminosity) {
- CPDF_Array* pBC = pSMaskDict->GetArray(FX_BSTRC("BC"));
- FX_ARGB back_color = 0xff000000;
- if (pBC) {
- pCSObj = pGroup->GetDict()->GetDict(FX_BSTRC("Group"))->GetElementValue(FX_BSTRC("CS"));
- pCS = m_pContext->m_pDocument->LoadColorSpace(pCSObj);
- if (pCS) {
- FX_FLOAT R, G, B;
- FX_DWORD num_floats = 8;
- if (pCS->CountComponents() > (FX_INT32)num_floats) {
- num_floats = (FX_DWORD)pCS->CountComponents();
- }
- CFX_FixedBufGrow<FX_FLOAT, 8> float_array(num_floats);
- FX_FLOAT* pFloats = float_array;
- FXSYS_memset32(pFloats, 0, num_floats * sizeof(FX_FLOAT));
- int count = pBC->GetCount() > 8 ? 8 : pBC->GetCount();
- for (int i = 0; i < count; i ++) {
- pFloats[i] = pBC->GetNumber(i);
- }
- pCS->GetRGB(pFloats, R, G, B);
- back_color = 0xff000000 | ((FX_INT32)(R * 255) << 16) | ((FX_INT32)(G * 255) << 8) | (FX_INT32)(B * 255);
- m_pContext->m_pDocument->GetPageData()->ReleaseColorSpace(pCSObj);
- }
- }
- bitmap.Clear(back_color);
- } else {
- bitmap.Clear(0);
- }
- CPDF_Dictionary* pFormResource = NULL;
- if (form.m_pFormDict) {
- pFormResource = form.m_pFormDict->GetDict(FX_BSTRC("Resources"));
- }
- CPDF_RenderOptions options;
- options.m_ColorMode = bLuminosity ? RENDER_COLOR_NORMAL : RENDER_COLOR_ALPHA;
- CPDF_RenderStatus status;
- status.Initialize(m_Level + 1, m_pContext, &bitmap_device, NULL, NULL, NULL, NULL,
- &options, 0, m_bDropObjects, pFormResource, TRUE, NULL, 0, pCS ? pCS->GetFamily() : 0, bLuminosity);
- status.RenderObjectList(&form, &matrix);
- pMask = FX_NEW CFX_DIBitmap;
- if (!pMask->Create(width, height, FXDIB_8bppMask)) {
- delete pMask;
- return NULL;
- }
- FX_LPBYTE dest_buf = pMask->GetBuffer();
- int dest_pitch = pMask->GetPitch();
- FX_LPBYTE src_buf = bitmap.GetBuffer();
- int src_pitch = bitmap.GetPitch();
- FX_LPBYTE pTransfer = FX_Alloc(FX_BYTE, 256);
- if (pFunc) {
- CFX_FixedBufGrow<FX_FLOAT, 16> results(pFunc->CountOutputs());
- for (int i = 0; i < 256; i ++) {
- FX_FLOAT input = (FX_FLOAT)i / 255.0f;
- int nresult;
- pFunc->Call(&input, 1, results, nresult);
- pTransfer[i] = FXSYS_round(results[0] * 255);
- }
- } else {
- for (int i = 0; i < 256; i ++) {
- pTransfer[i] = i;
- }
- }
- if (bLuminosity) {
- int Bpp = bitmap.GetBPP() / 8;
- for (int row = 0; row < height; row ++) {
- FX_LPBYTE dest_pos = dest_buf + row * dest_pitch;
- FX_LPBYTE src_pos = src_buf + row * src_pitch;
- for (int col = 0; col < width; col ++) {
- *dest_pos ++ = pTransfer[FXRGB2GRAY(src_pos[2], src_pos[1], *src_pos)];
- src_pos += Bpp;
- }
- }
- } else if (pFunc) {
- int size = dest_pitch * height;
- for (int i = 0; i < size; i ++) {
- dest_buf[i] = pTransfer[src_buf[i]];
- }
- } else {
- FXSYS_memcpy32(dest_buf, src_buf, dest_pitch * height);
- }
- if (pFunc) {
- delete pFunc;
- }
- FX_Free(pTransfer);
- return pMask;
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxge/fx_ge.h"
+#include "../../../include/fxcodec/fx_codec.h"
+#include "../../../include/fpdfapi/fpdf_module.h"
+#include "../../../include/fpdfapi/fpdf_render.h"
+#include "../../../include/fpdfapi/fpdf_pageobj.h"
+#include "../fpdf_page/pageint.h"
+#include "render_int.h"
+FX_BOOL CPDF_RenderStatus::ProcessImage(CPDF_ImageObject* pImageObj, const CFX_AffineMatrix* pObj2Device)
+{
+ CPDF_ImageRenderer render;
+ if (render.Start(this, pImageObj, pObj2Device, m_bStdCS, m_curBlend)) {
+ render.Continue(NULL);
+ }
+#ifdef _FPDFAPI_MINI_
+ if (m_DitherBits) {
+ DitherObjectArea(pImageObj, pObj2Device);
+ }
+#endif
+ return render.m_Result;
+}
+#if defined(_FPDFAPI_MINI_)
+FX_BOOL CPDF_RenderStatus::ProcessInlines(CPDF_InlineImages* pInlines, const CFX_AffineMatrix* pObj2Device)
+{
+ int bitmap_alpha = 255;
+ if (!pInlines->m_GeneralState.IsNull()) {
+ bitmap_alpha = FXSYS_round(pInlines->m_GeneralState.GetObject()->m_FillAlpha * 255);
+ }
+ if (pInlines->m_pStream) {
+ CPDF_DIBSource dibsrc;
+ if (!dibsrc.Load(m_pContext->m_pDocument, pInlines->m_pStream, NULL, NULL, NULL, NULL)) {
+ return TRUE;
+ }
+ pInlines->m_pBitmap = dibsrc.Clone();
+ pInlines->m_pStream->Release();
+ pInlines->m_pStream = NULL;
+ }
+ if (pInlines->m_pBitmap == NULL) {
+ return TRUE;
+ }
+ FX_ARGB fill_argb = 0;
+ if (pInlines->m_pBitmap->IsAlphaMask()) {
+ fill_argb = GetFillArgb(pInlines);
+ }
+ int flags = 0;
+ if (m_Options.m_Flags & RENDER_FORCE_DOWNSAMPLE) {
+ flags |= RENDER_FORCE_DOWNSAMPLE;
+ } else if (m_Options.m_Flags & RENDER_FORCE_HALFTONE) {
+ flags = 0;
+ }
+ for (int i = 0; i < pInlines->m_Matrices.GetSize(); i ++) {
+ CFX_AffineMatrix image_matrix = pInlines->m_Matrices.GetAt(i);
+ image_matrix.Concat(*pObj2Device);
+ CPDF_ImageRenderer renderer;
+ if (renderer.Start(this, pInlines->m_pBitmap, fill_argb, bitmap_alpha, &image_matrix, flags, FALSE, m_curBlend)) {
+ renderer.Continue(NULL);
+ }
+ }
+ return TRUE;
+}
+#endif
+void CPDF_RenderStatus::CompositeDIBitmap(CFX_DIBitmap* pDIBitmap, int left, int top, FX_ARGB mask_argb,
+ int bitmap_alpha, int blend_mode, int Transparency)
+{
+ if (pDIBitmap == NULL) {
+ return;
+ }
+ FX_BOOL bIsolated = Transparency & PDFTRANS_ISOLATED;
+ FX_BOOL bGroup = Transparency & PDFTRANS_GROUP;
+ if (blend_mode == FXDIB_BLEND_NORMAL) {
+ if (!pDIBitmap->IsAlphaMask()) {
+ if (bitmap_alpha < 255) {
+ pDIBitmap->MultiplyAlpha(bitmap_alpha);
+ }
+ if (m_pDevice->SetDIBits(pDIBitmap, left, top)) {
+ return;
+ }
+ } else {
+ FX_DWORD fill_argb = m_Options.TranslateColor(mask_argb);
+ if (bitmap_alpha < 255) {
+ ((FX_BYTE*)&fill_argb)[3] = ((FX_BYTE*)&fill_argb)[3] * bitmap_alpha / 255;
+ }
+ if (m_pDevice->SetBitMask(pDIBitmap, left, top, fill_argb)) {
+ return;
+ }
+ }
+ }
+ FX_BOOL bBackAlphaRequired = blend_mode && bIsolated && !m_bDropObjects;
+ FX_BOOL bGetBackGround = ((m_pDevice->GetRenderCaps() & FXRC_ALPHA_OUTPUT)) ||
+ (!(m_pDevice->GetRenderCaps() & FXRC_ALPHA_OUTPUT) && (m_pDevice->GetRenderCaps()
+ & FXRC_GET_BITS) && !bBackAlphaRequired);
+ if (bGetBackGround) {
+ if (bIsolated || !bGroup) {
+ if (pDIBitmap->IsAlphaMask()) {
+ return;
+ }
+ m_pDevice->SetDIBits(pDIBitmap, left, top, blend_mode);
+ } else {
+ FX_RECT rect(left, top, left + pDIBitmap->GetWidth(), top + pDIBitmap->GetHeight());
+ rect.Intersect(m_pDevice->GetClipBox());
+ CFX_DIBitmap* pClone = NULL;
+ FX_BOOL bClone = FALSE;
+ if (m_pDevice->GetBackDrop() && m_pDevice->GetBitmap()) {
+ bClone = TRUE;
+ pClone = m_pDevice->GetBackDrop()->Clone(&rect);
+ CFX_DIBitmap *pForeBitmap = m_pDevice->GetBitmap();
+ pClone->CompositeBitmap(0, 0, pClone->GetWidth(), pClone->GetHeight(), pForeBitmap, rect.left, rect.top);
+ left = left >= 0 ? 0 : left;
+ top = top >= 0 ? 0 : top;
+ if (!pDIBitmap->IsAlphaMask())
+ pClone->CompositeBitmap(0, 0, pClone->GetWidth(), pClone->GetHeight(), pDIBitmap,
+ left, top, blend_mode);
+ else
+ pClone->CompositeMask(0, 0, pClone->GetWidth(), pClone->GetHeight(), pDIBitmap,
+ mask_argb, left, top, blend_mode);
+ } else {
+ pClone = pDIBitmap;
+ }
+ if (m_pDevice->GetBackDrop()) {
+ m_pDevice->SetDIBits(pClone, rect.left, rect.top);
+ } else {
+ if (pDIBitmap->IsAlphaMask()) {
+ return;
+ }
+ m_pDevice->SetDIBits(pDIBitmap, rect.left, rect.top, blend_mode);
+ }
+ if (bClone) {
+ delete pClone;
+ }
+ }
+ return;
+ }
+ int back_left, back_top;
+ FX_RECT rect(left, top, left + pDIBitmap->GetWidth(), top + pDIBitmap->GetHeight());
+ CFX_DIBitmap* pBackdrop = GetBackdrop(m_pCurObj, rect, back_left, back_top, blend_mode > FXDIB_BLEND_NORMAL && bIsolated);
+ if (!pBackdrop) {
+ return;
+ }
+ if (!pDIBitmap->IsAlphaMask())
+ pBackdrop->CompositeBitmap(left - back_left, top - back_top, pDIBitmap->GetWidth(), pDIBitmap->GetHeight(), pDIBitmap,
+ 0, 0, blend_mode);
+ else
+ pBackdrop->CompositeMask(left - back_left, top - back_top, pDIBitmap->GetWidth(), pDIBitmap->GetHeight(), pDIBitmap,
+ mask_argb, 0, 0, blend_mode);
+ CFX_DIBitmap* pBackdrop1 = FX_NEW CFX_DIBitmap;
+ pBackdrop1->Create(pBackdrop->GetWidth(), pBackdrop->GetHeight(), FXDIB_Rgb32);
+ pBackdrop1->Clear((FX_DWORD) - 1);
+ pBackdrop1->CompositeBitmap(0, 0, pBackdrop->GetWidth(), pBackdrop->GetHeight(), pBackdrop, 0, 0);
+ delete pBackdrop;
+ pBackdrop = pBackdrop1;
+ m_pDevice->SetDIBits(pBackdrop, back_left, back_top);
+ delete pBackdrop;
+}
+FX_COLORREF CPDF_TransferFunc::TranslateColor(FX_COLORREF rgb)
+{
+ return FXSYS_RGB(m_Samples[FXSYS_GetRValue(rgb)], m_Samples[256 + FXSYS_GetGValue(rgb)],
+ m_Samples[512 + FXSYS_GetBValue(rgb)]);
+}
+CFX_DIBSource* CPDF_TransferFunc::TranslateImage(const CFX_DIBSource* pSrc, FX_BOOL bAutoDropSrc)
+{
+ CPDF_DIBTransferFunc* pDest = FX_NEW CPDF_DIBTransferFunc(this);
+ pDest->LoadSrc(pSrc, bAutoDropSrc);
+ return pDest;
+}
+FXDIB_Format CPDF_DIBTransferFunc::GetDestFormat()
+{
+ if (m_pSrc->IsAlphaMask()) {
+ return FXDIB_8bppMask;
+ }
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+ return (m_pSrc->HasAlpha()) ? FXDIB_Argb : FXDIB_Rgb32;
+#else
+ return (m_pSrc->HasAlpha()) ? FXDIB_Argb : FXDIB_Rgb;
+#endif
+}
+CPDF_DIBTransferFunc::CPDF_DIBTransferFunc(const CPDF_TransferFunc* pTransferFunc)
+{
+ m_RampR = pTransferFunc->m_Samples;
+ m_RampG = &pTransferFunc->m_Samples[256];
+ m_RampB = &pTransferFunc->m_Samples[512];
+}
+void CPDF_DIBTransferFunc::TranslateScanline(FX_LPBYTE dest_buf, FX_LPCBYTE src_buf) const
+{
+ int i;
+ FX_BOOL bSkip = FALSE;
+ switch (m_pSrc->GetFormat()) {
+ case FXDIB_1bppRgb: {
+ int r0 = m_RampR[0], g0 = m_RampG[0], b0 = m_RampB[0];
+ int r1 = m_RampR[255], g1 = m_RampG[255], b1 = m_RampB[255];
+ for (i = 0; i < m_Width; i ++) {
+ if (src_buf[i / 8] & (1 << (7 - i % 8))) {
+ *dest_buf++ = b1;
+ *dest_buf++ = g1;
+ *dest_buf++ = r1;
+ } else {
+ *dest_buf++ = b0;
+ *dest_buf++ = g0;
+ *dest_buf++ = r0;
+ }
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+ dest_buf++;
+#endif
+ }
+ break;
+ }
+ case FXDIB_1bppMask: {
+ int m0 = m_RampR[0], m1 = m_RampR[255];
+ for (i = 0; i < m_Width; i ++) {
+ if (src_buf[i / 8] & (1 << (7 - i % 8))) {
+ *dest_buf++ = m1;
+ } else {
+ *dest_buf++ = m0;
+ }
+ }
+ break;
+ }
+ case FXDIB_8bppRgb: {
+ FX_ARGB* pPal = m_pSrc->GetPalette();
+ for (i = 0; i < m_Width; i ++) {
+ if (pPal) {
+ FX_ARGB src_argb = pPal[*src_buf];
+ *dest_buf++ = m_RampB[FXARGB_R(src_argb)];
+ *dest_buf++ = m_RampG[FXARGB_G(src_argb)];
+ *dest_buf++ = m_RampR[FXARGB_B(src_argb)];
+ } else {
+ FX_DWORD src_byte = *src_buf;
+ *dest_buf++ = m_RampB[src_byte];
+ *dest_buf++ = m_RampG[src_byte];
+ *dest_buf++ = m_RampR[src_byte];
+ }
+ src_buf ++;
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+ dest_buf++;
+#endif
+ }
+ break;
+ }
+ case FXDIB_8bppMask:
+ for (i = 0; i < m_Width; i ++) {
+ *dest_buf++ = m_RampR[*(src_buf++)];
+ }
+ break;
+ case FXDIB_Rgb:
+ for (i = 0; i < m_Width; i ++) {
+ *dest_buf++ = m_RampB[*(src_buf++)];
+ *dest_buf++ = m_RampG[*(src_buf++)];
+ *dest_buf++ = m_RampR[*(src_buf++)];
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+ dest_buf++;
+#endif
+ }
+ break;
+ case FXDIB_Rgb32:
+ bSkip = TRUE;
+ case FXDIB_Argb:
+ for (i = 0; i < m_Width; i ++) {
+ *dest_buf++ = m_RampB[*(src_buf++)];
+ *dest_buf++ = m_RampG[*(src_buf++)];
+ *dest_buf++ = m_RampR[*(src_buf++)];
+ if (!bSkip) {
+ *dest_buf++ = *src_buf;
+ }
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+ else {
+ dest_buf++;
+ }
+#endif
+ src_buf ++;
+ }
+ break;
+ default:
+ break;
+ }
+}
+void CPDF_DIBTransferFunc::TranslateDownSamples(FX_LPBYTE dest_buf, FX_LPCBYTE src_buf, int pixels, int Bpp) const
+{
+ if (Bpp == 8) {
+ for (int i = 0; i < pixels; i ++) {
+ *dest_buf++ = m_RampR[*(src_buf++)];
+ }
+ } else if (Bpp == 24) {
+ for (int i = 0; i < pixels; i ++) {
+ *dest_buf++ = m_RampB[*(src_buf++)];
+ *dest_buf++ = m_RampG[*(src_buf++)];
+ *dest_buf++ = m_RampR[*(src_buf++)];
+ }
+ } else {
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+ if (!m_pSrc->HasAlpha()) {
+ for (int i = 0; i < pixels; i ++) {
+ *dest_buf++ = m_RampB[*(src_buf++)];
+ *dest_buf++ = m_RampG[*(src_buf++)];
+ *dest_buf++ = m_RampR[*(src_buf++)];
+ dest_buf++;
+ src_buf++;
+ }
+ } else
+#endif
+ for (int i = 0; i < pixels; i ++) {
+ *dest_buf++ = m_RampB[*(src_buf++)];
+ *dest_buf++ = m_RampG[*(src_buf++)];
+ *dest_buf++ = m_RampR[*(src_buf++)];
+ *dest_buf++ = *(src_buf++);
+ }
+ }
+}
+static FX_BOOL _IsSupported(CPDF_ColorSpace* pCS)
+{
+ if (pCS->GetFamily() == PDFCS_DEVICERGB || pCS->GetFamily() == PDFCS_DEVICEGRAY ||
+ pCS->GetFamily() == PDFCS_DEVICECMYK || pCS->GetFamily() == PDFCS_CALGRAY ||
+ pCS->GetFamily() == PDFCS_CALRGB) {
+ return TRUE;
+ }
+ if (pCS->GetFamily() == PDFCS_INDEXED && _IsSupported(pCS->GetBaseCS())) {
+ return TRUE;
+ }
+ return FALSE;
+}
+CPDF_ImageRenderer::CPDF_ImageRenderer()
+{
+ m_pRenderStatus = NULL;
+ m_pImageObject = NULL;
+ m_Result = TRUE;
+ m_Status = 0;
+ m_pQuickStretcher = NULL;
+ m_pTransformer = NULL;
+ m_DeviceHandle = NULL;
+ m_LoadHandle = NULL;
+ m_pClone = NULL;
+ m_bStdCS = FALSE;
+ m_bPatternColor = FALSE;
+ m_BlendType = FXDIB_BLEND_NORMAL;
+ m_pPattern = NULL;
+ m_pObj2Device = NULL;
+}
+CPDF_ImageRenderer::~CPDF_ImageRenderer()
+{
+ if (m_pQuickStretcher) {
+ delete m_pQuickStretcher;
+ }
+ if (m_pTransformer) {
+ delete m_pTransformer;
+ }
+ if (m_DeviceHandle) {
+ m_pRenderStatus->m_pDevice->CancelDIBits(m_DeviceHandle);
+ }
+ if (m_LoadHandle) {
+ delete (CPDF_ProgressiveImageLoaderHandle*)m_LoadHandle;
+ }
+ if (m_pClone) {
+ delete m_pClone;
+ }
+}
+FX_BOOL CPDF_ImageRenderer::StartLoadDIBSource()
+{
+ CFX_FloatRect image_rect_f = m_ImageMatrix.GetUnitRect();
+ FX_RECT image_rect = image_rect_f.GetOutterRect();
+ int dest_width = image_rect.Width();
+ int dest_height = image_rect.Height();
+ if (m_ImageMatrix.a < 0) {
+ dest_width = -dest_width;
+ }
+ if (m_ImageMatrix.d > 0) {
+ dest_height = -dest_height;
+ }
+ if (m_Loader.StartLoadImage(m_pImageObject, m_pRenderStatus->m_pContext->m_pPageCache, m_LoadHandle, m_bStdCS,
+ m_pRenderStatus->m_GroupFamily, m_pRenderStatus->m_bLoadMask, m_pRenderStatus, dest_width, dest_height)) {
+ if (m_LoadHandle != NULL) {
+ m_Status = 4;
+ return TRUE;
+ }
+ return FALSE;
+ }
+ return FALSE;
+}
+FX_BOOL CPDF_ImageRenderer::StartRenderDIBSource()
+{
+ if (m_Loader.m_pBitmap == NULL) {
+ return FALSE;
+ }
+ m_BitmapAlpha = 255;
+ const CPDF_GeneralStateData* pGeneralState = m_pImageObject->m_GeneralState;
+ if (pGeneralState) {
+ m_BitmapAlpha = FXSYS_round(pGeneralState->m_FillAlpha * 255);
+ }
+ m_pDIBSource = m_Loader.m_pBitmap;
+ if (m_pRenderStatus->m_Options.m_ColorMode == RENDER_COLOR_ALPHA && m_Loader.m_pMask == NULL) {
+ return StartBitmapAlpha();
+ }
+#ifndef _FPDFAPI_MINI_
+ if (pGeneralState && pGeneralState->m_pTR) {
+ if (!pGeneralState->m_pTransferFunc) {
+ ((CPDF_GeneralStateData*)pGeneralState)->m_pTransferFunc = m_pRenderStatus->GetTransferFunc(pGeneralState->m_pTR);
+ }
+ if (pGeneralState->m_pTransferFunc && !pGeneralState->m_pTransferFunc->m_bIdentity) {
+ m_pDIBSource = m_Loader.m_pBitmap = pGeneralState->m_pTransferFunc->TranslateImage(m_Loader.m_pBitmap, !m_Loader.m_bCached);
+ if (m_Loader.m_bCached && m_Loader.m_pMask) {
+ m_Loader.m_pMask = m_Loader.m_pMask->Clone();
+ }
+ m_Loader.m_bCached = FALSE;
+ }
+ }
+#endif
+ m_FillArgb = 0;
+ m_bPatternColor = FALSE;
+ m_pPattern = NULL;
+ if (m_pDIBSource->IsAlphaMask()) {
+ CPDF_Color* pColor = m_pImageObject->m_ColorState.GetFillColor();
+ if (pColor && pColor->IsPattern()) {
+ m_pPattern = pColor->GetPattern();
+ if (m_pPattern != NULL) {
+ m_bPatternColor = TRUE;
+ }
+ }
+ m_FillArgb = m_pRenderStatus->GetFillArgb(m_pImageObject);
+ } else if (m_pRenderStatus->m_Options.m_ColorMode == RENDER_COLOR_GRAY) {
+ m_pClone = m_pDIBSource->Clone();
+ m_pClone->ConvertColorScale(m_pRenderStatus->m_Options.m_BackColor, m_pRenderStatus->m_Options.m_ForeColor);
+ m_pDIBSource = m_pClone;
+ }
+ m_Flags = 0;
+#if !defined(_FPDFAPI_MINI_)
+ if (m_pRenderStatus->m_Options.m_Flags & RENDER_FORCE_DOWNSAMPLE) {
+ m_Flags |= RENDER_FORCE_DOWNSAMPLE;
+ } else if (m_pRenderStatus->m_Options.m_Flags & RENDER_FORCE_HALFTONE) {
+ m_Flags |= RENDER_FORCE_HALFTONE;
+ }
+#else
+ if (!(m_pRenderStatus->m_Options.m_Flags & RENDER_FORCE_HALFTONE)) {
+ if (m_pRenderStatus->m_HalftoneLimit) {
+ CFX_FloatRect image_rect_f = m_ImageMatrix.GetUnitRect();
+ FX_RECT image_rect = image_rect_f.GetOutterRect();
+ FX_RECT image_clip = image_rect;
+ image_rect.Intersect(m_pRenderStatus->m_pDevice->GetClipBox());
+ if (image_rect.Width() && image_rect.Height()) {
+ if ((image_clip.Width() * m_pDIBSource->GetWidth() / image_rect.Width()) *
+ (image_clip.Height() * m_pDIBSource->GetHeight() / image_rect.Height()) >
+ m_pRenderStatus->m_HalftoneLimit) {
+ m_Flags |= RENDER_FORCE_DOWNSAMPLE;
+ }
+ }
+ } else {
+ m_Flags |= RENDER_FORCE_DOWNSAMPLE;
+ }
+ }
+#endif
+#ifndef _FPDFAPI_MINI_
+ if (m_pRenderStatus->m_pDevice->GetDeviceClass() != FXDC_DISPLAY) {
+ CPDF_Object* pFilters = m_pImageObject->m_pImage->GetStream()->GetDict()->GetElementValue(FX_BSTRC("Filter"));
+ if (pFilters) {
+ if (pFilters->GetType() == PDFOBJ_NAME) {
+ CFX_ByteStringC bsDecodeType = pFilters->GetConstString();
+ if (bsDecodeType == FX_BSTRC("DCTDecode") || bsDecodeType == FX_BSTRC("JPXDecode")) {
+ m_Flags |= FXRENDER_IMAGE_LOSSY;
+ }
+ } else if (pFilters->GetType() == PDFOBJ_ARRAY) {
+ CPDF_Array* pArray = (CPDF_Array*)pFilters;
+ for (FX_DWORD i = 0; i < pArray->GetCount(); i ++) {
+ CFX_ByteStringC bsDecodeType = pArray->GetConstString(i);
+ if (bsDecodeType == FX_BSTRC("DCTDecode") || bsDecodeType == FX_BSTRC("JPXDecode")) {
+ m_Flags |= FXRENDER_IMAGE_LOSSY;
+ break;
+ }
+ }
+ }
+ }
+ }
+ if (m_pRenderStatus->m_Options.m_Flags & RENDER_NOIMAGESMOOTH) {
+ m_Flags |= FXDIB_NOSMOOTH;
+ } else if (m_pImageObject->m_pImage->IsInterpol()) {
+ m_Flags |= FXDIB_INTERPOL;
+ }
+#endif
+ if (m_Loader.m_pMask) {
+ return DrawMaskedImage();
+ }
+ if (m_bPatternColor) {
+ return DrawPatternImage(m_pObj2Device);
+ }
+#if !defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_)
+ if (m_BitmapAlpha == 255 && pGeneralState && pGeneralState->m_FillOP &&
+ pGeneralState->m_OPMode == 0 && pGeneralState->m_BlendType == FXDIB_BLEND_NORMAL && pGeneralState->m_StrokeAlpha == 1 && pGeneralState->m_FillAlpha == 1) {
+ CPDF_Document* pDocument = NULL;
+ CPDF_Page* pPage = NULL;
+ if (m_pRenderStatus->m_pContext->m_pPageCache) {
+ pPage = m_pRenderStatus->m_pContext->m_pPageCache->GetPage();
+ pDocument = pPage->m_pDocument;
+ } else {
+ pDocument = m_pImageObject->m_pImage->GetDocument();
+ }
+ CPDF_Dictionary* pPageResources = pPage ? pPage->m_pPageResources : NULL;
+ CPDF_Object* pCSObj = m_pImageObject->m_pImage->GetStream()->GetDict()->GetElementValue(FX_BSTRC("ColorSpace"));
+ CPDF_ColorSpace* pColorSpace = pDocument->LoadColorSpace(pCSObj, pPageResources);
+ if (pColorSpace) {
+ int format = pColorSpace->GetFamily();
+ if (format == PDFCS_DEVICECMYK || format == PDFCS_SEPARATION || format == PDFCS_DEVICEN) {
+ m_BlendType = FXDIB_BLEND_DARKEN;
+ }
+ pDocument->GetPageData()->ReleaseColorSpace(pCSObj);
+ }
+ }
+#endif
+ return StartDIBSource();
+}
+FX_BOOL CPDF_ImageRenderer::Start(CPDF_RenderStatus* pStatus, const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device, FX_BOOL bStdCS, int blendType)
+{
+ m_pRenderStatus = pStatus;
+ m_bStdCS = bStdCS;
+ m_pImageObject = (CPDF_ImageObject*)pObj;
+ m_BlendType = blendType;
+ m_pObj2Device = pObj2Device;
+#ifndef _FPDFAPI_MINI_
+ CPDF_Dictionary* pOC = m_pImageObject->m_pImage->GetOC();
+ if (pOC && m_pRenderStatus->m_Options.m_pOCContext && !m_pRenderStatus->m_Options.m_pOCContext->CheckOCGVisible(pOC)) {
+ return FALSE;
+ }
+#endif
+ m_ImageMatrix = m_pImageObject->m_Matrix;
+ m_ImageMatrix.Concat(*pObj2Device);
+ if (StartLoadDIBSource()) {
+ return TRUE;
+ }
+ return StartRenderDIBSource();
+}
+FX_BOOL CPDF_ImageRenderer::Start(CPDF_RenderStatus* pStatus, const CFX_DIBSource* pDIBSource, FX_ARGB bitmap_argb,
+ int bitmap_alpha, const CFX_AffineMatrix* pImage2Device, FX_DWORD flags, FX_BOOL bStdCS, int blendType)
+{
+ m_pRenderStatus = pStatus;
+ m_pDIBSource = pDIBSource;
+ m_FillArgb = bitmap_argb;
+ m_BitmapAlpha = bitmap_alpha;
+ m_ImageMatrix = *pImage2Device;
+ m_Flags = flags;
+ m_bStdCS = bStdCS;
+ m_BlendType = blendType;
+ return StartDIBSource();
+}
+FX_BOOL CPDF_ImageRenderer::DrawPatternImage(const CFX_Matrix* pObj2Device)
+{
+ if (m_pRenderStatus->m_bPrint && !(m_pRenderStatus->m_pDevice->GetRenderCaps() & FXRC_BLEND_MODE)) {
+ m_Result = FALSE;
+ return FALSE;
+ }
+ FX_RECT rect = m_ImageMatrix.GetUnitRect().GetOutterRect();
+ rect.Intersect(m_pRenderStatus->m_pDevice->GetClipBox());
+ if (rect.IsEmpty()) {
+ return FALSE;
+ }
+ CFX_AffineMatrix new_matrix = m_ImageMatrix;
+ new_matrix.TranslateI(-rect.left, -rect.top);
+ int width = rect.Width();
+ int height = rect.Height();
+ CFX_FxgeDevice bitmap_device1;
+ if (!bitmap_device1.Create(rect.Width(), rect.Height(), FXDIB_Rgb32)) {
+ return TRUE;
+ }
+ bitmap_device1.GetBitmap()->Clear(0xffffff);
+ {
+ CPDF_RenderStatus bitmap_render;
+ bitmap_render.Initialize(m_pRenderStatus->m_Level + 1, m_pRenderStatus->m_pContext, &bitmap_device1, NULL, NULL,
+ NULL, NULL, &m_pRenderStatus->m_Options, 0, m_pRenderStatus->m_bDropObjects, NULL, TRUE);
+ CFX_Matrix patternDevice = *pObj2Device;
+ patternDevice.Translate((FX_FLOAT) - rect.left, (FX_FLOAT) - rect.top);
+ if(m_pPattern->m_PatternType == PATTERN_TILING) {
+ bitmap_render.DrawTilingPattern((CPDF_TilingPattern*)m_pPattern, m_pImageObject, &patternDevice, FALSE);
+ } else {
+ bitmap_render.DrawShadingPattern((CPDF_ShadingPattern*)m_pPattern, m_pImageObject, &patternDevice, FALSE);
+ }
+ }
+ {
+ CFX_FxgeDevice bitmap_device2;
+ if (!bitmap_device2.Create(rect.Width(), rect.Height(), FXDIB_8bppRgb)) {
+ return TRUE;
+ }
+ bitmap_device2.GetBitmap()->Clear(0);
+ CPDF_RenderStatus bitmap_render;
+ bitmap_render.Initialize(m_pRenderStatus->m_Level + 1, m_pRenderStatus->m_pContext, &bitmap_device2, NULL, NULL,
+ NULL, NULL, NULL, 0, m_pRenderStatus->m_bDropObjects, NULL, TRUE);
+ CPDF_ImageRenderer image_render;
+ if (image_render.Start(&bitmap_render, m_pDIBSource, 0xffffffff, 255, &new_matrix, m_Flags, TRUE)) {
+ image_render.Continue(NULL);
+ }
+ if (m_Loader.m_MatteColor != 0xffffffff) {
+ int matte_r = FXARGB_R(m_Loader.m_MatteColor);
+ int matte_g = FXARGB_G(m_Loader.m_MatteColor);
+ int matte_b = FXARGB_B(m_Loader.m_MatteColor);
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = (FX_LPBYTE)bitmap_device1.GetBitmap()->GetScanline(row);
+ FX_LPCBYTE mask_scan = bitmap_device2.GetBitmap()->GetScanline(row);
+ for (int col = 0; col < width; col ++) {
+ int alpha = *mask_scan ++;
+ if (alpha) {
+ int orig = (*dest_scan - matte_b) * 255 / alpha + matte_b;
+ if (orig < 0) {
+ orig = 0;
+ } else if (orig > 255) {
+ orig = 255;
+ }
+ *dest_scan++ = orig;
+ orig = (*dest_scan - matte_g) * 255 / alpha + matte_g;
+ if (orig < 0) {
+ orig = 0;
+ } else if (orig > 255) {
+ orig = 255;
+ }
+ *dest_scan++ = orig;
+ orig = (*dest_scan - matte_r) * 255 / alpha + matte_r;
+ if (orig < 0) {
+ orig = 0;
+ } else if (orig > 255) {
+ orig = 255;
+ }
+ *dest_scan++ = orig;
+ dest_scan ++;
+ } else {
+ dest_scan += 4;
+ }
+ }
+ }
+ }
+ bitmap_device2.GetBitmap()->ConvertFormat(FXDIB_8bppMask);
+ bitmap_device1.GetBitmap()->MultiplyAlpha(bitmap_device2.GetBitmap());
+ bitmap_device1.GetBitmap()->MultiplyAlpha(255);
+ }
+ m_pRenderStatus->m_pDevice->SetDIBits(bitmap_device1.GetBitmap(), rect.left, rect.top, m_BlendType);
+ return FALSE;
+}
+FX_BOOL CPDF_ImageRenderer::DrawMaskedImage()
+{
+ if (m_pRenderStatus->m_bPrint && !(m_pRenderStatus->m_pDevice->GetRenderCaps() & FXRC_BLEND_MODE)) {
+ m_Result = FALSE;
+ return FALSE;
+ }
+ FX_RECT rect = m_ImageMatrix.GetUnitRect().GetOutterRect();
+ rect.Intersect(m_pRenderStatus->m_pDevice->GetClipBox());
+ if (rect.IsEmpty()) {
+ return FALSE;
+ }
+ CFX_AffineMatrix new_matrix = m_ImageMatrix;
+ new_matrix.TranslateI(-rect.left, -rect.top);
+ int width = rect.Width();
+ int height = rect.Height();
+ CFX_FxgeDevice bitmap_device1;
+ if (!bitmap_device1.Create(width, height, FXDIB_Rgb32)) {
+ return TRUE;
+ }
+ bitmap_device1.GetBitmap()->Clear(0xffffff);
+ {
+ CPDF_RenderStatus bitmap_render;
+ bitmap_render.Initialize(m_pRenderStatus->m_Level + 1, m_pRenderStatus->m_pContext, &bitmap_device1, NULL, NULL,
+ NULL, NULL, NULL, 0, m_pRenderStatus->m_bDropObjects, NULL, TRUE);
+ CPDF_ImageRenderer image_render;
+ if (image_render.Start(&bitmap_render, m_pDIBSource, 0, 255, &new_matrix, m_Flags, TRUE)) {
+ image_render.Continue(NULL);
+ }
+ }
+ {
+ CFX_FxgeDevice bitmap_device2;
+ if (!bitmap_device2.Create(width, height, FXDIB_8bppRgb)) {
+ return TRUE;
+ }
+ bitmap_device2.GetBitmap()->Clear(0);
+ CPDF_RenderStatus bitmap_render;
+ bitmap_render.Initialize(m_pRenderStatus->m_Level + 1, m_pRenderStatus->m_pContext, &bitmap_device2, NULL, NULL,
+ NULL, NULL, NULL, 0, m_pRenderStatus->m_bDropObjects, NULL, TRUE);
+ CPDF_ImageRenderer image_render;
+ if (image_render.Start(&bitmap_render, m_Loader.m_pMask, 0xffffffff, 255, &new_matrix, m_Flags, TRUE)) {
+ image_render.Continue(NULL);
+ }
+ if (m_Loader.m_MatteColor != 0xffffffff) {
+ int matte_r = FXARGB_R(m_Loader.m_MatteColor);
+ int matte_g = FXARGB_G(m_Loader.m_MatteColor);
+ int matte_b = FXARGB_B(m_Loader.m_MatteColor);
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = (FX_LPBYTE)bitmap_device1.GetBitmap()->GetScanline(row);
+ FX_LPCBYTE mask_scan = bitmap_device2.GetBitmap()->GetScanline(row);
+ for (int col = 0; col < width; col ++) {
+ int alpha = *mask_scan ++;
+ if (alpha) {
+ int orig = (*dest_scan - matte_b) * 255 / alpha + matte_b;
+ if (orig < 0) {
+ orig = 0;
+ } else if (orig > 255) {
+ orig = 255;
+ }
+ *dest_scan++ = orig;
+ orig = (*dest_scan - matte_g) * 255 / alpha + matte_g;
+ if (orig < 0) {
+ orig = 0;
+ } else if (orig > 255) {
+ orig = 255;
+ }
+ *dest_scan++ = orig;
+ orig = (*dest_scan - matte_r) * 255 / alpha + matte_r;
+ if (orig < 0) {
+ orig = 0;
+ } else if (orig > 255) {
+ orig = 255;
+ }
+ *dest_scan++ = orig;
+ dest_scan ++;
+ } else {
+ dest_scan += 4;
+ }
+ }
+ }
+ }
+ bitmap_device2.GetBitmap()->ConvertFormat(FXDIB_8bppMask);
+ bitmap_device1.GetBitmap()->MultiplyAlpha(bitmap_device2.GetBitmap());
+ if (m_BitmapAlpha < 255) {
+ bitmap_device1.GetBitmap()->MultiplyAlpha(m_BitmapAlpha);
+ }
+ }
+ m_pRenderStatus->m_pDevice->SetDIBits(bitmap_device1.GetBitmap(), rect.left, rect.top, m_BlendType);
+ return FALSE;
+}
+FX_BOOL CPDF_ImageRenderer::StartDIBSource()
+{
+#if !defined(_FPDFAPI_MINI_)
+ if (!(m_Flags & RENDER_FORCE_DOWNSAMPLE) && m_pDIBSource->GetBPP() > 1) {
+ int image_size = m_pDIBSource->GetBPP() / 8 * m_pDIBSource->GetWidth() * m_pDIBSource->GetHeight();
+ if (image_size > FPDF_HUGE_IMAGE_SIZE && !(m_Flags & RENDER_FORCE_HALFTONE)) {
+ m_Flags |= RENDER_FORCE_DOWNSAMPLE;
+ }
+ }
+#endif
+ if (m_pRenderStatus->m_pDevice->StartDIBits(m_pDIBSource, m_BitmapAlpha, m_FillArgb,
+ &m_ImageMatrix, m_Flags, m_DeviceHandle, 0, NULL, m_BlendType)) {
+ if (m_DeviceHandle != NULL) {
+ m_Status = 3;
+ return TRUE;
+ }
+ return FALSE;
+ }
+#if !defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_)
+ CFX_FloatRect image_rect_f = m_ImageMatrix.GetUnitRect();
+ FX_RECT image_rect = image_rect_f.GetOutterRect();
+ int dest_width = image_rect.Width();
+ int dest_height = image_rect.Height();
+ if ((FXSYS_fabs(m_ImageMatrix.b) >= 0.5f || m_ImageMatrix.a == 0) ||
+ (FXSYS_fabs(m_ImageMatrix.c) >= 0.5f || m_ImageMatrix.d == 0) ) {
+ if (m_pRenderStatus->m_bPrint && !(m_pRenderStatus->m_pDevice->GetRenderCaps() & FXRC_BLEND_MODE)) {
+ m_Result = FALSE;
+ return FALSE;
+ }
+ FX_RECT clip_box = m_pRenderStatus->m_pDevice->GetClipBox();
+ clip_box.Intersect(image_rect);
+ m_Status = 2;
+ m_pTransformer = FX_NEW CFX_ImageTransformer;
+ m_pTransformer->Start(m_pDIBSource, &m_ImageMatrix, m_Flags, &clip_box);
+ return TRUE;
+ }
+ if (m_ImageMatrix.a < 0) {
+ dest_width = -dest_width;
+ }
+ if (m_ImageMatrix.d > 0) {
+ dest_height = -dest_height;
+ }
+ int dest_left, dest_top;
+ dest_left = dest_width > 0 ? image_rect.left : image_rect.right;
+ dest_top = dest_height > 0 ? image_rect.top : image_rect.bottom;
+ if (m_pDIBSource->IsOpaqueImage() && m_BitmapAlpha == 255) {
+ if (m_pRenderStatus->m_pDevice->StretchDIBits(m_pDIBSource, dest_left, dest_top,
+ dest_width, dest_height, m_Flags, NULL, m_BlendType)) {
+ return FALSE;
+ }
+ }
+ if (m_pDIBSource->IsAlphaMask()) {
+ if (m_BitmapAlpha != 255) {
+ m_FillArgb = FXARGB_MUL_ALPHA(m_FillArgb, m_BitmapAlpha);
+ }
+ if (m_pRenderStatus->m_pDevice->StretchBitMask(m_pDIBSource, dest_left, dest_top, dest_width, dest_height, m_FillArgb, m_Flags)) {
+ return FALSE;
+ }
+ }
+ if (m_pRenderStatus->m_bPrint && !(m_pRenderStatus->m_pDevice->GetRenderCaps() & FXRC_BLEND_MODE)) {
+ m_Result = FALSE;
+ return TRUE;
+ }
+ FX_RECT clip_box = m_pRenderStatus->m_pDevice->GetClipBox();
+ FX_RECT dest_rect = clip_box;
+ dest_rect.Intersect(image_rect);
+ FX_RECT dest_clip(dest_rect.left - image_rect.left, dest_rect.top - image_rect.top,
+ dest_rect.right - image_rect.left, dest_rect.bottom - image_rect.top);
+ CFX_DIBitmap* pStretched = m_pDIBSource->StretchTo(dest_width, dest_height, m_Flags, &dest_clip);
+ if (pStretched) {
+ m_pRenderStatus->CompositeDIBitmap(pStretched, dest_rect.left, dest_rect.top, m_FillArgb,
+ m_BitmapAlpha, m_BlendType, FALSE);
+ delete pStretched;
+ pStretched = NULL;
+ }
+#endif
+ return FALSE;
+}
+FX_BOOL CPDF_ImageRenderer::StartBitmapAlpha()
+{
+#ifndef _FPDFAPI_MINI_
+ if (m_pDIBSource->IsOpaqueImage()) {
+ CFX_PathData path;
+ path.AppendRect(0, 0, 1, 1);
+ path.Transform(&m_ImageMatrix);
+ FX_DWORD fill_color = ArgbEncode(0xff, m_BitmapAlpha, m_BitmapAlpha, m_BitmapAlpha);
+ m_pRenderStatus->m_pDevice->DrawPath(&path, NULL, NULL, fill_color, 0, FXFILL_WINDING);
+ } else {
+ const CFX_DIBSource* pAlphaMask = m_pDIBSource->IsAlphaMask() ? m_pDIBSource : m_pDIBSource->GetAlphaMask();
+ if (FXSYS_fabs(m_ImageMatrix.b) >= 0.5f || FXSYS_fabs(m_ImageMatrix.c) >= 0.5f) {
+ int left, top;
+ CFX_DIBitmap* pTransformed = pAlphaMask->TransformTo(&m_ImageMatrix, left, top);
+ if (pTransformed == NULL) {
+ return TRUE;
+ }
+ m_pRenderStatus->m_pDevice->SetBitMask(pTransformed, left, top, ArgbEncode(0xff, m_BitmapAlpha, m_BitmapAlpha, m_BitmapAlpha));
+ delete pTransformed;
+ } else {
+ CFX_FloatRect image_rect_f = m_ImageMatrix.GetUnitRect();
+ FX_RECT image_rect = image_rect_f.GetOutterRect();
+ int dest_width = m_ImageMatrix.a > 0 ? image_rect.Width() : -image_rect.Width();
+ int dest_height = m_ImageMatrix.d > 0 ? -image_rect.Height() : image_rect.Height();
+ int left = dest_width > 0 ? image_rect.left : image_rect.right;
+ int top = dest_height > 0 ? image_rect.top : image_rect.bottom;
+ m_pRenderStatus->m_pDevice->StretchBitMask(pAlphaMask, left, top, dest_width, dest_height,
+ ArgbEncode(0xff, m_BitmapAlpha, m_BitmapAlpha, m_BitmapAlpha));
+ }
+ if (m_pDIBSource != pAlphaMask) {
+ delete pAlphaMask;
+ }
+ }
+#endif
+ return FALSE;
+}
+FX_BOOL CPDF_ImageRenderer::Continue(IFX_Pause* pPause)
+{
+ if (m_Status == 1) {
+#ifndef _FPDFAPI_MINI_
+ if (m_pQuickStretcher->Continue(pPause)) {
+ return TRUE;
+ }
+ if (m_pQuickStretcher->m_pBitmap->IsAlphaMask())
+ m_pRenderStatus->m_pDevice->SetBitMask(m_pQuickStretcher->m_pBitmap, m_pQuickStretcher->m_ResultLeft,
+ m_pQuickStretcher->m_ResultTop, m_FillArgb);
+ else
+ m_pRenderStatus->m_pDevice->SetDIBits(m_pQuickStretcher->m_pBitmap, m_pQuickStretcher->m_ResultLeft,
+ m_pQuickStretcher->m_ResultTop, m_BlendType);
+ return FALSE;
+#endif
+ } else if (m_Status == 2) {
+#if !defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_)
+ if (m_pTransformer->Continue(pPause)) {
+ return TRUE;
+ }
+ CFX_DIBitmap* pBitmap = m_pTransformer->m_Storer.Detach();
+ if (pBitmap == NULL) {
+ return FALSE;
+ }
+ if (pBitmap->IsAlphaMask()) {
+ if (m_BitmapAlpha != 255) {
+ m_FillArgb = FXARGB_MUL_ALPHA(m_FillArgb, m_BitmapAlpha);
+ }
+ m_Result = m_pRenderStatus->m_pDevice->SetBitMask(pBitmap,
+ m_pTransformer->m_ResultLeft, m_pTransformer->m_ResultTop, m_FillArgb);
+ } else {
+ if (m_BitmapAlpha != 255) {
+ pBitmap->MultiplyAlpha(m_BitmapAlpha);
+ }
+ m_Result = m_pRenderStatus->m_pDevice->SetDIBits(pBitmap,
+ m_pTransformer->m_ResultLeft, m_pTransformer->m_ResultTop, m_BlendType);
+ }
+ delete pBitmap;
+ return FALSE;
+#endif
+ } else if (m_Status == 3) {
+ return m_pRenderStatus->m_pDevice->ContinueDIBits(m_DeviceHandle, pPause);
+ } else if (m_Status == 4) {
+ if (m_Loader.Continue(m_LoadHandle, pPause)) {
+ return TRUE;
+ }
+ if (StartRenderDIBSource()) {
+ return Continue(pPause);
+ }
+ return FALSE;
+ }
+ return FALSE;
+}
+CPDF_QuickStretcher::CPDF_QuickStretcher()
+{
+ m_pBitmap = NULL;
+ m_pDecoder = NULL;
+ m_pCS = NULL;
+}
+CPDF_QuickStretcher::~CPDF_QuickStretcher()
+{
+ if (m_pBitmap) {
+ delete m_pBitmap;
+ }
+ if (m_pCS) {
+ m_pCS->ReleaseCS();
+ }
+ if (m_pDecoder) {
+ delete m_pDecoder;
+ }
+}
+ICodec_ScanlineDecoder* FPDFAPI_CreateFlateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,
+ int nComps, int bpc, const CPDF_Dictionary* pParams);
+FX_BOOL CPDF_QuickStretcher::Start(CPDF_ImageObject* pImageObj, CFX_AffineMatrix* pImage2Device, const FX_RECT* pClipBox)
+{
+ if (FXSYS_fabs(pImage2Device->a) < FXSYS_fabs(pImage2Device->b) * 10 && FXSYS_fabs(pImage2Device->d) < FXSYS_fabs(pImage2Device->c) * 10) {
+ return FALSE;
+ }
+ CFX_FloatRect image_rect_f = pImage2Device->GetUnitRect();
+ FX_RECT image_rect = image_rect_f.GetOutterRect();
+ m_DestWidth = image_rect.Width();
+ m_DestHeight = image_rect.Height();
+ m_bFlipX = pImage2Device->a < 0;
+ m_bFlipY = pImage2Device->d > 0;
+ FX_RECT result_rect = *pClipBox;
+ result_rect.Intersect(image_rect);
+ if (result_rect.IsEmpty()) {
+ return FALSE;
+ }
+ m_ResultWidth = result_rect.Width();
+ m_ResultHeight = result_rect.Height();
+ m_ResultLeft = result_rect.left;
+ m_ResultTop = result_rect.top;
+ m_ClipLeft = result_rect.left - image_rect.left;
+ m_ClipTop = result_rect.top - image_rect.top;
+ CPDF_Dictionary* pDict = pImageObj->m_pImage->GetDict();
+ if (pDict->GetInteger(FX_BSTRC("BitsPerComponent")) != 8) {
+ return FALSE;
+ }
+ if (pDict->KeyExist(FX_BSTRC("SMask")) || pDict->KeyExist(FX_BSTRC("Mask"))) {
+ return FALSE;
+ }
+ m_SrcWidth = pDict->GetInteger(FX_BSTRC("Width"));
+ m_SrcHeight = pDict->GetInteger(FX_BSTRC("Height"));
+ m_pCS = NULL;
+ m_Bpp = 3;
+ CPDF_Object* pCSObj = pDict->GetElementValue(FX_BSTRC("ColorSpace"));
+ if (pCSObj == NULL) {
+ return FALSE;
+ }
+ m_pCS = CPDF_ColorSpace::Load(pImageObj->m_pImage->GetDocument(), pCSObj);
+ if (m_pCS == NULL) {
+ return FALSE;
+ }
+ if (!_IsSupported(m_pCS)) {
+ return FALSE;
+ }
+ m_Bpp = m_pCS->CountComponents();
+ if (m_pCS->sRGB()) {
+ m_pCS->ReleaseCS();
+ m_pCS = NULL;
+ }
+ CPDF_Stream* pStream = pImageObj->m_pImage->GetStream();
+ m_StreamAcc.LoadAllData(pStream, FALSE, m_SrcWidth * m_SrcHeight * m_Bpp, TRUE);
+ m_pDecoder = NULL;
+ if (!m_StreamAcc.GetImageDecoder().IsEmpty()) {
+ if (m_StreamAcc.GetImageDecoder() == FX_BSTRC("DCTDecode")) {
+ const CPDF_Dictionary* pParam = m_StreamAcc.GetImageParam();
+ m_pDecoder = CPDF_ModuleMgr::Get()->GetJpegModule()->CreateDecoder(
+ m_StreamAcc.GetData(), m_StreamAcc.GetSize(), m_SrcWidth, m_SrcHeight, m_Bpp,
+ pParam ? pParam->GetInteger(FX_BSTRC("ColorTransform"), 1) : 1);
+ } else if (m_StreamAcc.GetImageDecoder() == FX_BSTRC("FlateDecode")) {
+ m_pDecoder = FPDFAPI_CreateFlateDecoder(
+ m_StreamAcc.GetData(), m_StreamAcc.GetSize(), m_SrcWidth, m_SrcHeight, m_Bpp, 8,
+ m_StreamAcc.GetImageParam());
+ } else {
+ return FALSE;
+ }
+ m_pDecoder->DownScale(m_DestWidth, m_DestHeight);
+ }
+ m_pBitmap = FX_NEW CFX_DIBitmap;
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+ m_pBitmap->Create(m_ResultWidth, m_ResultHeight, FXDIB_Rgb32);
+#else
+ m_pBitmap->Create(m_ResultWidth, m_ResultHeight, FXDIB_Rgb);
+#endif
+ m_LineIndex = 0;
+ return TRUE;
+}
+FX_BOOL CPDF_QuickStretcher::Continue(IFX_Pause* pPause)
+{
+ FX_LPBYTE result_buf = m_pBitmap->GetBuffer();
+ int src_width = m_pDecoder ? m_pDecoder->GetWidth() : m_SrcWidth;
+ int src_height = m_pDecoder ? m_pDecoder->GetHeight() : m_SrcHeight;
+ int src_pitch = src_width * m_Bpp;
+ while (m_LineIndex < m_ResultHeight) {
+ int dest_y, src_y;
+ if (m_bFlipY) {
+ dest_y = m_ResultHeight - m_LineIndex - 1;
+ src_y = (m_DestHeight - (dest_y + m_ClipTop) - 1) * src_height / m_DestHeight;
+ } else {
+ dest_y = m_LineIndex;
+ src_y = (dest_y + m_ClipTop) * src_height / m_DestHeight;
+ }
+ FX_LPCBYTE src_scan;
+ if (m_pDecoder) {
+ src_scan = m_pDecoder->GetScanline(src_y);
+ if (src_scan == NULL) {
+ break;
+ }
+ } else {
+ src_scan = m_StreamAcc.GetData();
+ if (src_scan == NULL) {
+ break;
+ }
+ src_scan += src_y * src_pitch;
+ }
+ FX_LPBYTE result_scan = result_buf + dest_y * m_pBitmap->GetPitch();
+ for (int x = 0; x < m_ResultWidth; x ++) {
+ int dest_x = m_ClipLeft + x;
+ int src_x = (m_bFlipX ? (m_DestWidth - dest_x - 1) : dest_x) * src_width / m_DestWidth;
+ FX_LPCBYTE src_pixel = src_scan + src_x * m_Bpp;
+ if (m_pCS == NULL) {
+ *result_scan = src_pixel[2];
+ result_scan ++;
+ *result_scan = src_pixel[1];
+ result_scan ++;
+ *result_scan = src_pixel[0];
+ result_scan ++;
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+ result_scan ++;
+#endif
+ } else {
+ m_pCS->TranslateImageLine(result_scan, src_pixel, 1, 0, 0);
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+ result_scan += 4;
+#else
+ result_scan += 3;
+#endif
+ }
+ }
+ m_LineIndex ++;
+ if (pPause && pPause->NeedToPauseNow()) {
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+CFX_DIBitmap* CPDF_RenderStatus::LoadSMask(CPDF_Dictionary* pSMaskDict,
+ FX_RECT* pClipRect, const CFX_AffineMatrix* pMatrix)
+{
+ if (pSMaskDict == NULL) {
+ return NULL;
+ }
+ CFX_DIBitmap* pMask = NULL;
+ int width = pClipRect->right - pClipRect->left;
+ int height = pClipRect->bottom - pClipRect->top;
+ FX_BOOL bLuminosity = FALSE;
+ bLuminosity = pSMaskDict->GetConstString(FX_BSTRC("S")) != FX_BSTRC("Alpha");
+ CPDF_Stream* pGroup = pSMaskDict->GetStream(FX_BSTRC("G"));
+ if (pGroup == NULL) {
+ return NULL;
+ }
+ CPDF_Function* pFunc = NULL;
+ CPDF_Object* pFuncObj = pSMaskDict->GetElementValue(FX_BSTRC("TR"));
+ if (pFuncObj && (pFuncObj->GetType() == PDFOBJ_DICTIONARY || pFuncObj->GetType() == PDFOBJ_STREAM)) {
+ pFunc = CPDF_Function::Load(pFuncObj);
+ }
+ CFX_AffineMatrix matrix = *pMatrix;
+ matrix.TranslateI(-pClipRect->left, -pClipRect->top);
+ CPDF_Form form(m_pContext->m_pDocument, m_pContext->m_pPageResources, pGroup);
+ form.ParseContent(NULL, NULL, NULL, NULL);
+ CFX_FxgeDevice bitmap_device;
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+ if (!bitmap_device.Create(width, height, bLuminosity ? FXDIB_Rgb32 : FXDIB_8bppMask)) {
+ return NULL;
+ }
+#else
+ if (!bitmap_device.Create(width, height, bLuminosity ? FXDIB_Rgb : FXDIB_8bppMask)) {
+ return NULL;
+ }
+#endif
+ CFX_DIBitmap& bitmap = *bitmap_device.GetBitmap();
+ CPDF_Object* pCSObj = NULL;
+ CPDF_ColorSpace* pCS = NULL;
+ if (bLuminosity) {
+ CPDF_Array* pBC = pSMaskDict->GetArray(FX_BSTRC("BC"));
+ FX_ARGB back_color = 0xff000000;
+ if (pBC) {
+ pCSObj = pGroup->GetDict()->GetDict(FX_BSTRC("Group"))->GetElementValue(FX_BSTRC("CS"));
+ pCS = m_pContext->m_pDocument->LoadColorSpace(pCSObj);
+ if (pCS) {
+ FX_FLOAT R, G, B;
+ FX_DWORD num_floats = 8;
+ if (pCS->CountComponents() > (FX_INT32)num_floats) {
+ num_floats = (FX_DWORD)pCS->CountComponents();
+ }
+ CFX_FixedBufGrow<FX_FLOAT, 8> float_array(num_floats);
+ FX_FLOAT* pFloats = float_array;
+ FXSYS_memset32(pFloats, 0, num_floats * sizeof(FX_FLOAT));
+ int count = pBC->GetCount() > 8 ? 8 : pBC->GetCount();
+ for (int i = 0; i < count; i ++) {
+ pFloats[i] = pBC->GetNumber(i);
+ }
+ pCS->GetRGB(pFloats, R, G, B);
+ back_color = 0xff000000 | ((FX_INT32)(R * 255) << 16) | ((FX_INT32)(G * 255) << 8) | (FX_INT32)(B * 255);
+ m_pContext->m_pDocument->GetPageData()->ReleaseColorSpace(pCSObj);
+ }
+ }
+ bitmap.Clear(back_color);
+ } else {
+ bitmap.Clear(0);
+ }
+ CPDF_Dictionary* pFormResource = NULL;
+ if (form.m_pFormDict) {
+ pFormResource = form.m_pFormDict->GetDict(FX_BSTRC("Resources"));
+ }
+ CPDF_RenderOptions options;
+ options.m_ColorMode = bLuminosity ? RENDER_COLOR_NORMAL : RENDER_COLOR_ALPHA;
+ CPDF_RenderStatus status;
+ status.Initialize(m_Level + 1, m_pContext, &bitmap_device, NULL, NULL, NULL, NULL,
+ &options, 0, m_bDropObjects, pFormResource, TRUE, NULL, 0, pCS ? pCS->GetFamily() : 0, bLuminosity);
+ status.RenderObjectList(&form, &matrix);
+ pMask = FX_NEW CFX_DIBitmap;
+ if (!pMask->Create(width, height, FXDIB_8bppMask)) {
+ delete pMask;
+ return NULL;
+ }
+ FX_LPBYTE dest_buf = pMask->GetBuffer();
+ int dest_pitch = pMask->GetPitch();
+ FX_LPBYTE src_buf = bitmap.GetBuffer();
+ int src_pitch = bitmap.GetPitch();
+ FX_LPBYTE pTransfer = FX_Alloc(FX_BYTE, 256);
+ if (pFunc) {
+ CFX_FixedBufGrow<FX_FLOAT, 16> results(pFunc->CountOutputs());
+ for (int i = 0; i < 256; i ++) {
+ FX_FLOAT input = (FX_FLOAT)i / 255.0f;
+ int nresult;
+ pFunc->Call(&input, 1, results, nresult);
+ pTransfer[i] = FXSYS_round(results[0] * 255);
+ }
+ } else {
+ for (int i = 0; i < 256; i ++) {
+ pTransfer[i] = i;
+ }
+ }
+ if (bLuminosity) {
+ int Bpp = bitmap.GetBPP() / 8;
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_pos = dest_buf + row * dest_pitch;
+ FX_LPBYTE src_pos = src_buf + row * src_pitch;
+ for (int col = 0; col < width; col ++) {
+ *dest_pos ++ = pTransfer[FXRGB2GRAY(src_pos[2], src_pos[1], *src_pos)];
+ src_pos += Bpp;
+ }
+ }
+ } else if (pFunc) {
+ int size = dest_pitch * height;
+ for (int i = 0; i < size; i ++) {
+ dest_buf[i] = pTransfer[src_buf[i]];
+ }
+ } else {
+ FXSYS_memcpy32(dest_buf, src_buf, dest_pitch * height);
+ }
+ if (pFunc) {
+ delete pFunc;
+ }
+ FX_Free(pTransfer);
+ return pMask;
+}
diff --git a/core/src/fpdfapi/fpdf_render/fpdf_render_loadimage.cpp b/core/src/fpdfapi/fpdf_render/fpdf_render_loadimage.cpp
index fcb5271cc3..e67b46c931 100644
--- a/core/src/fpdfapi/fpdf_render/fpdf_render_loadimage.cpp
+++ b/core/src/fpdfapi/fpdf_render/fpdf_render_loadimage.cpp
@@ -1,1524 +1,1524 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../../include/fxge/fx_ge.h"
-#include "../../../include/fxcodec/fx_codec.h"
-#include "../../../include/fpdfapi/fpdf_module.h"
-#include "../../../include/fpdfapi/fpdf_render.h"
-#include "../../../include/fpdfapi/fpdf_pageobj.h"
-#include "../fpdf_page/pageint.h"
-#include "render_int.h"
-#include <limits.h>
-static unsigned int _GetBits8(FX_LPCBYTE pData, int bitpos, int nbits)
-{
- unsigned int byte = pData[bitpos / 8];
- if (nbits == 8) {
- return byte;
- } else if (nbits == 4) {
- return (bitpos % 8) ? (byte & 0x0f) : (byte >> 4);
- } else if (nbits == 2) {
- return (byte >> (6 - bitpos % 8)) & 0x03;
- } else if (nbits == 1) {
- return (byte >> (7 - bitpos % 8)) & 0x01;
- } else if (nbits == 16) {
- return byte * 256 + pData[bitpos / 8 + 1];
- }
- return 0;
-}
-CFX_DIBSource* CPDF_Image::LoadDIBSource(CFX_DIBSource** ppMask, FX_DWORD* pMatteColor, FX_BOOL bStdCS, FX_DWORD GroupFamily, FX_BOOL bLoadMask) const
-{
- CPDF_DIBSource* pSource = FX_NEW CPDF_DIBSource;
- if (pSource->Load(m_pDocument, m_pStream, (CPDF_DIBSource**)ppMask, pMatteColor, NULL, NULL, bStdCS, GroupFamily, bLoadMask)) {
- return pSource;
- }
- delete pSource;
- return NULL;
-}
-CFX_DIBSource* CPDF_Image::DetachBitmap()
-{
- CFX_DIBSource* pBitmap = m_pDIBSource;
- m_pDIBSource = NULL;
- return pBitmap;
-}
-CFX_DIBSource* CPDF_Image::DetachMask()
-{
- CFX_DIBSource* pBitmap = m_pMask;
- m_pMask = NULL;
- return pBitmap;
-}
-FX_BOOL CPDF_Image::StartLoadDIBSource(CPDF_Dictionary* pFormResource, CPDF_Dictionary* pPageResource, FX_BOOL bStdCS, FX_DWORD GroupFamily, FX_BOOL bLoadMask)
-{
- m_pDIBSource = FX_NEW CPDF_DIBSource;
- int ret = ((CPDF_DIBSource*)m_pDIBSource)->StartLoadDIBSource(m_pDocument, m_pStream, TRUE, pFormResource, pPageResource, bStdCS, GroupFamily, bLoadMask);
- if (ret == 2) {
- return TRUE;
- }
- if (!ret) {
- delete m_pDIBSource;
- m_pDIBSource = NULL;
- return FALSE;
- }
- m_pMask = ((CPDF_DIBSource*)m_pDIBSource)->DetachMask();
- m_MatteColor = ((CPDF_DIBSource*)m_pDIBSource)->m_MatteColor;
- return FALSE;
-}
-FX_BOOL CPDF_Image::Continue(IFX_Pause* pPause)
-{
- int ret = ((CPDF_DIBSource*)m_pDIBSource)->ContinueLoadDIBSource(pPause);
- if (ret == 2) {
- return TRUE;
- }
- if (!ret) {
- delete m_pDIBSource;
- m_pDIBSource = NULL;
- return FALSE;
- }
- m_pMask = ((CPDF_DIBSource*)m_pDIBSource)->DetachMask();
- m_MatteColor = ((CPDF_DIBSource*)m_pDIBSource)->m_MatteColor;
- return FALSE;
-}
-CPDF_DIBSource::CPDF_DIBSource()
-{
- m_pDocument = NULL;
- m_pStreamAcc = NULL;
- m_pDict = NULL;
- m_bpp = 0;
- m_Width = m_Height = 0;
- m_pColorSpace = NULL;
- m_bDefaultDecode = TRUE;
- m_bImageMask = FALSE;
- m_pPalette = NULL;
- m_pCompData = NULL;
- m_bColorKey = FALSE;
- m_pMaskedLine = m_pLineBuf = NULL;
- m_pCachedBitmap = NULL;
- m_pDecoder = NULL;
- m_nComponents = 0;
- m_bpc = 0;
- m_bLoadMask = FALSE;
- m_Family = 0;
- m_pMask = NULL;
- m_MatteColor = 0;
- m_pJbig2Context = NULL;
- m_pGlobalStream = NULL;
- m_bStdCS = FALSE;
- m_pMaskStream = NULL;
- m_Status = 0;
- m_bHasMask = FALSE;
-}
-CPDF_DIBSource::~CPDF_DIBSource()
-{
- if (m_pStreamAcc) {
- delete m_pStreamAcc;
- }
- if (m_pMaskedLine) {
- FX_Free(m_pMaskedLine);
- }
- if (m_pLineBuf) {
- FX_Free(m_pLineBuf);
- }
- if (m_pCachedBitmap) {
- delete m_pCachedBitmap;
- }
- if (m_pDecoder) {
- delete m_pDecoder;
- }
- if (m_pCompData) {
- FX_Free(m_pCompData);
- }
- CPDF_ColorSpace* pCS = m_pColorSpace;
- if (pCS && m_pDocument) {
- m_pDocument->GetPageData()->ReleaseColorSpace(pCS->GetArray());
- }
- if (m_pJbig2Context) {
- ICodec_Jbig2Module* pJbig2Moudle = CPDF_ModuleMgr::Get()->GetJbig2Module();
- pJbig2Moudle->DestroyJbig2Context(m_pJbig2Context);
- m_pJbig2Context = NULL;
- }
- if (m_pGlobalStream) {
- delete m_pGlobalStream;
- }
- m_pGlobalStream = NULL;
-}
-CFX_DIBitmap* CPDF_DIBSource::GetBitmap() const
-{
- if (m_pCachedBitmap) {
- return m_pCachedBitmap;
- }
- return Clone();
-}
-void CPDF_DIBSource::ReleaseBitmap(CFX_DIBitmap* pBitmap) const
-{
- if (pBitmap && pBitmap != m_pCachedBitmap) {
- delete pBitmap;
- }
-}
-FX_BOOL CPDF_DIBSource::Load(CPDF_Document* pDoc, const CPDF_Stream* pStream, CPDF_DIBSource** ppMask,
- FX_DWORD* pMatteColor, CPDF_Dictionary* pFormResources, CPDF_Dictionary* pPageResources, FX_BOOL bStdCS, FX_DWORD GroupFamily, FX_BOOL bLoadMask)
-{
- if (pStream == NULL) {
- return FALSE;
- }
- m_pDocument = pDoc;
- m_pDict = pStream->GetDict();
- m_pStream = pStream;
- m_Width = m_pDict->GetInteger(FX_BSTRC("Width"));
- m_Height = m_pDict->GetInteger(FX_BSTRC("Height"));
- if (m_Width <= 0 || m_Height <= 0 || m_Width > 0x01ffff || m_Height > 0x01ffff) {
- return FALSE;
- }
- m_GroupFamily = GroupFamily;
- m_bLoadMask = bLoadMask;
- if (!LoadColorInfo(m_pStream->GetObjNum() != 0 ? NULL : pFormResources, pPageResources)) {
- return FALSE;
- }
- FX_DWORD src_pitch = m_bpc;
- if (m_bpc != 0 && m_nComponents != 0) {
- if (src_pitch > 0 && m_nComponents > (unsigned)INT_MAX / src_pitch) {
- return FALSE;
- }
- src_pitch *= m_nComponents;
- if (src_pitch > 0 && (FX_DWORD)m_Width > (unsigned)INT_MAX / src_pitch) {
- return FALSE;
- }
- src_pitch *= m_Width;
- if (src_pitch + 7 < src_pitch) {
- return FALSE;
- }
- src_pitch += 7;
- src_pitch /= 8;
- if (src_pitch > 0 && (FX_DWORD)m_Height > (unsigned)INT_MAX / src_pitch) {
- return FALSE;
- }
- }
- m_pStreamAcc = FX_NEW CPDF_StreamAcc;
- m_pStreamAcc->LoadAllData(pStream, FALSE, m_Height * src_pitch, TRUE);
- if (m_pStreamAcc->GetSize() == 0 || m_pStreamAcc->GetData() == NULL) {
- return FALSE;
- }
- const CFX_ByteString& decoder = m_pStreamAcc->GetImageDecoder();
- if (!decoder.IsEmpty() && decoder == FX_BSTRC("CCITTFaxDecode")) {
- m_bpc = 1;
- }
- if (!CreateDecoder()) {
- return FALSE;
- }
- if (m_bImageMask) {
- m_bpp = 1;
- m_bpc = 1;
- m_nComponents = 1;
- m_AlphaFlag = 1;
- } else if (m_bpc * m_nComponents == 1) {
- m_bpp = 1;
- } else if (m_bpc * m_nComponents <= 8) {
- m_bpp = 8;
- } else {
- m_bpp = 24;
- }
- if (!m_bpc || !m_nComponents) {
- return FALSE;
- }
- m_Pitch = m_Width;
- if ((FX_DWORD)m_bpp > (unsigned)INT_MAX / m_Pitch) {
- return FALSE;
- }
- m_Pitch *= m_bpp;
- if (m_Pitch + 31 < m_Pitch) {
- return FALSE;
- }
- m_Pitch += 31;
- m_Pitch = m_Pitch / 32 * 4;
- m_pLineBuf = FX_Alloc(FX_BYTE, m_Pitch);
- if (m_pColorSpace && bStdCS) {
- m_pColorSpace->EnableStdConversion(TRUE);
- }
- LoadPalette();
- if (m_bColorKey) {
- m_bpp = 32;
- m_AlphaFlag = 2;
- m_Pitch = m_Width;
- if ((FX_DWORD)m_bpp > (unsigned)INT_MAX / m_Pitch) {
- return FALSE;
- }
- m_Pitch *= m_bpp;
- if (m_Pitch + 31 < m_Pitch) {
- return FALSE;
- }
- m_Pitch += 31;
- m_Pitch = m_Pitch / 32 * 4;
- m_pMaskedLine = FX_Alloc(FX_BYTE, m_Pitch);
- }
- if (ppMask) {
- *ppMask = LoadMask(*pMatteColor);
- }
- if (m_pColorSpace && bStdCS) {
- m_pColorSpace->EnableStdConversion(FALSE);
- }
- return TRUE;
-}
-int CPDF_DIBSource::ContinueToLoadMask()
-{
- if (m_bImageMask) {
- m_bpp = 1;
- m_bpc = 1;
- m_nComponents = 1;
- m_AlphaFlag = 1;
- } else if (m_bpc * m_nComponents == 1) {
- m_bpp = 1;
- } else if (m_bpc * m_nComponents <= 8) {
- m_bpp = 8;
- } else {
- m_bpp = 24;
- }
- if (!m_bpc || !m_nComponents) {
- return 0;
- }
- m_Pitch = m_Width;
- if ((FX_DWORD)m_bpp > (unsigned)INT_MAX / m_Pitch) {
- return 0;
- }
- m_Pitch *= m_bpp;
- if (m_Pitch + 31 < m_Pitch) {
- return 0;
- }
- m_Pitch += 31;
- m_Pitch = m_Pitch / 32 * 4;
- m_pLineBuf = FX_Alloc(FX_BYTE, m_Pitch);
- if (m_pColorSpace && m_bStdCS) {
- m_pColorSpace->EnableStdConversion(TRUE);
- }
- LoadPalette();
- if (m_bColorKey) {
- m_bpp = 32;
- m_AlphaFlag = 2;
- m_Pitch = m_Width;
- if ((FX_DWORD)m_bpp > (unsigned)INT_MAX / m_Pitch) {
- return 0;
- }
- m_Pitch *= m_bpp;
- if (m_Pitch + 31 < m_Pitch) {
- return 0;
- }
- m_Pitch += 31;
- m_Pitch = m_Pitch / 32 * 4;
- m_pMaskedLine = FX_Alloc(FX_BYTE, m_Pitch);
- }
- return 1;
-}
-int CPDF_DIBSource::StartLoadDIBSource(CPDF_Document* pDoc, const CPDF_Stream* pStream, FX_BOOL bHasMask,
- CPDF_Dictionary* pFormResources, CPDF_Dictionary* pPageResources,
- FX_BOOL bStdCS, FX_DWORD GroupFamily, FX_BOOL bLoadMask)
-{
- if (pStream == NULL) {
- return 0;
- }
- m_pDocument = pDoc;
- m_pDict = pStream->GetDict();
- m_pStream = pStream;
- m_bStdCS = bStdCS;
- m_bHasMask = bHasMask;
- m_Width = m_pDict->GetInteger(FX_BSTRC("Width"));
- m_Height = m_pDict->GetInteger(FX_BSTRC("Height"));
- if (m_Width <= 0 || m_Height <= 0 || m_Width > 0x01ffff || m_Height > 0x01ffff) {
- return 0;
- }
- m_GroupFamily = GroupFamily;
- m_bLoadMask = bLoadMask;
- if (!LoadColorInfo(m_pStream->GetObjNum() != 0 ? NULL : pFormResources, pPageResources)) {
- return 0;
- }
- FX_DWORD src_pitch = m_bpc;
- if (m_bpc != 0 && m_nComponents != 0) {
- if (src_pitch > 0 && m_nComponents > (unsigned)INT_MAX / src_pitch) {
- return 0;
- }
- src_pitch *= m_nComponents;
- if (src_pitch > 0 && (FX_DWORD)m_Width > (unsigned)INT_MAX / src_pitch) {
- return 0;
- }
- src_pitch *= m_Width;
- if (src_pitch + 7 < src_pitch) {
- return 0;
- }
- src_pitch += 7;
- src_pitch /= 8;
- if (src_pitch > 0 && (FX_DWORD)m_Height > (unsigned)INT_MAX / src_pitch) {
- return 0;
- }
- }
- m_pStreamAcc = FX_NEW CPDF_StreamAcc;
- m_pStreamAcc->LoadAllData(pStream, FALSE, m_Height * src_pitch, TRUE);
- if (m_pStreamAcc->GetSize() == 0 || m_pStreamAcc->GetData() == NULL) {
- return 0;
- }
- const CFX_ByteString& decoder = m_pStreamAcc->GetImageDecoder();
- if (!decoder.IsEmpty() && decoder == FX_BSTRC("CCITTFaxDecode")) {
- m_bpc = 1;
- }
- int ret = CreateDecoder();
- if (ret != 1) {
- if (!ret) {
- return ret;
- }
- if (!ContinueToLoadMask()) {
- return 0;
- }
- if (m_bHasMask) {
- StratLoadMask();
- }
- return ret;
- }
- if (!ContinueToLoadMask()) {
- return 0;
- }
- if (m_bHasMask) {
- ret = StratLoadMask();
- }
- if (ret == 2) {
- return ret;
- }
- if (m_pColorSpace && m_bStdCS) {
- m_pColorSpace->EnableStdConversion(FALSE);
- }
- return ret;
-}
-int CPDF_DIBSource::ContinueLoadDIBSource(IFX_Pause* pPause)
-{
- FXCODEC_STATUS ret;
- if (m_Status == 1) {
- const CFX_ByteString& decoder = m_pStreamAcc->GetImageDecoder();
- if (decoder == FX_BSTRC("JPXDecode")) {
- return 0;
- }
- ICodec_Jbig2Module* pJbig2Moudle = CPDF_ModuleMgr::Get()->GetJbig2Module();
- if (m_pJbig2Context == NULL) {
- m_pJbig2Context = pJbig2Moudle->CreateJbig2Context();
- if (m_pStreamAcc->GetImageParam()) {
- CPDF_Stream* pGlobals = m_pStreamAcc->GetImageParam()->GetStream(FX_BSTRC("JBIG2Globals"));
- if (pGlobals) {
- m_pGlobalStream = FX_NEW CPDF_StreamAcc;
- m_pGlobalStream->LoadAllData(pGlobals, FALSE);
- }
- }
- ret = pJbig2Moudle->StartDecode(m_pJbig2Context, m_Width, m_Height, m_pStreamAcc->GetData(), m_pStreamAcc->GetSize(),
- m_pGlobalStream ? m_pGlobalStream->GetData() : NULL, m_pGlobalStream ? m_pGlobalStream->GetSize() : 0, m_pCachedBitmap->GetBuffer(),
- m_pCachedBitmap->GetPitch(), pPause);
- if (ret < 0) {
- delete m_pCachedBitmap;
- m_pCachedBitmap = NULL;
- if (m_pGlobalStream) {
- delete m_pGlobalStream;
- }
- m_pGlobalStream = NULL;
- pJbig2Moudle->DestroyJbig2Context(m_pJbig2Context);
- m_pJbig2Context = NULL;
- return 0;
- }
- if (ret == FXCODEC_STATUS_DECODE_TOBECONTINUE) {
- return 2;
- }
- int ret1 = 1;
- if (m_bHasMask) {
- ret1 = ContinueLoadMaskDIB(pPause);
- m_Status = 2;
- }
- if (ret1 == 2) {
- return ret1;
- }
- if (m_pColorSpace && m_bStdCS) {
- m_pColorSpace->EnableStdConversion(FALSE);
- }
- return ret1;
- }
- FXCODEC_STATUS ret = pJbig2Moudle->ContinueDecode(m_pJbig2Context, pPause);
- if (ret < 0) {
- delete m_pCachedBitmap;
- m_pCachedBitmap = NULL;
- if (m_pGlobalStream) {
- delete m_pGlobalStream;
- }
- m_pGlobalStream = NULL;
- pJbig2Moudle->DestroyJbig2Context(m_pJbig2Context);
- m_pJbig2Context = NULL;
- return 0;
- }
- if (ret == FXCODEC_STATUS_DECODE_TOBECONTINUE) {
- return 2;
- }
- int ret1 = 1;
- if (m_bHasMask) {
- ret1 = ContinueLoadMaskDIB(pPause);
- m_Status = 2;
- }
- if (ret1 == 2) {
- return ret1;
- }
- if (m_pColorSpace && m_bStdCS) {
- m_pColorSpace->EnableStdConversion(FALSE);
- }
- return ret1;
- } else if (m_Status == 2) {
- return ContinueLoadMaskDIB(pPause);
- }
- return 0;
-}
-FX_BOOL CPDF_DIBSource::LoadColorInfo(CPDF_Dictionary* pFormResources, CPDF_Dictionary* pPageResources)
-{
- if (m_pDict->GetInteger("ImageMask")) {
- m_bImageMask = TRUE;
- }
- if (m_bImageMask || !m_pDict->KeyExist(FX_BSTRC("ColorSpace"))) {
- if (!m_bImageMask) {
- CPDF_Object* pFilter = m_pDict->GetElementValue(FX_BSTRC("Filter"));
- if (pFilter) {
- CFX_ByteString filter;
- if (pFilter->GetType() == PDFOBJ_NAME) {
- filter = pFilter->GetString();
- if (filter == FX_BSTRC("JPXDecode")) {
- return TRUE;
- }
- } else if (pFilter->GetType() == PDFOBJ_ARRAY) {
- CPDF_Array* pArray = (CPDF_Array*)pFilter;
- if (pArray->GetString(pArray->GetCount() - 1) == FX_BSTRC("JPXDecode")) {
- return TRUE;
- }
- }
- }
- }
- m_bImageMask = TRUE;
- m_bpc = m_nComponents = 1;
- CPDF_Array* pDecode = m_pDict->GetArray(FX_BSTRC("Decode"));
- m_bDefaultDecode = pDecode == NULL || pDecode->GetInteger(0) == 0;
- return TRUE;
- }
- CPDF_Object* pCSObj = m_pDict->GetElementValue(FX_BSTRC("ColorSpace"));
- if (pCSObj == NULL) {
- return FALSE;
- }
- CPDF_DocPageData* pDocPageData = m_pDocument->GetPageData();
- if (pFormResources) {
- m_pColorSpace = pDocPageData->GetColorSpace(pCSObj, pFormResources);
- }
- if (m_pColorSpace == NULL) {
- m_pColorSpace = pDocPageData->GetColorSpace(pCSObj, pPageResources);
- }
- if (m_pColorSpace == NULL) {
- return FALSE;
- }
- m_bpc = m_pDict->GetInteger(FX_BSTRC("BitsPerComponent"));
- m_Family = m_pColorSpace->GetFamily();
- m_nComponents = m_pColorSpace->CountComponents();
- if (m_Family == PDFCS_ICCBASED && pCSObj->GetType() == PDFOBJ_NAME) {
- CFX_ByteString cs = pCSObj->GetString();
- if (cs == FX_BSTRC("DeviceGray")) {
- m_nComponents = 1;
- } else if (cs == FX_BSTRC("DeviceRGB")) {
- m_nComponents = 3;
- } else if (cs == FX_BSTRC("DeviceCMYK")) {
- m_nComponents = 4;
- }
- }
- m_pCompData = FX_Alloc(DIB_COMP_DATA, m_nComponents);
- if (m_bpc == 0) {
- return TRUE;
- }
- int max_data = (1 << m_bpc) - 1;
- CPDF_Array* pDecode = m_pDict->GetArray(FX_BSTRC("Decode"));
- if (pDecode) {
- for (FX_DWORD i = 0; i < m_nComponents; i ++) {
- m_pCompData[i].m_DecodeMin = pDecode->GetNumber(i * 2);
- FX_FLOAT max = pDecode->GetNumber(i * 2 + 1);
- m_pCompData[i].m_DecodeStep = (max - m_pCompData[i].m_DecodeMin) / max_data;
- FX_FLOAT def_value, def_min, def_max;
- m_pColorSpace->GetDefaultValue(i, def_value, def_min, def_max);
- if (m_Family == PDFCS_INDEXED) {
- def_max = (FX_FLOAT)max_data;
- }
- if (def_min != m_pCompData[i].m_DecodeMin || def_max != max) {
- m_bDefaultDecode = FALSE;
- }
- }
- } else {
- for (FX_DWORD i = 0; i < m_nComponents; i ++) {
- FX_FLOAT def_value;
- m_pColorSpace->GetDefaultValue(i, def_value, m_pCompData[i].m_DecodeMin, m_pCompData[i].m_DecodeStep);
- if (m_Family == PDFCS_INDEXED) {
- m_pCompData[i].m_DecodeStep = (FX_FLOAT)max_data;
- }
- m_pCompData[i].m_DecodeStep = (m_pCompData[i].m_DecodeStep - m_pCompData[i].m_DecodeMin) / max_data;
- }
- }
- if (!m_pDict->KeyExist(FX_BSTRC("SMask"))) {
- CPDF_Object* pMask = m_pDict->GetElementValue(FX_BSTRC("Mask"));
- if (pMask == NULL) {
- return TRUE;
- }
- if (pMask->GetType() == PDFOBJ_ARRAY) {
- CPDF_Array* pArray = (CPDF_Array*)pMask;
- if (pArray->GetCount() >= m_nComponents * 2)
- for (FX_DWORD i = 0; i < m_nComponents * 2; i ++) {
- if (i % 2) {
- m_pCompData[i / 2].m_ColorKeyMax = pArray->GetInteger(i);
- } else {
- m_pCompData[i / 2].m_ColorKeyMin = pArray->GetInteger(i);
- }
- }
- m_bColorKey = TRUE;
- }
- }
- return TRUE;
-}
-ICodec_ScanlineDecoder* FPDFAPI_CreateFaxDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,
- const CPDF_Dictionary* pParams);
-ICodec_ScanlineDecoder* FPDFAPI_CreateFlateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,
- int nComps, int bpc, const CPDF_Dictionary* pParams);
-int CPDF_DIBSource::CreateDecoder()
-{
- const CFX_ByteString& decoder = m_pStreamAcc->GetImageDecoder();
- if (decoder.IsEmpty()) {
- return 1;
- }
- FX_LPCBYTE src_data = m_pStreamAcc->GetData();
- FX_DWORD src_size = m_pStreamAcc->GetSize();
- const CPDF_Dictionary* pParams = m_pStreamAcc->GetImageParam();
- if (decoder == FX_BSTRC("CCITTFaxDecode")) {
- m_pDecoder = FPDFAPI_CreateFaxDecoder(src_data, src_size, m_Width, m_Height, pParams);
- } else if (decoder == FX_BSTRC("DCTDecode")) {
- m_pDecoder = CPDF_ModuleMgr::Get()->GetJpegModule()->CreateDecoder(src_data, src_size, m_Width, m_Height,
- m_nComponents, pParams ? pParams->GetInteger(FX_BSTR("ColorTransform"), 1) : 1);
- if (NULL == m_pDecoder) {
- FX_BOOL bTransform = FALSE;
- int comps, bpc;
- ICodec_JpegModule* pJpegModule = CPDF_ModuleMgr::Get()->GetJpegModule();
- if (pJpegModule->LoadInfo(src_data, src_size, m_Width, m_Height, comps, bpc, bTransform)) {
- m_nComponents = comps;
- m_bpc = bpc;
- m_pDecoder = CPDF_ModuleMgr::Get()->GetJpegModule()->CreateDecoder(src_data, src_size, m_Width, m_Height,
- m_nComponents, bTransform);
- }
- }
- } else if (decoder == FX_BSTRC("FlateDecode")) {
- m_pDecoder = FPDFAPI_CreateFlateDecoder(src_data, src_size, m_Width, m_Height, m_nComponents, m_bpc, pParams);
- } else if (decoder == FX_BSTRC("JPXDecode")) {
- LoadJpxBitmap();
- return m_pCachedBitmap != NULL ? 1 : 0;
- } else if (decoder == FX_BSTRC("JBIG2Decode")) {
- m_pCachedBitmap = FX_NEW CFX_DIBitmap;
- if (!m_pCachedBitmap->Create(m_Width, m_Height, m_bImageMask ? FXDIB_1bppMask : FXDIB_1bppRgb)) {
- delete m_pCachedBitmap;
- m_pCachedBitmap = NULL;
- return 0;
- }
- m_Status = 1;
- return 2;
- } else if (decoder == FX_BSTRC("RunLengthDecode")) {
- m_pDecoder = CPDF_ModuleMgr::Get()->GetCodecModule()->GetBasicModule()->CreateRunLengthDecoder(src_data, src_size, m_Width, m_Height, m_nComponents, m_bpc);
- }
- if (m_pDecoder) {
- int requested_pitch = (m_Width * m_nComponents * m_bpc + 7) / 8;
- int provided_pitch = (m_pDecoder->GetWidth() * m_pDecoder->CountComps() * m_pDecoder->GetBPC() + 7) / 8;
- if (provided_pitch < requested_pitch) {
- return 0;
- }
- return 1;
- }
- return 0;
-}
-void CPDF_DIBSource::LoadJpxBitmap()
-{
- ICodec_JpxModule* pJpxModule = CPDF_ModuleMgr::Get()->GetJpxModule();
- if (pJpxModule == NULL) {
- return;
- }
- FX_LPVOID ctx = pJpxModule->CreateDecoder(m_pStreamAcc->GetData(), m_pStreamAcc->GetSize(), m_pColorSpace != NULL);
- if (ctx == NULL) {
- return;
- }
- FX_DWORD width = 0, height = 0, codestream_nComps = 0, image_nComps = 0;
- pJpxModule->GetImageInfo(ctx, width, height, codestream_nComps, image_nComps);
- if ((int)width < m_Width || (int)height < m_Height) {
- pJpxModule->DestroyDecoder(ctx);
- return;
- }
- int output_nComps;
- FX_BOOL bTranslateColor, bSwapRGB = FALSE;
- if (m_pColorSpace) {
- if (codestream_nComps != (FX_DWORD)m_pColorSpace->CountComponents()) {
- return;
- }
- output_nComps = codestream_nComps;
- bTranslateColor = FALSE;
- if (m_pColorSpace == CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB)) {
- bSwapRGB = TRUE;
- m_pColorSpace = NULL;
- }
- } else {
- bTranslateColor = TRUE;
- if (image_nComps) {
- output_nComps = image_nComps;
- } else {
- output_nComps = codestream_nComps;
- }
- if (output_nComps == 3) {
- bSwapRGB = TRUE;
- } else if (output_nComps == 4) {
- m_pColorSpace = CPDF_ColorSpace::GetStockCS(PDFCS_DEVICECMYK);
- bTranslateColor = FALSE;
- }
- m_nComponents = output_nComps;
- }
- FXDIB_Format format;
- if (output_nComps == 1) {
- format = FXDIB_8bppRgb;
- } else if (output_nComps <= 3) {
- format = FXDIB_Rgb;
- } else if (output_nComps == 4) {
- format = FXDIB_Rgb32;
- } else {
- width = (width * output_nComps + 2) / 3;
- format = FXDIB_Rgb;
- }
- m_pCachedBitmap = FX_NEW CFX_DIBitmap;
- if (!m_pCachedBitmap->Create(width, height, format)) {
- delete m_pCachedBitmap;
- m_pCachedBitmap = NULL;
- return;
- }
- m_pCachedBitmap->Clear(0xFFFFFFFF);
- FX_LPBYTE output_offsets = FX_Alloc(FX_BYTE, output_nComps);
- for (int i = 0; i < output_nComps; i ++) {
- output_offsets[i] = i;
- }
- if (bSwapRGB) {
- output_offsets[0] = 2;
- output_offsets[2] = 0;
- }
- if (!pJpxModule->Decode(ctx, m_pCachedBitmap->GetBuffer(), m_pCachedBitmap->GetPitch(), bTranslateColor, output_offsets)) {
- delete m_pCachedBitmap;
- m_pCachedBitmap = NULL;
- return;
- }
- FX_Free(output_offsets);
- pJpxModule->DestroyDecoder(ctx);
- if (m_pColorSpace && m_pColorSpace->GetFamily() == PDFCS_INDEXED && m_bpc < 8) {
- int scale = 8 - m_bpc;
- for (FX_DWORD row = 0; row < height; row ++) {
- FX_LPBYTE scanline = (FX_LPBYTE)m_pCachedBitmap->GetScanline(row);
- for (FX_DWORD col = 0; col < width; col ++) {
- *scanline = (*scanline) >> scale;
- scanline++;
- }
- }
- }
- m_bpc = 8;
-}
-void CPDF_DIBSource::LoadJbig2Bitmap()
-{
- ICodec_Jbig2Module* pJbig2Module = CPDF_ModuleMgr::Get()->GetJbig2Module();
- if (pJbig2Module == NULL) {
- return;
- }
- CPDF_StreamAcc* pGlobalStream = NULL;
- if (m_pStreamAcc->GetImageParam()) {
- CPDF_Stream* pGlobals = m_pStreamAcc->GetImageParam()->GetStream(FX_BSTRC("JBIG2Globals"));
- if (pGlobals) {
- pGlobalStream = FX_NEW CPDF_StreamAcc;
- pGlobalStream->LoadAllData(pGlobals, FALSE);
- }
- }
- m_pCachedBitmap = FX_NEW CFX_DIBitmap;
- if (!m_pCachedBitmap->Create(m_Width, m_Height, m_bImageMask ? FXDIB_1bppMask : FXDIB_1bppRgb)) {
- return;
- }
- int ret = pJbig2Module->Decode(m_Width, m_Height, m_pStreamAcc->GetData(), m_pStreamAcc->GetSize(),
- pGlobalStream ? pGlobalStream->GetData() : NULL, pGlobalStream ? pGlobalStream->GetSize() : 0,
- m_pCachedBitmap->GetBuffer(), m_pCachedBitmap->GetPitch());
- if (ret < 0) {
- delete m_pCachedBitmap;
- m_pCachedBitmap = NULL;
- }
- if (pGlobalStream) {
- delete pGlobalStream;
- }
- m_bpc = 1;
- m_nComponents = 1;
-}
-CPDF_DIBSource* CPDF_DIBSource::LoadMask(FX_DWORD& MatteColor)
-{
- MatteColor = 0xffffffff;
- CPDF_Stream* pSoftMask = m_pDict->GetStream(FX_BSTRC("SMask"));
- if (pSoftMask) {
- CPDF_Array* pMatte = pSoftMask->GetDict()->GetArray(FX_BSTRC("Matte"));
- if (pMatte != NULL && m_pColorSpace && (FX_DWORD)m_pColorSpace->CountComponents() <= m_nComponents) {
- FX_FLOAT* pColor = FX_Alloc(FX_FLOAT, m_nComponents);
- for (FX_DWORD i = 0; i < m_nComponents; i ++) {
- pColor[i] = pMatte->GetFloat(i);
- }
- FX_FLOAT R, G, B;
- m_pColorSpace->GetRGB(pColor, R, G, B);
- FX_Free(pColor);
- MatteColor = FXARGB_MAKE(0, FXSYS_round(R * 255), FXSYS_round(G * 255), FXSYS_round(B * 255));
- }
- return LoadMaskDIB(pSoftMask);
- }
- CPDF_Object* pMask = m_pDict->GetElementValue(FX_BSTRC("Mask"));
- if (pMask == NULL) {
- return NULL;
- }
- if (pMask->GetType() == PDFOBJ_STREAM) {
- return LoadMaskDIB((CPDF_Stream*)pMask);
- }
- return NULL;
-}
-int CPDF_DIBSource::StratLoadMask()
-{
- m_MatteColor = 0xffffffff;
- m_pMaskStream = m_pDict->GetStream(FX_BSTRC("SMask"));
- if (m_pMaskStream) {
- CPDF_Array* pMatte = m_pMaskStream->GetDict()->GetArray(FX_BSTRC("Matte"));
- if (pMatte != NULL && m_pColorSpace && (FX_DWORD)m_pColorSpace->CountComponents() <= m_nComponents) {
- FX_FLOAT R, G, B;
- FX_FLOAT* pColor = FX_Alloc(FX_FLOAT, m_nComponents);
- for (FX_DWORD i = 0; i < m_nComponents; i ++) {
- pColor[i] = pMatte->GetFloat(i);
- }
- m_pColorSpace->GetRGB(pColor, R, G, B);
- FX_Free(pColor);
- m_MatteColor = FXARGB_MAKE(0, FXSYS_round(R * 255), FXSYS_round(G * 255), FXSYS_round(B * 255));
- }
- return StartLoadMaskDIB();
- }
- m_pMaskStream = m_pDict->GetElementValue(FX_BSTRC("Mask"));
- if (m_pMaskStream == NULL) {
- return 1;
- }
- if (m_pMaskStream->GetType() == PDFOBJ_STREAM) {
- return StartLoadMaskDIB();
- }
- return 1;
-}
-int CPDF_DIBSource::ContinueLoadMaskDIB(IFX_Pause* pPause)
-{
- if (m_pMask == NULL) {
- return 1;
- }
- int ret = m_pMask->ContinueLoadDIBSource(pPause);
- if (ret == 2) {
- return ret;
- }
- if (m_pColorSpace && m_bStdCS) {
- m_pColorSpace->EnableStdConversion(FALSE);
- }
- if (!ret) {
- delete m_pMask;
- m_pMask = NULL;
- return ret;
- }
- return 1;
-}
-CPDF_DIBSource* CPDF_DIBSource::DetachMask()
-{
- CPDF_DIBSource* pDIBSource = m_pMask;
- m_pMask = NULL;
- return pDIBSource;
-}
-CPDF_DIBSource* CPDF_DIBSource::LoadMaskDIB(CPDF_Stream* pMask)
-{
- CPDF_DIBSource* pMaskSource = FX_NEW CPDF_DIBSource;
- if (!pMaskSource->Load(m_pDocument, pMask, NULL, NULL, NULL, NULL, TRUE)) {
- delete pMaskSource;
- return NULL;
- }
- return pMaskSource;
-}
-int CPDF_DIBSource::StartLoadMaskDIB()
-{
- m_pMask = FX_NEW CPDF_DIBSource;
- int ret = m_pMask->StartLoadDIBSource(m_pDocument, (CPDF_Stream*)m_pMaskStream, FALSE, NULL, NULL, TRUE);
- if (ret == 2) {
- if (m_Status == 0) {
- m_Status = 2;
- }
- return 2;
- }
- if (!ret) {
- delete m_pMask;
- m_pMask = NULL;
- return 1;
- }
- return 1;
-}
-void CPDF_DIBSource::LoadPalette()
-{
- if (m_bpc * m_nComponents > 8) {
- return;
- }
- if (m_pColorSpace == NULL) {
- return;
- }
- if (m_bpc * m_nComponents == 1) {
- if (m_bDefaultDecode && (m_Family == PDFCS_DEVICEGRAY || m_Family == PDFCS_DEVICERGB)) {
- return;
- }
- if (m_pColorSpace->CountComponents() > 3) {
- return;
- }
- FX_FLOAT color_values[3];
- color_values[0] = m_pCompData[0].m_DecodeMin;
- color_values[1] = color_values[2] = color_values[0];
- FX_FLOAT R, G, B;
- m_pColorSpace->GetRGB(color_values, R, G, B);
- FX_ARGB argb0 = ArgbEncode(255, FXSYS_round(R * 255), FXSYS_round(G * 255), FXSYS_round(B * 255));
- color_values[0] += m_pCompData[0].m_DecodeStep;
- color_values[1] += m_pCompData[0].m_DecodeStep;
- color_values[2] += m_pCompData[0].m_DecodeStep;
- m_pColorSpace->GetRGB(color_values, R, G, B);
- FX_ARGB argb1 = ArgbEncode(255, FXSYS_round(R * 255), FXSYS_round(G * 255), FXSYS_round(B * 255));
- if (argb0 != 0xFF000000 || argb1 != 0xFFFFFFFF) {
- SetPaletteArgb(0, argb0);
- SetPaletteArgb(1, argb1);
- }
- return;
- }
- if (m_pColorSpace == CPDF_ColorSpace::GetStockCS(PDFCS_DEVICEGRAY) && m_bpc == 8 && m_bDefaultDecode) {
- } else {
- int palette_count = 1 << (m_bpc * m_nComponents);
- CFX_FixedBufGrow<FX_FLOAT, 16> color_values(m_nComponents);
- FX_FLOAT* color_value = color_values;
- for (int i = 0; i < palette_count; i ++) {
- int color_data = i;
- for (FX_DWORD j = 0; j < m_nComponents; j ++) {
- int encoded_component = color_data % (1 << m_bpc);
- color_data /= 1 << m_bpc;
- color_value[j] = m_pCompData[j].m_DecodeMin + m_pCompData[j].m_DecodeStep * encoded_component;
- }
- FX_FLOAT R = 0, G = 0, B = 0;
- if (m_nComponents == 1 && m_Family == PDFCS_ICCBASED && m_pColorSpace->CountComponents() > 1) {
- int nComponents = m_pColorSpace->CountComponents();
- FX_FLOAT* temp_buf = FX_Alloc(FX_FLOAT, nComponents);
- for (int i = 0; i < nComponents; i++) {
- temp_buf[i] = *color_value;
- }
- m_pColorSpace->GetRGB(temp_buf, R, G, B);
- FX_Free(temp_buf);
- } else {
- m_pColorSpace->GetRGB(color_value, R, G, B);
- }
- SetPaletteArgb(i, ArgbEncode(255, FXSYS_round(R * 255), FXSYS_round(G * 255), FXSYS_round(B * 255)));
- }
- }
-}
-
-FX_DWORD CPDF_DIBSource::GetValidBpp() const
-{
- FX_DWORD bpc = m_bpc;
- CPDF_Object * pFilter = m_pDict->GetElementValue(FX_BSTRC("Filter"));
- if(pFilter)
- {
- if(pFilter->GetType() == PDFOBJ_NAME)
- {
- CFX_ByteString filter = pFilter->GetString();
- if(filter == FX_BSTRC("CCITTFaxDecode") || filter == FX_BSTRC("JBIG2Decode") )
- bpc = 1;
- if(filter == FX_BSTRC("RunLengthDecode") || filter == FX_BSTRC("DCTDecode") )
- bpc = 8;
- }
- else if (pFilter->GetType() == PDFOBJ_ARRAY)
- {
- CPDF_Array *pArray = (CPDF_Array *) pFilter;
- if( pArray->GetString(pArray->GetCount() -1) == FX_BSTRC("CCITTFacDecode") ||
- pArray->GetString(pArray->GetCount() -1) == FX_BSTRC("JBIG2Decode") )
- bpc = 1;
-
- if( pArray->GetString(pArray->GetCount() -1) == FX_BSTRC("RunLengthDecode") ||
- pArray->GetString(pArray->GetCount() -1) == FX_BSTRC("DCTDecode") )
- bpc = 8;
- }
- }
-
- return bpc;
-}
-
-#define NORMALCOLOR_MAX(color, max) (color) > (max) ? (max) : (color) < 0 ? 0 : (color);
-void CPDF_DIBSource::TranslateScanline24bpp(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan) const
-{
- int max_data = (1 << m_bpc) - 1;
- if (m_bDefaultDecode) {
- if (m_Family == PDFCS_DEVICERGB || m_Family == PDFCS_CALRGB) {
- if (m_bpc == 16) {
- FX_LPBYTE dest_pos = dest_scan;
- FX_LPCBYTE src_pos = src_scan;
- for (int col = 0; col < m_Width; col ++) {
- *dest_scan++ = src_pos[4];
- *dest_scan++ = src_pos[2];
- *dest_scan++ = *src_pos;
- src_pos += 6;
- }
- } else if (m_bpc == 8) {
- FX_LPBYTE dest_pos = dest_scan;
- FX_LPCBYTE src_pos = src_scan;
- for (int column = 0; column < m_Width; column ++) {
- *dest_scan++ = src_pos[2];
- *dest_scan++ = src_pos[1];
- *dest_scan++ = *src_pos;
- src_pos += 3;
- }
- } else {
- int src_bit_pos = 0;
- int dest_byte_pos = 0;
-
- FX_DWORD bpc = GetValidBpp();
-
- for (int column = 0; column < m_Width; column ++) {
- int R = _GetBits8(src_scan, src_bit_pos, bpc);
- src_bit_pos += bpc;
- int G = _GetBits8(src_scan, src_bit_pos, bpc);
- src_bit_pos += bpc;
- int B = _GetBits8(src_scan, src_bit_pos, bpc);
- src_bit_pos += bpc;
- R = NORMALCOLOR_MAX(R, max_data);
- G = NORMALCOLOR_MAX(G, max_data);
- B = NORMALCOLOR_MAX(B, max_data);
- dest_scan[dest_byte_pos] = B * 255 / max_data;
- dest_scan[dest_byte_pos + 1] = G * 255 / max_data;
- dest_scan[dest_byte_pos + 2] = R * 255 / max_data;
- dest_byte_pos += 3;
- }
- }
- return;
- } else if (m_bpc == 8) {
- if (m_nComponents == m_pColorSpace->CountComponents())
- m_pColorSpace->TranslateImageLine(dest_scan, src_scan, m_Width, m_Width, m_Height,
- m_bLoadMask && m_GroupFamily == PDFCS_DEVICECMYK && m_Family == PDFCS_DEVICECMYK);
- return;
- }
- }
- CFX_FixedBufGrow<FX_FLOAT, 16> color_values1(m_nComponents);
- FX_FLOAT* color_values = color_values1;
- FX_FLOAT R, G, B;
- if (m_bpc == 8) {
- int src_byte_pos = 0;
- int dest_byte_pos = 0;
- for (int column = 0; column < m_Width; column ++) {
- for (FX_DWORD color = 0; color < m_nComponents; color ++) {
- int data = src_scan[src_byte_pos ++];
- color_values[color] = m_pCompData[color].m_DecodeMin +
- m_pCompData[color].m_DecodeStep * data;
- }
- if (m_bLoadMask && m_GroupFamily == PDFCS_DEVICECMYK && m_Family == PDFCS_DEVICECMYK) {
- FX_FLOAT k = 1.0f - color_values[3];
- R = (1.0f - color_values[0]) * k;
- G = (1.0f - color_values[1]) * k;
- B = (1.0f - color_values[2]) * k;
- } else {
- m_pColorSpace->GetRGB(color_values, R, G, B);
- }
- R = NORMALCOLOR_MAX(R, 1);
- G = NORMALCOLOR_MAX(G, 1);
- B = NORMALCOLOR_MAX(B, 1);
- dest_scan[dest_byte_pos] = (FX_INT32)(B * 255);
- dest_scan[dest_byte_pos + 1] = (FX_INT32)(G * 255);
- dest_scan[dest_byte_pos + 2] = (FX_INT32)(R * 255);
- dest_byte_pos += 3;
- }
- } else {
- int src_bit_pos = 0;
- int dest_byte_pos = 0;
-
- FX_DWORD bpc = GetValidBpp();
-
- for (int column = 0; column < m_Width; column ++) {
- for (FX_DWORD color = 0; color < m_nComponents; color ++) {
- int data = _GetBits8(src_scan, src_bit_pos, bpc);
- color_values[color] = m_pCompData[color].m_DecodeMin +
- m_pCompData[color].m_DecodeStep * data;
- src_bit_pos += bpc;
- }
- if (m_bLoadMask && m_GroupFamily == PDFCS_DEVICECMYK && m_Family == PDFCS_DEVICECMYK) {
- FX_FLOAT k = 1.0f - color_values[3];
- R = (1.0f - color_values[0]) * k;
- G = (1.0f - color_values[1]) * k;
- B = (1.0f - color_values[2]) * k;
- } else {
- m_pColorSpace->GetRGB(color_values, R, G, B);
- }
- R = NORMALCOLOR_MAX(R, 1);
- G = NORMALCOLOR_MAX(G, 1);
- B = NORMALCOLOR_MAX(B, 1);
- dest_scan[dest_byte_pos] = (FX_INT32)(B * 255);
- dest_scan[dest_byte_pos + 1] = (FX_INT32)(G * 255);
- dest_scan[dest_byte_pos + 2] = (FX_INT32)(R * 255);
- dest_byte_pos += 3;
- }
- }
-}
-FX_LPBYTE CPDF_DIBSource::GetBuffer() const
-{
- if (m_pCachedBitmap) {
- return m_pCachedBitmap->GetBuffer();
- }
- return NULL;
-}
-FX_LPCBYTE CPDF_DIBSource::GetScanline(int line) const
-{
- FX_DWORD src_pitch = (m_Width * m_bpc * m_nComponents + 7) / 8;
- FX_LPCBYTE pSrcLine = NULL;
- if (m_pCachedBitmap) {
- if (line >= m_pCachedBitmap->GetHeight()) {
- line = m_pCachedBitmap->GetHeight() - 1;
- }
- pSrcLine = m_pCachedBitmap->GetScanline(line);
- } else if (m_pDecoder) {
- pSrcLine = m_pDecoder->GetScanline(line);
- } else {
- if (m_pStreamAcc->GetSize() >= (line + 1) * src_pitch) {
- pSrcLine = m_pStreamAcc->GetData() + line * src_pitch;
- }
- }
- if (pSrcLine == NULL) {
- FX_LPBYTE pLineBuf = m_pMaskedLine ? m_pMaskedLine : m_pLineBuf;
- FXSYS_memset8(pLineBuf, 0xff, m_Pitch);
- return pLineBuf;
- }
- if (m_bpc * m_nComponents == 1) {
- if (m_bImageMask && m_bDefaultDecode) {
- for (FX_DWORD i = 0; i < src_pitch; i ++) {
- m_pLineBuf[i] = ~pSrcLine[i];
- }
- } else if (m_bColorKey) {
- FX_DWORD reset_argb, set_argb;
- reset_argb = m_pPalette ? m_pPalette[0] : 0xff000000;
- set_argb = m_pPalette ? m_pPalette[1] : 0xffffffff;
- if (m_pCompData[0].m_ColorKeyMin == 0) {
- reset_argb = 0;
- }
- if (m_pCompData[0].m_ColorKeyMax == 1) {
- set_argb = 0;
- }
- set_argb = FXARGB_TODIB(set_argb);
- reset_argb = FXARGB_TODIB(reset_argb);
- FX_DWORD* dest_scan = (FX_DWORD*)m_pMaskedLine;
- for (int col = 0; col < m_Width; col ++) {
- if (pSrcLine[col / 8] & (1 << (7 - col % 8))) {
- *dest_scan = set_argb;
- } else {
- *dest_scan = reset_argb;
- }
- dest_scan ++;
- }
- return m_pMaskedLine;
- } else {
- FXSYS_memcpy32(m_pLineBuf, pSrcLine, src_pitch);
- }
- return m_pLineBuf;
- }
- if (m_bpc * m_nComponents <= 8) {
- if (m_bpc == 8) {
- FXSYS_memcpy32(m_pLineBuf, pSrcLine, src_pitch);
- } else {
- int src_bit_pos = 0;
- for (int col = 0; col < m_Width; col ++) {
- int color_index = 0;
- for (FX_DWORD color = 0; color < m_nComponents; color ++) {
- int data = _GetBits8(pSrcLine, src_bit_pos, m_bpc);
- color_index |= data << (color * m_bpc);
- src_bit_pos += m_bpc;
- }
- m_pLineBuf[col] = color_index;
- }
- }
- if (m_bColorKey) {
- FX_LPBYTE pDestPixel = m_pMaskedLine;
- FX_LPCBYTE pSrcPixel = m_pLineBuf;
- for (int col = 0; col < m_Width; col ++) {
- FX_BYTE index = *pSrcPixel++;
- if (m_pPalette) {
- *pDestPixel++ = FXARGB_B(m_pPalette[index]);
- *pDestPixel++ = FXARGB_G(m_pPalette[index]);
- *pDestPixel++ = FXARGB_R(m_pPalette[index]);
- } else {
- *pDestPixel++ = index;
- *pDestPixel++ = index;
- *pDestPixel++ = index;
- }
- *pDestPixel = (index < m_pCompData[0].m_ColorKeyMin || index > m_pCompData[0].m_ColorKeyMax) ? 0xff : 0;
- pDestPixel ++ ;
- }
- return m_pMaskedLine;
- }
- return m_pLineBuf;
- }
- if (m_bColorKey) {
- if (m_nComponents == 3 && m_bpc == 8) {
- FX_LPBYTE alpha_channel = m_pMaskedLine + 3;
- for (int col = 0; col < m_Width; col ++) {
- FX_LPCBYTE pPixel = pSrcLine + col * 3;
- alpha_channel[col * 4] = (pPixel[0] < m_pCompData[0].m_ColorKeyMin ||
- pPixel[0] > m_pCompData[0].m_ColorKeyMax ||
- pPixel[1] < m_pCompData[1].m_ColorKeyMin || pPixel[1] > m_pCompData[1].m_ColorKeyMax ||
- pPixel[2] < m_pCompData[2].m_ColorKeyMin || pPixel[2] > m_pCompData[2].m_ColorKeyMax) ? 0xff : 0;
- }
- } else {
- FXSYS_memset8(m_pMaskedLine, 0xff, m_Pitch);
- }
- }
- if (m_pColorSpace) {
- TranslateScanline24bpp(m_pLineBuf, pSrcLine);
- pSrcLine = m_pLineBuf;
- }
- if (m_bColorKey) {
- FX_LPCBYTE pSrcPixel = pSrcLine;
- FX_LPBYTE pDestPixel = m_pMaskedLine;
- for (int col = 0; col < m_Width; col ++) {
- *pDestPixel++ = *pSrcPixel++;
- *pDestPixel++ = *pSrcPixel++;
- *pDestPixel++ = *pSrcPixel++;
- pDestPixel ++;
- }
- return m_pMaskedLine;
- }
- return pSrcLine;
-}
-FX_BOOL CPDF_DIBSource::SkipToScanline(int line, IFX_Pause* pPause) const
-{
- if (m_pDecoder) {
- return m_pDecoder->SkipToScanline(line, pPause);
- }
- return FALSE;
-}
-void CPDF_DIBSource::DownSampleScanline(int line, FX_LPBYTE dest_scan, int dest_bpp,
- int dest_width, FX_BOOL bFlipX, int clip_left, int clip_width) const
-{
- FX_DWORD src_width = m_Width;
- FX_DWORD src_pitch = (src_width * m_bpc * m_nComponents + 7) / 8;
- FX_LPCBYTE pSrcLine = NULL;
- if (m_pCachedBitmap) {
- pSrcLine = m_pCachedBitmap->GetScanline(line);
- } else if (m_pDecoder) {
- pSrcLine = m_pDecoder->GetScanline(line);
- } else {
- if (m_pStreamAcc->GetSize() >= (line + 1) * src_pitch) {
- pSrcLine = m_pStreamAcc->GetData() + line * src_pitch;
- }
- }
- int orig_Bpp = m_bpc * m_nComponents / 8;
- int dest_Bpp = dest_bpp / 8;
- if (pSrcLine == NULL) {
- FXSYS_memset32(dest_scan, 0xff, dest_Bpp * clip_width);
- return;
- }
- CFX_FixedBufGrow<FX_BYTE, 128> temp(orig_Bpp);
- if (m_bpc * m_nComponents == 1) {
- FX_DWORD set_argb = (FX_DWORD) - 1, reset_argb = 0;
- if (m_bImageMask) {
- if (m_bDefaultDecode) {
- set_argb = 0;
- reset_argb = (FX_DWORD) - 1;
- }
- } else if (m_bColorKey) {
- reset_argb = m_pPalette ? m_pPalette[0] : 0xff000000;
- set_argb = m_pPalette ? m_pPalette[1] : 0xffffffff;
- if (m_pCompData[0].m_ColorKeyMin == 0) {
- reset_argb = 0;
- }
- if (m_pCompData[0].m_ColorKeyMax == 1) {
- set_argb = 0;
- }
- set_argb = FXARGB_TODIB(set_argb);
- reset_argb = FXARGB_TODIB(reset_argb);
- for (int i = 0; i < clip_width; i ++) {
- FX_DWORD src_x = (clip_left + i) * src_width / dest_width;
- if (bFlipX) {
- src_x = src_width - src_x - 1;
- }
- src_x %= src_width;
- if (pSrcLine[src_x / 8] & (1 << (7 - src_x % 8))) {
- ((FX_DWORD*)dest_scan)[i] = set_argb;
- } else {
- ((FX_DWORD*)dest_scan)[i] = reset_argb;
- }
- }
- return;
- } else {
- if (dest_Bpp == 1) {
- } else if (m_pPalette) {
- reset_argb = m_pPalette[0];
- set_argb = m_pPalette[1];
- }
- }
- for (int i = 0; i < clip_width; i ++) {
- FX_DWORD src_x = (clip_left + i) * src_width / dest_width;
- if (bFlipX) {
- src_x = src_width - src_x - 1;
- }
- src_x %= src_width;
- int dest_pos = i * dest_Bpp;
- if (pSrcLine[src_x / 8] & (1 << (7 - src_x % 8))) {
- if (dest_Bpp == 1) {
- dest_scan[dest_pos] = (FX_BYTE)set_argb;
- } else if (dest_Bpp == 3) {
- dest_scan[dest_pos] = FXARGB_B(set_argb);
- dest_scan[dest_pos + 1] = FXARGB_G(set_argb);
- dest_scan[dest_pos + 2] = FXARGB_R(set_argb);
- } else {
- *(FX_DWORD*)(dest_scan + dest_pos) = set_argb;
- }
- } else {
- if (dest_Bpp == 1) {
- dest_scan[dest_pos] = (FX_BYTE)reset_argb;
- } else if (dest_Bpp == 3) {
- dest_scan[dest_pos] = FXARGB_B(reset_argb);
- dest_scan[dest_pos + 1] = FXARGB_G(reset_argb);
- dest_scan[dest_pos + 2] = FXARGB_R(reset_argb);
- } else {
- *(FX_DWORD*)(dest_scan + dest_pos) = reset_argb;
- }
- }
- }
- return;
- } else if (m_bpc * m_nComponents <= 8) {
- if (m_bpc < 8) {
- int src_bit_pos = 0;
- for (FX_DWORD col = 0; col < src_width; col ++) {
- int color_index = 0;
- for (FX_DWORD color = 0; color < m_nComponents; color ++) {
- int data = _GetBits8(pSrcLine, src_bit_pos, m_bpc);
- color_index |= data << (color * m_bpc);
- src_bit_pos += m_bpc;
- }
- m_pLineBuf[col] = color_index;
- }
- pSrcLine = m_pLineBuf;
- }
- if (m_bColorKey) {
- for (int i = 0; i < clip_width; i ++) {
- FX_DWORD src_x = (clip_left + i) * src_width / dest_width;
- if (bFlipX) {
- src_x = src_width - src_x - 1;
- }
- src_x %= src_width;
- FX_LPBYTE pDestPixel = dest_scan + i * 4;
- FX_BYTE index = pSrcLine[src_x];
- if (m_pPalette) {
- *pDestPixel++ = FXARGB_B(m_pPalette[index]);
- *pDestPixel++ = FXARGB_G(m_pPalette[index]);
- *pDestPixel++ = FXARGB_R(m_pPalette[index]);
- } else {
- *pDestPixel++ = index;
- *pDestPixel++ = index;
- *pDestPixel++ = index;
- }
- *pDestPixel = (index < m_pCompData[0].m_ColorKeyMin || index > m_pCompData[0].m_ColorKeyMax) ? 0xff : 0;
- }
- return;
- }
- for (int i = 0; i < clip_width; i ++) {
- FX_DWORD src_x = (clip_left + i) * src_width / dest_width;
- if (bFlipX) {
- src_x = src_width - src_x - 1;
- }
- src_x %= src_width;
- FX_BYTE index = pSrcLine[src_x];
- if (dest_Bpp == 1) {
- dest_scan[i] = index;
- } else {
- int dest_pos = i * dest_Bpp;
- FX_ARGB argb = m_pPalette[index];
- dest_scan[dest_pos] = FXARGB_B(argb);
- dest_scan[dest_pos + 1] = FXARGB_G(argb);
- dest_scan[dest_pos + 2] = FXARGB_R(argb);
- }
- }
- return;
- } else {
- int last_src_x = -1;
- FX_ARGB last_argb;
- FX_FLOAT orig_Not8Bpp = (FX_FLOAT)m_bpc * (FX_FLOAT)m_nComponents / 8.0f;
- FX_FLOAT unit_To8Bpc = 255.0f / ((1 << m_bpc) - 1);
- for (int i = 0; i < clip_width; i ++) {
- int dest_x = clip_left + i;
- FX_DWORD src_x = (bFlipX ? (dest_width - dest_x - 1) : dest_x) * (FX_INT64)src_width / dest_width;
- src_x %= src_width;
- FX_LPCBYTE pSrcPixel = NULL;
- if (m_bpc % 8 == 0) {
- pSrcPixel = pSrcLine + src_x * orig_Bpp;
- } else {
- pSrcPixel = pSrcLine + (int)(src_x * orig_Not8Bpp);
- }
- FX_LPBYTE pDestPixel = dest_scan + i * dest_Bpp;
- FX_ARGB argb;
- if (src_x == last_src_x) {
- argb = last_argb;
- } else {
- if (m_pColorSpace) {
- FX_BYTE color[4];
- if (!m_bDefaultDecode) {
- for (int i = 0; i < orig_Bpp; i ++) {
- int color_value = (int)((m_pCompData[i].m_DecodeMin + m_pCompData[i].m_DecodeStep * (FX_FLOAT)pSrcPixel[i]) * 255.0f + 0.5f);
- temp[i] = color_value > 255 ? 255 : (color_value < 0 ? 0 : color_value);
- }
- m_pColorSpace->TranslateImageLine(color, temp, 1, 0, 0, m_bLoadMask && m_GroupFamily == PDFCS_DEVICECMYK && m_Family == PDFCS_DEVICECMYK);
- } else {
- if (m_bpc < 8) {
- int src_bit_pos = 0;
- if (src_x % 2) {
- src_bit_pos = 4;
- }
- int value = (1 << m_bpc) - 1;
- for (FX_DWORD i = 0; i < m_nComponents; i ++) {
- temp[i] = (FX_BYTE)(_GetBits8(pSrcPixel, src_bit_pos, m_bpc) * unit_To8Bpc);
- src_bit_pos += m_bpc;
- }
- m_pColorSpace->TranslateImageLine(color, temp, 1, 0, 0, m_bLoadMask && m_GroupFamily == PDFCS_DEVICECMYK && m_Family == PDFCS_DEVICECMYK);
- } else {
- m_pColorSpace->TranslateImageLine(color, pSrcPixel, 1, 0, 0, m_bLoadMask && m_GroupFamily == PDFCS_DEVICECMYK && m_Family == PDFCS_DEVICECMYK);
- }
- }
- argb = FXARGB_MAKE(0xff, color[2], color[1], color[0]);
- } else {
- argb = FXARGB_MAKE(0xff, pSrcPixel[2], pSrcPixel[1], pSrcPixel[0]);
- }
- if (m_bColorKey) {
- int alpha = 0xff;
- if (m_nComponents == 3 && m_bpc == 8) {
- alpha = (pSrcPixel[0] < m_pCompData[0].m_ColorKeyMin ||
- pSrcPixel[0] > m_pCompData[0].m_ColorKeyMax ||
- pSrcPixel[1] < m_pCompData[1].m_ColorKeyMin ||
- pSrcPixel[1] > m_pCompData[1].m_ColorKeyMax ||
- pSrcPixel[2] < m_pCompData[2].m_ColorKeyMin ||
- pSrcPixel[2] > m_pCompData[2].m_ColorKeyMax) ? 0xff : 0;
- }
- argb &= 0xffffff;
- argb |= alpha << 24;
- }
- last_src_x = src_x;
- last_argb = argb;
- }
- if (dest_Bpp == 4) {
- *(FX_DWORD*)pDestPixel = FXARGB_TODIB(argb);
- } else {
- *pDestPixel++ = FXARGB_B(argb);
- *pDestPixel++ = FXARGB_G(argb);
- *pDestPixel = FXARGB_R(argb);
- }
- }
- }
-}
-void CPDF_DIBSource::SetDownSampleSize(int dest_width, int dest_height) const
-{
- if (m_pDecoder) {
- m_pDecoder->DownScale(dest_width, dest_height);
- ((CPDF_DIBSource*)this)->m_Width = m_pDecoder->GetWidth();
- ((CPDF_DIBSource*)this)->m_Height = m_pDecoder->GetHeight();
- }
-}
-void CPDF_DIBSource::ClearImageData()
-{
- if (m_pDecoder) {
- m_pDecoder->ClearImageData();
- }
-}
-CPDF_ProgressiveImageLoaderHandle::CPDF_ProgressiveImageLoaderHandle()
-{
- m_pImageLoader = NULL;
- m_pCache = NULL;
- m_pImage = NULL;
-}
-CPDF_ProgressiveImageLoaderHandle::~CPDF_ProgressiveImageLoaderHandle()
-{
- m_pImageLoader = NULL;
- m_pCache = NULL;
- m_pImage = NULL;
-}
-FX_BOOL CPDF_ProgressiveImageLoaderHandle::Start(CPDF_ImageLoader* pImageLoader, const CPDF_ImageObject* pImage, CPDF_PageRenderCache* pCache, FX_BOOL bStdCS, FX_DWORD GroupFamily, FX_BOOL bLoadMask, CPDF_RenderStatus* pRenderStatus, FX_INT32 nDownsampleWidth, FX_INT32 nDownsampleHeight)
-{
- m_pImageLoader = pImageLoader;
- m_pCache = pCache;
- m_pImage = (CPDF_ImageObject*)pImage;
- m_nDownsampleWidth = nDownsampleWidth;
- m_nDownsampleHeight = nDownsampleHeight;
- FX_BOOL ret;
- if (pCache) {
- ret = pCache->StartGetCachedBitmap(pImage->m_pImage->GetStream(), bStdCS, GroupFamily, bLoadMask, pRenderStatus, m_nDownsampleWidth, m_nDownsampleHeight);
- if (ret == FALSE) {
- m_pImageLoader->m_bCached = TRUE;
- m_pImageLoader->m_pBitmap = pCache->m_pCurImageCache->DetachBitmap();
- m_pImageLoader->m_pMask = pCache->m_pCurImageCache->DetachMask();
- m_pImageLoader->m_MatteColor = pCache->m_pCurImageCache->m_MatteColor;
- }
- } else {
- ret = pImage->m_pImage->StartLoadDIBSource(pRenderStatus->m_pFormResource, pRenderStatus->m_pPageResource, bStdCS, GroupFamily, bLoadMask);
- if (ret == FALSE) {
- m_pImageLoader->m_bCached = FALSE;
- m_pImageLoader->m_pBitmap = m_pImage->m_pImage->DetachBitmap();
- m_pImageLoader->m_pMask = m_pImage->m_pImage->DetachMask();
- m_pImageLoader->m_MatteColor = m_pImage->m_pImage->m_MatteColor;
- }
- }
- return ret;
-}
-FX_BOOL CPDF_ProgressiveImageLoaderHandle::Continue(IFX_Pause* pPause)
-{
- FX_BOOL ret;
- if (m_pCache) {
- ret = m_pCache->Continue(pPause);
- if (ret == FALSE) {
- m_pImageLoader->m_bCached = TRUE;
- m_pImageLoader->m_pBitmap = m_pCache->m_pCurImageCache->DetachBitmap();
- m_pImageLoader->m_pMask = m_pCache->m_pCurImageCache->DetachMask();
- m_pImageLoader->m_MatteColor = m_pCache->m_pCurImageCache->m_MatteColor;
- }
- } else {
- ret = m_pImage->m_pImage->Continue(pPause);
- if (ret == FALSE) {
- m_pImageLoader->m_bCached = FALSE;
- m_pImageLoader->m_pBitmap = m_pImage->m_pImage->DetachBitmap();
- m_pImageLoader->m_pMask = m_pImage->m_pImage->DetachMask();
- m_pImageLoader->m_MatteColor = m_pImage->m_pImage->m_MatteColor;
- }
- }
- return ret;
-}
-FX_BOOL CPDF_ImageLoader::Load(const CPDF_ImageObject* pImage, CPDF_PageRenderCache* pCache, FX_BOOL bStdCS, FX_DWORD GroupFamily, FX_BOOL bLoadMask, CPDF_RenderStatus* pRenderStatus)
-{
- if (pImage == NULL) {
- return FALSE;
- }
- if (pCache) {
- pCache->GetCachedBitmap(pImage->m_pImage->GetStream(), m_pBitmap, m_pMask, m_MatteColor, bStdCS, GroupFamily, bLoadMask, pRenderStatus, m_nDownsampleWidth, m_nDownsampleHeight);
- m_bCached = TRUE;
- } else {
- m_pBitmap = pImage->m_pImage->LoadDIBSource(&m_pMask, &m_MatteColor, bStdCS, GroupFamily, bLoadMask);
- m_bCached = FALSE;
- }
- return FALSE;
-}
-FX_BOOL CPDF_ImageLoader::StartLoadImage(const CPDF_ImageObject* pImage, CPDF_PageRenderCache* pCache, FX_LPVOID& LoadHandle, FX_BOOL bStdCS, FX_DWORD GroupFamily, FX_BOOL bLoadMask, CPDF_RenderStatus* pRenderStatus, FX_INT32 nDownsampleWidth, FX_INT32 nDownsampleHeight)
-{
- m_nDownsampleWidth = nDownsampleWidth;
- m_nDownsampleHeight = nDownsampleHeight;
- CPDF_ProgressiveImageLoaderHandle* pLoaderHandle = NULL;
- pLoaderHandle = FX_NEW CPDF_ProgressiveImageLoaderHandle;
- FX_BOOL ret = pLoaderHandle->Start(this, pImage, pCache, bStdCS, GroupFamily, bLoadMask, pRenderStatus, m_nDownsampleWidth, m_nDownsampleHeight);
- LoadHandle = pLoaderHandle;
- return ret;
-}
-FX_BOOL CPDF_ImageLoader::Continue(FX_LPVOID LoadHandle, IFX_Pause* pPause)
-{
- return ((CPDF_ProgressiveImageLoaderHandle*)LoadHandle)->Continue(pPause);
-}
-CPDF_ImageLoader::~CPDF_ImageLoader()
-{
- if (!m_bCached) {
- if (m_pBitmap) {
- delete m_pBitmap;
- m_pBitmap = NULL;
- }
- if (m_pMask) {
- delete m_pMask;
- }
- }
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxge/fx_ge.h"
+#include "../../../include/fxcodec/fx_codec.h"
+#include "../../../include/fpdfapi/fpdf_module.h"
+#include "../../../include/fpdfapi/fpdf_render.h"
+#include "../../../include/fpdfapi/fpdf_pageobj.h"
+#include "../fpdf_page/pageint.h"
+#include "render_int.h"
+#include <limits.h>
+static unsigned int _GetBits8(FX_LPCBYTE pData, int bitpos, int nbits)
+{
+ unsigned int byte = pData[bitpos / 8];
+ if (nbits == 8) {
+ return byte;
+ } else if (nbits == 4) {
+ return (bitpos % 8) ? (byte & 0x0f) : (byte >> 4);
+ } else if (nbits == 2) {
+ return (byte >> (6 - bitpos % 8)) & 0x03;
+ } else if (nbits == 1) {
+ return (byte >> (7 - bitpos % 8)) & 0x01;
+ } else if (nbits == 16) {
+ return byte * 256 + pData[bitpos / 8 + 1];
+ }
+ return 0;
+}
+CFX_DIBSource* CPDF_Image::LoadDIBSource(CFX_DIBSource** ppMask, FX_DWORD* pMatteColor, FX_BOOL bStdCS, FX_DWORD GroupFamily, FX_BOOL bLoadMask) const
+{
+ CPDF_DIBSource* pSource = FX_NEW CPDF_DIBSource;
+ if (pSource->Load(m_pDocument, m_pStream, (CPDF_DIBSource**)ppMask, pMatteColor, NULL, NULL, bStdCS, GroupFamily, bLoadMask)) {
+ return pSource;
+ }
+ delete pSource;
+ return NULL;
+}
+CFX_DIBSource* CPDF_Image::DetachBitmap()
+{
+ CFX_DIBSource* pBitmap = m_pDIBSource;
+ m_pDIBSource = NULL;
+ return pBitmap;
+}
+CFX_DIBSource* CPDF_Image::DetachMask()
+{
+ CFX_DIBSource* pBitmap = m_pMask;
+ m_pMask = NULL;
+ return pBitmap;
+}
+FX_BOOL CPDF_Image::StartLoadDIBSource(CPDF_Dictionary* pFormResource, CPDF_Dictionary* pPageResource, FX_BOOL bStdCS, FX_DWORD GroupFamily, FX_BOOL bLoadMask)
+{
+ m_pDIBSource = FX_NEW CPDF_DIBSource;
+ int ret = ((CPDF_DIBSource*)m_pDIBSource)->StartLoadDIBSource(m_pDocument, m_pStream, TRUE, pFormResource, pPageResource, bStdCS, GroupFamily, bLoadMask);
+ if (ret == 2) {
+ return TRUE;
+ }
+ if (!ret) {
+ delete m_pDIBSource;
+ m_pDIBSource = NULL;
+ return FALSE;
+ }
+ m_pMask = ((CPDF_DIBSource*)m_pDIBSource)->DetachMask();
+ m_MatteColor = ((CPDF_DIBSource*)m_pDIBSource)->m_MatteColor;
+ return FALSE;
+}
+FX_BOOL CPDF_Image::Continue(IFX_Pause* pPause)
+{
+ int ret = ((CPDF_DIBSource*)m_pDIBSource)->ContinueLoadDIBSource(pPause);
+ if (ret == 2) {
+ return TRUE;
+ }
+ if (!ret) {
+ delete m_pDIBSource;
+ m_pDIBSource = NULL;
+ return FALSE;
+ }
+ m_pMask = ((CPDF_DIBSource*)m_pDIBSource)->DetachMask();
+ m_MatteColor = ((CPDF_DIBSource*)m_pDIBSource)->m_MatteColor;
+ return FALSE;
+}
+CPDF_DIBSource::CPDF_DIBSource()
+{
+ m_pDocument = NULL;
+ m_pStreamAcc = NULL;
+ m_pDict = NULL;
+ m_bpp = 0;
+ m_Width = m_Height = 0;
+ m_pColorSpace = NULL;
+ m_bDefaultDecode = TRUE;
+ m_bImageMask = FALSE;
+ m_pPalette = NULL;
+ m_pCompData = NULL;
+ m_bColorKey = FALSE;
+ m_pMaskedLine = m_pLineBuf = NULL;
+ m_pCachedBitmap = NULL;
+ m_pDecoder = NULL;
+ m_nComponents = 0;
+ m_bpc = 0;
+ m_bLoadMask = FALSE;
+ m_Family = 0;
+ m_pMask = NULL;
+ m_MatteColor = 0;
+ m_pJbig2Context = NULL;
+ m_pGlobalStream = NULL;
+ m_bStdCS = FALSE;
+ m_pMaskStream = NULL;
+ m_Status = 0;
+ m_bHasMask = FALSE;
+}
+CPDF_DIBSource::~CPDF_DIBSource()
+{
+ if (m_pStreamAcc) {
+ delete m_pStreamAcc;
+ }
+ if (m_pMaskedLine) {
+ FX_Free(m_pMaskedLine);
+ }
+ if (m_pLineBuf) {
+ FX_Free(m_pLineBuf);
+ }
+ if (m_pCachedBitmap) {
+ delete m_pCachedBitmap;
+ }
+ if (m_pDecoder) {
+ delete m_pDecoder;
+ }
+ if (m_pCompData) {
+ FX_Free(m_pCompData);
+ }
+ CPDF_ColorSpace* pCS = m_pColorSpace;
+ if (pCS && m_pDocument) {
+ m_pDocument->GetPageData()->ReleaseColorSpace(pCS->GetArray());
+ }
+ if (m_pJbig2Context) {
+ ICodec_Jbig2Module* pJbig2Moudle = CPDF_ModuleMgr::Get()->GetJbig2Module();
+ pJbig2Moudle->DestroyJbig2Context(m_pJbig2Context);
+ m_pJbig2Context = NULL;
+ }
+ if (m_pGlobalStream) {
+ delete m_pGlobalStream;
+ }
+ m_pGlobalStream = NULL;
+}
+CFX_DIBitmap* CPDF_DIBSource::GetBitmap() const
+{
+ if (m_pCachedBitmap) {
+ return m_pCachedBitmap;
+ }
+ return Clone();
+}
+void CPDF_DIBSource::ReleaseBitmap(CFX_DIBitmap* pBitmap) const
+{
+ if (pBitmap && pBitmap != m_pCachedBitmap) {
+ delete pBitmap;
+ }
+}
+FX_BOOL CPDF_DIBSource::Load(CPDF_Document* pDoc, const CPDF_Stream* pStream, CPDF_DIBSource** ppMask,
+ FX_DWORD* pMatteColor, CPDF_Dictionary* pFormResources, CPDF_Dictionary* pPageResources, FX_BOOL bStdCS, FX_DWORD GroupFamily, FX_BOOL bLoadMask)
+{
+ if (pStream == NULL) {
+ return FALSE;
+ }
+ m_pDocument = pDoc;
+ m_pDict = pStream->GetDict();
+ m_pStream = pStream;
+ m_Width = m_pDict->GetInteger(FX_BSTRC("Width"));
+ m_Height = m_pDict->GetInteger(FX_BSTRC("Height"));
+ if (m_Width <= 0 || m_Height <= 0 || m_Width > 0x01ffff || m_Height > 0x01ffff) {
+ return FALSE;
+ }
+ m_GroupFamily = GroupFamily;
+ m_bLoadMask = bLoadMask;
+ if (!LoadColorInfo(m_pStream->GetObjNum() != 0 ? NULL : pFormResources, pPageResources)) {
+ return FALSE;
+ }
+ FX_DWORD src_pitch = m_bpc;
+ if (m_bpc != 0 && m_nComponents != 0) {
+ if (src_pitch > 0 && m_nComponents > (unsigned)INT_MAX / src_pitch) {
+ return FALSE;
+ }
+ src_pitch *= m_nComponents;
+ if (src_pitch > 0 && (FX_DWORD)m_Width > (unsigned)INT_MAX / src_pitch) {
+ return FALSE;
+ }
+ src_pitch *= m_Width;
+ if (src_pitch + 7 < src_pitch) {
+ return FALSE;
+ }
+ src_pitch += 7;
+ src_pitch /= 8;
+ if (src_pitch > 0 && (FX_DWORD)m_Height > (unsigned)INT_MAX / src_pitch) {
+ return FALSE;
+ }
+ }
+ m_pStreamAcc = FX_NEW CPDF_StreamAcc;
+ m_pStreamAcc->LoadAllData(pStream, FALSE, m_Height * src_pitch, TRUE);
+ if (m_pStreamAcc->GetSize() == 0 || m_pStreamAcc->GetData() == NULL) {
+ return FALSE;
+ }
+ const CFX_ByteString& decoder = m_pStreamAcc->GetImageDecoder();
+ if (!decoder.IsEmpty() && decoder == FX_BSTRC("CCITTFaxDecode")) {
+ m_bpc = 1;
+ }
+ if (!CreateDecoder()) {
+ return FALSE;
+ }
+ if (m_bImageMask) {
+ m_bpp = 1;
+ m_bpc = 1;
+ m_nComponents = 1;
+ m_AlphaFlag = 1;
+ } else if (m_bpc * m_nComponents == 1) {
+ m_bpp = 1;
+ } else if (m_bpc * m_nComponents <= 8) {
+ m_bpp = 8;
+ } else {
+ m_bpp = 24;
+ }
+ if (!m_bpc || !m_nComponents) {
+ return FALSE;
+ }
+ m_Pitch = m_Width;
+ if ((FX_DWORD)m_bpp > (unsigned)INT_MAX / m_Pitch) {
+ return FALSE;
+ }
+ m_Pitch *= m_bpp;
+ if (m_Pitch + 31 < m_Pitch) {
+ return FALSE;
+ }
+ m_Pitch += 31;
+ m_Pitch = m_Pitch / 32 * 4;
+ m_pLineBuf = FX_Alloc(FX_BYTE, m_Pitch);
+ if (m_pColorSpace && bStdCS) {
+ m_pColorSpace->EnableStdConversion(TRUE);
+ }
+ LoadPalette();
+ if (m_bColorKey) {
+ m_bpp = 32;
+ m_AlphaFlag = 2;
+ m_Pitch = m_Width;
+ if ((FX_DWORD)m_bpp > (unsigned)INT_MAX / m_Pitch) {
+ return FALSE;
+ }
+ m_Pitch *= m_bpp;
+ if (m_Pitch + 31 < m_Pitch) {
+ return FALSE;
+ }
+ m_Pitch += 31;
+ m_Pitch = m_Pitch / 32 * 4;
+ m_pMaskedLine = FX_Alloc(FX_BYTE, m_Pitch);
+ }
+ if (ppMask) {
+ *ppMask = LoadMask(*pMatteColor);
+ }
+ if (m_pColorSpace && bStdCS) {
+ m_pColorSpace->EnableStdConversion(FALSE);
+ }
+ return TRUE;
+}
+int CPDF_DIBSource::ContinueToLoadMask()
+{
+ if (m_bImageMask) {
+ m_bpp = 1;
+ m_bpc = 1;
+ m_nComponents = 1;
+ m_AlphaFlag = 1;
+ } else if (m_bpc * m_nComponents == 1) {
+ m_bpp = 1;
+ } else if (m_bpc * m_nComponents <= 8) {
+ m_bpp = 8;
+ } else {
+ m_bpp = 24;
+ }
+ if (!m_bpc || !m_nComponents) {
+ return 0;
+ }
+ m_Pitch = m_Width;
+ if ((FX_DWORD)m_bpp > (unsigned)INT_MAX / m_Pitch) {
+ return 0;
+ }
+ m_Pitch *= m_bpp;
+ if (m_Pitch + 31 < m_Pitch) {
+ return 0;
+ }
+ m_Pitch += 31;
+ m_Pitch = m_Pitch / 32 * 4;
+ m_pLineBuf = FX_Alloc(FX_BYTE, m_Pitch);
+ if (m_pColorSpace && m_bStdCS) {
+ m_pColorSpace->EnableStdConversion(TRUE);
+ }
+ LoadPalette();
+ if (m_bColorKey) {
+ m_bpp = 32;
+ m_AlphaFlag = 2;
+ m_Pitch = m_Width;
+ if ((FX_DWORD)m_bpp > (unsigned)INT_MAX / m_Pitch) {
+ return 0;
+ }
+ m_Pitch *= m_bpp;
+ if (m_Pitch + 31 < m_Pitch) {
+ return 0;
+ }
+ m_Pitch += 31;
+ m_Pitch = m_Pitch / 32 * 4;
+ m_pMaskedLine = FX_Alloc(FX_BYTE, m_Pitch);
+ }
+ return 1;
+}
+int CPDF_DIBSource::StartLoadDIBSource(CPDF_Document* pDoc, const CPDF_Stream* pStream, FX_BOOL bHasMask,
+ CPDF_Dictionary* pFormResources, CPDF_Dictionary* pPageResources,
+ FX_BOOL bStdCS, FX_DWORD GroupFamily, FX_BOOL bLoadMask)
+{
+ if (pStream == NULL) {
+ return 0;
+ }
+ m_pDocument = pDoc;
+ m_pDict = pStream->GetDict();
+ m_pStream = pStream;
+ m_bStdCS = bStdCS;
+ m_bHasMask = bHasMask;
+ m_Width = m_pDict->GetInteger(FX_BSTRC("Width"));
+ m_Height = m_pDict->GetInteger(FX_BSTRC("Height"));
+ if (m_Width <= 0 || m_Height <= 0 || m_Width > 0x01ffff || m_Height > 0x01ffff) {
+ return 0;
+ }
+ m_GroupFamily = GroupFamily;
+ m_bLoadMask = bLoadMask;
+ if (!LoadColorInfo(m_pStream->GetObjNum() != 0 ? NULL : pFormResources, pPageResources)) {
+ return 0;
+ }
+ FX_DWORD src_pitch = m_bpc;
+ if (m_bpc != 0 && m_nComponents != 0) {
+ if (src_pitch > 0 && m_nComponents > (unsigned)INT_MAX / src_pitch) {
+ return 0;
+ }
+ src_pitch *= m_nComponents;
+ if (src_pitch > 0 && (FX_DWORD)m_Width > (unsigned)INT_MAX / src_pitch) {
+ return 0;
+ }
+ src_pitch *= m_Width;
+ if (src_pitch + 7 < src_pitch) {
+ return 0;
+ }
+ src_pitch += 7;
+ src_pitch /= 8;
+ if (src_pitch > 0 && (FX_DWORD)m_Height > (unsigned)INT_MAX / src_pitch) {
+ return 0;
+ }
+ }
+ m_pStreamAcc = FX_NEW CPDF_StreamAcc;
+ m_pStreamAcc->LoadAllData(pStream, FALSE, m_Height * src_pitch, TRUE);
+ if (m_pStreamAcc->GetSize() == 0 || m_pStreamAcc->GetData() == NULL) {
+ return 0;
+ }
+ const CFX_ByteString& decoder = m_pStreamAcc->GetImageDecoder();
+ if (!decoder.IsEmpty() && decoder == FX_BSTRC("CCITTFaxDecode")) {
+ m_bpc = 1;
+ }
+ int ret = CreateDecoder();
+ if (ret != 1) {
+ if (!ret) {
+ return ret;
+ }
+ if (!ContinueToLoadMask()) {
+ return 0;
+ }
+ if (m_bHasMask) {
+ StratLoadMask();
+ }
+ return ret;
+ }
+ if (!ContinueToLoadMask()) {
+ return 0;
+ }
+ if (m_bHasMask) {
+ ret = StratLoadMask();
+ }
+ if (ret == 2) {
+ return ret;
+ }
+ if (m_pColorSpace && m_bStdCS) {
+ m_pColorSpace->EnableStdConversion(FALSE);
+ }
+ return ret;
+}
+int CPDF_DIBSource::ContinueLoadDIBSource(IFX_Pause* pPause)
+{
+ FXCODEC_STATUS ret;
+ if (m_Status == 1) {
+ const CFX_ByteString& decoder = m_pStreamAcc->GetImageDecoder();
+ if (decoder == FX_BSTRC("JPXDecode")) {
+ return 0;
+ }
+ ICodec_Jbig2Module* pJbig2Moudle = CPDF_ModuleMgr::Get()->GetJbig2Module();
+ if (m_pJbig2Context == NULL) {
+ m_pJbig2Context = pJbig2Moudle->CreateJbig2Context();
+ if (m_pStreamAcc->GetImageParam()) {
+ CPDF_Stream* pGlobals = m_pStreamAcc->GetImageParam()->GetStream(FX_BSTRC("JBIG2Globals"));
+ if (pGlobals) {
+ m_pGlobalStream = FX_NEW CPDF_StreamAcc;
+ m_pGlobalStream->LoadAllData(pGlobals, FALSE);
+ }
+ }
+ ret = pJbig2Moudle->StartDecode(m_pJbig2Context, m_Width, m_Height, m_pStreamAcc->GetData(), m_pStreamAcc->GetSize(),
+ m_pGlobalStream ? m_pGlobalStream->GetData() : NULL, m_pGlobalStream ? m_pGlobalStream->GetSize() : 0, m_pCachedBitmap->GetBuffer(),
+ m_pCachedBitmap->GetPitch(), pPause);
+ if (ret < 0) {
+ delete m_pCachedBitmap;
+ m_pCachedBitmap = NULL;
+ if (m_pGlobalStream) {
+ delete m_pGlobalStream;
+ }
+ m_pGlobalStream = NULL;
+ pJbig2Moudle->DestroyJbig2Context(m_pJbig2Context);
+ m_pJbig2Context = NULL;
+ return 0;
+ }
+ if (ret == FXCODEC_STATUS_DECODE_TOBECONTINUE) {
+ return 2;
+ }
+ int ret1 = 1;
+ if (m_bHasMask) {
+ ret1 = ContinueLoadMaskDIB(pPause);
+ m_Status = 2;
+ }
+ if (ret1 == 2) {
+ return ret1;
+ }
+ if (m_pColorSpace && m_bStdCS) {
+ m_pColorSpace->EnableStdConversion(FALSE);
+ }
+ return ret1;
+ }
+ FXCODEC_STATUS ret = pJbig2Moudle->ContinueDecode(m_pJbig2Context, pPause);
+ if (ret < 0) {
+ delete m_pCachedBitmap;
+ m_pCachedBitmap = NULL;
+ if (m_pGlobalStream) {
+ delete m_pGlobalStream;
+ }
+ m_pGlobalStream = NULL;
+ pJbig2Moudle->DestroyJbig2Context(m_pJbig2Context);
+ m_pJbig2Context = NULL;
+ return 0;
+ }
+ if (ret == FXCODEC_STATUS_DECODE_TOBECONTINUE) {
+ return 2;
+ }
+ int ret1 = 1;
+ if (m_bHasMask) {
+ ret1 = ContinueLoadMaskDIB(pPause);
+ m_Status = 2;
+ }
+ if (ret1 == 2) {
+ return ret1;
+ }
+ if (m_pColorSpace && m_bStdCS) {
+ m_pColorSpace->EnableStdConversion(FALSE);
+ }
+ return ret1;
+ } else if (m_Status == 2) {
+ return ContinueLoadMaskDIB(pPause);
+ }
+ return 0;
+}
+FX_BOOL CPDF_DIBSource::LoadColorInfo(CPDF_Dictionary* pFormResources, CPDF_Dictionary* pPageResources)
+{
+ if (m_pDict->GetInteger("ImageMask")) {
+ m_bImageMask = TRUE;
+ }
+ if (m_bImageMask || !m_pDict->KeyExist(FX_BSTRC("ColorSpace"))) {
+ if (!m_bImageMask) {
+ CPDF_Object* pFilter = m_pDict->GetElementValue(FX_BSTRC("Filter"));
+ if (pFilter) {
+ CFX_ByteString filter;
+ if (pFilter->GetType() == PDFOBJ_NAME) {
+ filter = pFilter->GetString();
+ if (filter == FX_BSTRC("JPXDecode")) {
+ return TRUE;
+ }
+ } else if (pFilter->GetType() == PDFOBJ_ARRAY) {
+ CPDF_Array* pArray = (CPDF_Array*)pFilter;
+ if (pArray->GetString(pArray->GetCount() - 1) == FX_BSTRC("JPXDecode")) {
+ return TRUE;
+ }
+ }
+ }
+ }
+ m_bImageMask = TRUE;
+ m_bpc = m_nComponents = 1;
+ CPDF_Array* pDecode = m_pDict->GetArray(FX_BSTRC("Decode"));
+ m_bDefaultDecode = pDecode == NULL || pDecode->GetInteger(0) == 0;
+ return TRUE;
+ }
+ CPDF_Object* pCSObj = m_pDict->GetElementValue(FX_BSTRC("ColorSpace"));
+ if (pCSObj == NULL) {
+ return FALSE;
+ }
+ CPDF_DocPageData* pDocPageData = m_pDocument->GetPageData();
+ if (pFormResources) {
+ m_pColorSpace = pDocPageData->GetColorSpace(pCSObj, pFormResources);
+ }
+ if (m_pColorSpace == NULL) {
+ m_pColorSpace = pDocPageData->GetColorSpace(pCSObj, pPageResources);
+ }
+ if (m_pColorSpace == NULL) {
+ return FALSE;
+ }
+ m_bpc = m_pDict->GetInteger(FX_BSTRC("BitsPerComponent"));
+ m_Family = m_pColorSpace->GetFamily();
+ m_nComponents = m_pColorSpace->CountComponents();
+ if (m_Family == PDFCS_ICCBASED && pCSObj->GetType() == PDFOBJ_NAME) {
+ CFX_ByteString cs = pCSObj->GetString();
+ if (cs == FX_BSTRC("DeviceGray")) {
+ m_nComponents = 1;
+ } else if (cs == FX_BSTRC("DeviceRGB")) {
+ m_nComponents = 3;
+ } else if (cs == FX_BSTRC("DeviceCMYK")) {
+ m_nComponents = 4;
+ }
+ }
+ m_pCompData = FX_Alloc(DIB_COMP_DATA, m_nComponents);
+ if (m_bpc == 0) {
+ return TRUE;
+ }
+ int max_data = (1 << m_bpc) - 1;
+ CPDF_Array* pDecode = m_pDict->GetArray(FX_BSTRC("Decode"));
+ if (pDecode) {
+ for (FX_DWORD i = 0; i < m_nComponents; i ++) {
+ m_pCompData[i].m_DecodeMin = pDecode->GetNumber(i * 2);
+ FX_FLOAT max = pDecode->GetNumber(i * 2 + 1);
+ m_pCompData[i].m_DecodeStep = (max - m_pCompData[i].m_DecodeMin) / max_data;
+ FX_FLOAT def_value, def_min, def_max;
+ m_pColorSpace->GetDefaultValue(i, def_value, def_min, def_max);
+ if (m_Family == PDFCS_INDEXED) {
+ def_max = (FX_FLOAT)max_data;
+ }
+ if (def_min != m_pCompData[i].m_DecodeMin || def_max != max) {
+ m_bDefaultDecode = FALSE;
+ }
+ }
+ } else {
+ for (FX_DWORD i = 0; i < m_nComponents; i ++) {
+ FX_FLOAT def_value;
+ m_pColorSpace->GetDefaultValue(i, def_value, m_pCompData[i].m_DecodeMin, m_pCompData[i].m_DecodeStep);
+ if (m_Family == PDFCS_INDEXED) {
+ m_pCompData[i].m_DecodeStep = (FX_FLOAT)max_data;
+ }
+ m_pCompData[i].m_DecodeStep = (m_pCompData[i].m_DecodeStep - m_pCompData[i].m_DecodeMin) / max_data;
+ }
+ }
+ if (!m_pDict->KeyExist(FX_BSTRC("SMask"))) {
+ CPDF_Object* pMask = m_pDict->GetElementValue(FX_BSTRC("Mask"));
+ if (pMask == NULL) {
+ return TRUE;
+ }
+ if (pMask->GetType() == PDFOBJ_ARRAY) {
+ CPDF_Array* pArray = (CPDF_Array*)pMask;
+ if (pArray->GetCount() >= m_nComponents * 2)
+ for (FX_DWORD i = 0; i < m_nComponents * 2; i ++) {
+ if (i % 2) {
+ m_pCompData[i / 2].m_ColorKeyMax = pArray->GetInteger(i);
+ } else {
+ m_pCompData[i / 2].m_ColorKeyMin = pArray->GetInteger(i);
+ }
+ }
+ m_bColorKey = TRUE;
+ }
+ }
+ return TRUE;
+}
+ICodec_ScanlineDecoder* FPDFAPI_CreateFaxDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,
+ const CPDF_Dictionary* pParams);
+ICodec_ScanlineDecoder* FPDFAPI_CreateFlateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,
+ int nComps, int bpc, const CPDF_Dictionary* pParams);
+int CPDF_DIBSource::CreateDecoder()
+{
+ const CFX_ByteString& decoder = m_pStreamAcc->GetImageDecoder();
+ if (decoder.IsEmpty()) {
+ return 1;
+ }
+ FX_LPCBYTE src_data = m_pStreamAcc->GetData();
+ FX_DWORD src_size = m_pStreamAcc->GetSize();
+ const CPDF_Dictionary* pParams = m_pStreamAcc->GetImageParam();
+ if (decoder == FX_BSTRC("CCITTFaxDecode")) {
+ m_pDecoder = FPDFAPI_CreateFaxDecoder(src_data, src_size, m_Width, m_Height, pParams);
+ } else if (decoder == FX_BSTRC("DCTDecode")) {
+ m_pDecoder = CPDF_ModuleMgr::Get()->GetJpegModule()->CreateDecoder(src_data, src_size, m_Width, m_Height,
+ m_nComponents, pParams ? pParams->GetInteger(FX_BSTR("ColorTransform"), 1) : 1);
+ if (NULL == m_pDecoder) {
+ FX_BOOL bTransform = FALSE;
+ int comps, bpc;
+ ICodec_JpegModule* pJpegModule = CPDF_ModuleMgr::Get()->GetJpegModule();
+ if (pJpegModule->LoadInfo(src_data, src_size, m_Width, m_Height, comps, bpc, bTransform)) {
+ m_nComponents = comps;
+ m_bpc = bpc;
+ m_pDecoder = CPDF_ModuleMgr::Get()->GetJpegModule()->CreateDecoder(src_data, src_size, m_Width, m_Height,
+ m_nComponents, bTransform);
+ }
+ }
+ } else if (decoder == FX_BSTRC("FlateDecode")) {
+ m_pDecoder = FPDFAPI_CreateFlateDecoder(src_data, src_size, m_Width, m_Height, m_nComponents, m_bpc, pParams);
+ } else if (decoder == FX_BSTRC("JPXDecode")) {
+ LoadJpxBitmap();
+ return m_pCachedBitmap != NULL ? 1 : 0;
+ } else if (decoder == FX_BSTRC("JBIG2Decode")) {
+ m_pCachedBitmap = FX_NEW CFX_DIBitmap;
+ if (!m_pCachedBitmap->Create(m_Width, m_Height, m_bImageMask ? FXDIB_1bppMask : FXDIB_1bppRgb)) {
+ delete m_pCachedBitmap;
+ m_pCachedBitmap = NULL;
+ return 0;
+ }
+ m_Status = 1;
+ return 2;
+ } else if (decoder == FX_BSTRC("RunLengthDecode")) {
+ m_pDecoder = CPDF_ModuleMgr::Get()->GetCodecModule()->GetBasicModule()->CreateRunLengthDecoder(src_data, src_size, m_Width, m_Height, m_nComponents, m_bpc);
+ }
+ if (m_pDecoder) {
+ int requested_pitch = (m_Width * m_nComponents * m_bpc + 7) / 8;
+ int provided_pitch = (m_pDecoder->GetWidth() * m_pDecoder->CountComps() * m_pDecoder->GetBPC() + 7) / 8;
+ if (provided_pitch < requested_pitch) {
+ return 0;
+ }
+ return 1;
+ }
+ return 0;
+}
+void CPDF_DIBSource::LoadJpxBitmap()
+{
+ ICodec_JpxModule* pJpxModule = CPDF_ModuleMgr::Get()->GetJpxModule();
+ if (pJpxModule == NULL) {
+ return;
+ }
+ FX_LPVOID ctx = pJpxModule->CreateDecoder(m_pStreamAcc->GetData(), m_pStreamAcc->GetSize(), m_pColorSpace != NULL);
+ if (ctx == NULL) {
+ return;
+ }
+ FX_DWORD width = 0, height = 0, codestream_nComps = 0, image_nComps = 0;
+ pJpxModule->GetImageInfo(ctx, width, height, codestream_nComps, image_nComps);
+ if ((int)width < m_Width || (int)height < m_Height) {
+ pJpxModule->DestroyDecoder(ctx);
+ return;
+ }
+ int output_nComps;
+ FX_BOOL bTranslateColor, bSwapRGB = FALSE;
+ if (m_pColorSpace) {
+ if (codestream_nComps != (FX_DWORD)m_pColorSpace->CountComponents()) {
+ return;
+ }
+ output_nComps = codestream_nComps;
+ bTranslateColor = FALSE;
+ if (m_pColorSpace == CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB)) {
+ bSwapRGB = TRUE;
+ m_pColorSpace = NULL;
+ }
+ } else {
+ bTranslateColor = TRUE;
+ if (image_nComps) {
+ output_nComps = image_nComps;
+ } else {
+ output_nComps = codestream_nComps;
+ }
+ if (output_nComps == 3) {
+ bSwapRGB = TRUE;
+ } else if (output_nComps == 4) {
+ m_pColorSpace = CPDF_ColorSpace::GetStockCS(PDFCS_DEVICECMYK);
+ bTranslateColor = FALSE;
+ }
+ m_nComponents = output_nComps;
+ }
+ FXDIB_Format format;
+ if (output_nComps == 1) {
+ format = FXDIB_8bppRgb;
+ } else if (output_nComps <= 3) {
+ format = FXDIB_Rgb;
+ } else if (output_nComps == 4) {
+ format = FXDIB_Rgb32;
+ } else {
+ width = (width * output_nComps + 2) / 3;
+ format = FXDIB_Rgb;
+ }
+ m_pCachedBitmap = FX_NEW CFX_DIBitmap;
+ if (!m_pCachedBitmap->Create(width, height, format)) {
+ delete m_pCachedBitmap;
+ m_pCachedBitmap = NULL;
+ return;
+ }
+ m_pCachedBitmap->Clear(0xFFFFFFFF);
+ FX_LPBYTE output_offsets = FX_Alloc(FX_BYTE, output_nComps);
+ for (int i = 0; i < output_nComps; i ++) {
+ output_offsets[i] = i;
+ }
+ if (bSwapRGB) {
+ output_offsets[0] = 2;
+ output_offsets[2] = 0;
+ }
+ if (!pJpxModule->Decode(ctx, m_pCachedBitmap->GetBuffer(), m_pCachedBitmap->GetPitch(), bTranslateColor, output_offsets)) {
+ delete m_pCachedBitmap;
+ m_pCachedBitmap = NULL;
+ return;
+ }
+ FX_Free(output_offsets);
+ pJpxModule->DestroyDecoder(ctx);
+ if (m_pColorSpace && m_pColorSpace->GetFamily() == PDFCS_INDEXED && m_bpc < 8) {
+ int scale = 8 - m_bpc;
+ for (FX_DWORD row = 0; row < height; row ++) {
+ FX_LPBYTE scanline = (FX_LPBYTE)m_pCachedBitmap->GetScanline(row);
+ for (FX_DWORD col = 0; col < width; col ++) {
+ *scanline = (*scanline) >> scale;
+ scanline++;
+ }
+ }
+ }
+ m_bpc = 8;
+}
+void CPDF_DIBSource::LoadJbig2Bitmap()
+{
+ ICodec_Jbig2Module* pJbig2Module = CPDF_ModuleMgr::Get()->GetJbig2Module();
+ if (pJbig2Module == NULL) {
+ return;
+ }
+ CPDF_StreamAcc* pGlobalStream = NULL;
+ if (m_pStreamAcc->GetImageParam()) {
+ CPDF_Stream* pGlobals = m_pStreamAcc->GetImageParam()->GetStream(FX_BSTRC("JBIG2Globals"));
+ if (pGlobals) {
+ pGlobalStream = FX_NEW CPDF_StreamAcc;
+ pGlobalStream->LoadAllData(pGlobals, FALSE);
+ }
+ }
+ m_pCachedBitmap = FX_NEW CFX_DIBitmap;
+ if (!m_pCachedBitmap->Create(m_Width, m_Height, m_bImageMask ? FXDIB_1bppMask : FXDIB_1bppRgb)) {
+ return;
+ }
+ int ret = pJbig2Module->Decode(m_Width, m_Height, m_pStreamAcc->GetData(), m_pStreamAcc->GetSize(),
+ pGlobalStream ? pGlobalStream->GetData() : NULL, pGlobalStream ? pGlobalStream->GetSize() : 0,
+ m_pCachedBitmap->GetBuffer(), m_pCachedBitmap->GetPitch());
+ if (ret < 0) {
+ delete m_pCachedBitmap;
+ m_pCachedBitmap = NULL;
+ }
+ if (pGlobalStream) {
+ delete pGlobalStream;
+ }
+ m_bpc = 1;
+ m_nComponents = 1;
+}
+CPDF_DIBSource* CPDF_DIBSource::LoadMask(FX_DWORD& MatteColor)
+{
+ MatteColor = 0xffffffff;
+ CPDF_Stream* pSoftMask = m_pDict->GetStream(FX_BSTRC("SMask"));
+ if (pSoftMask) {
+ CPDF_Array* pMatte = pSoftMask->GetDict()->GetArray(FX_BSTRC("Matte"));
+ if (pMatte != NULL && m_pColorSpace && (FX_DWORD)m_pColorSpace->CountComponents() <= m_nComponents) {
+ FX_FLOAT* pColor = FX_Alloc(FX_FLOAT, m_nComponents);
+ for (FX_DWORD i = 0; i < m_nComponents; i ++) {
+ pColor[i] = pMatte->GetFloat(i);
+ }
+ FX_FLOAT R, G, B;
+ m_pColorSpace->GetRGB(pColor, R, G, B);
+ FX_Free(pColor);
+ MatteColor = FXARGB_MAKE(0, FXSYS_round(R * 255), FXSYS_round(G * 255), FXSYS_round(B * 255));
+ }
+ return LoadMaskDIB(pSoftMask);
+ }
+ CPDF_Object* pMask = m_pDict->GetElementValue(FX_BSTRC("Mask"));
+ if (pMask == NULL) {
+ return NULL;
+ }
+ if (pMask->GetType() == PDFOBJ_STREAM) {
+ return LoadMaskDIB((CPDF_Stream*)pMask);
+ }
+ return NULL;
+}
+int CPDF_DIBSource::StratLoadMask()
+{
+ m_MatteColor = 0xffffffff;
+ m_pMaskStream = m_pDict->GetStream(FX_BSTRC("SMask"));
+ if (m_pMaskStream) {
+ CPDF_Array* pMatte = m_pMaskStream->GetDict()->GetArray(FX_BSTRC("Matte"));
+ if (pMatte != NULL && m_pColorSpace && (FX_DWORD)m_pColorSpace->CountComponents() <= m_nComponents) {
+ FX_FLOAT R, G, B;
+ FX_FLOAT* pColor = FX_Alloc(FX_FLOAT, m_nComponents);
+ for (FX_DWORD i = 0; i < m_nComponents; i ++) {
+ pColor[i] = pMatte->GetFloat(i);
+ }
+ m_pColorSpace->GetRGB(pColor, R, G, B);
+ FX_Free(pColor);
+ m_MatteColor = FXARGB_MAKE(0, FXSYS_round(R * 255), FXSYS_round(G * 255), FXSYS_round(B * 255));
+ }
+ return StartLoadMaskDIB();
+ }
+ m_pMaskStream = m_pDict->GetElementValue(FX_BSTRC("Mask"));
+ if (m_pMaskStream == NULL) {
+ return 1;
+ }
+ if (m_pMaskStream->GetType() == PDFOBJ_STREAM) {
+ return StartLoadMaskDIB();
+ }
+ return 1;
+}
+int CPDF_DIBSource::ContinueLoadMaskDIB(IFX_Pause* pPause)
+{
+ if (m_pMask == NULL) {
+ return 1;
+ }
+ int ret = m_pMask->ContinueLoadDIBSource(pPause);
+ if (ret == 2) {
+ return ret;
+ }
+ if (m_pColorSpace && m_bStdCS) {
+ m_pColorSpace->EnableStdConversion(FALSE);
+ }
+ if (!ret) {
+ delete m_pMask;
+ m_pMask = NULL;
+ return ret;
+ }
+ return 1;
+}
+CPDF_DIBSource* CPDF_DIBSource::DetachMask()
+{
+ CPDF_DIBSource* pDIBSource = m_pMask;
+ m_pMask = NULL;
+ return pDIBSource;
+}
+CPDF_DIBSource* CPDF_DIBSource::LoadMaskDIB(CPDF_Stream* pMask)
+{
+ CPDF_DIBSource* pMaskSource = FX_NEW CPDF_DIBSource;
+ if (!pMaskSource->Load(m_pDocument, pMask, NULL, NULL, NULL, NULL, TRUE)) {
+ delete pMaskSource;
+ return NULL;
+ }
+ return pMaskSource;
+}
+int CPDF_DIBSource::StartLoadMaskDIB()
+{
+ m_pMask = FX_NEW CPDF_DIBSource;
+ int ret = m_pMask->StartLoadDIBSource(m_pDocument, (CPDF_Stream*)m_pMaskStream, FALSE, NULL, NULL, TRUE);
+ if (ret == 2) {
+ if (m_Status == 0) {
+ m_Status = 2;
+ }
+ return 2;
+ }
+ if (!ret) {
+ delete m_pMask;
+ m_pMask = NULL;
+ return 1;
+ }
+ return 1;
+}
+void CPDF_DIBSource::LoadPalette()
+{
+ if (m_bpc * m_nComponents > 8) {
+ return;
+ }
+ if (m_pColorSpace == NULL) {
+ return;
+ }
+ if (m_bpc * m_nComponents == 1) {
+ if (m_bDefaultDecode && (m_Family == PDFCS_DEVICEGRAY || m_Family == PDFCS_DEVICERGB)) {
+ return;
+ }
+ if (m_pColorSpace->CountComponents() > 3) {
+ return;
+ }
+ FX_FLOAT color_values[3];
+ color_values[0] = m_pCompData[0].m_DecodeMin;
+ color_values[1] = color_values[2] = color_values[0];
+ FX_FLOAT R, G, B;
+ m_pColorSpace->GetRGB(color_values, R, G, B);
+ FX_ARGB argb0 = ArgbEncode(255, FXSYS_round(R * 255), FXSYS_round(G * 255), FXSYS_round(B * 255));
+ color_values[0] += m_pCompData[0].m_DecodeStep;
+ color_values[1] += m_pCompData[0].m_DecodeStep;
+ color_values[2] += m_pCompData[0].m_DecodeStep;
+ m_pColorSpace->GetRGB(color_values, R, G, B);
+ FX_ARGB argb1 = ArgbEncode(255, FXSYS_round(R * 255), FXSYS_round(G * 255), FXSYS_round(B * 255));
+ if (argb0 != 0xFF000000 || argb1 != 0xFFFFFFFF) {
+ SetPaletteArgb(0, argb0);
+ SetPaletteArgb(1, argb1);
+ }
+ return;
+ }
+ if (m_pColorSpace == CPDF_ColorSpace::GetStockCS(PDFCS_DEVICEGRAY) && m_bpc == 8 && m_bDefaultDecode) {
+ } else {
+ int palette_count = 1 << (m_bpc * m_nComponents);
+ CFX_FixedBufGrow<FX_FLOAT, 16> color_values(m_nComponents);
+ FX_FLOAT* color_value = color_values;
+ for (int i = 0; i < palette_count; i ++) {
+ int color_data = i;
+ for (FX_DWORD j = 0; j < m_nComponents; j ++) {
+ int encoded_component = color_data % (1 << m_bpc);
+ color_data /= 1 << m_bpc;
+ color_value[j] = m_pCompData[j].m_DecodeMin + m_pCompData[j].m_DecodeStep * encoded_component;
+ }
+ FX_FLOAT R = 0, G = 0, B = 0;
+ if (m_nComponents == 1 && m_Family == PDFCS_ICCBASED && m_pColorSpace->CountComponents() > 1) {
+ int nComponents = m_pColorSpace->CountComponents();
+ FX_FLOAT* temp_buf = FX_Alloc(FX_FLOAT, nComponents);
+ for (int i = 0; i < nComponents; i++) {
+ temp_buf[i] = *color_value;
+ }
+ m_pColorSpace->GetRGB(temp_buf, R, G, B);
+ FX_Free(temp_buf);
+ } else {
+ m_pColorSpace->GetRGB(color_value, R, G, B);
+ }
+ SetPaletteArgb(i, ArgbEncode(255, FXSYS_round(R * 255), FXSYS_round(G * 255), FXSYS_round(B * 255)));
+ }
+ }
+}
+
+FX_DWORD CPDF_DIBSource::GetValidBpp() const
+{
+ FX_DWORD bpc = m_bpc;
+ CPDF_Object * pFilter = m_pDict->GetElementValue(FX_BSTRC("Filter"));
+ if(pFilter)
+ {
+ if(pFilter->GetType() == PDFOBJ_NAME)
+ {
+ CFX_ByteString filter = pFilter->GetString();
+ if(filter == FX_BSTRC("CCITTFaxDecode") || filter == FX_BSTRC("JBIG2Decode") )
+ bpc = 1;
+ if(filter == FX_BSTRC("RunLengthDecode") || filter == FX_BSTRC("DCTDecode") )
+ bpc = 8;
+ }
+ else if (pFilter->GetType() == PDFOBJ_ARRAY)
+ {
+ CPDF_Array *pArray = (CPDF_Array *) pFilter;
+ if( pArray->GetString(pArray->GetCount() -1) == FX_BSTRC("CCITTFacDecode") ||
+ pArray->GetString(pArray->GetCount() -1) == FX_BSTRC("JBIG2Decode") )
+ bpc = 1;
+
+ if( pArray->GetString(pArray->GetCount() -1) == FX_BSTRC("RunLengthDecode") ||
+ pArray->GetString(pArray->GetCount() -1) == FX_BSTRC("DCTDecode") )
+ bpc = 8;
+ }
+ }
+
+ return bpc;
+}
+
+#define NORMALCOLOR_MAX(color, max) (color) > (max) ? (max) : (color) < 0 ? 0 : (color);
+void CPDF_DIBSource::TranslateScanline24bpp(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan) const
+{
+ int max_data = (1 << m_bpc) - 1;
+ if (m_bDefaultDecode) {
+ if (m_Family == PDFCS_DEVICERGB || m_Family == PDFCS_CALRGB) {
+ if (m_bpc == 16) {
+ FX_LPBYTE dest_pos = dest_scan;
+ FX_LPCBYTE src_pos = src_scan;
+ for (int col = 0; col < m_Width; col ++) {
+ *dest_scan++ = src_pos[4];
+ *dest_scan++ = src_pos[2];
+ *dest_scan++ = *src_pos;
+ src_pos += 6;
+ }
+ } else if (m_bpc == 8) {
+ FX_LPBYTE dest_pos = dest_scan;
+ FX_LPCBYTE src_pos = src_scan;
+ for (int column = 0; column < m_Width; column ++) {
+ *dest_scan++ = src_pos[2];
+ *dest_scan++ = src_pos[1];
+ *dest_scan++ = *src_pos;
+ src_pos += 3;
+ }
+ } else {
+ int src_bit_pos = 0;
+ int dest_byte_pos = 0;
+
+ FX_DWORD bpc = GetValidBpp();
+
+ for (int column = 0; column < m_Width; column ++) {
+ int R = _GetBits8(src_scan, src_bit_pos, bpc);
+ src_bit_pos += bpc;
+ int G = _GetBits8(src_scan, src_bit_pos, bpc);
+ src_bit_pos += bpc;
+ int B = _GetBits8(src_scan, src_bit_pos, bpc);
+ src_bit_pos += bpc;
+ R = NORMALCOLOR_MAX(R, max_data);
+ G = NORMALCOLOR_MAX(G, max_data);
+ B = NORMALCOLOR_MAX(B, max_data);
+ dest_scan[dest_byte_pos] = B * 255 / max_data;
+ dest_scan[dest_byte_pos + 1] = G * 255 / max_data;
+ dest_scan[dest_byte_pos + 2] = R * 255 / max_data;
+ dest_byte_pos += 3;
+ }
+ }
+ return;
+ } else if (m_bpc == 8) {
+ if (m_nComponents == m_pColorSpace->CountComponents())
+ m_pColorSpace->TranslateImageLine(dest_scan, src_scan, m_Width, m_Width, m_Height,
+ m_bLoadMask && m_GroupFamily == PDFCS_DEVICECMYK && m_Family == PDFCS_DEVICECMYK);
+ return;
+ }
+ }
+ CFX_FixedBufGrow<FX_FLOAT, 16> color_values1(m_nComponents);
+ FX_FLOAT* color_values = color_values1;
+ FX_FLOAT R, G, B;
+ if (m_bpc == 8) {
+ int src_byte_pos = 0;
+ int dest_byte_pos = 0;
+ for (int column = 0; column < m_Width; column ++) {
+ for (FX_DWORD color = 0; color < m_nComponents; color ++) {
+ int data = src_scan[src_byte_pos ++];
+ color_values[color] = m_pCompData[color].m_DecodeMin +
+ m_pCompData[color].m_DecodeStep * data;
+ }
+ if (m_bLoadMask && m_GroupFamily == PDFCS_DEVICECMYK && m_Family == PDFCS_DEVICECMYK) {
+ FX_FLOAT k = 1.0f - color_values[3];
+ R = (1.0f - color_values[0]) * k;
+ G = (1.0f - color_values[1]) * k;
+ B = (1.0f - color_values[2]) * k;
+ } else {
+ m_pColorSpace->GetRGB(color_values, R, G, B);
+ }
+ R = NORMALCOLOR_MAX(R, 1);
+ G = NORMALCOLOR_MAX(G, 1);
+ B = NORMALCOLOR_MAX(B, 1);
+ dest_scan[dest_byte_pos] = (FX_INT32)(B * 255);
+ dest_scan[dest_byte_pos + 1] = (FX_INT32)(G * 255);
+ dest_scan[dest_byte_pos + 2] = (FX_INT32)(R * 255);
+ dest_byte_pos += 3;
+ }
+ } else {
+ int src_bit_pos = 0;
+ int dest_byte_pos = 0;
+
+ FX_DWORD bpc = GetValidBpp();
+
+ for (int column = 0; column < m_Width; column ++) {
+ for (FX_DWORD color = 0; color < m_nComponents; color ++) {
+ int data = _GetBits8(src_scan, src_bit_pos, bpc);
+ color_values[color] = m_pCompData[color].m_DecodeMin +
+ m_pCompData[color].m_DecodeStep * data;
+ src_bit_pos += bpc;
+ }
+ if (m_bLoadMask && m_GroupFamily == PDFCS_DEVICECMYK && m_Family == PDFCS_DEVICECMYK) {
+ FX_FLOAT k = 1.0f - color_values[3];
+ R = (1.0f - color_values[0]) * k;
+ G = (1.0f - color_values[1]) * k;
+ B = (1.0f - color_values[2]) * k;
+ } else {
+ m_pColorSpace->GetRGB(color_values, R, G, B);
+ }
+ R = NORMALCOLOR_MAX(R, 1);
+ G = NORMALCOLOR_MAX(G, 1);
+ B = NORMALCOLOR_MAX(B, 1);
+ dest_scan[dest_byte_pos] = (FX_INT32)(B * 255);
+ dest_scan[dest_byte_pos + 1] = (FX_INT32)(G * 255);
+ dest_scan[dest_byte_pos + 2] = (FX_INT32)(R * 255);
+ dest_byte_pos += 3;
+ }
+ }
+}
+FX_LPBYTE CPDF_DIBSource::GetBuffer() const
+{
+ if (m_pCachedBitmap) {
+ return m_pCachedBitmap->GetBuffer();
+ }
+ return NULL;
+}
+FX_LPCBYTE CPDF_DIBSource::GetScanline(int line) const
+{
+ FX_DWORD src_pitch = (m_Width * m_bpc * m_nComponents + 7) / 8;
+ FX_LPCBYTE pSrcLine = NULL;
+ if (m_pCachedBitmap) {
+ if (line >= m_pCachedBitmap->GetHeight()) {
+ line = m_pCachedBitmap->GetHeight() - 1;
+ }
+ pSrcLine = m_pCachedBitmap->GetScanline(line);
+ } else if (m_pDecoder) {
+ pSrcLine = m_pDecoder->GetScanline(line);
+ } else {
+ if (m_pStreamAcc->GetSize() >= (line + 1) * src_pitch) {
+ pSrcLine = m_pStreamAcc->GetData() + line * src_pitch;
+ }
+ }
+ if (pSrcLine == NULL) {
+ FX_LPBYTE pLineBuf = m_pMaskedLine ? m_pMaskedLine : m_pLineBuf;
+ FXSYS_memset8(pLineBuf, 0xff, m_Pitch);
+ return pLineBuf;
+ }
+ if (m_bpc * m_nComponents == 1) {
+ if (m_bImageMask && m_bDefaultDecode) {
+ for (FX_DWORD i = 0; i < src_pitch; i ++) {
+ m_pLineBuf[i] = ~pSrcLine[i];
+ }
+ } else if (m_bColorKey) {
+ FX_DWORD reset_argb, set_argb;
+ reset_argb = m_pPalette ? m_pPalette[0] : 0xff000000;
+ set_argb = m_pPalette ? m_pPalette[1] : 0xffffffff;
+ if (m_pCompData[0].m_ColorKeyMin == 0) {
+ reset_argb = 0;
+ }
+ if (m_pCompData[0].m_ColorKeyMax == 1) {
+ set_argb = 0;
+ }
+ set_argb = FXARGB_TODIB(set_argb);
+ reset_argb = FXARGB_TODIB(reset_argb);
+ FX_DWORD* dest_scan = (FX_DWORD*)m_pMaskedLine;
+ for (int col = 0; col < m_Width; col ++) {
+ if (pSrcLine[col / 8] & (1 << (7 - col % 8))) {
+ *dest_scan = set_argb;
+ } else {
+ *dest_scan = reset_argb;
+ }
+ dest_scan ++;
+ }
+ return m_pMaskedLine;
+ } else {
+ FXSYS_memcpy32(m_pLineBuf, pSrcLine, src_pitch);
+ }
+ return m_pLineBuf;
+ }
+ if (m_bpc * m_nComponents <= 8) {
+ if (m_bpc == 8) {
+ FXSYS_memcpy32(m_pLineBuf, pSrcLine, src_pitch);
+ } else {
+ int src_bit_pos = 0;
+ for (int col = 0; col < m_Width; col ++) {
+ int color_index = 0;
+ for (FX_DWORD color = 0; color < m_nComponents; color ++) {
+ int data = _GetBits8(pSrcLine, src_bit_pos, m_bpc);
+ color_index |= data << (color * m_bpc);
+ src_bit_pos += m_bpc;
+ }
+ m_pLineBuf[col] = color_index;
+ }
+ }
+ if (m_bColorKey) {
+ FX_LPBYTE pDestPixel = m_pMaskedLine;
+ FX_LPCBYTE pSrcPixel = m_pLineBuf;
+ for (int col = 0; col < m_Width; col ++) {
+ FX_BYTE index = *pSrcPixel++;
+ if (m_pPalette) {
+ *pDestPixel++ = FXARGB_B(m_pPalette[index]);
+ *pDestPixel++ = FXARGB_G(m_pPalette[index]);
+ *pDestPixel++ = FXARGB_R(m_pPalette[index]);
+ } else {
+ *pDestPixel++ = index;
+ *pDestPixel++ = index;
+ *pDestPixel++ = index;
+ }
+ *pDestPixel = (index < m_pCompData[0].m_ColorKeyMin || index > m_pCompData[0].m_ColorKeyMax) ? 0xff : 0;
+ pDestPixel ++ ;
+ }
+ return m_pMaskedLine;
+ }
+ return m_pLineBuf;
+ }
+ if (m_bColorKey) {
+ if (m_nComponents == 3 && m_bpc == 8) {
+ FX_LPBYTE alpha_channel = m_pMaskedLine + 3;
+ for (int col = 0; col < m_Width; col ++) {
+ FX_LPCBYTE pPixel = pSrcLine + col * 3;
+ alpha_channel[col * 4] = (pPixel[0] < m_pCompData[0].m_ColorKeyMin ||
+ pPixel[0] > m_pCompData[0].m_ColorKeyMax ||
+ pPixel[1] < m_pCompData[1].m_ColorKeyMin || pPixel[1] > m_pCompData[1].m_ColorKeyMax ||
+ pPixel[2] < m_pCompData[2].m_ColorKeyMin || pPixel[2] > m_pCompData[2].m_ColorKeyMax) ? 0xff : 0;
+ }
+ } else {
+ FXSYS_memset8(m_pMaskedLine, 0xff, m_Pitch);
+ }
+ }
+ if (m_pColorSpace) {
+ TranslateScanline24bpp(m_pLineBuf, pSrcLine);
+ pSrcLine = m_pLineBuf;
+ }
+ if (m_bColorKey) {
+ FX_LPCBYTE pSrcPixel = pSrcLine;
+ FX_LPBYTE pDestPixel = m_pMaskedLine;
+ for (int col = 0; col < m_Width; col ++) {
+ *pDestPixel++ = *pSrcPixel++;
+ *pDestPixel++ = *pSrcPixel++;
+ *pDestPixel++ = *pSrcPixel++;
+ pDestPixel ++;
+ }
+ return m_pMaskedLine;
+ }
+ return pSrcLine;
+}
+FX_BOOL CPDF_DIBSource::SkipToScanline(int line, IFX_Pause* pPause) const
+{
+ if (m_pDecoder) {
+ return m_pDecoder->SkipToScanline(line, pPause);
+ }
+ return FALSE;
+}
+void CPDF_DIBSource::DownSampleScanline(int line, FX_LPBYTE dest_scan, int dest_bpp,
+ int dest_width, FX_BOOL bFlipX, int clip_left, int clip_width) const
+{
+ FX_DWORD src_width = m_Width;
+ FX_DWORD src_pitch = (src_width * m_bpc * m_nComponents + 7) / 8;
+ FX_LPCBYTE pSrcLine = NULL;
+ if (m_pCachedBitmap) {
+ pSrcLine = m_pCachedBitmap->GetScanline(line);
+ } else if (m_pDecoder) {
+ pSrcLine = m_pDecoder->GetScanline(line);
+ } else {
+ if (m_pStreamAcc->GetSize() >= (line + 1) * src_pitch) {
+ pSrcLine = m_pStreamAcc->GetData() + line * src_pitch;
+ }
+ }
+ int orig_Bpp = m_bpc * m_nComponents / 8;
+ int dest_Bpp = dest_bpp / 8;
+ if (pSrcLine == NULL) {
+ FXSYS_memset32(dest_scan, 0xff, dest_Bpp * clip_width);
+ return;
+ }
+ CFX_FixedBufGrow<FX_BYTE, 128> temp(orig_Bpp);
+ if (m_bpc * m_nComponents == 1) {
+ FX_DWORD set_argb = (FX_DWORD) - 1, reset_argb = 0;
+ if (m_bImageMask) {
+ if (m_bDefaultDecode) {
+ set_argb = 0;
+ reset_argb = (FX_DWORD) - 1;
+ }
+ } else if (m_bColorKey) {
+ reset_argb = m_pPalette ? m_pPalette[0] : 0xff000000;
+ set_argb = m_pPalette ? m_pPalette[1] : 0xffffffff;
+ if (m_pCompData[0].m_ColorKeyMin == 0) {
+ reset_argb = 0;
+ }
+ if (m_pCompData[0].m_ColorKeyMax == 1) {
+ set_argb = 0;
+ }
+ set_argb = FXARGB_TODIB(set_argb);
+ reset_argb = FXARGB_TODIB(reset_argb);
+ for (int i = 0; i < clip_width; i ++) {
+ FX_DWORD src_x = (clip_left + i) * src_width / dest_width;
+ if (bFlipX) {
+ src_x = src_width - src_x - 1;
+ }
+ src_x %= src_width;
+ if (pSrcLine[src_x / 8] & (1 << (7 - src_x % 8))) {
+ ((FX_DWORD*)dest_scan)[i] = set_argb;
+ } else {
+ ((FX_DWORD*)dest_scan)[i] = reset_argb;
+ }
+ }
+ return;
+ } else {
+ if (dest_Bpp == 1) {
+ } else if (m_pPalette) {
+ reset_argb = m_pPalette[0];
+ set_argb = m_pPalette[1];
+ }
+ }
+ for (int i = 0; i < clip_width; i ++) {
+ FX_DWORD src_x = (clip_left + i) * src_width / dest_width;
+ if (bFlipX) {
+ src_x = src_width - src_x - 1;
+ }
+ src_x %= src_width;
+ int dest_pos = i * dest_Bpp;
+ if (pSrcLine[src_x / 8] & (1 << (7 - src_x % 8))) {
+ if (dest_Bpp == 1) {
+ dest_scan[dest_pos] = (FX_BYTE)set_argb;
+ } else if (dest_Bpp == 3) {
+ dest_scan[dest_pos] = FXARGB_B(set_argb);
+ dest_scan[dest_pos + 1] = FXARGB_G(set_argb);
+ dest_scan[dest_pos + 2] = FXARGB_R(set_argb);
+ } else {
+ *(FX_DWORD*)(dest_scan + dest_pos) = set_argb;
+ }
+ } else {
+ if (dest_Bpp == 1) {
+ dest_scan[dest_pos] = (FX_BYTE)reset_argb;
+ } else if (dest_Bpp == 3) {
+ dest_scan[dest_pos] = FXARGB_B(reset_argb);
+ dest_scan[dest_pos + 1] = FXARGB_G(reset_argb);
+ dest_scan[dest_pos + 2] = FXARGB_R(reset_argb);
+ } else {
+ *(FX_DWORD*)(dest_scan + dest_pos) = reset_argb;
+ }
+ }
+ }
+ return;
+ } else if (m_bpc * m_nComponents <= 8) {
+ if (m_bpc < 8) {
+ int src_bit_pos = 0;
+ for (FX_DWORD col = 0; col < src_width; col ++) {
+ int color_index = 0;
+ for (FX_DWORD color = 0; color < m_nComponents; color ++) {
+ int data = _GetBits8(pSrcLine, src_bit_pos, m_bpc);
+ color_index |= data << (color * m_bpc);
+ src_bit_pos += m_bpc;
+ }
+ m_pLineBuf[col] = color_index;
+ }
+ pSrcLine = m_pLineBuf;
+ }
+ if (m_bColorKey) {
+ for (int i = 0; i < clip_width; i ++) {
+ FX_DWORD src_x = (clip_left + i) * src_width / dest_width;
+ if (bFlipX) {
+ src_x = src_width - src_x - 1;
+ }
+ src_x %= src_width;
+ FX_LPBYTE pDestPixel = dest_scan + i * 4;
+ FX_BYTE index = pSrcLine[src_x];
+ if (m_pPalette) {
+ *pDestPixel++ = FXARGB_B(m_pPalette[index]);
+ *pDestPixel++ = FXARGB_G(m_pPalette[index]);
+ *pDestPixel++ = FXARGB_R(m_pPalette[index]);
+ } else {
+ *pDestPixel++ = index;
+ *pDestPixel++ = index;
+ *pDestPixel++ = index;
+ }
+ *pDestPixel = (index < m_pCompData[0].m_ColorKeyMin || index > m_pCompData[0].m_ColorKeyMax) ? 0xff : 0;
+ }
+ return;
+ }
+ for (int i = 0; i < clip_width; i ++) {
+ FX_DWORD src_x = (clip_left + i) * src_width / dest_width;
+ if (bFlipX) {
+ src_x = src_width - src_x - 1;
+ }
+ src_x %= src_width;
+ FX_BYTE index = pSrcLine[src_x];
+ if (dest_Bpp == 1) {
+ dest_scan[i] = index;
+ } else {
+ int dest_pos = i * dest_Bpp;
+ FX_ARGB argb = m_pPalette[index];
+ dest_scan[dest_pos] = FXARGB_B(argb);
+ dest_scan[dest_pos + 1] = FXARGB_G(argb);
+ dest_scan[dest_pos + 2] = FXARGB_R(argb);
+ }
+ }
+ return;
+ } else {
+ int last_src_x = -1;
+ FX_ARGB last_argb;
+ FX_FLOAT orig_Not8Bpp = (FX_FLOAT)m_bpc * (FX_FLOAT)m_nComponents / 8.0f;
+ FX_FLOAT unit_To8Bpc = 255.0f / ((1 << m_bpc) - 1);
+ for (int i = 0; i < clip_width; i ++) {
+ int dest_x = clip_left + i;
+ FX_DWORD src_x = (bFlipX ? (dest_width - dest_x - 1) : dest_x) * (FX_INT64)src_width / dest_width;
+ src_x %= src_width;
+ FX_LPCBYTE pSrcPixel = NULL;
+ if (m_bpc % 8 == 0) {
+ pSrcPixel = pSrcLine + src_x * orig_Bpp;
+ } else {
+ pSrcPixel = pSrcLine + (int)(src_x * orig_Not8Bpp);
+ }
+ FX_LPBYTE pDestPixel = dest_scan + i * dest_Bpp;
+ FX_ARGB argb;
+ if (src_x == last_src_x) {
+ argb = last_argb;
+ } else {
+ if (m_pColorSpace) {
+ FX_BYTE color[4];
+ if (!m_bDefaultDecode) {
+ for (int i = 0; i < orig_Bpp; i ++) {
+ int color_value = (int)((m_pCompData[i].m_DecodeMin + m_pCompData[i].m_DecodeStep * (FX_FLOAT)pSrcPixel[i]) * 255.0f + 0.5f);
+ temp[i] = color_value > 255 ? 255 : (color_value < 0 ? 0 : color_value);
+ }
+ m_pColorSpace->TranslateImageLine(color, temp, 1, 0, 0, m_bLoadMask && m_GroupFamily == PDFCS_DEVICECMYK && m_Family == PDFCS_DEVICECMYK);
+ } else {
+ if (m_bpc < 8) {
+ int src_bit_pos = 0;
+ if (src_x % 2) {
+ src_bit_pos = 4;
+ }
+ int value = (1 << m_bpc) - 1;
+ for (FX_DWORD i = 0; i < m_nComponents; i ++) {
+ temp[i] = (FX_BYTE)(_GetBits8(pSrcPixel, src_bit_pos, m_bpc) * unit_To8Bpc);
+ src_bit_pos += m_bpc;
+ }
+ m_pColorSpace->TranslateImageLine(color, temp, 1, 0, 0, m_bLoadMask && m_GroupFamily == PDFCS_DEVICECMYK && m_Family == PDFCS_DEVICECMYK);
+ } else {
+ m_pColorSpace->TranslateImageLine(color, pSrcPixel, 1, 0, 0, m_bLoadMask && m_GroupFamily == PDFCS_DEVICECMYK && m_Family == PDFCS_DEVICECMYK);
+ }
+ }
+ argb = FXARGB_MAKE(0xff, color[2], color[1], color[0]);
+ } else {
+ argb = FXARGB_MAKE(0xff, pSrcPixel[2], pSrcPixel[1], pSrcPixel[0]);
+ }
+ if (m_bColorKey) {
+ int alpha = 0xff;
+ if (m_nComponents == 3 && m_bpc == 8) {
+ alpha = (pSrcPixel[0] < m_pCompData[0].m_ColorKeyMin ||
+ pSrcPixel[0] > m_pCompData[0].m_ColorKeyMax ||
+ pSrcPixel[1] < m_pCompData[1].m_ColorKeyMin ||
+ pSrcPixel[1] > m_pCompData[1].m_ColorKeyMax ||
+ pSrcPixel[2] < m_pCompData[2].m_ColorKeyMin ||
+ pSrcPixel[2] > m_pCompData[2].m_ColorKeyMax) ? 0xff : 0;
+ }
+ argb &= 0xffffff;
+ argb |= alpha << 24;
+ }
+ last_src_x = src_x;
+ last_argb = argb;
+ }
+ if (dest_Bpp == 4) {
+ *(FX_DWORD*)pDestPixel = FXARGB_TODIB(argb);
+ } else {
+ *pDestPixel++ = FXARGB_B(argb);
+ *pDestPixel++ = FXARGB_G(argb);
+ *pDestPixel = FXARGB_R(argb);
+ }
+ }
+ }
+}
+void CPDF_DIBSource::SetDownSampleSize(int dest_width, int dest_height) const
+{
+ if (m_pDecoder) {
+ m_pDecoder->DownScale(dest_width, dest_height);
+ ((CPDF_DIBSource*)this)->m_Width = m_pDecoder->GetWidth();
+ ((CPDF_DIBSource*)this)->m_Height = m_pDecoder->GetHeight();
+ }
+}
+void CPDF_DIBSource::ClearImageData()
+{
+ if (m_pDecoder) {
+ m_pDecoder->ClearImageData();
+ }
+}
+CPDF_ProgressiveImageLoaderHandle::CPDF_ProgressiveImageLoaderHandle()
+{
+ m_pImageLoader = NULL;
+ m_pCache = NULL;
+ m_pImage = NULL;
+}
+CPDF_ProgressiveImageLoaderHandle::~CPDF_ProgressiveImageLoaderHandle()
+{
+ m_pImageLoader = NULL;
+ m_pCache = NULL;
+ m_pImage = NULL;
+}
+FX_BOOL CPDF_ProgressiveImageLoaderHandle::Start(CPDF_ImageLoader* pImageLoader, const CPDF_ImageObject* pImage, CPDF_PageRenderCache* pCache, FX_BOOL bStdCS, FX_DWORD GroupFamily, FX_BOOL bLoadMask, CPDF_RenderStatus* pRenderStatus, FX_INT32 nDownsampleWidth, FX_INT32 nDownsampleHeight)
+{
+ m_pImageLoader = pImageLoader;
+ m_pCache = pCache;
+ m_pImage = (CPDF_ImageObject*)pImage;
+ m_nDownsampleWidth = nDownsampleWidth;
+ m_nDownsampleHeight = nDownsampleHeight;
+ FX_BOOL ret;
+ if (pCache) {
+ ret = pCache->StartGetCachedBitmap(pImage->m_pImage->GetStream(), bStdCS, GroupFamily, bLoadMask, pRenderStatus, m_nDownsampleWidth, m_nDownsampleHeight);
+ if (ret == FALSE) {
+ m_pImageLoader->m_bCached = TRUE;
+ m_pImageLoader->m_pBitmap = pCache->m_pCurImageCache->DetachBitmap();
+ m_pImageLoader->m_pMask = pCache->m_pCurImageCache->DetachMask();
+ m_pImageLoader->m_MatteColor = pCache->m_pCurImageCache->m_MatteColor;
+ }
+ } else {
+ ret = pImage->m_pImage->StartLoadDIBSource(pRenderStatus->m_pFormResource, pRenderStatus->m_pPageResource, bStdCS, GroupFamily, bLoadMask);
+ if (ret == FALSE) {
+ m_pImageLoader->m_bCached = FALSE;
+ m_pImageLoader->m_pBitmap = m_pImage->m_pImage->DetachBitmap();
+ m_pImageLoader->m_pMask = m_pImage->m_pImage->DetachMask();
+ m_pImageLoader->m_MatteColor = m_pImage->m_pImage->m_MatteColor;
+ }
+ }
+ return ret;
+}
+FX_BOOL CPDF_ProgressiveImageLoaderHandle::Continue(IFX_Pause* pPause)
+{
+ FX_BOOL ret;
+ if (m_pCache) {
+ ret = m_pCache->Continue(pPause);
+ if (ret == FALSE) {
+ m_pImageLoader->m_bCached = TRUE;
+ m_pImageLoader->m_pBitmap = m_pCache->m_pCurImageCache->DetachBitmap();
+ m_pImageLoader->m_pMask = m_pCache->m_pCurImageCache->DetachMask();
+ m_pImageLoader->m_MatteColor = m_pCache->m_pCurImageCache->m_MatteColor;
+ }
+ } else {
+ ret = m_pImage->m_pImage->Continue(pPause);
+ if (ret == FALSE) {
+ m_pImageLoader->m_bCached = FALSE;
+ m_pImageLoader->m_pBitmap = m_pImage->m_pImage->DetachBitmap();
+ m_pImageLoader->m_pMask = m_pImage->m_pImage->DetachMask();
+ m_pImageLoader->m_MatteColor = m_pImage->m_pImage->m_MatteColor;
+ }
+ }
+ return ret;
+}
+FX_BOOL CPDF_ImageLoader::Load(const CPDF_ImageObject* pImage, CPDF_PageRenderCache* pCache, FX_BOOL bStdCS, FX_DWORD GroupFamily, FX_BOOL bLoadMask, CPDF_RenderStatus* pRenderStatus)
+{
+ if (pImage == NULL) {
+ return FALSE;
+ }
+ if (pCache) {
+ pCache->GetCachedBitmap(pImage->m_pImage->GetStream(), m_pBitmap, m_pMask, m_MatteColor, bStdCS, GroupFamily, bLoadMask, pRenderStatus, m_nDownsampleWidth, m_nDownsampleHeight);
+ m_bCached = TRUE;
+ } else {
+ m_pBitmap = pImage->m_pImage->LoadDIBSource(&m_pMask, &m_MatteColor, bStdCS, GroupFamily, bLoadMask);
+ m_bCached = FALSE;
+ }
+ return FALSE;
+}
+FX_BOOL CPDF_ImageLoader::StartLoadImage(const CPDF_ImageObject* pImage, CPDF_PageRenderCache* pCache, FX_LPVOID& LoadHandle, FX_BOOL bStdCS, FX_DWORD GroupFamily, FX_BOOL bLoadMask, CPDF_RenderStatus* pRenderStatus, FX_INT32 nDownsampleWidth, FX_INT32 nDownsampleHeight)
+{
+ m_nDownsampleWidth = nDownsampleWidth;
+ m_nDownsampleHeight = nDownsampleHeight;
+ CPDF_ProgressiveImageLoaderHandle* pLoaderHandle = NULL;
+ pLoaderHandle = FX_NEW CPDF_ProgressiveImageLoaderHandle;
+ FX_BOOL ret = pLoaderHandle->Start(this, pImage, pCache, bStdCS, GroupFamily, bLoadMask, pRenderStatus, m_nDownsampleWidth, m_nDownsampleHeight);
+ LoadHandle = pLoaderHandle;
+ return ret;
+}
+FX_BOOL CPDF_ImageLoader::Continue(FX_LPVOID LoadHandle, IFX_Pause* pPause)
+{
+ return ((CPDF_ProgressiveImageLoaderHandle*)LoadHandle)->Continue(pPause);
+}
+CPDF_ImageLoader::~CPDF_ImageLoader()
+{
+ if (!m_bCached) {
+ if (m_pBitmap) {
+ delete m_pBitmap;
+ m_pBitmap = NULL;
+ }
+ if (m_pMask) {
+ delete m_pMask;
+ }
+ }
+}
diff --git a/core/src/fpdfapi/fpdf_render/fpdf_render_pattern.cpp b/core/src/fpdfapi/fpdf_render/fpdf_render_pattern.cpp
index 8cc30a72a1..4b4f929179 100644
--- a/core/src/fpdfapi/fpdf_render/fpdf_render_pattern.cpp
+++ b/core/src/fpdfapi/fpdf_render/fpdf_render_pattern.cpp
@@ -1,1093 +1,1093 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../../include/fpdfapi/fpdf_render.h"
-#include "../../../include/fpdfapi/fpdf_pageobj.h"
-#include "../../../include/fxge/fx_ge.h"
-#include "../fpdf_page/pageint.h"
-#include "render_int.h"
-#define SHADING_STEPS 256
-static void _DrawAxialShading(CFX_DIBitmap* pBitmap, CFX_AffineMatrix* pObject2Bitmap,
- CPDF_Dictionary* pDict, CPDF_Function** pFuncs, int nFuncs,
- CPDF_ColorSpace* pCS, int alpha)
-{
- ASSERT(pBitmap->GetFormat() == FXDIB_Argb);
- CPDF_Array* pCoords = pDict->GetArray(FX_BSTRC("Coords"));
- if (pCoords == NULL) {
- return;
- }
- FX_FLOAT start_x = pCoords->GetNumber(0);
- FX_FLOAT start_y = pCoords->GetNumber(1);
- FX_FLOAT end_x = pCoords->GetNumber(2);
- FX_FLOAT end_y = pCoords->GetNumber(3);
- FX_FLOAT t_min = 0, t_max = 1.0f;
- CPDF_Array* pArray = pDict->GetArray(FX_BSTRC("Domain"));
- if (pArray) {
- t_min = pArray->GetNumber(0);
- t_max = pArray->GetNumber(1);
- }
- FX_BOOL bStartExtend = FALSE, bEndExtend = FALSE;
- pArray = pDict->GetArray(FX_BSTRC("Extend"));
- if (pArray) {
- bStartExtend = pArray->GetInteger(0);
- bEndExtend = pArray->GetInteger(1);
- }
- int width = pBitmap->GetWidth();
- int height = pBitmap->GetHeight();
- FX_FLOAT x_span = end_x - start_x;
- FX_FLOAT y_span = end_y - start_y;
- FX_FLOAT axis_len_square = FXSYS_Mul(x_span, x_span) + FXSYS_Mul(y_span, y_span);
- CFX_AffineMatrix matrix;
- matrix.SetReverse(*pObject2Bitmap);
- int total_results = 0;
- for (int j = 0; j < nFuncs; j ++) {
- if (pFuncs[j]) {
- total_results += pFuncs[j]->CountOutputs();
- }
- }
- if (pCS->CountComponents() > total_results) {
- total_results = pCS->CountComponents();
- }
- CFX_FixedBufGrow<FX_FLOAT, 16> result_array(total_results);
- FX_FLOAT* pResults = result_array;
- FXSYS_memset32(pResults, 0, total_results * sizeof(FX_FLOAT));
- FX_DWORD rgb_array[SHADING_STEPS];
- for (int i = 0; i < SHADING_STEPS; i ++) {
- FX_FLOAT input = (t_max - t_min) * i / SHADING_STEPS + t_min;
- int offset = 0;
- for (int j = 0; j < nFuncs; j ++) {
- if (pFuncs[j]) {
- int nresults = 0;
- if (pFuncs[j]->Call(&input, 1, pResults + offset, nresults)) {
- offset += nresults;
- }
- }
- }
- FX_FLOAT R, G, B;
- pCS->GetRGB(pResults, R, G, B);
- rgb_array[i] = FXARGB_TODIB(FXARGB_MAKE(alpha, FXSYS_round(R * 255), FXSYS_round(G * 255), FXSYS_round(B * 255)));
- }
- int pitch = pBitmap->GetPitch();
- int Bpp = pBitmap->GetBPP() / 8;
- for (int row = 0; row < height; row ++) {
- FX_DWORD* dib_buf = (FX_DWORD*)(pBitmap->GetBuffer() + row * pitch);
- for (int column = 0; column < width; column ++) {
- FX_FLOAT x = (FX_FLOAT)column, y = (FX_FLOAT)row;
- matrix.Transform(x, y);
- FX_FLOAT scale = FXSYS_Div(FXSYS_Mul(x - start_x, x_span) + FXSYS_Mul(y - start_y, y_span), axis_len_square);
- int index = (FX_INT32)(scale * (SHADING_STEPS - 1));
- if (index < 0) {
- if (!bStartExtend) {
- continue;
- }
- index = 0;
- } else if (index >= SHADING_STEPS) {
- if (!bEndExtend) {
- continue;
- }
- index = SHADING_STEPS - 1;
- }
- dib_buf[column] = rgb_array[index];
- }
- }
-}
-static void _DrawRadialShading(CFX_DIBitmap* pBitmap, CFX_AffineMatrix* pObject2Bitmap,
- CPDF_Dictionary* pDict, CPDF_Function** pFuncs, int nFuncs,
- CPDF_ColorSpace* pCS, int alpha)
-{
- ASSERT(pBitmap->GetFormat() == FXDIB_Argb);
- CPDF_Array* pCoords = pDict->GetArray(FX_BSTRC("Coords"));
- if (pCoords == NULL) {
- return;
- }
- FX_FLOAT start_x = pCoords->GetNumber(0);
- FX_FLOAT start_y = pCoords->GetNumber(1);
- FX_FLOAT start_r = pCoords->GetNumber(2);
- FX_FLOAT end_x = pCoords->GetNumber(3);
- FX_FLOAT end_y = pCoords->GetNumber(4);
- FX_FLOAT end_r = pCoords->GetNumber(5);
- CFX_AffineMatrix matrix;
- matrix.SetReverse(*pObject2Bitmap);
- FX_FLOAT t_min = 0, t_max = 1.0f;
- CPDF_Array* pArray = pDict->GetArray(FX_BSTRC("Domain"));
- if (pArray) {
- t_min = pArray->GetNumber(0);
- t_max = pArray->GetNumber(1);
- }
- FX_BOOL bStartExtend = FALSE, bEndExtend = FALSE;
- pArray = pDict->GetArray(FX_BSTRC("Extend"));
- if (pArray) {
- bStartExtend = pArray->GetInteger(0);
- bEndExtend = pArray->GetInteger(1);
- }
- int total_results = 0;
- for (int j = 0; j < nFuncs; j ++) {
- if (pFuncs[j]) {
- total_results += pFuncs[j]->CountOutputs();
- }
- }
- if (pCS->CountComponents() > total_results) {
- total_results = pCS->CountComponents();
- }
- CFX_FixedBufGrow<FX_FLOAT, 16> result_array(total_results);
- FX_FLOAT* pResults = result_array;
- FXSYS_memset32(pResults, 0, total_results * sizeof(FX_FLOAT));
- FX_DWORD rgb_array[SHADING_STEPS];
- for (int i = 0; i < SHADING_STEPS; i ++) {
- FX_FLOAT input = (t_max - t_min) * i / SHADING_STEPS + t_min;
- int offset = 0;
- for (int j = 0; j < nFuncs; j ++) {
- if (pFuncs[j]) {
- int nresults;
- if (pFuncs[j]->Call(&input, 1, pResults + offset, nresults)) {
- offset += nresults;
- }
- }
- }
- FX_FLOAT R, G, B;
- pCS->GetRGB(pResults, R, G, B);
- rgb_array[i] = FXARGB_TODIB(FXARGB_MAKE(alpha, FXSYS_round(R * 255), FXSYS_round(G * 255), FXSYS_round(B * 255)));
- }
- FX_FLOAT a = FXSYS_Mul(start_x - end_x, start_x - end_x) +
- FXSYS_Mul(start_y - end_y, start_y - end_y) - FXSYS_Mul(start_r - end_r, start_r - end_r);
- int width = pBitmap->GetWidth();
- int height = pBitmap->GetHeight();
- int pitch = pBitmap->GetPitch();
- int Bpp = pBitmap->GetBPP() / 8;
- FX_BOOL bDecreasing = FALSE;
- if (start_r > end_r) {
- int length = (int)FXSYS_sqrt((FXSYS_Mul(start_x - end_x, start_x - end_x) + FXSYS_Mul(start_y - end_y, start_y - end_y)));
- if (length < start_r - end_r) {
- bDecreasing = TRUE;
- }
- }
- for (int row = 0; row < height; row ++) {
- FX_DWORD* dib_buf = (FX_DWORD*)(pBitmap->GetBuffer() + row * pitch);
- for (int column = 0; column < width; column ++) {
- FX_FLOAT x = (FX_FLOAT)column, y = (FX_FLOAT)row;
- matrix.Transform(x, y);
- FX_FLOAT b = -2 * (FXSYS_Mul(x - start_x, end_x - start_x) + FXSYS_Mul(y - start_y, end_y - start_y) +
- FXSYS_Mul(start_r, end_r - start_r));
- FX_FLOAT c = FXSYS_Mul(x - start_x, x - start_x) + FXSYS_Mul(y - start_y, y - start_y) -
- FXSYS_Mul(start_r, start_r);
- FX_FLOAT s;
- if (a == 0) {
- s = FXSYS_Div(-c, b);
- } else {
- FX_FLOAT b2_4ac = FXSYS_Mul(b, b) - 4 * FXSYS_Mul(a, c);
- if (b2_4ac < 0) {
- continue;
- }
- FX_FLOAT root = FXSYS_sqrt(b2_4ac);
- FX_FLOAT s1, s2;
- if (a > 0) {
- s1 = FXSYS_Div(-b - root, 2 * a);
- s2 = FXSYS_Div(-b + root, 2 * a);
- } else {
- s2 = FXSYS_Div(-b - root, 2 * a);
- s1 = FXSYS_Div(-b + root, 2 * a);
- }
- if (bDecreasing) {
- if (s1 >= 0 || bStartExtend) {
- s = s1;
- } else {
- s = s2;
- }
- } else {
- if (s2 <= 1.0f || bEndExtend) {
- s = s2;
- } else {
- s = s1;
- }
- }
- if ((start_r + s * (end_r - start_r)) < 0) {
- continue;
- }
- }
- int index = (FX_INT32)(s * (SHADING_STEPS - 1));
- if (index < 0) {
- if (!bStartExtend) {
- continue;
- }
- index = 0;
- }
- if (index >= SHADING_STEPS) {
- if (!bEndExtend) {
- continue;
- }
- index = SHADING_STEPS - 1;
- }
- dib_buf[column] = rgb_array[index];
- }
- }
-}
-static void _DrawFuncShading(CFX_DIBitmap* pBitmap, CFX_AffineMatrix* pObject2Bitmap,
- CPDF_Dictionary* pDict, CPDF_Function** pFuncs, int nFuncs,
- CPDF_ColorSpace* pCS, int alpha)
-{
- ASSERT(pBitmap->GetFormat() == FXDIB_Argb);
- CPDF_Array* pDomain = pDict->GetArray(FX_BSTRC("Domain"));
- FX_FLOAT xmin = 0, ymin = 0, xmax = 1.0f, ymax = 1.0f;
- if (pDomain) {
- xmin = pDomain->GetNumber(0);
- xmax = pDomain->GetNumber(1);
- ymin = pDomain->GetNumber(2);
- ymax = pDomain->GetNumber(3);
- }
- CFX_AffineMatrix mtDomain2Target = pDict->GetMatrix(FX_BSTRC("Matrix"));
- CFX_AffineMatrix matrix, reverse_matrix;
- matrix.SetReverse(*pObject2Bitmap);
- reverse_matrix.SetReverse(mtDomain2Target);
- matrix.Concat(reverse_matrix);
- int width = pBitmap->GetWidth();
- int height = pBitmap->GetHeight();
- int pitch = pBitmap->GetPitch();
- int Bpp = pBitmap->GetBPP() / 8;
- int total_results = 0;
- for (int j = 0; j < nFuncs; j ++) {
- if (pFuncs[j]) {
- total_results += pFuncs[j]->CountOutputs();
- }
- }
- if (pCS->CountComponents() > total_results) {
- total_results = pCS->CountComponents();
- }
- CFX_FixedBufGrow<FX_FLOAT, 16> result_array(total_results);
- FX_FLOAT* pResults = result_array;
- FXSYS_memset32(pResults, 0, total_results * sizeof(FX_FLOAT));
- for (int row = 0; row < height; row ++) {
- FX_DWORD* dib_buf = (FX_DWORD*)(pBitmap->GetBuffer() + row * pitch);
- for (int column = 0; column < width; column ++) {
- FX_FLOAT x = (FX_FLOAT)column, y = (FX_FLOAT)row;
- matrix.Transform(x, y);
- if (x < xmin || x > xmax || y < ymin || y > ymax) {
- continue;
- }
- FX_FLOAT input[2];
- int offset = 0;
- input[0] = x;
- input[1] = y;
- for (int j = 0; j < nFuncs; j ++) {
- if (pFuncs[j]) {
- int nresults;
- if (pFuncs[j]->Call(input, 2, pResults + offset, nresults)) {
- offset += nresults;
- }
- }
- }
- FX_FLOAT R, G, B;
- pCS->GetRGB(pResults, R, G, B);
- dib_buf[column] = FXARGB_TODIB(FXARGB_MAKE(alpha, (FX_INT32)(R * 255), (FX_INT32)(G * 255), (FX_INT32)(B * 255)));
- }
- }
-}
-FX_BOOL _GetScanlineIntersect(int y, FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2, FX_FLOAT& x)
-{
- if (y1 == y2) {
- return FALSE;
- }
- if (y1 < y2) {
- if (y < y1 || y > y2) {
- return FALSE;
- }
- } else {
- if (y < y2 || y > y1) {
- return FALSE;
- }
- }
- x = x1 + FXSYS_MulDiv(x2 - x1, y - y1, y2 - y1);
- return TRUE;
-}
-static void _DrawGouraud(CFX_DIBitmap* pBitmap, int alpha, CPDF_MeshVertex triangle[3])
-{
- FX_FLOAT min_y = triangle[0].y, max_y = triangle[0].y;
- for (int i = 1; i < 3; i ++) {
- if (min_y > triangle[i].y) {
- min_y = triangle[i].y;
- }
- if (max_y < triangle[i].y) {
- max_y = triangle[i].y;
- }
- }
- if (min_y == max_y) {
- return;
- }
- int min_yi = (int)FXSYS_floor(min_y), max_yi = (int)FXSYS_ceil(max_y);
- if (min_yi < 0) {
- min_yi = 0;
- }
- if (max_yi >= pBitmap->GetHeight()) {
- max_yi = pBitmap->GetHeight() - 1;
- }
- for (int y = min_yi; y <= max_yi; y ++) {
- int nIntersects = 0;
- FX_FLOAT inter_x[3], r[3], g[3], b[3];
- for (int i = 0; i < 3; i ++) {
- CPDF_MeshVertex& vertex1 = triangle[i];
- CPDF_MeshVertex& vertex2 = triangle[(i + 1) % 3];
- FX_BOOL bIntersect = _GetScanlineIntersect(y, vertex1.x, vertex1.y,
- vertex2.x, vertex2.y, inter_x[nIntersects]);
- if (!bIntersect) {
- continue;
- }
- r[nIntersects] = vertex1.r + FXSYS_MulDiv(vertex2.r - vertex1.r, y - vertex1.y, vertex2.y - vertex1.y);
- g[nIntersects] = vertex1.g + FXSYS_MulDiv(vertex2.g - vertex1.g, y - vertex1.y, vertex2.y - vertex1.y);
- b[nIntersects] = vertex1.b + FXSYS_MulDiv(vertex2.b - vertex1.b, y - vertex1.y, vertex2.y - vertex1.y);
- nIntersects ++;
- }
- if (nIntersects != 2) {
- continue;
- }
- int min_x, max_x, start_index, end_index;
- if (inter_x[0] < inter_x[1]) {
- min_x = (int)FXSYS_floor(inter_x[0]);
- max_x = (int)FXSYS_ceil(inter_x[1]);
- start_index = 0;
- end_index = 1;
- } else {
- min_x = (int)FXSYS_floor(inter_x[1]);
- max_x = (int)FXSYS_ceil(inter_x[0]);
- start_index = 1;
- end_index = 0;
- }
- int start_x = min_x, end_x = max_x;
- if (start_x < 0) {
- start_x = 0;
- }
- if (end_x > pBitmap->GetWidth()) {
- end_x = pBitmap->GetWidth();
- }
- FX_LPBYTE dib_buf = pBitmap->GetBuffer() + y * pBitmap->GetPitch() + start_x * 4;
- FX_FLOAT r_unit = (r[end_index] - r[start_index]) / (max_x - min_x);
- FX_FLOAT g_unit = (g[end_index] - g[start_index]) / (max_x - min_x);
- FX_FLOAT b_unit = (b[end_index] - b[start_index]) / (max_x - min_x);
- FX_FLOAT R = r[start_index] + (start_x - min_x) * r_unit;
- FX_FLOAT G = g[start_index] + (start_x - min_x) * g_unit;
- FX_FLOAT B = b[start_index] + (start_x - min_x) * b_unit;
- for (int x = start_x; x < end_x; x ++) {
- R += r_unit;
- G += g_unit;
- B += b_unit;
- FXARGB_SETDIB(dib_buf, FXARGB_MAKE(alpha, (FX_INT32)(R * 255), (FX_INT32)(G * 255), (FX_INT32)(B * 255)));
- dib_buf += 4;
- }
- }
-}
-static void _DrawFreeGouraudShading(CFX_DIBitmap* pBitmap, CFX_AffineMatrix* pObject2Bitmap,
- CPDF_Stream* pShadingStream, CPDF_Function** pFuncs, int nFuncs,
- CPDF_ColorSpace* pCS, int alpha)
-{
- ASSERT(pBitmap->GetFormat() == FXDIB_Argb);
- if (pShadingStream->GetType() != PDFOBJ_STREAM) {
- return;
- }
- CPDF_MeshStream stream;
- if (!stream.Load(pShadingStream, pFuncs, nFuncs, pCS)) {
- return;
- }
- CPDF_MeshVertex triangle[3];
- while (!stream.m_BitStream.IsEOF()) {
- CPDF_MeshVertex vertex;
- FX_DWORD flag = stream.GetVertex(vertex, pObject2Bitmap);
- if (flag == 0) {
- triangle[0] = vertex;
- for (int j = 1; j < 3; j ++) {
- stream.GetVertex(triangle[j], pObject2Bitmap);
- }
- } else {
- if (flag == 1) {
- triangle[0] = triangle[1];
- }
- triangle[1] = triangle[2];
- triangle[2] = vertex;
- }
- _DrawGouraud(pBitmap, alpha, triangle);
- }
-}
-static void _DrawLatticeGouraudShading(CFX_DIBitmap* pBitmap, CFX_AffineMatrix* pObject2Bitmap,
- CPDF_Stream* pShadingStream, CPDF_Function** pFuncs, int nFuncs,
- CPDF_ColorSpace* pCS, int alpha)
-{
- ASSERT(pBitmap->GetFormat() == FXDIB_Argb);
- if (pShadingStream->GetType() != PDFOBJ_STREAM) {
- return;
- }
- int row_verts = pShadingStream->GetDict()->GetInteger("VerticesPerRow");
- if (row_verts < 2) {
- return;
- }
- CPDF_MeshStream stream;
- if (!stream.Load(pShadingStream, pFuncs, nFuncs, pCS)) {
- return;
- }
- CPDF_MeshVertex* vertex = FX_Alloc(CPDF_MeshVertex, row_verts * 2);
- if (!stream.GetVertexRow(vertex, row_verts, pObject2Bitmap)) {
- FX_Free(vertex);
- return;
- }
- int last_index = 0;
- while (1) {
- CPDF_MeshVertex* last_row = vertex + last_index * row_verts;
- CPDF_MeshVertex* this_row = vertex + (1 - last_index) * row_verts;
- if (!stream.GetVertexRow(this_row, row_verts, pObject2Bitmap)) {
- FX_Free(vertex);
- return;
- }
- CPDF_MeshVertex triangle[3];
- for (int i = 1; i < row_verts; i ++) {
- triangle[0] = last_row[i];
- triangle[1] = this_row[i - 1];
- triangle[2] = last_row[i - 1];
- _DrawGouraud(pBitmap, alpha, triangle);
- triangle[2] = this_row[i];
- _DrawGouraud(pBitmap, alpha, triangle);
- }
- last_index = 1 - last_index;
- }
- FX_Free(vertex);
-}
-struct Coon_BezierCoeff {
- float a, b, c, d;
- void FromPoints(float p0, float p1, float p2, float p3)
- {
- a = -p0 + 3 * p1 - 3 * p2 + p3;
- b = 3 * p0 - 6 * p1 + 3 * p2;
- c = -3 * p0 + 3 * p1;
- d = p0;
- }
- Coon_BezierCoeff first_half()
- {
- Coon_BezierCoeff result;
- result.a = a / 8;
- result.b = b / 4;
- result.c = c / 2;
- result.d = d;
- return result;
- }
- Coon_BezierCoeff second_half()
- {
- Coon_BezierCoeff result;
- result.a = a / 8;
- result.b = 3 * a / 8 + b / 4;
- result.c = 3 * a / 8 + b / 2 + c / 2;
- result.d = a / 8 + b / 4 + c / 2 + d;
- return result;
- }
- void GetPoints(float p[4])
- {
- p[0] = d;
- p[1] = c / 3 + p[0];
- p[2] = b / 3 - p[0] + 2 * p[1];
- p[3] = a + p[0] - 3 * p[1] + 3 * p[2];
- }
- void GetPointsReverse(float p[4])
- {
- p[3] = d;
- p[2] = c / 3 + p[3];
- p[1] = b / 3 - p[3] + 2 * p[2];
- p[0] = a + p[3] - 3 * p[2] + 3 * p[1];
- }
- void BezierInterpol(Coon_BezierCoeff& C1, Coon_BezierCoeff& C2, Coon_BezierCoeff& D1, Coon_BezierCoeff& D2)
- {
- a = (D1.a + D2.a) / 2;
- b = (D1.b + D2.b) / 2;
- c = (D1.c + D2.c) / 2 - (C1.a / 8 + C1.b / 4 + C1.c / 2) + (C2.a / 8 + C2.b / 4) + (-C1.d + D2.d) / 2 - (C2.a + C2.b) / 2;
- d = C1.a / 8 + C1.b / 4 + C1.c / 2 + C1.d;
- }
- float Distance()
- {
- float dis = a + b + c;
- return dis < 0 ? -dis : dis;
- }
-};
-struct Coon_Bezier {
- Coon_BezierCoeff x, y;
- void FromPoints(float x0, float y0, float x1, float y1, float x2, float y2, float x3, float y3)
- {
- x.FromPoints(x0, x1, x2, x3);
- y.FromPoints(y0, y1, y2, y3);
- }
- Coon_Bezier first_half()
- {
- Coon_Bezier result;
- result.x = x.first_half();
- result.y = y.first_half();
- return result;
- }
- Coon_Bezier second_half()
- {
- Coon_Bezier result;
- result.x = x.second_half();
- result.y = y.second_half();
- return result;
- }
- void BezierInterpol(Coon_Bezier& C1, Coon_Bezier& C2, Coon_Bezier& D1, Coon_Bezier& D2)
- {
- x.BezierInterpol(C1.x, C2.x, D1.x, D2.x);
- y.BezierInterpol(C1.y, C2.y, D1.y, D2.y);
- }
- void GetPoints(FX_PATHPOINT* pPoints)
- {
- float p[4];
- int i;
- x.GetPoints(p);
- for (i = 0; i < 4; i ++) {
- pPoints[i].m_PointX = p[i];
- }
- y.GetPoints(p);
- for (i = 0; i < 4; i ++) {
- pPoints[i].m_PointY = p[i];
- }
- }
- void GetPointsReverse(FX_PATHPOINT* pPoints)
- {
- float p[4];
- int i;
- x.GetPointsReverse(p);
- for (i = 0; i < 4; i ++) {
- pPoints[i].m_PointX = p[i];
- }
- y.GetPointsReverse(p);
- for (i = 0; i < 4; i ++) {
- pPoints[i].m_PointY = p[i];
- }
- }
- float Distance()
- {
- return x.Distance() + y.Distance();
- }
-};
-static int _BiInterpol(int c0, int c1, int c2, int c3, int x, int y, int x_scale, int y_scale)
-{
- int x1 = c0 + (c3 - c0) * x / x_scale;
- int x2 = c1 + (c2 - c1) * x / x_scale;
- return x1 + (x2 - x1) * y / y_scale;
-}
-struct Coon_Color {
- Coon_Color()
- {
- FXSYS_memset32(comp, 0, sizeof(int) * 3);
- }
- int comp[3];
- void BiInterpol(Coon_Color colors[4], int x, int y, int x_scale, int y_scale)
- {
- for (int i = 0; i < 3; i ++)
- comp[i] = _BiInterpol(colors[0].comp[i], colors[1].comp[i], colors[2].comp[i], colors[3].comp[i],
- x, y, x_scale, y_scale);
- }
- int Distance(Coon_Color& o)
- {
- int max, diff;
- max = FXSYS_abs(comp[0] - o.comp[0]);
- diff = FXSYS_abs(comp[1] - o.comp[1]);
- if (max < diff) {
- max = diff;
- }
- diff = FXSYS_abs(comp[2] - o.comp[2]);
- if (max < diff) {
- max = diff;
- }
- return max;
- }
-};
-struct CPDF_PatchDrawer {
- Coon_Color patch_colors[4];
- int max_delta;
- CFX_PathData path;
- CFX_RenderDevice* pDevice;
- int fill_mode;
- int alpha;
- void Draw(int x_scale, int y_scale, int left, int bottom, Coon_Bezier C1, Coon_Bezier C2, Coon_Bezier D1, Coon_Bezier D2)
- {
- FX_BOOL bSmall = C1.Distance() < 2 && C2.Distance() < 2 && D1.Distance() < 2 && D2.Distance() < 2;
- Coon_Color div_colors[4];
- int d_bottom, d_left, d_top, d_right;
- div_colors[0].BiInterpol(patch_colors, left, bottom, x_scale, y_scale);
- if (!bSmall) {
- div_colors[1].BiInterpol(patch_colors, left, bottom + 1, x_scale, y_scale);
- div_colors[2].BiInterpol(patch_colors, left + 1, bottom + 1, x_scale, y_scale);
- div_colors[3].BiInterpol(patch_colors, left + 1, bottom, x_scale, y_scale);
- d_bottom = div_colors[3].Distance(div_colors[0]);
- d_left = div_colors[1].Distance(div_colors[0]);
- d_top = div_colors[1].Distance(div_colors[2]);
- d_right = div_colors[2].Distance(div_colors[3]);
- }
-#define COONCOLOR_THRESHOLD 4
- if (bSmall || (d_bottom < COONCOLOR_THRESHOLD && d_left < COONCOLOR_THRESHOLD &&
- d_top < COONCOLOR_THRESHOLD && d_right < COONCOLOR_THRESHOLD)) {
- FX_PATHPOINT* pPoints = path.GetPoints();
- C1.GetPoints(pPoints);
- D2.GetPoints(pPoints + 3);
- C2.GetPointsReverse(pPoints + 6);
- D1.GetPointsReverse(pPoints + 9);
- int fillFlags = FXFILL_WINDING | FXFILL_FULLCOVER;
- if (fill_mode & RENDER_NOPATHSMOOTH) {
- fillFlags |= FXFILL_NOPATHSMOOTH;
- }
- pDevice->DrawPath(&path, NULL, NULL, FXARGB_MAKE(alpha, div_colors[0].comp[0], div_colors[0].comp[1], div_colors[0].comp[2]), 0, fillFlags);
- } else {
- if (d_bottom < COONCOLOR_THRESHOLD && d_top < COONCOLOR_THRESHOLD) {
- Coon_Bezier m1;
- m1.BezierInterpol(D1, D2, C1, C2);
- y_scale *= 2;
- bottom *= 2;
- Draw(x_scale, y_scale, left, bottom, C1, m1, D1.first_half(), D2.first_half());
- Draw(x_scale, y_scale, left, bottom + 1, m1, C2, D1.second_half(), D2.second_half());
- } else if (d_left < COONCOLOR_THRESHOLD && d_right < COONCOLOR_THRESHOLD) {
- Coon_Bezier m2;
- m2.BezierInterpol(C1, C2, D1, D2);
- x_scale *= 2;
- left *= 2;
- Draw(x_scale, y_scale, left, bottom, C1.first_half(), C2.first_half(), D1, m2);
- Draw(x_scale, y_scale, left + 1, bottom, C1.second_half(), C2.second_half(), m2, D2);
- } else {
- Coon_Bezier m1, m2;
- m1.BezierInterpol(D1, D2, C1, C2);
- m2.BezierInterpol(C1, C2, D1, D2);
- Coon_Bezier m1f = m1.first_half();
- Coon_Bezier m1s = m1.second_half();
- Coon_Bezier m2f = m2.first_half();
- Coon_Bezier m2s = m2.second_half();
- x_scale *= 2;
- y_scale *= 2;
- left *= 2;
- bottom *= 2;
- Draw(x_scale, y_scale, left, bottom, C1.first_half(), m1f, D1.first_half(), m2f);
- Draw(x_scale, y_scale, left, bottom + 1, m1f, C2.first_half(), D1.second_half(), m2s);
- Draw(x_scale, y_scale, left + 1, bottom, C1.second_half(), m1s, m2f, D2.first_half());
- Draw(x_scale, y_scale, left + 1, bottom + 1, m1s, C2.second_half(), m2s, D2.second_half());
- }
- }
- }
-};
-static void _DrawCoonPatchMeshes(FX_BOOL bTensor, CFX_DIBitmap* pBitmap, CFX_AffineMatrix* pObject2Bitmap,
- CPDF_Stream* pShadingStream, CPDF_Function** pFuncs, int nFuncs,
- CPDF_ColorSpace* pCS, int fill_mode, int alpha)
-{
- ASSERT(pBitmap->GetFormat() == FXDIB_Argb);
- if (pShadingStream->GetType() != PDFOBJ_STREAM) {
- return;
- }
- CFX_FxgeDevice device;
- device.Attach(pBitmap);
- CPDF_MeshStream stream;
- if (!stream.Load(pShadingStream, pFuncs, nFuncs, pCS)) {
- return;
- }
- CPDF_PatchDrawer patch;
- patch.alpha = alpha;
- patch.pDevice = &device;
- patch.fill_mode = fill_mode;
- patch.path.SetPointCount(13);
- FX_PATHPOINT* pPoints = patch.path.GetPoints();
- pPoints[0].m_Flag = FXPT_MOVETO;
- for (int i = 1; i < 13; i ++) {
- pPoints[i].m_Flag = FXPT_BEZIERTO;
- }
- CFX_FloatPoint coords[16];
- int point_count = bTensor ? 16 : 12;
- while (!stream.m_BitStream.IsEOF()) {
- FX_DWORD flag = stream.GetFlag();
- int iStartPoint = 0, iStartColor = 0, i;
- if (flag) {
- iStartPoint = 4;
- iStartColor = 2;
- CFX_FloatPoint tempCoords[4];
- for (int i = 0; i < 4; i ++) {
- tempCoords[i] = coords[(flag * 3 + i) % 12];
- }
- FXSYS_memcpy32(coords, tempCoords, sizeof(CFX_FloatPoint) * 4);
- Coon_Color tempColors[2];
- tempColors[0] = patch.patch_colors[flag];
- tempColors[1] = patch.patch_colors[(flag + 1) % 4];
- FXSYS_memcpy32(patch.patch_colors, tempColors, sizeof(Coon_Color) * 2);
- }
- for (i = iStartPoint; i < point_count; i ++) {
- stream.GetCoords(coords[i].x, coords[i].y);
- pObject2Bitmap->Transform(coords[i].x, coords[i].y);
- }
- for (i = iStartColor; i < 4; i ++) {
- FX_FLOAT r, g, b;
- stream.GetColor(r, g, b);
- patch.patch_colors[i].comp[0] = (FX_INT32)(r * 255);
- patch.patch_colors[i].comp[1] = (FX_INT32)(g * 255);
- patch.patch_colors[i].comp[2] = (FX_INT32)(b * 255);
- }
- CFX_FloatRect bbox = CFX_FloatRect::GetBBox(coords, point_count);
- if (bbox.right <= 0 || bbox.left >= (FX_FLOAT)pBitmap->GetWidth() || bbox.top <= 0 ||
- bbox.bottom >= (FX_FLOAT)pBitmap->GetHeight()) {
- continue;
- }
- Coon_Bezier C1, C2, D1, D2;
- C1.FromPoints(coords[0].x, coords[0].y, coords[11].x, coords[11].y, coords[10].x, coords[10].y,
- coords[9].x, coords[9].y);
- C2.FromPoints(coords[3].x, coords[3].y, coords[4].x, coords[4].y, coords[5].x, coords[5].y,
- coords[6].x, coords[6].y);
- D1.FromPoints(coords[0].x, coords[0].y, coords[1].x, coords[1].y, coords[2].x, coords[2].y,
- coords[3].x, coords[3].y);
- D2.FromPoints(coords[9].x, coords[9].y, coords[8].x, coords[8].y, coords[7].x, coords[7].y,
- coords[6].x, coords[6].y);
- patch.Draw(1, 1, 0, 0, C1, C2, D1, D2);
- }
-}
-void CPDF_RenderStatus::DrawShading(CPDF_ShadingPattern* pPattern, CFX_AffineMatrix* pMatrix,
- FX_RECT& clip_rect, int alpha, FX_BOOL bAlphaMode)
-{
- int width = clip_rect.Width();
- int height = clip_rect.Height();
- CPDF_Function** pFuncs = pPattern->m_pFunctions;
- int nFuncs = pPattern->m_nFuncs;
- CPDF_Dictionary* pDict = pPattern->m_pShadingObj->GetDict();
- CPDF_ColorSpace* pColorSpace = pPattern->m_pCS;
- if (pColorSpace == NULL) {
- return;
- }
- FX_ARGB background = 0;
- if (!pPattern->m_bShadingObj && pPattern->m_pShadingObj->GetDict()->KeyExist(FX_BSTRC("Background"))) {
- CPDF_Array* pBackColor = pPattern->m_pShadingObj->GetDict()->GetArray(FX_BSTRC("Background"));
- if (pBackColor && pBackColor->GetCount() >= (FX_DWORD)pColorSpace->CountComponents()) {
- CFX_FixedBufGrow<FX_FLOAT, 16> comps(pColorSpace->CountComponents());
- for (int i = 0; i < pColorSpace->CountComponents(); i ++) {
- comps[i] = pBackColor->GetNumber(i);
- }
- FX_FLOAT R, G, B;
- pColorSpace->GetRGB(comps, R, G, B);
- background = ArgbEncode(255, (FX_INT32)(R * 255), (FX_INT32)(G * 255), (FX_INT32)(B * 255));
- }
- }
- if (pDict->KeyExist(FX_BSTRC("BBox"))) {
- CFX_FloatRect rect = pDict->GetRect(FX_BSTRC("BBox"));
- rect.Transform(pMatrix);
- clip_rect.Intersect(rect.GetOutterRect());
- }
- CPDF_DeviceBuffer buffer;
- buffer.Initialize(m_pContext, m_pDevice, &clip_rect, m_pCurObj, 150);
- CFX_AffineMatrix FinalMatrix = *pMatrix;
- FinalMatrix.Concat(*buffer.GetMatrix());
- CFX_DIBitmap* pBitmap = buffer.GetBitmap();
- if (pBitmap->GetBuffer() == NULL) {
- return;
- }
- pBitmap->Clear(background);
- int fill_mode = m_Options.m_Flags;
- switch (pPattern->m_ShadingType) {
- case 1:
- _DrawFuncShading(pBitmap, &FinalMatrix, pDict, pFuncs, nFuncs, pColorSpace, alpha);
- break;
- case 2:
- _DrawAxialShading(pBitmap, &FinalMatrix, pDict, pFuncs, nFuncs, pColorSpace, alpha);
- break;
- case 3:
- _DrawRadialShading(pBitmap, &FinalMatrix, pDict, pFuncs, nFuncs, pColorSpace, alpha);
- break;
- case 4: {
- _DrawFreeGouraudShading(pBitmap, &FinalMatrix, (CPDF_Stream*)pPattern->m_pShadingObj,
- pFuncs, nFuncs, pColorSpace, alpha);
- }
- break;
- case 5: {
- _DrawLatticeGouraudShading(pBitmap, &FinalMatrix, (CPDF_Stream*)pPattern->m_pShadingObj,
- pFuncs, nFuncs, pColorSpace, alpha);
- }
- break;
- case 6:
- case 7: {
- _DrawCoonPatchMeshes(pPattern->m_ShadingType - 6, pBitmap, &FinalMatrix, (CPDF_Stream*)pPattern->m_pShadingObj,
- pFuncs, nFuncs, pColorSpace, fill_mode, alpha);
- }
- break;
- }
- if (bAlphaMode) {
- pBitmap->LoadChannel(FXDIB_Red, pBitmap, FXDIB_Alpha);
- }
- if (m_Options.m_ColorMode == RENDER_COLOR_GRAY) {
- pBitmap->ConvertColorScale(m_Options.m_ForeColor, m_Options.m_BackColor);
- }
- buffer.OutputToDevice();
-}
-void CPDF_RenderStatus::DrawShadingPattern(CPDF_ShadingPattern* pattern, CPDF_PageObject* pPageObj, const CFX_AffineMatrix* pObj2Device, FX_BOOL bStroke)
-{
- if (!pattern->Load()) {
- return;
- }
- m_pDevice->SaveState();
- if (pPageObj->m_Type == PDFPAGE_PATH) {
- if (!SelectClipPath((CPDF_PathObject*)pPageObj, pObj2Device, bStroke)) {
- m_pDevice->RestoreState();
- return;
- }
- } else if (pPageObj->m_Type == PDFPAGE_IMAGE) {
- FX_RECT rect = pPageObj->GetBBox(pObj2Device);
- m_pDevice->SetClip_Rect(&rect);
- } else {
- return;
- }
- FX_RECT rect;
- if (GetObjectClippedRect(pPageObj, pObj2Device, FALSE, rect)) {
- m_pDevice->RestoreState();
- return;
- }
- CFX_AffineMatrix matrix = pattern->m_Pattern2Form;
- matrix.Concat(*pObj2Device);
- GetScaledMatrix(matrix);
- int alpha = pPageObj->m_GeneralState.GetAlpha(bStroke);
- DrawShading(pattern, &matrix, rect, alpha, m_Options.m_ColorMode == RENDER_COLOR_ALPHA);
- m_pDevice->RestoreState();
-}
-FX_BOOL CPDF_RenderStatus::ProcessShading(CPDF_ShadingObject* pShadingObj, const CFX_AffineMatrix* pObj2Device)
-{
- FX_RECT rect = pShadingObj->GetBBox(pObj2Device);
- FX_RECT clip_box = m_pDevice->GetClipBox();
- rect.Intersect(clip_box);
- if (rect.IsEmpty()) {
- return TRUE;
- }
- CFX_AffineMatrix matrix = pShadingObj->m_Matrix;
- matrix.Concat(*pObj2Device);
- DrawShading(pShadingObj->m_pShading, &matrix, rect, pShadingObj->m_GeneralState.GetAlpha(FALSE),
- m_Options.m_ColorMode == RENDER_COLOR_ALPHA);
-#ifdef _FPDFAPI_MINI_
- if (m_DitherBits) {
- DitherObjectArea(pShadingObj, pObj2Device);
- }
-#endif
- return TRUE;
-}
-static CFX_DIBitmap* DrawPatternBitmap(CPDF_Document* pDoc, CPDF_PageRenderCache* pCache,
- CPDF_TilingPattern* pPattern, const CFX_AffineMatrix* pObject2Device,
- int width, int height, int flags)
-{
- CFX_DIBitmap* pBitmap = FX_NEW CFX_DIBitmap;
- if (!pBitmap->Create(width, height, pPattern->m_bColored ? FXDIB_Argb : FXDIB_8bppMask)) {
- delete pBitmap;
- return NULL;
- }
- CFX_FxgeDevice bitmap_device;
- bitmap_device.Attach(pBitmap);
- pBitmap->Clear(0);
- CFX_FloatRect cell_bbox = pPattern->m_BBox;
- pPattern->m_Pattern2Form.TransformRect(cell_bbox);
- pObject2Device->TransformRect(cell_bbox);
- CFX_FloatRect bitmap_rect(0.0f, 0.0f, (FX_FLOAT)width, (FX_FLOAT)height);
- CFX_AffineMatrix mtAdjust;
- mtAdjust.MatchRect(bitmap_rect, cell_bbox);
- CFX_AffineMatrix mtPattern2Bitmap = *pObject2Device;
- mtPattern2Bitmap.Concat(mtAdjust);
- CPDF_RenderOptions options;
- if (!pPattern->m_bColored) {
- options.m_ColorMode = RENDER_COLOR_ALPHA;
- }
- flags |= RENDER_FORCE_HALFTONE;
- options.m_Flags = flags;
- CPDF_RenderContext context;
- context.Create(pDoc, pCache, NULL);
- context.DrawObjectList(&bitmap_device, pPattern->m_pForm, &mtPattern2Bitmap, &options);
- return pBitmap;
-}
-void CPDF_RenderStatus::DrawTilingPattern(CPDF_TilingPattern* pPattern, CPDF_PageObject* pPageObj, const CFX_AffineMatrix* pObj2Device, FX_BOOL bStroke)
-{
- if (!pPattern->Load()) {
- return;
- }
- m_pDevice->SaveState();
- if (pPageObj->m_Type == PDFPAGE_PATH) {
- if (!SelectClipPath((CPDF_PathObject*)pPageObj, pObj2Device, bStroke)) {
- m_pDevice->RestoreState();
- return;
- }
- } else if (pPageObj->m_Type == PDFPAGE_IMAGE) {
- FX_RECT rect = pPageObj->GetBBox(pObj2Device);
- m_pDevice->SetClip_Rect(&rect);
- } else {
- return;
- }
- FX_RECT clip_box = m_pDevice->GetClipBox();
- if (clip_box.IsEmpty()) {
- m_pDevice->RestoreState();
- return;
- }
- CFX_Matrix dCTM = m_pDevice->GetCTM();
- FX_FLOAT sa = FXSYS_fabs(dCTM.a);
- FX_FLOAT sd = FXSYS_fabs(dCTM.d);
- clip_box.right = clip_box.left + (FX_INT32)FXSYS_ceil(clip_box.Width() * sa);
- clip_box.bottom = clip_box.top + (FX_INT32)FXSYS_ceil(clip_box.Height() * sd);
- CFX_AffineMatrix mtPattern2Device = pPattern->m_Pattern2Form;
- mtPattern2Device.Concat(*pObj2Device);
- GetScaledMatrix(mtPattern2Device);
- FX_BOOL bAligned = FALSE;
- if (pPattern->m_BBox.left == 0 && pPattern->m_BBox.bottom == 0 &&
- pPattern->m_BBox.right == pPattern->m_XStep && pPattern->m_BBox.top == pPattern->m_YStep &&
- (mtPattern2Device.IsScaled() || mtPattern2Device.Is90Rotated())) {
- bAligned = TRUE;
- }
- CFX_FloatRect cell_bbox = pPattern->m_BBox;
- mtPattern2Device.TransformRect(cell_bbox);
- int width = (int)FXSYS_ceil(cell_bbox.Width());
- int height = (int)FXSYS_ceil(cell_bbox.Height());
- if (width == 0) {
- width = 1;
- }
- if (height == 0) {
- height = 1;
- }
- int min_col, max_col, min_row, max_row;
- CFX_AffineMatrix mtDevice2Pattern;
- mtDevice2Pattern.SetReverse(mtPattern2Device);
- CFX_FloatRect clip_box_p(clip_box);
- clip_box_p.Transform(&mtDevice2Pattern);
- min_col = (int)FXSYS_ceil(FXSYS_Div(clip_box_p.left - pPattern->m_BBox.right, pPattern->m_XStep));
- max_col = (int)FXSYS_floor(FXSYS_Div(clip_box_p.right - pPattern->m_BBox.left, pPattern->m_XStep));
- min_row = (int)FXSYS_ceil(FXSYS_Div(clip_box_p.bottom - pPattern->m_BBox.top, pPattern->m_YStep));
- max_row = (int)FXSYS_floor(FXSYS_Div(clip_box_p.top - pPattern->m_BBox.bottom, pPattern->m_YStep));
- if (width > clip_box.Width() || height > clip_box.Height() || width * height > clip_box.Width() * clip_box.Height()) {
- CPDF_GraphicStates* pStates = NULL;
- if (!pPattern->m_bColored) {
- pStates = CloneObjStates(pPageObj, bStroke);
- }
- CPDF_Dictionary* pFormResource = NULL;
- if (pPattern->m_pForm->m_pFormDict) {
- pFormResource = pPattern->m_pForm->m_pFormDict->GetDict(FX_BSTRC("Resources"));
- }
- for (int col = min_col; col <= max_col; col ++)
- for (int row = min_row; row <= max_row; row ++) {
- FX_FLOAT orig_x, orig_y;
- orig_x = col * pPattern->m_XStep;
- orig_y = row * pPattern->m_YStep;
- mtPattern2Device.Transform(orig_x, orig_y);
- CFX_AffineMatrix matrix = *pObj2Device;
- matrix.Translate(orig_x - mtPattern2Device.e, orig_y - mtPattern2Device.f);
- m_pDevice->SaveState();
- CPDF_RenderStatus status;
- status.Initialize(m_Level + 1, m_pContext, m_pDevice, NULL, NULL, this, pStates, &m_Options,
- pPattern->m_pForm->m_Transparency, m_bDropObjects, pFormResource);
- status.RenderObjectList(pPattern->m_pForm, &matrix);
- m_pDevice->RestoreState();
- }
- m_pDevice->RestoreState();
- if (pStates) {
- delete pStates;
- }
- return;
- }
- if (bAligned) {
- int orig_x = FXSYS_round(mtPattern2Device.e);
- int orig_y = FXSYS_round(mtPattern2Device.f);
- min_col = (clip_box.left - orig_x) / width;
- if (clip_box.left < orig_x) {
- min_col --;
- }
- max_col = (clip_box.right - orig_x) / width;
- if (clip_box.right <= orig_x) {
- max_col --;
- }
- min_row = (clip_box.top - orig_y) / height;
- if (clip_box.top < orig_y) {
- min_row --;
- }
- max_row = (clip_box.bottom - orig_y) / height;
- if (clip_box.bottom <= orig_y) {
- max_row --;
- }
- }
- FX_FLOAT left_offset = cell_bbox.left - mtPattern2Device.e;
- FX_FLOAT top_offset = cell_bbox.bottom - mtPattern2Device.f;
- CFX_DIBitmap* pPatternBitmap = NULL;
- if (width * height < 16) {
- CFX_DIBitmap* pEnlargedBitmap = DrawPatternBitmap(m_pContext->m_pDocument, m_pContext->m_pPageCache, pPattern, pObj2Device, 8, 8, m_Options.m_Flags);
- pPatternBitmap = pEnlargedBitmap->StretchTo(width, height);
- delete pEnlargedBitmap;
- } else {
- pPatternBitmap = DrawPatternBitmap(m_pContext->m_pDocument, m_pContext->m_pPageCache, pPattern, pObj2Device, width, height, m_Options.m_Flags);
- }
- if (pPatternBitmap == NULL) {
- m_pDevice->RestoreState();
- return;
- }
- if (m_Options.m_ColorMode == RENDER_COLOR_GRAY) {
- pPatternBitmap->ConvertColorScale(m_Options.m_ForeColor, m_Options.m_BackColor);
- }
- FX_ARGB fill_argb = GetFillArgb(pPageObj);
- int clip_width = clip_box.right - clip_box.left;
- int clip_height = clip_box.bottom - clip_box.top;
- CFX_DIBitmap screen;
- if (!screen.Create(clip_width, clip_height, FXDIB_Argb)) {
- return;
- }
- screen.Clear(0);
- FX_DWORD* src_buf = (FX_DWORD*)pPatternBitmap->GetBuffer();
- for (int col = min_col; col <= max_col; col ++) {
- for (int row = min_row; row <= max_row; row ++) {
- int start_x, start_y;
- if (bAligned) {
- start_x = FXSYS_round(mtPattern2Device.e) + col * width - clip_box.left;
- start_y = FXSYS_round(mtPattern2Device.f) + row * height - clip_box.top;
- } else {
- FX_FLOAT orig_x = col * pPattern->m_XStep;
- FX_FLOAT orig_y = row * pPattern->m_YStep;
- mtPattern2Device.Transform(orig_x, orig_y);
- start_x = FXSYS_round(orig_x + left_offset) - clip_box.left;
- start_y = FXSYS_round(orig_y + top_offset) - clip_box.top;
- }
- if (width == 1 && height == 1) {
- if (start_x < 0 || start_x >= clip_box.Width() || start_y < 0 || start_y >= clip_box.Height()) {
- continue;
- }
- FX_DWORD* dest_buf = (FX_DWORD*)(screen.GetBuffer() + screen.GetPitch() * start_y + start_x * 4);
- if (pPattern->m_bColored) {
- *dest_buf = *src_buf;
- } else {
- *dest_buf = (*(FX_LPBYTE)src_buf << 24) | (fill_argb & 0xffffff);
- }
- } else {
- if (pPattern->m_bColored) {
- screen.CompositeBitmap(start_x, start_y, width, height, pPatternBitmap, 0, 0);
- } else {
- screen.CompositeMask(start_x, start_y, width, height, pPatternBitmap, fill_argb, 0, 0);
- }
- }
- }
- }
- CompositeDIBitmap(&screen, clip_box.left, clip_box.top, 0, 255, FXDIB_BLEND_NORMAL, FALSE);
- m_pDevice->RestoreState();
- delete pPatternBitmap;
-}
-void CPDF_RenderStatus::DrawPathWithPattern(CPDF_PathObject* pPathObj, const CFX_AffineMatrix* pObj2Device, CPDF_Color* pColor, FX_BOOL bStroke)
-{
- CPDF_Pattern* pattern = pColor->GetPattern();
- if (pattern == NULL) {
- return;
- }
- if(pattern->m_PatternType == PATTERN_TILING) {
- DrawTilingPattern((CPDF_TilingPattern*)pattern, pPathObj, pObj2Device, bStroke);
- } else {
- DrawShadingPattern((CPDF_ShadingPattern*)pattern, pPathObj, pObj2Device, bStroke);
- }
-}
-void CPDF_RenderStatus::ProcessPathPattern(CPDF_PathObject* pPathObj, const CFX_AffineMatrix* pObj2Device, int& filltype, FX_BOOL& bStroke)
-{
- FX_BOOL bPattern = FALSE;
- if(filltype) {
- CPDF_Color& FillColor = *pPathObj->m_ColorState.GetFillColor();
- if(FillColor.m_pCS && FillColor.m_pCS->GetFamily() == PDFCS_PATTERN) {
- DrawPathWithPattern(pPathObj, pObj2Device, &FillColor, FALSE);
- filltype = 0;
- bPattern = TRUE;
- }
- }
- if(bStroke) {
- CPDF_Color& StrokeColor = *pPathObj->m_ColorState.GetStrokeColor();
- if(StrokeColor.m_pCS && StrokeColor.m_pCS->GetFamily() == PDFCS_PATTERN) {
- DrawPathWithPattern(pPathObj, pObj2Device, &StrokeColor, TRUE);
- bStroke = FALSE;
- bPattern = TRUE;
- }
- }
-#ifdef _FPDFAPI_MINI_
- if (bPattern && m_DitherBits) {
- DitherObjectArea(pPathObj, pObj2Device);
- }
-#endif
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fpdfapi/fpdf_render.h"
+#include "../../../include/fpdfapi/fpdf_pageobj.h"
+#include "../../../include/fxge/fx_ge.h"
+#include "../fpdf_page/pageint.h"
+#include "render_int.h"
+#define SHADING_STEPS 256
+static void _DrawAxialShading(CFX_DIBitmap* pBitmap, CFX_AffineMatrix* pObject2Bitmap,
+ CPDF_Dictionary* pDict, CPDF_Function** pFuncs, int nFuncs,
+ CPDF_ColorSpace* pCS, int alpha)
+{
+ ASSERT(pBitmap->GetFormat() == FXDIB_Argb);
+ CPDF_Array* pCoords = pDict->GetArray(FX_BSTRC("Coords"));
+ if (pCoords == NULL) {
+ return;
+ }
+ FX_FLOAT start_x = pCoords->GetNumber(0);
+ FX_FLOAT start_y = pCoords->GetNumber(1);
+ FX_FLOAT end_x = pCoords->GetNumber(2);
+ FX_FLOAT end_y = pCoords->GetNumber(3);
+ FX_FLOAT t_min = 0, t_max = 1.0f;
+ CPDF_Array* pArray = pDict->GetArray(FX_BSTRC("Domain"));
+ if (pArray) {
+ t_min = pArray->GetNumber(0);
+ t_max = pArray->GetNumber(1);
+ }
+ FX_BOOL bStartExtend = FALSE, bEndExtend = FALSE;
+ pArray = pDict->GetArray(FX_BSTRC("Extend"));
+ if (pArray) {
+ bStartExtend = pArray->GetInteger(0);
+ bEndExtend = pArray->GetInteger(1);
+ }
+ int width = pBitmap->GetWidth();
+ int height = pBitmap->GetHeight();
+ FX_FLOAT x_span = end_x - start_x;
+ FX_FLOAT y_span = end_y - start_y;
+ FX_FLOAT axis_len_square = FXSYS_Mul(x_span, x_span) + FXSYS_Mul(y_span, y_span);
+ CFX_AffineMatrix matrix;
+ matrix.SetReverse(*pObject2Bitmap);
+ int total_results = 0;
+ for (int j = 0; j < nFuncs; j ++) {
+ if (pFuncs[j]) {
+ total_results += pFuncs[j]->CountOutputs();
+ }
+ }
+ if (pCS->CountComponents() > total_results) {
+ total_results = pCS->CountComponents();
+ }
+ CFX_FixedBufGrow<FX_FLOAT, 16> result_array(total_results);
+ FX_FLOAT* pResults = result_array;
+ FXSYS_memset32(pResults, 0, total_results * sizeof(FX_FLOAT));
+ FX_DWORD rgb_array[SHADING_STEPS];
+ for (int i = 0; i < SHADING_STEPS; i ++) {
+ FX_FLOAT input = (t_max - t_min) * i / SHADING_STEPS + t_min;
+ int offset = 0;
+ for (int j = 0; j < nFuncs; j ++) {
+ if (pFuncs[j]) {
+ int nresults = 0;
+ if (pFuncs[j]->Call(&input, 1, pResults + offset, nresults)) {
+ offset += nresults;
+ }
+ }
+ }
+ FX_FLOAT R, G, B;
+ pCS->GetRGB(pResults, R, G, B);
+ rgb_array[i] = FXARGB_TODIB(FXARGB_MAKE(alpha, FXSYS_round(R * 255), FXSYS_round(G * 255), FXSYS_round(B * 255)));
+ }
+ int pitch = pBitmap->GetPitch();
+ int Bpp = pBitmap->GetBPP() / 8;
+ for (int row = 0; row < height; row ++) {
+ FX_DWORD* dib_buf = (FX_DWORD*)(pBitmap->GetBuffer() + row * pitch);
+ for (int column = 0; column < width; column ++) {
+ FX_FLOAT x = (FX_FLOAT)column, y = (FX_FLOAT)row;
+ matrix.Transform(x, y);
+ FX_FLOAT scale = FXSYS_Div(FXSYS_Mul(x - start_x, x_span) + FXSYS_Mul(y - start_y, y_span), axis_len_square);
+ int index = (FX_INT32)(scale * (SHADING_STEPS - 1));
+ if (index < 0) {
+ if (!bStartExtend) {
+ continue;
+ }
+ index = 0;
+ } else if (index >= SHADING_STEPS) {
+ if (!bEndExtend) {
+ continue;
+ }
+ index = SHADING_STEPS - 1;
+ }
+ dib_buf[column] = rgb_array[index];
+ }
+ }
+}
+static void _DrawRadialShading(CFX_DIBitmap* pBitmap, CFX_AffineMatrix* pObject2Bitmap,
+ CPDF_Dictionary* pDict, CPDF_Function** pFuncs, int nFuncs,
+ CPDF_ColorSpace* pCS, int alpha)
+{
+ ASSERT(pBitmap->GetFormat() == FXDIB_Argb);
+ CPDF_Array* pCoords = pDict->GetArray(FX_BSTRC("Coords"));
+ if (pCoords == NULL) {
+ return;
+ }
+ FX_FLOAT start_x = pCoords->GetNumber(0);
+ FX_FLOAT start_y = pCoords->GetNumber(1);
+ FX_FLOAT start_r = pCoords->GetNumber(2);
+ FX_FLOAT end_x = pCoords->GetNumber(3);
+ FX_FLOAT end_y = pCoords->GetNumber(4);
+ FX_FLOAT end_r = pCoords->GetNumber(5);
+ CFX_AffineMatrix matrix;
+ matrix.SetReverse(*pObject2Bitmap);
+ FX_FLOAT t_min = 0, t_max = 1.0f;
+ CPDF_Array* pArray = pDict->GetArray(FX_BSTRC("Domain"));
+ if (pArray) {
+ t_min = pArray->GetNumber(0);
+ t_max = pArray->GetNumber(1);
+ }
+ FX_BOOL bStartExtend = FALSE, bEndExtend = FALSE;
+ pArray = pDict->GetArray(FX_BSTRC("Extend"));
+ if (pArray) {
+ bStartExtend = pArray->GetInteger(0);
+ bEndExtend = pArray->GetInteger(1);
+ }
+ int total_results = 0;
+ for (int j = 0; j < nFuncs; j ++) {
+ if (pFuncs[j]) {
+ total_results += pFuncs[j]->CountOutputs();
+ }
+ }
+ if (pCS->CountComponents() > total_results) {
+ total_results = pCS->CountComponents();
+ }
+ CFX_FixedBufGrow<FX_FLOAT, 16> result_array(total_results);
+ FX_FLOAT* pResults = result_array;
+ FXSYS_memset32(pResults, 0, total_results * sizeof(FX_FLOAT));
+ FX_DWORD rgb_array[SHADING_STEPS];
+ for (int i = 0; i < SHADING_STEPS; i ++) {
+ FX_FLOAT input = (t_max - t_min) * i / SHADING_STEPS + t_min;
+ int offset = 0;
+ for (int j = 0; j < nFuncs; j ++) {
+ if (pFuncs[j]) {
+ int nresults;
+ if (pFuncs[j]->Call(&input, 1, pResults + offset, nresults)) {
+ offset += nresults;
+ }
+ }
+ }
+ FX_FLOAT R, G, B;
+ pCS->GetRGB(pResults, R, G, B);
+ rgb_array[i] = FXARGB_TODIB(FXARGB_MAKE(alpha, FXSYS_round(R * 255), FXSYS_round(G * 255), FXSYS_round(B * 255)));
+ }
+ FX_FLOAT a = FXSYS_Mul(start_x - end_x, start_x - end_x) +
+ FXSYS_Mul(start_y - end_y, start_y - end_y) - FXSYS_Mul(start_r - end_r, start_r - end_r);
+ int width = pBitmap->GetWidth();
+ int height = pBitmap->GetHeight();
+ int pitch = pBitmap->GetPitch();
+ int Bpp = pBitmap->GetBPP() / 8;
+ FX_BOOL bDecreasing = FALSE;
+ if (start_r > end_r) {
+ int length = (int)FXSYS_sqrt((FXSYS_Mul(start_x - end_x, start_x - end_x) + FXSYS_Mul(start_y - end_y, start_y - end_y)));
+ if (length < start_r - end_r) {
+ bDecreasing = TRUE;
+ }
+ }
+ for (int row = 0; row < height; row ++) {
+ FX_DWORD* dib_buf = (FX_DWORD*)(pBitmap->GetBuffer() + row * pitch);
+ for (int column = 0; column < width; column ++) {
+ FX_FLOAT x = (FX_FLOAT)column, y = (FX_FLOAT)row;
+ matrix.Transform(x, y);
+ FX_FLOAT b = -2 * (FXSYS_Mul(x - start_x, end_x - start_x) + FXSYS_Mul(y - start_y, end_y - start_y) +
+ FXSYS_Mul(start_r, end_r - start_r));
+ FX_FLOAT c = FXSYS_Mul(x - start_x, x - start_x) + FXSYS_Mul(y - start_y, y - start_y) -
+ FXSYS_Mul(start_r, start_r);
+ FX_FLOAT s;
+ if (a == 0) {
+ s = FXSYS_Div(-c, b);
+ } else {
+ FX_FLOAT b2_4ac = FXSYS_Mul(b, b) - 4 * FXSYS_Mul(a, c);
+ if (b2_4ac < 0) {
+ continue;
+ }
+ FX_FLOAT root = FXSYS_sqrt(b2_4ac);
+ FX_FLOAT s1, s2;
+ if (a > 0) {
+ s1 = FXSYS_Div(-b - root, 2 * a);
+ s2 = FXSYS_Div(-b + root, 2 * a);
+ } else {
+ s2 = FXSYS_Div(-b - root, 2 * a);
+ s1 = FXSYS_Div(-b + root, 2 * a);
+ }
+ if (bDecreasing) {
+ if (s1 >= 0 || bStartExtend) {
+ s = s1;
+ } else {
+ s = s2;
+ }
+ } else {
+ if (s2 <= 1.0f || bEndExtend) {
+ s = s2;
+ } else {
+ s = s1;
+ }
+ }
+ if ((start_r + s * (end_r - start_r)) < 0) {
+ continue;
+ }
+ }
+ int index = (FX_INT32)(s * (SHADING_STEPS - 1));
+ if (index < 0) {
+ if (!bStartExtend) {
+ continue;
+ }
+ index = 0;
+ }
+ if (index >= SHADING_STEPS) {
+ if (!bEndExtend) {
+ continue;
+ }
+ index = SHADING_STEPS - 1;
+ }
+ dib_buf[column] = rgb_array[index];
+ }
+ }
+}
+static void _DrawFuncShading(CFX_DIBitmap* pBitmap, CFX_AffineMatrix* pObject2Bitmap,
+ CPDF_Dictionary* pDict, CPDF_Function** pFuncs, int nFuncs,
+ CPDF_ColorSpace* pCS, int alpha)
+{
+ ASSERT(pBitmap->GetFormat() == FXDIB_Argb);
+ CPDF_Array* pDomain = pDict->GetArray(FX_BSTRC("Domain"));
+ FX_FLOAT xmin = 0, ymin = 0, xmax = 1.0f, ymax = 1.0f;
+ if (pDomain) {
+ xmin = pDomain->GetNumber(0);
+ xmax = pDomain->GetNumber(1);
+ ymin = pDomain->GetNumber(2);
+ ymax = pDomain->GetNumber(3);
+ }
+ CFX_AffineMatrix mtDomain2Target = pDict->GetMatrix(FX_BSTRC("Matrix"));
+ CFX_AffineMatrix matrix, reverse_matrix;
+ matrix.SetReverse(*pObject2Bitmap);
+ reverse_matrix.SetReverse(mtDomain2Target);
+ matrix.Concat(reverse_matrix);
+ int width = pBitmap->GetWidth();
+ int height = pBitmap->GetHeight();
+ int pitch = pBitmap->GetPitch();
+ int Bpp = pBitmap->GetBPP() / 8;
+ int total_results = 0;
+ for (int j = 0; j < nFuncs; j ++) {
+ if (pFuncs[j]) {
+ total_results += pFuncs[j]->CountOutputs();
+ }
+ }
+ if (pCS->CountComponents() > total_results) {
+ total_results = pCS->CountComponents();
+ }
+ CFX_FixedBufGrow<FX_FLOAT, 16> result_array(total_results);
+ FX_FLOAT* pResults = result_array;
+ FXSYS_memset32(pResults, 0, total_results * sizeof(FX_FLOAT));
+ for (int row = 0; row < height; row ++) {
+ FX_DWORD* dib_buf = (FX_DWORD*)(pBitmap->GetBuffer() + row * pitch);
+ for (int column = 0; column < width; column ++) {
+ FX_FLOAT x = (FX_FLOAT)column, y = (FX_FLOAT)row;
+ matrix.Transform(x, y);
+ if (x < xmin || x > xmax || y < ymin || y > ymax) {
+ continue;
+ }
+ FX_FLOAT input[2];
+ int offset = 0;
+ input[0] = x;
+ input[1] = y;
+ for (int j = 0; j < nFuncs; j ++) {
+ if (pFuncs[j]) {
+ int nresults;
+ if (pFuncs[j]->Call(input, 2, pResults + offset, nresults)) {
+ offset += nresults;
+ }
+ }
+ }
+ FX_FLOAT R, G, B;
+ pCS->GetRGB(pResults, R, G, B);
+ dib_buf[column] = FXARGB_TODIB(FXARGB_MAKE(alpha, (FX_INT32)(R * 255), (FX_INT32)(G * 255), (FX_INT32)(B * 255)));
+ }
+ }
+}
+FX_BOOL _GetScanlineIntersect(int y, FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2, FX_FLOAT& x)
+{
+ if (y1 == y2) {
+ return FALSE;
+ }
+ if (y1 < y2) {
+ if (y < y1 || y > y2) {
+ return FALSE;
+ }
+ } else {
+ if (y < y2 || y > y1) {
+ return FALSE;
+ }
+ }
+ x = x1 + FXSYS_MulDiv(x2 - x1, y - y1, y2 - y1);
+ return TRUE;
+}
+static void _DrawGouraud(CFX_DIBitmap* pBitmap, int alpha, CPDF_MeshVertex triangle[3])
+{
+ FX_FLOAT min_y = triangle[0].y, max_y = triangle[0].y;
+ for (int i = 1; i < 3; i ++) {
+ if (min_y > triangle[i].y) {
+ min_y = triangle[i].y;
+ }
+ if (max_y < triangle[i].y) {
+ max_y = triangle[i].y;
+ }
+ }
+ if (min_y == max_y) {
+ return;
+ }
+ int min_yi = (int)FXSYS_floor(min_y), max_yi = (int)FXSYS_ceil(max_y);
+ if (min_yi < 0) {
+ min_yi = 0;
+ }
+ if (max_yi >= pBitmap->GetHeight()) {
+ max_yi = pBitmap->GetHeight() - 1;
+ }
+ for (int y = min_yi; y <= max_yi; y ++) {
+ int nIntersects = 0;
+ FX_FLOAT inter_x[3], r[3], g[3], b[3];
+ for (int i = 0; i < 3; i ++) {
+ CPDF_MeshVertex& vertex1 = triangle[i];
+ CPDF_MeshVertex& vertex2 = triangle[(i + 1) % 3];
+ FX_BOOL bIntersect = _GetScanlineIntersect(y, vertex1.x, vertex1.y,
+ vertex2.x, vertex2.y, inter_x[nIntersects]);
+ if (!bIntersect) {
+ continue;
+ }
+ r[nIntersects] = vertex1.r + FXSYS_MulDiv(vertex2.r - vertex1.r, y - vertex1.y, vertex2.y - vertex1.y);
+ g[nIntersects] = vertex1.g + FXSYS_MulDiv(vertex2.g - vertex1.g, y - vertex1.y, vertex2.y - vertex1.y);
+ b[nIntersects] = vertex1.b + FXSYS_MulDiv(vertex2.b - vertex1.b, y - vertex1.y, vertex2.y - vertex1.y);
+ nIntersects ++;
+ }
+ if (nIntersects != 2) {
+ continue;
+ }
+ int min_x, max_x, start_index, end_index;
+ if (inter_x[0] < inter_x[1]) {
+ min_x = (int)FXSYS_floor(inter_x[0]);
+ max_x = (int)FXSYS_ceil(inter_x[1]);
+ start_index = 0;
+ end_index = 1;
+ } else {
+ min_x = (int)FXSYS_floor(inter_x[1]);
+ max_x = (int)FXSYS_ceil(inter_x[0]);
+ start_index = 1;
+ end_index = 0;
+ }
+ int start_x = min_x, end_x = max_x;
+ if (start_x < 0) {
+ start_x = 0;
+ }
+ if (end_x > pBitmap->GetWidth()) {
+ end_x = pBitmap->GetWidth();
+ }
+ FX_LPBYTE dib_buf = pBitmap->GetBuffer() + y * pBitmap->GetPitch() + start_x * 4;
+ FX_FLOAT r_unit = (r[end_index] - r[start_index]) / (max_x - min_x);
+ FX_FLOAT g_unit = (g[end_index] - g[start_index]) / (max_x - min_x);
+ FX_FLOAT b_unit = (b[end_index] - b[start_index]) / (max_x - min_x);
+ FX_FLOAT R = r[start_index] + (start_x - min_x) * r_unit;
+ FX_FLOAT G = g[start_index] + (start_x - min_x) * g_unit;
+ FX_FLOAT B = b[start_index] + (start_x - min_x) * b_unit;
+ for (int x = start_x; x < end_x; x ++) {
+ R += r_unit;
+ G += g_unit;
+ B += b_unit;
+ FXARGB_SETDIB(dib_buf, FXARGB_MAKE(alpha, (FX_INT32)(R * 255), (FX_INT32)(G * 255), (FX_INT32)(B * 255)));
+ dib_buf += 4;
+ }
+ }
+}
+static void _DrawFreeGouraudShading(CFX_DIBitmap* pBitmap, CFX_AffineMatrix* pObject2Bitmap,
+ CPDF_Stream* pShadingStream, CPDF_Function** pFuncs, int nFuncs,
+ CPDF_ColorSpace* pCS, int alpha)
+{
+ ASSERT(pBitmap->GetFormat() == FXDIB_Argb);
+ if (pShadingStream->GetType() != PDFOBJ_STREAM) {
+ return;
+ }
+ CPDF_MeshStream stream;
+ if (!stream.Load(pShadingStream, pFuncs, nFuncs, pCS)) {
+ return;
+ }
+ CPDF_MeshVertex triangle[3];
+ while (!stream.m_BitStream.IsEOF()) {
+ CPDF_MeshVertex vertex;
+ FX_DWORD flag = stream.GetVertex(vertex, pObject2Bitmap);
+ if (flag == 0) {
+ triangle[0] = vertex;
+ for (int j = 1; j < 3; j ++) {
+ stream.GetVertex(triangle[j], pObject2Bitmap);
+ }
+ } else {
+ if (flag == 1) {
+ triangle[0] = triangle[1];
+ }
+ triangle[1] = triangle[2];
+ triangle[2] = vertex;
+ }
+ _DrawGouraud(pBitmap, alpha, triangle);
+ }
+}
+static void _DrawLatticeGouraudShading(CFX_DIBitmap* pBitmap, CFX_AffineMatrix* pObject2Bitmap,
+ CPDF_Stream* pShadingStream, CPDF_Function** pFuncs, int nFuncs,
+ CPDF_ColorSpace* pCS, int alpha)
+{
+ ASSERT(pBitmap->GetFormat() == FXDIB_Argb);
+ if (pShadingStream->GetType() != PDFOBJ_STREAM) {
+ return;
+ }
+ int row_verts = pShadingStream->GetDict()->GetInteger("VerticesPerRow");
+ if (row_verts < 2) {
+ return;
+ }
+ CPDF_MeshStream stream;
+ if (!stream.Load(pShadingStream, pFuncs, nFuncs, pCS)) {
+ return;
+ }
+ CPDF_MeshVertex* vertex = FX_Alloc(CPDF_MeshVertex, row_verts * 2);
+ if (!stream.GetVertexRow(vertex, row_verts, pObject2Bitmap)) {
+ FX_Free(vertex);
+ return;
+ }
+ int last_index = 0;
+ while (1) {
+ CPDF_MeshVertex* last_row = vertex + last_index * row_verts;
+ CPDF_MeshVertex* this_row = vertex + (1 - last_index) * row_verts;
+ if (!stream.GetVertexRow(this_row, row_verts, pObject2Bitmap)) {
+ FX_Free(vertex);
+ return;
+ }
+ CPDF_MeshVertex triangle[3];
+ for (int i = 1; i < row_verts; i ++) {
+ triangle[0] = last_row[i];
+ triangle[1] = this_row[i - 1];
+ triangle[2] = last_row[i - 1];
+ _DrawGouraud(pBitmap, alpha, triangle);
+ triangle[2] = this_row[i];
+ _DrawGouraud(pBitmap, alpha, triangle);
+ }
+ last_index = 1 - last_index;
+ }
+ FX_Free(vertex);
+}
+struct Coon_BezierCoeff {
+ float a, b, c, d;
+ void FromPoints(float p0, float p1, float p2, float p3)
+ {
+ a = -p0 + 3 * p1 - 3 * p2 + p3;
+ b = 3 * p0 - 6 * p1 + 3 * p2;
+ c = -3 * p0 + 3 * p1;
+ d = p0;
+ }
+ Coon_BezierCoeff first_half()
+ {
+ Coon_BezierCoeff result;
+ result.a = a / 8;
+ result.b = b / 4;
+ result.c = c / 2;
+ result.d = d;
+ return result;
+ }
+ Coon_BezierCoeff second_half()
+ {
+ Coon_BezierCoeff result;
+ result.a = a / 8;
+ result.b = 3 * a / 8 + b / 4;
+ result.c = 3 * a / 8 + b / 2 + c / 2;
+ result.d = a / 8 + b / 4 + c / 2 + d;
+ return result;
+ }
+ void GetPoints(float p[4])
+ {
+ p[0] = d;
+ p[1] = c / 3 + p[0];
+ p[2] = b / 3 - p[0] + 2 * p[1];
+ p[3] = a + p[0] - 3 * p[1] + 3 * p[2];
+ }
+ void GetPointsReverse(float p[4])
+ {
+ p[3] = d;
+ p[2] = c / 3 + p[3];
+ p[1] = b / 3 - p[3] + 2 * p[2];
+ p[0] = a + p[3] - 3 * p[2] + 3 * p[1];
+ }
+ void BezierInterpol(Coon_BezierCoeff& C1, Coon_BezierCoeff& C2, Coon_BezierCoeff& D1, Coon_BezierCoeff& D2)
+ {
+ a = (D1.a + D2.a) / 2;
+ b = (D1.b + D2.b) / 2;
+ c = (D1.c + D2.c) / 2 - (C1.a / 8 + C1.b / 4 + C1.c / 2) + (C2.a / 8 + C2.b / 4) + (-C1.d + D2.d) / 2 - (C2.a + C2.b) / 2;
+ d = C1.a / 8 + C1.b / 4 + C1.c / 2 + C1.d;
+ }
+ float Distance()
+ {
+ float dis = a + b + c;
+ return dis < 0 ? -dis : dis;
+ }
+};
+struct Coon_Bezier {
+ Coon_BezierCoeff x, y;
+ void FromPoints(float x0, float y0, float x1, float y1, float x2, float y2, float x3, float y3)
+ {
+ x.FromPoints(x0, x1, x2, x3);
+ y.FromPoints(y0, y1, y2, y3);
+ }
+ Coon_Bezier first_half()
+ {
+ Coon_Bezier result;
+ result.x = x.first_half();
+ result.y = y.first_half();
+ return result;
+ }
+ Coon_Bezier second_half()
+ {
+ Coon_Bezier result;
+ result.x = x.second_half();
+ result.y = y.second_half();
+ return result;
+ }
+ void BezierInterpol(Coon_Bezier& C1, Coon_Bezier& C2, Coon_Bezier& D1, Coon_Bezier& D2)
+ {
+ x.BezierInterpol(C1.x, C2.x, D1.x, D2.x);
+ y.BezierInterpol(C1.y, C2.y, D1.y, D2.y);
+ }
+ void GetPoints(FX_PATHPOINT* pPoints)
+ {
+ float p[4];
+ int i;
+ x.GetPoints(p);
+ for (i = 0; i < 4; i ++) {
+ pPoints[i].m_PointX = p[i];
+ }
+ y.GetPoints(p);
+ for (i = 0; i < 4; i ++) {
+ pPoints[i].m_PointY = p[i];
+ }
+ }
+ void GetPointsReverse(FX_PATHPOINT* pPoints)
+ {
+ float p[4];
+ int i;
+ x.GetPointsReverse(p);
+ for (i = 0; i < 4; i ++) {
+ pPoints[i].m_PointX = p[i];
+ }
+ y.GetPointsReverse(p);
+ for (i = 0; i < 4; i ++) {
+ pPoints[i].m_PointY = p[i];
+ }
+ }
+ float Distance()
+ {
+ return x.Distance() + y.Distance();
+ }
+};
+static int _BiInterpol(int c0, int c1, int c2, int c3, int x, int y, int x_scale, int y_scale)
+{
+ int x1 = c0 + (c3 - c0) * x / x_scale;
+ int x2 = c1 + (c2 - c1) * x / x_scale;
+ return x1 + (x2 - x1) * y / y_scale;
+}
+struct Coon_Color {
+ Coon_Color()
+ {
+ FXSYS_memset32(comp, 0, sizeof(int) * 3);
+ }
+ int comp[3];
+ void BiInterpol(Coon_Color colors[4], int x, int y, int x_scale, int y_scale)
+ {
+ for (int i = 0; i < 3; i ++)
+ comp[i] = _BiInterpol(colors[0].comp[i], colors[1].comp[i], colors[2].comp[i], colors[3].comp[i],
+ x, y, x_scale, y_scale);
+ }
+ int Distance(Coon_Color& o)
+ {
+ int max, diff;
+ max = FXSYS_abs(comp[0] - o.comp[0]);
+ diff = FXSYS_abs(comp[1] - o.comp[1]);
+ if (max < diff) {
+ max = diff;
+ }
+ diff = FXSYS_abs(comp[2] - o.comp[2]);
+ if (max < diff) {
+ max = diff;
+ }
+ return max;
+ }
+};
+struct CPDF_PatchDrawer {
+ Coon_Color patch_colors[4];
+ int max_delta;
+ CFX_PathData path;
+ CFX_RenderDevice* pDevice;
+ int fill_mode;
+ int alpha;
+ void Draw(int x_scale, int y_scale, int left, int bottom, Coon_Bezier C1, Coon_Bezier C2, Coon_Bezier D1, Coon_Bezier D2)
+ {
+ FX_BOOL bSmall = C1.Distance() < 2 && C2.Distance() < 2 && D1.Distance() < 2 && D2.Distance() < 2;
+ Coon_Color div_colors[4];
+ int d_bottom, d_left, d_top, d_right;
+ div_colors[0].BiInterpol(patch_colors, left, bottom, x_scale, y_scale);
+ if (!bSmall) {
+ div_colors[1].BiInterpol(patch_colors, left, bottom + 1, x_scale, y_scale);
+ div_colors[2].BiInterpol(patch_colors, left + 1, bottom + 1, x_scale, y_scale);
+ div_colors[3].BiInterpol(patch_colors, left + 1, bottom, x_scale, y_scale);
+ d_bottom = div_colors[3].Distance(div_colors[0]);
+ d_left = div_colors[1].Distance(div_colors[0]);
+ d_top = div_colors[1].Distance(div_colors[2]);
+ d_right = div_colors[2].Distance(div_colors[3]);
+ }
+#define COONCOLOR_THRESHOLD 4
+ if (bSmall || (d_bottom < COONCOLOR_THRESHOLD && d_left < COONCOLOR_THRESHOLD &&
+ d_top < COONCOLOR_THRESHOLD && d_right < COONCOLOR_THRESHOLD)) {
+ FX_PATHPOINT* pPoints = path.GetPoints();
+ C1.GetPoints(pPoints);
+ D2.GetPoints(pPoints + 3);
+ C2.GetPointsReverse(pPoints + 6);
+ D1.GetPointsReverse(pPoints + 9);
+ int fillFlags = FXFILL_WINDING | FXFILL_FULLCOVER;
+ if (fill_mode & RENDER_NOPATHSMOOTH) {
+ fillFlags |= FXFILL_NOPATHSMOOTH;
+ }
+ pDevice->DrawPath(&path, NULL, NULL, FXARGB_MAKE(alpha, div_colors[0].comp[0], div_colors[0].comp[1], div_colors[0].comp[2]), 0, fillFlags);
+ } else {
+ if (d_bottom < COONCOLOR_THRESHOLD && d_top < COONCOLOR_THRESHOLD) {
+ Coon_Bezier m1;
+ m1.BezierInterpol(D1, D2, C1, C2);
+ y_scale *= 2;
+ bottom *= 2;
+ Draw(x_scale, y_scale, left, bottom, C1, m1, D1.first_half(), D2.first_half());
+ Draw(x_scale, y_scale, left, bottom + 1, m1, C2, D1.second_half(), D2.second_half());
+ } else if (d_left < COONCOLOR_THRESHOLD && d_right < COONCOLOR_THRESHOLD) {
+ Coon_Bezier m2;
+ m2.BezierInterpol(C1, C2, D1, D2);
+ x_scale *= 2;
+ left *= 2;
+ Draw(x_scale, y_scale, left, bottom, C1.first_half(), C2.first_half(), D1, m2);
+ Draw(x_scale, y_scale, left + 1, bottom, C1.second_half(), C2.second_half(), m2, D2);
+ } else {
+ Coon_Bezier m1, m2;
+ m1.BezierInterpol(D1, D2, C1, C2);
+ m2.BezierInterpol(C1, C2, D1, D2);
+ Coon_Bezier m1f = m1.first_half();
+ Coon_Bezier m1s = m1.second_half();
+ Coon_Bezier m2f = m2.first_half();
+ Coon_Bezier m2s = m2.second_half();
+ x_scale *= 2;
+ y_scale *= 2;
+ left *= 2;
+ bottom *= 2;
+ Draw(x_scale, y_scale, left, bottom, C1.first_half(), m1f, D1.first_half(), m2f);
+ Draw(x_scale, y_scale, left, bottom + 1, m1f, C2.first_half(), D1.second_half(), m2s);
+ Draw(x_scale, y_scale, left + 1, bottom, C1.second_half(), m1s, m2f, D2.first_half());
+ Draw(x_scale, y_scale, left + 1, bottom + 1, m1s, C2.second_half(), m2s, D2.second_half());
+ }
+ }
+ }
+};
+static void _DrawCoonPatchMeshes(FX_BOOL bTensor, CFX_DIBitmap* pBitmap, CFX_AffineMatrix* pObject2Bitmap,
+ CPDF_Stream* pShadingStream, CPDF_Function** pFuncs, int nFuncs,
+ CPDF_ColorSpace* pCS, int fill_mode, int alpha)
+{
+ ASSERT(pBitmap->GetFormat() == FXDIB_Argb);
+ if (pShadingStream->GetType() != PDFOBJ_STREAM) {
+ return;
+ }
+ CFX_FxgeDevice device;
+ device.Attach(pBitmap);
+ CPDF_MeshStream stream;
+ if (!stream.Load(pShadingStream, pFuncs, nFuncs, pCS)) {
+ return;
+ }
+ CPDF_PatchDrawer patch;
+ patch.alpha = alpha;
+ patch.pDevice = &device;
+ patch.fill_mode = fill_mode;
+ patch.path.SetPointCount(13);
+ FX_PATHPOINT* pPoints = patch.path.GetPoints();
+ pPoints[0].m_Flag = FXPT_MOVETO;
+ for (int i = 1; i < 13; i ++) {
+ pPoints[i].m_Flag = FXPT_BEZIERTO;
+ }
+ CFX_FloatPoint coords[16];
+ int point_count = bTensor ? 16 : 12;
+ while (!stream.m_BitStream.IsEOF()) {
+ FX_DWORD flag = stream.GetFlag();
+ int iStartPoint = 0, iStartColor = 0, i;
+ if (flag) {
+ iStartPoint = 4;
+ iStartColor = 2;
+ CFX_FloatPoint tempCoords[4];
+ for (int i = 0; i < 4; i ++) {
+ tempCoords[i] = coords[(flag * 3 + i) % 12];
+ }
+ FXSYS_memcpy32(coords, tempCoords, sizeof(CFX_FloatPoint) * 4);
+ Coon_Color tempColors[2];
+ tempColors[0] = patch.patch_colors[flag];
+ tempColors[1] = patch.patch_colors[(flag + 1) % 4];
+ FXSYS_memcpy32(patch.patch_colors, tempColors, sizeof(Coon_Color) * 2);
+ }
+ for (i = iStartPoint; i < point_count; i ++) {
+ stream.GetCoords(coords[i].x, coords[i].y);
+ pObject2Bitmap->Transform(coords[i].x, coords[i].y);
+ }
+ for (i = iStartColor; i < 4; i ++) {
+ FX_FLOAT r, g, b;
+ stream.GetColor(r, g, b);
+ patch.patch_colors[i].comp[0] = (FX_INT32)(r * 255);
+ patch.patch_colors[i].comp[1] = (FX_INT32)(g * 255);
+ patch.patch_colors[i].comp[2] = (FX_INT32)(b * 255);
+ }
+ CFX_FloatRect bbox = CFX_FloatRect::GetBBox(coords, point_count);
+ if (bbox.right <= 0 || bbox.left >= (FX_FLOAT)pBitmap->GetWidth() || bbox.top <= 0 ||
+ bbox.bottom >= (FX_FLOAT)pBitmap->GetHeight()) {
+ continue;
+ }
+ Coon_Bezier C1, C2, D1, D2;
+ C1.FromPoints(coords[0].x, coords[0].y, coords[11].x, coords[11].y, coords[10].x, coords[10].y,
+ coords[9].x, coords[9].y);
+ C2.FromPoints(coords[3].x, coords[3].y, coords[4].x, coords[4].y, coords[5].x, coords[5].y,
+ coords[6].x, coords[6].y);
+ D1.FromPoints(coords[0].x, coords[0].y, coords[1].x, coords[1].y, coords[2].x, coords[2].y,
+ coords[3].x, coords[3].y);
+ D2.FromPoints(coords[9].x, coords[9].y, coords[8].x, coords[8].y, coords[7].x, coords[7].y,
+ coords[6].x, coords[6].y);
+ patch.Draw(1, 1, 0, 0, C1, C2, D1, D2);
+ }
+}
+void CPDF_RenderStatus::DrawShading(CPDF_ShadingPattern* pPattern, CFX_AffineMatrix* pMatrix,
+ FX_RECT& clip_rect, int alpha, FX_BOOL bAlphaMode)
+{
+ int width = clip_rect.Width();
+ int height = clip_rect.Height();
+ CPDF_Function** pFuncs = pPattern->m_pFunctions;
+ int nFuncs = pPattern->m_nFuncs;
+ CPDF_Dictionary* pDict = pPattern->m_pShadingObj->GetDict();
+ CPDF_ColorSpace* pColorSpace = pPattern->m_pCS;
+ if (pColorSpace == NULL) {
+ return;
+ }
+ FX_ARGB background = 0;
+ if (!pPattern->m_bShadingObj && pPattern->m_pShadingObj->GetDict()->KeyExist(FX_BSTRC("Background"))) {
+ CPDF_Array* pBackColor = pPattern->m_pShadingObj->GetDict()->GetArray(FX_BSTRC("Background"));
+ if (pBackColor && pBackColor->GetCount() >= (FX_DWORD)pColorSpace->CountComponents()) {
+ CFX_FixedBufGrow<FX_FLOAT, 16> comps(pColorSpace->CountComponents());
+ for (int i = 0; i < pColorSpace->CountComponents(); i ++) {
+ comps[i] = pBackColor->GetNumber(i);
+ }
+ FX_FLOAT R, G, B;
+ pColorSpace->GetRGB(comps, R, G, B);
+ background = ArgbEncode(255, (FX_INT32)(R * 255), (FX_INT32)(G * 255), (FX_INT32)(B * 255));
+ }
+ }
+ if (pDict->KeyExist(FX_BSTRC("BBox"))) {
+ CFX_FloatRect rect = pDict->GetRect(FX_BSTRC("BBox"));
+ rect.Transform(pMatrix);
+ clip_rect.Intersect(rect.GetOutterRect());
+ }
+ CPDF_DeviceBuffer buffer;
+ buffer.Initialize(m_pContext, m_pDevice, &clip_rect, m_pCurObj, 150);
+ CFX_AffineMatrix FinalMatrix = *pMatrix;
+ FinalMatrix.Concat(*buffer.GetMatrix());
+ CFX_DIBitmap* pBitmap = buffer.GetBitmap();
+ if (pBitmap->GetBuffer() == NULL) {
+ return;
+ }
+ pBitmap->Clear(background);
+ int fill_mode = m_Options.m_Flags;
+ switch (pPattern->m_ShadingType) {
+ case 1:
+ _DrawFuncShading(pBitmap, &FinalMatrix, pDict, pFuncs, nFuncs, pColorSpace, alpha);
+ break;
+ case 2:
+ _DrawAxialShading(pBitmap, &FinalMatrix, pDict, pFuncs, nFuncs, pColorSpace, alpha);
+ break;
+ case 3:
+ _DrawRadialShading(pBitmap, &FinalMatrix, pDict, pFuncs, nFuncs, pColorSpace, alpha);
+ break;
+ case 4: {
+ _DrawFreeGouraudShading(pBitmap, &FinalMatrix, (CPDF_Stream*)pPattern->m_pShadingObj,
+ pFuncs, nFuncs, pColorSpace, alpha);
+ }
+ break;
+ case 5: {
+ _DrawLatticeGouraudShading(pBitmap, &FinalMatrix, (CPDF_Stream*)pPattern->m_pShadingObj,
+ pFuncs, nFuncs, pColorSpace, alpha);
+ }
+ break;
+ case 6:
+ case 7: {
+ _DrawCoonPatchMeshes(pPattern->m_ShadingType - 6, pBitmap, &FinalMatrix, (CPDF_Stream*)pPattern->m_pShadingObj,
+ pFuncs, nFuncs, pColorSpace, fill_mode, alpha);
+ }
+ break;
+ }
+ if (bAlphaMode) {
+ pBitmap->LoadChannel(FXDIB_Red, pBitmap, FXDIB_Alpha);
+ }
+ if (m_Options.m_ColorMode == RENDER_COLOR_GRAY) {
+ pBitmap->ConvertColorScale(m_Options.m_ForeColor, m_Options.m_BackColor);
+ }
+ buffer.OutputToDevice();
+}
+void CPDF_RenderStatus::DrawShadingPattern(CPDF_ShadingPattern* pattern, CPDF_PageObject* pPageObj, const CFX_AffineMatrix* pObj2Device, FX_BOOL bStroke)
+{
+ if (!pattern->Load()) {
+ return;
+ }
+ m_pDevice->SaveState();
+ if (pPageObj->m_Type == PDFPAGE_PATH) {
+ if (!SelectClipPath((CPDF_PathObject*)pPageObj, pObj2Device, bStroke)) {
+ m_pDevice->RestoreState();
+ return;
+ }
+ } else if (pPageObj->m_Type == PDFPAGE_IMAGE) {
+ FX_RECT rect = pPageObj->GetBBox(pObj2Device);
+ m_pDevice->SetClip_Rect(&rect);
+ } else {
+ return;
+ }
+ FX_RECT rect;
+ if (GetObjectClippedRect(pPageObj, pObj2Device, FALSE, rect)) {
+ m_pDevice->RestoreState();
+ return;
+ }
+ CFX_AffineMatrix matrix = pattern->m_Pattern2Form;
+ matrix.Concat(*pObj2Device);
+ GetScaledMatrix(matrix);
+ int alpha = pPageObj->m_GeneralState.GetAlpha(bStroke);
+ DrawShading(pattern, &matrix, rect, alpha, m_Options.m_ColorMode == RENDER_COLOR_ALPHA);
+ m_pDevice->RestoreState();
+}
+FX_BOOL CPDF_RenderStatus::ProcessShading(CPDF_ShadingObject* pShadingObj, const CFX_AffineMatrix* pObj2Device)
+{
+ FX_RECT rect = pShadingObj->GetBBox(pObj2Device);
+ FX_RECT clip_box = m_pDevice->GetClipBox();
+ rect.Intersect(clip_box);
+ if (rect.IsEmpty()) {
+ return TRUE;
+ }
+ CFX_AffineMatrix matrix = pShadingObj->m_Matrix;
+ matrix.Concat(*pObj2Device);
+ DrawShading(pShadingObj->m_pShading, &matrix, rect, pShadingObj->m_GeneralState.GetAlpha(FALSE),
+ m_Options.m_ColorMode == RENDER_COLOR_ALPHA);
+#ifdef _FPDFAPI_MINI_
+ if (m_DitherBits) {
+ DitherObjectArea(pShadingObj, pObj2Device);
+ }
+#endif
+ return TRUE;
+}
+static CFX_DIBitmap* DrawPatternBitmap(CPDF_Document* pDoc, CPDF_PageRenderCache* pCache,
+ CPDF_TilingPattern* pPattern, const CFX_AffineMatrix* pObject2Device,
+ int width, int height, int flags)
+{
+ CFX_DIBitmap* pBitmap = FX_NEW CFX_DIBitmap;
+ if (!pBitmap->Create(width, height, pPattern->m_bColored ? FXDIB_Argb : FXDIB_8bppMask)) {
+ delete pBitmap;
+ return NULL;
+ }
+ CFX_FxgeDevice bitmap_device;
+ bitmap_device.Attach(pBitmap);
+ pBitmap->Clear(0);
+ CFX_FloatRect cell_bbox = pPattern->m_BBox;
+ pPattern->m_Pattern2Form.TransformRect(cell_bbox);
+ pObject2Device->TransformRect(cell_bbox);
+ CFX_FloatRect bitmap_rect(0.0f, 0.0f, (FX_FLOAT)width, (FX_FLOAT)height);
+ CFX_AffineMatrix mtAdjust;
+ mtAdjust.MatchRect(bitmap_rect, cell_bbox);
+ CFX_AffineMatrix mtPattern2Bitmap = *pObject2Device;
+ mtPattern2Bitmap.Concat(mtAdjust);
+ CPDF_RenderOptions options;
+ if (!pPattern->m_bColored) {
+ options.m_ColorMode = RENDER_COLOR_ALPHA;
+ }
+ flags |= RENDER_FORCE_HALFTONE;
+ options.m_Flags = flags;
+ CPDF_RenderContext context;
+ context.Create(pDoc, pCache, NULL);
+ context.DrawObjectList(&bitmap_device, pPattern->m_pForm, &mtPattern2Bitmap, &options);
+ return pBitmap;
+}
+void CPDF_RenderStatus::DrawTilingPattern(CPDF_TilingPattern* pPattern, CPDF_PageObject* pPageObj, const CFX_AffineMatrix* pObj2Device, FX_BOOL bStroke)
+{
+ if (!pPattern->Load()) {
+ return;
+ }
+ m_pDevice->SaveState();
+ if (pPageObj->m_Type == PDFPAGE_PATH) {
+ if (!SelectClipPath((CPDF_PathObject*)pPageObj, pObj2Device, bStroke)) {
+ m_pDevice->RestoreState();
+ return;
+ }
+ } else if (pPageObj->m_Type == PDFPAGE_IMAGE) {
+ FX_RECT rect = pPageObj->GetBBox(pObj2Device);
+ m_pDevice->SetClip_Rect(&rect);
+ } else {
+ return;
+ }
+ FX_RECT clip_box = m_pDevice->GetClipBox();
+ if (clip_box.IsEmpty()) {
+ m_pDevice->RestoreState();
+ return;
+ }
+ CFX_Matrix dCTM = m_pDevice->GetCTM();
+ FX_FLOAT sa = FXSYS_fabs(dCTM.a);
+ FX_FLOAT sd = FXSYS_fabs(dCTM.d);
+ clip_box.right = clip_box.left + (FX_INT32)FXSYS_ceil(clip_box.Width() * sa);
+ clip_box.bottom = clip_box.top + (FX_INT32)FXSYS_ceil(clip_box.Height() * sd);
+ CFX_AffineMatrix mtPattern2Device = pPattern->m_Pattern2Form;
+ mtPattern2Device.Concat(*pObj2Device);
+ GetScaledMatrix(mtPattern2Device);
+ FX_BOOL bAligned = FALSE;
+ if (pPattern->m_BBox.left == 0 && pPattern->m_BBox.bottom == 0 &&
+ pPattern->m_BBox.right == pPattern->m_XStep && pPattern->m_BBox.top == pPattern->m_YStep &&
+ (mtPattern2Device.IsScaled() || mtPattern2Device.Is90Rotated())) {
+ bAligned = TRUE;
+ }
+ CFX_FloatRect cell_bbox = pPattern->m_BBox;
+ mtPattern2Device.TransformRect(cell_bbox);
+ int width = (int)FXSYS_ceil(cell_bbox.Width());
+ int height = (int)FXSYS_ceil(cell_bbox.Height());
+ if (width == 0) {
+ width = 1;
+ }
+ if (height == 0) {
+ height = 1;
+ }
+ int min_col, max_col, min_row, max_row;
+ CFX_AffineMatrix mtDevice2Pattern;
+ mtDevice2Pattern.SetReverse(mtPattern2Device);
+ CFX_FloatRect clip_box_p(clip_box);
+ clip_box_p.Transform(&mtDevice2Pattern);
+ min_col = (int)FXSYS_ceil(FXSYS_Div(clip_box_p.left - pPattern->m_BBox.right, pPattern->m_XStep));
+ max_col = (int)FXSYS_floor(FXSYS_Div(clip_box_p.right - pPattern->m_BBox.left, pPattern->m_XStep));
+ min_row = (int)FXSYS_ceil(FXSYS_Div(clip_box_p.bottom - pPattern->m_BBox.top, pPattern->m_YStep));
+ max_row = (int)FXSYS_floor(FXSYS_Div(clip_box_p.top - pPattern->m_BBox.bottom, pPattern->m_YStep));
+ if (width > clip_box.Width() || height > clip_box.Height() || width * height > clip_box.Width() * clip_box.Height()) {
+ CPDF_GraphicStates* pStates = NULL;
+ if (!pPattern->m_bColored) {
+ pStates = CloneObjStates(pPageObj, bStroke);
+ }
+ CPDF_Dictionary* pFormResource = NULL;
+ if (pPattern->m_pForm->m_pFormDict) {
+ pFormResource = pPattern->m_pForm->m_pFormDict->GetDict(FX_BSTRC("Resources"));
+ }
+ for (int col = min_col; col <= max_col; col ++)
+ for (int row = min_row; row <= max_row; row ++) {
+ FX_FLOAT orig_x, orig_y;
+ orig_x = col * pPattern->m_XStep;
+ orig_y = row * pPattern->m_YStep;
+ mtPattern2Device.Transform(orig_x, orig_y);
+ CFX_AffineMatrix matrix = *pObj2Device;
+ matrix.Translate(orig_x - mtPattern2Device.e, orig_y - mtPattern2Device.f);
+ m_pDevice->SaveState();
+ CPDF_RenderStatus status;
+ status.Initialize(m_Level + 1, m_pContext, m_pDevice, NULL, NULL, this, pStates, &m_Options,
+ pPattern->m_pForm->m_Transparency, m_bDropObjects, pFormResource);
+ status.RenderObjectList(pPattern->m_pForm, &matrix);
+ m_pDevice->RestoreState();
+ }
+ m_pDevice->RestoreState();
+ if (pStates) {
+ delete pStates;
+ }
+ return;
+ }
+ if (bAligned) {
+ int orig_x = FXSYS_round(mtPattern2Device.e);
+ int orig_y = FXSYS_round(mtPattern2Device.f);
+ min_col = (clip_box.left - orig_x) / width;
+ if (clip_box.left < orig_x) {
+ min_col --;
+ }
+ max_col = (clip_box.right - orig_x) / width;
+ if (clip_box.right <= orig_x) {
+ max_col --;
+ }
+ min_row = (clip_box.top - orig_y) / height;
+ if (clip_box.top < orig_y) {
+ min_row --;
+ }
+ max_row = (clip_box.bottom - orig_y) / height;
+ if (clip_box.bottom <= orig_y) {
+ max_row --;
+ }
+ }
+ FX_FLOAT left_offset = cell_bbox.left - mtPattern2Device.e;
+ FX_FLOAT top_offset = cell_bbox.bottom - mtPattern2Device.f;
+ CFX_DIBitmap* pPatternBitmap = NULL;
+ if (width * height < 16) {
+ CFX_DIBitmap* pEnlargedBitmap = DrawPatternBitmap(m_pContext->m_pDocument, m_pContext->m_pPageCache, pPattern, pObj2Device, 8, 8, m_Options.m_Flags);
+ pPatternBitmap = pEnlargedBitmap->StretchTo(width, height);
+ delete pEnlargedBitmap;
+ } else {
+ pPatternBitmap = DrawPatternBitmap(m_pContext->m_pDocument, m_pContext->m_pPageCache, pPattern, pObj2Device, width, height, m_Options.m_Flags);
+ }
+ if (pPatternBitmap == NULL) {
+ m_pDevice->RestoreState();
+ return;
+ }
+ if (m_Options.m_ColorMode == RENDER_COLOR_GRAY) {
+ pPatternBitmap->ConvertColorScale(m_Options.m_ForeColor, m_Options.m_BackColor);
+ }
+ FX_ARGB fill_argb = GetFillArgb(pPageObj);
+ int clip_width = clip_box.right - clip_box.left;
+ int clip_height = clip_box.bottom - clip_box.top;
+ CFX_DIBitmap screen;
+ if (!screen.Create(clip_width, clip_height, FXDIB_Argb)) {
+ return;
+ }
+ screen.Clear(0);
+ FX_DWORD* src_buf = (FX_DWORD*)pPatternBitmap->GetBuffer();
+ for (int col = min_col; col <= max_col; col ++) {
+ for (int row = min_row; row <= max_row; row ++) {
+ int start_x, start_y;
+ if (bAligned) {
+ start_x = FXSYS_round(mtPattern2Device.e) + col * width - clip_box.left;
+ start_y = FXSYS_round(mtPattern2Device.f) + row * height - clip_box.top;
+ } else {
+ FX_FLOAT orig_x = col * pPattern->m_XStep;
+ FX_FLOAT orig_y = row * pPattern->m_YStep;
+ mtPattern2Device.Transform(orig_x, orig_y);
+ start_x = FXSYS_round(orig_x + left_offset) - clip_box.left;
+ start_y = FXSYS_round(orig_y + top_offset) - clip_box.top;
+ }
+ if (width == 1 && height == 1) {
+ if (start_x < 0 || start_x >= clip_box.Width() || start_y < 0 || start_y >= clip_box.Height()) {
+ continue;
+ }
+ FX_DWORD* dest_buf = (FX_DWORD*)(screen.GetBuffer() + screen.GetPitch() * start_y + start_x * 4);
+ if (pPattern->m_bColored) {
+ *dest_buf = *src_buf;
+ } else {
+ *dest_buf = (*(FX_LPBYTE)src_buf << 24) | (fill_argb & 0xffffff);
+ }
+ } else {
+ if (pPattern->m_bColored) {
+ screen.CompositeBitmap(start_x, start_y, width, height, pPatternBitmap, 0, 0);
+ } else {
+ screen.CompositeMask(start_x, start_y, width, height, pPatternBitmap, fill_argb, 0, 0);
+ }
+ }
+ }
+ }
+ CompositeDIBitmap(&screen, clip_box.left, clip_box.top, 0, 255, FXDIB_BLEND_NORMAL, FALSE);
+ m_pDevice->RestoreState();
+ delete pPatternBitmap;
+}
+void CPDF_RenderStatus::DrawPathWithPattern(CPDF_PathObject* pPathObj, const CFX_AffineMatrix* pObj2Device, CPDF_Color* pColor, FX_BOOL bStroke)
+{
+ CPDF_Pattern* pattern = pColor->GetPattern();
+ if (pattern == NULL) {
+ return;
+ }
+ if(pattern->m_PatternType == PATTERN_TILING) {
+ DrawTilingPattern((CPDF_TilingPattern*)pattern, pPathObj, pObj2Device, bStroke);
+ } else {
+ DrawShadingPattern((CPDF_ShadingPattern*)pattern, pPathObj, pObj2Device, bStroke);
+ }
+}
+void CPDF_RenderStatus::ProcessPathPattern(CPDF_PathObject* pPathObj, const CFX_AffineMatrix* pObj2Device, int& filltype, FX_BOOL& bStroke)
+{
+ FX_BOOL bPattern = FALSE;
+ if(filltype) {
+ CPDF_Color& FillColor = *pPathObj->m_ColorState.GetFillColor();
+ if(FillColor.m_pCS && FillColor.m_pCS->GetFamily() == PDFCS_PATTERN) {
+ DrawPathWithPattern(pPathObj, pObj2Device, &FillColor, FALSE);
+ filltype = 0;
+ bPattern = TRUE;
+ }
+ }
+ if(bStroke) {
+ CPDF_Color& StrokeColor = *pPathObj->m_ColorState.GetStrokeColor();
+ if(StrokeColor.m_pCS && StrokeColor.m_pCS->GetFamily() == PDFCS_PATTERN) {
+ DrawPathWithPattern(pPathObj, pObj2Device, &StrokeColor, TRUE);
+ bStroke = FALSE;
+ bPattern = TRUE;
+ }
+ }
+#ifdef _FPDFAPI_MINI_
+ if (bPattern && m_DitherBits) {
+ DitherObjectArea(pPathObj, pObj2Device);
+ }
+#endif
+}
diff --git a/core/src/fpdfapi/fpdf_render/fpdf_render_text.cpp b/core/src/fpdfapi/fpdf_render/fpdf_render_text.cpp
index 91ff982935..a26d619565 100644
--- a/core/src/fpdfapi/fpdf_render/fpdf_render_text.cpp
+++ b/core/src/fpdfapi/fpdf_render/fpdf_render_text.cpp
@@ -1,760 +1,760 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../../include/fxge/fx_ge.h"
-#include "../../../include/fpdfapi/fpdf_render.h"
-#include "../../../include/fpdfapi/fpdf_pageobj.h"
-#include "../fpdf_page/pageint.h"
-#include "render_int.h"
-extern FX_BOOL IsAvailableMatrix(const CFX_AffineMatrix& matrix);
-CPDF_Type3Cache::~CPDF_Type3Cache()
-{
- FX_POSITION pos = m_SizeMap.GetStartPosition();
- CFX_ByteString Key;
- CPDF_Type3Glyphs* pSizeCache = NULL;
- while(pos) {
- pSizeCache = (CPDF_Type3Glyphs*)m_SizeMap.GetNextValue(pos);
- delete pSizeCache;
- }
- m_SizeMap.RemoveAll();
-}
-CFX_GlyphBitmap* CPDF_Type3Cache::LoadGlyph(FX_DWORD charcode, const CFX_AffineMatrix* pMatrix, FX_FLOAT retinaScaleX, FX_FLOAT retinaScaleY)
-{
- _CPDF_UniqueKeyGen keygen;
- keygen.Generate(4, FXSYS_round(pMatrix->a * 10000), FXSYS_round(pMatrix->b * 10000),
- FXSYS_round(pMatrix->c * 10000), FXSYS_round(pMatrix->d * 10000));
- CFX_ByteStringC FaceGlyphsKey(keygen.m_Key, keygen.m_KeyLen);
- CPDF_Type3Glyphs* pSizeCache = NULL;
- if(!m_SizeMap.Lookup(FaceGlyphsKey, (void*&)pSizeCache)) {
- pSizeCache = FX_NEW CPDF_Type3Glyphs;
- m_SizeMap.SetAt(FaceGlyphsKey, pSizeCache);
- }
- CFX_GlyphBitmap* pGlyphBitmap;
- if(pSizeCache->m_GlyphMap.Lookup((FX_LPVOID)(FX_UINTPTR)charcode, (void*&)pGlyphBitmap)) {
- return pGlyphBitmap;
- }
- pGlyphBitmap = RenderGlyph(pSizeCache, charcode, pMatrix, retinaScaleX, retinaScaleY);
- pSizeCache->m_GlyphMap.SetAt((FX_LPVOID)(FX_UINTPTR)charcode, pGlyphBitmap);
- return pGlyphBitmap;
-}
-CPDF_Type3Glyphs::~CPDF_Type3Glyphs()
-{
- FX_POSITION pos = m_GlyphMap.GetStartPosition();
- FX_LPVOID Key;
- CFX_GlyphBitmap* pGlyphBitmap;
- while(pos) {
- m_GlyphMap.GetNextAssoc(pos, Key, (void*&)pGlyphBitmap);
- delete pGlyphBitmap;
- }
-}
-static int _AdjustBlue(FX_FLOAT pos, int& count, int blues[])
-{
- FX_FLOAT min_distance = 1000000.0f * 1.0f;
- int closest_pos = -1;
- for (int i = 0; i < count; i ++) {
- FX_FLOAT distance = (FX_FLOAT)FXSYS_fabs(pos - (FX_FLOAT)blues[i]);
- if (distance < 1.0f * 80.0f / 100.0f && distance < min_distance) {
- min_distance = distance;
- closest_pos = i;
- }
- }
- if (closest_pos >= 0) {
- return blues[closest_pos];
- }
- int new_pos = FXSYS_round(pos);
- if (count == TYPE3_MAX_BLUES) {
- return new_pos;
- }
- blues[count++] = new_pos;
- return new_pos;
-}
-void CPDF_Type3Glyphs::AdjustBlue(FX_FLOAT top, FX_FLOAT bottom, int& top_line, int& bottom_line)
-{
- top_line = _AdjustBlue(top, m_TopBlueCount, m_TopBlue);
- bottom_line = _AdjustBlue(bottom, m_BottomBlueCount, m_BottomBlue);
-}
-static FX_BOOL _IsScanLine1bpp(FX_LPBYTE pBuf, int width)
-{
- int size = width / 8;
- for (int i = 0; i < size; i ++)
- if (pBuf[i]) {
- return TRUE;
- }
- if (width % 8)
- if (pBuf[width / 8] & (0xff << (8 - width % 8))) {
- return TRUE;
- }
- return FALSE;
-}
-static FX_BOOL _IsScanLine8bpp(FX_LPBYTE pBuf, int width)
-{
- for (int i = 0; i < width; i ++)
- if (pBuf[i] > 0x40) {
- return TRUE;
- }
- return FALSE;
-}
-static int _DetectFirstLastScan(const CFX_DIBitmap* pBitmap, FX_BOOL bFirst)
-{
- int height = pBitmap->GetHeight(), pitch = pBitmap->GetPitch(), width = pBitmap->GetWidth();
- int bpp = pBitmap->GetBPP();
- if (bpp > 8) {
- width *= bpp / 8;
- }
- FX_LPBYTE pBuf = pBitmap->GetBuffer();
- int line = bFirst ? 0 : height - 1;
- int line_step = bFirst ? 1 : -1;
- int line_end = bFirst ? height : -1;
- while (line != line_end) {
- if (bpp == 1) {
- if (_IsScanLine1bpp(pBuf + line * pitch, width)) {
- return line;
- }
- } else {
- if (_IsScanLine8bpp(pBuf + line * pitch, width)) {
- return line;
- }
- }
- line += line_step;
- }
- return -1;
-}
-CFX_GlyphBitmap* CPDF_Type3Cache::RenderGlyph(CPDF_Type3Glyphs* pSize, FX_DWORD charcode, const CFX_AffineMatrix* pMatrix, FX_FLOAT retinaScaleX, FX_FLOAT retinaScaleY)
-{
- CPDF_Type3Char* pChar = m_pFont->LoadChar(charcode);
- if (pChar == NULL || pChar->m_pBitmap == NULL) {
- return NULL;
- }
- CFX_DIBitmap* pBitmap = pChar->m_pBitmap;
- CFX_AffineMatrix image_matrix, text_matrix;
- image_matrix = pChar->m_ImageMatrix;
- text_matrix.Set(pMatrix->a, pMatrix->b, pMatrix->c, pMatrix->d, 0, 0);
- image_matrix.Concat(text_matrix);
- CFX_DIBitmap* pResBitmap = NULL;
- int left, top;
- if (FXSYS_fabs(image_matrix.b) < FXSYS_fabs(image_matrix.a) / 100 && FXSYS_fabs(image_matrix.c) < FXSYS_fabs(image_matrix.d) / 100) {
- int top_line, bottom_line;
- top_line = _DetectFirstLastScan(pBitmap, TRUE);
- bottom_line = _DetectFirstLastScan(pBitmap, FALSE);
- if (top_line == 0 && bottom_line == pBitmap->GetHeight() - 1) {
- FX_FLOAT top_y = image_matrix.d + image_matrix.f;
- FX_FLOAT bottom_y = image_matrix.f;
- FX_BOOL bFlipped = top_y > bottom_y;
- if (bFlipped) {
- FX_FLOAT temp = top_y;
- top_y = bottom_y;
- bottom_y = temp;
- }
- pSize->AdjustBlue(top_y, bottom_y, top_line, bottom_line);
- pResBitmap = pBitmap->StretchTo((int)(FXSYS_round(image_matrix.a) * retinaScaleX), (int)((bFlipped ? top_line - bottom_line : bottom_line - top_line) * retinaScaleY));
- top = top_line;
- if (image_matrix.a < 0) {
- image_matrix.Scale(retinaScaleX, retinaScaleY);
- left = FXSYS_round(image_matrix.e + image_matrix.a);
- } else {
- left = FXSYS_round(image_matrix.e);
- }
- } else {
- }
- }
- if (pResBitmap == NULL) {
- image_matrix.Scale(retinaScaleX, retinaScaleY);
- pResBitmap = pBitmap->TransformTo(&image_matrix, left, top);
- }
- if (pResBitmap == NULL) {
- return NULL;
- }
- CFX_GlyphBitmap* pGlyph = FX_NEW CFX_GlyphBitmap;
- pGlyph->m_Left = left;
- pGlyph->m_Top = -top;
- pGlyph->m_Bitmap.TakeOver(pResBitmap);
- delete pResBitmap;
- return pGlyph;
-}
-void _CPDF_UniqueKeyGen::Generate(int count, ...)
-{
- va_list argList;
- va_start(argList, count);
- for (int i = 0; i < count; i ++) {
- int p = va_arg(argList, int);
- ((FX_DWORD*)m_Key)[i] = p;
- }
- va_end(argList);
- m_KeyLen = count * sizeof(FX_DWORD);
-}
-FX_BOOL CPDF_RenderStatus::ProcessText(const CPDF_TextObject* textobj, const CFX_AffineMatrix* pObj2Device, CFX_PathData* pClippingPath)
-{
- if(textobj->m_nChars == 0) {
- return TRUE;
- }
- int text_render_mode = textobj->m_TextState.GetObject()->m_TextMode;
- if (text_render_mode == 3) {
- return TRUE;
- }
- CPDF_Font* pFont = textobj->m_TextState.GetFont();
- if (pFont->GetFontType() == PDFFONT_TYPE3) {
- return ProcessType3Text(textobj, pObj2Device);
- }
- FX_BOOL bFill = FALSE, bStroke = FALSE, bClip = FALSE;
- if (pClippingPath) {
- bClip = TRUE;
- } else {
- switch (text_render_mode) {
- case 0:
- case 4:
- bFill = TRUE;
- break;
- case 1:
- case 5:
- if (pFont->GetFace() == NULL && !(pFont->GetSubstFont()->m_SubstFlags & FXFONT_SUBST_GLYPHPATH)) {
- bFill = TRUE;
- } else {
- bStroke = TRUE;
- }
- break;
- case 2:
- case 6:
- if (pFont->GetFace() == NULL && !(pFont->GetSubstFont()->m_SubstFlags & FXFONT_SUBST_GLYPHPATH)) {
- bFill = TRUE;
- } else {
- bFill = bStroke = TRUE;
- }
- break;
- case 3:
- case 7:
- return TRUE;
- default:
- bFill = TRUE;
- }
- }
- FX_ARGB stroke_argb = 0, fill_argb = 0;
- FX_BOOL bPattern = FALSE;
- if (bStroke) {
- if (textobj->m_ColorState.GetStrokeColor()->IsPattern()) {
- bPattern = TRUE;
- } else {
- stroke_argb = GetStrokeArgb(textobj);
- }
- }
- if (bFill) {
- if (textobj->m_ColorState.GetFillColor()->IsPattern()) {
- bPattern = TRUE;
- } else {
- fill_argb = GetFillArgb(textobj);
- }
- }
- CFX_AffineMatrix text_matrix;
- textobj->GetTextMatrix(&text_matrix);
- if(IsAvailableMatrix(text_matrix) == FALSE) {
- return TRUE;
- }
- FX_FLOAT font_size = textobj->m_TextState.GetFontSize();
- if (bPattern) {
- DrawTextPathWithPattern(textobj, pObj2Device, pFont, font_size, &text_matrix, bFill, bStroke);
- return TRUE;
- }
-#if defined(_FPDFAPI_MINI_)
- if (bFill) {
- bStroke = FALSE;
- }
- if (bStroke) {
- if (font_size * text_matrix.GetXUnit() * pObj2Device->GetXUnit() < 6) {
- bStroke = FALSE;
- }
- }
-#endif
- if (bClip || bStroke) {
- const CFX_AffineMatrix* pDeviceMatrix = pObj2Device;
- CFX_AffineMatrix device_matrix;
- if (bStroke) {
- const FX_FLOAT* pCTM = textobj->m_TextState.GetObject()->m_CTM;
- if (pCTM[0] != 1.0f || pCTM[3] != 1.0f) {
- CFX_AffineMatrix ctm(pCTM[0], pCTM[1], pCTM[2], pCTM[3], 0, 0);
- text_matrix.ConcatInverse(ctm);
- device_matrix.Copy(ctm);
- device_matrix.Concat(*pObj2Device);
- pDeviceMatrix = &device_matrix;
- }
- }
- int flag = 0;
- if (bStroke && bFill) {
- flag |= FX_FILL_STROKE;
- flag |= FX_STROKE_TEXT_MODE;
- }
-#if !defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_)
- const CPDF_GeneralStateData* pGeneralData = ((CPDF_PageObject*)textobj)->m_GeneralState;
- if (pGeneralData && pGeneralData->m_StrokeAdjust) {
- flag |= FX_STROKE_ADJUST;
- }
-#endif
- if (m_Options.m_Flags & RENDER_NOTEXTSMOOTH) {
- flag |= FXFILL_NOPATHSMOOTH;
- }
- return CPDF_TextRenderer::DrawTextPath(m_pDevice, textobj->m_nChars, textobj->m_pCharCodes, textobj->m_pCharPos, pFont, font_size,
- &text_matrix, pDeviceMatrix, textobj->m_GraphState, fill_argb, stroke_argb, pClippingPath, flag);
- }
- text_matrix.Concat(*pObj2Device);
- return CPDF_TextRenderer::DrawNormalText(m_pDevice, textobj->m_nChars, textobj->m_pCharCodes, textobj->m_pCharPos, pFont, font_size,
- &text_matrix, fill_argb, &m_Options);
-}
-CPDF_Type3Cache* CPDF_RenderStatus::GetCachedType3(CPDF_Type3Font* pFont)
-{
- if (pFont->m_pDocument == NULL) {
- return NULL;
- }
- pFont->m_pDocument->GetPageData()->GetFont(pFont->GetFontDict(), FALSE);
- return pFont->m_pDocument->GetRenderData()->GetCachedType3(pFont);
-}
-static void ReleaseCachedType3(CPDF_Type3Font* pFont)
-{
- if (pFont->m_pDocument == NULL) {
- return;
- }
- pFont->m_pDocument->GetRenderData()->ReleaseCachedType3(pFont);
- pFont->m_pDocument->GetPageData()->ReleaseFont(pFont->GetFontDict());
-}
-FX_BOOL CPDF_Type3Char::LoadBitmap(CPDF_RenderContext* pContext)
-{
- if (m_pBitmap != NULL || m_pForm == NULL) {
- return TRUE;
- }
- if (m_pForm->CountObjects() == 1 && !m_bColored) {
- CPDF_PageObject *pPageObj = m_pForm->GetObjectAt(m_pForm->GetFirstObjectPosition());
- if (pPageObj->m_Type == PDFPAGE_IMAGE) {
- CPDF_ImageObject* pImage = (CPDF_ImageObject*)pPageObj;
- m_ImageMatrix = pImage->m_Matrix;
- const CFX_DIBSource* pSource = pImage->m_pImage->LoadDIBSource();
- if (pSource) {
- m_pBitmap = pSource->Clone();
- delete pSource;
- }
- delete m_pForm;
- m_pForm = NULL;
- return TRUE;
- }
- if (pPageObj->m_Type == PDFPAGE_INLINES) {
- CPDF_InlineImages *pInlines = (CPDF_InlineImages *)pPageObj;
- if (pInlines->m_pStream) {
- m_ImageMatrix = pInlines->m_Matrices[0];
- CPDF_DIBSource dibsrc;
- if (!dibsrc.Load(pContext->m_pDocument, pInlines->m_pStream, NULL, NULL, NULL, NULL)) {
- return FALSE;
- }
- m_pBitmap = dibsrc.Clone();
- delete m_pForm;
- m_pForm = NULL;
- return TRUE;
- }
- }
- }
- return FALSE;
-}
-class CPDF_RefType3Cache
-{
-public:
- CPDF_RefType3Cache(CPDF_Type3Font* pType3Font)
- {
- m_dwCount = 0;
- m_pType3Font = pType3Font;
- }
- ~CPDF_RefType3Cache()
- {
- while(m_dwCount--) {
- ReleaseCachedType3(m_pType3Font);
- }
- }
- FX_DWORD m_dwCount;
- CPDF_Type3Font* m_pType3Font;
-};
-FX_BOOL CPDF_RenderStatus::ProcessType3Text(const CPDF_TextObject* textobj, const CFX_AffineMatrix* pObj2Device)
-{
- CPDF_Type3Font* pType3Font = textobj->m_TextState.GetFont()->GetType3Font();
- for (int j = 0; j < m_Type3FontCache.GetSize(); j++)
- if ((CPDF_Type3Font*)m_Type3FontCache.GetAt(j) == pType3Font) {
- return TRUE;
- }
- CFX_Matrix dCTM = m_pDevice->GetCTM();
- FX_FLOAT sa = FXSYS_fabs(dCTM.a);
- FX_FLOAT sd = FXSYS_fabs(dCTM.d);
- CFX_AffineMatrix text_matrix;
- textobj->GetTextMatrix(&text_matrix);
- CFX_AffineMatrix char_matrix = pType3Font->GetFontMatrix();
- FX_FLOAT font_size = textobj->m_TextState.GetFontSize();
- char_matrix.Scale(font_size, font_size);
- FX_ARGB fill_argb = GetFillArgb(textobj, TRUE);
- int fill_alpha = FXARGB_A(fill_argb);
- int device_class = m_pDevice->GetDeviceClass();
- FXTEXT_GLYPHPOS* pGlyphAndPos = NULL;
- if (device_class == FXDC_DISPLAY) {
- pGlyphAndPos = FX_Alloc(FXTEXT_GLYPHPOS, textobj->m_nChars);
- FXSYS_memset32(pGlyphAndPos, 0, sizeof(FXTEXT_GLYPHPOS) * textobj->m_nChars);
- } else if (fill_alpha < 255) {
- return FALSE;
- }
- CPDF_RefType3Cache refTypeCache(pType3Font);
- FX_DWORD *pChars = textobj->m_pCharCodes;
- if (textobj->m_nChars == 1) {
- pChars = (FX_DWORD*)(&textobj->m_pCharCodes);
- }
- for (int iChar = 0; iChar < textobj->m_nChars; iChar ++) {
- FX_DWORD charcode = pChars[iChar];
- if (charcode == (FX_DWORD) - 1) {
- continue;
- }
- CPDF_Type3Char* pType3Char = pType3Font->LoadChar(charcode);
- if (pType3Char == NULL) {
- continue;
- }
- CFX_AffineMatrix matrix = char_matrix;
- matrix.e += iChar ? textobj->m_pCharPos[iChar - 1] : 0;
- matrix.Concat(text_matrix);
- matrix.Concat(*pObj2Device);
- if (!pType3Char->LoadBitmap(m_pContext)) {
- if (pGlyphAndPos) {
- for (int i = 0; i < iChar; i ++) {
- FXTEXT_GLYPHPOS& glyph = pGlyphAndPos[i];
- if (glyph.m_pGlyph == NULL) {
- continue;
- }
- m_pDevice->SetBitMask(&glyph.m_pGlyph->m_Bitmap,
- glyph.m_OriginX + glyph.m_pGlyph->m_Left,
- glyph.m_OriginY - glyph.m_pGlyph->m_Top, fill_argb);
- }
- FX_Free(pGlyphAndPos);
- pGlyphAndPos = NULL;
- }
- CPDF_GraphicStates* pStates = CloneObjStates(textobj, FALSE);
- CPDF_RenderOptions Options = m_Options;
- Options.m_Flags |= RENDER_FORCE_HALFTONE | RENDER_RECT_AA;
- Options.m_Flags &= ~RENDER_FORCE_DOWNSAMPLE;
- CPDF_Dictionary* pFormResource = NULL;
- if (pType3Char->m_pForm && pType3Char->m_pForm->m_pFormDict) {
- pFormResource = pType3Char->m_pForm->m_pFormDict->GetDict(FX_BSTRC("Resources"));
- }
- if (fill_alpha == 255) {
- CPDF_RenderStatus status;
- status.Initialize(m_Level + 1, m_pContext, m_pDevice, NULL, NULL, this, pStates, &Options,
- pType3Char->m_pForm->m_Transparency, m_bDropObjects, pFormResource, FALSE, pType3Char, fill_argb);
- status.m_Type3FontCache.Append(m_Type3FontCache);
- status.m_Type3FontCache.Add(pType3Font);
- m_pDevice->SaveState();
- status.RenderObjectList(pType3Char->m_pForm, &matrix);
- m_pDevice->RestoreState();
- } else {
- CFX_FloatRect rect_f = pType3Char->m_pForm->CalcBoundingBox();
- rect_f.Transform(&matrix);
- FX_RECT rect = rect_f.GetOutterRect();
- CFX_FxgeDevice bitmap_device;
- if (!bitmap_device.Create((int)(rect.Width() * sa), (int)(rect.Height() * sd), FXDIB_Argb)) {
- return TRUE;
- }
- bitmap_device.GetBitmap()->Clear(0);
- CPDF_RenderStatus status;
- status.Initialize(m_Level + 1, m_pContext, &bitmap_device, NULL, NULL, this, pStates, &Options,
- pType3Char->m_pForm->m_Transparency, m_bDropObjects, pFormResource, FALSE, pType3Char, fill_argb);
- status.m_Type3FontCache.Append(m_Type3FontCache);
- status.m_Type3FontCache.Add(pType3Font);
- matrix.TranslateI(-rect.left, -rect.top);
- matrix.Scale(sa, sd);
- status.RenderObjectList(pType3Char->m_pForm, &matrix);
- m_pDevice->SetDIBits(bitmap_device.GetBitmap(), rect.left, rect.top);
- }
- delete pStates;
- } else if (pType3Char->m_pBitmap) {
- if (device_class == FXDC_DISPLAY) {
- CPDF_Type3Cache* pCache = GetCachedType3(pType3Font);
- refTypeCache.m_dwCount++;
- CFX_GlyphBitmap* pBitmap = pCache->LoadGlyph(charcode, &matrix, sa, sd);
- if (pBitmap == NULL) {
- continue;
- }
- int origin_x = FXSYS_round(matrix.e);
- int origin_y = FXSYS_round(matrix.f);
- if (pGlyphAndPos) {
- pGlyphAndPos[iChar].m_pGlyph = pBitmap;
- pGlyphAndPos[iChar].m_OriginX = origin_x;
- pGlyphAndPos[iChar].m_OriginY = origin_y;
- } else {
- m_pDevice->SetBitMask(&pBitmap->m_Bitmap, origin_x + pBitmap->m_Left, origin_y - pBitmap->m_Top, fill_argb);
- }
- } else {
- CFX_AffineMatrix image_matrix = pType3Char->m_ImageMatrix;
- image_matrix.Concat(matrix);
- CPDF_ImageRenderer renderer;
- if (renderer.Start(this, pType3Char->m_pBitmap, fill_argb, 255, &image_matrix, 0, FALSE)) {
- renderer.Continue(NULL);
- }
- if (!renderer.m_Result) {
- return FALSE;
- }
- }
- }
- }
- if (pGlyphAndPos) {
- FX_RECT rect = FXGE_GetGlyphsBBox(pGlyphAndPos, textobj->m_nChars, 0, sa, sd);
- CFX_DIBitmap bitmap;
- if (!bitmap.Create((int)(rect.Width() * sa), (int)(rect.Height() * sd), FXDIB_8bppMask)) {
- FX_Free(pGlyphAndPos);
- return TRUE;
- }
- bitmap.Clear(0);
- for (int iChar = 0; iChar < textobj->m_nChars; iChar ++) {
- FXTEXT_GLYPHPOS& glyph = pGlyphAndPos[iChar];
- if (glyph.m_pGlyph == NULL) {
- continue;
- }
- bitmap.TransferBitmap((int)((glyph.m_OriginX + glyph.m_pGlyph->m_Left - rect.left) * sa),
- (int)((glyph.m_OriginY - glyph.m_pGlyph->m_Top - rect.top) * sd),
- glyph.m_pGlyph->m_Bitmap.GetWidth(), glyph.m_pGlyph->m_Bitmap.GetHeight(),
- &glyph.m_pGlyph->m_Bitmap, 0, 0);
- }
- m_pDevice->SetBitMask(&bitmap, rect.left, rect.top, fill_argb);
- FX_Free(pGlyphAndPos);
- }
- return TRUE;
-}
-class CPDF_CharPosList
-{
-public:
- CPDF_CharPosList();
- ~CPDF_CharPosList();
- void Load(int nChars, FX_DWORD* pCharCodes, FX_FLOAT* pCharPos, CPDF_Font* pFont, FX_FLOAT font_size);
- FXTEXT_CHARPOS* m_pCharPos;
- FX_DWORD m_nChars;
-};
-FX_FLOAT _CIDTransformToFloat(FX_BYTE ch);
-CPDF_CharPosList::CPDF_CharPosList()
-{
- m_pCharPos = NULL;
-}
-CPDF_CharPosList::~CPDF_CharPosList()
-{
- if (m_pCharPos) {
- FX_Free(m_pCharPos);
- }
-}
-void CPDF_CharPosList::Load(int nChars, FX_DWORD* pCharCodes, FX_FLOAT* pCharPos, CPDF_Font* pFont,
- FX_FLOAT FontSize)
-{
- m_pCharPos = FX_Alloc(FXTEXT_CHARPOS, nChars);
- FXSYS_memset32(m_pCharPos, 0, sizeof(FXTEXT_CHARPOS) * nChars);
- m_nChars = 0;
- CPDF_CIDFont* pCIDFont = pFont->GetCIDFont();
- FX_BOOL bVertWriting = pCIDFont && pCIDFont->IsVertWriting();
- for (int iChar = 0; iChar < nChars; iChar ++) {
- FX_DWORD CharCode = nChars == 1 ? (FX_DWORD)(FX_UINTPTR)pCharCodes : pCharCodes[iChar];
- if (CharCode == (FX_DWORD) - 1) {
- continue;
- }
- FX_BOOL bVert = FALSE;
- FXTEXT_CHARPOS& charpos = m_pCharPos[m_nChars++];
- if (pCIDFont) {
- charpos.m_bFontStyle = pCIDFont->IsFontStyleFromCharCode(CharCode);
- }
- charpos.m_GlyphIndex = pFont->GlyphFromCharCode(CharCode, &bVert);
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
- charpos.m_ExtGID = pFont->GlyphFromCharCodeExt(CharCode);
-#endif
- if (!pFont->IsEmbedded() && pFont->GetFontType() != PDFFONT_CIDFONT) {
- charpos.m_FontCharWidth = pFont->GetCharWidthF(CharCode);
- } else {
- charpos.m_FontCharWidth = 0;
- }
- charpos.m_OriginX = iChar ? pCharPos[iChar - 1] : 0;
- charpos.m_OriginY = 0;
- charpos.m_bGlyphAdjust = FALSE;
- if (pCIDFont == NULL) {
- continue;
- }
- FX_WORD CID = pCIDFont->CIDFromCharCode(CharCode);
- if (bVertWriting) {
- charpos.m_OriginY = charpos.m_OriginX;
- charpos.m_OriginX = 0;
- short vx, vy;
- pCIDFont->GetVertOrigin(CID, vx, vy);
- charpos.m_OriginX -= FontSize * vx / 1000;
- charpos.m_OriginY -= FontSize * vy / 1000;
- }
- FX_LPCBYTE pTransform = pCIDFont->GetCIDTransform(CID);
- if (pTransform && !bVert) {
- charpos.m_AdjustMatrix[0] = _CIDTransformToFloat(pTransform[0]);
- charpos.m_AdjustMatrix[2] = _CIDTransformToFloat(pTransform[2]);
- charpos.m_AdjustMatrix[1] = _CIDTransformToFloat(pTransform[1]);
- charpos.m_AdjustMatrix[3] = _CIDTransformToFloat(pTransform[3]);
- charpos.m_OriginX += _CIDTransformToFloat(pTransform[4]) * FontSize;
- charpos.m_OriginY += _CIDTransformToFloat(pTransform[5]) * FontSize;
- charpos.m_bGlyphAdjust = TRUE;
- }
- }
-}
-FX_BOOL CPDF_TextRenderer::DrawTextPath(CFX_RenderDevice* pDevice, int nChars, FX_DWORD* pCharCodes, FX_FLOAT* pCharPos,
- CPDF_Font* pFont, FX_FLOAT font_size,
- const CFX_AffineMatrix* pText2User, const CFX_AffineMatrix* pUser2Device,
- const CFX_GraphStateData* pGraphState,
- FX_ARGB fill_argb, FX_ARGB stroke_argb, CFX_PathData* pClippingPath, int nFlag)
-{
- CFX_FontCache* pCache = pFont->m_pDocument ? pFont->m_pDocument->GetRenderData()->GetFontCache() : NULL;
- CPDF_CharPosList CharPosList;
- CharPosList.Load(nChars, pCharCodes, pCharPos, pFont, font_size);
- return pDevice->DrawTextPath(CharPosList.m_nChars, CharPosList.m_pCharPos,
- &pFont->m_Font, pCache, font_size, pText2User, pUser2Device,
- pGraphState, fill_argb, stroke_argb, pClippingPath, nFlag);
-}
-void CPDF_TextRenderer::DrawTextString(CFX_RenderDevice* pDevice, int left, int top, CPDF_Font* pFont, int height,
- const CFX_ByteString& str, FX_ARGB argb)
-{
- FX_RECT font_bbox;
- pFont->GetFontBBox(font_bbox);
- FX_FLOAT font_size = (FX_FLOAT)height * 1000.0f / (FX_FLOAT)(font_bbox.top - font_bbox.bottom);
- FX_FLOAT origin_x = (FX_FLOAT)left;
- FX_FLOAT origin_y = (FX_FLOAT)top + font_size * (FX_FLOAT)font_bbox.top / 1000.0f;
- CFX_AffineMatrix matrix(1.0f, 0, 0, -1.0f, 0, 0);
- DrawTextString(pDevice, origin_x, origin_y, pFont, font_size, &matrix, str, argb);
-}
-void CPDF_TextRenderer::DrawTextString(CFX_RenderDevice* pDevice, FX_FLOAT origin_x, FX_FLOAT origin_y, CPDF_Font* pFont, FX_FLOAT font_size,
- const CFX_AffineMatrix* pMatrix, const CFX_ByteString& str, FX_ARGB fill_argb,
- FX_ARGB stroke_argb, const CFX_GraphStateData* pGraphState, const CPDF_RenderOptions* pOptions)
-{
- int nChars = pFont->CountChar(str, str.GetLength());
- if (nChars == 0) {
- return;
- }
- FX_DWORD charcode;
- int offset = 0;
- FX_DWORD* pCharCodes;
- FX_FLOAT* pCharPos;
- if (nChars == 1) {
- charcode = pFont->GetNextChar(str, offset);
- pCharCodes = (FX_DWORD*)(FX_UINTPTR)charcode;
- pCharPos = NULL;
- } else {
- pCharCodes = FX_Alloc(FX_DWORD, nChars);
- pCharPos = FX_Alloc(FX_FLOAT, nChars - 1);
- FX_FLOAT cur_pos = 0;
- for (int i = 0; i < nChars; i ++) {
- pCharCodes[i] = pFont->GetNextChar(str, offset);
- if (i) {
- pCharPos[i - 1] = cur_pos;
- }
- cur_pos += pFont->GetCharWidthF(pCharCodes[i]) * font_size / 1000;
- }
- }
- CFX_AffineMatrix matrix;
- if (pMatrix) {
- matrix = *pMatrix;
- }
- matrix.e = origin_x;
- matrix.f = origin_y;
- if (pFont->GetFontType() == PDFFONT_TYPE3)
- ;
- else if (stroke_argb == 0) {
- DrawNormalText(pDevice, nChars, pCharCodes, pCharPos, pFont, font_size, &matrix, fill_argb, pOptions);
- } else
- DrawTextPath(pDevice, nChars, pCharCodes, pCharPos, pFont, font_size, &matrix, NULL, pGraphState,
- fill_argb, stroke_argb, NULL);
- if (nChars > 1) {
- FX_Free(pCharCodes);
- FX_Free(pCharPos);
- }
-}
-FX_BOOL CPDF_TextRenderer::DrawNormalText(CFX_RenderDevice* pDevice, int nChars, FX_DWORD* pCharCodes, FX_FLOAT* pCharPos,
- CPDF_Font* pFont, FX_FLOAT font_size,
- const CFX_AffineMatrix* pText2Device,
- FX_ARGB fill_argb, const CPDF_RenderOptions* pOptions)
-{
- CFX_FontCache* pCache = pFont->m_pDocument ? pFont->m_pDocument->GetRenderData()->GetFontCache() : NULL;
- CPDF_CharPosList CharPosList;
- CharPosList.Load(nChars, pCharCodes, pCharPos, pFont, font_size);
- int FXGE_flags = 0;
- if (pOptions) {
- FX_DWORD dwFlags = pOptions->m_Flags;
- if (dwFlags & RENDER_CLEARTYPE) {
- FXGE_flags |= FXTEXT_CLEARTYPE;
- if (dwFlags & RENDER_BGR_STRIPE) {
- FXGE_flags |= FXTEXT_BGR_STRIPE;
- }
- }
- if (dwFlags & RENDER_NOTEXTSMOOTH) {
- FXGE_flags |= FXTEXT_NOSMOOTH;
- }
- if (dwFlags & RENDER_PRINTGRAPHICTEXT) {
- FXGE_flags |= FXTEXT_PRINTGRAPHICTEXT;
- }
- if (dwFlags & RENDER_NO_NATIVETEXT) {
- FXGE_flags |= FXTEXT_NO_NATIVETEXT;
- }
- if (dwFlags & RENDER_PRINTIMAGETEXT) {
- FXGE_flags |= FXTEXT_PRINTIMAGETEXT;
- }
- } else {
- FXGE_flags = FXTEXT_CLEARTYPE;
- }
- if (pFont->GetFontType() & PDFFONT_CIDFONT) {
- FXGE_flags |= FXFONT_CIDFONT;
- }
- return pDevice->DrawNormalText(CharPosList.m_nChars, CharPosList.m_pCharPos, &pFont->m_Font, pCache, font_size, pText2Device, fill_argb, FXGE_flags);
-}
-void CPDF_RenderStatus::DrawTextPathWithPattern(const CPDF_TextObject* textobj, const CFX_AffineMatrix* pObj2Device,
- CPDF_Font* pFont, FX_FLOAT font_size,
- const CFX_AffineMatrix* pTextMatrix, FX_BOOL bFill, FX_BOOL bStroke)
-{
- if (!bStroke) {
- CPDF_PathObject path;
- CPDF_TextObject* pCopy = FX_NEW CPDF_TextObject;
- pCopy->Copy(textobj);
- path.m_bStroke = FALSE;
- path.m_FillType = FXFILL_WINDING;
- path.m_ClipPath.AppendTexts(&pCopy, 1);
- path.m_ColorState = textobj->m_ColorState;
- path.m_Path.New()->AppendRect(textobj->m_Left, textobj->m_Bottom, textobj->m_Right, textobj->m_Top);
- path.m_Left = textobj->m_Left;
- path.m_Bottom = textobj->m_Bottom;
- path.m_Right = textobj->m_Right;
- path.m_Top = textobj->m_Top;
- RenderSingleObject(&path, pObj2Device);
- return;
- }
- CFX_FontCache* pCache;
- if (pFont->m_pDocument) {
- pCache = pFont->m_pDocument->GetRenderData()->GetFontCache();
- } else {
- pCache = CFX_GEModule::Get()->GetFontCache();
- }
- CFX_FaceCache* pFaceCache = pCache->GetCachedFace(&pFont->m_Font);
- FX_FONTCACHE_DEFINE(pCache, &pFont->m_Font);
- CPDF_CharPosList CharPosList;
- CharPosList.Load(textobj->m_nChars, textobj->m_pCharCodes, textobj->m_pCharPos, pFont, font_size);
- for (FX_DWORD i = 0; i < CharPosList.m_nChars; i ++) {
- FXTEXT_CHARPOS& charpos = CharPosList.m_pCharPos[i];
- const CFX_PathData* pPath = pFaceCache->LoadGlyphPath(&pFont->m_Font, charpos.m_GlyphIndex,
- charpos.m_FontCharWidth);
- if (pPath == NULL) {
- continue;
- }
- CPDF_PathObject path;
- path.m_GraphState = textobj->m_GraphState;
- path.m_ColorState = textobj->m_ColorState;
- CFX_AffineMatrix matrix;
- if (charpos.m_bGlyphAdjust)
- matrix.Set(charpos.m_AdjustMatrix[0], charpos.m_AdjustMatrix[1],
- charpos.m_AdjustMatrix[2], charpos.m_AdjustMatrix[3], 0, 0);
- matrix.Concat(font_size, 0, 0, font_size, charpos.m_OriginX, charpos.m_OriginY);
- path.m_Path.New()->Append(pPath, &matrix);
- path.m_Matrix = *pTextMatrix;
- path.m_bStroke = bStroke;
- path.m_FillType = bFill ? FXFILL_WINDING : 0;
- path.CalcBoundingBox();
- ProcessPath(&path, pObj2Device);
- }
-}
-CFX_PathData* CPDF_Font::LoadGlyphPath(FX_DWORD charcode, int dest_width)
-{
- int glyph_index = GlyphFromCharCode(charcode);
- if (m_Font.m_Face == NULL) {
- return NULL;
- }
- return m_Font.LoadGlyphPath(glyph_index, dest_width);
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxge/fx_ge.h"
+#include "../../../include/fpdfapi/fpdf_render.h"
+#include "../../../include/fpdfapi/fpdf_pageobj.h"
+#include "../fpdf_page/pageint.h"
+#include "render_int.h"
+extern FX_BOOL IsAvailableMatrix(const CFX_AffineMatrix& matrix);
+CPDF_Type3Cache::~CPDF_Type3Cache()
+{
+ FX_POSITION pos = m_SizeMap.GetStartPosition();
+ CFX_ByteString Key;
+ CPDF_Type3Glyphs* pSizeCache = NULL;
+ while(pos) {
+ pSizeCache = (CPDF_Type3Glyphs*)m_SizeMap.GetNextValue(pos);
+ delete pSizeCache;
+ }
+ m_SizeMap.RemoveAll();
+}
+CFX_GlyphBitmap* CPDF_Type3Cache::LoadGlyph(FX_DWORD charcode, const CFX_AffineMatrix* pMatrix, FX_FLOAT retinaScaleX, FX_FLOAT retinaScaleY)
+{
+ _CPDF_UniqueKeyGen keygen;
+ keygen.Generate(4, FXSYS_round(pMatrix->a * 10000), FXSYS_round(pMatrix->b * 10000),
+ FXSYS_round(pMatrix->c * 10000), FXSYS_round(pMatrix->d * 10000));
+ CFX_ByteStringC FaceGlyphsKey(keygen.m_Key, keygen.m_KeyLen);
+ CPDF_Type3Glyphs* pSizeCache = NULL;
+ if(!m_SizeMap.Lookup(FaceGlyphsKey, (void*&)pSizeCache)) {
+ pSizeCache = FX_NEW CPDF_Type3Glyphs;
+ m_SizeMap.SetAt(FaceGlyphsKey, pSizeCache);
+ }
+ CFX_GlyphBitmap* pGlyphBitmap;
+ if(pSizeCache->m_GlyphMap.Lookup((FX_LPVOID)(FX_UINTPTR)charcode, (void*&)pGlyphBitmap)) {
+ return pGlyphBitmap;
+ }
+ pGlyphBitmap = RenderGlyph(pSizeCache, charcode, pMatrix, retinaScaleX, retinaScaleY);
+ pSizeCache->m_GlyphMap.SetAt((FX_LPVOID)(FX_UINTPTR)charcode, pGlyphBitmap);
+ return pGlyphBitmap;
+}
+CPDF_Type3Glyphs::~CPDF_Type3Glyphs()
+{
+ FX_POSITION pos = m_GlyphMap.GetStartPosition();
+ FX_LPVOID Key;
+ CFX_GlyphBitmap* pGlyphBitmap;
+ while(pos) {
+ m_GlyphMap.GetNextAssoc(pos, Key, (void*&)pGlyphBitmap);
+ delete pGlyphBitmap;
+ }
+}
+static int _AdjustBlue(FX_FLOAT pos, int& count, int blues[])
+{
+ FX_FLOAT min_distance = 1000000.0f * 1.0f;
+ int closest_pos = -1;
+ for (int i = 0; i < count; i ++) {
+ FX_FLOAT distance = (FX_FLOAT)FXSYS_fabs(pos - (FX_FLOAT)blues[i]);
+ if (distance < 1.0f * 80.0f / 100.0f && distance < min_distance) {
+ min_distance = distance;
+ closest_pos = i;
+ }
+ }
+ if (closest_pos >= 0) {
+ return blues[closest_pos];
+ }
+ int new_pos = FXSYS_round(pos);
+ if (count == TYPE3_MAX_BLUES) {
+ return new_pos;
+ }
+ blues[count++] = new_pos;
+ return new_pos;
+}
+void CPDF_Type3Glyphs::AdjustBlue(FX_FLOAT top, FX_FLOAT bottom, int& top_line, int& bottom_line)
+{
+ top_line = _AdjustBlue(top, m_TopBlueCount, m_TopBlue);
+ bottom_line = _AdjustBlue(bottom, m_BottomBlueCount, m_BottomBlue);
+}
+static FX_BOOL _IsScanLine1bpp(FX_LPBYTE pBuf, int width)
+{
+ int size = width / 8;
+ for (int i = 0; i < size; i ++)
+ if (pBuf[i]) {
+ return TRUE;
+ }
+ if (width % 8)
+ if (pBuf[width / 8] & (0xff << (8 - width % 8))) {
+ return TRUE;
+ }
+ return FALSE;
+}
+static FX_BOOL _IsScanLine8bpp(FX_LPBYTE pBuf, int width)
+{
+ for (int i = 0; i < width; i ++)
+ if (pBuf[i] > 0x40) {
+ return TRUE;
+ }
+ return FALSE;
+}
+static int _DetectFirstLastScan(const CFX_DIBitmap* pBitmap, FX_BOOL bFirst)
+{
+ int height = pBitmap->GetHeight(), pitch = pBitmap->GetPitch(), width = pBitmap->GetWidth();
+ int bpp = pBitmap->GetBPP();
+ if (bpp > 8) {
+ width *= bpp / 8;
+ }
+ FX_LPBYTE pBuf = pBitmap->GetBuffer();
+ int line = bFirst ? 0 : height - 1;
+ int line_step = bFirst ? 1 : -1;
+ int line_end = bFirst ? height : -1;
+ while (line != line_end) {
+ if (bpp == 1) {
+ if (_IsScanLine1bpp(pBuf + line * pitch, width)) {
+ return line;
+ }
+ } else {
+ if (_IsScanLine8bpp(pBuf + line * pitch, width)) {
+ return line;
+ }
+ }
+ line += line_step;
+ }
+ return -1;
+}
+CFX_GlyphBitmap* CPDF_Type3Cache::RenderGlyph(CPDF_Type3Glyphs* pSize, FX_DWORD charcode, const CFX_AffineMatrix* pMatrix, FX_FLOAT retinaScaleX, FX_FLOAT retinaScaleY)
+{
+ CPDF_Type3Char* pChar = m_pFont->LoadChar(charcode);
+ if (pChar == NULL || pChar->m_pBitmap == NULL) {
+ return NULL;
+ }
+ CFX_DIBitmap* pBitmap = pChar->m_pBitmap;
+ CFX_AffineMatrix image_matrix, text_matrix;
+ image_matrix = pChar->m_ImageMatrix;
+ text_matrix.Set(pMatrix->a, pMatrix->b, pMatrix->c, pMatrix->d, 0, 0);
+ image_matrix.Concat(text_matrix);
+ CFX_DIBitmap* pResBitmap = NULL;
+ int left, top;
+ if (FXSYS_fabs(image_matrix.b) < FXSYS_fabs(image_matrix.a) / 100 && FXSYS_fabs(image_matrix.c) < FXSYS_fabs(image_matrix.d) / 100) {
+ int top_line, bottom_line;
+ top_line = _DetectFirstLastScan(pBitmap, TRUE);
+ bottom_line = _DetectFirstLastScan(pBitmap, FALSE);
+ if (top_line == 0 && bottom_line == pBitmap->GetHeight() - 1) {
+ FX_FLOAT top_y = image_matrix.d + image_matrix.f;
+ FX_FLOAT bottom_y = image_matrix.f;
+ FX_BOOL bFlipped = top_y > bottom_y;
+ if (bFlipped) {
+ FX_FLOAT temp = top_y;
+ top_y = bottom_y;
+ bottom_y = temp;
+ }
+ pSize->AdjustBlue(top_y, bottom_y, top_line, bottom_line);
+ pResBitmap = pBitmap->StretchTo((int)(FXSYS_round(image_matrix.a) * retinaScaleX), (int)((bFlipped ? top_line - bottom_line : bottom_line - top_line) * retinaScaleY));
+ top = top_line;
+ if (image_matrix.a < 0) {
+ image_matrix.Scale(retinaScaleX, retinaScaleY);
+ left = FXSYS_round(image_matrix.e + image_matrix.a);
+ } else {
+ left = FXSYS_round(image_matrix.e);
+ }
+ } else {
+ }
+ }
+ if (pResBitmap == NULL) {
+ image_matrix.Scale(retinaScaleX, retinaScaleY);
+ pResBitmap = pBitmap->TransformTo(&image_matrix, left, top);
+ }
+ if (pResBitmap == NULL) {
+ return NULL;
+ }
+ CFX_GlyphBitmap* pGlyph = FX_NEW CFX_GlyphBitmap;
+ pGlyph->m_Left = left;
+ pGlyph->m_Top = -top;
+ pGlyph->m_Bitmap.TakeOver(pResBitmap);
+ delete pResBitmap;
+ return pGlyph;
+}
+void _CPDF_UniqueKeyGen::Generate(int count, ...)
+{
+ va_list argList;
+ va_start(argList, count);
+ for (int i = 0; i < count; i ++) {
+ int p = va_arg(argList, int);
+ ((FX_DWORD*)m_Key)[i] = p;
+ }
+ va_end(argList);
+ m_KeyLen = count * sizeof(FX_DWORD);
+}
+FX_BOOL CPDF_RenderStatus::ProcessText(const CPDF_TextObject* textobj, const CFX_AffineMatrix* pObj2Device, CFX_PathData* pClippingPath)
+{
+ if(textobj->m_nChars == 0) {
+ return TRUE;
+ }
+ int text_render_mode = textobj->m_TextState.GetObject()->m_TextMode;
+ if (text_render_mode == 3) {
+ return TRUE;
+ }
+ CPDF_Font* pFont = textobj->m_TextState.GetFont();
+ if (pFont->GetFontType() == PDFFONT_TYPE3) {
+ return ProcessType3Text(textobj, pObj2Device);
+ }
+ FX_BOOL bFill = FALSE, bStroke = FALSE, bClip = FALSE;
+ if (pClippingPath) {
+ bClip = TRUE;
+ } else {
+ switch (text_render_mode) {
+ case 0:
+ case 4:
+ bFill = TRUE;
+ break;
+ case 1:
+ case 5:
+ if (pFont->GetFace() == NULL && !(pFont->GetSubstFont()->m_SubstFlags & FXFONT_SUBST_GLYPHPATH)) {
+ bFill = TRUE;
+ } else {
+ bStroke = TRUE;
+ }
+ break;
+ case 2:
+ case 6:
+ if (pFont->GetFace() == NULL && !(pFont->GetSubstFont()->m_SubstFlags & FXFONT_SUBST_GLYPHPATH)) {
+ bFill = TRUE;
+ } else {
+ bFill = bStroke = TRUE;
+ }
+ break;
+ case 3:
+ case 7:
+ return TRUE;
+ default:
+ bFill = TRUE;
+ }
+ }
+ FX_ARGB stroke_argb = 0, fill_argb = 0;
+ FX_BOOL bPattern = FALSE;
+ if (bStroke) {
+ if (textobj->m_ColorState.GetStrokeColor()->IsPattern()) {
+ bPattern = TRUE;
+ } else {
+ stroke_argb = GetStrokeArgb(textobj);
+ }
+ }
+ if (bFill) {
+ if (textobj->m_ColorState.GetFillColor()->IsPattern()) {
+ bPattern = TRUE;
+ } else {
+ fill_argb = GetFillArgb(textobj);
+ }
+ }
+ CFX_AffineMatrix text_matrix;
+ textobj->GetTextMatrix(&text_matrix);
+ if(IsAvailableMatrix(text_matrix) == FALSE) {
+ return TRUE;
+ }
+ FX_FLOAT font_size = textobj->m_TextState.GetFontSize();
+ if (bPattern) {
+ DrawTextPathWithPattern(textobj, pObj2Device, pFont, font_size, &text_matrix, bFill, bStroke);
+ return TRUE;
+ }
+#if defined(_FPDFAPI_MINI_)
+ if (bFill) {
+ bStroke = FALSE;
+ }
+ if (bStroke) {
+ if (font_size * text_matrix.GetXUnit() * pObj2Device->GetXUnit() < 6) {
+ bStroke = FALSE;
+ }
+ }
+#endif
+ if (bClip || bStroke) {
+ const CFX_AffineMatrix* pDeviceMatrix = pObj2Device;
+ CFX_AffineMatrix device_matrix;
+ if (bStroke) {
+ const FX_FLOAT* pCTM = textobj->m_TextState.GetObject()->m_CTM;
+ if (pCTM[0] != 1.0f || pCTM[3] != 1.0f) {
+ CFX_AffineMatrix ctm(pCTM[0], pCTM[1], pCTM[2], pCTM[3], 0, 0);
+ text_matrix.ConcatInverse(ctm);
+ device_matrix.Copy(ctm);
+ device_matrix.Concat(*pObj2Device);
+ pDeviceMatrix = &device_matrix;
+ }
+ }
+ int flag = 0;
+ if (bStroke && bFill) {
+ flag |= FX_FILL_STROKE;
+ flag |= FX_STROKE_TEXT_MODE;
+ }
+#if !defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_)
+ const CPDF_GeneralStateData* pGeneralData = ((CPDF_PageObject*)textobj)->m_GeneralState;
+ if (pGeneralData && pGeneralData->m_StrokeAdjust) {
+ flag |= FX_STROKE_ADJUST;
+ }
+#endif
+ if (m_Options.m_Flags & RENDER_NOTEXTSMOOTH) {
+ flag |= FXFILL_NOPATHSMOOTH;
+ }
+ return CPDF_TextRenderer::DrawTextPath(m_pDevice, textobj->m_nChars, textobj->m_pCharCodes, textobj->m_pCharPos, pFont, font_size,
+ &text_matrix, pDeviceMatrix, textobj->m_GraphState, fill_argb, stroke_argb, pClippingPath, flag);
+ }
+ text_matrix.Concat(*pObj2Device);
+ return CPDF_TextRenderer::DrawNormalText(m_pDevice, textobj->m_nChars, textobj->m_pCharCodes, textobj->m_pCharPos, pFont, font_size,
+ &text_matrix, fill_argb, &m_Options);
+}
+CPDF_Type3Cache* CPDF_RenderStatus::GetCachedType3(CPDF_Type3Font* pFont)
+{
+ if (pFont->m_pDocument == NULL) {
+ return NULL;
+ }
+ pFont->m_pDocument->GetPageData()->GetFont(pFont->GetFontDict(), FALSE);
+ return pFont->m_pDocument->GetRenderData()->GetCachedType3(pFont);
+}
+static void ReleaseCachedType3(CPDF_Type3Font* pFont)
+{
+ if (pFont->m_pDocument == NULL) {
+ return;
+ }
+ pFont->m_pDocument->GetRenderData()->ReleaseCachedType3(pFont);
+ pFont->m_pDocument->GetPageData()->ReleaseFont(pFont->GetFontDict());
+}
+FX_BOOL CPDF_Type3Char::LoadBitmap(CPDF_RenderContext* pContext)
+{
+ if (m_pBitmap != NULL || m_pForm == NULL) {
+ return TRUE;
+ }
+ if (m_pForm->CountObjects() == 1 && !m_bColored) {
+ CPDF_PageObject *pPageObj = m_pForm->GetObjectAt(m_pForm->GetFirstObjectPosition());
+ if (pPageObj->m_Type == PDFPAGE_IMAGE) {
+ CPDF_ImageObject* pImage = (CPDF_ImageObject*)pPageObj;
+ m_ImageMatrix = pImage->m_Matrix;
+ const CFX_DIBSource* pSource = pImage->m_pImage->LoadDIBSource();
+ if (pSource) {
+ m_pBitmap = pSource->Clone();
+ delete pSource;
+ }
+ delete m_pForm;
+ m_pForm = NULL;
+ return TRUE;
+ }
+ if (pPageObj->m_Type == PDFPAGE_INLINES) {
+ CPDF_InlineImages *pInlines = (CPDF_InlineImages *)pPageObj;
+ if (pInlines->m_pStream) {
+ m_ImageMatrix = pInlines->m_Matrices[0];
+ CPDF_DIBSource dibsrc;
+ if (!dibsrc.Load(pContext->m_pDocument, pInlines->m_pStream, NULL, NULL, NULL, NULL)) {
+ return FALSE;
+ }
+ m_pBitmap = dibsrc.Clone();
+ delete m_pForm;
+ m_pForm = NULL;
+ return TRUE;
+ }
+ }
+ }
+ return FALSE;
+}
+class CPDF_RefType3Cache
+{
+public:
+ CPDF_RefType3Cache(CPDF_Type3Font* pType3Font)
+ {
+ m_dwCount = 0;
+ m_pType3Font = pType3Font;
+ }
+ ~CPDF_RefType3Cache()
+ {
+ while(m_dwCount--) {
+ ReleaseCachedType3(m_pType3Font);
+ }
+ }
+ FX_DWORD m_dwCount;
+ CPDF_Type3Font* m_pType3Font;
+};
+FX_BOOL CPDF_RenderStatus::ProcessType3Text(const CPDF_TextObject* textobj, const CFX_AffineMatrix* pObj2Device)
+{
+ CPDF_Type3Font* pType3Font = textobj->m_TextState.GetFont()->GetType3Font();
+ for (int j = 0; j < m_Type3FontCache.GetSize(); j++)
+ if ((CPDF_Type3Font*)m_Type3FontCache.GetAt(j) == pType3Font) {
+ return TRUE;
+ }
+ CFX_Matrix dCTM = m_pDevice->GetCTM();
+ FX_FLOAT sa = FXSYS_fabs(dCTM.a);
+ FX_FLOAT sd = FXSYS_fabs(dCTM.d);
+ CFX_AffineMatrix text_matrix;
+ textobj->GetTextMatrix(&text_matrix);
+ CFX_AffineMatrix char_matrix = pType3Font->GetFontMatrix();
+ FX_FLOAT font_size = textobj->m_TextState.GetFontSize();
+ char_matrix.Scale(font_size, font_size);
+ FX_ARGB fill_argb = GetFillArgb(textobj, TRUE);
+ int fill_alpha = FXARGB_A(fill_argb);
+ int device_class = m_pDevice->GetDeviceClass();
+ FXTEXT_GLYPHPOS* pGlyphAndPos = NULL;
+ if (device_class == FXDC_DISPLAY) {
+ pGlyphAndPos = FX_Alloc(FXTEXT_GLYPHPOS, textobj->m_nChars);
+ FXSYS_memset32(pGlyphAndPos, 0, sizeof(FXTEXT_GLYPHPOS) * textobj->m_nChars);
+ } else if (fill_alpha < 255) {
+ return FALSE;
+ }
+ CPDF_RefType3Cache refTypeCache(pType3Font);
+ FX_DWORD *pChars = textobj->m_pCharCodes;
+ if (textobj->m_nChars == 1) {
+ pChars = (FX_DWORD*)(&textobj->m_pCharCodes);
+ }
+ for (int iChar = 0; iChar < textobj->m_nChars; iChar ++) {
+ FX_DWORD charcode = pChars[iChar];
+ if (charcode == (FX_DWORD) - 1) {
+ continue;
+ }
+ CPDF_Type3Char* pType3Char = pType3Font->LoadChar(charcode);
+ if (pType3Char == NULL) {
+ continue;
+ }
+ CFX_AffineMatrix matrix = char_matrix;
+ matrix.e += iChar ? textobj->m_pCharPos[iChar - 1] : 0;
+ matrix.Concat(text_matrix);
+ matrix.Concat(*pObj2Device);
+ if (!pType3Char->LoadBitmap(m_pContext)) {
+ if (pGlyphAndPos) {
+ for (int i = 0; i < iChar; i ++) {
+ FXTEXT_GLYPHPOS& glyph = pGlyphAndPos[i];
+ if (glyph.m_pGlyph == NULL) {
+ continue;
+ }
+ m_pDevice->SetBitMask(&glyph.m_pGlyph->m_Bitmap,
+ glyph.m_OriginX + glyph.m_pGlyph->m_Left,
+ glyph.m_OriginY - glyph.m_pGlyph->m_Top, fill_argb);
+ }
+ FX_Free(pGlyphAndPos);
+ pGlyphAndPos = NULL;
+ }
+ CPDF_GraphicStates* pStates = CloneObjStates(textobj, FALSE);
+ CPDF_RenderOptions Options = m_Options;
+ Options.m_Flags |= RENDER_FORCE_HALFTONE | RENDER_RECT_AA;
+ Options.m_Flags &= ~RENDER_FORCE_DOWNSAMPLE;
+ CPDF_Dictionary* pFormResource = NULL;
+ if (pType3Char->m_pForm && pType3Char->m_pForm->m_pFormDict) {
+ pFormResource = pType3Char->m_pForm->m_pFormDict->GetDict(FX_BSTRC("Resources"));
+ }
+ if (fill_alpha == 255) {
+ CPDF_RenderStatus status;
+ status.Initialize(m_Level + 1, m_pContext, m_pDevice, NULL, NULL, this, pStates, &Options,
+ pType3Char->m_pForm->m_Transparency, m_bDropObjects, pFormResource, FALSE, pType3Char, fill_argb);
+ status.m_Type3FontCache.Append(m_Type3FontCache);
+ status.m_Type3FontCache.Add(pType3Font);
+ m_pDevice->SaveState();
+ status.RenderObjectList(pType3Char->m_pForm, &matrix);
+ m_pDevice->RestoreState();
+ } else {
+ CFX_FloatRect rect_f = pType3Char->m_pForm->CalcBoundingBox();
+ rect_f.Transform(&matrix);
+ FX_RECT rect = rect_f.GetOutterRect();
+ CFX_FxgeDevice bitmap_device;
+ if (!bitmap_device.Create((int)(rect.Width() * sa), (int)(rect.Height() * sd), FXDIB_Argb)) {
+ return TRUE;
+ }
+ bitmap_device.GetBitmap()->Clear(0);
+ CPDF_RenderStatus status;
+ status.Initialize(m_Level + 1, m_pContext, &bitmap_device, NULL, NULL, this, pStates, &Options,
+ pType3Char->m_pForm->m_Transparency, m_bDropObjects, pFormResource, FALSE, pType3Char, fill_argb);
+ status.m_Type3FontCache.Append(m_Type3FontCache);
+ status.m_Type3FontCache.Add(pType3Font);
+ matrix.TranslateI(-rect.left, -rect.top);
+ matrix.Scale(sa, sd);
+ status.RenderObjectList(pType3Char->m_pForm, &matrix);
+ m_pDevice->SetDIBits(bitmap_device.GetBitmap(), rect.left, rect.top);
+ }
+ delete pStates;
+ } else if (pType3Char->m_pBitmap) {
+ if (device_class == FXDC_DISPLAY) {
+ CPDF_Type3Cache* pCache = GetCachedType3(pType3Font);
+ refTypeCache.m_dwCount++;
+ CFX_GlyphBitmap* pBitmap = pCache->LoadGlyph(charcode, &matrix, sa, sd);
+ if (pBitmap == NULL) {
+ continue;
+ }
+ int origin_x = FXSYS_round(matrix.e);
+ int origin_y = FXSYS_round(matrix.f);
+ if (pGlyphAndPos) {
+ pGlyphAndPos[iChar].m_pGlyph = pBitmap;
+ pGlyphAndPos[iChar].m_OriginX = origin_x;
+ pGlyphAndPos[iChar].m_OriginY = origin_y;
+ } else {
+ m_pDevice->SetBitMask(&pBitmap->m_Bitmap, origin_x + pBitmap->m_Left, origin_y - pBitmap->m_Top, fill_argb);
+ }
+ } else {
+ CFX_AffineMatrix image_matrix = pType3Char->m_ImageMatrix;
+ image_matrix.Concat(matrix);
+ CPDF_ImageRenderer renderer;
+ if (renderer.Start(this, pType3Char->m_pBitmap, fill_argb, 255, &image_matrix, 0, FALSE)) {
+ renderer.Continue(NULL);
+ }
+ if (!renderer.m_Result) {
+ return FALSE;
+ }
+ }
+ }
+ }
+ if (pGlyphAndPos) {
+ FX_RECT rect = FXGE_GetGlyphsBBox(pGlyphAndPos, textobj->m_nChars, 0, sa, sd);
+ CFX_DIBitmap bitmap;
+ if (!bitmap.Create((int)(rect.Width() * sa), (int)(rect.Height() * sd), FXDIB_8bppMask)) {
+ FX_Free(pGlyphAndPos);
+ return TRUE;
+ }
+ bitmap.Clear(0);
+ for (int iChar = 0; iChar < textobj->m_nChars; iChar ++) {
+ FXTEXT_GLYPHPOS& glyph = pGlyphAndPos[iChar];
+ if (glyph.m_pGlyph == NULL) {
+ continue;
+ }
+ bitmap.TransferBitmap((int)((glyph.m_OriginX + glyph.m_pGlyph->m_Left - rect.left) * sa),
+ (int)((glyph.m_OriginY - glyph.m_pGlyph->m_Top - rect.top) * sd),
+ glyph.m_pGlyph->m_Bitmap.GetWidth(), glyph.m_pGlyph->m_Bitmap.GetHeight(),
+ &glyph.m_pGlyph->m_Bitmap, 0, 0);
+ }
+ m_pDevice->SetBitMask(&bitmap, rect.left, rect.top, fill_argb);
+ FX_Free(pGlyphAndPos);
+ }
+ return TRUE;
+}
+class CPDF_CharPosList
+{
+public:
+ CPDF_CharPosList();
+ ~CPDF_CharPosList();
+ void Load(int nChars, FX_DWORD* pCharCodes, FX_FLOAT* pCharPos, CPDF_Font* pFont, FX_FLOAT font_size);
+ FXTEXT_CHARPOS* m_pCharPos;
+ FX_DWORD m_nChars;
+};
+FX_FLOAT _CIDTransformToFloat(FX_BYTE ch);
+CPDF_CharPosList::CPDF_CharPosList()
+{
+ m_pCharPos = NULL;
+}
+CPDF_CharPosList::~CPDF_CharPosList()
+{
+ if (m_pCharPos) {
+ FX_Free(m_pCharPos);
+ }
+}
+void CPDF_CharPosList::Load(int nChars, FX_DWORD* pCharCodes, FX_FLOAT* pCharPos, CPDF_Font* pFont,
+ FX_FLOAT FontSize)
+{
+ m_pCharPos = FX_Alloc(FXTEXT_CHARPOS, nChars);
+ FXSYS_memset32(m_pCharPos, 0, sizeof(FXTEXT_CHARPOS) * nChars);
+ m_nChars = 0;
+ CPDF_CIDFont* pCIDFont = pFont->GetCIDFont();
+ FX_BOOL bVertWriting = pCIDFont && pCIDFont->IsVertWriting();
+ for (int iChar = 0; iChar < nChars; iChar ++) {
+ FX_DWORD CharCode = nChars == 1 ? (FX_DWORD)(FX_UINTPTR)pCharCodes : pCharCodes[iChar];
+ if (CharCode == (FX_DWORD) - 1) {
+ continue;
+ }
+ FX_BOOL bVert = FALSE;
+ FXTEXT_CHARPOS& charpos = m_pCharPos[m_nChars++];
+ if (pCIDFont) {
+ charpos.m_bFontStyle = pCIDFont->IsFontStyleFromCharCode(CharCode);
+ }
+ charpos.m_GlyphIndex = pFont->GlyphFromCharCode(CharCode, &bVert);
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+ charpos.m_ExtGID = pFont->GlyphFromCharCodeExt(CharCode);
+#endif
+ if (!pFont->IsEmbedded() && pFont->GetFontType() != PDFFONT_CIDFONT) {
+ charpos.m_FontCharWidth = pFont->GetCharWidthF(CharCode);
+ } else {
+ charpos.m_FontCharWidth = 0;
+ }
+ charpos.m_OriginX = iChar ? pCharPos[iChar - 1] : 0;
+ charpos.m_OriginY = 0;
+ charpos.m_bGlyphAdjust = FALSE;
+ if (pCIDFont == NULL) {
+ continue;
+ }
+ FX_WORD CID = pCIDFont->CIDFromCharCode(CharCode);
+ if (bVertWriting) {
+ charpos.m_OriginY = charpos.m_OriginX;
+ charpos.m_OriginX = 0;
+ short vx, vy;
+ pCIDFont->GetVertOrigin(CID, vx, vy);
+ charpos.m_OriginX -= FontSize * vx / 1000;
+ charpos.m_OriginY -= FontSize * vy / 1000;
+ }
+ FX_LPCBYTE pTransform = pCIDFont->GetCIDTransform(CID);
+ if (pTransform && !bVert) {
+ charpos.m_AdjustMatrix[0] = _CIDTransformToFloat(pTransform[0]);
+ charpos.m_AdjustMatrix[2] = _CIDTransformToFloat(pTransform[2]);
+ charpos.m_AdjustMatrix[1] = _CIDTransformToFloat(pTransform[1]);
+ charpos.m_AdjustMatrix[3] = _CIDTransformToFloat(pTransform[3]);
+ charpos.m_OriginX += _CIDTransformToFloat(pTransform[4]) * FontSize;
+ charpos.m_OriginY += _CIDTransformToFloat(pTransform[5]) * FontSize;
+ charpos.m_bGlyphAdjust = TRUE;
+ }
+ }
+}
+FX_BOOL CPDF_TextRenderer::DrawTextPath(CFX_RenderDevice* pDevice, int nChars, FX_DWORD* pCharCodes, FX_FLOAT* pCharPos,
+ CPDF_Font* pFont, FX_FLOAT font_size,
+ const CFX_AffineMatrix* pText2User, const CFX_AffineMatrix* pUser2Device,
+ const CFX_GraphStateData* pGraphState,
+ FX_ARGB fill_argb, FX_ARGB stroke_argb, CFX_PathData* pClippingPath, int nFlag)
+{
+ CFX_FontCache* pCache = pFont->m_pDocument ? pFont->m_pDocument->GetRenderData()->GetFontCache() : NULL;
+ CPDF_CharPosList CharPosList;
+ CharPosList.Load(nChars, pCharCodes, pCharPos, pFont, font_size);
+ return pDevice->DrawTextPath(CharPosList.m_nChars, CharPosList.m_pCharPos,
+ &pFont->m_Font, pCache, font_size, pText2User, pUser2Device,
+ pGraphState, fill_argb, stroke_argb, pClippingPath, nFlag);
+}
+void CPDF_TextRenderer::DrawTextString(CFX_RenderDevice* pDevice, int left, int top, CPDF_Font* pFont, int height,
+ const CFX_ByteString& str, FX_ARGB argb)
+{
+ FX_RECT font_bbox;
+ pFont->GetFontBBox(font_bbox);
+ FX_FLOAT font_size = (FX_FLOAT)height * 1000.0f / (FX_FLOAT)(font_bbox.top - font_bbox.bottom);
+ FX_FLOAT origin_x = (FX_FLOAT)left;
+ FX_FLOAT origin_y = (FX_FLOAT)top + font_size * (FX_FLOAT)font_bbox.top / 1000.0f;
+ CFX_AffineMatrix matrix(1.0f, 0, 0, -1.0f, 0, 0);
+ DrawTextString(pDevice, origin_x, origin_y, pFont, font_size, &matrix, str, argb);
+}
+void CPDF_TextRenderer::DrawTextString(CFX_RenderDevice* pDevice, FX_FLOAT origin_x, FX_FLOAT origin_y, CPDF_Font* pFont, FX_FLOAT font_size,
+ const CFX_AffineMatrix* pMatrix, const CFX_ByteString& str, FX_ARGB fill_argb,
+ FX_ARGB stroke_argb, const CFX_GraphStateData* pGraphState, const CPDF_RenderOptions* pOptions)
+{
+ int nChars = pFont->CountChar(str, str.GetLength());
+ if (nChars == 0) {
+ return;
+ }
+ FX_DWORD charcode;
+ int offset = 0;
+ FX_DWORD* pCharCodes;
+ FX_FLOAT* pCharPos;
+ if (nChars == 1) {
+ charcode = pFont->GetNextChar(str, offset);
+ pCharCodes = (FX_DWORD*)(FX_UINTPTR)charcode;
+ pCharPos = NULL;
+ } else {
+ pCharCodes = FX_Alloc(FX_DWORD, nChars);
+ pCharPos = FX_Alloc(FX_FLOAT, nChars - 1);
+ FX_FLOAT cur_pos = 0;
+ for (int i = 0; i < nChars; i ++) {
+ pCharCodes[i] = pFont->GetNextChar(str, offset);
+ if (i) {
+ pCharPos[i - 1] = cur_pos;
+ }
+ cur_pos += pFont->GetCharWidthF(pCharCodes[i]) * font_size / 1000;
+ }
+ }
+ CFX_AffineMatrix matrix;
+ if (pMatrix) {
+ matrix = *pMatrix;
+ }
+ matrix.e = origin_x;
+ matrix.f = origin_y;
+ if (pFont->GetFontType() == PDFFONT_TYPE3)
+ ;
+ else if (stroke_argb == 0) {
+ DrawNormalText(pDevice, nChars, pCharCodes, pCharPos, pFont, font_size, &matrix, fill_argb, pOptions);
+ } else
+ DrawTextPath(pDevice, nChars, pCharCodes, pCharPos, pFont, font_size, &matrix, NULL, pGraphState,
+ fill_argb, stroke_argb, NULL);
+ if (nChars > 1) {
+ FX_Free(pCharCodes);
+ FX_Free(pCharPos);
+ }
+}
+FX_BOOL CPDF_TextRenderer::DrawNormalText(CFX_RenderDevice* pDevice, int nChars, FX_DWORD* pCharCodes, FX_FLOAT* pCharPos,
+ CPDF_Font* pFont, FX_FLOAT font_size,
+ const CFX_AffineMatrix* pText2Device,
+ FX_ARGB fill_argb, const CPDF_RenderOptions* pOptions)
+{
+ CFX_FontCache* pCache = pFont->m_pDocument ? pFont->m_pDocument->GetRenderData()->GetFontCache() : NULL;
+ CPDF_CharPosList CharPosList;
+ CharPosList.Load(nChars, pCharCodes, pCharPos, pFont, font_size);
+ int FXGE_flags = 0;
+ if (pOptions) {
+ FX_DWORD dwFlags = pOptions->m_Flags;
+ if (dwFlags & RENDER_CLEARTYPE) {
+ FXGE_flags |= FXTEXT_CLEARTYPE;
+ if (dwFlags & RENDER_BGR_STRIPE) {
+ FXGE_flags |= FXTEXT_BGR_STRIPE;
+ }
+ }
+ if (dwFlags & RENDER_NOTEXTSMOOTH) {
+ FXGE_flags |= FXTEXT_NOSMOOTH;
+ }
+ if (dwFlags & RENDER_PRINTGRAPHICTEXT) {
+ FXGE_flags |= FXTEXT_PRINTGRAPHICTEXT;
+ }
+ if (dwFlags & RENDER_NO_NATIVETEXT) {
+ FXGE_flags |= FXTEXT_NO_NATIVETEXT;
+ }
+ if (dwFlags & RENDER_PRINTIMAGETEXT) {
+ FXGE_flags |= FXTEXT_PRINTIMAGETEXT;
+ }
+ } else {
+ FXGE_flags = FXTEXT_CLEARTYPE;
+ }
+ if (pFont->GetFontType() & PDFFONT_CIDFONT) {
+ FXGE_flags |= FXFONT_CIDFONT;
+ }
+ return pDevice->DrawNormalText(CharPosList.m_nChars, CharPosList.m_pCharPos, &pFont->m_Font, pCache, font_size, pText2Device, fill_argb, FXGE_flags);
+}
+void CPDF_RenderStatus::DrawTextPathWithPattern(const CPDF_TextObject* textobj, const CFX_AffineMatrix* pObj2Device,
+ CPDF_Font* pFont, FX_FLOAT font_size,
+ const CFX_AffineMatrix* pTextMatrix, FX_BOOL bFill, FX_BOOL bStroke)
+{
+ if (!bStroke) {
+ CPDF_PathObject path;
+ CPDF_TextObject* pCopy = FX_NEW CPDF_TextObject;
+ pCopy->Copy(textobj);
+ path.m_bStroke = FALSE;
+ path.m_FillType = FXFILL_WINDING;
+ path.m_ClipPath.AppendTexts(&pCopy, 1);
+ path.m_ColorState = textobj->m_ColorState;
+ path.m_Path.New()->AppendRect(textobj->m_Left, textobj->m_Bottom, textobj->m_Right, textobj->m_Top);
+ path.m_Left = textobj->m_Left;
+ path.m_Bottom = textobj->m_Bottom;
+ path.m_Right = textobj->m_Right;
+ path.m_Top = textobj->m_Top;
+ RenderSingleObject(&path, pObj2Device);
+ return;
+ }
+ CFX_FontCache* pCache;
+ if (pFont->m_pDocument) {
+ pCache = pFont->m_pDocument->GetRenderData()->GetFontCache();
+ } else {
+ pCache = CFX_GEModule::Get()->GetFontCache();
+ }
+ CFX_FaceCache* pFaceCache = pCache->GetCachedFace(&pFont->m_Font);
+ FX_FONTCACHE_DEFINE(pCache, &pFont->m_Font);
+ CPDF_CharPosList CharPosList;
+ CharPosList.Load(textobj->m_nChars, textobj->m_pCharCodes, textobj->m_pCharPos, pFont, font_size);
+ for (FX_DWORD i = 0; i < CharPosList.m_nChars; i ++) {
+ FXTEXT_CHARPOS& charpos = CharPosList.m_pCharPos[i];
+ const CFX_PathData* pPath = pFaceCache->LoadGlyphPath(&pFont->m_Font, charpos.m_GlyphIndex,
+ charpos.m_FontCharWidth);
+ if (pPath == NULL) {
+ continue;
+ }
+ CPDF_PathObject path;
+ path.m_GraphState = textobj->m_GraphState;
+ path.m_ColorState = textobj->m_ColorState;
+ CFX_AffineMatrix matrix;
+ if (charpos.m_bGlyphAdjust)
+ matrix.Set(charpos.m_AdjustMatrix[0], charpos.m_AdjustMatrix[1],
+ charpos.m_AdjustMatrix[2], charpos.m_AdjustMatrix[3], 0, 0);
+ matrix.Concat(font_size, 0, 0, font_size, charpos.m_OriginX, charpos.m_OriginY);
+ path.m_Path.New()->Append(pPath, &matrix);
+ path.m_Matrix = *pTextMatrix;
+ path.m_bStroke = bStroke;
+ path.m_FillType = bFill ? FXFILL_WINDING : 0;
+ path.CalcBoundingBox();
+ ProcessPath(&path, pObj2Device);
+ }
+}
+CFX_PathData* CPDF_Font::LoadGlyphPath(FX_DWORD charcode, int dest_width)
+{
+ int glyph_index = GlyphFromCharCode(charcode);
+ if (m_Font.m_Face == NULL) {
+ return NULL;
+ }
+ return m_Font.LoadGlyphPath(glyph_index, dest_width);
+}
diff --git a/core/src/fpdfapi/fpdf_render/render_int.h b/core/src/fpdfapi/fpdf_render/render_int.h
index 3acde0ec43..9bde4be877 100644
--- a/core/src/fpdfapi/fpdf_render/render_int.h
+++ b/core/src/fpdfapi/fpdf_render/render_int.h
@@ -1,462 +1,462 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef _FPDF_PAGEOBJ_H_
-#include "../../../include/fpdfapi/fpdf_pageobj.h"
-#endif
-class CPDF_QuickStretcher;
-#define TYPE3_MAX_BLUES 16
-class CPDF_Type3Glyphs : public CFX_Object
-{
-public:
- CPDF_Type3Glyphs()
- {
- m_GlyphMap.InitHashTable(253);
- m_TopBlueCount = m_BottomBlueCount = 0;
- }
- ~CPDF_Type3Glyphs();
- CFX_MapPtrToPtr m_GlyphMap;
- void AdjustBlue(FX_FLOAT top, FX_FLOAT bottom, int& top_line, int& bottom_line);
-
- int m_TopBlue[TYPE3_MAX_BLUES], m_BottomBlue[TYPE3_MAX_BLUES];
- int m_TopBlueCount, m_BottomBlueCount;
-};
-class CFX_GlyphBitmap;
-class CPDF_Type3Cache : public CFX_Object
-{
-public:
- CPDF_Type3Cache(CPDF_Type3Font* pFont)
- {
- m_pFont = pFont;
- }
- ~CPDF_Type3Cache();
- CFX_GlyphBitmap* LoadGlyph(FX_DWORD charcode, const CFX_AffineMatrix* pMatrix, FX_FLOAT retinaScaleX = 1.0f, FX_FLOAT retinaScaleY = 1.0f);
-protected:
- CFX_GlyphBitmap* RenderGlyph(CPDF_Type3Glyphs* pSize, FX_DWORD charcode, const CFX_AffineMatrix* pMatrix, FX_FLOAT retinaScaleX = 1.0f, FX_FLOAT retinaScaleY = 1.0f);
- CPDF_Type3Font* m_pFont;
- CFX_MapByteStringToPtr m_SizeMap;
-};
-class CPDF_TransferFunc : public CFX_Object
-{
-public:
- CPDF_Document* m_pPDFDoc;
- FX_BYTE m_Samples[256 * 3];
- FX_BOOL m_bIdentity;
-
- CFX_DIBSource* TranslateImage(const CFX_DIBSource* pSrc, FX_BOOL bAutoDropSrc);
- FX_COLORREF TranslateColor(FX_COLORREF src);
-};
-typedef CFX_MapPtrTemplate<CPDF_Font*, CPDF_CountedObject<CPDF_Type3Cache*>*> CPDF_Type3CacheMap;
-typedef CFX_MapPtrTemplate<CPDF_Object*, CPDF_CountedObject<CPDF_TransferFunc*>*> CPDF_TransferFuncMap;
-class CPDF_DocRenderData : public CFX_Object
-{
-public:
- CPDF_DocRenderData(CPDF_Document* pPDFDoc = NULL);
- ~CPDF_DocRenderData();
- FX_BOOL Initialize();
- CPDF_Type3Cache* GetCachedType3(CPDF_Type3Font* pFont);
- CPDF_TransferFunc* GetTransferFunc(CPDF_Object* pObj);
- CFX_FontCache* GetFontCache()
- {
- return m_pFontCache;
- }
- void Clear(FX_BOOL bRelease = FALSE);
- void ReleaseCachedType3(CPDF_Type3Font* pFont);
- void ReleaseTransferFunc(CPDF_Object* pObj);
-private:
- CPDF_Document* m_pPDFDoc;
- CFX_FontCache* m_pFontCache;
- CPDF_Type3CacheMap m_Type3FaceMap;
- CPDF_TransferFuncMap m_TransferFuncMap;
-};
-struct _PDF_RenderItem {
-public:
- CPDF_PageObjects* m_pObjectList;
- CFX_AffineMatrix m_Matrix;
-};
-typedef CFX_ArrayTemplate<_PDF_RenderItem> CPDF_RenderLayer;
-class IPDF_ObjectRenderer : public CFX_Object
-{
-public:
- static IPDF_ObjectRenderer* Create(int type);
- virtual ~IPDF_ObjectRenderer() {}
- virtual FX_BOOL Start(CPDF_RenderStatus* pRenderStatus, const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device, FX_BOOL bStdCS, int blendType = FXDIB_BLEND_NORMAL) = 0;
- virtual FX_BOOL Continue(IFX_Pause* pPause) = 0;
- FX_BOOL m_Result;
-};
-class CPDF_RenderStatus : public CFX_Object
-{
-public:
- CPDF_RenderStatus();
- ~CPDF_RenderStatus();
- FX_BOOL Initialize(int level, class CPDF_RenderContext* pContext, CFX_RenderDevice* pDevice, const CFX_AffineMatrix* pDeviceMatrix,
- const CPDF_PageObject* pStopObj, const CPDF_RenderStatus* pParentStatus,
- const CPDF_GraphicStates* pInitialStates, const CPDF_RenderOptions* pOptions,
- int transparency, FX_BOOL bDropObjects, CPDF_Dictionary* pFormResource = NULL,
- FX_BOOL bStdCS = FALSE, CPDF_Type3Char* pType3Char = NULL, FX_ARGB fill_color = 0,
- FX_DWORD GroupFamily = 0, FX_BOOL bLoadMask = FALSE);
- void RenderObjectList(const CPDF_PageObjects* pObjs, const CFX_AffineMatrix* pObj2Device);
- void RenderSingleObject(const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device);
- FX_BOOL ContinueSingleObject(const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device, IFX_Pause* pPause);
- CPDF_RenderOptions m_Options;
- CPDF_Dictionary* m_pFormResource;
- CPDF_Dictionary* m_pPageResource;
- CFX_PtrArray m_Type3FontCache;
- CPDF_RenderContext* GetContext()
- {
- return m_pContext;
- }
-protected:
- friend class CPDF_ImageRenderer;
- friend class CPDF_RenderContext;
- void ProcessClipPath(CPDF_ClipPath ClipPath, const CFX_AffineMatrix* pObj2Device);
- void DrawClipPath(CPDF_ClipPath ClipPath, const CFX_AffineMatrix* pObj2Device);
- FX_BOOL ProcessTransparency(const CPDF_PageObject* PageObj, const CFX_AffineMatrix* pObj2Device);
- void ProcessObjectNoClip(const CPDF_PageObject* PageObj, const CFX_AffineMatrix* pObj2Device);
- void DrawObjWithBackground(const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device);
- FX_BOOL DrawObjWithBlend(const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device);
- FX_BOOL ProcessPath(CPDF_PathObject* pPathObj, const CFX_AffineMatrix* pObj2Device);
- void ProcessPathPattern(CPDF_PathObject* pPathObj, const CFX_AffineMatrix* pObj2Device, int& filltype, FX_BOOL& bStroke);
- void DrawPathWithPattern(CPDF_PathObject* pPathObj, const CFX_AffineMatrix* pObj2Device, CPDF_Color* pColor, FX_BOOL bStroke);
- void DrawTilingPattern(CPDF_TilingPattern* pPattern, CPDF_PageObject* pPageObj, const CFX_AffineMatrix* pObj2Device, FX_BOOL bStroke);
- void DrawShadingPattern(CPDF_ShadingPattern* pPattern, CPDF_PageObject* pPageObj, const CFX_AffineMatrix* pObj2Device, FX_BOOL bStroke);
- FX_BOOL SelectClipPath(CPDF_PathObject* pPathObj, const CFX_AffineMatrix* pObj2Device, FX_BOOL bStroke);
- FX_BOOL ProcessImage(CPDF_ImageObject* pImageObj, const CFX_AffineMatrix* pObj2Device);
- FX_BOOL OutputBitmapAlpha(CPDF_ImageObject* pImageObj, const CFX_AffineMatrix* pImage2Device);
- FX_BOOL OutputImage(CPDF_ImageObject* pImageObj, const CFX_AffineMatrix* pImage2Device);
- FX_BOOL OutputDIBSource(const CFX_DIBSource* pOutputBitmap, FX_ARGB fill_argb, int bitmap_alpha,
- const CFX_AffineMatrix* pImage2Device, CPDF_ImageCache* pImageCache, FX_DWORD flags);
- void CompositeDIBitmap(CFX_DIBitmap* pDIBitmap, int left, int top, FX_ARGB mask_argb,
- int bitmap_alpha, int blend_mode, int bIsolated);
- FX_BOOL ProcessInlines(CPDF_InlineImages* pInlines, const CFX_AffineMatrix* pObj2Device);
- FX_BOOL ProcessShading(CPDF_ShadingObject* pShadingObj, const CFX_AffineMatrix* pObj2Device);
- void DrawShading(CPDF_ShadingPattern* pPattern, CFX_AffineMatrix* pMatrix, FX_RECT& clip_rect,
- int alpha, FX_BOOL bAlphaMode);
- FX_BOOL ProcessType3Text(const CPDF_TextObject* textobj, const CFX_AffineMatrix* pObj2Device);
- FX_BOOL ProcessText(const CPDF_TextObject* textobj, const CFX_AffineMatrix* pObj2Device, CFX_PathData* pClippingPath);
- void DrawTextPathWithPattern(const CPDF_TextObject* textobj, const CFX_AffineMatrix* pObj2Device,
- CPDF_Font* pFont, FX_FLOAT font_size,
- const CFX_AffineMatrix* pTextMatrix, FX_BOOL bFill, FX_BOOL bStroke);
- FX_BOOL ProcessForm(CPDF_FormObject* pFormObj, const CFX_AffineMatrix* pObj2Device);
- CFX_DIBitmap* GetBackdrop(const CPDF_PageObject* pObj, const FX_RECT& rect, int& left, int& top,
- FX_BOOL bBackAlphaRequired);
- CFX_DIBitmap* LoadSMask(CPDF_Dictionary* pSMaskDict, FX_RECT* pClipRect, const CFX_AffineMatrix* pMatrix);
- void Init(CPDF_RenderContext* pParent);
- static class CPDF_Type3Cache* GetCachedType3(CPDF_Type3Font* pFont);
- static CPDF_GraphicStates* CloneObjStates(const CPDF_GraphicStates* pPathObj, FX_BOOL bStroke);
- CPDF_TransferFunc* GetTransferFunc(CPDF_Object* pObject) const;
- FX_ARGB GetFillArgb(const CPDF_PageObject* pObj, FX_BOOL bType3 = FALSE) const;
- FX_ARGB GetStrokeArgb(const CPDF_PageObject* pObj) const;
- CPDF_RenderContext* m_pContext;
- FX_BOOL m_bStopped;
- void DitherObjectArea(const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device);
- FX_BOOL GetObjectClippedRect(const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device, FX_BOOL bLogical, FX_RECT &rect) const;
- void GetScaledMatrix(CFX_Matrix &matrix) const;
-protected:
- int m_Level;
- CFX_RenderDevice* m_pDevice;
- CFX_AffineMatrix m_DeviceMatrix;
- CPDF_ClipPath m_LastClipPath;
- const CPDF_PageObject* m_pCurObj;
- const CPDF_PageObject* m_pStopObj;
- CPDF_GraphicStates m_InitialStates;
- int m_HalftoneLimit;
- IPDF_ObjectRenderer* m_pObjectRenderer;
- FX_BOOL m_bPrint;
- int m_Transparency;
- int m_DitherBits;
- FX_BOOL m_bDropObjects;
- FX_BOOL m_bStdCS;
- FX_DWORD m_GroupFamily;
- FX_BOOL m_bLoadMask;
- CPDF_Type3Char * m_pType3Char;
- FX_ARGB m_T3FillColor;
- int m_curBlend;
-};
-class CPDF_ImageLoader : public CFX_Object
-{
-public:
- CPDF_ImageLoader()
- {
- m_pBitmap = NULL;
- m_pMask = NULL;
- m_MatteColor = 0;
- m_bCached = FALSE;
- m_nDownsampleWidth = 0;
- m_nDownsampleHeight = 0;
- }
-
- FX_BOOL Load(const CPDF_ImageObject* pImage, CPDF_PageRenderCache* pCache, FX_BOOL bStdCS = FALSE, FX_DWORD GroupFamily = 0, FX_BOOL bLoadMask = FALSE, CPDF_RenderStatus* pRenderStatus = NULL);
-
- FX_BOOL StartLoadImage(const CPDF_ImageObject* pImage, CPDF_PageRenderCache* pCache, FX_LPVOID& LoadHandle, FX_BOOL bStdCS = FALSE, FX_DWORD GroupFamily = 0, FX_BOOL bLoadMask = FALSE, CPDF_RenderStatus* pRenderStatus = NULL, FX_INT32 nDownsampleWidth = 0, FX_INT32 nDownsampleHeight = 0);
- FX_BOOL Continue(FX_LPVOID LoadHandle, IFX_Pause* pPause);
- ~CPDF_ImageLoader();
- CFX_DIBSource* m_pBitmap;
- CFX_DIBSource* m_pMask;
- FX_DWORD m_MatteColor;
- FX_BOOL m_bCached;
-protected:
- FX_INT32 m_nDownsampleWidth;
- FX_INT32 m_nDownsampleHeight;
-};
-class CPDF_ProgressiveImageLoaderHandle : public CFX_Object
-{
-public:
- CPDF_ProgressiveImageLoaderHandle();
- ~CPDF_ProgressiveImageLoaderHandle();
-
- FX_BOOL Start(CPDF_ImageLoader* pImageLoader, const CPDF_ImageObject* pImage, CPDF_PageRenderCache* pCache, FX_BOOL bStdCS = FALSE, FX_DWORD GroupFamily = 0, FX_BOOL bLoadMask = FALSE, CPDF_RenderStatus* pRenderStatus = NULL, FX_INT32 nDownsampleWidth = 0, FX_INT32 nDownsampleHeight = 0);
- FX_BOOL Continue(IFX_Pause* pPause);
-protected:
- CPDF_ImageLoader* m_pImageLoader;
- CPDF_PageRenderCache* m_pCache;
- CPDF_ImageObject* m_pImage;
- FX_INT32 m_nDownsampleWidth;
- FX_INT32 m_nDownsampleHeight;
-};
-class CFX_ImageTransformer;
-class CPDF_ImageRenderer : public IPDF_ObjectRenderer
-{
-public:
- CPDF_ImageRenderer();
- ~CPDF_ImageRenderer();
- FX_BOOL Start(CPDF_RenderStatus* pStatus, const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device, FX_BOOL bStdCS, int blendType = FXDIB_BLEND_NORMAL);
- FX_BOOL Start(CPDF_RenderStatus* pStatus, const CFX_DIBSource* pDIBSource, FX_ARGB bitmap_argb,
- int bitmap_alpha, const CFX_AffineMatrix* pImage2Device, FX_DWORD flags, FX_BOOL bStdCS, int blendType = FXDIB_BLEND_NORMAL);
- FX_BOOL Continue(IFX_Pause* pPause);
-protected:
- CPDF_RenderStatus* m_pRenderStatus;
- CPDF_ImageObject* m_pImageObject;
- int m_Status;
- const CFX_AffineMatrix* m_pObj2Device;
- CFX_AffineMatrix m_ImageMatrix;
- CPDF_ImageLoader m_Loader;
- const CFX_DIBSource* m_pDIBSource;
- CFX_DIBitmap* m_pClone;
- int m_BitmapAlpha;
- FX_BOOL m_bPatternColor;
- CPDF_Pattern* m_pPattern;
- FX_ARGB m_FillArgb;
- FX_DWORD m_Flags;
- CPDF_QuickStretcher* m_pQuickStretcher;
- CFX_ImageTransformer* m_pTransformer;
- CPDF_ImageRenderer* m_pRenderer2;
- FX_LPVOID m_DeviceHandle;
- FX_LPVOID m_LoadHandle;
- FX_BOOL m_bStdCS;
- int m_BlendType;
- FX_BOOL StartBitmapAlpha();
- FX_BOOL StartDIBSource();
- FX_BOOL StartRenderDIBSource();
- FX_BOOL StartLoadDIBSource();
- FX_BOOL DrawMaskedImage();
- FX_BOOL DrawPatternImage(const CFX_Matrix* pObj2Device);
-};
-class CPDF_ScaledRenderBuffer : public CFX_Object
-{
-public:
- CPDF_ScaledRenderBuffer();
- ~CPDF_ScaledRenderBuffer();
- FX_BOOL Initialize(CPDF_RenderContext* pContext, CFX_RenderDevice* pDevice, FX_RECT* pRect,
- const CPDF_PageObject* pObj, const CPDF_RenderOptions *pOptions = NULL, int max_dpi = 0);
- CFX_RenderDevice* GetDevice()
- {
- return m_pBitmapDevice ? m_pBitmapDevice : m_pDevice;
- }
- CFX_AffineMatrix* GetMatrix()
- {
- return &m_Matrix;
- }
- void OutputToDevice();
-private:
- CFX_RenderDevice* m_pDevice;
- CPDF_RenderContext* m_pContext;
- FX_RECT m_Rect;
- const CPDF_PageObject* m_pObject;
- CFX_FxgeDevice* m_pBitmapDevice;
- CFX_AffineMatrix m_Matrix;
-};
-class ICodec_ScanlineDecoder;
-class CPDF_QuickStretcher : public CFX_Object
-{
-public:
- CPDF_QuickStretcher();
- ~CPDF_QuickStretcher();
- FX_BOOL Start(CPDF_ImageObject* pImageObj, CFX_AffineMatrix* pImage2Device, const FX_RECT* pClipBox);
- FX_BOOL Continue(IFX_Pause* pPause);
- CFX_DIBitmap* m_pBitmap;
- int m_ResultLeft, m_ResultTop, m_ClipLeft, m_ClipTop;
- int m_DestWidth, m_DestHeight, m_ResultWidth, m_ResultHeight;
- int m_Bpp, m_SrcWidth, m_SrcHeight;
- FX_BOOL m_bFlipX, m_bFlipY;
- CPDF_ColorSpace* m_pCS;
- ICodec_ScanlineDecoder* m_pDecoder;
- CPDF_StreamAcc m_StreamAcc;
- int m_LineIndex;
-};
-class CPDF_DeviceBuffer : public CFX_Object
-{
-public:
- CPDF_DeviceBuffer();
- ~CPDF_DeviceBuffer();
- FX_BOOL Initialize(CPDF_RenderContext* pContext, CFX_RenderDevice* pDevice, FX_RECT* pRect,
- const CPDF_PageObject* pObj, int max_dpi = 0);
- void OutputToDevice();
- CFX_DIBitmap* GetBitmap() const
- {
- return m_pBitmap;
- }
- const CFX_AffineMatrix* GetMatrix() const
- {
- return &m_Matrix;
- }
-private:
- CFX_RenderDevice* m_pDevice;
- CPDF_RenderContext* m_pContext;
- FX_RECT m_Rect;
- const CPDF_PageObject* m_pObject;
- CFX_DIBitmap* m_pBitmap;
- CFX_AffineMatrix m_Matrix;
-};
-class CPDF_ImageCache : public CFX_Object
-{
-public:
- CPDF_ImageCache(CPDF_Document* pDoc, CPDF_Stream* pStream);
- ~CPDF_ImageCache();
- void ClearImageData();
- void Reset(const CFX_DIBitmap* pBitmap);
- FX_BOOL GetCachedBitmap(CFX_DIBSource*& pBitmap, CFX_DIBSource*& pMask, FX_DWORD& MatteColor, CPDF_Dictionary* pPageResources,
- FX_BOOL bStdCS = FALSE, FX_DWORD GroupFamily = 0, FX_BOOL bLoadMask = FALSE,
- CPDF_RenderStatus* pRenderStatus = NULL, FX_INT32 downsampleWidth = 0, FX_INT32 downsampleHeight = 0);
- FX_DWORD EstimateSize() const
- {
- return m_dwCacheSize;
- }
- FX_DWORD GetTimeCount() const
- {
- return m_dwTimeCount;
- }
- CPDF_Stream* GetStream() const
- {
- return m_pStream;
- }
- void SetTimeCount(FX_DWORD dwTimeCount)
- {
- m_dwTimeCount = dwTimeCount;
- }
- int m_dwTimeCount;
-public:
- int StartGetCachedBitmap(CPDF_Dictionary* pFormResources, CPDF_Dictionary* pPageResources,
- FX_BOOL bStdCS = FALSE, FX_DWORD GroupFamily = 0,
- FX_BOOL bLoadMask = FALSE, CPDF_RenderStatus* pRenderStatus = NULL, FX_INT32 downsampleWidth = 0, FX_INT32 downsampleHeight = 0);
- int Continue(IFX_Pause* pPause);
- int ContinueGetCachedBitmap();
- CFX_DIBSource* DetachBitmap();
- CFX_DIBSource* DetachMask();
- CFX_DIBSource* m_pCurBitmap;
- CFX_DIBSource* m_pCurMask;
- FX_DWORD m_MatteColor;
- CPDF_RenderStatus* m_pRenderStatus;
-protected:
- CPDF_Document* m_pDocument;
- CPDF_Stream* m_pStream;
- CFX_DIBSource* m_pCachedBitmap;
- CFX_DIBSource* m_pCachedMask;
- FX_DWORD m_dwCacheSize;
- void CalcSize();
-};
-typedef struct {
- FX_FLOAT m_DecodeMin;
- FX_FLOAT m_DecodeStep;
- int m_ColorKeyMin;
- int m_ColorKeyMax;
-} DIB_COMP_DATA;
-class CPDF_DIBSource : public CFX_DIBSource
-{
-public:
- CPDF_DIBSource();
- virtual ~CPDF_DIBSource();
- FX_BOOL Load(CPDF_Document* pDoc, const CPDF_Stream* pStream,
- CPDF_DIBSource** ppMask, FX_DWORD* pMatteColor,
- CPDF_Dictionary* pFormResources, CPDF_Dictionary* pPageResources,
- FX_BOOL bStdCS = FALSE, FX_DWORD GroupFamily = 0, FX_BOOL bLoadMask = FALSE);
- virtual FX_BOOL SkipToScanline(int line, IFX_Pause* pPause) const;
- virtual FX_LPBYTE GetBuffer() const;
- virtual FX_LPCBYTE GetScanline(int line) const;
- virtual void DownSampleScanline(int line, FX_LPBYTE dest_scan, int dest_bpp,
- int dest_width, FX_BOOL bFlipX, int clip_left, int clip_width) const;
- virtual void SetDownSampleSize(int dest_width, int dest_height) const;
- CFX_DIBitmap* GetBitmap() const;
- void ReleaseBitmap(CFX_DIBitmap*) const;
- void ClearImageData();
-public:
- int StartLoadDIBSource(CPDF_Document* pDoc, const CPDF_Stream* pStream, FX_BOOL bHasMask,
- CPDF_Dictionary* pFormResources, CPDF_Dictionary* pPageResources,
- FX_BOOL bStdCS = FALSE, FX_DWORD GroupFamily = 0, FX_BOOL bLoadMask = FALSE);
- int ContinueLoadDIBSource(IFX_Pause* pPause);
- int StratLoadMask();
- int StartLoadMaskDIB();
- int ContinueLoadMaskDIB(IFX_Pause* pPause);
- int ContinueToLoadMask();
- CPDF_DIBSource* DetachMask();
- CPDF_DIBSource* m_pMask;
- FX_DWORD m_MatteColor;
- FX_LPVOID m_pJbig2Context;
- CPDF_StreamAcc* m_pGlobalStream;
- FX_BOOL m_bStdCS;
- int m_Status;
- CPDF_Object* m_pMaskStream;
- FX_BOOL m_bHasMask;
-protected:
- FX_BOOL LoadColorInfo(CPDF_Dictionary* pFormResources, CPDF_Dictionary* pPageResources);
- CPDF_DIBSource* LoadMask(FX_DWORD& MatteColor);
- CPDF_DIBSource* LoadMaskDIB(CPDF_Stream* pMask);
- void LoadJpxBitmap();
- void LoadJbig2Bitmap();
- void LoadPalette();
- FX_BOOL CreateDecoder();
- void TranslateScanline24bpp(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan) const;
- FX_DWORD GetValidBpp() const;
-
- CPDF_Document* m_pDocument;
- const CPDF_Stream* m_pStream;
- CPDF_StreamAcc* m_pStreamAcc;
- const CPDF_Dictionary* m_pDict;
- CPDF_ColorSpace* m_pColorSpace;
- FX_DWORD m_Family, m_bpc, m_nComponents, m_GroupFamily;
- FX_BOOL m_bLoadMask;
- FX_BOOL m_bDefaultDecode, m_bImageMask, m_bColorKey;
- DIB_COMP_DATA* m_pCompData;
- FX_LPBYTE m_pLineBuf;
- FX_LPBYTE m_pMaskedLine;
- CFX_DIBitmap* m_pCachedBitmap;
- ICodec_ScanlineDecoder* m_pDecoder;
-};
-#ifdef _FPDFAPI_MINI_
-#define FPDF_HUGE_IMAGE_SIZE 3000000
-#else
-#define FPDF_HUGE_IMAGE_SIZE 60000000
-#endif
-class CPDF_DIBTransferFunc : public CFX_FilteredDIB
-{
-public:
- CPDF_DIBTransferFunc(const CPDF_TransferFunc* pTransferFunc);
- virtual FXDIB_Format GetDestFormat();
- virtual FX_ARGB* GetDestPalette()
- {
- return NULL;
- }
- virtual void TranslateScanline(FX_LPBYTE dest_buf, FX_LPCBYTE src_buf) const;
- virtual void TranslateDownSamples(FX_LPBYTE dest_buf, FX_LPCBYTE src_buf, int pixels, int Bpp) const;
- FX_LPCBYTE m_RampR;
- FX_LPCBYTE m_RampG;
- FX_LPCBYTE m_RampB;
-};
-struct _CPDF_UniqueKeyGen {
- void Generate(int count, ...);
- FX_CHAR m_Key[128];
- int m_KeyLen;
-};
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FPDF_PAGEOBJ_H_
+#include "../../../include/fpdfapi/fpdf_pageobj.h"
+#endif
+class CPDF_QuickStretcher;
+#define TYPE3_MAX_BLUES 16
+class CPDF_Type3Glyphs : public CFX_Object
+{
+public:
+ CPDF_Type3Glyphs()
+ {
+ m_GlyphMap.InitHashTable(253);
+ m_TopBlueCount = m_BottomBlueCount = 0;
+ }
+ ~CPDF_Type3Glyphs();
+ CFX_MapPtrToPtr m_GlyphMap;
+ void AdjustBlue(FX_FLOAT top, FX_FLOAT bottom, int& top_line, int& bottom_line);
+
+ int m_TopBlue[TYPE3_MAX_BLUES], m_BottomBlue[TYPE3_MAX_BLUES];
+ int m_TopBlueCount, m_BottomBlueCount;
+};
+class CFX_GlyphBitmap;
+class CPDF_Type3Cache : public CFX_Object
+{
+public:
+ CPDF_Type3Cache(CPDF_Type3Font* pFont)
+ {
+ m_pFont = pFont;
+ }
+ ~CPDF_Type3Cache();
+ CFX_GlyphBitmap* LoadGlyph(FX_DWORD charcode, const CFX_AffineMatrix* pMatrix, FX_FLOAT retinaScaleX = 1.0f, FX_FLOAT retinaScaleY = 1.0f);
+protected:
+ CFX_GlyphBitmap* RenderGlyph(CPDF_Type3Glyphs* pSize, FX_DWORD charcode, const CFX_AffineMatrix* pMatrix, FX_FLOAT retinaScaleX = 1.0f, FX_FLOAT retinaScaleY = 1.0f);
+ CPDF_Type3Font* m_pFont;
+ CFX_MapByteStringToPtr m_SizeMap;
+};
+class CPDF_TransferFunc : public CFX_Object
+{
+public:
+ CPDF_Document* m_pPDFDoc;
+ FX_BYTE m_Samples[256 * 3];
+ FX_BOOL m_bIdentity;
+
+ CFX_DIBSource* TranslateImage(const CFX_DIBSource* pSrc, FX_BOOL bAutoDropSrc);
+ FX_COLORREF TranslateColor(FX_COLORREF src);
+};
+typedef CFX_MapPtrTemplate<CPDF_Font*, CPDF_CountedObject<CPDF_Type3Cache*>*> CPDF_Type3CacheMap;
+typedef CFX_MapPtrTemplate<CPDF_Object*, CPDF_CountedObject<CPDF_TransferFunc*>*> CPDF_TransferFuncMap;
+class CPDF_DocRenderData : public CFX_Object
+{
+public:
+ CPDF_DocRenderData(CPDF_Document* pPDFDoc = NULL);
+ ~CPDF_DocRenderData();
+ FX_BOOL Initialize();
+ CPDF_Type3Cache* GetCachedType3(CPDF_Type3Font* pFont);
+ CPDF_TransferFunc* GetTransferFunc(CPDF_Object* pObj);
+ CFX_FontCache* GetFontCache()
+ {
+ return m_pFontCache;
+ }
+ void Clear(FX_BOOL bRelease = FALSE);
+ void ReleaseCachedType3(CPDF_Type3Font* pFont);
+ void ReleaseTransferFunc(CPDF_Object* pObj);
+private:
+ CPDF_Document* m_pPDFDoc;
+ CFX_FontCache* m_pFontCache;
+ CPDF_Type3CacheMap m_Type3FaceMap;
+ CPDF_TransferFuncMap m_TransferFuncMap;
+};
+struct _PDF_RenderItem {
+public:
+ CPDF_PageObjects* m_pObjectList;
+ CFX_AffineMatrix m_Matrix;
+};
+typedef CFX_ArrayTemplate<_PDF_RenderItem> CPDF_RenderLayer;
+class IPDF_ObjectRenderer : public CFX_Object
+{
+public:
+ static IPDF_ObjectRenderer* Create(int type);
+ virtual ~IPDF_ObjectRenderer() {}
+ virtual FX_BOOL Start(CPDF_RenderStatus* pRenderStatus, const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device, FX_BOOL bStdCS, int blendType = FXDIB_BLEND_NORMAL) = 0;
+ virtual FX_BOOL Continue(IFX_Pause* pPause) = 0;
+ FX_BOOL m_Result;
+};
+class CPDF_RenderStatus : public CFX_Object
+{
+public:
+ CPDF_RenderStatus();
+ ~CPDF_RenderStatus();
+ FX_BOOL Initialize(int level, class CPDF_RenderContext* pContext, CFX_RenderDevice* pDevice, const CFX_AffineMatrix* pDeviceMatrix,
+ const CPDF_PageObject* pStopObj, const CPDF_RenderStatus* pParentStatus,
+ const CPDF_GraphicStates* pInitialStates, const CPDF_RenderOptions* pOptions,
+ int transparency, FX_BOOL bDropObjects, CPDF_Dictionary* pFormResource = NULL,
+ FX_BOOL bStdCS = FALSE, CPDF_Type3Char* pType3Char = NULL, FX_ARGB fill_color = 0,
+ FX_DWORD GroupFamily = 0, FX_BOOL bLoadMask = FALSE);
+ void RenderObjectList(const CPDF_PageObjects* pObjs, const CFX_AffineMatrix* pObj2Device);
+ void RenderSingleObject(const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device);
+ FX_BOOL ContinueSingleObject(const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device, IFX_Pause* pPause);
+ CPDF_RenderOptions m_Options;
+ CPDF_Dictionary* m_pFormResource;
+ CPDF_Dictionary* m_pPageResource;
+ CFX_PtrArray m_Type3FontCache;
+ CPDF_RenderContext* GetContext()
+ {
+ return m_pContext;
+ }
+protected:
+ friend class CPDF_ImageRenderer;
+ friend class CPDF_RenderContext;
+ void ProcessClipPath(CPDF_ClipPath ClipPath, const CFX_AffineMatrix* pObj2Device);
+ void DrawClipPath(CPDF_ClipPath ClipPath, const CFX_AffineMatrix* pObj2Device);
+ FX_BOOL ProcessTransparency(const CPDF_PageObject* PageObj, const CFX_AffineMatrix* pObj2Device);
+ void ProcessObjectNoClip(const CPDF_PageObject* PageObj, const CFX_AffineMatrix* pObj2Device);
+ void DrawObjWithBackground(const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device);
+ FX_BOOL DrawObjWithBlend(const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device);
+ FX_BOOL ProcessPath(CPDF_PathObject* pPathObj, const CFX_AffineMatrix* pObj2Device);
+ void ProcessPathPattern(CPDF_PathObject* pPathObj, const CFX_AffineMatrix* pObj2Device, int& filltype, FX_BOOL& bStroke);
+ void DrawPathWithPattern(CPDF_PathObject* pPathObj, const CFX_AffineMatrix* pObj2Device, CPDF_Color* pColor, FX_BOOL bStroke);
+ void DrawTilingPattern(CPDF_TilingPattern* pPattern, CPDF_PageObject* pPageObj, const CFX_AffineMatrix* pObj2Device, FX_BOOL bStroke);
+ void DrawShadingPattern(CPDF_ShadingPattern* pPattern, CPDF_PageObject* pPageObj, const CFX_AffineMatrix* pObj2Device, FX_BOOL bStroke);
+ FX_BOOL SelectClipPath(CPDF_PathObject* pPathObj, const CFX_AffineMatrix* pObj2Device, FX_BOOL bStroke);
+ FX_BOOL ProcessImage(CPDF_ImageObject* pImageObj, const CFX_AffineMatrix* pObj2Device);
+ FX_BOOL OutputBitmapAlpha(CPDF_ImageObject* pImageObj, const CFX_AffineMatrix* pImage2Device);
+ FX_BOOL OutputImage(CPDF_ImageObject* pImageObj, const CFX_AffineMatrix* pImage2Device);
+ FX_BOOL OutputDIBSource(const CFX_DIBSource* pOutputBitmap, FX_ARGB fill_argb, int bitmap_alpha,
+ const CFX_AffineMatrix* pImage2Device, CPDF_ImageCache* pImageCache, FX_DWORD flags);
+ void CompositeDIBitmap(CFX_DIBitmap* pDIBitmap, int left, int top, FX_ARGB mask_argb,
+ int bitmap_alpha, int blend_mode, int bIsolated);
+ FX_BOOL ProcessInlines(CPDF_InlineImages* pInlines, const CFX_AffineMatrix* pObj2Device);
+ FX_BOOL ProcessShading(CPDF_ShadingObject* pShadingObj, const CFX_AffineMatrix* pObj2Device);
+ void DrawShading(CPDF_ShadingPattern* pPattern, CFX_AffineMatrix* pMatrix, FX_RECT& clip_rect,
+ int alpha, FX_BOOL bAlphaMode);
+ FX_BOOL ProcessType3Text(const CPDF_TextObject* textobj, const CFX_AffineMatrix* pObj2Device);
+ FX_BOOL ProcessText(const CPDF_TextObject* textobj, const CFX_AffineMatrix* pObj2Device, CFX_PathData* pClippingPath);
+ void DrawTextPathWithPattern(const CPDF_TextObject* textobj, const CFX_AffineMatrix* pObj2Device,
+ CPDF_Font* pFont, FX_FLOAT font_size,
+ const CFX_AffineMatrix* pTextMatrix, FX_BOOL bFill, FX_BOOL bStroke);
+ FX_BOOL ProcessForm(CPDF_FormObject* pFormObj, const CFX_AffineMatrix* pObj2Device);
+ CFX_DIBitmap* GetBackdrop(const CPDF_PageObject* pObj, const FX_RECT& rect, int& left, int& top,
+ FX_BOOL bBackAlphaRequired);
+ CFX_DIBitmap* LoadSMask(CPDF_Dictionary* pSMaskDict, FX_RECT* pClipRect, const CFX_AffineMatrix* pMatrix);
+ void Init(CPDF_RenderContext* pParent);
+ static class CPDF_Type3Cache* GetCachedType3(CPDF_Type3Font* pFont);
+ static CPDF_GraphicStates* CloneObjStates(const CPDF_GraphicStates* pPathObj, FX_BOOL bStroke);
+ CPDF_TransferFunc* GetTransferFunc(CPDF_Object* pObject) const;
+ FX_ARGB GetFillArgb(const CPDF_PageObject* pObj, FX_BOOL bType3 = FALSE) const;
+ FX_ARGB GetStrokeArgb(const CPDF_PageObject* pObj) const;
+ CPDF_RenderContext* m_pContext;
+ FX_BOOL m_bStopped;
+ void DitherObjectArea(const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device);
+ FX_BOOL GetObjectClippedRect(const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device, FX_BOOL bLogical, FX_RECT &rect) const;
+ void GetScaledMatrix(CFX_Matrix &matrix) const;
+protected:
+ int m_Level;
+ CFX_RenderDevice* m_pDevice;
+ CFX_AffineMatrix m_DeviceMatrix;
+ CPDF_ClipPath m_LastClipPath;
+ const CPDF_PageObject* m_pCurObj;
+ const CPDF_PageObject* m_pStopObj;
+ CPDF_GraphicStates m_InitialStates;
+ int m_HalftoneLimit;
+ IPDF_ObjectRenderer* m_pObjectRenderer;
+ FX_BOOL m_bPrint;
+ int m_Transparency;
+ int m_DitherBits;
+ FX_BOOL m_bDropObjects;
+ FX_BOOL m_bStdCS;
+ FX_DWORD m_GroupFamily;
+ FX_BOOL m_bLoadMask;
+ CPDF_Type3Char * m_pType3Char;
+ FX_ARGB m_T3FillColor;
+ int m_curBlend;
+};
+class CPDF_ImageLoader : public CFX_Object
+{
+public:
+ CPDF_ImageLoader()
+ {
+ m_pBitmap = NULL;
+ m_pMask = NULL;
+ m_MatteColor = 0;
+ m_bCached = FALSE;
+ m_nDownsampleWidth = 0;
+ m_nDownsampleHeight = 0;
+ }
+
+ FX_BOOL Load(const CPDF_ImageObject* pImage, CPDF_PageRenderCache* pCache, FX_BOOL bStdCS = FALSE, FX_DWORD GroupFamily = 0, FX_BOOL bLoadMask = FALSE, CPDF_RenderStatus* pRenderStatus = NULL);
+
+ FX_BOOL StartLoadImage(const CPDF_ImageObject* pImage, CPDF_PageRenderCache* pCache, FX_LPVOID& LoadHandle, FX_BOOL bStdCS = FALSE, FX_DWORD GroupFamily = 0, FX_BOOL bLoadMask = FALSE, CPDF_RenderStatus* pRenderStatus = NULL, FX_INT32 nDownsampleWidth = 0, FX_INT32 nDownsampleHeight = 0);
+ FX_BOOL Continue(FX_LPVOID LoadHandle, IFX_Pause* pPause);
+ ~CPDF_ImageLoader();
+ CFX_DIBSource* m_pBitmap;
+ CFX_DIBSource* m_pMask;
+ FX_DWORD m_MatteColor;
+ FX_BOOL m_bCached;
+protected:
+ FX_INT32 m_nDownsampleWidth;
+ FX_INT32 m_nDownsampleHeight;
+};
+class CPDF_ProgressiveImageLoaderHandle : public CFX_Object
+{
+public:
+ CPDF_ProgressiveImageLoaderHandle();
+ ~CPDF_ProgressiveImageLoaderHandle();
+
+ FX_BOOL Start(CPDF_ImageLoader* pImageLoader, const CPDF_ImageObject* pImage, CPDF_PageRenderCache* pCache, FX_BOOL bStdCS = FALSE, FX_DWORD GroupFamily = 0, FX_BOOL bLoadMask = FALSE, CPDF_RenderStatus* pRenderStatus = NULL, FX_INT32 nDownsampleWidth = 0, FX_INT32 nDownsampleHeight = 0);
+ FX_BOOL Continue(IFX_Pause* pPause);
+protected:
+ CPDF_ImageLoader* m_pImageLoader;
+ CPDF_PageRenderCache* m_pCache;
+ CPDF_ImageObject* m_pImage;
+ FX_INT32 m_nDownsampleWidth;
+ FX_INT32 m_nDownsampleHeight;
+};
+class CFX_ImageTransformer;
+class CPDF_ImageRenderer : public IPDF_ObjectRenderer
+{
+public:
+ CPDF_ImageRenderer();
+ ~CPDF_ImageRenderer();
+ FX_BOOL Start(CPDF_RenderStatus* pStatus, const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device, FX_BOOL bStdCS, int blendType = FXDIB_BLEND_NORMAL);
+ FX_BOOL Start(CPDF_RenderStatus* pStatus, const CFX_DIBSource* pDIBSource, FX_ARGB bitmap_argb,
+ int bitmap_alpha, const CFX_AffineMatrix* pImage2Device, FX_DWORD flags, FX_BOOL bStdCS, int blendType = FXDIB_BLEND_NORMAL);
+ FX_BOOL Continue(IFX_Pause* pPause);
+protected:
+ CPDF_RenderStatus* m_pRenderStatus;
+ CPDF_ImageObject* m_pImageObject;
+ int m_Status;
+ const CFX_AffineMatrix* m_pObj2Device;
+ CFX_AffineMatrix m_ImageMatrix;
+ CPDF_ImageLoader m_Loader;
+ const CFX_DIBSource* m_pDIBSource;
+ CFX_DIBitmap* m_pClone;
+ int m_BitmapAlpha;
+ FX_BOOL m_bPatternColor;
+ CPDF_Pattern* m_pPattern;
+ FX_ARGB m_FillArgb;
+ FX_DWORD m_Flags;
+ CPDF_QuickStretcher* m_pQuickStretcher;
+ CFX_ImageTransformer* m_pTransformer;
+ CPDF_ImageRenderer* m_pRenderer2;
+ FX_LPVOID m_DeviceHandle;
+ FX_LPVOID m_LoadHandle;
+ FX_BOOL m_bStdCS;
+ int m_BlendType;
+ FX_BOOL StartBitmapAlpha();
+ FX_BOOL StartDIBSource();
+ FX_BOOL StartRenderDIBSource();
+ FX_BOOL StartLoadDIBSource();
+ FX_BOOL DrawMaskedImage();
+ FX_BOOL DrawPatternImage(const CFX_Matrix* pObj2Device);
+};
+class CPDF_ScaledRenderBuffer : public CFX_Object
+{
+public:
+ CPDF_ScaledRenderBuffer();
+ ~CPDF_ScaledRenderBuffer();
+ FX_BOOL Initialize(CPDF_RenderContext* pContext, CFX_RenderDevice* pDevice, FX_RECT* pRect,
+ const CPDF_PageObject* pObj, const CPDF_RenderOptions *pOptions = NULL, int max_dpi = 0);
+ CFX_RenderDevice* GetDevice()
+ {
+ return m_pBitmapDevice ? m_pBitmapDevice : m_pDevice;
+ }
+ CFX_AffineMatrix* GetMatrix()
+ {
+ return &m_Matrix;
+ }
+ void OutputToDevice();
+private:
+ CFX_RenderDevice* m_pDevice;
+ CPDF_RenderContext* m_pContext;
+ FX_RECT m_Rect;
+ const CPDF_PageObject* m_pObject;
+ CFX_FxgeDevice* m_pBitmapDevice;
+ CFX_AffineMatrix m_Matrix;
+};
+class ICodec_ScanlineDecoder;
+class CPDF_QuickStretcher : public CFX_Object
+{
+public:
+ CPDF_QuickStretcher();
+ ~CPDF_QuickStretcher();
+ FX_BOOL Start(CPDF_ImageObject* pImageObj, CFX_AffineMatrix* pImage2Device, const FX_RECT* pClipBox);
+ FX_BOOL Continue(IFX_Pause* pPause);
+ CFX_DIBitmap* m_pBitmap;
+ int m_ResultLeft, m_ResultTop, m_ClipLeft, m_ClipTop;
+ int m_DestWidth, m_DestHeight, m_ResultWidth, m_ResultHeight;
+ int m_Bpp, m_SrcWidth, m_SrcHeight;
+ FX_BOOL m_bFlipX, m_bFlipY;
+ CPDF_ColorSpace* m_pCS;
+ ICodec_ScanlineDecoder* m_pDecoder;
+ CPDF_StreamAcc m_StreamAcc;
+ int m_LineIndex;
+};
+class CPDF_DeviceBuffer : public CFX_Object
+{
+public:
+ CPDF_DeviceBuffer();
+ ~CPDF_DeviceBuffer();
+ FX_BOOL Initialize(CPDF_RenderContext* pContext, CFX_RenderDevice* pDevice, FX_RECT* pRect,
+ const CPDF_PageObject* pObj, int max_dpi = 0);
+ void OutputToDevice();
+ CFX_DIBitmap* GetBitmap() const
+ {
+ return m_pBitmap;
+ }
+ const CFX_AffineMatrix* GetMatrix() const
+ {
+ return &m_Matrix;
+ }
+private:
+ CFX_RenderDevice* m_pDevice;
+ CPDF_RenderContext* m_pContext;
+ FX_RECT m_Rect;
+ const CPDF_PageObject* m_pObject;
+ CFX_DIBitmap* m_pBitmap;
+ CFX_AffineMatrix m_Matrix;
+};
+class CPDF_ImageCache : public CFX_Object
+{
+public:
+ CPDF_ImageCache(CPDF_Document* pDoc, CPDF_Stream* pStream);
+ ~CPDF_ImageCache();
+ void ClearImageData();
+ void Reset(const CFX_DIBitmap* pBitmap);
+ FX_BOOL GetCachedBitmap(CFX_DIBSource*& pBitmap, CFX_DIBSource*& pMask, FX_DWORD& MatteColor, CPDF_Dictionary* pPageResources,
+ FX_BOOL bStdCS = FALSE, FX_DWORD GroupFamily = 0, FX_BOOL bLoadMask = FALSE,
+ CPDF_RenderStatus* pRenderStatus = NULL, FX_INT32 downsampleWidth = 0, FX_INT32 downsampleHeight = 0);
+ FX_DWORD EstimateSize() const
+ {
+ return m_dwCacheSize;
+ }
+ FX_DWORD GetTimeCount() const
+ {
+ return m_dwTimeCount;
+ }
+ CPDF_Stream* GetStream() const
+ {
+ return m_pStream;
+ }
+ void SetTimeCount(FX_DWORD dwTimeCount)
+ {
+ m_dwTimeCount = dwTimeCount;
+ }
+ int m_dwTimeCount;
+public:
+ int StartGetCachedBitmap(CPDF_Dictionary* pFormResources, CPDF_Dictionary* pPageResources,
+ FX_BOOL bStdCS = FALSE, FX_DWORD GroupFamily = 0,
+ FX_BOOL bLoadMask = FALSE, CPDF_RenderStatus* pRenderStatus = NULL, FX_INT32 downsampleWidth = 0, FX_INT32 downsampleHeight = 0);
+ int Continue(IFX_Pause* pPause);
+ int ContinueGetCachedBitmap();
+ CFX_DIBSource* DetachBitmap();
+ CFX_DIBSource* DetachMask();
+ CFX_DIBSource* m_pCurBitmap;
+ CFX_DIBSource* m_pCurMask;
+ FX_DWORD m_MatteColor;
+ CPDF_RenderStatus* m_pRenderStatus;
+protected:
+ CPDF_Document* m_pDocument;
+ CPDF_Stream* m_pStream;
+ CFX_DIBSource* m_pCachedBitmap;
+ CFX_DIBSource* m_pCachedMask;
+ FX_DWORD m_dwCacheSize;
+ void CalcSize();
+};
+typedef struct {
+ FX_FLOAT m_DecodeMin;
+ FX_FLOAT m_DecodeStep;
+ int m_ColorKeyMin;
+ int m_ColorKeyMax;
+} DIB_COMP_DATA;
+class CPDF_DIBSource : public CFX_DIBSource
+{
+public:
+ CPDF_DIBSource();
+ virtual ~CPDF_DIBSource();
+ FX_BOOL Load(CPDF_Document* pDoc, const CPDF_Stream* pStream,
+ CPDF_DIBSource** ppMask, FX_DWORD* pMatteColor,
+ CPDF_Dictionary* pFormResources, CPDF_Dictionary* pPageResources,
+ FX_BOOL bStdCS = FALSE, FX_DWORD GroupFamily = 0, FX_BOOL bLoadMask = FALSE);
+ virtual FX_BOOL SkipToScanline(int line, IFX_Pause* pPause) const;
+ virtual FX_LPBYTE GetBuffer() const;
+ virtual FX_LPCBYTE GetScanline(int line) const;
+ virtual void DownSampleScanline(int line, FX_LPBYTE dest_scan, int dest_bpp,
+ int dest_width, FX_BOOL bFlipX, int clip_left, int clip_width) const;
+ virtual void SetDownSampleSize(int dest_width, int dest_height) const;
+ CFX_DIBitmap* GetBitmap() const;
+ void ReleaseBitmap(CFX_DIBitmap*) const;
+ void ClearImageData();
+public:
+ int StartLoadDIBSource(CPDF_Document* pDoc, const CPDF_Stream* pStream, FX_BOOL bHasMask,
+ CPDF_Dictionary* pFormResources, CPDF_Dictionary* pPageResources,
+ FX_BOOL bStdCS = FALSE, FX_DWORD GroupFamily = 0, FX_BOOL bLoadMask = FALSE);
+ int ContinueLoadDIBSource(IFX_Pause* pPause);
+ int StratLoadMask();
+ int StartLoadMaskDIB();
+ int ContinueLoadMaskDIB(IFX_Pause* pPause);
+ int ContinueToLoadMask();
+ CPDF_DIBSource* DetachMask();
+ CPDF_DIBSource* m_pMask;
+ FX_DWORD m_MatteColor;
+ FX_LPVOID m_pJbig2Context;
+ CPDF_StreamAcc* m_pGlobalStream;
+ FX_BOOL m_bStdCS;
+ int m_Status;
+ CPDF_Object* m_pMaskStream;
+ FX_BOOL m_bHasMask;
+protected:
+ FX_BOOL LoadColorInfo(CPDF_Dictionary* pFormResources, CPDF_Dictionary* pPageResources);
+ CPDF_DIBSource* LoadMask(FX_DWORD& MatteColor);
+ CPDF_DIBSource* LoadMaskDIB(CPDF_Stream* pMask);
+ void LoadJpxBitmap();
+ void LoadJbig2Bitmap();
+ void LoadPalette();
+ FX_BOOL CreateDecoder();
+ void TranslateScanline24bpp(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan) const;
+ FX_DWORD GetValidBpp() const;
+
+ CPDF_Document* m_pDocument;
+ const CPDF_Stream* m_pStream;
+ CPDF_StreamAcc* m_pStreamAcc;
+ const CPDF_Dictionary* m_pDict;
+ CPDF_ColorSpace* m_pColorSpace;
+ FX_DWORD m_Family, m_bpc, m_nComponents, m_GroupFamily;
+ FX_BOOL m_bLoadMask;
+ FX_BOOL m_bDefaultDecode, m_bImageMask, m_bColorKey;
+ DIB_COMP_DATA* m_pCompData;
+ FX_LPBYTE m_pLineBuf;
+ FX_LPBYTE m_pMaskedLine;
+ CFX_DIBitmap* m_pCachedBitmap;
+ ICodec_ScanlineDecoder* m_pDecoder;
+};
+#ifdef _FPDFAPI_MINI_
+#define FPDF_HUGE_IMAGE_SIZE 3000000
+#else
+#define FPDF_HUGE_IMAGE_SIZE 60000000
+#endif
+class CPDF_DIBTransferFunc : public CFX_FilteredDIB
+{
+public:
+ CPDF_DIBTransferFunc(const CPDF_TransferFunc* pTransferFunc);
+ virtual FXDIB_Format GetDestFormat();
+ virtual FX_ARGB* GetDestPalette()
+ {
+ return NULL;
+ }
+ virtual void TranslateScanline(FX_LPBYTE dest_buf, FX_LPCBYTE src_buf) const;
+ virtual void TranslateDownSamples(FX_LPBYTE dest_buf, FX_LPCBYTE src_buf, int pixels, int Bpp) const;
+ FX_LPCBYTE m_RampR;
+ FX_LPCBYTE m_RampG;
+ FX_LPCBYTE m_RampB;
+};
+struct _CPDF_UniqueKeyGen {
+ void Generate(int count, ...);
+ FX_CHAR m_Key[128];
+ int m_KeyLen;
+};
diff --git a/core/src/fpdfdoc/doc_action.cpp b/core/src/fpdfdoc/doc_action.cpp
index f13bd27cbe..801c69fbb7 100644
--- a/core/src/fpdfdoc/doc_action.cpp
+++ b/core/src/fpdfdoc/doc_action.cpp
@@ -1,362 +1,362 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../include/fpdfdoc/fpdf_doc.h"
-CPDF_Dest CPDF_Action::GetDest(CPDF_Document* pDoc) const
-{
- if (m_pDict == NULL) {
- return NULL;
- }
- CFX_ByteString type = m_pDict->GetString("S");
- if (type != "GoTo" && type != "GoToR") {
- return NULL;
- }
- CPDF_Object* pDest = m_pDict->GetElementValue("D");
- if (pDest == NULL) {
- return NULL;
- }
- if (pDest->GetType() == PDFOBJ_STRING || pDest->GetType() == PDFOBJ_NAME) {
- CPDF_NameTree name_tree(pDoc, FX_BSTRC("Dests"));
- CFX_ByteStringC name = pDest->GetString();
- return name_tree.LookupNamedDest(pDoc, name);
- } else if (pDest->GetType() == PDFOBJ_ARRAY) {
- return (CPDF_Array*)pDest;
- }
- return NULL;
-}
-const FX_CHAR* g_sATypes[] = {"Unknown", "GoTo", "GoToR", "GoToE", "Launch", "Thread", "URI", "Sound", "Movie",
- "Hide", "Named", "SubmitForm", "ResetForm", "ImportData", "JavaScript", "SetOCGState",
- "Rendition", "Trans", "GoTo3DView", ""
- };
-CPDF_Action::ActionType CPDF_Action::GetType() const
-{
- ActionType eType = Unknown;
- if (m_pDict != NULL) {
- CFX_ByteString csType = m_pDict->GetString("S");
- if (!csType.IsEmpty()) {
- int i = 0;
- while (g_sATypes[i][0] != '\0') {
- if (csType == g_sATypes[i]) {
- return (ActionType)i;
- }
- i ++;
- }
- }
- }
- return eType;
-}
-CFX_WideString CPDF_Action::GetFilePath() const
-{
- CFX_ByteString type = m_pDict->GetString("S");
- if (type != "GoToR" && type != "Launch" &&
- type != "SubmitForm" && type != "ImportData") {
- return CFX_WideString();
- }
- CPDF_Object* pFile = m_pDict->GetElementValue("F");
- CFX_WideString path;
- if (pFile == NULL) {
- if (type == "Launch") {
- CPDF_Dictionary* pWinDict = m_pDict->GetDict(FX_BSTRC("Win"));
- if (pWinDict) {
- return CFX_WideString::FromLocal(pWinDict->GetString(FX_BSTRC("F")));
- }
- }
- return path;
- }
- CPDF_FileSpec filespec(pFile);
- filespec.GetFileName(path);
- return path;
-}
-CFX_ByteString CPDF_Action::GetURI(CPDF_Document* pDoc) const
-{
- CFX_ByteString csURI;
- if (m_pDict == NULL) {
- return csURI;
- }
- if (m_pDict->GetString("S") != "URI") {
- return csURI;
- }
- csURI = m_pDict->GetString("URI");
- CPDF_Dictionary* pRoot = pDoc->GetRoot();
- CPDF_Dictionary* pURI = pRoot->GetDict("URI");
- if (pURI != NULL) {
- if (csURI.Find(FX_BSTRC(":"), 0) < 1) {
- csURI = pURI->GetString("Base") + csURI;
- }
- }
- return csURI;
-}
-FX_DWORD CPDF_ActionFields::GetFieldsCount() const
-{
- if (m_pAction == NULL) {
- return 0;
- }
- CPDF_Dictionary* pDict = (CPDF_Dictionary*)(*m_pAction);
- if (pDict == NULL) {
- return 0;
- }
- CFX_ByteString csType = pDict->GetString("S");
- CPDF_Object* pFields = NULL;
- if (csType == "Hide") {
- pFields = pDict->GetElementValue("T");
- } else {
- pFields = pDict->GetArray("Fields");
- }
- if (pFields == NULL) {
- return 0;
- }
- int iType = pFields->GetType();
- if (iType == PDFOBJ_DICTIONARY) {
- return 1;
- } else if (iType == PDFOBJ_STRING) {
- return 1;
- } else if (iType == PDFOBJ_ARRAY) {
- return ((CPDF_Array*)pFields)->GetCount();
- }
- return 0;
-}
-void CPDF_ActionFields::GetAllFields(CFX_PtrArray& fieldObjects) const
-{
- fieldObjects.RemoveAll();
- if (m_pAction == NULL) {
- return;
- }
- CPDF_Dictionary* pDict = (CPDF_Dictionary*)(*m_pAction);
- if (pDict == NULL) {
- return;
- }
- CFX_ByteString csType = pDict->GetString("S");
- CPDF_Object* pFields = NULL;
- if (csType == "Hide") {
- pFields = pDict->GetElementValue("T");
- } else {
- pFields = pDict->GetArray("Fields");
- }
- if (pFields == NULL) {
- return;
- }
- int iType = pFields->GetType();
- if (iType == PDFOBJ_DICTIONARY || iType == PDFOBJ_STRING) {
- fieldObjects.Add(pFields);
- } else if (iType == PDFOBJ_ARRAY) {
- CPDF_Array* pArray = (CPDF_Array*)pFields;
- FX_DWORD iCount = pArray->GetCount();
- for (FX_DWORD i = 0; i < iCount; i ++) {
- CPDF_Object* pObj = pArray->GetElementValue(i);
- if (pObj != NULL) {
- fieldObjects.Add(pObj);
- }
- }
- }
-}
-CPDF_Object* CPDF_ActionFields::GetField(FX_DWORD iIndex) const
-{
- if (m_pAction == NULL) {
- return NULL;
- }
- CPDF_Dictionary* pDict = (CPDF_Dictionary*)(*m_pAction);
- if (pDict == NULL) {
- return NULL;
- }
- CFX_ByteString csType = pDict->GetString("S");
- CPDF_Object* pFields = NULL;
- if (csType == "Hide") {
- pFields = pDict->GetElementValue("T");
- } else {
- pFields = pDict->GetArray("Fields");
- }
- if (pFields == NULL) {
- return NULL;
- }
- CPDF_Object* pFindObj = NULL;
- int iType = pFields->GetType();
- if (iType == PDFOBJ_DICTIONARY || iType == PDFOBJ_STRING) {
- if (iIndex == 0) {
- pFindObj = pFields;
- }
- } else if (iType == PDFOBJ_ARRAY) {
- pFindObj = ((CPDF_Array*)pFields)->GetElementValue(iIndex);
- }
- return pFindObj;
-}
-CPDF_LWinParam CPDF_Action::GetWinParam() const
-{
- if (m_pDict == NULL) {
- return NULL;
- }
- if (m_pDict->GetString("S") != "Launch") {
- return NULL;
- }
- return m_pDict->GetDict("Win");
-}
-CFX_WideString CPDF_Action::GetJavaScript() const
-{
- CFX_WideString csJS;
- if (m_pDict == NULL) {
- return csJS;
- }
- CPDF_Object* pJS = m_pDict->GetElementValue("JS");
- if (pJS != NULL) {
- return pJS->GetUnicodeText();
- }
- return csJS;
-}
-CPDF_Dictionary* CPDF_Action::GetAnnot() const
-{
- if (m_pDict == NULL) {
- return NULL;
- }
- CFX_ByteString csType = m_pDict->GetString("S");
- if (csType == FX_BSTRC("Rendition")) {
- return m_pDict->GetDict("AN");
- } else if (csType == FX_BSTRC("Movie")) {
- return m_pDict->GetDict("Annotation");
- }
- return NULL;
-}
-FX_INT32 CPDF_Action::GetOperationType() const
-{
- if (m_pDict == NULL) {
- return 0;
- }
- CFX_ByteString csType = m_pDict->GetString("S");
- if (csType == FX_BSTRC("Rendition")) {
- return m_pDict->GetInteger("OP");
- } else if (csType == FX_BSTRC("Movie")) {
- CFX_ByteString csOP = m_pDict->GetString("Operation");
- if (csOP == FX_BSTRC("Play")) {
- return 0;
- } else if (csOP == FX_BSTRC("Stop")) {
- return 1;
- } else if (csOP == FX_BSTRC("Pause")) {
- return 2;
- } else if (csOP == FX_BSTRC("Resume")) {
- return 3;
- }
- }
- return 0;
-}
-FX_DWORD CPDF_Action::GetSubActionsCount() const
-{
- if (m_pDict == NULL || !m_pDict->KeyExist("Next")) {
- return 0;
- }
- CPDF_Object* pNext = m_pDict->GetElementValue("Next");
- if (!pNext) {
- return 0;
- }
- int iObjType = pNext->GetType();
- if (iObjType == PDFOBJ_DICTIONARY) {
- return 1;
- }
- if (iObjType == PDFOBJ_ARRAY) {
- return ((CPDF_Array*)pNext)->GetCount();
- }
- return 0;
-}
-CPDF_Action CPDF_Action::GetSubAction(FX_DWORD iIndex) const
-{
- if (m_pDict == NULL || !m_pDict->KeyExist("Next")) {
- return NULL;
- }
- CPDF_Object* pNext = m_pDict->GetElementValue("Next");
- int iObjType = pNext->GetType();
- if (iObjType == PDFOBJ_DICTIONARY) {
- if (iIndex == 0) {
- return (CPDF_Dictionary*)pNext;
- }
- }
- if (iObjType == PDFOBJ_ARRAY) {
- return ((CPDF_Array*)pNext)->GetDict(iIndex);
- }
- return NULL;
-}
-const FX_CHAR* g_sAATypes[] = {"E", "X", "D", "U", "Fo", "Bl", "PO", "PC", "PV", "PI",
- "O", "C",
- "K", "F", "V", "C",
- "WC", "WS", "DS", "WP", "DP",
- ""
- };
-FX_BOOL CPDF_AAction::ActionExist(AActionType eType) const
-{
- if (m_pDict == NULL) {
- return FALSE;
- }
- return m_pDict->KeyExist(g_sAATypes[(int)eType]);
-}
-CPDF_Action CPDF_AAction::GetAction(AActionType eType) const
-{
- if (m_pDict == NULL) {
- return NULL;
- }
- return m_pDict->GetDict(g_sAATypes[(int)eType]);
-}
-FX_POSITION CPDF_AAction::GetStartPos() const
-{
- if (m_pDict == NULL) {
- return NULL;
- }
- return m_pDict->GetStartPos();
-}
-CPDF_Action CPDF_AAction::GetNextAction(FX_POSITION& pos, AActionType& eType) const
-{
- if (m_pDict == NULL) {
- return NULL;
- }
- CFX_ByteString csKey;
- CPDF_Object* pObj = m_pDict->GetNextElement(pos, csKey);
- if (pObj != NULL) {
- CPDF_Object* pDirect = pObj->GetDirect();
- if (pDirect != NULL && pDirect->GetType() == PDFOBJ_DICTIONARY) {
- int i = 0;
- while (g_sAATypes[i][0] != '\0') {
- if (csKey == g_sAATypes[i]) {
- break;
- }
- i ++;
- }
- eType = (AActionType)i;
- return (CPDF_Dictionary*)pDirect;
- }
- }
- return NULL;
-}
-CPDF_DocJSActions::CPDF_DocJSActions(CPDF_Document* pDoc)
-{
- m_pDocument = pDoc;
-}
-int CPDF_DocJSActions::CountJSActions() const
-{
- ASSERT(m_pDocument != NULL);
- CPDF_NameTree name_tree(m_pDocument, FX_BSTRC("JavaScript"));
- return name_tree.GetCount();
-}
-CPDF_Action CPDF_DocJSActions::GetJSAction(int index, CFX_ByteString& csName) const
-{
- ASSERT(m_pDocument != NULL);
- CPDF_NameTree name_tree(m_pDocument, FX_BSTRC("JavaScript"));
- CPDF_Object *pAction = name_tree.LookupValue(index, csName);
- if (pAction == NULL || pAction->GetType() != PDFOBJ_DICTIONARY) {
- return NULL;
- }
- return pAction->GetDict();
-}
-CPDF_Action CPDF_DocJSActions::GetJSAction(const CFX_ByteString& csName) const
-{
- ASSERT(m_pDocument != NULL);
- CPDF_NameTree name_tree(m_pDocument, FX_BSTRC("JavaScript"));
- CPDF_Object *pAction = name_tree.LookupValue(csName);
- if (pAction == NULL || pAction->GetType() != PDFOBJ_DICTIONARY) {
- return NULL;
- }
- return pAction->GetDict();
-}
-int CPDF_DocJSActions::FindJSAction(const CFX_ByteString& csName) const
-{
- ASSERT(m_pDocument != NULL);
- CPDF_NameTree name_tree(m_pDocument, FX_BSTRC("JavaScript"));
- return name_tree.GetIndex(csName);
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fpdfdoc/fpdf_doc.h"
+CPDF_Dest CPDF_Action::GetDest(CPDF_Document* pDoc) const
+{
+ if (m_pDict == NULL) {
+ return NULL;
+ }
+ CFX_ByteString type = m_pDict->GetString("S");
+ if (type != "GoTo" && type != "GoToR") {
+ return NULL;
+ }
+ CPDF_Object* pDest = m_pDict->GetElementValue("D");
+ if (pDest == NULL) {
+ return NULL;
+ }
+ if (pDest->GetType() == PDFOBJ_STRING || pDest->GetType() == PDFOBJ_NAME) {
+ CPDF_NameTree name_tree(pDoc, FX_BSTRC("Dests"));
+ CFX_ByteStringC name = pDest->GetString();
+ return name_tree.LookupNamedDest(pDoc, name);
+ } else if (pDest->GetType() == PDFOBJ_ARRAY) {
+ return (CPDF_Array*)pDest;
+ }
+ return NULL;
+}
+const FX_CHAR* g_sATypes[] = {"Unknown", "GoTo", "GoToR", "GoToE", "Launch", "Thread", "URI", "Sound", "Movie",
+ "Hide", "Named", "SubmitForm", "ResetForm", "ImportData", "JavaScript", "SetOCGState",
+ "Rendition", "Trans", "GoTo3DView", ""
+ };
+CPDF_Action::ActionType CPDF_Action::GetType() const
+{
+ ActionType eType = Unknown;
+ if (m_pDict != NULL) {
+ CFX_ByteString csType = m_pDict->GetString("S");
+ if (!csType.IsEmpty()) {
+ int i = 0;
+ while (g_sATypes[i][0] != '\0') {
+ if (csType == g_sATypes[i]) {
+ return (ActionType)i;
+ }
+ i ++;
+ }
+ }
+ }
+ return eType;
+}
+CFX_WideString CPDF_Action::GetFilePath() const
+{
+ CFX_ByteString type = m_pDict->GetString("S");
+ if (type != "GoToR" && type != "Launch" &&
+ type != "SubmitForm" && type != "ImportData") {
+ return CFX_WideString();
+ }
+ CPDF_Object* pFile = m_pDict->GetElementValue("F");
+ CFX_WideString path;
+ if (pFile == NULL) {
+ if (type == "Launch") {
+ CPDF_Dictionary* pWinDict = m_pDict->GetDict(FX_BSTRC("Win"));
+ if (pWinDict) {
+ return CFX_WideString::FromLocal(pWinDict->GetString(FX_BSTRC("F")));
+ }
+ }
+ return path;
+ }
+ CPDF_FileSpec filespec(pFile);
+ filespec.GetFileName(path);
+ return path;
+}
+CFX_ByteString CPDF_Action::GetURI(CPDF_Document* pDoc) const
+{
+ CFX_ByteString csURI;
+ if (m_pDict == NULL) {
+ return csURI;
+ }
+ if (m_pDict->GetString("S") != "URI") {
+ return csURI;
+ }
+ csURI = m_pDict->GetString("URI");
+ CPDF_Dictionary* pRoot = pDoc->GetRoot();
+ CPDF_Dictionary* pURI = pRoot->GetDict("URI");
+ if (pURI != NULL) {
+ if (csURI.Find(FX_BSTRC(":"), 0) < 1) {
+ csURI = pURI->GetString("Base") + csURI;
+ }
+ }
+ return csURI;
+}
+FX_DWORD CPDF_ActionFields::GetFieldsCount() const
+{
+ if (m_pAction == NULL) {
+ return 0;
+ }
+ CPDF_Dictionary* pDict = (CPDF_Dictionary*)(*m_pAction);
+ if (pDict == NULL) {
+ return 0;
+ }
+ CFX_ByteString csType = pDict->GetString("S");
+ CPDF_Object* pFields = NULL;
+ if (csType == "Hide") {
+ pFields = pDict->GetElementValue("T");
+ } else {
+ pFields = pDict->GetArray("Fields");
+ }
+ if (pFields == NULL) {
+ return 0;
+ }
+ int iType = pFields->GetType();
+ if (iType == PDFOBJ_DICTIONARY) {
+ return 1;
+ } else if (iType == PDFOBJ_STRING) {
+ return 1;
+ } else if (iType == PDFOBJ_ARRAY) {
+ return ((CPDF_Array*)pFields)->GetCount();
+ }
+ return 0;
+}
+void CPDF_ActionFields::GetAllFields(CFX_PtrArray& fieldObjects) const
+{
+ fieldObjects.RemoveAll();
+ if (m_pAction == NULL) {
+ return;
+ }
+ CPDF_Dictionary* pDict = (CPDF_Dictionary*)(*m_pAction);
+ if (pDict == NULL) {
+ return;
+ }
+ CFX_ByteString csType = pDict->GetString("S");
+ CPDF_Object* pFields = NULL;
+ if (csType == "Hide") {
+ pFields = pDict->GetElementValue("T");
+ } else {
+ pFields = pDict->GetArray("Fields");
+ }
+ if (pFields == NULL) {
+ return;
+ }
+ int iType = pFields->GetType();
+ if (iType == PDFOBJ_DICTIONARY || iType == PDFOBJ_STRING) {
+ fieldObjects.Add(pFields);
+ } else if (iType == PDFOBJ_ARRAY) {
+ CPDF_Array* pArray = (CPDF_Array*)pFields;
+ FX_DWORD iCount = pArray->GetCount();
+ for (FX_DWORD i = 0; i < iCount; i ++) {
+ CPDF_Object* pObj = pArray->GetElementValue(i);
+ if (pObj != NULL) {
+ fieldObjects.Add(pObj);
+ }
+ }
+ }
+}
+CPDF_Object* CPDF_ActionFields::GetField(FX_DWORD iIndex) const
+{
+ if (m_pAction == NULL) {
+ return NULL;
+ }
+ CPDF_Dictionary* pDict = (CPDF_Dictionary*)(*m_pAction);
+ if (pDict == NULL) {
+ return NULL;
+ }
+ CFX_ByteString csType = pDict->GetString("S");
+ CPDF_Object* pFields = NULL;
+ if (csType == "Hide") {
+ pFields = pDict->GetElementValue("T");
+ } else {
+ pFields = pDict->GetArray("Fields");
+ }
+ if (pFields == NULL) {
+ return NULL;
+ }
+ CPDF_Object* pFindObj = NULL;
+ int iType = pFields->GetType();
+ if (iType == PDFOBJ_DICTIONARY || iType == PDFOBJ_STRING) {
+ if (iIndex == 0) {
+ pFindObj = pFields;
+ }
+ } else if (iType == PDFOBJ_ARRAY) {
+ pFindObj = ((CPDF_Array*)pFields)->GetElementValue(iIndex);
+ }
+ return pFindObj;
+}
+CPDF_LWinParam CPDF_Action::GetWinParam() const
+{
+ if (m_pDict == NULL) {
+ return NULL;
+ }
+ if (m_pDict->GetString("S") != "Launch") {
+ return NULL;
+ }
+ return m_pDict->GetDict("Win");
+}
+CFX_WideString CPDF_Action::GetJavaScript() const
+{
+ CFX_WideString csJS;
+ if (m_pDict == NULL) {
+ return csJS;
+ }
+ CPDF_Object* pJS = m_pDict->GetElementValue("JS");
+ if (pJS != NULL) {
+ return pJS->GetUnicodeText();
+ }
+ return csJS;
+}
+CPDF_Dictionary* CPDF_Action::GetAnnot() const
+{
+ if (m_pDict == NULL) {
+ return NULL;
+ }
+ CFX_ByteString csType = m_pDict->GetString("S");
+ if (csType == FX_BSTRC("Rendition")) {
+ return m_pDict->GetDict("AN");
+ } else if (csType == FX_BSTRC("Movie")) {
+ return m_pDict->GetDict("Annotation");
+ }
+ return NULL;
+}
+FX_INT32 CPDF_Action::GetOperationType() const
+{
+ if (m_pDict == NULL) {
+ return 0;
+ }
+ CFX_ByteString csType = m_pDict->GetString("S");
+ if (csType == FX_BSTRC("Rendition")) {
+ return m_pDict->GetInteger("OP");
+ } else if (csType == FX_BSTRC("Movie")) {
+ CFX_ByteString csOP = m_pDict->GetString("Operation");
+ if (csOP == FX_BSTRC("Play")) {
+ return 0;
+ } else if (csOP == FX_BSTRC("Stop")) {
+ return 1;
+ } else if (csOP == FX_BSTRC("Pause")) {
+ return 2;
+ } else if (csOP == FX_BSTRC("Resume")) {
+ return 3;
+ }
+ }
+ return 0;
+}
+FX_DWORD CPDF_Action::GetSubActionsCount() const
+{
+ if (m_pDict == NULL || !m_pDict->KeyExist("Next")) {
+ return 0;
+ }
+ CPDF_Object* pNext = m_pDict->GetElementValue("Next");
+ if (!pNext) {
+ return 0;
+ }
+ int iObjType = pNext->GetType();
+ if (iObjType == PDFOBJ_DICTIONARY) {
+ return 1;
+ }
+ if (iObjType == PDFOBJ_ARRAY) {
+ return ((CPDF_Array*)pNext)->GetCount();
+ }
+ return 0;
+}
+CPDF_Action CPDF_Action::GetSubAction(FX_DWORD iIndex) const
+{
+ if (m_pDict == NULL || !m_pDict->KeyExist("Next")) {
+ return NULL;
+ }
+ CPDF_Object* pNext = m_pDict->GetElementValue("Next");
+ int iObjType = pNext->GetType();
+ if (iObjType == PDFOBJ_DICTIONARY) {
+ if (iIndex == 0) {
+ return (CPDF_Dictionary*)pNext;
+ }
+ }
+ if (iObjType == PDFOBJ_ARRAY) {
+ return ((CPDF_Array*)pNext)->GetDict(iIndex);
+ }
+ return NULL;
+}
+const FX_CHAR* g_sAATypes[] = {"E", "X", "D", "U", "Fo", "Bl", "PO", "PC", "PV", "PI",
+ "O", "C",
+ "K", "F", "V", "C",
+ "WC", "WS", "DS", "WP", "DP",
+ ""
+ };
+FX_BOOL CPDF_AAction::ActionExist(AActionType eType) const
+{
+ if (m_pDict == NULL) {
+ return FALSE;
+ }
+ return m_pDict->KeyExist(g_sAATypes[(int)eType]);
+}
+CPDF_Action CPDF_AAction::GetAction(AActionType eType) const
+{
+ if (m_pDict == NULL) {
+ return NULL;
+ }
+ return m_pDict->GetDict(g_sAATypes[(int)eType]);
+}
+FX_POSITION CPDF_AAction::GetStartPos() const
+{
+ if (m_pDict == NULL) {
+ return NULL;
+ }
+ return m_pDict->GetStartPos();
+}
+CPDF_Action CPDF_AAction::GetNextAction(FX_POSITION& pos, AActionType& eType) const
+{
+ if (m_pDict == NULL) {
+ return NULL;
+ }
+ CFX_ByteString csKey;
+ CPDF_Object* pObj = m_pDict->GetNextElement(pos, csKey);
+ if (pObj != NULL) {
+ CPDF_Object* pDirect = pObj->GetDirect();
+ if (pDirect != NULL && pDirect->GetType() == PDFOBJ_DICTIONARY) {
+ int i = 0;
+ while (g_sAATypes[i][0] != '\0') {
+ if (csKey == g_sAATypes[i]) {
+ break;
+ }
+ i ++;
+ }
+ eType = (AActionType)i;
+ return (CPDF_Dictionary*)pDirect;
+ }
+ }
+ return NULL;
+}
+CPDF_DocJSActions::CPDF_DocJSActions(CPDF_Document* pDoc)
+{
+ m_pDocument = pDoc;
+}
+int CPDF_DocJSActions::CountJSActions() const
+{
+ ASSERT(m_pDocument != NULL);
+ CPDF_NameTree name_tree(m_pDocument, FX_BSTRC("JavaScript"));
+ return name_tree.GetCount();
+}
+CPDF_Action CPDF_DocJSActions::GetJSAction(int index, CFX_ByteString& csName) const
+{
+ ASSERT(m_pDocument != NULL);
+ CPDF_NameTree name_tree(m_pDocument, FX_BSTRC("JavaScript"));
+ CPDF_Object *pAction = name_tree.LookupValue(index, csName);
+ if (pAction == NULL || pAction->GetType() != PDFOBJ_DICTIONARY) {
+ return NULL;
+ }
+ return pAction->GetDict();
+}
+CPDF_Action CPDF_DocJSActions::GetJSAction(const CFX_ByteString& csName) const
+{
+ ASSERT(m_pDocument != NULL);
+ CPDF_NameTree name_tree(m_pDocument, FX_BSTRC("JavaScript"));
+ CPDF_Object *pAction = name_tree.LookupValue(csName);
+ if (pAction == NULL || pAction->GetType() != PDFOBJ_DICTIONARY) {
+ return NULL;
+ }
+ return pAction->GetDict();
+}
+int CPDF_DocJSActions::FindJSAction(const CFX_ByteString& csName) const
+{
+ ASSERT(m_pDocument != NULL);
+ CPDF_NameTree name_tree(m_pDocument, FX_BSTRC("JavaScript"));
+ return name_tree.GetIndex(csName);
+}
diff --git a/core/src/fpdfdoc/doc_annot.cpp b/core/src/fpdfdoc/doc_annot.cpp
index da30485073..227578a974 100644
--- a/core/src/fpdfdoc/doc_annot.cpp
+++ b/core/src/fpdfdoc/doc_annot.cpp
@@ -1,519 +1,519 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../include/fpdfdoc/fpdf_doc.h"
-#include "../../include/fpdfapi/fpdf_pageobj.h"
-CPDF_AnnotList::CPDF_AnnotList(CPDF_Page* pPage)
-{
- ASSERT(pPage != NULL);
- m_pPageDict = pPage->m_pFormDict;
- if (m_pPageDict == NULL) {
- return;
- }
- m_pDocument = pPage->m_pDocument;
- CPDF_Array* pAnnots = m_pPageDict->GetArray("Annots");
- if (pAnnots == NULL) {
- return;
- }
- CPDF_Dictionary* pRoot = m_pDocument->GetRoot();
- CPDF_Dictionary* pAcroForm = pRoot->GetDict("AcroForm");
- FX_BOOL bRegenerateAP = pAcroForm && pAcroForm->GetBoolean("NeedAppearances");
- for (FX_DWORD i = 0; i < pAnnots->GetCount(); i ++) {
- CPDF_Dictionary* pDict = (CPDF_Dictionary*)pAnnots->GetElementValue(i);
- if (pDict == NULL || pDict->GetType() != PDFOBJ_DICTIONARY) {
- continue;
- }
- FX_DWORD dwObjNum = pDict->GetObjNum();
- if (dwObjNum == 0) {
- dwObjNum = m_pDocument->AddIndirectObject(pDict);
- CPDF_Reference* pAction = CPDF_Reference::Create(m_pDocument, dwObjNum);
- if (pAction == NULL) {
- break;
- }
- pAnnots->InsertAt(i, pAction);
- pAnnots->RemoveAt(i + 1);
- pDict = pAnnots->GetDict(i);
- }
- CPDF_Annot* pAnnot = FX_NEW CPDF_Annot(pDict);
- if (pAnnot == NULL) {
- break;
- }
- pAnnot->m_pList = this;
- m_AnnotList.Add(pAnnot);
- if (bRegenerateAP && pDict->GetConstString(FX_BSTRC("Subtype")) == FX_BSTRC("Widget"))
- if (CPDF_InterForm::UpdatingAPEnabled()) {
- FPDF_GenerateAP(m_pDocument, pDict);
- }
- }
-}
-CPDF_AnnotList::~CPDF_AnnotList()
-{
- int i = 0;
- for (i = 0; i < m_AnnotList.GetSize(); i ++) {
- delete (CPDF_Annot*)m_AnnotList[i];
- }
- for (i = 0; i < m_Borders.GetSize(); ++i) {
- delete (CPDF_PageObjects*)m_Borders[i];
- }
-}
-void CPDF_AnnotList::DisplayPass(const CPDF_Page* pPage, CFX_RenderDevice* pDevice,
- CPDF_RenderContext* pContext, FX_BOOL bPrinting, CFX_AffineMatrix* pMatrix,
- FX_BOOL bWidgetPass, CPDF_RenderOptions* pOptions, FX_RECT* clip_rect)
-{
- for (int i = 0; i < m_AnnotList.GetSize(); i ++) {
- CPDF_Annot* pAnnot = (CPDF_Annot*)m_AnnotList[i];
- FX_BOOL bWidget = pAnnot->GetSubType() == "Widget";
- if ((bWidgetPass && !bWidget) || (!bWidgetPass && bWidget)) {
- continue;
- }
- FX_DWORD annot_flags = pAnnot->GetFlags();
- if (annot_flags & ANNOTFLAG_HIDDEN) {
- continue;
- }
- if (bPrinting && (annot_flags & ANNOTFLAG_PRINT) == 0) {
- continue;
- }
- if (!bPrinting && (annot_flags & ANNOTFLAG_NOVIEW)) {
- continue;
- }
- if (pOptions != NULL) {
- IPDF_OCContext* pOCContext = pOptions->m_pOCContext;
- CPDF_Dictionary* pAnnotDict = pAnnot->m_pAnnotDict;
- if (pOCContext != NULL && pAnnotDict != NULL &&
- !pOCContext->CheckOCGVisible(pAnnotDict->GetDict(FX_BSTRC("OC")))) {
- continue;
- }
- }
- CPDF_Rect annot_rect_f;
- pAnnot->GetRect(annot_rect_f);
- CFX_Matrix matrix;
- matrix = *pMatrix;
- if (clip_rect) {
- annot_rect_f.Transform(&matrix);
- FX_RECT annot_rect = annot_rect_f.GetOutterRect();
- annot_rect.Intersect(*clip_rect);
- if (annot_rect.IsEmpty()) {
- continue;
- }
- }
- if (pContext) {
- pAnnot->DrawInContext(pPage, pContext, &matrix, CPDF_Annot::Normal);
- } else if (!pAnnot->DrawAppearance(pPage, pDevice, &matrix, CPDF_Annot::Normal, pOptions)) {
- pAnnot->DrawBorder(pDevice, &matrix, pOptions);
- }
- }
-}
-void CPDF_AnnotList::DisplayAnnots(const CPDF_Page* pPage, CFX_RenderDevice* pDevice,
- CFX_AffineMatrix* pUser2Device,
- FX_BOOL bShowWidget, CPDF_RenderOptions* pOptions)
-{
- FX_RECT clip_rect;
- if (pDevice) {
- clip_rect = pDevice->GetClipBox();
- }
- FX_BOOL bPrinting = pDevice->GetDeviceClass() == FXDC_PRINTER || (pOptions && (pOptions->m_Flags & RENDER_PRINTPREVIEW));
- DisplayAnnots(pPage, pDevice, NULL, bPrinting, pUser2Device, bShowWidget ? 3 : 1, pOptions, &clip_rect);
-}
-void CPDF_AnnotList::DisplayAnnots(const CPDF_Page* pPage, CFX_RenderDevice* pDevice, CPDF_RenderContext* pContext,
- FX_BOOL bPrinting, CFX_AffineMatrix* pUser2Device, FX_DWORD dwAnnotFlags,
- CPDF_RenderOptions* pOptions, FX_RECT* pClipRect)
-{
- if (dwAnnotFlags & 0x01) {
- DisplayPass(pPage, pDevice, pContext, bPrinting, pUser2Device, FALSE, pOptions, pClipRect);
- }
- if (dwAnnotFlags & 0x02) {
- DisplayPass(pPage, pDevice, pContext, bPrinting, pUser2Device, TRUE, pOptions, pClipRect);
- }
-}
-int CPDF_AnnotList::GetIndex(CPDF_Annot* pAnnot)
-{
- for (int i = 0; i < m_AnnotList.GetSize(); i ++)
- if (m_AnnotList[i] == (FX_LPVOID)pAnnot) {
- return i;
- }
- return -1;
-}
-CPDF_Annot::CPDF_Annot(CPDF_Dictionary* pDict)
-{
- m_pList = NULL;
- m_pAnnotDict = pDict;
-}
-CPDF_Annot::~CPDF_Annot()
-{
- ClearCachedAP();
-}
-CPDF_Reference* CPDF_Annot::NewAnnotRef()
-{
- if (m_pAnnotDict->GetObjNum() == 0) {
- m_pList->m_pDocument->AddIndirectObject(m_pAnnotDict);
- }
- return CPDF_Reference::Create(m_pList->m_pDocument, m_pAnnotDict->GetObjNum());
-}
-void CPDF_Annot::ClearCachedAP()
-{
- FX_POSITION pos = m_APMap.GetStartPosition();
- while (pos) {
- void* pForm;
- void* pObjects;
- m_APMap.GetNextAssoc(pos, pForm, pObjects);
- delete (CPDF_PageObjects*)pObjects;
- }
- m_APMap.RemoveAll();
-}
-CFX_ByteString CPDF_Annot::GetSubType() const
-{
- return m_pAnnotDict->GetConstString(FX_BSTRC("Subtype"));
-}
-void CPDF_Annot::GetRect(CPDF_Rect& rect) const
-{
- if (m_pAnnotDict == NULL) {
- return;
- }
- rect = m_pAnnotDict->GetRect("Rect");
- rect.Normalize();
-}
-CPDF_Stream* FPDFDOC_GetAnnotAP(CPDF_Dictionary* pAnnotDict, CPDF_Annot::AppearanceMode mode)
-{
- CPDF_Dictionary* pAP = pAnnotDict->GetDict("AP");
- if (pAP == NULL) {
- return NULL;
- }
- const FX_CHAR* ap_entry = "N";
- if (mode == CPDF_Annot::Down) {
- ap_entry = "D";
- } else if (mode == CPDF_Annot::Rollover) {
- ap_entry = "R";
- }
- if (!pAP->KeyExist(ap_entry)) {
- ap_entry = "N";
- }
- CPDF_Object* psub = pAP->GetElementValue(ap_entry);
- if (psub == NULL) {
- return NULL;
- }
- CPDF_Stream* pStream = NULL;
- if (psub->GetType() == PDFOBJ_STREAM) {
- pStream = (CPDF_Stream*)psub;
- } else if (psub->GetType() == PDFOBJ_DICTIONARY) {
- CFX_ByteString as = pAnnotDict->GetString("AS");
- if (as.IsEmpty()) {
- CFX_ByteString value = pAnnotDict->GetString(FX_BSTRC("V"));
- if (value.IsEmpty()) {
- value = pAnnotDict->GetDict(FX_BSTRC("Parent"))->GetString(FX_BSTRC("V"));
- }
- if (value.IsEmpty() || !((CPDF_Dictionary*)psub)->KeyExist(value)) {
- as = FX_BSTRC("Off");
- } else {
- as = value;
- }
- }
- pStream = ((CPDF_Dictionary*)psub)->GetStream(as);
- }
- return pStream;
-}
-CPDF_Form* CPDF_Annot::GetAPForm(const CPDF_Page* pPage, AppearanceMode mode)
-{
- CPDF_Stream* pStream = FPDFDOC_GetAnnotAP(m_pAnnotDict, mode);
- if (pStream == NULL) {
- return NULL;
- }
- CPDF_Form* pForm;
- if (m_APMap.Lookup(pStream, (void*&)pForm)) {
- return pForm;
- }
- pForm = FX_NEW CPDF_Form(m_pList->m_pDocument, pPage->m_pResources, pStream);
- if (pForm == NULL) {
- return NULL;
- }
- pForm->ParseContent(NULL, NULL, NULL, NULL);
- m_APMap.SetAt(pStream, pForm);
- return pForm;
-}
-static CPDF_Form* FPDFDOC_Annot_GetMatrix(const CPDF_Page* pPage, CPDF_Annot* pAnnot, CPDF_Annot::AppearanceMode mode, const CFX_AffineMatrix* pUser2Device, CFX_Matrix &matrix)
-{
- CPDF_Form* pForm = pAnnot->GetAPForm(pPage, mode);
- if (!pForm) {
- return NULL;
- }
- CFX_FloatRect form_bbox = pForm->m_pFormDict->GetRect(FX_BSTRC("BBox"));
- CFX_Matrix form_matrix = pForm->m_pFormDict->GetMatrix(FX_BSTRC("Matrix"));
- form_matrix.TransformRect(form_bbox);
- CPDF_Rect arect;
- pAnnot->GetRect(arect);
- matrix.MatchRect(arect, form_bbox);
- matrix.Concat(*pUser2Device);
- return pForm;
-}
-FX_BOOL CPDF_Annot::DrawAppearance(const CPDF_Page* pPage, CFX_RenderDevice* pDevice, const CFX_AffineMatrix* pUser2Device,
- AppearanceMode mode, const CPDF_RenderOptions* pOptions)
-{
- CFX_Matrix matrix;
- CPDF_Form* pForm = FPDFDOC_Annot_GetMatrix(pPage, this, mode, pUser2Device, matrix);
- if (!pForm) {
- return FALSE;
- }
- CPDF_RenderContext context;
- context.Create((CPDF_Page*)pPage);
- context.DrawObjectList(pDevice, pForm, &matrix, pOptions);
- return TRUE;
-}
-FX_BOOL CPDF_Annot::DrawInContext(const CPDF_Page* pPage, const CPDF_RenderContext* pContext, const CFX_AffineMatrix* pUser2Device, AppearanceMode mode)
-{
- CFX_Matrix matrix;
- CPDF_Form* pForm = FPDFDOC_Annot_GetMatrix(pPage, this, mode, pUser2Device, matrix);
- if (!pForm) {
- return FALSE;
- }
- ((CPDF_RenderContext*)pContext)->AppendObjectList(pForm, &matrix);
- return TRUE;
-}
-CPDF_PageObject* CPDF_Annot::GetBorder(FX_BOOL bPrint, const CPDF_RenderOptions* pOptions)
-{
- if (GetSubType() == "Popup") {
- return NULL;
- }
- FX_DWORD annot_flags = GetFlags();
- if (annot_flags & ANNOTFLAG_HIDDEN) {
- return NULL;
- }
- FX_BOOL bPrinting = bPrint || (pOptions && (pOptions->m_Flags & RENDER_PRINTPREVIEW));
- if (bPrinting && (annot_flags & ANNOTFLAG_PRINT) == 0) {
- return NULL;
- }
- if (!bPrinting && (annot_flags & ANNOTFLAG_NOVIEW)) {
- return NULL;
- }
- CPDF_Dictionary* pBS = m_pAnnotDict->GetDict("BS");
- char style_char;
- FX_FLOAT width;
- CPDF_Array* pDashArray = NULL;
- if (pBS == NULL) {
- CPDF_Array* pBorderArray = m_pAnnotDict->GetArray("Border");
- style_char = 'S';
- if (pBorderArray) {
- width = pBorderArray->GetNumber(2);
- if (pBorderArray->GetCount() == 4) {
- pDashArray = pBorderArray->GetArray(3);
- if (pDashArray == NULL) {
- return NULL;
- }
- style_char = 'D';
- }
- } else {
- width = 1;
- }
- } else {
- CFX_ByteString style = pBS->GetString("S");
- pDashArray = pBS->GetArray("D");
- style_char = style[1];
- width = pBS->GetNumber("W");
- }
- if (width <= 0) {
- return NULL;
- }
- CPDF_Array* pColor = m_pAnnotDict->GetArray("C");
- FX_DWORD argb = 0xff000000;
- if (pColor != NULL) {
- int R = (FX_INT32)(pColor->GetNumber(0) * 255);
- int G = (FX_INT32)(pColor->GetNumber(1) * 255);
- int B = (FX_INT32)(pColor->GetNumber(2) * 255);
- argb = ArgbEncode(0xff, R, G, B);
- }
- CPDF_PathObject *pPathObject = FX_NEW CPDF_PathObject();
- if (!pPathObject) {
- return NULL;
- }
- CPDF_GraphStateData *pGraphState = pPathObject->m_GraphState.GetModify();
- if (!pGraphState) {
- pPathObject->Release();
- return NULL;
- }
- pGraphState->m_LineWidth = width;
- CPDF_ColorStateData *pColorData = pPathObject->m_ColorState.GetModify();
- if (!pColorData) {
- pPathObject->Release();
- return NULL;
- }
- pColorData->m_StrokeRGB = argb;
- pPathObject->m_bStroke = TRUE;
- pPathObject->m_FillType = 0;
- if (style_char == 'D') {
- if (pDashArray) {
- FX_DWORD dash_count = pDashArray->GetCount();
- if (dash_count % 2) {
- dash_count ++;
- }
- pGraphState->m_DashArray = FX_Alloc(FX_FLOAT, dash_count);
- if (pGraphState->m_DashArray == NULL) {
- pPathObject->Release();
- return NULL;
- }
- pGraphState->m_DashCount = dash_count;
- FX_DWORD i;
- for (i = 0; i < pDashArray->GetCount(); i ++) {
- pGraphState->m_DashArray[i] = pDashArray->GetNumber(i);
- }
- if (i < dash_count) {
- pGraphState->m_DashArray[i] = pGraphState->m_DashArray[i - 1];
- }
- } else {
- pGraphState->m_DashArray = FX_Alloc(FX_FLOAT, 2);
- if (pGraphState->m_DashArray == NULL) {
- pPathObject->Release();
- return NULL;
- }
- pGraphState->m_DashCount = 2;
- pGraphState->m_DashArray[0] = pGraphState->m_DashArray[1] = 3 * 1.0f;
- }
- }
- CFX_FloatRect rect;
- GetRect(rect);
- width /= 2;
- CPDF_PathData *pPathData = pPathObject->m_Path.GetModify();
- if (pPathData) {
- pPathData->AppendRect(rect.left + width, rect.bottom + width, rect.right - width, rect.top - width);
- }
- pPathObject->CalcBoundingBox();
- return pPathObject;
-}
-void CPDF_Annot::DrawBorder(CFX_RenderDevice* pDevice, const CFX_AffineMatrix* pUser2Device, const CPDF_RenderOptions* pOptions)
-{
- if (GetSubType() == "Popup") {
- return;
- }
- FX_DWORD annot_flags = GetFlags();
- if (annot_flags & ANNOTFLAG_HIDDEN) {
- return;
- }
- FX_BOOL bPrinting = pDevice->GetDeviceClass() == FXDC_PRINTER || (pOptions && (pOptions->m_Flags & RENDER_PRINTPREVIEW));
- if (bPrinting && (annot_flags & ANNOTFLAG_PRINT) == 0) {
- return;
- }
- if (!bPrinting && (annot_flags & ANNOTFLAG_NOVIEW)) {
- return;
- }
- CPDF_Dictionary* pBS = m_pAnnotDict->GetDict("BS");
- char style_char;
- FX_FLOAT width;
- CPDF_Array* pDashArray = NULL;
- if (pBS == NULL) {
- CPDF_Array* pBorderArray = m_pAnnotDict->GetArray("Border");
- style_char = 'S';
- if (pBorderArray) {
- width = pBorderArray->GetNumber(2);
- if (pBorderArray->GetCount() == 4) {
- pDashArray = pBorderArray->GetArray(3);
- if (pDashArray == NULL) {
- return;
- }
- int nLen = pDashArray->GetCount();
- int i = 0;
- for (; i < nLen; ++i) {
- CPDF_Object*pObj = pDashArray->GetElementValue(i);
- if (pObj && pObj->GetInteger()) {
- break;
- }
- }
- if (i == nLen) {
- return;
- }
- style_char = 'D';
- }
- } else {
- width = 1;
- }
- } else {
- CFX_ByteString style = pBS->GetString("S");
- pDashArray = pBS->GetArray("D");
- style_char = style[1];
- width = pBS->GetNumber("W");
- }
- if (width <= 0) {
- return;
- }
- CPDF_Array* pColor = m_pAnnotDict->GetArray("C");
- FX_DWORD argb = 0xff000000;
- if (pColor != NULL) {
- int R = (FX_INT32)(pColor->GetNumber(0) * 255);
- int G = (FX_INT32)(pColor->GetNumber(1) * 255);
- int B = (FX_INT32)(pColor->GetNumber(2) * 255);
- argb = ArgbEncode(0xff, R, G, B);
- }
- CPDF_GraphStateData graph_state;
- graph_state.m_LineWidth = width;
- if (style_char == 'D') {
- if (pDashArray) {
- FX_DWORD dash_count = pDashArray->GetCount();
- if (dash_count % 2) {
- dash_count ++;
- }
- graph_state.m_DashArray = FX_Alloc(FX_FLOAT, dash_count);
- if (graph_state.m_DashArray == NULL) {
- return ;
- }
- graph_state.m_DashCount = dash_count;
- FX_DWORD i;
- for (i = 0; i < pDashArray->GetCount(); i ++) {
- graph_state.m_DashArray[i] = pDashArray->GetNumber(i);
- }
- if (i < dash_count) {
- graph_state.m_DashArray[i] = graph_state.m_DashArray[i - 1];
- }
- } else {
- graph_state.m_DashArray = FX_Alloc(FX_FLOAT, 2);
- if (graph_state.m_DashArray == NULL) {
- return ;
- }
- graph_state.m_DashCount = 2;
- graph_state.m_DashArray[0] = graph_state.m_DashArray[1] = 3 * 1.0f;
- }
- }
- CFX_FloatRect rect;
- GetRect(rect);
- CPDF_PathData path;
- width /= 2;
- path.AppendRect(rect.left + width, rect.bottom + width, rect.right - width, rect.top - width);
- int fill_type = 0;
- if (pOptions && (pOptions->m_Flags & RENDER_NOPATHSMOOTH)) {
- fill_type |= FXFILL_NOPATHSMOOTH;
- }
- pDevice->DrawPath(&path, pUser2Device, &graph_state, argb, argb, fill_type);
-}
-int CPDF_Annot::CountIRTNotes()
-{
- int count = 0;
- for (int i = 0; i < m_pList->Count(); i ++) {
- CPDF_Annot* pAnnot = m_pList->GetAt(i);
- if (pAnnot == NULL) {
- continue;
- }
- CPDF_Dictionary* pIRT = pAnnot->m_pAnnotDict->GetDict("IRT");
- if (pIRT != m_pAnnotDict) {
- continue;
- }
- count ++;
- }
- return count;
-}
-CPDF_Annot* CPDF_Annot::GetIRTNote(int index)
-{
- int count = 0;
- for (int i = 0; i < m_pList->Count(); i ++) {
- CPDF_Annot* pAnnot = m_pList->GetAt(i);
- if (pAnnot == NULL) {
- continue;
- }
- CPDF_Dictionary* pIRT = pAnnot->m_pAnnotDict->GetDict("IRT");
- if (pIRT != m_pAnnotDict) {
- continue;
- }
- if (count == index) {
- return pAnnot;
- }
- count ++;
- }
- return NULL;
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fpdfdoc/fpdf_doc.h"
+#include "../../include/fpdfapi/fpdf_pageobj.h"
+CPDF_AnnotList::CPDF_AnnotList(CPDF_Page* pPage)
+{
+ ASSERT(pPage != NULL);
+ m_pPageDict = pPage->m_pFormDict;
+ if (m_pPageDict == NULL) {
+ return;
+ }
+ m_pDocument = pPage->m_pDocument;
+ CPDF_Array* pAnnots = m_pPageDict->GetArray("Annots");
+ if (pAnnots == NULL) {
+ return;
+ }
+ CPDF_Dictionary* pRoot = m_pDocument->GetRoot();
+ CPDF_Dictionary* pAcroForm = pRoot->GetDict("AcroForm");
+ FX_BOOL bRegenerateAP = pAcroForm && pAcroForm->GetBoolean("NeedAppearances");
+ for (FX_DWORD i = 0; i < pAnnots->GetCount(); i ++) {
+ CPDF_Dictionary* pDict = (CPDF_Dictionary*)pAnnots->GetElementValue(i);
+ if (pDict == NULL || pDict->GetType() != PDFOBJ_DICTIONARY) {
+ continue;
+ }
+ FX_DWORD dwObjNum = pDict->GetObjNum();
+ if (dwObjNum == 0) {
+ dwObjNum = m_pDocument->AddIndirectObject(pDict);
+ CPDF_Reference* pAction = CPDF_Reference::Create(m_pDocument, dwObjNum);
+ if (pAction == NULL) {
+ break;
+ }
+ pAnnots->InsertAt(i, pAction);
+ pAnnots->RemoveAt(i + 1);
+ pDict = pAnnots->GetDict(i);
+ }
+ CPDF_Annot* pAnnot = FX_NEW CPDF_Annot(pDict);
+ if (pAnnot == NULL) {
+ break;
+ }
+ pAnnot->m_pList = this;
+ m_AnnotList.Add(pAnnot);
+ if (bRegenerateAP && pDict->GetConstString(FX_BSTRC("Subtype")) == FX_BSTRC("Widget"))
+ if (CPDF_InterForm::UpdatingAPEnabled()) {
+ FPDF_GenerateAP(m_pDocument, pDict);
+ }
+ }
+}
+CPDF_AnnotList::~CPDF_AnnotList()
+{
+ int i = 0;
+ for (i = 0; i < m_AnnotList.GetSize(); i ++) {
+ delete (CPDF_Annot*)m_AnnotList[i];
+ }
+ for (i = 0; i < m_Borders.GetSize(); ++i) {
+ delete (CPDF_PageObjects*)m_Borders[i];
+ }
+}
+void CPDF_AnnotList::DisplayPass(const CPDF_Page* pPage, CFX_RenderDevice* pDevice,
+ CPDF_RenderContext* pContext, FX_BOOL bPrinting, CFX_AffineMatrix* pMatrix,
+ FX_BOOL bWidgetPass, CPDF_RenderOptions* pOptions, FX_RECT* clip_rect)
+{
+ for (int i = 0; i < m_AnnotList.GetSize(); i ++) {
+ CPDF_Annot* pAnnot = (CPDF_Annot*)m_AnnotList[i];
+ FX_BOOL bWidget = pAnnot->GetSubType() == "Widget";
+ if ((bWidgetPass && !bWidget) || (!bWidgetPass && bWidget)) {
+ continue;
+ }
+ FX_DWORD annot_flags = pAnnot->GetFlags();
+ if (annot_flags & ANNOTFLAG_HIDDEN) {
+ continue;
+ }
+ if (bPrinting && (annot_flags & ANNOTFLAG_PRINT) == 0) {
+ continue;
+ }
+ if (!bPrinting && (annot_flags & ANNOTFLAG_NOVIEW)) {
+ continue;
+ }
+ if (pOptions != NULL) {
+ IPDF_OCContext* pOCContext = pOptions->m_pOCContext;
+ CPDF_Dictionary* pAnnotDict = pAnnot->m_pAnnotDict;
+ if (pOCContext != NULL && pAnnotDict != NULL &&
+ !pOCContext->CheckOCGVisible(pAnnotDict->GetDict(FX_BSTRC("OC")))) {
+ continue;
+ }
+ }
+ CPDF_Rect annot_rect_f;
+ pAnnot->GetRect(annot_rect_f);
+ CFX_Matrix matrix;
+ matrix = *pMatrix;
+ if (clip_rect) {
+ annot_rect_f.Transform(&matrix);
+ FX_RECT annot_rect = annot_rect_f.GetOutterRect();
+ annot_rect.Intersect(*clip_rect);
+ if (annot_rect.IsEmpty()) {
+ continue;
+ }
+ }
+ if (pContext) {
+ pAnnot->DrawInContext(pPage, pContext, &matrix, CPDF_Annot::Normal);
+ } else if (!pAnnot->DrawAppearance(pPage, pDevice, &matrix, CPDF_Annot::Normal, pOptions)) {
+ pAnnot->DrawBorder(pDevice, &matrix, pOptions);
+ }
+ }
+}
+void CPDF_AnnotList::DisplayAnnots(const CPDF_Page* pPage, CFX_RenderDevice* pDevice,
+ CFX_AffineMatrix* pUser2Device,
+ FX_BOOL bShowWidget, CPDF_RenderOptions* pOptions)
+{
+ FX_RECT clip_rect;
+ if (pDevice) {
+ clip_rect = pDevice->GetClipBox();
+ }
+ FX_BOOL bPrinting = pDevice->GetDeviceClass() == FXDC_PRINTER || (pOptions && (pOptions->m_Flags & RENDER_PRINTPREVIEW));
+ DisplayAnnots(pPage, pDevice, NULL, bPrinting, pUser2Device, bShowWidget ? 3 : 1, pOptions, &clip_rect);
+}
+void CPDF_AnnotList::DisplayAnnots(const CPDF_Page* pPage, CFX_RenderDevice* pDevice, CPDF_RenderContext* pContext,
+ FX_BOOL bPrinting, CFX_AffineMatrix* pUser2Device, FX_DWORD dwAnnotFlags,
+ CPDF_RenderOptions* pOptions, FX_RECT* pClipRect)
+{
+ if (dwAnnotFlags & 0x01) {
+ DisplayPass(pPage, pDevice, pContext, bPrinting, pUser2Device, FALSE, pOptions, pClipRect);
+ }
+ if (dwAnnotFlags & 0x02) {
+ DisplayPass(pPage, pDevice, pContext, bPrinting, pUser2Device, TRUE, pOptions, pClipRect);
+ }
+}
+int CPDF_AnnotList::GetIndex(CPDF_Annot* pAnnot)
+{
+ for (int i = 0; i < m_AnnotList.GetSize(); i ++)
+ if (m_AnnotList[i] == (FX_LPVOID)pAnnot) {
+ return i;
+ }
+ return -1;
+}
+CPDF_Annot::CPDF_Annot(CPDF_Dictionary* pDict)
+{
+ m_pList = NULL;
+ m_pAnnotDict = pDict;
+}
+CPDF_Annot::~CPDF_Annot()
+{
+ ClearCachedAP();
+}
+CPDF_Reference* CPDF_Annot::NewAnnotRef()
+{
+ if (m_pAnnotDict->GetObjNum() == 0) {
+ m_pList->m_pDocument->AddIndirectObject(m_pAnnotDict);
+ }
+ return CPDF_Reference::Create(m_pList->m_pDocument, m_pAnnotDict->GetObjNum());
+}
+void CPDF_Annot::ClearCachedAP()
+{
+ FX_POSITION pos = m_APMap.GetStartPosition();
+ while (pos) {
+ void* pForm;
+ void* pObjects;
+ m_APMap.GetNextAssoc(pos, pForm, pObjects);
+ delete (CPDF_PageObjects*)pObjects;
+ }
+ m_APMap.RemoveAll();
+}
+CFX_ByteString CPDF_Annot::GetSubType() const
+{
+ return m_pAnnotDict->GetConstString(FX_BSTRC("Subtype"));
+}
+void CPDF_Annot::GetRect(CPDF_Rect& rect) const
+{
+ if (m_pAnnotDict == NULL) {
+ return;
+ }
+ rect = m_pAnnotDict->GetRect("Rect");
+ rect.Normalize();
+}
+CPDF_Stream* FPDFDOC_GetAnnotAP(CPDF_Dictionary* pAnnotDict, CPDF_Annot::AppearanceMode mode)
+{
+ CPDF_Dictionary* pAP = pAnnotDict->GetDict("AP");
+ if (pAP == NULL) {
+ return NULL;
+ }
+ const FX_CHAR* ap_entry = "N";
+ if (mode == CPDF_Annot::Down) {
+ ap_entry = "D";
+ } else if (mode == CPDF_Annot::Rollover) {
+ ap_entry = "R";
+ }
+ if (!pAP->KeyExist(ap_entry)) {
+ ap_entry = "N";
+ }
+ CPDF_Object* psub = pAP->GetElementValue(ap_entry);
+ if (psub == NULL) {
+ return NULL;
+ }
+ CPDF_Stream* pStream = NULL;
+ if (psub->GetType() == PDFOBJ_STREAM) {
+ pStream = (CPDF_Stream*)psub;
+ } else if (psub->GetType() == PDFOBJ_DICTIONARY) {
+ CFX_ByteString as = pAnnotDict->GetString("AS");
+ if (as.IsEmpty()) {
+ CFX_ByteString value = pAnnotDict->GetString(FX_BSTRC("V"));
+ if (value.IsEmpty()) {
+ value = pAnnotDict->GetDict(FX_BSTRC("Parent"))->GetString(FX_BSTRC("V"));
+ }
+ if (value.IsEmpty() || !((CPDF_Dictionary*)psub)->KeyExist(value)) {
+ as = FX_BSTRC("Off");
+ } else {
+ as = value;
+ }
+ }
+ pStream = ((CPDF_Dictionary*)psub)->GetStream(as);
+ }
+ return pStream;
+}
+CPDF_Form* CPDF_Annot::GetAPForm(const CPDF_Page* pPage, AppearanceMode mode)
+{
+ CPDF_Stream* pStream = FPDFDOC_GetAnnotAP(m_pAnnotDict, mode);
+ if (pStream == NULL) {
+ return NULL;
+ }
+ CPDF_Form* pForm;
+ if (m_APMap.Lookup(pStream, (void*&)pForm)) {
+ return pForm;
+ }
+ pForm = FX_NEW CPDF_Form(m_pList->m_pDocument, pPage->m_pResources, pStream);
+ if (pForm == NULL) {
+ return NULL;
+ }
+ pForm->ParseContent(NULL, NULL, NULL, NULL);
+ m_APMap.SetAt(pStream, pForm);
+ return pForm;
+}
+static CPDF_Form* FPDFDOC_Annot_GetMatrix(const CPDF_Page* pPage, CPDF_Annot* pAnnot, CPDF_Annot::AppearanceMode mode, const CFX_AffineMatrix* pUser2Device, CFX_Matrix &matrix)
+{
+ CPDF_Form* pForm = pAnnot->GetAPForm(pPage, mode);
+ if (!pForm) {
+ return NULL;
+ }
+ CFX_FloatRect form_bbox = pForm->m_pFormDict->GetRect(FX_BSTRC("BBox"));
+ CFX_Matrix form_matrix = pForm->m_pFormDict->GetMatrix(FX_BSTRC("Matrix"));
+ form_matrix.TransformRect(form_bbox);
+ CPDF_Rect arect;
+ pAnnot->GetRect(arect);
+ matrix.MatchRect(arect, form_bbox);
+ matrix.Concat(*pUser2Device);
+ return pForm;
+}
+FX_BOOL CPDF_Annot::DrawAppearance(const CPDF_Page* pPage, CFX_RenderDevice* pDevice, const CFX_AffineMatrix* pUser2Device,
+ AppearanceMode mode, const CPDF_RenderOptions* pOptions)
+{
+ CFX_Matrix matrix;
+ CPDF_Form* pForm = FPDFDOC_Annot_GetMatrix(pPage, this, mode, pUser2Device, matrix);
+ if (!pForm) {
+ return FALSE;
+ }
+ CPDF_RenderContext context;
+ context.Create((CPDF_Page*)pPage);
+ context.DrawObjectList(pDevice, pForm, &matrix, pOptions);
+ return TRUE;
+}
+FX_BOOL CPDF_Annot::DrawInContext(const CPDF_Page* pPage, const CPDF_RenderContext* pContext, const CFX_AffineMatrix* pUser2Device, AppearanceMode mode)
+{
+ CFX_Matrix matrix;
+ CPDF_Form* pForm = FPDFDOC_Annot_GetMatrix(pPage, this, mode, pUser2Device, matrix);
+ if (!pForm) {
+ return FALSE;
+ }
+ ((CPDF_RenderContext*)pContext)->AppendObjectList(pForm, &matrix);
+ return TRUE;
+}
+CPDF_PageObject* CPDF_Annot::GetBorder(FX_BOOL bPrint, const CPDF_RenderOptions* pOptions)
+{
+ if (GetSubType() == "Popup") {
+ return NULL;
+ }
+ FX_DWORD annot_flags = GetFlags();
+ if (annot_flags & ANNOTFLAG_HIDDEN) {
+ return NULL;
+ }
+ FX_BOOL bPrinting = bPrint || (pOptions && (pOptions->m_Flags & RENDER_PRINTPREVIEW));
+ if (bPrinting && (annot_flags & ANNOTFLAG_PRINT) == 0) {
+ return NULL;
+ }
+ if (!bPrinting && (annot_flags & ANNOTFLAG_NOVIEW)) {
+ return NULL;
+ }
+ CPDF_Dictionary* pBS = m_pAnnotDict->GetDict("BS");
+ char style_char;
+ FX_FLOAT width;
+ CPDF_Array* pDashArray = NULL;
+ if (pBS == NULL) {
+ CPDF_Array* pBorderArray = m_pAnnotDict->GetArray("Border");
+ style_char = 'S';
+ if (pBorderArray) {
+ width = pBorderArray->GetNumber(2);
+ if (pBorderArray->GetCount() == 4) {
+ pDashArray = pBorderArray->GetArray(3);
+ if (pDashArray == NULL) {
+ return NULL;
+ }
+ style_char = 'D';
+ }
+ } else {
+ width = 1;
+ }
+ } else {
+ CFX_ByteString style = pBS->GetString("S");
+ pDashArray = pBS->GetArray("D");
+ style_char = style[1];
+ width = pBS->GetNumber("W");
+ }
+ if (width <= 0) {
+ return NULL;
+ }
+ CPDF_Array* pColor = m_pAnnotDict->GetArray("C");
+ FX_DWORD argb = 0xff000000;
+ if (pColor != NULL) {
+ int R = (FX_INT32)(pColor->GetNumber(0) * 255);
+ int G = (FX_INT32)(pColor->GetNumber(1) * 255);
+ int B = (FX_INT32)(pColor->GetNumber(2) * 255);
+ argb = ArgbEncode(0xff, R, G, B);
+ }
+ CPDF_PathObject *pPathObject = FX_NEW CPDF_PathObject();
+ if (!pPathObject) {
+ return NULL;
+ }
+ CPDF_GraphStateData *pGraphState = pPathObject->m_GraphState.GetModify();
+ if (!pGraphState) {
+ pPathObject->Release();
+ return NULL;
+ }
+ pGraphState->m_LineWidth = width;
+ CPDF_ColorStateData *pColorData = pPathObject->m_ColorState.GetModify();
+ if (!pColorData) {
+ pPathObject->Release();
+ return NULL;
+ }
+ pColorData->m_StrokeRGB = argb;
+ pPathObject->m_bStroke = TRUE;
+ pPathObject->m_FillType = 0;
+ if (style_char == 'D') {
+ if (pDashArray) {
+ FX_DWORD dash_count = pDashArray->GetCount();
+ if (dash_count % 2) {
+ dash_count ++;
+ }
+ pGraphState->m_DashArray = FX_Alloc(FX_FLOAT, dash_count);
+ if (pGraphState->m_DashArray == NULL) {
+ pPathObject->Release();
+ return NULL;
+ }
+ pGraphState->m_DashCount = dash_count;
+ FX_DWORD i;
+ for (i = 0; i < pDashArray->GetCount(); i ++) {
+ pGraphState->m_DashArray[i] = pDashArray->GetNumber(i);
+ }
+ if (i < dash_count) {
+ pGraphState->m_DashArray[i] = pGraphState->m_DashArray[i - 1];
+ }
+ } else {
+ pGraphState->m_DashArray = FX_Alloc(FX_FLOAT, 2);
+ if (pGraphState->m_DashArray == NULL) {
+ pPathObject->Release();
+ return NULL;
+ }
+ pGraphState->m_DashCount = 2;
+ pGraphState->m_DashArray[0] = pGraphState->m_DashArray[1] = 3 * 1.0f;
+ }
+ }
+ CFX_FloatRect rect;
+ GetRect(rect);
+ width /= 2;
+ CPDF_PathData *pPathData = pPathObject->m_Path.GetModify();
+ if (pPathData) {
+ pPathData->AppendRect(rect.left + width, rect.bottom + width, rect.right - width, rect.top - width);
+ }
+ pPathObject->CalcBoundingBox();
+ return pPathObject;
+}
+void CPDF_Annot::DrawBorder(CFX_RenderDevice* pDevice, const CFX_AffineMatrix* pUser2Device, const CPDF_RenderOptions* pOptions)
+{
+ if (GetSubType() == "Popup") {
+ return;
+ }
+ FX_DWORD annot_flags = GetFlags();
+ if (annot_flags & ANNOTFLAG_HIDDEN) {
+ return;
+ }
+ FX_BOOL bPrinting = pDevice->GetDeviceClass() == FXDC_PRINTER || (pOptions && (pOptions->m_Flags & RENDER_PRINTPREVIEW));
+ if (bPrinting && (annot_flags & ANNOTFLAG_PRINT) == 0) {
+ return;
+ }
+ if (!bPrinting && (annot_flags & ANNOTFLAG_NOVIEW)) {
+ return;
+ }
+ CPDF_Dictionary* pBS = m_pAnnotDict->GetDict("BS");
+ char style_char;
+ FX_FLOAT width;
+ CPDF_Array* pDashArray = NULL;
+ if (pBS == NULL) {
+ CPDF_Array* pBorderArray = m_pAnnotDict->GetArray("Border");
+ style_char = 'S';
+ if (pBorderArray) {
+ width = pBorderArray->GetNumber(2);
+ if (pBorderArray->GetCount() == 4) {
+ pDashArray = pBorderArray->GetArray(3);
+ if (pDashArray == NULL) {
+ return;
+ }
+ int nLen = pDashArray->GetCount();
+ int i = 0;
+ for (; i < nLen; ++i) {
+ CPDF_Object*pObj = pDashArray->GetElementValue(i);
+ if (pObj && pObj->GetInteger()) {
+ break;
+ }
+ }
+ if (i == nLen) {
+ return;
+ }
+ style_char = 'D';
+ }
+ } else {
+ width = 1;
+ }
+ } else {
+ CFX_ByteString style = pBS->GetString("S");
+ pDashArray = pBS->GetArray("D");
+ style_char = style[1];
+ width = pBS->GetNumber("W");
+ }
+ if (width <= 0) {
+ return;
+ }
+ CPDF_Array* pColor = m_pAnnotDict->GetArray("C");
+ FX_DWORD argb = 0xff000000;
+ if (pColor != NULL) {
+ int R = (FX_INT32)(pColor->GetNumber(0) * 255);
+ int G = (FX_INT32)(pColor->GetNumber(1) * 255);
+ int B = (FX_INT32)(pColor->GetNumber(2) * 255);
+ argb = ArgbEncode(0xff, R, G, B);
+ }
+ CPDF_GraphStateData graph_state;
+ graph_state.m_LineWidth = width;
+ if (style_char == 'D') {
+ if (pDashArray) {
+ FX_DWORD dash_count = pDashArray->GetCount();
+ if (dash_count % 2) {
+ dash_count ++;
+ }
+ graph_state.m_DashArray = FX_Alloc(FX_FLOAT, dash_count);
+ if (graph_state.m_DashArray == NULL) {
+ return ;
+ }
+ graph_state.m_DashCount = dash_count;
+ FX_DWORD i;
+ for (i = 0; i < pDashArray->GetCount(); i ++) {
+ graph_state.m_DashArray[i] = pDashArray->GetNumber(i);
+ }
+ if (i < dash_count) {
+ graph_state.m_DashArray[i] = graph_state.m_DashArray[i - 1];
+ }
+ } else {
+ graph_state.m_DashArray = FX_Alloc(FX_FLOAT, 2);
+ if (graph_state.m_DashArray == NULL) {
+ return ;
+ }
+ graph_state.m_DashCount = 2;
+ graph_state.m_DashArray[0] = graph_state.m_DashArray[1] = 3 * 1.0f;
+ }
+ }
+ CFX_FloatRect rect;
+ GetRect(rect);
+ CPDF_PathData path;
+ width /= 2;
+ path.AppendRect(rect.left + width, rect.bottom + width, rect.right - width, rect.top - width);
+ int fill_type = 0;
+ if (pOptions && (pOptions->m_Flags & RENDER_NOPATHSMOOTH)) {
+ fill_type |= FXFILL_NOPATHSMOOTH;
+ }
+ pDevice->DrawPath(&path, pUser2Device, &graph_state, argb, argb, fill_type);
+}
+int CPDF_Annot::CountIRTNotes()
+{
+ int count = 0;
+ for (int i = 0; i < m_pList->Count(); i ++) {
+ CPDF_Annot* pAnnot = m_pList->GetAt(i);
+ if (pAnnot == NULL) {
+ continue;
+ }
+ CPDF_Dictionary* pIRT = pAnnot->m_pAnnotDict->GetDict("IRT");
+ if (pIRT != m_pAnnotDict) {
+ continue;
+ }
+ count ++;
+ }
+ return count;
+}
+CPDF_Annot* CPDF_Annot::GetIRTNote(int index)
+{
+ int count = 0;
+ for (int i = 0; i < m_pList->Count(); i ++) {
+ CPDF_Annot* pAnnot = m_pList->GetAt(i);
+ if (pAnnot == NULL) {
+ continue;
+ }
+ CPDF_Dictionary* pIRT = pAnnot->m_pAnnotDict->GetDict("IRT");
+ if (pIRT != m_pAnnotDict) {
+ continue;
+ }
+ if (count == index) {
+ return pAnnot;
+ }
+ count ++;
+ }
+ return NULL;
+}
diff --git a/core/src/fpdfdoc/doc_ap.cpp b/core/src/fpdfdoc/doc_ap.cpp
index 0afe718fcd..784d89daed 100644
--- a/core/src/fpdfdoc/doc_ap.cpp
+++ b/core/src/fpdfdoc/doc_ap.cpp
@@ -1,808 +1,808 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../include/fpdfdoc/fpdf_doc.h"
-#include "../../include/fpdfdoc/fpdf_vt.h"
-#include "pdf_vt.h"
-#include "../../include/fpdfdoc/fpdf_ap.h"
-FX_BOOL FPDF_GenerateAP(CPDF_Document* pDoc, CPDF_Dictionary* pAnnotDict)
-{
- if (pAnnotDict->GetConstString("Subtype") != FX_BSTRC("Widget")) {
- return FALSE;
- }
- CFX_ByteString field_type = FPDF_GetFieldAttr(pAnnotDict, "FT")->GetString();
- FX_DWORD flags = FPDF_GetFieldAttr(pAnnotDict, "Ff")->GetInteger();
- if (field_type == "Tx") {
- return CPVT_GenerateAP::GenerateTextFieldAP(pDoc, pAnnotDict);
- } else if (field_type == "Ch") {
- if (flags & (1 << 17)) {
- return CPVT_GenerateAP::GenerateComboBoxAP(pDoc, pAnnotDict);
- } else {
- return CPVT_GenerateAP::GenerateListBoxAP(pDoc, pAnnotDict);
- }
- } else if (field_type == "Btn") {
- if (!(flags & (1 << 16))) {
- if (!pAnnotDict->KeyExist("AS")) {
- if (CPDF_Dictionary* pParentDict = pAnnotDict->GetDict("Parent")) {
- if (pParentDict->KeyExist("AS")) {
- pAnnotDict->SetAtString("AS", pParentDict->GetString("AS"));
- }
- }
- }
- }
- }
- return FALSE;
-}
-class CPVT_FontMap : public IPVT_FontMap
-{
-public:
- CPVT_FontMap(CPDF_Document * pDoc, CPDF_Dictionary * pResDict, CPDF_Font * pDefFont,
- const CFX_ByteString & sDefFontAlias);
- virtual ~CPVT_FontMap();
- CPDF_Font* GetPDFFont(FX_INT32 nFontIndex);
- CFX_ByteString GetPDFFontAlias(FX_INT32 nFontIndex);
- static void GetAnnotSysPDFFont(CPDF_Document * pDoc, CPDF_Dictionary * pResDict,
- CPDF_Font * & pSysFont, CFX_ByteString & sSysFontAlias);
-private:
- CPDF_Document* m_pDocument;
- CPDF_Dictionary* m_pResDict;
- CPDF_Font* m_pDefFont;
- CFX_ByteString m_sDefFontAlias;
- CPDF_Font* m_pSysFont;
- CFX_ByteString m_sSysFontAlias;
-};
-CPVT_FontMap::CPVT_FontMap(CPDF_Document * pDoc, CPDF_Dictionary * pResDict, CPDF_Font * pDefFont,
- const CFX_ByteString & sDefFontAlias) :
- m_pDocument(pDoc),
- m_pResDict(pResDict),
- m_pDefFont(pDefFont),
- m_sDefFontAlias(sDefFontAlias),
- m_pSysFont(NULL),
- m_sSysFontAlias()
-{
-}
-CPVT_FontMap::~CPVT_FontMap()
-{
-}
-extern CPDF_Font* AddNativeInterFormFont(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument, CFX_ByteString& csNameTag);
-void CPVT_FontMap::GetAnnotSysPDFFont(CPDF_Document * pDoc, CPDF_Dictionary * pResDict,
- CPDF_Font * & pSysFont, CFX_ByteString & sSysFontAlias)
-{
- if (pDoc && pResDict) {
- CFX_ByteString sFontAlias;
- CPDF_Dictionary* pFormDict = pDoc->GetRoot()->GetDict("AcroForm");
- if (CPDF_Font * pPDFFont = AddNativeInterFormFont(pFormDict, pDoc, sSysFontAlias)) {
- if (CPDF_Dictionary * pFontList = pResDict->GetDict("Font")) {
- if (!pFontList->KeyExist(sSysFontAlias)) {
- pFontList->SetAtReference(sSysFontAlias, pDoc, pPDFFont->GetFontDict());
- }
- }
- pSysFont = pPDFFont;
- }
- }
-}
-CPDF_Font* CPVT_FontMap::GetPDFFont(FX_INT32 nFontIndex)
-{
- switch (nFontIndex) {
- case 0:
- return m_pDefFont;
- case 1:
- if (!m_pSysFont) {
- GetAnnotSysPDFFont(m_pDocument, m_pResDict, m_pSysFont, m_sSysFontAlias);
- }
- return m_pSysFont;
- }
- return NULL;
-}
-CFX_ByteString CPVT_FontMap::GetPDFFontAlias(FX_INT32 nFontIndex)
-{
- switch (nFontIndex) {
- case 0:
- return m_sDefFontAlias;
- case 1:
- if (!m_pSysFont) {
- GetAnnotSysPDFFont(m_pDocument, m_pResDict, m_pSysFont, m_sSysFontAlias);
- }
- return m_sSysFontAlias;
- }
- return "";
-}
-CPVT_Provider::CPVT_Provider(IPVT_FontMap * pFontMap) : m_pFontMap(pFontMap)
-{
- ASSERT (m_pFontMap != NULL);
-}
-CPVT_Provider::~CPVT_Provider()
-{
-}
-FX_INT32 CPVT_Provider::GetCharWidth(FX_INT32 nFontIndex, FX_WORD word, FX_INT32 nWordStyle)
-{
- if (CPDF_Font* pPDFFont = m_pFontMap->GetPDFFont(nFontIndex)) {
- FX_DWORD charcode = pPDFFont->CharCodeFromUnicode(word);
- if (charcode != -1) {
- return pPDFFont->GetCharWidthF(charcode);
- }
- }
- return 0;
-}
-FX_INT32 CPVT_Provider::GetTypeAscent(FX_INT32 nFontIndex)
-{
- if (CPDF_Font* pPDFFont = m_pFontMap->GetPDFFont(nFontIndex)) {
- return pPDFFont->GetTypeAscent();
- }
- return 0;
-}
-FX_INT32 CPVT_Provider::GetTypeDescent(FX_INT32 nFontIndex)
-{
- if (CPDF_Font* pPDFFont = m_pFontMap->GetPDFFont(nFontIndex)) {
- return pPDFFont->GetTypeDescent();
- }
- return 0;
-}
-FX_INT32 CPVT_Provider::GetWordFontIndex(FX_WORD word, FX_INT32 charset, FX_INT32 nFontIndex)
-{
- if (CPDF_Font* pDefFont = m_pFontMap->GetPDFFont(0)) {
- if (pDefFont->CharCodeFromUnicode(word) != -1) {
- return 0;
- }
- }
- if (CPDF_Font* pSysFont = m_pFontMap->GetPDFFont(1))
- if (pSysFont->CharCodeFromUnicode(word) != -1) {
- return 1;
- }
- return -1;
-}
-FX_BOOL CPVT_Provider::IsLatinWord(FX_WORD word)
-{
- if ((word >= 0x61 && word <= 0x7A) || (word >= 0x41 && word <= 0x5A) || word == 0x2D || word == 0x27) {
- return TRUE;
- }
- return FALSE;
-}
-FX_INT32 CPVT_Provider::GetDefaultFontIndex()
-{
- return 0;
-}
-static CFX_ByteString GetPDFWordString(IPVT_FontMap * pFontMap, FX_INT32 nFontIndex, FX_WORD Word, FX_WORD SubWord)
-{
- CFX_ByteString sWord;
- if (SubWord > 0) {
- sWord.Format("%c", SubWord);
- } else {
- if (pFontMap) {
- if (CPDF_Font * pPDFFont = pFontMap->GetPDFFont(nFontIndex)) {
- if (pPDFFont->GetBaseFont().Compare("Symbol") == 0 || pPDFFont->GetBaseFont().Compare("ZapfDingbats") == 0) {
- sWord.Format("%c", Word);
- } else {
- FX_DWORD dwCharCode = pPDFFont->CharCodeFromUnicode(Word);
- if (dwCharCode != -1) {
- pPDFFont->AppendChar(sWord, dwCharCode);
- }
- }
- }
- }
- }
- return sWord;
-}
-static CFX_ByteString GetWordRenderString(const CFX_ByteString & strWords)
-{
- if (strWords.GetLength() > 0) {
- return PDF_EncodeString(strWords) + " Tj\n";
- }
- return "";
-}
-static CFX_ByteString GetFontSetString(IPVT_FontMap * pFontMap, FX_INT32 nFontIndex, FX_FLOAT fFontSize)
-{
- CFX_ByteTextBuf sRet;
- if (pFontMap) {
- CFX_ByteString sFontAlias = pFontMap->GetPDFFontAlias(nFontIndex);
- if (sFontAlias.GetLength() > 0 && fFontSize > 0 ) {
- sRet << "/" << sFontAlias << " " << fFontSize << " Tf\n";
- }
- }
- return sRet.GetByteString();
-}
-static CPVT_Color ParseColor(const CFX_ByteString & str)
-{
- CPDF_SimpleParser syntax(str);
- syntax.SetPos(0);
- if (syntax.FindTagParam("g", 1)) {
- return CPVT_Color(CT_GRAY, FX_atof(syntax.GetWord()));
- }
- syntax.SetPos(0);
- if (syntax.FindTagParam("rg", 3)) {
- FX_FLOAT f1 = FX_atof(syntax.GetWord());
- FX_FLOAT f2 = FX_atof(syntax.GetWord());
- FX_FLOAT f3 = FX_atof(syntax.GetWord());
- return CPVT_Color(CT_RGB, f1, f2, f3);
- }
- syntax.SetPos(0);
- if (syntax.FindTagParam("k", 4)) {
- FX_FLOAT f1 = FX_atof(syntax.GetWord());
- FX_FLOAT f2 = FX_atof(syntax.GetWord());
- FX_FLOAT f3 = FX_atof(syntax.GetWord());
- FX_FLOAT f4 = FX_atof(syntax.GetWord());
- return CPVT_Color(CT_CMYK, f1, f2, f3, f4);
- }
- return CPVT_Color(CT_TRANSPARENT);
-}
-static CPVT_Color ParseColor(const CPDF_Array & array)
-{
- CPVT_Color rt;
- switch (array.GetCount()) {
- case 1:
- rt = CPVT_Color(CT_GRAY, array.GetFloat(0));
- break;
- case 3:
- rt = CPVT_Color(CT_RGB, array.GetFloat(0), array.GetFloat(1), array.GetFloat(2));
- break;
- case 4:
- rt = CPVT_Color(CT_CMYK, array.GetFloat(0), array.GetFloat(1), array.GetFloat(2), array.GetFloat(3));
- break;
- }
- return rt;
-}
-static FX_BOOL GenerateWidgetAP(CPDF_Document* pDoc, CPDF_Dictionary* pAnnotDict, const FX_INT32 & nWidgetType)
-{
- CPDF_Dictionary* pFormDict = NULL;
- if (CPDF_Dictionary * pRootDict = pDoc->GetRoot()) {
- pFormDict = pRootDict->GetDict("AcroForm");
- }
- if (!pFormDict) {
- return FALSE;
- }
- CFX_ByteString DA = FPDF_GetFieldAttr(pAnnotDict, "DA")->GetString();
- if (DA.IsEmpty()) {
- DA = pFormDict->GetString("DA");
- }
- if (DA.IsEmpty()) {
- return FALSE;
- }
- CPDF_SimpleParser syntax(DA);
- syntax.FindTagParam("Tf", 2);
- CFX_ByteString sFontName = syntax.GetWord();
- sFontName = PDF_NameDecode(sFontName);
- if (sFontName.IsEmpty()) {
- return FALSE;
- }
- FX_FLOAT fFontSize = FX_atof(syntax.GetWord());
- CPVT_Color crText = ParseColor(DA);
- FX_BOOL bUseFormRes = FALSE;
- CPDF_Dictionary * pFontDict = NULL;
- CPDF_Dictionary* pDRDict = pAnnotDict->GetDict(FX_BSTRC("DR"));
- if (pDRDict == NULL) {
- pDRDict = pFormDict->GetDict(FX_BSTRC("DR"));
- bUseFormRes = TRUE;
- }
- CPDF_Dictionary * pDRFontDict = NULL;
- if ((pDRFontDict = pDRDict->GetDict("Font"))) {
- pFontDict = pDRFontDict->GetDict(sFontName.Mid(1));
- if (!pFontDict && !bUseFormRes) {
- pDRDict = pFormDict->GetDict(FX_BSTRC("DR"));
- pDRFontDict = pDRDict->GetDict("Font");
- if (pDRFontDict) {
- pFontDict = pDRFontDict->GetDict(sFontName.Mid(1));
- }
- }
- }
- if (!pDRFontDict) {
- return FALSE;
- }
- if (!pFontDict) {
- pFontDict = CPDF_Dictionary::Create();
- if (pFontDict == NULL) {
- return FALSE;
- }
- pFontDict->SetAtName(FX_BSTRC("Type"), "Font");
- pFontDict->SetAtName(FX_BSTRC("Subtype"), "Type1");
- pFontDict->SetAtName(FX_BSTRC("BaseFont"), "Helvetica");
- pFontDict->SetAtName(FX_BSTRC("Encoding"), "WinAnsiEncoding");
- pDoc->AddIndirectObject(pFontDict);
- pDRFontDict->SetAtReference(sFontName.Mid(1), pDoc, pFontDict);
- }
- CPDF_Font* pDefFont = pDoc->LoadFont(pFontDict);
- if (!pDefFont) {
- return FALSE;
- }
- CFX_CharMap* pCharMap = pDefFont->GetCharMap();
- CPDF_Rect rcAnnot = pAnnotDict->GetRect("Rect");
- FX_INT32 nRotate = 0;
- if (CPDF_Dictionary * pMKDict = pAnnotDict->GetDict("MK")) {
- nRotate = pMKDict->GetInteger("R");
- }
- CPDF_Rect rcBBox;
- CPDF_Matrix matrix;
- switch (nRotate % 360) {
- case 0:
- rcBBox = CPDF_Rect(0, 0, rcAnnot.right - rcAnnot.left, rcAnnot.top - rcAnnot.bottom);
- break;
- case 90:
- matrix = CPDF_Matrix(0, 1, -1, 0, rcAnnot.right - rcAnnot.left, 0);
- rcBBox = CPDF_Rect(0, 0, rcAnnot.top - rcAnnot.bottom, rcAnnot.right - rcAnnot.left);
- break;
- case 180:
- matrix = CPDF_Matrix(-1, 0, 0, -1, rcAnnot.right - rcAnnot.left, rcAnnot.top - rcAnnot.bottom);
- rcBBox = CPDF_Rect(0, 0, rcAnnot.right - rcAnnot.left, rcAnnot.top - rcAnnot.bottom);
- break;
- case 270:
- matrix = CPDF_Matrix(0, -1, 1, 0, 0, rcAnnot.top - rcAnnot.bottom);
- rcBBox = CPDF_Rect(0, 0, rcAnnot.top - rcAnnot.bottom, rcAnnot.right - rcAnnot.left);
- break;
- }
- FX_INT32 nBorderStyle = PBS_SOLID;
- FX_FLOAT fBorderWidth = 1;
- CPVT_Dash dsBorder(3, 0, 0);
- CPVT_Color crLeftTop, crRightBottom;
- if (CPDF_Dictionary * pBSDict = pAnnotDict->GetDict("BS")) {
- if (pBSDict->KeyExist("W")) {
- fBorderWidth = pBSDict->GetNumber("W");
- }
- if (CPDF_Array * pArray = pBSDict->GetArray("D")) {
- dsBorder = CPVT_Dash(pArray->GetInteger(0), pArray->GetInteger(1), pArray->GetInteger(2));
- }
- switch (pBSDict->GetString("S").GetAt(0)) {
- case 'S':
- nBorderStyle = PBS_SOLID;
- break;
- case 'D':
- nBorderStyle = PBS_DASH;
- break;
- case 'B':
- nBorderStyle = PBS_BEVELED;
- fBorderWidth *= 2;
- crLeftTop = CPVT_Color(CT_GRAY, 1);
- crRightBottom = CPVT_Color(CT_GRAY, 0.5);
- break;
- case 'I':
- nBorderStyle = PBS_INSET;
- fBorderWidth *= 2;
- crLeftTop = CPVT_Color(CT_GRAY, 0.5);
- crRightBottom = CPVT_Color(CT_GRAY, 0.75);
- break;
- case 'U':
- nBorderStyle = PBS_UNDERLINED;
- break;
- }
- }
- CPVT_Color crBorder, crBG;
- if (CPDF_Dictionary * pMKDict = pAnnotDict->GetDict("MK")) {
- if (CPDF_Array * pArray = pMKDict->GetArray("BC")) {
- crBorder = ParseColor(*pArray);
- }
- if (CPDF_Array * pArray = pMKDict->GetArray("BG")) {
- crBG = ParseColor(*pArray);
- }
- }
- CFX_ByteTextBuf sAppStream;
- CFX_ByteString sBG = CPVT_GenerateAP::GenerateColorAP(crBG, TRUE);
- if (sBG.GetLength() > 0) {
- sAppStream << "q\n" << sBG << rcBBox.left << " " << rcBBox.bottom << " "
- << rcBBox.Width() << " " << rcBBox.Height() << " re f\n" << "Q\n";
- }
- CFX_ByteString sBorderStream = CPVT_GenerateAP::GenerateBorderAP(rcBBox, fBorderWidth,
- crBorder, crLeftTop, crRightBottom, nBorderStyle, dsBorder);
- if (sBorderStream.GetLength() > 0) {
- sAppStream << "q\n" << sBorderStream << "Q\n";
- }
- CPDF_Rect rcBody = CPDF_Rect(rcBBox.left + fBorderWidth, rcBBox.bottom + fBorderWidth,
- rcBBox.right - fBorderWidth, rcBBox.top - fBorderWidth);
- rcBody.Normalize();
- CPDF_Dictionary* pAPDict = pAnnotDict->GetDict("AP");
- if (pAPDict == NULL) {
- pAPDict = CPDF_Dictionary::Create();
- if (pAPDict == NULL) {
- return FALSE;
- }
- pAnnotDict->SetAt("AP", pAPDict);
- }
- CPDF_Stream* pNormalStream = pAPDict->GetStream("N");
- if (pNormalStream == NULL) {
- pNormalStream = CPDF_Stream::Create(NULL, 0, NULL);
- if (pNormalStream == NULL) {
- return FALSE;
- }
- FX_INT32 objnum = pDoc->AddIndirectObject(pNormalStream);
- pAnnotDict->GetDict("AP")->SetAtReference("N", pDoc, objnum);
- }
- CPDF_Dictionary * pStreamDict = pNormalStream->GetDict();
- if (pStreamDict) {
- pStreamDict->SetAtMatrix("Matrix", matrix);
- pStreamDict->SetAtRect("BBox", rcBBox);
- CPDF_Dictionary* pStreamResList = pStreamDict->GetDict("Resources");
- if (pStreamResList) {
- CPDF_Dictionary* pStreamResFontList = pStreamResList->GetDict("Font");
- if (!pStreamResFontList) {
- pStreamResFontList = CPDF_Dictionary::Create();
- if (pStreamResFontList == NULL) {
- return FALSE;
- }
- pStreamResList->SetAt("Font", pStreamResFontList);
- }
- if (!pStreamResFontList->KeyExist(sFontName)) {
- pStreamResFontList->SetAtReference(sFontName, pDoc, pFontDict);
- }
- } else {
- pStreamDict->SetAt("Resources", pFormDict->GetDict("DR")->Clone());
- pStreamResList = pStreamDict->GetDict("Resources");
- }
- }
- switch (nWidgetType) {
- case 0: {
- CFX_WideString swValue = FPDF_GetFieldAttr(pAnnotDict, "V")->GetUnicodeText();
- FX_INT32 nAlign = FPDF_GetFieldAttr(pAnnotDict, "Q")->GetInteger();
- FX_DWORD dwFlags = FPDF_GetFieldAttr(pAnnotDict, "Ff")->GetInteger();
- FX_DWORD dwMaxLen = FPDF_GetFieldAttr(pAnnotDict, "MaxLen")->GetInteger();
- CPVT_FontMap map(pDoc, pStreamDict->GetDict("Resources"), pDefFont, sFontName.Right(sFontName.GetLength() - 1));
- CPVT_Provider prd(&map);
- CPDF_VariableText vt;
- vt.SetProvider(&prd);
- vt.SetPlateRect(rcBody);
- vt.SetAlignment(nAlign);
- if (IsFloatZero(fFontSize)) {
- vt.SetAutoFontSize(TRUE);
- } else {
- vt.SetFontSize(fFontSize);
- }
- FX_BOOL bMultiLine = (dwFlags >> 12) & 1;
- if (bMultiLine) {
- vt.SetMultiLine(TRUE);
- vt.SetAutoReturn(TRUE);
- }
- FX_WORD subWord = 0;
- if ((dwFlags >> 13) & 1) {
- subWord = '*';
- vt.SetPasswordChar(subWord);
- }
- FX_BOOL bCharArray = (dwFlags >> 24) & 1;
- if (bCharArray) {
- vt.SetCharArray(dwMaxLen);
- } else {
- vt.SetLimitChar(dwMaxLen);
- }
- vt.Initialize();
- vt.SetText(swValue);
- vt.RearrangeAll();
- CPDF_Rect rcContent = vt.GetContentRect();
- CPDF_Point ptOffset(0.0f, 0.0f);
- if (!bMultiLine) {
- ptOffset = CPDF_Point(0.0f, (rcContent.Height() - rcBody.Height()) / 2.0f);
- }
- CFX_ByteString sBody = CPVT_GenerateAP::GenerateEditAP(&map, vt.GetIterator(), ptOffset, !bCharArray, subWord);
- if (sBody.GetLength() > 0) {
- sAppStream << "/Tx BMC\n" << "q\n";
- if (rcContent.Width() > rcBody.Width() ||
- rcContent.Height() > rcBody.Height()) {
- sAppStream << rcBody.left << " " << rcBody.bottom << " "
- << rcBody.Width() << " " << rcBody.Height() << " re\nW\nn\n";
- }
- sAppStream << "BT\n" << CPVT_GenerateAP::GenerateColorAP(crText, TRUE) << sBody << "ET\n" << "Q\nEMC\n";
- }
- }
- break;
- case 1: {
- CFX_WideString swValue = FPDF_GetFieldAttr(pAnnotDict, "V")->GetUnicodeText();
- CPVT_FontMap map(pDoc, pStreamDict->GetDict("Resources"), pDefFont, sFontName.Right(sFontName.GetLength() - 1));
- CPVT_Provider prd(&map);
- CPDF_VariableText vt;
- vt.SetProvider(&prd);
- CPDF_Rect rcButton = rcBody;
- rcButton.left = rcButton.right - 13;
- rcButton.Normalize();
- CPDF_Rect rcEdit = rcBody;
- rcEdit.right = rcButton.left;
- rcEdit.Normalize();
- vt.SetPlateRect(rcEdit);
- if (IsFloatZero(fFontSize)) {
- vt.SetAutoFontSize(TRUE);
- } else {
- vt.SetFontSize(fFontSize);
- }
- vt.Initialize();
- vt.SetText(swValue);
- vt.RearrangeAll();
- CPDF_Rect rcContent = vt.GetContentRect();
- CPDF_Point ptOffset = CPDF_Point(0.0f, (rcContent.Height() - rcEdit.Height()) / 2.0f);
- CFX_ByteString sEdit = CPVT_GenerateAP::GenerateEditAP(&map, vt.GetIterator(), ptOffset, TRUE, 0);
- if (sEdit.GetLength() > 0) {
- sAppStream << "/Tx BMC\n" << "q\n";
- sAppStream << rcEdit.left << " " << rcEdit.bottom << " "
- << rcEdit.Width() << " " << rcEdit.Height() << " re\nW\nn\n";
- sAppStream << "BT\n" << CPVT_GenerateAP::GenerateColorAP(crText, TRUE) << sEdit << "ET\n" << "Q\nEMC\n";
- }
- CFX_ByteString sButton = CPVT_GenerateAP::GenerateColorAP(CPVT_Color(CT_RGB, 220.0f / 255.0f, 220.0f / 255.0f, 220.0f / 255.0f), TRUE);
- if (sButton.GetLength() > 0 && !rcButton.IsEmpty()) {
- sAppStream << "q\n" << sButton;
- sAppStream << rcButton.left << " " << rcButton.bottom << " "
- << rcButton.Width() << " " << rcButton.Height() << " re f\n";
- sAppStream << "Q\n";
- CFX_ByteString sButtonBorder = CPVT_GenerateAP::GenerateBorderAP(rcButton, 2, CPVT_Color(CT_GRAY, 0), CPVT_Color(CT_GRAY, 1), CPVT_Color(CT_GRAY, 0.5), PBS_BEVELED, CPVT_Dash(3, 0, 0));
- if (sButtonBorder.GetLength() > 0) {
- sAppStream << "q\n" << sButtonBorder << "Q\n";
- }
- CPDF_Point ptCenter = CPDF_Point((rcButton.left + rcButton.right) / 2, (rcButton.top + rcButton.bottom) / 2);
- if (IsFloatBigger(rcButton.Width(), 6) && IsFloatBigger(rcButton.Height(), 6)) {
- sAppStream << "q\n" << " 0 g\n";
- sAppStream << ptCenter.x - 3 << " " << ptCenter.y + 1.5f << " m\n";
- sAppStream << ptCenter.x + 3 << " " << ptCenter.y + 1.5f << " l\n";
- sAppStream << ptCenter.x << " " << ptCenter.y - 1.5f << " l\n";
- sAppStream << ptCenter.x - 3 << " " << ptCenter.y + 1.5f << " l f\n";
- sAppStream << sButton << "Q\n";
- }
- }
- }
- break;
- case 2: {
- CPVT_FontMap map(pDoc, pStreamDict->GetDict("Resources"), pDefFont, sFontName.Right(sFontName.GetLength() - 1));
- CPVT_Provider prd(&map);
- CPDF_Array * pOpts = FPDF_GetFieldAttr(pAnnotDict, "Opt")->GetArray();
- CPDF_Array * pSels = FPDF_GetFieldAttr(pAnnotDict, "I")->GetArray();
- FX_INT32 nTop = FPDF_GetFieldAttr(pAnnotDict, "TI")->GetInteger();
- CFX_ByteTextBuf sBody;
- if (pOpts) {
- FX_FLOAT fy = rcBody.top;
- for (FX_INT32 i = nTop, sz = pOpts->GetCount(); i < sz; i++) {
- if (IsFloatSmaller(fy, rcBody.bottom)) {
- break;
- }
- if (CPDF_Object* pOpt = pOpts->GetElementValue(i)) {
- CFX_WideString swItem;
- if (pOpt->GetType() == PDFOBJ_STRING) {
- swItem = pOpt->GetUnicodeText();
- } else if (pOpt->GetType() == PDFOBJ_ARRAY) {
- swItem = ((CPDF_Array*)pOpt)->GetElementValue(1)->GetUnicodeText();
- }
- FX_BOOL bSelected = FALSE;
- if (pSels) {
- for (FX_DWORD s = 0, ssz = pSels->GetCount(); s < ssz; s++) {
- if (i == pSels->GetInteger(s)) {
- bSelected = TRUE;
- break;
- }
- }
- }
- CPDF_VariableText vt;
- vt.SetProvider(&prd);
- vt.SetPlateRect(CPDF_Rect(rcBody.left, 0.0f, rcBody.right, 0.0f));
- if (IsFloatZero(fFontSize)) {
- vt.SetFontSize(12.0f);
- } else {
- vt.SetFontSize(fFontSize);
- }
- vt.Initialize();
- vt.SetText(swItem);
- vt.RearrangeAll();
- FX_FLOAT fItemHeight = vt.GetContentRect().Height();
- if (bSelected) {
- CPDF_Rect rcItem = CPDF_Rect(rcBody.left, fy - fItemHeight, rcBody.right, fy);
- sBody << "q\n" << CPVT_GenerateAP::GenerateColorAP(CPVT_Color(CT_RGB, 0, 51.0f / 255.0f, 113.0f / 255.0f), TRUE)
- << rcItem.left << " " << rcItem.bottom << " " << rcItem.Width() << " " << rcItem.Height() << " re f\n" << "Q\n";
- sBody << "BT\n" << CPVT_GenerateAP::GenerateColorAP(CPVT_Color(CT_GRAY, 1), TRUE) << CPVT_GenerateAP::GenerateEditAP(&map, vt.GetIterator(), CPDF_Point(0.0f, fy), TRUE, 0) << "ET\n";
- } else {
- sBody << "BT\n" << CPVT_GenerateAP::GenerateColorAP(crText, TRUE) << CPVT_GenerateAP::GenerateEditAP(&map, vt.GetIterator(), CPDF_Point(0.0f, fy), TRUE, 0) << "ET\n";
- }
- fy -= fItemHeight;
- }
- }
- }
- if (sBody.GetSize() > 0) {
- sAppStream << "/Tx BMC\n" << "q\n";
- sAppStream << rcBody.left << " " << rcBody.bottom << " "
- << rcBody.Width() << " " << rcBody.Height() << " re\nW\nn\n";
- sAppStream << sBody.GetByteString() << "Q\nEMC\n";
- }
- }
- break;
- }
- if (pNormalStream) {
- pNormalStream->SetData((FX_BYTE*)sAppStream.GetBuffer(), sAppStream.GetSize(), FALSE, FALSE);
- pStreamDict = pNormalStream->GetDict();
- if (pStreamDict) {
- pStreamDict->SetAtMatrix("Matrix", matrix);
- pStreamDict->SetAtRect("BBox", rcBBox);
- CPDF_Dictionary* pStreamResList = pStreamDict->GetDict("Resources");
- if (pStreamResList) {
- CPDF_Dictionary* pStreamResFontList = pStreamResList->GetDict("Font");
- if (!pStreamResFontList) {
- pStreamResFontList = CPDF_Dictionary::Create();
- if (pStreamResFontList == NULL) {
- return FALSE;
- }
- pStreamResList->SetAt("Font", pStreamResFontList);
- }
- if (!pStreamResFontList->KeyExist(sFontName)) {
- pStreamResFontList->SetAtReference(sFontName, pDoc, pFontDict);
- }
- } else {
- pStreamDict->SetAt("Resources", pFormDict->GetDict("DR")->Clone());
- pStreamResList = pStreamDict->GetDict("Resources");
- }
- }
- }
- return TRUE;
-}
-FX_BOOL CPVT_GenerateAP::GenerateTextFieldAP(CPDF_Document* pDoc, CPDF_Dictionary* pAnnotDict)
-{
- return GenerateWidgetAP(pDoc, pAnnotDict, 0);
-}
-FX_BOOL CPVT_GenerateAP::GenerateComboBoxAP(CPDF_Document* pDoc, CPDF_Dictionary* pAnnotDict)
-{
- return GenerateWidgetAP(pDoc, pAnnotDict, 1);
-}
-FX_BOOL CPVT_GenerateAP::GenerateListBoxAP(CPDF_Document* pDoc, CPDF_Dictionary* pAnnotDict)
-{
- return GenerateWidgetAP(pDoc, pAnnotDict, 2);
-}
-CFX_ByteString CPVT_GenerateAP::GenerateEditAP(IPVT_FontMap * pFontMap, IPDF_VariableText_Iterator* pIterator, const CPDF_Point & ptOffset, FX_BOOL bContinuous, FX_WORD SubWord, const CPVT_WordRange * pVisible)
-{
- CFX_ByteTextBuf sEditStream, sLineStream, sWords;
- CPDF_Point ptOld(0.0f, 0.0f), ptNew(0.0f, 0.0f);
- FX_INT32 nCurFontIndex = -1;
- if (pIterator) {
- if (pVisible) {
- pIterator->SetAt(pVisible->BeginPos);
- } else {
- pIterator->SetAt(0);
- }
- CPVT_WordPlace oldplace;
- while (pIterator->NextWord()) {
- CPVT_WordPlace place = pIterator->GetAt();
- if (pVisible && place.WordCmp(pVisible->EndPos) > 0) {
- break;
- }
- if (bContinuous) {
- if (place.LineCmp(oldplace) != 0) {
- if (sWords.GetSize() > 0) {
- sLineStream << GetWordRenderString(sWords.GetByteString());
- sEditStream << sLineStream;
- sLineStream.Clear();
- sWords.Clear();
- }
- CPVT_Word word;
- if (pIterator->GetWord(word)) {
- ptNew = CPDF_Point(word.ptWord.x + ptOffset.x, word.ptWord.y + ptOffset.y);
- } else {
- CPVT_Line line;
- pIterator->GetLine(line);
- ptNew = CPDF_Point(line.ptLine.x + ptOffset.x, line.ptLine.y + ptOffset.y);
- }
- if (ptNew.x != ptOld.x || ptNew.y != ptOld.y) {
- sLineStream << ptNew.x - ptOld.x << " " << ptNew.y - ptOld.y << " Td\n";
- ptOld = ptNew;
- }
- }
- CPVT_Word word;
- if (pIterator->GetWord(word)) {
- if (word.nFontIndex != nCurFontIndex) {
- if (sWords.GetSize() > 0) {
- sLineStream << GetWordRenderString(sWords.GetByteString());
- sWords.Clear();
- }
- sLineStream << GetFontSetString(pFontMap, word.nFontIndex, word.fFontSize);
- nCurFontIndex = word.nFontIndex;
- }
- sWords << GetPDFWordString(pFontMap, nCurFontIndex, word.Word, SubWord);
- }
- oldplace = place;
- } else {
- CPVT_Word word;
- if (pIterator->GetWord(word)) {
- ptNew = CPDF_Point(word.ptWord.x + ptOffset.x, word.ptWord.y + ptOffset.y);
- if (ptNew.x != ptOld.x || ptNew.y != ptOld.y) {
- sEditStream << ptNew.x - ptOld.x << " " << ptNew.y - ptOld.y << " Td\n";
- ptOld = ptNew;
- }
- if (word.nFontIndex != nCurFontIndex) {
- sEditStream << GetFontSetString(pFontMap, word.nFontIndex, word.fFontSize);
- nCurFontIndex = word.nFontIndex;
- }
- sEditStream << GetWordRenderString(GetPDFWordString(pFontMap, nCurFontIndex, word.Word, SubWord));
- }
- }
- }
- if (sWords.GetSize() > 0) {
- sLineStream << GetWordRenderString(sWords.GetByteString());
- sEditStream << sLineStream;
- sWords.Clear();
- }
- }
- return sEditStream.GetByteString();
-}
-CFX_ByteString CPVT_GenerateAP::GenerateBorderAP(const CPDF_Rect & rect, FX_FLOAT fWidth,
- const CPVT_Color & color, const CPVT_Color & crLeftTop, const CPVT_Color & crRightBottom,
- FX_INT32 nStyle, const CPVT_Dash & dash)
-{
- CFX_ByteTextBuf sAppStream;
- CFX_ByteString sColor;
- FX_FLOAT fLeft = rect.left;
- FX_FLOAT fRight = rect.right;
- FX_FLOAT fTop = rect.top;
- FX_FLOAT fBottom = rect.bottom;
- if (fWidth > 0.0f) {
- FX_FLOAT fHalfWidth = fWidth / 2.0f;
- switch (nStyle) {
- default:
- case PBS_SOLID:
- sColor = GenerateColorAP(color, TRUE);
- if (sColor.GetLength() > 0) {
- sAppStream << sColor;
- sAppStream << fLeft << " " << fBottom << " " << fRight - fLeft << " " << fTop - fBottom << " re\n";
- sAppStream << fLeft + fWidth << " " << fBottom + fWidth << " "
- << fRight - fLeft - fWidth * 2 << " " << fTop - fBottom - fWidth * 2 << " re\n";
- sAppStream << "f*\n";
- }
- break;
- case PBS_DASH:
- sColor = GenerateColorAP(color, FALSE);
- if (sColor.GetLength() > 0) {
- sAppStream << sColor;
- sAppStream << fWidth << " w" << " [" << dash.nDash << " " << dash.nGap << "] " << dash.nPhase << " d\n";
- sAppStream << fLeft + fWidth / 2 << " " << fBottom + fWidth / 2 << " m\n";
- sAppStream << fLeft + fWidth / 2 << " " << fTop - fWidth / 2 << " l\n";
- sAppStream << fRight - fWidth / 2 << " " << fTop - fWidth / 2 << " l\n";
- sAppStream << fRight - fWidth / 2 << " " << fBottom + fWidth / 2 << " l\n";
- sAppStream << fLeft + fWidth / 2 << " " << fBottom + fWidth / 2 << " l S\n";
- }
- break;
- case PBS_BEVELED:
- case PBS_INSET:
- sColor = GenerateColorAP(crLeftTop, TRUE);
- if (sColor.GetLength() > 0) {
- sAppStream << sColor;
- sAppStream << fLeft + fHalfWidth << " " << fBottom + fHalfWidth << " m\n";
- sAppStream << fLeft + fHalfWidth << " " << fTop - fHalfWidth << " l\n";
- sAppStream << fRight - fHalfWidth << " " << fTop - fHalfWidth << " l\n";
- sAppStream << fRight - fHalfWidth * 2 << " " << fTop - fHalfWidth * 2 << " l\n";
- sAppStream << fLeft + fHalfWidth * 2 << " " << fTop - fHalfWidth * 2 << " l\n";
- sAppStream << fLeft + fHalfWidth * 2 << " " << fBottom + fHalfWidth * 2 << " l f\n";
- }
- sColor = GenerateColorAP(crRightBottom, TRUE);
- if (sColor.GetLength() > 0) {
- sAppStream << sColor;
- sAppStream << fRight - fHalfWidth << " " << fTop - fHalfWidth << " m\n";
- sAppStream << fRight - fHalfWidth << " " << fBottom + fHalfWidth << " l\n";
- sAppStream << fLeft + fHalfWidth << " " << fBottom + fHalfWidth << " l\n";
- sAppStream << fLeft + fHalfWidth * 2 << " " << fBottom + fHalfWidth * 2 << " l\n";
- sAppStream << fRight - fHalfWidth * 2 << " " << fBottom + fHalfWidth * 2 << " l\n";
- sAppStream << fRight - fHalfWidth * 2 << " " << fTop - fHalfWidth * 2 << " l f\n";
- }
- sColor = GenerateColorAP(color, TRUE);
- if (sColor.GetLength() > 0) {
- sAppStream << sColor;
- sAppStream << fLeft << " " << fBottom << " " << fRight - fLeft << " " << fTop - fBottom << " re\n";
- sAppStream << fLeft + fHalfWidth << " " << fBottom + fHalfWidth << " "
- << fRight - fLeft - fHalfWidth * 2 << " " << fTop - fBottom - fHalfWidth * 2 << " re f*\n";
- }
- break;
- case PBS_UNDERLINED:
- sColor = GenerateColorAP(color, FALSE);
- if (sColor.GetLength() > 0) {
- sAppStream << sColor;
- sAppStream << fWidth << " w\n";
- sAppStream << fLeft << " " << fBottom + fWidth / 2 << " m\n";
- sAppStream << fRight << " " << fBottom + fWidth / 2 << " l S\n";
- }
- break;
- }
- }
- return sAppStream.GetByteString();
-}
-CFX_ByteString CPVT_GenerateAP::GenerateColorAP(const CPVT_Color & color, const FX_BOOL & bFillOrStroke)
-{
- CFX_ByteTextBuf sColorStream;
- switch (color.nColorType) {
- case CT_RGB:
- sColorStream << color.fColor1 << " " << color.fColor2 << " " << color.fColor3 << " "
- << (bFillOrStroke ? "rg" : "RG") << "\n";
- break;
- case CT_GRAY:
- sColorStream << color.fColor1 << " " << (bFillOrStroke ? "g" : "G") << "\n";
- break;
- case CT_CMYK:
- sColorStream << color.fColor1 << " " << color.fColor2 << " " << color.fColor3 << " " << color.fColor4 << " "
- << (bFillOrStroke ? "k" : "K") << "\n";
- break;
- }
- return sColorStream.GetByteString();
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fpdfdoc/fpdf_doc.h"
+#include "../../include/fpdfdoc/fpdf_vt.h"
+#include "pdf_vt.h"
+#include "../../include/fpdfdoc/fpdf_ap.h"
+FX_BOOL FPDF_GenerateAP(CPDF_Document* pDoc, CPDF_Dictionary* pAnnotDict)
+{
+ if (pAnnotDict->GetConstString("Subtype") != FX_BSTRC("Widget")) {
+ return FALSE;
+ }
+ CFX_ByteString field_type = FPDF_GetFieldAttr(pAnnotDict, "FT")->GetString();
+ FX_DWORD flags = FPDF_GetFieldAttr(pAnnotDict, "Ff")->GetInteger();
+ if (field_type == "Tx") {
+ return CPVT_GenerateAP::GenerateTextFieldAP(pDoc, pAnnotDict);
+ } else if (field_type == "Ch") {
+ if (flags & (1 << 17)) {
+ return CPVT_GenerateAP::GenerateComboBoxAP(pDoc, pAnnotDict);
+ } else {
+ return CPVT_GenerateAP::GenerateListBoxAP(pDoc, pAnnotDict);
+ }
+ } else if (field_type == "Btn") {
+ if (!(flags & (1 << 16))) {
+ if (!pAnnotDict->KeyExist("AS")) {
+ if (CPDF_Dictionary* pParentDict = pAnnotDict->GetDict("Parent")) {
+ if (pParentDict->KeyExist("AS")) {
+ pAnnotDict->SetAtString("AS", pParentDict->GetString("AS"));
+ }
+ }
+ }
+ }
+ }
+ return FALSE;
+}
+class CPVT_FontMap : public IPVT_FontMap
+{
+public:
+ CPVT_FontMap(CPDF_Document * pDoc, CPDF_Dictionary * pResDict, CPDF_Font * pDefFont,
+ const CFX_ByteString & sDefFontAlias);
+ virtual ~CPVT_FontMap();
+ CPDF_Font* GetPDFFont(FX_INT32 nFontIndex);
+ CFX_ByteString GetPDFFontAlias(FX_INT32 nFontIndex);
+ static void GetAnnotSysPDFFont(CPDF_Document * pDoc, CPDF_Dictionary * pResDict,
+ CPDF_Font * & pSysFont, CFX_ByteString & sSysFontAlias);
+private:
+ CPDF_Document* m_pDocument;
+ CPDF_Dictionary* m_pResDict;
+ CPDF_Font* m_pDefFont;
+ CFX_ByteString m_sDefFontAlias;
+ CPDF_Font* m_pSysFont;
+ CFX_ByteString m_sSysFontAlias;
+};
+CPVT_FontMap::CPVT_FontMap(CPDF_Document * pDoc, CPDF_Dictionary * pResDict, CPDF_Font * pDefFont,
+ const CFX_ByteString & sDefFontAlias) :
+ m_pDocument(pDoc),
+ m_pResDict(pResDict),
+ m_pDefFont(pDefFont),
+ m_sDefFontAlias(sDefFontAlias),
+ m_pSysFont(NULL),
+ m_sSysFontAlias()
+{
+}
+CPVT_FontMap::~CPVT_FontMap()
+{
+}
+extern CPDF_Font* AddNativeInterFormFont(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument, CFX_ByteString& csNameTag);
+void CPVT_FontMap::GetAnnotSysPDFFont(CPDF_Document * pDoc, CPDF_Dictionary * pResDict,
+ CPDF_Font * & pSysFont, CFX_ByteString & sSysFontAlias)
+{
+ if (pDoc && pResDict) {
+ CFX_ByteString sFontAlias;
+ CPDF_Dictionary* pFormDict = pDoc->GetRoot()->GetDict("AcroForm");
+ if (CPDF_Font * pPDFFont = AddNativeInterFormFont(pFormDict, pDoc, sSysFontAlias)) {
+ if (CPDF_Dictionary * pFontList = pResDict->GetDict("Font")) {
+ if (!pFontList->KeyExist(sSysFontAlias)) {
+ pFontList->SetAtReference(sSysFontAlias, pDoc, pPDFFont->GetFontDict());
+ }
+ }
+ pSysFont = pPDFFont;
+ }
+ }
+}
+CPDF_Font* CPVT_FontMap::GetPDFFont(FX_INT32 nFontIndex)
+{
+ switch (nFontIndex) {
+ case 0:
+ return m_pDefFont;
+ case 1:
+ if (!m_pSysFont) {
+ GetAnnotSysPDFFont(m_pDocument, m_pResDict, m_pSysFont, m_sSysFontAlias);
+ }
+ return m_pSysFont;
+ }
+ return NULL;
+}
+CFX_ByteString CPVT_FontMap::GetPDFFontAlias(FX_INT32 nFontIndex)
+{
+ switch (nFontIndex) {
+ case 0:
+ return m_sDefFontAlias;
+ case 1:
+ if (!m_pSysFont) {
+ GetAnnotSysPDFFont(m_pDocument, m_pResDict, m_pSysFont, m_sSysFontAlias);
+ }
+ return m_sSysFontAlias;
+ }
+ return "";
+}
+CPVT_Provider::CPVT_Provider(IPVT_FontMap * pFontMap) : m_pFontMap(pFontMap)
+{
+ ASSERT (m_pFontMap != NULL);
+}
+CPVT_Provider::~CPVT_Provider()
+{
+}
+FX_INT32 CPVT_Provider::GetCharWidth(FX_INT32 nFontIndex, FX_WORD word, FX_INT32 nWordStyle)
+{
+ if (CPDF_Font* pPDFFont = m_pFontMap->GetPDFFont(nFontIndex)) {
+ FX_DWORD charcode = pPDFFont->CharCodeFromUnicode(word);
+ if (charcode != -1) {
+ return pPDFFont->GetCharWidthF(charcode);
+ }
+ }
+ return 0;
+}
+FX_INT32 CPVT_Provider::GetTypeAscent(FX_INT32 nFontIndex)
+{
+ if (CPDF_Font* pPDFFont = m_pFontMap->GetPDFFont(nFontIndex)) {
+ return pPDFFont->GetTypeAscent();
+ }
+ return 0;
+}
+FX_INT32 CPVT_Provider::GetTypeDescent(FX_INT32 nFontIndex)
+{
+ if (CPDF_Font* pPDFFont = m_pFontMap->GetPDFFont(nFontIndex)) {
+ return pPDFFont->GetTypeDescent();
+ }
+ return 0;
+}
+FX_INT32 CPVT_Provider::GetWordFontIndex(FX_WORD word, FX_INT32 charset, FX_INT32 nFontIndex)
+{
+ if (CPDF_Font* pDefFont = m_pFontMap->GetPDFFont(0)) {
+ if (pDefFont->CharCodeFromUnicode(word) != -1) {
+ return 0;
+ }
+ }
+ if (CPDF_Font* pSysFont = m_pFontMap->GetPDFFont(1))
+ if (pSysFont->CharCodeFromUnicode(word) != -1) {
+ return 1;
+ }
+ return -1;
+}
+FX_BOOL CPVT_Provider::IsLatinWord(FX_WORD word)
+{
+ if ((word >= 0x61 && word <= 0x7A) || (word >= 0x41 && word <= 0x5A) || word == 0x2D || word == 0x27) {
+ return TRUE;
+ }
+ return FALSE;
+}
+FX_INT32 CPVT_Provider::GetDefaultFontIndex()
+{
+ return 0;
+}
+static CFX_ByteString GetPDFWordString(IPVT_FontMap * pFontMap, FX_INT32 nFontIndex, FX_WORD Word, FX_WORD SubWord)
+{
+ CFX_ByteString sWord;
+ if (SubWord > 0) {
+ sWord.Format("%c", SubWord);
+ } else {
+ if (pFontMap) {
+ if (CPDF_Font * pPDFFont = pFontMap->GetPDFFont(nFontIndex)) {
+ if (pPDFFont->GetBaseFont().Compare("Symbol") == 0 || pPDFFont->GetBaseFont().Compare("ZapfDingbats") == 0) {
+ sWord.Format("%c", Word);
+ } else {
+ FX_DWORD dwCharCode = pPDFFont->CharCodeFromUnicode(Word);
+ if (dwCharCode != -1) {
+ pPDFFont->AppendChar(sWord, dwCharCode);
+ }
+ }
+ }
+ }
+ }
+ return sWord;
+}
+static CFX_ByteString GetWordRenderString(const CFX_ByteString & strWords)
+{
+ if (strWords.GetLength() > 0) {
+ return PDF_EncodeString(strWords) + " Tj\n";
+ }
+ return "";
+}
+static CFX_ByteString GetFontSetString(IPVT_FontMap * pFontMap, FX_INT32 nFontIndex, FX_FLOAT fFontSize)
+{
+ CFX_ByteTextBuf sRet;
+ if (pFontMap) {
+ CFX_ByteString sFontAlias = pFontMap->GetPDFFontAlias(nFontIndex);
+ if (sFontAlias.GetLength() > 0 && fFontSize > 0 ) {
+ sRet << "/" << sFontAlias << " " << fFontSize << " Tf\n";
+ }
+ }
+ return sRet.GetByteString();
+}
+static CPVT_Color ParseColor(const CFX_ByteString & str)
+{
+ CPDF_SimpleParser syntax(str);
+ syntax.SetPos(0);
+ if (syntax.FindTagParam("g", 1)) {
+ return CPVT_Color(CT_GRAY, FX_atof(syntax.GetWord()));
+ }
+ syntax.SetPos(0);
+ if (syntax.FindTagParam("rg", 3)) {
+ FX_FLOAT f1 = FX_atof(syntax.GetWord());
+ FX_FLOAT f2 = FX_atof(syntax.GetWord());
+ FX_FLOAT f3 = FX_atof(syntax.GetWord());
+ return CPVT_Color(CT_RGB, f1, f2, f3);
+ }
+ syntax.SetPos(0);
+ if (syntax.FindTagParam("k", 4)) {
+ FX_FLOAT f1 = FX_atof(syntax.GetWord());
+ FX_FLOAT f2 = FX_atof(syntax.GetWord());
+ FX_FLOAT f3 = FX_atof(syntax.GetWord());
+ FX_FLOAT f4 = FX_atof(syntax.GetWord());
+ return CPVT_Color(CT_CMYK, f1, f2, f3, f4);
+ }
+ return CPVT_Color(CT_TRANSPARENT);
+}
+static CPVT_Color ParseColor(const CPDF_Array & array)
+{
+ CPVT_Color rt;
+ switch (array.GetCount()) {
+ case 1:
+ rt = CPVT_Color(CT_GRAY, array.GetFloat(0));
+ break;
+ case 3:
+ rt = CPVT_Color(CT_RGB, array.GetFloat(0), array.GetFloat(1), array.GetFloat(2));
+ break;
+ case 4:
+ rt = CPVT_Color(CT_CMYK, array.GetFloat(0), array.GetFloat(1), array.GetFloat(2), array.GetFloat(3));
+ break;
+ }
+ return rt;
+}
+static FX_BOOL GenerateWidgetAP(CPDF_Document* pDoc, CPDF_Dictionary* pAnnotDict, const FX_INT32 & nWidgetType)
+{
+ CPDF_Dictionary* pFormDict = NULL;
+ if (CPDF_Dictionary * pRootDict = pDoc->GetRoot()) {
+ pFormDict = pRootDict->GetDict("AcroForm");
+ }
+ if (!pFormDict) {
+ return FALSE;
+ }
+ CFX_ByteString DA = FPDF_GetFieldAttr(pAnnotDict, "DA")->GetString();
+ if (DA.IsEmpty()) {
+ DA = pFormDict->GetString("DA");
+ }
+ if (DA.IsEmpty()) {
+ return FALSE;
+ }
+ CPDF_SimpleParser syntax(DA);
+ syntax.FindTagParam("Tf", 2);
+ CFX_ByteString sFontName = syntax.GetWord();
+ sFontName = PDF_NameDecode(sFontName);
+ if (sFontName.IsEmpty()) {
+ return FALSE;
+ }
+ FX_FLOAT fFontSize = FX_atof(syntax.GetWord());
+ CPVT_Color crText = ParseColor(DA);
+ FX_BOOL bUseFormRes = FALSE;
+ CPDF_Dictionary * pFontDict = NULL;
+ CPDF_Dictionary* pDRDict = pAnnotDict->GetDict(FX_BSTRC("DR"));
+ if (pDRDict == NULL) {
+ pDRDict = pFormDict->GetDict(FX_BSTRC("DR"));
+ bUseFormRes = TRUE;
+ }
+ CPDF_Dictionary * pDRFontDict = NULL;
+ if ((pDRFontDict = pDRDict->GetDict("Font"))) {
+ pFontDict = pDRFontDict->GetDict(sFontName.Mid(1));
+ if (!pFontDict && !bUseFormRes) {
+ pDRDict = pFormDict->GetDict(FX_BSTRC("DR"));
+ pDRFontDict = pDRDict->GetDict("Font");
+ if (pDRFontDict) {
+ pFontDict = pDRFontDict->GetDict(sFontName.Mid(1));
+ }
+ }
+ }
+ if (!pDRFontDict) {
+ return FALSE;
+ }
+ if (!pFontDict) {
+ pFontDict = CPDF_Dictionary::Create();
+ if (pFontDict == NULL) {
+ return FALSE;
+ }
+ pFontDict->SetAtName(FX_BSTRC("Type"), "Font");
+ pFontDict->SetAtName(FX_BSTRC("Subtype"), "Type1");
+ pFontDict->SetAtName(FX_BSTRC("BaseFont"), "Helvetica");
+ pFontDict->SetAtName(FX_BSTRC("Encoding"), "WinAnsiEncoding");
+ pDoc->AddIndirectObject(pFontDict);
+ pDRFontDict->SetAtReference(sFontName.Mid(1), pDoc, pFontDict);
+ }
+ CPDF_Font* pDefFont = pDoc->LoadFont(pFontDict);
+ if (!pDefFont) {
+ return FALSE;
+ }
+ CFX_CharMap* pCharMap = pDefFont->GetCharMap();
+ CPDF_Rect rcAnnot = pAnnotDict->GetRect("Rect");
+ FX_INT32 nRotate = 0;
+ if (CPDF_Dictionary * pMKDict = pAnnotDict->GetDict("MK")) {
+ nRotate = pMKDict->GetInteger("R");
+ }
+ CPDF_Rect rcBBox;
+ CPDF_Matrix matrix;
+ switch (nRotate % 360) {
+ case 0:
+ rcBBox = CPDF_Rect(0, 0, rcAnnot.right - rcAnnot.left, rcAnnot.top - rcAnnot.bottom);
+ break;
+ case 90:
+ matrix = CPDF_Matrix(0, 1, -1, 0, rcAnnot.right - rcAnnot.left, 0);
+ rcBBox = CPDF_Rect(0, 0, rcAnnot.top - rcAnnot.bottom, rcAnnot.right - rcAnnot.left);
+ break;
+ case 180:
+ matrix = CPDF_Matrix(-1, 0, 0, -1, rcAnnot.right - rcAnnot.left, rcAnnot.top - rcAnnot.bottom);
+ rcBBox = CPDF_Rect(0, 0, rcAnnot.right - rcAnnot.left, rcAnnot.top - rcAnnot.bottom);
+ break;
+ case 270:
+ matrix = CPDF_Matrix(0, -1, 1, 0, 0, rcAnnot.top - rcAnnot.bottom);
+ rcBBox = CPDF_Rect(0, 0, rcAnnot.top - rcAnnot.bottom, rcAnnot.right - rcAnnot.left);
+ break;
+ }
+ FX_INT32 nBorderStyle = PBS_SOLID;
+ FX_FLOAT fBorderWidth = 1;
+ CPVT_Dash dsBorder(3, 0, 0);
+ CPVT_Color crLeftTop, crRightBottom;
+ if (CPDF_Dictionary * pBSDict = pAnnotDict->GetDict("BS")) {
+ if (pBSDict->KeyExist("W")) {
+ fBorderWidth = pBSDict->GetNumber("W");
+ }
+ if (CPDF_Array * pArray = pBSDict->GetArray("D")) {
+ dsBorder = CPVT_Dash(pArray->GetInteger(0), pArray->GetInteger(1), pArray->GetInteger(2));
+ }
+ switch (pBSDict->GetString("S").GetAt(0)) {
+ case 'S':
+ nBorderStyle = PBS_SOLID;
+ break;
+ case 'D':
+ nBorderStyle = PBS_DASH;
+ break;
+ case 'B':
+ nBorderStyle = PBS_BEVELED;
+ fBorderWidth *= 2;
+ crLeftTop = CPVT_Color(CT_GRAY, 1);
+ crRightBottom = CPVT_Color(CT_GRAY, 0.5);
+ break;
+ case 'I':
+ nBorderStyle = PBS_INSET;
+ fBorderWidth *= 2;
+ crLeftTop = CPVT_Color(CT_GRAY, 0.5);
+ crRightBottom = CPVT_Color(CT_GRAY, 0.75);
+ break;
+ case 'U':
+ nBorderStyle = PBS_UNDERLINED;
+ break;
+ }
+ }
+ CPVT_Color crBorder, crBG;
+ if (CPDF_Dictionary * pMKDict = pAnnotDict->GetDict("MK")) {
+ if (CPDF_Array * pArray = pMKDict->GetArray("BC")) {
+ crBorder = ParseColor(*pArray);
+ }
+ if (CPDF_Array * pArray = pMKDict->GetArray("BG")) {
+ crBG = ParseColor(*pArray);
+ }
+ }
+ CFX_ByteTextBuf sAppStream;
+ CFX_ByteString sBG = CPVT_GenerateAP::GenerateColorAP(crBG, TRUE);
+ if (sBG.GetLength() > 0) {
+ sAppStream << "q\n" << sBG << rcBBox.left << " " << rcBBox.bottom << " "
+ << rcBBox.Width() << " " << rcBBox.Height() << " re f\n" << "Q\n";
+ }
+ CFX_ByteString sBorderStream = CPVT_GenerateAP::GenerateBorderAP(rcBBox, fBorderWidth,
+ crBorder, crLeftTop, crRightBottom, nBorderStyle, dsBorder);
+ if (sBorderStream.GetLength() > 0) {
+ sAppStream << "q\n" << sBorderStream << "Q\n";
+ }
+ CPDF_Rect rcBody = CPDF_Rect(rcBBox.left + fBorderWidth, rcBBox.bottom + fBorderWidth,
+ rcBBox.right - fBorderWidth, rcBBox.top - fBorderWidth);
+ rcBody.Normalize();
+ CPDF_Dictionary* pAPDict = pAnnotDict->GetDict("AP");
+ if (pAPDict == NULL) {
+ pAPDict = CPDF_Dictionary::Create();
+ if (pAPDict == NULL) {
+ return FALSE;
+ }
+ pAnnotDict->SetAt("AP", pAPDict);
+ }
+ CPDF_Stream* pNormalStream = pAPDict->GetStream("N");
+ if (pNormalStream == NULL) {
+ pNormalStream = CPDF_Stream::Create(NULL, 0, NULL);
+ if (pNormalStream == NULL) {
+ return FALSE;
+ }
+ FX_INT32 objnum = pDoc->AddIndirectObject(pNormalStream);
+ pAnnotDict->GetDict("AP")->SetAtReference("N", pDoc, objnum);
+ }
+ CPDF_Dictionary * pStreamDict = pNormalStream->GetDict();
+ if (pStreamDict) {
+ pStreamDict->SetAtMatrix("Matrix", matrix);
+ pStreamDict->SetAtRect("BBox", rcBBox);
+ CPDF_Dictionary* pStreamResList = pStreamDict->GetDict("Resources");
+ if (pStreamResList) {
+ CPDF_Dictionary* pStreamResFontList = pStreamResList->GetDict("Font");
+ if (!pStreamResFontList) {
+ pStreamResFontList = CPDF_Dictionary::Create();
+ if (pStreamResFontList == NULL) {
+ return FALSE;
+ }
+ pStreamResList->SetAt("Font", pStreamResFontList);
+ }
+ if (!pStreamResFontList->KeyExist(sFontName)) {
+ pStreamResFontList->SetAtReference(sFontName, pDoc, pFontDict);
+ }
+ } else {
+ pStreamDict->SetAt("Resources", pFormDict->GetDict("DR")->Clone());
+ pStreamResList = pStreamDict->GetDict("Resources");
+ }
+ }
+ switch (nWidgetType) {
+ case 0: {
+ CFX_WideString swValue = FPDF_GetFieldAttr(pAnnotDict, "V")->GetUnicodeText();
+ FX_INT32 nAlign = FPDF_GetFieldAttr(pAnnotDict, "Q")->GetInteger();
+ FX_DWORD dwFlags = FPDF_GetFieldAttr(pAnnotDict, "Ff")->GetInteger();
+ FX_DWORD dwMaxLen = FPDF_GetFieldAttr(pAnnotDict, "MaxLen")->GetInteger();
+ CPVT_FontMap map(pDoc, pStreamDict->GetDict("Resources"), pDefFont, sFontName.Right(sFontName.GetLength() - 1));
+ CPVT_Provider prd(&map);
+ CPDF_VariableText vt;
+ vt.SetProvider(&prd);
+ vt.SetPlateRect(rcBody);
+ vt.SetAlignment(nAlign);
+ if (IsFloatZero(fFontSize)) {
+ vt.SetAutoFontSize(TRUE);
+ } else {
+ vt.SetFontSize(fFontSize);
+ }
+ FX_BOOL bMultiLine = (dwFlags >> 12) & 1;
+ if (bMultiLine) {
+ vt.SetMultiLine(TRUE);
+ vt.SetAutoReturn(TRUE);
+ }
+ FX_WORD subWord = 0;
+ if ((dwFlags >> 13) & 1) {
+ subWord = '*';
+ vt.SetPasswordChar(subWord);
+ }
+ FX_BOOL bCharArray = (dwFlags >> 24) & 1;
+ if (bCharArray) {
+ vt.SetCharArray(dwMaxLen);
+ } else {
+ vt.SetLimitChar(dwMaxLen);
+ }
+ vt.Initialize();
+ vt.SetText(swValue);
+ vt.RearrangeAll();
+ CPDF_Rect rcContent = vt.GetContentRect();
+ CPDF_Point ptOffset(0.0f, 0.0f);
+ if (!bMultiLine) {
+ ptOffset = CPDF_Point(0.0f, (rcContent.Height() - rcBody.Height()) / 2.0f);
+ }
+ CFX_ByteString sBody = CPVT_GenerateAP::GenerateEditAP(&map, vt.GetIterator(), ptOffset, !bCharArray, subWord);
+ if (sBody.GetLength() > 0) {
+ sAppStream << "/Tx BMC\n" << "q\n";
+ if (rcContent.Width() > rcBody.Width() ||
+ rcContent.Height() > rcBody.Height()) {
+ sAppStream << rcBody.left << " " << rcBody.bottom << " "
+ << rcBody.Width() << " " << rcBody.Height() << " re\nW\nn\n";
+ }
+ sAppStream << "BT\n" << CPVT_GenerateAP::GenerateColorAP(crText, TRUE) << sBody << "ET\n" << "Q\nEMC\n";
+ }
+ }
+ break;
+ case 1: {
+ CFX_WideString swValue = FPDF_GetFieldAttr(pAnnotDict, "V")->GetUnicodeText();
+ CPVT_FontMap map(pDoc, pStreamDict->GetDict("Resources"), pDefFont, sFontName.Right(sFontName.GetLength() - 1));
+ CPVT_Provider prd(&map);
+ CPDF_VariableText vt;
+ vt.SetProvider(&prd);
+ CPDF_Rect rcButton = rcBody;
+ rcButton.left = rcButton.right - 13;
+ rcButton.Normalize();
+ CPDF_Rect rcEdit = rcBody;
+ rcEdit.right = rcButton.left;
+ rcEdit.Normalize();
+ vt.SetPlateRect(rcEdit);
+ if (IsFloatZero(fFontSize)) {
+ vt.SetAutoFontSize(TRUE);
+ } else {
+ vt.SetFontSize(fFontSize);
+ }
+ vt.Initialize();
+ vt.SetText(swValue);
+ vt.RearrangeAll();
+ CPDF_Rect rcContent = vt.GetContentRect();
+ CPDF_Point ptOffset = CPDF_Point(0.0f, (rcContent.Height() - rcEdit.Height()) / 2.0f);
+ CFX_ByteString sEdit = CPVT_GenerateAP::GenerateEditAP(&map, vt.GetIterator(), ptOffset, TRUE, 0);
+ if (sEdit.GetLength() > 0) {
+ sAppStream << "/Tx BMC\n" << "q\n";
+ sAppStream << rcEdit.left << " " << rcEdit.bottom << " "
+ << rcEdit.Width() << " " << rcEdit.Height() << " re\nW\nn\n";
+ sAppStream << "BT\n" << CPVT_GenerateAP::GenerateColorAP(crText, TRUE) << sEdit << "ET\n" << "Q\nEMC\n";
+ }
+ CFX_ByteString sButton = CPVT_GenerateAP::GenerateColorAP(CPVT_Color(CT_RGB, 220.0f / 255.0f, 220.0f / 255.0f, 220.0f / 255.0f), TRUE);
+ if (sButton.GetLength() > 0 && !rcButton.IsEmpty()) {
+ sAppStream << "q\n" << sButton;
+ sAppStream << rcButton.left << " " << rcButton.bottom << " "
+ << rcButton.Width() << " " << rcButton.Height() << " re f\n";
+ sAppStream << "Q\n";
+ CFX_ByteString sButtonBorder = CPVT_GenerateAP::GenerateBorderAP(rcButton, 2, CPVT_Color(CT_GRAY, 0), CPVT_Color(CT_GRAY, 1), CPVT_Color(CT_GRAY, 0.5), PBS_BEVELED, CPVT_Dash(3, 0, 0));
+ if (sButtonBorder.GetLength() > 0) {
+ sAppStream << "q\n" << sButtonBorder << "Q\n";
+ }
+ CPDF_Point ptCenter = CPDF_Point((rcButton.left + rcButton.right) / 2, (rcButton.top + rcButton.bottom) / 2);
+ if (IsFloatBigger(rcButton.Width(), 6) && IsFloatBigger(rcButton.Height(), 6)) {
+ sAppStream << "q\n" << " 0 g\n";
+ sAppStream << ptCenter.x - 3 << " " << ptCenter.y + 1.5f << " m\n";
+ sAppStream << ptCenter.x + 3 << " " << ptCenter.y + 1.5f << " l\n";
+ sAppStream << ptCenter.x << " " << ptCenter.y - 1.5f << " l\n";
+ sAppStream << ptCenter.x - 3 << " " << ptCenter.y + 1.5f << " l f\n";
+ sAppStream << sButton << "Q\n";
+ }
+ }
+ }
+ break;
+ case 2: {
+ CPVT_FontMap map(pDoc, pStreamDict->GetDict("Resources"), pDefFont, sFontName.Right(sFontName.GetLength() - 1));
+ CPVT_Provider prd(&map);
+ CPDF_Array * pOpts = FPDF_GetFieldAttr(pAnnotDict, "Opt")->GetArray();
+ CPDF_Array * pSels = FPDF_GetFieldAttr(pAnnotDict, "I")->GetArray();
+ FX_INT32 nTop = FPDF_GetFieldAttr(pAnnotDict, "TI")->GetInteger();
+ CFX_ByteTextBuf sBody;
+ if (pOpts) {
+ FX_FLOAT fy = rcBody.top;
+ for (FX_INT32 i = nTop, sz = pOpts->GetCount(); i < sz; i++) {
+ if (IsFloatSmaller(fy, rcBody.bottom)) {
+ break;
+ }
+ if (CPDF_Object* pOpt = pOpts->GetElementValue(i)) {
+ CFX_WideString swItem;
+ if (pOpt->GetType() == PDFOBJ_STRING) {
+ swItem = pOpt->GetUnicodeText();
+ } else if (pOpt->GetType() == PDFOBJ_ARRAY) {
+ swItem = ((CPDF_Array*)pOpt)->GetElementValue(1)->GetUnicodeText();
+ }
+ FX_BOOL bSelected = FALSE;
+ if (pSels) {
+ for (FX_DWORD s = 0, ssz = pSels->GetCount(); s < ssz; s++) {
+ if (i == pSels->GetInteger(s)) {
+ bSelected = TRUE;
+ break;
+ }
+ }
+ }
+ CPDF_VariableText vt;
+ vt.SetProvider(&prd);
+ vt.SetPlateRect(CPDF_Rect(rcBody.left, 0.0f, rcBody.right, 0.0f));
+ if (IsFloatZero(fFontSize)) {
+ vt.SetFontSize(12.0f);
+ } else {
+ vt.SetFontSize(fFontSize);
+ }
+ vt.Initialize();
+ vt.SetText(swItem);
+ vt.RearrangeAll();
+ FX_FLOAT fItemHeight = vt.GetContentRect().Height();
+ if (bSelected) {
+ CPDF_Rect rcItem = CPDF_Rect(rcBody.left, fy - fItemHeight, rcBody.right, fy);
+ sBody << "q\n" << CPVT_GenerateAP::GenerateColorAP(CPVT_Color(CT_RGB, 0, 51.0f / 255.0f, 113.0f / 255.0f), TRUE)
+ << rcItem.left << " " << rcItem.bottom << " " << rcItem.Width() << " " << rcItem.Height() << " re f\n" << "Q\n";
+ sBody << "BT\n" << CPVT_GenerateAP::GenerateColorAP(CPVT_Color(CT_GRAY, 1), TRUE) << CPVT_GenerateAP::GenerateEditAP(&map, vt.GetIterator(), CPDF_Point(0.0f, fy), TRUE, 0) << "ET\n";
+ } else {
+ sBody << "BT\n" << CPVT_GenerateAP::GenerateColorAP(crText, TRUE) << CPVT_GenerateAP::GenerateEditAP(&map, vt.GetIterator(), CPDF_Point(0.0f, fy), TRUE, 0) << "ET\n";
+ }
+ fy -= fItemHeight;
+ }
+ }
+ }
+ if (sBody.GetSize() > 0) {
+ sAppStream << "/Tx BMC\n" << "q\n";
+ sAppStream << rcBody.left << " " << rcBody.bottom << " "
+ << rcBody.Width() << " " << rcBody.Height() << " re\nW\nn\n";
+ sAppStream << sBody.GetByteString() << "Q\nEMC\n";
+ }
+ }
+ break;
+ }
+ if (pNormalStream) {
+ pNormalStream->SetData((FX_BYTE*)sAppStream.GetBuffer(), sAppStream.GetSize(), FALSE, FALSE);
+ pStreamDict = pNormalStream->GetDict();
+ if (pStreamDict) {
+ pStreamDict->SetAtMatrix("Matrix", matrix);
+ pStreamDict->SetAtRect("BBox", rcBBox);
+ CPDF_Dictionary* pStreamResList = pStreamDict->GetDict("Resources");
+ if (pStreamResList) {
+ CPDF_Dictionary* pStreamResFontList = pStreamResList->GetDict("Font");
+ if (!pStreamResFontList) {
+ pStreamResFontList = CPDF_Dictionary::Create();
+ if (pStreamResFontList == NULL) {
+ return FALSE;
+ }
+ pStreamResList->SetAt("Font", pStreamResFontList);
+ }
+ if (!pStreamResFontList->KeyExist(sFontName)) {
+ pStreamResFontList->SetAtReference(sFontName, pDoc, pFontDict);
+ }
+ } else {
+ pStreamDict->SetAt("Resources", pFormDict->GetDict("DR")->Clone());
+ pStreamResList = pStreamDict->GetDict("Resources");
+ }
+ }
+ }
+ return TRUE;
+}
+FX_BOOL CPVT_GenerateAP::GenerateTextFieldAP(CPDF_Document* pDoc, CPDF_Dictionary* pAnnotDict)
+{
+ return GenerateWidgetAP(pDoc, pAnnotDict, 0);
+}
+FX_BOOL CPVT_GenerateAP::GenerateComboBoxAP(CPDF_Document* pDoc, CPDF_Dictionary* pAnnotDict)
+{
+ return GenerateWidgetAP(pDoc, pAnnotDict, 1);
+}
+FX_BOOL CPVT_GenerateAP::GenerateListBoxAP(CPDF_Document* pDoc, CPDF_Dictionary* pAnnotDict)
+{
+ return GenerateWidgetAP(pDoc, pAnnotDict, 2);
+}
+CFX_ByteString CPVT_GenerateAP::GenerateEditAP(IPVT_FontMap * pFontMap, IPDF_VariableText_Iterator* pIterator, const CPDF_Point & ptOffset, FX_BOOL bContinuous, FX_WORD SubWord, const CPVT_WordRange * pVisible)
+{
+ CFX_ByteTextBuf sEditStream, sLineStream, sWords;
+ CPDF_Point ptOld(0.0f, 0.0f), ptNew(0.0f, 0.0f);
+ FX_INT32 nCurFontIndex = -1;
+ if (pIterator) {
+ if (pVisible) {
+ pIterator->SetAt(pVisible->BeginPos);
+ } else {
+ pIterator->SetAt(0);
+ }
+ CPVT_WordPlace oldplace;
+ while (pIterator->NextWord()) {
+ CPVT_WordPlace place = pIterator->GetAt();
+ if (pVisible && place.WordCmp(pVisible->EndPos) > 0) {
+ break;
+ }
+ if (bContinuous) {
+ if (place.LineCmp(oldplace) != 0) {
+ if (sWords.GetSize() > 0) {
+ sLineStream << GetWordRenderString(sWords.GetByteString());
+ sEditStream << sLineStream;
+ sLineStream.Clear();
+ sWords.Clear();
+ }
+ CPVT_Word word;
+ if (pIterator->GetWord(word)) {
+ ptNew = CPDF_Point(word.ptWord.x + ptOffset.x, word.ptWord.y + ptOffset.y);
+ } else {
+ CPVT_Line line;
+ pIterator->GetLine(line);
+ ptNew = CPDF_Point(line.ptLine.x + ptOffset.x, line.ptLine.y + ptOffset.y);
+ }
+ if (ptNew.x != ptOld.x || ptNew.y != ptOld.y) {
+ sLineStream << ptNew.x - ptOld.x << " " << ptNew.y - ptOld.y << " Td\n";
+ ptOld = ptNew;
+ }
+ }
+ CPVT_Word word;
+ if (pIterator->GetWord(word)) {
+ if (word.nFontIndex != nCurFontIndex) {
+ if (sWords.GetSize() > 0) {
+ sLineStream << GetWordRenderString(sWords.GetByteString());
+ sWords.Clear();
+ }
+ sLineStream << GetFontSetString(pFontMap, word.nFontIndex, word.fFontSize);
+ nCurFontIndex = word.nFontIndex;
+ }
+ sWords << GetPDFWordString(pFontMap, nCurFontIndex, word.Word, SubWord);
+ }
+ oldplace = place;
+ } else {
+ CPVT_Word word;
+ if (pIterator->GetWord(word)) {
+ ptNew = CPDF_Point(word.ptWord.x + ptOffset.x, word.ptWord.y + ptOffset.y);
+ if (ptNew.x != ptOld.x || ptNew.y != ptOld.y) {
+ sEditStream << ptNew.x - ptOld.x << " " << ptNew.y - ptOld.y << " Td\n";
+ ptOld = ptNew;
+ }
+ if (word.nFontIndex != nCurFontIndex) {
+ sEditStream << GetFontSetString(pFontMap, word.nFontIndex, word.fFontSize);
+ nCurFontIndex = word.nFontIndex;
+ }
+ sEditStream << GetWordRenderString(GetPDFWordString(pFontMap, nCurFontIndex, word.Word, SubWord));
+ }
+ }
+ }
+ if (sWords.GetSize() > 0) {
+ sLineStream << GetWordRenderString(sWords.GetByteString());
+ sEditStream << sLineStream;
+ sWords.Clear();
+ }
+ }
+ return sEditStream.GetByteString();
+}
+CFX_ByteString CPVT_GenerateAP::GenerateBorderAP(const CPDF_Rect & rect, FX_FLOAT fWidth,
+ const CPVT_Color & color, const CPVT_Color & crLeftTop, const CPVT_Color & crRightBottom,
+ FX_INT32 nStyle, const CPVT_Dash & dash)
+{
+ CFX_ByteTextBuf sAppStream;
+ CFX_ByteString sColor;
+ FX_FLOAT fLeft = rect.left;
+ FX_FLOAT fRight = rect.right;
+ FX_FLOAT fTop = rect.top;
+ FX_FLOAT fBottom = rect.bottom;
+ if (fWidth > 0.0f) {
+ FX_FLOAT fHalfWidth = fWidth / 2.0f;
+ switch (nStyle) {
+ default:
+ case PBS_SOLID:
+ sColor = GenerateColorAP(color, TRUE);
+ if (sColor.GetLength() > 0) {
+ sAppStream << sColor;
+ sAppStream << fLeft << " " << fBottom << " " << fRight - fLeft << " " << fTop - fBottom << " re\n";
+ sAppStream << fLeft + fWidth << " " << fBottom + fWidth << " "
+ << fRight - fLeft - fWidth * 2 << " " << fTop - fBottom - fWidth * 2 << " re\n";
+ sAppStream << "f*\n";
+ }
+ break;
+ case PBS_DASH:
+ sColor = GenerateColorAP(color, FALSE);
+ if (sColor.GetLength() > 0) {
+ sAppStream << sColor;
+ sAppStream << fWidth << " w" << " [" << dash.nDash << " " << dash.nGap << "] " << dash.nPhase << " d\n";
+ sAppStream << fLeft + fWidth / 2 << " " << fBottom + fWidth / 2 << " m\n";
+ sAppStream << fLeft + fWidth / 2 << " " << fTop - fWidth / 2 << " l\n";
+ sAppStream << fRight - fWidth / 2 << " " << fTop - fWidth / 2 << " l\n";
+ sAppStream << fRight - fWidth / 2 << " " << fBottom + fWidth / 2 << " l\n";
+ sAppStream << fLeft + fWidth / 2 << " " << fBottom + fWidth / 2 << " l S\n";
+ }
+ break;
+ case PBS_BEVELED:
+ case PBS_INSET:
+ sColor = GenerateColorAP(crLeftTop, TRUE);
+ if (sColor.GetLength() > 0) {
+ sAppStream << sColor;
+ sAppStream << fLeft + fHalfWidth << " " << fBottom + fHalfWidth << " m\n";
+ sAppStream << fLeft + fHalfWidth << " " << fTop - fHalfWidth << " l\n";
+ sAppStream << fRight - fHalfWidth << " " << fTop - fHalfWidth << " l\n";
+ sAppStream << fRight - fHalfWidth * 2 << " " << fTop - fHalfWidth * 2 << " l\n";
+ sAppStream << fLeft + fHalfWidth * 2 << " " << fTop - fHalfWidth * 2 << " l\n";
+ sAppStream << fLeft + fHalfWidth * 2 << " " << fBottom + fHalfWidth * 2 << " l f\n";
+ }
+ sColor = GenerateColorAP(crRightBottom, TRUE);
+ if (sColor.GetLength() > 0) {
+ sAppStream << sColor;
+ sAppStream << fRight - fHalfWidth << " " << fTop - fHalfWidth << " m\n";
+ sAppStream << fRight - fHalfWidth << " " << fBottom + fHalfWidth << " l\n";
+ sAppStream << fLeft + fHalfWidth << " " << fBottom + fHalfWidth << " l\n";
+ sAppStream << fLeft + fHalfWidth * 2 << " " << fBottom + fHalfWidth * 2 << " l\n";
+ sAppStream << fRight - fHalfWidth * 2 << " " << fBottom + fHalfWidth * 2 << " l\n";
+ sAppStream << fRight - fHalfWidth * 2 << " " << fTop - fHalfWidth * 2 << " l f\n";
+ }
+ sColor = GenerateColorAP(color, TRUE);
+ if (sColor.GetLength() > 0) {
+ sAppStream << sColor;
+ sAppStream << fLeft << " " << fBottom << " " << fRight - fLeft << " " << fTop - fBottom << " re\n";
+ sAppStream << fLeft + fHalfWidth << " " << fBottom + fHalfWidth << " "
+ << fRight - fLeft - fHalfWidth * 2 << " " << fTop - fBottom - fHalfWidth * 2 << " re f*\n";
+ }
+ break;
+ case PBS_UNDERLINED:
+ sColor = GenerateColorAP(color, FALSE);
+ if (sColor.GetLength() > 0) {
+ sAppStream << sColor;
+ sAppStream << fWidth << " w\n";
+ sAppStream << fLeft << " " << fBottom + fWidth / 2 << " m\n";
+ sAppStream << fRight << " " << fBottom + fWidth / 2 << " l S\n";
+ }
+ break;
+ }
+ }
+ return sAppStream.GetByteString();
+}
+CFX_ByteString CPVT_GenerateAP::GenerateColorAP(const CPVT_Color & color, const FX_BOOL & bFillOrStroke)
+{
+ CFX_ByteTextBuf sColorStream;
+ switch (color.nColorType) {
+ case CT_RGB:
+ sColorStream << color.fColor1 << " " << color.fColor2 << " " << color.fColor3 << " "
+ << (bFillOrStroke ? "rg" : "RG") << "\n";
+ break;
+ case CT_GRAY:
+ sColorStream << color.fColor1 << " " << (bFillOrStroke ? "g" : "G") << "\n";
+ break;
+ case CT_CMYK:
+ sColorStream << color.fColor1 << " " << color.fColor2 << " " << color.fColor3 << " " << color.fColor4 << " "
+ << (bFillOrStroke ? "k" : "K") << "\n";
+ break;
+ }
+ return sColorStream.GetByteString();
+}
diff --git a/core/src/fpdfdoc/doc_basic.cpp b/core/src/fpdfdoc/doc_basic.cpp
index 4ec8fb74fd..199a9a6dec 100644
--- a/core/src/fpdfdoc/doc_basic.cpp
+++ b/core/src/fpdfdoc/doc_basic.cpp
@@ -1,567 +1,567 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../include/fpdfdoc/fpdf_doc.h"
-const int nMaxRecursion = 32;
-int CPDF_Dest::GetPageIndex(CPDF_Document* pDoc)
-{
- if (m_pObj == NULL || m_pObj->GetType() != PDFOBJ_ARRAY) {
- return 0;
- }
- CPDF_Object* pPage = ((CPDF_Array*)m_pObj)->GetElementValue(0);
- if (pPage == NULL) {
- return 0;
- }
- if (pPage->GetType() == PDFOBJ_NUMBER) {
- return pPage->GetInteger();
- }
- if (pPage->GetType() != PDFOBJ_DICTIONARY) {
- return 0;
- }
- return pDoc->GetPageIndex(pPage->GetObjNum());
-}
-FX_DWORD CPDF_Dest::GetPageObjNum()
-{
- if (m_pObj == NULL || m_pObj->GetType() != PDFOBJ_ARRAY) {
- return 0;
- }
- CPDF_Object* pPage = ((CPDF_Array*)m_pObj)->GetElementValue(0);
- if (pPage == NULL) {
- return 0;
- }
- if (pPage->GetType() == PDFOBJ_NUMBER) {
- return pPage->GetInteger();
- }
- if (pPage->GetType() == PDFOBJ_DICTIONARY) {
- return pPage->GetObjNum();
- }
- return 0;
-}
-const FX_CHAR* g_sZoomModes[] = {"XYZ", "Fit", "FitH", "FitV", "FitR", "FitB", "FitBH", "FitBV", ""};
-int CPDF_Dest::GetZoomMode()
-{
- if (m_pObj == NULL || m_pObj->GetType() != PDFOBJ_ARRAY) {
- return 0;
- }
- CFX_ByteString mode = ((CPDF_Array*)m_pObj)->GetElementValue(1)->GetString();
- int i = 0;
- while (g_sZoomModes[i][0] != '\0') {
- if (mode == g_sZoomModes[i]) {
- return i + 1;
- }
- i ++;
- }
- return 0;
-}
-FX_FLOAT CPDF_Dest::GetParam(int index)
-{
- if (m_pObj == NULL || m_pObj->GetType() != PDFOBJ_ARRAY) {
- return 0;
- }
- return ((CPDF_Array*)m_pObj)->GetNumber(2 + index);
-}
-CFX_ByteString CPDF_Dest::GetRemoteName()
-{
- if (m_pObj == NULL) {
- return CFX_ByteString();
- }
- return m_pObj->GetString();
-}
-CPDF_NameTree::CPDF_NameTree(CPDF_Document* pDoc, FX_BSTR category)
-{
- m_pRoot = pDoc->GetRoot()->GetDict(FX_BSTRC("Names"))->GetDict(category);
-}
-static CPDF_Object* SearchNameNode(CPDF_Dictionary* pNode, const CFX_ByteString& csName,
- int& nIndex, CPDF_Array** ppFind, int nLevel = 0)
-{
- if (nLevel > nMaxRecursion) {
- return NULL;
- }
- CPDF_Array* pLimits = pNode->GetArray(FX_BSTRC("Limits"));
- if (pLimits != NULL) {
- CFX_ByteString csLeft = pLimits->GetString(0);
- CFX_ByteString csRight = pLimits->GetString(1);
- if (csLeft.Compare(csRight) > 0) {
- CFX_ByteString csTmp = csRight;
- csRight = csLeft;
- csLeft = csTmp;
- }
- if (csName.Compare(csLeft) < 0 || csName.Compare(csRight) > 0) {
- return NULL;
- }
- }
- CPDF_Array* pNames = pNode->GetArray(FX_BSTRC("Names"));
- if (pNames) {
- FX_DWORD dwCount = pNames->GetCount() / 2;
- for (FX_DWORD i = 0; i < dwCount; i ++) {
- CFX_ByteString csValue = pNames->GetString(i * 2);
- FX_INT32 iCompare = csValue.Compare(csName);
- if (iCompare <= 0) {
- if (ppFind != NULL) {
- *ppFind = pNames;
- }
- if (iCompare < 0) {
- continue;
- }
- } else {
- break;
- }
- nIndex += i;
- return pNames->GetElementValue(i * 2 + 1);
- }
- nIndex += dwCount;
- return NULL;
- }
- CPDF_Array* pKids = pNode->GetArray(FX_BSTRC("Kids"));
- if (pKids == NULL) {
- return NULL;
- }
- for (FX_DWORD i = 0; i < pKids->GetCount(); i ++) {
- CPDF_Dictionary* pKid = pKids->GetDict(i);
- if (pKid == NULL) {
- continue;
- }
- CPDF_Object* pFound = SearchNameNode(pKid, csName, nIndex, ppFind, nLevel + 1);
- if (pFound) {
- return pFound;
- }
- }
- return NULL;
-}
-static CPDF_Object* SearchNameNode(CPDF_Dictionary* pNode, int nIndex, int& nCurIndex,
- CFX_ByteString& csName, CPDF_Array** ppFind, int nLevel = 0)
-{
- if (nLevel > nMaxRecursion) {
- return NULL;
- }
- CPDF_Array* pNames = pNode->GetArray(FX_BSTRC("Names"));
- if (pNames) {
- int nCount = pNames->GetCount() / 2;
- if (nIndex >= nCurIndex + nCount) {
- nCurIndex += nCount;
- return NULL;
- } else {
- if (ppFind != NULL) {
- *ppFind = pNames;
- }
- csName = pNames->GetString((nIndex - nCurIndex) * 2);
- return pNames->GetElementValue((nIndex - nCurIndex) * 2 + 1);
- }
- }
- CPDF_Array* pKids = pNode->GetArray(FX_BSTRC("Kids"));
- if (pKids == NULL) {
- return NULL;
- }
- for (FX_DWORD i = 0; i < pKids->GetCount(); i ++) {
- CPDF_Dictionary* pKid = pKids->GetDict(i);
- if (pKid == NULL) {
- continue;
- }
- CPDF_Object* pFound = SearchNameNode(pKid, nIndex, nCurIndex, csName, ppFind, nLevel + 1);
- if (pFound) {
- return pFound;
- }
- }
- return NULL;
-}
-static int CountNames(CPDF_Dictionary* pNode, int nLevel = 0)
-{
- if (nLevel > nMaxRecursion) {
- return 0;
- }
- CPDF_Array* pNames = pNode->GetArray(FX_BSTRC("Names"));
- if (pNames) {
- return pNames->GetCount() / 2;
- }
- CPDF_Array* pKids = pNode->GetArray(FX_BSTRC("Kids"));
- if (pKids == NULL) {
- return 0;
- }
- int nCount = 0;
- for (FX_DWORD i = 0; i < pKids->GetCount(); i ++) {
- CPDF_Dictionary* pKid = pKids->GetDict(i);
- if (pKid == NULL) {
- continue;
- }
- nCount += CountNames(pKid, nLevel + 1);
- }
- return nCount;
-}
-int CPDF_NameTree::GetCount() const
-{
- if (m_pRoot == NULL) {
- return 0;
- }
- return ::CountNames(m_pRoot);
-}
-int CPDF_NameTree::GetIndex(const CFX_ByteString& csName) const
-{
- if (m_pRoot == NULL) {
- return -1;
- }
- int nIndex = 0;
- if (SearchNameNode(m_pRoot, csName, nIndex, NULL) == NULL) {
- return -1;
- }
- return nIndex;
-}
-CPDF_Object* CPDF_NameTree::LookupValue(int nIndex, CFX_ByteString& csName) const
-{
- if (m_pRoot == NULL) {
- return NULL;
- }
- int nCurIndex = 0;
- return SearchNameNode(m_pRoot, nIndex, nCurIndex, csName, NULL);
-}
-CPDF_Object* CPDF_NameTree::LookupValue(const CFX_ByteString& csName) const
-{
- if (m_pRoot == NULL) {
- return NULL;
- }
- int nIndex = 0;
- return SearchNameNode(m_pRoot, csName, nIndex, NULL);
-}
-CPDF_Array* CPDF_NameTree::LookupNamedDest(CPDF_Document* pDoc, FX_BSTR sName)
-{
- CPDF_Object* pValue = LookupValue(sName);
- if (pValue == NULL) {
- CPDF_Dictionary* pDests = pDoc->GetRoot()->GetDict(FX_BSTRC("Dests"));
- if (pDests == NULL) {
- return NULL;
- }
- pValue = pDests->GetElementValue(sName);
- }
- if (pValue == NULL) {
- return NULL;
- }
- if (pValue->GetType() == PDFOBJ_ARRAY) {
- return (CPDF_Array*)pValue;
- }
- if (pValue->GetType() == PDFOBJ_DICTIONARY) {
- return ((CPDF_Dictionary*)pValue)->GetArray(FX_BSTRC("D"));
- }
- return NULL;
-}
-static CFX_WideString ChangeSlashToPlatform(FX_LPCWSTR str)
-{
- CFX_WideString result;
- while (*str) {
- if (*str == '/') {
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
- result += ':';
-#elif _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
- result += '\\';
-#else
- result += *str;
-#endif
- } else {
- result += *str;
- }
- str++;
- }
- return result;
-}
-static CFX_WideString FILESPEC_DecodeFileName(FX_WSTR filepath)
-{
- if (filepath.GetLength() <= 1) {
- return CFX_WideString();
- }
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
- if (filepath.Left(sizeof("/Mac") - 1) == CFX_WideStringC(L"/Mac")) {
- return ChangeSlashToPlatform(filepath.GetPtr() + 1);
- }
- return ChangeSlashToPlatform(filepath.GetPtr());
-#elif _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
- if (filepath.GetAt(0) != '/') {
- return ChangeSlashToPlatform(filepath.GetPtr());
- }
- if (filepath.GetAt(1) == '/') {
- return ChangeSlashToPlatform(filepath.GetPtr() + 1);
- }
- if (filepath.GetAt(2) == '/') {
- CFX_WideString result;
- result += filepath.GetAt(1);
- result += ':';
- result += ChangeSlashToPlatform(filepath.GetPtr() + 2);
- return result;
- }
- CFX_WideString result;
- result += '\\';
- result += ChangeSlashToPlatform(filepath.GetPtr());
- return result;
-#else
- return filepath;
-#endif
-}
-FX_BOOL CPDF_FileSpec::GetFileName(CFX_WideString &csFileName) const
-{
- if (m_pObj == NULL) {
- return FALSE;
- }
- if (m_pObj->GetType() == PDFOBJ_DICTIONARY) {
- CPDF_Dictionary* pDict = (CPDF_Dictionary*)m_pObj;
- csFileName = pDict->GetUnicodeText(FX_BSTRC("UF"));
- if (csFileName.IsEmpty()) {
- csFileName = CFX_WideString::FromLocal(pDict->GetString(FX_BSTRC("F")));
- }
- if (pDict->GetString(FX_BSTRC("FS")) == FX_BSTRC("URL")) {
- return TRUE;
- }
- if (csFileName.IsEmpty()) {
- if (pDict->KeyExist(FX_BSTRC("DOS"))) {
- csFileName = CFX_WideString::FromLocal(pDict->GetString(FX_BSTRC("DOS")));
- } else if (pDict->KeyExist(FX_BSTRC("Mac"))) {
- csFileName = CFX_WideString::FromLocal(pDict->GetString(FX_BSTRC("Mac")));
- } else if (pDict->KeyExist(FX_BSTRC("Unix"))) {
- csFileName = CFX_WideString::FromLocal(pDict->GetString(FX_BSTRC("Unix")));
- } else {
- return FALSE;
- }
- }
- } else {
- csFileName = CFX_WideString::FromLocal(m_pObj->GetString());
- }
- csFileName = FILESPEC_DecodeFileName(csFileName);
- return TRUE;
-}
-CPDF_FileSpec::CPDF_FileSpec()
-{
- m_pObj = CPDF_Dictionary::Create();
- if (m_pObj != NULL) {
- ((CPDF_Dictionary*)m_pObj)->SetAtName(FX_BSTRC("Type"), FX_BSTRC("Filespec"));
- }
-}
-FX_BOOL CPDF_FileSpec::IsURL() const
-{
- if (m_pObj == NULL) {
- return FALSE;
- }
- if (m_pObj->GetType() != PDFOBJ_DICTIONARY) {
- return FALSE;
- }
- return ((CPDF_Dictionary*)m_pObj)->GetString(FX_BSTRC("FS")) == FX_BSTRC("URL");
-}
-static CFX_WideString ChangeSlashToPDF(FX_LPCWSTR str)
-{
- CFX_WideString result;
- while (*str) {
- if (*str == '\\' || *str == ':') {
- result += '/';
- } else {
- result += *str;
- }
- str++;
- }
- return result;
-}
-CFX_WideString FILESPEC_EncodeFileName(FX_WSTR filepath)
-{
- if (filepath.GetLength() <= 1) {
- return CFX_WideString();
- }
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
- if (filepath.GetAt(1) == ':') {
- CFX_WideString result;
- result = '/';
- result += filepath.GetAt(0);
- if (filepath.GetAt(2) != '\\') {
- result += '/';
- }
- result += ChangeSlashToPDF(filepath.GetPtr() + 2);
- return result;
- }
- if (filepath.GetAt(0) == '\\' && filepath.GetAt(1) == '\\') {
- return ChangeSlashToPDF(filepath.GetPtr() + 1);
- }
- if (filepath.GetAt(0) == '\\') {
- CFX_WideString result;
- result = '/';
- result += ChangeSlashToPDF(filepath.GetPtr());
- return result;
- }
- return ChangeSlashToPDF(filepath.GetPtr());
-#elif _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
- if (filepath.Left(sizeof("Mac") - 1) == FX_WSTRC(L"Mac")) {
- CFX_WideString result;
- result = '/';
- result += ChangeSlashToPDF(filepath.GetPtr());
- return result;
- }
- return ChangeSlashToPDF(filepath.GetPtr());
-#else
- return filepath;
-#endif
-}
-CPDF_Stream* CPDF_FileSpec::GetFileStream() const
-{
- if (m_pObj == NULL) {
- return NULL;
- }
- FX_INT32 iType = m_pObj->GetType();
- if (iType == PDFOBJ_STREAM) {
- return (CPDF_Stream*)m_pObj;
- } else if (iType == PDFOBJ_DICTIONARY) {
- CPDF_Dictionary *pEF = ((CPDF_Dictionary*)m_pObj)->GetDict(FX_BSTRC("EF"));
- if (pEF == NULL) {
- return NULL;
- }
- return pEF->GetStream(FX_BSTRC("F"));
- }
- return NULL;
-}
-static void FPDFDOC_FILESPEC_SetFileName(CPDF_Object *pObj, FX_WSTR wsFileName, FX_BOOL bURL)
-{
- ASSERT(pObj != NULL);
- CFX_WideString wsStr;
- if (bURL) {
- wsStr = wsFileName;
- } else {
- wsStr = FILESPEC_EncodeFileName(wsFileName);
- }
- FX_INT32 iType = pObj->GetType();
- if (iType == PDFOBJ_STRING) {
- pObj->SetString(CFX_ByteString::FromUnicode(wsStr));
- } else if (iType == PDFOBJ_DICTIONARY) {
- CPDF_Dictionary* pDict = (CPDF_Dictionary*)pObj;
- pDict->SetAtString(FX_BSTRC("F"), CFX_ByteString::FromUnicode(wsStr));
- pDict->SetAtString(FX_BSTRC("UF"), PDF_EncodeText(wsStr));
- }
-}
-void CPDF_FileSpec::SetFileName(FX_WSTR wsFileName, FX_BOOL bURL)
-{
- ASSERT(m_pObj != NULL);
- if (m_pObj->GetType() == PDFOBJ_DICTIONARY && bURL) {
- ((CPDF_Dictionary*)m_pObj)->SetAtName(FX_BSTRC("FS"), "URL");
- }
- FPDFDOC_FILESPEC_SetFileName(m_pObj, wsFileName, bURL);
-}
-static CFX_WideString _MakeRoman(int num)
-{
- const int arabic[] = {
- 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1
- };
- const CFX_WideString roman[] = {
- L"m", L"cm", L"d", L"cd", L"c", L"xc", L"l", L"xl", L"x", L"ix", L"v", L"iv", L"i"
- };
- const int nMaxNum = 1000000;
- num %= nMaxNum;
- int i = 0;
- CFX_WideString wsRomanNumber;
- while (num > 0) {
- while (num >= arabic[i]) {
- num = num - arabic[i];
- wsRomanNumber += roman[i];
- }
- i = i + 1;
- }
- return wsRomanNumber;
-}
-static CFX_WideString _MakeLetters(int num)
-{
- if (num == 0) {
- return CFX_WideString();
- }
- CFX_WideString wsLetters;
- const int nMaxCount = 1000;
- const int nLetterCount = 26;
- num -= 1;
- int count = num / nLetterCount + 1;
- count %= nMaxCount;
- FX_WCHAR ch = L'a' + num % nLetterCount;
- for (int i = 0; i < count; i++) {
- wsLetters += ch;
- }
- return wsLetters;
-}
-static CFX_WideString _GetLabelNumPortion(int num, const CFX_ByteString& bsStyle)
-{
- CFX_WideString wsNumPortion;
- if (bsStyle.IsEmpty()) {
- return wsNumPortion;
- }
- if (bsStyle == "D") {
- wsNumPortion.Format((FX_LPCWSTR)L"%d", num);
- } else if (bsStyle == "R") {
- wsNumPortion = _MakeRoman(num);
- wsNumPortion.MakeUpper();
- } else if (bsStyle == "r") {
- wsNumPortion = _MakeRoman(num);
- } else if (bsStyle == "A") {
- wsNumPortion = _MakeLetters(num);
- wsNumPortion.MakeUpper();
- } else if (bsStyle == "a") {
- wsNumPortion = _MakeLetters(num);
- }
- return wsNumPortion;
-}
-CFX_WideString CPDF_PageLabel::GetLabel(int nPage) const
-{
- CFX_WideString wsLabel;
- if (m_pDocument == NULL) {
- return wsLabel;
- }
- CPDF_Dictionary* pPDFRoot = m_pDocument->GetRoot();
- if (pPDFRoot == NULL) {
- return wsLabel;
- }
- CPDF_Dictionary* pLabels = pPDFRoot->GetDict(FX_BSTRC("PageLabels"));
- CPDF_NumberTree numberTree(pLabels);
- CPDF_Object* pValue = NULL;
- int n = nPage;
- while (n >= 0) {
- pValue = numberTree.LookupValue(n);
- if (pValue != NULL) {
- break;
- }
- n--;
- }
- if (pValue != NULL) {
- pValue = pValue->GetDirect();
- if (pValue->GetType() == PDFOBJ_DICTIONARY) {
- CPDF_Dictionary* pLabel = (CPDF_Dictionary*)pValue;
- if (pLabel->KeyExist(FX_BSTRC("P"))) {
- wsLabel += pLabel->GetUnicodeText(FX_BSTRC("P"));
- }
- CFX_ByteString bsNumberingStyle = pLabel->GetString(FX_BSTRC("S"), NULL);
- int nLabelNum = nPage - n + pLabel->GetInteger(FX_BSTRC("St"), 1);
- CFX_WideString wsNumPortion = _GetLabelNumPortion(nLabelNum, bsNumberingStyle);
- wsLabel += wsNumPortion;
- return wsLabel;
- }
- }
- wsLabel.Format((FX_LPCWSTR)L"%d", nPage + 1);
- return wsLabel;
-}
-FX_INT32 CPDF_PageLabel::GetPageByLabel(FX_BSTR bsLabel) const
-{
- if (m_pDocument == NULL) {
- return -1;
- }
- CPDF_Dictionary* pPDFRoot = m_pDocument->GetRoot();
- if (pPDFRoot == NULL) {
- return -1;
- }
- int nPages = m_pDocument->GetPageCount();
- CFX_ByteString bsLbl;
- CFX_ByteString bsOrig = bsLabel;
- for (int i = 0; i < nPages; i++) {
- bsLbl = PDF_EncodeText(GetLabel(i));
- if (!bsLbl.Compare(bsOrig)) {
- return i;
- }
- }
- bsLbl = bsOrig;
- int nPage = FXSYS_atoi(bsLbl);
- if (nPage > 0 && nPage <= nPages) {
- return nPage;
- }
- return -1;
-}
-FX_INT32 CPDF_PageLabel::GetPageByLabel(FX_WSTR wsLabel) const
-{
- CFX_ByteString bsLabel = PDF_EncodeText((CFX_WideString)wsLabel);
- return GetPageByLabel(bsLabel);
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fpdfdoc/fpdf_doc.h"
+const int nMaxRecursion = 32;
+int CPDF_Dest::GetPageIndex(CPDF_Document* pDoc)
+{
+ if (m_pObj == NULL || m_pObj->GetType() != PDFOBJ_ARRAY) {
+ return 0;
+ }
+ CPDF_Object* pPage = ((CPDF_Array*)m_pObj)->GetElementValue(0);
+ if (pPage == NULL) {
+ return 0;
+ }
+ if (pPage->GetType() == PDFOBJ_NUMBER) {
+ return pPage->GetInteger();
+ }
+ if (pPage->GetType() != PDFOBJ_DICTIONARY) {
+ return 0;
+ }
+ return pDoc->GetPageIndex(pPage->GetObjNum());
+}
+FX_DWORD CPDF_Dest::GetPageObjNum()
+{
+ if (m_pObj == NULL || m_pObj->GetType() != PDFOBJ_ARRAY) {
+ return 0;
+ }
+ CPDF_Object* pPage = ((CPDF_Array*)m_pObj)->GetElementValue(0);
+ if (pPage == NULL) {
+ return 0;
+ }
+ if (pPage->GetType() == PDFOBJ_NUMBER) {
+ return pPage->GetInteger();
+ }
+ if (pPage->GetType() == PDFOBJ_DICTIONARY) {
+ return pPage->GetObjNum();
+ }
+ return 0;
+}
+const FX_CHAR* g_sZoomModes[] = {"XYZ", "Fit", "FitH", "FitV", "FitR", "FitB", "FitBH", "FitBV", ""};
+int CPDF_Dest::GetZoomMode()
+{
+ if (m_pObj == NULL || m_pObj->GetType() != PDFOBJ_ARRAY) {
+ return 0;
+ }
+ CFX_ByteString mode = ((CPDF_Array*)m_pObj)->GetElementValue(1)->GetString();
+ int i = 0;
+ while (g_sZoomModes[i][0] != '\0') {
+ if (mode == g_sZoomModes[i]) {
+ return i + 1;
+ }
+ i ++;
+ }
+ return 0;
+}
+FX_FLOAT CPDF_Dest::GetParam(int index)
+{
+ if (m_pObj == NULL || m_pObj->GetType() != PDFOBJ_ARRAY) {
+ return 0;
+ }
+ return ((CPDF_Array*)m_pObj)->GetNumber(2 + index);
+}
+CFX_ByteString CPDF_Dest::GetRemoteName()
+{
+ if (m_pObj == NULL) {
+ return CFX_ByteString();
+ }
+ return m_pObj->GetString();
+}
+CPDF_NameTree::CPDF_NameTree(CPDF_Document* pDoc, FX_BSTR category)
+{
+ m_pRoot = pDoc->GetRoot()->GetDict(FX_BSTRC("Names"))->GetDict(category);
+}
+static CPDF_Object* SearchNameNode(CPDF_Dictionary* pNode, const CFX_ByteString& csName,
+ int& nIndex, CPDF_Array** ppFind, int nLevel = 0)
+{
+ if (nLevel > nMaxRecursion) {
+ return NULL;
+ }
+ CPDF_Array* pLimits = pNode->GetArray(FX_BSTRC("Limits"));
+ if (pLimits != NULL) {
+ CFX_ByteString csLeft = pLimits->GetString(0);
+ CFX_ByteString csRight = pLimits->GetString(1);
+ if (csLeft.Compare(csRight) > 0) {
+ CFX_ByteString csTmp = csRight;
+ csRight = csLeft;
+ csLeft = csTmp;
+ }
+ if (csName.Compare(csLeft) < 0 || csName.Compare(csRight) > 0) {
+ return NULL;
+ }
+ }
+ CPDF_Array* pNames = pNode->GetArray(FX_BSTRC("Names"));
+ if (pNames) {
+ FX_DWORD dwCount = pNames->GetCount() / 2;
+ for (FX_DWORD i = 0; i < dwCount; i ++) {
+ CFX_ByteString csValue = pNames->GetString(i * 2);
+ FX_INT32 iCompare = csValue.Compare(csName);
+ if (iCompare <= 0) {
+ if (ppFind != NULL) {
+ *ppFind = pNames;
+ }
+ if (iCompare < 0) {
+ continue;
+ }
+ } else {
+ break;
+ }
+ nIndex += i;
+ return pNames->GetElementValue(i * 2 + 1);
+ }
+ nIndex += dwCount;
+ return NULL;
+ }
+ CPDF_Array* pKids = pNode->GetArray(FX_BSTRC("Kids"));
+ if (pKids == NULL) {
+ return NULL;
+ }
+ for (FX_DWORD i = 0; i < pKids->GetCount(); i ++) {
+ CPDF_Dictionary* pKid = pKids->GetDict(i);
+ if (pKid == NULL) {
+ continue;
+ }
+ CPDF_Object* pFound = SearchNameNode(pKid, csName, nIndex, ppFind, nLevel + 1);
+ if (pFound) {
+ return pFound;
+ }
+ }
+ return NULL;
+}
+static CPDF_Object* SearchNameNode(CPDF_Dictionary* pNode, int nIndex, int& nCurIndex,
+ CFX_ByteString& csName, CPDF_Array** ppFind, int nLevel = 0)
+{
+ if (nLevel > nMaxRecursion) {
+ return NULL;
+ }
+ CPDF_Array* pNames = pNode->GetArray(FX_BSTRC("Names"));
+ if (pNames) {
+ int nCount = pNames->GetCount() / 2;
+ if (nIndex >= nCurIndex + nCount) {
+ nCurIndex += nCount;
+ return NULL;
+ } else {
+ if (ppFind != NULL) {
+ *ppFind = pNames;
+ }
+ csName = pNames->GetString((nIndex - nCurIndex) * 2);
+ return pNames->GetElementValue((nIndex - nCurIndex) * 2 + 1);
+ }
+ }
+ CPDF_Array* pKids = pNode->GetArray(FX_BSTRC("Kids"));
+ if (pKids == NULL) {
+ return NULL;
+ }
+ for (FX_DWORD i = 0; i < pKids->GetCount(); i ++) {
+ CPDF_Dictionary* pKid = pKids->GetDict(i);
+ if (pKid == NULL) {
+ continue;
+ }
+ CPDF_Object* pFound = SearchNameNode(pKid, nIndex, nCurIndex, csName, ppFind, nLevel + 1);
+ if (pFound) {
+ return pFound;
+ }
+ }
+ return NULL;
+}
+static int CountNames(CPDF_Dictionary* pNode, int nLevel = 0)
+{
+ if (nLevel > nMaxRecursion) {
+ return 0;
+ }
+ CPDF_Array* pNames = pNode->GetArray(FX_BSTRC("Names"));
+ if (pNames) {
+ return pNames->GetCount() / 2;
+ }
+ CPDF_Array* pKids = pNode->GetArray(FX_BSTRC("Kids"));
+ if (pKids == NULL) {
+ return 0;
+ }
+ int nCount = 0;
+ for (FX_DWORD i = 0; i < pKids->GetCount(); i ++) {
+ CPDF_Dictionary* pKid = pKids->GetDict(i);
+ if (pKid == NULL) {
+ continue;
+ }
+ nCount += CountNames(pKid, nLevel + 1);
+ }
+ return nCount;
+}
+int CPDF_NameTree::GetCount() const
+{
+ if (m_pRoot == NULL) {
+ return 0;
+ }
+ return ::CountNames(m_pRoot);
+}
+int CPDF_NameTree::GetIndex(const CFX_ByteString& csName) const
+{
+ if (m_pRoot == NULL) {
+ return -1;
+ }
+ int nIndex = 0;
+ if (SearchNameNode(m_pRoot, csName, nIndex, NULL) == NULL) {
+ return -1;
+ }
+ return nIndex;
+}
+CPDF_Object* CPDF_NameTree::LookupValue(int nIndex, CFX_ByteString& csName) const
+{
+ if (m_pRoot == NULL) {
+ return NULL;
+ }
+ int nCurIndex = 0;
+ return SearchNameNode(m_pRoot, nIndex, nCurIndex, csName, NULL);
+}
+CPDF_Object* CPDF_NameTree::LookupValue(const CFX_ByteString& csName) const
+{
+ if (m_pRoot == NULL) {
+ return NULL;
+ }
+ int nIndex = 0;
+ return SearchNameNode(m_pRoot, csName, nIndex, NULL);
+}
+CPDF_Array* CPDF_NameTree::LookupNamedDest(CPDF_Document* pDoc, FX_BSTR sName)
+{
+ CPDF_Object* pValue = LookupValue(sName);
+ if (pValue == NULL) {
+ CPDF_Dictionary* pDests = pDoc->GetRoot()->GetDict(FX_BSTRC("Dests"));
+ if (pDests == NULL) {
+ return NULL;
+ }
+ pValue = pDests->GetElementValue(sName);
+ }
+ if (pValue == NULL) {
+ return NULL;
+ }
+ if (pValue->GetType() == PDFOBJ_ARRAY) {
+ return (CPDF_Array*)pValue;
+ }
+ if (pValue->GetType() == PDFOBJ_DICTIONARY) {
+ return ((CPDF_Dictionary*)pValue)->GetArray(FX_BSTRC("D"));
+ }
+ return NULL;
+}
+static CFX_WideString ChangeSlashToPlatform(FX_LPCWSTR str)
+{
+ CFX_WideString result;
+ while (*str) {
+ if (*str == '/') {
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+ result += ':';
+#elif _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+ result += '\\';
+#else
+ result += *str;
+#endif
+ } else {
+ result += *str;
+ }
+ str++;
+ }
+ return result;
+}
+static CFX_WideString FILESPEC_DecodeFileName(FX_WSTR filepath)
+{
+ if (filepath.GetLength() <= 1) {
+ return CFX_WideString();
+ }
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+ if (filepath.Left(sizeof("/Mac") - 1) == CFX_WideStringC(L"/Mac")) {
+ return ChangeSlashToPlatform(filepath.GetPtr() + 1);
+ }
+ return ChangeSlashToPlatform(filepath.GetPtr());
+#elif _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+ if (filepath.GetAt(0) != '/') {
+ return ChangeSlashToPlatform(filepath.GetPtr());
+ }
+ if (filepath.GetAt(1) == '/') {
+ return ChangeSlashToPlatform(filepath.GetPtr() + 1);
+ }
+ if (filepath.GetAt(2) == '/') {
+ CFX_WideString result;
+ result += filepath.GetAt(1);
+ result += ':';
+ result += ChangeSlashToPlatform(filepath.GetPtr() + 2);
+ return result;
+ }
+ CFX_WideString result;
+ result += '\\';
+ result += ChangeSlashToPlatform(filepath.GetPtr());
+ return result;
+#else
+ return filepath;
+#endif
+}
+FX_BOOL CPDF_FileSpec::GetFileName(CFX_WideString &csFileName) const
+{
+ if (m_pObj == NULL) {
+ return FALSE;
+ }
+ if (m_pObj->GetType() == PDFOBJ_DICTIONARY) {
+ CPDF_Dictionary* pDict = (CPDF_Dictionary*)m_pObj;
+ csFileName = pDict->GetUnicodeText(FX_BSTRC("UF"));
+ if (csFileName.IsEmpty()) {
+ csFileName = CFX_WideString::FromLocal(pDict->GetString(FX_BSTRC("F")));
+ }
+ if (pDict->GetString(FX_BSTRC("FS")) == FX_BSTRC("URL")) {
+ return TRUE;
+ }
+ if (csFileName.IsEmpty()) {
+ if (pDict->KeyExist(FX_BSTRC("DOS"))) {
+ csFileName = CFX_WideString::FromLocal(pDict->GetString(FX_BSTRC("DOS")));
+ } else if (pDict->KeyExist(FX_BSTRC("Mac"))) {
+ csFileName = CFX_WideString::FromLocal(pDict->GetString(FX_BSTRC("Mac")));
+ } else if (pDict->KeyExist(FX_BSTRC("Unix"))) {
+ csFileName = CFX_WideString::FromLocal(pDict->GetString(FX_BSTRC("Unix")));
+ } else {
+ return FALSE;
+ }
+ }
+ } else {
+ csFileName = CFX_WideString::FromLocal(m_pObj->GetString());
+ }
+ csFileName = FILESPEC_DecodeFileName(csFileName);
+ return TRUE;
+}
+CPDF_FileSpec::CPDF_FileSpec()
+{
+ m_pObj = CPDF_Dictionary::Create();
+ if (m_pObj != NULL) {
+ ((CPDF_Dictionary*)m_pObj)->SetAtName(FX_BSTRC("Type"), FX_BSTRC("Filespec"));
+ }
+}
+FX_BOOL CPDF_FileSpec::IsURL() const
+{
+ if (m_pObj == NULL) {
+ return FALSE;
+ }
+ if (m_pObj->GetType() != PDFOBJ_DICTIONARY) {
+ return FALSE;
+ }
+ return ((CPDF_Dictionary*)m_pObj)->GetString(FX_BSTRC("FS")) == FX_BSTRC("URL");
+}
+static CFX_WideString ChangeSlashToPDF(FX_LPCWSTR str)
+{
+ CFX_WideString result;
+ while (*str) {
+ if (*str == '\\' || *str == ':') {
+ result += '/';
+ } else {
+ result += *str;
+ }
+ str++;
+ }
+ return result;
+}
+CFX_WideString FILESPEC_EncodeFileName(FX_WSTR filepath)
+{
+ if (filepath.GetLength() <= 1) {
+ return CFX_WideString();
+ }
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+ if (filepath.GetAt(1) == ':') {
+ CFX_WideString result;
+ result = '/';
+ result += filepath.GetAt(0);
+ if (filepath.GetAt(2) != '\\') {
+ result += '/';
+ }
+ result += ChangeSlashToPDF(filepath.GetPtr() + 2);
+ return result;
+ }
+ if (filepath.GetAt(0) == '\\' && filepath.GetAt(1) == '\\') {
+ return ChangeSlashToPDF(filepath.GetPtr() + 1);
+ }
+ if (filepath.GetAt(0) == '\\') {
+ CFX_WideString result;
+ result = '/';
+ result += ChangeSlashToPDF(filepath.GetPtr());
+ return result;
+ }
+ return ChangeSlashToPDF(filepath.GetPtr());
+#elif _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+ if (filepath.Left(sizeof("Mac") - 1) == FX_WSTRC(L"Mac")) {
+ CFX_WideString result;
+ result = '/';
+ result += ChangeSlashToPDF(filepath.GetPtr());
+ return result;
+ }
+ return ChangeSlashToPDF(filepath.GetPtr());
+#else
+ return filepath;
+#endif
+}
+CPDF_Stream* CPDF_FileSpec::GetFileStream() const
+{
+ if (m_pObj == NULL) {
+ return NULL;
+ }
+ FX_INT32 iType = m_pObj->GetType();
+ if (iType == PDFOBJ_STREAM) {
+ return (CPDF_Stream*)m_pObj;
+ } else if (iType == PDFOBJ_DICTIONARY) {
+ CPDF_Dictionary *pEF = ((CPDF_Dictionary*)m_pObj)->GetDict(FX_BSTRC("EF"));
+ if (pEF == NULL) {
+ return NULL;
+ }
+ return pEF->GetStream(FX_BSTRC("F"));
+ }
+ return NULL;
+}
+static void FPDFDOC_FILESPEC_SetFileName(CPDF_Object *pObj, FX_WSTR wsFileName, FX_BOOL bURL)
+{
+ ASSERT(pObj != NULL);
+ CFX_WideString wsStr;
+ if (bURL) {
+ wsStr = wsFileName;
+ } else {
+ wsStr = FILESPEC_EncodeFileName(wsFileName);
+ }
+ FX_INT32 iType = pObj->GetType();
+ if (iType == PDFOBJ_STRING) {
+ pObj->SetString(CFX_ByteString::FromUnicode(wsStr));
+ } else if (iType == PDFOBJ_DICTIONARY) {
+ CPDF_Dictionary* pDict = (CPDF_Dictionary*)pObj;
+ pDict->SetAtString(FX_BSTRC("F"), CFX_ByteString::FromUnicode(wsStr));
+ pDict->SetAtString(FX_BSTRC("UF"), PDF_EncodeText(wsStr));
+ }
+}
+void CPDF_FileSpec::SetFileName(FX_WSTR wsFileName, FX_BOOL bURL)
+{
+ ASSERT(m_pObj != NULL);
+ if (m_pObj->GetType() == PDFOBJ_DICTIONARY && bURL) {
+ ((CPDF_Dictionary*)m_pObj)->SetAtName(FX_BSTRC("FS"), "URL");
+ }
+ FPDFDOC_FILESPEC_SetFileName(m_pObj, wsFileName, bURL);
+}
+static CFX_WideString _MakeRoman(int num)
+{
+ const int arabic[] = {
+ 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1
+ };
+ const CFX_WideString roman[] = {
+ L"m", L"cm", L"d", L"cd", L"c", L"xc", L"l", L"xl", L"x", L"ix", L"v", L"iv", L"i"
+ };
+ const int nMaxNum = 1000000;
+ num %= nMaxNum;
+ int i = 0;
+ CFX_WideString wsRomanNumber;
+ while (num > 0) {
+ while (num >= arabic[i]) {
+ num = num - arabic[i];
+ wsRomanNumber += roman[i];
+ }
+ i = i + 1;
+ }
+ return wsRomanNumber;
+}
+static CFX_WideString _MakeLetters(int num)
+{
+ if (num == 0) {
+ return CFX_WideString();
+ }
+ CFX_WideString wsLetters;
+ const int nMaxCount = 1000;
+ const int nLetterCount = 26;
+ num -= 1;
+ int count = num / nLetterCount + 1;
+ count %= nMaxCount;
+ FX_WCHAR ch = L'a' + num % nLetterCount;
+ for (int i = 0; i < count; i++) {
+ wsLetters += ch;
+ }
+ return wsLetters;
+}
+static CFX_WideString _GetLabelNumPortion(int num, const CFX_ByteString& bsStyle)
+{
+ CFX_WideString wsNumPortion;
+ if (bsStyle.IsEmpty()) {
+ return wsNumPortion;
+ }
+ if (bsStyle == "D") {
+ wsNumPortion.Format((FX_LPCWSTR)L"%d", num);
+ } else if (bsStyle == "R") {
+ wsNumPortion = _MakeRoman(num);
+ wsNumPortion.MakeUpper();
+ } else if (bsStyle == "r") {
+ wsNumPortion = _MakeRoman(num);
+ } else if (bsStyle == "A") {
+ wsNumPortion = _MakeLetters(num);
+ wsNumPortion.MakeUpper();
+ } else if (bsStyle == "a") {
+ wsNumPortion = _MakeLetters(num);
+ }
+ return wsNumPortion;
+}
+CFX_WideString CPDF_PageLabel::GetLabel(int nPage) const
+{
+ CFX_WideString wsLabel;
+ if (m_pDocument == NULL) {
+ return wsLabel;
+ }
+ CPDF_Dictionary* pPDFRoot = m_pDocument->GetRoot();
+ if (pPDFRoot == NULL) {
+ return wsLabel;
+ }
+ CPDF_Dictionary* pLabels = pPDFRoot->GetDict(FX_BSTRC("PageLabels"));
+ CPDF_NumberTree numberTree(pLabels);
+ CPDF_Object* pValue = NULL;
+ int n = nPage;
+ while (n >= 0) {
+ pValue = numberTree.LookupValue(n);
+ if (pValue != NULL) {
+ break;
+ }
+ n--;
+ }
+ if (pValue != NULL) {
+ pValue = pValue->GetDirect();
+ if (pValue->GetType() == PDFOBJ_DICTIONARY) {
+ CPDF_Dictionary* pLabel = (CPDF_Dictionary*)pValue;
+ if (pLabel->KeyExist(FX_BSTRC("P"))) {
+ wsLabel += pLabel->GetUnicodeText(FX_BSTRC("P"));
+ }
+ CFX_ByteString bsNumberingStyle = pLabel->GetString(FX_BSTRC("S"), NULL);
+ int nLabelNum = nPage - n + pLabel->GetInteger(FX_BSTRC("St"), 1);
+ CFX_WideString wsNumPortion = _GetLabelNumPortion(nLabelNum, bsNumberingStyle);
+ wsLabel += wsNumPortion;
+ return wsLabel;
+ }
+ }
+ wsLabel.Format((FX_LPCWSTR)L"%d", nPage + 1);
+ return wsLabel;
+}
+FX_INT32 CPDF_PageLabel::GetPageByLabel(FX_BSTR bsLabel) const
+{
+ if (m_pDocument == NULL) {
+ return -1;
+ }
+ CPDF_Dictionary* pPDFRoot = m_pDocument->GetRoot();
+ if (pPDFRoot == NULL) {
+ return -1;
+ }
+ int nPages = m_pDocument->GetPageCount();
+ CFX_ByteString bsLbl;
+ CFX_ByteString bsOrig = bsLabel;
+ for (int i = 0; i < nPages; i++) {
+ bsLbl = PDF_EncodeText(GetLabel(i));
+ if (!bsLbl.Compare(bsOrig)) {
+ return i;
+ }
+ }
+ bsLbl = bsOrig;
+ int nPage = FXSYS_atoi(bsLbl);
+ if (nPage > 0 && nPage <= nPages) {
+ return nPage;
+ }
+ return -1;
+}
+FX_INT32 CPDF_PageLabel::GetPageByLabel(FX_WSTR wsLabel) const
+{
+ CFX_ByteString bsLabel = PDF_EncodeText((CFX_WideString)wsLabel);
+ return GetPageByLabel(bsLabel);
+}
diff --git a/core/src/fpdfdoc/doc_bookmark.cpp b/core/src/fpdfdoc/doc_bookmark.cpp
index 6cc954bd69..0ae649ecdd 100644
--- a/core/src/fpdfdoc/doc_bookmark.cpp
+++ b/core/src/fpdfdoc/doc_bookmark.cpp
@@ -1,91 +1,91 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../include/fpdfdoc/fpdf_doc.h"
-CPDF_Bookmark CPDF_BookmarkTree::GetFirstChild(CPDF_Bookmark Parent)
-{
- if (Parent.m_pDict == NULL) {
- CPDF_Dictionary* pRoot = m_pDocument->GetRoot()->GetDict("Outlines");
- if (pRoot == NULL) {
- return NULL;
- }
- return pRoot->GetDict("First");
- }
- return Parent.m_pDict->GetDict("First");
-}
-CPDF_Bookmark CPDF_BookmarkTree::GetNextSibling(CPDF_Bookmark This)
-{
- if (This.m_pDict == NULL) {
- return NULL;
- }
- CPDF_Dictionary *pNext = This.m_pDict->GetDict("Next");
- return pNext == This.m_pDict ? NULL : pNext;
-}
-FX_DWORD CPDF_Bookmark::GetColorRef()
-{
- if (!m_pDict) {
- return 0;
- }
- CPDF_Array* pColor = m_pDict->GetArray("C");
- if (pColor == NULL) {
- return FXSYS_RGB(0, 0, 0);
- }
- int r = FXSYS_round(pColor->GetNumber(0) * 255);
- int g = FXSYS_round(pColor->GetNumber(1) * 255);
- int b = FXSYS_round(pColor->GetNumber(2) * 255);
- return FXSYS_RGB(r, g, b);
-}
-FX_DWORD CPDF_Bookmark::GetFontStyle()
-{
- if (!m_pDict) {
- return 0;
- }
- return m_pDict->GetInteger("F");
-}
-CFX_WideString CPDF_Bookmark::GetTitle()
-{
- if (!m_pDict) {
- return CFX_WideString();
- }
- CPDF_String* pString = (CPDF_String*)m_pDict->GetElementValue("Title");
- if (pString == NULL || pString->GetType() != PDFOBJ_STRING) {
- return CFX_WideString();
- }
- CFX_WideString title = pString->GetUnicodeText();
- FX_LPWSTR buf = title.LockBuffer();
- int len = title.GetLength(), i;
- for (i = 0; i < len; i ++)
- if (buf[i] < 0x20) {
- buf[i] = 0x20;
- }
- title.ReleaseBuffer(len);
- return title;
-}
-CPDF_Dest CPDF_Bookmark::GetDest(CPDF_Document* pDocument)
-{
- if (!m_pDict) {
- return NULL;
- }
- CPDF_Object* pDest = m_pDict->GetElementValue("Dest");
- if (pDest == NULL) {
- return NULL;
- }
- if (pDest->GetType() == PDFOBJ_STRING || pDest->GetType() == PDFOBJ_NAME) {
- CPDF_NameTree name_tree(pDocument, FX_BSTRC("Dests"));
- CFX_ByteStringC name = pDest->GetString();
- return name_tree.LookupNamedDest(pDocument, name);
- } else if (pDest->GetType() == PDFOBJ_ARRAY) {
- return (CPDF_Array*)pDest;
- }
- return NULL;
-}
-CPDF_Action CPDF_Bookmark::GetAction()
-{
- if (!m_pDict) {
- return NULL;
- }
- return m_pDict->GetDict("A");
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fpdfdoc/fpdf_doc.h"
+CPDF_Bookmark CPDF_BookmarkTree::GetFirstChild(CPDF_Bookmark Parent)
+{
+ if (Parent.m_pDict == NULL) {
+ CPDF_Dictionary* pRoot = m_pDocument->GetRoot()->GetDict("Outlines");
+ if (pRoot == NULL) {
+ return NULL;
+ }
+ return pRoot->GetDict("First");
+ }
+ return Parent.m_pDict->GetDict("First");
+}
+CPDF_Bookmark CPDF_BookmarkTree::GetNextSibling(CPDF_Bookmark This)
+{
+ if (This.m_pDict == NULL) {
+ return NULL;
+ }
+ CPDF_Dictionary *pNext = This.m_pDict->GetDict("Next");
+ return pNext == This.m_pDict ? NULL : pNext;
+}
+FX_DWORD CPDF_Bookmark::GetColorRef()
+{
+ if (!m_pDict) {
+ return 0;
+ }
+ CPDF_Array* pColor = m_pDict->GetArray("C");
+ if (pColor == NULL) {
+ return FXSYS_RGB(0, 0, 0);
+ }
+ int r = FXSYS_round(pColor->GetNumber(0) * 255);
+ int g = FXSYS_round(pColor->GetNumber(1) * 255);
+ int b = FXSYS_round(pColor->GetNumber(2) * 255);
+ return FXSYS_RGB(r, g, b);
+}
+FX_DWORD CPDF_Bookmark::GetFontStyle()
+{
+ if (!m_pDict) {
+ return 0;
+ }
+ return m_pDict->GetInteger("F");
+}
+CFX_WideString CPDF_Bookmark::GetTitle()
+{
+ if (!m_pDict) {
+ return CFX_WideString();
+ }
+ CPDF_String* pString = (CPDF_String*)m_pDict->GetElementValue("Title");
+ if (pString == NULL || pString->GetType() != PDFOBJ_STRING) {
+ return CFX_WideString();
+ }
+ CFX_WideString title = pString->GetUnicodeText();
+ FX_LPWSTR buf = title.LockBuffer();
+ int len = title.GetLength(), i;
+ for (i = 0; i < len; i ++)
+ if (buf[i] < 0x20) {
+ buf[i] = 0x20;
+ }
+ title.ReleaseBuffer(len);
+ return title;
+}
+CPDF_Dest CPDF_Bookmark::GetDest(CPDF_Document* pDocument)
+{
+ if (!m_pDict) {
+ return NULL;
+ }
+ CPDF_Object* pDest = m_pDict->GetElementValue("Dest");
+ if (pDest == NULL) {
+ return NULL;
+ }
+ if (pDest->GetType() == PDFOBJ_STRING || pDest->GetType() == PDFOBJ_NAME) {
+ CPDF_NameTree name_tree(pDocument, FX_BSTRC("Dests"));
+ CFX_ByteStringC name = pDest->GetString();
+ return name_tree.LookupNamedDest(pDocument, name);
+ } else if (pDest->GetType() == PDFOBJ_ARRAY) {
+ return (CPDF_Array*)pDest;
+ }
+ return NULL;
+}
+CPDF_Action CPDF_Bookmark::GetAction()
+{
+ if (!m_pDict) {
+ return NULL;
+ }
+ return m_pDict->GetDict("A");
+}
diff --git a/core/src/fpdfdoc/doc_form.cpp b/core/src/fpdfdoc/doc_form.cpp
index 1139233987..c1e41526d4 100644
--- a/core/src/fpdfdoc/doc_form.cpp
+++ b/core/src/fpdfdoc/doc_form.cpp
@@ -1,1664 +1,1664 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../include/fpdfdoc/fpdf_doc.h"
-#include "../../include/fxcrt/fx_xml.h"
-CFX_WideString GetFullName(CPDF_Dictionary* pFieldDict);
-void InitInterFormDict(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument);
-FX_DWORD CountInterFormFonts(CPDF_Dictionary* pFormDict);
-CPDF_Font* GetInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, FX_DWORD index, CFX_ByteString& csNameTag);
-CPDF_Font* GetInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString csNameTag);
-CPDF_Font* GetInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString csFontName, CFX_ByteString& csNameTag);
-CPDF_Font* GetNativeInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, FX_BYTE charSet, CFX_ByteString& csNameTag);
-CPDF_Font* GetNativeInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString& csNameTag);
-FX_BOOL FindInterFormFont(CPDF_Dictionary* pFormDict, const CPDF_Font* pFont, CFX_ByteString& csNameTag);
-FX_BOOL FindInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString csFontName, CPDF_Font*& pFont, CFX_ByteString& csNameTag);
-void AddInterFormFont(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument, const CPDF_Font* pFont, CFX_ByteString& csNameTag);
-CPDF_Font* AddNativeInterFormFont(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument, FX_BYTE charSet, CFX_ByteString& csNameTag);
-CPDF_Font* AddNativeInterFormFont(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument, CFX_ByteString& csNameTag);
-void RemoveInterFormFont(CPDF_Dictionary* pFormDict, const CPDF_Font* pFont);
-void RemoveInterFormFont(CPDF_Dictionary* pFormDict, CFX_ByteString csNameTag);
-CPDF_Font* GetDefaultInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument);
-void SetDefaultInterFormFont(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument, const CPDF_Font* pFont);
-void SaveCheckedFieldStatus(CPDF_FormField* pField, CFX_ByteArray& statusArray);
-FX_BOOL NeedPDFEncodeForFieldFullName(const CFX_WideString& csFieldName);
-FX_BOOL NeedPDFEncodeForFieldTree(CPDF_Dictionary* pFieldDict, int nLevel = 0);
-void EncodeFieldName(const CFX_WideString& csName, CFX_ByteString& csT);
-void UpdateEncodeFieldName(CPDF_Dictionary* pFieldDict, int nLevel = 0);
-const int nMaxRecursion = 32;
-class _CFieldNameExtractor : public CFX_Object
-{
-public:
- _CFieldNameExtractor(const CFX_WideString& full_name)
- {
- m_pStart = full_name;
- m_pEnd = m_pStart + full_name.GetLength();
- m_pCur = m_pStart;
- }
- void GetNext(FX_LPCWSTR &pSubName, FX_STRSIZE& size)
- {
- pSubName = m_pCur;
- while (m_pCur < m_pEnd && m_pCur[0] != L'.') {
- m_pCur++;
- }
- size = (FX_STRSIZE)(m_pCur - pSubName);
- if (m_pCur < m_pEnd && m_pCur[0] == L'.') {
- m_pCur++;
- }
- }
-protected:
- FX_LPCWSTR m_pStart;
- FX_LPCWSTR m_pEnd;
- FX_LPCWSTR m_pCur;
-};
-class CFieldTree : public CFX_Object
-{
-public:
- struct _Node : public CFX_Object {
- _Node *parent;
- CFX_PtrArray children;
- CFX_WideString short_name;
- CPDF_FormField *field_ptr;
- int CountFields(int nLevel = 0)
- {
- if (nLevel > nMaxRecursion) {
- return 0;
- }
- if (field_ptr) {
- return 1;
- }
- int count = 0;
- for (int i = 0; i < children.GetSize(); i ++) {
- count += ((_Node *)children.GetAt(i))->CountFields(nLevel + 1);
- }
- return count;
- }
- CPDF_FormField* GetField(int* fields_to_go)
- {
- if (field_ptr) {
- if (*fields_to_go == 0) {
- return field_ptr;
- }
- --*fields_to_go;
- return NULL;
- }
- for (int i = 0; i < children.GetSize(); i++) {
- _Node *pNode = (_Node *)children.GetAt(i);
- CPDF_FormField* pField = pNode->GetField(fields_to_go);
- if (pField) {
- return pField;
- }
- }
- return NULL;
- }
- CPDF_FormField* GetField(int index)
- {
- int fields_to_go = index;
- return GetField(&fields_to_go);
- }
- };
- CFieldTree();
- ~CFieldTree();
- void SetField(const CFX_WideString &full_name, CPDF_FormField *field_ptr);
- CPDF_FormField *GetField(const CFX_WideString &full_name);
- CPDF_FormField *RemoveField(const CFX_WideString &full_name);
- void RemoveAll();
- _Node *FindNode(const CFX_WideString &full_name);
- _Node * AddChild(_Node *pParent, const CFX_WideString &short_name, CPDF_FormField *field_ptr);
- void RemoveNode(_Node *pNode, int nLevel = 0);
- _Node *_Lookup(_Node *pParent, const CFX_WideString &short_name);
- _Node m_Root;
-};
-CFieldTree::CFieldTree()
-{
- m_Root.parent = NULL;
- m_Root.field_ptr = NULL;
-}
-CFieldTree::~CFieldTree()
-{
- RemoveAll();
-}
-CFieldTree::_Node *CFieldTree::AddChild(_Node *pParent, const CFX_WideString &short_name, CPDF_FormField *field_ptr)
-{
- if (pParent == NULL) {
- return NULL;
- }
- _Node *pNode = FX_NEW _Node;
- if (pNode == NULL) {
- return NULL;
- }
- pNode->parent = pParent;
- pNode->short_name = short_name;
- pNode->field_ptr = field_ptr;
- pParent->children.Add(pNode);
- return pNode;
-}
-void CFieldTree::RemoveNode(_Node *pNode, int nLevel)
-{
- if (pNode == NULL) {
- return ;
- }
- if (nLevel > nMaxRecursion) {
- delete pNode;
- return ;
- }
- CFX_PtrArray& ptr_array = pNode->children;
- for (int i = 0; i < ptr_array.GetSize(); i ++) {
- _Node *pChild = (_Node *)ptr_array[i];
- RemoveNode(pChild, nLevel + 1);
- }
- delete pNode;
-}
-CFieldTree::_Node *CFieldTree::_Lookup(_Node *pParent, const CFX_WideString &short_name)
-{
- if (pParent == NULL) {
- return NULL;
- }
- CFX_PtrArray& ptr_array = pParent->children;
- for (int i = 0; i < ptr_array.GetSize(); i ++) {
- _Node *pNode = (_Node *)ptr_array[i];
- if (pNode->short_name.GetLength() == short_name.GetLength() &&
- FXSYS_memcmp32((FX_LPCWSTR)pNode->short_name, (FX_LPCWSTR)short_name, short_name.GetLength()*sizeof(FX_WCHAR)) == 0) {
- return pNode;
- }
- }
- return NULL;
-}
-void CFieldTree::RemoveAll()
-{
- CFX_PtrArray& ptr_array = m_Root.children;
- for (int i = 0; i < ptr_array.GetSize(); i ++) {
- _Node *pNode = (_Node *)ptr_array[i];
- RemoveNode(pNode);
- }
-}
-void CFieldTree::SetField(const CFX_WideString &full_name, CPDF_FormField *field_ptr)
-{
- if (full_name == L"") {
- return;
- }
- _CFieldNameExtractor name_extractor(full_name);
- FX_LPCWSTR pName;
- FX_STRSIZE nLength;
- name_extractor.GetNext(pName, nLength);
- _Node *pNode = &m_Root, *pLast = NULL;
- while (nLength > 0) {
- pLast = pNode;
- CFX_WideString name = CFX_WideString(pName, nLength);
- pNode = _Lookup(pLast, name);
- if (pNode == NULL) {
- pNode = AddChild(pLast, name, NULL);
- }
- name_extractor.GetNext(pName, nLength);
- }
- if (pNode != &m_Root) {
- pNode->field_ptr = field_ptr;
- }
-}
-CPDF_FormField *CFieldTree::GetField(const CFX_WideString &full_name)
-{
- if (full_name == L"") {
- return NULL;
- }
- _CFieldNameExtractor name_extractor(full_name);
- FX_LPCWSTR pName;
- FX_STRSIZE nLength;
- name_extractor.GetNext(pName, nLength);
- _Node *pNode = &m_Root, *pLast = NULL;
- while (nLength > 0 && pNode) {
- pLast = pNode;
- CFX_WideString name = CFX_WideString(pName, nLength);
- pNode = _Lookup(pLast, name);
- name_extractor.GetNext(pName, nLength);
- }
- return pNode ? pNode->field_ptr : NULL;
-}
-CPDF_FormField *CFieldTree::RemoveField(const CFX_WideString & full_name)
-{
- if (full_name == L"") {
- return NULL;
- }
- _CFieldNameExtractor name_extractor(full_name);
- FX_LPCWSTR pName;
- FX_STRSIZE nLength;
- name_extractor.GetNext(pName, nLength);
- _Node *pNode = &m_Root, *pLast = NULL;
- while (nLength > 0 && pNode) {
- pLast = pNode;
- CFX_WideString name = CFX_WideString(pName, nLength);
- pNode = _Lookup(pLast, name);
- name_extractor.GetNext(pName, nLength);
- }
- if (pNode && pNode != &m_Root) {
- CFX_PtrArray& ptr_array = pLast->children;
- for (int i = 0; i < ptr_array.GetSize(); i ++) {
- if (pNode == (_Node *)ptr_array[i]) {
- ptr_array.RemoveAt(i);
- break;
- }
- }
- CPDF_FormField *pField = pNode->field_ptr;
- RemoveNode(pNode);
- return pField;
- }
- return NULL;
-}
-CFieldTree::_Node *CFieldTree::FindNode(const CFX_WideString& full_name)
-{
- if (full_name == L"") {
- return NULL;
- }
- _CFieldNameExtractor name_extractor(full_name);
- FX_LPCWSTR pName;
- FX_STRSIZE nLength;
- name_extractor.GetNext(pName, nLength);
- _Node *pNode = &m_Root, *pLast = NULL;
- while (nLength > 0 && pNode) {
- pLast = pNode;
- CFX_WideString name = CFX_WideString(pName, nLength);
- pNode = _Lookup(pLast, name);
- name_extractor.GetNext(pName, nLength);
- }
- return pNode;
-}
-CPDF_InterForm::CPDF_InterForm(CPDF_Document* pDocument, FX_BOOL bGenerateAP) : CFX_PrivateData()
-{
- m_pDocument = pDocument;
- m_bGenerateAP = bGenerateAP;
- m_pFormNotify = NULL;
- m_bUpdated = FALSE;
- m_pFieldTree = FX_NEW CFieldTree;
- CPDF_Dictionary* pRoot = m_pDocument->GetRoot();
- m_pFormDict = pRoot->GetDict("AcroForm");
- if (m_pFormDict == NULL) {
- return;
- }
- CPDF_Array* pFields = m_pFormDict->GetArray("Fields");
- if (pFields == NULL) {
- return;
- }
- int count = pFields->GetCount();
- for (int i = 0; i < count; i ++) {
- LoadField(pFields->GetDict(i));
- }
-}
-CPDF_InterForm::~CPDF_InterForm()
-{
- FX_POSITION pos = m_ControlMap.GetStartPosition();
- while (pos) {
- FX_LPVOID key, value;
- m_ControlMap.GetNextAssoc(pos, key, value);
- delete (CPDF_FormControl*)value;
- }
- if (m_pFieldTree != NULL) {
- int nCount = m_pFieldTree->m_Root.CountFields();
- for (int i = 0; i < nCount; i++) {
- CPDF_FormField *pField = m_pFieldTree->m_Root.GetField(i);
- delete pField;
- }
- delete m_pFieldTree;
- }
-}
-FX_BOOL CPDF_InterForm::m_bUpdateAP = TRUE;
-FX_BOOL CPDF_InterForm::UpdatingAPEnabled()
-{
- return m_bUpdateAP;
-}
-void CPDF_InterForm::EnableUpdateAP(FX_BOOL bUpdateAP)
-{
- m_bUpdateAP = bUpdateAP;
-}
-CFX_ByteString CPDF_InterForm::GenerateNewResourceName(const CPDF_Dictionary* pResDict, FX_LPCSTR csType, int iMinLen, FX_LPCSTR csPrefix)
-{
- CFX_ByteString csStr = csPrefix;
- CFX_ByteString csBType = csType;
- if (csStr.IsEmpty()) {
- if (csBType == "ExtGState") {
- csStr = "GS";
- } else if (csBType == "ColorSpace") {
- csStr = "CS";
- } else if (csBType == "Font") {
- csStr = "ZiTi";
- } else {
- csStr = "Res";
- }
- }
- CFX_ByteString csTmp = csStr;
- int iCount = csStr.GetLength();
- int m = 0;
- if (iMinLen > 0) {
- csTmp = "";
- while (m < iMinLen && m < iCount) {
- csTmp += csStr[m ++];
- }
- while (m < iMinLen) {
- csTmp += '0' + m % 10;
- m ++;
- }
- } else {
- m = iCount;
- }
- if (pResDict == NULL) {
- return csTmp;
- }
- CPDF_Dictionary* pDict = pResDict->GetDict(csType);
- if (pDict == NULL) {
- return csTmp;
- }
- int num = 0;
- CFX_ByteString bsNum;
- while (TRUE) {
- if (!pDict->KeyExist(csTmp + bsNum)) {
- return csTmp + bsNum;
- }
- if (m < iCount) {
- csTmp += csStr[m ++];
- } else {
- bsNum.Format("%d", num++);
- }
- m ++;
- }
- return csTmp;
-}
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
-typedef struct _PDF_FONTDATA {
- FX_BOOL bFind;
- LOGFONTA lf;
-} PDF_FONTDATA, FAR* LPDF_FONTDATA;
-static int CALLBACK EnumFontFamExProc( ENUMLOGFONTEXA *lpelfe,
- NEWTEXTMETRICEX *lpntme,
- DWORD FontType,
- LPARAM lParam
- )
-{
- if (FontType != 0x004 || strchr(lpelfe->elfLogFont.lfFaceName, '@') != NULL) {
- return 1;
- } else {
- LPDF_FONTDATA pData = (LPDF_FONTDATA)lParam;
- memcpy(&pData->lf, &lpelfe->elfLogFont, sizeof(LOGFONTA));
- pData->bFind = TRUE;
- return 0;
- }
-}
-static FX_BOOL RetrieveSpecificFont(LOGFONTA& lf)
-{
- PDF_FONTDATA fd;
- memset(&fd, 0, sizeof(PDF_FONTDATA));
- HDC hDC = ::GetDC(NULL);
- EnumFontFamiliesExA(hDC, &lf, (FONTENUMPROCA)EnumFontFamExProc, (LPARAM)&fd, 0);
- ::ReleaseDC(NULL, hDC);
- if (fd.bFind) {
- memcpy(&lf, &fd.lf, sizeof(LOGFONTA));
- }
- return fd.bFind;
-}
-static FX_BOOL RetrieveSpecificFont(FX_BYTE charSet, FX_BYTE pitchAndFamily, LPCSTR pcsFontName, LOGFONTA& lf)
-{
- memset(&lf, 0, sizeof(LOGFONTA));
- lf.lfCharSet = charSet;
- lf.lfPitchAndFamily = pitchAndFamily;
- if (pcsFontName != NULL) {
- strcpy(lf.lfFaceName, pcsFontName);
- }
- return RetrieveSpecificFont(lf);
-}
-static FX_BOOL RetrieveStockFont(int iFontObject, FX_BYTE charSet, LOGFONTA& lf)
-{
- HFONT hFont = (HFONT)::GetStockObject(iFontObject);
- if (hFont != NULL) {
- memset(&lf, 0, sizeof(LOGFONTA));
- int iRet = ::GetObject(hFont, sizeof(LOGFONTA), &lf);
- if (iRet > 0 && (lf.lfCharSet == charSet || charSet == 255)) {
- return RetrieveSpecificFont(lf);
- }
- }
- return FALSE;
-}
-#endif
-CPDF_Font* CPDF_InterForm::AddSystemDefaultFont(const CPDF_Document* pDocument)
-{
- if (pDocument == NULL) {
- return NULL;
- }
- CPDF_Font* pFont = NULL;
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
- LOGFONTA lf;
- FX_BOOL bRet;
- bRet = RetrieveStockFont(DEFAULT_GUI_FONT, 255, lf);
- if (!bRet) {
- bRet = RetrieveStockFont(SYSTEM_FONT, 255, lf);
- }
- if (bRet) {
- pFont = ((CPDF_Document*)pDocument)->AddWindowsFont(&lf, FALSE, TRUE);
- }
-#endif
- return pFont;
-}
-CPDF_Font* CPDF_InterForm::AddSystemFont(const CPDF_Document* pDocument, CFX_ByteString csFontName, FX_BYTE iCharSet)
-{
- if (pDocument == NULL || csFontName.IsEmpty()) {
- return NULL;
- }
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
- if (iCharSet == 1) {
- iCharSet = GetNativeCharSet();
- }
- HFONT hFont = ::CreateFontA(0, 0, 0, 0, 0, 0, 0, 0, iCharSet, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, (FX_LPCSTR)csFontName);
- if (hFont != NULL) {
- LOGFONTA lf;
- memset(&lf, 0, sizeof(LOGFONTA));
- ::GetObjectA(hFont, sizeof(LOGFONTA), &lf);
- ::DeleteObject(hFont);
- if (strlen(lf.lfFaceName) > 0) {
- return ((CPDF_Document*)pDocument)->AddWindowsFont(&lf, FALSE, TRUE);
- }
- }
-#endif
- return NULL;
-}
-CPDF_Font* CPDF_InterForm::AddSystemFont(const CPDF_Document* pDocument, CFX_WideString csFontName, FX_BYTE iCharSet)
-{
- if (pDocument == NULL || csFontName.IsEmpty()) {
- return NULL;
- }
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
- if (iCharSet == 1) {
- iCharSet = GetNativeCharSet();
- }
- HFONT hFont = ::CreateFontW(0, 0, 0, 0, 0, 0, 0, 0, iCharSet, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, csFontName);
- if (hFont != NULL) {
- LOGFONTA lf;
- memset(&lf, 0, sizeof(LOGFONTA));
- ::GetObject(hFont, sizeof(LOGFONTA), &lf);
- ::DeleteObject(hFont);
- if (strlen(lf.lfFaceName) > 0) {
- return ((CPDF_Document*)pDocument)->AddWindowsFont(&lf, FALSE, TRUE);
- }
- }
-#endif
- return NULL;
-}
-CPDF_Font* CPDF_InterForm::AddStandardFont(const CPDF_Document* pDocument, CFX_ByteString csFontName)
-{
- if (pDocument == NULL || csFontName.IsEmpty()) {
- return NULL;
- }
- CPDF_Font* pFont = NULL;
- if (csFontName == "ZapfDingbats") {
- pFont = ((CPDF_Document*)pDocument)->AddStandardFont(csFontName, NULL);
- } else {
- CPDF_FontEncoding encoding(PDFFONT_ENCODING_WINANSI);
- pFont = ((CPDF_Document*)pDocument)->AddStandardFont(csFontName, &encoding);
- }
- return pFont;
-}
-CFX_ByteString CPDF_InterForm::GetNativeFont(FX_BYTE charSet, FX_LPVOID pLogFont)
-{
- CFX_ByteString csFontName;
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
- LOGFONTA lf;
- FX_BOOL bRet;
- if (charSet == ANSI_CHARSET) {
- csFontName = "Helvetica";
- return csFontName;
- }
- bRet = FALSE;
- if (charSet == SHIFTJIS_CHARSET) {
- bRet = RetrieveSpecificFont(charSet, DEFAULT_PITCH | FF_DONTCARE, "MS Mincho", lf);
- } else if (charSet == GB2312_CHARSET) {
- bRet = RetrieveSpecificFont(charSet, DEFAULT_PITCH | FF_DONTCARE, "SimSun", lf);
- } else if (charSet == CHINESEBIG5_CHARSET) {
- bRet = RetrieveSpecificFont(charSet, DEFAULT_PITCH | FF_DONTCARE, "MingLiU", lf);
- }
- if (!bRet) {
- bRet = RetrieveSpecificFont(charSet, DEFAULT_PITCH | FF_DONTCARE, "Arial Unicode MS", lf);
- }
- if (!bRet) {
- bRet = RetrieveSpecificFont(charSet, DEFAULT_PITCH | FF_DONTCARE, "Microsoft Sans Serif", lf);
- }
- if (!bRet) {
- bRet = RetrieveSpecificFont(charSet, DEFAULT_PITCH | FF_DONTCARE, NULL, lf);
- }
- if (bRet) {
- if (pLogFont != NULL) {
- memcpy(pLogFont, &lf, sizeof(LOGFONTA));
- }
- csFontName = lf.lfFaceName;
- return csFontName;
- }
-#endif
- return csFontName;
-}
-CFX_ByteString CPDF_InterForm::GetNativeFont(FX_LPVOID pLogFont)
-{
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
- FX_BYTE charSet = GetNativeCharSet();
- return GetNativeFont(charSet, pLogFont);
-#else
- return CFX_ByteString();
-#endif
-}
-FX_BYTE CPDF_InterForm::GetNativeCharSet()
-{
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
- FX_BYTE charSet = ANSI_CHARSET;
- UINT iCodePage = ::GetACP();
- switch (iCodePage) {
- case 932:
- charSet = SHIFTJIS_CHARSET;
- break;
- case 936:
- charSet = GB2312_CHARSET;
- break;
- case 950:
- charSet = CHINESEBIG5_CHARSET;
- break;
- case 1252:
- charSet = ANSI_CHARSET;
- break;
- case 874:
- charSet = THAI_CHARSET;
- break;
- case 949:
- charSet = HANGUL_CHARSET;
- break;
- case 1200:
- charSet = ANSI_CHARSET;
- break;
- case 1250:
- charSet = EASTEUROPE_CHARSET;
- break;
- case 1251:
- charSet = RUSSIAN_CHARSET;
- break;
- case 1253:
- charSet = GREEK_CHARSET;
- break;
- case 1254:
- charSet = TURKISH_CHARSET;
- break;
- case 1255:
- charSet = HEBREW_CHARSET;
- break;
- case 1256:
- charSet = ARABIC_CHARSET;
- break;
- case 1257:
- charSet = BALTIC_CHARSET;
- break;
- case 1258:
- charSet = VIETNAMESE_CHARSET;
- break;
- case 1361:
- charSet = JOHAB_CHARSET;
- break;
- }
- return charSet;
-#else
- return 0;
-#endif
-}
-CPDF_Font* CPDF_InterForm::AddNativeFont(FX_BYTE charSet, const CPDF_Document* pDocument)
-{
- if (pDocument == NULL) {
- return NULL;
- }
- CPDF_Font* pFont = NULL;
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
- LOGFONTA lf;
- CFX_ByteString csFontName = GetNativeFont(charSet, &lf);
- if (!csFontName.IsEmpty()) {
- if (csFontName == "Helvetica") {
- pFont = AddStandardFont(pDocument, csFontName);
- } else {
- pFont = ((CPDF_Document*)pDocument)->AddWindowsFont(&lf, FALSE, TRUE);
- }
- }
-#endif
- return pFont;
-}
-CPDF_Font* CPDF_InterForm::AddNativeFont(const CPDF_Document* pDocument)
-{
- if (pDocument == NULL) {
- return NULL;
- }
- CPDF_Font* pFont = NULL;
- FX_BYTE charSet = GetNativeCharSet();
- pFont = AddNativeFont(charSet, pDocument);
- return pFont;
-}
-FX_BOOL CPDF_InterForm::ValidateFieldName(CFX_WideString& csNewFieldName, int iType, const CPDF_FormField* pExcludedField, const CPDF_FormControl* pExcludedControl)
-{
- if (csNewFieldName.IsEmpty()) {
- return FALSE;
- }
- int iPos = 0;
- int iLength = csNewFieldName.GetLength();
- CFX_WideString csSub;
- while (TRUE) {
- while (iPos < iLength && (csNewFieldName[iPos] == L'.' || csNewFieldName[iPos] == L' ')) {
- iPos ++;
- }
- if (iPos < iLength && !csSub.IsEmpty()) {
- csSub += L'.';
- }
- while (iPos < iLength && csNewFieldName[iPos] != L'.') {
- csSub += csNewFieldName[iPos ++];
- }
- for (int i = csSub.GetLength() - 1; i > -1; i --) {
- if (csSub[i] == L' ' || csSub[i] == L'.') {
- csSub.SetAt(i, L'\0');
- } else {
- break;
- }
- }
- FX_DWORD dwCount = m_pFieldTree->m_Root.CountFields();
- for (FX_DWORD m = 0; m < dwCount; m ++) {
- CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(m);
- if (pField == NULL) {
- continue;
- }
- if (pField == pExcludedField) {
- if (pExcludedControl != NULL) {
- if (pField->CountControls() < 2) {
- continue;
- }
- } else {
- continue;
- }
- }
- CFX_WideString csFullName = pField->GetFullName();
- int iRet = CompareFieldName(csSub, csFullName);
- if (iRet == 1) {
- if (pField->GetFieldType() != iType) {
- return FALSE;
- }
- } else if (iRet == 2 && csSub == csNewFieldName) {
- if (csFullName[iPos] == L'.') {
- return FALSE;
- }
- } else if (iRet == 3 && csSub == csNewFieldName) {
- if (csNewFieldName[csFullName.GetLength()] == L'.') {
- return FALSE;
- }
- }
- }
- if (iPos >= iLength) {
- break;
- }
- }
- if (csSub.IsEmpty()) {
- return FALSE;
- }
- csNewFieldName = csSub;
- return TRUE;
-}
-FX_BOOL CPDF_InterForm::ValidateFieldName(CFX_WideString& csNewFieldName, int iType)
-{
- return ValidateFieldName(csNewFieldName, iType, NULL, NULL);
-}
-FX_BOOL CPDF_InterForm::ValidateFieldName(const CPDF_FormField* pField, CFX_WideString& csNewFieldName)
-{
- if (pField == NULL || csNewFieldName.IsEmpty()) {
- return FALSE;
- }
- return ValidateFieldName(csNewFieldName, ((CPDF_FormField*)pField)->GetFieldType(), pField, NULL);
-}
-FX_BOOL CPDF_InterForm::ValidateFieldName(const CPDF_FormControl* pControl, CFX_WideString& csNewFieldName)
-{
- if (pControl == NULL || csNewFieldName.IsEmpty()) {
- return FALSE;
- }
- CPDF_FormField* pField = ((CPDF_FormControl*)pControl)->GetField();
- return ValidateFieldName(csNewFieldName, pField->GetFieldType(), pField, pControl);
-}
-int CPDF_InterForm::CompareFieldName(const CFX_ByteString& name1, const CFX_ByteString& name2)
-{
- FX_LPCSTR ptr1 = name1, ptr2 = name2;
- if (name1.GetLength() != name2.GetLength()) {
- int i = 0;
- while (ptr1[i] == ptr2[i]) {
- i ++;
- }
- if (i == name1.GetLength()) {
- return 2;
- }
- if (i == name2.GetLength()) {
- return 3;
- }
- return 0;
- } else {
- return name1 == name2 ? 1 : 0;
- }
-}
-int CPDF_InterForm::CompareFieldName(const CFX_WideString& name1, const CFX_WideString& name2)
-{
- FX_LPCWSTR ptr1 = name1, ptr2 = name2;
- if (name1.GetLength() != name2.GetLength()) {
- int i = 0;
- while (ptr1[i] == ptr2[i]) {
- i ++;
- }
- if (i == name1.GetLength()) {
- return 2;
- }
- if (i == name2.GetLength()) {
- return 3;
- }
- return 0;
- } else {
- return name1 == name2 ? 1 : 0;
- }
-}
-FX_DWORD CPDF_InterForm::CountFields(const CFX_WideString &csFieldName)
-{
- if (csFieldName.IsEmpty()) {
- return (FX_DWORD)m_pFieldTree->m_Root.CountFields();
- }
- CFieldTree::_Node *pNode = m_pFieldTree->FindNode(csFieldName);
- if (pNode == NULL) {
- return 0;
- }
- return pNode->CountFields();
-}
-CPDF_FormField* CPDF_InterForm::GetField(FX_DWORD index, const CFX_WideString &csFieldName)
-{
- if (csFieldName == L"") {
- return m_pFieldTree->m_Root.GetField(index);
- }
- CFieldTree::_Node *pNode = m_pFieldTree->FindNode(csFieldName);
- if (pNode == NULL) {
- return NULL;
- }
- return pNode->GetField(index);
-}
-void CPDF_InterForm::GetAllFieldNames(CFX_WideStringArray& allFieldNames)
-{
- allFieldNames.RemoveAll();
- int nCount = m_pFieldTree->m_Root.CountFields();
- for (int i = 0; i < nCount; i ++) {
- CPDF_FormField *pField = m_pFieldTree->m_Root.GetField(i);
- if (pField) {
- CFX_WideString full_name = GetFullName(pField->GetFieldDict());
- allFieldNames.Add(full_name);
- }
- }
-}
-FX_BOOL CPDF_InterForm::IsValidFormField(const void* pField)
-{
- if (pField == NULL) {
- return FALSE;
- }
- int nCount = m_pFieldTree->m_Root.CountFields();
- for (int i = 0; i < nCount; i++) {
- CPDF_FormField *pFormField = m_pFieldTree->m_Root.GetField(i);
- if (pField == pFormField) {
- return TRUE;
- }
- }
- return FALSE;
-}
-CPDF_FormField* CPDF_InterForm::GetFieldByDict(CPDF_Dictionary* pFieldDict) const
-{
- if (pFieldDict == NULL) {
- return NULL;
- }
- CFX_WideString csWName = GetFullName(pFieldDict);
- return m_pFieldTree->GetField(csWName);
-}
-FX_DWORD CPDF_InterForm::CountControls(CFX_WideString csFieldName)
-{
- if (csFieldName.IsEmpty()) {
- return (FX_DWORD)m_ControlMap.GetCount();
- }
- CPDF_FormField *pField = m_pFieldTree->GetField(csFieldName);
- if (pField == NULL) {
- return 0;
- }
- return pField->m_ControlList.GetSize();
-}
-CPDF_FormControl* CPDF_InterForm::GetControl(FX_DWORD index, CFX_WideString csFieldName)
-{
- CPDF_FormField *pField = m_pFieldTree->GetField(csFieldName);
- if (pField == NULL) {
- return NULL;
- }
- if (index < (FX_DWORD)pField->m_ControlList.GetSize()) {
- return (CPDF_FormControl *)pField->m_ControlList.GetAt(index);
- }
- return NULL;
-}
-FX_BOOL CPDF_InterForm::IsValidFormControl(const void* pControl)
-{
- if (pControl == NULL) {
- return FALSE;
- }
- FX_POSITION pos = m_ControlMap.GetStartPosition();
- while (pos) {
- CPDF_Dictionary* pWidgetDict = NULL;
- void* pFormControl = NULL;
- m_ControlMap.GetNextAssoc(pos, (FX_LPVOID&)pWidgetDict, pFormControl);
- if (pControl == pFormControl) {
- return TRUE;
- }
- }
- return FALSE;
-}
-int CPDF_InterForm::CountPageControls(CPDF_Page* pPage) const
-{
- CPDF_Array* pAnnotList = pPage->m_pFormDict->GetArray("Annots");
- if (pAnnotList == NULL) {
- return 0;
- }
- int count = 0;
- for (FX_DWORD i = 0; i < pAnnotList->GetCount(); i ++) {
- CPDF_Dictionary* pAnnot = pAnnotList->GetDict(i);
- if (pAnnot == NULL) {
- continue;
- }
- CPDF_FormControl* pControl;
- if (!m_ControlMap.Lookup(pAnnot, (FX_LPVOID&)pControl)) {
- continue;
- }
- count ++;
- }
- return count;
-}
-CPDF_FormControl* CPDF_InterForm::GetPageControl(CPDF_Page* pPage, int index) const
-{
- CPDF_Array* pAnnotList = pPage->m_pFormDict->GetArray("Annots");
- if (pAnnotList == NULL) {
- return NULL;
- }
- int count = 0;
- for (FX_DWORD i = 0; i < pAnnotList->GetCount(); i ++) {
- CPDF_Dictionary* pAnnot = pAnnotList->GetDict(i);
- if (pAnnot == NULL) {
- continue;
- }
- CPDF_FormControl* pControl;
- if (!m_ControlMap.Lookup(pAnnot, (FX_LPVOID&)pControl)) {
- continue;
- }
- if (index == count) {
- return pControl;
- }
- count ++;
- }
- return NULL;
-}
-CPDF_FormControl* CPDF_InterForm::GetControlAtPoint(CPDF_Page* pPage, FX_FLOAT pdf_x, FX_FLOAT pdf_y) const
-{
- CPDF_Array* pAnnotList = pPage->m_pFormDict->GetArray("Annots");
- if (pAnnotList == NULL) {
- return NULL;
- }
- for (FX_DWORD i = pAnnotList->GetCount(); i > 0; i --) {
- CPDF_Dictionary* pAnnot = pAnnotList->GetDict(i - 1);
- if (pAnnot == NULL) {
- continue;
- }
- CPDF_FormControl* pControl;
- if (!m_ControlMap.Lookup(pAnnot, (FX_LPVOID&)pControl)) {
- continue;
- }
- CFX_FloatRect rect = pControl->GetRect();
- if (rect.Contains(pdf_x, pdf_y)) {
- return pControl;
- }
- }
- return NULL;
-}
-CPDF_FormControl* CPDF_InterForm::GetControlByDict(CPDF_Dictionary* pWidgetDict) const
-{
- CPDF_FormControl* pControl = NULL;
- m_ControlMap.Lookup(pWidgetDict, (FX_LPVOID&)pControl);
- return pControl;
-}
-FX_DWORD CPDF_InterForm::CountInternalFields(const CFX_WideString& csFieldName) const
-{
- if (m_pFormDict == NULL) {
- return 0;
- }
- CPDF_Array* pArray = m_pFormDict->GetArray("Fields");
- if (pArray == NULL) {
- return 0;
- }
- if (csFieldName.IsEmpty()) {
- return pArray->GetCount();
- } else {
- int iLength = csFieldName.GetLength();
- int iPos = 0;
- CPDF_Dictionary* pDict = NULL;
- while (pArray != NULL) {
- CFX_WideString csSub;
- if (iPos < iLength && csFieldName[iPos] == L'.') {
- iPos ++;
- }
- while (iPos < iLength && csFieldName[iPos] != L'.') {
- csSub += csFieldName[iPos ++];
- }
- int iCount = pArray->GetCount();
- FX_BOOL bFind = FALSE;
- for (int i = 0; i < iCount; i ++) {
- pDict = pArray->GetDict(i);
- if (pDict == NULL) {
- continue;
- }
- CFX_WideString csT = pDict->GetUnicodeText("T");
- if (csT == csSub) {
- bFind = TRUE;
- break;
- }
- }
- if (!bFind) {
- return 0;
- }
- if (iPos >= iLength) {
- break;
- }
- pArray = pDict->GetArray("Kids");
- }
- if (pDict == NULL) {
- return 0;
- } else {
- pArray = pDict->GetArray("Kids");
- if (pArray == NULL) {
- return 1;
- } else {
- return pArray->GetCount();
- }
- }
- }
-}
-CPDF_Dictionary* CPDF_InterForm::GetInternalField(FX_DWORD index, const CFX_WideString& csFieldName) const
-{
- if (m_pFormDict == NULL) {
- return NULL;
- }
- CPDF_Array* pArray = m_pFormDict->GetArray("Fields");
- if (pArray == NULL) {
- return 0;
- }
- if (csFieldName.IsEmpty()) {
- return pArray->GetDict(index);
- } else {
- int iLength = csFieldName.GetLength();
- int iPos = 0;
- CPDF_Dictionary* pDict = NULL;
- while (pArray != NULL) {
- CFX_WideString csSub;
- if (iPos < iLength && csFieldName[iPos] == L'.') {
- iPos ++;
- }
- while (iPos < iLength && csFieldName[iPos] != L'.') {
- csSub += csFieldName[iPos ++];
- }
- int iCount = pArray->GetCount();
- FX_BOOL bFind = FALSE;
- for (int i = 0; i < iCount; i ++) {
- pDict = pArray->GetDict(i);
- if (pDict == NULL) {
- continue;
- }
- CFX_WideString csT = pDict->GetUnicodeText("T");
- if (csT == csSub) {
- bFind = TRUE;
- break;
- }
- }
- if (!bFind) {
- return NULL;
- }
- if (iPos >= iLength) {
- break;
- }
- pArray = pDict->GetArray("Kids");
- }
- if (pDict == NULL) {
- return NULL;
- } else {
- pArray = pDict->GetArray("Kids");
- if (pArray == NULL) {
- return pDict;
- } else {
- return pArray->GetDict(index);
- }
- }
- }
-}
-FX_BOOL CPDF_InterForm::NeedConstructAP()
-{
- if (m_pFormDict == NULL) {
- return FALSE;
- }
- return m_pFormDict->GetBoolean("NeedAppearances");
-}
-void CPDF_InterForm::NeedConstructAP(FX_BOOL bNeedAP)
-{
- if (m_pFormDict == NULL) {
- InitInterFormDict(m_pFormDict, m_pDocument);
- }
- m_pFormDict->SetAtBoolean("NeedAppearances", bNeedAP);
- m_bGenerateAP = bNeedAP;
-}
-int CPDF_InterForm::CountFieldsInCalculationOrder()
-{
- if (m_pFormDict == NULL) {
- return 0;
- }
- CPDF_Array* pArray = m_pFormDict->GetArray("CO");
- if (pArray == NULL) {
- return 0;
- }
- return pArray->GetCount();
-}
-CPDF_FormField* CPDF_InterForm::GetFieldInCalculationOrder(int index)
-{
- if (m_pFormDict == NULL || index < 0) {
- return NULL;
- }
- CPDF_Array* pArray = m_pFormDict->GetArray("CO");
- if (pArray == NULL) {
- return NULL;
- }
- CPDF_Object* pElement = pArray->GetElementValue(index);
- if (pElement != NULL && pElement->GetType() == PDFOBJ_DICTIONARY) {
- return GetFieldByDict((CPDF_Dictionary*)pElement);
- }
- return NULL;
-}
-int CPDF_InterForm::FindFieldInCalculationOrder(const CPDF_FormField* pField)
-{
- if (m_pFormDict == NULL || pField == NULL) {
- return -1;
- }
- CPDF_Array* pArray = m_pFormDict->GetArray("CO");
- if (pArray == NULL) {
- return -1;
- }
- for (FX_DWORD i = 0; i < pArray->GetCount(); i ++) {
- CPDF_Object* pElement = pArray->GetElementValue(i);
- if (pElement == pField->m_pDict) {
- return i;
- }
- }
- return -1;
-}
-FX_DWORD CPDF_InterForm::CountFormFonts()
-{
- return CountInterFormFonts(m_pFormDict);
-}
-CPDF_Font* CPDF_InterForm::GetFormFont(FX_DWORD index, CFX_ByteString& csNameTag)
-{
- return GetInterFormFont(m_pFormDict, m_pDocument, index, csNameTag);
-}
-CPDF_Font* CPDF_InterForm::GetFormFont(CFX_ByteString csNameTag)
-{
- return GetInterFormFont(m_pFormDict, m_pDocument, csNameTag);
-}
-CPDF_Font* CPDF_InterForm::GetFormFont(CFX_ByteString csFontName, CFX_ByteString& csNameTag)
-{
- return GetInterFormFont(m_pFormDict, m_pDocument, csFontName, csNameTag);
-}
-CPDF_Font* CPDF_InterForm::GetNativeFormFont(FX_BYTE charSet, CFX_ByteString& csNameTag)
-{
- return GetNativeInterFormFont(m_pFormDict, m_pDocument, charSet, csNameTag);
-}
-CPDF_Font* CPDF_InterForm::GetNativeFormFont(CFX_ByteString& csNameTag)
-{
- return GetNativeInterFormFont(m_pFormDict, m_pDocument, csNameTag);
-}
-FX_BOOL CPDF_InterForm::FindFormFont(const CPDF_Font* pFont, CFX_ByteString& csNameTag)
-{
- return FindInterFormFont(m_pFormDict, pFont, csNameTag);
-}
-FX_BOOL CPDF_InterForm::FindFormFont(CFX_ByteString csFontName, CPDF_Font*& pFont, CFX_ByteString& csNameTag)
-{
- return FindInterFormFont(m_pFormDict, m_pDocument, csFontName, pFont, csNameTag);
-}
-void CPDF_InterForm::AddFormFont(const CPDF_Font* pFont, CFX_ByteString& csNameTag)
-{
- AddInterFormFont(m_pFormDict, m_pDocument, pFont, csNameTag);
- m_bUpdated = TRUE;
-}
-CPDF_Font* CPDF_InterForm::AddNativeFormFont(FX_BYTE charSet, CFX_ByteString& csNameTag)
-{
- m_bUpdated = TRUE;
- return AddNativeInterFormFont(m_pFormDict, m_pDocument, charSet, csNameTag);
-}
-CPDF_Font* CPDF_InterForm::AddNativeFormFont(CFX_ByteString& csNameTag)
-{
- m_bUpdated = TRUE;
- return AddNativeInterFormFont(m_pFormDict, m_pDocument, csNameTag);
-}
-void CPDF_InterForm::RemoveFormFont(const CPDF_Font* pFont)
-{
- m_bUpdated = TRUE;
- RemoveInterFormFont(m_pFormDict, pFont);
-}
-void CPDF_InterForm::RemoveFormFont(CFX_ByteString csNameTag)
-{
- m_bUpdated = TRUE;
- RemoveInterFormFont(m_pFormDict, csNameTag);
-}
-CPDF_DefaultAppearance CPDF_InterForm::GetDefaultAppearance()
-{
- CFX_ByteString csDA;
- if (m_pFormDict == NULL) {
- return csDA;
- }
- csDA = m_pFormDict->GetString("DA");
- return csDA;
-}
-CPDF_Font* CPDF_InterForm::GetDefaultFormFont()
-{
- return GetDefaultInterFormFont(m_pFormDict, m_pDocument);
-}
-int CPDF_InterForm::GetFormAlignment()
-{
- if (m_pFormDict == NULL) {
- return 0;
- }
- return m_pFormDict->GetInteger("Q", 0);
-}
-FX_BOOL CPDF_InterForm::ResetForm(const CFX_PtrArray& fields, FX_BOOL bIncludeOrExclude, FX_BOOL bNotify)
-{
- if (bNotify && m_pFormNotify != NULL) {
- int iRet = m_pFormNotify->BeforeFormReset(this);
- if (iRet < 0) {
- return FALSE;
- }
- }
- int nCount = m_pFieldTree->m_Root.CountFields();
- for (int i = 0; i < nCount; i++) {
- CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(i);
- if (pField == NULL) {
- continue;
- }
- FX_BOOL bFind = FALSE;
- int iCount = fields.GetSize();
- for (int i = 0; i < iCount; i ++) {
- if (pField == (CPDF_FormField*)fields[i]) {
- bFind = TRUE;
- break;
- }
- }
- if ((bIncludeOrExclude && bFind) || (!bIncludeOrExclude && !bFind)) {
- pField->ResetField(bNotify);
- }
- }
- if (bNotify && m_pFormNotify != NULL) {
- m_pFormNotify->AfterFormReset(this);
- }
- return TRUE;
-}
-FX_BOOL CPDF_InterForm::ResetForm(FX_BOOL bNotify)
-{
- if (bNotify && m_pFormNotify != NULL) {
- int iRet = m_pFormNotify->BeforeFormReset(this);
- if (iRet < 0) {
- return FALSE;
- }
- }
- int nCount = m_pFieldTree->m_Root.CountFields();
- for (int i = 0; i < nCount; i++) {
- CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(i);
- if (pField == NULL) {
- continue;
- }
- pField->ResetField(bNotify);
- }
- if (bNotify && m_pFormNotify != NULL) {
- m_pFormNotify->AfterFormReset(this);
- }
- return TRUE;
-}
-void CPDF_InterForm::ReloadForm()
-{
- FX_POSITION pos = m_ControlMap.GetStartPosition();
- while (pos) {
- CPDF_Dictionary* pWidgetDict;
- CPDF_FormControl* pControl;
- m_ControlMap.GetNextAssoc(pos, (FX_LPVOID&)pWidgetDict, (FX_LPVOID&)pControl);
- delete pControl;
- }
- m_ControlMap.RemoveAll();
- int nCount = m_pFieldTree->m_Root.CountFields();
- for (int k = 0; k < nCount; k ++) {
- CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(k);
- delete pField;
- }
- m_pFieldTree->RemoveAll();
- if (m_pFormDict == NULL) {
- return;
- }
- CPDF_Array* pFields = m_pFormDict->GetArray("Fields");
- if (pFields == NULL) {
- return;
- }
- int iCount = pFields->GetCount();
- for (int i = 0; i < iCount; i ++) {
- LoadField(pFields->GetDict(i));
- }
-}
-void CPDF_InterForm::LoadField(CPDF_Dictionary* pFieldDict, int nLevel)
-{
- if (nLevel > nMaxRecursion) {
- return;
- }
- if (pFieldDict == NULL) {
- return;
- }
- FX_DWORD dwParentObjNum = pFieldDict->GetObjNum();
- CPDF_Array* pKids = pFieldDict->GetArray("Kids");
- if (!pKids) {
- AddTerminalField(pFieldDict);
- return;
- }
- CPDF_Dictionary* pFirstKid = pKids->GetDict(0);
- if (pFirstKid == NULL) {
- return;
- }
- if (pFirstKid->KeyExist("T") || pFirstKid->KeyExist("Kids")) {
- for (FX_DWORD i = 0; i < pKids->GetCount(); i ++) {
- CPDF_Dictionary * pChildDict = pKids->GetDict(i);
- if (pChildDict) {
- if (pChildDict->GetObjNum() != dwParentObjNum) {
- LoadField(pChildDict, nLevel + 1);
- }
- }
- }
- } else {
- AddTerminalField(pFieldDict);
- }
-}
-FX_BOOL CPDF_InterForm::HasXFAForm() const
-{
- return m_pFormDict && m_pFormDict->GetArray(FX_BSTRC("XFA")) != NULL;
-}
-void CPDF_InterForm::FixPageFields(const CPDF_Page* pPage)
-{
- ASSERT(pPage != NULL);
- CPDF_Dictionary* pPageDict = pPage->m_pFormDict;
- if (pPageDict == NULL) {
- return;
- }
- CPDF_Array* pAnnots = pPageDict->GetArray(FX_BSTRC("Annots"));
- if (pAnnots == NULL) {
- return;
- }
- int iAnnotCount = pAnnots->GetCount();
- for (int i = 0; i < iAnnotCount; i++) {
- CPDF_Dictionary* pAnnot = pAnnots->GetDict(i);
- if (pAnnot != NULL && pAnnot->GetString(FX_BSTRC("Subtype")) == "Widget") {
- LoadField(pAnnot);
- }
- }
-}
-CPDF_FormField* CPDF_InterForm::AddTerminalField(const CPDF_Dictionary* pFieldDict)
-{
- if (!pFieldDict->KeyExist(FX_BSTRC("T"))) {
- return NULL;
- }
- CPDF_Dictionary* pDict = (CPDF_Dictionary*)pFieldDict;
- CFX_WideString csWName = GetFullName(pDict);
- if (csWName.IsEmpty()) {
- return NULL;
- }
- CPDF_FormField* pField = NULL;
- pField = m_pFieldTree->GetField(csWName);
- if (pField == NULL) {
- CPDF_Dictionary *pParent = (CPDF_Dictionary*)pFieldDict;
- if (!pFieldDict->KeyExist(FX_BSTR("T")) &&
- pFieldDict->GetString(FX_BSTRC("Subtype")) == FX_BSTRC("Widget")) {
- pParent = pFieldDict->GetDict(FX_BSTRC("Parent"));
- if (!pParent) {
- pParent = (CPDF_Dictionary*)pFieldDict;
- }
- }
- if (pParent && pParent != pFieldDict && !pParent->KeyExist(FX_BSTRC("FT"))) {
- if (pFieldDict->KeyExist(FX_BSTRC("FT"))) {
- CPDF_Object *pFTValue = pFieldDict->GetElementValue(FX_BSTRC("FT"));
- if (pFTValue) {
- pParent->SetAt(FX_BSTRC("FT"), pFTValue->Clone());
- }
- }
- if (pFieldDict->KeyExist(FX_BSTRC("Ff"))) {
- CPDF_Object *pFfValue = pFieldDict->GetElementValue(FX_BSTRC("Ff"));
- if (pFfValue) {
- pParent->SetAt(FX_BSTRC("Ff"), pFfValue->Clone());
- }
- }
- }
- pField = FX_NEW CPDF_FormField(this, pParent);
- CPDF_Object* pTObj = pDict->GetElement("T");
- if (pTObj && pTObj->GetType() == PDFOBJ_REFERENCE) {
- CPDF_Object* pClone = pTObj->Clone(TRUE);
- if (pClone) {
- pDict->SetAt("T", pClone);
- } else {
- pDict->SetAtName("T", "");
- }
- }
- m_pFieldTree->SetField(csWName, pField);
- }
- CPDF_Array* pKids = pFieldDict->GetArray("Kids");
- if (pKids == NULL) {
- if (pFieldDict->GetString("Subtype") == "Widget") {
- AddControl(pField, pFieldDict);
- }
- } else {
- for (FX_DWORD i = 0; i < pKids->GetCount(); i ++) {
- CPDF_Dictionary* pKid = pKids->GetDict(i);
- if (pKid == NULL) {
- continue;
- }
- if (pKid->GetString("Subtype") != "Widget") {
- continue;
- }
- AddControl(pField, pKid);
- }
- }
- return pField;
-}
-CPDF_FormControl* CPDF_InterForm::AddControl(const CPDF_FormField* pField, const CPDF_Dictionary* pWidgetDict)
-{
- void *rValue = NULL;
- if (m_ControlMap.Lookup((CPDF_Dictionary*)pWidgetDict, rValue)) {
- return (CPDF_FormControl*)rValue;
- }
- CPDF_FormControl* pControl = FX_NEW CPDF_FormControl((CPDF_FormField*)pField, (CPDF_Dictionary*)pWidgetDict);
- if (pControl == NULL) {
- return NULL;
- }
- m_ControlMap.SetAt((CPDF_Dictionary*)pWidgetDict, pControl);
- ((CPDF_FormField*)pField)->m_ControlList.Add(pControl);
- return pControl;
-}
-CPDF_FormField* CPDF_InterForm::CheckRequiredFields(const CFX_PtrArray *fields, FX_BOOL bIncludeOrExclude) const
-{
- int nCount = m_pFieldTree->m_Root.CountFields();
- for (int i = 0; i < nCount; i++) {
- CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(i);
- if (pField == NULL) {
- continue;
- }
- FX_INT32 iType = pField->GetType();
- if (iType == CPDF_FormField::PushButton || iType == CPDF_FormField::CheckBox || iType == CPDF_FormField::ListBox) {
- continue;
- }
- FX_DWORD dwFlags = pField->GetFieldFlags();
- if (dwFlags & 0x04) {
- continue;
- }
- FX_BOOL bFind = TRUE;
- if (fields != NULL) {
- bFind = fields->Find(pField, 0) >= 0;
- }
- if ((bIncludeOrExclude && bFind) || (!bIncludeOrExclude && !bFind)) {
- CPDF_Dictionary *pFieldDict = pField->m_pDict;
- if ((dwFlags & 0x02) != 0 && pFieldDict->GetString("V").IsEmpty()) {
- return pField;
- }
- }
- }
- return NULL;
-}
-CFDF_Document* CPDF_InterForm::ExportToFDF(FX_WSTR pdf_path, FX_BOOL bSimpleFileSpec) const
-{
- CFX_PtrArray fields;
- int nCount = m_pFieldTree->m_Root.CountFields();
- for (int i = 0; i < nCount; i ++) {
- CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(i);
- fields.Add(pField);
- }
- return ExportToFDF(pdf_path, fields, TRUE, bSimpleFileSpec);
-}
-CFX_WideString FILESPEC_EncodeFileName(FX_WSTR filepath);
-CFDF_Document* CPDF_InterForm::ExportToFDF(FX_WSTR pdf_path, CFX_PtrArray& fields, FX_BOOL bIncludeOrExclude, FX_BOOL bSimpleFileSpec) const
-{
- CFDF_Document* pDoc = CFDF_Document::CreateNewDoc();
- if (pDoc == NULL) {
- return NULL;
- }
- CPDF_Dictionary* pMainDict = pDoc->GetRoot()->GetDict("FDF");
- if (!pdf_path.IsEmpty()) {
- if (bSimpleFileSpec) {
- CFX_WideString wsFilePath = FILESPEC_EncodeFileName(pdf_path);
- pMainDict->SetAtString(FX_BSTRC("F"), CFX_ByteString::FromUnicode(wsFilePath));
- pMainDict->SetAtString(FX_BSTRC("UF"), PDF_EncodeText(wsFilePath));
- } else {
- CPDF_FileSpec filespec;
- filespec.SetFileName(pdf_path);
- pMainDict->SetAt("F", (CPDF_Object*)filespec);
- }
- }
- CPDF_Array* pFields = CPDF_Array::Create();
- if (pFields == NULL) {
- return NULL;
- }
- pMainDict->SetAt("Fields", pFields);
- int nCount = m_pFieldTree->m_Root.CountFields();
- for (int i = 0; i < nCount; i ++) {
- CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(i);
- if (pField == NULL || pField->GetType() == CPDF_FormField::PushButton) {
- continue;
- }
- FX_DWORD dwFlags = pField->GetFieldFlags();
- if (dwFlags & 0x04) {
- continue;
- }
- FX_BOOL bFind = fields.Find(pField, 0) >= 0;
- if ((bIncludeOrExclude && bFind) || (!bIncludeOrExclude && !bFind)) {
- if ((dwFlags & 0x02) != 0 && pField->m_pDict->GetString("V").IsEmpty()) {
- continue;
- }
- CFX_WideString fullname = GetFullName(pField->GetFieldDict());
- CPDF_Dictionary* pFieldDict = CPDF_Dictionary::Create();
- if (pFieldDict == NULL) {
- return NULL;
- }
- CPDF_String* pString = CPDF_String::Create(fullname);
- if (pString == NULL) {
- pFieldDict->Release();
- return NULL;
- }
- pFieldDict->SetAt("T", pString);
- if (pField->GetType() == CPDF_FormField::CheckBox || pField->GetType() == CPDF_FormField::RadioButton) {
- CFX_WideString csExport = pField->GetCheckValue(FALSE);
- CFX_ByteString csBExport = PDF_EncodeText(csExport);
- CPDF_Object* pOpt = FPDF_GetFieldAttr(pField->m_pDict, "Opt");
- if (pOpt == NULL) {
- pFieldDict->SetAtName("V", csBExport);
- } else {
- pFieldDict->SetAtString("V", csBExport);
- }
- } else {
- CPDF_Object* pV = FPDF_GetFieldAttr(pField->m_pDict, "V");
- if (pV != NULL) {
- pFieldDict->SetAt("V", pV->Clone(TRUE));
- }
- }
- pFields->Add(pFieldDict);
- }
- }
- return pDoc;
-}
-const struct _SupportFieldEncoding {
- FX_LPCSTR m_name;
- FX_INT32 m_codePage;
-} g_fieldEncoding[] = {
- "BigFive", 950,
- "GBK", 936,
- "Shift-JIS", 932,
- "UHC", 949,
-};
-static void FPDFDOC_FDF_GetFieldValue(CPDF_Dictionary *pFieldDict, CFX_WideString &csValue, CFX_ByteString &bsEncoding)
-{
- ASSERT(pFieldDict != NULL);
- CFX_ByteString csBValue = pFieldDict->GetString("V");
- FX_INT32 iCount = sizeof(g_fieldEncoding) / sizeof(g_fieldEncoding[0]);
- FX_INT32 i = 0;
- for (; i < iCount; ++i)
- if (bsEncoding == g_fieldEncoding[i].m_name) {
- break;
- }
- if (i < iCount) {
- CFX_CharMap *pCharMap = CFX_CharMap::GetDefaultMapper(g_fieldEncoding[i].m_codePage);
- FXSYS_assert(pCharMap != NULL);
- csValue.ConvertFrom(csBValue, pCharMap);
- return;
- }
- CFX_ByteString csTemp = csBValue.Left(2);
- if (csTemp == "\xFF\xFE" || csTemp == "\xFE\xFF") {
- csValue = PDF_DecodeText(csBValue);
- } else {
- csValue = CFX_WideString::FromLocal(csBValue);
- }
-}
-void CPDF_InterForm::FDF_ImportField(CPDF_Dictionary* pFieldDict, const CFX_WideString& parent_name, FX_BOOL bNotify, int nLevel)
-{
- CFX_WideString name;
- if (!parent_name.IsEmpty()) {
- name = parent_name + L".";
- }
- name += pFieldDict->GetUnicodeText("T");
- CPDF_Array* pKids = pFieldDict->GetArray("Kids");
- if (pKids) {
- for (FX_DWORD i = 0; i < pKids->GetCount(); i ++) {
- CPDF_Dictionary* pKid = pKids->GetDict(i);
- if (pKid == NULL) {
- continue;
- }
- if (nLevel <= nMaxRecursion) {
- FDF_ImportField(pKid, name, bNotify, nLevel + 1);
- }
- }
- return;
- }
- if (!pFieldDict->KeyExist("V")) {
- return;
- }
- CPDF_FormField* pField = m_pFieldTree->GetField(name);
- if (pField == NULL) {
- return;
- }
- CFX_WideString csWValue;
- FPDFDOC_FDF_GetFieldValue(pFieldDict, csWValue, m_bsEncoding);
- int iType = pField->GetFieldType();
- if (bNotify && m_pFormNotify != NULL) {
- int iRet = 0;
- if (iType == FIELDTYPE_LISTBOX) {
- iRet = m_pFormNotify->BeforeSelectionChange(pField, csWValue);
- } else if (iType == FIELDTYPE_COMBOBOX || iType == FIELDTYPE_TEXTFIELD) {
- iRet = m_pFormNotify->BeforeValueChange(pField, csWValue);
- }
- if (iRet < 0) {
- return;
- }
- }
- CFX_ByteArray statusArray;
- if (iType == FIELDTYPE_CHECKBOX || iType == FIELDTYPE_RADIOBUTTON) {
- SaveCheckedFieldStatus(pField, statusArray);
- }
- pField->SetValue(csWValue);
- CPDF_FormField::Type eType = pField->GetType();
- if ((eType == CPDF_FormField::ListBox || eType == CPDF_FormField::ComboBox) && pFieldDict->KeyExist("Opt")) {
- pField->m_pDict->SetAt("Opt", pFieldDict->GetElementValue("Opt")->Clone(TRUE));
- }
- if (bNotify && m_pFormNotify != NULL) {
- if (iType == FIELDTYPE_CHECKBOX || iType == FIELDTYPE_RADIOBUTTON) {
- m_pFormNotify->AfterCheckedStatusChange(pField, statusArray);
- } else if (iType == FIELDTYPE_LISTBOX) {
- m_pFormNotify->AfterSelectionChange(pField);
- } else if (iType == FIELDTYPE_COMBOBOX || iType == FIELDTYPE_TEXTFIELD) {
- m_pFormNotify->AfterValueChange(pField);
- }
- }
- if (CPDF_InterForm::m_bUpdateAP) {
- pField->UpdateAP(NULL);
- }
-}
-FX_BOOL CPDF_InterForm::ImportFromFDF(const CFDF_Document* pFDF, FX_BOOL bNotify)
-{
- if (pFDF == NULL) {
- return FALSE;
- }
- CPDF_Dictionary* pMainDict = pFDF->GetRoot()->GetDict("FDF");
- if (pMainDict == NULL) {
- return FALSE;
- }
- CPDF_Array* pFields = pMainDict->GetArray("Fields");
- if (pFields == NULL) {
- return FALSE;
- }
- m_bsEncoding = pMainDict->GetString(FX_BSTRC("Encoding"));
- if (bNotify && m_pFormNotify != NULL) {
- int iRet = m_pFormNotify->BeforeFormImportData(this);
- if (iRet < 0) {
- return FALSE;
- }
- }
- for (FX_DWORD i = 0; i < pFields->GetCount(); i ++) {
- CPDF_Dictionary* pField = pFields->GetDict(i);
- if (pField == NULL) {
- continue;
- }
- FDF_ImportField(pField, L"", bNotify);
- }
- if (bNotify && m_pFormNotify != NULL) {
- m_pFormNotify->AfterFormImportData(this);
- }
- return TRUE;
-}
-void CPDF_InterForm::SetFormNotify(const CPDF_FormNotify* pNotify)
-{
- m_pFormNotify = (CPDF_FormNotify*)pNotify;
-}
-int CPDF_InterForm::GetPageWithWidget(int iCurPage, FX_BOOL bNext)
-{
- if (iCurPage < 0) {
- return -1;
- }
- int iPageCount = m_pDocument->GetPageCount();
- if (iCurPage >= iPageCount) {
- return -1;
- }
- int iNewPage = iCurPage;
- do {
- iNewPage += bNext ? 1 : -1;
- if (iNewPage >= iPageCount) {
- iNewPage = 0;
- }
- if (iNewPage < 0) {
- iNewPage = iPageCount - 1;
- }
- if (iNewPage == iCurPage) {
- break;
- }
- CPDF_Dictionary* pPageDict = m_pDocument->GetPage(iNewPage);
- if (pPageDict == NULL) {
- continue;
- }
- CPDF_Array* pAnnots = pPageDict->GetArray("Annots");
- if (pAnnots == NULL) {
- continue;
- }
- FX_DWORD dwCount = pAnnots->GetCount();
- for (FX_DWORD i = 0; i < dwCount; i ++) {
- CPDF_Object* pAnnotDict = pAnnots->GetElementValue(i);
- if (pAnnotDict == NULL) {
- continue;
- }
- CPDF_FormControl* pControl = NULL;
- if (m_ControlMap.Lookup(pAnnotDict, (void*&)pControl)) {
- return iNewPage;
- }
- }
- } while (TRUE);
- return -1;
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fpdfdoc/fpdf_doc.h"
+#include "../../include/fxcrt/fx_xml.h"
+CFX_WideString GetFullName(CPDF_Dictionary* pFieldDict);
+void InitInterFormDict(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument);
+FX_DWORD CountInterFormFonts(CPDF_Dictionary* pFormDict);
+CPDF_Font* GetInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, FX_DWORD index, CFX_ByteString& csNameTag);
+CPDF_Font* GetInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString csNameTag);
+CPDF_Font* GetInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString csFontName, CFX_ByteString& csNameTag);
+CPDF_Font* GetNativeInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, FX_BYTE charSet, CFX_ByteString& csNameTag);
+CPDF_Font* GetNativeInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString& csNameTag);
+FX_BOOL FindInterFormFont(CPDF_Dictionary* pFormDict, const CPDF_Font* pFont, CFX_ByteString& csNameTag);
+FX_BOOL FindInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString csFontName, CPDF_Font*& pFont, CFX_ByteString& csNameTag);
+void AddInterFormFont(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument, const CPDF_Font* pFont, CFX_ByteString& csNameTag);
+CPDF_Font* AddNativeInterFormFont(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument, FX_BYTE charSet, CFX_ByteString& csNameTag);
+CPDF_Font* AddNativeInterFormFont(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument, CFX_ByteString& csNameTag);
+void RemoveInterFormFont(CPDF_Dictionary* pFormDict, const CPDF_Font* pFont);
+void RemoveInterFormFont(CPDF_Dictionary* pFormDict, CFX_ByteString csNameTag);
+CPDF_Font* GetDefaultInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument);
+void SetDefaultInterFormFont(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument, const CPDF_Font* pFont);
+void SaveCheckedFieldStatus(CPDF_FormField* pField, CFX_ByteArray& statusArray);
+FX_BOOL NeedPDFEncodeForFieldFullName(const CFX_WideString& csFieldName);
+FX_BOOL NeedPDFEncodeForFieldTree(CPDF_Dictionary* pFieldDict, int nLevel = 0);
+void EncodeFieldName(const CFX_WideString& csName, CFX_ByteString& csT);
+void UpdateEncodeFieldName(CPDF_Dictionary* pFieldDict, int nLevel = 0);
+const int nMaxRecursion = 32;
+class _CFieldNameExtractor : public CFX_Object
+{
+public:
+ _CFieldNameExtractor(const CFX_WideString& full_name)
+ {
+ m_pStart = full_name;
+ m_pEnd = m_pStart + full_name.GetLength();
+ m_pCur = m_pStart;
+ }
+ void GetNext(FX_LPCWSTR &pSubName, FX_STRSIZE& size)
+ {
+ pSubName = m_pCur;
+ while (m_pCur < m_pEnd && m_pCur[0] != L'.') {
+ m_pCur++;
+ }
+ size = (FX_STRSIZE)(m_pCur - pSubName);
+ if (m_pCur < m_pEnd && m_pCur[0] == L'.') {
+ m_pCur++;
+ }
+ }
+protected:
+ FX_LPCWSTR m_pStart;
+ FX_LPCWSTR m_pEnd;
+ FX_LPCWSTR m_pCur;
+};
+class CFieldTree : public CFX_Object
+{
+public:
+ struct _Node : public CFX_Object {
+ _Node *parent;
+ CFX_PtrArray children;
+ CFX_WideString short_name;
+ CPDF_FormField *field_ptr;
+ int CountFields(int nLevel = 0)
+ {
+ if (nLevel > nMaxRecursion) {
+ return 0;
+ }
+ if (field_ptr) {
+ return 1;
+ }
+ int count = 0;
+ for (int i = 0; i < children.GetSize(); i ++) {
+ count += ((_Node *)children.GetAt(i))->CountFields(nLevel + 1);
+ }
+ return count;
+ }
+ CPDF_FormField* GetField(int* fields_to_go)
+ {
+ if (field_ptr) {
+ if (*fields_to_go == 0) {
+ return field_ptr;
+ }
+ --*fields_to_go;
+ return NULL;
+ }
+ for (int i = 0; i < children.GetSize(); i++) {
+ _Node *pNode = (_Node *)children.GetAt(i);
+ CPDF_FormField* pField = pNode->GetField(fields_to_go);
+ if (pField) {
+ return pField;
+ }
+ }
+ return NULL;
+ }
+ CPDF_FormField* GetField(int index)
+ {
+ int fields_to_go = index;
+ return GetField(&fields_to_go);
+ }
+ };
+ CFieldTree();
+ ~CFieldTree();
+ void SetField(const CFX_WideString &full_name, CPDF_FormField *field_ptr);
+ CPDF_FormField *GetField(const CFX_WideString &full_name);
+ CPDF_FormField *RemoveField(const CFX_WideString &full_name);
+ void RemoveAll();
+ _Node *FindNode(const CFX_WideString &full_name);
+ _Node * AddChild(_Node *pParent, const CFX_WideString &short_name, CPDF_FormField *field_ptr);
+ void RemoveNode(_Node *pNode, int nLevel = 0);
+ _Node *_Lookup(_Node *pParent, const CFX_WideString &short_name);
+ _Node m_Root;
+};
+CFieldTree::CFieldTree()
+{
+ m_Root.parent = NULL;
+ m_Root.field_ptr = NULL;
+}
+CFieldTree::~CFieldTree()
+{
+ RemoveAll();
+}
+CFieldTree::_Node *CFieldTree::AddChild(_Node *pParent, const CFX_WideString &short_name, CPDF_FormField *field_ptr)
+{
+ if (pParent == NULL) {
+ return NULL;
+ }
+ _Node *pNode = FX_NEW _Node;
+ if (pNode == NULL) {
+ return NULL;
+ }
+ pNode->parent = pParent;
+ pNode->short_name = short_name;
+ pNode->field_ptr = field_ptr;
+ pParent->children.Add(pNode);
+ return pNode;
+}
+void CFieldTree::RemoveNode(_Node *pNode, int nLevel)
+{
+ if (pNode == NULL) {
+ return ;
+ }
+ if (nLevel > nMaxRecursion) {
+ delete pNode;
+ return ;
+ }
+ CFX_PtrArray& ptr_array = pNode->children;
+ for (int i = 0; i < ptr_array.GetSize(); i ++) {
+ _Node *pChild = (_Node *)ptr_array[i];
+ RemoveNode(pChild, nLevel + 1);
+ }
+ delete pNode;
+}
+CFieldTree::_Node *CFieldTree::_Lookup(_Node *pParent, const CFX_WideString &short_name)
+{
+ if (pParent == NULL) {
+ return NULL;
+ }
+ CFX_PtrArray& ptr_array = pParent->children;
+ for (int i = 0; i < ptr_array.GetSize(); i ++) {
+ _Node *pNode = (_Node *)ptr_array[i];
+ if (pNode->short_name.GetLength() == short_name.GetLength() &&
+ FXSYS_memcmp32((FX_LPCWSTR)pNode->short_name, (FX_LPCWSTR)short_name, short_name.GetLength()*sizeof(FX_WCHAR)) == 0) {
+ return pNode;
+ }
+ }
+ return NULL;
+}
+void CFieldTree::RemoveAll()
+{
+ CFX_PtrArray& ptr_array = m_Root.children;
+ for (int i = 0; i < ptr_array.GetSize(); i ++) {
+ _Node *pNode = (_Node *)ptr_array[i];
+ RemoveNode(pNode);
+ }
+}
+void CFieldTree::SetField(const CFX_WideString &full_name, CPDF_FormField *field_ptr)
+{
+ if (full_name == L"") {
+ return;
+ }
+ _CFieldNameExtractor name_extractor(full_name);
+ FX_LPCWSTR pName;
+ FX_STRSIZE nLength;
+ name_extractor.GetNext(pName, nLength);
+ _Node *pNode = &m_Root, *pLast = NULL;
+ while (nLength > 0) {
+ pLast = pNode;
+ CFX_WideString name = CFX_WideString(pName, nLength);
+ pNode = _Lookup(pLast, name);
+ if (pNode == NULL) {
+ pNode = AddChild(pLast, name, NULL);
+ }
+ name_extractor.GetNext(pName, nLength);
+ }
+ if (pNode != &m_Root) {
+ pNode->field_ptr = field_ptr;
+ }
+}
+CPDF_FormField *CFieldTree::GetField(const CFX_WideString &full_name)
+{
+ if (full_name == L"") {
+ return NULL;
+ }
+ _CFieldNameExtractor name_extractor(full_name);
+ FX_LPCWSTR pName;
+ FX_STRSIZE nLength;
+ name_extractor.GetNext(pName, nLength);
+ _Node *pNode = &m_Root, *pLast = NULL;
+ while (nLength > 0 && pNode) {
+ pLast = pNode;
+ CFX_WideString name = CFX_WideString(pName, nLength);
+ pNode = _Lookup(pLast, name);
+ name_extractor.GetNext(pName, nLength);
+ }
+ return pNode ? pNode->field_ptr : NULL;
+}
+CPDF_FormField *CFieldTree::RemoveField(const CFX_WideString & full_name)
+{
+ if (full_name == L"") {
+ return NULL;
+ }
+ _CFieldNameExtractor name_extractor(full_name);
+ FX_LPCWSTR pName;
+ FX_STRSIZE nLength;
+ name_extractor.GetNext(pName, nLength);
+ _Node *pNode = &m_Root, *pLast = NULL;
+ while (nLength > 0 && pNode) {
+ pLast = pNode;
+ CFX_WideString name = CFX_WideString(pName, nLength);
+ pNode = _Lookup(pLast, name);
+ name_extractor.GetNext(pName, nLength);
+ }
+ if (pNode && pNode != &m_Root) {
+ CFX_PtrArray& ptr_array = pLast->children;
+ for (int i = 0; i < ptr_array.GetSize(); i ++) {
+ if (pNode == (_Node *)ptr_array[i]) {
+ ptr_array.RemoveAt(i);
+ break;
+ }
+ }
+ CPDF_FormField *pField = pNode->field_ptr;
+ RemoveNode(pNode);
+ return pField;
+ }
+ return NULL;
+}
+CFieldTree::_Node *CFieldTree::FindNode(const CFX_WideString& full_name)
+{
+ if (full_name == L"") {
+ return NULL;
+ }
+ _CFieldNameExtractor name_extractor(full_name);
+ FX_LPCWSTR pName;
+ FX_STRSIZE nLength;
+ name_extractor.GetNext(pName, nLength);
+ _Node *pNode = &m_Root, *pLast = NULL;
+ while (nLength > 0 && pNode) {
+ pLast = pNode;
+ CFX_WideString name = CFX_WideString(pName, nLength);
+ pNode = _Lookup(pLast, name);
+ name_extractor.GetNext(pName, nLength);
+ }
+ return pNode;
+}
+CPDF_InterForm::CPDF_InterForm(CPDF_Document* pDocument, FX_BOOL bGenerateAP) : CFX_PrivateData()
+{
+ m_pDocument = pDocument;
+ m_bGenerateAP = bGenerateAP;
+ m_pFormNotify = NULL;
+ m_bUpdated = FALSE;
+ m_pFieldTree = FX_NEW CFieldTree;
+ CPDF_Dictionary* pRoot = m_pDocument->GetRoot();
+ m_pFormDict = pRoot->GetDict("AcroForm");
+ if (m_pFormDict == NULL) {
+ return;
+ }
+ CPDF_Array* pFields = m_pFormDict->GetArray("Fields");
+ if (pFields == NULL) {
+ return;
+ }
+ int count = pFields->GetCount();
+ for (int i = 0; i < count; i ++) {
+ LoadField(pFields->GetDict(i));
+ }
+}
+CPDF_InterForm::~CPDF_InterForm()
+{
+ FX_POSITION pos = m_ControlMap.GetStartPosition();
+ while (pos) {
+ FX_LPVOID key, value;
+ m_ControlMap.GetNextAssoc(pos, key, value);
+ delete (CPDF_FormControl*)value;
+ }
+ if (m_pFieldTree != NULL) {
+ int nCount = m_pFieldTree->m_Root.CountFields();
+ for (int i = 0; i < nCount; i++) {
+ CPDF_FormField *pField = m_pFieldTree->m_Root.GetField(i);
+ delete pField;
+ }
+ delete m_pFieldTree;
+ }
+}
+FX_BOOL CPDF_InterForm::m_bUpdateAP = TRUE;
+FX_BOOL CPDF_InterForm::UpdatingAPEnabled()
+{
+ return m_bUpdateAP;
+}
+void CPDF_InterForm::EnableUpdateAP(FX_BOOL bUpdateAP)
+{
+ m_bUpdateAP = bUpdateAP;
+}
+CFX_ByteString CPDF_InterForm::GenerateNewResourceName(const CPDF_Dictionary* pResDict, FX_LPCSTR csType, int iMinLen, FX_LPCSTR csPrefix)
+{
+ CFX_ByteString csStr = csPrefix;
+ CFX_ByteString csBType = csType;
+ if (csStr.IsEmpty()) {
+ if (csBType == "ExtGState") {
+ csStr = "GS";
+ } else if (csBType == "ColorSpace") {
+ csStr = "CS";
+ } else if (csBType == "Font") {
+ csStr = "ZiTi";
+ } else {
+ csStr = "Res";
+ }
+ }
+ CFX_ByteString csTmp = csStr;
+ int iCount = csStr.GetLength();
+ int m = 0;
+ if (iMinLen > 0) {
+ csTmp = "";
+ while (m < iMinLen && m < iCount) {
+ csTmp += csStr[m ++];
+ }
+ while (m < iMinLen) {
+ csTmp += '0' + m % 10;
+ m ++;
+ }
+ } else {
+ m = iCount;
+ }
+ if (pResDict == NULL) {
+ return csTmp;
+ }
+ CPDF_Dictionary* pDict = pResDict->GetDict(csType);
+ if (pDict == NULL) {
+ return csTmp;
+ }
+ int num = 0;
+ CFX_ByteString bsNum;
+ while (TRUE) {
+ if (!pDict->KeyExist(csTmp + bsNum)) {
+ return csTmp + bsNum;
+ }
+ if (m < iCount) {
+ csTmp += csStr[m ++];
+ } else {
+ bsNum.Format("%d", num++);
+ }
+ m ++;
+ }
+ return csTmp;
+}
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+typedef struct _PDF_FONTDATA {
+ FX_BOOL bFind;
+ LOGFONTA lf;
+} PDF_FONTDATA, FAR* LPDF_FONTDATA;
+static int CALLBACK EnumFontFamExProc( ENUMLOGFONTEXA *lpelfe,
+ NEWTEXTMETRICEX *lpntme,
+ DWORD FontType,
+ LPARAM lParam
+ )
+{
+ if (FontType != 0x004 || strchr(lpelfe->elfLogFont.lfFaceName, '@') != NULL) {
+ return 1;
+ } else {
+ LPDF_FONTDATA pData = (LPDF_FONTDATA)lParam;
+ memcpy(&pData->lf, &lpelfe->elfLogFont, sizeof(LOGFONTA));
+ pData->bFind = TRUE;
+ return 0;
+ }
+}
+static FX_BOOL RetrieveSpecificFont(LOGFONTA& lf)
+{
+ PDF_FONTDATA fd;
+ memset(&fd, 0, sizeof(PDF_FONTDATA));
+ HDC hDC = ::GetDC(NULL);
+ EnumFontFamiliesExA(hDC, &lf, (FONTENUMPROCA)EnumFontFamExProc, (LPARAM)&fd, 0);
+ ::ReleaseDC(NULL, hDC);
+ if (fd.bFind) {
+ memcpy(&lf, &fd.lf, sizeof(LOGFONTA));
+ }
+ return fd.bFind;
+}
+static FX_BOOL RetrieveSpecificFont(FX_BYTE charSet, FX_BYTE pitchAndFamily, LPCSTR pcsFontName, LOGFONTA& lf)
+{
+ memset(&lf, 0, sizeof(LOGFONTA));
+ lf.lfCharSet = charSet;
+ lf.lfPitchAndFamily = pitchAndFamily;
+ if (pcsFontName != NULL) {
+ strcpy(lf.lfFaceName, pcsFontName);
+ }
+ return RetrieveSpecificFont(lf);
+}
+static FX_BOOL RetrieveStockFont(int iFontObject, FX_BYTE charSet, LOGFONTA& lf)
+{
+ HFONT hFont = (HFONT)::GetStockObject(iFontObject);
+ if (hFont != NULL) {
+ memset(&lf, 0, sizeof(LOGFONTA));
+ int iRet = ::GetObject(hFont, sizeof(LOGFONTA), &lf);
+ if (iRet > 0 && (lf.lfCharSet == charSet || charSet == 255)) {
+ return RetrieveSpecificFont(lf);
+ }
+ }
+ return FALSE;
+}
+#endif
+CPDF_Font* CPDF_InterForm::AddSystemDefaultFont(const CPDF_Document* pDocument)
+{
+ if (pDocument == NULL) {
+ return NULL;
+ }
+ CPDF_Font* pFont = NULL;
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+ LOGFONTA lf;
+ FX_BOOL bRet;
+ bRet = RetrieveStockFont(DEFAULT_GUI_FONT, 255, lf);
+ if (!bRet) {
+ bRet = RetrieveStockFont(SYSTEM_FONT, 255, lf);
+ }
+ if (bRet) {
+ pFont = ((CPDF_Document*)pDocument)->AddWindowsFont(&lf, FALSE, TRUE);
+ }
+#endif
+ return pFont;
+}
+CPDF_Font* CPDF_InterForm::AddSystemFont(const CPDF_Document* pDocument, CFX_ByteString csFontName, FX_BYTE iCharSet)
+{
+ if (pDocument == NULL || csFontName.IsEmpty()) {
+ return NULL;
+ }
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+ if (iCharSet == 1) {
+ iCharSet = GetNativeCharSet();
+ }
+ HFONT hFont = ::CreateFontA(0, 0, 0, 0, 0, 0, 0, 0, iCharSet, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, (FX_LPCSTR)csFontName);
+ if (hFont != NULL) {
+ LOGFONTA lf;
+ memset(&lf, 0, sizeof(LOGFONTA));
+ ::GetObjectA(hFont, sizeof(LOGFONTA), &lf);
+ ::DeleteObject(hFont);
+ if (strlen(lf.lfFaceName) > 0) {
+ return ((CPDF_Document*)pDocument)->AddWindowsFont(&lf, FALSE, TRUE);
+ }
+ }
+#endif
+ return NULL;
+}
+CPDF_Font* CPDF_InterForm::AddSystemFont(const CPDF_Document* pDocument, CFX_WideString csFontName, FX_BYTE iCharSet)
+{
+ if (pDocument == NULL || csFontName.IsEmpty()) {
+ return NULL;
+ }
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+ if (iCharSet == 1) {
+ iCharSet = GetNativeCharSet();
+ }
+ HFONT hFont = ::CreateFontW(0, 0, 0, 0, 0, 0, 0, 0, iCharSet, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, csFontName);
+ if (hFont != NULL) {
+ LOGFONTA lf;
+ memset(&lf, 0, sizeof(LOGFONTA));
+ ::GetObject(hFont, sizeof(LOGFONTA), &lf);
+ ::DeleteObject(hFont);
+ if (strlen(lf.lfFaceName) > 0) {
+ return ((CPDF_Document*)pDocument)->AddWindowsFont(&lf, FALSE, TRUE);
+ }
+ }
+#endif
+ return NULL;
+}
+CPDF_Font* CPDF_InterForm::AddStandardFont(const CPDF_Document* pDocument, CFX_ByteString csFontName)
+{
+ if (pDocument == NULL || csFontName.IsEmpty()) {
+ return NULL;
+ }
+ CPDF_Font* pFont = NULL;
+ if (csFontName == "ZapfDingbats") {
+ pFont = ((CPDF_Document*)pDocument)->AddStandardFont(csFontName, NULL);
+ } else {
+ CPDF_FontEncoding encoding(PDFFONT_ENCODING_WINANSI);
+ pFont = ((CPDF_Document*)pDocument)->AddStandardFont(csFontName, &encoding);
+ }
+ return pFont;
+}
+CFX_ByteString CPDF_InterForm::GetNativeFont(FX_BYTE charSet, FX_LPVOID pLogFont)
+{
+ CFX_ByteString csFontName;
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+ LOGFONTA lf;
+ FX_BOOL bRet;
+ if (charSet == ANSI_CHARSET) {
+ csFontName = "Helvetica";
+ return csFontName;
+ }
+ bRet = FALSE;
+ if (charSet == SHIFTJIS_CHARSET) {
+ bRet = RetrieveSpecificFont(charSet, DEFAULT_PITCH | FF_DONTCARE, "MS Mincho", lf);
+ } else if (charSet == GB2312_CHARSET) {
+ bRet = RetrieveSpecificFont(charSet, DEFAULT_PITCH | FF_DONTCARE, "SimSun", lf);
+ } else if (charSet == CHINESEBIG5_CHARSET) {
+ bRet = RetrieveSpecificFont(charSet, DEFAULT_PITCH | FF_DONTCARE, "MingLiU", lf);
+ }
+ if (!bRet) {
+ bRet = RetrieveSpecificFont(charSet, DEFAULT_PITCH | FF_DONTCARE, "Arial Unicode MS", lf);
+ }
+ if (!bRet) {
+ bRet = RetrieveSpecificFont(charSet, DEFAULT_PITCH | FF_DONTCARE, "Microsoft Sans Serif", lf);
+ }
+ if (!bRet) {
+ bRet = RetrieveSpecificFont(charSet, DEFAULT_PITCH | FF_DONTCARE, NULL, lf);
+ }
+ if (bRet) {
+ if (pLogFont != NULL) {
+ memcpy(pLogFont, &lf, sizeof(LOGFONTA));
+ }
+ csFontName = lf.lfFaceName;
+ return csFontName;
+ }
+#endif
+ return csFontName;
+}
+CFX_ByteString CPDF_InterForm::GetNativeFont(FX_LPVOID pLogFont)
+{
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+ FX_BYTE charSet = GetNativeCharSet();
+ return GetNativeFont(charSet, pLogFont);
+#else
+ return CFX_ByteString();
+#endif
+}
+FX_BYTE CPDF_InterForm::GetNativeCharSet()
+{
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+ FX_BYTE charSet = ANSI_CHARSET;
+ UINT iCodePage = ::GetACP();
+ switch (iCodePage) {
+ case 932:
+ charSet = SHIFTJIS_CHARSET;
+ break;
+ case 936:
+ charSet = GB2312_CHARSET;
+ break;
+ case 950:
+ charSet = CHINESEBIG5_CHARSET;
+ break;
+ case 1252:
+ charSet = ANSI_CHARSET;
+ break;
+ case 874:
+ charSet = THAI_CHARSET;
+ break;
+ case 949:
+ charSet = HANGUL_CHARSET;
+ break;
+ case 1200:
+ charSet = ANSI_CHARSET;
+ break;
+ case 1250:
+ charSet = EASTEUROPE_CHARSET;
+ break;
+ case 1251:
+ charSet = RUSSIAN_CHARSET;
+ break;
+ case 1253:
+ charSet = GREEK_CHARSET;
+ break;
+ case 1254:
+ charSet = TURKISH_CHARSET;
+ break;
+ case 1255:
+ charSet = HEBREW_CHARSET;
+ break;
+ case 1256:
+ charSet = ARABIC_CHARSET;
+ break;
+ case 1257:
+ charSet = BALTIC_CHARSET;
+ break;
+ case 1258:
+ charSet = VIETNAMESE_CHARSET;
+ break;
+ case 1361:
+ charSet = JOHAB_CHARSET;
+ break;
+ }
+ return charSet;
+#else
+ return 0;
+#endif
+}
+CPDF_Font* CPDF_InterForm::AddNativeFont(FX_BYTE charSet, const CPDF_Document* pDocument)
+{
+ if (pDocument == NULL) {
+ return NULL;
+ }
+ CPDF_Font* pFont = NULL;
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+ LOGFONTA lf;
+ CFX_ByteString csFontName = GetNativeFont(charSet, &lf);
+ if (!csFontName.IsEmpty()) {
+ if (csFontName == "Helvetica") {
+ pFont = AddStandardFont(pDocument, csFontName);
+ } else {
+ pFont = ((CPDF_Document*)pDocument)->AddWindowsFont(&lf, FALSE, TRUE);
+ }
+ }
+#endif
+ return pFont;
+}
+CPDF_Font* CPDF_InterForm::AddNativeFont(const CPDF_Document* pDocument)
+{
+ if (pDocument == NULL) {
+ return NULL;
+ }
+ CPDF_Font* pFont = NULL;
+ FX_BYTE charSet = GetNativeCharSet();
+ pFont = AddNativeFont(charSet, pDocument);
+ return pFont;
+}
+FX_BOOL CPDF_InterForm::ValidateFieldName(CFX_WideString& csNewFieldName, int iType, const CPDF_FormField* pExcludedField, const CPDF_FormControl* pExcludedControl)
+{
+ if (csNewFieldName.IsEmpty()) {
+ return FALSE;
+ }
+ int iPos = 0;
+ int iLength = csNewFieldName.GetLength();
+ CFX_WideString csSub;
+ while (TRUE) {
+ while (iPos < iLength && (csNewFieldName[iPos] == L'.' || csNewFieldName[iPos] == L' ')) {
+ iPos ++;
+ }
+ if (iPos < iLength && !csSub.IsEmpty()) {
+ csSub += L'.';
+ }
+ while (iPos < iLength && csNewFieldName[iPos] != L'.') {
+ csSub += csNewFieldName[iPos ++];
+ }
+ for (int i = csSub.GetLength() - 1; i > -1; i --) {
+ if (csSub[i] == L' ' || csSub[i] == L'.') {
+ csSub.SetAt(i, L'\0');
+ } else {
+ break;
+ }
+ }
+ FX_DWORD dwCount = m_pFieldTree->m_Root.CountFields();
+ for (FX_DWORD m = 0; m < dwCount; m ++) {
+ CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(m);
+ if (pField == NULL) {
+ continue;
+ }
+ if (pField == pExcludedField) {
+ if (pExcludedControl != NULL) {
+ if (pField->CountControls() < 2) {
+ continue;
+ }
+ } else {
+ continue;
+ }
+ }
+ CFX_WideString csFullName = pField->GetFullName();
+ int iRet = CompareFieldName(csSub, csFullName);
+ if (iRet == 1) {
+ if (pField->GetFieldType() != iType) {
+ return FALSE;
+ }
+ } else if (iRet == 2 && csSub == csNewFieldName) {
+ if (csFullName[iPos] == L'.') {
+ return FALSE;
+ }
+ } else if (iRet == 3 && csSub == csNewFieldName) {
+ if (csNewFieldName[csFullName.GetLength()] == L'.') {
+ return FALSE;
+ }
+ }
+ }
+ if (iPos >= iLength) {
+ break;
+ }
+ }
+ if (csSub.IsEmpty()) {
+ return FALSE;
+ }
+ csNewFieldName = csSub;
+ return TRUE;
+}
+FX_BOOL CPDF_InterForm::ValidateFieldName(CFX_WideString& csNewFieldName, int iType)
+{
+ return ValidateFieldName(csNewFieldName, iType, NULL, NULL);
+}
+FX_BOOL CPDF_InterForm::ValidateFieldName(const CPDF_FormField* pField, CFX_WideString& csNewFieldName)
+{
+ if (pField == NULL || csNewFieldName.IsEmpty()) {
+ return FALSE;
+ }
+ return ValidateFieldName(csNewFieldName, ((CPDF_FormField*)pField)->GetFieldType(), pField, NULL);
+}
+FX_BOOL CPDF_InterForm::ValidateFieldName(const CPDF_FormControl* pControl, CFX_WideString& csNewFieldName)
+{
+ if (pControl == NULL || csNewFieldName.IsEmpty()) {
+ return FALSE;
+ }
+ CPDF_FormField* pField = ((CPDF_FormControl*)pControl)->GetField();
+ return ValidateFieldName(csNewFieldName, pField->GetFieldType(), pField, pControl);
+}
+int CPDF_InterForm::CompareFieldName(const CFX_ByteString& name1, const CFX_ByteString& name2)
+{
+ FX_LPCSTR ptr1 = name1, ptr2 = name2;
+ if (name1.GetLength() != name2.GetLength()) {
+ int i = 0;
+ while (ptr1[i] == ptr2[i]) {
+ i ++;
+ }
+ if (i == name1.GetLength()) {
+ return 2;
+ }
+ if (i == name2.GetLength()) {
+ return 3;
+ }
+ return 0;
+ } else {
+ return name1 == name2 ? 1 : 0;
+ }
+}
+int CPDF_InterForm::CompareFieldName(const CFX_WideString& name1, const CFX_WideString& name2)
+{
+ FX_LPCWSTR ptr1 = name1, ptr2 = name2;
+ if (name1.GetLength() != name2.GetLength()) {
+ int i = 0;
+ while (ptr1[i] == ptr2[i]) {
+ i ++;
+ }
+ if (i == name1.GetLength()) {
+ return 2;
+ }
+ if (i == name2.GetLength()) {
+ return 3;
+ }
+ return 0;
+ } else {
+ return name1 == name2 ? 1 : 0;
+ }
+}
+FX_DWORD CPDF_InterForm::CountFields(const CFX_WideString &csFieldName)
+{
+ if (csFieldName.IsEmpty()) {
+ return (FX_DWORD)m_pFieldTree->m_Root.CountFields();
+ }
+ CFieldTree::_Node *pNode = m_pFieldTree->FindNode(csFieldName);
+ if (pNode == NULL) {
+ return 0;
+ }
+ return pNode->CountFields();
+}
+CPDF_FormField* CPDF_InterForm::GetField(FX_DWORD index, const CFX_WideString &csFieldName)
+{
+ if (csFieldName == L"") {
+ return m_pFieldTree->m_Root.GetField(index);
+ }
+ CFieldTree::_Node *pNode = m_pFieldTree->FindNode(csFieldName);
+ if (pNode == NULL) {
+ return NULL;
+ }
+ return pNode->GetField(index);
+}
+void CPDF_InterForm::GetAllFieldNames(CFX_WideStringArray& allFieldNames)
+{
+ allFieldNames.RemoveAll();
+ int nCount = m_pFieldTree->m_Root.CountFields();
+ for (int i = 0; i < nCount; i ++) {
+ CPDF_FormField *pField = m_pFieldTree->m_Root.GetField(i);
+ if (pField) {
+ CFX_WideString full_name = GetFullName(pField->GetFieldDict());
+ allFieldNames.Add(full_name);
+ }
+ }
+}
+FX_BOOL CPDF_InterForm::IsValidFormField(const void* pField)
+{
+ if (pField == NULL) {
+ return FALSE;
+ }
+ int nCount = m_pFieldTree->m_Root.CountFields();
+ for (int i = 0; i < nCount; i++) {
+ CPDF_FormField *pFormField = m_pFieldTree->m_Root.GetField(i);
+ if (pField == pFormField) {
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+CPDF_FormField* CPDF_InterForm::GetFieldByDict(CPDF_Dictionary* pFieldDict) const
+{
+ if (pFieldDict == NULL) {
+ return NULL;
+ }
+ CFX_WideString csWName = GetFullName(pFieldDict);
+ return m_pFieldTree->GetField(csWName);
+}
+FX_DWORD CPDF_InterForm::CountControls(CFX_WideString csFieldName)
+{
+ if (csFieldName.IsEmpty()) {
+ return (FX_DWORD)m_ControlMap.GetCount();
+ }
+ CPDF_FormField *pField = m_pFieldTree->GetField(csFieldName);
+ if (pField == NULL) {
+ return 0;
+ }
+ return pField->m_ControlList.GetSize();
+}
+CPDF_FormControl* CPDF_InterForm::GetControl(FX_DWORD index, CFX_WideString csFieldName)
+{
+ CPDF_FormField *pField = m_pFieldTree->GetField(csFieldName);
+ if (pField == NULL) {
+ return NULL;
+ }
+ if (index < (FX_DWORD)pField->m_ControlList.GetSize()) {
+ return (CPDF_FormControl *)pField->m_ControlList.GetAt(index);
+ }
+ return NULL;
+}
+FX_BOOL CPDF_InterForm::IsValidFormControl(const void* pControl)
+{
+ if (pControl == NULL) {
+ return FALSE;
+ }
+ FX_POSITION pos = m_ControlMap.GetStartPosition();
+ while (pos) {
+ CPDF_Dictionary* pWidgetDict = NULL;
+ void* pFormControl = NULL;
+ m_ControlMap.GetNextAssoc(pos, (FX_LPVOID&)pWidgetDict, pFormControl);
+ if (pControl == pFormControl) {
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+int CPDF_InterForm::CountPageControls(CPDF_Page* pPage) const
+{
+ CPDF_Array* pAnnotList = pPage->m_pFormDict->GetArray("Annots");
+ if (pAnnotList == NULL) {
+ return 0;
+ }
+ int count = 0;
+ for (FX_DWORD i = 0; i < pAnnotList->GetCount(); i ++) {
+ CPDF_Dictionary* pAnnot = pAnnotList->GetDict(i);
+ if (pAnnot == NULL) {
+ continue;
+ }
+ CPDF_FormControl* pControl;
+ if (!m_ControlMap.Lookup(pAnnot, (FX_LPVOID&)pControl)) {
+ continue;
+ }
+ count ++;
+ }
+ return count;
+}
+CPDF_FormControl* CPDF_InterForm::GetPageControl(CPDF_Page* pPage, int index) const
+{
+ CPDF_Array* pAnnotList = pPage->m_pFormDict->GetArray("Annots");
+ if (pAnnotList == NULL) {
+ return NULL;
+ }
+ int count = 0;
+ for (FX_DWORD i = 0; i < pAnnotList->GetCount(); i ++) {
+ CPDF_Dictionary* pAnnot = pAnnotList->GetDict(i);
+ if (pAnnot == NULL) {
+ continue;
+ }
+ CPDF_FormControl* pControl;
+ if (!m_ControlMap.Lookup(pAnnot, (FX_LPVOID&)pControl)) {
+ continue;
+ }
+ if (index == count) {
+ return pControl;
+ }
+ count ++;
+ }
+ return NULL;
+}
+CPDF_FormControl* CPDF_InterForm::GetControlAtPoint(CPDF_Page* pPage, FX_FLOAT pdf_x, FX_FLOAT pdf_y) const
+{
+ CPDF_Array* pAnnotList = pPage->m_pFormDict->GetArray("Annots");
+ if (pAnnotList == NULL) {
+ return NULL;
+ }
+ for (FX_DWORD i = pAnnotList->GetCount(); i > 0; i --) {
+ CPDF_Dictionary* pAnnot = pAnnotList->GetDict(i - 1);
+ if (pAnnot == NULL) {
+ continue;
+ }
+ CPDF_FormControl* pControl;
+ if (!m_ControlMap.Lookup(pAnnot, (FX_LPVOID&)pControl)) {
+ continue;
+ }
+ CFX_FloatRect rect = pControl->GetRect();
+ if (rect.Contains(pdf_x, pdf_y)) {
+ return pControl;
+ }
+ }
+ return NULL;
+}
+CPDF_FormControl* CPDF_InterForm::GetControlByDict(CPDF_Dictionary* pWidgetDict) const
+{
+ CPDF_FormControl* pControl = NULL;
+ m_ControlMap.Lookup(pWidgetDict, (FX_LPVOID&)pControl);
+ return pControl;
+}
+FX_DWORD CPDF_InterForm::CountInternalFields(const CFX_WideString& csFieldName) const
+{
+ if (m_pFormDict == NULL) {
+ return 0;
+ }
+ CPDF_Array* pArray = m_pFormDict->GetArray("Fields");
+ if (pArray == NULL) {
+ return 0;
+ }
+ if (csFieldName.IsEmpty()) {
+ return pArray->GetCount();
+ } else {
+ int iLength = csFieldName.GetLength();
+ int iPos = 0;
+ CPDF_Dictionary* pDict = NULL;
+ while (pArray != NULL) {
+ CFX_WideString csSub;
+ if (iPos < iLength && csFieldName[iPos] == L'.') {
+ iPos ++;
+ }
+ while (iPos < iLength && csFieldName[iPos] != L'.') {
+ csSub += csFieldName[iPos ++];
+ }
+ int iCount = pArray->GetCount();
+ FX_BOOL bFind = FALSE;
+ for (int i = 0; i < iCount; i ++) {
+ pDict = pArray->GetDict(i);
+ if (pDict == NULL) {
+ continue;
+ }
+ CFX_WideString csT = pDict->GetUnicodeText("T");
+ if (csT == csSub) {
+ bFind = TRUE;
+ break;
+ }
+ }
+ if (!bFind) {
+ return 0;
+ }
+ if (iPos >= iLength) {
+ break;
+ }
+ pArray = pDict->GetArray("Kids");
+ }
+ if (pDict == NULL) {
+ return 0;
+ } else {
+ pArray = pDict->GetArray("Kids");
+ if (pArray == NULL) {
+ return 1;
+ } else {
+ return pArray->GetCount();
+ }
+ }
+ }
+}
+CPDF_Dictionary* CPDF_InterForm::GetInternalField(FX_DWORD index, const CFX_WideString& csFieldName) const
+{
+ if (m_pFormDict == NULL) {
+ return NULL;
+ }
+ CPDF_Array* pArray = m_pFormDict->GetArray("Fields");
+ if (pArray == NULL) {
+ return 0;
+ }
+ if (csFieldName.IsEmpty()) {
+ return pArray->GetDict(index);
+ } else {
+ int iLength = csFieldName.GetLength();
+ int iPos = 0;
+ CPDF_Dictionary* pDict = NULL;
+ while (pArray != NULL) {
+ CFX_WideString csSub;
+ if (iPos < iLength && csFieldName[iPos] == L'.') {
+ iPos ++;
+ }
+ while (iPos < iLength && csFieldName[iPos] != L'.') {
+ csSub += csFieldName[iPos ++];
+ }
+ int iCount = pArray->GetCount();
+ FX_BOOL bFind = FALSE;
+ for (int i = 0; i < iCount; i ++) {
+ pDict = pArray->GetDict(i);
+ if (pDict == NULL) {
+ continue;
+ }
+ CFX_WideString csT = pDict->GetUnicodeText("T");
+ if (csT == csSub) {
+ bFind = TRUE;
+ break;
+ }
+ }
+ if (!bFind) {
+ return NULL;
+ }
+ if (iPos >= iLength) {
+ break;
+ }
+ pArray = pDict->GetArray("Kids");
+ }
+ if (pDict == NULL) {
+ return NULL;
+ } else {
+ pArray = pDict->GetArray("Kids");
+ if (pArray == NULL) {
+ return pDict;
+ } else {
+ return pArray->GetDict(index);
+ }
+ }
+ }
+}
+FX_BOOL CPDF_InterForm::NeedConstructAP()
+{
+ if (m_pFormDict == NULL) {
+ return FALSE;
+ }
+ return m_pFormDict->GetBoolean("NeedAppearances");
+}
+void CPDF_InterForm::NeedConstructAP(FX_BOOL bNeedAP)
+{
+ if (m_pFormDict == NULL) {
+ InitInterFormDict(m_pFormDict, m_pDocument);
+ }
+ m_pFormDict->SetAtBoolean("NeedAppearances", bNeedAP);
+ m_bGenerateAP = bNeedAP;
+}
+int CPDF_InterForm::CountFieldsInCalculationOrder()
+{
+ if (m_pFormDict == NULL) {
+ return 0;
+ }
+ CPDF_Array* pArray = m_pFormDict->GetArray("CO");
+ if (pArray == NULL) {
+ return 0;
+ }
+ return pArray->GetCount();
+}
+CPDF_FormField* CPDF_InterForm::GetFieldInCalculationOrder(int index)
+{
+ if (m_pFormDict == NULL || index < 0) {
+ return NULL;
+ }
+ CPDF_Array* pArray = m_pFormDict->GetArray("CO");
+ if (pArray == NULL) {
+ return NULL;
+ }
+ CPDF_Object* pElement = pArray->GetElementValue(index);
+ if (pElement != NULL && pElement->GetType() == PDFOBJ_DICTIONARY) {
+ return GetFieldByDict((CPDF_Dictionary*)pElement);
+ }
+ return NULL;
+}
+int CPDF_InterForm::FindFieldInCalculationOrder(const CPDF_FormField* pField)
+{
+ if (m_pFormDict == NULL || pField == NULL) {
+ return -1;
+ }
+ CPDF_Array* pArray = m_pFormDict->GetArray("CO");
+ if (pArray == NULL) {
+ return -1;
+ }
+ for (FX_DWORD i = 0; i < pArray->GetCount(); i ++) {
+ CPDF_Object* pElement = pArray->GetElementValue(i);
+ if (pElement == pField->m_pDict) {
+ return i;
+ }
+ }
+ return -1;
+}
+FX_DWORD CPDF_InterForm::CountFormFonts()
+{
+ return CountInterFormFonts(m_pFormDict);
+}
+CPDF_Font* CPDF_InterForm::GetFormFont(FX_DWORD index, CFX_ByteString& csNameTag)
+{
+ return GetInterFormFont(m_pFormDict, m_pDocument, index, csNameTag);
+}
+CPDF_Font* CPDF_InterForm::GetFormFont(CFX_ByteString csNameTag)
+{
+ return GetInterFormFont(m_pFormDict, m_pDocument, csNameTag);
+}
+CPDF_Font* CPDF_InterForm::GetFormFont(CFX_ByteString csFontName, CFX_ByteString& csNameTag)
+{
+ return GetInterFormFont(m_pFormDict, m_pDocument, csFontName, csNameTag);
+}
+CPDF_Font* CPDF_InterForm::GetNativeFormFont(FX_BYTE charSet, CFX_ByteString& csNameTag)
+{
+ return GetNativeInterFormFont(m_pFormDict, m_pDocument, charSet, csNameTag);
+}
+CPDF_Font* CPDF_InterForm::GetNativeFormFont(CFX_ByteString& csNameTag)
+{
+ return GetNativeInterFormFont(m_pFormDict, m_pDocument, csNameTag);
+}
+FX_BOOL CPDF_InterForm::FindFormFont(const CPDF_Font* pFont, CFX_ByteString& csNameTag)
+{
+ return FindInterFormFont(m_pFormDict, pFont, csNameTag);
+}
+FX_BOOL CPDF_InterForm::FindFormFont(CFX_ByteString csFontName, CPDF_Font*& pFont, CFX_ByteString& csNameTag)
+{
+ return FindInterFormFont(m_pFormDict, m_pDocument, csFontName, pFont, csNameTag);
+}
+void CPDF_InterForm::AddFormFont(const CPDF_Font* pFont, CFX_ByteString& csNameTag)
+{
+ AddInterFormFont(m_pFormDict, m_pDocument, pFont, csNameTag);
+ m_bUpdated = TRUE;
+}
+CPDF_Font* CPDF_InterForm::AddNativeFormFont(FX_BYTE charSet, CFX_ByteString& csNameTag)
+{
+ m_bUpdated = TRUE;
+ return AddNativeInterFormFont(m_pFormDict, m_pDocument, charSet, csNameTag);
+}
+CPDF_Font* CPDF_InterForm::AddNativeFormFont(CFX_ByteString& csNameTag)
+{
+ m_bUpdated = TRUE;
+ return AddNativeInterFormFont(m_pFormDict, m_pDocument, csNameTag);
+}
+void CPDF_InterForm::RemoveFormFont(const CPDF_Font* pFont)
+{
+ m_bUpdated = TRUE;
+ RemoveInterFormFont(m_pFormDict, pFont);
+}
+void CPDF_InterForm::RemoveFormFont(CFX_ByteString csNameTag)
+{
+ m_bUpdated = TRUE;
+ RemoveInterFormFont(m_pFormDict, csNameTag);
+}
+CPDF_DefaultAppearance CPDF_InterForm::GetDefaultAppearance()
+{
+ CFX_ByteString csDA;
+ if (m_pFormDict == NULL) {
+ return csDA;
+ }
+ csDA = m_pFormDict->GetString("DA");
+ return csDA;
+}
+CPDF_Font* CPDF_InterForm::GetDefaultFormFont()
+{
+ return GetDefaultInterFormFont(m_pFormDict, m_pDocument);
+}
+int CPDF_InterForm::GetFormAlignment()
+{
+ if (m_pFormDict == NULL) {
+ return 0;
+ }
+ return m_pFormDict->GetInteger("Q", 0);
+}
+FX_BOOL CPDF_InterForm::ResetForm(const CFX_PtrArray& fields, FX_BOOL bIncludeOrExclude, FX_BOOL bNotify)
+{
+ if (bNotify && m_pFormNotify != NULL) {
+ int iRet = m_pFormNotify->BeforeFormReset(this);
+ if (iRet < 0) {
+ return FALSE;
+ }
+ }
+ int nCount = m_pFieldTree->m_Root.CountFields();
+ for (int i = 0; i < nCount; i++) {
+ CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(i);
+ if (pField == NULL) {
+ continue;
+ }
+ FX_BOOL bFind = FALSE;
+ int iCount = fields.GetSize();
+ for (int i = 0; i < iCount; i ++) {
+ if (pField == (CPDF_FormField*)fields[i]) {
+ bFind = TRUE;
+ break;
+ }
+ }
+ if ((bIncludeOrExclude && bFind) || (!bIncludeOrExclude && !bFind)) {
+ pField->ResetField(bNotify);
+ }
+ }
+ if (bNotify && m_pFormNotify != NULL) {
+ m_pFormNotify->AfterFormReset(this);
+ }
+ return TRUE;
+}
+FX_BOOL CPDF_InterForm::ResetForm(FX_BOOL bNotify)
+{
+ if (bNotify && m_pFormNotify != NULL) {
+ int iRet = m_pFormNotify->BeforeFormReset(this);
+ if (iRet < 0) {
+ return FALSE;
+ }
+ }
+ int nCount = m_pFieldTree->m_Root.CountFields();
+ for (int i = 0; i < nCount; i++) {
+ CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(i);
+ if (pField == NULL) {
+ continue;
+ }
+ pField->ResetField(bNotify);
+ }
+ if (bNotify && m_pFormNotify != NULL) {
+ m_pFormNotify->AfterFormReset(this);
+ }
+ return TRUE;
+}
+void CPDF_InterForm::ReloadForm()
+{
+ FX_POSITION pos = m_ControlMap.GetStartPosition();
+ while (pos) {
+ CPDF_Dictionary* pWidgetDict;
+ CPDF_FormControl* pControl;
+ m_ControlMap.GetNextAssoc(pos, (FX_LPVOID&)pWidgetDict, (FX_LPVOID&)pControl);
+ delete pControl;
+ }
+ m_ControlMap.RemoveAll();
+ int nCount = m_pFieldTree->m_Root.CountFields();
+ for (int k = 0; k < nCount; k ++) {
+ CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(k);
+ delete pField;
+ }
+ m_pFieldTree->RemoveAll();
+ if (m_pFormDict == NULL) {
+ return;
+ }
+ CPDF_Array* pFields = m_pFormDict->GetArray("Fields");
+ if (pFields == NULL) {
+ return;
+ }
+ int iCount = pFields->GetCount();
+ for (int i = 0; i < iCount; i ++) {
+ LoadField(pFields->GetDict(i));
+ }
+}
+void CPDF_InterForm::LoadField(CPDF_Dictionary* pFieldDict, int nLevel)
+{
+ if (nLevel > nMaxRecursion) {
+ return;
+ }
+ if (pFieldDict == NULL) {
+ return;
+ }
+ FX_DWORD dwParentObjNum = pFieldDict->GetObjNum();
+ CPDF_Array* pKids = pFieldDict->GetArray("Kids");
+ if (!pKids) {
+ AddTerminalField(pFieldDict);
+ return;
+ }
+ CPDF_Dictionary* pFirstKid = pKids->GetDict(0);
+ if (pFirstKid == NULL) {
+ return;
+ }
+ if (pFirstKid->KeyExist("T") || pFirstKid->KeyExist("Kids")) {
+ for (FX_DWORD i = 0; i < pKids->GetCount(); i ++) {
+ CPDF_Dictionary * pChildDict = pKids->GetDict(i);
+ if (pChildDict) {
+ if (pChildDict->GetObjNum() != dwParentObjNum) {
+ LoadField(pChildDict, nLevel + 1);
+ }
+ }
+ }
+ } else {
+ AddTerminalField(pFieldDict);
+ }
+}
+FX_BOOL CPDF_InterForm::HasXFAForm() const
+{
+ return m_pFormDict && m_pFormDict->GetArray(FX_BSTRC("XFA")) != NULL;
+}
+void CPDF_InterForm::FixPageFields(const CPDF_Page* pPage)
+{
+ ASSERT(pPage != NULL);
+ CPDF_Dictionary* pPageDict = pPage->m_pFormDict;
+ if (pPageDict == NULL) {
+ return;
+ }
+ CPDF_Array* pAnnots = pPageDict->GetArray(FX_BSTRC("Annots"));
+ if (pAnnots == NULL) {
+ return;
+ }
+ int iAnnotCount = pAnnots->GetCount();
+ for (int i = 0; i < iAnnotCount; i++) {
+ CPDF_Dictionary* pAnnot = pAnnots->GetDict(i);
+ if (pAnnot != NULL && pAnnot->GetString(FX_BSTRC("Subtype")) == "Widget") {
+ LoadField(pAnnot);
+ }
+ }
+}
+CPDF_FormField* CPDF_InterForm::AddTerminalField(const CPDF_Dictionary* pFieldDict)
+{
+ if (!pFieldDict->KeyExist(FX_BSTRC("T"))) {
+ return NULL;
+ }
+ CPDF_Dictionary* pDict = (CPDF_Dictionary*)pFieldDict;
+ CFX_WideString csWName = GetFullName(pDict);
+ if (csWName.IsEmpty()) {
+ return NULL;
+ }
+ CPDF_FormField* pField = NULL;
+ pField = m_pFieldTree->GetField(csWName);
+ if (pField == NULL) {
+ CPDF_Dictionary *pParent = (CPDF_Dictionary*)pFieldDict;
+ if (!pFieldDict->KeyExist(FX_BSTR("T")) &&
+ pFieldDict->GetString(FX_BSTRC("Subtype")) == FX_BSTRC("Widget")) {
+ pParent = pFieldDict->GetDict(FX_BSTRC("Parent"));
+ if (!pParent) {
+ pParent = (CPDF_Dictionary*)pFieldDict;
+ }
+ }
+ if (pParent && pParent != pFieldDict && !pParent->KeyExist(FX_BSTRC("FT"))) {
+ if (pFieldDict->KeyExist(FX_BSTRC("FT"))) {
+ CPDF_Object *pFTValue = pFieldDict->GetElementValue(FX_BSTRC("FT"));
+ if (pFTValue) {
+ pParent->SetAt(FX_BSTRC("FT"), pFTValue->Clone());
+ }
+ }
+ if (pFieldDict->KeyExist(FX_BSTRC("Ff"))) {
+ CPDF_Object *pFfValue = pFieldDict->GetElementValue(FX_BSTRC("Ff"));
+ if (pFfValue) {
+ pParent->SetAt(FX_BSTRC("Ff"), pFfValue->Clone());
+ }
+ }
+ }
+ pField = FX_NEW CPDF_FormField(this, pParent);
+ CPDF_Object* pTObj = pDict->GetElement("T");
+ if (pTObj && pTObj->GetType() == PDFOBJ_REFERENCE) {
+ CPDF_Object* pClone = pTObj->Clone(TRUE);
+ if (pClone) {
+ pDict->SetAt("T", pClone);
+ } else {
+ pDict->SetAtName("T", "");
+ }
+ }
+ m_pFieldTree->SetField(csWName, pField);
+ }
+ CPDF_Array* pKids = pFieldDict->GetArray("Kids");
+ if (pKids == NULL) {
+ if (pFieldDict->GetString("Subtype") == "Widget") {
+ AddControl(pField, pFieldDict);
+ }
+ } else {
+ for (FX_DWORD i = 0; i < pKids->GetCount(); i ++) {
+ CPDF_Dictionary* pKid = pKids->GetDict(i);
+ if (pKid == NULL) {
+ continue;
+ }
+ if (pKid->GetString("Subtype") != "Widget") {
+ continue;
+ }
+ AddControl(pField, pKid);
+ }
+ }
+ return pField;
+}
+CPDF_FormControl* CPDF_InterForm::AddControl(const CPDF_FormField* pField, const CPDF_Dictionary* pWidgetDict)
+{
+ void *rValue = NULL;
+ if (m_ControlMap.Lookup((CPDF_Dictionary*)pWidgetDict, rValue)) {
+ return (CPDF_FormControl*)rValue;
+ }
+ CPDF_FormControl* pControl = FX_NEW CPDF_FormControl((CPDF_FormField*)pField, (CPDF_Dictionary*)pWidgetDict);
+ if (pControl == NULL) {
+ return NULL;
+ }
+ m_ControlMap.SetAt((CPDF_Dictionary*)pWidgetDict, pControl);
+ ((CPDF_FormField*)pField)->m_ControlList.Add(pControl);
+ return pControl;
+}
+CPDF_FormField* CPDF_InterForm::CheckRequiredFields(const CFX_PtrArray *fields, FX_BOOL bIncludeOrExclude) const
+{
+ int nCount = m_pFieldTree->m_Root.CountFields();
+ for (int i = 0; i < nCount; i++) {
+ CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(i);
+ if (pField == NULL) {
+ continue;
+ }
+ FX_INT32 iType = pField->GetType();
+ if (iType == CPDF_FormField::PushButton || iType == CPDF_FormField::CheckBox || iType == CPDF_FormField::ListBox) {
+ continue;
+ }
+ FX_DWORD dwFlags = pField->GetFieldFlags();
+ if (dwFlags & 0x04) {
+ continue;
+ }
+ FX_BOOL bFind = TRUE;
+ if (fields != NULL) {
+ bFind = fields->Find(pField, 0) >= 0;
+ }
+ if ((bIncludeOrExclude && bFind) || (!bIncludeOrExclude && !bFind)) {
+ CPDF_Dictionary *pFieldDict = pField->m_pDict;
+ if ((dwFlags & 0x02) != 0 && pFieldDict->GetString("V").IsEmpty()) {
+ return pField;
+ }
+ }
+ }
+ return NULL;
+}
+CFDF_Document* CPDF_InterForm::ExportToFDF(FX_WSTR pdf_path, FX_BOOL bSimpleFileSpec) const
+{
+ CFX_PtrArray fields;
+ int nCount = m_pFieldTree->m_Root.CountFields();
+ for (int i = 0; i < nCount; i ++) {
+ CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(i);
+ fields.Add(pField);
+ }
+ return ExportToFDF(pdf_path, fields, TRUE, bSimpleFileSpec);
+}
+CFX_WideString FILESPEC_EncodeFileName(FX_WSTR filepath);
+CFDF_Document* CPDF_InterForm::ExportToFDF(FX_WSTR pdf_path, CFX_PtrArray& fields, FX_BOOL bIncludeOrExclude, FX_BOOL bSimpleFileSpec) const
+{
+ CFDF_Document* pDoc = CFDF_Document::CreateNewDoc();
+ if (pDoc == NULL) {
+ return NULL;
+ }
+ CPDF_Dictionary* pMainDict = pDoc->GetRoot()->GetDict("FDF");
+ if (!pdf_path.IsEmpty()) {
+ if (bSimpleFileSpec) {
+ CFX_WideString wsFilePath = FILESPEC_EncodeFileName(pdf_path);
+ pMainDict->SetAtString(FX_BSTRC("F"), CFX_ByteString::FromUnicode(wsFilePath));
+ pMainDict->SetAtString(FX_BSTRC("UF"), PDF_EncodeText(wsFilePath));
+ } else {
+ CPDF_FileSpec filespec;
+ filespec.SetFileName(pdf_path);
+ pMainDict->SetAt("F", (CPDF_Object*)filespec);
+ }
+ }
+ CPDF_Array* pFields = CPDF_Array::Create();
+ if (pFields == NULL) {
+ return NULL;
+ }
+ pMainDict->SetAt("Fields", pFields);
+ int nCount = m_pFieldTree->m_Root.CountFields();
+ for (int i = 0; i < nCount; i ++) {
+ CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(i);
+ if (pField == NULL || pField->GetType() == CPDF_FormField::PushButton) {
+ continue;
+ }
+ FX_DWORD dwFlags = pField->GetFieldFlags();
+ if (dwFlags & 0x04) {
+ continue;
+ }
+ FX_BOOL bFind = fields.Find(pField, 0) >= 0;
+ if ((bIncludeOrExclude && bFind) || (!bIncludeOrExclude && !bFind)) {
+ if ((dwFlags & 0x02) != 0 && pField->m_pDict->GetString("V").IsEmpty()) {
+ continue;
+ }
+ CFX_WideString fullname = GetFullName(pField->GetFieldDict());
+ CPDF_Dictionary* pFieldDict = CPDF_Dictionary::Create();
+ if (pFieldDict == NULL) {
+ return NULL;
+ }
+ CPDF_String* pString = CPDF_String::Create(fullname);
+ if (pString == NULL) {
+ pFieldDict->Release();
+ return NULL;
+ }
+ pFieldDict->SetAt("T", pString);
+ if (pField->GetType() == CPDF_FormField::CheckBox || pField->GetType() == CPDF_FormField::RadioButton) {
+ CFX_WideString csExport = pField->GetCheckValue(FALSE);
+ CFX_ByteString csBExport = PDF_EncodeText(csExport);
+ CPDF_Object* pOpt = FPDF_GetFieldAttr(pField->m_pDict, "Opt");
+ if (pOpt == NULL) {
+ pFieldDict->SetAtName("V", csBExport);
+ } else {
+ pFieldDict->SetAtString("V", csBExport);
+ }
+ } else {
+ CPDF_Object* pV = FPDF_GetFieldAttr(pField->m_pDict, "V");
+ if (pV != NULL) {
+ pFieldDict->SetAt("V", pV->Clone(TRUE));
+ }
+ }
+ pFields->Add(pFieldDict);
+ }
+ }
+ return pDoc;
+}
+const struct _SupportFieldEncoding {
+ FX_LPCSTR m_name;
+ FX_INT32 m_codePage;
+} g_fieldEncoding[] = {
+ "BigFive", 950,
+ "GBK", 936,
+ "Shift-JIS", 932,
+ "UHC", 949,
+};
+static void FPDFDOC_FDF_GetFieldValue(CPDF_Dictionary *pFieldDict, CFX_WideString &csValue, CFX_ByteString &bsEncoding)
+{
+ ASSERT(pFieldDict != NULL);
+ CFX_ByteString csBValue = pFieldDict->GetString("V");
+ FX_INT32 iCount = sizeof(g_fieldEncoding) / sizeof(g_fieldEncoding[0]);
+ FX_INT32 i = 0;
+ for (; i < iCount; ++i)
+ if (bsEncoding == g_fieldEncoding[i].m_name) {
+ break;
+ }
+ if (i < iCount) {
+ CFX_CharMap *pCharMap = CFX_CharMap::GetDefaultMapper(g_fieldEncoding[i].m_codePage);
+ FXSYS_assert(pCharMap != NULL);
+ csValue.ConvertFrom(csBValue, pCharMap);
+ return;
+ }
+ CFX_ByteString csTemp = csBValue.Left(2);
+ if (csTemp == "\xFF\xFE" || csTemp == "\xFE\xFF") {
+ csValue = PDF_DecodeText(csBValue);
+ } else {
+ csValue = CFX_WideString::FromLocal(csBValue);
+ }
+}
+void CPDF_InterForm::FDF_ImportField(CPDF_Dictionary* pFieldDict, const CFX_WideString& parent_name, FX_BOOL bNotify, int nLevel)
+{
+ CFX_WideString name;
+ if (!parent_name.IsEmpty()) {
+ name = parent_name + L".";
+ }
+ name += pFieldDict->GetUnicodeText("T");
+ CPDF_Array* pKids = pFieldDict->GetArray("Kids");
+ if (pKids) {
+ for (FX_DWORD i = 0; i < pKids->GetCount(); i ++) {
+ CPDF_Dictionary* pKid = pKids->GetDict(i);
+ if (pKid == NULL) {
+ continue;
+ }
+ if (nLevel <= nMaxRecursion) {
+ FDF_ImportField(pKid, name, bNotify, nLevel + 1);
+ }
+ }
+ return;
+ }
+ if (!pFieldDict->KeyExist("V")) {
+ return;
+ }
+ CPDF_FormField* pField = m_pFieldTree->GetField(name);
+ if (pField == NULL) {
+ return;
+ }
+ CFX_WideString csWValue;
+ FPDFDOC_FDF_GetFieldValue(pFieldDict, csWValue, m_bsEncoding);
+ int iType = pField->GetFieldType();
+ if (bNotify && m_pFormNotify != NULL) {
+ int iRet = 0;
+ if (iType == FIELDTYPE_LISTBOX) {
+ iRet = m_pFormNotify->BeforeSelectionChange(pField, csWValue);
+ } else if (iType == FIELDTYPE_COMBOBOX || iType == FIELDTYPE_TEXTFIELD) {
+ iRet = m_pFormNotify->BeforeValueChange(pField, csWValue);
+ }
+ if (iRet < 0) {
+ return;
+ }
+ }
+ CFX_ByteArray statusArray;
+ if (iType == FIELDTYPE_CHECKBOX || iType == FIELDTYPE_RADIOBUTTON) {
+ SaveCheckedFieldStatus(pField, statusArray);
+ }
+ pField->SetValue(csWValue);
+ CPDF_FormField::Type eType = pField->GetType();
+ if ((eType == CPDF_FormField::ListBox || eType == CPDF_FormField::ComboBox) && pFieldDict->KeyExist("Opt")) {
+ pField->m_pDict->SetAt("Opt", pFieldDict->GetElementValue("Opt")->Clone(TRUE));
+ }
+ if (bNotify && m_pFormNotify != NULL) {
+ if (iType == FIELDTYPE_CHECKBOX || iType == FIELDTYPE_RADIOBUTTON) {
+ m_pFormNotify->AfterCheckedStatusChange(pField, statusArray);
+ } else if (iType == FIELDTYPE_LISTBOX) {
+ m_pFormNotify->AfterSelectionChange(pField);
+ } else if (iType == FIELDTYPE_COMBOBOX || iType == FIELDTYPE_TEXTFIELD) {
+ m_pFormNotify->AfterValueChange(pField);
+ }
+ }
+ if (CPDF_InterForm::m_bUpdateAP) {
+ pField->UpdateAP(NULL);
+ }
+}
+FX_BOOL CPDF_InterForm::ImportFromFDF(const CFDF_Document* pFDF, FX_BOOL bNotify)
+{
+ if (pFDF == NULL) {
+ return FALSE;
+ }
+ CPDF_Dictionary* pMainDict = pFDF->GetRoot()->GetDict("FDF");
+ if (pMainDict == NULL) {
+ return FALSE;
+ }
+ CPDF_Array* pFields = pMainDict->GetArray("Fields");
+ if (pFields == NULL) {
+ return FALSE;
+ }
+ m_bsEncoding = pMainDict->GetString(FX_BSTRC("Encoding"));
+ if (bNotify && m_pFormNotify != NULL) {
+ int iRet = m_pFormNotify->BeforeFormImportData(this);
+ if (iRet < 0) {
+ return FALSE;
+ }
+ }
+ for (FX_DWORD i = 0; i < pFields->GetCount(); i ++) {
+ CPDF_Dictionary* pField = pFields->GetDict(i);
+ if (pField == NULL) {
+ continue;
+ }
+ FDF_ImportField(pField, L"", bNotify);
+ }
+ if (bNotify && m_pFormNotify != NULL) {
+ m_pFormNotify->AfterFormImportData(this);
+ }
+ return TRUE;
+}
+void CPDF_InterForm::SetFormNotify(const CPDF_FormNotify* pNotify)
+{
+ m_pFormNotify = (CPDF_FormNotify*)pNotify;
+}
+int CPDF_InterForm::GetPageWithWidget(int iCurPage, FX_BOOL bNext)
+{
+ if (iCurPage < 0) {
+ return -1;
+ }
+ int iPageCount = m_pDocument->GetPageCount();
+ if (iCurPage >= iPageCount) {
+ return -1;
+ }
+ int iNewPage = iCurPage;
+ do {
+ iNewPage += bNext ? 1 : -1;
+ if (iNewPage >= iPageCount) {
+ iNewPage = 0;
+ }
+ if (iNewPage < 0) {
+ iNewPage = iPageCount - 1;
+ }
+ if (iNewPage == iCurPage) {
+ break;
+ }
+ CPDF_Dictionary* pPageDict = m_pDocument->GetPage(iNewPage);
+ if (pPageDict == NULL) {
+ continue;
+ }
+ CPDF_Array* pAnnots = pPageDict->GetArray("Annots");
+ if (pAnnots == NULL) {
+ continue;
+ }
+ FX_DWORD dwCount = pAnnots->GetCount();
+ for (FX_DWORD i = 0; i < dwCount; i ++) {
+ CPDF_Object* pAnnotDict = pAnnots->GetElementValue(i);
+ if (pAnnotDict == NULL) {
+ continue;
+ }
+ CPDF_FormControl* pControl = NULL;
+ if (m_ControlMap.Lookup(pAnnotDict, (void*&)pControl)) {
+ return iNewPage;
+ }
+ }
+ } while (TRUE);
+ return -1;
+}
diff --git a/core/src/fpdfdoc/doc_formcontrol.cpp b/core/src/fpdfdoc/doc_formcontrol.cpp
index f92b87e5f6..61cd980754 100644
--- a/core/src/fpdfdoc/doc_formcontrol.cpp
+++ b/core/src/fpdfdoc/doc_formcontrol.cpp
@@ -1,461 +1,461 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../include/fpdfdoc/fpdf_doc.h"
-CPDF_FormControl::CPDF_FormControl(CPDF_FormField* pField, CPDF_Dictionary* pWidgetDict)
-{
- m_pField = pField;
- m_pWidgetDict = pWidgetDict;
- m_pForm = m_pField->m_pForm;
-}
-CFX_FloatRect CPDF_FormControl::GetRect()
-{
- return m_pWidgetDict->GetRect("Rect");
-}
-CFX_ByteString CPDF_FormControl::GetOnStateName()
-{
- ASSERT(GetType() == CPDF_FormField::CheckBox || GetType() == CPDF_FormField::RadioButton);
- CFX_ByteString csOn;
- CPDF_Dictionary* pAP = m_pWidgetDict->GetDict("AP");
- if (pAP == NULL) {
- return csOn;
- }
- CPDF_Dictionary* pN = pAP->GetDict("N");
- if (pN == NULL) {
- return csOn;
- }
- FX_POSITION pos = pN->GetStartPos();
- while (pos) {
- pN->GetNextElement(pos, csOn);
- if (csOn != "Off") {
- return csOn;
- }
- }
- return CFX_ByteString();
-}
-void CPDF_FormControl::SetOnStateName(const CFX_ByteString& csOn)
-{
- ASSERT(GetType() == CPDF_FormField::CheckBox || GetType() == CPDF_FormField::RadioButton);
- CFX_ByteString csValue = csOn;
- if (csValue.IsEmpty()) {
- csValue = "Yes";
- }
- if (csValue == "Off") {
- csValue = "Yes";
- }
- CFX_ByteString csAS = m_pWidgetDict->GetString("AS", "Off");
- if (csAS != "Off") {
- m_pWidgetDict->SetAtName("AS", csValue);
- }
- CPDF_Dictionary* pAP = m_pWidgetDict->GetDict("AP");
- if (pAP == NULL) {
- return;
- }
- FX_POSITION pos1 = pAP->GetStartPos();
- while (pos1) {
- CFX_ByteString csKey1;
- CPDF_Object* pObj1 = pAP->GetNextElement(pos1, csKey1);
- if (pObj1 == NULL) {
- continue;
- }
- CPDF_Object* pObjDirect1 = pObj1->GetDirect();
- if (pObjDirect1->GetType() != PDFOBJ_DICTIONARY) {
- continue;
- }
- CPDF_Dictionary* pSubDict = (CPDF_Dictionary*)pObjDirect1;
- FX_POSITION pos2 = pSubDict->GetStartPos();
- while (pos2) {
- CFX_ByteString csKey2;
- CPDF_Object* pObj2 = pSubDict->GetNextElement(pos2, csKey2);
- if (pObj2 == NULL) {
- continue;
- }
- if (csKey2 != "Off") {
- pSubDict->ReplaceKey(csKey2, csValue);
- break;
- }
- }
- }
-}
-CFX_ByteString CPDF_FormControl::GetCheckedAPState()
-{
- ASSERT(GetType() == CPDF_FormField::CheckBox || GetType() == CPDF_FormField::RadioButton);
- CFX_ByteString csOn = GetOnStateName();
- if (GetType() == CPDF_FormField::RadioButton || GetType() == CPDF_FormField::CheckBox) {
- CPDF_Object* pOpt = FPDF_GetFieldAttr(m_pField->m_pDict, "Opt");
- if (pOpt != NULL && pOpt->GetType() == PDFOBJ_ARRAY) {
- int iIndex = m_pField->GetControlIndex(this);
- csOn.Format("%d", iIndex);
- }
- }
- if (csOn.IsEmpty()) {
- csOn = "Yes";
- }
- return csOn;
-}
-CFX_WideString CPDF_FormControl::GetExportValue()
-{
- ASSERT(GetType() == CPDF_FormField::CheckBox || GetType() == CPDF_FormField::RadioButton);
- CFX_ByteString csOn = GetOnStateName();
- if (GetType() == CPDF_FormField::RadioButton || GetType() == CPDF_FormField::CheckBox) {
- CPDF_Object* pOpt = FPDF_GetFieldAttr(m_pField->m_pDict, "Opt");
- if (pOpt != NULL && pOpt->GetType() == PDFOBJ_ARRAY) {
- int iIndex = m_pField->GetControlIndex(this);
- csOn = ((CPDF_Array*)pOpt)->GetString(iIndex);
- }
- }
- if (csOn.IsEmpty()) {
- csOn = "Yes";
- }
- CFX_WideString csWOn = PDF_DecodeText(csOn);
- return csWOn;
-}
-FX_BOOL CPDF_FormControl::IsChecked()
-{
- ASSERT(GetType() == CPDF_FormField::CheckBox || GetType() == CPDF_FormField::RadioButton);
- CFX_ByteString csOn = GetOnStateName();
- CFX_ByteString csAS = m_pWidgetDict->GetString("AS");
- return csAS == csOn;
-}
-FX_BOOL CPDF_FormControl::IsDefaultChecked()
-{
- ASSERT(GetType() == CPDF_FormField::CheckBox || GetType() == CPDF_FormField::RadioButton);
- CPDF_Object* pDV = FPDF_GetFieldAttr(m_pField->m_pDict, "DV");
- if (pDV == NULL) {
- return FALSE;
- }
- CFX_ByteString csDV = pDV->GetString();
- CFX_ByteString csOn = GetOnStateName();
- return (csDV == csOn);
-}
-void CPDF_FormControl::CheckControl(FX_BOOL bChecked)
-{
- ASSERT(GetType() == CPDF_FormField::CheckBox || GetType() == CPDF_FormField::RadioButton);
- CFX_ByteString csOn = GetOnStateName();
- CFX_ByteString csOldAS = m_pWidgetDict->GetString("AS", "Off");
- CFX_ByteString csAS = "Off";
- if (bChecked) {
- csAS = csOn;
- }
- if (csOldAS == csAS) {
- return;
- }
- m_pWidgetDict->SetAtName("AS", csAS);
- m_pForm->m_bUpdated = TRUE;
-}
-CPDF_Stream* FPDFDOC_GetAnnotAP(CPDF_Dictionary* pAnnotDict, CPDF_Annot::AppearanceMode mode);
-void CPDF_FormControl::DrawControl(CFX_RenderDevice* pDevice, CFX_AffineMatrix* pMatrix, CPDF_Page* pPage,
- CPDF_Annot::AppearanceMode mode, const CPDF_RenderOptions* pOptions)
-{
- if (m_pWidgetDict->GetInteger("F") & ANNOTFLAG_HIDDEN) {
- return;
- }
- CPDF_Stream* pStream = FPDFDOC_GetAnnotAP(m_pWidgetDict, mode);
- if (pStream == NULL) {
- return;
- }
- CFX_FloatRect form_bbox = pStream->GetDict()->GetRect("BBox");
- CFX_AffineMatrix form_matrix = pStream->GetDict()->GetMatrix("Matrix");
- form_matrix.TransformRect(form_bbox);
- CFX_FloatRect arect = m_pWidgetDict->GetRect("Rect");
- CFX_AffineMatrix matrix;
- matrix.MatchRect(arect, form_bbox);
- matrix.Concat(*pMatrix);
- CPDF_Form form(m_pField->m_pForm->m_pDocument, m_pField->m_pForm->m_pFormDict->GetDict("DR"), pStream);
- form.ParseContent(NULL, NULL, NULL, NULL);
- CPDF_RenderContext context;
- context.Create(pPage);
- context.DrawObjectList(pDevice, &form, &matrix, pOptions);
-}
-const FX_CHAR* g_sHighlightingMode[] = {"N", "I", "O", "P", "T", ""};
-CPDF_FormControl::HighlightingMode CPDF_FormControl::GetHighlightingMode()
-{
- if (m_pWidgetDict == NULL) {
- return Invert;
- }
- CFX_ByteString csH = m_pWidgetDict->GetString("H", "I");
- int i = 0;
- while (g_sHighlightingMode[i][0] != '\0') {
- if (csH.Equal(g_sHighlightingMode[i])) {
- return (HighlightingMode)i;
- }
- i ++;
- }
- return Invert;
-}
-CPDF_ApSettings CPDF_FormControl::GetMK(FX_BOOL bCreate)
-{
- if (!m_pWidgetDict) {
- return NULL;
- }
- CPDF_ApSettings mk = m_pWidgetDict->GetDict(FX_BSTRC("MK"));
- if (!mk && bCreate) {
- mk = CPDF_Dictionary::Create();
- if (mk == NULL) {
- return NULL;
- }
- m_pWidgetDict->SetAt(FX_BSTRC("MK"), mk);
- }
- return mk;
-}
-FX_BOOL CPDF_FormControl::HasMKEntry(CFX_ByteString csEntry)
-{
- CPDF_ApSettings mk = GetMK(FALSE);
- return mk.HasMKEntry(csEntry);
-}
-int CPDF_FormControl::GetRotation()
-{
- CPDF_ApSettings mk = GetMK(FALSE);
- return mk.GetRotation();
-}
-FX_ARGB CPDF_FormControl::GetColor(int& iColorType, CFX_ByteString csEntry)
-{
- CPDF_ApSettings mk = GetMK(FALSE);
- return mk.GetColor(iColorType, csEntry);
-}
-FX_FLOAT CPDF_FormControl::GetOriginalColor(int index, CFX_ByteString csEntry)
-{
- CPDF_ApSettings mk = GetMK(FALSE);
- return mk.GetOriginalColor(index, csEntry);
-}
-void CPDF_FormControl::GetOriginalColor(int& iColorType, FX_FLOAT fc[4], CFX_ByteString csEntry)
-{
- CPDF_ApSettings mk = GetMK(FALSE);
- mk.GetOriginalColor(iColorType, fc, csEntry);
-}
-CFX_WideString CPDF_FormControl::GetCaption(CFX_ByteString csEntry)
-{
- CPDF_ApSettings mk = GetMK(FALSE);
- return mk.GetCaption(csEntry);
-}
-CPDF_Stream* CPDF_FormControl::GetIcon(CFX_ByteString csEntry)
-{
- CPDF_ApSettings mk = GetMK(FALSE);
- return mk.GetIcon(csEntry);
-}
-CPDF_IconFit CPDF_FormControl::GetIconFit()
-{
- CPDF_ApSettings mk = GetMK(FALSE);
- return mk.GetIconFit();
-}
-int CPDF_FormControl::GetTextPosition()
-{
- CPDF_ApSettings mk = GetMK(FALSE);
- return mk.GetTextPosition();
-}
-CPDF_Action CPDF_FormControl::GetAction()
-{
- if (m_pWidgetDict == NULL) {
- return NULL;
- }
- if (m_pWidgetDict->KeyExist("A")) {
- return m_pWidgetDict->GetDict("A");
- } else {
- CPDF_Object* pObj = FPDF_GetFieldAttr(m_pField->m_pDict, "A");
- if (pObj == NULL) {
- return NULL;
- }
- return pObj->GetDict();
- }
-}
-CPDF_AAction CPDF_FormControl::GetAdditionalAction()
-{
- if (m_pWidgetDict == NULL) {
- return NULL;
- }
- if (m_pWidgetDict->KeyExist("AA")) {
- return m_pWidgetDict->GetDict("AA");
- } else {
- return m_pField->GetAdditionalAction();
- }
-}
-CPDF_DefaultAppearance CPDF_FormControl::GetDefaultAppearance()
-{
- if (m_pWidgetDict == NULL) {
- return CFX_ByteString();
- }
- if (m_pWidgetDict->KeyExist("DA")) {
- return m_pWidgetDict->GetString("DA");
- } else {
- CPDF_Object* pObj = FPDF_GetFieldAttr(m_pField->m_pDict, "DA");
- if (pObj == NULL) {
- return m_pField->m_pForm->GetDefaultAppearance();
- }
- return pObj->GetString();
- }
-}
-CPDF_Font* CPDF_FormControl::GetDefaultControlFont()
-{
- CPDF_DefaultAppearance cDA = GetDefaultAppearance();
- CFX_ByteString csFontNameTag;
- FX_FLOAT fFontSize;
- cDA.GetFont(csFontNameTag, fFontSize);
- if (csFontNameTag.IsEmpty()) {
- return NULL;
- }
- CPDF_Object* pObj = FPDF_GetFieldAttr(m_pWidgetDict, "DR");
- if (pObj != NULL && pObj->GetType() == PDFOBJ_DICTIONARY) {
- CPDF_Dictionary* pFonts = ((CPDF_Dictionary*)pObj)->GetDict("Font");
- if (pFonts != NULL) {
- CPDF_Dictionary *pElement = pFonts->GetDict(csFontNameTag);
- CPDF_Font *pFont = m_pField->m_pForm->m_pDocument->LoadFont(pElement);
- if (pFont != NULL) {
- return pFont;
- }
- }
- }
- CPDF_Font *pFont = m_pField->m_pForm->GetFormFont(csFontNameTag);
- if (pFont != NULL) {
- return pFont;
- }
- CPDF_Dictionary *pPageDict = m_pWidgetDict->GetDict("P");
- pObj = FPDF_GetFieldAttr(pPageDict, "Resources");
- if (pObj != NULL && pObj->GetType() == PDFOBJ_DICTIONARY) {
- CPDF_Dictionary* pFonts = ((CPDF_Dictionary*)pObj)->GetDict("Font");
- if (pFonts != NULL) {
- CPDF_Dictionary *pElement = pFonts->GetDict(csFontNameTag);
- CPDF_Font *pFont = m_pField->m_pForm->m_pDocument->LoadFont(pElement);
- if (pFont != NULL) {
- return pFont;
- }
- }
- }
- return NULL;
-}
-int CPDF_FormControl::GetControlAlignment()
-{
- if (m_pWidgetDict == NULL) {
- return 0;
- }
- if (m_pWidgetDict->KeyExist("Q")) {
- return m_pWidgetDict->GetInteger("Q", 0);
- } else {
- CPDF_Object* pObj = FPDF_GetFieldAttr(m_pField->m_pDict, "Q");
- if (pObj == NULL) {
- return m_pField->m_pForm->GetFormAlignment();
- }
- return pObj->GetInteger();
- }
-}
-FX_BOOL CPDF_ApSettings::HasMKEntry(FX_BSTR csEntry)
-{
- if (m_pDict == NULL) {
- return FALSE;
- }
- return m_pDict->KeyExist(csEntry);
-}
-int CPDF_ApSettings::GetRotation()
-{
- if (m_pDict == NULL) {
- return 0;
- }
- return m_pDict->GetInteger(FX_BSTRC("R"));
-}
-FX_ARGB CPDF_ApSettings::GetColor(int& iColorType, FX_BSTR csEntry)
-{
- iColorType = COLORTYPE_TRANSPARENT;
- if (m_pDict == NULL) {
- return 0;
- }
- FX_ARGB color = 0;
- CPDF_Array* pEntry = m_pDict->GetArray(csEntry);
- if (pEntry == NULL) {
- return color;
- }
- FX_DWORD dwCount = pEntry->GetCount();
- if (dwCount == 1) {
- iColorType = COLORTYPE_GRAY;
- FX_FLOAT g = pEntry->GetNumber(0) * 255;
- color = ArgbEncode(255, (int)g, (int)g, (int)g);
- } else if (dwCount == 3) {
- iColorType = COLORTYPE_RGB;
- FX_FLOAT r = pEntry->GetNumber(0) * 255;
- FX_FLOAT g = pEntry->GetNumber(1) * 255;
- FX_FLOAT b = pEntry->GetNumber(2) * 255;
- color = ArgbEncode(255, (int)r, (int)g, (int)b);
- } else if (dwCount == 4) {
- iColorType = COLORTYPE_CMYK;
- FX_FLOAT c = pEntry->GetNumber(0);
- FX_FLOAT m = pEntry->GetNumber(1);
- FX_FLOAT y = pEntry->GetNumber(2);
- FX_FLOAT k = pEntry->GetNumber(3);
- FX_FLOAT r = 1.0f - FX_MIN(1.0f, c + k);
- FX_FLOAT g = 1.0f - FX_MIN(1.0f, m + k);
- FX_FLOAT b = 1.0f - FX_MIN(1.0f, y + k);
- color = ArgbEncode(255, (int)(r * 255), (int)(g * 255), (int)(b * 255));
- }
- return color;
-}
-FX_FLOAT CPDF_ApSettings::GetOriginalColor(int index, FX_BSTR csEntry)
-{
- if (m_pDict == NULL) {
- return 0;
- }
- CPDF_Array* pEntry = m_pDict->GetArray(csEntry);
- if (pEntry != NULL) {
- return pEntry->GetNumber(index);
- }
- return 0;
-}
-void CPDF_ApSettings::GetOriginalColor(int& iColorType, FX_FLOAT fc[4], FX_BSTR csEntry)
-{
- iColorType = COLORTYPE_TRANSPARENT;
- for (int i = 0; i < 4; i ++) {
- fc[i] = 0;
- }
- if (m_pDict == NULL) {
- return;
- }
- CPDF_Array* pEntry = m_pDict->GetArray(csEntry);
- if (pEntry == NULL) {
- return;
- }
- FX_DWORD dwCount = pEntry->GetCount();
- if (dwCount == 1) {
- iColorType = COLORTYPE_GRAY;
- fc[0] = pEntry->GetNumber(0);
- } else if (dwCount == 3) {
- iColorType = COLORTYPE_RGB;
- fc[0] = pEntry->GetNumber(0);
- fc[1] = pEntry->GetNumber(1);
- fc[2] = pEntry->GetNumber(2);
- } else if (dwCount == 4) {
- iColorType = COLORTYPE_CMYK;
- fc[0] = pEntry->GetNumber(0);
- fc[1] = pEntry->GetNumber(1);
- fc[2] = pEntry->GetNumber(2);
- fc[3] = pEntry->GetNumber(3);
- }
-}
-CFX_WideString CPDF_ApSettings::GetCaption(FX_BSTR csEntry)
-{
- CFX_WideString csCaption;
- if (m_pDict == NULL) {
- return csCaption;
- }
- return m_pDict->GetUnicodeText(csEntry);
-}
-CPDF_Stream* CPDF_ApSettings::GetIcon(FX_BSTR csEntry)
-{
- if (m_pDict == NULL) {
- return NULL;
- }
- return m_pDict->GetStream(csEntry);
-}
-CPDF_IconFit CPDF_ApSettings::GetIconFit()
-{
- if (m_pDict == NULL) {
- return NULL;
- }
- return m_pDict->GetDict(FX_BSTRC("IF"));
-}
-int CPDF_ApSettings::GetTextPosition()
-{
- if (m_pDict == NULL) {
- return TEXTPOS_CAPTION;
- }
- return m_pDict->GetInteger(FX_BSTRC("TP"), TEXTPOS_CAPTION);
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fpdfdoc/fpdf_doc.h"
+CPDF_FormControl::CPDF_FormControl(CPDF_FormField* pField, CPDF_Dictionary* pWidgetDict)
+{
+ m_pField = pField;
+ m_pWidgetDict = pWidgetDict;
+ m_pForm = m_pField->m_pForm;
+}
+CFX_FloatRect CPDF_FormControl::GetRect()
+{
+ return m_pWidgetDict->GetRect("Rect");
+}
+CFX_ByteString CPDF_FormControl::GetOnStateName()
+{
+ ASSERT(GetType() == CPDF_FormField::CheckBox || GetType() == CPDF_FormField::RadioButton);
+ CFX_ByteString csOn;
+ CPDF_Dictionary* pAP = m_pWidgetDict->GetDict("AP");
+ if (pAP == NULL) {
+ return csOn;
+ }
+ CPDF_Dictionary* pN = pAP->GetDict("N");
+ if (pN == NULL) {
+ return csOn;
+ }
+ FX_POSITION pos = pN->GetStartPos();
+ while (pos) {
+ pN->GetNextElement(pos, csOn);
+ if (csOn != "Off") {
+ return csOn;
+ }
+ }
+ return CFX_ByteString();
+}
+void CPDF_FormControl::SetOnStateName(const CFX_ByteString& csOn)
+{
+ ASSERT(GetType() == CPDF_FormField::CheckBox || GetType() == CPDF_FormField::RadioButton);
+ CFX_ByteString csValue = csOn;
+ if (csValue.IsEmpty()) {
+ csValue = "Yes";
+ }
+ if (csValue == "Off") {
+ csValue = "Yes";
+ }
+ CFX_ByteString csAS = m_pWidgetDict->GetString("AS", "Off");
+ if (csAS != "Off") {
+ m_pWidgetDict->SetAtName("AS", csValue);
+ }
+ CPDF_Dictionary* pAP = m_pWidgetDict->GetDict("AP");
+ if (pAP == NULL) {
+ return;
+ }
+ FX_POSITION pos1 = pAP->GetStartPos();
+ while (pos1) {
+ CFX_ByteString csKey1;
+ CPDF_Object* pObj1 = pAP->GetNextElement(pos1, csKey1);
+ if (pObj1 == NULL) {
+ continue;
+ }
+ CPDF_Object* pObjDirect1 = pObj1->GetDirect();
+ if (pObjDirect1->GetType() != PDFOBJ_DICTIONARY) {
+ continue;
+ }
+ CPDF_Dictionary* pSubDict = (CPDF_Dictionary*)pObjDirect1;
+ FX_POSITION pos2 = pSubDict->GetStartPos();
+ while (pos2) {
+ CFX_ByteString csKey2;
+ CPDF_Object* pObj2 = pSubDict->GetNextElement(pos2, csKey2);
+ if (pObj2 == NULL) {
+ continue;
+ }
+ if (csKey2 != "Off") {
+ pSubDict->ReplaceKey(csKey2, csValue);
+ break;
+ }
+ }
+ }
+}
+CFX_ByteString CPDF_FormControl::GetCheckedAPState()
+{
+ ASSERT(GetType() == CPDF_FormField::CheckBox || GetType() == CPDF_FormField::RadioButton);
+ CFX_ByteString csOn = GetOnStateName();
+ if (GetType() == CPDF_FormField::RadioButton || GetType() == CPDF_FormField::CheckBox) {
+ CPDF_Object* pOpt = FPDF_GetFieldAttr(m_pField->m_pDict, "Opt");
+ if (pOpt != NULL && pOpt->GetType() == PDFOBJ_ARRAY) {
+ int iIndex = m_pField->GetControlIndex(this);
+ csOn.Format("%d", iIndex);
+ }
+ }
+ if (csOn.IsEmpty()) {
+ csOn = "Yes";
+ }
+ return csOn;
+}
+CFX_WideString CPDF_FormControl::GetExportValue()
+{
+ ASSERT(GetType() == CPDF_FormField::CheckBox || GetType() == CPDF_FormField::RadioButton);
+ CFX_ByteString csOn = GetOnStateName();
+ if (GetType() == CPDF_FormField::RadioButton || GetType() == CPDF_FormField::CheckBox) {
+ CPDF_Object* pOpt = FPDF_GetFieldAttr(m_pField->m_pDict, "Opt");
+ if (pOpt != NULL && pOpt->GetType() == PDFOBJ_ARRAY) {
+ int iIndex = m_pField->GetControlIndex(this);
+ csOn = ((CPDF_Array*)pOpt)->GetString(iIndex);
+ }
+ }
+ if (csOn.IsEmpty()) {
+ csOn = "Yes";
+ }
+ CFX_WideString csWOn = PDF_DecodeText(csOn);
+ return csWOn;
+}
+FX_BOOL CPDF_FormControl::IsChecked()
+{
+ ASSERT(GetType() == CPDF_FormField::CheckBox || GetType() == CPDF_FormField::RadioButton);
+ CFX_ByteString csOn = GetOnStateName();
+ CFX_ByteString csAS = m_pWidgetDict->GetString("AS");
+ return csAS == csOn;
+}
+FX_BOOL CPDF_FormControl::IsDefaultChecked()
+{
+ ASSERT(GetType() == CPDF_FormField::CheckBox || GetType() == CPDF_FormField::RadioButton);
+ CPDF_Object* pDV = FPDF_GetFieldAttr(m_pField->m_pDict, "DV");
+ if (pDV == NULL) {
+ return FALSE;
+ }
+ CFX_ByteString csDV = pDV->GetString();
+ CFX_ByteString csOn = GetOnStateName();
+ return (csDV == csOn);
+}
+void CPDF_FormControl::CheckControl(FX_BOOL bChecked)
+{
+ ASSERT(GetType() == CPDF_FormField::CheckBox || GetType() == CPDF_FormField::RadioButton);
+ CFX_ByteString csOn = GetOnStateName();
+ CFX_ByteString csOldAS = m_pWidgetDict->GetString("AS", "Off");
+ CFX_ByteString csAS = "Off";
+ if (bChecked) {
+ csAS = csOn;
+ }
+ if (csOldAS == csAS) {
+ return;
+ }
+ m_pWidgetDict->SetAtName("AS", csAS);
+ m_pForm->m_bUpdated = TRUE;
+}
+CPDF_Stream* FPDFDOC_GetAnnotAP(CPDF_Dictionary* pAnnotDict, CPDF_Annot::AppearanceMode mode);
+void CPDF_FormControl::DrawControl(CFX_RenderDevice* pDevice, CFX_AffineMatrix* pMatrix, CPDF_Page* pPage,
+ CPDF_Annot::AppearanceMode mode, const CPDF_RenderOptions* pOptions)
+{
+ if (m_pWidgetDict->GetInteger("F") & ANNOTFLAG_HIDDEN) {
+ return;
+ }
+ CPDF_Stream* pStream = FPDFDOC_GetAnnotAP(m_pWidgetDict, mode);
+ if (pStream == NULL) {
+ return;
+ }
+ CFX_FloatRect form_bbox = pStream->GetDict()->GetRect("BBox");
+ CFX_AffineMatrix form_matrix = pStream->GetDict()->GetMatrix("Matrix");
+ form_matrix.TransformRect(form_bbox);
+ CFX_FloatRect arect = m_pWidgetDict->GetRect("Rect");
+ CFX_AffineMatrix matrix;
+ matrix.MatchRect(arect, form_bbox);
+ matrix.Concat(*pMatrix);
+ CPDF_Form form(m_pField->m_pForm->m_pDocument, m_pField->m_pForm->m_pFormDict->GetDict("DR"), pStream);
+ form.ParseContent(NULL, NULL, NULL, NULL);
+ CPDF_RenderContext context;
+ context.Create(pPage);
+ context.DrawObjectList(pDevice, &form, &matrix, pOptions);
+}
+const FX_CHAR* g_sHighlightingMode[] = {"N", "I", "O", "P", "T", ""};
+CPDF_FormControl::HighlightingMode CPDF_FormControl::GetHighlightingMode()
+{
+ if (m_pWidgetDict == NULL) {
+ return Invert;
+ }
+ CFX_ByteString csH = m_pWidgetDict->GetString("H", "I");
+ int i = 0;
+ while (g_sHighlightingMode[i][0] != '\0') {
+ if (csH.Equal(g_sHighlightingMode[i])) {
+ return (HighlightingMode)i;
+ }
+ i ++;
+ }
+ return Invert;
+}
+CPDF_ApSettings CPDF_FormControl::GetMK(FX_BOOL bCreate)
+{
+ if (!m_pWidgetDict) {
+ return NULL;
+ }
+ CPDF_ApSettings mk = m_pWidgetDict->GetDict(FX_BSTRC("MK"));
+ if (!mk && bCreate) {
+ mk = CPDF_Dictionary::Create();
+ if (mk == NULL) {
+ return NULL;
+ }
+ m_pWidgetDict->SetAt(FX_BSTRC("MK"), mk);
+ }
+ return mk;
+}
+FX_BOOL CPDF_FormControl::HasMKEntry(CFX_ByteString csEntry)
+{
+ CPDF_ApSettings mk = GetMK(FALSE);
+ return mk.HasMKEntry(csEntry);
+}
+int CPDF_FormControl::GetRotation()
+{
+ CPDF_ApSettings mk = GetMK(FALSE);
+ return mk.GetRotation();
+}
+FX_ARGB CPDF_FormControl::GetColor(int& iColorType, CFX_ByteString csEntry)
+{
+ CPDF_ApSettings mk = GetMK(FALSE);
+ return mk.GetColor(iColorType, csEntry);
+}
+FX_FLOAT CPDF_FormControl::GetOriginalColor(int index, CFX_ByteString csEntry)
+{
+ CPDF_ApSettings mk = GetMK(FALSE);
+ return mk.GetOriginalColor(index, csEntry);
+}
+void CPDF_FormControl::GetOriginalColor(int& iColorType, FX_FLOAT fc[4], CFX_ByteString csEntry)
+{
+ CPDF_ApSettings mk = GetMK(FALSE);
+ mk.GetOriginalColor(iColorType, fc, csEntry);
+}
+CFX_WideString CPDF_FormControl::GetCaption(CFX_ByteString csEntry)
+{
+ CPDF_ApSettings mk = GetMK(FALSE);
+ return mk.GetCaption(csEntry);
+}
+CPDF_Stream* CPDF_FormControl::GetIcon(CFX_ByteString csEntry)
+{
+ CPDF_ApSettings mk = GetMK(FALSE);
+ return mk.GetIcon(csEntry);
+}
+CPDF_IconFit CPDF_FormControl::GetIconFit()
+{
+ CPDF_ApSettings mk = GetMK(FALSE);
+ return mk.GetIconFit();
+}
+int CPDF_FormControl::GetTextPosition()
+{
+ CPDF_ApSettings mk = GetMK(FALSE);
+ return mk.GetTextPosition();
+}
+CPDF_Action CPDF_FormControl::GetAction()
+{
+ if (m_pWidgetDict == NULL) {
+ return NULL;
+ }
+ if (m_pWidgetDict->KeyExist("A")) {
+ return m_pWidgetDict->GetDict("A");
+ } else {
+ CPDF_Object* pObj = FPDF_GetFieldAttr(m_pField->m_pDict, "A");
+ if (pObj == NULL) {
+ return NULL;
+ }
+ return pObj->GetDict();
+ }
+}
+CPDF_AAction CPDF_FormControl::GetAdditionalAction()
+{
+ if (m_pWidgetDict == NULL) {
+ return NULL;
+ }
+ if (m_pWidgetDict->KeyExist("AA")) {
+ return m_pWidgetDict->GetDict("AA");
+ } else {
+ return m_pField->GetAdditionalAction();
+ }
+}
+CPDF_DefaultAppearance CPDF_FormControl::GetDefaultAppearance()
+{
+ if (m_pWidgetDict == NULL) {
+ return CFX_ByteString();
+ }
+ if (m_pWidgetDict->KeyExist("DA")) {
+ return m_pWidgetDict->GetString("DA");
+ } else {
+ CPDF_Object* pObj = FPDF_GetFieldAttr(m_pField->m_pDict, "DA");
+ if (pObj == NULL) {
+ return m_pField->m_pForm->GetDefaultAppearance();
+ }
+ return pObj->GetString();
+ }
+}
+CPDF_Font* CPDF_FormControl::GetDefaultControlFont()
+{
+ CPDF_DefaultAppearance cDA = GetDefaultAppearance();
+ CFX_ByteString csFontNameTag;
+ FX_FLOAT fFontSize;
+ cDA.GetFont(csFontNameTag, fFontSize);
+ if (csFontNameTag.IsEmpty()) {
+ return NULL;
+ }
+ CPDF_Object* pObj = FPDF_GetFieldAttr(m_pWidgetDict, "DR");
+ if (pObj != NULL && pObj->GetType() == PDFOBJ_DICTIONARY) {
+ CPDF_Dictionary* pFonts = ((CPDF_Dictionary*)pObj)->GetDict("Font");
+ if (pFonts != NULL) {
+ CPDF_Dictionary *pElement = pFonts->GetDict(csFontNameTag);
+ CPDF_Font *pFont = m_pField->m_pForm->m_pDocument->LoadFont(pElement);
+ if (pFont != NULL) {
+ return pFont;
+ }
+ }
+ }
+ CPDF_Font *pFont = m_pField->m_pForm->GetFormFont(csFontNameTag);
+ if (pFont != NULL) {
+ return pFont;
+ }
+ CPDF_Dictionary *pPageDict = m_pWidgetDict->GetDict("P");
+ pObj = FPDF_GetFieldAttr(pPageDict, "Resources");
+ if (pObj != NULL && pObj->GetType() == PDFOBJ_DICTIONARY) {
+ CPDF_Dictionary* pFonts = ((CPDF_Dictionary*)pObj)->GetDict("Font");
+ if (pFonts != NULL) {
+ CPDF_Dictionary *pElement = pFonts->GetDict(csFontNameTag);
+ CPDF_Font *pFont = m_pField->m_pForm->m_pDocument->LoadFont(pElement);
+ if (pFont != NULL) {
+ return pFont;
+ }
+ }
+ }
+ return NULL;
+}
+int CPDF_FormControl::GetControlAlignment()
+{
+ if (m_pWidgetDict == NULL) {
+ return 0;
+ }
+ if (m_pWidgetDict->KeyExist("Q")) {
+ return m_pWidgetDict->GetInteger("Q", 0);
+ } else {
+ CPDF_Object* pObj = FPDF_GetFieldAttr(m_pField->m_pDict, "Q");
+ if (pObj == NULL) {
+ return m_pField->m_pForm->GetFormAlignment();
+ }
+ return pObj->GetInteger();
+ }
+}
+FX_BOOL CPDF_ApSettings::HasMKEntry(FX_BSTR csEntry)
+{
+ if (m_pDict == NULL) {
+ return FALSE;
+ }
+ return m_pDict->KeyExist(csEntry);
+}
+int CPDF_ApSettings::GetRotation()
+{
+ if (m_pDict == NULL) {
+ return 0;
+ }
+ return m_pDict->GetInteger(FX_BSTRC("R"));
+}
+FX_ARGB CPDF_ApSettings::GetColor(int& iColorType, FX_BSTR csEntry)
+{
+ iColorType = COLORTYPE_TRANSPARENT;
+ if (m_pDict == NULL) {
+ return 0;
+ }
+ FX_ARGB color = 0;
+ CPDF_Array* pEntry = m_pDict->GetArray(csEntry);
+ if (pEntry == NULL) {
+ return color;
+ }
+ FX_DWORD dwCount = pEntry->GetCount();
+ if (dwCount == 1) {
+ iColorType = COLORTYPE_GRAY;
+ FX_FLOAT g = pEntry->GetNumber(0) * 255;
+ color = ArgbEncode(255, (int)g, (int)g, (int)g);
+ } else if (dwCount == 3) {
+ iColorType = COLORTYPE_RGB;
+ FX_FLOAT r = pEntry->GetNumber(0) * 255;
+ FX_FLOAT g = pEntry->GetNumber(1) * 255;
+ FX_FLOAT b = pEntry->GetNumber(2) * 255;
+ color = ArgbEncode(255, (int)r, (int)g, (int)b);
+ } else if (dwCount == 4) {
+ iColorType = COLORTYPE_CMYK;
+ FX_FLOAT c = pEntry->GetNumber(0);
+ FX_FLOAT m = pEntry->GetNumber(1);
+ FX_FLOAT y = pEntry->GetNumber(2);
+ FX_FLOAT k = pEntry->GetNumber(3);
+ FX_FLOAT r = 1.0f - FX_MIN(1.0f, c + k);
+ FX_FLOAT g = 1.0f - FX_MIN(1.0f, m + k);
+ FX_FLOAT b = 1.0f - FX_MIN(1.0f, y + k);
+ color = ArgbEncode(255, (int)(r * 255), (int)(g * 255), (int)(b * 255));
+ }
+ return color;
+}
+FX_FLOAT CPDF_ApSettings::GetOriginalColor(int index, FX_BSTR csEntry)
+{
+ if (m_pDict == NULL) {
+ return 0;
+ }
+ CPDF_Array* pEntry = m_pDict->GetArray(csEntry);
+ if (pEntry != NULL) {
+ return pEntry->GetNumber(index);
+ }
+ return 0;
+}
+void CPDF_ApSettings::GetOriginalColor(int& iColorType, FX_FLOAT fc[4], FX_BSTR csEntry)
+{
+ iColorType = COLORTYPE_TRANSPARENT;
+ for (int i = 0; i < 4; i ++) {
+ fc[i] = 0;
+ }
+ if (m_pDict == NULL) {
+ return;
+ }
+ CPDF_Array* pEntry = m_pDict->GetArray(csEntry);
+ if (pEntry == NULL) {
+ return;
+ }
+ FX_DWORD dwCount = pEntry->GetCount();
+ if (dwCount == 1) {
+ iColorType = COLORTYPE_GRAY;
+ fc[0] = pEntry->GetNumber(0);
+ } else if (dwCount == 3) {
+ iColorType = COLORTYPE_RGB;
+ fc[0] = pEntry->GetNumber(0);
+ fc[1] = pEntry->GetNumber(1);
+ fc[2] = pEntry->GetNumber(2);
+ } else if (dwCount == 4) {
+ iColorType = COLORTYPE_CMYK;
+ fc[0] = pEntry->GetNumber(0);
+ fc[1] = pEntry->GetNumber(1);
+ fc[2] = pEntry->GetNumber(2);
+ fc[3] = pEntry->GetNumber(3);
+ }
+}
+CFX_WideString CPDF_ApSettings::GetCaption(FX_BSTR csEntry)
+{
+ CFX_WideString csCaption;
+ if (m_pDict == NULL) {
+ return csCaption;
+ }
+ return m_pDict->GetUnicodeText(csEntry);
+}
+CPDF_Stream* CPDF_ApSettings::GetIcon(FX_BSTR csEntry)
+{
+ if (m_pDict == NULL) {
+ return NULL;
+ }
+ return m_pDict->GetStream(csEntry);
+}
+CPDF_IconFit CPDF_ApSettings::GetIconFit()
+{
+ if (m_pDict == NULL) {
+ return NULL;
+ }
+ return m_pDict->GetDict(FX_BSTRC("IF"));
+}
+int CPDF_ApSettings::GetTextPosition()
+{
+ if (m_pDict == NULL) {
+ return TEXTPOS_CAPTION;
+ }
+ return m_pDict->GetInteger(FX_BSTRC("TP"), TEXTPOS_CAPTION);
+}
diff --git a/core/src/fpdfdoc/doc_formfield.cpp b/core/src/fpdfdoc/doc_formfield.cpp
index d84a6b14be..548448696d 100644
--- a/core/src/fpdfdoc/doc_formfield.cpp
+++ b/core/src/fpdfdoc/doc_formfield.cpp
@@ -1,1095 +1,1095 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../include/fpdfdoc/fpdf_doc.h"
-CFX_WideString GetFullName(CPDF_Dictionary* pFieldDict);
-void SaveCheckedFieldStatus(CPDF_FormField* pField, CFX_ByteArray& statusArray);
-FX_BOOL PDF_FormField_IsUnison(CPDF_FormField *pField)
-{
- FX_BOOL bUnison = FALSE;
- if (pField->GetType() == CPDF_FormField::CheckBox) {
- bUnison = TRUE;
- } else {
- FX_DWORD dwFlags = pField->GetFieldFlags();
- bUnison = ((dwFlags & 0x2000000) != 0);
- }
- return bUnison;
-}
-CPDF_FormField::CPDF_FormField(CPDF_InterForm* pForm, CPDF_Dictionary* pDict)
-{
- m_pDict = pDict;
- m_Type = Unknown;
- m_pForm = pForm;
- m_pFont = NULL;
- m_FontSize = 0;
- SyncFieldFlags();
-}
-CPDF_FormField::~CPDF_FormField()
-{
-}
-void CPDF_FormField::SyncFieldFlags()
-{
- CFX_ByteString type_name = FPDF_GetFieldAttr(m_pDict, "FT")->GetString();
- FX_DWORD flags = FPDF_GetFieldAttr(m_pDict, "Ff")->GetInteger();
- m_Flags = 0;
- if (flags & 1) {
- m_Flags |= FORMFIELD_READONLY;
- }
- if (flags & 2) {
- m_Flags |= FORMFIELD_REQUIRED;
- }
- if (flags & 4) {
- m_Flags |= FORMFIELD_NOEXPORT;
- }
- if (type_name == "Btn") {
- if (flags & 0x8000) {
- m_Type = RadioButton;
- if (flags & 0x4000) {
- m_Flags |= FORMRADIO_NOTOGGLEOFF;
- }
- if (flags & 0x2000000) {
- m_Flags |= FORMRADIO_UNISON;
- }
- } else if (flags & 0x10000) {
- m_Type = PushButton;
- } else {
- m_Type = CheckBox;
- }
- } else if (type_name == "Tx") {
- if (flags & 0x100000) {
- m_Type = File;
- } else if (flags & 0x2000000) {
- m_Type = RichText;
- } else {
- m_Type = Text;
- if (flags & 0x1000) {
- m_Flags |= FORMTEXT_MULTILINE;
- }
- if (flags & 0x2000) {
- m_Flags |= FORMTEXT_PASSWORD;
- }
- if (flags & 0x800000) {
- m_Flags |= FORMTEXT_NOSCROLL;
- }
- if (flags & 0x100000) {
- m_Flags |= FORMTEXT_COMB;
- }
- }
- LoadDA();
- } else if (type_name == "Ch") {
- if (flags & 0x20000) {
- m_Type = ComboBox;
- if (flags & 0x40000) {
- m_Flags |= FORMCOMBO_EDIT;
- }
- } else {
- m_Type = ListBox;
- if (flags & 0x200000) {
- m_Flags |= FORMLIST_MULTISELECT;
- }
- }
- LoadDA();
- } else if (type_name == "Sig") {
- m_Type = Sign;
- }
-}
-CFX_WideString CPDF_FormField::GetFullName()
-{
- return ::GetFullName(m_pDict);
-}
-FX_BOOL CPDF_FormField::ResetField(FX_BOOL bNotify)
-{
- switch (m_Type) {
- case CPDF_FormField::CheckBox:
- case CPDF_FormField::RadioButton: {
- CFX_ByteArray statusArray;
- if (bNotify && m_pForm->m_pFormNotify != NULL) {
- SaveCheckedFieldStatus(this, statusArray);
- }
- int iCount = CountControls();
- if (iCount) {
- if (PDF_FormField_IsUnison(this)) {
- for(int i = 0; i < iCount; i++) {
- CheckControl(i, GetControl(i)->IsDefaultChecked(), FALSE);
- }
- } else {
- for (int i = 0; i < iCount; i ++) {
- CPDF_FormControl* pControl = GetControl(i);
- FX_BOOL bChecked = pControl->IsDefaultChecked();
- CheckControl(i, bChecked, FALSE);
- }
- }
- }
- if (bNotify && m_pForm->m_pFormNotify != NULL) {
- m_pForm->m_pFormNotify->AfterCheckedStatusChange(this, statusArray);
- }
- }
- break;
- case CPDF_FormField::ComboBox: {
- CFX_WideString csValue;
- ClearSelection();
- int iIndex = GetDefaultSelectedItem();
- if (iIndex >= 0) {
- csValue = GetOptionLabel(iIndex);
- }
- if (bNotify && m_pForm->m_pFormNotify != NULL) {
- int iRet = m_pForm->m_pFormNotify->BeforeValueChange(this, csValue);
- if (iRet < 0) {
- return FALSE;
- }
- }
- SetItemSelection(iIndex, TRUE);
- if (bNotify && m_pForm->m_pFormNotify != NULL) {
- m_pForm->m_pFormNotify->AfterValueChange(this);
- }
- }
- break;
- case CPDF_FormField::ListBox: {
- CFX_WideString csValue;
- ClearSelection();
- int iIndex = GetDefaultSelectedItem();
- if (iIndex >= 0) {
- csValue = GetOptionLabel(iIndex);
- }
- if (bNotify && m_pForm->m_pFormNotify != NULL) {
- int iRet = m_pForm->m_pFormNotify->BeforeSelectionChange(this, csValue);
- if (iRet < 0) {
- return FALSE;
- }
- }
- SetItemSelection(iIndex, TRUE);
- if (bNotify && m_pForm->m_pFormNotify != NULL) {
- m_pForm->m_pFormNotify->AfterSelectionChange(this);
- }
- }
- break;
- case CPDF_FormField::Text:
- case CPDF_FormField::RichText:
- case CPDF_FormField::File:
- default: {
- CPDF_Object* pDV = FPDF_GetFieldAttr(m_pDict, "DV");
- CFX_WideString csDValue;
- if (pDV != NULL) {
- csDValue = pDV->GetUnicodeText();
- }
- CPDF_Object* pV = FPDF_GetFieldAttr(m_pDict, "V");
- CFX_WideString csValue;
- if (pV != NULL) {
- csValue = pV->GetUnicodeText();
- }
- CPDF_Object* pRV = FPDF_GetFieldAttr(m_pDict, "RV");
- if (!pRV && (csDValue == csValue)) {
- return FALSE;
- }
- if (bNotify && m_pForm->m_pFormNotify != NULL) {
- int iRet = m_pForm->m_pFormNotify->BeforeValueChange(this, csDValue);
- if (iRet < 0) {
- return FALSE;
- }
- }
- if (pDV == NULL) {
- m_pDict->RemoveAt("V");
- m_pDict->RemoveAt("RV");
- } else {
- CPDF_Object* pClone = pDV->Clone();
- if (pClone == NULL) {
- return FALSE;
- }
- m_pDict->SetAt("V", pClone);
- if(pRV) {
- CPDF_Object* pCloneR = pDV->Clone();
- m_pDict->SetAt("RV", pCloneR);
- }
- }
- if (bNotify && m_pForm->m_pFormNotify != NULL) {
- m_pForm->m_pFormNotify->AfterValueChange(this);
- }
- m_pForm->m_bUpdated = TRUE;
- }
- break;
- }
- return TRUE;
-}
-int CPDF_FormField::GetControlIndex(const CPDF_FormControl* pControl)
-{
- if (pControl == NULL) {
- return -1;
- }
- int iCount = m_ControlList.GetSize();
- for (int i = 0; i < iCount; i ++) {
- CPDF_FormControl* pFind = (CPDF_FormControl*)m_ControlList.GetAt(i);
- if (pFind == pControl) {
- return i;
- }
- }
- return -1;
-}
-int CPDF_FormField::GetFieldType()
-{
- switch (m_Type) {
- case PushButton:
- return FIELDTYPE_PUSHBUTTON;
- case CheckBox:
- return FIELDTYPE_CHECKBOX;
- case RadioButton:
- return FIELDTYPE_RADIOBUTTON;
- case ComboBox:
- return FIELDTYPE_COMBOBOX;
- case ListBox:
- return FIELDTYPE_LISTBOX;
- case Text:
- case RichText:
- case File:
- return FIELDTYPE_TEXTFIELD;
- case Sign:
- return FIELDTYPE_SIGNATURE;
- default:
- break;
- }
- return FIELDTYPE_UNKNOWN;
-}
-CPDF_AAction CPDF_FormField::GetAdditionalAction()
-{
- CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "AA");
- if (pObj == NULL) {
- return NULL;
- }
- return pObj->GetDict();
-}
-CFX_WideString CPDF_FormField::GetAlternateName()
-{
- CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "TU");
- if (pObj == NULL) {
- return L"";
- }
- return pObj->GetUnicodeText();
-}
-CFX_WideString CPDF_FormField::GetMappingName()
-{
- CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "TM");
- if (pObj == NULL) {
- return L"";
- }
- return pObj->GetUnicodeText();
-}
-FX_DWORD CPDF_FormField::GetFieldFlags()
-{
- CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "Ff");
- if (pObj == NULL) {
- return 0;
- }
- return pObj->GetInteger();
-}
-CFX_ByteString CPDF_FormField::GetDefaultStyle()
-{
- CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "DS");
- if (pObj == NULL) {
- return "";
- }
- return pObj->GetString();
-}
-CFX_WideString CPDF_FormField::GetRichTextString()
-{
- CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "RV");
- if (pObj == NULL) {
- return L"";
- }
- return pObj->GetUnicodeText();
-}
-CFX_WideString CPDF_FormField::GetValue(FX_BOOL bDefault)
-{
- if (GetType() == CheckBox || GetType() == RadioButton) {
- return GetCheckValue(bDefault);
- }
- CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, bDefault ? "DV" : "V");
- if (pValue == NULL) {
- if (!bDefault) {
- if (m_Type == RichText) {
- pValue = FPDF_GetFieldAttr(m_pDict, "V");
- }
- if (pValue == NULL && m_Type != Text) {
- pValue = FPDF_GetFieldAttr(m_pDict, "DV");
- }
- }
- if (pValue == NULL) {
- return CFX_WideString();
- }
- }
- switch (pValue->GetType()) {
- case PDFOBJ_STRING:
- case PDFOBJ_STREAM:
- return pValue->GetUnicodeText();
- case PDFOBJ_ARRAY:
- pValue = ((CPDF_Array*)pValue)->GetElementValue(0);
- return pValue->GetUnicodeText();
- break;
- }
- return CFX_WideString();
-}
-CFX_WideString CPDF_FormField::GetValue()
-{
- return GetValue(FALSE);
-}
-CFX_WideString CPDF_FormField::GetDefaultValue()
-{
- return GetValue(TRUE);
-}
-FX_BOOL CPDF_FormField::SetValue(const CFX_WideString& value, FX_BOOL bDefault, FX_BOOL bNotify)
-{
- switch (m_Type) {
- case CheckBox:
- case RadioButton: {
- SetCheckValue(value, bDefault, bNotify);
- return TRUE;
- }
- case File:
- case RichText:
- case Text:
- case ComboBox: {
- CFX_WideString csValue = value;
- if (bNotify && m_pForm->m_pFormNotify != NULL) {
- int iRet = m_pForm->m_pFormNotify->BeforeValueChange(this, csValue);
- if (iRet < 0) {
- return FALSE;
- }
- }
- int iIndex = FindOptionValue(csValue);
- if (iIndex < 0) {
- CFX_ByteString bsEncodeText = PDF_EncodeText(csValue);
- m_pDict->SetAtString(bDefault ? "DV" : "V", bsEncodeText);
- if (m_Type == RichText && !bDefault) {
- m_pDict->SetAtString("RV", bsEncodeText);
- }
- m_pDict->RemoveAt("I");
- } else {
- m_pDict->SetAtString(bDefault ? "DV" : "V", PDF_EncodeText(csValue));
- if (bDefault) {
- } else {
- ClearSelection();
- SetItemSelection(iIndex, TRUE);
- }
- }
- if (bNotify && m_pForm->m_pFormNotify != NULL) {
- m_pForm->m_pFormNotify->AfterValueChange(this);
- }
- m_pForm->m_bUpdated = TRUE;
- }
- break;
- case ListBox: {
- int iIndex = FindOptionValue(value);
- if (iIndex < 0) {
- return FALSE;
- }
- if (bDefault && iIndex == GetDefaultSelectedItem()) {
- return FALSE;
- }
- if (bNotify && m_pForm->m_pFormNotify != NULL) {
- CFX_WideString csValue = value;
- int iRet = m_pForm->m_pFormNotify->BeforeSelectionChange(this, csValue);
- if (iRet < 0) {
- return FALSE;
- }
- }
- if (bDefault) {
- } else {
- ClearSelection();
- SetItemSelection(iIndex, TRUE);
- }
- if (bNotify && m_pForm->m_pFormNotify != NULL) {
- m_pForm->m_pFormNotify->AfterSelectionChange(this);
- }
- m_pForm->m_bUpdated = TRUE;
- break;
- }
- default:
- break;
- }
- if (CPDF_InterForm::m_bUpdateAP) {
- UpdateAP(NULL);
- }
- return TRUE;
-}
-FX_BOOL CPDF_FormField::SetValue(const CFX_WideString& value, FX_BOOL bNotify)
-{
- return SetValue(value, FALSE, bNotify);
-}
-int CPDF_FormField::GetMaxLen()
-{
- CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "MaxLen");
- if (pObj == NULL) {
- int iCount = m_ControlList.GetSize();
- for (int i = 0; i < iCount; i ++) {
- CPDF_FormControl* pControl = (CPDF_FormControl*)m_ControlList.GetAt(i);
- if (pControl == NULL) {
- continue;
- }
- CPDF_Dictionary* pWidgetDict = pControl->m_pWidgetDict;
- if (pWidgetDict->KeyExist("MaxLen")) {
- return pWidgetDict->GetInteger("MaxLen");
- }
- }
- return 0;
- }
- return pObj->GetInteger();
-}
-int CPDF_FormField::CountSelectedItems()
-{
- CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, "V");
- if (pValue == NULL) {
- pValue = FPDF_GetFieldAttr(m_pDict, "I");
- if (pValue == NULL) {
- return 0;
- }
- }
- if (pValue->GetType() == PDFOBJ_STRING) {
- if (pValue->GetString().IsEmpty()) {
- return 0;
- }
- return 1;
- }
- if (pValue->GetType() == PDFOBJ_NUMBER) {
- if (pValue->GetString().IsEmpty()) {
- return 0;
- }
- return 1;
- }
- if (pValue->GetType() != PDFOBJ_ARRAY) {
- return 0;
- }
- return ((CPDF_Array*)pValue)->GetCount();
-}
-int CPDF_FormField::GetSelectedIndex(int index)
-{
- CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, "V");
- if (pValue == NULL) {
- pValue = FPDF_GetFieldAttr(m_pDict, "I");
- if (pValue == NULL) {
- return -1;
- }
- }
- CFX_WideString sel_value;
- if (pValue->GetType() == PDFOBJ_STRING) {
- if (index != 0) {
- return -1;
- }
- sel_value = pValue->GetUnicodeText();
- } else if (pValue->GetType() == PDFOBJ_NUMBER) {
- return pValue->GetInteger();
- } else {
- if (pValue->GetType() != PDFOBJ_ARRAY) {
- return -1;
- }
- if (index < 0) {
- return -1;
- }
- sel_value = ((CPDF_Array*)pValue)->GetElementValue(index)->GetUnicodeText();
- }
- if (index < CountSelectedOptions()) {
- int iOptIndex = GetSelectedOptionIndex(index);
- CFX_WideString csOpt = GetOptionValue(iOptIndex);
- if (csOpt == sel_value) {
- return iOptIndex;
- }
- }
- int nOpts = CountOptions();
- for (int i = 0; i < nOpts; i ++) {
- if (sel_value == GetOptionValue(i)) {
- return i;
- }
- }
- return -1;
-}
-FX_BOOL CPDF_FormField::ClearSelection(FX_BOOL bNotify)
-{
- if (bNotify && m_pForm->m_pFormNotify != NULL) {
- int iRet = 0;
- CFX_WideString csValue;
- int iIndex = GetSelectedIndex(0);
- if (iIndex >= 0) {
- csValue = GetOptionLabel(iIndex);
- }
- if (GetType() == ListBox) {
- iRet = m_pForm->m_pFormNotify->BeforeSelectionChange(this, csValue);
- }
- if (GetType() == ComboBox) {
- iRet = m_pForm->m_pFormNotify->BeforeValueChange(this, csValue);
- }
- if (iRet < 0) {
- return FALSE;
- }
- }
- m_pDict->RemoveAt("V");
- m_pDict->RemoveAt("I");
- if (bNotify && m_pForm->m_pFormNotify != NULL) {
- if (GetType() == ListBox) {
- m_pForm->m_pFormNotify->AfterSelectionChange(this);
- }
- if (GetType() == ComboBox) {
- m_pForm->m_pFormNotify->AfterValueChange(this);
- }
- }
- if (CPDF_InterForm::m_bUpdateAP) {
- UpdateAP(NULL);
- }
- m_pForm->m_bUpdated = TRUE;
- return TRUE;
-}
-FX_BOOL CPDF_FormField::IsItemSelected(int index)
-{
- ASSERT(GetType() == ComboBox || GetType() == ListBox);
- if (index < 0 || index >= CountOptions()) {
- return FALSE;
- }
- if (IsOptionSelected(index)) {
- return TRUE;
- }
- CFX_WideString opt_value = GetOptionValue(index);
- CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, "V");
- if (pValue == NULL) {
- pValue = FPDF_GetFieldAttr(m_pDict, "I");
- if (pValue == NULL) {
- return FALSE;
- }
- }
- if (pValue->GetType() == PDFOBJ_STRING) {
- if (pValue->GetUnicodeText() == opt_value) {
- return TRUE;
- }
- return FALSE;
- }
- if (pValue->GetType() == PDFOBJ_NUMBER) {
- if (pValue->GetString().IsEmpty()) {
- return FALSE;
- }
- if (pValue->GetInteger() == index) {
- return TRUE;
- }
- return FALSE;
- }
- if (pValue->GetType() != PDFOBJ_ARRAY) {
- return FALSE;
- }
- CPDF_Array* pArray = (CPDF_Array*)pValue;
- int iPos = -1;
- for (int j = 0; j < CountSelectedOptions(); j ++) {
- if (GetSelectedOptionIndex(j) == index) {
- iPos = j;
- break;
- }
- }
- for (FX_DWORD i = 0; i < pArray->GetCount(); i ++)
- if (pArray->GetElementValue(i)->GetUnicodeText() == opt_value && (int)i == iPos) {
- return TRUE;
- }
- return FALSE;
-}
-FX_BOOL CPDF_FormField::SetItemSelection(int index, FX_BOOL bSelected, FX_BOOL bNotify)
-{
- ASSERT(GetType() == ComboBox || GetType() == ListBox);
- if (index < 0 || index >= CountOptions()) {
- return FALSE;
- }
- CFX_WideString opt_value = GetOptionValue(index);
- if (bNotify && m_pForm->m_pFormNotify != NULL) {
- int iRet = 0;
- if (GetType() == ListBox) {
- iRet = m_pForm->m_pFormNotify->BeforeSelectionChange(this, opt_value);
- }
- if (GetType() == ComboBox) {
- iRet = m_pForm->m_pFormNotify->BeforeValueChange(this, opt_value);
- }
- if (iRet < 0) {
- return FALSE;
- }
- }
- if (!bSelected) {
- CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, "V");
- if (pValue != NULL) {
- if (m_Type == ListBox) {
- SelectOption(index, FALSE);
- if (pValue->GetType() == PDFOBJ_STRING) {
- if (pValue->GetUnicodeText() == opt_value) {
- m_pDict->RemoveAt("V");
- }
- } else if (pValue->GetType() == PDFOBJ_ARRAY) {
- CPDF_Array* pArray = CPDF_Array::Create();
- if (pArray == NULL) {
- return FALSE;
- }
- int iCount = CountOptions();
- for (int i = 0; i < iCount; i ++) {
- if (i != index) {
- if (IsItemSelected(i)) {
- opt_value = GetOptionValue(i);
- pArray->AddString(PDF_EncodeText(opt_value));
- }
- }
- }
- if (pArray->GetCount() < 1) {
- pArray->Release();
- } else {
- m_pDict->SetAt("V", pArray);
- }
- }
- } else if (m_Type == ComboBox) {
- m_pDict->RemoveAt("V");
- m_pDict->RemoveAt("I");
- }
- }
- } else {
- if (m_Type == ListBox) {
- SelectOption(index, TRUE);
- if (!(m_Flags & FORMLIST_MULTISELECT)) {
- m_pDict->SetAtString("V", PDF_EncodeText(opt_value, opt_value.GetLength()));
- } else {
- CPDF_Array* pArray = CPDF_Array::Create();
- if (pArray == NULL) {
- return FALSE;
- }
- FX_BOOL bSelected;
- int iCount = CountOptions();
- for (int i = 0; i < iCount; i ++) {
- if (i != index) {
- bSelected = IsItemSelected(i);
- } else {
- bSelected = TRUE;
- }
- if (bSelected) {
- opt_value = GetOptionValue(i);
- pArray->AddString(PDF_EncodeText(opt_value));
- }
- }
- m_pDict->SetAt("V", pArray);
- }
- } else if (m_Type == ComboBox) {
- m_pDict->SetAtString("V", PDF_EncodeText(opt_value, opt_value.GetLength()));
- CPDF_Array* pI = CPDF_Array::Create();
- if (pI == NULL) {
- return FALSE;
- }
- pI->AddInteger(index);
- m_pDict->SetAt("I", pI);
- }
- }
- if (bNotify && m_pForm->m_pFormNotify != NULL) {
- if (GetType() == ListBox) {
- m_pForm->m_pFormNotify->AfterSelectionChange(this);
- }
- if (GetType() == ComboBox) {
- m_pForm->m_pFormNotify->AfterValueChange(this);
- }
- }
- if (CPDF_InterForm::m_bUpdateAP) {
- UpdateAP(NULL);
- }
- m_pForm->m_bUpdated = TRUE;
- return TRUE;
-}
-FX_BOOL CPDF_FormField::IsItemDefaultSelected(int index)
-{
- ASSERT(GetType() == ComboBox || GetType() == ListBox);
- if (index < 0 || index >= CountOptions()) {
- return FALSE;
- }
- int iDVIndex = GetDefaultSelectedItem();
- if (iDVIndex < 0) {
- return FALSE;
- }
- return (iDVIndex == index);
-}
-int CPDF_FormField::GetDefaultSelectedItem()
-{
- ASSERT(GetType() == ComboBox || GetType() == ListBox);
- CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, "DV");
- if (pValue == NULL) {
- return -1;
- }
- CFX_WideString csDV = pValue->GetUnicodeText();
- if (csDV.IsEmpty()) {
- return -1;
- }
- int iCount = CountOptions();
- for (int i = 0; i < iCount; i ++) {
- if (csDV == GetOptionValue(i)) {
- return i;
- }
- }
- return -1;
-}
-void CPDF_FormField::UpdateAP(CPDF_FormControl* pControl)
-{
- if (m_Type == PushButton) {
- return;
- }
- if (m_Type == RadioButton || m_Type == CheckBox) {
- return;
- }
- if (!m_pForm->m_bGenerateAP) {
- return;
- }
- for (int i = 0; i < CountControls(); i ++) {
- CPDF_FormControl* pControl = GetControl(i);
- FPDF_GenerateAP(m_pForm->m_pDocument, pControl->m_pWidgetDict);
- }
-}
-int CPDF_FormField::CountOptions()
-{
- CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, "Opt");
- if (pValue == NULL || pValue->GetType() != PDFOBJ_ARRAY) {
- return 0;
- }
- return ((CPDF_Array*)pValue)->GetCount();
-}
-CFX_WideString CPDF_FormField::GetOptionText(int index, int sub_index)
-{
- CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, "Opt");
- if (pValue == NULL || pValue->GetType() != PDFOBJ_ARRAY) {
- return CFX_WideString();
- }
- CPDF_Object* pOption = ((CPDF_Array*)pValue)->GetElementValue(index);
- if (pOption == NULL) {
- return CFX_WideString();
- }
- if (pOption->GetType() == PDFOBJ_ARRAY) {
- pOption = ((CPDF_Array*)pOption)->GetElementValue(sub_index);
- }
- if (pOption == NULL || pOption->GetType() != PDFOBJ_STRING) {
- return CFX_WideString();
- }
- return ((CPDF_String*)pOption)->GetUnicodeText();
-}
-CFX_WideString CPDF_FormField::GetOptionLabel(int index)
-{
- return GetOptionText(index, 1);
-}
-CFX_WideString CPDF_FormField::GetOptionValue(int index)
-{
- return GetOptionText(index, 0);
-}
-int CPDF_FormField::FindOption(CFX_WideString csOptLabel)
-{
- int iCount = CountOptions();
- for (int i = 0; i < iCount; i ++) {
- CFX_WideString csValue = GetOptionValue(i);
- if (csValue == csOptLabel) {
- return i;
- }
- }
- return -1;
-}
-int CPDF_FormField::FindOptionValue(FX_LPCWSTR csOptValue, int iStartIndex)
-{
- if (iStartIndex < 0) {
- iStartIndex = 0;
- }
- int iCount = CountOptions();
- for (; iStartIndex < iCount; iStartIndex ++) {
- CFX_WideString csValue = GetOptionValue(iStartIndex);
- if (csValue == csOptValue) {
- return iStartIndex;
- }
- }
- return -1;
-}
-FX_BOOL CPDF_FormField::CheckControl(int iControlIndex, FX_BOOL bChecked, FX_BOOL bNotify)
-{
- ASSERT(GetType() == CheckBox || GetType() == RadioButton);
- CPDF_FormControl* pControl = GetControl(iControlIndex);
- if (pControl == NULL) {
- return FALSE;
- }
- if (!bChecked && pControl->IsChecked() == bChecked) {
- return FALSE;
- }
- CFX_ByteArray statusArray;
- if (bNotify && m_pForm->m_pFormNotify != NULL) {
- SaveCheckedFieldStatus(this, statusArray);
- }
- CFX_WideString csWExport = pControl->GetExportValue();
- CFX_ByteString csBExport = PDF_EncodeText(csWExport);
- int iCount = CountControls();
- FX_BOOL bUnison = PDF_FormField_IsUnison(this);
- for (int i = 0; i < iCount; i ++) {
- CPDF_FormControl* pCtrl = GetControl(i);
- if (bUnison) {
- CFX_WideString csEValue = pCtrl->GetExportValue();
- if (csEValue == csWExport) {
- if (pCtrl->GetOnStateName() == pControl->GetOnStateName()) {
- pCtrl->CheckControl(bChecked);
- } else if (bChecked) {
- pCtrl->CheckControl(FALSE);
- }
- } else if (bChecked) {
- pCtrl->CheckControl(FALSE);
- }
- } else {
- if (i == iControlIndex) {
- pCtrl->CheckControl(bChecked);
- } else if (bChecked) {
- pCtrl->CheckControl(FALSE);
- }
- }
- }
- CPDF_Object* pOpt = FPDF_GetFieldAttr(m_pDict, "Opt");
- if (pOpt == NULL || pOpt->GetType() != PDFOBJ_ARRAY) {
- if (bChecked) {
- m_pDict->SetAtName("V", csBExport);
- } else {
- CFX_ByteString csV;
- CPDF_Object* pV = FPDF_GetFieldAttr(m_pDict, "V");
- if (pV != NULL) {
- csV = pV->GetString();
- }
- if (csV == csBExport) {
- m_pDict->SetAtName("V", "Off");
- }
- }
- } else if (bChecked) {
- CFX_ByteString csIndex;
- csIndex.Format("%d", iControlIndex);
- m_pDict->SetAtName("V", csIndex);
- }
- if (bNotify && m_pForm->m_pFormNotify != NULL) {
- m_pForm->m_pFormNotify->AfterCheckedStatusChange(this, statusArray);
- }
- m_pForm->m_bUpdated = TRUE;
- return TRUE;
-}
-CFX_WideString CPDF_FormField::GetCheckValue(FX_BOOL bDefault)
-{
- ASSERT(GetType() == CheckBox || GetType() == RadioButton);
- CFX_WideString csExport = L"Off";
- FX_BOOL bChecked;
- int iCount = CountControls();
- for (int i = 0; i < iCount; i ++) {
- CPDF_FormControl* pControl = GetControl(i);
- if (bDefault) {
- bChecked = pControl->IsDefaultChecked();
- } else {
- bChecked = pControl->IsChecked();
- }
- if (bChecked) {
- csExport = pControl->GetExportValue();
- break;
- }
- }
- return csExport;
-}
-FX_BOOL CPDF_FormField::SetCheckValue(const CFX_WideString& value, FX_BOOL bDefault, FX_BOOL bNotify)
-{
- ASSERT(GetType() == CheckBox || GetType() == RadioButton);
- CFX_ByteArray statusArray;
- if (bNotify && m_pForm->m_pFormNotify != NULL) {
- SaveCheckedFieldStatus(this, statusArray);
- }
- int iCount = CountControls();
- for (int i = 0; i < iCount; i ++) {
- CPDF_FormControl* pControl = GetControl(i);
- CFX_WideString csExport = pControl->GetExportValue();
- if (csExport == value) {
- if (bDefault) {
- } else {
- CheckControl(GetControlIndex(pControl), TRUE);
- }
- break;
- } else {
- if (bDefault) {
- } else {
- CheckControl(GetControlIndex(pControl), FALSE);
- }
- }
- }
- if (bNotify && m_pForm->m_pFormNotify != NULL) {
- m_pForm->m_pFormNotify->AfterCheckedStatusChange(this, statusArray);
- }
- m_pForm->m_bUpdated = TRUE;
- return TRUE;
-}
-int CPDF_FormField::GetTopVisibleIndex()
-{
- CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "TI");
- if (pObj == NULL) {
- return 0;
- }
- return pObj->GetInteger();
-}
-int CPDF_FormField::CountSelectedOptions()
-{
- CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "I");
- if (pObj == NULL) {
- return 0;
- }
- CPDF_Array* pArray = pObj->GetArray();
- if (pArray == NULL) {
- return 0;
- }
- return (int)pArray->GetCount();
-}
-int CPDF_FormField::GetSelectedOptionIndex(int index)
-{
- CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "I");
- if (pObj == NULL) {
- return -1;
- }
- CPDF_Array* pArray = pObj->GetArray();
- if (pArray == NULL) {
- return -1;
- }
- int iCount = (int)pArray->GetCount();
- if (iCount > 0 && index < iCount) {
- return pArray->GetInteger(index);
- }
- return -1;
-}
-FX_BOOL CPDF_FormField::IsOptionSelected(int iOptIndex)
-{
- CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "I");
- if (pObj == NULL) {
- return FALSE;
- }
- CPDF_Array* pArray = pObj->GetArray();
- if (pArray == NULL) {
- return FALSE;
- }
- int iCount = (int)pArray->GetCount();
- for (int i = 0; i < iCount; i ++) {
- if (pArray->GetInteger(i) == iOptIndex) {
- return TRUE;
- }
- }
- return FALSE;
-}
-FX_BOOL CPDF_FormField::SelectOption(int iOptIndex, FX_BOOL bSelected, FX_BOOL bNotify)
-{
- CPDF_Array* pArray = m_pDict->GetArray("I");
- if (pArray == NULL) {
- if (!bSelected) {
- return TRUE;
- }
- pArray = CPDF_Array::Create();
- if (pArray == NULL) {
- return FALSE;
- }
- m_pDict->SetAt("I", pArray);
- }
- FX_BOOL bReturn = FALSE;
- for (int i = 0; i < (int)pArray->GetCount(); i ++) {
- int iFind = pArray->GetInteger(i);
- if (iFind == iOptIndex) {
- if (bSelected) {
- return TRUE;
- }
- if (bNotify && m_pForm->m_pFormNotify != NULL) {
- int iRet = 0;
- CFX_WideString csValue = GetOptionLabel(iOptIndex);
- if (GetType() == ListBox) {
- iRet = m_pForm->m_pFormNotify->BeforeSelectionChange(this, csValue);
- }
- if (GetType() == ComboBox) {
- iRet = m_pForm->m_pFormNotify->BeforeValueChange(this, csValue);
- }
- if (iRet < 0) {
- return FALSE;
- }
- }
- pArray->RemoveAt(i);
- bReturn = TRUE;
- break;
- } else if (iFind > iOptIndex) {
- if (!bSelected) {
- continue;
- }
- if (bNotify && m_pForm->m_pFormNotify != NULL) {
- int iRet = 0;
- CFX_WideString csValue = GetOptionLabel(iOptIndex);
- if (GetType() == ListBox) {
- iRet = m_pForm->m_pFormNotify->BeforeSelectionChange(this, csValue);
- }
- if (GetType() == ComboBox) {
- iRet = m_pForm->m_pFormNotify->BeforeValueChange(this, csValue);
- }
- if (iRet < 0) {
- return FALSE;
- }
- }
- CPDF_Number* pNum = CPDF_Number::Create(iOptIndex);
- if (pNum == NULL) {
- return FALSE;
- }
- pArray->InsertAt(i, pNum);
- bReturn = TRUE;
- break;
- }
- }
- if (!bReturn) {
- if (bSelected) {
- pArray->AddInteger(iOptIndex);
- }
- if (pArray->GetCount() == 0) {
- m_pDict->RemoveAt("I");
- }
- }
- if (bNotify && m_pForm->m_pFormNotify != NULL) {
- if (GetType() == ListBox) {
- m_pForm->m_pFormNotify->AfterSelectionChange(this);
- }
- if (GetType() == ComboBox) {
- m_pForm->m_pFormNotify->AfterValueChange(this);
- }
- }
- m_pForm->m_bUpdated = TRUE;
- return TRUE;
-}
-FX_BOOL CPDF_FormField::ClearSelectedOptions(FX_BOOL bNotify)
-{
- if (bNotify && m_pForm->m_pFormNotify != NULL) {
- int iRet = 0;
- CFX_WideString csValue;
- int iIndex = GetSelectedIndex(0);
- if (iIndex >= 0) {
- csValue = GetOptionLabel(iIndex);
- }
- if (GetType() == ListBox) {
- iRet = m_pForm->m_pFormNotify->BeforeSelectionChange(this, csValue);
- }
- if (GetType() == ComboBox) {
- iRet = m_pForm->m_pFormNotify->BeforeValueChange(this, csValue);
- }
- if (iRet < 0) {
- return FALSE;
- }
- }
- m_pDict->RemoveAt("I");
- if (bNotify && m_pForm->m_pFormNotify != NULL) {
- if (GetType() == ListBox) {
- m_pForm->m_pFormNotify->AfterSelectionChange(this);
- }
- if (GetType() == ComboBox) {
- m_pForm->m_pFormNotify->AfterValueChange(this);
- }
- }
- m_pForm->m_bUpdated = TRUE;
- return TRUE;
-}
-void CPDF_FormField::LoadDA()
-{
- CFX_ByteString DA = FPDF_GetFieldAttr(m_pDict, "DA")->GetString();
- if (DA.IsEmpty()) {
- DA = m_pForm->m_pFormDict->GetString("DA");
- }
- if (DA.IsEmpty()) {
- return;
- }
- CPDF_SimpleParser syntax(DA);
- syntax.FindTagParam("Tf", 2);
- CFX_ByteString font_name = syntax.GetWord();
- CPDF_Dictionary* pFontDict = m_pForm->m_pFormDict->GetDict("DR")->GetDict("Font")->GetDict(font_name);
- if (pFontDict == NULL) {
- return;
- }
- m_pFont = m_pForm->m_pDocument->LoadFont(pFontDict);
- m_FontSize = FX_atof(syntax.GetWord());
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fpdfdoc/fpdf_doc.h"
+CFX_WideString GetFullName(CPDF_Dictionary* pFieldDict);
+void SaveCheckedFieldStatus(CPDF_FormField* pField, CFX_ByteArray& statusArray);
+FX_BOOL PDF_FormField_IsUnison(CPDF_FormField *pField)
+{
+ FX_BOOL bUnison = FALSE;
+ if (pField->GetType() == CPDF_FormField::CheckBox) {
+ bUnison = TRUE;
+ } else {
+ FX_DWORD dwFlags = pField->GetFieldFlags();
+ bUnison = ((dwFlags & 0x2000000) != 0);
+ }
+ return bUnison;
+}
+CPDF_FormField::CPDF_FormField(CPDF_InterForm* pForm, CPDF_Dictionary* pDict)
+{
+ m_pDict = pDict;
+ m_Type = Unknown;
+ m_pForm = pForm;
+ m_pFont = NULL;
+ m_FontSize = 0;
+ SyncFieldFlags();
+}
+CPDF_FormField::~CPDF_FormField()
+{
+}
+void CPDF_FormField::SyncFieldFlags()
+{
+ CFX_ByteString type_name = FPDF_GetFieldAttr(m_pDict, "FT")->GetString();
+ FX_DWORD flags = FPDF_GetFieldAttr(m_pDict, "Ff")->GetInteger();
+ m_Flags = 0;
+ if (flags & 1) {
+ m_Flags |= FORMFIELD_READONLY;
+ }
+ if (flags & 2) {
+ m_Flags |= FORMFIELD_REQUIRED;
+ }
+ if (flags & 4) {
+ m_Flags |= FORMFIELD_NOEXPORT;
+ }
+ if (type_name == "Btn") {
+ if (flags & 0x8000) {
+ m_Type = RadioButton;
+ if (flags & 0x4000) {
+ m_Flags |= FORMRADIO_NOTOGGLEOFF;
+ }
+ if (flags & 0x2000000) {
+ m_Flags |= FORMRADIO_UNISON;
+ }
+ } else if (flags & 0x10000) {
+ m_Type = PushButton;
+ } else {
+ m_Type = CheckBox;
+ }
+ } else if (type_name == "Tx") {
+ if (flags & 0x100000) {
+ m_Type = File;
+ } else if (flags & 0x2000000) {
+ m_Type = RichText;
+ } else {
+ m_Type = Text;
+ if (flags & 0x1000) {
+ m_Flags |= FORMTEXT_MULTILINE;
+ }
+ if (flags & 0x2000) {
+ m_Flags |= FORMTEXT_PASSWORD;
+ }
+ if (flags & 0x800000) {
+ m_Flags |= FORMTEXT_NOSCROLL;
+ }
+ if (flags & 0x100000) {
+ m_Flags |= FORMTEXT_COMB;
+ }
+ }
+ LoadDA();
+ } else if (type_name == "Ch") {
+ if (flags & 0x20000) {
+ m_Type = ComboBox;
+ if (flags & 0x40000) {
+ m_Flags |= FORMCOMBO_EDIT;
+ }
+ } else {
+ m_Type = ListBox;
+ if (flags & 0x200000) {
+ m_Flags |= FORMLIST_MULTISELECT;
+ }
+ }
+ LoadDA();
+ } else if (type_name == "Sig") {
+ m_Type = Sign;
+ }
+}
+CFX_WideString CPDF_FormField::GetFullName()
+{
+ return ::GetFullName(m_pDict);
+}
+FX_BOOL CPDF_FormField::ResetField(FX_BOOL bNotify)
+{
+ switch (m_Type) {
+ case CPDF_FormField::CheckBox:
+ case CPDF_FormField::RadioButton: {
+ CFX_ByteArray statusArray;
+ if (bNotify && m_pForm->m_pFormNotify != NULL) {
+ SaveCheckedFieldStatus(this, statusArray);
+ }
+ int iCount = CountControls();
+ if (iCount) {
+ if (PDF_FormField_IsUnison(this)) {
+ for(int i = 0; i < iCount; i++) {
+ CheckControl(i, GetControl(i)->IsDefaultChecked(), FALSE);
+ }
+ } else {
+ for (int i = 0; i < iCount; i ++) {
+ CPDF_FormControl* pControl = GetControl(i);
+ FX_BOOL bChecked = pControl->IsDefaultChecked();
+ CheckControl(i, bChecked, FALSE);
+ }
+ }
+ }
+ if (bNotify && m_pForm->m_pFormNotify != NULL) {
+ m_pForm->m_pFormNotify->AfterCheckedStatusChange(this, statusArray);
+ }
+ }
+ break;
+ case CPDF_FormField::ComboBox: {
+ CFX_WideString csValue;
+ ClearSelection();
+ int iIndex = GetDefaultSelectedItem();
+ if (iIndex >= 0) {
+ csValue = GetOptionLabel(iIndex);
+ }
+ if (bNotify && m_pForm->m_pFormNotify != NULL) {
+ int iRet = m_pForm->m_pFormNotify->BeforeValueChange(this, csValue);
+ if (iRet < 0) {
+ return FALSE;
+ }
+ }
+ SetItemSelection(iIndex, TRUE);
+ if (bNotify && m_pForm->m_pFormNotify != NULL) {
+ m_pForm->m_pFormNotify->AfterValueChange(this);
+ }
+ }
+ break;
+ case CPDF_FormField::ListBox: {
+ CFX_WideString csValue;
+ ClearSelection();
+ int iIndex = GetDefaultSelectedItem();
+ if (iIndex >= 0) {
+ csValue = GetOptionLabel(iIndex);
+ }
+ if (bNotify && m_pForm->m_pFormNotify != NULL) {
+ int iRet = m_pForm->m_pFormNotify->BeforeSelectionChange(this, csValue);
+ if (iRet < 0) {
+ return FALSE;
+ }
+ }
+ SetItemSelection(iIndex, TRUE);
+ if (bNotify && m_pForm->m_pFormNotify != NULL) {
+ m_pForm->m_pFormNotify->AfterSelectionChange(this);
+ }
+ }
+ break;
+ case CPDF_FormField::Text:
+ case CPDF_FormField::RichText:
+ case CPDF_FormField::File:
+ default: {
+ CPDF_Object* pDV = FPDF_GetFieldAttr(m_pDict, "DV");
+ CFX_WideString csDValue;
+ if (pDV != NULL) {
+ csDValue = pDV->GetUnicodeText();
+ }
+ CPDF_Object* pV = FPDF_GetFieldAttr(m_pDict, "V");
+ CFX_WideString csValue;
+ if (pV != NULL) {
+ csValue = pV->GetUnicodeText();
+ }
+ CPDF_Object* pRV = FPDF_GetFieldAttr(m_pDict, "RV");
+ if (!pRV && (csDValue == csValue)) {
+ return FALSE;
+ }
+ if (bNotify && m_pForm->m_pFormNotify != NULL) {
+ int iRet = m_pForm->m_pFormNotify->BeforeValueChange(this, csDValue);
+ if (iRet < 0) {
+ return FALSE;
+ }
+ }
+ if (pDV == NULL) {
+ m_pDict->RemoveAt("V");
+ m_pDict->RemoveAt("RV");
+ } else {
+ CPDF_Object* pClone = pDV->Clone();
+ if (pClone == NULL) {
+ return FALSE;
+ }
+ m_pDict->SetAt("V", pClone);
+ if(pRV) {
+ CPDF_Object* pCloneR = pDV->Clone();
+ m_pDict->SetAt("RV", pCloneR);
+ }
+ }
+ if (bNotify && m_pForm->m_pFormNotify != NULL) {
+ m_pForm->m_pFormNotify->AfterValueChange(this);
+ }
+ m_pForm->m_bUpdated = TRUE;
+ }
+ break;
+ }
+ return TRUE;
+}
+int CPDF_FormField::GetControlIndex(const CPDF_FormControl* pControl)
+{
+ if (pControl == NULL) {
+ return -1;
+ }
+ int iCount = m_ControlList.GetSize();
+ for (int i = 0; i < iCount; i ++) {
+ CPDF_FormControl* pFind = (CPDF_FormControl*)m_ControlList.GetAt(i);
+ if (pFind == pControl) {
+ return i;
+ }
+ }
+ return -1;
+}
+int CPDF_FormField::GetFieldType()
+{
+ switch (m_Type) {
+ case PushButton:
+ return FIELDTYPE_PUSHBUTTON;
+ case CheckBox:
+ return FIELDTYPE_CHECKBOX;
+ case RadioButton:
+ return FIELDTYPE_RADIOBUTTON;
+ case ComboBox:
+ return FIELDTYPE_COMBOBOX;
+ case ListBox:
+ return FIELDTYPE_LISTBOX;
+ case Text:
+ case RichText:
+ case File:
+ return FIELDTYPE_TEXTFIELD;
+ case Sign:
+ return FIELDTYPE_SIGNATURE;
+ default:
+ break;
+ }
+ return FIELDTYPE_UNKNOWN;
+}
+CPDF_AAction CPDF_FormField::GetAdditionalAction()
+{
+ CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "AA");
+ if (pObj == NULL) {
+ return NULL;
+ }
+ return pObj->GetDict();
+}
+CFX_WideString CPDF_FormField::GetAlternateName()
+{
+ CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "TU");
+ if (pObj == NULL) {
+ return L"";
+ }
+ return pObj->GetUnicodeText();
+}
+CFX_WideString CPDF_FormField::GetMappingName()
+{
+ CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "TM");
+ if (pObj == NULL) {
+ return L"";
+ }
+ return pObj->GetUnicodeText();
+}
+FX_DWORD CPDF_FormField::GetFieldFlags()
+{
+ CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "Ff");
+ if (pObj == NULL) {
+ return 0;
+ }
+ return pObj->GetInteger();
+}
+CFX_ByteString CPDF_FormField::GetDefaultStyle()
+{
+ CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "DS");
+ if (pObj == NULL) {
+ return "";
+ }
+ return pObj->GetString();
+}
+CFX_WideString CPDF_FormField::GetRichTextString()
+{
+ CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "RV");
+ if (pObj == NULL) {
+ return L"";
+ }
+ return pObj->GetUnicodeText();
+}
+CFX_WideString CPDF_FormField::GetValue(FX_BOOL bDefault)
+{
+ if (GetType() == CheckBox || GetType() == RadioButton) {
+ return GetCheckValue(bDefault);
+ }
+ CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, bDefault ? "DV" : "V");
+ if (pValue == NULL) {
+ if (!bDefault) {
+ if (m_Type == RichText) {
+ pValue = FPDF_GetFieldAttr(m_pDict, "V");
+ }
+ if (pValue == NULL && m_Type != Text) {
+ pValue = FPDF_GetFieldAttr(m_pDict, "DV");
+ }
+ }
+ if (pValue == NULL) {
+ return CFX_WideString();
+ }
+ }
+ switch (pValue->GetType()) {
+ case PDFOBJ_STRING:
+ case PDFOBJ_STREAM:
+ return pValue->GetUnicodeText();
+ case PDFOBJ_ARRAY:
+ pValue = ((CPDF_Array*)pValue)->GetElementValue(0);
+ return pValue->GetUnicodeText();
+ break;
+ }
+ return CFX_WideString();
+}
+CFX_WideString CPDF_FormField::GetValue()
+{
+ return GetValue(FALSE);
+}
+CFX_WideString CPDF_FormField::GetDefaultValue()
+{
+ return GetValue(TRUE);
+}
+FX_BOOL CPDF_FormField::SetValue(const CFX_WideString& value, FX_BOOL bDefault, FX_BOOL bNotify)
+{
+ switch (m_Type) {
+ case CheckBox:
+ case RadioButton: {
+ SetCheckValue(value, bDefault, bNotify);
+ return TRUE;
+ }
+ case File:
+ case RichText:
+ case Text:
+ case ComboBox: {
+ CFX_WideString csValue = value;
+ if (bNotify && m_pForm->m_pFormNotify != NULL) {
+ int iRet = m_pForm->m_pFormNotify->BeforeValueChange(this, csValue);
+ if (iRet < 0) {
+ return FALSE;
+ }
+ }
+ int iIndex = FindOptionValue(csValue);
+ if (iIndex < 0) {
+ CFX_ByteString bsEncodeText = PDF_EncodeText(csValue);
+ m_pDict->SetAtString(bDefault ? "DV" : "V", bsEncodeText);
+ if (m_Type == RichText && !bDefault) {
+ m_pDict->SetAtString("RV", bsEncodeText);
+ }
+ m_pDict->RemoveAt("I");
+ } else {
+ m_pDict->SetAtString(bDefault ? "DV" : "V", PDF_EncodeText(csValue));
+ if (bDefault) {
+ } else {
+ ClearSelection();
+ SetItemSelection(iIndex, TRUE);
+ }
+ }
+ if (bNotify && m_pForm->m_pFormNotify != NULL) {
+ m_pForm->m_pFormNotify->AfterValueChange(this);
+ }
+ m_pForm->m_bUpdated = TRUE;
+ }
+ break;
+ case ListBox: {
+ int iIndex = FindOptionValue(value);
+ if (iIndex < 0) {
+ return FALSE;
+ }
+ if (bDefault && iIndex == GetDefaultSelectedItem()) {
+ return FALSE;
+ }
+ if (bNotify && m_pForm->m_pFormNotify != NULL) {
+ CFX_WideString csValue = value;
+ int iRet = m_pForm->m_pFormNotify->BeforeSelectionChange(this, csValue);
+ if (iRet < 0) {
+ return FALSE;
+ }
+ }
+ if (bDefault) {
+ } else {
+ ClearSelection();
+ SetItemSelection(iIndex, TRUE);
+ }
+ if (bNotify && m_pForm->m_pFormNotify != NULL) {
+ m_pForm->m_pFormNotify->AfterSelectionChange(this);
+ }
+ m_pForm->m_bUpdated = TRUE;
+ break;
+ }
+ default:
+ break;
+ }
+ if (CPDF_InterForm::m_bUpdateAP) {
+ UpdateAP(NULL);
+ }
+ return TRUE;
+}
+FX_BOOL CPDF_FormField::SetValue(const CFX_WideString& value, FX_BOOL bNotify)
+{
+ return SetValue(value, FALSE, bNotify);
+}
+int CPDF_FormField::GetMaxLen()
+{
+ CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "MaxLen");
+ if (pObj == NULL) {
+ int iCount = m_ControlList.GetSize();
+ for (int i = 0; i < iCount; i ++) {
+ CPDF_FormControl* pControl = (CPDF_FormControl*)m_ControlList.GetAt(i);
+ if (pControl == NULL) {
+ continue;
+ }
+ CPDF_Dictionary* pWidgetDict = pControl->m_pWidgetDict;
+ if (pWidgetDict->KeyExist("MaxLen")) {
+ return pWidgetDict->GetInteger("MaxLen");
+ }
+ }
+ return 0;
+ }
+ return pObj->GetInteger();
+}
+int CPDF_FormField::CountSelectedItems()
+{
+ CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, "V");
+ if (pValue == NULL) {
+ pValue = FPDF_GetFieldAttr(m_pDict, "I");
+ if (pValue == NULL) {
+ return 0;
+ }
+ }
+ if (pValue->GetType() == PDFOBJ_STRING) {
+ if (pValue->GetString().IsEmpty()) {
+ return 0;
+ }
+ return 1;
+ }
+ if (pValue->GetType() == PDFOBJ_NUMBER) {
+ if (pValue->GetString().IsEmpty()) {
+ return 0;
+ }
+ return 1;
+ }
+ if (pValue->GetType() != PDFOBJ_ARRAY) {
+ return 0;
+ }
+ return ((CPDF_Array*)pValue)->GetCount();
+}
+int CPDF_FormField::GetSelectedIndex(int index)
+{
+ CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, "V");
+ if (pValue == NULL) {
+ pValue = FPDF_GetFieldAttr(m_pDict, "I");
+ if (pValue == NULL) {
+ return -1;
+ }
+ }
+ CFX_WideString sel_value;
+ if (pValue->GetType() == PDFOBJ_STRING) {
+ if (index != 0) {
+ return -1;
+ }
+ sel_value = pValue->GetUnicodeText();
+ } else if (pValue->GetType() == PDFOBJ_NUMBER) {
+ return pValue->GetInteger();
+ } else {
+ if (pValue->GetType() != PDFOBJ_ARRAY) {
+ return -1;
+ }
+ if (index < 0) {
+ return -1;
+ }
+ sel_value = ((CPDF_Array*)pValue)->GetElementValue(index)->GetUnicodeText();
+ }
+ if (index < CountSelectedOptions()) {
+ int iOptIndex = GetSelectedOptionIndex(index);
+ CFX_WideString csOpt = GetOptionValue(iOptIndex);
+ if (csOpt == sel_value) {
+ return iOptIndex;
+ }
+ }
+ int nOpts = CountOptions();
+ for (int i = 0; i < nOpts; i ++) {
+ if (sel_value == GetOptionValue(i)) {
+ return i;
+ }
+ }
+ return -1;
+}
+FX_BOOL CPDF_FormField::ClearSelection(FX_BOOL bNotify)
+{
+ if (bNotify && m_pForm->m_pFormNotify != NULL) {
+ int iRet = 0;
+ CFX_WideString csValue;
+ int iIndex = GetSelectedIndex(0);
+ if (iIndex >= 0) {
+ csValue = GetOptionLabel(iIndex);
+ }
+ if (GetType() == ListBox) {
+ iRet = m_pForm->m_pFormNotify->BeforeSelectionChange(this, csValue);
+ }
+ if (GetType() == ComboBox) {
+ iRet = m_pForm->m_pFormNotify->BeforeValueChange(this, csValue);
+ }
+ if (iRet < 0) {
+ return FALSE;
+ }
+ }
+ m_pDict->RemoveAt("V");
+ m_pDict->RemoveAt("I");
+ if (bNotify && m_pForm->m_pFormNotify != NULL) {
+ if (GetType() == ListBox) {
+ m_pForm->m_pFormNotify->AfterSelectionChange(this);
+ }
+ if (GetType() == ComboBox) {
+ m_pForm->m_pFormNotify->AfterValueChange(this);
+ }
+ }
+ if (CPDF_InterForm::m_bUpdateAP) {
+ UpdateAP(NULL);
+ }
+ m_pForm->m_bUpdated = TRUE;
+ return TRUE;
+}
+FX_BOOL CPDF_FormField::IsItemSelected(int index)
+{
+ ASSERT(GetType() == ComboBox || GetType() == ListBox);
+ if (index < 0 || index >= CountOptions()) {
+ return FALSE;
+ }
+ if (IsOptionSelected(index)) {
+ return TRUE;
+ }
+ CFX_WideString opt_value = GetOptionValue(index);
+ CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, "V");
+ if (pValue == NULL) {
+ pValue = FPDF_GetFieldAttr(m_pDict, "I");
+ if (pValue == NULL) {
+ return FALSE;
+ }
+ }
+ if (pValue->GetType() == PDFOBJ_STRING) {
+ if (pValue->GetUnicodeText() == opt_value) {
+ return TRUE;
+ }
+ return FALSE;
+ }
+ if (pValue->GetType() == PDFOBJ_NUMBER) {
+ if (pValue->GetString().IsEmpty()) {
+ return FALSE;
+ }
+ if (pValue->GetInteger() == index) {
+ return TRUE;
+ }
+ return FALSE;
+ }
+ if (pValue->GetType() != PDFOBJ_ARRAY) {
+ return FALSE;
+ }
+ CPDF_Array* pArray = (CPDF_Array*)pValue;
+ int iPos = -1;
+ for (int j = 0; j < CountSelectedOptions(); j ++) {
+ if (GetSelectedOptionIndex(j) == index) {
+ iPos = j;
+ break;
+ }
+ }
+ for (FX_DWORD i = 0; i < pArray->GetCount(); i ++)
+ if (pArray->GetElementValue(i)->GetUnicodeText() == opt_value && (int)i == iPos) {
+ return TRUE;
+ }
+ return FALSE;
+}
+FX_BOOL CPDF_FormField::SetItemSelection(int index, FX_BOOL bSelected, FX_BOOL bNotify)
+{
+ ASSERT(GetType() == ComboBox || GetType() == ListBox);
+ if (index < 0 || index >= CountOptions()) {
+ return FALSE;
+ }
+ CFX_WideString opt_value = GetOptionValue(index);
+ if (bNotify && m_pForm->m_pFormNotify != NULL) {
+ int iRet = 0;
+ if (GetType() == ListBox) {
+ iRet = m_pForm->m_pFormNotify->BeforeSelectionChange(this, opt_value);
+ }
+ if (GetType() == ComboBox) {
+ iRet = m_pForm->m_pFormNotify->BeforeValueChange(this, opt_value);
+ }
+ if (iRet < 0) {
+ return FALSE;
+ }
+ }
+ if (!bSelected) {
+ CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, "V");
+ if (pValue != NULL) {
+ if (m_Type == ListBox) {
+ SelectOption(index, FALSE);
+ if (pValue->GetType() == PDFOBJ_STRING) {
+ if (pValue->GetUnicodeText() == opt_value) {
+ m_pDict->RemoveAt("V");
+ }
+ } else if (pValue->GetType() == PDFOBJ_ARRAY) {
+ CPDF_Array* pArray = CPDF_Array::Create();
+ if (pArray == NULL) {
+ return FALSE;
+ }
+ int iCount = CountOptions();
+ for (int i = 0; i < iCount; i ++) {
+ if (i != index) {
+ if (IsItemSelected(i)) {
+ opt_value = GetOptionValue(i);
+ pArray->AddString(PDF_EncodeText(opt_value));
+ }
+ }
+ }
+ if (pArray->GetCount() < 1) {
+ pArray->Release();
+ } else {
+ m_pDict->SetAt("V", pArray);
+ }
+ }
+ } else if (m_Type == ComboBox) {
+ m_pDict->RemoveAt("V");
+ m_pDict->RemoveAt("I");
+ }
+ }
+ } else {
+ if (m_Type == ListBox) {
+ SelectOption(index, TRUE);
+ if (!(m_Flags & FORMLIST_MULTISELECT)) {
+ m_pDict->SetAtString("V", PDF_EncodeText(opt_value, opt_value.GetLength()));
+ } else {
+ CPDF_Array* pArray = CPDF_Array::Create();
+ if (pArray == NULL) {
+ return FALSE;
+ }
+ FX_BOOL bSelected;
+ int iCount = CountOptions();
+ for (int i = 0; i < iCount; i ++) {
+ if (i != index) {
+ bSelected = IsItemSelected(i);
+ } else {
+ bSelected = TRUE;
+ }
+ if (bSelected) {
+ opt_value = GetOptionValue(i);
+ pArray->AddString(PDF_EncodeText(opt_value));
+ }
+ }
+ m_pDict->SetAt("V", pArray);
+ }
+ } else if (m_Type == ComboBox) {
+ m_pDict->SetAtString("V", PDF_EncodeText(opt_value, opt_value.GetLength()));
+ CPDF_Array* pI = CPDF_Array::Create();
+ if (pI == NULL) {
+ return FALSE;
+ }
+ pI->AddInteger(index);
+ m_pDict->SetAt("I", pI);
+ }
+ }
+ if (bNotify && m_pForm->m_pFormNotify != NULL) {
+ if (GetType() == ListBox) {
+ m_pForm->m_pFormNotify->AfterSelectionChange(this);
+ }
+ if (GetType() == ComboBox) {
+ m_pForm->m_pFormNotify->AfterValueChange(this);
+ }
+ }
+ if (CPDF_InterForm::m_bUpdateAP) {
+ UpdateAP(NULL);
+ }
+ m_pForm->m_bUpdated = TRUE;
+ return TRUE;
+}
+FX_BOOL CPDF_FormField::IsItemDefaultSelected(int index)
+{
+ ASSERT(GetType() == ComboBox || GetType() == ListBox);
+ if (index < 0 || index >= CountOptions()) {
+ return FALSE;
+ }
+ int iDVIndex = GetDefaultSelectedItem();
+ if (iDVIndex < 0) {
+ return FALSE;
+ }
+ return (iDVIndex == index);
+}
+int CPDF_FormField::GetDefaultSelectedItem()
+{
+ ASSERT(GetType() == ComboBox || GetType() == ListBox);
+ CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, "DV");
+ if (pValue == NULL) {
+ return -1;
+ }
+ CFX_WideString csDV = pValue->GetUnicodeText();
+ if (csDV.IsEmpty()) {
+ return -1;
+ }
+ int iCount = CountOptions();
+ for (int i = 0; i < iCount; i ++) {
+ if (csDV == GetOptionValue(i)) {
+ return i;
+ }
+ }
+ return -1;
+}
+void CPDF_FormField::UpdateAP(CPDF_FormControl* pControl)
+{
+ if (m_Type == PushButton) {
+ return;
+ }
+ if (m_Type == RadioButton || m_Type == CheckBox) {
+ return;
+ }
+ if (!m_pForm->m_bGenerateAP) {
+ return;
+ }
+ for (int i = 0; i < CountControls(); i ++) {
+ CPDF_FormControl* pControl = GetControl(i);
+ FPDF_GenerateAP(m_pForm->m_pDocument, pControl->m_pWidgetDict);
+ }
+}
+int CPDF_FormField::CountOptions()
+{
+ CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, "Opt");
+ if (pValue == NULL || pValue->GetType() != PDFOBJ_ARRAY) {
+ return 0;
+ }
+ return ((CPDF_Array*)pValue)->GetCount();
+}
+CFX_WideString CPDF_FormField::GetOptionText(int index, int sub_index)
+{
+ CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, "Opt");
+ if (pValue == NULL || pValue->GetType() != PDFOBJ_ARRAY) {
+ return CFX_WideString();
+ }
+ CPDF_Object* pOption = ((CPDF_Array*)pValue)->GetElementValue(index);
+ if (pOption == NULL) {
+ return CFX_WideString();
+ }
+ if (pOption->GetType() == PDFOBJ_ARRAY) {
+ pOption = ((CPDF_Array*)pOption)->GetElementValue(sub_index);
+ }
+ if (pOption == NULL || pOption->GetType() != PDFOBJ_STRING) {
+ return CFX_WideString();
+ }
+ return ((CPDF_String*)pOption)->GetUnicodeText();
+}
+CFX_WideString CPDF_FormField::GetOptionLabel(int index)
+{
+ return GetOptionText(index, 1);
+}
+CFX_WideString CPDF_FormField::GetOptionValue(int index)
+{
+ return GetOptionText(index, 0);
+}
+int CPDF_FormField::FindOption(CFX_WideString csOptLabel)
+{
+ int iCount = CountOptions();
+ for (int i = 0; i < iCount; i ++) {
+ CFX_WideString csValue = GetOptionValue(i);
+ if (csValue == csOptLabel) {
+ return i;
+ }
+ }
+ return -1;
+}
+int CPDF_FormField::FindOptionValue(FX_LPCWSTR csOptValue, int iStartIndex)
+{
+ if (iStartIndex < 0) {
+ iStartIndex = 0;
+ }
+ int iCount = CountOptions();
+ for (; iStartIndex < iCount; iStartIndex ++) {
+ CFX_WideString csValue = GetOptionValue(iStartIndex);
+ if (csValue == csOptValue) {
+ return iStartIndex;
+ }
+ }
+ return -1;
+}
+FX_BOOL CPDF_FormField::CheckControl(int iControlIndex, FX_BOOL bChecked, FX_BOOL bNotify)
+{
+ ASSERT(GetType() == CheckBox || GetType() == RadioButton);
+ CPDF_FormControl* pControl = GetControl(iControlIndex);
+ if (pControl == NULL) {
+ return FALSE;
+ }
+ if (!bChecked && pControl->IsChecked() == bChecked) {
+ return FALSE;
+ }
+ CFX_ByteArray statusArray;
+ if (bNotify && m_pForm->m_pFormNotify != NULL) {
+ SaveCheckedFieldStatus(this, statusArray);
+ }
+ CFX_WideString csWExport = pControl->GetExportValue();
+ CFX_ByteString csBExport = PDF_EncodeText(csWExport);
+ int iCount = CountControls();
+ FX_BOOL bUnison = PDF_FormField_IsUnison(this);
+ for (int i = 0; i < iCount; i ++) {
+ CPDF_FormControl* pCtrl = GetControl(i);
+ if (bUnison) {
+ CFX_WideString csEValue = pCtrl->GetExportValue();
+ if (csEValue == csWExport) {
+ if (pCtrl->GetOnStateName() == pControl->GetOnStateName()) {
+ pCtrl->CheckControl(bChecked);
+ } else if (bChecked) {
+ pCtrl->CheckControl(FALSE);
+ }
+ } else if (bChecked) {
+ pCtrl->CheckControl(FALSE);
+ }
+ } else {
+ if (i == iControlIndex) {
+ pCtrl->CheckControl(bChecked);
+ } else if (bChecked) {
+ pCtrl->CheckControl(FALSE);
+ }
+ }
+ }
+ CPDF_Object* pOpt = FPDF_GetFieldAttr(m_pDict, "Opt");
+ if (pOpt == NULL || pOpt->GetType() != PDFOBJ_ARRAY) {
+ if (bChecked) {
+ m_pDict->SetAtName("V", csBExport);
+ } else {
+ CFX_ByteString csV;
+ CPDF_Object* pV = FPDF_GetFieldAttr(m_pDict, "V");
+ if (pV != NULL) {
+ csV = pV->GetString();
+ }
+ if (csV == csBExport) {
+ m_pDict->SetAtName("V", "Off");
+ }
+ }
+ } else if (bChecked) {
+ CFX_ByteString csIndex;
+ csIndex.Format("%d", iControlIndex);
+ m_pDict->SetAtName("V", csIndex);
+ }
+ if (bNotify && m_pForm->m_pFormNotify != NULL) {
+ m_pForm->m_pFormNotify->AfterCheckedStatusChange(this, statusArray);
+ }
+ m_pForm->m_bUpdated = TRUE;
+ return TRUE;
+}
+CFX_WideString CPDF_FormField::GetCheckValue(FX_BOOL bDefault)
+{
+ ASSERT(GetType() == CheckBox || GetType() == RadioButton);
+ CFX_WideString csExport = L"Off";
+ FX_BOOL bChecked;
+ int iCount = CountControls();
+ for (int i = 0; i < iCount; i ++) {
+ CPDF_FormControl* pControl = GetControl(i);
+ if (bDefault) {
+ bChecked = pControl->IsDefaultChecked();
+ } else {
+ bChecked = pControl->IsChecked();
+ }
+ if (bChecked) {
+ csExport = pControl->GetExportValue();
+ break;
+ }
+ }
+ return csExport;
+}
+FX_BOOL CPDF_FormField::SetCheckValue(const CFX_WideString& value, FX_BOOL bDefault, FX_BOOL bNotify)
+{
+ ASSERT(GetType() == CheckBox || GetType() == RadioButton);
+ CFX_ByteArray statusArray;
+ if (bNotify && m_pForm->m_pFormNotify != NULL) {
+ SaveCheckedFieldStatus(this, statusArray);
+ }
+ int iCount = CountControls();
+ for (int i = 0; i < iCount; i ++) {
+ CPDF_FormControl* pControl = GetControl(i);
+ CFX_WideString csExport = pControl->GetExportValue();
+ if (csExport == value) {
+ if (bDefault) {
+ } else {
+ CheckControl(GetControlIndex(pControl), TRUE);
+ }
+ break;
+ } else {
+ if (bDefault) {
+ } else {
+ CheckControl(GetControlIndex(pControl), FALSE);
+ }
+ }
+ }
+ if (bNotify && m_pForm->m_pFormNotify != NULL) {
+ m_pForm->m_pFormNotify->AfterCheckedStatusChange(this, statusArray);
+ }
+ m_pForm->m_bUpdated = TRUE;
+ return TRUE;
+}
+int CPDF_FormField::GetTopVisibleIndex()
+{
+ CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "TI");
+ if (pObj == NULL) {
+ return 0;
+ }
+ return pObj->GetInteger();
+}
+int CPDF_FormField::CountSelectedOptions()
+{
+ CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "I");
+ if (pObj == NULL) {
+ return 0;
+ }
+ CPDF_Array* pArray = pObj->GetArray();
+ if (pArray == NULL) {
+ return 0;
+ }
+ return (int)pArray->GetCount();
+}
+int CPDF_FormField::GetSelectedOptionIndex(int index)
+{
+ CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "I");
+ if (pObj == NULL) {
+ return -1;
+ }
+ CPDF_Array* pArray = pObj->GetArray();
+ if (pArray == NULL) {
+ return -1;
+ }
+ int iCount = (int)pArray->GetCount();
+ if (iCount > 0 && index < iCount) {
+ return pArray->GetInteger(index);
+ }
+ return -1;
+}
+FX_BOOL CPDF_FormField::IsOptionSelected(int iOptIndex)
+{
+ CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "I");
+ if (pObj == NULL) {
+ return FALSE;
+ }
+ CPDF_Array* pArray = pObj->GetArray();
+ if (pArray == NULL) {
+ return FALSE;
+ }
+ int iCount = (int)pArray->GetCount();
+ for (int i = 0; i < iCount; i ++) {
+ if (pArray->GetInteger(i) == iOptIndex) {
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+FX_BOOL CPDF_FormField::SelectOption(int iOptIndex, FX_BOOL bSelected, FX_BOOL bNotify)
+{
+ CPDF_Array* pArray = m_pDict->GetArray("I");
+ if (pArray == NULL) {
+ if (!bSelected) {
+ return TRUE;
+ }
+ pArray = CPDF_Array::Create();
+ if (pArray == NULL) {
+ return FALSE;
+ }
+ m_pDict->SetAt("I", pArray);
+ }
+ FX_BOOL bReturn = FALSE;
+ for (int i = 0; i < (int)pArray->GetCount(); i ++) {
+ int iFind = pArray->GetInteger(i);
+ if (iFind == iOptIndex) {
+ if (bSelected) {
+ return TRUE;
+ }
+ if (bNotify && m_pForm->m_pFormNotify != NULL) {
+ int iRet = 0;
+ CFX_WideString csValue = GetOptionLabel(iOptIndex);
+ if (GetType() == ListBox) {
+ iRet = m_pForm->m_pFormNotify->BeforeSelectionChange(this, csValue);
+ }
+ if (GetType() == ComboBox) {
+ iRet = m_pForm->m_pFormNotify->BeforeValueChange(this, csValue);
+ }
+ if (iRet < 0) {
+ return FALSE;
+ }
+ }
+ pArray->RemoveAt(i);
+ bReturn = TRUE;
+ break;
+ } else if (iFind > iOptIndex) {
+ if (!bSelected) {
+ continue;
+ }
+ if (bNotify && m_pForm->m_pFormNotify != NULL) {
+ int iRet = 0;
+ CFX_WideString csValue = GetOptionLabel(iOptIndex);
+ if (GetType() == ListBox) {
+ iRet = m_pForm->m_pFormNotify->BeforeSelectionChange(this, csValue);
+ }
+ if (GetType() == ComboBox) {
+ iRet = m_pForm->m_pFormNotify->BeforeValueChange(this, csValue);
+ }
+ if (iRet < 0) {
+ return FALSE;
+ }
+ }
+ CPDF_Number* pNum = CPDF_Number::Create(iOptIndex);
+ if (pNum == NULL) {
+ return FALSE;
+ }
+ pArray->InsertAt(i, pNum);
+ bReturn = TRUE;
+ break;
+ }
+ }
+ if (!bReturn) {
+ if (bSelected) {
+ pArray->AddInteger(iOptIndex);
+ }
+ if (pArray->GetCount() == 0) {
+ m_pDict->RemoveAt("I");
+ }
+ }
+ if (bNotify && m_pForm->m_pFormNotify != NULL) {
+ if (GetType() == ListBox) {
+ m_pForm->m_pFormNotify->AfterSelectionChange(this);
+ }
+ if (GetType() == ComboBox) {
+ m_pForm->m_pFormNotify->AfterValueChange(this);
+ }
+ }
+ m_pForm->m_bUpdated = TRUE;
+ return TRUE;
+}
+FX_BOOL CPDF_FormField::ClearSelectedOptions(FX_BOOL bNotify)
+{
+ if (bNotify && m_pForm->m_pFormNotify != NULL) {
+ int iRet = 0;
+ CFX_WideString csValue;
+ int iIndex = GetSelectedIndex(0);
+ if (iIndex >= 0) {
+ csValue = GetOptionLabel(iIndex);
+ }
+ if (GetType() == ListBox) {
+ iRet = m_pForm->m_pFormNotify->BeforeSelectionChange(this, csValue);
+ }
+ if (GetType() == ComboBox) {
+ iRet = m_pForm->m_pFormNotify->BeforeValueChange(this, csValue);
+ }
+ if (iRet < 0) {
+ return FALSE;
+ }
+ }
+ m_pDict->RemoveAt("I");
+ if (bNotify && m_pForm->m_pFormNotify != NULL) {
+ if (GetType() == ListBox) {
+ m_pForm->m_pFormNotify->AfterSelectionChange(this);
+ }
+ if (GetType() == ComboBox) {
+ m_pForm->m_pFormNotify->AfterValueChange(this);
+ }
+ }
+ m_pForm->m_bUpdated = TRUE;
+ return TRUE;
+}
+void CPDF_FormField::LoadDA()
+{
+ CFX_ByteString DA = FPDF_GetFieldAttr(m_pDict, "DA")->GetString();
+ if (DA.IsEmpty()) {
+ DA = m_pForm->m_pFormDict->GetString("DA");
+ }
+ if (DA.IsEmpty()) {
+ return;
+ }
+ CPDF_SimpleParser syntax(DA);
+ syntax.FindTagParam("Tf", 2);
+ CFX_ByteString font_name = syntax.GetWord();
+ CPDF_Dictionary* pFontDict = m_pForm->m_pFormDict->GetDict("DR")->GetDict("Font")->GetDict(font_name);
+ if (pFontDict == NULL) {
+ return;
+ }
+ m_pFont = m_pForm->m_pDocument->LoadFont(pFontDict);
+ m_FontSize = FX_atof(syntax.GetWord());
+}
diff --git a/core/src/fpdfdoc/doc_link.cpp b/core/src/fpdfdoc/doc_link.cpp
index 4c8fda7a34..0d1b98e7b7 100644
--- a/core/src/fpdfdoc/doc_link.cpp
+++ b/core/src/fpdfdoc/doc_link.cpp
@@ -1,105 +1,105 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../include/fpdfdoc/fpdf_doc.h"
-CPDF_LinkList::~CPDF_LinkList()
-{
- FX_POSITION pos = m_PageMap.GetStartPosition();
- while (pos) {
- FX_LPVOID key, value;
- m_PageMap.GetNextAssoc(pos, key, value);
- delete (CFX_PtrArray*)value;
- }
-}
-CFX_PtrArray* CPDF_LinkList::GetPageLinks(CPDF_Page* pPage)
-{
- FX_DWORD objnum = pPage->m_pFormDict->GetObjNum();
- if (objnum == 0) {
- return NULL;
- }
- CFX_PtrArray* pPageLinkList = NULL;
- if (!m_PageMap.Lookup((FX_LPVOID)(FX_UINTPTR)objnum, (FX_LPVOID&)pPageLinkList)) {
- pPageLinkList = FX_NEW CFX_PtrArray;
- if (pPageLinkList == NULL) {
- return NULL;
- }
- m_PageMap.SetAt((FX_LPVOID)(FX_UINTPTR)objnum, pPageLinkList);
- LoadPageLinks(pPage, pPageLinkList);
- }
- return pPageLinkList;
-}
-int CPDF_LinkList::CountLinks(CPDF_Page* pPage)
-{
- CFX_PtrArray* pPageLinkList = GetPageLinks(pPage);
- if (pPageLinkList == NULL) {
- return 0;
- }
- return pPageLinkList->GetSize();
-}
-CPDF_Link CPDF_LinkList::GetLink(CPDF_Page* pPage, int index)
-{
- CFX_PtrArray* pPageLinkList = GetPageLinks(pPage);
- if (pPageLinkList == NULL) {
- return NULL;
- }
- return (CPDF_Dictionary*)pPageLinkList->GetAt(index);
-}
-CPDF_Link CPDF_LinkList::GetLinkAtPoint(CPDF_Page* pPage, FX_FLOAT pdf_x, FX_FLOAT pdf_y)
-{
- CFX_PtrArray* pPageLinkList = GetPageLinks(pPage);
- if (pPageLinkList == NULL) {
- return NULL;
- }
- int size = pPageLinkList->GetSize();
- for (int i = 0; i < size; i ++) {
- CPDF_Link Link = (CPDF_Dictionary*)pPageLinkList->GetAt(i);
- CPDF_Rect rect = Link.GetRect();
- if (rect.Contains(pdf_x, pdf_y)) {
- return Link;
- }
- }
- return NULL;
-}
-void CPDF_LinkList::LoadPageLinks(CPDF_Page* pPage, CFX_PtrArray* pList)
-{
- CPDF_Array* pAnnotList = pPage->m_pFormDict->GetArray("Annots");
- if (pAnnotList == NULL) {
- return;
- }
- for (FX_DWORD i = 0; i < pAnnotList->GetCount(); i ++) {
- CPDF_Dictionary* pAnnot = pAnnotList->GetDict(i);
- if (pAnnot == NULL) {
- continue;
- }
- if (pAnnot->GetString("Subtype") != "Link") {
- continue;
- }
- pList->Add(pAnnot);
- }
-}
-CPDF_Rect CPDF_Link::GetRect()
-{
- return m_pDict->GetRect("Rect");
-}
-CPDF_Dest CPDF_Link::GetDest(CPDF_Document* pDoc)
-{
- CPDF_Object* pDest = m_pDict->GetElementValue("Dest");
- if (pDest == NULL) {
- return NULL;
- }
- if (pDest->GetType() == PDFOBJ_STRING || pDest->GetType() == PDFOBJ_NAME) {
- CPDF_NameTree name_tree(pDoc, FX_BSTRC("Dests"));
- CFX_ByteStringC name = pDest->GetString();
- return name_tree.LookupNamedDest(pDoc, name);
- } else if (pDest->GetType() == PDFOBJ_ARRAY) {
- return (CPDF_Array*)pDest;
- }
- return NULL;
-}
-CPDF_Action CPDF_Link::GetAction()
-{
- return m_pDict->GetDict("A");
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fpdfdoc/fpdf_doc.h"
+CPDF_LinkList::~CPDF_LinkList()
+{
+ FX_POSITION pos = m_PageMap.GetStartPosition();
+ while (pos) {
+ FX_LPVOID key, value;
+ m_PageMap.GetNextAssoc(pos, key, value);
+ delete (CFX_PtrArray*)value;
+ }
+}
+CFX_PtrArray* CPDF_LinkList::GetPageLinks(CPDF_Page* pPage)
+{
+ FX_DWORD objnum = pPage->m_pFormDict->GetObjNum();
+ if (objnum == 0) {
+ return NULL;
+ }
+ CFX_PtrArray* pPageLinkList = NULL;
+ if (!m_PageMap.Lookup((FX_LPVOID)(FX_UINTPTR)objnum, (FX_LPVOID&)pPageLinkList)) {
+ pPageLinkList = FX_NEW CFX_PtrArray;
+ if (pPageLinkList == NULL) {
+ return NULL;
+ }
+ m_PageMap.SetAt((FX_LPVOID)(FX_UINTPTR)objnum, pPageLinkList);
+ LoadPageLinks(pPage, pPageLinkList);
+ }
+ return pPageLinkList;
+}
+int CPDF_LinkList::CountLinks(CPDF_Page* pPage)
+{
+ CFX_PtrArray* pPageLinkList = GetPageLinks(pPage);
+ if (pPageLinkList == NULL) {
+ return 0;
+ }
+ return pPageLinkList->GetSize();
+}
+CPDF_Link CPDF_LinkList::GetLink(CPDF_Page* pPage, int index)
+{
+ CFX_PtrArray* pPageLinkList = GetPageLinks(pPage);
+ if (pPageLinkList == NULL) {
+ return NULL;
+ }
+ return (CPDF_Dictionary*)pPageLinkList->GetAt(index);
+}
+CPDF_Link CPDF_LinkList::GetLinkAtPoint(CPDF_Page* pPage, FX_FLOAT pdf_x, FX_FLOAT pdf_y)
+{
+ CFX_PtrArray* pPageLinkList = GetPageLinks(pPage);
+ if (pPageLinkList == NULL) {
+ return NULL;
+ }
+ int size = pPageLinkList->GetSize();
+ for (int i = 0; i < size; i ++) {
+ CPDF_Link Link = (CPDF_Dictionary*)pPageLinkList->GetAt(i);
+ CPDF_Rect rect = Link.GetRect();
+ if (rect.Contains(pdf_x, pdf_y)) {
+ return Link;
+ }
+ }
+ return NULL;
+}
+void CPDF_LinkList::LoadPageLinks(CPDF_Page* pPage, CFX_PtrArray* pList)
+{
+ CPDF_Array* pAnnotList = pPage->m_pFormDict->GetArray("Annots");
+ if (pAnnotList == NULL) {
+ return;
+ }
+ for (FX_DWORD i = 0; i < pAnnotList->GetCount(); i ++) {
+ CPDF_Dictionary* pAnnot = pAnnotList->GetDict(i);
+ if (pAnnot == NULL) {
+ continue;
+ }
+ if (pAnnot->GetString("Subtype") != "Link") {
+ continue;
+ }
+ pList->Add(pAnnot);
+ }
+}
+CPDF_Rect CPDF_Link::GetRect()
+{
+ return m_pDict->GetRect("Rect");
+}
+CPDF_Dest CPDF_Link::GetDest(CPDF_Document* pDoc)
+{
+ CPDF_Object* pDest = m_pDict->GetElementValue("Dest");
+ if (pDest == NULL) {
+ return NULL;
+ }
+ if (pDest->GetType() == PDFOBJ_STRING || pDest->GetType() == PDFOBJ_NAME) {
+ CPDF_NameTree name_tree(pDoc, FX_BSTRC("Dests"));
+ CFX_ByteStringC name = pDest->GetString();
+ return name_tree.LookupNamedDest(pDoc, name);
+ } else if (pDest->GetType() == PDFOBJ_ARRAY) {
+ return (CPDF_Array*)pDest;
+ }
+ return NULL;
+}
+CPDF_Action CPDF_Link::GetAction()
+{
+ return m_pDict->GetDict("A");
+}
diff --git a/core/src/fpdfdoc/doc_metadata.cpp b/core/src/fpdfdoc/doc_metadata.cpp
index e3ac9e3779..8c00157990 100644
--- a/core/src/fpdfdoc/doc_metadata.cpp
+++ b/core/src/fpdfdoc/doc_metadata.cpp
@@ -1,152 +1,152 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../include/fpdfdoc/fpdf_doc.h"
-#include "../../include/fxcrt/fx_xml.h"
-typedef struct _PDFDOC_METADATA {
- CPDF_Document *m_pDoc;
- CXML_Element *m_pXmlElmnt;
- CXML_Element *m_pElmntRdf;
- CFX_CMapByteStringToPtr *m_pStringMap;
-} PDFDOC_METADATA, * PDFDOC_LPMETADATA;
-typedef PDFDOC_METADATA const * PDFDOC_LPCMETADATA;
-const FX_LPCSTR gs_FPDFDOC_Metadata_Titles[] = {
- "Title", "title",
- "Subject", "description",
- "Author", "creator",
- "Keywords", "Keywords",
- "Producer", "Producer",
- "Creator", "CreatorTool",
- "CreationDate", "CreateDate",
- "ModDate", "ModifyDate",
- "MetadataDate", "MetadataDate"
-};
-CPDF_Metadata::CPDF_Metadata()
-{
- m_pData = FX_Alloc(PDFDOC_METADATA, 1);
- FXSYS_memset32(m_pData, 0, sizeof(PDFDOC_METADATA));
- CFX_CMapByteStringToPtr *&pStringMap = ((PDFDOC_LPMETADATA)m_pData)->m_pStringMap;
- pStringMap = FX_NEW(CFX_CMapByteStringToPtr);
- if (pStringMap != NULL) {
- CFX_ByteString bstr;
- for (int i = 0; i < 18; i += 2) {
- bstr = gs_FPDFDOC_Metadata_Titles[i];
- pStringMap->AddValue(bstr, (void*)gs_FPDFDOC_Metadata_Titles[i + 1]);
- }
- }
-}
-CPDF_Metadata::~CPDF_Metadata()
-{
- FXSYS_assert(m_pData != NULL);
- CXML_Element *&p = ((PDFDOC_LPMETADATA)m_pData)->m_pXmlElmnt;
- if (p) {
- delete p;
- }
- CFX_CMapByteStringToPtr *pStringMap = ((PDFDOC_LPMETADATA)m_pData)->m_pStringMap;
- if (pStringMap) {
- pStringMap->RemoveAll();
- FX_Free(pStringMap);
- }
- FX_Free(m_pData);
-}
-void CPDF_Metadata::LoadDoc(CPDF_Document *pDoc)
-{
- FXSYS_assert(pDoc != NULL);
- ((PDFDOC_LPMETADATA)m_pData)->m_pDoc = pDoc;
- CPDF_Dictionary *pRoot = pDoc->GetRoot();
- CPDF_Stream *pStream = pRoot->GetStream(FX_BSTRC("Metadata"));
- if (!pStream) {
- return;
- }
- CPDF_StreamAcc acc;
- acc.LoadAllData(pStream, FALSE);
- int size = acc.GetSize();
- FX_LPCBYTE pBuf = acc.GetData();
- CXML_Element *&pXmlElmnt = ((PDFDOC_LPMETADATA)m_pData)->m_pXmlElmnt;
- pXmlElmnt = CXML_Element::Parse(pBuf, size);
- if (!pXmlElmnt) {
- return;
- }
- CXML_Element *&pElmntRdf = ((PDFDOC_LPMETADATA)m_pData)->m_pElmntRdf;
- if (pXmlElmnt->GetTagName() == FX_BSTRC("RDF")) {
- pElmntRdf = pXmlElmnt;
- } else {
- pElmntRdf = pXmlElmnt->GetElement(NULL, FX_BSTRC("RDF"));
- }
-}
-FX_INT32 CPDF_Metadata::GetString(FX_BSTR bsItem, CFX_WideString &wsStr)
-{
- if (!((PDFDOC_LPMETADATA)m_pData)->m_pXmlElmnt) {
- return -1;
- }
- if (!((PDFDOC_LPMETADATA)m_pData)->m_pStringMap) {
- return -1;
- }
- void *szTag;
- if (!((PDFDOC_LPMETADATA)m_pData)->m_pStringMap->Lookup(bsItem, szTag)) {
- return -1;
- }
- CFX_ByteString bsTag = (FX_LPCSTR)szTag;
- wsStr = L"";
- CXML_Element *pElmntRdf = ((PDFDOC_LPMETADATA)m_pData)->m_pElmntRdf;
- if (!pElmntRdf) {
- return -1;
- }
- int nChild = pElmntRdf->CountChildren();
- for (int i = 0; i < nChild; i++) {
- CXML_Element *pTag = pElmntRdf->GetElement(NULL, FX_BSTRC("Description"), i);
- if (!pTag) {
- continue;
- }
- if (bsItem == FX_BSTRC("Title") || bsItem == FX_BSTRC("Subject")) {
- CXML_Element *pElmnt = pTag->GetElement(NULL, bsTag);
- if (!pElmnt) {
- continue;
- }
- pElmnt = pElmnt->GetElement(NULL, FX_BSTRC("Alt"));
- if (!pElmnt) {
- continue;
- }
- pElmnt = pElmnt->GetElement(NULL, FX_BSTRC("li"));
- if (!pElmnt) {
- continue;
- }
- wsStr = pElmnt->GetContent(0);
- return wsStr.GetLength();
- } else if (bsItem == FX_BSTRC("Author")) {
- CXML_Element *pElmnt = pTag->GetElement(NULL, bsTag);
- if (!pElmnt) {
- continue;
- }
- pElmnt = pElmnt->GetElement(NULL, FX_BSTRC("Seq"));
- if (!pElmnt) {
- continue;
- }
- pElmnt = pElmnt->GetElement(NULL, FX_BSTRC("li"));
- if (!pElmnt) {
- continue;
- }
- wsStr = pElmnt->GetContent(0);
- return wsStr.GetLength();
- } else {
- CXML_Element *pElmnt = pTag->GetElement(NULL, bsTag);
- if (!pElmnt) {
- continue;
- }
- wsStr = pElmnt->GetContent(0);
- return wsStr.GetLength();
- }
- }
- return -1;
-}
-CXML_Element* CPDF_Metadata::GetRoot() const
-{
- return ((PDFDOC_LPMETADATA)m_pData)->m_pXmlElmnt;
-}
-CXML_Element* CPDF_Metadata::GetRDF() const
-{
- return ((PDFDOC_LPMETADATA)m_pData)->m_pElmntRdf;
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fpdfdoc/fpdf_doc.h"
+#include "../../include/fxcrt/fx_xml.h"
+typedef struct _PDFDOC_METADATA {
+ CPDF_Document *m_pDoc;
+ CXML_Element *m_pXmlElmnt;
+ CXML_Element *m_pElmntRdf;
+ CFX_CMapByteStringToPtr *m_pStringMap;
+} PDFDOC_METADATA, * PDFDOC_LPMETADATA;
+typedef PDFDOC_METADATA const * PDFDOC_LPCMETADATA;
+const FX_LPCSTR gs_FPDFDOC_Metadata_Titles[] = {
+ "Title", "title",
+ "Subject", "description",
+ "Author", "creator",
+ "Keywords", "Keywords",
+ "Producer", "Producer",
+ "Creator", "CreatorTool",
+ "CreationDate", "CreateDate",
+ "ModDate", "ModifyDate",
+ "MetadataDate", "MetadataDate"
+};
+CPDF_Metadata::CPDF_Metadata()
+{
+ m_pData = FX_Alloc(PDFDOC_METADATA, 1);
+ FXSYS_memset32(m_pData, 0, sizeof(PDFDOC_METADATA));
+ CFX_CMapByteStringToPtr *&pStringMap = ((PDFDOC_LPMETADATA)m_pData)->m_pStringMap;
+ pStringMap = FX_NEW(CFX_CMapByteStringToPtr);
+ if (pStringMap != NULL) {
+ CFX_ByteString bstr;
+ for (int i = 0; i < 18; i += 2) {
+ bstr = gs_FPDFDOC_Metadata_Titles[i];
+ pStringMap->AddValue(bstr, (void*)gs_FPDFDOC_Metadata_Titles[i + 1]);
+ }
+ }
+}
+CPDF_Metadata::~CPDF_Metadata()
+{
+ FXSYS_assert(m_pData != NULL);
+ CXML_Element *&p = ((PDFDOC_LPMETADATA)m_pData)->m_pXmlElmnt;
+ if (p) {
+ delete p;
+ }
+ CFX_CMapByteStringToPtr *pStringMap = ((PDFDOC_LPMETADATA)m_pData)->m_pStringMap;
+ if (pStringMap) {
+ pStringMap->RemoveAll();
+ FX_Free(pStringMap);
+ }
+ FX_Free(m_pData);
+}
+void CPDF_Metadata::LoadDoc(CPDF_Document *pDoc)
+{
+ FXSYS_assert(pDoc != NULL);
+ ((PDFDOC_LPMETADATA)m_pData)->m_pDoc = pDoc;
+ CPDF_Dictionary *pRoot = pDoc->GetRoot();
+ CPDF_Stream *pStream = pRoot->GetStream(FX_BSTRC("Metadata"));
+ if (!pStream) {
+ return;
+ }
+ CPDF_StreamAcc acc;
+ acc.LoadAllData(pStream, FALSE);
+ int size = acc.GetSize();
+ FX_LPCBYTE pBuf = acc.GetData();
+ CXML_Element *&pXmlElmnt = ((PDFDOC_LPMETADATA)m_pData)->m_pXmlElmnt;
+ pXmlElmnt = CXML_Element::Parse(pBuf, size);
+ if (!pXmlElmnt) {
+ return;
+ }
+ CXML_Element *&pElmntRdf = ((PDFDOC_LPMETADATA)m_pData)->m_pElmntRdf;
+ if (pXmlElmnt->GetTagName() == FX_BSTRC("RDF")) {
+ pElmntRdf = pXmlElmnt;
+ } else {
+ pElmntRdf = pXmlElmnt->GetElement(NULL, FX_BSTRC("RDF"));
+ }
+}
+FX_INT32 CPDF_Metadata::GetString(FX_BSTR bsItem, CFX_WideString &wsStr)
+{
+ if (!((PDFDOC_LPMETADATA)m_pData)->m_pXmlElmnt) {
+ return -1;
+ }
+ if (!((PDFDOC_LPMETADATA)m_pData)->m_pStringMap) {
+ return -1;
+ }
+ void *szTag;
+ if (!((PDFDOC_LPMETADATA)m_pData)->m_pStringMap->Lookup(bsItem, szTag)) {
+ return -1;
+ }
+ CFX_ByteString bsTag = (FX_LPCSTR)szTag;
+ wsStr = L"";
+ CXML_Element *pElmntRdf = ((PDFDOC_LPMETADATA)m_pData)->m_pElmntRdf;
+ if (!pElmntRdf) {
+ return -1;
+ }
+ int nChild = pElmntRdf->CountChildren();
+ for (int i = 0; i < nChild; i++) {
+ CXML_Element *pTag = pElmntRdf->GetElement(NULL, FX_BSTRC("Description"), i);
+ if (!pTag) {
+ continue;
+ }
+ if (bsItem == FX_BSTRC("Title") || bsItem == FX_BSTRC("Subject")) {
+ CXML_Element *pElmnt = pTag->GetElement(NULL, bsTag);
+ if (!pElmnt) {
+ continue;
+ }
+ pElmnt = pElmnt->GetElement(NULL, FX_BSTRC("Alt"));
+ if (!pElmnt) {
+ continue;
+ }
+ pElmnt = pElmnt->GetElement(NULL, FX_BSTRC("li"));
+ if (!pElmnt) {
+ continue;
+ }
+ wsStr = pElmnt->GetContent(0);
+ return wsStr.GetLength();
+ } else if (bsItem == FX_BSTRC("Author")) {
+ CXML_Element *pElmnt = pTag->GetElement(NULL, bsTag);
+ if (!pElmnt) {
+ continue;
+ }
+ pElmnt = pElmnt->GetElement(NULL, FX_BSTRC("Seq"));
+ if (!pElmnt) {
+ continue;
+ }
+ pElmnt = pElmnt->GetElement(NULL, FX_BSTRC("li"));
+ if (!pElmnt) {
+ continue;
+ }
+ wsStr = pElmnt->GetContent(0);
+ return wsStr.GetLength();
+ } else {
+ CXML_Element *pElmnt = pTag->GetElement(NULL, bsTag);
+ if (!pElmnt) {
+ continue;
+ }
+ wsStr = pElmnt->GetContent(0);
+ return wsStr.GetLength();
+ }
+ }
+ return -1;
+}
+CXML_Element* CPDF_Metadata::GetRoot() const
+{
+ return ((PDFDOC_LPMETADATA)m_pData)->m_pXmlElmnt;
+}
+CXML_Element* CPDF_Metadata::GetRDF() const
+{
+ return ((PDFDOC_LPMETADATA)m_pData)->m_pElmntRdf;
+}
diff --git a/core/src/fpdfdoc/doc_ocg.cpp b/core/src/fpdfdoc/doc_ocg.cpp
index 39b8e37521..0ca9fc0313 100644
--- a/core/src/fpdfdoc/doc_ocg.cpp
+++ b/core/src/fpdfdoc/doc_ocg.cpp
@@ -1,300 +1,300 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../include/fpdfdoc/fpdf_doc.h"
-static FX_INT32 FPDFDOC_OCG_FindGroup(const CPDF_Object *pObject, const CPDF_Dictionary *pGroupDict)
-{
- if (pObject == NULL || pGroupDict == NULL) {
- return -1;
- }
- FX_INT32 iType = pObject->GetType();
- if (iType == PDFOBJ_ARRAY) {
- FX_DWORD dwCount = ((CPDF_Array*)pObject)->GetCount();
- for (FX_DWORD i = 0; i < dwCount; i++) {
- if (((CPDF_Array*)pObject)->GetDict(i) == pGroupDict) {
- return i;
- }
- }
- return -1;
- }
- if (pObject->GetDict() == pGroupDict) {
- return 0;
- }
- return -1;
-}
-static FX_BOOL FPDFDOC_OCG_HasIntent(const CPDF_Dictionary *pDict, FX_BSTR csElement, FX_BSTR csDef = FX_BSTRC(""))
-{
- FXSYS_assert(pDict != NULL);
- CPDF_Object *pIntent = pDict->GetElementValue(FX_BSTRC("Intent"));
- if (pIntent == NULL) {
- return csElement == csDef;
- }
- CFX_ByteString bsIntent;
- if (pIntent->GetType() == PDFOBJ_ARRAY) {
- FX_DWORD dwCount = ((CPDF_Array*)pIntent)->GetCount();
- for (FX_DWORD i = 0; i < dwCount; i++) {
- bsIntent = ((CPDF_Array*)pIntent)->GetString(i);
- if (bsIntent == FX_BSTRC("All") || bsIntent == csElement) {
- return TRUE;
- }
- }
- return FALSE;
- }
- bsIntent = pIntent->GetString();
- return bsIntent == FX_BSTRC("All") || bsIntent == csElement;
-}
-static CPDF_Dictionary* FPDFDOC_OCG_GetConfig(CPDF_Document *pDoc, const CPDF_Dictionary *pOCGDict, FX_BSTR bsState)
-{
- FXSYS_assert(pDoc && pOCGDict);
- CPDF_Dictionary *pOCProperties = pDoc->GetRoot()->GetDict(FX_BSTRC("OCProperties"));
- if (!pOCProperties) {
- return NULL;
- }
- CPDF_Array *pOCGs = pOCProperties->GetArray(FX_BSTRC("OCGs"));
- if (!pOCGs) {
- return NULL;
- }
- if (FPDFDOC_OCG_FindGroup(pOCGs, pOCGDict) < 0) {
- return NULL;
- }
- CPDF_Dictionary *pConfig = pOCProperties->GetDict(FX_BSTRC("D"));
- CPDF_Array *pConfigs = pOCProperties->GetArray(FX_BSTRC("Configs"));
- if (pConfigs) {
- CPDF_Dictionary *pFind;
- FX_INT32 iCount = pConfigs->GetCount();
- for (FX_INT32 i = 0; i < iCount; i ++) {
- pFind = pConfigs->GetDict(i);
- if (!pFind) {
- continue;
- }
- if (!FPDFDOC_OCG_HasIntent(pFind, FX_BSTRC("View"), FX_BSTRC("View"))) {
- continue;
- }
- pConfig = pFind;
- break;
- }
- }
- return pConfig;
-}
-static CFX_ByteString FPDFDOC_OCG_GetUsageTypeString(CPDF_OCContext::UsageType eType)
-{
- CFX_ByteString csState = FX_BSTRC("View");
- if (eType == CPDF_OCContext::Design) {
- csState = FX_BSTRC("Design");
- } else if (eType == CPDF_OCContext::Print) {
- csState = FX_BSTRC("Print");
- } else if (eType == CPDF_OCContext::Export) {
- csState = FX_BSTRC("Export");
- }
- return csState;
-}
-CPDF_OCContext::CPDF_OCContext(CPDF_Document *pDoc, UsageType eUsageType)
-{
- FXSYS_assert(pDoc != NULL);
- m_pDocument = pDoc;
- m_eUsageType = eUsageType;
-}
-CPDF_OCContext::~CPDF_OCContext()
-{
- m_OCGStates.RemoveAll();
-}
-FX_BOOL CPDF_OCContext::LoadOCGStateFromConfig(FX_BSTR csConfig, const CPDF_Dictionary *pOCGDict, FX_BOOL &bValidConfig) const
-{
- CPDF_Dictionary *pConfig = FPDFDOC_OCG_GetConfig(m_pDocument, pOCGDict, csConfig);
- if (!pConfig) {
- return TRUE;
- }
- bValidConfig = TRUE;
- FX_BOOL bState = pConfig->GetString(FX_BSTRC("BaseState"), FX_BSTRC("ON")) != FX_BSTRC("OFF");
- CPDF_Array *pArray = pConfig->GetArray(FX_BSTRC("ON"));
- if (pArray) {
- if (FPDFDOC_OCG_FindGroup(pArray, pOCGDict) >= 0) {
- bState = TRUE;
- }
- }
- pArray = pConfig->GetArray(FX_BSTRC("OFF"));
- if (pArray) {
- if (FPDFDOC_OCG_FindGroup(pArray, pOCGDict) >= 0) {
- bState = FALSE;
- }
- }
- pArray = pConfig->GetArray(FX_BSTRC("AS"));
- if (pArray) {
- CFX_ByteString csFind = csConfig + FX_BSTRC("State");
- FX_INT32 iCount = pArray->GetCount();
- for (FX_INT32 i = 0; i < iCount; i ++) {
- CPDF_Dictionary *pUsage = pArray->GetDict(i);
- if (!pUsage) {
- continue;
- }
- if (pUsage->GetString(FX_BSTRC("Event"), FX_BSTRC("View")) != csConfig) {
- continue;
- }
- CPDF_Array *pOCGs = pUsage->GetArray(FX_BSTRC("OCGs"));
- if (!pOCGs) {
- continue;
- }
- if (FPDFDOC_OCG_FindGroup(pOCGs, pOCGDict) < 0) {
- continue;
- }
- CPDF_Dictionary *pState = pUsage->GetDict(csConfig);
- if (!pState) {
- continue;
- }
- bState = pState->GetString(csFind) != FX_BSTRC("OFF");
- }
- }
- return bState;
-}
-FX_BOOL CPDF_OCContext::LoadOCGState(const CPDF_Dictionary *pOCGDict) const
-{
- if (!FPDFDOC_OCG_HasIntent(pOCGDict, FX_BSTRC("View"), FX_BSTRC("View"))) {
- return TRUE;
- }
- CFX_ByteString csState = FPDFDOC_OCG_GetUsageTypeString(m_eUsageType);
- CPDF_Dictionary *pUsage = pOCGDict->GetDict(FX_BSTRC("Usage"));
- if (pUsage) {
- CPDF_Dictionary *pState = pUsage->GetDict(csState);
- if (pState) {
- CFX_ByteString csFind = csState + FX_BSTRC("State");
- if (pState->KeyExist(csFind)) {
- return pState->GetString(csFind) != FX_BSTRC("OFF");
- }
- }
- if (csState != FX_BSTRC("View")) {
- pState = pUsage->GetDict(FX_BSTRC("View"));
- if (pState && pState->KeyExist(FX_BSTRC("ViewState"))) {
- return pState->GetString(FX_BSTRC("ViewState")) != FX_BSTRC("OFF");
- }
- }
- }
- FX_BOOL bDefValid = FALSE;
- return LoadOCGStateFromConfig(csState, pOCGDict, bDefValid);
-}
-FX_BOOL CPDF_OCContext::GetOCGVisible(const CPDF_Dictionary *pOCGDict)
-{
- if (!pOCGDict) {
- return FALSE;
- }
- FX_LPVOID bState = NULL;
- if (m_OCGStates.Lookup(pOCGDict, bState)) {
- return (FX_UINTPTR)bState != 0;
- }
- bState = (FX_LPVOID)(FX_UINTPTR)LoadOCGState(pOCGDict);
- m_OCGStates.SetAt(pOCGDict, bState);
- return (FX_UINTPTR)bState != 0;
-}
-FX_BOOL CPDF_OCContext::GetOCGVE(CPDF_Array *pExpression, FX_BOOL bFromConfig, int nLevel)
-{
- if (nLevel > 32) {
- return FALSE;
- }
- if (pExpression == NULL) {
- return FALSE;
- }
- FX_INT32 iCount = pExpression->GetCount();
- CPDF_Object *pOCGObj;
- CFX_ByteString csOperator = pExpression->GetString(0);
- if (csOperator == FX_BSTRC("Not")) {
- pOCGObj = pExpression->GetElementValue(1);
- if (pOCGObj == NULL) {
- return FALSE;
- }
- if (pOCGObj->GetType() == PDFOBJ_DICTIONARY) {
- return !(bFromConfig ? LoadOCGState((CPDF_Dictionary*)pOCGObj) : GetOCGVisible((CPDF_Dictionary*)pOCGObj));
- } else if (pOCGObj->GetType() == PDFOBJ_ARRAY) {
- return !GetOCGVE((CPDF_Array*)pOCGObj, bFromConfig, nLevel + 1);
- } else {
- return FALSE;
- }
- }
- if (csOperator == FX_BSTRC("Or") || csOperator == FX_BSTRC("And")) {
- FX_BOOL bValue = FALSE;
- for (FX_INT32 i = 1; i < iCount; i ++) {
- pOCGObj = pExpression->GetElementValue(1);
- if (pOCGObj == NULL) {
- continue;
- }
- FX_BOOL bItem = FALSE;
- if (pOCGObj->GetType() == PDFOBJ_DICTIONARY) {
- bItem = bFromConfig ? LoadOCGState((CPDF_Dictionary*)pOCGObj) : GetOCGVisible((CPDF_Dictionary*)pOCGObj);
- } else if (pOCGObj->GetType() == PDFOBJ_ARRAY) {
- bItem = GetOCGVE((CPDF_Array*)pOCGObj, bFromConfig, nLevel + 1);
- }
- if (i == 1) {
- bValue = bItem;
- } else {
- if (csOperator == FX_BSTRC("Or")) {
- bValue = bValue || bItem;
- } else {
- bValue = bValue && bItem;
- }
- }
- }
- return bValue;
- }
- return FALSE;
-}
-FX_BOOL CPDF_OCContext::LoadOCMDState(const CPDF_Dictionary *pOCMDDict, FX_BOOL bFromConfig)
-{
- FXSYS_assert(pOCMDDict != NULL);
- CPDF_Array *pVE = pOCMDDict->GetArray(FX_BSTRC("VE"));
- if (pVE != NULL) {
- return GetOCGVE(pVE, bFromConfig);
- }
- CFX_ByteString csP = pOCMDDict->GetString(FX_BSTRC("P"), FX_BSTRC("AnyOn"));
- CPDF_Object *pOCGObj = pOCMDDict->GetElementValue(FX_BSTRC("OCGs"));
- if (pOCGObj == NULL) {
- return TRUE;
- }
- if (pOCGObj->GetType() == PDFOBJ_DICTIONARY) {
- return bFromConfig ? LoadOCGState((CPDF_Dictionary*)pOCGObj) : GetOCGVisible((CPDF_Dictionary*)pOCGObj);
- }
- if (pOCGObj->GetType() != PDFOBJ_ARRAY) {
- return TRUE;
- }
- FX_BOOL bState = FALSE;
- if (csP == FX_BSTRC("AllOn") || csP == FX_BSTRC("AllOff")) {
- bState = TRUE;
- }
- FX_INT32 iCount = ((CPDF_Array*)pOCGObj)->GetCount();
- for (FX_INT32 i = 0; i < iCount; i ++) {
- FX_BOOL bItem = TRUE;
- CPDF_Dictionary* pItemDict = ((CPDF_Array*)pOCGObj)->GetDict(i);
- if (pItemDict) {
- bItem = bFromConfig ? LoadOCGState(pItemDict) : GetOCGVisible(pItemDict);
- }
- if (csP == FX_BSTRC("AnyOn") && bItem) {
- return TRUE;
- }
- if (csP == FX_BSTRC("AnyOff") && !bItem) {
- return TRUE;
- }
- if (csP == FX_BSTRC("AllOn") && !bItem) {
- return FALSE;
- }
- if (csP == FX_BSTRC("AllOff") && bItem) {
- return FALSE;
- }
- }
- return bState;
-}
-FX_BOOL CPDF_OCContext::CheckOCGVisible(const CPDF_Dictionary *pOCGDict)
-{
- if (pOCGDict == NULL) {
- return TRUE;
- }
- CFX_ByteString csType = pOCGDict->GetString(FX_BSTRC("Type"), FX_BSTRC("OCG"));
- if (csType == FX_BSTRC("OCG")) {
- return GetOCGVisible(pOCGDict);
- } else {
- return LoadOCMDState(pOCGDict, FALSE);
- }
-}
-void CPDF_OCContext::ResetOCContext()
-{
- m_OCGStates.RemoveAll();
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fpdfdoc/fpdf_doc.h"
+static FX_INT32 FPDFDOC_OCG_FindGroup(const CPDF_Object *pObject, const CPDF_Dictionary *pGroupDict)
+{
+ if (pObject == NULL || pGroupDict == NULL) {
+ return -1;
+ }
+ FX_INT32 iType = pObject->GetType();
+ if (iType == PDFOBJ_ARRAY) {
+ FX_DWORD dwCount = ((CPDF_Array*)pObject)->GetCount();
+ for (FX_DWORD i = 0; i < dwCount; i++) {
+ if (((CPDF_Array*)pObject)->GetDict(i) == pGroupDict) {
+ return i;
+ }
+ }
+ return -1;
+ }
+ if (pObject->GetDict() == pGroupDict) {
+ return 0;
+ }
+ return -1;
+}
+static FX_BOOL FPDFDOC_OCG_HasIntent(const CPDF_Dictionary *pDict, FX_BSTR csElement, FX_BSTR csDef = FX_BSTRC(""))
+{
+ FXSYS_assert(pDict != NULL);
+ CPDF_Object *pIntent = pDict->GetElementValue(FX_BSTRC("Intent"));
+ if (pIntent == NULL) {
+ return csElement == csDef;
+ }
+ CFX_ByteString bsIntent;
+ if (pIntent->GetType() == PDFOBJ_ARRAY) {
+ FX_DWORD dwCount = ((CPDF_Array*)pIntent)->GetCount();
+ for (FX_DWORD i = 0; i < dwCount; i++) {
+ bsIntent = ((CPDF_Array*)pIntent)->GetString(i);
+ if (bsIntent == FX_BSTRC("All") || bsIntent == csElement) {
+ return TRUE;
+ }
+ }
+ return FALSE;
+ }
+ bsIntent = pIntent->GetString();
+ return bsIntent == FX_BSTRC("All") || bsIntent == csElement;
+}
+static CPDF_Dictionary* FPDFDOC_OCG_GetConfig(CPDF_Document *pDoc, const CPDF_Dictionary *pOCGDict, FX_BSTR bsState)
+{
+ FXSYS_assert(pDoc && pOCGDict);
+ CPDF_Dictionary *pOCProperties = pDoc->GetRoot()->GetDict(FX_BSTRC("OCProperties"));
+ if (!pOCProperties) {
+ return NULL;
+ }
+ CPDF_Array *pOCGs = pOCProperties->GetArray(FX_BSTRC("OCGs"));
+ if (!pOCGs) {
+ return NULL;
+ }
+ if (FPDFDOC_OCG_FindGroup(pOCGs, pOCGDict) < 0) {
+ return NULL;
+ }
+ CPDF_Dictionary *pConfig = pOCProperties->GetDict(FX_BSTRC("D"));
+ CPDF_Array *pConfigs = pOCProperties->GetArray(FX_BSTRC("Configs"));
+ if (pConfigs) {
+ CPDF_Dictionary *pFind;
+ FX_INT32 iCount = pConfigs->GetCount();
+ for (FX_INT32 i = 0; i < iCount; i ++) {
+ pFind = pConfigs->GetDict(i);
+ if (!pFind) {
+ continue;
+ }
+ if (!FPDFDOC_OCG_HasIntent(pFind, FX_BSTRC("View"), FX_BSTRC("View"))) {
+ continue;
+ }
+ pConfig = pFind;
+ break;
+ }
+ }
+ return pConfig;
+}
+static CFX_ByteString FPDFDOC_OCG_GetUsageTypeString(CPDF_OCContext::UsageType eType)
+{
+ CFX_ByteString csState = FX_BSTRC("View");
+ if (eType == CPDF_OCContext::Design) {
+ csState = FX_BSTRC("Design");
+ } else if (eType == CPDF_OCContext::Print) {
+ csState = FX_BSTRC("Print");
+ } else if (eType == CPDF_OCContext::Export) {
+ csState = FX_BSTRC("Export");
+ }
+ return csState;
+}
+CPDF_OCContext::CPDF_OCContext(CPDF_Document *pDoc, UsageType eUsageType)
+{
+ FXSYS_assert(pDoc != NULL);
+ m_pDocument = pDoc;
+ m_eUsageType = eUsageType;
+}
+CPDF_OCContext::~CPDF_OCContext()
+{
+ m_OCGStates.RemoveAll();
+}
+FX_BOOL CPDF_OCContext::LoadOCGStateFromConfig(FX_BSTR csConfig, const CPDF_Dictionary *pOCGDict, FX_BOOL &bValidConfig) const
+{
+ CPDF_Dictionary *pConfig = FPDFDOC_OCG_GetConfig(m_pDocument, pOCGDict, csConfig);
+ if (!pConfig) {
+ return TRUE;
+ }
+ bValidConfig = TRUE;
+ FX_BOOL bState = pConfig->GetString(FX_BSTRC("BaseState"), FX_BSTRC("ON")) != FX_BSTRC("OFF");
+ CPDF_Array *pArray = pConfig->GetArray(FX_BSTRC("ON"));
+ if (pArray) {
+ if (FPDFDOC_OCG_FindGroup(pArray, pOCGDict) >= 0) {
+ bState = TRUE;
+ }
+ }
+ pArray = pConfig->GetArray(FX_BSTRC("OFF"));
+ if (pArray) {
+ if (FPDFDOC_OCG_FindGroup(pArray, pOCGDict) >= 0) {
+ bState = FALSE;
+ }
+ }
+ pArray = pConfig->GetArray(FX_BSTRC("AS"));
+ if (pArray) {
+ CFX_ByteString csFind = csConfig + FX_BSTRC("State");
+ FX_INT32 iCount = pArray->GetCount();
+ for (FX_INT32 i = 0; i < iCount; i ++) {
+ CPDF_Dictionary *pUsage = pArray->GetDict(i);
+ if (!pUsage) {
+ continue;
+ }
+ if (pUsage->GetString(FX_BSTRC("Event"), FX_BSTRC("View")) != csConfig) {
+ continue;
+ }
+ CPDF_Array *pOCGs = pUsage->GetArray(FX_BSTRC("OCGs"));
+ if (!pOCGs) {
+ continue;
+ }
+ if (FPDFDOC_OCG_FindGroup(pOCGs, pOCGDict) < 0) {
+ continue;
+ }
+ CPDF_Dictionary *pState = pUsage->GetDict(csConfig);
+ if (!pState) {
+ continue;
+ }
+ bState = pState->GetString(csFind) != FX_BSTRC("OFF");
+ }
+ }
+ return bState;
+}
+FX_BOOL CPDF_OCContext::LoadOCGState(const CPDF_Dictionary *pOCGDict) const
+{
+ if (!FPDFDOC_OCG_HasIntent(pOCGDict, FX_BSTRC("View"), FX_BSTRC("View"))) {
+ return TRUE;
+ }
+ CFX_ByteString csState = FPDFDOC_OCG_GetUsageTypeString(m_eUsageType);
+ CPDF_Dictionary *pUsage = pOCGDict->GetDict(FX_BSTRC("Usage"));
+ if (pUsage) {
+ CPDF_Dictionary *pState = pUsage->GetDict(csState);
+ if (pState) {
+ CFX_ByteString csFind = csState + FX_BSTRC("State");
+ if (pState->KeyExist(csFind)) {
+ return pState->GetString(csFind) != FX_BSTRC("OFF");
+ }
+ }
+ if (csState != FX_BSTRC("View")) {
+ pState = pUsage->GetDict(FX_BSTRC("View"));
+ if (pState && pState->KeyExist(FX_BSTRC("ViewState"))) {
+ return pState->GetString(FX_BSTRC("ViewState")) != FX_BSTRC("OFF");
+ }
+ }
+ }
+ FX_BOOL bDefValid = FALSE;
+ return LoadOCGStateFromConfig(csState, pOCGDict, bDefValid);
+}
+FX_BOOL CPDF_OCContext::GetOCGVisible(const CPDF_Dictionary *pOCGDict)
+{
+ if (!pOCGDict) {
+ return FALSE;
+ }
+ FX_LPVOID bState = NULL;
+ if (m_OCGStates.Lookup(pOCGDict, bState)) {
+ return (FX_UINTPTR)bState != 0;
+ }
+ bState = (FX_LPVOID)(FX_UINTPTR)LoadOCGState(pOCGDict);
+ m_OCGStates.SetAt(pOCGDict, bState);
+ return (FX_UINTPTR)bState != 0;
+}
+FX_BOOL CPDF_OCContext::GetOCGVE(CPDF_Array *pExpression, FX_BOOL bFromConfig, int nLevel)
+{
+ if (nLevel > 32) {
+ return FALSE;
+ }
+ if (pExpression == NULL) {
+ return FALSE;
+ }
+ FX_INT32 iCount = pExpression->GetCount();
+ CPDF_Object *pOCGObj;
+ CFX_ByteString csOperator = pExpression->GetString(0);
+ if (csOperator == FX_BSTRC("Not")) {
+ pOCGObj = pExpression->GetElementValue(1);
+ if (pOCGObj == NULL) {
+ return FALSE;
+ }
+ if (pOCGObj->GetType() == PDFOBJ_DICTIONARY) {
+ return !(bFromConfig ? LoadOCGState((CPDF_Dictionary*)pOCGObj) : GetOCGVisible((CPDF_Dictionary*)pOCGObj));
+ } else if (pOCGObj->GetType() == PDFOBJ_ARRAY) {
+ return !GetOCGVE((CPDF_Array*)pOCGObj, bFromConfig, nLevel + 1);
+ } else {
+ return FALSE;
+ }
+ }
+ if (csOperator == FX_BSTRC("Or") || csOperator == FX_BSTRC("And")) {
+ FX_BOOL bValue = FALSE;
+ for (FX_INT32 i = 1; i < iCount; i ++) {
+ pOCGObj = pExpression->GetElementValue(1);
+ if (pOCGObj == NULL) {
+ continue;
+ }
+ FX_BOOL bItem = FALSE;
+ if (pOCGObj->GetType() == PDFOBJ_DICTIONARY) {
+ bItem = bFromConfig ? LoadOCGState((CPDF_Dictionary*)pOCGObj) : GetOCGVisible((CPDF_Dictionary*)pOCGObj);
+ } else if (pOCGObj->GetType() == PDFOBJ_ARRAY) {
+ bItem = GetOCGVE((CPDF_Array*)pOCGObj, bFromConfig, nLevel + 1);
+ }
+ if (i == 1) {
+ bValue = bItem;
+ } else {
+ if (csOperator == FX_BSTRC("Or")) {
+ bValue = bValue || bItem;
+ } else {
+ bValue = bValue && bItem;
+ }
+ }
+ }
+ return bValue;
+ }
+ return FALSE;
+}
+FX_BOOL CPDF_OCContext::LoadOCMDState(const CPDF_Dictionary *pOCMDDict, FX_BOOL bFromConfig)
+{
+ FXSYS_assert(pOCMDDict != NULL);
+ CPDF_Array *pVE = pOCMDDict->GetArray(FX_BSTRC("VE"));
+ if (pVE != NULL) {
+ return GetOCGVE(pVE, bFromConfig);
+ }
+ CFX_ByteString csP = pOCMDDict->GetString(FX_BSTRC("P"), FX_BSTRC("AnyOn"));
+ CPDF_Object *pOCGObj = pOCMDDict->GetElementValue(FX_BSTRC("OCGs"));
+ if (pOCGObj == NULL) {
+ return TRUE;
+ }
+ if (pOCGObj->GetType() == PDFOBJ_DICTIONARY) {
+ return bFromConfig ? LoadOCGState((CPDF_Dictionary*)pOCGObj) : GetOCGVisible((CPDF_Dictionary*)pOCGObj);
+ }
+ if (pOCGObj->GetType() != PDFOBJ_ARRAY) {
+ return TRUE;
+ }
+ FX_BOOL bState = FALSE;
+ if (csP == FX_BSTRC("AllOn") || csP == FX_BSTRC("AllOff")) {
+ bState = TRUE;
+ }
+ FX_INT32 iCount = ((CPDF_Array*)pOCGObj)->GetCount();
+ for (FX_INT32 i = 0; i < iCount; i ++) {
+ FX_BOOL bItem = TRUE;
+ CPDF_Dictionary* pItemDict = ((CPDF_Array*)pOCGObj)->GetDict(i);
+ if (pItemDict) {
+ bItem = bFromConfig ? LoadOCGState(pItemDict) : GetOCGVisible(pItemDict);
+ }
+ if (csP == FX_BSTRC("AnyOn") && bItem) {
+ return TRUE;
+ }
+ if (csP == FX_BSTRC("AnyOff") && !bItem) {
+ return TRUE;
+ }
+ if (csP == FX_BSTRC("AllOn") && !bItem) {
+ return FALSE;
+ }
+ if (csP == FX_BSTRC("AllOff") && bItem) {
+ return FALSE;
+ }
+ }
+ return bState;
+}
+FX_BOOL CPDF_OCContext::CheckOCGVisible(const CPDF_Dictionary *pOCGDict)
+{
+ if (pOCGDict == NULL) {
+ return TRUE;
+ }
+ CFX_ByteString csType = pOCGDict->GetString(FX_BSTRC("Type"), FX_BSTRC("OCG"));
+ if (csType == FX_BSTRC("OCG")) {
+ return GetOCGVisible(pOCGDict);
+ } else {
+ return LoadOCMDState(pOCGDict, FALSE);
+ }
+}
+void CPDF_OCContext::ResetOCContext()
+{
+ m_OCGStates.RemoveAll();
+}
diff --git a/core/src/fpdfdoc/doc_tagged.cpp b/core/src/fpdfdoc/doc_tagged.cpp
index 95ae8d581e..551042037b 100644
--- a/core/src/fpdfdoc/doc_tagged.cpp
+++ b/core/src/fpdfdoc/doc_tagged.cpp
@@ -1,448 +1,448 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../include/fpdfapi/fpdf_parser.h"
-#include "../../include/fpdfapi/fpdf_page.h"
-#include "../../include/fpdfdoc/fpdf_tagged.h"
-#include "tagged_int.h"
-const int nMaxRecursion = 32;
-static FX_BOOL IsTagged(const CPDF_Document* pDoc)
-{
- CPDF_Dictionary* pCatalog = pDoc->GetRoot();
- CPDF_Dictionary* pMarkInfo = pCatalog->GetDict(FX_BSTRC("MarkInfo"));
- return pMarkInfo != NULL && pMarkInfo->GetInteger(FX_BSTRC("Marked"));
-}
-CPDF_StructTree* CPDF_StructTree::LoadPage(const CPDF_Document* pDoc, const CPDF_Dictionary* pPageDict)
-{
- if (!IsTagged(pDoc)) {
- return NULL;
- }
- CPDF_StructTreeImpl* pTree = FX_NEW CPDF_StructTreeImpl(pDoc);
- if (pTree == NULL) {
- return NULL;
- }
- pTree->LoadPageTree(pPageDict);
- return pTree;
-}
-CPDF_StructTree* CPDF_StructTree::LoadDoc(const CPDF_Document* pDoc)
-{
- if (!IsTagged(pDoc)) {
- return NULL;
- }
- CPDF_StructTreeImpl* pTree = FX_NEW CPDF_StructTreeImpl(pDoc);
- if (pTree == NULL) {
- return NULL;
- }
- pTree->LoadDocTree();
- return pTree;
-}
-CPDF_StructTreeImpl::CPDF_StructTreeImpl(const CPDF_Document* pDoc)
-{
- CPDF_Dictionary* pCatalog = pDoc->GetRoot();
- m_pTreeRoot = pCatalog->GetDict(FX_BSTRC("StructTreeRoot"));
- if (m_pTreeRoot == NULL) {
- return;
- }
- m_pRoleMap = m_pTreeRoot->GetDict(FX_BSTRC("RoleMap"));
-}
-CPDF_StructTreeImpl::~CPDF_StructTreeImpl()
-{
- for (int i = 0; i < m_Kids.GetSize(); i ++)
- if (m_Kids[i]) {
- m_Kids[i]->Release();
- }
-}
-void CPDF_StructTreeImpl::LoadDocTree()
-{
- m_pPage = NULL;
- if (m_pTreeRoot == NULL) {
- return;
- }
- CPDF_Object* pKids = m_pTreeRoot->GetElementValue(FX_BSTRC("K"));
- if (pKids == NULL) {
- return;
- }
- if (pKids->GetType() == PDFOBJ_DICTIONARY) {
- CPDF_StructElementImpl* pStructElementImpl = FX_NEW CPDF_StructElementImpl(this, NULL, (CPDF_Dictionary*)pKids);
- if (pStructElementImpl == NULL) {
- return;
- }
- m_Kids.Add(pStructElementImpl);
- return;
- }
- if (pKids->GetType() != PDFOBJ_ARRAY) {
- return;
- }
- CPDF_Array* pArray = (CPDF_Array*)pKids;
- for (FX_DWORD i = 0; i < pArray->GetCount(); i ++) {
- CPDF_Dictionary* pKid = pArray->GetDict(i);
- CPDF_StructElementImpl* pStructElementImpl = FX_NEW CPDF_StructElementImpl(this, NULL, pKid);
- if (pStructElementImpl == NULL) {
- return;
- }
- m_Kids.Add(pStructElementImpl);
- }
-}
-void CPDF_StructTreeImpl::LoadPageTree(const CPDF_Dictionary* pPageDict)
-{
- m_pPage = pPageDict;
- if (m_pTreeRoot == NULL) {
- return;
- }
- CPDF_Object* pKids = m_pTreeRoot->GetElementValue(FX_BSTRC("K"));
- if (pKids == NULL) {
- return;
- }
- FX_DWORD dwKids = 0;
- if (pKids->GetType() == PDFOBJ_DICTIONARY) {
- dwKids = 1;
- } else if (pKids->GetType() == PDFOBJ_ARRAY) {
- dwKids = ((CPDF_Array*)pKids)->GetCount();
- } else {
- return;
- }
- FX_DWORD i;
- m_Kids.SetSize(dwKids);
- for (i = 0; i < dwKids; i ++) {
- m_Kids[i] = NULL;
- }
- CFX_MapPtrToPtr element_map;
- CPDF_Dictionary* pParentTree = m_pTreeRoot->GetDict(FX_BSTRC("ParentTree"));
- if (pParentTree == NULL) {
- return;
- }
- CPDF_NumberTree parent_tree(pParentTree);
- int parents_id = pPageDict->GetInteger(FX_BSTRC("StructParents"), -1);
- if (parents_id >= 0) {
- CPDF_Object* pParents = parent_tree.LookupValue(parents_id);
- if (pParents == NULL || pParents->GetType() != PDFOBJ_ARRAY) {
- return;
- }
- CPDF_Array* pParentArray = (CPDF_Array*)pParents;
- for (i = 0; i < pParentArray->GetCount(); i ++) {
- CPDF_Dictionary* pParent = pParentArray->GetDict(i);
- if (pParent == NULL) {
- continue;
- }
- AddPageNode(pParent, element_map);
- }
- }
-}
-CPDF_StructElementImpl* CPDF_StructTreeImpl::AddPageNode(CPDF_Dictionary* pDict, CFX_MapPtrToPtr& map, int nLevel)
-{
- if (nLevel > nMaxRecursion) {
- return NULL;
- }
- CPDF_StructElementImpl* pElement = NULL;
- if (map.Lookup(pDict, (FX_LPVOID&)pElement)) {
- return pElement;
- }
- pElement = FX_NEW CPDF_StructElementImpl(this, NULL, pDict);
- if (pElement == NULL) {
- return NULL;
- }
- map.SetAt(pDict, pElement);
- CPDF_Dictionary* pParent = pDict->GetDict(FX_BSTRC("P"));
- if (pParent == NULL || pParent->GetString(FX_BSTRC("Type")) == FX_BSTRC("StructTreeRoot")) {
- if (!AddTopLevelNode(pDict, pElement)) {
- pElement->Release();
- map.RemoveKey(pDict);
- }
- } else {
- CPDF_StructElementImpl* pParentElement = AddPageNode(pParent, map, nLevel + 1);
- FX_BOOL bSave = FALSE;
- for (int i = 0; i < pParentElement->m_Kids.GetSize(); i ++) {
- if (pParentElement->m_Kids[i].m_Type != CPDF_StructKid::Element) {
- continue;
- }
- if (pParentElement->m_Kids[i].m_Element.m_pDict != pDict) {
- continue;
- }
- pParentElement->m_Kids[i].m_Element.m_pElement = pElement->Retain();
- bSave = TRUE;
- }
- if (!bSave) {
- pElement->Release();
- map.RemoveKey(pDict);
- }
- }
- return pElement;
-}
-FX_BOOL CPDF_StructTreeImpl::AddTopLevelNode(CPDF_Dictionary* pDict, CPDF_StructElementImpl* pElement)
-{
- CPDF_Object *pObj = m_pTreeRoot->GetElementValue(FX_BSTRC("K"));
- if (!pObj) {
- return FALSE;
- }
- if (pObj->GetType() == PDFOBJ_DICTIONARY) {
- if (pObj->GetObjNum() == pDict->GetObjNum()) {
- if (m_Kids[0]) {
- m_Kids[0]->Release();
- }
- m_Kids[0] = pElement->Retain();
- } else {
- return FALSE;
- }
- }
- if (pObj->GetType() == PDFOBJ_ARRAY) {
- CPDF_Array* pTopKids = (CPDF_Array*)pObj;
- FX_DWORD i;
- FX_BOOL bSave = FALSE;
- for (i = 0; i < pTopKids->GetCount(); i ++) {
- CPDF_Reference* pKidRef = (CPDF_Reference*)pTopKids->GetElement(i);
- if (pKidRef->GetType() != PDFOBJ_REFERENCE || pKidRef->GetRefObjNum() != pDict->GetObjNum()) {
- continue;
- }
- if (m_Kids[i]) {
- m_Kids[i]->Release();
- }
- m_Kids[i] = pElement->Retain();
- bSave = TRUE;
- }
- if (!bSave) {
- return FALSE;
- }
- }
- return TRUE;
-}
-CPDF_StructElementImpl::CPDF_StructElementImpl(CPDF_StructTreeImpl* pTree, CPDF_StructElementImpl* pParent, CPDF_Dictionary* pDict)
- : m_RefCount(0)
-{
- m_pTree = pTree;
- m_pDict = pDict;
- m_Type = pDict->GetString(FX_BSTRC("S"));
- CFX_ByteString mapped = pTree->m_pRoleMap->GetString(m_Type);
- if (!mapped.IsEmpty()) {
- m_Type = mapped;
- }
- m_pParent = pParent;
- LoadKids(pDict);
-}
-CPDF_StructElementImpl::~CPDF_StructElementImpl()
-{
- for (int i = 0; i < m_Kids.GetSize(); i ++) {
- if (m_Kids[i].m_Type == CPDF_StructKid::Element && m_Kids[i].m_Element.m_pElement) {
- ((CPDF_StructElementImpl*)m_Kids[i].m_Element.m_pElement)->Release();
- }
- }
-}
-CPDF_StructElementImpl* CPDF_StructElementImpl::Retain()
-{
- m_RefCount++;
- return this;
-}
-void CPDF_StructElementImpl::Release()
-{
- if(--m_RefCount < 1) {
- delete this;
- }
-}
-void CPDF_StructElementImpl::LoadKids(CPDF_Dictionary* pDict)
-{
- CPDF_Object* pObj = pDict->GetElement(FX_BSTRC("Pg"));
- FX_DWORD PageObjNum = 0;
- if (pObj && pObj->GetType() == PDFOBJ_REFERENCE) {
- PageObjNum = ((CPDF_Reference*)pObj)->GetRefObjNum();
- }
- CPDF_Object* pKids = pDict->GetElementValue(FX_BSTRC("K"));
- if (pKids == NULL) {
- return;
- }
- if (pKids->GetType() == PDFOBJ_ARRAY) {
- CPDF_Array* pArray = (CPDF_Array*)pKids;
- m_Kids.SetSize(pArray->GetCount());
- for (FX_DWORD i = 0; i < pArray->GetCount(); i ++) {
- CPDF_Object* pKid = pArray->GetElementValue(i);
- LoadKid(PageObjNum, pKid, &m_Kids[i]);
- }
- } else {
- m_Kids.SetSize(1);
- LoadKid(PageObjNum, pKids, &m_Kids[0]);
- }
-}
-void CPDF_StructElementImpl::LoadKid(FX_DWORD PageObjNum, CPDF_Object* pKidObj, CPDF_StructKid* pKid)
-{
- pKid->m_Type = CPDF_StructKid::Invalid;
- if (pKidObj == NULL) {
- return;
- }
- if (pKidObj->GetType() == PDFOBJ_NUMBER) {
- if (m_pTree->m_pPage && m_pTree->m_pPage->GetObjNum() != PageObjNum) {
- return;
- }
- pKid->m_Type = CPDF_StructKid::PageContent;
- pKid->m_PageContent.m_ContentId = pKidObj->GetInteger();
- pKid->m_PageContent.m_PageObjNum = PageObjNum;
- return;
- }
- if (pKidObj->GetType() != PDFOBJ_DICTIONARY) {
- return;
- }
- CPDF_Dictionary* pKidDict = (CPDF_Dictionary*)pKidObj;
- CPDF_Object* pPageObj = pKidDict->GetElement(FX_BSTRC("Pg"));
- if (pPageObj && pPageObj->GetType() == PDFOBJ_REFERENCE) {
- PageObjNum = ((CPDF_Reference*)pPageObj)->GetRefObjNum();
- }
- CFX_ByteString type = pKidDict->GetString(FX_BSTRC("Type"));
- if (type == FX_BSTRC("MCR")) {
- if (m_pTree->m_pPage && m_pTree->m_pPage->GetObjNum() != PageObjNum) {
- return;
- }
- pKid->m_Type = CPDF_StructKid::StreamContent;
- CPDF_Object* pStreamObj = pKidDict->GetElement(FX_BSTRC("Stm"));
- if (pStreamObj && pStreamObj->GetType() == PDFOBJ_REFERENCE) {
- pKid->m_StreamContent.m_RefObjNum = ((CPDF_Reference*)pStreamObj)->GetRefObjNum();
- } else {
- pKid->m_StreamContent.m_RefObjNum = 0;
- }
- pKid->m_StreamContent.m_PageObjNum = PageObjNum;
- pKid->m_StreamContent.m_ContentId = pKidDict->GetInteger(FX_BSTRC("MCID"));
- } else if (type == FX_BSTRC("OBJR")) {
- if (m_pTree->m_pPage && m_pTree->m_pPage->GetObjNum() != PageObjNum) {
- return;
- }
- pKid->m_Type = CPDF_StructKid::Object;
- CPDF_Object* pObj = pKidDict->GetElement(FX_BSTRC("Obj"));
- if (pObj && pObj->GetType() == PDFOBJ_REFERENCE) {
- pKid->m_Object.m_RefObjNum = ((CPDF_Reference*)pObj)->GetRefObjNum();
- } else {
- pKid->m_Object.m_RefObjNum = 0;
- }
- pKid->m_Object.m_PageObjNum = PageObjNum;
- } else {
- pKid->m_Type = CPDF_StructKid::Element;
- pKid->m_Element.m_pDict = pKidDict;
- if (m_pTree->m_pPage == NULL) {
- pKid->m_Element.m_pElement = FX_NEW CPDF_StructElementImpl(m_pTree, this, pKidDict);
- } else {
- pKid->m_Element.m_pElement = NULL;
- }
- }
-}
-static CPDF_Dictionary* FindAttrDict(CPDF_Object* pAttrs, FX_BSTR owner, FX_FLOAT nLevel = 0.0F)
-{
- if (nLevel > nMaxRecursion) {
- return NULL;
- }
- if (pAttrs == NULL) {
- return NULL;
- }
- CPDF_Dictionary* pDict = NULL;
- if (pAttrs->GetType() == PDFOBJ_DICTIONARY) {
- pDict = (CPDF_Dictionary*)pAttrs;
- } else if (pAttrs->GetType() == PDFOBJ_STREAM) {
- pDict = ((CPDF_Stream*)pAttrs)->GetDict();
- } else if (pAttrs->GetType() == PDFOBJ_ARRAY) {
- CPDF_Array* pArray = (CPDF_Array*)pAttrs;
- for (FX_DWORD i = 0; i < pArray->GetCount(); i ++) {
- CPDF_Object* pElement = pArray->GetElementValue(i);
- pDict = FindAttrDict(pElement, owner, nLevel + 1);
- if (pDict) {
- return pDict;
- }
- }
- }
- if (pDict && pDict->GetString(FX_BSTRC("O")) == owner) {
- return pDict;
- }
- return NULL;
-}
-CPDF_Object* CPDF_StructElementImpl::GetAttr(FX_BSTR owner, FX_BSTR name, FX_BOOL bInheritable, FX_FLOAT fLevel)
-{
- if (fLevel > nMaxRecursion) {
- return NULL;
- }
- if (bInheritable) {
- CPDF_Object* pAttr = GetAttr(owner, name, FALSE);
- if (pAttr) {
- return pAttr;
- }
- if (m_pParent == NULL) {
- return NULL;
- }
- return m_pParent->GetAttr(owner, name, TRUE, fLevel + 1);
- }
- CPDF_Object* pA = m_pDict->GetElementValue(FX_BSTRC("A"));
- if (pA) {
- CPDF_Dictionary* pAttrDict = FindAttrDict(pA, owner);
- if (pAttrDict) {
- CPDF_Object* pAttr = pAttrDict->GetElementValue(name);
- if (pAttr) {
- return pAttr;
- }
- }
- }
- CPDF_Object* pC = m_pDict->GetElementValue(FX_BSTRC("C"));
- if (pC == NULL) {
- return NULL;
- }
- CPDF_Dictionary* pClassMap = m_pTree->m_pTreeRoot->GetDict(FX_BSTRC("ClassMap"));
- if (pClassMap == NULL) {
- return NULL;
- }
- if (pC->GetType() == PDFOBJ_ARRAY) {
- CPDF_Array* pArray = (CPDF_Array*)pC;
- for (FX_DWORD i = 0; i < pArray->GetCount(); i ++) {
- CFX_ByteString class_name = pArray->GetString(i);
- CPDF_Dictionary* pClassDict = pClassMap->GetDict(class_name);
- if (pClassDict && pClassDict->GetString(FX_BSTRC("O")) == owner) {
- return pClassDict->GetElementValue(name);
- }
- }
- return NULL;
- }
- CFX_ByteString class_name = pC->GetString();
- CPDF_Dictionary* pClassDict = pClassMap->GetDict(class_name);
- if (pClassDict && pClassDict->GetString(FX_BSTRC("O")) == owner) {
- return pClassDict->GetElementValue(name);
- }
- return NULL;
-}
-CPDF_Object* CPDF_StructElementImpl::GetAttr(FX_BSTR owner, FX_BSTR name, FX_BOOL bInheritable, int subindex)
-{
- CPDF_Object* pAttr = GetAttr(owner, name, bInheritable);
- if (pAttr == NULL || subindex == -1 || pAttr->GetType() != PDFOBJ_ARRAY) {
- return pAttr;
- }
- CPDF_Array* pArray = (CPDF_Array*)pAttr;
- if (subindex >= (int)pArray->GetCount()) {
- return pAttr;
- }
- return pArray->GetElementValue(subindex);
-}
-CFX_ByteString CPDF_StructElementImpl::GetName(FX_BSTR owner, FX_BSTR name, FX_BSTR default_value, FX_BOOL bInheritable, int subindex)
-{
- CPDF_Object* pAttr = GetAttr(owner, name, bInheritable, subindex);
- if (pAttr == NULL || pAttr->GetType() != PDFOBJ_NAME) {
- return default_value;
- }
- return pAttr->GetString();
-}
-FX_ARGB CPDF_StructElementImpl::GetColor(FX_BSTR owner, FX_BSTR name, FX_ARGB default_value, FX_BOOL bInheritable, int subindex)
-{
- CPDF_Object* pAttr = GetAttr(owner, name, bInheritable, subindex);
- if (pAttr == NULL || pAttr->GetType() != PDFOBJ_ARRAY) {
- return default_value;
- }
- CPDF_Array* pArray = (CPDF_Array*)pAttr;
- return 0xff000000 | ((int)(pArray->GetNumber(0) * 255) << 16) | ((int)(pArray->GetNumber(1) * 255) << 8) | (int)(pArray->GetNumber(2) * 255);
-}
-FX_FLOAT CPDF_StructElementImpl::GetNumber(FX_BSTR owner, FX_BSTR name, FX_FLOAT default_value, FX_BOOL bInheritable, int subindex)
-{
- CPDF_Object* pAttr = GetAttr(owner, name, bInheritable, subindex);
- if (pAttr == NULL || pAttr->GetType() != PDFOBJ_NUMBER) {
- return default_value;
- }
- return pAttr->GetNumber();
-}
-int CPDF_StructElementImpl::GetInteger(FX_BSTR owner, FX_BSTR name, int default_value, FX_BOOL bInheritable, int subindex)
-{
- CPDF_Object* pAttr = GetAttr(owner, name, bInheritable, subindex);
- if (pAttr == NULL || pAttr->GetType() != PDFOBJ_NUMBER) {
- return default_value;
- }
- return pAttr->GetInteger();
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fpdfapi/fpdf_parser.h"
+#include "../../include/fpdfapi/fpdf_page.h"
+#include "../../include/fpdfdoc/fpdf_tagged.h"
+#include "tagged_int.h"
+const int nMaxRecursion = 32;
+static FX_BOOL IsTagged(const CPDF_Document* pDoc)
+{
+ CPDF_Dictionary* pCatalog = pDoc->GetRoot();
+ CPDF_Dictionary* pMarkInfo = pCatalog->GetDict(FX_BSTRC("MarkInfo"));
+ return pMarkInfo != NULL && pMarkInfo->GetInteger(FX_BSTRC("Marked"));
+}
+CPDF_StructTree* CPDF_StructTree::LoadPage(const CPDF_Document* pDoc, const CPDF_Dictionary* pPageDict)
+{
+ if (!IsTagged(pDoc)) {
+ return NULL;
+ }
+ CPDF_StructTreeImpl* pTree = FX_NEW CPDF_StructTreeImpl(pDoc);
+ if (pTree == NULL) {
+ return NULL;
+ }
+ pTree->LoadPageTree(pPageDict);
+ return pTree;
+}
+CPDF_StructTree* CPDF_StructTree::LoadDoc(const CPDF_Document* pDoc)
+{
+ if (!IsTagged(pDoc)) {
+ return NULL;
+ }
+ CPDF_StructTreeImpl* pTree = FX_NEW CPDF_StructTreeImpl(pDoc);
+ if (pTree == NULL) {
+ return NULL;
+ }
+ pTree->LoadDocTree();
+ return pTree;
+}
+CPDF_StructTreeImpl::CPDF_StructTreeImpl(const CPDF_Document* pDoc)
+{
+ CPDF_Dictionary* pCatalog = pDoc->GetRoot();
+ m_pTreeRoot = pCatalog->GetDict(FX_BSTRC("StructTreeRoot"));
+ if (m_pTreeRoot == NULL) {
+ return;
+ }
+ m_pRoleMap = m_pTreeRoot->GetDict(FX_BSTRC("RoleMap"));
+}
+CPDF_StructTreeImpl::~CPDF_StructTreeImpl()
+{
+ for (int i = 0; i < m_Kids.GetSize(); i ++)
+ if (m_Kids[i]) {
+ m_Kids[i]->Release();
+ }
+}
+void CPDF_StructTreeImpl::LoadDocTree()
+{
+ m_pPage = NULL;
+ if (m_pTreeRoot == NULL) {
+ return;
+ }
+ CPDF_Object* pKids = m_pTreeRoot->GetElementValue(FX_BSTRC("K"));
+ if (pKids == NULL) {
+ return;
+ }
+ if (pKids->GetType() == PDFOBJ_DICTIONARY) {
+ CPDF_StructElementImpl* pStructElementImpl = FX_NEW CPDF_StructElementImpl(this, NULL, (CPDF_Dictionary*)pKids);
+ if (pStructElementImpl == NULL) {
+ return;
+ }
+ m_Kids.Add(pStructElementImpl);
+ return;
+ }
+ if (pKids->GetType() != PDFOBJ_ARRAY) {
+ return;
+ }
+ CPDF_Array* pArray = (CPDF_Array*)pKids;
+ for (FX_DWORD i = 0; i < pArray->GetCount(); i ++) {
+ CPDF_Dictionary* pKid = pArray->GetDict(i);
+ CPDF_StructElementImpl* pStructElementImpl = FX_NEW CPDF_StructElementImpl(this, NULL, pKid);
+ if (pStructElementImpl == NULL) {
+ return;
+ }
+ m_Kids.Add(pStructElementImpl);
+ }
+}
+void CPDF_StructTreeImpl::LoadPageTree(const CPDF_Dictionary* pPageDict)
+{
+ m_pPage = pPageDict;
+ if (m_pTreeRoot == NULL) {
+ return;
+ }
+ CPDF_Object* pKids = m_pTreeRoot->GetElementValue(FX_BSTRC("K"));
+ if (pKids == NULL) {
+ return;
+ }
+ FX_DWORD dwKids = 0;
+ if (pKids->GetType() == PDFOBJ_DICTIONARY) {
+ dwKids = 1;
+ } else if (pKids->GetType() == PDFOBJ_ARRAY) {
+ dwKids = ((CPDF_Array*)pKids)->GetCount();
+ } else {
+ return;
+ }
+ FX_DWORD i;
+ m_Kids.SetSize(dwKids);
+ for (i = 0; i < dwKids; i ++) {
+ m_Kids[i] = NULL;
+ }
+ CFX_MapPtrToPtr element_map;
+ CPDF_Dictionary* pParentTree = m_pTreeRoot->GetDict(FX_BSTRC("ParentTree"));
+ if (pParentTree == NULL) {
+ return;
+ }
+ CPDF_NumberTree parent_tree(pParentTree);
+ int parents_id = pPageDict->GetInteger(FX_BSTRC("StructParents"), -1);
+ if (parents_id >= 0) {
+ CPDF_Object* pParents = parent_tree.LookupValue(parents_id);
+ if (pParents == NULL || pParents->GetType() != PDFOBJ_ARRAY) {
+ return;
+ }
+ CPDF_Array* pParentArray = (CPDF_Array*)pParents;
+ for (i = 0; i < pParentArray->GetCount(); i ++) {
+ CPDF_Dictionary* pParent = pParentArray->GetDict(i);
+ if (pParent == NULL) {
+ continue;
+ }
+ AddPageNode(pParent, element_map);
+ }
+ }
+}
+CPDF_StructElementImpl* CPDF_StructTreeImpl::AddPageNode(CPDF_Dictionary* pDict, CFX_MapPtrToPtr& map, int nLevel)
+{
+ if (nLevel > nMaxRecursion) {
+ return NULL;
+ }
+ CPDF_StructElementImpl* pElement = NULL;
+ if (map.Lookup(pDict, (FX_LPVOID&)pElement)) {
+ return pElement;
+ }
+ pElement = FX_NEW CPDF_StructElementImpl(this, NULL, pDict);
+ if (pElement == NULL) {
+ return NULL;
+ }
+ map.SetAt(pDict, pElement);
+ CPDF_Dictionary* pParent = pDict->GetDict(FX_BSTRC("P"));
+ if (pParent == NULL || pParent->GetString(FX_BSTRC("Type")) == FX_BSTRC("StructTreeRoot")) {
+ if (!AddTopLevelNode(pDict, pElement)) {
+ pElement->Release();
+ map.RemoveKey(pDict);
+ }
+ } else {
+ CPDF_StructElementImpl* pParentElement = AddPageNode(pParent, map, nLevel + 1);
+ FX_BOOL bSave = FALSE;
+ for (int i = 0; i < pParentElement->m_Kids.GetSize(); i ++) {
+ if (pParentElement->m_Kids[i].m_Type != CPDF_StructKid::Element) {
+ continue;
+ }
+ if (pParentElement->m_Kids[i].m_Element.m_pDict != pDict) {
+ continue;
+ }
+ pParentElement->m_Kids[i].m_Element.m_pElement = pElement->Retain();
+ bSave = TRUE;
+ }
+ if (!bSave) {
+ pElement->Release();
+ map.RemoveKey(pDict);
+ }
+ }
+ return pElement;
+}
+FX_BOOL CPDF_StructTreeImpl::AddTopLevelNode(CPDF_Dictionary* pDict, CPDF_StructElementImpl* pElement)
+{
+ CPDF_Object *pObj = m_pTreeRoot->GetElementValue(FX_BSTRC("K"));
+ if (!pObj) {
+ return FALSE;
+ }
+ if (pObj->GetType() == PDFOBJ_DICTIONARY) {
+ if (pObj->GetObjNum() == pDict->GetObjNum()) {
+ if (m_Kids[0]) {
+ m_Kids[0]->Release();
+ }
+ m_Kids[0] = pElement->Retain();
+ } else {
+ return FALSE;
+ }
+ }
+ if (pObj->GetType() == PDFOBJ_ARRAY) {
+ CPDF_Array* pTopKids = (CPDF_Array*)pObj;
+ FX_DWORD i;
+ FX_BOOL bSave = FALSE;
+ for (i = 0; i < pTopKids->GetCount(); i ++) {
+ CPDF_Reference* pKidRef = (CPDF_Reference*)pTopKids->GetElement(i);
+ if (pKidRef->GetType() != PDFOBJ_REFERENCE || pKidRef->GetRefObjNum() != pDict->GetObjNum()) {
+ continue;
+ }
+ if (m_Kids[i]) {
+ m_Kids[i]->Release();
+ }
+ m_Kids[i] = pElement->Retain();
+ bSave = TRUE;
+ }
+ if (!bSave) {
+ return FALSE;
+ }
+ }
+ return TRUE;
+}
+CPDF_StructElementImpl::CPDF_StructElementImpl(CPDF_StructTreeImpl* pTree, CPDF_StructElementImpl* pParent, CPDF_Dictionary* pDict)
+ : m_RefCount(0)
+{
+ m_pTree = pTree;
+ m_pDict = pDict;
+ m_Type = pDict->GetString(FX_BSTRC("S"));
+ CFX_ByteString mapped = pTree->m_pRoleMap->GetString(m_Type);
+ if (!mapped.IsEmpty()) {
+ m_Type = mapped;
+ }
+ m_pParent = pParent;
+ LoadKids(pDict);
+}
+CPDF_StructElementImpl::~CPDF_StructElementImpl()
+{
+ for (int i = 0; i < m_Kids.GetSize(); i ++) {
+ if (m_Kids[i].m_Type == CPDF_StructKid::Element && m_Kids[i].m_Element.m_pElement) {
+ ((CPDF_StructElementImpl*)m_Kids[i].m_Element.m_pElement)->Release();
+ }
+ }
+}
+CPDF_StructElementImpl* CPDF_StructElementImpl::Retain()
+{
+ m_RefCount++;
+ return this;
+}
+void CPDF_StructElementImpl::Release()
+{
+ if(--m_RefCount < 1) {
+ delete this;
+ }
+}
+void CPDF_StructElementImpl::LoadKids(CPDF_Dictionary* pDict)
+{
+ CPDF_Object* pObj = pDict->GetElement(FX_BSTRC("Pg"));
+ FX_DWORD PageObjNum = 0;
+ if (pObj && pObj->GetType() == PDFOBJ_REFERENCE) {
+ PageObjNum = ((CPDF_Reference*)pObj)->GetRefObjNum();
+ }
+ CPDF_Object* pKids = pDict->GetElementValue(FX_BSTRC("K"));
+ if (pKids == NULL) {
+ return;
+ }
+ if (pKids->GetType() == PDFOBJ_ARRAY) {
+ CPDF_Array* pArray = (CPDF_Array*)pKids;
+ m_Kids.SetSize(pArray->GetCount());
+ for (FX_DWORD i = 0; i < pArray->GetCount(); i ++) {
+ CPDF_Object* pKid = pArray->GetElementValue(i);
+ LoadKid(PageObjNum, pKid, &m_Kids[i]);
+ }
+ } else {
+ m_Kids.SetSize(1);
+ LoadKid(PageObjNum, pKids, &m_Kids[0]);
+ }
+}
+void CPDF_StructElementImpl::LoadKid(FX_DWORD PageObjNum, CPDF_Object* pKidObj, CPDF_StructKid* pKid)
+{
+ pKid->m_Type = CPDF_StructKid::Invalid;
+ if (pKidObj == NULL) {
+ return;
+ }
+ if (pKidObj->GetType() == PDFOBJ_NUMBER) {
+ if (m_pTree->m_pPage && m_pTree->m_pPage->GetObjNum() != PageObjNum) {
+ return;
+ }
+ pKid->m_Type = CPDF_StructKid::PageContent;
+ pKid->m_PageContent.m_ContentId = pKidObj->GetInteger();
+ pKid->m_PageContent.m_PageObjNum = PageObjNum;
+ return;
+ }
+ if (pKidObj->GetType() != PDFOBJ_DICTIONARY) {
+ return;
+ }
+ CPDF_Dictionary* pKidDict = (CPDF_Dictionary*)pKidObj;
+ CPDF_Object* pPageObj = pKidDict->GetElement(FX_BSTRC("Pg"));
+ if (pPageObj && pPageObj->GetType() == PDFOBJ_REFERENCE) {
+ PageObjNum = ((CPDF_Reference*)pPageObj)->GetRefObjNum();
+ }
+ CFX_ByteString type = pKidDict->GetString(FX_BSTRC("Type"));
+ if (type == FX_BSTRC("MCR")) {
+ if (m_pTree->m_pPage && m_pTree->m_pPage->GetObjNum() != PageObjNum) {
+ return;
+ }
+ pKid->m_Type = CPDF_StructKid::StreamContent;
+ CPDF_Object* pStreamObj = pKidDict->GetElement(FX_BSTRC("Stm"));
+ if (pStreamObj && pStreamObj->GetType() == PDFOBJ_REFERENCE) {
+ pKid->m_StreamContent.m_RefObjNum = ((CPDF_Reference*)pStreamObj)->GetRefObjNum();
+ } else {
+ pKid->m_StreamContent.m_RefObjNum = 0;
+ }
+ pKid->m_StreamContent.m_PageObjNum = PageObjNum;
+ pKid->m_StreamContent.m_ContentId = pKidDict->GetInteger(FX_BSTRC("MCID"));
+ } else if (type == FX_BSTRC("OBJR")) {
+ if (m_pTree->m_pPage && m_pTree->m_pPage->GetObjNum() != PageObjNum) {
+ return;
+ }
+ pKid->m_Type = CPDF_StructKid::Object;
+ CPDF_Object* pObj = pKidDict->GetElement(FX_BSTRC("Obj"));
+ if (pObj && pObj->GetType() == PDFOBJ_REFERENCE) {
+ pKid->m_Object.m_RefObjNum = ((CPDF_Reference*)pObj)->GetRefObjNum();
+ } else {
+ pKid->m_Object.m_RefObjNum = 0;
+ }
+ pKid->m_Object.m_PageObjNum = PageObjNum;
+ } else {
+ pKid->m_Type = CPDF_StructKid::Element;
+ pKid->m_Element.m_pDict = pKidDict;
+ if (m_pTree->m_pPage == NULL) {
+ pKid->m_Element.m_pElement = FX_NEW CPDF_StructElementImpl(m_pTree, this, pKidDict);
+ } else {
+ pKid->m_Element.m_pElement = NULL;
+ }
+ }
+}
+static CPDF_Dictionary* FindAttrDict(CPDF_Object* pAttrs, FX_BSTR owner, FX_FLOAT nLevel = 0.0F)
+{
+ if (nLevel > nMaxRecursion) {
+ return NULL;
+ }
+ if (pAttrs == NULL) {
+ return NULL;
+ }
+ CPDF_Dictionary* pDict = NULL;
+ if (pAttrs->GetType() == PDFOBJ_DICTIONARY) {
+ pDict = (CPDF_Dictionary*)pAttrs;
+ } else if (pAttrs->GetType() == PDFOBJ_STREAM) {
+ pDict = ((CPDF_Stream*)pAttrs)->GetDict();
+ } else if (pAttrs->GetType() == PDFOBJ_ARRAY) {
+ CPDF_Array* pArray = (CPDF_Array*)pAttrs;
+ for (FX_DWORD i = 0; i < pArray->GetCount(); i ++) {
+ CPDF_Object* pElement = pArray->GetElementValue(i);
+ pDict = FindAttrDict(pElement, owner, nLevel + 1);
+ if (pDict) {
+ return pDict;
+ }
+ }
+ }
+ if (pDict && pDict->GetString(FX_BSTRC("O")) == owner) {
+ return pDict;
+ }
+ return NULL;
+}
+CPDF_Object* CPDF_StructElementImpl::GetAttr(FX_BSTR owner, FX_BSTR name, FX_BOOL bInheritable, FX_FLOAT fLevel)
+{
+ if (fLevel > nMaxRecursion) {
+ return NULL;
+ }
+ if (bInheritable) {
+ CPDF_Object* pAttr = GetAttr(owner, name, FALSE);
+ if (pAttr) {
+ return pAttr;
+ }
+ if (m_pParent == NULL) {
+ return NULL;
+ }
+ return m_pParent->GetAttr(owner, name, TRUE, fLevel + 1);
+ }
+ CPDF_Object* pA = m_pDict->GetElementValue(FX_BSTRC("A"));
+ if (pA) {
+ CPDF_Dictionary* pAttrDict = FindAttrDict(pA, owner);
+ if (pAttrDict) {
+ CPDF_Object* pAttr = pAttrDict->GetElementValue(name);
+ if (pAttr) {
+ return pAttr;
+ }
+ }
+ }
+ CPDF_Object* pC = m_pDict->GetElementValue(FX_BSTRC("C"));
+ if (pC == NULL) {
+ return NULL;
+ }
+ CPDF_Dictionary* pClassMap = m_pTree->m_pTreeRoot->GetDict(FX_BSTRC("ClassMap"));
+ if (pClassMap == NULL) {
+ return NULL;
+ }
+ if (pC->GetType() == PDFOBJ_ARRAY) {
+ CPDF_Array* pArray = (CPDF_Array*)pC;
+ for (FX_DWORD i = 0; i < pArray->GetCount(); i ++) {
+ CFX_ByteString class_name = pArray->GetString(i);
+ CPDF_Dictionary* pClassDict = pClassMap->GetDict(class_name);
+ if (pClassDict && pClassDict->GetString(FX_BSTRC("O")) == owner) {
+ return pClassDict->GetElementValue(name);
+ }
+ }
+ return NULL;
+ }
+ CFX_ByteString class_name = pC->GetString();
+ CPDF_Dictionary* pClassDict = pClassMap->GetDict(class_name);
+ if (pClassDict && pClassDict->GetString(FX_BSTRC("O")) == owner) {
+ return pClassDict->GetElementValue(name);
+ }
+ return NULL;
+}
+CPDF_Object* CPDF_StructElementImpl::GetAttr(FX_BSTR owner, FX_BSTR name, FX_BOOL bInheritable, int subindex)
+{
+ CPDF_Object* pAttr = GetAttr(owner, name, bInheritable);
+ if (pAttr == NULL || subindex == -1 || pAttr->GetType() != PDFOBJ_ARRAY) {
+ return pAttr;
+ }
+ CPDF_Array* pArray = (CPDF_Array*)pAttr;
+ if (subindex >= (int)pArray->GetCount()) {
+ return pAttr;
+ }
+ return pArray->GetElementValue(subindex);
+}
+CFX_ByteString CPDF_StructElementImpl::GetName(FX_BSTR owner, FX_BSTR name, FX_BSTR default_value, FX_BOOL bInheritable, int subindex)
+{
+ CPDF_Object* pAttr = GetAttr(owner, name, bInheritable, subindex);
+ if (pAttr == NULL || pAttr->GetType() != PDFOBJ_NAME) {
+ return default_value;
+ }
+ return pAttr->GetString();
+}
+FX_ARGB CPDF_StructElementImpl::GetColor(FX_BSTR owner, FX_BSTR name, FX_ARGB default_value, FX_BOOL bInheritable, int subindex)
+{
+ CPDF_Object* pAttr = GetAttr(owner, name, bInheritable, subindex);
+ if (pAttr == NULL || pAttr->GetType() != PDFOBJ_ARRAY) {
+ return default_value;
+ }
+ CPDF_Array* pArray = (CPDF_Array*)pAttr;
+ return 0xff000000 | ((int)(pArray->GetNumber(0) * 255) << 16) | ((int)(pArray->GetNumber(1) * 255) << 8) | (int)(pArray->GetNumber(2) * 255);
+}
+FX_FLOAT CPDF_StructElementImpl::GetNumber(FX_BSTR owner, FX_BSTR name, FX_FLOAT default_value, FX_BOOL bInheritable, int subindex)
+{
+ CPDF_Object* pAttr = GetAttr(owner, name, bInheritable, subindex);
+ if (pAttr == NULL || pAttr->GetType() != PDFOBJ_NUMBER) {
+ return default_value;
+ }
+ return pAttr->GetNumber();
+}
+int CPDF_StructElementImpl::GetInteger(FX_BSTR owner, FX_BSTR name, int default_value, FX_BOOL bInheritable, int subindex)
+{
+ CPDF_Object* pAttr = GetAttr(owner, name, bInheritable, subindex);
+ if (pAttr == NULL || pAttr->GetType() != PDFOBJ_NUMBER) {
+ return default_value;
+ }
+ return pAttr->GetInteger();
+}
diff --git a/core/src/fpdfdoc/doc_utils.cpp b/core/src/fpdfdoc/doc_utils.cpp
index dd81594998..ad958adbf2 100644
--- a/core/src/fpdfdoc/doc_utils.cpp
+++ b/core/src/fpdfdoc/doc_utils.cpp
@@ -1,749 +1,749 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../include/fpdfdoc/fpdf_doc.h"
-static const int FPDFDOC_UTILS_MAXRECURSION = 32;
-CFX_WideString GetFullName(CPDF_Dictionary* pFieldDict);
-void InitInterFormDict(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument);
-FX_DWORD CountInterFormFonts(CPDF_Dictionary* pFormDict);
-CPDF_Font* GetInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, FX_DWORD index, CFX_ByteString& csNameTag);
-CPDF_Font* GetInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString csNameTag);
-CPDF_Font* GetInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString csFontName, CFX_ByteString& csNameTag);
-CPDF_Font* GetNativeInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, FX_BYTE charSet, CFX_ByteString& csNameTag);
-CPDF_Font* GetNativeInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString& csNameTag);
-FX_BOOL FindInterFormFont(CPDF_Dictionary* pFormDict, const CPDF_Font* pFont, CFX_ByteString& csNameTag);
-FX_BOOL FindInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString csFontName, CPDF_Font*& pFont, CFX_ByteString& csNameTag);
-void AddInterFormFont(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument, const CPDF_Font* pFont, CFX_ByteString& csNameTag);
-CPDF_Font* AddNativeInterFormFont(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument, FX_BYTE charSet, CFX_ByteString& csNameTag);
-CPDF_Font* AddNativeInterFormFont(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument, CFX_ByteString& csNameTag);
-void RemoveInterFormFont(CPDF_Dictionary* pFormDict, const CPDF_Font* pFont);
-void RemoveInterFormFont(CPDF_Dictionary* pFormDict, CFX_ByteString csNameTag);
-CPDF_Font* GetDefaultInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument);
-void SetDefaultInterFormFont(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument, const CPDF_Font* pFont);
-void SaveCheckedFieldStatus(CPDF_FormField* pField, CFX_ByteArray& statusArray);
-FX_BOOL NeedPDFEncodeForFieldFullName(const CFX_WideString& csFieldName);
-FX_BOOL NeedPDFEncodeForFieldTree(CPDF_Dictionary* pFieldDict, int nLevel = 0);
-void EncodeFieldName(const CFX_WideString& csName, CFX_ByteString& csT);
-void UpdateEncodeFieldName(CPDF_Dictionary* pFieldDict, int nLevel = 0);
-CFX_WideString GetFullName(CPDF_Dictionary* pFieldDict)
-{
- CFX_WideString full_name;
- CPDF_Dictionary* pLevel = pFieldDict;
- while (pLevel) {
- CFX_WideString short_name = pLevel->GetUnicodeText("T");
- if (short_name != L"") {
- if (full_name == L"") {
- full_name = short_name;
- } else {
- full_name = short_name + L"." + full_name;
- }
- }
- pLevel = pLevel->GetDict("Parent");
- }
- return full_name;
-}
-FX_BOOL CPDF_DefaultAppearance::HasFont()
-{
- if (m_csDA.IsEmpty()) {
- return FALSE;
- }
- CPDF_SimpleParser syntax(m_csDA);
- return syntax.FindTagParam("Tf", 2);
-}
-CFX_ByteString CPDF_DefaultAppearance::GetFontString()
-{
- CFX_ByteString csFont;
- if (m_csDA.IsEmpty()) {
- return csFont;
- }
- CPDF_SimpleParser syntax(m_csDA);
- if (syntax.FindTagParam("Tf", 2)) {
- csFont += (CFX_ByteString)syntax.GetWord();
- csFont += " ";
- csFont += (CFX_ByteString)syntax.GetWord();
- csFont += " ";
- csFont += (CFX_ByteString)syntax.GetWord();
- }
- return csFont;
-}
-void CPDF_DefaultAppearance::GetFont(CFX_ByteString& csFontNameTag, FX_FLOAT& fFontSize)
-{
- csFontNameTag = "";
- fFontSize = 0;
- if (m_csDA.IsEmpty()) {
- return;
- }
- CPDF_SimpleParser syntax(m_csDA);
- if (syntax.FindTagParam("Tf", 2)) {
- csFontNameTag = (CFX_ByteString)syntax.GetWord();
- csFontNameTag.Delete(0, 1);
- fFontSize = FX_atof((CFX_ByteString)syntax.GetWord());
- }
- csFontNameTag = PDF_NameDecode(csFontNameTag);
-}
-FX_BOOL CPDF_DefaultAppearance::HasColor(FX_BOOL bStrokingOperation)
-{
- if (m_csDA.IsEmpty()) {
- return FALSE;
- }
- CPDF_SimpleParser syntax(m_csDA);
- if (syntax.FindTagParam(bStrokingOperation ? "G" : "g", 1)) {
- return TRUE;
- }
- syntax.SetPos(0);
- if (syntax.FindTagParam(bStrokingOperation ? "RG" : "rg", 3)) {
- return TRUE;
- }
- syntax.SetPos(0);
- return syntax.FindTagParam(bStrokingOperation ? "K" : "k", 4);
-}
-CFX_ByteString CPDF_DefaultAppearance::GetColorString(FX_BOOL bStrokingOperation)
-{
- CFX_ByteString csColor;
- if (m_csDA.IsEmpty()) {
- return csColor;
- }
- CPDF_SimpleParser syntax(m_csDA);
- if (syntax.FindTagParam(bStrokingOperation ? "G" : "g", 1)) {
- csColor += (CFX_ByteString)syntax.GetWord();
- csColor += " ";
- csColor += (CFX_ByteString)syntax.GetWord();
- return csColor;
- }
- syntax.SetPos(0);
- if (syntax.FindTagParam(bStrokingOperation ? "RG" : "rg", 3)) {
- csColor += (CFX_ByteString)syntax.GetWord();
- csColor += " ";
- csColor += (CFX_ByteString)syntax.GetWord();
- csColor += " ";
- csColor += (CFX_ByteString)syntax.GetWord();
- csColor += " ";
- csColor += (CFX_ByteString)syntax.GetWord();
- return csColor;
- }
- syntax.SetPos(0);
- if (syntax.FindTagParam(bStrokingOperation ? "K" : "k", 4)) {
- csColor += (CFX_ByteString)syntax.GetWord();
- csColor += " ";
- csColor += (CFX_ByteString)syntax.GetWord();
- csColor += " ";
- csColor += (CFX_ByteString)syntax.GetWord();
- csColor += " ";
- csColor += (CFX_ByteString)syntax.GetWord();
- csColor += " ";
- csColor += (CFX_ByteString)syntax.GetWord();
- }
- return csColor;
-}
-void CPDF_DefaultAppearance::GetColor(int& iColorType, FX_FLOAT fc[4], FX_BOOL bStrokingOperation)
-{
- iColorType = COLORTYPE_TRANSPARENT;
- for (int c = 0; c < 4; c ++) {
- fc[c] = 0;
- }
- if (m_csDA.IsEmpty()) {
- return;
- }
- CPDF_SimpleParser syntax(m_csDA);
- if (syntax.FindTagParam(bStrokingOperation ? "G" : "g", 1)) {
- iColorType = COLORTYPE_GRAY;
- fc[0] = FX_atof((CFX_ByteString)syntax.GetWord());
- return;
- }
- syntax.SetPos(0);
- if (syntax.FindTagParam(bStrokingOperation ? "RG" : "rg", 3)) {
- iColorType = COLORTYPE_RGB;
- fc[0] = FX_atof((CFX_ByteString)syntax.GetWord());
- fc[1] = FX_atof((CFX_ByteString)syntax.GetWord());
- fc[2] = FX_atof((CFX_ByteString)syntax.GetWord());
- return;
- }
- syntax.SetPos(0);
- if (syntax.FindTagParam(bStrokingOperation ? "K" : "k", 4)) {
- iColorType = COLORTYPE_CMYK;
- fc[0] = FX_atof((CFX_ByteString)syntax.GetWord());
- fc[1] = FX_atof((CFX_ByteString)syntax.GetWord());
- fc[2] = FX_atof((CFX_ByteString)syntax.GetWord());
- fc[3] = FX_atof((CFX_ByteString)syntax.GetWord());
- }
-}
-void CPDF_DefaultAppearance::GetColor(FX_ARGB& color, int& iColorType, FX_BOOL bStrokingOperation)
-{
- color = 0;
- iColorType = COLORTYPE_TRANSPARENT;
- if (m_csDA.IsEmpty()) {
- return;
- }
- CPDF_SimpleParser syntax(m_csDA);
- if (syntax.FindTagParam(bStrokingOperation ? "G" : "g", 1)) {
- iColorType = COLORTYPE_GRAY;
- FX_FLOAT g = FX_atof((CFX_ByteString)syntax.GetWord()) * 255 + 0.5f;
- color = ArgbEncode(255, (int)g, (int)g, (int)g);
- return;
- }
- syntax.SetPos(0);
- if (syntax.FindTagParam(bStrokingOperation ? "RG" : "rg", 3)) {
- iColorType = COLORTYPE_RGB;
- FX_FLOAT r = FX_atof((CFX_ByteString)syntax.GetWord()) * 255 + 0.5f;
- FX_FLOAT g = FX_atof((CFX_ByteString)syntax.GetWord()) * 255 + 0.5f;
- FX_FLOAT b = FX_atof((CFX_ByteString)syntax.GetWord()) * 255 + 0.5f;
- color = ArgbEncode(255, (int)r, (int)g, (int)b);
- return;
- }
- syntax.SetPos(0);
- if (syntax.FindTagParam(bStrokingOperation ? "K" : "k", 4)) {
- iColorType = COLORTYPE_CMYK;
- FX_FLOAT c = FX_atof((CFX_ByteString)syntax.GetWord());
- FX_FLOAT m = FX_atof((CFX_ByteString)syntax.GetWord());
- FX_FLOAT y = FX_atof((CFX_ByteString)syntax.GetWord());
- FX_FLOAT k = FX_atof((CFX_ByteString)syntax.GetWord());
- FX_FLOAT r = 1.0f - FX_MIN(1.0f, c + k);
- FX_FLOAT g = 1.0f - FX_MIN(1.0f, m + k);
- FX_FLOAT b = 1.0f - FX_MIN(1.0f, y + k);
- color = ArgbEncode(255, (int)(r * 255 + 0.5f), (int)(g * 255 + 0.5f), (int)(b * 255 + 0.5f));
- }
-}
-FX_BOOL CPDF_DefaultAppearance::HasTextMatrix()
-{
- if (m_csDA.IsEmpty()) {
- return FALSE;
- }
- CPDF_SimpleParser syntax(m_csDA);
- return syntax.FindTagParam("Tm", 6);
-}
-CFX_ByteString CPDF_DefaultAppearance::GetTextMatrixString()
-{
- CFX_ByteString csTM;
- if (m_csDA.IsEmpty()) {
- return csTM;
- }
- CPDF_SimpleParser syntax(m_csDA);
- if (syntax.FindTagParam("Tm", 6)) {
- for (int i = 0; i < 6; i ++) {
- csTM += (CFX_ByteString)syntax.GetWord();
- csTM += " ";
- }
- csTM += (CFX_ByteString)syntax.GetWord();
- }
- return csTM;
-}
-CFX_AffineMatrix CPDF_DefaultAppearance::GetTextMatrix()
-{
- CFX_AffineMatrix tm;
- if (m_csDA.IsEmpty()) {
- return tm;
- }
- CPDF_SimpleParser syntax(m_csDA);
- if (syntax.FindTagParam("Tm", 6)) {
- FX_FLOAT f[6];
- for (int i = 0; i < 6; i ++) {
- f[i] = FX_atof((CFX_ByteString)syntax.GetWord());
- }
- tm.Set(f[0], f[1], f[2], f[3], f[4], f[5]);
- }
- return tm;
-}
-void InitInterFormDict(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument)
-{
- if (pDocument == NULL) {
- return;
- }
- if (pFormDict == NULL) {
- pFormDict = CPDF_Dictionary::Create();
- if (pFormDict == NULL) {
- return;
- }
- FX_DWORD dwObjNum = pDocument->AddIndirectObject(pFormDict);
- CPDF_Dictionary* pRoot = pDocument->GetRoot();
- pRoot->SetAtReference("AcroForm", pDocument, dwObjNum);
- }
- CFX_ByteString csDA;
- if (!pFormDict->KeyExist("DR")) {
- CPDF_Font* pFont = NULL;
- CFX_ByteString csBaseName, csDefault;
- FX_BYTE charSet = CPDF_InterForm::GetNativeCharSet();
- pFont = CPDF_InterForm::AddStandardFont(pDocument, "Helvetica");
- if (pFont != NULL) {
- AddInterFormFont(pFormDict, pDocument, pFont, csBaseName);
- csDefault = csBaseName;
- }
- if (charSet != 0) {
- CFX_ByteString csFontName = CPDF_InterForm::GetNativeFont(charSet, NULL);
- if (pFont == NULL || csFontName != "Helvetica") {
- pFont = CPDF_InterForm::AddNativeFont(pDocument);
- if (pFont != NULL) {
- csBaseName = "";
- AddInterFormFont(pFormDict, pDocument, pFont, csBaseName);
- csDefault = csBaseName;
- }
- }
- }
- if (pFont != NULL) {
- csDA = "/" + PDF_NameEncode(csDefault) + " 0 Tf";
- }
- }
- if (!csDA.IsEmpty()) {
- csDA += " ";
- }
- csDA += "0 g";
- if (!pFormDict->KeyExist("DA")) {
- pFormDict->SetAtString("DA", csDA);
- }
-}
-FX_DWORD CountInterFormFonts(CPDF_Dictionary* pFormDict)
-{
- if (pFormDict == NULL) {
- return 0;
- }
- CPDF_Dictionary* pDR = pFormDict->GetDict("DR");
- if (pDR == NULL) {
- return 0;
- }
- CPDF_Dictionary* pFonts = pDR->GetDict("Font");
- if (pFonts == NULL) {
- return 0;
- }
- FX_DWORD dwCount = 0;
- FX_POSITION pos = pFonts->GetStartPos();
- while (pos) {
- CPDF_Object* pObj = NULL;
- CFX_ByteString csKey;
- pObj = pFonts->GetNextElement(pos, csKey);
- if (pObj == NULL) {
- continue;
- }
- CPDF_Object* pDirect = pObj->GetDirect();
- if (pDirect != NULL && pDirect->GetType() == PDFOBJ_DICTIONARY) {
- if (((CPDF_Dictionary*)pDirect)->GetString("Type") == "Font") {
- dwCount ++;
- }
- }
- }
- return dwCount;
-}
-CPDF_Font* GetInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, FX_DWORD index, CFX_ByteString& csNameTag)
-{
- if (pFormDict == NULL) {
- return NULL;
- }
- CPDF_Dictionary* pDR = pFormDict->GetDict("DR");
- if (pDR == NULL) {
- return NULL;
- }
- CPDF_Dictionary* pFonts = pDR->GetDict("Font");
- if (pFonts == NULL) {
- return NULL;
- }
- FX_DWORD dwCount = 0;
- FX_POSITION pos = pFonts->GetStartPos();
- while (pos) {
- CPDF_Object* pObj = NULL;
- CFX_ByteString csKey;
- pObj = pFonts->GetNextElement(pos, csKey);
- if (pObj == NULL) {
- continue;
- }
- CPDF_Object* pDirect = pObj->GetDirect();
- if (pDirect == NULL || pDirect->GetType() != PDFOBJ_DICTIONARY) {
- continue;
- }
- CPDF_Dictionary* pElement = (CPDF_Dictionary*)pDirect;
- if (pElement->GetString("Type") != "Font") {
- continue;
- }
- if (dwCount == index) {
- csNameTag = csKey;
- return pDocument->LoadFont(pElement);
- }
- dwCount ++;
- }
- return NULL;
-}
-CPDF_Font* GetInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString csNameTag)
-{
- CFX_ByteString csAlias = PDF_NameDecode(csNameTag);
- if (pFormDict == NULL || csAlias.IsEmpty()) {
- return NULL;
- }
- CPDF_Dictionary* pDR = pFormDict->GetDict("DR");
- if (pDR == NULL) {
- return NULL;
- }
- CPDF_Dictionary* pFonts = pDR->GetDict("Font");
- if (pFonts == NULL) {
- return NULL;
- }
- CPDF_Dictionary* pElement = pFonts->GetDict(csAlias);
- if (pElement == NULL) {
- return NULL;
- }
- if (pElement->GetString("Type") == "Font") {
- return pDocument->LoadFont(pElement);
- }
- return NULL;
-}
-CPDF_Font* GetInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString csFontName, CFX_ByteString& csNameTag)
-{
- if (pFormDict == NULL || csFontName.IsEmpty()) {
- return NULL;
- }
- CPDF_Dictionary* pDR = pFormDict->GetDict("DR");
- if (pDR == NULL) {
- return NULL;
- }
- CPDF_Dictionary* pFonts = pDR->GetDict("Font");
- if (pFonts == NULL) {
- return NULL;
- }
- FX_POSITION pos = pFonts->GetStartPos();
- while (pos) {
- CPDF_Object* pObj = NULL;
- CFX_ByteString csKey;
- pObj = pFonts->GetNextElement(pos, csKey);
- if (pObj == NULL) {
- continue;
- }
- CPDF_Object* pDirect = pObj->GetDirect();
- if (pDirect == NULL || pDirect->GetType() != PDFOBJ_DICTIONARY) {
- continue;
- }
- CPDF_Dictionary* pElement = (CPDF_Dictionary*)pDirect;
- if (pElement->GetString("Type") != "Font") {
- continue;
- }
- CPDF_Font* pFind = pDocument->LoadFont(pElement);
- if (pFind == NULL) {
- continue;
- }
- CFX_ByteString csBaseFont;
- csBaseFont = pFind->GetBaseFont();
- csBaseFont.Remove(' ');
- if (csBaseFont == csFontName) {
- csNameTag = csKey;
- return pFind;
- }
- }
- return NULL;
-}
-CPDF_Font* GetNativeInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, FX_BYTE charSet, CFX_ByteString& csNameTag)
-{
- if (pFormDict == NULL) {
- return NULL;
- }
- CPDF_Dictionary* pDR = pFormDict->GetDict("DR");
- if (pDR == NULL) {
- return NULL;
- }
- CPDF_Dictionary* pFonts = pDR->GetDict("Font");
- if (pFonts == NULL) {
- return NULL;
- }
- FX_POSITION pos = pFonts->GetStartPos();
- while (pos) {
- CPDF_Object* pObj = NULL;
- CFX_ByteString csKey;
- pObj = pFonts->GetNextElement(pos, csKey);
- if (pObj == NULL) {
- continue;
- }
- CPDF_Object* pDirect = pObj->GetDirect();
- if (pDirect == NULL || pDirect->GetType() != PDFOBJ_DICTIONARY) {
- continue;
- }
- CPDF_Dictionary* pElement = (CPDF_Dictionary*)pDirect;
- if (pElement->GetString("Type") != "Font") {
- continue;
- }
- CPDF_Font* pFind = pDocument->LoadFont(pElement);
- if (pFind == NULL) {
- continue;
- }
- CFX_SubstFont* pSubst = (CFX_SubstFont*)pFind->GetSubstFont();
- if (pSubst == NULL) {
- continue;
- }
- if (pSubst->m_Charset == (int)charSet) {
- csNameTag = csKey;
- return pFind;
- }
- }
- return NULL;
-}
-CPDF_Font* GetNativeInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString& csNameTag)
-{
- csNameTag = "";
- FX_BYTE charSet = CPDF_InterForm::GetNativeCharSet();
- CFX_SubstFont* pSubst;
- CPDF_Font* pFont = GetDefaultInterFormFont(pFormDict, pDocument);
- if (pFont != NULL) {
- pSubst = (CFX_SubstFont*)pFont->GetSubstFont();
- if (pSubst != NULL && pSubst->m_Charset == (int)charSet) {
- FindInterFormFont(pFormDict, pFont, csNameTag);
- return pFont;
- }
- }
- return GetNativeInterFormFont(pFormDict, pDocument, charSet, csNameTag);
-}
-FX_BOOL FindInterFormFont(CPDF_Dictionary* pFormDict, const CPDF_Font* pFont, CFX_ByteString& csNameTag)
-{
- if (pFormDict == NULL || pFont == NULL) {
- return FALSE;
- }
- CPDF_Dictionary* pDR = pFormDict->GetDict("DR");
- if (pDR == NULL) {
- return FALSE;
- }
- CPDF_Dictionary* pFonts = pDR->GetDict("Font");
- if (pFonts == NULL) {
- return FALSE;
- }
- FX_POSITION pos = pFonts->GetStartPos();
- while (pos) {
- CPDF_Object* pObj = NULL;
- CFX_ByteString csKey;
- pObj = pFonts->GetNextElement(pos, csKey);
- if (pObj == NULL) {
- continue;
- }
- CPDF_Object* pDirect = pObj->GetDirect();
- if (pDirect == NULL || pDirect->GetType() != PDFOBJ_DICTIONARY) {
- continue;
- }
- CPDF_Dictionary* pElement = (CPDF_Dictionary*)pDirect;
- if (pElement->GetString("Type") != "Font") {
- continue;
- }
- if (pFont->GetFontDict() == pElement) {
- csNameTag = csKey;
- return TRUE;
- }
- }
- return FALSE;
-}
-FX_BOOL FindInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString csFontName, CPDF_Font*& pFont, CFX_ByteString& csNameTag)
-{
- if (pFormDict == NULL) {
- return FALSE;
- }
- CPDF_Dictionary* pDR = pFormDict->GetDict("DR");
- if (pDR == NULL) {
- return FALSE;
- }
- CPDF_Dictionary* pFonts = pDR->GetDict("Font");
- if (pFonts == NULL) {
- return FALSE;
- }
- if (csFontName.GetLength() > 0) {
- csFontName.Remove(' ');
- }
- FX_POSITION pos = pFonts->GetStartPos();
- while (pos) {
- CPDF_Object* pObj = NULL;
- CFX_ByteString csKey, csTmp;
- pObj = pFonts->GetNextElement(pos, csKey);
- if (pObj == NULL) {
- continue;
- }
- CPDF_Object* pDirect = pObj->GetDirect();
- if (pDirect == NULL || pDirect->GetType() != PDFOBJ_DICTIONARY) {
- continue;
- }
- CPDF_Dictionary* pElement = (CPDF_Dictionary*)pDirect;
- if (pElement->GetString("Type") != "Font") {
- continue;
- }
- pFont = pDocument->LoadFont(pElement);
- if (pFont == NULL) {
- continue;
- }
- CFX_ByteString csBaseFont;
- csBaseFont = pFont->GetBaseFont();
- csBaseFont.Remove(' ');
- if (csBaseFont == csFontName) {
- csNameTag = csKey;
- return TRUE;
- }
- }
- return FALSE;
-}
-void AddInterFormFont(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument, const CPDF_Font* pFont, CFX_ByteString& csNameTag)
-{
- if (pFont == NULL) {
- return;
- }
- if (pFormDict == NULL) {
- InitInterFormDict(pFormDict, pDocument);
- }
- CFX_ByteString csTag;
- if (FindInterFormFont(pFormDict, pFont, csTag)) {
- csNameTag = csTag;
- return;
- }
- if (pFormDict == NULL) {
- InitInterFormDict(pFormDict, pDocument);
- }
- CPDF_Dictionary* pDR = pFormDict->GetDict("DR");
- if (pDR == NULL) {
- pDR = CPDF_Dictionary::Create();
- if (pDR == NULL) {
- return;
- }
- pFormDict->SetAt("DR", pDR);
- }
- CPDF_Dictionary* pFonts = pDR->GetDict("Font");
- if (pFonts == NULL) {
- pFonts = CPDF_Dictionary::Create();
- pDR->SetAt("Font", pFonts);
- }
- if (csNameTag.IsEmpty()) {
- csNameTag = pFont->GetBaseFont();
- }
- csNameTag.Remove(' ');
- csNameTag = CPDF_InterForm::GenerateNewResourceName(pDR, "Font", 4, csNameTag);
- pFonts->SetAtReference(csNameTag, pDocument, pFont->GetFontDict());
-}
-CPDF_Font* AddNativeInterFormFont(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument, FX_BYTE charSet, CFX_ByteString& csNameTag)
-{
- if (pFormDict == NULL) {
- InitInterFormDict(pFormDict, pDocument);
- }
- CFX_ByteString csTemp;
- CPDF_Font* pFont = GetNativeInterFormFont(pFormDict, pDocument, charSet, csTemp);
- if (pFont != NULL) {
- csNameTag = csTemp;
- return pFont;
- }
- CFX_ByteString csFontName = CPDF_InterForm::GetNativeFont(charSet);
- if (!csFontName.IsEmpty()) {
- if (FindInterFormFont(pFormDict, pDocument, csFontName, pFont, csNameTag)) {
- return pFont;
- }
- }
- pFont = CPDF_InterForm::AddNativeFont(charSet, pDocument);
- if (pFont != NULL) {
- AddInterFormFont(pFormDict, pDocument, pFont, csNameTag);
- }
- return pFont;
-}
-CPDF_Font* AddNativeInterFormFont(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument, CFX_ByteString& csNameTag)
-{
- FX_BYTE charSet = CPDF_InterForm::GetNativeCharSet();
- return AddNativeInterFormFont(pFormDict, pDocument, charSet, csNameTag);
-}
-void RemoveInterFormFont(CPDF_Dictionary* pFormDict, const CPDF_Font* pFont)
-{
- if (pFormDict == NULL || pFont == NULL) {
- return;
- }
- CFX_ByteString csTag;
- if (!FindInterFormFont(pFormDict, pFont, csTag)) {
- return;
- }
- CPDF_Dictionary* pDR = pFormDict->GetDict("DR");
- CPDF_Dictionary* pFonts = pDR->GetDict("Font");
- pFonts->RemoveAt(csTag);
-}
-void RemoveInterFormFont(CPDF_Dictionary* pFormDict, CFX_ByteString csNameTag)
-{
- if (pFormDict == NULL || csNameTag.IsEmpty()) {
- return;
- }
- CPDF_Dictionary* pDR = pFormDict->GetDict("DR");
- if (pDR == NULL) {
- return;
- }
- CPDF_Dictionary* pFonts = pDR->GetDict("Font");
- if (pFonts == NULL) {
- return;
- }
- pFonts->RemoveAt(csNameTag);
-}
-CPDF_Font* GetDefaultInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument)
-{
- if (pFormDict == NULL) {
- return NULL;
- }
- CPDF_DefaultAppearance cDA = pFormDict->GetString("DA");
- CFX_ByteString csFontNameTag;
- FX_FLOAT fFontSize;
- cDA.GetFont(csFontNameTag, fFontSize);
- return GetInterFormFont(pFormDict, pDocument, csFontNameTag);
-}
-CPDF_IconFit::ScaleMethod CPDF_IconFit::GetScaleMethod()
-{
- if (m_pDict == NULL) {
- return Always;
- }
- CFX_ByteString csSW = m_pDict->GetString("SW", "A");
- if (csSW == "B") {
- return Bigger;
- } else if (csSW == "S") {
- return Smaller;
- } else if (csSW == "N") {
- return Never;
- }
- return Always;
-}
-FX_BOOL CPDF_IconFit::IsProportionalScale()
-{
- if (m_pDict == NULL) {
- return TRUE;
- }
- return m_pDict->GetString("S", "P") != "A";
-}
-void CPDF_IconFit::GetIconPosition(FX_FLOAT& fLeft, FX_FLOAT& fBottom)
-{
- fLeft = fBottom = 0.5;
- if (m_pDict == NULL) {
- return;
- }
- CPDF_Array* pA = m_pDict->GetArray("A");
- if (pA != NULL) {
- FX_DWORD dwCount = pA->GetCount();
- if (dwCount > 0) {
- fLeft = pA->GetNumber(0);
- }
- if (dwCount > 1) {
- fBottom = pA->GetNumber(1);
- }
- }
-}
-FX_BOOL CPDF_IconFit::GetFittingBounds()
-{
- if (m_pDict == NULL) {
- return FALSE;
- }
- return m_pDict->GetBoolean("FB");
-}
-void SaveCheckedFieldStatus(CPDF_FormField* pField, CFX_ByteArray& statusArray)
-{
- int iCount = pField->CountControls();
- for (int i = 0; i < iCount; i ++) {
- CPDF_FormControl* pControl = pField->GetControl(i);
- if (pControl == NULL) {
- continue;
- }
- statusArray.Add(pControl->IsChecked() ? 1 : 0);
- }
-}
-CPDF_Object* FPDF_GetFieldAttr(CPDF_Dictionary* pFieldDict, const FX_CHAR* name, int nLevel)
-{
- if (nLevel > FPDFDOC_UTILS_MAXRECURSION) {
- return NULL;
- }
- if (pFieldDict == NULL) {
- return NULL;
- }
- CPDF_Object* pAttr = pFieldDict->GetElementValue(name);
- if (pAttr) {
- return pAttr;
- }
- CPDF_Dictionary* pParent = pFieldDict->GetDict("Parent");
- if (pParent == NULL) {
- return NULL;
- }
- return FPDF_GetFieldAttr(pParent, name, nLevel + 1);
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fpdfdoc/fpdf_doc.h"
+static const int FPDFDOC_UTILS_MAXRECURSION = 32;
+CFX_WideString GetFullName(CPDF_Dictionary* pFieldDict);
+void InitInterFormDict(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument);
+FX_DWORD CountInterFormFonts(CPDF_Dictionary* pFormDict);
+CPDF_Font* GetInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, FX_DWORD index, CFX_ByteString& csNameTag);
+CPDF_Font* GetInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString csNameTag);
+CPDF_Font* GetInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString csFontName, CFX_ByteString& csNameTag);
+CPDF_Font* GetNativeInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, FX_BYTE charSet, CFX_ByteString& csNameTag);
+CPDF_Font* GetNativeInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString& csNameTag);
+FX_BOOL FindInterFormFont(CPDF_Dictionary* pFormDict, const CPDF_Font* pFont, CFX_ByteString& csNameTag);
+FX_BOOL FindInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString csFontName, CPDF_Font*& pFont, CFX_ByteString& csNameTag);
+void AddInterFormFont(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument, const CPDF_Font* pFont, CFX_ByteString& csNameTag);
+CPDF_Font* AddNativeInterFormFont(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument, FX_BYTE charSet, CFX_ByteString& csNameTag);
+CPDF_Font* AddNativeInterFormFont(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument, CFX_ByteString& csNameTag);
+void RemoveInterFormFont(CPDF_Dictionary* pFormDict, const CPDF_Font* pFont);
+void RemoveInterFormFont(CPDF_Dictionary* pFormDict, CFX_ByteString csNameTag);
+CPDF_Font* GetDefaultInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument);
+void SetDefaultInterFormFont(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument, const CPDF_Font* pFont);
+void SaveCheckedFieldStatus(CPDF_FormField* pField, CFX_ByteArray& statusArray);
+FX_BOOL NeedPDFEncodeForFieldFullName(const CFX_WideString& csFieldName);
+FX_BOOL NeedPDFEncodeForFieldTree(CPDF_Dictionary* pFieldDict, int nLevel = 0);
+void EncodeFieldName(const CFX_WideString& csName, CFX_ByteString& csT);
+void UpdateEncodeFieldName(CPDF_Dictionary* pFieldDict, int nLevel = 0);
+CFX_WideString GetFullName(CPDF_Dictionary* pFieldDict)
+{
+ CFX_WideString full_name;
+ CPDF_Dictionary* pLevel = pFieldDict;
+ while (pLevel) {
+ CFX_WideString short_name = pLevel->GetUnicodeText("T");
+ if (short_name != L"") {
+ if (full_name == L"") {
+ full_name = short_name;
+ } else {
+ full_name = short_name + L"." + full_name;
+ }
+ }
+ pLevel = pLevel->GetDict("Parent");
+ }
+ return full_name;
+}
+FX_BOOL CPDF_DefaultAppearance::HasFont()
+{
+ if (m_csDA.IsEmpty()) {
+ return FALSE;
+ }
+ CPDF_SimpleParser syntax(m_csDA);
+ return syntax.FindTagParam("Tf", 2);
+}
+CFX_ByteString CPDF_DefaultAppearance::GetFontString()
+{
+ CFX_ByteString csFont;
+ if (m_csDA.IsEmpty()) {
+ return csFont;
+ }
+ CPDF_SimpleParser syntax(m_csDA);
+ if (syntax.FindTagParam("Tf", 2)) {
+ csFont += (CFX_ByteString)syntax.GetWord();
+ csFont += " ";
+ csFont += (CFX_ByteString)syntax.GetWord();
+ csFont += " ";
+ csFont += (CFX_ByteString)syntax.GetWord();
+ }
+ return csFont;
+}
+void CPDF_DefaultAppearance::GetFont(CFX_ByteString& csFontNameTag, FX_FLOAT& fFontSize)
+{
+ csFontNameTag = "";
+ fFontSize = 0;
+ if (m_csDA.IsEmpty()) {
+ return;
+ }
+ CPDF_SimpleParser syntax(m_csDA);
+ if (syntax.FindTagParam("Tf", 2)) {
+ csFontNameTag = (CFX_ByteString)syntax.GetWord();
+ csFontNameTag.Delete(0, 1);
+ fFontSize = FX_atof((CFX_ByteString)syntax.GetWord());
+ }
+ csFontNameTag = PDF_NameDecode(csFontNameTag);
+}
+FX_BOOL CPDF_DefaultAppearance::HasColor(FX_BOOL bStrokingOperation)
+{
+ if (m_csDA.IsEmpty()) {
+ return FALSE;
+ }
+ CPDF_SimpleParser syntax(m_csDA);
+ if (syntax.FindTagParam(bStrokingOperation ? "G" : "g", 1)) {
+ return TRUE;
+ }
+ syntax.SetPos(0);
+ if (syntax.FindTagParam(bStrokingOperation ? "RG" : "rg", 3)) {
+ return TRUE;
+ }
+ syntax.SetPos(0);
+ return syntax.FindTagParam(bStrokingOperation ? "K" : "k", 4);
+}
+CFX_ByteString CPDF_DefaultAppearance::GetColorString(FX_BOOL bStrokingOperation)
+{
+ CFX_ByteString csColor;
+ if (m_csDA.IsEmpty()) {
+ return csColor;
+ }
+ CPDF_SimpleParser syntax(m_csDA);
+ if (syntax.FindTagParam(bStrokingOperation ? "G" : "g", 1)) {
+ csColor += (CFX_ByteString)syntax.GetWord();
+ csColor += " ";
+ csColor += (CFX_ByteString)syntax.GetWord();
+ return csColor;
+ }
+ syntax.SetPos(0);
+ if (syntax.FindTagParam(bStrokingOperation ? "RG" : "rg", 3)) {
+ csColor += (CFX_ByteString)syntax.GetWord();
+ csColor += " ";
+ csColor += (CFX_ByteString)syntax.GetWord();
+ csColor += " ";
+ csColor += (CFX_ByteString)syntax.GetWord();
+ csColor += " ";
+ csColor += (CFX_ByteString)syntax.GetWord();
+ return csColor;
+ }
+ syntax.SetPos(0);
+ if (syntax.FindTagParam(bStrokingOperation ? "K" : "k", 4)) {
+ csColor += (CFX_ByteString)syntax.GetWord();
+ csColor += " ";
+ csColor += (CFX_ByteString)syntax.GetWord();
+ csColor += " ";
+ csColor += (CFX_ByteString)syntax.GetWord();
+ csColor += " ";
+ csColor += (CFX_ByteString)syntax.GetWord();
+ csColor += " ";
+ csColor += (CFX_ByteString)syntax.GetWord();
+ }
+ return csColor;
+}
+void CPDF_DefaultAppearance::GetColor(int& iColorType, FX_FLOAT fc[4], FX_BOOL bStrokingOperation)
+{
+ iColorType = COLORTYPE_TRANSPARENT;
+ for (int c = 0; c < 4; c ++) {
+ fc[c] = 0;
+ }
+ if (m_csDA.IsEmpty()) {
+ return;
+ }
+ CPDF_SimpleParser syntax(m_csDA);
+ if (syntax.FindTagParam(bStrokingOperation ? "G" : "g", 1)) {
+ iColorType = COLORTYPE_GRAY;
+ fc[0] = FX_atof((CFX_ByteString)syntax.GetWord());
+ return;
+ }
+ syntax.SetPos(0);
+ if (syntax.FindTagParam(bStrokingOperation ? "RG" : "rg", 3)) {
+ iColorType = COLORTYPE_RGB;
+ fc[0] = FX_atof((CFX_ByteString)syntax.GetWord());
+ fc[1] = FX_atof((CFX_ByteString)syntax.GetWord());
+ fc[2] = FX_atof((CFX_ByteString)syntax.GetWord());
+ return;
+ }
+ syntax.SetPos(0);
+ if (syntax.FindTagParam(bStrokingOperation ? "K" : "k", 4)) {
+ iColorType = COLORTYPE_CMYK;
+ fc[0] = FX_atof((CFX_ByteString)syntax.GetWord());
+ fc[1] = FX_atof((CFX_ByteString)syntax.GetWord());
+ fc[2] = FX_atof((CFX_ByteString)syntax.GetWord());
+ fc[3] = FX_atof((CFX_ByteString)syntax.GetWord());
+ }
+}
+void CPDF_DefaultAppearance::GetColor(FX_ARGB& color, int& iColorType, FX_BOOL bStrokingOperation)
+{
+ color = 0;
+ iColorType = COLORTYPE_TRANSPARENT;
+ if (m_csDA.IsEmpty()) {
+ return;
+ }
+ CPDF_SimpleParser syntax(m_csDA);
+ if (syntax.FindTagParam(bStrokingOperation ? "G" : "g", 1)) {
+ iColorType = COLORTYPE_GRAY;
+ FX_FLOAT g = FX_atof((CFX_ByteString)syntax.GetWord()) * 255 + 0.5f;
+ color = ArgbEncode(255, (int)g, (int)g, (int)g);
+ return;
+ }
+ syntax.SetPos(0);
+ if (syntax.FindTagParam(bStrokingOperation ? "RG" : "rg", 3)) {
+ iColorType = COLORTYPE_RGB;
+ FX_FLOAT r = FX_atof((CFX_ByteString)syntax.GetWord()) * 255 + 0.5f;
+ FX_FLOAT g = FX_atof((CFX_ByteString)syntax.GetWord()) * 255 + 0.5f;
+ FX_FLOAT b = FX_atof((CFX_ByteString)syntax.GetWord()) * 255 + 0.5f;
+ color = ArgbEncode(255, (int)r, (int)g, (int)b);
+ return;
+ }
+ syntax.SetPos(0);
+ if (syntax.FindTagParam(bStrokingOperation ? "K" : "k", 4)) {
+ iColorType = COLORTYPE_CMYK;
+ FX_FLOAT c = FX_atof((CFX_ByteString)syntax.GetWord());
+ FX_FLOAT m = FX_atof((CFX_ByteString)syntax.GetWord());
+ FX_FLOAT y = FX_atof((CFX_ByteString)syntax.GetWord());
+ FX_FLOAT k = FX_atof((CFX_ByteString)syntax.GetWord());
+ FX_FLOAT r = 1.0f - FX_MIN(1.0f, c + k);
+ FX_FLOAT g = 1.0f - FX_MIN(1.0f, m + k);
+ FX_FLOAT b = 1.0f - FX_MIN(1.0f, y + k);
+ color = ArgbEncode(255, (int)(r * 255 + 0.5f), (int)(g * 255 + 0.5f), (int)(b * 255 + 0.5f));
+ }
+}
+FX_BOOL CPDF_DefaultAppearance::HasTextMatrix()
+{
+ if (m_csDA.IsEmpty()) {
+ return FALSE;
+ }
+ CPDF_SimpleParser syntax(m_csDA);
+ return syntax.FindTagParam("Tm", 6);
+}
+CFX_ByteString CPDF_DefaultAppearance::GetTextMatrixString()
+{
+ CFX_ByteString csTM;
+ if (m_csDA.IsEmpty()) {
+ return csTM;
+ }
+ CPDF_SimpleParser syntax(m_csDA);
+ if (syntax.FindTagParam("Tm", 6)) {
+ for (int i = 0; i < 6; i ++) {
+ csTM += (CFX_ByteString)syntax.GetWord();
+ csTM += " ";
+ }
+ csTM += (CFX_ByteString)syntax.GetWord();
+ }
+ return csTM;
+}
+CFX_AffineMatrix CPDF_DefaultAppearance::GetTextMatrix()
+{
+ CFX_AffineMatrix tm;
+ if (m_csDA.IsEmpty()) {
+ return tm;
+ }
+ CPDF_SimpleParser syntax(m_csDA);
+ if (syntax.FindTagParam("Tm", 6)) {
+ FX_FLOAT f[6];
+ for (int i = 0; i < 6; i ++) {
+ f[i] = FX_atof((CFX_ByteString)syntax.GetWord());
+ }
+ tm.Set(f[0], f[1], f[2], f[3], f[4], f[5]);
+ }
+ return tm;
+}
+void InitInterFormDict(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument)
+{
+ if (pDocument == NULL) {
+ return;
+ }
+ if (pFormDict == NULL) {
+ pFormDict = CPDF_Dictionary::Create();
+ if (pFormDict == NULL) {
+ return;
+ }
+ FX_DWORD dwObjNum = pDocument->AddIndirectObject(pFormDict);
+ CPDF_Dictionary* pRoot = pDocument->GetRoot();
+ pRoot->SetAtReference("AcroForm", pDocument, dwObjNum);
+ }
+ CFX_ByteString csDA;
+ if (!pFormDict->KeyExist("DR")) {
+ CPDF_Font* pFont = NULL;
+ CFX_ByteString csBaseName, csDefault;
+ FX_BYTE charSet = CPDF_InterForm::GetNativeCharSet();
+ pFont = CPDF_InterForm::AddStandardFont(pDocument, "Helvetica");
+ if (pFont != NULL) {
+ AddInterFormFont(pFormDict, pDocument, pFont, csBaseName);
+ csDefault = csBaseName;
+ }
+ if (charSet != 0) {
+ CFX_ByteString csFontName = CPDF_InterForm::GetNativeFont(charSet, NULL);
+ if (pFont == NULL || csFontName != "Helvetica") {
+ pFont = CPDF_InterForm::AddNativeFont(pDocument);
+ if (pFont != NULL) {
+ csBaseName = "";
+ AddInterFormFont(pFormDict, pDocument, pFont, csBaseName);
+ csDefault = csBaseName;
+ }
+ }
+ }
+ if (pFont != NULL) {
+ csDA = "/" + PDF_NameEncode(csDefault) + " 0 Tf";
+ }
+ }
+ if (!csDA.IsEmpty()) {
+ csDA += " ";
+ }
+ csDA += "0 g";
+ if (!pFormDict->KeyExist("DA")) {
+ pFormDict->SetAtString("DA", csDA);
+ }
+}
+FX_DWORD CountInterFormFonts(CPDF_Dictionary* pFormDict)
+{
+ if (pFormDict == NULL) {
+ return 0;
+ }
+ CPDF_Dictionary* pDR = pFormDict->GetDict("DR");
+ if (pDR == NULL) {
+ return 0;
+ }
+ CPDF_Dictionary* pFonts = pDR->GetDict("Font");
+ if (pFonts == NULL) {
+ return 0;
+ }
+ FX_DWORD dwCount = 0;
+ FX_POSITION pos = pFonts->GetStartPos();
+ while (pos) {
+ CPDF_Object* pObj = NULL;
+ CFX_ByteString csKey;
+ pObj = pFonts->GetNextElement(pos, csKey);
+ if (pObj == NULL) {
+ continue;
+ }
+ CPDF_Object* pDirect = pObj->GetDirect();
+ if (pDirect != NULL && pDirect->GetType() == PDFOBJ_DICTIONARY) {
+ if (((CPDF_Dictionary*)pDirect)->GetString("Type") == "Font") {
+ dwCount ++;
+ }
+ }
+ }
+ return dwCount;
+}
+CPDF_Font* GetInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, FX_DWORD index, CFX_ByteString& csNameTag)
+{
+ if (pFormDict == NULL) {
+ return NULL;
+ }
+ CPDF_Dictionary* pDR = pFormDict->GetDict("DR");
+ if (pDR == NULL) {
+ return NULL;
+ }
+ CPDF_Dictionary* pFonts = pDR->GetDict("Font");
+ if (pFonts == NULL) {
+ return NULL;
+ }
+ FX_DWORD dwCount = 0;
+ FX_POSITION pos = pFonts->GetStartPos();
+ while (pos) {
+ CPDF_Object* pObj = NULL;
+ CFX_ByteString csKey;
+ pObj = pFonts->GetNextElement(pos, csKey);
+ if (pObj == NULL) {
+ continue;
+ }
+ CPDF_Object* pDirect = pObj->GetDirect();
+ if (pDirect == NULL || pDirect->GetType() != PDFOBJ_DICTIONARY) {
+ continue;
+ }
+ CPDF_Dictionary* pElement = (CPDF_Dictionary*)pDirect;
+ if (pElement->GetString("Type") != "Font") {
+ continue;
+ }
+ if (dwCount == index) {
+ csNameTag = csKey;
+ return pDocument->LoadFont(pElement);
+ }
+ dwCount ++;
+ }
+ return NULL;
+}
+CPDF_Font* GetInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString csNameTag)
+{
+ CFX_ByteString csAlias = PDF_NameDecode(csNameTag);
+ if (pFormDict == NULL || csAlias.IsEmpty()) {
+ return NULL;
+ }
+ CPDF_Dictionary* pDR = pFormDict->GetDict("DR");
+ if (pDR == NULL) {
+ return NULL;
+ }
+ CPDF_Dictionary* pFonts = pDR->GetDict("Font");
+ if (pFonts == NULL) {
+ return NULL;
+ }
+ CPDF_Dictionary* pElement = pFonts->GetDict(csAlias);
+ if (pElement == NULL) {
+ return NULL;
+ }
+ if (pElement->GetString("Type") == "Font") {
+ return pDocument->LoadFont(pElement);
+ }
+ return NULL;
+}
+CPDF_Font* GetInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString csFontName, CFX_ByteString& csNameTag)
+{
+ if (pFormDict == NULL || csFontName.IsEmpty()) {
+ return NULL;
+ }
+ CPDF_Dictionary* pDR = pFormDict->GetDict("DR");
+ if (pDR == NULL) {
+ return NULL;
+ }
+ CPDF_Dictionary* pFonts = pDR->GetDict("Font");
+ if (pFonts == NULL) {
+ return NULL;
+ }
+ FX_POSITION pos = pFonts->GetStartPos();
+ while (pos) {
+ CPDF_Object* pObj = NULL;
+ CFX_ByteString csKey;
+ pObj = pFonts->GetNextElement(pos, csKey);
+ if (pObj == NULL) {
+ continue;
+ }
+ CPDF_Object* pDirect = pObj->GetDirect();
+ if (pDirect == NULL || pDirect->GetType() != PDFOBJ_DICTIONARY) {
+ continue;
+ }
+ CPDF_Dictionary* pElement = (CPDF_Dictionary*)pDirect;
+ if (pElement->GetString("Type") != "Font") {
+ continue;
+ }
+ CPDF_Font* pFind = pDocument->LoadFont(pElement);
+ if (pFind == NULL) {
+ continue;
+ }
+ CFX_ByteString csBaseFont;
+ csBaseFont = pFind->GetBaseFont();
+ csBaseFont.Remove(' ');
+ if (csBaseFont == csFontName) {
+ csNameTag = csKey;
+ return pFind;
+ }
+ }
+ return NULL;
+}
+CPDF_Font* GetNativeInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, FX_BYTE charSet, CFX_ByteString& csNameTag)
+{
+ if (pFormDict == NULL) {
+ return NULL;
+ }
+ CPDF_Dictionary* pDR = pFormDict->GetDict("DR");
+ if (pDR == NULL) {
+ return NULL;
+ }
+ CPDF_Dictionary* pFonts = pDR->GetDict("Font");
+ if (pFonts == NULL) {
+ return NULL;
+ }
+ FX_POSITION pos = pFonts->GetStartPos();
+ while (pos) {
+ CPDF_Object* pObj = NULL;
+ CFX_ByteString csKey;
+ pObj = pFonts->GetNextElement(pos, csKey);
+ if (pObj == NULL) {
+ continue;
+ }
+ CPDF_Object* pDirect = pObj->GetDirect();
+ if (pDirect == NULL || pDirect->GetType() != PDFOBJ_DICTIONARY) {
+ continue;
+ }
+ CPDF_Dictionary* pElement = (CPDF_Dictionary*)pDirect;
+ if (pElement->GetString("Type") != "Font") {
+ continue;
+ }
+ CPDF_Font* pFind = pDocument->LoadFont(pElement);
+ if (pFind == NULL) {
+ continue;
+ }
+ CFX_SubstFont* pSubst = (CFX_SubstFont*)pFind->GetSubstFont();
+ if (pSubst == NULL) {
+ continue;
+ }
+ if (pSubst->m_Charset == (int)charSet) {
+ csNameTag = csKey;
+ return pFind;
+ }
+ }
+ return NULL;
+}
+CPDF_Font* GetNativeInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString& csNameTag)
+{
+ csNameTag = "";
+ FX_BYTE charSet = CPDF_InterForm::GetNativeCharSet();
+ CFX_SubstFont* pSubst;
+ CPDF_Font* pFont = GetDefaultInterFormFont(pFormDict, pDocument);
+ if (pFont != NULL) {
+ pSubst = (CFX_SubstFont*)pFont->GetSubstFont();
+ if (pSubst != NULL && pSubst->m_Charset == (int)charSet) {
+ FindInterFormFont(pFormDict, pFont, csNameTag);
+ return pFont;
+ }
+ }
+ return GetNativeInterFormFont(pFormDict, pDocument, charSet, csNameTag);
+}
+FX_BOOL FindInterFormFont(CPDF_Dictionary* pFormDict, const CPDF_Font* pFont, CFX_ByteString& csNameTag)
+{
+ if (pFormDict == NULL || pFont == NULL) {
+ return FALSE;
+ }
+ CPDF_Dictionary* pDR = pFormDict->GetDict("DR");
+ if (pDR == NULL) {
+ return FALSE;
+ }
+ CPDF_Dictionary* pFonts = pDR->GetDict("Font");
+ if (pFonts == NULL) {
+ return FALSE;
+ }
+ FX_POSITION pos = pFonts->GetStartPos();
+ while (pos) {
+ CPDF_Object* pObj = NULL;
+ CFX_ByteString csKey;
+ pObj = pFonts->GetNextElement(pos, csKey);
+ if (pObj == NULL) {
+ continue;
+ }
+ CPDF_Object* pDirect = pObj->GetDirect();
+ if (pDirect == NULL || pDirect->GetType() != PDFOBJ_DICTIONARY) {
+ continue;
+ }
+ CPDF_Dictionary* pElement = (CPDF_Dictionary*)pDirect;
+ if (pElement->GetString("Type") != "Font") {
+ continue;
+ }
+ if (pFont->GetFontDict() == pElement) {
+ csNameTag = csKey;
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+FX_BOOL FindInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString csFontName, CPDF_Font*& pFont, CFX_ByteString& csNameTag)
+{
+ if (pFormDict == NULL) {
+ return FALSE;
+ }
+ CPDF_Dictionary* pDR = pFormDict->GetDict("DR");
+ if (pDR == NULL) {
+ return FALSE;
+ }
+ CPDF_Dictionary* pFonts = pDR->GetDict("Font");
+ if (pFonts == NULL) {
+ return FALSE;
+ }
+ if (csFontName.GetLength() > 0) {
+ csFontName.Remove(' ');
+ }
+ FX_POSITION pos = pFonts->GetStartPos();
+ while (pos) {
+ CPDF_Object* pObj = NULL;
+ CFX_ByteString csKey, csTmp;
+ pObj = pFonts->GetNextElement(pos, csKey);
+ if (pObj == NULL) {
+ continue;
+ }
+ CPDF_Object* pDirect = pObj->GetDirect();
+ if (pDirect == NULL || pDirect->GetType() != PDFOBJ_DICTIONARY) {
+ continue;
+ }
+ CPDF_Dictionary* pElement = (CPDF_Dictionary*)pDirect;
+ if (pElement->GetString("Type") != "Font") {
+ continue;
+ }
+ pFont = pDocument->LoadFont(pElement);
+ if (pFont == NULL) {
+ continue;
+ }
+ CFX_ByteString csBaseFont;
+ csBaseFont = pFont->GetBaseFont();
+ csBaseFont.Remove(' ');
+ if (csBaseFont == csFontName) {
+ csNameTag = csKey;
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+void AddInterFormFont(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument, const CPDF_Font* pFont, CFX_ByteString& csNameTag)
+{
+ if (pFont == NULL) {
+ return;
+ }
+ if (pFormDict == NULL) {
+ InitInterFormDict(pFormDict, pDocument);
+ }
+ CFX_ByteString csTag;
+ if (FindInterFormFont(pFormDict, pFont, csTag)) {
+ csNameTag = csTag;
+ return;
+ }
+ if (pFormDict == NULL) {
+ InitInterFormDict(pFormDict, pDocument);
+ }
+ CPDF_Dictionary* pDR = pFormDict->GetDict("DR");
+ if (pDR == NULL) {
+ pDR = CPDF_Dictionary::Create();
+ if (pDR == NULL) {
+ return;
+ }
+ pFormDict->SetAt("DR", pDR);
+ }
+ CPDF_Dictionary* pFonts = pDR->GetDict("Font");
+ if (pFonts == NULL) {
+ pFonts = CPDF_Dictionary::Create();
+ pDR->SetAt("Font", pFonts);
+ }
+ if (csNameTag.IsEmpty()) {
+ csNameTag = pFont->GetBaseFont();
+ }
+ csNameTag.Remove(' ');
+ csNameTag = CPDF_InterForm::GenerateNewResourceName(pDR, "Font", 4, csNameTag);
+ pFonts->SetAtReference(csNameTag, pDocument, pFont->GetFontDict());
+}
+CPDF_Font* AddNativeInterFormFont(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument, FX_BYTE charSet, CFX_ByteString& csNameTag)
+{
+ if (pFormDict == NULL) {
+ InitInterFormDict(pFormDict, pDocument);
+ }
+ CFX_ByteString csTemp;
+ CPDF_Font* pFont = GetNativeInterFormFont(pFormDict, pDocument, charSet, csTemp);
+ if (pFont != NULL) {
+ csNameTag = csTemp;
+ return pFont;
+ }
+ CFX_ByteString csFontName = CPDF_InterForm::GetNativeFont(charSet);
+ if (!csFontName.IsEmpty()) {
+ if (FindInterFormFont(pFormDict, pDocument, csFontName, pFont, csNameTag)) {
+ return pFont;
+ }
+ }
+ pFont = CPDF_InterForm::AddNativeFont(charSet, pDocument);
+ if (pFont != NULL) {
+ AddInterFormFont(pFormDict, pDocument, pFont, csNameTag);
+ }
+ return pFont;
+}
+CPDF_Font* AddNativeInterFormFont(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument, CFX_ByteString& csNameTag)
+{
+ FX_BYTE charSet = CPDF_InterForm::GetNativeCharSet();
+ return AddNativeInterFormFont(pFormDict, pDocument, charSet, csNameTag);
+}
+void RemoveInterFormFont(CPDF_Dictionary* pFormDict, const CPDF_Font* pFont)
+{
+ if (pFormDict == NULL || pFont == NULL) {
+ return;
+ }
+ CFX_ByteString csTag;
+ if (!FindInterFormFont(pFormDict, pFont, csTag)) {
+ return;
+ }
+ CPDF_Dictionary* pDR = pFormDict->GetDict("DR");
+ CPDF_Dictionary* pFonts = pDR->GetDict("Font");
+ pFonts->RemoveAt(csTag);
+}
+void RemoveInterFormFont(CPDF_Dictionary* pFormDict, CFX_ByteString csNameTag)
+{
+ if (pFormDict == NULL || csNameTag.IsEmpty()) {
+ return;
+ }
+ CPDF_Dictionary* pDR = pFormDict->GetDict("DR");
+ if (pDR == NULL) {
+ return;
+ }
+ CPDF_Dictionary* pFonts = pDR->GetDict("Font");
+ if (pFonts == NULL) {
+ return;
+ }
+ pFonts->RemoveAt(csNameTag);
+}
+CPDF_Font* GetDefaultInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument)
+{
+ if (pFormDict == NULL) {
+ return NULL;
+ }
+ CPDF_DefaultAppearance cDA = pFormDict->GetString("DA");
+ CFX_ByteString csFontNameTag;
+ FX_FLOAT fFontSize;
+ cDA.GetFont(csFontNameTag, fFontSize);
+ return GetInterFormFont(pFormDict, pDocument, csFontNameTag);
+}
+CPDF_IconFit::ScaleMethod CPDF_IconFit::GetScaleMethod()
+{
+ if (m_pDict == NULL) {
+ return Always;
+ }
+ CFX_ByteString csSW = m_pDict->GetString("SW", "A");
+ if (csSW == "B") {
+ return Bigger;
+ } else if (csSW == "S") {
+ return Smaller;
+ } else if (csSW == "N") {
+ return Never;
+ }
+ return Always;
+}
+FX_BOOL CPDF_IconFit::IsProportionalScale()
+{
+ if (m_pDict == NULL) {
+ return TRUE;
+ }
+ return m_pDict->GetString("S", "P") != "A";
+}
+void CPDF_IconFit::GetIconPosition(FX_FLOAT& fLeft, FX_FLOAT& fBottom)
+{
+ fLeft = fBottom = 0.5;
+ if (m_pDict == NULL) {
+ return;
+ }
+ CPDF_Array* pA = m_pDict->GetArray("A");
+ if (pA != NULL) {
+ FX_DWORD dwCount = pA->GetCount();
+ if (dwCount > 0) {
+ fLeft = pA->GetNumber(0);
+ }
+ if (dwCount > 1) {
+ fBottom = pA->GetNumber(1);
+ }
+ }
+}
+FX_BOOL CPDF_IconFit::GetFittingBounds()
+{
+ if (m_pDict == NULL) {
+ return FALSE;
+ }
+ return m_pDict->GetBoolean("FB");
+}
+void SaveCheckedFieldStatus(CPDF_FormField* pField, CFX_ByteArray& statusArray)
+{
+ int iCount = pField->CountControls();
+ for (int i = 0; i < iCount; i ++) {
+ CPDF_FormControl* pControl = pField->GetControl(i);
+ if (pControl == NULL) {
+ continue;
+ }
+ statusArray.Add(pControl->IsChecked() ? 1 : 0);
+ }
+}
+CPDF_Object* FPDF_GetFieldAttr(CPDF_Dictionary* pFieldDict, const FX_CHAR* name, int nLevel)
+{
+ if (nLevel > FPDFDOC_UTILS_MAXRECURSION) {
+ return NULL;
+ }
+ if (pFieldDict == NULL) {
+ return NULL;
+ }
+ CPDF_Object* pAttr = pFieldDict->GetElementValue(name);
+ if (pAttr) {
+ return pAttr;
+ }
+ CPDF_Dictionary* pParent = pFieldDict->GetDict("Parent");
+ if (pParent == NULL) {
+ return NULL;
+ }
+ return FPDF_GetFieldAttr(pParent, name, nLevel + 1);
+}
diff --git a/core/src/fpdfdoc/doc_viewerPreferences.cpp b/core/src/fpdfdoc/doc_viewerPreferences.cpp
index 80af0b50fd..617485cfc2 100644
--- a/core/src/fpdfdoc/doc_viewerPreferences.cpp
+++ b/core/src/fpdfdoc/doc_viewerPreferences.cpp
@@ -1,31 +1,31 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../include/fpdfdoc/fpdf_doc.h"
-CPDF_ViewerPreferences::CPDF_ViewerPreferences(CPDF_Document *pDoc): m_pDoc(pDoc)
-{
-}
-CPDF_ViewerPreferences::~CPDF_ViewerPreferences()
-{
-}
-FX_BOOL CPDF_ViewerPreferences::IsDirectionR2L() const
-{
- CPDF_Dictionary *pDict = m_pDoc->GetRoot();
- pDict = pDict->GetDict(FX_BSTRC("ViewerPreferences"));
- if (!pDict) {
- return FALSE;
- }
- return FX_BSTRC("R2L") == pDict->GetString(FX_BSTRC("Direction"));
-}
-FX_BOOL CPDF_ViewerPreferences::PrintScaling() const
-{
- CPDF_Dictionary *pDict = m_pDoc->GetRoot();
- pDict = pDict->GetDict(FX_BSTRC("ViewerPreferences"));
- if (!pDict) {
- return TRUE;
- }
- return FX_BSTRC("None") != pDict->GetString(FX_BSTRC("PrintScaling"));
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fpdfdoc/fpdf_doc.h"
+CPDF_ViewerPreferences::CPDF_ViewerPreferences(CPDF_Document *pDoc): m_pDoc(pDoc)
+{
+}
+CPDF_ViewerPreferences::~CPDF_ViewerPreferences()
+{
+}
+FX_BOOL CPDF_ViewerPreferences::IsDirectionR2L() const
+{
+ CPDF_Dictionary *pDict = m_pDoc->GetRoot();
+ pDict = pDict->GetDict(FX_BSTRC("ViewerPreferences"));
+ if (!pDict) {
+ return FALSE;
+ }
+ return FX_BSTRC("R2L") == pDict->GetString(FX_BSTRC("Direction"));
+}
+FX_BOOL CPDF_ViewerPreferences::PrintScaling() const
+{
+ CPDF_Dictionary *pDict = m_pDoc->GetRoot();
+ pDict = pDict->GetDict(FX_BSTRC("ViewerPreferences"));
+ if (!pDict) {
+ return TRUE;
+ }
+ return FX_BSTRC("None") != pDict->GetString(FX_BSTRC("PrintScaling"));
+}
diff --git a/core/src/fpdfdoc/doc_vt.cpp b/core/src/fpdfdoc/doc_vt.cpp
index 251173da22..9de9ffd426 100644
--- a/core/src/fpdfdoc/doc_vt.cpp
+++ b/core/src/fpdfdoc/doc_vt.cpp
@@ -1,1864 +1,1864 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../include/fpdfdoc/fpdf_doc.h"
-#include "../../include/fpdfdoc/fpdf_vt.h"
-#include "pdf_vt.h"
-const FX_BYTE gFontSizeSteps[] = { 4, 6, 8, 9, 10, 12, 14, 18, 20, 25, 30, 35, 40, 45, 50, 55, 60, 70, 80, 90, 100, 110, 120, 130, 144};
-#define PVT_RETURN_LENGTH 1
-#define PVT_DEFAULT_FONTSIZE 18.0f
-#define PVTWORD_SCRIPT_NORMAL 0
-#define PVTWORD_SCRIPT_SUPER 1
-#define PVTWORD_SCRIPT_SUB 2
-#define PVT_FONTSCALE 0.001f
-#define PVT_PERCENT 0.01f
-#define PVT_HALF 0.5f
-CLine::CLine()
-{
-}
-CLine::~CLine()
-{
-}
-CPVT_WordPlace CLine::GetBeginWordPlace() const
-{
- return CPVT_WordPlace(LinePlace.nSecIndex, LinePlace.nLineIndex, -1);
-}
-CPVT_WordPlace CLine::GetEndWordPlace() const
-{
- return CPVT_WordPlace(LinePlace.nSecIndex, LinePlace.nLineIndex, m_LineInfo.nEndWordIndex);
-}
-CPVT_WordPlace CLine::GetPrevWordPlace(const CPVT_WordPlace & place) const
-{
- if (place.nWordIndex > m_LineInfo.nEndWordIndex) {
- return CPVT_WordPlace(place.nSecIndex, place.nLineIndex, m_LineInfo.nEndWordIndex);
- }
- return CPVT_WordPlace(place.nSecIndex, place.nLineIndex, place.nWordIndex - 1);
-}
-CPVT_WordPlace CLine::GetNextWordPlace(const CPVT_WordPlace & place) const
-{
- if (place.nWordIndex < m_LineInfo.nBeginWordIndex) {
- return CPVT_WordPlace(place.nSecIndex, place.nLineIndex, m_LineInfo.nBeginWordIndex);
- }
- return CPVT_WordPlace(place.nSecIndex, place.nLineIndex, place.nWordIndex + 1);
-}
-CSection::CSection(CPDF_VariableText * pVT) : m_pVT(pVT)
-{
-}
-CSection::~CSection()
-{
- ResetAll();
-}
-void CSection::ResetAll()
-{
- ResetWordArray();
- ResetLineArray();
-}
-void CSection::ResetLineArray()
-{
- m_LineArray.RemoveAll();
-}
-void CSection::ResetWordArray()
-{
- for (FX_INT32 i = 0, sz = m_WordArray.GetSize(); i < sz; i++) {
- delete m_WordArray.GetAt(i);
- }
- m_WordArray.RemoveAll();
-}
-void CSection::ResetLinePlace()
-{
- for (FX_INT32 i = 0, sz = m_LineArray.GetSize(); i < sz; i++) {
- if (CLine * pLine = m_LineArray.GetAt(i)) {
- pLine->LinePlace = CPVT_WordPlace(SecPlace.nSecIndex, i, -1);
- }
- }
-}
-CPVT_WordPlace CSection::AddWord(const CPVT_WordPlace & place, const CPVT_WordInfo & wordinfo)
-{
- if (CPVT_WordInfo * pWord = FX_NEW CPVT_WordInfo(wordinfo)) {
- FX_INT32 nWordIndex = FPDF_MAX(FPDF_MIN(place.nWordIndex, this->m_WordArray.GetSize()), 0);
- if (nWordIndex == m_WordArray.GetSize()) {
- m_WordArray.Add(pWord);
- } else {
- m_WordArray.InsertAt(nWordIndex, pWord);
- }
- }
- return place;
-}
-CPVT_WordPlace CSection::AddLine(const CPVT_LineInfo & lineinfo)
-{
- return CPVT_WordPlace(SecPlace.nSecIndex, m_LineArray.Add(lineinfo), -1);
-}
-CPVT_FloatRect CSection::Rearrange()
-{
- ASSERT(m_pVT != NULL);
- if (m_pVT->m_nCharArray > 0) {
- return CTypeset(this).CharArray();
- } else {
- return CTypeset(this).Typeset();
- }
-}
-CPVT_Size CSection::GetSectionSize(FX_FLOAT fFontSize)
-{
- return CTypeset(this).GetEditSize(fFontSize);
-}
-CPVT_WordPlace CSection::GetBeginWordPlace() const
-{
- if (CLine * pLine = m_LineArray.GetAt(0)) {
- return pLine->GetBeginWordPlace();
- } else {
- return SecPlace;
- }
-}
-CPVT_WordPlace CSection::GetEndWordPlace() const
-{
- if (CLine * pLine = m_LineArray.GetAt(m_LineArray.GetSize() - 1)) {
- return pLine->GetEndWordPlace();
- } else {
- return this->SecPlace;
- }
-}
-CPVT_WordPlace CSection::GetPrevWordPlace(const CPVT_WordPlace & place) const
-{
- if (place.nLineIndex < 0) {
- return GetBeginWordPlace();
- }
- if (place.nLineIndex >= m_LineArray.GetSize()) {
- return GetEndWordPlace();
- }
- if (CLine * pLine = m_LineArray.GetAt(place.nLineIndex)) {
- if (place.nWordIndex == pLine->m_LineInfo.nBeginWordIndex) {
- return CPVT_WordPlace(place.nSecIndex, place.nLineIndex, -1);
- } else if (place.nWordIndex < pLine->m_LineInfo.nBeginWordIndex) {
- if (CLine * pPrevLine = m_LineArray.GetAt(place.nLineIndex - 1)) {
- return pPrevLine->GetEndWordPlace();
- }
- } else {
- return pLine->GetPrevWordPlace(place);
- }
- }
- return place;
-}
-CPVT_WordPlace CSection::GetNextWordPlace(const CPVT_WordPlace & place) const
-{
- if (place.nLineIndex < 0) {
- return GetBeginWordPlace();
- }
- if (place.nLineIndex >= m_LineArray.GetSize()) {
- return GetEndWordPlace();
- }
- if (CLine * pLine = m_LineArray.GetAt(place.nLineIndex)) {
- if (place.nWordIndex >= pLine->m_LineInfo.nEndWordIndex) {
- if (CLine * pNextLine = m_LineArray.GetAt(place.nLineIndex + 1)) {
- return pNextLine->GetBeginWordPlace();
- }
- } else {
- return pLine->GetNextWordPlace(place);
- }
- }
- return place;
-}
-void CSection::UpdateWordPlace(CPVT_WordPlace & place) const
-{
- FX_INT32 nLeft = 0;
- FX_INT32 nRight = m_LineArray.GetSize() - 1;
- FX_INT32 nMid = (nLeft + nRight) / 2;
- while (nLeft <= nRight) {
- if (CLine * pLine = m_LineArray.GetAt(nMid)) {
- if (place.nWordIndex < pLine->m_LineInfo.nBeginWordIndex) {
- nRight = nMid - 1;
- nMid = (nLeft + nRight) / 2;
- } else if (place.nWordIndex > pLine->m_LineInfo.nEndWordIndex) {
- nLeft = nMid + 1;
- nMid = (nLeft + nRight) / 2;
- } else {
- place.nLineIndex = nMid;
- return;
- }
- } else {
- break;
- }
- }
-}
-CPVT_WordPlace CSection::SearchWordPlace(const CPDF_Point & point) const
-{
- ASSERT(m_pVT != NULL);
- CPVT_WordPlace place = GetBeginWordPlace();
- FX_BOOL bUp = TRUE;
- FX_BOOL bDown = TRUE;
- FX_INT32 nLeft = 0;
- FX_INT32 nRight = m_LineArray.GetSize() - 1;
- FX_INT32 nMid = m_LineArray.GetSize() / 2;
- FX_FLOAT fTop = 0;
- FX_FLOAT fBottom = 0;
- while (nLeft <= nRight) {
- if (CLine * pLine = m_LineArray.GetAt(nMid)) {
- fTop = pLine->m_LineInfo.fLineY - pLine->m_LineInfo.fLineAscent - m_pVT->GetLineLeading(m_SecInfo);
- fBottom = pLine->m_LineInfo.fLineY - pLine->m_LineInfo.fLineDescent;
- if (IsFloatBigger(point.y, fTop)) {
- bUp = FALSE;
- }
- if (IsFloatSmaller(point.y, fBottom)) {
- bDown = FALSE;
- }
- if (IsFloatSmaller(point.y, fTop)) {
- nRight = nMid - 1;
- nMid = (nLeft + nRight) / 2;
- continue;
- } else if (IsFloatBigger(point.y, fBottom)) {
- nLeft = nMid + 1;
- nMid = (nLeft + nRight) / 2;
- continue;
- } else {
- place = SearchWordPlace(point.x,
- CPVT_WordRange(pLine->GetNextWordPlace(pLine->GetBeginWordPlace()), pLine->GetEndWordPlace())
- );
- place.nLineIndex = nMid;
- return place;
- }
- }
- }
- if (bUp) {
- place = GetBeginWordPlace();
- }
- if (bDown) {
- place = GetEndWordPlace();
- }
- return place;
-}
-CPVT_WordPlace CSection::SearchWordPlace(FX_FLOAT fx, const CPVT_WordPlace & lineplace) const
-{
- if (CLine * pLine = m_LineArray.GetAt(lineplace.nLineIndex)) {
- return SearchWordPlace(fx - m_SecInfo.rcSection.left,
- CPVT_WordRange(pLine->GetNextWordPlace(pLine->GetBeginWordPlace()), pLine->GetEndWordPlace()));
- }
- return GetBeginWordPlace();
-}
-CPVT_WordPlace CSection::SearchWordPlace(FX_FLOAT fx, const CPVT_WordRange & range) const
-{
- CPVT_WordPlace wordplace = range.BeginPos;
- wordplace.nWordIndex = -1;
- if (!m_pVT) {
- return wordplace;
- }
- FX_INT32 nLeft = range.BeginPos.nWordIndex;
- FX_INT32 nRight = range.EndPos.nWordIndex + 1;
- FX_INT32 nMid = (nLeft + nRight) / 2;
- while (nLeft < nRight) {
- if (nMid == nLeft) {
- break;
- }
- if (nMid == nRight) {
- nMid--;
- break;
- }
- if (CPVT_WordInfo * pWord = m_WordArray.GetAt(nMid)) {
- if (fx > pWord->fWordX + m_pVT->GetWordWidth(*pWord) * PVT_HALF) {
- nLeft = nMid;
- nMid = (nLeft + nRight) / 2;
- continue;
- } else {
- nRight = nMid;
- nMid = (nLeft + nRight) / 2;
- continue;
- }
- } else {
- break;
- }
- }
- if (CPVT_WordInfo * pWord = m_WordArray.GetAt(nMid)) {
- if (fx > pWord->fWordX + m_pVT->GetWordWidth(*pWord) * PVT_HALF) {
- wordplace.nWordIndex = nMid;
- }
- }
- return wordplace;
-}
-void CSection::ClearLeftWords(FX_INT32 nWordIndex)
-{
- for (FX_INT32 i = nWordIndex; i >= 0; i--) {
- delete m_WordArray.GetAt(i);
- m_WordArray.RemoveAt(i);
- }
-}
-void CSection::ClearRightWords(FX_INT32 nWordIndex)
-{
- for (FX_INT32 i = m_WordArray.GetSize() - 1; i > nWordIndex; i--) {
- delete m_WordArray.GetAt(i);
- m_WordArray.RemoveAt(i);
- }
-}
-void CSection::ClearMidWords(FX_INT32 nBeginIndex, FX_INT32 nEndIndex)
-{
- for (FX_INT32 i = nEndIndex; i > nBeginIndex; i--) {
- delete m_WordArray.GetAt(i);
- m_WordArray.RemoveAt(i);
- }
-}
-void CSection::ClearWords(const CPVT_WordRange & PlaceRange)
-{
- CPVT_WordPlace SecBeginPos = GetBeginWordPlace();
- CPVT_WordPlace SecEndPos = GetEndWordPlace();
- if (PlaceRange.BeginPos.WordCmp(SecBeginPos) >= 0) {
- if (PlaceRange.EndPos.WordCmp(SecEndPos) <= 0) {
- ClearMidWords(PlaceRange.BeginPos.nWordIndex, PlaceRange.EndPos.nWordIndex);
- } else {
- ClearRightWords(PlaceRange.BeginPos.nWordIndex);
- }
- } else if (PlaceRange.EndPos.WordCmp(SecEndPos) <= 0) {
- ClearLeftWords(PlaceRange.EndPos.nWordIndex);
- } else {
- ResetWordArray();
- }
-}
-void CSection::ClearWord(const CPVT_WordPlace & place)
-{
- delete m_WordArray.GetAt(place.nWordIndex);
- m_WordArray.RemoveAt(place.nWordIndex);
-}
-CTypeset::CTypeset(CSection * pSection) : m_pSection(pSection), m_pVT(pSection->m_pVT), m_rcRet(0.0f, 0.0f, 0.0f, 0.0f)
-{
-}
-CTypeset::~CTypeset()
-{
-}
-CPVT_FloatRect CTypeset::CharArray()
-{
- ASSERT(m_pSection != NULL);
- ASSERT(m_pVT != NULL);
- FX_FLOAT fLineAscent = m_pVT->GetFontAscent(m_pVT->GetDefaultFontIndex(), m_pVT->GetFontSize());
- FX_FLOAT fLineDescent = m_pVT->GetFontDescent(m_pVT->GetDefaultFontIndex(), m_pVT->GetFontSize());
- m_rcRet.Default();
- FX_FLOAT x = 0.0f, y = 0.0f;
- FX_FLOAT fNextWidth;
- FX_INT32 nStart = 0;
- FX_FLOAT fNodeWidth = m_pVT->GetPlateWidth() / (m_pVT->m_nCharArray <= 0 ? 1 : m_pVT->m_nCharArray);
- if (CLine * pLine = m_pSection->m_LineArray.GetAt(0)) {
- x = 0.0f;
- y += m_pVT->GetLineLeading(m_pSection->m_SecInfo);
- y += fLineAscent;
- nStart = 0;
- switch (m_pVT->GetAlignment(m_pSection->m_SecInfo)) {
- case 0:
- pLine->m_LineInfo.fLineX = fNodeWidth * PVT_HALF;
- break;
- case 1:
- nStart = (m_pVT->m_nCharArray - m_pSection->m_WordArray.GetSize()) / 2;
- pLine->m_LineInfo.fLineX = fNodeWidth * nStart - fNodeWidth * PVT_HALF;
- break;
- case 2:
- nStart = m_pVT->m_nCharArray - m_pSection->m_WordArray.GetSize();
- pLine->m_LineInfo.fLineX = fNodeWidth * nStart - fNodeWidth * PVT_HALF;
- break;
- }
- for (FX_INT32 w = 0, sz = m_pSection->m_WordArray.GetSize(); w < sz; w++) {
- if (w >= m_pVT->m_nCharArray) {
- break;
- }
- fNextWidth = 0;
- if (CPVT_WordInfo * pNextWord = (CPVT_WordInfo *)m_pSection->m_WordArray.GetAt(w + 1)) {
- pNextWord->fWordTail = 0;
- fNextWidth = m_pVT->GetWordWidth(*pNextWord);
- }
- if (CPVT_WordInfo * pWord = (CPVT_WordInfo *)m_pSection->m_WordArray.GetAt(w)) {
- pWord->fWordTail = 0;
- FX_FLOAT fWordWidth = m_pVT->GetWordWidth(*pWord);
- FX_FLOAT fWordAscent = m_pVT->GetWordAscent(*pWord);
- FX_FLOAT fWordDescent = m_pVT->GetWordDescent(*pWord);
- x = (FX_FLOAT)(fNodeWidth * (w + nStart + 0.5) - fWordWidth * PVT_HALF);
- pWord->fWordX = x;
- pWord->fWordY = y;
- if (w == 0) {
- pLine->m_LineInfo.fLineX = x;
- }
- if (w != m_pSection->m_WordArray.GetSize() - 1)
- pWord->fWordTail = (fNodeWidth - (fWordWidth + fNextWidth) * PVT_HALF > 0 ?
- fNodeWidth - (fWordWidth + fNextWidth) * PVT_HALF : 0);
- else {
- pWord->fWordTail = 0;
- }
- x += fWordWidth;
- fLineAscent = FPDF_MAX(fLineAscent, fWordAscent);
- fLineDescent = FPDF_MIN(fLineDescent, fWordDescent);
- }
- }
- pLine->m_LineInfo.nBeginWordIndex = 0;
- pLine->m_LineInfo.nEndWordIndex = m_pSection->m_WordArray.GetSize() - 1;
- pLine->m_LineInfo.fLineY = y;
- pLine->m_LineInfo.fLineWidth = x - pLine->m_LineInfo.fLineX;
- pLine->m_LineInfo.fLineAscent = fLineAscent;
- pLine->m_LineInfo.fLineDescent = fLineDescent;
- y += (-fLineDescent);
- }
- return m_rcRet = CPVT_FloatRect(0, 0, x, y);
-}
-CPVT_Size CTypeset::GetEditSize(FX_FLOAT fFontSize)
-{
- ASSERT(m_pSection != NULL);
- ASSERT(m_pVT != NULL);
- SplitLines(FALSE, fFontSize);
- return CPVT_Size(m_rcRet.Width(), m_rcRet.Height());
-}
-CPVT_FloatRect CTypeset::Typeset()
-{
- ASSERT(m_pSection != NULL);
- ASSERT(m_pVT != NULL);
- m_pSection->m_LineArray.Empty();
- SplitLines(TRUE, 0.0f);
- m_pSection->m_LineArray.Clear();
- OutputLines();
- return m_rcRet;
-}
-static int special_chars[128] = {
- 0x0000, 0x000C, 0x0008, 0x000C, 0x0008, 0x0000, 0x0020, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0008, 0x0008, 0x0000, 0x0010, 0x0000, 0x0000, 0x0028,
- 0x000C, 0x0008, 0x0000, 0x0000, 0x0028, 0x0028, 0x0028, 0x0028,
- 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
- 0x0002, 0x0002, 0x0008, 0x0008, 0x0000, 0x0000, 0x0000, 0x0008,
- 0x0000, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
- 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
- 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
- 0x0001, 0x0001, 0x0001, 0x000C, 0x0000, 0x0008, 0x0000, 0x0000,
- 0x0000, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
- 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
- 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
- 0x0001, 0x0001, 0x0001, 0x000C, 0x0000, 0x0008, 0x0000, 0x0000,
-};
-static FX_BOOL IsLatin(FX_WORD word)
-{
- if (word <= 0x007F) {
- if (special_chars[word] & 0x0001) {
- return TRUE;
- }
- }
- if ((word >= 0x00C0 && word <= 0x00FF) ||
- (word >= 0x0100 && word <= 0x024F) ||
- (word >= 0x1E00 && word <= 0x1EFF) ||
- (word >= 0x2C60 && word <= 0x2C7F) ||
- (word >= 0xA720 && word <= 0xA7FF) ||
- (word >= 0xFF21 && word <= 0xFF3A) ||
- (word >= 0xFF41 && word <= 0xFF5A)) {
- return TRUE;
- }
- return FALSE;
-}
-static FX_BOOL IsDigit(FX_DWORD word)
-{
- return (word >= 0x0030 && word <= 0x0039) ? TRUE : FALSE;
-}
-static FX_BOOL IsCJK(FX_DWORD word)
-{
- if ((word >= 0x1100 && word <= 0x11FF) ||
- (word >= 0x2E80 && word <= 0x2FFF) ||
- (word >= 0x3040 && word <= 0x9FBF) ||
- (word >= 0xAC00 && word <= 0xD7AF) ||
- (word >= 0xF900 && word <= 0xFAFF) ||
- (word >= 0xFE30 && word <= 0xFE4F) ||
- (word >= 0x20000 && word <= 0x2A6DF) ||
- (word >= 0x2F800 && word <= 0x2FA1F)) {
- return TRUE;
- }
- if (word >= 0x3000 && word <= 0x303F) {
- if (word == 0x3005 || word == 0x3006 || word == 0x3021 || word == 0x3022 ||
- word == 0x3023 || word == 0x3024 || word == 0x3025 || word == 0x3026 ||
- word == 0x3027 || word == 0x3028 || word == 0x3029 || word == 0x3031 ||
- word == 0x3032 || word == 0x3033 || word == 0x3034 || word == 0x3035) {
- return TRUE;
- }
- return FALSE;
- }
- if (word >= 0xFF66 && word <= 0xFF9D) {
- return TRUE;
- }
- return FALSE;
-}
-static FX_BOOL IsPunctuation(FX_DWORD word)
-{
- if (word <= 0x007F) {
- if ((special_chars[word] >> 3) & 1) {
- return TRUE;
- }
- } else if (word >= 0x0080 && word <= 0x00FF) {
- if (word == 0x0082 || word == 0x0084 || word == 0x0085 || word == 0x0091 ||
- word == 0x0092 || word == 0x0093 || word <= 0x0094 || word == 0x0096 ||
- word == 0x00B4 || word == 0x00B8) {
- return TRUE;
- }
- } else if (word >= 0x2000 && word <= 0x206F) {
- if (word == 0x2010 || word == 0x2011 || word == 0x2012 || word == 0x2013 ||
- word == 0x2018 || word == 0x2019 || word == 0x201A || word == 0x201B ||
- word == 0x201C || word == 0x201D || word == 0x201E || word == 0x201F ||
- word == 0x2032 || word == 0x2033 || word == 0x2034 || word == 0x2035 ||
- word == 0x2036 || word == 0x2037 || word == 0x203C || word == 0x203D ||
- word == 0x203E || word == 0x2044) {
- return TRUE;
- }
- } else if (word >= 0x3000 && word <= 0x303F) {
- if (word == 0x3001 || word == 0x3002 || word == 0x3003 || word == 0x3005 ||
- word == 0x3009 || word == 0x300A || word == 0x300B || word == 0x300C ||
- word == 0x300D || word == 0x300F || word == 0x300E || word == 0x3010 ||
- word == 0x3011 || word == 0x3014 || word == 0x3015 || word == 0x3016 ||
- word == 0x3017 || word == 0x3018 || word == 0x3019 || word == 0x301A ||
- word == 0x301B || word == 0x301D || word == 0x301E || word == 0x301F) {
- return TRUE;
- }
- } else if (word >= 0xFE50 && word <= 0xFE6F) {
- if ((word >= 0xFE50 && word <= 0xFE5E) || word == 0xFE63) {
- return TRUE;
- }
- } else if (word >= 0xFF00 && word <= 0xFFEF) {
- if (word == 0xFF01 || word == 0xFF02 || word == 0xFF07 || word == 0xFF08 ||
- word == 0xFF09 || word == 0xFF0C || word == 0xFF0E || word == 0xFF0F ||
- word == 0xFF1A || word == 0xFF1B || word == 0xFF1F || word == 0xFF3B ||
- word == 0xFF3D || word == 0xFF40 || word == 0xFF5B || word == 0xFF5C ||
- word == 0xFF5D || word == 0xFF61 || word == 0xFF62 || word == 0xFF63 ||
- word == 0xFF64 || word == 0xFF65 || word == 0xFF9E || word == 0xFF9F) {
- return TRUE;
- }
- }
- return FALSE;
-}
-static FX_BOOL IsConnectiveSymbol(FX_DWORD word)
-{
- if (word <= 0x007F) {
- if ((special_chars[word] >> 5) & 1) {
- return TRUE;
- }
- }
- return FALSE;
-}
-static FX_BOOL IsOpenStylePunctuation(FX_DWORD word)
-{
- if (word <= 0x007F) {
- if ((special_chars[word] >> 2) & 1) {
- return TRUE;
- }
- } else if (word == 0x300A || word == 0x300C || word == 0x300E || word == 0x3010 ||
- word == 0x3014 || word == 0x3016 || word == 0x3018 || word == 0x301A ||
- word == 0xFF08 || word == 0xFF3B || word == 0xFF5B || word == 0xFF62) {
- return TRUE;
- }
- return FALSE;
-}
-static FX_BOOL IsCurrencySymbol(FX_WORD word)
-{
- if (word == 0x0024 || word == 0x0080 || word == 0x00A2 || word == 0x00A3 ||
- word == 0x00A4 || word == 0x00A5 || (word >= 0x20A0 && word <= 0x20CF) ||
- word == 0xFE69 || word == 0xFF04 || word == 0xFFE0 || word == 0xFFE1 ||
- word == 0xFFE5 || word == 0xFFE6) {
- return TRUE;
- }
- return FALSE;
-}
-static FX_BOOL IsPrefixSymbol(FX_WORD word)
-{
- if (IsCurrencySymbol(word)) {
- return TRUE;
- }
- if (word == 0x2116) {
- return TRUE;
- }
- return FALSE;
-}
-static FX_BOOL IsSpace(FX_WORD word)
-{
- return (word == 0x0020 || word == 0x3000) ? TRUE : FALSE;
-}
-static FX_BOOL NeedDivision(FX_WORD prevWord, FX_WORD curWord)
-{
- if ((IsLatin(prevWord) || IsDigit(prevWord)) && (IsLatin(curWord) || IsDigit(curWord))) {
- return FALSE;
- } else if (IsSpace(curWord) || IsPunctuation(curWord)) {
- return FALSE;
- } else if (IsConnectiveSymbol(prevWord) || IsConnectiveSymbol(curWord)) {
- return FALSE;
- } else if (IsSpace(prevWord) || IsPunctuation(prevWord)) {
- return TRUE;
- } else if (IsPrefixSymbol(prevWord)) {
- return FALSE;
- } else if (IsPrefixSymbol(curWord) || IsCJK(curWord)) {
- return TRUE;
- } else if (IsCJK(prevWord)) {
- return TRUE;
- }
- return FALSE;
-}
-void CTypeset::SplitLines(FX_BOOL bTypeset, FX_FLOAT fFontSize)
-{
- ASSERT(m_pVT != NULL);
- ASSERT(m_pSection != NULL);
- FX_INT32 nLineHead = 0;
- FX_INT32 nLineTail = 0;
- FX_FLOAT fMaxX = 0.0f, fMaxY = 0.0f;
- FX_FLOAT fLineWidth = 0.0f, fBackupLineWidth = 0.0f;
- FX_FLOAT fLineAscent = 0.0f, fBackupLineAscent = 0.0f;
- FX_FLOAT fLineDescent = 0.0f, fBackupLineDescent = 0.0f;
- FX_INT32 nWordStartPos = 0;
- FX_BOOL bFullWord = FALSE;
- FX_INT32 nLineFullWordIndex = 0;
- FX_INT32 nCharIndex = 0;
- CPVT_LineInfo line;
- FX_FLOAT fWordWidth = 0;
- FX_FLOAT fTypesetWidth = FPDF_MAX(m_pVT->GetPlateWidth() - m_pVT->GetLineIndent(m_pSection->m_SecInfo), 0.0f);
- FX_INT32 nTotalWords = m_pSection->m_WordArray.GetSize();
- FX_BOOL bOpened = FALSE;
- if (nTotalWords > 0) {
- FX_INT32 i = 0;
- while (i < nTotalWords) {
- CPVT_WordInfo * pWord = m_pSection->m_WordArray.GetAt(i);
- CPVT_WordInfo* pOldWord = pWord;
- if (i > 0) {
- pOldWord = m_pSection->m_WordArray.GetAt(i - 1);
- }
- if (pWord) {
- if (bTypeset) {
- fLineAscent = FPDF_MAX(fLineAscent, m_pVT->GetWordAscent(*pWord, TRUE));
- fLineDescent = FPDF_MIN(fLineDescent, m_pVT->GetWordDescent(*pWord, TRUE));
- fWordWidth = m_pVT->GetWordWidth(*pWord);
- } else {
- fLineAscent = FPDF_MAX(fLineAscent, m_pVT->GetWordAscent(*pWord, fFontSize));
- fLineDescent = FPDF_MIN(fLineDescent, m_pVT->GetWordDescent(*pWord, fFontSize));
- fWordWidth = m_pVT->GetWordWidth(pWord->nFontIndex,
- pWord->Word,
- m_pVT->m_wSubWord,
- m_pVT->m_fCharSpace,
- m_pVT->m_nHorzScale,
- fFontSize,
- pWord->fWordTail,
- 0);
- }
- if (!bOpened) {
- if (IsOpenStylePunctuation(pWord->Word)) {
- bOpened = TRUE;
- bFullWord = TRUE;
- } else if (pOldWord != NULL) {
- if (NeedDivision(pOldWord->Word, pWord->Word)) {
- bFullWord = TRUE;
- }
- }
- } else {
- if (!IsSpace(pWord->Word) && !IsOpenStylePunctuation(pWord->Word)) {
- bOpened = FALSE;
- }
- }
- if (bFullWord) {
- bFullWord = FALSE;
- if (nCharIndex > 0) {
- nLineFullWordIndex ++;
- }
- nWordStartPos = i;
- fBackupLineWidth = fLineWidth;
- fBackupLineAscent = fLineAscent;
- fBackupLineDescent = fLineDescent;
- }
- nCharIndex++;
- }
- if (m_pVT->m_bLimitWidth && fTypesetWidth > 0 &&
- fLineWidth + fWordWidth > fTypesetWidth) {
- if (nLineFullWordIndex > 0) {
- i = nWordStartPos;
- fLineWidth = fBackupLineWidth;
- fLineAscent = fBackupLineAscent;
- fLineDescent = fBackupLineDescent;
- }
- if (nCharIndex == 1) {
- fLineWidth = fWordWidth;
- i++;
- }
- nLineTail = i - 1;
- if (bTypeset) {
- line.nBeginWordIndex = nLineHead;
- line.nEndWordIndex = nLineTail;
- line.nTotalWord = nLineTail - nLineHead + 1;
- line.fLineWidth = fLineWidth;
- line.fLineAscent = fLineAscent;
- line.fLineDescent = fLineDescent;
- m_pSection->AddLine(line);
- }
- fMaxY += (fLineAscent + m_pVT->GetLineLeading(m_pSection->m_SecInfo));
- fMaxY += (-fLineDescent);
- fMaxX = FPDF_MAX(fLineWidth, fMaxX);
- nLineHead = i;
- fLineWidth = 0.0f;
- fLineAscent = 0.0f;
- fLineDescent = 0.0f;
- nCharIndex = 0;
- nLineFullWordIndex = 0;
- bFullWord = FALSE;
- } else {
- fLineWidth += fWordWidth;
- i++;
- }
- }
- if (nLineHead <= nTotalWords - 1) {
- nLineTail = nTotalWords - 1;
- if (bTypeset) {
- line.nBeginWordIndex = nLineHead;
- line.nEndWordIndex = nLineTail;
- line.nTotalWord = nLineTail - nLineHead + 1;
- line.fLineWidth = fLineWidth;
- line.fLineAscent = fLineAscent;
- line.fLineDescent = fLineDescent;
- m_pSection->AddLine(line);
- }
- fMaxY += (fLineAscent + m_pVT->GetLineLeading(m_pSection->m_SecInfo));
- fMaxY += (-fLineDescent);
- fMaxX = FPDF_MAX(fLineWidth, fMaxX);
- }
- } else {
- if (bTypeset) {
- fLineAscent = m_pVT->GetLineAscent(m_pSection->m_SecInfo);
- fLineDescent = m_pVT->GetLineDescent(m_pSection->m_SecInfo);
- } else {
- fLineAscent = m_pVT->GetFontAscent(m_pVT->GetDefaultFontIndex(), fFontSize);
- fLineDescent = m_pVT->GetFontDescent(m_pVT->GetDefaultFontIndex(), fFontSize);
- }
- if (bTypeset) {
- line.nBeginWordIndex = -1;
- line.nEndWordIndex = -1;
- line.nTotalWord = 0;
- line.fLineWidth = 0;
- line.fLineAscent = fLineAscent;
- line.fLineDescent = fLineDescent;
- m_pSection->AddLine(line);
- }
- fMaxY += (m_pVT->GetLineLeading(m_pSection->m_SecInfo) + fLineAscent + (-fLineDescent));
- }
- m_rcRet = CPVT_FloatRect(0, 0, fMaxX, fMaxY);
-}
-void CTypeset::OutputLines()
-{
- ASSERT(m_pVT != NULL);
- ASSERT(m_pSection != NULL);
- FX_FLOAT fMinX = 0.0f, fMinY = 0.0f, fMaxX = 0.0f, fMaxY = 0.0f;
- FX_FLOAT fPosX = 0.0f, fPosY = 0.0f;
- FX_FLOAT fLineIndent = m_pVT->GetLineIndent(m_pSection->m_SecInfo);
- FX_FLOAT fTypesetWidth = FPDF_MAX(m_pVT->GetPlateWidth() - fLineIndent, 0.0f);
- switch (m_pVT->GetAlignment(m_pSection->m_SecInfo)) {
- default:
- case 0:
- fMinX = 0.0f;
- break;
- case 1:
- fMinX = (fTypesetWidth - m_rcRet.Width()) * PVT_HALF;
- break;
- case 2:
- fMinX = fTypesetWidth - m_rcRet.Width();
- break;
- }
- fMaxX = fMinX + m_rcRet.Width();
- fMinY = 0.0f;
- fMaxY = m_rcRet.Height();
- FX_INT32 nTotalLines = m_pSection->m_LineArray.GetSize();
- if (nTotalLines > 0) {
- m_pSection->m_SecInfo.nTotalLine = nTotalLines;
- for (FX_INT32 l = 0; l < nTotalLines; l++) {
- if (CLine * pLine = m_pSection->m_LineArray.GetAt(l)) {
- switch (m_pVT->GetAlignment(m_pSection->m_SecInfo)) {
- default:
- case 0:
- fPosX = 0;
- break;
- case 1:
- fPosX = (fTypesetWidth - pLine->m_LineInfo.fLineWidth) * PVT_HALF;
- break;
- case 2:
- fPosX = fTypesetWidth - pLine->m_LineInfo.fLineWidth;
- break;
- }
- fPosX += fLineIndent;
- fPosY += m_pVT->GetLineLeading(m_pSection->m_SecInfo);
- fPosY += pLine->m_LineInfo.fLineAscent;
- pLine->m_LineInfo.fLineX = fPosX - fMinX;
- pLine->m_LineInfo.fLineY = fPosY - fMinY;
- for (FX_INT32 w = pLine->m_LineInfo.nBeginWordIndex; w <= pLine->m_LineInfo.nEndWordIndex; w++) {
- if (CPVT_WordInfo * pWord = m_pSection->m_WordArray.GetAt(w)) {
- pWord->fWordX = fPosX - fMinX;
- if (pWord->pWordProps) {
- switch (pWord->pWordProps->nScriptType) {
- default:
- case PVTWORD_SCRIPT_NORMAL:
- pWord->fWordY = fPosY - fMinY;
- break;
- case PVTWORD_SCRIPT_SUPER:
- pWord->fWordY = fPosY - m_pVT->GetWordAscent(*pWord) - fMinY;
- break;
- case PVTWORD_SCRIPT_SUB:
- pWord->fWordY = fPosY - m_pVT->GetWordDescent(*pWord) - fMinY;
- break;
- }
- } else {
- pWord->fWordY = fPosY - fMinY;
- }
- fPosX += m_pVT->GetWordWidth(*pWord);
- }
- }
- fPosY += (-pLine->m_LineInfo.fLineDescent);
- }
- }
- }
- m_rcRet = CPVT_FloatRect(fMinX, fMinY, fMaxX, fMaxY);
-}
-CPDF_VariableText::CPDF_VariableText() :
- m_pVTProvider(NULL),
- m_pVTIterator(NULL),
- m_bInitial(FALSE),
- m_bRichText(FALSE),
- m_bMultiLine(FALSE),
- m_bLimitWidth(FALSE),
- m_bAutoFontSize(FALSE),
- m_nLimitChar(0),
- m_nCharArray(0),
- m_nAlignment(0),
- m_fCharSpace(0.0f),
- m_fWordSpace(0.0f),
- m_fFontSize(0.0f),
- m_nHorzScale(100),
- m_wSubWord(0),
- m_fLineLeading(0.0f)
-{
-}
-CPDF_VariableText::~CPDF_VariableText()
-{
- if (m_pVTIterator) {
- delete m_pVTIterator;
- m_pVTIterator = NULL;
- }
- ResetAll();
-}
-void CPDF_VariableText::Initialize()
-{
- if (!m_bInitial) {
- CPVT_SectionInfo secinfo;
- if (m_bRichText) {
- secinfo.pSecProps = FX_NEW CPVT_SecProps(0.0f, 0.0f, 0);
- secinfo.pWordProps = FX_NEW CPVT_WordProps(GetDefaultFontIndex(), PVT_DEFAULT_FONTSIZE, 0, 0, 0);
- }
- CPVT_WordPlace place;
- place.nSecIndex = 0;
- AddSection(place, secinfo);
- CPVT_LineInfo lineinfo;
- lineinfo.fLineAscent = GetFontAscent(GetDefaultFontIndex(), GetFontSize());
- lineinfo.fLineDescent = GetFontDescent(GetDefaultFontIndex(), GetFontSize());
- AddLine(place, lineinfo);
- if (CSection * pSection = m_SectionArray.GetAt(0)) {
- pSection->ResetLinePlace();
- }
- m_bInitial = TRUE;
- }
-}
-void CPDF_VariableText::ResetAll()
-{
- m_bInitial = FALSE;
- ResetSectionArray();
-}
-CPVT_WordPlace CPDF_VariableText::InsertWord(const CPVT_WordPlace & place, FX_WORD word, FX_INT32 charset,
- const CPVT_WordProps * pWordProps)
-{
- FX_INT32 nTotlaWords = this->GetTotalWords();
- if (m_nLimitChar > 0 && nTotlaWords >= m_nLimitChar) {
- return place;
- }
- if (m_nCharArray > 0 && nTotlaWords >= m_nCharArray) {
- return place;
- }
- CPVT_WordPlace newplace = place;
- newplace.nWordIndex ++;
- if (m_bRichText) {
- CPVT_WordProps * pNewProps = pWordProps ? FX_NEW CPVT_WordProps(*pWordProps) : FX_NEW CPVT_WordProps();
- if (pNewProps) {
- pNewProps->nFontIndex = GetWordFontIndex(word, charset, pWordProps->nFontIndex);
- return AddWord(newplace, CPVT_WordInfo(word, charset, -1, pNewProps));
- }
- } else {
- FX_INT32 nFontIndex = GetSubWord() > 0 ? GetDefaultFontIndex() : GetWordFontIndex(word, charset, GetDefaultFontIndex());
- return AddWord(newplace, CPVT_WordInfo(word, charset, nFontIndex, NULL));
- }
- return place;
-}
-CPVT_WordPlace CPDF_VariableText::InsertSection(const CPVT_WordPlace & place, const CPVT_SecProps * pSecProps,
- const CPVT_WordProps * pWordProps)
-{
- FX_INT32 nTotlaWords = this->GetTotalWords();
- if (m_nLimitChar > 0 && nTotlaWords >= m_nLimitChar) {
- return place;
- }
- if (m_nCharArray > 0 && nTotlaWords >= m_nCharArray) {
- return place;
- }
- if (!m_bMultiLine) {
- return place;
- }
- CPVT_WordPlace wordplace = place;
- UpdateWordPlace(wordplace);
- CPVT_WordPlace newplace = place;
- if (CSection * pSection = m_SectionArray.GetAt(wordplace.nSecIndex)) {
- CPVT_WordPlace NewPlace(wordplace.nSecIndex + 1, 0, -1);
- CPVT_SectionInfo secinfo;
- if (m_bRichText) {
- if (pSecProps) {
- secinfo.pSecProps = FX_NEW CPVT_SecProps(*pSecProps);
- }
- if (pWordProps) {
- secinfo.pWordProps = FX_NEW CPVT_WordProps(*pWordProps);
- }
- }
- AddSection(NewPlace, secinfo);
- newplace = NewPlace;
- if (CSection * pNewSection = m_SectionArray.GetAt(NewPlace.nSecIndex)) {
- for (FX_INT32 w = wordplace.nWordIndex + 1, sz = pSection->m_WordArray.GetSize(); w < sz; w++) {
- if (CPVT_WordInfo * pWord = pSection->m_WordArray.GetAt(w)) {
- NewPlace.nWordIndex++;
- pNewSection->AddWord(NewPlace, *pWord);
- }
- }
- }
- ClearSectionRightWords(wordplace);
- }
- return newplace;
-}
-CPVT_WordPlace CPDF_VariableText::InsertText(const CPVT_WordPlace & place, FX_LPCWSTR text, FX_INT32 charset,
- const CPVT_SecProps * pSecProps, const CPVT_WordProps * pProps)
-{
- CFX_WideString swText = text;
- CPVT_WordPlace wp = place;
- for (FX_INT32 i = 0, sz = swText.GetLength(); i < sz; i++) {
- CPVT_WordPlace oldwp = wp;
- FX_WORD word = swText.GetAt(i);
- switch (word) {
- case 0x0D:
- if (m_bMultiLine) {
- if (swText.GetAt(i + 1) == 0x0A) {
- i += 1;
- }
- wp = InsertSection(wp, pSecProps, pProps);
- }
- break;
- case 0x0A:
- if (m_bMultiLine) {
- if (swText.GetAt(i + 1) == 0x0D) {
- i += 1;
- }
- wp = InsertSection(wp, pSecProps, pProps);
- }
- break;
- case 0x09:
- word = 0x20;
- default:
- wp = InsertWord(wp, word, charset, pProps);
- break;
- }
- if (wp == oldwp) {
- break;
- }
- }
- return wp;
-}
-CPVT_WordPlace CPDF_VariableText::DeleteWords(const CPVT_WordRange & PlaceRange)
-{
- FX_BOOL bLastSecPos = FALSE;
- if (CSection * pSection = m_SectionArray.GetAt(PlaceRange.EndPos.nSecIndex)) {
- bLastSecPos = (PlaceRange.EndPos == pSection->GetEndWordPlace());
- }
- ClearWords(PlaceRange);
- if (PlaceRange.BeginPos.nSecIndex != PlaceRange.EndPos.nSecIndex) {
- ClearEmptySections(PlaceRange);
- if (!bLastSecPos) {
- LinkLatterSection(PlaceRange.BeginPos);
- }
- }
- return PlaceRange.BeginPos;
-}
-CPVT_WordPlace CPDF_VariableText::DeleteWord(const CPVT_WordPlace & place)
-{
- return ClearRightWord(AjustLineHeader(place, TRUE));
-}
-CPVT_WordPlace CPDF_VariableText::BackSpaceWord(const CPVT_WordPlace & place)
-{
- return ClearLeftWord(AjustLineHeader(place, TRUE));
-}
-void CPDF_VariableText::SetText(FX_LPCWSTR text, FX_INT32 charset, const CPVT_SecProps * pSecProps,
- const CPVT_WordProps * pWordProps)
-{
- DeleteWords(CPVT_WordRange(GetBeginWordPlace(), GetEndWordPlace()));
- CFX_WideString swText = text;
- CPVT_WordPlace wp(0, 0, -1);
- CPVT_SectionInfo secinfo;
- if (m_bRichText) {
- if (pSecProps) {
- secinfo.pSecProps = FX_NEW CPVT_SecProps(*pSecProps);
- }
- if (pWordProps) {
- secinfo.pWordProps = FX_NEW CPVT_WordProps(*pWordProps);
- }
- }
- if (CSection * pSection = m_SectionArray.GetAt(0)) {
- pSection->m_SecInfo = secinfo;
- }
- FX_INT32 nCharCount = 0;
- for (FX_INT32 i = 0, sz = swText.GetLength(); i < sz; i++) {
- if (m_nLimitChar > 0 && nCharCount >= m_nLimitChar) {
- break;
- }
- if (m_nCharArray > 0 && nCharCount >= m_nCharArray) {
- break;
- }
- FX_WORD word = swText.GetAt(i);
- switch (word) {
- case 0x0D:
- if (m_bMultiLine) {
- if (swText.GetAt(i + 1) == 0x0A) {
- i += 1;
- }
- wp.nSecIndex ++;
- wp.nLineIndex = 0;
- wp.nWordIndex = -1;
- AddSection(wp, secinfo);
- }
- break;
- case 0x0A:
- if (m_bMultiLine) {
- if (swText.GetAt(i + 1) == 0x0D) {
- i += 1;
- }
- wp.nSecIndex ++;
- wp.nLineIndex = 0;
- wp.nWordIndex = -1;
- AddSection(wp, secinfo);
- }
- break;
- case 0x09:
- word = 0x20;
- default:
- wp = InsertWord(wp, word, charset, pWordProps);
- break;
- }
- nCharCount++;
- }
-}
-void CPDF_VariableText::UpdateWordPlace(CPVT_WordPlace & place) const
-{
- if (place.nSecIndex < 0) {
- place = GetBeginWordPlace();
- }
- if (place.nSecIndex >= m_SectionArray.GetSize()) {
- place = GetEndWordPlace();
- }
- place = AjustLineHeader(place, TRUE);
- if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {
- pSection->UpdateWordPlace(place);
- }
-}
-FX_INT32 CPDF_VariableText::WordPlaceToWordIndex(const CPVT_WordPlace & place) const
-{
- CPVT_WordPlace newplace = place;
- UpdateWordPlace(newplace);
- FX_INT32 nIndex = 0;
- FX_INT32 i = 0;
- FX_INT32 sz = 0;
- for (i = 0, sz = m_SectionArray.GetSize(); i < sz && i < newplace.nSecIndex; i++) {
- if (CSection * pSection = m_SectionArray.GetAt(i)) {
- nIndex += pSection->m_WordArray.GetSize();
- if (i != m_SectionArray.GetSize() - 1) {
- nIndex += PVT_RETURN_LENGTH;
- }
- }
- }
- if (i >= 0 && i < m_SectionArray.GetSize()) {
- nIndex += newplace.nWordIndex + PVT_RETURN_LENGTH;
- }
- return nIndex;
-}
-CPVT_WordPlace CPDF_VariableText::WordIndexToWordPlace(FX_INT32 index) const
-{
- CPVT_WordPlace place = GetBeginWordPlace();
- FX_INT32 nOldIndex = 0 , nIndex = 0;
- FX_BOOL bFind = FALSE;
- for (FX_INT32 i = 0, sz = m_SectionArray.GetSize(); i < sz; i++) {
- if (CSection * pSection = m_SectionArray.GetAt(i)) {
- nIndex += pSection->m_WordArray.GetSize();
- if (nIndex == index) {
- place = pSection->GetEndWordPlace();
- bFind = TRUE;
- break;
- } else if (nIndex > index) {
- place.nSecIndex = i;
- place.nWordIndex = index - nOldIndex - 1;
- pSection->UpdateWordPlace(place);
- bFind = TRUE;
- break;
- }
- if (i != m_SectionArray.GetSize() - 1) {
- nIndex += PVT_RETURN_LENGTH;
- }
- nOldIndex = nIndex;
- }
- }
- if (!bFind) {
- place = GetEndWordPlace();
- }
- return place;
-}
-CPVT_WordPlace CPDF_VariableText::GetBeginWordPlace() const
-{
- return m_bInitial ? CPVT_WordPlace(0, 0, -1) : CPVT_WordPlace();
-}
-CPVT_WordPlace CPDF_VariableText::GetEndWordPlace() const
-{
- if (CSection * pSection = m_SectionArray.GetAt(m_SectionArray.GetSize() - 1)) {
- return pSection->GetEndWordPlace();
- }
- return CPVT_WordPlace();
-}
-CPVT_WordPlace CPDF_VariableText::GetPrevWordPlace(const CPVT_WordPlace & place) const
-{
- if( place.nSecIndex < 0) {
- return GetBeginWordPlace();
- }
- if (place.nSecIndex >= m_SectionArray.GetSize()) {
- return GetEndWordPlace();
- }
- if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {
- if (place.WordCmp(pSection->GetBeginWordPlace()) <= 0) {
- if (CSection * pPrevSection = m_SectionArray.GetAt(place.nSecIndex - 1)) {
- return pPrevSection->GetEndWordPlace();
- } else {
- return GetBeginWordPlace();
- }
- } else {
- return pSection->GetPrevWordPlace(place);
- }
- }
- return place;
-}
-CPVT_WordPlace CPDF_VariableText::GetNextWordPlace(const CPVT_WordPlace & place) const
-{
- if (place.nSecIndex < 0) {
- return GetBeginWordPlace();
- }
- if (place.nSecIndex >= m_SectionArray.GetSize()) {
- return GetEndWordPlace();
- }
- if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {
- if (place.WordCmp(pSection->GetEndWordPlace()) >= 0) {
- if (CSection * pNextSection = m_SectionArray.GetAt(place.nSecIndex + 1)) {
- return pNextSection->GetBeginWordPlace();
- } else {
- return GetEndWordPlace();
- }
- } else {
- return pSection->GetNextWordPlace(place);
- }
- }
- return place;
-}
-CPVT_WordPlace CPDF_VariableText::SearchWordPlace(const CPDF_Point & point) const
-{
- CPDF_Point pt = OutToIn(point);
- CPVT_WordPlace place = GetBeginWordPlace();
- FX_INT32 nLeft = 0;
- FX_INT32 nRight = m_SectionArray.GetSize() - 1;
- FX_INT32 nMid = m_SectionArray.GetSize() / 2;
- FX_BOOL bUp = TRUE;
- FX_BOOL bDown = TRUE;
- while (nLeft <= nRight) {
- if (CSection * pSection = m_SectionArray.GetAt(nMid)) {
- if (IsFloatBigger(pt.y, pSection->m_SecInfo.rcSection.top)) {
- bUp = FALSE;
- }
- if (IsFloatBigger(pSection->m_SecInfo.rcSection.bottom, pt.y)) {
- bDown = FALSE;
- }
- if (IsFloatSmaller(pt.y, pSection->m_SecInfo.rcSection.top)) {
- nRight = nMid - 1;
- nMid = (nLeft + nRight) / 2;
- continue;
- } else if (IsFloatBigger(pt.y, pSection->m_SecInfo.rcSection.bottom)) {
- nLeft = nMid + 1;
- nMid = (nLeft + nRight) / 2;
- continue;
- } else {
- place = pSection->SearchWordPlace(
- CPDF_Point(pt.x - pSection->m_SecInfo.rcSection.left, pt.y - pSection->m_SecInfo.rcSection.top)
- );
- place.nSecIndex = nMid;
- return place;
- }
- } else {
- break;
- }
- }
- if (bUp) {
- place = GetBeginWordPlace();
- }
- if (bDown) {
- place = GetEndWordPlace();
- }
- return place;
-}
-CPVT_WordPlace CPDF_VariableText::GetUpWordPlace(const CPVT_WordPlace & place, const CPDF_Point & point) const
-{
- if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {
- CPVT_WordPlace temp = place;
- CPDF_Point pt = OutToIn(point);
- if (temp.nLineIndex-- > 0) {
- return pSection->SearchWordPlace(pt.x - pSection->m_SecInfo.rcSection.left, temp);
- } else {
- if (temp.nSecIndex-- > 0) {
- if (CSection * pLastSection = m_SectionArray.GetAt(temp.nSecIndex)) {
- temp.nLineIndex = pLastSection->m_LineArray.GetSize() - 1;
- return pLastSection->SearchWordPlace(pt.x - pLastSection->m_SecInfo.rcSection.left, temp);
- }
- }
- }
- }
- return place;
-}
-CPVT_WordPlace CPDF_VariableText::GetDownWordPlace(const CPVT_WordPlace & place, const CPDF_Point & point) const
-{
- if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {
- CPVT_WordPlace temp = place;
- CPDF_Point pt = OutToIn(point);
- if (temp.nLineIndex++ < pSection->m_LineArray.GetSize() - 1) {
- return pSection->SearchWordPlace(pt.x - pSection->m_SecInfo.rcSection.left, temp);
- } else {
- if (temp.nSecIndex++ < m_SectionArray.GetSize() - 1) {
- if (CSection * pNextSection = m_SectionArray.GetAt(temp.nSecIndex)) {
- temp.nLineIndex = 0;
- return pNextSection->SearchWordPlace(pt.x - pSection->m_SecInfo.rcSection.left, temp);
- }
- }
- }
- }
- return place;
-}
-CPVT_WordPlace CPDF_VariableText::GetLineBeginPlace(const CPVT_WordPlace & place) const
-{
- return CPVT_WordPlace(place.nSecIndex, place.nLineIndex, -1);
-}
-CPVT_WordPlace CPDF_VariableText::GetLineEndPlace(const CPVT_WordPlace & place) const
-{
- if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex))
- if (CLine * pLine = pSection->m_LineArray.GetAt(place.nLineIndex)) {
- return pLine->GetEndWordPlace();
- }
- return place;
-}
-CPVT_WordPlace CPDF_VariableText::GetSectionBeginPlace(const CPVT_WordPlace & place) const
-{
- return CPVT_WordPlace(place.nSecIndex, 0, -1);
-}
-CPVT_WordPlace CPDF_VariableText::GetSectionEndPlace(const CPVT_WordPlace & place) const
-{
- if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {
- return pSection->GetEndWordPlace();
- }
- return place;
-}
-FX_INT32 CPDF_VariableText::GetTotalWords() const
-{
- FX_INT32 nTotal = 0;
- for (FX_INT32 i = 0, sz = m_SectionArray.GetSize(); i < sz; i++)
- if (CSection * pSection = m_SectionArray.GetAt(i)) {
- nTotal += (pSection->m_WordArray.GetSize() + PVT_RETURN_LENGTH);
- }
- return nTotal - PVT_RETURN_LENGTH;
-}
-void CPDF_VariableText::ResetSectionArray()
-{
- for (FX_INT32 s = 0, sz = m_SectionArray.GetSize(); s < sz; s++) {
- delete m_SectionArray.GetAt(s);
- }
- m_SectionArray.RemoveAll();
-}
-CPVT_WordPlace CPDF_VariableText::AddSection(const CPVT_WordPlace & place, const CPVT_SectionInfo & secinfo)
-{
- if (IsValid() && !m_bMultiLine) {
- return place;
- }
- FX_INT32 nSecIndex = FPDF_MAX(FPDF_MIN(place.nSecIndex, m_SectionArray.GetSize()), 0);
- CSection * pSection = FX_NEW CSection(this);
- if (!pSection) {
- return place;
- }
- pSection->m_SecInfo = secinfo;
- pSection->SecPlace.nSecIndex = nSecIndex;
- if (nSecIndex == m_SectionArray.GetSize()) {
- m_SectionArray.Add(pSection);
- } else {
- m_SectionArray.InsertAt(nSecIndex, pSection);
- }
- return place;
-}
-CPVT_WordPlace CPDF_VariableText::AddLine(const CPVT_WordPlace & place, const CPVT_LineInfo & lineinfo)
-{
- if (m_SectionArray.IsEmpty()) {
- return place;
- }
- if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {
- return pSection->AddLine(lineinfo);
- }
- return place;
-}
-CPVT_WordPlace CPDF_VariableText::AddWord(const CPVT_WordPlace & place, const CPVT_WordInfo & wordinfo)
-{
- if (m_SectionArray.GetSize() <= 0) {
- return place;
- }
- CPVT_WordPlace newplace = place;
- newplace.nSecIndex = FPDF_MAX(FPDF_MIN(newplace.nSecIndex, m_SectionArray.GetSize() - 1), 0);
- if (CSection * pSection = m_SectionArray.GetAt(newplace.nSecIndex)) {
- return pSection->AddWord(newplace, wordinfo);
- }
- return place;
-}
-FX_BOOL CPDF_VariableText::GetWordInfo(const CPVT_WordPlace & place, CPVT_WordInfo & wordinfo)
-{
- if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {
- if (CPVT_WordInfo * pWord = pSection->m_WordArray.GetAt(place.nWordIndex)) {
- wordinfo = *pWord;
- return TRUE;
- }
- }
- return FALSE;
-}
-FX_BOOL CPDF_VariableText::SetWordInfo(const CPVT_WordPlace & place, const CPVT_WordInfo & wordinfo)
-{
- if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {
- if (CPVT_WordInfo * pWord = pSection->m_WordArray.GetAt(place.nWordIndex)) {
- *pWord = wordinfo;
- return TRUE;
- }
- }
- return FALSE;
-}
-FX_BOOL CPDF_VariableText::GetLineInfo(const CPVT_WordPlace & place, CPVT_LineInfo & lineinfo)
-{
- if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {
- if (CLine * pLine = pSection->m_LineArray.GetAt(place.nLineIndex)) {
- lineinfo = pLine->m_LineInfo;
- return TRUE;
- }
- }
- return FALSE;
-}
-FX_BOOL CPDF_VariableText::GetSectionInfo(const CPVT_WordPlace & place, CPVT_SectionInfo & secinfo)
-{
- if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {
- secinfo = pSection->m_SecInfo;
- return TRUE;
- }
- return FALSE;
-}
-CPDF_Rect CPDF_VariableText::GetContentRect() const
-{
- return InToOut(CPDF_EditContainer::GetContentRect());
-}
-FX_FLOAT CPDF_VariableText::GetWordFontSize(const CPVT_WordInfo & WordInfo, FX_BOOL bFactFontSize)
-{
- return m_bRichText && WordInfo.pWordProps ? (WordInfo.pWordProps->nScriptType == PVTWORD_SCRIPT_NORMAL || bFactFontSize ? WordInfo.pWordProps->fFontSize : WordInfo.pWordProps->fFontSize * PVT_HALF) : GetFontSize();
-}
-FX_INT32 CPDF_VariableText::GetWordFontIndex(const CPVT_WordInfo & WordInfo)
-{
- return m_bRichText && WordInfo.pWordProps ? WordInfo.pWordProps->nFontIndex : WordInfo.nFontIndex;
-}
-FX_FLOAT CPDF_VariableText::GetWordWidth(FX_INT32 nFontIndex, FX_WORD Word, FX_WORD SubWord,
- FX_FLOAT fCharSpace, FX_INT32 nHorzScale,
- FX_FLOAT fFontSize, FX_FLOAT fWordTail, FX_INT32 nWordStyle)
-{
- return (GetCharWidth(nFontIndex, Word, SubWord, nWordStyle) * fFontSize * PVT_FONTSCALE + fCharSpace) * nHorzScale * PVT_PERCENT + fWordTail;
-}
-FX_FLOAT CPDF_VariableText::GetWordWidth(const CPVT_WordInfo & WordInfo)
-{
- return GetWordWidth(GetWordFontIndex(WordInfo), WordInfo.Word, GetSubWord(), GetCharSpace(WordInfo), GetHorzScale(WordInfo),
- GetWordFontSize(WordInfo), WordInfo.fWordTail,
- WordInfo.pWordProps ? WordInfo.pWordProps->nWordStyle : 0);
-}
-FX_FLOAT CPDF_VariableText::GetLineAscent(const CPVT_SectionInfo & SecInfo)
-{
- return m_bRichText && SecInfo.pWordProps ? GetFontAscent(SecInfo.pWordProps->nFontIndex, SecInfo.pWordProps->fFontSize) :
- GetFontAscent(GetDefaultFontIndex(), GetFontSize());
-}
-FX_FLOAT CPDF_VariableText::GetLineDescent(const CPVT_SectionInfo & SecInfo)
-{
- return m_bRichText && SecInfo.pWordProps ? GetFontDescent(SecInfo.pWordProps->nFontIndex, SecInfo.pWordProps->fFontSize) :
- GetFontDescent(GetDefaultFontIndex(), GetFontSize());
-}
-FX_FLOAT CPDF_VariableText::GetFontAscent(FX_INT32 nFontIndex, FX_FLOAT fFontSize)
-{
- return (FX_FLOAT)GetTypeAscent(nFontIndex) * fFontSize * PVT_FONTSCALE;
-}
-FX_FLOAT CPDF_VariableText::GetFontDescent(FX_INT32 nFontIndex, FX_FLOAT fFontSize)
-{
- return (FX_FLOAT)GetTypeDescent(nFontIndex) * fFontSize * PVT_FONTSCALE;
-}
-FX_FLOAT CPDF_VariableText::GetWordAscent(const CPVT_WordInfo & WordInfo, FX_FLOAT fFontSize)
-{
- return GetFontAscent(GetWordFontIndex(WordInfo), fFontSize);
-}
-FX_FLOAT CPDF_VariableText::GetWordDescent(const CPVT_WordInfo & WordInfo, FX_FLOAT fFontSize)
-{
- return GetFontDescent(GetWordFontIndex(WordInfo), fFontSize);
-}
-FX_FLOAT CPDF_VariableText::GetWordAscent(const CPVT_WordInfo & WordInfo, FX_BOOL bFactFontSize)
-{
- return GetFontAscent(GetWordFontIndex(WordInfo), GetWordFontSize(WordInfo, bFactFontSize));
-}
-FX_FLOAT CPDF_VariableText::GetWordDescent(const CPVT_WordInfo & WordInfo, FX_BOOL bFactFontSize)
-{
- return GetFontDescent(GetWordFontIndex(WordInfo), GetWordFontSize(WordInfo, bFactFontSize));
-}
-FX_FLOAT CPDF_VariableText::GetLineLeading(const CPVT_SectionInfo & SecInfo)
-{
- return m_bRichText && SecInfo.pSecProps ? SecInfo.pSecProps->fLineLeading : m_fLineLeading;
-}
-FX_FLOAT CPDF_VariableText::GetLineIndent(const CPVT_SectionInfo & SecInfo)
-{
- return m_bRichText && SecInfo.pSecProps ? SecInfo.pSecProps->fLineIndent : 0.0f;
-}
-FX_INT32 CPDF_VariableText::GetAlignment(const CPVT_SectionInfo& SecInfo)
-{
- return m_bRichText && SecInfo.pSecProps ? SecInfo.pSecProps->nAlignment : this->m_nAlignment;
-}
-FX_FLOAT CPDF_VariableText::GetCharSpace(const CPVT_WordInfo & WordInfo)
-{
- return m_bRichText && WordInfo.pWordProps ? WordInfo.pWordProps->fCharSpace : m_fCharSpace;
-}
-FX_INT32 CPDF_VariableText::GetHorzScale(const CPVT_WordInfo & WordInfo)
-{
- return m_bRichText && WordInfo.pWordProps ? WordInfo.pWordProps->nHorzScale : m_nHorzScale;
-}
-void CPDF_VariableText::ClearSectionRightWords(const CPVT_WordPlace & place)
-{
- CPVT_WordPlace wordplace = AjustLineHeader(place, TRUE);
- if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {
- for (FX_INT32 w = pSection->m_WordArray.GetSize() - 1; w > wordplace.nWordIndex; w--) {
- delete pSection->m_WordArray.GetAt(w);
- pSection->m_WordArray.RemoveAt(w);
- }
- }
-}
-CPVT_WordPlace CPDF_VariableText::AjustLineHeader(const CPVT_WordPlace & place, FX_BOOL bPrevOrNext) const
-{
- if (place.nWordIndex < 0 && place.nLineIndex > 0) {
- if (bPrevOrNext) {
- return GetPrevWordPlace(place);
- } else {
- return GetNextWordPlace(place);
- }
- }
- return place;
-}
-FX_BOOL CPDF_VariableText::ClearEmptySection(const CPVT_WordPlace & place)
-{
- if (place.nSecIndex == 0 && m_SectionArray.GetSize() == 1) {
- return FALSE;
- }
- if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {
- if (pSection->m_WordArray.GetSize() == 0) {
- delete pSection;
- m_SectionArray.RemoveAt(place.nSecIndex);
- return TRUE;
- }
- }
- return FALSE;
-}
-void CPDF_VariableText::ClearEmptySections(const CPVT_WordRange & PlaceRange)
-{
- CPVT_WordPlace wordplace;
- for (FX_INT32 s = PlaceRange.EndPos.nSecIndex; s > PlaceRange.BeginPos.nSecIndex; s--) {
- wordplace.nSecIndex = s;
- ClearEmptySection(wordplace);
- }
-}
-void CPDF_VariableText::LinkLatterSection(const CPVT_WordPlace & place)
-{
- CPVT_WordPlace oldplace = AjustLineHeader(place, TRUE);
- if (CSection * pNextSection = m_SectionArray.GetAt(place.nSecIndex + 1)) {
- if (CSection * pSection = m_SectionArray.GetAt(oldplace.nSecIndex)) {
- for (FX_INT32 w = 0, sz = pNextSection->m_WordArray.GetSize(); w < sz; w++) {
- if (CPVT_WordInfo * pWord = pNextSection->m_WordArray.GetAt(w)) {
- oldplace.nWordIndex ++;
- pSection->AddWord(oldplace, *pWord);
- }
- }
- }
- delete pNextSection;
- m_SectionArray.RemoveAt(place.nSecIndex + 1);
- }
-}
-void CPDF_VariableText::ClearWords(const CPVT_WordRange & PlaceRange)
-{
- CPVT_WordRange NewRange;
- NewRange.BeginPos = AjustLineHeader(PlaceRange.BeginPos, TRUE);
- NewRange.EndPos = AjustLineHeader(PlaceRange.EndPos, TRUE);
- for (FX_INT32 s = NewRange.EndPos.nSecIndex; s >= NewRange.BeginPos.nSecIndex; s--) {
- if (CSection * pSection = m_SectionArray.GetAt(s)) {
- pSection->ClearWords(NewRange);
- }
- }
-}
-CPVT_WordPlace CPDF_VariableText::ClearLeftWord(const CPVT_WordPlace & place)
-{
- if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {
- CPVT_WordPlace leftplace = this->GetPrevWordPlace(place);
- if (leftplace != place) {
- if (leftplace.nSecIndex != place.nSecIndex) {
- if (pSection->m_WordArray.GetSize() == 0) {
- this->ClearEmptySection(place);
- } else {
- this->LinkLatterSection(leftplace);
- }
- } else {
- pSection->ClearWord(place);
- }
- }
- return leftplace;
- }
- return place;
-}
-CPVT_WordPlace CPDF_VariableText::ClearRightWord(const CPVT_WordPlace & place)
-{
- if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {
- CPVT_WordPlace rightplace = AjustLineHeader(this->GetNextWordPlace(place), FALSE);
- if (rightplace != place) {
- if(rightplace.nSecIndex != place.nSecIndex) {
- LinkLatterSection(place);
- } else {
- pSection->ClearWord(rightplace);
- }
- }
- }
- return place;
-}
-void CPDF_VariableText::RearrangeAll()
-{
- Rearrange(CPVT_WordRange(GetBeginWordPlace(), GetEndWordPlace()));
-}
-void CPDF_VariableText::RearrangePart(const CPVT_WordRange & PlaceRange)
-{
- Rearrange(PlaceRange);
-}
-CPVT_FloatRect CPDF_VariableText::Rearrange(const CPVT_WordRange & PlaceRange)
-{
- CPVT_FloatRect rcRet;
- if (IsValid()) {
- if (m_bAutoFontSize) {
- SetFontSize(GetAutoFontSize());
- rcRet = RearrangeSections(CPVT_WordRange(GetBeginWordPlace(), GetEndWordPlace()));
- } else {
- rcRet = RearrangeSections(PlaceRange);
- }
- }
- SetContentRect(rcRet);
- return rcRet;
-}
-FX_FLOAT CPDF_VariableText::GetAutoFontSize()
-{
- FX_INT32 nTotal = sizeof(gFontSizeSteps) / sizeof(FX_BYTE);
- if (IsMultiLine()) {
- nTotal /= 4;
- }
- if (nTotal <= 0) {
- return 0;
- }
- if (GetPlateWidth() <= 0) {
- return 0;
- }
- FX_INT32 nLeft = 0;
- FX_INT32 nRight = nTotal - 1;
- FX_INT32 nMid = nTotal / 2;
- while (nLeft <= nRight) {
- if (IsBigger(gFontSizeSteps[nMid])) {
- nRight = nMid - 1;
- nMid = (nLeft + nRight) / 2;
- continue;
- } else {
- nLeft = nMid + 1;
- nMid = (nLeft + nRight) / 2;
- continue;
- }
- }
- return (FX_FLOAT)gFontSizeSteps[nMid];
-}
-FX_BOOL CPDF_VariableText::IsBigger(FX_FLOAT fFontSize)
-{
- FX_BOOL bBigger = FALSE;
- CPVT_Size szTotal;
- for (FX_INT32 s = 0, sz = m_SectionArray.GetSize(); s < sz; s++) {
- if (CSection * pSection = m_SectionArray.GetAt(s)) {
- CPVT_Size size = pSection->GetSectionSize(fFontSize);
- szTotal.x = FPDF_MAX(size.x, szTotal.x);
- szTotal.y += size.y;
- if (IsFloatBigger(szTotal.x, GetPlateWidth())
- || IsFloatBigger(szTotal.y, GetPlateHeight())
- ) {
- bBigger = TRUE;
- break;
- }
- }
- }
- return bBigger;
-}
-CPVT_FloatRect CPDF_VariableText::RearrangeSections(const CPVT_WordRange & PlaceRange)
-{
- CPVT_WordPlace place;
- FX_FLOAT fPosY = 0;
- FX_FLOAT fOldHeight;
- FX_INT32 nSSecIndex = PlaceRange.BeginPos.nSecIndex;
- FX_INT32 nESecIndex = PlaceRange.EndPos.nSecIndex;
- CPVT_FloatRect rcRet;
- for (FX_INT32 s = 0, sz = m_SectionArray.GetSize(); s < sz; s++) {
- place.nSecIndex = s;
- if (CSection * pSection = m_SectionArray.GetAt(s)) {
- pSection->SecPlace = place;
- CPVT_FloatRect rcSec = pSection->m_SecInfo.rcSection;
- if (s >= nSSecIndex) {
- if (s <= nESecIndex) {
- rcSec = pSection->Rearrange();
- rcSec.top += fPosY;
- rcSec.bottom += fPosY;
- } else {
- fOldHeight = pSection->m_SecInfo.rcSection.bottom - pSection->m_SecInfo.rcSection.top;
- rcSec.top = fPosY;
- rcSec.bottom = fPosY + fOldHeight;
- }
- pSection->m_SecInfo.rcSection = rcSec;
- pSection->ResetLinePlace();
- }
- if (s == 0) {
- rcRet = rcSec;
- } else {
- rcRet.left = FPDF_MIN(rcSec.left, rcRet.left);
- rcRet.top = FPDF_MIN(rcSec.top, rcRet.top);
- rcRet.right = FPDF_MAX(rcSec.right, rcRet.right);
- rcRet.bottom = FPDF_MAX(rcSec.bottom, rcRet.bottom);
- }
- fPosY += rcSec.Height();
- }
- }
- return rcRet;
-}
-FX_INT32 CPDF_VariableText::GetCharWidth(FX_INT32 nFontIndex, FX_WORD Word, FX_WORD SubWord, FX_INT32 nWordStyle)
-{
- if (m_pVTProvider) {
- if (SubWord > 0) {
- return m_pVTProvider->GetCharWidth(nFontIndex, SubWord, nWordStyle);
- } else {
- return m_pVTProvider->GetCharWidth(nFontIndex, Word, nWordStyle);
- }
- }
- return 0;
-}
-FX_INT32 CPDF_VariableText::GetTypeAscent(FX_INT32 nFontIndex)
-{
- return m_pVTProvider ? m_pVTProvider->GetTypeAscent(nFontIndex) : 0;
-}
-FX_INT32 CPDF_VariableText::GetTypeDescent(FX_INT32 nFontIndex)
-{
- return m_pVTProvider ? m_pVTProvider->GetTypeDescent(nFontIndex) : 0;
-}
-FX_INT32 CPDF_VariableText::GetWordFontIndex(FX_WORD word, FX_INT32 charset, FX_INT32 nFontIndex)
-{
- return m_pVTProvider ? m_pVTProvider->GetWordFontIndex(word, charset, nFontIndex) : -1;
-}
-FX_INT32 CPDF_VariableText::GetDefaultFontIndex()
-{
- return m_pVTProvider ? m_pVTProvider->GetDefaultFontIndex() : -1;
-}
-FX_BOOL CPDF_VariableText::IsLatinWord(FX_WORD word)
-{
- return m_pVTProvider ? m_pVTProvider->IsLatinWord(word) : FALSE;
-}
-IPDF_VariableText_Iterator * CPDF_VariableText::GetIterator()
-{
- if (!m_pVTIterator) {
- return m_pVTIterator = FX_NEW CPDF_VariableText_Iterator(this);
- }
- return m_pVTIterator;
-}
-IPDF_VariableText_Provider* CPDF_VariableText::SetProvider(IPDF_VariableText_Provider * pProvider)
-{
- IPDF_VariableText_Provider* pOld = m_pVTProvider;
- m_pVTProvider = pProvider;
- return pOld;
-}
-CPDF_VariableText_Iterator::CPDF_VariableText_Iterator(CPDF_VariableText * pVT):
- m_pVT(pVT),
- m_CurPos(-1, -1, -1)
-{
-}
-CPDF_VariableText_Iterator::~CPDF_VariableText_Iterator()
-{
-}
-void CPDF_VariableText_Iterator::SetAt(FX_INT32 nWordIndex)
-{
- ASSERT(m_pVT != NULL);
- m_CurPos = m_pVT->WordIndexToWordPlace(nWordIndex);
-}
-void CPDF_VariableText_Iterator::SetAt(const CPVT_WordPlace & place)
-{
- ASSERT(m_pVT != NULL);
- m_CurPos = place;
-}
-FX_BOOL CPDF_VariableText_Iterator::NextWord()
-{
- ASSERT(m_pVT != NULL);
- if (m_CurPos == m_pVT->GetEndWordPlace()) {
- return FALSE;
- }
- m_CurPos = m_pVT->GetNextWordPlace(m_CurPos);
- return TRUE;
-}
-FX_BOOL CPDF_VariableText_Iterator::PrevWord()
-{
- ASSERT(m_pVT != NULL);
- if (m_CurPos == m_pVT->GetBeginWordPlace()) {
- return FALSE;
- }
- m_CurPos = m_pVT->GetPrevWordPlace(m_CurPos);
- return TRUE;
-}
-FX_BOOL CPDF_VariableText_Iterator::NextLine()
-{
- ASSERT(m_pVT != NULL);
- if (CSection * pSection = m_pVT->m_SectionArray.GetAt(m_CurPos.nSecIndex)) {
- if (m_CurPos.nLineIndex < pSection->m_LineArray.GetSize() - 1) {
- m_CurPos = CPVT_WordPlace(m_CurPos.nSecIndex, m_CurPos.nLineIndex + 1, -1);
- return TRUE;
- } else {
- if (m_CurPos.nSecIndex < m_pVT->m_SectionArray.GetSize() - 1) {
- m_CurPos = CPVT_WordPlace(m_CurPos.nSecIndex + 1, 0, -1);
- return TRUE;
- }
- }
- }
- return FALSE;
-}
-FX_BOOL CPDF_VariableText_Iterator::PrevLine()
-{
- ASSERT(m_pVT != NULL);
- if (CSection * pSection = m_pVT->m_SectionArray.GetAt(m_CurPos.nSecIndex)) {
- if (m_CurPos.nLineIndex > 0) {
- m_CurPos = CPVT_WordPlace(m_CurPos.nSecIndex, m_CurPos.nLineIndex - 1, -1);
- return TRUE;
- } else {
- if (m_CurPos.nSecIndex > 0) {
- if (CSection * pLastSection = m_pVT->m_SectionArray.GetAt(m_CurPos.nSecIndex - 1)) {
- m_CurPos = CPVT_WordPlace(m_CurPos.nSecIndex - 1, pLastSection->m_LineArray.GetSize() - 1, -1);
- return TRUE;
- }
- }
- }
- }
- return FALSE;
-}
-FX_BOOL CPDF_VariableText_Iterator::NextSection()
-{
- ASSERT(m_pVT != NULL);
- if (m_CurPos.nSecIndex < m_pVT->m_SectionArray.GetSize() - 1) {
- m_CurPos = CPVT_WordPlace(m_CurPos.nSecIndex + 1, 0, -1);
- return TRUE;
- }
- return FALSE;
-}
-FX_BOOL CPDF_VariableText_Iterator::PrevSection()
-{
- ASSERT(m_pVT != NULL);
- if (m_CurPos.nSecIndex > 0) {
- m_CurPos = CPVT_WordPlace(m_CurPos.nSecIndex - 1, 0, -1);
- return TRUE;
- }
- return FALSE;
-}
-FX_BOOL CPDF_VariableText_Iterator::GetWord(CPVT_Word & word) const
-{
- ASSERT(m_pVT != NULL);
- word.WordPlace = m_CurPos;
- if (CSection * pSection = m_pVT->m_SectionArray.GetAt(m_CurPos.nSecIndex)) {
- if (CLine * pLine = pSection->m_LineArray.GetAt(m_CurPos.nLineIndex)) {
- if (CPVT_WordInfo * pWord = pSection->m_WordArray.GetAt(m_CurPos.nWordIndex)) {
- word.Word = pWord->Word;
- word.nCharset = pWord->nCharset;
- word.fWidth = m_pVT->GetWordWidth(*pWord);
- word.ptWord = m_pVT->InToOut(
- CPDF_Point(pWord->fWordX + pSection->m_SecInfo.rcSection.left,
- pWord->fWordY + pSection->m_SecInfo.rcSection.top) );
- word.fAscent = m_pVT->GetWordAscent(*pWord);
- word.fDescent = m_pVT->GetWordDescent(*pWord);
- if (pWord->pWordProps) {
- word.WordProps = *pWord->pWordProps;
- }
- word.nFontIndex = m_pVT->GetWordFontIndex(*pWord);
- word.fFontSize = m_pVT->GetWordFontSize(*pWord);
- return TRUE;
- }
- }
- }
- return FALSE;
-}
-FX_BOOL CPDF_VariableText_Iterator::SetWord(const CPVT_Word & word)
-{
- ASSERT(m_pVT != NULL);
- if (CSection * pSection = m_pVT->m_SectionArray.GetAt(m_CurPos.nSecIndex)) {
- if (CPVT_WordInfo * pWord = pSection->m_WordArray.GetAt(m_CurPos.nWordIndex)) {
- if (pWord->pWordProps) {
- *pWord->pWordProps = word.WordProps;
- }
- return TRUE;
- }
- }
- return FALSE;
-}
-FX_BOOL CPDF_VariableText_Iterator::GetLine(CPVT_Line & line) const
-{
- ASSERT(m_pVT != NULL);
- line.lineplace = CPVT_WordPlace(m_CurPos.nSecIndex, m_CurPos.nLineIndex, -1);
- if (CSection * pSection = m_pVT->m_SectionArray.GetAt(m_CurPos.nSecIndex)) {
- if (CLine * pLine = pSection->m_LineArray.GetAt(m_CurPos.nLineIndex)) {
- line.ptLine = m_pVT->InToOut(
- CPDF_Point(pLine->m_LineInfo.fLineX + pSection->m_SecInfo.rcSection.left,
- pLine->m_LineInfo.fLineY + pSection->m_SecInfo.rcSection.top) );
- line.fLineWidth = pLine->m_LineInfo.fLineWidth;
- line.fLineAscent = pLine->m_LineInfo.fLineAscent;
- line.fLineDescent = pLine->m_LineInfo.fLineDescent;
- line.lineEnd = pLine->GetEndWordPlace();
- return TRUE;
- }
- }
- return FALSE;
-}
-FX_BOOL CPDF_VariableText_Iterator::GetSection(CPVT_Section & section) const
-{
- ASSERT(m_pVT != NULL);
- section.secplace = CPVT_WordPlace(m_CurPos.nSecIndex, 0, -1);
- if (CSection * pSection = m_pVT->m_SectionArray.GetAt(m_CurPos.nSecIndex)) {
- section.rcSection = m_pVT->InToOut(pSection->m_SecInfo.rcSection);
- if (pSection->m_SecInfo.pSecProps) {
- section.SecProps = *pSection->m_SecInfo.pSecProps;
- }
- if (pSection->m_SecInfo.pWordProps) {
- section.WordProps = *pSection->m_SecInfo.pWordProps;
- }
- return TRUE;
- }
- return FALSE;
-}
-FX_BOOL CPDF_VariableText_Iterator::SetSection(const CPVT_Section & section)
-{
- ASSERT(m_pVT != NULL);
- if (CSection * pSection = m_pVT->m_SectionArray.GetAt(m_CurPos.nSecIndex)) {
- if (pSection->m_SecInfo.pSecProps) {
- *pSection->m_SecInfo.pSecProps = section.SecProps;
- }
- if (pSection->m_SecInfo.pWordProps) {
- *pSection->m_SecInfo.pWordProps = section.WordProps;
- }
- return TRUE;
- }
- return FALSE;
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fpdfdoc/fpdf_doc.h"
+#include "../../include/fpdfdoc/fpdf_vt.h"
+#include "pdf_vt.h"
+const FX_BYTE gFontSizeSteps[] = { 4, 6, 8, 9, 10, 12, 14, 18, 20, 25, 30, 35, 40, 45, 50, 55, 60, 70, 80, 90, 100, 110, 120, 130, 144};
+#define PVT_RETURN_LENGTH 1
+#define PVT_DEFAULT_FONTSIZE 18.0f
+#define PVTWORD_SCRIPT_NORMAL 0
+#define PVTWORD_SCRIPT_SUPER 1
+#define PVTWORD_SCRIPT_SUB 2
+#define PVT_FONTSCALE 0.001f
+#define PVT_PERCENT 0.01f
+#define PVT_HALF 0.5f
+CLine::CLine()
+{
+}
+CLine::~CLine()
+{
+}
+CPVT_WordPlace CLine::GetBeginWordPlace() const
+{
+ return CPVT_WordPlace(LinePlace.nSecIndex, LinePlace.nLineIndex, -1);
+}
+CPVT_WordPlace CLine::GetEndWordPlace() const
+{
+ return CPVT_WordPlace(LinePlace.nSecIndex, LinePlace.nLineIndex, m_LineInfo.nEndWordIndex);
+}
+CPVT_WordPlace CLine::GetPrevWordPlace(const CPVT_WordPlace & place) const
+{
+ if (place.nWordIndex > m_LineInfo.nEndWordIndex) {
+ return CPVT_WordPlace(place.nSecIndex, place.nLineIndex, m_LineInfo.nEndWordIndex);
+ }
+ return CPVT_WordPlace(place.nSecIndex, place.nLineIndex, place.nWordIndex - 1);
+}
+CPVT_WordPlace CLine::GetNextWordPlace(const CPVT_WordPlace & place) const
+{
+ if (place.nWordIndex < m_LineInfo.nBeginWordIndex) {
+ return CPVT_WordPlace(place.nSecIndex, place.nLineIndex, m_LineInfo.nBeginWordIndex);
+ }
+ return CPVT_WordPlace(place.nSecIndex, place.nLineIndex, place.nWordIndex + 1);
+}
+CSection::CSection(CPDF_VariableText * pVT) : m_pVT(pVT)
+{
+}
+CSection::~CSection()
+{
+ ResetAll();
+}
+void CSection::ResetAll()
+{
+ ResetWordArray();
+ ResetLineArray();
+}
+void CSection::ResetLineArray()
+{
+ m_LineArray.RemoveAll();
+}
+void CSection::ResetWordArray()
+{
+ for (FX_INT32 i = 0, sz = m_WordArray.GetSize(); i < sz; i++) {
+ delete m_WordArray.GetAt(i);
+ }
+ m_WordArray.RemoveAll();
+}
+void CSection::ResetLinePlace()
+{
+ for (FX_INT32 i = 0, sz = m_LineArray.GetSize(); i < sz; i++) {
+ if (CLine * pLine = m_LineArray.GetAt(i)) {
+ pLine->LinePlace = CPVT_WordPlace(SecPlace.nSecIndex, i, -1);
+ }
+ }
+}
+CPVT_WordPlace CSection::AddWord(const CPVT_WordPlace & place, const CPVT_WordInfo & wordinfo)
+{
+ if (CPVT_WordInfo * pWord = FX_NEW CPVT_WordInfo(wordinfo)) {
+ FX_INT32 nWordIndex = FPDF_MAX(FPDF_MIN(place.nWordIndex, this->m_WordArray.GetSize()), 0);
+ if (nWordIndex == m_WordArray.GetSize()) {
+ m_WordArray.Add(pWord);
+ } else {
+ m_WordArray.InsertAt(nWordIndex, pWord);
+ }
+ }
+ return place;
+}
+CPVT_WordPlace CSection::AddLine(const CPVT_LineInfo & lineinfo)
+{
+ return CPVT_WordPlace(SecPlace.nSecIndex, m_LineArray.Add(lineinfo), -1);
+}
+CPVT_FloatRect CSection::Rearrange()
+{
+ ASSERT(m_pVT != NULL);
+ if (m_pVT->m_nCharArray > 0) {
+ return CTypeset(this).CharArray();
+ } else {
+ return CTypeset(this).Typeset();
+ }
+}
+CPVT_Size CSection::GetSectionSize(FX_FLOAT fFontSize)
+{
+ return CTypeset(this).GetEditSize(fFontSize);
+}
+CPVT_WordPlace CSection::GetBeginWordPlace() const
+{
+ if (CLine * pLine = m_LineArray.GetAt(0)) {
+ return pLine->GetBeginWordPlace();
+ } else {
+ return SecPlace;
+ }
+}
+CPVT_WordPlace CSection::GetEndWordPlace() const
+{
+ if (CLine * pLine = m_LineArray.GetAt(m_LineArray.GetSize() - 1)) {
+ return pLine->GetEndWordPlace();
+ } else {
+ return this->SecPlace;
+ }
+}
+CPVT_WordPlace CSection::GetPrevWordPlace(const CPVT_WordPlace & place) const
+{
+ if (place.nLineIndex < 0) {
+ return GetBeginWordPlace();
+ }
+ if (place.nLineIndex >= m_LineArray.GetSize()) {
+ return GetEndWordPlace();
+ }
+ if (CLine * pLine = m_LineArray.GetAt(place.nLineIndex)) {
+ if (place.nWordIndex == pLine->m_LineInfo.nBeginWordIndex) {
+ return CPVT_WordPlace(place.nSecIndex, place.nLineIndex, -1);
+ } else if (place.nWordIndex < pLine->m_LineInfo.nBeginWordIndex) {
+ if (CLine * pPrevLine = m_LineArray.GetAt(place.nLineIndex - 1)) {
+ return pPrevLine->GetEndWordPlace();
+ }
+ } else {
+ return pLine->GetPrevWordPlace(place);
+ }
+ }
+ return place;
+}
+CPVT_WordPlace CSection::GetNextWordPlace(const CPVT_WordPlace & place) const
+{
+ if (place.nLineIndex < 0) {
+ return GetBeginWordPlace();
+ }
+ if (place.nLineIndex >= m_LineArray.GetSize()) {
+ return GetEndWordPlace();
+ }
+ if (CLine * pLine = m_LineArray.GetAt(place.nLineIndex)) {
+ if (place.nWordIndex >= pLine->m_LineInfo.nEndWordIndex) {
+ if (CLine * pNextLine = m_LineArray.GetAt(place.nLineIndex + 1)) {
+ return pNextLine->GetBeginWordPlace();
+ }
+ } else {
+ return pLine->GetNextWordPlace(place);
+ }
+ }
+ return place;
+}
+void CSection::UpdateWordPlace(CPVT_WordPlace & place) const
+{
+ FX_INT32 nLeft = 0;
+ FX_INT32 nRight = m_LineArray.GetSize() - 1;
+ FX_INT32 nMid = (nLeft + nRight) / 2;
+ while (nLeft <= nRight) {
+ if (CLine * pLine = m_LineArray.GetAt(nMid)) {
+ if (place.nWordIndex < pLine->m_LineInfo.nBeginWordIndex) {
+ nRight = nMid - 1;
+ nMid = (nLeft + nRight) / 2;
+ } else if (place.nWordIndex > pLine->m_LineInfo.nEndWordIndex) {
+ nLeft = nMid + 1;
+ nMid = (nLeft + nRight) / 2;
+ } else {
+ place.nLineIndex = nMid;
+ return;
+ }
+ } else {
+ break;
+ }
+ }
+}
+CPVT_WordPlace CSection::SearchWordPlace(const CPDF_Point & point) const
+{
+ ASSERT(m_pVT != NULL);
+ CPVT_WordPlace place = GetBeginWordPlace();
+ FX_BOOL bUp = TRUE;
+ FX_BOOL bDown = TRUE;
+ FX_INT32 nLeft = 0;
+ FX_INT32 nRight = m_LineArray.GetSize() - 1;
+ FX_INT32 nMid = m_LineArray.GetSize() / 2;
+ FX_FLOAT fTop = 0;
+ FX_FLOAT fBottom = 0;
+ while (nLeft <= nRight) {
+ if (CLine * pLine = m_LineArray.GetAt(nMid)) {
+ fTop = pLine->m_LineInfo.fLineY - pLine->m_LineInfo.fLineAscent - m_pVT->GetLineLeading(m_SecInfo);
+ fBottom = pLine->m_LineInfo.fLineY - pLine->m_LineInfo.fLineDescent;
+ if (IsFloatBigger(point.y, fTop)) {
+ bUp = FALSE;
+ }
+ if (IsFloatSmaller(point.y, fBottom)) {
+ bDown = FALSE;
+ }
+ if (IsFloatSmaller(point.y, fTop)) {
+ nRight = nMid - 1;
+ nMid = (nLeft + nRight) / 2;
+ continue;
+ } else if (IsFloatBigger(point.y, fBottom)) {
+ nLeft = nMid + 1;
+ nMid = (nLeft + nRight) / 2;
+ continue;
+ } else {
+ place = SearchWordPlace(point.x,
+ CPVT_WordRange(pLine->GetNextWordPlace(pLine->GetBeginWordPlace()), pLine->GetEndWordPlace())
+ );
+ place.nLineIndex = nMid;
+ return place;
+ }
+ }
+ }
+ if (bUp) {
+ place = GetBeginWordPlace();
+ }
+ if (bDown) {
+ place = GetEndWordPlace();
+ }
+ return place;
+}
+CPVT_WordPlace CSection::SearchWordPlace(FX_FLOAT fx, const CPVT_WordPlace & lineplace) const
+{
+ if (CLine * pLine = m_LineArray.GetAt(lineplace.nLineIndex)) {
+ return SearchWordPlace(fx - m_SecInfo.rcSection.left,
+ CPVT_WordRange(pLine->GetNextWordPlace(pLine->GetBeginWordPlace()), pLine->GetEndWordPlace()));
+ }
+ return GetBeginWordPlace();
+}
+CPVT_WordPlace CSection::SearchWordPlace(FX_FLOAT fx, const CPVT_WordRange & range) const
+{
+ CPVT_WordPlace wordplace = range.BeginPos;
+ wordplace.nWordIndex = -1;
+ if (!m_pVT) {
+ return wordplace;
+ }
+ FX_INT32 nLeft = range.BeginPos.nWordIndex;
+ FX_INT32 nRight = range.EndPos.nWordIndex + 1;
+ FX_INT32 nMid = (nLeft + nRight) / 2;
+ while (nLeft < nRight) {
+ if (nMid == nLeft) {
+ break;
+ }
+ if (nMid == nRight) {
+ nMid--;
+ break;
+ }
+ if (CPVT_WordInfo * pWord = m_WordArray.GetAt(nMid)) {
+ if (fx > pWord->fWordX + m_pVT->GetWordWidth(*pWord) * PVT_HALF) {
+ nLeft = nMid;
+ nMid = (nLeft + nRight) / 2;
+ continue;
+ } else {
+ nRight = nMid;
+ nMid = (nLeft + nRight) / 2;
+ continue;
+ }
+ } else {
+ break;
+ }
+ }
+ if (CPVT_WordInfo * pWord = m_WordArray.GetAt(nMid)) {
+ if (fx > pWord->fWordX + m_pVT->GetWordWidth(*pWord) * PVT_HALF) {
+ wordplace.nWordIndex = nMid;
+ }
+ }
+ return wordplace;
+}
+void CSection::ClearLeftWords(FX_INT32 nWordIndex)
+{
+ for (FX_INT32 i = nWordIndex; i >= 0; i--) {
+ delete m_WordArray.GetAt(i);
+ m_WordArray.RemoveAt(i);
+ }
+}
+void CSection::ClearRightWords(FX_INT32 nWordIndex)
+{
+ for (FX_INT32 i = m_WordArray.GetSize() - 1; i > nWordIndex; i--) {
+ delete m_WordArray.GetAt(i);
+ m_WordArray.RemoveAt(i);
+ }
+}
+void CSection::ClearMidWords(FX_INT32 nBeginIndex, FX_INT32 nEndIndex)
+{
+ for (FX_INT32 i = nEndIndex; i > nBeginIndex; i--) {
+ delete m_WordArray.GetAt(i);
+ m_WordArray.RemoveAt(i);
+ }
+}
+void CSection::ClearWords(const CPVT_WordRange & PlaceRange)
+{
+ CPVT_WordPlace SecBeginPos = GetBeginWordPlace();
+ CPVT_WordPlace SecEndPos = GetEndWordPlace();
+ if (PlaceRange.BeginPos.WordCmp(SecBeginPos) >= 0) {
+ if (PlaceRange.EndPos.WordCmp(SecEndPos) <= 0) {
+ ClearMidWords(PlaceRange.BeginPos.nWordIndex, PlaceRange.EndPos.nWordIndex);
+ } else {
+ ClearRightWords(PlaceRange.BeginPos.nWordIndex);
+ }
+ } else if (PlaceRange.EndPos.WordCmp(SecEndPos) <= 0) {
+ ClearLeftWords(PlaceRange.EndPos.nWordIndex);
+ } else {
+ ResetWordArray();
+ }
+}
+void CSection::ClearWord(const CPVT_WordPlace & place)
+{
+ delete m_WordArray.GetAt(place.nWordIndex);
+ m_WordArray.RemoveAt(place.nWordIndex);
+}
+CTypeset::CTypeset(CSection * pSection) : m_pSection(pSection), m_pVT(pSection->m_pVT), m_rcRet(0.0f, 0.0f, 0.0f, 0.0f)
+{
+}
+CTypeset::~CTypeset()
+{
+}
+CPVT_FloatRect CTypeset::CharArray()
+{
+ ASSERT(m_pSection != NULL);
+ ASSERT(m_pVT != NULL);
+ FX_FLOAT fLineAscent = m_pVT->GetFontAscent(m_pVT->GetDefaultFontIndex(), m_pVT->GetFontSize());
+ FX_FLOAT fLineDescent = m_pVT->GetFontDescent(m_pVT->GetDefaultFontIndex(), m_pVT->GetFontSize());
+ m_rcRet.Default();
+ FX_FLOAT x = 0.0f, y = 0.0f;
+ FX_FLOAT fNextWidth;
+ FX_INT32 nStart = 0;
+ FX_FLOAT fNodeWidth = m_pVT->GetPlateWidth() / (m_pVT->m_nCharArray <= 0 ? 1 : m_pVT->m_nCharArray);
+ if (CLine * pLine = m_pSection->m_LineArray.GetAt(0)) {
+ x = 0.0f;
+ y += m_pVT->GetLineLeading(m_pSection->m_SecInfo);
+ y += fLineAscent;
+ nStart = 0;
+ switch (m_pVT->GetAlignment(m_pSection->m_SecInfo)) {
+ case 0:
+ pLine->m_LineInfo.fLineX = fNodeWidth * PVT_HALF;
+ break;
+ case 1:
+ nStart = (m_pVT->m_nCharArray - m_pSection->m_WordArray.GetSize()) / 2;
+ pLine->m_LineInfo.fLineX = fNodeWidth * nStart - fNodeWidth * PVT_HALF;
+ break;
+ case 2:
+ nStart = m_pVT->m_nCharArray - m_pSection->m_WordArray.GetSize();
+ pLine->m_LineInfo.fLineX = fNodeWidth * nStart - fNodeWidth * PVT_HALF;
+ break;
+ }
+ for (FX_INT32 w = 0, sz = m_pSection->m_WordArray.GetSize(); w < sz; w++) {
+ if (w >= m_pVT->m_nCharArray) {
+ break;
+ }
+ fNextWidth = 0;
+ if (CPVT_WordInfo * pNextWord = (CPVT_WordInfo *)m_pSection->m_WordArray.GetAt(w + 1)) {
+ pNextWord->fWordTail = 0;
+ fNextWidth = m_pVT->GetWordWidth(*pNextWord);
+ }
+ if (CPVT_WordInfo * pWord = (CPVT_WordInfo *)m_pSection->m_WordArray.GetAt(w)) {
+ pWord->fWordTail = 0;
+ FX_FLOAT fWordWidth = m_pVT->GetWordWidth(*pWord);
+ FX_FLOAT fWordAscent = m_pVT->GetWordAscent(*pWord);
+ FX_FLOAT fWordDescent = m_pVT->GetWordDescent(*pWord);
+ x = (FX_FLOAT)(fNodeWidth * (w + nStart + 0.5) - fWordWidth * PVT_HALF);
+ pWord->fWordX = x;
+ pWord->fWordY = y;
+ if (w == 0) {
+ pLine->m_LineInfo.fLineX = x;
+ }
+ if (w != m_pSection->m_WordArray.GetSize() - 1)
+ pWord->fWordTail = (fNodeWidth - (fWordWidth + fNextWidth) * PVT_HALF > 0 ?
+ fNodeWidth - (fWordWidth + fNextWidth) * PVT_HALF : 0);
+ else {
+ pWord->fWordTail = 0;
+ }
+ x += fWordWidth;
+ fLineAscent = FPDF_MAX(fLineAscent, fWordAscent);
+ fLineDescent = FPDF_MIN(fLineDescent, fWordDescent);
+ }
+ }
+ pLine->m_LineInfo.nBeginWordIndex = 0;
+ pLine->m_LineInfo.nEndWordIndex = m_pSection->m_WordArray.GetSize() - 1;
+ pLine->m_LineInfo.fLineY = y;
+ pLine->m_LineInfo.fLineWidth = x - pLine->m_LineInfo.fLineX;
+ pLine->m_LineInfo.fLineAscent = fLineAscent;
+ pLine->m_LineInfo.fLineDescent = fLineDescent;
+ y += (-fLineDescent);
+ }
+ return m_rcRet = CPVT_FloatRect(0, 0, x, y);
+}
+CPVT_Size CTypeset::GetEditSize(FX_FLOAT fFontSize)
+{
+ ASSERT(m_pSection != NULL);
+ ASSERT(m_pVT != NULL);
+ SplitLines(FALSE, fFontSize);
+ return CPVT_Size(m_rcRet.Width(), m_rcRet.Height());
+}
+CPVT_FloatRect CTypeset::Typeset()
+{
+ ASSERT(m_pSection != NULL);
+ ASSERT(m_pVT != NULL);
+ m_pSection->m_LineArray.Empty();
+ SplitLines(TRUE, 0.0f);
+ m_pSection->m_LineArray.Clear();
+ OutputLines();
+ return m_rcRet;
+}
+static int special_chars[128] = {
+ 0x0000, 0x000C, 0x0008, 0x000C, 0x0008, 0x0000, 0x0020, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0008, 0x0008, 0x0000, 0x0010, 0x0000, 0x0000, 0x0028,
+ 0x000C, 0x0008, 0x0000, 0x0000, 0x0028, 0x0028, 0x0028, 0x0028,
+ 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+ 0x0002, 0x0002, 0x0008, 0x0008, 0x0000, 0x0000, 0x0000, 0x0008,
+ 0x0000, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+ 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+ 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+ 0x0001, 0x0001, 0x0001, 0x000C, 0x0000, 0x0008, 0x0000, 0x0000,
+ 0x0000, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+ 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+ 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+ 0x0001, 0x0001, 0x0001, 0x000C, 0x0000, 0x0008, 0x0000, 0x0000,
+};
+static FX_BOOL IsLatin(FX_WORD word)
+{
+ if (word <= 0x007F) {
+ if (special_chars[word] & 0x0001) {
+ return TRUE;
+ }
+ }
+ if ((word >= 0x00C0 && word <= 0x00FF) ||
+ (word >= 0x0100 && word <= 0x024F) ||
+ (word >= 0x1E00 && word <= 0x1EFF) ||
+ (word >= 0x2C60 && word <= 0x2C7F) ||
+ (word >= 0xA720 && word <= 0xA7FF) ||
+ (word >= 0xFF21 && word <= 0xFF3A) ||
+ (word >= 0xFF41 && word <= 0xFF5A)) {
+ return TRUE;
+ }
+ return FALSE;
+}
+static FX_BOOL IsDigit(FX_DWORD word)
+{
+ return (word >= 0x0030 && word <= 0x0039) ? TRUE : FALSE;
+}
+static FX_BOOL IsCJK(FX_DWORD word)
+{
+ if ((word >= 0x1100 && word <= 0x11FF) ||
+ (word >= 0x2E80 && word <= 0x2FFF) ||
+ (word >= 0x3040 && word <= 0x9FBF) ||
+ (word >= 0xAC00 && word <= 0xD7AF) ||
+ (word >= 0xF900 && word <= 0xFAFF) ||
+ (word >= 0xFE30 && word <= 0xFE4F) ||
+ (word >= 0x20000 && word <= 0x2A6DF) ||
+ (word >= 0x2F800 && word <= 0x2FA1F)) {
+ return TRUE;
+ }
+ if (word >= 0x3000 && word <= 0x303F) {
+ if (word == 0x3005 || word == 0x3006 || word == 0x3021 || word == 0x3022 ||
+ word == 0x3023 || word == 0x3024 || word == 0x3025 || word == 0x3026 ||
+ word == 0x3027 || word == 0x3028 || word == 0x3029 || word == 0x3031 ||
+ word == 0x3032 || word == 0x3033 || word == 0x3034 || word == 0x3035) {
+ return TRUE;
+ }
+ return FALSE;
+ }
+ if (word >= 0xFF66 && word <= 0xFF9D) {
+ return TRUE;
+ }
+ return FALSE;
+}
+static FX_BOOL IsPunctuation(FX_DWORD word)
+{
+ if (word <= 0x007F) {
+ if ((special_chars[word] >> 3) & 1) {
+ return TRUE;
+ }
+ } else if (word >= 0x0080 && word <= 0x00FF) {
+ if (word == 0x0082 || word == 0x0084 || word == 0x0085 || word == 0x0091 ||
+ word == 0x0092 || word == 0x0093 || word <= 0x0094 || word == 0x0096 ||
+ word == 0x00B4 || word == 0x00B8) {
+ return TRUE;
+ }
+ } else if (word >= 0x2000 && word <= 0x206F) {
+ if (word == 0x2010 || word == 0x2011 || word == 0x2012 || word == 0x2013 ||
+ word == 0x2018 || word == 0x2019 || word == 0x201A || word == 0x201B ||
+ word == 0x201C || word == 0x201D || word == 0x201E || word == 0x201F ||
+ word == 0x2032 || word == 0x2033 || word == 0x2034 || word == 0x2035 ||
+ word == 0x2036 || word == 0x2037 || word == 0x203C || word == 0x203D ||
+ word == 0x203E || word == 0x2044) {
+ return TRUE;
+ }
+ } else if (word >= 0x3000 && word <= 0x303F) {
+ if (word == 0x3001 || word == 0x3002 || word == 0x3003 || word == 0x3005 ||
+ word == 0x3009 || word == 0x300A || word == 0x300B || word == 0x300C ||
+ word == 0x300D || word == 0x300F || word == 0x300E || word == 0x3010 ||
+ word == 0x3011 || word == 0x3014 || word == 0x3015 || word == 0x3016 ||
+ word == 0x3017 || word == 0x3018 || word == 0x3019 || word == 0x301A ||
+ word == 0x301B || word == 0x301D || word == 0x301E || word == 0x301F) {
+ return TRUE;
+ }
+ } else if (word >= 0xFE50 && word <= 0xFE6F) {
+ if ((word >= 0xFE50 && word <= 0xFE5E) || word == 0xFE63) {
+ return TRUE;
+ }
+ } else if (word >= 0xFF00 && word <= 0xFFEF) {
+ if (word == 0xFF01 || word == 0xFF02 || word == 0xFF07 || word == 0xFF08 ||
+ word == 0xFF09 || word == 0xFF0C || word == 0xFF0E || word == 0xFF0F ||
+ word == 0xFF1A || word == 0xFF1B || word == 0xFF1F || word == 0xFF3B ||
+ word == 0xFF3D || word == 0xFF40 || word == 0xFF5B || word == 0xFF5C ||
+ word == 0xFF5D || word == 0xFF61 || word == 0xFF62 || word == 0xFF63 ||
+ word == 0xFF64 || word == 0xFF65 || word == 0xFF9E || word == 0xFF9F) {
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+static FX_BOOL IsConnectiveSymbol(FX_DWORD word)
+{
+ if (word <= 0x007F) {
+ if ((special_chars[word] >> 5) & 1) {
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+static FX_BOOL IsOpenStylePunctuation(FX_DWORD word)
+{
+ if (word <= 0x007F) {
+ if ((special_chars[word] >> 2) & 1) {
+ return TRUE;
+ }
+ } else if (word == 0x300A || word == 0x300C || word == 0x300E || word == 0x3010 ||
+ word == 0x3014 || word == 0x3016 || word == 0x3018 || word == 0x301A ||
+ word == 0xFF08 || word == 0xFF3B || word == 0xFF5B || word == 0xFF62) {
+ return TRUE;
+ }
+ return FALSE;
+}
+static FX_BOOL IsCurrencySymbol(FX_WORD word)
+{
+ if (word == 0x0024 || word == 0x0080 || word == 0x00A2 || word == 0x00A3 ||
+ word == 0x00A4 || word == 0x00A5 || (word >= 0x20A0 && word <= 0x20CF) ||
+ word == 0xFE69 || word == 0xFF04 || word == 0xFFE0 || word == 0xFFE1 ||
+ word == 0xFFE5 || word == 0xFFE6) {
+ return TRUE;
+ }
+ return FALSE;
+}
+static FX_BOOL IsPrefixSymbol(FX_WORD word)
+{
+ if (IsCurrencySymbol(word)) {
+ return TRUE;
+ }
+ if (word == 0x2116) {
+ return TRUE;
+ }
+ return FALSE;
+}
+static FX_BOOL IsSpace(FX_WORD word)
+{
+ return (word == 0x0020 || word == 0x3000) ? TRUE : FALSE;
+}
+static FX_BOOL NeedDivision(FX_WORD prevWord, FX_WORD curWord)
+{
+ if ((IsLatin(prevWord) || IsDigit(prevWord)) && (IsLatin(curWord) || IsDigit(curWord))) {
+ return FALSE;
+ } else if (IsSpace(curWord) || IsPunctuation(curWord)) {
+ return FALSE;
+ } else if (IsConnectiveSymbol(prevWord) || IsConnectiveSymbol(curWord)) {
+ return FALSE;
+ } else if (IsSpace(prevWord) || IsPunctuation(prevWord)) {
+ return TRUE;
+ } else if (IsPrefixSymbol(prevWord)) {
+ return FALSE;
+ } else if (IsPrefixSymbol(curWord) || IsCJK(curWord)) {
+ return TRUE;
+ } else if (IsCJK(prevWord)) {
+ return TRUE;
+ }
+ return FALSE;
+}
+void CTypeset::SplitLines(FX_BOOL bTypeset, FX_FLOAT fFontSize)
+{
+ ASSERT(m_pVT != NULL);
+ ASSERT(m_pSection != NULL);
+ FX_INT32 nLineHead = 0;
+ FX_INT32 nLineTail = 0;
+ FX_FLOAT fMaxX = 0.0f, fMaxY = 0.0f;
+ FX_FLOAT fLineWidth = 0.0f, fBackupLineWidth = 0.0f;
+ FX_FLOAT fLineAscent = 0.0f, fBackupLineAscent = 0.0f;
+ FX_FLOAT fLineDescent = 0.0f, fBackupLineDescent = 0.0f;
+ FX_INT32 nWordStartPos = 0;
+ FX_BOOL bFullWord = FALSE;
+ FX_INT32 nLineFullWordIndex = 0;
+ FX_INT32 nCharIndex = 0;
+ CPVT_LineInfo line;
+ FX_FLOAT fWordWidth = 0;
+ FX_FLOAT fTypesetWidth = FPDF_MAX(m_pVT->GetPlateWidth() - m_pVT->GetLineIndent(m_pSection->m_SecInfo), 0.0f);
+ FX_INT32 nTotalWords = m_pSection->m_WordArray.GetSize();
+ FX_BOOL bOpened = FALSE;
+ if (nTotalWords > 0) {
+ FX_INT32 i = 0;
+ while (i < nTotalWords) {
+ CPVT_WordInfo * pWord = m_pSection->m_WordArray.GetAt(i);
+ CPVT_WordInfo* pOldWord = pWord;
+ if (i > 0) {
+ pOldWord = m_pSection->m_WordArray.GetAt(i - 1);
+ }
+ if (pWord) {
+ if (bTypeset) {
+ fLineAscent = FPDF_MAX(fLineAscent, m_pVT->GetWordAscent(*pWord, TRUE));
+ fLineDescent = FPDF_MIN(fLineDescent, m_pVT->GetWordDescent(*pWord, TRUE));
+ fWordWidth = m_pVT->GetWordWidth(*pWord);
+ } else {
+ fLineAscent = FPDF_MAX(fLineAscent, m_pVT->GetWordAscent(*pWord, fFontSize));
+ fLineDescent = FPDF_MIN(fLineDescent, m_pVT->GetWordDescent(*pWord, fFontSize));
+ fWordWidth = m_pVT->GetWordWidth(pWord->nFontIndex,
+ pWord->Word,
+ m_pVT->m_wSubWord,
+ m_pVT->m_fCharSpace,
+ m_pVT->m_nHorzScale,
+ fFontSize,
+ pWord->fWordTail,
+ 0);
+ }
+ if (!bOpened) {
+ if (IsOpenStylePunctuation(pWord->Word)) {
+ bOpened = TRUE;
+ bFullWord = TRUE;
+ } else if (pOldWord != NULL) {
+ if (NeedDivision(pOldWord->Word, pWord->Word)) {
+ bFullWord = TRUE;
+ }
+ }
+ } else {
+ if (!IsSpace(pWord->Word) && !IsOpenStylePunctuation(pWord->Word)) {
+ bOpened = FALSE;
+ }
+ }
+ if (bFullWord) {
+ bFullWord = FALSE;
+ if (nCharIndex > 0) {
+ nLineFullWordIndex ++;
+ }
+ nWordStartPos = i;
+ fBackupLineWidth = fLineWidth;
+ fBackupLineAscent = fLineAscent;
+ fBackupLineDescent = fLineDescent;
+ }
+ nCharIndex++;
+ }
+ if (m_pVT->m_bLimitWidth && fTypesetWidth > 0 &&
+ fLineWidth + fWordWidth > fTypesetWidth) {
+ if (nLineFullWordIndex > 0) {
+ i = nWordStartPos;
+ fLineWidth = fBackupLineWidth;
+ fLineAscent = fBackupLineAscent;
+ fLineDescent = fBackupLineDescent;
+ }
+ if (nCharIndex == 1) {
+ fLineWidth = fWordWidth;
+ i++;
+ }
+ nLineTail = i - 1;
+ if (bTypeset) {
+ line.nBeginWordIndex = nLineHead;
+ line.nEndWordIndex = nLineTail;
+ line.nTotalWord = nLineTail - nLineHead + 1;
+ line.fLineWidth = fLineWidth;
+ line.fLineAscent = fLineAscent;
+ line.fLineDescent = fLineDescent;
+ m_pSection->AddLine(line);
+ }
+ fMaxY += (fLineAscent + m_pVT->GetLineLeading(m_pSection->m_SecInfo));
+ fMaxY += (-fLineDescent);
+ fMaxX = FPDF_MAX(fLineWidth, fMaxX);
+ nLineHead = i;
+ fLineWidth = 0.0f;
+ fLineAscent = 0.0f;
+ fLineDescent = 0.0f;
+ nCharIndex = 0;
+ nLineFullWordIndex = 0;
+ bFullWord = FALSE;
+ } else {
+ fLineWidth += fWordWidth;
+ i++;
+ }
+ }
+ if (nLineHead <= nTotalWords - 1) {
+ nLineTail = nTotalWords - 1;
+ if (bTypeset) {
+ line.nBeginWordIndex = nLineHead;
+ line.nEndWordIndex = nLineTail;
+ line.nTotalWord = nLineTail - nLineHead + 1;
+ line.fLineWidth = fLineWidth;
+ line.fLineAscent = fLineAscent;
+ line.fLineDescent = fLineDescent;
+ m_pSection->AddLine(line);
+ }
+ fMaxY += (fLineAscent + m_pVT->GetLineLeading(m_pSection->m_SecInfo));
+ fMaxY += (-fLineDescent);
+ fMaxX = FPDF_MAX(fLineWidth, fMaxX);
+ }
+ } else {
+ if (bTypeset) {
+ fLineAscent = m_pVT->GetLineAscent(m_pSection->m_SecInfo);
+ fLineDescent = m_pVT->GetLineDescent(m_pSection->m_SecInfo);
+ } else {
+ fLineAscent = m_pVT->GetFontAscent(m_pVT->GetDefaultFontIndex(), fFontSize);
+ fLineDescent = m_pVT->GetFontDescent(m_pVT->GetDefaultFontIndex(), fFontSize);
+ }
+ if (bTypeset) {
+ line.nBeginWordIndex = -1;
+ line.nEndWordIndex = -1;
+ line.nTotalWord = 0;
+ line.fLineWidth = 0;
+ line.fLineAscent = fLineAscent;
+ line.fLineDescent = fLineDescent;
+ m_pSection->AddLine(line);
+ }
+ fMaxY += (m_pVT->GetLineLeading(m_pSection->m_SecInfo) + fLineAscent + (-fLineDescent));
+ }
+ m_rcRet = CPVT_FloatRect(0, 0, fMaxX, fMaxY);
+}
+void CTypeset::OutputLines()
+{
+ ASSERT(m_pVT != NULL);
+ ASSERT(m_pSection != NULL);
+ FX_FLOAT fMinX = 0.0f, fMinY = 0.0f, fMaxX = 0.0f, fMaxY = 0.0f;
+ FX_FLOAT fPosX = 0.0f, fPosY = 0.0f;
+ FX_FLOAT fLineIndent = m_pVT->GetLineIndent(m_pSection->m_SecInfo);
+ FX_FLOAT fTypesetWidth = FPDF_MAX(m_pVT->GetPlateWidth() - fLineIndent, 0.0f);
+ switch (m_pVT->GetAlignment(m_pSection->m_SecInfo)) {
+ default:
+ case 0:
+ fMinX = 0.0f;
+ break;
+ case 1:
+ fMinX = (fTypesetWidth - m_rcRet.Width()) * PVT_HALF;
+ break;
+ case 2:
+ fMinX = fTypesetWidth - m_rcRet.Width();
+ break;
+ }
+ fMaxX = fMinX + m_rcRet.Width();
+ fMinY = 0.0f;
+ fMaxY = m_rcRet.Height();
+ FX_INT32 nTotalLines = m_pSection->m_LineArray.GetSize();
+ if (nTotalLines > 0) {
+ m_pSection->m_SecInfo.nTotalLine = nTotalLines;
+ for (FX_INT32 l = 0; l < nTotalLines; l++) {
+ if (CLine * pLine = m_pSection->m_LineArray.GetAt(l)) {
+ switch (m_pVT->GetAlignment(m_pSection->m_SecInfo)) {
+ default:
+ case 0:
+ fPosX = 0;
+ break;
+ case 1:
+ fPosX = (fTypesetWidth - pLine->m_LineInfo.fLineWidth) * PVT_HALF;
+ break;
+ case 2:
+ fPosX = fTypesetWidth - pLine->m_LineInfo.fLineWidth;
+ break;
+ }
+ fPosX += fLineIndent;
+ fPosY += m_pVT->GetLineLeading(m_pSection->m_SecInfo);
+ fPosY += pLine->m_LineInfo.fLineAscent;
+ pLine->m_LineInfo.fLineX = fPosX - fMinX;
+ pLine->m_LineInfo.fLineY = fPosY - fMinY;
+ for (FX_INT32 w = pLine->m_LineInfo.nBeginWordIndex; w <= pLine->m_LineInfo.nEndWordIndex; w++) {
+ if (CPVT_WordInfo * pWord = m_pSection->m_WordArray.GetAt(w)) {
+ pWord->fWordX = fPosX - fMinX;
+ if (pWord->pWordProps) {
+ switch (pWord->pWordProps->nScriptType) {
+ default:
+ case PVTWORD_SCRIPT_NORMAL:
+ pWord->fWordY = fPosY - fMinY;
+ break;
+ case PVTWORD_SCRIPT_SUPER:
+ pWord->fWordY = fPosY - m_pVT->GetWordAscent(*pWord) - fMinY;
+ break;
+ case PVTWORD_SCRIPT_SUB:
+ pWord->fWordY = fPosY - m_pVT->GetWordDescent(*pWord) - fMinY;
+ break;
+ }
+ } else {
+ pWord->fWordY = fPosY - fMinY;
+ }
+ fPosX += m_pVT->GetWordWidth(*pWord);
+ }
+ }
+ fPosY += (-pLine->m_LineInfo.fLineDescent);
+ }
+ }
+ }
+ m_rcRet = CPVT_FloatRect(fMinX, fMinY, fMaxX, fMaxY);
+}
+CPDF_VariableText::CPDF_VariableText() :
+ m_pVTProvider(NULL),
+ m_pVTIterator(NULL),
+ m_bInitial(FALSE),
+ m_bRichText(FALSE),
+ m_bMultiLine(FALSE),
+ m_bLimitWidth(FALSE),
+ m_bAutoFontSize(FALSE),
+ m_nLimitChar(0),
+ m_nCharArray(0),
+ m_nAlignment(0),
+ m_fCharSpace(0.0f),
+ m_fWordSpace(0.0f),
+ m_fFontSize(0.0f),
+ m_nHorzScale(100),
+ m_wSubWord(0),
+ m_fLineLeading(0.0f)
+{
+}
+CPDF_VariableText::~CPDF_VariableText()
+{
+ if (m_pVTIterator) {
+ delete m_pVTIterator;
+ m_pVTIterator = NULL;
+ }
+ ResetAll();
+}
+void CPDF_VariableText::Initialize()
+{
+ if (!m_bInitial) {
+ CPVT_SectionInfo secinfo;
+ if (m_bRichText) {
+ secinfo.pSecProps = FX_NEW CPVT_SecProps(0.0f, 0.0f, 0);
+ secinfo.pWordProps = FX_NEW CPVT_WordProps(GetDefaultFontIndex(), PVT_DEFAULT_FONTSIZE, 0, 0, 0);
+ }
+ CPVT_WordPlace place;
+ place.nSecIndex = 0;
+ AddSection(place, secinfo);
+ CPVT_LineInfo lineinfo;
+ lineinfo.fLineAscent = GetFontAscent(GetDefaultFontIndex(), GetFontSize());
+ lineinfo.fLineDescent = GetFontDescent(GetDefaultFontIndex(), GetFontSize());
+ AddLine(place, lineinfo);
+ if (CSection * pSection = m_SectionArray.GetAt(0)) {
+ pSection->ResetLinePlace();
+ }
+ m_bInitial = TRUE;
+ }
+}
+void CPDF_VariableText::ResetAll()
+{
+ m_bInitial = FALSE;
+ ResetSectionArray();
+}
+CPVT_WordPlace CPDF_VariableText::InsertWord(const CPVT_WordPlace & place, FX_WORD word, FX_INT32 charset,
+ const CPVT_WordProps * pWordProps)
+{
+ FX_INT32 nTotlaWords = this->GetTotalWords();
+ if (m_nLimitChar > 0 && nTotlaWords >= m_nLimitChar) {
+ return place;
+ }
+ if (m_nCharArray > 0 && nTotlaWords >= m_nCharArray) {
+ return place;
+ }
+ CPVT_WordPlace newplace = place;
+ newplace.nWordIndex ++;
+ if (m_bRichText) {
+ CPVT_WordProps * pNewProps = pWordProps ? FX_NEW CPVT_WordProps(*pWordProps) : FX_NEW CPVT_WordProps();
+ if (pNewProps) {
+ pNewProps->nFontIndex = GetWordFontIndex(word, charset, pWordProps->nFontIndex);
+ return AddWord(newplace, CPVT_WordInfo(word, charset, -1, pNewProps));
+ }
+ } else {
+ FX_INT32 nFontIndex = GetSubWord() > 0 ? GetDefaultFontIndex() : GetWordFontIndex(word, charset, GetDefaultFontIndex());
+ return AddWord(newplace, CPVT_WordInfo(word, charset, nFontIndex, NULL));
+ }
+ return place;
+}
+CPVT_WordPlace CPDF_VariableText::InsertSection(const CPVT_WordPlace & place, const CPVT_SecProps * pSecProps,
+ const CPVT_WordProps * pWordProps)
+{
+ FX_INT32 nTotlaWords = this->GetTotalWords();
+ if (m_nLimitChar > 0 && nTotlaWords >= m_nLimitChar) {
+ return place;
+ }
+ if (m_nCharArray > 0 && nTotlaWords >= m_nCharArray) {
+ return place;
+ }
+ if (!m_bMultiLine) {
+ return place;
+ }
+ CPVT_WordPlace wordplace = place;
+ UpdateWordPlace(wordplace);
+ CPVT_WordPlace newplace = place;
+ if (CSection * pSection = m_SectionArray.GetAt(wordplace.nSecIndex)) {
+ CPVT_WordPlace NewPlace(wordplace.nSecIndex + 1, 0, -1);
+ CPVT_SectionInfo secinfo;
+ if (m_bRichText) {
+ if (pSecProps) {
+ secinfo.pSecProps = FX_NEW CPVT_SecProps(*pSecProps);
+ }
+ if (pWordProps) {
+ secinfo.pWordProps = FX_NEW CPVT_WordProps(*pWordProps);
+ }
+ }
+ AddSection(NewPlace, secinfo);
+ newplace = NewPlace;
+ if (CSection * pNewSection = m_SectionArray.GetAt(NewPlace.nSecIndex)) {
+ for (FX_INT32 w = wordplace.nWordIndex + 1, sz = pSection->m_WordArray.GetSize(); w < sz; w++) {
+ if (CPVT_WordInfo * pWord = pSection->m_WordArray.GetAt(w)) {
+ NewPlace.nWordIndex++;
+ pNewSection->AddWord(NewPlace, *pWord);
+ }
+ }
+ }
+ ClearSectionRightWords(wordplace);
+ }
+ return newplace;
+}
+CPVT_WordPlace CPDF_VariableText::InsertText(const CPVT_WordPlace & place, FX_LPCWSTR text, FX_INT32 charset,
+ const CPVT_SecProps * pSecProps, const CPVT_WordProps * pProps)
+{
+ CFX_WideString swText = text;
+ CPVT_WordPlace wp = place;
+ for (FX_INT32 i = 0, sz = swText.GetLength(); i < sz; i++) {
+ CPVT_WordPlace oldwp = wp;
+ FX_WORD word = swText.GetAt(i);
+ switch (word) {
+ case 0x0D:
+ if (m_bMultiLine) {
+ if (swText.GetAt(i + 1) == 0x0A) {
+ i += 1;
+ }
+ wp = InsertSection(wp, pSecProps, pProps);
+ }
+ break;
+ case 0x0A:
+ if (m_bMultiLine) {
+ if (swText.GetAt(i + 1) == 0x0D) {
+ i += 1;
+ }
+ wp = InsertSection(wp, pSecProps, pProps);
+ }
+ break;
+ case 0x09:
+ word = 0x20;
+ default:
+ wp = InsertWord(wp, word, charset, pProps);
+ break;
+ }
+ if (wp == oldwp) {
+ break;
+ }
+ }
+ return wp;
+}
+CPVT_WordPlace CPDF_VariableText::DeleteWords(const CPVT_WordRange & PlaceRange)
+{
+ FX_BOOL bLastSecPos = FALSE;
+ if (CSection * pSection = m_SectionArray.GetAt(PlaceRange.EndPos.nSecIndex)) {
+ bLastSecPos = (PlaceRange.EndPos == pSection->GetEndWordPlace());
+ }
+ ClearWords(PlaceRange);
+ if (PlaceRange.BeginPos.nSecIndex != PlaceRange.EndPos.nSecIndex) {
+ ClearEmptySections(PlaceRange);
+ if (!bLastSecPos) {
+ LinkLatterSection(PlaceRange.BeginPos);
+ }
+ }
+ return PlaceRange.BeginPos;
+}
+CPVT_WordPlace CPDF_VariableText::DeleteWord(const CPVT_WordPlace & place)
+{
+ return ClearRightWord(AjustLineHeader(place, TRUE));
+}
+CPVT_WordPlace CPDF_VariableText::BackSpaceWord(const CPVT_WordPlace & place)
+{
+ return ClearLeftWord(AjustLineHeader(place, TRUE));
+}
+void CPDF_VariableText::SetText(FX_LPCWSTR text, FX_INT32 charset, const CPVT_SecProps * pSecProps,
+ const CPVT_WordProps * pWordProps)
+{
+ DeleteWords(CPVT_WordRange(GetBeginWordPlace(), GetEndWordPlace()));
+ CFX_WideString swText = text;
+ CPVT_WordPlace wp(0, 0, -1);
+ CPVT_SectionInfo secinfo;
+ if (m_bRichText) {
+ if (pSecProps) {
+ secinfo.pSecProps = FX_NEW CPVT_SecProps(*pSecProps);
+ }
+ if (pWordProps) {
+ secinfo.pWordProps = FX_NEW CPVT_WordProps(*pWordProps);
+ }
+ }
+ if (CSection * pSection = m_SectionArray.GetAt(0)) {
+ pSection->m_SecInfo = secinfo;
+ }
+ FX_INT32 nCharCount = 0;
+ for (FX_INT32 i = 0, sz = swText.GetLength(); i < sz; i++) {
+ if (m_nLimitChar > 0 && nCharCount >= m_nLimitChar) {
+ break;
+ }
+ if (m_nCharArray > 0 && nCharCount >= m_nCharArray) {
+ break;
+ }
+ FX_WORD word = swText.GetAt(i);
+ switch (word) {
+ case 0x0D:
+ if (m_bMultiLine) {
+ if (swText.GetAt(i + 1) == 0x0A) {
+ i += 1;
+ }
+ wp.nSecIndex ++;
+ wp.nLineIndex = 0;
+ wp.nWordIndex = -1;
+ AddSection(wp, secinfo);
+ }
+ break;
+ case 0x0A:
+ if (m_bMultiLine) {
+ if (swText.GetAt(i + 1) == 0x0D) {
+ i += 1;
+ }
+ wp.nSecIndex ++;
+ wp.nLineIndex = 0;
+ wp.nWordIndex = -1;
+ AddSection(wp, secinfo);
+ }
+ break;
+ case 0x09:
+ word = 0x20;
+ default:
+ wp = InsertWord(wp, word, charset, pWordProps);
+ break;
+ }
+ nCharCount++;
+ }
+}
+void CPDF_VariableText::UpdateWordPlace(CPVT_WordPlace & place) const
+{
+ if (place.nSecIndex < 0) {
+ place = GetBeginWordPlace();
+ }
+ if (place.nSecIndex >= m_SectionArray.GetSize()) {
+ place = GetEndWordPlace();
+ }
+ place = AjustLineHeader(place, TRUE);
+ if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {
+ pSection->UpdateWordPlace(place);
+ }
+}
+FX_INT32 CPDF_VariableText::WordPlaceToWordIndex(const CPVT_WordPlace & place) const
+{
+ CPVT_WordPlace newplace = place;
+ UpdateWordPlace(newplace);
+ FX_INT32 nIndex = 0;
+ FX_INT32 i = 0;
+ FX_INT32 sz = 0;
+ for (i = 0, sz = m_SectionArray.GetSize(); i < sz && i < newplace.nSecIndex; i++) {
+ if (CSection * pSection = m_SectionArray.GetAt(i)) {
+ nIndex += pSection->m_WordArray.GetSize();
+ if (i != m_SectionArray.GetSize() - 1) {
+ nIndex += PVT_RETURN_LENGTH;
+ }
+ }
+ }
+ if (i >= 0 && i < m_SectionArray.GetSize()) {
+ nIndex += newplace.nWordIndex + PVT_RETURN_LENGTH;
+ }
+ return nIndex;
+}
+CPVT_WordPlace CPDF_VariableText::WordIndexToWordPlace(FX_INT32 index) const
+{
+ CPVT_WordPlace place = GetBeginWordPlace();
+ FX_INT32 nOldIndex = 0 , nIndex = 0;
+ FX_BOOL bFind = FALSE;
+ for (FX_INT32 i = 0, sz = m_SectionArray.GetSize(); i < sz; i++) {
+ if (CSection * pSection = m_SectionArray.GetAt(i)) {
+ nIndex += pSection->m_WordArray.GetSize();
+ if (nIndex == index) {
+ place = pSection->GetEndWordPlace();
+ bFind = TRUE;
+ break;
+ } else if (nIndex > index) {
+ place.nSecIndex = i;
+ place.nWordIndex = index - nOldIndex - 1;
+ pSection->UpdateWordPlace(place);
+ bFind = TRUE;
+ break;
+ }
+ if (i != m_SectionArray.GetSize() - 1) {
+ nIndex += PVT_RETURN_LENGTH;
+ }
+ nOldIndex = nIndex;
+ }
+ }
+ if (!bFind) {
+ place = GetEndWordPlace();
+ }
+ return place;
+}
+CPVT_WordPlace CPDF_VariableText::GetBeginWordPlace() const
+{
+ return m_bInitial ? CPVT_WordPlace(0, 0, -1) : CPVT_WordPlace();
+}
+CPVT_WordPlace CPDF_VariableText::GetEndWordPlace() const
+{
+ if (CSection * pSection = m_SectionArray.GetAt(m_SectionArray.GetSize() - 1)) {
+ return pSection->GetEndWordPlace();
+ }
+ return CPVT_WordPlace();
+}
+CPVT_WordPlace CPDF_VariableText::GetPrevWordPlace(const CPVT_WordPlace & place) const
+{
+ if( place.nSecIndex < 0) {
+ return GetBeginWordPlace();
+ }
+ if (place.nSecIndex >= m_SectionArray.GetSize()) {
+ return GetEndWordPlace();
+ }
+ if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {
+ if (place.WordCmp(pSection->GetBeginWordPlace()) <= 0) {
+ if (CSection * pPrevSection = m_SectionArray.GetAt(place.nSecIndex - 1)) {
+ return pPrevSection->GetEndWordPlace();
+ } else {
+ return GetBeginWordPlace();
+ }
+ } else {
+ return pSection->GetPrevWordPlace(place);
+ }
+ }
+ return place;
+}
+CPVT_WordPlace CPDF_VariableText::GetNextWordPlace(const CPVT_WordPlace & place) const
+{
+ if (place.nSecIndex < 0) {
+ return GetBeginWordPlace();
+ }
+ if (place.nSecIndex >= m_SectionArray.GetSize()) {
+ return GetEndWordPlace();
+ }
+ if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {
+ if (place.WordCmp(pSection->GetEndWordPlace()) >= 0) {
+ if (CSection * pNextSection = m_SectionArray.GetAt(place.nSecIndex + 1)) {
+ return pNextSection->GetBeginWordPlace();
+ } else {
+ return GetEndWordPlace();
+ }
+ } else {
+ return pSection->GetNextWordPlace(place);
+ }
+ }
+ return place;
+}
+CPVT_WordPlace CPDF_VariableText::SearchWordPlace(const CPDF_Point & point) const
+{
+ CPDF_Point pt = OutToIn(point);
+ CPVT_WordPlace place = GetBeginWordPlace();
+ FX_INT32 nLeft = 0;
+ FX_INT32 nRight = m_SectionArray.GetSize() - 1;
+ FX_INT32 nMid = m_SectionArray.GetSize() / 2;
+ FX_BOOL bUp = TRUE;
+ FX_BOOL bDown = TRUE;
+ while (nLeft <= nRight) {
+ if (CSection * pSection = m_SectionArray.GetAt(nMid)) {
+ if (IsFloatBigger(pt.y, pSection->m_SecInfo.rcSection.top)) {
+ bUp = FALSE;
+ }
+ if (IsFloatBigger(pSection->m_SecInfo.rcSection.bottom, pt.y)) {
+ bDown = FALSE;
+ }
+ if (IsFloatSmaller(pt.y, pSection->m_SecInfo.rcSection.top)) {
+ nRight = nMid - 1;
+ nMid = (nLeft + nRight) / 2;
+ continue;
+ } else if (IsFloatBigger(pt.y, pSection->m_SecInfo.rcSection.bottom)) {
+ nLeft = nMid + 1;
+ nMid = (nLeft + nRight) / 2;
+ continue;
+ } else {
+ place = pSection->SearchWordPlace(
+ CPDF_Point(pt.x - pSection->m_SecInfo.rcSection.left, pt.y - pSection->m_SecInfo.rcSection.top)
+ );
+ place.nSecIndex = nMid;
+ return place;
+ }
+ } else {
+ break;
+ }
+ }
+ if (bUp) {
+ place = GetBeginWordPlace();
+ }
+ if (bDown) {
+ place = GetEndWordPlace();
+ }
+ return place;
+}
+CPVT_WordPlace CPDF_VariableText::GetUpWordPlace(const CPVT_WordPlace & place, const CPDF_Point & point) const
+{
+ if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {
+ CPVT_WordPlace temp = place;
+ CPDF_Point pt = OutToIn(point);
+ if (temp.nLineIndex-- > 0) {
+ return pSection->SearchWordPlace(pt.x - pSection->m_SecInfo.rcSection.left, temp);
+ } else {
+ if (temp.nSecIndex-- > 0) {
+ if (CSection * pLastSection = m_SectionArray.GetAt(temp.nSecIndex)) {
+ temp.nLineIndex = pLastSection->m_LineArray.GetSize() - 1;
+ return pLastSection->SearchWordPlace(pt.x - pLastSection->m_SecInfo.rcSection.left, temp);
+ }
+ }
+ }
+ }
+ return place;
+}
+CPVT_WordPlace CPDF_VariableText::GetDownWordPlace(const CPVT_WordPlace & place, const CPDF_Point & point) const
+{
+ if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {
+ CPVT_WordPlace temp = place;
+ CPDF_Point pt = OutToIn(point);
+ if (temp.nLineIndex++ < pSection->m_LineArray.GetSize() - 1) {
+ return pSection->SearchWordPlace(pt.x - pSection->m_SecInfo.rcSection.left, temp);
+ } else {
+ if (temp.nSecIndex++ < m_SectionArray.GetSize() - 1) {
+ if (CSection * pNextSection = m_SectionArray.GetAt(temp.nSecIndex)) {
+ temp.nLineIndex = 0;
+ return pNextSection->SearchWordPlace(pt.x - pSection->m_SecInfo.rcSection.left, temp);
+ }
+ }
+ }
+ }
+ return place;
+}
+CPVT_WordPlace CPDF_VariableText::GetLineBeginPlace(const CPVT_WordPlace & place) const
+{
+ return CPVT_WordPlace(place.nSecIndex, place.nLineIndex, -1);
+}
+CPVT_WordPlace CPDF_VariableText::GetLineEndPlace(const CPVT_WordPlace & place) const
+{
+ if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex))
+ if (CLine * pLine = pSection->m_LineArray.GetAt(place.nLineIndex)) {
+ return pLine->GetEndWordPlace();
+ }
+ return place;
+}
+CPVT_WordPlace CPDF_VariableText::GetSectionBeginPlace(const CPVT_WordPlace & place) const
+{
+ return CPVT_WordPlace(place.nSecIndex, 0, -1);
+}
+CPVT_WordPlace CPDF_VariableText::GetSectionEndPlace(const CPVT_WordPlace & place) const
+{
+ if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {
+ return pSection->GetEndWordPlace();
+ }
+ return place;
+}
+FX_INT32 CPDF_VariableText::GetTotalWords() const
+{
+ FX_INT32 nTotal = 0;
+ for (FX_INT32 i = 0, sz = m_SectionArray.GetSize(); i < sz; i++)
+ if (CSection * pSection = m_SectionArray.GetAt(i)) {
+ nTotal += (pSection->m_WordArray.GetSize() + PVT_RETURN_LENGTH);
+ }
+ return nTotal - PVT_RETURN_LENGTH;
+}
+void CPDF_VariableText::ResetSectionArray()
+{
+ for (FX_INT32 s = 0, sz = m_SectionArray.GetSize(); s < sz; s++) {
+ delete m_SectionArray.GetAt(s);
+ }
+ m_SectionArray.RemoveAll();
+}
+CPVT_WordPlace CPDF_VariableText::AddSection(const CPVT_WordPlace & place, const CPVT_SectionInfo & secinfo)
+{
+ if (IsValid() && !m_bMultiLine) {
+ return place;
+ }
+ FX_INT32 nSecIndex = FPDF_MAX(FPDF_MIN(place.nSecIndex, m_SectionArray.GetSize()), 0);
+ CSection * pSection = FX_NEW CSection(this);
+ if (!pSection) {
+ return place;
+ }
+ pSection->m_SecInfo = secinfo;
+ pSection->SecPlace.nSecIndex = nSecIndex;
+ if (nSecIndex == m_SectionArray.GetSize()) {
+ m_SectionArray.Add(pSection);
+ } else {
+ m_SectionArray.InsertAt(nSecIndex, pSection);
+ }
+ return place;
+}
+CPVT_WordPlace CPDF_VariableText::AddLine(const CPVT_WordPlace & place, const CPVT_LineInfo & lineinfo)
+{
+ if (m_SectionArray.IsEmpty()) {
+ return place;
+ }
+ if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {
+ return pSection->AddLine(lineinfo);
+ }
+ return place;
+}
+CPVT_WordPlace CPDF_VariableText::AddWord(const CPVT_WordPlace & place, const CPVT_WordInfo & wordinfo)
+{
+ if (m_SectionArray.GetSize() <= 0) {
+ return place;
+ }
+ CPVT_WordPlace newplace = place;
+ newplace.nSecIndex = FPDF_MAX(FPDF_MIN(newplace.nSecIndex, m_SectionArray.GetSize() - 1), 0);
+ if (CSection * pSection = m_SectionArray.GetAt(newplace.nSecIndex)) {
+ return pSection->AddWord(newplace, wordinfo);
+ }
+ return place;
+}
+FX_BOOL CPDF_VariableText::GetWordInfo(const CPVT_WordPlace & place, CPVT_WordInfo & wordinfo)
+{
+ if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {
+ if (CPVT_WordInfo * pWord = pSection->m_WordArray.GetAt(place.nWordIndex)) {
+ wordinfo = *pWord;
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+FX_BOOL CPDF_VariableText::SetWordInfo(const CPVT_WordPlace & place, const CPVT_WordInfo & wordinfo)
+{
+ if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {
+ if (CPVT_WordInfo * pWord = pSection->m_WordArray.GetAt(place.nWordIndex)) {
+ *pWord = wordinfo;
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+FX_BOOL CPDF_VariableText::GetLineInfo(const CPVT_WordPlace & place, CPVT_LineInfo & lineinfo)
+{
+ if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {
+ if (CLine * pLine = pSection->m_LineArray.GetAt(place.nLineIndex)) {
+ lineinfo = pLine->m_LineInfo;
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+FX_BOOL CPDF_VariableText::GetSectionInfo(const CPVT_WordPlace & place, CPVT_SectionInfo & secinfo)
+{
+ if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {
+ secinfo = pSection->m_SecInfo;
+ return TRUE;
+ }
+ return FALSE;
+}
+CPDF_Rect CPDF_VariableText::GetContentRect() const
+{
+ return InToOut(CPDF_EditContainer::GetContentRect());
+}
+FX_FLOAT CPDF_VariableText::GetWordFontSize(const CPVT_WordInfo & WordInfo, FX_BOOL bFactFontSize)
+{
+ return m_bRichText && WordInfo.pWordProps ? (WordInfo.pWordProps->nScriptType == PVTWORD_SCRIPT_NORMAL || bFactFontSize ? WordInfo.pWordProps->fFontSize : WordInfo.pWordProps->fFontSize * PVT_HALF) : GetFontSize();
+}
+FX_INT32 CPDF_VariableText::GetWordFontIndex(const CPVT_WordInfo & WordInfo)
+{
+ return m_bRichText && WordInfo.pWordProps ? WordInfo.pWordProps->nFontIndex : WordInfo.nFontIndex;
+}
+FX_FLOAT CPDF_VariableText::GetWordWidth(FX_INT32 nFontIndex, FX_WORD Word, FX_WORD SubWord,
+ FX_FLOAT fCharSpace, FX_INT32 nHorzScale,
+ FX_FLOAT fFontSize, FX_FLOAT fWordTail, FX_INT32 nWordStyle)
+{
+ return (GetCharWidth(nFontIndex, Word, SubWord, nWordStyle) * fFontSize * PVT_FONTSCALE + fCharSpace) * nHorzScale * PVT_PERCENT + fWordTail;
+}
+FX_FLOAT CPDF_VariableText::GetWordWidth(const CPVT_WordInfo & WordInfo)
+{
+ return GetWordWidth(GetWordFontIndex(WordInfo), WordInfo.Word, GetSubWord(), GetCharSpace(WordInfo), GetHorzScale(WordInfo),
+ GetWordFontSize(WordInfo), WordInfo.fWordTail,
+ WordInfo.pWordProps ? WordInfo.pWordProps->nWordStyle : 0);
+}
+FX_FLOAT CPDF_VariableText::GetLineAscent(const CPVT_SectionInfo & SecInfo)
+{
+ return m_bRichText && SecInfo.pWordProps ? GetFontAscent(SecInfo.pWordProps->nFontIndex, SecInfo.pWordProps->fFontSize) :
+ GetFontAscent(GetDefaultFontIndex(), GetFontSize());
+}
+FX_FLOAT CPDF_VariableText::GetLineDescent(const CPVT_SectionInfo & SecInfo)
+{
+ return m_bRichText && SecInfo.pWordProps ? GetFontDescent(SecInfo.pWordProps->nFontIndex, SecInfo.pWordProps->fFontSize) :
+ GetFontDescent(GetDefaultFontIndex(), GetFontSize());
+}
+FX_FLOAT CPDF_VariableText::GetFontAscent(FX_INT32 nFontIndex, FX_FLOAT fFontSize)
+{
+ return (FX_FLOAT)GetTypeAscent(nFontIndex) * fFontSize * PVT_FONTSCALE;
+}
+FX_FLOAT CPDF_VariableText::GetFontDescent(FX_INT32 nFontIndex, FX_FLOAT fFontSize)
+{
+ return (FX_FLOAT)GetTypeDescent(nFontIndex) * fFontSize * PVT_FONTSCALE;
+}
+FX_FLOAT CPDF_VariableText::GetWordAscent(const CPVT_WordInfo & WordInfo, FX_FLOAT fFontSize)
+{
+ return GetFontAscent(GetWordFontIndex(WordInfo), fFontSize);
+}
+FX_FLOAT CPDF_VariableText::GetWordDescent(const CPVT_WordInfo & WordInfo, FX_FLOAT fFontSize)
+{
+ return GetFontDescent(GetWordFontIndex(WordInfo), fFontSize);
+}
+FX_FLOAT CPDF_VariableText::GetWordAscent(const CPVT_WordInfo & WordInfo, FX_BOOL bFactFontSize)
+{
+ return GetFontAscent(GetWordFontIndex(WordInfo), GetWordFontSize(WordInfo, bFactFontSize));
+}
+FX_FLOAT CPDF_VariableText::GetWordDescent(const CPVT_WordInfo & WordInfo, FX_BOOL bFactFontSize)
+{
+ return GetFontDescent(GetWordFontIndex(WordInfo), GetWordFontSize(WordInfo, bFactFontSize));
+}
+FX_FLOAT CPDF_VariableText::GetLineLeading(const CPVT_SectionInfo & SecInfo)
+{
+ return m_bRichText && SecInfo.pSecProps ? SecInfo.pSecProps->fLineLeading : m_fLineLeading;
+}
+FX_FLOAT CPDF_VariableText::GetLineIndent(const CPVT_SectionInfo & SecInfo)
+{
+ return m_bRichText && SecInfo.pSecProps ? SecInfo.pSecProps->fLineIndent : 0.0f;
+}
+FX_INT32 CPDF_VariableText::GetAlignment(const CPVT_SectionInfo& SecInfo)
+{
+ return m_bRichText && SecInfo.pSecProps ? SecInfo.pSecProps->nAlignment : this->m_nAlignment;
+}
+FX_FLOAT CPDF_VariableText::GetCharSpace(const CPVT_WordInfo & WordInfo)
+{
+ return m_bRichText && WordInfo.pWordProps ? WordInfo.pWordProps->fCharSpace : m_fCharSpace;
+}
+FX_INT32 CPDF_VariableText::GetHorzScale(const CPVT_WordInfo & WordInfo)
+{
+ return m_bRichText && WordInfo.pWordProps ? WordInfo.pWordProps->nHorzScale : m_nHorzScale;
+}
+void CPDF_VariableText::ClearSectionRightWords(const CPVT_WordPlace & place)
+{
+ CPVT_WordPlace wordplace = AjustLineHeader(place, TRUE);
+ if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {
+ for (FX_INT32 w = pSection->m_WordArray.GetSize() - 1; w > wordplace.nWordIndex; w--) {
+ delete pSection->m_WordArray.GetAt(w);
+ pSection->m_WordArray.RemoveAt(w);
+ }
+ }
+}
+CPVT_WordPlace CPDF_VariableText::AjustLineHeader(const CPVT_WordPlace & place, FX_BOOL bPrevOrNext) const
+{
+ if (place.nWordIndex < 0 && place.nLineIndex > 0) {
+ if (bPrevOrNext) {
+ return GetPrevWordPlace(place);
+ } else {
+ return GetNextWordPlace(place);
+ }
+ }
+ return place;
+}
+FX_BOOL CPDF_VariableText::ClearEmptySection(const CPVT_WordPlace & place)
+{
+ if (place.nSecIndex == 0 && m_SectionArray.GetSize() == 1) {
+ return FALSE;
+ }
+ if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {
+ if (pSection->m_WordArray.GetSize() == 0) {
+ delete pSection;
+ m_SectionArray.RemoveAt(place.nSecIndex);
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+void CPDF_VariableText::ClearEmptySections(const CPVT_WordRange & PlaceRange)
+{
+ CPVT_WordPlace wordplace;
+ for (FX_INT32 s = PlaceRange.EndPos.nSecIndex; s > PlaceRange.BeginPos.nSecIndex; s--) {
+ wordplace.nSecIndex = s;
+ ClearEmptySection(wordplace);
+ }
+}
+void CPDF_VariableText::LinkLatterSection(const CPVT_WordPlace & place)
+{
+ CPVT_WordPlace oldplace = AjustLineHeader(place, TRUE);
+ if (CSection * pNextSection = m_SectionArray.GetAt(place.nSecIndex + 1)) {
+ if (CSection * pSection = m_SectionArray.GetAt(oldplace.nSecIndex)) {
+ for (FX_INT32 w = 0, sz = pNextSection->m_WordArray.GetSize(); w < sz; w++) {
+ if (CPVT_WordInfo * pWord = pNextSection->m_WordArray.GetAt(w)) {
+ oldplace.nWordIndex ++;
+ pSection->AddWord(oldplace, *pWord);
+ }
+ }
+ }
+ delete pNextSection;
+ m_SectionArray.RemoveAt(place.nSecIndex + 1);
+ }
+}
+void CPDF_VariableText::ClearWords(const CPVT_WordRange & PlaceRange)
+{
+ CPVT_WordRange NewRange;
+ NewRange.BeginPos = AjustLineHeader(PlaceRange.BeginPos, TRUE);
+ NewRange.EndPos = AjustLineHeader(PlaceRange.EndPos, TRUE);
+ for (FX_INT32 s = NewRange.EndPos.nSecIndex; s >= NewRange.BeginPos.nSecIndex; s--) {
+ if (CSection * pSection = m_SectionArray.GetAt(s)) {
+ pSection->ClearWords(NewRange);
+ }
+ }
+}
+CPVT_WordPlace CPDF_VariableText::ClearLeftWord(const CPVT_WordPlace & place)
+{
+ if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {
+ CPVT_WordPlace leftplace = this->GetPrevWordPlace(place);
+ if (leftplace != place) {
+ if (leftplace.nSecIndex != place.nSecIndex) {
+ if (pSection->m_WordArray.GetSize() == 0) {
+ this->ClearEmptySection(place);
+ } else {
+ this->LinkLatterSection(leftplace);
+ }
+ } else {
+ pSection->ClearWord(place);
+ }
+ }
+ return leftplace;
+ }
+ return place;
+}
+CPVT_WordPlace CPDF_VariableText::ClearRightWord(const CPVT_WordPlace & place)
+{
+ if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {
+ CPVT_WordPlace rightplace = AjustLineHeader(this->GetNextWordPlace(place), FALSE);
+ if (rightplace != place) {
+ if(rightplace.nSecIndex != place.nSecIndex) {
+ LinkLatterSection(place);
+ } else {
+ pSection->ClearWord(rightplace);
+ }
+ }
+ }
+ return place;
+}
+void CPDF_VariableText::RearrangeAll()
+{
+ Rearrange(CPVT_WordRange(GetBeginWordPlace(), GetEndWordPlace()));
+}
+void CPDF_VariableText::RearrangePart(const CPVT_WordRange & PlaceRange)
+{
+ Rearrange(PlaceRange);
+}
+CPVT_FloatRect CPDF_VariableText::Rearrange(const CPVT_WordRange & PlaceRange)
+{
+ CPVT_FloatRect rcRet;
+ if (IsValid()) {
+ if (m_bAutoFontSize) {
+ SetFontSize(GetAutoFontSize());
+ rcRet = RearrangeSections(CPVT_WordRange(GetBeginWordPlace(), GetEndWordPlace()));
+ } else {
+ rcRet = RearrangeSections(PlaceRange);
+ }
+ }
+ SetContentRect(rcRet);
+ return rcRet;
+}
+FX_FLOAT CPDF_VariableText::GetAutoFontSize()
+{
+ FX_INT32 nTotal = sizeof(gFontSizeSteps) / sizeof(FX_BYTE);
+ if (IsMultiLine()) {
+ nTotal /= 4;
+ }
+ if (nTotal <= 0) {
+ return 0;
+ }
+ if (GetPlateWidth() <= 0) {
+ return 0;
+ }
+ FX_INT32 nLeft = 0;
+ FX_INT32 nRight = nTotal - 1;
+ FX_INT32 nMid = nTotal / 2;
+ while (nLeft <= nRight) {
+ if (IsBigger(gFontSizeSteps[nMid])) {
+ nRight = nMid - 1;
+ nMid = (nLeft + nRight) / 2;
+ continue;
+ } else {
+ nLeft = nMid + 1;
+ nMid = (nLeft + nRight) / 2;
+ continue;
+ }
+ }
+ return (FX_FLOAT)gFontSizeSteps[nMid];
+}
+FX_BOOL CPDF_VariableText::IsBigger(FX_FLOAT fFontSize)
+{
+ FX_BOOL bBigger = FALSE;
+ CPVT_Size szTotal;
+ for (FX_INT32 s = 0, sz = m_SectionArray.GetSize(); s < sz; s++) {
+ if (CSection * pSection = m_SectionArray.GetAt(s)) {
+ CPVT_Size size = pSection->GetSectionSize(fFontSize);
+ szTotal.x = FPDF_MAX(size.x, szTotal.x);
+ szTotal.y += size.y;
+ if (IsFloatBigger(szTotal.x, GetPlateWidth())
+ || IsFloatBigger(szTotal.y, GetPlateHeight())
+ ) {
+ bBigger = TRUE;
+ break;
+ }
+ }
+ }
+ return bBigger;
+}
+CPVT_FloatRect CPDF_VariableText::RearrangeSections(const CPVT_WordRange & PlaceRange)
+{
+ CPVT_WordPlace place;
+ FX_FLOAT fPosY = 0;
+ FX_FLOAT fOldHeight;
+ FX_INT32 nSSecIndex = PlaceRange.BeginPos.nSecIndex;
+ FX_INT32 nESecIndex = PlaceRange.EndPos.nSecIndex;
+ CPVT_FloatRect rcRet;
+ for (FX_INT32 s = 0, sz = m_SectionArray.GetSize(); s < sz; s++) {
+ place.nSecIndex = s;
+ if (CSection * pSection = m_SectionArray.GetAt(s)) {
+ pSection->SecPlace = place;
+ CPVT_FloatRect rcSec = pSection->m_SecInfo.rcSection;
+ if (s >= nSSecIndex) {
+ if (s <= nESecIndex) {
+ rcSec = pSection->Rearrange();
+ rcSec.top += fPosY;
+ rcSec.bottom += fPosY;
+ } else {
+ fOldHeight = pSection->m_SecInfo.rcSection.bottom - pSection->m_SecInfo.rcSection.top;
+ rcSec.top = fPosY;
+ rcSec.bottom = fPosY + fOldHeight;
+ }
+ pSection->m_SecInfo.rcSection = rcSec;
+ pSection->ResetLinePlace();
+ }
+ if (s == 0) {
+ rcRet = rcSec;
+ } else {
+ rcRet.left = FPDF_MIN(rcSec.left, rcRet.left);
+ rcRet.top = FPDF_MIN(rcSec.top, rcRet.top);
+ rcRet.right = FPDF_MAX(rcSec.right, rcRet.right);
+ rcRet.bottom = FPDF_MAX(rcSec.bottom, rcRet.bottom);
+ }
+ fPosY += rcSec.Height();
+ }
+ }
+ return rcRet;
+}
+FX_INT32 CPDF_VariableText::GetCharWidth(FX_INT32 nFontIndex, FX_WORD Word, FX_WORD SubWord, FX_INT32 nWordStyle)
+{
+ if (m_pVTProvider) {
+ if (SubWord > 0) {
+ return m_pVTProvider->GetCharWidth(nFontIndex, SubWord, nWordStyle);
+ } else {
+ return m_pVTProvider->GetCharWidth(nFontIndex, Word, nWordStyle);
+ }
+ }
+ return 0;
+}
+FX_INT32 CPDF_VariableText::GetTypeAscent(FX_INT32 nFontIndex)
+{
+ return m_pVTProvider ? m_pVTProvider->GetTypeAscent(nFontIndex) : 0;
+}
+FX_INT32 CPDF_VariableText::GetTypeDescent(FX_INT32 nFontIndex)
+{
+ return m_pVTProvider ? m_pVTProvider->GetTypeDescent(nFontIndex) : 0;
+}
+FX_INT32 CPDF_VariableText::GetWordFontIndex(FX_WORD word, FX_INT32 charset, FX_INT32 nFontIndex)
+{
+ return m_pVTProvider ? m_pVTProvider->GetWordFontIndex(word, charset, nFontIndex) : -1;
+}
+FX_INT32 CPDF_VariableText::GetDefaultFontIndex()
+{
+ return m_pVTProvider ? m_pVTProvider->GetDefaultFontIndex() : -1;
+}
+FX_BOOL CPDF_VariableText::IsLatinWord(FX_WORD word)
+{
+ return m_pVTProvider ? m_pVTProvider->IsLatinWord(word) : FALSE;
+}
+IPDF_VariableText_Iterator * CPDF_VariableText::GetIterator()
+{
+ if (!m_pVTIterator) {
+ return m_pVTIterator = FX_NEW CPDF_VariableText_Iterator(this);
+ }
+ return m_pVTIterator;
+}
+IPDF_VariableText_Provider* CPDF_VariableText::SetProvider(IPDF_VariableText_Provider * pProvider)
+{
+ IPDF_VariableText_Provider* pOld = m_pVTProvider;
+ m_pVTProvider = pProvider;
+ return pOld;
+}
+CPDF_VariableText_Iterator::CPDF_VariableText_Iterator(CPDF_VariableText * pVT):
+ m_pVT(pVT),
+ m_CurPos(-1, -1, -1)
+{
+}
+CPDF_VariableText_Iterator::~CPDF_VariableText_Iterator()
+{
+}
+void CPDF_VariableText_Iterator::SetAt(FX_INT32 nWordIndex)
+{
+ ASSERT(m_pVT != NULL);
+ m_CurPos = m_pVT->WordIndexToWordPlace(nWordIndex);
+}
+void CPDF_VariableText_Iterator::SetAt(const CPVT_WordPlace & place)
+{
+ ASSERT(m_pVT != NULL);
+ m_CurPos = place;
+}
+FX_BOOL CPDF_VariableText_Iterator::NextWord()
+{
+ ASSERT(m_pVT != NULL);
+ if (m_CurPos == m_pVT->GetEndWordPlace()) {
+ return FALSE;
+ }
+ m_CurPos = m_pVT->GetNextWordPlace(m_CurPos);
+ return TRUE;
+}
+FX_BOOL CPDF_VariableText_Iterator::PrevWord()
+{
+ ASSERT(m_pVT != NULL);
+ if (m_CurPos == m_pVT->GetBeginWordPlace()) {
+ return FALSE;
+ }
+ m_CurPos = m_pVT->GetPrevWordPlace(m_CurPos);
+ return TRUE;
+}
+FX_BOOL CPDF_VariableText_Iterator::NextLine()
+{
+ ASSERT(m_pVT != NULL);
+ if (CSection * pSection = m_pVT->m_SectionArray.GetAt(m_CurPos.nSecIndex)) {
+ if (m_CurPos.nLineIndex < pSection->m_LineArray.GetSize() - 1) {
+ m_CurPos = CPVT_WordPlace(m_CurPos.nSecIndex, m_CurPos.nLineIndex + 1, -1);
+ return TRUE;
+ } else {
+ if (m_CurPos.nSecIndex < m_pVT->m_SectionArray.GetSize() - 1) {
+ m_CurPos = CPVT_WordPlace(m_CurPos.nSecIndex + 1, 0, -1);
+ return TRUE;
+ }
+ }
+ }
+ return FALSE;
+}
+FX_BOOL CPDF_VariableText_Iterator::PrevLine()
+{
+ ASSERT(m_pVT != NULL);
+ if (CSection * pSection = m_pVT->m_SectionArray.GetAt(m_CurPos.nSecIndex)) {
+ if (m_CurPos.nLineIndex > 0) {
+ m_CurPos = CPVT_WordPlace(m_CurPos.nSecIndex, m_CurPos.nLineIndex - 1, -1);
+ return TRUE;
+ } else {
+ if (m_CurPos.nSecIndex > 0) {
+ if (CSection * pLastSection = m_pVT->m_SectionArray.GetAt(m_CurPos.nSecIndex - 1)) {
+ m_CurPos = CPVT_WordPlace(m_CurPos.nSecIndex - 1, pLastSection->m_LineArray.GetSize() - 1, -1);
+ return TRUE;
+ }
+ }
+ }
+ }
+ return FALSE;
+}
+FX_BOOL CPDF_VariableText_Iterator::NextSection()
+{
+ ASSERT(m_pVT != NULL);
+ if (m_CurPos.nSecIndex < m_pVT->m_SectionArray.GetSize() - 1) {
+ m_CurPos = CPVT_WordPlace(m_CurPos.nSecIndex + 1, 0, -1);
+ return TRUE;
+ }
+ return FALSE;
+}
+FX_BOOL CPDF_VariableText_Iterator::PrevSection()
+{
+ ASSERT(m_pVT != NULL);
+ if (m_CurPos.nSecIndex > 0) {
+ m_CurPos = CPVT_WordPlace(m_CurPos.nSecIndex - 1, 0, -1);
+ return TRUE;
+ }
+ return FALSE;
+}
+FX_BOOL CPDF_VariableText_Iterator::GetWord(CPVT_Word & word) const
+{
+ ASSERT(m_pVT != NULL);
+ word.WordPlace = m_CurPos;
+ if (CSection * pSection = m_pVT->m_SectionArray.GetAt(m_CurPos.nSecIndex)) {
+ if (CLine * pLine = pSection->m_LineArray.GetAt(m_CurPos.nLineIndex)) {
+ if (CPVT_WordInfo * pWord = pSection->m_WordArray.GetAt(m_CurPos.nWordIndex)) {
+ word.Word = pWord->Word;
+ word.nCharset = pWord->nCharset;
+ word.fWidth = m_pVT->GetWordWidth(*pWord);
+ word.ptWord = m_pVT->InToOut(
+ CPDF_Point(pWord->fWordX + pSection->m_SecInfo.rcSection.left,
+ pWord->fWordY + pSection->m_SecInfo.rcSection.top) );
+ word.fAscent = m_pVT->GetWordAscent(*pWord);
+ word.fDescent = m_pVT->GetWordDescent(*pWord);
+ if (pWord->pWordProps) {
+ word.WordProps = *pWord->pWordProps;
+ }
+ word.nFontIndex = m_pVT->GetWordFontIndex(*pWord);
+ word.fFontSize = m_pVT->GetWordFontSize(*pWord);
+ return TRUE;
+ }
+ }
+ }
+ return FALSE;
+}
+FX_BOOL CPDF_VariableText_Iterator::SetWord(const CPVT_Word & word)
+{
+ ASSERT(m_pVT != NULL);
+ if (CSection * pSection = m_pVT->m_SectionArray.GetAt(m_CurPos.nSecIndex)) {
+ if (CPVT_WordInfo * pWord = pSection->m_WordArray.GetAt(m_CurPos.nWordIndex)) {
+ if (pWord->pWordProps) {
+ *pWord->pWordProps = word.WordProps;
+ }
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+FX_BOOL CPDF_VariableText_Iterator::GetLine(CPVT_Line & line) const
+{
+ ASSERT(m_pVT != NULL);
+ line.lineplace = CPVT_WordPlace(m_CurPos.nSecIndex, m_CurPos.nLineIndex, -1);
+ if (CSection * pSection = m_pVT->m_SectionArray.GetAt(m_CurPos.nSecIndex)) {
+ if (CLine * pLine = pSection->m_LineArray.GetAt(m_CurPos.nLineIndex)) {
+ line.ptLine = m_pVT->InToOut(
+ CPDF_Point(pLine->m_LineInfo.fLineX + pSection->m_SecInfo.rcSection.left,
+ pLine->m_LineInfo.fLineY + pSection->m_SecInfo.rcSection.top) );
+ line.fLineWidth = pLine->m_LineInfo.fLineWidth;
+ line.fLineAscent = pLine->m_LineInfo.fLineAscent;
+ line.fLineDescent = pLine->m_LineInfo.fLineDescent;
+ line.lineEnd = pLine->GetEndWordPlace();
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+FX_BOOL CPDF_VariableText_Iterator::GetSection(CPVT_Section & section) const
+{
+ ASSERT(m_pVT != NULL);
+ section.secplace = CPVT_WordPlace(m_CurPos.nSecIndex, 0, -1);
+ if (CSection * pSection = m_pVT->m_SectionArray.GetAt(m_CurPos.nSecIndex)) {
+ section.rcSection = m_pVT->InToOut(pSection->m_SecInfo.rcSection);
+ if (pSection->m_SecInfo.pSecProps) {
+ section.SecProps = *pSection->m_SecInfo.pSecProps;
+ }
+ if (pSection->m_SecInfo.pWordProps) {
+ section.WordProps = *pSection->m_SecInfo.pWordProps;
+ }
+ return TRUE;
+ }
+ return FALSE;
+}
+FX_BOOL CPDF_VariableText_Iterator::SetSection(const CPVT_Section & section)
+{
+ ASSERT(m_pVT != NULL);
+ if (CSection * pSection = m_pVT->m_SectionArray.GetAt(m_CurPos.nSecIndex)) {
+ if (pSection->m_SecInfo.pSecProps) {
+ *pSection->m_SecInfo.pSecProps = section.SecProps;
+ }
+ if (pSection->m_SecInfo.pWordProps) {
+ *pSection->m_SecInfo.pWordProps = section.WordProps;
+ }
+ return TRUE;
+ }
+ return FALSE;
+}
diff --git a/core/src/fpdfdoc/doc_vtmodule.cpp b/core/src/fpdfdoc/doc_vtmodule.cpp
index 8bc4e7b771..c44cbacf3c 100644
--- a/core/src/fpdfdoc/doc_vtmodule.cpp
+++ b/core/src/fpdfdoc/doc_vtmodule.cpp
@@ -1,17 +1,17 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../include/fpdfdoc/fpdf_doc.h"
-#include "../../include/fpdfdoc/fpdf_vt.h"
-#include "pdf_vt.h"
-IPDF_VariableText* IPDF_VariableText::NewVariableText()
-{
- return FX_NEW CPDF_VariableText();
-}
-void IPDF_VariableText::DelVariableText(IPDF_VariableText* pVT)
-{
- delete (CPDF_VariableText*)pVT;
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fpdfdoc/fpdf_doc.h"
+#include "../../include/fpdfdoc/fpdf_vt.h"
+#include "pdf_vt.h"
+IPDF_VariableText* IPDF_VariableText::NewVariableText()
+{
+ return FX_NEW CPDF_VariableText();
+}
+void IPDF_VariableText::DelVariableText(IPDF_VariableText* pVT)
+{
+ delete (CPDF_VariableText*)pVT;
+}
diff --git a/core/src/fpdfdoc/pdf_vt.h b/core/src/fpdfdoc/pdf_vt.h
index fc1af0415f..6b2d5e5eef 100644
--- a/core/src/fpdfdoc/pdf_vt.h
+++ b/core/src/fpdfdoc/pdf_vt.h
@@ -1,642 +1,642 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#define _PDF_VT_H_
-class CPVT_Size;
-class CPVT_FloatRect;
-struct CPVT_SectionInfo;
-struct CPVT_LineInfo;
-struct CPVT_WordInfo;
-class CLine;
-class CLines;
-class CSection;
-class CTypeset;
-class CPDF_EditContainer;
-class CPDF_VariableText;
-class CPDF_VariableText_Iterator;
-#define IsFloatZero(f) ((f) < 0.0001 && (f) > -0.0001)
-#define IsFloatBigger(fa,fb) ((fa) > (fb) && !IsFloatZero((fa) - (fb)))
-#define IsFloatSmaller(fa,fb) ((fa) < (fb) && !IsFloatZero((fa) - (fb)))
-template<class T> T FPDF_MIN (const T & i, const T & j)
-{
- return ((i < j) ? i : j);
-}
-template<class T> T FPDF_MAX (const T & i, const T & j)
-{
- return ((i > j) ? i : j);
-}
-class CPVT_Size
-{
-public:
- CPVT_Size() : x(0.0f), y(0.0f)
- {
- }
- CPVT_Size(FX_FLOAT x, FX_FLOAT y)
- {
- this->x = x;
- this->y = y;
- }
- FX_FLOAT x, y;
-};
-class CPVT_FloatRect : public CFX_FloatRect
-{
-public:
- CPVT_FloatRect()
- {
- left = top = right = bottom = 0.0f;
- }
- CPVT_FloatRect(FX_FLOAT left, FX_FLOAT top,
- FX_FLOAT right, FX_FLOAT bottom)
- {
- this->left = left;
- this->top = top;
- this->right = right;
- this->bottom = bottom;
- }
- CPVT_FloatRect(const CPDF_Rect & rect)
- {
- this->left = rect.left;
- this->top = rect.top;
- this->right = rect.right;
- this->bottom = rect.bottom;
- }
- void Default()
- {
- left = top = right = bottom = 0.0f;
- }
- FX_FLOAT Height() const
- {
- if(this->top > this->bottom) {
- return this->top - this->bottom;
- } else {
- return this->bottom - this->top;
- }
- }
-};
-struct CPVT_SectionInfo {
- CPVT_SectionInfo() : rcSection(), nTotalLine(0), pSecProps(NULL), pWordProps(NULL)
- {
- }
- virtual ~CPVT_SectionInfo()
- {
- if (pSecProps) {
- delete pSecProps;
- }
- if (pWordProps) {
- delete pWordProps;
- }
- }
- CPVT_SectionInfo(const CPVT_SectionInfo & other): rcSection(), nTotalLine(0), pSecProps(NULL), pWordProps(NULL)
- {
- operator = (other);
- }
- void operator = (const CPVT_SectionInfo & other)
- {
- if (this == &other) {
- return;
- }
- this->rcSection = other.rcSection;
- this->nTotalLine = other.nTotalLine;
- if (other.pSecProps) {
- if (pSecProps) {
- *pSecProps = *other.pSecProps;
- } else {
- pSecProps = FX_NEW CPVT_SecProps(*other.pSecProps);
- }
- }
- if (other.pWordProps) {
- if (pWordProps) {
- *pWordProps = *other.pWordProps;
- } else {
- pWordProps = FX_NEW CPVT_WordProps(*other.pWordProps);
- }
- }
- }
- CPVT_FloatRect rcSection;
- FX_INT32 nTotalLine;
- CPVT_SecProps* pSecProps;
- CPVT_WordProps* pWordProps;
-};
-struct CPVT_LineInfo {
- CPVT_LineInfo() : nTotalWord(0), nBeginWordIndex(-1), nEndWordIndex(-1),
- fLineX(0.0f), fLineY(0.0f), fLineWidth(0.0f), fLineAscent(0.0f), fLineDescent(0.0f)
- {
- }
- FX_INT32 nTotalWord;
- FX_INT32 nBeginWordIndex;
- FX_INT32 nEndWordIndex;
- FX_FLOAT fLineX;
- FX_FLOAT fLineY;
- FX_FLOAT fLineWidth;
- FX_FLOAT fLineAscent;
- FX_FLOAT fLineDescent;
-};
-struct CPVT_WordInfo : public CFX_Object {
- CPVT_WordInfo() : Word(0), nCharset(0),
- fWordX(0.0f), fWordY(0.0f), fWordTail(0.0f), nFontIndex(-1), pWordProps(NULL)
- {
- }
- CPVT_WordInfo(FX_WORD word, FX_INT32 charset, FX_INT32 fontIndex, CPVT_WordProps * pProps):
- Word(word), nCharset(charset), fWordX(0.0f), fWordY(0.0f), fWordTail(0.0f),
- nFontIndex(fontIndex), pWordProps(pProps)
- {
- }
- virtual ~CPVT_WordInfo()
- {
- if (pWordProps) {
- delete pWordProps;
- }
- }
- CPVT_WordInfo(const CPVT_WordInfo & word): Word(0), nCharset(0),
- fWordX(0.0f), fWordY(0.0f), fWordTail(0.0f), nFontIndex(-1), pWordProps(NULL)
- {
- operator = (word);
- }
- void operator = (const CPVT_WordInfo & word)
- {
- if (this == &word) {
- return;
- }
- this->Word = word.Word;
- this->nCharset = word.nCharset;
- this->nFontIndex = word.nFontIndex;
- if (word.pWordProps) {
- if (pWordProps) {
- *pWordProps = *word.pWordProps;
- } else {
- pWordProps = FX_NEW CPVT_WordProps(*word.pWordProps);
- }
- }
- }
- FX_WORD Word;
- FX_INT32 nCharset;
- FX_FLOAT fWordX;
- FX_FLOAT fWordY;
- FX_FLOAT fWordTail;
- FX_INT32 nFontIndex;
- CPVT_WordProps* pWordProps;
-};
-struct CPVT_FloatRange {
- CPVT_FloatRange() : fMin(0.0f), fMax(0.0f)
- {
- }
- CPVT_FloatRange(FX_FLOAT min, FX_FLOAT max) : fMin(min), fMax(max)
- {
- }
- FX_FLOAT Range() const
- {
- return fMax - fMin;
- }
- FX_FLOAT fMin, fMax;
-};
-template<class TYPE> class CPVT_ArrayTemplate : public CFX_ArrayTemplate<TYPE>
-{
-public:
- FX_BOOL IsEmpty()
- {
- return CFX_ArrayTemplate<TYPE>::GetSize() <= 0;
- }
- TYPE GetAt(int nIndex) const
- {
- if (nIndex >= 0 && nIndex < CFX_ArrayTemplate<TYPE>::GetSize()) {
- return CFX_ArrayTemplate<TYPE>::GetAt(nIndex);
- }
- return NULL;
- }
- void RemoveAt(int nIndex)
- {
- if (nIndex >= 0 && nIndex < CFX_ArrayTemplate<TYPE>::GetSize()) {
- CFX_ArrayTemplate<TYPE>::RemoveAt(nIndex);
- }
- }
-};
-class CLine : public CFX_Object
-{
-public:
- CLine();
- virtual ~CLine();
- CPVT_WordPlace GetBeginWordPlace() const;
- CPVT_WordPlace GetEndWordPlace() const;
- CPVT_WordPlace GetPrevWordPlace(const CPVT_WordPlace & place) const;
- CPVT_WordPlace GetNextWordPlace(const CPVT_WordPlace & place) const;
- CPVT_WordPlace LinePlace;
- CPVT_LineInfo m_LineInfo;
-};
-class CLines
-{
-public:
- CLines() : m_nTotal(0) {}
- virtual ~CLines()
- {
- RemoveAll();
- }
- FX_INT32 GetSize() const
- {
- return m_Lines.GetSize();
- }
- CLine * GetAt(FX_INT32 nIndex) const
- {
- return m_Lines.GetAt(nIndex);
- }
- void Empty()
- {
- m_nTotal = 0;
- }
- void RemoveAll()
- {
- for (FX_INT32 i = 0, sz = GetSize(); i < sz; i++) {
- delete GetAt(i);
- }
- m_Lines.RemoveAll();
- m_nTotal = 0;
- }
- FX_INT32 Add(const CPVT_LineInfo & lineinfo)
- {
- if (m_nTotal >= GetSize()) {
- if (CLine * pLine = FX_NEW CLine) {
- pLine->m_LineInfo = lineinfo;
- m_Lines.Add(pLine);
- return m_nTotal++;
- }
- return m_nTotal;
- } else {
- if (CLine * pLine = GetAt(m_nTotal)) {
- pLine->m_LineInfo = lineinfo;
- }
- return m_nTotal++;
- }
- }
- void Clear()
- {
- for (FX_INT32 i = GetSize() - 1; i >= m_nTotal; i--) {
- delete GetAt(i);
- m_Lines.RemoveAt(i);
- }
- }
-private:
- CPVT_ArrayTemplate<CLine*> m_Lines;
- FX_INT32 m_nTotal;
-};
-class CSection : public CFX_Object
-{
- friend class CTypeset;
-public:
- CSection(CPDF_VariableText * pVT);
- virtual ~CSection();
- void ResetAll();
- void ResetLineArray();
- void ResetWordArray();
- void ResetLinePlace();
- CPVT_WordPlace AddWord(const CPVT_WordPlace & place, const CPVT_WordInfo & wordinfo);
- CPVT_WordPlace AddLine(const CPVT_LineInfo & lineinfo);
- void ClearWords(const CPVT_WordRange & PlaceRange);
- void ClearWord(const CPVT_WordPlace & place);
- CPVT_FloatRect Rearrange();
- CPVT_Size GetSectionSize(FX_FLOAT fFontSize);
- CPVT_WordPlace GetBeginWordPlace() const;
- CPVT_WordPlace GetEndWordPlace() const;
- CPVT_WordPlace GetPrevWordPlace(const CPVT_WordPlace & place) const;
- CPVT_WordPlace GetNextWordPlace(const CPVT_WordPlace & place) const;
- void UpdateWordPlace(CPVT_WordPlace & place) const;
- CPVT_WordPlace SearchWordPlace(const CPDF_Point & point) const;
- CPVT_WordPlace SearchWordPlace(FX_FLOAT fx, const CPVT_WordPlace & lineplace) const;
- CPVT_WordPlace SearchWordPlace(FX_FLOAT fx, const CPVT_WordRange & range) const;
-public:
- CPVT_WordPlace SecPlace;
- CPVT_SectionInfo m_SecInfo;
- CLines m_LineArray;
- CPVT_ArrayTemplate<CPVT_WordInfo*> m_WordArray;
-private:
- void ClearLeftWords(FX_INT32 nWordIndex);
- void ClearRightWords(FX_INT32 nWordIndex);
- void ClearMidWords(FX_INT32 nBeginIndex, FX_INT32 nEndIndex);
-
- CPDF_VariableText *m_pVT;
-};
-class CTypeset
-{
-public:
- CTypeset(CSection * pSection);
- virtual ~CTypeset();
- CPVT_Size GetEditSize(FX_FLOAT fFontSize);
- CPVT_FloatRect Typeset();
- CPVT_FloatRect CharArray();
-private:
- void SplitLines(FX_BOOL bTypeset, FX_FLOAT fFontSize);
- void OutputLines();
-
- CPVT_FloatRect m_rcRet;
- CPDF_VariableText * m_pVT;
- CSection * m_pSection;
-};
-class CPDF_EditContainer
-{
-public:
- CPDF_EditContainer(): m_rcPlate(0, 0, 0, 0), m_rcContent(0, 0, 0, 0) {};
- virtual ~CPDF_EditContainer() {};
- virtual void SetPlateRect(const CPDF_Rect & rect)
- {
- m_rcPlate = rect;
- };
- virtual const CPDF_Rect & GetPlateRect() const
- {
- return m_rcPlate;
- };
- virtual void SetContentRect(const CPVT_FloatRect & rect)
- {
- m_rcContent = rect;
- };
- virtual CPDF_Rect GetContentRect() const
- {
- return m_rcContent;
- };
- FX_FLOAT GetPlateWidth() const
- {
- return m_rcPlate.right - m_rcPlate.left;
- };
- FX_FLOAT GetPlateHeight() const
- {
- return m_rcPlate.top - m_rcPlate.bottom;
- };
- CPVT_Size GetPlateSize() const
- {
- return CPVT_Size(GetPlateWidth(), GetPlateHeight());
- };
- CPDF_Point GetBTPoint() const
- {
- return CPDF_Point(m_rcPlate.left, m_rcPlate.top);
- };
- CPDF_Point GetETPoint() const
- {
- return CPDF_Point(m_rcPlate.right, m_rcPlate.bottom);
- };
- inline CPDF_Point InToOut(const CPDF_Point & point) const
- {
- return CPDF_Point(point.x + GetBTPoint().x, GetBTPoint().y - point.y);
- };
- inline CPDF_Point OutToIn(const CPDF_Point & point) const
- {
- return CPDF_Point(point.x - GetBTPoint().x, GetBTPoint().y - point.y);
- };
- inline CPDF_Rect InToOut(const CPVT_FloatRect & rect) const
- {
- CPDF_Point ptLeftTop = InToOut(CPDF_Point(rect.left, rect.top));
- CPDF_Point ptRightBottom = InToOut(CPDF_Point(rect.right, rect.bottom));
- return CPDF_Rect(ptLeftTop.x, ptRightBottom.y, ptRightBottom.x, ptLeftTop.y);
- };
- inline CPVT_FloatRect OutToIn(const CPDF_Rect & rect) const
- {
- CPDF_Point ptLeftTop = OutToIn(CPDF_Point(rect.left, rect.top));
- CPDF_Point ptRightBottom = OutToIn(CPDF_Point(rect.right, rect.bottom));
- return CPVT_FloatRect(ptLeftTop.x, ptLeftTop.y, ptRightBottom.x, ptRightBottom.y);
- };
-
-private:
- CPDF_Rect m_rcPlate;
- CPVT_FloatRect m_rcContent;
-};
-class CPDF_VariableText : public IPDF_VariableText, public CFX_Object, private CPDF_EditContainer
-{
- friend class CTypeset;
- friend class CSection;
- friend class CPDF_VariableText_Iterator;
-public:
- CPDF_VariableText();
- virtual ~CPDF_VariableText();
- IPDF_VariableText_Provider* SetProvider(IPDF_VariableText_Provider * pProvider);
- IPDF_VariableText_Iterator* GetIterator();
- void SetPlateRect(const CPDF_Rect & rect)
- {
- CPDF_EditContainer::SetPlateRect(rect);
- }
- void SetAlignment(FX_INT32 nFormat = 0)
- {
- m_nAlignment = nFormat;
- }
- void SetPasswordChar(FX_WORD wSubWord = '*')
- {
- m_wSubWord = wSubWord;
- }
- void SetLimitChar(FX_INT32 nLimitChar = 0)
- {
- m_nLimitChar = nLimitChar;
- }
- void SetCharSpace(FX_FLOAT fCharSpace = 0.0f)
- {
- m_fCharSpace = fCharSpace;
- }
- void SetHorzScale(FX_INT32 nHorzScale = 100)
- {
- m_nHorzScale = nHorzScale;
- }
- void SetMultiLine(FX_BOOL bMultiLine = TRUE)
- {
- m_bMultiLine = bMultiLine;
- }
- void SetAutoReturn(FX_BOOL bAuto = TRUE)
- {
- m_bLimitWidth = bAuto;
- }
- void SetFontSize(FX_FLOAT fFontSize)
- {
- m_fFontSize = fFontSize;
- }
- void SetCharArray(FX_INT32 nCharArray = 0)
- {
- m_nCharArray = nCharArray;
- }
- void SetAutoFontSize(FX_BOOL bAuto = TRUE)
- {
- m_bAutoFontSize = bAuto;
- }
- void SetRichText(FX_BOOL bRichText)
- {
- m_bRichText = bRichText;
- }
- void SetLineLeading(FX_FLOAT fLineLeading)
- {
- m_fLineLeading = fLineLeading;
- }
- void Initialize();
- FX_BOOL IsValid() const
- {
- return m_bInitial;
- }
- FX_BOOL IsRichText() const
- {
- return m_bRichText;
- }
- void RearrangeAll();
- void RearrangePart(const CPVT_WordRange & PlaceRange);
- void ResetAll();
- void SetText(FX_LPCWSTR text, FX_INT32 charset = 1, const CPVT_SecProps * pSecProps = NULL,
- const CPVT_WordProps * pWordProps = NULL);
- CPVT_WordPlace InsertWord(const CPVT_WordPlace & place, FX_WORD word, FX_INT32 charset = 1,
- const CPVT_WordProps * pWordProps = NULL);
- CPVT_WordPlace InsertSection(const CPVT_WordPlace & place, const CPVT_SecProps * pSecProps = NULL,
- const CPVT_WordProps * pWordProps = NULL);
- CPVT_WordPlace InsertText(const CPVT_WordPlace & place, FX_LPCWSTR text, FX_INT32 charset = 1,
- const CPVT_SecProps * pSecProps = NULL, const CPVT_WordProps * pWordProps = NULL);
- CPVT_WordPlace DeleteWords(const CPVT_WordRange & PlaceRange);
- CPVT_WordPlace DeleteWord(const CPVT_WordPlace & place);
- CPVT_WordPlace BackSpaceWord(const CPVT_WordPlace & place);
- const CPDF_Rect & GetPlateRect() const
- {
- return CPDF_EditContainer::GetPlateRect();
- }
- CPDF_Rect GetContentRect() const;
- FX_INT32 GetTotalWords() const;
- FX_FLOAT GetFontSize() const
- {
- return m_fFontSize;
- }
- FX_INT32 GetAlignment() const
- {
- return m_nAlignment;
- }
- FX_INT32 GetCharArray() const
- {
- return m_nCharArray;
- }
- FX_INT32 GetLimitChar() const
- {
- return m_nLimitChar;
- }
- FX_BOOL IsMultiLine() const
- {
- return m_bMultiLine;
- }
- FX_INT32 GetHorzScale() const
- {
- return m_nHorzScale;
- }
- FX_FLOAT GetCharSpace() const
- {
- return m_fCharSpace;
- }
-
- inline CPVT_WordPlace GetBeginWordPlace() const;
- inline CPVT_WordPlace GetEndWordPlace() const;
- CPVT_WordPlace GetPrevWordPlace(const CPVT_WordPlace & place) const;
- CPVT_WordPlace GetNextWordPlace(const CPVT_WordPlace & place) const;
- CPVT_WordPlace SearchWordPlace(const CPDF_Point & point) const;
- CPVT_WordPlace GetUpWordPlace(const CPVT_WordPlace & place, const CPDF_Point & point) const;
- CPVT_WordPlace GetDownWordPlace(const CPVT_WordPlace & place, const CPDF_Point & point) const;
- CPVT_WordPlace GetLineBeginPlace(const CPVT_WordPlace & place) const;
- CPVT_WordPlace GetLineEndPlace(const CPVT_WordPlace & place) const;
- CPVT_WordPlace GetSectionBeginPlace(const CPVT_WordPlace & place) const;
- CPVT_WordPlace GetSectionEndPlace(const CPVT_WordPlace & place) const;
- void UpdateWordPlace(CPVT_WordPlace & place) const;
- FX_INT32 WordPlaceToWordIndex(const CPVT_WordPlace & place) const;
- CPVT_WordPlace WordIndexToWordPlace(FX_INT32 index) const;
- FX_WORD GetPasswordChar() const
- {
- return GetSubWord();
- }
- FX_WORD GetSubWord() const
- {
- return m_wSubWord;
- }
-private:
- FX_INT32 GetCharWidth(FX_INT32 nFontIndex, FX_WORD Word, FX_WORD SubWord, FX_INT32 nWordStyle);
- FX_INT32 GetTypeAscent(FX_INT32 nFontIndex);
- FX_INT32 GetTypeDescent(FX_INT32 nFontIndex);
- FX_INT32 GetWordFontIndex(FX_WORD word, FX_INT32 charset, FX_INT32 nFontIndex);
- FX_INT32 GetDefaultFontIndex();
- FX_BOOL IsLatinWord(FX_WORD word);
-private:
-
- CPVT_WordPlace AddSection(const CPVT_WordPlace & place, const CPVT_SectionInfo & secinfo);
- CPVT_WordPlace AddLine(const CPVT_WordPlace & place, const CPVT_LineInfo & lineinfo);
- CPVT_WordPlace AddWord(const CPVT_WordPlace & place, const CPVT_WordInfo & wordinfo);
- FX_BOOL GetWordInfo(const CPVT_WordPlace & place, CPVT_WordInfo & wordinfo);
- FX_BOOL SetWordInfo(const CPVT_WordPlace & place, const CPVT_WordInfo & wordinfo);
- FX_BOOL GetLineInfo(const CPVT_WordPlace & place, CPVT_LineInfo & lineinfo);
- FX_BOOL GetSectionInfo(const CPVT_WordPlace & place, CPVT_SectionInfo & secinfo);
- FX_FLOAT GetWordFontSize(const CPVT_WordInfo & WordInfo, FX_BOOL bFactFontSize = FALSE);
- FX_FLOAT GetWordWidth(FX_INT32 nFontIndex, FX_WORD Word, FX_WORD SubWord,
- FX_FLOAT fCharSpace, FX_INT32 nHorzScale,
- FX_FLOAT fFontSize, FX_FLOAT fWordTail, FX_INT32 nWordStyle);
- FX_FLOAT GetWordWidth(const CPVT_WordInfo & WordInfo);
- FX_FLOAT GetWordAscent(const CPVT_WordInfo & WordInfo, FX_FLOAT fFontSize);
- FX_FLOAT GetWordDescent(const CPVT_WordInfo & WordInfo, FX_FLOAT fFontSize);
- FX_FLOAT GetWordAscent(const CPVT_WordInfo & WordInfo, FX_BOOL bFactFontSize = FALSE);
- FX_FLOAT GetWordDescent(const CPVT_WordInfo & WordInfo, FX_BOOL bFactFontSize = FALSE);
- FX_FLOAT GetLineAscent(const CPVT_SectionInfo & SecInfo);
- FX_FLOAT GetLineDescent(const CPVT_SectionInfo & SecInfo);
- FX_FLOAT GetFontAscent(FX_INT32 nFontIndex, FX_FLOAT fFontSize);
- FX_FLOAT GetFontDescent(FX_INT32 nFontIndex, FX_FLOAT fFontSize);
- FX_INT32 GetWordFontIndex(const CPVT_WordInfo & WordInfo);
- FX_FLOAT GetCharSpace(const CPVT_WordInfo & WordInfo);
- FX_INT32 GetHorzScale(const CPVT_WordInfo & WordInfo);
- FX_FLOAT GetLineLeading(const CPVT_SectionInfo & SecInfo);
- FX_FLOAT GetLineIndent(const CPVT_SectionInfo & SecInfo);
- FX_INT32 GetAlignment(const CPVT_SectionInfo& SecInfo);
-
- void ClearSectionRightWords(const CPVT_WordPlace & place);
- CPVT_WordPlace AjustLineHeader(const CPVT_WordPlace & place, FX_BOOL bPrevOrNext) const;
- FX_BOOL ClearEmptySection(const CPVT_WordPlace & place);
- void ClearEmptySections(const CPVT_WordRange & PlaceRange);
- void LinkLatterSection(const CPVT_WordPlace & place);
- void ClearWords(const CPVT_WordRange & PlaceRange);
- CPVT_WordPlace ClearLeftWord(const CPVT_WordPlace & place);
- CPVT_WordPlace ClearRightWord(const CPVT_WordPlace & place);
-private:
- CPVT_FloatRect Rearrange(const CPVT_WordRange & PlaceRange);
- FX_FLOAT GetAutoFontSize();
- FX_BOOL IsBigger(FX_FLOAT fFontSize);
- CPVT_FloatRect RearrangeSections(const CPVT_WordRange & PlaceRange);
-private:
- void ResetSectionArray();
-private:
- CPVT_ArrayTemplate<CSection*> m_SectionArray;
- FX_INT32 m_nLimitChar;
- FX_INT32 m_nCharArray;
- FX_BOOL m_bMultiLine;
- FX_BOOL m_bLimitWidth;
- FX_BOOL m_bAutoFontSize;
- FX_INT32 m_nAlignment;
- FX_FLOAT m_fLineLeading;
- FX_FLOAT m_fCharSpace;
- FX_INT32 m_nHorzScale;
- FX_WORD m_wSubWord;
- FX_FLOAT m_fWordSpace;
- FX_FLOAT m_fFontSize;
-
-private:
- FX_BOOL m_bInitial;
- FX_BOOL m_bRichText;
- FX_FLOAT m_fCaretOriginX;
- FX_INT32 m_nCurFontIndex;
- IPDF_VariableText_Provider * m_pVTProvider;
- CPDF_VariableText_Iterator * m_pVTIterator;
-};
-class CPDF_VariableText_Iterator : public IPDF_VariableText_Iterator, public CFX_Object
-{
-public:
- CPDF_VariableText_Iterator(CPDF_VariableText * pVT);
- virtual ~CPDF_VariableText_Iterator();
- FX_BOOL NextWord();
- FX_BOOL PrevWord();
- FX_BOOL NextLine();
- FX_BOOL PrevLine();
- FX_BOOL NextSection();
- FX_BOOL PrevSection();
- FX_BOOL SetWord(const CPVT_Word & word);
- FX_BOOL GetWord(CPVT_Word & word) const;
- FX_BOOL GetLine(CPVT_Line & line) const;
- FX_BOOL GetSection(CPVT_Section & section) const;
- FX_BOOL SetSection(const CPVT_Section & section);
- void SetAt(FX_INT32 nWordIndex);
- void SetAt(const CPVT_WordPlace & place);
- const CPVT_WordPlace & GetAt() const
- {
- return m_CurPos;
- };
-private:
- CPVT_WordPlace m_CurPos;
- CPDF_VariableText * m_pVT;
-};
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#define _PDF_VT_H_
+class CPVT_Size;
+class CPVT_FloatRect;
+struct CPVT_SectionInfo;
+struct CPVT_LineInfo;
+struct CPVT_WordInfo;
+class CLine;
+class CLines;
+class CSection;
+class CTypeset;
+class CPDF_EditContainer;
+class CPDF_VariableText;
+class CPDF_VariableText_Iterator;
+#define IsFloatZero(f) ((f) < 0.0001 && (f) > -0.0001)
+#define IsFloatBigger(fa,fb) ((fa) > (fb) && !IsFloatZero((fa) - (fb)))
+#define IsFloatSmaller(fa,fb) ((fa) < (fb) && !IsFloatZero((fa) - (fb)))
+template<class T> T FPDF_MIN (const T & i, const T & j)
+{
+ return ((i < j) ? i : j);
+}
+template<class T> T FPDF_MAX (const T & i, const T & j)
+{
+ return ((i > j) ? i : j);
+}
+class CPVT_Size
+{
+public:
+ CPVT_Size() : x(0.0f), y(0.0f)
+ {
+ }
+ CPVT_Size(FX_FLOAT x, FX_FLOAT y)
+ {
+ this->x = x;
+ this->y = y;
+ }
+ FX_FLOAT x, y;
+};
+class CPVT_FloatRect : public CFX_FloatRect
+{
+public:
+ CPVT_FloatRect()
+ {
+ left = top = right = bottom = 0.0f;
+ }
+ CPVT_FloatRect(FX_FLOAT left, FX_FLOAT top,
+ FX_FLOAT right, FX_FLOAT bottom)
+ {
+ this->left = left;
+ this->top = top;
+ this->right = right;
+ this->bottom = bottom;
+ }
+ CPVT_FloatRect(const CPDF_Rect & rect)
+ {
+ this->left = rect.left;
+ this->top = rect.top;
+ this->right = rect.right;
+ this->bottom = rect.bottom;
+ }
+ void Default()
+ {
+ left = top = right = bottom = 0.0f;
+ }
+ FX_FLOAT Height() const
+ {
+ if(this->top > this->bottom) {
+ return this->top - this->bottom;
+ } else {
+ return this->bottom - this->top;
+ }
+ }
+};
+struct CPVT_SectionInfo {
+ CPVT_SectionInfo() : rcSection(), nTotalLine(0), pSecProps(NULL), pWordProps(NULL)
+ {
+ }
+ virtual ~CPVT_SectionInfo()
+ {
+ if (pSecProps) {
+ delete pSecProps;
+ }
+ if (pWordProps) {
+ delete pWordProps;
+ }
+ }
+ CPVT_SectionInfo(const CPVT_SectionInfo & other): rcSection(), nTotalLine(0), pSecProps(NULL), pWordProps(NULL)
+ {
+ operator = (other);
+ }
+ void operator = (const CPVT_SectionInfo & other)
+ {
+ if (this == &other) {
+ return;
+ }
+ this->rcSection = other.rcSection;
+ this->nTotalLine = other.nTotalLine;
+ if (other.pSecProps) {
+ if (pSecProps) {
+ *pSecProps = *other.pSecProps;
+ } else {
+ pSecProps = FX_NEW CPVT_SecProps(*other.pSecProps);
+ }
+ }
+ if (other.pWordProps) {
+ if (pWordProps) {
+ *pWordProps = *other.pWordProps;
+ } else {
+ pWordProps = FX_NEW CPVT_WordProps(*other.pWordProps);
+ }
+ }
+ }
+ CPVT_FloatRect rcSection;
+ FX_INT32 nTotalLine;
+ CPVT_SecProps* pSecProps;
+ CPVT_WordProps* pWordProps;
+};
+struct CPVT_LineInfo {
+ CPVT_LineInfo() : nTotalWord(0), nBeginWordIndex(-1), nEndWordIndex(-1),
+ fLineX(0.0f), fLineY(0.0f), fLineWidth(0.0f), fLineAscent(0.0f), fLineDescent(0.0f)
+ {
+ }
+ FX_INT32 nTotalWord;
+ FX_INT32 nBeginWordIndex;
+ FX_INT32 nEndWordIndex;
+ FX_FLOAT fLineX;
+ FX_FLOAT fLineY;
+ FX_FLOAT fLineWidth;
+ FX_FLOAT fLineAscent;
+ FX_FLOAT fLineDescent;
+};
+struct CPVT_WordInfo : public CFX_Object {
+ CPVT_WordInfo() : Word(0), nCharset(0),
+ fWordX(0.0f), fWordY(0.0f), fWordTail(0.0f), nFontIndex(-1), pWordProps(NULL)
+ {
+ }
+ CPVT_WordInfo(FX_WORD word, FX_INT32 charset, FX_INT32 fontIndex, CPVT_WordProps * pProps):
+ Word(word), nCharset(charset), fWordX(0.0f), fWordY(0.0f), fWordTail(0.0f),
+ nFontIndex(fontIndex), pWordProps(pProps)
+ {
+ }
+ virtual ~CPVT_WordInfo()
+ {
+ if (pWordProps) {
+ delete pWordProps;
+ }
+ }
+ CPVT_WordInfo(const CPVT_WordInfo & word): Word(0), nCharset(0),
+ fWordX(0.0f), fWordY(0.0f), fWordTail(0.0f), nFontIndex(-1), pWordProps(NULL)
+ {
+ operator = (word);
+ }
+ void operator = (const CPVT_WordInfo & word)
+ {
+ if (this == &word) {
+ return;
+ }
+ this->Word = word.Word;
+ this->nCharset = word.nCharset;
+ this->nFontIndex = word.nFontIndex;
+ if (word.pWordProps) {
+ if (pWordProps) {
+ *pWordProps = *word.pWordProps;
+ } else {
+ pWordProps = FX_NEW CPVT_WordProps(*word.pWordProps);
+ }
+ }
+ }
+ FX_WORD Word;
+ FX_INT32 nCharset;
+ FX_FLOAT fWordX;
+ FX_FLOAT fWordY;
+ FX_FLOAT fWordTail;
+ FX_INT32 nFontIndex;
+ CPVT_WordProps* pWordProps;
+};
+struct CPVT_FloatRange {
+ CPVT_FloatRange() : fMin(0.0f), fMax(0.0f)
+ {
+ }
+ CPVT_FloatRange(FX_FLOAT min, FX_FLOAT max) : fMin(min), fMax(max)
+ {
+ }
+ FX_FLOAT Range() const
+ {
+ return fMax - fMin;
+ }
+ FX_FLOAT fMin, fMax;
+};
+template<class TYPE> class CPVT_ArrayTemplate : public CFX_ArrayTemplate<TYPE>
+{
+public:
+ FX_BOOL IsEmpty()
+ {
+ return CFX_ArrayTemplate<TYPE>::GetSize() <= 0;
+ }
+ TYPE GetAt(int nIndex) const
+ {
+ if (nIndex >= 0 && nIndex < CFX_ArrayTemplate<TYPE>::GetSize()) {
+ return CFX_ArrayTemplate<TYPE>::GetAt(nIndex);
+ }
+ return NULL;
+ }
+ void RemoveAt(int nIndex)
+ {
+ if (nIndex >= 0 && nIndex < CFX_ArrayTemplate<TYPE>::GetSize()) {
+ CFX_ArrayTemplate<TYPE>::RemoveAt(nIndex);
+ }
+ }
+};
+class CLine : public CFX_Object
+{
+public:
+ CLine();
+ virtual ~CLine();
+ CPVT_WordPlace GetBeginWordPlace() const;
+ CPVT_WordPlace GetEndWordPlace() const;
+ CPVT_WordPlace GetPrevWordPlace(const CPVT_WordPlace & place) const;
+ CPVT_WordPlace GetNextWordPlace(const CPVT_WordPlace & place) const;
+ CPVT_WordPlace LinePlace;
+ CPVT_LineInfo m_LineInfo;
+};
+class CLines
+{
+public:
+ CLines() : m_nTotal(0) {}
+ virtual ~CLines()
+ {
+ RemoveAll();
+ }
+ FX_INT32 GetSize() const
+ {
+ return m_Lines.GetSize();
+ }
+ CLine * GetAt(FX_INT32 nIndex) const
+ {
+ return m_Lines.GetAt(nIndex);
+ }
+ void Empty()
+ {
+ m_nTotal = 0;
+ }
+ void RemoveAll()
+ {
+ for (FX_INT32 i = 0, sz = GetSize(); i < sz; i++) {
+ delete GetAt(i);
+ }
+ m_Lines.RemoveAll();
+ m_nTotal = 0;
+ }
+ FX_INT32 Add(const CPVT_LineInfo & lineinfo)
+ {
+ if (m_nTotal >= GetSize()) {
+ if (CLine * pLine = FX_NEW CLine) {
+ pLine->m_LineInfo = lineinfo;
+ m_Lines.Add(pLine);
+ return m_nTotal++;
+ }
+ return m_nTotal;
+ } else {
+ if (CLine * pLine = GetAt(m_nTotal)) {
+ pLine->m_LineInfo = lineinfo;
+ }
+ return m_nTotal++;
+ }
+ }
+ void Clear()
+ {
+ for (FX_INT32 i = GetSize() - 1; i >= m_nTotal; i--) {
+ delete GetAt(i);
+ m_Lines.RemoveAt(i);
+ }
+ }
+private:
+ CPVT_ArrayTemplate<CLine*> m_Lines;
+ FX_INT32 m_nTotal;
+};
+class CSection : public CFX_Object
+{
+ friend class CTypeset;
+public:
+ CSection(CPDF_VariableText * pVT);
+ virtual ~CSection();
+ void ResetAll();
+ void ResetLineArray();
+ void ResetWordArray();
+ void ResetLinePlace();
+ CPVT_WordPlace AddWord(const CPVT_WordPlace & place, const CPVT_WordInfo & wordinfo);
+ CPVT_WordPlace AddLine(const CPVT_LineInfo & lineinfo);
+ void ClearWords(const CPVT_WordRange & PlaceRange);
+ void ClearWord(const CPVT_WordPlace & place);
+ CPVT_FloatRect Rearrange();
+ CPVT_Size GetSectionSize(FX_FLOAT fFontSize);
+ CPVT_WordPlace GetBeginWordPlace() const;
+ CPVT_WordPlace GetEndWordPlace() const;
+ CPVT_WordPlace GetPrevWordPlace(const CPVT_WordPlace & place) const;
+ CPVT_WordPlace GetNextWordPlace(const CPVT_WordPlace & place) const;
+ void UpdateWordPlace(CPVT_WordPlace & place) const;
+ CPVT_WordPlace SearchWordPlace(const CPDF_Point & point) const;
+ CPVT_WordPlace SearchWordPlace(FX_FLOAT fx, const CPVT_WordPlace & lineplace) const;
+ CPVT_WordPlace SearchWordPlace(FX_FLOAT fx, const CPVT_WordRange & range) const;
+public:
+ CPVT_WordPlace SecPlace;
+ CPVT_SectionInfo m_SecInfo;
+ CLines m_LineArray;
+ CPVT_ArrayTemplate<CPVT_WordInfo*> m_WordArray;
+private:
+ void ClearLeftWords(FX_INT32 nWordIndex);
+ void ClearRightWords(FX_INT32 nWordIndex);
+ void ClearMidWords(FX_INT32 nBeginIndex, FX_INT32 nEndIndex);
+
+ CPDF_VariableText *m_pVT;
+};
+class CTypeset
+{
+public:
+ CTypeset(CSection * pSection);
+ virtual ~CTypeset();
+ CPVT_Size GetEditSize(FX_FLOAT fFontSize);
+ CPVT_FloatRect Typeset();
+ CPVT_FloatRect CharArray();
+private:
+ void SplitLines(FX_BOOL bTypeset, FX_FLOAT fFontSize);
+ void OutputLines();
+
+ CPVT_FloatRect m_rcRet;
+ CPDF_VariableText * m_pVT;
+ CSection * m_pSection;
+};
+class CPDF_EditContainer
+{
+public:
+ CPDF_EditContainer(): m_rcPlate(0, 0, 0, 0), m_rcContent(0, 0, 0, 0) {};
+ virtual ~CPDF_EditContainer() {};
+ virtual void SetPlateRect(const CPDF_Rect & rect)
+ {
+ m_rcPlate = rect;
+ };
+ virtual const CPDF_Rect & GetPlateRect() const
+ {
+ return m_rcPlate;
+ };
+ virtual void SetContentRect(const CPVT_FloatRect & rect)
+ {
+ m_rcContent = rect;
+ };
+ virtual CPDF_Rect GetContentRect() const
+ {
+ return m_rcContent;
+ };
+ FX_FLOAT GetPlateWidth() const
+ {
+ return m_rcPlate.right - m_rcPlate.left;
+ };
+ FX_FLOAT GetPlateHeight() const
+ {
+ return m_rcPlate.top - m_rcPlate.bottom;
+ };
+ CPVT_Size GetPlateSize() const
+ {
+ return CPVT_Size(GetPlateWidth(), GetPlateHeight());
+ };
+ CPDF_Point GetBTPoint() const
+ {
+ return CPDF_Point(m_rcPlate.left, m_rcPlate.top);
+ };
+ CPDF_Point GetETPoint() const
+ {
+ return CPDF_Point(m_rcPlate.right, m_rcPlate.bottom);
+ };
+ inline CPDF_Point InToOut(const CPDF_Point & point) const
+ {
+ return CPDF_Point(point.x + GetBTPoint().x, GetBTPoint().y - point.y);
+ };
+ inline CPDF_Point OutToIn(const CPDF_Point & point) const
+ {
+ return CPDF_Point(point.x - GetBTPoint().x, GetBTPoint().y - point.y);
+ };
+ inline CPDF_Rect InToOut(const CPVT_FloatRect & rect) const
+ {
+ CPDF_Point ptLeftTop = InToOut(CPDF_Point(rect.left, rect.top));
+ CPDF_Point ptRightBottom = InToOut(CPDF_Point(rect.right, rect.bottom));
+ return CPDF_Rect(ptLeftTop.x, ptRightBottom.y, ptRightBottom.x, ptLeftTop.y);
+ };
+ inline CPVT_FloatRect OutToIn(const CPDF_Rect & rect) const
+ {
+ CPDF_Point ptLeftTop = OutToIn(CPDF_Point(rect.left, rect.top));
+ CPDF_Point ptRightBottom = OutToIn(CPDF_Point(rect.right, rect.bottom));
+ return CPVT_FloatRect(ptLeftTop.x, ptLeftTop.y, ptRightBottom.x, ptRightBottom.y);
+ };
+
+private:
+ CPDF_Rect m_rcPlate;
+ CPVT_FloatRect m_rcContent;
+};
+class CPDF_VariableText : public IPDF_VariableText, public CFX_Object, private CPDF_EditContainer
+{
+ friend class CTypeset;
+ friend class CSection;
+ friend class CPDF_VariableText_Iterator;
+public:
+ CPDF_VariableText();
+ virtual ~CPDF_VariableText();
+ IPDF_VariableText_Provider* SetProvider(IPDF_VariableText_Provider * pProvider);
+ IPDF_VariableText_Iterator* GetIterator();
+ void SetPlateRect(const CPDF_Rect & rect)
+ {
+ CPDF_EditContainer::SetPlateRect(rect);
+ }
+ void SetAlignment(FX_INT32 nFormat = 0)
+ {
+ m_nAlignment = nFormat;
+ }
+ void SetPasswordChar(FX_WORD wSubWord = '*')
+ {
+ m_wSubWord = wSubWord;
+ }
+ void SetLimitChar(FX_INT32 nLimitChar = 0)
+ {
+ m_nLimitChar = nLimitChar;
+ }
+ void SetCharSpace(FX_FLOAT fCharSpace = 0.0f)
+ {
+ m_fCharSpace = fCharSpace;
+ }
+ void SetHorzScale(FX_INT32 nHorzScale = 100)
+ {
+ m_nHorzScale = nHorzScale;
+ }
+ void SetMultiLine(FX_BOOL bMultiLine = TRUE)
+ {
+ m_bMultiLine = bMultiLine;
+ }
+ void SetAutoReturn(FX_BOOL bAuto = TRUE)
+ {
+ m_bLimitWidth = bAuto;
+ }
+ void SetFontSize(FX_FLOAT fFontSize)
+ {
+ m_fFontSize = fFontSize;
+ }
+ void SetCharArray(FX_INT32 nCharArray = 0)
+ {
+ m_nCharArray = nCharArray;
+ }
+ void SetAutoFontSize(FX_BOOL bAuto = TRUE)
+ {
+ m_bAutoFontSize = bAuto;
+ }
+ void SetRichText(FX_BOOL bRichText)
+ {
+ m_bRichText = bRichText;
+ }
+ void SetLineLeading(FX_FLOAT fLineLeading)
+ {
+ m_fLineLeading = fLineLeading;
+ }
+ void Initialize();
+ FX_BOOL IsValid() const
+ {
+ return m_bInitial;
+ }
+ FX_BOOL IsRichText() const
+ {
+ return m_bRichText;
+ }
+ void RearrangeAll();
+ void RearrangePart(const CPVT_WordRange & PlaceRange);
+ void ResetAll();
+ void SetText(FX_LPCWSTR text, FX_INT32 charset = 1, const CPVT_SecProps * pSecProps = NULL,
+ const CPVT_WordProps * pWordProps = NULL);
+ CPVT_WordPlace InsertWord(const CPVT_WordPlace & place, FX_WORD word, FX_INT32 charset = 1,
+ const CPVT_WordProps * pWordProps = NULL);
+ CPVT_WordPlace InsertSection(const CPVT_WordPlace & place, const CPVT_SecProps * pSecProps = NULL,
+ const CPVT_WordProps * pWordProps = NULL);
+ CPVT_WordPlace InsertText(const CPVT_WordPlace & place, FX_LPCWSTR text, FX_INT32 charset = 1,
+ const CPVT_SecProps * pSecProps = NULL, const CPVT_WordProps * pWordProps = NULL);
+ CPVT_WordPlace DeleteWords(const CPVT_WordRange & PlaceRange);
+ CPVT_WordPlace DeleteWord(const CPVT_WordPlace & place);
+ CPVT_WordPlace BackSpaceWord(const CPVT_WordPlace & place);
+ const CPDF_Rect & GetPlateRect() const
+ {
+ return CPDF_EditContainer::GetPlateRect();
+ }
+ CPDF_Rect GetContentRect() const;
+ FX_INT32 GetTotalWords() const;
+ FX_FLOAT GetFontSize() const
+ {
+ return m_fFontSize;
+ }
+ FX_INT32 GetAlignment() const
+ {
+ return m_nAlignment;
+ }
+ FX_INT32 GetCharArray() const
+ {
+ return m_nCharArray;
+ }
+ FX_INT32 GetLimitChar() const
+ {
+ return m_nLimitChar;
+ }
+ FX_BOOL IsMultiLine() const
+ {
+ return m_bMultiLine;
+ }
+ FX_INT32 GetHorzScale() const
+ {
+ return m_nHorzScale;
+ }
+ FX_FLOAT GetCharSpace() const
+ {
+ return m_fCharSpace;
+ }
+
+ inline CPVT_WordPlace GetBeginWordPlace() const;
+ inline CPVT_WordPlace GetEndWordPlace() const;
+ CPVT_WordPlace GetPrevWordPlace(const CPVT_WordPlace & place) const;
+ CPVT_WordPlace GetNextWordPlace(const CPVT_WordPlace & place) const;
+ CPVT_WordPlace SearchWordPlace(const CPDF_Point & point) const;
+ CPVT_WordPlace GetUpWordPlace(const CPVT_WordPlace & place, const CPDF_Point & point) const;
+ CPVT_WordPlace GetDownWordPlace(const CPVT_WordPlace & place, const CPDF_Point & point) const;
+ CPVT_WordPlace GetLineBeginPlace(const CPVT_WordPlace & place) const;
+ CPVT_WordPlace GetLineEndPlace(const CPVT_WordPlace & place) const;
+ CPVT_WordPlace GetSectionBeginPlace(const CPVT_WordPlace & place) const;
+ CPVT_WordPlace GetSectionEndPlace(const CPVT_WordPlace & place) const;
+ void UpdateWordPlace(CPVT_WordPlace & place) const;
+ FX_INT32 WordPlaceToWordIndex(const CPVT_WordPlace & place) const;
+ CPVT_WordPlace WordIndexToWordPlace(FX_INT32 index) const;
+ FX_WORD GetPasswordChar() const
+ {
+ return GetSubWord();
+ }
+ FX_WORD GetSubWord() const
+ {
+ return m_wSubWord;
+ }
+private:
+ FX_INT32 GetCharWidth(FX_INT32 nFontIndex, FX_WORD Word, FX_WORD SubWord, FX_INT32 nWordStyle);
+ FX_INT32 GetTypeAscent(FX_INT32 nFontIndex);
+ FX_INT32 GetTypeDescent(FX_INT32 nFontIndex);
+ FX_INT32 GetWordFontIndex(FX_WORD word, FX_INT32 charset, FX_INT32 nFontIndex);
+ FX_INT32 GetDefaultFontIndex();
+ FX_BOOL IsLatinWord(FX_WORD word);
+private:
+
+ CPVT_WordPlace AddSection(const CPVT_WordPlace & place, const CPVT_SectionInfo & secinfo);
+ CPVT_WordPlace AddLine(const CPVT_WordPlace & place, const CPVT_LineInfo & lineinfo);
+ CPVT_WordPlace AddWord(const CPVT_WordPlace & place, const CPVT_WordInfo & wordinfo);
+ FX_BOOL GetWordInfo(const CPVT_WordPlace & place, CPVT_WordInfo & wordinfo);
+ FX_BOOL SetWordInfo(const CPVT_WordPlace & place, const CPVT_WordInfo & wordinfo);
+ FX_BOOL GetLineInfo(const CPVT_WordPlace & place, CPVT_LineInfo & lineinfo);
+ FX_BOOL GetSectionInfo(const CPVT_WordPlace & place, CPVT_SectionInfo & secinfo);
+ FX_FLOAT GetWordFontSize(const CPVT_WordInfo & WordInfo, FX_BOOL bFactFontSize = FALSE);
+ FX_FLOAT GetWordWidth(FX_INT32 nFontIndex, FX_WORD Word, FX_WORD SubWord,
+ FX_FLOAT fCharSpace, FX_INT32 nHorzScale,
+ FX_FLOAT fFontSize, FX_FLOAT fWordTail, FX_INT32 nWordStyle);
+ FX_FLOAT GetWordWidth(const CPVT_WordInfo & WordInfo);
+ FX_FLOAT GetWordAscent(const CPVT_WordInfo & WordInfo, FX_FLOAT fFontSize);
+ FX_FLOAT GetWordDescent(const CPVT_WordInfo & WordInfo, FX_FLOAT fFontSize);
+ FX_FLOAT GetWordAscent(const CPVT_WordInfo & WordInfo, FX_BOOL bFactFontSize = FALSE);
+ FX_FLOAT GetWordDescent(const CPVT_WordInfo & WordInfo, FX_BOOL bFactFontSize = FALSE);
+ FX_FLOAT GetLineAscent(const CPVT_SectionInfo & SecInfo);
+ FX_FLOAT GetLineDescent(const CPVT_SectionInfo & SecInfo);
+ FX_FLOAT GetFontAscent(FX_INT32 nFontIndex, FX_FLOAT fFontSize);
+ FX_FLOAT GetFontDescent(FX_INT32 nFontIndex, FX_FLOAT fFontSize);
+ FX_INT32 GetWordFontIndex(const CPVT_WordInfo & WordInfo);
+ FX_FLOAT GetCharSpace(const CPVT_WordInfo & WordInfo);
+ FX_INT32 GetHorzScale(const CPVT_WordInfo & WordInfo);
+ FX_FLOAT GetLineLeading(const CPVT_SectionInfo & SecInfo);
+ FX_FLOAT GetLineIndent(const CPVT_SectionInfo & SecInfo);
+ FX_INT32 GetAlignment(const CPVT_SectionInfo& SecInfo);
+
+ void ClearSectionRightWords(const CPVT_WordPlace & place);
+ CPVT_WordPlace AjustLineHeader(const CPVT_WordPlace & place, FX_BOOL bPrevOrNext) const;
+ FX_BOOL ClearEmptySection(const CPVT_WordPlace & place);
+ void ClearEmptySections(const CPVT_WordRange & PlaceRange);
+ void LinkLatterSection(const CPVT_WordPlace & place);
+ void ClearWords(const CPVT_WordRange & PlaceRange);
+ CPVT_WordPlace ClearLeftWord(const CPVT_WordPlace & place);
+ CPVT_WordPlace ClearRightWord(const CPVT_WordPlace & place);
+private:
+ CPVT_FloatRect Rearrange(const CPVT_WordRange & PlaceRange);
+ FX_FLOAT GetAutoFontSize();
+ FX_BOOL IsBigger(FX_FLOAT fFontSize);
+ CPVT_FloatRect RearrangeSections(const CPVT_WordRange & PlaceRange);
+private:
+ void ResetSectionArray();
+private:
+ CPVT_ArrayTemplate<CSection*> m_SectionArray;
+ FX_INT32 m_nLimitChar;
+ FX_INT32 m_nCharArray;
+ FX_BOOL m_bMultiLine;
+ FX_BOOL m_bLimitWidth;
+ FX_BOOL m_bAutoFontSize;
+ FX_INT32 m_nAlignment;
+ FX_FLOAT m_fLineLeading;
+ FX_FLOAT m_fCharSpace;
+ FX_INT32 m_nHorzScale;
+ FX_WORD m_wSubWord;
+ FX_FLOAT m_fWordSpace;
+ FX_FLOAT m_fFontSize;
+
+private:
+ FX_BOOL m_bInitial;
+ FX_BOOL m_bRichText;
+ FX_FLOAT m_fCaretOriginX;
+ FX_INT32 m_nCurFontIndex;
+ IPDF_VariableText_Provider * m_pVTProvider;
+ CPDF_VariableText_Iterator * m_pVTIterator;
+};
+class CPDF_VariableText_Iterator : public IPDF_VariableText_Iterator, public CFX_Object
+{
+public:
+ CPDF_VariableText_Iterator(CPDF_VariableText * pVT);
+ virtual ~CPDF_VariableText_Iterator();
+ FX_BOOL NextWord();
+ FX_BOOL PrevWord();
+ FX_BOOL NextLine();
+ FX_BOOL PrevLine();
+ FX_BOOL NextSection();
+ FX_BOOL PrevSection();
+ FX_BOOL SetWord(const CPVT_Word & word);
+ FX_BOOL GetWord(CPVT_Word & word) const;
+ FX_BOOL GetLine(CPVT_Line & line) const;
+ FX_BOOL GetSection(CPVT_Section & section) const;
+ FX_BOOL SetSection(const CPVT_Section & section);
+ void SetAt(FX_INT32 nWordIndex);
+ void SetAt(const CPVT_WordPlace & place);
+ const CPVT_WordPlace & GetAt() const
+ {
+ return m_CurPos;
+ };
+private:
+ CPVT_WordPlace m_CurPos;
+ CPDF_VariableText * m_pVT;
+};
diff --git a/core/src/fpdfdoc/tagged_int.h b/core/src/fpdfdoc/tagged_int.h
index a343a801f3..0ebf4084a4 100644
--- a/core/src/fpdfdoc/tagged_int.h
+++ b/core/src/fpdfdoc/tagged_int.h
@@ -1,91 +1,91 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef _FPDF_TAGGED_INT_H_
-#define _FPDF_TAGGED_INT_H_
-class CPDF_StructTreeImpl;
-class CPDF_StructElementImpl;
-class CPDF_StructTreeImpl : public CPDF_StructTree
-{
-public:
- CPDF_StructTreeImpl(const CPDF_Document* pDoc);
- ~CPDF_StructTreeImpl();
- int CountTopElements() const
- {
- return m_Kids.GetSize();
- }
- CPDF_StructElement* GetTopElement(int i) const
- {
- return (CPDF_StructElement*)m_Kids.GetAt(i);
- }
- void LoadDocTree();
- void LoadPageTree(const CPDF_Dictionary* pPageDict);
- CPDF_StructElementImpl* AddPageNode(CPDF_Dictionary* pElement, CFX_MapPtrToPtr& map, int nLevel = 0);
- FX_BOOL AddTopLevelNode(CPDF_Dictionary* pDict, CPDF_StructElementImpl* pElement);
-protected:
- const CPDF_Dictionary* m_pTreeRoot;
- const CPDF_Dictionary* m_pRoleMap;
- const CPDF_Dictionary* m_pPage;
- CFX_ArrayTemplate<CPDF_StructElementImpl*> m_Kids;
- friend class CPDF_StructElementImpl;
-};
-class CPDF_StructElementImpl : public CPDF_StructElement
-{
-public:
- CPDF_StructElementImpl(CPDF_StructTreeImpl* pTree, CPDF_StructElementImpl* pParent, CPDF_Dictionary* pDict);
- ~CPDF_StructElementImpl();
- CPDF_StructTree* GetTree() const
- {
- return m_pTree;
- }
- const CFX_ByteString& GetType() const
- {
- return m_Type;
- }
- CPDF_StructElement* GetParent() const
- {
- return m_pParent;
- }
- CPDF_Dictionary * GetDict() const
- {
- return m_pDict;
- }
- int CountKids() const
- {
- return m_Kids.GetSize();
- }
- const CPDF_StructKid& GetKid(int index) const
- {
- return m_Kids.GetData()[index];
- }
- CFX_PtrArray* GetObjectArray()
- {
- return &m_ObjectArray;
- }
-
- CPDF_Object* GetAttr(FX_BSTR owner, FX_BSTR name, FX_BOOL bInheritable = FALSE, FX_FLOAT fLevel = 0.0F);
-
- CFX_ByteString GetName(FX_BSTR owner, FX_BSTR name, FX_BSTR default_value, FX_BOOL bInheritable = FALSE, int subindex = -1);
- FX_ARGB GetColor(FX_BSTR owner, FX_BSTR name, FX_ARGB default_value, FX_BOOL bInheritable = FALSE, int subindex = -1);
- FX_FLOAT GetNumber(FX_BSTR owner, FX_BSTR name, FX_FLOAT default_value, FX_BOOL bInheritable = FALSE, int subindex = -1);
- int GetInteger(FX_BSTR owner, FX_BSTR name, int default_value, FX_BOOL bInheritable = FALSE, int subindex = -1);
- CFX_PtrArray m_ObjectArray;
- void LoadKids(CPDF_Dictionary* pDict);
- void LoadKid(FX_DWORD PageObjNum, CPDF_Object* pObj, CPDF_StructKid* pKid);
- CPDF_Object* GetAttr(FX_BSTR owner, FX_BSTR name, FX_BOOL bInheritable, int subindex);
- CPDF_StructElementImpl* Retain();
- void Release();
-protected:
- CPDF_StructTreeImpl* m_pTree;
- CFX_ByteString m_Type;
- CPDF_StructElementImpl* m_pParent;
- CPDF_Dictionary* m_pDict;
- CFX_ArrayTemplate<CPDF_StructKid> m_Kids;
-
- int m_RefCount;
- friend class CPDF_StructTreeImpl;
-};
-#endif
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FPDF_TAGGED_INT_H_
+#define _FPDF_TAGGED_INT_H_
+class CPDF_StructTreeImpl;
+class CPDF_StructElementImpl;
+class CPDF_StructTreeImpl : public CPDF_StructTree
+{
+public:
+ CPDF_StructTreeImpl(const CPDF_Document* pDoc);
+ ~CPDF_StructTreeImpl();
+ int CountTopElements() const
+ {
+ return m_Kids.GetSize();
+ }
+ CPDF_StructElement* GetTopElement(int i) const
+ {
+ return (CPDF_StructElement*)m_Kids.GetAt(i);
+ }
+ void LoadDocTree();
+ void LoadPageTree(const CPDF_Dictionary* pPageDict);
+ CPDF_StructElementImpl* AddPageNode(CPDF_Dictionary* pElement, CFX_MapPtrToPtr& map, int nLevel = 0);
+ FX_BOOL AddTopLevelNode(CPDF_Dictionary* pDict, CPDF_StructElementImpl* pElement);
+protected:
+ const CPDF_Dictionary* m_pTreeRoot;
+ const CPDF_Dictionary* m_pRoleMap;
+ const CPDF_Dictionary* m_pPage;
+ CFX_ArrayTemplate<CPDF_StructElementImpl*> m_Kids;
+ friend class CPDF_StructElementImpl;
+};
+class CPDF_StructElementImpl : public CPDF_StructElement
+{
+public:
+ CPDF_StructElementImpl(CPDF_StructTreeImpl* pTree, CPDF_StructElementImpl* pParent, CPDF_Dictionary* pDict);
+ ~CPDF_StructElementImpl();
+ CPDF_StructTree* GetTree() const
+ {
+ return m_pTree;
+ }
+ const CFX_ByteString& GetType() const
+ {
+ return m_Type;
+ }
+ CPDF_StructElement* GetParent() const
+ {
+ return m_pParent;
+ }
+ CPDF_Dictionary * GetDict() const
+ {
+ return m_pDict;
+ }
+ int CountKids() const
+ {
+ return m_Kids.GetSize();
+ }
+ const CPDF_StructKid& GetKid(int index) const
+ {
+ return m_Kids.GetData()[index];
+ }
+ CFX_PtrArray* GetObjectArray()
+ {
+ return &m_ObjectArray;
+ }
+
+ CPDF_Object* GetAttr(FX_BSTR owner, FX_BSTR name, FX_BOOL bInheritable = FALSE, FX_FLOAT fLevel = 0.0F);
+
+ CFX_ByteString GetName(FX_BSTR owner, FX_BSTR name, FX_BSTR default_value, FX_BOOL bInheritable = FALSE, int subindex = -1);
+ FX_ARGB GetColor(FX_BSTR owner, FX_BSTR name, FX_ARGB default_value, FX_BOOL bInheritable = FALSE, int subindex = -1);
+ FX_FLOAT GetNumber(FX_BSTR owner, FX_BSTR name, FX_FLOAT default_value, FX_BOOL bInheritable = FALSE, int subindex = -1);
+ int GetInteger(FX_BSTR owner, FX_BSTR name, int default_value, FX_BOOL bInheritable = FALSE, int subindex = -1);
+ CFX_PtrArray m_ObjectArray;
+ void LoadKids(CPDF_Dictionary* pDict);
+ void LoadKid(FX_DWORD PageObjNum, CPDF_Object* pObj, CPDF_StructKid* pKid);
+ CPDF_Object* GetAttr(FX_BSTR owner, FX_BSTR name, FX_BOOL bInheritable, int subindex);
+ CPDF_StructElementImpl* Retain();
+ void Release();
+protected:
+ CPDF_StructTreeImpl* m_pTree;
+ CFX_ByteString m_Type;
+ CPDF_StructElementImpl* m_pParent;
+ CPDF_Dictionary* m_pDict;
+ CFX_ArrayTemplate<CPDF_StructKid> m_Kids;
+
+ int m_RefCount;
+ friend class CPDF_StructTreeImpl;
+};
+#endif
diff --git a/core/src/fpdftext/fpdf_text.cpp b/core/src/fpdftext/fpdf_text.cpp
index 2576b757b6..048ebde2be 100644
--- a/core/src/fpdftext/fpdf_text.cpp
+++ b/core/src/fpdftext/fpdf_text.cpp
@@ -1,791 +1,791 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../include/fpdfapi/fpdf_page.h"
-#include "../../include/fpdfapi/fpdf_pageobj.h"
-#include "../../include/fpdftext/fpdf_text.h"
-#include "txtproc.h"
-#include "text_int.h"
-#if !defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_)
-extern FX_LPCSTR FCS_GetAltStr(FX_WCHAR);
-CFX_ByteString CharFromUnicodeAlt(FX_WCHAR unicode, int destcp, FX_LPCSTR defchar)
-{
- if (destcp == 0) {
- if (unicode < 0x80) {
- return CFX_ByteString((char)unicode);
- }
- FX_LPCSTR altstr = FCS_GetAltStr(unicode);
- if (altstr) {
- return CFX_ByteString(altstr, -1);
- }
- return CFX_ByteString(defchar, -1);
- }
- FX_BOOL bDef = FALSE;
- char buf[10];
- int ret = FXSYS_WideCharToMultiByte(destcp, 0, (wchar_t*)&unicode, 1, buf, 10, NULL, &bDef);
- if (ret && !bDef) {
- return CFX_ByteString(buf, ret);
- }
- FX_LPCSTR altstr = FCS_GetAltStr(unicode);
- if (altstr) {
- return CFX_ByteString(altstr, -1);
- }
- return CFX_ByteString(defchar, -1);
-}
-CTextPage::CTextPage()
-{
-}
-CTextPage::~CTextPage()
-{
- int i;
- for (i = 0; i < m_BaseLines.GetSize(); i ++) {
- CTextBaseLine* pBaseLine = (CTextBaseLine*)m_BaseLines.GetAt(i);
- delete pBaseLine;
- }
- for (i = 0; i < m_TextColumns.GetSize(); i ++) {
- CTextColumn* pTextColumn = (CTextColumn*)m_TextColumns.GetAt(i);
- delete pTextColumn;
- }
-}
-void CTextPage::ProcessObject(CPDF_PageObject* pObject)
-{
- if (pObject->m_Type != PDFPAGE_TEXT) {
- return;
- }
- CPDF_TextObject* pText = (CPDF_TextObject*)pObject;
- CPDF_Font* pFont = pText->m_TextState.GetFont();
- int count = pText->CountItems();
- FX_FLOAT* pPosArray = FX_Alloc(FX_FLOAT, count * 2);
- if (pPosArray) {
- pText->CalcCharPos(pPosArray);
- }
- FX_FLOAT fontsize_h = pText->m_TextState.GetFontSizeH();
- FX_FLOAT fontsize_v = pText->m_TextState.GetFontSizeV();
- FX_DWORD space_charcode = pFont->CharCodeFromUnicode(' ');
- FX_FLOAT spacew = 0;
- if (space_charcode != -1) {
- spacew = fontsize_h * pFont->GetCharWidthF(space_charcode) / 1000;
- }
- if (spacew == 0) {
- spacew = fontsize_h / 4;
- }
- if (pText->m_TextState.GetBaselineAngle() != 0) {
- int cc = 0;
- CFX_AffineMatrix matrix;
- pText->GetTextMatrix(&matrix);
- for (int i = 0; i < pText->m_nChars; i ++) {
- FX_DWORD charcode = pText->m_nChars == 1 ? (FX_DWORD)(FX_UINTPTR)pText->m_pCharCodes : pText->m_pCharCodes[i];
- if (charcode == (FX_DWORD) - 1) {
- continue;
- }
- FX_RECT char_box;
- pFont->GetCharBBox(charcode, char_box);
- FX_FLOAT char_left = pPosArray ? pPosArray[cc * 2] : char_box.left * pText->m_TextState.GetFontSize() / 1000;
- FX_FLOAT char_right = pPosArray ? pPosArray[cc * 2 + 1] : char_box.right * pText->m_TextState.GetFontSize() / 1000;
- FX_FLOAT char_top = char_box.top * pText->m_TextState.GetFontSize() / 1000;
- FX_FLOAT char_bottom = char_box.bottom * pText->m_TextState.GetFontSize() / 1000;
- cc ++;
- FX_FLOAT char_origx, char_origy;
- matrix.Transform(char_left, 0, char_origx, char_origy);
- matrix.TransformRect(char_left, char_right, char_top, char_bottom);
- CFX_ByteString str;
- pFont->AppendChar(str, charcode);
- InsertTextBox(NULL, char_origy, char_left, char_right, char_top,
- char_bottom, spacew, fontsize_v, str, pFont);
- }
- if (pPosArray) {
- FX_Free(pPosArray);
- }
- return;
- }
- FX_FLOAT ratio_h = fontsize_h / pText->m_TextState.GetFontSize();
- for (int ii = 0; ii < count * 2; ii ++) {
- pPosArray[ii] *= ratio_h;
- }
- FX_FLOAT baseline = pText->m_PosY;
- CTextBaseLine* pBaseLine = NULL;
- FX_FLOAT topy = pText->m_Top;
- FX_FLOAT bottomy = pText->m_Bottom;
- FX_FLOAT leftx = pText->m_Left;
- int cc = 0;
- CFX_ByteString segment;
- int space_count = 0;
- FX_FLOAT last_left = 0, last_right = 0, segment_left = 0, segment_right = 0;
- for (int i = 0; i < pText->m_nChars; i ++) {
- FX_DWORD charcode = pText->m_nChars == 1 ? (FX_DWORD)(FX_UINTPTR)pText->m_pCharCodes : pText->m_pCharCodes[i];
- if (charcode == (FX_DWORD) - 1) {
- continue;
- }
- FX_FLOAT char_left = pPosArray[cc * 2];
- FX_FLOAT char_right = pPosArray[cc * 2 + 1];
- cc ++;
- if (char_left < last_left || (char_left - last_right) > spacew / 2) {
- pBaseLine = InsertTextBox(pBaseLine, baseline, leftx + segment_left, leftx + segment_right,
- topy, bottomy, spacew, fontsize_v, segment, pFont);
- segment_left = char_left;
- segment = "";
- }
- CFX_WideString wCh = pText->GetFont()->UnicodeFromCharCode(charcode);
- FX_DWORD ch = wCh.GetLength() > 0 ? wCh.GetAt(0) : charcode;
- if (space_count > 1) {
- pBaseLine = InsertTextBox(pBaseLine, baseline, leftx + segment_left, leftx + segment_right,
- topy, bottomy, spacew, fontsize_v, segment, pFont);
- segment = "";
- } else if (space_count == 1) {
- pFont->AppendChar(segment, ' ');
- }
- if (segment.GetLength() == 0) {
- segment_left = char_left;
- }
- segment_right = char_right;
- pFont->AppendChar(segment, charcode);
- space_count = 0;
- last_left = char_left;
- last_right = char_right;
- }
- if (segment.GetLength())
- pBaseLine = InsertTextBox(pBaseLine, baseline, leftx + segment_left, leftx + segment_right,
- topy, bottomy, spacew, fontsize_v, segment, pFont);
- FX_Free(pPosArray);
-}
-static void ConvertPDFString(CFX_ByteString& result, CFX_ByteString& src, CPDF_Font* pFont);
-CTextBaseLine* CTextPage::InsertTextBox(CTextBaseLine* pBaseLine, FX_FLOAT basey, FX_FLOAT leftx,
- FX_FLOAT rightx, FX_FLOAT topy, FX_FLOAT bottomy, FX_FLOAT spacew, FX_FLOAT fontsize_v,
- CFX_ByteString& str, CPDF_Font* pFont)
-{
- if (str.GetLength() == 0) {
- return NULL;
- }
- if (pBaseLine == NULL) {
- int i;
- for (i = 0; i < m_BaseLines.GetSize(); i ++) {
- CTextBaseLine* pExistLine = (CTextBaseLine*)m_BaseLines.GetAt(i);
- if (pExistLine->m_BaseLine == basey) {
- pBaseLine = pExistLine;
- break;
- }
- if (pExistLine->m_BaseLine < basey) {
- break;
- }
- }
- if (pBaseLine == NULL) {
- pBaseLine = FX_NEW CTextBaseLine;
- if (NULL == pBaseLine) {
- return NULL;
- }
- pBaseLine->m_BaseLine = basey;
- m_BaseLines.InsertAt(i, pBaseLine);
- }
- }
- CFX_WideString text;
- FX_LPCSTR pStr = str;
- int len = str.GetLength(), offset = 0;
- while (offset < len) {
- FX_DWORD ch = pFont->GetNextChar(pStr, offset);
- CFX_WideString unicode_str = pFont->UnicodeFromCharCode(ch);
- text += unicode_str;
- }
- pBaseLine->InsertTextBox(leftx, rightx, topy, bottomy, spacew, fontsize_v, text);
- return pBaseLine;
-}
-void CTextPage::WriteOutput(CFX_WideStringArray& lines, int iMinWidth)
-{
- FX_FLOAT lastheight = -1;
- FX_FLOAT lastbaseline = -1;
- FX_FLOAT MinLeftX = 1000000;
- FX_FLOAT MaxRightX = 0;
- int i;
- for (i = 0; i < m_BaseLines.GetSize(); i ++) {
- CTextBaseLine* pBaseLine = (CTextBaseLine*)m_BaseLines.GetAt(i);
- FX_FLOAT leftx, rightx;
- if (pBaseLine->GetWidth(leftx, rightx)) {
- if (leftx < MinLeftX) {
- MinLeftX = leftx;
- }
- if (rightx > MaxRightX) {
- MaxRightX = rightx;
- }
- }
- }
- for (i = 0; i < m_BaseLines.GetSize(); i ++) {
- CTextBaseLine* pBaseLine = (CTextBaseLine*)m_BaseLines.GetAt(i);
- pBaseLine->MergeBoxes();
- }
- for (i = 1; i < m_BaseLines.GetSize(); i ++) {
- CTextBaseLine* pBaseLine = (CTextBaseLine*)m_BaseLines.GetAt(i);
- CTextBaseLine* pPrevLine = (CTextBaseLine*)m_BaseLines.GetAt(i - 1);
- if (pBaseLine->CanMerge(pPrevLine)) {
- pPrevLine->Merge(pBaseLine);
- delete pBaseLine;
- m_BaseLines.RemoveAt(i);
- i --;
- }
- }
- if (m_bAutoWidth) {
- int* widths = FX_Alloc(int, m_BaseLines.GetSize());
- if (widths) {
- for (i = 0; i < m_BaseLines.GetSize(); i ++) {
- widths[i] = 0;
- CTextBaseLine* pBaseLine = (CTextBaseLine*)m_BaseLines.GetAt(i);
- int TotalChars = 0;
- FX_FLOAT TotalWidth = 0;
- int minchars;
- pBaseLine->CountChars(TotalChars, TotalWidth, minchars);
- if (TotalChars) {
- FX_FLOAT charwidth = TotalWidth / TotalChars;
- widths[i] = (int)((MaxRightX - MinLeftX) / charwidth);
- }
- if (widths[i] > 1000) {
- widths[i] = 1000;
- }
- if (widths[i] < minchars) {
- widths[i] = minchars;
- }
- }
- int AvgWidth = 0, widthcount = 0;
- for (i = 0; i < m_BaseLines.GetSize(); i ++)
- if (widths[i]) {
- AvgWidth += widths[i];
- widthcount ++;
- }
- AvgWidth = int((FX_FLOAT)AvgWidth / widthcount + 0.5);
- int MaxWidth = 0;
- for (i = 0; i < m_BaseLines.GetSize(); i ++)
- if (MaxWidth < widths[i]) {
- MaxWidth = widths[i];
- }
- if (MaxWidth > AvgWidth * 6 / 5) {
- MaxWidth = AvgWidth * 6 / 5;
- }
- FX_Free(widths);
- if (iMinWidth < MaxWidth) {
- iMinWidth = MaxWidth;
- }
- }
- }
- for (i = 0; i < m_BaseLines.GetSize(); i ++) {
- CTextBaseLine* pBaseLine = (CTextBaseLine*)m_BaseLines.GetAt(i);
- pBaseLine->MergeBoxes();
- }
- if (m_bKeepColumn) {
- FindColumns();
- }
- for (i = 0; i < m_BaseLines.GetSize(); i ++) {
- CTextBaseLine* pBaseLine = (CTextBaseLine*)m_BaseLines.GetAt(i);
- if (lastheight >= 0) {
- FX_FLOAT dy = lastbaseline - pBaseLine->m_BaseLine;
- if (dy >= (pBaseLine->m_MaxFontSizeV) * 1.5 || dy >= lastheight * 1.5) {
- lines.Add(L"");
- }
- }
- lastheight = pBaseLine->m_MaxFontSizeV;
- lastbaseline = pBaseLine->m_BaseLine;
- CFX_WideString str;
- pBaseLine->WriteOutput(str, MinLeftX, MaxRightX - MinLeftX, iMinWidth);
- lines.Add(str);
- }
-}
-void NormalizeCompositeChar(FX_WCHAR wChar, CFX_WideString& sDest)
-{
- wChar = FX_GetMirrorChar(wChar, TRUE, FALSE);
- FX_LPWSTR pDst = NULL;
- FX_STRSIZE nCount = FX_Unicode_GetNormalization(wChar, pDst);
- if (nCount < 1 ) {
- sDest += wChar;
- return;
- }
- pDst = new FX_WCHAR[nCount];
- FX_Unicode_GetNormalization(wChar, pDst);
- for (int nIndex = 0; nIndex < nCount; nIndex++) {
- sDest += pDst[nIndex];
- }
- delete[] pDst;
-}
-void NormalizeString(CFX_WideString& str)
-{
- if (str.GetLength() <= 0) {
- return;
- }
- CFX_WideString sBuffer;
- IFX_BidiChar* BidiChar = IFX_BidiChar::Create();
- if (NULL == BidiChar) {
- return;
- }
- CFX_WordArray order;
- FX_BOOL bR2L = FALSE;
- FX_INT32 start = 0, count = 0, i = 0;
- int nR2L = 0, nL2R = 0;
- for (i = 0; i < str.GetLength(); i++) {
- if(BidiChar->AppendChar(str.GetAt(i))) {
- FX_INT32 ret = BidiChar->GetBidiInfo(start, count);
- order.Add(start);
- order.Add(count);
- order.Add(ret);
- if(!bR2L) {
- if(ret == 2) {
- nR2L++;
- } else if (ret == 1) {
- nL2R++;
- }
- }
- }
- }
- if(BidiChar->EndChar()) {
- FX_INT32 ret = BidiChar->GetBidiInfo(start, count);
- order.Add(start);
- order.Add(count);
- order.Add(ret);
- if(!bR2L) {
- if(ret == 2) {
- nR2L++;
- } else if(ret == 1) {
- nL2R++;
- }
- }
- }
- if(nR2L > 0 && nR2L >= nL2R) {
- bR2L = TRUE;
- }
- if(bR2L) {
- int count = order.GetSize();
- for(int j = count - 1; j > 0; j -= 3) {
- int ret = order.GetAt(j);
- int start = order.GetAt(j - 2);
- int count1 = order.GetAt(j - 1);
- if(ret == 2 || ret == 0) {
- for(int i = start + count1 - 1; i >= start; i--) {
- NormalizeCompositeChar(str[i], sBuffer);
- }
- } else {
- i = j;
- FX_BOOL bSymbol = FALSE;
- while(i > 0 && order.GetAt(i) != 2) {
- bSymbol = !order.GetAt(i);
- i -= 3;
- }
- int end = start + count1 ;
- int n = 0;
- if(bSymbol) {
- n = i + 6;
- } else {
- n = i + 3;
- }
- if(n >= j) {
- for(int m = start; m < end; m++) {
- sBuffer += str[m];
- }
- } else {
- i = j;
- j = n;
- for(; n <= i; n += 3) {
- int ret = order.GetAt(n);
- int start = order.GetAt(n - 2);
- int count1 = order.GetAt(n - 1);
- int end = start + count1 ;
- for(int m = start; m < end; m++) {
- sBuffer += str[m];
- }
- }
- }
- }
- }
- } else {
- int count = order.GetSize();
- FX_BOOL bL2R = FALSE;
- for(int j = 0; j < count; j += 3) {
- int ret = order.GetAt(j + 2);
- int start = order.GetAt(j);
- int count1 = order.GetAt(j + 1);
- if(ret == 2 || (j == 0 && ret == 0 && !bL2R)) {
- int i = j + 3;
- while(bR2L && i < count) {
- if(order.GetAt(i + 2) == 1) {
- break;
- } else {
- i += 3;
- }
- }
- if(i == 3) {
- j = -3;
- bL2R = TRUE;
- continue;
- }
- int end = str.GetLength() - 1;
- if(i < count) {
- end = order.GetAt(i) - 1;
- }
- j = i - 3;
- for(int n = end; n >= start; n--) {
- NormalizeCompositeChar(str[i], sBuffer);
- }
- } else {
- int end = start + count1 ;
- for(int i = start; i < end; i++) {
- sBuffer += str[i];
- }
- }
- }
- }
- str.Empty();
- str += sBuffer;
- BidiChar->Release();
-}
-static FX_BOOL IsNumber(CFX_WideString& str)
-{
- for (int i = 0; i < str.GetLength(); i ++) {
- FX_WCHAR ch = str[i];
- if ((ch < '0' || ch > '9') && ch != '-' && ch != '+' && ch != '.' && ch != ' ') {
- return FALSE;
- }
- }
- return TRUE;
-}
-void CTextPage::FindColumns()
-{
- int i;
- for (i = 0; i < m_BaseLines.GetSize(); i ++) {
- CTextBaseLine* pBaseLine = (CTextBaseLine*)m_BaseLines.GetAt(i);
- for (int j = 0; j < pBaseLine->m_TextList.GetSize(); j ++) {
- CTextBox* pTextBox = (CTextBox*)pBaseLine->m_TextList.GetAt(j);
- CTextColumn* pColumn = FindColumn(pTextBox->m_Right);
- if (pColumn == NULL) {
- pColumn = FX_NEW CTextColumn;
- if (pColumn) {
- pColumn->m_Count = 1;
- pColumn->m_AvgPos = pTextBox->m_Right;
- pColumn->m_TextPos = -1;
- m_TextColumns.Add(pColumn);
- }
- } else {
- pColumn->m_AvgPos = (pColumn->m_Count * pColumn->m_AvgPos + pTextBox->m_Right) /
- (pColumn->m_Count + 1);
- pColumn->m_Count ++;
- }
- }
- }
- int mincount = m_BaseLines.GetSize() / 4;
- for (i = 0; i < m_TextColumns.GetSize(); i ++) {
- CTextColumn* pTextColumn = (CTextColumn*)m_TextColumns.GetAt(i);
- if (pTextColumn->m_Count >= mincount) {
- continue;
- }
- delete pTextColumn;
- m_TextColumns.RemoveAt(i);
- i --;
- }
- for (i = 0; i < m_BaseLines.GetSize(); i ++) {
- CTextBaseLine* pBaseLine = (CTextBaseLine*)m_BaseLines.GetAt(i);
- for (int j = 0; j < pBaseLine->m_TextList.GetSize(); j ++) {
- CTextBox* pTextBox = (CTextBox*)pBaseLine->m_TextList.GetAt(j);
- if (IsNumber(pTextBox->m_Text)) {
- pTextBox->m_pColumn = FindColumn(pTextBox->m_Right);
- }
- }
- }
-}
-CTextColumn* CTextPage::FindColumn(FX_FLOAT xpos)
-{
- for (int i = 0; i < m_TextColumns.GetSize(); i ++) {
- CTextColumn* pColumn = (CTextColumn*)m_TextColumns.GetAt(i);
- if (pColumn->m_AvgPos < xpos + 1 && pColumn->m_AvgPos > xpos - 1) {
- return pColumn;
- }
- }
- return NULL;
-}
-void CTextPage::BreakSpace(CPDF_TextObject* pTextObj)
-{
-}
-CTextBaseLine::CTextBaseLine()
-{
- m_Top = -100000;
- m_Bottom = 100000;
- m_MaxFontSizeV = 0;
-}
-CTextBaseLine::~CTextBaseLine()
-{
- for (int i = 0; i < m_TextList.GetSize(); i ++) {
- CTextBox* pText = (CTextBox*)m_TextList.GetAt(i);
- delete pText;
- }
-}
-void CTextBaseLine::InsertTextBox(FX_FLOAT leftx, FX_FLOAT rightx, FX_FLOAT topy, FX_FLOAT bottomy,
- FX_FLOAT spacew, FX_FLOAT fontsize_v, const CFX_WideString& text)
-{
- if (m_Top < topy) {
- m_Top = topy;
- }
- if (m_Bottom > bottomy) {
- m_Bottom = bottomy;
- }
- if (m_MaxFontSizeV < fontsize_v) {
- m_MaxFontSizeV = fontsize_v;
- }
- int i;
- for (i = 0; i < m_TextList.GetSize(); i ++) {
- CTextBox* pText = (CTextBox*)m_TextList.GetAt(i);
- if (pText->m_Left > leftx) {
- break;
- }
- }
- CTextBox* pText = FX_NEW CTextBox;
- if (NULL == pText) {
- return;
- }
- pText->m_Text = text;
- pText->m_Left = leftx;
- pText->m_Right = rightx;
- pText->m_Top = topy;
- pText->m_Bottom = bottomy;
- pText->m_SpaceWidth = spacew;
- pText->m_FontSizeV = fontsize_v;
- pText->m_pColumn = NULL;
- m_TextList.InsertAt(i, pText);
-}
-FX_BOOL GetIntersection(FX_FLOAT low1, FX_FLOAT high1, FX_FLOAT low2, FX_FLOAT high2,
- FX_FLOAT& interlow, FX_FLOAT& interhigh);
-FX_BOOL CTextBaseLine::CanMerge(CTextBaseLine* pOther)
-{
- FX_FLOAT inter_top, inter_bottom;
- if (!GetIntersection(m_Bottom, m_Top, pOther->m_Bottom, pOther->m_Top,
- inter_bottom, inter_top)) {
- return FALSE;
- }
- FX_FLOAT inter_h = inter_top - inter_bottom;
- if (inter_h < (m_Top - m_Bottom) / 2 && inter_h < (pOther->m_Top - pOther->m_Bottom) / 2) {
- return FALSE;
- }
- FX_FLOAT dy = (FX_FLOAT)FXSYS_fabs(m_BaseLine - pOther->m_BaseLine);
- for (int i = 0; i < m_TextList.GetSize(); i ++) {
- CTextBox* pText = (CTextBox*)m_TextList.GetAt(i);
- FX_FLOAT width = pText->m_Right - pText->m_Left;
- for (int j = 0; j < pOther->m_TextList.GetSize(); j ++) {
- CTextBox* pOtherText = (CTextBox*)pOther->m_TextList.GetAt(j);
- FX_FLOAT inter_left, inter_right;
- if (!GetIntersection(pText->m_Left, pText->m_Right,
- pOtherText->m_Left, pOtherText->m_Right, inter_left, inter_right)) {
- continue;
- }
- FX_FLOAT inter_w = inter_right - inter_left;
- if (inter_w < pText->m_SpaceWidth / 2 && inter_w < pOtherText->m_SpaceWidth / 2) {
- continue;
- }
- if (dy >= (pText->m_Bottom - pText->m_Top) / 2 ||
- dy >= (pOtherText->m_Bottom - pOtherText->m_Top) / 2) {
- return FALSE;
- }
- }
- }
- return TRUE;
-}
-void CTextBaseLine::Merge(CTextBaseLine* pOther)
-{
- for (int i = 0; i < pOther->m_TextList.GetSize(); i ++) {
- CTextBox* pText = (CTextBox*)pOther->m_TextList.GetAt(i);
- InsertTextBox(pText->m_Left, pText->m_Right, pText->m_Top, pText->m_Bottom,
- pText->m_SpaceWidth, pText->m_FontSizeV, pText->m_Text);
- }
-}
-FX_BOOL CTextBaseLine::GetWidth(FX_FLOAT& leftx, FX_FLOAT& rightx)
-{
- int i;
- for (i = 0; i < m_TextList.GetSize(); i ++) {
- CTextBox* pText = (CTextBox*)m_TextList.GetAt(i);
- if (pText->m_Text != L" ") {
- break;
- }
- }
- if (i == m_TextList.GetSize()) {
- return FALSE;
- }
- CTextBox* pText = (CTextBox*)m_TextList.GetAt(i);
- leftx = pText->m_Left;
- for (i = m_TextList.GetSize() - 1; i >= 0; i --) {
- CTextBox* pText = (CTextBox*)m_TextList.GetAt(i);
- if (pText->m_Text != L" ") {
- break;
- }
- }
- pText = (CTextBox*)m_TextList.GetAt(i);
- rightx = pText->m_Right;
- return TRUE;
-}
-void CTextBaseLine::MergeBoxes()
-{
- int i = 0;
- while (1) {
- if (i >= m_TextList.GetSize() - 1) {
- break;
- }
- CTextBox* pThisText = (CTextBox*)m_TextList.GetAt(i);
- CTextBox* pNextText = (CTextBox*)m_TextList.GetAt(i + 1);
- FX_FLOAT dx = pNextText->m_Left - pThisText->m_Right;
- FX_FLOAT spacew = (pThisText->m_SpaceWidth == 0.0) ?
- pNextText->m_SpaceWidth : pThisText->m_SpaceWidth;
- if (spacew > 0.0 && dx < spacew * 2) {
- pThisText->m_Right = pNextText->m_Right;
- if (dx > spacew * 1.5) {
- pThisText->m_Text += L" ";
- } else if (dx > spacew / 3) {
- pThisText->m_Text += L' ';
- }
- pThisText->m_Text += pNextText->m_Text;
- pThisText->m_SpaceWidth = pNextText->m_SpaceWidth == 0.0 ?
- spacew : pNextText->m_SpaceWidth;
- m_TextList.RemoveAt(i + 1);
- delete pNextText;
- } else {
- i ++;
- }
- }
-}
-void CTextBaseLine::WriteOutput(CFX_WideString& str, FX_FLOAT leftx, FX_FLOAT pagewidth,
- int iTextWidth)
-{
- int lastpos = -1;
- for (int i = 0; i < m_TextList.GetSize(); i ++) {
- CTextBox* pText = (CTextBox*)m_TextList.GetAt(i);
- int xpos;
- if (pText->m_pColumn) {
- xpos = (int)((pText->m_pColumn->m_AvgPos - leftx) * iTextWidth / pagewidth + 0.5);
- xpos -= pText->m_Text.GetLength();
- } else {
- xpos = (int)((pText->m_Left - leftx) * iTextWidth / pagewidth + 0.5);
- }
- if (xpos <= lastpos) {
- xpos = lastpos + 1;
- }
- for (int j = lastpos + 1; j < xpos; j ++) {
- str += ' ';
- }
- CFX_WideString sSrc(pText->m_Text);
- NormalizeString(sSrc);
- str += sSrc;
- str += ' ';
- lastpos = xpos + pText->m_Text.GetLength();
- }
-}
-void CTextBaseLine::CountChars(int& count, FX_FLOAT& width, int& minchars)
-{
- minchars = 0;
- for (int i = 0; i < m_TextList.GetSize(); i ++) {
- CTextBox* pText = (CTextBox*)m_TextList.GetAt(i);
- if (pText->m_Right - pText->m_Left < 0.002) {
- continue;
- }
- count += pText->m_Text.GetLength();
- width += pText->m_Right - pText->m_Left;
- minchars += pText->m_Text.GetLength() + 1;
- }
-}
-#define PI 3.1415926535897932384626433832795
-static void CheckRotate(CPDF_Page& page, CFX_FloatRect& page_bbox)
-{
- int total_count = 0, rotated_count[3] = {0, 0, 0};
- FX_POSITION pos = page.GetFirstObjectPosition();
- while (pos) {
- CPDF_PageObject* pObj = page.GetNextObject(pos);
- if (pObj->m_Type != PDFPAGE_TEXT) {
- continue;
- }
- total_count ++;
- CPDF_TextObject* pText = (CPDF_TextObject*)pObj;
- FX_FLOAT angle = pText->m_TextState.GetBaselineAngle();
- if (angle == 0.0) {
- continue;
- }
- int degree = (int)(angle * 180 / PI + 0.5);
- if (degree % 90) {
- continue;
- }
- if (degree < 0) {
- degree += 360;
- }
- int index = degree / 90 % 3 - 1;
- if (index < 0) {
- continue;
- }
- rotated_count[index] ++;
- }
- if (total_count == 0) {
- return;
- }
- CFX_AffineMatrix matrix;
- if (rotated_count[0] > total_count * 2 / 3) {
- matrix.Set(0, -1, 1, 0, 0, page.GetPageHeight());
- } else if (rotated_count[1] > total_count * 2 / 3) {
- matrix.Set(-1, 0, 0, -1, page.GetPageWidth(), page.GetPageHeight());
- } else if (rotated_count[2] > total_count * 2 / 3) {
- matrix.Set(0, 1, -1, 0, page.GetPageWidth(), 0);
- } else {
- return;
- }
- page.Transform(matrix);
- page_bbox.Transform(&matrix);
-}
-void PDF_GetPageText_Unicode(CFX_WideStringArray& lines, CPDF_Document* pDoc, CPDF_Dictionary* pPage,
- int iMinWidth, FX_DWORD flags)
-{
- lines.RemoveAll();
- if (pPage == NULL) {
- return;
- }
- CPDF_Page page;
- page.Load(pDoc, pPage);
- CPDF_ParseOptions options;
- options.m_bTextOnly = TRUE;
- options.m_bSeparateForm = FALSE;
- page.ParseContent(&options);
- CFX_FloatRect page_bbox = page.GetPageBBox();
- if (flags & PDF2TXT_AUTO_ROTATE) {
- CheckRotate(page, page_bbox);
- }
- CTextPage texts;
- texts.m_bAutoWidth = flags & PDF2TXT_AUTO_WIDTH;
- texts.m_bKeepColumn = flags & PDF2TXT_KEEP_COLUMN;
- texts.m_bBreakSpace = TRUE;
- FX_POSITION pos = page.GetFirstObjectPosition();
- while (pos) {
- CPDF_PageObject* pObject = page.GetNextObject(pos);
- if (!(flags & PDF2TXT_INCLUDE_INVISIBLE)) {
- CFX_FloatRect rect(pObject->m_Left, pObject->m_Bottom, pObject->m_Right, pObject->m_Top);
- if (!page_bbox.Contains(rect)) {
- continue;
- }
- }
- texts.ProcessObject(pObject);
- }
- texts.WriteOutput(lines, iMinWidth);
-}
-void PDF_GetPageText(CFX_ByteStringArray& lines, CPDF_Document* pDoc, CPDF_Dictionary* pPage,
- int iMinWidth, FX_DWORD flags)
-{
- lines.RemoveAll();
- CFX_WideStringArray wlines;
- PDF_GetPageText_Unicode(wlines, pDoc, pPage, iMinWidth, flags);
- for (int i = 0; i < wlines.GetSize(); i ++) {
- CFX_WideString wstr = wlines[i];
- CFX_ByteString str;
- for (int c = 0; c < wstr.GetLength(); c ++) {
- str += CharFromUnicodeAlt(wstr[c], FXSYS_GetACP(), "?");
- }
- lines.Add(str);
- }
-}
-#endif
-extern void _PDF_GetTextStream_Unicode(CFX_WideTextBuf& buffer, CPDF_PageObjects* pPage, FX_BOOL bUseLF,
- CFX_PtrArray* pObjArray);
-void PDF_GetTextStream_Unicode(CFX_WideTextBuf& buffer, CPDF_Document* pDoc, CPDF_Dictionary* pPage, FX_DWORD flags)
-{
- buffer.EstimateSize(0, 10240);
- CPDF_Page page;
- page.Load(pDoc, pPage);
- CPDF_ParseOptions options;
- options.m_bTextOnly = TRUE;
- options.m_bSeparateForm = FALSE;
- page.ParseContent(&options);
- _PDF_GetTextStream_Unicode(buffer, &page, TRUE, NULL);
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fpdfapi/fpdf_page.h"
+#include "../../include/fpdfapi/fpdf_pageobj.h"
+#include "../../include/fpdftext/fpdf_text.h"
+#include "txtproc.h"
+#include "text_int.h"
+#if !defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_)
+extern FX_LPCSTR FCS_GetAltStr(FX_WCHAR);
+CFX_ByteString CharFromUnicodeAlt(FX_WCHAR unicode, int destcp, FX_LPCSTR defchar)
+{
+ if (destcp == 0) {
+ if (unicode < 0x80) {
+ return CFX_ByteString((char)unicode);
+ }
+ FX_LPCSTR altstr = FCS_GetAltStr(unicode);
+ if (altstr) {
+ return CFX_ByteString(altstr, -1);
+ }
+ return CFX_ByteString(defchar, -1);
+ }
+ FX_BOOL bDef = FALSE;
+ char buf[10];
+ int ret = FXSYS_WideCharToMultiByte(destcp, 0, (wchar_t*)&unicode, 1, buf, 10, NULL, &bDef);
+ if (ret && !bDef) {
+ return CFX_ByteString(buf, ret);
+ }
+ FX_LPCSTR altstr = FCS_GetAltStr(unicode);
+ if (altstr) {
+ return CFX_ByteString(altstr, -1);
+ }
+ return CFX_ByteString(defchar, -1);
+}
+CTextPage::CTextPage()
+{
+}
+CTextPage::~CTextPage()
+{
+ int i;
+ for (i = 0; i < m_BaseLines.GetSize(); i ++) {
+ CTextBaseLine* pBaseLine = (CTextBaseLine*)m_BaseLines.GetAt(i);
+ delete pBaseLine;
+ }
+ for (i = 0; i < m_TextColumns.GetSize(); i ++) {
+ CTextColumn* pTextColumn = (CTextColumn*)m_TextColumns.GetAt(i);
+ delete pTextColumn;
+ }
+}
+void CTextPage::ProcessObject(CPDF_PageObject* pObject)
+{
+ if (pObject->m_Type != PDFPAGE_TEXT) {
+ return;
+ }
+ CPDF_TextObject* pText = (CPDF_TextObject*)pObject;
+ CPDF_Font* pFont = pText->m_TextState.GetFont();
+ int count = pText->CountItems();
+ FX_FLOAT* pPosArray = FX_Alloc(FX_FLOAT, count * 2);
+ if (pPosArray) {
+ pText->CalcCharPos(pPosArray);
+ }
+ FX_FLOAT fontsize_h = pText->m_TextState.GetFontSizeH();
+ FX_FLOAT fontsize_v = pText->m_TextState.GetFontSizeV();
+ FX_DWORD space_charcode = pFont->CharCodeFromUnicode(' ');
+ FX_FLOAT spacew = 0;
+ if (space_charcode != -1) {
+ spacew = fontsize_h * pFont->GetCharWidthF(space_charcode) / 1000;
+ }
+ if (spacew == 0) {
+ spacew = fontsize_h / 4;
+ }
+ if (pText->m_TextState.GetBaselineAngle() != 0) {
+ int cc = 0;
+ CFX_AffineMatrix matrix;
+ pText->GetTextMatrix(&matrix);
+ for (int i = 0; i < pText->m_nChars; i ++) {
+ FX_DWORD charcode = pText->m_nChars == 1 ? (FX_DWORD)(FX_UINTPTR)pText->m_pCharCodes : pText->m_pCharCodes[i];
+ if (charcode == (FX_DWORD) - 1) {
+ continue;
+ }
+ FX_RECT char_box;
+ pFont->GetCharBBox(charcode, char_box);
+ FX_FLOAT char_left = pPosArray ? pPosArray[cc * 2] : char_box.left * pText->m_TextState.GetFontSize() / 1000;
+ FX_FLOAT char_right = pPosArray ? pPosArray[cc * 2 + 1] : char_box.right * pText->m_TextState.GetFontSize() / 1000;
+ FX_FLOAT char_top = char_box.top * pText->m_TextState.GetFontSize() / 1000;
+ FX_FLOAT char_bottom = char_box.bottom * pText->m_TextState.GetFontSize() / 1000;
+ cc ++;
+ FX_FLOAT char_origx, char_origy;
+ matrix.Transform(char_left, 0, char_origx, char_origy);
+ matrix.TransformRect(char_left, char_right, char_top, char_bottom);
+ CFX_ByteString str;
+ pFont->AppendChar(str, charcode);
+ InsertTextBox(NULL, char_origy, char_left, char_right, char_top,
+ char_bottom, spacew, fontsize_v, str, pFont);
+ }
+ if (pPosArray) {
+ FX_Free(pPosArray);
+ }
+ return;
+ }
+ FX_FLOAT ratio_h = fontsize_h / pText->m_TextState.GetFontSize();
+ for (int ii = 0; ii < count * 2; ii ++) {
+ pPosArray[ii] *= ratio_h;
+ }
+ FX_FLOAT baseline = pText->m_PosY;
+ CTextBaseLine* pBaseLine = NULL;
+ FX_FLOAT topy = pText->m_Top;
+ FX_FLOAT bottomy = pText->m_Bottom;
+ FX_FLOAT leftx = pText->m_Left;
+ int cc = 0;
+ CFX_ByteString segment;
+ int space_count = 0;
+ FX_FLOAT last_left = 0, last_right = 0, segment_left = 0, segment_right = 0;
+ for (int i = 0; i < pText->m_nChars; i ++) {
+ FX_DWORD charcode = pText->m_nChars == 1 ? (FX_DWORD)(FX_UINTPTR)pText->m_pCharCodes : pText->m_pCharCodes[i];
+ if (charcode == (FX_DWORD) - 1) {
+ continue;
+ }
+ FX_FLOAT char_left = pPosArray[cc * 2];
+ FX_FLOAT char_right = pPosArray[cc * 2 + 1];
+ cc ++;
+ if (char_left < last_left || (char_left - last_right) > spacew / 2) {
+ pBaseLine = InsertTextBox(pBaseLine, baseline, leftx + segment_left, leftx + segment_right,
+ topy, bottomy, spacew, fontsize_v, segment, pFont);
+ segment_left = char_left;
+ segment = "";
+ }
+ CFX_WideString wCh = pText->GetFont()->UnicodeFromCharCode(charcode);
+ FX_DWORD ch = wCh.GetLength() > 0 ? wCh.GetAt(0) : charcode;
+ if (space_count > 1) {
+ pBaseLine = InsertTextBox(pBaseLine, baseline, leftx + segment_left, leftx + segment_right,
+ topy, bottomy, spacew, fontsize_v, segment, pFont);
+ segment = "";
+ } else if (space_count == 1) {
+ pFont->AppendChar(segment, ' ');
+ }
+ if (segment.GetLength() == 0) {
+ segment_left = char_left;
+ }
+ segment_right = char_right;
+ pFont->AppendChar(segment, charcode);
+ space_count = 0;
+ last_left = char_left;
+ last_right = char_right;
+ }
+ if (segment.GetLength())
+ pBaseLine = InsertTextBox(pBaseLine, baseline, leftx + segment_left, leftx + segment_right,
+ topy, bottomy, spacew, fontsize_v, segment, pFont);
+ FX_Free(pPosArray);
+}
+static void ConvertPDFString(CFX_ByteString& result, CFX_ByteString& src, CPDF_Font* pFont);
+CTextBaseLine* CTextPage::InsertTextBox(CTextBaseLine* pBaseLine, FX_FLOAT basey, FX_FLOAT leftx,
+ FX_FLOAT rightx, FX_FLOAT topy, FX_FLOAT bottomy, FX_FLOAT spacew, FX_FLOAT fontsize_v,
+ CFX_ByteString& str, CPDF_Font* pFont)
+{
+ if (str.GetLength() == 0) {
+ return NULL;
+ }
+ if (pBaseLine == NULL) {
+ int i;
+ for (i = 0; i < m_BaseLines.GetSize(); i ++) {
+ CTextBaseLine* pExistLine = (CTextBaseLine*)m_BaseLines.GetAt(i);
+ if (pExistLine->m_BaseLine == basey) {
+ pBaseLine = pExistLine;
+ break;
+ }
+ if (pExistLine->m_BaseLine < basey) {
+ break;
+ }
+ }
+ if (pBaseLine == NULL) {
+ pBaseLine = FX_NEW CTextBaseLine;
+ if (NULL == pBaseLine) {
+ return NULL;
+ }
+ pBaseLine->m_BaseLine = basey;
+ m_BaseLines.InsertAt(i, pBaseLine);
+ }
+ }
+ CFX_WideString text;
+ FX_LPCSTR pStr = str;
+ int len = str.GetLength(), offset = 0;
+ while (offset < len) {
+ FX_DWORD ch = pFont->GetNextChar(pStr, offset);
+ CFX_WideString unicode_str = pFont->UnicodeFromCharCode(ch);
+ text += unicode_str;
+ }
+ pBaseLine->InsertTextBox(leftx, rightx, topy, bottomy, spacew, fontsize_v, text);
+ return pBaseLine;
+}
+void CTextPage::WriteOutput(CFX_WideStringArray& lines, int iMinWidth)
+{
+ FX_FLOAT lastheight = -1;
+ FX_FLOAT lastbaseline = -1;
+ FX_FLOAT MinLeftX = 1000000;
+ FX_FLOAT MaxRightX = 0;
+ int i;
+ for (i = 0; i < m_BaseLines.GetSize(); i ++) {
+ CTextBaseLine* pBaseLine = (CTextBaseLine*)m_BaseLines.GetAt(i);
+ FX_FLOAT leftx, rightx;
+ if (pBaseLine->GetWidth(leftx, rightx)) {
+ if (leftx < MinLeftX) {
+ MinLeftX = leftx;
+ }
+ if (rightx > MaxRightX) {
+ MaxRightX = rightx;
+ }
+ }
+ }
+ for (i = 0; i < m_BaseLines.GetSize(); i ++) {
+ CTextBaseLine* pBaseLine = (CTextBaseLine*)m_BaseLines.GetAt(i);
+ pBaseLine->MergeBoxes();
+ }
+ for (i = 1; i < m_BaseLines.GetSize(); i ++) {
+ CTextBaseLine* pBaseLine = (CTextBaseLine*)m_BaseLines.GetAt(i);
+ CTextBaseLine* pPrevLine = (CTextBaseLine*)m_BaseLines.GetAt(i - 1);
+ if (pBaseLine->CanMerge(pPrevLine)) {
+ pPrevLine->Merge(pBaseLine);
+ delete pBaseLine;
+ m_BaseLines.RemoveAt(i);
+ i --;
+ }
+ }
+ if (m_bAutoWidth) {
+ int* widths = FX_Alloc(int, m_BaseLines.GetSize());
+ if (widths) {
+ for (i = 0; i < m_BaseLines.GetSize(); i ++) {
+ widths[i] = 0;
+ CTextBaseLine* pBaseLine = (CTextBaseLine*)m_BaseLines.GetAt(i);
+ int TotalChars = 0;
+ FX_FLOAT TotalWidth = 0;
+ int minchars;
+ pBaseLine->CountChars(TotalChars, TotalWidth, minchars);
+ if (TotalChars) {
+ FX_FLOAT charwidth = TotalWidth / TotalChars;
+ widths[i] = (int)((MaxRightX - MinLeftX) / charwidth);
+ }
+ if (widths[i] > 1000) {
+ widths[i] = 1000;
+ }
+ if (widths[i] < minchars) {
+ widths[i] = minchars;
+ }
+ }
+ int AvgWidth = 0, widthcount = 0;
+ for (i = 0; i < m_BaseLines.GetSize(); i ++)
+ if (widths[i]) {
+ AvgWidth += widths[i];
+ widthcount ++;
+ }
+ AvgWidth = int((FX_FLOAT)AvgWidth / widthcount + 0.5);
+ int MaxWidth = 0;
+ for (i = 0; i < m_BaseLines.GetSize(); i ++)
+ if (MaxWidth < widths[i]) {
+ MaxWidth = widths[i];
+ }
+ if (MaxWidth > AvgWidth * 6 / 5) {
+ MaxWidth = AvgWidth * 6 / 5;
+ }
+ FX_Free(widths);
+ if (iMinWidth < MaxWidth) {
+ iMinWidth = MaxWidth;
+ }
+ }
+ }
+ for (i = 0; i < m_BaseLines.GetSize(); i ++) {
+ CTextBaseLine* pBaseLine = (CTextBaseLine*)m_BaseLines.GetAt(i);
+ pBaseLine->MergeBoxes();
+ }
+ if (m_bKeepColumn) {
+ FindColumns();
+ }
+ for (i = 0; i < m_BaseLines.GetSize(); i ++) {
+ CTextBaseLine* pBaseLine = (CTextBaseLine*)m_BaseLines.GetAt(i);
+ if (lastheight >= 0) {
+ FX_FLOAT dy = lastbaseline - pBaseLine->m_BaseLine;
+ if (dy >= (pBaseLine->m_MaxFontSizeV) * 1.5 || dy >= lastheight * 1.5) {
+ lines.Add(L"");
+ }
+ }
+ lastheight = pBaseLine->m_MaxFontSizeV;
+ lastbaseline = pBaseLine->m_BaseLine;
+ CFX_WideString str;
+ pBaseLine->WriteOutput(str, MinLeftX, MaxRightX - MinLeftX, iMinWidth);
+ lines.Add(str);
+ }
+}
+void NormalizeCompositeChar(FX_WCHAR wChar, CFX_WideString& sDest)
+{
+ wChar = FX_GetMirrorChar(wChar, TRUE, FALSE);
+ FX_LPWSTR pDst = NULL;
+ FX_STRSIZE nCount = FX_Unicode_GetNormalization(wChar, pDst);
+ if (nCount < 1 ) {
+ sDest += wChar;
+ return;
+ }
+ pDst = new FX_WCHAR[nCount];
+ FX_Unicode_GetNormalization(wChar, pDst);
+ for (int nIndex = 0; nIndex < nCount; nIndex++) {
+ sDest += pDst[nIndex];
+ }
+ delete[] pDst;
+}
+void NormalizeString(CFX_WideString& str)
+{
+ if (str.GetLength() <= 0) {
+ return;
+ }
+ CFX_WideString sBuffer;
+ IFX_BidiChar* BidiChar = IFX_BidiChar::Create();
+ if (NULL == BidiChar) {
+ return;
+ }
+ CFX_WordArray order;
+ FX_BOOL bR2L = FALSE;
+ FX_INT32 start = 0, count = 0, i = 0;
+ int nR2L = 0, nL2R = 0;
+ for (i = 0; i < str.GetLength(); i++) {
+ if(BidiChar->AppendChar(str.GetAt(i))) {
+ FX_INT32 ret = BidiChar->GetBidiInfo(start, count);
+ order.Add(start);
+ order.Add(count);
+ order.Add(ret);
+ if(!bR2L) {
+ if(ret == 2) {
+ nR2L++;
+ } else if (ret == 1) {
+ nL2R++;
+ }
+ }
+ }
+ }
+ if(BidiChar->EndChar()) {
+ FX_INT32 ret = BidiChar->GetBidiInfo(start, count);
+ order.Add(start);
+ order.Add(count);
+ order.Add(ret);
+ if(!bR2L) {
+ if(ret == 2) {
+ nR2L++;
+ } else if(ret == 1) {
+ nL2R++;
+ }
+ }
+ }
+ if(nR2L > 0 && nR2L >= nL2R) {
+ bR2L = TRUE;
+ }
+ if(bR2L) {
+ int count = order.GetSize();
+ for(int j = count - 1; j > 0; j -= 3) {
+ int ret = order.GetAt(j);
+ int start = order.GetAt(j - 2);
+ int count1 = order.GetAt(j - 1);
+ if(ret == 2 || ret == 0) {
+ for(int i = start + count1 - 1; i >= start; i--) {
+ NormalizeCompositeChar(str[i], sBuffer);
+ }
+ } else {
+ i = j;
+ FX_BOOL bSymbol = FALSE;
+ while(i > 0 && order.GetAt(i) != 2) {
+ bSymbol = !order.GetAt(i);
+ i -= 3;
+ }
+ int end = start + count1 ;
+ int n = 0;
+ if(bSymbol) {
+ n = i + 6;
+ } else {
+ n = i + 3;
+ }
+ if(n >= j) {
+ for(int m = start; m < end; m++) {
+ sBuffer += str[m];
+ }
+ } else {
+ i = j;
+ j = n;
+ for(; n <= i; n += 3) {
+ int ret = order.GetAt(n);
+ int start = order.GetAt(n - 2);
+ int count1 = order.GetAt(n - 1);
+ int end = start + count1 ;
+ for(int m = start; m < end; m++) {
+ sBuffer += str[m];
+ }
+ }
+ }
+ }
+ }
+ } else {
+ int count = order.GetSize();
+ FX_BOOL bL2R = FALSE;
+ for(int j = 0; j < count; j += 3) {
+ int ret = order.GetAt(j + 2);
+ int start = order.GetAt(j);
+ int count1 = order.GetAt(j + 1);
+ if(ret == 2 || (j == 0 && ret == 0 && !bL2R)) {
+ int i = j + 3;
+ while(bR2L && i < count) {
+ if(order.GetAt(i + 2) == 1) {
+ break;
+ } else {
+ i += 3;
+ }
+ }
+ if(i == 3) {
+ j = -3;
+ bL2R = TRUE;
+ continue;
+ }
+ int end = str.GetLength() - 1;
+ if(i < count) {
+ end = order.GetAt(i) - 1;
+ }
+ j = i - 3;
+ for(int n = end; n >= start; n--) {
+ NormalizeCompositeChar(str[i], sBuffer);
+ }
+ } else {
+ int end = start + count1 ;
+ for(int i = start; i < end; i++) {
+ sBuffer += str[i];
+ }
+ }
+ }
+ }
+ str.Empty();
+ str += sBuffer;
+ BidiChar->Release();
+}
+static FX_BOOL IsNumber(CFX_WideString& str)
+{
+ for (int i = 0; i < str.GetLength(); i ++) {
+ FX_WCHAR ch = str[i];
+ if ((ch < '0' || ch > '9') && ch != '-' && ch != '+' && ch != '.' && ch != ' ') {
+ return FALSE;
+ }
+ }
+ return TRUE;
+}
+void CTextPage::FindColumns()
+{
+ int i;
+ for (i = 0; i < m_BaseLines.GetSize(); i ++) {
+ CTextBaseLine* pBaseLine = (CTextBaseLine*)m_BaseLines.GetAt(i);
+ for (int j = 0; j < pBaseLine->m_TextList.GetSize(); j ++) {
+ CTextBox* pTextBox = (CTextBox*)pBaseLine->m_TextList.GetAt(j);
+ CTextColumn* pColumn = FindColumn(pTextBox->m_Right);
+ if (pColumn == NULL) {
+ pColumn = FX_NEW CTextColumn;
+ if (pColumn) {
+ pColumn->m_Count = 1;
+ pColumn->m_AvgPos = pTextBox->m_Right;
+ pColumn->m_TextPos = -1;
+ m_TextColumns.Add(pColumn);
+ }
+ } else {
+ pColumn->m_AvgPos = (pColumn->m_Count * pColumn->m_AvgPos + pTextBox->m_Right) /
+ (pColumn->m_Count + 1);
+ pColumn->m_Count ++;
+ }
+ }
+ }
+ int mincount = m_BaseLines.GetSize() / 4;
+ for (i = 0; i < m_TextColumns.GetSize(); i ++) {
+ CTextColumn* pTextColumn = (CTextColumn*)m_TextColumns.GetAt(i);
+ if (pTextColumn->m_Count >= mincount) {
+ continue;
+ }
+ delete pTextColumn;
+ m_TextColumns.RemoveAt(i);
+ i --;
+ }
+ for (i = 0; i < m_BaseLines.GetSize(); i ++) {
+ CTextBaseLine* pBaseLine = (CTextBaseLine*)m_BaseLines.GetAt(i);
+ for (int j = 0; j < pBaseLine->m_TextList.GetSize(); j ++) {
+ CTextBox* pTextBox = (CTextBox*)pBaseLine->m_TextList.GetAt(j);
+ if (IsNumber(pTextBox->m_Text)) {
+ pTextBox->m_pColumn = FindColumn(pTextBox->m_Right);
+ }
+ }
+ }
+}
+CTextColumn* CTextPage::FindColumn(FX_FLOAT xpos)
+{
+ for (int i = 0; i < m_TextColumns.GetSize(); i ++) {
+ CTextColumn* pColumn = (CTextColumn*)m_TextColumns.GetAt(i);
+ if (pColumn->m_AvgPos < xpos + 1 && pColumn->m_AvgPos > xpos - 1) {
+ return pColumn;
+ }
+ }
+ return NULL;
+}
+void CTextPage::BreakSpace(CPDF_TextObject* pTextObj)
+{
+}
+CTextBaseLine::CTextBaseLine()
+{
+ m_Top = -100000;
+ m_Bottom = 100000;
+ m_MaxFontSizeV = 0;
+}
+CTextBaseLine::~CTextBaseLine()
+{
+ for (int i = 0; i < m_TextList.GetSize(); i ++) {
+ CTextBox* pText = (CTextBox*)m_TextList.GetAt(i);
+ delete pText;
+ }
+}
+void CTextBaseLine::InsertTextBox(FX_FLOAT leftx, FX_FLOAT rightx, FX_FLOAT topy, FX_FLOAT bottomy,
+ FX_FLOAT spacew, FX_FLOAT fontsize_v, const CFX_WideString& text)
+{
+ if (m_Top < topy) {
+ m_Top = topy;
+ }
+ if (m_Bottom > bottomy) {
+ m_Bottom = bottomy;
+ }
+ if (m_MaxFontSizeV < fontsize_v) {
+ m_MaxFontSizeV = fontsize_v;
+ }
+ int i;
+ for (i = 0; i < m_TextList.GetSize(); i ++) {
+ CTextBox* pText = (CTextBox*)m_TextList.GetAt(i);
+ if (pText->m_Left > leftx) {
+ break;
+ }
+ }
+ CTextBox* pText = FX_NEW CTextBox;
+ if (NULL == pText) {
+ return;
+ }
+ pText->m_Text = text;
+ pText->m_Left = leftx;
+ pText->m_Right = rightx;
+ pText->m_Top = topy;
+ pText->m_Bottom = bottomy;
+ pText->m_SpaceWidth = spacew;
+ pText->m_FontSizeV = fontsize_v;
+ pText->m_pColumn = NULL;
+ m_TextList.InsertAt(i, pText);
+}
+FX_BOOL GetIntersection(FX_FLOAT low1, FX_FLOAT high1, FX_FLOAT low2, FX_FLOAT high2,
+ FX_FLOAT& interlow, FX_FLOAT& interhigh);
+FX_BOOL CTextBaseLine::CanMerge(CTextBaseLine* pOther)
+{
+ FX_FLOAT inter_top, inter_bottom;
+ if (!GetIntersection(m_Bottom, m_Top, pOther->m_Bottom, pOther->m_Top,
+ inter_bottom, inter_top)) {
+ return FALSE;
+ }
+ FX_FLOAT inter_h = inter_top - inter_bottom;
+ if (inter_h < (m_Top - m_Bottom) / 2 && inter_h < (pOther->m_Top - pOther->m_Bottom) / 2) {
+ return FALSE;
+ }
+ FX_FLOAT dy = (FX_FLOAT)FXSYS_fabs(m_BaseLine - pOther->m_BaseLine);
+ for (int i = 0; i < m_TextList.GetSize(); i ++) {
+ CTextBox* pText = (CTextBox*)m_TextList.GetAt(i);
+ FX_FLOAT width = pText->m_Right - pText->m_Left;
+ for (int j = 0; j < pOther->m_TextList.GetSize(); j ++) {
+ CTextBox* pOtherText = (CTextBox*)pOther->m_TextList.GetAt(j);
+ FX_FLOAT inter_left, inter_right;
+ if (!GetIntersection(pText->m_Left, pText->m_Right,
+ pOtherText->m_Left, pOtherText->m_Right, inter_left, inter_right)) {
+ continue;
+ }
+ FX_FLOAT inter_w = inter_right - inter_left;
+ if (inter_w < pText->m_SpaceWidth / 2 && inter_w < pOtherText->m_SpaceWidth / 2) {
+ continue;
+ }
+ if (dy >= (pText->m_Bottom - pText->m_Top) / 2 ||
+ dy >= (pOtherText->m_Bottom - pOtherText->m_Top) / 2) {
+ return FALSE;
+ }
+ }
+ }
+ return TRUE;
+}
+void CTextBaseLine::Merge(CTextBaseLine* pOther)
+{
+ for (int i = 0; i < pOther->m_TextList.GetSize(); i ++) {
+ CTextBox* pText = (CTextBox*)pOther->m_TextList.GetAt(i);
+ InsertTextBox(pText->m_Left, pText->m_Right, pText->m_Top, pText->m_Bottom,
+ pText->m_SpaceWidth, pText->m_FontSizeV, pText->m_Text);
+ }
+}
+FX_BOOL CTextBaseLine::GetWidth(FX_FLOAT& leftx, FX_FLOAT& rightx)
+{
+ int i;
+ for (i = 0; i < m_TextList.GetSize(); i ++) {
+ CTextBox* pText = (CTextBox*)m_TextList.GetAt(i);
+ if (pText->m_Text != L" ") {
+ break;
+ }
+ }
+ if (i == m_TextList.GetSize()) {
+ return FALSE;
+ }
+ CTextBox* pText = (CTextBox*)m_TextList.GetAt(i);
+ leftx = pText->m_Left;
+ for (i = m_TextList.GetSize() - 1; i >= 0; i --) {
+ CTextBox* pText = (CTextBox*)m_TextList.GetAt(i);
+ if (pText->m_Text != L" ") {
+ break;
+ }
+ }
+ pText = (CTextBox*)m_TextList.GetAt(i);
+ rightx = pText->m_Right;
+ return TRUE;
+}
+void CTextBaseLine::MergeBoxes()
+{
+ int i = 0;
+ while (1) {
+ if (i >= m_TextList.GetSize() - 1) {
+ break;
+ }
+ CTextBox* pThisText = (CTextBox*)m_TextList.GetAt(i);
+ CTextBox* pNextText = (CTextBox*)m_TextList.GetAt(i + 1);
+ FX_FLOAT dx = pNextText->m_Left - pThisText->m_Right;
+ FX_FLOAT spacew = (pThisText->m_SpaceWidth == 0.0) ?
+ pNextText->m_SpaceWidth : pThisText->m_SpaceWidth;
+ if (spacew > 0.0 && dx < spacew * 2) {
+ pThisText->m_Right = pNextText->m_Right;
+ if (dx > spacew * 1.5) {
+ pThisText->m_Text += L" ";
+ } else if (dx > spacew / 3) {
+ pThisText->m_Text += L' ';
+ }
+ pThisText->m_Text += pNextText->m_Text;
+ pThisText->m_SpaceWidth = pNextText->m_SpaceWidth == 0.0 ?
+ spacew : pNextText->m_SpaceWidth;
+ m_TextList.RemoveAt(i + 1);
+ delete pNextText;
+ } else {
+ i ++;
+ }
+ }
+}
+void CTextBaseLine::WriteOutput(CFX_WideString& str, FX_FLOAT leftx, FX_FLOAT pagewidth,
+ int iTextWidth)
+{
+ int lastpos = -1;
+ for (int i = 0; i < m_TextList.GetSize(); i ++) {
+ CTextBox* pText = (CTextBox*)m_TextList.GetAt(i);
+ int xpos;
+ if (pText->m_pColumn) {
+ xpos = (int)((pText->m_pColumn->m_AvgPos - leftx) * iTextWidth / pagewidth + 0.5);
+ xpos -= pText->m_Text.GetLength();
+ } else {
+ xpos = (int)((pText->m_Left - leftx) * iTextWidth / pagewidth + 0.5);
+ }
+ if (xpos <= lastpos) {
+ xpos = lastpos + 1;
+ }
+ for (int j = lastpos + 1; j < xpos; j ++) {
+ str += ' ';
+ }
+ CFX_WideString sSrc(pText->m_Text);
+ NormalizeString(sSrc);
+ str += sSrc;
+ str += ' ';
+ lastpos = xpos + pText->m_Text.GetLength();
+ }
+}
+void CTextBaseLine::CountChars(int& count, FX_FLOAT& width, int& minchars)
+{
+ minchars = 0;
+ for (int i = 0; i < m_TextList.GetSize(); i ++) {
+ CTextBox* pText = (CTextBox*)m_TextList.GetAt(i);
+ if (pText->m_Right - pText->m_Left < 0.002) {
+ continue;
+ }
+ count += pText->m_Text.GetLength();
+ width += pText->m_Right - pText->m_Left;
+ minchars += pText->m_Text.GetLength() + 1;
+ }
+}
+#define PI 3.1415926535897932384626433832795
+static void CheckRotate(CPDF_Page& page, CFX_FloatRect& page_bbox)
+{
+ int total_count = 0, rotated_count[3] = {0, 0, 0};
+ FX_POSITION pos = page.GetFirstObjectPosition();
+ while (pos) {
+ CPDF_PageObject* pObj = page.GetNextObject(pos);
+ if (pObj->m_Type != PDFPAGE_TEXT) {
+ continue;
+ }
+ total_count ++;
+ CPDF_TextObject* pText = (CPDF_TextObject*)pObj;
+ FX_FLOAT angle = pText->m_TextState.GetBaselineAngle();
+ if (angle == 0.0) {
+ continue;
+ }
+ int degree = (int)(angle * 180 / PI + 0.5);
+ if (degree % 90) {
+ continue;
+ }
+ if (degree < 0) {
+ degree += 360;
+ }
+ int index = degree / 90 % 3 - 1;
+ if (index < 0) {
+ continue;
+ }
+ rotated_count[index] ++;
+ }
+ if (total_count == 0) {
+ return;
+ }
+ CFX_AffineMatrix matrix;
+ if (rotated_count[0] > total_count * 2 / 3) {
+ matrix.Set(0, -1, 1, 0, 0, page.GetPageHeight());
+ } else if (rotated_count[1] > total_count * 2 / 3) {
+ matrix.Set(-1, 0, 0, -1, page.GetPageWidth(), page.GetPageHeight());
+ } else if (rotated_count[2] > total_count * 2 / 3) {
+ matrix.Set(0, 1, -1, 0, page.GetPageWidth(), 0);
+ } else {
+ return;
+ }
+ page.Transform(matrix);
+ page_bbox.Transform(&matrix);
+}
+void PDF_GetPageText_Unicode(CFX_WideStringArray& lines, CPDF_Document* pDoc, CPDF_Dictionary* pPage,
+ int iMinWidth, FX_DWORD flags)
+{
+ lines.RemoveAll();
+ if (pPage == NULL) {
+ return;
+ }
+ CPDF_Page page;
+ page.Load(pDoc, pPage);
+ CPDF_ParseOptions options;
+ options.m_bTextOnly = TRUE;
+ options.m_bSeparateForm = FALSE;
+ page.ParseContent(&options);
+ CFX_FloatRect page_bbox = page.GetPageBBox();
+ if (flags & PDF2TXT_AUTO_ROTATE) {
+ CheckRotate(page, page_bbox);
+ }
+ CTextPage texts;
+ texts.m_bAutoWidth = flags & PDF2TXT_AUTO_WIDTH;
+ texts.m_bKeepColumn = flags & PDF2TXT_KEEP_COLUMN;
+ texts.m_bBreakSpace = TRUE;
+ FX_POSITION pos = page.GetFirstObjectPosition();
+ while (pos) {
+ CPDF_PageObject* pObject = page.GetNextObject(pos);
+ if (!(flags & PDF2TXT_INCLUDE_INVISIBLE)) {
+ CFX_FloatRect rect(pObject->m_Left, pObject->m_Bottom, pObject->m_Right, pObject->m_Top);
+ if (!page_bbox.Contains(rect)) {
+ continue;
+ }
+ }
+ texts.ProcessObject(pObject);
+ }
+ texts.WriteOutput(lines, iMinWidth);
+}
+void PDF_GetPageText(CFX_ByteStringArray& lines, CPDF_Document* pDoc, CPDF_Dictionary* pPage,
+ int iMinWidth, FX_DWORD flags)
+{
+ lines.RemoveAll();
+ CFX_WideStringArray wlines;
+ PDF_GetPageText_Unicode(wlines, pDoc, pPage, iMinWidth, flags);
+ for (int i = 0; i < wlines.GetSize(); i ++) {
+ CFX_WideString wstr = wlines[i];
+ CFX_ByteString str;
+ for (int c = 0; c < wstr.GetLength(); c ++) {
+ str += CharFromUnicodeAlt(wstr[c], FXSYS_GetACP(), "?");
+ }
+ lines.Add(str);
+ }
+}
+#endif
+extern void _PDF_GetTextStream_Unicode(CFX_WideTextBuf& buffer, CPDF_PageObjects* pPage, FX_BOOL bUseLF,
+ CFX_PtrArray* pObjArray);
+void PDF_GetTextStream_Unicode(CFX_WideTextBuf& buffer, CPDF_Document* pDoc, CPDF_Dictionary* pPage, FX_DWORD flags)
+{
+ buffer.EstimateSize(0, 10240);
+ CPDF_Page page;
+ page.Load(pDoc, pPage);
+ CPDF_ParseOptions options;
+ options.m_bTextOnly = TRUE;
+ options.m_bSeparateForm = FALSE;
+ page.ParseContent(&options);
+ _PDF_GetTextStream_Unicode(buffer, &page, TRUE, NULL);
+}
diff --git a/core/src/fpdftext/fpdf_text_int.cpp b/core/src/fpdftext/fpdf_text_int.cpp
index 36b0442ffc..0e0d52ec1a 100644
--- a/core/src/fpdftext/fpdf_text_int.cpp
+++ b/core/src/fpdftext/fpdf_text_int.cpp
@@ -1,2804 +1,2804 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../include/fpdfapi/fpdf_resource.h"
-#include "../../include/fpdfapi/fpdf_pageobj.h"
-#include "../../include/fpdftext/fpdf_text.h"
-#include "../../include/fpdfapi/fpdf_page.h"
-#include "../../include/fpdfapi/fpdf_module.h"
-#include <ctype.h>
-#include "text_int.h"
-FX_BOOL _IsIgnoreSpaceCharacter(FX_WCHAR curChar)
-{
- if(curChar < 255 ) {
- return FALSE;
- }
- if ( (curChar >= 0x0600 && curChar <= 0x06FF)
- || (curChar >= 0xFE70 && curChar <= 0xFEFF)
- || (curChar >= 0xFB50 && curChar <= 0xFDFF)
- || (curChar >= 0x0400 && curChar <= 0x04FF)
- || (curChar >= 0x0500 && curChar <= 0x052F)
- || (curChar >= 0xA640 && curChar <= 0xA69F)
- || (curChar >= 0x2DE0 && curChar <= 0x2DFF)
- || curChar == 8467
- || (curChar >= 0x2000 && curChar <= 0x206F)) {
- return FALSE;
- }
- return TRUE;
-}
-CPDFText_ParseOptions::CPDFText_ParseOptions()
- : m_bGetCharCodeOnly(FALSE), m_bNormalizeObjs(TRUE), m_bOutputHyphen(FALSE)
-{
-}
-IPDF_TextPage* IPDF_TextPage::CreateTextPage(const CPDF_Page* pPage, CPDFText_ParseOptions ParserOptions)
-{
- CPDF_TextPage* pTextPageEx = FX_NEW CPDF_TextPage(pPage, ParserOptions);
- return pTextPageEx;
-}
-IPDF_TextPage* IPDF_TextPage::CreateTextPage(const CPDF_Page* pPage, int flags)
-{
- CPDF_TextPage* pTextPage = FX_NEW CPDF_TextPage(pPage, flags);
- return pTextPage;
-}
-IPDF_TextPage* IPDF_TextPage::CreateTextPage(const CPDF_PageObjects* pObjs, int flags)
-{
- CPDF_TextPage* pTextPage = FX_NEW CPDF_TextPage(pObjs, flags);
- return pTextPage;
-}
-IPDF_TextPageFind* IPDF_TextPageFind::CreatePageFind(const IPDF_TextPage* pTextPage)
-{
- if (!pTextPage) {
- return NULL;
- }
- return FX_NEW CPDF_TextPageFind(pTextPage);
-}
-IPDF_LinkExtract* IPDF_LinkExtract::CreateLinkExtract()
-{
- return FX_NEW CPDF_LinkExtract();
-}
-#define TEXT_BLANK_CHAR L' '
-#define TEXT_LINEFEED_CHAR L'\n'
-#define TEXT_RETURN_CHAR L'\r'
-#define TEXT_EMPTY L""
-#define TEXT_BLANK L" "
-#define TEXT_RETURN_LINEFEED L"\r\n"
-#define TEXT_LINEFEED L"\n"
-#define TEXT_CHARRATIO_GAPDELTA 0.070
-CPDF_TextPage::CPDF_TextPage(const CPDF_Page* pPage, int flags)
- : m_pPreTextObj(NULL),
- m_IsParsered(FALSE),
- m_charList(512),
- m_TempCharList(50),
- m_TextlineDir(-1),
- m_CurlineRect(0, 0, 0, 0)
-{
- m_pPage = pPage;
- m_parserflag = flags;
- m_TextBuf.EstimateSize(0, 10240);
- pPage->GetDisplayMatrix(m_DisplayMatrix, 0, 0, (int) pPage->GetPageWidth(), (int)pPage->GetPageHeight(), 0);
-}
-CPDF_TextPage::CPDF_TextPage(const CPDF_Page* pPage, CPDFText_ParseOptions ParserOptions)
- : m_pPreTextObj(NULL)
- , m_IsParsered(FALSE)
- , m_charList(512)
- , m_TempCharList(50)
- , m_TextlineDir(-1)
- , m_CurlineRect(0, 0, 0, 0)
- , m_ParseOptions(ParserOptions)
-{
- m_pPage = pPage;
- m_parserflag = 0;
- m_TextBuf.EstimateSize(0, 10240);
- pPage->GetDisplayMatrix(m_DisplayMatrix, 0, 0, (int) pPage->GetPageWidth(), (int)pPage->GetPageHeight(), 0);
-}
-CPDF_TextPage::CPDF_TextPage(const CPDF_PageObjects* pPage, int flags)
- : m_pPreTextObj(NULL),
- m_IsParsered(FALSE),
- m_charList(512),
- m_TempCharList(50),
- m_TextlineDir(-1),
- m_CurlineRect(0, 0, 0, 0)
-{
- m_pPage = pPage;
- m_parserflag = flags;
- m_TextBuf.EstimateSize(0, 10240);
- CFX_FloatRect pageRect = pPage->CalcBoundingBox();
- m_DisplayMatrix = CFX_AffineMatrix(1, 0, 0, -1, pageRect.right, pageRect.top);
-}
-void CPDF_TextPage::NormalizeObjects(FX_BOOL bNormalize)
-{
- m_ParseOptions.m_bNormalizeObjs = bNormalize;
-}
-FX_BOOL CPDF_TextPage::IsControlChar(PAGECHAR_INFO* pCharInfo)
-{
- if(!pCharInfo) {
- return FALSE;
- }
- switch(pCharInfo->m_Unicode) {
- case 0x2:
- case 0x3:
- case 0x93:
- case 0x94:
- case 0x96:
- case 0x97:
- case 0x98:
- case 0xfffe:
- if(pCharInfo->m_Flag == FPDFTEXT_CHAR_HYPHEN) {
- return FALSE;
- } else {
- return TRUE;
- }
- default:
- return FALSE;
- }
-}
-FX_BOOL CPDF_TextPage::ParseTextPage()
-{
- if (!m_pPage) {
- m_IsParsered = FALSE;
- return FALSE;
- }
- m_IsParsered = FALSE;
- m_TextBuf.Clear();
- m_charList.RemoveAll();
- m_pPreTextObj = NULL;
- ProcessObject();
- m_IsParsered = TRUE;
- if(!m_ParseOptions.m_bGetCharCodeOnly) {
- m_CharIndex.RemoveAll();
- int nCount = m_charList.GetSize();
- if(nCount) {
- m_CharIndex.Add(0);
- }
- for(int i = 0; i < nCount; i++) {
- int indexSize = m_CharIndex.GetSize();
- FX_BOOL bNormal = FALSE;
- PAGECHAR_INFO charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(i);
- if(charinfo.m_Flag == FPDFTEXT_CHAR_GENERATED) {
- bNormal = TRUE;
- }
-#ifdef FOXIT_CHROME_BUILD
- else if(charinfo.m_Unicode == 0 || IsControlChar(&charinfo))
-#else
- else if(charinfo.m_Unicode == 0)
-#endif
- bNormal = FALSE;
- else {
- bNormal = TRUE;
- }
- if(bNormal) {
- if(indexSize % 2) {
- m_CharIndex.Add(1);
- } else {
- if(indexSize <= 0) {
- continue;
- }
- m_CharIndex.SetAt(indexSize - 1, m_CharIndex.GetAt(indexSize - 1) + 1);
- }
- } else {
- if(indexSize % 2) {
- if(indexSize <= 0) {
- continue;
- }
- m_CharIndex.SetAt(indexSize - 1, i + 1);
- } else {
- m_CharIndex.Add(i + 1);
- }
- }
- }
- int indexSize = m_CharIndex.GetSize();
- if(indexSize % 2) {
- m_CharIndex.RemoveAt(indexSize - 1);
- }
- }
- return TRUE;
-}
-int CPDF_TextPage::CountChars() const
-{
- if(m_ParseOptions.m_bGetCharCodeOnly) {
- return m_TextBuf.GetSize();
- }
- return m_charList.GetSize();
-}
-int CPDF_TextPage::CharIndexFromTextIndex(int TextIndex) const
-{
- int indexSize = m_CharIndex.GetSize();
- int count = 0;
- for(int i = 0; i < indexSize; i += 2) {
- count += m_CharIndex.GetAt(i + 1);
- if(count > TextIndex) {
- return TextIndex - count + m_CharIndex.GetAt(i + 1) + m_CharIndex.GetAt(i);
- }
- }
- return -1;
-}
-int CPDF_TextPage::TextIndexFromCharIndex(int CharIndex) const
-{
- int indexSize = m_CharIndex.GetSize();
- int count = 0;
- for(int i = 0; i < indexSize; i += 2) {
- count += m_CharIndex.GetAt(i + 1);
- if(m_CharIndex.GetAt(i + 1) + m_CharIndex.GetAt(i) > CharIndex) {
- if(CharIndex - m_CharIndex.GetAt(i) < 0) {
- return -1;
- }
- return CharIndex - m_CharIndex.GetAt(i) + count - m_CharIndex.GetAt(i + 1);
- }
- }
- return -1;
-}
-void CPDF_TextPage::GetRectArray(int start, int nCount, CFX_RectArray& rectArray) const
-{
- if(m_ParseOptions.m_bGetCharCodeOnly) {
- return;
- }
- if(start < 0 || nCount == 0) {
- return;
- }
- if (!m_IsParsered) {
- return;
- }
- PAGECHAR_INFO info_curchar;
- CPDF_TextObject* pCurObj = NULL;
- CFX_FloatRect rect;
- int curPos = start;
- FX_BOOL flagNewRect = TRUE;
- if (nCount + start > m_charList.GetSize() || nCount == -1) {
- nCount = m_charList.GetSize() - start;
- }
- while (nCount--) {
- info_curchar = *(PAGECHAR_INFO*)m_charList.GetAt(curPos++);
- if (info_curchar.m_Flag == FPDFTEXT_CHAR_GENERATED) {
- continue;
- }
- if(info_curchar.m_CharBox.Width() < 0.01 || info_curchar.m_CharBox.Height() < 0.01) {
- continue;
- }
- if(!pCurObj) {
- pCurObj = info_curchar.m_pTextObj;
- }
- if (pCurObj != info_curchar.m_pTextObj) {
- rectArray.Add(rect);
- pCurObj = info_curchar.m_pTextObj;
- flagNewRect = TRUE;
- }
- if (flagNewRect) {
- FX_FLOAT orgX = info_curchar.m_OriginX, orgY = info_curchar.m_OriginY;
- CFX_AffineMatrix matrix, matrix_reverse;
- info_curchar.m_pTextObj->GetTextMatrix(&matrix);
- matrix.Concat(info_curchar.m_Matrix);
- matrix_reverse.SetReverse(matrix);
- matrix_reverse.Transform(orgX, orgY);
- rect.left = info_curchar.m_CharBox.left;
- rect.right = info_curchar.m_CharBox.right;
- if (pCurObj->GetFont()->GetTypeDescent()) {
- rect.bottom = orgY + pCurObj->GetFont()->GetTypeDescent() * pCurObj->GetFontSize() / 1000;
- FX_FLOAT xPosTemp = orgX;
- matrix.Transform(xPosTemp, rect.bottom);
- } else {
- rect.bottom = info_curchar.m_CharBox.bottom;
- }
- if (pCurObj->GetFont()->GetTypeAscent()) {
- rect.top = orgY + pCurObj->GetFont()->GetTypeAscent() * pCurObj->GetFontSize() / 1000;
- FX_FLOAT xPosTemp = orgX + GetCharWidth(info_curchar.m_CharCode, pCurObj->GetFont()) * pCurObj->GetFontSize() / 1000;
- matrix.Transform(xPosTemp, rect.top);
- } else {
- rect.top = info_curchar.m_CharBox.top;
- }
- flagNewRect = FALSE;
- rect = info_curchar.m_CharBox;
- rect.Normalize();
- } else {
- info_curchar.m_CharBox.Normalize();
- if (rect.left > info_curchar.m_CharBox.left) {
- rect.left = info_curchar.m_CharBox.left;
- }
- if (rect.right < info_curchar.m_CharBox.right) {
- rect.right = info_curchar.m_CharBox.right;
- }
- if ( rect.top < info_curchar.m_CharBox.top) {
- rect.top = info_curchar.m_CharBox.top;
- }
- if (rect.bottom > info_curchar.m_CharBox.bottom) {
- rect.bottom = info_curchar.m_CharBox.bottom;
- }
- }
- }
- rectArray.Add(rect);
- return;
-}
-int CPDF_TextPage::GetIndexAtPos(CPDF_Point point , FX_FLOAT xTorelance, FX_FLOAT yTorelance) const
-{
- if(m_ParseOptions.m_bGetCharCodeOnly) {
- return -3;
- }
- if (!m_IsParsered) {
- return -3;
- }
- FX_FLOAT distance = 0;
- int pos = 0;
- int NearPos = -1;
- double xdif = 5000, ydif = 5000;
- while(pos < m_charList.GetSize()) {
- PAGECHAR_INFO charinfo = *(PAGECHAR_INFO*)(m_charList.GetAt(pos));
- CFX_FloatRect charrect = charinfo.m_CharBox;
- if (charrect.Contains(point.x, point.y)) {
- break;
- }
- if (xTorelance > 0 || yTorelance > 0) {
- CFX_FloatRect charRectExt;
- charrect.Normalize();
- charRectExt.left = charrect.left - xTorelance / 2;
- charRectExt.right = charrect.right + xTorelance / 2;
- charRectExt.top = charrect.top + yTorelance / 2;
- charRectExt.bottom = charrect.bottom - yTorelance / 2;
- if (charRectExt.Contains(point.x, point.y)) {
- double curXdif, curYdif;
- curXdif = FXSYS_fabs(point.x - charrect.left) < FXSYS_fabs(point.x - charrect.right) ? FXSYS_fabs(point.x - charrect.left) : FXSYS_fabs(point.x - charrect.right);
- curYdif = FXSYS_fabs(point.y - charrect.bottom) < FXSYS_fabs(point.y - charrect.top ) ? FXSYS_fabs(point.y - charrect.bottom) : FXSYS_fabs(point.y - charrect.top);
- if (curYdif + curXdif < xdif + ydif) {
- ydif = curYdif;
- xdif = curXdif;
- NearPos = pos;
- }
- }
- }
- ++pos;
- }
- if (pos >= m_charList.GetSize()) {
- pos = NearPos;
- }
- return pos;
-}
-CFX_WideString CPDF_TextPage::GetTextByRect(CFX_FloatRect rect) const
-{
- CFX_WideString strText;
- if(m_ParseOptions.m_bGetCharCodeOnly || !m_IsParsered) {
- return strText;
- }
- int nCount = m_charList.GetSize();
- int pos = 0;
- FX_FLOAT posy = 0;
- FX_BOOL IsContainPreChar = FALSE;
- FX_BOOL ISAddLineFeed = FALSE;
- while (pos < nCount) {
- PAGECHAR_INFO charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(pos++);
- if (IsRectIntersect(rect, charinfo.m_CharBox)) {
- if (FXSYS_fabs(posy - charinfo.m_OriginY) > 0 && !IsContainPreChar && ISAddLineFeed) {
- posy = charinfo.m_OriginY;
- if (strText.GetLength() > 0) {
- strText += L"\r\n";
- }
- }
- IsContainPreChar = TRUE;
- ISAddLineFeed = FALSE;
- if (charinfo.m_Unicode) {
- strText += charinfo.m_Unicode;
- }
- } else if (charinfo.m_Unicode == 32) {
- if (IsContainPreChar && charinfo.m_Unicode) {
- strText += charinfo.m_Unicode;
- IsContainPreChar = FALSE;
- ISAddLineFeed = FALSE;
- }
- } else {
- IsContainPreChar = FALSE;
- ISAddLineFeed = TRUE;
- }
- }
- return strText;
-}
-void CPDF_TextPage::GetRectsArrayByRect(CFX_FloatRect rect, CFX_RectArray& resRectArray) const
-{
- if(m_ParseOptions.m_bGetCharCodeOnly) {
- return;
- }
- if (!m_IsParsered) {
- return;
- }
- CFX_FloatRect curRect;
- FX_BOOL flagNewRect = TRUE;
- CPDF_TextObject* pCurObj = NULL;
- int nCount = m_charList.GetSize();
- int pos = 0;
- while (pos < nCount) {
- PAGECHAR_INFO info_curchar = *(PAGECHAR_INFO*)m_charList.GetAt(pos++);
- if (info_curchar.m_Flag == FPDFTEXT_CHAR_GENERATED) {
- continue;
- }
- if(pos == 494) {
- int a = 0;
- }
- if (IsRectIntersect(rect, info_curchar.m_CharBox)) {
- if(!pCurObj) {
- pCurObj = info_curchar.m_pTextObj;
- }
- if (pCurObj != info_curchar.m_pTextObj) {
- resRectArray.Add(curRect);
- pCurObj = info_curchar.m_pTextObj;
- flagNewRect = TRUE;
- }
- if (flagNewRect) {
- curRect = info_curchar.m_CharBox;
- flagNewRect = FALSE;
- curRect.Normalize();
- } else {
- info_curchar.m_CharBox.Normalize();
- if (curRect.left > info_curchar.m_CharBox.left) {
- curRect.left = info_curchar.m_CharBox.left;
- }
- if (curRect.right < info_curchar.m_CharBox.right) {
- curRect.right = info_curchar.m_CharBox.right;
- }
- if ( curRect.top < info_curchar.m_CharBox.top) {
- curRect.top = info_curchar.m_CharBox.top;
- }
- if (curRect.bottom > info_curchar.m_CharBox.bottom) {
- curRect.bottom = info_curchar.m_CharBox.bottom;
- }
- }
- }
- }
- resRectArray.Add(curRect);
- return;
-}
-int CPDF_TextPage::GetIndexAtPos(FX_FLOAT x, FX_FLOAT y, FX_FLOAT xTorelance, FX_FLOAT yTorelance) const
-{
- if(m_ParseOptions.m_bGetCharCodeOnly) {
- return -3;
- }
- CPDF_Point point(x, y);
- return GetIndexAtPos(point, xTorelance, yTorelance);
-}
-int CPDF_TextPage::GetOrderByDirection(int order, int direction) const
-{
- if(m_ParseOptions.m_bGetCharCodeOnly) {
- return -3;
- }
- if (!m_IsParsered) {
- return -3;
- }
- if (direction == FPDFTEXT_RIGHT || direction == FPDFTEXT_LEFT) {
- order += direction;
- while(order >= 0 && order < m_charList.GetSize()) {
- PAGECHAR_INFO cinfo = *(PAGECHAR_INFO*)m_charList.GetAt(order);
- if (cinfo.m_Flag != FPDFTEXT_CHAR_GENERATED) {
- break;
- } else {
- if (cinfo.m_Unicode == TEXT_LINEFEED_CHAR || cinfo.m_Unicode == TEXT_RETURN_CHAR) {
- order += direction;
- } else {
- break;
- }
- }
- }
- if (order >= m_charList.GetSize()) {
- order = -2;
- }
- return order;
- }
- PAGECHAR_INFO charinfo;
- charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(order);
- CPDF_Point curPos(charinfo.m_OriginX, charinfo.m_OriginY);
- FX_FLOAT difPosY = 0.0, minXdif = 1000;
- int minIndex = -2;
- int index = order;
- FX_FLOAT height = charinfo.m_CharBox.Height();
- if (direction == FPDFTEXT_UP) {
- minIndex = -1;
- while (1) {
- if (--index < 0) {
- return -1;
- }
- charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(index);
- if (FXSYS_fabs(charinfo.m_OriginY - curPos.y) > FX_MAX(height, charinfo.m_CharBox.Height()) / 2) {
- difPosY = charinfo.m_OriginY;
- minIndex = index;
- break;
- }
- }
- FX_FLOAT PreXdif = charinfo.m_OriginX - curPos.x;
- minXdif = PreXdif;
- if (PreXdif == 0) {
- return index;
- }
- FX_FLOAT curXdif = 0;
- while (--index >= 0) {
- charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(index);
- if (difPosY != charinfo.m_OriginY) {
- break;
- }
- curXdif = charinfo.m_OriginX - curPos.x;
- if (curXdif == 0) {
- return index;
- }
- int signflag = 0;
- if (curXdif > 0) {
- signflag = 1;
- } else {
- signflag = -1;
- }
- if (signflag * PreXdif < 0) {
- if (FXSYS_fabs(PreXdif) < FXSYS_fabs(curXdif)) {
- return index + 1;
- } else {
- return index;
- }
- }
- if (FXSYS_fabs(curXdif) < FXSYS_fabs(minXdif)) {
- minIndex = index;
- minXdif = curXdif;
- }
- PreXdif = curXdif;
- if (difPosY != charinfo.m_OriginY) {
- break;
- }
- }
- return minIndex;
- } else if(FPDFTEXT_DOWN) {
- minIndex = -2;
- while (1) {
- if (++index > m_charList.GetSize() - 1) {
- return minIndex;
- }
- charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(index);
- if (FXSYS_fabs(charinfo.m_OriginY - curPos.y) > FX_MAX(height, charinfo.m_CharBox.Height()) / 2) {
- difPosY = charinfo.m_OriginY;
- minIndex = index;
- break;
- }
- }
- FX_FLOAT PreXdif = charinfo.m_OriginX - curPos.x;
- minXdif = PreXdif;
- if (PreXdif == 0) {
- return index;
- }
- FX_FLOAT curXdif = 0;
- while (++index < m_charList.GetSize()) {
- charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(index);
- if (difPosY != charinfo.m_OriginY) {
- break;
- }
- curXdif = charinfo.m_OriginX - curPos.x;
- if (curXdif == 0) {
- return index;
- }
- int signflag = 0;
- if (curXdif > 0) {
- signflag = 1;
- } else {
- signflag = -1;
- }
- if (signflag * PreXdif < 0) {
- if (FXSYS_fabs(PreXdif) < FXSYS_fabs(curXdif)) {
- return index - 1;
- } else {
- return index;
- }
- }
- if (FXSYS_fabs(curXdif) < FXSYS_fabs(minXdif)) {
- minXdif = curXdif;
- minIndex = index;
- }
- PreXdif = curXdif;
- }
- return minIndex;
- }
-}
-void CPDF_TextPage::GetCharInfo(int index, FPDF_CHAR_INFO & info) const
-{
- if(m_ParseOptions.m_bGetCharCodeOnly) {
- return;
- }
- if (!m_IsParsered) {
- return;
- }
- if (index < 0 || index >= m_charList.GetSize()) {
- return;
- }
- PAGECHAR_INFO charinfo;
- charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(index);
- info.m_Charcode = charinfo.m_CharCode;
- info.m_OriginX = charinfo.m_OriginX;
- info.m_OriginY = charinfo.m_OriginY;
- info.m_Unicode = charinfo.m_Unicode;
- info.m_Flag = charinfo.m_Flag;
- info.m_CharBox = charinfo.m_CharBox;
- info.m_pTextObj = charinfo.m_pTextObj;
- if (charinfo.m_pTextObj && charinfo.m_pTextObj->GetFont()) {
- info.m_FontSize = charinfo.m_pTextObj->GetFontSize();
- }
- info.m_Matrix.Copy(charinfo.m_Matrix);
- return;
-}
-void CPDF_TextPage::CheckMarkedContentObject(FX_INT32& start, FX_INT32& nCount) const
-{
- PAGECHAR_INFO charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(start);
- PAGECHAR_INFO charinfo2 = *(PAGECHAR_INFO*)m_charList.GetAt(start + nCount - 1);
- if (FPDFTEXT_CHAR_PIECE != charinfo.m_Flag && FPDFTEXT_CHAR_PIECE != charinfo2.m_Flag) {
- return;
- }
- if (FPDFTEXT_CHAR_PIECE == charinfo.m_Flag) {
- PAGECHAR_INFO charinfo1 = charinfo;
- int startIndex = start;
- while(FPDFTEXT_CHAR_PIECE == charinfo1.m_Flag && charinfo1.m_Index == charinfo.m_Index) {
- startIndex--;
- if (startIndex < 0) {
- break;
- }
- charinfo1 = *(PAGECHAR_INFO*)m_charList.GetAt(startIndex);
- }
- startIndex++;
- start = startIndex;
- }
- if (FPDFTEXT_CHAR_PIECE == charinfo2.m_Flag) {
- PAGECHAR_INFO charinfo3 = charinfo2;
- int endIndex = start + nCount - 1;
- while(FPDFTEXT_CHAR_PIECE == charinfo3.m_Flag && charinfo3.m_Index == charinfo2.m_Index) {
- endIndex++;
- if (endIndex >= m_charList.GetSize()) {
- break;
- }
- charinfo3 = *(PAGECHAR_INFO*)m_charList.GetAt(endIndex);
- }
- endIndex--;
- nCount = endIndex - start + 1;
- }
-}
-CFX_WideString CPDF_TextPage::GetPageText(int start , int nCount) const
-{
- if (!m_IsParsered || nCount == 0) {
- return L"";
- }
- if (start < 0) {
- start = 0;
- }
- if (nCount == -1) {
- nCount = m_charList.GetSize() - start;
- return m_TextBuf.GetWideString().Mid(start, m_TextBuf.GetWideString().GetLength());
- }
- if(nCount <= 0 || m_charList.GetSize() <= 0) {
- return L"";
- }
- if(nCount + start > m_charList.GetSize() - 1) {
- nCount = m_charList.GetSize() - start;
- }
- if (nCount <= 0) {
- return L"";
- }
- CheckMarkedContentObject(start, nCount);
- int startindex = 0;
- PAGECHAR_INFO charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(start);
- int startOffset = 0;
- while(charinfo.m_Index == -1) {
- startOffset++;
- if (startOffset > nCount || start + startOffset >= m_charList.GetSize()) {
- return L"";
- }
- charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(start + startOffset);
- }
- startindex = charinfo.m_Index;
- charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(start + nCount - 1);
- int nCountOffset = 0;
- while (charinfo.m_Index == -1) {
- nCountOffset++;
- if (nCountOffset >= nCount) {
- return L"";
- }
- charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(start + nCount - nCountOffset - 1);
- }
- nCount = start + nCount - nCountOffset - startindex;
- if(nCount <= 0) {
- return L"";
- }
- return m_TextBuf.GetWideString().Mid(startindex, nCount);
-}
-int CPDF_TextPage::CountRects(int start, int nCount)
-{
- if(m_ParseOptions.m_bGetCharCodeOnly) {
- return -1;
- }
- if (!m_IsParsered) {
- return -1;
- }
- if (start < 0) {
- return -1;
- }
- if (nCount == -1 || nCount + start > m_charList.GetSize() ) {
- nCount = m_charList.GetSize() - start;
- }
- m_SelRects.RemoveAll();
- GetRectArray(start, nCount, m_SelRects);
- return m_SelRects.GetSize();
-}
-void CPDF_TextPage::GetRect(int rectIndex, FX_FLOAT& left, FX_FLOAT& top, FX_FLOAT& right, FX_FLOAT &bottom) const
-{
- if(m_ParseOptions.m_bGetCharCodeOnly) {
- return ;
- }
- if (!m_IsParsered || rectIndex < 0 || rectIndex >= m_SelRects.GetSize()) {
- return;
- }
- left = m_SelRects.GetAt(rectIndex).left;
- top = m_SelRects.GetAt(rectIndex).top;
- right = m_SelRects.GetAt(rectIndex).right;
- bottom = m_SelRects.GetAt(rectIndex).bottom;
-}
-FX_BOOL CPDF_TextPage::GetBaselineRotate(int start, int end, int& Rotate)
-{
- if(m_ParseOptions.m_bGetCharCodeOnly) {
- return FALSE;
- }
- if(end == start) {
- return FALSE;
- }
- FX_FLOAT dx, dy;
- FPDF_CHAR_INFO info1, info2;
- GetCharInfo(start, info1);
- GetCharInfo(end, info2);
- while(info2.m_CharBox.Width() == 0 || info2.m_CharBox.Height() == 0) {
- end--;
- if(end <= start) {
- return FALSE;
- }
- GetCharInfo(end, info2);
- }
- dx = (info2.m_OriginX - info1.m_OriginX);
- dy = (info2.m_OriginY - info1.m_OriginY);
- if(dx == 0) {
- if(dy > 0) {
- Rotate = 90;
- } else if (dy < 0) {
- Rotate = 270;
- } else {
- Rotate = 0;
- }
- } else {
- float a = FXSYS_atan2(dy, dx);
- Rotate = (int)(a * 180 / FX_PI + 0.5);
- }
- if(Rotate < 0) {
- Rotate = -Rotate;
- } else if(Rotate > 0) {
- Rotate = 360 - Rotate;
- }
- return TRUE;
-}
-FX_BOOL CPDF_TextPage::GetBaselineRotate(CFX_FloatRect rect , int& Rotate)
-{
- if(m_ParseOptions.m_bGetCharCodeOnly) {
- return FALSE;
- }
- int start, end, count, n = CountBoundedSegments(rect.left, rect.top, rect.right, rect.bottom, TRUE);
- if(n < 1) {
- return FALSE;
- }
- if(n > 1) {
- GetBoundedSegment(n - 1, start, count);
- end = start + count - 1;
- GetBoundedSegment(0, start, count);
- } else {
- GetBoundedSegment(0, start, count);
- end = start + count - 1;
- }
- return GetBaselineRotate(start, end, Rotate);
-}
-FX_BOOL CPDF_TextPage::GetBaselineRotate(int rectIndex, int& Rotate)
-{
- if(m_ParseOptions.m_bGetCharCodeOnly) {
- return FALSE;
- }
- if (!m_IsParsered || rectIndex < 0 || rectIndex > m_SelRects.GetSize()) {
- return FALSE;
- }
- CFX_FloatRect rect = m_SelRects.GetAt(rectIndex);
- return GetBaselineRotate(rect , Rotate);
-}
-int CPDF_TextPage::CountBoundedSegments(FX_FLOAT left, FX_FLOAT top, FX_FLOAT right, FX_FLOAT bottom, FX_BOOL bContains )
-{
- if(m_ParseOptions.m_bGetCharCodeOnly) {
- return -1;
- }
- m_Segment.RemoveAll();
- if (!m_IsParsered) {
- return -1;
- }
- CFX_FloatRect rect(left, bottom, right, top);
- rect.Normalize();
- int nCount = m_charList.GetSize();
- int pos = 0;
- FPDF_SEGMENT segment;
- segment.m_Start = 0;
- segment.m_nCount = 0;
- FX_BOOL segmentStatus = 0;
- FX_BOOL IsContainPreChar = FALSE;
- while (pos < nCount) {
- if(pos == 493) {
- int a = 0;
- }
- PAGECHAR_INFO charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(pos);
- if(bContains && rect.Contains(charinfo.m_CharBox)) {
- if (segmentStatus == 0 || segmentStatus == 2) {
- segment.m_Start = pos;
- segment.m_nCount = 1;
- segmentStatus = 1;
- } else if (segmentStatus == 1) {
- segment.m_nCount++;
- }
- IsContainPreChar = TRUE;
- } else if (!bContains && (IsRectIntersect(rect, charinfo.m_CharBox) || rect.Contains(charinfo.m_OriginX, charinfo.m_OriginY))) {
- if (segmentStatus == 0 || segmentStatus == 2) {
- segment.m_Start = pos;
- segment.m_nCount = 1;
- segmentStatus = 1;
- } else if (segmentStatus == 1) {
- segment.m_nCount++;
- }
- IsContainPreChar = TRUE;
- } else if (charinfo.m_Unicode == 32) {
- if (IsContainPreChar == TRUE) {
- if (segmentStatus == 0 || segmentStatus == 2) {
- segment.m_Start = pos;
- segment.m_nCount = 1;
- segmentStatus = 1;
- } else if (segmentStatus == 1) {
- segment.m_nCount++;
- }
- IsContainPreChar = FALSE;
- } else {
- if (segmentStatus == 1) {
- segmentStatus = 2;
- m_Segment.Add(segment);
- segment.m_Start = 0;
- segment.m_nCount = 0;
- }
- }
- } else {
- if (segmentStatus == 1) {
- segmentStatus = 2;
- m_Segment.Add(segment);
- segment.m_Start = 0;
- segment.m_nCount = 0;
- }
- IsContainPreChar = FALSE;
- }
- pos++;
- }
- if (segmentStatus == 1) {
- segmentStatus = 2;
- m_Segment.Add(segment);
- segment.m_Start = 0;
- segment.m_nCount = 0;
- }
- return m_Segment.GetSize();
-}
-void CPDF_TextPage::GetBoundedSegment(int index, int& start, int& count) const
-{
- if(m_ParseOptions.m_bGetCharCodeOnly) {
- return ;
- }
- if (index < 0 || index >= m_Segment.GetSize()) {
- return;
- }
- start = m_Segment.GetAt(index).m_Start;
- count = m_Segment.GetAt(index).m_nCount;
-}
-int CPDF_TextPage::GetWordBreak(int index, int direction) const
-{
- if(m_ParseOptions.m_bGetCharCodeOnly) {
- return -1;
- }
- if (!m_IsParsered) {
- return -1;
- }
- if (direction != FPDFTEXT_LEFT && direction != FPDFTEXT_RIGHT) {
- return -1;
- }
- if (index < 0 || index >= m_charList.GetSize()) {
- return -1;
- }
- PAGECHAR_INFO charinfo;
- charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(index);
- if (charinfo.m_Index == -1 || charinfo.m_Flag == FPDFTEXT_CHAR_GENERATED) {
- return index;
- }
- if (!IsLetter(charinfo.m_Unicode)) {
- return index;
- }
- int breakPos = index;
- if (direction == FPDFTEXT_LEFT) {
- while (--breakPos > 0) {
- charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(breakPos);
- if (!IsLetter(charinfo.m_Unicode)) {
- return breakPos;
- }
- }
- return breakPos;
- } else if (direction == FPDFTEXT_RIGHT) {
- while (++breakPos < m_charList.GetSize()) {
- charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(breakPos);
- if (!IsLetter(charinfo.m_Unicode)) {
- return breakPos;
- }
- }
- return breakPos;
- }
- return breakPos;
-}
-FX_INT32 CPDF_TextPage::FindTextlineFlowDirection()
-{
- if (!m_pPage) {
- return -1;
- }
- const FX_INT32 nPageWidth = (FX_INT32)((CPDF_Page*)m_pPage)->GetPageWidth();
- const FX_INT32 nPageHeight = (FX_INT32)((CPDF_Page*)m_pPage)->GetPageHeight();
- CFX_ByteArray nHorizontalMask;
- if (!nHorizontalMask.SetSize(nPageWidth)) {
- return -1;
- }
- FX_BYTE* pDataH = nHorizontalMask.GetData();
- CFX_ByteArray nVerticalMask;
- if (!nVerticalMask.SetSize(nPageHeight)) {
- return -1;
- }
- FX_BYTE* pDataV = nVerticalMask.GetData();
- FX_INT32 index = 0;
- FX_FLOAT fLineHeight = 0.0f;
- CPDF_PageObject* pPageObj = NULL;
- FX_POSITION pos = NULL;
- pos = m_pPage->GetFirstObjectPosition();
- if(!pos) {
- return -1;
- }
- while(pos) {
- pPageObj = m_pPage->GetNextObject(pos);
- if(NULL == pPageObj) {
- continue;
- }
- if(PDFPAGE_TEXT != pPageObj->m_Type) {
- continue;
- }
- FX_INT32 minH = (FX_INT32)pPageObj->m_Left < 0 ? 0 : (FX_INT32)pPageObj->m_Left;
- FX_INT32 maxH = (FX_INT32)pPageObj->m_Right > nPageWidth ? nPageWidth : (FX_INT32)pPageObj->m_Right;
- FX_INT32 minV = (FX_INT32)pPageObj->m_Bottom < 0 ? 0 : (FX_INT32)pPageObj->m_Bottom;
- FX_INT32 maxV = (FX_INT32)pPageObj->m_Top > nPageHeight ? nPageHeight : (FX_INT32)pPageObj->m_Top;
- if (minH >= maxH || minV >= maxV){
- continue;
- }
-
- FXSYS_memset8(pDataH + minH, 1, maxH - minH);
- FXSYS_memset8(pDataV + minV, 1, maxV - minV);
-
- if (fLineHeight <= 0.0f) {
- fLineHeight = pPageObj->m_Top - pPageObj->m_Bottom;
- }
-
- pPageObj = NULL;
- }
- FX_INT32 nStartH = 0;
- FX_INT32 nEndH = 0;
- FX_FLOAT nSumH = 0.0f;
- for (index = 0; index < nPageWidth; index++)
- if(1 == nHorizontalMask[index]) {
- break;
- }
- nStartH = index;
- for (index = nPageWidth; index > 0; index--)
- if(1 == nHorizontalMask[index - 1]) {
- break;
- }
- nEndH = index;
- for (index = nStartH; index < nEndH; index++) {
- nSumH += nHorizontalMask[index];
- }
- nSumH /= nEndH - nStartH;
- FX_INT32 nStartV = 0;
- FX_INT32 nEndV = 0;
- FX_FLOAT nSumV = 0.0f;
- for (index = 0; index < nPageHeight; index++)
- if(1 == nVerticalMask[index]) {
- break;
- }
- nStartV = index;
- for (index = nPageHeight; index > 0; index--)
- if(1 == nVerticalMask[index - 1]) {
- break;
- }
- nEndV = index;
- for (index = nStartV; index < nEndV; index++) {
- nSumV += nVerticalMask[index];
- }
- nSumV /= nEndV - nStartV;
- if ((nEndV - nStartV) < (FX_INT32)(2 * fLineHeight)) {
- return 0;
- }
- if ((nEndH - nStartH) < (FX_INT32)(2 * fLineHeight)) {
- return 1;
- }
- if (nSumH > 0.8f) {
- return 0;
- }
- if (nSumH - nSumV > 0.0f) {
- return 0;
- }
- if (nSumV - nSumH > 0.0f) {
- return 1;
- }
- return -1;
-}
-void CPDF_TextPage::ProcessObject()
-{
- CPDF_PageObject* pPageObj = NULL;
- if (!m_pPage) {
- return;
- }
- FX_POSITION pos;
- pos = m_pPage->GetFirstObjectPosition();
- if (!pos) {
- return;
- }
- m_TextlineDir = FindTextlineFlowDirection();
- int nCount = 0;
- while (pos) {
- pPageObj = m_pPage->GetNextObject(pos);
- if(pPageObj) {
- if(pPageObj->m_Type == PDFPAGE_TEXT) {
- if (nCount == 3) {
- nCount = nCount;
- }
- CFX_AffineMatrix matrix;
- ProcessTextObject((CPDF_TextObject*)pPageObj, matrix, pos);
- nCount++;
- } else if (pPageObj->m_Type == PDFPAGE_FORM) {
- CFX_AffineMatrix formMatrix(1, 0, 0, 1, 0, 0);
- ProcessFormObject((CPDF_FormObject*)pPageObj, formMatrix);
- }
- }
- pPageObj = NULL;
- }
- int count = m_LineObj.GetSize();
- for(int i = 0; i < count; i++) {
- ProcessTextObject(m_LineObj.GetAt(i));
- }
- m_LineObj.RemoveAll();
- CloseTempLine();
-}
-void CPDF_TextPage::ProcessFormObject(CPDF_FormObject* pFormObj, CFX_AffineMatrix formMatrix)
-{
- CPDF_PageObject* pPageObj = NULL;
- FX_POSITION pos;
- if (!pFormObj) {
- return;
- }
- pos = pFormObj->m_pForm->GetFirstObjectPosition();
- if (!pos) {
- return;
- }
- CFX_AffineMatrix curFormMatrix;
- curFormMatrix.Copy(pFormObj->m_FormMatrix);
- curFormMatrix.Concat(formMatrix);
- while (pos) {
- pPageObj = pFormObj->m_pForm->GetNextObject(pos);
- if(pPageObj) {
- if(pPageObj->m_Type == PDFPAGE_TEXT) {
- ProcessTextObject((CPDF_TextObject*)pPageObj, curFormMatrix, pos);
- } else if (pPageObj->m_Type == PDFPAGE_FORM) {
- ProcessFormObject((CPDF_FormObject*)pPageObj, curFormMatrix);
- }
- }
- pPageObj = NULL;
- }
-}
-int CPDF_TextPage::GetCharWidth(FX_DWORD charCode, CPDF_Font* pFont) const
-{
- if(charCode == -1) {
- return 0;
- }
- int w = pFont->GetCharWidthF(charCode);
- if(w == 0) {
- CFX_ByteString str;
- pFont->AppendChar(str, charCode);
- w = pFont->GetStringWidth(str, 1);
- if(w == 0) {
- FX_RECT BBox;
- pFont->GetCharBBox(charCode, BBox);
- w = BBox.right - BBox.left;
- }
- }
- return w;
-}
-void CPDF_TextPage::OnPiece(IFX_BidiChar* pBidi, CFX_WideString& str)
-{
- FX_INT32 start, count;
- FX_INT32 ret = pBidi->GetBidiInfo(start, count);
- if(ret == 2) {
- for(int i = start + count - 1; i >= start; i--) {
- m_TextBuf.AppendChar(str.GetAt(i));
- m_charList.Add(*(PAGECHAR_INFO*)m_TempCharList.GetAt(i));
- }
- } else {
- int end = start + count ;
- for(int i = start; i < end; i++) {
- m_TextBuf.AppendChar(str.GetAt(i));
- m_charList.Add(*(PAGECHAR_INFO*)m_TempCharList.GetAt(i));
- }
- }
-}
-void CPDF_TextPage::AddCharInfoByLRDirection(CFX_WideString& str, int i)
-{
- PAGECHAR_INFO Info = *(PAGECHAR_INFO*)m_TempCharList.GetAt(i);
- FX_WCHAR wChar = str.GetAt(i);
-#ifdef FOXIT_CHROME_BUILD
- if(!IsControlChar(&Info)) {
-#else
- if(wChar != 0xfffe) {
-#endif
- Info.m_Index = m_TextBuf.GetLength();
- if (wChar >= 0xFB00 && wChar <= 0xFB06) {
- FX_LPWSTR pDst = NULL;
- FX_STRSIZE nCount = FX_Unicode_GetNormalization(wChar, pDst);
- if (nCount >= 1) {
- pDst = FX_Alloc(FX_WCHAR, nCount);
- if (!pDst) {
- return;
- }
- FX_Unicode_GetNormalization(wChar, pDst);
- for (int nIndex = 0; nIndex < nCount; nIndex++) {
- PAGECHAR_INFO Info2 = Info;
- Info2.m_Unicode = pDst[nIndex];
- Info2.m_Flag = FPDFTEXT_CHAR_PIECE;
- m_TextBuf.AppendChar(Info2.m_Unicode);
- if( !m_ParseOptions.m_bGetCharCodeOnly) {
- m_charList.Add(Info2);
- }
- }
- FX_Free(pDst);
- return;
- }
- }
- m_TextBuf.AppendChar(wChar);
- } else {
- Info.m_Index = -1;
- }
- if( !m_ParseOptions.m_bGetCharCodeOnly) {
- m_charList.Add(Info);
- }
-}
-void CPDF_TextPage::AddCharInfoByRLDirection(CFX_WideString& str, int i)
-{
- PAGECHAR_INFO Info = *(PAGECHAR_INFO*)m_TempCharList.GetAt(i);
-#ifdef FOXIT_CHROME_BUILD
- if(!IsControlChar(&Info)) {
-#else
- if(str.GetAt(i) != 0xfffe) {
-#endif
- Info.m_Index = m_TextBuf.GetLength();
- FX_WCHAR wChar = FX_GetMirrorChar(str.GetAt(i), TRUE, FALSE);
- FX_LPWSTR pDst = NULL;
- FX_STRSIZE nCount = FX_Unicode_GetNormalization(wChar, pDst);
- if (nCount >= 1) {
- pDst = FX_Alloc(FX_WCHAR, nCount);
- if (!pDst) {
- return;
- }
- FX_Unicode_GetNormalization(wChar, pDst);
- for (int nIndex = 0; nIndex < nCount; nIndex++) {
- PAGECHAR_INFO Info2 = Info;
- Info2.m_Unicode = pDst[nIndex];
- Info2.m_Flag = FPDFTEXT_CHAR_PIECE;
- m_TextBuf.AppendChar(Info2.m_Unicode);
- if( !m_ParseOptions.m_bGetCharCodeOnly) {
- m_charList.Add(Info2);
- }
- }
- FX_Free(pDst);
- return;
- } else {
- Info.m_Unicode = wChar;
- }
- m_TextBuf.AppendChar(Info.m_Unicode);
- } else {
- Info.m_Index = -1;
- }
- if( !m_ParseOptions.m_bGetCharCodeOnly) {
- m_charList.Add(Info);
- }
-}
-void CPDF_TextPage::CloseTempLine()
-{
- int count1 = m_TempCharList.GetSize();
- if (count1 <= 0) {
- return;
- }
- IFX_BidiChar* BidiChar = IFX_BidiChar::Create();
- CFX_WideString str = m_TempTextBuf.GetWideString();
- CFX_WordArray order;
- FX_BOOL bR2L = FALSE;
- FX_INT32 start = 0, count = 0, i = 0;
- int nR2L = 0, nL2R = 0;
- FX_BOOL bPrevSpace = FALSE;
- for (i = 0; i < str.GetLength(); i++) {
- if(str.GetAt(i) == 32) {
- if(bPrevSpace) {
- m_TempTextBuf.Delete(i, 1);
- m_TempCharList.Delete(i);
- str.Delete(i);
- count1 --;
- i--;
- continue;
- }
- bPrevSpace = TRUE;
- } else {
- bPrevSpace = FALSE;
- }
- if(BidiChar && BidiChar->AppendChar(str.GetAt(i))) {
- FX_INT32 ret = BidiChar->GetBidiInfo(start, count);
- order.Add(start);
- order.Add(count);
- order.Add(ret);
- if(!bR2L) {
- if(ret == 2) {
- nR2L++;
- } else if (ret == 1) {
- nL2R++;
- }
- }
- }
- }
- if(BidiChar && BidiChar->EndChar()) {
- FX_INT32 ret = BidiChar->GetBidiInfo(start, count);
- order.Add(start);
- order.Add(count);
- order.Add(ret);
- if(!bR2L) {
- if(ret == 2) {
- nR2L++;
- } else if(ret == 1) {
- nL2R++;
- }
- }
- }
- if(nR2L > 0 && nR2L >= nL2R) {
- bR2L = TRUE;
- }
- if(this->m_parserflag == FPDFTEXT_RLTB || bR2L) {
- int count = order.GetSize();
- for(int j = count - 1; j > 0; j -= 3) {
- int ret = order.GetAt(j);
- int start = order.GetAt(j - 2);
- int count1 = order.GetAt(j - 1);
- if(ret == 2 || ret == 0) {
- for(int i = start + count1 - 1; i >= start; i--) {
- AddCharInfoByRLDirection(str, i);
- }
- } else {
- i = j;
- FX_BOOL bSymbol = FALSE;
- while(i > 0 && order.GetAt(i) != 2) {
- bSymbol = !order.GetAt(i);
- i -= 3;
- }
- int end = start + count1 ;
- int n = 0;
- if(bSymbol) {
- n = i + 6;
- } else {
- n = i + 3;
- }
- if(n >= j) {
- for(int m = start; m < end; m++) {
- AddCharInfoByLRDirection(str, m);
- }
- } else {
- i = j;
- j = n;
- for(; n <= i; n += 3) {
- int ret = order.GetAt(n);
- int start = order.GetAt(n - 2);
- int count1 = order.GetAt(n - 1);
- int end = start + count1 ;
- for(int m = start; m < end; m++) {
- AddCharInfoByLRDirection(str, m);
- }
- }
- }
- }
- }
- } else {
- int count = order.GetSize();
- FX_BOOL bL2R = FALSE;
- for(int j = 0; j < count; j += 3) {
- int ret = order.GetAt(j + 2);
- int start = order.GetAt(j);
- int count1 = order.GetAt(j + 1);
- if(ret == 2 || (j == 0 && ret == 0 && !bL2R)) {
- int i = j + 3;
- while(bR2L && i < count) {
- if(order.GetAt(i + 2) == 1) {
- break;
- } else {
- i += 3;
- }
- }
- if(i == 3) {
- j = -3;
- bL2R = TRUE;
- continue;
- }
- int end = m_TempCharList.GetSize() - 1;
- if(i < count) {
- end = order.GetAt(i) - 1;
- }
- j = i - 3;
- for(int n = end; n >= start; n--) {
- AddCharInfoByRLDirection(str, n);
- }
- } else {
- int end = start + count1 ;
- for(int i = start; i < end; i++) {
- AddCharInfoByLRDirection(str, i);
- }
- }
- }
- }
- int ntext = m_TextBuf.GetSize();
- ntext = m_charList.GetSize();
- order.RemoveAll();
- m_TempCharList.RemoveAll();
- m_TempTextBuf.Delete(0, m_TempTextBuf.GetLength());
- BidiChar->Release();
-}
-void CPDF_TextPage::ProcessTextObject(CPDF_TextObject* pTextObj, CFX_AffineMatrix formMatrix, FX_POSITION ObjPos)
-{
- CFX_FloatRect re(pTextObj->m_Left, pTextObj->m_Bottom, pTextObj->m_Right, pTextObj->m_Top);
- if(FXSYS_fabs(pTextObj->m_Right - pTextObj->m_Left) < 0.01f ) {
- return;
- }
- int count = m_LineObj.GetSize();
- PDFTEXT_Obj Obj;
- Obj.m_pTextObj = pTextObj;
- Obj.m_formMatrix = formMatrix;
- if(count == 0) {
- m_LineObj.Add(Obj);
- return;
- }
- if (IsSameAsPreTextObject(pTextObj, ObjPos)) {
- return;
- }
- PDFTEXT_Obj prev_Obj = m_LineObj.GetAt(count - 1);
- CPDF_TextObjectItem item;
- int nItem = prev_Obj.m_pTextObj->CountItems();
- prev_Obj.m_pTextObj->GetItemInfo(nItem - 1, &item);
- FX_FLOAT prev_width = GetCharWidth(item.m_CharCode, prev_Obj.m_pTextObj->GetFont()) * prev_Obj.m_pTextObj->GetFontSize() / 1000;
- CFX_AffineMatrix prev_matrix;
- prev_Obj.m_pTextObj->GetTextMatrix(&prev_matrix);
- prev_width = FXSYS_fabs(prev_width);
- prev_matrix.Concat(prev_Obj.m_formMatrix);
- prev_width = prev_matrix.TransformDistance(prev_width);
- pTextObj->GetItemInfo(0, &item);
- FX_FLOAT this_width = GetCharWidth(item.m_CharCode, pTextObj->GetFont()) * pTextObj->GetFontSize() / 1000;
- this_width = FXSYS_fabs(this_width);
- CFX_AffineMatrix this_matrix;
- pTextObj->GetTextMatrix(&this_matrix);
- this_width = FXSYS_fabs(this_width);
- this_matrix.Concat(formMatrix);
- this_width = this_matrix.TransformDistance(this_width);
- FX_FLOAT threshold = prev_width > this_width ? prev_width / 4 : this_width / 4;
- FX_FLOAT prev_x = prev_Obj.m_pTextObj->GetPosX(), prev_y = prev_Obj.m_pTextObj->GetPosY();
- prev_Obj.m_formMatrix.Transform(prev_x, prev_y);
- m_DisplayMatrix.Transform(prev_x, prev_y);
- FX_FLOAT this_x = pTextObj->GetPosX(), this_y = pTextObj->GetPosY();
- formMatrix.Transform(this_x, this_y);
- m_DisplayMatrix.Transform(this_x, this_y);
- if (FXSYS_fabs(this_y - prev_y) > threshold * 2) {
- for(int i = 0; i < count; i++) {
- ProcessTextObject(m_LineObj.GetAt(i));
- }
- m_LineObj.RemoveAll();
- m_LineObj.Add(Obj);
- return;
- }
- int i = 0;
- if(m_ParseOptions.m_bNormalizeObjs) {
- for(i = count - 1; i >= 0; i--) {
- PDFTEXT_Obj prev_Obj = m_LineObj.GetAt(i);
- CFX_AffineMatrix prev_matrix;
- prev_Obj.m_pTextObj->GetTextMatrix(&prev_matrix);
- FX_FLOAT Prev_x = prev_Obj.m_pTextObj->GetPosX(), Prev_y = prev_Obj.m_pTextObj->GetPosY();
- prev_Obj.m_formMatrix.Transform(Prev_x, Prev_y);
- m_DisplayMatrix.Transform(Prev_x, Prev_y);
- if(this_x >= Prev_x) {
- if(i == count - 1) {
- m_LineObj.Add(Obj);
- } else {
- m_LineObj.InsertAt(i + 1, Obj);
- }
- break;
- }
- }
- if(i < 0) {
- m_LineObj.InsertAt(0, Obj);
- }
- } else {
- m_LineObj.Add(Obj);
- }
-}
-FX_INT32 CPDF_TextPage::PreMarkedContent(PDFTEXT_Obj Obj)
-{
- CPDF_TextObject* pTextObj = Obj.m_pTextObj;
- CPDF_ContentMarkData* pMarkData = (CPDF_ContentMarkData*)pTextObj->m_ContentMark.GetObject();
- if(!pMarkData) {
- return FPDFTEXT_MC_PASS;
- }
- int nContentMark = pMarkData->CountItems();
- if (nContentMark < 1) {
- return FPDFTEXT_MC_PASS;
- }
- CFX_WideString actText;
- FX_BOOL bExist = FALSE;
- CPDF_Dictionary* pDict = NULL;
- int n = 0;
- for (n = 0; n < nContentMark; n++) {
- CPDF_ContentMarkItem& item = pMarkData->GetItem(n);
- CFX_ByteString tagStr = (CFX_ByteString)item.GetName();
- pDict = (CPDF_Dictionary*)item.GetParam();
- CPDF_String* temp = (CPDF_String*)pDict->GetElement(FX_BSTRC("ActualText"));
- if (temp) {
- bExist = TRUE;
- actText = temp->GetUnicodeText();
- }
- }
- if (!bExist) {
- return FPDFTEXT_MC_PASS;
- }
- if (m_pPreTextObj) {
- if (CPDF_ContentMarkData* pPreMarkData = (CPDF_ContentMarkData*)m_pPreTextObj->m_ContentMark.GetObject()) {
- if (pPreMarkData->CountItems() == n) {
- CPDF_ContentMarkItem& item = pPreMarkData->GetItem(n - 1);
- if (pDict == item.GetParam()) {
- return FPDFTEXT_MC_DONE;
- }
- }
- }
- }
- CPDF_Font* pFont = pTextObj->GetFont();
- FX_STRSIZE nItems = actText.GetLength();
- if (nItems < 1) {
- return FPDFTEXT_MC_PASS;
- }
- bExist = FALSE;
- for (FX_STRSIZE i = 0; i < nItems; i++) {
- FX_WCHAR wChar = actText.GetAt(i);
- if (-1 == pFont->CharCodeFromUnicode(wChar)) {
- continue;
- } else {
- bExist = TRUE;
- break;
- }
- }
- if (!bExist) {
- return FPDFTEXT_MC_PASS;
- }
- bExist = FALSE;
- for (FX_STRSIZE j = 0; j < nItems; j++) {
- FX_WCHAR wChar = actText.GetAt(j);
- if ((wChar > 0x80 && wChar < 0xFFFD) || (wChar <= 0x80 && isprint(wChar))) {
- bExist = TRUE;
- break;
- }
- }
- if (!bExist) {
- return FPDFTEXT_MC_DONE;
- }
- return FPDFTEXT_MC_DELAY;
-}
-void CPDF_TextPage::ProcessMarkedContent(PDFTEXT_Obj Obj)
-{
- CPDF_TextObject* pTextObj = Obj.m_pTextObj;
- CPDF_ContentMarkData* pMarkData = (CPDF_ContentMarkData*)pTextObj->m_ContentMark.GetObject();
- if(!pMarkData) {
- return;
- }
- int nContentMark = pMarkData->CountItems();
- if (nContentMark < 1) {
- return;
- }
- CFX_WideString actText;
- CPDF_Dictionary* pDict = NULL;
- int n = 0;
- for (n = 0; n < nContentMark; n++) {
- CPDF_ContentMarkItem& item = pMarkData->GetItem(n);
- CFX_ByteString tagStr = (CFX_ByteString)item.GetName();
- pDict = (CPDF_Dictionary*)item.GetParam();
- CPDF_String* temp = (CPDF_String*)pDict->GetElement(FX_BSTRC("ActualText"));
- if (temp) {
- actText = temp->GetUnicodeText();
- }
- }
- FX_STRSIZE nItems = actText.GetLength();
- if (nItems < 1) {
- return;
- }
- CPDF_Font* pFont = pTextObj->GetFont();
- CFX_AffineMatrix formMatrix = Obj.m_formMatrix;
- CFX_AffineMatrix matrix;
- pTextObj->GetTextMatrix(&matrix);
- matrix.Concat(formMatrix);
- FX_FLOAT fPosX = pTextObj->GetPosX();
- FX_FLOAT fPosY = pTextObj->GetPosY();
- int nCharInfoIndex = m_TextBuf.GetLength();
- CFX_FloatRect charBox;
- charBox.top = pTextObj->m_Top;
- charBox.left = pTextObj->m_Left;
- charBox.right = pTextObj->m_Right;
- charBox.bottom = pTextObj->m_Bottom;
- for (FX_STRSIZE k = 0; k < nItems; k++) {
- FX_WCHAR wChar = actText.GetAt(k);
- if (wChar <= 0x80 && !isprint(wChar)) {
- wChar = 0x20;
- }
- if (wChar >= 0xFFFD) {
- continue;
- }
- PAGECHAR_INFO charinfo;
- charinfo.m_OriginX = fPosX;
- charinfo.m_OriginY = fPosY;
- charinfo.m_Index = nCharInfoIndex;
- charinfo.m_Unicode = wChar;
- charinfo.m_CharCode = pFont->CharCodeFromUnicode(wChar);
- charinfo.m_Flag = FPDFTEXT_CHAR_PIECE;
- charinfo.m_pTextObj = pTextObj;
- charinfo.m_CharBox.top = charBox.top;
- charinfo.m_CharBox.left = charBox.left;
- charinfo.m_CharBox.right = charBox.right;
- charinfo.m_CharBox.bottom = charBox.bottom;
- charinfo.m_Matrix.Copy(matrix);
- m_TempTextBuf.AppendChar(wChar);
- m_TempCharList.Add(charinfo);
- }
-}
-void CPDF_TextPage::FindPreviousTextObject(void)
-{
- if (m_TempCharList.GetSize() < 1 && m_charList.GetSize() < 1) {
- return;
- }
- PAGECHAR_INFO preChar;
- if (m_TempCharList.GetSize() >= 1) {
- preChar = *(PAGECHAR_INFO*)m_TempCharList.GetAt(m_TempCharList.GetSize() - 1);
- } else {
- preChar = *(PAGECHAR_INFO*)m_charList.GetAt(m_charList.GetSize() - 1);
- }
- if (preChar.m_pTextObj) {
- m_pPreTextObj = preChar.m_pTextObj;
- }
-}
-void CPDF_TextPage::ProcessTextObject(PDFTEXT_Obj Obj)
-{
- CPDF_TextObject* pTextObj = Obj.m_pTextObj;
- if(FXSYS_fabs(pTextObj->m_Right - pTextObj->m_Left) < 0.01f ) {
- return;
- }
- CFX_AffineMatrix formMatrix = Obj.m_formMatrix;
- CPDF_Font* pFont = pTextObj->GetFont();
- CFX_AffineMatrix matrix;
- pTextObj->GetTextMatrix(&matrix);
- matrix.Concat(formMatrix);
- FX_INT32 bPreMKC = PreMarkedContent(Obj);
- if (FPDFTEXT_MC_DONE == bPreMKC) {
- m_pPreTextObj = pTextObj;
- m_perMatrix.Copy(formMatrix);
- return;
- }
- int result = 0;
- if (m_pPreTextObj) {
- result = ProcessInsertObject(pTextObj, formMatrix);
- if (2 == result) {
- m_CurlineRect = CFX_FloatRect(Obj.m_pTextObj->m_Left, Obj.m_pTextObj->m_Bottom, Obj.m_pTextObj->m_Right, Obj.m_pTextObj->m_Top);
- } else {
- m_CurlineRect.Union(CFX_FloatRect(Obj.m_pTextObj->m_Left, Obj.m_pTextObj->m_Bottom, Obj.m_pTextObj->m_Right, Obj.m_pTextObj->m_Top));
- }
- PAGECHAR_INFO generateChar;
- if (result == 1) {
- if (GenerateCharInfo(TEXT_BLANK_CHAR, generateChar)) {
- if (!formMatrix.IsIdentity()) {
- generateChar.m_Matrix.Copy(formMatrix);
- }
- m_TempTextBuf.AppendChar(TEXT_BLANK_CHAR);
- m_TempCharList.Add(generateChar);
- }
- } else if(result == 2) {
- CloseTempLine();
- if(m_TextBuf.GetSize()) {
- if(m_ParseOptions.m_bGetCharCodeOnly) {
- m_TextBuf.AppendChar(TEXT_RETURN_CHAR);
- m_TextBuf.AppendChar(TEXT_LINEFEED_CHAR);
- } else {
- if(GenerateCharInfo(TEXT_RETURN_CHAR, generateChar)) {
- m_TextBuf.AppendChar(TEXT_RETURN_CHAR);
- if (!formMatrix.IsIdentity()) {
- generateChar.m_Matrix.Copy(formMatrix);
- }
- m_charList.Add(generateChar);
- }
- if(GenerateCharInfo(TEXT_LINEFEED_CHAR, generateChar)) {
- m_TextBuf.AppendChar(TEXT_LINEFEED_CHAR);
- if (!formMatrix.IsIdentity()) {
- generateChar.m_Matrix.Copy(formMatrix);
- }
- m_charList.Add(generateChar);
- }
- }
- }
- } else if (result == 3 && !m_ParseOptions.m_bOutputHyphen) {
- FX_INT32 nChars = pTextObj->CountChars();
- if (nChars == 1) {
- CPDF_TextObjectItem item;
- pTextObj->GetCharInfo(0, &item);
- CFX_WideString wstrItem = pTextObj->GetFont()->UnicodeFromCharCode(item.m_CharCode);
- if(wstrItem.IsEmpty()) {
- wstrItem += (FX_WCHAR)item.m_CharCode;
- }
- FX_WCHAR curChar = wstrItem.GetAt(0);
- if (0x2D == curChar || 0xAD == curChar) {
- return;
- }
- }
- while (m_TempTextBuf.GetSize() > 0 && m_TempTextBuf.GetWideString().GetAt(m_TempTextBuf.GetLength() - 1) == 0x20) {
- m_TempTextBuf.Delete(m_TempTextBuf.GetLength() - 1, 1);
- m_TempCharList.Delete(m_TempCharList.GetSize() - 1);
- }
- PAGECHAR_INFO* cha = (PAGECHAR_INFO*)m_TempCharList.GetAt(m_TempCharList.GetSize() - 1);
- m_TempTextBuf.Delete(m_TempTextBuf.GetLength() - 1, 1);
-#ifdef FOXIT_CHROME_BUILD
- cha->m_Unicode = 0x2;
- cha->m_Flag = FPDFTEXT_CHAR_HYPHEN;
- m_TempTextBuf.AppendChar(0xfffe);
-#else
- cha->m_Unicode = 0;
- m_TempTextBuf.AppendChar(0xfffe);
-#endif
- }
- } else {
- m_CurlineRect = CFX_FloatRect(Obj.m_pTextObj->m_Left, Obj.m_pTextObj->m_Bottom, Obj.m_pTextObj->m_Right, Obj.m_pTextObj->m_Top);
- }
- if (FPDFTEXT_MC_DELAY == bPreMKC) {
- ProcessMarkedContent(Obj);
- m_pPreTextObj = pTextObj;
- m_perMatrix.Copy(formMatrix);
- return;
- }
- m_pPreTextObj = pTextObj;
- m_perMatrix.Copy(formMatrix);
- int nItems = pTextObj->CountItems();
- FX_FLOAT spacing = 0;
- FX_FLOAT baseSpace = 0.0;
- FX_BOOL bAllChar = TRUE;
- if (pTextObj->m_TextState.GetObject()->m_CharSpace && nItems >= 3) {
- spacing = matrix.TransformDistance(pTextObj->m_TextState.GetObject()->m_CharSpace);
- baseSpace = spacing;
- for (int i = 0; i < nItems; i++) {
- CPDF_TextObjectItem item;
- pTextObj->GetItemInfo(i, &item);
- if (item.m_CharCode == (FX_DWORD) - 1) {
- FX_FLOAT fontsize_h = pTextObj->m_TextState.GetFontSizeH();
- FX_FLOAT kerning = -fontsize_h * item.m_OriginX / 1000;
- if(kerning + spacing < baseSpace) {
- baseSpace = kerning + spacing;
- }
- bAllChar = FALSE;
- }
- }
- spacing = 0;
- if(baseSpace < 0.0 || (nItems == 3 && !bAllChar)) {
- baseSpace = 0.0;
- }
- }
- for (int i = 0; i < nItems; i++) {
- CPDF_TextObjectItem item;
- PAGECHAR_INFO charinfo;
- charinfo.m_OriginX = 0;
- charinfo.m_OriginY = 0;
- pTextObj->GetItemInfo(i, &item);
- if (item.m_CharCode == (FX_DWORD) - 1) {
- CFX_WideString str = m_TempTextBuf.GetWideString();
- if(str.IsEmpty()) {
- str = m_TextBuf.GetWideString();
- }
- if (str.IsEmpty() || str.GetAt(str.GetLength() - 1) == TEXT_BLANK_CHAR) {
- continue;
- }
- FX_FLOAT fontsize_h = pTextObj->m_TextState.GetFontSizeH();
- spacing = -fontsize_h * item.m_OriginX / 1000;
- continue;
- }
- FX_FLOAT charSpace = pTextObj->m_TextState.GetObject()->m_CharSpace;
- if (charSpace > 0.001) {
- spacing += matrix.TransformDistance(charSpace);
- } else if(charSpace < -0.001) {
- spacing -= matrix.TransformDistance(FXSYS_fabs(charSpace));
- }
- spacing -= baseSpace;
- if (spacing && i > 0) {
- int last_width = 0;
- FX_FLOAT fontsize_h = pTextObj->m_TextState.GetFontSizeH();
- FX_DWORD space_charcode = pFont->CharCodeFromUnicode(' ');
- FX_FLOAT threshold = 0;
- if (space_charcode != -1) {
- threshold = fontsize_h * pFont->GetCharWidthF(space_charcode) / 1000 ;
- }
- if (threshold > fontsize_h / 3) {
- threshold = 0;
- } else {
- threshold /= 2;
- }
- if (threshold == 0) {
- threshold = fontsize_h;
- int this_width = FXSYS_abs(GetCharWidth(item.m_CharCode, pFont));
- threshold = this_width > last_width ? (FX_FLOAT)this_width : (FX_FLOAT)last_width;
- int nDivide = 6;
- if (threshold < 300) {
- nDivide = 2;
- } else if (threshold < 500) {
- nDivide = 4;
- } else if (threshold < 700) {
- nDivide = 5;
- }
- threshold = threshold / nDivide;
- threshold = fontsize_h * threshold / 1000;
- }
- if (threshold && (spacing && spacing >= threshold) ) {
- charinfo.m_Unicode = TEXT_BLANK_CHAR;
- charinfo.m_Flag = FPDFTEXT_CHAR_GENERATED;
- charinfo.m_pTextObj = pTextObj;
- charinfo.m_Index = m_TextBuf.GetLength();
- m_TempTextBuf.AppendChar(TEXT_BLANK_CHAR);
- charinfo.m_CharCode = -1;
- charinfo.m_Matrix.Copy(formMatrix);
- matrix.Transform(item.m_OriginX, item.m_OriginY, charinfo.m_OriginX, charinfo.m_OriginY);
- charinfo.m_CharBox = CFX_FloatRect(charinfo.m_OriginX, charinfo.m_OriginY, charinfo.m_OriginX, charinfo.m_OriginY);
- m_TempCharList.Add(charinfo);
- }
- if (item.m_CharCode == (FX_DWORD) - 1) {
- continue;
- }
- }
- spacing = 0;
- CFX_WideString wstrItem = pFont->UnicodeFromCharCode(item.m_CharCode);
- FX_BOOL bNoUnicode = FALSE;
- FX_WCHAR wChar = wstrItem.GetAt(0);
- if ((wstrItem.IsEmpty() || wChar == 0) && item.m_CharCode) {
- if(wstrItem.IsEmpty()) {
- wstrItem += (FX_WCHAR)item.m_CharCode;
- } else {
- wstrItem.SetAt(0, (FX_WCHAR)item.m_CharCode);
- }
- bNoUnicode = TRUE;
- }
- charinfo.m_Index = -1;
- charinfo.m_CharCode = item.m_CharCode;
- if(bNoUnicode) {
- charinfo.m_Flag = FPDFTEXT_CHAR_UNUNICODE;
- } else {
- charinfo.m_Flag = FPDFTEXT_CHAR_NORMAL;
- }
- charinfo.m_pTextObj = pTextObj;
- charinfo.m_OriginX = 0, charinfo.m_OriginY = 0;
- matrix.Transform(item.m_OriginX, item.m_OriginY, charinfo.m_OriginX, charinfo.m_OriginY);
- FX_RECT rect(0, 0, 0, 0);
- rect.Intersect(0, 0, 0, 0);
- charinfo.m_pTextObj->GetFont()->GetCharBBox(charinfo.m_CharCode, rect);
- charinfo.m_CharBox.top = rect.top * pTextObj->GetFontSize() / 1000 + item.m_OriginY;
- charinfo.m_CharBox.left = rect.left * pTextObj->GetFontSize() / 1000 + item.m_OriginX;
- charinfo.m_CharBox.right = rect.right * pTextObj->GetFontSize() / 1000 + item.m_OriginX;
- charinfo.m_CharBox.bottom = rect.bottom * pTextObj->GetFontSize() / 1000 + item.m_OriginY;
- if (fabsf(charinfo.m_CharBox.top - charinfo.m_CharBox.bottom) < 0.01f) {
- charinfo.m_CharBox.top = charinfo.m_CharBox.bottom + pTextObj->GetFontSize();
- }
- if (fabsf(charinfo.m_CharBox.right - charinfo.m_CharBox.left) < 0.01f) {
- charinfo.m_CharBox.right = charinfo.m_CharBox.left + pTextObj->GetCharWidth(charinfo.m_CharCode);
- }
- matrix.TransformRect(charinfo.m_CharBox);
- charinfo.m_Matrix.Copy(matrix);
- if (wstrItem.IsEmpty()) {
- charinfo.m_Unicode = 0;
- m_TempCharList.Add(charinfo);
- m_TempTextBuf.AppendChar(0xfffe);
- continue;
- } else {
- int nTotal = wstrItem.GetLength();
- int n = 0;
- FX_BOOL bDel = FALSE;
- while (n < m_TempCharList.GetSize() && n < 7) {
- n++;
- PAGECHAR_INFO* charinfo1 = (PAGECHAR_INFO*)m_TempCharList.GetAt(m_TempCharList.GetSize() - n);
- if(charinfo1->m_CharCode == charinfo.m_CharCode &&
- charinfo1->m_pTextObj->GetFont() == charinfo.m_pTextObj->GetFont() &&
- FXSYS_fabs(charinfo1->m_OriginX - charinfo.m_OriginX) < TEXT_CHARRATIO_GAPDELTA * pTextObj->GetFontSize() &&
- FXSYS_fabs(charinfo1->m_OriginY - charinfo.m_OriginY) < TEXT_CHARRATIO_GAPDELTA * pTextObj->GetFontSize() ) {
- bDel = TRUE;
- break;
- }
- }
- if(!bDel) {
- for (int nIndex = 0; nIndex < nTotal; nIndex++) {
- charinfo.m_Unicode = wstrItem.GetAt(nIndex);
- if (charinfo.m_Unicode) {
- charinfo.m_Index = m_TextBuf.GetLength();
- m_TempTextBuf.AppendChar(charinfo.m_Unicode);
- } else {
- m_TempTextBuf.AppendChar(0xfffe);
- }
- m_TempCharList.Add(charinfo);
- }
- } else if(i == 0) {
- CFX_WideString str = m_TempTextBuf.GetWideString();
- if (!str.IsEmpty() && str.GetAt(str.GetLength() - 1) == TEXT_BLANK_CHAR) {
- m_TempTextBuf.Delete(m_TempTextBuf.GetLength() - 1, 1);
- m_TempCharList.Delete(m_TempCharList.GetSize() - 1);
- }
- }
- }
- }
-}
-FX_INT32 CPDF_TextPage::GetTextObjectWritingMode(const CPDF_TextObject* pTextObj)
-{
- FX_INT32 nChars = pTextObj->CountChars();
- if (nChars == 1) {
- return m_TextlineDir;
- }
- CPDF_TextObjectItem first, last;
- pTextObj->GetCharInfo(0, &first);
- pTextObj->GetCharInfo(nChars - 1, &last);
- CFX_Matrix textMatrix;
- pTextObj->GetTextMatrix(&textMatrix);
- textMatrix.TransformPoint(first.m_OriginX, first.m_OriginY);
- textMatrix.TransformPoint(last.m_OriginX, last.m_OriginY);
- FX_FLOAT dX = FXSYS_fabs(last.m_OriginX - first.m_OriginX);
- FX_FLOAT dY = FXSYS_fabs(last.m_OriginY - first.m_OriginY);
- if (dX <= 0.0001f && dY <= 0.0001f) {
- return -1;
- }
- CFX_VectorF v;
- v.Set(dX, dY);
- v.Normalize();
- if (v.y <= 0.0872f) {
- if (v.x <= 0.0872f) {
- return m_TextlineDir;
- }
- return 0;
- } else if (v.x <= 0.0872f) {
- return 1;
- }
- return m_TextlineDir;
-}
-FX_BOOL CPDF_TextPage::IsHyphen(FX_WCHAR curChar)
-{
- CFX_WideString strCurText = m_TempTextBuf.GetWideString();
- if(strCurText.GetLength() == 0) {
- strCurText = m_TextBuf.GetWideString();
- }
- FX_STRSIZE nCount = strCurText.GetLength();
- int nIndex = nCount - 1;
- FX_WCHAR wcTmp = strCurText.GetAt(nIndex);
- while(wcTmp == 0x20 && nIndex <= nCount - 1 && nIndex >= 0) {
- wcTmp = strCurText.GetAt(--nIndex);
- }
- if (0x2D == wcTmp || 0xAD == wcTmp) {
- if (--nIndex > 0) {
- FX_WCHAR preChar = strCurText.GetAt((nIndex));
- if (((preChar >= L'A' && preChar <= L'Z') || (preChar >= L'a' && preChar <= L'z'))
- && ((curChar >= L'A' && curChar <= L'Z') || (curChar >= L'a' && curChar <= L'z'))) {
- return TRUE;
- }
- }
- int size = m_TempCharList.GetSize();
- PAGECHAR_INFO preChar;
- if (size) {
- preChar = (PAGECHAR_INFO)m_TempCharList[size - 1];
- } else {
- size = m_charList.GetSize();
- if(size == 0) {
- return FALSE;
- }
- preChar = (PAGECHAR_INFO)m_charList[size - 1];
- }
- if (FPDFTEXT_CHAR_PIECE == preChar.m_Flag)
- if (0xAD == preChar.m_Unicode || 0x2D == preChar.m_Unicode) {
- return TRUE;
- }
- }
- return FALSE;
-}
-int CPDF_TextPage::ProcessInsertObject(const CPDF_TextObject* pObj, CFX_AffineMatrix formMatrix)
-{
- FindPreviousTextObject();
- FX_BOOL bNewline = FALSE;
- int WritingMode = GetTextObjectWritingMode(pObj);
- if(WritingMode == -1) {
- WritingMode = GetTextObjectWritingMode(m_pPreTextObj);
- }
- CFX_FloatRect this_rect(pObj->m_Left, pObj->m_Bottom, pObj->m_Right, pObj->m_Top);
- CFX_FloatRect prev_rect(m_pPreTextObj->m_Left, m_pPreTextObj->m_Bottom, m_pPreTextObj->m_Right, m_pPreTextObj->m_Top);
- CPDF_TextObjectItem PrevItem, item;
- int nItem = m_pPreTextObj->CountItems();
- m_pPreTextObj->GetItemInfo(nItem - 1, &PrevItem);
- pObj->GetItemInfo(0, &item);
- CFX_WideString wstrItem = pObj->GetFont()->UnicodeFromCharCode(item.m_CharCode);
- if(wstrItem.IsEmpty()) {
- wstrItem += (FX_WCHAR)item.m_CharCode;
- }
- FX_WCHAR curChar = wstrItem.GetAt(0);
- if(WritingMode == 0) {
- if(this_rect.Height() > 4.5 && prev_rect.Height() > 4.5) {
- FX_FLOAT top = this_rect.top < prev_rect.top ? this_rect.top : prev_rect.top;
- FX_FLOAT bottom = this_rect.bottom > prev_rect.bottom ? this_rect.bottom : prev_rect.bottom;
- if(bottom >= top) {
- if(IsHyphen(curChar)) {
- return 3;
- }
- return 2;
- }
- }
- } else if (WritingMode == 1) {
- if(this_rect.Width() > pObj->GetFontSize() * 0.1f && prev_rect.Width() > m_pPreTextObj->GetFontSize() * 0.1f) {
- FX_FLOAT left = this_rect.left > m_CurlineRect.left ? this_rect.left : m_CurlineRect.left;
- FX_FLOAT right = this_rect.right < m_CurlineRect.right ? this_rect.right : m_CurlineRect.right;
- if(right <= left) {
- if(IsHyphen(curChar)) {
- return 3;
- }
- return 2;
- }
- }
- }
- FX_FLOAT last_pos = PrevItem.m_OriginX;
- int nLastWidth = GetCharWidth(PrevItem.m_CharCode, m_pPreTextObj->GetFont());
- FX_FLOAT last_width = nLastWidth * m_pPreTextObj->GetFontSize() / 1000;
- last_width = FXSYS_fabs(last_width);
- int nThisWidth = GetCharWidth(item.m_CharCode, pObj->GetFont());
- FX_FLOAT this_width = nThisWidth * pObj->GetFontSize() / 1000;
- this_width = FXSYS_fabs(this_width);
- FX_FLOAT threshold = last_width > this_width ? last_width / 4 : this_width / 4;
- CFX_AffineMatrix prev_matrix, prev_reverse;
- m_pPreTextObj->GetTextMatrix(&prev_matrix);
- prev_matrix.Concat(m_perMatrix);
- prev_reverse.SetReverse(prev_matrix);
- FX_FLOAT x = pObj->GetPosX();
- FX_FLOAT y = pObj->GetPosY();
- formMatrix.Transform(x, y);
- prev_reverse.Transform(x, y);
- if(last_width < this_width) {
- threshold = prev_reverse.TransformDistance(threshold);
- }
- CFX_FloatRect rect1(m_pPreTextObj->m_Left, pObj->m_Bottom, m_pPreTextObj->m_Right, pObj->m_Top);
- CFX_FloatRect rect2(m_pPreTextObj->m_Left, m_pPreTextObj->m_Bottom, m_pPreTextObj->m_Right, m_pPreTextObj->m_Top);
- CFX_FloatRect rect3 = rect1;
- rect1.Intersect(rect2);
- if (WritingMode == 0) {
- if ((rect1.IsEmpty() && rect2.Height() > 5 && rect3.Height() > 5)
- || ((y > threshold * 2 || y < threshold * -3) && (FXSYS_fabs(y) < 1 ? FXSYS_fabs(x) < FXSYS_fabs(y) : TRUE))) {
- bNewline = TRUE;
- if(nItem > 1 ) {
- CPDF_TextObjectItem tempItem;
- m_pPreTextObj->GetItemInfo(0, &tempItem);
- CFX_AffineMatrix m;
- m_pPreTextObj->GetTextMatrix(&m);
- if(PrevItem.m_OriginX > tempItem.m_OriginX &&
- m_DisplayMatrix.a > 0.9 && m_DisplayMatrix.b < 0.1 &&
- m_DisplayMatrix.c < 0.1 && m_DisplayMatrix.d < -0.9
- && m.b < 0.1 && m.c < 0.1 ) {
- CFX_FloatRect re(0, m_pPreTextObj->m_Bottom, 1000, m_pPreTextObj->m_Top);
- if(re.Contains(pObj->GetPosX(), pObj->GetPosY())) {
- bNewline = FALSE;
- } else {
- CFX_FloatRect re(0, pObj->m_Bottom, 1000, pObj->m_Top);
- if(re.Contains(m_pPreTextObj->GetPosX(), m_pPreTextObj->GetPosY())) {
- bNewline = FALSE;
- }
- }
- }
- }
- }
- }
- if(bNewline) {
- if(IsHyphen(curChar)) {
- return 3;
- }
- return 2;
- }
- FX_INT32 nChars = pObj->CountChars();
- if (nChars == 1 && ( 0x2D == curChar || 0xAD == curChar))
- if (IsHyphen(curChar)) {
- return 3;
- }
- CFX_WideString PrevStr = m_pPreTextObj->GetFont()->UnicodeFromCharCode(PrevItem.m_CharCode);
- FX_WCHAR preChar = PrevStr.GetAt(PrevStr.GetLength() - 1);
- CFX_AffineMatrix matrix;
- pObj->GetTextMatrix(&matrix);
- matrix.Concat(formMatrix);
- threshold = (FX_FLOAT)(nLastWidth > nThisWidth ? nLastWidth : nThisWidth);
- threshold = threshold > 400 ? (threshold < 700 ? threshold / 4 : (threshold > 800 ? threshold / 6 : threshold / 5)) : (threshold / 2);
- if(nLastWidth >= nThisWidth) {
- threshold *= FXSYS_fabs(m_pPreTextObj->GetFontSize());
- } else {
- threshold *= FXSYS_fabs(pObj->GetFontSize());
- threshold = matrix.TransformDistance(threshold);
- threshold = prev_reverse.TransformDistance(threshold);
- }
- threshold /= 1000;
- if((threshold < 1.4881 && threshold > 1.4879)
- || (threshold < 1.39001 && threshold > 1.38999)) {
- threshold *= 1.5;
- }
- if (FXSYS_fabs(last_pos + last_width - x) > threshold && curChar != L' ' && preChar != L' ')
- if (curChar != L' ' && preChar != L' ') {
- if((x - last_pos - last_width) > threshold || (last_pos - x - last_width) > threshold) {
- return 1;
- }
- if(x < 0 && (last_pos - x - last_width) > threshold) {
- return 1;
- }
- if((x - last_pos - last_width) > this_width || (x - last_pos - this_width) > last_width ) {
- return 1;
- }
- }
- return 0;
-}
-FX_BOOL CPDF_TextPage::IsSameTextObject(CPDF_TextObject* pTextObj1, CPDF_TextObject* pTextObj2)
-{
- if (!pTextObj1 || !pTextObj2) {
- return FALSE;
- }
- CFX_FloatRect rcPreObj(pTextObj2->m_Left, pTextObj2->m_Bottom, pTextObj2->m_Right, pTextObj2->m_Top);
- CFX_FloatRect rcCurObj(pTextObj1->m_Left, pTextObj1->m_Bottom, pTextObj1->m_Right, pTextObj1->m_Top);
- if (rcPreObj.IsEmpty() && rcCurObj.IsEmpty() && !m_ParseOptions.m_bGetCharCodeOnly) {
- FX_FLOAT dbXdif = FXSYS_fabs(rcPreObj.left - rcCurObj.left);
- int nCount = m_charList.GetSize();
- if (nCount >= 2) {
- PAGECHAR_INFO perCharTemp = (PAGECHAR_INFO)m_charList[nCount - 2];
- FX_FLOAT dbSpace = perCharTemp.m_CharBox.Width();
- if (dbXdif > dbSpace) {
- return FALSE;
- }
- }
- }
- if (!rcPreObj.IsEmpty() || !rcCurObj.IsEmpty()) {
- rcPreObj.Intersect(rcCurObj);
- if (rcPreObj.IsEmpty()) {
- return FALSE;
- }
- if (FXSYS_fabs(rcPreObj.Width() - rcCurObj.Width()) > rcCurObj.Width() / 2) {
- return FALSE;
- }
- if (pTextObj2->GetFontSize() != pTextObj1->GetFontSize()) {
- return FALSE;
- }
- }
- int nPreCount = pTextObj2->CountItems();
- int nCurCount = pTextObj1->CountItems();
- if (nPreCount != nCurCount) {
- return FALSE;
- }
- CPDF_TextObjectItem itemPer, itemCur;
- for (int i = 0; i < nPreCount; i++) {
- pTextObj2->GetItemInfo(i, &itemPer);
- pTextObj1->GetItemInfo(i, &itemCur);
- if (itemCur.m_CharCode != itemPer.m_CharCode) {
- return FALSE;
- }
- }
- if(FXSYS_fabs(pTextObj1->GetPosX() - pTextObj2->GetPosX()) > GetCharWidth(itemPer.m_CharCode, pTextObj2->GetFont())*pTextObj2->GetFontSize() / 1000 * 0.9 ||
- FXSYS_fabs(pTextObj1->GetPosY() - pTextObj2->GetPosY()) >
- FX_MAX(FX_MAX(rcPreObj.Height() , rcPreObj.Width()), pTextObj2->GetFontSize()) / 8) {
- return FALSE;
- }
- return TRUE;
-}
-FX_BOOL CPDF_TextPage::IsSameAsPreTextObject(CPDF_TextObject* pTextObj, FX_POSITION ObjPos)
-{
- if (!pTextObj) {
- return FALSE;
- }
- int i = 0;
- if (!ObjPos) {
- ObjPos = m_pPage->GetLastObjectPosition();
- }
- CPDF_PageObject* pObj = m_pPage->GetPrevObject(ObjPos);
- while (i < 5 && ObjPos) {
- pObj = m_pPage->GetPrevObject(ObjPos);
- if(pObj == pTextObj) {
- continue;
- }
- if(pObj->m_Type != PDFPAGE_TEXT) {
- continue;
- }
- if(IsSameTextObject((CPDF_TextObject*)pObj, pTextObj)) {
- return TRUE;
- }
- i++;
- }
- return FALSE;
-}
-FX_BOOL CPDF_TextPage::GenerateCharInfo(FX_WCHAR unicode, PAGECHAR_INFO& info)
-{
- int size = m_TempCharList.GetSize();
- PAGECHAR_INFO preChar;
- if (size) {
- preChar = (PAGECHAR_INFO)m_TempCharList[size - 1];
- } else {
- size = m_charList.GetSize();
- if(size == 0) {
- return FALSE;
- }
- preChar = (PAGECHAR_INFO)m_charList[size - 1];
- }
- info.m_Index = m_TextBuf.GetLength();
- info.m_Unicode = unicode;
- info.m_pTextObj = NULL;
- info.m_CharCode = -1;
- info.m_Flag = FPDFTEXT_CHAR_GENERATED;
- int preWidth = 0;
- if (preChar.m_pTextObj && preChar.m_CharCode != (FX_DWORD) - 1) {
- preWidth = GetCharWidth(preChar.m_CharCode, preChar.m_pTextObj->GetFont());
- }
- FX_FLOAT fs = 0;
- if(preChar.m_pTextObj) {
- fs = preChar.m_pTextObj->GetFontSize();
- } else {
- fs = preChar.m_CharBox.Height();
- }
- if(!fs) {
- fs = 1;
- }
- info.m_OriginX = preChar.m_OriginX + preWidth * (fs) / 1000;
- info.m_OriginY = preChar.m_OriginY;
- info.m_CharBox = CFX_FloatRect(info.m_OriginX, info.m_OriginY, info.m_OriginX, info.m_OriginY);
- return TRUE;
-}
-FX_BOOL CPDF_TextPage::IsRectIntersect(CFX_FloatRect rect1, CFX_FloatRect rect2)
-{
- rect1.Intersect(rect2);
- if(rect1.IsEmpty()) {
- return FALSE;
- }
- return TRUE;
-}
-FX_BOOL CPDF_TextPage::IsLetter(FX_WCHAR unicode)
-{
- if (unicode < L'A') {
- return FALSE;
- }
- if (unicode > L'Z' && unicode < L'a') {
- return FALSE;
- }
- if (unicode > L'z') {
- return FALSE;
- }
- return TRUE;
-}
-CPDF_TextPageFind::CPDF_TextPageFind(const IPDF_TextPage* pTextPage)
- : m_IsFind(FALSE),
- m_pTextPage(NULL)
-{
- if (!pTextPage) {
- return;
- }
- CPDF_ModuleMgr* pPDFModule = CPDF_ModuleMgr::Get();
- m_pTextPage = pTextPage;
- m_strText = m_pTextPage->GetPageText();
- int nCount = pTextPage->CountChars();
- if(nCount) {
- m_CharIndex.Add(0);
- }
- for(int i = 0; i < nCount; i++) {
- FPDF_CHAR_INFO info;
- pTextPage->GetCharInfo(i, info);
- int indexSize = m_CharIndex.GetSize();
- if(info.m_Flag == CHAR_NORMAL || info.m_Flag == CHAR_GENERATED) {
- if(indexSize % 2) {
- m_CharIndex.Add(1);
- } else {
- if(indexSize <= 0) {
- continue;
- }
- m_CharIndex.SetAt(indexSize - 1, m_CharIndex.GetAt(indexSize - 1) + 1);
- }
- } else {
- if(indexSize % 2) {
- if(indexSize <= 0) {
- continue;
- }
- m_CharIndex.SetAt(indexSize - 1, i + 1);
- } else {
- m_CharIndex.Add(i + 1);
- }
- }
- }
- int indexSize = m_CharIndex.GetSize();
- if(indexSize % 2) {
- m_CharIndex.RemoveAt(indexSize - 1);
- }
- m_resStart = 0;
- m_resEnd = -1;
-}
-int CPDF_TextPageFind::GetCharIndex(int index) const
-{
- return m_pTextPage->CharIndexFromTextIndex(index);
- int indexSize = m_CharIndex.GetSize();
- int count = 0;
- for(int i = 0; i < indexSize; i += 2) {
- count += m_CharIndex.GetAt(i + 1);
- if(count > index) {
- return index - count + m_CharIndex.GetAt(i + 1) + m_CharIndex.GetAt(i);
- }
- }
- return -1;
-}
-FX_BOOL CPDF_TextPageFind::FindFirst(CFX_WideString findwhat, int flags, int startPos)
-{
- if (!m_pTextPage) {
- return FALSE;
- }
- if (m_strText.IsEmpty() || m_bMatchCase != (flags & FPDFTEXT_MATCHCASE)) {
- m_strText = m_pTextPage->GetPageText();
- }
- m_findWhat = findwhat;
- m_flags = flags;
- m_bMatchCase = flags & FPDFTEXT_MATCHCASE;
- if (m_strText.IsEmpty()) {
- m_IsFind = FALSE;
- return TRUE;
- }
- FX_STRSIZE len = findwhat.GetLength();
- if (!m_bMatchCase) {
- findwhat.MakeLower();
- m_strText.MakeLower();
- }
- m_bMatchWholeWord = flags & FPDFTEXT_MATCHWHOLEWORD;
- m_findNextStart = startPos;
- if (startPos == -1) {
- m_findPreStart = m_strText.GetLength() - 1;
- } else {
- m_findPreStart = startPos;
- }
- m_csFindWhatArray.RemoveAll();
- int i = 0;
- while(i < len) {
- if(findwhat.GetAt(i) != ' ') {
- break;
- }
- i++;
- }
- if(i < len) {
- ExtractFindWhat(findwhat);
- } else {
- m_csFindWhatArray.Add(findwhat);
- }
- if(m_csFindWhatArray.GetSize() <= 0) {
- return FALSE;
- }
- m_IsFind = TRUE;
- m_resStart = 0;
- m_resEnd = -1;
- return TRUE;
-}
-FX_BOOL CPDF_TextPageFind::FindNext()
-{
- if (!m_pTextPage) {
- return FALSE;
- }
- m_resArray.RemoveAll();
- if(m_findNextStart == -1) {
- return FALSE;
- }
- if(m_strText.IsEmpty()) {
- m_IsFind = FALSE;
- return m_IsFind;
- }
- int strLen = m_strText.GetLength();
- if (m_findNextStart > strLen - 1) {
- m_IsFind = FALSE;
- return m_IsFind;
- }
- int nCount = m_csFindWhatArray.GetSize();
- int nResultPos = 0;
- int nStartPos = 0;
- nStartPos = m_findNextStart;
- FX_BOOL bSpaceStart = FALSE;
- for(int iWord = 0; iWord < nCount; iWord++) {
- CFX_WideString csWord = m_csFindWhatArray[iWord];
- if(csWord.IsEmpty()) {
- if(iWord == nCount - 1) {
- FX_WCHAR strInsert = m_strText.GetAt(nStartPos);
- if(strInsert == TEXT_LINEFEED_CHAR || strInsert == TEXT_BLANK_CHAR || strInsert == TEXT_RETURN_CHAR || strInsert == 160) {
- nResultPos = nStartPos + 1;
- break;
- }
- iWord = -1;
- } else if(iWord == 0) {
- bSpaceStart = TRUE;
- }
- continue;
- }
- int endIndex;
- nResultPos = m_strText.Find(csWord, nStartPos);
- if (nResultPos == -1) {
- m_IsFind = FALSE;
- return m_IsFind;
- }
- endIndex = nResultPos + csWord.GetLength() - 1;
- if(iWord == 0) {
- m_resStart = nResultPos;
- }
- FX_BOOL bMatch = TRUE;
- if(iWord != 0 && !bSpaceStart) {
- int PreResEndPos = nStartPos;
- int curChar = csWord.GetAt(0);
- CFX_WideString lastWord = m_csFindWhatArray[iWord - 1];
- int lastChar = lastWord.GetAt(lastWord.GetLength() - 1);
- if(nStartPos == nResultPos && !(_IsIgnoreSpaceCharacter(lastChar) || _IsIgnoreSpaceCharacter(curChar))) {
- bMatch = FALSE;
- }
- for(int d = PreResEndPos; d < nResultPos; d++) {
- FX_WCHAR strInsert = m_strText.GetAt(d);
- if(strInsert != TEXT_LINEFEED_CHAR && strInsert != TEXT_BLANK_CHAR && strInsert != TEXT_RETURN_CHAR && strInsert != 160) {
- bMatch = FALSE;
- break;
- }
- }
- } else if(bSpaceStart) {
- if(nResultPos > 0) {
- FX_WCHAR strInsert = m_strText.GetAt(nResultPos - 1);
- if(strInsert != TEXT_LINEFEED_CHAR && strInsert != TEXT_BLANK_CHAR && strInsert != TEXT_RETURN_CHAR && strInsert != 160) {
- bMatch = FALSE;
- m_resStart = nResultPos;
- } else {
- m_resStart = nResultPos - 1;
- }
- }
- }
- if(m_bMatchWholeWord && bMatch) {
- bMatch = IsMatchWholeWord(m_strText, nResultPos, endIndex);
- }
- nStartPos = endIndex + 1;
- if(!bMatch) {
- iWord = -1;
- if(bSpaceStart) {
- nStartPos = m_resStart + m_csFindWhatArray[1].GetLength();
- } else {
- nStartPos = m_resStart + m_csFindWhatArray[0].GetLength();
- }
- }
- }
- m_resEnd = nResultPos + m_csFindWhatArray[m_csFindWhatArray.GetSize() - 1].GetLength() - 1;
- m_IsFind = TRUE;
- int resStart = GetCharIndex(m_resStart);
- int resEnd = GetCharIndex(m_resEnd);
- m_pTextPage->GetRectArray(resStart, resEnd - resStart + 1, m_resArray);
- if(m_flags & FPDFTEXT_CONSECUTIVE) {
- m_findNextStart = m_resStart + 1;
- m_findPreStart = m_resEnd - 1;
- } else {
- m_findNextStart = m_resEnd + 1;
- m_findPreStart = m_resStart - 1;
- }
- return m_IsFind;
-}
-FX_BOOL CPDF_TextPageFind::FindPrev()
-{
- if (!m_pTextPage) {
- return FALSE;
- }
- m_resArray.RemoveAll();
- if(m_strText.IsEmpty() || m_findPreStart < 0) {
- m_IsFind = FALSE;
- return m_IsFind;
- }
- CPDF_TextPageFind findEngine(m_pTextPage);
- FX_BOOL ret = findEngine.FindFirst(m_findWhat, m_flags);
- if(!ret) {
- m_IsFind = FALSE;
- return m_IsFind;
- }
- int order = -1, MatchedCount = 0;
- while(ret) {
- ret = findEngine.FindNext();
- if(ret) {
- int order1 = findEngine.GetCurOrder() ;
- int MatchedCount1 = findEngine.GetMatchedCount();
- if(((order1 + MatchedCount1) - 1) > m_findPreStart) {
- break;
- }
- order = order1;
- MatchedCount = MatchedCount1;
- }
- }
- if(order == -1) {
- m_IsFind = FALSE;
- return m_IsFind;
- }
- m_resStart = m_pTextPage->TextIndexFromCharIndex(order);
- m_resEnd = m_pTextPage->TextIndexFromCharIndex(order + MatchedCount - 1);
- m_IsFind = TRUE;
- m_pTextPage->GetRectArray(order, MatchedCount, m_resArray);
- if(m_flags & FPDFTEXT_CONSECUTIVE) {
- m_findNextStart = m_resStart + 1;
- m_findPreStart = m_resEnd - 1;
- } else {
- m_findNextStart = m_resEnd + 1;
- m_findPreStart = m_resStart - 1;
- }
- return m_IsFind;
-}
-void CPDF_TextPageFind::ExtractFindWhat(CFX_WideString findwhat)
-{
- if(findwhat.IsEmpty()) {
- return ;
- }
- int index = 0;
- while(1) {
- CFX_WideString csWord = TEXT_EMPTY;
- int ret = ExtractSubString(csWord, findwhat, index, TEXT_BLANK_CHAR);
- if(csWord.IsEmpty()) {
- if(ret) {
- m_csFindWhatArray.Add(CFX_WideString(L""));
- index++;
- continue;
- } else {
- break;
- }
- }
- int pos = 0;
- FX_BOOL bLastIgnore = FALSE;
- while(pos < csWord.GetLength()) {
- CFX_WideString curStr = csWord.Mid(pos, 1);
- FX_WCHAR curChar = csWord.GetAt(pos);
- if (_IsIgnoreSpaceCharacter(curChar)) {
- if (pos > 0 && curChar == 0x2019) {
- pos++;
- continue;
- }
- if (pos > 0 ) {
- CFX_WideString preStr = csWord.Mid(0, pos);
- m_csFindWhatArray.Add(preStr);
- }
- m_csFindWhatArray.Add(curStr);
- if (pos == csWord.GetLength() - 1) {
- csWord.Empty();
- break;
- }
- csWord = csWord.Right(csWord.GetLength() - pos - 1);
- pos = 0;
- bLastIgnore = TRUE;
- continue;
- } else {
- bLastIgnore = FALSE;
- }
- pos++;
- }
- if (!csWord.IsEmpty()) {
- m_csFindWhatArray.Add(csWord);
- }
- index++;
- }
- return;
-}
-FX_BOOL CPDF_TextPageFind::IsMatchWholeWord(CFX_WideString csPageText, int startPos, int endPos)
-{
- int char_left = 0;
- int char_right = 0;
- int char_count = endPos - startPos + 1;
- if(char_count < 1) {
- return FALSE;
- }
- if (char_count == 1 && csPageText.GetAt(startPos) > 255) {
- return TRUE;
- }
- if(startPos - 1 >= 0 ) {
- char_left = csPageText.GetAt(startPos - 1);
- }
- if(startPos + char_count < csPageText.GetLength()) {
- char_right = csPageText.GetAt(startPos + char_count);
- }
- if(char_left == 0x61) {
- int a = 0;
- }
- if ((char_left > 'A' && char_left < 'a') || (char_left > 'a' && char_left < 'z') || (char_left > 0xfb00 && char_left < 0xfb06) || (char_left >= '0' && char_left <= '9') ||
- (char_right > 'A' && char_right < 'a') || (char_right > 'a' && char_right < 'z') || (char_right > 0xfb00 && char_right < 0xfb06) || (char_right >= '0' && char_right <= '9')) {
- return FALSE;
- }
- if(!(('A' > char_left || char_left > 'Z') && ('a' > char_left || char_left > 'z')
- && ('A' > char_right || char_right > 'Z') && ('a' > char_right || char_right > 'z'))) {
- return FALSE;
- }
- if (char_count > 0) {
- if (csPageText.GetAt(startPos) >= L'0' && csPageText.GetAt(startPos) <= L'9' && char_left >= L'0' && char_left <= L'9') {
- return FALSE;
- }
- if (csPageText.GetAt(endPos) >= L'0' && csPageText.GetAt(endPos) <= L'9' && char_right >= L'0' && char_right <= L'9') {
- return FALSE;
- }
- }
- return TRUE;
-}
-FX_BOOL CPDF_TextPageFind::ExtractSubString(CFX_WideString& rString, FX_LPCWSTR lpszFullString,
- int iSubString, FX_WCHAR chSep)
-{
- if (lpszFullString == NULL) {
- return FALSE;
- }
- while (iSubString--) {
- lpszFullString = FXSYS_wcschr(lpszFullString, chSep);
- if (lpszFullString == NULL) {
- rString.Empty();
- return FALSE;
- }
- lpszFullString++;
- while(*lpszFullString == chSep) {
- lpszFullString++;
- }
- }
- FX_LPCWSTR lpchEnd = FXSYS_wcschr(lpszFullString, chSep);
- int nLen = (lpchEnd == NULL) ?
- (int)FXSYS_wcslen(lpszFullString) : (int)(lpchEnd - lpszFullString);
- ASSERT(nLen >= 0);
- FXSYS_memcpy32(rString.GetBuffer(nLen), lpszFullString, nLen * sizeof(FX_WCHAR));
- rString.ReleaseBuffer();
- return TRUE;
-}
-CFX_WideString CPDF_TextPageFind::MakeReverse(const CFX_WideString str)
-{
- CFX_WideString str2;
- str2.Empty();
- int nlen = str.GetLength();
- for(int i = nlen - 1; i >= 0; i--) {
- str2 += str.GetAt(i);
- }
- return str2;
-}
-void CPDF_TextPageFind::GetRectArray(CFX_RectArray& rects) const
-{
- rects.Copy(m_resArray);
-}
-int CPDF_TextPageFind::GetCurOrder() const
-{
- return GetCharIndex(m_resStart);
-}
-int CPDF_TextPageFind::GetMatchedCount()const
-{
- int resStart = GetCharIndex(m_resStart);
- int resEnd = GetCharIndex(m_resEnd);
- return resEnd - resStart + 1;
-}
-CPDF_LinkExtract::CPDF_LinkExtract()
- : m_pTextPage(NULL),
- m_IsParserd(FALSE)
-{
-}
-CPDF_LinkExtract::~CPDF_LinkExtract()
-{
- DeleteLinkList();
-}
-FX_BOOL CPDF_LinkExtract::ExtractLinks(const IPDF_TextPage* pTextPage)
-{
- if (!pTextPage || !pTextPage->IsParsered()) {
- return FALSE;
- }
- m_pTextPage = (const CPDF_TextPage*)pTextPage;
- m_strPageText = m_pTextPage->GetPageText(0, -1);
- DeleteLinkList();
- if (m_strPageText.IsEmpty()) {
- return FALSE;
- }
- parserLink();
- m_IsParserd = TRUE;
- return TRUE;
-}
-void CPDF_LinkExtract::DeleteLinkList()
-{
- while (m_LinkList.GetSize()) {
- CPDF_LinkExt* linkinfo = NULL;
- linkinfo = m_LinkList.GetAt(0);
- m_LinkList.RemoveAt(0);
- delete linkinfo;
- }
- m_LinkList.RemoveAll();
-}
-int CPDF_LinkExtract::CountLinks() const
-{
- if (!m_IsParserd) {
- return -1;
- }
- return m_LinkList.GetSize();
-}
-void CPDF_LinkExtract::parserLink()
-{
- int start = 0, pos = 0;
- int TotalChar = m_pTextPage->CountChars();
- while (pos < TotalChar) {
- FPDF_CHAR_INFO pageChar;
- m_pTextPage->GetCharInfo(pos, pageChar);
- if (pageChar.m_Flag == CHAR_GENERATED || pageChar.m_Unicode == 0x20 || pos == TotalChar - 1) {
- int nCount = pos - start;
- if(pos == TotalChar - 1) {
- nCount++;
- }
- CFX_WideString strBeCheck;
- strBeCheck = m_pTextPage->GetPageText(start, nCount);
- if (strBeCheck.GetLength() > 5) {
- while(strBeCheck.GetLength() > 0) {
- FX_WCHAR ch = strBeCheck.GetAt(strBeCheck.GetLength() - 1);
- if (ch == L')' || ch == L',' || ch == L'>' || ch == L'.') {
- strBeCheck = strBeCheck.Mid(0, strBeCheck.GetLength() - 1);
- nCount--;
- } else {
- break;
- }
- }
- if (nCount > 5 && (CheckWebLink(strBeCheck) || CheckMailLink(strBeCheck))) {
- if (!AppendToLinkList(start, nCount, strBeCheck)) {
- break;
- }
- }
- }
- start = ++pos;
- } else {
- pos++;
- }
- }
-}
-FX_BOOL CPDF_LinkExtract::CheckWebLink(CFX_WideString& strBeCheck)
-{
- CFX_WideString str = strBeCheck;
- str.MakeLower();
- if (str.Find(L"http://www.") != -1) {
- strBeCheck = strBeCheck.Right(str.GetLength() - str.Find(L"http://www."));
- return TRUE;
- } else if (str.Find(L"http://") != -1) {
- strBeCheck = strBeCheck.Right(str.GetLength() - str.Find(L"http://"));
- return TRUE;
- } else if (str.Find(L"https://www.") != -1) {
- strBeCheck = strBeCheck.Right(str.GetLength() - str.Find(L"https://www."));
- return TRUE;
- } else if (str.Find(L"https://") != -1) {
- strBeCheck = strBeCheck.Right(str.GetLength() - str.Find(L"https://"));
- return TRUE;
- } else if (str.Find(L"www.") != -1) {
- strBeCheck = strBeCheck.Right(str.GetLength() - str.Find(L"www."));
- strBeCheck = L"http://" + strBeCheck;
- return TRUE;
- } else {
- return FALSE;
- }
-}
-FX_BOOL CPDF_LinkExtract::CheckMailLink(CFX_WideString& str)
-{
- str.MakeLower();
- int aPos = str.Find(L'@');
- if (aPos < 1) {
- return FALSE;
- }
- if (str.GetAt(aPos - 1) == L'.' || str.GetAt(aPos - 1) == L'_') {
- return FALSE;
- }
- int i;
- for (i = aPos - 1; i >= 0; i--) {
- FX_WCHAR ch = str.GetAt(i);
- if (ch == L'_' || ch == L'.' || (ch >= L'a' && ch <= L'z') || (ch >= L'0' && ch <= L'9')) {
- continue;
- } else {
- if (i == aPos - 1) {
- return FALSE;
- }
- str = str.Right(str.GetLength() - i - 1);
- break;
- }
- }
- aPos = str.Find(L'@');
- if (aPos < 1) {
- return FALSE;
- }
- CFX_WideString strtemp = L"";
- for (i = 0; i < aPos; i++) {
- FX_WCHAR wch = str.GetAt(i);
- if (wch >= L'a' && wch <= L'z') {
- break;
- } else {
- strtemp = str.Right(str.GetLength() - i + 1);
- }
- }
- if (strtemp != L"") {
- str = strtemp;
- }
- aPos = str.Find(L'@');
- if (aPos < 1) {
- return FALSE;
- }
- str.TrimRight(L'.');
- strtemp = str;
- int ePos = str.Find(L'.');
- if (ePos == -1) {
- return FALSE;
- }
- while (ePos != -1) {
- strtemp = strtemp.Right(strtemp.GetLength() - ePos - 1);
- ePos = strtemp.Find('.');
- }
- ePos = strtemp.GetLength();
- for (i = 0; i < ePos; i++) {
- FX_WCHAR wch = str.GetAt(i);
- if ((wch >= L'a' && wch <= L'z') || (wch >= L'0' && wch <= L'9')) {
- continue;
- } else {
- str = str.Left(str.GetLength() - ePos + i + 1);
- ePos = ePos - i - 1;
- break;
- }
- }
- int nLen = str.GetLength();
- for (i = aPos + 1; i < nLen - ePos; i++) {
- FX_WCHAR wch = str.GetAt(i);
- if (wch == L'-' || wch == L'.' || (wch >= L'a' && wch <= L'z') || (wch >= L'0' && wch <= L'9')) {
- continue;
- } else {
- return FALSE;
- }
- }
- if (str.Find(L"mailto:") == -1) {
- str = L"mailto:" + str;
- }
- return TRUE;
-}
-FX_BOOL CPDF_LinkExtract::AppendToLinkList(int start, int count, CFX_WideString strUrl)
-{
- CPDF_LinkExt* linkInfo = NULL;
- linkInfo = FX_NEW CPDF_LinkExt;
- if (!linkInfo) {
- return FALSE;
- }
- linkInfo->m_strUrl = strUrl;
- linkInfo->m_Start = start;
- linkInfo->m_Count = count;
- m_LinkList.Add(linkInfo);
- return TRUE;
-}
-CFX_WideString CPDF_LinkExtract::GetURL(int index) const
-{
- if (!m_IsParserd || index < 0 || index >= m_LinkList.GetSize()) {
- return L"";
- }
- CPDF_LinkExt* link = NULL;
- link = m_LinkList.GetAt(index);
- if (!link) {
- return L"";
- }
- return link->m_strUrl;
-}
-void CPDF_LinkExtract::GetBoundedSegment(int index, int& start, int& count) const
-{
- if (!m_IsParserd || index < 0 || index >= m_LinkList.GetSize()) {
- return ;
- }
- CPDF_LinkExt* link = NULL;
- link = m_LinkList.GetAt(index);
- if (!link) {
- return ;
- }
- start = link->m_Start;
- count = link->m_Count;
-}
-void CPDF_LinkExtract::GetRects(int index, CFX_RectArray& rects) const
-{
- if (!m_IsParserd || index < 0 || index >= m_LinkList.GetSize()) {
- return;
- }
- CPDF_LinkExt* link = NULL;
- link = m_LinkList.GetAt(index);
- if (!link) {
- return ;
- }
- m_pTextPage->GetRectArray(link->m_Start, link->m_Count, rects);
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fpdfapi/fpdf_resource.h"
+#include "../../include/fpdfapi/fpdf_pageobj.h"
+#include "../../include/fpdftext/fpdf_text.h"
+#include "../../include/fpdfapi/fpdf_page.h"
+#include "../../include/fpdfapi/fpdf_module.h"
+#include <ctype.h>
+#include "text_int.h"
+FX_BOOL _IsIgnoreSpaceCharacter(FX_WCHAR curChar)
+{
+ if(curChar < 255 ) {
+ return FALSE;
+ }
+ if ( (curChar >= 0x0600 && curChar <= 0x06FF)
+ || (curChar >= 0xFE70 && curChar <= 0xFEFF)
+ || (curChar >= 0xFB50 && curChar <= 0xFDFF)
+ || (curChar >= 0x0400 && curChar <= 0x04FF)
+ || (curChar >= 0x0500 && curChar <= 0x052F)
+ || (curChar >= 0xA640 && curChar <= 0xA69F)
+ || (curChar >= 0x2DE0 && curChar <= 0x2DFF)
+ || curChar == 8467
+ || (curChar >= 0x2000 && curChar <= 0x206F)) {
+ return FALSE;
+ }
+ return TRUE;
+}
+CPDFText_ParseOptions::CPDFText_ParseOptions()
+ : m_bGetCharCodeOnly(FALSE), m_bNormalizeObjs(TRUE), m_bOutputHyphen(FALSE)
+{
+}
+IPDF_TextPage* IPDF_TextPage::CreateTextPage(const CPDF_Page* pPage, CPDFText_ParseOptions ParserOptions)
+{
+ CPDF_TextPage* pTextPageEx = FX_NEW CPDF_TextPage(pPage, ParserOptions);
+ return pTextPageEx;
+}
+IPDF_TextPage* IPDF_TextPage::CreateTextPage(const CPDF_Page* pPage, int flags)
+{
+ CPDF_TextPage* pTextPage = FX_NEW CPDF_TextPage(pPage, flags);
+ return pTextPage;
+}
+IPDF_TextPage* IPDF_TextPage::CreateTextPage(const CPDF_PageObjects* pObjs, int flags)
+{
+ CPDF_TextPage* pTextPage = FX_NEW CPDF_TextPage(pObjs, flags);
+ return pTextPage;
+}
+IPDF_TextPageFind* IPDF_TextPageFind::CreatePageFind(const IPDF_TextPage* pTextPage)
+{
+ if (!pTextPage) {
+ return NULL;
+ }
+ return FX_NEW CPDF_TextPageFind(pTextPage);
+}
+IPDF_LinkExtract* IPDF_LinkExtract::CreateLinkExtract()
+{
+ return FX_NEW CPDF_LinkExtract();
+}
+#define TEXT_BLANK_CHAR L' '
+#define TEXT_LINEFEED_CHAR L'\n'
+#define TEXT_RETURN_CHAR L'\r'
+#define TEXT_EMPTY L""
+#define TEXT_BLANK L" "
+#define TEXT_RETURN_LINEFEED L"\r\n"
+#define TEXT_LINEFEED L"\n"
+#define TEXT_CHARRATIO_GAPDELTA 0.070
+CPDF_TextPage::CPDF_TextPage(const CPDF_Page* pPage, int flags)
+ : m_pPreTextObj(NULL),
+ m_IsParsered(FALSE),
+ m_charList(512),
+ m_TempCharList(50),
+ m_TextlineDir(-1),
+ m_CurlineRect(0, 0, 0, 0)
+{
+ m_pPage = pPage;
+ m_parserflag = flags;
+ m_TextBuf.EstimateSize(0, 10240);
+ pPage->GetDisplayMatrix(m_DisplayMatrix, 0, 0, (int) pPage->GetPageWidth(), (int)pPage->GetPageHeight(), 0);
+}
+CPDF_TextPage::CPDF_TextPage(const CPDF_Page* pPage, CPDFText_ParseOptions ParserOptions)
+ : m_pPreTextObj(NULL)
+ , m_IsParsered(FALSE)
+ , m_charList(512)
+ , m_TempCharList(50)
+ , m_TextlineDir(-1)
+ , m_CurlineRect(0, 0, 0, 0)
+ , m_ParseOptions(ParserOptions)
+{
+ m_pPage = pPage;
+ m_parserflag = 0;
+ m_TextBuf.EstimateSize(0, 10240);
+ pPage->GetDisplayMatrix(m_DisplayMatrix, 0, 0, (int) pPage->GetPageWidth(), (int)pPage->GetPageHeight(), 0);
+}
+CPDF_TextPage::CPDF_TextPage(const CPDF_PageObjects* pPage, int flags)
+ : m_pPreTextObj(NULL),
+ m_IsParsered(FALSE),
+ m_charList(512),
+ m_TempCharList(50),
+ m_TextlineDir(-1),
+ m_CurlineRect(0, 0, 0, 0)
+{
+ m_pPage = pPage;
+ m_parserflag = flags;
+ m_TextBuf.EstimateSize(0, 10240);
+ CFX_FloatRect pageRect = pPage->CalcBoundingBox();
+ m_DisplayMatrix = CFX_AffineMatrix(1, 0, 0, -1, pageRect.right, pageRect.top);
+}
+void CPDF_TextPage::NormalizeObjects(FX_BOOL bNormalize)
+{
+ m_ParseOptions.m_bNormalizeObjs = bNormalize;
+}
+FX_BOOL CPDF_TextPage::IsControlChar(PAGECHAR_INFO* pCharInfo)
+{
+ if(!pCharInfo) {
+ return FALSE;
+ }
+ switch(pCharInfo->m_Unicode) {
+ case 0x2:
+ case 0x3:
+ case 0x93:
+ case 0x94:
+ case 0x96:
+ case 0x97:
+ case 0x98:
+ case 0xfffe:
+ if(pCharInfo->m_Flag == FPDFTEXT_CHAR_HYPHEN) {
+ return FALSE;
+ } else {
+ return TRUE;
+ }
+ default:
+ return FALSE;
+ }
+}
+FX_BOOL CPDF_TextPage::ParseTextPage()
+{
+ if (!m_pPage) {
+ m_IsParsered = FALSE;
+ return FALSE;
+ }
+ m_IsParsered = FALSE;
+ m_TextBuf.Clear();
+ m_charList.RemoveAll();
+ m_pPreTextObj = NULL;
+ ProcessObject();
+ m_IsParsered = TRUE;
+ if(!m_ParseOptions.m_bGetCharCodeOnly) {
+ m_CharIndex.RemoveAll();
+ int nCount = m_charList.GetSize();
+ if(nCount) {
+ m_CharIndex.Add(0);
+ }
+ for(int i = 0; i < nCount; i++) {
+ int indexSize = m_CharIndex.GetSize();
+ FX_BOOL bNormal = FALSE;
+ PAGECHAR_INFO charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(i);
+ if(charinfo.m_Flag == FPDFTEXT_CHAR_GENERATED) {
+ bNormal = TRUE;
+ }
+#ifdef FOXIT_CHROME_BUILD
+ else if(charinfo.m_Unicode == 0 || IsControlChar(&charinfo))
+#else
+ else if(charinfo.m_Unicode == 0)
+#endif
+ bNormal = FALSE;
+ else {
+ bNormal = TRUE;
+ }
+ if(bNormal) {
+ if(indexSize % 2) {
+ m_CharIndex.Add(1);
+ } else {
+ if(indexSize <= 0) {
+ continue;
+ }
+ m_CharIndex.SetAt(indexSize - 1, m_CharIndex.GetAt(indexSize - 1) + 1);
+ }
+ } else {
+ if(indexSize % 2) {
+ if(indexSize <= 0) {
+ continue;
+ }
+ m_CharIndex.SetAt(indexSize - 1, i + 1);
+ } else {
+ m_CharIndex.Add(i + 1);
+ }
+ }
+ }
+ int indexSize = m_CharIndex.GetSize();
+ if(indexSize % 2) {
+ m_CharIndex.RemoveAt(indexSize - 1);
+ }
+ }
+ return TRUE;
+}
+int CPDF_TextPage::CountChars() const
+{
+ if(m_ParseOptions.m_bGetCharCodeOnly) {
+ return m_TextBuf.GetSize();
+ }
+ return m_charList.GetSize();
+}
+int CPDF_TextPage::CharIndexFromTextIndex(int TextIndex) const
+{
+ int indexSize = m_CharIndex.GetSize();
+ int count = 0;
+ for(int i = 0; i < indexSize; i += 2) {
+ count += m_CharIndex.GetAt(i + 1);
+ if(count > TextIndex) {
+ return TextIndex - count + m_CharIndex.GetAt(i + 1) + m_CharIndex.GetAt(i);
+ }
+ }
+ return -1;
+}
+int CPDF_TextPage::TextIndexFromCharIndex(int CharIndex) const
+{
+ int indexSize = m_CharIndex.GetSize();
+ int count = 0;
+ for(int i = 0; i < indexSize; i += 2) {
+ count += m_CharIndex.GetAt(i + 1);
+ if(m_CharIndex.GetAt(i + 1) + m_CharIndex.GetAt(i) > CharIndex) {
+ if(CharIndex - m_CharIndex.GetAt(i) < 0) {
+ return -1;
+ }
+ return CharIndex - m_CharIndex.GetAt(i) + count - m_CharIndex.GetAt(i + 1);
+ }
+ }
+ return -1;
+}
+void CPDF_TextPage::GetRectArray(int start, int nCount, CFX_RectArray& rectArray) const
+{
+ if(m_ParseOptions.m_bGetCharCodeOnly) {
+ return;
+ }
+ if(start < 0 || nCount == 0) {
+ return;
+ }
+ if (!m_IsParsered) {
+ return;
+ }
+ PAGECHAR_INFO info_curchar;
+ CPDF_TextObject* pCurObj = NULL;
+ CFX_FloatRect rect;
+ int curPos = start;
+ FX_BOOL flagNewRect = TRUE;
+ if (nCount + start > m_charList.GetSize() || nCount == -1) {
+ nCount = m_charList.GetSize() - start;
+ }
+ while (nCount--) {
+ info_curchar = *(PAGECHAR_INFO*)m_charList.GetAt(curPos++);
+ if (info_curchar.m_Flag == FPDFTEXT_CHAR_GENERATED) {
+ continue;
+ }
+ if(info_curchar.m_CharBox.Width() < 0.01 || info_curchar.m_CharBox.Height() < 0.01) {
+ continue;
+ }
+ if(!pCurObj) {
+ pCurObj = info_curchar.m_pTextObj;
+ }
+ if (pCurObj != info_curchar.m_pTextObj) {
+ rectArray.Add(rect);
+ pCurObj = info_curchar.m_pTextObj;
+ flagNewRect = TRUE;
+ }
+ if (flagNewRect) {
+ FX_FLOAT orgX = info_curchar.m_OriginX, orgY = info_curchar.m_OriginY;
+ CFX_AffineMatrix matrix, matrix_reverse;
+ info_curchar.m_pTextObj->GetTextMatrix(&matrix);
+ matrix.Concat(info_curchar.m_Matrix);
+ matrix_reverse.SetReverse(matrix);
+ matrix_reverse.Transform(orgX, orgY);
+ rect.left = info_curchar.m_CharBox.left;
+ rect.right = info_curchar.m_CharBox.right;
+ if (pCurObj->GetFont()->GetTypeDescent()) {
+ rect.bottom = orgY + pCurObj->GetFont()->GetTypeDescent() * pCurObj->GetFontSize() / 1000;
+ FX_FLOAT xPosTemp = orgX;
+ matrix.Transform(xPosTemp, rect.bottom);
+ } else {
+ rect.bottom = info_curchar.m_CharBox.bottom;
+ }
+ if (pCurObj->GetFont()->GetTypeAscent()) {
+ rect.top = orgY + pCurObj->GetFont()->GetTypeAscent() * pCurObj->GetFontSize() / 1000;
+ FX_FLOAT xPosTemp = orgX + GetCharWidth(info_curchar.m_CharCode, pCurObj->GetFont()) * pCurObj->GetFontSize() / 1000;
+ matrix.Transform(xPosTemp, rect.top);
+ } else {
+ rect.top = info_curchar.m_CharBox.top;
+ }
+ flagNewRect = FALSE;
+ rect = info_curchar.m_CharBox;
+ rect.Normalize();
+ } else {
+ info_curchar.m_CharBox.Normalize();
+ if (rect.left > info_curchar.m_CharBox.left) {
+ rect.left = info_curchar.m_CharBox.left;
+ }
+ if (rect.right < info_curchar.m_CharBox.right) {
+ rect.right = info_curchar.m_CharBox.right;
+ }
+ if ( rect.top < info_curchar.m_CharBox.top) {
+ rect.top = info_curchar.m_CharBox.top;
+ }
+ if (rect.bottom > info_curchar.m_CharBox.bottom) {
+ rect.bottom = info_curchar.m_CharBox.bottom;
+ }
+ }
+ }
+ rectArray.Add(rect);
+ return;
+}
+int CPDF_TextPage::GetIndexAtPos(CPDF_Point point , FX_FLOAT xTorelance, FX_FLOAT yTorelance) const
+{
+ if(m_ParseOptions.m_bGetCharCodeOnly) {
+ return -3;
+ }
+ if (!m_IsParsered) {
+ return -3;
+ }
+ FX_FLOAT distance = 0;
+ int pos = 0;
+ int NearPos = -1;
+ double xdif = 5000, ydif = 5000;
+ while(pos < m_charList.GetSize()) {
+ PAGECHAR_INFO charinfo = *(PAGECHAR_INFO*)(m_charList.GetAt(pos));
+ CFX_FloatRect charrect = charinfo.m_CharBox;
+ if (charrect.Contains(point.x, point.y)) {
+ break;
+ }
+ if (xTorelance > 0 || yTorelance > 0) {
+ CFX_FloatRect charRectExt;
+ charrect.Normalize();
+ charRectExt.left = charrect.left - xTorelance / 2;
+ charRectExt.right = charrect.right + xTorelance / 2;
+ charRectExt.top = charrect.top + yTorelance / 2;
+ charRectExt.bottom = charrect.bottom - yTorelance / 2;
+ if (charRectExt.Contains(point.x, point.y)) {
+ double curXdif, curYdif;
+ curXdif = FXSYS_fabs(point.x - charrect.left) < FXSYS_fabs(point.x - charrect.right) ? FXSYS_fabs(point.x - charrect.left) : FXSYS_fabs(point.x - charrect.right);
+ curYdif = FXSYS_fabs(point.y - charrect.bottom) < FXSYS_fabs(point.y - charrect.top ) ? FXSYS_fabs(point.y - charrect.bottom) : FXSYS_fabs(point.y - charrect.top);
+ if (curYdif + curXdif < xdif + ydif) {
+ ydif = curYdif;
+ xdif = curXdif;
+ NearPos = pos;
+ }
+ }
+ }
+ ++pos;
+ }
+ if (pos >= m_charList.GetSize()) {
+ pos = NearPos;
+ }
+ return pos;
+}
+CFX_WideString CPDF_TextPage::GetTextByRect(CFX_FloatRect rect) const
+{
+ CFX_WideString strText;
+ if(m_ParseOptions.m_bGetCharCodeOnly || !m_IsParsered) {
+ return strText;
+ }
+ int nCount = m_charList.GetSize();
+ int pos = 0;
+ FX_FLOAT posy = 0;
+ FX_BOOL IsContainPreChar = FALSE;
+ FX_BOOL ISAddLineFeed = FALSE;
+ while (pos < nCount) {
+ PAGECHAR_INFO charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(pos++);
+ if (IsRectIntersect(rect, charinfo.m_CharBox)) {
+ if (FXSYS_fabs(posy - charinfo.m_OriginY) > 0 && !IsContainPreChar && ISAddLineFeed) {
+ posy = charinfo.m_OriginY;
+ if (strText.GetLength() > 0) {
+ strText += L"\r\n";
+ }
+ }
+ IsContainPreChar = TRUE;
+ ISAddLineFeed = FALSE;
+ if (charinfo.m_Unicode) {
+ strText += charinfo.m_Unicode;
+ }
+ } else if (charinfo.m_Unicode == 32) {
+ if (IsContainPreChar && charinfo.m_Unicode) {
+ strText += charinfo.m_Unicode;
+ IsContainPreChar = FALSE;
+ ISAddLineFeed = FALSE;
+ }
+ } else {
+ IsContainPreChar = FALSE;
+ ISAddLineFeed = TRUE;
+ }
+ }
+ return strText;
+}
+void CPDF_TextPage::GetRectsArrayByRect(CFX_FloatRect rect, CFX_RectArray& resRectArray) const
+{
+ if(m_ParseOptions.m_bGetCharCodeOnly) {
+ return;
+ }
+ if (!m_IsParsered) {
+ return;
+ }
+ CFX_FloatRect curRect;
+ FX_BOOL flagNewRect = TRUE;
+ CPDF_TextObject* pCurObj = NULL;
+ int nCount = m_charList.GetSize();
+ int pos = 0;
+ while (pos < nCount) {
+ PAGECHAR_INFO info_curchar = *(PAGECHAR_INFO*)m_charList.GetAt(pos++);
+ if (info_curchar.m_Flag == FPDFTEXT_CHAR_GENERATED) {
+ continue;
+ }
+ if(pos == 494) {
+ int a = 0;
+ }
+ if (IsRectIntersect(rect, info_curchar.m_CharBox)) {
+ if(!pCurObj) {
+ pCurObj = info_curchar.m_pTextObj;
+ }
+ if (pCurObj != info_curchar.m_pTextObj) {
+ resRectArray.Add(curRect);
+ pCurObj = info_curchar.m_pTextObj;
+ flagNewRect = TRUE;
+ }
+ if (flagNewRect) {
+ curRect = info_curchar.m_CharBox;
+ flagNewRect = FALSE;
+ curRect.Normalize();
+ } else {
+ info_curchar.m_CharBox.Normalize();
+ if (curRect.left > info_curchar.m_CharBox.left) {
+ curRect.left = info_curchar.m_CharBox.left;
+ }
+ if (curRect.right < info_curchar.m_CharBox.right) {
+ curRect.right = info_curchar.m_CharBox.right;
+ }
+ if ( curRect.top < info_curchar.m_CharBox.top) {
+ curRect.top = info_curchar.m_CharBox.top;
+ }
+ if (curRect.bottom > info_curchar.m_CharBox.bottom) {
+ curRect.bottom = info_curchar.m_CharBox.bottom;
+ }
+ }
+ }
+ }
+ resRectArray.Add(curRect);
+ return;
+}
+int CPDF_TextPage::GetIndexAtPos(FX_FLOAT x, FX_FLOAT y, FX_FLOAT xTorelance, FX_FLOAT yTorelance) const
+{
+ if(m_ParseOptions.m_bGetCharCodeOnly) {
+ return -3;
+ }
+ CPDF_Point point(x, y);
+ return GetIndexAtPos(point, xTorelance, yTorelance);
+}
+int CPDF_TextPage::GetOrderByDirection(int order, int direction) const
+{
+ if(m_ParseOptions.m_bGetCharCodeOnly) {
+ return -3;
+ }
+ if (!m_IsParsered) {
+ return -3;
+ }
+ if (direction == FPDFTEXT_RIGHT || direction == FPDFTEXT_LEFT) {
+ order += direction;
+ while(order >= 0 && order < m_charList.GetSize()) {
+ PAGECHAR_INFO cinfo = *(PAGECHAR_INFO*)m_charList.GetAt(order);
+ if (cinfo.m_Flag != FPDFTEXT_CHAR_GENERATED) {
+ break;
+ } else {
+ if (cinfo.m_Unicode == TEXT_LINEFEED_CHAR || cinfo.m_Unicode == TEXT_RETURN_CHAR) {
+ order += direction;
+ } else {
+ break;
+ }
+ }
+ }
+ if (order >= m_charList.GetSize()) {
+ order = -2;
+ }
+ return order;
+ }
+ PAGECHAR_INFO charinfo;
+ charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(order);
+ CPDF_Point curPos(charinfo.m_OriginX, charinfo.m_OriginY);
+ FX_FLOAT difPosY = 0.0, minXdif = 1000;
+ int minIndex = -2;
+ int index = order;
+ FX_FLOAT height = charinfo.m_CharBox.Height();
+ if (direction == FPDFTEXT_UP) {
+ minIndex = -1;
+ while (1) {
+ if (--index < 0) {
+ return -1;
+ }
+ charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(index);
+ if (FXSYS_fabs(charinfo.m_OriginY - curPos.y) > FX_MAX(height, charinfo.m_CharBox.Height()) / 2) {
+ difPosY = charinfo.m_OriginY;
+ minIndex = index;
+ break;
+ }
+ }
+ FX_FLOAT PreXdif = charinfo.m_OriginX - curPos.x;
+ minXdif = PreXdif;
+ if (PreXdif == 0) {
+ return index;
+ }
+ FX_FLOAT curXdif = 0;
+ while (--index >= 0) {
+ charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(index);
+ if (difPosY != charinfo.m_OriginY) {
+ break;
+ }
+ curXdif = charinfo.m_OriginX - curPos.x;
+ if (curXdif == 0) {
+ return index;
+ }
+ int signflag = 0;
+ if (curXdif > 0) {
+ signflag = 1;
+ } else {
+ signflag = -1;
+ }
+ if (signflag * PreXdif < 0) {
+ if (FXSYS_fabs(PreXdif) < FXSYS_fabs(curXdif)) {
+ return index + 1;
+ } else {
+ return index;
+ }
+ }
+ if (FXSYS_fabs(curXdif) < FXSYS_fabs(minXdif)) {
+ minIndex = index;
+ minXdif = curXdif;
+ }
+ PreXdif = curXdif;
+ if (difPosY != charinfo.m_OriginY) {
+ break;
+ }
+ }
+ return minIndex;
+ } else if(FPDFTEXT_DOWN) {
+ minIndex = -2;
+ while (1) {
+ if (++index > m_charList.GetSize() - 1) {
+ return minIndex;
+ }
+ charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(index);
+ if (FXSYS_fabs(charinfo.m_OriginY - curPos.y) > FX_MAX(height, charinfo.m_CharBox.Height()) / 2) {
+ difPosY = charinfo.m_OriginY;
+ minIndex = index;
+ break;
+ }
+ }
+ FX_FLOAT PreXdif = charinfo.m_OriginX - curPos.x;
+ minXdif = PreXdif;
+ if (PreXdif == 0) {
+ return index;
+ }
+ FX_FLOAT curXdif = 0;
+ while (++index < m_charList.GetSize()) {
+ charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(index);
+ if (difPosY != charinfo.m_OriginY) {
+ break;
+ }
+ curXdif = charinfo.m_OriginX - curPos.x;
+ if (curXdif == 0) {
+ return index;
+ }
+ int signflag = 0;
+ if (curXdif > 0) {
+ signflag = 1;
+ } else {
+ signflag = -1;
+ }
+ if (signflag * PreXdif < 0) {
+ if (FXSYS_fabs(PreXdif) < FXSYS_fabs(curXdif)) {
+ return index - 1;
+ } else {
+ return index;
+ }
+ }
+ if (FXSYS_fabs(curXdif) < FXSYS_fabs(minXdif)) {
+ minXdif = curXdif;
+ minIndex = index;
+ }
+ PreXdif = curXdif;
+ }
+ return minIndex;
+ }
+}
+void CPDF_TextPage::GetCharInfo(int index, FPDF_CHAR_INFO & info) const
+{
+ if(m_ParseOptions.m_bGetCharCodeOnly) {
+ return;
+ }
+ if (!m_IsParsered) {
+ return;
+ }
+ if (index < 0 || index >= m_charList.GetSize()) {
+ return;
+ }
+ PAGECHAR_INFO charinfo;
+ charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(index);
+ info.m_Charcode = charinfo.m_CharCode;
+ info.m_OriginX = charinfo.m_OriginX;
+ info.m_OriginY = charinfo.m_OriginY;
+ info.m_Unicode = charinfo.m_Unicode;
+ info.m_Flag = charinfo.m_Flag;
+ info.m_CharBox = charinfo.m_CharBox;
+ info.m_pTextObj = charinfo.m_pTextObj;
+ if (charinfo.m_pTextObj && charinfo.m_pTextObj->GetFont()) {
+ info.m_FontSize = charinfo.m_pTextObj->GetFontSize();
+ }
+ info.m_Matrix.Copy(charinfo.m_Matrix);
+ return;
+}
+void CPDF_TextPage::CheckMarkedContentObject(FX_INT32& start, FX_INT32& nCount) const
+{
+ PAGECHAR_INFO charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(start);
+ PAGECHAR_INFO charinfo2 = *(PAGECHAR_INFO*)m_charList.GetAt(start + nCount - 1);
+ if (FPDFTEXT_CHAR_PIECE != charinfo.m_Flag && FPDFTEXT_CHAR_PIECE != charinfo2.m_Flag) {
+ return;
+ }
+ if (FPDFTEXT_CHAR_PIECE == charinfo.m_Flag) {
+ PAGECHAR_INFO charinfo1 = charinfo;
+ int startIndex = start;
+ while(FPDFTEXT_CHAR_PIECE == charinfo1.m_Flag && charinfo1.m_Index == charinfo.m_Index) {
+ startIndex--;
+ if (startIndex < 0) {
+ break;
+ }
+ charinfo1 = *(PAGECHAR_INFO*)m_charList.GetAt(startIndex);
+ }
+ startIndex++;
+ start = startIndex;
+ }
+ if (FPDFTEXT_CHAR_PIECE == charinfo2.m_Flag) {
+ PAGECHAR_INFO charinfo3 = charinfo2;
+ int endIndex = start + nCount - 1;
+ while(FPDFTEXT_CHAR_PIECE == charinfo3.m_Flag && charinfo3.m_Index == charinfo2.m_Index) {
+ endIndex++;
+ if (endIndex >= m_charList.GetSize()) {
+ break;
+ }
+ charinfo3 = *(PAGECHAR_INFO*)m_charList.GetAt(endIndex);
+ }
+ endIndex--;
+ nCount = endIndex - start + 1;
+ }
+}
+CFX_WideString CPDF_TextPage::GetPageText(int start , int nCount) const
+{
+ if (!m_IsParsered || nCount == 0) {
+ return L"";
+ }
+ if (start < 0) {
+ start = 0;
+ }
+ if (nCount == -1) {
+ nCount = m_charList.GetSize() - start;
+ return m_TextBuf.GetWideString().Mid(start, m_TextBuf.GetWideString().GetLength());
+ }
+ if(nCount <= 0 || m_charList.GetSize() <= 0) {
+ return L"";
+ }
+ if(nCount + start > m_charList.GetSize() - 1) {
+ nCount = m_charList.GetSize() - start;
+ }
+ if (nCount <= 0) {
+ return L"";
+ }
+ CheckMarkedContentObject(start, nCount);
+ int startindex = 0;
+ PAGECHAR_INFO charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(start);
+ int startOffset = 0;
+ while(charinfo.m_Index == -1) {
+ startOffset++;
+ if (startOffset > nCount || start + startOffset >= m_charList.GetSize()) {
+ return L"";
+ }
+ charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(start + startOffset);
+ }
+ startindex = charinfo.m_Index;
+ charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(start + nCount - 1);
+ int nCountOffset = 0;
+ while (charinfo.m_Index == -1) {
+ nCountOffset++;
+ if (nCountOffset >= nCount) {
+ return L"";
+ }
+ charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(start + nCount - nCountOffset - 1);
+ }
+ nCount = start + nCount - nCountOffset - startindex;
+ if(nCount <= 0) {
+ return L"";
+ }
+ return m_TextBuf.GetWideString().Mid(startindex, nCount);
+}
+int CPDF_TextPage::CountRects(int start, int nCount)
+{
+ if(m_ParseOptions.m_bGetCharCodeOnly) {
+ return -1;
+ }
+ if (!m_IsParsered) {
+ return -1;
+ }
+ if (start < 0) {
+ return -1;
+ }
+ if (nCount == -1 || nCount + start > m_charList.GetSize() ) {
+ nCount = m_charList.GetSize() - start;
+ }
+ m_SelRects.RemoveAll();
+ GetRectArray(start, nCount, m_SelRects);
+ return m_SelRects.GetSize();
+}
+void CPDF_TextPage::GetRect(int rectIndex, FX_FLOAT& left, FX_FLOAT& top, FX_FLOAT& right, FX_FLOAT &bottom) const
+{
+ if(m_ParseOptions.m_bGetCharCodeOnly) {
+ return ;
+ }
+ if (!m_IsParsered || rectIndex < 0 || rectIndex >= m_SelRects.GetSize()) {
+ return;
+ }
+ left = m_SelRects.GetAt(rectIndex).left;
+ top = m_SelRects.GetAt(rectIndex).top;
+ right = m_SelRects.GetAt(rectIndex).right;
+ bottom = m_SelRects.GetAt(rectIndex).bottom;
+}
+FX_BOOL CPDF_TextPage::GetBaselineRotate(int start, int end, int& Rotate)
+{
+ if(m_ParseOptions.m_bGetCharCodeOnly) {
+ return FALSE;
+ }
+ if(end == start) {
+ return FALSE;
+ }
+ FX_FLOAT dx, dy;
+ FPDF_CHAR_INFO info1, info2;
+ GetCharInfo(start, info1);
+ GetCharInfo(end, info2);
+ while(info2.m_CharBox.Width() == 0 || info2.m_CharBox.Height() == 0) {
+ end--;
+ if(end <= start) {
+ return FALSE;
+ }
+ GetCharInfo(end, info2);
+ }
+ dx = (info2.m_OriginX - info1.m_OriginX);
+ dy = (info2.m_OriginY - info1.m_OriginY);
+ if(dx == 0) {
+ if(dy > 0) {
+ Rotate = 90;
+ } else if (dy < 0) {
+ Rotate = 270;
+ } else {
+ Rotate = 0;
+ }
+ } else {
+ float a = FXSYS_atan2(dy, dx);
+ Rotate = (int)(a * 180 / FX_PI + 0.5);
+ }
+ if(Rotate < 0) {
+ Rotate = -Rotate;
+ } else if(Rotate > 0) {
+ Rotate = 360 - Rotate;
+ }
+ return TRUE;
+}
+FX_BOOL CPDF_TextPage::GetBaselineRotate(CFX_FloatRect rect , int& Rotate)
+{
+ if(m_ParseOptions.m_bGetCharCodeOnly) {
+ return FALSE;
+ }
+ int start, end, count, n = CountBoundedSegments(rect.left, rect.top, rect.right, rect.bottom, TRUE);
+ if(n < 1) {
+ return FALSE;
+ }
+ if(n > 1) {
+ GetBoundedSegment(n - 1, start, count);
+ end = start + count - 1;
+ GetBoundedSegment(0, start, count);
+ } else {
+ GetBoundedSegment(0, start, count);
+ end = start + count - 1;
+ }
+ return GetBaselineRotate(start, end, Rotate);
+}
+FX_BOOL CPDF_TextPage::GetBaselineRotate(int rectIndex, int& Rotate)
+{
+ if(m_ParseOptions.m_bGetCharCodeOnly) {
+ return FALSE;
+ }
+ if (!m_IsParsered || rectIndex < 0 || rectIndex > m_SelRects.GetSize()) {
+ return FALSE;
+ }
+ CFX_FloatRect rect = m_SelRects.GetAt(rectIndex);
+ return GetBaselineRotate(rect , Rotate);
+}
+int CPDF_TextPage::CountBoundedSegments(FX_FLOAT left, FX_FLOAT top, FX_FLOAT right, FX_FLOAT bottom, FX_BOOL bContains )
+{
+ if(m_ParseOptions.m_bGetCharCodeOnly) {
+ return -1;
+ }
+ m_Segment.RemoveAll();
+ if (!m_IsParsered) {
+ return -1;
+ }
+ CFX_FloatRect rect(left, bottom, right, top);
+ rect.Normalize();
+ int nCount = m_charList.GetSize();
+ int pos = 0;
+ FPDF_SEGMENT segment;
+ segment.m_Start = 0;
+ segment.m_nCount = 0;
+ FX_BOOL segmentStatus = 0;
+ FX_BOOL IsContainPreChar = FALSE;
+ while (pos < nCount) {
+ if(pos == 493) {
+ int a = 0;
+ }
+ PAGECHAR_INFO charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(pos);
+ if(bContains && rect.Contains(charinfo.m_CharBox)) {
+ if (segmentStatus == 0 || segmentStatus == 2) {
+ segment.m_Start = pos;
+ segment.m_nCount = 1;
+ segmentStatus = 1;
+ } else if (segmentStatus == 1) {
+ segment.m_nCount++;
+ }
+ IsContainPreChar = TRUE;
+ } else if (!bContains && (IsRectIntersect(rect, charinfo.m_CharBox) || rect.Contains(charinfo.m_OriginX, charinfo.m_OriginY))) {
+ if (segmentStatus == 0 || segmentStatus == 2) {
+ segment.m_Start = pos;
+ segment.m_nCount = 1;
+ segmentStatus = 1;
+ } else if (segmentStatus == 1) {
+ segment.m_nCount++;
+ }
+ IsContainPreChar = TRUE;
+ } else if (charinfo.m_Unicode == 32) {
+ if (IsContainPreChar == TRUE) {
+ if (segmentStatus == 0 || segmentStatus == 2) {
+ segment.m_Start = pos;
+ segment.m_nCount = 1;
+ segmentStatus = 1;
+ } else if (segmentStatus == 1) {
+ segment.m_nCount++;
+ }
+ IsContainPreChar = FALSE;
+ } else {
+ if (segmentStatus == 1) {
+ segmentStatus = 2;
+ m_Segment.Add(segment);
+ segment.m_Start = 0;
+ segment.m_nCount = 0;
+ }
+ }
+ } else {
+ if (segmentStatus == 1) {
+ segmentStatus = 2;
+ m_Segment.Add(segment);
+ segment.m_Start = 0;
+ segment.m_nCount = 0;
+ }
+ IsContainPreChar = FALSE;
+ }
+ pos++;
+ }
+ if (segmentStatus == 1) {
+ segmentStatus = 2;
+ m_Segment.Add(segment);
+ segment.m_Start = 0;
+ segment.m_nCount = 0;
+ }
+ return m_Segment.GetSize();
+}
+void CPDF_TextPage::GetBoundedSegment(int index, int& start, int& count) const
+{
+ if(m_ParseOptions.m_bGetCharCodeOnly) {
+ return ;
+ }
+ if (index < 0 || index >= m_Segment.GetSize()) {
+ return;
+ }
+ start = m_Segment.GetAt(index).m_Start;
+ count = m_Segment.GetAt(index).m_nCount;
+}
+int CPDF_TextPage::GetWordBreak(int index, int direction) const
+{
+ if(m_ParseOptions.m_bGetCharCodeOnly) {
+ return -1;
+ }
+ if (!m_IsParsered) {
+ return -1;
+ }
+ if (direction != FPDFTEXT_LEFT && direction != FPDFTEXT_RIGHT) {
+ return -1;
+ }
+ if (index < 0 || index >= m_charList.GetSize()) {
+ return -1;
+ }
+ PAGECHAR_INFO charinfo;
+ charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(index);
+ if (charinfo.m_Index == -1 || charinfo.m_Flag == FPDFTEXT_CHAR_GENERATED) {
+ return index;
+ }
+ if (!IsLetter(charinfo.m_Unicode)) {
+ return index;
+ }
+ int breakPos = index;
+ if (direction == FPDFTEXT_LEFT) {
+ while (--breakPos > 0) {
+ charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(breakPos);
+ if (!IsLetter(charinfo.m_Unicode)) {
+ return breakPos;
+ }
+ }
+ return breakPos;
+ } else if (direction == FPDFTEXT_RIGHT) {
+ while (++breakPos < m_charList.GetSize()) {
+ charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(breakPos);
+ if (!IsLetter(charinfo.m_Unicode)) {
+ return breakPos;
+ }
+ }
+ return breakPos;
+ }
+ return breakPos;
+}
+FX_INT32 CPDF_TextPage::FindTextlineFlowDirection()
+{
+ if (!m_pPage) {
+ return -1;
+ }
+ const FX_INT32 nPageWidth = (FX_INT32)((CPDF_Page*)m_pPage)->GetPageWidth();
+ const FX_INT32 nPageHeight = (FX_INT32)((CPDF_Page*)m_pPage)->GetPageHeight();
+ CFX_ByteArray nHorizontalMask;
+ if (!nHorizontalMask.SetSize(nPageWidth)) {
+ return -1;
+ }
+ FX_BYTE* pDataH = nHorizontalMask.GetData();
+ CFX_ByteArray nVerticalMask;
+ if (!nVerticalMask.SetSize(nPageHeight)) {
+ return -1;
+ }
+ FX_BYTE* pDataV = nVerticalMask.GetData();
+ FX_INT32 index = 0;
+ FX_FLOAT fLineHeight = 0.0f;
+ CPDF_PageObject* pPageObj = NULL;
+ FX_POSITION pos = NULL;
+ pos = m_pPage->GetFirstObjectPosition();
+ if(!pos) {
+ return -1;
+ }
+ while(pos) {
+ pPageObj = m_pPage->GetNextObject(pos);
+ if(NULL == pPageObj) {
+ continue;
+ }
+ if(PDFPAGE_TEXT != pPageObj->m_Type) {
+ continue;
+ }
+ FX_INT32 minH = (FX_INT32)pPageObj->m_Left < 0 ? 0 : (FX_INT32)pPageObj->m_Left;
+ FX_INT32 maxH = (FX_INT32)pPageObj->m_Right > nPageWidth ? nPageWidth : (FX_INT32)pPageObj->m_Right;
+ FX_INT32 minV = (FX_INT32)pPageObj->m_Bottom < 0 ? 0 : (FX_INT32)pPageObj->m_Bottom;
+ FX_INT32 maxV = (FX_INT32)pPageObj->m_Top > nPageHeight ? nPageHeight : (FX_INT32)pPageObj->m_Top;
+ if (minH >= maxH || minV >= maxV){
+ continue;
+ }
+
+ FXSYS_memset8(pDataH + minH, 1, maxH - minH);
+ FXSYS_memset8(pDataV + minV, 1, maxV - minV);
+
+ if (fLineHeight <= 0.0f) {
+ fLineHeight = pPageObj->m_Top - pPageObj->m_Bottom;
+ }
+
+ pPageObj = NULL;
+ }
+ FX_INT32 nStartH = 0;
+ FX_INT32 nEndH = 0;
+ FX_FLOAT nSumH = 0.0f;
+ for (index = 0; index < nPageWidth; index++)
+ if(1 == nHorizontalMask[index]) {
+ break;
+ }
+ nStartH = index;
+ for (index = nPageWidth; index > 0; index--)
+ if(1 == nHorizontalMask[index - 1]) {
+ break;
+ }
+ nEndH = index;
+ for (index = nStartH; index < nEndH; index++) {
+ nSumH += nHorizontalMask[index];
+ }
+ nSumH /= nEndH - nStartH;
+ FX_INT32 nStartV = 0;
+ FX_INT32 nEndV = 0;
+ FX_FLOAT nSumV = 0.0f;
+ for (index = 0; index < nPageHeight; index++)
+ if(1 == nVerticalMask[index]) {
+ break;
+ }
+ nStartV = index;
+ for (index = nPageHeight; index > 0; index--)
+ if(1 == nVerticalMask[index - 1]) {
+ break;
+ }
+ nEndV = index;
+ for (index = nStartV; index < nEndV; index++) {
+ nSumV += nVerticalMask[index];
+ }
+ nSumV /= nEndV - nStartV;
+ if ((nEndV - nStartV) < (FX_INT32)(2 * fLineHeight)) {
+ return 0;
+ }
+ if ((nEndH - nStartH) < (FX_INT32)(2 * fLineHeight)) {
+ return 1;
+ }
+ if (nSumH > 0.8f) {
+ return 0;
+ }
+ if (nSumH - nSumV > 0.0f) {
+ return 0;
+ }
+ if (nSumV - nSumH > 0.0f) {
+ return 1;
+ }
+ return -1;
+}
+void CPDF_TextPage::ProcessObject()
+{
+ CPDF_PageObject* pPageObj = NULL;
+ if (!m_pPage) {
+ return;
+ }
+ FX_POSITION pos;
+ pos = m_pPage->GetFirstObjectPosition();
+ if (!pos) {
+ return;
+ }
+ m_TextlineDir = FindTextlineFlowDirection();
+ int nCount = 0;
+ while (pos) {
+ pPageObj = m_pPage->GetNextObject(pos);
+ if(pPageObj) {
+ if(pPageObj->m_Type == PDFPAGE_TEXT) {
+ if (nCount == 3) {
+ nCount = nCount;
+ }
+ CFX_AffineMatrix matrix;
+ ProcessTextObject((CPDF_TextObject*)pPageObj, matrix, pos);
+ nCount++;
+ } else if (pPageObj->m_Type == PDFPAGE_FORM) {
+ CFX_AffineMatrix formMatrix(1, 0, 0, 1, 0, 0);
+ ProcessFormObject((CPDF_FormObject*)pPageObj, formMatrix);
+ }
+ }
+ pPageObj = NULL;
+ }
+ int count = m_LineObj.GetSize();
+ for(int i = 0; i < count; i++) {
+ ProcessTextObject(m_LineObj.GetAt(i));
+ }
+ m_LineObj.RemoveAll();
+ CloseTempLine();
+}
+void CPDF_TextPage::ProcessFormObject(CPDF_FormObject* pFormObj, CFX_AffineMatrix formMatrix)
+{
+ CPDF_PageObject* pPageObj = NULL;
+ FX_POSITION pos;
+ if (!pFormObj) {
+ return;
+ }
+ pos = pFormObj->m_pForm->GetFirstObjectPosition();
+ if (!pos) {
+ return;
+ }
+ CFX_AffineMatrix curFormMatrix;
+ curFormMatrix.Copy(pFormObj->m_FormMatrix);
+ curFormMatrix.Concat(formMatrix);
+ while (pos) {
+ pPageObj = pFormObj->m_pForm->GetNextObject(pos);
+ if(pPageObj) {
+ if(pPageObj->m_Type == PDFPAGE_TEXT) {
+ ProcessTextObject((CPDF_TextObject*)pPageObj, curFormMatrix, pos);
+ } else if (pPageObj->m_Type == PDFPAGE_FORM) {
+ ProcessFormObject((CPDF_FormObject*)pPageObj, curFormMatrix);
+ }
+ }
+ pPageObj = NULL;
+ }
+}
+int CPDF_TextPage::GetCharWidth(FX_DWORD charCode, CPDF_Font* pFont) const
+{
+ if(charCode == -1) {
+ return 0;
+ }
+ int w = pFont->GetCharWidthF(charCode);
+ if(w == 0) {
+ CFX_ByteString str;
+ pFont->AppendChar(str, charCode);
+ w = pFont->GetStringWidth(str, 1);
+ if(w == 0) {
+ FX_RECT BBox;
+ pFont->GetCharBBox(charCode, BBox);
+ w = BBox.right - BBox.left;
+ }
+ }
+ return w;
+}
+void CPDF_TextPage::OnPiece(IFX_BidiChar* pBidi, CFX_WideString& str)
+{
+ FX_INT32 start, count;
+ FX_INT32 ret = pBidi->GetBidiInfo(start, count);
+ if(ret == 2) {
+ for(int i = start + count - 1; i >= start; i--) {
+ m_TextBuf.AppendChar(str.GetAt(i));
+ m_charList.Add(*(PAGECHAR_INFO*)m_TempCharList.GetAt(i));
+ }
+ } else {
+ int end = start + count ;
+ for(int i = start; i < end; i++) {
+ m_TextBuf.AppendChar(str.GetAt(i));
+ m_charList.Add(*(PAGECHAR_INFO*)m_TempCharList.GetAt(i));
+ }
+ }
+}
+void CPDF_TextPage::AddCharInfoByLRDirection(CFX_WideString& str, int i)
+{
+ PAGECHAR_INFO Info = *(PAGECHAR_INFO*)m_TempCharList.GetAt(i);
+ FX_WCHAR wChar = str.GetAt(i);
+#ifdef FOXIT_CHROME_BUILD
+ if(!IsControlChar(&Info)) {
+#else
+ if(wChar != 0xfffe) {
+#endif
+ Info.m_Index = m_TextBuf.GetLength();
+ if (wChar >= 0xFB00 && wChar <= 0xFB06) {
+ FX_LPWSTR pDst = NULL;
+ FX_STRSIZE nCount = FX_Unicode_GetNormalization(wChar, pDst);
+ if (nCount >= 1) {
+ pDst = FX_Alloc(FX_WCHAR, nCount);
+ if (!pDst) {
+ return;
+ }
+ FX_Unicode_GetNormalization(wChar, pDst);
+ for (int nIndex = 0; nIndex < nCount; nIndex++) {
+ PAGECHAR_INFO Info2 = Info;
+ Info2.m_Unicode = pDst[nIndex];
+ Info2.m_Flag = FPDFTEXT_CHAR_PIECE;
+ m_TextBuf.AppendChar(Info2.m_Unicode);
+ if( !m_ParseOptions.m_bGetCharCodeOnly) {
+ m_charList.Add(Info2);
+ }
+ }
+ FX_Free(pDst);
+ return;
+ }
+ }
+ m_TextBuf.AppendChar(wChar);
+ } else {
+ Info.m_Index = -1;
+ }
+ if( !m_ParseOptions.m_bGetCharCodeOnly) {
+ m_charList.Add(Info);
+ }
+}
+void CPDF_TextPage::AddCharInfoByRLDirection(CFX_WideString& str, int i)
+{
+ PAGECHAR_INFO Info = *(PAGECHAR_INFO*)m_TempCharList.GetAt(i);
+#ifdef FOXIT_CHROME_BUILD
+ if(!IsControlChar(&Info)) {
+#else
+ if(str.GetAt(i) != 0xfffe) {
+#endif
+ Info.m_Index = m_TextBuf.GetLength();
+ FX_WCHAR wChar = FX_GetMirrorChar(str.GetAt(i), TRUE, FALSE);
+ FX_LPWSTR pDst = NULL;
+ FX_STRSIZE nCount = FX_Unicode_GetNormalization(wChar, pDst);
+ if (nCount >= 1) {
+ pDst = FX_Alloc(FX_WCHAR, nCount);
+ if (!pDst) {
+ return;
+ }
+ FX_Unicode_GetNormalization(wChar, pDst);
+ for (int nIndex = 0; nIndex < nCount; nIndex++) {
+ PAGECHAR_INFO Info2 = Info;
+ Info2.m_Unicode = pDst[nIndex];
+ Info2.m_Flag = FPDFTEXT_CHAR_PIECE;
+ m_TextBuf.AppendChar(Info2.m_Unicode);
+ if( !m_ParseOptions.m_bGetCharCodeOnly) {
+ m_charList.Add(Info2);
+ }
+ }
+ FX_Free(pDst);
+ return;
+ } else {
+ Info.m_Unicode = wChar;
+ }
+ m_TextBuf.AppendChar(Info.m_Unicode);
+ } else {
+ Info.m_Index = -1;
+ }
+ if( !m_ParseOptions.m_bGetCharCodeOnly) {
+ m_charList.Add(Info);
+ }
+}
+void CPDF_TextPage::CloseTempLine()
+{
+ int count1 = m_TempCharList.GetSize();
+ if (count1 <= 0) {
+ return;
+ }
+ IFX_BidiChar* BidiChar = IFX_BidiChar::Create();
+ CFX_WideString str = m_TempTextBuf.GetWideString();
+ CFX_WordArray order;
+ FX_BOOL bR2L = FALSE;
+ FX_INT32 start = 0, count = 0, i = 0;
+ int nR2L = 0, nL2R = 0;
+ FX_BOOL bPrevSpace = FALSE;
+ for (i = 0; i < str.GetLength(); i++) {
+ if(str.GetAt(i) == 32) {
+ if(bPrevSpace) {
+ m_TempTextBuf.Delete(i, 1);
+ m_TempCharList.Delete(i);
+ str.Delete(i);
+ count1 --;
+ i--;
+ continue;
+ }
+ bPrevSpace = TRUE;
+ } else {
+ bPrevSpace = FALSE;
+ }
+ if(BidiChar && BidiChar->AppendChar(str.GetAt(i))) {
+ FX_INT32 ret = BidiChar->GetBidiInfo(start, count);
+ order.Add(start);
+ order.Add(count);
+ order.Add(ret);
+ if(!bR2L) {
+ if(ret == 2) {
+ nR2L++;
+ } else if (ret == 1) {
+ nL2R++;
+ }
+ }
+ }
+ }
+ if(BidiChar && BidiChar->EndChar()) {
+ FX_INT32 ret = BidiChar->GetBidiInfo(start, count);
+ order.Add(start);
+ order.Add(count);
+ order.Add(ret);
+ if(!bR2L) {
+ if(ret == 2) {
+ nR2L++;
+ } else if(ret == 1) {
+ nL2R++;
+ }
+ }
+ }
+ if(nR2L > 0 && nR2L >= nL2R) {
+ bR2L = TRUE;
+ }
+ if(this->m_parserflag == FPDFTEXT_RLTB || bR2L) {
+ int count = order.GetSize();
+ for(int j = count - 1; j > 0; j -= 3) {
+ int ret = order.GetAt(j);
+ int start = order.GetAt(j - 2);
+ int count1 = order.GetAt(j - 1);
+ if(ret == 2 || ret == 0) {
+ for(int i = start + count1 - 1; i >= start; i--) {
+ AddCharInfoByRLDirection(str, i);
+ }
+ } else {
+ i = j;
+ FX_BOOL bSymbol = FALSE;
+ while(i > 0 && order.GetAt(i) != 2) {
+ bSymbol = !order.GetAt(i);
+ i -= 3;
+ }
+ int end = start + count1 ;
+ int n = 0;
+ if(bSymbol) {
+ n = i + 6;
+ } else {
+ n = i + 3;
+ }
+ if(n >= j) {
+ for(int m = start; m < end; m++) {
+ AddCharInfoByLRDirection(str, m);
+ }
+ } else {
+ i = j;
+ j = n;
+ for(; n <= i; n += 3) {
+ int ret = order.GetAt(n);
+ int start = order.GetAt(n - 2);
+ int count1 = order.GetAt(n - 1);
+ int end = start + count1 ;
+ for(int m = start; m < end; m++) {
+ AddCharInfoByLRDirection(str, m);
+ }
+ }
+ }
+ }
+ }
+ } else {
+ int count = order.GetSize();
+ FX_BOOL bL2R = FALSE;
+ for(int j = 0; j < count; j += 3) {
+ int ret = order.GetAt(j + 2);
+ int start = order.GetAt(j);
+ int count1 = order.GetAt(j + 1);
+ if(ret == 2 || (j == 0 && ret == 0 && !bL2R)) {
+ int i = j + 3;
+ while(bR2L && i < count) {
+ if(order.GetAt(i + 2) == 1) {
+ break;
+ } else {
+ i += 3;
+ }
+ }
+ if(i == 3) {
+ j = -3;
+ bL2R = TRUE;
+ continue;
+ }
+ int end = m_TempCharList.GetSize() - 1;
+ if(i < count) {
+ end = order.GetAt(i) - 1;
+ }
+ j = i - 3;
+ for(int n = end; n >= start; n--) {
+ AddCharInfoByRLDirection(str, n);
+ }
+ } else {
+ int end = start + count1 ;
+ for(int i = start; i < end; i++) {
+ AddCharInfoByLRDirection(str, i);
+ }
+ }
+ }
+ }
+ int ntext = m_TextBuf.GetSize();
+ ntext = m_charList.GetSize();
+ order.RemoveAll();
+ m_TempCharList.RemoveAll();
+ m_TempTextBuf.Delete(0, m_TempTextBuf.GetLength());
+ BidiChar->Release();
+}
+void CPDF_TextPage::ProcessTextObject(CPDF_TextObject* pTextObj, CFX_AffineMatrix formMatrix, FX_POSITION ObjPos)
+{
+ CFX_FloatRect re(pTextObj->m_Left, pTextObj->m_Bottom, pTextObj->m_Right, pTextObj->m_Top);
+ if(FXSYS_fabs(pTextObj->m_Right - pTextObj->m_Left) < 0.01f ) {
+ return;
+ }
+ int count = m_LineObj.GetSize();
+ PDFTEXT_Obj Obj;
+ Obj.m_pTextObj = pTextObj;
+ Obj.m_formMatrix = formMatrix;
+ if(count == 0) {
+ m_LineObj.Add(Obj);
+ return;
+ }
+ if (IsSameAsPreTextObject(pTextObj, ObjPos)) {
+ return;
+ }
+ PDFTEXT_Obj prev_Obj = m_LineObj.GetAt(count - 1);
+ CPDF_TextObjectItem item;
+ int nItem = prev_Obj.m_pTextObj->CountItems();
+ prev_Obj.m_pTextObj->GetItemInfo(nItem - 1, &item);
+ FX_FLOAT prev_width = GetCharWidth(item.m_CharCode, prev_Obj.m_pTextObj->GetFont()) * prev_Obj.m_pTextObj->GetFontSize() / 1000;
+ CFX_AffineMatrix prev_matrix;
+ prev_Obj.m_pTextObj->GetTextMatrix(&prev_matrix);
+ prev_width = FXSYS_fabs(prev_width);
+ prev_matrix.Concat(prev_Obj.m_formMatrix);
+ prev_width = prev_matrix.TransformDistance(prev_width);
+ pTextObj->GetItemInfo(0, &item);
+ FX_FLOAT this_width = GetCharWidth(item.m_CharCode, pTextObj->GetFont()) * pTextObj->GetFontSize() / 1000;
+ this_width = FXSYS_fabs(this_width);
+ CFX_AffineMatrix this_matrix;
+ pTextObj->GetTextMatrix(&this_matrix);
+ this_width = FXSYS_fabs(this_width);
+ this_matrix.Concat(formMatrix);
+ this_width = this_matrix.TransformDistance(this_width);
+ FX_FLOAT threshold = prev_width > this_width ? prev_width / 4 : this_width / 4;
+ FX_FLOAT prev_x = prev_Obj.m_pTextObj->GetPosX(), prev_y = prev_Obj.m_pTextObj->GetPosY();
+ prev_Obj.m_formMatrix.Transform(prev_x, prev_y);
+ m_DisplayMatrix.Transform(prev_x, prev_y);
+ FX_FLOAT this_x = pTextObj->GetPosX(), this_y = pTextObj->GetPosY();
+ formMatrix.Transform(this_x, this_y);
+ m_DisplayMatrix.Transform(this_x, this_y);
+ if (FXSYS_fabs(this_y - prev_y) > threshold * 2) {
+ for(int i = 0; i < count; i++) {
+ ProcessTextObject(m_LineObj.GetAt(i));
+ }
+ m_LineObj.RemoveAll();
+ m_LineObj.Add(Obj);
+ return;
+ }
+ int i = 0;
+ if(m_ParseOptions.m_bNormalizeObjs) {
+ for(i = count - 1; i >= 0; i--) {
+ PDFTEXT_Obj prev_Obj = m_LineObj.GetAt(i);
+ CFX_AffineMatrix prev_matrix;
+ prev_Obj.m_pTextObj->GetTextMatrix(&prev_matrix);
+ FX_FLOAT Prev_x = prev_Obj.m_pTextObj->GetPosX(), Prev_y = prev_Obj.m_pTextObj->GetPosY();
+ prev_Obj.m_formMatrix.Transform(Prev_x, Prev_y);
+ m_DisplayMatrix.Transform(Prev_x, Prev_y);
+ if(this_x >= Prev_x) {
+ if(i == count - 1) {
+ m_LineObj.Add(Obj);
+ } else {
+ m_LineObj.InsertAt(i + 1, Obj);
+ }
+ break;
+ }
+ }
+ if(i < 0) {
+ m_LineObj.InsertAt(0, Obj);
+ }
+ } else {
+ m_LineObj.Add(Obj);
+ }
+}
+FX_INT32 CPDF_TextPage::PreMarkedContent(PDFTEXT_Obj Obj)
+{
+ CPDF_TextObject* pTextObj = Obj.m_pTextObj;
+ CPDF_ContentMarkData* pMarkData = (CPDF_ContentMarkData*)pTextObj->m_ContentMark.GetObject();
+ if(!pMarkData) {
+ return FPDFTEXT_MC_PASS;
+ }
+ int nContentMark = pMarkData->CountItems();
+ if (nContentMark < 1) {
+ return FPDFTEXT_MC_PASS;
+ }
+ CFX_WideString actText;
+ FX_BOOL bExist = FALSE;
+ CPDF_Dictionary* pDict = NULL;
+ int n = 0;
+ for (n = 0; n < nContentMark; n++) {
+ CPDF_ContentMarkItem& item = pMarkData->GetItem(n);
+ CFX_ByteString tagStr = (CFX_ByteString)item.GetName();
+ pDict = (CPDF_Dictionary*)item.GetParam();
+ CPDF_String* temp = (CPDF_String*)pDict->GetElement(FX_BSTRC("ActualText"));
+ if (temp) {
+ bExist = TRUE;
+ actText = temp->GetUnicodeText();
+ }
+ }
+ if (!bExist) {
+ return FPDFTEXT_MC_PASS;
+ }
+ if (m_pPreTextObj) {
+ if (CPDF_ContentMarkData* pPreMarkData = (CPDF_ContentMarkData*)m_pPreTextObj->m_ContentMark.GetObject()) {
+ if (pPreMarkData->CountItems() == n) {
+ CPDF_ContentMarkItem& item = pPreMarkData->GetItem(n - 1);
+ if (pDict == item.GetParam()) {
+ return FPDFTEXT_MC_DONE;
+ }
+ }
+ }
+ }
+ CPDF_Font* pFont = pTextObj->GetFont();
+ FX_STRSIZE nItems = actText.GetLength();
+ if (nItems < 1) {
+ return FPDFTEXT_MC_PASS;
+ }
+ bExist = FALSE;
+ for (FX_STRSIZE i = 0; i < nItems; i++) {
+ FX_WCHAR wChar = actText.GetAt(i);
+ if (-1 == pFont->CharCodeFromUnicode(wChar)) {
+ continue;
+ } else {
+ bExist = TRUE;
+ break;
+ }
+ }
+ if (!bExist) {
+ return FPDFTEXT_MC_PASS;
+ }
+ bExist = FALSE;
+ for (FX_STRSIZE j = 0; j < nItems; j++) {
+ FX_WCHAR wChar = actText.GetAt(j);
+ if ((wChar > 0x80 && wChar < 0xFFFD) || (wChar <= 0x80 && isprint(wChar))) {
+ bExist = TRUE;
+ break;
+ }
+ }
+ if (!bExist) {
+ return FPDFTEXT_MC_DONE;
+ }
+ return FPDFTEXT_MC_DELAY;
+}
+void CPDF_TextPage::ProcessMarkedContent(PDFTEXT_Obj Obj)
+{
+ CPDF_TextObject* pTextObj = Obj.m_pTextObj;
+ CPDF_ContentMarkData* pMarkData = (CPDF_ContentMarkData*)pTextObj->m_ContentMark.GetObject();
+ if(!pMarkData) {
+ return;
+ }
+ int nContentMark = pMarkData->CountItems();
+ if (nContentMark < 1) {
+ return;
+ }
+ CFX_WideString actText;
+ CPDF_Dictionary* pDict = NULL;
+ int n = 0;
+ for (n = 0; n < nContentMark; n++) {
+ CPDF_ContentMarkItem& item = pMarkData->GetItem(n);
+ CFX_ByteString tagStr = (CFX_ByteString)item.GetName();
+ pDict = (CPDF_Dictionary*)item.GetParam();
+ CPDF_String* temp = (CPDF_String*)pDict->GetElement(FX_BSTRC("ActualText"));
+ if (temp) {
+ actText = temp->GetUnicodeText();
+ }
+ }
+ FX_STRSIZE nItems = actText.GetLength();
+ if (nItems < 1) {
+ return;
+ }
+ CPDF_Font* pFont = pTextObj->GetFont();
+ CFX_AffineMatrix formMatrix = Obj.m_formMatrix;
+ CFX_AffineMatrix matrix;
+ pTextObj->GetTextMatrix(&matrix);
+ matrix.Concat(formMatrix);
+ FX_FLOAT fPosX = pTextObj->GetPosX();
+ FX_FLOAT fPosY = pTextObj->GetPosY();
+ int nCharInfoIndex = m_TextBuf.GetLength();
+ CFX_FloatRect charBox;
+ charBox.top = pTextObj->m_Top;
+ charBox.left = pTextObj->m_Left;
+ charBox.right = pTextObj->m_Right;
+ charBox.bottom = pTextObj->m_Bottom;
+ for (FX_STRSIZE k = 0; k < nItems; k++) {
+ FX_WCHAR wChar = actText.GetAt(k);
+ if (wChar <= 0x80 && !isprint(wChar)) {
+ wChar = 0x20;
+ }
+ if (wChar >= 0xFFFD) {
+ continue;
+ }
+ PAGECHAR_INFO charinfo;
+ charinfo.m_OriginX = fPosX;
+ charinfo.m_OriginY = fPosY;
+ charinfo.m_Index = nCharInfoIndex;
+ charinfo.m_Unicode = wChar;
+ charinfo.m_CharCode = pFont->CharCodeFromUnicode(wChar);
+ charinfo.m_Flag = FPDFTEXT_CHAR_PIECE;
+ charinfo.m_pTextObj = pTextObj;
+ charinfo.m_CharBox.top = charBox.top;
+ charinfo.m_CharBox.left = charBox.left;
+ charinfo.m_CharBox.right = charBox.right;
+ charinfo.m_CharBox.bottom = charBox.bottom;
+ charinfo.m_Matrix.Copy(matrix);
+ m_TempTextBuf.AppendChar(wChar);
+ m_TempCharList.Add(charinfo);
+ }
+}
+void CPDF_TextPage::FindPreviousTextObject(void)
+{
+ if (m_TempCharList.GetSize() < 1 && m_charList.GetSize() < 1) {
+ return;
+ }
+ PAGECHAR_INFO preChar;
+ if (m_TempCharList.GetSize() >= 1) {
+ preChar = *(PAGECHAR_INFO*)m_TempCharList.GetAt(m_TempCharList.GetSize() - 1);
+ } else {
+ preChar = *(PAGECHAR_INFO*)m_charList.GetAt(m_charList.GetSize() - 1);
+ }
+ if (preChar.m_pTextObj) {
+ m_pPreTextObj = preChar.m_pTextObj;
+ }
+}
+void CPDF_TextPage::ProcessTextObject(PDFTEXT_Obj Obj)
+{
+ CPDF_TextObject* pTextObj = Obj.m_pTextObj;
+ if(FXSYS_fabs(pTextObj->m_Right - pTextObj->m_Left) < 0.01f ) {
+ return;
+ }
+ CFX_AffineMatrix formMatrix = Obj.m_formMatrix;
+ CPDF_Font* pFont = pTextObj->GetFont();
+ CFX_AffineMatrix matrix;
+ pTextObj->GetTextMatrix(&matrix);
+ matrix.Concat(formMatrix);
+ FX_INT32 bPreMKC = PreMarkedContent(Obj);
+ if (FPDFTEXT_MC_DONE == bPreMKC) {
+ m_pPreTextObj = pTextObj;
+ m_perMatrix.Copy(formMatrix);
+ return;
+ }
+ int result = 0;
+ if (m_pPreTextObj) {
+ result = ProcessInsertObject(pTextObj, formMatrix);
+ if (2 == result) {
+ m_CurlineRect = CFX_FloatRect(Obj.m_pTextObj->m_Left, Obj.m_pTextObj->m_Bottom, Obj.m_pTextObj->m_Right, Obj.m_pTextObj->m_Top);
+ } else {
+ m_CurlineRect.Union(CFX_FloatRect(Obj.m_pTextObj->m_Left, Obj.m_pTextObj->m_Bottom, Obj.m_pTextObj->m_Right, Obj.m_pTextObj->m_Top));
+ }
+ PAGECHAR_INFO generateChar;
+ if (result == 1) {
+ if (GenerateCharInfo(TEXT_BLANK_CHAR, generateChar)) {
+ if (!formMatrix.IsIdentity()) {
+ generateChar.m_Matrix.Copy(formMatrix);
+ }
+ m_TempTextBuf.AppendChar(TEXT_BLANK_CHAR);
+ m_TempCharList.Add(generateChar);
+ }
+ } else if(result == 2) {
+ CloseTempLine();
+ if(m_TextBuf.GetSize()) {
+ if(m_ParseOptions.m_bGetCharCodeOnly) {
+ m_TextBuf.AppendChar(TEXT_RETURN_CHAR);
+ m_TextBuf.AppendChar(TEXT_LINEFEED_CHAR);
+ } else {
+ if(GenerateCharInfo(TEXT_RETURN_CHAR, generateChar)) {
+ m_TextBuf.AppendChar(TEXT_RETURN_CHAR);
+ if (!formMatrix.IsIdentity()) {
+ generateChar.m_Matrix.Copy(formMatrix);
+ }
+ m_charList.Add(generateChar);
+ }
+ if(GenerateCharInfo(TEXT_LINEFEED_CHAR, generateChar)) {
+ m_TextBuf.AppendChar(TEXT_LINEFEED_CHAR);
+ if (!formMatrix.IsIdentity()) {
+ generateChar.m_Matrix.Copy(formMatrix);
+ }
+ m_charList.Add(generateChar);
+ }
+ }
+ }
+ } else if (result == 3 && !m_ParseOptions.m_bOutputHyphen) {
+ FX_INT32 nChars = pTextObj->CountChars();
+ if (nChars == 1) {
+ CPDF_TextObjectItem item;
+ pTextObj->GetCharInfo(0, &item);
+ CFX_WideString wstrItem = pTextObj->GetFont()->UnicodeFromCharCode(item.m_CharCode);
+ if(wstrItem.IsEmpty()) {
+ wstrItem += (FX_WCHAR)item.m_CharCode;
+ }
+ FX_WCHAR curChar = wstrItem.GetAt(0);
+ if (0x2D == curChar || 0xAD == curChar) {
+ return;
+ }
+ }
+ while (m_TempTextBuf.GetSize() > 0 && m_TempTextBuf.GetWideString().GetAt(m_TempTextBuf.GetLength() - 1) == 0x20) {
+ m_TempTextBuf.Delete(m_TempTextBuf.GetLength() - 1, 1);
+ m_TempCharList.Delete(m_TempCharList.GetSize() - 1);
+ }
+ PAGECHAR_INFO* cha = (PAGECHAR_INFO*)m_TempCharList.GetAt(m_TempCharList.GetSize() - 1);
+ m_TempTextBuf.Delete(m_TempTextBuf.GetLength() - 1, 1);
+#ifdef FOXIT_CHROME_BUILD
+ cha->m_Unicode = 0x2;
+ cha->m_Flag = FPDFTEXT_CHAR_HYPHEN;
+ m_TempTextBuf.AppendChar(0xfffe);
+#else
+ cha->m_Unicode = 0;
+ m_TempTextBuf.AppendChar(0xfffe);
+#endif
+ }
+ } else {
+ m_CurlineRect = CFX_FloatRect(Obj.m_pTextObj->m_Left, Obj.m_pTextObj->m_Bottom, Obj.m_pTextObj->m_Right, Obj.m_pTextObj->m_Top);
+ }
+ if (FPDFTEXT_MC_DELAY == bPreMKC) {
+ ProcessMarkedContent(Obj);
+ m_pPreTextObj = pTextObj;
+ m_perMatrix.Copy(formMatrix);
+ return;
+ }
+ m_pPreTextObj = pTextObj;
+ m_perMatrix.Copy(formMatrix);
+ int nItems = pTextObj->CountItems();
+ FX_FLOAT spacing = 0;
+ FX_FLOAT baseSpace = 0.0;
+ FX_BOOL bAllChar = TRUE;
+ if (pTextObj->m_TextState.GetObject()->m_CharSpace && nItems >= 3) {
+ spacing = matrix.TransformDistance(pTextObj->m_TextState.GetObject()->m_CharSpace);
+ baseSpace = spacing;
+ for (int i = 0; i < nItems; i++) {
+ CPDF_TextObjectItem item;
+ pTextObj->GetItemInfo(i, &item);
+ if (item.m_CharCode == (FX_DWORD) - 1) {
+ FX_FLOAT fontsize_h = pTextObj->m_TextState.GetFontSizeH();
+ FX_FLOAT kerning = -fontsize_h * item.m_OriginX / 1000;
+ if(kerning + spacing < baseSpace) {
+ baseSpace = kerning + spacing;
+ }
+ bAllChar = FALSE;
+ }
+ }
+ spacing = 0;
+ if(baseSpace < 0.0 || (nItems == 3 && !bAllChar)) {
+ baseSpace = 0.0;
+ }
+ }
+ for (int i = 0; i < nItems; i++) {
+ CPDF_TextObjectItem item;
+ PAGECHAR_INFO charinfo;
+ charinfo.m_OriginX = 0;
+ charinfo.m_OriginY = 0;
+ pTextObj->GetItemInfo(i, &item);
+ if (item.m_CharCode == (FX_DWORD) - 1) {
+ CFX_WideString str = m_TempTextBuf.GetWideString();
+ if(str.IsEmpty()) {
+ str = m_TextBuf.GetWideString();
+ }
+ if (str.IsEmpty() || str.GetAt(str.GetLength() - 1) == TEXT_BLANK_CHAR) {
+ continue;
+ }
+ FX_FLOAT fontsize_h = pTextObj->m_TextState.GetFontSizeH();
+ spacing = -fontsize_h * item.m_OriginX / 1000;
+ continue;
+ }
+ FX_FLOAT charSpace = pTextObj->m_TextState.GetObject()->m_CharSpace;
+ if (charSpace > 0.001) {
+ spacing += matrix.TransformDistance(charSpace);
+ } else if(charSpace < -0.001) {
+ spacing -= matrix.TransformDistance(FXSYS_fabs(charSpace));
+ }
+ spacing -= baseSpace;
+ if (spacing && i > 0) {
+ int last_width = 0;
+ FX_FLOAT fontsize_h = pTextObj->m_TextState.GetFontSizeH();
+ FX_DWORD space_charcode = pFont->CharCodeFromUnicode(' ');
+ FX_FLOAT threshold = 0;
+ if (space_charcode != -1) {
+ threshold = fontsize_h * pFont->GetCharWidthF(space_charcode) / 1000 ;
+ }
+ if (threshold > fontsize_h / 3) {
+ threshold = 0;
+ } else {
+ threshold /= 2;
+ }
+ if (threshold == 0) {
+ threshold = fontsize_h;
+ int this_width = FXSYS_abs(GetCharWidth(item.m_CharCode, pFont));
+ threshold = this_width > last_width ? (FX_FLOAT)this_width : (FX_FLOAT)last_width;
+ int nDivide = 6;
+ if (threshold < 300) {
+ nDivide = 2;
+ } else if (threshold < 500) {
+ nDivide = 4;
+ } else if (threshold < 700) {
+ nDivide = 5;
+ }
+ threshold = threshold / nDivide;
+ threshold = fontsize_h * threshold / 1000;
+ }
+ if (threshold && (spacing && spacing >= threshold) ) {
+ charinfo.m_Unicode = TEXT_BLANK_CHAR;
+ charinfo.m_Flag = FPDFTEXT_CHAR_GENERATED;
+ charinfo.m_pTextObj = pTextObj;
+ charinfo.m_Index = m_TextBuf.GetLength();
+ m_TempTextBuf.AppendChar(TEXT_BLANK_CHAR);
+ charinfo.m_CharCode = -1;
+ charinfo.m_Matrix.Copy(formMatrix);
+ matrix.Transform(item.m_OriginX, item.m_OriginY, charinfo.m_OriginX, charinfo.m_OriginY);
+ charinfo.m_CharBox = CFX_FloatRect(charinfo.m_OriginX, charinfo.m_OriginY, charinfo.m_OriginX, charinfo.m_OriginY);
+ m_TempCharList.Add(charinfo);
+ }
+ if (item.m_CharCode == (FX_DWORD) - 1) {
+ continue;
+ }
+ }
+ spacing = 0;
+ CFX_WideString wstrItem = pFont->UnicodeFromCharCode(item.m_CharCode);
+ FX_BOOL bNoUnicode = FALSE;
+ FX_WCHAR wChar = wstrItem.GetAt(0);
+ if ((wstrItem.IsEmpty() || wChar == 0) && item.m_CharCode) {
+ if(wstrItem.IsEmpty()) {
+ wstrItem += (FX_WCHAR)item.m_CharCode;
+ } else {
+ wstrItem.SetAt(0, (FX_WCHAR)item.m_CharCode);
+ }
+ bNoUnicode = TRUE;
+ }
+ charinfo.m_Index = -1;
+ charinfo.m_CharCode = item.m_CharCode;
+ if(bNoUnicode) {
+ charinfo.m_Flag = FPDFTEXT_CHAR_UNUNICODE;
+ } else {
+ charinfo.m_Flag = FPDFTEXT_CHAR_NORMAL;
+ }
+ charinfo.m_pTextObj = pTextObj;
+ charinfo.m_OriginX = 0, charinfo.m_OriginY = 0;
+ matrix.Transform(item.m_OriginX, item.m_OriginY, charinfo.m_OriginX, charinfo.m_OriginY);
+ FX_RECT rect(0, 0, 0, 0);
+ rect.Intersect(0, 0, 0, 0);
+ charinfo.m_pTextObj->GetFont()->GetCharBBox(charinfo.m_CharCode, rect);
+ charinfo.m_CharBox.top = rect.top * pTextObj->GetFontSize() / 1000 + item.m_OriginY;
+ charinfo.m_CharBox.left = rect.left * pTextObj->GetFontSize() / 1000 + item.m_OriginX;
+ charinfo.m_CharBox.right = rect.right * pTextObj->GetFontSize() / 1000 + item.m_OriginX;
+ charinfo.m_CharBox.bottom = rect.bottom * pTextObj->GetFontSize() / 1000 + item.m_OriginY;
+ if (fabsf(charinfo.m_CharBox.top - charinfo.m_CharBox.bottom) < 0.01f) {
+ charinfo.m_CharBox.top = charinfo.m_CharBox.bottom + pTextObj->GetFontSize();
+ }
+ if (fabsf(charinfo.m_CharBox.right - charinfo.m_CharBox.left) < 0.01f) {
+ charinfo.m_CharBox.right = charinfo.m_CharBox.left + pTextObj->GetCharWidth(charinfo.m_CharCode);
+ }
+ matrix.TransformRect(charinfo.m_CharBox);
+ charinfo.m_Matrix.Copy(matrix);
+ if (wstrItem.IsEmpty()) {
+ charinfo.m_Unicode = 0;
+ m_TempCharList.Add(charinfo);
+ m_TempTextBuf.AppendChar(0xfffe);
+ continue;
+ } else {
+ int nTotal = wstrItem.GetLength();
+ int n = 0;
+ FX_BOOL bDel = FALSE;
+ while (n < m_TempCharList.GetSize() && n < 7) {
+ n++;
+ PAGECHAR_INFO* charinfo1 = (PAGECHAR_INFO*)m_TempCharList.GetAt(m_TempCharList.GetSize() - n);
+ if(charinfo1->m_CharCode == charinfo.m_CharCode &&
+ charinfo1->m_pTextObj->GetFont() == charinfo.m_pTextObj->GetFont() &&
+ FXSYS_fabs(charinfo1->m_OriginX - charinfo.m_OriginX) < TEXT_CHARRATIO_GAPDELTA * pTextObj->GetFontSize() &&
+ FXSYS_fabs(charinfo1->m_OriginY - charinfo.m_OriginY) < TEXT_CHARRATIO_GAPDELTA * pTextObj->GetFontSize() ) {
+ bDel = TRUE;
+ break;
+ }
+ }
+ if(!bDel) {
+ for (int nIndex = 0; nIndex < nTotal; nIndex++) {
+ charinfo.m_Unicode = wstrItem.GetAt(nIndex);
+ if (charinfo.m_Unicode) {
+ charinfo.m_Index = m_TextBuf.GetLength();
+ m_TempTextBuf.AppendChar(charinfo.m_Unicode);
+ } else {
+ m_TempTextBuf.AppendChar(0xfffe);
+ }
+ m_TempCharList.Add(charinfo);
+ }
+ } else if(i == 0) {
+ CFX_WideString str = m_TempTextBuf.GetWideString();
+ if (!str.IsEmpty() && str.GetAt(str.GetLength() - 1) == TEXT_BLANK_CHAR) {
+ m_TempTextBuf.Delete(m_TempTextBuf.GetLength() - 1, 1);
+ m_TempCharList.Delete(m_TempCharList.GetSize() - 1);
+ }
+ }
+ }
+ }
+}
+FX_INT32 CPDF_TextPage::GetTextObjectWritingMode(const CPDF_TextObject* pTextObj)
+{
+ FX_INT32 nChars = pTextObj->CountChars();
+ if (nChars == 1) {
+ return m_TextlineDir;
+ }
+ CPDF_TextObjectItem first, last;
+ pTextObj->GetCharInfo(0, &first);
+ pTextObj->GetCharInfo(nChars - 1, &last);
+ CFX_Matrix textMatrix;
+ pTextObj->GetTextMatrix(&textMatrix);
+ textMatrix.TransformPoint(first.m_OriginX, first.m_OriginY);
+ textMatrix.TransformPoint(last.m_OriginX, last.m_OriginY);
+ FX_FLOAT dX = FXSYS_fabs(last.m_OriginX - first.m_OriginX);
+ FX_FLOAT dY = FXSYS_fabs(last.m_OriginY - first.m_OriginY);
+ if (dX <= 0.0001f && dY <= 0.0001f) {
+ return -1;
+ }
+ CFX_VectorF v;
+ v.Set(dX, dY);
+ v.Normalize();
+ if (v.y <= 0.0872f) {
+ if (v.x <= 0.0872f) {
+ return m_TextlineDir;
+ }
+ return 0;
+ } else if (v.x <= 0.0872f) {
+ return 1;
+ }
+ return m_TextlineDir;
+}
+FX_BOOL CPDF_TextPage::IsHyphen(FX_WCHAR curChar)
+{
+ CFX_WideString strCurText = m_TempTextBuf.GetWideString();
+ if(strCurText.GetLength() == 0) {
+ strCurText = m_TextBuf.GetWideString();
+ }
+ FX_STRSIZE nCount = strCurText.GetLength();
+ int nIndex = nCount - 1;
+ FX_WCHAR wcTmp = strCurText.GetAt(nIndex);
+ while(wcTmp == 0x20 && nIndex <= nCount - 1 && nIndex >= 0) {
+ wcTmp = strCurText.GetAt(--nIndex);
+ }
+ if (0x2D == wcTmp || 0xAD == wcTmp) {
+ if (--nIndex > 0) {
+ FX_WCHAR preChar = strCurText.GetAt((nIndex));
+ if (((preChar >= L'A' && preChar <= L'Z') || (preChar >= L'a' && preChar <= L'z'))
+ && ((curChar >= L'A' && curChar <= L'Z') || (curChar >= L'a' && curChar <= L'z'))) {
+ return TRUE;
+ }
+ }
+ int size = m_TempCharList.GetSize();
+ PAGECHAR_INFO preChar;
+ if (size) {
+ preChar = (PAGECHAR_INFO)m_TempCharList[size - 1];
+ } else {
+ size = m_charList.GetSize();
+ if(size == 0) {
+ return FALSE;
+ }
+ preChar = (PAGECHAR_INFO)m_charList[size - 1];
+ }
+ if (FPDFTEXT_CHAR_PIECE == preChar.m_Flag)
+ if (0xAD == preChar.m_Unicode || 0x2D == preChar.m_Unicode) {
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+int CPDF_TextPage::ProcessInsertObject(const CPDF_TextObject* pObj, CFX_AffineMatrix formMatrix)
+{
+ FindPreviousTextObject();
+ FX_BOOL bNewline = FALSE;
+ int WritingMode = GetTextObjectWritingMode(pObj);
+ if(WritingMode == -1) {
+ WritingMode = GetTextObjectWritingMode(m_pPreTextObj);
+ }
+ CFX_FloatRect this_rect(pObj->m_Left, pObj->m_Bottom, pObj->m_Right, pObj->m_Top);
+ CFX_FloatRect prev_rect(m_pPreTextObj->m_Left, m_pPreTextObj->m_Bottom, m_pPreTextObj->m_Right, m_pPreTextObj->m_Top);
+ CPDF_TextObjectItem PrevItem, item;
+ int nItem = m_pPreTextObj->CountItems();
+ m_pPreTextObj->GetItemInfo(nItem - 1, &PrevItem);
+ pObj->GetItemInfo(0, &item);
+ CFX_WideString wstrItem = pObj->GetFont()->UnicodeFromCharCode(item.m_CharCode);
+ if(wstrItem.IsEmpty()) {
+ wstrItem += (FX_WCHAR)item.m_CharCode;
+ }
+ FX_WCHAR curChar = wstrItem.GetAt(0);
+ if(WritingMode == 0) {
+ if(this_rect.Height() > 4.5 && prev_rect.Height() > 4.5) {
+ FX_FLOAT top = this_rect.top < prev_rect.top ? this_rect.top : prev_rect.top;
+ FX_FLOAT bottom = this_rect.bottom > prev_rect.bottom ? this_rect.bottom : prev_rect.bottom;
+ if(bottom >= top) {
+ if(IsHyphen(curChar)) {
+ return 3;
+ }
+ return 2;
+ }
+ }
+ } else if (WritingMode == 1) {
+ if(this_rect.Width() > pObj->GetFontSize() * 0.1f && prev_rect.Width() > m_pPreTextObj->GetFontSize() * 0.1f) {
+ FX_FLOAT left = this_rect.left > m_CurlineRect.left ? this_rect.left : m_CurlineRect.left;
+ FX_FLOAT right = this_rect.right < m_CurlineRect.right ? this_rect.right : m_CurlineRect.right;
+ if(right <= left) {
+ if(IsHyphen(curChar)) {
+ return 3;
+ }
+ return 2;
+ }
+ }
+ }
+ FX_FLOAT last_pos = PrevItem.m_OriginX;
+ int nLastWidth = GetCharWidth(PrevItem.m_CharCode, m_pPreTextObj->GetFont());
+ FX_FLOAT last_width = nLastWidth * m_pPreTextObj->GetFontSize() / 1000;
+ last_width = FXSYS_fabs(last_width);
+ int nThisWidth = GetCharWidth(item.m_CharCode, pObj->GetFont());
+ FX_FLOAT this_width = nThisWidth * pObj->GetFontSize() / 1000;
+ this_width = FXSYS_fabs(this_width);
+ FX_FLOAT threshold = last_width > this_width ? last_width / 4 : this_width / 4;
+ CFX_AffineMatrix prev_matrix, prev_reverse;
+ m_pPreTextObj->GetTextMatrix(&prev_matrix);
+ prev_matrix.Concat(m_perMatrix);
+ prev_reverse.SetReverse(prev_matrix);
+ FX_FLOAT x = pObj->GetPosX();
+ FX_FLOAT y = pObj->GetPosY();
+ formMatrix.Transform(x, y);
+ prev_reverse.Transform(x, y);
+ if(last_width < this_width) {
+ threshold = prev_reverse.TransformDistance(threshold);
+ }
+ CFX_FloatRect rect1(m_pPreTextObj->m_Left, pObj->m_Bottom, m_pPreTextObj->m_Right, pObj->m_Top);
+ CFX_FloatRect rect2(m_pPreTextObj->m_Left, m_pPreTextObj->m_Bottom, m_pPreTextObj->m_Right, m_pPreTextObj->m_Top);
+ CFX_FloatRect rect3 = rect1;
+ rect1.Intersect(rect2);
+ if (WritingMode == 0) {
+ if ((rect1.IsEmpty() && rect2.Height() > 5 && rect3.Height() > 5)
+ || ((y > threshold * 2 || y < threshold * -3) && (FXSYS_fabs(y) < 1 ? FXSYS_fabs(x) < FXSYS_fabs(y) : TRUE))) {
+ bNewline = TRUE;
+ if(nItem > 1 ) {
+ CPDF_TextObjectItem tempItem;
+ m_pPreTextObj->GetItemInfo(0, &tempItem);
+ CFX_AffineMatrix m;
+ m_pPreTextObj->GetTextMatrix(&m);
+ if(PrevItem.m_OriginX > tempItem.m_OriginX &&
+ m_DisplayMatrix.a > 0.9 && m_DisplayMatrix.b < 0.1 &&
+ m_DisplayMatrix.c < 0.1 && m_DisplayMatrix.d < -0.9
+ && m.b < 0.1 && m.c < 0.1 ) {
+ CFX_FloatRect re(0, m_pPreTextObj->m_Bottom, 1000, m_pPreTextObj->m_Top);
+ if(re.Contains(pObj->GetPosX(), pObj->GetPosY())) {
+ bNewline = FALSE;
+ } else {
+ CFX_FloatRect re(0, pObj->m_Bottom, 1000, pObj->m_Top);
+ if(re.Contains(m_pPreTextObj->GetPosX(), m_pPreTextObj->GetPosY())) {
+ bNewline = FALSE;
+ }
+ }
+ }
+ }
+ }
+ }
+ if(bNewline) {
+ if(IsHyphen(curChar)) {
+ return 3;
+ }
+ return 2;
+ }
+ FX_INT32 nChars = pObj->CountChars();
+ if (nChars == 1 && ( 0x2D == curChar || 0xAD == curChar))
+ if (IsHyphen(curChar)) {
+ return 3;
+ }
+ CFX_WideString PrevStr = m_pPreTextObj->GetFont()->UnicodeFromCharCode(PrevItem.m_CharCode);
+ FX_WCHAR preChar = PrevStr.GetAt(PrevStr.GetLength() - 1);
+ CFX_AffineMatrix matrix;
+ pObj->GetTextMatrix(&matrix);
+ matrix.Concat(formMatrix);
+ threshold = (FX_FLOAT)(nLastWidth > nThisWidth ? nLastWidth : nThisWidth);
+ threshold = threshold > 400 ? (threshold < 700 ? threshold / 4 : (threshold > 800 ? threshold / 6 : threshold / 5)) : (threshold / 2);
+ if(nLastWidth >= nThisWidth) {
+ threshold *= FXSYS_fabs(m_pPreTextObj->GetFontSize());
+ } else {
+ threshold *= FXSYS_fabs(pObj->GetFontSize());
+ threshold = matrix.TransformDistance(threshold);
+ threshold = prev_reverse.TransformDistance(threshold);
+ }
+ threshold /= 1000;
+ if((threshold < 1.4881 && threshold > 1.4879)
+ || (threshold < 1.39001 && threshold > 1.38999)) {
+ threshold *= 1.5;
+ }
+ if (FXSYS_fabs(last_pos + last_width - x) > threshold && curChar != L' ' && preChar != L' ')
+ if (curChar != L' ' && preChar != L' ') {
+ if((x - last_pos - last_width) > threshold || (last_pos - x - last_width) > threshold) {
+ return 1;
+ }
+ if(x < 0 && (last_pos - x - last_width) > threshold) {
+ return 1;
+ }
+ if((x - last_pos - last_width) > this_width || (x - last_pos - this_width) > last_width ) {
+ return 1;
+ }
+ }
+ return 0;
+}
+FX_BOOL CPDF_TextPage::IsSameTextObject(CPDF_TextObject* pTextObj1, CPDF_TextObject* pTextObj2)
+{
+ if (!pTextObj1 || !pTextObj2) {
+ return FALSE;
+ }
+ CFX_FloatRect rcPreObj(pTextObj2->m_Left, pTextObj2->m_Bottom, pTextObj2->m_Right, pTextObj2->m_Top);
+ CFX_FloatRect rcCurObj(pTextObj1->m_Left, pTextObj1->m_Bottom, pTextObj1->m_Right, pTextObj1->m_Top);
+ if (rcPreObj.IsEmpty() && rcCurObj.IsEmpty() && !m_ParseOptions.m_bGetCharCodeOnly) {
+ FX_FLOAT dbXdif = FXSYS_fabs(rcPreObj.left - rcCurObj.left);
+ int nCount = m_charList.GetSize();
+ if (nCount >= 2) {
+ PAGECHAR_INFO perCharTemp = (PAGECHAR_INFO)m_charList[nCount - 2];
+ FX_FLOAT dbSpace = perCharTemp.m_CharBox.Width();
+ if (dbXdif > dbSpace) {
+ return FALSE;
+ }
+ }
+ }
+ if (!rcPreObj.IsEmpty() || !rcCurObj.IsEmpty()) {
+ rcPreObj.Intersect(rcCurObj);
+ if (rcPreObj.IsEmpty()) {
+ return FALSE;
+ }
+ if (FXSYS_fabs(rcPreObj.Width() - rcCurObj.Width()) > rcCurObj.Width() / 2) {
+ return FALSE;
+ }
+ if (pTextObj2->GetFontSize() != pTextObj1->GetFontSize()) {
+ return FALSE;
+ }
+ }
+ int nPreCount = pTextObj2->CountItems();
+ int nCurCount = pTextObj1->CountItems();
+ if (nPreCount != nCurCount) {
+ return FALSE;
+ }
+ CPDF_TextObjectItem itemPer, itemCur;
+ for (int i = 0; i < nPreCount; i++) {
+ pTextObj2->GetItemInfo(i, &itemPer);
+ pTextObj1->GetItemInfo(i, &itemCur);
+ if (itemCur.m_CharCode != itemPer.m_CharCode) {
+ return FALSE;
+ }
+ }
+ if(FXSYS_fabs(pTextObj1->GetPosX() - pTextObj2->GetPosX()) > GetCharWidth(itemPer.m_CharCode, pTextObj2->GetFont())*pTextObj2->GetFontSize() / 1000 * 0.9 ||
+ FXSYS_fabs(pTextObj1->GetPosY() - pTextObj2->GetPosY()) >
+ FX_MAX(FX_MAX(rcPreObj.Height() , rcPreObj.Width()), pTextObj2->GetFontSize()) / 8) {
+ return FALSE;
+ }
+ return TRUE;
+}
+FX_BOOL CPDF_TextPage::IsSameAsPreTextObject(CPDF_TextObject* pTextObj, FX_POSITION ObjPos)
+{
+ if (!pTextObj) {
+ return FALSE;
+ }
+ int i = 0;
+ if (!ObjPos) {
+ ObjPos = m_pPage->GetLastObjectPosition();
+ }
+ CPDF_PageObject* pObj = m_pPage->GetPrevObject(ObjPos);
+ while (i < 5 && ObjPos) {
+ pObj = m_pPage->GetPrevObject(ObjPos);
+ if(pObj == pTextObj) {
+ continue;
+ }
+ if(pObj->m_Type != PDFPAGE_TEXT) {
+ continue;
+ }
+ if(IsSameTextObject((CPDF_TextObject*)pObj, pTextObj)) {
+ return TRUE;
+ }
+ i++;
+ }
+ return FALSE;
+}
+FX_BOOL CPDF_TextPage::GenerateCharInfo(FX_WCHAR unicode, PAGECHAR_INFO& info)
+{
+ int size = m_TempCharList.GetSize();
+ PAGECHAR_INFO preChar;
+ if (size) {
+ preChar = (PAGECHAR_INFO)m_TempCharList[size - 1];
+ } else {
+ size = m_charList.GetSize();
+ if(size == 0) {
+ return FALSE;
+ }
+ preChar = (PAGECHAR_INFO)m_charList[size - 1];
+ }
+ info.m_Index = m_TextBuf.GetLength();
+ info.m_Unicode = unicode;
+ info.m_pTextObj = NULL;
+ info.m_CharCode = -1;
+ info.m_Flag = FPDFTEXT_CHAR_GENERATED;
+ int preWidth = 0;
+ if (preChar.m_pTextObj && preChar.m_CharCode != (FX_DWORD) - 1) {
+ preWidth = GetCharWidth(preChar.m_CharCode, preChar.m_pTextObj->GetFont());
+ }
+ FX_FLOAT fs = 0;
+ if(preChar.m_pTextObj) {
+ fs = preChar.m_pTextObj->GetFontSize();
+ } else {
+ fs = preChar.m_CharBox.Height();
+ }
+ if(!fs) {
+ fs = 1;
+ }
+ info.m_OriginX = preChar.m_OriginX + preWidth * (fs) / 1000;
+ info.m_OriginY = preChar.m_OriginY;
+ info.m_CharBox = CFX_FloatRect(info.m_OriginX, info.m_OriginY, info.m_OriginX, info.m_OriginY);
+ return TRUE;
+}
+FX_BOOL CPDF_TextPage::IsRectIntersect(CFX_FloatRect rect1, CFX_FloatRect rect2)
+{
+ rect1.Intersect(rect2);
+ if(rect1.IsEmpty()) {
+ return FALSE;
+ }
+ return TRUE;
+}
+FX_BOOL CPDF_TextPage::IsLetter(FX_WCHAR unicode)
+{
+ if (unicode < L'A') {
+ return FALSE;
+ }
+ if (unicode > L'Z' && unicode < L'a') {
+ return FALSE;
+ }
+ if (unicode > L'z') {
+ return FALSE;
+ }
+ return TRUE;
+}
+CPDF_TextPageFind::CPDF_TextPageFind(const IPDF_TextPage* pTextPage)
+ : m_IsFind(FALSE),
+ m_pTextPage(NULL)
+{
+ if (!pTextPage) {
+ return;
+ }
+ CPDF_ModuleMgr* pPDFModule = CPDF_ModuleMgr::Get();
+ m_pTextPage = pTextPage;
+ m_strText = m_pTextPage->GetPageText();
+ int nCount = pTextPage->CountChars();
+ if(nCount) {
+ m_CharIndex.Add(0);
+ }
+ for(int i = 0; i < nCount; i++) {
+ FPDF_CHAR_INFO info;
+ pTextPage->GetCharInfo(i, info);
+ int indexSize = m_CharIndex.GetSize();
+ if(info.m_Flag == CHAR_NORMAL || info.m_Flag == CHAR_GENERATED) {
+ if(indexSize % 2) {
+ m_CharIndex.Add(1);
+ } else {
+ if(indexSize <= 0) {
+ continue;
+ }
+ m_CharIndex.SetAt(indexSize - 1, m_CharIndex.GetAt(indexSize - 1) + 1);
+ }
+ } else {
+ if(indexSize % 2) {
+ if(indexSize <= 0) {
+ continue;
+ }
+ m_CharIndex.SetAt(indexSize - 1, i + 1);
+ } else {
+ m_CharIndex.Add(i + 1);
+ }
+ }
+ }
+ int indexSize = m_CharIndex.GetSize();
+ if(indexSize % 2) {
+ m_CharIndex.RemoveAt(indexSize - 1);
+ }
+ m_resStart = 0;
+ m_resEnd = -1;
+}
+int CPDF_TextPageFind::GetCharIndex(int index) const
+{
+ return m_pTextPage->CharIndexFromTextIndex(index);
+ int indexSize = m_CharIndex.GetSize();
+ int count = 0;
+ for(int i = 0; i < indexSize; i += 2) {
+ count += m_CharIndex.GetAt(i + 1);
+ if(count > index) {
+ return index - count + m_CharIndex.GetAt(i + 1) + m_CharIndex.GetAt(i);
+ }
+ }
+ return -1;
+}
+FX_BOOL CPDF_TextPageFind::FindFirst(CFX_WideString findwhat, int flags, int startPos)
+{
+ if (!m_pTextPage) {
+ return FALSE;
+ }
+ if (m_strText.IsEmpty() || m_bMatchCase != (flags & FPDFTEXT_MATCHCASE)) {
+ m_strText = m_pTextPage->GetPageText();
+ }
+ m_findWhat = findwhat;
+ m_flags = flags;
+ m_bMatchCase = flags & FPDFTEXT_MATCHCASE;
+ if (m_strText.IsEmpty()) {
+ m_IsFind = FALSE;
+ return TRUE;
+ }
+ FX_STRSIZE len = findwhat.GetLength();
+ if (!m_bMatchCase) {
+ findwhat.MakeLower();
+ m_strText.MakeLower();
+ }
+ m_bMatchWholeWord = flags & FPDFTEXT_MATCHWHOLEWORD;
+ m_findNextStart = startPos;
+ if (startPos == -1) {
+ m_findPreStart = m_strText.GetLength() - 1;
+ } else {
+ m_findPreStart = startPos;
+ }
+ m_csFindWhatArray.RemoveAll();
+ int i = 0;
+ while(i < len) {
+ if(findwhat.GetAt(i) != ' ') {
+ break;
+ }
+ i++;
+ }
+ if(i < len) {
+ ExtractFindWhat(findwhat);
+ } else {
+ m_csFindWhatArray.Add(findwhat);
+ }
+ if(m_csFindWhatArray.GetSize() <= 0) {
+ return FALSE;
+ }
+ m_IsFind = TRUE;
+ m_resStart = 0;
+ m_resEnd = -1;
+ return TRUE;
+}
+FX_BOOL CPDF_TextPageFind::FindNext()
+{
+ if (!m_pTextPage) {
+ return FALSE;
+ }
+ m_resArray.RemoveAll();
+ if(m_findNextStart == -1) {
+ return FALSE;
+ }
+ if(m_strText.IsEmpty()) {
+ m_IsFind = FALSE;
+ return m_IsFind;
+ }
+ int strLen = m_strText.GetLength();
+ if (m_findNextStart > strLen - 1) {
+ m_IsFind = FALSE;
+ return m_IsFind;
+ }
+ int nCount = m_csFindWhatArray.GetSize();
+ int nResultPos = 0;
+ int nStartPos = 0;
+ nStartPos = m_findNextStart;
+ FX_BOOL bSpaceStart = FALSE;
+ for(int iWord = 0; iWord < nCount; iWord++) {
+ CFX_WideString csWord = m_csFindWhatArray[iWord];
+ if(csWord.IsEmpty()) {
+ if(iWord == nCount - 1) {
+ FX_WCHAR strInsert = m_strText.GetAt(nStartPos);
+ if(strInsert == TEXT_LINEFEED_CHAR || strInsert == TEXT_BLANK_CHAR || strInsert == TEXT_RETURN_CHAR || strInsert == 160) {
+ nResultPos = nStartPos + 1;
+ break;
+ }
+ iWord = -1;
+ } else if(iWord == 0) {
+ bSpaceStart = TRUE;
+ }
+ continue;
+ }
+ int endIndex;
+ nResultPos = m_strText.Find(csWord, nStartPos);
+ if (nResultPos == -1) {
+ m_IsFind = FALSE;
+ return m_IsFind;
+ }
+ endIndex = nResultPos + csWord.GetLength() - 1;
+ if(iWord == 0) {
+ m_resStart = nResultPos;
+ }
+ FX_BOOL bMatch = TRUE;
+ if(iWord != 0 && !bSpaceStart) {
+ int PreResEndPos = nStartPos;
+ int curChar = csWord.GetAt(0);
+ CFX_WideString lastWord = m_csFindWhatArray[iWord - 1];
+ int lastChar = lastWord.GetAt(lastWord.GetLength() - 1);
+ if(nStartPos == nResultPos && !(_IsIgnoreSpaceCharacter(lastChar) || _IsIgnoreSpaceCharacter(curChar))) {
+ bMatch = FALSE;
+ }
+ for(int d = PreResEndPos; d < nResultPos; d++) {
+ FX_WCHAR strInsert = m_strText.GetAt(d);
+ if(strInsert != TEXT_LINEFEED_CHAR && strInsert != TEXT_BLANK_CHAR && strInsert != TEXT_RETURN_CHAR && strInsert != 160) {
+ bMatch = FALSE;
+ break;
+ }
+ }
+ } else if(bSpaceStart) {
+ if(nResultPos > 0) {
+ FX_WCHAR strInsert = m_strText.GetAt(nResultPos - 1);
+ if(strInsert != TEXT_LINEFEED_CHAR && strInsert != TEXT_BLANK_CHAR && strInsert != TEXT_RETURN_CHAR && strInsert != 160) {
+ bMatch = FALSE;
+ m_resStart = nResultPos;
+ } else {
+ m_resStart = nResultPos - 1;
+ }
+ }
+ }
+ if(m_bMatchWholeWord && bMatch) {
+ bMatch = IsMatchWholeWord(m_strText, nResultPos, endIndex);
+ }
+ nStartPos = endIndex + 1;
+ if(!bMatch) {
+ iWord = -1;
+ if(bSpaceStart) {
+ nStartPos = m_resStart + m_csFindWhatArray[1].GetLength();
+ } else {
+ nStartPos = m_resStart + m_csFindWhatArray[0].GetLength();
+ }
+ }
+ }
+ m_resEnd = nResultPos + m_csFindWhatArray[m_csFindWhatArray.GetSize() - 1].GetLength() - 1;
+ m_IsFind = TRUE;
+ int resStart = GetCharIndex(m_resStart);
+ int resEnd = GetCharIndex(m_resEnd);
+ m_pTextPage->GetRectArray(resStart, resEnd - resStart + 1, m_resArray);
+ if(m_flags & FPDFTEXT_CONSECUTIVE) {
+ m_findNextStart = m_resStart + 1;
+ m_findPreStart = m_resEnd - 1;
+ } else {
+ m_findNextStart = m_resEnd + 1;
+ m_findPreStart = m_resStart - 1;
+ }
+ return m_IsFind;
+}
+FX_BOOL CPDF_TextPageFind::FindPrev()
+{
+ if (!m_pTextPage) {
+ return FALSE;
+ }
+ m_resArray.RemoveAll();
+ if(m_strText.IsEmpty() || m_findPreStart < 0) {
+ m_IsFind = FALSE;
+ return m_IsFind;
+ }
+ CPDF_TextPageFind findEngine(m_pTextPage);
+ FX_BOOL ret = findEngine.FindFirst(m_findWhat, m_flags);
+ if(!ret) {
+ m_IsFind = FALSE;
+ return m_IsFind;
+ }
+ int order = -1, MatchedCount = 0;
+ while(ret) {
+ ret = findEngine.FindNext();
+ if(ret) {
+ int order1 = findEngine.GetCurOrder() ;
+ int MatchedCount1 = findEngine.GetMatchedCount();
+ if(((order1 + MatchedCount1) - 1) > m_findPreStart) {
+ break;
+ }
+ order = order1;
+ MatchedCount = MatchedCount1;
+ }
+ }
+ if(order == -1) {
+ m_IsFind = FALSE;
+ return m_IsFind;
+ }
+ m_resStart = m_pTextPage->TextIndexFromCharIndex(order);
+ m_resEnd = m_pTextPage->TextIndexFromCharIndex(order + MatchedCount - 1);
+ m_IsFind = TRUE;
+ m_pTextPage->GetRectArray(order, MatchedCount, m_resArray);
+ if(m_flags & FPDFTEXT_CONSECUTIVE) {
+ m_findNextStart = m_resStart + 1;
+ m_findPreStart = m_resEnd - 1;
+ } else {
+ m_findNextStart = m_resEnd + 1;
+ m_findPreStart = m_resStart - 1;
+ }
+ return m_IsFind;
+}
+void CPDF_TextPageFind::ExtractFindWhat(CFX_WideString findwhat)
+{
+ if(findwhat.IsEmpty()) {
+ return ;
+ }
+ int index = 0;
+ while(1) {
+ CFX_WideString csWord = TEXT_EMPTY;
+ int ret = ExtractSubString(csWord, findwhat, index, TEXT_BLANK_CHAR);
+ if(csWord.IsEmpty()) {
+ if(ret) {
+ m_csFindWhatArray.Add(CFX_WideString(L""));
+ index++;
+ continue;
+ } else {
+ break;
+ }
+ }
+ int pos = 0;
+ FX_BOOL bLastIgnore = FALSE;
+ while(pos < csWord.GetLength()) {
+ CFX_WideString curStr = csWord.Mid(pos, 1);
+ FX_WCHAR curChar = csWord.GetAt(pos);
+ if (_IsIgnoreSpaceCharacter(curChar)) {
+ if (pos > 0 && curChar == 0x2019) {
+ pos++;
+ continue;
+ }
+ if (pos > 0 ) {
+ CFX_WideString preStr = csWord.Mid(0, pos);
+ m_csFindWhatArray.Add(preStr);
+ }
+ m_csFindWhatArray.Add(curStr);
+ if (pos == csWord.GetLength() - 1) {
+ csWord.Empty();
+ break;
+ }
+ csWord = csWord.Right(csWord.GetLength() - pos - 1);
+ pos = 0;
+ bLastIgnore = TRUE;
+ continue;
+ } else {
+ bLastIgnore = FALSE;
+ }
+ pos++;
+ }
+ if (!csWord.IsEmpty()) {
+ m_csFindWhatArray.Add(csWord);
+ }
+ index++;
+ }
+ return;
+}
+FX_BOOL CPDF_TextPageFind::IsMatchWholeWord(CFX_WideString csPageText, int startPos, int endPos)
+{
+ int char_left = 0;
+ int char_right = 0;
+ int char_count = endPos - startPos + 1;
+ if(char_count < 1) {
+ return FALSE;
+ }
+ if (char_count == 1 && csPageText.GetAt(startPos) > 255) {
+ return TRUE;
+ }
+ if(startPos - 1 >= 0 ) {
+ char_left = csPageText.GetAt(startPos - 1);
+ }
+ if(startPos + char_count < csPageText.GetLength()) {
+ char_right = csPageText.GetAt(startPos + char_count);
+ }
+ if(char_left == 0x61) {
+ int a = 0;
+ }
+ if ((char_left > 'A' && char_left < 'a') || (char_left > 'a' && char_left < 'z') || (char_left > 0xfb00 && char_left < 0xfb06) || (char_left >= '0' && char_left <= '9') ||
+ (char_right > 'A' && char_right < 'a') || (char_right > 'a' && char_right < 'z') || (char_right > 0xfb00 && char_right < 0xfb06) || (char_right >= '0' && char_right <= '9')) {
+ return FALSE;
+ }
+ if(!(('A' > char_left || char_left > 'Z') && ('a' > char_left || char_left > 'z')
+ && ('A' > char_right || char_right > 'Z') && ('a' > char_right || char_right > 'z'))) {
+ return FALSE;
+ }
+ if (char_count > 0) {
+ if (csPageText.GetAt(startPos) >= L'0' && csPageText.GetAt(startPos) <= L'9' && char_left >= L'0' && char_left <= L'9') {
+ return FALSE;
+ }
+ if (csPageText.GetAt(endPos) >= L'0' && csPageText.GetAt(endPos) <= L'9' && char_right >= L'0' && char_right <= L'9') {
+ return FALSE;
+ }
+ }
+ return TRUE;
+}
+FX_BOOL CPDF_TextPageFind::ExtractSubString(CFX_WideString& rString, FX_LPCWSTR lpszFullString,
+ int iSubString, FX_WCHAR chSep)
+{
+ if (lpszFullString == NULL) {
+ return FALSE;
+ }
+ while (iSubString--) {
+ lpszFullString = FXSYS_wcschr(lpszFullString, chSep);
+ if (lpszFullString == NULL) {
+ rString.Empty();
+ return FALSE;
+ }
+ lpszFullString++;
+ while(*lpszFullString == chSep) {
+ lpszFullString++;
+ }
+ }
+ FX_LPCWSTR lpchEnd = FXSYS_wcschr(lpszFullString, chSep);
+ int nLen = (lpchEnd == NULL) ?
+ (int)FXSYS_wcslen(lpszFullString) : (int)(lpchEnd - lpszFullString);
+ ASSERT(nLen >= 0);
+ FXSYS_memcpy32(rString.GetBuffer(nLen), lpszFullString, nLen * sizeof(FX_WCHAR));
+ rString.ReleaseBuffer();
+ return TRUE;
+}
+CFX_WideString CPDF_TextPageFind::MakeReverse(const CFX_WideString str)
+{
+ CFX_WideString str2;
+ str2.Empty();
+ int nlen = str.GetLength();
+ for(int i = nlen - 1; i >= 0; i--) {
+ str2 += str.GetAt(i);
+ }
+ return str2;
+}
+void CPDF_TextPageFind::GetRectArray(CFX_RectArray& rects) const
+{
+ rects.Copy(m_resArray);
+}
+int CPDF_TextPageFind::GetCurOrder() const
+{
+ return GetCharIndex(m_resStart);
+}
+int CPDF_TextPageFind::GetMatchedCount()const
+{
+ int resStart = GetCharIndex(m_resStart);
+ int resEnd = GetCharIndex(m_resEnd);
+ return resEnd - resStart + 1;
+}
+CPDF_LinkExtract::CPDF_LinkExtract()
+ : m_pTextPage(NULL),
+ m_IsParserd(FALSE)
+{
+}
+CPDF_LinkExtract::~CPDF_LinkExtract()
+{
+ DeleteLinkList();
+}
+FX_BOOL CPDF_LinkExtract::ExtractLinks(const IPDF_TextPage* pTextPage)
+{
+ if (!pTextPage || !pTextPage->IsParsered()) {
+ return FALSE;
+ }
+ m_pTextPage = (const CPDF_TextPage*)pTextPage;
+ m_strPageText = m_pTextPage->GetPageText(0, -1);
+ DeleteLinkList();
+ if (m_strPageText.IsEmpty()) {
+ return FALSE;
+ }
+ parserLink();
+ m_IsParserd = TRUE;
+ return TRUE;
+}
+void CPDF_LinkExtract::DeleteLinkList()
+{
+ while (m_LinkList.GetSize()) {
+ CPDF_LinkExt* linkinfo = NULL;
+ linkinfo = m_LinkList.GetAt(0);
+ m_LinkList.RemoveAt(0);
+ delete linkinfo;
+ }
+ m_LinkList.RemoveAll();
+}
+int CPDF_LinkExtract::CountLinks() const
+{
+ if (!m_IsParserd) {
+ return -1;
+ }
+ return m_LinkList.GetSize();
+}
+void CPDF_LinkExtract::parserLink()
+{
+ int start = 0, pos = 0;
+ int TotalChar = m_pTextPage->CountChars();
+ while (pos < TotalChar) {
+ FPDF_CHAR_INFO pageChar;
+ m_pTextPage->GetCharInfo(pos, pageChar);
+ if (pageChar.m_Flag == CHAR_GENERATED || pageChar.m_Unicode == 0x20 || pos == TotalChar - 1) {
+ int nCount = pos - start;
+ if(pos == TotalChar - 1) {
+ nCount++;
+ }
+ CFX_WideString strBeCheck;
+ strBeCheck = m_pTextPage->GetPageText(start, nCount);
+ if (strBeCheck.GetLength() > 5) {
+ while(strBeCheck.GetLength() > 0) {
+ FX_WCHAR ch = strBeCheck.GetAt(strBeCheck.GetLength() - 1);
+ if (ch == L')' || ch == L',' || ch == L'>' || ch == L'.') {
+ strBeCheck = strBeCheck.Mid(0, strBeCheck.GetLength() - 1);
+ nCount--;
+ } else {
+ break;
+ }
+ }
+ if (nCount > 5 && (CheckWebLink(strBeCheck) || CheckMailLink(strBeCheck))) {
+ if (!AppendToLinkList(start, nCount, strBeCheck)) {
+ break;
+ }
+ }
+ }
+ start = ++pos;
+ } else {
+ pos++;
+ }
+ }
+}
+FX_BOOL CPDF_LinkExtract::CheckWebLink(CFX_WideString& strBeCheck)
+{
+ CFX_WideString str = strBeCheck;
+ str.MakeLower();
+ if (str.Find(L"http://www.") != -1) {
+ strBeCheck = strBeCheck.Right(str.GetLength() - str.Find(L"http://www."));
+ return TRUE;
+ } else if (str.Find(L"http://") != -1) {
+ strBeCheck = strBeCheck.Right(str.GetLength() - str.Find(L"http://"));
+ return TRUE;
+ } else if (str.Find(L"https://www.") != -1) {
+ strBeCheck = strBeCheck.Right(str.GetLength() - str.Find(L"https://www."));
+ return TRUE;
+ } else if (str.Find(L"https://") != -1) {
+ strBeCheck = strBeCheck.Right(str.GetLength() - str.Find(L"https://"));
+ return TRUE;
+ } else if (str.Find(L"www.") != -1) {
+ strBeCheck = strBeCheck.Right(str.GetLength() - str.Find(L"www."));
+ strBeCheck = L"http://" + strBeCheck;
+ return TRUE;
+ } else {
+ return FALSE;
+ }
+}
+FX_BOOL CPDF_LinkExtract::CheckMailLink(CFX_WideString& str)
+{
+ str.MakeLower();
+ int aPos = str.Find(L'@');
+ if (aPos < 1) {
+ return FALSE;
+ }
+ if (str.GetAt(aPos - 1) == L'.' || str.GetAt(aPos - 1) == L'_') {
+ return FALSE;
+ }
+ int i;
+ for (i = aPos - 1; i >= 0; i--) {
+ FX_WCHAR ch = str.GetAt(i);
+ if (ch == L'_' || ch == L'.' || (ch >= L'a' && ch <= L'z') || (ch >= L'0' && ch <= L'9')) {
+ continue;
+ } else {
+ if (i == aPos - 1) {
+ return FALSE;
+ }
+ str = str.Right(str.GetLength() - i - 1);
+ break;
+ }
+ }
+ aPos = str.Find(L'@');
+ if (aPos < 1) {
+ return FALSE;
+ }
+ CFX_WideString strtemp = L"";
+ for (i = 0; i < aPos; i++) {
+ FX_WCHAR wch = str.GetAt(i);
+ if (wch >= L'a' && wch <= L'z') {
+ break;
+ } else {
+ strtemp = str.Right(str.GetLength() - i + 1);
+ }
+ }
+ if (strtemp != L"") {
+ str = strtemp;
+ }
+ aPos = str.Find(L'@');
+ if (aPos < 1) {
+ return FALSE;
+ }
+ str.TrimRight(L'.');
+ strtemp = str;
+ int ePos = str.Find(L'.');
+ if (ePos == -1) {
+ return FALSE;
+ }
+ while (ePos != -1) {
+ strtemp = strtemp.Right(strtemp.GetLength() - ePos - 1);
+ ePos = strtemp.Find('.');
+ }
+ ePos = strtemp.GetLength();
+ for (i = 0; i < ePos; i++) {
+ FX_WCHAR wch = str.GetAt(i);
+ if ((wch >= L'a' && wch <= L'z') || (wch >= L'0' && wch <= L'9')) {
+ continue;
+ } else {
+ str = str.Left(str.GetLength() - ePos + i + 1);
+ ePos = ePos - i - 1;
+ break;
+ }
+ }
+ int nLen = str.GetLength();
+ for (i = aPos + 1; i < nLen - ePos; i++) {
+ FX_WCHAR wch = str.GetAt(i);
+ if (wch == L'-' || wch == L'.' || (wch >= L'a' && wch <= L'z') || (wch >= L'0' && wch <= L'9')) {
+ continue;
+ } else {
+ return FALSE;
+ }
+ }
+ if (str.Find(L"mailto:") == -1) {
+ str = L"mailto:" + str;
+ }
+ return TRUE;
+}
+FX_BOOL CPDF_LinkExtract::AppendToLinkList(int start, int count, CFX_WideString strUrl)
+{
+ CPDF_LinkExt* linkInfo = NULL;
+ linkInfo = FX_NEW CPDF_LinkExt;
+ if (!linkInfo) {
+ return FALSE;
+ }
+ linkInfo->m_strUrl = strUrl;
+ linkInfo->m_Start = start;
+ linkInfo->m_Count = count;
+ m_LinkList.Add(linkInfo);
+ return TRUE;
+}
+CFX_WideString CPDF_LinkExtract::GetURL(int index) const
+{
+ if (!m_IsParserd || index < 0 || index >= m_LinkList.GetSize()) {
+ return L"";
+ }
+ CPDF_LinkExt* link = NULL;
+ link = m_LinkList.GetAt(index);
+ if (!link) {
+ return L"";
+ }
+ return link->m_strUrl;
+}
+void CPDF_LinkExtract::GetBoundedSegment(int index, int& start, int& count) const
+{
+ if (!m_IsParserd || index < 0 || index >= m_LinkList.GetSize()) {
+ return ;
+ }
+ CPDF_LinkExt* link = NULL;
+ link = m_LinkList.GetAt(index);
+ if (!link) {
+ return ;
+ }
+ start = link->m_Start;
+ count = link->m_Count;
+}
+void CPDF_LinkExtract::GetRects(int index, CFX_RectArray& rects) const
+{
+ if (!m_IsParserd || index < 0 || index >= m_LinkList.GetSize()) {
+ return;
+ }
+ CPDF_LinkExt* link = NULL;
+ link = m_LinkList.GetAt(index);
+ if (!link) {
+ return ;
+ }
+ m_pTextPage->GetRectArray(link->m_Start, link->m_Count, rects);
+}
diff --git a/core/src/fpdftext/fpdf_text_search.cpp b/core/src/fpdftext/fpdf_text_search.cpp
index b029f69048..8c81ad9f66 100644
--- a/core/src/fpdftext/fpdf_text_search.cpp
+++ b/core/src/fpdftext/fpdf_text_search.cpp
@@ -1,325 +1,325 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../include/fpdfapi/fpdf_pageobj.h"
-#include "../../include/fpdftext/fpdf_text.h"
-#include "../../include/fpdfapi/fpdf_page.h"
-class CPDF_TextStream : public CFX_Object
-{
-public:
- CPDF_TextStream(CFX_WideTextBuf& buffer, FX_BOOL bUseLF, CFX_PtrArray* pObjArray);
- ~CPDF_TextStream() {}
- FX_BOOL ProcessObject(const CPDF_TextObject* pObj, FX_BOOL bFirstLine);
- CFX_WideTextBuf& m_Buffer;
- FX_BOOL m_bUseLF;
- CFX_PtrArray* m_pObjArray;
- const CPDF_TextObject* m_pLastObj;
-};
-CPDF_TextStream::CPDF_TextStream(CFX_WideTextBuf& buffer, FX_BOOL bUseLF, CFX_PtrArray* pObjArray) : m_Buffer(buffer)
-{
- m_pLastObj = NULL;
- m_bUseLF = bUseLF;
- m_pObjArray = pObjArray;
-}
-FX_BOOL FPDFText_IsSameTextObject(const CPDF_TextObject* pTextObj1, const CPDF_TextObject* pTextObj2)
-{
- if (!pTextObj1 || !pTextObj2) {
- return FALSE;
- }
- CFX_FloatRect rcPreObj(pTextObj2->m_Left, pTextObj2->m_Bottom, pTextObj2->m_Right, pTextObj2->m_Top);
- CFX_FloatRect rcCurObj(pTextObj1->m_Left, pTextObj1->m_Bottom, pTextObj1->m_Right, pTextObj1->m_Top);
- if (rcPreObj.IsEmpty() && rcCurObj.IsEmpty()) {
- return TRUE;
- }
- if (!rcPreObj.IsEmpty() || !rcCurObj.IsEmpty()) {
- rcPreObj.Intersect(rcCurObj);
- if (rcPreObj.IsEmpty()) {
- return FALSE;
- }
- if (FXSYS_fabs(rcPreObj.Width() - rcCurObj.Width()) > rcCurObj.Width() / 2) {
- return FALSE;
- }
- if (pTextObj2->GetFontSize() != pTextObj1->GetFontSize()) {
- return FALSE;
- }
- }
- int nPreCount = pTextObj2->CountItems();
- int nCurCount = pTextObj1->CountItems();
- if (nPreCount != nCurCount) {
- return FALSE;
- }
- for (int i = 0; i < nPreCount; i++) {
- CPDF_TextObjectItem itemPer, itemCur;
- pTextObj2->GetItemInfo(i, &itemPer);
- pTextObj1->GetItemInfo(i, &itemCur);
- if (itemCur.m_CharCode != itemPer.m_CharCode) {
- return FALSE;
- }
- }
- return TRUE;
-}
-int GetCharWidth(FX_DWORD charCode, CPDF_Font* pFont)
-{
- if(charCode == -1) {
- return 0;
- }
- int w = pFont->GetCharWidthF(charCode);
- if(w == 0) {
- CFX_ByteString str;
- pFont->AppendChar(str, charCode);
- w = pFont->GetStringWidth(str, 1);
- if(w == 0) {
- FX_RECT BBox;
- pFont->GetCharBBox(charCode, BBox);
- w = BBox.right - BBox.left;
- }
- }
- return w;
-}
-int FPDFText_ProcessInterObj(const CPDF_TextObject* pPrevObj, const CPDF_TextObject* pObj)
-{
- if(FPDFText_IsSameTextObject(pPrevObj, pObj)) {
- return -1;
- }
- CPDF_TextObjectItem item;
- int nItem = pPrevObj->CountItems();
- pPrevObj->GetItemInfo(nItem - 1, &item);
- FX_WCHAR preChar = 0, curChar = 0;
- CFX_WideString wstr = pPrevObj->GetFont()->UnicodeFromCharCode(item.m_CharCode);
- if(wstr.GetLength()) {
- preChar = wstr.GetAt(0);
- }
- FX_FLOAT last_pos = item.m_OriginX;
- int nLastWidth = GetCharWidth(item.m_CharCode, pPrevObj->GetFont());
- FX_FLOAT last_width = nLastWidth * pPrevObj->GetFontSize() / 1000;
- last_width = FXSYS_fabs(last_width);
- pObj->GetItemInfo(0, &item);
- wstr = pObj->GetFont()->UnicodeFromCharCode(item.m_CharCode);
- if(wstr.GetLength()) {
- curChar = wstr.GetAt(0);
- }
- int nThisWidth = GetCharWidth(item.m_CharCode, pObj->GetFont());
- FX_FLOAT this_width = nThisWidth * pObj->GetFontSize() / 1000;
- this_width = FXSYS_fabs(this_width);
- FX_FLOAT threshold = last_width > this_width ? last_width / 4 : this_width / 4;
- CFX_AffineMatrix prev_matrix, prev_reverse;
- pPrevObj->GetTextMatrix(&prev_matrix);
- prev_reverse.SetReverse(prev_matrix);
- FX_FLOAT x = pObj->GetPosX(), y = pObj->GetPosY();
- prev_reverse.Transform(x, y);
- if (FXSYS_fabs(y) > threshold * 2) {
- return 2;
- }
- threshold = (FX_FLOAT)(nLastWidth > nThisWidth ? nLastWidth : nThisWidth);
- threshold = threshold > 400 ? (threshold < 700 ? threshold / 4 : threshold / 5) : (threshold / 2);
- threshold *= nLastWidth > nThisWidth ? FXSYS_fabs(pPrevObj->GetFontSize()) : FXSYS_fabs(pObj->GetFontSize());
- threshold /= 1000;
- if (FXSYS_fabs(last_pos + last_width - x) > threshold && curChar != L' ' && preChar != L' ')
- if(curChar != L' ' && preChar != L' ') {
- if((x - last_pos - last_width) > threshold || (last_pos - x - last_width) > threshold) {
- return 1;
- }
- if(x < 0 && (last_pos - x - last_width) > threshold) {
- return 1;
- }
- if((x - last_pos - last_width) > this_width || (x - last_pos - this_width) > last_width ) {
- return 1;
- }
- }
- if(last_pos + last_width > x + this_width && curChar == L' ') {
- return 3;
- }
- return 0;
-}
-FX_BOOL CPDF_TextStream::ProcessObject(const CPDF_TextObject* pObj, FX_BOOL bFirstLine)
-{
- if(pObj->m_Bottom > 380 && pObj->m_Left < 45 && pObj->m_Top < 402) {
- int i = 0;
- }
- CPDF_Font* pFont = pObj->GetFont();
- CFX_AffineMatrix matrix;
- pObj->GetTextMatrix(&matrix);
- FX_FLOAT fs = pObj->GetFontSize();
- int item_index = 0;
- if (m_pLastObj) {
- int result = FPDFText_ProcessInterObj(m_pLastObj, pObj);
- if (result == 2) {
- int len = m_Buffer.GetLength();
- if (len && m_bUseLF && m_Buffer.GetBuffer()[len - 1] == L'-') {
- m_Buffer.Delete(len - 1, 1);
- if (m_pObjArray) {
- m_pObjArray->RemoveAt((len - 1) * 2, 2);
- }
- } else {
- if (bFirstLine) {
- return TRUE;
- }
- if (m_bUseLF) {
- m_Buffer.AppendChar(L'\r');
- m_Buffer.AppendChar(L'\n');
- if (m_pObjArray) {
- for (int i = 0; i < 4; i ++) {
- m_pObjArray->Add(NULL);
- }
- }
- } else {
- m_Buffer.AppendChar(' ');
- if (m_pObjArray) {
- m_pObjArray->Add(NULL);
- m_pObjArray->Add(NULL);
- }
- }
- }
- } else if (result == 1) {
- m_Buffer.AppendChar(L' ');
- if (m_pObjArray) {
- m_pObjArray->Add(NULL);
- m_pObjArray->Add(NULL);
- }
- } else if (result == -1) {
- m_pLastObj = pObj;
- return FALSE;
- } else if (result == 3) {
- item_index = 1;
- }
- }
- m_pLastObj = pObj;
- int nItems = pObj->CountItems();
- FX_FLOAT Ignorekerning = 0;
- for(int i = 1; i < nItems - 1; i += 2) {
- CPDF_TextObjectItem item;
- pObj->GetItemInfo(i, &item);
- if (item.m_CharCode == (FX_DWORD) - 1) {
- if(i == 1) {
- Ignorekerning = item.m_OriginX;
- } else if(Ignorekerning > item.m_OriginX) {
- Ignorekerning = item.m_OriginX;
- }
- } else {
- Ignorekerning = 0;
- break;
- }
- }
- FX_FLOAT spacing = 0;
- for (; item_index < nItems; item_index ++) {
- CPDF_TextObjectItem item;
- pObj->GetItemInfo(item_index, &item);
- if (item.m_CharCode == (FX_DWORD) - 1) {
- CFX_WideString wstr = m_Buffer.GetWideString();
- if (wstr.IsEmpty() || wstr.GetAt(wstr.GetLength() - 1) == L' ') {
- continue;
- }
- FX_FLOAT fontsize_h = pObj->m_TextState.GetFontSizeH();
- spacing = -fontsize_h * (item.m_OriginX - Ignorekerning) / 1000;
- continue;
- }
- FX_FLOAT charSpace = pObj->m_TextState.GetObject()->m_CharSpace;
- if(nItems > 3 && !spacing) {
- charSpace = 0;
- }
- if((spacing || charSpace) && item_index > 0) {
- int last_width = 0;
- FX_FLOAT fontsize_h = pObj->m_TextState.GetFontSizeH();
- FX_DWORD space_charcode = pFont->CharCodeFromUnicode(' ');
- FX_FLOAT threshold = 0;
- if (space_charcode != -1) {
- threshold = fontsize_h * pFont->GetCharWidthF(space_charcode) / 1000 ;
- }
- if(threshold > fontsize_h / 3) {
- threshold = 0;
- } else {
- threshold /= 2;
- }
- if (threshold == 0) {
- threshold = fontsize_h;
- int this_width = FXSYS_abs(GetCharWidth(item.m_CharCode, pFont));
- threshold = this_width > last_width ? (FX_FLOAT)this_width : (FX_FLOAT)last_width;
- int nDivide = 6;
- if (threshold < 300) {
- nDivide = 2;
- } else if (threshold < 500) {
- nDivide = 4;
- } else if (threshold < 700) {
- nDivide = 5;
- }
- threshold = threshold / nDivide;
- threshold = fontsize_h * threshold / 1000;
- }
- if(charSpace > 0.001) {
- spacing += matrix.TransformDistance(charSpace);
- } else if(charSpace < -0.001) {
- spacing -= matrix.TransformDistance(FXSYS_fabs(charSpace));
- }
- if (threshold && (spacing && spacing >= threshold) ) {
- m_Buffer.AppendChar(L' ');
- if (m_pObjArray) {
- m_pObjArray->Add(NULL);
- m_pObjArray->Add(NULL);
- }
- }
- if (item.m_CharCode == (FX_DWORD) - 1) {
- continue;
- }
- spacing = 0;
- }
- CFX_WideString unicode_str = pFont->UnicodeFromCharCode(item.m_CharCode);
- if (unicode_str.IsEmpty()) {
- m_Buffer.AppendChar((FX_WCHAR)item.m_CharCode);
- if (m_pObjArray) {
- m_pObjArray->Add((void*)pObj);
- m_pObjArray->Add((void*)(FX_INTPTR)item_index);
- }
- } else {
- m_Buffer << unicode_str;
- if (m_pObjArray) {
- for (int i = 0; i < unicode_str.GetLength(); i ++) {
- m_pObjArray->Add((void*)pObj);
- m_pObjArray->Add((void*)(FX_INTPTR)item_index);
- }
- }
- }
- }
- return FALSE;
-}
-void _PDF_GetTextStream_Unicode(CFX_WideTextBuf& buffer, CPDF_PageObjects* pPage, FX_BOOL bUseLF,
- CFX_PtrArray* pObjArray)
-{
- CPDF_TextStream textstream(buffer, bUseLF, pObjArray);
- FX_POSITION pos = pPage->GetFirstObjectPosition();
- while (pos) {
- CPDF_PageObject* pObject = pPage->GetNextObject(pos);
- if (pObject == NULL) {
- continue;
- }
- if (pObject->m_Type != PDFPAGE_TEXT) {
- continue;
- }
- textstream.ProcessObject((CPDF_TextObject*)pObject, FALSE);
- }
-}
-CFX_WideString PDF_GetFirstTextLine_Unicode(CPDF_Document* pDoc, CPDF_Dictionary* pPage)
-{
- CFX_WideTextBuf buffer;
- buffer.EstimateSize(0, 1024);
- CPDF_Page page;
- page.Load(pDoc, pPage);
- CPDF_ParseOptions options;
- options.m_bTextOnly = TRUE;
- options.m_bSeparateForm = FALSE;
- page.ParseContent(&options);
- CPDF_TextStream textstream(buffer, FALSE, NULL);
- FX_POSITION pos = page.GetFirstObjectPosition();
- while (pos) {
- CPDF_PageObject* pObject = page.GetNextObject(pos);
- if (pObject->m_Type != PDFPAGE_TEXT) {
- continue;
- }
- if (textstream.ProcessObject((CPDF_TextObject*)pObject, TRUE)) {
- break;
- }
- }
- return buffer.GetWideString();
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fpdfapi/fpdf_pageobj.h"
+#include "../../include/fpdftext/fpdf_text.h"
+#include "../../include/fpdfapi/fpdf_page.h"
+class CPDF_TextStream : public CFX_Object
+{
+public:
+ CPDF_TextStream(CFX_WideTextBuf& buffer, FX_BOOL bUseLF, CFX_PtrArray* pObjArray);
+ ~CPDF_TextStream() {}
+ FX_BOOL ProcessObject(const CPDF_TextObject* pObj, FX_BOOL bFirstLine);
+ CFX_WideTextBuf& m_Buffer;
+ FX_BOOL m_bUseLF;
+ CFX_PtrArray* m_pObjArray;
+ const CPDF_TextObject* m_pLastObj;
+};
+CPDF_TextStream::CPDF_TextStream(CFX_WideTextBuf& buffer, FX_BOOL bUseLF, CFX_PtrArray* pObjArray) : m_Buffer(buffer)
+{
+ m_pLastObj = NULL;
+ m_bUseLF = bUseLF;
+ m_pObjArray = pObjArray;
+}
+FX_BOOL FPDFText_IsSameTextObject(const CPDF_TextObject* pTextObj1, const CPDF_TextObject* pTextObj2)
+{
+ if (!pTextObj1 || !pTextObj2) {
+ return FALSE;
+ }
+ CFX_FloatRect rcPreObj(pTextObj2->m_Left, pTextObj2->m_Bottom, pTextObj2->m_Right, pTextObj2->m_Top);
+ CFX_FloatRect rcCurObj(pTextObj1->m_Left, pTextObj1->m_Bottom, pTextObj1->m_Right, pTextObj1->m_Top);
+ if (rcPreObj.IsEmpty() && rcCurObj.IsEmpty()) {
+ return TRUE;
+ }
+ if (!rcPreObj.IsEmpty() || !rcCurObj.IsEmpty()) {
+ rcPreObj.Intersect(rcCurObj);
+ if (rcPreObj.IsEmpty()) {
+ return FALSE;
+ }
+ if (FXSYS_fabs(rcPreObj.Width() - rcCurObj.Width()) > rcCurObj.Width() / 2) {
+ return FALSE;
+ }
+ if (pTextObj2->GetFontSize() != pTextObj1->GetFontSize()) {
+ return FALSE;
+ }
+ }
+ int nPreCount = pTextObj2->CountItems();
+ int nCurCount = pTextObj1->CountItems();
+ if (nPreCount != nCurCount) {
+ return FALSE;
+ }
+ for (int i = 0; i < nPreCount; i++) {
+ CPDF_TextObjectItem itemPer, itemCur;
+ pTextObj2->GetItemInfo(i, &itemPer);
+ pTextObj1->GetItemInfo(i, &itemCur);
+ if (itemCur.m_CharCode != itemPer.m_CharCode) {
+ return FALSE;
+ }
+ }
+ return TRUE;
+}
+int GetCharWidth(FX_DWORD charCode, CPDF_Font* pFont)
+{
+ if(charCode == -1) {
+ return 0;
+ }
+ int w = pFont->GetCharWidthF(charCode);
+ if(w == 0) {
+ CFX_ByteString str;
+ pFont->AppendChar(str, charCode);
+ w = pFont->GetStringWidth(str, 1);
+ if(w == 0) {
+ FX_RECT BBox;
+ pFont->GetCharBBox(charCode, BBox);
+ w = BBox.right - BBox.left;
+ }
+ }
+ return w;
+}
+int FPDFText_ProcessInterObj(const CPDF_TextObject* pPrevObj, const CPDF_TextObject* pObj)
+{
+ if(FPDFText_IsSameTextObject(pPrevObj, pObj)) {
+ return -1;
+ }
+ CPDF_TextObjectItem item;
+ int nItem = pPrevObj->CountItems();
+ pPrevObj->GetItemInfo(nItem - 1, &item);
+ FX_WCHAR preChar = 0, curChar = 0;
+ CFX_WideString wstr = pPrevObj->GetFont()->UnicodeFromCharCode(item.m_CharCode);
+ if(wstr.GetLength()) {
+ preChar = wstr.GetAt(0);
+ }
+ FX_FLOAT last_pos = item.m_OriginX;
+ int nLastWidth = GetCharWidth(item.m_CharCode, pPrevObj->GetFont());
+ FX_FLOAT last_width = nLastWidth * pPrevObj->GetFontSize() / 1000;
+ last_width = FXSYS_fabs(last_width);
+ pObj->GetItemInfo(0, &item);
+ wstr = pObj->GetFont()->UnicodeFromCharCode(item.m_CharCode);
+ if(wstr.GetLength()) {
+ curChar = wstr.GetAt(0);
+ }
+ int nThisWidth = GetCharWidth(item.m_CharCode, pObj->GetFont());
+ FX_FLOAT this_width = nThisWidth * pObj->GetFontSize() / 1000;
+ this_width = FXSYS_fabs(this_width);
+ FX_FLOAT threshold = last_width > this_width ? last_width / 4 : this_width / 4;
+ CFX_AffineMatrix prev_matrix, prev_reverse;
+ pPrevObj->GetTextMatrix(&prev_matrix);
+ prev_reverse.SetReverse(prev_matrix);
+ FX_FLOAT x = pObj->GetPosX(), y = pObj->GetPosY();
+ prev_reverse.Transform(x, y);
+ if (FXSYS_fabs(y) > threshold * 2) {
+ return 2;
+ }
+ threshold = (FX_FLOAT)(nLastWidth > nThisWidth ? nLastWidth : nThisWidth);
+ threshold = threshold > 400 ? (threshold < 700 ? threshold / 4 : threshold / 5) : (threshold / 2);
+ threshold *= nLastWidth > nThisWidth ? FXSYS_fabs(pPrevObj->GetFontSize()) : FXSYS_fabs(pObj->GetFontSize());
+ threshold /= 1000;
+ if (FXSYS_fabs(last_pos + last_width - x) > threshold && curChar != L' ' && preChar != L' ')
+ if(curChar != L' ' && preChar != L' ') {
+ if((x - last_pos - last_width) > threshold || (last_pos - x - last_width) > threshold) {
+ return 1;
+ }
+ if(x < 0 && (last_pos - x - last_width) > threshold) {
+ return 1;
+ }
+ if((x - last_pos - last_width) > this_width || (x - last_pos - this_width) > last_width ) {
+ return 1;
+ }
+ }
+ if(last_pos + last_width > x + this_width && curChar == L' ') {
+ return 3;
+ }
+ return 0;
+}
+FX_BOOL CPDF_TextStream::ProcessObject(const CPDF_TextObject* pObj, FX_BOOL bFirstLine)
+{
+ if(pObj->m_Bottom > 380 && pObj->m_Left < 45 && pObj->m_Top < 402) {
+ int i = 0;
+ }
+ CPDF_Font* pFont = pObj->GetFont();
+ CFX_AffineMatrix matrix;
+ pObj->GetTextMatrix(&matrix);
+ FX_FLOAT fs = pObj->GetFontSize();
+ int item_index = 0;
+ if (m_pLastObj) {
+ int result = FPDFText_ProcessInterObj(m_pLastObj, pObj);
+ if (result == 2) {
+ int len = m_Buffer.GetLength();
+ if (len && m_bUseLF && m_Buffer.GetBuffer()[len - 1] == L'-') {
+ m_Buffer.Delete(len - 1, 1);
+ if (m_pObjArray) {
+ m_pObjArray->RemoveAt((len - 1) * 2, 2);
+ }
+ } else {
+ if (bFirstLine) {
+ return TRUE;
+ }
+ if (m_bUseLF) {
+ m_Buffer.AppendChar(L'\r');
+ m_Buffer.AppendChar(L'\n');
+ if (m_pObjArray) {
+ for (int i = 0; i < 4; i ++) {
+ m_pObjArray->Add(NULL);
+ }
+ }
+ } else {
+ m_Buffer.AppendChar(' ');
+ if (m_pObjArray) {
+ m_pObjArray->Add(NULL);
+ m_pObjArray->Add(NULL);
+ }
+ }
+ }
+ } else if (result == 1) {
+ m_Buffer.AppendChar(L' ');
+ if (m_pObjArray) {
+ m_pObjArray->Add(NULL);
+ m_pObjArray->Add(NULL);
+ }
+ } else if (result == -1) {
+ m_pLastObj = pObj;
+ return FALSE;
+ } else if (result == 3) {
+ item_index = 1;
+ }
+ }
+ m_pLastObj = pObj;
+ int nItems = pObj->CountItems();
+ FX_FLOAT Ignorekerning = 0;
+ for(int i = 1; i < nItems - 1; i += 2) {
+ CPDF_TextObjectItem item;
+ pObj->GetItemInfo(i, &item);
+ if (item.m_CharCode == (FX_DWORD) - 1) {
+ if(i == 1) {
+ Ignorekerning = item.m_OriginX;
+ } else if(Ignorekerning > item.m_OriginX) {
+ Ignorekerning = item.m_OriginX;
+ }
+ } else {
+ Ignorekerning = 0;
+ break;
+ }
+ }
+ FX_FLOAT spacing = 0;
+ for (; item_index < nItems; item_index ++) {
+ CPDF_TextObjectItem item;
+ pObj->GetItemInfo(item_index, &item);
+ if (item.m_CharCode == (FX_DWORD) - 1) {
+ CFX_WideString wstr = m_Buffer.GetWideString();
+ if (wstr.IsEmpty() || wstr.GetAt(wstr.GetLength() - 1) == L' ') {
+ continue;
+ }
+ FX_FLOAT fontsize_h = pObj->m_TextState.GetFontSizeH();
+ spacing = -fontsize_h * (item.m_OriginX - Ignorekerning) / 1000;
+ continue;
+ }
+ FX_FLOAT charSpace = pObj->m_TextState.GetObject()->m_CharSpace;
+ if(nItems > 3 && !spacing) {
+ charSpace = 0;
+ }
+ if((spacing || charSpace) && item_index > 0) {
+ int last_width = 0;
+ FX_FLOAT fontsize_h = pObj->m_TextState.GetFontSizeH();
+ FX_DWORD space_charcode = pFont->CharCodeFromUnicode(' ');
+ FX_FLOAT threshold = 0;
+ if (space_charcode != -1) {
+ threshold = fontsize_h * pFont->GetCharWidthF(space_charcode) / 1000 ;
+ }
+ if(threshold > fontsize_h / 3) {
+ threshold = 0;
+ } else {
+ threshold /= 2;
+ }
+ if (threshold == 0) {
+ threshold = fontsize_h;
+ int this_width = FXSYS_abs(GetCharWidth(item.m_CharCode, pFont));
+ threshold = this_width > last_width ? (FX_FLOAT)this_width : (FX_FLOAT)last_width;
+ int nDivide = 6;
+ if (threshold < 300) {
+ nDivide = 2;
+ } else if (threshold < 500) {
+ nDivide = 4;
+ } else if (threshold < 700) {
+ nDivide = 5;
+ }
+ threshold = threshold / nDivide;
+ threshold = fontsize_h * threshold / 1000;
+ }
+ if(charSpace > 0.001) {
+ spacing += matrix.TransformDistance(charSpace);
+ } else if(charSpace < -0.001) {
+ spacing -= matrix.TransformDistance(FXSYS_fabs(charSpace));
+ }
+ if (threshold && (spacing && spacing >= threshold) ) {
+ m_Buffer.AppendChar(L' ');
+ if (m_pObjArray) {
+ m_pObjArray->Add(NULL);
+ m_pObjArray->Add(NULL);
+ }
+ }
+ if (item.m_CharCode == (FX_DWORD) - 1) {
+ continue;
+ }
+ spacing = 0;
+ }
+ CFX_WideString unicode_str = pFont->UnicodeFromCharCode(item.m_CharCode);
+ if (unicode_str.IsEmpty()) {
+ m_Buffer.AppendChar((FX_WCHAR)item.m_CharCode);
+ if (m_pObjArray) {
+ m_pObjArray->Add((void*)pObj);
+ m_pObjArray->Add((void*)(FX_INTPTR)item_index);
+ }
+ } else {
+ m_Buffer << unicode_str;
+ if (m_pObjArray) {
+ for (int i = 0; i < unicode_str.GetLength(); i ++) {
+ m_pObjArray->Add((void*)pObj);
+ m_pObjArray->Add((void*)(FX_INTPTR)item_index);
+ }
+ }
+ }
+ }
+ return FALSE;
+}
+void _PDF_GetTextStream_Unicode(CFX_WideTextBuf& buffer, CPDF_PageObjects* pPage, FX_BOOL bUseLF,
+ CFX_PtrArray* pObjArray)
+{
+ CPDF_TextStream textstream(buffer, bUseLF, pObjArray);
+ FX_POSITION pos = pPage->GetFirstObjectPosition();
+ while (pos) {
+ CPDF_PageObject* pObject = pPage->GetNextObject(pos);
+ if (pObject == NULL) {
+ continue;
+ }
+ if (pObject->m_Type != PDFPAGE_TEXT) {
+ continue;
+ }
+ textstream.ProcessObject((CPDF_TextObject*)pObject, FALSE);
+ }
+}
+CFX_WideString PDF_GetFirstTextLine_Unicode(CPDF_Document* pDoc, CPDF_Dictionary* pPage)
+{
+ CFX_WideTextBuf buffer;
+ buffer.EstimateSize(0, 1024);
+ CPDF_Page page;
+ page.Load(pDoc, pPage);
+ CPDF_ParseOptions options;
+ options.m_bTextOnly = TRUE;
+ options.m_bSeparateForm = FALSE;
+ page.ParseContent(&options);
+ CPDF_TextStream textstream(buffer, FALSE, NULL);
+ FX_POSITION pos = page.GetFirstObjectPosition();
+ while (pos) {
+ CPDF_PageObject* pObject = page.GetNextObject(pos);
+ if (pObject->m_Type != PDFPAGE_TEXT) {
+ continue;
+ }
+ if (textstream.ProcessObject((CPDF_TextObject*)pObject, TRUE)) {
+ break;
+ }
+ }
+ return buffer.GetWideString();
+}
diff --git a/core/src/fpdftext/text_int.h b/core/src/fpdftext/text_int.h
index a0af51eb60..39dc721eee 100644
--- a/core/src/fpdftext/text_int.h
+++ b/core/src/fpdftext/text_int.h
@@ -1,215 +1,215 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef _PDF_TEXT_INT_H_
-#define _PDF_TEXT_INT_H_
-class CPDF_TextParseOptions : public CFX_Object
-{
-public:
- CPDF_TextParseOptions();
- FX_BOOL m_bCheckObjectOrder;
- FX_BOOL m_bCheckDirection;
- int m_nCheckSameObject;
-};
-class CPDF_TextPage;
-class CPDF_LinkExtract;
-class CPDF_TextPageFind;
-class CPDF_DocProgressiveSearch;
-#define FPDFTEXT_CHAR_ERROR -1
-#define FPDFTEXT_CHAR_NORMAL 0
-#define FPDFTEXT_CHAR_GENERATED 1
-#define FPDFTEXT_CHAR_UNUNICODE 2
-#define FPDFTEXT_CHAR_HYPHEN 3
-#define FPDFTEXT_CHAR_PIECE 4
-#define FPDFTEXT_MC_PASS 0
-#define FPDFTEXT_MC_DONE 1
-#define FPDFTEXT_MC_DELAY 2
-typedef struct _PAGECHAR_INFO: public CFX_Object {
- int m_CharCode;
- FX_WCHAR m_Unicode;
- FX_FLOAT m_OriginX;
- FX_FLOAT m_OriginY;
- FX_INT32 m_Flag;
- CFX_FloatRect m_CharBox;
- CPDF_TextObject* m_pTextObj;
- CFX_AffineMatrix m_Matrix;
- int m_Index;
-} PAGECHAR_INFO;
-typedef CFX_SegmentedArray<PAGECHAR_INFO> PAGECHAR_InfoArray;
-typedef struct {
- int m_Start;
- int m_nCount;
-} FPDF_SEGMENT;
-typedef CFX_ArrayTemplate<FPDF_SEGMENT> SEGMENT_Array;
-typedef struct {
- CPDF_TextObject* m_pTextObj;
- CFX_AffineMatrix m_formMatrix;
-} PDFTEXT_Obj;
-typedef CFX_ArrayTemplate<PDFTEXT_Obj> LINEOBJ;
-class CPDF_TextPage: public IPDF_TextPage
-{
-public:
- CPDF_TextPage(const CPDF_Page* pPage, int flags = 0);
- CPDF_TextPage(const CPDF_PageObjects* pPage, int flags = 0);
- CPDF_TextPage(const CPDF_Page* pPage, CPDFText_ParseOptions ParserOptions);
- virtual FX_BOOL ParseTextPage();
- virtual void NormalizeObjects(FX_BOOL bNormalize);
- virtual FX_BOOL IsParsered() const
- {
- return m_IsParsered;
- }
- virtual ~CPDF_TextPage() {};
-public:
- virtual int CharIndexFromTextIndex(int TextIndex)const ;
- virtual int TextIndexFromCharIndex(int CharIndex)const;
- virtual int CountChars() const;
- virtual void GetCharInfo(int index, FPDF_CHAR_INFO & info) const;
- virtual void GetRectArray(int start, int nCount, CFX_RectArray& rectArray) const;
- virtual int GetIndexAtPos(CPDF_Point point, FX_FLOAT xTorelance, FX_FLOAT yTorelance) const;
- virtual int GetIndexAtPos(FX_FLOAT x, FX_FLOAT y, FX_FLOAT xTorelance,
- FX_FLOAT yTorelance) const;
- virtual CFX_WideString GetTextByRect(CFX_FloatRect rect) const;
- virtual void GetRectsArrayByRect(CFX_FloatRect rect, CFX_RectArray& resRectArray) const;
- virtual int GetOrderByDirection(int order, int direction) const;
- virtual CFX_WideString GetPageText(int start = 0, int nCount = -1) const;
-
- virtual int CountRects(int start, int nCount);
- virtual void GetRect(int rectIndex, FX_FLOAT& left, FX_FLOAT& top
- , FX_FLOAT& right, FX_FLOAT &bottom) const;
- virtual FX_BOOL GetBaselineRotate(int rectIndex, int& Rotate);
- virtual FX_BOOL GetBaselineRotate(CFX_FloatRect rect, int& Rotate);
- virtual int CountBoundedSegments(FX_FLOAT left, FX_FLOAT top,
- FX_FLOAT right, FX_FLOAT bottom, FX_BOOL bContains = FALSE);
- virtual void GetBoundedSegment(int index, int& start, int& count) const;
- virtual int GetWordBreak(int index, int direction) const;
-public:
- const PAGECHAR_InfoArray* GetCharList() const
- {
- return &m_charList;
- }
- static FX_BOOL IsRectIntersect(CFX_FloatRect rect1, CFX_FloatRect rect2);
- static FX_BOOL IsLetter(FX_WCHAR unicode);
-private:
- FX_BOOL IsHyphen(FX_WCHAR curChar);
- FX_BOOL IsControlChar(PAGECHAR_INFO* pCharInfo);
- FX_BOOL GetBaselineRotate(int start, int end, int& Rotate);
- void ProcessObject();
- void ProcessFormObject(CPDF_FormObject* pFormObj, CFX_AffineMatrix formMatrix);
- void ProcessTextObject(PDFTEXT_Obj pObj);
- void ProcessTextObject(CPDF_TextObject* pTextObj, CFX_AffineMatrix formMatrix, FX_POSITION ObjPos);
- int ProcessInsertObject(const CPDF_TextObject* pObj, CFX_AffineMatrix formMatrix);
- FX_BOOL GenerateCharInfo(FX_WCHAR unicode, PAGECHAR_INFO& info);
- FX_BOOL IsSameAsPreTextObject(CPDF_TextObject* pTextObj, FX_POSITION ObjPos);
- FX_BOOL IsSameTextObject(CPDF_TextObject* pTextObj1, CPDF_TextObject* pTextObj2);
- int GetCharWidth(FX_DWORD charCode, CPDF_Font* pFont) const;
- void CloseTempLine();
- void OnPiece(IFX_BidiChar* pBidi, CFX_WideString& str);
- FX_INT32 PreMarkedContent(PDFTEXT_Obj pObj);
- void ProcessMarkedContent(PDFTEXT_Obj pObj);
- void CheckMarkedContentObject(FX_INT32& start, FX_INT32& nCount) const;
- void FindPreviousTextObject(void);
- void AddCharInfoByLRDirection(CFX_WideString& str, int i);
- void AddCharInfoByRLDirection(CFX_WideString& str, int i);
- FX_INT32 GetTextObjectWritingMode(const CPDF_TextObject* pTextObj);
- FX_INT32 FindTextlineFlowDirection();
-protected:
- CPDFText_ParseOptions m_ParseOptions;
- CFX_WordArray m_CharIndex;
- const CPDF_PageObjects* m_pPage;
- PAGECHAR_InfoArray m_charList;
- CFX_WideTextBuf m_TextBuf;
- PAGECHAR_InfoArray m_TempCharList;
- CFX_WideTextBuf m_TempTextBuf;
- int m_parserflag;
- CPDF_TextObject* m_pPreTextObj;
- CFX_AffineMatrix m_perMatrix;
- FX_BOOL m_IsParsered;
- CFX_AffineMatrix m_DisplayMatrix;
-
- SEGMENT_Array m_Segment;
- CFX_RectArray m_SelRects;
- LINEOBJ m_LineObj;
- FX_BOOL m_TextlineDir;
- CFX_FloatRect m_CurlineRect;
-};
-class CPDF_TextPageFind: public IPDF_TextPageFind
-{
-public:
- CPDF_TextPageFind(const IPDF_TextPage* pTextPage);
- virtual ~CPDF_TextPageFind() {};
-public:
- virtual FX_BOOL FindFirst(CFX_WideString findwhat, int flags, int startPos = 0);
- virtual FX_BOOL FindNext();
- virtual FX_BOOL FindPrev();
-
- virtual void GetRectArray(CFX_RectArray& rects) const;
- virtual int GetCurOrder() const;
- virtual int GetMatchedCount()const;
-protected:
- void ExtractFindWhat(CFX_WideString findwhat);
- FX_BOOL IsMatchWholeWord(CFX_WideString csPageText, int startPos, int endPos);
- FX_BOOL ExtractSubString(CFX_WideString& rString, FX_LPCWSTR lpszFullString,
- int iSubString, FX_WCHAR chSep);
- CFX_WideString MakeReverse(const CFX_WideString str);
- int ReverseFind(CFX_WideString csPageText, CFX_WideString csWord, int nStartPos, int& WordLength);
- int GetCharIndex(int index) const;
-private:
- CFX_WordArray m_CharIndex;
- const IPDF_TextPage* m_pTextPage;
- CFX_WideString m_strText;
- CFX_WideString m_findWhat;
- int m_flags;
- CFX_WideStringArray m_csFindWhatArray;
- int m_findNextStart;
- int m_findPreStart;
- FX_BOOL m_bMatchCase;
- FX_BOOL m_bMatchWholeWord;
- int m_resStart;
- int m_resEnd;
- CFX_RectArray m_resArray;
- FX_BOOL m_IsFind;
-};
-class CPDF_LinkExt: public CFX_Object
-{
-public:
- CPDF_LinkExt() {};
- int m_Start;
- int m_Count;
- CFX_WideString m_strUrl;
- virtual ~CPDF_LinkExt() {};
-};
-typedef CFX_ArrayTemplate<CPDF_LinkExt*> LINK_InfoArray;
-class CPDF_LinkExtract: public IPDF_LinkExtract
-{
-public:
- CPDF_LinkExtract();
- virtual ~CPDF_LinkExtract();
- virtual FX_BOOL ExtractLinks(const IPDF_TextPage* pTextPage);
- virtual FX_BOOL IsExtract() const
- {
- return m_IsParserd;
- }
-public:
- virtual int CountLinks() const;
- virtual CFX_WideString GetURL(int index) const;
- virtual void GetBoundedSegment(int index, int& start, int& count) const;
- virtual void GetRects(int index, CFX_RectArray& rects)const;
-protected:
- void parserLink();
- void DeleteLinkList();
- FX_BOOL CheckWebLink(CFX_WideString& strBeCheck);
- FX_BOOL CheckMailLink(CFX_WideString& str);
- FX_BOOL AppendToLinkList(int start, int count, CFX_WideString strUrl);
-private:
- LINK_InfoArray m_LinkList;
- const CPDF_TextPage* m_pTextPage;
- CFX_WideString m_strPageText;
- FX_BOOL m_IsParserd;
-};
-FX_STRSIZE FX_Unicode_GetNormalization(FX_WCHAR wch, FX_LPWSTR pDst);
-void NormalizeString(CFX_WideString& str);
-void NormalizeCompositeChar(FX_WCHAR wChar, CFX_WideString& sDest);
-#endif
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _PDF_TEXT_INT_H_
+#define _PDF_TEXT_INT_H_
+class CPDF_TextParseOptions : public CFX_Object
+{
+public:
+ CPDF_TextParseOptions();
+ FX_BOOL m_bCheckObjectOrder;
+ FX_BOOL m_bCheckDirection;
+ int m_nCheckSameObject;
+};
+class CPDF_TextPage;
+class CPDF_LinkExtract;
+class CPDF_TextPageFind;
+class CPDF_DocProgressiveSearch;
+#define FPDFTEXT_CHAR_ERROR -1
+#define FPDFTEXT_CHAR_NORMAL 0
+#define FPDFTEXT_CHAR_GENERATED 1
+#define FPDFTEXT_CHAR_UNUNICODE 2
+#define FPDFTEXT_CHAR_HYPHEN 3
+#define FPDFTEXT_CHAR_PIECE 4
+#define FPDFTEXT_MC_PASS 0
+#define FPDFTEXT_MC_DONE 1
+#define FPDFTEXT_MC_DELAY 2
+typedef struct _PAGECHAR_INFO: public CFX_Object {
+ int m_CharCode;
+ FX_WCHAR m_Unicode;
+ FX_FLOAT m_OriginX;
+ FX_FLOAT m_OriginY;
+ FX_INT32 m_Flag;
+ CFX_FloatRect m_CharBox;
+ CPDF_TextObject* m_pTextObj;
+ CFX_AffineMatrix m_Matrix;
+ int m_Index;
+} PAGECHAR_INFO;
+typedef CFX_SegmentedArray<PAGECHAR_INFO> PAGECHAR_InfoArray;
+typedef struct {
+ int m_Start;
+ int m_nCount;
+} FPDF_SEGMENT;
+typedef CFX_ArrayTemplate<FPDF_SEGMENT> SEGMENT_Array;
+typedef struct {
+ CPDF_TextObject* m_pTextObj;
+ CFX_AffineMatrix m_formMatrix;
+} PDFTEXT_Obj;
+typedef CFX_ArrayTemplate<PDFTEXT_Obj> LINEOBJ;
+class CPDF_TextPage: public IPDF_TextPage
+{
+public:
+ CPDF_TextPage(const CPDF_Page* pPage, int flags = 0);
+ CPDF_TextPage(const CPDF_PageObjects* pPage, int flags = 0);
+ CPDF_TextPage(const CPDF_Page* pPage, CPDFText_ParseOptions ParserOptions);
+ virtual FX_BOOL ParseTextPage();
+ virtual void NormalizeObjects(FX_BOOL bNormalize);
+ virtual FX_BOOL IsParsered() const
+ {
+ return m_IsParsered;
+ }
+ virtual ~CPDF_TextPage() {};
+public:
+ virtual int CharIndexFromTextIndex(int TextIndex)const ;
+ virtual int TextIndexFromCharIndex(int CharIndex)const;
+ virtual int CountChars() const;
+ virtual void GetCharInfo(int index, FPDF_CHAR_INFO & info) const;
+ virtual void GetRectArray(int start, int nCount, CFX_RectArray& rectArray) const;
+ virtual int GetIndexAtPos(CPDF_Point point, FX_FLOAT xTorelance, FX_FLOAT yTorelance) const;
+ virtual int GetIndexAtPos(FX_FLOAT x, FX_FLOAT y, FX_FLOAT xTorelance,
+ FX_FLOAT yTorelance) const;
+ virtual CFX_WideString GetTextByRect(CFX_FloatRect rect) const;
+ virtual void GetRectsArrayByRect(CFX_FloatRect rect, CFX_RectArray& resRectArray) const;
+ virtual int GetOrderByDirection(int order, int direction) const;
+ virtual CFX_WideString GetPageText(int start = 0, int nCount = -1) const;
+
+ virtual int CountRects(int start, int nCount);
+ virtual void GetRect(int rectIndex, FX_FLOAT& left, FX_FLOAT& top
+ , FX_FLOAT& right, FX_FLOAT &bottom) const;
+ virtual FX_BOOL GetBaselineRotate(int rectIndex, int& Rotate);
+ virtual FX_BOOL GetBaselineRotate(CFX_FloatRect rect, int& Rotate);
+ virtual int CountBoundedSegments(FX_FLOAT left, FX_FLOAT top,
+ FX_FLOAT right, FX_FLOAT bottom, FX_BOOL bContains = FALSE);
+ virtual void GetBoundedSegment(int index, int& start, int& count) const;
+ virtual int GetWordBreak(int index, int direction) const;
+public:
+ const PAGECHAR_InfoArray* GetCharList() const
+ {
+ return &m_charList;
+ }
+ static FX_BOOL IsRectIntersect(CFX_FloatRect rect1, CFX_FloatRect rect2);
+ static FX_BOOL IsLetter(FX_WCHAR unicode);
+private:
+ FX_BOOL IsHyphen(FX_WCHAR curChar);
+ FX_BOOL IsControlChar(PAGECHAR_INFO* pCharInfo);
+ FX_BOOL GetBaselineRotate(int start, int end, int& Rotate);
+ void ProcessObject();
+ void ProcessFormObject(CPDF_FormObject* pFormObj, CFX_AffineMatrix formMatrix);
+ void ProcessTextObject(PDFTEXT_Obj pObj);
+ void ProcessTextObject(CPDF_TextObject* pTextObj, CFX_AffineMatrix formMatrix, FX_POSITION ObjPos);
+ int ProcessInsertObject(const CPDF_TextObject* pObj, CFX_AffineMatrix formMatrix);
+ FX_BOOL GenerateCharInfo(FX_WCHAR unicode, PAGECHAR_INFO& info);
+ FX_BOOL IsSameAsPreTextObject(CPDF_TextObject* pTextObj, FX_POSITION ObjPos);
+ FX_BOOL IsSameTextObject(CPDF_TextObject* pTextObj1, CPDF_TextObject* pTextObj2);
+ int GetCharWidth(FX_DWORD charCode, CPDF_Font* pFont) const;
+ void CloseTempLine();
+ void OnPiece(IFX_BidiChar* pBidi, CFX_WideString& str);
+ FX_INT32 PreMarkedContent(PDFTEXT_Obj pObj);
+ void ProcessMarkedContent(PDFTEXT_Obj pObj);
+ void CheckMarkedContentObject(FX_INT32& start, FX_INT32& nCount) const;
+ void FindPreviousTextObject(void);
+ void AddCharInfoByLRDirection(CFX_WideString& str, int i);
+ void AddCharInfoByRLDirection(CFX_WideString& str, int i);
+ FX_INT32 GetTextObjectWritingMode(const CPDF_TextObject* pTextObj);
+ FX_INT32 FindTextlineFlowDirection();
+protected:
+ CPDFText_ParseOptions m_ParseOptions;
+ CFX_WordArray m_CharIndex;
+ const CPDF_PageObjects* m_pPage;
+ PAGECHAR_InfoArray m_charList;
+ CFX_WideTextBuf m_TextBuf;
+ PAGECHAR_InfoArray m_TempCharList;
+ CFX_WideTextBuf m_TempTextBuf;
+ int m_parserflag;
+ CPDF_TextObject* m_pPreTextObj;
+ CFX_AffineMatrix m_perMatrix;
+ FX_BOOL m_IsParsered;
+ CFX_AffineMatrix m_DisplayMatrix;
+
+ SEGMENT_Array m_Segment;
+ CFX_RectArray m_SelRects;
+ LINEOBJ m_LineObj;
+ FX_BOOL m_TextlineDir;
+ CFX_FloatRect m_CurlineRect;
+};
+class CPDF_TextPageFind: public IPDF_TextPageFind
+{
+public:
+ CPDF_TextPageFind(const IPDF_TextPage* pTextPage);
+ virtual ~CPDF_TextPageFind() {};
+public:
+ virtual FX_BOOL FindFirst(CFX_WideString findwhat, int flags, int startPos = 0);
+ virtual FX_BOOL FindNext();
+ virtual FX_BOOL FindPrev();
+
+ virtual void GetRectArray(CFX_RectArray& rects) const;
+ virtual int GetCurOrder() const;
+ virtual int GetMatchedCount()const;
+protected:
+ void ExtractFindWhat(CFX_WideString findwhat);
+ FX_BOOL IsMatchWholeWord(CFX_WideString csPageText, int startPos, int endPos);
+ FX_BOOL ExtractSubString(CFX_WideString& rString, FX_LPCWSTR lpszFullString,
+ int iSubString, FX_WCHAR chSep);
+ CFX_WideString MakeReverse(const CFX_WideString str);
+ int ReverseFind(CFX_WideString csPageText, CFX_WideString csWord, int nStartPos, int& WordLength);
+ int GetCharIndex(int index) const;
+private:
+ CFX_WordArray m_CharIndex;
+ const IPDF_TextPage* m_pTextPage;
+ CFX_WideString m_strText;
+ CFX_WideString m_findWhat;
+ int m_flags;
+ CFX_WideStringArray m_csFindWhatArray;
+ int m_findNextStart;
+ int m_findPreStart;
+ FX_BOOL m_bMatchCase;
+ FX_BOOL m_bMatchWholeWord;
+ int m_resStart;
+ int m_resEnd;
+ CFX_RectArray m_resArray;
+ FX_BOOL m_IsFind;
+};
+class CPDF_LinkExt: public CFX_Object
+{
+public:
+ CPDF_LinkExt() {};
+ int m_Start;
+ int m_Count;
+ CFX_WideString m_strUrl;
+ virtual ~CPDF_LinkExt() {};
+};
+typedef CFX_ArrayTemplate<CPDF_LinkExt*> LINK_InfoArray;
+class CPDF_LinkExtract: public IPDF_LinkExtract
+{
+public:
+ CPDF_LinkExtract();
+ virtual ~CPDF_LinkExtract();
+ virtual FX_BOOL ExtractLinks(const IPDF_TextPage* pTextPage);
+ virtual FX_BOOL IsExtract() const
+ {
+ return m_IsParserd;
+ }
+public:
+ virtual int CountLinks() const;
+ virtual CFX_WideString GetURL(int index) const;
+ virtual void GetBoundedSegment(int index, int& start, int& count) const;
+ virtual void GetRects(int index, CFX_RectArray& rects)const;
+protected:
+ void parserLink();
+ void DeleteLinkList();
+ FX_BOOL CheckWebLink(CFX_WideString& strBeCheck);
+ FX_BOOL CheckMailLink(CFX_WideString& str);
+ FX_BOOL AppendToLinkList(int start, int count, CFX_WideString strUrl);
+private:
+ LINK_InfoArray m_LinkList;
+ const CPDF_TextPage* m_pTextPage;
+ CFX_WideString m_strPageText;
+ FX_BOOL m_IsParserd;
+};
+FX_STRSIZE FX_Unicode_GetNormalization(FX_WCHAR wch, FX_LPWSTR pDst);
+void NormalizeString(CFX_WideString& str);
+void NormalizeCompositeChar(FX_WCHAR wChar, CFX_WideString& sDest);
+#endif
diff --git a/core/src/fpdftext/txtproc.h b/core/src/fpdftext/txtproc.h
index 3ec850d9db..5a88ee52f9 100644
--- a/core/src/fpdftext/txtproc.h
+++ b/core/src/fpdftext/txtproc.h
@@ -1,70 +1,70 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef _PDF_TXTPROC_H_
-#define _PDF_TXTPROC_H_
-class CTextColumn : public CFX_Object
-{
-public:
- FX_FLOAT m_AvgPos;
- int m_Count;
- int m_TextPos;
-};
-class CTextBox : public CFX_Object
-{
-public:
- CFX_WideString m_Text;
- FX_FLOAT m_Left;
- FX_FLOAT m_Right;
- FX_FLOAT m_SpaceWidth;
- FX_FLOAT m_Top;
- FX_FLOAT m_Bottom;
- FX_FLOAT m_FontSizeV;
- CTextColumn* m_pColumn;
-};
-class CTextBaseLine : public CFX_Object
-{
-public:
- CTextBaseLine();
- ~CTextBaseLine();
- void InsertTextBox(FX_FLOAT leftx, FX_FLOAT rightx, FX_FLOAT topy, FX_FLOAT bottomy,
- FX_FLOAT spacew, FX_FLOAT fontsize_v, const CFX_WideString& str);
- FX_BOOL GetWidth(FX_FLOAT& leftx, FX_FLOAT& rightx);
- FX_BOOL CanMerge(CTextBaseLine* pOther);
- void Merge(CTextBaseLine* pOther);
- void MergeBoxes();
- void CountChars(int& count, FX_FLOAT& width, int& minchars);
- void WriteOutput(CFX_WideString& str, FX_FLOAT leftx, FX_FLOAT width, int iWidth);
- FX_FLOAT m_BaseLine;
- FX_FLOAT m_Top;
- FX_FLOAT m_Bottom;
- FX_FLOAT m_MaxFontSizeV;
- CFX_PtrArray m_TextList;
-};
-class CPDF_PageObject;
-class CPDF_TextObject;
-class CTextPage : public CFX_Object
-{
-public:
- CTextPage();
- ~CTextPage();
- void ProcessObject(CPDF_PageObject* pObj);
- CTextBaseLine* InsertTextBox(CTextBaseLine* pBaseLine, FX_FLOAT basey, FX_FLOAT leftx,
- FX_FLOAT rightx, FX_FLOAT topy, FX_FLOAT bottomy, FX_FLOAT spacew, FX_FLOAT fontsize_v,
- CFX_ByteString& str, CPDF_Font* pFont);
- void WriteOutput(CFX_WideStringArray& lines, int iMinWidth);
- FX_BOOL m_bAutoWidth;
- FX_BOOL m_bKeepColumn;
- FX_BOOL m_bBreakSpace;
- FX_BOOL m_bOCR;
-private:
- CFX_PtrArray m_BaseLines;
- CFX_PtrArray m_TextColumns;
- void FindColumns();
- CTextColumn* FindColumn(FX_FLOAT xpos);
- void BreakSpace(CPDF_TextObject* pTextObj);
-};
-#endif
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _PDF_TXTPROC_H_
+#define _PDF_TXTPROC_H_
+class CTextColumn : public CFX_Object
+{
+public:
+ FX_FLOAT m_AvgPos;
+ int m_Count;
+ int m_TextPos;
+};
+class CTextBox : public CFX_Object
+{
+public:
+ CFX_WideString m_Text;
+ FX_FLOAT m_Left;
+ FX_FLOAT m_Right;
+ FX_FLOAT m_SpaceWidth;
+ FX_FLOAT m_Top;
+ FX_FLOAT m_Bottom;
+ FX_FLOAT m_FontSizeV;
+ CTextColumn* m_pColumn;
+};
+class CTextBaseLine : public CFX_Object
+{
+public:
+ CTextBaseLine();
+ ~CTextBaseLine();
+ void InsertTextBox(FX_FLOAT leftx, FX_FLOAT rightx, FX_FLOAT topy, FX_FLOAT bottomy,
+ FX_FLOAT spacew, FX_FLOAT fontsize_v, const CFX_WideString& str);
+ FX_BOOL GetWidth(FX_FLOAT& leftx, FX_FLOAT& rightx);
+ FX_BOOL CanMerge(CTextBaseLine* pOther);
+ void Merge(CTextBaseLine* pOther);
+ void MergeBoxes();
+ void CountChars(int& count, FX_FLOAT& width, int& minchars);
+ void WriteOutput(CFX_WideString& str, FX_FLOAT leftx, FX_FLOAT width, int iWidth);
+ FX_FLOAT m_BaseLine;
+ FX_FLOAT m_Top;
+ FX_FLOAT m_Bottom;
+ FX_FLOAT m_MaxFontSizeV;
+ CFX_PtrArray m_TextList;
+};
+class CPDF_PageObject;
+class CPDF_TextObject;
+class CTextPage : public CFX_Object
+{
+public:
+ CTextPage();
+ ~CTextPage();
+ void ProcessObject(CPDF_PageObject* pObj);
+ CTextBaseLine* InsertTextBox(CTextBaseLine* pBaseLine, FX_FLOAT basey, FX_FLOAT leftx,
+ FX_FLOAT rightx, FX_FLOAT topy, FX_FLOAT bottomy, FX_FLOAT spacew, FX_FLOAT fontsize_v,
+ CFX_ByteString& str, CPDF_Font* pFont);
+ void WriteOutput(CFX_WideStringArray& lines, int iMinWidth);
+ FX_BOOL m_bAutoWidth;
+ FX_BOOL m_bKeepColumn;
+ FX_BOOL m_bBreakSpace;
+ FX_BOOL m_bOCR;
+private:
+ CFX_PtrArray m_BaseLines;
+ CFX_PtrArray m_TextColumns;
+ void FindColumns();
+ CTextColumn* FindColumn(FX_FLOAT xpos);
+ void BreakSpace(CPDF_TextObject* pTextObj);
+};
+#endif
diff --git a/core/src/fpdftext/unicodenormalization.cpp b/core/src/fpdftext/unicodenormalization.cpp
index b92787b952..1d36b8576a 100644
--- a/core/src/fpdftext/unicodenormalization.cpp
+++ b/core/src/fpdftext/unicodenormalization.cpp
@@ -1,75 +1,75 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../include/fpdftext/fpdf_text.h"
-extern const FX_WCHAR g_UnicodeData_Normalization[65536];
-extern const FX_WCHAR g_UnicodeData_Normalization_Map1[5376];
-extern const FX_WCHAR g_UnicodeData_Normalization_Map2[1734];
-extern const FX_WCHAR g_UnicodeData_Normalization_Map3[1164];
-extern const FX_WCHAR g_UnicodeData_Normalization_Map4[488];
-FX_LPCWSTR g_UnicodeData_Normalization_Maps[5] = {
- NULL,
- g_UnicodeData_Normalization_Map1,
- g_UnicodeData_Normalization_Map2,
- g_UnicodeData_Normalization_Map3,
- g_UnicodeData_Normalization_Map4
-};
-FX_STRSIZE FX_Unicode_GetNormalization(FX_WCHAR wch, FX_LPWSTR pDst)
-{
- wch = wch & 0xFFFF;
- FX_WCHAR wFind = g_UnicodeData_Normalization[wch];
- if (!wFind) {
- if (pDst) {
- *pDst = wch;
- }
- return 1;
- }
- if(wFind >= 0x8000) {
- wch = wFind - 0x8000;
- wFind = 1;
- } else {
- wch = wFind & 0x0FFF;
- wFind >>= 12;
- }
- FX_LPCWSTR pMap = g_UnicodeData_Normalization_Maps[wFind];
- if (pMap == g_UnicodeData_Normalization_Map4) {
- pMap = g_UnicodeData_Normalization_Map4 + wch;
- wFind = (FX_WCHAR)(*pMap ++);
- } else {
- pMap += wch;
- }
- if (pDst) {
- FX_WCHAR n = wFind;
- while (n --) {
- *pDst ++ = *pMap ++;
- }
- }
- return (FX_STRSIZE)wFind;
-}
-FX_STRSIZE FX_WideString_GetNormalization(FX_WSTR wsSrc, FX_LPWSTR pDst)
-{
- FX_STRSIZE nCount = 0;
- for (FX_STRSIZE len = 0; len < wsSrc.GetLength(); len ++) {
- FX_WCHAR wch = wsSrc.GetAt(len);
- if(pDst) {
- nCount += FX_Unicode_GetNormalization(wch, pDst + nCount);
- } else {
- nCount += FX_Unicode_GetNormalization(wch, pDst);
- }
- }
- return nCount;
-}
-FX_STRSIZE FX_WideString_GetNormalization(FX_WSTR wsSrc, CFX_WideString &wsDst)
-{
- FX_STRSIZE nLen = FX_WideString_GetNormalization(wsSrc, (FX_LPWSTR)NULL);
- if (!nLen) {
- return 0;
- }
- FX_LPWSTR pBuf = wsDst.GetBuffer(nLen);
- FX_WideString_GetNormalization(wsSrc, pBuf);
- wsDst.ReleaseBuffer(nLen);
- return nLen;
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fpdftext/fpdf_text.h"
+extern const FX_WCHAR g_UnicodeData_Normalization[65536];
+extern const FX_WCHAR g_UnicodeData_Normalization_Map1[5376];
+extern const FX_WCHAR g_UnicodeData_Normalization_Map2[1734];
+extern const FX_WCHAR g_UnicodeData_Normalization_Map3[1164];
+extern const FX_WCHAR g_UnicodeData_Normalization_Map4[488];
+FX_LPCWSTR g_UnicodeData_Normalization_Maps[5] = {
+ NULL,
+ g_UnicodeData_Normalization_Map1,
+ g_UnicodeData_Normalization_Map2,
+ g_UnicodeData_Normalization_Map3,
+ g_UnicodeData_Normalization_Map4
+};
+FX_STRSIZE FX_Unicode_GetNormalization(FX_WCHAR wch, FX_LPWSTR pDst)
+{
+ wch = wch & 0xFFFF;
+ FX_WCHAR wFind = g_UnicodeData_Normalization[wch];
+ if (!wFind) {
+ if (pDst) {
+ *pDst = wch;
+ }
+ return 1;
+ }
+ if(wFind >= 0x8000) {
+ wch = wFind - 0x8000;
+ wFind = 1;
+ } else {
+ wch = wFind & 0x0FFF;
+ wFind >>= 12;
+ }
+ FX_LPCWSTR pMap = g_UnicodeData_Normalization_Maps[wFind];
+ if (pMap == g_UnicodeData_Normalization_Map4) {
+ pMap = g_UnicodeData_Normalization_Map4 + wch;
+ wFind = (FX_WCHAR)(*pMap ++);
+ } else {
+ pMap += wch;
+ }
+ if (pDst) {
+ FX_WCHAR n = wFind;
+ while (n --) {
+ *pDst ++ = *pMap ++;
+ }
+ }
+ return (FX_STRSIZE)wFind;
+}
+FX_STRSIZE FX_WideString_GetNormalization(FX_WSTR wsSrc, FX_LPWSTR pDst)
+{
+ FX_STRSIZE nCount = 0;
+ for (FX_STRSIZE len = 0; len < wsSrc.GetLength(); len ++) {
+ FX_WCHAR wch = wsSrc.GetAt(len);
+ if(pDst) {
+ nCount += FX_Unicode_GetNormalization(wch, pDst + nCount);
+ } else {
+ nCount += FX_Unicode_GetNormalization(wch, pDst);
+ }
+ }
+ return nCount;
+}
+FX_STRSIZE FX_WideString_GetNormalization(FX_WSTR wsSrc, CFX_WideString &wsDst)
+{
+ FX_STRSIZE nLen = FX_WideString_GetNormalization(wsSrc, (FX_LPWSTR)NULL);
+ if (!nLen) {
+ return 0;
+ }
+ FX_LPWSTR pBuf = wsDst.GetBuffer(nLen);
+ FX_WideString_GetNormalization(wsSrc, pBuf);
+ wsDst.ReleaseBuffer(nLen);
+ return nLen;
+}
diff --git a/core/src/fpdftext/unicodenormalizationdata.cpp b/core/src/fpdftext/unicodenormalizationdata.cpp
index 750382b010..37ccdc94ae 100644
--- a/core/src/fpdftext/unicodenormalizationdata.cpp
+++ b/core/src/fpdftext/unicodenormalizationdata.cpp
@@ -1,4661 +1,4661 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../include/fxcrt/fx_system.h"
-extern const FX_WCHAR g_UnicodeData_Normalization[65536] = {
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8001, 0x0000, 0x2000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2002, 0x8002, 0x0000, 0x2004, 0x0000, 0x0000, 0x8003,
- 0x8004, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8005, 0x0000, 0x8006, 0x0000, 0x0000, 0x0000, 0x8007, 0x8008,
- 0x0000, 0x0000, 0x8009, 0x800A, 0x800B, 0x800C, 0x0000, 0x0000, 0x800D, 0x800E, 0x800F, 0x0000, 0x3000, 0x3003, 0x3006, 0x0000,
- 0x8010, 0x8011, 0x8012, 0x8013, 0x8014, 0x8015, 0x0000, 0x8016, 0x8017, 0x8018, 0x8019, 0x801A, 0x801B, 0x801C, 0x801D, 0x801E,
- 0x801F, 0x8020, 0x8021, 0x8022, 0x8023, 0x8024, 0x8025, 0x0000, 0x8026, 0x8027, 0x8028, 0x8029, 0x802A, 0x802B, 0x0000, 0x0000,
- 0x802C, 0x802D, 0x802E, 0x802F, 0x8030, 0x8031, 0x0000, 0x8032, 0x8033, 0x8034, 0x8035, 0x8036, 0x8037, 0x8038, 0x8039, 0x803A,
- 0x0000, 0x803B, 0x803C, 0x803D, 0x803E, 0x803F, 0x8040, 0x0000, 0x8041, 0x8042, 0x8043, 0x8044, 0x8045, 0x8046, 0x0000, 0x8047,
- 0x8048, 0x8049, 0x804A, 0x804B, 0x804C, 0x804D, 0x804E, 0x804F, 0x8050, 0x8051, 0x8052, 0x8053, 0x8054, 0x8055, 0x8056, 0x8057,
- 0x8058, 0x8059, 0x805A, 0x805B, 0x805C, 0x805D, 0x805E, 0x805F, 0x8060, 0x8061, 0x8062, 0x8063, 0x8064, 0x8065, 0x8066, 0x8067,
- 0x8068, 0x8069, 0x806A, 0x806B, 0x806C, 0x806D, 0x806E, 0x806F, 0x8070, 0x8071, 0x8072, 0x8073, 0x8074, 0x8075, 0x8076, 0x8077,
- 0x8078, 0x0000, 0x2006, 0x2008, 0x8079, 0x807A, 0x807B, 0x807C, 0x807D, 0x807E, 0x807F, 0x8080, 0x8081, 0x8082, 0x8083, 0x8084,
- 0x8085, 0x8086, 0x8087, 0x8088, 0x8089, 0x808A, 0x808B, 0x808C, 0x808D, 0x808E, 0x0000, 0x0000, 0x808F, 0x8090, 0x8091, 0x8092,
- 0x8093, 0x8094, 0x200A, 0x200C, 0x8095, 0x8096, 0x8097, 0x8098, 0x8099, 0x809A, 0x809B, 0x809C, 0x809D, 0x809E, 0x809F, 0x80A0,
- 0x80A1, 0x80A2, 0x80A3, 0x80A4, 0x80A5, 0x80A6, 0x80A7, 0x80A8, 0x80A9, 0x80AA, 0x80AB, 0x80AC, 0x80AD, 0x80AE, 0x80AF, 0x80B0,
- 0x80B1, 0x80B2, 0x80B3, 0x80B4, 0x80B5, 0x80B6, 0x80B7, 0x80B8, 0x80B9, 0x80BA, 0x80BB, 0x80BC, 0x80BD, 0x80BE, 0x80BF, 0x80C0,
- 0x80C1, 0x80C2, 0x80C3, 0x80C4, 0x0000, 0x0000, 0x0000, 0x80C5, 0x80C6, 0x80C7, 0x80C8, 0x80C9, 0x80CA, 0x0000, 0x80CB, 0x0000,
- 0x80CC, 0x80CD, 0x80CE, 0x80CF, 0x0000, 0x0000, 0x0000, 0x80D0, 0x80D1, 0x80D2, 0x80D3, 0x0000, 0x80D4, 0x80D5, 0x80D6, 0x80D7,
- 0x80D8, 0x80D9, 0x0000, 0x0000, 0x80DA, 0x80DB, 0x0000, 0x0000, 0x0000, 0x0000, 0x80DC, 0x80DD, 0x80DE, 0x80DF, 0x80E0, 0x80E1,
- 0x80E2, 0x0000, 0x80E3, 0x80E4, 0x80E5, 0x80E6, 0x80E7, 0x0000, 0x80E8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x200E, 0x2010, 0x2012, 0x2014, 0x2016, 0x2018, 0x201A, 0x201C, 0x201E, 0x80E9, 0x80EA, 0x80EB,
- 0x80EC, 0x80ED, 0x80EE, 0x80EF, 0x80F0, 0x80F1, 0x80F2, 0x80F3, 0x80F4, 0x80F5, 0x80F6, 0x80F7, 0x80F8, 0x80F9, 0x80FA, 0x80FB,
- 0x80FC, 0x80FD, 0x80FE, 0x80FF, 0x8100, 0x8101, 0x8102, 0x8103, 0x8104, 0x8105, 0x8106, 0x8107, 0x8108, 0x8109, 0x810A, 0x810B,
- 0x810C, 0x2020, 0x2022, 0x2024, 0x810D, 0x810E, 0x0000, 0x0000, 0x810F, 0x8110, 0x8111, 0x8112, 0x8113, 0x8114, 0x8115, 0x8116,
- 0x8117, 0x8118, 0x8119, 0x811A, 0x811B, 0x811C, 0x811D, 0x811E, 0x811F, 0x8120, 0x8121, 0x8122, 0x8123, 0x8124, 0x8125, 0x8126,
- 0x8127, 0x8128, 0x8129, 0x812A, 0x812B, 0x812C, 0x812D, 0x812E, 0x812F, 0x8130, 0x8131, 0x8132, 0x0000, 0x0000, 0x8133, 0x8134,
- 0x8135, 0x8136, 0x0000, 0x0000, 0x8137, 0x8138, 0x8139, 0x813A, 0x813B, 0x813C, 0x813D, 0x813E, 0x813F, 0x8140, 0x8141, 0x8142,
- 0x8143, 0x8144, 0x8145, 0x8146, 0x8147, 0x8148, 0x8149, 0x814A, 0x2026, 0x2028, 0x814B, 0x814C, 0x814D, 0x814E, 0x814F, 0x8150,
- 0x8151, 0x0000, 0x0000, 0x8152, 0x8153, 0x8154, 0x8155, 0x8156, 0x8157, 0x8158, 0x8159, 0x815A, 0x815B, 0x815C, 0x815D, 0x815E,
- 0x815F, 0x0000, 0x8160, 0x8161, 0x8162, 0x8163, 0x8164, 0x8165, 0x8166, 0x0000, 0x8167, 0x8168, 0x8169, 0x816A, 0x816B, 0x816C,
- 0x816D, 0x816E, 0x816F, 0x0000, 0x0000, 0x8170, 0x8171, 0x0000, 0x8172, 0x0000, 0x8173, 0x8174, 0x8175, 0x8176, 0x0000, 0x8177,
- 0x8178, 0x8179, 0x817A, 0x817B, 0x817C, 0x817D, 0x202A, 0x0000, 0x0000, 0x817E, 0x817F, 0x8180, 0x8181, 0x8182, 0x8183, 0x8184,
- 0x8185, 0x8186, 0x8187, 0x0000, 0x8188, 0x8189, 0x818A, 0x818B, 0x818C, 0x818D, 0x0000, 0x818E, 0x818F, 0x8190, 0x8191, 0x8192,
- 0x8193, 0x8194, 0x0000, 0x8195, 0x0000, 0x0000, 0x0000, 0x8196, 0x0000, 0x8197, 0x8198, 0x8199, 0x819A, 0x819B, 0x819C, 0x819D,
- 0x819E, 0x0000, 0x0000, 0x202C, 0x202E, 0x2030, 0x2032, 0x2034, 0x2036, 0x2038, 0x203A, 0x203C, 0x0000, 0x0000, 0x819F, 0x81A0,
- 0x81A1, 0x81A2, 0x81A3, 0x81A4, 0x81A5, 0x81A6, 0x81A7, 0x81A8, 0x81A9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x81AA, 0x81AB, 0x81AC, 0x81AD, 0x81AE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x81AF, 0x81B0, 0x0000, 0x81B1, 0x81B2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x81B3, 0x81B4, 0x81B5, 0x81B6, 0x81B7, 0x81B8, 0x81B9, 0x81BA, 0x81BB, 0x81BC, 0x81BD, 0x81BE, 0x81BF,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x81C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x81C1, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x81C2, 0x81C3, 0x81C4, 0x81C5, 0x81C6, 0x81C7, 0x81C8, 0x0000, 0x81C9, 0x0000, 0x81CA, 0x81CB,
- 0x81CC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x81CD, 0x81CE, 0x81CF, 0x81D0, 0x81D1, 0x81D2,
- 0x81D3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x81D4, 0x81D5, 0x81D6, 0x81D7, 0x81D8, 0x0000,
- 0x81D9, 0x81DA, 0x81DB, 0x81DC, 0x81DD, 0x81DE, 0x81DF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x81E0, 0x81E1, 0x81E2, 0x0000, 0x81E3, 0x81E4, 0x0000, 0x0000, 0x0000, 0x81E5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x81E6, 0x81E7, 0x0000, 0x81E8, 0x0000, 0x0000, 0x0000, 0x81E9, 0x0000, 0x0000, 0x0000, 0x0000, 0x81EA, 0x81EB, 0x81EC, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x81ED, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x81EE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x81EF, 0x81F0, 0x0000, 0x81F1, 0x0000, 0x0000, 0x0000, 0x81F2, 0x0000, 0x0000, 0x0000, 0x0000, 0x81F3, 0x81F4, 0x81F5, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x81F6, 0x81F7, 0x0000, 0x0000, 0x81F8, 0x81F9, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x81FA, 0x81FB, 0x0000, 0x0000, 0x0000, 0x0000, 0x81FC, 0x81FD, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x81FE, 0x81FF, 0x0000, 0x0000, 0x8200, 0x8201,
- 0x8202, 0x8203, 0x8204, 0x8205, 0x8206, 0x8207, 0x8208, 0x8209, 0x820A, 0x820B, 0x820C, 0x820D, 0x820E, 0x820F, 0x8210, 0x8211,
- 0x8212, 0x8213, 0x8214, 0x8215, 0x203E, 0x2040, 0x8216, 0x8217, 0x0000, 0x0000, 0x8218, 0x8219, 0x821A, 0x821B, 0x0000, 0x0000,
- 0x821C, 0x821D, 0x821E, 0x821F, 0x2042, 0x2044, 0x8220, 0x8221, 0x8222, 0x8223, 0x0000, 0x0000, 0x8224, 0x8225, 0x8226, 0x8227,
- 0x0000, 0x8228, 0x8229, 0x822A, 0x822B, 0x822C, 0x822D, 0x822E, 0x822F, 0x8230, 0x8231, 0x0000, 0x0000, 0x8232, 0x8233, 0x0000,
- 0x8234, 0x8235, 0x8236, 0x8237, 0x2046, 0x2048, 0x8238, 0x8239, 0x0000, 0x0000, 0x823A, 0x823B, 0x823C, 0x823D, 0x823E, 0x823F,
- 0x0000, 0x0000, 0x8240, 0x8241, 0x8242, 0x8243, 0x8244, 0x8245, 0x0000, 0x0000, 0x8246, 0x8247, 0x8248, 0x8249, 0x824A, 0x824B,
- 0x824C, 0x824D, 0x824E, 0x824F, 0x8250, 0x8251, 0x8252, 0x8253, 0x8254, 0x8255, 0x8256, 0x8257, 0x8258, 0x8259, 0x825A, 0x825B,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x825C, 0x825D, 0x825E, 0x825F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x204A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x204C, 0x204E, 0x2050, 0x2052, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x2054, 0x0000, 0x2056, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x2058, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x205A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x205C, 0x0000, 0x0000, 0x205E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2060, 0x2062, 0x2064, 0x2066, 0x2068, 0x206A, 0x206C, 0x206E,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2070, 0x2072, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2074, 0x2076, 0x0000, 0x2078,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x207A, 0x0000, 0x0000, 0x207C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x207E, 0x2080, 0x2082, 0x0000, 0x0000, 0x2084, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2086, 0x0000, 0x0000, 0x2088, 0x208A, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x208C, 0x208E, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x2090, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2092, 0x2094, 0x2096, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2098, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x209A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x209C, 0x209E, 0x0000, 0x20A0, 0x20A2, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20A4, 0x20A6, 0x20A8, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20AA, 0x0000, 0x20AC, 0x20AE, 0x20B0, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x20B2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x20B4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20B6, 0x20B8, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8260, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x20BA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20BC, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x20BE, 0x0000, 0x0000, 0x0000, 0x0000, 0x20C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x20C2, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20C4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x20C6, 0x0000, 0x20C8, 0x20CA, 0x20CC, 0x20CE, 0x20D0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x20D2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x20D4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20D6, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x20D8, 0x0000, 0x0000, 0x0000, 0x0000, 0x20DA, 0x0000, 0x0000, 0x0000, 0x0000, 0x20DC, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20DE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8261, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20E2, 0x0000, 0x20E4, 0x0000, 0x20E6, 0x0000, 0x20E8, 0x0000, 0x20EA, 0x0000,
- 0x0000, 0x0000, 0x20EC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20EE, 0x0000, 0x20F0, 0x0000, 0x0000,
- 0x20F2, 0x20F4, 0x0000, 0x20F6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8262, 0x8263, 0x8264, 0x8265,
- 0x8266, 0x8267, 0x8268, 0x8269, 0x826A, 0x826B, 0x826C, 0x826D, 0x826E, 0x826F, 0x8270, 0x0000, 0x8271, 0x8272, 0x8273, 0x8274,
- 0x8275, 0x8276, 0x8277, 0x8278, 0x8279, 0x827A, 0x827B, 0x827C, 0x827D, 0x827E, 0x827F, 0x8280, 0x8281, 0x8282, 0x0000, 0x8283,
- 0x8284, 0x8285, 0x8286, 0x8287, 0x8288, 0x8289, 0x828A, 0x828B, 0x828C, 0x828D, 0x828E, 0x828F, 0x8290, 0x8291, 0x8292, 0x8293,
- 0x8294, 0x8295, 0x8296, 0x8297, 0x8298, 0x8299, 0x829A, 0x829B, 0x829C, 0x829D, 0x829E, 0x0000, 0x829F, 0x82A0, 0x82A1, 0x82A2,
- 0x82A3, 0x82A4, 0x82A5, 0x82A6, 0x82A7, 0x82A8, 0x82A9, 0x82AA, 0x82AB, 0x0000, 0x20F8, 0x82AC, 0x0000, 0x82AD, 0x82AE, 0x82AF,
- 0x82B0, 0x82B1, 0x82B2, 0x82B3, 0x82B4, 0x82B5, 0x82B6, 0x82B7, 0x82B8, 0x82B9, 0x82BA, 0x82BB, 0x82BC, 0x82BD, 0x82BE, 0x82BF,
- 0x82C0, 0x82C1, 0x82C2, 0x82C3, 0x82C4, 0x82C5, 0x82C6, 0x0000, 0x82C7, 0x0000, 0x0000, 0x82C8, 0x82C9, 0x82CA, 0x82CB, 0x82CC,
- 0x82CD, 0x82CE, 0x82CF, 0x82D0, 0x82D1, 0x82D2, 0x82D3, 0x82D4, 0x82D5, 0x82D6, 0x82D7, 0x82D8, 0x82D9, 0x82DA, 0x82DB, 0x82DC,
- 0x82DD, 0x82DE, 0x82DF, 0x82E0, 0x82E1, 0x82E2, 0x82E3, 0x82E4, 0x82E5, 0x82E6, 0x82E7, 0x82E8, 0x82E9, 0x82EA, 0x82EB, 0x82EC,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x82ED, 0x82EE, 0x82EF, 0x82F0, 0x82F1, 0x82F2, 0x82F3, 0x82F4, 0x82F5, 0x82F6, 0x82F7, 0x82F8, 0x82F9, 0x82FA, 0x82FB, 0x82FC,
- 0x82FD, 0x82FE, 0x82FF, 0x8300, 0x8301, 0x8302, 0x8303, 0x8304, 0x8305, 0x8306, 0x8307, 0x8308, 0x8309, 0x830A, 0x830B, 0x830C,
- 0x830D, 0x830E, 0x830F, 0x8310, 0x8311, 0x8312, 0x8313, 0x8314, 0x8315, 0x8316, 0x8317, 0x8318, 0x8319, 0x831A, 0x831B, 0x831C,
- 0x831D, 0x831E, 0x831F, 0x8320, 0x8321, 0x8322, 0x8323, 0x8324, 0x8325, 0x8326, 0x8327, 0x8328, 0x8329, 0x832A, 0x832B, 0x832C,
- 0x832D, 0x832E, 0x832F, 0x8330, 0x8331, 0x8332, 0x8333, 0x8334, 0x8335, 0x8336, 0x8337, 0x8338, 0x8339, 0x833A, 0x833B, 0x833C,
- 0x833D, 0x833E, 0x833F, 0x8340, 0x8341, 0x8342, 0x8343, 0x8344, 0x8345, 0x8346, 0x8347, 0x8348, 0x8349, 0x834A, 0x834B, 0x834C,
- 0x834D, 0x834E, 0x834F, 0x8350, 0x8351, 0x8352, 0x8353, 0x8354, 0x8355, 0x8356, 0x8357, 0x8358, 0x8359, 0x835A, 0x835B, 0x835C,
- 0x835D, 0x835E, 0x835F, 0x8360, 0x8361, 0x8362, 0x8363, 0x8364, 0x8365, 0x8366, 0x8367, 0x8368, 0x8369, 0x836A, 0x836B, 0x836C,
- 0x836D, 0x836E, 0x836F, 0x8370, 0x8371, 0x8372, 0x8373, 0x8374, 0x8375, 0x8376, 0x8377, 0x8378, 0x8379, 0x837A, 0x837B, 0x837C,
- 0x837D, 0x837E, 0x837F, 0x8380, 0x8381, 0x8382, 0x8383, 0x8384, 0x8385, 0x8386, 0x8387, 0x8388, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x8389, 0x838A, 0x838B, 0x838C, 0x838D, 0x838E, 0x838F, 0x8390, 0x8391, 0x8392, 0x8393, 0x8394, 0x8395, 0x8396, 0x8397, 0x8398,
- 0x8399, 0x839A, 0x839B, 0x839C, 0x839D, 0x839E, 0x839F, 0x83A0, 0x83A1, 0x83A2, 0x83A3, 0x83A4, 0x83A5, 0x83A6, 0x83A7, 0x83A8,
- 0x83A9, 0x83AA, 0x83AB, 0x83AC, 0x83AD, 0x83AE, 0x83AF, 0x83B0, 0x83B1, 0x83B2, 0x83B3, 0x83B4, 0x83B5, 0x83B6, 0x83B7, 0x83B8,
- 0x83B9, 0x83BA, 0x83BB, 0x83BC, 0x83BD, 0x83BE, 0x83BF, 0x83C0, 0x83C1, 0x83C2, 0x83C3, 0x83C4, 0x83C5, 0x83C6, 0x83C7, 0x83C8,
- 0x83C9, 0x83CA, 0x83CB, 0x83CC, 0x83CD, 0x83CE, 0x83CF, 0x83D0, 0x83D1, 0x83D2, 0x83D3, 0x83D4, 0x83D5, 0x83D6, 0x83D7, 0x83D8,
- 0x83D9, 0x83DA, 0x83DB, 0x83DC, 0x83DD, 0x83DE, 0x83DF, 0x83E0, 0x83E1, 0x83E2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x83E3, 0x83E4, 0x83E5, 0x83E6, 0x83E7, 0x83E8, 0x83E9, 0x83EA, 0x83EB, 0x83EC, 0x83ED, 0x83EE, 0x83EF, 0x83F0, 0x83F1, 0x83F2,
- 0x83F3, 0x83F4, 0x83F5, 0x83F6, 0x83F7, 0x83F8, 0x0000, 0x0000, 0x83F9, 0x83FA, 0x83FB, 0x83FC, 0x83FD, 0x83FE, 0x0000, 0x0000,
- 0x83FF, 0x8400, 0x8401, 0x8402, 0x8403, 0x8404, 0x8405, 0x8406, 0x8407, 0x8408, 0x8409, 0x840A, 0x840B, 0x840C, 0x840D, 0x840E,
- 0x840F, 0x8410, 0x8411, 0x8412, 0x8413, 0x8414, 0x8415, 0x8416, 0x8417, 0x8418, 0x8419, 0x841A, 0x841B, 0x841C, 0x841D, 0x841E,
- 0x841F, 0x8420, 0x8421, 0x8422, 0x8423, 0x8424, 0x0000, 0x0000, 0x8425, 0x8426, 0x8427, 0x8428, 0x8429, 0x842A, 0x0000, 0x0000,
- 0x842B, 0x842C, 0x842D, 0x842E, 0x842F, 0x8430, 0x8431, 0x8432, 0x0000, 0x8433, 0x0000, 0x8434, 0x0000, 0x8435, 0x0000, 0x8436,
- 0x8437, 0x8438, 0x8439, 0x843A, 0x843B, 0x843C, 0x843D, 0x843E, 0x843F, 0x8440, 0x8441, 0x8442, 0x8443, 0x8444, 0x8445, 0x8446,
- 0x8447, 0x8448, 0x8449, 0x844A, 0x844B, 0x844C, 0x844D, 0x844E, 0x844F, 0x8450, 0x8451, 0x8452, 0x8453, 0x8454, 0x0000, 0x0000,
- 0x8455, 0x8456, 0x8457, 0x8458, 0x8459, 0x845A, 0x845B, 0x845C, 0x845D, 0x845E, 0x845F, 0x8460, 0x8461, 0x8462, 0x8463, 0x8464,
- 0x8465, 0x8466, 0x8467, 0x8468, 0x8469, 0x846A, 0x846B, 0x846C, 0x846D, 0x846E, 0x846F, 0x8470, 0x8471, 0x8472, 0x8473, 0x8474,
- 0x8475, 0x8476, 0x8477, 0x8478, 0x8479, 0x847A, 0x847B, 0x847C, 0x847D, 0x847E, 0x847F, 0x8480, 0x8481, 0x8482, 0x8483, 0x8484,
- 0x8485, 0x8486, 0x8487, 0x8488, 0x8489, 0x0000, 0x848A, 0x848B, 0x848C, 0x848D, 0x848E, 0x848F, 0x8490, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x8491, 0x8492, 0x8493, 0x0000, 0x8494, 0x8495, 0x8496, 0x8497, 0x8498, 0x8499, 0x849A, 0x0000, 0x0000, 0x0000,
- 0x849B, 0x849C, 0x849D, 0x849E, 0x0000, 0x0000, 0x849F, 0x84A0, 0x84A1, 0x84A2, 0x84A3, 0x84A4, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x84A5, 0x84A6, 0x84A7, 0x84A8, 0x84A9, 0x84AA, 0x84AB, 0x84AC, 0x84AD, 0x84AE, 0x84AF, 0x84B0, 0x84B1, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x84B2, 0x84B3, 0x84B4, 0x0000, 0x84B5, 0x84B6, 0x84B7, 0x84B8, 0x84B9, 0x84BA, 0x84BB, 0x84BC, 0x84BD, 0x0000,
- 0x84BE, 0x84BF, 0x84C0, 0x84C1, 0x84C2, 0x84C3, 0x84C4, 0x84C5, 0x84C6, 0x84C7, 0x84C8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x84C9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x84CA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x84CB, 0x20FA, 0x3009, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x84CC,
- 0x0000, 0x0000, 0x0000, 0x20FC, 0x300C, 0x0000, 0x20FE, 0x300F, 0x0000, 0x0000, 0x0000, 0x0000, 0x2100, 0x0000, 0x2102, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2104, 0x2106, 0x2108, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x84CD,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x84CE, 0x84CF, 0x0000, 0x0000, 0x84D0, 0x84D1, 0x84D2, 0x84D3, 0x84D4, 0x84D5, 0x84D6, 0x84D7, 0x84D8, 0x84D9, 0x84DA, 0x84DB,
- 0x84DC, 0x84DD, 0x84DE, 0x84DF, 0x84E0, 0x84E1, 0x84E2, 0x84E3, 0x84E4, 0x84E5, 0x84E6, 0x84E7, 0x84E8, 0x84E9, 0x84EA, 0x0000,
- 0x84EB, 0x84EC, 0x84ED, 0x84EE, 0x84EF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x210A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x3012, 0x3015, 0x84F0, 0x210C, 0x0000, 0x3018, 0x301B, 0x84F1, 0x0000, 0x210E, 0x84F2, 0x84F3, 0x84F4, 0x84F5, 0x84F6, 0x84F7,
- 0x84F8, 0x84F9, 0x84FA, 0x84FB, 0x0000, 0x84FC, 0x2110, 0x0000, 0x0000, 0x84FD, 0x84FE, 0x84FF, 0x8500, 0x8501, 0x8502, 0x8503,
- 0x2112, 0x301E, 0x2114, 0x8504, 0x8505, 0x0000, 0x8506, 0x8507, 0x8508, 0x0000, 0x8509, 0x850A, 0x850B, 0x850C, 0x850D, 0x850E,
- 0x850F, 0x8510, 0x0000, 0x8511, 0x8512, 0x8513, 0x8514, 0x8515, 0x8516, 0x8517, 0x0000, 0x3021, 0x8518, 0x8519, 0x851A, 0x851B,
- 0x851C, 0x0000, 0x0000, 0x0000, 0x0000, 0x851D, 0x851E, 0x851F, 0x8520, 0x8521, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x3024, 0x3027, 0x4005, 0x302A, 0x302D, 0x3030, 0x3033, 0x3036, 0x3039, 0x303C, 0x303F, 0x3042, 0x3045, 0x3048, 0x304B, 0x2116,
- 0x8522, 0x2118, 0x304E, 0x211A, 0x8523, 0x211C, 0x3051, 0x400A, 0x211E, 0x8524, 0x2120, 0x3054, 0x8525, 0x8526, 0x8527, 0x8528,
- 0x8529, 0x2122, 0x3057, 0x2124, 0x852A, 0x2126, 0x305A, 0x400F, 0x2128, 0x852B, 0x212A, 0x305D, 0x852C, 0x852D, 0x852E, 0x852F,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3060, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x212C, 0x212E, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2130, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2132, 0x2134, 0x2136,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x8530, 0x0000, 0x0000, 0x0000, 0x0000, 0x8531, 0x0000, 0x0000, 0x8532, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x2138, 0x0000, 0x213A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x213C, 0x3063, 0x0000, 0x213E,
- 0x3066, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x2140, 0x0000, 0x0000, 0x2142, 0x0000, 0x0000, 0x2144, 0x0000, 0x2146, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x2148, 0x0000, 0x214A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x214C, 0x214E, 0x2150,
- 0x2152, 0x2154, 0x0000, 0x0000, 0x2156, 0x2158, 0x0000, 0x0000, 0x215A, 0x215C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x215E, 0x2160, 0x0000, 0x0000, 0x2162, 0x2164, 0x0000, 0x0000, 0x2166, 0x2168, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x216A, 0x216C, 0x216E, 0x2170,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x2172, 0x2174, 0x2176, 0x2178, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x217A, 0x217C, 0x217E, 0x2180, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8533, 0x8534, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x3069, 0x306C, 0x306F, 0x3072, 0x3075, 0x3078, 0x307B, 0x307E, 0x2182, 0x2184, 0x2186, 0x2188, 0x218A, 0x218C, 0x218E, 0x2190,
- 0x3081, 0x3084, 0x3087, 0x308A, 0x308D, 0x3090, 0x3093, 0x3096, 0x3099, 0x2192, 0x309C, 0x309F, 0x2194, 0x2196, 0x2198, 0x219A,
- 0x219C, 0x30A2, 0x8535, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x8536, 0x8537, 0x8538, 0x8539, 0x853A, 0x853B, 0x853C, 0x853D, 0x853E, 0x219E, 0x21A0, 0x21A2, 0x21A4, 0x21A6, 0x21A8, 0x21AA,
- 0x21AC, 0x21AE, 0x21B0, 0x21B2, 0x30A5, 0x30A8, 0x30AB, 0x30AE, 0x30B1, 0x30B4, 0x30B7, 0x30BA, 0x30BD, 0x4014, 0x4019, 0x401E,
- 0x4023, 0x4028, 0x402D, 0x4032, 0x4037, 0x403C, 0x4041, 0x4046, 0x21B4, 0x21B6, 0x21B8, 0x21BA, 0x21BC, 0x21BE, 0x21C0, 0x21C2,
- 0x21C4, 0x30C0, 0x30C3, 0x30C6, 0x30C9, 0x30CC, 0x30CF, 0x30D2, 0x30D5, 0x30D8, 0x30DB, 0x30DE, 0x30E1, 0x30E4, 0x30E7, 0x30EA,
- 0x30ED, 0x30F0, 0x30F3, 0x30F6, 0x30F9, 0x30FC, 0x30FF, 0x3102, 0x3105, 0x3108, 0x310B, 0x310E, 0x3111, 0x3114, 0x3117, 0x311A,
- 0x311D, 0x3120, 0x3123, 0x3126, 0x3129, 0x312C, 0x853F, 0x8540, 0x8541, 0x8542, 0x8543, 0x8544, 0x8545, 0x8546, 0x8547, 0x8548,
- 0x8549, 0x854A, 0x854B, 0x854C, 0x854D, 0x854E, 0x854F, 0x8550, 0x8551, 0x8552, 0x8553, 0x8554, 0x8555, 0x8556, 0x8557, 0x8558,
- 0x8559, 0x855A, 0x855B, 0x855C, 0x855D, 0x855E, 0x855F, 0x8560, 0x8561, 0x8562, 0x8563, 0x8564, 0x8565, 0x8566, 0x8567, 0x8568,
- 0x8569, 0x856A, 0x856B, 0x856C, 0x856D, 0x856E, 0x856F, 0x8570, 0x8571, 0x8572, 0x8573, 0x21C6, 0x21C8, 0x21CA, 0x21CC, 0x21CE,
- 0x21D0, 0x21D2, 0x21D4, 0x21D6, 0x21D8, 0x8574, 0x8575, 0x8576, 0x8577, 0x8578, 0x8579, 0x857A, 0x857B, 0x857C, 0x21DA, 0x857D,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x857E, 0x857F, 0x8580, 0x8581, 0x8582, 0x8583, 0x8584, 0x8585, 0x8586, 0x21DC,
- 0x8587, 0x8588, 0x8589, 0x858A, 0x858B, 0x858C, 0x858D, 0x858E, 0x858F, 0x21DE, 0x8590, 0x8591, 0x8592, 0x8593, 0x8594, 0x8595,
- 0x8596, 0x8597, 0x8598, 0x21E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x404B, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x312F, 0x21E2, 0x3132, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x21E4, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x8599, 0x859A, 0x859B, 0x859C, 0x859D, 0x859E, 0x859F, 0x85A0, 0x85A1, 0x85A2, 0x85A3, 0x85A4, 0x85A5, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x85A6, 0x85A7, 0x85A8, 0x85A9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x85AA, 0x85AB, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x85AC,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x85AD,
- 0x85AE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x85AF, 0x0000, 0x0000, 0x85B0, 0x0000, 0x85B1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x85B2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x85B3, 0x0000, 0x0000, 0x0000, 0x0000, 0x85B4, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x85B5, 0x85B6, 0x0000, 0x0000, 0x0000, 0x85B7, 0x85B8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x85B9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x85BA, 0x85BB, 0x85BC, 0x85BD, 0x85BE, 0x85BF, 0x85C0, 0x85C1, 0x85C2, 0x85C3, 0x85C4, 0x85C5, 0x85C6, 0x85C7, 0x85C8, 0x85C9,
- 0x85CA, 0x85CB, 0x85CC, 0x85CD, 0x85CE, 0x85CF, 0x85D0, 0x85D1, 0x85D2, 0x85D3, 0x85D4, 0x85D5, 0x85D6, 0x85D7, 0x85D8, 0x85D9,
- 0x85DA, 0x85DB, 0x85DC, 0x85DD, 0x85DE, 0x85DF, 0x85E0, 0x85E1, 0x85E2, 0x85E3, 0x85E4, 0x85E5, 0x85E6, 0x85E7, 0x85E8, 0x85E9,
- 0x85EA, 0x85EB, 0x85EC, 0x85ED, 0x85EE, 0x85EF, 0x85F0, 0x85F1, 0x85F2, 0x85F3, 0x85F4, 0x85F5, 0x85F6, 0x85F7, 0x85F8, 0x85F9,
- 0x85FA, 0x85FB, 0x85FC, 0x85FD, 0x85FE, 0x85FF, 0x8600, 0x8601, 0x8602, 0x8603, 0x8604, 0x8605, 0x8606, 0x8607, 0x8608, 0x8609,
- 0x860A, 0x860B, 0x860C, 0x860D, 0x860E, 0x860F, 0x8610, 0x8611, 0x8612, 0x8613, 0x8614, 0x8615, 0x8616, 0x8617, 0x8618, 0x8619,
- 0x861A, 0x861B, 0x861C, 0x861D, 0x861E, 0x861F, 0x8620, 0x8621, 0x8622, 0x8623, 0x8624, 0x8625, 0x8626, 0x8627, 0x8628, 0x8629,
- 0x862A, 0x862B, 0x862C, 0x862D, 0x862E, 0x862F, 0x8630, 0x8631, 0x8632, 0x8633, 0x8634, 0x8635, 0x8636, 0x8637, 0x8638, 0x8639,
- 0x863A, 0x863B, 0x863C, 0x863D, 0x863E, 0x863F, 0x8640, 0x8641, 0x8642, 0x8643, 0x8644, 0x8645, 0x8646, 0x8647, 0x8648, 0x8649,
- 0x864A, 0x864B, 0x864C, 0x864D, 0x864E, 0x864F, 0x8650, 0x8651, 0x8652, 0x8653, 0x8654, 0x8655, 0x8656, 0x8657, 0x8658, 0x8659,
- 0x865A, 0x865B, 0x865C, 0x865D, 0x865E, 0x865F, 0x8660, 0x8661, 0x8662, 0x8663, 0x8664, 0x8665, 0x8666, 0x8667, 0x8668, 0x8669,
- 0x866A, 0x866B, 0x866C, 0x866D, 0x866E, 0x866F, 0x8670, 0x8671, 0x8672, 0x8673, 0x8674, 0x8675, 0x8676, 0x8677, 0x8678, 0x8679,
- 0x867A, 0x867B, 0x867C, 0x867D, 0x867E, 0x867F, 0x8680, 0x8681, 0x8682, 0x8683, 0x8684, 0x8685, 0x8686, 0x8687, 0x8688, 0x8689,
- 0x868A, 0x868B, 0x868C, 0x868D, 0x868E, 0x868F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x8690, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8691, 0x0000, 0x8692, 0x8693, 0x8694, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x21E6, 0x0000, 0x21E8, 0x0000,
- 0x21EA, 0x0000, 0x21EC, 0x0000, 0x21EE, 0x0000, 0x21F0, 0x0000, 0x21F2, 0x0000, 0x21F4, 0x0000, 0x21F6, 0x0000, 0x21F8, 0x0000,
- 0x21FA, 0x0000, 0x21FC, 0x0000, 0x0000, 0x21FE, 0x0000, 0x2200, 0x0000, 0x2202, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x2204, 0x2206, 0x0000, 0x2208, 0x220A, 0x0000, 0x220C, 0x220E, 0x0000, 0x2210, 0x2212, 0x0000, 0x2214, 0x2216, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x2218, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x221A, 0x221C, 0x0000, 0x221E, 0x2220,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2222, 0x0000, 0x2224, 0x0000,
- 0x2226, 0x0000, 0x2228, 0x0000, 0x222A, 0x0000, 0x222C, 0x0000, 0x222E, 0x0000, 0x2230, 0x0000, 0x2232, 0x0000, 0x2234, 0x0000,
- 0x2236, 0x0000, 0x2238, 0x0000, 0x0000, 0x223A, 0x0000, 0x223C, 0x0000, 0x223E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x2240, 0x2242, 0x0000, 0x2244, 0x2246, 0x0000, 0x2248, 0x224A, 0x0000, 0x224C, 0x224E, 0x0000, 0x2250, 0x2252, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x2254, 0x0000, 0x0000, 0x2256, 0x2258, 0x225A, 0x225C, 0x0000, 0x0000, 0x0000, 0x225E, 0x2260,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x8695, 0x8696, 0x8697, 0x8698, 0x8699, 0x869A, 0x869B, 0x869C, 0x869D, 0x869E, 0x869F, 0x86A0, 0x86A1, 0x86A2, 0x86A3,
- 0x86A4, 0x86A5, 0x86A6, 0x86A7, 0x86A8, 0x86A9, 0x86AA, 0x86AB, 0x86AC, 0x86AD, 0x86AE, 0x86AF, 0x86B0, 0x86B1, 0x86B2, 0x86B3,
- 0x86B4, 0x86B5, 0x86B6, 0x86B7, 0x86B8, 0x86B9, 0x86BA, 0x86BB, 0x86BC, 0x86BD, 0x86BE, 0x86BF, 0x86C0, 0x86C1, 0x86C2, 0x86C3,
- 0x86C4, 0x86C5, 0x86C6, 0x86C7, 0x86C8, 0x86C9, 0x86CA, 0x86CB, 0x86CC, 0x86CD, 0x86CE, 0x86CF, 0x86D0, 0x86D1, 0x86D2, 0x86D3,
- 0x86D4, 0x86D5, 0x86D6, 0x86D7, 0x86D8, 0x86D9, 0x86DA, 0x86DB, 0x86DC, 0x86DD, 0x86DE, 0x86DF, 0x86E0, 0x86E1, 0x86E2, 0x86E3,
- 0x86E4, 0x86E5, 0x86E6, 0x86E7, 0x86E8, 0x86E9, 0x86EA, 0x86EB, 0x86EC, 0x86ED, 0x86EE, 0x86EF, 0x86F0, 0x86F1, 0x86F2, 0x0000,
- 0x0000, 0x0000, 0x86F3, 0x86F4, 0x86F5, 0x86F6, 0x86F7, 0x86F8, 0x86F9, 0x86FA, 0x86FB, 0x86FC, 0x86FD, 0x86FE, 0x86FF, 0x8700,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x3135, 0x3138, 0x313B, 0x313E, 0x3141, 0x3144, 0x3147, 0x314A, 0x314D, 0x3150, 0x3153, 0x3156, 0x3159, 0x315C, 0x4050, 0x4055,
- 0x405A, 0x405F, 0x4064, 0x4069, 0x406E, 0x4073, 0x4078, 0x407D, 0x4082, 0x4087, 0x408C, 0x4091, 0x4096, 0x409B, 0x40A3, 0x0000,
- 0x315F, 0x3162, 0x3165, 0x3168, 0x316B, 0x316E, 0x3171, 0x3174, 0x3177, 0x317A, 0x317D, 0x3180, 0x3183, 0x3186, 0x3189, 0x318C,
- 0x318F, 0x3192, 0x3195, 0x3198, 0x319B, 0x319E, 0x31A1, 0x31A4, 0x31A7, 0x31AA, 0x31AD, 0x31B0, 0x31B3, 0x31B6, 0x31B9, 0x31BC,
- 0x31BF, 0x31C2, 0x31C5, 0x31C8, 0x8701, 0x8702, 0x8703, 0x8704, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x31CB, 0x2262, 0x2264, 0x2266, 0x2268, 0x226A, 0x226C, 0x226E, 0x2270, 0x2272, 0x2274, 0x2276, 0x2278, 0x227A, 0x227C, 0x227E,
- 0x8705, 0x8706, 0x8707, 0x8708, 0x8709, 0x870A, 0x870B, 0x870C, 0x870D, 0x870E, 0x870F, 0x8710, 0x8711, 0x8712, 0x2280, 0x2282,
- 0x2284, 0x2286, 0x2288, 0x228A, 0x228C, 0x228E, 0x2290, 0x2292, 0x2294, 0x2296, 0x2298, 0x229A, 0x40AA, 0x40B0, 0x229C, 0x0000,
- 0x8713, 0x8714, 0x8715, 0x8716, 0x8717, 0x8718, 0x8719, 0x871A, 0x871B, 0x871C, 0x871D, 0x871E, 0x871F, 0x8720, 0x8721, 0x8722,
- 0x8723, 0x8724, 0x8725, 0x8726, 0x8727, 0x8728, 0x8729, 0x872A, 0x872B, 0x872C, 0x872D, 0x872E, 0x872F, 0x8730, 0x8731, 0x8732,
- 0x8733, 0x8734, 0x8735, 0x8736, 0x8737, 0x8738, 0x8739, 0x873A, 0x873B, 0x873C, 0x873D, 0x873E, 0x873F, 0x8740, 0x8741, 0x8742,
- 0x8743, 0x229E, 0x22A0, 0x22A2, 0x22A4, 0x22A6, 0x22A8, 0x22AA, 0x22AC, 0x22AE, 0x22B0, 0x22B2, 0x22B4, 0x22B6, 0x22B8, 0x22BA,
- 0x22BC, 0x22BE, 0x22C0, 0x22C2, 0x22C4, 0x22C6, 0x22C8, 0x22CA, 0x22CC, 0x31CE, 0x31D1, 0x31D4, 0x22CE, 0x31D7, 0x22D0, 0x31DA,
- 0x8744, 0x8745, 0x8746, 0x8747, 0x8748, 0x8749, 0x874A, 0x874B, 0x874C, 0x874D, 0x874E, 0x874F, 0x8750, 0x8751, 0x8752, 0x8753,
- 0x8754, 0x8755, 0x8756, 0x8757, 0x8758, 0x8759, 0x875A, 0x875B, 0x875C, 0x875D, 0x875E, 0x875F, 0x8760, 0x8761, 0x8762, 0x8763,
- 0x8764, 0x8765, 0x8766, 0x8767, 0x8768, 0x8769, 0x876A, 0x876B, 0x876C, 0x876D, 0x876E, 0x876F, 0x8770, 0x8771, 0x8772, 0x0000,
- 0x40B5, 0x40BA, 0x40BF, 0x31DD, 0x40C4, 0x31E0, 0x31E3, 0x40C9, 0x40CF, 0x31E6, 0x31E9, 0x31EC, 0x40D4, 0x40D9, 0x31EF, 0x31F2,
- 0x22D2, 0x31F5, 0x40DE, 0x40E3, 0x22D4, 0x40E8, 0x40EE, 0x40F5, 0x31F8, 0x40FB, 0x4101, 0x4107, 0x31FB, 0x31FE, 0x3201, 0x410C,
- 0x4111, 0x4117, 0x3204, 0x3207, 0x320A, 0x22D6, 0x22D8, 0x22DA, 0x22DC, 0x320D, 0x3210, 0x411C, 0x3213, 0x4122, 0x4127, 0x3216,
- 0x22DE, 0x22E0, 0x412D, 0x4133, 0x4138, 0x3219, 0x413E, 0x22E2, 0x321C, 0x321F, 0x3222, 0x3225, 0x3228, 0x4144, 0x322B, 0x22E4,
- 0x322E, 0x3231, 0x3234, 0x4149, 0x3237, 0x323A, 0x323D, 0x414E, 0x4154, 0x22E6, 0x4159, 0x22E8, 0x415F, 0x4164, 0x3240, 0x3243,
- 0x3246, 0x4169, 0x22EA, 0x3249, 0x416E, 0x22EC, 0x4173, 0x324C, 0x22EE, 0x22F0, 0x22F2, 0x22F4, 0x22F6, 0x22F8, 0x22FA, 0x22FC,
- 0x22FE, 0x2300, 0x324F, 0x3252, 0x3255, 0x3258, 0x325B, 0x325E, 0x3261, 0x3264, 0x3267, 0x326A, 0x326D, 0x3270, 0x3273, 0x3276,
- 0x3279, 0x327C, 0x2302, 0x2304, 0x327F, 0x2306, 0x2308, 0x230A, 0x3282, 0x3285, 0x230C, 0x230E, 0x2310, 0x2312, 0x2314, 0x4179,
- 0x2316, 0x2318, 0x231A, 0x231C, 0x231E, 0x2320, 0x2322, 0x2324, 0x3288, 0x417E, 0x2326, 0x2328, 0x232A, 0x232C, 0x232E, 0x2330,
- 0x2332, 0x328B, 0x328E, 0x3291, 0x3294, 0x2334, 0x2336, 0x2338, 0x233A, 0x233C, 0x233E, 0x2340, 0x2342, 0x2344, 0x2346, 0x3297,
- 0x329A, 0x2348, 0x329D, 0x32A0, 0x32A3, 0x234A, 0x32A6, 0x32A9, 0x4183, 0x234C, 0x32AC, 0x32AF, 0x32B2, 0x32B5, 0x4188, 0x418E,
- 0x234E, 0x2350, 0x2352, 0x2354, 0x2356, 0x2358, 0x235A, 0x235C, 0x235E, 0x2360, 0x2362, 0x2364, 0x2366, 0x2368, 0x236A, 0x236C,
- 0x236E, 0x2370, 0x4195, 0x2372, 0x2374, 0x2376, 0x419A, 0x32B8, 0x2378, 0x237A, 0x237C, 0x237E, 0x2380, 0x2382, 0x2384, 0x2386,
- 0x2388, 0x238A, 0x32BB, 0x238C, 0x238E, 0x32BE, 0x32C1, 0x2390, 0x419F, 0x32C4, 0x2392, 0x2394, 0x2396, 0x2398, 0x32C7, 0x32CA,
- 0x239A, 0x239C, 0x239E, 0x23A0, 0x23A2, 0x23A4, 0x23A6, 0x23A8, 0x23AA, 0x32CD, 0x32D0, 0x32D3, 0x32D6, 0x32D9, 0x32DC, 0x32DF,
- 0x32E2, 0x32E5, 0x32E8, 0x32EB, 0x32EE, 0x32F1, 0x32F4, 0x32F7, 0x32FA, 0x32FD, 0x3300, 0x3303, 0x3306, 0x3309, 0x330C, 0x330F,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8773,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8774, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8775, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8776, 0x0000,
- 0x0000, 0x0000, 0x8777, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8778, 0x0000, 0x0000, 0x0000, 0x0000, 0x8779, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x877A, 0x877B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x877C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x877D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x877E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x877F, 0x8780, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x8781, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x8782, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8783, 0x0000, 0x0000, 0x8784, 0x0000, 0x8785, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x8786, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8787, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8788, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x8789, 0x878A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x878B, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x878C, 0x0000, 0x0000, 0x0000, 0x0000, 0x878D, 0x0000, 0x878E, 0x878F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x8790, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8791, 0x0000, 0x8792,
- 0x0000, 0x0000, 0x0000, 0x8793, 0x8794, 0x8795, 0x0000, 0x8796, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8797, 0x0000,
- 0x0000, 0x0000, 0x8798, 0x0000, 0x0000, 0x8799, 0x0000, 0x0000, 0x0000, 0x879A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x879B, 0x0000, 0x0000, 0x0000, 0x879C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x879D, 0x0000, 0x0000, 0x879E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x879F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87A0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x87A1, 0x0000, 0x87A2, 0x0000, 0x87A3, 0x0000, 0x0000, 0x0000, 0x0000, 0x87A4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x87A5, 0x0000, 0x0000, 0x0000, 0x87A6, 0x87A7, 0x0000, 0x0000, 0x87A8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87A9,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87AA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x87AB, 0x0000, 0x0000, 0x0000, 0x0000, 0x87AC, 0x0000, 0x0000, 0x87AD, 0x87AE, 0x87AF, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87B0, 0x0000, 0x0000, 0x0000, 0x0000, 0x87B1, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x87B2, 0x0000, 0x0000, 0x0000, 0x0000, 0x87B3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87B4, 0x0000, 0x87B5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87B6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x87B7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87B8, 0x87B9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87BA, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87BB, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x87BC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87BD, 0x0000, 0x0000, 0x0000, 0x0000, 0x87BE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x87BF, 0x0000, 0x0000, 0x87C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87C1, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87C2, 0x0000, 0x87C3, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87C4, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x87C5, 0x87C6, 0x0000, 0x87C7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x87C8, 0x0000, 0x0000, 0x0000, 0x87C9, 0x0000, 0x87CA, 0x87CB, 0x0000, 0x87CC, 0x87CD, 0x0000, 0x0000,
- 0x0000, 0x87CE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x87CF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87D0, 0x0000, 0x87D1, 0x0000, 0x87D2, 0x0000, 0x0000, 0x0000, 0x87D3, 0x87D4, 0x0000,
- 0x0000, 0x0000, 0x87D5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x87D6, 0x0000, 0x87D7, 0x0000, 0x87D8, 0x0000, 0x0000, 0x87D9, 0x0000, 0x0000, 0x87DA, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87DB, 0x0000, 0x87DC,
- 0x0000, 0x87DD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x87DE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x87DF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87E0, 0x0000, 0x87E1, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87E2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87E3, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x87E4, 0x0000, 0x87E5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x87E6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x87E7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x87E8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x87E9, 0x0000, 0x0000, 0x87EA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x87EB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x87EC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87ED, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x87EE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87EF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87F0,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87F1, 0x87F2,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87F3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87F4, 0x0000, 0x87F5, 0x0000, 0x87F6, 0x0000,
- 0x0000, 0x0000, 0x87F7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87F8, 0x87F9, 0x0000, 0x0000, 0x87FA, 0x0000, 0x0000, 0x0000, 0x87FB, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87FC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87FD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87FE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87FF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8800, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x8801, 0x0000, 0x8802, 0x8803, 0x0000, 0x0000, 0x0000, 0x0000, 0x8804, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8805, 0x0000, 0x0000, 0x0000, 0x0000, 0x8806, 0x8807,
- 0x8808, 0x0000, 0x0000, 0x0000, 0x0000, 0x8809, 0x0000, 0x0000, 0x880A, 0x0000, 0x0000, 0x0000, 0x0000, 0x880B, 0x0000, 0x0000,
- 0x0000, 0x880C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x880D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x880E, 0x0000, 0x0000,
- 0x880F, 0x0000, 0x0000, 0x0000, 0x0000, 0x8810, 0x8811, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8812,
- 0x0000, 0x0000, 0x8813, 0x0000, 0x8814, 0x0000, 0x0000, 0x0000, 0x8815, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x8816, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8817, 0x0000, 0x0000, 0x0000, 0x0000, 0x8818, 0x0000, 0x0000, 0x0000,
- 0x8819, 0x0000, 0x0000, 0x0000, 0x0000, 0x881A, 0x0000, 0x0000, 0x0000, 0x881B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x881C, 0x0000, 0x881D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x881E, 0x881F, 0x8820, 0x0000, 0x8821, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x8822, 0x8823, 0x8824, 0x0000, 0x0000, 0x8825, 0x0000, 0x0000, 0x8826, 0x8827, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x8828, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8829, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x882A, 0x0000, 0x0000, 0x0000, 0x882B, 0x0000, 0x882C, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x882D, 0x882E, 0x0000, 0x0000, 0x882F, 0x0000, 0x8830, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x8831, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8832, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8833, 0x0000, 0x0000, 0x0000, 0x0000, 0x8834, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8835, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8836,
- 0x0000, 0x8837, 0x0000, 0x0000, 0x8838, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8839, 0x883A, 0x0000, 0x0000, 0x0000, 0x883B,
- 0x0000, 0x0000, 0x883C, 0x0000, 0x0000, 0x0000, 0x0000, 0x883D, 0x0000, 0x0000, 0x883E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x883F, 0x0000, 0x8840, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8841, 0x0000, 0x0000, 0x0000, 0x8842, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8843, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8844, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8845, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x8846, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8847, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8848, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x8849, 0x0000, 0x0000, 0x0000, 0x0000, 0x884A, 0x884B, 0x884C, 0x0000, 0x0000, 0x0000, 0x884D, 0x884E,
- 0x0000, 0x0000, 0x884F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8850, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8851,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8852, 0x0000, 0x8853, 0x8854, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x8855, 0x0000, 0x8856, 0x0000, 0x0000, 0x8857, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8858, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x8859, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x885A, 0x0000, 0x885B, 0x885C, 0x0000, 0x0000, 0x0000, 0x885D, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x885E, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x885F, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8860, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8861, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8862, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x8863, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8864, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8865, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8866, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8867,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8868, 0x8869, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x886A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x886B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x886C, 0x0000, 0x0000, 0x0000, 0x886D,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x886E, 0x0000, 0x0000, 0x886F, 0x8870, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8871, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x8872, 0x0000, 0x0000, 0x8873, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8874, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x8875, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8876, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8877, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8878, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8879, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x887A,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x887B, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x887C, 0x0000, 0x0000, 0x0000, 0x887D, 0x887E, 0x0000, 0x887F, 0x0000, 0x8880, 0x8881, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8882, 0x8883, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8884, 0x8885, 0x0000, 0x0000, 0x8886, 0x0000, 0x8887, 0x8888, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8889, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x888A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x888B, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x888C, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x888D, 0x0000, 0x888E, 0x0000, 0x0000, 0x888F, 0x8890, 0x0000, 0x0000, 0x0000, 0x8891, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x8892, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x8893, 0x0000, 0x8894, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8895, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8896, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8897, 0x0000, 0x8898, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x8899, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x889A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x889B, 0x0000, 0x0000, 0x889C, 0x0000, 0x0000, 0x889D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x889E, 0x0000, 0x0000, 0x889F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x88A0, 0x0000, 0x88A1, 0x0000, 0x0000, 0x0000, 0x0000, 0x88A2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88A3, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x88A4, 0x0000, 0x0000, 0x0000, 0x88A5, 0x0000, 0x88A6, 0x0000, 0x88A7, 0x88A8, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88A9, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x88AA, 0x0000, 0x88AB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x88AC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88AD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88AE, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x88AF, 0x0000, 0x0000, 0x88B0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x88B1, 0x0000, 0x0000, 0x88B2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88B3, 0x88B4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88B5,
- 0x0000, 0x0000, 0x0000, 0x88B6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88B7, 0x88B8, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88B9, 0x0000, 0x0000, 0x0000, 0x0000, 0x88BA, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88BB, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x88BC, 0x88BD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88BE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88BF, 0x0000, 0x0000, 0x88C0, 0x0000, 0x88C1,
- 0x88C2, 0x88C3, 0x88C4, 0x88C5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88C6, 0x0000, 0x0000, 0x88C7, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x88C8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x88C9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x88CA, 0x0000, 0x88CB, 0x0000, 0x88CC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88CD, 0x0000, 0x0000, 0x0000, 0x88CE, 0x0000, 0x88CF, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88D0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88D1, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x88D2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88D3, 0x0000,
- 0x88D4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88D5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88D6, 0x0000, 0x0000, 0x0000, 0x88D7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88D8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88D9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88DA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88DB, 0x88DC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x88DD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x88DE, 0x88DF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88E0, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88E1, 0x88E2, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88E3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x88E4, 0x0000, 0x0000, 0x88E5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88E6, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88E7, 0x0000, 0x88E8, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88E9, 0x0000, 0x88EA, 0x0000, 0x0000, 0x0000, 0x0000, 0x88EB,
- 0x0000, 0x0000, 0x0000, 0x88EC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88ED, 0x88EE, 0x0000, 0x0000, 0x88EF, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x88F0, 0x0000, 0x0000, 0x88F1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x88F2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88F3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x88F4, 0x88F5, 0x88F6, 0x0000, 0x0000, 0x0000, 0x88F7, 0x0000, 0x0000, 0x0000, 0x88F8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x88F9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88FA, 0x0000, 0x0000, 0x88FB, 0x0000,
- 0x0000, 0x0000, 0x88FC, 0x0000, 0x0000, 0x0000, 0x88FD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88FE, 0x0000, 0x88FF, 0x0000, 0x0000, 0x8900, 0x8901, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8902,
- 0x0000, 0x0000, 0x0000, 0x8903, 0x0000, 0x0000, 0x0000, 0x0000, 0x8904, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x8905, 0x0000, 0x0000, 0x0000, 0x8906, 0x8907, 0x8908, 0x0000, 0x8909, 0x0000, 0x890A, 0x0000, 0x890B, 0x0000,
- 0x890C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x890D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x890E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x890F, 0x0000, 0x8910, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x8911, 0x0000, 0x8912, 0x0000, 0x0000, 0x0000, 0x8913, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8914, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8915, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8916, 0x0000, 0x0000, 0x8917, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x8918, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x8919, 0x891A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x891B, 0x0000, 0x891C, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x891D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x891E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x891F, 0x8920, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8921, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8922, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8923, 0x8924, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8925, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x8926, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8927, 0x0000, 0x0000, 0x8928,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8929,
- 0x0000, 0x0000, 0x0000, 0x892A, 0x0000, 0x0000, 0x892B, 0x0000, 0x0000, 0x0000, 0x0000, 0x892C, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x892D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x892E, 0x0000, 0x0000, 0x892F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8930,
- 0x0000, 0x0000, 0x0000, 0x8931, 0x0000, 0x8932, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8933, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x8934, 0x8935, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8936, 0x0000, 0x0000, 0x8937, 0x8938,
- 0x0000, 0x8939, 0x0000, 0x0000, 0x893A, 0x0000, 0x0000, 0x893B, 0x0000, 0x0000, 0x893C, 0x893D, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x893E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x893F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x8940, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8941, 0x0000, 0x0000, 0x8942,
- 0x8943, 0x8944, 0x8945, 0x0000, 0x8946, 0x0000, 0x0000, 0x8947, 0x0000, 0x0000, 0x8948, 0x8949, 0x894A, 0x0000, 0x894B, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x894C, 0x0000, 0x894D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x894E,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x894F, 0x0000, 0x8950, 0x0000, 0x0000, 0x8951, 0x0000, 0x8952, 0x8953, 0x8954, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x8955, 0x8956, 0x8957, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8958, 0x0000, 0x8959, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x895A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x895B, 0x895C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x895D, 0x0000, 0x0000, 0x895E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x895F, 0x8960, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8961, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8962, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8963, 0x0000, 0x0000, 0x0000, 0x0000, 0x8964, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8965, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x8966, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8967, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8968, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8969, 0x896A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x896B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x896C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x896D, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x896E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x896F, 0x0000, 0x8970, 0x8971, 0x0000, 0x8972, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8973, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x8974, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8975, 0x0000, 0x0000, 0x0000, 0x8976, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8977, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x8978, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8979, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x897A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x897B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x897C,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x897D, 0x0000, 0x0000, 0x0000, 0x897E, 0x0000, 0x0000, 0x0000, 0x0000, 0x897F, 0x0000, 0x8980,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x8981, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8982, 0x8983, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8984,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8985, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x8986, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8987,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8988, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x8989, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x898A, 0x0000, 0x0000, 0x0000, 0x0000, 0x898B, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x898C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x898D, 0x0000, 0x0000, 0x0000, 0x898E, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x898F,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8990, 0x0000, 0x8991, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x8992, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x8993, 0x0000, 0x0000, 0x8994, 0x8995, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x8996, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x8997, 0x8998, 0x0000, 0x0000, 0x8999, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x899A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x899B, 0x0000, 0x0000, 0x0000, 0x0000, 0x899C, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x899D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x899E, 0x899F, 0x89A0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89A1, 0x0000, 0x0000, 0x89A2, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89A3,
- 0x0000, 0x0000, 0x89A4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89A5, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x89A6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89A7, 0x0000, 0x89A8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x89A9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89AA, 0x0000, 0x0000, 0x89AB,
- 0x0000, 0x0000, 0x89AC, 0x89AD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89AE, 0x89AF,
- 0x0000, 0x0000, 0x0000, 0x89B0, 0x0000, 0x0000, 0x0000, 0x0000, 0x89B1, 0x0000, 0x0000, 0x89B2, 0x0000, 0x0000, 0x89B3, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x89B4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x89B5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89B6, 0x89B7, 0x0000, 0x89B8, 0x89B9, 0x89BA,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89BB, 0x0000, 0x89BC, 0x89BD, 0x0000, 0x89BE, 0x89BF, 0x89C0, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x89C1, 0x0000, 0x0000, 0x0000, 0x0000, 0x89C2, 0x0000, 0x89C3, 0x89C4, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x89C5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89C6, 0x0000, 0x0000, 0x0000, 0x0000, 0x89C7,
- 0x0000, 0x0000, 0x89C8, 0x0000, 0x0000, 0x0000, 0x89C9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89CA, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x89CB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89CC,
- 0x0000, 0x89CD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x89CE, 0x0000, 0x0000, 0x0000, 0x0000, 0x89CF, 0x89D0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89D1,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89D2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89D3, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x89D4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89D5, 0x0000, 0x0000, 0x89D6, 0x89D7,
- 0x0000, 0x0000, 0x89D8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89D9, 0x0000, 0x89DA, 0x0000, 0x0000, 0x0000,
- 0x89DB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89DC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89DD,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89DE, 0x0000, 0x0000, 0x0000, 0x89DF, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x89E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89E1, 0x89E2, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x89E3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89E4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89E5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89E6, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x89E7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x89E8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89E9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89EA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89EB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89EC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89ED, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x89EE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89EF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89F0, 0x0000, 0x0000, 0x89F1, 0x0000, 0x89F2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89F3, 0x89F4, 0x0000, 0x0000, 0x0000, 0x89F5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89F6, 0x0000, 0x89F7, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x89F8, 0x0000, 0x0000, 0x0000, 0x89F9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89FA, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89FB, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89FC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89FD, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89FE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89FF, 0x8A00,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A01, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A02, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A03, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A04, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x8A05, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A06, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x8A07, 0x8A08, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A09, 0x0000, 0x8A0A, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A0B, 0x0000, 0x0000, 0x8A0C,
- 0x0000, 0x0000, 0x8A0D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A0E, 0x0000, 0x0000, 0x8A0F, 0x0000, 0x0000, 0x8A10, 0x8A11,
- 0x0000, 0x8A12, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A13, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A14, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x8A15, 0x8A16, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A17, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x8A18, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A19, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A1A,
- 0x0000, 0x8A1B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x8A1C, 0x0000, 0x0000, 0x8A1D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A1E, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x8A1F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A20,
- 0x8A21, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A22,
- 0x8A23, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A24, 0x8A25, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x8A26, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A27, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x8A28, 0x0000, 0x0000, 0x0000, 0x8A29, 0x0000, 0x8A2A, 0x0000, 0x0000, 0x8A2B, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A2C, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x8A2D, 0x0000, 0x8A2E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A2F, 0x0000, 0x0000, 0x8A30, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A31,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x8A32, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A33, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x8A34, 0x8A35, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A36, 0x0000, 0x8A37, 0x0000, 0x8A38, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A39, 0x8A3A, 0x0000, 0x0000, 0x8A3B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A3C,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A3D, 0x0000, 0x0000, 0x8A3E, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A3F, 0x0000, 0x8A40,
- 0x8A41, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A42, 0x8A43, 0x8A44, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x8A45, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A46, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x8A47, 0x8A48, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x8A49, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A4A, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A4B, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x8A4C, 0x8A4D, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A4E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A4F, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A50, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A51,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x8A52, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x8A53, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A54, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x8A55, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A56, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x8A57, 0x0000, 0x0000, 0x8A58, 0x0000, 0x0000, 0x0000, 0x8A59, 0x0000, 0x0000, 0x8A5A, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x8A5B, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A5C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x8A5D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A5E, 0x0000,
- 0x0000, 0x8A5F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A60, 0x8A61, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x8A62, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A63, 0x0000, 0x0000, 0x8A64, 0x0000, 0x0000, 0x8A65,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A66, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A67, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x8A68, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A69, 0x0000, 0x8A6A, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A6B, 0x0000, 0x0000,
- 0x8A6C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A6D, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A6E, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x8A6F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A70, 0x0000, 0x0000, 0x0000, 0x8A71, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A72, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A73, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A74, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A75, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A76, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x8A77, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A78, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x8A79, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A7A, 0x0000, 0x0000, 0x0000, 0x8A7B, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A7C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A7D, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A7E, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x8A7F, 0x0000, 0x0000, 0x8A80, 0x8A81, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A82, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A83, 0x0000, 0x8A84, 0x8A85, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x8A86, 0x0000, 0x8A87, 0x0000, 0x0000, 0x8A88, 0x0000, 0x8A89, 0x8A8A, 0x0000, 0x8A8B, 0x8A8C, 0x8A8D, 0x0000, 0x0000, 0x0000,
- 0x8A8E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A8F, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A90, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A91,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A92, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x8A93, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x8A94, 0x8A95, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A96, 0x8A97, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A98,
- 0x0000, 0x0000, 0x8A99, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A9A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x8A9B, 0x0000, 0x8A9C, 0x0000, 0x0000, 0x8A9D, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A9E, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x8A9F, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AA0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AA1, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AA2, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AA3,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x8AA4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AA5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AA6, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AA7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x8AA8, 0x8AA9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AAA, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x8AAB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AAC, 0x8AAD, 0x0000, 0x0000, 0x0000,
- 0x8AAE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AAF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AB0, 0x0000, 0x0000, 0x8AB1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AB2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x8AB3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AB4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x8AB5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AB6, 0x0000, 0x8AB7, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x8AB8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AB9, 0x0000,
- 0x0000, 0x8ABA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8ABB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x8ABC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8ABD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x8ABE, 0x0000, 0x0000, 0x0000, 0x8ABF, 0x8AC0, 0x0000, 0x8AC1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AC2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AC3,
- 0x0000, 0x0000, 0x8AC4, 0x0000, 0x8AC5, 0x0000, 0x0000, 0x8AC6, 0x0000, 0x8AC7, 0x0000, 0x0000, 0x8AC8, 0x8AC9, 0x8ACA, 0x0000,
- 0x8ACB, 0x8ACC, 0x8ACD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8ACE, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8ACF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x8AD0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AD1, 0x0000, 0x8AD2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x8AD3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AD4, 0x0000, 0x8AD5, 0x0000,
- 0x0000, 0x8AD6, 0x0000, 0x8AD7, 0x8AD8, 0x0000, 0x0000, 0x8AD9, 0x0000, 0x0000, 0x8ADA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8ADB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8ADC, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8ADD,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8ADE, 0x0000, 0x8ADF, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AE0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AE1, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AE2, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AE3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AE4, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x8AE5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AE6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AE7,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AE8, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x8AE9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AEA, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x8AEB, 0x0000, 0x0000, 0x0000, 0x8AEC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AED,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AEE, 0x0000, 0x0000, 0x0000, 0x8AEF, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AF0, 0x0000, 0x8AF1, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x8AF2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AF3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x8AF4, 0x0000, 0x0000, 0x0000, 0x8AF5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AF6,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AF7, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x8AF8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AF9, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AFA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AFB, 0x0000, 0x0000, 0x0000, 0x8AFC, 0x8AFD, 0x8AFE, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x8AFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B00,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B01, 0x8B02, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B03, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B04, 0x0000, 0x0000, 0x0000, 0x8B05, 0x0000, 0x0000, 0x0000, 0x8B06, 0x0000,
- 0x0000, 0x8B07, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B08,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B09, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B0A, 0x0000, 0x0000, 0x8B0B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B0C, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B0D, 0x0000,
- 0x0000, 0x8B0E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B0F, 0x8B10, 0x8B11, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x8B12, 0x8B13, 0x8B14, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B15, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B16, 0x8B17, 0x0000, 0x0000, 0x0000, 0x8B18, 0x8B19,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B1A, 0x8B1B, 0x0000, 0x0000, 0x0000, 0x8B1C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x8B1D, 0x8B1E, 0x0000, 0x8B1F, 0x0000, 0x0000, 0x8B20, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B21, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B22, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B23, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B24, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B25, 0x0000, 0x0000, 0x0000, 0x8B26,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x8B27, 0x0000, 0x0000, 0x0000, 0x8B28, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B29, 0x0000, 0x8B2A, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x8B2B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x8B2C, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B2D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x8B2E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x8B2F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B30, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B31, 0x0000,
- 0x0000, 0x8B32, 0x0000, 0x8B33, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B34, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B35, 0x0000, 0x8B36, 0x0000, 0x0000, 0x0000, 0x8B37, 0x8B38, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x8B39, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B3A, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B3B, 0x0000, 0x8B3C, 0x8B3D, 0x0000, 0x0000, 0x8B3E,
- 0x8B3F, 0x0000, 0x0000, 0x0000, 0x8B40, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B41, 0x0000, 0x0000, 0x8B42, 0x0000, 0x8B43, 0x0000,
- 0x0000, 0x0000, 0x8B44, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B45, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B46, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B47, 0x8B48, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B49, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x8B4A, 0x8B4B, 0x0000, 0x8B4C, 0x0000, 0x8B4D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B4E, 0x0000,
- 0x8B4F, 0x0000, 0x8B50, 0x0000, 0x8B51, 0x8B52, 0x8B53, 0x8B54, 0x8B55, 0x8B56, 0x0000, 0x8B57, 0x0000, 0x8B58, 0x0000, 0x0000,
- 0x8B59, 0x0000, 0x0000, 0x8B5A, 0x8B5B, 0x8B5C, 0x0000, 0x8B5D, 0x0000, 0x8B5E, 0x8B5F, 0x8B60, 0x8B61, 0x8B62, 0x0000, 0x0000,
- 0x0000, 0x8B63, 0x0000, 0x0000, 0x0000, 0x8B64, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B65, 0x0000,
- 0x8B66, 0x8B67, 0x8B68, 0x8B69, 0x0000, 0x8B6A, 0x0000, 0x0000, 0x0000, 0x8B6B, 0x8B6C, 0x0000, 0x8B6D, 0x0000, 0x0000, 0x8B6E,
- 0x8B6F, 0x0000, 0x8B70, 0x8B71, 0x8B72, 0x0000, 0x8B73, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B74, 0x0000,
- 0x8B75, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B76, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B77, 0x0000, 0x8B78, 0x8B79, 0x0000,
- 0x0000, 0x8B7A, 0x8B7B, 0x0000, 0x0000, 0x0000, 0x8B7C, 0x0000, 0x8B7D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x8B7E, 0x8B7F, 0x8B80, 0x8B81, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B82, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x8B83, 0x0000, 0x8B84, 0x0000, 0x0000, 0x8B85, 0x0000, 0x8B86, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B87,
- 0x0000, 0x0000, 0x0000, 0x8B88, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B89, 0x0000, 0x8B8A, 0x0000,
- 0x8B8B, 0x0000, 0x8B8C, 0x8B8D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B8E, 0x8B8F, 0x0000, 0x0000,
- 0x8B90, 0x8B91, 0x8B92, 0x0000, 0x8B93, 0x0000, 0x0000, 0x0000, 0x8B94, 0x8B95, 0x8B96, 0x8B97, 0x0000, 0x8B98, 0x8B99, 0x8B9A,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x8B9B, 0x0000, 0x0000, 0x8B9C, 0x0000, 0x0000, 0x8B9D, 0x8B9E, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x8B9F, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BA0, 0x8BA1, 0x8BA2, 0x8BA3, 0x0000, 0x0000, 0x8BA4, 0x8BA5, 0x0000,
- 0x8BA6, 0x8BA7, 0x0000, 0x8BA8, 0x0000, 0x0000, 0x8BA9, 0x0000, 0x8BAA, 0x8BAB, 0x0000, 0x0000, 0x8BAC, 0x0000, 0x0000, 0x8BAD,
- 0x0000, 0x8BAE, 0x8BAF, 0x0000, 0x8BB0, 0x0000, 0x8BB1, 0x0000, 0x0000, 0x8BB2, 0x0000, 0x8BB3, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BB4, 0x8BB5, 0x8BB6, 0x8BB7, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x8BB8, 0x8BB9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BBA, 0x0000, 0x0000, 0x0000, 0x8BBB, 0x0000, 0x8BBC, 0x8BBD, 0x8BBE,
- 0x0000, 0x0000, 0x0000, 0x8BBF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BC0, 0x0000, 0x0000, 0x8BC1, 0x0000,
- 0x0000, 0x8BC2, 0x8BC3, 0x0000, 0x0000, 0x8BC4, 0x8BC5, 0x8BC6, 0x0000, 0x8BC7, 0x0000, 0x0000, 0x0000, 0x8BC8, 0x8BC9, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x8BCA, 0x0000, 0x8BCB, 0x8BCC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x8BCD, 0x0000, 0x8BCE, 0x8BCF, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BD0, 0x0000, 0x0000, 0x0000, 0x8BD1, 0x0000,
- 0x0000, 0x8BD2, 0x8BD3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BD4, 0x8BD5, 0x8BD6, 0x0000, 0x8BD7, 0x0000, 0x8BD8,
- 0x8BD9, 0x0000, 0x0000, 0x8BDA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BDB, 0x0000, 0x0000, 0x8BDC, 0x8BDD, 0x8BDE, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BDF, 0x0000, 0x8BE0, 0x0000, 0x8BE1, 0x0000, 0x0000, 0x8BE2,
- 0x0000, 0x0000, 0x0000, 0x8BE3, 0x0000, 0x0000, 0x8BE4, 0x0000, 0x8BE5, 0x0000, 0x0000, 0x0000, 0x8BE6, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BE7, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BE8, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x8BE9, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BEA, 0x0000, 0x8BEB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BEC, 0x8BED, 0x0000, 0x8BEE, 0x0000, 0x0000, 0x8BEF, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BF0, 0x0000, 0x0000, 0x8BF1, 0x8BF2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BF3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x8BF4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x8BF5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BF6, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BF7, 0x0000, 0x0000, 0x0000, 0x8BF8, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BF9, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BFA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BFB, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BFC,
- 0x8BFD, 0x0000, 0x8BFE, 0x8BFF, 0x0000, 0x8C00, 0x8C01, 0x8C02, 0x0000, 0x8C03, 0x0000, 0x0000, 0x0000, 0x8C04, 0x8C05, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C06, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C07, 0x0000, 0x0000, 0x8C08, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C09, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C0A, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C0B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C0C, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C0D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x8C0E, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C0F, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C10, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x8C11, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C12, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x8C13, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C14, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C15, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x8C16, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C17, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C18, 0x8C19, 0x8C1A,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C1B, 0x0000, 0x0000, 0x0000, 0x8C1C, 0x0000, 0x8C1D,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C1E, 0x0000, 0x8C1F, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C20,
- 0x8C21, 0x0000, 0x8C22, 0x0000, 0x0000, 0x8C23, 0x0000, 0x0000, 0x8C24, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C25, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C26, 0x8C27, 0x8C28, 0x8C29, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C2A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x8C2B, 0x0000, 0x8C2C, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C2D, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x8C2E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C2F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x8C30, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C31, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C32, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x8C33, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C34, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x8C35, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C36, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C37, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x8C38, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C39, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C3A,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C3B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C3C, 0x0000, 0x0000, 0x8C3D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C3E, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C3F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C40, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x8C41, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C42, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C43, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C44, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x8C45, 0x0000, 0x0000, 0x0000, 0x8C46, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C47, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C48, 0x0000, 0x0000, 0x0000,
- 0x8C49, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C4A, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C4B, 0x8C4C,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x8C4D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C4E, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C4F, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x8C50, 0x0000, 0x8C51, 0x8C52, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C53, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x8C54, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C55, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C56, 0x0000,
- 0x0000, 0x0000, 0x8C57, 0x0000, 0x0000, 0x8C58, 0x0000, 0x0000, 0x8C59, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x8C5A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C5B, 0x0000, 0x0000, 0x8C5C, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C5D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C5E, 0x0000, 0x8C5F, 0x0000, 0x8C60, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x8C61, 0x0000, 0x0000, 0x8C62, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C63,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C64, 0x0000, 0x0000, 0x8C65, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C66, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C67, 0x0000, 0x0000, 0x0000, 0x8C68, 0x8C69, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C6A, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C6B, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C6C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C6D, 0x0000, 0x0000, 0x8C6E, 0x8C6F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x8C70, 0x0000, 0x0000, 0x0000, 0x8C71, 0x0000, 0x8C72, 0x8C73, 0x0000, 0x0000, 0x8C74, 0x8C75, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C76, 0x0000, 0x0000, 0x8C77, 0x0000, 0x0000, 0x0000, 0x8C78, 0x0000,
- 0x0000, 0x0000, 0x8C79, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C7A, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C7B, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C7C,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C7D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C7E, 0x8C7F, 0x0000, 0x0000, 0x8C80,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C81, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C82,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C83, 0x8C84, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C85, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C86, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C87,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C88, 0x0000, 0x8C89, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C8A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x8C8B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C8C, 0x0000,
- 0x0000, 0x0000, 0x8C8D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C8E, 0x0000, 0x0000, 0x0000, 0x8C8F,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x8C90, 0x0000, 0x0000, 0x0000, 0x8C91, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C92, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x8C93, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C94, 0x0000, 0x0000, 0x8C95,
- 0x0000, 0x0000, 0x8C96, 0x0000, 0x0000, 0x0000, 0x8C97, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C98, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x8C99, 0x0000, 0x0000, 0x0000, 0x8C9A, 0x8C9B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C9C, 0x0000, 0x0000,
- 0x8C9D, 0x8C9E, 0x0000, 0x0000, 0x8C9F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CA0,
- 0x0000, 0x0000, 0x0000, 0x8CA1, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CA2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x8CA3, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CA4, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CA5, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CA6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x8CA7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CA8, 0x0000, 0x8CA9, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CAA, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CAB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CAC, 0x8CAD, 0x0000, 0x0000,
- 0x0000, 0x8CAE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CAF, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CB0, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CB1, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CB2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x8CB3, 0x8CB4, 0x0000, 0x8CB5, 0x0000, 0x0000, 0x8CB6, 0x0000, 0x0000, 0x8CB7, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CB8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CB9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CBA, 0x0000, 0x0000,
- 0x8CBB, 0x0000, 0x0000, 0x0000, 0x8CBC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CBD, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CBE,
- 0x0000, 0x0000, 0x8CBF, 0x0000, 0x8CC0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CC1, 0x0000, 0x0000, 0x0000, 0x8CC2,
- 0x0000, 0x0000, 0x0000, 0x8CC3, 0x0000, 0x0000, 0x8CC4, 0x0000, 0x8CC5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x8CC6, 0x0000, 0x0000, 0x0000, 0x8CC7, 0x8CC8, 0x0000, 0x0000, 0x0000, 0x8CC9, 0x0000, 0x8CCA, 0x0000, 0x0000, 0x8CCB,
- 0x0000, 0x0000, 0x8CCC, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CCD, 0x0000, 0x0000, 0x8CCE, 0x0000, 0x0000, 0x8CCF, 0x0000, 0x8CD0,
- 0x8CD1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x8CD2, 0x0000, 0x8CD3, 0x0000, 0x8CD4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x8CD5, 0x8CD6, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CD7, 0x0000, 0x8CD8, 0x0000, 0x8CD9, 0x0000, 0x8CDA, 0x0000,
- 0x8CDB, 0x0000, 0x0000, 0x8CDC, 0x0000, 0x8CDD, 0x8CDE, 0x8CDF, 0x8CE0, 0x0000, 0x0000, 0x8CE1, 0x0000, 0x8CE2, 0x0000, 0x8CE3,
- 0x0000, 0x0000, 0x0000, 0x8CE4, 0x0000, 0x8CE5, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CE6, 0x0000, 0x0000, 0x8CE7, 0x0000, 0x0000,
- 0x0000, 0x8CE8, 0x0000, 0x0000, 0x8CE9, 0x0000, 0x8CEA, 0x0000, 0x0000, 0x0000, 0x8CEB, 0x0000, 0x8CEC, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x8CED, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CEE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CEF, 0x0000,
- 0x8CF0, 0x0000, 0x8CF1, 0x0000, 0x8CF2, 0x8CF3, 0x0000, 0x0000, 0x8CF4, 0x0000, 0x0000, 0x8CF5, 0x0000, 0x0000, 0x8CF6, 0x0000,
- 0x8CF7, 0x8CF8, 0x8CF9, 0x8CFA, 0x0000, 0x0000, 0x8CFB, 0x0000, 0x0000, 0x8CFC, 0x0000, 0x8CFD, 0x8CFE, 0x8CFF, 0x8D00, 0x0000,
- 0x8D01, 0x8D02, 0x8D03, 0x8D04, 0x0000, 0x8D05, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D06, 0x0000, 0x0000, 0x8D07,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x8D08, 0x8D09, 0x8D0A, 0x8D0B, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D0C, 0x8D0D, 0x0000, 0x0000,
- 0x0000, 0x8D0E, 0x8D0F, 0x0000, 0x0000, 0x8D10, 0x0000, 0x0000, 0x8D11, 0x0000, 0x8D12, 0x0000, 0x0000, 0x0000, 0x8D13, 0x0000,
- 0x8D14, 0x8D15, 0x0000, 0x8D16, 0x8D17, 0x8D18, 0x8D19, 0x0000, 0x8D1A, 0x0000, 0x8D1B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x8D1C, 0x0000, 0x8D1D, 0x0000, 0x0000, 0x0000, 0x8D1E, 0x0000, 0x0000, 0x8D1F, 0x0000, 0x0000, 0x8D20, 0x0000, 0x0000, 0x8D21,
- 0x0000, 0x0000, 0x8D22, 0x0000, 0x8D23, 0x0000, 0x0000, 0x8D24, 0x0000, 0x8D25, 0x0000, 0x8D26, 0x0000, 0x8D27, 0x0000, 0x8D28,
- 0x0000, 0x8D29, 0x8D2A, 0x0000, 0x0000, 0x0000, 0x8D2B, 0x8D2C, 0x0000, 0x0000, 0x0000, 0x8D2D, 0x8D2E, 0x8D2F, 0x8D30, 0x0000,
- 0x0000, 0x8D31, 0x8D32, 0x0000, 0x8D33, 0x0000, 0x8D34, 0x8D35, 0x0000, 0x0000, 0x0000, 0x8D36, 0x0000, 0x8D37, 0x8D38, 0x0000,
- 0x0000, 0x8D39, 0x0000, 0x8D3A, 0x0000, 0x0000, 0x8D3B, 0x8D3C, 0x8D3D, 0x0000, 0x8D3E, 0x0000, 0x8D3F, 0x0000, 0x8D40, 0x0000,
- 0x8D41, 0x8D42, 0x8D43, 0x0000, 0x8D44, 0x8D45, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D46, 0x0000, 0x0000, 0x0000, 0x8D47, 0x0000,
- 0x8D48, 0x0000, 0x0000, 0x0000, 0x8D49, 0x0000, 0x8D4A, 0x8D4B, 0x0000, 0x8D4C, 0x0000, 0x8D4D, 0x0000, 0x8D4E, 0x0000, 0x0000,
- 0x8D4F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D50, 0x0000, 0x0000, 0x8D51, 0x8D52, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x8D53, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D54, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D55, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D56, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D57, 0x8D58,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D59, 0x0000, 0x8D5A, 0x8D5B, 0x8D5C, 0x0000, 0x8D5D, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D5E, 0x0000, 0x0000, 0x0000, 0x8D5F,
- 0x8D60, 0x0000, 0x0000, 0x0000, 0x8D61, 0x0000, 0x0000, 0x8D62, 0x8D63, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D64, 0x8D65, 0x0000,
- 0x8D66, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D67, 0x8D68, 0x0000, 0x0000, 0x8D69, 0x0000,
- 0x0000, 0x0000, 0x8D6A, 0x8D6B, 0x0000, 0x8D6C, 0x8D6D, 0x0000, 0x0000, 0x0000, 0x8D6E, 0x0000, 0x8D6F, 0x0000, 0x8D70, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D71, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D72, 0x0000,
- 0x8D73, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D74, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D75, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x8D76, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D77, 0x8D78, 0x0000,
- 0x8D79, 0x8D7A, 0x8D7B, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D7C, 0x8D7D, 0x8D7E, 0x8D7F, 0x8D80, 0x8D81, 0x0000, 0x0000, 0x8D82,
- 0x8D83, 0x0000, 0x8D84, 0x8D85, 0x8D86, 0x0000, 0x8D87, 0x8D88, 0x8D89, 0x0000, 0x8D8A, 0x8D8B, 0x8D8C, 0x8D8D, 0x0000, 0x8D8E,
- 0x8D8F, 0x8D90, 0x8D91, 0x8D92, 0x8D93, 0x8D94, 0x0000, 0x8D95, 0x8D96, 0x0000, 0x8D97, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x8D98, 0x8D99, 0x8D9A, 0x0000, 0x8D9B, 0x0000, 0x0000, 0x0000, 0x8D9C, 0x8D9D, 0x0000, 0x8D9E, 0x0000, 0x8D9F, 0x0000,
- 0x8DA0, 0x8DA1, 0x8DA2, 0x8DA3, 0x8DA4, 0x0000, 0x8DA5, 0x8DA6, 0x0000, 0x0000, 0x8DA7, 0x0000, 0x8DA8, 0x8DA9, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x8DAA, 0x8DAB, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DAC, 0x8DAD, 0x8DAE, 0x8DAF, 0x8DB0, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x8DB1, 0x8DB2, 0x0000, 0x8DB3, 0x8DB4, 0x0000, 0x8DB5, 0x0000, 0x0000, 0x8DB6, 0x0000, 0x8DB7,
- 0x8DB8, 0x0000, 0x0000, 0x8DB9, 0x8DBA, 0x0000, 0x8DBB, 0x8DBC, 0x0000, 0x0000, 0x0000, 0x8DBD, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DBE, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DBF, 0x0000, 0x0000, 0x0000, 0x8DC0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DC1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x8DC2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x8DC3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x8DC4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x8DC5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DC6, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DC7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x8DC8, 0x0000, 0x0000, 0x8DC9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DCA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x8DCB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DCC, 0x8DCD, 0x8DCE, 0x0000, 0x8DCF, 0x0000, 0x0000,
- 0x0000, 0x8DD0, 0x8DD1, 0x8DD2, 0x0000, 0x8DD3, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DD4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x8DD5, 0x0000, 0x0000, 0x0000, 0x8DD6, 0x8DD7, 0x0000, 0x0000, 0x0000, 0x8DD8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x8DD9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DDA, 0x8DDB, 0x8DDC, 0x8DDD, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x8DDE, 0x0000, 0x8DDF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DE0, 0x0000, 0x0000, 0x0000, 0x8DE1,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DE2, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x8DE3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DE4, 0x8DE5, 0x8DE6, 0x8DE7, 0x8DE8, 0x0000, 0x8DE9, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x8DEA, 0x0000, 0x8DEB, 0x0000, 0x8DEC, 0x8DED, 0x8DEE, 0x8DEF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x8DF0, 0x0000, 0x8DF1, 0x8DF2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DF3, 0x8DF4, 0x8DF5, 0x8DF6, 0x8DF7,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DF8, 0x8DF9, 0x0000, 0x0000, 0x8DFA, 0x8DFB, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DFC,
- 0x0000, 0x0000, 0x0000, 0x8DFD, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DFE, 0x0000, 0x0000, 0x8DFF, 0x0000, 0x0000, 0x8E00, 0x8E01,
- 0x8E02, 0x0000, 0x8E03, 0x0000, 0x8E04, 0x8E05, 0x8E06, 0x0000, 0x0000, 0x8E07, 0x0000, 0x0000, 0x0000, 0x8E08, 0x8E09, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x8E0A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E0B,
- 0x0000, 0x8E0C, 0x8E0D, 0x0000, 0x8E0E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E0F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E10, 0x8E11, 0x8E12,
- 0x0000, 0x0000, 0x8E13, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E14, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x8E15, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x8E16, 0x8E17, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E18, 0x8E19, 0x0000, 0x0000, 0x8E1A, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x8E1B, 0x8E1C, 0x0000, 0x0000, 0x0000, 0x8E1D, 0x0000, 0x0000, 0x8E1E, 0x0000, 0x8E1F, 0x0000,
- 0x8E20, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E21, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x8E22, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E23, 0x8E24, 0x0000, 0x8E25, 0x0000, 0x8E26, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x8E27, 0x0000, 0x0000, 0x8E28, 0x0000, 0x0000, 0x8E29, 0x0000, 0x0000, 0x8E2A, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E2B,
- 0x8E2C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E2D,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E2E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E2F, 0x0000, 0x0000, 0x8E30, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x8E31, 0x0000, 0x8E32, 0x0000, 0x8E33, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E34, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E35, 0x0000, 0x0000,
- 0x8E36, 0x0000, 0x8E37, 0x0000, 0x8E38, 0x0000, 0x8E39, 0x0000, 0x0000, 0x0000, 0x8E3A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E3B, 0x8E3C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x8E3D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E3E, 0x0000, 0x8E3F, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E40, 0x8E41, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x8E42, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x8E43, 0x8E44, 0x0000, 0x8E45, 0x0000, 0x8E46, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E47, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x8E48, 0x8E49, 0x0000, 0x8E4A, 0x8E4B, 0x8E4C, 0x0000, 0x0000, 0x0000, 0x8E4D, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x8E4E, 0x8E4F, 0x0000, 0x0000, 0x8E50, 0x0000, 0x8E51, 0x0000, 0x0000, 0x8E52, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E53, 0x0000, 0x8E54, 0x0000, 0x8E55, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x8E56, 0x8E57, 0x0000, 0x8E58, 0x8E59, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E5A, 0x0000, 0x0000, 0x0000, 0x8E5B, 0x0000, 0x0000,
- 0x8E5C, 0x8E5D, 0x0000, 0x0000, 0x8E5E, 0x8E5F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E60, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x8E61, 0x0000, 0x0000, 0x8E62, 0x8E63, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E64, 0x0000,
- 0x8E65, 0x0000, 0x0000, 0x8E66, 0x8E67, 0x0000, 0x0000, 0x8E68, 0x8E69, 0x8E6A, 0x8E6B, 0x0000, 0x0000, 0x8E6C, 0x8E6D, 0x8E6E,
- 0x8E6F, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E70, 0x0000, 0x0000, 0x8E71, 0x8E72, 0x0000, 0x8E73, 0x0000, 0x8E74, 0x0000, 0x0000,
- 0x0000, 0x8E75, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E76, 0x0000, 0x0000, 0x8E77, 0x8E78, 0x0000, 0x0000, 0x8E79, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x8E7A, 0x0000, 0x8E7B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E7C, 0x8E7D, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E7E, 0x0000, 0x8E7F, 0x0000, 0x8E80, 0x8E81, 0x0000, 0x0000, 0x0000, 0x8E82,
- 0x8E83, 0x0000, 0x0000, 0x8E84, 0x0000, 0x8E85, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E86, 0x0000, 0x0000,
- 0x0000, 0x8E87, 0x0000, 0x8E88, 0x0000, 0x0000, 0x8E89, 0x0000, 0x8E8A, 0x0000, 0x8E8B, 0x8E8C, 0x8E8D, 0x0000, 0x0000, 0x0000,
- 0x8E8E, 0x0000, 0x0000, 0x8E8F, 0x0000, 0x8E90, 0x8E91, 0x0000, 0x8E92, 0x0000, 0x8E93, 0x8E94, 0x8E95, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x8E96, 0x0000, 0x0000, 0x0000, 0x8E97, 0x0000, 0x8E98, 0x0000, 0x8E99, 0x8E9A, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x8E9B, 0x0000, 0x8E9C, 0x0000, 0x8E9D, 0x0000, 0x8E9E, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E9F, 0x0000, 0x0000, 0x8EA0,
- 0x0000, 0x0000, 0x8EA1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8EA2, 0x0000, 0x8EA3,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x8EA4, 0x8EA5, 0x8EA6, 0x0000, 0x8EA7, 0x8EA8, 0x8EA9, 0x0000, 0x0000, 0x0000, 0x8EAA, 0x8EAB,
- 0x8EAC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8EAD, 0x0000, 0x0000, 0x0000, 0x8EAE, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x8EAF, 0x0000, 0x0000, 0x8EB0, 0x0000, 0x8EB1, 0x0000, 0x8EB2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8EB3,
- 0x8EB4, 0x0000, 0x8EB5, 0x0000, 0x0000, 0x8EB6, 0x0000, 0x0000, 0x8EB7, 0x8EB8, 0x8EB9, 0x8EBA, 0x0000, 0x0000, 0x0000, 0x8EBB,
- 0x8EBC, 0x8EBD, 0x8EBE, 0x0000, 0x0000, 0x0000, 0x8EBF, 0x0000, 0x8EC0, 0x8EC1, 0x0000, 0x8EC2, 0x0000, 0x0000, 0x8EC3, 0x8EC4,
- 0x0000, 0x0000, 0x0000, 0x8EC5, 0x0000, 0x0000, 0x8EC6, 0x0000, 0x8EC7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x8EC8, 0x0000, 0x0000, 0x0000, 0x0000, 0x8EC9, 0x8ECA, 0x0000, 0x0000, 0x8ECB, 0x8ECC, 0x0000, 0x8ECD, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x8ECE, 0x0000, 0x0000, 0x0000, 0x8ECF, 0x0000, 0x8ED0, 0x8ED1, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x8ED2, 0x0000, 0x0000, 0x0000, 0x8ED3, 0x8ED4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8ED5, 0x0000, 0x0000, 0x0000,
- 0x8ED6, 0x0000, 0x0000, 0x0000, 0x0000, 0x8ED7, 0x8ED8, 0x0000, 0x0000, 0x0000, 0x8ED9, 0x0000, 0x0000, 0x0000, 0x8EDA, 0x0000,
- 0x0000, 0x0000, 0x8EDB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8EDC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x8EDD, 0x0000, 0x8EDE, 0x0000, 0x8EDF, 0x0000, 0x0000, 0x8EE0, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x8EE1, 0x8EE2, 0x8EE3, 0x0000, 0x0000, 0x8EE4, 0x8EE5, 0x0000, 0x8EE6, 0x8EE7, 0x0000, 0x8EE8, 0x0000, 0x8EE9, 0x0000,
- 0x8EEA, 0x0000, 0x0000, 0x8EEB, 0x0000, 0x8EEC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x8EED, 0x0000, 0x0000, 0x0000, 0x8EEE, 0x8EEF, 0x0000, 0x0000, 0x0000, 0x8EF0, 0x8EF1, 0x0000, 0x0000,
- 0x8EF2, 0x8EF3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8EF4, 0x8EF5, 0x0000, 0x0000, 0x0000, 0x8EF6, 0x8EF7, 0x8EF8, 0x8EF9,
- 0x0000, 0x8EFA, 0x8EFB, 0x0000, 0x8EFC, 0x0000, 0x0000, 0x0000, 0x8EFD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x8EFE, 0x0000, 0x0000, 0x0000, 0x0000, 0x8EFF, 0x0000, 0x0000, 0x0000, 0x8F00, 0x0000, 0x0000, 0x0000, 0x8F01, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x8F02, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x8F03, 0x0000, 0x0000, 0x8F04, 0x8F05, 0x0000, 0x0000, 0x0000, 0x8F06, 0x8F07, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F08, 0x8F09, 0x0000, 0x0000, 0x8F0A, 0x0000, 0x0000, 0x8F0B, 0x0000,
- 0x0000, 0x0000, 0x8F0C, 0x8F0D, 0x0000, 0x8F0E, 0x8F0F, 0x0000, 0x8F10, 0x0000, 0x8F11, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F12,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x8F13, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F14, 0x0000, 0x8F15, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x8F16, 0x0000, 0x0000, 0x0000, 0x8F17, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F18, 0x0000,
- 0x8F19, 0x0000, 0x0000, 0x8F1A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F1B, 0x0000, 0x0000,
- 0x8F1C, 0x8F1D, 0x8F1E, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F1F, 0x0000, 0x8F20, 0x0000, 0x0000, 0x8F21, 0x8F22, 0x8F23, 0x8F24,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F25, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x8F26, 0x0000, 0x8F27, 0x8F28, 0x0000, 0x0000, 0x8F29, 0x0000, 0x8F2A, 0x8F2B, 0x0000, 0x8F2C, 0x8F2D, 0x0000, 0x8F2E, 0x8F2F,
- 0x0000, 0x0000, 0x8F30, 0x8F31, 0x8F32, 0x0000, 0x0000, 0x0000, 0x8F33, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x8F34, 0x0000, 0x8F35, 0x0000, 0x8F36, 0x0000, 0x0000, 0x8F37, 0x8F38, 0x0000, 0x8F39, 0x8F3A, 0x8F3B, 0x0000, 0x0000,
- 0x0000, 0x8F3C, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F3D, 0x0000, 0x0000, 0x8F3E, 0x0000, 0x8F3F, 0x8F40, 0x8F41, 0x8F42, 0x8F43,
- 0x0000, 0x0000, 0x0000, 0x8F44, 0x0000, 0x0000, 0x8F45, 0x8F46, 0x8F47, 0x0000, 0x8F48, 0x8F49, 0x8F4A, 0x0000, 0x0000, 0x0000,
- 0x8F4B, 0x0000, 0x8F4C, 0x8F4D, 0x8F4E, 0x8F4F, 0x8F50, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F51, 0x0000, 0x8F52, 0x0000,
- 0x8F53, 0x8F54, 0x8F55, 0x0000, 0x8F56, 0x8F57, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F58, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F59, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x8F5A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x8F5B, 0x0000, 0x0000, 0x8F5C, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F5D, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F5E, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F5F, 0x8F60, 0x0000, 0x0000, 0x0000, 0x8F61, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F62, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F63, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F64, 0x0000, 0x8F65, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x8F66, 0x0000, 0x0000, 0x8F67, 0x0000, 0x0000, 0x0000, 0x8F68, 0x0000, 0x0000, 0x8F69, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F6A, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F6B, 0x0000, 0x0000, 0x8F6C, 0x0000, 0x8F6D, 0x8F6E, 0x0000, 0x8F6F, 0x0000,
- 0x0000, 0x0000, 0x8F70, 0x8F71, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x8F72, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F73, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x8F74, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F75, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F76, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x8F77, 0x0000, 0x8F78, 0x0000, 0x8F79, 0x0000, 0x8F7A, 0x8F7B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F7C, 0x0000, 0x8F7D, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F7E, 0x0000, 0x8F7F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x8F80, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F81,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F82, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x8F83, 0x0000, 0x8F84, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F85, 0x0000, 0x8F86, 0x8F87, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x8F88, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F89, 0x0000, 0x0000, 0x8F8A, 0x0000, 0x8F8B, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F8C, 0x0000, 0x0000, 0x0000, 0x8F8D,
- 0x0000, 0x8F8E, 0x8F8F, 0x8F90, 0x0000, 0x8F91, 0x8F92, 0x8F93, 0x8F94, 0x0000, 0x8F95, 0x0000, 0x8F96, 0x0000, 0x8F97, 0x8F98,
- 0x8F99, 0x8F9A, 0x8F9B, 0x8F9C, 0x0000, 0x0000, 0x0000, 0x8F9D, 0x8F9E, 0x0000, 0x0000, 0x0000, 0x8F9F, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x8FA0, 0x0000, 0x0000, 0x8FA1, 0x0000, 0x8FA2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8FA3, 0x0000, 0x0000,
- 0x8FA4, 0x0000, 0x8FA5, 0x0000, 0x0000, 0x0000, 0x0000, 0x8FA6, 0x8FA7, 0x8FA8, 0x0000, 0x8FA9, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8FAA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8FAB, 0x8FAC, 0x8FAD, 0x8FAE,
- 0x0000, 0x0000, 0x8FAF, 0x8FB0, 0x0000, 0x0000, 0x0000, 0x0000, 0x8FB1, 0x8FB2, 0x0000, 0x8FB3, 0x0000, 0x0000, 0x8FB4, 0x0000,
- 0x0000, 0x0000, 0x8FB5, 0x0000, 0x0000, 0x8FB6, 0x0000, 0x8FB7, 0x0000, 0x0000, 0x0000, 0x8FB8, 0x8FB9, 0x0000, 0x0000, 0x8FBA,
- 0x8FBB, 0x8FBC, 0x0000, 0x8FBD, 0x8FBE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8FBF, 0x0000, 0x0000, 0x0000, 0x0000, 0x8FC0, 0x8FC1, 0x8FC2,
- 0x0000, 0x8FC3, 0x0000, 0x0000, 0x0000, 0x0000, 0x8FC4, 0x0000, 0x8FC5, 0x0000, 0x8FC6, 0x8FC7, 0x8FC8, 0x0000, 0x0000, 0x0000,
- 0x8FC9, 0x0000, 0x0000, 0x0000, 0x8FCA, 0x0000, 0x8FCB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8FCC, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x8FCD, 0x8FCE, 0x0000, 0x8FCF, 0x0000, 0x0000, 0x0000, 0x8FD0, 0x8FD1, 0x8FD2, 0x0000, 0x8FD3, 0x0000, 0x8FD4,
- 0x0000, 0x0000, 0x8FD5, 0x0000, 0x8FD6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8FD7, 0x8FD8, 0x8FD9, 0x8FDA,
- 0x0000, 0x0000, 0x0000, 0x8FDB, 0x8FDC, 0x8FDD, 0x0000, 0x0000, 0x0000, 0x8FDE, 0x8FDF, 0x0000, 0x8FE0, 0x0000, 0x8FE1, 0x0000,
- 0x0000, 0x8FE2, 0x8FE3, 0x8FE4, 0x0000, 0x0000, 0x8FE5, 0x0000, 0x8FE6, 0x0000, 0x8FE7, 0x8FE8, 0x8FE9, 0x0000, 0x8FEA, 0x0000,
- 0x0000, 0x8FEB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8FEC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x8FED, 0x0000, 0x8FEE, 0x0000, 0x8FEF, 0x8FF0, 0x0000, 0x0000, 0x0000, 0x8FF1, 0x0000, 0x8FF2, 0x0000, 0x8FF3, 0x8FF4,
- 0x0000, 0x8FF5, 0x0000, 0x8FF6, 0x0000, 0x8FF7, 0x0000, 0x0000, 0x8FF8, 0x8FF9, 0x0000, 0x8FFA, 0x8FFB, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x8FFC, 0x0000, 0x0000, 0x0000, 0x0000, 0x8FFD, 0x0000, 0x0000, 0x0000, 0x0000, 0x8FFE, 0x0000, 0x8FFF, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9000, 0x9001, 0x9002, 0x0000,
- 0x0000, 0x9003, 0x0000, 0x9004, 0x9005, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x9006, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x9007, 0x9008, 0x9009, 0x0000, 0x900A, 0x900B, 0x0000, 0x0000, 0x900C, 0x900D, 0x0000, 0x900E, 0x0000, 0x900F, 0x0000, 0x9010,
- 0x0000, 0x0000, 0x9011, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9012, 0x0000, 0x0000,
- 0x9013, 0x9014, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9015, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9016,
- 0x0000, 0x9017, 0x9018, 0x0000, 0x0000, 0x9019, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x901A, 0x901B, 0x901C,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x901D, 0x0000, 0x0000, 0x901E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x901F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9020, 0x0000, 0x9021, 0x9022, 0x0000,
- 0x9023, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9024, 0x9025, 0x9026, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9027, 0x0000,
- 0x9028, 0x9029, 0x902A, 0x902B, 0x902C, 0x902D, 0x0000, 0x0000, 0x0000, 0x0000, 0x902E, 0x0000, 0x902F, 0x9030, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9031, 0x0000, 0x9032, 0x0000, 0x0000, 0x9033, 0x9034, 0x0000, 0x0000, 0x0000, 0x9035,
- 0x0000, 0x0000, 0x9036, 0x0000, 0x9037, 0x9038, 0x9039, 0x0000, 0x0000, 0x0000, 0x903A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x903B,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x903C,
- 0x0000, 0x0000, 0x903D, 0x0000, 0x903E, 0x903F, 0x9040, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9041, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9042, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9043, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x9044, 0x0000, 0x0000, 0x9045, 0x0000, 0x9046, 0x0000, 0x9047, 0x0000, 0x0000, 0x0000, 0x0000, 0x9048, 0x0000,
- 0x0000, 0x9049, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x904A, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x904B, 0x0000, 0x904C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x904D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x904E,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x904F, 0x0000, 0x0000, 0x9050, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x9051, 0x0000, 0x9052, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9053, 0x9054, 0x0000,
- 0x9055, 0x9056, 0x9057, 0x9058, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9059, 0x0000, 0x0000, 0x0000, 0x905A, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x905B, 0x0000, 0x0000, 0x0000, 0x905C, 0x905D, 0x0000, 0x905E, 0x905F, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x9060, 0x9061, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9062, 0x0000, 0x9063, 0x9064, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x9065, 0x9066, 0x9067, 0x9068, 0x0000, 0x0000, 0x0000, 0x9069, 0x0000, 0x906A, 0x0000, 0x0000,
- 0x0000, 0x906B, 0x906C, 0x0000, 0x906D, 0x0000, 0x0000, 0x906E, 0x906F, 0x0000, 0x9070, 0x9071, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x9072, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9073, 0x0000, 0x9074,
- 0x0000, 0x0000, 0x9075, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9076, 0x9077, 0x0000, 0x0000, 0x0000, 0x9078, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x9079, 0x907A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x907B, 0x0000, 0x0000, 0x907C,
- 0x0000, 0x0000, 0x0000, 0x907D, 0x0000, 0x907E, 0x0000, 0x0000, 0x907F, 0x9080, 0x0000, 0x0000, 0x0000, 0x9081, 0x9082, 0x0000,
- 0x0000, 0x9083, 0x9084, 0x0000, 0x0000, 0x0000, 0x0000, 0x9085, 0x0000, 0x9086, 0x9087, 0x9088, 0x0000, 0x0000, 0x9089, 0x0000,
- 0x0000, 0x0000, 0x908A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x908B, 0x908C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x908D, 0x0000, 0x908E, 0x0000, 0x908F, 0x9090, 0x9091, 0x0000, 0x0000, 0x0000, 0x0000, 0x9092, 0x0000, 0x9093,
- 0x9094, 0x0000, 0x0000, 0x9095, 0x0000, 0x0000, 0x0000, 0x9096, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9097, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9098, 0x9099, 0x0000, 0x909A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x909B, 0x0000, 0x909C, 0x0000, 0x909D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x909E, 0x909F, 0x90A0, 0x0000, 0x90A1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90A2, 0x90A3, 0x0000, 0x90A4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x90A5, 0x0000, 0x0000, 0x90A6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90A7, 0x0000, 0x90A8, 0x90A9, 0x90AA,
- 0x0000, 0x0000, 0x0000, 0x90AB, 0x0000, 0x0000, 0x90AC, 0x0000, 0x90AD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90AE,
- 0x90AF, 0x0000, 0x0000, 0x0000, 0x90B0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90B1, 0x0000, 0x0000, 0x0000, 0x90B2,
- 0x0000, 0x0000, 0x90B3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x90B4, 0x90B5, 0x90B6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90B7, 0x90B8, 0x0000, 0x0000,
- 0x90B9, 0x90BA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90BB, 0x0000, 0x90BC, 0x0000, 0x0000, 0x90BD,
- 0x0000, 0x0000, 0x90BE, 0x0000, 0x0000, 0x0000, 0x0000, 0x90BF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90C0, 0x0000, 0x90C1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x90C2, 0x0000, 0x0000, 0x90C3, 0x0000, 0x90C4, 0x0000, 0x90C5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x90C6, 0x0000, 0x0000, 0x90C7, 0x90C8, 0x0000, 0x0000, 0x0000, 0x90C9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90CA,
- 0x0000, 0x0000, 0x90CB, 0x0000, 0x90CC, 0x0000, 0x0000, 0x0000, 0x0000, 0x90CD, 0x90CE, 0x90CF, 0x90D0, 0x0000, 0x0000, 0x90D1,
- 0x0000, 0x90D2, 0x90D3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x90D4, 0x0000, 0x0000, 0x90D5, 0x90D6, 0x0000, 0x90D7, 0x90D8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90D9, 0x90DA, 0x0000, 0x0000, 0x0000, 0x0000, 0x90DB, 0x0000, 0x0000, 0x0000, 0x90DC,
- 0x0000, 0x0000, 0x90DD, 0x0000, 0x90DE, 0x0000, 0x0000, 0x0000, 0x90DF, 0x90E0, 0x90E1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90E2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90E3, 0x0000, 0x0000, 0x90E4, 0x0000, 0x90E5, 0x90E6, 0x0000, 0x90E7, 0x90E8, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90E9, 0x0000, 0x0000, 0x0000, 0x0000, 0x90EA, 0x0000, 0x90EB, 0x90EC, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90ED, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90EE, 0x0000, 0x0000, 0x0000, 0x90EF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x90F0, 0x90F1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90F2, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x90F3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90F4, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90F5, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90F6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x90F7, 0x0000, 0x90F8, 0x90F9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90FA, 0x0000, 0x90FB,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90FC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x90FD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90FE, 0x90FF, 0x0000, 0x0000, 0x9100, 0x9101,
- 0x0000, 0x0000, 0x9102, 0x0000, 0x9103, 0x9104, 0x0000, 0x0000, 0x0000, 0x9105, 0x0000, 0x0000, 0x9106, 0x0000, 0x0000, 0x9107,
- 0x9108, 0x9109, 0x0000, 0x0000, 0x0000, 0x0000, 0x910A, 0x0000, 0x0000, 0x0000, 0x910B, 0x0000, 0x910C, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x910D, 0x0000, 0x0000, 0x0000, 0x0000, 0x910E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x910F, 0x9110, 0x0000,
- 0x9111, 0x0000, 0x0000, 0x0000, 0x9112, 0x9113, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9114, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x9115, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x9116, 0x9117, 0x9118, 0x9119, 0x911A, 0x911B, 0x911C, 0x911D, 0x911E, 0x911F, 0x9120, 0x9121, 0x9122, 0x9123, 0x9124, 0x9125,
- 0x9126, 0x9127, 0x9128, 0x9129, 0x912A, 0x912B, 0x912C, 0x912D, 0x912E, 0x912F, 0x9130, 0x9131, 0x9132, 0x9133, 0x9134, 0x9135,
- 0x9136, 0x9137, 0x9138, 0x9139, 0x913A, 0x913B, 0x913C, 0x913D, 0x913E, 0x913F, 0x9140, 0x9141, 0x9142, 0x9143, 0x9144, 0x9145,
- 0x9146, 0x9147, 0x9148, 0x9149, 0x914A, 0x914B, 0x914C, 0x914D, 0x914E, 0x914F, 0x9150, 0x9151, 0x9152, 0x9153, 0x9154, 0x9155,
- 0x9156, 0x9157, 0x9158, 0x9159, 0x915A, 0x915B, 0x915C, 0x915D, 0x915E, 0x915F, 0x9160, 0x9161, 0x9162, 0x9163, 0x9164, 0x9165,
- 0x9166, 0x9167, 0x9168, 0x9169, 0x916A, 0x916B, 0x916C, 0x916D, 0x916E, 0x916F, 0x9170, 0x9171, 0x9172, 0x9173, 0x9174, 0x9175,
- 0x9176, 0x9177, 0x9178, 0x9179, 0x917A, 0x917B, 0x917C, 0x917D, 0x917E, 0x917F, 0x9180, 0x9181, 0x9182, 0x9183, 0x9184, 0x9185,
- 0x9186, 0x9187, 0x9188, 0x9189, 0x918A, 0x918B, 0x918C, 0x918D, 0x918E, 0x918F, 0x9190, 0x9191, 0x9192, 0x9193, 0x9194, 0x9195,
- 0x9196, 0x9197, 0x9198, 0x9199, 0x919A, 0x919B, 0x919C, 0x919D, 0x919E, 0x919F, 0x91A0, 0x91A1, 0x91A2, 0x91A3, 0x91A4, 0x91A5,
- 0x91A6, 0x91A7, 0x91A8, 0x91A9, 0x91AA, 0x91AB, 0x91AC, 0x91AD, 0x91AE, 0x91AF, 0x91B0, 0x91B1, 0x91B2, 0x91B3, 0x91B4, 0x91B5,
- 0x91B6, 0x91B7, 0x91B8, 0x91B9, 0x91BA, 0x91BB, 0x91BC, 0x91BD, 0x91BE, 0x91BF, 0x91C0, 0x91C1, 0x91C2, 0x91C3, 0x91C4, 0x91C5,
- 0x91C6, 0x91C7, 0x91C8, 0x91C9, 0x91CA, 0x91CB, 0x91CC, 0x91CD, 0x91CE, 0x91CF, 0x91D0, 0x91D1, 0x91D2, 0x91D3, 0x91D4, 0x91D5,
- 0x91D6, 0x91D7, 0x91D8, 0x91D9, 0x91DA, 0x91DB, 0x91DC, 0x91DD, 0x91DE, 0x91DF, 0x91E0, 0x91E1, 0x91E2, 0x91E3, 0x91E4, 0x91E5,
- 0x91E6, 0x91E7, 0x91E8, 0x91E9, 0x91EA, 0x91EB, 0x91EC, 0x91ED, 0x91EE, 0x91EF, 0x91F0, 0x91F1, 0x91F2, 0x91F3, 0x91F4, 0x91F5,
- 0x91F6, 0x91F7, 0x91F8, 0x91F9, 0x91FA, 0x91FB, 0x91FC, 0x91FD, 0x91FE, 0x91FF, 0x9200, 0x9201, 0x9202, 0x9203, 0x9204, 0x9205,
- 0x9206, 0x9207, 0x9208, 0x9209, 0x920A, 0x920B, 0x920C, 0x920D, 0x920E, 0x920F, 0x9210, 0x9211, 0x9212, 0x9213, 0x9214, 0x9215,
- 0x9216, 0x9217, 0x9218, 0x9219, 0x921A, 0x921B, 0x921C, 0x921D, 0x921E, 0x921F, 0x9220, 0x9221, 0x9222, 0x9223, 0x0000, 0x0000,
- 0x9224, 0x0000, 0x9225, 0x0000, 0x0000, 0x9226, 0x9227, 0x9228, 0x9229, 0x922A, 0x922B, 0x922C, 0x922D, 0x922E, 0x922F, 0x0000,
- 0x9230, 0x0000, 0x9231, 0x0000, 0x0000, 0x9232, 0x9233, 0x0000, 0x0000, 0x0000, 0x9234, 0x9235, 0x9236, 0x9237, 0x0000, 0x0000,
- 0x9238, 0x9239, 0x923A, 0x923B, 0x923C, 0x923D, 0x923E, 0x923F, 0x9240, 0x9241, 0x9242, 0x9243, 0x9244, 0x9245, 0x9246, 0x9247,
- 0x9248, 0x9249, 0x924A, 0x924B, 0x924C, 0x924D, 0x924E, 0x924F, 0x9250, 0x9251, 0x9252, 0x9253, 0x9254, 0x9255, 0x9256, 0x9257,
- 0x9258, 0x9259, 0x925A, 0x925B, 0x925C, 0x925D, 0x925E, 0x925F, 0x9260, 0x9261, 0x9262, 0x9263, 0x9264, 0x9265, 0x9266, 0x9267,
- 0x9268, 0x9269, 0x926A, 0x926B, 0x926C, 0x926D, 0x926E, 0x926F, 0x9270, 0x9271, 0x9272, 0x9273, 0x0000, 0x9274, 0x0000, 0x0000,
- 0x9275, 0x9276, 0x9277, 0x9278, 0x9279, 0x927A, 0x927B, 0x927C, 0x927D, 0x927E, 0x927F, 0x9280, 0x9281, 0x9282, 0x9283, 0x9284,
- 0x9285, 0x9286, 0x9287, 0x9288, 0x9289, 0x928A, 0x928B, 0x928C, 0x928D, 0x928E, 0x928F, 0x9290, 0x9291, 0x9292, 0x9293, 0x9294,
- 0x9295, 0x9296, 0x9297, 0x9298, 0x9299, 0x929A, 0x929B, 0x929C, 0x929D, 0x929E, 0x929F, 0x92A0, 0x92A1, 0x92A2, 0x92A3, 0x92A4,
- 0x92A5, 0x92A6, 0x92A7, 0x92A8, 0x92A9, 0x92AA, 0x92AB, 0x92AC, 0x92AD, 0x92AE, 0x92AF, 0x92B0, 0x92B1, 0x92B2, 0x92B3, 0x92B4,
- 0x92B5, 0x92B6, 0x92B7, 0x92B8, 0x92B9, 0x92BA, 0x92BB, 0x92BC, 0x92BD, 0x92BE, 0x92BF, 0x92C0, 0x92C1, 0x92C2, 0x92C3, 0x92C4,
- 0x92C5, 0x92C6, 0x92C7, 0x92C8, 0x92C9, 0x92CA, 0x92CB, 0x92CC, 0x92CD, 0x92CE, 0x92CF, 0x92D0, 0x92D1, 0x92D2, 0x92D3, 0x0000,
- 0x0000, 0x0000, 0x92D4, 0x92D5, 0x92D6, 0x0000, 0x0000, 0x0000, 0x92D7, 0x92D8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x23AC, 0x23AE, 0x23B0, 0x3312, 0x3315, 0x23B2, 0x23B4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x23B6, 0x23B8, 0x23BA, 0x23BC, 0x23BE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x23C0, 0x0000, 0x23C2,
- 0x92D9, 0x92DA, 0x92DB, 0x92DC, 0x92DD, 0x92DE, 0x92DF, 0x92E0, 0x92E1, 0x92E2, 0x23C4, 0x23C6, 0x23C8, 0x23CA, 0x23CC, 0x23CE,
- 0x23D0, 0x23D2, 0x23D4, 0x23D6, 0x23D8, 0x23DA, 0x23DC, 0x0000, 0x23DE, 0x23E0, 0x23E2, 0x23E4, 0x23E6, 0x0000, 0x23E8, 0x0000,
- 0x23EA, 0x23EC, 0x0000, 0x23EE, 0x23F0, 0x0000, 0x23F2, 0x23F4, 0x23F6, 0x23F8, 0x23FA, 0x23FC, 0x23FE, 0x2400, 0x2402, 0x2404,
- 0x92E3, 0x92E4, 0x92E5, 0x92E6, 0x92E7, 0x92E8, 0x92E9, 0x92EA, 0x92EB, 0x92EC, 0x92ED, 0x92EE, 0x92EF, 0x92F0, 0x92F1, 0x92F2,
- 0x92F3, 0x92F4, 0x92F5, 0x92F6, 0x92F7, 0x92F8, 0x92F9, 0x92FA, 0x92FB, 0x92FC, 0x92FD, 0x92FE, 0x92FF, 0x9300, 0x9301, 0x9302,
- 0x9303, 0x9304, 0x9305, 0x9306, 0x9307, 0x9308, 0x9309, 0x930A, 0x930B, 0x930C, 0x930D, 0x930E, 0x930F, 0x9310, 0x9311, 0x9312,
- 0x9313, 0x9314, 0x9315, 0x9316, 0x9317, 0x9318, 0x9319, 0x931A, 0x931B, 0x931C, 0x931D, 0x931E, 0x931F, 0x9320, 0x9321, 0x9322,
- 0x9323, 0x9324, 0x9325, 0x9326, 0x9327, 0x9328, 0x9329, 0x932A, 0x932B, 0x932C, 0x932D, 0x932E, 0x932F, 0x9330, 0x9331, 0x9332,
- 0x9333, 0x9334, 0x9335, 0x9336, 0x9337, 0x9338, 0x9339, 0x933A, 0x933B, 0x933C, 0x933D, 0x933E, 0x933F, 0x9340, 0x9341, 0x9342,
- 0x9343, 0x9344, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x9345, 0x9346, 0x9347, 0x9348, 0x9349, 0x934A, 0x934B, 0x934C, 0x934D, 0x934E, 0x934F, 0x9350, 0x9351,
- 0x9352, 0x9353, 0x9354, 0x9355, 0x9356, 0x9357, 0x9358, 0x9359, 0x935A, 0x935B, 0x2406, 0x2408, 0x240A, 0x240C, 0x240E, 0x2410,
- 0x2412, 0x2414, 0x2416, 0x2418, 0x241A, 0x241C, 0x241E, 0x2420, 0x2422, 0x2424, 0x2426, 0x2428, 0x935C, 0x935D, 0x935E, 0x935F,
- 0x242A, 0x242C, 0x242E, 0x2430, 0x2432, 0x2434, 0x2436, 0x2438, 0x243A, 0x243C, 0x243E, 0x2440, 0x2442, 0x2444, 0x2446, 0x2448,
- 0x244A, 0x244C, 0x244E, 0x2450, 0x2452, 0x2454, 0x2456, 0x2458, 0x245A, 0x245C, 0x245E, 0x2460, 0x2462, 0x2464, 0x2466, 0x2468,
- 0x246A, 0x246C, 0x246E, 0x2470, 0x2472, 0x2474, 0x2476, 0x2478, 0x247A, 0x247C, 0x247E, 0x2480, 0x2482, 0x2484, 0x2486, 0x2488,
- 0x248A, 0x248C, 0x248E, 0x2490, 0x2492, 0x2494, 0x2496, 0x2498, 0x249A, 0x249C, 0x249E, 0x24A0, 0x24A2, 0x24A4, 0x24A6, 0x24A8,
- 0x24AA, 0x24AC, 0x24AE, 0x24B0, 0x24B2, 0x24B4, 0x24B6, 0x24B8, 0x24BA, 0x24BC, 0x24BE, 0x24C0, 0x24C2, 0x24C4, 0x24C6, 0x24C8,
- 0x24CA, 0x24CC, 0x24CE, 0x24D0, 0x24D2, 0x24D4, 0x24D6, 0x24D8, 0x24DA, 0x24DC, 0x24DE, 0x24E0, 0x24E2, 0x24E4, 0x24E6, 0x24E8,
- 0x24EA, 0x24EC, 0x24EE, 0x24F0, 0x24F2, 0x24F4, 0x24F6, 0x24F8, 0x24FA, 0x24FC, 0x24FE, 0x2500, 0x2502, 0x2504, 0x2506, 0x2508,
- 0x250A, 0x250C, 0x250E, 0x2510, 0x2512, 0x2514, 0x2516, 0x2518, 0x251A, 0x251C, 0x251E, 0x2520, 0x2522, 0x2524, 0x2526, 0x2528,
- 0x252A, 0x252C, 0x252E, 0x2530, 0x2532, 0x2534, 0x2536, 0x2538, 0x253A, 0x253C, 0x253E, 0x2540, 0x2542, 0x2544, 0x2546, 0x2548,
- 0x254A, 0x254C, 0x254E, 0x2550, 0x2552, 0x2554, 0x2556, 0x2558, 0x255A, 0x255C, 0x255E, 0x2560, 0x2562, 0x2564, 0x2566, 0x2568,
- 0x256A, 0x256C, 0x256E, 0x2570, 0x2572, 0x2574, 0x2576, 0x2578, 0x257A, 0x257C, 0x257E, 0x2580, 0x2582, 0x2584, 0x2586, 0x2588,
- 0x258A, 0x258C, 0x258E, 0x2590, 0x2592, 0x2594, 0x2596, 0x2598, 0x259A, 0x259C, 0x259E, 0x25A0, 0x25A2, 0x25A4, 0x25A6, 0x25A8,
- 0x25AA, 0x25AC, 0x25AE, 0x25B0, 0x25B2, 0x25B4, 0x25B6, 0x25B8, 0x25BA, 0x25BC, 0x25BE, 0x25C0, 0x25C2, 0x25C4, 0x25C6, 0x25C8,
- 0x25CA, 0x25CC, 0x25CE, 0x25D0, 0x25D2, 0x25D4, 0x25D6, 0x25D8, 0x25DA, 0x25DC, 0x25DE, 0x25E0, 0x25E2, 0x25E4, 0x25E6, 0x25E8,
- 0x25EA, 0x25EC, 0x25EE, 0x25F0, 0x25F2, 0x25F4, 0x25F6, 0x25F8, 0x25FA, 0x25FC, 0x25FE, 0x2600, 0x2602, 0x2604, 0x2606, 0x2608,
- 0x260A, 0x260C, 0x3318, 0x331B, 0x331E, 0x260E, 0x2610, 0x2612, 0x2614, 0x2616, 0x2618, 0x261A, 0x261C, 0x261E, 0x2620, 0x2622,
- 0x2624, 0x2626, 0x2628, 0x262A, 0x262C, 0x262E, 0x2630, 0x2632, 0x2634, 0x2636, 0x2638, 0x263A, 0x263C, 0x263E, 0x2640, 0x2642,
- 0x2644, 0x2646, 0x2648, 0x264A, 0x264C, 0x264E, 0x2650, 0x2652, 0x2654, 0x2656, 0x2658, 0x265A, 0x265C, 0x265E, 0x2660, 0x2662,
- 0x2664, 0x2666, 0x2668, 0x266A, 0x266C, 0x266E, 0x2670, 0x2672, 0x2674, 0x2676, 0x2678, 0x267A, 0x267C, 0x267E, 0x2680, 0x2682,
- 0x2684, 0x2686, 0x2688, 0x268A, 0x268C, 0x268E, 0x2690, 0x2692, 0x2694, 0x2696, 0x2698, 0x269A, 0x269C, 0x269E, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x3321, 0x3324, 0x3327, 0x332A, 0x332D, 0x3330, 0x3333, 0x3336, 0x3339, 0x333C, 0x333F, 0x3342, 0x3345, 0x3348, 0x334B, 0x334E,
- 0x3351, 0x3354, 0x3357, 0x335A, 0x335D, 0x3360, 0x3363, 0x3366, 0x3369, 0x336C, 0x336F, 0x3372, 0x3375, 0x3378, 0x337B, 0x337E,
- 0x3381, 0x3384, 0x3387, 0x338A, 0x338D, 0x3390, 0x3393, 0x3396, 0x3399, 0x339C, 0x339F, 0x33A2, 0x33A5, 0x33A8, 0x33AB, 0x33AE,
- 0x33B1, 0x33B4, 0x33B7, 0x33BA, 0x33BD, 0x33C0, 0x33C3, 0x33C6, 0x33C9, 0x33CC, 0x33CF, 0x33D2, 0x33D5, 0x33D8, 0x33DB, 0x33DE,
- 0x0000, 0x0000, 0x33E1, 0x33E4, 0x33E7, 0x33EA, 0x33ED, 0x33F0, 0x33F3, 0x33F6, 0x33F9, 0x33FC, 0x33FF, 0x3402, 0x3405, 0x3408,
- 0x340B, 0x340E, 0x3411, 0x3414, 0x3417, 0x341A, 0x341D, 0x3420, 0x3423, 0x3426, 0x3429, 0x342C, 0x342F, 0x3432, 0x3435, 0x3438,
- 0x343B, 0x343E, 0x3441, 0x3444, 0x3447, 0x344A, 0x344D, 0x3450, 0x3453, 0x3456, 0x3459, 0x345C, 0x345F, 0x3462, 0x3465, 0x3468,
- 0x346B, 0x346E, 0x3471, 0x3474, 0x3477, 0x347A, 0x347D, 0x3480, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x3483, 0x3486, 0x41A4, 0x41A9, 0x41AE, 0x41B3, 0x41B8, 0x41BD, 0x41C2, 0x3489, 0x41C7, 0x41DA, 0x41E3, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x9360, 0x9361, 0x9362, 0x9363, 0x9364, 0x9365, 0x9366, 0x9367, 0x9368, 0x9369, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x936A, 0x936B, 0x936C, 0x936D, 0x936E, 0x936F, 0x9370, 0x9371, 0x9372, 0x9373, 0x9374, 0x9375, 0x9376, 0x9377, 0x9378, 0x9379,
- 0x937A, 0x937B, 0x937C, 0x937D, 0x937E, 0x0000, 0x0000, 0x937F, 0x9380, 0x9381, 0x9382, 0x9383, 0x9384, 0x9385, 0x9386, 0x9387,
- 0x9388, 0x9389, 0x938A, 0x0000, 0x938B, 0x938C, 0x938D, 0x938E, 0x938F, 0x9390, 0x9391, 0x9392, 0x9393, 0x9394, 0x9395, 0x9396,
- 0x9397, 0x9398, 0x9399, 0x939A, 0x939B, 0x939C, 0x939D, 0x0000, 0x939E, 0x939F, 0x93A0, 0x93A1, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x93A2, 0x26A0, 0x93A3, 0x0000, 0x93A4, 0x0000, 0x93A5, 0x26A2, 0x93A6, 0x26A4, 0x93A7, 0x26A6, 0x93A8, 0x26A8, 0x93A9, 0x26AA,
- 0x93AA, 0x93AB, 0x93AC, 0x93AD, 0x93AE, 0x93AF, 0x93B0, 0x93B1, 0x93B2, 0x93B3, 0x93B4, 0x93B5, 0x93B6, 0x93B7, 0x93B8, 0x93B9,
- 0x93BA, 0x93BB, 0x93BC, 0x93BD, 0x93BE, 0x93BF, 0x93C0, 0x93C1, 0x93C2, 0x93C3, 0x93C4, 0x93C5, 0x93C6, 0x93C7, 0x93C8, 0x93C9,
- 0x93CA, 0x93CB, 0x93CC, 0x93CD, 0x93CE, 0x93CF, 0x93D0, 0x93D1, 0x93D2, 0x93D3, 0x93D4, 0x93D5, 0x93D6, 0x93D7, 0x93D8, 0x93D9,
- 0x93DA, 0x93DB, 0x93DC, 0x93DD, 0x93DE, 0x93DF, 0x93E0, 0x93E1, 0x93E2, 0x93E3, 0x93E4, 0x93E5, 0x93E6, 0x93E7, 0x93E8, 0x93E9,
- 0x93EA, 0x93EB, 0x93EC, 0x93ED, 0x93EE, 0x93EF, 0x93F0, 0x93F1, 0x93F2, 0x93F3, 0x93F4, 0x93F5, 0x93F6, 0x93F7, 0x93F8, 0x93F9,
- 0x93FA, 0x93FB, 0x93FC, 0x93FD, 0x93FE, 0x93FF, 0x9400, 0x9401, 0x9402, 0x9403, 0x9404, 0x9405, 0x9406, 0x9407, 0x9408, 0x9409,
- 0x940A, 0x940B, 0x940C, 0x940D, 0x940E, 0x940F, 0x9410, 0x9411, 0x9412, 0x9413, 0x9414, 0x9415, 0x9416, 0x9417, 0x9418, 0x9419,
- 0x941A, 0x941B, 0x941C, 0x941D, 0x941E, 0x26AC, 0x26AE, 0x26B0, 0x26B2, 0x26B4, 0x26B6, 0x26B8, 0x26BA, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x941F, 0x9420, 0x9421, 0x9422, 0x9423, 0x9424, 0x9425, 0x9426, 0x9427, 0x9428, 0x9429, 0x942A, 0x942B, 0x942C, 0x942D,
- 0x942E, 0x942F, 0x9430, 0x9431, 0x9432, 0x9433, 0x9434, 0x9435, 0x9436, 0x9437, 0x9438, 0x9439, 0x943A, 0x943B, 0x943C, 0x943D,
- 0x943E, 0x943F, 0x9440, 0x9441, 0x9442, 0x9443, 0x9444, 0x9445, 0x9446, 0x9447, 0x9448, 0x9449, 0x944A, 0x944B, 0x944C, 0x944D,
- 0x944E, 0x944F, 0x9450, 0x9451, 0x9452, 0x9453, 0x9454, 0x9455, 0x9456, 0x9457, 0x9458, 0x9459, 0x945A, 0x945B, 0x945C, 0x945D,
- 0x945E, 0x945F, 0x9460, 0x9461, 0x9462, 0x9463, 0x9464, 0x9465, 0x9466, 0x9467, 0x9468, 0x9469, 0x946A, 0x946B, 0x946C, 0x946D,
- 0x946E, 0x946F, 0x9470, 0x9471, 0x9472, 0x9473, 0x9474, 0x9475, 0x9476, 0x9477, 0x9478, 0x9479, 0x947A, 0x947B, 0x947C, 0x947D,
- 0x947E, 0x947F, 0x9480, 0x9481, 0x9482, 0x9483, 0x9484, 0x9485, 0x9486, 0x9487, 0x9488, 0x9489, 0x948A, 0x948B, 0x948C, 0x948D,
- 0x948E, 0x948F, 0x9490, 0x9491, 0x9492, 0x9493, 0x9494, 0x9495, 0x9496, 0x9497, 0x9498, 0x9499, 0x949A, 0x949B, 0x949C, 0x949D,
- 0x949E, 0x949F, 0x94A0, 0x94A1, 0x94A2, 0x94A3, 0x94A4, 0x94A5, 0x94A6, 0x94A7, 0x94A8, 0x94A9, 0x94AA, 0x94AB, 0x94AC, 0x94AD,
- 0x94AE, 0x94AF, 0x94B0, 0x94B1, 0x94B2, 0x94B3, 0x94B4, 0x94B5, 0x94B6, 0x94B7, 0x94B8, 0x94B9, 0x94BA, 0x94BB, 0x94BC, 0x94BD,
- 0x94BE, 0x94BF, 0x94C0, 0x94C1, 0x94C2, 0x94C3, 0x94C4, 0x94C5, 0x94C6, 0x94C7, 0x94C8, 0x94C9, 0x94CA, 0x94CB, 0x94CC, 0x94CD,
- 0x94CE, 0x94CF, 0x94D0, 0x94D1, 0x94D2, 0x94D3, 0x94D4, 0x94D5, 0x94D6, 0x94D7, 0x94D8, 0x94D9, 0x94DA, 0x94DB, 0x94DC, 0x0000,
- 0x0000, 0x0000, 0x94DD, 0x94DE, 0x94DF, 0x94E0, 0x94E1, 0x94E2, 0x0000, 0x0000, 0x94E3, 0x94E4, 0x94E5, 0x94E6, 0x94E7, 0x94E8,
- 0x0000, 0x0000, 0x94E9, 0x94EA, 0x94EB, 0x94EC, 0x94ED, 0x94EE, 0x0000, 0x0000, 0x94EF, 0x94F0, 0x94F1, 0x0000, 0x0000, 0x0000,
- 0x94F2, 0x94F3, 0x94F4, 0x94F5, 0x94F6, 0x94F7, 0x94F8, 0x0000, 0x94F9, 0x94FA, 0x94FB, 0x94FC, 0x94FD, 0x94FE, 0x94FF, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
-};
-extern const FX_WCHAR g_UnicodeData_Normalization_Map1[5376] = {
- 0x0066, 0x0053, 0x0053, 0x0059, 0x0020, 0x0308, 0x0061, 0x0052, 0x0304, 0x0032, 0x0033, 0x0301, 0x03BC, 0x0327, 0x0031, 0x006F,
- 0x0041, 0x0041, 0x0041, 0x0041, 0x0041, 0x0041, 0x0043, 0x0045, 0x0045, 0x0045, 0x0045, 0x0049, 0x0049, 0x0049, 0x0049, 0x0044,
- 0x004E, 0x004F, 0x004F, 0x004F, 0x004F, 0x004F, 0x004F, 0x0055, 0x0055, 0x0055, 0x0055, 0x0059, 0x0061, 0x0061, 0x0061, 0x0061,
- 0x0061, 0x0061, 0x0063, 0x0065, 0x0065, 0x0065, 0x0065, 0x0069, 0x0069, 0x0069, 0x0069, 0x006E, 0x006F, 0x006F, 0x006F, 0x006F,
- 0x006F, 0x006F, 0x0075, 0x0075, 0x0075, 0x0075, 0x0079, 0x0079, 0x0041, 0x0061, 0x0041, 0x0061, 0x0041, 0x0061, 0x0043, 0x0063,
- 0x0043, 0x0063, 0x0043, 0x0063, 0x0043, 0x0063, 0x0044, 0x0064, 0x0044, 0x0064, 0x0045, 0x0065, 0x0045, 0x0065, 0x0045, 0x0065,
- 0x0045, 0x0065, 0x0045, 0x0065, 0x0047, 0x0067, 0x0047, 0x0067, 0x0047, 0x0067, 0x0047, 0x0067, 0x0048, 0x0068, 0x0048, 0x0068,
- 0x0049, 0x0069, 0x0049, 0x0069, 0x0049, 0x0069, 0x0049, 0x0069, 0x0049, 0x004A, 0x006A, 0x004B, 0x006B, 0x004B, 0x004C, 0x006C,
- 0x004C, 0x006C, 0x004C, 0x006C, 0x004C, 0x006C, 0x004C, 0x006C, 0x004E, 0x006E, 0x004E, 0x006E, 0x004E, 0x006E, 0x006E, 0x004F,
- 0x006F, 0x004F, 0x006F, 0x004F, 0x006F, 0x0052, 0x0072, 0x0052, 0x0072, 0x0052, 0x0072, 0x0053, 0x0073, 0x0053, 0x0073, 0x0053,
- 0x0073, 0x0053, 0x0073, 0x0054, 0x0074, 0x0054, 0x0074, 0x0054, 0x0074, 0x0055, 0x0075, 0x0055, 0x0075, 0x0055, 0x0075, 0x0055,
- 0x0075, 0x0055, 0x0075, 0x0055, 0x0075, 0x0057, 0x0077, 0x0059, 0x0079, 0x0059, 0x005A, 0x007A, 0x005A, 0x007A, 0x005A, 0x007A,
- 0x0073, 0x0062, 0x0042, 0x0042, 0x0062, 0x0043, 0x0063, 0x0044, 0x0044, 0x0044, 0x0064, 0x0045, 0x0045, 0x0046, 0x0066, 0x0047,
- 0x0049, 0x004B, 0x006B, 0x006C, 0x004D, 0x004E, 0x006E, 0x004F, 0x004F, 0x006F, 0x0050, 0x0070, 0x0283, 0x0074, 0x0054, 0x0074,
- 0x0054, 0x0055, 0x0075, 0x0056, 0x0059, 0x0079, 0x005A, 0x007A, 0x01B7, 0x0041, 0x0061, 0x0049, 0x0069, 0x004F, 0x006F, 0x0055,
- 0x0075, 0x00DC, 0x00FC, 0x00DC, 0x00FC, 0x00DC, 0x00FC, 0x00DC, 0x00FC, 0x0065, 0x0041, 0x0061, 0x0041, 0x0061, 0x00C6, 0x00E6,
- 0x0047, 0x0067, 0x0047, 0x0067, 0x004B, 0x006B, 0x004F, 0x006F, 0x01EA, 0x01EB, 0x01B7, 0x0292, 0x006A, 0x0047, 0x0067, 0x004E,
- 0x006E, 0x0041, 0x0061, 0x00C6, 0x00E6, 0x00D8, 0x00F8, 0x0041, 0x0061, 0x0041, 0x0061, 0x0045, 0x0065, 0x0045, 0x0065, 0x0049,
- 0x0069, 0x0049, 0x0069, 0x004F, 0x006F, 0x004F, 0x006F, 0x0052, 0x0072, 0x0052, 0x0072, 0x0055, 0x0075, 0x0055, 0x0075, 0x0053,
- 0x0073, 0x0054, 0x0074, 0x0048, 0x0068, 0x004E, 0x0064, 0x005A, 0x007A, 0x0041, 0x0061, 0x0045, 0x0065, 0x00D6, 0x00F6, 0x00D5,
- 0x00F5, 0x004F, 0x006F, 0x022E, 0x022F, 0x0059, 0x0079, 0x006C, 0x006E, 0x0074, 0x006A, 0x0041, 0x0043, 0x0063, 0x004C, 0x0054,
- 0x0053, 0x005A, 0x0042, 0x0055, 0x0056, 0x0045, 0x0065, 0x004A, 0x006A, 0x0051, 0x0071, 0x0052, 0x0072, 0x0059, 0x0079, 0x0061,
- 0x0251, 0x0062, 0x006F, 0x0063, 0x0064, 0x0064, 0x0065, 0x0259, 0x0065, 0x0065, 0x0065, 0x0065, 0x006A, 0x0067, 0x0067, 0x0047,
- 0x0068, 0x0068, 0x0069, 0x0049, 0x006C, 0x006C, 0x006C, 0x006D, 0x006D, 0x006D, 0x006E, 0x006E, 0x006E, 0x006F, 0x0072, 0x0072,
- 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0052, 0x0052, 0x0073, 0x006A, 0x0283, 0x0283, 0x0074, 0x0074, 0x0055, 0x0076, 0x0076,
- 0x0077, 0x0079, 0x0059, 0x007A, 0x007A, 0x0292, 0x0043, 0x0042, 0x0065, 0x0047, 0x0048, 0x006A, 0x006B, 0x004C, 0x0071, 0x0068,
- 0x0068, 0x0068, 0x0068, 0x006A, 0x0072, 0x0279, 0x027B, 0x0281, 0x0077, 0x0079, 0x0263, 0x006C, 0x0073, 0x0078, 0x0295, 0x0300,
- 0x0301, 0x0313, 0x0308, 0x0061, 0x0065, 0x0069, 0x006F, 0x0075, 0x0063, 0x0064, 0x0068, 0x006D, 0x0072, 0x0074, 0x0076, 0x0078,
- 0x02B9, 0x003B, 0x0020, 0x00A8, 0x0391, 0x00B7, 0x0395, 0x0397, 0x0399, 0x039F, 0x03A5, 0x03A9, 0x03CA, 0x0399, 0x03A5, 0x03B1,
- 0x03B5, 0x03B7, 0x03B9, 0x03CB, 0x03B9, 0x03C5, 0x03BF, 0x03C5, 0x03C9, 0x03B2, 0x03B8, 0x03A5, 0x03D2, 0x03D2, 0x03C6, 0x03C0,
- 0x03BA, 0x03C1, 0x03C2, 0x0398, 0x03B5, 0x03A3, 0x0415, 0x0415, 0x0413, 0x0406, 0x041A, 0x0418, 0x0423, 0x0418, 0x0438, 0x0435,
- 0x0435, 0x0433, 0x0456, 0x043A, 0x0438, 0x0443, 0x0466, 0x0467, 0x046A, 0x046B, 0x0474, 0x0475, 0x0460, 0x0461, 0x0419, 0x0439,
- 0x0420, 0x0440, 0x0413, 0x0433, 0x0413, 0x0433, 0x0413, 0x0433, 0x0416, 0x0436, 0x0417, 0x0437, 0x041A, 0x043A, 0x041A, 0x043A,
- 0x041A, 0x043A, 0x041A, 0x043A, 0x041D, 0x043D, 0x041F, 0x043F, 0x0421, 0x0441, 0x0422, 0x0442, 0x04AE, 0x04AF, 0x0425, 0x0445,
- 0x0427, 0x0447, 0x0427, 0x0447, 0x0416, 0x0436, 0x04BC, 0x04BD, 0x0416, 0x0436, 0x041A, 0x043A, 0x041B, 0x043B, 0x041D, 0x043D,
- 0x041D, 0x043D, 0x041C, 0x043C, 0x0410, 0x0430, 0x0410, 0x0430, 0x0415, 0x0435, 0x04D8, 0x04D9, 0x0416, 0x0436, 0x0417, 0x0437,
- 0x0418, 0x0438, 0x0418, 0x0438, 0x041E, 0x043E, 0x04E8, 0x04E9, 0x042D, 0x044D, 0x0423, 0x0443, 0x0423, 0x0443, 0x0423, 0x0443,
- 0x0427, 0x0447, 0x0413, 0x0433, 0x042B, 0x044B, 0x0413, 0x0433, 0x0425, 0x0445, 0x0425, 0x0445, 0x0417, 0x0437, 0x041B, 0x043B,
- 0x0F0B, 0x10DC, 0x0041, 0x00C6, 0x0042, 0x0042, 0x0044, 0x0045, 0x018E, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D,
- 0x004E, 0x004F, 0x0222, 0x0050, 0x0052, 0x0054, 0x0055, 0x0057, 0x0061, 0x0250, 0x0251, 0x1D02, 0x0062, 0x0064, 0x0065, 0x0259,
- 0x025B, 0x025C, 0x0067, 0x006B, 0x006D, 0x014B, 0x006F, 0x0254, 0x1D16, 0x1D17, 0x0070, 0x0074, 0x0075, 0x1D1D, 0x026F, 0x0076,
- 0x1D25, 0x03B2, 0x03B3, 0x03B4, 0x03C6, 0x03C7, 0x0069, 0x0072, 0x0075, 0x0076, 0x03B2, 0x03B3, 0x03C1, 0x03C6, 0x03C7, 0x0062,
- 0x0064, 0x0066, 0x006D, 0x006E, 0x0070, 0x0072, 0x0072, 0x0073, 0x0074, 0x007A, 0x0067, 0x043D, 0x004C, 0x0070, 0x0055, 0x028A,
- 0x0062, 0x0064, 0x0066, 0x0067, 0x006B, 0x006C, 0x006D, 0x006E, 0x0070, 0x0072, 0x0073, 0x0283, 0x0076, 0x0078, 0x007A, 0x0061,
- 0x0251, 0x0064, 0x0065, 0x0065, 0x0065, 0x0065, 0x0069, 0x0283, 0x0252, 0x0063, 0x0255, 0x00F0, 0x025C, 0x0066, 0x025F, 0x0261,
- 0x0265, 0x0268, 0x0269, 0x026A, 0x1D7B, 0x029D, 0x026D, 0x1D85, 0x029F, 0x0271, 0x0270, 0x0272, 0x0273, 0x0274, 0x0275, 0x0278,
- 0x0282, 0x0283, 0x01AB, 0x0289, 0x028A, 0x1D1C, 0x028B, 0x028C, 0x007A, 0x0290, 0x0291, 0x0292, 0x03B8, 0x0041, 0x0061, 0x0042,
- 0x0062, 0x0042, 0x0062, 0x0042, 0x0062, 0x0043, 0x0063, 0x0044, 0x0064, 0x0044, 0x0064, 0x0044, 0x0064, 0x0044, 0x0064, 0x0044,
- 0x0064, 0x0045, 0x0065, 0x0045, 0x0065, 0x0045, 0x0065, 0x0045, 0x0065, 0x0228, 0x0229, 0x0046, 0x0066, 0x0047, 0x0067, 0x0048,
- 0x0068, 0x0048, 0x0068, 0x0048, 0x0068, 0x0048, 0x0068, 0x0048, 0x0068, 0x0049, 0x0069, 0x00CF, 0x00EF, 0x004B, 0x006B, 0x004B,
- 0x006B, 0x004B, 0x006B, 0x004C, 0x006C, 0x004C, 0x006C, 0x004C, 0x006C, 0x004C, 0x006C, 0x004D, 0x006D, 0x004D, 0x006D, 0x004D,
- 0x006D, 0x004E, 0x006E, 0x004E, 0x006E, 0x004E, 0x006E, 0x004E, 0x006E, 0x00D5, 0x00F5, 0x00D5, 0x00F5, 0x014C, 0x014D, 0x014C,
- 0x014D, 0x0050, 0x0070, 0x0050, 0x0070, 0x0052, 0x0072, 0x0052, 0x0072, 0x0052, 0x0072, 0x0052, 0x0072, 0x0053, 0x0073, 0x0053,
- 0x0073, 0x0053, 0x0073, 0x0053, 0x0073, 0x0053, 0x0073, 0x0054, 0x0074, 0x0054, 0x0074, 0x0054, 0x0074, 0x0054, 0x0074, 0x0055,
- 0x0075, 0x0055, 0x0075, 0x0055, 0x0075, 0x0168, 0x0169, 0x016A, 0x016B, 0x0056, 0x0076, 0x0056, 0x0076, 0x0057, 0x0077, 0x0057,
- 0x0077, 0x0057, 0x0077, 0x0057, 0x0077, 0x0057, 0x0077, 0x0058, 0x0078, 0x0058, 0x0078, 0x0059, 0x0079, 0x005A, 0x007A, 0x005A,
- 0x007A, 0x005A, 0x007A, 0x0068, 0x0074, 0x0077, 0x0079, 0x0061, 0x017F, 0x0041, 0x0061, 0x0041, 0x0061, 0x0041, 0x0061, 0x0041,
- 0x0061, 0x0041, 0x0061, 0x0041, 0x0061, 0x0041, 0x0061, 0x0041, 0x0061, 0x0041, 0x0061, 0x0041, 0x0061, 0x0041, 0x0061, 0x0041,
- 0x0061, 0x0045, 0x0065, 0x0045, 0x0065, 0x0045, 0x0065, 0x0045, 0x0065, 0x0045, 0x0065, 0x0045, 0x0065, 0x0045, 0x0065, 0x0045,
- 0x0065, 0x0049, 0x0069, 0x0049, 0x0069, 0x004F, 0x006F, 0x004F, 0x006F, 0x004F, 0x006F, 0x004F, 0x006F, 0x004F, 0x006F, 0x004F,
- 0x006F, 0x004F, 0x006F, 0x004F, 0x006F, 0x004F, 0x006F, 0x004F, 0x006F, 0x004F, 0x006F, 0x004F, 0x006F, 0x0055, 0x0075, 0x0055,
- 0x0075, 0x0055, 0x0075, 0x0055, 0x0075, 0x0055, 0x0075, 0x0055, 0x0075, 0x0055, 0x0075, 0x0059, 0x0079, 0x0059, 0x0079, 0x0059,
- 0x0079, 0x0059, 0x0079, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x0391, 0x0391, 0x0391, 0x0391, 0x0391,
- 0x0391, 0x0391, 0x0391, 0x03B5, 0x03B5, 0x03B5, 0x03B5, 0x03B5, 0x03B5, 0x0395, 0x0395, 0x0395, 0x0395, 0x0395, 0x0395, 0x03B7,
- 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x0397, 0x0397, 0x0397, 0x0397, 0x0397, 0x0397, 0x0397, 0x0397, 0x03B9,
- 0x03B9, 0x03B9, 0x03B9, 0x03B9, 0x03B9, 0x03B9, 0x03B9, 0x0399, 0x0399, 0x0399, 0x0399, 0x0399, 0x0399, 0x0399, 0x0399, 0x03BF,
- 0x03BF, 0x03BF, 0x03BF, 0x03BF, 0x03BF, 0x039F, 0x039F, 0x039F, 0x039F, 0x039F, 0x039F, 0x03C5, 0x03C5, 0x03C5, 0x03C5, 0x03C5,
- 0x03C5, 0x03C5, 0x03C5, 0x03A5, 0x03A5, 0x03A5, 0x03A5, 0x03C9, 0x03C9, 0x03C9, 0x03C9, 0x03C9, 0x03C9, 0x03C9, 0x03C9, 0x03A9,
- 0x03A9, 0x03A9, 0x03A9, 0x03A9, 0x03A9, 0x03A9, 0x03A9, 0x03B1, 0x03B1, 0x03B5, 0x03B5, 0x03B7, 0x03B7, 0x03B9, 0x03B9, 0x03BF,
- 0x03BF, 0x03C5, 0x03C5, 0x03C9, 0x03C9, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x0391, 0x0391, 0x0391,
- 0x0391, 0x0391, 0x0391, 0x0391, 0x0391, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x0397, 0x0397, 0x0397,
- 0x0397, 0x0397, 0x0397, 0x0397, 0x0397, 0x03C9, 0x03C9, 0x03C9, 0x03C9, 0x03C9, 0x03C9, 0x03C9, 0x03C9, 0x03A9, 0x03A9, 0x03A9,
- 0x03A9, 0x03A9, 0x03A9, 0x03A9, 0x03A9, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x0391, 0x0391, 0x0391, 0x0391,
- 0x0391, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x0395, 0x0395, 0x0397, 0x0397, 0x0397, 0x03B9, 0x03B9, 0x03B9, 0x03B9, 0x03B9,
- 0x03B9, 0x0399, 0x0399, 0x0399, 0x0399, 0x03C5, 0x03C5, 0x03C5, 0x03C5, 0x03C1, 0x03C1, 0x03C5, 0x03C5, 0x03A5, 0x03A5, 0x03A5,
- 0x03A5, 0x03A1, 0x03C9, 0x03C9, 0x03C9, 0x03C9, 0x03C9, 0x039F, 0x039F, 0x03A9, 0x03A9, 0x03A9, 0x00B4, 0x0314, 0x0020, 0x0020,
- 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x2010, 0x0333, 0x002E, 0x0020, 0x0020, 0x0030, 0x0069,
- 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x002B, 0x2212, 0x003D, 0x0028, 0x0029, 0x006E, 0x0030, 0x0031, 0x0032, 0x0033,
- 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x002B, 0x2212, 0x003D, 0x0028, 0x0029, 0x0061, 0x0065, 0x006F, 0x0078, 0x0259,
- 0x0043, 0x0190, 0x0067, 0x0048, 0x0048, 0x0048, 0x0068, 0x0068, 0x0049, 0x0049, 0x004C, 0x006C, 0x004E, 0x0050, 0x0051, 0x0052,
- 0x0052, 0x0052, 0x0052, 0x0052, 0x0056, 0x005A, 0x03A9, 0x01B1, 0x005A, 0x004B, 0x00C5, 0x0042, 0x0043, 0x0065, 0x0065, 0x0045,
- 0x0046, 0x004D, 0x006F, 0x05D0, 0x05D1, 0x05D2, 0x05D3, 0x0069, 0x03C0, 0x03B3, 0x0393, 0x03A0, 0x2211, 0x0044, 0x0064, 0x0065,
- 0x0069, 0x006A, 0x0049, 0x0056, 0x0058, 0x004C, 0x0043, 0x0044, 0x004D, 0x0069, 0x0076, 0x0078, 0x006C, 0x0063, 0x0064, 0x006D,
- 0x2203, 0x2208, 0x220B, 0x3008, 0x3009, 0x0062, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x0041,
- 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051,
- 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
- 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
- 0x0078, 0x0079, 0x007A, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x0030, 0x0031, 0x0032,
- 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039,
- 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x004C, 0x006C, 0x004C, 0x0050, 0x0052, 0x0061, 0x0074,
- 0x0048, 0x0068, 0x004B, 0x006B, 0x005A, 0x007A, 0x0076, 0x0057, 0x0058, 0x0076, 0x006A, 0x0056, 0x2D61, 0x6BCD, 0x6C11, 0x864E,
- 0x897F, 0x89D2, 0x957F, 0x9752, 0x98DF, 0x9AA8, 0x9B3C, 0x9EA6, 0x9EC4, 0x9F9F, 0x4E00, 0x4E28, 0x4E36, 0x4E3F, 0x4E59, 0x4E85,
- 0x4E8C, 0x4EA0, 0x4EBA, 0x513F, 0x5165, 0x516B, 0x5182, 0x5196, 0x51AB, 0x51E0, 0x51F5, 0x5200, 0x529B, 0x52F9, 0x5315, 0x531A,
- 0x5338, 0x5341, 0x535C, 0x5369, 0x5382, 0x53B6, 0x53C8, 0x53E3, 0x56D7, 0x571F, 0x58EB, 0x5902, 0x590A, 0x5915, 0x5927, 0x5973,
- 0x5B50, 0x5B80, 0x5BF8, 0x5C0F, 0x5C22, 0x5C38, 0x5C6E, 0x5C71, 0x5DDB, 0x5DE5, 0x5DF1, 0x5DFE, 0x5E72, 0x5E7A, 0x5E7F, 0x5EF4,
- 0x5EFE, 0x5F0B, 0x5F13, 0x5F50, 0x5F61, 0x5F73, 0x5FC3, 0x6208, 0x6236, 0x624B, 0x652F, 0x6534, 0x6587, 0x6597, 0x65A4, 0x65B9,
- 0x65E0, 0x65E5, 0x66F0, 0x6708, 0x6728, 0x6B20, 0x6B62, 0x6B79, 0x6BB3, 0x6BCB, 0x6BD4, 0x6BDB, 0x6C0F, 0x6C14, 0x6C34, 0x706B,
- 0x722A, 0x7236, 0x723B, 0x723F, 0x7247, 0x7259, 0x725B, 0x72AC, 0x7384, 0x7389, 0x74DC, 0x74E6, 0x7518, 0x751F, 0x7528, 0x7530,
- 0x758B, 0x7592, 0x7676, 0x767D, 0x76AE, 0x76BF, 0x76EE, 0x77DB, 0x77E2, 0x77F3, 0x793A, 0x79B8, 0x79BE, 0x7A74, 0x7ACB, 0x7AF9,
- 0x7C73, 0x7CF8, 0x7F36, 0x7F51, 0x7F8A, 0x7FBD, 0x8001, 0x800C, 0x8012, 0x8033, 0x807F, 0x8089, 0x81E3, 0x81EA, 0x81F3, 0x81FC,
- 0x820C, 0x821B, 0x821F, 0x826E, 0x8272, 0x8278, 0x864D, 0x866B, 0x8840, 0x884C, 0x8863, 0x897E, 0x898B, 0x89D2, 0x8A00, 0x8C37,
- 0x8C46, 0x8C55, 0x8C78, 0x8C9D, 0x8D64, 0x8D70, 0x8DB3, 0x8EAB, 0x8ECA, 0x8F9B, 0x8FB0, 0x8FB5, 0x9091, 0x9149, 0x91C6, 0x91CC,
- 0x91D1, 0x9577, 0x9580, 0x961C, 0x96B6, 0x96B9, 0x96E8, 0x9751, 0x975E, 0x9762, 0x9769, 0x97CB, 0x97ED, 0x97F3, 0x9801, 0x98A8,
- 0x98DB, 0x98DF, 0x9996, 0x9999, 0x99AC, 0x9AA8, 0x9AD8, 0x9ADF, 0x9B25, 0x9B2F, 0x9B32, 0x9B3C, 0x9B5A, 0x9CE5, 0x9E75, 0x9E7F,
- 0x9EA5, 0x9EBB, 0x9EC3, 0x9ECD, 0x9ED1, 0x9EF9, 0x9EFD, 0x9F0E, 0x9F13, 0x9F20, 0x9F3B, 0x9F4A, 0x9F52, 0x9F8D, 0x9F9C, 0x9FA0,
- 0x0020, 0x3012, 0x5341, 0x5344, 0x5345, 0x1100, 0x1101, 0x11AA, 0x1102, 0x11AC, 0x11AD, 0x1103, 0x1104, 0x1105, 0x11B0, 0x11B1,
- 0x11B2, 0x11B3, 0x11B4, 0x11B5, 0x111A, 0x1106, 0x1107, 0x1108, 0x1121, 0x1109, 0x110A, 0x110B, 0x110C, 0x110D, 0x110E, 0x110F,
- 0x1110, 0x1111, 0x1112, 0x1161, 0x1162, 0x1163, 0x1164, 0x1165, 0x1166, 0x1167, 0x1168, 0x1169, 0x116A, 0x116B, 0x116C, 0x116D,
- 0x116E, 0x116F, 0x1170, 0x1171, 0x1172, 0x1173, 0x1174, 0x1175, 0x1160, 0x1114, 0x1115, 0x11C7, 0x11C8, 0x11CC, 0x11CE, 0x11D3,
- 0x11D7, 0x11D9, 0x111C, 0x11DD, 0x11DF, 0x111D, 0x111E, 0x1120, 0x1122, 0x1123, 0x1127, 0x1129, 0x112B, 0x112C, 0x112D, 0x112E,
- 0x112F, 0x1132, 0x1136, 0x1140, 0x1147, 0x114C, 0x11F1, 0x11F2, 0x1157, 0x1158, 0x1159, 0x1184, 0x1185, 0x1188, 0x1191, 0x1192,
- 0x1194, 0x119E, 0x11A1, 0x4E00, 0x4E8C, 0x4E09, 0x56DB, 0x4E0A, 0x4E2D, 0x4E0B, 0x7532, 0x4E59, 0x4E19, 0x4E01, 0x5929, 0x5730,
- 0x4EBA, 0x554F, 0x5E7C, 0x6587, 0x7B8F, 0x1100, 0x1102, 0x1103, 0x1105, 0x1106, 0x1107, 0x1109, 0x110B, 0x110C, 0x110E, 0x110F,
- 0x1110, 0x1111, 0x1112, 0x4E00, 0x4E8C, 0x4E09, 0x56DB, 0x4E94, 0x516D, 0x4E03, 0x516B, 0x4E5D, 0x5341, 0x6708, 0x706B, 0x6C34,
- 0x6728, 0x91D1, 0x571F, 0x65E5, 0x682A, 0x6709, 0x793E, 0x540D, 0x7279, 0x8CA1, 0x795D, 0x52B4, 0x79D8, 0x7537, 0x5973, 0x9069,
- 0x512A, 0x5370, 0x6CE8, 0x9805, 0x4F11, 0x5199, 0x6B63, 0x4E0A, 0x4E2D, 0x4E0B, 0x5DE6, 0x53F3, 0x533B, 0x5B97, 0x5B66, 0x76E3,
- 0x4F01, 0x8CC7, 0x5354, 0x591C, 0x30A2, 0x30A4, 0x30A6, 0x30A8, 0x30AA, 0x30AB, 0x30AD, 0x30AF, 0x30B1, 0x30B3, 0x30B5, 0x30B7,
- 0x30B9, 0x30BB, 0x30BD, 0x30BF, 0x30C1, 0x30C4, 0x30C6, 0x30C8, 0x30CA, 0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF, 0x30D2, 0x30D5,
- 0x30D8, 0x30DB, 0x30DE, 0x30DF, 0x30E0, 0x30E1, 0x30E2, 0x30E4, 0x30E6, 0x30E8, 0x30E9, 0x30EA, 0x30EB, 0x30EC, 0x30ED, 0x30EF,
- 0x30F0, 0x30F1, 0x30F2, 0x4E22, 0x5E76, 0x5E7A, 0x5E72, 0x4E71, 0x4E98, 0x4E9A, 0x4F2B, 0x5E03, 0x5360, 0x6765, 0x4FA3, 0x4FE3,
- 0x7CFB, 0x4FA0, 0x4F25, 0x4FE9, 0x4ED3, 0x4E2A, 0x4EEC, 0x4F26, 0x4F1F, 0x4FA7, 0x4FA6, 0x4F2A, 0x6770, 0x4F27, 0x4F1E, 0x5907,
- 0x5BB6, 0x4F63, 0x506C, 0x4F20, 0x4F1B, 0x503A, 0x4F24, 0x503E, 0x507B, 0x4EC5, 0x4F65, 0x4FA8, 0x4EC6, 0x4FA5, 0x507E, 0x96C7,
- 0x4EF7, 0x4EEA, 0x4FAC, 0x4EBF, 0x4FED, 0x50A7, 0x4FE6, 0x4FAA, 0x5C3D, 0x507F, 0x4F18, 0x50A8, 0x4FEA, 0x50A9, 0x50A5, 0x4FE8,
- 0x51F6, 0x5151, 0x513F, 0x5156, 0x5185, 0x4E24, 0x518C, 0x80C4, 0x5199, 0x5E42, 0x51BB, 0x51DB, 0x51EF, 0x522B, 0x5220, 0x522D,
- 0x5219, 0x5239, 0x521A, 0x5265, 0x5250, 0x5240, 0x521B, 0x522C, 0x5212, 0x5267, 0x5218, 0x523D, 0x523F, 0x5251, 0x5242, 0x52B2,
- 0x52A8, 0x52D6, 0x52A1, 0x80DC, 0x52B3, 0x52BF, 0x52A2, 0x52CB, 0x52B1, 0x529D, 0x5300, 0x5326, 0x6C47, 0x532E, 0x533A, 0x534F,
- 0x6064, 0x5374, 0x538D, 0x538C, 0x5389, 0x53A3, 0x53C2, 0x4E1B, 0x54A4, 0x5434, 0x5450, 0x5415, 0x5458, 0x55B1, 0x5457, 0x5FF5,
- 0x95EE, 0x54D1, 0x542F, 0x5524, 0x4E27, 0x4E54, 0x5355, 0x54DF, 0x545B, 0x556C, 0x551D, 0x5417, 0x545C, 0x5522, 0x54D4, 0x53F9,
- 0x55BD, 0x5455, 0x5567, 0x5C1D, 0x551B, 0x54D7, 0x5520, 0x5578, 0x53FD, 0x54D3, 0x5452, 0x5574, 0x6076, 0x5618, 0x549D, 0x54D2,
- 0x54DD, 0x54D5, 0x55F3, 0x54D9, 0x55B7, 0x5428, 0x549B, 0x5413, 0x54DC, 0x5C1D, 0x565C, 0x556E, 0x5456, 0x5499, 0x4EB8, 0x55BE,
- 0x4E25, 0x5624, 0x556D, 0x55EB, 0x56A3, 0x5181, 0x5453, 0x5570, 0x5631, 0x56F1, 0x56F5, 0x56FD, 0x56F4, 0x56ED, 0x5706, 0x56FE,
- 0x56E2, 0x57AD, 0x6267, 0x575A, 0x57A9, 0x57DA, 0x5C27, 0x62A5, 0x573A, 0x5757, 0x8314, 0x57B2, 0x57D8, 0x6D82, 0x51A2, 0x575E,
- 0x57D9, 0x5C18, 0x5811, 0x57AB, 0x5760, 0x5815, 0x575F, 0x57A6, 0x575B, 0x538B, 0x5792, 0x5739, 0x5786, 0x574F, 0x5785, 0x575C,
- 0x575D, 0x58EE, 0x58F6, 0x58F8, 0x5BFF, 0x591F, 0x68A6, 0x4F19, 0x5939, 0x5942, 0x5965, 0x5941, 0x593A, 0x594B, 0x59F9, 0x5986,
- 0x59D7, 0x5978, 0x5A31, 0x5A04, 0x5987, 0x5A05, 0x5A32, 0x59AB, 0x5AAA, 0x5988, 0x59AA, 0x59A9, 0x5A34, 0x5A73, 0x5A06, 0x5A75,
- 0x5A07, 0x5AF1, 0x5AD2, 0x5B37, 0x5AD4, 0x5A74, 0x5A76, 0x5A08, 0x5B59, 0x5B66, 0x5B6A, 0x5BAB, 0x5BDD, 0x5B9E, 0x5B81, 0x5BA1,
- 0x5199, 0x5BBD, 0x5BA0, 0x5B9D, 0x5C06, 0x4E13, 0x5BFB, 0x5BF9, 0x5BFC, 0x5C34, 0x5C4A, 0x5C38, 0x5C49, 0x5C61, 0x5C42, 0x5C5F,
- 0x5C66, 0x5C5E, 0x5188, 0x5C98, 0x5C9B, 0x5CE1, 0x5D03, 0x5C97, 0x4ED1, 0x5CE5, 0x5C9A, 0x5D5D, 0x5D2D, 0x5C96, 0x5D5A, 0x5D02,
- 0x5CE4, 0x5CE3, 0x5CC4, 0x5D04, 0x5C99, 0x5D58, 0x5CAD, 0x5C7F, 0x5CB3, 0x5CBF, 0x5CE6, 0x5DC5, 0x5DEF, 0x5E05, 0x5E08, 0x5E10,
- 0x5E26, 0x5E27, 0x5E0F, 0x5E3C, 0x5E3B, 0x5E1C, 0x5E01, 0x5E2E, 0x5E31, 0x5E72, 0x51E0, 0x5E93, 0x5395, 0x53A2, 0x53A6, 0x53A8,
- 0x53AE, 0x5E99, 0x5382, 0x5E91, 0x5E9F, 0x5E7F, 0x5EEA, 0x5E90, 0x5385, 0x5F11, 0x5F2A, 0x5F20, 0x5F3A, 0x5F39, 0x5F25, 0x5F2F,
- 0x5F66, 0x540E, 0x5F84, 0x4ECE, 0x5F95, 0x590D, 0x5F81, 0x5F7B, 0x6052, 0x803B, 0x60A6, 0x6005, 0x95F7, 0x6076, 0x607C, 0x607D,
- 0x607B, 0x7231, 0x60EC, 0x60AB, 0x6006, 0x607A, 0x5FFE, 0x6001, 0x6120, 0x60E8, 0x60ED, 0x6078, 0x60EF, 0x6004, 0x6002, 0x8651,
- 0x60AD, 0x5E86, 0x5FE7, 0x60EB, 0x601C, 0x51ED, 0x6126, 0x616D, 0x60EE, 0x6124, 0x60AF, 0x6003, 0x5BAA, 0x5FC6, 0x6073, 0x5E94,
- 0x603F, 0x61D4, 0x603C, 0x61D1, 0x6079, 0x60E9, 0x61D2, 0x6000, 0x60AC, 0x5FCF, 0x60E7, 0x6151, 0x604B, 0x6206, 0x620B, 0x6217,
- 0x622C, 0x6218, 0x620F, 0x6237, 0x629B, 0x631F, 0x820D, 0x626A, 0x5377, 0x626B, 0x62A1, 0x6323, 0x6302, 0x91C7, 0x62E3, 0x626C,
- 0x6362, 0x6325, 0x635F, 0x6447, 0x6363, 0x62A2, 0x63B4, 0x63BC, 0x6402, 0x631A, 0x62A0, 0x629F, 0x63BA, 0x635E, 0x6491, 0x6320,
- 0x6322, 0x63B8, 0x62E8, 0x629A, 0x6251, 0x63FF, 0x631E, 0x631D, 0x6361, 0x62E5, 0x63B3, 0x62E9, 0x51FB, 0x6321, 0x62C5, 0x636E,
- 0x6324, 0x62DF, 0x6448, 0x62E7, 0x6401, 0x63B7, 0x6269, 0x64B7, 0x6446, 0x64DE, 0x64B8, 0x6270, 0x6445, 0x64B5, 0x62E2, 0x62E6,
- 0x6484, 0x6400, 0x64BA, 0x643A, 0x6444, 0x6512, 0x631B, 0x644A, 0x6405, 0x63FD, 0x668B, 0x8D25, 0x53D9, 0x654C, 0x6570, 0x655B,
- 0x6BD9, 0x6593, 0x65A9, 0x65AD, 0x4E8E, 0x5347, 0x65F6, 0x664B, 0x663C, 0x6655, 0x6656, 0x65F8, 0x7545, 0x6682, 0x6635, 0x6654,
- 0x5386, 0x6619, 0x6653, 0x66A7, 0x65F7, 0x663D, 0x6652, 0x4E66, 0x4F1A, 0x80E7, 0x4E1C, 0x6805, 0x6746, 0x6800, 0x67A7, 0x6761,
- 0x67AD, 0x5F03, 0x67A8, 0x67A3, 0x680B, 0x6808, 0x6816, 0x6860, 0x6768, 0x67AB, 0x6862, 0x4E1A, 0x6781, 0x6769, 0x8363, 0x6864,
- 0x6784, 0x67AA, 0x6760, 0x68BF, 0x6920, 0x6901, 0x6868, 0x6869, 0x4E50, 0x679E, 0x697C, 0x6807, 0x67A2, 0x6837, 0x6734, 0x6811,
- 0x6866, 0x6861, 0x6865, 0x673A, 0x692D, 0x6A2A, 0x6AA9, 0x69DC, 0x67FD, 0x6863, 0x6867, 0x69DA, 0x68C0, 0x6A2F, 0x68BC, 0x53F0,
- 0x69DF, 0x67E0, 0x69DB, 0x82D8, 0x67DC, 0x6A79, 0x6988, 0x6809, 0x691F, 0x6A7C, 0x680E, 0x6A71, 0x69E0, 0x680C, 0x67A5, 0x6A65,
- 0x6987, 0x680A, 0x6989, 0x68C2, 0x6A31, 0x680F, 0x6743, 0x6924, 0x683E, 0x6984, 0x94A6, 0x6B27, 0x6B24, 0x6B22, 0x5C81, 0x5386,
- 0x5F52, 0x6B81, 0x6B8B, 0x6B92, 0x6B87, 0x6B9A, 0x6B93, 0x6BA1, 0x6B7C, 0x6740, 0x58F3, 0x6BC1, 0x6BB4, 0x6BF5, 0x6BE1, 0x6C07,
- 0x6C14, 0x6C22, 0x6C29, 0x6C32, 0x51FC, 0x51B3, 0x51B1, 0x6CA1, 0x51B5, 0x6CC4, 0x6C79, 0x6D43, 0x6CFE, 0x51C9, 0x51C4, 0x6CEA,
- 0x6E0C, 0x51C0, 0x6CA6, 0x6E0A, 0x6D9E, 0x6D45, 0x6DA3, 0x51CF, 0x6CA8, 0x6DA1, 0x6D4B, 0x6D51, 0x51D1, 0x6D48, 0x6D8C, 0x6D07,
- 0x6C64, 0x6CA9, 0x51C6, 0x6C9F, 0x6E29, 0x6DA2, 0x6E7F, 0x6CA7, 0x706D, 0x6DA4, 0x8365, 0x6CAA, 0x6EDE, 0x6E17, 0x6D52, 0x6D50,
- 0x6EDA, 0x6EE1, 0x6E14, 0x6E87, 0x6CA4, 0x6C49, 0x6D9F, 0x6E0D, 0x6DA8, 0x6E10, 0x6D46, 0x988D, 0x6CFC, 0x6D01, 0x6F5C, 0x6DA6,
- 0x6D54, 0x6E83, 0x6DA0, 0x6DA9, 0x6D47, 0x6D9D, 0x6C84, 0x6DA7, 0x6E11, 0x6CFD, 0x6EEA, 0x6CF6, 0x6D4D, 0x6D4A, 0x6D53, 0x6E7F,
- 0x6CDE, 0x6D4E, 0x6D9B, 0x6EE5, 0x6F4D, 0x6EE8, 0x6E85, 0x6CFA, 0x6EE4, 0x6EE2, 0x6E0E, 0x6CFB, 0x6D4F, 0x6FD2, 0x6CF8, 0x6CA5,
- 0x6F47, 0x6F46, 0x6F74, 0x6CF7, 0x6FD1, 0x6F4B, 0x6F9C, 0x6CA3, 0x6EE0, 0x6D12, 0x6EE9, 0x704F, 0x6E7E, 0x6EE6, 0x6EDF, 0x707E,
- 0x4E3A, 0x4E4C, 0x70C3, 0x65E0, 0x70BC, 0x709C, 0x70DF, 0x8315, 0x7115, 0x70E6, 0x7080, 0x8367, 0x709D, 0x70ED, 0x70BD, 0x70E8,
- 0x706F, 0x7096, 0x70E7, 0x70EB, 0x7116, 0x8425, 0x707F, 0x70DB, 0x70E9, 0x70EC, 0x7118, 0x70C1, 0x7089, 0x70C2, 0x4E89, 0x4E3A,
- 0x7237, 0x5C14, 0x5899, 0x724D, 0x7275, 0x8366, 0x7266, 0x728A, 0x727A, 0x72B6, 0x72ED, 0x72C8, 0x72F0, 0x72B9, 0x72F2, 0x72B8,
- 0x72F1, 0x72EE, 0x5956, 0x72EC, 0x72EF, 0x7303, 0x72DE, 0x83B7, 0x730E, 0x72B7, 0x517D, 0x736D, 0x732E, 0x7315, 0x7321, 0x73B0,
- 0x73D0, 0x73F2, 0x73AE, 0x739A, 0x7410, 0x7476, 0x83B9, 0x739B, 0x7405, 0x73B1, 0x740F, 0x740E, 0x7391, 0x7477, 0x73F0, 0x73AF,
- 0x7399, 0x73BA, 0x743C, 0x73D1, 0x748E, 0x74D2, 0x74EF, 0x74EE, 0x4EA7, 0x4EA7, 0x4EA9, 0x6BD5, 0x753B, 0x7572, 0x5F02, 0x5F53,
- 0x7574, 0x53E0, 0x75C9, 0x9178, 0x75F9, 0x75D6, 0x75AF, 0x75A1, 0x75EA, 0x7617, 0x75AE, 0x759F, 0x75AD, 0x7618, 0x7597, 0x75E8,
- 0x75EB, 0x7605, 0x75A0, 0x762A, 0x75D2, 0x7596, 0x75AC, 0x765E, 0x7663, 0x763F, 0x763E, 0x75C8, 0x762B, 0x766B, 0x53D1, 0x7691,
- 0x75B1, 0x76B2, 0x76B1, 0x676F, 0x76D7, 0x76CF, 0x5C3D, 0x76D1, 0x76D8, 0x5362, 0x8361, 0x7726, 0x4F17, 0x56F0, 0x7741, 0x7750,
- 0x772F, 0x7792, 0x4E86, 0x7786, 0x7751, 0x772C, 0x77A9, 0x77EB, 0x7845, 0x70AE, 0x7841, 0x7856, 0x7817, 0x781A, 0x7855, 0x7800,
- 0x786E, 0x7801, 0x7859, 0x7816, 0x789C, 0x789B, 0x77F6, 0x7857, 0x785A, 0x7840, 0x788D, 0x77FF, 0x783A, 0x783E, 0x77FE, 0x783B,
- 0x7984, 0x7978, 0x796F, 0x794E, 0x5FA1, 0x7985, 0x793C, 0x7977, 0x79C3, 0x7C7C, 0x7A0E, 0x79C6, 0x68F1, 0x79CD, 0x79F0, 0x7A23,
- 0x79EF, 0x9896, 0x79FE, 0x7A51, 0x79FD, 0x7A33, 0x7A9D, 0x6D3C, 0x7A77, 0x7A91, 0x7A8E, 0x7AAD, 0x7AA5, 0x7A9C, 0x7A8D, 0x7AA6,
- 0x7A83, 0x7ADE, 0x7B14, 0x7B0B, 0x7B15, 0x7B3A, 0x7B5D, 0x8282, 0x8303, 0x7B51, 0x7BA7, 0x7B7C, 0x7B03, 0x7B5B, 0x7B5A, 0x7BA6,
- 0x7BD3, 0x7BAA, 0x7B80, 0x7BD1, 0x7BAB, 0x6A90, 0x7B5C, 0x7B7E, 0x5E18, 0x7BEE, 0x7B79, 0x7B93, 0x7BEF, 0x7BA8, 0x7C41, 0x7B3C,
- 0x7B7E, 0x7B3E, 0x7BF1, 0x7BA9, 0x5401, 0x5986, 0x7CA4, 0x7CC1, 0x7CAA, 0x7CAE, 0x7CF5, 0x7C9D, 0x7C74, 0x7C9C, 0x7EA0, 0x7EAA,
- 0x7EA3, 0x7EA6, 0x7EA2, 0x7EA1, 0x7EA5, 0x7EA8, 0x7EAB, 0x7EB9, 0x7EB3, 0x7EBD, 0x7EBE, 0x7EAF, 0x7EB0, 0x7EB1, 0x7EB8, 0x7EA7,
- 0x7EB7, 0x7EAD, 0x7EB4, 0x7EBA, 0x624E, 0x624E, 0x7EC6, 0x7EC2, 0x7EC1, 0x7EC5, 0x7EBB, 0x7ECD, 0x7EC0, 0x7ECB, 0x7ED0, 0x7ECC,
- 0x7EC8, 0x5F26, 0x7EC4, 0x7ECA, 0x7ED7, 0x7ED3, 0x7EDD, 0x7EE6, 0x7ED4, 0x7EDE, 0x7EDC, 0x7EDA, 0x7ED9, 0x7ED2, 0x7ED6, 0x7EDF,
- 0x4E1D, 0x7EDB, 0x7EE2, 0x7ED1, 0x7EE1, 0x7EE0, 0x7EE8, 0x7EE5, 0x7ECF, 0x7EFC, 0x7F0D, 0x7EFF, 0x7EF8, 0x7EFB, 0x7EF6, 0x7EF4,
- 0x7EFE, 0x7EB2, 0x7F51, 0x7F00, 0x7EB6, 0x7EFA, 0x7EEE, 0x7EFD, 0x7EF0, 0x7EEB, 0x7EF5, 0x7EF2, 0x7F01, 0x7D27, 0x7EEF, 0x7EEA,
- 0x7F03, 0x7F04, 0x7F02, 0x7EBF, 0x7F09, 0x7F0E, 0x7F14, 0x7F17, 0x7F18, 0x7F0C, 0x7F16, 0x7F13, 0x7F05, 0x7EAC, 0x7F11, 0x7F08,
- 0x7EC3, 0x7F0F, 0x7F07, 0x81F4, 0x8426, 0x7F19, 0x7F22, 0x7F12, 0x7EC9, 0x7F23, 0x7F1E, 0x7F1A, 0x7F1C, 0x7F1F, 0x7F1B, 0x53BF,
- 0x7F1D, 0x7F29, 0x7EB5, 0x7F27, 0x7F26, 0x7D77, 0x7F15, 0x7F25, 0x603B, 0x7EE9, 0x7EF7, 0x7F2B, 0x7F2A, 0x7F2F, 0x7EC7, 0x7F2E,
- 0x7F2D, 0x7ED5, 0x7EE3, 0x7F0B, 0x7EF3, 0x7ED8, 0x7CFB, 0x8327, 0x7F33, 0x7F32, 0x7F34, 0x7ECE, 0x7EE7, 0x7F24, 0x7F31, 0x7F2C,
- 0x7EA9, 0x7EED, 0x7F20, 0x7F28, 0x7EA4, 0x7F35, 0x7F06, 0x94B5, 0x7F42, 0x7F5A, 0x9A82, 0x7F62, 0x7F57, 0x7F74, 0x7F81, 0x8288,
- 0x7F9F, 0x7FA1, 0x4E49, 0x81BB, 0x4E60, 0x7FC6, 0x7FDA, 0x7FD8, 0x7FD9, 0x8027, 0x5723, 0x95FB, 0x8054, 0x806A, 0x58F0, 0x8038,
- 0x8069, 0x8042, 0x804C, 0x804D, 0x542C, 0x804B, 0x8083, 0x80C1, 0x8109, 0x80EB, 0x8131, 0x80C0, 0x80BE, 0x80E8, 0x8136, 0x8111,
- 0x80BF, 0x811A, 0x80A0, 0x817D, 0x8158, 0x80A4, 0x80F6, 0x817B, 0x80C6, 0x810D, 0x8113, 0x8138, 0x8110, 0x8191, 0x814A, 0x80EA,
- 0x810F, 0x8114, 0x81DC, 0x5367, 0x4E34, 0x53F0, 0x4E0E, 0x5174, 0x4E3E, 0x65E7, 0x8231, 0x8223, 0x8230, 0x823B, 0x8270, 0x8273,
- 0x82C4, 0x520D, 0x82CE, 0x5179, 0x8346, 0x8C46, 0x5E84, 0x830E, 0x835A, 0x82CB, 0x534E, 0x70DF, 0x82CC, 0x83B1, 0x4E07, 0x83B4,
- 0x53F6, 0x836D, 0x7740, 0x82C7, 0x8364, 0x641C, 0x83B3, 0x8385, 0x82CD, 0x836A, 0x76D6, 0x83B2, 0x82C1, 0x83BC, 0x835C, 0x848C,
- 0x848B, 0x8471, 0x8311, 0x836B, 0x8368, 0x8487, 0x835E, 0x836C, 0x83B8, 0x835B, 0x8489, 0x829C, 0x8427, 0x84E3, 0x835F, 0x84DF,
- 0x8297, 0x59DC, 0x8537, 0x83B6, 0x8350, 0x8428, 0x8360, 0x501F, 0x84DD, 0x8369, 0x827A, 0x836F, 0x85AE, 0x82C8, 0x853C, 0x853A,
- 0x841A, 0x8572, 0x82A6, 0x82CF, 0x8574, 0x82F9, 0x8616, 0x85D3, 0x8539, 0x830F, 0x5170, 0x84E0, 0x841D, 0x5904, 0x865A, 0x864F,
- 0x53F7, 0x4E8F, 0x866C, 0x86F1, 0x8715, 0x86AC, 0x8680, 0x732C, 0x867E, 0x8671, 0x8717, 0x86F3, 0x8682, 0x8424, 0x877C, 0x8780,
- 0x86F0, 0x8748, 0x87A8, 0x866E, 0x8749, 0x86F2, 0x866B, 0x86CF, 0x8681, 0x8683, 0x8747, 0x867F, 0x874E, 0x86F4, 0x877E, 0x869D,
- 0x8721, 0x86CE, 0x87CF, 0x86CA, 0x8695, 0x86EE, 0x4F17, 0x672F, 0x536B, 0x51B2, 0x886E, 0x8885, 0x8865, 0x88C5, 0x91CC, 0x5236,
- 0x590D, 0x88C8, 0x8886, 0x88E4, 0x88E2, 0x7F21, 0x891B, 0x4EB5, 0x88E5, 0x8884, 0x88E3, 0x88C6, 0x8934, 0x889C, 0x886C, 0x88AD,
- 0x8955, 0x89C1, 0x89C4, 0x89C5, 0x89C6, 0x89C7, 0x89CB, 0x89CD, 0x89CE, 0x4EB2, 0x89CA, 0x89CF, 0x89D0, 0x89D1, 0x89C9, 0x89C8,
- 0x89CC, 0x89C2, 0x89DE, 0x89EF, 0x89E6, 0x8BA2, 0x8BA3, 0x8BA1, 0x8BAF, 0x8BA7, 0x8BA8, 0x8BA6, 0x8BAD, 0x8BAA, 0x8BAB, 0x8BAC,
- 0x8BB0, 0x8BB9, 0x8BB6, 0x8BBC, 0x8BC0, 0x8BB7, 0x8BBF, 0x8BBE, 0x8BB8, 0x8BC9, 0x8BC3, 0x8BCA, 0x8BC1, 0x8BC2, 0x8BCB, 0x8BB5,
- 0x8BC8, 0x8BD2, 0x8BCF, 0x8BC4, 0x8BCE, 0x8BC5, 0x8BCD, 0x548F, 0x8BE9, 0x8BE2, 0x8BE3, 0x8BD5, 0x8BD7, 0x8BE7, 0x8BDF, 0x8BE1,
- 0x8BE0, 0x8BD8, 0x8BDD, 0x8BE5, 0x8BE6, 0x8BDC, 0x8BD9, 0x8BD6, 0x8BD4, 0x8BDB, 0x8BD3, 0x5938, 0x5FD7, 0x8BA4, 0x8BF3, 0x8BF6,
- 0x8BDE, 0x8BF1, 0x8BEE, 0x8BED, 0x8BDA, 0x8BEB, 0x8BEC, 0x8BEF, 0x8BF0, 0x8BF5, 0x8BF2, 0x8BF4, 0x8C01, 0x8BFE, 0x8C07, 0x8BFD,
- 0x8C0A, 0x8C03, 0x8C04, 0x8C06, 0x8C08, 0x8BFF, 0x8BF7, 0x8BE4, 0x8BF9, 0x8BFC, 0x8C05, 0x8BBA, 0x8C02, 0x8C00, 0x8C0D, 0x8C1E,
- 0x8C1D, 0x8C25, 0x8BE8, 0x8C14, 0x8C1B, 0x8C10, 0x8C0F, 0x8C15, 0x8C18, 0x8BB3, 0x8C19, 0x8C0C, 0x8BBD, 0x8BF8, 0x8C1A, 0x8C16,
- 0x8BFA, 0x8C0B, 0x8C12, 0x8C13, 0x8A8A, 0x8BCC, 0x8C0E, 0x8C1C, 0x8C27, 0x8C11, 0x8C21, 0x8C24, 0x8C26, 0x8BB2, 0x8C22, 0x8C23,
- 0x8C1F, 0x8C2A, 0x8C2C, 0x8BB4, 0x8C28, 0x8C29, 0x8BC1, 0x8C32, 0x8BA5, 0x8C2E, 0x8BC6, 0x8C2F, 0x8C2D, 0x8C31, 0x8C35, 0x8BD1,
- 0x8BAE, 0x8C34, 0x62A4, 0x8BEA, 0x8A89, 0x8C2B, 0x8BFB, 0x53D8, 0x8A5F, 0x96E0, 0x8C17, 0x8BA9, 0x8C30, 0x8C36, 0x8D5E, 0x8C20,
- 0x8C33, 0x5C82, 0x7AD6, 0x4E30, 0x732A, 0x8C6E, 0x732B, 0x8D1D, 0x8D1E, 0x8D1F, 0x8D22, 0x8D21, 0x8D2B, 0x8D27, 0x8D29, 0x8D2A,
- 0x8D2F, 0x8D23, 0x8D2E, 0x8D33, 0x8D40, 0x8D30, 0x8D35, 0x8D2C, 0x4E70, 0x8D37, 0x8D36, 0x8D39, 0x8D34, 0x8D3B, 0x8D38, 0x8D3A,
- 0x8D32, 0x8D42, 0x8D41, 0x8D3F, 0x8D45, 0x8D44, 0x8D3E, 0x8D3C, 0x8D48, 0x8D4A, 0x5BBE, 0x8D47, 0x8D52, 0x8D49, 0x8D50, 0x8D4F,
- 0x8D54, 0x8D53, 0x8D24, 0x5356, 0x8D31, 0x8D4B, 0x8D55, 0x8D28, 0x8D26, 0x8D4C, 0x8D56, 0x8D57, 0x8D5A, 0x8D59, 0x8D2D, 0x8D5B,
- 0x8D5C, 0x8D3D, 0x8D58, 0x8D5F, 0x8D60, 0x8D5E, 0x8D61, 0x8D62, 0x8D46, 0x8D43, 0x8D51, 0x8D4E, 0x8D5D, 0x8D63, 0x8D6A, 0x8D76,
- 0x8D75, 0x8D8B, 0x8DB1, 0x8FF9, 0x8DF5, 0x8E0A, 0x8DC4, 0x8DF8, 0x8DD6, 0x8E52, 0x8DF7, 0x8DF6, 0x8DB8, 0x8E0C, 0x8DFB, 0x8DC3,
- 0x8E2F, 0x8DDE, 0x8E2C, 0x8E70, 0x8DF9, 0x8E51, 0x8E7F, 0x8E9C, 0x8E8F, 0x8EAF, 0x8F66, 0x8F67, 0x8F68, 0x519B, 0x8F69, 0x8F6B,
- 0x8F6D, 0x8F6F, 0x8F78, 0x8F71, 0x8F74, 0x8F75, 0x8F7A, 0x8F72, 0x8F76, 0x8F7C, 0x8F83, 0x8F82, 0x8F81, 0x8F80, 0x8F7D, 0x8F7E,
- 0x8F84, 0x8F85, 0x8F7B, 0x8F86, 0x8F8E, 0x8F89, 0x8F8B, 0x8F8D, 0x8F8A, 0x8F87, 0x8F88, 0x8F6E, 0x8F91, 0x8F8F, 0x8F93, 0x8F90,
- 0x8F97, 0x8206, 0x8F92, 0x6BC2, 0x8F96, 0x8F95, 0x8F98, 0x8F6C, 0x8F99, 0x8F7F, 0x8F9A, 0x8F70, 0x8F94, 0x8F79, 0x8F73, 0x529E,
- 0x8F9E, 0x8FAB, 0x8FA9, 0x519C, 0x8FD9, 0x8FDE, 0x5468, 0x8FDB, 0x6E38, 0x8FD0, 0x8FC7, 0x8FBE, 0x8FDD, 0x9065, 0x900A, 0x9012,
- 0x8FDC, 0x9002, 0x8FDF, 0x8FC1, 0x9009, 0x9057, 0x8FBD, 0x8FC8, 0x8FD8, 0x8FE9, 0x8FB9, 0x903B, 0x9026, 0x90CF, 0x90AE, 0x90D3,
- 0x4E61, 0x90B9, 0x90AC, 0x90E7, 0x9093, 0x90D1, 0x90BB, 0x90F8, 0x90BA, 0x90D0, 0x909D, 0x9142, 0x90E6, 0x814C, 0x4E11, 0x915D,
- 0x533B, 0x9171, 0x9166, 0x917F, 0x8845, 0x917E, 0x917D, 0x91CA, 0x9487, 0x948C, 0x948A, 0x9489, 0x948B, 0x9488, 0x9493, 0x9490,
- 0x948F, 0x9492, 0x948E, 0x9497, 0x948D, 0x9495, 0x94AF, 0x94AB, 0x9498, 0x94AD, 0x94A0, 0x949D, 0x94A4, 0x94A3, 0x949E, 0x94AE,
- 0x94A7, 0x9499, 0x949B, 0x94AA, 0x94CC, 0x94C8, 0x94B6, 0x94C3, 0x94B4, 0x94B9, 0x94CD, 0x94B0, 0x94B8, 0x94C0, 0x94BF, 0x94BE,
- 0x949C, 0x94CA, 0x94C9, 0x94C7, 0x94CB, 0x94C2, 0x94B3, 0x94C6, 0x94C5, 0x94BA, 0x94A9, 0x94B2, 0x94BC, 0x94BD, 0x94CF, 0x94F0,
- 0x94D2, 0x94EC, 0x94EA, 0x94F6, 0x94F3, 0x94DC, 0x94DA, 0x94E3, 0x94E8, 0x94E2, 0x94ED, 0x94EB, 0x94E6, 0x8854, 0x94D1, 0x94F7,
- 0x94F1, 0x94DF, 0x94F5, 0x94D5, 0x94EF, 0x94D0, 0x9510, 0x9500, 0x9508, 0x9511, 0x9509, 0x94DD, 0x9512, 0x950C, 0x94A1, 0x94E4,
- 0x94D7, 0x950B, 0x950A, 0x9513, 0x9504, 0x9503, 0x9514, 0x9507, 0x94D3, 0x94FA, 0x94D6, 0x9506, 0x9502, 0x952F, 0x94A2, 0x951E,
- 0x5F55, 0x9516, 0x9529, 0x94D4, 0x9525, 0x9515, 0x951F, 0x9524, 0x9531, 0x94EE, 0x951B, 0x952C, 0x952D, 0x951C, 0x94B1, 0x9526,
- 0x951A, 0x9520, 0x9521, 0x9522, 0x9519, 0x9530, 0x8868, 0x94FC, 0x9528, 0x9494, 0x9534, 0x94FE, 0x9505, 0x9540, 0x9537, 0x94E1,
- 0x9496, 0x953B, 0x953D, 0x9538, 0x9532, 0x9539, 0x953E, 0x952E, 0x9536, 0x9517, 0x953A, 0x9541, 0x9551, 0x9555, 0x9501, 0x9549,
- 0x9548, 0x9543, 0x94A8, 0x84E5, 0x954F, 0x94E0, 0x94E9, 0x953C, 0x9550, 0x9547, 0x9552, 0x954D, 0x9553, 0x955E, 0x955F, 0x94FE,
- 0x9546, 0x9559, 0x9560, 0x955D, 0x94FF, 0x9535, 0x9557, 0x9558, 0x955B, 0x94F2, 0x955C, 0x9556, 0x9542, 0x933E, 0x955A, 0x94E7,
- 0x956A, 0x9508, 0x94D9, 0x9563, 0x9566, 0x9561, 0x949F, 0x956B, 0x950F, 0x9544, 0x954C, 0x9570, 0x956F, 0x956D, 0x94C1, 0x956E,
- 0x94CE, 0x94DB, 0x9571, 0x94F8, 0x956C, 0x9554, 0x9274, 0x9527, 0x9574, 0x94C4, 0x9573, 0x9567, 0x94A5, 0x9575, 0x9576, 0x954A,
- 0x9569, 0x9523, 0x94BB, 0x92AE, 0x51FF, 0x957F, 0x95E8, 0x95E9, 0x95EA, 0x95EB, 0x95EC, 0x95ED, 0x5F00, 0x95F6, 0x95F3, 0x95F0,
- 0x95F2, 0x95F4, 0x95F5, 0x95F8, 0x9602, 0x9601, 0x9600, 0x95FA, 0x95FD, 0x9603, 0x9606, 0x95FE, 0x9605, 0x960A, 0x9609, 0x960E,
- 0x960F, 0x960D, 0x9608, 0x960C, 0x9612, 0x677F, 0x6697, 0x95F1, 0x9614, 0x9615, 0x9611, 0x9617, 0x9618, 0x95FF, 0x9616, 0x9619,
- 0x95EF, 0x5173, 0x961A, 0x9613, 0x9610, 0x8F9F, 0x961B, 0x95FC, 0x9649, 0x9655, 0x9635, 0x9634, 0x9648, 0x9646, 0x9633, 0x9667,
- 0x961F, 0x9636, 0x9668, 0x9645, 0x968F, 0x9669, 0x9690, 0x9647, 0x96B6, 0x53EA, 0x96BD, 0x867D, 0x53CC, 0x96CF, 0x6742, 0x9E21,
- 0x79BB, 0x96BE, 0x4E91, 0x7535, 0x9721, 0x96FE, 0x9701, 0x96F3, 0x972D, 0x53C7, 0x7075, 0x53C6, 0x9753, 0x9759, 0x817C, 0x9765,
- 0x9F17, 0x5DE9, 0x979F, 0x7F30, 0x9791, 0x97AF, 0x97E6, 0x97E7, 0x97E9, 0x97EA, 0x97EC, 0x97EB, 0x97F5, 0x54CD, 0x9875, 0x9876,
- 0x9877, 0x9879, 0x987A, 0x9878, 0x987B, 0x987C, 0x9882, 0x9880, 0x9883, 0x9884, 0x987D, 0x9881, 0x987F, 0x9887, 0x9886, 0x988C,
- 0x9889, 0x9890, 0x988F, 0x5934, 0x988A, 0x988B, 0x9894, 0x9888, 0x9893, 0x9891, 0x9897, 0x9898, 0x989D, 0x989A, 0x989C, 0x9899,
- 0x989B, 0x613F, 0x98A1, 0x98A0, 0x7C7B, 0x989F, 0x98A2, 0x987E, 0x98A4, 0x98A5, 0x663E, 0x98A6, 0x9885, 0x989E, 0x98A7, 0x98CE,
- 0x98D0, 0x98D1, 0x98D2, 0x53F0, 0x98D3, 0x98D4, 0x98CF, 0x98D6, 0x98D5, 0x98D7, 0x98D8, 0x98D9, 0x98DE, 0x9965, 0x9964, 0x9966,
- 0x9968, 0x996A, 0x996B, 0x996C, 0x996D, 0x996E, 0x9974, 0x9972, 0x9971, 0x9970, 0x9973, 0x997A, 0x9978, 0x997C, 0x9977, 0x517B,
- 0x9975, 0x9979, 0x997D, 0x9981, 0x997F, 0x997E, 0x4F59, 0x80B4, 0x9984, 0x9983, 0x996F, 0x9985, 0x9986, 0x7CC7, 0x9967, 0x5582,
- 0x9989, 0x998E, 0x9969, 0x998F, 0x998A, 0x998C, 0x998D, 0x9992, 0x9990, 0x9991, 0x9988, 0x9994, 0x9976, 0x98E8, 0x990D, 0x998B,
- 0x9A6C, 0x9A6D, 0x51AF, 0x9A6E, 0x9A70, 0x9A6F, 0x9A73, 0x9A7B, 0x9A7D, 0x9A79, 0x9A75, 0x9A7E, 0x9A80, 0x9A78, 0x9A76, 0x9A7C,
- 0x9A77, 0x9A88, 0x9A87, 0x9A83, 0x9A86, 0x9A8E, 0x9A8F, 0x9A8B, 0x9A8D, 0x9A93, 0x9A92, 0x9A91, 0x9A90, 0x9A9B, 0x9A97, 0x9A99,
- 0x9A9E, 0x9A98, 0x9A9D, 0x817E, 0x9A7A, 0x9A9A, 0x9A9F, 0x9AA1, 0x84E6, 0x9A9C, 0x9A96, 0x9AA0, 0x9AA2, 0x9A71, 0x9A85, 0x9A95,
- 0x9A81, 0x9A84, 0x9A8C, 0x60CA, 0x9A7F, 0x9AA4, 0x9A74, 0x9AA7, 0x9AA5, 0x9AA6, 0x9A8A, 0x80AE, 0x9AC5, 0x810F, 0x4F53, 0x9ACC,
- 0x9ACB, 0x53D1, 0x677E, 0x80E1, 0x9B13, 0x6597, 0x95F9, 0x960B, 0x9604, 0x90C1, 0x9B49, 0x9B47, 0x9C7C, 0x9C80, 0x9C81, 0x9C82,
- 0x9C7F, 0x9C85, 0x9C86, 0x9C8F, 0x9C87, 0x9C90, 0x9C8D, 0x9C8B, 0x9C8A, 0x9C92, 0x9C95, 0x9C96, 0x9C94, 0x9C9B, 0x9C91, 0x9C9C,
- 0x9CA7, 0x9CA0, 0x9CA9, 0x9CA4, 0x9CA8, 0x9CBB, 0x9CAF, 0x9CAD, 0x9C9E, 0x9CB7, 0x9CB4, 0x9CB1, 0x9CB5, 0x9CB2, 0x9CB3, 0x9CB8,
- 0x9CAE, 0x9CB0, 0x9CB6, 0x9CAB, 0x9CCA, 0x9C97, 0x9CBD, 0x9CC7, 0x9CC5, 0x9CC6, 0x9CC3, 0x9CD2, 0x9CD1, 0x9CA5, 0x9CCF, 0x9CCE,
- 0x9CD0, 0x9CCD, 0x9CC1, 0x9CA2, 0x9CCC, 0x9CA6, 0x9CA3, 0x9CB9, 0x9CD7, 0x9CD4, 0x9CC9, 0x9CD5, 0x9CD6, 0x9CDF, 0x9CDD, 0x9CDC,
- 0x9CDE, 0x9C9F, 0x9CBC, 0x9C8E, 0x9C99, 0x9CE3, 0x9CE2, 0x9C9A, 0x9CC4, 0x9C88, 0x9CA1, 0x9E1F, 0x51EB, 0x9E20, 0x9E24, 0x51E4,
- 0x9E23, 0x9E22, 0x9E29, 0x9E28, 0x9E26, 0x9E30, 0x9E35, 0x9E33, 0x9E32, 0x9E2E, 0x9E31, 0x9E2A, 0x9E2F, 0x9E2D, 0x9E38, 0x9E39,
- 0x9E3B, 0x9E3F, 0x9E3D, 0x9E3A, 0x9E43, 0x9E46, 0x9E41, 0x9E48, 0x9E45, 0x9E44, 0x9E49, 0x9E4C, 0x9E4F, 0x9E4E, 0x9E4A, 0x9E53,
- 0x9E2B, 0x9E51, 0x9E4B, 0x9E59, 0x9E55, 0x9E57, 0x9E56, 0x9E4D, 0x9E5B, 0x9E5C, 0x83BA, 0x9E5F, 0x9E64, 0x9E60, 0x9E61, 0x9E58,
- 0x9E63, 0x9E5A, 0x9E62, 0x9E5E, 0x9E67, 0x9E65, 0x9E25, 0x9E37, 0x9E68, 0x9E36, 0x9E6A, 0x9E54, 0x9E69, 0x9E6B, 0x9E47, 0x9E6C,
- 0x9E70, 0x9E6D, 0x9E6F, 0x9E2C, 0x9E74, 0x9E66, 0x9E73, 0x9E42, 0x9E3E, 0x5364, 0x9E7E, 0x7877, 0x76D0, 0x4E3D, 0x9EA6, 0x9EB8,
- 0x9EB9, 0x9762, 0x4E48, 0x9EC4, 0x9EC9, 0x70B9, 0x515A, 0x9709, 0x9EE1, 0x9EE9, 0x9EFE, 0x9F0B, 0x9F0D, 0x9F39, 0x9F50, 0x658B,
- 0x8D4D, 0x9F51, 0x9F7F, 0x9F80, 0x9F81, 0x9F85, 0x9F87, 0x9F83, 0x9F86, 0x9F84, 0x9F88, 0x9F8A, 0x9F89, 0x9F8B, 0x9F8C, 0x9F99,
- 0x5390, 0x5E9E, 0x9F9A, 0x9F9B, 0x9F9F, 0xA76F, 0x8C48, 0x66F4, 0x8ECA, 0x8CC8, 0x6ED1, 0x4E32, 0x53E5, 0x9F9C, 0x9F9C, 0x5951,
- 0x91D1, 0x5587, 0x5948, 0x61F6, 0x7669, 0x7F85, 0x863F, 0x87BA, 0x88F8, 0x908F, 0x6A02, 0x6D1B, 0x70D9, 0x73DE, 0x843D, 0x916A,
- 0x99F1, 0x4E82, 0x5375, 0x6B04, 0x721B, 0x862D, 0x9E1E, 0x5D50, 0x6FEB, 0x85CD, 0x8964, 0x62C9, 0x81D8, 0x881F, 0x5ECA, 0x6717,
- 0x6D6A, 0x72FC, 0x90CE, 0x4F86, 0x51B7, 0x52DE, 0x64C4, 0x6AD3, 0x7210, 0x76E7, 0x8001, 0x8606, 0x865C, 0x8DEF, 0x9732, 0x9B6F,
- 0x9DFA, 0x788C, 0x797F, 0x7DA0, 0x83C9, 0x9304, 0x9E7F, 0x8AD6, 0x58DF, 0x5F04, 0x7C60, 0x807E, 0x7262, 0x78CA, 0x8CC2, 0x96F7,
- 0x58D8, 0x5C62, 0x6A13, 0x6DDA, 0x6F0F, 0x7D2F, 0x7E37, 0x964B, 0x52D2, 0x808B, 0x51DC, 0x51CC, 0x7A1C, 0x7DBE, 0x83F1, 0x9675,
- 0x8B80, 0x62CF, 0x6A02, 0x8AFE, 0x4E39, 0x5BE7, 0x6012, 0x7387, 0x7570, 0x5317, 0x78FB, 0x4FBF, 0x5FA9, 0x4E0D, 0x6CCC, 0x6578,
- 0x7D22, 0x53C3, 0x585E, 0x7701, 0x8449, 0x8AAA, 0x6BBA, 0x8FB0, 0x6C88, 0x62FE, 0x82E5, 0x63A0, 0x7565, 0x4EAE, 0x5169, 0x51C9,
- 0x6881, 0x7CE7, 0x826F, 0x8AD2, 0x91CF, 0x52F5, 0x5442, 0x5973, 0x5EEC, 0x65C5, 0x6FFE, 0x792A, 0x95AD, 0x9A6A, 0x9E97, 0x9ECE,
- 0x529B, 0x66C6, 0x6B77, 0x8F62, 0x5E74, 0x6190, 0x6200, 0x649A, 0x6F23, 0x7149, 0x7489, 0x79CA, 0x7DF4, 0x806F, 0x8F26, 0x84EE,
- 0x9023, 0x934A, 0x5217, 0x52A3, 0x54BD, 0x70C8, 0x88C2, 0x8AAA, 0x5EC9, 0x5FF5, 0x637B, 0x6BAE, 0x7C3E, 0x7375, 0x4EE4, 0x56F9,
- 0x5BE7, 0x5DBA, 0x601C, 0x73B2, 0x7469, 0x7F9A, 0x8046, 0x9234, 0x96F6, 0x9748, 0x9818, 0x4F8B, 0x79AE, 0x91B4, 0x96B8, 0x60E1,
- 0x4E86, 0x50DA, 0x5BEE, 0x5C3F, 0x6599, 0x6A02, 0x71CE, 0x7642, 0x84FC, 0x907C, 0x9F8D, 0x6688, 0x962E, 0x5289, 0x677B, 0x67F3,
- 0x6D41, 0x6E9C, 0x7409, 0x7559, 0x786B, 0x7D10, 0x985E, 0x516D, 0x622E, 0x9678, 0x502B, 0x5D19, 0x6DEA, 0x8F2A, 0x5F8B, 0x6144,
- 0x6817, 0x7387, 0x9686, 0x5229, 0x540F, 0x5C65, 0x6613, 0x674E, 0x68A8, 0x6CE5, 0x7406, 0x75E2, 0x7F79, 0x88CF, 0x88E1, 0x91CC,
- 0x96E2, 0x533F, 0x6EBA, 0x541D, 0x71D0, 0x7498, 0x85FA, 0x96A3, 0x9C57, 0x9E9F, 0x6797, 0x6DCB, 0x81E8, 0x7ACB, 0x7B20, 0x7C92,
- 0x72C0, 0x7099, 0x8B58, 0x4EC0, 0x8336, 0x523A, 0x5207, 0x5EA6, 0x62D3, 0x7CD6, 0x5B85, 0x6D1E, 0x66B4, 0x8F3B, 0x884C, 0x964D,
- 0x898B, 0x5ED3, 0x5140, 0x55C0, 0x585A, 0x6674, 0x51DE, 0x732A, 0x76CA, 0x793C, 0x795E, 0x7965, 0x798F, 0x9756, 0x7CBE, 0x7FBD,
- 0x8612, 0x8AF8, 0x9038, 0x90FD, 0x98EF, 0x98FC, 0x9928, 0x9DB4, 0x4FAE, 0x50E7, 0x514D, 0x52C9, 0x52E4, 0x5351, 0x559D, 0x5606,
- 0x5668, 0x5840, 0x58A8, 0x5C64, 0x5C6E, 0x6094, 0x6168, 0x618E, 0x61F2, 0x654F, 0x65E2, 0x6691, 0x6885, 0x6D77, 0x6E1A, 0x6F22,
- 0x716E, 0x722B, 0x7422, 0x7891, 0x793E, 0x7949, 0x7948, 0x7950, 0x7956, 0x795D, 0x798D, 0x798E, 0x7A40, 0x7A81, 0x7BC0, 0x7DF4,
- 0x7E09, 0x7E41, 0x7F72, 0x8005, 0x81ED, 0x8279, 0x8279, 0x8457, 0x8910, 0x8996, 0x8B01, 0x8B39, 0x8CD3, 0x8D08, 0x8FB6, 0x9038,
- 0x96E3, 0x97FF, 0x983B, 0x6075, 0x8218, 0x4E26, 0x51B5, 0x5168, 0x4F80, 0x5145, 0x5180, 0x52C7, 0x52FA, 0x559D, 0x5555, 0x5599,
- 0x55E2, 0x585A, 0x58B3, 0x5944, 0x5954, 0x5A62, 0x5B28, 0x5ED2, 0x5ED9, 0x5F69, 0x5FAD, 0x60D8, 0x614E, 0x6108, 0x618E, 0x6160,
- 0x61F2, 0x6234, 0x63C4, 0x641C, 0x6452, 0x6556, 0x6674, 0x6717, 0x671B, 0x6756, 0x6B79, 0x6BBA, 0x6D41, 0x6EDB, 0x6ECB, 0x6F22,
- 0x701E, 0x716E, 0x77A7, 0x7235, 0x72AF, 0x732A, 0x7471, 0x7506, 0x753B, 0x761D, 0x761F, 0x76CA, 0x76DB, 0x76F4, 0x774A, 0x7740,
- 0x78CC, 0x7AB1, 0x7BC0, 0x7C7B, 0x7D5B, 0x7DF4, 0x7F3E, 0x8005, 0x8352, 0x83EF, 0x8779, 0x8941, 0x8986, 0x8996, 0x8ABF, 0x8AF8,
- 0x8ACB, 0x8B01, 0x8AFE, 0x8AED, 0x8B39, 0x8B8A, 0x8D08, 0x8F38, 0x9072, 0x9199, 0x9276, 0x967C, 0x96E3, 0x9756, 0x97DB, 0x97FF,
- 0x980B, 0x983B, 0x9B12, 0x9F9C, 0x3B9D, 0x4018, 0x4039, 0x9F43, 0x9F8E, 0x05E2, 0x05D0, 0x05D3, 0x05D4, 0x05DB, 0x05DC, 0x05DD,
- 0x05E8, 0x05EA, 0x002B, 0x0671, 0x0671, 0x067B, 0x067B, 0x067B, 0x067B, 0x067E, 0x067E, 0x067E, 0x067E, 0x0680, 0x0680, 0x0680,
- 0x0680, 0x067A, 0x067A, 0x067A, 0x067A, 0x067F, 0x067F, 0x067F, 0x067F, 0x0679, 0x0679, 0x0679, 0x0679, 0x06A4, 0x06A4, 0x06A4,
- 0x06A4, 0x06A6, 0x06A6, 0x06A6, 0x06A6, 0x0684, 0x0684, 0x0684, 0x0684, 0x0683, 0x0683, 0x0683, 0x0683, 0x0686, 0x0686, 0x0686,
- 0x0686, 0x0687, 0x0687, 0x0687, 0x0687, 0x068D, 0x068D, 0x068C, 0x068C, 0x068E, 0x068E, 0x0688, 0x0688, 0x0698, 0x0698, 0x0691,
- 0x0691, 0x06A9, 0x06A9, 0x06A9, 0x06A9, 0x06AF, 0x06AF, 0x06AF, 0x06AF, 0x06B3, 0x06B3, 0x06B3, 0x06B3, 0x06B1, 0x06B1, 0x06B1,
- 0x06B1, 0x06BA, 0x06BA, 0x06BB, 0x06BB, 0x06BB, 0x06BB, 0x06C0, 0x06C0, 0x06C1, 0x06C1, 0x06C1, 0x06C1, 0x06BE, 0x06BE, 0x06BE,
- 0x06BE, 0x06D2, 0x06D2, 0x06D3, 0x06D3, 0x06AD, 0x06AD, 0x06AD, 0x06AD, 0x06C7, 0x06C7, 0x06C6, 0x06C6, 0x06C8, 0x06C8, 0x0677,
- 0x06CB, 0x06CB, 0x06C5, 0x06C5, 0x06C9, 0x06C9, 0x06D0, 0x06D0, 0x06D0, 0x06D0, 0x0649, 0x0649, 0x06CC, 0x06CC, 0x06CC, 0x06CC,
- 0x002C, 0x3001, 0x3002, 0x003A, 0x003B, 0x0021, 0x003F, 0x3016, 0x3017, 0x2026, 0x2025, 0x2014, 0x2013, 0x005F, 0x005F, 0x0028,
- 0x0029, 0x007B, 0x007D, 0x3014, 0x3015, 0x3010, 0x3011, 0x300A, 0x300B, 0x3008, 0x3009, 0x300C, 0x300D, 0x300E, 0x300F, 0x005B,
- 0x005D, 0x203E, 0x203E, 0x203E, 0x203E, 0x005F, 0x005F, 0x005F, 0x002C, 0x3001, 0x002E, 0x003B, 0x003A, 0x003F, 0x0021, 0x2014,
- 0x0028, 0x0029, 0x007B, 0x007D, 0x3014, 0x3015, 0x0023, 0x0026, 0x002A, 0x002B, 0x002D, 0x003C, 0x003E, 0x003D, 0x005C, 0x0024,
- 0x0025, 0x0040, 0x064B, 0x064C, 0x064D, 0x064E, 0x064F, 0x0650, 0x0651, 0x0652, 0x0621, 0x0622, 0x0622, 0x0623, 0x0623, 0x0624,
- 0x0624, 0x0625, 0x0625, 0x0626, 0x0626, 0x0626, 0x0626, 0x0627, 0x0627, 0x0628, 0x0628, 0x0628, 0x0628, 0x0629, 0x0629, 0x062A,
- 0x062A, 0x062A, 0x062A, 0x062B, 0x062B, 0x062B, 0x062B, 0x062C, 0x062C, 0x062C, 0x062C, 0x062D, 0x062D, 0x062D, 0x062D, 0x062E,
- 0x062E, 0x062E, 0x062E, 0x062F, 0x062F, 0x0630, 0x0630, 0x0631, 0x0631, 0x0632, 0x0632, 0x0633, 0x0633, 0x0633, 0x0633, 0x0634,
- 0x0634, 0x0634, 0x0634, 0x0635, 0x0635, 0x0635, 0x0635, 0x0636, 0x0636, 0x0636, 0x0636, 0x0637, 0x0637, 0x0637, 0x0637, 0x0638,
- 0x0638, 0x0638, 0x0638, 0x0639, 0x0639, 0x0639, 0x0639, 0x063A, 0x063A, 0x063A, 0x063A, 0x0641, 0x0641, 0x0641, 0x0641, 0x0642,
- 0x0642, 0x0642, 0x0642, 0x0643, 0x0643, 0x0643, 0x0643, 0x0644, 0x0644, 0x0644, 0x0644, 0x0645, 0x0645, 0x0645, 0x0645, 0x0646,
- 0x0646, 0x0646, 0x0646, 0x0647, 0x0647, 0x0647, 0x0647, 0x0648, 0x0648, 0x0649, 0x0649, 0x064A, 0x064A, 0x064A, 0x064A, 0x0021,
- 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, 0x0030, 0x0031,
- 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, 0x0040, 0x0041,
- 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051,
- 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, 0x0060, 0x0061,
- 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, 0x0070, 0x0071,
- 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x2985, 0x2986, 0x3002,
- 0x300C, 0x300D, 0x3001, 0x30FB, 0x30F2, 0x30A1, 0x30A3, 0x30A5, 0x30A7, 0x30A9, 0x30E3, 0x30E5, 0x30E7, 0x30C3, 0x30FC, 0x30A2,
- 0x30A4, 0x30A6, 0x30A8, 0x30AA, 0x30AB, 0x30AD, 0x30AF, 0x30B1, 0x30B3, 0x30B5, 0x30B7, 0x30B9, 0x30BB, 0x30BD, 0x30BF, 0x30C1,
- 0x30C4, 0x30C6, 0x30C8, 0x30CA, 0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF, 0x30D2, 0x30D5, 0x30D8, 0x30DB, 0x30DE, 0x30DF, 0x30E0,
- 0x30E1, 0x30E2, 0x30E4, 0x30E6, 0x30E8, 0x30E9, 0x30EA, 0x30EB, 0x30EC, 0x30ED, 0x30EF, 0x30F3, 0x3099, 0x309A, 0x3164, 0x3131,
- 0x3132, 0x3133, 0x3134, 0x3135, 0x3136, 0x3137, 0x3138, 0x3139, 0x313A, 0x313B, 0x313C, 0x313D, 0x313E, 0x313F, 0x3140, 0x3141,
- 0x3142, 0x3143, 0x3144, 0x3145, 0x3146, 0x3147, 0x3148, 0x3149, 0x314A, 0x314B, 0x314C, 0x314D, 0x314E, 0x314F, 0x3150, 0x3151,
- 0x3152, 0x3153, 0x3154, 0x3155, 0x3156, 0x3157, 0x3158, 0x3159, 0x315A, 0x315B, 0x315C, 0x315D, 0x315E, 0x315F, 0x3160, 0x3161,
- 0x3162, 0x3163, 0x00A2, 0x00A3, 0x00AC, 0x00AF, 0x00A6, 0x00A5, 0x20A9, 0x2502, 0x2190, 0x2191, 0x2192, 0x2193, 0x25A0, 0x25CB
-};
-extern const FX_WCHAR g_UnicodeData_Normalization_Map2[1724] = {
- 0x004F, 0x0045, 0x0054, 0x004D, 0x006F, 0x0065, 0x0049, 0x004A, 0x0069, 0x006A, 0x004F, 0x0045, 0x006F, 0x0065, 0x0044, 0x017D,
- 0x0044, 0x017E, 0x0064, 0x017E, 0x004C, 0x004A, 0x004C, 0x006A, 0x006C, 0x006A, 0x004E, 0x004A, 0x004E, 0x006A, 0x006E, 0x006A,
- 0x0044, 0x005A, 0x0044, 0x007A, 0x0064, 0x007A, 0x0064, 0x0062, 0x0071, 0x0070, 0x004F, 0x0045, 0x0064, 0x007A, 0x0064, 0x0292,
- 0x0064, 0x007A, 0x0074, 0x0073, 0x0074, 0x0283, 0x0074, 0x0063, 0x0066, 0x014B, 0x006C, 0x0073, 0x006C, 0x007A, 0x041D, 0x0413,
- 0x043D, 0x0433, 0x0422, 0x0426, 0x0442, 0x0446, 0x0410, 0x0415, 0x0430, 0x0435, 0x0565, 0x0582, 0x0627, 0x0674, 0x0648, 0x0674,
- 0x06C7, 0x0674, 0x064A, 0x0674, 0x06D5, 0x0654, 0x06C1, 0x0654, 0x06D2, 0x0654, 0x0928, 0x093C, 0x0930, 0x093C, 0x0933, 0x093C,
- 0x0915, 0x093C, 0x0916, 0x093C, 0x0917, 0x093C, 0x091C, 0x093C, 0x0921, 0x093C, 0x0922, 0x093C, 0x092B, 0x093C, 0x092F, 0x093C,
- 0x09C7, 0x09BE, 0x09C7, 0x09D7, 0x09A1, 0x09BC, 0x09A2, 0x09BC, 0x09AF, 0x09BC, 0x0A32, 0x0A3C, 0x0A38, 0x0A3C, 0x0A16, 0x0A3C,
- 0x0A17, 0x0A3C, 0x0A1C, 0x0A3C, 0x0A2B, 0x0A3C, 0x0B47, 0x0B56, 0x0B47, 0x0B3E, 0x0B47, 0x0B57, 0x0B21, 0x0B3C, 0x0B22, 0x0B3C,
- 0x0B92, 0x0BD7, 0x0BC6, 0x0BBE, 0x0BC7, 0x0BBE, 0x0BC6, 0x0BD7, 0x0C46, 0x0C56, 0x0CBF, 0x0CD5, 0x0CC6, 0x0CD5, 0x0CC6, 0x0CD6,
- 0x0CC6, 0x0CC2, 0x0CCA, 0x0CD5, 0x0D46, 0x0D3E, 0x0D47, 0x0D3E, 0x0D46, 0x0D57, 0x0DD9, 0x0DCA, 0x0DD9, 0x0DCF, 0x0DDC, 0x0DCA,
- 0x0DD9, 0x0DDF, 0x0E4D, 0x0E32, 0x0ECD, 0x0EB2, 0x0EAB, 0x0E99, 0x0EAB, 0x0EA1, 0x0F42, 0x0FB7, 0x0F4C, 0x0FB7, 0x0F51, 0x0FB7,
- 0x0F56, 0x0FB7, 0x0F5B, 0x0FB7, 0x0F40, 0x0FB5, 0x0F71, 0x0F72, 0x0F71, 0x0F74, 0x0FB2, 0x0F80, 0x0FB2, 0x0F81, 0x0FB3, 0x0F80,
- 0x0FB3, 0x0F81, 0x0F71, 0x0F80, 0x0F92, 0x0FB7, 0x0F9C, 0x0FB7, 0x0FA1, 0x0FB7, 0x0FA6, 0x0FB7, 0x0FAB, 0x0FB7, 0x0F90, 0x0FB5,
- 0x1025, 0x102E, 0x1B05, 0x1B35, 0x1B07, 0x1B35, 0x1B09, 0x1B35, 0x1B0B, 0x1B35, 0x1B0D, 0x1B35, 0x1B11, 0x1B35, 0x1B3A, 0x1B35,
- 0x1B3C, 0x1B35, 0x1B3E, 0x1B35, 0x1B3F, 0x1B35, 0x1B42, 0x1B35, 0x0074, 0x0068, 0x002E, 0x002E, 0x2032, 0x2032, 0x2035, 0x2035,
- 0x0021, 0x0021, 0x0020, 0x0305, 0x003F, 0x003F, 0x003F, 0x0021, 0x0021, 0x003F, 0x0052, 0x0073, 0x00B0, 0x0043, 0x00B0, 0x0046,
- 0x004E, 0x006F, 0x0053, 0x004D, 0x0054, 0x004D, 0x0031, 0x002F, 0x0049, 0x0049, 0x0049, 0x0056, 0x0056, 0x0049, 0x0049, 0x0058,
- 0x0058, 0x0049, 0x0069, 0x0069, 0x0069, 0x0076, 0x0076, 0x0069, 0x0069, 0x0078, 0x0078, 0x0069, 0x2190, 0x0338, 0x2192, 0x0338,
- 0x2194, 0x0338, 0x21D0, 0x0338, 0x21D4, 0x0338, 0x21D2, 0x0338, 0x2223, 0x0338, 0x2225, 0x0338, 0x222B, 0x222B, 0x222E, 0x222E,
- 0x223C, 0x0338, 0x2243, 0x0338, 0x2245, 0x0338, 0x2248, 0x0338, 0x003D, 0x002F, 0x2261, 0x002F, 0x224D, 0x002F, 0x003C, 0x002F,
- 0x003E, 0x002F, 0x2264, 0x002F, 0x2265, 0x002F, 0x2272, 0x002F, 0x2273, 0x002F, 0x2276, 0x002F, 0x2277, 0x002F, 0x227A, 0x002F,
- 0x227B, 0x002F, 0x2282, 0x002F, 0x2283, 0x002F, 0x2286, 0x002F, 0x2287, 0x002F, 0x22A2, 0x002F, 0x22A8, 0x002F, 0x22A9, 0x002F,
- 0x22AB, 0x002F, 0x227C, 0x002F, 0x227D, 0x002F, 0x2291, 0x002F, 0x2292, 0x002F, 0x22B2, 0x002F, 0x22B3, 0x002F, 0x22B4, 0x002F,
- 0x22B5, 0x002F, 0x0042, 0x0053, 0x0048, 0x0054, 0x004C, 0x0046, 0x0056, 0x0054, 0x0046, 0x0046, 0x0043, 0x0052, 0x0053, 0x0053,
- 0x0053, 0x0049, 0x0045, 0x004D, 0x0046, 0x0053, 0x0047, 0x0053, 0x0052, 0x0053, 0x0055, 0x0053, 0x0053, 0x0050, 0x0031, 0x0030,
- 0x0031, 0x0031, 0x0031, 0x0032, 0x0031, 0x0033, 0x0031, 0x0034, 0x0031, 0x0035, 0x0031, 0x0036, 0x0031, 0x0037, 0x0031, 0x0038,
- 0x0031, 0x0039, 0x0032, 0x0030, 0x0031, 0x002E, 0x0032, 0x002E, 0x0033, 0x002E, 0x0034, 0x002E, 0x0035, 0x002E, 0x0036, 0x002E,
- 0x0037, 0x002E, 0x0038, 0x002E, 0x0039, 0x002E, 0x0031, 0x0031, 0x0031, 0x0032, 0x0031, 0x0033, 0x0031, 0x0034, 0x0031, 0x0035,
- 0x0031, 0x0036, 0x0031, 0x0037, 0x0031, 0x0038, 0x0031, 0x0039, 0x0032, 0x0030, 0x0031, 0x0030, 0x0031, 0x0030, 0x0031, 0x0030,
- 0x0031, 0x0030, 0x003D, 0x003D, 0x2ADD, 0x002F, 0x304B, 0x3099, 0x304D, 0x3099, 0x304F, 0x3099, 0x3051, 0x3099, 0x3053, 0x3099,
- 0x3055, 0x3099, 0x3057, 0x3099, 0x3059, 0x3099, 0x305B, 0x3099, 0x305D, 0x3099, 0x305F, 0x3099, 0x3061, 0x3099, 0x3064, 0x3099,
- 0x3066, 0x3099, 0x3068, 0x3099, 0x306F, 0x3099, 0x306F, 0x309A, 0x3072, 0x3099, 0x3072, 0x309A, 0x3075, 0x3099, 0x3075, 0x309A,
- 0x3078, 0x3099, 0x3078, 0x309A, 0x307B, 0x3099, 0x307B, 0x309A, 0x3046, 0x3099, 0x0020, 0x3099, 0x0020, 0x309A, 0x309D, 0x3099,
- 0x3088, 0x308A, 0x30AB, 0x3099, 0x30AD, 0x3099, 0x30AF, 0x3099, 0x30B1, 0x3099, 0x30B3, 0x3099, 0x30B5, 0x3099, 0x30B7, 0x3099,
- 0x30B9, 0x3099, 0x30BB, 0x3099, 0x30BD, 0x3099, 0x30BF, 0x3099, 0x30C1, 0x3099, 0x30C4, 0x3099, 0x30C6, 0x3099, 0x30C8, 0x3099,
- 0x30CF, 0x3099, 0x30CF, 0x309A, 0x30D2, 0x3099, 0x30D2, 0x309A, 0x30D5, 0x3099, 0x30D5, 0x309A, 0x30D8, 0x3099, 0x30D8, 0x309A,
- 0x30DB, 0x3099, 0x30DB, 0x309A, 0x30A6, 0x3099, 0x30EF, 0x3099, 0x30F0, 0x3099, 0x30F1, 0x3099, 0x30F2, 0x3099, 0x30FD, 0x3099,
- 0x30B3, 0x30C8, 0x0032, 0x0031, 0x0032, 0x0032, 0x0032, 0x0033, 0x0032, 0x0034, 0x0032, 0x0035, 0x0032, 0x0036, 0x0032, 0x0037,
- 0x0032, 0x0038, 0x0032, 0x0039, 0x0033, 0x0030, 0x0033, 0x0031, 0x0033, 0x0032, 0x0033, 0x0033, 0x0033, 0x0034, 0x0033, 0x0035,
- 0x1100, 0x1161, 0x1102, 0x1161, 0x1103, 0x1161, 0x1105, 0x1161, 0x1106, 0x1161, 0x1107, 0x1161, 0x1109, 0x1161, 0x110B, 0x1161,
- 0x110C, 0x1161, 0x110E, 0x1161, 0x110F, 0x1161, 0x1110, 0x1161, 0x1111, 0x1161, 0x1112, 0x1161, 0x110B, 0x116E, 0x0033, 0x0036,
- 0x0033, 0x0037, 0x0033, 0x0038, 0x0033, 0x0039, 0x0034, 0x0030, 0x0034, 0x0031, 0x0034, 0x0032, 0x0034, 0x0033, 0x0034, 0x0034,
- 0x0034, 0x0035, 0x0034, 0x0036, 0x0034, 0x0037, 0x0034, 0x0038, 0x0034, 0x0039, 0x0035, 0x0030, 0x0031, 0x6708, 0x0032, 0x6708,
- 0x0033, 0x6708, 0x0034, 0x6708, 0x0035, 0x6708, 0x0036, 0x6708, 0x0037, 0x6708, 0x0038, 0x6708, 0x0039, 0x6708, 0x0048, 0x0067,
- 0x0065, 0x0056, 0x30AE, 0x30AC, 0x30AD, 0x30ED, 0x30C7, 0x30B7, 0x30C9, 0x30EB, 0x30C8, 0x30F3, 0x30CA, 0x30CE, 0x30D4, 0x30B3,
- 0x30D3, 0x30EB, 0x30DA, 0x30BD, 0x30DB, 0x30F3, 0x30DF, 0x30EA, 0x30E1, 0x30AC, 0x30EA, 0x30E9, 0x30EC, 0x30E0, 0x0030, 0x70B9,
- 0x0031, 0x70B9, 0x0032, 0x70B9, 0x0033, 0x70B9, 0x0034, 0x70B9, 0x0035, 0x70B9, 0x0036, 0x70B9, 0x0037, 0x70B9, 0x0038, 0x70B9,
- 0x0039, 0x70B9, 0x0064, 0x0061, 0x0041, 0x0055, 0x006F, 0x0056, 0x0070, 0x0063, 0x0064, 0x006D, 0x0049, 0x0055, 0x5E73, 0x6210,
- 0x662D, 0x548C, 0x5927, 0x6B63, 0x660E, 0x6CBB, 0x0070, 0x0041, 0x006E, 0x0041, 0x03BC, 0x0041, 0x006D, 0x0041, 0x006B, 0x0041,
- 0x004B, 0x0042, 0x004D, 0x0042, 0x0047, 0x0042, 0x0070, 0x0046, 0x006E, 0x0046, 0x03BC, 0x0046, 0x03BC, 0x0067, 0x006D, 0x0067,
- 0x006B, 0x0067, 0x0048, 0x007A, 0x03BC, 0x2113, 0x006D, 0x2113, 0x0064, 0x2113, 0x006B, 0x2113, 0x0066, 0x006D, 0x006E, 0x006D,
- 0x03BC, 0x006D, 0x006D, 0x006D, 0x0063, 0x006D, 0x006B, 0x006D, 0x006D, 0x00B2, 0x006D, 0x00B3, 0x0050, 0x0061, 0x0070, 0x0073,
- 0x006E, 0x0073, 0x03BC, 0x0073, 0x006D, 0x0073, 0x0070, 0x0056, 0x006E, 0x0056, 0x03BC, 0x0056, 0x006D, 0x0056, 0x006B, 0x0056,
- 0x004D, 0x0056, 0x0070, 0x0057, 0x006E, 0x0057, 0x03BC, 0x0057, 0x006D, 0x0057, 0x006B, 0x0057, 0x004D, 0x0057, 0x006B, 0x03A9,
- 0x004D, 0x03A9, 0x0042, 0x0071, 0x0063, 0x0063, 0x0063, 0x0064, 0x0064, 0x0042, 0x0047, 0x0079, 0x0068, 0x0061, 0x0048, 0x0050,
- 0x0069, 0x006E, 0x004B, 0x004B, 0x004B, 0x004D, 0x006B, 0x0074, 0x006C, 0x006D, 0x006C, 0x006E, 0x006C, 0x0078, 0x006D, 0x0062,
- 0x0050, 0x0048, 0x0050, 0x0052, 0x0073, 0x0072, 0x0053, 0x0076, 0x0057, 0x0062, 0x0031, 0x65E5, 0x0032, 0x65E5, 0x0033, 0x65E5,
- 0x0034, 0x65E5, 0x0035, 0x65E5, 0x0036, 0x65E5, 0x0037, 0x65E5, 0x0038, 0x65E5, 0x0039, 0x65E5, 0x0066, 0x0066, 0x0066, 0x0069,
- 0x0066, 0x006C, 0x017F, 0x0074, 0x0073, 0x0074, 0x0574, 0x0576, 0x0574, 0x0565, 0x0574, 0x056B, 0x057E, 0x0576, 0x0574, 0x056D,
- 0x05D9, 0x05B4, 0x05F2, 0x05B7, 0x05E9, 0x05C1, 0x05E9, 0x05C2, 0xFB49, 0x05C1, 0xFB49, 0x05C2, 0x05D0, 0x05B7, 0x05D0, 0x05B8,
- 0x05D0, 0x05BC, 0x05D1, 0x05BC, 0x05D2, 0x05BC, 0x05D3, 0x05BC, 0x05D4, 0x05BC, 0x05D5, 0x05BC, 0x05D6, 0x05BC, 0x05D8, 0x05BC,
- 0x05D9, 0x05BC, 0x05DA, 0x05BC, 0x05DB, 0x05BC, 0x05DC, 0x05BC, 0x05DE, 0x05BC, 0x05E0, 0x05BC, 0x05E1, 0x05BC, 0x05E3, 0x05BC,
- 0x05E4, 0x05BC, 0x05E6, 0x05BC, 0x05E7, 0x05BC, 0x05E8, 0x05BC, 0x05E9, 0x05BC, 0x05EA, 0x05BC, 0x05D5, 0x05B9, 0x05D1, 0x05BF,
- 0x05DB, 0x05BF, 0x05E4, 0x05BF, 0x05D0, 0x05DC, 0x0626, 0x0627, 0x0626, 0x0627, 0x0626, 0x06D5, 0x0626, 0x06D5, 0x0626, 0x0648,
- 0x0626, 0x0648, 0x0626, 0x06C7, 0x0626, 0x06C7, 0x0626, 0x06C6, 0x0626, 0x06C6, 0x0626, 0x06C8, 0x0626, 0x06C8, 0x0626, 0x06D0,
- 0x0626, 0x06D0, 0x0626, 0x06D0, 0x0626, 0x0649, 0x0626, 0x0649, 0x0626, 0x0649, 0x0626, 0x062C, 0x0626, 0x062D, 0x0626, 0x0645,
- 0x0626, 0x0649, 0x0626, 0x064A, 0x0628, 0x062C, 0x0628, 0x062D, 0x0628, 0x062E, 0x0628, 0x0645, 0x0628, 0x0649, 0x0628, 0x064A,
- 0x062A, 0x062C, 0x062A, 0x062D, 0x062A, 0x062E, 0x062A, 0x0645, 0x062A, 0x0649, 0x062A, 0x064A, 0x062B, 0x062C, 0x062B, 0x0645,
- 0x062B, 0x0649, 0x062B, 0x064A, 0x062C, 0x062D, 0x062C, 0x0645, 0x062D, 0x062C, 0x062D, 0x0645, 0x062E, 0x062C, 0x062E, 0x062D,
- 0x062E, 0x0645, 0x0633, 0x062C, 0x0633, 0x062D, 0x0633, 0x062E, 0x0633, 0x0645, 0x0635, 0x062D, 0x0635, 0x0645, 0x0636, 0x062C,
- 0x0636, 0x062D, 0x0636, 0x062E, 0x0636, 0x0645, 0x0637, 0x062D, 0x0637, 0x0645, 0x0638, 0x0645, 0x0639, 0x062C, 0x0639, 0x0645,
- 0x063A, 0x062C, 0x063A, 0x0645, 0x0641, 0x062C, 0x0641, 0x062D, 0x0641, 0x062E, 0x0641, 0x0645, 0x0641, 0x0649, 0x0641, 0x064A,
- 0x0642, 0x062D, 0x0642, 0x0645, 0x0642, 0x0649, 0x0642, 0x064A, 0x0643, 0x0627, 0x0643, 0x062C, 0x0643, 0x062D, 0x0643, 0x062E,
- 0x0643, 0x0644, 0x0643, 0x0645, 0x0643, 0x0649, 0x0643, 0x064A, 0x0644, 0x062C, 0x0644, 0x062D, 0x0644, 0x062E, 0x0644, 0x0645,
- 0x0644, 0x0649, 0x0644, 0x064A, 0x0645, 0x062C, 0x0645, 0x062D, 0x0645, 0x062E, 0x0645, 0x0645, 0x0645, 0x0649, 0x0645, 0x064A,
- 0x0646, 0x062C, 0x0646, 0x062D, 0x0646, 0x062E, 0x0646, 0x0645, 0x0646, 0x0649, 0x0646, 0x064A, 0x0647, 0x062C, 0x0647, 0x0645,
- 0x0647, 0x0649, 0x0647, 0x064A, 0x064A, 0x062C, 0x064A, 0x062D, 0x064A, 0x062E, 0x064A, 0x0645, 0x064A, 0x0649, 0x064A, 0x064A,
- 0x0630, 0x0670, 0x0631, 0x0670, 0x0649, 0x0670, 0x064C, 0x0651, 0x064D, 0x0651, 0x064E, 0x0651, 0x064F, 0x0651, 0x0650, 0x0651,
- 0x0651, 0x0670, 0x0626, 0x0631, 0x0626, 0x0632, 0x0626, 0x0645, 0x0626, 0x0646, 0x0626, 0x0649, 0x0626, 0x064A, 0x0628, 0x0631,
- 0x0628, 0x0632, 0x0628, 0x0645, 0x0628, 0x0646, 0x0628, 0x0649, 0x0628, 0x064A, 0x062A, 0x0631, 0x062A, 0x0632, 0x062A, 0x0645,
- 0x062A, 0x0646, 0x062A, 0x0649, 0x062A, 0x064A, 0x062B, 0x0631, 0x062B, 0x0632, 0x062B, 0x0645, 0x062B, 0x0646, 0x062B, 0x0649,
- 0x062B, 0x064A, 0x0641, 0x0649, 0x0641, 0x064A, 0x0642, 0x0649, 0x0642, 0x064A, 0x0643, 0x0627, 0x0643, 0x0644, 0x0643, 0x0645,
- 0x0643, 0x0649, 0x0643, 0x064A, 0x0644, 0x0645, 0x0644, 0x0649, 0x0644, 0x064A, 0x0645, 0x0627, 0x0645, 0x0645, 0x0646, 0x0631,
- 0x0646, 0x0632, 0x0646, 0x0645, 0x0646, 0x0646, 0x0646, 0x0649, 0x0646, 0x064A, 0x0649, 0x0670, 0x064A, 0x0631, 0x064A, 0x0632,
- 0x064A, 0x0645, 0x064A, 0x0646, 0x064A, 0x0649, 0x064A, 0x064A, 0x0626, 0x062C, 0x0626, 0x062D, 0x0626, 0x062E, 0x0626, 0x0645,
- 0x0626, 0x0647, 0x0628, 0x062C, 0x0628, 0x062D, 0x0628, 0x062E, 0x0628, 0x0645, 0x0628, 0x0647, 0x062A, 0x062C, 0x062A, 0x062D,
- 0x062A, 0x062E, 0x062A, 0x0645, 0x062A, 0x0647, 0x062B, 0x0645, 0x062C, 0x062D, 0x062C, 0x0645, 0x062D, 0x062C, 0x062D, 0x0645,
- 0x062E, 0x062C, 0x062E, 0x0645, 0x0633, 0x062C, 0x0633, 0x062D, 0x0633, 0x062E, 0x0633, 0x0645, 0x0635, 0x062D, 0x0635, 0x062E,
- 0x0635, 0x0645, 0x0636, 0x062C, 0x0636, 0x062D, 0x0636, 0x062E, 0x0636, 0x0645, 0x0637, 0x062D, 0x0638, 0x0645, 0x0639, 0x062C,
- 0x0639, 0x0645, 0x063A, 0x062C, 0x063A, 0x0645, 0x0641, 0x062C, 0x0641, 0x062D, 0x0641, 0x062E, 0x0641, 0x0645, 0x0642, 0x062D,
- 0x0642, 0x0645, 0x0643, 0x062C, 0x0643, 0x062D, 0x0643, 0x062E, 0x0643, 0x0644, 0x0643, 0x0645, 0x0644, 0x062C, 0x0644, 0x062D,
- 0x0644, 0x062E, 0x0644, 0x0645, 0x0644, 0x0647, 0x0645, 0x062C, 0x0645, 0x062D, 0x0645, 0x062E, 0x0645, 0x0645, 0x0646, 0x062C,
- 0x0646, 0x062D, 0x0646, 0x062E, 0x0646, 0x0645, 0x0646, 0x0647, 0x0647, 0x062C, 0x0647, 0x0645, 0x0647, 0x0670, 0x064A, 0x062C,
- 0x064A, 0x062D, 0x064A, 0x062E, 0x064A, 0x0645, 0x064A, 0x0647, 0x0626, 0x0645, 0x0626, 0x0647, 0x0628, 0x0645, 0x0628, 0x0647,
- 0x062A, 0x0645, 0x062A, 0x0647, 0x062B, 0x0645, 0x062B, 0x0647, 0x0633, 0x0645, 0x0633, 0x0647, 0x0634, 0x0645, 0x0634, 0x0647,
- 0x0643, 0x0644, 0x0643, 0x0645, 0x0644, 0x0645, 0x0646, 0x0645, 0x0646, 0x0647, 0x064A, 0x0645, 0x064A, 0x0647, 0x0637, 0x0649,
- 0x0637, 0x064A, 0x0639, 0x0649, 0x0639, 0x064A, 0x063A, 0x0649, 0x063A, 0x064A, 0x0633, 0x0649, 0x0633, 0x064A, 0x0634, 0x0649,
- 0x0634, 0x064A, 0x062D, 0x0649, 0x062D, 0x064A, 0x062C, 0x0649, 0x062C, 0x064A, 0x062E, 0x0649, 0x062E, 0x064A, 0x0635, 0x0649,
- 0x0635, 0x064A, 0x0636, 0x0649, 0x0636, 0x064A, 0x0634, 0x062C, 0x0634, 0x062D, 0x0634, 0x062E, 0x0634, 0x0645, 0x0634, 0x0631,
- 0x0633, 0x0631, 0x0635, 0x0631, 0x0636, 0x0631, 0x0637, 0x0649, 0x0637, 0x064A, 0x0639, 0x0649, 0x0639, 0x064A, 0x063A, 0x0649,
- 0x063A, 0x064A, 0x0633, 0x0649, 0x0633, 0x064A, 0x0634, 0x0649, 0x0634, 0x064A, 0x062D, 0x0649, 0x062D, 0x064A, 0x062C, 0x0649,
- 0x062C, 0x064A, 0x062E, 0x0649, 0x062E, 0x064A, 0x0635, 0x0649, 0x0635, 0x064A, 0x0636, 0x0649, 0x0636, 0x064A, 0x0634, 0x062C,
- 0x0634, 0x062D, 0x0634, 0x062E, 0x0634, 0x0645, 0x0634, 0x0631, 0x0633, 0x0631, 0x0635, 0x0631, 0x0636, 0x0631, 0x0634, 0x062C,
- 0x0634, 0x062D, 0x0634, 0x062E, 0x0634, 0x0645, 0x0633, 0x0647, 0x0634, 0x0647, 0x0637, 0x0645, 0x0633, 0x062C, 0x0633, 0x062D,
- 0x0633, 0x062E, 0x0634, 0x062C, 0x0634, 0x062D, 0x0634, 0x062E, 0x0637, 0x0645, 0x0638, 0x0645, 0x0627, 0x064B, 0x0627, 0x064B,
- 0x0640, 0x064B, 0x0640, 0x064E, 0x0640, 0x064F, 0x0640, 0x0650, 0x0640, 0x0651, 0x0640, 0x0652, 0x0644, 0x0622, 0x0644, 0x0622,
- 0x0644, 0x0623, 0x0644, 0x0623, 0x0644, 0x0625, 0x0644, 0x0625, 0x0644, 0x0627, 0x0644, 0x0627
-};
-extern const FX_WCHAR g_UnicodeData_Normalization_Map3[1164] = {
- 0x0031, 0x002F, 0x0034, 0x0031, 0x002F, 0x0032, 0x0033, 0x002F, 0x0034, 0x002E, 0x002E, 0x002E, 0x2032, 0x2032, 0x2032, 0x2035,
- 0x2035, 0x2035, 0x0061, 0x002F, 0x0063, 0x0061, 0x002F, 0x0073, 0x0063, 0x002F, 0x006F, 0x0063, 0x002F, 0x0075, 0x0054, 0x0045,
- 0x004C, 0x0046, 0x0041, 0x0058, 0x0031, 0x002F, 0x0037, 0x0031, 0x002F, 0x0039, 0x0031, 0x002F, 0x0033, 0x0032, 0x002F, 0x0033,
- 0x0031, 0x002F, 0x0035, 0x0032, 0x002F, 0x0035, 0x0033, 0x002F, 0x0035, 0x0034, 0x002F, 0x0035, 0x0031, 0x002F, 0x0036, 0x0035,
- 0x002F, 0x0036, 0x0031, 0x002F, 0x0038, 0x0033, 0x002F, 0x0038, 0x0035, 0x002F, 0x0038, 0x0037, 0x002F, 0x0038, 0x0049, 0x0049,
- 0x0049, 0x0056, 0x0049, 0x0049, 0x0058, 0x0049, 0x0049, 0x0069, 0x0069, 0x0069, 0x0076, 0x0069, 0x0069, 0x0078, 0x0069, 0x0069,
- 0x0030, 0x2044, 0x0033, 0x222B, 0x222B, 0x222B, 0x222E, 0x222E, 0x222E, 0x004E, 0x0055, 0x004C, 0x0053, 0x004F, 0x0048, 0x0053,
- 0x0054, 0x0058, 0x0045, 0x0054, 0x0058, 0x0045, 0x004F, 0x0054, 0x0045, 0x004E, 0x0051, 0x0041, 0x0043, 0x004B, 0x0042, 0x0045,
- 0x004C, 0x0044, 0x004C, 0x0045, 0x0044, 0x0043, 0x0031, 0x0044, 0x0043, 0x0032, 0x0044, 0x0043, 0x0033, 0x0044, 0x0043, 0x0034,
- 0x004E, 0x0041, 0x004B, 0x0053, 0x0059, 0x004E, 0x0045, 0x0054, 0x0042, 0x0043, 0x0041, 0x004E, 0x0053, 0x0055, 0x0042, 0x0045,
- 0x0053, 0x0043, 0x0044, 0x0045, 0x004C, 0x0028, 0x0031, 0x0029, 0x0028, 0x0032, 0x0029, 0x0028, 0x0033, 0x0029, 0x0028, 0x0034,
- 0x0029, 0x0028, 0x0035, 0x0029, 0x0028, 0x0036, 0x0029, 0x0028, 0x0037, 0x0029, 0x0028, 0x0038, 0x0029, 0x0028, 0x0039, 0x0029,
- 0x0031, 0x0030, 0x002E, 0x0031, 0x0031, 0x002E, 0x0031, 0x0032, 0x002E, 0x0031, 0x0033, 0x002E, 0x0031, 0x0034, 0x002E, 0x0031,
- 0x0035, 0x002E, 0x0031, 0x0036, 0x002E, 0x0031, 0x0037, 0x002E, 0x0031, 0x0038, 0x002E, 0x0031, 0x0039, 0x002E, 0x0032, 0x0030,
- 0x002E, 0x0028, 0x0061, 0x0029, 0x0028, 0x0062, 0x0029, 0x0028, 0x0063, 0x0029, 0x0028, 0x0064, 0x0029, 0x0028, 0x0065, 0x0029,
- 0x0028, 0x0066, 0x0029, 0x0028, 0x0067, 0x0029, 0x0028, 0x0068, 0x0029, 0x0028, 0x0069, 0x0029, 0x0028, 0x006A, 0x0029, 0x0028,
- 0x006B, 0x0029, 0x0028, 0x006C, 0x0029, 0x0028, 0x006D, 0x0029, 0x0028, 0x006E, 0x0029, 0x0028, 0x006F, 0x0029, 0x0028, 0x0070,
- 0x0029, 0x0028, 0x0071, 0x0029, 0x0028, 0x0072, 0x0029, 0x0028, 0x0073, 0x0029, 0x0028, 0x0074, 0x0029, 0x0028, 0x0075, 0x0029,
- 0x0028, 0x0076, 0x0029, 0x0028, 0x0077, 0x0029, 0x0028, 0x0078, 0x0029, 0x0028, 0x0079, 0x0029, 0x0028, 0x007A, 0x0029, 0x003A,
- 0x003A, 0x003D, 0x003D, 0x003D, 0x003D, 0x0028, 0x1100, 0x0029, 0x0028, 0x1102, 0x0029, 0x0028, 0x1103, 0x0029, 0x0028, 0x1105,
- 0x0029, 0x0028, 0x1106, 0x0029, 0x0028, 0x1107, 0x0029, 0x0028, 0x1109, 0x0029, 0x0028, 0x110B, 0x0029, 0x0028, 0x110C, 0x0029,
- 0x0028, 0x110E, 0x0029, 0x0028, 0x110F, 0x0029, 0x0028, 0x1110, 0x0029, 0x0028, 0x1111, 0x0029, 0x0028, 0x1112, 0x0029, 0x0028,
- 0x4E00, 0x0029, 0x0028, 0x4E8C, 0x0029, 0x0028, 0x4E09, 0x0029, 0x0028, 0x56DB, 0x0029, 0x0028, 0x4E94, 0x0029, 0x0028, 0x516D,
- 0x0029, 0x0028, 0x4E03, 0x0029, 0x0028, 0x516B, 0x0029, 0x0028, 0x4E5D, 0x0029, 0x0028, 0x5341, 0x0029, 0x0028, 0x6708, 0x0029,
- 0x0028, 0x706B, 0x0029, 0x0028, 0x6C34, 0x0029, 0x0028, 0x6728, 0x0029, 0x0028, 0x91D1, 0x0029, 0x0028, 0x571F, 0x0029, 0x0028,
- 0x65E5, 0x0029, 0x0028, 0x682A, 0x0029, 0x0028, 0x6709, 0x0029, 0x0028, 0x793E, 0x0029, 0x0028, 0x540D, 0x0029, 0x0028, 0x7279,
- 0x0029, 0x0028, 0x8CA1, 0x0029, 0x0028, 0x795D, 0x0029, 0x0028, 0x52B4, 0x0029, 0x0028, 0x4EE3, 0x0029, 0x0028, 0x547C, 0x0029,
- 0x0028, 0x5B66, 0x0029, 0x0028, 0x76E3, 0x0029, 0x0028, 0x4F01, 0x0029, 0x0028, 0x8CC7, 0x0029, 0x0028, 0x5354, 0x0029, 0x0028,
- 0x796D, 0x0029, 0x0028, 0x4F11, 0x0029, 0x0028, 0x81EA, 0x0029, 0x0028, 0x81F3, 0x0029, 0x0050, 0x0054, 0x0045, 0x0031, 0x0030,
- 0x6708, 0x0031, 0x0031, 0x6708, 0x0031, 0x0032, 0x6708, 0x0065, 0x0072, 0x0067, 0x004C, 0x0054, 0x0044, 0x30A2, 0x30FC, 0x30EB,
- 0x30A4, 0x30F3, 0x30C1, 0x30A6, 0x30A9, 0x30F3, 0x30AA, 0x30F3, 0x30B9, 0x30AA, 0x30FC, 0x30E0, 0x30AB, 0x30A4, 0x30EA, 0x30AC,
- 0x30ED, 0x30F3, 0x30AC, 0x30F3, 0x30DE, 0x30AE, 0x30CB, 0x30FC, 0x30B0, 0x30E9, 0x30E0, 0x30B1, 0x30FC, 0x30B9, 0x30B3, 0x30EB,
- 0x30CA, 0x30B3, 0x30FC, 0x30DD, 0x30BB, 0x30F3, 0x30C1, 0x30BB, 0x30F3, 0x30C8, 0x30C0, 0x30FC, 0x30B9, 0x30CE, 0x30C3, 0x30C8,
- 0x30CF, 0x30A4, 0x30C4, 0x30D1, 0x30FC, 0x30C4, 0x30D4, 0x30AF, 0x30EB, 0x30D5, 0x30E9, 0x30F3, 0x30DA, 0x30CB, 0x30D2, 0x30D8,
- 0x30EB, 0x30C4, 0x30DA, 0x30F3, 0x30B9, 0x30DA, 0x30FC, 0x30B8, 0x30D9, 0x30FC, 0x30BF, 0x30DC, 0x30EB, 0x30C8, 0x30DD, 0x30F3,
- 0x30C9, 0x30DB, 0x30FC, 0x30EB, 0x30DB, 0x30FC, 0x30F3, 0x30DE, 0x30A4, 0x30EB, 0x30DE, 0x30C3, 0x30CF, 0x30DE, 0x30EB, 0x30AF,
- 0x30E4, 0x30FC, 0x30C9, 0x30E4, 0x30FC, 0x30EB, 0x30E6, 0x30A2, 0x30F3, 0x30EB, 0x30D4, 0x30FC, 0x30EF, 0x30C3, 0x30C8, 0x0031,
- 0x0030, 0x70B9, 0x0031, 0x0031, 0x70B9, 0x0031, 0x0032, 0x70B9, 0x0031, 0x0033, 0x70B9, 0x0031, 0x0034, 0x70B9, 0x0031, 0x0035,
- 0x70B9, 0x0031, 0x0036, 0x70B9, 0x0031, 0x0037, 0x70B9, 0x0031, 0x0038, 0x70B9, 0x0031, 0x0039, 0x70B9, 0x0032, 0x0030, 0x70B9,
- 0x0032, 0x0031, 0x70B9, 0x0032, 0x0032, 0x70B9, 0x0032, 0x0033, 0x70B9, 0x0032, 0x0034, 0x70B9, 0x0068, 0x0050, 0x0061, 0x0062,
- 0x0061, 0x0072, 0x0064, 0x006D, 0x00B2, 0x0064, 0x006D, 0x00B3, 0x0063, 0x0061, 0x006C, 0x006B, 0x0048, 0x007A, 0x004D, 0x0048,
- 0x007A, 0x0047, 0x0048, 0x007A, 0x0054, 0x0048, 0x007A, 0x006D, 0x006D, 0x00B2, 0x0063, 0x006D, 0x00B2, 0x006B, 0x006D, 0x00B2,
- 0x006D, 0x006D, 0x00B3, 0x0063, 0x006D, 0x00B3, 0x006B, 0x006D, 0x00B3, 0x006D, 0x2215, 0x0073, 0x006B, 0x0050, 0x0061, 0x004D,
- 0x0050, 0x0061, 0x0047, 0x0050, 0x0061, 0x0072, 0x0061, 0x0064, 0x0043, 0x006F, 0x002E, 0x006C, 0x006F, 0x0067, 0x006D, 0x0069,
- 0x006C, 0x006D, 0x006F, 0x006C, 0x0050, 0x0050, 0x004D, 0x0056, 0x2215, 0x006D, 0x0041, 0x2215, 0x006D, 0x0031, 0x0030, 0x65E5,
- 0x0031, 0x0031, 0x65E5, 0x0031, 0x0032, 0x65E5, 0x0031, 0x0033, 0x65E5, 0x0031, 0x0034, 0x65E5, 0x0031, 0x0035, 0x65E5, 0x0031,
- 0x0036, 0x65E5, 0x0031, 0x0037, 0x65E5, 0x0031, 0x0038, 0x65E5, 0x0031, 0x0039, 0x65E5, 0x0032, 0x0030, 0x65E5, 0x0032, 0x0031,
- 0x65E5, 0x0032, 0x0032, 0x65E5, 0x0032, 0x0033, 0x65E5, 0x0032, 0x0034, 0x65E5, 0x0032, 0x0035, 0x65E5, 0x0032, 0x0036, 0x65E5,
- 0x0032, 0x0037, 0x65E5, 0x0032, 0x0038, 0x65E5, 0x0032, 0x0039, 0x65E5, 0x0033, 0x0030, 0x65E5, 0x0033, 0x0031, 0x65E5, 0x0067,
- 0x0061, 0x006C, 0x0066, 0x0066, 0x0069, 0x0066, 0x0066, 0x006C, 0x0640, 0x064E, 0x0651, 0x0640, 0x064F, 0x0651, 0x0640, 0x0650,
- 0x0651, 0x062A, 0x062C, 0x0645, 0x062A, 0x062D, 0x062C, 0x062A, 0x062D, 0x062C, 0x062A, 0x062D, 0x0645, 0x062A, 0x062E, 0x0645,
- 0x062A, 0x0645, 0x062C, 0x062A, 0x0645, 0x062D, 0x062A, 0x0645, 0x062E, 0x062C, 0x0645, 0x062D, 0x062C, 0x0645, 0x062D, 0x062D,
- 0x0645, 0x064A, 0x062D, 0x0645, 0x0649, 0x0633, 0x062D, 0x062C, 0x0633, 0x062C, 0x062D, 0x0633, 0x062C, 0x0649, 0x0633, 0x0645,
- 0x062D, 0x0633, 0x0645, 0x062D, 0x0633, 0x0645, 0x062C, 0x0633, 0x0645, 0x0645, 0x0633, 0x0645, 0x0645, 0x0635, 0x062D, 0x062D,
- 0x0635, 0x062D, 0x062D, 0x0635, 0x0645, 0x0645, 0x0634, 0x062D, 0x0645, 0x0634, 0x062D, 0x0645, 0x0634, 0x062C, 0x064A, 0x0634,
- 0x0645, 0x062E, 0x0634, 0x0645, 0x062E, 0x0634, 0x0645, 0x0645, 0x0634, 0x0645, 0x0645, 0x0636, 0x062D, 0x0649, 0x0636, 0x062E,
- 0x0645, 0x0636, 0x062E, 0x0645, 0x0637, 0x0645, 0x062D, 0x0637, 0x0645, 0x062D, 0x0637, 0x0645, 0x0645, 0x0637, 0x0645, 0x064A,
- 0x0639, 0x062C, 0x0645, 0x0639, 0x0645, 0x0645, 0x0639, 0x0645, 0x0645, 0x0639, 0x0645, 0x0649, 0x063A, 0x0645, 0x0645, 0x063A,
- 0x0645, 0x064A, 0x063A, 0x0645, 0x0649, 0x0641, 0x062E, 0x0645, 0x0641, 0x062E, 0x0645, 0x0642, 0x0645, 0x062D, 0x0642, 0x0645,
- 0x0645, 0x0644, 0x062D, 0x0645, 0x0644, 0x062D, 0x064A, 0x0644, 0x062D, 0x0649, 0x0644, 0x062C, 0x062C, 0x0644, 0x062C, 0x062C,
- 0x0644, 0x062E, 0x0645, 0x0644, 0x062E, 0x0645, 0x0644, 0x0645, 0x062D, 0x0644, 0x0645, 0x062D, 0x0645, 0x062D, 0x062C, 0x0645,
- 0x062D, 0x0645, 0x0645, 0x062D, 0x064A, 0x0645, 0x062C, 0x062D, 0x0645, 0x062C, 0x0645, 0x0645, 0x062E, 0x062C, 0x0645, 0x062E,
- 0x0645, 0x0645, 0x062C, 0x062E, 0x0647, 0x0645, 0x062C, 0x0647, 0x0645, 0x0645, 0x0646, 0x062D, 0x0645, 0x0646, 0x062D, 0x0649,
- 0x0646, 0x062C, 0x0645, 0x0646, 0x062C, 0x0645, 0x0646, 0x062C, 0x0649, 0x0646, 0x0645, 0x064A, 0x0646, 0x0645, 0x0649, 0x064A,
- 0x0645, 0x0645, 0x064A, 0x0645, 0x0645, 0x0628, 0x062E, 0x064A, 0x062A, 0x062C, 0x064A, 0x062A, 0x062C, 0x0649, 0x062A, 0x062E,
- 0x064A, 0x062A, 0x062E, 0x0649, 0x062A, 0x0645, 0x064A, 0x062A, 0x0645, 0x0649, 0x062C, 0x0645, 0x064A, 0x062C, 0x062D, 0x0649,
- 0x062C, 0x0645, 0x0649, 0x0633, 0x062E, 0x0649, 0x0635, 0x062D, 0x064A, 0x0634, 0x062D, 0x064A, 0x0636, 0x062D, 0x064A, 0x0644,
- 0x062C, 0x064A, 0x0644, 0x0645, 0x064A, 0x064A, 0x062D, 0x064A, 0x064A, 0x062C, 0x064A, 0x064A, 0x0645, 0x064A, 0x0645, 0x0645,
- 0x064A, 0x0642, 0x0645, 0x064A, 0x0646, 0x062D, 0x064A, 0x0642, 0x0645, 0x062D, 0x0644, 0x062D, 0x0645, 0x0639, 0x0645, 0x064A,
- 0x0643, 0x0645, 0x064A, 0x0646, 0x062C, 0x062D, 0x0645, 0x062E, 0x064A, 0x0644, 0x062C, 0x0645, 0x0643, 0x0645, 0x0645, 0x0644,
- 0x062C, 0x0645, 0x0646, 0x062C, 0x062D, 0x062C, 0x062D, 0x064A, 0x062D, 0x062C, 0x064A, 0x0645, 0x062C, 0x064A, 0x0641, 0x0645,
- 0x064A, 0x0628, 0x062D, 0x064A, 0x0643, 0x0645, 0x0645, 0x0639, 0x062C, 0x0645, 0x0635, 0x0645, 0x0645, 0x0633, 0x062E, 0x064A,
- 0x0646, 0x062C, 0x064A, 0x0635, 0x0644, 0x06D2, 0x0642, 0x0644, 0x06D2, 0x0635, 0x0644, 0x0649
-};
-extern const FX_WCHAR g_UnicodeData_Normalization_Map4[488] = {
- 0x0004, 0x2032, 0x2032, 0x2032, 0x2032, 0x0004, 0x0031, 0x002F, 0x0031, 0x0030, 0x0004, 0x0056, 0x0049, 0x0049, 0x0049, 0x0004,
- 0x0076, 0x0069, 0x0069, 0x0069, 0x0004, 0x0028, 0x0031, 0x0030, 0x0029, 0x0004, 0x0028, 0x0031, 0x0031, 0x0029, 0x0004, 0x0028,
- 0x0031, 0x0032, 0x0029, 0x0004, 0x0028, 0x0031, 0x0033, 0x0029, 0x0004, 0x0028, 0x0031, 0x0034, 0x0029, 0x0004, 0x0028, 0x0031,
- 0x0035, 0x0029, 0x0004, 0x0028, 0x0031, 0x0036, 0x0029, 0x0004, 0x0028, 0x0031, 0x0037, 0x0029, 0x0004, 0x0028, 0x0031, 0x0038,
- 0x0029, 0x0004, 0x0028, 0x0031, 0x0039, 0x0029, 0x0004, 0x0028, 0x0032, 0x0030, 0x0029, 0x0004, 0x222B, 0x222B, 0x222B, 0x222B,
- 0x0004, 0x0028, 0x1100, 0x1161, 0x0029, 0x0004, 0x0028, 0x1102, 0x1161, 0x0029, 0x0004, 0x0028, 0x1103, 0x1161, 0x0029, 0x0004,
- 0x0028, 0x1105, 0x1161, 0x0029, 0x0004, 0x0028, 0x1106, 0x1161, 0x0029, 0x0004, 0x0028, 0x1107, 0x1161, 0x0029, 0x0004, 0x0028,
- 0x1109, 0x1161, 0x0029, 0x0004, 0x0028, 0x110B, 0x1161, 0x0029, 0x0004, 0x0028, 0x110C, 0x1161, 0x0029, 0x0004, 0x0028, 0x110E,
- 0x1161, 0x0029, 0x0004, 0x0028, 0x110F, 0x1161, 0x0029, 0x0004, 0x0028, 0x1110, 0x1161, 0x0029, 0x0004, 0x0028, 0x1111, 0x1161,
- 0x0029, 0x0004, 0x0028, 0x1112, 0x1161, 0x0029, 0x0004, 0x0028, 0x110C, 0x116E, 0x0029, 0x0007, 0x0028, 0x110B, 0x1169, 0x110C,
- 0x1165, 0x11AB, 0x0029, 0x0006, 0x0028, 0x110B, 0x1169, 0x1112, 0x116E, 0x0029, 0x0005, 0x110E, 0x1161, 0x11B7, 0x1100, 0x1169,
- 0x0004, 0x110C, 0x116E, 0x110B, 0x1174, 0x0004, 0x30A2, 0x30D1, 0x30FC, 0x30C8, 0x0004, 0x30A2, 0x30EB, 0x30D5, 0x30A1, 0x0004,
- 0x30A2, 0x30F3, 0x30DA, 0x30A2, 0x0004, 0x30A4, 0x30CB, 0x30F3, 0x30B0, 0x0005, 0x30A8, 0x30B9, 0x30AF, 0x30FC, 0x30C9, 0x0004,
- 0x30A8, 0x30FC, 0x30AB, 0x30FC, 0x0004, 0x30AB, 0x30E9, 0x30C3, 0x30C8, 0x0004, 0x30AB, 0x30ED, 0x30EA, 0x30FC, 0x0004, 0x30AD,
- 0x30E5, 0x30EA, 0x30FC, 0x0004, 0x30AE, 0x30EB, 0x30C0, 0x30FC, 0x0005, 0x30AD, 0x30ED, 0x30B0, 0x30E9, 0x30E0, 0x0006, 0x30AD,
- 0x30ED, 0x30E1, 0x30FC, 0x30C8, 0x30EB, 0x0005, 0x30AD, 0x30ED, 0x30EF, 0x30C3, 0x30C8, 0x0005, 0x30B0, 0x30E9, 0x30E0, 0x30C8,
- 0x30F3, 0x0005, 0x30AF, 0x30EB, 0x30BC, 0x30A4, 0x30ED, 0x0004, 0x30AF, 0x30ED, 0x30FC, 0x30CD, 0x0004, 0x30B5, 0x30A4, 0x30AF,
- 0x30EB, 0x0005, 0x30B5, 0x30F3, 0x30C1, 0x30FC, 0x30E0, 0x0004, 0x30B7, 0x30EA, 0x30F3, 0x30B0, 0x0005, 0x30D1, 0x30FC, 0x30BB,
- 0x30F3, 0x30C8, 0x0004, 0x30D0, 0x30FC, 0x30EC, 0x30EB, 0x0005, 0x30D4, 0x30A2, 0x30B9, 0x30C8, 0x30EB, 0x0005, 0x30D5, 0x30A1,
- 0x30E9, 0x30C3, 0x30C9, 0x0004, 0x30D5, 0x30A3, 0x30FC, 0x30C8, 0x0005, 0x30D6, 0x30C3, 0x30B7, 0x30A7, 0x30EB, 0x0005, 0x30D8,
- 0x30AF, 0x30BF, 0x30FC, 0x30EB, 0x0004, 0x30DD, 0x30A4, 0x30F3, 0x30C8, 0x0004, 0x30DE, 0x30A4, 0x30AF, 0x30ED, 0x0005, 0x30DE,
- 0x30F3, 0x30B7, 0x30E7, 0x30F3, 0x0004, 0x30DF, 0x30AF, 0x30ED, 0x30F3, 0x0005, 0x30DF, 0x30EA, 0x30D0, 0x30FC, 0x30EB, 0x0004,
- 0x30E1, 0x30AC, 0x30C8, 0x30F3, 0x0004, 0x30E1, 0x30FC, 0x30C8, 0x30EB, 0x0004, 0x30EA, 0x30C3, 0x30C8, 0x30EB, 0x0004, 0x30EB,
- 0x30FC, 0x30D6, 0x30EB, 0x0005, 0x30EC, 0x30F3, 0x30C8, 0x30B2, 0x30F3, 0x0004, 0x682A, 0x5F0F, 0x4F1A, 0x793E, 0x0004, 0x006B,
- 0x0063, 0x0061, 0x006C, 0x0004, 0x006D, 0x2215, 0x0073, 0x00B2, 0x0005, 0x0072, 0x0061, 0x0064, 0x2215, 0x0073, 0x0006, 0x0072,
- 0x0061, 0x0064, 0x2215, 0x0073, 0x00B2, 0x0004, 0x0061, 0x002E, 0x006D, 0x002E, 0x0004, 0x0043, 0x2215, 0x006B, 0x0067, 0x0004,
- 0x0070, 0x002E, 0x006D, 0x002E, 0x0004, 0x0627, 0x0644, 0x0644, 0x0647, 0x0004, 0x0627, 0x0643, 0x0628, 0x0631, 0x0004, 0x0645,
- 0x062D, 0x0645, 0x062F, 0x0004, 0x0635, 0x0644, 0x0639, 0x0645, 0x0004, 0x0631, 0x0633, 0x0648, 0x0644, 0x0004, 0x0639, 0x0644,
- 0x064A, 0x0647, 0x0004, 0x0648, 0x0633, 0x0644, 0x0645, 0x0012, 0x0635, 0x0644, 0x0649, 0x0020, 0x0627, 0x0644, 0x0644, 0x0647,
- 0x0020, 0x0639, 0x0644, 0x064A, 0x0647, 0x0020, 0x0648, 0x0633, 0x0644, 0x0645, 0x0008, 0x062C, 0x0644, 0x0020, 0x062C, 0x0644,
- 0x0627, 0x0644, 0x0647, 0x0004, 0x0631, 0x06CC, 0x0627, 0x0644
-};
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fxcrt/fx_system.h"
+extern const FX_WCHAR g_UnicodeData_Normalization[65536] = {
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8001, 0x0000, 0x2000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2002, 0x8002, 0x0000, 0x2004, 0x0000, 0x0000, 0x8003,
+ 0x8004, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8005, 0x0000, 0x8006, 0x0000, 0x0000, 0x0000, 0x8007, 0x8008,
+ 0x0000, 0x0000, 0x8009, 0x800A, 0x800B, 0x800C, 0x0000, 0x0000, 0x800D, 0x800E, 0x800F, 0x0000, 0x3000, 0x3003, 0x3006, 0x0000,
+ 0x8010, 0x8011, 0x8012, 0x8013, 0x8014, 0x8015, 0x0000, 0x8016, 0x8017, 0x8018, 0x8019, 0x801A, 0x801B, 0x801C, 0x801D, 0x801E,
+ 0x801F, 0x8020, 0x8021, 0x8022, 0x8023, 0x8024, 0x8025, 0x0000, 0x8026, 0x8027, 0x8028, 0x8029, 0x802A, 0x802B, 0x0000, 0x0000,
+ 0x802C, 0x802D, 0x802E, 0x802F, 0x8030, 0x8031, 0x0000, 0x8032, 0x8033, 0x8034, 0x8035, 0x8036, 0x8037, 0x8038, 0x8039, 0x803A,
+ 0x0000, 0x803B, 0x803C, 0x803D, 0x803E, 0x803F, 0x8040, 0x0000, 0x8041, 0x8042, 0x8043, 0x8044, 0x8045, 0x8046, 0x0000, 0x8047,
+ 0x8048, 0x8049, 0x804A, 0x804B, 0x804C, 0x804D, 0x804E, 0x804F, 0x8050, 0x8051, 0x8052, 0x8053, 0x8054, 0x8055, 0x8056, 0x8057,
+ 0x8058, 0x8059, 0x805A, 0x805B, 0x805C, 0x805D, 0x805E, 0x805F, 0x8060, 0x8061, 0x8062, 0x8063, 0x8064, 0x8065, 0x8066, 0x8067,
+ 0x8068, 0x8069, 0x806A, 0x806B, 0x806C, 0x806D, 0x806E, 0x806F, 0x8070, 0x8071, 0x8072, 0x8073, 0x8074, 0x8075, 0x8076, 0x8077,
+ 0x8078, 0x0000, 0x2006, 0x2008, 0x8079, 0x807A, 0x807B, 0x807C, 0x807D, 0x807E, 0x807F, 0x8080, 0x8081, 0x8082, 0x8083, 0x8084,
+ 0x8085, 0x8086, 0x8087, 0x8088, 0x8089, 0x808A, 0x808B, 0x808C, 0x808D, 0x808E, 0x0000, 0x0000, 0x808F, 0x8090, 0x8091, 0x8092,
+ 0x8093, 0x8094, 0x200A, 0x200C, 0x8095, 0x8096, 0x8097, 0x8098, 0x8099, 0x809A, 0x809B, 0x809C, 0x809D, 0x809E, 0x809F, 0x80A0,
+ 0x80A1, 0x80A2, 0x80A3, 0x80A4, 0x80A5, 0x80A6, 0x80A7, 0x80A8, 0x80A9, 0x80AA, 0x80AB, 0x80AC, 0x80AD, 0x80AE, 0x80AF, 0x80B0,
+ 0x80B1, 0x80B2, 0x80B3, 0x80B4, 0x80B5, 0x80B6, 0x80B7, 0x80B8, 0x80B9, 0x80BA, 0x80BB, 0x80BC, 0x80BD, 0x80BE, 0x80BF, 0x80C0,
+ 0x80C1, 0x80C2, 0x80C3, 0x80C4, 0x0000, 0x0000, 0x0000, 0x80C5, 0x80C6, 0x80C7, 0x80C8, 0x80C9, 0x80CA, 0x0000, 0x80CB, 0x0000,
+ 0x80CC, 0x80CD, 0x80CE, 0x80CF, 0x0000, 0x0000, 0x0000, 0x80D0, 0x80D1, 0x80D2, 0x80D3, 0x0000, 0x80D4, 0x80D5, 0x80D6, 0x80D7,
+ 0x80D8, 0x80D9, 0x0000, 0x0000, 0x80DA, 0x80DB, 0x0000, 0x0000, 0x0000, 0x0000, 0x80DC, 0x80DD, 0x80DE, 0x80DF, 0x80E0, 0x80E1,
+ 0x80E2, 0x0000, 0x80E3, 0x80E4, 0x80E5, 0x80E6, 0x80E7, 0x0000, 0x80E8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x200E, 0x2010, 0x2012, 0x2014, 0x2016, 0x2018, 0x201A, 0x201C, 0x201E, 0x80E9, 0x80EA, 0x80EB,
+ 0x80EC, 0x80ED, 0x80EE, 0x80EF, 0x80F0, 0x80F1, 0x80F2, 0x80F3, 0x80F4, 0x80F5, 0x80F6, 0x80F7, 0x80F8, 0x80F9, 0x80FA, 0x80FB,
+ 0x80FC, 0x80FD, 0x80FE, 0x80FF, 0x8100, 0x8101, 0x8102, 0x8103, 0x8104, 0x8105, 0x8106, 0x8107, 0x8108, 0x8109, 0x810A, 0x810B,
+ 0x810C, 0x2020, 0x2022, 0x2024, 0x810D, 0x810E, 0x0000, 0x0000, 0x810F, 0x8110, 0x8111, 0x8112, 0x8113, 0x8114, 0x8115, 0x8116,
+ 0x8117, 0x8118, 0x8119, 0x811A, 0x811B, 0x811C, 0x811D, 0x811E, 0x811F, 0x8120, 0x8121, 0x8122, 0x8123, 0x8124, 0x8125, 0x8126,
+ 0x8127, 0x8128, 0x8129, 0x812A, 0x812B, 0x812C, 0x812D, 0x812E, 0x812F, 0x8130, 0x8131, 0x8132, 0x0000, 0x0000, 0x8133, 0x8134,
+ 0x8135, 0x8136, 0x0000, 0x0000, 0x8137, 0x8138, 0x8139, 0x813A, 0x813B, 0x813C, 0x813D, 0x813E, 0x813F, 0x8140, 0x8141, 0x8142,
+ 0x8143, 0x8144, 0x8145, 0x8146, 0x8147, 0x8148, 0x8149, 0x814A, 0x2026, 0x2028, 0x814B, 0x814C, 0x814D, 0x814E, 0x814F, 0x8150,
+ 0x8151, 0x0000, 0x0000, 0x8152, 0x8153, 0x8154, 0x8155, 0x8156, 0x8157, 0x8158, 0x8159, 0x815A, 0x815B, 0x815C, 0x815D, 0x815E,
+ 0x815F, 0x0000, 0x8160, 0x8161, 0x8162, 0x8163, 0x8164, 0x8165, 0x8166, 0x0000, 0x8167, 0x8168, 0x8169, 0x816A, 0x816B, 0x816C,
+ 0x816D, 0x816E, 0x816F, 0x0000, 0x0000, 0x8170, 0x8171, 0x0000, 0x8172, 0x0000, 0x8173, 0x8174, 0x8175, 0x8176, 0x0000, 0x8177,
+ 0x8178, 0x8179, 0x817A, 0x817B, 0x817C, 0x817D, 0x202A, 0x0000, 0x0000, 0x817E, 0x817F, 0x8180, 0x8181, 0x8182, 0x8183, 0x8184,
+ 0x8185, 0x8186, 0x8187, 0x0000, 0x8188, 0x8189, 0x818A, 0x818B, 0x818C, 0x818D, 0x0000, 0x818E, 0x818F, 0x8190, 0x8191, 0x8192,
+ 0x8193, 0x8194, 0x0000, 0x8195, 0x0000, 0x0000, 0x0000, 0x8196, 0x0000, 0x8197, 0x8198, 0x8199, 0x819A, 0x819B, 0x819C, 0x819D,
+ 0x819E, 0x0000, 0x0000, 0x202C, 0x202E, 0x2030, 0x2032, 0x2034, 0x2036, 0x2038, 0x203A, 0x203C, 0x0000, 0x0000, 0x819F, 0x81A0,
+ 0x81A1, 0x81A2, 0x81A3, 0x81A4, 0x81A5, 0x81A6, 0x81A7, 0x81A8, 0x81A9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x81AA, 0x81AB, 0x81AC, 0x81AD, 0x81AE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x81AF, 0x81B0, 0x0000, 0x81B1, 0x81B2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x81B3, 0x81B4, 0x81B5, 0x81B6, 0x81B7, 0x81B8, 0x81B9, 0x81BA, 0x81BB, 0x81BC, 0x81BD, 0x81BE, 0x81BF,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x81C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x81C1, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x81C2, 0x81C3, 0x81C4, 0x81C5, 0x81C6, 0x81C7, 0x81C8, 0x0000, 0x81C9, 0x0000, 0x81CA, 0x81CB,
+ 0x81CC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x81CD, 0x81CE, 0x81CF, 0x81D0, 0x81D1, 0x81D2,
+ 0x81D3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x81D4, 0x81D5, 0x81D6, 0x81D7, 0x81D8, 0x0000,
+ 0x81D9, 0x81DA, 0x81DB, 0x81DC, 0x81DD, 0x81DE, 0x81DF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x81E0, 0x81E1, 0x81E2, 0x0000, 0x81E3, 0x81E4, 0x0000, 0x0000, 0x0000, 0x81E5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x81E6, 0x81E7, 0x0000, 0x81E8, 0x0000, 0x0000, 0x0000, 0x81E9, 0x0000, 0x0000, 0x0000, 0x0000, 0x81EA, 0x81EB, 0x81EC, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x81ED, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x81EE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x81EF, 0x81F0, 0x0000, 0x81F1, 0x0000, 0x0000, 0x0000, 0x81F2, 0x0000, 0x0000, 0x0000, 0x0000, 0x81F3, 0x81F4, 0x81F5, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x81F6, 0x81F7, 0x0000, 0x0000, 0x81F8, 0x81F9, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x81FA, 0x81FB, 0x0000, 0x0000, 0x0000, 0x0000, 0x81FC, 0x81FD, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x81FE, 0x81FF, 0x0000, 0x0000, 0x8200, 0x8201,
+ 0x8202, 0x8203, 0x8204, 0x8205, 0x8206, 0x8207, 0x8208, 0x8209, 0x820A, 0x820B, 0x820C, 0x820D, 0x820E, 0x820F, 0x8210, 0x8211,
+ 0x8212, 0x8213, 0x8214, 0x8215, 0x203E, 0x2040, 0x8216, 0x8217, 0x0000, 0x0000, 0x8218, 0x8219, 0x821A, 0x821B, 0x0000, 0x0000,
+ 0x821C, 0x821D, 0x821E, 0x821F, 0x2042, 0x2044, 0x8220, 0x8221, 0x8222, 0x8223, 0x0000, 0x0000, 0x8224, 0x8225, 0x8226, 0x8227,
+ 0x0000, 0x8228, 0x8229, 0x822A, 0x822B, 0x822C, 0x822D, 0x822E, 0x822F, 0x8230, 0x8231, 0x0000, 0x0000, 0x8232, 0x8233, 0x0000,
+ 0x8234, 0x8235, 0x8236, 0x8237, 0x2046, 0x2048, 0x8238, 0x8239, 0x0000, 0x0000, 0x823A, 0x823B, 0x823C, 0x823D, 0x823E, 0x823F,
+ 0x0000, 0x0000, 0x8240, 0x8241, 0x8242, 0x8243, 0x8244, 0x8245, 0x0000, 0x0000, 0x8246, 0x8247, 0x8248, 0x8249, 0x824A, 0x824B,
+ 0x824C, 0x824D, 0x824E, 0x824F, 0x8250, 0x8251, 0x8252, 0x8253, 0x8254, 0x8255, 0x8256, 0x8257, 0x8258, 0x8259, 0x825A, 0x825B,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x825C, 0x825D, 0x825E, 0x825F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x204A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x204C, 0x204E, 0x2050, 0x2052, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x2054, 0x0000, 0x2056, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x2058, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x205A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x205C, 0x0000, 0x0000, 0x205E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2060, 0x2062, 0x2064, 0x2066, 0x2068, 0x206A, 0x206C, 0x206E,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2070, 0x2072, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2074, 0x2076, 0x0000, 0x2078,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x207A, 0x0000, 0x0000, 0x207C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x207E, 0x2080, 0x2082, 0x0000, 0x0000, 0x2084, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2086, 0x0000, 0x0000, 0x2088, 0x208A, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x208C, 0x208E, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x2090, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2092, 0x2094, 0x2096, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2098, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x209A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x209C, 0x209E, 0x0000, 0x20A0, 0x20A2, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20A4, 0x20A6, 0x20A8, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20AA, 0x0000, 0x20AC, 0x20AE, 0x20B0, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x20B2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x20B4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20B6, 0x20B8, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8260, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x20BA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20BC, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x20BE, 0x0000, 0x0000, 0x0000, 0x0000, 0x20C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x20C2, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20C4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x20C6, 0x0000, 0x20C8, 0x20CA, 0x20CC, 0x20CE, 0x20D0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x20D2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x20D4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20D6, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x20D8, 0x0000, 0x0000, 0x0000, 0x0000, 0x20DA, 0x0000, 0x0000, 0x0000, 0x0000, 0x20DC, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20DE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8261, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20E2, 0x0000, 0x20E4, 0x0000, 0x20E6, 0x0000, 0x20E8, 0x0000, 0x20EA, 0x0000,
+ 0x0000, 0x0000, 0x20EC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20EE, 0x0000, 0x20F0, 0x0000, 0x0000,
+ 0x20F2, 0x20F4, 0x0000, 0x20F6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8262, 0x8263, 0x8264, 0x8265,
+ 0x8266, 0x8267, 0x8268, 0x8269, 0x826A, 0x826B, 0x826C, 0x826D, 0x826E, 0x826F, 0x8270, 0x0000, 0x8271, 0x8272, 0x8273, 0x8274,
+ 0x8275, 0x8276, 0x8277, 0x8278, 0x8279, 0x827A, 0x827B, 0x827C, 0x827D, 0x827E, 0x827F, 0x8280, 0x8281, 0x8282, 0x0000, 0x8283,
+ 0x8284, 0x8285, 0x8286, 0x8287, 0x8288, 0x8289, 0x828A, 0x828B, 0x828C, 0x828D, 0x828E, 0x828F, 0x8290, 0x8291, 0x8292, 0x8293,
+ 0x8294, 0x8295, 0x8296, 0x8297, 0x8298, 0x8299, 0x829A, 0x829B, 0x829C, 0x829D, 0x829E, 0x0000, 0x829F, 0x82A0, 0x82A1, 0x82A2,
+ 0x82A3, 0x82A4, 0x82A5, 0x82A6, 0x82A7, 0x82A8, 0x82A9, 0x82AA, 0x82AB, 0x0000, 0x20F8, 0x82AC, 0x0000, 0x82AD, 0x82AE, 0x82AF,
+ 0x82B0, 0x82B1, 0x82B2, 0x82B3, 0x82B4, 0x82B5, 0x82B6, 0x82B7, 0x82B8, 0x82B9, 0x82BA, 0x82BB, 0x82BC, 0x82BD, 0x82BE, 0x82BF,
+ 0x82C0, 0x82C1, 0x82C2, 0x82C3, 0x82C4, 0x82C5, 0x82C6, 0x0000, 0x82C7, 0x0000, 0x0000, 0x82C8, 0x82C9, 0x82CA, 0x82CB, 0x82CC,
+ 0x82CD, 0x82CE, 0x82CF, 0x82D0, 0x82D1, 0x82D2, 0x82D3, 0x82D4, 0x82D5, 0x82D6, 0x82D7, 0x82D8, 0x82D9, 0x82DA, 0x82DB, 0x82DC,
+ 0x82DD, 0x82DE, 0x82DF, 0x82E0, 0x82E1, 0x82E2, 0x82E3, 0x82E4, 0x82E5, 0x82E6, 0x82E7, 0x82E8, 0x82E9, 0x82EA, 0x82EB, 0x82EC,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x82ED, 0x82EE, 0x82EF, 0x82F0, 0x82F1, 0x82F2, 0x82F3, 0x82F4, 0x82F5, 0x82F6, 0x82F7, 0x82F8, 0x82F9, 0x82FA, 0x82FB, 0x82FC,
+ 0x82FD, 0x82FE, 0x82FF, 0x8300, 0x8301, 0x8302, 0x8303, 0x8304, 0x8305, 0x8306, 0x8307, 0x8308, 0x8309, 0x830A, 0x830B, 0x830C,
+ 0x830D, 0x830E, 0x830F, 0x8310, 0x8311, 0x8312, 0x8313, 0x8314, 0x8315, 0x8316, 0x8317, 0x8318, 0x8319, 0x831A, 0x831B, 0x831C,
+ 0x831D, 0x831E, 0x831F, 0x8320, 0x8321, 0x8322, 0x8323, 0x8324, 0x8325, 0x8326, 0x8327, 0x8328, 0x8329, 0x832A, 0x832B, 0x832C,
+ 0x832D, 0x832E, 0x832F, 0x8330, 0x8331, 0x8332, 0x8333, 0x8334, 0x8335, 0x8336, 0x8337, 0x8338, 0x8339, 0x833A, 0x833B, 0x833C,
+ 0x833D, 0x833E, 0x833F, 0x8340, 0x8341, 0x8342, 0x8343, 0x8344, 0x8345, 0x8346, 0x8347, 0x8348, 0x8349, 0x834A, 0x834B, 0x834C,
+ 0x834D, 0x834E, 0x834F, 0x8350, 0x8351, 0x8352, 0x8353, 0x8354, 0x8355, 0x8356, 0x8357, 0x8358, 0x8359, 0x835A, 0x835B, 0x835C,
+ 0x835D, 0x835E, 0x835F, 0x8360, 0x8361, 0x8362, 0x8363, 0x8364, 0x8365, 0x8366, 0x8367, 0x8368, 0x8369, 0x836A, 0x836B, 0x836C,
+ 0x836D, 0x836E, 0x836F, 0x8370, 0x8371, 0x8372, 0x8373, 0x8374, 0x8375, 0x8376, 0x8377, 0x8378, 0x8379, 0x837A, 0x837B, 0x837C,
+ 0x837D, 0x837E, 0x837F, 0x8380, 0x8381, 0x8382, 0x8383, 0x8384, 0x8385, 0x8386, 0x8387, 0x8388, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8389, 0x838A, 0x838B, 0x838C, 0x838D, 0x838E, 0x838F, 0x8390, 0x8391, 0x8392, 0x8393, 0x8394, 0x8395, 0x8396, 0x8397, 0x8398,
+ 0x8399, 0x839A, 0x839B, 0x839C, 0x839D, 0x839E, 0x839F, 0x83A0, 0x83A1, 0x83A2, 0x83A3, 0x83A4, 0x83A5, 0x83A6, 0x83A7, 0x83A8,
+ 0x83A9, 0x83AA, 0x83AB, 0x83AC, 0x83AD, 0x83AE, 0x83AF, 0x83B0, 0x83B1, 0x83B2, 0x83B3, 0x83B4, 0x83B5, 0x83B6, 0x83B7, 0x83B8,
+ 0x83B9, 0x83BA, 0x83BB, 0x83BC, 0x83BD, 0x83BE, 0x83BF, 0x83C0, 0x83C1, 0x83C2, 0x83C3, 0x83C4, 0x83C5, 0x83C6, 0x83C7, 0x83C8,
+ 0x83C9, 0x83CA, 0x83CB, 0x83CC, 0x83CD, 0x83CE, 0x83CF, 0x83D0, 0x83D1, 0x83D2, 0x83D3, 0x83D4, 0x83D5, 0x83D6, 0x83D7, 0x83D8,
+ 0x83D9, 0x83DA, 0x83DB, 0x83DC, 0x83DD, 0x83DE, 0x83DF, 0x83E0, 0x83E1, 0x83E2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x83E3, 0x83E4, 0x83E5, 0x83E6, 0x83E7, 0x83E8, 0x83E9, 0x83EA, 0x83EB, 0x83EC, 0x83ED, 0x83EE, 0x83EF, 0x83F0, 0x83F1, 0x83F2,
+ 0x83F3, 0x83F4, 0x83F5, 0x83F6, 0x83F7, 0x83F8, 0x0000, 0x0000, 0x83F9, 0x83FA, 0x83FB, 0x83FC, 0x83FD, 0x83FE, 0x0000, 0x0000,
+ 0x83FF, 0x8400, 0x8401, 0x8402, 0x8403, 0x8404, 0x8405, 0x8406, 0x8407, 0x8408, 0x8409, 0x840A, 0x840B, 0x840C, 0x840D, 0x840E,
+ 0x840F, 0x8410, 0x8411, 0x8412, 0x8413, 0x8414, 0x8415, 0x8416, 0x8417, 0x8418, 0x8419, 0x841A, 0x841B, 0x841C, 0x841D, 0x841E,
+ 0x841F, 0x8420, 0x8421, 0x8422, 0x8423, 0x8424, 0x0000, 0x0000, 0x8425, 0x8426, 0x8427, 0x8428, 0x8429, 0x842A, 0x0000, 0x0000,
+ 0x842B, 0x842C, 0x842D, 0x842E, 0x842F, 0x8430, 0x8431, 0x8432, 0x0000, 0x8433, 0x0000, 0x8434, 0x0000, 0x8435, 0x0000, 0x8436,
+ 0x8437, 0x8438, 0x8439, 0x843A, 0x843B, 0x843C, 0x843D, 0x843E, 0x843F, 0x8440, 0x8441, 0x8442, 0x8443, 0x8444, 0x8445, 0x8446,
+ 0x8447, 0x8448, 0x8449, 0x844A, 0x844B, 0x844C, 0x844D, 0x844E, 0x844F, 0x8450, 0x8451, 0x8452, 0x8453, 0x8454, 0x0000, 0x0000,
+ 0x8455, 0x8456, 0x8457, 0x8458, 0x8459, 0x845A, 0x845B, 0x845C, 0x845D, 0x845E, 0x845F, 0x8460, 0x8461, 0x8462, 0x8463, 0x8464,
+ 0x8465, 0x8466, 0x8467, 0x8468, 0x8469, 0x846A, 0x846B, 0x846C, 0x846D, 0x846E, 0x846F, 0x8470, 0x8471, 0x8472, 0x8473, 0x8474,
+ 0x8475, 0x8476, 0x8477, 0x8478, 0x8479, 0x847A, 0x847B, 0x847C, 0x847D, 0x847E, 0x847F, 0x8480, 0x8481, 0x8482, 0x8483, 0x8484,
+ 0x8485, 0x8486, 0x8487, 0x8488, 0x8489, 0x0000, 0x848A, 0x848B, 0x848C, 0x848D, 0x848E, 0x848F, 0x8490, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8491, 0x8492, 0x8493, 0x0000, 0x8494, 0x8495, 0x8496, 0x8497, 0x8498, 0x8499, 0x849A, 0x0000, 0x0000, 0x0000,
+ 0x849B, 0x849C, 0x849D, 0x849E, 0x0000, 0x0000, 0x849F, 0x84A0, 0x84A1, 0x84A2, 0x84A3, 0x84A4, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x84A5, 0x84A6, 0x84A7, 0x84A8, 0x84A9, 0x84AA, 0x84AB, 0x84AC, 0x84AD, 0x84AE, 0x84AF, 0x84B0, 0x84B1, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x84B2, 0x84B3, 0x84B4, 0x0000, 0x84B5, 0x84B6, 0x84B7, 0x84B8, 0x84B9, 0x84BA, 0x84BB, 0x84BC, 0x84BD, 0x0000,
+ 0x84BE, 0x84BF, 0x84C0, 0x84C1, 0x84C2, 0x84C3, 0x84C4, 0x84C5, 0x84C6, 0x84C7, 0x84C8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x84C9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x84CA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x84CB, 0x20FA, 0x3009, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x84CC,
+ 0x0000, 0x0000, 0x0000, 0x20FC, 0x300C, 0x0000, 0x20FE, 0x300F, 0x0000, 0x0000, 0x0000, 0x0000, 0x2100, 0x0000, 0x2102, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2104, 0x2106, 0x2108, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x84CD,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x84CE, 0x84CF, 0x0000, 0x0000, 0x84D0, 0x84D1, 0x84D2, 0x84D3, 0x84D4, 0x84D5, 0x84D6, 0x84D7, 0x84D8, 0x84D9, 0x84DA, 0x84DB,
+ 0x84DC, 0x84DD, 0x84DE, 0x84DF, 0x84E0, 0x84E1, 0x84E2, 0x84E3, 0x84E4, 0x84E5, 0x84E6, 0x84E7, 0x84E8, 0x84E9, 0x84EA, 0x0000,
+ 0x84EB, 0x84EC, 0x84ED, 0x84EE, 0x84EF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x210A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x3012, 0x3015, 0x84F0, 0x210C, 0x0000, 0x3018, 0x301B, 0x84F1, 0x0000, 0x210E, 0x84F2, 0x84F3, 0x84F4, 0x84F5, 0x84F6, 0x84F7,
+ 0x84F8, 0x84F9, 0x84FA, 0x84FB, 0x0000, 0x84FC, 0x2110, 0x0000, 0x0000, 0x84FD, 0x84FE, 0x84FF, 0x8500, 0x8501, 0x8502, 0x8503,
+ 0x2112, 0x301E, 0x2114, 0x8504, 0x8505, 0x0000, 0x8506, 0x8507, 0x8508, 0x0000, 0x8509, 0x850A, 0x850B, 0x850C, 0x850D, 0x850E,
+ 0x850F, 0x8510, 0x0000, 0x8511, 0x8512, 0x8513, 0x8514, 0x8515, 0x8516, 0x8517, 0x0000, 0x3021, 0x8518, 0x8519, 0x851A, 0x851B,
+ 0x851C, 0x0000, 0x0000, 0x0000, 0x0000, 0x851D, 0x851E, 0x851F, 0x8520, 0x8521, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x3024, 0x3027, 0x4005, 0x302A, 0x302D, 0x3030, 0x3033, 0x3036, 0x3039, 0x303C, 0x303F, 0x3042, 0x3045, 0x3048, 0x304B, 0x2116,
+ 0x8522, 0x2118, 0x304E, 0x211A, 0x8523, 0x211C, 0x3051, 0x400A, 0x211E, 0x8524, 0x2120, 0x3054, 0x8525, 0x8526, 0x8527, 0x8528,
+ 0x8529, 0x2122, 0x3057, 0x2124, 0x852A, 0x2126, 0x305A, 0x400F, 0x2128, 0x852B, 0x212A, 0x305D, 0x852C, 0x852D, 0x852E, 0x852F,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3060, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x212C, 0x212E, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2130, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2132, 0x2134, 0x2136,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x8530, 0x0000, 0x0000, 0x0000, 0x0000, 0x8531, 0x0000, 0x0000, 0x8532, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x2138, 0x0000, 0x213A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x213C, 0x3063, 0x0000, 0x213E,
+ 0x3066, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x2140, 0x0000, 0x0000, 0x2142, 0x0000, 0x0000, 0x2144, 0x0000, 0x2146, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x2148, 0x0000, 0x214A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x214C, 0x214E, 0x2150,
+ 0x2152, 0x2154, 0x0000, 0x0000, 0x2156, 0x2158, 0x0000, 0x0000, 0x215A, 0x215C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x215E, 0x2160, 0x0000, 0x0000, 0x2162, 0x2164, 0x0000, 0x0000, 0x2166, 0x2168, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x216A, 0x216C, 0x216E, 0x2170,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x2172, 0x2174, 0x2176, 0x2178, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x217A, 0x217C, 0x217E, 0x2180, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8533, 0x8534, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x3069, 0x306C, 0x306F, 0x3072, 0x3075, 0x3078, 0x307B, 0x307E, 0x2182, 0x2184, 0x2186, 0x2188, 0x218A, 0x218C, 0x218E, 0x2190,
+ 0x3081, 0x3084, 0x3087, 0x308A, 0x308D, 0x3090, 0x3093, 0x3096, 0x3099, 0x2192, 0x309C, 0x309F, 0x2194, 0x2196, 0x2198, 0x219A,
+ 0x219C, 0x30A2, 0x8535, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8536, 0x8537, 0x8538, 0x8539, 0x853A, 0x853B, 0x853C, 0x853D, 0x853E, 0x219E, 0x21A0, 0x21A2, 0x21A4, 0x21A6, 0x21A8, 0x21AA,
+ 0x21AC, 0x21AE, 0x21B0, 0x21B2, 0x30A5, 0x30A8, 0x30AB, 0x30AE, 0x30B1, 0x30B4, 0x30B7, 0x30BA, 0x30BD, 0x4014, 0x4019, 0x401E,
+ 0x4023, 0x4028, 0x402D, 0x4032, 0x4037, 0x403C, 0x4041, 0x4046, 0x21B4, 0x21B6, 0x21B8, 0x21BA, 0x21BC, 0x21BE, 0x21C0, 0x21C2,
+ 0x21C4, 0x30C0, 0x30C3, 0x30C6, 0x30C9, 0x30CC, 0x30CF, 0x30D2, 0x30D5, 0x30D8, 0x30DB, 0x30DE, 0x30E1, 0x30E4, 0x30E7, 0x30EA,
+ 0x30ED, 0x30F0, 0x30F3, 0x30F6, 0x30F9, 0x30FC, 0x30FF, 0x3102, 0x3105, 0x3108, 0x310B, 0x310E, 0x3111, 0x3114, 0x3117, 0x311A,
+ 0x311D, 0x3120, 0x3123, 0x3126, 0x3129, 0x312C, 0x853F, 0x8540, 0x8541, 0x8542, 0x8543, 0x8544, 0x8545, 0x8546, 0x8547, 0x8548,
+ 0x8549, 0x854A, 0x854B, 0x854C, 0x854D, 0x854E, 0x854F, 0x8550, 0x8551, 0x8552, 0x8553, 0x8554, 0x8555, 0x8556, 0x8557, 0x8558,
+ 0x8559, 0x855A, 0x855B, 0x855C, 0x855D, 0x855E, 0x855F, 0x8560, 0x8561, 0x8562, 0x8563, 0x8564, 0x8565, 0x8566, 0x8567, 0x8568,
+ 0x8569, 0x856A, 0x856B, 0x856C, 0x856D, 0x856E, 0x856F, 0x8570, 0x8571, 0x8572, 0x8573, 0x21C6, 0x21C8, 0x21CA, 0x21CC, 0x21CE,
+ 0x21D0, 0x21D2, 0x21D4, 0x21D6, 0x21D8, 0x8574, 0x8575, 0x8576, 0x8577, 0x8578, 0x8579, 0x857A, 0x857B, 0x857C, 0x21DA, 0x857D,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x857E, 0x857F, 0x8580, 0x8581, 0x8582, 0x8583, 0x8584, 0x8585, 0x8586, 0x21DC,
+ 0x8587, 0x8588, 0x8589, 0x858A, 0x858B, 0x858C, 0x858D, 0x858E, 0x858F, 0x21DE, 0x8590, 0x8591, 0x8592, 0x8593, 0x8594, 0x8595,
+ 0x8596, 0x8597, 0x8598, 0x21E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x404B, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x312F, 0x21E2, 0x3132, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x21E4, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8599, 0x859A, 0x859B, 0x859C, 0x859D, 0x859E, 0x859F, 0x85A0, 0x85A1, 0x85A2, 0x85A3, 0x85A4, 0x85A5, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x85A6, 0x85A7, 0x85A8, 0x85A9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x85AA, 0x85AB, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x85AC,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x85AD,
+ 0x85AE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x85AF, 0x0000, 0x0000, 0x85B0, 0x0000, 0x85B1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x85B2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x85B3, 0x0000, 0x0000, 0x0000, 0x0000, 0x85B4, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x85B5, 0x85B6, 0x0000, 0x0000, 0x0000, 0x85B7, 0x85B8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x85B9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x85BA, 0x85BB, 0x85BC, 0x85BD, 0x85BE, 0x85BF, 0x85C0, 0x85C1, 0x85C2, 0x85C3, 0x85C4, 0x85C5, 0x85C6, 0x85C7, 0x85C8, 0x85C9,
+ 0x85CA, 0x85CB, 0x85CC, 0x85CD, 0x85CE, 0x85CF, 0x85D0, 0x85D1, 0x85D2, 0x85D3, 0x85D4, 0x85D5, 0x85D6, 0x85D7, 0x85D8, 0x85D9,
+ 0x85DA, 0x85DB, 0x85DC, 0x85DD, 0x85DE, 0x85DF, 0x85E0, 0x85E1, 0x85E2, 0x85E3, 0x85E4, 0x85E5, 0x85E6, 0x85E7, 0x85E8, 0x85E9,
+ 0x85EA, 0x85EB, 0x85EC, 0x85ED, 0x85EE, 0x85EF, 0x85F0, 0x85F1, 0x85F2, 0x85F3, 0x85F4, 0x85F5, 0x85F6, 0x85F7, 0x85F8, 0x85F9,
+ 0x85FA, 0x85FB, 0x85FC, 0x85FD, 0x85FE, 0x85FF, 0x8600, 0x8601, 0x8602, 0x8603, 0x8604, 0x8605, 0x8606, 0x8607, 0x8608, 0x8609,
+ 0x860A, 0x860B, 0x860C, 0x860D, 0x860E, 0x860F, 0x8610, 0x8611, 0x8612, 0x8613, 0x8614, 0x8615, 0x8616, 0x8617, 0x8618, 0x8619,
+ 0x861A, 0x861B, 0x861C, 0x861D, 0x861E, 0x861F, 0x8620, 0x8621, 0x8622, 0x8623, 0x8624, 0x8625, 0x8626, 0x8627, 0x8628, 0x8629,
+ 0x862A, 0x862B, 0x862C, 0x862D, 0x862E, 0x862F, 0x8630, 0x8631, 0x8632, 0x8633, 0x8634, 0x8635, 0x8636, 0x8637, 0x8638, 0x8639,
+ 0x863A, 0x863B, 0x863C, 0x863D, 0x863E, 0x863F, 0x8640, 0x8641, 0x8642, 0x8643, 0x8644, 0x8645, 0x8646, 0x8647, 0x8648, 0x8649,
+ 0x864A, 0x864B, 0x864C, 0x864D, 0x864E, 0x864F, 0x8650, 0x8651, 0x8652, 0x8653, 0x8654, 0x8655, 0x8656, 0x8657, 0x8658, 0x8659,
+ 0x865A, 0x865B, 0x865C, 0x865D, 0x865E, 0x865F, 0x8660, 0x8661, 0x8662, 0x8663, 0x8664, 0x8665, 0x8666, 0x8667, 0x8668, 0x8669,
+ 0x866A, 0x866B, 0x866C, 0x866D, 0x866E, 0x866F, 0x8670, 0x8671, 0x8672, 0x8673, 0x8674, 0x8675, 0x8676, 0x8677, 0x8678, 0x8679,
+ 0x867A, 0x867B, 0x867C, 0x867D, 0x867E, 0x867F, 0x8680, 0x8681, 0x8682, 0x8683, 0x8684, 0x8685, 0x8686, 0x8687, 0x8688, 0x8689,
+ 0x868A, 0x868B, 0x868C, 0x868D, 0x868E, 0x868F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8690, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8691, 0x0000, 0x8692, 0x8693, 0x8694, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x21E6, 0x0000, 0x21E8, 0x0000,
+ 0x21EA, 0x0000, 0x21EC, 0x0000, 0x21EE, 0x0000, 0x21F0, 0x0000, 0x21F2, 0x0000, 0x21F4, 0x0000, 0x21F6, 0x0000, 0x21F8, 0x0000,
+ 0x21FA, 0x0000, 0x21FC, 0x0000, 0x0000, 0x21FE, 0x0000, 0x2200, 0x0000, 0x2202, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x2204, 0x2206, 0x0000, 0x2208, 0x220A, 0x0000, 0x220C, 0x220E, 0x0000, 0x2210, 0x2212, 0x0000, 0x2214, 0x2216, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x2218, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x221A, 0x221C, 0x0000, 0x221E, 0x2220,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2222, 0x0000, 0x2224, 0x0000,
+ 0x2226, 0x0000, 0x2228, 0x0000, 0x222A, 0x0000, 0x222C, 0x0000, 0x222E, 0x0000, 0x2230, 0x0000, 0x2232, 0x0000, 0x2234, 0x0000,
+ 0x2236, 0x0000, 0x2238, 0x0000, 0x0000, 0x223A, 0x0000, 0x223C, 0x0000, 0x223E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x2240, 0x2242, 0x0000, 0x2244, 0x2246, 0x0000, 0x2248, 0x224A, 0x0000, 0x224C, 0x224E, 0x0000, 0x2250, 0x2252, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x2254, 0x0000, 0x0000, 0x2256, 0x2258, 0x225A, 0x225C, 0x0000, 0x0000, 0x0000, 0x225E, 0x2260,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8695, 0x8696, 0x8697, 0x8698, 0x8699, 0x869A, 0x869B, 0x869C, 0x869D, 0x869E, 0x869F, 0x86A0, 0x86A1, 0x86A2, 0x86A3,
+ 0x86A4, 0x86A5, 0x86A6, 0x86A7, 0x86A8, 0x86A9, 0x86AA, 0x86AB, 0x86AC, 0x86AD, 0x86AE, 0x86AF, 0x86B0, 0x86B1, 0x86B2, 0x86B3,
+ 0x86B4, 0x86B5, 0x86B6, 0x86B7, 0x86B8, 0x86B9, 0x86BA, 0x86BB, 0x86BC, 0x86BD, 0x86BE, 0x86BF, 0x86C0, 0x86C1, 0x86C2, 0x86C3,
+ 0x86C4, 0x86C5, 0x86C6, 0x86C7, 0x86C8, 0x86C9, 0x86CA, 0x86CB, 0x86CC, 0x86CD, 0x86CE, 0x86CF, 0x86D0, 0x86D1, 0x86D2, 0x86D3,
+ 0x86D4, 0x86D5, 0x86D6, 0x86D7, 0x86D8, 0x86D9, 0x86DA, 0x86DB, 0x86DC, 0x86DD, 0x86DE, 0x86DF, 0x86E0, 0x86E1, 0x86E2, 0x86E3,
+ 0x86E4, 0x86E5, 0x86E6, 0x86E7, 0x86E8, 0x86E9, 0x86EA, 0x86EB, 0x86EC, 0x86ED, 0x86EE, 0x86EF, 0x86F0, 0x86F1, 0x86F2, 0x0000,
+ 0x0000, 0x0000, 0x86F3, 0x86F4, 0x86F5, 0x86F6, 0x86F7, 0x86F8, 0x86F9, 0x86FA, 0x86FB, 0x86FC, 0x86FD, 0x86FE, 0x86FF, 0x8700,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x3135, 0x3138, 0x313B, 0x313E, 0x3141, 0x3144, 0x3147, 0x314A, 0x314D, 0x3150, 0x3153, 0x3156, 0x3159, 0x315C, 0x4050, 0x4055,
+ 0x405A, 0x405F, 0x4064, 0x4069, 0x406E, 0x4073, 0x4078, 0x407D, 0x4082, 0x4087, 0x408C, 0x4091, 0x4096, 0x409B, 0x40A3, 0x0000,
+ 0x315F, 0x3162, 0x3165, 0x3168, 0x316B, 0x316E, 0x3171, 0x3174, 0x3177, 0x317A, 0x317D, 0x3180, 0x3183, 0x3186, 0x3189, 0x318C,
+ 0x318F, 0x3192, 0x3195, 0x3198, 0x319B, 0x319E, 0x31A1, 0x31A4, 0x31A7, 0x31AA, 0x31AD, 0x31B0, 0x31B3, 0x31B6, 0x31B9, 0x31BC,
+ 0x31BF, 0x31C2, 0x31C5, 0x31C8, 0x8701, 0x8702, 0x8703, 0x8704, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x31CB, 0x2262, 0x2264, 0x2266, 0x2268, 0x226A, 0x226C, 0x226E, 0x2270, 0x2272, 0x2274, 0x2276, 0x2278, 0x227A, 0x227C, 0x227E,
+ 0x8705, 0x8706, 0x8707, 0x8708, 0x8709, 0x870A, 0x870B, 0x870C, 0x870D, 0x870E, 0x870F, 0x8710, 0x8711, 0x8712, 0x2280, 0x2282,
+ 0x2284, 0x2286, 0x2288, 0x228A, 0x228C, 0x228E, 0x2290, 0x2292, 0x2294, 0x2296, 0x2298, 0x229A, 0x40AA, 0x40B0, 0x229C, 0x0000,
+ 0x8713, 0x8714, 0x8715, 0x8716, 0x8717, 0x8718, 0x8719, 0x871A, 0x871B, 0x871C, 0x871D, 0x871E, 0x871F, 0x8720, 0x8721, 0x8722,
+ 0x8723, 0x8724, 0x8725, 0x8726, 0x8727, 0x8728, 0x8729, 0x872A, 0x872B, 0x872C, 0x872D, 0x872E, 0x872F, 0x8730, 0x8731, 0x8732,
+ 0x8733, 0x8734, 0x8735, 0x8736, 0x8737, 0x8738, 0x8739, 0x873A, 0x873B, 0x873C, 0x873D, 0x873E, 0x873F, 0x8740, 0x8741, 0x8742,
+ 0x8743, 0x229E, 0x22A0, 0x22A2, 0x22A4, 0x22A6, 0x22A8, 0x22AA, 0x22AC, 0x22AE, 0x22B0, 0x22B2, 0x22B4, 0x22B6, 0x22B8, 0x22BA,
+ 0x22BC, 0x22BE, 0x22C0, 0x22C2, 0x22C4, 0x22C6, 0x22C8, 0x22CA, 0x22CC, 0x31CE, 0x31D1, 0x31D4, 0x22CE, 0x31D7, 0x22D0, 0x31DA,
+ 0x8744, 0x8745, 0x8746, 0x8747, 0x8748, 0x8749, 0x874A, 0x874B, 0x874C, 0x874D, 0x874E, 0x874F, 0x8750, 0x8751, 0x8752, 0x8753,
+ 0x8754, 0x8755, 0x8756, 0x8757, 0x8758, 0x8759, 0x875A, 0x875B, 0x875C, 0x875D, 0x875E, 0x875F, 0x8760, 0x8761, 0x8762, 0x8763,
+ 0x8764, 0x8765, 0x8766, 0x8767, 0x8768, 0x8769, 0x876A, 0x876B, 0x876C, 0x876D, 0x876E, 0x876F, 0x8770, 0x8771, 0x8772, 0x0000,
+ 0x40B5, 0x40BA, 0x40BF, 0x31DD, 0x40C4, 0x31E0, 0x31E3, 0x40C9, 0x40CF, 0x31E6, 0x31E9, 0x31EC, 0x40D4, 0x40D9, 0x31EF, 0x31F2,
+ 0x22D2, 0x31F5, 0x40DE, 0x40E3, 0x22D4, 0x40E8, 0x40EE, 0x40F5, 0x31F8, 0x40FB, 0x4101, 0x4107, 0x31FB, 0x31FE, 0x3201, 0x410C,
+ 0x4111, 0x4117, 0x3204, 0x3207, 0x320A, 0x22D6, 0x22D8, 0x22DA, 0x22DC, 0x320D, 0x3210, 0x411C, 0x3213, 0x4122, 0x4127, 0x3216,
+ 0x22DE, 0x22E0, 0x412D, 0x4133, 0x4138, 0x3219, 0x413E, 0x22E2, 0x321C, 0x321F, 0x3222, 0x3225, 0x3228, 0x4144, 0x322B, 0x22E4,
+ 0x322E, 0x3231, 0x3234, 0x4149, 0x3237, 0x323A, 0x323D, 0x414E, 0x4154, 0x22E6, 0x4159, 0x22E8, 0x415F, 0x4164, 0x3240, 0x3243,
+ 0x3246, 0x4169, 0x22EA, 0x3249, 0x416E, 0x22EC, 0x4173, 0x324C, 0x22EE, 0x22F0, 0x22F2, 0x22F4, 0x22F6, 0x22F8, 0x22FA, 0x22FC,
+ 0x22FE, 0x2300, 0x324F, 0x3252, 0x3255, 0x3258, 0x325B, 0x325E, 0x3261, 0x3264, 0x3267, 0x326A, 0x326D, 0x3270, 0x3273, 0x3276,
+ 0x3279, 0x327C, 0x2302, 0x2304, 0x327F, 0x2306, 0x2308, 0x230A, 0x3282, 0x3285, 0x230C, 0x230E, 0x2310, 0x2312, 0x2314, 0x4179,
+ 0x2316, 0x2318, 0x231A, 0x231C, 0x231E, 0x2320, 0x2322, 0x2324, 0x3288, 0x417E, 0x2326, 0x2328, 0x232A, 0x232C, 0x232E, 0x2330,
+ 0x2332, 0x328B, 0x328E, 0x3291, 0x3294, 0x2334, 0x2336, 0x2338, 0x233A, 0x233C, 0x233E, 0x2340, 0x2342, 0x2344, 0x2346, 0x3297,
+ 0x329A, 0x2348, 0x329D, 0x32A0, 0x32A3, 0x234A, 0x32A6, 0x32A9, 0x4183, 0x234C, 0x32AC, 0x32AF, 0x32B2, 0x32B5, 0x4188, 0x418E,
+ 0x234E, 0x2350, 0x2352, 0x2354, 0x2356, 0x2358, 0x235A, 0x235C, 0x235E, 0x2360, 0x2362, 0x2364, 0x2366, 0x2368, 0x236A, 0x236C,
+ 0x236E, 0x2370, 0x4195, 0x2372, 0x2374, 0x2376, 0x419A, 0x32B8, 0x2378, 0x237A, 0x237C, 0x237E, 0x2380, 0x2382, 0x2384, 0x2386,
+ 0x2388, 0x238A, 0x32BB, 0x238C, 0x238E, 0x32BE, 0x32C1, 0x2390, 0x419F, 0x32C4, 0x2392, 0x2394, 0x2396, 0x2398, 0x32C7, 0x32CA,
+ 0x239A, 0x239C, 0x239E, 0x23A0, 0x23A2, 0x23A4, 0x23A6, 0x23A8, 0x23AA, 0x32CD, 0x32D0, 0x32D3, 0x32D6, 0x32D9, 0x32DC, 0x32DF,
+ 0x32E2, 0x32E5, 0x32E8, 0x32EB, 0x32EE, 0x32F1, 0x32F4, 0x32F7, 0x32FA, 0x32FD, 0x3300, 0x3303, 0x3306, 0x3309, 0x330C, 0x330F,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8773,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8774, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8775, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8776, 0x0000,
+ 0x0000, 0x0000, 0x8777, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8778, 0x0000, 0x0000, 0x0000, 0x0000, 0x8779, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x877A, 0x877B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x877C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x877D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x877E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x877F, 0x8780, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8781, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8782, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8783, 0x0000, 0x0000, 0x8784, 0x0000, 0x8785, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8786, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8787, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8788, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x8789, 0x878A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x878B, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x878C, 0x0000, 0x0000, 0x0000, 0x0000, 0x878D, 0x0000, 0x878E, 0x878F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8790, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8791, 0x0000, 0x8792,
+ 0x0000, 0x0000, 0x0000, 0x8793, 0x8794, 0x8795, 0x0000, 0x8796, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8797, 0x0000,
+ 0x0000, 0x0000, 0x8798, 0x0000, 0x0000, 0x8799, 0x0000, 0x0000, 0x0000, 0x879A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x879B, 0x0000, 0x0000, 0x0000, 0x879C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x879D, 0x0000, 0x0000, 0x879E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x879F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87A0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x87A1, 0x0000, 0x87A2, 0x0000, 0x87A3, 0x0000, 0x0000, 0x0000, 0x0000, 0x87A4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x87A5, 0x0000, 0x0000, 0x0000, 0x87A6, 0x87A7, 0x0000, 0x0000, 0x87A8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87A9,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87AA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x87AB, 0x0000, 0x0000, 0x0000, 0x0000, 0x87AC, 0x0000, 0x0000, 0x87AD, 0x87AE, 0x87AF, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87B0, 0x0000, 0x0000, 0x0000, 0x0000, 0x87B1, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x87B2, 0x0000, 0x0000, 0x0000, 0x0000, 0x87B3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87B4, 0x0000, 0x87B5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87B6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x87B7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87B8, 0x87B9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87BA, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87BB, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x87BC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87BD, 0x0000, 0x0000, 0x0000, 0x0000, 0x87BE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x87BF, 0x0000, 0x0000, 0x87C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87C1, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87C2, 0x0000, 0x87C3, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87C4, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x87C5, 0x87C6, 0x0000, 0x87C7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x87C8, 0x0000, 0x0000, 0x0000, 0x87C9, 0x0000, 0x87CA, 0x87CB, 0x0000, 0x87CC, 0x87CD, 0x0000, 0x0000,
+ 0x0000, 0x87CE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x87CF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87D0, 0x0000, 0x87D1, 0x0000, 0x87D2, 0x0000, 0x0000, 0x0000, 0x87D3, 0x87D4, 0x0000,
+ 0x0000, 0x0000, 0x87D5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x87D6, 0x0000, 0x87D7, 0x0000, 0x87D8, 0x0000, 0x0000, 0x87D9, 0x0000, 0x0000, 0x87DA, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87DB, 0x0000, 0x87DC,
+ 0x0000, 0x87DD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x87DE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x87DF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87E0, 0x0000, 0x87E1, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87E2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87E3, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x87E4, 0x0000, 0x87E5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x87E6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x87E7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x87E8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x87E9, 0x0000, 0x0000, 0x87EA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x87EB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x87EC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87ED, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x87EE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87EF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87F0,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87F1, 0x87F2,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87F3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87F4, 0x0000, 0x87F5, 0x0000, 0x87F6, 0x0000,
+ 0x0000, 0x0000, 0x87F7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87F8, 0x87F9, 0x0000, 0x0000, 0x87FA, 0x0000, 0x0000, 0x0000, 0x87FB, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87FC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87FD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87FE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87FF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8800, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x8801, 0x0000, 0x8802, 0x8803, 0x0000, 0x0000, 0x0000, 0x0000, 0x8804, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8805, 0x0000, 0x0000, 0x0000, 0x0000, 0x8806, 0x8807,
+ 0x8808, 0x0000, 0x0000, 0x0000, 0x0000, 0x8809, 0x0000, 0x0000, 0x880A, 0x0000, 0x0000, 0x0000, 0x0000, 0x880B, 0x0000, 0x0000,
+ 0x0000, 0x880C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x880D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x880E, 0x0000, 0x0000,
+ 0x880F, 0x0000, 0x0000, 0x0000, 0x0000, 0x8810, 0x8811, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8812,
+ 0x0000, 0x0000, 0x8813, 0x0000, 0x8814, 0x0000, 0x0000, 0x0000, 0x8815, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8816, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8817, 0x0000, 0x0000, 0x0000, 0x0000, 0x8818, 0x0000, 0x0000, 0x0000,
+ 0x8819, 0x0000, 0x0000, 0x0000, 0x0000, 0x881A, 0x0000, 0x0000, 0x0000, 0x881B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x881C, 0x0000, 0x881D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x881E, 0x881F, 0x8820, 0x0000, 0x8821, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8822, 0x8823, 0x8824, 0x0000, 0x0000, 0x8825, 0x0000, 0x0000, 0x8826, 0x8827, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8828, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8829, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x882A, 0x0000, 0x0000, 0x0000, 0x882B, 0x0000, 0x882C, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x882D, 0x882E, 0x0000, 0x0000, 0x882F, 0x0000, 0x8830, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8831, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8832, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8833, 0x0000, 0x0000, 0x0000, 0x0000, 0x8834, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8835, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8836,
+ 0x0000, 0x8837, 0x0000, 0x0000, 0x8838, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8839, 0x883A, 0x0000, 0x0000, 0x0000, 0x883B,
+ 0x0000, 0x0000, 0x883C, 0x0000, 0x0000, 0x0000, 0x0000, 0x883D, 0x0000, 0x0000, 0x883E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x883F, 0x0000, 0x8840, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8841, 0x0000, 0x0000, 0x0000, 0x8842, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8843, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8844, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8845, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x8846, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8847, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8848, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x8849, 0x0000, 0x0000, 0x0000, 0x0000, 0x884A, 0x884B, 0x884C, 0x0000, 0x0000, 0x0000, 0x884D, 0x884E,
+ 0x0000, 0x0000, 0x884F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8850, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8851,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8852, 0x0000, 0x8853, 0x8854, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8855, 0x0000, 0x8856, 0x0000, 0x0000, 0x8857, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8858, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8859, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x885A, 0x0000, 0x885B, 0x885C, 0x0000, 0x0000, 0x0000, 0x885D, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x885E, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x885F, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8860, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8861, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8862, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8863, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8864, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8865, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8866, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8867,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8868, 0x8869, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x886A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x886B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x886C, 0x0000, 0x0000, 0x0000, 0x886D,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x886E, 0x0000, 0x0000, 0x886F, 0x8870, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8871, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8872, 0x0000, 0x0000, 0x8873, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8874, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8875, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8876, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8877, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8878, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8879, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x887A,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x887B, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x887C, 0x0000, 0x0000, 0x0000, 0x887D, 0x887E, 0x0000, 0x887F, 0x0000, 0x8880, 0x8881, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8882, 0x8883, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8884, 0x8885, 0x0000, 0x0000, 0x8886, 0x0000, 0x8887, 0x8888, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8889, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x888A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x888B, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x888C, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x888D, 0x0000, 0x888E, 0x0000, 0x0000, 0x888F, 0x8890, 0x0000, 0x0000, 0x0000, 0x8891, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8892, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x8893, 0x0000, 0x8894, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8895, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8896, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8897, 0x0000, 0x8898, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8899, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x889A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x889B, 0x0000, 0x0000, 0x889C, 0x0000, 0x0000, 0x889D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x889E, 0x0000, 0x0000, 0x889F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x88A0, 0x0000, 0x88A1, 0x0000, 0x0000, 0x0000, 0x0000, 0x88A2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88A3, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x88A4, 0x0000, 0x0000, 0x0000, 0x88A5, 0x0000, 0x88A6, 0x0000, 0x88A7, 0x88A8, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88A9, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x88AA, 0x0000, 0x88AB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x88AC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88AD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88AE, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x88AF, 0x0000, 0x0000, 0x88B0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x88B1, 0x0000, 0x0000, 0x88B2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88B3, 0x88B4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88B5,
+ 0x0000, 0x0000, 0x0000, 0x88B6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88B7, 0x88B8, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88B9, 0x0000, 0x0000, 0x0000, 0x0000, 0x88BA, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88BB, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x88BC, 0x88BD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88BE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88BF, 0x0000, 0x0000, 0x88C0, 0x0000, 0x88C1,
+ 0x88C2, 0x88C3, 0x88C4, 0x88C5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88C6, 0x0000, 0x0000, 0x88C7, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x88C8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x88C9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x88CA, 0x0000, 0x88CB, 0x0000, 0x88CC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88CD, 0x0000, 0x0000, 0x0000, 0x88CE, 0x0000, 0x88CF, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88D0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88D1, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x88D2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88D3, 0x0000,
+ 0x88D4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88D5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88D6, 0x0000, 0x0000, 0x0000, 0x88D7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88D8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88D9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88DA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88DB, 0x88DC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x88DD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x88DE, 0x88DF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88E0, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88E1, 0x88E2, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88E3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x88E4, 0x0000, 0x0000, 0x88E5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88E6, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88E7, 0x0000, 0x88E8, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88E9, 0x0000, 0x88EA, 0x0000, 0x0000, 0x0000, 0x0000, 0x88EB,
+ 0x0000, 0x0000, 0x0000, 0x88EC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88ED, 0x88EE, 0x0000, 0x0000, 0x88EF, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x88F0, 0x0000, 0x0000, 0x88F1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x88F2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88F3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x88F4, 0x88F5, 0x88F6, 0x0000, 0x0000, 0x0000, 0x88F7, 0x0000, 0x0000, 0x0000, 0x88F8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x88F9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88FA, 0x0000, 0x0000, 0x88FB, 0x0000,
+ 0x0000, 0x0000, 0x88FC, 0x0000, 0x0000, 0x0000, 0x88FD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88FE, 0x0000, 0x88FF, 0x0000, 0x0000, 0x8900, 0x8901, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8902,
+ 0x0000, 0x0000, 0x0000, 0x8903, 0x0000, 0x0000, 0x0000, 0x0000, 0x8904, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8905, 0x0000, 0x0000, 0x0000, 0x8906, 0x8907, 0x8908, 0x0000, 0x8909, 0x0000, 0x890A, 0x0000, 0x890B, 0x0000,
+ 0x890C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x890D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x890E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x890F, 0x0000, 0x8910, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8911, 0x0000, 0x8912, 0x0000, 0x0000, 0x0000, 0x8913, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8914, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8915, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8916, 0x0000, 0x0000, 0x8917, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8918, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x8919, 0x891A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x891B, 0x0000, 0x891C, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x891D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x891E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x891F, 0x8920, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8921, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8922, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8923, 0x8924, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8925, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8926, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8927, 0x0000, 0x0000, 0x8928,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8929,
+ 0x0000, 0x0000, 0x0000, 0x892A, 0x0000, 0x0000, 0x892B, 0x0000, 0x0000, 0x0000, 0x0000, 0x892C, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x892D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x892E, 0x0000, 0x0000, 0x892F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8930,
+ 0x0000, 0x0000, 0x0000, 0x8931, 0x0000, 0x8932, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8933, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8934, 0x8935, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8936, 0x0000, 0x0000, 0x8937, 0x8938,
+ 0x0000, 0x8939, 0x0000, 0x0000, 0x893A, 0x0000, 0x0000, 0x893B, 0x0000, 0x0000, 0x893C, 0x893D, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x893E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x893F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8940, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8941, 0x0000, 0x0000, 0x8942,
+ 0x8943, 0x8944, 0x8945, 0x0000, 0x8946, 0x0000, 0x0000, 0x8947, 0x0000, 0x0000, 0x8948, 0x8949, 0x894A, 0x0000, 0x894B, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x894C, 0x0000, 0x894D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x894E,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x894F, 0x0000, 0x8950, 0x0000, 0x0000, 0x8951, 0x0000, 0x8952, 0x8953, 0x8954, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8955, 0x8956, 0x8957, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8958, 0x0000, 0x8959, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x895A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x895B, 0x895C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x895D, 0x0000, 0x0000, 0x895E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x895F, 0x8960, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8961, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8962, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8963, 0x0000, 0x0000, 0x0000, 0x0000, 0x8964, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8965, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8966, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8967, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8968, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8969, 0x896A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x896B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x896C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x896D, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x896E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x896F, 0x0000, 0x8970, 0x8971, 0x0000, 0x8972, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8973, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8974, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8975, 0x0000, 0x0000, 0x0000, 0x8976, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8977, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x8978, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8979, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x897A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x897B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x897C,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x897D, 0x0000, 0x0000, 0x0000, 0x897E, 0x0000, 0x0000, 0x0000, 0x0000, 0x897F, 0x0000, 0x8980,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x8981, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8982, 0x8983, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8984,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8985, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8986, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8987,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8988, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x8989, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x898A, 0x0000, 0x0000, 0x0000, 0x0000, 0x898B, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x898C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x898D, 0x0000, 0x0000, 0x0000, 0x898E, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x898F,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8990, 0x0000, 0x8991, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x8992, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x8993, 0x0000, 0x0000, 0x8994, 0x8995, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x8996, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8997, 0x8998, 0x0000, 0x0000, 0x8999, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x899A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x899B, 0x0000, 0x0000, 0x0000, 0x0000, 0x899C, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x899D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x899E, 0x899F, 0x89A0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89A1, 0x0000, 0x0000, 0x89A2, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89A3,
+ 0x0000, 0x0000, 0x89A4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89A5, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x89A6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89A7, 0x0000, 0x89A8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x89A9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89AA, 0x0000, 0x0000, 0x89AB,
+ 0x0000, 0x0000, 0x89AC, 0x89AD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89AE, 0x89AF,
+ 0x0000, 0x0000, 0x0000, 0x89B0, 0x0000, 0x0000, 0x0000, 0x0000, 0x89B1, 0x0000, 0x0000, 0x89B2, 0x0000, 0x0000, 0x89B3, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x89B4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x89B5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89B6, 0x89B7, 0x0000, 0x89B8, 0x89B9, 0x89BA,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89BB, 0x0000, 0x89BC, 0x89BD, 0x0000, 0x89BE, 0x89BF, 0x89C0, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x89C1, 0x0000, 0x0000, 0x0000, 0x0000, 0x89C2, 0x0000, 0x89C3, 0x89C4, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x89C5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89C6, 0x0000, 0x0000, 0x0000, 0x0000, 0x89C7,
+ 0x0000, 0x0000, 0x89C8, 0x0000, 0x0000, 0x0000, 0x89C9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89CA, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x89CB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89CC,
+ 0x0000, 0x89CD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x89CE, 0x0000, 0x0000, 0x0000, 0x0000, 0x89CF, 0x89D0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89D1,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89D2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89D3, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x89D4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89D5, 0x0000, 0x0000, 0x89D6, 0x89D7,
+ 0x0000, 0x0000, 0x89D8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89D9, 0x0000, 0x89DA, 0x0000, 0x0000, 0x0000,
+ 0x89DB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89DC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89DD,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89DE, 0x0000, 0x0000, 0x0000, 0x89DF, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x89E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89E1, 0x89E2, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x89E3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89E4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89E5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89E6, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x89E7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x89E8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89E9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89EA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89EB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89EC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89ED, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x89EE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89EF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89F0, 0x0000, 0x0000, 0x89F1, 0x0000, 0x89F2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89F3, 0x89F4, 0x0000, 0x0000, 0x0000, 0x89F5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89F6, 0x0000, 0x89F7, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x89F8, 0x0000, 0x0000, 0x0000, 0x89F9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89FA, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89FB, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89FC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89FD, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89FE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89FF, 0x8A00,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A01, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A02, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A03, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A04, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x8A05, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A06, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x8A07, 0x8A08, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A09, 0x0000, 0x8A0A, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A0B, 0x0000, 0x0000, 0x8A0C,
+ 0x0000, 0x0000, 0x8A0D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A0E, 0x0000, 0x0000, 0x8A0F, 0x0000, 0x0000, 0x8A10, 0x8A11,
+ 0x0000, 0x8A12, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A13, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A14, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8A15, 0x8A16, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A17, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8A18, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A19, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A1A,
+ 0x0000, 0x8A1B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8A1C, 0x0000, 0x0000, 0x8A1D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A1E, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x8A1F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A20,
+ 0x8A21, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A22,
+ 0x8A23, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A24, 0x8A25, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8A26, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A27, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8A28, 0x0000, 0x0000, 0x0000, 0x8A29, 0x0000, 0x8A2A, 0x0000, 0x0000, 0x8A2B, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A2C, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8A2D, 0x0000, 0x8A2E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A2F, 0x0000, 0x0000, 0x8A30, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A31,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x8A32, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A33, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8A34, 0x8A35, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A36, 0x0000, 0x8A37, 0x0000, 0x8A38, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A39, 0x8A3A, 0x0000, 0x0000, 0x8A3B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A3C,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A3D, 0x0000, 0x0000, 0x8A3E, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A3F, 0x0000, 0x8A40,
+ 0x8A41, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A42, 0x8A43, 0x8A44, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8A45, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A46, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x8A47, 0x8A48, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8A49, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A4A, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A4B, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x8A4C, 0x8A4D, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A4E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A4F, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A50, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A51,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x8A52, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8A53, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A54, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8A55, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A56, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8A57, 0x0000, 0x0000, 0x8A58, 0x0000, 0x0000, 0x0000, 0x8A59, 0x0000, 0x0000, 0x8A5A, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8A5B, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A5C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8A5D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A5E, 0x0000,
+ 0x0000, 0x8A5F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A60, 0x8A61, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8A62, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A63, 0x0000, 0x0000, 0x8A64, 0x0000, 0x0000, 0x8A65,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A66, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A67, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x8A68, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A69, 0x0000, 0x8A6A, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A6B, 0x0000, 0x0000,
+ 0x8A6C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A6D, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A6E, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8A6F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A70, 0x0000, 0x0000, 0x0000, 0x8A71, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A72, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A73, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A74, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A75, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A76, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8A77, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A78, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8A79, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A7A, 0x0000, 0x0000, 0x0000, 0x8A7B, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A7C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A7D, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A7E, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8A7F, 0x0000, 0x0000, 0x8A80, 0x8A81, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A82, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A83, 0x0000, 0x8A84, 0x8A85, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8A86, 0x0000, 0x8A87, 0x0000, 0x0000, 0x8A88, 0x0000, 0x8A89, 0x8A8A, 0x0000, 0x8A8B, 0x8A8C, 0x8A8D, 0x0000, 0x0000, 0x0000,
+ 0x8A8E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A8F, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A90, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A91,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A92, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8A93, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x8A94, 0x8A95, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A96, 0x8A97, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A98,
+ 0x0000, 0x0000, 0x8A99, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A9A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8A9B, 0x0000, 0x8A9C, 0x0000, 0x0000, 0x8A9D, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A9E, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8A9F, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AA0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AA1, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AA2, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AA3,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x8AA4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AA5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AA6, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AA7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8AA8, 0x8AA9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AAA, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8AAB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AAC, 0x8AAD, 0x0000, 0x0000, 0x0000,
+ 0x8AAE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AAF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AB0, 0x0000, 0x0000, 0x8AB1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AB2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8AB3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AB4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8AB5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AB6, 0x0000, 0x8AB7, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x8AB8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AB9, 0x0000,
+ 0x0000, 0x8ABA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8ABB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8ABC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8ABD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8ABE, 0x0000, 0x0000, 0x0000, 0x8ABF, 0x8AC0, 0x0000, 0x8AC1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AC2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AC3,
+ 0x0000, 0x0000, 0x8AC4, 0x0000, 0x8AC5, 0x0000, 0x0000, 0x8AC6, 0x0000, 0x8AC7, 0x0000, 0x0000, 0x8AC8, 0x8AC9, 0x8ACA, 0x0000,
+ 0x8ACB, 0x8ACC, 0x8ACD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8ACE, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8ACF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8AD0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AD1, 0x0000, 0x8AD2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x8AD3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AD4, 0x0000, 0x8AD5, 0x0000,
+ 0x0000, 0x8AD6, 0x0000, 0x8AD7, 0x8AD8, 0x0000, 0x0000, 0x8AD9, 0x0000, 0x0000, 0x8ADA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8ADB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8ADC, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8ADD,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8ADE, 0x0000, 0x8ADF, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AE0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AE1, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AE2, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AE3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AE4, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x8AE5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AE6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AE7,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AE8, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8AE9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AEA, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x8AEB, 0x0000, 0x0000, 0x0000, 0x8AEC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AED,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AEE, 0x0000, 0x0000, 0x0000, 0x8AEF, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AF0, 0x0000, 0x8AF1, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8AF2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AF3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x8AF4, 0x0000, 0x0000, 0x0000, 0x8AF5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AF6,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AF7, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x8AF8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AF9, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AFA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AFB, 0x0000, 0x0000, 0x0000, 0x8AFC, 0x8AFD, 0x8AFE, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8AFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B00,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B01, 0x8B02, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B03, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B04, 0x0000, 0x0000, 0x0000, 0x8B05, 0x0000, 0x0000, 0x0000, 0x8B06, 0x0000,
+ 0x0000, 0x8B07, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B08,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B09, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B0A, 0x0000, 0x0000, 0x8B0B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B0C, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B0D, 0x0000,
+ 0x0000, 0x8B0E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B0F, 0x8B10, 0x8B11, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8B12, 0x8B13, 0x8B14, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B15, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B16, 0x8B17, 0x0000, 0x0000, 0x0000, 0x8B18, 0x8B19,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B1A, 0x8B1B, 0x0000, 0x0000, 0x0000, 0x8B1C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x8B1D, 0x8B1E, 0x0000, 0x8B1F, 0x0000, 0x0000, 0x8B20, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B21, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B22, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B23, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B24, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B25, 0x0000, 0x0000, 0x0000, 0x8B26,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8B27, 0x0000, 0x0000, 0x0000, 0x8B28, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B29, 0x0000, 0x8B2A, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x8B2B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x8B2C, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B2D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x8B2E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8B2F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B30, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B31, 0x0000,
+ 0x0000, 0x8B32, 0x0000, 0x8B33, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B34, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B35, 0x0000, 0x8B36, 0x0000, 0x0000, 0x0000, 0x8B37, 0x8B38, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x8B39, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B3A, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B3B, 0x0000, 0x8B3C, 0x8B3D, 0x0000, 0x0000, 0x8B3E,
+ 0x8B3F, 0x0000, 0x0000, 0x0000, 0x8B40, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B41, 0x0000, 0x0000, 0x8B42, 0x0000, 0x8B43, 0x0000,
+ 0x0000, 0x0000, 0x8B44, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B45, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B46, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B47, 0x8B48, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B49, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8B4A, 0x8B4B, 0x0000, 0x8B4C, 0x0000, 0x8B4D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B4E, 0x0000,
+ 0x8B4F, 0x0000, 0x8B50, 0x0000, 0x8B51, 0x8B52, 0x8B53, 0x8B54, 0x8B55, 0x8B56, 0x0000, 0x8B57, 0x0000, 0x8B58, 0x0000, 0x0000,
+ 0x8B59, 0x0000, 0x0000, 0x8B5A, 0x8B5B, 0x8B5C, 0x0000, 0x8B5D, 0x0000, 0x8B5E, 0x8B5F, 0x8B60, 0x8B61, 0x8B62, 0x0000, 0x0000,
+ 0x0000, 0x8B63, 0x0000, 0x0000, 0x0000, 0x8B64, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B65, 0x0000,
+ 0x8B66, 0x8B67, 0x8B68, 0x8B69, 0x0000, 0x8B6A, 0x0000, 0x0000, 0x0000, 0x8B6B, 0x8B6C, 0x0000, 0x8B6D, 0x0000, 0x0000, 0x8B6E,
+ 0x8B6F, 0x0000, 0x8B70, 0x8B71, 0x8B72, 0x0000, 0x8B73, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B74, 0x0000,
+ 0x8B75, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B76, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B77, 0x0000, 0x8B78, 0x8B79, 0x0000,
+ 0x0000, 0x8B7A, 0x8B7B, 0x0000, 0x0000, 0x0000, 0x8B7C, 0x0000, 0x8B7D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8B7E, 0x8B7F, 0x8B80, 0x8B81, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B82, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8B83, 0x0000, 0x8B84, 0x0000, 0x0000, 0x8B85, 0x0000, 0x8B86, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B87,
+ 0x0000, 0x0000, 0x0000, 0x8B88, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B89, 0x0000, 0x8B8A, 0x0000,
+ 0x8B8B, 0x0000, 0x8B8C, 0x8B8D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B8E, 0x8B8F, 0x0000, 0x0000,
+ 0x8B90, 0x8B91, 0x8B92, 0x0000, 0x8B93, 0x0000, 0x0000, 0x0000, 0x8B94, 0x8B95, 0x8B96, 0x8B97, 0x0000, 0x8B98, 0x8B99, 0x8B9A,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x8B9B, 0x0000, 0x0000, 0x8B9C, 0x0000, 0x0000, 0x8B9D, 0x8B9E, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8B9F, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BA0, 0x8BA1, 0x8BA2, 0x8BA3, 0x0000, 0x0000, 0x8BA4, 0x8BA5, 0x0000,
+ 0x8BA6, 0x8BA7, 0x0000, 0x8BA8, 0x0000, 0x0000, 0x8BA9, 0x0000, 0x8BAA, 0x8BAB, 0x0000, 0x0000, 0x8BAC, 0x0000, 0x0000, 0x8BAD,
+ 0x0000, 0x8BAE, 0x8BAF, 0x0000, 0x8BB0, 0x0000, 0x8BB1, 0x0000, 0x0000, 0x8BB2, 0x0000, 0x8BB3, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BB4, 0x8BB5, 0x8BB6, 0x8BB7, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8BB8, 0x8BB9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BBA, 0x0000, 0x0000, 0x0000, 0x8BBB, 0x0000, 0x8BBC, 0x8BBD, 0x8BBE,
+ 0x0000, 0x0000, 0x0000, 0x8BBF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BC0, 0x0000, 0x0000, 0x8BC1, 0x0000,
+ 0x0000, 0x8BC2, 0x8BC3, 0x0000, 0x0000, 0x8BC4, 0x8BC5, 0x8BC6, 0x0000, 0x8BC7, 0x0000, 0x0000, 0x0000, 0x8BC8, 0x8BC9, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x8BCA, 0x0000, 0x8BCB, 0x8BCC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8BCD, 0x0000, 0x8BCE, 0x8BCF, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BD0, 0x0000, 0x0000, 0x0000, 0x8BD1, 0x0000,
+ 0x0000, 0x8BD2, 0x8BD3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BD4, 0x8BD5, 0x8BD6, 0x0000, 0x8BD7, 0x0000, 0x8BD8,
+ 0x8BD9, 0x0000, 0x0000, 0x8BDA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BDB, 0x0000, 0x0000, 0x8BDC, 0x8BDD, 0x8BDE, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BDF, 0x0000, 0x8BE0, 0x0000, 0x8BE1, 0x0000, 0x0000, 0x8BE2,
+ 0x0000, 0x0000, 0x0000, 0x8BE3, 0x0000, 0x0000, 0x8BE4, 0x0000, 0x8BE5, 0x0000, 0x0000, 0x0000, 0x8BE6, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BE7, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BE8, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8BE9, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BEA, 0x0000, 0x8BEB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BEC, 0x8BED, 0x0000, 0x8BEE, 0x0000, 0x0000, 0x8BEF, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BF0, 0x0000, 0x0000, 0x8BF1, 0x8BF2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BF3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8BF4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8BF5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BF6, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BF7, 0x0000, 0x0000, 0x0000, 0x8BF8, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BF9, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BFA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BFB, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BFC,
+ 0x8BFD, 0x0000, 0x8BFE, 0x8BFF, 0x0000, 0x8C00, 0x8C01, 0x8C02, 0x0000, 0x8C03, 0x0000, 0x0000, 0x0000, 0x8C04, 0x8C05, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C06, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C07, 0x0000, 0x0000, 0x8C08, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C09, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C0A, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C0B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C0C, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C0D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8C0E, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C0F, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C10, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x8C11, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C12, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x8C13, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C14, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C15, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8C16, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C17, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C18, 0x8C19, 0x8C1A,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C1B, 0x0000, 0x0000, 0x0000, 0x8C1C, 0x0000, 0x8C1D,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C1E, 0x0000, 0x8C1F, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C20,
+ 0x8C21, 0x0000, 0x8C22, 0x0000, 0x0000, 0x8C23, 0x0000, 0x0000, 0x8C24, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C25, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C26, 0x8C27, 0x8C28, 0x8C29, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C2A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x8C2B, 0x0000, 0x8C2C, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C2D, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8C2E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C2F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8C30, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C31, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C32, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8C33, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C34, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x8C35, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C36, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C37, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8C38, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C39, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C3A,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C3B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C3C, 0x0000, 0x0000, 0x8C3D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C3E, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C3F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C40, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8C41, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C42, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C43, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C44, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8C45, 0x0000, 0x0000, 0x0000, 0x8C46, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C47, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C48, 0x0000, 0x0000, 0x0000,
+ 0x8C49, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C4A, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C4B, 0x8C4C,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x8C4D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C4E, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C4F, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x8C50, 0x0000, 0x8C51, 0x8C52, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C53, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8C54, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C55, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C56, 0x0000,
+ 0x0000, 0x0000, 0x8C57, 0x0000, 0x0000, 0x8C58, 0x0000, 0x0000, 0x8C59, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8C5A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C5B, 0x0000, 0x0000, 0x8C5C, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C5D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C5E, 0x0000, 0x8C5F, 0x0000, 0x8C60, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8C61, 0x0000, 0x0000, 0x8C62, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C63,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C64, 0x0000, 0x0000, 0x8C65, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C66, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C67, 0x0000, 0x0000, 0x0000, 0x8C68, 0x8C69, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C6A, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C6B, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C6C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C6D, 0x0000, 0x0000, 0x8C6E, 0x8C6F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8C70, 0x0000, 0x0000, 0x0000, 0x8C71, 0x0000, 0x8C72, 0x8C73, 0x0000, 0x0000, 0x8C74, 0x8C75, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C76, 0x0000, 0x0000, 0x8C77, 0x0000, 0x0000, 0x0000, 0x8C78, 0x0000,
+ 0x0000, 0x0000, 0x8C79, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C7A, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C7B, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C7C,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C7D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C7E, 0x8C7F, 0x0000, 0x0000, 0x8C80,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C81, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C82,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C83, 0x8C84, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C85, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C86, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C87,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C88, 0x0000, 0x8C89, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C8A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x8C8B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C8C, 0x0000,
+ 0x0000, 0x0000, 0x8C8D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C8E, 0x0000, 0x0000, 0x0000, 0x8C8F,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x8C90, 0x0000, 0x0000, 0x0000, 0x8C91, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C92, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x8C93, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C94, 0x0000, 0x0000, 0x8C95,
+ 0x0000, 0x0000, 0x8C96, 0x0000, 0x0000, 0x0000, 0x8C97, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C98, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8C99, 0x0000, 0x0000, 0x0000, 0x8C9A, 0x8C9B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C9C, 0x0000, 0x0000,
+ 0x8C9D, 0x8C9E, 0x0000, 0x0000, 0x8C9F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CA0,
+ 0x0000, 0x0000, 0x0000, 0x8CA1, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CA2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8CA3, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CA4, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CA5, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CA6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x8CA7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CA8, 0x0000, 0x8CA9, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CAA, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CAB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CAC, 0x8CAD, 0x0000, 0x0000,
+ 0x0000, 0x8CAE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CAF, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CB0, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CB1, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CB2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8CB3, 0x8CB4, 0x0000, 0x8CB5, 0x0000, 0x0000, 0x8CB6, 0x0000, 0x0000, 0x8CB7, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CB8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CB9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CBA, 0x0000, 0x0000,
+ 0x8CBB, 0x0000, 0x0000, 0x0000, 0x8CBC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CBD, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CBE,
+ 0x0000, 0x0000, 0x8CBF, 0x0000, 0x8CC0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CC1, 0x0000, 0x0000, 0x0000, 0x8CC2,
+ 0x0000, 0x0000, 0x0000, 0x8CC3, 0x0000, 0x0000, 0x8CC4, 0x0000, 0x8CC5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8CC6, 0x0000, 0x0000, 0x0000, 0x8CC7, 0x8CC8, 0x0000, 0x0000, 0x0000, 0x8CC9, 0x0000, 0x8CCA, 0x0000, 0x0000, 0x8CCB,
+ 0x0000, 0x0000, 0x8CCC, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CCD, 0x0000, 0x0000, 0x8CCE, 0x0000, 0x0000, 0x8CCF, 0x0000, 0x8CD0,
+ 0x8CD1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x8CD2, 0x0000, 0x8CD3, 0x0000, 0x8CD4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8CD5, 0x8CD6, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CD7, 0x0000, 0x8CD8, 0x0000, 0x8CD9, 0x0000, 0x8CDA, 0x0000,
+ 0x8CDB, 0x0000, 0x0000, 0x8CDC, 0x0000, 0x8CDD, 0x8CDE, 0x8CDF, 0x8CE0, 0x0000, 0x0000, 0x8CE1, 0x0000, 0x8CE2, 0x0000, 0x8CE3,
+ 0x0000, 0x0000, 0x0000, 0x8CE4, 0x0000, 0x8CE5, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CE6, 0x0000, 0x0000, 0x8CE7, 0x0000, 0x0000,
+ 0x0000, 0x8CE8, 0x0000, 0x0000, 0x8CE9, 0x0000, 0x8CEA, 0x0000, 0x0000, 0x0000, 0x8CEB, 0x0000, 0x8CEC, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8CED, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CEE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CEF, 0x0000,
+ 0x8CF0, 0x0000, 0x8CF1, 0x0000, 0x8CF2, 0x8CF3, 0x0000, 0x0000, 0x8CF4, 0x0000, 0x0000, 0x8CF5, 0x0000, 0x0000, 0x8CF6, 0x0000,
+ 0x8CF7, 0x8CF8, 0x8CF9, 0x8CFA, 0x0000, 0x0000, 0x8CFB, 0x0000, 0x0000, 0x8CFC, 0x0000, 0x8CFD, 0x8CFE, 0x8CFF, 0x8D00, 0x0000,
+ 0x8D01, 0x8D02, 0x8D03, 0x8D04, 0x0000, 0x8D05, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D06, 0x0000, 0x0000, 0x8D07,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x8D08, 0x8D09, 0x8D0A, 0x8D0B, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D0C, 0x8D0D, 0x0000, 0x0000,
+ 0x0000, 0x8D0E, 0x8D0F, 0x0000, 0x0000, 0x8D10, 0x0000, 0x0000, 0x8D11, 0x0000, 0x8D12, 0x0000, 0x0000, 0x0000, 0x8D13, 0x0000,
+ 0x8D14, 0x8D15, 0x0000, 0x8D16, 0x8D17, 0x8D18, 0x8D19, 0x0000, 0x8D1A, 0x0000, 0x8D1B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8D1C, 0x0000, 0x8D1D, 0x0000, 0x0000, 0x0000, 0x8D1E, 0x0000, 0x0000, 0x8D1F, 0x0000, 0x0000, 0x8D20, 0x0000, 0x0000, 0x8D21,
+ 0x0000, 0x0000, 0x8D22, 0x0000, 0x8D23, 0x0000, 0x0000, 0x8D24, 0x0000, 0x8D25, 0x0000, 0x8D26, 0x0000, 0x8D27, 0x0000, 0x8D28,
+ 0x0000, 0x8D29, 0x8D2A, 0x0000, 0x0000, 0x0000, 0x8D2B, 0x8D2C, 0x0000, 0x0000, 0x0000, 0x8D2D, 0x8D2E, 0x8D2F, 0x8D30, 0x0000,
+ 0x0000, 0x8D31, 0x8D32, 0x0000, 0x8D33, 0x0000, 0x8D34, 0x8D35, 0x0000, 0x0000, 0x0000, 0x8D36, 0x0000, 0x8D37, 0x8D38, 0x0000,
+ 0x0000, 0x8D39, 0x0000, 0x8D3A, 0x0000, 0x0000, 0x8D3B, 0x8D3C, 0x8D3D, 0x0000, 0x8D3E, 0x0000, 0x8D3F, 0x0000, 0x8D40, 0x0000,
+ 0x8D41, 0x8D42, 0x8D43, 0x0000, 0x8D44, 0x8D45, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D46, 0x0000, 0x0000, 0x0000, 0x8D47, 0x0000,
+ 0x8D48, 0x0000, 0x0000, 0x0000, 0x8D49, 0x0000, 0x8D4A, 0x8D4B, 0x0000, 0x8D4C, 0x0000, 0x8D4D, 0x0000, 0x8D4E, 0x0000, 0x0000,
+ 0x8D4F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D50, 0x0000, 0x0000, 0x8D51, 0x8D52, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x8D53, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D54, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D55, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D56, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D57, 0x8D58,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D59, 0x0000, 0x8D5A, 0x8D5B, 0x8D5C, 0x0000, 0x8D5D, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D5E, 0x0000, 0x0000, 0x0000, 0x8D5F,
+ 0x8D60, 0x0000, 0x0000, 0x0000, 0x8D61, 0x0000, 0x0000, 0x8D62, 0x8D63, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D64, 0x8D65, 0x0000,
+ 0x8D66, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D67, 0x8D68, 0x0000, 0x0000, 0x8D69, 0x0000,
+ 0x0000, 0x0000, 0x8D6A, 0x8D6B, 0x0000, 0x8D6C, 0x8D6D, 0x0000, 0x0000, 0x0000, 0x8D6E, 0x0000, 0x8D6F, 0x0000, 0x8D70, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D71, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D72, 0x0000,
+ 0x8D73, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D74, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D75, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x8D76, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D77, 0x8D78, 0x0000,
+ 0x8D79, 0x8D7A, 0x8D7B, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D7C, 0x8D7D, 0x8D7E, 0x8D7F, 0x8D80, 0x8D81, 0x0000, 0x0000, 0x8D82,
+ 0x8D83, 0x0000, 0x8D84, 0x8D85, 0x8D86, 0x0000, 0x8D87, 0x8D88, 0x8D89, 0x0000, 0x8D8A, 0x8D8B, 0x8D8C, 0x8D8D, 0x0000, 0x8D8E,
+ 0x8D8F, 0x8D90, 0x8D91, 0x8D92, 0x8D93, 0x8D94, 0x0000, 0x8D95, 0x8D96, 0x0000, 0x8D97, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8D98, 0x8D99, 0x8D9A, 0x0000, 0x8D9B, 0x0000, 0x0000, 0x0000, 0x8D9C, 0x8D9D, 0x0000, 0x8D9E, 0x0000, 0x8D9F, 0x0000,
+ 0x8DA0, 0x8DA1, 0x8DA2, 0x8DA3, 0x8DA4, 0x0000, 0x8DA5, 0x8DA6, 0x0000, 0x0000, 0x8DA7, 0x0000, 0x8DA8, 0x8DA9, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x8DAA, 0x8DAB, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DAC, 0x8DAD, 0x8DAE, 0x8DAF, 0x8DB0, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x8DB1, 0x8DB2, 0x0000, 0x8DB3, 0x8DB4, 0x0000, 0x8DB5, 0x0000, 0x0000, 0x8DB6, 0x0000, 0x8DB7,
+ 0x8DB8, 0x0000, 0x0000, 0x8DB9, 0x8DBA, 0x0000, 0x8DBB, 0x8DBC, 0x0000, 0x0000, 0x0000, 0x8DBD, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DBE, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DBF, 0x0000, 0x0000, 0x0000, 0x8DC0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DC1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8DC2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8DC3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8DC4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x8DC5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DC6, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DC7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8DC8, 0x0000, 0x0000, 0x8DC9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DCA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8DCB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DCC, 0x8DCD, 0x8DCE, 0x0000, 0x8DCF, 0x0000, 0x0000,
+ 0x0000, 0x8DD0, 0x8DD1, 0x8DD2, 0x0000, 0x8DD3, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DD4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8DD5, 0x0000, 0x0000, 0x0000, 0x8DD6, 0x8DD7, 0x0000, 0x0000, 0x0000, 0x8DD8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8DD9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DDA, 0x8DDB, 0x8DDC, 0x8DDD, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8DDE, 0x0000, 0x8DDF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DE0, 0x0000, 0x0000, 0x0000, 0x8DE1,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DE2, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8DE3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DE4, 0x8DE5, 0x8DE6, 0x8DE7, 0x8DE8, 0x0000, 0x8DE9, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x8DEA, 0x0000, 0x8DEB, 0x0000, 0x8DEC, 0x8DED, 0x8DEE, 0x8DEF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8DF0, 0x0000, 0x8DF1, 0x8DF2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DF3, 0x8DF4, 0x8DF5, 0x8DF6, 0x8DF7,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DF8, 0x8DF9, 0x0000, 0x0000, 0x8DFA, 0x8DFB, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DFC,
+ 0x0000, 0x0000, 0x0000, 0x8DFD, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DFE, 0x0000, 0x0000, 0x8DFF, 0x0000, 0x0000, 0x8E00, 0x8E01,
+ 0x8E02, 0x0000, 0x8E03, 0x0000, 0x8E04, 0x8E05, 0x8E06, 0x0000, 0x0000, 0x8E07, 0x0000, 0x0000, 0x0000, 0x8E08, 0x8E09, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x8E0A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E0B,
+ 0x0000, 0x8E0C, 0x8E0D, 0x0000, 0x8E0E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E0F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E10, 0x8E11, 0x8E12,
+ 0x0000, 0x0000, 0x8E13, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E14, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x8E15, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8E16, 0x8E17, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E18, 0x8E19, 0x0000, 0x0000, 0x8E1A, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x8E1B, 0x8E1C, 0x0000, 0x0000, 0x0000, 0x8E1D, 0x0000, 0x0000, 0x8E1E, 0x0000, 0x8E1F, 0x0000,
+ 0x8E20, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E21, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8E22, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E23, 0x8E24, 0x0000, 0x8E25, 0x0000, 0x8E26, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8E27, 0x0000, 0x0000, 0x8E28, 0x0000, 0x0000, 0x8E29, 0x0000, 0x0000, 0x8E2A, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E2B,
+ 0x8E2C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E2D,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E2E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E2F, 0x0000, 0x0000, 0x8E30, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8E31, 0x0000, 0x8E32, 0x0000, 0x8E33, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E34, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E35, 0x0000, 0x0000,
+ 0x8E36, 0x0000, 0x8E37, 0x0000, 0x8E38, 0x0000, 0x8E39, 0x0000, 0x0000, 0x0000, 0x8E3A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E3B, 0x8E3C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x8E3D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E3E, 0x0000, 0x8E3F, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E40, 0x8E41, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8E42, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8E43, 0x8E44, 0x0000, 0x8E45, 0x0000, 0x8E46, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E47, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x8E48, 0x8E49, 0x0000, 0x8E4A, 0x8E4B, 0x8E4C, 0x0000, 0x0000, 0x0000, 0x8E4D, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x8E4E, 0x8E4F, 0x0000, 0x0000, 0x8E50, 0x0000, 0x8E51, 0x0000, 0x0000, 0x8E52, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E53, 0x0000, 0x8E54, 0x0000, 0x8E55, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8E56, 0x8E57, 0x0000, 0x8E58, 0x8E59, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E5A, 0x0000, 0x0000, 0x0000, 0x8E5B, 0x0000, 0x0000,
+ 0x8E5C, 0x8E5D, 0x0000, 0x0000, 0x8E5E, 0x8E5F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E60, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x8E61, 0x0000, 0x0000, 0x8E62, 0x8E63, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E64, 0x0000,
+ 0x8E65, 0x0000, 0x0000, 0x8E66, 0x8E67, 0x0000, 0x0000, 0x8E68, 0x8E69, 0x8E6A, 0x8E6B, 0x0000, 0x0000, 0x8E6C, 0x8E6D, 0x8E6E,
+ 0x8E6F, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E70, 0x0000, 0x0000, 0x8E71, 0x8E72, 0x0000, 0x8E73, 0x0000, 0x8E74, 0x0000, 0x0000,
+ 0x0000, 0x8E75, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E76, 0x0000, 0x0000, 0x8E77, 0x8E78, 0x0000, 0x0000, 0x8E79, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x8E7A, 0x0000, 0x8E7B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E7C, 0x8E7D, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E7E, 0x0000, 0x8E7F, 0x0000, 0x8E80, 0x8E81, 0x0000, 0x0000, 0x0000, 0x8E82,
+ 0x8E83, 0x0000, 0x0000, 0x8E84, 0x0000, 0x8E85, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E86, 0x0000, 0x0000,
+ 0x0000, 0x8E87, 0x0000, 0x8E88, 0x0000, 0x0000, 0x8E89, 0x0000, 0x8E8A, 0x0000, 0x8E8B, 0x8E8C, 0x8E8D, 0x0000, 0x0000, 0x0000,
+ 0x8E8E, 0x0000, 0x0000, 0x8E8F, 0x0000, 0x8E90, 0x8E91, 0x0000, 0x8E92, 0x0000, 0x8E93, 0x8E94, 0x8E95, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x8E96, 0x0000, 0x0000, 0x0000, 0x8E97, 0x0000, 0x8E98, 0x0000, 0x8E99, 0x8E9A, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8E9B, 0x0000, 0x8E9C, 0x0000, 0x8E9D, 0x0000, 0x8E9E, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E9F, 0x0000, 0x0000, 0x8EA0,
+ 0x0000, 0x0000, 0x8EA1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8EA2, 0x0000, 0x8EA3,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x8EA4, 0x8EA5, 0x8EA6, 0x0000, 0x8EA7, 0x8EA8, 0x8EA9, 0x0000, 0x0000, 0x0000, 0x8EAA, 0x8EAB,
+ 0x8EAC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8EAD, 0x0000, 0x0000, 0x0000, 0x8EAE, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8EAF, 0x0000, 0x0000, 0x8EB0, 0x0000, 0x8EB1, 0x0000, 0x8EB2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8EB3,
+ 0x8EB4, 0x0000, 0x8EB5, 0x0000, 0x0000, 0x8EB6, 0x0000, 0x0000, 0x8EB7, 0x8EB8, 0x8EB9, 0x8EBA, 0x0000, 0x0000, 0x0000, 0x8EBB,
+ 0x8EBC, 0x8EBD, 0x8EBE, 0x0000, 0x0000, 0x0000, 0x8EBF, 0x0000, 0x8EC0, 0x8EC1, 0x0000, 0x8EC2, 0x0000, 0x0000, 0x8EC3, 0x8EC4,
+ 0x0000, 0x0000, 0x0000, 0x8EC5, 0x0000, 0x0000, 0x8EC6, 0x0000, 0x8EC7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8EC8, 0x0000, 0x0000, 0x0000, 0x0000, 0x8EC9, 0x8ECA, 0x0000, 0x0000, 0x8ECB, 0x8ECC, 0x0000, 0x8ECD, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x8ECE, 0x0000, 0x0000, 0x0000, 0x8ECF, 0x0000, 0x8ED0, 0x8ED1, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8ED2, 0x0000, 0x0000, 0x0000, 0x8ED3, 0x8ED4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8ED5, 0x0000, 0x0000, 0x0000,
+ 0x8ED6, 0x0000, 0x0000, 0x0000, 0x0000, 0x8ED7, 0x8ED8, 0x0000, 0x0000, 0x0000, 0x8ED9, 0x0000, 0x0000, 0x0000, 0x8EDA, 0x0000,
+ 0x0000, 0x0000, 0x8EDB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8EDC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x8EDD, 0x0000, 0x8EDE, 0x0000, 0x8EDF, 0x0000, 0x0000, 0x8EE0, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8EE1, 0x8EE2, 0x8EE3, 0x0000, 0x0000, 0x8EE4, 0x8EE5, 0x0000, 0x8EE6, 0x8EE7, 0x0000, 0x8EE8, 0x0000, 0x8EE9, 0x0000,
+ 0x8EEA, 0x0000, 0x0000, 0x8EEB, 0x0000, 0x8EEC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x8EED, 0x0000, 0x0000, 0x0000, 0x8EEE, 0x8EEF, 0x0000, 0x0000, 0x0000, 0x8EF0, 0x8EF1, 0x0000, 0x0000,
+ 0x8EF2, 0x8EF3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8EF4, 0x8EF5, 0x0000, 0x0000, 0x0000, 0x8EF6, 0x8EF7, 0x8EF8, 0x8EF9,
+ 0x0000, 0x8EFA, 0x8EFB, 0x0000, 0x8EFC, 0x0000, 0x0000, 0x0000, 0x8EFD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8EFE, 0x0000, 0x0000, 0x0000, 0x0000, 0x8EFF, 0x0000, 0x0000, 0x0000, 0x8F00, 0x0000, 0x0000, 0x0000, 0x8F01, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x8F02, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8F03, 0x0000, 0x0000, 0x8F04, 0x8F05, 0x0000, 0x0000, 0x0000, 0x8F06, 0x8F07, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F08, 0x8F09, 0x0000, 0x0000, 0x8F0A, 0x0000, 0x0000, 0x8F0B, 0x0000,
+ 0x0000, 0x0000, 0x8F0C, 0x8F0D, 0x0000, 0x8F0E, 0x8F0F, 0x0000, 0x8F10, 0x0000, 0x8F11, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F12,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x8F13, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F14, 0x0000, 0x8F15, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8F16, 0x0000, 0x0000, 0x0000, 0x8F17, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F18, 0x0000,
+ 0x8F19, 0x0000, 0x0000, 0x8F1A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F1B, 0x0000, 0x0000,
+ 0x8F1C, 0x8F1D, 0x8F1E, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F1F, 0x0000, 0x8F20, 0x0000, 0x0000, 0x8F21, 0x8F22, 0x8F23, 0x8F24,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F25, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8F26, 0x0000, 0x8F27, 0x8F28, 0x0000, 0x0000, 0x8F29, 0x0000, 0x8F2A, 0x8F2B, 0x0000, 0x8F2C, 0x8F2D, 0x0000, 0x8F2E, 0x8F2F,
+ 0x0000, 0x0000, 0x8F30, 0x8F31, 0x8F32, 0x0000, 0x0000, 0x0000, 0x8F33, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8F34, 0x0000, 0x8F35, 0x0000, 0x8F36, 0x0000, 0x0000, 0x8F37, 0x8F38, 0x0000, 0x8F39, 0x8F3A, 0x8F3B, 0x0000, 0x0000,
+ 0x0000, 0x8F3C, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F3D, 0x0000, 0x0000, 0x8F3E, 0x0000, 0x8F3F, 0x8F40, 0x8F41, 0x8F42, 0x8F43,
+ 0x0000, 0x0000, 0x0000, 0x8F44, 0x0000, 0x0000, 0x8F45, 0x8F46, 0x8F47, 0x0000, 0x8F48, 0x8F49, 0x8F4A, 0x0000, 0x0000, 0x0000,
+ 0x8F4B, 0x0000, 0x8F4C, 0x8F4D, 0x8F4E, 0x8F4F, 0x8F50, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F51, 0x0000, 0x8F52, 0x0000,
+ 0x8F53, 0x8F54, 0x8F55, 0x0000, 0x8F56, 0x8F57, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F58, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F59, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x8F5A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8F5B, 0x0000, 0x0000, 0x8F5C, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F5D, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F5E, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F5F, 0x8F60, 0x0000, 0x0000, 0x0000, 0x8F61, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F62, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F63, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F64, 0x0000, 0x8F65, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8F66, 0x0000, 0x0000, 0x8F67, 0x0000, 0x0000, 0x0000, 0x8F68, 0x0000, 0x0000, 0x8F69, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F6A, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F6B, 0x0000, 0x0000, 0x8F6C, 0x0000, 0x8F6D, 0x8F6E, 0x0000, 0x8F6F, 0x0000,
+ 0x0000, 0x0000, 0x8F70, 0x8F71, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8F72, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F73, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8F74, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F75, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F76, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8F77, 0x0000, 0x8F78, 0x0000, 0x8F79, 0x0000, 0x8F7A, 0x8F7B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F7C, 0x0000, 0x8F7D, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F7E, 0x0000, 0x8F7F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8F80, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F81,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F82, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8F83, 0x0000, 0x8F84, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F85, 0x0000, 0x8F86, 0x8F87, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x8F88, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F89, 0x0000, 0x0000, 0x8F8A, 0x0000, 0x8F8B, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F8C, 0x0000, 0x0000, 0x0000, 0x8F8D,
+ 0x0000, 0x8F8E, 0x8F8F, 0x8F90, 0x0000, 0x8F91, 0x8F92, 0x8F93, 0x8F94, 0x0000, 0x8F95, 0x0000, 0x8F96, 0x0000, 0x8F97, 0x8F98,
+ 0x8F99, 0x8F9A, 0x8F9B, 0x8F9C, 0x0000, 0x0000, 0x0000, 0x8F9D, 0x8F9E, 0x0000, 0x0000, 0x0000, 0x8F9F, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8FA0, 0x0000, 0x0000, 0x8FA1, 0x0000, 0x8FA2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8FA3, 0x0000, 0x0000,
+ 0x8FA4, 0x0000, 0x8FA5, 0x0000, 0x0000, 0x0000, 0x0000, 0x8FA6, 0x8FA7, 0x8FA8, 0x0000, 0x8FA9, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8FAA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8FAB, 0x8FAC, 0x8FAD, 0x8FAE,
+ 0x0000, 0x0000, 0x8FAF, 0x8FB0, 0x0000, 0x0000, 0x0000, 0x0000, 0x8FB1, 0x8FB2, 0x0000, 0x8FB3, 0x0000, 0x0000, 0x8FB4, 0x0000,
+ 0x0000, 0x0000, 0x8FB5, 0x0000, 0x0000, 0x8FB6, 0x0000, 0x8FB7, 0x0000, 0x0000, 0x0000, 0x8FB8, 0x8FB9, 0x0000, 0x0000, 0x8FBA,
+ 0x8FBB, 0x8FBC, 0x0000, 0x8FBD, 0x8FBE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8FBF, 0x0000, 0x0000, 0x0000, 0x0000, 0x8FC0, 0x8FC1, 0x8FC2,
+ 0x0000, 0x8FC3, 0x0000, 0x0000, 0x0000, 0x0000, 0x8FC4, 0x0000, 0x8FC5, 0x0000, 0x8FC6, 0x8FC7, 0x8FC8, 0x0000, 0x0000, 0x0000,
+ 0x8FC9, 0x0000, 0x0000, 0x0000, 0x8FCA, 0x0000, 0x8FCB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8FCC, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8FCD, 0x8FCE, 0x0000, 0x8FCF, 0x0000, 0x0000, 0x0000, 0x8FD0, 0x8FD1, 0x8FD2, 0x0000, 0x8FD3, 0x0000, 0x8FD4,
+ 0x0000, 0x0000, 0x8FD5, 0x0000, 0x8FD6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8FD7, 0x8FD8, 0x8FD9, 0x8FDA,
+ 0x0000, 0x0000, 0x0000, 0x8FDB, 0x8FDC, 0x8FDD, 0x0000, 0x0000, 0x0000, 0x8FDE, 0x8FDF, 0x0000, 0x8FE0, 0x0000, 0x8FE1, 0x0000,
+ 0x0000, 0x8FE2, 0x8FE3, 0x8FE4, 0x0000, 0x0000, 0x8FE5, 0x0000, 0x8FE6, 0x0000, 0x8FE7, 0x8FE8, 0x8FE9, 0x0000, 0x8FEA, 0x0000,
+ 0x0000, 0x8FEB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8FEC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8FED, 0x0000, 0x8FEE, 0x0000, 0x8FEF, 0x8FF0, 0x0000, 0x0000, 0x0000, 0x8FF1, 0x0000, 0x8FF2, 0x0000, 0x8FF3, 0x8FF4,
+ 0x0000, 0x8FF5, 0x0000, 0x8FF6, 0x0000, 0x8FF7, 0x0000, 0x0000, 0x8FF8, 0x8FF9, 0x0000, 0x8FFA, 0x8FFB, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8FFC, 0x0000, 0x0000, 0x0000, 0x0000, 0x8FFD, 0x0000, 0x0000, 0x0000, 0x0000, 0x8FFE, 0x0000, 0x8FFF, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9000, 0x9001, 0x9002, 0x0000,
+ 0x0000, 0x9003, 0x0000, 0x9004, 0x9005, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x9006, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x9007, 0x9008, 0x9009, 0x0000, 0x900A, 0x900B, 0x0000, 0x0000, 0x900C, 0x900D, 0x0000, 0x900E, 0x0000, 0x900F, 0x0000, 0x9010,
+ 0x0000, 0x0000, 0x9011, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9012, 0x0000, 0x0000,
+ 0x9013, 0x9014, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9015, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9016,
+ 0x0000, 0x9017, 0x9018, 0x0000, 0x0000, 0x9019, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x901A, 0x901B, 0x901C,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x901D, 0x0000, 0x0000, 0x901E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x901F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9020, 0x0000, 0x9021, 0x9022, 0x0000,
+ 0x9023, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9024, 0x9025, 0x9026, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9027, 0x0000,
+ 0x9028, 0x9029, 0x902A, 0x902B, 0x902C, 0x902D, 0x0000, 0x0000, 0x0000, 0x0000, 0x902E, 0x0000, 0x902F, 0x9030, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9031, 0x0000, 0x9032, 0x0000, 0x0000, 0x9033, 0x9034, 0x0000, 0x0000, 0x0000, 0x9035,
+ 0x0000, 0x0000, 0x9036, 0x0000, 0x9037, 0x9038, 0x9039, 0x0000, 0x0000, 0x0000, 0x903A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x903B,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x903C,
+ 0x0000, 0x0000, 0x903D, 0x0000, 0x903E, 0x903F, 0x9040, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9041, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9042, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9043, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x9044, 0x0000, 0x0000, 0x9045, 0x0000, 0x9046, 0x0000, 0x9047, 0x0000, 0x0000, 0x0000, 0x0000, 0x9048, 0x0000,
+ 0x0000, 0x9049, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x904A, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x904B, 0x0000, 0x904C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x904D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x904E,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x904F, 0x0000, 0x0000, 0x9050, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x9051, 0x0000, 0x9052, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9053, 0x9054, 0x0000,
+ 0x9055, 0x9056, 0x9057, 0x9058, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9059, 0x0000, 0x0000, 0x0000, 0x905A, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x905B, 0x0000, 0x0000, 0x0000, 0x905C, 0x905D, 0x0000, 0x905E, 0x905F, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x9060, 0x9061, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9062, 0x0000, 0x9063, 0x9064, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x9065, 0x9066, 0x9067, 0x9068, 0x0000, 0x0000, 0x0000, 0x9069, 0x0000, 0x906A, 0x0000, 0x0000,
+ 0x0000, 0x906B, 0x906C, 0x0000, 0x906D, 0x0000, 0x0000, 0x906E, 0x906F, 0x0000, 0x9070, 0x9071, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x9072, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9073, 0x0000, 0x9074,
+ 0x0000, 0x0000, 0x9075, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9076, 0x9077, 0x0000, 0x0000, 0x0000, 0x9078, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x9079, 0x907A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x907B, 0x0000, 0x0000, 0x907C,
+ 0x0000, 0x0000, 0x0000, 0x907D, 0x0000, 0x907E, 0x0000, 0x0000, 0x907F, 0x9080, 0x0000, 0x0000, 0x0000, 0x9081, 0x9082, 0x0000,
+ 0x0000, 0x9083, 0x9084, 0x0000, 0x0000, 0x0000, 0x0000, 0x9085, 0x0000, 0x9086, 0x9087, 0x9088, 0x0000, 0x0000, 0x9089, 0x0000,
+ 0x0000, 0x0000, 0x908A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x908B, 0x908C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x908D, 0x0000, 0x908E, 0x0000, 0x908F, 0x9090, 0x9091, 0x0000, 0x0000, 0x0000, 0x0000, 0x9092, 0x0000, 0x9093,
+ 0x9094, 0x0000, 0x0000, 0x9095, 0x0000, 0x0000, 0x0000, 0x9096, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9097, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9098, 0x9099, 0x0000, 0x909A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x909B, 0x0000, 0x909C, 0x0000, 0x909D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x909E, 0x909F, 0x90A0, 0x0000, 0x90A1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90A2, 0x90A3, 0x0000, 0x90A4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x90A5, 0x0000, 0x0000, 0x90A6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90A7, 0x0000, 0x90A8, 0x90A9, 0x90AA,
+ 0x0000, 0x0000, 0x0000, 0x90AB, 0x0000, 0x0000, 0x90AC, 0x0000, 0x90AD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90AE,
+ 0x90AF, 0x0000, 0x0000, 0x0000, 0x90B0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90B1, 0x0000, 0x0000, 0x0000, 0x90B2,
+ 0x0000, 0x0000, 0x90B3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x90B4, 0x90B5, 0x90B6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90B7, 0x90B8, 0x0000, 0x0000,
+ 0x90B9, 0x90BA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90BB, 0x0000, 0x90BC, 0x0000, 0x0000, 0x90BD,
+ 0x0000, 0x0000, 0x90BE, 0x0000, 0x0000, 0x0000, 0x0000, 0x90BF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90C0, 0x0000, 0x90C1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x90C2, 0x0000, 0x0000, 0x90C3, 0x0000, 0x90C4, 0x0000, 0x90C5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x90C6, 0x0000, 0x0000, 0x90C7, 0x90C8, 0x0000, 0x0000, 0x0000, 0x90C9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90CA,
+ 0x0000, 0x0000, 0x90CB, 0x0000, 0x90CC, 0x0000, 0x0000, 0x0000, 0x0000, 0x90CD, 0x90CE, 0x90CF, 0x90D0, 0x0000, 0x0000, 0x90D1,
+ 0x0000, 0x90D2, 0x90D3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x90D4, 0x0000, 0x0000, 0x90D5, 0x90D6, 0x0000, 0x90D7, 0x90D8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90D9, 0x90DA, 0x0000, 0x0000, 0x0000, 0x0000, 0x90DB, 0x0000, 0x0000, 0x0000, 0x90DC,
+ 0x0000, 0x0000, 0x90DD, 0x0000, 0x90DE, 0x0000, 0x0000, 0x0000, 0x90DF, 0x90E0, 0x90E1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90E2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90E3, 0x0000, 0x0000, 0x90E4, 0x0000, 0x90E5, 0x90E6, 0x0000, 0x90E7, 0x90E8, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90E9, 0x0000, 0x0000, 0x0000, 0x0000, 0x90EA, 0x0000, 0x90EB, 0x90EC, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90ED, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90EE, 0x0000, 0x0000, 0x0000, 0x90EF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x90F0, 0x90F1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90F2, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x90F3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90F4, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90F5, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90F6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x90F7, 0x0000, 0x90F8, 0x90F9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90FA, 0x0000, 0x90FB,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90FC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x90FD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90FE, 0x90FF, 0x0000, 0x0000, 0x9100, 0x9101,
+ 0x0000, 0x0000, 0x9102, 0x0000, 0x9103, 0x9104, 0x0000, 0x0000, 0x0000, 0x9105, 0x0000, 0x0000, 0x9106, 0x0000, 0x0000, 0x9107,
+ 0x9108, 0x9109, 0x0000, 0x0000, 0x0000, 0x0000, 0x910A, 0x0000, 0x0000, 0x0000, 0x910B, 0x0000, 0x910C, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x910D, 0x0000, 0x0000, 0x0000, 0x0000, 0x910E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x910F, 0x9110, 0x0000,
+ 0x9111, 0x0000, 0x0000, 0x0000, 0x9112, 0x9113, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9114, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x9115, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x9116, 0x9117, 0x9118, 0x9119, 0x911A, 0x911B, 0x911C, 0x911D, 0x911E, 0x911F, 0x9120, 0x9121, 0x9122, 0x9123, 0x9124, 0x9125,
+ 0x9126, 0x9127, 0x9128, 0x9129, 0x912A, 0x912B, 0x912C, 0x912D, 0x912E, 0x912F, 0x9130, 0x9131, 0x9132, 0x9133, 0x9134, 0x9135,
+ 0x9136, 0x9137, 0x9138, 0x9139, 0x913A, 0x913B, 0x913C, 0x913D, 0x913E, 0x913F, 0x9140, 0x9141, 0x9142, 0x9143, 0x9144, 0x9145,
+ 0x9146, 0x9147, 0x9148, 0x9149, 0x914A, 0x914B, 0x914C, 0x914D, 0x914E, 0x914F, 0x9150, 0x9151, 0x9152, 0x9153, 0x9154, 0x9155,
+ 0x9156, 0x9157, 0x9158, 0x9159, 0x915A, 0x915B, 0x915C, 0x915D, 0x915E, 0x915F, 0x9160, 0x9161, 0x9162, 0x9163, 0x9164, 0x9165,
+ 0x9166, 0x9167, 0x9168, 0x9169, 0x916A, 0x916B, 0x916C, 0x916D, 0x916E, 0x916F, 0x9170, 0x9171, 0x9172, 0x9173, 0x9174, 0x9175,
+ 0x9176, 0x9177, 0x9178, 0x9179, 0x917A, 0x917B, 0x917C, 0x917D, 0x917E, 0x917F, 0x9180, 0x9181, 0x9182, 0x9183, 0x9184, 0x9185,
+ 0x9186, 0x9187, 0x9188, 0x9189, 0x918A, 0x918B, 0x918C, 0x918D, 0x918E, 0x918F, 0x9190, 0x9191, 0x9192, 0x9193, 0x9194, 0x9195,
+ 0x9196, 0x9197, 0x9198, 0x9199, 0x919A, 0x919B, 0x919C, 0x919D, 0x919E, 0x919F, 0x91A0, 0x91A1, 0x91A2, 0x91A3, 0x91A4, 0x91A5,
+ 0x91A6, 0x91A7, 0x91A8, 0x91A9, 0x91AA, 0x91AB, 0x91AC, 0x91AD, 0x91AE, 0x91AF, 0x91B0, 0x91B1, 0x91B2, 0x91B3, 0x91B4, 0x91B5,
+ 0x91B6, 0x91B7, 0x91B8, 0x91B9, 0x91BA, 0x91BB, 0x91BC, 0x91BD, 0x91BE, 0x91BF, 0x91C0, 0x91C1, 0x91C2, 0x91C3, 0x91C4, 0x91C5,
+ 0x91C6, 0x91C7, 0x91C8, 0x91C9, 0x91CA, 0x91CB, 0x91CC, 0x91CD, 0x91CE, 0x91CF, 0x91D0, 0x91D1, 0x91D2, 0x91D3, 0x91D4, 0x91D5,
+ 0x91D6, 0x91D7, 0x91D8, 0x91D9, 0x91DA, 0x91DB, 0x91DC, 0x91DD, 0x91DE, 0x91DF, 0x91E0, 0x91E1, 0x91E2, 0x91E3, 0x91E4, 0x91E5,
+ 0x91E6, 0x91E7, 0x91E8, 0x91E9, 0x91EA, 0x91EB, 0x91EC, 0x91ED, 0x91EE, 0x91EF, 0x91F0, 0x91F1, 0x91F2, 0x91F3, 0x91F4, 0x91F5,
+ 0x91F6, 0x91F7, 0x91F8, 0x91F9, 0x91FA, 0x91FB, 0x91FC, 0x91FD, 0x91FE, 0x91FF, 0x9200, 0x9201, 0x9202, 0x9203, 0x9204, 0x9205,
+ 0x9206, 0x9207, 0x9208, 0x9209, 0x920A, 0x920B, 0x920C, 0x920D, 0x920E, 0x920F, 0x9210, 0x9211, 0x9212, 0x9213, 0x9214, 0x9215,
+ 0x9216, 0x9217, 0x9218, 0x9219, 0x921A, 0x921B, 0x921C, 0x921D, 0x921E, 0x921F, 0x9220, 0x9221, 0x9222, 0x9223, 0x0000, 0x0000,
+ 0x9224, 0x0000, 0x9225, 0x0000, 0x0000, 0x9226, 0x9227, 0x9228, 0x9229, 0x922A, 0x922B, 0x922C, 0x922D, 0x922E, 0x922F, 0x0000,
+ 0x9230, 0x0000, 0x9231, 0x0000, 0x0000, 0x9232, 0x9233, 0x0000, 0x0000, 0x0000, 0x9234, 0x9235, 0x9236, 0x9237, 0x0000, 0x0000,
+ 0x9238, 0x9239, 0x923A, 0x923B, 0x923C, 0x923D, 0x923E, 0x923F, 0x9240, 0x9241, 0x9242, 0x9243, 0x9244, 0x9245, 0x9246, 0x9247,
+ 0x9248, 0x9249, 0x924A, 0x924B, 0x924C, 0x924D, 0x924E, 0x924F, 0x9250, 0x9251, 0x9252, 0x9253, 0x9254, 0x9255, 0x9256, 0x9257,
+ 0x9258, 0x9259, 0x925A, 0x925B, 0x925C, 0x925D, 0x925E, 0x925F, 0x9260, 0x9261, 0x9262, 0x9263, 0x9264, 0x9265, 0x9266, 0x9267,
+ 0x9268, 0x9269, 0x926A, 0x926B, 0x926C, 0x926D, 0x926E, 0x926F, 0x9270, 0x9271, 0x9272, 0x9273, 0x0000, 0x9274, 0x0000, 0x0000,
+ 0x9275, 0x9276, 0x9277, 0x9278, 0x9279, 0x927A, 0x927B, 0x927C, 0x927D, 0x927E, 0x927F, 0x9280, 0x9281, 0x9282, 0x9283, 0x9284,
+ 0x9285, 0x9286, 0x9287, 0x9288, 0x9289, 0x928A, 0x928B, 0x928C, 0x928D, 0x928E, 0x928F, 0x9290, 0x9291, 0x9292, 0x9293, 0x9294,
+ 0x9295, 0x9296, 0x9297, 0x9298, 0x9299, 0x929A, 0x929B, 0x929C, 0x929D, 0x929E, 0x929F, 0x92A0, 0x92A1, 0x92A2, 0x92A3, 0x92A4,
+ 0x92A5, 0x92A6, 0x92A7, 0x92A8, 0x92A9, 0x92AA, 0x92AB, 0x92AC, 0x92AD, 0x92AE, 0x92AF, 0x92B0, 0x92B1, 0x92B2, 0x92B3, 0x92B4,
+ 0x92B5, 0x92B6, 0x92B7, 0x92B8, 0x92B9, 0x92BA, 0x92BB, 0x92BC, 0x92BD, 0x92BE, 0x92BF, 0x92C0, 0x92C1, 0x92C2, 0x92C3, 0x92C4,
+ 0x92C5, 0x92C6, 0x92C7, 0x92C8, 0x92C9, 0x92CA, 0x92CB, 0x92CC, 0x92CD, 0x92CE, 0x92CF, 0x92D0, 0x92D1, 0x92D2, 0x92D3, 0x0000,
+ 0x0000, 0x0000, 0x92D4, 0x92D5, 0x92D6, 0x0000, 0x0000, 0x0000, 0x92D7, 0x92D8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x23AC, 0x23AE, 0x23B0, 0x3312, 0x3315, 0x23B2, 0x23B4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x23B6, 0x23B8, 0x23BA, 0x23BC, 0x23BE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x23C0, 0x0000, 0x23C2,
+ 0x92D9, 0x92DA, 0x92DB, 0x92DC, 0x92DD, 0x92DE, 0x92DF, 0x92E0, 0x92E1, 0x92E2, 0x23C4, 0x23C6, 0x23C8, 0x23CA, 0x23CC, 0x23CE,
+ 0x23D0, 0x23D2, 0x23D4, 0x23D6, 0x23D8, 0x23DA, 0x23DC, 0x0000, 0x23DE, 0x23E0, 0x23E2, 0x23E4, 0x23E6, 0x0000, 0x23E8, 0x0000,
+ 0x23EA, 0x23EC, 0x0000, 0x23EE, 0x23F0, 0x0000, 0x23F2, 0x23F4, 0x23F6, 0x23F8, 0x23FA, 0x23FC, 0x23FE, 0x2400, 0x2402, 0x2404,
+ 0x92E3, 0x92E4, 0x92E5, 0x92E6, 0x92E7, 0x92E8, 0x92E9, 0x92EA, 0x92EB, 0x92EC, 0x92ED, 0x92EE, 0x92EF, 0x92F0, 0x92F1, 0x92F2,
+ 0x92F3, 0x92F4, 0x92F5, 0x92F6, 0x92F7, 0x92F8, 0x92F9, 0x92FA, 0x92FB, 0x92FC, 0x92FD, 0x92FE, 0x92FF, 0x9300, 0x9301, 0x9302,
+ 0x9303, 0x9304, 0x9305, 0x9306, 0x9307, 0x9308, 0x9309, 0x930A, 0x930B, 0x930C, 0x930D, 0x930E, 0x930F, 0x9310, 0x9311, 0x9312,
+ 0x9313, 0x9314, 0x9315, 0x9316, 0x9317, 0x9318, 0x9319, 0x931A, 0x931B, 0x931C, 0x931D, 0x931E, 0x931F, 0x9320, 0x9321, 0x9322,
+ 0x9323, 0x9324, 0x9325, 0x9326, 0x9327, 0x9328, 0x9329, 0x932A, 0x932B, 0x932C, 0x932D, 0x932E, 0x932F, 0x9330, 0x9331, 0x9332,
+ 0x9333, 0x9334, 0x9335, 0x9336, 0x9337, 0x9338, 0x9339, 0x933A, 0x933B, 0x933C, 0x933D, 0x933E, 0x933F, 0x9340, 0x9341, 0x9342,
+ 0x9343, 0x9344, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x9345, 0x9346, 0x9347, 0x9348, 0x9349, 0x934A, 0x934B, 0x934C, 0x934D, 0x934E, 0x934F, 0x9350, 0x9351,
+ 0x9352, 0x9353, 0x9354, 0x9355, 0x9356, 0x9357, 0x9358, 0x9359, 0x935A, 0x935B, 0x2406, 0x2408, 0x240A, 0x240C, 0x240E, 0x2410,
+ 0x2412, 0x2414, 0x2416, 0x2418, 0x241A, 0x241C, 0x241E, 0x2420, 0x2422, 0x2424, 0x2426, 0x2428, 0x935C, 0x935D, 0x935E, 0x935F,
+ 0x242A, 0x242C, 0x242E, 0x2430, 0x2432, 0x2434, 0x2436, 0x2438, 0x243A, 0x243C, 0x243E, 0x2440, 0x2442, 0x2444, 0x2446, 0x2448,
+ 0x244A, 0x244C, 0x244E, 0x2450, 0x2452, 0x2454, 0x2456, 0x2458, 0x245A, 0x245C, 0x245E, 0x2460, 0x2462, 0x2464, 0x2466, 0x2468,
+ 0x246A, 0x246C, 0x246E, 0x2470, 0x2472, 0x2474, 0x2476, 0x2478, 0x247A, 0x247C, 0x247E, 0x2480, 0x2482, 0x2484, 0x2486, 0x2488,
+ 0x248A, 0x248C, 0x248E, 0x2490, 0x2492, 0x2494, 0x2496, 0x2498, 0x249A, 0x249C, 0x249E, 0x24A0, 0x24A2, 0x24A4, 0x24A6, 0x24A8,
+ 0x24AA, 0x24AC, 0x24AE, 0x24B0, 0x24B2, 0x24B4, 0x24B6, 0x24B8, 0x24BA, 0x24BC, 0x24BE, 0x24C0, 0x24C2, 0x24C4, 0x24C6, 0x24C8,
+ 0x24CA, 0x24CC, 0x24CE, 0x24D0, 0x24D2, 0x24D4, 0x24D6, 0x24D8, 0x24DA, 0x24DC, 0x24DE, 0x24E0, 0x24E2, 0x24E4, 0x24E6, 0x24E8,
+ 0x24EA, 0x24EC, 0x24EE, 0x24F0, 0x24F2, 0x24F4, 0x24F6, 0x24F8, 0x24FA, 0x24FC, 0x24FE, 0x2500, 0x2502, 0x2504, 0x2506, 0x2508,
+ 0x250A, 0x250C, 0x250E, 0x2510, 0x2512, 0x2514, 0x2516, 0x2518, 0x251A, 0x251C, 0x251E, 0x2520, 0x2522, 0x2524, 0x2526, 0x2528,
+ 0x252A, 0x252C, 0x252E, 0x2530, 0x2532, 0x2534, 0x2536, 0x2538, 0x253A, 0x253C, 0x253E, 0x2540, 0x2542, 0x2544, 0x2546, 0x2548,
+ 0x254A, 0x254C, 0x254E, 0x2550, 0x2552, 0x2554, 0x2556, 0x2558, 0x255A, 0x255C, 0x255E, 0x2560, 0x2562, 0x2564, 0x2566, 0x2568,
+ 0x256A, 0x256C, 0x256E, 0x2570, 0x2572, 0x2574, 0x2576, 0x2578, 0x257A, 0x257C, 0x257E, 0x2580, 0x2582, 0x2584, 0x2586, 0x2588,
+ 0x258A, 0x258C, 0x258E, 0x2590, 0x2592, 0x2594, 0x2596, 0x2598, 0x259A, 0x259C, 0x259E, 0x25A0, 0x25A2, 0x25A4, 0x25A6, 0x25A8,
+ 0x25AA, 0x25AC, 0x25AE, 0x25B0, 0x25B2, 0x25B4, 0x25B6, 0x25B8, 0x25BA, 0x25BC, 0x25BE, 0x25C0, 0x25C2, 0x25C4, 0x25C6, 0x25C8,
+ 0x25CA, 0x25CC, 0x25CE, 0x25D0, 0x25D2, 0x25D4, 0x25D6, 0x25D8, 0x25DA, 0x25DC, 0x25DE, 0x25E0, 0x25E2, 0x25E4, 0x25E6, 0x25E8,
+ 0x25EA, 0x25EC, 0x25EE, 0x25F0, 0x25F2, 0x25F4, 0x25F6, 0x25F8, 0x25FA, 0x25FC, 0x25FE, 0x2600, 0x2602, 0x2604, 0x2606, 0x2608,
+ 0x260A, 0x260C, 0x3318, 0x331B, 0x331E, 0x260E, 0x2610, 0x2612, 0x2614, 0x2616, 0x2618, 0x261A, 0x261C, 0x261E, 0x2620, 0x2622,
+ 0x2624, 0x2626, 0x2628, 0x262A, 0x262C, 0x262E, 0x2630, 0x2632, 0x2634, 0x2636, 0x2638, 0x263A, 0x263C, 0x263E, 0x2640, 0x2642,
+ 0x2644, 0x2646, 0x2648, 0x264A, 0x264C, 0x264E, 0x2650, 0x2652, 0x2654, 0x2656, 0x2658, 0x265A, 0x265C, 0x265E, 0x2660, 0x2662,
+ 0x2664, 0x2666, 0x2668, 0x266A, 0x266C, 0x266E, 0x2670, 0x2672, 0x2674, 0x2676, 0x2678, 0x267A, 0x267C, 0x267E, 0x2680, 0x2682,
+ 0x2684, 0x2686, 0x2688, 0x268A, 0x268C, 0x268E, 0x2690, 0x2692, 0x2694, 0x2696, 0x2698, 0x269A, 0x269C, 0x269E, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x3321, 0x3324, 0x3327, 0x332A, 0x332D, 0x3330, 0x3333, 0x3336, 0x3339, 0x333C, 0x333F, 0x3342, 0x3345, 0x3348, 0x334B, 0x334E,
+ 0x3351, 0x3354, 0x3357, 0x335A, 0x335D, 0x3360, 0x3363, 0x3366, 0x3369, 0x336C, 0x336F, 0x3372, 0x3375, 0x3378, 0x337B, 0x337E,
+ 0x3381, 0x3384, 0x3387, 0x338A, 0x338D, 0x3390, 0x3393, 0x3396, 0x3399, 0x339C, 0x339F, 0x33A2, 0x33A5, 0x33A8, 0x33AB, 0x33AE,
+ 0x33B1, 0x33B4, 0x33B7, 0x33BA, 0x33BD, 0x33C0, 0x33C3, 0x33C6, 0x33C9, 0x33CC, 0x33CF, 0x33D2, 0x33D5, 0x33D8, 0x33DB, 0x33DE,
+ 0x0000, 0x0000, 0x33E1, 0x33E4, 0x33E7, 0x33EA, 0x33ED, 0x33F0, 0x33F3, 0x33F6, 0x33F9, 0x33FC, 0x33FF, 0x3402, 0x3405, 0x3408,
+ 0x340B, 0x340E, 0x3411, 0x3414, 0x3417, 0x341A, 0x341D, 0x3420, 0x3423, 0x3426, 0x3429, 0x342C, 0x342F, 0x3432, 0x3435, 0x3438,
+ 0x343B, 0x343E, 0x3441, 0x3444, 0x3447, 0x344A, 0x344D, 0x3450, 0x3453, 0x3456, 0x3459, 0x345C, 0x345F, 0x3462, 0x3465, 0x3468,
+ 0x346B, 0x346E, 0x3471, 0x3474, 0x3477, 0x347A, 0x347D, 0x3480, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x3483, 0x3486, 0x41A4, 0x41A9, 0x41AE, 0x41B3, 0x41B8, 0x41BD, 0x41C2, 0x3489, 0x41C7, 0x41DA, 0x41E3, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x9360, 0x9361, 0x9362, 0x9363, 0x9364, 0x9365, 0x9366, 0x9367, 0x9368, 0x9369, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x936A, 0x936B, 0x936C, 0x936D, 0x936E, 0x936F, 0x9370, 0x9371, 0x9372, 0x9373, 0x9374, 0x9375, 0x9376, 0x9377, 0x9378, 0x9379,
+ 0x937A, 0x937B, 0x937C, 0x937D, 0x937E, 0x0000, 0x0000, 0x937F, 0x9380, 0x9381, 0x9382, 0x9383, 0x9384, 0x9385, 0x9386, 0x9387,
+ 0x9388, 0x9389, 0x938A, 0x0000, 0x938B, 0x938C, 0x938D, 0x938E, 0x938F, 0x9390, 0x9391, 0x9392, 0x9393, 0x9394, 0x9395, 0x9396,
+ 0x9397, 0x9398, 0x9399, 0x939A, 0x939B, 0x939C, 0x939D, 0x0000, 0x939E, 0x939F, 0x93A0, 0x93A1, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x93A2, 0x26A0, 0x93A3, 0x0000, 0x93A4, 0x0000, 0x93A5, 0x26A2, 0x93A6, 0x26A4, 0x93A7, 0x26A6, 0x93A8, 0x26A8, 0x93A9, 0x26AA,
+ 0x93AA, 0x93AB, 0x93AC, 0x93AD, 0x93AE, 0x93AF, 0x93B0, 0x93B1, 0x93B2, 0x93B3, 0x93B4, 0x93B5, 0x93B6, 0x93B7, 0x93B8, 0x93B9,
+ 0x93BA, 0x93BB, 0x93BC, 0x93BD, 0x93BE, 0x93BF, 0x93C0, 0x93C1, 0x93C2, 0x93C3, 0x93C4, 0x93C5, 0x93C6, 0x93C7, 0x93C8, 0x93C9,
+ 0x93CA, 0x93CB, 0x93CC, 0x93CD, 0x93CE, 0x93CF, 0x93D0, 0x93D1, 0x93D2, 0x93D3, 0x93D4, 0x93D5, 0x93D6, 0x93D7, 0x93D8, 0x93D9,
+ 0x93DA, 0x93DB, 0x93DC, 0x93DD, 0x93DE, 0x93DF, 0x93E0, 0x93E1, 0x93E2, 0x93E3, 0x93E4, 0x93E5, 0x93E6, 0x93E7, 0x93E8, 0x93E9,
+ 0x93EA, 0x93EB, 0x93EC, 0x93ED, 0x93EE, 0x93EF, 0x93F0, 0x93F1, 0x93F2, 0x93F3, 0x93F4, 0x93F5, 0x93F6, 0x93F7, 0x93F8, 0x93F9,
+ 0x93FA, 0x93FB, 0x93FC, 0x93FD, 0x93FE, 0x93FF, 0x9400, 0x9401, 0x9402, 0x9403, 0x9404, 0x9405, 0x9406, 0x9407, 0x9408, 0x9409,
+ 0x940A, 0x940B, 0x940C, 0x940D, 0x940E, 0x940F, 0x9410, 0x9411, 0x9412, 0x9413, 0x9414, 0x9415, 0x9416, 0x9417, 0x9418, 0x9419,
+ 0x941A, 0x941B, 0x941C, 0x941D, 0x941E, 0x26AC, 0x26AE, 0x26B0, 0x26B2, 0x26B4, 0x26B6, 0x26B8, 0x26BA, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x941F, 0x9420, 0x9421, 0x9422, 0x9423, 0x9424, 0x9425, 0x9426, 0x9427, 0x9428, 0x9429, 0x942A, 0x942B, 0x942C, 0x942D,
+ 0x942E, 0x942F, 0x9430, 0x9431, 0x9432, 0x9433, 0x9434, 0x9435, 0x9436, 0x9437, 0x9438, 0x9439, 0x943A, 0x943B, 0x943C, 0x943D,
+ 0x943E, 0x943F, 0x9440, 0x9441, 0x9442, 0x9443, 0x9444, 0x9445, 0x9446, 0x9447, 0x9448, 0x9449, 0x944A, 0x944B, 0x944C, 0x944D,
+ 0x944E, 0x944F, 0x9450, 0x9451, 0x9452, 0x9453, 0x9454, 0x9455, 0x9456, 0x9457, 0x9458, 0x9459, 0x945A, 0x945B, 0x945C, 0x945D,
+ 0x945E, 0x945F, 0x9460, 0x9461, 0x9462, 0x9463, 0x9464, 0x9465, 0x9466, 0x9467, 0x9468, 0x9469, 0x946A, 0x946B, 0x946C, 0x946D,
+ 0x946E, 0x946F, 0x9470, 0x9471, 0x9472, 0x9473, 0x9474, 0x9475, 0x9476, 0x9477, 0x9478, 0x9479, 0x947A, 0x947B, 0x947C, 0x947D,
+ 0x947E, 0x947F, 0x9480, 0x9481, 0x9482, 0x9483, 0x9484, 0x9485, 0x9486, 0x9487, 0x9488, 0x9489, 0x948A, 0x948B, 0x948C, 0x948D,
+ 0x948E, 0x948F, 0x9490, 0x9491, 0x9492, 0x9493, 0x9494, 0x9495, 0x9496, 0x9497, 0x9498, 0x9499, 0x949A, 0x949B, 0x949C, 0x949D,
+ 0x949E, 0x949F, 0x94A0, 0x94A1, 0x94A2, 0x94A3, 0x94A4, 0x94A5, 0x94A6, 0x94A7, 0x94A8, 0x94A9, 0x94AA, 0x94AB, 0x94AC, 0x94AD,
+ 0x94AE, 0x94AF, 0x94B0, 0x94B1, 0x94B2, 0x94B3, 0x94B4, 0x94B5, 0x94B6, 0x94B7, 0x94B8, 0x94B9, 0x94BA, 0x94BB, 0x94BC, 0x94BD,
+ 0x94BE, 0x94BF, 0x94C0, 0x94C1, 0x94C2, 0x94C3, 0x94C4, 0x94C5, 0x94C6, 0x94C7, 0x94C8, 0x94C9, 0x94CA, 0x94CB, 0x94CC, 0x94CD,
+ 0x94CE, 0x94CF, 0x94D0, 0x94D1, 0x94D2, 0x94D3, 0x94D4, 0x94D5, 0x94D6, 0x94D7, 0x94D8, 0x94D9, 0x94DA, 0x94DB, 0x94DC, 0x0000,
+ 0x0000, 0x0000, 0x94DD, 0x94DE, 0x94DF, 0x94E0, 0x94E1, 0x94E2, 0x0000, 0x0000, 0x94E3, 0x94E4, 0x94E5, 0x94E6, 0x94E7, 0x94E8,
+ 0x0000, 0x0000, 0x94E9, 0x94EA, 0x94EB, 0x94EC, 0x94ED, 0x94EE, 0x0000, 0x0000, 0x94EF, 0x94F0, 0x94F1, 0x0000, 0x0000, 0x0000,
+ 0x94F2, 0x94F3, 0x94F4, 0x94F5, 0x94F6, 0x94F7, 0x94F8, 0x0000, 0x94F9, 0x94FA, 0x94FB, 0x94FC, 0x94FD, 0x94FE, 0x94FF, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+};
+extern const FX_WCHAR g_UnicodeData_Normalization_Map1[5376] = {
+ 0x0066, 0x0053, 0x0053, 0x0059, 0x0020, 0x0308, 0x0061, 0x0052, 0x0304, 0x0032, 0x0033, 0x0301, 0x03BC, 0x0327, 0x0031, 0x006F,
+ 0x0041, 0x0041, 0x0041, 0x0041, 0x0041, 0x0041, 0x0043, 0x0045, 0x0045, 0x0045, 0x0045, 0x0049, 0x0049, 0x0049, 0x0049, 0x0044,
+ 0x004E, 0x004F, 0x004F, 0x004F, 0x004F, 0x004F, 0x004F, 0x0055, 0x0055, 0x0055, 0x0055, 0x0059, 0x0061, 0x0061, 0x0061, 0x0061,
+ 0x0061, 0x0061, 0x0063, 0x0065, 0x0065, 0x0065, 0x0065, 0x0069, 0x0069, 0x0069, 0x0069, 0x006E, 0x006F, 0x006F, 0x006F, 0x006F,
+ 0x006F, 0x006F, 0x0075, 0x0075, 0x0075, 0x0075, 0x0079, 0x0079, 0x0041, 0x0061, 0x0041, 0x0061, 0x0041, 0x0061, 0x0043, 0x0063,
+ 0x0043, 0x0063, 0x0043, 0x0063, 0x0043, 0x0063, 0x0044, 0x0064, 0x0044, 0x0064, 0x0045, 0x0065, 0x0045, 0x0065, 0x0045, 0x0065,
+ 0x0045, 0x0065, 0x0045, 0x0065, 0x0047, 0x0067, 0x0047, 0x0067, 0x0047, 0x0067, 0x0047, 0x0067, 0x0048, 0x0068, 0x0048, 0x0068,
+ 0x0049, 0x0069, 0x0049, 0x0069, 0x0049, 0x0069, 0x0049, 0x0069, 0x0049, 0x004A, 0x006A, 0x004B, 0x006B, 0x004B, 0x004C, 0x006C,
+ 0x004C, 0x006C, 0x004C, 0x006C, 0x004C, 0x006C, 0x004C, 0x006C, 0x004E, 0x006E, 0x004E, 0x006E, 0x004E, 0x006E, 0x006E, 0x004F,
+ 0x006F, 0x004F, 0x006F, 0x004F, 0x006F, 0x0052, 0x0072, 0x0052, 0x0072, 0x0052, 0x0072, 0x0053, 0x0073, 0x0053, 0x0073, 0x0053,
+ 0x0073, 0x0053, 0x0073, 0x0054, 0x0074, 0x0054, 0x0074, 0x0054, 0x0074, 0x0055, 0x0075, 0x0055, 0x0075, 0x0055, 0x0075, 0x0055,
+ 0x0075, 0x0055, 0x0075, 0x0055, 0x0075, 0x0057, 0x0077, 0x0059, 0x0079, 0x0059, 0x005A, 0x007A, 0x005A, 0x007A, 0x005A, 0x007A,
+ 0x0073, 0x0062, 0x0042, 0x0042, 0x0062, 0x0043, 0x0063, 0x0044, 0x0044, 0x0044, 0x0064, 0x0045, 0x0045, 0x0046, 0x0066, 0x0047,
+ 0x0049, 0x004B, 0x006B, 0x006C, 0x004D, 0x004E, 0x006E, 0x004F, 0x004F, 0x006F, 0x0050, 0x0070, 0x0283, 0x0074, 0x0054, 0x0074,
+ 0x0054, 0x0055, 0x0075, 0x0056, 0x0059, 0x0079, 0x005A, 0x007A, 0x01B7, 0x0041, 0x0061, 0x0049, 0x0069, 0x004F, 0x006F, 0x0055,
+ 0x0075, 0x00DC, 0x00FC, 0x00DC, 0x00FC, 0x00DC, 0x00FC, 0x00DC, 0x00FC, 0x0065, 0x0041, 0x0061, 0x0041, 0x0061, 0x00C6, 0x00E6,
+ 0x0047, 0x0067, 0x0047, 0x0067, 0x004B, 0x006B, 0x004F, 0x006F, 0x01EA, 0x01EB, 0x01B7, 0x0292, 0x006A, 0x0047, 0x0067, 0x004E,
+ 0x006E, 0x0041, 0x0061, 0x00C6, 0x00E6, 0x00D8, 0x00F8, 0x0041, 0x0061, 0x0041, 0x0061, 0x0045, 0x0065, 0x0045, 0x0065, 0x0049,
+ 0x0069, 0x0049, 0x0069, 0x004F, 0x006F, 0x004F, 0x006F, 0x0052, 0x0072, 0x0052, 0x0072, 0x0055, 0x0075, 0x0055, 0x0075, 0x0053,
+ 0x0073, 0x0054, 0x0074, 0x0048, 0x0068, 0x004E, 0x0064, 0x005A, 0x007A, 0x0041, 0x0061, 0x0045, 0x0065, 0x00D6, 0x00F6, 0x00D5,
+ 0x00F5, 0x004F, 0x006F, 0x022E, 0x022F, 0x0059, 0x0079, 0x006C, 0x006E, 0x0074, 0x006A, 0x0041, 0x0043, 0x0063, 0x004C, 0x0054,
+ 0x0053, 0x005A, 0x0042, 0x0055, 0x0056, 0x0045, 0x0065, 0x004A, 0x006A, 0x0051, 0x0071, 0x0052, 0x0072, 0x0059, 0x0079, 0x0061,
+ 0x0251, 0x0062, 0x006F, 0x0063, 0x0064, 0x0064, 0x0065, 0x0259, 0x0065, 0x0065, 0x0065, 0x0065, 0x006A, 0x0067, 0x0067, 0x0047,
+ 0x0068, 0x0068, 0x0069, 0x0049, 0x006C, 0x006C, 0x006C, 0x006D, 0x006D, 0x006D, 0x006E, 0x006E, 0x006E, 0x006F, 0x0072, 0x0072,
+ 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0052, 0x0052, 0x0073, 0x006A, 0x0283, 0x0283, 0x0074, 0x0074, 0x0055, 0x0076, 0x0076,
+ 0x0077, 0x0079, 0x0059, 0x007A, 0x007A, 0x0292, 0x0043, 0x0042, 0x0065, 0x0047, 0x0048, 0x006A, 0x006B, 0x004C, 0x0071, 0x0068,
+ 0x0068, 0x0068, 0x0068, 0x006A, 0x0072, 0x0279, 0x027B, 0x0281, 0x0077, 0x0079, 0x0263, 0x006C, 0x0073, 0x0078, 0x0295, 0x0300,
+ 0x0301, 0x0313, 0x0308, 0x0061, 0x0065, 0x0069, 0x006F, 0x0075, 0x0063, 0x0064, 0x0068, 0x006D, 0x0072, 0x0074, 0x0076, 0x0078,
+ 0x02B9, 0x003B, 0x0020, 0x00A8, 0x0391, 0x00B7, 0x0395, 0x0397, 0x0399, 0x039F, 0x03A5, 0x03A9, 0x03CA, 0x0399, 0x03A5, 0x03B1,
+ 0x03B5, 0x03B7, 0x03B9, 0x03CB, 0x03B9, 0x03C5, 0x03BF, 0x03C5, 0x03C9, 0x03B2, 0x03B8, 0x03A5, 0x03D2, 0x03D2, 0x03C6, 0x03C0,
+ 0x03BA, 0x03C1, 0x03C2, 0x0398, 0x03B5, 0x03A3, 0x0415, 0x0415, 0x0413, 0x0406, 0x041A, 0x0418, 0x0423, 0x0418, 0x0438, 0x0435,
+ 0x0435, 0x0433, 0x0456, 0x043A, 0x0438, 0x0443, 0x0466, 0x0467, 0x046A, 0x046B, 0x0474, 0x0475, 0x0460, 0x0461, 0x0419, 0x0439,
+ 0x0420, 0x0440, 0x0413, 0x0433, 0x0413, 0x0433, 0x0413, 0x0433, 0x0416, 0x0436, 0x0417, 0x0437, 0x041A, 0x043A, 0x041A, 0x043A,
+ 0x041A, 0x043A, 0x041A, 0x043A, 0x041D, 0x043D, 0x041F, 0x043F, 0x0421, 0x0441, 0x0422, 0x0442, 0x04AE, 0x04AF, 0x0425, 0x0445,
+ 0x0427, 0x0447, 0x0427, 0x0447, 0x0416, 0x0436, 0x04BC, 0x04BD, 0x0416, 0x0436, 0x041A, 0x043A, 0x041B, 0x043B, 0x041D, 0x043D,
+ 0x041D, 0x043D, 0x041C, 0x043C, 0x0410, 0x0430, 0x0410, 0x0430, 0x0415, 0x0435, 0x04D8, 0x04D9, 0x0416, 0x0436, 0x0417, 0x0437,
+ 0x0418, 0x0438, 0x0418, 0x0438, 0x041E, 0x043E, 0x04E8, 0x04E9, 0x042D, 0x044D, 0x0423, 0x0443, 0x0423, 0x0443, 0x0423, 0x0443,
+ 0x0427, 0x0447, 0x0413, 0x0433, 0x042B, 0x044B, 0x0413, 0x0433, 0x0425, 0x0445, 0x0425, 0x0445, 0x0417, 0x0437, 0x041B, 0x043B,
+ 0x0F0B, 0x10DC, 0x0041, 0x00C6, 0x0042, 0x0042, 0x0044, 0x0045, 0x018E, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D,
+ 0x004E, 0x004F, 0x0222, 0x0050, 0x0052, 0x0054, 0x0055, 0x0057, 0x0061, 0x0250, 0x0251, 0x1D02, 0x0062, 0x0064, 0x0065, 0x0259,
+ 0x025B, 0x025C, 0x0067, 0x006B, 0x006D, 0x014B, 0x006F, 0x0254, 0x1D16, 0x1D17, 0x0070, 0x0074, 0x0075, 0x1D1D, 0x026F, 0x0076,
+ 0x1D25, 0x03B2, 0x03B3, 0x03B4, 0x03C6, 0x03C7, 0x0069, 0x0072, 0x0075, 0x0076, 0x03B2, 0x03B3, 0x03C1, 0x03C6, 0x03C7, 0x0062,
+ 0x0064, 0x0066, 0x006D, 0x006E, 0x0070, 0x0072, 0x0072, 0x0073, 0x0074, 0x007A, 0x0067, 0x043D, 0x004C, 0x0070, 0x0055, 0x028A,
+ 0x0062, 0x0064, 0x0066, 0x0067, 0x006B, 0x006C, 0x006D, 0x006E, 0x0070, 0x0072, 0x0073, 0x0283, 0x0076, 0x0078, 0x007A, 0x0061,
+ 0x0251, 0x0064, 0x0065, 0x0065, 0x0065, 0x0065, 0x0069, 0x0283, 0x0252, 0x0063, 0x0255, 0x00F0, 0x025C, 0x0066, 0x025F, 0x0261,
+ 0x0265, 0x0268, 0x0269, 0x026A, 0x1D7B, 0x029D, 0x026D, 0x1D85, 0x029F, 0x0271, 0x0270, 0x0272, 0x0273, 0x0274, 0x0275, 0x0278,
+ 0x0282, 0x0283, 0x01AB, 0x0289, 0x028A, 0x1D1C, 0x028B, 0x028C, 0x007A, 0x0290, 0x0291, 0x0292, 0x03B8, 0x0041, 0x0061, 0x0042,
+ 0x0062, 0x0042, 0x0062, 0x0042, 0x0062, 0x0043, 0x0063, 0x0044, 0x0064, 0x0044, 0x0064, 0x0044, 0x0064, 0x0044, 0x0064, 0x0044,
+ 0x0064, 0x0045, 0x0065, 0x0045, 0x0065, 0x0045, 0x0065, 0x0045, 0x0065, 0x0228, 0x0229, 0x0046, 0x0066, 0x0047, 0x0067, 0x0048,
+ 0x0068, 0x0048, 0x0068, 0x0048, 0x0068, 0x0048, 0x0068, 0x0048, 0x0068, 0x0049, 0x0069, 0x00CF, 0x00EF, 0x004B, 0x006B, 0x004B,
+ 0x006B, 0x004B, 0x006B, 0x004C, 0x006C, 0x004C, 0x006C, 0x004C, 0x006C, 0x004C, 0x006C, 0x004D, 0x006D, 0x004D, 0x006D, 0x004D,
+ 0x006D, 0x004E, 0x006E, 0x004E, 0x006E, 0x004E, 0x006E, 0x004E, 0x006E, 0x00D5, 0x00F5, 0x00D5, 0x00F5, 0x014C, 0x014D, 0x014C,
+ 0x014D, 0x0050, 0x0070, 0x0050, 0x0070, 0x0052, 0x0072, 0x0052, 0x0072, 0x0052, 0x0072, 0x0052, 0x0072, 0x0053, 0x0073, 0x0053,
+ 0x0073, 0x0053, 0x0073, 0x0053, 0x0073, 0x0053, 0x0073, 0x0054, 0x0074, 0x0054, 0x0074, 0x0054, 0x0074, 0x0054, 0x0074, 0x0055,
+ 0x0075, 0x0055, 0x0075, 0x0055, 0x0075, 0x0168, 0x0169, 0x016A, 0x016B, 0x0056, 0x0076, 0x0056, 0x0076, 0x0057, 0x0077, 0x0057,
+ 0x0077, 0x0057, 0x0077, 0x0057, 0x0077, 0x0057, 0x0077, 0x0058, 0x0078, 0x0058, 0x0078, 0x0059, 0x0079, 0x005A, 0x007A, 0x005A,
+ 0x007A, 0x005A, 0x007A, 0x0068, 0x0074, 0x0077, 0x0079, 0x0061, 0x017F, 0x0041, 0x0061, 0x0041, 0x0061, 0x0041, 0x0061, 0x0041,
+ 0x0061, 0x0041, 0x0061, 0x0041, 0x0061, 0x0041, 0x0061, 0x0041, 0x0061, 0x0041, 0x0061, 0x0041, 0x0061, 0x0041, 0x0061, 0x0041,
+ 0x0061, 0x0045, 0x0065, 0x0045, 0x0065, 0x0045, 0x0065, 0x0045, 0x0065, 0x0045, 0x0065, 0x0045, 0x0065, 0x0045, 0x0065, 0x0045,
+ 0x0065, 0x0049, 0x0069, 0x0049, 0x0069, 0x004F, 0x006F, 0x004F, 0x006F, 0x004F, 0x006F, 0x004F, 0x006F, 0x004F, 0x006F, 0x004F,
+ 0x006F, 0x004F, 0x006F, 0x004F, 0x006F, 0x004F, 0x006F, 0x004F, 0x006F, 0x004F, 0x006F, 0x004F, 0x006F, 0x0055, 0x0075, 0x0055,
+ 0x0075, 0x0055, 0x0075, 0x0055, 0x0075, 0x0055, 0x0075, 0x0055, 0x0075, 0x0055, 0x0075, 0x0059, 0x0079, 0x0059, 0x0079, 0x0059,
+ 0x0079, 0x0059, 0x0079, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x0391, 0x0391, 0x0391, 0x0391, 0x0391,
+ 0x0391, 0x0391, 0x0391, 0x03B5, 0x03B5, 0x03B5, 0x03B5, 0x03B5, 0x03B5, 0x0395, 0x0395, 0x0395, 0x0395, 0x0395, 0x0395, 0x03B7,
+ 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x0397, 0x0397, 0x0397, 0x0397, 0x0397, 0x0397, 0x0397, 0x0397, 0x03B9,
+ 0x03B9, 0x03B9, 0x03B9, 0x03B9, 0x03B9, 0x03B9, 0x03B9, 0x0399, 0x0399, 0x0399, 0x0399, 0x0399, 0x0399, 0x0399, 0x0399, 0x03BF,
+ 0x03BF, 0x03BF, 0x03BF, 0x03BF, 0x03BF, 0x039F, 0x039F, 0x039F, 0x039F, 0x039F, 0x039F, 0x03C5, 0x03C5, 0x03C5, 0x03C5, 0x03C5,
+ 0x03C5, 0x03C5, 0x03C5, 0x03A5, 0x03A5, 0x03A5, 0x03A5, 0x03C9, 0x03C9, 0x03C9, 0x03C9, 0x03C9, 0x03C9, 0x03C9, 0x03C9, 0x03A9,
+ 0x03A9, 0x03A9, 0x03A9, 0x03A9, 0x03A9, 0x03A9, 0x03A9, 0x03B1, 0x03B1, 0x03B5, 0x03B5, 0x03B7, 0x03B7, 0x03B9, 0x03B9, 0x03BF,
+ 0x03BF, 0x03C5, 0x03C5, 0x03C9, 0x03C9, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x0391, 0x0391, 0x0391,
+ 0x0391, 0x0391, 0x0391, 0x0391, 0x0391, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x0397, 0x0397, 0x0397,
+ 0x0397, 0x0397, 0x0397, 0x0397, 0x0397, 0x03C9, 0x03C9, 0x03C9, 0x03C9, 0x03C9, 0x03C9, 0x03C9, 0x03C9, 0x03A9, 0x03A9, 0x03A9,
+ 0x03A9, 0x03A9, 0x03A9, 0x03A9, 0x03A9, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x0391, 0x0391, 0x0391, 0x0391,
+ 0x0391, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x0395, 0x0395, 0x0397, 0x0397, 0x0397, 0x03B9, 0x03B9, 0x03B9, 0x03B9, 0x03B9,
+ 0x03B9, 0x0399, 0x0399, 0x0399, 0x0399, 0x03C5, 0x03C5, 0x03C5, 0x03C5, 0x03C1, 0x03C1, 0x03C5, 0x03C5, 0x03A5, 0x03A5, 0x03A5,
+ 0x03A5, 0x03A1, 0x03C9, 0x03C9, 0x03C9, 0x03C9, 0x03C9, 0x039F, 0x039F, 0x03A9, 0x03A9, 0x03A9, 0x00B4, 0x0314, 0x0020, 0x0020,
+ 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x2010, 0x0333, 0x002E, 0x0020, 0x0020, 0x0030, 0x0069,
+ 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x002B, 0x2212, 0x003D, 0x0028, 0x0029, 0x006E, 0x0030, 0x0031, 0x0032, 0x0033,
+ 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x002B, 0x2212, 0x003D, 0x0028, 0x0029, 0x0061, 0x0065, 0x006F, 0x0078, 0x0259,
+ 0x0043, 0x0190, 0x0067, 0x0048, 0x0048, 0x0048, 0x0068, 0x0068, 0x0049, 0x0049, 0x004C, 0x006C, 0x004E, 0x0050, 0x0051, 0x0052,
+ 0x0052, 0x0052, 0x0052, 0x0052, 0x0056, 0x005A, 0x03A9, 0x01B1, 0x005A, 0x004B, 0x00C5, 0x0042, 0x0043, 0x0065, 0x0065, 0x0045,
+ 0x0046, 0x004D, 0x006F, 0x05D0, 0x05D1, 0x05D2, 0x05D3, 0x0069, 0x03C0, 0x03B3, 0x0393, 0x03A0, 0x2211, 0x0044, 0x0064, 0x0065,
+ 0x0069, 0x006A, 0x0049, 0x0056, 0x0058, 0x004C, 0x0043, 0x0044, 0x004D, 0x0069, 0x0076, 0x0078, 0x006C, 0x0063, 0x0064, 0x006D,
+ 0x2203, 0x2208, 0x220B, 0x3008, 0x3009, 0x0062, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x0041,
+ 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051,
+ 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
+ 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
+ 0x0078, 0x0079, 0x007A, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x0030, 0x0031, 0x0032,
+ 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039,
+ 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x004C, 0x006C, 0x004C, 0x0050, 0x0052, 0x0061, 0x0074,
+ 0x0048, 0x0068, 0x004B, 0x006B, 0x005A, 0x007A, 0x0076, 0x0057, 0x0058, 0x0076, 0x006A, 0x0056, 0x2D61, 0x6BCD, 0x6C11, 0x864E,
+ 0x897F, 0x89D2, 0x957F, 0x9752, 0x98DF, 0x9AA8, 0x9B3C, 0x9EA6, 0x9EC4, 0x9F9F, 0x4E00, 0x4E28, 0x4E36, 0x4E3F, 0x4E59, 0x4E85,
+ 0x4E8C, 0x4EA0, 0x4EBA, 0x513F, 0x5165, 0x516B, 0x5182, 0x5196, 0x51AB, 0x51E0, 0x51F5, 0x5200, 0x529B, 0x52F9, 0x5315, 0x531A,
+ 0x5338, 0x5341, 0x535C, 0x5369, 0x5382, 0x53B6, 0x53C8, 0x53E3, 0x56D7, 0x571F, 0x58EB, 0x5902, 0x590A, 0x5915, 0x5927, 0x5973,
+ 0x5B50, 0x5B80, 0x5BF8, 0x5C0F, 0x5C22, 0x5C38, 0x5C6E, 0x5C71, 0x5DDB, 0x5DE5, 0x5DF1, 0x5DFE, 0x5E72, 0x5E7A, 0x5E7F, 0x5EF4,
+ 0x5EFE, 0x5F0B, 0x5F13, 0x5F50, 0x5F61, 0x5F73, 0x5FC3, 0x6208, 0x6236, 0x624B, 0x652F, 0x6534, 0x6587, 0x6597, 0x65A4, 0x65B9,
+ 0x65E0, 0x65E5, 0x66F0, 0x6708, 0x6728, 0x6B20, 0x6B62, 0x6B79, 0x6BB3, 0x6BCB, 0x6BD4, 0x6BDB, 0x6C0F, 0x6C14, 0x6C34, 0x706B,
+ 0x722A, 0x7236, 0x723B, 0x723F, 0x7247, 0x7259, 0x725B, 0x72AC, 0x7384, 0x7389, 0x74DC, 0x74E6, 0x7518, 0x751F, 0x7528, 0x7530,
+ 0x758B, 0x7592, 0x7676, 0x767D, 0x76AE, 0x76BF, 0x76EE, 0x77DB, 0x77E2, 0x77F3, 0x793A, 0x79B8, 0x79BE, 0x7A74, 0x7ACB, 0x7AF9,
+ 0x7C73, 0x7CF8, 0x7F36, 0x7F51, 0x7F8A, 0x7FBD, 0x8001, 0x800C, 0x8012, 0x8033, 0x807F, 0x8089, 0x81E3, 0x81EA, 0x81F3, 0x81FC,
+ 0x820C, 0x821B, 0x821F, 0x826E, 0x8272, 0x8278, 0x864D, 0x866B, 0x8840, 0x884C, 0x8863, 0x897E, 0x898B, 0x89D2, 0x8A00, 0x8C37,
+ 0x8C46, 0x8C55, 0x8C78, 0x8C9D, 0x8D64, 0x8D70, 0x8DB3, 0x8EAB, 0x8ECA, 0x8F9B, 0x8FB0, 0x8FB5, 0x9091, 0x9149, 0x91C6, 0x91CC,
+ 0x91D1, 0x9577, 0x9580, 0x961C, 0x96B6, 0x96B9, 0x96E8, 0x9751, 0x975E, 0x9762, 0x9769, 0x97CB, 0x97ED, 0x97F3, 0x9801, 0x98A8,
+ 0x98DB, 0x98DF, 0x9996, 0x9999, 0x99AC, 0x9AA8, 0x9AD8, 0x9ADF, 0x9B25, 0x9B2F, 0x9B32, 0x9B3C, 0x9B5A, 0x9CE5, 0x9E75, 0x9E7F,
+ 0x9EA5, 0x9EBB, 0x9EC3, 0x9ECD, 0x9ED1, 0x9EF9, 0x9EFD, 0x9F0E, 0x9F13, 0x9F20, 0x9F3B, 0x9F4A, 0x9F52, 0x9F8D, 0x9F9C, 0x9FA0,
+ 0x0020, 0x3012, 0x5341, 0x5344, 0x5345, 0x1100, 0x1101, 0x11AA, 0x1102, 0x11AC, 0x11AD, 0x1103, 0x1104, 0x1105, 0x11B0, 0x11B1,
+ 0x11B2, 0x11B3, 0x11B4, 0x11B5, 0x111A, 0x1106, 0x1107, 0x1108, 0x1121, 0x1109, 0x110A, 0x110B, 0x110C, 0x110D, 0x110E, 0x110F,
+ 0x1110, 0x1111, 0x1112, 0x1161, 0x1162, 0x1163, 0x1164, 0x1165, 0x1166, 0x1167, 0x1168, 0x1169, 0x116A, 0x116B, 0x116C, 0x116D,
+ 0x116E, 0x116F, 0x1170, 0x1171, 0x1172, 0x1173, 0x1174, 0x1175, 0x1160, 0x1114, 0x1115, 0x11C7, 0x11C8, 0x11CC, 0x11CE, 0x11D3,
+ 0x11D7, 0x11D9, 0x111C, 0x11DD, 0x11DF, 0x111D, 0x111E, 0x1120, 0x1122, 0x1123, 0x1127, 0x1129, 0x112B, 0x112C, 0x112D, 0x112E,
+ 0x112F, 0x1132, 0x1136, 0x1140, 0x1147, 0x114C, 0x11F1, 0x11F2, 0x1157, 0x1158, 0x1159, 0x1184, 0x1185, 0x1188, 0x1191, 0x1192,
+ 0x1194, 0x119E, 0x11A1, 0x4E00, 0x4E8C, 0x4E09, 0x56DB, 0x4E0A, 0x4E2D, 0x4E0B, 0x7532, 0x4E59, 0x4E19, 0x4E01, 0x5929, 0x5730,
+ 0x4EBA, 0x554F, 0x5E7C, 0x6587, 0x7B8F, 0x1100, 0x1102, 0x1103, 0x1105, 0x1106, 0x1107, 0x1109, 0x110B, 0x110C, 0x110E, 0x110F,
+ 0x1110, 0x1111, 0x1112, 0x4E00, 0x4E8C, 0x4E09, 0x56DB, 0x4E94, 0x516D, 0x4E03, 0x516B, 0x4E5D, 0x5341, 0x6708, 0x706B, 0x6C34,
+ 0x6728, 0x91D1, 0x571F, 0x65E5, 0x682A, 0x6709, 0x793E, 0x540D, 0x7279, 0x8CA1, 0x795D, 0x52B4, 0x79D8, 0x7537, 0x5973, 0x9069,
+ 0x512A, 0x5370, 0x6CE8, 0x9805, 0x4F11, 0x5199, 0x6B63, 0x4E0A, 0x4E2D, 0x4E0B, 0x5DE6, 0x53F3, 0x533B, 0x5B97, 0x5B66, 0x76E3,
+ 0x4F01, 0x8CC7, 0x5354, 0x591C, 0x30A2, 0x30A4, 0x30A6, 0x30A8, 0x30AA, 0x30AB, 0x30AD, 0x30AF, 0x30B1, 0x30B3, 0x30B5, 0x30B7,
+ 0x30B9, 0x30BB, 0x30BD, 0x30BF, 0x30C1, 0x30C4, 0x30C6, 0x30C8, 0x30CA, 0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF, 0x30D2, 0x30D5,
+ 0x30D8, 0x30DB, 0x30DE, 0x30DF, 0x30E0, 0x30E1, 0x30E2, 0x30E4, 0x30E6, 0x30E8, 0x30E9, 0x30EA, 0x30EB, 0x30EC, 0x30ED, 0x30EF,
+ 0x30F0, 0x30F1, 0x30F2, 0x4E22, 0x5E76, 0x5E7A, 0x5E72, 0x4E71, 0x4E98, 0x4E9A, 0x4F2B, 0x5E03, 0x5360, 0x6765, 0x4FA3, 0x4FE3,
+ 0x7CFB, 0x4FA0, 0x4F25, 0x4FE9, 0x4ED3, 0x4E2A, 0x4EEC, 0x4F26, 0x4F1F, 0x4FA7, 0x4FA6, 0x4F2A, 0x6770, 0x4F27, 0x4F1E, 0x5907,
+ 0x5BB6, 0x4F63, 0x506C, 0x4F20, 0x4F1B, 0x503A, 0x4F24, 0x503E, 0x507B, 0x4EC5, 0x4F65, 0x4FA8, 0x4EC6, 0x4FA5, 0x507E, 0x96C7,
+ 0x4EF7, 0x4EEA, 0x4FAC, 0x4EBF, 0x4FED, 0x50A7, 0x4FE6, 0x4FAA, 0x5C3D, 0x507F, 0x4F18, 0x50A8, 0x4FEA, 0x50A9, 0x50A5, 0x4FE8,
+ 0x51F6, 0x5151, 0x513F, 0x5156, 0x5185, 0x4E24, 0x518C, 0x80C4, 0x5199, 0x5E42, 0x51BB, 0x51DB, 0x51EF, 0x522B, 0x5220, 0x522D,
+ 0x5219, 0x5239, 0x521A, 0x5265, 0x5250, 0x5240, 0x521B, 0x522C, 0x5212, 0x5267, 0x5218, 0x523D, 0x523F, 0x5251, 0x5242, 0x52B2,
+ 0x52A8, 0x52D6, 0x52A1, 0x80DC, 0x52B3, 0x52BF, 0x52A2, 0x52CB, 0x52B1, 0x529D, 0x5300, 0x5326, 0x6C47, 0x532E, 0x533A, 0x534F,
+ 0x6064, 0x5374, 0x538D, 0x538C, 0x5389, 0x53A3, 0x53C2, 0x4E1B, 0x54A4, 0x5434, 0x5450, 0x5415, 0x5458, 0x55B1, 0x5457, 0x5FF5,
+ 0x95EE, 0x54D1, 0x542F, 0x5524, 0x4E27, 0x4E54, 0x5355, 0x54DF, 0x545B, 0x556C, 0x551D, 0x5417, 0x545C, 0x5522, 0x54D4, 0x53F9,
+ 0x55BD, 0x5455, 0x5567, 0x5C1D, 0x551B, 0x54D7, 0x5520, 0x5578, 0x53FD, 0x54D3, 0x5452, 0x5574, 0x6076, 0x5618, 0x549D, 0x54D2,
+ 0x54DD, 0x54D5, 0x55F3, 0x54D9, 0x55B7, 0x5428, 0x549B, 0x5413, 0x54DC, 0x5C1D, 0x565C, 0x556E, 0x5456, 0x5499, 0x4EB8, 0x55BE,
+ 0x4E25, 0x5624, 0x556D, 0x55EB, 0x56A3, 0x5181, 0x5453, 0x5570, 0x5631, 0x56F1, 0x56F5, 0x56FD, 0x56F4, 0x56ED, 0x5706, 0x56FE,
+ 0x56E2, 0x57AD, 0x6267, 0x575A, 0x57A9, 0x57DA, 0x5C27, 0x62A5, 0x573A, 0x5757, 0x8314, 0x57B2, 0x57D8, 0x6D82, 0x51A2, 0x575E,
+ 0x57D9, 0x5C18, 0x5811, 0x57AB, 0x5760, 0x5815, 0x575F, 0x57A6, 0x575B, 0x538B, 0x5792, 0x5739, 0x5786, 0x574F, 0x5785, 0x575C,
+ 0x575D, 0x58EE, 0x58F6, 0x58F8, 0x5BFF, 0x591F, 0x68A6, 0x4F19, 0x5939, 0x5942, 0x5965, 0x5941, 0x593A, 0x594B, 0x59F9, 0x5986,
+ 0x59D7, 0x5978, 0x5A31, 0x5A04, 0x5987, 0x5A05, 0x5A32, 0x59AB, 0x5AAA, 0x5988, 0x59AA, 0x59A9, 0x5A34, 0x5A73, 0x5A06, 0x5A75,
+ 0x5A07, 0x5AF1, 0x5AD2, 0x5B37, 0x5AD4, 0x5A74, 0x5A76, 0x5A08, 0x5B59, 0x5B66, 0x5B6A, 0x5BAB, 0x5BDD, 0x5B9E, 0x5B81, 0x5BA1,
+ 0x5199, 0x5BBD, 0x5BA0, 0x5B9D, 0x5C06, 0x4E13, 0x5BFB, 0x5BF9, 0x5BFC, 0x5C34, 0x5C4A, 0x5C38, 0x5C49, 0x5C61, 0x5C42, 0x5C5F,
+ 0x5C66, 0x5C5E, 0x5188, 0x5C98, 0x5C9B, 0x5CE1, 0x5D03, 0x5C97, 0x4ED1, 0x5CE5, 0x5C9A, 0x5D5D, 0x5D2D, 0x5C96, 0x5D5A, 0x5D02,
+ 0x5CE4, 0x5CE3, 0x5CC4, 0x5D04, 0x5C99, 0x5D58, 0x5CAD, 0x5C7F, 0x5CB3, 0x5CBF, 0x5CE6, 0x5DC5, 0x5DEF, 0x5E05, 0x5E08, 0x5E10,
+ 0x5E26, 0x5E27, 0x5E0F, 0x5E3C, 0x5E3B, 0x5E1C, 0x5E01, 0x5E2E, 0x5E31, 0x5E72, 0x51E0, 0x5E93, 0x5395, 0x53A2, 0x53A6, 0x53A8,
+ 0x53AE, 0x5E99, 0x5382, 0x5E91, 0x5E9F, 0x5E7F, 0x5EEA, 0x5E90, 0x5385, 0x5F11, 0x5F2A, 0x5F20, 0x5F3A, 0x5F39, 0x5F25, 0x5F2F,
+ 0x5F66, 0x540E, 0x5F84, 0x4ECE, 0x5F95, 0x590D, 0x5F81, 0x5F7B, 0x6052, 0x803B, 0x60A6, 0x6005, 0x95F7, 0x6076, 0x607C, 0x607D,
+ 0x607B, 0x7231, 0x60EC, 0x60AB, 0x6006, 0x607A, 0x5FFE, 0x6001, 0x6120, 0x60E8, 0x60ED, 0x6078, 0x60EF, 0x6004, 0x6002, 0x8651,
+ 0x60AD, 0x5E86, 0x5FE7, 0x60EB, 0x601C, 0x51ED, 0x6126, 0x616D, 0x60EE, 0x6124, 0x60AF, 0x6003, 0x5BAA, 0x5FC6, 0x6073, 0x5E94,
+ 0x603F, 0x61D4, 0x603C, 0x61D1, 0x6079, 0x60E9, 0x61D2, 0x6000, 0x60AC, 0x5FCF, 0x60E7, 0x6151, 0x604B, 0x6206, 0x620B, 0x6217,
+ 0x622C, 0x6218, 0x620F, 0x6237, 0x629B, 0x631F, 0x820D, 0x626A, 0x5377, 0x626B, 0x62A1, 0x6323, 0x6302, 0x91C7, 0x62E3, 0x626C,
+ 0x6362, 0x6325, 0x635F, 0x6447, 0x6363, 0x62A2, 0x63B4, 0x63BC, 0x6402, 0x631A, 0x62A0, 0x629F, 0x63BA, 0x635E, 0x6491, 0x6320,
+ 0x6322, 0x63B8, 0x62E8, 0x629A, 0x6251, 0x63FF, 0x631E, 0x631D, 0x6361, 0x62E5, 0x63B3, 0x62E9, 0x51FB, 0x6321, 0x62C5, 0x636E,
+ 0x6324, 0x62DF, 0x6448, 0x62E7, 0x6401, 0x63B7, 0x6269, 0x64B7, 0x6446, 0x64DE, 0x64B8, 0x6270, 0x6445, 0x64B5, 0x62E2, 0x62E6,
+ 0x6484, 0x6400, 0x64BA, 0x643A, 0x6444, 0x6512, 0x631B, 0x644A, 0x6405, 0x63FD, 0x668B, 0x8D25, 0x53D9, 0x654C, 0x6570, 0x655B,
+ 0x6BD9, 0x6593, 0x65A9, 0x65AD, 0x4E8E, 0x5347, 0x65F6, 0x664B, 0x663C, 0x6655, 0x6656, 0x65F8, 0x7545, 0x6682, 0x6635, 0x6654,
+ 0x5386, 0x6619, 0x6653, 0x66A7, 0x65F7, 0x663D, 0x6652, 0x4E66, 0x4F1A, 0x80E7, 0x4E1C, 0x6805, 0x6746, 0x6800, 0x67A7, 0x6761,
+ 0x67AD, 0x5F03, 0x67A8, 0x67A3, 0x680B, 0x6808, 0x6816, 0x6860, 0x6768, 0x67AB, 0x6862, 0x4E1A, 0x6781, 0x6769, 0x8363, 0x6864,
+ 0x6784, 0x67AA, 0x6760, 0x68BF, 0x6920, 0x6901, 0x6868, 0x6869, 0x4E50, 0x679E, 0x697C, 0x6807, 0x67A2, 0x6837, 0x6734, 0x6811,
+ 0x6866, 0x6861, 0x6865, 0x673A, 0x692D, 0x6A2A, 0x6AA9, 0x69DC, 0x67FD, 0x6863, 0x6867, 0x69DA, 0x68C0, 0x6A2F, 0x68BC, 0x53F0,
+ 0x69DF, 0x67E0, 0x69DB, 0x82D8, 0x67DC, 0x6A79, 0x6988, 0x6809, 0x691F, 0x6A7C, 0x680E, 0x6A71, 0x69E0, 0x680C, 0x67A5, 0x6A65,
+ 0x6987, 0x680A, 0x6989, 0x68C2, 0x6A31, 0x680F, 0x6743, 0x6924, 0x683E, 0x6984, 0x94A6, 0x6B27, 0x6B24, 0x6B22, 0x5C81, 0x5386,
+ 0x5F52, 0x6B81, 0x6B8B, 0x6B92, 0x6B87, 0x6B9A, 0x6B93, 0x6BA1, 0x6B7C, 0x6740, 0x58F3, 0x6BC1, 0x6BB4, 0x6BF5, 0x6BE1, 0x6C07,
+ 0x6C14, 0x6C22, 0x6C29, 0x6C32, 0x51FC, 0x51B3, 0x51B1, 0x6CA1, 0x51B5, 0x6CC4, 0x6C79, 0x6D43, 0x6CFE, 0x51C9, 0x51C4, 0x6CEA,
+ 0x6E0C, 0x51C0, 0x6CA6, 0x6E0A, 0x6D9E, 0x6D45, 0x6DA3, 0x51CF, 0x6CA8, 0x6DA1, 0x6D4B, 0x6D51, 0x51D1, 0x6D48, 0x6D8C, 0x6D07,
+ 0x6C64, 0x6CA9, 0x51C6, 0x6C9F, 0x6E29, 0x6DA2, 0x6E7F, 0x6CA7, 0x706D, 0x6DA4, 0x8365, 0x6CAA, 0x6EDE, 0x6E17, 0x6D52, 0x6D50,
+ 0x6EDA, 0x6EE1, 0x6E14, 0x6E87, 0x6CA4, 0x6C49, 0x6D9F, 0x6E0D, 0x6DA8, 0x6E10, 0x6D46, 0x988D, 0x6CFC, 0x6D01, 0x6F5C, 0x6DA6,
+ 0x6D54, 0x6E83, 0x6DA0, 0x6DA9, 0x6D47, 0x6D9D, 0x6C84, 0x6DA7, 0x6E11, 0x6CFD, 0x6EEA, 0x6CF6, 0x6D4D, 0x6D4A, 0x6D53, 0x6E7F,
+ 0x6CDE, 0x6D4E, 0x6D9B, 0x6EE5, 0x6F4D, 0x6EE8, 0x6E85, 0x6CFA, 0x6EE4, 0x6EE2, 0x6E0E, 0x6CFB, 0x6D4F, 0x6FD2, 0x6CF8, 0x6CA5,
+ 0x6F47, 0x6F46, 0x6F74, 0x6CF7, 0x6FD1, 0x6F4B, 0x6F9C, 0x6CA3, 0x6EE0, 0x6D12, 0x6EE9, 0x704F, 0x6E7E, 0x6EE6, 0x6EDF, 0x707E,
+ 0x4E3A, 0x4E4C, 0x70C3, 0x65E0, 0x70BC, 0x709C, 0x70DF, 0x8315, 0x7115, 0x70E6, 0x7080, 0x8367, 0x709D, 0x70ED, 0x70BD, 0x70E8,
+ 0x706F, 0x7096, 0x70E7, 0x70EB, 0x7116, 0x8425, 0x707F, 0x70DB, 0x70E9, 0x70EC, 0x7118, 0x70C1, 0x7089, 0x70C2, 0x4E89, 0x4E3A,
+ 0x7237, 0x5C14, 0x5899, 0x724D, 0x7275, 0x8366, 0x7266, 0x728A, 0x727A, 0x72B6, 0x72ED, 0x72C8, 0x72F0, 0x72B9, 0x72F2, 0x72B8,
+ 0x72F1, 0x72EE, 0x5956, 0x72EC, 0x72EF, 0x7303, 0x72DE, 0x83B7, 0x730E, 0x72B7, 0x517D, 0x736D, 0x732E, 0x7315, 0x7321, 0x73B0,
+ 0x73D0, 0x73F2, 0x73AE, 0x739A, 0x7410, 0x7476, 0x83B9, 0x739B, 0x7405, 0x73B1, 0x740F, 0x740E, 0x7391, 0x7477, 0x73F0, 0x73AF,
+ 0x7399, 0x73BA, 0x743C, 0x73D1, 0x748E, 0x74D2, 0x74EF, 0x74EE, 0x4EA7, 0x4EA7, 0x4EA9, 0x6BD5, 0x753B, 0x7572, 0x5F02, 0x5F53,
+ 0x7574, 0x53E0, 0x75C9, 0x9178, 0x75F9, 0x75D6, 0x75AF, 0x75A1, 0x75EA, 0x7617, 0x75AE, 0x759F, 0x75AD, 0x7618, 0x7597, 0x75E8,
+ 0x75EB, 0x7605, 0x75A0, 0x762A, 0x75D2, 0x7596, 0x75AC, 0x765E, 0x7663, 0x763F, 0x763E, 0x75C8, 0x762B, 0x766B, 0x53D1, 0x7691,
+ 0x75B1, 0x76B2, 0x76B1, 0x676F, 0x76D7, 0x76CF, 0x5C3D, 0x76D1, 0x76D8, 0x5362, 0x8361, 0x7726, 0x4F17, 0x56F0, 0x7741, 0x7750,
+ 0x772F, 0x7792, 0x4E86, 0x7786, 0x7751, 0x772C, 0x77A9, 0x77EB, 0x7845, 0x70AE, 0x7841, 0x7856, 0x7817, 0x781A, 0x7855, 0x7800,
+ 0x786E, 0x7801, 0x7859, 0x7816, 0x789C, 0x789B, 0x77F6, 0x7857, 0x785A, 0x7840, 0x788D, 0x77FF, 0x783A, 0x783E, 0x77FE, 0x783B,
+ 0x7984, 0x7978, 0x796F, 0x794E, 0x5FA1, 0x7985, 0x793C, 0x7977, 0x79C3, 0x7C7C, 0x7A0E, 0x79C6, 0x68F1, 0x79CD, 0x79F0, 0x7A23,
+ 0x79EF, 0x9896, 0x79FE, 0x7A51, 0x79FD, 0x7A33, 0x7A9D, 0x6D3C, 0x7A77, 0x7A91, 0x7A8E, 0x7AAD, 0x7AA5, 0x7A9C, 0x7A8D, 0x7AA6,
+ 0x7A83, 0x7ADE, 0x7B14, 0x7B0B, 0x7B15, 0x7B3A, 0x7B5D, 0x8282, 0x8303, 0x7B51, 0x7BA7, 0x7B7C, 0x7B03, 0x7B5B, 0x7B5A, 0x7BA6,
+ 0x7BD3, 0x7BAA, 0x7B80, 0x7BD1, 0x7BAB, 0x6A90, 0x7B5C, 0x7B7E, 0x5E18, 0x7BEE, 0x7B79, 0x7B93, 0x7BEF, 0x7BA8, 0x7C41, 0x7B3C,
+ 0x7B7E, 0x7B3E, 0x7BF1, 0x7BA9, 0x5401, 0x5986, 0x7CA4, 0x7CC1, 0x7CAA, 0x7CAE, 0x7CF5, 0x7C9D, 0x7C74, 0x7C9C, 0x7EA0, 0x7EAA,
+ 0x7EA3, 0x7EA6, 0x7EA2, 0x7EA1, 0x7EA5, 0x7EA8, 0x7EAB, 0x7EB9, 0x7EB3, 0x7EBD, 0x7EBE, 0x7EAF, 0x7EB0, 0x7EB1, 0x7EB8, 0x7EA7,
+ 0x7EB7, 0x7EAD, 0x7EB4, 0x7EBA, 0x624E, 0x624E, 0x7EC6, 0x7EC2, 0x7EC1, 0x7EC5, 0x7EBB, 0x7ECD, 0x7EC0, 0x7ECB, 0x7ED0, 0x7ECC,
+ 0x7EC8, 0x5F26, 0x7EC4, 0x7ECA, 0x7ED7, 0x7ED3, 0x7EDD, 0x7EE6, 0x7ED4, 0x7EDE, 0x7EDC, 0x7EDA, 0x7ED9, 0x7ED2, 0x7ED6, 0x7EDF,
+ 0x4E1D, 0x7EDB, 0x7EE2, 0x7ED1, 0x7EE1, 0x7EE0, 0x7EE8, 0x7EE5, 0x7ECF, 0x7EFC, 0x7F0D, 0x7EFF, 0x7EF8, 0x7EFB, 0x7EF6, 0x7EF4,
+ 0x7EFE, 0x7EB2, 0x7F51, 0x7F00, 0x7EB6, 0x7EFA, 0x7EEE, 0x7EFD, 0x7EF0, 0x7EEB, 0x7EF5, 0x7EF2, 0x7F01, 0x7D27, 0x7EEF, 0x7EEA,
+ 0x7F03, 0x7F04, 0x7F02, 0x7EBF, 0x7F09, 0x7F0E, 0x7F14, 0x7F17, 0x7F18, 0x7F0C, 0x7F16, 0x7F13, 0x7F05, 0x7EAC, 0x7F11, 0x7F08,
+ 0x7EC3, 0x7F0F, 0x7F07, 0x81F4, 0x8426, 0x7F19, 0x7F22, 0x7F12, 0x7EC9, 0x7F23, 0x7F1E, 0x7F1A, 0x7F1C, 0x7F1F, 0x7F1B, 0x53BF,
+ 0x7F1D, 0x7F29, 0x7EB5, 0x7F27, 0x7F26, 0x7D77, 0x7F15, 0x7F25, 0x603B, 0x7EE9, 0x7EF7, 0x7F2B, 0x7F2A, 0x7F2F, 0x7EC7, 0x7F2E,
+ 0x7F2D, 0x7ED5, 0x7EE3, 0x7F0B, 0x7EF3, 0x7ED8, 0x7CFB, 0x8327, 0x7F33, 0x7F32, 0x7F34, 0x7ECE, 0x7EE7, 0x7F24, 0x7F31, 0x7F2C,
+ 0x7EA9, 0x7EED, 0x7F20, 0x7F28, 0x7EA4, 0x7F35, 0x7F06, 0x94B5, 0x7F42, 0x7F5A, 0x9A82, 0x7F62, 0x7F57, 0x7F74, 0x7F81, 0x8288,
+ 0x7F9F, 0x7FA1, 0x4E49, 0x81BB, 0x4E60, 0x7FC6, 0x7FDA, 0x7FD8, 0x7FD9, 0x8027, 0x5723, 0x95FB, 0x8054, 0x806A, 0x58F0, 0x8038,
+ 0x8069, 0x8042, 0x804C, 0x804D, 0x542C, 0x804B, 0x8083, 0x80C1, 0x8109, 0x80EB, 0x8131, 0x80C0, 0x80BE, 0x80E8, 0x8136, 0x8111,
+ 0x80BF, 0x811A, 0x80A0, 0x817D, 0x8158, 0x80A4, 0x80F6, 0x817B, 0x80C6, 0x810D, 0x8113, 0x8138, 0x8110, 0x8191, 0x814A, 0x80EA,
+ 0x810F, 0x8114, 0x81DC, 0x5367, 0x4E34, 0x53F0, 0x4E0E, 0x5174, 0x4E3E, 0x65E7, 0x8231, 0x8223, 0x8230, 0x823B, 0x8270, 0x8273,
+ 0x82C4, 0x520D, 0x82CE, 0x5179, 0x8346, 0x8C46, 0x5E84, 0x830E, 0x835A, 0x82CB, 0x534E, 0x70DF, 0x82CC, 0x83B1, 0x4E07, 0x83B4,
+ 0x53F6, 0x836D, 0x7740, 0x82C7, 0x8364, 0x641C, 0x83B3, 0x8385, 0x82CD, 0x836A, 0x76D6, 0x83B2, 0x82C1, 0x83BC, 0x835C, 0x848C,
+ 0x848B, 0x8471, 0x8311, 0x836B, 0x8368, 0x8487, 0x835E, 0x836C, 0x83B8, 0x835B, 0x8489, 0x829C, 0x8427, 0x84E3, 0x835F, 0x84DF,
+ 0x8297, 0x59DC, 0x8537, 0x83B6, 0x8350, 0x8428, 0x8360, 0x501F, 0x84DD, 0x8369, 0x827A, 0x836F, 0x85AE, 0x82C8, 0x853C, 0x853A,
+ 0x841A, 0x8572, 0x82A6, 0x82CF, 0x8574, 0x82F9, 0x8616, 0x85D3, 0x8539, 0x830F, 0x5170, 0x84E0, 0x841D, 0x5904, 0x865A, 0x864F,
+ 0x53F7, 0x4E8F, 0x866C, 0x86F1, 0x8715, 0x86AC, 0x8680, 0x732C, 0x867E, 0x8671, 0x8717, 0x86F3, 0x8682, 0x8424, 0x877C, 0x8780,
+ 0x86F0, 0x8748, 0x87A8, 0x866E, 0x8749, 0x86F2, 0x866B, 0x86CF, 0x8681, 0x8683, 0x8747, 0x867F, 0x874E, 0x86F4, 0x877E, 0x869D,
+ 0x8721, 0x86CE, 0x87CF, 0x86CA, 0x8695, 0x86EE, 0x4F17, 0x672F, 0x536B, 0x51B2, 0x886E, 0x8885, 0x8865, 0x88C5, 0x91CC, 0x5236,
+ 0x590D, 0x88C8, 0x8886, 0x88E4, 0x88E2, 0x7F21, 0x891B, 0x4EB5, 0x88E5, 0x8884, 0x88E3, 0x88C6, 0x8934, 0x889C, 0x886C, 0x88AD,
+ 0x8955, 0x89C1, 0x89C4, 0x89C5, 0x89C6, 0x89C7, 0x89CB, 0x89CD, 0x89CE, 0x4EB2, 0x89CA, 0x89CF, 0x89D0, 0x89D1, 0x89C9, 0x89C8,
+ 0x89CC, 0x89C2, 0x89DE, 0x89EF, 0x89E6, 0x8BA2, 0x8BA3, 0x8BA1, 0x8BAF, 0x8BA7, 0x8BA8, 0x8BA6, 0x8BAD, 0x8BAA, 0x8BAB, 0x8BAC,
+ 0x8BB0, 0x8BB9, 0x8BB6, 0x8BBC, 0x8BC0, 0x8BB7, 0x8BBF, 0x8BBE, 0x8BB8, 0x8BC9, 0x8BC3, 0x8BCA, 0x8BC1, 0x8BC2, 0x8BCB, 0x8BB5,
+ 0x8BC8, 0x8BD2, 0x8BCF, 0x8BC4, 0x8BCE, 0x8BC5, 0x8BCD, 0x548F, 0x8BE9, 0x8BE2, 0x8BE3, 0x8BD5, 0x8BD7, 0x8BE7, 0x8BDF, 0x8BE1,
+ 0x8BE0, 0x8BD8, 0x8BDD, 0x8BE5, 0x8BE6, 0x8BDC, 0x8BD9, 0x8BD6, 0x8BD4, 0x8BDB, 0x8BD3, 0x5938, 0x5FD7, 0x8BA4, 0x8BF3, 0x8BF6,
+ 0x8BDE, 0x8BF1, 0x8BEE, 0x8BED, 0x8BDA, 0x8BEB, 0x8BEC, 0x8BEF, 0x8BF0, 0x8BF5, 0x8BF2, 0x8BF4, 0x8C01, 0x8BFE, 0x8C07, 0x8BFD,
+ 0x8C0A, 0x8C03, 0x8C04, 0x8C06, 0x8C08, 0x8BFF, 0x8BF7, 0x8BE4, 0x8BF9, 0x8BFC, 0x8C05, 0x8BBA, 0x8C02, 0x8C00, 0x8C0D, 0x8C1E,
+ 0x8C1D, 0x8C25, 0x8BE8, 0x8C14, 0x8C1B, 0x8C10, 0x8C0F, 0x8C15, 0x8C18, 0x8BB3, 0x8C19, 0x8C0C, 0x8BBD, 0x8BF8, 0x8C1A, 0x8C16,
+ 0x8BFA, 0x8C0B, 0x8C12, 0x8C13, 0x8A8A, 0x8BCC, 0x8C0E, 0x8C1C, 0x8C27, 0x8C11, 0x8C21, 0x8C24, 0x8C26, 0x8BB2, 0x8C22, 0x8C23,
+ 0x8C1F, 0x8C2A, 0x8C2C, 0x8BB4, 0x8C28, 0x8C29, 0x8BC1, 0x8C32, 0x8BA5, 0x8C2E, 0x8BC6, 0x8C2F, 0x8C2D, 0x8C31, 0x8C35, 0x8BD1,
+ 0x8BAE, 0x8C34, 0x62A4, 0x8BEA, 0x8A89, 0x8C2B, 0x8BFB, 0x53D8, 0x8A5F, 0x96E0, 0x8C17, 0x8BA9, 0x8C30, 0x8C36, 0x8D5E, 0x8C20,
+ 0x8C33, 0x5C82, 0x7AD6, 0x4E30, 0x732A, 0x8C6E, 0x732B, 0x8D1D, 0x8D1E, 0x8D1F, 0x8D22, 0x8D21, 0x8D2B, 0x8D27, 0x8D29, 0x8D2A,
+ 0x8D2F, 0x8D23, 0x8D2E, 0x8D33, 0x8D40, 0x8D30, 0x8D35, 0x8D2C, 0x4E70, 0x8D37, 0x8D36, 0x8D39, 0x8D34, 0x8D3B, 0x8D38, 0x8D3A,
+ 0x8D32, 0x8D42, 0x8D41, 0x8D3F, 0x8D45, 0x8D44, 0x8D3E, 0x8D3C, 0x8D48, 0x8D4A, 0x5BBE, 0x8D47, 0x8D52, 0x8D49, 0x8D50, 0x8D4F,
+ 0x8D54, 0x8D53, 0x8D24, 0x5356, 0x8D31, 0x8D4B, 0x8D55, 0x8D28, 0x8D26, 0x8D4C, 0x8D56, 0x8D57, 0x8D5A, 0x8D59, 0x8D2D, 0x8D5B,
+ 0x8D5C, 0x8D3D, 0x8D58, 0x8D5F, 0x8D60, 0x8D5E, 0x8D61, 0x8D62, 0x8D46, 0x8D43, 0x8D51, 0x8D4E, 0x8D5D, 0x8D63, 0x8D6A, 0x8D76,
+ 0x8D75, 0x8D8B, 0x8DB1, 0x8FF9, 0x8DF5, 0x8E0A, 0x8DC4, 0x8DF8, 0x8DD6, 0x8E52, 0x8DF7, 0x8DF6, 0x8DB8, 0x8E0C, 0x8DFB, 0x8DC3,
+ 0x8E2F, 0x8DDE, 0x8E2C, 0x8E70, 0x8DF9, 0x8E51, 0x8E7F, 0x8E9C, 0x8E8F, 0x8EAF, 0x8F66, 0x8F67, 0x8F68, 0x519B, 0x8F69, 0x8F6B,
+ 0x8F6D, 0x8F6F, 0x8F78, 0x8F71, 0x8F74, 0x8F75, 0x8F7A, 0x8F72, 0x8F76, 0x8F7C, 0x8F83, 0x8F82, 0x8F81, 0x8F80, 0x8F7D, 0x8F7E,
+ 0x8F84, 0x8F85, 0x8F7B, 0x8F86, 0x8F8E, 0x8F89, 0x8F8B, 0x8F8D, 0x8F8A, 0x8F87, 0x8F88, 0x8F6E, 0x8F91, 0x8F8F, 0x8F93, 0x8F90,
+ 0x8F97, 0x8206, 0x8F92, 0x6BC2, 0x8F96, 0x8F95, 0x8F98, 0x8F6C, 0x8F99, 0x8F7F, 0x8F9A, 0x8F70, 0x8F94, 0x8F79, 0x8F73, 0x529E,
+ 0x8F9E, 0x8FAB, 0x8FA9, 0x519C, 0x8FD9, 0x8FDE, 0x5468, 0x8FDB, 0x6E38, 0x8FD0, 0x8FC7, 0x8FBE, 0x8FDD, 0x9065, 0x900A, 0x9012,
+ 0x8FDC, 0x9002, 0x8FDF, 0x8FC1, 0x9009, 0x9057, 0x8FBD, 0x8FC8, 0x8FD8, 0x8FE9, 0x8FB9, 0x903B, 0x9026, 0x90CF, 0x90AE, 0x90D3,
+ 0x4E61, 0x90B9, 0x90AC, 0x90E7, 0x9093, 0x90D1, 0x90BB, 0x90F8, 0x90BA, 0x90D0, 0x909D, 0x9142, 0x90E6, 0x814C, 0x4E11, 0x915D,
+ 0x533B, 0x9171, 0x9166, 0x917F, 0x8845, 0x917E, 0x917D, 0x91CA, 0x9487, 0x948C, 0x948A, 0x9489, 0x948B, 0x9488, 0x9493, 0x9490,
+ 0x948F, 0x9492, 0x948E, 0x9497, 0x948D, 0x9495, 0x94AF, 0x94AB, 0x9498, 0x94AD, 0x94A0, 0x949D, 0x94A4, 0x94A3, 0x949E, 0x94AE,
+ 0x94A7, 0x9499, 0x949B, 0x94AA, 0x94CC, 0x94C8, 0x94B6, 0x94C3, 0x94B4, 0x94B9, 0x94CD, 0x94B0, 0x94B8, 0x94C0, 0x94BF, 0x94BE,
+ 0x949C, 0x94CA, 0x94C9, 0x94C7, 0x94CB, 0x94C2, 0x94B3, 0x94C6, 0x94C5, 0x94BA, 0x94A9, 0x94B2, 0x94BC, 0x94BD, 0x94CF, 0x94F0,
+ 0x94D2, 0x94EC, 0x94EA, 0x94F6, 0x94F3, 0x94DC, 0x94DA, 0x94E3, 0x94E8, 0x94E2, 0x94ED, 0x94EB, 0x94E6, 0x8854, 0x94D1, 0x94F7,
+ 0x94F1, 0x94DF, 0x94F5, 0x94D5, 0x94EF, 0x94D0, 0x9510, 0x9500, 0x9508, 0x9511, 0x9509, 0x94DD, 0x9512, 0x950C, 0x94A1, 0x94E4,
+ 0x94D7, 0x950B, 0x950A, 0x9513, 0x9504, 0x9503, 0x9514, 0x9507, 0x94D3, 0x94FA, 0x94D6, 0x9506, 0x9502, 0x952F, 0x94A2, 0x951E,
+ 0x5F55, 0x9516, 0x9529, 0x94D4, 0x9525, 0x9515, 0x951F, 0x9524, 0x9531, 0x94EE, 0x951B, 0x952C, 0x952D, 0x951C, 0x94B1, 0x9526,
+ 0x951A, 0x9520, 0x9521, 0x9522, 0x9519, 0x9530, 0x8868, 0x94FC, 0x9528, 0x9494, 0x9534, 0x94FE, 0x9505, 0x9540, 0x9537, 0x94E1,
+ 0x9496, 0x953B, 0x953D, 0x9538, 0x9532, 0x9539, 0x953E, 0x952E, 0x9536, 0x9517, 0x953A, 0x9541, 0x9551, 0x9555, 0x9501, 0x9549,
+ 0x9548, 0x9543, 0x94A8, 0x84E5, 0x954F, 0x94E0, 0x94E9, 0x953C, 0x9550, 0x9547, 0x9552, 0x954D, 0x9553, 0x955E, 0x955F, 0x94FE,
+ 0x9546, 0x9559, 0x9560, 0x955D, 0x94FF, 0x9535, 0x9557, 0x9558, 0x955B, 0x94F2, 0x955C, 0x9556, 0x9542, 0x933E, 0x955A, 0x94E7,
+ 0x956A, 0x9508, 0x94D9, 0x9563, 0x9566, 0x9561, 0x949F, 0x956B, 0x950F, 0x9544, 0x954C, 0x9570, 0x956F, 0x956D, 0x94C1, 0x956E,
+ 0x94CE, 0x94DB, 0x9571, 0x94F8, 0x956C, 0x9554, 0x9274, 0x9527, 0x9574, 0x94C4, 0x9573, 0x9567, 0x94A5, 0x9575, 0x9576, 0x954A,
+ 0x9569, 0x9523, 0x94BB, 0x92AE, 0x51FF, 0x957F, 0x95E8, 0x95E9, 0x95EA, 0x95EB, 0x95EC, 0x95ED, 0x5F00, 0x95F6, 0x95F3, 0x95F0,
+ 0x95F2, 0x95F4, 0x95F5, 0x95F8, 0x9602, 0x9601, 0x9600, 0x95FA, 0x95FD, 0x9603, 0x9606, 0x95FE, 0x9605, 0x960A, 0x9609, 0x960E,
+ 0x960F, 0x960D, 0x9608, 0x960C, 0x9612, 0x677F, 0x6697, 0x95F1, 0x9614, 0x9615, 0x9611, 0x9617, 0x9618, 0x95FF, 0x9616, 0x9619,
+ 0x95EF, 0x5173, 0x961A, 0x9613, 0x9610, 0x8F9F, 0x961B, 0x95FC, 0x9649, 0x9655, 0x9635, 0x9634, 0x9648, 0x9646, 0x9633, 0x9667,
+ 0x961F, 0x9636, 0x9668, 0x9645, 0x968F, 0x9669, 0x9690, 0x9647, 0x96B6, 0x53EA, 0x96BD, 0x867D, 0x53CC, 0x96CF, 0x6742, 0x9E21,
+ 0x79BB, 0x96BE, 0x4E91, 0x7535, 0x9721, 0x96FE, 0x9701, 0x96F3, 0x972D, 0x53C7, 0x7075, 0x53C6, 0x9753, 0x9759, 0x817C, 0x9765,
+ 0x9F17, 0x5DE9, 0x979F, 0x7F30, 0x9791, 0x97AF, 0x97E6, 0x97E7, 0x97E9, 0x97EA, 0x97EC, 0x97EB, 0x97F5, 0x54CD, 0x9875, 0x9876,
+ 0x9877, 0x9879, 0x987A, 0x9878, 0x987B, 0x987C, 0x9882, 0x9880, 0x9883, 0x9884, 0x987D, 0x9881, 0x987F, 0x9887, 0x9886, 0x988C,
+ 0x9889, 0x9890, 0x988F, 0x5934, 0x988A, 0x988B, 0x9894, 0x9888, 0x9893, 0x9891, 0x9897, 0x9898, 0x989D, 0x989A, 0x989C, 0x9899,
+ 0x989B, 0x613F, 0x98A1, 0x98A0, 0x7C7B, 0x989F, 0x98A2, 0x987E, 0x98A4, 0x98A5, 0x663E, 0x98A6, 0x9885, 0x989E, 0x98A7, 0x98CE,
+ 0x98D0, 0x98D1, 0x98D2, 0x53F0, 0x98D3, 0x98D4, 0x98CF, 0x98D6, 0x98D5, 0x98D7, 0x98D8, 0x98D9, 0x98DE, 0x9965, 0x9964, 0x9966,
+ 0x9968, 0x996A, 0x996B, 0x996C, 0x996D, 0x996E, 0x9974, 0x9972, 0x9971, 0x9970, 0x9973, 0x997A, 0x9978, 0x997C, 0x9977, 0x517B,
+ 0x9975, 0x9979, 0x997D, 0x9981, 0x997F, 0x997E, 0x4F59, 0x80B4, 0x9984, 0x9983, 0x996F, 0x9985, 0x9986, 0x7CC7, 0x9967, 0x5582,
+ 0x9989, 0x998E, 0x9969, 0x998F, 0x998A, 0x998C, 0x998D, 0x9992, 0x9990, 0x9991, 0x9988, 0x9994, 0x9976, 0x98E8, 0x990D, 0x998B,
+ 0x9A6C, 0x9A6D, 0x51AF, 0x9A6E, 0x9A70, 0x9A6F, 0x9A73, 0x9A7B, 0x9A7D, 0x9A79, 0x9A75, 0x9A7E, 0x9A80, 0x9A78, 0x9A76, 0x9A7C,
+ 0x9A77, 0x9A88, 0x9A87, 0x9A83, 0x9A86, 0x9A8E, 0x9A8F, 0x9A8B, 0x9A8D, 0x9A93, 0x9A92, 0x9A91, 0x9A90, 0x9A9B, 0x9A97, 0x9A99,
+ 0x9A9E, 0x9A98, 0x9A9D, 0x817E, 0x9A7A, 0x9A9A, 0x9A9F, 0x9AA1, 0x84E6, 0x9A9C, 0x9A96, 0x9AA0, 0x9AA2, 0x9A71, 0x9A85, 0x9A95,
+ 0x9A81, 0x9A84, 0x9A8C, 0x60CA, 0x9A7F, 0x9AA4, 0x9A74, 0x9AA7, 0x9AA5, 0x9AA6, 0x9A8A, 0x80AE, 0x9AC5, 0x810F, 0x4F53, 0x9ACC,
+ 0x9ACB, 0x53D1, 0x677E, 0x80E1, 0x9B13, 0x6597, 0x95F9, 0x960B, 0x9604, 0x90C1, 0x9B49, 0x9B47, 0x9C7C, 0x9C80, 0x9C81, 0x9C82,
+ 0x9C7F, 0x9C85, 0x9C86, 0x9C8F, 0x9C87, 0x9C90, 0x9C8D, 0x9C8B, 0x9C8A, 0x9C92, 0x9C95, 0x9C96, 0x9C94, 0x9C9B, 0x9C91, 0x9C9C,
+ 0x9CA7, 0x9CA0, 0x9CA9, 0x9CA4, 0x9CA8, 0x9CBB, 0x9CAF, 0x9CAD, 0x9C9E, 0x9CB7, 0x9CB4, 0x9CB1, 0x9CB5, 0x9CB2, 0x9CB3, 0x9CB8,
+ 0x9CAE, 0x9CB0, 0x9CB6, 0x9CAB, 0x9CCA, 0x9C97, 0x9CBD, 0x9CC7, 0x9CC5, 0x9CC6, 0x9CC3, 0x9CD2, 0x9CD1, 0x9CA5, 0x9CCF, 0x9CCE,
+ 0x9CD0, 0x9CCD, 0x9CC1, 0x9CA2, 0x9CCC, 0x9CA6, 0x9CA3, 0x9CB9, 0x9CD7, 0x9CD4, 0x9CC9, 0x9CD5, 0x9CD6, 0x9CDF, 0x9CDD, 0x9CDC,
+ 0x9CDE, 0x9C9F, 0x9CBC, 0x9C8E, 0x9C99, 0x9CE3, 0x9CE2, 0x9C9A, 0x9CC4, 0x9C88, 0x9CA1, 0x9E1F, 0x51EB, 0x9E20, 0x9E24, 0x51E4,
+ 0x9E23, 0x9E22, 0x9E29, 0x9E28, 0x9E26, 0x9E30, 0x9E35, 0x9E33, 0x9E32, 0x9E2E, 0x9E31, 0x9E2A, 0x9E2F, 0x9E2D, 0x9E38, 0x9E39,
+ 0x9E3B, 0x9E3F, 0x9E3D, 0x9E3A, 0x9E43, 0x9E46, 0x9E41, 0x9E48, 0x9E45, 0x9E44, 0x9E49, 0x9E4C, 0x9E4F, 0x9E4E, 0x9E4A, 0x9E53,
+ 0x9E2B, 0x9E51, 0x9E4B, 0x9E59, 0x9E55, 0x9E57, 0x9E56, 0x9E4D, 0x9E5B, 0x9E5C, 0x83BA, 0x9E5F, 0x9E64, 0x9E60, 0x9E61, 0x9E58,
+ 0x9E63, 0x9E5A, 0x9E62, 0x9E5E, 0x9E67, 0x9E65, 0x9E25, 0x9E37, 0x9E68, 0x9E36, 0x9E6A, 0x9E54, 0x9E69, 0x9E6B, 0x9E47, 0x9E6C,
+ 0x9E70, 0x9E6D, 0x9E6F, 0x9E2C, 0x9E74, 0x9E66, 0x9E73, 0x9E42, 0x9E3E, 0x5364, 0x9E7E, 0x7877, 0x76D0, 0x4E3D, 0x9EA6, 0x9EB8,
+ 0x9EB9, 0x9762, 0x4E48, 0x9EC4, 0x9EC9, 0x70B9, 0x515A, 0x9709, 0x9EE1, 0x9EE9, 0x9EFE, 0x9F0B, 0x9F0D, 0x9F39, 0x9F50, 0x658B,
+ 0x8D4D, 0x9F51, 0x9F7F, 0x9F80, 0x9F81, 0x9F85, 0x9F87, 0x9F83, 0x9F86, 0x9F84, 0x9F88, 0x9F8A, 0x9F89, 0x9F8B, 0x9F8C, 0x9F99,
+ 0x5390, 0x5E9E, 0x9F9A, 0x9F9B, 0x9F9F, 0xA76F, 0x8C48, 0x66F4, 0x8ECA, 0x8CC8, 0x6ED1, 0x4E32, 0x53E5, 0x9F9C, 0x9F9C, 0x5951,
+ 0x91D1, 0x5587, 0x5948, 0x61F6, 0x7669, 0x7F85, 0x863F, 0x87BA, 0x88F8, 0x908F, 0x6A02, 0x6D1B, 0x70D9, 0x73DE, 0x843D, 0x916A,
+ 0x99F1, 0x4E82, 0x5375, 0x6B04, 0x721B, 0x862D, 0x9E1E, 0x5D50, 0x6FEB, 0x85CD, 0x8964, 0x62C9, 0x81D8, 0x881F, 0x5ECA, 0x6717,
+ 0x6D6A, 0x72FC, 0x90CE, 0x4F86, 0x51B7, 0x52DE, 0x64C4, 0x6AD3, 0x7210, 0x76E7, 0x8001, 0x8606, 0x865C, 0x8DEF, 0x9732, 0x9B6F,
+ 0x9DFA, 0x788C, 0x797F, 0x7DA0, 0x83C9, 0x9304, 0x9E7F, 0x8AD6, 0x58DF, 0x5F04, 0x7C60, 0x807E, 0x7262, 0x78CA, 0x8CC2, 0x96F7,
+ 0x58D8, 0x5C62, 0x6A13, 0x6DDA, 0x6F0F, 0x7D2F, 0x7E37, 0x964B, 0x52D2, 0x808B, 0x51DC, 0x51CC, 0x7A1C, 0x7DBE, 0x83F1, 0x9675,
+ 0x8B80, 0x62CF, 0x6A02, 0x8AFE, 0x4E39, 0x5BE7, 0x6012, 0x7387, 0x7570, 0x5317, 0x78FB, 0x4FBF, 0x5FA9, 0x4E0D, 0x6CCC, 0x6578,
+ 0x7D22, 0x53C3, 0x585E, 0x7701, 0x8449, 0x8AAA, 0x6BBA, 0x8FB0, 0x6C88, 0x62FE, 0x82E5, 0x63A0, 0x7565, 0x4EAE, 0x5169, 0x51C9,
+ 0x6881, 0x7CE7, 0x826F, 0x8AD2, 0x91CF, 0x52F5, 0x5442, 0x5973, 0x5EEC, 0x65C5, 0x6FFE, 0x792A, 0x95AD, 0x9A6A, 0x9E97, 0x9ECE,
+ 0x529B, 0x66C6, 0x6B77, 0x8F62, 0x5E74, 0x6190, 0x6200, 0x649A, 0x6F23, 0x7149, 0x7489, 0x79CA, 0x7DF4, 0x806F, 0x8F26, 0x84EE,
+ 0x9023, 0x934A, 0x5217, 0x52A3, 0x54BD, 0x70C8, 0x88C2, 0x8AAA, 0x5EC9, 0x5FF5, 0x637B, 0x6BAE, 0x7C3E, 0x7375, 0x4EE4, 0x56F9,
+ 0x5BE7, 0x5DBA, 0x601C, 0x73B2, 0x7469, 0x7F9A, 0x8046, 0x9234, 0x96F6, 0x9748, 0x9818, 0x4F8B, 0x79AE, 0x91B4, 0x96B8, 0x60E1,
+ 0x4E86, 0x50DA, 0x5BEE, 0x5C3F, 0x6599, 0x6A02, 0x71CE, 0x7642, 0x84FC, 0x907C, 0x9F8D, 0x6688, 0x962E, 0x5289, 0x677B, 0x67F3,
+ 0x6D41, 0x6E9C, 0x7409, 0x7559, 0x786B, 0x7D10, 0x985E, 0x516D, 0x622E, 0x9678, 0x502B, 0x5D19, 0x6DEA, 0x8F2A, 0x5F8B, 0x6144,
+ 0x6817, 0x7387, 0x9686, 0x5229, 0x540F, 0x5C65, 0x6613, 0x674E, 0x68A8, 0x6CE5, 0x7406, 0x75E2, 0x7F79, 0x88CF, 0x88E1, 0x91CC,
+ 0x96E2, 0x533F, 0x6EBA, 0x541D, 0x71D0, 0x7498, 0x85FA, 0x96A3, 0x9C57, 0x9E9F, 0x6797, 0x6DCB, 0x81E8, 0x7ACB, 0x7B20, 0x7C92,
+ 0x72C0, 0x7099, 0x8B58, 0x4EC0, 0x8336, 0x523A, 0x5207, 0x5EA6, 0x62D3, 0x7CD6, 0x5B85, 0x6D1E, 0x66B4, 0x8F3B, 0x884C, 0x964D,
+ 0x898B, 0x5ED3, 0x5140, 0x55C0, 0x585A, 0x6674, 0x51DE, 0x732A, 0x76CA, 0x793C, 0x795E, 0x7965, 0x798F, 0x9756, 0x7CBE, 0x7FBD,
+ 0x8612, 0x8AF8, 0x9038, 0x90FD, 0x98EF, 0x98FC, 0x9928, 0x9DB4, 0x4FAE, 0x50E7, 0x514D, 0x52C9, 0x52E4, 0x5351, 0x559D, 0x5606,
+ 0x5668, 0x5840, 0x58A8, 0x5C64, 0x5C6E, 0x6094, 0x6168, 0x618E, 0x61F2, 0x654F, 0x65E2, 0x6691, 0x6885, 0x6D77, 0x6E1A, 0x6F22,
+ 0x716E, 0x722B, 0x7422, 0x7891, 0x793E, 0x7949, 0x7948, 0x7950, 0x7956, 0x795D, 0x798D, 0x798E, 0x7A40, 0x7A81, 0x7BC0, 0x7DF4,
+ 0x7E09, 0x7E41, 0x7F72, 0x8005, 0x81ED, 0x8279, 0x8279, 0x8457, 0x8910, 0x8996, 0x8B01, 0x8B39, 0x8CD3, 0x8D08, 0x8FB6, 0x9038,
+ 0x96E3, 0x97FF, 0x983B, 0x6075, 0x8218, 0x4E26, 0x51B5, 0x5168, 0x4F80, 0x5145, 0x5180, 0x52C7, 0x52FA, 0x559D, 0x5555, 0x5599,
+ 0x55E2, 0x585A, 0x58B3, 0x5944, 0x5954, 0x5A62, 0x5B28, 0x5ED2, 0x5ED9, 0x5F69, 0x5FAD, 0x60D8, 0x614E, 0x6108, 0x618E, 0x6160,
+ 0x61F2, 0x6234, 0x63C4, 0x641C, 0x6452, 0x6556, 0x6674, 0x6717, 0x671B, 0x6756, 0x6B79, 0x6BBA, 0x6D41, 0x6EDB, 0x6ECB, 0x6F22,
+ 0x701E, 0x716E, 0x77A7, 0x7235, 0x72AF, 0x732A, 0x7471, 0x7506, 0x753B, 0x761D, 0x761F, 0x76CA, 0x76DB, 0x76F4, 0x774A, 0x7740,
+ 0x78CC, 0x7AB1, 0x7BC0, 0x7C7B, 0x7D5B, 0x7DF4, 0x7F3E, 0x8005, 0x8352, 0x83EF, 0x8779, 0x8941, 0x8986, 0x8996, 0x8ABF, 0x8AF8,
+ 0x8ACB, 0x8B01, 0x8AFE, 0x8AED, 0x8B39, 0x8B8A, 0x8D08, 0x8F38, 0x9072, 0x9199, 0x9276, 0x967C, 0x96E3, 0x9756, 0x97DB, 0x97FF,
+ 0x980B, 0x983B, 0x9B12, 0x9F9C, 0x3B9D, 0x4018, 0x4039, 0x9F43, 0x9F8E, 0x05E2, 0x05D0, 0x05D3, 0x05D4, 0x05DB, 0x05DC, 0x05DD,
+ 0x05E8, 0x05EA, 0x002B, 0x0671, 0x0671, 0x067B, 0x067B, 0x067B, 0x067B, 0x067E, 0x067E, 0x067E, 0x067E, 0x0680, 0x0680, 0x0680,
+ 0x0680, 0x067A, 0x067A, 0x067A, 0x067A, 0x067F, 0x067F, 0x067F, 0x067F, 0x0679, 0x0679, 0x0679, 0x0679, 0x06A4, 0x06A4, 0x06A4,
+ 0x06A4, 0x06A6, 0x06A6, 0x06A6, 0x06A6, 0x0684, 0x0684, 0x0684, 0x0684, 0x0683, 0x0683, 0x0683, 0x0683, 0x0686, 0x0686, 0x0686,
+ 0x0686, 0x0687, 0x0687, 0x0687, 0x0687, 0x068D, 0x068D, 0x068C, 0x068C, 0x068E, 0x068E, 0x0688, 0x0688, 0x0698, 0x0698, 0x0691,
+ 0x0691, 0x06A9, 0x06A9, 0x06A9, 0x06A9, 0x06AF, 0x06AF, 0x06AF, 0x06AF, 0x06B3, 0x06B3, 0x06B3, 0x06B3, 0x06B1, 0x06B1, 0x06B1,
+ 0x06B1, 0x06BA, 0x06BA, 0x06BB, 0x06BB, 0x06BB, 0x06BB, 0x06C0, 0x06C0, 0x06C1, 0x06C1, 0x06C1, 0x06C1, 0x06BE, 0x06BE, 0x06BE,
+ 0x06BE, 0x06D2, 0x06D2, 0x06D3, 0x06D3, 0x06AD, 0x06AD, 0x06AD, 0x06AD, 0x06C7, 0x06C7, 0x06C6, 0x06C6, 0x06C8, 0x06C8, 0x0677,
+ 0x06CB, 0x06CB, 0x06C5, 0x06C5, 0x06C9, 0x06C9, 0x06D0, 0x06D0, 0x06D0, 0x06D0, 0x0649, 0x0649, 0x06CC, 0x06CC, 0x06CC, 0x06CC,
+ 0x002C, 0x3001, 0x3002, 0x003A, 0x003B, 0x0021, 0x003F, 0x3016, 0x3017, 0x2026, 0x2025, 0x2014, 0x2013, 0x005F, 0x005F, 0x0028,
+ 0x0029, 0x007B, 0x007D, 0x3014, 0x3015, 0x3010, 0x3011, 0x300A, 0x300B, 0x3008, 0x3009, 0x300C, 0x300D, 0x300E, 0x300F, 0x005B,
+ 0x005D, 0x203E, 0x203E, 0x203E, 0x203E, 0x005F, 0x005F, 0x005F, 0x002C, 0x3001, 0x002E, 0x003B, 0x003A, 0x003F, 0x0021, 0x2014,
+ 0x0028, 0x0029, 0x007B, 0x007D, 0x3014, 0x3015, 0x0023, 0x0026, 0x002A, 0x002B, 0x002D, 0x003C, 0x003E, 0x003D, 0x005C, 0x0024,
+ 0x0025, 0x0040, 0x064B, 0x064C, 0x064D, 0x064E, 0x064F, 0x0650, 0x0651, 0x0652, 0x0621, 0x0622, 0x0622, 0x0623, 0x0623, 0x0624,
+ 0x0624, 0x0625, 0x0625, 0x0626, 0x0626, 0x0626, 0x0626, 0x0627, 0x0627, 0x0628, 0x0628, 0x0628, 0x0628, 0x0629, 0x0629, 0x062A,
+ 0x062A, 0x062A, 0x062A, 0x062B, 0x062B, 0x062B, 0x062B, 0x062C, 0x062C, 0x062C, 0x062C, 0x062D, 0x062D, 0x062D, 0x062D, 0x062E,
+ 0x062E, 0x062E, 0x062E, 0x062F, 0x062F, 0x0630, 0x0630, 0x0631, 0x0631, 0x0632, 0x0632, 0x0633, 0x0633, 0x0633, 0x0633, 0x0634,
+ 0x0634, 0x0634, 0x0634, 0x0635, 0x0635, 0x0635, 0x0635, 0x0636, 0x0636, 0x0636, 0x0636, 0x0637, 0x0637, 0x0637, 0x0637, 0x0638,
+ 0x0638, 0x0638, 0x0638, 0x0639, 0x0639, 0x0639, 0x0639, 0x063A, 0x063A, 0x063A, 0x063A, 0x0641, 0x0641, 0x0641, 0x0641, 0x0642,
+ 0x0642, 0x0642, 0x0642, 0x0643, 0x0643, 0x0643, 0x0643, 0x0644, 0x0644, 0x0644, 0x0644, 0x0645, 0x0645, 0x0645, 0x0645, 0x0646,
+ 0x0646, 0x0646, 0x0646, 0x0647, 0x0647, 0x0647, 0x0647, 0x0648, 0x0648, 0x0649, 0x0649, 0x064A, 0x064A, 0x064A, 0x064A, 0x0021,
+ 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, 0x0030, 0x0031,
+ 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, 0x0040, 0x0041,
+ 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051,
+ 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, 0x0060, 0x0061,
+ 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, 0x0070, 0x0071,
+ 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x2985, 0x2986, 0x3002,
+ 0x300C, 0x300D, 0x3001, 0x30FB, 0x30F2, 0x30A1, 0x30A3, 0x30A5, 0x30A7, 0x30A9, 0x30E3, 0x30E5, 0x30E7, 0x30C3, 0x30FC, 0x30A2,
+ 0x30A4, 0x30A6, 0x30A8, 0x30AA, 0x30AB, 0x30AD, 0x30AF, 0x30B1, 0x30B3, 0x30B5, 0x30B7, 0x30B9, 0x30BB, 0x30BD, 0x30BF, 0x30C1,
+ 0x30C4, 0x30C6, 0x30C8, 0x30CA, 0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF, 0x30D2, 0x30D5, 0x30D8, 0x30DB, 0x30DE, 0x30DF, 0x30E0,
+ 0x30E1, 0x30E2, 0x30E4, 0x30E6, 0x30E8, 0x30E9, 0x30EA, 0x30EB, 0x30EC, 0x30ED, 0x30EF, 0x30F3, 0x3099, 0x309A, 0x3164, 0x3131,
+ 0x3132, 0x3133, 0x3134, 0x3135, 0x3136, 0x3137, 0x3138, 0x3139, 0x313A, 0x313B, 0x313C, 0x313D, 0x313E, 0x313F, 0x3140, 0x3141,
+ 0x3142, 0x3143, 0x3144, 0x3145, 0x3146, 0x3147, 0x3148, 0x3149, 0x314A, 0x314B, 0x314C, 0x314D, 0x314E, 0x314F, 0x3150, 0x3151,
+ 0x3152, 0x3153, 0x3154, 0x3155, 0x3156, 0x3157, 0x3158, 0x3159, 0x315A, 0x315B, 0x315C, 0x315D, 0x315E, 0x315F, 0x3160, 0x3161,
+ 0x3162, 0x3163, 0x00A2, 0x00A3, 0x00AC, 0x00AF, 0x00A6, 0x00A5, 0x20A9, 0x2502, 0x2190, 0x2191, 0x2192, 0x2193, 0x25A0, 0x25CB
+};
+extern const FX_WCHAR g_UnicodeData_Normalization_Map2[1724] = {
+ 0x004F, 0x0045, 0x0054, 0x004D, 0x006F, 0x0065, 0x0049, 0x004A, 0x0069, 0x006A, 0x004F, 0x0045, 0x006F, 0x0065, 0x0044, 0x017D,
+ 0x0044, 0x017E, 0x0064, 0x017E, 0x004C, 0x004A, 0x004C, 0x006A, 0x006C, 0x006A, 0x004E, 0x004A, 0x004E, 0x006A, 0x006E, 0x006A,
+ 0x0044, 0x005A, 0x0044, 0x007A, 0x0064, 0x007A, 0x0064, 0x0062, 0x0071, 0x0070, 0x004F, 0x0045, 0x0064, 0x007A, 0x0064, 0x0292,
+ 0x0064, 0x007A, 0x0074, 0x0073, 0x0074, 0x0283, 0x0074, 0x0063, 0x0066, 0x014B, 0x006C, 0x0073, 0x006C, 0x007A, 0x041D, 0x0413,
+ 0x043D, 0x0433, 0x0422, 0x0426, 0x0442, 0x0446, 0x0410, 0x0415, 0x0430, 0x0435, 0x0565, 0x0582, 0x0627, 0x0674, 0x0648, 0x0674,
+ 0x06C7, 0x0674, 0x064A, 0x0674, 0x06D5, 0x0654, 0x06C1, 0x0654, 0x06D2, 0x0654, 0x0928, 0x093C, 0x0930, 0x093C, 0x0933, 0x093C,
+ 0x0915, 0x093C, 0x0916, 0x093C, 0x0917, 0x093C, 0x091C, 0x093C, 0x0921, 0x093C, 0x0922, 0x093C, 0x092B, 0x093C, 0x092F, 0x093C,
+ 0x09C7, 0x09BE, 0x09C7, 0x09D7, 0x09A1, 0x09BC, 0x09A2, 0x09BC, 0x09AF, 0x09BC, 0x0A32, 0x0A3C, 0x0A38, 0x0A3C, 0x0A16, 0x0A3C,
+ 0x0A17, 0x0A3C, 0x0A1C, 0x0A3C, 0x0A2B, 0x0A3C, 0x0B47, 0x0B56, 0x0B47, 0x0B3E, 0x0B47, 0x0B57, 0x0B21, 0x0B3C, 0x0B22, 0x0B3C,
+ 0x0B92, 0x0BD7, 0x0BC6, 0x0BBE, 0x0BC7, 0x0BBE, 0x0BC6, 0x0BD7, 0x0C46, 0x0C56, 0x0CBF, 0x0CD5, 0x0CC6, 0x0CD5, 0x0CC6, 0x0CD6,
+ 0x0CC6, 0x0CC2, 0x0CCA, 0x0CD5, 0x0D46, 0x0D3E, 0x0D47, 0x0D3E, 0x0D46, 0x0D57, 0x0DD9, 0x0DCA, 0x0DD9, 0x0DCF, 0x0DDC, 0x0DCA,
+ 0x0DD9, 0x0DDF, 0x0E4D, 0x0E32, 0x0ECD, 0x0EB2, 0x0EAB, 0x0E99, 0x0EAB, 0x0EA1, 0x0F42, 0x0FB7, 0x0F4C, 0x0FB7, 0x0F51, 0x0FB7,
+ 0x0F56, 0x0FB7, 0x0F5B, 0x0FB7, 0x0F40, 0x0FB5, 0x0F71, 0x0F72, 0x0F71, 0x0F74, 0x0FB2, 0x0F80, 0x0FB2, 0x0F81, 0x0FB3, 0x0F80,
+ 0x0FB3, 0x0F81, 0x0F71, 0x0F80, 0x0F92, 0x0FB7, 0x0F9C, 0x0FB7, 0x0FA1, 0x0FB7, 0x0FA6, 0x0FB7, 0x0FAB, 0x0FB7, 0x0F90, 0x0FB5,
+ 0x1025, 0x102E, 0x1B05, 0x1B35, 0x1B07, 0x1B35, 0x1B09, 0x1B35, 0x1B0B, 0x1B35, 0x1B0D, 0x1B35, 0x1B11, 0x1B35, 0x1B3A, 0x1B35,
+ 0x1B3C, 0x1B35, 0x1B3E, 0x1B35, 0x1B3F, 0x1B35, 0x1B42, 0x1B35, 0x0074, 0x0068, 0x002E, 0x002E, 0x2032, 0x2032, 0x2035, 0x2035,
+ 0x0021, 0x0021, 0x0020, 0x0305, 0x003F, 0x003F, 0x003F, 0x0021, 0x0021, 0x003F, 0x0052, 0x0073, 0x00B0, 0x0043, 0x00B0, 0x0046,
+ 0x004E, 0x006F, 0x0053, 0x004D, 0x0054, 0x004D, 0x0031, 0x002F, 0x0049, 0x0049, 0x0049, 0x0056, 0x0056, 0x0049, 0x0049, 0x0058,
+ 0x0058, 0x0049, 0x0069, 0x0069, 0x0069, 0x0076, 0x0076, 0x0069, 0x0069, 0x0078, 0x0078, 0x0069, 0x2190, 0x0338, 0x2192, 0x0338,
+ 0x2194, 0x0338, 0x21D0, 0x0338, 0x21D4, 0x0338, 0x21D2, 0x0338, 0x2223, 0x0338, 0x2225, 0x0338, 0x222B, 0x222B, 0x222E, 0x222E,
+ 0x223C, 0x0338, 0x2243, 0x0338, 0x2245, 0x0338, 0x2248, 0x0338, 0x003D, 0x002F, 0x2261, 0x002F, 0x224D, 0x002F, 0x003C, 0x002F,
+ 0x003E, 0x002F, 0x2264, 0x002F, 0x2265, 0x002F, 0x2272, 0x002F, 0x2273, 0x002F, 0x2276, 0x002F, 0x2277, 0x002F, 0x227A, 0x002F,
+ 0x227B, 0x002F, 0x2282, 0x002F, 0x2283, 0x002F, 0x2286, 0x002F, 0x2287, 0x002F, 0x22A2, 0x002F, 0x22A8, 0x002F, 0x22A9, 0x002F,
+ 0x22AB, 0x002F, 0x227C, 0x002F, 0x227D, 0x002F, 0x2291, 0x002F, 0x2292, 0x002F, 0x22B2, 0x002F, 0x22B3, 0x002F, 0x22B4, 0x002F,
+ 0x22B5, 0x002F, 0x0042, 0x0053, 0x0048, 0x0054, 0x004C, 0x0046, 0x0056, 0x0054, 0x0046, 0x0046, 0x0043, 0x0052, 0x0053, 0x0053,
+ 0x0053, 0x0049, 0x0045, 0x004D, 0x0046, 0x0053, 0x0047, 0x0053, 0x0052, 0x0053, 0x0055, 0x0053, 0x0053, 0x0050, 0x0031, 0x0030,
+ 0x0031, 0x0031, 0x0031, 0x0032, 0x0031, 0x0033, 0x0031, 0x0034, 0x0031, 0x0035, 0x0031, 0x0036, 0x0031, 0x0037, 0x0031, 0x0038,
+ 0x0031, 0x0039, 0x0032, 0x0030, 0x0031, 0x002E, 0x0032, 0x002E, 0x0033, 0x002E, 0x0034, 0x002E, 0x0035, 0x002E, 0x0036, 0x002E,
+ 0x0037, 0x002E, 0x0038, 0x002E, 0x0039, 0x002E, 0x0031, 0x0031, 0x0031, 0x0032, 0x0031, 0x0033, 0x0031, 0x0034, 0x0031, 0x0035,
+ 0x0031, 0x0036, 0x0031, 0x0037, 0x0031, 0x0038, 0x0031, 0x0039, 0x0032, 0x0030, 0x0031, 0x0030, 0x0031, 0x0030, 0x0031, 0x0030,
+ 0x0031, 0x0030, 0x003D, 0x003D, 0x2ADD, 0x002F, 0x304B, 0x3099, 0x304D, 0x3099, 0x304F, 0x3099, 0x3051, 0x3099, 0x3053, 0x3099,
+ 0x3055, 0x3099, 0x3057, 0x3099, 0x3059, 0x3099, 0x305B, 0x3099, 0x305D, 0x3099, 0x305F, 0x3099, 0x3061, 0x3099, 0x3064, 0x3099,
+ 0x3066, 0x3099, 0x3068, 0x3099, 0x306F, 0x3099, 0x306F, 0x309A, 0x3072, 0x3099, 0x3072, 0x309A, 0x3075, 0x3099, 0x3075, 0x309A,
+ 0x3078, 0x3099, 0x3078, 0x309A, 0x307B, 0x3099, 0x307B, 0x309A, 0x3046, 0x3099, 0x0020, 0x3099, 0x0020, 0x309A, 0x309D, 0x3099,
+ 0x3088, 0x308A, 0x30AB, 0x3099, 0x30AD, 0x3099, 0x30AF, 0x3099, 0x30B1, 0x3099, 0x30B3, 0x3099, 0x30B5, 0x3099, 0x30B7, 0x3099,
+ 0x30B9, 0x3099, 0x30BB, 0x3099, 0x30BD, 0x3099, 0x30BF, 0x3099, 0x30C1, 0x3099, 0x30C4, 0x3099, 0x30C6, 0x3099, 0x30C8, 0x3099,
+ 0x30CF, 0x3099, 0x30CF, 0x309A, 0x30D2, 0x3099, 0x30D2, 0x309A, 0x30D5, 0x3099, 0x30D5, 0x309A, 0x30D8, 0x3099, 0x30D8, 0x309A,
+ 0x30DB, 0x3099, 0x30DB, 0x309A, 0x30A6, 0x3099, 0x30EF, 0x3099, 0x30F0, 0x3099, 0x30F1, 0x3099, 0x30F2, 0x3099, 0x30FD, 0x3099,
+ 0x30B3, 0x30C8, 0x0032, 0x0031, 0x0032, 0x0032, 0x0032, 0x0033, 0x0032, 0x0034, 0x0032, 0x0035, 0x0032, 0x0036, 0x0032, 0x0037,
+ 0x0032, 0x0038, 0x0032, 0x0039, 0x0033, 0x0030, 0x0033, 0x0031, 0x0033, 0x0032, 0x0033, 0x0033, 0x0033, 0x0034, 0x0033, 0x0035,
+ 0x1100, 0x1161, 0x1102, 0x1161, 0x1103, 0x1161, 0x1105, 0x1161, 0x1106, 0x1161, 0x1107, 0x1161, 0x1109, 0x1161, 0x110B, 0x1161,
+ 0x110C, 0x1161, 0x110E, 0x1161, 0x110F, 0x1161, 0x1110, 0x1161, 0x1111, 0x1161, 0x1112, 0x1161, 0x110B, 0x116E, 0x0033, 0x0036,
+ 0x0033, 0x0037, 0x0033, 0x0038, 0x0033, 0x0039, 0x0034, 0x0030, 0x0034, 0x0031, 0x0034, 0x0032, 0x0034, 0x0033, 0x0034, 0x0034,
+ 0x0034, 0x0035, 0x0034, 0x0036, 0x0034, 0x0037, 0x0034, 0x0038, 0x0034, 0x0039, 0x0035, 0x0030, 0x0031, 0x6708, 0x0032, 0x6708,
+ 0x0033, 0x6708, 0x0034, 0x6708, 0x0035, 0x6708, 0x0036, 0x6708, 0x0037, 0x6708, 0x0038, 0x6708, 0x0039, 0x6708, 0x0048, 0x0067,
+ 0x0065, 0x0056, 0x30AE, 0x30AC, 0x30AD, 0x30ED, 0x30C7, 0x30B7, 0x30C9, 0x30EB, 0x30C8, 0x30F3, 0x30CA, 0x30CE, 0x30D4, 0x30B3,
+ 0x30D3, 0x30EB, 0x30DA, 0x30BD, 0x30DB, 0x30F3, 0x30DF, 0x30EA, 0x30E1, 0x30AC, 0x30EA, 0x30E9, 0x30EC, 0x30E0, 0x0030, 0x70B9,
+ 0x0031, 0x70B9, 0x0032, 0x70B9, 0x0033, 0x70B9, 0x0034, 0x70B9, 0x0035, 0x70B9, 0x0036, 0x70B9, 0x0037, 0x70B9, 0x0038, 0x70B9,
+ 0x0039, 0x70B9, 0x0064, 0x0061, 0x0041, 0x0055, 0x006F, 0x0056, 0x0070, 0x0063, 0x0064, 0x006D, 0x0049, 0x0055, 0x5E73, 0x6210,
+ 0x662D, 0x548C, 0x5927, 0x6B63, 0x660E, 0x6CBB, 0x0070, 0x0041, 0x006E, 0x0041, 0x03BC, 0x0041, 0x006D, 0x0041, 0x006B, 0x0041,
+ 0x004B, 0x0042, 0x004D, 0x0042, 0x0047, 0x0042, 0x0070, 0x0046, 0x006E, 0x0046, 0x03BC, 0x0046, 0x03BC, 0x0067, 0x006D, 0x0067,
+ 0x006B, 0x0067, 0x0048, 0x007A, 0x03BC, 0x2113, 0x006D, 0x2113, 0x0064, 0x2113, 0x006B, 0x2113, 0x0066, 0x006D, 0x006E, 0x006D,
+ 0x03BC, 0x006D, 0x006D, 0x006D, 0x0063, 0x006D, 0x006B, 0x006D, 0x006D, 0x00B2, 0x006D, 0x00B3, 0x0050, 0x0061, 0x0070, 0x0073,
+ 0x006E, 0x0073, 0x03BC, 0x0073, 0x006D, 0x0073, 0x0070, 0x0056, 0x006E, 0x0056, 0x03BC, 0x0056, 0x006D, 0x0056, 0x006B, 0x0056,
+ 0x004D, 0x0056, 0x0070, 0x0057, 0x006E, 0x0057, 0x03BC, 0x0057, 0x006D, 0x0057, 0x006B, 0x0057, 0x004D, 0x0057, 0x006B, 0x03A9,
+ 0x004D, 0x03A9, 0x0042, 0x0071, 0x0063, 0x0063, 0x0063, 0x0064, 0x0064, 0x0042, 0x0047, 0x0079, 0x0068, 0x0061, 0x0048, 0x0050,
+ 0x0069, 0x006E, 0x004B, 0x004B, 0x004B, 0x004D, 0x006B, 0x0074, 0x006C, 0x006D, 0x006C, 0x006E, 0x006C, 0x0078, 0x006D, 0x0062,
+ 0x0050, 0x0048, 0x0050, 0x0052, 0x0073, 0x0072, 0x0053, 0x0076, 0x0057, 0x0062, 0x0031, 0x65E5, 0x0032, 0x65E5, 0x0033, 0x65E5,
+ 0x0034, 0x65E5, 0x0035, 0x65E5, 0x0036, 0x65E5, 0x0037, 0x65E5, 0x0038, 0x65E5, 0x0039, 0x65E5, 0x0066, 0x0066, 0x0066, 0x0069,
+ 0x0066, 0x006C, 0x017F, 0x0074, 0x0073, 0x0074, 0x0574, 0x0576, 0x0574, 0x0565, 0x0574, 0x056B, 0x057E, 0x0576, 0x0574, 0x056D,
+ 0x05D9, 0x05B4, 0x05F2, 0x05B7, 0x05E9, 0x05C1, 0x05E9, 0x05C2, 0xFB49, 0x05C1, 0xFB49, 0x05C2, 0x05D0, 0x05B7, 0x05D0, 0x05B8,
+ 0x05D0, 0x05BC, 0x05D1, 0x05BC, 0x05D2, 0x05BC, 0x05D3, 0x05BC, 0x05D4, 0x05BC, 0x05D5, 0x05BC, 0x05D6, 0x05BC, 0x05D8, 0x05BC,
+ 0x05D9, 0x05BC, 0x05DA, 0x05BC, 0x05DB, 0x05BC, 0x05DC, 0x05BC, 0x05DE, 0x05BC, 0x05E0, 0x05BC, 0x05E1, 0x05BC, 0x05E3, 0x05BC,
+ 0x05E4, 0x05BC, 0x05E6, 0x05BC, 0x05E7, 0x05BC, 0x05E8, 0x05BC, 0x05E9, 0x05BC, 0x05EA, 0x05BC, 0x05D5, 0x05B9, 0x05D1, 0x05BF,
+ 0x05DB, 0x05BF, 0x05E4, 0x05BF, 0x05D0, 0x05DC, 0x0626, 0x0627, 0x0626, 0x0627, 0x0626, 0x06D5, 0x0626, 0x06D5, 0x0626, 0x0648,
+ 0x0626, 0x0648, 0x0626, 0x06C7, 0x0626, 0x06C7, 0x0626, 0x06C6, 0x0626, 0x06C6, 0x0626, 0x06C8, 0x0626, 0x06C8, 0x0626, 0x06D0,
+ 0x0626, 0x06D0, 0x0626, 0x06D0, 0x0626, 0x0649, 0x0626, 0x0649, 0x0626, 0x0649, 0x0626, 0x062C, 0x0626, 0x062D, 0x0626, 0x0645,
+ 0x0626, 0x0649, 0x0626, 0x064A, 0x0628, 0x062C, 0x0628, 0x062D, 0x0628, 0x062E, 0x0628, 0x0645, 0x0628, 0x0649, 0x0628, 0x064A,
+ 0x062A, 0x062C, 0x062A, 0x062D, 0x062A, 0x062E, 0x062A, 0x0645, 0x062A, 0x0649, 0x062A, 0x064A, 0x062B, 0x062C, 0x062B, 0x0645,
+ 0x062B, 0x0649, 0x062B, 0x064A, 0x062C, 0x062D, 0x062C, 0x0645, 0x062D, 0x062C, 0x062D, 0x0645, 0x062E, 0x062C, 0x062E, 0x062D,
+ 0x062E, 0x0645, 0x0633, 0x062C, 0x0633, 0x062D, 0x0633, 0x062E, 0x0633, 0x0645, 0x0635, 0x062D, 0x0635, 0x0645, 0x0636, 0x062C,
+ 0x0636, 0x062D, 0x0636, 0x062E, 0x0636, 0x0645, 0x0637, 0x062D, 0x0637, 0x0645, 0x0638, 0x0645, 0x0639, 0x062C, 0x0639, 0x0645,
+ 0x063A, 0x062C, 0x063A, 0x0645, 0x0641, 0x062C, 0x0641, 0x062D, 0x0641, 0x062E, 0x0641, 0x0645, 0x0641, 0x0649, 0x0641, 0x064A,
+ 0x0642, 0x062D, 0x0642, 0x0645, 0x0642, 0x0649, 0x0642, 0x064A, 0x0643, 0x0627, 0x0643, 0x062C, 0x0643, 0x062D, 0x0643, 0x062E,
+ 0x0643, 0x0644, 0x0643, 0x0645, 0x0643, 0x0649, 0x0643, 0x064A, 0x0644, 0x062C, 0x0644, 0x062D, 0x0644, 0x062E, 0x0644, 0x0645,
+ 0x0644, 0x0649, 0x0644, 0x064A, 0x0645, 0x062C, 0x0645, 0x062D, 0x0645, 0x062E, 0x0645, 0x0645, 0x0645, 0x0649, 0x0645, 0x064A,
+ 0x0646, 0x062C, 0x0646, 0x062D, 0x0646, 0x062E, 0x0646, 0x0645, 0x0646, 0x0649, 0x0646, 0x064A, 0x0647, 0x062C, 0x0647, 0x0645,
+ 0x0647, 0x0649, 0x0647, 0x064A, 0x064A, 0x062C, 0x064A, 0x062D, 0x064A, 0x062E, 0x064A, 0x0645, 0x064A, 0x0649, 0x064A, 0x064A,
+ 0x0630, 0x0670, 0x0631, 0x0670, 0x0649, 0x0670, 0x064C, 0x0651, 0x064D, 0x0651, 0x064E, 0x0651, 0x064F, 0x0651, 0x0650, 0x0651,
+ 0x0651, 0x0670, 0x0626, 0x0631, 0x0626, 0x0632, 0x0626, 0x0645, 0x0626, 0x0646, 0x0626, 0x0649, 0x0626, 0x064A, 0x0628, 0x0631,
+ 0x0628, 0x0632, 0x0628, 0x0645, 0x0628, 0x0646, 0x0628, 0x0649, 0x0628, 0x064A, 0x062A, 0x0631, 0x062A, 0x0632, 0x062A, 0x0645,
+ 0x062A, 0x0646, 0x062A, 0x0649, 0x062A, 0x064A, 0x062B, 0x0631, 0x062B, 0x0632, 0x062B, 0x0645, 0x062B, 0x0646, 0x062B, 0x0649,
+ 0x062B, 0x064A, 0x0641, 0x0649, 0x0641, 0x064A, 0x0642, 0x0649, 0x0642, 0x064A, 0x0643, 0x0627, 0x0643, 0x0644, 0x0643, 0x0645,
+ 0x0643, 0x0649, 0x0643, 0x064A, 0x0644, 0x0645, 0x0644, 0x0649, 0x0644, 0x064A, 0x0645, 0x0627, 0x0645, 0x0645, 0x0646, 0x0631,
+ 0x0646, 0x0632, 0x0646, 0x0645, 0x0646, 0x0646, 0x0646, 0x0649, 0x0646, 0x064A, 0x0649, 0x0670, 0x064A, 0x0631, 0x064A, 0x0632,
+ 0x064A, 0x0645, 0x064A, 0x0646, 0x064A, 0x0649, 0x064A, 0x064A, 0x0626, 0x062C, 0x0626, 0x062D, 0x0626, 0x062E, 0x0626, 0x0645,
+ 0x0626, 0x0647, 0x0628, 0x062C, 0x0628, 0x062D, 0x0628, 0x062E, 0x0628, 0x0645, 0x0628, 0x0647, 0x062A, 0x062C, 0x062A, 0x062D,
+ 0x062A, 0x062E, 0x062A, 0x0645, 0x062A, 0x0647, 0x062B, 0x0645, 0x062C, 0x062D, 0x062C, 0x0645, 0x062D, 0x062C, 0x062D, 0x0645,
+ 0x062E, 0x062C, 0x062E, 0x0645, 0x0633, 0x062C, 0x0633, 0x062D, 0x0633, 0x062E, 0x0633, 0x0645, 0x0635, 0x062D, 0x0635, 0x062E,
+ 0x0635, 0x0645, 0x0636, 0x062C, 0x0636, 0x062D, 0x0636, 0x062E, 0x0636, 0x0645, 0x0637, 0x062D, 0x0638, 0x0645, 0x0639, 0x062C,
+ 0x0639, 0x0645, 0x063A, 0x062C, 0x063A, 0x0645, 0x0641, 0x062C, 0x0641, 0x062D, 0x0641, 0x062E, 0x0641, 0x0645, 0x0642, 0x062D,
+ 0x0642, 0x0645, 0x0643, 0x062C, 0x0643, 0x062D, 0x0643, 0x062E, 0x0643, 0x0644, 0x0643, 0x0645, 0x0644, 0x062C, 0x0644, 0x062D,
+ 0x0644, 0x062E, 0x0644, 0x0645, 0x0644, 0x0647, 0x0645, 0x062C, 0x0645, 0x062D, 0x0645, 0x062E, 0x0645, 0x0645, 0x0646, 0x062C,
+ 0x0646, 0x062D, 0x0646, 0x062E, 0x0646, 0x0645, 0x0646, 0x0647, 0x0647, 0x062C, 0x0647, 0x0645, 0x0647, 0x0670, 0x064A, 0x062C,
+ 0x064A, 0x062D, 0x064A, 0x062E, 0x064A, 0x0645, 0x064A, 0x0647, 0x0626, 0x0645, 0x0626, 0x0647, 0x0628, 0x0645, 0x0628, 0x0647,
+ 0x062A, 0x0645, 0x062A, 0x0647, 0x062B, 0x0645, 0x062B, 0x0647, 0x0633, 0x0645, 0x0633, 0x0647, 0x0634, 0x0645, 0x0634, 0x0647,
+ 0x0643, 0x0644, 0x0643, 0x0645, 0x0644, 0x0645, 0x0646, 0x0645, 0x0646, 0x0647, 0x064A, 0x0645, 0x064A, 0x0647, 0x0637, 0x0649,
+ 0x0637, 0x064A, 0x0639, 0x0649, 0x0639, 0x064A, 0x063A, 0x0649, 0x063A, 0x064A, 0x0633, 0x0649, 0x0633, 0x064A, 0x0634, 0x0649,
+ 0x0634, 0x064A, 0x062D, 0x0649, 0x062D, 0x064A, 0x062C, 0x0649, 0x062C, 0x064A, 0x062E, 0x0649, 0x062E, 0x064A, 0x0635, 0x0649,
+ 0x0635, 0x064A, 0x0636, 0x0649, 0x0636, 0x064A, 0x0634, 0x062C, 0x0634, 0x062D, 0x0634, 0x062E, 0x0634, 0x0645, 0x0634, 0x0631,
+ 0x0633, 0x0631, 0x0635, 0x0631, 0x0636, 0x0631, 0x0637, 0x0649, 0x0637, 0x064A, 0x0639, 0x0649, 0x0639, 0x064A, 0x063A, 0x0649,
+ 0x063A, 0x064A, 0x0633, 0x0649, 0x0633, 0x064A, 0x0634, 0x0649, 0x0634, 0x064A, 0x062D, 0x0649, 0x062D, 0x064A, 0x062C, 0x0649,
+ 0x062C, 0x064A, 0x062E, 0x0649, 0x062E, 0x064A, 0x0635, 0x0649, 0x0635, 0x064A, 0x0636, 0x0649, 0x0636, 0x064A, 0x0634, 0x062C,
+ 0x0634, 0x062D, 0x0634, 0x062E, 0x0634, 0x0645, 0x0634, 0x0631, 0x0633, 0x0631, 0x0635, 0x0631, 0x0636, 0x0631, 0x0634, 0x062C,
+ 0x0634, 0x062D, 0x0634, 0x062E, 0x0634, 0x0645, 0x0633, 0x0647, 0x0634, 0x0647, 0x0637, 0x0645, 0x0633, 0x062C, 0x0633, 0x062D,
+ 0x0633, 0x062E, 0x0634, 0x062C, 0x0634, 0x062D, 0x0634, 0x062E, 0x0637, 0x0645, 0x0638, 0x0645, 0x0627, 0x064B, 0x0627, 0x064B,
+ 0x0640, 0x064B, 0x0640, 0x064E, 0x0640, 0x064F, 0x0640, 0x0650, 0x0640, 0x0651, 0x0640, 0x0652, 0x0644, 0x0622, 0x0644, 0x0622,
+ 0x0644, 0x0623, 0x0644, 0x0623, 0x0644, 0x0625, 0x0644, 0x0625, 0x0644, 0x0627, 0x0644, 0x0627
+};
+extern const FX_WCHAR g_UnicodeData_Normalization_Map3[1164] = {
+ 0x0031, 0x002F, 0x0034, 0x0031, 0x002F, 0x0032, 0x0033, 0x002F, 0x0034, 0x002E, 0x002E, 0x002E, 0x2032, 0x2032, 0x2032, 0x2035,
+ 0x2035, 0x2035, 0x0061, 0x002F, 0x0063, 0x0061, 0x002F, 0x0073, 0x0063, 0x002F, 0x006F, 0x0063, 0x002F, 0x0075, 0x0054, 0x0045,
+ 0x004C, 0x0046, 0x0041, 0x0058, 0x0031, 0x002F, 0x0037, 0x0031, 0x002F, 0x0039, 0x0031, 0x002F, 0x0033, 0x0032, 0x002F, 0x0033,
+ 0x0031, 0x002F, 0x0035, 0x0032, 0x002F, 0x0035, 0x0033, 0x002F, 0x0035, 0x0034, 0x002F, 0x0035, 0x0031, 0x002F, 0x0036, 0x0035,
+ 0x002F, 0x0036, 0x0031, 0x002F, 0x0038, 0x0033, 0x002F, 0x0038, 0x0035, 0x002F, 0x0038, 0x0037, 0x002F, 0x0038, 0x0049, 0x0049,
+ 0x0049, 0x0056, 0x0049, 0x0049, 0x0058, 0x0049, 0x0049, 0x0069, 0x0069, 0x0069, 0x0076, 0x0069, 0x0069, 0x0078, 0x0069, 0x0069,
+ 0x0030, 0x2044, 0x0033, 0x222B, 0x222B, 0x222B, 0x222E, 0x222E, 0x222E, 0x004E, 0x0055, 0x004C, 0x0053, 0x004F, 0x0048, 0x0053,
+ 0x0054, 0x0058, 0x0045, 0x0054, 0x0058, 0x0045, 0x004F, 0x0054, 0x0045, 0x004E, 0x0051, 0x0041, 0x0043, 0x004B, 0x0042, 0x0045,
+ 0x004C, 0x0044, 0x004C, 0x0045, 0x0044, 0x0043, 0x0031, 0x0044, 0x0043, 0x0032, 0x0044, 0x0043, 0x0033, 0x0044, 0x0043, 0x0034,
+ 0x004E, 0x0041, 0x004B, 0x0053, 0x0059, 0x004E, 0x0045, 0x0054, 0x0042, 0x0043, 0x0041, 0x004E, 0x0053, 0x0055, 0x0042, 0x0045,
+ 0x0053, 0x0043, 0x0044, 0x0045, 0x004C, 0x0028, 0x0031, 0x0029, 0x0028, 0x0032, 0x0029, 0x0028, 0x0033, 0x0029, 0x0028, 0x0034,
+ 0x0029, 0x0028, 0x0035, 0x0029, 0x0028, 0x0036, 0x0029, 0x0028, 0x0037, 0x0029, 0x0028, 0x0038, 0x0029, 0x0028, 0x0039, 0x0029,
+ 0x0031, 0x0030, 0x002E, 0x0031, 0x0031, 0x002E, 0x0031, 0x0032, 0x002E, 0x0031, 0x0033, 0x002E, 0x0031, 0x0034, 0x002E, 0x0031,
+ 0x0035, 0x002E, 0x0031, 0x0036, 0x002E, 0x0031, 0x0037, 0x002E, 0x0031, 0x0038, 0x002E, 0x0031, 0x0039, 0x002E, 0x0032, 0x0030,
+ 0x002E, 0x0028, 0x0061, 0x0029, 0x0028, 0x0062, 0x0029, 0x0028, 0x0063, 0x0029, 0x0028, 0x0064, 0x0029, 0x0028, 0x0065, 0x0029,
+ 0x0028, 0x0066, 0x0029, 0x0028, 0x0067, 0x0029, 0x0028, 0x0068, 0x0029, 0x0028, 0x0069, 0x0029, 0x0028, 0x006A, 0x0029, 0x0028,
+ 0x006B, 0x0029, 0x0028, 0x006C, 0x0029, 0x0028, 0x006D, 0x0029, 0x0028, 0x006E, 0x0029, 0x0028, 0x006F, 0x0029, 0x0028, 0x0070,
+ 0x0029, 0x0028, 0x0071, 0x0029, 0x0028, 0x0072, 0x0029, 0x0028, 0x0073, 0x0029, 0x0028, 0x0074, 0x0029, 0x0028, 0x0075, 0x0029,
+ 0x0028, 0x0076, 0x0029, 0x0028, 0x0077, 0x0029, 0x0028, 0x0078, 0x0029, 0x0028, 0x0079, 0x0029, 0x0028, 0x007A, 0x0029, 0x003A,
+ 0x003A, 0x003D, 0x003D, 0x003D, 0x003D, 0x0028, 0x1100, 0x0029, 0x0028, 0x1102, 0x0029, 0x0028, 0x1103, 0x0029, 0x0028, 0x1105,
+ 0x0029, 0x0028, 0x1106, 0x0029, 0x0028, 0x1107, 0x0029, 0x0028, 0x1109, 0x0029, 0x0028, 0x110B, 0x0029, 0x0028, 0x110C, 0x0029,
+ 0x0028, 0x110E, 0x0029, 0x0028, 0x110F, 0x0029, 0x0028, 0x1110, 0x0029, 0x0028, 0x1111, 0x0029, 0x0028, 0x1112, 0x0029, 0x0028,
+ 0x4E00, 0x0029, 0x0028, 0x4E8C, 0x0029, 0x0028, 0x4E09, 0x0029, 0x0028, 0x56DB, 0x0029, 0x0028, 0x4E94, 0x0029, 0x0028, 0x516D,
+ 0x0029, 0x0028, 0x4E03, 0x0029, 0x0028, 0x516B, 0x0029, 0x0028, 0x4E5D, 0x0029, 0x0028, 0x5341, 0x0029, 0x0028, 0x6708, 0x0029,
+ 0x0028, 0x706B, 0x0029, 0x0028, 0x6C34, 0x0029, 0x0028, 0x6728, 0x0029, 0x0028, 0x91D1, 0x0029, 0x0028, 0x571F, 0x0029, 0x0028,
+ 0x65E5, 0x0029, 0x0028, 0x682A, 0x0029, 0x0028, 0x6709, 0x0029, 0x0028, 0x793E, 0x0029, 0x0028, 0x540D, 0x0029, 0x0028, 0x7279,
+ 0x0029, 0x0028, 0x8CA1, 0x0029, 0x0028, 0x795D, 0x0029, 0x0028, 0x52B4, 0x0029, 0x0028, 0x4EE3, 0x0029, 0x0028, 0x547C, 0x0029,
+ 0x0028, 0x5B66, 0x0029, 0x0028, 0x76E3, 0x0029, 0x0028, 0x4F01, 0x0029, 0x0028, 0x8CC7, 0x0029, 0x0028, 0x5354, 0x0029, 0x0028,
+ 0x796D, 0x0029, 0x0028, 0x4F11, 0x0029, 0x0028, 0x81EA, 0x0029, 0x0028, 0x81F3, 0x0029, 0x0050, 0x0054, 0x0045, 0x0031, 0x0030,
+ 0x6708, 0x0031, 0x0031, 0x6708, 0x0031, 0x0032, 0x6708, 0x0065, 0x0072, 0x0067, 0x004C, 0x0054, 0x0044, 0x30A2, 0x30FC, 0x30EB,
+ 0x30A4, 0x30F3, 0x30C1, 0x30A6, 0x30A9, 0x30F3, 0x30AA, 0x30F3, 0x30B9, 0x30AA, 0x30FC, 0x30E0, 0x30AB, 0x30A4, 0x30EA, 0x30AC,
+ 0x30ED, 0x30F3, 0x30AC, 0x30F3, 0x30DE, 0x30AE, 0x30CB, 0x30FC, 0x30B0, 0x30E9, 0x30E0, 0x30B1, 0x30FC, 0x30B9, 0x30B3, 0x30EB,
+ 0x30CA, 0x30B3, 0x30FC, 0x30DD, 0x30BB, 0x30F3, 0x30C1, 0x30BB, 0x30F3, 0x30C8, 0x30C0, 0x30FC, 0x30B9, 0x30CE, 0x30C3, 0x30C8,
+ 0x30CF, 0x30A4, 0x30C4, 0x30D1, 0x30FC, 0x30C4, 0x30D4, 0x30AF, 0x30EB, 0x30D5, 0x30E9, 0x30F3, 0x30DA, 0x30CB, 0x30D2, 0x30D8,
+ 0x30EB, 0x30C4, 0x30DA, 0x30F3, 0x30B9, 0x30DA, 0x30FC, 0x30B8, 0x30D9, 0x30FC, 0x30BF, 0x30DC, 0x30EB, 0x30C8, 0x30DD, 0x30F3,
+ 0x30C9, 0x30DB, 0x30FC, 0x30EB, 0x30DB, 0x30FC, 0x30F3, 0x30DE, 0x30A4, 0x30EB, 0x30DE, 0x30C3, 0x30CF, 0x30DE, 0x30EB, 0x30AF,
+ 0x30E4, 0x30FC, 0x30C9, 0x30E4, 0x30FC, 0x30EB, 0x30E6, 0x30A2, 0x30F3, 0x30EB, 0x30D4, 0x30FC, 0x30EF, 0x30C3, 0x30C8, 0x0031,
+ 0x0030, 0x70B9, 0x0031, 0x0031, 0x70B9, 0x0031, 0x0032, 0x70B9, 0x0031, 0x0033, 0x70B9, 0x0031, 0x0034, 0x70B9, 0x0031, 0x0035,
+ 0x70B9, 0x0031, 0x0036, 0x70B9, 0x0031, 0x0037, 0x70B9, 0x0031, 0x0038, 0x70B9, 0x0031, 0x0039, 0x70B9, 0x0032, 0x0030, 0x70B9,
+ 0x0032, 0x0031, 0x70B9, 0x0032, 0x0032, 0x70B9, 0x0032, 0x0033, 0x70B9, 0x0032, 0x0034, 0x70B9, 0x0068, 0x0050, 0x0061, 0x0062,
+ 0x0061, 0x0072, 0x0064, 0x006D, 0x00B2, 0x0064, 0x006D, 0x00B3, 0x0063, 0x0061, 0x006C, 0x006B, 0x0048, 0x007A, 0x004D, 0x0048,
+ 0x007A, 0x0047, 0x0048, 0x007A, 0x0054, 0x0048, 0x007A, 0x006D, 0x006D, 0x00B2, 0x0063, 0x006D, 0x00B2, 0x006B, 0x006D, 0x00B2,
+ 0x006D, 0x006D, 0x00B3, 0x0063, 0x006D, 0x00B3, 0x006B, 0x006D, 0x00B3, 0x006D, 0x2215, 0x0073, 0x006B, 0x0050, 0x0061, 0x004D,
+ 0x0050, 0x0061, 0x0047, 0x0050, 0x0061, 0x0072, 0x0061, 0x0064, 0x0043, 0x006F, 0x002E, 0x006C, 0x006F, 0x0067, 0x006D, 0x0069,
+ 0x006C, 0x006D, 0x006F, 0x006C, 0x0050, 0x0050, 0x004D, 0x0056, 0x2215, 0x006D, 0x0041, 0x2215, 0x006D, 0x0031, 0x0030, 0x65E5,
+ 0x0031, 0x0031, 0x65E5, 0x0031, 0x0032, 0x65E5, 0x0031, 0x0033, 0x65E5, 0x0031, 0x0034, 0x65E5, 0x0031, 0x0035, 0x65E5, 0x0031,
+ 0x0036, 0x65E5, 0x0031, 0x0037, 0x65E5, 0x0031, 0x0038, 0x65E5, 0x0031, 0x0039, 0x65E5, 0x0032, 0x0030, 0x65E5, 0x0032, 0x0031,
+ 0x65E5, 0x0032, 0x0032, 0x65E5, 0x0032, 0x0033, 0x65E5, 0x0032, 0x0034, 0x65E5, 0x0032, 0x0035, 0x65E5, 0x0032, 0x0036, 0x65E5,
+ 0x0032, 0x0037, 0x65E5, 0x0032, 0x0038, 0x65E5, 0x0032, 0x0039, 0x65E5, 0x0033, 0x0030, 0x65E5, 0x0033, 0x0031, 0x65E5, 0x0067,
+ 0x0061, 0x006C, 0x0066, 0x0066, 0x0069, 0x0066, 0x0066, 0x006C, 0x0640, 0x064E, 0x0651, 0x0640, 0x064F, 0x0651, 0x0640, 0x0650,
+ 0x0651, 0x062A, 0x062C, 0x0645, 0x062A, 0x062D, 0x062C, 0x062A, 0x062D, 0x062C, 0x062A, 0x062D, 0x0645, 0x062A, 0x062E, 0x0645,
+ 0x062A, 0x0645, 0x062C, 0x062A, 0x0645, 0x062D, 0x062A, 0x0645, 0x062E, 0x062C, 0x0645, 0x062D, 0x062C, 0x0645, 0x062D, 0x062D,
+ 0x0645, 0x064A, 0x062D, 0x0645, 0x0649, 0x0633, 0x062D, 0x062C, 0x0633, 0x062C, 0x062D, 0x0633, 0x062C, 0x0649, 0x0633, 0x0645,
+ 0x062D, 0x0633, 0x0645, 0x062D, 0x0633, 0x0645, 0x062C, 0x0633, 0x0645, 0x0645, 0x0633, 0x0645, 0x0645, 0x0635, 0x062D, 0x062D,
+ 0x0635, 0x062D, 0x062D, 0x0635, 0x0645, 0x0645, 0x0634, 0x062D, 0x0645, 0x0634, 0x062D, 0x0645, 0x0634, 0x062C, 0x064A, 0x0634,
+ 0x0645, 0x062E, 0x0634, 0x0645, 0x062E, 0x0634, 0x0645, 0x0645, 0x0634, 0x0645, 0x0645, 0x0636, 0x062D, 0x0649, 0x0636, 0x062E,
+ 0x0645, 0x0636, 0x062E, 0x0645, 0x0637, 0x0645, 0x062D, 0x0637, 0x0645, 0x062D, 0x0637, 0x0645, 0x0645, 0x0637, 0x0645, 0x064A,
+ 0x0639, 0x062C, 0x0645, 0x0639, 0x0645, 0x0645, 0x0639, 0x0645, 0x0645, 0x0639, 0x0645, 0x0649, 0x063A, 0x0645, 0x0645, 0x063A,
+ 0x0645, 0x064A, 0x063A, 0x0645, 0x0649, 0x0641, 0x062E, 0x0645, 0x0641, 0x062E, 0x0645, 0x0642, 0x0645, 0x062D, 0x0642, 0x0645,
+ 0x0645, 0x0644, 0x062D, 0x0645, 0x0644, 0x062D, 0x064A, 0x0644, 0x062D, 0x0649, 0x0644, 0x062C, 0x062C, 0x0644, 0x062C, 0x062C,
+ 0x0644, 0x062E, 0x0645, 0x0644, 0x062E, 0x0645, 0x0644, 0x0645, 0x062D, 0x0644, 0x0645, 0x062D, 0x0645, 0x062D, 0x062C, 0x0645,
+ 0x062D, 0x0645, 0x0645, 0x062D, 0x064A, 0x0645, 0x062C, 0x062D, 0x0645, 0x062C, 0x0645, 0x0645, 0x062E, 0x062C, 0x0645, 0x062E,
+ 0x0645, 0x0645, 0x062C, 0x062E, 0x0647, 0x0645, 0x062C, 0x0647, 0x0645, 0x0645, 0x0646, 0x062D, 0x0645, 0x0646, 0x062D, 0x0649,
+ 0x0646, 0x062C, 0x0645, 0x0646, 0x062C, 0x0645, 0x0646, 0x062C, 0x0649, 0x0646, 0x0645, 0x064A, 0x0646, 0x0645, 0x0649, 0x064A,
+ 0x0645, 0x0645, 0x064A, 0x0645, 0x0645, 0x0628, 0x062E, 0x064A, 0x062A, 0x062C, 0x064A, 0x062A, 0x062C, 0x0649, 0x062A, 0x062E,
+ 0x064A, 0x062A, 0x062E, 0x0649, 0x062A, 0x0645, 0x064A, 0x062A, 0x0645, 0x0649, 0x062C, 0x0645, 0x064A, 0x062C, 0x062D, 0x0649,
+ 0x062C, 0x0645, 0x0649, 0x0633, 0x062E, 0x0649, 0x0635, 0x062D, 0x064A, 0x0634, 0x062D, 0x064A, 0x0636, 0x062D, 0x064A, 0x0644,
+ 0x062C, 0x064A, 0x0644, 0x0645, 0x064A, 0x064A, 0x062D, 0x064A, 0x064A, 0x062C, 0x064A, 0x064A, 0x0645, 0x064A, 0x0645, 0x0645,
+ 0x064A, 0x0642, 0x0645, 0x064A, 0x0646, 0x062D, 0x064A, 0x0642, 0x0645, 0x062D, 0x0644, 0x062D, 0x0645, 0x0639, 0x0645, 0x064A,
+ 0x0643, 0x0645, 0x064A, 0x0646, 0x062C, 0x062D, 0x0645, 0x062E, 0x064A, 0x0644, 0x062C, 0x0645, 0x0643, 0x0645, 0x0645, 0x0644,
+ 0x062C, 0x0645, 0x0646, 0x062C, 0x062D, 0x062C, 0x062D, 0x064A, 0x062D, 0x062C, 0x064A, 0x0645, 0x062C, 0x064A, 0x0641, 0x0645,
+ 0x064A, 0x0628, 0x062D, 0x064A, 0x0643, 0x0645, 0x0645, 0x0639, 0x062C, 0x0645, 0x0635, 0x0645, 0x0645, 0x0633, 0x062E, 0x064A,
+ 0x0646, 0x062C, 0x064A, 0x0635, 0x0644, 0x06D2, 0x0642, 0x0644, 0x06D2, 0x0635, 0x0644, 0x0649
+};
+extern const FX_WCHAR g_UnicodeData_Normalization_Map4[488] = {
+ 0x0004, 0x2032, 0x2032, 0x2032, 0x2032, 0x0004, 0x0031, 0x002F, 0x0031, 0x0030, 0x0004, 0x0056, 0x0049, 0x0049, 0x0049, 0x0004,
+ 0x0076, 0x0069, 0x0069, 0x0069, 0x0004, 0x0028, 0x0031, 0x0030, 0x0029, 0x0004, 0x0028, 0x0031, 0x0031, 0x0029, 0x0004, 0x0028,
+ 0x0031, 0x0032, 0x0029, 0x0004, 0x0028, 0x0031, 0x0033, 0x0029, 0x0004, 0x0028, 0x0031, 0x0034, 0x0029, 0x0004, 0x0028, 0x0031,
+ 0x0035, 0x0029, 0x0004, 0x0028, 0x0031, 0x0036, 0x0029, 0x0004, 0x0028, 0x0031, 0x0037, 0x0029, 0x0004, 0x0028, 0x0031, 0x0038,
+ 0x0029, 0x0004, 0x0028, 0x0031, 0x0039, 0x0029, 0x0004, 0x0028, 0x0032, 0x0030, 0x0029, 0x0004, 0x222B, 0x222B, 0x222B, 0x222B,
+ 0x0004, 0x0028, 0x1100, 0x1161, 0x0029, 0x0004, 0x0028, 0x1102, 0x1161, 0x0029, 0x0004, 0x0028, 0x1103, 0x1161, 0x0029, 0x0004,
+ 0x0028, 0x1105, 0x1161, 0x0029, 0x0004, 0x0028, 0x1106, 0x1161, 0x0029, 0x0004, 0x0028, 0x1107, 0x1161, 0x0029, 0x0004, 0x0028,
+ 0x1109, 0x1161, 0x0029, 0x0004, 0x0028, 0x110B, 0x1161, 0x0029, 0x0004, 0x0028, 0x110C, 0x1161, 0x0029, 0x0004, 0x0028, 0x110E,
+ 0x1161, 0x0029, 0x0004, 0x0028, 0x110F, 0x1161, 0x0029, 0x0004, 0x0028, 0x1110, 0x1161, 0x0029, 0x0004, 0x0028, 0x1111, 0x1161,
+ 0x0029, 0x0004, 0x0028, 0x1112, 0x1161, 0x0029, 0x0004, 0x0028, 0x110C, 0x116E, 0x0029, 0x0007, 0x0028, 0x110B, 0x1169, 0x110C,
+ 0x1165, 0x11AB, 0x0029, 0x0006, 0x0028, 0x110B, 0x1169, 0x1112, 0x116E, 0x0029, 0x0005, 0x110E, 0x1161, 0x11B7, 0x1100, 0x1169,
+ 0x0004, 0x110C, 0x116E, 0x110B, 0x1174, 0x0004, 0x30A2, 0x30D1, 0x30FC, 0x30C8, 0x0004, 0x30A2, 0x30EB, 0x30D5, 0x30A1, 0x0004,
+ 0x30A2, 0x30F3, 0x30DA, 0x30A2, 0x0004, 0x30A4, 0x30CB, 0x30F3, 0x30B0, 0x0005, 0x30A8, 0x30B9, 0x30AF, 0x30FC, 0x30C9, 0x0004,
+ 0x30A8, 0x30FC, 0x30AB, 0x30FC, 0x0004, 0x30AB, 0x30E9, 0x30C3, 0x30C8, 0x0004, 0x30AB, 0x30ED, 0x30EA, 0x30FC, 0x0004, 0x30AD,
+ 0x30E5, 0x30EA, 0x30FC, 0x0004, 0x30AE, 0x30EB, 0x30C0, 0x30FC, 0x0005, 0x30AD, 0x30ED, 0x30B0, 0x30E9, 0x30E0, 0x0006, 0x30AD,
+ 0x30ED, 0x30E1, 0x30FC, 0x30C8, 0x30EB, 0x0005, 0x30AD, 0x30ED, 0x30EF, 0x30C3, 0x30C8, 0x0005, 0x30B0, 0x30E9, 0x30E0, 0x30C8,
+ 0x30F3, 0x0005, 0x30AF, 0x30EB, 0x30BC, 0x30A4, 0x30ED, 0x0004, 0x30AF, 0x30ED, 0x30FC, 0x30CD, 0x0004, 0x30B5, 0x30A4, 0x30AF,
+ 0x30EB, 0x0005, 0x30B5, 0x30F3, 0x30C1, 0x30FC, 0x30E0, 0x0004, 0x30B7, 0x30EA, 0x30F3, 0x30B0, 0x0005, 0x30D1, 0x30FC, 0x30BB,
+ 0x30F3, 0x30C8, 0x0004, 0x30D0, 0x30FC, 0x30EC, 0x30EB, 0x0005, 0x30D4, 0x30A2, 0x30B9, 0x30C8, 0x30EB, 0x0005, 0x30D5, 0x30A1,
+ 0x30E9, 0x30C3, 0x30C9, 0x0004, 0x30D5, 0x30A3, 0x30FC, 0x30C8, 0x0005, 0x30D6, 0x30C3, 0x30B7, 0x30A7, 0x30EB, 0x0005, 0x30D8,
+ 0x30AF, 0x30BF, 0x30FC, 0x30EB, 0x0004, 0x30DD, 0x30A4, 0x30F3, 0x30C8, 0x0004, 0x30DE, 0x30A4, 0x30AF, 0x30ED, 0x0005, 0x30DE,
+ 0x30F3, 0x30B7, 0x30E7, 0x30F3, 0x0004, 0x30DF, 0x30AF, 0x30ED, 0x30F3, 0x0005, 0x30DF, 0x30EA, 0x30D0, 0x30FC, 0x30EB, 0x0004,
+ 0x30E1, 0x30AC, 0x30C8, 0x30F3, 0x0004, 0x30E1, 0x30FC, 0x30C8, 0x30EB, 0x0004, 0x30EA, 0x30C3, 0x30C8, 0x30EB, 0x0004, 0x30EB,
+ 0x30FC, 0x30D6, 0x30EB, 0x0005, 0x30EC, 0x30F3, 0x30C8, 0x30B2, 0x30F3, 0x0004, 0x682A, 0x5F0F, 0x4F1A, 0x793E, 0x0004, 0x006B,
+ 0x0063, 0x0061, 0x006C, 0x0004, 0x006D, 0x2215, 0x0073, 0x00B2, 0x0005, 0x0072, 0x0061, 0x0064, 0x2215, 0x0073, 0x0006, 0x0072,
+ 0x0061, 0x0064, 0x2215, 0x0073, 0x00B2, 0x0004, 0x0061, 0x002E, 0x006D, 0x002E, 0x0004, 0x0043, 0x2215, 0x006B, 0x0067, 0x0004,
+ 0x0070, 0x002E, 0x006D, 0x002E, 0x0004, 0x0627, 0x0644, 0x0644, 0x0647, 0x0004, 0x0627, 0x0643, 0x0628, 0x0631, 0x0004, 0x0645,
+ 0x062D, 0x0645, 0x062F, 0x0004, 0x0635, 0x0644, 0x0639, 0x0645, 0x0004, 0x0631, 0x0633, 0x0648, 0x0644, 0x0004, 0x0639, 0x0644,
+ 0x064A, 0x0647, 0x0004, 0x0648, 0x0633, 0x0644, 0x0645, 0x0012, 0x0635, 0x0644, 0x0649, 0x0020, 0x0627, 0x0644, 0x0644, 0x0647,
+ 0x0020, 0x0639, 0x0644, 0x064A, 0x0647, 0x0020, 0x0648, 0x0633, 0x0644, 0x0645, 0x0008, 0x062C, 0x0644, 0x0020, 0x062C, 0x0644,
+ 0x0627, 0x0644, 0x0647, 0x0004, 0x0631, 0x06CC, 0x0627, 0x0644
+};
diff --git a/core/src/fx_freetype.h b/core/src/fx_freetype.h
index 7c50f68ca3..d160036042 100644
--- a/core/src/fx_freetype.h
+++ b/core/src/fx_freetype.h
@@ -1,15 +1,15 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef _FX_SRC_FREETYPE_H_
-#define _FX_SRC_FREETYPE_H_
-#include "./fxge/fx_freetype/fxft2.5.01/include/ft2build.h"
-#include "./fxge/fx_freetype/fxft2.5.01/include/freetype/freetype.h"
-#include "./fxge/fx_freetype/fxft2.5.01/include/freetype/ftoutln.h"
-#include "./fxge/fx_freetype/fxft2.5.01/include/freetype/ftmm.h"
-#include "./fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftobjs.h"
-#include "./fxge/fx_freetype/fxft2.5.01/include/freetype/tttables.h"
-#endif
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FX_SRC_FREETYPE_H_
+#define _FX_SRC_FREETYPE_H_
+#include "./fxge/fx_freetype/fxft2.5.01/include/ft2build.h"
+#include "./fxge/fx_freetype/fxft2.5.01/include/freetype/freetype.h"
+#include "./fxge/fx_freetype/fxft2.5.01/include/freetype/ftoutln.h"
+#include "./fxge/fx_freetype/fxft2.5.01/include/freetype/ftmm.h"
+#include "./fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftobjs.h"
+#include "./fxge/fx_freetype/fxft2.5.01/include/freetype/tttables.h"
+#endif
diff --git a/core/src/fx_jpeglib.h b/core/src/fx_jpeglib.h
index 1ce2172328..028a5ee8b9 100644
--- a/core/src/fx_jpeglib.h
+++ b/core/src/fx_jpeglib.h
@@ -1,10 +1,10 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef _FX_SRC_JPEGLIB_H_
-#define _FX_SRC_JPEGLIB_H_
-#include "./fxcodec/libjpeg/jpeglib.h"
-#endif
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FX_SRC_JPEGLIB_H_
+#define _FX_SRC_JPEGLIB_H_
+#include "./fxcodec/libjpeg/jpeglib.h"
+#endif
diff --git a/core/src/fx_zlib.h b/core/src/fx_zlib.h
index 3c6c5a8e78..cc5560bf05 100644
--- a/core/src/fx_zlib.h
+++ b/core/src/fx_zlib.h
@@ -1,10 +1,10 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef _FX_SRC_ZLIB_H_
-#define _FX_SRC_ZLIB_H_
-#include "./fxcodec/fx_zlib/zlib_v128/zlib.h"
-#endif
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FX_SRC_ZLIB_H_
+#define _FX_SRC_ZLIB_H_
+#include "./fxcodec/fx_zlib/zlib_v128/zlib.h"
+#endif
diff --git a/core/src/fxcodec/codec/codec_int.h b/core/src/fxcodec/codec/codec_int.h
index 571af61470..638d96db85 100644
--- a/core/src/fxcodec/codec/codec_int.h
+++ b/core/src/fxcodec/codec/codec_int.h
@@ -1,270 +1,270 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include <limits.h>
-class CCodec_BasicModule : public ICodec_BasicModule
-{
-public:
- virtual FX_BOOL RunLengthEncode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf,
- FX_DWORD& dest_size);
- virtual FX_BOOL A85Encode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf,
- FX_DWORD& dest_size);
- virtual ICodec_ScanlineDecoder* CreateRunLengthDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,
- int nComps, int bpc);
-};
-struct CCodec_ImageDataCache {
- int m_Width, m_Height;
- int m_nCachedLines;
- FX_BYTE m_Data;
-};
-class CCodec_ScanlineDecoder : public ICodec_ScanlineDecoder
-{
-public:
-
- CCodec_ScanlineDecoder();
-
- virtual ~CCodec_ScanlineDecoder();
-
- virtual FX_DWORD GetSrcOffset()
- {
- return -1;
- }
-
- virtual void DownScale(int dest_width, int dest_height);
-
- FX_LPBYTE GetScanline(int line);
-
- FX_BOOL SkipToScanline(int line, IFX_Pause* pPause);
-
- int GetWidth()
- {
- return m_OutputWidth;
- }
-
- int GetHeight()
- {
- return m_OutputHeight;
- }
-
- int CountComps()
- {
- return m_nComps;
- }
-
- int GetBPC()
- {
- return m_bpc;
- }
-
- FX_BOOL IsColorTransformed()
- {
- return m_bColorTransformed;
- }
-
- void ClearImageData()
- {
- if (m_pDataCache) {
- FX_Free(m_pDataCache);
- }
- m_pDataCache = NULL;
- }
-protected:
-
- int m_OrigWidth;
-
- int m_OrigHeight;
-
- int m_DownScale;
-
- int m_OutputWidth;
-
- int m_OutputHeight;
-
- int m_nComps;
-
- int m_bpc;
-
- int m_Pitch;
-
- FX_BOOL m_bColorTransformed;
-
- FX_LPBYTE ReadNextLine();
-
- virtual FX_BOOL v_Rewind() = 0;
-
- virtual FX_LPBYTE v_GetNextLine() = 0;
-
- virtual void v_DownScale(int dest_width, int dest_height) = 0;
-
- int m_NextLine;
-
- FX_LPBYTE m_pLastScanline;
-
- CCodec_ImageDataCache* m_pDataCache;
-};
-class CCodec_FaxModule : public ICodec_FaxModule
-{
-public:
- virtual ICodec_ScanlineDecoder* CreateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,
- int K, FX_BOOL EndOfLine, FX_BOOL EncodedByteAlign, FX_BOOL BlackIs1, int Columns, int Rows);
- FX_BOOL Encode(FX_LPCBYTE src_buf, int width, int height, int pitch, FX_LPBYTE& dest_buf, FX_DWORD& dest_size);
-};
-class CCodec_FlateModule : public ICodec_FlateModule
-{
-public:
- virtual ICodec_ScanlineDecoder* CreateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,
- int nComps, int bpc, int predictor, int Colors, int BitsPerComponent, int Columns);
- virtual FX_DWORD FlateOrLZWDecode(FX_BOOL bLZW, const FX_BYTE* src_buf, FX_DWORD src_size, FX_BOOL bEarlyChange,
- int predictor, int Colors, int BitsPerComponent, int Columns,
- FX_DWORD estimated_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size);
- virtual FX_BOOL Encode(const FX_BYTE* src_buf, FX_DWORD src_size,
- int predictor, int Colors, int BitsPerComponent, int Columns,
- FX_LPBYTE& dest_buf, FX_DWORD& dest_size);
- virtual FX_BOOL Encode(FX_LPCBYTE src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size);
-};
-class CCodec_JpegModule : public ICodec_JpegModule
-{
-public:
- CCodec_JpegModule() : m_pExtProvider(NULL) {}
- void SetPovider(IFX_JpegProvider* pJP)
- {
- m_pExtProvider = pJP;
- }
- ICodec_ScanlineDecoder* CreateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size,
- int width, int height, int nComps, FX_BOOL ColorTransform);
- FX_BOOL LoadInfo(FX_LPCBYTE src_buf, FX_DWORD src_size, int& width, int& height,
- int& num_components, int& bits_per_components, FX_BOOL& color_transform,
- FX_LPBYTE* icc_buf_ptr, FX_DWORD* icc_length);
- FX_BOOL Encode(const CFX_DIBSource* pSource, FX_LPBYTE& dest_buf, FX_STRSIZE& dest_size, int quality, FX_LPCBYTE icc_buf, FX_DWORD icc_length);
- virtual void* Start();
- virtual void Finish(void* pContext);
- virtual void Input(void* pContext, FX_LPCBYTE src_buf, FX_DWORD src_size);
- virtual int ReadHeader(void* pContext, int* width, int* height, int* nComps);
- virtual FX_BOOL StartScanline(void* pContext, int down_scale);
- virtual FX_BOOL ReadScanline(void* pContext, FX_LPBYTE dest_buf);
- virtual FX_DWORD GetAvailInput(void* pContext, FX_LPBYTE* avail_buf_ptr);
-protected:
- IFX_JpegProvider* m_pExtProvider;
-};
-class CCodec_IccModule : public ICodec_IccModule
-{
-public:
- virtual IccCS GetProfileCS(FX_LPCBYTE pProfileData, unsigned int dwProfileSize);
- virtual IccCS GetProfileCS(IFX_FileRead* pFile);
- virtual FX_LPVOID CreateTransform(ICodec_IccModule::IccParam* pInputParam,
- ICodec_IccModule::IccParam* pOutputParam,
- ICodec_IccModule::IccParam* pProofParam = NULL,
- FX_DWORD dwIntent = Icc_INTENT_PERCEPTUAL,
- FX_DWORD dwFlag = Icc_FLAGS_DEFAULT,
- FX_DWORD dwPrfIntent = Icc_INTENT_ABSOLUTE_COLORIMETRIC,
- FX_DWORD dwPrfFlag = Icc_FLAGS_SOFTPROOFING
- );
- virtual FX_LPVOID CreateTransform_sRGB(FX_LPCBYTE pProfileData, unsigned int dwProfileSize, int nComponents, int intent = 0,
- FX_DWORD dwSrcFormat = Icc_FORMAT_DEFAULT);
- virtual FX_LPVOID CreateTransform_CMYK(FX_LPCBYTE pSrcProfileData, unsigned int dwSrcProfileSize, int nSrcComponents,
- FX_LPCBYTE pDstProfileData, unsigned int dwDstProfileSize, int intent = 0,
- FX_DWORD dwSrcFormat = Icc_FORMAT_DEFAULT,
- FX_DWORD dwDstFormat = Icc_FORMAT_DEFAULT
- );
- virtual void DestroyTransform(FX_LPVOID pTransform);
- virtual void Translate(FX_LPVOID pTransform, FX_FLOAT* pSrcValues, FX_FLOAT* pDestValues);
- virtual void TranslateScanline(FX_LPVOID pTransform, FX_LPBYTE pDest, FX_LPCBYTE pSrc, int pixels);
- virtual ~CCodec_IccModule();
-protected:
- CFX_MapByteStringToPtr m_MapTranform;
- CFX_MapByteStringToPtr m_MapProfile;
- typedef enum {
- Icc_CLASS_INPUT = 0,
- Icc_CLASS_OUTPUT,
- Icc_CLASS_PROOF,
- Icc_CLASS_MAX
- } Icc_CLASS;
- FX_LPVOID CreateProfile(ICodec_IccModule::IccParam* pIccParam, Icc_CLASS ic, CFX_BinaryBuf* pTransformKey);
-};
-class CCodec_JpxModule : public ICodec_JpxModule
-{
-public:
- CCodec_JpxModule();
- void* CreateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, FX_BOOL useColorSpace = FALSE);
- void GetImageInfo(FX_LPVOID ctx, FX_DWORD& width, FX_DWORD& height,
- FX_DWORD& codestream_nComps, FX_DWORD& output_nComps);
- FX_BOOL Decode(void* ctx, FX_LPBYTE dest_data, int pitch, FX_BOOL bTranslateColor, FX_LPBYTE offsets);
- void DestroyDecoder(void* ctx);
-};
-#include "../jbig2/JBig2_Context.h"
-class CPDF_Jbig2Interface : public CFX_Object, public CJBig2_Module
-{
-public:
- virtual void *JBig2_Malloc(FX_DWORD dwSize)
- {
- return FX_Alloc(FX_BYTE, dwSize);
- }
- virtual void *JBig2_Malloc2(FX_DWORD num, FX_DWORD dwSize)
- {
- if (dwSize && num >= UINT_MAX / dwSize) {
- return NULL;
- }
- return FX_Alloc(FX_BYTE, num * dwSize);
- }
- virtual void *JBig2_Malloc3(FX_DWORD num, FX_DWORD dwSize, FX_DWORD dwSize2)
- {
- if (dwSize2 && dwSize >= UINT_MAX / dwSize2) {
- return NULL;
- }
- FX_DWORD size = dwSize2 * dwSize;
- if (size && num >= UINT_MAX / size) {
- return NULL;
- }
- return FX_Alloc(FX_BYTE, num * size);
- }
- virtual void *JBig2_Realloc(FX_LPVOID pMem, FX_DWORD dwSize)
- {
- return FX_Realloc(FX_BYTE, pMem, dwSize);
- }
- virtual void JBig2_Free(FX_LPVOID pMem)
- {
- FX_Free(pMem);
- }
-};
-class CCodec_Jbig2Context : public CFX_Object
-{
-public:
- CCodec_Jbig2Context();
- ~CCodec_Jbig2Context() {};
- IFX_FileRead* m_file_ptr;
- FX_DWORD m_width;
- FX_DWORD m_height;
- FX_LPBYTE m_src_buf;
- FX_DWORD m_src_size;
- FX_LPCBYTE m_global_data;
- FX_DWORD m_global_size;
- FX_LPBYTE m_dest_buf;
- FX_DWORD m_dest_pitch;
- FX_BOOL m_bFileReader;
- IFX_Pause* m_pPause;
- CJBig2_Context* m_pContext;
- CJBig2_Image* m_dest_image;
-};
-class CCodec_Jbig2Module : public ICodec_Jbig2Module
-{
-public:
- CCodec_Jbig2Module() {};
- ~CCodec_Jbig2Module();
- FX_BOOL Decode(FX_DWORD width, FX_DWORD height, FX_LPCBYTE src_buf, FX_DWORD src_size,
- FX_LPCBYTE global_data, FX_DWORD global_size, FX_LPBYTE dest_buf, FX_DWORD dest_pitch);
- FX_BOOL Decode(IFX_FileRead* file_ptr,
- FX_DWORD& width, FX_DWORD& height, FX_DWORD& pitch, FX_LPBYTE& dest_buf);
- void* CreateJbig2Context();
- FXCODEC_STATUS StartDecode(void* pJbig2Context, FX_DWORD width, FX_DWORD height, FX_LPCBYTE src_buf, FX_DWORD src_size,
- FX_LPCBYTE global_data, FX_DWORD global_size, FX_LPBYTE dest_buf, FX_DWORD dest_pitch, IFX_Pause* pPause);
-
- FXCODEC_STATUS StartDecode(void* pJbig2Context, IFX_FileRead* file_ptr,
- FX_DWORD& width, FX_DWORD& height, FX_DWORD& pitch, FX_LPBYTE& dest_buf, IFX_Pause* pPause);
- FXCODEC_STATUS ContinueDecode(void* pJbig2Context, IFX_Pause* pPause);
- void DestroyJbig2Context(void* pJbig2Context);
- CPDF_Jbig2Interface m_Module;
-private:
-};
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include <limits.h>
+class CCodec_BasicModule : public ICodec_BasicModule
+{
+public:
+ virtual FX_BOOL RunLengthEncode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf,
+ FX_DWORD& dest_size);
+ virtual FX_BOOL A85Encode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf,
+ FX_DWORD& dest_size);
+ virtual ICodec_ScanlineDecoder* CreateRunLengthDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,
+ int nComps, int bpc);
+};
+struct CCodec_ImageDataCache {
+ int m_Width, m_Height;
+ int m_nCachedLines;
+ FX_BYTE m_Data;
+};
+class CCodec_ScanlineDecoder : public ICodec_ScanlineDecoder
+{
+public:
+
+ CCodec_ScanlineDecoder();
+
+ virtual ~CCodec_ScanlineDecoder();
+
+ virtual FX_DWORD GetSrcOffset()
+ {
+ return -1;
+ }
+
+ virtual void DownScale(int dest_width, int dest_height);
+
+ FX_LPBYTE GetScanline(int line);
+
+ FX_BOOL SkipToScanline(int line, IFX_Pause* pPause);
+
+ int GetWidth()
+ {
+ return m_OutputWidth;
+ }
+
+ int GetHeight()
+ {
+ return m_OutputHeight;
+ }
+
+ int CountComps()
+ {
+ return m_nComps;
+ }
+
+ int GetBPC()
+ {
+ return m_bpc;
+ }
+
+ FX_BOOL IsColorTransformed()
+ {
+ return m_bColorTransformed;
+ }
+
+ void ClearImageData()
+ {
+ if (m_pDataCache) {
+ FX_Free(m_pDataCache);
+ }
+ m_pDataCache = NULL;
+ }
+protected:
+
+ int m_OrigWidth;
+
+ int m_OrigHeight;
+
+ int m_DownScale;
+
+ int m_OutputWidth;
+
+ int m_OutputHeight;
+
+ int m_nComps;
+
+ int m_bpc;
+
+ int m_Pitch;
+
+ FX_BOOL m_bColorTransformed;
+
+ FX_LPBYTE ReadNextLine();
+
+ virtual FX_BOOL v_Rewind() = 0;
+
+ virtual FX_LPBYTE v_GetNextLine() = 0;
+
+ virtual void v_DownScale(int dest_width, int dest_height) = 0;
+
+ int m_NextLine;
+
+ FX_LPBYTE m_pLastScanline;
+
+ CCodec_ImageDataCache* m_pDataCache;
+};
+class CCodec_FaxModule : public ICodec_FaxModule
+{
+public:
+ virtual ICodec_ScanlineDecoder* CreateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,
+ int K, FX_BOOL EndOfLine, FX_BOOL EncodedByteAlign, FX_BOOL BlackIs1, int Columns, int Rows);
+ FX_BOOL Encode(FX_LPCBYTE src_buf, int width, int height, int pitch, FX_LPBYTE& dest_buf, FX_DWORD& dest_size);
+};
+class CCodec_FlateModule : public ICodec_FlateModule
+{
+public:
+ virtual ICodec_ScanlineDecoder* CreateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,
+ int nComps, int bpc, int predictor, int Colors, int BitsPerComponent, int Columns);
+ virtual FX_DWORD FlateOrLZWDecode(FX_BOOL bLZW, const FX_BYTE* src_buf, FX_DWORD src_size, FX_BOOL bEarlyChange,
+ int predictor, int Colors, int BitsPerComponent, int Columns,
+ FX_DWORD estimated_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size);
+ virtual FX_BOOL Encode(const FX_BYTE* src_buf, FX_DWORD src_size,
+ int predictor, int Colors, int BitsPerComponent, int Columns,
+ FX_LPBYTE& dest_buf, FX_DWORD& dest_size);
+ virtual FX_BOOL Encode(FX_LPCBYTE src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size);
+};
+class CCodec_JpegModule : public ICodec_JpegModule
+{
+public:
+ CCodec_JpegModule() : m_pExtProvider(NULL) {}
+ void SetPovider(IFX_JpegProvider* pJP)
+ {
+ m_pExtProvider = pJP;
+ }
+ ICodec_ScanlineDecoder* CreateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size,
+ int width, int height, int nComps, FX_BOOL ColorTransform);
+ FX_BOOL LoadInfo(FX_LPCBYTE src_buf, FX_DWORD src_size, int& width, int& height,
+ int& num_components, int& bits_per_components, FX_BOOL& color_transform,
+ FX_LPBYTE* icc_buf_ptr, FX_DWORD* icc_length);
+ FX_BOOL Encode(const CFX_DIBSource* pSource, FX_LPBYTE& dest_buf, FX_STRSIZE& dest_size, int quality, FX_LPCBYTE icc_buf, FX_DWORD icc_length);
+ virtual void* Start();
+ virtual void Finish(void* pContext);
+ virtual void Input(void* pContext, FX_LPCBYTE src_buf, FX_DWORD src_size);
+ virtual int ReadHeader(void* pContext, int* width, int* height, int* nComps);
+ virtual FX_BOOL StartScanline(void* pContext, int down_scale);
+ virtual FX_BOOL ReadScanline(void* pContext, FX_LPBYTE dest_buf);
+ virtual FX_DWORD GetAvailInput(void* pContext, FX_LPBYTE* avail_buf_ptr);
+protected:
+ IFX_JpegProvider* m_pExtProvider;
+};
+class CCodec_IccModule : public ICodec_IccModule
+{
+public:
+ virtual IccCS GetProfileCS(FX_LPCBYTE pProfileData, unsigned int dwProfileSize);
+ virtual IccCS GetProfileCS(IFX_FileRead* pFile);
+ virtual FX_LPVOID CreateTransform(ICodec_IccModule::IccParam* pInputParam,
+ ICodec_IccModule::IccParam* pOutputParam,
+ ICodec_IccModule::IccParam* pProofParam = NULL,
+ FX_DWORD dwIntent = Icc_INTENT_PERCEPTUAL,
+ FX_DWORD dwFlag = Icc_FLAGS_DEFAULT,
+ FX_DWORD dwPrfIntent = Icc_INTENT_ABSOLUTE_COLORIMETRIC,
+ FX_DWORD dwPrfFlag = Icc_FLAGS_SOFTPROOFING
+ );
+ virtual FX_LPVOID CreateTransform_sRGB(FX_LPCBYTE pProfileData, unsigned int dwProfileSize, int nComponents, int intent = 0,
+ FX_DWORD dwSrcFormat = Icc_FORMAT_DEFAULT);
+ virtual FX_LPVOID CreateTransform_CMYK(FX_LPCBYTE pSrcProfileData, unsigned int dwSrcProfileSize, int nSrcComponents,
+ FX_LPCBYTE pDstProfileData, unsigned int dwDstProfileSize, int intent = 0,
+ FX_DWORD dwSrcFormat = Icc_FORMAT_DEFAULT,
+ FX_DWORD dwDstFormat = Icc_FORMAT_DEFAULT
+ );
+ virtual void DestroyTransform(FX_LPVOID pTransform);
+ virtual void Translate(FX_LPVOID pTransform, FX_FLOAT* pSrcValues, FX_FLOAT* pDestValues);
+ virtual void TranslateScanline(FX_LPVOID pTransform, FX_LPBYTE pDest, FX_LPCBYTE pSrc, int pixels);
+ virtual ~CCodec_IccModule();
+protected:
+ CFX_MapByteStringToPtr m_MapTranform;
+ CFX_MapByteStringToPtr m_MapProfile;
+ typedef enum {
+ Icc_CLASS_INPUT = 0,
+ Icc_CLASS_OUTPUT,
+ Icc_CLASS_PROOF,
+ Icc_CLASS_MAX
+ } Icc_CLASS;
+ FX_LPVOID CreateProfile(ICodec_IccModule::IccParam* pIccParam, Icc_CLASS ic, CFX_BinaryBuf* pTransformKey);
+};
+class CCodec_JpxModule : public ICodec_JpxModule
+{
+public:
+ CCodec_JpxModule();
+ void* CreateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, FX_BOOL useColorSpace = FALSE);
+ void GetImageInfo(FX_LPVOID ctx, FX_DWORD& width, FX_DWORD& height,
+ FX_DWORD& codestream_nComps, FX_DWORD& output_nComps);
+ FX_BOOL Decode(void* ctx, FX_LPBYTE dest_data, int pitch, FX_BOOL bTranslateColor, FX_LPBYTE offsets);
+ void DestroyDecoder(void* ctx);
+};
+#include "../jbig2/JBig2_Context.h"
+class CPDF_Jbig2Interface : public CFX_Object, public CJBig2_Module
+{
+public:
+ virtual void *JBig2_Malloc(FX_DWORD dwSize)
+ {
+ return FX_Alloc(FX_BYTE, dwSize);
+ }
+ virtual void *JBig2_Malloc2(FX_DWORD num, FX_DWORD dwSize)
+ {
+ if (dwSize && num >= UINT_MAX / dwSize) {
+ return NULL;
+ }
+ return FX_Alloc(FX_BYTE, num * dwSize);
+ }
+ virtual void *JBig2_Malloc3(FX_DWORD num, FX_DWORD dwSize, FX_DWORD dwSize2)
+ {
+ if (dwSize2 && dwSize >= UINT_MAX / dwSize2) {
+ return NULL;
+ }
+ FX_DWORD size = dwSize2 * dwSize;
+ if (size && num >= UINT_MAX / size) {
+ return NULL;
+ }
+ return FX_Alloc(FX_BYTE, num * size);
+ }
+ virtual void *JBig2_Realloc(FX_LPVOID pMem, FX_DWORD dwSize)
+ {
+ return FX_Realloc(FX_BYTE, pMem, dwSize);
+ }
+ virtual void JBig2_Free(FX_LPVOID pMem)
+ {
+ FX_Free(pMem);
+ }
+};
+class CCodec_Jbig2Context : public CFX_Object
+{
+public:
+ CCodec_Jbig2Context();
+ ~CCodec_Jbig2Context() {};
+ IFX_FileRead* m_file_ptr;
+ FX_DWORD m_width;
+ FX_DWORD m_height;
+ FX_LPBYTE m_src_buf;
+ FX_DWORD m_src_size;
+ FX_LPCBYTE m_global_data;
+ FX_DWORD m_global_size;
+ FX_LPBYTE m_dest_buf;
+ FX_DWORD m_dest_pitch;
+ FX_BOOL m_bFileReader;
+ IFX_Pause* m_pPause;
+ CJBig2_Context* m_pContext;
+ CJBig2_Image* m_dest_image;
+};
+class CCodec_Jbig2Module : public ICodec_Jbig2Module
+{
+public:
+ CCodec_Jbig2Module() {};
+ ~CCodec_Jbig2Module();
+ FX_BOOL Decode(FX_DWORD width, FX_DWORD height, FX_LPCBYTE src_buf, FX_DWORD src_size,
+ FX_LPCBYTE global_data, FX_DWORD global_size, FX_LPBYTE dest_buf, FX_DWORD dest_pitch);
+ FX_BOOL Decode(IFX_FileRead* file_ptr,
+ FX_DWORD& width, FX_DWORD& height, FX_DWORD& pitch, FX_LPBYTE& dest_buf);
+ void* CreateJbig2Context();
+ FXCODEC_STATUS StartDecode(void* pJbig2Context, FX_DWORD width, FX_DWORD height, FX_LPCBYTE src_buf, FX_DWORD src_size,
+ FX_LPCBYTE global_data, FX_DWORD global_size, FX_LPBYTE dest_buf, FX_DWORD dest_pitch, IFX_Pause* pPause);
+
+ FXCODEC_STATUS StartDecode(void* pJbig2Context, IFX_FileRead* file_ptr,
+ FX_DWORD& width, FX_DWORD& height, FX_DWORD& pitch, FX_LPBYTE& dest_buf, IFX_Pause* pPause);
+ FXCODEC_STATUS ContinueDecode(void* pJbig2Context, IFX_Pause* pPause);
+ void DestroyJbig2Context(void* pJbig2Context);
+ CPDF_Jbig2Interface m_Module;
+private:
+};
diff --git a/core/src/fxcodec/codec/fx_codec.cpp b/core/src/fxcodec/codec/fx_codec.cpp
index 2f586ca94b..c6b3ccee43 100644
--- a/core/src/fxcodec/codec/fx_codec.cpp
+++ b/core/src/fxcodec/codec/fx_codec.cpp
@@ -1,447 +1,447 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../../include/fxcodec/fx_codec.h"
-#include "codec_int.h"
-CCodec_ModuleMgr::CCodec_ModuleMgr()
-{
- m_pBasicModule = FX_NEW CCodec_BasicModule;
- m_pFaxModule = FX_NEW CCodec_FaxModule;
- m_pJpegModule = FX_NEW CCodec_JpegModule;
- m_pJpxModule = FX_NEW CCodec_JpxModule;
- m_pJbig2Module = FX_NEW CCodec_Jbig2Module;
- m_pIccModule = FX_NEW CCodec_IccModule;
- m_pFlateModule = FX_NEW CCodec_FlateModule;
-}
-CCodec_ModuleMgr::~CCodec_ModuleMgr()
-{
- delete m_pBasicModule;
- delete m_pFaxModule;
- delete m_pJpegModule;
- delete m_pFlateModule;
- delete m_pJpxModule;
- delete m_pJbig2Module;
- delete m_pIccModule;
-}
-void CCodec_ModuleMgr::InitJbig2Decoder()
-{
-}
-void CCodec_ModuleMgr::InitJpxDecoder()
-{
-}
-void CCodec_ModuleMgr::InitIccDecoder()
-{
-}
-CCodec_ScanlineDecoder::CCodec_ScanlineDecoder()
-{
- m_NextLine = -1;
- m_pDataCache = NULL;
- m_pLastScanline = NULL;
-}
-CCodec_ScanlineDecoder::~CCodec_ScanlineDecoder()
-{
- if (m_pDataCache) {
- FX_Free(m_pDataCache);
- }
-}
-FX_LPBYTE CCodec_ScanlineDecoder::GetScanline(int line)
-{
- if (m_pDataCache && line < m_pDataCache->m_nCachedLines) {
- return &m_pDataCache->m_Data + line * m_Pitch;
- }
- if (m_NextLine == line + 1) {
- return m_pLastScanline;
- }
- if (m_NextLine < 0 || m_NextLine > line) {
- if (!v_Rewind()) {
- return NULL;
- }
- m_NextLine = 0;
- }
- while (m_NextLine < line) {
- ReadNextLine();
- m_NextLine ++;
- }
- m_pLastScanline = ReadNextLine();
- m_NextLine ++;
- return m_pLastScanline;
-}
-FX_BOOL CCodec_ScanlineDecoder::SkipToScanline(int line, IFX_Pause* pPause)
-{
- if (m_pDataCache && line < m_pDataCache->m_nCachedLines) {
- return FALSE;
- }
- if (m_NextLine == line || m_NextLine == line + 1) {
- return FALSE;
- }
- if (m_NextLine < 0 || m_NextLine > line) {
- v_Rewind();
- m_NextLine = 0;
- }
- m_pLastScanline = NULL;
- while (m_NextLine < line) {
- m_pLastScanline = ReadNextLine();
- m_NextLine ++;
- if (pPause && pPause->NeedToPauseNow()) {
- return TRUE;
- }
- }
- return FALSE;
-}
-FX_LPBYTE CCodec_ScanlineDecoder::ReadNextLine()
-{
- FX_LPBYTE pLine = v_GetNextLine();
- if (pLine == NULL) {
- return NULL;
- }
- if (m_pDataCache && m_NextLine == m_pDataCache->m_nCachedLines) {
- FXSYS_memcpy32(&m_pDataCache->m_Data + m_NextLine * m_Pitch, pLine, m_Pitch);
- m_pDataCache->m_nCachedLines ++;
- }
- return pLine;
-}
-void CCodec_ScanlineDecoder::DownScale(int dest_width, int dest_height)
-{
- if (dest_width < 0) {
- dest_width = -dest_width;
- }
- if (dest_height < 0) {
- dest_height = -dest_height;
- }
- v_DownScale(dest_width, dest_height);
- if (m_pDataCache) {
- if (m_pDataCache->m_Height == m_OutputHeight && m_pDataCache->m_Width == m_OutputWidth) {
- return;
- }
- FX_Free(m_pDataCache);
- m_pDataCache = NULL;
- }
- m_pDataCache = (CCodec_ImageDataCache*)FXMEM_DefaultAlloc(
- sizeof(CCodec_ImageDataCache) + m_Pitch * m_OutputHeight, FXMEM_NONLEAVE);
- if (m_pDataCache == NULL) {
- return;
- }
- m_pDataCache->m_Height = m_OutputHeight;
- m_pDataCache->m_Width = m_OutputWidth;
- m_pDataCache->m_nCachedLines = 0;
-}
-FX_BOOL CCodec_BasicModule::RunLengthEncode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf,
- FX_DWORD& dest_size)
-{
- return FALSE;
-}
-extern "C" double FXstrtod(const char* nptr, char** endptr)
-{
- double ret = 0.0;
- const char* ptr = nptr;
- const char* exp_ptr = NULL;
- int e_number = 0,
- e_signal = 0,
- e_point = 0,
- is_negative = 0;
- int exp_ret = 0, exp_sig = 1,
- fra_ret = 0, fra_count = 0, fra_base = 1;
- if(nptr == NULL) {
- return 0.0;
- }
- for (;; ptr++) {
- if(!e_number && !e_point && (*ptr == '\t' || *ptr == ' ')) {
- continue;
- }
- if(*ptr >= '0' && *ptr <= '9') {
- if(!e_number) {
- e_number = 1;
- }
- if(!e_point) {
- ret *= 10;
- ret += (*ptr - '0');
- } else {
- fra_count++;
- fra_ret *= 10;
- fra_ret += (*ptr - '0');
- }
- continue;
- }
- if(!e_point && *ptr == '.') {
- e_point = 1;
- continue;
- }
- if(!e_number && !e_point && !e_signal) {
- switch(*ptr) {
- case '-':
- is_negative = 1;
- case '+':
- e_signal = 1;
- continue;
- }
- }
- if(e_number && (*ptr == 'e' || *ptr == 'E')) {
-#define EXPONENT_DETECT(ptr) \
- for(;;ptr++){ \
- if(*ptr < '0' || *ptr > '9'){ \
- if(endptr) *endptr = (char*)ptr; \
- break; \
- }else{ \
- exp_ret *= 10; \
- exp_ret += (*ptr - '0'); \
- continue; \
- } \
- }
- exp_ptr = ptr++;
- if(*ptr == '+' || *ptr == '-') {
- exp_sig = (*ptr++ == '+') ? 1 : -1;
- if(*ptr < '0' || *ptr > '9') {
- if(endptr) {
- *endptr = (char*)exp_ptr;
- }
- break;
- }
- EXPONENT_DETECT(ptr);
- } else if(*ptr >= '0' && *ptr <= '9') {
- EXPONENT_DETECT(ptr);
- } else {
- if(endptr) {
- *endptr = (char*)exp_ptr;
- }
- break;
- }
-#undef EXPONENT_DETECT
- break;
- }
- if(ptr != nptr && !e_number) {
- if(endptr) {
- *endptr = (char*)nptr;
- }
- break;
- }
- if(endptr) {
- *endptr = (char*)ptr;
- }
- break;
- }
- while(fra_count--) {
- fra_base *= 10;
- }
- ret += (double)fra_ret / (double)fra_base;
- if(exp_sig == 1) {
- while(exp_ret--) {
- ret *= 10.0;
- }
- } else {
- while(exp_ret--) {
- ret /= 10.0;
- }
- }
- return is_negative ? -ret : ret;
-}
-FX_BOOL CCodec_BasicModule::A85Encode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf,
- FX_DWORD& dest_size)
-{
- return FALSE;
-}
-CCodec_ModuleMgr* CCodec_ModuleMgr::Create()
-{
- return FX_NEW CCodec_ModuleMgr;
-}
-void CCodec_ModuleMgr::Destroy()
-{
- delete this;
-}
-class CCodec_RLScanlineDecoder : public CCodec_ScanlineDecoder
-{
-public:
- CCodec_RLScanlineDecoder();
- virtual ~CCodec_RLScanlineDecoder();
- FX_BOOL Create(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height, int nComps, int bpc);
- virtual void v_DownScale(int dest_width, int dest_height) {}
- virtual FX_BOOL v_Rewind();
- virtual FX_LPBYTE v_GetNextLine();
- virtual FX_DWORD GetSrcOffset()
- {
- return m_SrcOffset;
- }
-protected:
- FX_BOOL CheckDestSize();
- void GetNextOperator();
- void UpdateOperator(FX_BYTE used_bytes);
-
- FX_LPBYTE m_pScanline;
- FX_LPCBYTE m_pSrcBuf;
- FX_DWORD m_SrcSize;
- FX_DWORD m_dwLineBytes;
- FX_DWORD m_SrcOffset;
- FX_BOOL m_bEOD;
- FX_BYTE m_Operator;
-};
-CCodec_RLScanlineDecoder::CCodec_RLScanlineDecoder()
- : m_pScanline(NULL)
- , m_pSrcBuf(NULL)
- , m_SrcSize(0)
- , m_dwLineBytes(0)
- , m_SrcOffset(0)
- , m_bEOD(FALSE)
- , m_Operator(0)
-{
-}
-CCodec_RLScanlineDecoder::~CCodec_RLScanlineDecoder()
-{
- if (m_pScanline) {
- FX_Free(m_pScanline);
- }
-}
-FX_BOOL CCodec_RLScanlineDecoder::CheckDestSize()
-{
- FX_DWORD i = 0;
- FX_DWORD old_size = 0;
- FX_DWORD dest_size = 0;
- while (i < m_SrcSize) {
- if (m_pSrcBuf[i] < 128) {
- old_size = dest_size;
- dest_size += m_pSrcBuf[i] + 1;
- if (dest_size < old_size) {
- return FALSE;
- }
- i += m_pSrcBuf[i] + 2;
- } else if (m_pSrcBuf[i] > 128) {
- old_size = dest_size;
- dest_size += 257 - m_pSrcBuf[i];
- if (dest_size < old_size) {
- return FALSE;
- }
- i += 2;
- } else {
- break;
- }
- }
- if (((FX_DWORD)m_OrigWidth * m_nComps * m_bpc * m_OrigHeight + 7) / 8 > dest_size) {
- return FALSE;
- }
- return TRUE;
-}
-FX_BOOL CCodec_RLScanlineDecoder::Create(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height, int nComps, int bpc)
-{
- m_pSrcBuf = src_buf;
- m_SrcSize = src_size;
- m_OutputWidth = m_OrigWidth = width;
- m_OutputHeight = m_OrigHeight = height;
- m_nComps = nComps;
- m_bpc = bpc;
- m_bColorTransformed = FALSE;
- m_DownScale = 1;
- m_Pitch = (width * nComps * bpc + 31) / 32 * 4;
- m_dwLineBytes = (width * nComps * bpc + 7) / 8;
- m_pScanline = FX_Alloc(FX_BYTE, m_Pitch);
- if (m_pScanline == NULL) {
- return FALSE;
- }
- FXSYS_memset32(m_pScanline, 0, m_Pitch);
- return CheckDestSize();
-}
-FX_BOOL CCodec_RLScanlineDecoder::v_Rewind()
-{
- FXSYS_memset32(m_pScanline, 0, m_Pitch);
- m_SrcOffset = 0;
- m_bEOD = FALSE;
- m_Operator = 0;
- return TRUE;
-}
-FX_LPBYTE CCodec_RLScanlineDecoder::v_GetNextLine()
-{
- if (m_SrcOffset == 0) {
- GetNextOperator();
- } else {
- if (m_bEOD) {
- return NULL;
- }
- }
- FXSYS_memset32(m_pScanline, 0, m_Pitch);
- FX_DWORD col_pos = 0;
- FX_BOOL eol = FALSE;
- while (m_SrcOffset < m_SrcSize && !eol) {
- if (m_Operator < 128) {
- FX_DWORD copy_len = m_Operator + 1;
- if (col_pos + copy_len >= m_dwLineBytes) {
- copy_len = m_dwLineBytes - col_pos;
- eol = TRUE;
- }
- if (copy_len >= m_SrcSize - m_SrcOffset) {
- copy_len = m_SrcSize - m_SrcOffset;
- m_bEOD = TRUE;
- }
- FXSYS_memcpy32(m_pScanline + col_pos, m_pSrcBuf + m_SrcOffset, copy_len);
- col_pos += copy_len;
- UpdateOperator((FX_BYTE)copy_len);
- } else if (m_Operator > 128) {
- int fill = 0;
- if (m_SrcOffset - 1 < m_SrcSize - 1) {
- fill = m_pSrcBuf[m_SrcOffset];
- }
- FX_DWORD duplicate_len = 257 - m_Operator;
- if (col_pos + duplicate_len >= m_dwLineBytes) {
- duplicate_len = m_dwLineBytes - col_pos;
- eol = TRUE;
- }
- FXSYS_memset8(m_pScanline + col_pos, fill, duplicate_len);
- col_pos += duplicate_len;
- UpdateOperator((FX_BYTE)duplicate_len);
- } else {
- m_bEOD = TRUE;
- break;
- }
- }
- return m_pScanline;
-}
-void CCodec_RLScanlineDecoder::GetNextOperator()
-{
- if (m_SrcOffset >= m_SrcSize) {
- m_Operator = 128;
- return;
- }
- m_Operator = m_pSrcBuf[m_SrcOffset];
- m_SrcOffset ++;
-}
-void CCodec_RLScanlineDecoder::UpdateOperator(FX_BYTE used_bytes)
-{
- if (used_bytes == 0) {
- return;
- }
- if (m_Operator < 128) {
- FXSYS_assert((FX_DWORD)m_Operator + 1 >= used_bytes);
- if (used_bytes == m_Operator + 1) {
- m_SrcOffset += used_bytes;
- GetNextOperator();
- return;
- }
- m_Operator -= used_bytes;
- m_SrcOffset += used_bytes;
- if (m_SrcOffset >= m_SrcSize) {
- m_Operator = 128;
- }
- return;
- }
- FX_BYTE count = 257 - m_Operator;
- FXSYS_assert((FX_DWORD)count >= used_bytes);
- if (used_bytes == count) {
- m_SrcOffset ++;
- GetNextOperator();
- return;
- }
- count -= used_bytes;
- m_Operator = 257 - count;
-}
-ICodec_ScanlineDecoder* CCodec_BasicModule::CreateRunLengthDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,
- int nComps, int bpc)
-{
- CCodec_RLScanlineDecoder* pRLScanlineDecoder = FX_NEW CCodec_RLScanlineDecoder;
- if (pRLScanlineDecoder == NULL) {
- return NULL;
- }
- if (!pRLScanlineDecoder->Create(src_buf, src_size, width, height, nComps, bpc)) {
- delete pRLScanlineDecoder;
- return NULL;
- }
- return pRLScanlineDecoder;
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxcodec/fx_codec.h"
+#include "codec_int.h"
+CCodec_ModuleMgr::CCodec_ModuleMgr()
+{
+ m_pBasicModule = FX_NEW CCodec_BasicModule;
+ m_pFaxModule = FX_NEW CCodec_FaxModule;
+ m_pJpegModule = FX_NEW CCodec_JpegModule;
+ m_pJpxModule = FX_NEW CCodec_JpxModule;
+ m_pJbig2Module = FX_NEW CCodec_Jbig2Module;
+ m_pIccModule = FX_NEW CCodec_IccModule;
+ m_pFlateModule = FX_NEW CCodec_FlateModule;
+}
+CCodec_ModuleMgr::~CCodec_ModuleMgr()
+{
+ delete m_pBasicModule;
+ delete m_pFaxModule;
+ delete m_pJpegModule;
+ delete m_pFlateModule;
+ delete m_pJpxModule;
+ delete m_pJbig2Module;
+ delete m_pIccModule;
+}
+void CCodec_ModuleMgr::InitJbig2Decoder()
+{
+}
+void CCodec_ModuleMgr::InitJpxDecoder()
+{
+}
+void CCodec_ModuleMgr::InitIccDecoder()
+{
+}
+CCodec_ScanlineDecoder::CCodec_ScanlineDecoder()
+{
+ m_NextLine = -1;
+ m_pDataCache = NULL;
+ m_pLastScanline = NULL;
+}
+CCodec_ScanlineDecoder::~CCodec_ScanlineDecoder()
+{
+ if (m_pDataCache) {
+ FX_Free(m_pDataCache);
+ }
+}
+FX_LPBYTE CCodec_ScanlineDecoder::GetScanline(int line)
+{
+ if (m_pDataCache && line < m_pDataCache->m_nCachedLines) {
+ return &m_pDataCache->m_Data + line * m_Pitch;
+ }
+ if (m_NextLine == line + 1) {
+ return m_pLastScanline;
+ }
+ if (m_NextLine < 0 || m_NextLine > line) {
+ if (!v_Rewind()) {
+ return NULL;
+ }
+ m_NextLine = 0;
+ }
+ while (m_NextLine < line) {
+ ReadNextLine();
+ m_NextLine ++;
+ }
+ m_pLastScanline = ReadNextLine();
+ m_NextLine ++;
+ return m_pLastScanline;
+}
+FX_BOOL CCodec_ScanlineDecoder::SkipToScanline(int line, IFX_Pause* pPause)
+{
+ if (m_pDataCache && line < m_pDataCache->m_nCachedLines) {
+ return FALSE;
+ }
+ if (m_NextLine == line || m_NextLine == line + 1) {
+ return FALSE;
+ }
+ if (m_NextLine < 0 || m_NextLine > line) {
+ v_Rewind();
+ m_NextLine = 0;
+ }
+ m_pLastScanline = NULL;
+ while (m_NextLine < line) {
+ m_pLastScanline = ReadNextLine();
+ m_NextLine ++;
+ if (pPause && pPause->NeedToPauseNow()) {
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+FX_LPBYTE CCodec_ScanlineDecoder::ReadNextLine()
+{
+ FX_LPBYTE pLine = v_GetNextLine();
+ if (pLine == NULL) {
+ return NULL;
+ }
+ if (m_pDataCache && m_NextLine == m_pDataCache->m_nCachedLines) {
+ FXSYS_memcpy32(&m_pDataCache->m_Data + m_NextLine * m_Pitch, pLine, m_Pitch);
+ m_pDataCache->m_nCachedLines ++;
+ }
+ return pLine;
+}
+void CCodec_ScanlineDecoder::DownScale(int dest_width, int dest_height)
+{
+ if (dest_width < 0) {
+ dest_width = -dest_width;
+ }
+ if (dest_height < 0) {
+ dest_height = -dest_height;
+ }
+ v_DownScale(dest_width, dest_height);
+ if (m_pDataCache) {
+ if (m_pDataCache->m_Height == m_OutputHeight && m_pDataCache->m_Width == m_OutputWidth) {
+ return;
+ }
+ FX_Free(m_pDataCache);
+ m_pDataCache = NULL;
+ }
+ m_pDataCache = (CCodec_ImageDataCache*)FXMEM_DefaultAlloc(
+ sizeof(CCodec_ImageDataCache) + m_Pitch * m_OutputHeight, FXMEM_NONLEAVE);
+ if (m_pDataCache == NULL) {
+ return;
+ }
+ m_pDataCache->m_Height = m_OutputHeight;
+ m_pDataCache->m_Width = m_OutputWidth;
+ m_pDataCache->m_nCachedLines = 0;
+}
+FX_BOOL CCodec_BasicModule::RunLengthEncode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf,
+ FX_DWORD& dest_size)
+{
+ return FALSE;
+}
+extern "C" double FXstrtod(const char* nptr, char** endptr)
+{
+ double ret = 0.0;
+ const char* ptr = nptr;
+ const char* exp_ptr = NULL;
+ int e_number = 0,
+ e_signal = 0,
+ e_point = 0,
+ is_negative = 0;
+ int exp_ret = 0, exp_sig = 1,
+ fra_ret = 0, fra_count = 0, fra_base = 1;
+ if(nptr == NULL) {
+ return 0.0;
+ }
+ for (;; ptr++) {
+ if(!e_number && !e_point && (*ptr == '\t' || *ptr == ' ')) {
+ continue;
+ }
+ if(*ptr >= '0' && *ptr <= '9') {
+ if(!e_number) {
+ e_number = 1;
+ }
+ if(!e_point) {
+ ret *= 10;
+ ret += (*ptr - '0');
+ } else {
+ fra_count++;
+ fra_ret *= 10;
+ fra_ret += (*ptr - '0');
+ }
+ continue;
+ }
+ if(!e_point && *ptr == '.') {
+ e_point = 1;
+ continue;
+ }
+ if(!e_number && !e_point && !e_signal) {
+ switch(*ptr) {
+ case '-':
+ is_negative = 1;
+ case '+':
+ e_signal = 1;
+ continue;
+ }
+ }
+ if(e_number && (*ptr == 'e' || *ptr == 'E')) {
+#define EXPONENT_DETECT(ptr) \
+ for(;;ptr++){ \
+ if(*ptr < '0' || *ptr > '9'){ \
+ if(endptr) *endptr = (char*)ptr; \
+ break; \
+ }else{ \
+ exp_ret *= 10; \
+ exp_ret += (*ptr - '0'); \
+ continue; \
+ } \
+ }
+ exp_ptr = ptr++;
+ if(*ptr == '+' || *ptr == '-') {
+ exp_sig = (*ptr++ == '+') ? 1 : -1;
+ if(*ptr < '0' || *ptr > '9') {
+ if(endptr) {
+ *endptr = (char*)exp_ptr;
+ }
+ break;
+ }
+ EXPONENT_DETECT(ptr);
+ } else if(*ptr >= '0' && *ptr <= '9') {
+ EXPONENT_DETECT(ptr);
+ } else {
+ if(endptr) {
+ *endptr = (char*)exp_ptr;
+ }
+ break;
+ }
+#undef EXPONENT_DETECT
+ break;
+ }
+ if(ptr != nptr && !e_number) {
+ if(endptr) {
+ *endptr = (char*)nptr;
+ }
+ break;
+ }
+ if(endptr) {
+ *endptr = (char*)ptr;
+ }
+ break;
+ }
+ while(fra_count--) {
+ fra_base *= 10;
+ }
+ ret += (double)fra_ret / (double)fra_base;
+ if(exp_sig == 1) {
+ while(exp_ret--) {
+ ret *= 10.0;
+ }
+ } else {
+ while(exp_ret--) {
+ ret /= 10.0;
+ }
+ }
+ return is_negative ? -ret : ret;
+}
+FX_BOOL CCodec_BasicModule::A85Encode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf,
+ FX_DWORD& dest_size)
+{
+ return FALSE;
+}
+CCodec_ModuleMgr* CCodec_ModuleMgr::Create()
+{
+ return FX_NEW CCodec_ModuleMgr;
+}
+void CCodec_ModuleMgr::Destroy()
+{
+ delete this;
+}
+class CCodec_RLScanlineDecoder : public CCodec_ScanlineDecoder
+{
+public:
+ CCodec_RLScanlineDecoder();
+ virtual ~CCodec_RLScanlineDecoder();
+ FX_BOOL Create(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height, int nComps, int bpc);
+ virtual void v_DownScale(int dest_width, int dest_height) {}
+ virtual FX_BOOL v_Rewind();
+ virtual FX_LPBYTE v_GetNextLine();
+ virtual FX_DWORD GetSrcOffset()
+ {
+ return m_SrcOffset;
+ }
+protected:
+ FX_BOOL CheckDestSize();
+ void GetNextOperator();
+ void UpdateOperator(FX_BYTE used_bytes);
+
+ FX_LPBYTE m_pScanline;
+ FX_LPCBYTE m_pSrcBuf;
+ FX_DWORD m_SrcSize;
+ FX_DWORD m_dwLineBytes;
+ FX_DWORD m_SrcOffset;
+ FX_BOOL m_bEOD;
+ FX_BYTE m_Operator;
+};
+CCodec_RLScanlineDecoder::CCodec_RLScanlineDecoder()
+ : m_pScanline(NULL)
+ , m_pSrcBuf(NULL)
+ , m_SrcSize(0)
+ , m_dwLineBytes(0)
+ , m_SrcOffset(0)
+ , m_bEOD(FALSE)
+ , m_Operator(0)
+{
+}
+CCodec_RLScanlineDecoder::~CCodec_RLScanlineDecoder()
+{
+ if (m_pScanline) {
+ FX_Free(m_pScanline);
+ }
+}
+FX_BOOL CCodec_RLScanlineDecoder::CheckDestSize()
+{
+ FX_DWORD i = 0;
+ FX_DWORD old_size = 0;
+ FX_DWORD dest_size = 0;
+ while (i < m_SrcSize) {
+ if (m_pSrcBuf[i] < 128) {
+ old_size = dest_size;
+ dest_size += m_pSrcBuf[i] + 1;
+ if (dest_size < old_size) {
+ return FALSE;
+ }
+ i += m_pSrcBuf[i] + 2;
+ } else if (m_pSrcBuf[i] > 128) {
+ old_size = dest_size;
+ dest_size += 257 - m_pSrcBuf[i];
+ if (dest_size < old_size) {
+ return FALSE;
+ }
+ i += 2;
+ } else {
+ break;
+ }
+ }
+ if (((FX_DWORD)m_OrigWidth * m_nComps * m_bpc * m_OrigHeight + 7) / 8 > dest_size) {
+ return FALSE;
+ }
+ return TRUE;
+}
+FX_BOOL CCodec_RLScanlineDecoder::Create(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height, int nComps, int bpc)
+{
+ m_pSrcBuf = src_buf;
+ m_SrcSize = src_size;
+ m_OutputWidth = m_OrigWidth = width;
+ m_OutputHeight = m_OrigHeight = height;
+ m_nComps = nComps;
+ m_bpc = bpc;
+ m_bColorTransformed = FALSE;
+ m_DownScale = 1;
+ m_Pitch = (width * nComps * bpc + 31) / 32 * 4;
+ m_dwLineBytes = (width * nComps * bpc + 7) / 8;
+ m_pScanline = FX_Alloc(FX_BYTE, m_Pitch);
+ if (m_pScanline == NULL) {
+ return FALSE;
+ }
+ FXSYS_memset32(m_pScanline, 0, m_Pitch);
+ return CheckDestSize();
+}
+FX_BOOL CCodec_RLScanlineDecoder::v_Rewind()
+{
+ FXSYS_memset32(m_pScanline, 0, m_Pitch);
+ m_SrcOffset = 0;
+ m_bEOD = FALSE;
+ m_Operator = 0;
+ return TRUE;
+}
+FX_LPBYTE CCodec_RLScanlineDecoder::v_GetNextLine()
+{
+ if (m_SrcOffset == 0) {
+ GetNextOperator();
+ } else {
+ if (m_bEOD) {
+ return NULL;
+ }
+ }
+ FXSYS_memset32(m_pScanline, 0, m_Pitch);
+ FX_DWORD col_pos = 0;
+ FX_BOOL eol = FALSE;
+ while (m_SrcOffset < m_SrcSize && !eol) {
+ if (m_Operator < 128) {
+ FX_DWORD copy_len = m_Operator + 1;
+ if (col_pos + copy_len >= m_dwLineBytes) {
+ copy_len = m_dwLineBytes - col_pos;
+ eol = TRUE;
+ }
+ if (copy_len >= m_SrcSize - m_SrcOffset) {
+ copy_len = m_SrcSize - m_SrcOffset;
+ m_bEOD = TRUE;
+ }
+ FXSYS_memcpy32(m_pScanline + col_pos, m_pSrcBuf + m_SrcOffset, copy_len);
+ col_pos += copy_len;
+ UpdateOperator((FX_BYTE)copy_len);
+ } else if (m_Operator > 128) {
+ int fill = 0;
+ if (m_SrcOffset - 1 < m_SrcSize - 1) {
+ fill = m_pSrcBuf[m_SrcOffset];
+ }
+ FX_DWORD duplicate_len = 257 - m_Operator;
+ if (col_pos + duplicate_len >= m_dwLineBytes) {
+ duplicate_len = m_dwLineBytes - col_pos;
+ eol = TRUE;
+ }
+ FXSYS_memset8(m_pScanline + col_pos, fill, duplicate_len);
+ col_pos += duplicate_len;
+ UpdateOperator((FX_BYTE)duplicate_len);
+ } else {
+ m_bEOD = TRUE;
+ break;
+ }
+ }
+ return m_pScanline;
+}
+void CCodec_RLScanlineDecoder::GetNextOperator()
+{
+ if (m_SrcOffset >= m_SrcSize) {
+ m_Operator = 128;
+ return;
+ }
+ m_Operator = m_pSrcBuf[m_SrcOffset];
+ m_SrcOffset ++;
+}
+void CCodec_RLScanlineDecoder::UpdateOperator(FX_BYTE used_bytes)
+{
+ if (used_bytes == 0) {
+ return;
+ }
+ if (m_Operator < 128) {
+ FXSYS_assert((FX_DWORD)m_Operator + 1 >= used_bytes);
+ if (used_bytes == m_Operator + 1) {
+ m_SrcOffset += used_bytes;
+ GetNextOperator();
+ return;
+ }
+ m_Operator -= used_bytes;
+ m_SrcOffset += used_bytes;
+ if (m_SrcOffset >= m_SrcSize) {
+ m_Operator = 128;
+ }
+ return;
+ }
+ FX_BYTE count = 257 - m_Operator;
+ FXSYS_assert((FX_DWORD)count >= used_bytes);
+ if (used_bytes == count) {
+ m_SrcOffset ++;
+ GetNextOperator();
+ return;
+ }
+ count -= used_bytes;
+ m_Operator = 257 - count;
+}
+ICodec_ScanlineDecoder* CCodec_BasicModule::CreateRunLengthDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,
+ int nComps, int bpc)
+{
+ CCodec_RLScanlineDecoder* pRLScanlineDecoder = FX_NEW CCodec_RLScanlineDecoder;
+ if (pRLScanlineDecoder == NULL) {
+ return NULL;
+ }
+ if (!pRLScanlineDecoder->Create(src_buf, src_size, width, height, nComps, bpc)) {
+ delete pRLScanlineDecoder;
+ return NULL;
+ }
+ return pRLScanlineDecoder;
+}
diff --git a/core/src/fxcodec/codec/fx_codec_fax.cpp b/core/src/fxcodec/codec/fx_codec_fax.cpp
index 21c7deb076..979df38197 100644
--- a/core/src/fxcodec/codec/fx_codec_fax.cpp
+++ b/core/src/fxcodec/codec/fx_codec_fax.cpp
@@ -1,968 +1,968 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../../include/fxcodec/fx_codec.h"
-#include "codec_int.h"
-extern const FX_BYTE OneLeadPos[256];
-extern const FX_BYTE ZeroLeadPos[256];
-int _FindBit(const FX_BYTE* data_buf, int max_pos, int start_pos, int bit)
-{
- if (start_pos >= max_pos) {
- return max_pos;
- }
- FX_LPCBYTE leading_pos = bit ? OneLeadPos : ZeroLeadPos;
- if (start_pos % 8) {
- FX_BYTE data = data_buf[start_pos / 8];
- if (bit) {
- data &= 0xff >> (start_pos % 8);
- } else {
- data |= 0xff << (8 - start_pos % 8);
- }
- if (leading_pos[data] < 8) {
- return start_pos / 8 * 8 + leading_pos[data];
- }
- start_pos += 7;
- }
- FX_BYTE skip = bit ? 0x00 : 0xff;
- int byte_pos = start_pos / 8;
- int max_byte = (max_pos + 7) / 8;
- while (byte_pos < max_byte) {
- if (data_buf[byte_pos] != skip) {
- break;
- }
- byte_pos ++;
- }
- if (byte_pos == max_byte) {
- return max_pos;
- }
- int pos = leading_pos[data_buf[byte_pos]] + byte_pos * 8;
- if (pos > max_pos) {
- pos = max_pos;
- }
- return pos;
-}
-void _FaxG4FindB1B2(const FX_BYTE* ref_buf, int columns, int a0, FX_BOOL a0color, int& b1, int& b2)
-{
- if (a0color) {
- a0color = 1;
- }
- FX_BYTE first_bit = (a0 < 0) ? 1 : ((ref_buf[a0 / 8] & (1 << (7 - a0 % 8))) != 0);
- b1 = _FindBit(ref_buf, columns, a0 + 1, !first_bit);
- if (b1 >= columns) {
- b1 = b2 = columns;
- return;
- }
- if (first_bit == !a0color) {
- b1 = _FindBit(ref_buf, columns, b1 + 1, first_bit);
- first_bit = !first_bit;
- }
- if (b1 >= columns) {
- b1 = b2 = columns;
- return;
- }
- b2 = _FindBit(ref_buf, columns, b1 + 1, first_bit);
-}
-void _FaxFillBits(FX_LPBYTE dest_buf, int columns, int startpos, int endpos)
-{
- if (startpos < 0) {
- startpos = 0;
- }
- if (endpos < 0) {
- endpos = 0;
- }
- if (endpos >= columns) {
- endpos = columns;
- }
- if (startpos >= endpos) {
- return;
- }
- int first_byte = startpos / 8;
- int last_byte = (endpos - 1) / 8;
- if (first_byte == last_byte) {
- for (int i = startpos % 8; i <= (endpos - 1) % 8; i ++) {
- dest_buf[first_byte] -= 1 << (7 - i);
- }
- return;
- }
- int i;
- for (i = startpos % 8; i < 8; i ++) {
- dest_buf[first_byte] -= 1 << (7 - i);
- }
- for (i = 0; i <= (endpos - 1) % 8; i ++) {
- dest_buf[last_byte] -= 1 << (7 - i);
- }
- if (last_byte > first_byte + 1) {
- FXSYS_memset32(dest_buf + first_byte + 1, 0, last_byte - first_byte - 1);
- }
-}
-#define NEXTBIT src_buf[bitpos/8] & (1 << (7-bitpos%8)); bitpos ++;
-#define ADDBIT(code, bit) code = code << 1; if (bit) code ++;
-#define GETBIT(bitpos) src_buf[bitpos/8] & (1 << (7-bitpos%8))
-static const FX_BYTE FaxBlackRunIns[] = {
- 0,
- 2,
- 0x02, 3, 0,
- 0x03, 2, 0,
- 2,
- 0x02, 1, 0,
- 0x03, 4, 0,
- 2,
- 0x02, 6, 0,
- 0x03, 5, 0,
- 1,
- 0x03, 7, 0,
- 2,
- 0x04, 9, 0,
- 0x05, 8, 0,
- 3,
- 0x04, 10, 0,
- 0x05, 11, 0,
- 0x07, 12, 0,
- 2,
- 0x04, 13, 0,
- 0x07, 14, 0,
- 1,
- 0x18, 15, 0,
- 5,
- 0x08, 18, 0,
- 0x0f, 64, 0,
- 0x17, 16, 0,
- 0x18, 17, 0,
- 0x37, 0, 0,
- 10,
- 0x08, 0x00, 0x07,
- 0x0c, 0x40, 0x07,
- 0x0d, 0x80, 0x07,
- 0x17, 24, 0,
- 0x18, 25, 0,
- 0x28, 23, 0,
- 0x37, 22, 0,
- 0x67, 19, 0,
- 0x68, 20, 0,
- 0x6c, 21, 0,
- 54,
- 0x12, 1984 % 256, 1984 / 256,
- 0x13, 2048 % 256, 2048 / 256,
- 0x14, 2112 % 256, 2112 / 256,
- 0x15, 2176 % 256, 2176 / 256,
- 0x16, 2240 % 256, 2240 / 256,
- 0x17, 2304 % 256, 2304 / 256,
- 0x1c, 2368 % 256, 2368 / 256,
- 0x1d, 2432 % 256, 2432 / 256,
- 0x1e, 2496 % 256, 2496 / 256,
- 0x1f, 2560 % 256, 2560 / 256,
- 0x24, 52, 0,
- 0x27, 55, 0,
- 0x28, 56, 0,
- 0x2b, 59, 0,
- 0x2c, 60, 0,
- 0x33, 320 % 256, 320 / 256,
- 0x34, 384 % 256, 384 / 256,
- 0x35, 448 % 256, 448 / 256,
- 0x37, 53, 0,
- 0x38, 54, 0,
- 0x52, 50, 0,
- 0x53, 51, 0,
- 0x54, 44, 0,
- 0x55, 45, 0,
- 0x56, 46, 0,
- 0x57, 47, 0,
- 0x58, 57, 0,
- 0x59, 58, 0,
- 0x5a, 61, 0,
- 0x5b, 256 % 256, 256 / 256,
- 0x64, 48, 0,
- 0x65, 49, 0,
- 0x66, 62, 0,
- 0x67, 63, 0,
- 0x68, 30, 0,
- 0x69, 31, 0,
- 0x6a, 32, 0,
- 0x6b, 33, 0,
- 0x6c, 40, 0,
- 0x6d, 41, 0,
- 0xc8, 128, 0,
- 0xc9, 192, 0,
- 0xca, 26, 0,
- 0xcb, 27, 0,
- 0xcc, 28, 0,
- 0xcd, 29, 0,
- 0xd2, 34, 0,
- 0xd3, 35, 0,
- 0xd4, 36, 0,
- 0xd5, 37, 0,
- 0xd6, 38, 0,
- 0xd7, 39, 0,
- 0xda, 42, 0,
- 0xdb, 43, 0,
- 20,
- 0x4a, 640 % 256, 640 / 256,
- 0x4b, 704 % 256, 704 / 256,
- 0x4c, 768 % 256, 768 / 256,
- 0x4d, 832 % 256, 832 / 256,
- 0x52, 1280 % 256, 1280 / 256,
- 0x53, 1344 % 256, 1344 / 256,
- 0x54, 1408 % 256, 1408 / 256,
- 0x55, 1472 % 256, 1472 / 256,
- 0x5a, 1536 % 256, 1536 / 256,
- 0x5b, 1600 % 256, 1600 / 256,
- 0x64, 1664 % 256, 1664 / 256,
- 0x65, 1728 % 256, 1728 / 256,
- 0x6c, 512 % 256, 512 / 256,
- 0x6d, 576 % 256, 576 / 256,
- 0x72, 896 % 256, 896 / 256,
- 0x73, 960 % 256, 960 / 256,
- 0x74, 1024 % 256, 1024 / 256,
- 0x75, 1088 % 256, 1088 / 256,
- 0x76, 1152 % 256, 1152 / 256,
- 0x77, 1216 % 256, 1216 / 256,
- 0xff
-};
-static const FX_BYTE FaxWhiteRunIns[] = {
- 0,
- 0,
- 0,
- 6,
- 0x07, 2, 0,
- 0x08, 3, 0,
- 0x0B, 4, 0,
- 0x0C, 5, 0,
- 0x0E, 6, 0,
- 0x0F, 7, 0,
- 6,
- 0x07, 10, 0,
- 0x08, 11, 0,
- 0x12, 128, 0,
- 0x13, 8, 0,
- 0x14, 9, 0,
- 0x1b, 64, 0,
- 9,
- 0x03, 13, 0,
- 0x07, 1, 0,
- 0x08, 12, 0,
- 0x17, 192, 0,
- 0x18, 1664 % 256, 1664 / 256,
- 0x2a, 16, 0,
- 0x2B, 17, 0,
- 0x34, 14, 0,
- 0x35, 15, 0,
- 12,
- 0x03, 22, 0,
- 0x04, 23, 0,
- 0x08, 20, 0,
- 0x0c, 19, 0,
- 0x13, 26, 0,
- 0x17, 21, 0,
- 0x18, 28, 0,
- 0x24, 27, 0,
- 0x27, 18, 0,
- 0x28, 24, 0,
- 0x2B, 25, 0,
- 0x37, 256 % 256, 256 / 256,
- 42,
- 0x02, 29, 0,
- 0x03, 30, 0,
- 0x04, 45, 0,
- 0x05, 46, 0,
- 0x0a, 47, 0,
- 0x0b, 48, 0,
- 0x12, 33, 0,
- 0x13, 34, 0,
- 0x14, 35, 0,
- 0x15, 36, 0,
- 0x16, 37, 0,
- 0x17, 38, 0,
- 0x1a, 31, 0,
- 0x1b, 32, 0,
- 0x24, 53, 0,
- 0x25, 54, 0,
- 0x28, 39, 0,
- 0x29, 40, 0,
- 0x2a, 41, 0,
- 0x2b, 42, 0,
- 0x2c, 43, 0,
- 0x2d, 44, 0,
- 0x32, 61, 0,
- 0x33, 62, 0,
- 0x34, 63, 0,
- 0x35, 0, 0,
- 0x36, 320 % 256, 320 / 256,
- 0x37, 384 % 256, 384 / 256,
- 0x4a, 59, 0,
- 0x4b, 60, 0,
- 0x52, 49, 0,
- 0x53, 50, 0,
- 0x54, 51, 0,
- 0x55, 52, 0,
- 0x58, 55, 0,
- 0x59, 56, 0,
- 0x5a, 57, 0,
- 0x5b, 58, 0,
- 0x64, 448 % 256, 448 / 256,
- 0x65, 512 % 256, 512 / 256,
- 0x67, 640 % 256, 640 / 256,
- 0x68, 576 % 256, 576 / 256,
- 16,
- 0x98, 1472 % 256, 1472 / 256,
- 0x99, 1536 % 256, 1536 / 256,
- 0x9a, 1600 % 256, 1600 / 256,
- 0x9b, 1728 % 256, 1728 / 256,
- 0xcc, 704 % 256, 704 / 256,
- 0xcd, 768 % 256, 768 / 256,
- 0xd2, 832 % 256, 832 / 256,
- 0xd3, 896 % 256, 896 / 256,
- 0xd4, 960 % 256, 960 / 256,
- 0xd5, 1024 % 256, 1024 / 256,
- 0xd6, 1088 % 256, 1088 / 256,
- 0xd7, 1152 % 256, 1152 / 256,
- 0xd8, 1216 % 256, 1216 / 256,
- 0xd9, 1280 % 256, 1280 / 256,
- 0xda, 1344 % 256, 1344 / 256,
- 0xdb, 1408 % 256, 1408 / 256,
- 0,
- 3,
- 0x08, 1792 % 256, 1792 / 256,
- 0x0c, 1856 % 256, 1856 / 256,
- 0x0d, 1920 % 256, 1920 / 256,
- 10,
- 0x12, 1984 % 256, 1984 / 256,
- 0x13, 2048 % 256, 2048 / 256,
- 0x14, 2112 % 256, 2112 / 256,
- 0x15, 2176 % 256, 2176 / 256,
- 0x16, 2240 % 256, 2240 / 256,
- 0x17, 2304 % 256, 2304 / 256,
- 0x1c, 2368 % 256, 2368 / 256,
- 0x1d, 2432 % 256, 2432 / 256,
- 0x1e, 2496 % 256, 2496 / 256,
- 0x1f, 2560 % 256, 2560 / 256,
- 0xff,
-};
-int _FaxGetRun(FX_LPCBYTE ins_array, const FX_BYTE* src_buf, int& bitpos, int bitsize)
-{
- FX_DWORD code = 0;
- int ins_off = 0;
- while (1) {
- FX_BYTE ins = ins_array[ins_off++];
- if (ins == 0xff) {
- return -1;
- }
- if (bitpos >= bitsize) {
- return -1;
- }
- code <<= 1;
- if (src_buf[bitpos / 8] & (1 << (7 - bitpos % 8))) {
- code ++;
- }
- bitpos ++;
- int next_off = ins_off + ins * 3;
- for (; ins_off < next_off; ins_off += 3) {
- if (ins_array[ins_off] == code) {
- return ins_array[ins_off + 1] + ins_array[ins_off + 2] * 256;
- }
- }
- }
-}
-FX_BOOL _FaxG4GetRow(const FX_BYTE* src_buf, int bitsize, int& bitpos, FX_LPBYTE dest_buf, const FX_BYTE* ref_buf, int columns)
-{
- int a0 = -1, a0color = 1;
- while (1) {
- if (bitpos >= bitsize) {
- return FALSE;
- }
- int a1, a2, b1, b2;
- _FaxG4FindB1B2(ref_buf, columns, a0, a0color, b1, b2);
- FX_BOOL bit = NEXTBIT;
- int v_delta = 0;
- if (bit) {
- } else {
- if (bitpos >= bitsize) {
- return FALSE;
- }
- FX_BOOL bit1 = NEXTBIT;
- if (bitpos >= bitsize) {
- return FALSE;
- }
- FX_BOOL bit2 = NEXTBIT;
- if (bit1 && bit2) {
- v_delta = 1;
- } else if (bit1) {
- v_delta = -1;
- } else if (bit2) {
- int run_len1 = 0;
- while (1) {
- int run = _FaxGetRun(a0color ? FaxWhiteRunIns : FaxBlackRunIns, src_buf, bitpos, bitsize);
- run_len1 += run;
- if (run < 64) {
- break;
- }
- }
- if (a0 < 0) {
- run_len1 ++;
- }
- a1 = a0 + run_len1;
- if (!a0color) {
- _FaxFillBits(dest_buf, columns, a0, a1);
- }
- int run_len2 = 0;
- while (1) {
- int run = _FaxGetRun(a0color ? FaxBlackRunIns : FaxWhiteRunIns, src_buf, bitpos, bitsize);
- run_len2 += run;
- if (run < 64) {
- break;
- }
- }
- a2 = a1 + run_len2;
- if (a0color) {
- _FaxFillBits(dest_buf, columns, a1, a2);
- }
- a0 = a2;
- if (a0 < columns) {
- continue;
- }
- return TRUE;
- } else {
- if (bitpos >= bitsize) {
- return FALSE;
- }
- bit = NEXTBIT;
- if (bit) {
- if (!a0color) {
- _FaxFillBits(dest_buf, columns, a0, b2);
- }
- if (b2 >= columns) {
- return TRUE;
- }
- a0 = b2;
- continue;
- } else {
- if (bitpos >= bitsize) {
- return FALSE;
- }
- FX_BOOL bit1 = NEXTBIT;
- if (bitpos >= bitsize) {
- return FALSE;
- }
- FX_BOOL bit2 = NEXTBIT;
- if (bit1 && bit2) {
- v_delta = 2;
- } else if (bit1) {
- v_delta = -2;
- } else if (bit2) {
- if (bitpos >= bitsize) {
- return FALSE;
- }
- bit = NEXTBIT;
- if (bit) {
- v_delta = 3;
- } else {
- v_delta = -3;
- }
- } else {
- if (bitpos >= bitsize) {
- return FALSE;
- }
- bit = NEXTBIT;
- if (bit) {
- bitpos += 3;
- continue;
- } else {
- bitpos += 5;
- return TRUE;
- }
- }
- }
- }
- }
- a1 = b1 + v_delta;
- if (!a0color) {
- _FaxFillBits(dest_buf, columns, a0, a1);
- }
- if (a1 >= columns) {
- return TRUE;
- }
- a0 = a1;
- a0color = !a0color;
- }
-}
-FX_BOOL _FaxSkipEOL(const FX_BYTE* src_buf, int bitsize, int& bitpos)
-{
- int startbit = bitpos;
- while (bitpos < bitsize) {
- int bit = NEXTBIT;
- if (bit) {
- if (bitpos - startbit <= 11) {
- bitpos = startbit;
- }
- return TRUE;
- }
- }
- return FALSE;
-}
-FX_BOOL _FaxGet1DLine(const FX_BYTE* src_buf, int bitsize, int& bitpos, FX_LPBYTE dest_buf, int columns)
-{
- int color = TRUE;
- int startpos = 0;
- while (1) {
- if (bitpos >= bitsize) {
- return FALSE;
- }
- int run_len = 0;
- while (1) {
- int run = _FaxGetRun(color ? FaxWhiteRunIns : FaxBlackRunIns, src_buf, bitpos, bitsize);
- if (run < 0) {
- while (bitpos < bitsize) {
- int bit = NEXTBIT;
- if (bit) {
- return TRUE;
- }
- }
- return FALSE;
- }
- run_len += run;
- if (run < 64) {
- break;
- }
- }
- if (!color) {
- _FaxFillBits(dest_buf, columns, startpos, startpos + run_len);
- }
- startpos += run_len;
- if (startpos >= columns) {
- break;
- }
- color = !color;
- }
- return TRUE;
-}
-class CCodec_FaxDecoder : public CCodec_ScanlineDecoder
-{
-public:
- CCodec_FaxDecoder();
- virtual ~CCodec_FaxDecoder();
- FX_BOOL Create(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,
- int K, FX_BOOL EndOfLine, FX_BOOL EncodedByteAlign, FX_BOOL BlackIs1, int Columns, int Rows);
- virtual void v_DownScale(int dest_width, int dest_height) {}
- virtual FX_BOOL v_Rewind();
- virtual FX_LPBYTE v_GetNextLine();
- virtual FX_DWORD GetSrcOffset();
- int m_Encoding, m_bEndOfLine, m_bByteAlign, m_bBlack;
- int bitpos;
- FX_LPCBYTE m_pSrcBuf;
- FX_DWORD m_SrcSize;
- FX_LPBYTE m_pScanlineBuf, m_pRefBuf;
-};
-CCodec_FaxDecoder::CCodec_FaxDecoder()
-{
- m_pScanlineBuf = NULL;
- m_pRefBuf = NULL;
-}
-CCodec_FaxDecoder::~CCodec_FaxDecoder()
-{
- if (m_pScanlineBuf) {
- FX_Free(m_pScanlineBuf);
- }
- if (m_pRefBuf) {
- FX_Free(m_pRefBuf);
- }
-}
-FX_BOOL CCodec_FaxDecoder::Create(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,
- int K, FX_BOOL EndOfLine, FX_BOOL EncodedByteAlign, FX_BOOL BlackIs1, int Columns, int Rows)
-{
- m_Encoding = K;
- m_bEndOfLine = EndOfLine;
- m_bByteAlign = EncodedByteAlign;
- m_bBlack = BlackIs1;
- m_OrigWidth = Columns;
- m_OrigHeight = Rows;
- if (m_OrigWidth == 0) {
- m_OrigWidth = width;
- }
- if (m_OrigHeight == 0) {
- m_OrigHeight = height;
- }
- m_Pitch = (m_OrigWidth + 31) / 32 * 4;
- m_OutputWidth = m_OrigWidth;
- m_OutputHeight = m_OrigHeight;
- m_pScanlineBuf = FX_Alloc(FX_BYTE, m_Pitch);
- if (m_pScanlineBuf == NULL) {
- return FALSE;
- }
- m_pRefBuf = FX_Alloc(FX_BYTE, m_Pitch);
- if (m_pRefBuf == NULL) {
- return FALSE;
- }
- m_pSrcBuf = src_buf;
- m_SrcSize = src_size;
- m_nComps = 1;
- m_bpc = 1;
- m_bColorTransformed = FALSE;
- return TRUE;
-}
-FX_BOOL CCodec_FaxDecoder::v_Rewind()
-{
- FXSYS_memset8(m_pRefBuf, 0xff, m_Pitch);
- bitpos = 0;
- return TRUE;
-}
-FX_LPBYTE CCodec_FaxDecoder::v_GetNextLine()
-{
- int bitsize = m_SrcSize * 8;
- _FaxSkipEOL(m_pSrcBuf, bitsize, bitpos);
- if (bitpos >= bitsize) {
- return NULL;
- }
- FXSYS_memset8(m_pScanlineBuf, 0xff, m_Pitch);
- if (m_Encoding < 0) {
- _FaxG4GetRow(m_pSrcBuf, bitsize, bitpos, m_pScanlineBuf, m_pRefBuf, m_OrigWidth);
- FXSYS_memcpy32(m_pRefBuf, m_pScanlineBuf, m_Pitch);
- } else if (m_Encoding == 0) {
- _FaxGet1DLine(m_pSrcBuf, bitsize, bitpos, m_pScanlineBuf, m_OrigWidth);
- } else {
- FX_BOOL bNext1D = m_pSrcBuf[bitpos / 8] & (1 << (7 - bitpos % 8));
- bitpos ++;
- if (bNext1D) {
- _FaxGet1DLine(m_pSrcBuf, bitsize, bitpos, m_pScanlineBuf, m_OrigWidth);
- } else {
- _FaxG4GetRow(m_pSrcBuf, bitsize, bitpos, m_pScanlineBuf, m_pRefBuf, m_OrigWidth);
- }
- FXSYS_memcpy32(m_pRefBuf, m_pScanlineBuf, m_Pitch);
- }
- if (m_bEndOfLine) {
- _FaxSkipEOL(m_pSrcBuf, bitsize, bitpos);
- }
- if (m_bByteAlign && bitpos < bitsize) {
- int bitpos0 = bitpos;
- int bitpos1 = (bitpos + 7) / 8 * 8;
- while (m_bByteAlign && bitpos0 < bitpos1) {
- int bit = m_pSrcBuf[bitpos0 / 8] & (1 << (7 - bitpos0 % 8));
- if (bit != 0) {
- m_bByteAlign = FALSE;
- } else {
- bitpos0 ++;
- }
- }
- if (m_bByteAlign) {
- bitpos = bitpos1;
- }
- }
- if (m_bBlack) {
- for (int i = 0; i < m_Pitch; i ++) {
- m_pScanlineBuf[i] = ~m_pScanlineBuf[i];
- }
- }
- return m_pScanlineBuf;
-}
-FX_DWORD CCodec_FaxDecoder::GetSrcOffset()
-{
- FX_DWORD ret = (bitpos + 7) / 8;
- if (ret > m_SrcSize) {
- ret = m_SrcSize;
- }
- return ret;
-}
-extern "C" {
- void _FaxG4Decode(void*, FX_LPCBYTE src_buf, FX_DWORD src_size, int* pbitpos, FX_LPBYTE dest_buf, int width, int height, int pitch)
- {
- if (pitch == 0) {
- pitch = (width + 7) / 8;
- }
- FX_LPBYTE ref_buf = FX_Alloc(FX_BYTE, pitch);
- if (ref_buf == NULL) {
- return;
- }
- FXSYS_memset8(ref_buf, 0xff, pitch);
- int bitpos = *pbitpos;
- for (int iRow = 0; iRow < height; iRow ++) {
- FX_LPBYTE line_buf = dest_buf + iRow * pitch;
- FXSYS_memset8(line_buf, 0xff, pitch);
- _FaxG4GetRow(src_buf, src_size << 3, bitpos, line_buf, ref_buf, width);
- FXSYS_memcpy32(ref_buf, line_buf, pitch);
- }
- FX_Free(ref_buf);
- *pbitpos = bitpos;
- }
-};
-static const FX_BYTE BlackRunTerminator[128] = {
- 0x37, 10, 0x02, 3, 0x03, 2, 0x02, 2, 0x03, 3, 0x03, 4, 0x02, 4, 0x03, 5,
- 0x05, 6, 0x04, 6, 0x04, 7, 0x05, 7, 0x07, 7, 0x04, 8, 0x07, 8, 0x18, 9,
- 0x17, 10, 0x18, 10, 0x08, 10, 0x67, 11, 0x68, 11, 0x6c, 11, 0x37, 11, 0x28, 11,
- 0x17, 11, 0x18, 11, 0xca, 12, 0xcb, 12, 0xcc, 12, 0xcd, 12, 0x68, 12, 0x69, 12,
- 0x6a, 12, 0x6b, 12, 0xd2, 12, 0xd3, 12, 0xd4, 12, 0xd5, 12, 0xd6, 12, 0xd7, 12,
- 0x6c, 12, 0x6d, 12, 0xda, 12, 0xdb, 12, 0x54, 12, 0x55, 12, 0x56, 12, 0x57, 12,
- 0x64, 12, 0x65, 12, 0x52, 12, 0x53, 12, 0x24, 12, 0x37, 12, 0x38, 12, 0x27, 12,
- 0x28, 12, 0x58, 12, 0x59, 12, 0x2b, 12, 0x2c, 12, 0x5a, 12, 0x66, 12, 0x67, 12,
-};
-static const FX_BYTE BlackRunMarkup[80] = {
- 0x0f, 10, 0xc8, 12, 0xc9, 12, 0x5b, 12, 0x33, 12, 0x34, 12, 0x35, 12, 0x6c, 13,
- 0x6d, 13, 0x4a, 13, 0x4b, 13, 0x4c, 13, 0x4d, 13, 0x72, 13, 0x73, 13, 0x74, 13,
- 0x75, 13, 0x76, 13, 0x77, 13, 0x52, 13, 0x53, 13, 0x54, 13, 0x55, 13, 0x5a, 13,
- 0x5b, 13, 0x64, 13, 0x65, 13, 0x08, 11, 0x0c, 11, 0x0d, 11, 0x12, 12, 0x13, 12,
- 0x14, 12, 0x15, 12, 0x16, 12, 0x17, 12, 0x1c, 12, 0x1d, 12, 0x1e, 12, 0x1f, 12,
-};
-static const FX_BYTE WhiteRunTerminator[128] = {
- 0x35, 8,
- 0x07, 6,
- 0x07, 4,
- 0x08, 4,
- 0x0B, 4,
- 0x0C, 4,
- 0x0E, 4,
- 0x0F, 4,
- 0x13, 5,
- 0x14, 5,
- 0x07, 5,
- 0x08, 5,
- 0x08, 6,
- 0x03, 6,
- 0x34, 6,
- 0x35, 6,
- 0x2a, 6,
- 0x2B, 6,
- 0x27, 7,
- 0x0c, 7,
- 0x08, 7,
- 0x17, 7,
- 0x03, 7,
- 0x04, 7,
- 0x28, 7,
- 0x2B, 7,
- 0x13, 7,
- 0x24, 7,
- 0x18, 7,
- 0x02, 8,
- 0x03, 8,
- 0x1a, 8,
- 0x1b, 8,
- 0x12, 8,
- 0x13, 8,
- 0x14, 8,
- 0x15, 8,
- 0x16, 8,
- 0x17, 8,
- 0x28, 8,
- 0x29, 8,
- 0x2a, 8,
- 0x2b, 8,
- 0x2c, 8,
- 0x2d, 8,
- 0x04, 8,
- 0x05, 8,
- 0x0a, 8,
- 0x0b, 8,
- 0x52, 8,
- 0x53, 8,
- 0x54, 8,
- 0x55, 8,
- 0x24, 8,
- 0x25, 8,
- 0x58, 8,
- 0x59, 8,
- 0x5a, 8,
- 0x5b, 8,
- 0x4a, 8,
- 0x4b, 8,
- 0x32, 8,
- 0x33, 8,
- 0x34, 8,
-};
-static const FX_BYTE WhiteRunMarkup[80] = {
- 0x1b, 5,
- 0x12, 5,
- 0x17, 6,
- 0x37, 7,
- 0x36, 8,
- 0x37, 8,
- 0x64, 8,
- 0x65, 8,
- 0x68, 8,
- 0x67, 8,
- 0xcc, 9,
- 0xcd, 9,
- 0xd2, 9,
- 0xd3, 9,
- 0xd4, 9,
- 0xd5, 9,
- 0xd6, 9,
- 0xd7, 9,
- 0xd8, 9,
- 0xd9, 9,
- 0xda, 9,
- 0xdb, 9,
- 0x98, 9,
- 0x99, 9,
- 0x9a, 9,
- 0x18, 6,
- 0x9b, 9,
- 0x08, 11,
- 0x0c, 11,
- 0x0d, 11,
- 0x12, 12,
- 0x13, 12,
- 0x14, 12,
- 0x15, 12,
- 0x16, 12,
- 0x17, 12,
- 0x1c, 12,
- 0x1d, 12,
- 0x1e, 12,
- 0x1f, 12,
-};
-static void _AddBitStream(FX_LPBYTE dest_buf, int& dest_bitpos, int data, int bitlen)
-{
- for (int i = bitlen - 1; i >= 0; i --) {
- if (data & (1 << i)) {
- dest_buf[dest_bitpos / 8] |= 1 << (7 - dest_bitpos % 8);
- }
- dest_bitpos ++;
- }
-}
-static void _FaxEncodeRun(FX_LPBYTE dest_buf, int& dest_bitpos, int run, FX_BOOL bWhite)
-{
- while (run >= 2560) {
- _AddBitStream(dest_buf, dest_bitpos, 0x1f, 12);
- run -= 2560;
- }
- if (run >= 64) {
- int markup = run - run % 64;
- FX_LPCBYTE p = bWhite ? WhiteRunMarkup : BlackRunMarkup;
- p += (markup / 64 - 1) * 2;
- _AddBitStream(dest_buf, dest_bitpos, *p, p[1]);
- }
- run %= 64;
- FX_LPCBYTE p = bWhite ? WhiteRunTerminator : BlackRunTerminator;
- p += run * 2;
- _AddBitStream(dest_buf, dest_bitpos, *p, p[1]);
-}
-static void _FaxEncode2DLine(FX_LPBYTE dest_buf, int& dest_bitpos, FX_LPCBYTE src_buf, FX_LPCBYTE ref_buf, int cols)
-{
- int a0 = -1, a0color = 1;
- while (1) {
- int a1 = _FindBit(src_buf, cols, a0 + 1, 1 - a0color);
- int b1, b2;
- _FaxG4FindB1B2(ref_buf, cols, a0, a0color, b1, b2);
- if (b2 < a1) {
- dest_bitpos += 3;
- dest_buf[dest_bitpos / 8] |= 1 << (7 - dest_bitpos % 8);
- dest_bitpos ++;
- a0 = b2;
- } else if (a1 - b1 <= 3 && b1 - a1 <= 3) {
- int delta = a1 - b1;
- switch (delta) {
- case 0:
- dest_buf[dest_bitpos / 8] |= 1 << (7 - dest_bitpos % 8);
- break;
- case 1:
- case 2:
- case 3:
- dest_bitpos += delta == 1 ? 1 : delta + 2;
- dest_buf[dest_bitpos / 8] |= 1 << (7 - dest_bitpos % 8);
- dest_bitpos ++;
- dest_buf[dest_bitpos / 8] |= 1 << (7 - dest_bitpos % 8);
- break;
- case -1:
- case -2:
- case -3:
- dest_bitpos += delta == -1 ? 1 : -delta + 2;
- dest_buf[dest_bitpos / 8] |= 1 << (7 - dest_bitpos % 8);
- dest_bitpos ++;
- break;
- }
- dest_bitpos ++;
- a0 = a1;
- a0color = 1 - a0color;
- } else {
- int a2 = _FindBit(src_buf, cols, a1 + 1, a0color);
- dest_bitpos ++;
- dest_bitpos ++;
- dest_buf[dest_bitpos / 8] |= 1 << (7 - dest_bitpos % 8);
- dest_bitpos ++;
- if (a0 < 0) {
- a0 = 0;
- }
- _FaxEncodeRun(dest_buf, dest_bitpos, a1 - a0, a0color);
- _FaxEncodeRun(dest_buf, dest_bitpos, a2 - a1, 1 - a0color);
- a0 = a2;
- }
- if (a0 >= cols) {
- return;
- }
- }
-}
-class CCodec_FaxEncoder : public CFX_Object
-{
-public:
- CCodec_FaxEncoder(FX_LPCBYTE src_buf, int width, int height, int pitch);
- ~CCodec_FaxEncoder();
- void Encode(FX_LPBYTE& dest_buf, FX_DWORD& dest_size);
- void Encode2DLine(FX_LPCBYTE scan_line);
- CFX_BinaryBuf m_DestBuf;
- FX_LPBYTE m_pRefLine, m_pLineBuf;
- int m_Cols, m_Rows, m_Pitch;
- FX_LPCBYTE m_pSrcBuf;
-};
-CCodec_FaxEncoder::CCodec_FaxEncoder(FX_LPCBYTE src_buf, int width, int height, int pitch)
-{
- m_pSrcBuf = src_buf;
- m_Cols = width;
- m_Rows = height;
- m_Pitch = pitch;
- m_pRefLine = FX_Alloc(FX_BYTE, m_Pitch);
- if (m_pRefLine == NULL) {
- return;
- }
- FXSYS_memset8(m_pRefLine, 0xff, m_Pitch);
- m_pLineBuf = FX_Alloc(FX_BYTE, m_Pitch * 8);
- if (m_pLineBuf == NULL) {
- return;
- }
- m_DestBuf.EstimateSize(0, 10240);
-}
-CCodec_FaxEncoder::~CCodec_FaxEncoder()
-{
- if (m_pRefLine) {
- FX_Free(m_pRefLine);
- }
- if (m_pLineBuf) {
- FX_Free(m_pLineBuf);
- }
-}
-void CCodec_FaxEncoder::Encode(FX_LPBYTE& dest_buf, FX_DWORD& dest_size)
-{
- int dest_bitpos = 0;
- FX_BYTE last_byte = 0;
- for (int i = 0; i < m_Rows; i ++) {
- FX_LPCBYTE scan_line = m_pSrcBuf + i * m_Pitch;
- FXSYS_memset32(m_pLineBuf, 0, m_Pitch * 8);
- m_pLineBuf[0] = last_byte;
- _FaxEncode2DLine(m_pLineBuf, dest_bitpos, scan_line, m_pRefLine, m_Cols);
- m_DestBuf.AppendBlock(m_pLineBuf, dest_bitpos / 8);
- last_byte = m_pLineBuf[dest_bitpos / 8];
- dest_bitpos %= 8;
- FXSYS_memcpy32(m_pRefLine, scan_line, m_Pitch);
- }
- if (dest_bitpos) {
- m_DestBuf.AppendByte(last_byte);
- }
- dest_buf = m_DestBuf.GetBuffer();
- dest_size = m_DestBuf.GetSize();
- m_DestBuf.DetachBuffer();
-}
-FX_BOOL CCodec_FaxModule::Encode(FX_LPCBYTE src_buf, int width, int height, int pitch, FX_LPBYTE& dest_buf, FX_DWORD& dest_size)
-{
- CCodec_FaxEncoder encoder(src_buf, width, height, pitch);
- encoder.Encode(dest_buf, dest_size);
- return TRUE;
-}
-ICodec_ScanlineDecoder* CCodec_FaxModule::CreateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,
- int K, FX_BOOL EndOfLine, FX_BOOL EncodedByteAlign, FX_BOOL BlackIs1, int Columns, int Rows)
-{
- CCodec_FaxDecoder* pDecoder = FX_NEW CCodec_FaxDecoder;
- if (pDecoder == NULL) {
- return NULL;
- }
- pDecoder->Create(src_buf, src_size, width, height, K, EndOfLine, EncodedByteAlign, BlackIs1, Columns, Rows);
- return pDecoder;
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxcodec/fx_codec.h"
+#include "codec_int.h"
+extern const FX_BYTE OneLeadPos[256];
+extern const FX_BYTE ZeroLeadPos[256];
+int _FindBit(const FX_BYTE* data_buf, int max_pos, int start_pos, int bit)
+{
+ if (start_pos >= max_pos) {
+ return max_pos;
+ }
+ FX_LPCBYTE leading_pos = bit ? OneLeadPos : ZeroLeadPos;
+ if (start_pos % 8) {
+ FX_BYTE data = data_buf[start_pos / 8];
+ if (bit) {
+ data &= 0xff >> (start_pos % 8);
+ } else {
+ data |= 0xff << (8 - start_pos % 8);
+ }
+ if (leading_pos[data] < 8) {
+ return start_pos / 8 * 8 + leading_pos[data];
+ }
+ start_pos += 7;
+ }
+ FX_BYTE skip = bit ? 0x00 : 0xff;
+ int byte_pos = start_pos / 8;
+ int max_byte = (max_pos + 7) / 8;
+ while (byte_pos < max_byte) {
+ if (data_buf[byte_pos] != skip) {
+ break;
+ }
+ byte_pos ++;
+ }
+ if (byte_pos == max_byte) {
+ return max_pos;
+ }
+ int pos = leading_pos[data_buf[byte_pos]] + byte_pos * 8;
+ if (pos > max_pos) {
+ pos = max_pos;
+ }
+ return pos;
+}
+void _FaxG4FindB1B2(const FX_BYTE* ref_buf, int columns, int a0, FX_BOOL a0color, int& b1, int& b2)
+{
+ if (a0color) {
+ a0color = 1;
+ }
+ FX_BYTE first_bit = (a0 < 0) ? 1 : ((ref_buf[a0 / 8] & (1 << (7 - a0 % 8))) != 0);
+ b1 = _FindBit(ref_buf, columns, a0 + 1, !first_bit);
+ if (b1 >= columns) {
+ b1 = b2 = columns;
+ return;
+ }
+ if (first_bit == !a0color) {
+ b1 = _FindBit(ref_buf, columns, b1 + 1, first_bit);
+ first_bit = !first_bit;
+ }
+ if (b1 >= columns) {
+ b1 = b2 = columns;
+ return;
+ }
+ b2 = _FindBit(ref_buf, columns, b1 + 1, first_bit);
+}
+void _FaxFillBits(FX_LPBYTE dest_buf, int columns, int startpos, int endpos)
+{
+ if (startpos < 0) {
+ startpos = 0;
+ }
+ if (endpos < 0) {
+ endpos = 0;
+ }
+ if (endpos >= columns) {
+ endpos = columns;
+ }
+ if (startpos >= endpos) {
+ return;
+ }
+ int first_byte = startpos / 8;
+ int last_byte = (endpos - 1) / 8;
+ if (first_byte == last_byte) {
+ for (int i = startpos % 8; i <= (endpos - 1) % 8; i ++) {
+ dest_buf[first_byte] -= 1 << (7 - i);
+ }
+ return;
+ }
+ int i;
+ for (i = startpos % 8; i < 8; i ++) {
+ dest_buf[first_byte] -= 1 << (7 - i);
+ }
+ for (i = 0; i <= (endpos - 1) % 8; i ++) {
+ dest_buf[last_byte] -= 1 << (7 - i);
+ }
+ if (last_byte > first_byte + 1) {
+ FXSYS_memset32(dest_buf + first_byte + 1, 0, last_byte - first_byte - 1);
+ }
+}
+#define NEXTBIT src_buf[bitpos/8] & (1 << (7-bitpos%8)); bitpos ++;
+#define ADDBIT(code, bit) code = code << 1; if (bit) code ++;
+#define GETBIT(bitpos) src_buf[bitpos/8] & (1 << (7-bitpos%8))
+static const FX_BYTE FaxBlackRunIns[] = {
+ 0,
+ 2,
+ 0x02, 3, 0,
+ 0x03, 2, 0,
+ 2,
+ 0x02, 1, 0,
+ 0x03, 4, 0,
+ 2,
+ 0x02, 6, 0,
+ 0x03, 5, 0,
+ 1,
+ 0x03, 7, 0,
+ 2,
+ 0x04, 9, 0,
+ 0x05, 8, 0,
+ 3,
+ 0x04, 10, 0,
+ 0x05, 11, 0,
+ 0x07, 12, 0,
+ 2,
+ 0x04, 13, 0,
+ 0x07, 14, 0,
+ 1,
+ 0x18, 15, 0,
+ 5,
+ 0x08, 18, 0,
+ 0x0f, 64, 0,
+ 0x17, 16, 0,
+ 0x18, 17, 0,
+ 0x37, 0, 0,
+ 10,
+ 0x08, 0x00, 0x07,
+ 0x0c, 0x40, 0x07,
+ 0x0d, 0x80, 0x07,
+ 0x17, 24, 0,
+ 0x18, 25, 0,
+ 0x28, 23, 0,
+ 0x37, 22, 0,
+ 0x67, 19, 0,
+ 0x68, 20, 0,
+ 0x6c, 21, 0,
+ 54,
+ 0x12, 1984 % 256, 1984 / 256,
+ 0x13, 2048 % 256, 2048 / 256,
+ 0x14, 2112 % 256, 2112 / 256,
+ 0x15, 2176 % 256, 2176 / 256,
+ 0x16, 2240 % 256, 2240 / 256,
+ 0x17, 2304 % 256, 2304 / 256,
+ 0x1c, 2368 % 256, 2368 / 256,
+ 0x1d, 2432 % 256, 2432 / 256,
+ 0x1e, 2496 % 256, 2496 / 256,
+ 0x1f, 2560 % 256, 2560 / 256,
+ 0x24, 52, 0,
+ 0x27, 55, 0,
+ 0x28, 56, 0,
+ 0x2b, 59, 0,
+ 0x2c, 60, 0,
+ 0x33, 320 % 256, 320 / 256,
+ 0x34, 384 % 256, 384 / 256,
+ 0x35, 448 % 256, 448 / 256,
+ 0x37, 53, 0,
+ 0x38, 54, 0,
+ 0x52, 50, 0,
+ 0x53, 51, 0,
+ 0x54, 44, 0,
+ 0x55, 45, 0,
+ 0x56, 46, 0,
+ 0x57, 47, 0,
+ 0x58, 57, 0,
+ 0x59, 58, 0,
+ 0x5a, 61, 0,
+ 0x5b, 256 % 256, 256 / 256,
+ 0x64, 48, 0,
+ 0x65, 49, 0,
+ 0x66, 62, 0,
+ 0x67, 63, 0,
+ 0x68, 30, 0,
+ 0x69, 31, 0,
+ 0x6a, 32, 0,
+ 0x6b, 33, 0,
+ 0x6c, 40, 0,
+ 0x6d, 41, 0,
+ 0xc8, 128, 0,
+ 0xc9, 192, 0,
+ 0xca, 26, 0,
+ 0xcb, 27, 0,
+ 0xcc, 28, 0,
+ 0xcd, 29, 0,
+ 0xd2, 34, 0,
+ 0xd3, 35, 0,
+ 0xd4, 36, 0,
+ 0xd5, 37, 0,
+ 0xd6, 38, 0,
+ 0xd7, 39, 0,
+ 0xda, 42, 0,
+ 0xdb, 43, 0,
+ 20,
+ 0x4a, 640 % 256, 640 / 256,
+ 0x4b, 704 % 256, 704 / 256,
+ 0x4c, 768 % 256, 768 / 256,
+ 0x4d, 832 % 256, 832 / 256,
+ 0x52, 1280 % 256, 1280 / 256,
+ 0x53, 1344 % 256, 1344 / 256,
+ 0x54, 1408 % 256, 1408 / 256,
+ 0x55, 1472 % 256, 1472 / 256,
+ 0x5a, 1536 % 256, 1536 / 256,
+ 0x5b, 1600 % 256, 1600 / 256,
+ 0x64, 1664 % 256, 1664 / 256,
+ 0x65, 1728 % 256, 1728 / 256,
+ 0x6c, 512 % 256, 512 / 256,
+ 0x6d, 576 % 256, 576 / 256,
+ 0x72, 896 % 256, 896 / 256,
+ 0x73, 960 % 256, 960 / 256,
+ 0x74, 1024 % 256, 1024 / 256,
+ 0x75, 1088 % 256, 1088 / 256,
+ 0x76, 1152 % 256, 1152 / 256,
+ 0x77, 1216 % 256, 1216 / 256,
+ 0xff
+};
+static const FX_BYTE FaxWhiteRunIns[] = {
+ 0,
+ 0,
+ 0,
+ 6,
+ 0x07, 2, 0,
+ 0x08, 3, 0,
+ 0x0B, 4, 0,
+ 0x0C, 5, 0,
+ 0x0E, 6, 0,
+ 0x0F, 7, 0,
+ 6,
+ 0x07, 10, 0,
+ 0x08, 11, 0,
+ 0x12, 128, 0,
+ 0x13, 8, 0,
+ 0x14, 9, 0,
+ 0x1b, 64, 0,
+ 9,
+ 0x03, 13, 0,
+ 0x07, 1, 0,
+ 0x08, 12, 0,
+ 0x17, 192, 0,
+ 0x18, 1664 % 256, 1664 / 256,
+ 0x2a, 16, 0,
+ 0x2B, 17, 0,
+ 0x34, 14, 0,
+ 0x35, 15, 0,
+ 12,
+ 0x03, 22, 0,
+ 0x04, 23, 0,
+ 0x08, 20, 0,
+ 0x0c, 19, 0,
+ 0x13, 26, 0,
+ 0x17, 21, 0,
+ 0x18, 28, 0,
+ 0x24, 27, 0,
+ 0x27, 18, 0,
+ 0x28, 24, 0,
+ 0x2B, 25, 0,
+ 0x37, 256 % 256, 256 / 256,
+ 42,
+ 0x02, 29, 0,
+ 0x03, 30, 0,
+ 0x04, 45, 0,
+ 0x05, 46, 0,
+ 0x0a, 47, 0,
+ 0x0b, 48, 0,
+ 0x12, 33, 0,
+ 0x13, 34, 0,
+ 0x14, 35, 0,
+ 0x15, 36, 0,
+ 0x16, 37, 0,
+ 0x17, 38, 0,
+ 0x1a, 31, 0,
+ 0x1b, 32, 0,
+ 0x24, 53, 0,
+ 0x25, 54, 0,
+ 0x28, 39, 0,
+ 0x29, 40, 0,
+ 0x2a, 41, 0,
+ 0x2b, 42, 0,
+ 0x2c, 43, 0,
+ 0x2d, 44, 0,
+ 0x32, 61, 0,
+ 0x33, 62, 0,
+ 0x34, 63, 0,
+ 0x35, 0, 0,
+ 0x36, 320 % 256, 320 / 256,
+ 0x37, 384 % 256, 384 / 256,
+ 0x4a, 59, 0,
+ 0x4b, 60, 0,
+ 0x52, 49, 0,
+ 0x53, 50, 0,
+ 0x54, 51, 0,
+ 0x55, 52, 0,
+ 0x58, 55, 0,
+ 0x59, 56, 0,
+ 0x5a, 57, 0,
+ 0x5b, 58, 0,
+ 0x64, 448 % 256, 448 / 256,
+ 0x65, 512 % 256, 512 / 256,
+ 0x67, 640 % 256, 640 / 256,
+ 0x68, 576 % 256, 576 / 256,
+ 16,
+ 0x98, 1472 % 256, 1472 / 256,
+ 0x99, 1536 % 256, 1536 / 256,
+ 0x9a, 1600 % 256, 1600 / 256,
+ 0x9b, 1728 % 256, 1728 / 256,
+ 0xcc, 704 % 256, 704 / 256,
+ 0xcd, 768 % 256, 768 / 256,
+ 0xd2, 832 % 256, 832 / 256,
+ 0xd3, 896 % 256, 896 / 256,
+ 0xd4, 960 % 256, 960 / 256,
+ 0xd5, 1024 % 256, 1024 / 256,
+ 0xd6, 1088 % 256, 1088 / 256,
+ 0xd7, 1152 % 256, 1152 / 256,
+ 0xd8, 1216 % 256, 1216 / 256,
+ 0xd9, 1280 % 256, 1280 / 256,
+ 0xda, 1344 % 256, 1344 / 256,
+ 0xdb, 1408 % 256, 1408 / 256,
+ 0,
+ 3,
+ 0x08, 1792 % 256, 1792 / 256,
+ 0x0c, 1856 % 256, 1856 / 256,
+ 0x0d, 1920 % 256, 1920 / 256,
+ 10,
+ 0x12, 1984 % 256, 1984 / 256,
+ 0x13, 2048 % 256, 2048 / 256,
+ 0x14, 2112 % 256, 2112 / 256,
+ 0x15, 2176 % 256, 2176 / 256,
+ 0x16, 2240 % 256, 2240 / 256,
+ 0x17, 2304 % 256, 2304 / 256,
+ 0x1c, 2368 % 256, 2368 / 256,
+ 0x1d, 2432 % 256, 2432 / 256,
+ 0x1e, 2496 % 256, 2496 / 256,
+ 0x1f, 2560 % 256, 2560 / 256,
+ 0xff,
+};
+int _FaxGetRun(FX_LPCBYTE ins_array, const FX_BYTE* src_buf, int& bitpos, int bitsize)
+{
+ FX_DWORD code = 0;
+ int ins_off = 0;
+ while (1) {
+ FX_BYTE ins = ins_array[ins_off++];
+ if (ins == 0xff) {
+ return -1;
+ }
+ if (bitpos >= bitsize) {
+ return -1;
+ }
+ code <<= 1;
+ if (src_buf[bitpos / 8] & (1 << (7 - bitpos % 8))) {
+ code ++;
+ }
+ bitpos ++;
+ int next_off = ins_off + ins * 3;
+ for (; ins_off < next_off; ins_off += 3) {
+ if (ins_array[ins_off] == code) {
+ return ins_array[ins_off + 1] + ins_array[ins_off + 2] * 256;
+ }
+ }
+ }
+}
+FX_BOOL _FaxG4GetRow(const FX_BYTE* src_buf, int bitsize, int& bitpos, FX_LPBYTE dest_buf, const FX_BYTE* ref_buf, int columns)
+{
+ int a0 = -1, a0color = 1;
+ while (1) {
+ if (bitpos >= bitsize) {
+ return FALSE;
+ }
+ int a1, a2, b1, b2;
+ _FaxG4FindB1B2(ref_buf, columns, a0, a0color, b1, b2);
+ FX_BOOL bit = NEXTBIT;
+ int v_delta = 0;
+ if (bit) {
+ } else {
+ if (bitpos >= bitsize) {
+ return FALSE;
+ }
+ FX_BOOL bit1 = NEXTBIT;
+ if (bitpos >= bitsize) {
+ return FALSE;
+ }
+ FX_BOOL bit2 = NEXTBIT;
+ if (bit1 && bit2) {
+ v_delta = 1;
+ } else if (bit1) {
+ v_delta = -1;
+ } else if (bit2) {
+ int run_len1 = 0;
+ while (1) {
+ int run = _FaxGetRun(a0color ? FaxWhiteRunIns : FaxBlackRunIns, src_buf, bitpos, bitsize);
+ run_len1 += run;
+ if (run < 64) {
+ break;
+ }
+ }
+ if (a0 < 0) {
+ run_len1 ++;
+ }
+ a1 = a0 + run_len1;
+ if (!a0color) {
+ _FaxFillBits(dest_buf, columns, a0, a1);
+ }
+ int run_len2 = 0;
+ while (1) {
+ int run = _FaxGetRun(a0color ? FaxBlackRunIns : FaxWhiteRunIns, src_buf, bitpos, bitsize);
+ run_len2 += run;
+ if (run < 64) {
+ break;
+ }
+ }
+ a2 = a1 + run_len2;
+ if (a0color) {
+ _FaxFillBits(dest_buf, columns, a1, a2);
+ }
+ a0 = a2;
+ if (a0 < columns) {
+ continue;
+ }
+ return TRUE;
+ } else {
+ if (bitpos >= bitsize) {
+ return FALSE;
+ }
+ bit = NEXTBIT;
+ if (bit) {
+ if (!a0color) {
+ _FaxFillBits(dest_buf, columns, a0, b2);
+ }
+ if (b2 >= columns) {
+ return TRUE;
+ }
+ a0 = b2;
+ continue;
+ } else {
+ if (bitpos >= bitsize) {
+ return FALSE;
+ }
+ FX_BOOL bit1 = NEXTBIT;
+ if (bitpos >= bitsize) {
+ return FALSE;
+ }
+ FX_BOOL bit2 = NEXTBIT;
+ if (bit1 && bit2) {
+ v_delta = 2;
+ } else if (bit1) {
+ v_delta = -2;
+ } else if (bit2) {
+ if (bitpos >= bitsize) {
+ return FALSE;
+ }
+ bit = NEXTBIT;
+ if (bit) {
+ v_delta = 3;
+ } else {
+ v_delta = -3;
+ }
+ } else {
+ if (bitpos >= bitsize) {
+ return FALSE;
+ }
+ bit = NEXTBIT;
+ if (bit) {
+ bitpos += 3;
+ continue;
+ } else {
+ bitpos += 5;
+ return TRUE;
+ }
+ }
+ }
+ }
+ }
+ a1 = b1 + v_delta;
+ if (!a0color) {
+ _FaxFillBits(dest_buf, columns, a0, a1);
+ }
+ if (a1 >= columns) {
+ return TRUE;
+ }
+ a0 = a1;
+ a0color = !a0color;
+ }
+}
+FX_BOOL _FaxSkipEOL(const FX_BYTE* src_buf, int bitsize, int& bitpos)
+{
+ int startbit = bitpos;
+ while (bitpos < bitsize) {
+ int bit = NEXTBIT;
+ if (bit) {
+ if (bitpos - startbit <= 11) {
+ bitpos = startbit;
+ }
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+FX_BOOL _FaxGet1DLine(const FX_BYTE* src_buf, int bitsize, int& bitpos, FX_LPBYTE dest_buf, int columns)
+{
+ int color = TRUE;
+ int startpos = 0;
+ while (1) {
+ if (bitpos >= bitsize) {
+ return FALSE;
+ }
+ int run_len = 0;
+ while (1) {
+ int run = _FaxGetRun(color ? FaxWhiteRunIns : FaxBlackRunIns, src_buf, bitpos, bitsize);
+ if (run < 0) {
+ while (bitpos < bitsize) {
+ int bit = NEXTBIT;
+ if (bit) {
+ return TRUE;
+ }
+ }
+ return FALSE;
+ }
+ run_len += run;
+ if (run < 64) {
+ break;
+ }
+ }
+ if (!color) {
+ _FaxFillBits(dest_buf, columns, startpos, startpos + run_len);
+ }
+ startpos += run_len;
+ if (startpos >= columns) {
+ break;
+ }
+ color = !color;
+ }
+ return TRUE;
+}
+class CCodec_FaxDecoder : public CCodec_ScanlineDecoder
+{
+public:
+ CCodec_FaxDecoder();
+ virtual ~CCodec_FaxDecoder();
+ FX_BOOL Create(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,
+ int K, FX_BOOL EndOfLine, FX_BOOL EncodedByteAlign, FX_BOOL BlackIs1, int Columns, int Rows);
+ virtual void v_DownScale(int dest_width, int dest_height) {}
+ virtual FX_BOOL v_Rewind();
+ virtual FX_LPBYTE v_GetNextLine();
+ virtual FX_DWORD GetSrcOffset();
+ int m_Encoding, m_bEndOfLine, m_bByteAlign, m_bBlack;
+ int bitpos;
+ FX_LPCBYTE m_pSrcBuf;
+ FX_DWORD m_SrcSize;
+ FX_LPBYTE m_pScanlineBuf, m_pRefBuf;
+};
+CCodec_FaxDecoder::CCodec_FaxDecoder()
+{
+ m_pScanlineBuf = NULL;
+ m_pRefBuf = NULL;
+}
+CCodec_FaxDecoder::~CCodec_FaxDecoder()
+{
+ if (m_pScanlineBuf) {
+ FX_Free(m_pScanlineBuf);
+ }
+ if (m_pRefBuf) {
+ FX_Free(m_pRefBuf);
+ }
+}
+FX_BOOL CCodec_FaxDecoder::Create(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,
+ int K, FX_BOOL EndOfLine, FX_BOOL EncodedByteAlign, FX_BOOL BlackIs1, int Columns, int Rows)
+{
+ m_Encoding = K;
+ m_bEndOfLine = EndOfLine;
+ m_bByteAlign = EncodedByteAlign;
+ m_bBlack = BlackIs1;
+ m_OrigWidth = Columns;
+ m_OrigHeight = Rows;
+ if (m_OrigWidth == 0) {
+ m_OrigWidth = width;
+ }
+ if (m_OrigHeight == 0) {
+ m_OrigHeight = height;
+ }
+ m_Pitch = (m_OrigWidth + 31) / 32 * 4;
+ m_OutputWidth = m_OrigWidth;
+ m_OutputHeight = m_OrigHeight;
+ m_pScanlineBuf = FX_Alloc(FX_BYTE, m_Pitch);
+ if (m_pScanlineBuf == NULL) {
+ return FALSE;
+ }
+ m_pRefBuf = FX_Alloc(FX_BYTE, m_Pitch);
+ if (m_pRefBuf == NULL) {
+ return FALSE;
+ }
+ m_pSrcBuf = src_buf;
+ m_SrcSize = src_size;
+ m_nComps = 1;
+ m_bpc = 1;
+ m_bColorTransformed = FALSE;
+ return TRUE;
+}
+FX_BOOL CCodec_FaxDecoder::v_Rewind()
+{
+ FXSYS_memset8(m_pRefBuf, 0xff, m_Pitch);
+ bitpos = 0;
+ return TRUE;
+}
+FX_LPBYTE CCodec_FaxDecoder::v_GetNextLine()
+{
+ int bitsize = m_SrcSize * 8;
+ _FaxSkipEOL(m_pSrcBuf, bitsize, bitpos);
+ if (bitpos >= bitsize) {
+ return NULL;
+ }
+ FXSYS_memset8(m_pScanlineBuf, 0xff, m_Pitch);
+ if (m_Encoding < 0) {
+ _FaxG4GetRow(m_pSrcBuf, bitsize, bitpos, m_pScanlineBuf, m_pRefBuf, m_OrigWidth);
+ FXSYS_memcpy32(m_pRefBuf, m_pScanlineBuf, m_Pitch);
+ } else if (m_Encoding == 0) {
+ _FaxGet1DLine(m_pSrcBuf, bitsize, bitpos, m_pScanlineBuf, m_OrigWidth);
+ } else {
+ FX_BOOL bNext1D = m_pSrcBuf[bitpos / 8] & (1 << (7 - bitpos % 8));
+ bitpos ++;
+ if (bNext1D) {
+ _FaxGet1DLine(m_pSrcBuf, bitsize, bitpos, m_pScanlineBuf, m_OrigWidth);
+ } else {
+ _FaxG4GetRow(m_pSrcBuf, bitsize, bitpos, m_pScanlineBuf, m_pRefBuf, m_OrigWidth);
+ }
+ FXSYS_memcpy32(m_pRefBuf, m_pScanlineBuf, m_Pitch);
+ }
+ if (m_bEndOfLine) {
+ _FaxSkipEOL(m_pSrcBuf, bitsize, bitpos);
+ }
+ if (m_bByteAlign && bitpos < bitsize) {
+ int bitpos0 = bitpos;
+ int bitpos1 = (bitpos + 7) / 8 * 8;
+ while (m_bByteAlign && bitpos0 < bitpos1) {
+ int bit = m_pSrcBuf[bitpos0 / 8] & (1 << (7 - bitpos0 % 8));
+ if (bit != 0) {
+ m_bByteAlign = FALSE;
+ } else {
+ bitpos0 ++;
+ }
+ }
+ if (m_bByteAlign) {
+ bitpos = bitpos1;
+ }
+ }
+ if (m_bBlack) {
+ for (int i = 0; i < m_Pitch; i ++) {
+ m_pScanlineBuf[i] = ~m_pScanlineBuf[i];
+ }
+ }
+ return m_pScanlineBuf;
+}
+FX_DWORD CCodec_FaxDecoder::GetSrcOffset()
+{
+ FX_DWORD ret = (bitpos + 7) / 8;
+ if (ret > m_SrcSize) {
+ ret = m_SrcSize;
+ }
+ return ret;
+}
+extern "C" {
+ void _FaxG4Decode(void*, FX_LPCBYTE src_buf, FX_DWORD src_size, int* pbitpos, FX_LPBYTE dest_buf, int width, int height, int pitch)
+ {
+ if (pitch == 0) {
+ pitch = (width + 7) / 8;
+ }
+ FX_LPBYTE ref_buf = FX_Alloc(FX_BYTE, pitch);
+ if (ref_buf == NULL) {
+ return;
+ }
+ FXSYS_memset8(ref_buf, 0xff, pitch);
+ int bitpos = *pbitpos;
+ for (int iRow = 0; iRow < height; iRow ++) {
+ FX_LPBYTE line_buf = dest_buf + iRow * pitch;
+ FXSYS_memset8(line_buf, 0xff, pitch);
+ _FaxG4GetRow(src_buf, src_size << 3, bitpos, line_buf, ref_buf, width);
+ FXSYS_memcpy32(ref_buf, line_buf, pitch);
+ }
+ FX_Free(ref_buf);
+ *pbitpos = bitpos;
+ }
+};
+static const FX_BYTE BlackRunTerminator[128] = {
+ 0x37, 10, 0x02, 3, 0x03, 2, 0x02, 2, 0x03, 3, 0x03, 4, 0x02, 4, 0x03, 5,
+ 0x05, 6, 0x04, 6, 0x04, 7, 0x05, 7, 0x07, 7, 0x04, 8, 0x07, 8, 0x18, 9,
+ 0x17, 10, 0x18, 10, 0x08, 10, 0x67, 11, 0x68, 11, 0x6c, 11, 0x37, 11, 0x28, 11,
+ 0x17, 11, 0x18, 11, 0xca, 12, 0xcb, 12, 0xcc, 12, 0xcd, 12, 0x68, 12, 0x69, 12,
+ 0x6a, 12, 0x6b, 12, 0xd2, 12, 0xd3, 12, 0xd4, 12, 0xd5, 12, 0xd6, 12, 0xd7, 12,
+ 0x6c, 12, 0x6d, 12, 0xda, 12, 0xdb, 12, 0x54, 12, 0x55, 12, 0x56, 12, 0x57, 12,
+ 0x64, 12, 0x65, 12, 0x52, 12, 0x53, 12, 0x24, 12, 0x37, 12, 0x38, 12, 0x27, 12,
+ 0x28, 12, 0x58, 12, 0x59, 12, 0x2b, 12, 0x2c, 12, 0x5a, 12, 0x66, 12, 0x67, 12,
+};
+static const FX_BYTE BlackRunMarkup[80] = {
+ 0x0f, 10, 0xc8, 12, 0xc9, 12, 0x5b, 12, 0x33, 12, 0x34, 12, 0x35, 12, 0x6c, 13,
+ 0x6d, 13, 0x4a, 13, 0x4b, 13, 0x4c, 13, 0x4d, 13, 0x72, 13, 0x73, 13, 0x74, 13,
+ 0x75, 13, 0x76, 13, 0x77, 13, 0x52, 13, 0x53, 13, 0x54, 13, 0x55, 13, 0x5a, 13,
+ 0x5b, 13, 0x64, 13, 0x65, 13, 0x08, 11, 0x0c, 11, 0x0d, 11, 0x12, 12, 0x13, 12,
+ 0x14, 12, 0x15, 12, 0x16, 12, 0x17, 12, 0x1c, 12, 0x1d, 12, 0x1e, 12, 0x1f, 12,
+};
+static const FX_BYTE WhiteRunTerminator[128] = {
+ 0x35, 8,
+ 0x07, 6,
+ 0x07, 4,
+ 0x08, 4,
+ 0x0B, 4,
+ 0x0C, 4,
+ 0x0E, 4,
+ 0x0F, 4,
+ 0x13, 5,
+ 0x14, 5,
+ 0x07, 5,
+ 0x08, 5,
+ 0x08, 6,
+ 0x03, 6,
+ 0x34, 6,
+ 0x35, 6,
+ 0x2a, 6,
+ 0x2B, 6,
+ 0x27, 7,
+ 0x0c, 7,
+ 0x08, 7,
+ 0x17, 7,
+ 0x03, 7,
+ 0x04, 7,
+ 0x28, 7,
+ 0x2B, 7,
+ 0x13, 7,
+ 0x24, 7,
+ 0x18, 7,
+ 0x02, 8,
+ 0x03, 8,
+ 0x1a, 8,
+ 0x1b, 8,
+ 0x12, 8,
+ 0x13, 8,
+ 0x14, 8,
+ 0x15, 8,
+ 0x16, 8,
+ 0x17, 8,
+ 0x28, 8,
+ 0x29, 8,
+ 0x2a, 8,
+ 0x2b, 8,
+ 0x2c, 8,
+ 0x2d, 8,
+ 0x04, 8,
+ 0x05, 8,
+ 0x0a, 8,
+ 0x0b, 8,
+ 0x52, 8,
+ 0x53, 8,
+ 0x54, 8,
+ 0x55, 8,
+ 0x24, 8,
+ 0x25, 8,
+ 0x58, 8,
+ 0x59, 8,
+ 0x5a, 8,
+ 0x5b, 8,
+ 0x4a, 8,
+ 0x4b, 8,
+ 0x32, 8,
+ 0x33, 8,
+ 0x34, 8,
+};
+static const FX_BYTE WhiteRunMarkup[80] = {
+ 0x1b, 5,
+ 0x12, 5,
+ 0x17, 6,
+ 0x37, 7,
+ 0x36, 8,
+ 0x37, 8,
+ 0x64, 8,
+ 0x65, 8,
+ 0x68, 8,
+ 0x67, 8,
+ 0xcc, 9,
+ 0xcd, 9,
+ 0xd2, 9,
+ 0xd3, 9,
+ 0xd4, 9,
+ 0xd5, 9,
+ 0xd6, 9,
+ 0xd7, 9,
+ 0xd8, 9,
+ 0xd9, 9,
+ 0xda, 9,
+ 0xdb, 9,
+ 0x98, 9,
+ 0x99, 9,
+ 0x9a, 9,
+ 0x18, 6,
+ 0x9b, 9,
+ 0x08, 11,
+ 0x0c, 11,
+ 0x0d, 11,
+ 0x12, 12,
+ 0x13, 12,
+ 0x14, 12,
+ 0x15, 12,
+ 0x16, 12,
+ 0x17, 12,
+ 0x1c, 12,
+ 0x1d, 12,
+ 0x1e, 12,
+ 0x1f, 12,
+};
+static void _AddBitStream(FX_LPBYTE dest_buf, int& dest_bitpos, int data, int bitlen)
+{
+ for (int i = bitlen - 1; i >= 0; i --) {
+ if (data & (1 << i)) {
+ dest_buf[dest_bitpos / 8] |= 1 << (7 - dest_bitpos % 8);
+ }
+ dest_bitpos ++;
+ }
+}
+static void _FaxEncodeRun(FX_LPBYTE dest_buf, int& dest_bitpos, int run, FX_BOOL bWhite)
+{
+ while (run >= 2560) {
+ _AddBitStream(dest_buf, dest_bitpos, 0x1f, 12);
+ run -= 2560;
+ }
+ if (run >= 64) {
+ int markup = run - run % 64;
+ FX_LPCBYTE p = bWhite ? WhiteRunMarkup : BlackRunMarkup;
+ p += (markup / 64 - 1) * 2;
+ _AddBitStream(dest_buf, dest_bitpos, *p, p[1]);
+ }
+ run %= 64;
+ FX_LPCBYTE p = bWhite ? WhiteRunTerminator : BlackRunTerminator;
+ p += run * 2;
+ _AddBitStream(dest_buf, dest_bitpos, *p, p[1]);
+}
+static void _FaxEncode2DLine(FX_LPBYTE dest_buf, int& dest_bitpos, FX_LPCBYTE src_buf, FX_LPCBYTE ref_buf, int cols)
+{
+ int a0 = -1, a0color = 1;
+ while (1) {
+ int a1 = _FindBit(src_buf, cols, a0 + 1, 1 - a0color);
+ int b1, b2;
+ _FaxG4FindB1B2(ref_buf, cols, a0, a0color, b1, b2);
+ if (b2 < a1) {
+ dest_bitpos += 3;
+ dest_buf[dest_bitpos / 8] |= 1 << (7 - dest_bitpos % 8);
+ dest_bitpos ++;
+ a0 = b2;
+ } else if (a1 - b1 <= 3 && b1 - a1 <= 3) {
+ int delta = a1 - b1;
+ switch (delta) {
+ case 0:
+ dest_buf[dest_bitpos / 8] |= 1 << (7 - dest_bitpos % 8);
+ break;
+ case 1:
+ case 2:
+ case 3:
+ dest_bitpos += delta == 1 ? 1 : delta + 2;
+ dest_buf[dest_bitpos / 8] |= 1 << (7 - dest_bitpos % 8);
+ dest_bitpos ++;
+ dest_buf[dest_bitpos / 8] |= 1 << (7 - dest_bitpos % 8);
+ break;
+ case -1:
+ case -2:
+ case -3:
+ dest_bitpos += delta == -1 ? 1 : -delta + 2;
+ dest_buf[dest_bitpos / 8] |= 1 << (7 - dest_bitpos % 8);
+ dest_bitpos ++;
+ break;
+ }
+ dest_bitpos ++;
+ a0 = a1;
+ a0color = 1 - a0color;
+ } else {
+ int a2 = _FindBit(src_buf, cols, a1 + 1, a0color);
+ dest_bitpos ++;
+ dest_bitpos ++;
+ dest_buf[dest_bitpos / 8] |= 1 << (7 - dest_bitpos % 8);
+ dest_bitpos ++;
+ if (a0 < 0) {
+ a0 = 0;
+ }
+ _FaxEncodeRun(dest_buf, dest_bitpos, a1 - a0, a0color);
+ _FaxEncodeRun(dest_buf, dest_bitpos, a2 - a1, 1 - a0color);
+ a0 = a2;
+ }
+ if (a0 >= cols) {
+ return;
+ }
+ }
+}
+class CCodec_FaxEncoder : public CFX_Object
+{
+public:
+ CCodec_FaxEncoder(FX_LPCBYTE src_buf, int width, int height, int pitch);
+ ~CCodec_FaxEncoder();
+ void Encode(FX_LPBYTE& dest_buf, FX_DWORD& dest_size);
+ void Encode2DLine(FX_LPCBYTE scan_line);
+ CFX_BinaryBuf m_DestBuf;
+ FX_LPBYTE m_pRefLine, m_pLineBuf;
+ int m_Cols, m_Rows, m_Pitch;
+ FX_LPCBYTE m_pSrcBuf;
+};
+CCodec_FaxEncoder::CCodec_FaxEncoder(FX_LPCBYTE src_buf, int width, int height, int pitch)
+{
+ m_pSrcBuf = src_buf;
+ m_Cols = width;
+ m_Rows = height;
+ m_Pitch = pitch;
+ m_pRefLine = FX_Alloc(FX_BYTE, m_Pitch);
+ if (m_pRefLine == NULL) {
+ return;
+ }
+ FXSYS_memset8(m_pRefLine, 0xff, m_Pitch);
+ m_pLineBuf = FX_Alloc(FX_BYTE, m_Pitch * 8);
+ if (m_pLineBuf == NULL) {
+ return;
+ }
+ m_DestBuf.EstimateSize(0, 10240);
+}
+CCodec_FaxEncoder::~CCodec_FaxEncoder()
+{
+ if (m_pRefLine) {
+ FX_Free(m_pRefLine);
+ }
+ if (m_pLineBuf) {
+ FX_Free(m_pLineBuf);
+ }
+}
+void CCodec_FaxEncoder::Encode(FX_LPBYTE& dest_buf, FX_DWORD& dest_size)
+{
+ int dest_bitpos = 0;
+ FX_BYTE last_byte = 0;
+ for (int i = 0; i < m_Rows; i ++) {
+ FX_LPCBYTE scan_line = m_pSrcBuf + i * m_Pitch;
+ FXSYS_memset32(m_pLineBuf, 0, m_Pitch * 8);
+ m_pLineBuf[0] = last_byte;
+ _FaxEncode2DLine(m_pLineBuf, dest_bitpos, scan_line, m_pRefLine, m_Cols);
+ m_DestBuf.AppendBlock(m_pLineBuf, dest_bitpos / 8);
+ last_byte = m_pLineBuf[dest_bitpos / 8];
+ dest_bitpos %= 8;
+ FXSYS_memcpy32(m_pRefLine, scan_line, m_Pitch);
+ }
+ if (dest_bitpos) {
+ m_DestBuf.AppendByte(last_byte);
+ }
+ dest_buf = m_DestBuf.GetBuffer();
+ dest_size = m_DestBuf.GetSize();
+ m_DestBuf.DetachBuffer();
+}
+FX_BOOL CCodec_FaxModule::Encode(FX_LPCBYTE src_buf, int width, int height, int pitch, FX_LPBYTE& dest_buf, FX_DWORD& dest_size)
+{
+ CCodec_FaxEncoder encoder(src_buf, width, height, pitch);
+ encoder.Encode(dest_buf, dest_size);
+ return TRUE;
+}
+ICodec_ScanlineDecoder* CCodec_FaxModule::CreateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,
+ int K, FX_BOOL EndOfLine, FX_BOOL EncodedByteAlign, FX_BOOL BlackIs1, int Columns, int Rows)
+{
+ CCodec_FaxDecoder* pDecoder = FX_NEW CCodec_FaxDecoder;
+ if (pDecoder == NULL) {
+ return NULL;
+ }
+ pDecoder->Create(src_buf, src_size, width, height, K, EndOfLine, EncodedByteAlign, BlackIs1, Columns, Rows);
+ return pDecoder;
+}
diff --git a/core/src/fxcodec/codec/fx_codec_flate.cpp b/core/src/fxcodec/codec/fx_codec_flate.cpp
index b6f94e021c..4724593a94 100644
--- a/core/src/fxcodec/codec/fx_codec_flate.cpp
+++ b/core/src/fxcodec/codec/fx_codec_flate.cpp
@@ -1,945 +1,945 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../fx_zlib.h"
-#include "../../../include/fxcodec/fx_codec.h"
-#include "codec_int.h"
-extern "C"
-{
- static void* my_alloc_func (void* opaque, unsigned int items, unsigned int size)
- {
- return FX_Alloc(FX_BYTE, items * size);
- }
- static void my_free_func (void* opaque, void* address)
- {
- FX_Free(address);
- }
- void* FPDFAPI_FlateInit(void* (*alloc_func)(void*, unsigned int, unsigned int),
- void (*free_func)(void*, void*))
- {
- z_stream* p = (z_stream*)alloc_func(0, 1, sizeof(z_stream));
- if (p == NULL) {
- return NULL;
- }
- FXSYS_memset32(p, 0, sizeof(z_stream));
- p->zalloc = alloc_func;
- p->zfree = free_func;
- inflateInit(p);
- return p;
- }
- void FPDFAPI_FlateInput(void* context, const unsigned char* src_buf, unsigned int src_size)
- {
- ((z_stream*)context)->next_in = (unsigned char*)src_buf;
- ((z_stream*)context)->avail_in = src_size;
- }
- int FPDFAPI_FlateGetTotalOut(void* context)
- {
- return ((z_stream*)context)->total_out;
- }
- int FPDFAPI_FlateOutput(void* context, unsigned char* dest_buf, unsigned int dest_size)
- {
- ((z_stream*)context)->next_out = dest_buf;
- ((z_stream*)context)->avail_out = dest_size;
- unsigned int pre_pos = (unsigned int)FPDFAPI_FlateGetTotalOut(context);
- int ret = inflate((z_stream*)context, Z_SYNC_FLUSH);
- unsigned int post_pos = (unsigned int)FPDFAPI_FlateGetTotalOut(context);
- unsigned int written = post_pos - pre_pos;
- if (written < dest_size) {
- FXSYS_memset8(dest_buf + written, '\0', dest_size - written);
- }
- return ret;
- }
- int FPDFAPI_FlateGetTotalIn(void* context)
- {
- return ((z_stream*)context)->total_in;
- }
- int FPDFAPI_FlateGetAvailOut(void* context)
- {
- return ((z_stream*)context)->avail_out;
- }
- int FPDFAPI_FlateGetAvailIn(void* context)
- {
- return ((z_stream*)context)->avail_in;
- }
- void FPDFAPI_FlateEnd(void* context)
- {
- inflateEnd((z_stream*)context);
- ((z_stream*)context)->zfree(0, context);
- }
- void FPDFAPI_FlateCompress(unsigned char* dest_buf, unsigned long* dest_size, const unsigned char* src_buf, unsigned long src_size)
- {
- compress(dest_buf, dest_size, src_buf, src_size);
- }
-}
-class CLZWDecoder : public CFX_Object
-{
-public:
- FX_BOOL Decode(FX_LPBYTE output, FX_DWORD& outlen, const FX_BYTE* input, FX_DWORD& size, FX_BOOL bEarlyChange);
-private:
- FX_DWORD m_InPos;
- FX_DWORD m_OutPos;
- FX_LPBYTE m_pOutput;
- const FX_BYTE* m_pInput;
- FX_BOOL m_Early;
- void AddCode(FX_DWORD prefix_code, FX_BYTE append_char);
- FX_DWORD m_CodeArray[5021];
- FX_DWORD m_nCodes;
- FX_BYTE m_DecodeStack[4000];
- FX_DWORD m_StackLen;
- void DecodeString(FX_DWORD code);
- int m_CodeLen;
-};
-void CLZWDecoder::AddCode(FX_DWORD prefix_code, FX_BYTE append_char)
-{
- if (m_nCodes + m_Early == 4094) {
- return;
- }
- m_CodeArray[m_nCodes ++] = (prefix_code << 16) | append_char;
- if (m_nCodes + m_Early == 512 - 258) {
- m_CodeLen = 10;
- } else if (m_nCodes + m_Early == 1024 - 258) {
- m_CodeLen = 11;
- } else if (m_nCodes + m_Early == 2048 - 258) {
- m_CodeLen = 12;
- }
-}
-void CLZWDecoder::DecodeString(FX_DWORD code)
-{
- while (1) {
- int index = code - 258;
- if (index < 0 || index >= (int)m_nCodes) {
- break;
- }
- FX_DWORD data = m_CodeArray[index];
- if (m_StackLen >= sizeof(m_DecodeStack)) {
- return;
- }
- m_DecodeStack[m_StackLen++] = (FX_BYTE)data;
- code = data >> 16;
- }
- if (m_StackLen >= sizeof(m_DecodeStack)) {
- return;
- }
- m_DecodeStack[m_StackLen++] = (FX_BYTE)code;
-}
-int CLZWDecoder::Decode(FX_LPBYTE dest_buf, FX_DWORD& dest_size, const FX_BYTE* src_buf, FX_DWORD& src_size, FX_BOOL bEarlyChange)
-{
- m_CodeLen = 9;
- m_InPos = 0;
- m_OutPos = 0;
- m_pInput = src_buf;
- m_pOutput = dest_buf;
- m_Early = bEarlyChange ? 1 : 0;
- m_nCodes = 0;
- FX_DWORD old_code = (FX_DWORD) - 1;
- FX_BYTE last_char;
- while (1) {
- if (m_InPos + m_CodeLen > src_size * 8) {
- break;
- }
- int byte_pos = m_InPos / 8;
- int bit_pos = m_InPos % 8, bit_left = m_CodeLen;
- FX_DWORD code = 0;
- if (bit_pos) {
- bit_left -= 8 - bit_pos;
- code = (m_pInput[byte_pos++] & ((1 << (8 - bit_pos)) - 1)) << bit_left;
- }
- if (bit_left < 8) {
- code |= m_pInput[byte_pos] >> (8 - bit_left);
- } else {
- bit_left -= 8;
- code |= m_pInput[byte_pos++] << bit_left;
- if (bit_left) {
- code |= m_pInput[byte_pos] >> (8 - bit_left);
- }
- }
- m_InPos += m_CodeLen;
- if (code < 256) {
- if (m_OutPos == dest_size) {
- return -5;
- }
- if (m_pOutput) {
- m_pOutput[m_OutPos] = (FX_BYTE)code;
- }
- m_OutPos ++;
- last_char = (FX_BYTE)code;
- if (old_code != (FX_DWORD) - 1) {
- AddCode(old_code, last_char);
- }
- old_code = code;
- } else if (code == 256) {
- m_CodeLen = 9;
- m_nCodes = 0;
- old_code = (FX_DWORD) - 1;
- } else if (code == 257) {
- break;
- } else {
- if (old_code == (FX_DWORD) - 1) {
- return 2;
- }
- m_StackLen = 0;
- if (code >= m_nCodes + 258) {
- if (m_StackLen < sizeof(m_DecodeStack)) {
- m_DecodeStack[m_StackLen++] = last_char;
- }
- DecodeString(old_code);
- } else {
- DecodeString(code);
- }
- if (m_OutPos + m_StackLen > dest_size) {
- return -5;
- }
- if (m_pOutput) {
- for (FX_DWORD i = 0; i < m_StackLen; i ++) {
- m_pOutput[m_OutPos + i] = m_DecodeStack[m_StackLen - i - 1];
- }
- }
- m_OutPos += m_StackLen;
- last_char = m_DecodeStack[m_StackLen - 1];
- if (old_code < 256) {
- AddCode(old_code, last_char);
- } else if (old_code - 258 >= m_nCodes) {
- dest_size = m_OutPos;
- src_size = (m_InPos + 7) / 8;
- return 0;
- } else {
- AddCode(old_code, last_char);
- }
- old_code = code;
- }
- }
- dest_size = m_OutPos;
- src_size = (m_InPos + 7) / 8;
- return 0;
-}
-static FX_BYTE PaethPredictor(int a, int b, int c)
-{
- int p = a + b - c;
- int pa = FXSYS_abs(p - a);
- int pb = FXSYS_abs(p - b);
- int pc = FXSYS_abs(p - c);
- if (pa <= pb && pa <= pc) {
- return (FX_BYTE)a;
- }
- if (pb <= pc) {
- return (FX_BYTE)b;
- }
- return (FX_BYTE)c;
-}
-static void PNG_PredictorEncode(FX_LPBYTE& data_buf, FX_DWORD& data_size, int predictor, int Colors, int BitsPerComponent, int Columns)
-{
- int BytesPerPixel = (Colors * BitsPerComponent + 7) / 8;
- int row_size = (Colors * BitsPerComponent * Columns + 7) / 8;
- int row_count = (data_size + row_size - 1) / row_size;
- int last_row_size = data_size % row_size;
- FX_LPBYTE dest_buf = FX_Alloc( FX_BYTE, (row_size + 1) * row_count);
- if (dest_buf == NULL) {
- return;
- }
- int byte_cnt = 0;
- FX_LPBYTE pSrcData = data_buf;
- FX_LPBYTE pDestData = dest_buf;
- for (int row = 0; row < row_count; row++) {
- if (predictor == 10) {
- pDestData[0] = 0;
- int move_size = row_size;
- if (move_size * (row + 1) > (int)data_size) {
- move_size = data_size - (move_size * row);
- }
- FXSYS_memmove32(pDestData + 1, pSrcData, move_size);
- pDestData += (move_size + 1);
- pSrcData += move_size;
- byte_cnt += move_size;
- continue;
- }
- for (int byte = 0; byte < row_size && byte_cnt < (int)data_size; byte++) {
- switch (predictor) {
- case 11: {
- pDestData[0] = 1;
- FX_BYTE left = 0;
- if (byte >= BytesPerPixel) {
- left = pSrcData[byte - BytesPerPixel];
- }
- pDestData[byte + 1] = pSrcData[byte] - left;
- }
- break;
- case 12: {
- pDestData[0] = 2;
- FX_BYTE up = 0;
- if (row) {
- up = pSrcData[byte - row_size];
- }
- pDestData[byte + 1] = pSrcData[byte] - up;
- }
- break;
- case 13: {
- pDestData[0] = 3;
- FX_BYTE left = 0;
- if (byte >= BytesPerPixel) {
- left = pSrcData[byte - BytesPerPixel];
- }
- FX_BYTE up = 0;
- if (row) {
- up = pSrcData[byte - row_size];
- }
- pDestData[byte + 1] = pSrcData[byte] - (left + up) / 2;
- }
- break;
- case 14: {
- pDestData[0] = 4;
- FX_BYTE left = 0;
- if (byte >= BytesPerPixel) {
- left = pSrcData[byte - BytesPerPixel];
- }
- FX_BYTE up = 0;
- if (row) {
- up = pSrcData[byte - row_size];
- }
- FX_BYTE upper_left = 0;
- if (byte >= BytesPerPixel && row) {
- upper_left = pSrcData[byte - row_size - BytesPerPixel];
- }
- pDestData[byte + 1] = pSrcData[byte] - PaethPredictor(left, up, upper_left);
- }
- break;
- default: {
- pDestData[byte + 1] = pSrcData[byte];
- }
- break;
- }
- byte_cnt++;
- }
- pDestData += (row_size + 1);
- pSrcData += row_size;
- }
- FX_Free(data_buf);
- data_buf = dest_buf;
- data_size = (row_size + 1) * row_count - (last_row_size > 0 ? (row_size - last_row_size) : 0);
-}
-static void PNG_PredictLine(FX_LPBYTE pDestData, FX_LPCBYTE pSrcData, FX_LPCBYTE pLastLine,
- int bpc, int nColors, int nPixels)
-{
- int row_size = (nPixels * bpc * nColors + 7) / 8;
- int BytesPerPixel = (bpc * nColors + 7) / 8;
- FX_BYTE tag = pSrcData[0];
- if (tag == 0) {
- FXSYS_memmove32(pDestData, pSrcData + 1, row_size);
- return;
- }
- for (int byte = 0; byte < row_size; byte ++) {
- FX_BYTE raw_byte = pSrcData[byte + 1];
- switch (tag) {
- case 1: {
- FX_BYTE left = 0;
- if (byte >= BytesPerPixel) {
- left = pDestData[byte - BytesPerPixel];
- }
- pDestData[byte] = raw_byte + left;
- break;
- }
- case 2: {
- FX_BYTE up = 0;
- if (pLastLine) {
- up = pLastLine[byte];
- }
- pDestData[byte] = raw_byte + up;
- break;
- }
- case 3: {
- FX_BYTE left = 0;
- if (byte >= BytesPerPixel) {
- left = pDestData[byte - BytesPerPixel];
- }
- FX_BYTE up = 0;
- if (pLastLine) {
- up = pLastLine[byte];
- }
- pDestData[byte] = raw_byte + (up + left) / 2;
- break;
- }
- case 4: {
- FX_BYTE left = 0;
- if (byte >= BytesPerPixel) {
- left = pDestData[byte - BytesPerPixel];
- }
- FX_BYTE up = 0;
- if (pLastLine) {
- up = pLastLine[byte];
- }
- FX_BYTE upper_left = 0;
- if (byte >= BytesPerPixel && pLastLine) {
- upper_left = pLastLine[byte - BytesPerPixel];
- }
- pDestData[byte] = raw_byte + PaethPredictor(left, up, upper_left);
- break;
- }
- default:
- pDestData[byte] = raw_byte;
- break;
- }
- }
-}
-static void PNG_Predictor(FX_LPBYTE& data_buf, FX_DWORD& data_size,
- int Colors, int BitsPerComponent, int Columns)
-{
- int BytesPerPixel = (Colors * BitsPerComponent + 7) / 8;
- int row_size = (Colors * BitsPerComponent * Columns + 7) / 8;
- int row_count = (data_size + row_size) / (row_size + 1);
- int last_row_size = data_size % (row_size + 1);
- FX_LPBYTE dest_buf = FX_Alloc( FX_BYTE, row_size * row_count);
- if (dest_buf == NULL) {
- return;
- }
- int byte_cnt = 0;
- FX_LPBYTE pSrcData = data_buf;
- FX_LPBYTE pDestData = dest_buf;
- for (int row = 0; row < row_count; row ++) {
- FX_BYTE tag = pSrcData[0];
- if (tag == 0) {
- int move_size = row_size;
- if ((row + 1) * (move_size + 1) > (int)data_size) {
- move_size = last_row_size - 1;
- }
- FXSYS_memmove32(pDestData, pSrcData + 1, move_size);
- pSrcData += move_size + 1;
- pDestData += move_size;
- byte_cnt += move_size + 1;
- continue;
- }
- for (int byte = 0; byte < row_size && byte_cnt < (int)data_size; byte ++) {
- FX_BYTE raw_byte = pSrcData[byte + 1];
- switch (tag) {
- case 1: {
- FX_BYTE left = 0;
- if (byte >= BytesPerPixel) {
- left = pDestData[byte - BytesPerPixel];
- }
- pDestData[byte] = raw_byte + left;
- break;
- }
- case 2: {
- FX_BYTE up = 0;
- if (row) {
- up = pDestData[byte - row_size];
- }
- pDestData[byte] = raw_byte + up;
- break;
- }
- case 3: {
- FX_BYTE left = 0;
- if (byte >= BytesPerPixel) {
- left = pDestData[byte - BytesPerPixel];
- }
- FX_BYTE up = 0;
- if (row) {
- up = pDestData[byte - row_size];
- }
- pDestData[byte] = raw_byte + (up + left) / 2;
- break;
- }
- case 4: {
- FX_BYTE left = 0;
- if (byte >= BytesPerPixel) {
- left = pDestData[byte - BytesPerPixel];
- }
- FX_BYTE up = 0;
- if (row) {
- up = pDestData[byte - row_size];
- }
- FX_BYTE upper_left = 0;
- if (byte >= BytesPerPixel && row) {
- upper_left = pDestData[byte - row_size - BytesPerPixel];
- }
- pDestData[byte] = raw_byte + PaethPredictor(left, up, upper_left);
- break;
- }
- default:
- pDestData[byte] = raw_byte;
- break;
- }
- byte_cnt++;
- }
- pSrcData += row_size + 1;
- pDestData += row_size;
- byte_cnt++;
- }
- FX_Free(data_buf);
- data_buf = dest_buf;
- data_size = row_size * row_count - (last_row_size > 0 ? (row_size + 1 - last_row_size) : 0);
-}
-static void TIFF_PredictorEncodeLine(FX_LPBYTE dest_buf, int row_size, int BitsPerComponent, int Colors, int Columns)
-{
- int BytesPerPixel = BitsPerComponent * Colors / 8;
- if (BitsPerComponent < 8) {
- FX_BYTE mask = 0x01;
- if (BitsPerComponent == 2) {
- mask = 0x03;
- } else if (BitsPerComponent == 4) {
- mask = 0x0F;
- }
- int row_bits = Colors * BitsPerComponent * Columns;
- for (int i = row_bits - BitsPerComponent; i >= BitsPerComponent; i -= BitsPerComponent) {
- int col = i % 8;
- int index = i / 8;
- int col_pre = (col == 0) ? (8 - BitsPerComponent) : (col - BitsPerComponent);
- int index_pre = (col == 0) ? (index - 1) : index;
- FX_BYTE cur = (dest_buf[index] >> (8 - col - BitsPerComponent)) & mask;
- FX_BYTE left = (dest_buf[index_pre] >> (8 - col_pre - BitsPerComponent)) & mask;
- cur -= left;
- cur &= mask;
- cur <<= (8 - col - BitsPerComponent);
- dest_buf[index] &= ~(mask << ((8 - col - BitsPerComponent)));
- dest_buf[index] |= cur;
- }
- } else if (BitsPerComponent == 8) {
- for (int i = row_size - 1; i >= BytesPerPixel; i--) {
- dest_buf[i] -= dest_buf[i - BytesPerPixel];
- }
- } else {
- for (int i = row_size - BytesPerPixel; i >= BytesPerPixel; i -= BytesPerPixel) {
- FX_WORD pixel = (dest_buf[i] << 8) | dest_buf[i + 1];
- pixel -= (dest_buf[i - BytesPerPixel] << 8) | dest_buf[i - BytesPerPixel + 1];
- dest_buf[i] = pixel >> 8;
- dest_buf[i + 1] = (FX_BYTE)pixel;
- }
- }
-}
-static void TIFF_PredictorEncode(FX_LPBYTE& data_buf, FX_DWORD& data_size,
- int Colors, int BitsPerComponent, int Columns)
-{
- int row_size = (Colors * BitsPerComponent * Columns + 7) / 8;
- int row_count = (data_size + row_size - 1) / row_size;
- int last_row_size = data_size % row_size;
- for (int row = 0; row < row_count; row++) {
- FX_LPBYTE scan_line = data_buf + row * row_size;
- if ((row + 1) * row_size > (int)data_size) {
- row_size = last_row_size;
- }
- TIFF_PredictorEncodeLine(scan_line, row_size, BitsPerComponent, Colors, Columns);
- }
-}
-static void TIFF_PredictLine(FX_LPBYTE dest_buf, int row_size, int BitsPerComponent, int Colors, int Columns)
-{
- if (BitsPerComponent == 1) {
- int row_bits = BitsPerComponent * Colors * Columns;
- for(int i = 1; i < row_bits; i ++) {
- int col = i % 8;
- int index = i / 8;
- int index_pre = (col == 0) ? (index - 1) : index;
- int col_pre = (col == 0) ? 8 : col;
- if( ((dest_buf[index] >> (7 - col)) & 1) ^ ((dest_buf[index_pre] >> (8 - col_pre)) & 1) ) {
- dest_buf[index] |= 1 << (7 - col);
- } else {
- dest_buf[index] &= ~(1 << (7 - col));
- }
- }
- return;
- }
- int BytesPerPixel = BitsPerComponent * Colors / 8;
- if (BitsPerComponent == 16) {
- for (int i = BytesPerPixel; i < row_size; i += 2) {
- FX_WORD pixel = (dest_buf[i - BytesPerPixel] << 8) | dest_buf[i - BytesPerPixel + 1];
- pixel += (dest_buf[i] << 8) | dest_buf[i + 1];
- dest_buf[i] = pixel >> 8;
- dest_buf[i + 1] = (FX_BYTE)pixel;
- }
- } else {
- for (int i = BytesPerPixel; i < row_size; i ++) {
- dest_buf[i] += dest_buf[i - BytesPerPixel];
- }
- }
-}
-static void TIFF_Predictor(FX_LPBYTE& data_buf, FX_DWORD& data_size,
- int Colors, int BitsPerComponent, int Columns)
-{
- int row_size = (Colors * BitsPerComponent * Columns + 7) / 8;
- int row_count = (data_size + row_size - 1) / row_size;
- int last_row_size = data_size % row_size;
- for (int row = 0; row < row_count; row ++) {
- FX_LPBYTE scan_line = data_buf + row * row_size;
- if ((row + 1) * row_size > (int)data_size) {
- row_size = last_row_size;
- }
- TIFF_PredictLine(scan_line, row_size, BitsPerComponent, Colors, Columns);
- }
-}
-class CCodec_FlateScanlineDecoder : public CCodec_ScanlineDecoder
-{
-public:
- CCodec_FlateScanlineDecoder();
- ~CCodec_FlateScanlineDecoder();
- FX_BOOL Create(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height, int nComps, int bpc,
- int predictor, int Colors, int BitsPerComponent, int Columns);
- virtual void Destroy()
- {
- delete this;
- }
- virtual void v_DownScale(int dest_width, int dest_height) {}
- virtual FX_BOOL v_Rewind();
- virtual FX_LPBYTE v_GetNextLine();
- virtual FX_DWORD GetSrcOffset();
- void* m_pFlate;
- FX_LPCBYTE m_SrcBuf;
- FX_DWORD m_SrcSize;
- FX_LPBYTE m_pScanline;
- FX_LPBYTE m_pLastLine;
- FX_LPBYTE m_pPredictBuffer;
- FX_LPBYTE m_pPredictRaw;
- int m_Predictor;
- int m_Colors, m_BitsPerComponent, m_Columns, m_PredictPitch, m_LeftOver;
-};
-CCodec_FlateScanlineDecoder::CCodec_FlateScanlineDecoder()
-{
- m_pFlate = NULL;
- m_pScanline = NULL;
- m_pLastLine = NULL;
- m_pPredictBuffer = NULL;
- m_pPredictRaw = NULL;
- m_LeftOver = 0;
-}
-CCodec_FlateScanlineDecoder::~CCodec_FlateScanlineDecoder()
-{
- if (m_pScanline) {
- FX_Free(m_pScanline);
- }
- if (m_pLastLine) {
- FX_Free(m_pLastLine);
- }
- if (m_pPredictBuffer) {
- FX_Free(m_pPredictBuffer);
- }
- if (m_pPredictRaw) {
- FX_Free(m_pPredictRaw);
- }
- if (m_pFlate) {
- FPDFAPI_FlateEnd(m_pFlate);
- }
-}
-FX_BOOL CCodec_FlateScanlineDecoder::Create(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,
- int nComps, int bpc, int predictor, int Colors, int BitsPerComponent, int Columns)
-{
- m_SrcBuf = src_buf;
- m_SrcSize = src_size;
- m_OutputWidth = m_OrigWidth = width;
- m_OutputHeight = m_OrigHeight = height;
- m_nComps = nComps;
- m_bpc = bpc;
- m_bColorTransformed = FALSE;
- m_Pitch = (width * nComps * bpc + 7) / 8;
- m_pScanline = FX_Alloc(FX_BYTE, m_Pitch);
- if (m_pScanline == NULL) {
- return FALSE;
- }
- m_Predictor = 0;
- if (predictor) {
- if (predictor >= 10) {
- m_Predictor = 2;
- } else if (predictor == 2) {
- m_Predictor = 1;
- }
- if (m_Predictor) {
- if (BitsPerComponent * Colors * Columns == 0) {
- BitsPerComponent = m_bpc;
- Colors = m_nComps;
- Columns = m_OrigWidth;
- }
- m_Colors = Colors;
- m_BitsPerComponent = BitsPerComponent;
- m_Columns = Columns;
- m_PredictPitch = (m_BitsPerComponent * m_Colors * m_Columns + 7) / 8;
- m_pLastLine = FX_Alloc(FX_BYTE, m_PredictPitch);
- if (m_pLastLine == NULL) {
- return FALSE;
- }
- FXSYS_memset32(m_pLastLine, 0, m_PredictPitch);
- m_pPredictRaw = FX_Alloc(FX_BYTE, m_PredictPitch + 1);
- if (m_pPredictRaw == NULL) {
- return FALSE;
- }
- m_pPredictBuffer = FX_Alloc(FX_BYTE, m_PredictPitch);
- if (m_pPredictBuffer == NULL) {
- return FALSE;
- }
- }
- }
- return TRUE;
-}
-FX_BOOL CCodec_FlateScanlineDecoder::v_Rewind()
-{
- if (m_pFlate) {
- FPDFAPI_FlateEnd(m_pFlate);
- }
- m_pFlate = FPDFAPI_FlateInit(my_alloc_func, my_free_func);
- if (m_pFlate == NULL) {
- return FALSE;
- }
- FPDFAPI_FlateInput(m_pFlate, m_SrcBuf, m_SrcSize);
- m_LeftOver = 0;
- return TRUE;
-}
-FX_LPBYTE CCodec_FlateScanlineDecoder::v_GetNextLine()
-{
- if (m_Predictor) {
- if (m_Pitch == m_PredictPitch) {
- if (m_Predictor == 2) {
- FPDFAPI_FlateOutput(m_pFlate, m_pPredictRaw, m_PredictPitch + 1);
- PNG_PredictLine(m_pScanline, m_pPredictRaw, m_pLastLine, m_BitsPerComponent, m_Colors, m_Columns);
- FXSYS_memcpy32(m_pLastLine, m_pScanline, m_PredictPitch);
- } else {
- FPDFAPI_FlateOutput(m_pFlate, m_pScanline, m_Pitch);
- TIFF_PredictLine(m_pScanline, m_PredictPitch, m_bpc, m_nComps, m_OutputWidth);
- }
- } else {
- int bytes_to_go = m_Pitch;
- int read_leftover = m_LeftOver > bytes_to_go ? bytes_to_go : m_LeftOver;
- if (read_leftover) {
- FXSYS_memcpy32(m_pScanline, m_pPredictBuffer + m_PredictPitch - m_LeftOver, read_leftover);
- m_LeftOver -= read_leftover;
- bytes_to_go -= read_leftover;
- }
- while (bytes_to_go) {
- if (m_Predictor == 2) {
- FPDFAPI_FlateOutput(m_pFlate, m_pPredictRaw, m_PredictPitch + 1);
- PNG_PredictLine(m_pPredictBuffer, m_pPredictRaw, m_pLastLine, m_BitsPerComponent, m_Colors, m_Columns);
- FXSYS_memcpy32(m_pLastLine, m_pPredictBuffer, m_PredictPitch);
- } else {
- FPDFAPI_FlateOutput(m_pFlate, m_pPredictBuffer, m_PredictPitch);
- TIFF_PredictLine(m_pPredictBuffer, m_PredictPitch, m_BitsPerComponent, m_Colors, m_Columns);
- }
- int read_bytes = m_PredictPitch > bytes_to_go ? bytes_to_go : m_PredictPitch;
- FXSYS_memcpy32(m_pScanline + m_Pitch - bytes_to_go, m_pPredictBuffer, read_bytes);
- m_LeftOver += m_PredictPitch - read_bytes;
- bytes_to_go -= read_bytes;
- }
- }
- } else {
- FPDFAPI_FlateOutput(m_pFlate, m_pScanline, m_Pitch);
- }
- return m_pScanline;
-}
-FX_DWORD CCodec_FlateScanlineDecoder::GetSrcOffset()
-{
- return FPDFAPI_FlateGetTotalIn(m_pFlate);
-}
-static void FlateUncompress(FX_LPCBYTE src_buf, FX_DWORD src_size, FX_DWORD orig_size,
- FX_LPBYTE& dest_buf, FX_DWORD& dest_size, FX_DWORD& offset)
-{
- FX_DWORD guess_size = orig_size ? orig_size : src_size * 2;
- FX_DWORD alloc_step = orig_size ? 10240 : (src_size < 10240 ? 10240 : src_size);
- static const FX_DWORD kMaxInitialAllocSize = 10000000;
- if (guess_size > kMaxInitialAllocSize) {
- guess_size = kMaxInitialAllocSize;
- alloc_step = kMaxInitialAllocSize;
- }
- FX_LPBYTE guess_buf = FX_Alloc(FX_BYTE, guess_size + 1);
- if (!guess_buf) {
- dest_buf = NULL;
- dest_size = 0;
- return;
- }
- guess_buf[guess_size] = '\0';
- FX_BOOL useOldImpl = src_size < 10240;
- void* context = FPDFAPI_FlateInit(my_alloc_func, my_free_func);
- if (context == NULL) {
- dest_buf = NULL;
- dest_size = 0;
- return ;
- }
- FPDFAPI_FlateInput(context, src_buf, src_size);
- CFX_ArrayTemplate<FX_LPBYTE> result_tmp_bufs;
- FX_LPBYTE buf = guess_buf;
- FX_DWORD buf_size = guess_size;
- FX_DWORD last_buf_size = buf_size;
- while (1) {
- FX_INT32 ret = FPDFAPI_FlateOutput(context, buf, buf_size);
- FX_INT32 avail_buf_size = FPDFAPI_FlateGetAvailOut(context);
- if (!useOldImpl) {
- if (ret != Z_OK) {
- last_buf_size = buf_size - avail_buf_size;
- result_tmp_bufs.Add(buf);
- break;
- }
- if (avail_buf_size == 0) {
- result_tmp_bufs.Add(buf);
- buf = NULL;
- buf = FX_Alloc(FX_BYTE, buf_size + 1);
- if (!buf) {
- dest_buf = NULL;
- dest_size = 0;
- return;
- }
- buf[buf_size] = '\0';
- } else {
- last_buf_size = buf_size - avail_buf_size;
- result_tmp_bufs.Add(buf);
- buf = NULL;
- break;
- }
- } else {
- if (ret != Z_OK) {
- break;
- }
- if (avail_buf_size == 0) {
- FX_DWORD old_size = guess_size;
- guess_size += alloc_step;
- if (guess_size < old_size || guess_size + 1 < guess_size) {
- dest_buf = NULL;
- dest_size = 0;
- return;
- }
- guess_buf = FX_Realloc(FX_BYTE, guess_buf, guess_size + 1);
- if (!guess_buf) {
- dest_buf = NULL;
- dest_size = 0;
- return;
- }
- guess_buf[guess_size] = '\0';
- buf = guess_buf + old_size;
- buf_size = guess_size - old_size;
- } else {
- break;
- }
- }
- }
- dest_size = FPDFAPI_FlateGetTotalOut(context);
- offset = FPDFAPI_FlateGetTotalIn(context);
- if (!useOldImpl) {
- if (result_tmp_bufs.GetSize() == 1) {
- dest_buf = result_tmp_bufs[0];
- } else {
- FX_LPBYTE result_buf = FX_Alloc(FX_BYTE, dest_size);
- if (!result_buf) {
- dest_buf = NULL;
- dest_size = 0;
- return;
- }
- FX_DWORD result_pos = 0;
- for (FX_INT32 i = 0; i < result_tmp_bufs.GetSize(); i++) {
- FX_LPBYTE tmp_buf = result_tmp_bufs[i];
- FX_DWORD tmp_buf_size = buf_size;
- if (i == result_tmp_bufs.GetSize() - 1) {
- tmp_buf_size = last_buf_size;
- }
- FXSYS_memcpy32(result_buf + result_pos, tmp_buf, tmp_buf_size);
- result_pos += tmp_buf_size;
- FX_Free(tmp_buf);
- tmp_buf = NULL;
- result_tmp_bufs[i] = NULL;
- }
- dest_buf = result_buf;
- }
- } else {
- if (guess_size / 2 > dest_size) {
- guess_buf = FX_Realloc(FX_BYTE, guess_buf, dest_size + 1);
- if (!guess_buf) {
- dest_buf = NULL;
- dest_size = 0;
- return;
- }
- guess_size = dest_size;
- guess_buf[guess_size] = '\0';
- }
- dest_buf = guess_buf;
- }
- FPDFAPI_FlateEnd(context);
- context = NULL;
-}
-ICodec_ScanlineDecoder* CCodec_FlateModule::CreateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,
- int nComps, int bpc, int predictor, int Colors, int BitsPerComponent, int Columns)
-{
- CCodec_FlateScanlineDecoder* pDecoder = FX_NEW CCodec_FlateScanlineDecoder;
- if (pDecoder == NULL) {
- return NULL;
- }
- pDecoder->Create(src_buf, src_size, width, height, nComps, bpc, predictor, Colors, BitsPerComponent, Columns);
- return pDecoder;
-}
-FX_DWORD CCodec_FlateModule::FlateOrLZWDecode(FX_BOOL bLZW, const FX_BYTE* src_buf, FX_DWORD src_size, FX_BOOL bEarlyChange,
- int predictor, int Colors, int BitsPerComponent, int Columns,
- FX_DWORD estimated_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size)
-{
- CLZWDecoder* pDecoder = NULL;
- dest_buf = NULL;
- FX_DWORD offset = 0;
- int predictor_type = 0;
- if (predictor) {
- if (predictor >= 10) {
- predictor_type = 2;
- } else if (predictor == 2) {
- predictor_type = 1;
- }
- }
- if (bLZW) {
- pDecoder = FX_NEW CLZWDecoder;
- if (pDecoder == NULL) {
- return -1;
- }
- dest_size = (FX_DWORD) - 1;
- offset = src_size;
- int err = pDecoder->Decode(NULL, dest_size, src_buf, offset, bEarlyChange);
- delete pDecoder;
- if (err || dest_size == 0 || dest_size + 1 < dest_size) {
- return (FX_DWORD) - 1;
- }
- pDecoder = FX_NEW CLZWDecoder;
- if (pDecoder == NULL) {
- return -1;
- }
- dest_buf = FX_Alloc( FX_BYTE, dest_size + 1);
- if (dest_buf == NULL) {
- return -1;
- }
- dest_buf[dest_size] = '\0';
- pDecoder->Decode(dest_buf, dest_size, src_buf, offset, bEarlyChange);
- delete pDecoder;
- } else {
- FlateUncompress(src_buf, src_size, estimated_size, dest_buf, dest_size, offset);
- }
- if (predictor_type == 0) {
- return offset;
- }
- if (predictor_type == 2) {
- PNG_Predictor(dest_buf, dest_size, Colors, BitsPerComponent, Columns);
- } else if (predictor_type == 1) {
- TIFF_Predictor(dest_buf, dest_size, Colors, BitsPerComponent, Columns);
- }
- return offset;
-}
-FX_BOOL CCodec_FlateModule::Encode(const FX_BYTE* src_buf, FX_DWORD src_size,
- int predictor, int Colors, int BitsPerComponent, int Columns,
- FX_LPBYTE& dest_buf, FX_DWORD& dest_size)
-{
- if (predictor != 2 && predictor < 10) {
- return Encode(src_buf, src_size, dest_buf, dest_size);
- }
- FX_BOOL ret = FALSE;
- FX_LPBYTE pSrcBuf = NULL;
- pSrcBuf = FX_Alloc(FX_BYTE, src_size);
- if (pSrcBuf == NULL) {
- return FALSE;
- }
- FXSYS_memcpy32(pSrcBuf, src_buf, src_size);
- if (predictor == 2) {
- TIFF_PredictorEncode(pSrcBuf, src_size, Colors, BitsPerComponent, Columns);
- } else if (predictor >= 10) {
- PNG_PredictorEncode(pSrcBuf, src_size, predictor, Colors, BitsPerComponent, Columns);
- }
- ret = Encode(pSrcBuf, src_size, dest_buf, dest_size);
- FX_Free(pSrcBuf);
- return ret;
-}
-FX_BOOL CCodec_FlateModule::Encode(FX_LPCBYTE src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size)
-{
- dest_size = src_size + src_size / 1000 + 12;
- dest_buf = FX_Alloc( FX_BYTE, dest_size);
- if (dest_buf == NULL) {
- return FALSE;
- }
- unsigned long temp_size = dest_size;
- FPDFAPI_FlateCompress(dest_buf, &temp_size, src_buf, src_size);
- dest_size = (FX_DWORD)temp_size;
- return TRUE;
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../fx_zlib.h"
+#include "../../../include/fxcodec/fx_codec.h"
+#include "codec_int.h"
+extern "C"
+{
+ static void* my_alloc_func (void* opaque, unsigned int items, unsigned int size)
+ {
+ return FX_Alloc(FX_BYTE, items * size);
+ }
+ static void my_free_func (void* opaque, void* address)
+ {
+ FX_Free(address);
+ }
+ void* FPDFAPI_FlateInit(void* (*alloc_func)(void*, unsigned int, unsigned int),
+ void (*free_func)(void*, void*))
+ {
+ z_stream* p = (z_stream*)alloc_func(0, 1, sizeof(z_stream));
+ if (p == NULL) {
+ return NULL;
+ }
+ FXSYS_memset32(p, 0, sizeof(z_stream));
+ p->zalloc = alloc_func;
+ p->zfree = free_func;
+ inflateInit(p);
+ return p;
+ }
+ void FPDFAPI_FlateInput(void* context, const unsigned char* src_buf, unsigned int src_size)
+ {
+ ((z_stream*)context)->next_in = (unsigned char*)src_buf;
+ ((z_stream*)context)->avail_in = src_size;
+ }
+ int FPDFAPI_FlateGetTotalOut(void* context)
+ {
+ return ((z_stream*)context)->total_out;
+ }
+ int FPDFAPI_FlateOutput(void* context, unsigned char* dest_buf, unsigned int dest_size)
+ {
+ ((z_stream*)context)->next_out = dest_buf;
+ ((z_stream*)context)->avail_out = dest_size;
+ unsigned int pre_pos = (unsigned int)FPDFAPI_FlateGetTotalOut(context);
+ int ret = inflate((z_stream*)context, Z_SYNC_FLUSH);
+ unsigned int post_pos = (unsigned int)FPDFAPI_FlateGetTotalOut(context);
+ unsigned int written = post_pos - pre_pos;
+ if (written < dest_size) {
+ FXSYS_memset8(dest_buf + written, '\0', dest_size - written);
+ }
+ return ret;
+ }
+ int FPDFAPI_FlateGetTotalIn(void* context)
+ {
+ return ((z_stream*)context)->total_in;
+ }
+ int FPDFAPI_FlateGetAvailOut(void* context)
+ {
+ return ((z_stream*)context)->avail_out;
+ }
+ int FPDFAPI_FlateGetAvailIn(void* context)
+ {
+ return ((z_stream*)context)->avail_in;
+ }
+ void FPDFAPI_FlateEnd(void* context)
+ {
+ inflateEnd((z_stream*)context);
+ ((z_stream*)context)->zfree(0, context);
+ }
+ void FPDFAPI_FlateCompress(unsigned char* dest_buf, unsigned long* dest_size, const unsigned char* src_buf, unsigned long src_size)
+ {
+ compress(dest_buf, dest_size, src_buf, src_size);
+ }
+}
+class CLZWDecoder : public CFX_Object
+{
+public:
+ FX_BOOL Decode(FX_LPBYTE output, FX_DWORD& outlen, const FX_BYTE* input, FX_DWORD& size, FX_BOOL bEarlyChange);
+private:
+ FX_DWORD m_InPos;
+ FX_DWORD m_OutPos;
+ FX_LPBYTE m_pOutput;
+ const FX_BYTE* m_pInput;
+ FX_BOOL m_Early;
+ void AddCode(FX_DWORD prefix_code, FX_BYTE append_char);
+ FX_DWORD m_CodeArray[5021];
+ FX_DWORD m_nCodes;
+ FX_BYTE m_DecodeStack[4000];
+ FX_DWORD m_StackLen;
+ void DecodeString(FX_DWORD code);
+ int m_CodeLen;
+};
+void CLZWDecoder::AddCode(FX_DWORD prefix_code, FX_BYTE append_char)
+{
+ if (m_nCodes + m_Early == 4094) {
+ return;
+ }
+ m_CodeArray[m_nCodes ++] = (prefix_code << 16) | append_char;
+ if (m_nCodes + m_Early == 512 - 258) {
+ m_CodeLen = 10;
+ } else if (m_nCodes + m_Early == 1024 - 258) {
+ m_CodeLen = 11;
+ } else if (m_nCodes + m_Early == 2048 - 258) {
+ m_CodeLen = 12;
+ }
+}
+void CLZWDecoder::DecodeString(FX_DWORD code)
+{
+ while (1) {
+ int index = code - 258;
+ if (index < 0 || index >= (int)m_nCodes) {
+ break;
+ }
+ FX_DWORD data = m_CodeArray[index];
+ if (m_StackLen >= sizeof(m_DecodeStack)) {
+ return;
+ }
+ m_DecodeStack[m_StackLen++] = (FX_BYTE)data;
+ code = data >> 16;
+ }
+ if (m_StackLen >= sizeof(m_DecodeStack)) {
+ return;
+ }
+ m_DecodeStack[m_StackLen++] = (FX_BYTE)code;
+}
+int CLZWDecoder::Decode(FX_LPBYTE dest_buf, FX_DWORD& dest_size, const FX_BYTE* src_buf, FX_DWORD& src_size, FX_BOOL bEarlyChange)
+{
+ m_CodeLen = 9;
+ m_InPos = 0;
+ m_OutPos = 0;
+ m_pInput = src_buf;
+ m_pOutput = dest_buf;
+ m_Early = bEarlyChange ? 1 : 0;
+ m_nCodes = 0;
+ FX_DWORD old_code = (FX_DWORD) - 1;
+ FX_BYTE last_char;
+ while (1) {
+ if (m_InPos + m_CodeLen > src_size * 8) {
+ break;
+ }
+ int byte_pos = m_InPos / 8;
+ int bit_pos = m_InPos % 8, bit_left = m_CodeLen;
+ FX_DWORD code = 0;
+ if (bit_pos) {
+ bit_left -= 8 - bit_pos;
+ code = (m_pInput[byte_pos++] & ((1 << (8 - bit_pos)) - 1)) << bit_left;
+ }
+ if (bit_left < 8) {
+ code |= m_pInput[byte_pos] >> (8 - bit_left);
+ } else {
+ bit_left -= 8;
+ code |= m_pInput[byte_pos++] << bit_left;
+ if (bit_left) {
+ code |= m_pInput[byte_pos] >> (8 - bit_left);
+ }
+ }
+ m_InPos += m_CodeLen;
+ if (code < 256) {
+ if (m_OutPos == dest_size) {
+ return -5;
+ }
+ if (m_pOutput) {
+ m_pOutput[m_OutPos] = (FX_BYTE)code;
+ }
+ m_OutPos ++;
+ last_char = (FX_BYTE)code;
+ if (old_code != (FX_DWORD) - 1) {
+ AddCode(old_code, last_char);
+ }
+ old_code = code;
+ } else if (code == 256) {
+ m_CodeLen = 9;
+ m_nCodes = 0;
+ old_code = (FX_DWORD) - 1;
+ } else if (code == 257) {
+ break;
+ } else {
+ if (old_code == (FX_DWORD) - 1) {
+ return 2;
+ }
+ m_StackLen = 0;
+ if (code >= m_nCodes + 258) {
+ if (m_StackLen < sizeof(m_DecodeStack)) {
+ m_DecodeStack[m_StackLen++] = last_char;
+ }
+ DecodeString(old_code);
+ } else {
+ DecodeString(code);
+ }
+ if (m_OutPos + m_StackLen > dest_size) {
+ return -5;
+ }
+ if (m_pOutput) {
+ for (FX_DWORD i = 0; i < m_StackLen; i ++) {
+ m_pOutput[m_OutPos + i] = m_DecodeStack[m_StackLen - i - 1];
+ }
+ }
+ m_OutPos += m_StackLen;
+ last_char = m_DecodeStack[m_StackLen - 1];
+ if (old_code < 256) {
+ AddCode(old_code, last_char);
+ } else if (old_code - 258 >= m_nCodes) {
+ dest_size = m_OutPos;
+ src_size = (m_InPos + 7) / 8;
+ return 0;
+ } else {
+ AddCode(old_code, last_char);
+ }
+ old_code = code;
+ }
+ }
+ dest_size = m_OutPos;
+ src_size = (m_InPos + 7) / 8;
+ return 0;
+}
+static FX_BYTE PaethPredictor(int a, int b, int c)
+{
+ int p = a + b - c;
+ int pa = FXSYS_abs(p - a);
+ int pb = FXSYS_abs(p - b);
+ int pc = FXSYS_abs(p - c);
+ if (pa <= pb && pa <= pc) {
+ return (FX_BYTE)a;
+ }
+ if (pb <= pc) {
+ return (FX_BYTE)b;
+ }
+ return (FX_BYTE)c;
+}
+static void PNG_PredictorEncode(FX_LPBYTE& data_buf, FX_DWORD& data_size, int predictor, int Colors, int BitsPerComponent, int Columns)
+{
+ int BytesPerPixel = (Colors * BitsPerComponent + 7) / 8;
+ int row_size = (Colors * BitsPerComponent * Columns + 7) / 8;
+ int row_count = (data_size + row_size - 1) / row_size;
+ int last_row_size = data_size % row_size;
+ FX_LPBYTE dest_buf = FX_Alloc( FX_BYTE, (row_size + 1) * row_count);
+ if (dest_buf == NULL) {
+ return;
+ }
+ int byte_cnt = 0;
+ FX_LPBYTE pSrcData = data_buf;
+ FX_LPBYTE pDestData = dest_buf;
+ for (int row = 0; row < row_count; row++) {
+ if (predictor == 10) {
+ pDestData[0] = 0;
+ int move_size = row_size;
+ if (move_size * (row + 1) > (int)data_size) {
+ move_size = data_size - (move_size * row);
+ }
+ FXSYS_memmove32(pDestData + 1, pSrcData, move_size);
+ pDestData += (move_size + 1);
+ pSrcData += move_size;
+ byte_cnt += move_size;
+ continue;
+ }
+ for (int byte = 0; byte < row_size && byte_cnt < (int)data_size; byte++) {
+ switch (predictor) {
+ case 11: {
+ pDestData[0] = 1;
+ FX_BYTE left = 0;
+ if (byte >= BytesPerPixel) {
+ left = pSrcData[byte - BytesPerPixel];
+ }
+ pDestData[byte + 1] = pSrcData[byte] - left;
+ }
+ break;
+ case 12: {
+ pDestData[0] = 2;
+ FX_BYTE up = 0;
+ if (row) {
+ up = pSrcData[byte - row_size];
+ }
+ pDestData[byte + 1] = pSrcData[byte] - up;
+ }
+ break;
+ case 13: {
+ pDestData[0] = 3;
+ FX_BYTE left = 0;
+ if (byte >= BytesPerPixel) {
+ left = pSrcData[byte - BytesPerPixel];
+ }
+ FX_BYTE up = 0;
+ if (row) {
+ up = pSrcData[byte - row_size];
+ }
+ pDestData[byte + 1] = pSrcData[byte] - (left + up) / 2;
+ }
+ break;
+ case 14: {
+ pDestData[0] = 4;
+ FX_BYTE left = 0;
+ if (byte >= BytesPerPixel) {
+ left = pSrcData[byte - BytesPerPixel];
+ }
+ FX_BYTE up = 0;
+ if (row) {
+ up = pSrcData[byte - row_size];
+ }
+ FX_BYTE upper_left = 0;
+ if (byte >= BytesPerPixel && row) {
+ upper_left = pSrcData[byte - row_size - BytesPerPixel];
+ }
+ pDestData[byte + 1] = pSrcData[byte] - PaethPredictor(left, up, upper_left);
+ }
+ break;
+ default: {
+ pDestData[byte + 1] = pSrcData[byte];
+ }
+ break;
+ }
+ byte_cnt++;
+ }
+ pDestData += (row_size + 1);
+ pSrcData += row_size;
+ }
+ FX_Free(data_buf);
+ data_buf = dest_buf;
+ data_size = (row_size + 1) * row_count - (last_row_size > 0 ? (row_size - last_row_size) : 0);
+}
+static void PNG_PredictLine(FX_LPBYTE pDestData, FX_LPCBYTE pSrcData, FX_LPCBYTE pLastLine,
+ int bpc, int nColors, int nPixels)
+{
+ int row_size = (nPixels * bpc * nColors + 7) / 8;
+ int BytesPerPixel = (bpc * nColors + 7) / 8;
+ FX_BYTE tag = pSrcData[0];
+ if (tag == 0) {
+ FXSYS_memmove32(pDestData, pSrcData + 1, row_size);
+ return;
+ }
+ for (int byte = 0; byte < row_size; byte ++) {
+ FX_BYTE raw_byte = pSrcData[byte + 1];
+ switch (tag) {
+ case 1: {
+ FX_BYTE left = 0;
+ if (byte >= BytesPerPixel) {
+ left = pDestData[byte - BytesPerPixel];
+ }
+ pDestData[byte] = raw_byte + left;
+ break;
+ }
+ case 2: {
+ FX_BYTE up = 0;
+ if (pLastLine) {
+ up = pLastLine[byte];
+ }
+ pDestData[byte] = raw_byte + up;
+ break;
+ }
+ case 3: {
+ FX_BYTE left = 0;
+ if (byte >= BytesPerPixel) {
+ left = pDestData[byte - BytesPerPixel];
+ }
+ FX_BYTE up = 0;
+ if (pLastLine) {
+ up = pLastLine[byte];
+ }
+ pDestData[byte] = raw_byte + (up + left) / 2;
+ break;
+ }
+ case 4: {
+ FX_BYTE left = 0;
+ if (byte >= BytesPerPixel) {
+ left = pDestData[byte - BytesPerPixel];
+ }
+ FX_BYTE up = 0;
+ if (pLastLine) {
+ up = pLastLine[byte];
+ }
+ FX_BYTE upper_left = 0;
+ if (byte >= BytesPerPixel && pLastLine) {
+ upper_left = pLastLine[byte - BytesPerPixel];
+ }
+ pDestData[byte] = raw_byte + PaethPredictor(left, up, upper_left);
+ break;
+ }
+ default:
+ pDestData[byte] = raw_byte;
+ break;
+ }
+ }
+}
+static void PNG_Predictor(FX_LPBYTE& data_buf, FX_DWORD& data_size,
+ int Colors, int BitsPerComponent, int Columns)
+{
+ int BytesPerPixel = (Colors * BitsPerComponent + 7) / 8;
+ int row_size = (Colors * BitsPerComponent * Columns + 7) / 8;
+ int row_count = (data_size + row_size) / (row_size + 1);
+ int last_row_size = data_size % (row_size + 1);
+ FX_LPBYTE dest_buf = FX_Alloc( FX_BYTE, row_size * row_count);
+ if (dest_buf == NULL) {
+ return;
+ }
+ int byte_cnt = 0;
+ FX_LPBYTE pSrcData = data_buf;
+ FX_LPBYTE pDestData = dest_buf;
+ for (int row = 0; row < row_count; row ++) {
+ FX_BYTE tag = pSrcData[0];
+ if (tag == 0) {
+ int move_size = row_size;
+ if ((row + 1) * (move_size + 1) > (int)data_size) {
+ move_size = last_row_size - 1;
+ }
+ FXSYS_memmove32(pDestData, pSrcData + 1, move_size);
+ pSrcData += move_size + 1;
+ pDestData += move_size;
+ byte_cnt += move_size + 1;
+ continue;
+ }
+ for (int byte = 0; byte < row_size && byte_cnt < (int)data_size; byte ++) {
+ FX_BYTE raw_byte = pSrcData[byte + 1];
+ switch (tag) {
+ case 1: {
+ FX_BYTE left = 0;
+ if (byte >= BytesPerPixel) {
+ left = pDestData[byte - BytesPerPixel];
+ }
+ pDestData[byte] = raw_byte + left;
+ break;
+ }
+ case 2: {
+ FX_BYTE up = 0;
+ if (row) {
+ up = pDestData[byte - row_size];
+ }
+ pDestData[byte] = raw_byte + up;
+ break;
+ }
+ case 3: {
+ FX_BYTE left = 0;
+ if (byte >= BytesPerPixel) {
+ left = pDestData[byte - BytesPerPixel];
+ }
+ FX_BYTE up = 0;
+ if (row) {
+ up = pDestData[byte - row_size];
+ }
+ pDestData[byte] = raw_byte + (up + left) / 2;
+ break;
+ }
+ case 4: {
+ FX_BYTE left = 0;
+ if (byte >= BytesPerPixel) {
+ left = pDestData[byte - BytesPerPixel];
+ }
+ FX_BYTE up = 0;
+ if (row) {
+ up = pDestData[byte - row_size];
+ }
+ FX_BYTE upper_left = 0;
+ if (byte >= BytesPerPixel && row) {
+ upper_left = pDestData[byte - row_size - BytesPerPixel];
+ }
+ pDestData[byte] = raw_byte + PaethPredictor(left, up, upper_left);
+ break;
+ }
+ default:
+ pDestData[byte] = raw_byte;
+ break;
+ }
+ byte_cnt++;
+ }
+ pSrcData += row_size + 1;
+ pDestData += row_size;
+ byte_cnt++;
+ }
+ FX_Free(data_buf);
+ data_buf = dest_buf;
+ data_size = row_size * row_count - (last_row_size > 0 ? (row_size + 1 - last_row_size) : 0);
+}
+static void TIFF_PredictorEncodeLine(FX_LPBYTE dest_buf, int row_size, int BitsPerComponent, int Colors, int Columns)
+{
+ int BytesPerPixel = BitsPerComponent * Colors / 8;
+ if (BitsPerComponent < 8) {
+ FX_BYTE mask = 0x01;
+ if (BitsPerComponent == 2) {
+ mask = 0x03;
+ } else if (BitsPerComponent == 4) {
+ mask = 0x0F;
+ }
+ int row_bits = Colors * BitsPerComponent * Columns;
+ for (int i = row_bits - BitsPerComponent; i >= BitsPerComponent; i -= BitsPerComponent) {
+ int col = i % 8;
+ int index = i / 8;
+ int col_pre = (col == 0) ? (8 - BitsPerComponent) : (col - BitsPerComponent);
+ int index_pre = (col == 0) ? (index - 1) : index;
+ FX_BYTE cur = (dest_buf[index] >> (8 - col - BitsPerComponent)) & mask;
+ FX_BYTE left = (dest_buf[index_pre] >> (8 - col_pre - BitsPerComponent)) & mask;
+ cur -= left;
+ cur &= mask;
+ cur <<= (8 - col - BitsPerComponent);
+ dest_buf[index] &= ~(mask << ((8 - col - BitsPerComponent)));
+ dest_buf[index] |= cur;
+ }
+ } else if (BitsPerComponent == 8) {
+ for (int i = row_size - 1; i >= BytesPerPixel; i--) {
+ dest_buf[i] -= dest_buf[i - BytesPerPixel];
+ }
+ } else {
+ for (int i = row_size - BytesPerPixel; i >= BytesPerPixel; i -= BytesPerPixel) {
+ FX_WORD pixel = (dest_buf[i] << 8) | dest_buf[i + 1];
+ pixel -= (dest_buf[i - BytesPerPixel] << 8) | dest_buf[i - BytesPerPixel + 1];
+ dest_buf[i] = pixel >> 8;
+ dest_buf[i + 1] = (FX_BYTE)pixel;
+ }
+ }
+}
+static void TIFF_PredictorEncode(FX_LPBYTE& data_buf, FX_DWORD& data_size,
+ int Colors, int BitsPerComponent, int Columns)
+{
+ int row_size = (Colors * BitsPerComponent * Columns + 7) / 8;
+ int row_count = (data_size + row_size - 1) / row_size;
+ int last_row_size = data_size % row_size;
+ for (int row = 0; row < row_count; row++) {
+ FX_LPBYTE scan_line = data_buf + row * row_size;
+ if ((row + 1) * row_size > (int)data_size) {
+ row_size = last_row_size;
+ }
+ TIFF_PredictorEncodeLine(scan_line, row_size, BitsPerComponent, Colors, Columns);
+ }
+}
+static void TIFF_PredictLine(FX_LPBYTE dest_buf, int row_size, int BitsPerComponent, int Colors, int Columns)
+{
+ if (BitsPerComponent == 1) {
+ int row_bits = BitsPerComponent * Colors * Columns;
+ for(int i = 1; i < row_bits; i ++) {
+ int col = i % 8;
+ int index = i / 8;
+ int index_pre = (col == 0) ? (index - 1) : index;
+ int col_pre = (col == 0) ? 8 : col;
+ if( ((dest_buf[index] >> (7 - col)) & 1) ^ ((dest_buf[index_pre] >> (8 - col_pre)) & 1) ) {
+ dest_buf[index] |= 1 << (7 - col);
+ } else {
+ dest_buf[index] &= ~(1 << (7 - col));
+ }
+ }
+ return;
+ }
+ int BytesPerPixel = BitsPerComponent * Colors / 8;
+ if (BitsPerComponent == 16) {
+ for (int i = BytesPerPixel; i < row_size; i += 2) {
+ FX_WORD pixel = (dest_buf[i - BytesPerPixel] << 8) | dest_buf[i - BytesPerPixel + 1];
+ pixel += (dest_buf[i] << 8) | dest_buf[i + 1];
+ dest_buf[i] = pixel >> 8;
+ dest_buf[i + 1] = (FX_BYTE)pixel;
+ }
+ } else {
+ for (int i = BytesPerPixel; i < row_size; i ++) {
+ dest_buf[i] += dest_buf[i - BytesPerPixel];
+ }
+ }
+}
+static void TIFF_Predictor(FX_LPBYTE& data_buf, FX_DWORD& data_size,
+ int Colors, int BitsPerComponent, int Columns)
+{
+ int row_size = (Colors * BitsPerComponent * Columns + 7) / 8;
+ int row_count = (data_size + row_size - 1) / row_size;
+ int last_row_size = data_size % row_size;
+ for (int row = 0; row < row_count; row ++) {
+ FX_LPBYTE scan_line = data_buf + row * row_size;
+ if ((row + 1) * row_size > (int)data_size) {
+ row_size = last_row_size;
+ }
+ TIFF_PredictLine(scan_line, row_size, BitsPerComponent, Colors, Columns);
+ }
+}
+class CCodec_FlateScanlineDecoder : public CCodec_ScanlineDecoder
+{
+public:
+ CCodec_FlateScanlineDecoder();
+ ~CCodec_FlateScanlineDecoder();
+ FX_BOOL Create(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height, int nComps, int bpc,
+ int predictor, int Colors, int BitsPerComponent, int Columns);
+ virtual void Destroy()
+ {
+ delete this;
+ }
+ virtual void v_DownScale(int dest_width, int dest_height) {}
+ virtual FX_BOOL v_Rewind();
+ virtual FX_LPBYTE v_GetNextLine();
+ virtual FX_DWORD GetSrcOffset();
+ void* m_pFlate;
+ FX_LPCBYTE m_SrcBuf;
+ FX_DWORD m_SrcSize;
+ FX_LPBYTE m_pScanline;
+ FX_LPBYTE m_pLastLine;
+ FX_LPBYTE m_pPredictBuffer;
+ FX_LPBYTE m_pPredictRaw;
+ int m_Predictor;
+ int m_Colors, m_BitsPerComponent, m_Columns, m_PredictPitch, m_LeftOver;
+};
+CCodec_FlateScanlineDecoder::CCodec_FlateScanlineDecoder()
+{
+ m_pFlate = NULL;
+ m_pScanline = NULL;
+ m_pLastLine = NULL;
+ m_pPredictBuffer = NULL;
+ m_pPredictRaw = NULL;
+ m_LeftOver = 0;
+}
+CCodec_FlateScanlineDecoder::~CCodec_FlateScanlineDecoder()
+{
+ if (m_pScanline) {
+ FX_Free(m_pScanline);
+ }
+ if (m_pLastLine) {
+ FX_Free(m_pLastLine);
+ }
+ if (m_pPredictBuffer) {
+ FX_Free(m_pPredictBuffer);
+ }
+ if (m_pPredictRaw) {
+ FX_Free(m_pPredictRaw);
+ }
+ if (m_pFlate) {
+ FPDFAPI_FlateEnd(m_pFlate);
+ }
+}
+FX_BOOL CCodec_FlateScanlineDecoder::Create(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,
+ int nComps, int bpc, int predictor, int Colors, int BitsPerComponent, int Columns)
+{
+ m_SrcBuf = src_buf;
+ m_SrcSize = src_size;
+ m_OutputWidth = m_OrigWidth = width;
+ m_OutputHeight = m_OrigHeight = height;
+ m_nComps = nComps;
+ m_bpc = bpc;
+ m_bColorTransformed = FALSE;
+ m_Pitch = (width * nComps * bpc + 7) / 8;
+ m_pScanline = FX_Alloc(FX_BYTE, m_Pitch);
+ if (m_pScanline == NULL) {
+ return FALSE;
+ }
+ m_Predictor = 0;
+ if (predictor) {
+ if (predictor >= 10) {
+ m_Predictor = 2;
+ } else if (predictor == 2) {
+ m_Predictor = 1;
+ }
+ if (m_Predictor) {
+ if (BitsPerComponent * Colors * Columns == 0) {
+ BitsPerComponent = m_bpc;
+ Colors = m_nComps;
+ Columns = m_OrigWidth;
+ }
+ m_Colors = Colors;
+ m_BitsPerComponent = BitsPerComponent;
+ m_Columns = Columns;
+ m_PredictPitch = (m_BitsPerComponent * m_Colors * m_Columns + 7) / 8;
+ m_pLastLine = FX_Alloc(FX_BYTE, m_PredictPitch);
+ if (m_pLastLine == NULL) {
+ return FALSE;
+ }
+ FXSYS_memset32(m_pLastLine, 0, m_PredictPitch);
+ m_pPredictRaw = FX_Alloc(FX_BYTE, m_PredictPitch + 1);
+ if (m_pPredictRaw == NULL) {
+ return FALSE;
+ }
+ m_pPredictBuffer = FX_Alloc(FX_BYTE, m_PredictPitch);
+ if (m_pPredictBuffer == NULL) {
+ return FALSE;
+ }
+ }
+ }
+ return TRUE;
+}
+FX_BOOL CCodec_FlateScanlineDecoder::v_Rewind()
+{
+ if (m_pFlate) {
+ FPDFAPI_FlateEnd(m_pFlate);
+ }
+ m_pFlate = FPDFAPI_FlateInit(my_alloc_func, my_free_func);
+ if (m_pFlate == NULL) {
+ return FALSE;
+ }
+ FPDFAPI_FlateInput(m_pFlate, m_SrcBuf, m_SrcSize);
+ m_LeftOver = 0;
+ return TRUE;
+}
+FX_LPBYTE CCodec_FlateScanlineDecoder::v_GetNextLine()
+{
+ if (m_Predictor) {
+ if (m_Pitch == m_PredictPitch) {
+ if (m_Predictor == 2) {
+ FPDFAPI_FlateOutput(m_pFlate, m_pPredictRaw, m_PredictPitch + 1);
+ PNG_PredictLine(m_pScanline, m_pPredictRaw, m_pLastLine, m_BitsPerComponent, m_Colors, m_Columns);
+ FXSYS_memcpy32(m_pLastLine, m_pScanline, m_PredictPitch);
+ } else {
+ FPDFAPI_FlateOutput(m_pFlate, m_pScanline, m_Pitch);
+ TIFF_PredictLine(m_pScanline, m_PredictPitch, m_bpc, m_nComps, m_OutputWidth);
+ }
+ } else {
+ int bytes_to_go = m_Pitch;
+ int read_leftover = m_LeftOver > bytes_to_go ? bytes_to_go : m_LeftOver;
+ if (read_leftover) {
+ FXSYS_memcpy32(m_pScanline, m_pPredictBuffer + m_PredictPitch - m_LeftOver, read_leftover);
+ m_LeftOver -= read_leftover;
+ bytes_to_go -= read_leftover;
+ }
+ while (bytes_to_go) {
+ if (m_Predictor == 2) {
+ FPDFAPI_FlateOutput(m_pFlate, m_pPredictRaw, m_PredictPitch + 1);
+ PNG_PredictLine(m_pPredictBuffer, m_pPredictRaw, m_pLastLine, m_BitsPerComponent, m_Colors, m_Columns);
+ FXSYS_memcpy32(m_pLastLine, m_pPredictBuffer, m_PredictPitch);
+ } else {
+ FPDFAPI_FlateOutput(m_pFlate, m_pPredictBuffer, m_PredictPitch);
+ TIFF_PredictLine(m_pPredictBuffer, m_PredictPitch, m_BitsPerComponent, m_Colors, m_Columns);
+ }
+ int read_bytes = m_PredictPitch > bytes_to_go ? bytes_to_go : m_PredictPitch;
+ FXSYS_memcpy32(m_pScanline + m_Pitch - bytes_to_go, m_pPredictBuffer, read_bytes);
+ m_LeftOver += m_PredictPitch - read_bytes;
+ bytes_to_go -= read_bytes;
+ }
+ }
+ } else {
+ FPDFAPI_FlateOutput(m_pFlate, m_pScanline, m_Pitch);
+ }
+ return m_pScanline;
+}
+FX_DWORD CCodec_FlateScanlineDecoder::GetSrcOffset()
+{
+ return FPDFAPI_FlateGetTotalIn(m_pFlate);
+}
+static void FlateUncompress(FX_LPCBYTE src_buf, FX_DWORD src_size, FX_DWORD orig_size,
+ FX_LPBYTE& dest_buf, FX_DWORD& dest_size, FX_DWORD& offset)
+{
+ FX_DWORD guess_size = orig_size ? orig_size : src_size * 2;
+ FX_DWORD alloc_step = orig_size ? 10240 : (src_size < 10240 ? 10240 : src_size);
+ static const FX_DWORD kMaxInitialAllocSize = 10000000;
+ if (guess_size > kMaxInitialAllocSize) {
+ guess_size = kMaxInitialAllocSize;
+ alloc_step = kMaxInitialAllocSize;
+ }
+ FX_LPBYTE guess_buf = FX_Alloc(FX_BYTE, guess_size + 1);
+ if (!guess_buf) {
+ dest_buf = NULL;
+ dest_size = 0;
+ return;
+ }
+ guess_buf[guess_size] = '\0';
+ FX_BOOL useOldImpl = src_size < 10240;
+ void* context = FPDFAPI_FlateInit(my_alloc_func, my_free_func);
+ if (context == NULL) {
+ dest_buf = NULL;
+ dest_size = 0;
+ return ;
+ }
+ FPDFAPI_FlateInput(context, src_buf, src_size);
+ CFX_ArrayTemplate<FX_LPBYTE> result_tmp_bufs;
+ FX_LPBYTE buf = guess_buf;
+ FX_DWORD buf_size = guess_size;
+ FX_DWORD last_buf_size = buf_size;
+ while (1) {
+ FX_INT32 ret = FPDFAPI_FlateOutput(context, buf, buf_size);
+ FX_INT32 avail_buf_size = FPDFAPI_FlateGetAvailOut(context);
+ if (!useOldImpl) {
+ if (ret != Z_OK) {
+ last_buf_size = buf_size - avail_buf_size;
+ result_tmp_bufs.Add(buf);
+ break;
+ }
+ if (avail_buf_size == 0) {
+ result_tmp_bufs.Add(buf);
+ buf = NULL;
+ buf = FX_Alloc(FX_BYTE, buf_size + 1);
+ if (!buf) {
+ dest_buf = NULL;
+ dest_size = 0;
+ return;
+ }
+ buf[buf_size] = '\0';
+ } else {
+ last_buf_size = buf_size - avail_buf_size;
+ result_tmp_bufs.Add(buf);
+ buf = NULL;
+ break;
+ }
+ } else {
+ if (ret != Z_OK) {
+ break;
+ }
+ if (avail_buf_size == 0) {
+ FX_DWORD old_size = guess_size;
+ guess_size += alloc_step;
+ if (guess_size < old_size || guess_size + 1 < guess_size) {
+ dest_buf = NULL;
+ dest_size = 0;
+ return;
+ }
+ guess_buf = FX_Realloc(FX_BYTE, guess_buf, guess_size + 1);
+ if (!guess_buf) {
+ dest_buf = NULL;
+ dest_size = 0;
+ return;
+ }
+ guess_buf[guess_size] = '\0';
+ buf = guess_buf + old_size;
+ buf_size = guess_size - old_size;
+ } else {
+ break;
+ }
+ }
+ }
+ dest_size = FPDFAPI_FlateGetTotalOut(context);
+ offset = FPDFAPI_FlateGetTotalIn(context);
+ if (!useOldImpl) {
+ if (result_tmp_bufs.GetSize() == 1) {
+ dest_buf = result_tmp_bufs[0];
+ } else {
+ FX_LPBYTE result_buf = FX_Alloc(FX_BYTE, dest_size);
+ if (!result_buf) {
+ dest_buf = NULL;
+ dest_size = 0;
+ return;
+ }
+ FX_DWORD result_pos = 0;
+ for (FX_INT32 i = 0; i < result_tmp_bufs.GetSize(); i++) {
+ FX_LPBYTE tmp_buf = result_tmp_bufs[i];
+ FX_DWORD tmp_buf_size = buf_size;
+ if (i == result_tmp_bufs.GetSize() - 1) {
+ tmp_buf_size = last_buf_size;
+ }
+ FXSYS_memcpy32(result_buf + result_pos, tmp_buf, tmp_buf_size);
+ result_pos += tmp_buf_size;
+ FX_Free(tmp_buf);
+ tmp_buf = NULL;
+ result_tmp_bufs[i] = NULL;
+ }
+ dest_buf = result_buf;
+ }
+ } else {
+ if (guess_size / 2 > dest_size) {
+ guess_buf = FX_Realloc(FX_BYTE, guess_buf, dest_size + 1);
+ if (!guess_buf) {
+ dest_buf = NULL;
+ dest_size = 0;
+ return;
+ }
+ guess_size = dest_size;
+ guess_buf[guess_size] = '\0';
+ }
+ dest_buf = guess_buf;
+ }
+ FPDFAPI_FlateEnd(context);
+ context = NULL;
+}
+ICodec_ScanlineDecoder* CCodec_FlateModule::CreateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,
+ int nComps, int bpc, int predictor, int Colors, int BitsPerComponent, int Columns)
+{
+ CCodec_FlateScanlineDecoder* pDecoder = FX_NEW CCodec_FlateScanlineDecoder;
+ if (pDecoder == NULL) {
+ return NULL;
+ }
+ pDecoder->Create(src_buf, src_size, width, height, nComps, bpc, predictor, Colors, BitsPerComponent, Columns);
+ return pDecoder;
+}
+FX_DWORD CCodec_FlateModule::FlateOrLZWDecode(FX_BOOL bLZW, const FX_BYTE* src_buf, FX_DWORD src_size, FX_BOOL bEarlyChange,
+ int predictor, int Colors, int BitsPerComponent, int Columns,
+ FX_DWORD estimated_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size)
+{
+ CLZWDecoder* pDecoder = NULL;
+ dest_buf = NULL;
+ FX_DWORD offset = 0;
+ int predictor_type = 0;
+ if (predictor) {
+ if (predictor >= 10) {
+ predictor_type = 2;
+ } else if (predictor == 2) {
+ predictor_type = 1;
+ }
+ }
+ if (bLZW) {
+ pDecoder = FX_NEW CLZWDecoder;
+ if (pDecoder == NULL) {
+ return -1;
+ }
+ dest_size = (FX_DWORD) - 1;
+ offset = src_size;
+ int err = pDecoder->Decode(NULL, dest_size, src_buf, offset, bEarlyChange);
+ delete pDecoder;
+ if (err || dest_size == 0 || dest_size + 1 < dest_size) {
+ return (FX_DWORD) - 1;
+ }
+ pDecoder = FX_NEW CLZWDecoder;
+ if (pDecoder == NULL) {
+ return -1;
+ }
+ dest_buf = FX_Alloc( FX_BYTE, dest_size + 1);
+ if (dest_buf == NULL) {
+ return -1;
+ }
+ dest_buf[dest_size] = '\0';
+ pDecoder->Decode(dest_buf, dest_size, src_buf, offset, bEarlyChange);
+ delete pDecoder;
+ } else {
+ FlateUncompress(src_buf, src_size, estimated_size, dest_buf, dest_size, offset);
+ }
+ if (predictor_type == 0) {
+ return offset;
+ }
+ if (predictor_type == 2) {
+ PNG_Predictor(dest_buf, dest_size, Colors, BitsPerComponent, Columns);
+ } else if (predictor_type == 1) {
+ TIFF_Predictor(dest_buf, dest_size, Colors, BitsPerComponent, Columns);
+ }
+ return offset;
+}
+FX_BOOL CCodec_FlateModule::Encode(const FX_BYTE* src_buf, FX_DWORD src_size,
+ int predictor, int Colors, int BitsPerComponent, int Columns,
+ FX_LPBYTE& dest_buf, FX_DWORD& dest_size)
+{
+ if (predictor != 2 && predictor < 10) {
+ return Encode(src_buf, src_size, dest_buf, dest_size);
+ }
+ FX_BOOL ret = FALSE;
+ FX_LPBYTE pSrcBuf = NULL;
+ pSrcBuf = FX_Alloc(FX_BYTE, src_size);
+ if (pSrcBuf == NULL) {
+ return FALSE;
+ }
+ FXSYS_memcpy32(pSrcBuf, src_buf, src_size);
+ if (predictor == 2) {
+ TIFF_PredictorEncode(pSrcBuf, src_size, Colors, BitsPerComponent, Columns);
+ } else if (predictor >= 10) {
+ PNG_PredictorEncode(pSrcBuf, src_size, predictor, Colors, BitsPerComponent, Columns);
+ }
+ ret = Encode(pSrcBuf, src_size, dest_buf, dest_size);
+ FX_Free(pSrcBuf);
+ return ret;
+}
+FX_BOOL CCodec_FlateModule::Encode(FX_LPCBYTE src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size)
+{
+ dest_size = src_size + src_size / 1000 + 12;
+ dest_buf = FX_Alloc( FX_BYTE, dest_size);
+ if (dest_buf == NULL) {
+ return FALSE;
+ }
+ unsigned long temp_size = dest_size;
+ FPDFAPI_FlateCompress(dest_buf, &temp_size, src_buf, src_size);
+ dest_size = (FX_DWORD)temp_size;
+ return TRUE;
+}
diff --git a/core/src/fxcodec/codec/fx_codec_icc.cpp b/core/src/fxcodec/codec/fx_codec_icc.cpp
index 65617642fe..22659ba9ff 100644
--- a/core/src/fxcodec/codec/fx_codec_icc.cpp
+++ b/core/src/fxcodec/codec/fx_codec_icc.cpp
@@ -1,1360 +1,1360 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../../include/fxcodec/fx_codec.h"
-#include "codec_int.h"
-#include "../lcms2/include/fx_lcms2.h"
-FX_BOOL MD5ComputeID( FX_LPCVOID buf, FX_DWORD dwSize, FX_BYTE ID[16] )
-{
- return cmsMD5computeIDExt(buf, dwSize, ID);
-}
-struct CLcmsCmm : public CFX_Object {
- cmsHTRANSFORM m_hTransform;
- int m_nSrcComponents;
- int m_nDstComponents;
- FX_BOOL m_bLab;
-};
-extern "C" {
- int ourHandler(int ErrorCode, const char *ErrorText)
- {
- return TRUE;
- }
-};
-FX_BOOL CheckComponents(cmsColorSpaceSignature cs, int nComponents, FX_BOOL bDst)
-{
- if (nComponents <= 0 || nComponents > 15) {
- return FALSE;
- }
- switch(cs) {
- case cmsSigLabData:
- if (nComponents < 3) {
- return FALSE;
- }
- break;
- case cmsSigGrayData:
- if (bDst && nComponents != 1) {
- return FALSE;
- } else if (!bDst && nComponents > 2) {
- return FALSE;
- }
- break;
- case cmsSigRgbData:
- if (bDst && nComponents != 3) {
- return FALSE;
- }
- break;
- case cmsSigCmykData:
- if (bDst && nComponents != 4) {
- return FALSE;
- }
- break;
- default:
- if (nComponents != 3) {
- return FALSE;
- }
- break;
- }
- return TRUE;
-}
-void* IccLib_CreateTransform(const unsigned char* pSrcProfileData, unsigned int dwSrcProfileSize, int nSrcComponents,
- const unsigned char* pDstProfileData, unsigned int dwDstProfileSize, int nDstComponents,
- int intent, FX_DWORD dwSrcFormat = Icc_FORMAT_DEFAULT, FX_DWORD dwDstFormat = Icc_FORMAT_DEFAULT)
-{
- cmsHPROFILE srcProfile = NULL;
- cmsHPROFILE dstProfile = NULL;
- cmsHTRANSFORM hTransform = NULL;
- CLcmsCmm* pCmm = NULL;
- srcProfile = cmsOpenProfileFromMem((void*)pSrcProfileData, dwSrcProfileSize);
- if (srcProfile == NULL) {
- return NULL;
- }
- if(pDstProfileData == NULL && dwDstProfileSize == 0 && nDstComponents == 3) {
- dstProfile = cmsCreate_sRGBProfile();
- } else {
- dstProfile = cmsOpenProfileFromMem((void*)pDstProfileData, dwDstProfileSize);
- }
- if (dstProfile == NULL) {
- cmsCloseProfile(srcProfile);
- return NULL;
- }
- int srcFormat;
- FX_BOOL bLab = FALSE;
- cmsColorSpaceSignature srcCS = cmsGetColorSpace(srcProfile);
- if (!CheckComponents(srcCS, nSrcComponents, FALSE)) {
- cmsCloseProfile(srcProfile);
- cmsCloseProfile(dstProfile);
- return NULL;
- }
- if (srcCS == cmsSigLabData) {
- srcFormat = COLORSPACE_SH(PT_Lab) | CHANNELS_SH(nSrcComponents) | BYTES_SH(0);
- bLab = TRUE;
- } else {
- srcFormat = COLORSPACE_SH(PT_ANY) | CHANNELS_SH(nSrcComponents) | BYTES_SH(1);
- if (srcCS == cmsSigRgbData && T_DOSWAP(dwSrcFormat)) {
- srcFormat |= DOSWAP_SH(1);
- }
- }
- cmsColorSpaceSignature dstCS = cmsGetColorSpace(dstProfile);
- if (!CheckComponents(dstCS, nDstComponents, TRUE)) {
- cmsCloseProfile(srcProfile);
- cmsCloseProfile(dstProfile);
- return NULL;
- }
- switch(dstCS) {
- case cmsSigGrayData:
- hTransform = cmsCreateTransform(srcProfile, srcFormat, dstProfile, TYPE_GRAY_8, intent, 0);
- break;
- case cmsSigRgbData:
- hTransform = cmsCreateTransform(srcProfile, srcFormat, dstProfile, TYPE_BGR_8, intent, 0);
- break;
- case cmsSigCmykData:
- hTransform = cmsCreateTransform(srcProfile, srcFormat, dstProfile,
- T_DOSWAP(dwDstFormat) ? TYPE_KYMC_8 : TYPE_CMYK_8,
- intent, 0);
- break;
- default:
- break;
- }
- if (hTransform == NULL) {
- cmsCloseProfile(srcProfile);
- cmsCloseProfile(dstProfile);
- return NULL;
- }
- pCmm = FX_NEW CLcmsCmm;
- if (pCmm == NULL) {
- return NULL;
- }
- pCmm->m_nSrcComponents = nSrcComponents;
- pCmm->m_nDstComponents = nDstComponents;
- pCmm->m_hTransform = hTransform;
- pCmm->m_bLab = bLab;
- cmsCloseProfile(srcProfile);
- cmsCloseProfile(dstProfile);
- return pCmm;
-}
-void* IccLib_CreateTransform_sRGB(const unsigned char* pProfileData, unsigned int dwProfileSize, int nComponents, int intent, FX_DWORD dwSrcFormat)
-{
- return IccLib_CreateTransform(pProfileData, dwProfileSize, nComponents, NULL, 0, 3, intent, dwSrcFormat);
-}
-void IccLib_DestroyTransform(void* pTransform)
-{
- if (pTransform == NULL) {
- return;
- }
- cmsDeleteTransform(((CLcmsCmm*)pTransform)->m_hTransform);
- delete (CLcmsCmm*)pTransform;
-}
-void IccLib_Translate(void* pTransform, FX_FLOAT* pSrcValues, FX_FLOAT* pDestValues)
-{
- if (pTransform == NULL) {
- return;
- }
- CLcmsCmm* p = (CLcmsCmm*)pTransform;
- FX_BYTE output[4];
- if (p->m_bLab) {
- CFX_FixedBufGrow<double, 16> inputs(p->m_nSrcComponents);
- double* input = inputs;
- for (int i = 0; i < p->m_nSrcComponents; i ++) {
- input[i] = pSrcValues[i];
- }
- cmsDoTransform(p->m_hTransform, input, output, 1);
- } else {
- CFX_FixedBufGrow<FX_BYTE, 16> inputs(p->m_nSrcComponents);
- FX_BYTE* input = inputs;
- for (int i = 0; i < p->m_nSrcComponents; i ++) {
- if (pSrcValues[i] > 1.0f) {
- input[i] = 255;
- } else if (pSrcValues[i] < 0) {
- input[i] = 0;
- } else {
- input[i] = (int)(pSrcValues[i] * 255.0f);
- }
- }
- cmsDoTransform(p->m_hTransform, input, output, 1);
- }
- switch(p->m_nDstComponents) {
- case 1:
- pDestValues[0] = output[0] / 255.0f;
- break;
- case 3:
- pDestValues[0] = output[2] / 255.0f;
- pDestValues[1] = output[1] / 255.0f;
- pDestValues[2] = output[0] / 255.0f;
- break;
- case 4:
- pDestValues[0] = output[0] / 255.0f;
- pDestValues[1] = output[1] / 255.0f;
- pDestValues[2] = output[2] / 255.0f;
- pDestValues[3] = output[3] / 255.0f;
- break;
- }
-}
-void IccLib_TranslateImage(void* pTransform, unsigned char* pDest, const unsigned char* pSrc, int pixels)
-{
- cmsDoTransform(((CLcmsCmm*)pTransform)->m_hTransform, (void*)pSrc, pDest, pixels);
-}
-FX_LPVOID CreateProfile_Gray(double gamma)
-{
- cmsCIExyY* D50 = (cmsCIExyY*)cmsD50_xyY();
- if (!cmsWhitePointFromTemp(D50, 6504)) {
- return NULL;
- }
- cmsToneCurve* curve = cmsBuildGamma(NULL, gamma);
- if (curve == NULL) {
- return NULL;
- }
- FX_LPVOID profile = cmsCreateGrayProfile(D50, curve);
- cmsFreeToneCurve(curve);
- return profile;
-}
-ICodec_IccModule::IccCS GetProfileCSFromHandle(FX_LPVOID pProfile)
-{
- if (pProfile == NULL) {
- return ICodec_IccModule::IccCS_Unknown;
- }
- switch (cmsGetColorSpace(pProfile)) {
- case cmsSigXYZData:
- return ICodec_IccModule::IccCS_XYZ;
- case cmsSigLabData:
- return ICodec_IccModule::IccCS_Lab;
- case cmsSigLuvData:
- return ICodec_IccModule::IccCS_Luv;
- case cmsSigYCbCrData:
- return ICodec_IccModule::IccCS_YCbCr;
- case cmsSigYxyData:
- return ICodec_IccModule::IccCS_Yxy;
- case cmsSigRgbData:
- return ICodec_IccModule::IccCS_Rgb;
- case cmsSigGrayData:
- return ICodec_IccModule::IccCS_Gray;
- case cmsSigHsvData:
- return ICodec_IccModule::IccCS_Hsv;
- case cmsSigHlsData:
- return ICodec_IccModule::IccCS_Hls;
- case cmsSigCmykData:
- return ICodec_IccModule::IccCS_Cmyk;
- case cmsSigCmyData:
- return ICodec_IccModule::IccCS_Cmy;
- default:
- return ICodec_IccModule::IccCS_Unknown;
- }
-}
-ICodec_IccModule::IccCS CCodec_IccModule::GetProfileCS(FX_LPCBYTE pProfileData, unsigned int dwProfileSize)
-{
- ICodec_IccModule::IccCS cs;
- cmsHPROFILE hProfile = cmsOpenProfileFromMem((void*)pProfileData, dwProfileSize);
- if (hProfile == NULL) {
- return IccCS_Unknown;
- }
- cs = GetProfileCSFromHandle(hProfile);
- if (hProfile) {
- cmsCloseProfile(hProfile);
- }
- return cs;
-}
-ICodec_IccModule::IccCS CCodec_IccModule::GetProfileCS(IFX_FileRead* pFile)
-{
- if (pFile == NULL) {
- return IccCS_Unknown;
- }
- ICodec_IccModule::IccCS cs;
- FX_DWORD dwSize = (FX_DWORD)pFile->GetSize();
- FX_LPBYTE pBuf = FX_Alloc(FX_BYTE, dwSize);
- if (pBuf == NULL) {
- return IccCS_Unknown;
- }
- pFile->ReadBlock(pBuf, 0, dwSize);
- cs = GetProfileCS(pBuf, dwSize);
- FX_Free(pBuf);
- return cs;
-}
-FX_DWORD TransferProfileType(FX_LPVOID pProfile, FX_DWORD dwFormat)
-{
- cmsColorSpaceSignature cs = cmsGetColorSpace(pProfile);
- switch (cs) {
- case cmsSigXYZData:
- return TYPE_XYZ_16;
- case cmsSigLabData:
- return TYPE_Lab_DBL;
- case cmsSigLuvData:
- return TYPE_YUV_8;
- case cmsSigYCbCrData:
- return TYPE_YCbCr_8;
- case cmsSigYxyData:
- return TYPE_Yxy_16;
- case cmsSigRgbData:
- return T_DOSWAP(dwFormat) ? TYPE_RGB_8 : TYPE_BGR_8;
- case cmsSigGrayData:
- return TYPE_GRAY_8;
- case cmsSigHsvData:
- return TYPE_HSV_8;
- case cmsSigHlsData:
- return TYPE_HLS_8;
- case cmsSigCmykData:
- return T_DOSWAP(dwFormat) ? TYPE_KYMC_8 : TYPE_CMYK_8;
- case cmsSigCmyData:
- return TYPE_CMY_8;
- case cmsSigMCH5Data:
- return T_DOSWAP(dwFormat) ? TYPE_KYMC5_8 : TYPE_CMYK5_8;
- case cmsSigMCH6Data:
- return TYPE_CMYK6_8;
- case cmsSigMCH7Data:
- return T_DOSWAP(dwFormat) ? TYPE_KYMC7_8 : TYPE_CMYK7_8;
- case cmsSigMCH8Data:
- return T_DOSWAP(dwFormat) ? TYPE_KYMC8_8 : TYPE_CMYK8_8;
- case cmsSigMCH9Data:
- return T_DOSWAP(dwFormat) ? TYPE_KYMC9_8 : TYPE_CMYK9_8;
- case cmsSigMCHAData:
- return T_DOSWAP(dwFormat) ? TYPE_KYMC10_8 : TYPE_CMYK10_8;
- case cmsSigMCHBData:
- return T_DOSWAP(dwFormat) ? TYPE_KYMC11_8 : TYPE_CMYK11_8;
- case cmsSigMCHCData:
- return T_DOSWAP(dwFormat) ? TYPE_KYMC12_8 : TYPE_CMYK12_8;
- default:
- return 0;
- }
-}
-class CFX_IccProfileCache : public CFX_Object
-{
-public:
- CFX_IccProfileCache();
- ~CFX_IccProfileCache();
- FX_LPVOID m_pProfile;
- FX_DWORD m_dwRate;
-protected:
- void Purge();
-};
-CFX_IccProfileCache::CFX_IccProfileCache()
-{
- m_pProfile = NULL;
- m_dwRate = 1;
-}
-CFX_IccProfileCache::~CFX_IccProfileCache()
-{
- if (m_pProfile) {
- cmsCloseProfile(m_pProfile);
- }
-}
-void CFX_IccProfileCache::Purge()
-{
-}
-class CFX_IccTransformCache : public CFX_Object
-{
-public:
- CFX_IccTransformCache(CLcmsCmm* pCmm = NULL);
- ~CFX_IccTransformCache();
- FX_LPVOID m_pIccTransform;
- FX_DWORD m_dwRate;
- CLcmsCmm* m_pCmm;
-protected:
- void Purge();
-};
-CFX_IccTransformCache::CFX_IccTransformCache(CLcmsCmm* pCmm)
-{
- m_pIccTransform = NULL;
- m_dwRate = 1;
- m_pCmm = pCmm;
-}
-CFX_IccTransformCache::~CFX_IccTransformCache()
-{
- if (m_pIccTransform) {
- cmsDeleteTransform(m_pIccTransform);
- }
- if (m_pCmm) {
- FX_Free(m_pCmm);
- }
-}
-void CFX_IccTransformCache::Purge()
-{
-}
-class CFX_ByteStringKey : public CFX_BinaryBuf
-{
-public:
- CFX_ByteStringKey() : CFX_BinaryBuf() {}
- CFX_ByteStringKey& operator << (FX_DWORD i);
-};
-CFX_ByteStringKey& CFX_ByteStringKey::operator << (FX_DWORD i)
-{
- AppendBlock(&i, sizeof(FX_DWORD));
- return *this;
-}
-FX_LPVOID CCodec_IccModule::CreateProfile(ICodec_IccModule::IccParam* pIccParam, Icc_CLASS ic, CFX_BinaryBuf* pTransformKey)
-{
- CFX_IccProfileCache* pCache = NULL;
- CFX_ByteStringKey key;
- CFX_ByteString text;
- key << pIccParam->ColorSpace << (pIccParam->dwProfileType | ic << 8);
- FX_BYTE ID[16];
- switch (pIccParam->dwProfileType) {
- case Icc_PARAMTYPE_NONE:
- return NULL;
- case Icc_PARAMTYPE_BUFFER:
- MD5ComputeID(pIccParam->pProfileData, pIccParam->dwProfileSize, ID);
- break;
- case Icc_PARAMTYPE_PARAM:
- FXSYS_memset32(ID, 0, 16);
- switch (pIccParam->ColorSpace) {
- case IccCS_Gray:
- text.Format("%lf", pIccParam->Gamma);
- break;
- default:
- ;
- }
- MD5ComputeID(text.GetBuffer(0), text.GetLength(), ID);
- break;
- default:
- ;
- }
- key.AppendBlock(ID, 16);
- CFX_ByteString ProfileKey(key.GetBuffer(), key.GetSize());
- ASSERT(pTransformKey);
- pTransformKey->AppendBlock(ProfileKey.GetBuffer(0), ProfileKey.GetLength());
- if (!m_MapProfile.Lookup(ProfileKey, (FX_LPVOID&)pCache)) {
- pCache = FX_NEW CFX_IccProfileCache;
- if (pCache == NULL) {
- return NULL;
- }
- switch (pIccParam->dwProfileType) {
- case Icc_PARAMTYPE_BUFFER:
- pCache->m_pProfile = cmsOpenProfileFromMem(pIccParam->pProfileData, pIccParam->dwProfileSize);
- break;
- case Icc_PARAMTYPE_PARAM:
- switch (pIccParam->ColorSpace) {
- case IccCS_Rgb:
- pCache->m_pProfile = cmsCreate_sRGBProfile();
- break;
- case IccCS_Gray:
- pCache->m_pProfile = CreateProfile_Gray(pIccParam->Gamma);
- break;
- default:
- break;
- }
- break;
- default:
- break;
- }
- m_MapProfile.SetAt(ProfileKey, pCache);
- } else {
- pCache->m_dwRate++;
- }
- return pCache->m_pProfile;
-}
-FX_LPVOID CCodec_IccModule::CreateTransform(ICodec_IccModule::IccParam* pInputParam,
- ICodec_IccModule::IccParam* pOutputParam,
- ICodec_IccModule::IccParam* pProofParam,
- FX_DWORD dwIntent, FX_DWORD dwFlag, FX_DWORD dwPrfIntent, FX_DWORD dwPrfFlag)
-{
- CLcmsCmm* pCmm = NULL;
- ASSERT(pInputParam && pOutputParam);
- CFX_ByteStringKey key;
- FX_LPVOID pInputProfile = CreateProfile(pInputParam, Icc_CLASS_INPUT, &key);
- if (pInputProfile == NULL) {
- return NULL;
- }
- FX_LPVOID pOutputProfile = CreateProfile(pOutputParam, Icc_CLASS_OUTPUT, &key);
- if (pOutputProfile == NULL) {
- return NULL;
- }
- FX_DWORD dwInputProfileType = TransferProfileType(pInputProfile, pInputParam->dwFormat);
- FX_DWORD dwOutputProfileType = TransferProfileType(pOutputProfile, pOutputParam->dwFormat);
- if (dwInputProfileType == 0 || dwOutputProfileType == 0) {
- return NULL;
- }
- FX_LPVOID pProofProfile = NULL;
- if (pProofParam) {
- pProofProfile = CreateProfile(pProofParam, Icc_CLASS_PROOF, &key);
- }
- key << dwInputProfileType << dwOutputProfileType << dwIntent << dwFlag << (pProofProfile != NULL) << dwPrfIntent << dwPrfFlag;
- CFX_ByteStringC TransformKey(key.GetBuffer(), key.GetSize());
- CFX_IccTransformCache* pTransformCache;
- if (!m_MapTranform.Lookup(TransformKey, (FX_LPVOID&)pTransformCache)) {
- pCmm = FX_Alloc(CLcmsCmm, 1);
- if (pCmm == NULL) {
- return NULL;
- }
- pCmm->m_nSrcComponents = T_CHANNELS(dwInputProfileType);
- pCmm->m_nDstComponents = T_CHANNELS(dwOutputProfileType);
- pCmm->m_bLab = T_COLORSPACE(pInputParam->dwFormat) == PT_Lab;
- pTransformCache = FX_NEW CFX_IccTransformCache(pCmm);
- if (pTransformCache == NULL) {
- FX_Free(pCmm);
- return NULL;
- }
- if (pProofProfile) {
- pTransformCache->m_pIccTransform = cmsCreateProofingTransform(pInputProfile, dwInputProfileType, pOutputProfile, dwOutputProfileType,
- pProofProfile, dwIntent, dwPrfIntent, dwPrfFlag);
- } else {
- pTransformCache->m_pIccTransform = cmsCreateTransform(pInputProfile, dwInputProfileType, pOutputProfile, dwOutputProfileType,
- dwIntent, dwFlag);
- }
- pCmm->m_hTransform = pTransformCache->m_pIccTransform;
- m_MapTranform.SetAt(TransformKey, pTransformCache);
- } else {
- pTransformCache->m_dwRate++;
- }
- return pTransformCache->m_pCmm;
-}
-CCodec_IccModule::~CCodec_IccModule()
-{
- FX_POSITION pos = m_MapProfile.GetStartPosition();
- CFX_ByteString key;
- CFX_IccProfileCache* pProfileCache;
- while (pos) {
- m_MapProfile.GetNextAssoc(pos, key, (FX_LPVOID&)pProfileCache);
- if (pProfileCache) {
- delete pProfileCache;
- }
- }
- pos = m_MapTranform.GetStartPosition();
- CFX_IccTransformCache* pTransformCache;
- while (pos) {
- m_MapTranform.GetNextAssoc(pos, key, (FX_LPVOID&)pTransformCache);
- if (pTransformCache) {
- delete pTransformCache;
- }
- }
-}
-void* CCodec_IccModule::CreateTransform_sRGB(FX_LPCBYTE pProfileData, unsigned int dwProfileSize, int nComponents, int intent, FX_DWORD dwSrcFormat)
-{
- return IccLib_CreateTransform_sRGB(pProfileData, dwProfileSize, nComponents, intent, dwSrcFormat);
-}
-void* CCodec_IccModule::CreateTransform_CMYK(FX_LPCBYTE pSrcProfileData, unsigned int dwSrcProfileSize, int nSrcComponents,
- FX_LPCBYTE pDstProfileData, unsigned int dwDstProfileSize, int intent,
- FX_DWORD dwSrcFormat , FX_DWORD dwDstFormat)
-{
- return IccLib_CreateTransform(pSrcProfileData, dwSrcProfileSize, nSrcComponents,
- pDstProfileData, dwDstProfileSize, 4, intent, dwSrcFormat, dwDstFormat);
-}
-void CCodec_IccModule::DestroyTransform(void* pTransform)
-{
- IccLib_DestroyTransform(pTransform);
-}
-void CCodec_IccModule::Translate(void* pTransform, FX_FLOAT* pSrcValues, FX_FLOAT* pDestValues)
-{
- IccLib_Translate(pTransform, pSrcValues, pDestValues);
-}
-void CCodec_IccModule::TranslateScanline(void* pTransform, FX_LPBYTE pDest, FX_LPCBYTE pSrc, int pixels)
-{
- IccLib_TranslateImage(pTransform, pDest, pSrc, pixels);
-}
-const FX_BYTE g_CMYKSamples[81 * 81 * 3] = {
- 255, 255, 255, 225, 226, 228, 199, 200, 202, 173, 174, 178, 147, 149, 152, 123, 125, 128, 99, 99, 102, 69, 70, 71, 34, 30, 31,
- 255, 253, 229, 226, 224, 203, 200, 199, 182, 173, 173, 158, 149, 148, 135, 125, 124, 113, 99, 99, 90, 70, 69, 63, 33, 29, 24,
- 255, 251, 204, 228, 223, 182, 201, 198, 163, 174, 172, 142, 150, 147, 122, 125, 123, 101, 99, 98, 80, 70, 68, 54, 32, 28, 16,
- 255, 249, 179, 230, 222, 160, 203, 197, 144, 174, 170, 124, 150, 145, 105, 125, 122, 88, 99, 97, 69, 70, 68, 46, 31, 28, 6,
- 255, 247, 154, 229, 220, 138, 203, 195, 122, 176, 169, 107, 150, 145, 91, 125, 121, 74, 100, 96, 57, 70, 67, 35, 29, 26, 0,
- 255, 246, 128, 231, 217, 114, 205, 194, 101, 176, 167, 88, 150, 144, 75, 125, 120, 60, 100, 96, 44, 70, 66, 24, 28, 26, 0,
- 255, 244, 96, 231, 217, 87, 203, 192, 78, 175, 167, 66, 150, 143, 56, 125, 119, 43, 100, 95, 29, 69, 66, 7, 26, 26, 0,
- 255, 243, 51, 232, 215, 51, 204, 191, 43, 176, 165, 38, 150, 142, 28, 125, 118, 17, 99, 94, 0, 68, 65, 0, 24, 25, 0,
- 255, 241, 0, 231, 215, 0, 203, 190, 0, 176, 164, 0, 150, 141, 0, 126, 117, 0, 99, 93, 0, 68, 65, 0, 24, 25, 0,
- 252, 228, 238, 222, 201, 211, 197, 180, 190, 171, 156, 166, 147, 133, 143, 123, 111, 119, 99, 88, 94, 71, 61, 66, 34, 22, 26,
- 254, 226, 213, 224, 201, 191, 199, 179, 171, 172, 155, 148, 147, 133, 128, 123, 110, 106, 98, 87, 83, 70, 59, 57, 33, 21, 18,
- 254, 224, 191, 224, 199, 172, 200, 177, 153, 173, 154, 133, 147, 132, 115, 123, 109, 94, 98, 86, 74, 70, 59, 49, 32, 21, 9,
- 255, 222, 168, 227, 198, 150, 200, 175, 135, 173, 153, 118, 148, 130, 99, 123, 109, 82, 98, 86, 64, 69, 58, 40, 31, 19, 0,
- 255, 221, 145, 227, 196, 129, 201, 174, 115, 173, 151, 99, 148, 129, 85, 124, 108, 69, 98, 85, 52, 69, 58, 30, 30, 19, 0,
- 255, 219, 121, 227, 195, 109, 201, 174, 97, 174, 150, 83, 148, 129, 70, 124, 107, 55, 98, 84, 40, 69, 58, 19, 28, 18, 0,
- 255, 218, 92, 229, 194, 82, 202, 173, 75, 174, 150, 63, 149, 128, 51, 124, 106, 39, 98, 84, 24, 68, 57, 3, 26, 18, 0,
- 255, 217, 54, 228, 193, 52, 201, 172, 46, 174, 148, 36, 148, 127, 27, 123, 105, 14, 98, 83, 0, 68, 56, 0, 25, 18, 0,
- 255, 216, 0, 229, 192, 2, 202, 171, 4, 173, 148, 0, 148, 126, 0, 124, 105, 0, 98, 83, 0, 68, 56, 0, 24, 17, 0,
- 249, 204, 223, 219, 181, 199, 195, 160, 178, 170, 140, 156, 146, 119, 134, 123, 99, 112, 98, 77, 88, 70, 52, 61, 34, 11, 20,
- 250, 201, 200, 221, 180, 178, 197, 159, 161, 171, 139, 139, 147, 119, 120, 123, 98, 99, 98, 77, 78, 69, 51, 52, 34, 11, 10,
- 252, 201, 180, 223, 179, 162, 197, 159, 144, 170, 138, 125, 146, 117, 107, 122, 97, 89, 98, 76, 69, 69, 50, 44, 32, 11, 2,
- 252, 199, 158, 222, 177, 143, 199, 158, 127, 171, 137, 110, 147, 117, 93, 122, 96, 76, 97, 75, 58, 69, 50, 36, 32, 10, 0,
- 253, 198, 137, 223, 177, 123, 198, 156, 110, 171, 136, 95, 146, 116, 80, 122, 96, 65, 97, 75, 47, 69, 50, 25, 30, 10, 0,
- 254, 197, 115, 225, 175, 104, 198, 156, 92, 172, 135, 79, 147, 115, 66, 123, 95, 52, 98, 74, 37, 69, 49, 15, 29, 10, 0,
- 254, 196, 89, 224, 175, 80, 199, 154, 70, 172, 134, 59, 146, 114, 48, 122, 95, 36, 97, 74, 21, 68, 49, 0, 27, 9, 0,
- 255, 195, 57, 225, 173, 52, 198, 154, 44, 172, 133, 36, 147, 113, 26, 123, 94, 14, 98, 74, 0, 68, 49, 0, 26, 10, 0,
- 254, 194, 15, 225, 172, 12, 198, 153, 7, 172, 132, 3, 146, 113, 0, 123, 93, 0, 98, 73, 0, 68, 49, 0, 26, 9, 0,
- 246, 178, 209, 218, 159, 186, 194, 140, 166, 168, 122, 145, 144, 104, 125, 121, 85, 103, 97, 65, 81, 69, 41, 55, 34, 0, 12,
- 248, 176, 186, 219, 157, 166, 195, 139, 149, 168, 121, 130, 144, 103, 111, 121, 85, 91, 97, 65, 71, 69, 41, 46, 34, 0, 4,
- 249, 175, 168, 220, 156, 150, 196, 139, 135, 169, 121, 116, 144, 103, 100, 122, 84, 83, 98, 65, 63, 70, 41, 39, 33, 0, 0,
- 249, 175, 148, 220, 155, 133, 196, 138, 119, 169, 120, 103, 145, 101, 87, 121, 83, 71, 97, 65, 54, 69, 41, 31, 32, 0, 0,
- 249, 173, 128, 222, 154, 115, 195, 137, 102, 170, 119, 88, 145, 101, 74, 122, 83, 59, 97, 64, 43, 68, 40, 20, 30, 0, 0,
- 250, 172, 108, 221, 154, 98, 195, 136, 86, 170, 118, 73, 145, 100, 61, 122, 82, 48, 97, 63, 32, 69, 40, 11, 28, 0, 0,
- 250, 171, 85, 221, 153, 76, 196, 136, 67, 170, 117, 56, 145, 99, 44, 121, 82, 33, 97, 63, 17, 68, 40, 0, 28, 0, 0,
- 251, 171, 58, 222, 152, 50, 197, 135, 43, 169, 117, 34, 146, 99, 25, 121, 81, 10, 96, 63, 0, 68, 40, 0, 27, 0, 0,
- 250, 170, 26, 222, 151, 19, 196, 134, 13, 169, 116, 4, 145, 99, 0, 122, 81, 0, 97, 63, 0, 67, 40, 0, 26, 0, 0,
- 244, 153, 194, 215, 136, 173, 192, 121, 155, 167, 104, 135, 143, 89, 115, 121, 72, 96, 97, 54, 75, 70, 31, 49, 34, 0, 6,
- 245, 153, 173, 216, 136, 155, 192, 120, 138, 167, 104, 121, 144, 88, 103, 121, 71, 85, 97, 54, 66, 69, 31, 42, 34, 0, 0,
- 246, 152, 157, 217, 135, 140, 193, 120, 126, 167, 103, 109, 143, 88, 92, 121, 72, 76, 97, 54, 58, 69, 31, 35, 33, 0, 0,
- 245, 150, 139, 218, 134, 125, 193, 119, 111, 167, 103, 96, 144, 87, 80, 121, 71, 66, 96, 53, 49, 68, 31, 26, 32, 0, 0,
- 246, 151, 122, 218, 133, 108, 194, 118, 96, 168, 102, 81, 144, 86, 69, 120, 71, 55, 95, 53, 39, 68, 30, 17, 31, 0, 0,
- 248, 150, 103, 218, 133, 91, 193, 118, 81, 168, 102, 69, 143, 86, 56, 120, 70, 43, 96, 53, 28, 68, 31, 6, 29, 0, 0,
- 247, 149, 81, 218, 132, 72, 194, 117, 62, 168, 101, 52, 144, 86, 42, 121, 70, 29, 96, 52, 13, 68, 30, 0, 28, 0, 0,
- 247, 148, 55, 219, 131, 50, 194, 117, 43, 167, 101, 32, 144, 85, 22, 120, 69, 8, 96, 52, 0, 67, 30, 0, 27, 0, 0,
- 247, 147, 29, 218, 131, 24, 194, 116, 20, 168, 100, 11, 144, 85, 0, 120, 69, 0, 96, 52, 0, 67, 30, 0, 26, 0, 0,
- 242, 130, 179, 214, 114, 160, 190, 101, 143, 166, 87, 125, 143, 72, 107, 120, 58, 88, 96, 42, 68, 69, 17, 44, 35, 0, 0,
- 243, 129, 161, 215, 114, 143, 191, 101, 128, 166, 87, 113, 143, 73, 96, 120, 58, 79, 96, 41, 60, 69, 18, 37, 33, 0, 0,
- 243, 129, 146, 216, 114, 130, 192, 101, 117, 166, 87, 101, 143, 72, 86, 121, 58, 69, 96, 42, 52, 69, 18, 29, 31, 0, 0,
- 243, 128, 130, 216, 114, 115, 191, 101, 102, 165, 86, 88, 142, 72, 75, 120, 58, 60, 95, 42, 43, 68, 19, 21, 30, 0, 0,
- 244, 127, 112, 217, 113, 101, 192, 99, 89, 166, 85, 75, 142, 72, 63, 119, 57, 50, 96, 41, 35, 68, 19, 13, 30, 0, 0,
- 244, 127, 96, 216, 112, 86, 191, 99, 75, 166, 86, 64, 143, 72, 52, 120, 57, 40, 95, 41, 24, 67, 20, 1, 29, 0, 0,
- 245, 126, 77, 216, 113, 68, 191, 100, 59, 166, 85, 49, 142, 71, 38, 119, 57, 26, 95, 41, 10, 67, 20, 0, 28, 0, 0,
- 244, 126, 55, 216, 112, 48, 191, 99, 40, 166, 85, 31, 143, 71, 20, 119, 57, 6, 95, 42, 0, 67, 20, 0, 28, 0, 0,
- 245, 126, 33, 217, 112, 26, 192, 99, 22, 166, 84, 11, 142, 70, 0, 119, 57, 0, 95, 41, 0, 66, 20, 0, 27, 0, 0,
- 241, 102, 167, 213, 90, 149, 189, 79, 133, 165, 66, 115, 141, 54, 98, 119, 41, 81, 96, 25, 63, 69, 0, 38, 30, 0, 0,
- 241, 102, 149, 213, 90, 133, 189, 79, 119, 165, 66, 103, 142, 55, 88, 119, 41, 71, 96, 25, 53, 69, 0, 31, 28, 0, 0,
- 241, 102, 135, 214, 90, 121, 190, 79, 108, 165, 66, 92, 141, 55, 78, 119, 42, 63, 96, 26, 46, 69, 0, 24, 28, 0, 0,
- 241, 101, 120, 214, 90, 107, 189, 79, 95, 165, 67, 83, 141, 54, 68, 118, 41, 54, 95, 27, 39, 68, 0, 16, 27, 0, 0,
- 241, 102, 106, 213, 90, 93, 189, 78, 82, 164, 67, 70, 141, 55, 58, 118, 42, 45, 94, 27, 29, 67, 2, 6, 27, 0, 0,
- 242, 101, 90, 214, 89, 79, 190, 79, 69, 166, 67, 59, 141, 55, 47, 118, 41, 35, 95, 27, 19, 67, 3, 0, 26, 0, 0,
- 242, 102, 72, 213, 89, 63, 191, 79, 56, 164, 67, 45, 141, 55, 34, 118, 42, 22, 94, 28, 6, 67, 3, 0, 26, 0, 0,
- 242, 100, 51, 214, 89, 45, 190, 78, 38, 164, 67, 30, 141, 55, 18, 118, 42, 3, 95, 28, 0, 66, 4, 0, 26, 0, 0,
- 243, 100, 33, 214, 90, 27, 190, 78, 22, 165, 67, 13, 141, 55, 0, 118, 43, 0, 94, 29, 0, 66, 5, 0, 26, 0, 0,
- 237, 69, 153, 211, 58, 135, 187, 51, 121, 163, 41, 105, 141, 28, 90, 118, 15, 73, 96, 0, 56, 68, 0, 33, 25, 0, 0,
- 239, 67, 137, 212, 60, 123, 189, 50, 110, 163, 41, 94, 141, 29, 79, 118, 17, 65, 95, 0, 48, 69, 0, 26, 25, 0, 0,
- 240, 69, 124, 211, 60, 111, 188, 50, 98, 163, 42, 85, 141, 31, 72, 118, 18, 57, 94, 0, 41, 68, 0, 19, 25, 0, 0,
- 240, 70, 112, 212, 61, 99, 188, 52, 87, 163, 41, 74, 140, 31, 62, 118, 20, 48, 94, 2, 32, 68, 0, 11, 24, 0, 0,
- 239, 70, 98, 212, 62, 86, 188, 53, 77, 164, 42, 64, 140, 32, 52, 118, 20, 40, 94, 3, 24, 67, 0, 3, 23, 0, 0,
- 239, 71, 85, 212, 61, 74, 187, 53, 65, 163, 44, 54, 140, 34, 43, 118, 22, 30, 95, 3, 14, 67, 0, 0, 23, 0, 0,
- 239, 70, 67, 212, 62, 59, 188, 53, 51, 163, 45, 42, 141, 34, 31, 117, 22, 17, 94, 5, 2, 66, 0, 0, 23, 0, 0,
- 239, 71, 50, 213, 62, 43, 188, 54, 37, 164, 45, 28, 139, 34, 16, 117, 22, 2, 94, 7, 0, 65, 0, 0, 23, 0, 0,
- 240, 71, 34, 212, 63, 29, 189, 54, 24, 163, 46, 15, 139, 36, 2, 117, 25, 0, 94, 8, 0, 66, 0, 0, 23, 0, 0,
- 237, 0, 140, 209, 0, 124, 186, 0, 112, 162, 0, 97, 141, 0, 82, 118, 0, 67, 95, 0, 49, 68, 0, 27, 20, 0, 0,
- 237, 0, 126, 210, 0, 113, 187, 0, 99, 163, 0, 86, 139, 0, 72, 118, 0, 58, 95, 0, 42, 67, 0, 20, 20, 0, 0,
- 237, 1, 114, 209, 1, 102, 187, 0, 90, 163, 0, 78, 139, 0, 64, 118, 0, 50, 95, 0, 35, 67, 0, 13, 20, 0, 0,
- 236, 16, 102, 209, 7, 91, 186, 0, 80, 162, 0, 68, 139, 0, 56, 117, 0, 43, 94, 0, 27, 67, 0, 6, 20, 0, 0,
- 238, 15, 89, 209, 13, 79, 186, 6, 69, 162, 0, 58, 139, 0, 47, 117, 0, 34, 93, 0, 20, 66, 0, 2, 20, 0, 0,
- 237, 20, 78, 210, 12, 68, 187, 4, 59, 163, 0, 49, 139, 0, 38, 116, 0, 26, 94, 0, 11, 66, 0, 0, 20, 0, 0,
- 237, 25, 64, 210, 18, 56, 186, 11, 48, 162, 4, 39, 138, 0, 27, 117, 0, 14, 93, 0, 0, 66, 0, 0, 20, 0, 0,
- 238, 25, 48, 210, 22, 43, 186, 15, 35, 162, 8, 26, 140, 0, 14, 117, 0, 0, 93, 0, 0, 65, 0, 0, 20, 0, 0,
- 238, 28, 35, 210, 21, 30, 187, 15, 24, 162, 8, 16, 139, 1, 2, 117, 0, 0, 93, 0, 0, 65, 0, 0, 22, 0, 0,
- 219, 242, 252, 195, 214, 225, 172, 191, 201, 148, 165, 175, 127, 142, 150, 106, 119, 126, 84, 95, 101, 58, 66, 72, 24, 27, 32,
- 222, 239, 226, 196, 213, 202, 173, 189, 180, 150, 165, 158, 129, 141, 135, 107, 118, 113, 85, 94, 90, 58, 66, 63, 21, 26, 24,
- 223, 237, 203, 198, 211, 182, 175, 188, 163, 152, 164, 141, 129, 140, 121, 107, 117, 101, 85, 93, 80, 58, 64, 54, 21, 26, 18,
- 226, 236, 179, 201, 210, 160, 177, 187, 143, 153, 162, 125, 130, 139, 106, 108, 116, 89, 85, 92, 69, 58, 64, 45, 20, 25, 8,
- 227, 234, 153, 201, 208, 139, 178, 185, 124, 154, 161, 107, 131, 138, 91, 108, 115, 75, 85, 91, 58, 58, 63, 35, 17, 25, 0,
- 229, 233, 130, 203, 207, 116, 178, 184, 104, 154, 160, 90, 131, 137, 76, 109, 114, 62, 85, 90, 46, 58, 63, 25, 16, 24, 0,
- 230, 231, 100, 202, 205, 90, 179, 183, 80, 154, 159, 69, 131, 136, 57, 109, 113, 46, 86, 90, 32, 58, 63, 10, 14, 24, 0,
- 230, 230, 65, 204, 204, 58, 180, 182, 52, 155, 157, 44, 132, 135, 35, 110, 113, 24, 86, 89, 9, 57, 62, 0, 11, 24, 0,
- 232, 230, 19, 204, 204, 19, 180, 181, 17, 155, 157, 10, 131, 134, 2, 109, 112, 0, 85, 89, 0, 57, 62, 0, 10, 23, 0,
- 218, 216, 236, 194, 192, 211, 172, 171, 188, 149, 149, 164, 128, 127, 141, 106, 106, 119, 84, 84, 94, 59, 57, 66, 25, 18, 26,
- 221, 214, 211, 196, 191, 190, 174, 170, 170, 150, 148, 148, 128, 126, 127, 107, 105, 106, 85, 83, 84, 59, 56, 58, 23, 17, 18,
- 222, 213, 190, 197, 189, 170, 175, 169, 153, 151, 147, 133, 129, 126, 113, 108, 105, 94, 85, 82, 74, 59, 56, 49, 22, 17, 11,
- 224, 211, 168, 199, 188, 151, 175, 168, 135, 152, 146, 117, 129, 124, 99, 107, 103, 82, 84, 82, 64, 59, 55, 41, 21, 17, 1,
- 224, 210, 145, 199, 187, 130, 176, 166, 117, 152, 145, 101, 129, 123, 86, 107, 103, 70, 85, 81, 53, 58, 55, 31, 19, 17, 0,
- 227, 208, 123, 200, 186, 110, 177, 165, 98, 153, 143, 84, 130, 122, 70, 108, 102, 57, 85, 80, 41, 58, 54, 20, 18, 16, 0,
- 227, 208, 97, 202, 185, 86, 177, 164, 77, 153, 142, 65, 130, 122, 54, 108, 101, 42, 85, 80, 27, 58, 54, 7, 16, 16, 0,
- 228, 206, 66, 202, 184, 58, 178, 163, 50, 154, 141, 42, 131, 121, 33, 109, 101, 21, 86, 79, 5, 58, 54, 0, 13, 16, 0,
- 228, 206, 29, 202, 183, 25, 178, 163, 20, 154, 141, 15, 131, 121, 5, 108, 100, 0, 85, 79, 0, 58, 53, 0, 13, 16, 0,
- 217, 193, 221, 193, 172, 198, 172, 153, 178, 149, 133, 154, 128, 114, 132, 107, 94, 111, 85, 74, 89, 59, 49, 61, 25, 8, 22,
- 219, 191, 198, 195, 171, 178, 173, 153, 159, 149, 132, 139, 128, 113, 119, 107, 94, 100, 85, 73, 79, 59, 48, 52, 25, 7, 14,
- 221, 191, 180, 196, 170, 160, 174, 152, 144, 150, 132, 125, 129, 113, 107, 107, 93, 89, 85, 73, 69, 59, 48, 45, 23, 7, 4,
- 222, 189, 159, 197, 169, 142, 174, 151, 127, 151, 131, 110, 129, 112, 94, 108, 93, 78, 85, 72, 60, 58, 47, 37, 22, 7, 0,
- 223, 188, 138, 197, 168, 123, 175, 150, 109, 151, 130, 95, 130, 111, 81, 108, 92, 65, 85, 72, 49, 59, 47, 27, 21, 7, 0,
- 224, 187, 118, 198, 167, 105, 176, 149, 93, 152, 129, 79, 130, 110, 68, 108, 91, 54, 85, 71, 38, 59, 47, 17, 18, 7, 0,
- 224, 187, 93, 199, 166, 83, 176, 148, 73, 152, 128, 62, 129, 109, 51, 108, 90, 39, 85, 71, 25, 58, 46, 3, 16, 8, 0,
- 226, 186, 64, 200, 165, 57, 177, 147, 50, 153, 127, 40, 130, 108, 31, 108, 90, 19, 85, 70, 3, 58, 46, 0, 16, 8, 0,
- 227, 185, 35, 200, 165, 30, 176, 146, 25, 152, 127, 18, 130, 108, 7, 108, 89, 0, 85, 70, 0, 57, 46, 0, 14, 8, 0,
- 216, 169, 205, 192, 150, 184, 171, 134, 164, 149, 116, 144, 128, 99, 124, 107, 81, 103, 85, 63, 81, 60, 39, 55, 26, 0, 15,
- 217, 168, 186, 193, 150, 165, 172, 134, 149, 150, 116, 130, 128, 99, 111, 107, 81, 92, 85, 62, 72, 59, 39, 47, 25, 0, 6,
- 219, 168, 168, 194, 149, 150, 173, 133, 135, 150, 116, 117, 128, 98, 99, 107, 80, 82, 86, 62, 63, 59, 38, 39, 24, 0, 0,
- 219, 166, 148, 195, 149, 133, 173, 133, 119, 150, 115, 103, 128, 98, 88, 107, 80, 72, 85, 61, 54, 59, 38, 32, 23, 0, 0,
- 220, 166, 129, 196, 148, 116, 174, 132, 103, 151, 114, 89, 129, 97, 75, 107, 79, 60, 85, 61, 44, 59, 38, 22, 21, 0, 0,
- 222, 164, 110, 197, 147, 99, 175, 131, 87, 151, 113, 75, 129, 96, 63, 107, 79, 49, 85, 61, 33, 58, 38, 12, 19, 0, 0,
- 222, 164, 88, 197, 146, 79, 174, 130, 69, 151, 113, 58, 129, 95, 47, 107, 78, 35, 85, 60, 20, 58, 38, 0, 18, 0, 0,
- 223, 164, 63, 198, 145, 55, 175, 129, 48, 151, 112, 39, 129, 95, 29, 107, 78, 16, 85, 60, 1, 58, 38, 0, 17, 0, 0,
- 223, 163, 36, 198, 145, 32, 174, 129, 26, 151, 111, 17, 129, 95, 7, 107, 78, 0, 84, 60, 0, 57, 37, 0, 15, 0, 0,
- 215, 147, 192, 191, 130, 172, 170, 116, 153, 148, 100, 133, 127, 85, 115, 107, 69, 96, 85, 51, 75, 60, 28, 50, 25, 0, 8,
- 217, 146, 173, 192, 130, 154, 171, 115, 138, 149, 100, 121, 128, 84, 103, 107, 68, 85, 85, 51, 66, 60, 28, 42, 25, 0, 0,
- 217, 145, 157, 193, 129, 140, 173, 115, 125, 149, 100, 109, 128, 84, 92, 107, 68, 76, 85, 51, 58, 59, 28, 35, 23, 0, 0,
- 218, 145, 140, 193, 129, 125, 172, 114, 110, 149, 99, 96, 128, 83, 81, 107, 67, 65, 84, 51, 49, 59, 29, 27, 22, 0, 0,
- 219, 144, 121, 194, 128, 108, 172, 113, 96, 149, 98, 83, 128, 83, 69, 107, 68, 55, 85, 50, 40, 59, 28, 18, 20, 0, 0,
- 220, 143, 104, 195, 128, 93, 173, 114, 82, 150, 98, 69, 127, 82, 58, 107, 67, 45, 85, 50, 30, 59, 28, 7, 19, 0, 0,
- 220, 143, 84, 195, 127, 74, 173, 113, 65, 149, 97, 55, 128, 82, 44, 106, 67, 32, 84, 50, 16, 58, 28, 0, 18, 0, 0,
- 221, 142, 62, 196, 126, 53, 173, 112, 46, 150, 97, 37, 128, 82, 26, 107, 66, 14, 84, 50, 0, 58, 28, 0, 16, 0, 0,
- 222, 142, 38, 196, 126, 34, 174, 112, 27, 150, 96, 17, 128, 82, 6, 106, 66, 0, 84, 50, 0, 57, 29, 0, 16, 0, 0,
- 214, 123, 179, 191, 110, 159, 169, 98, 143, 147, 84, 124, 126, 70, 106, 107, 55, 88, 85, 39, 69, 60, 15, 45, 23, 0, 2,
- 216, 123, 161, 192, 110, 144, 170, 98, 129, 148, 84, 112, 127, 70, 95, 107, 55, 79, 85, 39, 61, 60, 15, 37, 20, 0, 0,
- 217, 122, 145, 192, 110, 130, 170, 97, 116, 149, 84, 101, 127, 70, 85, 106, 55, 70, 85, 39, 53, 59, 16, 30, 19, 0, 0,
- 217, 123, 131, 192, 109, 116, 171, 96, 103, 149, 83, 89, 127, 70, 75, 106, 55, 60, 85, 40, 45, 59, 16, 23, 17, 0, 0,
- 217, 122, 114, 193, 109, 101, 172, 96, 91, 149, 82, 77, 128, 69, 64, 106, 55, 50, 84, 39, 35, 59, 17, 14, 17, 0, 0,
- 218, 122, 98, 194, 108, 87, 171, 96, 77, 149, 82, 65, 127, 69, 52, 106, 55, 40, 84, 40, 25, 59, 18, 3, 15, 0, 0,
- 219, 122, 80, 193, 108, 70, 172, 95, 61, 149, 82, 51, 127, 69, 40, 106, 55, 28, 84, 39, 12, 58, 17, 0, 13, 0, 0,
- 219, 121, 59, 194, 108, 52, 172, 96, 44, 149, 82, 35, 127, 68, 24, 106, 55, 11, 84, 40, 0, 57, 18, 0, 13, 0, 0,
- 219, 121, 40, 193, 108, 33, 172, 95, 26, 149, 81, 19, 128, 68, 6, 106, 54, 0, 84, 39, 0, 57, 18, 0, 13, 0, 0,
- 213, 99, 165, 189, 87, 148, 169, 76, 132, 147, 64, 115, 126, 52, 98, 106, 39, 81, 85, 23, 63, 60, 0, 39, 16, 0, 0,
- 214, 98, 149, 191, 87, 133, 170, 76, 119, 148, 65, 103, 127, 53, 88, 106, 39, 72, 85, 24, 55, 60, 0, 32, 15, 0, 0,
- 215, 99, 136, 191, 87, 121, 170, 77, 108, 148, 65, 93, 126, 53, 79, 106, 40, 64, 85, 24, 47, 59, 0, 25, 14, 0, 0,
- 215, 99, 121, 192, 87, 108, 170, 77, 96, 148, 65, 82, 126, 53, 69, 106, 40, 55, 85, 25, 39, 59, 0, 18, 13, 0, 0,
- 216, 99, 106, 191, 87, 95, 170, 76, 83, 148, 65, 71, 126, 53, 58, 106, 41, 45, 85, 26, 30, 59, 0, 8, 11, 0, 0,
- 216, 98, 91, 192, 88, 82, 170, 77, 71, 148, 65, 60, 127, 53, 48, 105, 41, 36, 83, 26, 21, 58, 1, 2, 11, 0, 0,
- 217, 99, 75, 192, 87, 66, 170, 76, 57, 148, 65, 47, 126, 53, 36, 105, 41, 24, 83, 26, 8, 57, 2, 0, 9, 0, 0,
- 217, 98, 57, 192, 87, 49, 171, 77, 41, 147, 65, 32, 126, 53, 21, 105, 41, 8, 84, 27, 0, 57, 3, 0, 9, 0, 0,
- 217, 98, 40, 193, 87, 34, 171, 76, 27, 148, 65, 19, 126, 53, 6, 105, 41, 0, 83, 27, 0, 57, 4, 0, 9, 0, 0,
- 211, 67, 152, 189, 58, 136, 168, 50, 122, 147, 39, 105, 127, 28, 89, 106, 14, 74, 85, 0, 56, 59, 0, 33, 9, 0, 0,
- 213, 68, 138, 190, 59, 123, 169, 51, 109, 148, 40, 95, 126, 30, 80, 106, 16, 65, 85, 0, 48, 59, 0, 27, 9, 0, 0,
- 214, 69, 125, 190, 59, 111, 168, 51, 99, 148, 41, 86, 126, 31, 72, 106, 18, 58, 85, 0, 41, 59, 0, 20, 7, 0, 0,
- 215, 70, 112, 190, 61, 100, 169, 52, 88, 147, 42, 76, 126, 32, 63, 106, 19, 49, 84, 1, 34, 58, 0, 13, 7, 0, 0,
- 214, 70, 99, 190, 62, 88, 169, 53, 77, 147, 43, 65, 125, 32, 53, 106, 20, 40, 84, 3, 26, 58, 0, 4, 7, 0, 0,
- 214, 71, 86, 190, 61, 75, 169, 53, 65, 146, 43, 54, 126, 33, 44, 105, 21, 31, 83, 4, 17, 57, 0, 0, 7, 0, 0,
- 215, 71, 71, 191, 62, 62, 169, 53, 53, 147, 44, 44, 126, 34, 33, 105, 22, 20, 83, 5, 4, 57, 0, 0, 7, 0, 0,
- 215, 71, 54, 191, 62, 47, 169, 54, 39, 147, 44, 30, 126, 35, 20, 105, 23, 6, 83, 6, 0, 56, 0, 0, 5, 0, 0,
- 215, 71, 41, 191, 63, 34, 170, 54, 27, 147, 45, 17, 126, 35, 6, 105, 23, 0, 83, 8, 0, 56, 0, 0, 5, 0, 0,
- 210, 13, 140, 189, 1, 125, 167, 0, 110, 146, 0, 96, 126, 0, 81, 106, 0, 67, 85, 0, 51, 59, 0, 28, 4, 0, 0,
- 212, 18, 126, 190, 7, 113, 168, 0, 100, 146, 0, 86, 126, 0, 73, 106, 0, 59, 84, 0, 43, 59, 0, 22, 4, 0, 0,
- 212, 21, 115, 190, 13, 103, 168, 3, 91, 146, 0, 78, 125, 0, 65, 105, 0, 52, 84, 0, 36, 58, 0, 16, 4, 0, 0,
- 213, 24, 103, 189, 19, 91, 168, 9, 82, 146, 0, 69, 125, 0, 57, 105, 0, 44, 84, 0, 29, 58, 0, 7, 4, 0, 0,
- 213, 27, 92, 188, 21, 81, 168, 14, 71, 146, 1, 59, 125, 0, 48, 105, 0, 36, 84, 0, 21, 58, 0, 4, 4, 0, 0,
- 213, 30, 80, 189, 22, 69, 168, 17, 61, 146, 5, 50, 125, 0, 39, 104, 0, 27, 83, 0, 12, 57, 0, 0, 4, 0, 0,
- 214, 30, 67, 189, 25, 57, 168, 20, 50, 146, 9, 40, 125, 0, 29, 104, 0, 17, 83, 0, 2, 56, 0, 0, 4, 0, 0,
- 214, 32, 53, 189, 27, 44, 169, 20, 38, 146, 13, 28, 124, 2, 17, 104, 0, 4, 83, 0, 0, 56, 0, 0, 4, 0, 0,
- 214, 33, 41, 190, 27, 33, 168, 23, 27, 146, 13, 18, 125, 3, 5, 105, 0, 0, 83, 0, 0, 56, 0, 0, 4, 0, 0,
- 185, 229, 250, 164, 204, 223, 146, 182, 199, 127, 158, 174, 108, 136, 149, 89, 113, 125, 70, 90, 100, 46, 62, 71, 10, 25, 33,
- 189, 227, 225, 168, 202, 201, 148, 181, 179, 129, 157, 156, 109, 135, 134, 90, 113, 113, 70, 89, 90, 46, 62, 62, 8, 24, 25,
- 192, 226, 202, 170, 202, 182, 151, 179, 162, 130, 156, 141, 110, 133, 121, 91, 112, 101, 71, 89, 80, 46, 61, 54, 7, 24, 19,
- 194, 224, 179, 173, 200, 160, 153, 178, 144, 132, 155, 125, 112, 133, 107, 92, 111, 89, 71, 88, 69, 46, 61, 45, 6, 23, 10,
- 196, 223, 155, 174, 198, 139, 154, 176, 124, 132, 153, 107, 113, 131, 91, 92, 110, 75, 72, 87, 58, 47, 60, 37, 4, 23, 0,
- 198, 221, 131, 175, 197, 117, 155, 175, 105, 133, 152, 91, 113, 130, 76, 92, 109, 63, 72, 86, 47, 46, 60, 26, 3, 23, 0,
- 200, 220, 104, 176, 196, 94, 156, 175, 84, 134, 151, 72, 113, 129, 59, 93, 108, 47, 72, 85, 33, 46, 59, 13, 0, 23, 0,
- 201, 219, 73, 179, 195, 65, 157, 173, 57, 135, 150, 48, 114, 129, 39, 94, 108, 28, 72, 85, 15, 47, 59, 0, 0, 22, 0,
- 203, 219, 42, 178, 195, 37, 157, 173, 32, 135, 150, 26, 114, 128, 16, 94, 107, 6, 73, 85, 0, 46, 58, 0, 0, 22, 0,
- 186, 205, 233, 165, 183, 209, 148, 163, 187, 128, 142, 163, 109, 121, 140, 91, 101, 118, 71, 80, 94, 48, 54, 66, 12, 15, 27,
- 189, 204, 211, 169, 182, 189, 151, 163, 169, 131, 141, 147, 111, 121, 126, 92, 101, 105, 72, 79, 84, 48, 54, 58, 11, 15, 19,
- 192, 202, 190, 171, 181, 170, 152, 161, 152, 131, 141, 133, 112, 120, 113, 93, 100, 94, 72, 79, 74, 48, 53, 50, 10, 15, 11,
- 195, 201, 169, 172, 179, 151, 153, 160, 135, 132, 139, 117, 113, 119, 100, 93, 99, 82, 72, 78, 64, 48, 53, 41, 9, 14, 3,
- 195, 200, 146, 174, 179, 131, 154, 159, 117, 133, 138, 101, 113, 118, 86, 93, 98, 70, 73, 77, 53, 48, 52, 32, 8, 15, 0,
- 198, 199, 125, 175, 177, 111, 155, 158, 100, 133, 137, 85, 113, 117, 71, 93, 97, 57, 72, 77, 42, 47, 52, 22, 5, 14, 0,
- 199, 198, 101, 176, 177, 89, 155, 157, 79, 134, 136, 68, 113, 116, 56, 94, 97, 44, 73, 76, 30, 47, 52, 10, 2, 15, 0,
- 200, 197, 72, 178, 176, 63, 157, 156, 56, 135, 136, 46, 114, 116, 37, 94, 96, 26, 73, 76, 11, 47, 51, 0, 0, 14, 0,
- 201, 197, 45, 177, 175, 38, 156, 155, 31, 135, 135, 25, 114, 115, 17, 94, 96, 5, 73, 75, 0, 46, 51, 0, 0, 14, 0,
- 187, 183, 218, 167, 165, 197, 149, 147, 176, 129, 127, 153, 111, 109, 132, 92, 90, 111, 73, 70, 89, 49, 46, 62, 15, 4, 22,
- 190, 183, 197, 170, 164, 177, 151, 146, 159, 130, 127, 139, 112, 109, 119, 93, 90, 99, 72, 70, 78, 49, 45, 53, 14, 4, 15,
- 192, 182, 179, 171, 163, 161, 153, 145, 144, 132, 126, 125, 113, 108, 107, 93, 89, 88, 73, 70, 69, 49, 45, 45, 13, 5, 6,
- 195, 181, 159, 172, 162, 142, 152, 145, 127, 132, 125, 111, 113, 107, 94, 93, 88, 77, 73, 69, 59, 48, 45, 37, 11, 5, 0,
- 195, 180, 139, 173, 161, 124, 153, 143, 110, 133, 125, 96, 113, 106, 81, 94, 88, 66, 73, 68, 49, 49, 44, 28, 9, 6, 0,
- 196, 179, 118, 174, 160, 106, 154, 142, 94, 133, 124, 81, 113, 105, 68, 94, 87, 54, 73, 68, 39, 48, 44, 18, 5, 5, 0,
- 197, 178, 96, 176, 159, 86, 155, 141, 75, 134, 123, 64, 114, 105, 53, 94, 87, 40, 73, 68, 26, 48, 44, 5, 2, 6, 0,
- 199, 178, 70, 176, 158, 62, 156, 141, 54, 134, 122, 44, 114, 104, 35, 94, 86, 23, 73, 67, 8, 47, 44, 0, 2, 6, 0,
- 199, 177, 45, 178, 158, 40, 156, 140, 32, 135, 122, 26, 114, 104, 16, 94, 86, 4, 73, 67, 0, 47, 44, 0, 0, 7, 0,
- 188, 161, 204, 168, 144, 183, 149, 129, 164, 130, 112, 144, 112, 95, 123, 93, 78, 103, 74, 60, 81, 50, 36, 56, 16, 0, 16,
- 190, 160, 185, 170, 144, 165, 151, 128, 148, 132, 111, 130, 112, 95, 110, 93, 78, 92, 74, 59, 72, 50, 36, 48, 16, 0, 8,
- 192, 160, 167, 171, 143, 150, 153, 128, 134, 132, 111, 117, 112, 94, 100, 94, 77, 82, 74, 59, 63, 50, 36, 40, 14, 0, 0,
- 193, 159, 149, 172, 143, 134, 153, 127, 119, 133, 110, 103, 113, 94, 87, 93, 77, 72, 73, 59, 54, 50, 36, 32, 12, 0, 0,
- 195, 159, 131, 173, 142, 117, 153, 127, 104, 132, 110, 90, 113, 93, 76, 93, 76, 61, 74, 59, 45, 49, 36, 23, 9, 0, 0,
- 196, 158, 113, 174, 141, 101, 155, 126, 89, 133, 109, 76, 113, 93, 64, 94, 76, 51, 74, 58, 35, 49, 36, 14, 6, 0, 0,
- 197, 157, 92, 174, 141, 80, 154, 125, 71, 134, 108, 60, 114, 92, 50, 94, 75, 37, 73, 58, 22, 48, 36, 1, 5, 0, 0,
- 197, 157, 68, 175, 140, 59, 155, 124, 51, 134, 108, 41, 113, 91, 32, 94, 75, 21, 73, 57, 5, 48, 35, 0, 5, 0, 0,
- 198, 156, 46, 176, 140, 40, 155, 124, 32, 134, 107, 24, 114, 91, 14, 94, 75, 2, 73, 57, 0, 48, 36, 0, 3, 0, 0,
- 189, 140, 191, 168, 126, 172, 150, 112, 154, 131, 97, 134, 112, 82, 115, 94, 66, 96, 74, 49, 75, 51, 25, 50, 12, 0, 10,
- 191, 139, 173, 170, 125, 154, 152, 111, 138, 132, 96, 121, 113, 81, 103, 94, 66, 85, 74, 48, 66, 50, 26, 42, 12, 0, 1,
- 192, 139, 157, 171, 125, 140, 152, 111, 125, 132, 96, 109, 113, 81, 92, 94, 65, 76, 74, 48, 58, 50, 26, 35, 9, 0, 0,
- 193, 139, 140, 172, 124, 125, 153, 110, 112, 133, 95, 96, 113, 80, 82, 94, 65, 66, 74, 49, 50, 50, 26, 28, 7, 0, 0,
- 194, 138, 123, 172, 123, 109, 153, 110, 97, 133, 95, 84, 113, 80, 70, 94, 65, 56, 74, 48, 40, 50, 26, 20, 6, 0, 0,
- 194, 138, 105, 173, 123, 94, 153, 109, 83, 133, 94, 70, 112, 79, 59, 94, 64, 46, 74, 48, 31, 50, 26, 9, 4, 0, 0,
- 196, 138, 87, 174, 122, 77, 153, 109, 67, 133, 93, 56, 113, 79, 46, 94, 64, 34, 73, 48, 18, 49, 27, 0, 4, 0, 0,
- 196, 137, 65, 174, 122, 57, 154, 108, 49, 133, 93, 39, 113, 79, 29, 94, 64, 18, 74, 48, 3, 49, 27, 0, 2, 0, 0,
- 197, 137, 47, 175, 122, 40, 155, 108, 32, 133, 93, 23, 114, 79, 14, 94, 64, 1, 73, 48, 0, 48, 27, 0, 2, 0, 0,
- 189, 119, 177, 168, 106, 159, 150, 94, 142, 131, 81, 124, 113, 67, 107, 94, 53, 89, 74, 37, 69, 51, 11, 45, 6, 0, 3,
- 191, 119, 161, 170, 106, 144, 152, 94, 129, 132, 81, 112, 113, 67, 96, 94, 53, 79, 74, 37, 61, 51, 13, 38, 6, 0, 0,
- 192, 119, 146, 170, 106, 131, 152, 94, 117, 132, 80, 101, 112, 67, 85, 94, 53, 70, 74, 37, 53, 50, 14, 31, 4, 0, 0,
- 192, 119, 131, 171, 106, 117, 153, 94, 105, 132, 80, 89, 113, 67, 75, 94, 54, 61, 74, 38, 45, 51, 14, 23, 3, 0, 0,
- 193, 118, 114, 171, 106, 102, 153, 93, 90, 132, 80, 78, 113, 67, 65, 94, 53, 52, 74, 37, 36, 50, 15, 16, 1, 0, 0,
- 194, 118, 99, 172, 105, 89, 153, 93, 78, 132, 80, 66, 113, 67, 54, 94, 53, 42, 74, 38, 27, 50, 16, 5, 1, 0, 0,
- 194, 118, 82, 173, 105, 72, 153, 93, 63, 132, 79, 53, 113, 67, 42, 94, 53, 30, 74, 38, 15, 49, 16, 0, 0, 0, 0,
- 195, 117, 63, 173, 105, 55, 154, 93, 47, 133, 79, 37, 113, 66, 27, 94, 53, 15, 73, 38, 0, 48, 16, 0, 0, 0, 0,
- 195, 117, 46, 173, 104, 39, 154, 92, 32, 133, 79, 22, 113, 66, 13, 94, 53, 0, 73, 38, 0, 48, 17, 0, 0, 0, 0,
- 189, 96, 166, 168, 85, 147, 150, 74, 132, 131, 62, 115, 113, 51, 99, 94, 38, 82, 74, 21, 63, 51, 0, 40, 1, 0, 0,
- 190, 96, 150, 170, 85, 133, 152, 75, 119, 132, 63, 104, 113, 51, 88, 94, 38, 72, 75, 22, 55, 51, 0, 33, 1, 0, 0,
- 192, 96, 137, 170, 85, 121, 152, 74, 108, 132, 64, 94, 113, 52, 79, 94, 39, 64, 74, 23, 48, 50, 0, 26, 0, 0, 0,
- 192, 96, 122, 171, 86, 109, 152, 75, 96, 132, 63, 83, 113, 52, 69, 94, 39, 56, 74, 24, 41, 50, 0, 19, 0, 0, 0,
- 193, 96, 107, 171, 85, 96, 152, 75, 84, 132, 64, 72, 113, 52, 60, 94, 39, 47, 74, 24, 32, 50, 1, 10, 0, 0, 0,
- 193, 96, 93, 172, 85, 82, 152, 75, 72, 133, 63, 61, 113, 51, 49, 94, 39, 37, 73, 25, 23, 49, 2, 2, 0, 0, 0,
- 194, 96, 78, 172, 85, 68, 152, 75, 59, 132, 63, 49, 113, 52, 39, 94, 40, 26, 73, 25, 11, 48, 3, 0, 0, 0, 0,
- 194, 96, 60, 173, 85, 52, 153, 75, 44, 132, 64, 35, 112, 52, 25, 94, 40, 12, 73, 26, 0, 48, 4, 0, 0, 0, 0,
- 195, 96, 46, 173, 85, 38, 154, 74, 31, 133, 63, 22, 113, 52, 11, 93, 40, 0, 73, 26, 0, 47, 5, 0, 0, 0, 0,
- 188, 67, 153, 168, 58, 137, 151, 49, 122, 131, 39, 106, 113, 28, 90, 94, 13, 75, 75, 0, 57, 51, 0, 35, 0, 0, 0,
- 190, 68, 138, 170, 59, 123, 152, 50, 110, 132, 41, 96, 113, 29, 80, 94, 16, 66, 75, 0, 49, 50, 0, 27, 0, 0, 0,
- 191, 69, 126, 170, 59, 112, 151, 52, 100, 132, 42, 86, 113, 30, 73, 95, 17, 58, 75, 0, 42, 50, 0, 21, 0, 0, 0,
- 192, 70, 113, 170, 61, 100, 151, 52, 89, 132, 42, 77, 113, 31, 64, 94, 19, 50, 74, 1, 35, 50, 0, 14, 0, 0, 0,
- 192, 70, 100, 170, 62, 89, 151, 53, 77, 131, 43, 66, 112, 32, 54, 94, 20, 42, 74, 2, 27, 49, 0, 5, 0, 0, 0,
- 192, 71, 87, 171, 61, 77, 152, 53, 67, 131, 44, 57, 112, 33, 45, 94, 21, 33, 74, 4, 19, 49, 0, 1, 0, 0, 0,
- 193, 71, 74, 171, 62, 64, 152, 53, 55, 132, 44, 45, 113, 34, 34, 94, 22, 23, 73, 5, 7, 48, 0, 0, 0, 0, 0,
- 193, 70, 58, 172, 62, 50, 152, 54, 42, 132, 44, 32, 112, 35, 22, 93, 23, 10, 73, 6, 0, 47, 0, 0, 0, 0, 0,
- 193, 70, 45, 172, 62, 38, 153, 54, 31, 132, 44, 21, 112, 35, 9, 94, 23, 0, 73, 7, 0, 47, 0, 0, 0, 0, 0,
- 189, 26, 141, 169, 15, 126, 150, 2, 112, 131, 0, 97, 113, 0, 82, 94, 0, 67, 75, 0, 51, 50, 0, 29, 0, 0, 0,
- 190, 28, 128, 170, 18, 114, 151, 8, 101, 132, 0, 88, 113, 0, 74, 94, 0, 60, 75, 0, 44, 50, 0, 23, 0, 0, 0,
- 191, 30, 117, 170, 23, 104, 152, 11, 92, 132, 1, 79, 113, 0, 67, 95, 0, 53, 75, 0, 37, 50, 0, 17, 0, 0, 0,
- 191, 33, 105, 170, 26, 93, 151, 18, 83, 132, 6, 70, 112, 0, 58, 94, 0, 45, 75, 0, 30, 49, 0, 8, 0, 0, 0,
- 191, 34, 93, 170, 27, 82, 151, 20, 72, 131, 8, 61, 112, 0, 49, 94, 0, 38, 74, 0, 23, 49, 0, 4, 0, 0, 0,
- 191, 36, 82, 170, 29, 71, 151, 22, 63, 131, 11, 52, 112, 0, 41, 93, 0, 29, 74, 0, 14, 48, 0, 1, 0, 0, 0,
- 191, 38, 69, 170, 31, 60, 151, 24, 51, 131, 14, 41, 112, 1, 31, 93, 0, 19, 73, 0, 3, 48, 0, 0, 0, 0, 0,
- 192, 37, 56, 171, 31, 47, 152, 25, 40, 131, 17, 30, 112, 4, 19, 93, 0, 7, 73, 0, 0, 47, 0, 0, 0, 0, 0,
- 192, 38, 45, 171, 33, 36, 152, 26, 30, 131, 18, 21, 111, 7, 9, 93, 0, 0, 73, 0, 0, 47, 0, 0, 0, 0, 0,
- 149, 218, 248, 133, 194, 222, 119, 173, 198, 102, 151, 173, 86, 130, 148, 70, 108, 125, 53, 85, 100, 32, 59, 71, 0, 22, 33,
- 154, 216, 223, 137, 193, 200, 122, 172, 178, 106, 150, 156, 89, 128, 133, 73, 107, 112, 54, 85, 89, 31, 59, 63, 0, 22, 26,
- 159, 215, 202, 141, 192, 181, 126, 171, 161, 108, 149, 141, 90, 128, 121, 74, 107, 100, 55, 85, 80, 32, 58, 55, 0, 22, 19,
- 161, 213, 179, 144, 190, 160, 126, 170, 143, 109, 148, 125, 92, 127, 107, 74, 106, 89, 56, 84, 69, 32, 58, 46, 0, 21, 11,
- 163, 211, 156, 144, 189, 139, 129, 168, 125, 110, 147, 108, 93, 126, 92, 75, 105, 76, 57, 83, 58, 33, 58, 37, 0, 21, 1,
- 167, 211, 133, 147, 188, 120, 130, 167, 105, 110, 145, 92, 93, 125, 78, 76, 104, 64, 58, 83, 48, 33, 57, 27, 0, 21, 0,
- 169, 210, 108, 149, 187, 96, 131, 166, 86, 112, 144, 74, 94, 124, 62, 77, 103, 49, 58, 82, 35, 33, 57, 15, 0, 21, 0,
- 170, 209, 80, 151, 186, 71, 133, 165, 62, 114, 143, 52, 95, 123, 42, 77, 103, 32, 58, 81, 18, 33, 56, 0, 0, 21, 0,
- 173, 208, 55, 152, 186, 49, 134, 165, 41, 114, 143, 34, 95, 122, 25, 77, 102, 14, 58, 81, 0, 33, 56, 0, 0, 21, 0,
- 154, 195, 232, 137, 174, 207, 122, 156, 185, 105, 136, 163, 89, 116, 140, 73, 97, 117, 56, 76, 94, 35, 51, 66, 0, 13, 28,
- 158, 194, 209, 141, 174, 187, 125, 155, 167, 109, 135, 146, 91, 116, 125, 75, 96, 105, 57, 75, 83, 35, 50, 57, 0, 12, 21,
- 161, 193, 189, 144, 173, 169, 128, 154, 151, 110, 134, 132, 93, 115, 113, 77, 95, 94, 58, 75, 74, 35, 50, 50, 0, 12, 13,
- 164, 192, 168, 145, 171, 151, 129, 153, 134, 111, 133, 117, 94, 114, 100, 76, 95, 82, 58, 75, 64, 36, 50, 42, 0, 12, 5,
- 165, 191, 147, 147, 170, 131, 130, 152, 117, 113, 132, 102, 95, 113, 86, 77, 94, 71, 58, 74, 54, 35, 50, 33, 0, 13, 0,
- 167, 189, 126, 148, 169, 113, 132, 151, 100, 113, 131, 86, 96, 112, 73, 77, 93, 59, 59, 73, 43, 35, 49, 23, 0, 12, 0,
- 170, 189, 104, 150, 168, 91, 133, 150, 81, 114, 130, 69, 96, 111, 57, 78, 92, 46, 59, 73, 31, 35, 49, 11, 0, 13, 0,
- 171, 188, 78, 152, 168, 68, 134, 149, 60, 115, 130, 50, 96, 111, 41, 78, 92, 29, 60, 73, 15, 35, 49, 0, 0, 12, 0,
- 173, 187, 55, 153, 167, 47, 134, 149, 39, 115, 129, 33, 97, 110, 24, 79, 92, 13, 60, 72, 0, 35, 48, 0, 0, 12, 0,
- 157, 175, 217, 139, 157, 196, 125, 141, 175, 109, 122, 153, 92, 104, 132, 76, 86, 110, 59, 67, 88, 37, 43, 61, 1, 1, 23,
- 161, 174, 196, 144, 156, 176, 127, 140, 158, 110, 121, 137, 94, 104, 118, 77, 85, 98, 59, 67, 78, 37, 43, 53, 0, 2, 16,
- 163, 174, 178, 146, 156, 160, 130, 139, 143, 112, 121, 124, 95, 103, 106, 78, 85, 88, 60, 66, 69, 37, 42, 46, 0, 2, 7,
- 166, 173, 159, 147, 154, 142, 130, 138, 127, 113, 120, 111, 96, 103, 95, 78, 84, 77, 60, 66, 59, 37, 43, 37, 0, 2, 0,
- 166, 172, 139, 148, 154, 125, 131, 137, 112, 113, 120, 96, 96, 102, 81, 78, 84, 66, 60, 65, 50, 37, 42, 29, 0, 3, 0,
- 167, 171, 120, 149, 153, 107, 133, 137, 95, 114, 118, 81, 97, 101, 69, 79, 84, 56, 60, 65, 40, 37, 42, 19, 0, 3, 0,
- 170, 170, 99, 151, 152, 87, 134, 136, 77, 115, 118, 66, 97, 101, 55, 79, 83, 42, 61, 65, 28, 37, 42, 7, 0, 3, 0,
- 172, 170, 75, 152, 151, 65, 134, 135, 57, 115, 117, 48, 97, 100, 38, 79, 83, 27, 61, 64, 12, 36, 42, 0, 0, 3, 0,
- 172, 169, 55, 154, 151, 46, 135, 134, 40, 116, 116, 32, 97, 99, 21, 80, 82, 10, 61, 64, 0, 36, 41, 0, 0, 3, 0,
- 160, 154, 203, 143, 139, 182, 127, 124, 164, 111, 107, 143, 95, 91, 122, 78, 75, 103, 60, 57, 81, 39, 33, 56, 1, 0, 18,
- 163, 154, 184, 146, 138, 165, 130, 123, 148, 113, 107, 129, 96, 90, 110, 79, 74, 92, 61, 56, 72, 39, 34, 48, 2, 0, 9,
- 165, 154, 167, 147, 137, 149, 131, 122, 134, 114, 106, 117, 96, 90, 100, 79, 74, 82, 61, 56, 64, 39, 33, 40, 2, 0, 1,
- 166, 153, 150, 149, 137, 133, 132, 122, 119, 114, 106, 104, 97, 90, 88, 79, 74, 72, 61, 56, 55, 39, 34, 33, 0, 0, 0,
- 168, 152, 132, 149, 136, 117, 132, 121, 104, 114, 105, 90, 97, 89, 76, 79, 73, 62, 61, 56, 46, 38, 34, 25, 0, 0, 0,
- 169, 151, 114, 150, 135, 101, 133, 121, 90, 114, 104, 77, 97, 89, 65, 80, 73, 51, 61, 56, 36, 38, 34, 16, 0, 0, 0,
- 170, 150, 94, 151, 135, 83, 134, 120, 73, 115, 104, 62, 98, 88, 51, 80, 72, 39, 61, 56, 24, 38, 34, 3, 0, 0, 0,
- 172, 150, 72, 153, 134, 63, 135, 119, 55, 115, 103, 45, 98, 88, 36, 80, 72, 24, 61, 55, 9, 38, 34, 0, 0, 0, 0,
- 172, 150, 54, 153, 134, 47, 135, 119, 38, 116, 103, 30, 98, 87, 21, 80, 72, 8, 62, 55, 0, 37, 34, 0, 0, 0, 0,
- 162, 134, 190, 145, 120, 171, 129, 108, 153, 113, 93, 134, 97, 78, 115, 80, 63, 96, 62, 46, 75, 41, 23, 51, 0, 0, 11,
- 165, 134, 173, 147, 120, 154, 131, 107, 138, 114, 92, 120, 97, 78, 103, 80, 63, 85, 62, 46, 66, 40, 23, 43, 0, 0, 2,
- 166, 134, 157, 148, 120, 140, 132, 106, 125, 114, 92, 109, 97, 77, 93, 81, 63, 77, 62, 46, 58, 40, 24, 36, 0, 0, 0,
- 168, 133, 140, 149, 119, 125, 132, 106, 112, 115, 92, 97, 98, 77, 82, 81, 62, 67, 62, 46, 50, 40, 24, 29, 0, 0, 0,
- 168, 133, 123, 150, 119, 110, 133, 106, 97, 115, 91, 84, 98, 77, 70, 81, 62, 57, 62, 46, 41, 40, 24, 20, 0, 0, 0,
- 169, 132, 107, 150, 118, 94, 133, 105, 84, 115, 91, 72, 98, 76, 60, 80, 62, 47, 62, 46, 32, 39, 25, 11, 0, 0, 0,
- 171, 132, 89, 152, 118, 79, 135, 105, 69, 115, 90, 58, 98, 76, 47, 80, 62, 36, 62, 46, 21, 39, 25, 0, 0, 0, 0,
- 171, 132, 69, 153, 117, 60, 135, 104, 52, 116, 90, 42, 98, 76, 33, 81, 61, 21, 62, 46, 6, 38, 25, 0, 0, 0, 0,
- 172, 132, 54, 153, 118, 45, 135, 104, 38, 116, 90, 28, 98, 76, 18, 81, 61, 6, 62, 46, 0, 38, 25, 0, 0, 0, 0,
- 164, 115, 177, 146, 103, 159, 130, 91, 143, 114, 78, 125, 97, 65, 107, 81, 51, 89, 63, 34, 69, 41, 9, 46, 0, 0, 4,
- 166, 115, 161, 148, 103, 144, 132, 91, 129, 115, 78, 112, 98, 65, 96, 81, 51, 79, 63, 35, 61, 41, 11, 38, 0, 0, 0,
- 167, 115, 146, 150, 102, 131, 132, 91, 117, 115, 78, 101, 98, 65, 86, 81, 51, 71, 63, 35, 54, 41, 12, 32, 0, 0, 0,
- 168, 114, 132, 150, 103, 118, 133, 91, 105, 116, 78, 91, 98, 64, 76, 82, 51, 61, 63, 36, 46, 41, 13, 24, 0, 0, 0,
- 169, 114, 116, 150, 102, 103, 134, 90, 91, 116, 78, 79, 98, 65, 66, 81, 51, 53, 63, 36, 37, 40, 14, 17, 0, 0, 0,
- 169, 114, 101, 151, 101, 89, 134, 90, 79, 116, 77, 67, 98, 64, 56, 81, 51, 44, 63, 36, 29, 40, 15, 7, 0, 0, 0,
- 170, 114, 85, 152, 101, 75, 135, 90, 65, 116, 77, 54, 98, 64, 44, 81, 51, 32, 63, 36, 17, 39, 15, 0, 0, 0, 0,
- 172, 113, 66, 152, 101, 58, 135, 89, 49, 116, 77, 40, 99, 64, 30, 81, 51, 18, 62, 36, 3, 38, 16, 0, 0, 0, 0,
- 171, 113, 51, 153, 101, 44, 136, 89, 36, 116, 77, 28, 99, 64, 18, 81, 51, 5, 62, 36, 0, 38, 16, 0, 0, 0, 0,
- 165, 94, 166, 147, 82, 147, 132, 72, 132, 115, 61, 115, 98, 49, 99, 82, 36, 82, 64, 19, 64, 42, 0, 41, 0, 0, 0,
- 167, 93, 150, 150, 83, 134, 133, 73, 120, 116, 62, 104, 99, 49, 88, 82, 36, 72, 64, 20, 55, 41, 0, 33, 0, 0, 0,
- 169, 93, 137, 150, 83, 122, 134, 73, 109, 116, 61, 94, 99, 50, 80, 82, 37, 65, 64, 21, 49, 41, 0, 27, 0, 0, 0,
- 169, 94, 123, 150, 83, 110, 133, 73, 97, 116, 61, 83, 99, 50, 70, 82, 38, 57, 63, 23, 42, 41, 0, 20, 0, 0, 0,
- 169, 94, 109, 150, 84, 97, 134, 73, 85, 116, 62, 73, 99, 51, 61, 81, 38, 48, 63, 23, 33, 41, 1, 11, 0, 0, 0,
- 170, 94, 96, 150, 83, 84, 134, 73, 74, 116, 61, 62, 99, 50, 51, 82, 38, 39, 64, 23, 24, 40, 3, 4, 0, 0, 0,
- 171, 93, 79, 152, 82, 70, 135, 73, 61, 116, 62, 51, 98, 51, 40, 81, 38, 28, 63, 24, 14, 39, 4, 0, 0, 0, 0,
- 171, 94, 64, 152, 83, 55, 135, 73, 47, 116, 62, 37, 98, 50, 27, 81, 38, 15, 63, 24, 1, 39, 4, 0, 0, 0, 0,
- 172, 93, 51, 153, 82, 42, 135, 73, 35, 117, 62, 26, 99, 51, 16, 81, 39, 3, 63, 25, 0, 38, 5, 0, 0, 0, 0,
- 166, 68, 153, 148, 59, 137, 133, 49, 121, 115, 39, 106, 99, 28, 91, 82, 13, 75, 65, 0, 58, 42, 0, 36, 0, 0, 0,
- 168, 68, 139, 150, 59, 124, 134, 50, 110, 116, 40, 96, 99, 30, 81, 82, 16, 66, 64, 0, 50, 41, 0, 29, 0, 0, 0,
- 169, 69, 126, 150, 59, 113, 134, 51, 101, 117, 42, 87, 100, 30, 73, 82, 17, 59, 65, 0, 43, 41, 0, 23, 0, 0, 0,
- 169, 70, 115, 150, 61, 102, 134, 52, 89, 116, 42, 77, 99, 32, 65, 82, 19, 52, 64, 0, 36, 41, 0, 15, 0, 0, 0,
- 169, 70, 101, 150, 61, 90, 134, 52, 79, 116, 43, 68, 99, 32, 55, 82, 21, 43, 64, 2, 28, 41, 0, 6, 0, 0, 0,
- 170, 70, 89, 151, 62, 79, 134, 53, 69, 116, 44, 58, 99, 33, 46, 81, 21, 34, 64, 3, 20, 41, 0, 2, 0, 0, 0,
- 170, 71, 76, 152, 62, 66, 134, 53, 57, 116, 43, 46, 99, 33, 36, 82, 22, 24, 64, 5, 10, 40, 0, 0, 0, 0, 0,
- 171, 70, 61, 152, 62, 52, 135, 53, 44, 116, 44, 35, 99, 34, 24, 82, 22, 12, 63, 6, 0, 39, 0, 0, 0, 0, 0,
- 171, 71, 49, 153, 62, 41, 135, 54, 33, 117, 45, 25, 98, 34, 13, 81, 23, 0, 63, 7, 0, 39, 0, 0, 0, 0, 0,
- 167, 33, 142, 149, 24, 127, 134, 10, 113, 116, 0, 97, 100, 0, 83, 83, 0, 68, 65, 0, 52, 40, 0, 30, 0, 0, 0,
- 169, 33, 129, 150, 26, 115, 134, 17, 102, 116, 3, 89, 100, 0, 75, 83, 0, 60, 65, 0, 45, 40, 0, 24, 0, 0, 0,
- 169, 36, 118, 151, 27, 104, 134, 19, 93, 116, 7, 80, 100, 0, 67, 83, 0, 54, 65, 0, 38, 41, 0, 17, 0, 0, 0,
- 169, 39, 107, 150, 30, 94, 134, 22, 84, 116, 11, 71, 99, 0, 59, 83, 0, 46, 64, 0, 31, 40, 0, 9, 0, 0, 0,
- 169, 39, 95, 151, 31, 83, 134, 24, 73, 116, 15, 62, 100, 1, 51, 83, 0, 38, 64, 0, 24, 40, 0, 5, 0, 0, 0,
- 169, 41, 83, 151, 33, 73, 134, 26, 64, 117, 17, 54, 99, 4, 42, 82, 0, 30, 64, 0, 16, 40, 0, 1, 0, 0, 0,
- 170, 42, 71, 152, 34, 62, 134, 28, 53, 117, 19, 44, 99, 6, 33, 82, 0, 21, 63, 0, 4, 39, 0, 0, 0, 0, 0,
- 171, 42, 59, 152, 35, 50, 134, 29, 42, 117, 21, 32, 99, 9, 22, 82, 0, 9, 63, 0, 0, 38, 0, 0, 0, 0, 0,
- 172, 42, 48, 152, 36, 40, 135, 29, 32, 117, 21, 23, 99, 10, 12, 82, 0, 0, 63, 0, 0, 38, 0, 0, 0, 0, 0,
- 107, 207, 246, 96, 185, 220, 86, 165, 196, 73, 144, 171, 60, 123, 147, 46, 103, 125, 32, 82, 100, 9, 56, 71, 0, 20, 33,
- 115, 206, 221, 104, 184, 198, 92, 164, 178, 78, 143, 154, 64, 123, 133, 51, 102, 111, 34, 81, 89, 10, 56, 63, 0, 20, 27,
- 122, 204, 200, 108, 183, 180, 95, 163, 161, 82, 142, 140, 68, 122, 120, 54, 102, 101, 36, 81, 79, 11, 56, 55, 0, 20, 20,
- 125, 203, 179, 111, 181, 160, 97, 162, 143, 85, 141, 124, 70, 121, 107, 55, 101, 89, 38, 80, 69, 14, 55, 46, 0, 19, 10,
- 128, 202, 156, 113, 180, 140, 102, 161, 125, 87, 140, 108, 71, 120, 92, 56, 100, 76, 39, 79, 59, 14, 55, 38, 0, 20, 3,
- 132, 200, 135, 117, 179, 121, 103, 159, 106, 88, 139, 93, 73, 119, 79, 57, 100, 65, 41, 79, 49, 15, 54, 28, 0, 19, 0,
- 134, 200, 111, 119, 178, 98, 105, 158, 87, 89, 138, 76, 74, 118, 64, 58, 99, 51, 41, 78, 37, 16, 54, 17, 0, 19, 0,
- 137, 199, 85, 122, 177, 75, 108, 158, 66, 91, 137, 56, 75, 118, 46, 59, 98, 35, 42, 78, 22, 16, 54, 3, 0, 19, 0,
- 140, 198, 62, 125, 177, 55, 109, 158, 47, 92, 137, 40, 76, 117, 32, 59, 98, 21, 42, 78, 6, 16, 54, 0, 0, 18, 0,
- 118, 186, 231, 106, 167, 206, 93, 149, 184, 81, 130, 161, 67, 111, 139, 54, 92, 117, 39, 72, 93, 17, 48, 66, 0, 10, 29,
- 123, 185, 207, 110, 166, 186, 98, 148, 167, 85, 129, 145, 71, 111, 125, 56, 92, 104, 40, 72, 83, 18, 48, 57, 0, 10, 22,
- 128, 184, 188, 113, 165, 168, 102, 147, 151, 88, 128, 131, 73, 110, 113, 58, 91, 94, 42, 71, 74, 19, 48, 50, 0, 9, 15,
- 131, 183, 168, 116, 164, 151, 104, 146, 134, 89, 127, 117, 73, 109, 100, 58, 90, 83, 42, 71, 65, 20, 48, 42, 0, 9, 5,
- 134, 182, 148, 120, 163, 131, 105, 145, 118, 90, 126, 102, 75, 108, 86, 59, 90, 72, 43, 71, 55, 19, 47, 34, 0, 9, 0,
- 136, 181, 128, 122, 162, 115, 107, 144, 102, 92, 125, 87, 76, 107, 74, 61, 89, 60, 44, 70, 45, 20, 47, 24, 0, 8, 0,
- 139, 180, 106, 124, 161, 95, 109, 144, 83, 93, 124, 71, 77, 107, 60, 61, 89, 47, 44, 70, 33, 20, 47, 13, 0, 8, 0,
- 142, 179, 82, 125, 160, 72, 111, 143, 63, 94, 124, 54, 77, 106, 44, 61, 88, 32, 44, 69, 18, 20, 46, 0, 0, 8, 0,
- 143, 179, 62, 127, 160, 54, 111, 142, 47, 94, 124, 39, 78, 106, 29, 62, 88, 18, 45, 69, 3, 20, 46, 0, 0, 8, 0,
- 124, 167, 216, 112, 150, 194, 99, 134, 174, 87, 117, 153, 73, 100, 131, 58, 82, 110, 43, 64, 88, 23, 40, 61, 0, 0, 24,
- 129, 166, 195, 116, 150, 175, 103, 134, 158, 89, 116, 137, 75, 99, 118, 60, 82, 98, 44, 63, 78, 23, 40, 53, 0, 0, 17,
- 132, 166, 177, 119, 149, 160, 106, 133, 143, 90, 115, 124, 76, 99, 107, 61, 81, 88, 45, 63, 69, 24, 40, 46, 0, 0, 9,
- 136, 166, 159, 121, 148, 143, 107, 132, 126, 92, 115, 111, 77, 98, 94, 62, 81, 78, 46, 63, 60, 23, 40, 38, 0, 0, 0,
- 138, 164, 140, 122, 147, 125, 108, 131, 111, 93, 114, 97, 79, 98, 82, 63, 80, 67, 46, 62, 50, 24, 40, 29, 0, 0, 0,
- 139, 163, 122, 124, 146, 109, 110, 131, 96, 94, 114, 83, 79, 97, 70, 63, 81, 57, 46, 62, 41, 24, 40, 21, 0, 0, 0,
- 141, 163, 101, 126, 145, 90, 111, 130, 79, 95, 113, 68, 79, 96, 56, 63, 80, 44, 47, 62, 30, 23, 40, 10, 0, 0, 0,
- 144, 162, 79, 127, 145, 70, 112, 129, 60, 95, 112, 51, 79, 96, 41, 64, 79, 30, 47, 61, 15, 23, 40, 0, 0, 0, 0,
- 145, 162, 60, 129, 145, 52, 113, 129, 46, 96, 112, 37, 79, 95, 27, 64, 79, 16, 47, 61, 1, 23, 39, 0, 0, 0, 0,
- 131, 147, 202, 117, 133, 181, 105, 119, 162, 91, 103, 142, 77, 87, 122, 62, 71, 102, 47, 54, 81, 26, 31, 56, 0, 0, 18,
- 135, 147, 183, 120, 132, 164, 107, 118, 147, 93, 102, 128, 78, 87, 110, 63, 71, 92, 47, 54, 72, 26, 31, 48, 0, 0, 10,
- 138, 147, 166, 123, 131, 149, 108, 118, 133, 94, 102, 116, 79, 86, 100, 64, 71, 82, 48, 54, 64, 27, 31, 41, 0, 0, 2,
- 139, 146, 149, 124, 131, 134, 111, 117, 119, 94, 101, 103, 79, 86, 88, 64, 70, 72, 48, 53, 55, 27, 31, 33, 0, 0, 0,
- 141, 146, 132, 125, 131, 117, 111, 117, 104, 95, 101, 91, 80, 86, 77, 65, 70, 62, 48, 53, 46, 26, 31, 25, 0, 0, 0,
- 143, 145, 115, 126, 130, 101, 112, 116, 90, 96, 100, 78, 80, 85, 65, 65, 70, 52, 49, 53, 37, 27, 32, 17, 0, 0, 0,
- 144, 144, 96, 128, 129, 85, 112, 115, 75, 97, 100, 64, 81, 85, 52, 65, 69, 40, 49, 53, 26, 26, 31, 5, 0, 0, 0,
- 146, 144, 76, 129, 129, 67, 114, 115, 58, 97, 99, 48, 82, 84, 38, 66, 69, 27, 49, 53, 12, 26, 32, 0, 0, 0, 0,
- 146, 144, 59, 130, 128, 51, 114, 114, 43, 98, 99, 35, 82, 84, 25, 66, 69, 13, 49, 53, 0, 26, 32, 0, 0, 0, 0,
- 135, 129, 189, 122, 115, 170, 107, 103, 152, 94, 89, 133, 79, 74, 114, 64, 60, 95, 49, 43, 75, 29, 20, 51, 0, 0, 12,
- 138, 129, 171, 124, 115, 153, 110, 103, 138, 95, 89, 120, 81, 74, 103, 66, 60, 86, 50, 44, 67, 28, 21, 43, 0, 0, 3,
- 140, 129, 156, 125, 115, 140, 111, 103, 125, 96, 89, 109, 81, 74, 93, 67, 60, 76, 50, 44, 59, 29, 22, 36, 0, 0, 0,
- 142, 128, 140, 127, 115, 125, 112, 102, 112, 97, 88, 97, 82, 74, 83, 67, 60, 67, 50, 44, 51, 29, 22, 29, 0, 0, 0,
- 142, 128, 124, 127, 114, 111, 113, 102, 98, 98, 88, 85, 82, 74, 71, 66, 60, 58, 50, 44, 42, 29, 22, 21, 0, 0, 0,
- 144, 127, 108, 128, 114, 96, 113, 101, 85, 98, 87, 73, 82, 74, 61, 67, 60, 48, 50, 44, 33, 28, 23, 12, 0, 0, 0,
- 145, 127, 91, 129, 114, 81, 115, 101, 71, 98, 87, 60, 82, 73, 48, 67, 59, 37, 50, 44, 22, 29, 23, 1, 0, 0, 0,
- 147, 127, 73, 130, 113, 63, 115, 101, 55, 98, 87, 45, 83, 73, 35, 67, 59, 24, 50, 44, 10, 28, 24, 0, 0, 0, 0,
- 147, 127, 58, 131, 113, 49, 115, 100, 42, 99, 86, 33, 83, 73, 23, 67, 59, 10, 50, 44, 0, 27, 24, 0, 0, 0, 0,
- 138, 110, 177, 124, 99, 159, 110, 88, 142, 96, 75, 125, 82, 62, 107, 66, 48, 89, 51, 33, 70, 30, 8, 46, 0, 0, 5,
- 142, 111, 160, 127, 99, 144, 113, 88, 130, 98, 75, 112, 82, 62, 96, 68, 49, 80, 51, 33, 61, 30, 10, 39, 0, 0, 0,
- 143, 111, 146, 128, 99, 131, 114, 88, 118, 98, 75, 101, 83, 62, 86, 68, 49, 71, 52, 33, 54, 30, 11, 32, 0, 0, 0,
- 144, 111, 132, 128, 99, 118, 113, 88, 106, 99, 75, 91, 83, 62, 77, 68, 49, 62, 52, 34, 46, 30, 12, 25, 0, 0, 0,
- 144, 111, 117, 129, 98, 104, 114, 87, 92, 99, 75, 80, 83, 62, 67, 68, 49, 53, 51, 34, 38, 30, 13, 18, 0, 0, 0,
- 145, 111, 103, 130, 98, 91, 114, 87, 80, 99, 75, 68, 83, 63, 57, 68, 50, 45, 51, 34, 30, 30, 14, 8, 0, 0, 0,
- 146, 110, 87, 131, 98, 76, 115, 87, 67, 99, 75, 56, 83, 62, 45, 68, 49, 33, 52, 35, 19, 30, 15, 2, 0, 0, 0,
- 148, 110, 70, 131, 98, 60, 116, 86, 52, 99, 74, 43, 84, 62, 33, 69, 49, 21, 52, 35, 6, 29, 15, 0, 0, 0, 0,
- 148, 110, 56, 132, 97, 48, 117, 87, 40, 100, 75, 31, 84, 62, 22, 68, 49, 9, 51, 35, 0, 28, 15, 0, 0, 0, 0,
- 142, 91, 166, 126, 80, 148, 113, 71, 132, 98, 59, 115, 83, 47, 99, 69, 34, 82, 53, 17, 64, 32, 0, 41, 0, 0, 0,
- 143, 91, 150, 128, 81, 135, 114, 71, 120, 99, 60, 104, 85, 48, 89, 69, 35, 73, 53, 19, 56, 32, 0, 34, 0, 0, 0,
- 145, 91, 137, 129, 81, 122, 115, 71, 109, 100, 60, 94, 85, 48, 81, 69, 35, 65, 53, 19, 49, 32, 0, 28, 0, 0, 0,
- 146, 92, 124, 130, 81, 110, 115, 71, 98, 100, 60, 84, 85, 49, 71, 69, 36, 57, 53, 21, 42, 32, 0, 21, 0, 0, 0,
- 147, 91, 110, 130, 81, 97, 115, 71, 86, 100, 60, 74, 84, 49, 62, 69, 36, 48, 53, 22, 34, 32, 0, 13, 0, 0, 0,
- 147, 92, 97, 130, 81, 85, 116, 72, 76, 100, 60, 63, 85, 49, 52, 69, 37, 40, 53, 22, 26, 31, 1, 5, 0, 0, 0,
- 148, 92, 82, 131, 81, 71, 116, 71, 62, 100, 60, 53, 84, 49, 42, 69, 37, 30, 52, 23, 16, 31, 2, 0, 0, 0, 0,
- 148, 91, 67, 132, 81, 57, 117, 71, 49, 100, 60, 39, 84, 49, 30, 69, 37, 18, 52, 23, 2, 30, 2, 0, 0, 0, 0,
- 149, 91, 54, 132, 81, 46, 118, 71, 39, 101, 60, 29, 85, 49, 19, 69, 37, 6, 52, 23, 0, 29, 3, 0, 0, 0, 0,
- 143, 68, 153, 128, 59, 137, 115, 49, 122, 99, 39, 107, 85, 28, 91, 70, 13, 75, 54, 0, 58, 32, 0, 36, 0, 0, 0,
- 146, 68, 140, 131, 59, 125, 116, 51, 111, 100, 40, 97, 85, 29, 82, 70, 15, 67, 54, 0, 50, 32, 0, 29, 0, 0, 0,
- 147, 68, 127, 131, 59, 114, 117, 51, 102, 101, 41, 88, 86, 30, 74, 70, 17, 60, 54, 0, 44, 32, 0, 23, 0, 0, 0,
- 147, 70, 115, 131, 60, 103, 116, 52, 91, 100, 42, 78, 85, 32, 65, 70, 19, 53, 54, 1, 38, 32, 0, 17, 0, 0, 0,
- 147, 70, 103, 131, 61, 91, 117, 53, 81, 101, 43, 69, 86, 32, 57, 70, 20, 44, 54, 2, 30, 32, 0, 7, 0, 0, 0,
- 148, 70, 91, 132, 61, 80, 117, 52, 70, 101, 43, 59, 85, 33, 48, 70, 21, 36, 53, 4, 22, 32, 0, 3, 0, 0, 0,
- 148, 70, 78, 132, 62, 68, 117, 53, 58, 101, 43, 48, 85, 34, 38, 70, 22, 26, 53, 6, 12, 31, 0, 0, 0, 0, 0,
- 149, 71, 64, 132, 62, 54, 118, 54, 46, 101, 44, 37, 85, 34, 27, 69, 23, 15, 53, 7, 1, 30, 0, 0, 0, 0, 0,
- 150, 70, 53, 134, 61, 44, 118, 54, 36, 101, 44, 28, 85, 35, 17, 69, 23, 4, 52, 8, 0, 30, 0, 0, 0, 0, 0,
- 145, 38, 143, 130, 29, 128, 117, 18, 114, 101, 3, 98, 87, 0, 84, 72, 0, 69, 54, 0, 53, 30, 0, 31, 0, 0, 0,
- 147, 38, 130, 132, 30, 116, 117, 22, 103, 101, 8, 89, 87, 0, 76, 72, 0, 62, 54, 0, 46, 30, 0, 24, 0, 0, 0,
- 148, 40, 119, 132, 31, 105, 117, 23, 94, 101, 13, 81, 87, 0, 68, 71, 0, 55, 54, 0, 39, 30, 0, 18, 0, 0, 0,
- 148, 42, 108, 132, 34, 96, 117, 25, 85, 102, 15, 73, 86, 2, 60, 71, 0, 47, 54, 0, 33, 30, 0, 11, 0, 0, 0,
- 148, 43, 96, 133, 35, 85, 117, 28, 75, 102, 18, 64, 87, 5, 52, 71, 0, 40, 54, 0, 25, 30, 0, 5, 0, 0, 0,
- 149, 44, 85, 132, 36, 75, 118, 29, 66, 101, 20, 55, 86, 8, 44, 70, 0, 32, 53, 0, 18, 29, 0, 2, 0, 0, 0,
- 149, 45, 74, 133, 37, 64, 118, 31, 55, 102, 21, 45, 85, 10, 34, 70, 0, 22, 53, 0, 6, 28, 0, 0, 0, 0, 0,
- 150, 46, 61, 133, 39, 52, 118, 31, 44, 102, 23, 34, 85, 12, 24, 70, 0, 12, 52, 0, 0, 28, 0, 0, 0, 0, 0,
- 150, 46, 51, 133, 40, 42, 119, 32, 35, 102, 24, 25, 85, 13, 14, 70, 0, 1, 52, 0, 0, 27, 0, 0, 0, 0, 0,
- 53, 198, 244, 49, 177, 218, 41, 158, 195, 32, 138, 171, 22, 118, 147, 11, 98, 124, 0, 78, 100, 0, 54, 71, 0, 18, 34,
- 69, 196, 220, 64, 175, 196, 54, 157, 176, 45, 137, 154, 32, 117, 133, 19, 98, 111, 0, 78, 89, 0, 53, 63, 0, 17, 27,
- 80, 195, 198, 69, 175, 179, 60, 156, 159, 50, 136, 139, 38, 116, 120, 25, 98, 101, 4, 77, 80, 0, 53, 55, 0, 17, 21,
- 84, 193, 177, 75, 173, 159, 64, 155, 142, 55, 135, 124, 41, 116, 107, 27, 97, 89, 9, 76, 70, 0, 53, 47, 0, 17, 11,
- 89, 193, 157, 79, 172, 140, 70, 154, 125, 57, 134, 109, 44, 115, 92, 32, 96, 76, 13, 76, 59, 0, 52, 39, 0, 16, 4,
- 94, 191, 135, 85, 171, 121, 72, 152, 108, 60, 133, 94, 47, 114, 80, 32, 95, 65, 15, 76, 49, 0, 52, 29, 0, 16, 0,
- 98, 190, 113, 87, 170, 100, 76, 152, 89, 62, 132, 77, 49, 113, 65, 35, 95, 52, 18, 75, 37, 0, 52, 18, 0, 15, 0,
- 103, 190, 89, 90, 169, 80, 78, 151, 70, 64, 132, 60, 51, 113, 49, 37, 94, 38, 20, 75, 25, 0, 52, 5, 0, 15, 0,
- 106, 189, 69, 93, 169, 61, 80, 151, 53, 66, 131, 45, 52, 113, 36, 37, 94, 25, 19, 74, 11, 0, 51, 0, 0, 15, 0,
- 76, 178, 229, 68, 159, 205, 61, 142, 183, 50, 124, 160, 40, 106, 138, 28, 88, 116, 12, 69, 93, 0, 45, 66, 0, 5, 29,
- 86, 177, 207, 78, 158, 184, 67, 142, 166, 56, 123, 145, 45, 106, 125, 31, 88, 105, 16, 69, 83, 0, 45, 58, 0, 6, 22,
- 93, 176, 187, 81, 158, 168, 71, 141, 150, 61, 123, 131, 47, 105, 113, 35, 87, 94, 20, 68, 74, 0, 45, 51, 0, 5, 16,
- 98, 175, 168, 84, 157, 150, 75, 140, 134, 63, 122, 117, 50, 104, 100, 37, 87, 83, 21, 68, 65, 0, 45, 42, 0, 4, 7,
- 100, 174, 149, 89, 155, 132, 76, 139, 117, 65, 121, 102, 53, 104, 87, 39, 86, 72, 23, 67, 55, 0, 45, 34, 0, 3, 0,
- 103, 173, 130, 92, 155, 115, 80, 138, 102, 68, 120, 88, 53, 103, 75, 40, 86, 61, 24, 67, 45, 0, 45, 25, 0, 3, 0,
- 107, 172, 108, 95, 154, 96, 82, 137, 85, 70, 119, 73, 55, 102, 61, 42, 85, 49, 25, 67, 34, 0, 45, 14, 0, 3, 0,
- 110, 172, 86, 97, 153, 76, 85, 137, 67, 70, 119, 57, 56, 102, 46, 42, 84, 35, 26, 66, 21, 0, 44, 1, 0, 3, 0,
- 112, 171, 67, 98, 153, 59, 86, 137, 52, 71, 119, 44, 58, 102, 34, 44, 85, 22, 27, 66, 7, 0, 44, 0, 0, 3, 0,
- 90, 160, 215, 81, 144, 193, 70, 129, 173, 61, 112, 151, 49, 95, 131, 37, 79, 109, 22, 61, 87, 0, 38, 61, 0, 0, 25,
- 96, 160, 194, 86, 143, 174, 75, 128, 157, 65, 112, 137, 53, 95, 117, 40, 78, 98, 25, 60, 78, 0, 38, 53, 0, 0, 17,
- 100, 159, 177, 89, 143, 159, 79, 128, 143, 67, 111, 124, 55, 95, 107, 42, 78, 89, 27, 60, 70, 2, 38, 46, 0, 0, 9,
- 104, 158, 159, 92, 142, 143, 81, 127, 127, 69, 110, 110, 56, 94, 94, 43, 78, 78, 28, 60, 60, 2, 38, 38, 0, 0, 1,
- 107, 157, 140, 94, 141, 125, 82, 126, 112, 71, 110, 97, 59, 94, 82, 45, 77, 67, 29, 59, 51, 4, 37, 30, 0, 0, 0,
- 110, 156, 122, 97, 140, 109, 85, 125, 97, 72, 109, 83, 58, 93, 71, 45, 77, 57, 29, 60, 42, 5, 38, 22, 0, 0, 0,
- 111, 156, 103, 99, 139, 91, 87, 125, 81, 73, 108, 69, 60, 92, 58, 46, 77, 45, 30, 59, 31, 5, 38, 12, 0, 0, 0,
- 115, 156, 82, 101, 140, 73, 88, 124, 63, 74, 108, 53, 60, 92, 44, 46, 76, 32, 31, 59, 18, 6, 37, 0, 0, 0, 0,
- 116, 155, 65, 102, 139, 58, 89, 124, 49, 75, 108, 41, 61, 92, 32, 48, 76, 21, 31, 59, 6, 5, 37, 0, 0, 0, 0,
- 100, 141, 201, 88, 127, 181, 79, 114, 162, 69, 99, 142, 57, 83, 122, 44, 68, 102, 30, 51, 81, 7, 28, 56, 0, 0, 19,
- 105, 141, 182, 94, 127, 163, 83, 114, 146, 71, 98, 128, 59, 83, 110, 46, 68, 91, 31, 51, 72, 10, 28, 48, 0, 0, 11,
- 108, 141, 166, 96, 127, 149, 85, 113, 133, 73, 98, 116, 60, 83, 99, 46, 68, 82, 32, 51, 64, 11, 29, 41, 0, 0, 2,
- 111, 141, 149, 98, 126, 134, 88, 112, 119, 74, 97, 103, 61, 83, 88, 48, 67, 72, 33, 51, 56, 11, 29, 34, 0, 0, 0,
- 112, 140, 132, 100, 125, 118, 89, 112, 105, 75, 97, 91, 62, 82, 77, 49, 68, 62, 33, 51, 47, 12, 29, 26, 0, 0, 0,
- 115, 140, 116, 102, 125, 103, 90, 111, 91, 76, 96, 78, 62, 82, 65, 49, 67, 52, 34, 51, 38, 13, 29, 18, 0, 0, 0,
- 117, 139, 97, 103, 124, 87, 91, 111, 77, 78, 96, 65, 63, 81, 54, 49, 67, 41, 34, 51, 27, 12, 29, 7, 0, 0, 0,
- 119, 138, 78, 105, 124, 69, 92, 110, 60, 78, 95, 50, 65, 81, 40, 50, 67, 29, 34, 51, 15, 13, 30, 0, 0, 0, 0,
- 120, 138, 64, 106, 124, 54, 93, 110, 47, 78, 95, 38, 65, 81, 29, 50, 66, 17, 34, 50, 2, 13, 29, 0, 0, 0, 0,
- 107, 124, 189, 96, 111, 169, 85, 99, 152, 73, 85, 132, 61, 71, 114, 48, 57, 95, 34, 41, 75, 14, 18, 51, 0, 0, 13,
- 111, 124, 171, 100, 111, 153, 88, 99, 137, 75, 85, 120, 63, 72, 103, 50, 58, 85, 36, 41, 66, 15, 19, 43, 0, 0, 4,
- 113, 124, 156, 101, 111, 139, 90, 99, 125, 77, 85, 109, 64, 71, 93, 51, 57, 77, 36, 42, 59, 17, 20, 37, 0, 0, 0,
- 115, 124, 140, 103, 111, 125, 90, 99, 112, 78, 85, 97, 64, 71, 82, 52, 57, 67, 36, 42, 50, 16, 20, 30, 0, 0, 0,
- 117, 123, 125, 104, 110, 111, 92, 98, 99, 79, 85, 86, 65, 71, 72, 51, 58, 59, 37, 42, 43, 17, 21, 22, 0, 0, 0,
- 118, 123, 110, 105, 110, 97, 93, 98, 86, 78, 84, 74, 66, 71, 62, 52, 57, 49, 37, 42, 34, 17, 22, 14, 0, 0, 0,
- 120, 123, 93, 106, 109, 82, 94, 97, 72, 80, 84, 61, 66, 71, 50, 52, 57, 38, 37, 42, 24, 17, 22, 2, 0, 0, 0,
- 121, 122, 75, 108, 109, 66, 95, 97, 58, 80, 84, 48, 66, 71, 37, 52, 57, 26, 37, 42, 12, 16, 22, 0, 0, 0, 0,
- 122, 123, 62, 108, 109, 52, 95, 97, 45, 81, 84, 36, 67, 70, 26, 52, 57, 14, 37, 42, 0, 15, 22, 0, 0, 0, 0,
- 113, 107, 177, 102, 96, 159, 89, 85, 141, 78, 72, 124, 65, 60, 107, 52, 46, 89, 37, 30, 70, 18, 5, 46, 0, 0, 6,
- 116, 107, 160, 104, 96, 144, 92, 85, 129, 80, 72, 112, 67, 60, 96, 53, 47, 80, 38, 31, 62, 19, 7, 39, 0, 0, 0,
- 118, 107, 147, 105, 96, 131, 93, 85, 118, 80, 72, 101, 67, 60, 87, 54, 47, 71, 39, 31, 54, 19, 8, 32, 0, 0, 0,
- 119, 107, 132, 106, 96, 118, 94, 85, 106, 81, 73, 91, 67, 60, 77, 54, 47, 63, 39, 32, 47, 20, 9, 25, 0, 0, 0,
- 119, 107, 118, 106, 95, 105, 94, 85, 93, 81, 72, 80, 68, 60, 68, 54, 47, 54, 39, 32, 39, 20, 11, 18, 0, 0, 0,
- 121, 107, 104, 107, 96, 92, 95, 84, 80, 81, 72, 69, 68, 61, 58, 54, 48, 46, 39, 33, 31, 20, 12, 9, 0, 0, 0,
- 123, 107, 88, 108, 95, 77, 96, 84, 68, 82, 72, 57, 68, 60, 46, 54, 47, 35, 39, 33, 20, 19, 13, 2, 0, 0, 0,
- 123, 106, 72, 110, 95, 63, 96, 84, 54, 82, 72, 45, 69, 60, 35, 55, 48, 23, 39, 33, 9, 18, 14, 0, 0, 0, 0,
- 125, 106, 60, 110, 94, 50, 98, 84, 42, 83, 72, 34, 69, 60, 25, 55, 48, 12, 39, 33, 0, 17, 13, 0, 0, 0, 0,
- 118, 89, 165, 105, 79, 148, 93, 69, 132, 81, 57, 115, 68, 45, 99, 55, 32, 82, 41, 15, 64, 21, 0, 41, 0, 0, 0,
- 120, 89, 150, 107, 79, 135, 96, 69, 121, 82, 58, 105, 70, 46, 89, 56, 34, 73, 41, 17, 56, 21, 0, 34, 0, 0, 0,
- 121, 89, 137, 108, 79, 123, 96, 69, 109, 82, 58, 95, 70, 47, 81, 56, 34, 66, 41, 18, 49, 21, 0, 28, 0, 0, 0,
- 122, 90, 124, 109, 79, 110, 96, 69, 99, 83, 58, 85, 70, 47, 72, 56, 35, 58, 41, 19, 42, 21, 0, 22, 0, 0, 0,
- 123, 90, 111, 110, 79, 98, 97, 69, 87, 83, 59, 75, 70, 47, 63, 56, 35, 50, 41, 20, 35, 21, 0, 14, 0, 0, 0,
- 123, 90, 98, 110, 79, 87, 97, 70, 76, 84, 58, 64, 70, 48, 53, 56, 36, 41, 40, 21, 26, 21, 0, 5, 0, 0, 0,
- 125, 89, 84, 111, 79, 73, 97, 69, 64, 84, 59, 54, 70, 48, 43, 56, 36, 31, 40, 22, 17, 20, 1, 1, 0, 0, 0,
- 125, 89, 69, 112, 79, 60, 98, 70, 51, 84, 59, 42, 70, 48, 32, 56, 36, 20, 41, 22, 5, 19, 2, 0, 0, 0, 0,
- 126, 89, 57, 112, 79, 49, 99, 70, 41, 84, 59, 32, 70, 48, 22, 56, 36, 10, 40, 22, 0, 18, 2, 0, 0, 0, 0,
- 121, 67, 154, 108, 58, 138, 97, 50, 124, 84, 39, 107, 71, 28, 92, 58, 12, 76, 43, 0, 59, 20, 0, 37, 0, 0, 0,
- 124, 68, 140, 111, 59, 126, 98, 50, 112, 84, 40, 98, 71, 29, 83, 58, 15, 67, 42, 0, 51, 20, 0, 30, 0, 0, 0,
- 124, 68, 129, 111, 59, 114, 99, 51, 102, 86, 41, 88, 71, 30, 75, 58, 17, 60, 42, 0, 45, 20, 0, 24, 0, 0, 0,
- 125, 70, 116, 111, 60, 103, 99, 51, 92, 85, 41, 79, 71, 31, 66, 58, 19, 53, 42, 3, 38, 20, 0, 17, 0, 0, 0,
- 125, 70, 104, 111, 61, 93, 99, 52, 81, 85, 43, 69, 72, 32, 58, 58, 20, 45, 42, 4, 31, 20, 0, 8, 0, 0, 0,
- 126, 70, 92, 111, 61, 81, 99, 52, 71, 85, 42, 60, 71, 33, 49, 57, 21, 37, 42, 6, 23, 20, 0, 3, 0, 0, 0,
- 126, 70, 79, 112, 61, 70, 99, 53, 60, 85, 43, 50, 71, 33, 39, 57, 22, 28, 41, 7, 13, 19, 0, 0, 0, 0, 0,
- 127, 71, 66, 113, 62, 56, 100, 53, 48, 86, 44, 39, 71, 34, 29, 57, 23, 18, 41, 8, 2, 18, 0, 0, 0, 0, 0,
- 128, 70, 55, 114, 62, 46, 100, 54, 39, 86, 44, 30, 71, 34, 20, 57, 23, 7, 41, 9, 0, 18, 0, 0, 0, 0, 0,
- 124, 41, 145, 111, 32, 128, 99, 23, 114, 86, 10, 100, 73, 0, 85, 60, 0, 71, 43, 0, 54, 17, 0, 32, 0, 0, 0,
- 126, 42, 131, 113, 33, 117, 100, 25, 104, 86, 14, 90, 73, 0, 77, 60, 0, 63, 44, 0, 47, 18, 0, 25, 0, 0, 0,
- 127, 43, 120, 113, 34, 106, 101, 26, 95, 86, 17, 82, 73, 2, 69, 59, 0, 56, 43, 0, 41, 18, 0, 19, 0, 0, 0,
- 127, 45, 109, 113, 37, 97, 101, 28, 85, 86, 19, 74, 73, 5, 61, 59, 0, 48, 43, 0, 34, 19, 0, 11, 0, 0, 0,
- 127, 46, 98, 114, 38, 86, 100, 30, 76, 87, 21, 65, 73, 9, 54, 59, 0, 41, 43, 0, 26, 18, 0, 5, 0, 0, 0,
- 127, 47, 87, 113, 39, 76, 101, 31, 67, 86, 22, 56, 72, 11, 45, 59, 0, 33, 43, 0, 19, 18, 0, 2, 0, 0, 0,
- 128, 48, 75, 114, 39, 65, 101, 33, 56, 86, 23, 46, 72, 12, 36, 58, 0, 24, 42, 0, 9, 17, 0, 0, 0, 0, 0,
- 129, 48, 63, 114, 41, 54, 102, 33, 46, 87, 24, 36, 72, 14, 26, 58, 1, 14, 42, 0, 2, 16, 0, 0, 0, 0, 0,
- 128, 48, 53, 114, 41, 44, 102, 34, 37, 87, 25, 27, 72, 15, 17, 58, 1, 3, 41, 0, 0, 15, 0, 0, 0, 0, 0,
- 0, 189, 242, 0, 169, 217, 0, 151, 194, 0, 132, 170, 0, 113, 147, 0, 94, 123, 0, 74, 99, 0, 51, 71, 0, 15, 34,
- 1, 187, 219, 1, 167, 195, 0, 150, 175, 0, 131, 153, 0, 113, 132, 0, 94, 111, 0, 74, 89, 0, 50, 63, 0, 13, 28,
- 1, 186, 198, 1, 167, 178, 0, 149, 158, 0, 130, 139, 0, 111, 119, 0, 93, 100, 0, 74, 80, 0, 50, 55, 0, 13, 22,
- 1, 185, 176, 1, 165, 159, 1, 148, 142, 0, 129, 123, 0, 111, 106, 0, 93, 89, 0, 73, 70, 0, 50, 47, 0, 13, 13,
- 1, 184, 157, 1, 164, 141, 1, 147, 125, 0, 128, 110, 0, 110, 93, 0, 92, 77, 0, 73, 60, 0, 50, 39, 0, 12, 5,
- 25, 182, 137, 25, 163, 122, 17, 146, 109, 0, 128, 96, 0, 110, 81, 0, 92, 66, 0, 73, 51, 0, 50, 30, 0, 10, 0,
- 42, 181, 114, 35, 163, 102, 30, 145, 91, 14, 127, 80, 0, 109, 67, 0, 91, 53, 0, 72, 39, 0, 50, 19, 0, 10, 0,
- 52, 181, 92, 43, 162, 83, 32, 145, 73, 19, 126, 63, 0, 108, 52, 0, 90, 40, 0, 72, 27, 0, 50, 7, 0, 10, 0,
- 57, 181, 74, 48, 162, 66, 37, 144, 57, 24, 126, 49, 7, 108, 40, 0, 90, 29, 0, 72, 15, 0, 49, 0, 0, 10, 0,
- 1, 170, 227, 1, 152, 203, 0, 136, 182, 0, 119, 159, 0, 101, 137, 0, 84, 115, 0, 65, 92, 0, 43, 66, 0, 1, 29,
- 1, 169, 206, 1, 151, 184, 1, 136, 165, 0, 118, 144, 0, 102, 125, 0, 84, 105, 0, 65, 83, 0, 43, 58, 0, 0, 22,
- 29, 168, 186, 21, 151, 167, 14, 135, 150, 4, 118, 131, 0, 101, 112, 0, 83, 94, 0, 65, 75, 0, 43, 51, 0, 0, 16,
- 41, 167, 167, 33, 150, 150, 31, 134, 134, 19, 117, 117, 4, 100, 100, 0, 83, 83, 0, 65, 65, 0, 42, 43, 0, 0, 8,
- 48, 167, 149, 41, 149, 133, 33, 133, 118, 25, 116, 103, 13, 99, 88, 0, 83, 73, 0, 65, 56, 0, 42, 35, 0, 0, 0,
- 58, 165, 130, 49, 148, 115, 42, 132, 103, 31, 115, 89, 18, 99, 75, 0, 82, 61, 0, 64, 46, 0, 42, 26, 0, 0, 0,
- 62, 164, 110, 55, 147, 97, 45, 132, 87, 35, 115, 75, 22, 98, 63, 5, 82, 50, 0, 64, 36, 0, 42, 16, 0, 0, 0,
- 69, 164, 89, 60, 147, 78, 50, 131, 70, 37, 114, 59, 26, 98, 49, 10, 81, 37, 0, 64, 24, 0, 42, 4, 0, 0, 0,
- 71, 164, 71, 63, 147, 63, 53, 131, 55, 40, 114, 47, 28, 98, 38, 13, 81, 26, 0, 64, 12, 0, 42, 0, 0, 0, 0,
- 28, 153, 214, 24, 138, 193, 23, 123, 171, 16, 107, 150, 0, 91, 130, 0, 75, 109, 0, 58, 87, 0, 35, 61, 0, 0, 25,
- 48, 153, 194, 41, 138, 174, 34, 123, 156, 27, 107, 136, 16, 91, 117, 1, 75, 98, 0, 57, 78, 0, 35, 53, 0, 0, 17,
- 55, 153, 177, 47, 137, 158, 42, 122, 142, 33, 107, 124, 22, 91, 106, 6, 75, 88, 0, 57, 70, 0, 35, 46, 0, 0, 9,
- 61, 152, 158, 53, 136, 143, 45, 122, 127, 36, 106, 111, 24, 90, 94, 10, 74, 78, 0, 57, 61, 0, 35, 39, 0, 0, 2,
- 67, 151, 141, 59, 135, 126, 49, 121, 112, 39, 105, 98, 29, 90, 83, 14, 74, 68, 0, 57, 52, 0, 35, 31, 0, 0, 0,
- 71, 150, 123, 62, 135, 110, 54, 120, 98, 42, 105, 84, 31, 89, 71, 16, 74, 58, 0, 57, 43, 0, 35, 22, 0, 0, 0,
- 74, 150, 105, 64, 134, 92, 55, 120, 83, 45, 104, 71, 34, 89, 59, 20, 73, 47, 0, 57, 32, 0, 35, 13, 0, 0, 0,
- 78, 149, 84, 69, 134, 75, 59, 120, 66, 47, 103, 56, 34, 88, 46, 22, 73, 34, 1, 57, 20, 0, 35, 1, 0, 0, 0,
- 80, 149, 69, 70, 133, 61, 60, 119, 53, 49, 103, 44, 36, 88, 35, 23, 73, 24, 2, 56, 10, 0, 35, 0, 0, 0, 0,
- 58, 136, 200, 50, 122, 180, 45, 109, 162, 38, 94, 141, 27, 80, 121, 15, 65, 102, 0, 48, 81, 0, 26, 56, 0, 0, 19,
- 66, 136, 182, 59, 122, 163, 52, 109, 146, 42, 94, 128, 32, 80, 109, 20, 65, 91, 2, 48, 72, 0, 26, 49, 0, 0, 11,
- 70, 136, 165, 62, 122, 149, 55, 108, 133, 46, 94, 116, 35, 80, 99, 21, 65, 82, 4, 49, 64, 0, 26, 41, 0, 0, 3,
- 76, 135, 149, 66, 121, 133, 58, 108, 119, 48, 94, 103, 36, 79, 88, 23, 65, 73, 7, 49, 56, 0, 27, 34, 0, 0, 0,
- 78, 135, 133, 69, 120, 118, 60, 107, 106, 50, 93, 92, 39, 79, 77, 26, 65, 63, 8, 49, 47, 0, 27, 26, 0, 0, 0,
- 82, 134, 117, 71, 120, 104, 62, 107, 92, 51, 93, 79, 39, 78, 66, 27, 64, 53, 10, 48, 39, 0, 27, 18, 0, 0, 0,
- 84, 134, 99, 73, 119, 87, 64, 106, 77, 53, 92, 66, 42, 78, 55, 28, 64, 42, 11, 48, 29, 0, 28, 9, 0, 0, 0,
- 87, 133, 81, 76, 119, 72, 66, 106, 62, 55, 92, 52, 43, 78, 42, 29, 64, 31, 12, 48, 17, 0, 28, 0, 0, 0, 0,
- 88, 134, 67, 77, 119, 58, 68, 106, 51, 56, 92, 42, 44, 78, 32, 30, 64, 20, 12, 48, 6, 0, 28, 0, 0, 0, 0,
- 73, 120, 189, 64, 107, 168, 57, 96, 151, 47, 82, 133, 38, 69, 114, 26, 55, 95, 11, 39, 75, 0, 16, 51, 0, 0, 14,
- 78, 120, 171, 69, 107, 153, 62, 95, 137, 51, 82, 119, 40, 69, 102, 29, 55, 85, 15, 39, 66, 0, 17, 44, 0, 0, 4,
- 81, 120, 156, 71, 107, 140, 64, 95, 125, 53, 82, 109, 42, 69, 93, 31, 55, 77, 16, 39, 59, 0, 18, 37, 0, 0, 0,
- 85, 120, 141, 74, 107, 126, 65, 95, 112, 54, 82, 97, 43, 69, 82, 32, 55, 67, 17, 39, 51, 0, 19, 30, 0, 0, 0,
- 86, 119, 126, 76, 106, 112, 66, 95, 100, 56, 81, 85, 45, 69, 72, 33, 55, 59, 18, 40, 43, 0, 19, 22, 0, 0, 0,
- 89, 119, 110, 78, 106, 98, 69, 94, 87, 56, 81, 75, 46, 68, 62, 33, 55, 49, 18, 40, 35, 0, 20, 15, 0, 0, 0,
- 89, 119, 95, 80, 106, 83, 70, 94, 73, 58, 81, 63, 46, 68, 51, 34, 55, 39, 19, 40, 25, 0, 20, 4, 0, 0, 0,
- 92, 118, 78, 82, 106, 68, 70, 93, 59, 59, 81, 49, 47, 68, 39, 34, 55, 28, 19, 40, 14, 0, 20, 0, 0, 0, 0,
- 93, 118, 65, 82, 105, 55, 72, 93, 48, 60, 81, 39, 47, 68, 29, 34, 55, 18, 20, 40, 2, 0, 20, 0, 0, 0, 0,
- 83, 104, 177, 74, 93, 159, 65, 82, 142, 56, 70, 124, 45, 57, 106, 33, 44, 89, 20, 28, 70, 1, 4, 46, 0, 0, 8,
- 86, 104, 161, 78, 93, 145, 68, 82, 128, 58, 70, 112, 48, 58, 96, 35, 45, 80, 21, 29, 62, 1, 6, 40, 0, 0, 0,
- 89, 104, 147, 79, 93, 131, 69, 82, 118, 59, 70, 102, 47, 58, 87, 36, 45, 72, 23, 29, 55, 3, 7, 33, 0, 0, 0,
- 90, 104, 132, 80, 93, 119, 71, 82, 106, 60, 70, 91, 48, 58, 77, 37, 45, 62, 23, 30, 47, 4, 7, 26, 0, 0, 0,
- 92, 104, 118, 82, 93, 105, 72, 82, 93, 61, 69, 80, 50, 58, 68, 37, 45, 55, 23, 30, 39, 4, 8, 18, 0, 0, 0,
- 94, 104, 105, 82, 92, 93, 72, 82, 82, 61, 70, 70, 50, 58, 58, 38, 46, 46, 23, 31, 31, 6, 10, 11, 0, 0, 0,
- 95, 104, 90, 84, 92, 79, 74, 82, 70, 62, 70, 58, 50, 58, 48, 37, 46, 36, 23, 31, 22, 4, 11, 3, 0, 0, 0,
- 96, 103, 74, 85, 92, 65, 75, 81, 56, 63, 70, 47, 50, 58, 37, 38, 46, 25, 24, 31, 11, 3, 11, 0, 0, 0, 0,
- 97, 103, 62, 86, 92, 53, 76, 81, 45, 63, 69, 36, 51, 58, 27, 38, 46, 15, 23, 31, 0, 3, 11, 0, 0, 0, 0,
- 90, 87, 165, 81, 77, 148, 72, 67, 132, 62, 55, 116, 50, 44, 99, 39, 31, 82, 25, 14, 64, 1, 0, 42, 0, 0, 1,
- 93, 87, 150, 83, 77, 135, 74, 67, 121, 63, 56, 105, 52, 45, 90, 40, 32, 74, 25, 16, 57, 3, 0, 35, 0, 0, 0,
- 95, 87, 138, 85, 77, 123, 75, 67, 109, 63, 57, 95, 53, 45, 81, 41, 33, 66, 26, 17, 50, 4, 0, 28, 0, 0, 0,
- 95, 88, 124, 85, 77, 111, 75, 67, 99, 63, 57, 86, 53, 45, 72, 41, 33, 58, 26, 18, 43, 5, 1, 22, 0, 0, 0,
- 97, 88, 112, 87, 77, 100, 76, 68, 88, 64, 57, 76, 53, 46, 63, 41, 34, 50, 26, 19, 35, 5, 2, 14, 0, 0, 0,
- 99, 87, 99, 87, 78, 88, 76, 68, 77, 65, 57, 65, 53, 46, 54, 41, 35, 42, 27, 20, 27, 6, 2, 5, 0, 0, 0,
- 100, 87, 85, 88, 77, 75, 77, 68, 65, 65, 57, 54, 53, 46, 44, 41, 35, 32, 27, 21, 19, 5, 3, 2, 0, 0, 0,
- 100, 88, 71, 89, 77, 61, 78, 68, 53, 66, 57, 44, 53, 47, 33, 41, 35, 22, 27, 21, 7, 5, 3, 0, 0, 0, 0,
- 101, 87, 60, 90, 77, 52, 79, 68, 44, 66, 58, 34, 53, 47, 25, 41, 35, 13, 26, 22, 0, 5, 3, 0, 0, 0, 0,
- 97, 67, 155, 86, 58, 138, 77, 50, 125, 66, 39, 108, 55, 28, 92, 43, 12, 76, 29, 0, 59, 2, 0, 37, 0, 0, 0,
- 99, 67, 141, 88, 59, 127, 78, 50, 113, 68, 40, 98, 56, 29, 83, 44, 15, 68, 29, 0, 52, 3, 0, 30, 0, 0, 0,
- 100, 68, 129, 89, 59, 115, 80, 51, 103, 68, 41, 89, 56, 30, 75, 44, 16, 61, 30, 0, 45, 4, 0, 24, 0, 0, 0,
- 100, 69, 118, 90, 60, 104, 80, 51, 92, 67, 41, 79, 56, 31, 66, 44, 18, 53, 29, 2, 38, 4, 0, 18, 0, 0, 0,
- 101, 69, 104, 90, 61, 93, 79, 51, 82, 67, 42, 70, 56, 32, 59, 44, 20, 46, 29, 4, 31, 6, 0, 9, 0, 0, 0,
- 102, 69, 93, 90, 61, 83, 80, 52, 72, 68, 42, 61, 56, 33, 50, 43, 20, 38, 29, 5, 23, 7, 0, 4, 0, 0, 0,
- 102, 70, 80, 91, 61, 71, 80, 52, 61, 68, 43, 51, 56, 32, 40, 44, 21, 29, 30, 6, 14, 7, 0, 0, 0, 0, 0,
- 103, 70, 68, 92, 61, 58, 81, 53, 50, 69, 43, 41, 56, 34, 31, 43, 22, 19, 29, 7, 3, 7, 0, 0, 0, 0, 0,
- 104, 70, 57, 92, 61, 48, 82, 53, 40, 69, 43, 32, 56, 34, 22, 43, 23, 10, 29, 8, 0, 6, 0, 0, 0, 0, 0,
- 101, 45, 145, 91, 35, 129, 80, 26, 116, 69, 15, 101, 59, 0, 86, 46, 0, 71, 31, 0, 55, 0, 0, 33, 0, 0, 0,
- 104, 44, 132, 92, 36, 118, 82, 28, 105, 71, 17, 91, 58, 3, 77, 46, 0, 63, 31, 0, 48, 2, 0, 26, 0, 0, 0,
- 104, 46, 121, 93, 37, 107, 82, 30, 96, 70, 20, 83, 58, 6, 70, 46, 0, 57, 32, 0, 41, 4, 0, 20, 0, 0, 0,
- 104, 48, 110, 93, 40, 98, 82, 31, 87, 70, 22, 74, 59, 9, 62, 45, 0, 49, 31, 0, 35, 6, 0, 13, 0, 0, 0,
- 104, 48, 99, 92, 41, 88, 82, 32, 77, 70, 23, 65, 58, 11, 54, 46, 0, 42, 32, 0, 27, 7, 0, 5, 0, 0, 0,
- 105, 50, 88, 93, 41, 77, 82, 34, 68, 71, 24, 57, 58, 13, 46, 45, 1, 35, 31, 0, 21, 7, 0, 2, 0, 0, 0,
- 105, 50, 76, 94, 41, 66, 83, 34, 57, 71, 25, 47, 58, 15, 37, 45, 2, 25, 32, 0, 11, 7, 0, 0, 0, 0, 0,
- 106, 50, 64, 94, 42, 55, 83, 35, 47, 71, 26, 38, 58, 16, 27, 45, 4, 17, 31, 0, 4, 7, 0, 0, 0, 0, 0,
- 106, 51, 54, 95, 42, 45, 83, 35, 38, 71, 27, 30, 58, 16, 19, 45, 5, 7, 30, 0, 0, 6, 0, 0, 0, 0, 0,
- 0, 181, 240, 0, 162, 216, 0, 144, 193, 0, 126, 168, 0, 109, 146, 0, 91, 123, 0, 71, 98, 0, 48, 71, 0, 9, 34,
- 0, 179, 218, 0, 161, 195, 0, 144, 174, 0, 126, 153, 0, 108, 132, 0, 90, 110, 0, 71, 88, 0, 48, 63, 0, 8, 29,
- 0, 178, 197, 0, 159, 177, 0, 143, 159, 0, 125, 139, 0, 107, 119, 0, 90, 99, 0, 71, 79, 0, 48, 55, 0, 8, 22,
- 0, 177, 177, 0, 158, 158, 0, 142, 141, 0, 124, 123, 0, 107, 106, 0, 89, 88, 0, 71, 70, 0, 48, 47, 0, 8, 14,
- 0, 176, 157, 0, 158, 141, 0, 141, 126, 0, 123, 109, 0, 106, 93, 0, 89, 78, 0, 70, 60, 0, 47, 39, 0, 7, 5,
- 0, 175, 138, 0, 157, 123, 0, 141, 110, 0, 123, 96, 0, 105, 81, 0, 88, 67, 0, 70, 51, 0, 48, 30, 0, 6, 0,
- 0, 173, 115, 0, 155, 104, 0, 140, 92, 0, 122, 80, 0, 105, 67, 0, 88, 55, 0, 69, 40, 0, 47, 20, 0, 6, 0,
- 0, 173, 94, 0, 155, 85, 0, 139, 75, 0, 121, 64, 0, 104, 53, 0, 88, 42, 0, 70, 28, 0, 47, 9, 0, 6, 0,
- 0, 173, 76, 0, 155, 70, 0, 138, 61, 0, 122, 53, 0, 104, 44, 0, 87, 32, 0, 69, 18, 0, 47, 0, 0, 6, 0,
- 0, 164, 226, 0, 147, 203, 0, 131, 181, 0, 114, 158, 0, 97, 136, 0, 80, 115, 0, 63, 92, 0, 40, 65, 0, 0, 30,
- 0, 162, 205, 0, 145, 184, 0, 130, 164, 0, 114, 143, 0, 97, 124, 0, 81, 104, 0, 63, 83, 0, 40, 58, 0, 0, 23,
- 0, 162, 187, 0, 145, 167, 0, 130, 150, 0, 113, 131, 0, 96, 112, 0, 80, 93, 0, 62, 74, 0, 40, 50, 0, 0, 16,
- 0, 160, 167, 0, 144, 150, 0, 129, 134, 0, 112, 116, 0, 96, 100, 0, 80, 82, 0, 62, 65, 0, 40, 43, 0, 0, 7,
- 0, 160, 148, 0, 143, 133, 0, 128, 118, 0, 111, 103, 0, 96, 88, 0, 80, 73, 0, 62, 56, 0, 40, 35, 0, 0, 0,
- 0, 158, 130, 0, 142, 117, 0, 127, 104, 0, 111, 89, 0, 95, 76, 0, 79, 62, 0, 62, 46, 0, 40, 26, 0, 0, 0,
- 0, 158, 111, 0, 141, 99, 0, 127, 88, 0, 111, 76, 0, 95, 63, 0, 79, 51, 0, 62, 37, 0, 40, 18, 0, 0, 0,
- 0, 158, 91, 0, 141, 81, 0, 126, 72, 0, 110, 62, 0, 94, 50, 0, 79, 39, 0, 62, 25, 0, 40, 5, 0, 0, 0,
- 0, 157, 74, 0, 141, 66, 0, 126, 59, 0, 110, 49, 0, 94, 40, 0, 78, 29, 0, 61, 15, 0, 40, 0, 0, 0, 0,
- 0, 148, 214, 0, 133, 192, 0, 119, 171, 0, 103, 150, 0, 87, 129, 0, 72, 108, 0, 55, 86, 0, 32, 61, 0, 0, 25,
- 0, 147, 193, 0, 132, 173, 0, 118, 155, 0, 103, 136, 0, 87, 116, 0, 72, 98, 0, 55, 78, 0, 32, 53, 0, 0, 17,
- 0, 147, 176, 0, 132, 158, 0, 118, 142, 0, 102, 124, 0, 87, 106, 0, 72, 88, 0, 55, 69, 0, 33, 46, 0, 0, 9,
- 0, 146, 159, 0, 131, 142, 0, 117, 127, 0, 102, 111, 0, 87, 95, 0, 71, 79, 0, 55, 61, 0, 33, 39, 0, 0, 2,
- 0, 145, 140, 0, 130, 126, 0, 117, 112, 0, 101, 98, 0, 86, 83, 0, 71, 68, 0, 55, 52, 0, 33, 31, 0, 0, 0,
- 0, 144, 124, 0, 130, 111, 0, 116, 99, 0, 101, 84, 0, 86, 72, 0, 71, 59, 0, 55, 43, 0, 33, 23, 0, 0, 0,
- 0, 144, 106, 0, 129, 94, 0, 115, 83, 0, 101, 72, 0, 85, 60, 0, 71, 48, 0, 55, 34, 0, 33, 14, 0, 0, 0,
- 3, 143, 86, 0, 129, 77, 0, 115, 68, 0, 100, 58, 0, 85, 48, 0, 70, 36, 0, 54, 22, 0, 33, 3, 0, 0, 0,
- 18, 143, 72, 13, 128, 63, 0, 115, 57, 0, 100, 47, 0, 85, 37, 0, 70, 26, 0, 54, 13, 0, 33, 0, 0, 0, 0,
- 0, 132, 200, 0, 118, 179, 0, 105, 161, 0, 91, 140, 0, 76, 121, 0, 62, 101, 0, 46, 81, 0, 24, 56, 0, 0, 19,
- 0, 131, 182, 0, 118, 163, 0, 105, 146, 0, 91, 128, 0, 77, 110, 0, 62, 91, 0, 46, 72, 0, 25, 48, 0, 0, 11,
- 0, 131, 165, 0, 117, 149, 0, 104, 133, 0, 91, 116, 0, 77, 99, 0, 62, 82, 0, 46, 64, 0, 25, 41, 0, 0, 4,
- 0, 131, 149, 0, 116, 134, 0, 104, 119, 0, 91, 104, 0, 77, 89, 0, 62, 73, 0, 46, 56, 0, 25, 34, 0, 0, 0,
- 10, 130, 133, 2, 116, 119, 0, 104, 106, 0, 90, 91, 0, 76, 78, 0, 62, 64, 0, 46, 48, 0, 26, 27, 0, 0, 0,
- 23, 130, 118, 20, 116, 104, 13, 103, 93, 3, 89, 79, 0, 76, 67, 0, 62, 54, 0, 46, 39, 0, 26, 19, 0, 0, 0,
- 33, 129, 101, 27, 115, 89, 19, 103, 79, 9, 89, 67, 0, 75, 56, 0, 61, 43, 0, 46, 29, 0, 26, 10, 0, 0, 0,
- 41, 128, 83, 35, 115, 73, 27, 102, 64, 15, 89, 55, 0, 76, 45, 0, 62, 33, 0, 46, 18, 0, 26, 0, 0, 0, 0,
- 43, 129, 69, 38, 115, 61, 30, 102, 54, 17, 89, 45, 2, 75, 34, 0, 61, 23, 0, 46, 9, 0, 26, 0, 0, 0, 0,
- 1, 116, 188, 1, 104, 168, 0, 92, 151, 0, 79, 132, 0, 66, 113, 0, 52, 94, 0, 36, 75, 0, 14, 52, 0, 0, 14,
- 17, 116, 171, 16, 104, 153, 14, 92, 137, 8, 79, 119, 0, 67, 102, 0, 53, 85, 0, 37, 67, 0, 16, 44, 0, 0, 4,
- 31, 116, 155, 27, 104, 140, 21, 92, 125, 13, 79, 109, 3, 66, 93, 0, 53, 77, 0, 37, 59, 0, 16, 38, 0, 0, 0,
- 37, 115, 141, 30, 103, 126, 26, 92, 112, 16, 79, 98, 5, 66, 83, 0, 53, 67, 0, 38, 51, 0, 17, 31, 0, 0, 0,
- 41, 115, 126, 37, 103, 112, 31, 92, 100, 22, 79, 86, 10, 66, 72, 0, 53, 59, 0, 38, 44, 0, 17, 23, 0, 0, 0,
- 48, 115, 111, 41, 102, 99, 34, 91, 88, 24, 78, 76, 14, 66, 63, 0, 53, 50, 0, 38, 36, 0, 18, 15, 0, 0, 0,
- 51, 115, 95, 46, 102, 85, 37, 91, 74, 26, 78, 63, 16, 66, 52, 0, 53, 40, 0, 38, 26, 0, 18, 5, 0, 0, 0,
- 55, 114, 80, 47, 102, 69, 40, 90, 60, 30, 78, 51, 19, 66, 41, 3, 53, 29, 0, 38, 15, 0, 17, 0, 0, 0, 0,
- 56, 114, 66, 50, 102, 58, 40, 91, 50, 32, 78, 41, 18, 66, 32, 4, 53, 21, 0, 38, 5, 0, 17, 0, 0, 0, 0,
- 39, 102, 178, 37, 90, 159, 30, 79, 142, 21, 68, 124, 14, 55, 106, 0, 42, 89, 0, 26, 70, 0, 4, 46, 0, 0, 8,
- 48, 102, 161, 42, 90, 145, 35, 79, 128, 26, 68, 112, 19, 55, 96, 3, 43, 79, 0, 27, 62, 0, 6, 40, 0, 0, 0,
- 50, 102, 147, 44, 90, 132, 37, 79, 118, 30, 68, 102, 20, 56, 87, 7, 43, 72, 0, 28, 55, 0, 6, 34, 0, 0, 0,
- 53, 101, 133, 47, 90, 118, 41, 79, 106, 32, 68, 91, 21, 56, 78, 9, 43, 63, 0, 28, 47, 0, 6, 26, 0, 0, 0,
- 57, 101, 119, 50, 89, 106, 42, 79, 94, 34, 67, 81, 24, 56, 68, 9, 44, 55, 0, 29, 40, 0, 6, 19, 0, 0, 0,
- 60, 100, 105, 50, 90, 94, 45, 80, 83, 36, 68, 71, 24, 56, 59, 11, 44, 46, 0, 29, 32, 0, 7, 12, 0, 0, 0,
- 63, 101, 91, 55, 90, 80, 46, 79, 70, 37, 68, 59, 26, 56, 49, 12, 44, 37, 1, 29, 23, 0, 7, 3, 0, 0, 0,
- 64, 101, 75, 56, 89, 67, 48, 79, 57, 37, 68, 48, 27, 56, 37, 15, 44, 26, 0, 29, 12, 0, 7, 0, 0, 0, 0,
- 66, 101, 64, 58, 89, 55, 49, 79, 47, 39, 68, 38, 27, 56, 29, 14, 44, 18, 1, 30, 2, 0, 7, 0, 0, 0, 0,
- 57, 86, 165, 51, 75, 148, 45, 65, 133, 38, 54, 116, 28, 43, 100, 16, 29, 83, 0, 13, 64, 0, 0, 42, 0, 0, 3,
- 60, 86, 151, 55, 75, 135, 47, 66, 121, 39, 55, 105, 30, 44, 90, 18, 31, 74, 3, 16, 57, 0, 1, 35, 0, 0, 0,
- 62, 86, 139, 56, 75, 123, 49, 66, 110, 40, 55, 95, 30, 44, 81, 19, 31, 66, 4, 17, 51, 0, 1, 29, 0, 0, 0,
- 65, 86, 125, 56, 76, 112, 49, 66, 99, 39, 55, 86, 31, 44, 72, 19, 32, 59, 5, 18, 44, 0, 1, 23, 0, 0, 0,
- 67, 86, 113, 58, 75, 100, 51, 66, 88, 41, 56, 77, 31, 45, 64, 20, 32, 51, 6, 18, 35, 0, 1, 14, 0, 0, 0,
- 69, 86, 99, 61, 76, 88, 52, 66, 78, 43, 56, 66, 32, 45, 55, 20, 33, 42, 7, 19, 27, 0, 1, 6, 0, 0, 0,
- 69, 86, 86, 61, 76, 75, 53, 67, 66, 43, 56, 55, 33, 45, 45, 21, 34, 34, 8, 20, 20, 0, 2, 2, 0, 0, 0,
- 71, 86, 72, 63, 75, 62, 54, 66, 55, 45, 56, 45, 33, 45, 35, 22, 34, 23, 7, 20, 8, 0, 2, 0, 0, 0, 0,
- 71, 86, 62, 64, 75, 53, 55, 66, 46, 45, 56, 36, 33, 46, 27, 22, 34, 15, 8, 20, 0, 0, 2, 0, 0, 0, 0,
- 69, 67, 156, 61, 58, 140, 53, 50, 125, 45, 39, 108, 35, 28, 93, 25, 12, 77, 12, 0, 59, 0, 0, 37, 0, 0, 0,
- 71, 68, 142, 63, 59, 126, 56, 50, 114, 47, 40, 98, 37, 28, 84, 26, 15, 68, 12, 0, 53, 0, 0, 30, 0, 0, 0,
- 72, 68, 130, 63, 59, 116, 56, 50, 104, 47, 40, 90, 38, 30, 75, 27, 16, 61, 13, 0, 46, 0, 0, 24, 0, 0, 0,
- 73, 69, 118, 65, 59, 105, 57, 51, 92, 47, 41, 80, 37, 30, 67, 26, 18, 53, 14, 1, 39, 0, 0, 18, 0, 0, 0,
- 74, 69, 106, 65, 60, 93, 57, 51, 82, 48, 41, 70, 38, 31, 59, 26, 19, 46, 13, 2, 32, 0, 0, 10, 0, 0, 0,
- 76, 69, 95, 66, 61, 84, 58, 52, 73, 48, 42, 61, 37, 32, 50, 26, 20, 38, 14, 4, 24, 0, 0, 4, 0, 0, 0,
- 76, 69, 81, 68, 60, 72, 58, 52, 62, 48, 42, 51, 38, 32, 41, 27, 21, 30, 14, 4, 16, 0, 0, 1, 0, 0, 0,
- 76, 69, 68, 68, 61, 60, 60, 52, 51, 49, 43, 41, 38, 33, 32, 27, 21, 20, 14, 5, 5, 0, 0, 0, 0, 0, 0,
- 78, 70, 59, 69, 61, 50, 60, 52, 42, 49, 43, 34, 39, 33, 24, 27, 22, 13, 14, 7, 1, 0, 0, 0, 0, 0, 0,
- 75, 46, 146, 68, 38, 131, 60, 30, 117, 50, 19, 102, 41, 4, 87, 29, 0, 72, 13, 0, 55, 0, 0, 33, 0, 0, 0,
- 78, 47, 132, 70, 39, 119, 61, 30, 105, 53, 20, 92, 42, 5, 78, 30, 0, 64, 13, 0, 49, 0, 0, 27, 0, 0, 0,
- 79, 48, 122, 70, 40, 108, 62, 32, 96, 52, 22, 84, 42, 9, 71, 30, 0, 58, 14, 0, 42, 0, 0, 20, 0, 0, 0,
- 79, 50, 111, 70, 42, 99, 62, 33, 88, 52, 23, 74, 41, 11, 63, 29, 0, 50, 14, 0, 36, 0, 0, 14, 0, 0, 0,
- 80, 50, 99, 70, 42, 89, 61, 34, 78, 52, 25, 67, 41, 14, 55, 30, 0, 42, 15, 0, 28, 0, 0, 6, 0, 0, 0,
- 81, 51, 89, 71, 43, 78, 62, 35, 69, 52, 25, 58, 42, 15, 47, 30, 3, 36, 15, 0, 22, 0, 0, 3, 0, 0, 0,
- 81, 51, 77, 71, 44, 68, 63, 36, 59, 53, 26, 49, 41, 16, 38, 31, 4, 27, 16, 0, 12, 0, 0, 0, 0, 0, 0,
- 81, 52, 65, 72, 43, 56, 63, 36, 48, 53, 27, 39, 41, 17, 29, 30, 4, 18, 14, 0, 3, 0, 0, 0, 0, 0, 0,
- 81, 52, 55, 73, 44, 47, 64, 36, 39, 53, 28, 32, 42, 18, 21, 31, 6, 9, 14, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 174, 239, 0, 156, 214, 0, 139, 192, 0, 121, 168, 0, 105, 145, 0, 87, 123, 0, 68, 98, 0, 46, 70, 0, 3, 35,
- 0, 172, 217, 0, 155, 194, 0, 139, 173, 0, 121, 152, 0, 104, 130, 0, 87, 110, 0, 69, 88, 0, 46, 63, 0, 4, 28,
- 0, 171, 197, 0, 153, 175, 0, 138, 158, 0, 121, 139, 0, 103, 118, 0, 86, 100, 0, 68, 79, 0, 46, 55, 0, 4, 22,
- 0, 170, 177, 0, 152, 158, 0, 136, 141, 0, 119, 124, 0, 103, 106, 0, 86, 88, 0, 68, 70, 0, 45, 47, 0, 3, 14,
- 0, 169, 157, 0, 152, 141, 0, 136, 126, 0, 119, 109, 0, 102, 94, 0, 86, 78, 0, 68, 60, 0, 46, 39, 0, 3, 5,
- 0, 167, 138, 0, 150, 124, 0, 135, 111, 0, 118, 97, 0, 102, 82, 0, 85, 68, 0, 68, 52, 0, 46, 31, 0, 3, 0,
- 0, 167, 118, 0, 150, 104, 0, 135, 94, 0, 118, 81, 0, 101, 69, 0, 84, 56, 0, 67, 41, 0, 45, 21, 0, 3, 0,
- 0, 166, 97, 0, 149, 87, 0, 134, 77, 0, 117, 67, 0, 101, 56, 0, 85, 44, 0, 67, 30, 0, 45, 10, 0, 3, 0,
- 0, 165, 79, 0, 149, 73, 0, 133, 64, 0, 117, 56, 0, 101, 46, 0, 85, 34, 0, 68, 21, 0, 46, 1, 0, 3, 0,
- 0, 158, 225, 0, 141, 201, 0, 126, 180, 0, 109, 158, 0, 94, 136, 0, 78, 114, 0, 60, 91, 0, 38, 66, 0, 0, 30,
- 0, 156, 203, 0, 140, 183, 0, 125, 164, 0, 109, 143, 0, 94, 124, 0, 78, 104, 0, 61, 83, 0, 38, 57, 0, 0, 23,
- 0, 156, 186, 0, 140, 166, 0, 125, 150, 0, 109, 130, 0, 93, 111, 0, 77, 93, 0, 60, 74, 0, 38, 50, 0, 0, 17,
- 0, 155, 167, 0, 138, 149, 0, 124, 134, 0, 109, 117, 0, 93, 100, 0, 76, 83, 0, 60, 65, 0, 38, 43, 0, 0, 9,
- 0, 153, 147, 0, 138, 134, 0, 124, 120, 0, 107, 103, 0, 92, 88, 0, 77, 73, 0, 60, 56, 0, 38, 35, 0, 0, 0,
- 0, 153, 131, 0, 137, 118, 0, 122, 105, 0, 107, 90, 0, 91, 76, 0, 76, 63, 0, 60, 47, 0, 39, 28, 0, 0, 0,
- 0, 153, 111, 0, 136, 100, 0, 123, 90, 0, 107, 77, 0, 92, 65, 0, 76, 52, 0, 60, 37, 0, 38, 18, 0, 0, 0,
- 0, 152, 93, 0, 136, 82, 0, 122, 74, 0, 106, 63, 0, 91, 52, 0, 76, 40, 0, 59, 26, 0, 38, 6, 0, 0, 0,
- 0, 151, 78, 0, 136, 69, 0, 121, 61, 0, 106, 52, 0, 91, 43, 0, 76, 32, 0, 59, 17, 0, 38, 0, 0, 0, 0,
- 0, 143, 213, 0, 128, 191, 0, 115, 171, 0, 100, 149, 0, 84, 128, 0, 69, 108, 0, 52, 86, 0, 30, 61, 0, 0, 25,
- 0, 142, 193, 0, 127, 173, 0, 114, 154, 0, 99, 134, 0, 84, 116, 0, 69, 98, 0, 52, 77, 0, 31, 53, 0, 0, 18,
- 0, 141, 176, 0, 127, 158, 0, 114, 141, 0, 98, 122, 0, 84, 105, 0, 69, 88, 0, 53, 69, 0, 31, 46, 0, 0, 9,
- 0, 141, 159, 0, 126, 142, 0, 113, 127, 0, 98, 110, 0, 83, 95, 0, 69, 78, 0, 53, 60, 0, 32, 39, 0, 0, 2,
- 0, 140, 140, 0, 126, 126, 0, 112, 112, 0, 98, 98, 0, 83, 83, 0, 68, 69, 0, 52, 52, 0, 31, 31, 0, 0, 0,
- 0, 140, 124, 0, 125, 112, 0, 112, 100, 0, 97, 86, 0, 83, 72, 0, 68, 59, 0, 52, 44, 0, 31, 23, 0, 0, 0,
- 0, 139, 106, 0, 125, 96, 0, 111, 85, 0, 97, 72, 0, 83, 62, 0, 68, 49, 0, 52, 35, 0, 31, 15, 0, 0, 0,
- 0, 138, 88, 0, 124, 79, 0, 111, 70, 0, 96, 59, 0, 82, 48, 0, 68, 38, 0, 52, 24, 0, 31, 4, 0, 0, 0,
- 0, 139, 76, 0, 124, 66, 0, 111, 58, 0, 96, 50, 0, 82, 40, 0, 68, 29, 0, 52, 15, 0, 31, 0, 0, 0, 0,
- 0, 129, 200, 0, 114, 179, 0, 102, 160, 0, 87, 139, 0, 74, 120, 0, 60, 101, 0, 44, 81, 0, 22, 56, 0, 0, 19,
- 0, 127, 181, 0, 114, 163, 0, 102, 146, 0, 88, 127, 0, 74, 109, 0, 60, 91, 0, 44, 72, 0, 23, 48, 0, 0, 11,
- 0, 127, 166, 0, 113, 148, 0, 101, 133, 0, 87, 115, 0, 74, 99, 0, 60, 82, 0, 44, 64, 0, 23, 42, 0, 0, 4,
- 0, 127, 150, 0, 113, 134, 0, 101, 119, 0, 87, 104, 0, 74, 89, 0, 60, 73, 0, 44, 56, 0, 23, 35, 0, 0, 0,
- 0, 125, 134, 0, 112, 118, 0, 100, 106, 0, 87, 92, 0, 73, 78, 0, 60, 64, 0, 44, 48, 0, 23, 27, 0, 0, 0,
- 0, 125, 118, 0, 112, 105, 0, 100, 94, 0, 86, 80, 0, 73, 68, 0, 60, 54, 0, 44, 39, 0, 23, 20, 0, 0, 0,
- 0, 125, 101, 0, 111, 90, 0, 99, 80, 0, 86, 69, 0, 73, 58, 0, 59, 45, 0, 44, 30, 0, 23, 11, 0, 0, 0,
- 0, 124, 85, 0, 111, 75, 0, 99, 66, 0, 86, 56, 0, 73, 45, 0, 59, 34, 0, 44, 20, 0, 23, 1, 0, 0, 0,
- 0, 125, 72, 0, 111, 62, 0, 99, 56, 0, 86, 46, 0, 73, 36, 0, 60, 26, 0, 44, 12, 0, 23, 0, 0, 0, 0,
- 0, 114, 188, 0, 101, 167, 0, 89, 150, 0, 77, 131, 0, 64, 113, 0, 50, 95, 0, 34, 75, 0, 12, 52, 0, 0, 14,
- 0, 113, 170, 0, 101, 153, 0, 89, 137, 0, 77, 120, 0, 64, 102, 0, 50, 85, 0, 35, 67, 0, 12, 44, 0, 0, 4,
- 0, 113, 156, 0, 100, 139, 0, 89, 125, 0, 77, 109, 0, 64, 92, 0, 51, 77, 0, 35, 60, 0, 12, 38, 0, 0, 0,
- 0, 112, 141, 0, 100, 126, 0, 89, 113, 0, 77, 98, 0, 64, 83, 0, 51, 68, 0, 35, 51, 0, 12, 30, 0, 0, 0,
- 0, 112, 127, 0, 100, 112, 0, 89, 100, 0, 76, 87, 0, 64, 74, 0, 51, 59, 0, 35, 44, 0, 13, 24, 0, 0, 0,
- 0, 112, 111, 0, 100, 100, 0, 88, 88, 0, 76, 76, 0, 64, 64, 0, 51, 52, 0, 36, 37, 0, 13, 17, 0, 0, 0,
- 0, 111, 96, 0, 99, 85, 0, 88, 76, 0, 76, 64, 0, 64, 53, 0, 51, 41, 0, 36, 27, 0, 13, 6, 0, 0, 0,
- 0, 111, 81, 0, 99, 71, 0, 88, 62, 0, 76, 52, 0, 64, 43, 0, 51, 31, 0, 36, 17, 0, 13, 0, 0, 0, 0,
- 0, 111, 69, 0, 99, 60, 0, 88, 52, 0, 75, 43, 0, 63, 34, 0, 51, 21, 0, 36, 7, 0, 13, 0, 0, 0, 0,
- 0, 99, 177, 0, 88, 158, 0, 77, 141, 0, 66, 123, 0, 53, 106, 0, 40, 89, 0, 25, 71, 0, 5, 47, 0, 0, 8,
- 0, 99, 160, 0, 88, 144, 0, 77, 129, 0, 66, 112, 0, 54, 97, 0, 41, 80, 0, 26, 62, 0, 5, 40, 0, 0, 0,
- 0, 99, 147, 0, 87, 132, 0, 78, 117, 0, 66, 102, 0, 54, 87, 0, 42, 72, 0, 26, 55, 0, 5, 34, 0, 0, 0,
- 0, 99, 134, 0, 88, 119, 0, 77, 107, 0, 66, 92, 0, 54, 78, 0, 42, 64, 0, 27, 48, 0, 5, 27, 0, 0, 0,
- 0, 99, 120, 0, 87, 107, 0, 78, 94, 0, 66, 81, 0, 54, 68, 0, 42, 55, 0, 27, 40, 0, 6, 20, 0, 0, 0,
- 0, 98, 105, 0, 87, 94, 0, 77, 84, 0, 65, 71, 0, 55, 59, 0, 42, 47, 0, 28, 33, 0, 6, 12, 0, 0, 0,
- 0, 98, 93, 0, 87, 81, 0, 77, 72, 0, 66, 61, 0, 54, 49, 0, 42, 37, 0, 28, 24, 0, 6, 4, 0, 0, 0,
- 0, 98, 77, 0, 87, 68, 0, 77, 59, 0, 65, 49, 0, 54, 39, 0, 42, 27, 0, 29, 14, 0, 6, 0, 0, 0, 0,
- 1, 98, 65, 7, 87, 56, 0, 77, 49, 0, 66, 41, 0, 54, 30, 0, 42, 19, 0, 29, 3, 0, 6, 0, 0, 0, 0,
- 0, 84, 166, 0, 74, 149, 0, 64, 134, 0, 53, 117, 0, 41, 100, 0, 28, 83, 0, 11, 64, 0, 0, 42, 0, 0, 3,
- 0, 84, 151, 0, 74, 135, 0, 64, 121, 0, 53, 105, 0, 42, 90, 0, 30, 75, 0, 14, 58, 0, 0, 36, 0, 0, 0,
- 0, 84, 138, 0, 74, 124, 1, 64, 110, 0, 54, 95, 0, 43, 81, 0, 30, 67, 0, 15, 51, 0, 1, 29, 0, 0, 0,
- 14, 84, 126, 12, 74, 112, 2, 65, 99, 0, 54, 85, 0, 44, 73, 0, 31, 59, 0, 16, 44, 0, 1, 23, 0, 0, 0,
- 16, 84, 113, 13, 74, 100, 6, 65, 89, 0, 54, 77, 0, 44, 65, 0, 31, 51, 0, 17, 36, 0, 1, 16, 0, 0, 0,
- 24, 84, 100, 18, 74, 88, 13, 65, 78, 2, 55, 68, 0, 44, 55, 0, 32, 43, 0, 18, 28, 0, 1, 6, 0, 0, 0,
- 26, 84, 87, 24, 74, 76, 17, 65, 67, 7, 54, 57, 0, 44, 46, 0, 32, 35, 0, 19, 21, 0, 2, 3, 0, 0, 0,
- 30, 84, 74, 28, 74, 64, 20, 65, 55, 12, 55, 46, 0, 44, 35, 0, 32, 24, 0, 18, 9, 0, 1, 0, 0, 0, 0,
- 32, 84, 63, 28, 74, 54, 21, 65, 47, 13, 54, 38, 0, 44, 28, 0, 32, 16, 0, 18, 1, 0, 1, 0, 0, 0, 0,
- 30, 67, 155, 20, 58, 139, 20, 49, 126, 12, 39, 110, 0, 27, 94, 0, 13, 77, 0, 0, 60, 0, 0, 37, 0, 0, 0,
- 35, 67, 142, 30, 58, 126, 23, 50, 114, 16, 40, 99, 7, 29, 85, 0, 15, 69, 0, 0, 52, 0, 0, 30, 0, 0, 0,
- 35, 68, 131, 30, 59, 116, 27, 50, 104, 18, 40, 90, 9, 29, 76, 0, 17, 62, 0, 2, 46, 0, 0, 24, 0, 0, 0,
- 37, 69, 119, 33, 59, 106, 27, 51, 94, 21, 41, 80, 9, 30, 67, 0, 18, 54, 0, 3, 39, 0, 0, 18, 0, 0, 0,
- 40, 69, 107, 36, 59, 94, 28, 51, 84, 18, 41, 72, 10, 31, 60, 0, 19, 47, 0, 4, 32, 0, 0, 10, 0, 0, 0,
- 42, 69, 95, 36, 59, 84, 29, 51, 74, 19, 41, 63, 10, 31, 52, 0, 20, 39, 0, 4, 25, 0, 0, 4, 0, 0, 0,
- 43, 69, 83, 38, 60, 73, 32, 51, 62, 23, 42, 53, 11, 31, 42, 0, 20, 31, 0, 5, 17, 0, 0, 1, 0, 0, 0,
- 45, 69, 70, 39, 60, 60, 33, 51, 52, 24, 42, 43, 13, 32, 33, 0, 21, 21, 0, 5, 6, 0, 0, 0, 0, 0, 0,
- 47, 69, 59, 41, 60, 51, 34, 51, 43, 24, 42, 35, 12, 33, 26, 1, 22, 14, 0, 5, 1, 0, 0, 0, 0, 0, 0,
- 46, 48, 146, 42, 40, 131, 36, 32, 118, 27, 22, 103, 17, 6, 88, 5, 0, 73, 0, 0, 55, 0, 0, 33, 0, 0, 0,
- 48, 48, 133, 44, 40, 119, 37, 32, 107, 28, 22, 93, 20, 8, 79, 7, 0, 65, 0, 0, 49, 0, 0, 27, 0, 0, 0,
- 48, 50, 123, 44, 41, 109, 37, 33, 97, 30, 23, 83, 21, 11, 71, 8, 0, 58, 0, 0, 42, 0, 0, 21, 0, 0, 0,
- 49, 51, 111, 45, 42, 99, 38, 34, 87, 29, 25, 75, 20, 13, 63, 8, 0, 51, 0, 0, 36, 0, 0, 14, 0, 0, 0,
- 52, 52, 100, 44, 43, 89, 38, 35, 79, 29, 26, 68, 19, 15, 56, 10, 1, 43, 0, 0, 28, 0, 0, 6, 0, 0, 0,
- 52, 52, 90, 47, 44, 79, 39, 36, 70, 30, 27, 59, 20, 16, 47, 9, 2, 36, 0, 0, 22, 0, 0, 2, 0, 0, 0,
- 52, 53, 78, 46, 44, 68, 39, 37, 60, 32, 27, 49, 22, 17, 39, 10, 3, 28, 0, 0, 12, 0, 0, 0, 0, 0, 0,
- 53, 53, 66, 47, 44, 57, 40, 36, 48, 32, 27, 39, 22, 18, 30, 9, 4, 18, 0, 0, 3, 0, 0, 0, 0, 0, 0,
- 54, 53, 57, 48, 45, 49, 41, 37, 41, 33, 28, 32, 22, 19, 23, 11, 6, 10, 1, 0, 0, 0, 0, 0, 0, 0, 0,
-};
-void AdobeCMYK_to_sRGB1(FX_BYTE c, FX_BYTE m, FX_BYTE y, FX_BYTE k, FX_BYTE& R, FX_BYTE& G, FX_BYTE& B)
-{
- int fix_c = c << 8;
- int fix_m = m << 8;
- int fix_y = y << 8;
- int fix_k = k << 8;
- int c_index = (fix_c + 4096) >> 13;
- int m_index = (fix_m + 4096) >> 13;
- int y_index = (fix_y + 4096) >> 13;
- int k_index = (fix_k + 4096) >> 13;
- int pos = (c_index * 9 * 9 * 9 + m_index * 9 * 9 + y_index * 9 + k_index) * 3;
- int fix_r = g_CMYKSamples[pos] << 8;
- int fix_g = g_CMYKSamples[pos + 1] << 8;
- int fix_b = g_CMYKSamples[pos + 2] << 8;
- int c1_index = fix_c >> 13;
- if (c1_index == c_index) {
- c1_index = c1_index == 8 ? c1_index - 1 : c1_index + 1;
- }
- int m1_index = fix_m >> 13;
- if (m1_index == m_index) {
- m1_index = m1_index == 8 ? m1_index - 1 : m1_index + 1;
- }
- int y1_index = fix_y >> 13;
- if (y1_index == y_index) {
- y1_index = y1_index == 8 ? y1_index - 1 : y1_index + 1;
- }
- int k1_index = fix_k >> 13;
- if (k1_index == k_index) {
- k1_index = k1_index == 8 ? k1_index - 1 : k1_index + 1;
- }
- int c1_pos = pos + (c1_index - c_index) * 9 * 9 * 9 * 3;
- int m1_pos = pos + (m1_index - m_index) * 9 * 9 * 3;
- int y1_pos = pos + (y1_index - y_index) * 9 * 3;
- int k1_pos = pos + (k1_index - k_index) * 3;
- int c_r_delta = g_CMYKSamples[pos] - g_CMYKSamples[c1_pos];
- int c_g_delta = g_CMYKSamples[pos + 1] - g_CMYKSamples[c1_pos + 1];
- int c_b_delta = g_CMYKSamples[pos + 2] - g_CMYKSamples[c1_pos + 2];
- int m_r_delta = g_CMYKSamples[pos] - g_CMYKSamples[m1_pos];
- int m_g_delta = g_CMYKSamples[pos + 1] - g_CMYKSamples[m1_pos + 1];
- int m_b_delta = g_CMYKSamples[pos + 2] - g_CMYKSamples[m1_pos + 2];
- int y_r_delta = g_CMYKSamples[pos] - g_CMYKSamples[y1_pos];
- int y_g_delta = g_CMYKSamples[pos + 1] - g_CMYKSamples[y1_pos + 1];
- int y_b_delta = g_CMYKSamples[pos + 2] - g_CMYKSamples[y1_pos + 2];
- int k_r_delta = g_CMYKSamples[pos] - g_CMYKSamples[k1_pos];
- int k_g_delta = g_CMYKSamples[pos + 1] - g_CMYKSamples[k1_pos + 1];
- int k_b_delta = g_CMYKSamples[pos + 2] - g_CMYKSamples[k1_pos + 2];
- int c_rate = (fix_c - (c_index << 13)) * (c_index - c1_index);
- fix_r += c_r_delta * c_rate / 32;
- fix_g += c_g_delta * c_rate / 32;
- fix_b += c_b_delta * c_rate / 32;
- int m_rate = (fix_m - (m_index << 13)) * (m_index - m1_index);
- fix_r += m_r_delta * m_rate / 32;
- fix_g += m_g_delta * m_rate / 32;
- fix_b += m_b_delta * m_rate / 32;
- int y_rate = (fix_y - (y_index << 13)) * (y_index - y1_index);
- fix_r += y_r_delta * y_rate / 32;
- fix_g += y_g_delta * y_rate / 32;
- fix_b += y_b_delta * y_rate / 32;
- int k_rate = (fix_k - (k_index << 13)) * (k_index - k1_index);
- fix_r += k_r_delta * k_rate / 32;
- fix_g += k_g_delta * k_rate / 32;
- fix_b += k_b_delta * k_rate / 32;
- if (fix_r < 0) {
- fix_r = 0;
- }
- if (fix_g < 0) {
- fix_g = 0;
- }
- if (fix_b < 0) {
- fix_b = 0;
- }
- R = fix_r >> 8;
- G = fix_g >> 8;
- B = fix_b >> 8;
-}
-void AdobeCMYK_to_sRGB(FX_FLOAT c, FX_FLOAT m, FX_FLOAT y, FX_FLOAT k, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B)
-{
- FX_BYTE c1 = FXSYS_round(c * 255);
- FX_BYTE m1 = FXSYS_round(m * 255);
- FX_BYTE y1 = FXSYS_round(y * 255);
- FX_BYTE k1 = FXSYS_round(k * 255);
- FX_BYTE r, g, b;
- AdobeCMYK_to_sRGB1(c1, m1, y1, k1, r, g, b);
- R = 1.0f * r / 255;
- G = 1.0f * g / 255;
- B = 1.0f * b / 255;
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxcodec/fx_codec.h"
+#include "codec_int.h"
+#include "../lcms2/include/fx_lcms2.h"
+FX_BOOL MD5ComputeID( FX_LPCVOID buf, FX_DWORD dwSize, FX_BYTE ID[16] )
+{
+ return cmsMD5computeIDExt(buf, dwSize, ID);
+}
+struct CLcmsCmm : public CFX_Object {
+ cmsHTRANSFORM m_hTransform;
+ int m_nSrcComponents;
+ int m_nDstComponents;
+ FX_BOOL m_bLab;
+};
+extern "C" {
+ int ourHandler(int ErrorCode, const char *ErrorText)
+ {
+ return TRUE;
+ }
+};
+FX_BOOL CheckComponents(cmsColorSpaceSignature cs, int nComponents, FX_BOOL bDst)
+{
+ if (nComponents <= 0 || nComponents > 15) {
+ return FALSE;
+ }
+ switch(cs) {
+ case cmsSigLabData:
+ if (nComponents < 3) {
+ return FALSE;
+ }
+ break;
+ case cmsSigGrayData:
+ if (bDst && nComponents != 1) {
+ return FALSE;
+ } else if (!bDst && nComponents > 2) {
+ return FALSE;
+ }
+ break;
+ case cmsSigRgbData:
+ if (bDst && nComponents != 3) {
+ return FALSE;
+ }
+ break;
+ case cmsSigCmykData:
+ if (bDst && nComponents != 4) {
+ return FALSE;
+ }
+ break;
+ default:
+ if (nComponents != 3) {
+ return FALSE;
+ }
+ break;
+ }
+ return TRUE;
+}
+void* IccLib_CreateTransform(const unsigned char* pSrcProfileData, unsigned int dwSrcProfileSize, int nSrcComponents,
+ const unsigned char* pDstProfileData, unsigned int dwDstProfileSize, int nDstComponents,
+ int intent, FX_DWORD dwSrcFormat = Icc_FORMAT_DEFAULT, FX_DWORD dwDstFormat = Icc_FORMAT_DEFAULT)
+{
+ cmsHPROFILE srcProfile = NULL;
+ cmsHPROFILE dstProfile = NULL;
+ cmsHTRANSFORM hTransform = NULL;
+ CLcmsCmm* pCmm = NULL;
+ srcProfile = cmsOpenProfileFromMem((void*)pSrcProfileData, dwSrcProfileSize);
+ if (srcProfile == NULL) {
+ return NULL;
+ }
+ if(pDstProfileData == NULL && dwDstProfileSize == 0 && nDstComponents == 3) {
+ dstProfile = cmsCreate_sRGBProfile();
+ } else {
+ dstProfile = cmsOpenProfileFromMem((void*)pDstProfileData, dwDstProfileSize);
+ }
+ if (dstProfile == NULL) {
+ cmsCloseProfile(srcProfile);
+ return NULL;
+ }
+ int srcFormat;
+ FX_BOOL bLab = FALSE;
+ cmsColorSpaceSignature srcCS = cmsGetColorSpace(srcProfile);
+ if (!CheckComponents(srcCS, nSrcComponents, FALSE)) {
+ cmsCloseProfile(srcProfile);
+ cmsCloseProfile(dstProfile);
+ return NULL;
+ }
+ if (srcCS == cmsSigLabData) {
+ srcFormat = COLORSPACE_SH(PT_Lab) | CHANNELS_SH(nSrcComponents) | BYTES_SH(0);
+ bLab = TRUE;
+ } else {
+ srcFormat = COLORSPACE_SH(PT_ANY) | CHANNELS_SH(nSrcComponents) | BYTES_SH(1);
+ if (srcCS == cmsSigRgbData && T_DOSWAP(dwSrcFormat)) {
+ srcFormat |= DOSWAP_SH(1);
+ }
+ }
+ cmsColorSpaceSignature dstCS = cmsGetColorSpace(dstProfile);
+ if (!CheckComponents(dstCS, nDstComponents, TRUE)) {
+ cmsCloseProfile(srcProfile);
+ cmsCloseProfile(dstProfile);
+ return NULL;
+ }
+ switch(dstCS) {
+ case cmsSigGrayData:
+ hTransform = cmsCreateTransform(srcProfile, srcFormat, dstProfile, TYPE_GRAY_8, intent, 0);
+ break;
+ case cmsSigRgbData:
+ hTransform = cmsCreateTransform(srcProfile, srcFormat, dstProfile, TYPE_BGR_8, intent, 0);
+ break;
+ case cmsSigCmykData:
+ hTransform = cmsCreateTransform(srcProfile, srcFormat, dstProfile,
+ T_DOSWAP(dwDstFormat) ? TYPE_KYMC_8 : TYPE_CMYK_8,
+ intent, 0);
+ break;
+ default:
+ break;
+ }
+ if (hTransform == NULL) {
+ cmsCloseProfile(srcProfile);
+ cmsCloseProfile(dstProfile);
+ return NULL;
+ }
+ pCmm = FX_NEW CLcmsCmm;
+ if (pCmm == NULL) {
+ return NULL;
+ }
+ pCmm->m_nSrcComponents = nSrcComponents;
+ pCmm->m_nDstComponents = nDstComponents;
+ pCmm->m_hTransform = hTransform;
+ pCmm->m_bLab = bLab;
+ cmsCloseProfile(srcProfile);
+ cmsCloseProfile(dstProfile);
+ return pCmm;
+}
+void* IccLib_CreateTransform_sRGB(const unsigned char* pProfileData, unsigned int dwProfileSize, int nComponents, int intent, FX_DWORD dwSrcFormat)
+{
+ return IccLib_CreateTransform(pProfileData, dwProfileSize, nComponents, NULL, 0, 3, intent, dwSrcFormat);
+}
+void IccLib_DestroyTransform(void* pTransform)
+{
+ if (pTransform == NULL) {
+ return;
+ }
+ cmsDeleteTransform(((CLcmsCmm*)pTransform)->m_hTransform);
+ delete (CLcmsCmm*)pTransform;
+}
+void IccLib_Translate(void* pTransform, FX_FLOAT* pSrcValues, FX_FLOAT* pDestValues)
+{
+ if (pTransform == NULL) {
+ return;
+ }
+ CLcmsCmm* p = (CLcmsCmm*)pTransform;
+ FX_BYTE output[4];
+ if (p->m_bLab) {
+ CFX_FixedBufGrow<double, 16> inputs(p->m_nSrcComponents);
+ double* input = inputs;
+ for (int i = 0; i < p->m_nSrcComponents; i ++) {
+ input[i] = pSrcValues[i];
+ }
+ cmsDoTransform(p->m_hTransform, input, output, 1);
+ } else {
+ CFX_FixedBufGrow<FX_BYTE, 16> inputs(p->m_nSrcComponents);
+ FX_BYTE* input = inputs;
+ for (int i = 0; i < p->m_nSrcComponents; i ++) {
+ if (pSrcValues[i] > 1.0f) {
+ input[i] = 255;
+ } else if (pSrcValues[i] < 0) {
+ input[i] = 0;
+ } else {
+ input[i] = (int)(pSrcValues[i] * 255.0f);
+ }
+ }
+ cmsDoTransform(p->m_hTransform, input, output, 1);
+ }
+ switch(p->m_nDstComponents) {
+ case 1:
+ pDestValues[0] = output[0] / 255.0f;
+ break;
+ case 3:
+ pDestValues[0] = output[2] / 255.0f;
+ pDestValues[1] = output[1] / 255.0f;
+ pDestValues[2] = output[0] / 255.0f;
+ break;
+ case 4:
+ pDestValues[0] = output[0] / 255.0f;
+ pDestValues[1] = output[1] / 255.0f;
+ pDestValues[2] = output[2] / 255.0f;
+ pDestValues[3] = output[3] / 255.0f;
+ break;
+ }
+}
+void IccLib_TranslateImage(void* pTransform, unsigned char* pDest, const unsigned char* pSrc, int pixels)
+{
+ cmsDoTransform(((CLcmsCmm*)pTransform)->m_hTransform, (void*)pSrc, pDest, pixels);
+}
+FX_LPVOID CreateProfile_Gray(double gamma)
+{
+ cmsCIExyY* D50 = (cmsCIExyY*)cmsD50_xyY();
+ if (!cmsWhitePointFromTemp(D50, 6504)) {
+ return NULL;
+ }
+ cmsToneCurve* curve = cmsBuildGamma(NULL, gamma);
+ if (curve == NULL) {
+ return NULL;
+ }
+ FX_LPVOID profile = cmsCreateGrayProfile(D50, curve);
+ cmsFreeToneCurve(curve);
+ return profile;
+}
+ICodec_IccModule::IccCS GetProfileCSFromHandle(FX_LPVOID pProfile)
+{
+ if (pProfile == NULL) {
+ return ICodec_IccModule::IccCS_Unknown;
+ }
+ switch (cmsGetColorSpace(pProfile)) {
+ case cmsSigXYZData:
+ return ICodec_IccModule::IccCS_XYZ;
+ case cmsSigLabData:
+ return ICodec_IccModule::IccCS_Lab;
+ case cmsSigLuvData:
+ return ICodec_IccModule::IccCS_Luv;
+ case cmsSigYCbCrData:
+ return ICodec_IccModule::IccCS_YCbCr;
+ case cmsSigYxyData:
+ return ICodec_IccModule::IccCS_Yxy;
+ case cmsSigRgbData:
+ return ICodec_IccModule::IccCS_Rgb;
+ case cmsSigGrayData:
+ return ICodec_IccModule::IccCS_Gray;
+ case cmsSigHsvData:
+ return ICodec_IccModule::IccCS_Hsv;
+ case cmsSigHlsData:
+ return ICodec_IccModule::IccCS_Hls;
+ case cmsSigCmykData:
+ return ICodec_IccModule::IccCS_Cmyk;
+ case cmsSigCmyData:
+ return ICodec_IccModule::IccCS_Cmy;
+ default:
+ return ICodec_IccModule::IccCS_Unknown;
+ }
+}
+ICodec_IccModule::IccCS CCodec_IccModule::GetProfileCS(FX_LPCBYTE pProfileData, unsigned int dwProfileSize)
+{
+ ICodec_IccModule::IccCS cs;
+ cmsHPROFILE hProfile = cmsOpenProfileFromMem((void*)pProfileData, dwProfileSize);
+ if (hProfile == NULL) {
+ return IccCS_Unknown;
+ }
+ cs = GetProfileCSFromHandle(hProfile);
+ if (hProfile) {
+ cmsCloseProfile(hProfile);
+ }
+ return cs;
+}
+ICodec_IccModule::IccCS CCodec_IccModule::GetProfileCS(IFX_FileRead* pFile)
+{
+ if (pFile == NULL) {
+ return IccCS_Unknown;
+ }
+ ICodec_IccModule::IccCS cs;
+ FX_DWORD dwSize = (FX_DWORD)pFile->GetSize();
+ FX_LPBYTE pBuf = FX_Alloc(FX_BYTE, dwSize);
+ if (pBuf == NULL) {
+ return IccCS_Unknown;
+ }
+ pFile->ReadBlock(pBuf, 0, dwSize);
+ cs = GetProfileCS(pBuf, dwSize);
+ FX_Free(pBuf);
+ return cs;
+}
+FX_DWORD TransferProfileType(FX_LPVOID pProfile, FX_DWORD dwFormat)
+{
+ cmsColorSpaceSignature cs = cmsGetColorSpace(pProfile);
+ switch (cs) {
+ case cmsSigXYZData:
+ return TYPE_XYZ_16;
+ case cmsSigLabData:
+ return TYPE_Lab_DBL;
+ case cmsSigLuvData:
+ return TYPE_YUV_8;
+ case cmsSigYCbCrData:
+ return TYPE_YCbCr_8;
+ case cmsSigYxyData:
+ return TYPE_Yxy_16;
+ case cmsSigRgbData:
+ return T_DOSWAP(dwFormat) ? TYPE_RGB_8 : TYPE_BGR_8;
+ case cmsSigGrayData:
+ return TYPE_GRAY_8;
+ case cmsSigHsvData:
+ return TYPE_HSV_8;
+ case cmsSigHlsData:
+ return TYPE_HLS_8;
+ case cmsSigCmykData:
+ return T_DOSWAP(dwFormat) ? TYPE_KYMC_8 : TYPE_CMYK_8;
+ case cmsSigCmyData:
+ return TYPE_CMY_8;
+ case cmsSigMCH5Data:
+ return T_DOSWAP(dwFormat) ? TYPE_KYMC5_8 : TYPE_CMYK5_8;
+ case cmsSigMCH6Data:
+ return TYPE_CMYK6_8;
+ case cmsSigMCH7Data:
+ return T_DOSWAP(dwFormat) ? TYPE_KYMC7_8 : TYPE_CMYK7_8;
+ case cmsSigMCH8Data:
+ return T_DOSWAP(dwFormat) ? TYPE_KYMC8_8 : TYPE_CMYK8_8;
+ case cmsSigMCH9Data:
+ return T_DOSWAP(dwFormat) ? TYPE_KYMC9_8 : TYPE_CMYK9_8;
+ case cmsSigMCHAData:
+ return T_DOSWAP(dwFormat) ? TYPE_KYMC10_8 : TYPE_CMYK10_8;
+ case cmsSigMCHBData:
+ return T_DOSWAP(dwFormat) ? TYPE_KYMC11_8 : TYPE_CMYK11_8;
+ case cmsSigMCHCData:
+ return T_DOSWAP(dwFormat) ? TYPE_KYMC12_8 : TYPE_CMYK12_8;
+ default:
+ return 0;
+ }
+}
+class CFX_IccProfileCache : public CFX_Object
+{
+public:
+ CFX_IccProfileCache();
+ ~CFX_IccProfileCache();
+ FX_LPVOID m_pProfile;
+ FX_DWORD m_dwRate;
+protected:
+ void Purge();
+};
+CFX_IccProfileCache::CFX_IccProfileCache()
+{
+ m_pProfile = NULL;
+ m_dwRate = 1;
+}
+CFX_IccProfileCache::~CFX_IccProfileCache()
+{
+ if (m_pProfile) {
+ cmsCloseProfile(m_pProfile);
+ }
+}
+void CFX_IccProfileCache::Purge()
+{
+}
+class CFX_IccTransformCache : public CFX_Object
+{
+public:
+ CFX_IccTransformCache(CLcmsCmm* pCmm = NULL);
+ ~CFX_IccTransformCache();
+ FX_LPVOID m_pIccTransform;
+ FX_DWORD m_dwRate;
+ CLcmsCmm* m_pCmm;
+protected:
+ void Purge();
+};
+CFX_IccTransformCache::CFX_IccTransformCache(CLcmsCmm* pCmm)
+{
+ m_pIccTransform = NULL;
+ m_dwRate = 1;
+ m_pCmm = pCmm;
+}
+CFX_IccTransformCache::~CFX_IccTransformCache()
+{
+ if (m_pIccTransform) {
+ cmsDeleteTransform(m_pIccTransform);
+ }
+ if (m_pCmm) {
+ FX_Free(m_pCmm);
+ }
+}
+void CFX_IccTransformCache::Purge()
+{
+}
+class CFX_ByteStringKey : public CFX_BinaryBuf
+{
+public:
+ CFX_ByteStringKey() : CFX_BinaryBuf() {}
+ CFX_ByteStringKey& operator << (FX_DWORD i);
+};
+CFX_ByteStringKey& CFX_ByteStringKey::operator << (FX_DWORD i)
+{
+ AppendBlock(&i, sizeof(FX_DWORD));
+ return *this;
+}
+FX_LPVOID CCodec_IccModule::CreateProfile(ICodec_IccModule::IccParam* pIccParam, Icc_CLASS ic, CFX_BinaryBuf* pTransformKey)
+{
+ CFX_IccProfileCache* pCache = NULL;
+ CFX_ByteStringKey key;
+ CFX_ByteString text;
+ key << pIccParam->ColorSpace << (pIccParam->dwProfileType | ic << 8);
+ FX_BYTE ID[16];
+ switch (pIccParam->dwProfileType) {
+ case Icc_PARAMTYPE_NONE:
+ return NULL;
+ case Icc_PARAMTYPE_BUFFER:
+ MD5ComputeID(pIccParam->pProfileData, pIccParam->dwProfileSize, ID);
+ break;
+ case Icc_PARAMTYPE_PARAM:
+ FXSYS_memset32(ID, 0, 16);
+ switch (pIccParam->ColorSpace) {
+ case IccCS_Gray:
+ text.Format("%lf", pIccParam->Gamma);
+ break;
+ default:
+ ;
+ }
+ MD5ComputeID(text.GetBuffer(0), text.GetLength(), ID);
+ break;
+ default:
+ ;
+ }
+ key.AppendBlock(ID, 16);
+ CFX_ByteString ProfileKey(key.GetBuffer(), key.GetSize());
+ ASSERT(pTransformKey);
+ pTransformKey->AppendBlock(ProfileKey.GetBuffer(0), ProfileKey.GetLength());
+ if (!m_MapProfile.Lookup(ProfileKey, (FX_LPVOID&)pCache)) {
+ pCache = FX_NEW CFX_IccProfileCache;
+ if (pCache == NULL) {
+ return NULL;
+ }
+ switch (pIccParam->dwProfileType) {
+ case Icc_PARAMTYPE_BUFFER:
+ pCache->m_pProfile = cmsOpenProfileFromMem(pIccParam->pProfileData, pIccParam->dwProfileSize);
+ break;
+ case Icc_PARAMTYPE_PARAM:
+ switch (pIccParam->ColorSpace) {
+ case IccCS_Rgb:
+ pCache->m_pProfile = cmsCreate_sRGBProfile();
+ break;
+ case IccCS_Gray:
+ pCache->m_pProfile = CreateProfile_Gray(pIccParam->Gamma);
+ break;
+ default:
+ break;
+ }
+ break;
+ default:
+ break;
+ }
+ m_MapProfile.SetAt(ProfileKey, pCache);
+ } else {
+ pCache->m_dwRate++;
+ }
+ return pCache->m_pProfile;
+}
+FX_LPVOID CCodec_IccModule::CreateTransform(ICodec_IccModule::IccParam* pInputParam,
+ ICodec_IccModule::IccParam* pOutputParam,
+ ICodec_IccModule::IccParam* pProofParam,
+ FX_DWORD dwIntent, FX_DWORD dwFlag, FX_DWORD dwPrfIntent, FX_DWORD dwPrfFlag)
+{
+ CLcmsCmm* pCmm = NULL;
+ ASSERT(pInputParam && pOutputParam);
+ CFX_ByteStringKey key;
+ FX_LPVOID pInputProfile = CreateProfile(pInputParam, Icc_CLASS_INPUT, &key);
+ if (pInputProfile == NULL) {
+ return NULL;
+ }
+ FX_LPVOID pOutputProfile = CreateProfile(pOutputParam, Icc_CLASS_OUTPUT, &key);
+ if (pOutputProfile == NULL) {
+ return NULL;
+ }
+ FX_DWORD dwInputProfileType = TransferProfileType(pInputProfile, pInputParam->dwFormat);
+ FX_DWORD dwOutputProfileType = TransferProfileType(pOutputProfile, pOutputParam->dwFormat);
+ if (dwInputProfileType == 0 || dwOutputProfileType == 0) {
+ return NULL;
+ }
+ FX_LPVOID pProofProfile = NULL;
+ if (pProofParam) {
+ pProofProfile = CreateProfile(pProofParam, Icc_CLASS_PROOF, &key);
+ }
+ key << dwInputProfileType << dwOutputProfileType << dwIntent << dwFlag << (pProofProfile != NULL) << dwPrfIntent << dwPrfFlag;
+ CFX_ByteStringC TransformKey(key.GetBuffer(), key.GetSize());
+ CFX_IccTransformCache* pTransformCache;
+ if (!m_MapTranform.Lookup(TransformKey, (FX_LPVOID&)pTransformCache)) {
+ pCmm = FX_Alloc(CLcmsCmm, 1);
+ if (pCmm == NULL) {
+ return NULL;
+ }
+ pCmm->m_nSrcComponents = T_CHANNELS(dwInputProfileType);
+ pCmm->m_nDstComponents = T_CHANNELS(dwOutputProfileType);
+ pCmm->m_bLab = T_COLORSPACE(pInputParam->dwFormat) == PT_Lab;
+ pTransformCache = FX_NEW CFX_IccTransformCache(pCmm);
+ if (pTransformCache == NULL) {
+ FX_Free(pCmm);
+ return NULL;
+ }
+ if (pProofProfile) {
+ pTransformCache->m_pIccTransform = cmsCreateProofingTransform(pInputProfile, dwInputProfileType, pOutputProfile, dwOutputProfileType,
+ pProofProfile, dwIntent, dwPrfIntent, dwPrfFlag);
+ } else {
+ pTransformCache->m_pIccTransform = cmsCreateTransform(pInputProfile, dwInputProfileType, pOutputProfile, dwOutputProfileType,
+ dwIntent, dwFlag);
+ }
+ pCmm->m_hTransform = pTransformCache->m_pIccTransform;
+ m_MapTranform.SetAt(TransformKey, pTransformCache);
+ } else {
+ pTransformCache->m_dwRate++;
+ }
+ return pTransformCache->m_pCmm;
+}
+CCodec_IccModule::~CCodec_IccModule()
+{
+ FX_POSITION pos = m_MapProfile.GetStartPosition();
+ CFX_ByteString key;
+ CFX_IccProfileCache* pProfileCache;
+ while (pos) {
+ m_MapProfile.GetNextAssoc(pos, key, (FX_LPVOID&)pProfileCache);
+ if (pProfileCache) {
+ delete pProfileCache;
+ }
+ }
+ pos = m_MapTranform.GetStartPosition();
+ CFX_IccTransformCache* pTransformCache;
+ while (pos) {
+ m_MapTranform.GetNextAssoc(pos, key, (FX_LPVOID&)pTransformCache);
+ if (pTransformCache) {
+ delete pTransformCache;
+ }
+ }
+}
+void* CCodec_IccModule::CreateTransform_sRGB(FX_LPCBYTE pProfileData, unsigned int dwProfileSize, int nComponents, int intent, FX_DWORD dwSrcFormat)
+{
+ return IccLib_CreateTransform_sRGB(pProfileData, dwProfileSize, nComponents, intent, dwSrcFormat);
+}
+void* CCodec_IccModule::CreateTransform_CMYK(FX_LPCBYTE pSrcProfileData, unsigned int dwSrcProfileSize, int nSrcComponents,
+ FX_LPCBYTE pDstProfileData, unsigned int dwDstProfileSize, int intent,
+ FX_DWORD dwSrcFormat , FX_DWORD dwDstFormat)
+{
+ return IccLib_CreateTransform(pSrcProfileData, dwSrcProfileSize, nSrcComponents,
+ pDstProfileData, dwDstProfileSize, 4, intent, dwSrcFormat, dwDstFormat);
+}
+void CCodec_IccModule::DestroyTransform(void* pTransform)
+{
+ IccLib_DestroyTransform(pTransform);
+}
+void CCodec_IccModule::Translate(void* pTransform, FX_FLOAT* pSrcValues, FX_FLOAT* pDestValues)
+{
+ IccLib_Translate(pTransform, pSrcValues, pDestValues);
+}
+void CCodec_IccModule::TranslateScanline(void* pTransform, FX_LPBYTE pDest, FX_LPCBYTE pSrc, int pixels)
+{
+ IccLib_TranslateImage(pTransform, pDest, pSrc, pixels);
+}
+const FX_BYTE g_CMYKSamples[81 * 81 * 3] = {
+ 255, 255, 255, 225, 226, 228, 199, 200, 202, 173, 174, 178, 147, 149, 152, 123, 125, 128, 99, 99, 102, 69, 70, 71, 34, 30, 31,
+ 255, 253, 229, 226, 224, 203, 200, 199, 182, 173, 173, 158, 149, 148, 135, 125, 124, 113, 99, 99, 90, 70, 69, 63, 33, 29, 24,
+ 255, 251, 204, 228, 223, 182, 201, 198, 163, 174, 172, 142, 150, 147, 122, 125, 123, 101, 99, 98, 80, 70, 68, 54, 32, 28, 16,
+ 255, 249, 179, 230, 222, 160, 203, 197, 144, 174, 170, 124, 150, 145, 105, 125, 122, 88, 99, 97, 69, 70, 68, 46, 31, 28, 6,
+ 255, 247, 154, 229, 220, 138, 203, 195, 122, 176, 169, 107, 150, 145, 91, 125, 121, 74, 100, 96, 57, 70, 67, 35, 29, 26, 0,
+ 255, 246, 128, 231, 217, 114, 205, 194, 101, 176, 167, 88, 150, 144, 75, 125, 120, 60, 100, 96, 44, 70, 66, 24, 28, 26, 0,
+ 255, 244, 96, 231, 217, 87, 203, 192, 78, 175, 167, 66, 150, 143, 56, 125, 119, 43, 100, 95, 29, 69, 66, 7, 26, 26, 0,
+ 255, 243, 51, 232, 215, 51, 204, 191, 43, 176, 165, 38, 150, 142, 28, 125, 118, 17, 99, 94, 0, 68, 65, 0, 24, 25, 0,
+ 255, 241, 0, 231, 215, 0, 203, 190, 0, 176, 164, 0, 150, 141, 0, 126, 117, 0, 99, 93, 0, 68, 65, 0, 24, 25, 0,
+ 252, 228, 238, 222, 201, 211, 197, 180, 190, 171, 156, 166, 147, 133, 143, 123, 111, 119, 99, 88, 94, 71, 61, 66, 34, 22, 26,
+ 254, 226, 213, 224, 201, 191, 199, 179, 171, 172, 155, 148, 147, 133, 128, 123, 110, 106, 98, 87, 83, 70, 59, 57, 33, 21, 18,
+ 254, 224, 191, 224, 199, 172, 200, 177, 153, 173, 154, 133, 147, 132, 115, 123, 109, 94, 98, 86, 74, 70, 59, 49, 32, 21, 9,
+ 255, 222, 168, 227, 198, 150, 200, 175, 135, 173, 153, 118, 148, 130, 99, 123, 109, 82, 98, 86, 64, 69, 58, 40, 31, 19, 0,
+ 255, 221, 145, 227, 196, 129, 201, 174, 115, 173, 151, 99, 148, 129, 85, 124, 108, 69, 98, 85, 52, 69, 58, 30, 30, 19, 0,
+ 255, 219, 121, 227, 195, 109, 201, 174, 97, 174, 150, 83, 148, 129, 70, 124, 107, 55, 98, 84, 40, 69, 58, 19, 28, 18, 0,
+ 255, 218, 92, 229, 194, 82, 202, 173, 75, 174, 150, 63, 149, 128, 51, 124, 106, 39, 98, 84, 24, 68, 57, 3, 26, 18, 0,
+ 255, 217, 54, 228, 193, 52, 201, 172, 46, 174, 148, 36, 148, 127, 27, 123, 105, 14, 98, 83, 0, 68, 56, 0, 25, 18, 0,
+ 255, 216, 0, 229, 192, 2, 202, 171, 4, 173, 148, 0, 148, 126, 0, 124, 105, 0, 98, 83, 0, 68, 56, 0, 24, 17, 0,
+ 249, 204, 223, 219, 181, 199, 195, 160, 178, 170, 140, 156, 146, 119, 134, 123, 99, 112, 98, 77, 88, 70, 52, 61, 34, 11, 20,
+ 250, 201, 200, 221, 180, 178, 197, 159, 161, 171, 139, 139, 147, 119, 120, 123, 98, 99, 98, 77, 78, 69, 51, 52, 34, 11, 10,
+ 252, 201, 180, 223, 179, 162, 197, 159, 144, 170, 138, 125, 146, 117, 107, 122, 97, 89, 98, 76, 69, 69, 50, 44, 32, 11, 2,
+ 252, 199, 158, 222, 177, 143, 199, 158, 127, 171, 137, 110, 147, 117, 93, 122, 96, 76, 97, 75, 58, 69, 50, 36, 32, 10, 0,
+ 253, 198, 137, 223, 177, 123, 198, 156, 110, 171, 136, 95, 146, 116, 80, 122, 96, 65, 97, 75, 47, 69, 50, 25, 30, 10, 0,
+ 254, 197, 115, 225, 175, 104, 198, 156, 92, 172, 135, 79, 147, 115, 66, 123, 95, 52, 98, 74, 37, 69, 49, 15, 29, 10, 0,
+ 254, 196, 89, 224, 175, 80, 199, 154, 70, 172, 134, 59, 146, 114, 48, 122, 95, 36, 97, 74, 21, 68, 49, 0, 27, 9, 0,
+ 255, 195, 57, 225, 173, 52, 198, 154, 44, 172, 133, 36, 147, 113, 26, 123, 94, 14, 98, 74, 0, 68, 49, 0, 26, 10, 0,
+ 254, 194, 15, 225, 172, 12, 198, 153, 7, 172, 132, 3, 146, 113, 0, 123, 93, 0, 98, 73, 0, 68, 49, 0, 26, 9, 0,
+ 246, 178, 209, 218, 159, 186, 194, 140, 166, 168, 122, 145, 144, 104, 125, 121, 85, 103, 97, 65, 81, 69, 41, 55, 34, 0, 12,
+ 248, 176, 186, 219, 157, 166, 195, 139, 149, 168, 121, 130, 144, 103, 111, 121, 85, 91, 97, 65, 71, 69, 41, 46, 34, 0, 4,
+ 249, 175, 168, 220, 156, 150, 196, 139, 135, 169, 121, 116, 144, 103, 100, 122, 84, 83, 98, 65, 63, 70, 41, 39, 33, 0, 0,
+ 249, 175, 148, 220, 155, 133, 196, 138, 119, 169, 120, 103, 145, 101, 87, 121, 83, 71, 97, 65, 54, 69, 41, 31, 32, 0, 0,
+ 249, 173, 128, 222, 154, 115, 195, 137, 102, 170, 119, 88, 145, 101, 74, 122, 83, 59, 97, 64, 43, 68, 40, 20, 30, 0, 0,
+ 250, 172, 108, 221, 154, 98, 195, 136, 86, 170, 118, 73, 145, 100, 61, 122, 82, 48, 97, 63, 32, 69, 40, 11, 28, 0, 0,
+ 250, 171, 85, 221, 153, 76, 196, 136, 67, 170, 117, 56, 145, 99, 44, 121, 82, 33, 97, 63, 17, 68, 40, 0, 28, 0, 0,
+ 251, 171, 58, 222, 152, 50, 197, 135, 43, 169, 117, 34, 146, 99, 25, 121, 81, 10, 96, 63, 0, 68, 40, 0, 27, 0, 0,
+ 250, 170, 26, 222, 151, 19, 196, 134, 13, 169, 116, 4, 145, 99, 0, 122, 81, 0, 97, 63, 0, 67, 40, 0, 26, 0, 0,
+ 244, 153, 194, 215, 136, 173, 192, 121, 155, 167, 104, 135, 143, 89, 115, 121, 72, 96, 97, 54, 75, 70, 31, 49, 34, 0, 6,
+ 245, 153, 173, 216, 136, 155, 192, 120, 138, 167, 104, 121, 144, 88, 103, 121, 71, 85, 97, 54, 66, 69, 31, 42, 34, 0, 0,
+ 246, 152, 157, 217, 135, 140, 193, 120, 126, 167, 103, 109, 143, 88, 92, 121, 72, 76, 97, 54, 58, 69, 31, 35, 33, 0, 0,
+ 245, 150, 139, 218, 134, 125, 193, 119, 111, 167, 103, 96, 144, 87, 80, 121, 71, 66, 96, 53, 49, 68, 31, 26, 32, 0, 0,
+ 246, 151, 122, 218, 133, 108, 194, 118, 96, 168, 102, 81, 144, 86, 69, 120, 71, 55, 95, 53, 39, 68, 30, 17, 31, 0, 0,
+ 248, 150, 103, 218, 133, 91, 193, 118, 81, 168, 102, 69, 143, 86, 56, 120, 70, 43, 96, 53, 28, 68, 31, 6, 29, 0, 0,
+ 247, 149, 81, 218, 132, 72, 194, 117, 62, 168, 101, 52, 144, 86, 42, 121, 70, 29, 96, 52, 13, 68, 30, 0, 28, 0, 0,
+ 247, 148, 55, 219, 131, 50, 194, 117, 43, 167, 101, 32, 144, 85, 22, 120, 69, 8, 96, 52, 0, 67, 30, 0, 27, 0, 0,
+ 247, 147, 29, 218, 131, 24, 194, 116, 20, 168, 100, 11, 144, 85, 0, 120, 69, 0, 96, 52, 0, 67, 30, 0, 26, 0, 0,
+ 242, 130, 179, 214, 114, 160, 190, 101, 143, 166, 87, 125, 143, 72, 107, 120, 58, 88, 96, 42, 68, 69, 17, 44, 35, 0, 0,
+ 243, 129, 161, 215, 114, 143, 191, 101, 128, 166, 87, 113, 143, 73, 96, 120, 58, 79, 96, 41, 60, 69, 18, 37, 33, 0, 0,
+ 243, 129, 146, 216, 114, 130, 192, 101, 117, 166, 87, 101, 143, 72, 86, 121, 58, 69, 96, 42, 52, 69, 18, 29, 31, 0, 0,
+ 243, 128, 130, 216, 114, 115, 191, 101, 102, 165, 86, 88, 142, 72, 75, 120, 58, 60, 95, 42, 43, 68, 19, 21, 30, 0, 0,
+ 244, 127, 112, 217, 113, 101, 192, 99, 89, 166, 85, 75, 142, 72, 63, 119, 57, 50, 96, 41, 35, 68, 19, 13, 30, 0, 0,
+ 244, 127, 96, 216, 112, 86, 191, 99, 75, 166, 86, 64, 143, 72, 52, 120, 57, 40, 95, 41, 24, 67, 20, 1, 29, 0, 0,
+ 245, 126, 77, 216, 113, 68, 191, 100, 59, 166, 85, 49, 142, 71, 38, 119, 57, 26, 95, 41, 10, 67, 20, 0, 28, 0, 0,
+ 244, 126, 55, 216, 112, 48, 191, 99, 40, 166, 85, 31, 143, 71, 20, 119, 57, 6, 95, 42, 0, 67, 20, 0, 28, 0, 0,
+ 245, 126, 33, 217, 112, 26, 192, 99, 22, 166, 84, 11, 142, 70, 0, 119, 57, 0, 95, 41, 0, 66, 20, 0, 27, 0, 0,
+ 241, 102, 167, 213, 90, 149, 189, 79, 133, 165, 66, 115, 141, 54, 98, 119, 41, 81, 96, 25, 63, 69, 0, 38, 30, 0, 0,
+ 241, 102, 149, 213, 90, 133, 189, 79, 119, 165, 66, 103, 142, 55, 88, 119, 41, 71, 96, 25, 53, 69, 0, 31, 28, 0, 0,
+ 241, 102, 135, 214, 90, 121, 190, 79, 108, 165, 66, 92, 141, 55, 78, 119, 42, 63, 96, 26, 46, 69, 0, 24, 28, 0, 0,
+ 241, 101, 120, 214, 90, 107, 189, 79, 95, 165, 67, 83, 141, 54, 68, 118, 41, 54, 95, 27, 39, 68, 0, 16, 27, 0, 0,
+ 241, 102, 106, 213, 90, 93, 189, 78, 82, 164, 67, 70, 141, 55, 58, 118, 42, 45, 94, 27, 29, 67, 2, 6, 27, 0, 0,
+ 242, 101, 90, 214, 89, 79, 190, 79, 69, 166, 67, 59, 141, 55, 47, 118, 41, 35, 95, 27, 19, 67, 3, 0, 26, 0, 0,
+ 242, 102, 72, 213, 89, 63, 191, 79, 56, 164, 67, 45, 141, 55, 34, 118, 42, 22, 94, 28, 6, 67, 3, 0, 26, 0, 0,
+ 242, 100, 51, 214, 89, 45, 190, 78, 38, 164, 67, 30, 141, 55, 18, 118, 42, 3, 95, 28, 0, 66, 4, 0, 26, 0, 0,
+ 243, 100, 33, 214, 90, 27, 190, 78, 22, 165, 67, 13, 141, 55, 0, 118, 43, 0, 94, 29, 0, 66, 5, 0, 26, 0, 0,
+ 237, 69, 153, 211, 58, 135, 187, 51, 121, 163, 41, 105, 141, 28, 90, 118, 15, 73, 96, 0, 56, 68, 0, 33, 25, 0, 0,
+ 239, 67, 137, 212, 60, 123, 189, 50, 110, 163, 41, 94, 141, 29, 79, 118, 17, 65, 95, 0, 48, 69, 0, 26, 25, 0, 0,
+ 240, 69, 124, 211, 60, 111, 188, 50, 98, 163, 42, 85, 141, 31, 72, 118, 18, 57, 94, 0, 41, 68, 0, 19, 25, 0, 0,
+ 240, 70, 112, 212, 61, 99, 188, 52, 87, 163, 41, 74, 140, 31, 62, 118, 20, 48, 94, 2, 32, 68, 0, 11, 24, 0, 0,
+ 239, 70, 98, 212, 62, 86, 188, 53, 77, 164, 42, 64, 140, 32, 52, 118, 20, 40, 94, 3, 24, 67, 0, 3, 23, 0, 0,
+ 239, 71, 85, 212, 61, 74, 187, 53, 65, 163, 44, 54, 140, 34, 43, 118, 22, 30, 95, 3, 14, 67, 0, 0, 23, 0, 0,
+ 239, 70, 67, 212, 62, 59, 188, 53, 51, 163, 45, 42, 141, 34, 31, 117, 22, 17, 94, 5, 2, 66, 0, 0, 23, 0, 0,
+ 239, 71, 50, 213, 62, 43, 188, 54, 37, 164, 45, 28, 139, 34, 16, 117, 22, 2, 94, 7, 0, 65, 0, 0, 23, 0, 0,
+ 240, 71, 34, 212, 63, 29, 189, 54, 24, 163, 46, 15, 139, 36, 2, 117, 25, 0, 94, 8, 0, 66, 0, 0, 23, 0, 0,
+ 237, 0, 140, 209, 0, 124, 186, 0, 112, 162, 0, 97, 141, 0, 82, 118, 0, 67, 95, 0, 49, 68, 0, 27, 20, 0, 0,
+ 237, 0, 126, 210, 0, 113, 187, 0, 99, 163, 0, 86, 139, 0, 72, 118, 0, 58, 95, 0, 42, 67, 0, 20, 20, 0, 0,
+ 237, 1, 114, 209, 1, 102, 187, 0, 90, 163, 0, 78, 139, 0, 64, 118, 0, 50, 95, 0, 35, 67, 0, 13, 20, 0, 0,
+ 236, 16, 102, 209, 7, 91, 186, 0, 80, 162, 0, 68, 139, 0, 56, 117, 0, 43, 94, 0, 27, 67, 0, 6, 20, 0, 0,
+ 238, 15, 89, 209, 13, 79, 186, 6, 69, 162, 0, 58, 139, 0, 47, 117, 0, 34, 93, 0, 20, 66, 0, 2, 20, 0, 0,
+ 237, 20, 78, 210, 12, 68, 187, 4, 59, 163, 0, 49, 139, 0, 38, 116, 0, 26, 94, 0, 11, 66, 0, 0, 20, 0, 0,
+ 237, 25, 64, 210, 18, 56, 186, 11, 48, 162, 4, 39, 138, 0, 27, 117, 0, 14, 93, 0, 0, 66, 0, 0, 20, 0, 0,
+ 238, 25, 48, 210, 22, 43, 186, 15, 35, 162, 8, 26, 140, 0, 14, 117, 0, 0, 93, 0, 0, 65, 0, 0, 20, 0, 0,
+ 238, 28, 35, 210, 21, 30, 187, 15, 24, 162, 8, 16, 139, 1, 2, 117, 0, 0, 93, 0, 0, 65, 0, 0, 22, 0, 0,
+ 219, 242, 252, 195, 214, 225, 172, 191, 201, 148, 165, 175, 127, 142, 150, 106, 119, 126, 84, 95, 101, 58, 66, 72, 24, 27, 32,
+ 222, 239, 226, 196, 213, 202, 173, 189, 180, 150, 165, 158, 129, 141, 135, 107, 118, 113, 85, 94, 90, 58, 66, 63, 21, 26, 24,
+ 223, 237, 203, 198, 211, 182, 175, 188, 163, 152, 164, 141, 129, 140, 121, 107, 117, 101, 85, 93, 80, 58, 64, 54, 21, 26, 18,
+ 226, 236, 179, 201, 210, 160, 177, 187, 143, 153, 162, 125, 130, 139, 106, 108, 116, 89, 85, 92, 69, 58, 64, 45, 20, 25, 8,
+ 227, 234, 153, 201, 208, 139, 178, 185, 124, 154, 161, 107, 131, 138, 91, 108, 115, 75, 85, 91, 58, 58, 63, 35, 17, 25, 0,
+ 229, 233, 130, 203, 207, 116, 178, 184, 104, 154, 160, 90, 131, 137, 76, 109, 114, 62, 85, 90, 46, 58, 63, 25, 16, 24, 0,
+ 230, 231, 100, 202, 205, 90, 179, 183, 80, 154, 159, 69, 131, 136, 57, 109, 113, 46, 86, 90, 32, 58, 63, 10, 14, 24, 0,
+ 230, 230, 65, 204, 204, 58, 180, 182, 52, 155, 157, 44, 132, 135, 35, 110, 113, 24, 86, 89, 9, 57, 62, 0, 11, 24, 0,
+ 232, 230, 19, 204, 204, 19, 180, 181, 17, 155, 157, 10, 131, 134, 2, 109, 112, 0, 85, 89, 0, 57, 62, 0, 10, 23, 0,
+ 218, 216, 236, 194, 192, 211, 172, 171, 188, 149, 149, 164, 128, 127, 141, 106, 106, 119, 84, 84, 94, 59, 57, 66, 25, 18, 26,
+ 221, 214, 211, 196, 191, 190, 174, 170, 170, 150, 148, 148, 128, 126, 127, 107, 105, 106, 85, 83, 84, 59, 56, 58, 23, 17, 18,
+ 222, 213, 190, 197, 189, 170, 175, 169, 153, 151, 147, 133, 129, 126, 113, 108, 105, 94, 85, 82, 74, 59, 56, 49, 22, 17, 11,
+ 224, 211, 168, 199, 188, 151, 175, 168, 135, 152, 146, 117, 129, 124, 99, 107, 103, 82, 84, 82, 64, 59, 55, 41, 21, 17, 1,
+ 224, 210, 145, 199, 187, 130, 176, 166, 117, 152, 145, 101, 129, 123, 86, 107, 103, 70, 85, 81, 53, 58, 55, 31, 19, 17, 0,
+ 227, 208, 123, 200, 186, 110, 177, 165, 98, 153, 143, 84, 130, 122, 70, 108, 102, 57, 85, 80, 41, 58, 54, 20, 18, 16, 0,
+ 227, 208, 97, 202, 185, 86, 177, 164, 77, 153, 142, 65, 130, 122, 54, 108, 101, 42, 85, 80, 27, 58, 54, 7, 16, 16, 0,
+ 228, 206, 66, 202, 184, 58, 178, 163, 50, 154, 141, 42, 131, 121, 33, 109, 101, 21, 86, 79, 5, 58, 54, 0, 13, 16, 0,
+ 228, 206, 29, 202, 183, 25, 178, 163, 20, 154, 141, 15, 131, 121, 5, 108, 100, 0, 85, 79, 0, 58, 53, 0, 13, 16, 0,
+ 217, 193, 221, 193, 172, 198, 172, 153, 178, 149, 133, 154, 128, 114, 132, 107, 94, 111, 85, 74, 89, 59, 49, 61, 25, 8, 22,
+ 219, 191, 198, 195, 171, 178, 173, 153, 159, 149, 132, 139, 128, 113, 119, 107, 94, 100, 85, 73, 79, 59, 48, 52, 25, 7, 14,
+ 221, 191, 180, 196, 170, 160, 174, 152, 144, 150, 132, 125, 129, 113, 107, 107, 93, 89, 85, 73, 69, 59, 48, 45, 23, 7, 4,
+ 222, 189, 159, 197, 169, 142, 174, 151, 127, 151, 131, 110, 129, 112, 94, 108, 93, 78, 85, 72, 60, 58, 47, 37, 22, 7, 0,
+ 223, 188, 138, 197, 168, 123, 175, 150, 109, 151, 130, 95, 130, 111, 81, 108, 92, 65, 85, 72, 49, 59, 47, 27, 21, 7, 0,
+ 224, 187, 118, 198, 167, 105, 176, 149, 93, 152, 129, 79, 130, 110, 68, 108, 91, 54, 85, 71, 38, 59, 47, 17, 18, 7, 0,
+ 224, 187, 93, 199, 166, 83, 176, 148, 73, 152, 128, 62, 129, 109, 51, 108, 90, 39, 85, 71, 25, 58, 46, 3, 16, 8, 0,
+ 226, 186, 64, 200, 165, 57, 177, 147, 50, 153, 127, 40, 130, 108, 31, 108, 90, 19, 85, 70, 3, 58, 46, 0, 16, 8, 0,
+ 227, 185, 35, 200, 165, 30, 176, 146, 25, 152, 127, 18, 130, 108, 7, 108, 89, 0, 85, 70, 0, 57, 46, 0, 14, 8, 0,
+ 216, 169, 205, 192, 150, 184, 171, 134, 164, 149, 116, 144, 128, 99, 124, 107, 81, 103, 85, 63, 81, 60, 39, 55, 26, 0, 15,
+ 217, 168, 186, 193, 150, 165, 172, 134, 149, 150, 116, 130, 128, 99, 111, 107, 81, 92, 85, 62, 72, 59, 39, 47, 25, 0, 6,
+ 219, 168, 168, 194, 149, 150, 173, 133, 135, 150, 116, 117, 128, 98, 99, 107, 80, 82, 86, 62, 63, 59, 38, 39, 24, 0, 0,
+ 219, 166, 148, 195, 149, 133, 173, 133, 119, 150, 115, 103, 128, 98, 88, 107, 80, 72, 85, 61, 54, 59, 38, 32, 23, 0, 0,
+ 220, 166, 129, 196, 148, 116, 174, 132, 103, 151, 114, 89, 129, 97, 75, 107, 79, 60, 85, 61, 44, 59, 38, 22, 21, 0, 0,
+ 222, 164, 110, 197, 147, 99, 175, 131, 87, 151, 113, 75, 129, 96, 63, 107, 79, 49, 85, 61, 33, 58, 38, 12, 19, 0, 0,
+ 222, 164, 88, 197, 146, 79, 174, 130, 69, 151, 113, 58, 129, 95, 47, 107, 78, 35, 85, 60, 20, 58, 38, 0, 18, 0, 0,
+ 223, 164, 63, 198, 145, 55, 175, 129, 48, 151, 112, 39, 129, 95, 29, 107, 78, 16, 85, 60, 1, 58, 38, 0, 17, 0, 0,
+ 223, 163, 36, 198, 145, 32, 174, 129, 26, 151, 111, 17, 129, 95, 7, 107, 78, 0, 84, 60, 0, 57, 37, 0, 15, 0, 0,
+ 215, 147, 192, 191, 130, 172, 170, 116, 153, 148, 100, 133, 127, 85, 115, 107, 69, 96, 85, 51, 75, 60, 28, 50, 25, 0, 8,
+ 217, 146, 173, 192, 130, 154, 171, 115, 138, 149, 100, 121, 128, 84, 103, 107, 68, 85, 85, 51, 66, 60, 28, 42, 25, 0, 0,
+ 217, 145, 157, 193, 129, 140, 173, 115, 125, 149, 100, 109, 128, 84, 92, 107, 68, 76, 85, 51, 58, 59, 28, 35, 23, 0, 0,
+ 218, 145, 140, 193, 129, 125, 172, 114, 110, 149, 99, 96, 128, 83, 81, 107, 67, 65, 84, 51, 49, 59, 29, 27, 22, 0, 0,
+ 219, 144, 121, 194, 128, 108, 172, 113, 96, 149, 98, 83, 128, 83, 69, 107, 68, 55, 85, 50, 40, 59, 28, 18, 20, 0, 0,
+ 220, 143, 104, 195, 128, 93, 173, 114, 82, 150, 98, 69, 127, 82, 58, 107, 67, 45, 85, 50, 30, 59, 28, 7, 19, 0, 0,
+ 220, 143, 84, 195, 127, 74, 173, 113, 65, 149, 97, 55, 128, 82, 44, 106, 67, 32, 84, 50, 16, 58, 28, 0, 18, 0, 0,
+ 221, 142, 62, 196, 126, 53, 173, 112, 46, 150, 97, 37, 128, 82, 26, 107, 66, 14, 84, 50, 0, 58, 28, 0, 16, 0, 0,
+ 222, 142, 38, 196, 126, 34, 174, 112, 27, 150, 96, 17, 128, 82, 6, 106, 66, 0, 84, 50, 0, 57, 29, 0, 16, 0, 0,
+ 214, 123, 179, 191, 110, 159, 169, 98, 143, 147, 84, 124, 126, 70, 106, 107, 55, 88, 85, 39, 69, 60, 15, 45, 23, 0, 2,
+ 216, 123, 161, 192, 110, 144, 170, 98, 129, 148, 84, 112, 127, 70, 95, 107, 55, 79, 85, 39, 61, 60, 15, 37, 20, 0, 0,
+ 217, 122, 145, 192, 110, 130, 170, 97, 116, 149, 84, 101, 127, 70, 85, 106, 55, 70, 85, 39, 53, 59, 16, 30, 19, 0, 0,
+ 217, 123, 131, 192, 109, 116, 171, 96, 103, 149, 83, 89, 127, 70, 75, 106, 55, 60, 85, 40, 45, 59, 16, 23, 17, 0, 0,
+ 217, 122, 114, 193, 109, 101, 172, 96, 91, 149, 82, 77, 128, 69, 64, 106, 55, 50, 84, 39, 35, 59, 17, 14, 17, 0, 0,
+ 218, 122, 98, 194, 108, 87, 171, 96, 77, 149, 82, 65, 127, 69, 52, 106, 55, 40, 84, 40, 25, 59, 18, 3, 15, 0, 0,
+ 219, 122, 80, 193, 108, 70, 172, 95, 61, 149, 82, 51, 127, 69, 40, 106, 55, 28, 84, 39, 12, 58, 17, 0, 13, 0, 0,
+ 219, 121, 59, 194, 108, 52, 172, 96, 44, 149, 82, 35, 127, 68, 24, 106, 55, 11, 84, 40, 0, 57, 18, 0, 13, 0, 0,
+ 219, 121, 40, 193, 108, 33, 172, 95, 26, 149, 81, 19, 128, 68, 6, 106, 54, 0, 84, 39, 0, 57, 18, 0, 13, 0, 0,
+ 213, 99, 165, 189, 87, 148, 169, 76, 132, 147, 64, 115, 126, 52, 98, 106, 39, 81, 85, 23, 63, 60, 0, 39, 16, 0, 0,
+ 214, 98, 149, 191, 87, 133, 170, 76, 119, 148, 65, 103, 127, 53, 88, 106, 39, 72, 85, 24, 55, 60, 0, 32, 15, 0, 0,
+ 215, 99, 136, 191, 87, 121, 170, 77, 108, 148, 65, 93, 126, 53, 79, 106, 40, 64, 85, 24, 47, 59, 0, 25, 14, 0, 0,
+ 215, 99, 121, 192, 87, 108, 170, 77, 96, 148, 65, 82, 126, 53, 69, 106, 40, 55, 85, 25, 39, 59, 0, 18, 13, 0, 0,
+ 216, 99, 106, 191, 87, 95, 170, 76, 83, 148, 65, 71, 126, 53, 58, 106, 41, 45, 85, 26, 30, 59, 0, 8, 11, 0, 0,
+ 216, 98, 91, 192, 88, 82, 170, 77, 71, 148, 65, 60, 127, 53, 48, 105, 41, 36, 83, 26, 21, 58, 1, 2, 11, 0, 0,
+ 217, 99, 75, 192, 87, 66, 170, 76, 57, 148, 65, 47, 126, 53, 36, 105, 41, 24, 83, 26, 8, 57, 2, 0, 9, 0, 0,
+ 217, 98, 57, 192, 87, 49, 171, 77, 41, 147, 65, 32, 126, 53, 21, 105, 41, 8, 84, 27, 0, 57, 3, 0, 9, 0, 0,
+ 217, 98, 40, 193, 87, 34, 171, 76, 27, 148, 65, 19, 126, 53, 6, 105, 41, 0, 83, 27, 0, 57, 4, 0, 9, 0, 0,
+ 211, 67, 152, 189, 58, 136, 168, 50, 122, 147, 39, 105, 127, 28, 89, 106, 14, 74, 85, 0, 56, 59, 0, 33, 9, 0, 0,
+ 213, 68, 138, 190, 59, 123, 169, 51, 109, 148, 40, 95, 126, 30, 80, 106, 16, 65, 85, 0, 48, 59, 0, 27, 9, 0, 0,
+ 214, 69, 125, 190, 59, 111, 168, 51, 99, 148, 41, 86, 126, 31, 72, 106, 18, 58, 85, 0, 41, 59, 0, 20, 7, 0, 0,
+ 215, 70, 112, 190, 61, 100, 169, 52, 88, 147, 42, 76, 126, 32, 63, 106, 19, 49, 84, 1, 34, 58, 0, 13, 7, 0, 0,
+ 214, 70, 99, 190, 62, 88, 169, 53, 77, 147, 43, 65, 125, 32, 53, 106, 20, 40, 84, 3, 26, 58, 0, 4, 7, 0, 0,
+ 214, 71, 86, 190, 61, 75, 169, 53, 65, 146, 43, 54, 126, 33, 44, 105, 21, 31, 83, 4, 17, 57, 0, 0, 7, 0, 0,
+ 215, 71, 71, 191, 62, 62, 169, 53, 53, 147, 44, 44, 126, 34, 33, 105, 22, 20, 83, 5, 4, 57, 0, 0, 7, 0, 0,
+ 215, 71, 54, 191, 62, 47, 169, 54, 39, 147, 44, 30, 126, 35, 20, 105, 23, 6, 83, 6, 0, 56, 0, 0, 5, 0, 0,
+ 215, 71, 41, 191, 63, 34, 170, 54, 27, 147, 45, 17, 126, 35, 6, 105, 23, 0, 83, 8, 0, 56, 0, 0, 5, 0, 0,
+ 210, 13, 140, 189, 1, 125, 167, 0, 110, 146, 0, 96, 126, 0, 81, 106, 0, 67, 85, 0, 51, 59, 0, 28, 4, 0, 0,
+ 212, 18, 126, 190, 7, 113, 168, 0, 100, 146, 0, 86, 126, 0, 73, 106, 0, 59, 84, 0, 43, 59, 0, 22, 4, 0, 0,
+ 212, 21, 115, 190, 13, 103, 168, 3, 91, 146, 0, 78, 125, 0, 65, 105, 0, 52, 84, 0, 36, 58, 0, 16, 4, 0, 0,
+ 213, 24, 103, 189, 19, 91, 168, 9, 82, 146, 0, 69, 125, 0, 57, 105, 0, 44, 84, 0, 29, 58, 0, 7, 4, 0, 0,
+ 213, 27, 92, 188, 21, 81, 168, 14, 71, 146, 1, 59, 125, 0, 48, 105, 0, 36, 84, 0, 21, 58, 0, 4, 4, 0, 0,
+ 213, 30, 80, 189, 22, 69, 168, 17, 61, 146, 5, 50, 125, 0, 39, 104, 0, 27, 83, 0, 12, 57, 0, 0, 4, 0, 0,
+ 214, 30, 67, 189, 25, 57, 168, 20, 50, 146, 9, 40, 125, 0, 29, 104, 0, 17, 83, 0, 2, 56, 0, 0, 4, 0, 0,
+ 214, 32, 53, 189, 27, 44, 169, 20, 38, 146, 13, 28, 124, 2, 17, 104, 0, 4, 83, 0, 0, 56, 0, 0, 4, 0, 0,
+ 214, 33, 41, 190, 27, 33, 168, 23, 27, 146, 13, 18, 125, 3, 5, 105, 0, 0, 83, 0, 0, 56, 0, 0, 4, 0, 0,
+ 185, 229, 250, 164, 204, 223, 146, 182, 199, 127, 158, 174, 108, 136, 149, 89, 113, 125, 70, 90, 100, 46, 62, 71, 10, 25, 33,
+ 189, 227, 225, 168, 202, 201, 148, 181, 179, 129, 157, 156, 109, 135, 134, 90, 113, 113, 70, 89, 90, 46, 62, 62, 8, 24, 25,
+ 192, 226, 202, 170, 202, 182, 151, 179, 162, 130, 156, 141, 110, 133, 121, 91, 112, 101, 71, 89, 80, 46, 61, 54, 7, 24, 19,
+ 194, 224, 179, 173, 200, 160, 153, 178, 144, 132, 155, 125, 112, 133, 107, 92, 111, 89, 71, 88, 69, 46, 61, 45, 6, 23, 10,
+ 196, 223, 155, 174, 198, 139, 154, 176, 124, 132, 153, 107, 113, 131, 91, 92, 110, 75, 72, 87, 58, 47, 60, 37, 4, 23, 0,
+ 198, 221, 131, 175, 197, 117, 155, 175, 105, 133, 152, 91, 113, 130, 76, 92, 109, 63, 72, 86, 47, 46, 60, 26, 3, 23, 0,
+ 200, 220, 104, 176, 196, 94, 156, 175, 84, 134, 151, 72, 113, 129, 59, 93, 108, 47, 72, 85, 33, 46, 59, 13, 0, 23, 0,
+ 201, 219, 73, 179, 195, 65, 157, 173, 57, 135, 150, 48, 114, 129, 39, 94, 108, 28, 72, 85, 15, 47, 59, 0, 0, 22, 0,
+ 203, 219, 42, 178, 195, 37, 157, 173, 32, 135, 150, 26, 114, 128, 16, 94, 107, 6, 73, 85, 0, 46, 58, 0, 0, 22, 0,
+ 186, 205, 233, 165, 183, 209, 148, 163, 187, 128, 142, 163, 109, 121, 140, 91, 101, 118, 71, 80, 94, 48, 54, 66, 12, 15, 27,
+ 189, 204, 211, 169, 182, 189, 151, 163, 169, 131, 141, 147, 111, 121, 126, 92, 101, 105, 72, 79, 84, 48, 54, 58, 11, 15, 19,
+ 192, 202, 190, 171, 181, 170, 152, 161, 152, 131, 141, 133, 112, 120, 113, 93, 100, 94, 72, 79, 74, 48, 53, 50, 10, 15, 11,
+ 195, 201, 169, 172, 179, 151, 153, 160, 135, 132, 139, 117, 113, 119, 100, 93, 99, 82, 72, 78, 64, 48, 53, 41, 9, 14, 3,
+ 195, 200, 146, 174, 179, 131, 154, 159, 117, 133, 138, 101, 113, 118, 86, 93, 98, 70, 73, 77, 53, 48, 52, 32, 8, 15, 0,
+ 198, 199, 125, 175, 177, 111, 155, 158, 100, 133, 137, 85, 113, 117, 71, 93, 97, 57, 72, 77, 42, 47, 52, 22, 5, 14, 0,
+ 199, 198, 101, 176, 177, 89, 155, 157, 79, 134, 136, 68, 113, 116, 56, 94, 97, 44, 73, 76, 30, 47, 52, 10, 2, 15, 0,
+ 200, 197, 72, 178, 176, 63, 157, 156, 56, 135, 136, 46, 114, 116, 37, 94, 96, 26, 73, 76, 11, 47, 51, 0, 0, 14, 0,
+ 201, 197, 45, 177, 175, 38, 156, 155, 31, 135, 135, 25, 114, 115, 17, 94, 96, 5, 73, 75, 0, 46, 51, 0, 0, 14, 0,
+ 187, 183, 218, 167, 165, 197, 149, 147, 176, 129, 127, 153, 111, 109, 132, 92, 90, 111, 73, 70, 89, 49, 46, 62, 15, 4, 22,
+ 190, 183, 197, 170, 164, 177, 151, 146, 159, 130, 127, 139, 112, 109, 119, 93, 90, 99, 72, 70, 78, 49, 45, 53, 14, 4, 15,
+ 192, 182, 179, 171, 163, 161, 153, 145, 144, 132, 126, 125, 113, 108, 107, 93, 89, 88, 73, 70, 69, 49, 45, 45, 13, 5, 6,
+ 195, 181, 159, 172, 162, 142, 152, 145, 127, 132, 125, 111, 113, 107, 94, 93, 88, 77, 73, 69, 59, 48, 45, 37, 11, 5, 0,
+ 195, 180, 139, 173, 161, 124, 153, 143, 110, 133, 125, 96, 113, 106, 81, 94, 88, 66, 73, 68, 49, 49, 44, 28, 9, 6, 0,
+ 196, 179, 118, 174, 160, 106, 154, 142, 94, 133, 124, 81, 113, 105, 68, 94, 87, 54, 73, 68, 39, 48, 44, 18, 5, 5, 0,
+ 197, 178, 96, 176, 159, 86, 155, 141, 75, 134, 123, 64, 114, 105, 53, 94, 87, 40, 73, 68, 26, 48, 44, 5, 2, 6, 0,
+ 199, 178, 70, 176, 158, 62, 156, 141, 54, 134, 122, 44, 114, 104, 35, 94, 86, 23, 73, 67, 8, 47, 44, 0, 2, 6, 0,
+ 199, 177, 45, 178, 158, 40, 156, 140, 32, 135, 122, 26, 114, 104, 16, 94, 86, 4, 73, 67, 0, 47, 44, 0, 0, 7, 0,
+ 188, 161, 204, 168, 144, 183, 149, 129, 164, 130, 112, 144, 112, 95, 123, 93, 78, 103, 74, 60, 81, 50, 36, 56, 16, 0, 16,
+ 190, 160, 185, 170, 144, 165, 151, 128, 148, 132, 111, 130, 112, 95, 110, 93, 78, 92, 74, 59, 72, 50, 36, 48, 16, 0, 8,
+ 192, 160, 167, 171, 143, 150, 153, 128, 134, 132, 111, 117, 112, 94, 100, 94, 77, 82, 74, 59, 63, 50, 36, 40, 14, 0, 0,
+ 193, 159, 149, 172, 143, 134, 153, 127, 119, 133, 110, 103, 113, 94, 87, 93, 77, 72, 73, 59, 54, 50, 36, 32, 12, 0, 0,
+ 195, 159, 131, 173, 142, 117, 153, 127, 104, 132, 110, 90, 113, 93, 76, 93, 76, 61, 74, 59, 45, 49, 36, 23, 9, 0, 0,
+ 196, 158, 113, 174, 141, 101, 155, 126, 89, 133, 109, 76, 113, 93, 64, 94, 76, 51, 74, 58, 35, 49, 36, 14, 6, 0, 0,
+ 197, 157, 92, 174, 141, 80, 154, 125, 71, 134, 108, 60, 114, 92, 50, 94, 75, 37, 73, 58, 22, 48, 36, 1, 5, 0, 0,
+ 197, 157, 68, 175, 140, 59, 155, 124, 51, 134, 108, 41, 113, 91, 32, 94, 75, 21, 73, 57, 5, 48, 35, 0, 5, 0, 0,
+ 198, 156, 46, 176, 140, 40, 155, 124, 32, 134, 107, 24, 114, 91, 14, 94, 75, 2, 73, 57, 0, 48, 36, 0, 3, 0, 0,
+ 189, 140, 191, 168, 126, 172, 150, 112, 154, 131, 97, 134, 112, 82, 115, 94, 66, 96, 74, 49, 75, 51, 25, 50, 12, 0, 10,
+ 191, 139, 173, 170, 125, 154, 152, 111, 138, 132, 96, 121, 113, 81, 103, 94, 66, 85, 74, 48, 66, 50, 26, 42, 12, 0, 1,
+ 192, 139, 157, 171, 125, 140, 152, 111, 125, 132, 96, 109, 113, 81, 92, 94, 65, 76, 74, 48, 58, 50, 26, 35, 9, 0, 0,
+ 193, 139, 140, 172, 124, 125, 153, 110, 112, 133, 95, 96, 113, 80, 82, 94, 65, 66, 74, 49, 50, 50, 26, 28, 7, 0, 0,
+ 194, 138, 123, 172, 123, 109, 153, 110, 97, 133, 95, 84, 113, 80, 70, 94, 65, 56, 74, 48, 40, 50, 26, 20, 6, 0, 0,
+ 194, 138, 105, 173, 123, 94, 153, 109, 83, 133, 94, 70, 112, 79, 59, 94, 64, 46, 74, 48, 31, 50, 26, 9, 4, 0, 0,
+ 196, 138, 87, 174, 122, 77, 153, 109, 67, 133, 93, 56, 113, 79, 46, 94, 64, 34, 73, 48, 18, 49, 27, 0, 4, 0, 0,
+ 196, 137, 65, 174, 122, 57, 154, 108, 49, 133, 93, 39, 113, 79, 29, 94, 64, 18, 74, 48, 3, 49, 27, 0, 2, 0, 0,
+ 197, 137, 47, 175, 122, 40, 155, 108, 32, 133, 93, 23, 114, 79, 14, 94, 64, 1, 73, 48, 0, 48, 27, 0, 2, 0, 0,
+ 189, 119, 177, 168, 106, 159, 150, 94, 142, 131, 81, 124, 113, 67, 107, 94, 53, 89, 74, 37, 69, 51, 11, 45, 6, 0, 3,
+ 191, 119, 161, 170, 106, 144, 152, 94, 129, 132, 81, 112, 113, 67, 96, 94, 53, 79, 74, 37, 61, 51, 13, 38, 6, 0, 0,
+ 192, 119, 146, 170, 106, 131, 152, 94, 117, 132, 80, 101, 112, 67, 85, 94, 53, 70, 74, 37, 53, 50, 14, 31, 4, 0, 0,
+ 192, 119, 131, 171, 106, 117, 153, 94, 105, 132, 80, 89, 113, 67, 75, 94, 54, 61, 74, 38, 45, 51, 14, 23, 3, 0, 0,
+ 193, 118, 114, 171, 106, 102, 153, 93, 90, 132, 80, 78, 113, 67, 65, 94, 53, 52, 74, 37, 36, 50, 15, 16, 1, 0, 0,
+ 194, 118, 99, 172, 105, 89, 153, 93, 78, 132, 80, 66, 113, 67, 54, 94, 53, 42, 74, 38, 27, 50, 16, 5, 1, 0, 0,
+ 194, 118, 82, 173, 105, 72, 153, 93, 63, 132, 79, 53, 113, 67, 42, 94, 53, 30, 74, 38, 15, 49, 16, 0, 0, 0, 0,
+ 195, 117, 63, 173, 105, 55, 154, 93, 47, 133, 79, 37, 113, 66, 27, 94, 53, 15, 73, 38, 0, 48, 16, 0, 0, 0, 0,
+ 195, 117, 46, 173, 104, 39, 154, 92, 32, 133, 79, 22, 113, 66, 13, 94, 53, 0, 73, 38, 0, 48, 17, 0, 0, 0, 0,
+ 189, 96, 166, 168, 85, 147, 150, 74, 132, 131, 62, 115, 113, 51, 99, 94, 38, 82, 74, 21, 63, 51, 0, 40, 1, 0, 0,
+ 190, 96, 150, 170, 85, 133, 152, 75, 119, 132, 63, 104, 113, 51, 88, 94, 38, 72, 75, 22, 55, 51, 0, 33, 1, 0, 0,
+ 192, 96, 137, 170, 85, 121, 152, 74, 108, 132, 64, 94, 113, 52, 79, 94, 39, 64, 74, 23, 48, 50, 0, 26, 0, 0, 0,
+ 192, 96, 122, 171, 86, 109, 152, 75, 96, 132, 63, 83, 113, 52, 69, 94, 39, 56, 74, 24, 41, 50, 0, 19, 0, 0, 0,
+ 193, 96, 107, 171, 85, 96, 152, 75, 84, 132, 64, 72, 113, 52, 60, 94, 39, 47, 74, 24, 32, 50, 1, 10, 0, 0, 0,
+ 193, 96, 93, 172, 85, 82, 152, 75, 72, 133, 63, 61, 113, 51, 49, 94, 39, 37, 73, 25, 23, 49, 2, 2, 0, 0, 0,
+ 194, 96, 78, 172, 85, 68, 152, 75, 59, 132, 63, 49, 113, 52, 39, 94, 40, 26, 73, 25, 11, 48, 3, 0, 0, 0, 0,
+ 194, 96, 60, 173, 85, 52, 153, 75, 44, 132, 64, 35, 112, 52, 25, 94, 40, 12, 73, 26, 0, 48, 4, 0, 0, 0, 0,
+ 195, 96, 46, 173, 85, 38, 154, 74, 31, 133, 63, 22, 113, 52, 11, 93, 40, 0, 73, 26, 0, 47, 5, 0, 0, 0, 0,
+ 188, 67, 153, 168, 58, 137, 151, 49, 122, 131, 39, 106, 113, 28, 90, 94, 13, 75, 75, 0, 57, 51, 0, 35, 0, 0, 0,
+ 190, 68, 138, 170, 59, 123, 152, 50, 110, 132, 41, 96, 113, 29, 80, 94, 16, 66, 75, 0, 49, 50, 0, 27, 0, 0, 0,
+ 191, 69, 126, 170, 59, 112, 151, 52, 100, 132, 42, 86, 113, 30, 73, 95, 17, 58, 75, 0, 42, 50, 0, 21, 0, 0, 0,
+ 192, 70, 113, 170, 61, 100, 151, 52, 89, 132, 42, 77, 113, 31, 64, 94, 19, 50, 74, 1, 35, 50, 0, 14, 0, 0, 0,
+ 192, 70, 100, 170, 62, 89, 151, 53, 77, 131, 43, 66, 112, 32, 54, 94, 20, 42, 74, 2, 27, 49, 0, 5, 0, 0, 0,
+ 192, 71, 87, 171, 61, 77, 152, 53, 67, 131, 44, 57, 112, 33, 45, 94, 21, 33, 74, 4, 19, 49, 0, 1, 0, 0, 0,
+ 193, 71, 74, 171, 62, 64, 152, 53, 55, 132, 44, 45, 113, 34, 34, 94, 22, 23, 73, 5, 7, 48, 0, 0, 0, 0, 0,
+ 193, 70, 58, 172, 62, 50, 152, 54, 42, 132, 44, 32, 112, 35, 22, 93, 23, 10, 73, 6, 0, 47, 0, 0, 0, 0, 0,
+ 193, 70, 45, 172, 62, 38, 153, 54, 31, 132, 44, 21, 112, 35, 9, 94, 23, 0, 73, 7, 0, 47, 0, 0, 0, 0, 0,
+ 189, 26, 141, 169, 15, 126, 150, 2, 112, 131, 0, 97, 113, 0, 82, 94, 0, 67, 75, 0, 51, 50, 0, 29, 0, 0, 0,
+ 190, 28, 128, 170, 18, 114, 151, 8, 101, 132, 0, 88, 113, 0, 74, 94, 0, 60, 75, 0, 44, 50, 0, 23, 0, 0, 0,
+ 191, 30, 117, 170, 23, 104, 152, 11, 92, 132, 1, 79, 113, 0, 67, 95, 0, 53, 75, 0, 37, 50, 0, 17, 0, 0, 0,
+ 191, 33, 105, 170, 26, 93, 151, 18, 83, 132, 6, 70, 112, 0, 58, 94, 0, 45, 75, 0, 30, 49, 0, 8, 0, 0, 0,
+ 191, 34, 93, 170, 27, 82, 151, 20, 72, 131, 8, 61, 112, 0, 49, 94, 0, 38, 74, 0, 23, 49, 0, 4, 0, 0, 0,
+ 191, 36, 82, 170, 29, 71, 151, 22, 63, 131, 11, 52, 112, 0, 41, 93, 0, 29, 74, 0, 14, 48, 0, 1, 0, 0, 0,
+ 191, 38, 69, 170, 31, 60, 151, 24, 51, 131, 14, 41, 112, 1, 31, 93, 0, 19, 73, 0, 3, 48, 0, 0, 0, 0, 0,
+ 192, 37, 56, 171, 31, 47, 152, 25, 40, 131, 17, 30, 112, 4, 19, 93, 0, 7, 73, 0, 0, 47, 0, 0, 0, 0, 0,
+ 192, 38, 45, 171, 33, 36, 152, 26, 30, 131, 18, 21, 111, 7, 9, 93, 0, 0, 73, 0, 0, 47, 0, 0, 0, 0, 0,
+ 149, 218, 248, 133, 194, 222, 119, 173, 198, 102, 151, 173, 86, 130, 148, 70, 108, 125, 53, 85, 100, 32, 59, 71, 0, 22, 33,
+ 154, 216, 223, 137, 193, 200, 122, 172, 178, 106, 150, 156, 89, 128, 133, 73, 107, 112, 54, 85, 89, 31, 59, 63, 0, 22, 26,
+ 159, 215, 202, 141, 192, 181, 126, 171, 161, 108, 149, 141, 90, 128, 121, 74, 107, 100, 55, 85, 80, 32, 58, 55, 0, 22, 19,
+ 161, 213, 179, 144, 190, 160, 126, 170, 143, 109, 148, 125, 92, 127, 107, 74, 106, 89, 56, 84, 69, 32, 58, 46, 0, 21, 11,
+ 163, 211, 156, 144, 189, 139, 129, 168, 125, 110, 147, 108, 93, 126, 92, 75, 105, 76, 57, 83, 58, 33, 58, 37, 0, 21, 1,
+ 167, 211, 133, 147, 188, 120, 130, 167, 105, 110, 145, 92, 93, 125, 78, 76, 104, 64, 58, 83, 48, 33, 57, 27, 0, 21, 0,
+ 169, 210, 108, 149, 187, 96, 131, 166, 86, 112, 144, 74, 94, 124, 62, 77, 103, 49, 58, 82, 35, 33, 57, 15, 0, 21, 0,
+ 170, 209, 80, 151, 186, 71, 133, 165, 62, 114, 143, 52, 95, 123, 42, 77, 103, 32, 58, 81, 18, 33, 56, 0, 0, 21, 0,
+ 173, 208, 55, 152, 186, 49, 134, 165, 41, 114, 143, 34, 95, 122, 25, 77, 102, 14, 58, 81, 0, 33, 56, 0, 0, 21, 0,
+ 154, 195, 232, 137, 174, 207, 122, 156, 185, 105, 136, 163, 89, 116, 140, 73, 97, 117, 56, 76, 94, 35, 51, 66, 0, 13, 28,
+ 158, 194, 209, 141, 174, 187, 125, 155, 167, 109, 135, 146, 91, 116, 125, 75, 96, 105, 57, 75, 83, 35, 50, 57, 0, 12, 21,
+ 161, 193, 189, 144, 173, 169, 128, 154, 151, 110, 134, 132, 93, 115, 113, 77, 95, 94, 58, 75, 74, 35, 50, 50, 0, 12, 13,
+ 164, 192, 168, 145, 171, 151, 129, 153, 134, 111, 133, 117, 94, 114, 100, 76, 95, 82, 58, 75, 64, 36, 50, 42, 0, 12, 5,
+ 165, 191, 147, 147, 170, 131, 130, 152, 117, 113, 132, 102, 95, 113, 86, 77, 94, 71, 58, 74, 54, 35, 50, 33, 0, 13, 0,
+ 167, 189, 126, 148, 169, 113, 132, 151, 100, 113, 131, 86, 96, 112, 73, 77, 93, 59, 59, 73, 43, 35, 49, 23, 0, 12, 0,
+ 170, 189, 104, 150, 168, 91, 133, 150, 81, 114, 130, 69, 96, 111, 57, 78, 92, 46, 59, 73, 31, 35, 49, 11, 0, 13, 0,
+ 171, 188, 78, 152, 168, 68, 134, 149, 60, 115, 130, 50, 96, 111, 41, 78, 92, 29, 60, 73, 15, 35, 49, 0, 0, 12, 0,
+ 173, 187, 55, 153, 167, 47, 134, 149, 39, 115, 129, 33, 97, 110, 24, 79, 92, 13, 60, 72, 0, 35, 48, 0, 0, 12, 0,
+ 157, 175, 217, 139, 157, 196, 125, 141, 175, 109, 122, 153, 92, 104, 132, 76, 86, 110, 59, 67, 88, 37, 43, 61, 1, 1, 23,
+ 161, 174, 196, 144, 156, 176, 127, 140, 158, 110, 121, 137, 94, 104, 118, 77, 85, 98, 59, 67, 78, 37, 43, 53, 0, 2, 16,
+ 163, 174, 178, 146, 156, 160, 130, 139, 143, 112, 121, 124, 95, 103, 106, 78, 85, 88, 60, 66, 69, 37, 42, 46, 0, 2, 7,
+ 166, 173, 159, 147, 154, 142, 130, 138, 127, 113, 120, 111, 96, 103, 95, 78, 84, 77, 60, 66, 59, 37, 43, 37, 0, 2, 0,
+ 166, 172, 139, 148, 154, 125, 131, 137, 112, 113, 120, 96, 96, 102, 81, 78, 84, 66, 60, 65, 50, 37, 42, 29, 0, 3, 0,
+ 167, 171, 120, 149, 153, 107, 133, 137, 95, 114, 118, 81, 97, 101, 69, 79, 84, 56, 60, 65, 40, 37, 42, 19, 0, 3, 0,
+ 170, 170, 99, 151, 152, 87, 134, 136, 77, 115, 118, 66, 97, 101, 55, 79, 83, 42, 61, 65, 28, 37, 42, 7, 0, 3, 0,
+ 172, 170, 75, 152, 151, 65, 134, 135, 57, 115, 117, 48, 97, 100, 38, 79, 83, 27, 61, 64, 12, 36, 42, 0, 0, 3, 0,
+ 172, 169, 55, 154, 151, 46, 135, 134, 40, 116, 116, 32, 97, 99, 21, 80, 82, 10, 61, 64, 0, 36, 41, 0, 0, 3, 0,
+ 160, 154, 203, 143, 139, 182, 127, 124, 164, 111, 107, 143, 95, 91, 122, 78, 75, 103, 60, 57, 81, 39, 33, 56, 1, 0, 18,
+ 163, 154, 184, 146, 138, 165, 130, 123, 148, 113, 107, 129, 96, 90, 110, 79, 74, 92, 61, 56, 72, 39, 34, 48, 2, 0, 9,
+ 165, 154, 167, 147, 137, 149, 131, 122, 134, 114, 106, 117, 96, 90, 100, 79, 74, 82, 61, 56, 64, 39, 33, 40, 2, 0, 1,
+ 166, 153, 150, 149, 137, 133, 132, 122, 119, 114, 106, 104, 97, 90, 88, 79, 74, 72, 61, 56, 55, 39, 34, 33, 0, 0, 0,
+ 168, 152, 132, 149, 136, 117, 132, 121, 104, 114, 105, 90, 97, 89, 76, 79, 73, 62, 61, 56, 46, 38, 34, 25, 0, 0, 0,
+ 169, 151, 114, 150, 135, 101, 133, 121, 90, 114, 104, 77, 97, 89, 65, 80, 73, 51, 61, 56, 36, 38, 34, 16, 0, 0, 0,
+ 170, 150, 94, 151, 135, 83, 134, 120, 73, 115, 104, 62, 98, 88, 51, 80, 72, 39, 61, 56, 24, 38, 34, 3, 0, 0, 0,
+ 172, 150, 72, 153, 134, 63, 135, 119, 55, 115, 103, 45, 98, 88, 36, 80, 72, 24, 61, 55, 9, 38, 34, 0, 0, 0, 0,
+ 172, 150, 54, 153, 134, 47, 135, 119, 38, 116, 103, 30, 98, 87, 21, 80, 72, 8, 62, 55, 0, 37, 34, 0, 0, 0, 0,
+ 162, 134, 190, 145, 120, 171, 129, 108, 153, 113, 93, 134, 97, 78, 115, 80, 63, 96, 62, 46, 75, 41, 23, 51, 0, 0, 11,
+ 165, 134, 173, 147, 120, 154, 131, 107, 138, 114, 92, 120, 97, 78, 103, 80, 63, 85, 62, 46, 66, 40, 23, 43, 0, 0, 2,
+ 166, 134, 157, 148, 120, 140, 132, 106, 125, 114, 92, 109, 97, 77, 93, 81, 63, 77, 62, 46, 58, 40, 24, 36, 0, 0, 0,
+ 168, 133, 140, 149, 119, 125, 132, 106, 112, 115, 92, 97, 98, 77, 82, 81, 62, 67, 62, 46, 50, 40, 24, 29, 0, 0, 0,
+ 168, 133, 123, 150, 119, 110, 133, 106, 97, 115, 91, 84, 98, 77, 70, 81, 62, 57, 62, 46, 41, 40, 24, 20, 0, 0, 0,
+ 169, 132, 107, 150, 118, 94, 133, 105, 84, 115, 91, 72, 98, 76, 60, 80, 62, 47, 62, 46, 32, 39, 25, 11, 0, 0, 0,
+ 171, 132, 89, 152, 118, 79, 135, 105, 69, 115, 90, 58, 98, 76, 47, 80, 62, 36, 62, 46, 21, 39, 25, 0, 0, 0, 0,
+ 171, 132, 69, 153, 117, 60, 135, 104, 52, 116, 90, 42, 98, 76, 33, 81, 61, 21, 62, 46, 6, 38, 25, 0, 0, 0, 0,
+ 172, 132, 54, 153, 118, 45, 135, 104, 38, 116, 90, 28, 98, 76, 18, 81, 61, 6, 62, 46, 0, 38, 25, 0, 0, 0, 0,
+ 164, 115, 177, 146, 103, 159, 130, 91, 143, 114, 78, 125, 97, 65, 107, 81, 51, 89, 63, 34, 69, 41, 9, 46, 0, 0, 4,
+ 166, 115, 161, 148, 103, 144, 132, 91, 129, 115, 78, 112, 98, 65, 96, 81, 51, 79, 63, 35, 61, 41, 11, 38, 0, 0, 0,
+ 167, 115, 146, 150, 102, 131, 132, 91, 117, 115, 78, 101, 98, 65, 86, 81, 51, 71, 63, 35, 54, 41, 12, 32, 0, 0, 0,
+ 168, 114, 132, 150, 103, 118, 133, 91, 105, 116, 78, 91, 98, 64, 76, 82, 51, 61, 63, 36, 46, 41, 13, 24, 0, 0, 0,
+ 169, 114, 116, 150, 102, 103, 134, 90, 91, 116, 78, 79, 98, 65, 66, 81, 51, 53, 63, 36, 37, 40, 14, 17, 0, 0, 0,
+ 169, 114, 101, 151, 101, 89, 134, 90, 79, 116, 77, 67, 98, 64, 56, 81, 51, 44, 63, 36, 29, 40, 15, 7, 0, 0, 0,
+ 170, 114, 85, 152, 101, 75, 135, 90, 65, 116, 77, 54, 98, 64, 44, 81, 51, 32, 63, 36, 17, 39, 15, 0, 0, 0, 0,
+ 172, 113, 66, 152, 101, 58, 135, 89, 49, 116, 77, 40, 99, 64, 30, 81, 51, 18, 62, 36, 3, 38, 16, 0, 0, 0, 0,
+ 171, 113, 51, 153, 101, 44, 136, 89, 36, 116, 77, 28, 99, 64, 18, 81, 51, 5, 62, 36, 0, 38, 16, 0, 0, 0, 0,
+ 165, 94, 166, 147, 82, 147, 132, 72, 132, 115, 61, 115, 98, 49, 99, 82, 36, 82, 64, 19, 64, 42, 0, 41, 0, 0, 0,
+ 167, 93, 150, 150, 83, 134, 133, 73, 120, 116, 62, 104, 99, 49, 88, 82, 36, 72, 64, 20, 55, 41, 0, 33, 0, 0, 0,
+ 169, 93, 137, 150, 83, 122, 134, 73, 109, 116, 61, 94, 99, 50, 80, 82, 37, 65, 64, 21, 49, 41, 0, 27, 0, 0, 0,
+ 169, 94, 123, 150, 83, 110, 133, 73, 97, 116, 61, 83, 99, 50, 70, 82, 38, 57, 63, 23, 42, 41, 0, 20, 0, 0, 0,
+ 169, 94, 109, 150, 84, 97, 134, 73, 85, 116, 62, 73, 99, 51, 61, 81, 38, 48, 63, 23, 33, 41, 1, 11, 0, 0, 0,
+ 170, 94, 96, 150, 83, 84, 134, 73, 74, 116, 61, 62, 99, 50, 51, 82, 38, 39, 64, 23, 24, 40, 3, 4, 0, 0, 0,
+ 171, 93, 79, 152, 82, 70, 135, 73, 61, 116, 62, 51, 98, 51, 40, 81, 38, 28, 63, 24, 14, 39, 4, 0, 0, 0, 0,
+ 171, 94, 64, 152, 83, 55, 135, 73, 47, 116, 62, 37, 98, 50, 27, 81, 38, 15, 63, 24, 1, 39, 4, 0, 0, 0, 0,
+ 172, 93, 51, 153, 82, 42, 135, 73, 35, 117, 62, 26, 99, 51, 16, 81, 39, 3, 63, 25, 0, 38, 5, 0, 0, 0, 0,
+ 166, 68, 153, 148, 59, 137, 133, 49, 121, 115, 39, 106, 99, 28, 91, 82, 13, 75, 65, 0, 58, 42, 0, 36, 0, 0, 0,
+ 168, 68, 139, 150, 59, 124, 134, 50, 110, 116, 40, 96, 99, 30, 81, 82, 16, 66, 64, 0, 50, 41, 0, 29, 0, 0, 0,
+ 169, 69, 126, 150, 59, 113, 134, 51, 101, 117, 42, 87, 100, 30, 73, 82, 17, 59, 65, 0, 43, 41, 0, 23, 0, 0, 0,
+ 169, 70, 115, 150, 61, 102, 134, 52, 89, 116, 42, 77, 99, 32, 65, 82, 19, 52, 64, 0, 36, 41, 0, 15, 0, 0, 0,
+ 169, 70, 101, 150, 61, 90, 134, 52, 79, 116, 43, 68, 99, 32, 55, 82, 21, 43, 64, 2, 28, 41, 0, 6, 0, 0, 0,
+ 170, 70, 89, 151, 62, 79, 134, 53, 69, 116, 44, 58, 99, 33, 46, 81, 21, 34, 64, 3, 20, 41, 0, 2, 0, 0, 0,
+ 170, 71, 76, 152, 62, 66, 134, 53, 57, 116, 43, 46, 99, 33, 36, 82, 22, 24, 64, 5, 10, 40, 0, 0, 0, 0, 0,
+ 171, 70, 61, 152, 62, 52, 135, 53, 44, 116, 44, 35, 99, 34, 24, 82, 22, 12, 63, 6, 0, 39, 0, 0, 0, 0, 0,
+ 171, 71, 49, 153, 62, 41, 135, 54, 33, 117, 45, 25, 98, 34, 13, 81, 23, 0, 63, 7, 0, 39, 0, 0, 0, 0, 0,
+ 167, 33, 142, 149, 24, 127, 134, 10, 113, 116, 0, 97, 100, 0, 83, 83, 0, 68, 65, 0, 52, 40, 0, 30, 0, 0, 0,
+ 169, 33, 129, 150, 26, 115, 134, 17, 102, 116, 3, 89, 100, 0, 75, 83, 0, 60, 65, 0, 45, 40, 0, 24, 0, 0, 0,
+ 169, 36, 118, 151, 27, 104, 134, 19, 93, 116, 7, 80, 100, 0, 67, 83, 0, 54, 65, 0, 38, 41, 0, 17, 0, 0, 0,
+ 169, 39, 107, 150, 30, 94, 134, 22, 84, 116, 11, 71, 99, 0, 59, 83, 0, 46, 64, 0, 31, 40, 0, 9, 0, 0, 0,
+ 169, 39, 95, 151, 31, 83, 134, 24, 73, 116, 15, 62, 100, 1, 51, 83, 0, 38, 64, 0, 24, 40, 0, 5, 0, 0, 0,
+ 169, 41, 83, 151, 33, 73, 134, 26, 64, 117, 17, 54, 99, 4, 42, 82, 0, 30, 64, 0, 16, 40, 0, 1, 0, 0, 0,
+ 170, 42, 71, 152, 34, 62, 134, 28, 53, 117, 19, 44, 99, 6, 33, 82, 0, 21, 63, 0, 4, 39, 0, 0, 0, 0, 0,
+ 171, 42, 59, 152, 35, 50, 134, 29, 42, 117, 21, 32, 99, 9, 22, 82, 0, 9, 63, 0, 0, 38, 0, 0, 0, 0, 0,
+ 172, 42, 48, 152, 36, 40, 135, 29, 32, 117, 21, 23, 99, 10, 12, 82, 0, 0, 63, 0, 0, 38, 0, 0, 0, 0, 0,
+ 107, 207, 246, 96, 185, 220, 86, 165, 196, 73, 144, 171, 60, 123, 147, 46, 103, 125, 32, 82, 100, 9, 56, 71, 0, 20, 33,
+ 115, 206, 221, 104, 184, 198, 92, 164, 178, 78, 143, 154, 64, 123, 133, 51, 102, 111, 34, 81, 89, 10, 56, 63, 0, 20, 27,
+ 122, 204, 200, 108, 183, 180, 95, 163, 161, 82, 142, 140, 68, 122, 120, 54, 102, 101, 36, 81, 79, 11, 56, 55, 0, 20, 20,
+ 125, 203, 179, 111, 181, 160, 97, 162, 143, 85, 141, 124, 70, 121, 107, 55, 101, 89, 38, 80, 69, 14, 55, 46, 0, 19, 10,
+ 128, 202, 156, 113, 180, 140, 102, 161, 125, 87, 140, 108, 71, 120, 92, 56, 100, 76, 39, 79, 59, 14, 55, 38, 0, 20, 3,
+ 132, 200, 135, 117, 179, 121, 103, 159, 106, 88, 139, 93, 73, 119, 79, 57, 100, 65, 41, 79, 49, 15, 54, 28, 0, 19, 0,
+ 134, 200, 111, 119, 178, 98, 105, 158, 87, 89, 138, 76, 74, 118, 64, 58, 99, 51, 41, 78, 37, 16, 54, 17, 0, 19, 0,
+ 137, 199, 85, 122, 177, 75, 108, 158, 66, 91, 137, 56, 75, 118, 46, 59, 98, 35, 42, 78, 22, 16, 54, 3, 0, 19, 0,
+ 140, 198, 62, 125, 177, 55, 109, 158, 47, 92, 137, 40, 76, 117, 32, 59, 98, 21, 42, 78, 6, 16, 54, 0, 0, 18, 0,
+ 118, 186, 231, 106, 167, 206, 93, 149, 184, 81, 130, 161, 67, 111, 139, 54, 92, 117, 39, 72, 93, 17, 48, 66, 0, 10, 29,
+ 123, 185, 207, 110, 166, 186, 98, 148, 167, 85, 129, 145, 71, 111, 125, 56, 92, 104, 40, 72, 83, 18, 48, 57, 0, 10, 22,
+ 128, 184, 188, 113, 165, 168, 102, 147, 151, 88, 128, 131, 73, 110, 113, 58, 91, 94, 42, 71, 74, 19, 48, 50, 0, 9, 15,
+ 131, 183, 168, 116, 164, 151, 104, 146, 134, 89, 127, 117, 73, 109, 100, 58, 90, 83, 42, 71, 65, 20, 48, 42, 0, 9, 5,
+ 134, 182, 148, 120, 163, 131, 105, 145, 118, 90, 126, 102, 75, 108, 86, 59, 90, 72, 43, 71, 55, 19, 47, 34, 0, 9, 0,
+ 136, 181, 128, 122, 162, 115, 107, 144, 102, 92, 125, 87, 76, 107, 74, 61, 89, 60, 44, 70, 45, 20, 47, 24, 0, 8, 0,
+ 139, 180, 106, 124, 161, 95, 109, 144, 83, 93, 124, 71, 77, 107, 60, 61, 89, 47, 44, 70, 33, 20, 47, 13, 0, 8, 0,
+ 142, 179, 82, 125, 160, 72, 111, 143, 63, 94, 124, 54, 77, 106, 44, 61, 88, 32, 44, 69, 18, 20, 46, 0, 0, 8, 0,
+ 143, 179, 62, 127, 160, 54, 111, 142, 47, 94, 124, 39, 78, 106, 29, 62, 88, 18, 45, 69, 3, 20, 46, 0, 0, 8, 0,
+ 124, 167, 216, 112, 150, 194, 99, 134, 174, 87, 117, 153, 73, 100, 131, 58, 82, 110, 43, 64, 88, 23, 40, 61, 0, 0, 24,
+ 129, 166, 195, 116, 150, 175, 103, 134, 158, 89, 116, 137, 75, 99, 118, 60, 82, 98, 44, 63, 78, 23, 40, 53, 0, 0, 17,
+ 132, 166, 177, 119, 149, 160, 106, 133, 143, 90, 115, 124, 76, 99, 107, 61, 81, 88, 45, 63, 69, 24, 40, 46, 0, 0, 9,
+ 136, 166, 159, 121, 148, 143, 107, 132, 126, 92, 115, 111, 77, 98, 94, 62, 81, 78, 46, 63, 60, 23, 40, 38, 0, 0, 0,
+ 138, 164, 140, 122, 147, 125, 108, 131, 111, 93, 114, 97, 79, 98, 82, 63, 80, 67, 46, 62, 50, 24, 40, 29, 0, 0, 0,
+ 139, 163, 122, 124, 146, 109, 110, 131, 96, 94, 114, 83, 79, 97, 70, 63, 81, 57, 46, 62, 41, 24, 40, 21, 0, 0, 0,
+ 141, 163, 101, 126, 145, 90, 111, 130, 79, 95, 113, 68, 79, 96, 56, 63, 80, 44, 47, 62, 30, 23, 40, 10, 0, 0, 0,
+ 144, 162, 79, 127, 145, 70, 112, 129, 60, 95, 112, 51, 79, 96, 41, 64, 79, 30, 47, 61, 15, 23, 40, 0, 0, 0, 0,
+ 145, 162, 60, 129, 145, 52, 113, 129, 46, 96, 112, 37, 79, 95, 27, 64, 79, 16, 47, 61, 1, 23, 39, 0, 0, 0, 0,
+ 131, 147, 202, 117, 133, 181, 105, 119, 162, 91, 103, 142, 77, 87, 122, 62, 71, 102, 47, 54, 81, 26, 31, 56, 0, 0, 18,
+ 135, 147, 183, 120, 132, 164, 107, 118, 147, 93, 102, 128, 78, 87, 110, 63, 71, 92, 47, 54, 72, 26, 31, 48, 0, 0, 10,
+ 138, 147, 166, 123, 131, 149, 108, 118, 133, 94, 102, 116, 79, 86, 100, 64, 71, 82, 48, 54, 64, 27, 31, 41, 0, 0, 2,
+ 139, 146, 149, 124, 131, 134, 111, 117, 119, 94, 101, 103, 79, 86, 88, 64, 70, 72, 48, 53, 55, 27, 31, 33, 0, 0, 0,
+ 141, 146, 132, 125, 131, 117, 111, 117, 104, 95, 101, 91, 80, 86, 77, 65, 70, 62, 48, 53, 46, 26, 31, 25, 0, 0, 0,
+ 143, 145, 115, 126, 130, 101, 112, 116, 90, 96, 100, 78, 80, 85, 65, 65, 70, 52, 49, 53, 37, 27, 32, 17, 0, 0, 0,
+ 144, 144, 96, 128, 129, 85, 112, 115, 75, 97, 100, 64, 81, 85, 52, 65, 69, 40, 49, 53, 26, 26, 31, 5, 0, 0, 0,
+ 146, 144, 76, 129, 129, 67, 114, 115, 58, 97, 99, 48, 82, 84, 38, 66, 69, 27, 49, 53, 12, 26, 32, 0, 0, 0, 0,
+ 146, 144, 59, 130, 128, 51, 114, 114, 43, 98, 99, 35, 82, 84, 25, 66, 69, 13, 49, 53, 0, 26, 32, 0, 0, 0, 0,
+ 135, 129, 189, 122, 115, 170, 107, 103, 152, 94, 89, 133, 79, 74, 114, 64, 60, 95, 49, 43, 75, 29, 20, 51, 0, 0, 12,
+ 138, 129, 171, 124, 115, 153, 110, 103, 138, 95, 89, 120, 81, 74, 103, 66, 60, 86, 50, 44, 67, 28, 21, 43, 0, 0, 3,
+ 140, 129, 156, 125, 115, 140, 111, 103, 125, 96, 89, 109, 81, 74, 93, 67, 60, 76, 50, 44, 59, 29, 22, 36, 0, 0, 0,
+ 142, 128, 140, 127, 115, 125, 112, 102, 112, 97, 88, 97, 82, 74, 83, 67, 60, 67, 50, 44, 51, 29, 22, 29, 0, 0, 0,
+ 142, 128, 124, 127, 114, 111, 113, 102, 98, 98, 88, 85, 82, 74, 71, 66, 60, 58, 50, 44, 42, 29, 22, 21, 0, 0, 0,
+ 144, 127, 108, 128, 114, 96, 113, 101, 85, 98, 87, 73, 82, 74, 61, 67, 60, 48, 50, 44, 33, 28, 23, 12, 0, 0, 0,
+ 145, 127, 91, 129, 114, 81, 115, 101, 71, 98, 87, 60, 82, 73, 48, 67, 59, 37, 50, 44, 22, 29, 23, 1, 0, 0, 0,
+ 147, 127, 73, 130, 113, 63, 115, 101, 55, 98, 87, 45, 83, 73, 35, 67, 59, 24, 50, 44, 10, 28, 24, 0, 0, 0, 0,
+ 147, 127, 58, 131, 113, 49, 115, 100, 42, 99, 86, 33, 83, 73, 23, 67, 59, 10, 50, 44, 0, 27, 24, 0, 0, 0, 0,
+ 138, 110, 177, 124, 99, 159, 110, 88, 142, 96, 75, 125, 82, 62, 107, 66, 48, 89, 51, 33, 70, 30, 8, 46, 0, 0, 5,
+ 142, 111, 160, 127, 99, 144, 113, 88, 130, 98, 75, 112, 82, 62, 96, 68, 49, 80, 51, 33, 61, 30, 10, 39, 0, 0, 0,
+ 143, 111, 146, 128, 99, 131, 114, 88, 118, 98, 75, 101, 83, 62, 86, 68, 49, 71, 52, 33, 54, 30, 11, 32, 0, 0, 0,
+ 144, 111, 132, 128, 99, 118, 113, 88, 106, 99, 75, 91, 83, 62, 77, 68, 49, 62, 52, 34, 46, 30, 12, 25, 0, 0, 0,
+ 144, 111, 117, 129, 98, 104, 114, 87, 92, 99, 75, 80, 83, 62, 67, 68, 49, 53, 51, 34, 38, 30, 13, 18, 0, 0, 0,
+ 145, 111, 103, 130, 98, 91, 114, 87, 80, 99, 75, 68, 83, 63, 57, 68, 50, 45, 51, 34, 30, 30, 14, 8, 0, 0, 0,
+ 146, 110, 87, 131, 98, 76, 115, 87, 67, 99, 75, 56, 83, 62, 45, 68, 49, 33, 52, 35, 19, 30, 15, 2, 0, 0, 0,
+ 148, 110, 70, 131, 98, 60, 116, 86, 52, 99, 74, 43, 84, 62, 33, 69, 49, 21, 52, 35, 6, 29, 15, 0, 0, 0, 0,
+ 148, 110, 56, 132, 97, 48, 117, 87, 40, 100, 75, 31, 84, 62, 22, 68, 49, 9, 51, 35, 0, 28, 15, 0, 0, 0, 0,
+ 142, 91, 166, 126, 80, 148, 113, 71, 132, 98, 59, 115, 83, 47, 99, 69, 34, 82, 53, 17, 64, 32, 0, 41, 0, 0, 0,
+ 143, 91, 150, 128, 81, 135, 114, 71, 120, 99, 60, 104, 85, 48, 89, 69, 35, 73, 53, 19, 56, 32, 0, 34, 0, 0, 0,
+ 145, 91, 137, 129, 81, 122, 115, 71, 109, 100, 60, 94, 85, 48, 81, 69, 35, 65, 53, 19, 49, 32, 0, 28, 0, 0, 0,
+ 146, 92, 124, 130, 81, 110, 115, 71, 98, 100, 60, 84, 85, 49, 71, 69, 36, 57, 53, 21, 42, 32, 0, 21, 0, 0, 0,
+ 147, 91, 110, 130, 81, 97, 115, 71, 86, 100, 60, 74, 84, 49, 62, 69, 36, 48, 53, 22, 34, 32, 0, 13, 0, 0, 0,
+ 147, 92, 97, 130, 81, 85, 116, 72, 76, 100, 60, 63, 85, 49, 52, 69, 37, 40, 53, 22, 26, 31, 1, 5, 0, 0, 0,
+ 148, 92, 82, 131, 81, 71, 116, 71, 62, 100, 60, 53, 84, 49, 42, 69, 37, 30, 52, 23, 16, 31, 2, 0, 0, 0, 0,
+ 148, 91, 67, 132, 81, 57, 117, 71, 49, 100, 60, 39, 84, 49, 30, 69, 37, 18, 52, 23, 2, 30, 2, 0, 0, 0, 0,
+ 149, 91, 54, 132, 81, 46, 118, 71, 39, 101, 60, 29, 85, 49, 19, 69, 37, 6, 52, 23, 0, 29, 3, 0, 0, 0, 0,
+ 143, 68, 153, 128, 59, 137, 115, 49, 122, 99, 39, 107, 85, 28, 91, 70, 13, 75, 54, 0, 58, 32, 0, 36, 0, 0, 0,
+ 146, 68, 140, 131, 59, 125, 116, 51, 111, 100, 40, 97, 85, 29, 82, 70, 15, 67, 54, 0, 50, 32, 0, 29, 0, 0, 0,
+ 147, 68, 127, 131, 59, 114, 117, 51, 102, 101, 41, 88, 86, 30, 74, 70, 17, 60, 54, 0, 44, 32, 0, 23, 0, 0, 0,
+ 147, 70, 115, 131, 60, 103, 116, 52, 91, 100, 42, 78, 85, 32, 65, 70, 19, 53, 54, 1, 38, 32, 0, 17, 0, 0, 0,
+ 147, 70, 103, 131, 61, 91, 117, 53, 81, 101, 43, 69, 86, 32, 57, 70, 20, 44, 54, 2, 30, 32, 0, 7, 0, 0, 0,
+ 148, 70, 91, 132, 61, 80, 117, 52, 70, 101, 43, 59, 85, 33, 48, 70, 21, 36, 53, 4, 22, 32, 0, 3, 0, 0, 0,
+ 148, 70, 78, 132, 62, 68, 117, 53, 58, 101, 43, 48, 85, 34, 38, 70, 22, 26, 53, 6, 12, 31, 0, 0, 0, 0, 0,
+ 149, 71, 64, 132, 62, 54, 118, 54, 46, 101, 44, 37, 85, 34, 27, 69, 23, 15, 53, 7, 1, 30, 0, 0, 0, 0, 0,
+ 150, 70, 53, 134, 61, 44, 118, 54, 36, 101, 44, 28, 85, 35, 17, 69, 23, 4, 52, 8, 0, 30, 0, 0, 0, 0, 0,
+ 145, 38, 143, 130, 29, 128, 117, 18, 114, 101, 3, 98, 87, 0, 84, 72, 0, 69, 54, 0, 53, 30, 0, 31, 0, 0, 0,
+ 147, 38, 130, 132, 30, 116, 117, 22, 103, 101, 8, 89, 87, 0, 76, 72, 0, 62, 54, 0, 46, 30, 0, 24, 0, 0, 0,
+ 148, 40, 119, 132, 31, 105, 117, 23, 94, 101, 13, 81, 87, 0, 68, 71, 0, 55, 54, 0, 39, 30, 0, 18, 0, 0, 0,
+ 148, 42, 108, 132, 34, 96, 117, 25, 85, 102, 15, 73, 86, 2, 60, 71, 0, 47, 54, 0, 33, 30, 0, 11, 0, 0, 0,
+ 148, 43, 96, 133, 35, 85, 117, 28, 75, 102, 18, 64, 87, 5, 52, 71, 0, 40, 54, 0, 25, 30, 0, 5, 0, 0, 0,
+ 149, 44, 85, 132, 36, 75, 118, 29, 66, 101, 20, 55, 86, 8, 44, 70, 0, 32, 53, 0, 18, 29, 0, 2, 0, 0, 0,
+ 149, 45, 74, 133, 37, 64, 118, 31, 55, 102, 21, 45, 85, 10, 34, 70, 0, 22, 53, 0, 6, 28, 0, 0, 0, 0, 0,
+ 150, 46, 61, 133, 39, 52, 118, 31, 44, 102, 23, 34, 85, 12, 24, 70, 0, 12, 52, 0, 0, 28, 0, 0, 0, 0, 0,
+ 150, 46, 51, 133, 40, 42, 119, 32, 35, 102, 24, 25, 85, 13, 14, 70, 0, 1, 52, 0, 0, 27, 0, 0, 0, 0, 0,
+ 53, 198, 244, 49, 177, 218, 41, 158, 195, 32, 138, 171, 22, 118, 147, 11, 98, 124, 0, 78, 100, 0, 54, 71, 0, 18, 34,
+ 69, 196, 220, 64, 175, 196, 54, 157, 176, 45, 137, 154, 32, 117, 133, 19, 98, 111, 0, 78, 89, 0, 53, 63, 0, 17, 27,
+ 80, 195, 198, 69, 175, 179, 60, 156, 159, 50, 136, 139, 38, 116, 120, 25, 98, 101, 4, 77, 80, 0, 53, 55, 0, 17, 21,
+ 84, 193, 177, 75, 173, 159, 64, 155, 142, 55, 135, 124, 41, 116, 107, 27, 97, 89, 9, 76, 70, 0, 53, 47, 0, 17, 11,
+ 89, 193, 157, 79, 172, 140, 70, 154, 125, 57, 134, 109, 44, 115, 92, 32, 96, 76, 13, 76, 59, 0, 52, 39, 0, 16, 4,
+ 94, 191, 135, 85, 171, 121, 72, 152, 108, 60, 133, 94, 47, 114, 80, 32, 95, 65, 15, 76, 49, 0, 52, 29, 0, 16, 0,
+ 98, 190, 113, 87, 170, 100, 76, 152, 89, 62, 132, 77, 49, 113, 65, 35, 95, 52, 18, 75, 37, 0, 52, 18, 0, 15, 0,
+ 103, 190, 89, 90, 169, 80, 78, 151, 70, 64, 132, 60, 51, 113, 49, 37, 94, 38, 20, 75, 25, 0, 52, 5, 0, 15, 0,
+ 106, 189, 69, 93, 169, 61, 80, 151, 53, 66, 131, 45, 52, 113, 36, 37, 94, 25, 19, 74, 11, 0, 51, 0, 0, 15, 0,
+ 76, 178, 229, 68, 159, 205, 61, 142, 183, 50, 124, 160, 40, 106, 138, 28, 88, 116, 12, 69, 93, 0, 45, 66, 0, 5, 29,
+ 86, 177, 207, 78, 158, 184, 67, 142, 166, 56, 123, 145, 45, 106, 125, 31, 88, 105, 16, 69, 83, 0, 45, 58, 0, 6, 22,
+ 93, 176, 187, 81, 158, 168, 71, 141, 150, 61, 123, 131, 47, 105, 113, 35, 87, 94, 20, 68, 74, 0, 45, 51, 0, 5, 16,
+ 98, 175, 168, 84, 157, 150, 75, 140, 134, 63, 122, 117, 50, 104, 100, 37, 87, 83, 21, 68, 65, 0, 45, 42, 0, 4, 7,
+ 100, 174, 149, 89, 155, 132, 76, 139, 117, 65, 121, 102, 53, 104, 87, 39, 86, 72, 23, 67, 55, 0, 45, 34, 0, 3, 0,
+ 103, 173, 130, 92, 155, 115, 80, 138, 102, 68, 120, 88, 53, 103, 75, 40, 86, 61, 24, 67, 45, 0, 45, 25, 0, 3, 0,
+ 107, 172, 108, 95, 154, 96, 82, 137, 85, 70, 119, 73, 55, 102, 61, 42, 85, 49, 25, 67, 34, 0, 45, 14, 0, 3, 0,
+ 110, 172, 86, 97, 153, 76, 85, 137, 67, 70, 119, 57, 56, 102, 46, 42, 84, 35, 26, 66, 21, 0, 44, 1, 0, 3, 0,
+ 112, 171, 67, 98, 153, 59, 86, 137, 52, 71, 119, 44, 58, 102, 34, 44, 85, 22, 27, 66, 7, 0, 44, 0, 0, 3, 0,
+ 90, 160, 215, 81, 144, 193, 70, 129, 173, 61, 112, 151, 49, 95, 131, 37, 79, 109, 22, 61, 87, 0, 38, 61, 0, 0, 25,
+ 96, 160, 194, 86, 143, 174, 75, 128, 157, 65, 112, 137, 53, 95, 117, 40, 78, 98, 25, 60, 78, 0, 38, 53, 0, 0, 17,
+ 100, 159, 177, 89, 143, 159, 79, 128, 143, 67, 111, 124, 55, 95, 107, 42, 78, 89, 27, 60, 70, 2, 38, 46, 0, 0, 9,
+ 104, 158, 159, 92, 142, 143, 81, 127, 127, 69, 110, 110, 56, 94, 94, 43, 78, 78, 28, 60, 60, 2, 38, 38, 0, 0, 1,
+ 107, 157, 140, 94, 141, 125, 82, 126, 112, 71, 110, 97, 59, 94, 82, 45, 77, 67, 29, 59, 51, 4, 37, 30, 0, 0, 0,
+ 110, 156, 122, 97, 140, 109, 85, 125, 97, 72, 109, 83, 58, 93, 71, 45, 77, 57, 29, 60, 42, 5, 38, 22, 0, 0, 0,
+ 111, 156, 103, 99, 139, 91, 87, 125, 81, 73, 108, 69, 60, 92, 58, 46, 77, 45, 30, 59, 31, 5, 38, 12, 0, 0, 0,
+ 115, 156, 82, 101, 140, 73, 88, 124, 63, 74, 108, 53, 60, 92, 44, 46, 76, 32, 31, 59, 18, 6, 37, 0, 0, 0, 0,
+ 116, 155, 65, 102, 139, 58, 89, 124, 49, 75, 108, 41, 61, 92, 32, 48, 76, 21, 31, 59, 6, 5, 37, 0, 0, 0, 0,
+ 100, 141, 201, 88, 127, 181, 79, 114, 162, 69, 99, 142, 57, 83, 122, 44, 68, 102, 30, 51, 81, 7, 28, 56, 0, 0, 19,
+ 105, 141, 182, 94, 127, 163, 83, 114, 146, 71, 98, 128, 59, 83, 110, 46, 68, 91, 31, 51, 72, 10, 28, 48, 0, 0, 11,
+ 108, 141, 166, 96, 127, 149, 85, 113, 133, 73, 98, 116, 60, 83, 99, 46, 68, 82, 32, 51, 64, 11, 29, 41, 0, 0, 2,
+ 111, 141, 149, 98, 126, 134, 88, 112, 119, 74, 97, 103, 61, 83, 88, 48, 67, 72, 33, 51, 56, 11, 29, 34, 0, 0, 0,
+ 112, 140, 132, 100, 125, 118, 89, 112, 105, 75, 97, 91, 62, 82, 77, 49, 68, 62, 33, 51, 47, 12, 29, 26, 0, 0, 0,
+ 115, 140, 116, 102, 125, 103, 90, 111, 91, 76, 96, 78, 62, 82, 65, 49, 67, 52, 34, 51, 38, 13, 29, 18, 0, 0, 0,
+ 117, 139, 97, 103, 124, 87, 91, 111, 77, 78, 96, 65, 63, 81, 54, 49, 67, 41, 34, 51, 27, 12, 29, 7, 0, 0, 0,
+ 119, 138, 78, 105, 124, 69, 92, 110, 60, 78, 95, 50, 65, 81, 40, 50, 67, 29, 34, 51, 15, 13, 30, 0, 0, 0, 0,
+ 120, 138, 64, 106, 124, 54, 93, 110, 47, 78, 95, 38, 65, 81, 29, 50, 66, 17, 34, 50, 2, 13, 29, 0, 0, 0, 0,
+ 107, 124, 189, 96, 111, 169, 85, 99, 152, 73, 85, 132, 61, 71, 114, 48, 57, 95, 34, 41, 75, 14, 18, 51, 0, 0, 13,
+ 111, 124, 171, 100, 111, 153, 88, 99, 137, 75, 85, 120, 63, 72, 103, 50, 58, 85, 36, 41, 66, 15, 19, 43, 0, 0, 4,
+ 113, 124, 156, 101, 111, 139, 90, 99, 125, 77, 85, 109, 64, 71, 93, 51, 57, 77, 36, 42, 59, 17, 20, 37, 0, 0, 0,
+ 115, 124, 140, 103, 111, 125, 90, 99, 112, 78, 85, 97, 64, 71, 82, 52, 57, 67, 36, 42, 50, 16, 20, 30, 0, 0, 0,
+ 117, 123, 125, 104, 110, 111, 92, 98, 99, 79, 85, 86, 65, 71, 72, 51, 58, 59, 37, 42, 43, 17, 21, 22, 0, 0, 0,
+ 118, 123, 110, 105, 110, 97, 93, 98, 86, 78, 84, 74, 66, 71, 62, 52, 57, 49, 37, 42, 34, 17, 22, 14, 0, 0, 0,
+ 120, 123, 93, 106, 109, 82, 94, 97, 72, 80, 84, 61, 66, 71, 50, 52, 57, 38, 37, 42, 24, 17, 22, 2, 0, 0, 0,
+ 121, 122, 75, 108, 109, 66, 95, 97, 58, 80, 84, 48, 66, 71, 37, 52, 57, 26, 37, 42, 12, 16, 22, 0, 0, 0, 0,
+ 122, 123, 62, 108, 109, 52, 95, 97, 45, 81, 84, 36, 67, 70, 26, 52, 57, 14, 37, 42, 0, 15, 22, 0, 0, 0, 0,
+ 113, 107, 177, 102, 96, 159, 89, 85, 141, 78, 72, 124, 65, 60, 107, 52, 46, 89, 37, 30, 70, 18, 5, 46, 0, 0, 6,
+ 116, 107, 160, 104, 96, 144, 92, 85, 129, 80, 72, 112, 67, 60, 96, 53, 47, 80, 38, 31, 62, 19, 7, 39, 0, 0, 0,
+ 118, 107, 147, 105, 96, 131, 93, 85, 118, 80, 72, 101, 67, 60, 87, 54, 47, 71, 39, 31, 54, 19, 8, 32, 0, 0, 0,
+ 119, 107, 132, 106, 96, 118, 94, 85, 106, 81, 73, 91, 67, 60, 77, 54, 47, 63, 39, 32, 47, 20, 9, 25, 0, 0, 0,
+ 119, 107, 118, 106, 95, 105, 94, 85, 93, 81, 72, 80, 68, 60, 68, 54, 47, 54, 39, 32, 39, 20, 11, 18, 0, 0, 0,
+ 121, 107, 104, 107, 96, 92, 95, 84, 80, 81, 72, 69, 68, 61, 58, 54, 48, 46, 39, 33, 31, 20, 12, 9, 0, 0, 0,
+ 123, 107, 88, 108, 95, 77, 96, 84, 68, 82, 72, 57, 68, 60, 46, 54, 47, 35, 39, 33, 20, 19, 13, 2, 0, 0, 0,
+ 123, 106, 72, 110, 95, 63, 96, 84, 54, 82, 72, 45, 69, 60, 35, 55, 48, 23, 39, 33, 9, 18, 14, 0, 0, 0, 0,
+ 125, 106, 60, 110, 94, 50, 98, 84, 42, 83, 72, 34, 69, 60, 25, 55, 48, 12, 39, 33, 0, 17, 13, 0, 0, 0, 0,
+ 118, 89, 165, 105, 79, 148, 93, 69, 132, 81, 57, 115, 68, 45, 99, 55, 32, 82, 41, 15, 64, 21, 0, 41, 0, 0, 0,
+ 120, 89, 150, 107, 79, 135, 96, 69, 121, 82, 58, 105, 70, 46, 89, 56, 34, 73, 41, 17, 56, 21, 0, 34, 0, 0, 0,
+ 121, 89, 137, 108, 79, 123, 96, 69, 109, 82, 58, 95, 70, 47, 81, 56, 34, 66, 41, 18, 49, 21, 0, 28, 0, 0, 0,
+ 122, 90, 124, 109, 79, 110, 96, 69, 99, 83, 58, 85, 70, 47, 72, 56, 35, 58, 41, 19, 42, 21, 0, 22, 0, 0, 0,
+ 123, 90, 111, 110, 79, 98, 97, 69, 87, 83, 59, 75, 70, 47, 63, 56, 35, 50, 41, 20, 35, 21, 0, 14, 0, 0, 0,
+ 123, 90, 98, 110, 79, 87, 97, 70, 76, 84, 58, 64, 70, 48, 53, 56, 36, 41, 40, 21, 26, 21, 0, 5, 0, 0, 0,
+ 125, 89, 84, 111, 79, 73, 97, 69, 64, 84, 59, 54, 70, 48, 43, 56, 36, 31, 40, 22, 17, 20, 1, 1, 0, 0, 0,
+ 125, 89, 69, 112, 79, 60, 98, 70, 51, 84, 59, 42, 70, 48, 32, 56, 36, 20, 41, 22, 5, 19, 2, 0, 0, 0, 0,
+ 126, 89, 57, 112, 79, 49, 99, 70, 41, 84, 59, 32, 70, 48, 22, 56, 36, 10, 40, 22, 0, 18, 2, 0, 0, 0, 0,
+ 121, 67, 154, 108, 58, 138, 97, 50, 124, 84, 39, 107, 71, 28, 92, 58, 12, 76, 43, 0, 59, 20, 0, 37, 0, 0, 0,
+ 124, 68, 140, 111, 59, 126, 98, 50, 112, 84, 40, 98, 71, 29, 83, 58, 15, 67, 42, 0, 51, 20, 0, 30, 0, 0, 0,
+ 124, 68, 129, 111, 59, 114, 99, 51, 102, 86, 41, 88, 71, 30, 75, 58, 17, 60, 42, 0, 45, 20, 0, 24, 0, 0, 0,
+ 125, 70, 116, 111, 60, 103, 99, 51, 92, 85, 41, 79, 71, 31, 66, 58, 19, 53, 42, 3, 38, 20, 0, 17, 0, 0, 0,
+ 125, 70, 104, 111, 61, 93, 99, 52, 81, 85, 43, 69, 72, 32, 58, 58, 20, 45, 42, 4, 31, 20, 0, 8, 0, 0, 0,
+ 126, 70, 92, 111, 61, 81, 99, 52, 71, 85, 42, 60, 71, 33, 49, 57, 21, 37, 42, 6, 23, 20, 0, 3, 0, 0, 0,
+ 126, 70, 79, 112, 61, 70, 99, 53, 60, 85, 43, 50, 71, 33, 39, 57, 22, 28, 41, 7, 13, 19, 0, 0, 0, 0, 0,
+ 127, 71, 66, 113, 62, 56, 100, 53, 48, 86, 44, 39, 71, 34, 29, 57, 23, 18, 41, 8, 2, 18, 0, 0, 0, 0, 0,
+ 128, 70, 55, 114, 62, 46, 100, 54, 39, 86, 44, 30, 71, 34, 20, 57, 23, 7, 41, 9, 0, 18, 0, 0, 0, 0, 0,
+ 124, 41, 145, 111, 32, 128, 99, 23, 114, 86, 10, 100, 73, 0, 85, 60, 0, 71, 43, 0, 54, 17, 0, 32, 0, 0, 0,
+ 126, 42, 131, 113, 33, 117, 100, 25, 104, 86, 14, 90, 73, 0, 77, 60, 0, 63, 44, 0, 47, 18, 0, 25, 0, 0, 0,
+ 127, 43, 120, 113, 34, 106, 101, 26, 95, 86, 17, 82, 73, 2, 69, 59, 0, 56, 43, 0, 41, 18, 0, 19, 0, 0, 0,
+ 127, 45, 109, 113, 37, 97, 101, 28, 85, 86, 19, 74, 73, 5, 61, 59, 0, 48, 43, 0, 34, 19, 0, 11, 0, 0, 0,
+ 127, 46, 98, 114, 38, 86, 100, 30, 76, 87, 21, 65, 73, 9, 54, 59, 0, 41, 43, 0, 26, 18, 0, 5, 0, 0, 0,
+ 127, 47, 87, 113, 39, 76, 101, 31, 67, 86, 22, 56, 72, 11, 45, 59, 0, 33, 43, 0, 19, 18, 0, 2, 0, 0, 0,
+ 128, 48, 75, 114, 39, 65, 101, 33, 56, 86, 23, 46, 72, 12, 36, 58, 0, 24, 42, 0, 9, 17, 0, 0, 0, 0, 0,
+ 129, 48, 63, 114, 41, 54, 102, 33, 46, 87, 24, 36, 72, 14, 26, 58, 1, 14, 42, 0, 2, 16, 0, 0, 0, 0, 0,
+ 128, 48, 53, 114, 41, 44, 102, 34, 37, 87, 25, 27, 72, 15, 17, 58, 1, 3, 41, 0, 0, 15, 0, 0, 0, 0, 0,
+ 0, 189, 242, 0, 169, 217, 0, 151, 194, 0, 132, 170, 0, 113, 147, 0, 94, 123, 0, 74, 99, 0, 51, 71, 0, 15, 34,
+ 1, 187, 219, 1, 167, 195, 0, 150, 175, 0, 131, 153, 0, 113, 132, 0, 94, 111, 0, 74, 89, 0, 50, 63, 0, 13, 28,
+ 1, 186, 198, 1, 167, 178, 0, 149, 158, 0, 130, 139, 0, 111, 119, 0, 93, 100, 0, 74, 80, 0, 50, 55, 0, 13, 22,
+ 1, 185, 176, 1, 165, 159, 1, 148, 142, 0, 129, 123, 0, 111, 106, 0, 93, 89, 0, 73, 70, 0, 50, 47, 0, 13, 13,
+ 1, 184, 157, 1, 164, 141, 1, 147, 125, 0, 128, 110, 0, 110, 93, 0, 92, 77, 0, 73, 60, 0, 50, 39, 0, 12, 5,
+ 25, 182, 137, 25, 163, 122, 17, 146, 109, 0, 128, 96, 0, 110, 81, 0, 92, 66, 0, 73, 51, 0, 50, 30, 0, 10, 0,
+ 42, 181, 114, 35, 163, 102, 30, 145, 91, 14, 127, 80, 0, 109, 67, 0, 91, 53, 0, 72, 39, 0, 50, 19, 0, 10, 0,
+ 52, 181, 92, 43, 162, 83, 32, 145, 73, 19, 126, 63, 0, 108, 52, 0, 90, 40, 0, 72, 27, 0, 50, 7, 0, 10, 0,
+ 57, 181, 74, 48, 162, 66, 37, 144, 57, 24, 126, 49, 7, 108, 40, 0, 90, 29, 0, 72, 15, 0, 49, 0, 0, 10, 0,
+ 1, 170, 227, 1, 152, 203, 0, 136, 182, 0, 119, 159, 0, 101, 137, 0, 84, 115, 0, 65, 92, 0, 43, 66, 0, 1, 29,
+ 1, 169, 206, 1, 151, 184, 1, 136, 165, 0, 118, 144, 0, 102, 125, 0, 84, 105, 0, 65, 83, 0, 43, 58, 0, 0, 22,
+ 29, 168, 186, 21, 151, 167, 14, 135, 150, 4, 118, 131, 0, 101, 112, 0, 83, 94, 0, 65, 75, 0, 43, 51, 0, 0, 16,
+ 41, 167, 167, 33, 150, 150, 31, 134, 134, 19, 117, 117, 4, 100, 100, 0, 83, 83, 0, 65, 65, 0, 42, 43, 0, 0, 8,
+ 48, 167, 149, 41, 149, 133, 33, 133, 118, 25, 116, 103, 13, 99, 88, 0, 83, 73, 0, 65, 56, 0, 42, 35, 0, 0, 0,
+ 58, 165, 130, 49, 148, 115, 42, 132, 103, 31, 115, 89, 18, 99, 75, 0, 82, 61, 0, 64, 46, 0, 42, 26, 0, 0, 0,
+ 62, 164, 110, 55, 147, 97, 45, 132, 87, 35, 115, 75, 22, 98, 63, 5, 82, 50, 0, 64, 36, 0, 42, 16, 0, 0, 0,
+ 69, 164, 89, 60, 147, 78, 50, 131, 70, 37, 114, 59, 26, 98, 49, 10, 81, 37, 0, 64, 24, 0, 42, 4, 0, 0, 0,
+ 71, 164, 71, 63, 147, 63, 53, 131, 55, 40, 114, 47, 28, 98, 38, 13, 81, 26, 0, 64, 12, 0, 42, 0, 0, 0, 0,
+ 28, 153, 214, 24, 138, 193, 23, 123, 171, 16, 107, 150, 0, 91, 130, 0, 75, 109, 0, 58, 87, 0, 35, 61, 0, 0, 25,
+ 48, 153, 194, 41, 138, 174, 34, 123, 156, 27, 107, 136, 16, 91, 117, 1, 75, 98, 0, 57, 78, 0, 35, 53, 0, 0, 17,
+ 55, 153, 177, 47, 137, 158, 42, 122, 142, 33, 107, 124, 22, 91, 106, 6, 75, 88, 0, 57, 70, 0, 35, 46, 0, 0, 9,
+ 61, 152, 158, 53, 136, 143, 45, 122, 127, 36, 106, 111, 24, 90, 94, 10, 74, 78, 0, 57, 61, 0, 35, 39, 0, 0, 2,
+ 67, 151, 141, 59, 135, 126, 49, 121, 112, 39, 105, 98, 29, 90, 83, 14, 74, 68, 0, 57, 52, 0, 35, 31, 0, 0, 0,
+ 71, 150, 123, 62, 135, 110, 54, 120, 98, 42, 105, 84, 31, 89, 71, 16, 74, 58, 0, 57, 43, 0, 35, 22, 0, 0, 0,
+ 74, 150, 105, 64, 134, 92, 55, 120, 83, 45, 104, 71, 34, 89, 59, 20, 73, 47, 0, 57, 32, 0, 35, 13, 0, 0, 0,
+ 78, 149, 84, 69, 134, 75, 59, 120, 66, 47, 103, 56, 34, 88, 46, 22, 73, 34, 1, 57, 20, 0, 35, 1, 0, 0, 0,
+ 80, 149, 69, 70, 133, 61, 60, 119, 53, 49, 103, 44, 36, 88, 35, 23, 73, 24, 2, 56, 10, 0, 35, 0, 0, 0, 0,
+ 58, 136, 200, 50, 122, 180, 45, 109, 162, 38, 94, 141, 27, 80, 121, 15, 65, 102, 0, 48, 81, 0, 26, 56, 0, 0, 19,
+ 66, 136, 182, 59, 122, 163, 52, 109, 146, 42, 94, 128, 32, 80, 109, 20, 65, 91, 2, 48, 72, 0, 26, 49, 0, 0, 11,
+ 70, 136, 165, 62, 122, 149, 55, 108, 133, 46, 94, 116, 35, 80, 99, 21, 65, 82, 4, 49, 64, 0, 26, 41, 0, 0, 3,
+ 76, 135, 149, 66, 121, 133, 58, 108, 119, 48, 94, 103, 36, 79, 88, 23, 65, 73, 7, 49, 56, 0, 27, 34, 0, 0, 0,
+ 78, 135, 133, 69, 120, 118, 60, 107, 106, 50, 93, 92, 39, 79, 77, 26, 65, 63, 8, 49, 47, 0, 27, 26, 0, 0, 0,
+ 82, 134, 117, 71, 120, 104, 62, 107, 92, 51, 93, 79, 39, 78, 66, 27, 64, 53, 10, 48, 39, 0, 27, 18, 0, 0, 0,
+ 84, 134, 99, 73, 119, 87, 64, 106, 77, 53, 92, 66, 42, 78, 55, 28, 64, 42, 11, 48, 29, 0, 28, 9, 0, 0, 0,
+ 87, 133, 81, 76, 119, 72, 66, 106, 62, 55, 92, 52, 43, 78, 42, 29, 64, 31, 12, 48, 17, 0, 28, 0, 0, 0, 0,
+ 88, 134, 67, 77, 119, 58, 68, 106, 51, 56, 92, 42, 44, 78, 32, 30, 64, 20, 12, 48, 6, 0, 28, 0, 0, 0, 0,
+ 73, 120, 189, 64, 107, 168, 57, 96, 151, 47, 82, 133, 38, 69, 114, 26, 55, 95, 11, 39, 75, 0, 16, 51, 0, 0, 14,
+ 78, 120, 171, 69, 107, 153, 62, 95, 137, 51, 82, 119, 40, 69, 102, 29, 55, 85, 15, 39, 66, 0, 17, 44, 0, 0, 4,
+ 81, 120, 156, 71, 107, 140, 64, 95, 125, 53, 82, 109, 42, 69, 93, 31, 55, 77, 16, 39, 59, 0, 18, 37, 0, 0, 0,
+ 85, 120, 141, 74, 107, 126, 65, 95, 112, 54, 82, 97, 43, 69, 82, 32, 55, 67, 17, 39, 51, 0, 19, 30, 0, 0, 0,
+ 86, 119, 126, 76, 106, 112, 66, 95, 100, 56, 81, 85, 45, 69, 72, 33, 55, 59, 18, 40, 43, 0, 19, 22, 0, 0, 0,
+ 89, 119, 110, 78, 106, 98, 69, 94, 87, 56, 81, 75, 46, 68, 62, 33, 55, 49, 18, 40, 35, 0, 20, 15, 0, 0, 0,
+ 89, 119, 95, 80, 106, 83, 70, 94, 73, 58, 81, 63, 46, 68, 51, 34, 55, 39, 19, 40, 25, 0, 20, 4, 0, 0, 0,
+ 92, 118, 78, 82, 106, 68, 70, 93, 59, 59, 81, 49, 47, 68, 39, 34, 55, 28, 19, 40, 14, 0, 20, 0, 0, 0, 0,
+ 93, 118, 65, 82, 105, 55, 72, 93, 48, 60, 81, 39, 47, 68, 29, 34, 55, 18, 20, 40, 2, 0, 20, 0, 0, 0, 0,
+ 83, 104, 177, 74, 93, 159, 65, 82, 142, 56, 70, 124, 45, 57, 106, 33, 44, 89, 20, 28, 70, 1, 4, 46, 0, 0, 8,
+ 86, 104, 161, 78, 93, 145, 68, 82, 128, 58, 70, 112, 48, 58, 96, 35, 45, 80, 21, 29, 62, 1, 6, 40, 0, 0, 0,
+ 89, 104, 147, 79, 93, 131, 69, 82, 118, 59, 70, 102, 47, 58, 87, 36, 45, 72, 23, 29, 55, 3, 7, 33, 0, 0, 0,
+ 90, 104, 132, 80, 93, 119, 71, 82, 106, 60, 70, 91, 48, 58, 77, 37, 45, 62, 23, 30, 47, 4, 7, 26, 0, 0, 0,
+ 92, 104, 118, 82, 93, 105, 72, 82, 93, 61, 69, 80, 50, 58, 68, 37, 45, 55, 23, 30, 39, 4, 8, 18, 0, 0, 0,
+ 94, 104, 105, 82, 92, 93, 72, 82, 82, 61, 70, 70, 50, 58, 58, 38, 46, 46, 23, 31, 31, 6, 10, 11, 0, 0, 0,
+ 95, 104, 90, 84, 92, 79, 74, 82, 70, 62, 70, 58, 50, 58, 48, 37, 46, 36, 23, 31, 22, 4, 11, 3, 0, 0, 0,
+ 96, 103, 74, 85, 92, 65, 75, 81, 56, 63, 70, 47, 50, 58, 37, 38, 46, 25, 24, 31, 11, 3, 11, 0, 0, 0, 0,
+ 97, 103, 62, 86, 92, 53, 76, 81, 45, 63, 69, 36, 51, 58, 27, 38, 46, 15, 23, 31, 0, 3, 11, 0, 0, 0, 0,
+ 90, 87, 165, 81, 77, 148, 72, 67, 132, 62, 55, 116, 50, 44, 99, 39, 31, 82, 25, 14, 64, 1, 0, 42, 0, 0, 1,
+ 93, 87, 150, 83, 77, 135, 74, 67, 121, 63, 56, 105, 52, 45, 90, 40, 32, 74, 25, 16, 57, 3, 0, 35, 0, 0, 0,
+ 95, 87, 138, 85, 77, 123, 75, 67, 109, 63, 57, 95, 53, 45, 81, 41, 33, 66, 26, 17, 50, 4, 0, 28, 0, 0, 0,
+ 95, 88, 124, 85, 77, 111, 75, 67, 99, 63, 57, 86, 53, 45, 72, 41, 33, 58, 26, 18, 43, 5, 1, 22, 0, 0, 0,
+ 97, 88, 112, 87, 77, 100, 76, 68, 88, 64, 57, 76, 53, 46, 63, 41, 34, 50, 26, 19, 35, 5, 2, 14, 0, 0, 0,
+ 99, 87, 99, 87, 78, 88, 76, 68, 77, 65, 57, 65, 53, 46, 54, 41, 35, 42, 27, 20, 27, 6, 2, 5, 0, 0, 0,
+ 100, 87, 85, 88, 77, 75, 77, 68, 65, 65, 57, 54, 53, 46, 44, 41, 35, 32, 27, 21, 19, 5, 3, 2, 0, 0, 0,
+ 100, 88, 71, 89, 77, 61, 78, 68, 53, 66, 57, 44, 53, 47, 33, 41, 35, 22, 27, 21, 7, 5, 3, 0, 0, 0, 0,
+ 101, 87, 60, 90, 77, 52, 79, 68, 44, 66, 58, 34, 53, 47, 25, 41, 35, 13, 26, 22, 0, 5, 3, 0, 0, 0, 0,
+ 97, 67, 155, 86, 58, 138, 77, 50, 125, 66, 39, 108, 55, 28, 92, 43, 12, 76, 29, 0, 59, 2, 0, 37, 0, 0, 0,
+ 99, 67, 141, 88, 59, 127, 78, 50, 113, 68, 40, 98, 56, 29, 83, 44, 15, 68, 29, 0, 52, 3, 0, 30, 0, 0, 0,
+ 100, 68, 129, 89, 59, 115, 80, 51, 103, 68, 41, 89, 56, 30, 75, 44, 16, 61, 30, 0, 45, 4, 0, 24, 0, 0, 0,
+ 100, 69, 118, 90, 60, 104, 80, 51, 92, 67, 41, 79, 56, 31, 66, 44, 18, 53, 29, 2, 38, 4, 0, 18, 0, 0, 0,
+ 101, 69, 104, 90, 61, 93, 79, 51, 82, 67, 42, 70, 56, 32, 59, 44, 20, 46, 29, 4, 31, 6, 0, 9, 0, 0, 0,
+ 102, 69, 93, 90, 61, 83, 80, 52, 72, 68, 42, 61, 56, 33, 50, 43, 20, 38, 29, 5, 23, 7, 0, 4, 0, 0, 0,
+ 102, 70, 80, 91, 61, 71, 80, 52, 61, 68, 43, 51, 56, 32, 40, 44, 21, 29, 30, 6, 14, 7, 0, 0, 0, 0, 0,
+ 103, 70, 68, 92, 61, 58, 81, 53, 50, 69, 43, 41, 56, 34, 31, 43, 22, 19, 29, 7, 3, 7, 0, 0, 0, 0, 0,
+ 104, 70, 57, 92, 61, 48, 82, 53, 40, 69, 43, 32, 56, 34, 22, 43, 23, 10, 29, 8, 0, 6, 0, 0, 0, 0, 0,
+ 101, 45, 145, 91, 35, 129, 80, 26, 116, 69, 15, 101, 59, 0, 86, 46, 0, 71, 31, 0, 55, 0, 0, 33, 0, 0, 0,
+ 104, 44, 132, 92, 36, 118, 82, 28, 105, 71, 17, 91, 58, 3, 77, 46, 0, 63, 31, 0, 48, 2, 0, 26, 0, 0, 0,
+ 104, 46, 121, 93, 37, 107, 82, 30, 96, 70, 20, 83, 58, 6, 70, 46, 0, 57, 32, 0, 41, 4, 0, 20, 0, 0, 0,
+ 104, 48, 110, 93, 40, 98, 82, 31, 87, 70, 22, 74, 59, 9, 62, 45, 0, 49, 31, 0, 35, 6, 0, 13, 0, 0, 0,
+ 104, 48, 99, 92, 41, 88, 82, 32, 77, 70, 23, 65, 58, 11, 54, 46, 0, 42, 32, 0, 27, 7, 0, 5, 0, 0, 0,
+ 105, 50, 88, 93, 41, 77, 82, 34, 68, 71, 24, 57, 58, 13, 46, 45, 1, 35, 31, 0, 21, 7, 0, 2, 0, 0, 0,
+ 105, 50, 76, 94, 41, 66, 83, 34, 57, 71, 25, 47, 58, 15, 37, 45, 2, 25, 32, 0, 11, 7, 0, 0, 0, 0, 0,
+ 106, 50, 64, 94, 42, 55, 83, 35, 47, 71, 26, 38, 58, 16, 27, 45, 4, 17, 31, 0, 4, 7, 0, 0, 0, 0, 0,
+ 106, 51, 54, 95, 42, 45, 83, 35, 38, 71, 27, 30, 58, 16, 19, 45, 5, 7, 30, 0, 0, 6, 0, 0, 0, 0, 0,
+ 0, 181, 240, 0, 162, 216, 0, 144, 193, 0, 126, 168, 0, 109, 146, 0, 91, 123, 0, 71, 98, 0, 48, 71, 0, 9, 34,
+ 0, 179, 218, 0, 161, 195, 0, 144, 174, 0, 126, 153, 0, 108, 132, 0, 90, 110, 0, 71, 88, 0, 48, 63, 0, 8, 29,
+ 0, 178, 197, 0, 159, 177, 0, 143, 159, 0, 125, 139, 0, 107, 119, 0, 90, 99, 0, 71, 79, 0, 48, 55, 0, 8, 22,
+ 0, 177, 177, 0, 158, 158, 0, 142, 141, 0, 124, 123, 0, 107, 106, 0, 89, 88, 0, 71, 70, 0, 48, 47, 0, 8, 14,
+ 0, 176, 157, 0, 158, 141, 0, 141, 126, 0, 123, 109, 0, 106, 93, 0, 89, 78, 0, 70, 60, 0, 47, 39, 0, 7, 5,
+ 0, 175, 138, 0, 157, 123, 0, 141, 110, 0, 123, 96, 0, 105, 81, 0, 88, 67, 0, 70, 51, 0, 48, 30, 0, 6, 0,
+ 0, 173, 115, 0, 155, 104, 0, 140, 92, 0, 122, 80, 0, 105, 67, 0, 88, 55, 0, 69, 40, 0, 47, 20, 0, 6, 0,
+ 0, 173, 94, 0, 155, 85, 0, 139, 75, 0, 121, 64, 0, 104, 53, 0, 88, 42, 0, 70, 28, 0, 47, 9, 0, 6, 0,
+ 0, 173, 76, 0, 155, 70, 0, 138, 61, 0, 122, 53, 0, 104, 44, 0, 87, 32, 0, 69, 18, 0, 47, 0, 0, 6, 0,
+ 0, 164, 226, 0, 147, 203, 0, 131, 181, 0, 114, 158, 0, 97, 136, 0, 80, 115, 0, 63, 92, 0, 40, 65, 0, 0, 30,
+ 0, 162, 205, 0, 145, 184, 0, 130, 164, 0, 114, 143, 0, 97, 124, 0, 81, 104, 0, 63, 83, 0, 40, 58, 0, 0, 23,
+ 0, 162, 187, 0, 145, 167, 0, 130, 150, 0, 113, 131, 0, 96, 112, 0, 80, 93, 0, 62, 74, 0, 40, 50, 0, 0, 16,
+ 0, 160, 167, 0, 144, 150, 0, 129, 134, 0, 112, 116, 0, 96, 100, 0, 80, 82, 0, 62, 65, 0, 40, 43, 0, 0, 7,
+ 0, 160, 148, 0, 143, 133, 0, 128, 118, 0, 111, 103, 0, 96, 88, 0, 80, 73, 0, 62, 56, 0, 40, 35, 0, 0, 0,
+ 0, 158, 130, 0, 142, 117, 0, 127, 104, 0, 111, 89, 0, 95, 76, 0, 79, 62, 0, 62, 46, 0, 40, 26, 0, 0, 0,
+ 0, 158, 111, 0, 141, 99, 0, 127, 88, 0, 111, 76, 0, 95, 63, 0, 79, 51, 0, 62, 37, 0, 40, 18, 0, 0, 0,
+ 0, 158, 91, 0, 141, 81, 0, 126, 72, 0, 110, 62, 0, 94, 50, 0, 79, 39, 0, 62, 25, 0, 40, 5, 0, 0, 0,
+ 0, 157, 74, 0, 141, 66, 0, 126, 59, 0, 110, 49, 0, 94, 40, 0, 78, 29, 0, 61, 15, 0, 40, 0, 0, 0, 0,
+ 0, 148, 214, 0, 133, 192, 0, 119, 171, 0, 103, 150, 0, 87, 129, 0, 72, 108, 0, 55, 86, 0, 32, 61, 0, 0, 25,
+ 0, 147, 193, 0, 132, 173, 0, 118, 155, 0, 103, 136, 0, 87, 116, 0, 72, 98, 0, 55, 78, 0, 32, 53, 0, 0, 17,
+ 0, 147, 176, 0, 132, 158, 0, 118, 142, 0, 102, 124, 0, 87, 106, 0, 72, 88, 0, 55, 69, 0, 33, 46, 0, 0, 9,
+ 0, 146, 159, 0, 131, 142, 0, 117, 127, 0, 102, 111, 0, 87, 95, 0, 71, 79, 0, 55, 61, 0, 33, 39, 0, 0, 2,
+ 0, 145, 140, 0, 130, 126, 0, 117, 112, 0, 101, 98, 0, 86, 83, 0, 71, 68, 0, 55, 52, 0, 33, 31, 0, 0, 0,
+ 0, 144, 124, 0, 130, 111, 0, 116, 99, 0, 101, 84, 0, 86, 72, 0, 71, 59, 0, 55, 43, 0, 33, 23, 0, 0, 0,
+ 0, 144, 106, 0, 129, 94, 0, 115, 83, 0, 101, 72, 0, 85, 60, 0, 71, 48, 0, 55, 34, 0, 33, 14, 0, 0, 0,
+ 3, 143, 86, 0, 129, 77, 0, 115, 68, 0, 100, 58, 0, 85, 48, 0, 70, 36, 0, 54, 22, 0, 33, 3, 0, 0, 0,
+ 18, 143, 72, 13, 128, 63, 0, 115, 57, 0, 100, 47, 0, 85, 37, 0, 70, 26, 0, 54, 13, 0, 33, 0, 0, 0, 0,
+ 0, 132, 200, 0, 118, 179, 0, 105, 161, 0, 91, 140, 0, 76, 121, 0, 62, 101, 0, 46, 81, 0, 24, 56, 0, 0, 19,
+ 0, 131, 182, 0, 118, 163, 0, 105, 146, 0, 91, 128, 0, 77, 110, 0, 62, 91, 0, 46, 72, 0, 25, 48, 0, 0, 11,
+ 0, 131, 165, 0, 117, 149, 0, 104, 133, 0, 91, 116, 0, 77, 99, 0, 62, 82, 0, 46, 64, 0, 25, 41, 0, 0, 4,
+ 0, 131, 149, 0, 116, 134, 0, 104, 119, 0, 91, 104, 0, 77, 89, 0, 62, 73, 0, 46, 56, 0, 25, 34, 0, 0, 0,
+ 10, 130, 133, 2, 116, 119, 0, 104, 106, 0, 90, 91, 0, 76, 78, 0, 62, 64, 0, 46, 48, 0, 26, 27, 0, 0, 0,
+ 23, 130, 118, 20, 116, 104, 13, 103, 93, 3, 89, 79, 0, 76, 67, 0, 62, 54, 0, 46, 39, 0, 26, 19, 0, 0, 0,
+ 33, 129, 101, 27, 115, 89, 19, 103, 79, 9, 89, 67, 0, 75, 56, 0, 61, 43, 0, 46, 29, 0, 26, 10, 0, 0, 0,
+ 41, 128, 83, 35, 115, 73, 27, 102, 64, 15, 89, 55, 0, 76, 45, 0, 62, 33, 0, 46, 18, 0, 26, 0, 0, 0, 0,
+ 43, 129, 69, 38, 115, 61, 30, 102, 54, 17, 89, 45, 2, 75, 34, 0, 61, 23, 0, 46, 9, 0, 26, 0, 0, 0, 0,
+ 1, 116, 188, 1, 104, 168, 0, 92, 151, 0, 79, 132, 0, 66, 113, 0, 52, 94, 0, 36, 75, 0, 14, 52, 0, 0, 14,
+ 17, 116, 171, 16, 104, 153, 14, 92, 137, 8, 79, 119, 0, 67, 102, 0, 53, 85, 0, 37, 67, 0, 16, 44, 0, 0, 4,
+ 31, 116, 155, 27, 104, 140, 21, 92, 125, 13, 79, 109, 3, 66, 93, 0, 53, 77, 0, 37, 59, 0, 16, 38, 0, 0, 0,
+ 37, 115, 141, 30, 103, 126, 26, 92, 112, 16, 79, 98, 5, 66, 83, 0, 53, 67, 0, 38, 51, 0, 17, 31, 0, 0, 0,
+ 41, 115, 126, 37, 103, 112, 31, 92, 100, 22, 79, 86, 10, 66, 72, 0, 53, 59, 0, 38, 44, 0, 17, 23, 0, 0, 0,
+ 48, 115, 111, 41, 102, 99, 34, 91, 88, 24, 78, 76, 14, 66, 63, 0, 53, 50, 0, 38, 36, 0, 18, 15, 0, 0, 0,
+ 51, 115, 95, 46, 102, 85, 37, 91, 74, 26, 78, 63, 16, 66, 52, 0, 53, 40, 0, 38, 26, 0, 18, 5, 0, 0, 0,
+ 55, 114, 80, 47, 102, 69, 40, 90, 60, 30, 78, 51, 19, 66, 41, 3, 53, 29, 0, 38, 15, 0, 17, 0, 0, 0, 0,
+ 56, 114, 66, 50, 102, 58, 40, 91, 50, 32, 78, 41, 18, 66, 32, 4, 53, 21, 0, 38, 5, 0, 17, 0, 0, 0, 0,
+ 39, 102, 178, 37, 90, 159, 30, 79, 142, 21, 68, 124, 14, 55, 106, 0, 42, 89, 0, 26, 70, 0, 4, 46, 0, 0, 8,
+ 48, 102, 161, 42, 90, 145, 35, 79, 128, 26, 68, 112, 19, 55, 96, 3, 43, 79, 0, 27, 62, 0, 6, 40, 0, 0, 0,
+ 50, 102, 147, 44, 90, 132, 37, 79, 118, 30, 68, 102, 20, 56, 87, 7, 43, 72, 0, 28, 55, 0, 6, 34, 0, 0, 0,
+ 53, 101, 133, 47, 90, 118, 41, 79, 106, 32, 68, 91, 21, 56, 78, 9, 43, 63, 0, 28, 47, 0, 6, 26, 0, 0, 0,
+ 57, 101, 119, 50, 89, 106, 42, 79, 94, 34, 67, 81, 24, 56, 68, 9, 44, 55, 0, 29, 40, 0, 6, 19, 0, 0, 0,
+ 60, 100, 105, 50, 90, 94, 45, 80, 83, 36, 68, 71, 24, 56, 59, 11, 44, 46, 0, 29, 32, 0, 7, 12, 0, 0, 0,
+ 63, 101, 91, 55, 90, 80, 46, 79, 70, 37, 68, 59, 26, 56, 49, 12, 44, 37, 1, 29, 23, 0, 7, 3, 0, 0, 0,
+ 64, 101, 75, 56, 89, 67, 48, 79, 57, 37, 68, 48, 27, 56, 37, 15, 44, 26, 0, 29, 12, 0, 7, 0, 0, 0, 0,
+ 66, 101, 64, 58, 89, 55, 49, 79, 47, 39, 68, 38, 27, 56, 29, 14, 44, 18, 1, 30, 2, 0, 7, 0, 0, 0, 0,
+ 57, 86, 165, 51, 75, 148, 45, 65, 133, 38, 54, 116, 28, 43, 100, 16, 29, 83, 0, 13, 64, 0, 0, 42, 0, 0, 3,
+ 60, 86, 151, 55, 75, 135, 47, 66, 121, 39, 55, 105, 30, 44, 90, 18, 31, 74, 3, 16, 57, 0, 1, 35, 0, 0, 0,
+ 62, 86, 139, 56, 75, 123, 49, 66, 110, 40, 55, 95, 30, 44, 81, 19, 31, 66, 4, 17, 51, 0, 1, 29, 0, 0, 0,
+ 65, 86, 125, 56, 76, 112, 49, 66, 99, 39, 55, 86, 31, 44, 72, 19, 32, 59, 5, 18, 44, 0, 1, 23, 0, 0, 0,
+ 67, 86, 113, 58, 75, 100, 51, 66, 88, 41, 56, 77, 31, 45, 64, 20, 32, 51, 6, 18, 35, 0, 1, 14, 0, 0, 0,
+ 69, 86, 99, 61, 76, 88, 52, 66, 78, 43, 56, 66, 32, 45, 55, 20, 33, 42, 7, 19, 27, 0, 1, 6, 0, 0, 0,
+ 69, 86, 86, 61, 76, 75, 53, 67, 66, 43, 56, 55, 33, 45, 45, 21, 34, 34, 8, 20, 20, 0, 2, 2, 0, 0, 0,
+ 71, 86, 72, 63, 75, 62, 54, 66, 55, 45, 56, 45, 33, 45, 35, 22, 34, 23, 7, 20, 8, 0, 2, 0, 0, 0, 0,
+ 71, 86, 62, 64, 75, 53, 55, 66, 46, 45, 56, 36, 33, 46, 27, 22, 34, 15, 8, 20, 0, 0, 2, 0, 0, 0, 0,
+ 69, 67, 156, 61, 58, 140, 53, 50, 125, 45, 39, 108, 35, 28, 93, 25, 12, 77, 12, 0, 59, 0, 0, 37, 0, 0, 0,
+ 71, 68, 142, 63, 59, 126, 56, 50, 114, 47, 40, 98, 37, 28, 84, 26, 15, 68, 12, 0, 53, 0, 0, 30, 0, 0, 0,
+ 72, 68, 130, 63, 59, 116, 56, 50, 104, 47, 40, 90, 38, 30, 75, 27, 16, 61, 13, 0, 46, 0, 0, 24, 0, 0, 0,
+ 73, 69, 118, 65, 59, 105, 57, 51, 92, 47, 41, 80, 37, 30, 67, 26, 18, 53, 14, 1, 39, 0, 0, 18, 0, 0, 0,
+ 74, 69, 106, 65, 60, 93, 57, 51, 82, 48, 41, 70, 38, 31, 59, 26, 19, 46, 13, 2, 32, 0, 0, 10, 0, 0, 0,
+ 76, 69, 95, 66, 61, 84, 58, 52, 73, 48, 42, 61, 37, 32, 50, 26, 20, 38, 14, 4, 24, 0, 0, 4, 0, 0, 0,
+ 76, 69, 81, 68, 60, 72, 58, 52, 62, 48, 42, 51, 38, 32, 41, 27, 21, 30, 14, 4, 16, 0, 0, 1, 0, 0, 0,
+ 76, 69, 68, 68, 61, 60, 60, 52, 51, 49, 43, 41, 38, 33, 32, 27, 21, 20, 14, 5, 5, 0, 0, 0, 0, 0, 0,
+ 78, 70, 59, 69, 61, 50, 60, 52, 42, 49, 43, 34, 39, 33, 24, 27, 22, 13, 14, 7, 1, 0, 0, 0, 0, 0, 0,
+ 75, 46, 146, 68, 38, 131, 60, 30, 117, 50, 19, 102, 41, 4, 87, 29, 0, 72, 13, 0, 55, 0, 0, 33, 0, 0, 0,
+ 78, 47, 132, 70, 39, 119, 61, 30, 105, 53, 20, 92, 42, 5, 78, 30, 0, 64, 13, 0, 49, 0, 0, 27, 0, 0, 0,
+ 79, 48, 122, 70, 40, 108, 62, 32, 96, 52, 22, 84, 42, 9, 71, 30, 0, 58, 14, 0, 42, 0, 0, 20, 0, 0, 0,
+ 79, 50, 111, 70, 42, 99, 62, 33, 88, 52, 23, 74, 41, 11, 63, 29, 0, 50, 14, 0, 36, 0, 0, 14, 0, 0, 0,
+ 80, 50, 99, 70, 42, 89, 61, 34, 78, 52, 25, 67, 41, 14, 55, 30, 0, 42, 15, 0, 28, 0, 0, 6, 0, 0, 0,
+ 81, 51, 89, 71, 43, 78, 62, 35, 69, 52, 25, 58, 42, 15, 47, 30, 3, 36, 15, 0, 22, 0, 0, 3, 0, 0, 0,
+ 81, 51, 77, 71, 44, 68, 63, 36, 59, 53, 26, 49, 41, 16, 38, 31, 4, 27, 16, 0, 12, 0, 0, 0, 0, 0, 0,
+ 81, 52, 65, 72, 43, 56, 63, 36, 48, 53, 27, 39, 41, 17, 29, 30, 4, 18, 14, 0, 3, 0, 0, 0, 0, 0, 0,
+ 81, 52, 55, 73, 44, 47, 64, 36, 39, 53, 28, 32, 42, 18, 21, 31, 6, 9, 14, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 174, 239, 0, 156, 214, 0, 139, 192, 0, 121, 168, 0, 105, 145, 0, 87, 123, 0, 68, 98, 0, 46, 70, 0, 3, 35,
+ 0, 172, 217, 0, 155, 194, 0, 139, 173, 0, 121, 152, 0, 104, 130, 0, 87, 110, 0, 69, 88, 0, 46, 63, 0, 4, 28,
+ 0, 171, 197, 0, 153, 175, 0, 138, 158, 0, 121, 139, 0, 103, 118, 0, 86, 100, 0, 68, 79, 0, 46, 55, 0, 4, 22,
+ 0, 170, 177, 0, 152, 158, 0, 136, 141, 0, 119, 124, 0, 103, 106, 0, 86, 88, 0, 68, 70, 0, 45, 47, 0, 3, 14,
+ 0, 169, 157, 0, 152, 141, 0, 136, 126, 0, 119, 109, 0, 102, 94, 0, 86, 78, 0, 68, 60, 0, 46, 39, 0, 3, 5,
+ 0, 167, 138, 0, 150, 124, 0, 135, 111, 0, 118, 97, 0, 102, 82, 0, 85, 68, 0, 68, 52, 0, 46, 31, 0, 3, 0,
+ 0, 167, 118, 0, 150, 104, 0, 135, 94, 0, 118, 81, 0, 101, 69, 0, 84, 56, 0, 67, 41, 0, 45, 21, 0, 3, 0,
+ 0, 166, 97, 0, 149, 87, 0, 134, 77, 0, 117, 67, 0, 101, 56, 0, 85, 44, 0, 67, 30, 0, 45, 10, 0, 3, 0,
+ 0, 165, 79, 0, 149, 73, 0, 133, 64, 0, 117, 56, 0, 101, 46, 0, 85, 34, 0, 68, 21, 0, 46, 1, 0, 3, 0,
+ 0, 158, 225, 0, 141, 201, 0, 126, 180, 0, 109, 158, 0, 94, 136, 0, 78, 114, 0, 60, 91, 0, 38, 66, 0, 0, 30,
+ 0, 156, 203, 0, 140, 183, 0, 125, 164, 0, 109, 143, 0, 94, 124, 0, 78, 104, 0, 61, 83, 0, 38, 57, 0, 0, 23,
+ 0, 156, 186, 0, 140, 166, 0, 125, 150, 0, 109, 130, 0, 93, 111, 0, 77, 93, 0, 60, 74, 0, 38, 50, 0, 0, 17,
+ 0, 155, 167, 0, 138, 149, 0, 124, 134, 0, 109, 117, 0, 93, 100, 0, 76, 83, 0, 60, 65, 0, 38, 43, 0, 0, 9,
+ 0, 153, 147, 0, 138, 134, 0, 124, 120, 0, 107, 103, 0, 92, 88, 0, 77, 73, 0, 60, 56, 0, 38, 35, 0, 0, 0,
+ 0, 153, 131, 0, 137, 118, 0, 122, 105, 0, 107, 90, 0, 91, 76, 0, 76, 63, 0, 60, 47, 0, 39, 28, 0, 0, 0,
+ 0, 153, 111, 0, 136, 100, 0, 123, 90, 0, 107, 77, 0, 92, 65, 0, 76, 52, 0, 60, 37, 0, 38, 18, 0, 0, 0,
+ 0, 152, 93, 0, 136, 82, 0, 122, 74, 0, 106, 63, 0, 91, 52, 0, 76, 40, 0, 59, 26, 0, 38, 6, 0, 0, 0,
+ 0, 151, 78, 0, 136, 69, 0, 121, 61, 0, 106, 52, 0, 91, 43, 0, 76, 32, 0, 59, 17, 0, 38, 0, 0, 0, 0,
+ 0, 143, 213, 0, 128, 191, 0, 115, 171, 0, 100, 149, 0, 84, 128, 0, 69, 108, 0, 52, 86, 0, 30, 61, 0, 0, 25,
+ 0, 142, 193, 0, 127, 173, 0, 114, 154, 0, 99, 134, 0, 84, 116, 0, 69, 98, 0, 52, 77, 0, 31, 53, 0, 0, 18,
+ 0, 141, 176, 0, 127, 158, 0, 114, 141, 0, 98, 122, 0, 84, 105, 0, 69, 88, 0, 53, 69, 0, 31, 46, 0, 0, 9,
+ 0, 141, 159, 0, 126, 142, 0, 113, 127, 0, 98, 110, 0, 83, 95, 0, 69, 78, 0, 53, 60, 0, 32, 39, 0, 0, 2,
+ 0, 140, 140, 0, 126, 126, 0, 112, 112, 0, 98, 98, 0, 83, 83, 0, 68, 69, 0, 52, 52, 0, 31, 31, 0, 0, 0,
+ 0, 140, 124, 0, 125, 112, 0, 112, 100, 0, 97, 86, 0, 83, 72, 0, 68, 59, 0, 52, 44, 0, 31, 23, 0, 0, 0,
+ 0, 139, 106, 0, 125, 96, 0, 111, 85, 0, 97, 72, 0, 83, 62, 0, 68, 49, 0, 52, 35, 0, 31, 15, 0, 0, 0,
+ 0, 138, 88, 0, 124, 79, 0, 111, 70, 0, 96, 59, 0, 82, 48, 0, 68, 38, 0, 52, 24, 0, 31, 4, 0, 0, 0,
+ 0, 139, 76, 0, 124, 66, 0, 111, 58, 0, 96, 50, 0, 82, 40, 0, 68, 29, 0, 52, 15, 0, 31, 0, 0, 0, 0,
+ 0, 129, 200, 0, 114, 179, 0, 102, 160, 0, 87, 139, 0, 74, 120, 0, 60, 101, 0, 44, 81, 0, 22, 56, 0, 0, 19,
+ 0, 127, 181, 0, 114, 163, 0, 102, 146, 0, 88, 127, 0, 74, 109, 0, 60, 91, 0, 44, 72, 0, 23, 48, 0, 0, 11,
+ 0, 127, 166, 0, 113, 148, 0, 101, 133, 0, 87, 115, 0, 74, 99, 0, 60, 82, 0, 44, 64, 0, 23, 42, 0, 0, 4,
+ 0, 127, 150, 0, 113, 134, 0, 101, 119, 0, 87, 104, 0, 74, 89, 0, 60, 73, 0, 44, 56, 0, 23, 35, 0, 0, 0,
+ 0, 125, 134, 0, 112, 118, 0, 100, 106, 0, 87, 92, 0, 73, 78, 0, 60, 64, 0, 44, 48, 0, 23, 27, 0, 0, 0,
+ 0, 125, 118, 0, 112, 105, 0, 100, 94, 0, 86, 80, 0, 73, 68, 0, 60, 54, 0, 44, 39, 0, 23, 20, 0, 0, 0,
+ 0, 125, 101, 0, 111, 90, 0, 99, 80, 0, 86, 69, 0, 73, 58, 0, 59, 45, 0, 44, 30, 0, 23, 11, 0, 0, 0,
+ 0, 124, 85, 0, 111, 75, 0, 99, 66, 0, 86, 56, 0, 73, 45, 0, 59, 34, 0, 44, 20, 0, 23, 1, 0, 0, 0,
+ 0, 125, 72, 0, 111, 62, 0, 99, 56, 0, 86, 46, 0, 73, 36, 0, 60, 26, 0, 44, 12, 0, 23, 0, 0, 0, 0,
+ 0, 114, 188, 0, 101, 167, 0, 89, 150, 0, 77, 131, 0, 64, 113, 0, 50, 95, 0, 34, 75, 0, 12, 52, 0, 0, 14,
+ 0, 113, 170, 0, 101, 153, 0, 89, 137, 0, 77, 120, 0, 64, 102, 0, 50, 85, 0, 35, 67, 0, 12, 44, 0, 0, 4,
+ 0, 113, 156, 0, 100, 139, 0, 89, 125, 0, 77, 109, 0, 64, 92, 0, 51, 77, 0, 35, 60, 0, 12, 38, 0, 0, 0,
+ 0, 112, 141, 0, 100, 126, 0, 89, 113, 0, 77, 98, 0, 64, 83, 0, 51, 68, 0, 35, 51, 0, 12, 30, 0, 0, 0,
+ 0, 112, 127, 0, 100, 112, 0, 89, 100, 0, 76, 87, 0, 64, 74, 0, 51, 59, 0, 35, 44, 0, 13, 24, 0, 0, 0,
+ 0, 112, 111, 0, 100, 100, 0, 88, 88, 0, 76, 76, 0, 64, 64, 0, 51, 52, 0, 36, 37, 0, 13, 17, 0, 0, 0,
+ 0, 111, 96, 0, 99, 85, 0, 88, 76, 0, 76, 64, 0, 64, 53, 0, 51, 41, 0, 36, 27, 0, 13, 6, 0, 0, 0,
+ 0, 111, 81, 0, 99, 71, 0, 88, 62, 0, 76, 52, 0, 64, 43, 0, 51, 31, 0, 36, 17, 0, 13, 0, 0, 0, 0,
+ 0, 111, 69, 0, 99, 60, 0, 88, 52, 0, 75, 43, 0, 63, 34, 0, 51, 21, 0, 36, 7, 0, 13, 0, 0, 0, 0,
+ 0, 99, 177, 0, 88, 158, 0, 77, 141, 0, 66, 123, 0, 53, 106, 0, 40, 89, 0, 25, 71, 0, 5, 47, 0, 0, 8,
+ 0, 99, 160, 0, 88, 144, 0, 77, 129, 0, 66, 112, 0, 54, 97, 0, 41, 80, 0, 26, 62, 0, 5, 40, 0, 0, 0,
+ 0, 99, 147, 0, 87, 132, 0, 78, 117, 0, 66, 102, 0, 54, 87, 0, 42, 72, 0, 26, 55, 0, 5, 34, 0, 0, 0,
+ 0, 99, 134, 0, 88, 119, 0, 77, 107, 0, 66, 92, 0, 54, 78, 0, 42, 64, 0, 27, 48, 0, 5, 27, 0, 0, 0,
+ 0, 99, 120, 0, 87, 107, 0, 78, 94, 0, 66, 81, 0, 54, 68, 0, 42, 55, 0, 27, 40, 0, 6, 20, 0, 0, 0,
+ 0, 98, 105, 0, 87, 94, 0, 77, 84, 0, 65, 71, 0, 55, 59, 0, 42, 47, 0, 28, 33, 0, 6, 12, 0, 0, 0,
+ 0, 98, 93, 0, 87, 81, 0, 77, 72, 0, 66, 61, 0, 54, 49, 0, 42, 37, 0, 28, 24, 0, 6, 4, 0, 0, 0,
+ 0, 98, 77, 0, 87, 68, 0, 77, 59, 0, 65, 49, 0, 54, 39, 0, 42, 27, 0, 29, 14, 0, 6, 0, 0, 0, 0,
+ 1, 98, 65, 7, 87, 56, 0, 77, 49, 0, 66, 41, 0, 54, 30, 0, 42, 19, 0, 29, 3, 0, 6, 0, 0, 0, 0,
+ 0, 84, 166, 0, 74, 149, 0, 64, 134, 0, 53, 117, 0, 41, 100, 0, 28, 83, 0, 11, 64, 0, 0, 42, 0, 0, 3,
+ 0, 84, 151, 0, 74, 135, 0, 64, 121, 0, 53, 105, 0, 42, 90, 0, 30, 75, 0, 14, 58, 0, 0, 36, 0, 0, 0,
+ 0, 84, 138, 0, 74, 124, 1, 64, 110, 0, 54, 95, 0, 43, 81, 0, 30, 67, 0, 15, 51, 0, 1, 29, 0, 0, 0,
+ 14, 84, 126, 12, 74, 112, 2, 65, 99, 0, 54, 85, 0, 44, 73, 0, 31, 59, 0, 16, 44, 0, 1, 23, 0, 0, 0,
+ 16, 84, 113, 13, 74, 100, 6, 65, 89, 0, 54, 77, 0, 44, 65, 0, 31, 51, 0, 17, 36, 0, 1, 16, 0, 0, 0,
+ 24, 84, 100, 18, 74, 88, 13, 65, 78, 2, 55, 68, 0, 44, 55, 0, 32, 43, 0, 18, 28, 0, 1, 6, 0, 0, 0,
+ 26, 84, 87, 24, 74, 76, 17, 65, 67, 7, 54, 57, 0, 44, 46, 0, 32, 35, 0, 19, 21, 0, 2, 3, 0, 0, 0,
+ 30, 84, 74, 28, 74, 64, 20, 65, 55, 12, 55, 46, 0, 44, 35, 0, 32, 24, 0, 18, 9, 0, 1, 0, 0, 0, 0,
+ 32, 84, 63, 28, 74, 54, 21, 65, 47, 13, 54, 38, 0, 44, 28, 0, 32, 16, 0, 18, 1, 0, 1, 0, 0, 0, 0,
+ 30, 67, 155, 20, 58, 139, 20, 49, 126, 12, 39, 110, 0, 27, 94, 0, 13, 77, 0, 0, 60, 0, 0, 37, 0, 0, 0,
+ 35, 67, 142, 30, 58, 126, 23, 50, 114, 16, 40, 99, 7, 29, 85, 0, 15, 69, 0, 0, 52, 0, 0, 30, 0, 0, 0,
+ 35, 68, 131, 30, 59, 116, 27, 50, 104, 18, 40, 90, 9, 29, 76, 0, 17, 62, 0, 2, 46, 0, 0, 24, 0, 0, 0,
+ 37, 69, 119, 33, 59, 106, 27, 51, 94, 21, 41, 80, 9, 30, 67, 0, 18, 54, 0, 3, 39, 0, 0, 18, 0, 0, 0,
+ 40, 69, 107, 36, 59, 94, 28, 51, 84, 18, 41, 72, 10, 31, 60, 0, 19, 47, 0, 4, 32, 0, 0, 10, 0, 0, 0,
+ 42, 69, 95, 36, 59, 84, 29, 51, 74, 19, 41, 63, 10, 31, 52, 0, 20, 39, 0, 4, 25, 0, 0, 4, 0, 0, 0,
+ 43, 69, 83, 38, 60, 73, 32, 51, 62, 23, 42, 53, 11, 31, 42, 0, 20, 31, 0, 5, 17, 0, 0, 1, 0, 0, 0,
+ 45, 69, 70, 39, 60, 60, 33, 51, 52, 24, 42, 43, 13, 32, 33, 0, 21, 21, 0, 5, 6, 0, 0, 0, 0, 0, 0,
+ 47, 69, 59, 41, 60, 51, 34, 51, 43, 24, 42, 35, 12, 33, 26, 1, 22, 14, 0, 5, 1, 0, 0, 0, 0, 0, 0,
+ 46, 48, 146, 42, 40, 131, 36, 32, 118, 27, 22, 103, 17, 6, 88, 5, 0, 73, 0, 0, 55, 0, 0, 33, 0, 0, 0,
+ 48, 48, 133, 44, 40, 119, 37, 32, 107, 28, 22, 93, 20, 8, 79, 7, 0, 65, 0, 0, 49, 0, 0, 27, 0, 0, 0,
+ 48, 50, 123, 44, 41, 109, 37, 33, 97, 30, 23, 83, 21, 11, 71, 8, 0, 58, 0, 0, 42, 0, 0, 21, 0, 0, 0,
+ 49, 51, 111, 45, 42, 99, 38, 34, 87, 29, 25, 75, 20, 13, 63, 8, 0, 51, 0, 0, 36, 0, 0, 14, 0, 0, 0,
+ 52, 52, 100, 44, 43, 89, 38, 35, 79, 29, 26, 68, 19, 15, 56, 10, 1, 43, 0, 0, 28, 0, 0, 6, 0, 0, 0,
+ 52, 52, 90, 47, 44, 79, 39, 36, 70, 30, 27, 59, 20, 16, 47, 9, 2, 36, 0, 0, 22, 0, 0, 2, 0, 0, 0,
+ 52, 53, 78, 46, 44, 68, 39, 37, 60, 32, 27, 49, 22, 17, 39, 10, 3, 28, 0, 0, 12, 0, 0, 0, 0, 0, 0,
+ 53, 53, 66, 47, 44, 57, 40, 36, 48, 32, 27, 39, 22, 18, 30, 9, 4, 18, 0, 0, 3, 0, 0, 0, 0, 0, 0,
+ 54, 53, 57, 48, 45, 49, 41, 37, 41, 33, 28, 32, 22, 19, 23, 11, 6, 10, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+};
+void AdobeCMYK_to_sRGB1(FX_BYTE c, FX_BYTE m, FX_BYTE y, FX_BYTE k, FX_BYTE& R, FX_BYTE& G, FX_BYTE& B)
+{
+ int fix_c = c << 8;
+ int fix_m = m << 8;
+ int fix_y = y << 8;
+ int fix_k = k << 8;
+ int c_index = (fix_c + 4096) >> 13;
+ int m_index = (fix_m + 4096) >> 13;
+ int y_index = (fix_y + 4096) >> 13;
+ int k_index = (fix_k + 4096) >> 13;
+ int pos = (c_index * 9 * 9 * 9 + m_index * 9 * 9 + y_index * 9 + k_index) * 3;
+ int fix_r = g_CMYKSamples[pos] << 8;
+ int fix_g = g_CMYKSamples[pos + 1] << 8;
+ int fix_b = g_CMYKSamples[pos + 2] << 8;
+ int c1_index = fix_c >> 13;
+ if (c1_index == c_index) {
+ c1_index = c1_index == 8 ? c1_index - 1 : c1_index + 1;
+ }
+ int m1_index = fix_m >> 13;
+ if (m1_index == m_index) {
+ m1_index = m1_index == 8 ? m1_index - 1 : m1_index + 1;
+ }
+ int y1_index = fix_y >> 13;
+ if (y1_index == y_index) {
+ y1_index = y1_index == 8 ? y1_index - 1 : y1_index + 1;
+ }
+ int k1_index = fix_k >> 13;
+ if (k1_index == k_index) {
+ k1_index = k1_index == 8 ? k1_index - 1 : k1_index + 1;
+ }
+ int c1_pos = pos + (c1_index - c_index) * 9 * 9 * 9 * 3;
+ int m1_pos = pos + (m1_index - m_index) * 9 * 9 * 3;
+ int y1_pos = pos + (y1_index - y_index) * 9 * 3;
+ int k1_pos = pos + (k1_index - k_index) * 3;
+ int c_r_delta = g_CMYKSamples[pos] - g_CMYKSamples[c1_pos];
+ int c_g_delta = g_CMYKSamples[pos + 1] - g_CMYKSamples[c1_pos + 1];
+ int c_b_delta = g_CMYKSamples[pos + 2] - g_CMYKSamples[c1_pos + 2];
+ int m_r_delta = g_CMYKSamples[pos] - g_CMYKSamples[m1_pos];
+ int m_g_delta = g_CMYKSamples[pos + 1] - g_CMYKSamples[m1_pos + 1];
+ int m_b_delta = g_CMYKSamples[pos + 2] - g_CMYKSamples[m1_pos + 2];
+ int y_r_delta = g_CMYKSamples[pos] - g_CMYKSamples[y1_pos];
+ int y_g_delta = g_CMYKSamples[pos + 1] - g_CMYKSamples[y1_pos + 1];
+ int y_b_delta = g_CMYKSamples[pos + 2] - g_CMYKSamples[y1_pos + 2];
+ int k_r_delta = g_CMYKSamples[pos] - g_CMYKSamples[k1_pos];
+ int k_g_delta = g_CMYKSamples[pos + 1] - g_CMYKSamples[k1_pos + 1];
+ int k_b_delta = g_CMYKSamples[pos + 2] - g_CMYKSamples[k1_pos + 2];
+ int c_rate = (fix_c - (c_index << 13)) * (c_index - c1_index);
+ fix_r += c_r_delta * c_rate / 32;
+ fix_g += c_g_delta * c_rate / 32;
+ fix_b += c_b_delta * c_rate / 32;
+ int m_rate = (fix_m - (m_index << 13)) * (m_index - m1_index);
+ fix_r += m_r_delta * m_rate / 32;
+ fix_g += m_g_delta * m_rate / 32;
+ fix_b += m_b_delta * m_rate / 32;
+ int y_rate = (fix_y - (y_index << 13)) * (y_index - y1_index);
+ fix_r += y_r_delta * y_rate / 32;
+ fix_g += y_g_delta * y_rate / 32;
+ fix_b += y_b_delta * y_rate / 32;
+ int k_rate = (fix_k - (k_index << 13)) * (k_index - k1_index);
+ fix_r += k_r_delta * k_rate / 32;
+ fix_g += k_g_delta * k_rate / 32;
+ fix_b += k_b_delta * k_rate / 32;
+ if (fix_r < 0) {
+ fix_r = 0;
+ }
+ if (fix_g < 0) {
+ fix_g = 0;
+ }
+ if (fix_b < 0) {
+ fix_b = 0;
+ }
+ R = fix_r >> 8;
+ G = fix_g >> 8;
+ B = fix_b >> 8;
+}
+void AdobeCMYK_to_sRGB(FX_FLOAT c, FX_FLOAT m, FX_FLOAT y, FX_FLOAT k, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B)
+{
+ FX_BYTE c1 = FXSYS_round(c * 255);
+ FX_BYTE m1 = FXSYS_round(m * 255);
+ FX_BYTE y1 = FXSYS_round(y * 255);
+ FX_BYTE k1 = FXSYS_round(k * 255);
+ FX_BYTE r, g, b;
+ AdobeCMYK_to_sRGB1(c1, m1, y1, k1, r, g, b);
+ R = 1.0f * r / 255;
+ G = 1.0f * g / 255;
+ B = 1.0f * b / 255;
+}
diff --git a/core/src/fxcodec/codec/fx_codec_jbig.cpp b/core/src/fxcodec/codec/fx_codec_jbig.cpp
index a644e99c5d..996ad60f8a 100644
--- a/core/src/fxcodec/codec/fx_codec_jbig.cpp
+++ b/core/src/fxcodec/codec/fx_codec_jbig.cpp
@@ -1,212 +1,212 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../../include/fxcodec/fx_codec.h"
-#include "codec_int.h"
-CCodec_Jbig2Context::CCodec_Jbig2Context()
-{
- FXSYS_memset32(this, 0, sizeof(CCodec_Jbig2Context));
-}
-CCodec_Jbig2Module::~CCodec_Jbig2Module()
-{
-}
-void* CCodec_Jbig2Module::CreateJbig2Context()
-{
- return FX_NEW CCodec_Jbig2Context();
-}
-void CCodec_Jbig2Module::DestroyJbig2Context(void* pJbig2Content)
-{
- if(pJbig2Content) {
- CJBig2_Context::DestroyContext(((CCodec_Jbig2Context*)pJbig2Content)->m_pContext);
- delete (CCodec_Jbig2Context*)pJbig2Content;
- }
- pJbig2Content = NULL;
-}
-FX_BOOL CCodec_Jbig2Module::Decode(FX_DWORD width, FX_DWORD height, FX_LPCBYTE src_buf, FX_DWORD src_size,
- FX_LPCBYTE global_data, FX_DWORD global_size, FX_LPBYTE dest_buf, FX_DWORD dest_pitch)
-{
- FXSYS_memset32(dest_buf, 0, height * dest_pitch);
- CJBig2_Context* pContext = CJBig2_Context::CreateContext(&m_Module,
- (FX_LPBYTE)global_data, global_size, (FX_LPBYTE)src_buf, src_size, JBIG2_EMBED_STREAM);
- if (pContext == NULL) {
- return FALSE;
- }
- int ret = pContext->getFirstPage(dest_buf, width, height, dest_pitch, NULL);
- CJBig2_Context::DestroyContext(pContext);
- if (ret != JBIG2_SUCCESS) {
- return FALSE;
- }
- int dword_size = height * dest_pitch / 4;
- FX_DWORD* dword_buf = (FX_DWORD*)dest_buf;
- for (int i = 0; i < dword_size; i ++) {
- dword_buf[i] = ~dword_buf[i];
- }
- return TRUE;
-}
-FX_BOOL CCodec_Jbig2Module::Decode(IFX_FileRead* file_ptr,
- FX_DWORD& width, FX_DWORD& height, FX_DWORD& pitch, FX_LPBYTE& dest_buf)
-{
- CJBig2_Context* pContext = NULL;
- CJBig2_Image* dest_image = NULL;
- FX_DWORD src_size = (FX_DWORD)file_ptr->GetSize();
- FX_LPBYTE src_buf = FX_Alloc(FX_BYTE, src_size);
- if (src_buf == NULL) {
- return FALSE;
- }
- int ret = 0;
- if(!file_ptr->ReadBlock(src_buf, 0, src_size)) {
- goto failed;
- }
- pContext = CJBig2_Context::CreateContext(&m_Module, NULL, 0, src_buf, src_size, JBIG2_FILE_STREAM);
- if(pContext == NULL) {
- goto failed;
- }
- ret = pContext->getFirstPage(&dest_image, NULL);
- CJBig2_Context::DestroyContext(pContext);
- if (ret != JBIG2_SUCCESS) {
- goto failed;
- }
- width = (FX_DWORD)dest_image->m_nWidth;
- height = (FX_DWORD)dest_image->m_nHeight;
- pitch = (FX_DWORD)dest_image->m_nStride;
- dest_buf = dest_image->m_pData;
- dest_image->m_bNeedFree = FALSE;
- delete dest_image;
- FX_Free(src_buf);
- return TRUE;
-failed:
- if(src_buf) {
- FX_Free(src_buf);
- }
- return FALSE;
-}
-FXCODEC_STATUS CCodec_Jbig2Module::StartDecode(void* pJbig2Context, FX_DWORD width, FX_DWORD height, FX_LPCBYTE src_buf, FX_DWORD src_size,
- FX_LPCBYTE global_data, FX_DWORD global_size, FX_LPBYTE dest_buf, FX_DWORD dest_pitch, IFX_Pause* pPause)
-{
- if(!pJbig2Context) {
- return FXCODEC_STATUS_ERR_PARAMS;
- }
- CCodec_Jbig2Context* m_pJbig2Context = (CCodec_Jbig2Context*)pJbig2Context;
- m_pJbig2Context->m_width = width;
- m_pJbig2Context->m_height = height;
- m_pJbig2Context->m_src_buf = (unsigned char *)src_buf;
- m_pJbig2Context->m_src_size = src_size;
- m_pJbig2Context->m_global_data = global_data;
- m_pJbig2Context->m_global_size = global_size;
- m_pJbig2Context->m_dest_buf = dest_buf;
- m_pJbig2Context->m_dest_pitch = dest_pitch;
- m_pJbig2Context->m_pPause = pPause;
- m_pJbig2Context->m_bFileReader = FALSE;
- FXSYS_memset32(dest_buf, 0, height * dest_pitch);
- m_pJbig2Context->m_pContext = CJBig2_Context::CreateContext(&m_Module,
- (FX_LPBYTE)global_data, global_size, (FX_LPBYTE)src_buf, src_size, JBIG2_EMBED_STREAM, pPause);
- if(!m_pJbig2Context->m_pContext) {
- return FXCODEC_STATUS_ERROR;
- }
- int ret = m_pJbig2Context->m_pContext->getFirstPage(dest_buf, width, height, dest_pitch, pPause);
- if(m_pJbig2Context->m_pContext->GetProcessiveStatus() == FXCODEC_STATUS_DECODE_FINISH) {
- CJBig2_Context::DestroyContext(m_pJbig2Context->m_pContext);
- m_pJbig2Context->m_pContext = NULL;
- if (ret != JBIG2_SUCCESS) {
- return FXCODEC_STATUS_ERROR;
- }
- int dword_size = height * dest_pitch / 4;
- FX_DWORD* dword_buf = (FX_DWORD*)dest_buf;
- for (int i = 0; i < dword_size; i ++) {
- dword_buf[i] = ~dword_buf[i];
- }
- return FXCODEC_STATUS_DECODE_FINISH;
- }
- return m_pJbig2Context->m_pContext->GetProcessiveStatus();
-}
-FXCODEC_STATUS CCodec_Jbig2Module::StartDecode(void* pJbig2Context, IFX_FileRead* file_ptr,
- FX_DWORD& width, FX_DWORD& height, FX_DWORD& pitch, FX_LPBYTE& dest_buf, IFX_Pause* pPause)
-{
- if(!pJbig2Context) {
- return FXCODEC_STATUS_ERR_PARAMS;
- }
- CCodec_Jbig2Context* m_pJbig2Context = (CCodec_Jbig2Context*)pJbig2Context;
- m_pJbig2Context->m_bFileReader = TRUE;
- m_pJbig2Context->m_dest_image = NULL;
- m_pJbig2Context->m_src_size = (FX_DWORD)file_ptr->GetSize();
- m_pJbig2Context->m_src_buf = FX_Alloc(FX_BYTE, m_pJbig2Context->m_src_size);
- if (m_pJbig2Context->m_src_buf == NULL) {
- return FXCODEC_STATUS_ERR_MEMORY;
- }
- int ret = 0;
- if(!file_ptr->ReadBlock((void*)m_pJbig2Context->m_src_buf, 0, m_pJbig2Context->m_src_size)) {
- goto failed;
- }
- m_pJbig2Context->m_pContext = CJBig2_Context::CreateContext(&m_Module, NULL, 0, m_pJbig2Context->m_src_buf, m_pJbig2Context->m_src_size, JBIG2_FILE_STREAM, pPause);
- if(m_pJbig2Context->m_pContext == NULL) {
- goto failed;
- }
- ret = m_pJbig2Context->m_pContext->getFirstPage(&m_pJbig2Context->m_dest_image, pPause);
- if(m_pJbig2Context->m_pContext->GetProcessiveStatus() == FXCODEC_STATUS_DECODE_TOBECONTINUE) {
- width = (FX_DWORD)m_pJbig2Context->m_dest_image->m_nWidth;
- height = (FX_DWORD)m_pJbig2Context->m_dest_image->m_nHeight;
- pitch = (FX_DWORD)m_pJbig2Context->m_dest_image->m_nStride;
- dest_buf = m_pJbig2Context->m_dest_image->m_pData;
- m_pJbig2Context->m_dest_image->m_bNeedFree = FALSE;
- return FXCODEC_STATUS_DECODE_TOBECONTINUE;
- }
- CJBig2_Context::DestroyContext(m_pJbig2Context->m_pContext);
- m_pJbig2Context->m_pContext = NULL;
- if (ret != JBIG2_SUCCESS) {
- goto failed;
- }
- width = (FX_DWORD)m_pJbig2Context->m_dest_image->m_nWidth;
- height = (FX_DWORD)m_pJbig2Context->m_dest_image->m_nHeight;
- pitch = (FX_DWORD)m_pJbig2Context->m_dest_image->m_nStride;
- dest_buf = m_pJbig2Context->m_dest_image->m_pData;
- m_pJbig2Context->m_dest_image->m_bNeedFree = FALSE;
- delete m_pJbig2Context->m_dest_image;
- FX_Free(m_pJbig2Context->m_src_buf);
- return FXCODEC_STATUS_DECODE_FINISH;
-failed:
- if(m_pJbig2Context->m_src_buf) {
- FX_Free(m_pJbig2Context->m_src_buf);
- }
- m_pJbig2Context->m_src_buf = NULL;
- return FXCODEC_STATUS_ERROR;
-}
-FXCODEC_STATUS CCodec_Jbig2Module::ContinueDecode(void* pJbig2Context, IFX_Pause* pPause)
-{
- CCodec_Jbig2Context* m_pJbig2Context = (CCodec_Jbig2Context*)pJbig2Context;
- int ret = m_pJbig2Context->m_pContext->Continue(pPause);
- if(m_pJbig2Context->m_pContext->GetProcessiveStatus() == FXCODEC_STATUS_DECODE_FINISH) {
- if(m_pJbig2Context->m_bFileReader) {
- CJBig2_Context::DestroyContext(m_pJbig2Context->m_pContext);
- m_pJbig2Context->m_pContext = NULL;
- if (ret != JBIG2_SUCCESS) {
- if(m_pJbig2Context->m_src_buf) {
- FX_Free(m_pJbig2Context->m_src_buf);
- }
- m_pJbig2Context->m_src_buf = NULL;
- return FXCODEC_STATUS_ERROR;
- }
- delete m_pJbig2Context->m_dest_image;
- FX_Free(m_pJbig2Context->m_src_buf);
- return FXCODEC_STATUS_DECODE_FINISH;
- } else {
- CJBig2_Context::DestroyContext(m_pJbig2Context->m_pContext);
- m_pJbig2Context->m_pContext = NULL;
- if (ret != JBIG2_SUCCESS) {
- return FXCODEC_STATUS_ERROR;
- }
- int dword_size = m_pJbig2Context->m_height * m_pJbig2Context->m_dest_pitch / 4;
- FX_DWORD* dword_buf = (FX_DWORD*)m_pJbig2Context->m_dest_buf;
- for (int i = 0; i < dword_size; i ++) {
- dword_buf[i] = ~dword_buf[i];
- }
- return FXCODEC_STATUS_DECODE_FINISH;
- }
- }
- return m_pJbig2Context->m_pContext->GetProcessiveStatus();
-}
-
-
-
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxcodec/fx_codec.h"
+#include "codec_int.h"
+CCodec_Jbig2Context::CCodec_Jbig2Context()
+{
+ FXSYS_memset32(this, 0, sizeof(CCodec_Jbig2Context));
+}
+CCodec_Jbig2Module::~CCodec_Jbig2Module()
+{
+}
+void* CCodec_Jbig2Module::CreateJbig2Context()
+{
+ return FX_NEW CCodec_Jbig2Context();
+}
+void CCodec_Jbig2Module::DestroyJbig2Context(void* pJbig2Content)
+{
+ if(pJbig2Content) {
+ CJBig2_Context::DestroyContext(((CCodec_Jbig2Context*)pJbig2Content)->m_pContext);
+ delete (CCodec_Jbig2Context*)pJbig2Content;
+ }
+ pJbig2Content = NULL;
+}
+FX_BOOL CCodec_Jbig2Module::Decode(FX_DWORD width, FX_DWORD height, FX_LPCBYTE src_buf, FX_DWORD src_size,
+ FX_LPCBYTE global_data, FX_DWORD global_size, FX_LPBYTE dest_buf, FX_DWORD dest_pitch)
+{
+ FXSYS_memset32(dest_buf, 0, height * dest_pitch);
+ CJBig2_Context* pContext = CJBig2_Context::CreateContext(&m_Module,
+ (FX_LPBYTE)global_data, global_size, (FX_LPBYTE)src_buf, src_size, JBIG2_EMBED_STREAM);
+ if (pContext == NULL) {
+ return FALSE;
+ }
+ int ret = pContext->getFirstPage(dest_buf, width, height, dest_pitch, NULL);
+ CJBig2_Context::DestroyContext(pContext);
+ if (ret != JBIG2_SUCCESS) {
+ return FALSE;
+ }
+ int dword_size = height * dest_pitch / 4;
+ FX_DWORD* dword_buf = (FX_DWORD*)dest_buf;
+ for (int i = 0; i < dword_size; i ++) {
+ dword_buf[i] = ~dword_buf[i];
+ }
+ return TRUE;
+}
+FX_BOOL CCodec_Jbig2Module::Decode(IFX_FileRead* file_ptr,
+ FX_DWORD& width, FX_DWORD& height, FX_DWORD& pitch, FX_LPBYTE& dest_buf)
+{
+ CJBig2_Context* pContext = NULL;
+ CJBig2_Image* dest_image = NULL;
+ FX_DWORD src_size = (FX_DWORD)file_ptr->GetSize();
+ FX_LPBYTE src_buf = FX_Alloc(FX_BYTE, src_size);
+ if (src_buf == NULL) {
+ return FALSE;
+ }
+ int ret = 0;
+ if(!file_ptr->ReadBlock(src_buf, 0, src_size)) {
+ goto failed;
+ }
+ pContext = CJBig2_Context::CreateContext(&m_Module, NULL, 0, src_buf, src_size, JBIG2_FILE_STREAM);
+ if(pContext == NULL) {
+ goto failed;
+ }
+ ret = pContext->getFirstPage(&dest_image, NULL);
+ CJBig2_Context::DestroyContext(pContext);
+ if (ret != JBIG2_SUCCESS) {
+ goto failed;
+ }
+ width = (FX_DWORD)dest_image->m_nWidth;
+ height = (FX_DWORD)dest_image->m_nHeight;
+ pitch = (FX_DWORD)dest_image->m_nStride;
+ dest_buf = dest_image->m_pData;
+ dest_image->m_bNeedFree = FALSE;
+ delete dest_image;
+ FX_Free(src_buf);
+ return TRUE;
+failed:
+ if(src_buf) {
+ FX_Free(src_buf);
+ }
+ return FALSE;
+}
+FXCODEC_STATUS CCodec_Jbig2Module::StartDecode(void* pJbig2Context, FX_DWORD width, FX_DWORD height, FX_LPCBYTE src_buf, FX_DWORD src_size,
+ FX_LPCBYTE global_data, FX_DWORD global_size, FX_LPBYTE dest_buf, FX_DWORD dest_pitch, IFX_Pause* pPause)
+{
+ if(!pJbig2Context) {
+ return FXCODEC_STATUS_ERR_PARAMS;
+ }
+ CCodec_Jbig2Context* m_pJbig2Context = (CCodec_Jbig2Context*)pJbig2Context;
+ m_pJbig2Context->m_width = width;
+ m_pJbig2Context->m_height = height;
+ m_pJbig2Context->m_src_buf = (unsigned char *)src_buf;
+ m_pJbig2Context->m_src_size = src_size;
+ m_pJbig2Context->m_global_data = global_data;
+ m_pJbig2Context->m_global_size = global_size;
+ m_pJbig2Context->m_dest_buf = dest_buf;
+ m_pJbig2Context->m_dest_pitch = dest_pitch;
+ m_pJbig2Context->m_pPause = pPause;
+ m_pJbig2Context->m_bFileReader = FALSE;
+ FXSYS_memset32(dest_buf, 0, height * dest_pitch);
+ m_pJbig2Context->m_pContext = CJBig2_Context::CreateContext(&m_Module,
+ (FX_LPBYTE)global_data, global_size, (FX_LPBYTE)src_buf, src_size, JBIG2_EMBED_STREAM, pPause);
+ if(!m_pJbig2Context->m_pContext) {
+ return FXCODEC_STATUS_ERROR;
+ }
+ int ret = m_pJbig2Context->m_pContext->getFirstPage(dest_buf, width, height, dest_pitch, pPause);
+ if(m_pJbig2Context->m_pContext->GetProcessiveStatus() == FXCODEC_STATUS_DECODE_FINISH) {
+ CJBig2_Context::DestroyContext(m_pJbig2Context->m_pContext);
+ m_pJbig2Context->m_pContext = NULL;
+ if (ret != JBIG2_SUCCESS) {
+ return FXCODEC_STATUS_ERROR;
+ }
+ int dword_size = height * dest_pitch / 4;
+ FX_DWORD* dword_buf = (FX_DWORD*)dest_buf;
+ for (int i = 0; i < dword_size; i ++) {
+ dword_buf[i] = ~dword_buf[i];
+ }
+ return FXCODEC_STATUS_DECODE_FINISH;
+ }
+ return m_pJbig2Context->m_pContext->GetProcessiveStatus();
+}
+FXCODEC_STATUS CCodec_Jbig2Module::StartDecode(void* pJbig2Context, IFX_FileRead* file_ptr,
+ FX_DWORD& width, FX_DWORD& height, FX_DWORD& pitch, FX_LPBYTE& dest_buf, IFX_Pause* pPause)
+{
+ if(!pJbig2Context) {
+ return FXCODEC_STATUS_ERR_PARAMS;
+ }
+ CCodec_Jbig2Context* m_pJbig2Context = (CCodec_Jbig2Context*)pJbig2Context;
+ m_pJbig2Context->m_bFileReader = TRUE;
+ m_pJbig2Context->m_dest_image = NULL;
+ m_pJbig2Context->m_src_size = (FX_DWORD)file_ptr->GetSize();
+ m_pJbig2Context->m_src_buf = FX_Alloc(FX_BYTE, m_pJbig2Context->m_src_size);
+ if (m_pJbig2Context->m_src_buf == NULL) {
+ return FXCODEC_STATUS_ERR_MEMORY;
+ }
+ int ret = 0;
+ if(!file_ptr->ReadBlock((void*)m_pJbig2Context->m_src_buf, 0, m_pJbig2Context->m_src_size)) {
+ goto failed;
+ }
+ m_pJbig2Context->m_pContext = CJBig2_Context::CreateContext(&m_Module, NULL, 0, m_pJbig2Context->m_src_buf, m_pJbig2Context->m_src_size, JBIG2_FILE_STREAM, pPause);
+ if(m_pJbig2Context->m_pContext == NULL) {
+ goto failed;
+ }
+ ret = m_pJbig2Context->m_pContext->getFirstPage(&m_pJbig2Context->m_dest_image, pPause);
+ if(m_pJbig2Context->m_pContext->GetProcessiveStatus() == FXCODEC_STATUS_DECODE_TOBECONTINUE) {
+ width = (FX_DWORD)m_pJbig2Context->m_dest_image->m_nWidth;
+ height = (FX_DWORD)m_pJbig2Context->m_dest_image->m_nHeight;
+ pitch = (FX_DWORD)m_pJbig2Context->m_dest_image->m_nStride;
+ dest_buf = m_pJbig2Context->m_dest_image->m_pData;
+ m_pJbig2Context->m_dest_image->m_bNeedFree = FALSE;
+ return FXCODEC_STATUS_DECODE_TOBECONTINUE;
+ }
+ CJBig2_Context::DestroyContext(m_pJbig2Context->m_pContext);
+ m_pJbig2Context->m_pContext = NULL;
+ if (ret != JBIG2_SUCCESS) {
+ goto failed;
+ }
+ width = (FX_DWORD)m_pJbig2Context->m_dest_image->m_nWidth;
+ height = (FX_DWORD)m_pJbig2Context->m_dest_image->m_nHeight;
+ pitch = (FX_DWORD)m_pJbig2Context->m_dest_image->m_nStride;
+ dest_buf = m_pJbig2Context->m_dest_image->m_pData;
+ m_pJbig2Context->m_dest_image->m_bNeedFree = FALSE;
+ delete m_pJbig2Context->m_dest_image;
+ FX_Free(m_pJbig2Context->m_src_buf);
+ return FXCODEC_STATUS_DECODE_FINISH;
+failed:
+ if(m_pJbig2Context->m_src_buf) {
+ FX_Free(m_pJbig2Context->m_src_buf);
+ }
+ m_pJbig2Context->m_src_buf = NULL;
+ return FXCODEC_STATUS_ERROR;
+}
+FXCODEC_STATUS CCodec_Jbig2Module::ContinueDecode(void* pJbig2Context, IFX_Pause* pPause)
+{
+ CCodec_Jbig2Context* m_pJbig2Context = (CCodec_Jbig2Context*)pJbig2Context;
+ int ret = m_pJbig2Context->m_pContext->Continue(pPause);
+ if(m_pJbig2Context->m_pContext->GetProcessiveStatus() == FXCODEC_STATUS_DECODE_FINISH) {
+ if(m_pJbig2Context->m_bFileReader) {
+ CJBig2_Context::DestroyContext(m_pJbig2Context->m_pContext);
+ m_pJbig2Context->m_pContext = NULL;
+ if (ret != JBIG2_SUCCESS) {
+ if(m_pJbig2Context->m_src_buf) {
+ FX_Free(m_pJbig2Context->m_src_buf);
+ }
+ m_pJbig2Context->m_src_buf = NULL;
+ return FXCODEC_STATUS_ERROR;
+ }
+ delete m_pJbig2Context->m_dest_image;
+ FX_Free(m_pJbig2Context->m_src_buf);
+ return FXCODEC_STATUS_DECODE_FINISH;
+ } else {
+ CJBig2_Context::DestroyContext(m_pJbig2Context->m_pContext);
+ m_pJbig2Context->m_pContext = NULL;
+ if (ret != JBIG2_SUCCESS) {
+ return FXCODEC_STATUS_ERROR;
+ }
+ int dword_size = m_pJbig2Context->m_height * m_pJbig2Context->m_dest_pitch / 4;
+ FX_DWORD* dword_buf = (FX_DWORD*)m_pJbig2Context->m_dest_buf;
+ for (int i = 0; i < dword_size; i ++) {
+ dword_buf[i] = ~dword_buf[i];
+ }
+ return FXCODEC_STATUS_DECODE_FINISH;
+ }
+ }
+ return m_pJbig2Context->m_pContext->GetProcessiveStatus();
+}
+
+
+
diff --git a/core/src/fxcodec/codec/fx_codec_jpeg.cpp b/core/src/fxcodec/codec/fx_codec_jpeg.cpp
index fc91a6c162..5e78e134aa 100644
--- a/core/src/fxcodec/codec/fx_codec_jpeg.cpp
+++ b/core/src/fxcodec/codec/fx_codec_jpeg.cpp
@@ -1,735 +1,735 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../../include/fxcodec/fx_codec.h"
-#include "../../../include/fxge/fx_dib.h"
-#include "codec_int.h"
-extern "C" {
- static void _JpegScanSOI(const FX_BYTE*& src_buf, FX_DWORD& src_size)
- {
- if (src_size == 0) {
- return;
- }
- FX_DWORD offset = 0;
- while (offset < src_size - 1) {
- if (src_buf[offset] == 0xff && src_buf[offset + 1] == 0xd8) {
- src_buf += offset;
- src_size -= offset;
- return;
- }
- offset ++;
- }
- }
-};
-extern "C" {
-#undef FAR
-#include "../../fx_jpeglib.h"
-}
-extern "C" {
- static void _src_do_nothing(struct jpeg_decompress_struct* cinfo) {}
-};
-extern "C" {
- static void _error_fatal(j_common_ptr cinfo)
- {
- longjmp(*(jmp_buf*)cinfo->client_data, -1);
- }
-};
-extern "C" {
- static void _src_skip_data(struct jpeg_decompress_struct* cinfo, long num)
- {
- if (num > (long)cinfo->src->bytes_in_buffer) {
- _error_fatal((j_common_ptr)cinfo);
- }
- cinfo->src->next_input_byte += num;
- cinfo->src->bytes_in_buffer -= num;
- }
-};
-extern "C" {
- static boolean _src_fill_buffer(j_decompress_ptr cinfo)
- {
- return 0;
- }
-};
-extern "C" {
- static boolean _src_resync(j_decompress_ptr cinfo, int desired)
- {
- return 0;
- }
-};
-extern "C" {
- static void _error_do_nothing(j_common_ptr cinfo) {}
-};
-extern "C" {
- static void _error_do_nothing1(j_common_ptr cinfo, int) {}
-};
-extern "C" {
- static void _error_do_nothing2(j_common_ptr cinfo, char*) {}
-};
-#define JPEG_MARKER_EXIF (JPEG_APP0 + 1)
-#define JPEG_MARKER_ICC (JPEG_APP0 + 2)
-#define JPEG_MARKER_AUTHORTIME (JPEG_APP0 + 3)
-#define JPEG_MARKER_MAXSIZE 0xFFFF
-#define JPEG_OVERHEAD_LEN 14
-static FX_BOOL _JpegIsIccMarker(jpeg_saved_marker_ptr marker)
-{
- if (marker->marker == JPEG_MARKER_ICC &&
- marker->data_length >= JPEG_OVERHEAD_LEN &&
- (FXSYS_memcmp32(marker->data, "\x49\x43\x43\x5f\x50\x52\x4f\x46\x49\x4c\x45\x00", 12) == 0)) {
- return TRUE;
- }
- return FALSE;
-}
-static FX_BOOL _JpegLoadIccProfile(j_decompress_ptr cinfo, FX_LPBYTE* icc_buf_ptr, FX_DWORD* icc_length)
-{
- if(icc_buf_ptr == NULL || icc_length == NULL) {
- return FALSE;
- }
- *icc_buf_ptr = NULL;
- *icc_length = 0;
- FX_LPBYTE icc_data_ptr = NULL;
- FX_DWORD icc_data_len = 0;
- FX_BYTE count_icc_marker = 0;
- FX_BYTE num_icc_marker = 0;
- jpeg_saved_marker_ptr marker_list[256] = {NULL};
- for (jpeg_saved_marker_ptr cur_marker = cinfo->marker_list;
- cur_marker != NULL;
- cur_marker = cur_marker->next) {
- if(_JpegIsIccMarker(cur_marker)) {
- if(count_icc_marker == 0) {
- num_icc_marker = cur_marker->data[13];
- } else if(num_icc_marker != cur_marker->data[13]) {
- return FALSE;
- }
- int sn = cur_marker->data[12] - 1;
- if(sn < 0 || sn >= num_icc_marker) {
- return FALSE;
- }
- if(marker_list[sn] == NULL) {
- marker_list[sn] = cur_marker;
- } else {
- return FALSE;
- }
- count_icc_marker ++;
- icc_data_len += (cur_marker->data_length - JPEG_OVERHEAD_LEN);
- }
- }
- if(count_icc_marker != num_icc_marker) {
- return FALSE;
- }
- if(num_icc_marker == 0) {
- return TRUE;
- }
- icc_data_ptr = FX_Alloc(FX_BYTE, icc_data_len);
- if(icc_buf_ptr == NULL) {
- return FALSE;
- }
- *icc_buf_ptr = icc_data_ptr;
- *icc_length = icc_data_len;
- for (int idx = 0; idx < num_icc_marker; idx++) {
- icc_data_len = marker_list[idx]->data_length - JPEG_OVERHEAD_LEN;
- FXSYS_memcpy32(icc_data_ptr, marker_list[idx]->data + JPEG_OVERHEAD_LEN, icc_data_len);
- icc_data_ptr += icc_data_len;
- }
- return TRUE;
-}
-static FX_BOOL _JpegEmbedIccProfile(j_compress_ptr cinfo, FX_LPCBYTE icc_buf_ptr, FX_DWORD icc_length)
-{
- if(icc_buf_ptr == NULL || icc_length == 0) {
- return FALSE;
- }
- FX_DWORD icc_segment_size = (JPEG_MARKER_MAXSIZE - 2 - JPEG_OVERHEAD_LEN);
- FX_DWORD icc_segment_num = (icc_length / icc_segment_size) + 1;
- if (icc_segment_num > 255) {
- return FALSE;
- }
- FX_DWORD icc_data_length = JPEG_OVERHEAD_LEN + (icc_segment_num > 1 ? icc_segment_size : icc_length);
- FX_LPBYTE icc_data = FX_Alloc(FX_BYTE, icc_data_length);
- if (icc_data == NULL) {
- return FALSE;
- }
- FXSYS_memcpy32(icc_data, "\x49\x43\x43\x5f\x50\x52\x4f\x46\x49\x4c\x45\x00", 12);
- icc_data[13] = (FX_BYTE)icc_segment_num;
- for (FX_BYTE i = 0; i < (icc_segment_num - 1); i++) {
- icc_data[12] = i + 1;
- FXSYS_memcpy32(icc_data + JPEG_OVERHEAD_LEN, icc_buf_ptr + i * icc_segment_size, icc_segment_size);
- jpeg_write_marker(cinfo, JPEG_MARKER_ICC, icc_data, icc_data_length);
- }
- icc_data[12] = (FX_BYTE)icc_segment_num;
- FX_DWORD icc_size = (icc_segment_num - 1) * icc_segment_size;
- FXSYS_memcpy32(icc_data + JPEG_OVERHEAD_LEN, icc_buf_ptr + icc_size, icc_length - icc_size);
- jpeg_write_marker(cinfo, JPEG_MARKER_ICC, icc_data, JPEG_OVERHEAD_LEN + icc_length - icc_size);
- FX_Free(icc_data);
- return TRUE;
-}
-extern "C" {
- static void _dest_do_nothing(j_compress_ptr cinfo) {}
-};
-extern "C" {
- static boolean _dest_empty(j_compress_ptr cinfo)
- {
- return FALSE;
- }
-};
-#define JPEG_BLOCK_SIZE 1048576
-static void _JpegEncode(const CFX_DIBSource* pSource, FX_LPBYTE& dest_buf, FX_STRSIZE& dest_size, int quality, FX_LPCBYTE icc_buf, FX_DWORD icc_length)
-{
- struct jpeg_compress_struct cinfo;
- struct jpeg_error_mgr jerr;
- jerr.error_exit = _error_do_nothing;
- jerr.emit_message = _error_do_nothing1;
- jerr.output_message = _error_do_nothing;
- jerr.format_message = _error_do_nothing2;
- jerr.reset_error_mgr = _error_do_nothing;
- cinfo.err = &jerr;
- jpeg_create_compress(&cinfo);
- int Bpp = pSource->GetBPP() / 8;
- int nComponents = Bpp >= 3 ? (pSource->IsCmykImage() ? 4 : 3) : 1;
- int pitch = pSource->GetPitch();
- int width = pSource->GetWidth();
- int height = pSource->GetHeight();
- FX_DWORD dest_buf_length = width * height * nComponents + 1024 + (icc_length ? (icc_length + 255 * 18) : 0);
- dest_buf = FX_Alloc(FX_BYTE, dest_buf_length);
- while (dest_buf == NULL) {
- dest_buf_length >>= 1;
- dest_buf = FX_Alloc(FX_BYTE, dest_buf_length);
- }
- FXSYS_memset32(dest_buf, 0, dest_buf_length);
- struct jpeg_destination_mgr dest;
- dest.init_destination = _dest_do_nothing;
- dest.term_destination = _dest_do_nothing;
- dest.empty_output_buffer = _dest_empty;
- dest.next_output_byte = dest_buf;
- dest.free_in_buffer = dest_buf_length;
- cinfo.dest = &dest;
- cinfo.image_width = width;
- cinfo.image_height = height;
- cinfo.input_components = nComponents;
- if (nComponents == 1) {
- cinfo.in_color_space = JCS_GRAYSCALE;
- } else if (nComponents == 3) {
- cinfo.in_color_space = JCS_RGB;
- } else {
- cinfo.in_color_space = JCS_CMYK;
- }
- FX_LPBYTE line_buf = NULL;
- if (nComponents > 1) {
- line_buf = FX_Alloc(FX_BYTE, width * nComponents);
- if (line_buf == NULL) {
- return;
- }
- }
- jpeg_set_defaults(&cinfo);
- if(quality != 75) {
- jpeg_set_quality(&cinfo, quality, TRUE);
- }
- jpeg_start_compress(&cinfo, TRUE);
- _JpegEmbedIccProfile(&cinfo, icc_buf, icc_length);
- JSAMPROW row_pointer[1];
- JDIMENSION row;
- while (cinfo.next_scanline < cinfo.image_height) {
- FX_LPCBYTE src_scan = pSource->GetScanline(cinfo.next_scanline);
- if (nComponents > 1) {
- FX_LPBYTE dest_scan = line_buf;
- if (nComponents == 3) {
- for (int i = 0; i < width; i ++) {
- dest_scan[0] = src_scan[2];
- dest_scan[1] = src_scan[1];
- dest_scan[2] = src_scan[0];
- dest_scan += 3;
- src_scan += Bpp;
- }
- } else {
- for (int i = 0; i < pitch; i ++) {
- *dest_scan++ = ~*src_scan++;
- }
- }
- row_pointer[0] = line_buf;
- } else {
- row_pointer[0] = (FX_LPBYTE)src_scan;
- }
- row = cinfo.next_scanline;
- jpeg_write_scanlines(&cinfo, row_pointer, 1);
- if (cinfo.next_scanline == row) {
- dest_buf = FX_Realloc(FX_BYTE, dest_buf, dest_buf_length + JPEG_BLOCK_SIZE);
- if (dest_buf == NULL) {
- FX_Free(line_buf);
- return;
- }
- dest.next_output_byte = dest_buf + dest_buf_length - dest.free_in_buffer;
- dest_buf_length += JPEG_BLOCK_SIZE;
- dest.free_in_buffer += JPEG_BLOCK_SIZE;
- }
- }
- jpeg_finish_compress(&cinfo);
- jpeg_destroy_compress(&cinfo);
- if (line_buf) {
- FX_Free(line_buf);
- }
- dest_size = dest_buf_length - (FX_STRSIZE)dest.free_in_buffer;
-}
-static FX_BOOL _JpegLoadInfo(FX_LPCBYTE src_buf, FX_DWORD src_size, int& width, int& height,
- int& num_components, int& bits_per_components, FX_BOOL& color_transform,
- FX_LPBYTE* icc_buf_ptr, FX_DWORD* icc_length)
-{
- _JpegScanSOI(src_buf, src_size);
- struct jpeg_decompress_struct cinfo;
- struct jpeg_error_mgr jerr;
- jerr.error_exit = _error_fatal;
- jerr.emit_message = _error_do_nothing1;
- jerr.output_message = _error_do_nothing;
- jerr.format_message = _error_do_nothing2;
- jerr.reset_error_mgr = _error_do_nothing;
- cinfo.err = &jerr;
- jmp_buf mark;
- cinfo.client_data = &mark;
- if (setjmp(mark) == -1) {
- return FALSE;
- }
- jpeg_create_decompress(&cinfo);
- struct jpeg_source_mgr src;
- src.init_source = _src_do_nothing;
- src.term_source = _src_do_nothing;
- src.skip_input_data = _src_skip_data;
- src.fill_input_buffer = _src_fill_buffer;
- src.resync_to_restart = _src_resync;
- src.bytes_in_buffer = src_size;
- src.next_input_byte = src_buf;
- cinfo.src = &src;
- if (setjmp(mark) == -1) {
- jpeg_destroy_decompress(&cinfo);
- return FALSE;
- }
- if(icc_buf_ptr && icc_length) {
- jpeg_save_markers(&cinfo, JPEG_MARKER_ICC, JPEG_MARKER_MAXSIZE);
- }
- int ret = jpeg_read_header(&cinfo, TRUE);
- if (ret != JPEG_HEADER_OK) {
- jpeg_destroy_decompress(&cinfo);
- return FALSE;
- }
- width = cinfo.image_width;
- height = cinfo.image_height;
- num_components = cinfo.num_components;
- color_transform = cinfo.jpeg_color_space == JCS_YCbCr || cinfo.jpeg_color_space == JCS_YCCK;
- bits_per_components = cinfo.data_precision;
- if(icc_buf_ptr != NULL) {
- *icc_buf_ptr = NULL;
- }
- if(icc_length != NULL) {
- *icc_length = 0;
- }
- jpeg_destroy_decompress(&cinfo);
- return TRUE;
-}
-class CCodec_JpegDecoder : public CCodec_ScanlineDecoder
-{
-public:
- CCodec_JpegDecoder();
- ~CCodec_JpegDecoder();
- FX_BOOL Create(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height, int nComps,
- FX_BOOL ColorTransform, IFX_JpegProvider* pJP);
- virtual void Destroy()
- {
- delete this;
- }
- virtual void v_DownScale(int dest_width, int dest_height);
- virtual FX_BOOL v_Rewind();
- virtual FX_LPBYTE v_GetNextLine();
- virtual FX_DWORD GetSrcOffset();
- jmp_buf m_JmpBuf;
- struct jpeg_decompress_struct cinfo;
- struct jpeg_error_mgr jerr;
- struct jpeg_source_mgr src;
- FX_LPCBYTE m_SrcBuf;
- FX_DWORD m_SrcSize;
- FX_LPBYTE m_pScanlineBuf;
- FX_BOOL InitDecode();
- FX_BOOL m_bInited, m_bStarted, m_bJpegTransform;
-protected:
- IFX_JpegProvider* m_pExtProvider;
- void* m_pExtContext;
- FX_DWORD m_nDefaultScaleDenom;
-};
-CCodec_JpegDecoder::CCodec_JpegDecoder()
-{
- m_pScanlineBuf = NULL;
- m_DownScale = 1;
- m_bStarted = FALSE;
- m_bInited = FALSE;
- m_pExtProvider = NULL;
- m_pExtContext = NULL;
- FXSYS_memset32(&cinfo, 0, sizeof(cinfo));
- FXSYS_memset32(&jerr, 0, sizeof(jerr));
- FXSYS_memset32(&src, 0, sizeof(src));
- m_nDefaultScaleDenom = 1;
-}
-CCodec_JpegDecoder::~CCodec_JpegDecoder()
-{
- if (m_pExtProvider) {
- m_pExtProvider->DestroyDecoder(m_pExtContext);
- return;
- }
- if (m_pScanlineBuf) {
- FX_Free(m_pScanlineBuf);
- }
- if (m_bInited) {
- jpeg_destroy_decompress(&cinfo);
- }
-}
-FX_BOOL CCodec_JpegDecoder::InitDecode()
-{
- cinfo.err = &jerr;
- cinfo.client_data = &m_JmpBuf;
- if (setjmp(m_JmpBuf) == -1) {
- return FALSE;
- }
- jpeg_create_decompress(&cinfo);
- m_bInited = TRUE;
- cinfo.src = &src;
- src.bytes_in_buffer = m_SrcSize;
- src.next_input_byte = m_SrcBuf;
- if (setjmp(m_JmpBuf) == -1) {
- jpeg_destroy_decompress(&cinfo);
- m_bInited = FALSE;
- return FALSE;
- }
- cinfo.image_width = m_OrigWidth;
- cinfo.image_height = m_OrigHeight;
- int ret = jpeg_read_header(&cinfo, TRUE);
- if (ret != JPEG_HEADER_OK) {
- return FALSE;
- }
- if (cinfo.saw_Adobe_marker) {
- m_bJpegTransform = TRUE;
- }
- if (cinfo.num_components == 3 && !m_bJpegTransform) {
- cinfo.out_color_space = cinfo.jpeg_color_space;
- }
- m_OrigWidth = cinfo.image_width;
- m_OrigHeight = cinfo.image_height;
- m_OutputWidth = m_OrigWidth;
- m_OutputHeight = m_OutputHeight;
- m_nDefaultScaleDenom = cinfo.scale_denom;
- return TRUE;
-}
-FX_BOOL CCodec_JpegDecoder::Create(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,
- int nComps, FX_BOOL ColorTransform, IFX_JpegProvider* pJP)
-{
- if (pJP) {
- m_pExtProvider = pJP;
- m_pExtContext = m_pExtProvider->CreateDecoder(src_buf, src_size, width, height, nComps, ColorTransform);
- return m_pExtContext != NULL;
- }
- _JpegScanSOI(src_buf, src_size);
- m_SrcBuf = src_buf;
- m_SrcSize = src_size;
- jerr.error_exit = _error_fatal;
- jerr.emit_message = _error_do_nothing1;
- jerr.output_message = _error_do_nothing;
- jerr.format_message = _error_do_nothing2;
- jerr.reset_error_mgr = _error_do_nothing;
- src.init_source = _src_do_nothing;
- src.term_source = _src_do_nothing;
- src.skip_input_data = _src_skip_data;
- src.fill_input_buffer = _src_fill_buffer;
- src.resync_to_restart = _src_resync;
- m_bJpegTransform = ColorTransform;
- if(src_size > 1 && FXSYS_memcmp32(src_buf + src_size - 2, "\xFF\xD9", 2) != 0) {
- ((FX_LPBYTE)src_buf)[src_size - 2] = 0xFF;
- ((FX_LPBYTE)src_buf)[src_size - 1] = 0xD9;
- }
- m_OutputWidth = m_OrigWidth = width;
- m_OutputHeight = m_OrigHeight = height;
- if (!InitDecode()) {
- return FALSE;
- }
- if (cinfo.num_components < nComps) {
- return FALSE;
- }
- if ((int)cinfo.image_width < width) {
- return FALSE;
- }
- m_Pitch = (cinfo.image_width * cinfo.num_components + 3) / 4 * 4;
- m_pScanlineBuf = FX_Alloc(FX_BYTE, m_Pitch);
- if (m_pScanlineBuf == NULL) {
- return FALSE;
- }
- m_nComps = cinfo.num_components;
- m_bpc = 8;
- m_bColorTransformed = FALSE;
- m_bStarted = FALSE;
- return TRUE;
-}
-extern "C" {
- FX_INT32 FX_GetDownsampleRatio(FX_INT32 originWidth, FX_INT32 originHeight, FX_INT32 downsampleWidth, FX_INT32 downsampleHeight)
- {
- int iratio_w = originWidth / downsampleWidth;
- int iratio_h = originHeight / downsampleHeight;
- int ratio = (iratio_w > iratio_h) ? iratio_h : iratio_w;
- if (ratio >= 8) {
- return 8;
- } else if (ratio >= 4) {
- return 4;
- } else if (ratio >= 2) {
- return 2;
- }
- return 1;
- }
-}
-void CCodec_JpegDecoder::v_DownScale(int dest_width, int dest_height)
-{
- if (m_pExtProvider) {
- m_pExtProvider->DownScale(m_pExtContext, dest_width, dest_height);
- return;
- }
- int old_scale = m_DownScale;
- m_DownScale = FX_GetDownsampleRatio(m_OrigWidth, m_OrigHeight, dest_width, dest_height);
- m_OutputWidth = (m_OrigWidth + m_DownScale - 1) / m_DownScale;
- m_OutputHeight = (m_OrigHeight + m_DownScale - 1) / m_DownScale;
- m_Pitch = (m_OutputWidth * m_nComps + 3) / 4 * 4;
- if (old_scale != m_DownScale) {
- m_NextLine = -1;
- }
-}
-FX_BOOL CCodec_JpegDecoder::v_Rewind()
-{
- if (m_pExtProvider) {
- return m_pExtProvider->Rewind(m_pExtContext);
- }
- if (m_bStarted) {
- jpeg_destroy_decompress(&cinfo);
- if (!InitDecode()) {
- return FALSE;
- }
- }
- if (setjmp(m_JmpBuf) == -1) {
- return FALSE;
- }
- cinfo.scale_denom = m_nDefaultScaleDenom * m_DownScale;
- m_OutputWidth = (m_OrigWidth + m_DownScale - 1) / m_DownScale;
- m_OutputHeight = (m_OrigHeight + m_DownScale - 1) / m_DownScale;
- if (!jpeg_start_decompress(&cinfo)) {
- jpeg_destroy_decompress(&cinfo);
- return FALSE;
- }
- if ((int)cinfo.output_width > m_OrigWidth) {
- FXSYS_assert(FALSE);
- return FALSE;
- }
- m_bStarted = TRUE;
- return TRUE;
-}
-FX_LPBYTE CCodec_JpegDecoder::v_GetNextLine()
-{
- if (m_pExtProvider) {
- return m_pExtProvider->GetNextLine(m_pExtContext);
- }
- int nlines = jpeg_read_scanlines(&cinfo, &m_pScanlineBuf, 1);
- if (nlines < 1) {
- return NULL;
- }
- return m_pScanlineBuf;
-}
-FX_DWORD CCodec_JpegDecoder::GetSrcOffset()
-{
- if (m_pExtProvider) {
- return m_pExtProvider->GetSrcOffset(m_pExtContext);
- }
- return (FX_DWORD)(m_SrcSize - src.bytes_in_buffer);
-}
-ICodec_ScanlineDecoder* CCodec_JpegModule::CreateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size,
- int width, int height, int nComps, FX_BOOL ColorTransform)
-{
- if (src_buf == NULL || src_size == 0) {
- return NULL;
- }
- CCodec_JpegDecoder* pDecoder = FX_NEW CCodec_JpegDecoder;
- if (pDecoder == NULL) {
- return NULL;
- }
- if (!pDecoder->Create(src_buf, src_size, width, height, nComps, ColorTransform, m_pExtProvider)) {
- delete pDecoder;
- return NULL;
- }
- return pDecoder;
-}
-FX_BOOL CCodec_JpegModule::LoadInfo(FX_LPCBYTE src_buf, FX_DWORD src_size, int& width, int& height,
- int& num_components, int& bits_per_components, FX_BOOL& color_transform,
- FX_LPBYTE* icc_buf_ptr, FX_DWORD* icc_length)
-{
- if (m_pExtProvider) {
- return m_pExtProvider->LoadInfo(src_buf, src_size, width, height,
- num_components, bits_per_components, color_transform,
- icc_buf_ptr, icc_length);
- }
- return _JpegLoadInfo(src_buf, src_size, width, height, num_components, bits_per_components, color_transform, icc_buf_ptr, icc_length);
-}
-FX_BOOL CCodec_JpegModule::Encode(const CFX_DIBSource* pSource, FX_LPBYTE& dest_buf, FX_STRSIZE& dest_size, int quality, FX_LPCBYTE icc_buf, FX_DWORD icc_length)
-{
- if (m_pExtProvider) {
- return m_pExtProvider->Encode(pSource, dest_buf, dest_size, quality, icc_buf, icc_length);
- }
- if(pSource->GetBPP() < 8 || pSource->GetPalette() != NULL) {
- ASSERT(pSource->GetBPP() >= 8 && pSource->GetPalette() == NULL);
- return FALSE;
- }
- _JpegEncode(pSource, dest_buf, dest_size, quality, icc_buf, icc_length);
- return TRUE;
-}
-struct FXJPEG_Context {
- jmp_buf m_JumpMark;
- jpeg_decompress_struct m_Info;
- jpeg_error_mgr m_ErrMgr;
- jpeg_source_mgr m_SrcMgr;
- unsigned int m_SkipSize;
- void* (*m_AllocFunc)(unsigned int);
- void (*m_FreeFunc)(void*);
-};
-extern "C" {
- static void _error_fatal1(j_common_ptr cinfo)
- {
- longjmp(((FXJPEG_Context*)cinfo->client_data)->m_JumpMark, -1);
- }
-};
-extern "C" {
- static void _src_skip_data1(struct jpeg_decompress_struct* cinfo, long num)
- {
- if (cinfo->src->bytes_in_buffer < (size_t)num) {
- ((FXJPEG_Context*)cinfo->client_data)->m_SkipSize = (unsigned int)(num - cinfo->src->bytes_in_buffer);
- cinfo->src->bytes_in_buffer = 0;
- } else {
- cinfo->src->next_input_byte += num;
- cinfo->src->bytes_in_buffer -= num;
- }
- }
-};
-static void* jpeg_alloc_func(unsigned int size)
-{
- return FX_Alloc(char, size);
-}
-static void jpeg_free_func(void* p)
-{
- FX_Free(p);
-}
-void* CCodec_JpegModule::Start()
-{
- if (m_pExtProvider) {
- return m_pExtProvider->Start();
- }
- FXJPEG_Context* p = (FXJPEG_Context*)FX_Alloc(FX_BYTE, sizeof(FXJPEG_Context));
- if (p == NULL) {
- return NULL;
- }
- p->m_AllocFunc = jpeg_alloc_func;
- p->m_FreeFunc = jpeg_free_func;
- p->m_ErrMgr.error_exit = _error_fatal1;
- p->m_ErrMgr.emit_message = _error_do_nothing1;
- p->m_ErrMgr.output_message = _error_do_nothing;
- p->m_ErrMgr.format_message = _error_do_nothing2;
- p->m_ErrMgr.reset_error_mgr = _error_do_nothing;
- p->m_SrcMgr.init_source = _src_do_nothing;
- p->m_SrcMgr.term_source = _src_do_nothing;
- p->m_SrcMgr.skip_input_data = _src_skip_data1;
- p->m_SrcMgr.fill_input_buffer = _src_fill_buffer;
- p->m_SrcMgr.resync_to_restart = _src_resync;
- p->m_Info.client_data = p;
- p->m_Info.err = &p->m_ErrMgr;
- if (setjmp(p->m_JumpMark) == -1) {
- return 0;
- }
- jpeg_create_decompress(&p->m_Info);
- p->m_Info.src = &p->m_SrcMgr;
- p->m_SkipSize = 0;
- return p;
-}
-void CCodec_JpegModule::Finish(void* pContext)
-{
- if (m_pExtProvider) {
- m_pExtProvider->Finish(pContext);
- return;
- }
- FXJPEG_Context* p = (FXJPEG_Context*)pContext;
- jpeg_destroy_decompress(&p->m_Info);
- p->m_FreeFunc(p);
-}
-void CCodec_JpegModule::Input(void* pContext, const unsigned char* src_buf, FX_DWORD src_size)
-{
- if (m_pExtProvider) {
- m_pExtProvider->Input(pContext, src_buf, src_size);
- return;
- }
- FXJPEG_Context* p = (FXJPEG_Context*)pContext;
- if (p->m_SkipSize) {
- if (p->m_SkipSize > src_size) {
- p->m_SrcMgr.bytes_in_buffer = 0;
- p->m_SkipSize -= src_size;
- return;
- }
- src_size -= p->m_SkipSize;
- src_buf += p->m_SkipSize;
- p->m_SkipSize = 0;
- }
- p->m_SrcMgr.next_input_byte = src_buf;
- p->m_SrcMgr.bytes_in_buffer = src_size;
-}
-int CCodec_JpegModule::ReadHeader(void* pContext, int* width, int* height, int* nComps)
-{
- if (m_pExtProvider) {
- return m_pExtProvider->ReadHeader(pContext, width, height, nComps);
- }
- FXJPEG_Context* p = (FXJPEG_Context*)pContext;
- if (setjmp(p->m_JumpMark) == -1) {
- return 1;
- }
- int ret = jpeg_read_header(&p->m_Info, true);
- if (ret == JPEG_SUSPENDED) {
- return 2;
- }
- if (ret != JPEG_HEADER_OK) {
- return 1;
- }
- *width = p->m_Info.image_width;
- *height = p->m_Info.image_height;
- *nComps = p->m_Info.num_components;
- return 0;
-}
-FX_BOOL CCodec_JpegModule::StartScanline(void* pContext, int down_scale)
-{
- if (m_pExtProvider) {
- return m_pExtProvider->StartScanline(pContext, down_scale);
- }
- FXJPEG_Context* p = (FXJPEG_Context*)pContext;
- if (setjmp(p->m_JumpMark) == -1) {
- return FALSE;
- }
- p->m_Info.scale_denom = down_scale;
- return jpeg_start_decompress(&p->m_Info);
-}
-FX_BOOL CCodec_JpegModule::ReadScanline(void* pContext, unsigned char* dest_buf)
-{
- if (m_pExtProvider) {
- return m_pExtProvider->ReadScanline(pContext, dest_buf);
- }
- FXJPEG_Context* p = (FXJPEG_Context*)pContext;
- if (setjmp(p->m_JumpMark) == -1) {
- return FALSE;
- }
- int nlines = jpeg_read_scanlines(&p->m_Info, &dest_buf, 1);
- return nlines == 1;
-}
-FX_DWORD CCodec_JpegModule::GetAvailInput(void* pContext, FX_LPBYTE* avail_buf_ptr)
-{
- if (m_pExtProvider) {
- return m_pExtProvider->GetAvailInput(pContext, avail_buf_ptr);
- }
- if(avail_buf_ptr != NULL) {
- *avail_buf_ptr = NULL;
- if(((FXJPEG_Context*)pContext)->m_SrcMgr.bytes_in_buffer > 0) {
- *avail_buf_ptr = (FX_LPBYTE)((FXJPEG_Context*)pContext)->m_SrcMgr.next_input_byte;
- }
- }
- return (FX_DWORD)((FXJPEG_Context*)pContext)->m_SrcMgr.bytes_in_buffer;
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxcodec/fx_codec.h"
+#include "../../../include/fxge/fx_dib.h"
+#include "codec_int.h"
+extern "C" {
+ static void _JpegScanSOI(const FX_BYTE*& src_buf, FX_DWORD& src_size)
+ {
+ if (src_size == 0) {
+ return;
+ }
+ FX_DWORD offset = 0;
+ while (offset < src_size - 1) {
+ if (src_buf[offset] == 0xff && src_buf[offset + 1] == 0xd8) {
+ src_buf += offset;
+ src_size -= offset;
+ return;
+ }
+ offset ++;
+ }
+ }
+};
+extern "C" {
+#undef FAR
+#include "../../fx_jpeglib.h"
+}
+extern "C" {
+ static void _src_do_nothing(struct jpeg_decompress_struct* cinfo) {}
+};
+extern "C" {
+ static void _error_fatal(j_common_ptr cinfo)
+ {
+ longjmp(*(jmp_buf*)cinfo->client_data, -1);
+ }
+};
+extern "C" {
+ static void _src_skip_data(struct jpeg_decompress_struct* cinfo, long num)
+ {
+ if (num > (long)cinfo->src->bytes_in_buffer) {
+ _error_fatal((j_common_ptr)cinfo);
+ }
+ cinfo->src->next_input_byte += num;
+ cinfo->src->bytes_in_buffer -= num;
+ }
+};
+extern "C" {
+ static boolean _src_fill_buffer(j_decompress_ptr cinfo)
+ {
+ return 0;
+ }
+};
+extern "C" {
+ static boolean _src_resync(j_decompress_ptr cinfo, int desired)
+ {
+ return 0;
+ }
+};
+extern "C" {
+ static void _error_do_nothing(j_common_ptr cinfo) {}
+};
+extern "C" {
+ static void _error_do_nothing1(j_common_ptr cinfo, int) {}
+};
+extern "C" {
+ static void _error_do_nothing2(j_common_ptr cinfo, char*) {}
+};
+#define JPEG_MARKER_EXIF (JPEG_APP0 + 1)
+#define JPEG_MARKER_ICC (JPEG_APP0 + 2)
+#define JPEG_MARKER_AUTHORTIME (JPEG_APP0 + 3)
+#define JPEG_MARKER_MAXSIZE 0xFFFF
+#define JPEG_OVERHEAD_LEN 14
+static FX_BOOL _JpegIsIccMarker(jpeg_saved_marker_ptr marker)
+{
+ if (marker->marker == JPEG_MARKER_ICC &&
+ marker->data_length >= JPEG_OVERHEAD_LEN &&
+ (FXSYS_memcmp32(marker->data, "\x49\x43\x43\x5f\x50\x52\x4f\x46\x49\x4c\x45\x00", 12) == 0)) {
+ return TRUE;
+ }
+ return FALSE;
+}
+static FX_BOOL _JpegLoadIccProfile(j_decompress_ptr cinfo, FX_LPBYTE* icc_buf_ptr, FX_DWORD* icc_length)
+{
+ if(icc_buf_ptr == NULL || icc_length == NULL) {
+ return FALSE;
+ }
+ *icc_buf_ptr = NULL;
+ *icc_length = 0;
+ FX_LPBYTE icc_data_ptr = NULL;
+ FX_DWORD icc_data_len = 0;
+ FX_BYTE count_icc_marker = 0;
+ FX_BYTE num_icc_marker = 0;
+ jpeg_saved_marker_ptr marker_list[256] = {NULL};
+ for (jpeg_saved_marker_ptr cur_marker = cinfo->marker_list;
+ cur_marker != NULL;
+ cur_marker = cur_marker->next) {
+ if(_JpegIsIccMarker(cur_marker)) {
+ if(count_icc_marker == 0) {
+ num_icc_marker = cur_marker->data[13];
+ } else if(num_icc_marker != cur_marker->data[13]) {
+ return FALSE;
+ }
+ int sn = cur_marker->data[12] - 1;
+ if(sn < 0 || sn >= num_icc_marker) {
+ return FALSE;
+ }
+ if(marker_list[sn] == NULL) {
+ marker_list[sn] = cur_marker;
+ } else {
+ return FALSE;
+ }
+ count_icc_marker ++;
+ icc_data_len += (cur_marker->data_length - JPEG_OVERHEAD_LEN);
+ }
+ }
+ if(count_icc_marker != num_icc_marker) {
+ return FALSE;
+ }
+ if(num_icc_marker == 0) {
+ return TRUE;
+ }
+ icc_data_ptr = FX_Alloc(FX_BYTE, icc_data_len);
+ if(icc_buf_ptr == NULL) {
+ return FALSE;
+ }
+ *icc_buf_ptr = icc_data_ptr;
+ *icc_length = icc_data_len;
+ for (int idx = 0; idx < num_icc_marker; idx++) {
+ icc_data_len = marker_list[idx]->data_length - JPEG_OVERHEAD_LEN;
+ FXSYS_memcpy32(icc_data_ptr, marker_list[idx]->data + JPEG_OVERHEAD_LEN, icc_data_len);
+ icc_data_ptr += icc_data_len;
+ }
+ return TRUE;
+}
+static FX_BOOL _JpegEmbedIccProfile(j_compress_ptr cinfo, FX_LPCBYTE icc_buf_ptr, FX_DWORD icc_length)
+{
+ if(icc_buf_ptr == NULL || icc_length == 0) {
+ return FALSE;
+ }
+ FX_DWORD icc_segment_size = (JPEG_MARKER_MAXSIZE - 2 - JPEG_OVERHEAD_LEN);
+ FX_DWORD icc_segment_num = (icc_length / icc_segment_size) + 1;
+ if (icc_segment_num > 255) {
+ return FALSE;
+ }
+ FX_DWORD icc_data_length = JPEG_OVERHEAD_LEN + (icc_segment_num > 1 ? icc_segment_size : icc_length);
+ FX_LPBYTE icc_data = FX_Alloc(FX_BYTE, icc_data_length);
+ if (icc_data == NULL) {
+ return FALSE;
+ }
+ FXSYS_memcpy32(icc_data, "\x49\x43\x43\x5f\x50\x52\x4f\x46\x49\x4c\x45\x00", 12);
+ icc_data[13] = (FX_BYTE)icc_segment_num;
+ for (FX_BYTE i = 0; i < (icc_segment_num - 1); i++) {
+ icc_data[12] = i + 1;
+ FXSYS_memcpy32(icc_data + JPEG_OVERHEAD_LEN, icc_buf_ptr + i * icc_segment_size, icc_segment_size);
+ jpeg_write_marker(cinfo, JPEG_MARKER_ICC, icc_data, icc_data_length);
+ }
+ icc_data[12] = (FX_BYTE)icc_segment_num;
+ FX_DWORD icc_size = (icc_segment_num - 1) * icc_segment_size;
+ FXSYS_memcpy32(icc_data + JPEG_OVERHEAD_LEN, icc_buf_ptr + icc_size, icc_length - icc_size);
+ jpeg_write_marker(cinfo, JPEG_MARKER_ICC, icc_data, JPEG_OVERHEAD_LEN + icc_length - icc_size);
+ FX_Free(icc_data);
+ return TRUE;
+}
+extern "C" {
+ static void _dest_do_nothing(j_compress_ptr cinfo) {}
+};
+extern "C" {
+ static boolean _dest_empty(j_compress_ptr cinfo)
+ {
+ return FALSE;
+ }
+};
+#define JPEG_BLOCK_SIZE 1048576
+static void _JpegEncode(const CFX_DIBSource* pSource, FX_LPBYTE& dest_buf, FX_STRSIZE& dest_size, int quality, FX_LPCBYTE icc_buf, FX_DWORD icc_length)
+{
+ struct jpeg_compress_struct cinfo;
+ struct jpeg_error_mgr jerr;
+ jerr.error_exit = _error_do_nothing;
+ jerr.emit_message = _error_do_nothing1;
+ jerr.output_message = _error_do_nothing;
+ jerr.format_message = _error_do_nothing2;
+ jerr.reset_error_mgr = _error_do_nothing;
+ cinfo.err = &jerr;
+ jpeg_create_compress(&cinfo);
+ int Bpp = pSource->GetBPP() / 8;
+ int nComponents = Bpp >= 3 ? (pSource->IsCmykImage() ? 4 : 3) : 1;
+ int pitch = pSource->GetPitch();
+ int width = pSource->GetWidth();
+ int height = pSource->GetHeight();
+ FX_DWORD dest_buf_length = width * height * nComponents + 1024 + (icc_length ? (icc_length + 255 * 18) : 0);
+ dest_buf = FX_Alloc(FX_BYTE, dest_buf_length);
+ while (dest_buf == NULL) {
+ dest_buf_length >>= 1;
+ dest_buf = FX_Alloc(FX_BYTE, dest_buf_length);
+ }
+ FXSYS_memset32(dest_buf, 0, dest_buf_length);
+ struct jpeg_destination_mgr dest;
+ dest.init_destination = _dest_do_nothing;
+ dest.term_destination = _dest_do_nothing;
+ dest.empty_output_buffer = _dest_empty;
+ dest.next_output_byte = dest_buf;
+ dest.free_in_buffer = dest_buf_length;
+ cinfo.dest = &dest;
+ cinfo.image_width = width;
+ cinfo.image_height = height;
+ cinfo.input_components = nComponents;
+ if (nComponents == 1) {
+ cinfo.in_color_space = JCS_GRAYSCALE;
+ } else if (nComponents == 3) {
+ cinfo.in_color_space = JCS_RGB;
+ } else {
+ cinfo.in_color_space = JCS_CMYK;
+ }
+ FX_LPBYTE line_buf = NULL;
+ if (nComponents > 1) {
+ line_buf = FX_Alloc(FX_BYTE, width * nComponents);
+ if (line_buf == NULL) {
+ return;
+ }
+ }
+ jpeg_set_defaults(&cinfo);
+ if(quality != 75) {
+ jpeg_set_quality(&cinfo, quality, TRUE);
+ }
+ jpeg_start_compress(&cinfo, TRUE);
+ _JpegEmbedIccProfile(&cinfo, icc_buf, icc_length);
+ JSAMPROW row_pointer[1];
+ JDIMENSION row;
+ while (cinfo.next_scanline < cinfo.image_height) {
+ FX_LPCBYTE src_scan = pSource->GetScanline(cinfo.next_scanline);
+ if (nComponents > 1) {
+ FX_LPBYTE dest_scan = line_buf;
+ if (nComponents == 3) {
+ for (int i = 0; i < width; i ++) {
+ dest_scan[0] = src_scan[2];
+ dest_scan[1] = src_scan[1];
+ dest_scan[2] = src_scan[0];
+ dest_scan += 3;
+ src_scan += Bpp;
+ }
+ } else {
+ for (int i = 0; i < pitch; i ++) {
+ *dest_scan++ = ~*src_scan++;
+ }
+ }
+ row_pointer[0] = line_buf;
+ } else {
+ row_pointer[0] = (FX_LPBYTE)src_scan;
+ }
+ row = cinfo.next_scanline;
+ jpeg_write_scanlines(&cinfo, row_pointer, 1);
+ if (cinfo.next_scanline == row) {
+ dest_buf = FX_Realloc(FX_BYTE, dest_buf, dest_buf_length + JPEG_BLOCK_SIZE);
+ if (dest_buf == NULL) {
+ FX_Free(line_buf);
+ return;
+ }
+ dest.next_output_byte = dest_buf + dest_buf_length - dest.free_in_buffer;
+ dest_buf_length += JPEG_BLOCK_SIZE;
+ dest.free_in_buffer += JPEG_BLOCK_SIZE;
+ }
+ }
+ jpeg_finish_compress(&cinfo);
+ jpeg_destroy_compress(&cinfo);
+ if (line_buf) {
+ FX_Free(line_buf);
+ }
+ dest_size = dest_buf_length - (FX_STRSIZE)dest.free_in_buffer;
+}
+static FX_BOOL _JpegLoadInfo(FX_LPCBYTE src_buf, FX_DWORD src_size, int& width, int& height,
+ int& num_components, int& bits_per_components, FX_BOOL& color_transform,
+ FX_LPBYTE* icc_buf_ptr, FX_DWORD* icc_length)
+{
+ _JpegScanSOI(src_buf, src_size);
+ struct jpeg_decompress_struct cinfo;
+ struct jpeg_error_mgr jerr;
+ jerr.error_exit = _error_fatal;
+ jerr.emit_message = _error_do_nothing1;
+ jerr.output_message = _error_do_nothing;
+ jerr.format_message = _error_do_nothing2;
+ jerr.reset_error_mgr = _error_do_nothing;
+ cinfo.err = &jerr;
+ jmp_buf mark;
+ cinfo.client_data = &mark;
+ if (setjmp(mark) == -1) {
+ return FALSE;
+ }
+ jpeg_create_decompress(&cinfo);
+ struct jpeg_source_mgr src;
+ src.init_source = _src_do_nothing;
+ src.term_source = _src_do_nothing;
+ src.skip_input_data = _src_skip_data;
+ src.fill_input_buffer = _src_fill_buffer;
+ src.resync_to_restart = _src_resync;
+ src.bytes_in_buffer = src_size;
+ src.next_input_byte = src_buf;
+ cinfo.src = &src;
+ if (setjmp(mark) == -1) {
+ jpeg_destroy_decompress(&cinfo);
+ return FALSE;
+ }
+ if(icc_buf_ptr && icc_length) {
+ jpeg_save_markers(&cinfo, JPEG_MARKER_ICC, JPEG_MARKER_MAXSIZE);
+ }
+ int ret = jpeg_read_header(&cinfo, TRUE);
+ if (ret != JPEG_HEADER_OK) {
+ jpeg_destroy_decompress(&cinfo);
+ return FALSE;
+ }
+ width = cinfo.image_width;
+ height = cinfo.image_height;
+ num_components = cinfo.num_components;
+ color_transform = cinfo.jpeg_color_space == JCS_YCbCr || cinfo.jpeg_color_space == JCS_YCCK;
+ bits_per_components = cinfo.data_precision;
+ if(icc_buf_ptr != NULL) {
+ *icc_buf_ptr = NULL;
+ }
+ if(icc_length != NULL) {
+ *icc_length = 0;
+ }
+ jpeg_destroy_decompress(&cinfo);
+ return TRUE;
+}
+class CCodec_JpegDecoder : public CCodec_ScanlineDecoder
+{
+public:
+ CCodec_JpegDecoder();
+ ~CCodec_JpegDecoder();
+ FX_BOOL Create(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height, int nComps,
+ FX_BOOL ColorTransform, IFX_JpegProvider* pJP);
+ virtual void Destroy()
+ {
+ delete this;
+ }
+ virtual void v_DownScale(int dest_width, int dest_height);
+ virtual FX_BOOL v_Rewind();
+ virtual FX_LPBYTE v_GetNextLine();
+ virtual FX_DWORD GetSrcOffset();
+ jmp_buf m_JmpBuf;
+ struct jpeg_decompress_struct cinfo;
+ struct jpeg_error_mgr jerr;
+ struct jpeg_source_mgr src;
+ FX_LPCBYTE m_SrcBuf;
+ FX_DWORD m_SrcSize;
+ FX_LPBYTE m_pScanlineBuf;
+ FX_BOOL InitDecode();
+ FX_BOOL m_bInited, m_bStarted, m_bJpegTransform;
+protected:
+ IFX_JpegProvider* m_pExtProvider;
+ void* m_pExtContext;
+ FX_DWORD m_nDefaultScaleDenom;
+};
+CCodec_JpegDecoder::CCodec_JpegDecoder()
+{
+ m_pScanlineBuf = NULL;
+ m_DownScale = 1;
+ m_bStarted = FALSE;
+ m_bInited = FALSE;
+ m_pExtProvider = NULL;
+ m_pExtContext = NULL;
+ FXSYS_memset32(&cinfo, 0, sizeof(cinfo));
+ FXSYS_memset32(&jerr, 0, sizeof(jerr));
+ FXSYS_memset32(&src, 0, sizeof(src));
+ m_nDefaultScaleDenom = 1;
+}
+CCodec_JpegDecoder::~CCodec_JpegDecoder()
+{
+ if (m_pExtProvider) {
+ m_pExtProvider->DestroyDecoder(m_pExtContext);
+ return;
+ }
+ if (m_pScanlineBuf) {
+ FX_Free(m_pScanlineBuf);
+ }
+ if (m_bInited) {
+ jpeg_destroy_decompress(&cinfo);
+ }
+}
+FX_BOOL CCodec_JpegDecoder::InitDecode()
+{
+ cinfo.err = &jerr;
+ cinfo.client_data = &m_JmpBuf;
+ if (setjmp(m_JmpBuf) == -1) {
+ return FALSE;
+ }
+ jpeg_create_decompress(&cinfo);
+ m_bInited = TRUE;
+ cinfo.src = &src;
+ src.bytes_in_buffer = m_SrcSize;
+ src.next_input_byte = m_SrcBuf;
+ if (setjmp(m_JmpBuf) == -1) {
+ jpeg_destroy_decompress(&cinfo);
+ m_bInited = FALSE;
+ return FALSE;
+ }
+ cinfo.image_width = m_OrigWidth;
+ cinfo.image_height = m_OrigHeight;
+ int ret = jpeg_read_header(&cinfo, TRUE);
+ if (ret != JPEG_HEADER_OK) {
+ return FALSE;
+ }
+ if (cinfo.saw_Adobe_marker) {
+ m_bJpegTransform = TRUE;
+ }
+ if (cinfo.num_components == 3 && !m_bJpegTransform) {
+ cinfo.out_color_space = cinfo.jpeg_color_space;
+ }
+ m_OrigWidth = cinfo.image_width;
+ m_OrigHeight = cinfo.image_height;
+ m_OutputWidth = m_OrigWidth;
+ m_OutputHeight = m_OutputHeight;
+ m_nDefaultScaleDenom = cinfo.scale_denom;
+ return TRUE;
+}
+FX_BOOL CCodec_JpegDecoder::Create(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,
+ int nComps, FX_BOOL ColorTransform, IFX_JpegProvider* pJP)
+{
+ if (pJP) {
+ m_pExtProvider = pJP;
+ m_pExtContext = m_pExtProvider->CreateDecoder(src_buf, src_size, width, height, nComps, ColorTransform);
+ return m_pExtContext != NULL;
+ }
+ _JpegScanSOI(src_buf, src_size);
+ m_SrcBuf = src_buf;
+ m_SrcSize = src_size;
+ jerr.error_exit = _error_fatal;
+ jerr.emit_message = _error_do_nothing1;
+ jerr.output_message = _error_do_nothing;
+ jerr.format_message = _error_do_nothing2;
+ jerr.reset_error_mgr = _error_do_nothing;
+ src.init_source = _src_do_nothing;
+ src.term_source = _src_do_nothing;
+ src.skip_input_data = _src_skip_data;
+ src.fill_input_buffer = _src_fill_buffer;
+ src.resync_to_restart = _src_resync;
+ m_bJpegTransform = ColorTransform;
+ if(src_size > 1 && FXSYS_memcmp32(src_buf + src_size - 2, "\xFF\xD9", 2) != 0) {
+ ((FX_LPBYTE)src_buf)[src_size - 2] = 0xFF;
+ ((FX_LPBYTE)src_buf)[src_size - 1] = 0xD9;
+ }
+ m_OutputWidth = m_OrigWidth = width;
+ m_OutputHeight = m_OrigHeight = height;
+ if (!InitDecode()) {
+ return FALSE;
+ }
+ if (cinfo.num_components < nComps) {
+ return FALSE;
+ }
+ if ((int)cinfo.image_width < width) {
+ return FALSE;
+ }
+ m_Pitch = (cinfo.image_width * cinfo.num_components + 3) / 4 * 4;
+ m_pScanlineBuf = FX_Alloc(FX_BYTE, m_Pitch);
+ if (m_pScanlineBuf == NULL) {
+ return FALSE;
+ }
+ m_nComps = cinfo.num_components;
+ m_bpc = 8;
+ m_bColorTransformed = FALSE;
+ m_bStarted = FALSE;
+ return TRUE;
+}
+extern "C" {
+ FX_INT32 FX_GetDownsampleRatio(FX_INT32 originWidth, FX_INT32 originHeight, FX_INT32 downsampleWidth, FX_INT32 downsampleHeight)
+ {
+ int iratio_w = originWidth / downsampleWidth;
+ int iratio_h = originHeight / downsampleHeight;
+ int ratio = (iratio_w > iratio_h) ? iratio_h : iratio_w;
+ if (ratio >= 8) {
+ return 8;
+ } else if (ratio >= 4) {
+ return 4;
+ } else if (ratio >= 2) {
+ return 2;
+ }
+ return 1;
+ }
+}
+void CCodec_JpegDecoder::v_DownScale(int dest_width, int dest_height)
+{
+ if (m_pExtProvider) {
+ m_pExtProvider->DownScale(m_pExtContext, dest_width, dest_height);
+ return;
+ }
+ int old_scale = m_DownScale;
+ m_DownScale = FX_GetDownsampleRatio(m_OrigWidth, m_OrigHeight, dest_width, dest_height);
+ m_OutputWidth = (m_OrigWidth + m_DownScale - 1) / m_DownScale;
+ m_OutputHeight = (m_OrigHeight + m_DownScale - 1) / m_DownScale;
+ m_Pitch = (m_OutputWidth * m_nComps + 3) / 4 * 4;
+ if (old_scale != m_DownScale) {
+ m_NextLine = -1;
+ }
+}
+FX_BOOL CCodec_JpegDecoder::v_Rewind()
+{
+ if (m_pExtProvider) {
+ return m_pExtProvider->Rewind(m_pExtContext);
+ }
+ if (m_bStarted) {
+ jpeg_destroy_decompress(&cinfo);
+ if (!InitDecode()) {
+ return FALSE;
+ }
+ }
+ if (setjmp(m_JmpBuf) == -1) {
+ return FALSE;
+ }
+ cinfo.scale_denom = m_nDefaultScaleDenom * m_DownScale;
+ m_OutputWidth = (m_OrigWidth + m_DownScale - 1) / m_DownScale;
+ m_OutputHeight = (m_OrigHeight + m_DownScale - 1) / m_DownScale;
+ if (!jpeg_start_decompress(&cinfo)) {
+ jpeg_destroy_decompress(&cinfo);
+ return FALSE;
+ }
+ if ((int)cinfo.output_width > m_OrigWidth) {
+ FXSYS_assert(FALSE);
+ return FALSE;
+ }
+ m_bStarted = TRUE;
+ return TRUE;
+}
+FX_LPBYTE CCodec_JpegDecoder::v_GetNextLine()
+{
+ if (m_pExtProvider) {
+ return m_pExtProvider->GetNextLine(m_pExtContext);
+ }
+ int nlines = jpeg_read_scanlines(&cinfo, &m_pScanlineBuf, 1);
+ if (nlines < 1) {
+ return NULL;
+ }
+ return m_pScanlineBuf;
+}
+FX_DWORD CCodec_JpegDecoder::GetSrcOffset()
+{
+ if (m_pExtProvider) {
+ return m_pExtProvider->GetSrcOffset(m_pExtContext);
+ }
+ return (FX_DWORD)(m_SrcSize - src.bytes_in_buffer);
+}
+ICodec_ScanlineDecoder* CCodec_JpegModule::CreateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size,
+ int width, int height, int nComps, FX_BOOL ColorTransform)
+{
+ if (src_buf == NULL || src_size == 0) {
+ return NULL;
+ }
+ CCodec_JpegDecoder* pDecoder = FX_NEW CCodec_JpegDecoder;
+ if (pDecoder == NULL) {
+ return NULL;
+ }
+ if (!pDecoder->Create(src_buf, src_size, width, height, nComps, ColorTransform, m_pExtProvider)) {
+ delete pDecoder;
+ return NULL;
+ }
+ return pDecoder;
+}
+FX_BOOL CCodec_JpegModule::LoadInfo(FX_LPCBYTE src_buf, FX_DWORD src_size, int& width, int& height,
+ int& num_components, int& bits_per_components, FX_BOOL& color_transform,
+ FX_LPBYTE* icc_buf_ptr, FX_DWORD* icc_length)
+{
+ if (m_pExtProvider) {
+ return m_pExtProvider->LoadInfo(src_buf, src_size, width, height,
+ num_components, bits_per_components, color_transform,
+ icc_buf_ptr, icc_length);
+ }
+ return _JpegLoadInfo(src_buf, src_size, width, height, num_components, bits_per_components, color_transform, icc_buf_ptr, icc_length);
+}
+FX_BOOL CCodec_JpegModule::Encode(const CFX_DIBSource* pSource, FX_LPBYTE& dest_buf, FX_STRSIZE& dest_size, int quality, FX_LPCBYTE icc_buf, FX_DWORD icc_length)
+{
+ if (m_pExtProvider) {
+ return m_pExtProvider->Encode(pSource, dest_buf, dest_size, quality, icc_buf, icc_length);
+ }
+ if(pSource->GetBPP() < 8 || pSource->GetPalette() != NULL) {
+ ASSERT(pSource->GetBPP() >= 8 && pSource->GetPalette() == NULL);
+ return FALSE;
+ }
+ _JpegEncode(pSource, dest_buf, dest_size, quality, icc_buf, icc_length);
+ return TRUE;
+}
+struct FXJPEG_Context {
+ jmp_buf m_JumpMark;
+ jpeg_decompress_struct m_Info;
+ jpeg_error_mgr m_ErrMgr;
+ jpeg_source_mgr m_SrcMgr;
+ unsigned int m_SkipSize;
+ void* (*m_AllocFunc)(unsigned int);
+ void (*m_FreeFunc)(void*);
+};
+extern "C" {
+ static void _error_fatal1(j_common_ptr cinfo)
+ {
+ longjmp(((FXJPEG_Context*)cinfo->client_data)->m_JumpMark, -1);
+ }
+};
+extern "C" {
+ static void _src_skip_data1(struct jpeg_decompress_struct* cinfo, long num)
+ {
+ if (cinfo->src->bytes_in_buffer < (size_t)num) {
+ ((FXJPEG_Context*)cinfo->client_data)->m_SkipSize = (unsigned int)(num - cinfo->src->bytes_in_buffer);
+ cinfo->src->bytes_in_buffer = 0;
+ } else {
+ cinfo->src->next_input_byte += num;
+ cinfo->src->bytes_in_buffer -= num;
+ }
+ }
+};
+static void* jpeg_alloc_func(unsigned int size)
+{
+ return FX_Alloc(char, size);
+}
+static void jpeg_free_func(void* p)
+{
+ FX_Free(p);
+}
+void* CCodec_JpegModule::Start()
+{
+ if (m_pExtProvider) {
+ return m_pExtProvider->Start();
+ }
+ FXJPEG_Context* p = (FXJPEG_Context*)FX_Alloc(FX_BYTE, sizeof(FXJPEG_Context));
+ if (p == NULL) {
+ return NULL;
+ }
+ p->m_AllocFunc = jpeg_alloc_func;
+ p->m_FreeFunc = jpeg_free_func;
+ p->m_ErrMgr.error_exit = _error_fatal1;
+ p->m_ErrMgr.emit_message = _error_do_nothing1;
+ p->m_ErrMgr.output_message = _error_do_nothing;
+ p->m_ErrMgr.format_message = _error_do_nothing2;
+ p->m_ErrMgr.reset_error_mgr = _error_do_nothing;
+ p->m_SrcMgr.init_source = _src_do_nothing;
+ p->m_SrcMgr.term_source = _src_do_nothing;
+ p->m_SrcMgr.skip_input_data = _src_skip_data1;
+ p->m_SrcMgr.fill_input_buffer = _src_fill_buffer;
+ p->m_SrcMgr.resync_to_restart = _src_resync;
+ p->m_Info.client_data = p;
+ p->m_Info.err = &p->m_ErrMgr;
+ if (setjmp(p->m_JumpMark) == -1) {
+ return 0;
+ }
+ jpeg_create_decompress(&p->m_Info);
+ p->m_Info.src = &p->m_SrcMgr;
+ p->m_SkipSize = 0;
+ return p;
+}
+void CCodec_JpegModule::Finish(void* pContext)
+{
+ if (m_pExtProvider) {
+ m_pExtProvider->Finish(pContext);
+ return;
+ }
+ FXJPEG_Context* p = (FXJPEG_Context*)pContext;
+ jpeg_destroy_decompress(&p->m_Info);
+ p->m_FreeFunc(p);
+}
+void CCodec_JpegModule::Input(void* pContext, const unsigned char* src_buf, FX_DWORD src_size)
+{
+ if (m_pExtProvider) {
+ m_pExtProvider->Input(pContext, src_buf, src_size);
+ return;
+ }
+ FXJPEG_Context* p = (FXJPEG_Context*)pContext;
+ if (p->m_SkipSize) {
+ if (p->m_SkipSize > src_size) {
+ p->m_SrcMgr.bytes_in_buffer = 0;
+ p->m_SkipSize -= src_size;
+ return;
+ }
+ src_size -= p->m_SkipSize;
+ src_buf += p->m_SkipSize;
+ p->m_SkipSize = 0;
+ }
+ p->m_SrcMgr.next_input_byte = src_buf;
+ p->m_SrcMgr.bytes_in_buffer = src_size;
+}
+int CCodec_JpegModule::ReadHeader(void* pContext, int* width, int* height, int* nComps)
+{
+ if (m_pExtProvider) {
+ return m_pExtProvider->ReadHeader(pContext, width, height, nComps);
+ }
+ FXJPEG_Context* p = (FXJPEG_Context*)pContext;
+ if (setjmp(p->m_JumpMark) == -1) {
+ return 1;
+ }
+ int ret = jpeg_read_header(&p->m_Info, true);
+ if (ret == JPEG_SUSPENDED) {
+ return 2;
+ }
+ if (ret != JPEG_HEADER_OK) {
+ return 1;
+ }
+ *width = p->m_Info.image_width;
+ *height = p->m_Info.image_height;
+ *nComps = p->m_Info.num_components;
+ return 0;
+}
+FX_BOOL CCodec_JpegModule::StartScanline(void* pContext, int down_scale)
+{
+ if (m_pExtProvider) {
+ return m_pExtProvider->StartScanline(pContext, down_scale);
+ }
+ FXJPEG_Context* p = (FXJPEG_Context*)pContext;
+ if (setjmp(p->m_JumpMark) == -1) {
+ return FALSE;
+ }
+ p->m_Info.scale_denom = down_scale;
+ return jpeg_start_decompress(&p->m_Info);
+}
+FX_BOOL CCodec_JpegModule::ReadScanline(void* pContext, unsigned char* dest_buf)
+{
+ if (m_pExtProvider) {
+ return m_pExtProvider->ReadScanline(pContext, dest_buf);
+ }
+ FXJPEG_Context* p = (FXJPEG_Context*)pContext;
+ if (setjmp(p->m_JumpMark) == -1) {
+ return FALSE;
+ }
+ int nlines = jpeg_read_scanlines(&p->m_Info, &dest_buf, 1);
+ return nlines == 1;
+}
+FX_DWORD CCodec_JpegModule::GetAvailInput(void* pContext, FX_LPBYTE* avail_buf_ptr)
+{
+ if (m_pExtProvider) {
+ return m_pExtProvider->GetAvailInput(pContext, avail_buf_ptr);
+ }
+ if(avail_buf_ptr != NULL) {
+ *avail_buf_ptr = NULL;
+ if(((FXJPEG_Context*)pContext)->m_SrcMgr.bytes_in_buffer > 0) {
+ *avail_buf_ptr = (FX_LPBYTE)((FXJPEG_Context*)pContext)->m_SrcMgr.next_input_byte;
+ }
+ }
+ return (FX_DWORD)((FXJPEG_Context*)pContext)->m_SrcMgr.bytes_in_buffer;
+}
diff --git a/core/src/fxcodec/codec/fx_codec_jpx_opj.cpp b/core/src/fxcodec/codec/fx_codec_jpx_opj.cpp
index 423819f69f..32cb10076d 100644
--- a/core/src/fxcodec/codec/fx_codec_jpx_opj.cpp
+++ b/core/src/fxcodec/codec/fx_codec_jpx_opj.cpp
@@ -1,799 +1,799 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../../include/fxcodec/fx_codec.h"
-#include "codec_int.h"
-#include "../fx_libopenjpeg/libopenjpeg20/openjpeg.h"
-#include "../lcms2/include/fx_lcms2.h"
-static void fx_error_callback(const char *msg, void *client_data)
-{
- (void)client_data;
-}
-static void fx_warning_callback(const char *msg, void *client_data)
-{
- (void)client_data;
-}
-static void fx_info_callback(const char *msg, void *client_data)
-{
- (void)client_data;
-}
-typedef struct {
- const unsigned char* src_data;
- int src_size;
- int offset;
-} decodeData;
-static OPJ_SIZE_T opj_read_from_memory (void * p_buffer, OPJ_SIZE_T p_nb_bytes, decodeData* srcData)
-{
- if(srcData == NULL || srcData->src_size == 0 || srcData->src_data == NULL || srcData->offset >= srcData->src_size) {
- return -1;
- }
- OPJ_SIZE_T readlength = p_nb_bytes;
- OPJ_SIZE_T bufferLength = (OPJ_SIZE_T)(srcData->src_size - srcData->offset);
- if(bufferLength <= 0) {
- return 0;
- }
- if(bufferLength <= p_nb_bytes) {
- readlength = bufferLength;
- }
- memcpy(p_buffer, &(srcData->src_data[srcData->offset]), readlength);
- srcData->offset += (int)readlength;
- return readlength;
-}
-static OPJ_SIZE_T opj_write_from_memory (void * p_buffer, OPJ_SIZE_T p_nb_bytes, decodeData* srcData)
-{
- if(srcData == NULL || srcData->src_size == 0 || srcData->src_data == NULL || srcData->offset >= srcData->src_size) {
- return -1;
- }
- OPJ_SIZE_T writeLength = p_nb_bytes;
- OPJ_SIZE_T bufferLength = (OPJ_SIZE_T)(srcData->src_size - srcData->offset);
- if(bufferLength <= p_nb_bytes) {
- writeLength = bufferLength;
- }
- memcpy((void*&)(srcData->src_data[srcData->offset]), p_buffer, writeLength);
- srcData->offset += (int)writeLength;
- return writeLength;
-}
-static OPJ_OFF_T opj_skip_from_memory (OPJ_OFF_T p_nb_bytes, decodeData* srcData)
-{
- if(srcData == NULL || srcData->src_size == 0 || srcData->src_data == NULL || srcData->offset >= srcData->src_size) {
- return -1;
- }
- OPJ_OFF_T postion = srcData->offset + p_nb_bytes;
- if(postion < 0 ) {
- postion = 0;
- } else if (postion > srcData->src_size) {
- }
- srcData->offset = (int)postion;
- return p_nb_bytes;
-}
-static OPJ_BOOL opj_seek_from_memory (OPJ_OFF_T p_nb_bytes, decodeData * srcData)
-{
- if(srcData == NULL || srcData->src_size == 0 || srcData->src_data == NULL || srcData->offset >= srcData->src_size) {
- return -1;
- }
- srcData->offset = (int)p_nb_bytes;
- if(srcData->offset < 0) {
- srcData->offset = 0;
- } else if(srcData->offset > srcData->src_size) {
- srcData->offset = srcData->src_size;
- }
- return OPJ_TRUE;
-}
-opj_stream_t* fx_opj_stream_create_memory_stream (decodeData* data, OPJ_SIZE_T p_size, OPJ_BOOL p_is_read_stream)
-{
- opj_stream_t* l_stream = 00;
- if (!data || ! data->src_data || data->src_size <= 0 ) {
- return NULL;
- }
- l_stream = opj_stream_create(p_size, p_is_read_stream);
- if (! l_stream) {
- return NULL;
- }
- opj_stream_set_user_data_v3(l_stream, data, NULL);
- opj_stream_set_user_data_length(l_stream, data->src_size);
- opj_stream_set_read_function(l_stream, (opj_stream_read_fn) opj_read_from_memory);
- opj_stream_set_write_function(l_stream, (opj_stream_write_fn) opj_write_from_memory);
- opj_stream_set_skip_function(l_stream, (opj_stream_skip_fn) opj_skip_from_memory);
- opj_stream_set_seek_function(l_stream, (opj_stream_seek_fn) opj_seek_from_memory);
- return l_stream;
-}
-static void sycc_to_rgb(int offset, int upb, int y, int cb, int cr,
- int *out_r, int *out_g, int *out_b)
-{
- int r, g, b;
- cb -= offset;
- cr -= offset;
- r = y + (int)(1.402 * (float)cr);
- if(r < 0) {
- r = 0;
- } else if(r > upb) {
- r = upb;
- } *out_r = r;
- g = y - (int)(0.344 * (float)cb + 0.714 * (float)cr);
- if(g < 0) {
- g = 0;
- } else if(g > upb) {
- g = upb;
- } *out_g = g;
- b = y + (int)(1.772 * (float)cb);
- if(b < 0) {
- b = 0;
- } else if(b > upb) {
- b = upb;
- } *out_b = b;
-}
-static void sycc444_to_rgb(opj_image_t *img)
-{
- int *d0, *d1, *d2, *r, *g, *b;
- const int *y, *cb, *cr;
- int maxw, maxh, max, i, offset, upb;
- i = (int)img->comps[0].prec;
- offset = 1 << (i - 1);
- upb = (1 << i) - 1;
- maxw = (int)img->comps[0].w;
- maxh = (int)img->comps[0].h;
- max = maxw * maxh;
- y = img->comps[0].data;
- cb = img->comps[1].data;
- cr = img->comps[2].data;
- d0 = r = FX_Alloc(int, (size_t)max);
- d1 = g = FX_Alloc(int, (size_t)max);
- d2 = b = FX_Alloc(int, (size_t)max);
- for(i = 0; i < max; ++i) {
- sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b);
- ++y;
- ++cb;
- ++cr;
- ++r;
- ++g;
- ++b;
- }
- FX_Free(img->comps[0].data);
- img->comps[0].data = d0;
- FX_Free(img->comps[1].data);
- img->comps[1].data = d1;
- FX_Free(img->comps[2].data);
- img->comps[2].data = d2;
-}
-static void sycc422_to_rgb(opj_image_t *img)
-{
- int *d0, *d1, *d2, *r, *g, *b;
- const int *y, *cb, *cr;
- int maxw, maxh, max, offset, upb;
- int i, j;
- i = (int)img->comps[0].prec;
- offset = 1 << (i - 1);
- upb = (1 << i) - 1;
- maxw = (int)img->comps[0].w;
- maxh = (int)img->comps[0].h;
- max = maxw * maxh;
- y = img->comps[0].data;
- cb = img->comps[1].data;
- cr = img->comps[2].data;
- d0 = r = FX_Alloc(int, (size_t)max);
- d1 = g = FX_Alloc(int, (size_t)max);
- d2 = b = FX_Alloc(int, (size_t)max);
- for(i = 0; i < maxh; ++i) {
- for(j = 0; j < maxw; j += 2) {
- sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b);
- ++y;
- ++r;
- ++g;
- ++b;
- sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b);
- ++y;
- ++r;
- ++g;
- ++b;
- ++cb;
- ++cr;
- }
- }
- FX_Free(img->comps[0].data);
- img->comps[0].data = d0;
- FX_Free(img->comps[1].data);
- img->comps[1].data = d1;
- FX_Free(img->comps[2].data);
- img->comps[2].data = d2;
- img->comps[1].w = maxw;
- img->comps[1].h = maxh;
- img->comps[2].w = maxw;
- img->comps[2].h = maxh;
- img->comps[1].w = (OPJ_UINT32)maxw;
- img->comps[1].h = (OPJ_UINT32)maxh;
- img->comps[2].w = (OPJ_UINT32)maxw;
- img->comps[2].h = (OPJ_UINT32)maxh;
- img->comps[1].dx = img->comps[0].dx;
- img->comps[2].dx = img->comps[0].dx;
- img->comps[1].dy = img->comps[0].dy;
- img->comps[2].dy = img->comps[0].dy;
-}
-static void sycc420_to_rgb(opj_image_t *img)
-{
- int *d0, *d1, *d2, *r, *g, *b, *nr, *ng, *nb;
- const int *y, *cb, *cr, *ny;
- int maxw, maxh, max, offset, upb;
- int i, j;
- i = (int)img->comps[0].prec;
- offset = 1 << (i - 1);
- upb = (1 << i) - 1;
- maxw = (int)img->comps[0].w;
- maxh = (int)img->comps[0].h;
- max = maxw * maxh;
- y = img->comps[0].data;
- cb = img->comps[1].data;
- cr = img->comps[2].data;
- d0 = r = FX_Alloc(int, (size_t)max);
- d1 = g = FX_Alloc(int, (size_t)max);
- d2 = b = FX_Alloc(int, (size_t)max);
- for(i = 0; i < maxh; i += 2) {
- ny = y + maxw;
- nr = r + maxw;
- ng = g + maxw;
- nb = b + maxw;
- for(j = 0; j < maxw; j += 2) {
- sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b);
- ++y;
- ++r;
- ++g;
- ++b;
- sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b);
- ++y;
- ++r;
- ++g;
- ++b;
- sycc_to_rgb(offset, upb, *ny, *cb, *cr, nr, ng, nb);
- ++ny;
- ++nr;
- ++ng;
- ++nb;
- sycc_to_rgb(offset, upb, *ny, *cb, *cr, nr, ng, nb);
- ++ny;
- ++nr;
- ++ng;
- ++nb;
- ++cb;
- ++cr;
- }
- y += maxw;
- r += maxw;
- g += maxw;
- b += maxw;
- }
- FX_Free(img->comps[0].data);
- img->comps[0].data = d0;
- FX_Free(img->comps[1].data);
- img->comps[1].data = d1;
- FX_Free(img->comps[2].data);
- img->comps[2].data = d2;
- img->comps[1].w = maxw;
- img->comps[1].h = maxh;
- img->comps[2].w = maxw;
- img->comps[2].h = maxh;
- img->comps[1].w = (OPJ_UINT32)maxw;
- img->comps[1].h = (OPJ_UINT32)maxh;
- img->comps[2].w = (OPJ_UINT32)maxw;
- img->comps[2].h = (OPJ_UINT32)maxh;
- img->comps[1].dx = img->comps[0].dx;
- img->comps[2].dx = img->comps[0].dx;
- img->comps[1].dy = img->comps[0].dy;
- img->comps[2].dy = img->comps[0].dy;
-}
-void color_sycc_to_rgb(opj_image_t *img)
-{
- if(img->numcomps < 3) {
- img->color_space = OPJ_CLRSPC_GRAY;
- return;
- }
- if((img->comps[0].dx == 1)
- && (img->comps[1].dx == 2)
- && (img->comps[2].dx == 2)
- && (img->comps[0].dy == 1)
- && (img->comps[1].dy == 2)
- && (img->comps[2].dy == 2)) {
- sycc420_to_rgb(img);
- } else if((img->comps[0].dx == 1)
- && (img->comps[1].dx == 2)
- && (img->comps[2].dx == 2)
- && (img->comps[0].dy == 1)
- && (img->comps[1].dy == 1)
- && (img->comps[2].dy == 1)) {
- sycc422_to_rgb(img);
- } else if((img->comps[0].dx == 1)
- && (img->comps[1].dx == 1)
- && (img->comps[2].dx == 1)
- && (img->comps[0].dy == 1)
- && (img->comps[1].dy == 1)
- && (img->comps[2].dy == 1)) {
- sycc444_to_rgb(img);
- } else {
- return;
- }
- img->color_space = OPJ_CLRSPC_SRGB;
-}
-void color_apply_icc_profile(opj_image_t *image)
-{
- cmsHPROFILE in_prof, out_prof;
- cmsHTRANSFORM transform;
- cmsColorSpaceSignature in_space, out_space;
- cmsUInt32Number intent, in_type, out_type, nr_samples;
- int *r, *g, *b;
- int prec, i, max, max_w, max_h;
- OPJ_COLOR_SPACE oldspace;
- in_prof =
- cmsOpenProfileFromMem(image->icc_profile_buf, image->icc_profile_len);
- if(in_prof == NULL) {
- return;
- }
- in_space = cmsGetPCS(in_prof);
- out_space = cmsGetColorSpace(in_prof);
- intent = cmsGetHeaderRenderingIntent(in_prof);
- max_w = (int)image->comps[0].w;
- max_h = (int)image->comps[0].h;
- prec = (int)image->comps[0].prec;
- oldspace = image->color_space;
- if(out_space == cmsSigRgbData) {
- if( prec <= 8 ) {
- in_type = TYPE_RGB_8;
- out_type = TYPE_RGB_8;
- } else {
- in_type = TYPE_RGB_16;
- out_type = TYPE_RGB_16;
- }
- out_prof = cmsCreate_sRGBProfile();
- image->color_space = OPJ_CLRSPC_SRGB;
- } else if(out_space == cmsSigGrayData) {
- if( prec <= 8 ) {
- in_type = TYPE_GRAY_8;
- out_type = TYPE_RGB_8;
- } else {
- in_type = TYPE_GRAY_16;
- out_type = TYPE_RGB_16;
- }
- out_prof = cmsCreate_sRGBProfile();
- image->color_space = OPJ_CLRSPC_SRGB;
- } else if(out_space == cmsSigYCbCrData) {
- in_type = TYPE_YCbCr_16;
- out_type = TYPE_RGB_16;
- out_prof = cmsCreate_sRGBProfile();
- image->color_space = OPJ_CLRSPC_SRGB;
- } else {
- return;
- }
- transform = cmsCreateTransform(in_prof, in_type,
- out_prof, out_type, intent, 0);
- cmsCloseProfile(in_prof);
- cmsCloseProfile(out_prof);
- if(transform == NULL) {
- image->color_space = oldspace;
- return;
- }
- if(image->numcomps > 2) {
- if( prec <= 8 ) {
- unsigned char *inbuf, *outbuf, *in, *out;
- max = max_w * max_h;
- nr_samples = (cmsUInt32Number)max * 3 * (cmsUInt32Number)sizeof(unsigned char);
- in = inbuf = FX_Alloc(unsigned char, nr_samples);
- out = outbuf = FX_Alloc(unsigned char, nr_samples);
- r = image->comps[0].data;
- g = image->comps[1].data;
- b = image->comps[2].data;
- for(i = 0; i < max; ++i) {
- *in++ = (unsigned char) * r++;
- *in++ = (unsigned char) * g++;
- *in++ = (unsigned char) * b++;
- }
- cmsDoTransform(transform, inbuf, outbuf, (cmsUInt32Number)max);
- r = image->comps[0].data;
- g = image->comps[1].data;
- b = image->comps[2].data;
- for(i = 0; i < max; ++i) {
- *r++ = (int) * out++;
- *g++ = (int) * out++;
- *b++ = (int) * out++;
- }
- FX_Free(inbuf);
- FX_Free(outbuf);
- } else {
- unsigned short *inbuf, *outbuf, *in, *out;
- max = max_w * max_h;
- nr_samples = (cmsUInt32Number)max * 3 * (cmsUInt32Number)sizeof(unsigned short);
- in = inbuf = FX_Alloc(unsigned short, nr_samples);
- out = outbuf = FX_Alloc(unsigned short, nr_samples);
- r = image->comps[0].data;
- g = image->comps[1].data;
- b = image->comps[2].data;
- for(i = 0; i < max; ++i) {
- *in++ = (unsigned short) * r++;
- *in++ = (unsigned short) * g++;
- *in++ = (unsigned short) * b++;
- }
- cmsDoTransform(transform, inbuf, outbuf, (cmsUInt32Number)max);
- r = image->comps[0].data;
- g = image->comps[1].data;
- b = image->comps[2].data;
- for(i = 0; i < max; ++i) {
- *r++ = (int) * out++;
- *g++ = (int) * out++;
- *b++ = (int) * out++;
- }
- FX_Free(inbuf);
- FX_Free(outbuf);
- }
- } else {
- unsigned char *in, *inbuf, *out, *outbuf;
- max = max_w * max_h;
- nr_samples = (cmsUInt32Number)max * 3 * sizeof(unsigned char);
- in = inbuf = FX_Alloc(unsigned char, nr_samples);
- out = outbuf = FX_Alloc(unsigned char, nr_samples);
- image->comps = (opj_image_comp_t*)
- realloc(image->comps, (image->numcomps + 2) * sizeof(opj_image_comp_t));
- if(image->numcomps == 2) {
- image->comps[3] = image->comps[1];
- }
- image->comps[1] = image->comps[0];
- image->comps[2] = image->comps[0];
- image->comps[1].data = FX_Alloc(int, (size_t)max);
- FXSYS_memset8(image->comps[1].data, 0, sizeof(int) * (size_t)max);
- image->comps[2].data = FX_Alloc(int, (size_t)max);
- FXSYS_memset8(image->comps[2].data, 0, sizeof(int) * (size_t)max);
- image->numcomps += 2;
- r = image->comps[0].data;
- for(i = 0; i < max; ++i) {
- *in++ = (unsigned char) * r++;
- }
- cmsDoTransform(transform, inbuf, outbuf, (cmsUInt32Number)max);
- r = image->comps[0].data;
- g = image->comps[1].data;
- b = image->comps[2].data;
- for(i = 0; i < max; ++i) {
- *r++ = (int) * out++;
- *g++ = (int) * out++;
- *b++ = (int) * out++;
- }
- FX_Free(inbuf);
- FX_Free(outbuf);
- }
- cmsDeleteTransform(transform);
-}
-void color_apply_conversion(opj_image_t *image)
-{
- int *row;
- int enumcs, numcomps;
- numcomps = image->numcomps;
- if(numcomps < 3) {
- return;
- }
- row = (int*)image->icc_profile_buf;
- enumcs = row[0];
- if(enumcs == 14) {
- int *L, *a, *b, *red, *green, *blue, *src0, *src1, *src2;
- double rl, ol, ra, oa, rb, ob, prec0, prec1, prec2;
- double minL, maxL, mina, maxa, minb, maxb;
- unsigned int default_type, il;
- unsigned int i, max, illu;
- cmsHPROFILE in, out;
- cmsHTRANSFORM transform;
- cmsUInt16Number RGB[3];
- cmsCIELab Lab;
- illu = 0;
- il = 0;
- in = cmsCreateLab4Profile(NULL);
- out = cmsCreate_sRGBProfile();
- transform =
- cmsCreateTransform(in, TYPE_Lab_DBL, out, TYPE_RGB_16,
- INTENT_PERCEPTUAL, 0);
- cmsCloseProfile(in);
- cmsCloseProfile(out);
- if(transform == NULL) {
- return;
- }
- prec0 = (double)image->comps[0].prec;
- prec1 = (double)image->comps[1].prec;
- prec2 = (double)image->comps[2].prec;
- default_type = row[1];
- if(default_type == 0x44454600) {
- rl = 100;
- ra = 170;
- rb = 200;
- ol = 0;
- oa = pow(2, prec1 - 1);
- ob = pow(2, prec2 - 2) + pow(2, prec2 - 3);
- } else {
- rl = row[2];
- ra = row[4];
- rb = row[6];
- ol = row[3];
- oa = row[5];
- ob = row[7];
- }
- L = src0 = image->comps[0].data;
- a = src1 = image->comps[1].data;
- b = src2 = image->comps[2].data;
- max = image->comps[0].w * image->comps[0].h;
- red = FX_Alloc(int, max);
- image->comps[0].data = red;
- green = FX_Alloc(int, max);
- image->comps[1].data = green;
- blue = FX_Alloc(int, max);
- image->comps[2].data = blue;
- minL = -(rl * ol) / (pow(2, prec0) - 1);
- maxL = minL + rl;
- mina = -(ra * oa) / (pow(2, prec1) - 1);
- maxa = mina + ra;
- minb = -(rb * ob) / (pow(2, prec2) - 1);
- maxb = minb + rb;
- for(i = 0; i < max; ++i) {
- Lab.L = minL + (double)(*L) * (maxL - minL) / (pow(2, prec0) - 1);
- ++L;
- Lab.a = mina + (double)(*a) * (maxa - mina) / (pow(2, prec1) - 1);
- ++a;
- Lab.b = minb + (double)(*b) * (maxb - minb) / (pow(2, prec2) - 1);
- ++b;
- cmsDoTransform(transform, &Lab, RGB, 1);
- *red++ = RGB[0];
- *green++ = RGB[1];
- *blue++ = RGB[2];
- }
- cmsDeleteTransform(transform);
- FX_Free(src0);
- FX_Free(src1);
- FX_Free(src2);
- image->color_space = OPJ_CLRSPC_SRGB;
- image->comps[0].prec = 16;
- image->comps[1].prec = 16;
- image->comps[2].prec = 16;
- return;
- }
-}
-class CJPX_Decoder : public CFX_Object
-{
-public:
- CJPX_Decoder();
- ~CJPX_Decoder();
- FX_BOOL Init(const unsigned char* src_data, int src_size);
- void GetInfo(FX_DWORD& width, FX_DWORD& height, FX_DWORD& codestream_nComps, FX_DWORD& output_nComps);
- FX_BOOL Decode(FX_LPBYTE dest_buf, int pitch, FX_BOOL bTranslateColor, FX_LPBYTE offsets);
- FX_LPCBYTE m_SrcData;
- int m_SrcSize;
- opj_image_t *image;
- opj_codec_t* l_codec;
- opj_stream_t *l_stream;
- FX_BOOL m_useColorSpace;
-};
-CJPX_Decoder::CJPX_Decoder(): image(NULL), l_codec(NULL), l_stream(NULL), m_useColorSpace(FALSE)
-{
-}
-CJPX_Decoder::~CJPX_Decoder()
-{
- if(l_codec) {
- opj_destroy_codec(l_codec);
- }
- if(l_stream) {
- opj_stream_destroy(l_stream);
- }
- if(image) {
- opj_image_destroy(image);
- }
-}
-FX_BOOL CJPX_Decoder::Init(const unsigned char* src_data, int src_size)
-{
- opj_dparameters_t parameters;
- try {
- image = NULL;
- m_SrcData = src_data;
- m_SrcSize = src_size;
- decodeData srcData;
- srcData.offset = 0;
- srcData.src_size = src_size;
- srcData.src_data = src_data;
- l_stream = fx_opj_stream_create_memory_stream(&srcData, OPJ_J2K_STREAM_CHUNK_SIZE, 1);
- if (l_stream == NULL) {
- return FALSE;
- }
- opj_set_default_decoder_parameters(&parameters);
- parameters.decod_format = 0;
- parameters.cod_format = 3;
- if(FXSYS_memcmp32(m_SrcData, "\x00\x00\x00\x0c\x6a\x50\x20\x20\x0d\x0a\x87\x0a", 12) == 0) {
- l_codec = opj_create_decompress(OPJ_CODEC_JP2);
- parameters.decod_format = 1;
- } else {
- l_codec = opj_create_decompress(OPJ_CODEC_J2K);
- }
- if(!l_codec) {
- return FALSE;
- }
- opj_set_info_handler(l_codec, fx_info_callback, 00);
- opj_set_warning_handler(l_codec, fx_warning_callback, 00);
- opj_set_error_handler(l_codec, fx_error_callback, 00);
- if ( !opj_setup_decoder(l_codec, &parameters) ) {
- return FALSE;
- }
- if(! opj_read_header(l_stream, l_codec, &image)) {
- image = NULL;
- return FALSE;
- }
- if(this->m_useColorSpace) {
- image->useColorSpace = 1;
- } else {
- image->useColorSpace = 0;
- }
- if (!parameters.nb_tile_to_decode) {
- if (!opj_set_decode_area(l_codec, image, parameters.DA_x0,
- parameters.DA_y0, parameters.DA_x1, parameters.DA_y1)) {
- opj_image_destroy(image);
- image = NULL;
- return FALSE;
- }
- if (!(opj_decode(l_codec, l_stream, image) && opj_end_decompress(l_codec, l_stream))) {
- opj_image_destroy(image);
- image = NULL;
- return FALSE;
- }
- } else {
- if (!opj_get_decoded_tile(l_codec, l_stream, image, parameters.tile_index)) {
- return FALSE;
- }
- }
- opj_stream_destroy(l_stream);
- l_stream = NULL;
- if( image->color_space != OPJ_CLRSPC_SYCC
- && image->numcomps == 3 && image->comps[0].dx == image->comps[0].dy
- && image->comps[1].dx != 1 ) {
- image->color_space = OPJ_CLRSPC_SYCC;
- } else if (image->numcomps <= 2) {
- image->color_space = OPJ_CLRSPC_GRAY;
- }
- if(image->color_space == OPJ_CLRSPC_SYCC) {
- color_sycc_to_rgb(image);
- }
- if(image->icc_profile_buf && !image->useColorSpace) {
- FX_Free(image->icc_profile_buf);
- image->icc_profile_buf = NULL;
- image->icc_profile_len = 0;
- }
- if(!image) {
- return FALSE;
- }
- } catch (...) {
- return FALSE;
- }
- return TRUE;
-}
-void CJPX_Decoder::GetInfo(FX_DWORD& width, FX_DWORD& height, FX_DWORD& codestream_nComps, FX_DWORD& output_nComps)
-{
- width = (FX_DWORD)image->x1;
- height = (FX_DWORD)image->y1;
- output_nComps = codestream_nComps = (FX_DWORD)image->numcomps;
-}
-FX_BOOL CJPX_Decoder::Decode(FX_LPBYTE dest_buf, int pitch, FX_BOOL bTranslateColor, FX_LPBYTE offsets)
-{
- FX_BYTE** channel_bufs;
- int* adjust_comps;
- int i, wid, hei, row, col, channel, src;
- FX_BOOL flag;
- FX_LPBYTE pChannel, pScanline, pPixel;
- try {
- if(image->comps[0].w != image->x1 || image->comps[0].h != image->y1) {
- return FALSE;
- }
- if(pitch < (int)(image->comps[0].w * 8 * image->numcomps + 31) >> 5 << 2) {
- return FALSE;
- }
- FXSYS_memset8(dest_buf, 0xff, image->y1 * pitch);
- channel_bufs = FX_Alloc(FX_BYTE*, image->numcomps);
- if (channel_bufs == NULL) {
- return FALSE;
- }
- adjust_comps = FX_Alloc(int, image->numcomps);
- if (adjust_comps == NULL) {
- FX_Free(channel_bufs);
- return FALSE;
- }
- flag = TRUE;
- for (i = 0; i < (int)image->numcomps; i ++) {
- channel_bufs[i] = dest_buf + offsets[i];
- adjust_comps[i] = image->comps[i].prec - 8;
- if(i > 0) {
- if(image->comps[i].dx != image->comps[i - 1].dx
- || image->comps[i].dy != image->comps[i - 1].dy
- || image->comps[i].prec != image->comps[i - 1].prec) {
- flag = FALSE;
- goto failed;
- }
- }
- }
- wid = image->comps[0].w;
- hei = image->comps[0].h;
- for (channel = 0; channel < (int)image->numcomps; channel++) {
- pChannel = channel_bufs[channel];
- if(adjust_comps[channel] < 0) {
- for(row = 0; row < hei; row++) {
- pScanline = pChannel + row * pitch;
- for (col = 0; col < wid; col++) {
- pPixel = pScanline + col * image->numcomps;
- src = image->comps[channel].data[row * wid + col];
- src += image->comps[channel].sgnd ? 1 << (image->comps[channel].prec - 1) : 0;
- if (adjust_comps[channel] > 0) {
- *pPixel = 0;
- } else {
- *pPixel = (FX_BYTE)(src << -adjust_comps[channel]);
- }
- }
- }
- } else {
- for(row = 0; row < hei; row++) {
- pScanline = pChannel + row * pitch;
- for (col = 0; col < wid; col++) {
- pPixel = pScanline + col * image->numcomps;
- if (!image->comps[channel].data) continue;
- src = image->comps[channel].data[row * wid + col];
- src += image->comps[channel].sgnd ? 1 << (image->comps[channel].prec - 1) : 0;
- if (adjust_comps[channel] - 1 < 0) {
- *pPixel = (FX_BYTE)((src >> adjust_comps[channel]));
- } else {
- int tmpPixel = (src >> adjust_comps[channel]) + ((src >> (adjust_comps[channel] - 1)) % 2);
- if (tmpPixel > 255) {
- tmpPixel = 255;
- } else if (tmpPixel < 0) {
- tmpPixel = 0;
- }
- *pPixel = (FX_BYTE)tmpPixel;
- }
- }
- }
- }
- }
- } catch (...) {
- if (channel_bufs) {
- FX_Free(channel_bufs);
- }
- FX_Free(adjust_comps);
- return FALSE;
- }
- FX_Free(channel_bufs);
- FX_Free(adjust_comps);
- return TRUE;
-failed:
- FX_Free(channel_bufs);
- FX_Free(adjust_comps);
- return FALSE;
-}
-void initialize_transition_table();
-void initialize_significance_luts();
-void initialize_sign_lut();
-CCodec_JpxModule::CCodec_JpxModule()
-{
-}
-void* CCodec_JpxModule::CreateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size , FX_BOOL useColorSpace)
-{
- CJPX_Decoder* pDecoder = FX_NEW CJPX_Decoder;
- if (pDecoder == NULL) {
- return NULL;
- }
- pDecoder->m_useColorSpace = useColorSpace;
- if (!pDecoder->Init(src_buf, src_size)) {
- delete pDecoder;
- return NULL;
- }
- return pDecoder;
-}
-void CCodec_JpxModule::GetImageInfo(FX_LPVOID ctx, FX_DWORD& width, FX_DWORD& height,
- FX_DWORD& codestream_nComps, FX_DWORD& output_nComps)
-{
- CJPX_Decoder* pDecoder = (CJPX_Decoder*)ctx;
- pDecoder->GetInfo(width, height, codestream_nComps, output_nComps);
-}
-FX_BOOL CCodec_JpxModule::Decode(void* ctx, FX_LPBYTE dest_data, int pitch, FX_BOOL bTranslateColor, FX_LPBYTE offsets)
-{
- CJPX_Decoder* pDecoder = (CJPX_Decoder*)ctx;
- return pDecoder->Decode(dest_data, pitch, bTranslateColor, offsets);
-}
-void CCodec_JpxModule::DestroyDecoder(void* ctx)
-{
- CJPX_Decoder* pDecoder = (CJPX_Decoder*)ctx;
- delete pDecoder;
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxcodec/fx_codec.h"
+#include "codec_int.h"
+#include "../fx_libopenjpeg/libopenjpeg20/openjpeg.h"
+#include "../lcms2/include/fx_lcms2.h"
+static void fx_error_callback(const char *msg, void *client_data)
+{
+ (void)client_data;
+}
+static void fx_warning_callback(const char *msg, void *client_data)
+{
+ (void)client_data;
+}
+static void fx_info_callback(const char *msg, void *client_data)
+{
+ (void)client_data;
+}
+typedef struct {
+ const unsigned char* src_data;
+ int src_size;
+ int offset;
+} decodeData;
+static OPJ_SIZE_T opj_read_from_memory (void * p_buffer, OPJ_SIZE_T p_nb_bytes, decodeData* srcData)
+{
+ if(srcData == NULL || srcData->src_size == 0 || srcData->src_data == NULL || srcData->offset >= srcData->src_size) {
+ return -1;
+ }
+ OPJ_SIZE_T readlength = p_nb_bytes;
+ OPJ_SIZE_T bufferLength = (OPJ_SIZE_T)(srcData->src_size - srcData->offset);
+ if(bufferLength <= 0) {
+ return 0;
+ }
+ if(bufferLength <= p_nb_bytes) {
+ readlength = bufferLength;
+ }
+ memcpy(p_buffer, &(srcData->src_data[srcData->offset]), readlength);
+ srcData->offset += (int)readlength;
+ return readlength;
+}
+static OPJ_SIZE_T opj_write_from_memory (void * p_buffer, OPJ_SIZE_T p_nb_bytes, decodeData* srcData)
+{
+ if(srcData == NULL || srcData->src_size == 0 || srcData->src_data == NULL || srcData->offset >= srcData->src_size) {
+ return -1;
+ }
+ OPJ_SIZE_T writeLength = p_nb_bytes;
+ OPJ_SIZE_T bufferLength = (OPJ_SIZE_T)(srcData->src_size - srcData->offset);
+ if(bufferLength <= p_nb_bytes) {
+ writeLength = bufferLength;
+ }
+ memcpy((void*&)(srcData->src_data[srcData->offset]), p_buffer, writeLength);
+ srcData->offset += (int)writeLength;
+ return writeLength;
+}
+static OPJ_OFF_T opj_skip_from_memory (OPJ_OFF_T p_nb_bytes, decodeData* srcData)
+{
+ if(srcData == NULL || srcData->src_size == 0 || srcData->src_data == NULL || srcData->offset >= srcData->src_size) {
+ return -1;
+ }
+ OPJ_OFF_T postion = srcData->offset + p_nb_bytes;
+ if(postion < 0 ) {
+ postion = 0;
+ } else if (postion > srcData->src_size) {
+ }
+ srcData->offset = (int)postion;
+ return p_nb_bytes;
+}
+static OPJ_BOOL opj_seek_from_memory (OPJ_OFF_T p_nb_bytes, decodeData * srcData)
+{
+ if(srcData == NULL || srcData->src_size == 0 || srcData->src_data == NULL || srcData->offset >= srcData->src_size) {
+ return -1;
+ }
+ srcData->offset = (int)p_nb_bytes;
+ if(srcData->offset < 0) {
+ srcData->offset = 0;
+ } else if(srcData->offset > srcData->src_size) {
+ srcData->offset = srcData->src_size;
+ }
+ return OPJ_TRUE;
+}
+opj_stream_t* fx_opj_stream_create_memory_stream (decodeData* data, OPJ_SIZE_T p_size, OPJ_BOOL p_is_read_stream)
+{
+ opj_stream_t* l_stream = 00;
+ if (!data || ! data->src_data || data->src_size <= 0 ) {
+ return NULL;
+ }
+ l_stream = opj_stream_create(p_size, p_is_read_stream);
+ if (! l_stream) {
+ return NULL;
+ }
+ opj_stream_set_user_data_v3(l_stream, data, NULL);
+ opj_stream_set_user_data_length(l_stream, data->src_size);
+ opj_stream_set_read_function(l_stream, (opj_stream_read_fn) opj_read_from_memory);
+ opj_stream_set_write_function(l_stream, (opj_stream_write_fn) opj_write_from_memory);
+ opj_stream_set_skip_function(l_stream, (opj_stream_skip_fn) opj_skip_from_memory);
+ opj_stream_set_seek_function(l_stream, (opj_stream_seek_fn) opj_seek_from_memory);
+ return l_stream;
+}
+static void sycc_to_rgb(int offset, int upb, int y, int cb, int cr,
+ int *out_r, int *out_g, int *out_b)
+{
+ int r, g, b;
+ cb -= offset;
+ cr -= offset;
+ r = y + (int)(1.402 * (float)cr);
+ if(r < 0) {
+ r = 0;
+ } else if(r > upb) {
+ r = upb;
+ } *out_r = r;
+ g = y - (int)(0.344 * (float)cb + 0.714 * (float)cr);
+ if(g < 0) {
+ g = 0;
+ } else if(g > upb) {
+ g = upb;
+ } *out_g = g;
+ b = y + (int)(1.772 * (float)cb);
+ if(b < 0) {
+ b = 0;
+ } else if(b > upb) {
+ b = upb;
+ } *out_b = b;
+}
+static void sycc444_to_rgb(opj_image_t *img)
+{
+ int *d0, *d1, *d2, *r, *g, *b;
+ const int *y, *cb, *cr;
+ int maxw, maxh, max, i, offset, upb;
+ i = (int)img->comps[0].prec;
+ offset = 1 << (i - 1);
+ upb = (1 << i) - 1;
+ maxw = (int)img->comps[0].w;
+ maxh = (int)img->comps[0].h;
+ max = maxw * maxh;
+ y = img->comps[0].data;
+ cb = img->comps[1].data;
+ cr = img->comps[2].data;
+ d0 = r = FX_Alloc(int, (size_t)max);
+ d1 = g = FX_Alloc(int, (size_t)max);
+ d2 = b = FX_Alloc(int, (size_t)max);
+ for(i = 0; i < max; ++i) {
+ sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b);
+ ++y;
+ ++cb;
+ ++cr;
+ ++r;
+ ++g;
+ ++b;
+ }
+ FX_Free(img->comps[0].data);
+ img->comps[0].data = d0;
+ FX_Free(img->comps[1].data);
+ img->comps[1].data = d1;
+ FX_Free(img->comps[2].data);
+ img->comps[2].data = d2;
+}
+static void sycc422_to_rgb(opj_image_t *img)
+{
+ int *d0, *d1, *d2, *r, *g, *b;
+ const int *y, *cb, *cr;
+ int maxw, maxh, max, offset, upb;
+ int i, j;
+ i = (int)img->comps[0].prec;
+ offset = 1 << (i - 1);
+ upb = (1 << i) - 1;
+ maxw = (int)img->comps[0].w;
+ maxh = (int)img->comps[0].h;
+ max = maxw * maxh;
+ y = img->comps[0].data;
+ cb = img->comps[1].data;
+ cr = img->comps[2].data;
+ d0 = r = FX_Alloc(int, (size_t)max);
+ d1 = g = FX_Alloc(int, (size_t)max);
+ d2 = b = FX_Alloc(int, (size_t)max);
+ for(i = 0; i < maxh; ++i) {
+ for(j = 0; j < maxw; j += 2) {
+ sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b);
+ ++y;
+ ++r;
+ ++g;
+ ++b;
+ sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b);
+ ++y;
+ ++r;
+ ++g;
+ ++b;
+ ++cb;
+ ++cr;
+ }
+ }
+ FX_Free(img->comps[0].data);
+ img->comps[0].data = d0;
+ FX_Free(img->comps[1].data);
+ img->comps[1].data = d1;
+ FX_Free(img->comps[2].data);
+ img->comps[2].data = d2;
+ img->comps[1].w = maxw;
+ img->comps[1].h = maxh;
+ img->comps[2].w = maxw;
+ img->comps[2].h = maxh;
+ img->comps[1].w = (OPJ_UINT32)maxw;
+ img->comps[1].h = (OPJ_UINT32)maxh;
+ img->comps[2].w = (OPJ_UINT32)maxw;
+ img->comps[2].h = (OPJ_UINT32)maxh;
+ img->comps[1].dx = img->comps[0].dx;
+ img->comps[2].dx = img->comps[0].dx;
+ img->comps[1].dy = img->comps[0].dy;
+ img->comps[2].dy = img->comps[0].dy;
+}
+static void sycc420_to_rgb(opj_image_t *img)
+{
+ int *d0, *d1, *d2, *r, *g, *b, *nr, *ng, *nb;
+ const int *y, *cb, *cr, *ny;
+ int maxw, maxh, max, offset, upb;
+ int i, j;
+ i = (int)img->comps[0].prec;
+ offset = 1 << (i - 1);
+ upb = (1 << i) - 1;
+ maxw = (int)img->comps[0].w;
+ maxh = (int)img->comps[0].h;
+ max = maxw * maxh;
+ y = img->comps[0].data;
+ cb = img->comps[1].data;
+ cr = img->comps[2].data;
+ d0 = r = FX_Alloc(int, (size_t)max);
+ d1 = g = FX_Alloc(int, (size_t)max);
+ d2 = b = FX_Alloc(int, (size_t)max);
+ for(i = 0; i < maxh; i += 2) {
+ ny = y + maxw;
+ nr = r + maxw;
+ ng = g + maxw;
+ nb = b + maxw;
+ for(j = 0; j < maxw; j += 2) {
+ sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b);
+ ++y;
+ ++r;
+ ++g;
+ ++b;
+ sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b);
+ ++y;
+ ++r;
+ ++g;
+ ++b;
+ sycc_to_rgb(offset, upb, *ny, *cb, *cr, nr, ng, nb);
+ ++ny;
+ ++nr;
+ ++ng;
+ ++nb;
+ sycc_to_rgb(offset, upb, *ny, *cb, *cr, nr, ng, nb);
+ ++ny;
+ ++nr;
+ ++ng;
+ ++nb;
+ ++cb;
+ ++cr;
+ }
+ y += maxw;
+ r += maxw;
+ g += maxw;
+ b += maxw;
+ }
+ FX_Free(img->comps[0].data);
+ img->comps[0].data = d0;
+ FX_Free(img->comps[1].data);
+ img->comps[1].data = d1;
+ FX_Free(img->comps[2].data);
+ img->comps[2].data = d2;
+ img->comps[1].w = maxw;
+ img->comps[1].h = maxh;
+ img->comps[2].w = maxw;
+ img->comps[2].h = maxh;
+ img->comps[1].w = (OPJ_UINT32)maxw;
+ img->comps[1].h = (OPJ_UINT32)maxh;
+ img->comps[2].w = (OPJ_UINT32)maxw;
+ img->comps[2].h = (OPJ_UINT32)maxh;
+ img->comps[1].dx = img->comps[0].dx;
+ img->comps[2].dx = img->comps[0].dx;
+ img->comps[1].dy = img->comps[0].dy;
+ img->comps[2].dy = img->comps[0].dy;
+}
+void color_sycc_to_rgb(opj_image_t *img)
+{
+ if(img->numcomps < 3) {
+ img->color_space = OPJ_CLRSPC_GRAY;
+ return;
+ }
+ if((img->comps[0].dx == 1)
+ && (img->comps[1].dx == 2)
+ && (img->comps[2].dx == 2)
+ && (img->comps[0].dy == 1)
+ && (img->comps[1].dy == 2)
+ && (img->comps[2].dy == 2)) {
+ sycc420_to_rgb(img);
+ } else if((img->comps[0].dx == 1)
+ && (img->comps[1].dx == 2)
+ && (img->comps[2].dx == 2)
+ && (img->comps[0].dy == 1)
+ && (img->comps[1].dy == 1)
+ && (img->comps[2].dy == 1)) {
+ sycc422_to_rgb(img);
+ } else if((img->comps[0].dx == 1)
+ && (img->comps[1].dx == 1)
+ && (img->comps[2].dx == 1)
+ && (img->comps[0].dy == 1)
+ && (img->comps[1].dy == 1)
+ && (img->comps[2].dy == 1)) {
+ sycc444_to_rgb(img);
+ } else {
+ return;
+ }
+ img->color_space = OPJ_CLRSPC_SRGB;
+}
+void color_apply_icc_profile(opj_image_t *image)
+{
+ cmsHPROFILE in_prof, out_prof;
+ cmsHTRANSFORM transform;
+ cmsColorSpaceSignature in_space, out_space;
+ cmsUInt32Number intent, in_type, out_type, nr_samples;
+ int *r, *g, *b;
+ int prec, i, max, max_w, max_h;
+ OPJ_COLOR_SPACE oldspace;
+ in_prof =
+ cmsOpenProfileFromMem(image->icc_profile_buf, image->icc_profile_len);
+ if(in_prof == NULL) {
+ return;
+ }
+ in_space = cmsGetPCS(in_prof);
+ out_space = cmsGetColorSpace(in_prof);
+ intent = cmsGetHeaderRenderingIntent(in_prof);
+ max_w = (int)image->comps[0].w;
+ max_h = (int)image->comps[0].h;
+ prec = (int)image->comps[0].prec;
+ oldspace = image->color_space;
+ if(out_space == cmsSigRgbData) {
+ if( prec <= 8 ) {
+ in_type = TYPE_RGB_8;
+ out_type = TYPE_RGB_8;
+ } else {
+ in_type = TYPE_RGB_16;
+ out_type = TYPE_RGB_16;
+ }
+ out_prof = cmsCreate_sRGBProfile();
+ image->color_space = OPJ_CLRSPC_SRGB;
+ } else if(out_space == cmsSigGrayData) {
+ if( prec <= 8 ) {
+ in_type = TYPE_GRAY_8;
+ out_type = TYPE_RGB_8;
+ } else {
+ in_type = TYPE_GRAY_16;
+ out_type = TYPE_RGB_16;
+ }
+ out_prof = cmsCreate_sRGBProfile();
+ image->color_space = OPJ_CLRSPC_SRGB;
+ } else if(out_space == cmsSigYCbCrData) {
+ in_type = TYPE_YCbCr_16;
+ out_type = TYPE_RGB_16;
+ out_prof = cmsCreate_sRGBProfile();
+ image->color_space = OPJ_CLRSPC_SRGB;
+ } else {
+ return;
+ }
+ transform = cmsCreateTransform(in_prof, in_type,
+ out_prof, out_type, intent, 0);
+ cmsCloseProfile(in_prof);
+ cmsCloseProfile(out_prof);
+ if(transform == NULL) {
+ image->color_space = oldspace;
+ return;
+ }
+ if(image->numcomps > 2) {
+ if( prec <= 8 ) {
+ unsigned char *inbuf, *outbuf, *in, *out;
+ max = max_w * max_h;
+ nr_samples = (cmsUInt32Number)max * 3 * (cmsUInt32Number)sizeof(unsigned char);
+ in = inbuf = FX_Alloc(unsigned char, nr_samples);
+ out = outbuf = FX_Alloc(unsigned char, nr_samples);
+ r = image->comps[0].data;
+ g = image->comps[1].data;
+ b = image->comps[2].data;
+ for(i = 0; i < max; ++i) {
+ *in++ = (unsigned char) * r++;
+ *in++ = (unsigned char) * g++;
+ *in++ = (unsigned char) * b++;
+ }
+ cmsDoTransform(transform, inbuf, outbuf, (cmsUInt32Number)max);
+ r = image->comps[0].data;
+ g = image->comps[1].data;
+ b = image->comps[2].data;
+ for(i = 0; i < max; ++i) {
+ *r++ = (int) * out++;
+ *g++ = (int) * out++;
+ *b++ = (int) * out++;
+ }
+ FX_Free(inbuf);
+ FX_Free(outbuf);
+ } else {
+ unsigned short *inbuf, *outbuf, *in, *out;
+ max = max_w * max_h;
+ nr_samples = (cmsUInt32Number)max * 3 * (cmsUInt32Number)sizeof(unsigned short);
+ in = inbuf = FX_Alloc(unsigned short, nr_samples);
+ out = outbuf = FX_Alloc(unsigned short, nr_samples);
+ r = image->comps[0].data;
+ g = image->comps[1].data;
+ b = image->comps[2].data;
+ for(i = 0; i < max; ++i) {
+ *in++ = (unsigned short) * r++;
+ *in++ = (unsigned short) * g++;
+ *in++ = (unsigned short) * b++;
+ }
+ cmsDoTransform(transform, inbuf, outbuf, (cmsUInt32Number)max);
+ r = image->comps[0].data;
+ g = image->comps[1].data;
+ b = image->comps[2].data;
+ for(i = 0; i < max; ++i) {
+ *r++ = (int) * out++;
+ *g++ = (int) * out++;
+ *b++ = (int) * out++;
+ }
+ FX_Free(inbuf);
+ FX_Free(outbuf);
+ }
+ } else {
+ unsigned char *in, *inbuf, *out, *outbuf;
+ max = max_w * max_h;
+ nr_samples = (cmsUInt32Number)max * 3 * sizeof(unsigned char);
+ in = inbuf = FX_Alloc(unsigned char, nr_samples);
+ out = outbuf = FX_Alloc(unsigned char, nr_samples);
+ image->comps = (opj_image_comp_t*)
+ realloc(image->comps, (image->numcomps + 2) * sizeof(opj_image_comp_t));
+ if(image->numcomps == 2) {
+ image->comps[3] = image->comps[1];
+ }
+ image->comps[1] = image->comps[0];
+ image->comps[2] = image->comps[0];
+ image->comps[1].data = FX_Alloc(int, (size_t)max);
+ FXSYS_memset8(image->comps[1].data, 0, sizeof(int) * (size_t)max);
+ image->comps[2].data = FX_Alloc(int, (size_t)max);
+ FXSYS_memset8(image->comps[2].data, 0, sizeof(int) * (size_t)max);
+ image->numcomps += 2;
+ r = image->comps[0].data;
+ for(i = 0; i < max; ++i) {
+ *in++ = (unsigned char) * r++;
+ }
+ cmsDoTransform(transform, inbuf, outbuf, (cmsUInt32Number)max);
+ r = image->comps[0].data;
+ g = image->comps[1].data;
+ b = image->comps[2].data;
+ for(i = 0; i < max; ++i) {
+ *r++ = (int) * out++;
+ *g++ = (int) * out++;
+ *b++ = (int) * out++;
+ }
+ FX_Free(inbuf);
+ FX_Free(outbuf);
+ }
+ cmsDeleteTransform(transform);
+}
+void color_apply_conversion(opj_image_t *image)
+{
+ int *row;
+ int enumcs, numcomps;
+ numcomps = image->numcomps;
+ if(numcomps < 3) {
+ return;
+ }
+ row = (int*)image->icc_profile_buf;
+ enumcs = row[0];
+ if(enumcs == 14) {
+ int *L, *a, *b, *red, *green, *blue, *src0, *src1, *src2;
+ double rl, ol, ra, oa, rb, ob, prec0, prec1, prec2;
+ double minL, maxL, mina, maxa, minb, maxb;
+ unsigned int default_type, il;
+ unsigned int i, max, illu;
+ cmsHPROFILE in, out;
+ cmsHTRANSFORM transform;
+ cmsUInt16Number RGB[3];
+ cmsCIELab Lab;
+ illu = 0;
+ il = 0;
+ in = cmsCreateLab4Profile(NULL);
+ out = cmsCreate_sRGBProfile();
+ transform =
+ cmsCreateTransform(in, TYPE_Lab_DBL, out, TYPE_RGB_16,
+ INTENT_PERCEPTUAL, 0);
+ cmsCloseProfile(in);
+ cmsCloseProfile(out);
+ if(transform == NULL) {
+ return;
+ }
+ prec0 = (double)image->comps[0].prec;
+ prec1 = (double)image->comps[1].prec;
+ prec2 = (double)image->comps[2].prec;
+ default_type = row[1];
+ if(default_type == 0x44454600) {
+ rl = 100;
+ ra = 170;
+ rb = 200;
+ ol = 0;
+ oa = pow(2, prec1 - 1);
+ ob = pow(2, prec2 - 2) + pow(2, prec2 - 3);
+ } else {
+ rl = row[2];
+ ra = row[4];
+ rb = row[6];
+ ol = row[3];
+ oa = row[5];
+ ob = row[7];
+ }
+ L = src0 = image->comps[0].data;
+ a = src1 = image->comps[1].data;
+ b = src2 = image->comps[2].data;
+ max = image->comps[0].w * image->comps[0].h;
+ red = FX_Alloc(int, max);
+ image->comps[0].data = red;
+ green = FX_Alloc(int, max);
+ image->comps[1].data = green;
+ blue = FX_Alloc(int, max);
+ image->comps[2].data = blue;
+ minL = -(rl * ol) / (pow(2, prec0) - 1);
+ maxL = minL + rl;
+ mina = -(ra * oa) / (pow(2, prec1) - 1);
+ maxa = mina + ra;
+ minb = -(rb * ob) / (pow(2, prec2) - 1);
+ maxb = minb + rb;
+ for(i = 0; i < max; ++i) {
+ Lab.L = minL + (double)(*L) * (maxL - minL) / (pow(2, prec0) - 1);
+ ++L;
+ Lab.a = mina + (double)(*a) * (maxa - mina) / (pow(2, prec1) - 1);
+ ++a;
+ Lab.b = minb + (double)(*b) * (maxb - minb) / (pow(2, prec2) - 1);
+ ++b;
+ cmsDoTransform(transform, &Lab, RGB, 1);
+ *red++ = RGB[0];
+ *green++ = RGB[1];
+ *blue++ = RGB[2];
+ }
+ cmsDeleteTransform(transform);
+ FX_Free(src0);
+ FX_Free(src1);
+ FX_Free(src2);
+ image->color_space = OPJ_CLRSPC_SRGB;
+ image->comps[0].prec = 16;
+ image->comps[1].prec = 16;
+ image->comps[2].prec = 16;
+ return;
+ }
+}
+class CJPX_Decoder : public CFX_Object
+{
+public:
+ CJPX_Decoder();
+ ~CJPX_Decoder();
+ FX_BOOL Init(const unsigned char* src_data, int src_size);
+ void GetInfo(FX_DWORD& width, FX_DWORD& height, FX_DWORD& codestream_nComps, FX_DWORD& output_nComps);
+ FX_BOOL Decode(FX_LPBYTE dest_buf, int pitch, FX_BOOL bTranslateColor, FX_LPBYTE offsets);
+ FX_LPCBYTE m_SrcData;
+ int m_SrcSize;
+ opj_image_t *image;
+ opj_codec_t* l_codec;
+ opj_stream_t *l_stream;
+ FX_BOOL m_useColorSpace;
+};
+CJPX_Decoder::CJPX_Decoder(): image(NULL), l_codec(NULL), l_stream(NULL), m_useColorSpace(FALSE)
+{
+}
+CJPX_Decoder::~CJPX_Decoder()
+{
+ if(l_codec) {
+ opj_destroy_codec(l_codec);
+ }
+ if(l_stream) {
+ opj_stream_destroy(l_stream);
+ }
+ if(image) {
+ opj_image_destroy(image);
+ }
+}
+FX_BOOL CJPX_Decoder::Init(const unsigned char* src_data, int src_size)
+{
+ opj_dparameters_t parameters;
+ try {
+ image = NULL;
+ m_SrcData = src_data;
+ m_SrcSize = src_size;
+ decodeData srcData;
+ srcData.offset = 0;
+ srcData.src_size = src_size;
+ srcData.src_data = src_data;
+ l_stream = fx_opj_stream_create_memory_stream(&srcData, OPJ_J2K_STREAM_CHUNK_SIZE, 1);
+ if (l_stream == NULL) {
+ return FALSE;
+ }
+ opj_set_default_decoder_parameters(&parameters);
+ parameters.decod_format = 0;
+ parameters.cod_format = 3;
+ if(FXSYS_memcmp32(m_SrcData, "\x00\x00\x00\x0c\x6a\x50\x20\x20\x0d\x0a\x87\x0a", 12) == 0) {
+ l_codec = opj_create_decompress(OPJ_CODEC_JP2);
+ parameters.decod_format = 1;
+ } else {
+ l_codec = opj_create_decompress(OPJ_CODEC_J2K);
+ }
+ if(!l_codec) {
+ return FALSE;
+ }
+ opj_set_info_handler(l_codec, fx_info_callback, 00);
+ opj_set_warning_handler(l_codec, fx_warning_callback, 00);
+ opj_set_error_handler(l_codec, fx_error_callback, 00);
+ if ( !opj_setup_decoder(l_codec, &parameters) ) {
+ return FALSE;
+ }
+ if(! opj_read_header(l_stream, l_codec, &image)) {
+ image = NULL;
+ return FALSE;
+ }
+ if(this->m_useColorSpace) {
+ image->useColorSpace = 1;
+ } else {
+ image->useColorSpace = 0;
+ }
+ if (!parameters.nb_tile_to_decode) {
+ if (!opj_set_decode_area(l_codec, image, parameters.DA_x0,
+ parameters.DA_y0, parameters.DA_x1, parameters.DA_y1)) {
+ opj_image_destroy(image);
+ image = NULL;
+ return FALSE;
+ }
+ if (!(opj_decode(l_codec, l_stream, image) && opj_end_decompress(l_codec, l_stream))) {
+ opj_image_destroy(image);
+ image = NULL;
+ return FALSE;
+ }
+ } else {
+ if (!opj_get_decoded_tile(l_codec, l_stream, image, parameters.tile_index)) {
+ return FALSE;
+ }
+ }
+ opj_stream_destroy(l_stream);
+ l_stream = NULL;
+ if( image->color_space != OPJ_CLRSPC_SYCC
+ && image->numcomps == 3 && image->comps[0].dx == image->comps[0].dy
+ && image->comps[1].dx != 1 ) {
+ image->color_space = OPJ_CLRSPC_SYCC;
+ } else if (image->numcomps <= 2) {
+ image->color_space = OPJ_CLRSPC_GRAY;
+ }
+ if(image->color_space == OPJ_CLRSPC_SYCC) {
+ color_sycc_to_rgb(image);
+ }
+ if(image->icc_profile_buf && !image->useColorSpace) {
+ FX_Free(image->icc_profile_buf);
+ image->icc_profile_buf = NULL;
+ image->icc_profile_len = 0;
+ }
+ if(!image) {
+ return FALSE;
+ }
+ } catch (...) {
+ return FALSE;
+ }
+ return TRUE;
+}
+void CJPX_Decoder::GetInfo(FX_DWORD& width, FX_DWORD& height, FX_DWORD& codestream_nComps, FX_DWORD& output_nComps)
+{
+ width = (FX_DWORD)image->x1;
+ height = (FX_DWORD)image->y1;
+ output_nComps = codestream_nComps = (FX_DWORD)image->numcomps;
+}
+FX_BOOL CJPX_Decoder::Decode(FX_LPBYTE dest_buf, int pitch, FX_BOOL bTranslateColor, FX_LPBYTE offsets)
+{
+ FX_BYTE** channel_bufs;
+ int* adjust_comps;
+ int i, wid, hei, row, col, channel, src;
+ FX_BOOL flag;
+ FX_LPBYTE pChannel, pScanline, pPixel;
+ try {
+ if(image->comps[0].w != image->x1 || image->comps[0].h != image->y1) {
+ return FALSE;
+ }
+ if(pitch < (int)(image->comps[0].w * 8 * image->numcomps + 31) >> 5 << 2) {
+ return FALSE;
+ }
+ FXSYS_memset8(dest_buf, 0xff, image->y1 * pitch);
+ channel_bufs = FX_Alloc(FX_BYTE*, image->numcomps);
+ if (channel_bufs == NULL) {
+ return FALSE;
+ }
+ adjust_comps = FX_Alloc(int, image->numcomps);
+ if (adjust_comps == NULL) {
+ FX_Free(channel_bufs);
+ return FALSE;
+ }
+ flag = TRUE;
+ for (i = 0; i < (int)image->numcomps; i ++) {
+ channel_bufs[i] = dest_buf + offsets[i];
+ adjust_comps[i] = image->comps[i].prec - 8;
+ if(i > 0) {
+ if(image->comps[i].dx != image->comps[i - 1].dx
+ || image->comps[i].dy != image->comps[i - 1].dy
+ || image->comps[i].prec != image->comps[i - 1].prec) {
+ flag = FALSE;
+ goto failed;
+ }
+ }
+ }
+ wid = image->comps[0].w;
+ hei = image->comps[0].h;
+ for (channel = 0; channel < (int)image->numcomps; channel++) {
+ pChannel = channel_bufs[channel];
+ if(adjust_comps[channel] < 0) {
+ for(row = 0; row < hei; row++) {
+ pScanline = pChannel + row * pitch;
+ for (col = 0; col < wid; col++) {
+ pPixel = pScanline + col * image->numcomps;
+ src = image->comps[channel].data[row * wid + col];
+ src += image->comps[channel].sgnd ? 1 << (image->comps[channel].prec - 1) : 0;
+ if (adjust_comps[channel] > 0) {
+ *pPixel = 0;
+ } else {
+ *pPixel = (FX_BYTE)(src << -adjust_comps[channel]);
+ }
+ }
+ }
+ } else {
+ for(row = 0; row < hei; row++) {
+ pScanline = pChannel + row * pitch;
+ for (col = 0; col < wid; col++) {
+ pPixel = pScanline + col * image->numcomps;
+ if (!image->comps[channel].data) continue;
+ src = image->comps[channel].data[row * wid + col];
+ src += image->comps[channel].sgnd ? 1 << (image->comps[channel].prec - 1) : 0;
+ if (adjust_comps[channel] - 1 < 0) {
+ *pPixel = (FX_BYTE)((src >> adjust_comps[channel]));
+ } else {
+ int tmpPixel = (src >> adjust_comps[channel]) + ((src >> (adjust_comps[channel] - 1)) % 2);
+ if (tmpPixel > 255) {
+ tmpPixel = 255;
+ } else if (tmpPixel < 0) {
+ tmpPixel = 0;
+ }
+ *pPixel = (FX_BYTE)tmpPixel;
+ }
+ }
+ }
+ }
+ }
+ } catch (...) {
+ if (channel_bufs) {
+ FX_Free(channel_bufs);
+ }
+ FX_Free(adjust_comps);
+ return FALSE;
+ }
+ FX_Free(channel_bufs);
+ FX_Free(adjust_comps);
+ return TRUE;
+failed:
+ FX_Free(channel_bufs);
+ FX_Free(adjust_comps);
+ return FALSE;
+}
+void initialize_transition_table();
+void initialize_significance_luts();
+void initialize_sign_lut();
+CCodec_JpxModule::CCodec_JpxModule()
+{
+}
+void* CCodec_JpxModule::CreateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size , FX_BOOL useColorSpace)
+{
+ CJPX_Decoder* pDecoder = FX_NEW CJPX_Decoder;
+ if (pDecoder == NULL) {
+ return NULL;
+ }
+ pDecoder->m_useColorSpace = useColorSpace;
+ if (!pDecoder->Init(src_buf, src_size)) {
+ delete pDecoder;
+ return NULL;
+ }
+ return pDecoder;
+}
+void CCodec_JpxModule::GetImageInfo(FX_LPVOID ctx, FX_DWORD& width, FX_DWORD& height,
+ FX_DWORD& codestream_nComps, FX_DWORD& output_nComps)
+{
+ CJPX_Decoder* pDecoder = (CJPX_Decoder*)ctx;
+ pDecoder->GetInfo(width, height, codestream_nComps, output_nComps);
+}
+FX_BOOL CCodec_JpxModule::Decode(void* ctx, FX_LPBYTE dest_data, int pitch, FX_BOOL bTranslateColor, FX_LPBYTE offsets)
+{
+ CJPX_Decoder* pDecoder = (CJPX_Decoder*)ctx;
+ return pDecoder->Decode(dest_data, pitch, bTranslateColor, offsets);
+}
+void CCodec_JpxModule::DestroyDecoder(void* ctx)
+{
+ CJPX_Decoder* pDecoder = (CJPX_Decoder*)ctx;
+ delete pDecoder;
+}
diff --git a/core/src/fxcodec/jbig2/JBig2_ArithDecoder.h b/core/src/fxcodec/jbig2/JBig2_ArithDecoder.h
index 1664257411..214688d3b2 100644
--- a/core/src/fxcodec/jbig2/JBig2_ArithDecoder.h
+++ b/core/src/fxcodec/jbig2/JBig2_ArithDecoder.h
@@ -1,126 +1,126 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef _JBIG2_ARITHMETIC_DECODER_H_
-#define _JBIG2_ARITHMETIC_DECODER_H_
-#include "JBig2_Define.h"
-#include "JBig2_BitStream.h"
-#include "JBig2_ArithQe.h"
-typedef struct {
- unsigned int MPS;
- unsigned int I;
-} JBig2ArithCtx;
-class CJBig2_ArithDecoder : public CJBig2_Object
-{
-public:
-
- CJBig2_ArithDecoder(CJBig2_BitStream *pStream);
-
- ~CJBig2_ArithDecoder();
-
- int DECODE(JBig2ArithCtx *pCX);
-private:
-
- void INITDEC();
-
- void BYTEIN();
- unsigned char B;
- unsigned int C;
- unsigned int A;
- unsigned int CT;
- CJBig2_BitStream *m_pStream;
-};
-inline CJBig2_ArithDecoder::CJBig2_ArithDecoder(CJBig2_BitStream *pStream)
-{
- m_pStream = pStream;
- INITDEC();
-}
-inline CJBig2_ArithDecoder::~CJBig2_ArithDecoder()
-{
-}
-inline void CJBig2_ArithDecoder::INITDEC()
-{
- B = m_pStream->getCurByte_arith();
- C = (B ^ 0xff) << 16;;
- BYTEIN();
- C = C << 7;
- CT = CT - 7;
- A = 0x8000;
-}
-inline void CJBig2_ArithDecoder::BYTEIN()
-{
- unsigned char B1;
- if(B == 0xff) {
- B1 = m_pStream->getNextByte_arith();
- if(B1 > 0x8f) {
- CT = 8;
- } else {
- m_pStream->incByteIdx();
- B = B1;
- C = C + 0xfe00 - (B << 9);
- CT = 7;
- }
- } else {
- m_pStream->incByteIdx();
- B = m_pStream->getCurByte_arith();
- C = C + 0xff00 - (B << 8);
- CT = 8;
- }
-}
-inline int CJBig2_ArithDecoder::DECODE(JBig2ArithCtx *pCX)
-{
- int D;
- const JBig2ArithQe * qe = &QeTable[pCX->I];
- A = A - qe->Qe;
- if((C >> 16) < A) {
- if(A & 0x8000) {
- D = pCX->MPS;
- } else {
- if(A < qe->Qe) {
- D = 1 - pCX->MPS;
- if(qe->nSwitch == 1) {
- pCX->MPS = 1 - pCX->MPS;
- }
- pCX->I = qe->NLPS;
- } else {
- D = pCX->MPS;
- pCX->I = qe->NMPS;
- }
- do {
- if (CT == 0) {
- BYTEIN();
- }
- A <<= 1;
- C <<= 1;
- CT--;
- } while ((A & 0x8000) == 0);
- }
- } else {
- C -= A << 16;
- if(A < qe->Qe) {
- A = qe->Qe;
- D = pCX->MPS;
- pCX->I = qe->NMPS;
- } else {
- A = qe->Qe;
- D = 1 - pCX->MPS;
- if(qe->nSwitch == 1) {
- pCX->MPS = 1 - pCX->MPS;
- }
- pCX->I = qe->NLPS;
- }
- do {
- if (CT == 0) {
- BYTEIN();
- }
- A <<= 1;
- C <<= 1;
- CT--;
- } while ((A & 0x8000) == 0);
- }
- return D;
-}
-#endif
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _JBIG2_ARITHMETIC_DECODER_H_
+#define _JBIG2_ARITHMETIC_DECODER_H_
+#include "JBig2_Define.h"
+#include "JBig2_BitStream.h"
+#include "JBig2_ArithQe.h"
+typedef struct {
+ unsigned int MPS;
+ unsigned int I;
+} JBig2ArithCtx;
+class CJBig2_ArithDecoder : public CJBig2_Object
+{
+public:
+
+ CJBig2_ArithDecoder(CJBig2_BitStream *pStream);
+
+ ~CJBig2_ArithDecoder();
+
+ int DECODE(JBig2ArithCtx *pCX);
+private:
+
+ void INITDEC();
+
+ void BYTEIN();
+ unsigned char B;
+ unsigned int C;
+ unsigned int A;
+ unsigned int CT;
+ CJBig2_BitStream *m_pStream;
+};
+inline CJBig2_ArithDecoder::CJBig2_ArithDecoder(CJBig2_BitStream *pStream)
+{
+ m_pStream = pStream;
+ INITDEC();
+}
+inline CJBig2_ArithDecoder::~CJBig2_ArithDecoder()
+{
+}
+inline void CJBig2_ArithDecoder::INITDEC()
+{
+ B = m_pStream->getCurByte_arith();
+ C = (B ^ 0xff) << 16;;
+ BYTEIN();
+ C = C << 7;
+ CT = CT - 7;
+ A = 0x8000;
+}
+inline void CJBig2_ArithDecoder::BYTEIN()
+{
+ unsigned char B1;
+ if(B == 0xff) {
+ B1 = m_pStream->getNextByte_arith();
+ if(B1 > 0x8f) {
+ CT = 8;
+ } else {
+ m_pStream->incByteIdx();
+ B = B1;
+ C = C + 0xfe00 - (B << 9);
+ CT = 7;
+ }
+ } else {
+ m_pStream->incByteIdx();
+ B = m_pStream->getCurByte_arith();
+ C = C + 0xff00 - (B << 8);
+ CT = 8;
+ }
+}
+inline int CJBig2_ArithDecoder::DECODE(JBig2ArithCtx *pCX)
+{
+ int D;
+ const JBig2ArithQe * qe = &QeTable[pCX->I];
+ A = A - qe->Qe;
+ if((C >> 16) < A) {
+ if(A & 0x8000) {
+ D = pCX->MPS;
+ } else {
+ if(A < qe->Qe) {
+ D = 1 - pCX->MPS;
+ if(qe->nSwitch == 1) {
+ pCX->MPS = 1 - pCX->MPS;
+ }
+ pCX->I = qe->NLPS;
+ } else {
+ D = pCX->MPS;
+ pCX->I = qe->NMPS;
+ }
+ do {
+ if (CT == 0) {
+ BYTEIN();
+ }
+ A <<= 1;
+ C <<= 1;
+ CT--;
+ } while ((A & 0x8000) == 0);
+ }
+ } else {
+ C -= A << 16;
+ if(A < qe->Qe) {
+ A = qe->Qe;
+ D = pCX->MPS;
+ pCX->I = qe->NMPS;
+ } else {
+ A = qe->Qe;
+ D = 1 - pCX->MPS;
+ if(qe->nSwitch == 1) {
+ pCX->MPS = 1 - pCX->MPS;
+ }
+ pCX->I = qe->NLPS;
+ }
+ do {
+ if (CT == 0) {
+ BYTEIN();
+ }
+ A <<= 1;
+ C <<= 1;
+ CT--;
+ } while ((A & 0x8000) == 0);
+ }
+ return D;
+}
+#endif
diff --git a/core/src/fxcodec/jbig2/JBig2_ArithIntDecoder.cpp b/core/src/fxcodec/jbig2/JBig2_ArithIntDecoder.cpp
index bb4e0bba9f..1e115848a3 100644
--- a/core/src/fxcodec/jbig2/JBig2_ArithIntDecoder.cpp
+++ b/core/src/fxcodec/jbig2/JBig2_ArithIntDecoder.cpp
@@ -1,105 +1,105 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "JBig2_ArithIntDecoder.h"
-CJBig2_ArithIntDecoder::CJBig2_ArithIntDecoder()
-{
- IAx = (JBig2ArithCtx*)m_pModule->JBig2_Malloc2(sizeof(JBig2ArithCtx), 512);
- JBIG2_memset(IAx, 0, sizeof(JBig2ArithCtx) * 512);
-}
-CJBig2_ArithIntDecoder::~CJBig2_ArithIntDecoder()
-{
- m_pModule->JBig2_Free(IAx);
-}
-int CJBig2_ArithIntDecoder::decode(CJBig2_ArithDecoder *pArithDecoder, int *nResult)
-{
- int PREV, V;
- int S, D;
- int nNeedBits, nTemp, i;
- PREV = 1;
- S = pArithDecoder->DECODE(IAx + PREV);
- PREV = (PREV << 1) | S;
- D = pArithDecoder->DECODE(IAx + PREV);
- PREV = (PREV << 1) | D;
- if(D) {
- D = pArithDecoder->DECODE(IAx + PREV);
- PREV = (PREV << 1) | D;
- if(D) {
- D = pArithDecoder->DECODE(IAx + PREV);
- PREV = (PREV << 1) | D;
- if(D) {
- D = pArithDecoder->DECODE(IAx + PREV);
- PREV = (PREV << 1) | D;
- if(D) {
- D = pArithDecoder->DECODE(IAx + PREV);
- PREV = (PREV << 1) | D;
- if(D) {
- nNeedBits = 32;
- V = 4436;
- } else {
- nNeedBits = 12;
- V = 340;
- }
- } else {
- nNeedBits = 8;
- V = 84;
- }
- } else {
- nNeedBits = 6;
- V = 20;
- }
- } else {
- nNeedBits = 4;
- V = 4;
- }
- } else {
- nNeedBits = 2;
- V = 0;
- }
- nTemp = 0;
- for(i = 0; i < nNeedBits; i++) {
- D = pArithDecoder->DECODE(IAx + PREV);
- if(PREV < 256) {
- PREV = (PREV << 1) | D;
- } else {
- PREV = (((PREV << 1) | D) & 511) | 256;
- }
- nTemp = (nTemp << 1) | D;
- }
- V += nTemp;
- if(S == 1 && V > 0) {
- V = -V;
- }
- *nResult = V;
- if(S == 1 && V == 0) {
- return JBIG2_OOB;
- }
- return 0;
-}
-CJBig2_ArithIaidDecoder::CJBig2_ArithIaidDecoder(unsigned char SBSYMCODELENA)
-{
- SBSYMCODELEN = SBSYMCODELENA;
- IAID = (JBig2ArithCtx*)m_pModule->JBig2_Malloc2(sizeof(JBig2ArithCtx), (1 << SBSYMCODELEN));
- JBIG2_memset(IAID, 0, sizeof(JBig2ArithCtx) * (int)(1 << SBSYMCODELEN));
-}
-CJBig2_ArithIaidDecoder::~CJBig2_ArithIaidDecoder()
-{
- m_pModule->JBig2_Free(IAID);
-}
-int CJBig2_ArithIaidDecoder::decode(CJBig2_ArithDecoder *pArithDecoder, int *nResult)
-{
- int PREV;
- int D;
- int i;
- PREV = 1;
- for(i = 0; i < SBSYMCODELEN; i++) {
- D = pArithDecoder->DECODE(IAID + PREV);
- PREV = (PREV << 1) | D;
- }
- PREV = PREV - (1 << SBSYMCODELEN);
- *nResult = PREV;
- return 0;
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "JBig2_ArithIntDecoder.h"
+CJBig2_ArithIntDecoder::CJBig2_ArithIntDecoder()
+{
+ IAx = (JBig2ArithCtx*)m_pModule->JBig2_Malloc2(sizeof(JBig2ArithCtx), 512);
+ JBIG2_memset(IAx, 0, sizeof(JBig2ArithCtx) * 512);
+}
+CJBig2_ArithIntDecoder::~CJBig2_ArithIntDecoder()
+{
+ m_pModule->JBig2_Free(IAx);
+}
+int CJBig2_ArithIntDecoder::decode(CJBig2_ArithDecoder *pArithDecoder, int *nResult)
+{
+ int PREV, V;
+ int S, D;
+ int nNeedBits, nTemp, i;
+ PREV = 1;
+ S = pArithDecoder->DECODE(IAx + PREV);
+ PREV = (PREV << 1) | S;
+ D = pArithDecoder->DECODE(IAx + PREV);
+ PREV = (PREV << 1) | D;
+ if(D) {
+ D = pArithDecoder->DECODE(IAx + PREV);
+ PREV = (PREV << 1) | D;
+ if(D) {
+ D = pArithDecoder->DECODE(IAx + PREV);
+ PREV = (PREV << 1) | D;
+ if(D) {
+ D = pArithDecoder->DECODE(IAx + PREV);
+ PREV = (PREV << 1) | D;
+ if(D) {
+ D = pArithDecoder->DECODE(IAx + PREV);
+ PREV = (PREV << 1) | D;
+ if(D) {
+ nNeedBits = 32;
+ V = 4436;
+ } else {
+ nNeedBits = 12;
+ V = 340;
+ }
+ } else {
+ nNeedBits = 8;
+ V = 84;
+ }
+ } else {
+ nNeedBits = 6;
+ V = 20;
+ }
+ } else {
+ nNeedBits = 4;
+ V = 4;
+ }
+ } else {
+ nNeedBits = 2;
+ V = 0;
+ }
+ nTemp = 0;
+ for(i = 0; i < nNeedBits; i++) {
+ D = pArithDecoder->DECODE(IAx + PREV);
+ if(PREV < 256) {
+ PREV = (PREV << 1) | D;
+ } else {
+ PREV = (((PREV << 1) | D) & 511) | 256;
+ }
+ nTemp = (nTemp << 1) | D;
+ }
+ V += nTemp;
+ if(S == 1 && V > 0) {
+ V = -V;
+ }
+ *nResult = V;
+ if(S == 1 && V == 0) {
+ return JBIG2_OOB;
+ }
+ return 0;
+}
+CJBig2_ArithIaidDecoder::CJBig2_ArithIaidDecoder(unsigned char SBSYMCODELENA)
+{
+ SBSYMCODELEN = SBSYMCODELENA;
+ IAID = (JBig2ArithCtx*)m_pModule->JBig2_Malloc2(sizeof(JBig2ArithCtx), (1 << SBSYMCODELEN));
+ JBIG2_memset(IAID, 0, sizeof(JBig2ArithCtx) * (int)(1 << SBSYMCODELEN));
+}
+CJBig2_ArithIaidDecoder::~CJBig2_ArithIaidDecoder()
+{
+ m_pModule->JBig2_Free(IAID);
+}
+int CJBig2_ArithIaidDecoder::decode(CJBig2_ArithDecoder *pArithDecoder, int *nResult)
+{
+ int PREV;
+ int D;
+ int i;
+ PREV = 1;
+ for(i = 0; i < SBSYMCODELEN; i++) {
+ D = pArithDecoder->DECODE(IAID + PREV);
+ PREV = (PREV << 1) | D;
+ }
+ PREV = PREV - (1 << SBSYMCODELEN);
+ *nResult = PREV;
+ return 0;
+}
diff --git a/core/src/fxcodec/jbig2/JBig2_ArithIntDecoder.h b/core/src/fxcodec/jbig2/JBig2_ArithIntDecoder.h
index ad4656f54d..4ea104cf65 100644
--- a/core/src/fxcodec/jbig2/JBig2_ArithIntDecoder.h
+++ b/core/src/fxcodec/jbig2/JBig2_ArithIntDecoder.h
@@ -1,39 +1,39 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef _JBIG2_ARITH_INT_DECODER_H_
-#define _JBIG2_ARITH_INT_DECODER_H_
-#include "JBig2_Module.h"
-#include "JBig2_ArithDecoder.h"
-class CJBig2_ArithIntDecoder : public CJBig2_Object
-{
-public:
-
- CJBig2_ArithIntDecoder();
-
- ~CJBig2_ArithIntDecoder();
-
- int decode(CJBig2_ArithDecoder *pArithDecoder, int *nResult);
-private:
-
- JBig2ArithCtx *IAx;
-};
-class CJBig2_ArithIaidDecoder : public CJBig2_Object
-{
-public:
-
- CJBig2_ArithIaidDecoder(unsigned char SBSYMCODELENA);
-
- ~CJBig2_ArithIaidDecoder();
-
- int decode(CJBig2_ArithDecoder *pArithDecoder, int *nResult);
-private:
-
- JBig2ArithCtx *IAID;
-
- unsigned char SBSYMCODELEN;
-};
-#endif
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _JBIG2_ARITH_INT_DECODER_H_
+#define _JBIG2_ARITH_INT_DECODER_H_
+#include "JBig2_Module.h"
+#include "JBig2_ArithDecoder.h"
+class CJBig2_ArithIntDecoder : public CJBig2_Object
+{
+public:
+
+ CJBig2_ArithIntDecoder();
+
+ ~CJBig2_ArithIntDecoder();
+
+ int decode(CJBig2_ArithDecoder *pArithDecoder, int *nResult);
+private:
+
+ JBig2ArithCtx *IAx;
+};
+class CJBig2_ArithIaidDecoder : public CJBig2_Object
+{
+public:
+
+ CJBig2_ArithIaidDecoder(unsigned char SBSYMCODELENA);
+
+ ~CJBig2_ArithIaidDecoder();
+
+ int decode(CJBig2_ArithDecoder *pArithDecoder, int *nResult);
+private:
+
+ JBig2ArithCtx *IAID;
+
+ unsigned char SBSYMCODELEN;
+};
+#endif
diff --git a/core/src/fxcodec/jbig2/JBig2_ArithQe.h b/core/src/fxcodec/jbig2/JBig2_ArithQe.h
index 17bc18aa03..60fbbc9ac3 100644
--- a/core/src/fxcodec/jbig2/JBig2_ArithQe.h
+++ b/core/src/fxcodec/jbig2/JBig2_ArithQe.h
@@ -1,64 +1,64 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef _JBIG2_ARITH_QE_H_
-#define _JBIG2_ARITH_QE_H_
-typedef struct {
- unsigned int Qe;
- unsigned int NMPS;
- unsigned int NLPS;
- unsigned int nSwitch;
-} JBig2ArithQe;
-const JBig2ArithQe QeTable[] = {
- { 0x5601, 1, 1, 1 },
- { 0x3401, 2, 6, 0 },
- { 0x1801, 3, 9, 0 },
- { 0x0AC1, 4, 12, 0 },
- { 0x0521, 5, 29, 0 },
- { 0x0221, 38, 33, 0 },
- { 0x5601, 7, 6, 1 },
- { 0x5401, 8, 14, 0 },
- { 0x4801, 9, 14, 0 },
- { 0x3801, 10, 14, 0 },
- { 0x3001, 11, 17, 0 },
- { 0x2401, 12, 18, 0 },
- { 0x1C01, 13, 20, 0 },
- { 0x1601, 29, 21, 0 },
- { 0x5601, 15, 14, 1 },
- { 0x5401, 16, 14, 0 },
- { 0x5101, 17, 15, 0 },
- { 0x4801, 18, 16, 0 },
- { 0x3801, 19, 17, 0 },
- { 0x3401, 20, 18, 0 },
- { 0x3001, 21, 19, 0 },
- { 0x2801, 22, 19, 0 },
- { 0x2401, 23, 20, 0 },
- { 0x2201, 24, 21, 0 },
- { 0x1C01, 25, 22, 0 },
- { 0x1801, 26, 23, 0 },
- { 0x1601, 27, 24, 0 },
- { 0x1401, 28, 25, 0 },
- { 0x1201, 29, 26, 0 },
- { 0x1101, 30, 27, 0 },
- { 0x0AC1, 31, 28, 0 },
- { 0x09C1, 32, 29, 0 },
- { 0x08A1, 33, 30, 0 },
- { 0x0521, 34, 31, 0 },
- { 0x0441, 35, 32, 0 },
- { 0x02A1, 36, 33, 0 },
- { 0x0221, 37, 34, 0 },
- { 0x0141, 38, 35, 0 },
- { 0x0111, 39, 36, 0 },
- { 0x0085, 40, 37, 0 },
- { 0x0049, 41, 38, 0 },
- { 0x0025, 42, 39, 0 },
- { 0x0015, 43, 40, 0 },
- { 0x0009, 44, 41, 0 },
- { 0x0005, 45, 42, 0 },
- { 0x0001, 45, 43, 0 },
- { 0x5601, 46, 46, 0 }
-};
-#endif
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _JBIG2_ARITH_QE_H_
+#define _JBIG2_ARITH_QE_H_
+typedef struct {
+ unsigned int Qe;
+ unsigned int NMPS;
+ unsigned int NLPS;
+ unsigned int nSwitch;
+} JBig2ArithQe;
+const JBig2ArithQe QeTable[] = {
+ { 0x5601, 1, 1, 1 },
+ { 0x3401, 2, 6, 0 },
+ { 0x1801, 3, 9, 0 },
+ { 0x0AC1, 4, 12, 0 },
+ { 0x0521, 5, 29, 0 },
+ { 0x0221, 38, 33, 0 },
+ { 0x5601, 7, 6, 1 },
+ { 0x5401, 8, 14, 0 },
+ { 0x4801, 9, 14, 0 },
+ { 0x3801, 10, 14, 0 },
+ { 0x3001, 11, 17, 0 },
+ { 0x2401, 12, 18, 0 },
+ { 0x1C01, 13, 20, 0 },
+ { 0x1601, 29, 21, 0 },
+ { 0x5601, 15, 14, 1 },
+ { 0x5401, 16, 14, 0 },
+ { 0x5101, 17, 15, 0 },
+ { 0x4801, 18, 16, 0 },
+ { 0x3801, 19, 17, 0 },
+ { 0x3401, 20, 18, 0 },
+ { 0x3001, 21, 19, 0 },
+ { 0x2801, 22, 19, 0 },
+ { 0x2401, 23, 20, 0 },
+ { 0x2201, 24, 21, 0 },
+ { 0x1C01, 25, 22, 0 },
+ { 0x1801, 26, 23, 0 },
+ { 0x1601, 27, 24, 0 },
+ { 0x1401, 28, 25, 0 },
+ { 0x1201, 29, 26, 0 },
+ { 0x1101, 30, 27, 0 },
+ { 0x0AC1, 31, 28, 0 },
+ { 0x09C1, 32, 29, 0 },
+ { 0x08A1, 33, 30, 0 },
+ { 0x0521, 34, 31, 0 },
+ { 0x0441, 35, 32, 0 },
+ { 0x02A1, 36, 33, 0 },
+ { 0x0221, 37, 34, 0 },
+ { 0x0141, 38, 35, 0 },
+ { 0x0111, 39, 36, 0 },
+ { 0x0085, 40, 37, 0 },
+ { 0x0049, 41, 38, 0 },
+ { 0x0025, 42, 39, 0 },
+ { 0x0015, 43, 40, 0 },
+ { 0x0009, 44, 41, 0 },
+ { 0x0005, 45, 42, 0 },
+ { 0x0001, 45, 43, 0 },
+ { 0x5601, 46, 46, 0 }
+};
+#endif
diff --git a/core/src/fxcodec/jbig2/JBig2_BitStream.h b/core/src/fxcodec/jbig2/JBig2_BitStream.h
index 8ed473a150..9d5d29468f 100644
--- a/core/src/fxcodec/jbig2/JBig2_BitStream.h
+++ b/core/src/fxcodec/jbig2/JBig2_BitStream.h
@@ -1,316 +1,316 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef _JBIG2_BIT_STREAM_H_
-#define _JBIG2_BIT_STREAM_H_
-#include "JBig2_Define.h"
-class CJBig2_BitStream : public CJBig2_Object
-{
-public:
-
- CJBig2_BitStream(FX_BYTE *pBuffer, FX_DWORD dwLength);
-
- CJBig2_BitStream(CJBig2_BitStream &bs);
-
- ~CJBig2_BitStream();
-
- FX_INT32 readNBits(FX_DWORD nBits, FX_DWORD *dwResult);
-
- FX_INT32 readNBits(FX_DWORD nBits, FX_INT32 *nResult);
-
- FX_INT32 read1Bit(FX_DWORD *dwResult);
-
- FX_INT32 read1Bit(FX_BOOL *bResult);
-
- FX_INT32 read1Byte(FX_BYTE *cResult);
-
- FX_INT32 readInteger(FX_DWORD *dwResult);
-
- FX_INT32 readShortInteger(FX_WORD *wResult);
-
- void alignByte();
-
- void align4Byte();
-
- FX_BYTE getAt(FX_DWORD dwOffset);
-
- FX_BYTE getCurByte();
-
- FX_BYTE getNextByte();
-
- FX_INT32 incByteIdx();
-
- FX_BYTE getCurByte_arith();
-
- FX_BYTE getNextByte_arith();
-
- FX_DWORD getOffset();
-
- void setOffset(FX_DWORD dwOffset);
-
- FX_DWORD getBitPos();
-
- void setBitPos(FX_DWORD dwBitPos);
-
- FX_BYTE *getBuf();
-
- FX_DWORD getLength()
- {
- return m_dwLength;
- }
-
- FX_BYTE *getPointer();
-
- void offset(FX_DWORD dwOffset);
-
- FX_DWORD getByteLeft();
-private:
-
- FX_BYTE *m_pBuf;
-
- FX_DWORD m_dwLength;
-
- FX_DWORD m_dwByteIdx;
-
- FX_DWORD m_dwBitIdx;
-};
-inline CJBig2_BitStream::CJBig2_BitStream(FX_BYTE *pBuffer, FX_DWORD dwLength)
-{
- m_pBuf = pBuffer;
- m_dwLength = dwLength;
- m_dwByteIdx = 0;
- m_dwBitIdx = 0;
- if (m_dwLength > 256 * 1024 * 1024) {
- m_dwLength = 0;
- m_pBuf = NULL;
- }
-}
-inline CJBig2_BitStream::CJBig2_BitStream(CJBig2_BitStream &bs)
-{
- m_pBuf = bs.m_pBuf;
- m_dwLength = bs.m_dwLength;
- m_dwByteIdx = bs.m_dwByteIdx;
- m_dwBitIdx = bs.m_dwBitIdx;
-}
-inline CJBig2_BitStream::~CJBig2_BitStream()
-{
-}
-inline FX_INT32 CJBig2_BitStream::readNBits(FX_DWORD dwBits, FX_DWORD *dwResult)
-{
- FX_DWORD dwTemp = (m_dwByteIdx << 3) + m_dwBitIdx;
- if(dwTemp <= (m_dwLength << 3)) {
- *dwResult = 0;
- if(dwTemp + dwBits <= (m_dwLength << 3)) {
- dwTemp = dwBits;
- } else {
- dwTemp = (m_dwLength << 3) - dwTemp;
- }
- while(dwTemp > 0) {
- *dwResult = (*dwResult << 1) | ((m_pBuf[m_dwByteIdx] >> (7 - m_dwBitIdx)) & 0x01);
- if(m_dwBitIdx == 7) {
- m_dwByteIdx ++;
- m_dwBitIdx = 0;
- } else {
- m_dwBitIdx ++;
- }
- dwTemp --;
- }
- return 0;
- } else {
- return -1;
- }
-}
-inline FX_INT32 CJBig2_BitStream::readNBits(FX_DWORD dwBits, FX_INT32 *nResult)
-{
- FX_DWORD dwTemp = (m_dwByteIdx << 3) + m_dwBitIdx;
- if(dwTemp <= (m_dwLength << 3)) {
- *nResult = 0;
- if(dwTemp + dwBits <= (m_dwLength << 3)) {
- dwTemp = dwBits;
- } else {
- dwTemp = (m_dwLength << 3) - dwTemp;
- }
- while(dwTemp > 0) {
- *nResult = (*nResult << 1) | ((m_pBuf[m_dwByteIdx] >> (7 - m_dwBitIdx)) & 0x01);
- if(m_dwBitIdx == 7) {
- m_dwByteIdx ++;
- m_dwBitIdx = 0;
- } else {
- m_dwBitIdx ++;
- }
- dwTemp --;
- }
- return 0;
- } else {
- return -1;
- }
-}
-
-inline FX_INT32 CJBig2_BitStream::read1Bit(FX_DWORD *dwResult)
-{
- if(m_dwByteIdx < m_dwLength) {
- *dwResult = (m_pBuf[m_dwByteIdx] >> (7 - m_dwBitIdx)) & 0x01;
- if(m_dwBitIdx == 7) {
- m_dwByteIdx ++;
- m_dwBitIdx = 0;
- } else {
- m_dwBitIdx ++;
- }
- return 0;
- } else {
- return -1;
- }
-}
-
-inline FX_INT32 CJBig2_BitStream::read1Bit(FX_BOOL *bResult)
-{
- if(m_dwByteIdx < m_dwLength) {
- *bResult = (m_pBuf[m_dwByteIdx] >> (7 - m_dwBitIdx)) & 0x01;
- if(m_dwBitIdx == 7) {
- m_dwByteIdx ++;
- m_dwBitIdx = 0;
- } else {
- m_dwBitIdx ++;
- }
- return 0;
- } else {
- return -1;
- }
-}
-inline FX_INT32 CJBig2_BitStream::read1Byte(FX_BYTE *cResult)
-{
- if(m_dwByteIdx < m_dwLength) {
- *cResult = m_pBuf[m_dwByteIdx];
- m_dwByteIdx ++;
- return 0;
- } else {
- return -1;
- }
-}
-
-inline FX_INT32 CJBig2_BitStream::readInteger(FX_DWORD *dwResult)
-{
- if(m_dwByteIdx + 3 < m_dwLength) {
- *dwResult = (m_pBuf[m_dwByteIdx] << 24) | (m_pBuf[m_dwByteIdx + 1] << 16)
- | (m_pBuf[m_dwByteIdx + 2] << 8) | m_pBuf[m_dwByteIdx + 3];
- m_dwByteIdx += 4;
- return 0;
- } else {
- return -1;
- }
-}
-
-inline FX_INT32 CJBig2_BitStream::readShortInteger(FX_WORD *dwResult)
-{
- if(m_dwByteIdx + 1 < m_dwLength) {
- *dwResult = (m_pBuf[m_dwByteIdx] << 8) | m_pBuf[m_dwByteIdx + 1];
- m_dwByteIdx += 2;
- return 0;
- } else {
- return -1;
- }
-}
-inline void CJBig2_BitStream::alignByte()
-{
- if(m_dwBitIdx != 0) {
- m_dwByteIdx ++;
- m_dwBitIdx = 0;
- }
-}
-inline void CJBig2_BitStream::align4Byte()
-{
- if(m_dwBitIdx != 0) {
- m_dwByteIdx ++;
- m_dwBitIdx = 0;
- }
- m_dwByteIdx = (m_dwByteIdx + 3) & -4;
-}
-inline FX_BYTE CJBig2_BitStream::getAt(FX_DWORD dwOffset)
-{
- if(dwOffset < m_dwLength) {
- return m_pBuf[dwOffset];
- } else {
- return 0;
- }
-}
-inline FX_BYTE CJBig2_BitStream::getCurByte()
-{
- if(m_dwByteIdx < m_dwLength) {
- return m_pBuf[m_dwByteIdx];
- } else {
- return 0;
- }
-}
-inline FX_BYTE CJBig2_BitStream::getNextByte()
-{
- if(m_dwByteIdx + 1 < m_dwLength) {
- return m_pBuf[m_dwByteIdx + 1];
- } else {
- return 0;
- }
-}
-inline FX_INT32 CJBig2_BitStream::incByteIdx()
-{
- if(m_dwByteIdx < m_dwLength) {
- m_dwByteIdx ++;
- return 0;
- } else {
- return -1;
- }
-}
-inline FX_BYTE CJBig2_BitStream::getCurByte_arith()
-{
- if(m_dwByteIdx < m_dwLength) {
- return m_pBuf[m_dwByteIdx];
- } else {
- return 0xff;
- }
-}
-inline FX_BYTE CJBig2_BitStream::getNextByte_arith()
-{
- if(m_dwByteIdx + 1 < m_dwLength) {
- return m_pBuf[m_dwByteIdx + 1];
- } else {
- return 0xff;
- }
-}
-inline FX_DWORD CJBig2_BitStream::getOffset()
-{
- return m_dwByteIdx;
-}
-inline void CJBig2_BitStream::setOffset(FX_DWORD dwOffset)
-{
- if (dwOffset > m_dwLength) {
- dwOffset = m_dwLength;
- }
- m_dwByteIdx = dwOffset;
-}
-inline FX_DWORD CJBig2_BitStream::getBitPos()
-{
- return (m_dwByteIdx << 3) + m_dwBitIdx;
-}
-inline void CJBig2_BitStream::setBitPos(FX_DWORD dwBitPos)
-{
- m_dwByteIdx = dwBitPos >> 3;
- m_dwBitIdx = dwBitPos & 7;
-}
-inline FX_BYTE *CJBig2_BitStream::getBuf()
-{
- return m_pBuf;
-}
-inline FX_BYTE *CJBig2_BitStream::getPointer()
-{
- return m_pBuf + m_dwByteIdx;
-}
-inline void CJBig2_BitStream::offset(FX_DWORD dwOffset)
-{
- m_dwByteIdx += dwOffset;
-}
-inline FX_DWORD CJBig2_BitStream::getByteLeft()
-{
- return m_dwLength - m_dwByteIdx;
-}
-#endif
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _JBIG2_BIT_STREAM_H_
+#define _JBIG2_BIT_STREAM_H_
+#include "JBig2_Define.h"
+class CJBig2_BitStream : public CJBig2_Object
+{
+public:
+
+ CJBig2_BitStream(FX_BYTE *pBuffer, FX_DWORD dwLength);
+
+ CJBig2_BitStream(CJBig2_BitStream &bs);
+
+ ~CJBig2_BitStream();
+
+ FX_INT32 readNBits(FX_DWORD nBits, FX_DWORD *dwResult);
+
+ FX_INT32 readNBits(FX_DWORD nBits, FX_INT32 *nResult);
+
+ FX_INT32 read1Bit(FX_DWORD *dwResult);
+
+ FX_INT32 read1Bit(FX_BOOL *bResult);
+
+ FX_INT32 read1Byte(FX_BYTE *cResult);
+
+ FX_INT32 readInteger(FX_DWORD *dwResult);
+
+ FX_INT32 readShortInteger(FX_WORD *wResult);
+
+ void alignByte();
+
+ void align4Byte();
+
+ FX_BYTE getAt(FX_DWORD dwOffset);
+
+ FX_BYTE getCurByte();
+
+ FX_BYTE getNextByte();
+
+ FX_INT32 incByteIdx();
+
+ FX_BYTE getCurByte_arith();
+
+ FX_BYTE getNextByte_arith();
+
+ FX_DWORD getOffset();
+
+ void setOffset(FX_DWORD dwOffset);
+
+ FX_DWORD getBitPos();
+
+ void setBitPos(FX_DWORD dwBitPos);
+
+ FX_BYTE *getBuf();
+
+ FX_DWORD getLength()
+ {
+ return m_dwLength;
+ }
+
+ FX_BYTE *getPointer();
+
+ void offset(FX_DWORD dwOffset);
+
+ FX_DWORD getByteLeft();
+private:
+
+ FX_BYTE *m_pBuf;
+
+ FX_DWORD m_dwLength;
+
+ FX_DWORD m_dwByteIdx;
+
+ FX_DWORD m_dwBitIdx;
+};
+inline CJBig2_BitStream::CJBig2_BitStream(FX_BYTE *pBuffer, FX_DWORD dwLength)
+{
+ m_pBuf = pBuffer;
+ m_dwLength = dwLength;
+ m_dwByteIdx = 0;
+ m_dwBitIdx = 0;
+ if (m_dwLength > 256 * 1024 * 1024) {
+ m_dwLength = 0;
+ m_pBuf = NULL;
+ }
+}
+inline CJBig2_BitStream::CJBig2_BitStream(CJBig2_BitStream &bs)
+{
+ m_pBuf = bs.m_pBuf;
+ m_dwLength = bs.m_dwLength;
+ m_dwByteIdx = bs.m_dwByteIdx;
+ m_dwBitIdx = bs.m_dwBitIdx;
+}
+inline CJBig2_BitStream::~CJBig2_BitStream()
+{
+}
+inline FX_INT32 CJBig2_BitStream::readNBits(FX_DWORD dwBits, FX_DWORD *dwResult)
+{
+ FX_DWORD dwTemp = (m_dwByteIdx << 3) + m_dwBitIdx;
+ if(dwTemp <= (m_dwLength << 3)) {
+ *dwResult = 0;
+ if(dwTemp + dwBits <= (m_dwLength << 3)) {
+ dwTemp = dwBits;
+ } else {
+ dwTemp = (m_dwLength << 3) - dwTemp;
+ }
+ while(dwTemp > 0) {
+ *dwResult = (*dwResult << 1) | ((m_pBuf[m_dwByteIdx] >> (7 - m_dwBitIdx)) & 0x01);
+ if(m_dwBitIdx == 7) {
+ m_dwByteIdx ++;
+ m_dwBitIdx = 0;
+ } else {
+ m_dwBitIdx ++;
+ }
+ dwTemp --;
+ }
+ return 0;
+ } else {
+ return -1;
+ }
+}
+inline FX_INT32 CJBig2_BitStream::readNBits(FX_DWORD dwBits, FX_INT32 *nResult)
+{
+ FX_DWORD dwTemp = (m_dwByteIdx << 3) + m_dwBitIdx;
+ if(dwTemp <= (m_dwLength << 3)) {
+ *nResult = 0;
+ if(dwTemp + dwBits <= (m_dwLength << 3)) {
+ dwTemp = dwBits;
+ } else {
+ dwTemp = (m_dwLength << 3) - dwTemp;
+ }
+ while(dwTemp > 0) {
+ *nResult = (*nResult << 1) | ((m_pBuf[m_dwByteIdx] >> (7 - m_dwBitIdx)) & 0x01);
+ if(m_dwBitIdx == 7) {
+ m_dwByteIdx ++;
+ m_dwBitIdx = 0;
+ } else {
+ m_dwBitIdx ++;
+ }
+ dwTemp --;
+ }
+ return 0;
+ } else {
+ return -1;
+ }
+}
+
+inline FX_INT32 CJBig2_BitStream::read1Bit(FX_DWORD *dwResult)
+{
+ if(m_dwByteIdx < m_dwLength) {
+ *dwResult = (m_pBuf[m_dwByteIdx] >> (7 - m_dwBitIdx)) & 0x01;
+ if(m_dwBitIdx == 7) {
+ m_dwByteIdx ++;
+ m_dwBitIdx = 0;
+ } else {
+ m_dwBitIdx ++;
+ }
+ return 0;
+ } else {
+ return -1;
+ }
+}
+
+inline FX_INT32 CJBig2_BitStream::read1Bit(FX_BOOL *bResult)
+{
+ if(m_dwByteIdx < m_dwLength) {
+ *bResult = (m_pBuf[m_dwByteIdx] >> (7 - m_dwBitIdx)) & 0x01;
+ if(m_dwBitIdx == 7) {
+ m_dwByteIdx ++;
+ m_dwBitIdx = 0;
+ } else {
+ m_dwBitIdx ++;
+ }
+ return 0;
+ } else {
+ return -1;
+ }
+}
+inline FX_INT32 CJBig2_BitStream::read1Byte(FX_BYTE *cResult)
+{
+ if(m_dwByteIdx < m_dwLength) {
+ *cResult = m_pBuf[m_dwByteIdx];
+ m_dwByteIdx ++;
+ return 0;
+ } else {
+ return -1;
+ }
+}
+
+inline FX_INT32 CJBig2_BitStream::readInteger(FX_DWORD *dwResult)
+{
+ if(m_dwByteIdx + 3 < m_dwLength) {
+ *dwResult = (m_pBuf[m_dwByteIdx] << 24) | (m_pBuf[m_dwByteIdx + 1] << 16)
+ | (m_pBuf[m_dwByteIdx + 2] << 8) | m_pBuf[m_dwByteIdx + 3];
+ m_dwByteIdx += 4;
+ return 0;
+ } else {
+ return -1;
+ }
+}
+
+inline FX_INT32 CJBig2_BitStream::readShortInteger(FX_WORD *dwResult)
+{
+ if(m_dwByteIdx + 1 < m_dwLength) {
+ *dwResult = (m_pBuf[m_dwByteIdx] << 8) | m_pBuf[m_dwByteIdx + 1];
+ m_dwByteIdx += 2;
+ return 0;
+ } else {
+ return -1;
+ }
+}
+inline void CJBig2_BitStream::alignByte()
+{
+ if(m_dwBitIdx != 0) {
+ m_dwByteIdx ++;
+ m_dwBitIdx = 0;
+ }
+}
+inline void CJBig2_BitStream::align4Byte()
+{
+ if(m_dwBitIdx != 0) {
+ m_dwByteIdx ++;
+ m_dwBitIdx = 0;
+ }
+ m_dwByteIdx = (m_dwByteIdx + 3) & -4;
+}
+inline FX_BYTE CJBig2_BitStream::getAt(FX_DWORD dwOffset)
+{
+ if(dwOffset < m_dwLength) {
+ return m_pBuf[dwOffset];
+ } else {
+ return 0;
+ }
+}
+inline FX_BYTE CJBig2_BitStream::getCurByte()
+{
+ if(m_dwByteIdx < m_dwLength) {
+ return m_pBuf[m_dwByteIdx];
+ } else {
+ return 0;
+ }
+}
+inline FX_BYTE CJBig2_BitStream::getNextByte()
+{
+ if(m_dwByteIdx + 1 < m_dwLength) {
+ return m_pBuf[m_dwByteIdx + 1];
+ } else {
+ return 0;
+ }
+}
+inline FX_INT32 CJBig2_BitStream::incByteIdx()
+{
+ if(m_dwByteIdx < m_dwLength) {
+ m_dwByteIdx ++;
+ return 0;
+ } else {
+ return -1;
+ }
+}
+inline FX_BYTE CJBig2_BitStream::getCurByte_arith()
+{
+ if(m_dwByteIdx < m_dwLength) {
+ return m_pBuf[m_dwByteIdx];
+ } else {
+ return 0xff;
+ }
+}
+inline FX_BYTE CJBig2_BitStream::getNextByte_arith()
+{
+ if(m_dwByteIdx + 1 < m_dwLength) {
+ return m_pBuf[m_dwByteIdx + 1];
+ } else {
+ return 0xff;
+ }
+}
+inline FX_DWORD CJBig2_BitStream::getOffset()
+{
+ return m_dwByteIdx;
+}
+inline void CJBig2_BitStream::setOffset(FX_DWORD dwOffset)
+{
+ if (dwOffset > m_dwLength) {
+ dwOffset = m_dwLength;
+ }
+ m_dwByteIdx = dwOffset;
+}
+inline FX_DWORD CJBig2_BitStream::getBitPos()
+{
+ return (m_dwByteIdx << 3) + m_dwBitIdx;
+}
+inline void CJBig2_BitStream::setBitPos(FX_DWORD dwBitPos)
+{
+ m_dwByteIdx = dwBitPos >> 3;
+ m_dwBitIdx = dwBitPos & 7;
+}
+inline FX_BYTE *CJBig2_BitStream::getBuf()
+{
+ return m_pBuf;
+}
+inline FX_BYTE *CJBig2_BitStream::getPointer()
+{
+ return m_pBuf + m_dwByteIdx;
+}
+inline void CJBig2_BitStream::offset(FX_DWORD dwOffset)
+{
+ m_dwByteIdx += dwOffset;
+}
+inline FX_DWORD CJBig2_BitStream::getByteLeft()
+{
+ return m_dwLength - m_dwByteIdx;
+}
+#endif
diff --git a/core/src/fxcodec/jbig2/JBig2_Context.cpp b/core/src/fxcodec/jbig2/JBig2_Context.cpp
index 856c0c3bda..543f9abf63 100644
--- a/core/src/fxcodec/jbig2/JBig2_Context.cpp
+++ b/core/src/fxcodec/jbig2/JBig2_Context.cpp
@@ -1,1812 +1,1812 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "JBig2_Context.h"
-void OutputBitmap(CJBig2_Image* pImage)
-{
- if(!pImage) {
- return;
- }
-}
-CJBig2_Context *CJBig2_Context::CreateContext(CJBig2_Module *pModule, FX_BYTE *pGlobalData, FX_DWORD dwGlobalLength,
- FX_BYTE *pData, FX_DWORD dwLength, FX_INT32 nStreamType, IFX_Pause* pPause)
-{
- return new(pModule) CJBig2_Context(pGlobalData, dwGlobalLength, pData, dwLength, nStreamType, pPause);
-}
-void CJBig2_Context::DestroyContext(CJBig2_Context *pContext)
-{
- if(pContext) {
- delete pContext;
- }
-}
-CJBig2_Context::CJBig2_Context(FX_BYTE *pGlobalData, FX_DWORD dwGlobalLength,
- FX_BYTE *pData, FX_DWORD dwLength, FX_INT32 nStreamType, IFX_Pause* pPause)
-{
- if(pGlobalData && (dwGlobalLength > 0)) {
- JBIG2_ALLOC(m_pGlobalContext, CJBig2_Context(NULL, 0, pGlobalData, dwGlobalLength,
- JBIG2_EMBED_STREAM, pPause));
- } else {
- m_pGlobalContext = NULL;
- }
- JBIG2_ALLOC(m_pStream, CJBig2_BitStream(pData, dwLength));
- m_nStreamType = nStreamType;
- m_nState = JBIG2_OUT_OF_PAGE;
- JBIG2_ALLOC(m_pSegmentList, CJBig2_List<CJBig2_Segment>);
- JBIG2_ALLOC(m_pPageInfoList, CJBig2_List<JBig2PageInfo>(1));
- m_pPage = NULL;
- m_bBufSpecified = FALSE;
- m_pPause = pPause;
- m_nSegmentDecoded = 0;
- m_PauseStep = 10;
- m_pArithDecoder = NULL;
- m_pGRD = NULL;
- m_gbContext = NULL;
- m_pSegment = NULL;
- m_dwOffset = 0;
- m_ProcessiveStatus = FXCODEC_STATUS_FRAME_READY;
-}
-CJBig2_Context::~CJBig2_Context()
-{
- if(m_pArithDecoder) {
- delete m_pArithDecoder;
- }
- m_pArithDecoder = NULL;
- if(m_pGRD) {
- delete m_pGRD;
- }
- m_pGRD = NULL;
- if(m_gbContext) {
- delete m_gbContext;
- }
- m_gbContext = NULL;
- if(m_pGlobalContext) {
- delete m_pGlobalContext;
- }
- m_pGlobalContext = NULL;
- if(m_pPageInfoList) {
- delete m_pPageInfoList;
- }
- m_pPageInfoList = NULL;
- if(m_bBufSpecified && m_pPage) {
- delete m_pPage;
- }
- m_pPage = NULL;
- if(m_pStream) {
- delete m_pStream;
- }
- m_pStream = NULL;
- if(m_pSegmentList) {
- delete m_pSegmentList;
- }
- m_pSegmentList = NULL;
-}
-FX_INT32 CJBig2_Context::decodeFile(IFX_Pause* pPause)
-{
- FX_BYTE cFlags;
- FX_DWORD dwTemp;
- const FX_BYTE fileID[] = {0x97, 0x4A, 0x42, 0x32, 0x0D, 0x0A, 0x1A, 0x0A};
- FX_INT32 nRet;
- if(m_pStream->getByteLeft() < 8) {
- m_pModule->JBig2_Error("file header too short.");
- nRet = JBIG2_ERROR_TOO_SHORT;
- goto failed;
- }
- if(JBIG2_memcmp(m_pStream->getPointer(), fileID, 8) != 0) {
- m_pModule->JBig2_Error("not jbig2 file");
- nRet = JBIG2_ERROR_FILE_FORMAT;
- goto failed;
- }
- m_pStream->offset(8);
- if(m_pStream->read1Byte(&cFlags) != 0) {
- m_pModule->JBig2_Error("file header too short.");
- nRet = JBIG2_ERROR_TOO_SHORT;
- goto failed;
- }
- if(!(cFlags & 0x02)) {
- if(m_pStream->readInteger(&dwTemp) != 0) {
- m_pModule->JBig2_Error("file header too short.");
- nRet = JBIG2_ERROR_TOO_SHORT;
- goto failed;
- }
- if(dwTemp > 0) {
- delete m_pPageInfoList;
- JBIG2_ALLOC(m_pPageInfoList, CJBig2_List<JBig2PageInfo>(dwTemp));
- }
- }
- if(cFlags & 0x01) {
- m_nStreamType = JBIG2_SQUENTIAL_STREAM;
- return decode_SquentialOrgnazation(pPause);
- } else {
- m_nStreamType = JBIG2_RANDOM_STREAM;
- return decode_RandomOrgnazation_FirstPage(pPause);
- }
-failed:
- return nRet;
-}
-FX_INT32 CJBig2_Context::decode_SquentialOrgnazation(IFX_Pause* pPause)
-{
- FX_INT32 nRet;
- if(m_pStream->getByteLeft() > 0) {
- while(m_pStream->getByteLeft() >= JBIG2_MIN_SEGMENT_SIZE) {
- if(m_pSegment == NULL) {
- JBIG2_ALLOC(m_pSegment, CJBig2_Segment());
- nRet = parseSegmentHeader(m_pSegment);
- if(nRet != JBIG2_SUCCESS) {
- delete m_pSegment;
- m_pSegment = NULL;
- return nRet;
- }
- m_dwOffset = m_pStream->getOffset();
- }
- nRet = parseSegmentData(m_pSegment, pPause);
- if(m_ProcessiveStatus == FXCODEC_STATUS_DECODE_TOBECONTINUE) {
- m_ProcessiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;
- m_PauseStep = 2;
- return JBIG2_SUCCESS;
- }
- if((nRet == JBIG2_END_OF_PAGE) || (nRet == JBIG2_END_OF_FILE)) {
- delete m_pSegment;
- m_pSegment = NULL;
- break;
- } else if(nRet != JBIG2_SUCCESS) {
- delete m_pSegment;
- m_pSegment = NULL;
- return nRet;
- }
- m_pSegmentList->addItem(m_pSegment);
- if(m_pSegment->m_dwData_length != 0xffffffff) {
- m_dwOffset = m_dwOffset + m_pSegment->m_dwData_length;
- m_pStream->setOffset(m_dwOffset);
- } else {
- m_pStream->offset(4);
- }
- OutputBitmap(m_pPage);
- m_pSegment = NULL;
- if(m_pStream->getByteLeft() > 0 && m_pPage && pPause && pPause->NeedToPauseNow()) {
- m_ProcessiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;
- m_PauseStep = 2;
- return JBIG2_SUCCESS;
- }
- }
- } else {
- return JBIG2_END_OF_FILE;
- }
- return JBIG2_SUCCESS;
-}
-FX_INT32 CJBig2_Context::decode_EmbedOrgnazation(IFX_Pause* pPause)
-{
- return decode_SquentialOrgnazation(pPause);
-}
-FX_INT32 CJBig2_Context::decode_RandomOrgnazation_FirstPage(IFX_Pause* pPause)
-{
- CJBig2_Segment *pSegment;
- FX_INT32 nRet;
- while(m_pStream->getByteLeft() > JBIG2_MIN_SEGMENT_SIZE) {
- JBIG2_ALLOC(pSegment, CJBig2_Segment());
- nRet = parseSegmentHeader(pSegment);
- if(nRet != JBIG2_SUCCESS) {
- delete pSegment;
- return nRet;
- } else if(pSegment->m_cFlags.s.type == 51) {
- delete pSegment;
- break;
- }
- m_pSegmentList->addItem(pSegment);
- if(pPause && m_pPause && pPause->NeedToPauseNow()) {
- m_PauseStep = 3;
- m_ProcessiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;
- return JBIG2_SUCCESS;
- }
- }
- m_nSegmentDecoded = 0;
- return decode_RandomOrgnazation(pPause);
-}
-FX_INT32 CJBig2_Context::decode_RandomOrgnazation(IFX_Pause* pPause)
-{
- FX_INT32 nRet;
- for(; m_nSegmentDecoded < m_pSegmentList->getLength(); m_nSegmentDecoded++) {
- nRet = parseSegmentData(m_pSegmentList->getAt(m_nSegmentDecoded), pPause);
- if((nRet == JBIG2_END_OF_PAGE) || (nRet == JBIG2_END_OF_FILE)) {
- break;
- } else if(nRet != JBIG2_SUCCESS) {
- return nRet;
- }
- if(m_pPage && pPause && pPause->NeedToPauseNow()) {
- m_PauseStep = 4;
- m_ProcessiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;
- return JBIG2_SUCCESS;
- }
- }
- return JBIG2_SUCCESS;
-}
-FX_INT32 CJBig2_Context::getFirstPage(FX_BYTE *pBuf, FX_INT32 width, FX_INT32 height, FX_INT32 stride, IFX_Pause* pPause)
-{
- FX_INT32 nRet = 0;
- if(m_pGlobalContext) {
- nRet = m_pGlobalContext->decode_EmbedOrgnazation(pPause);
- if(nRet != JBIG2_SUCCESS) {
- m_ProcessiveStatus = FXCODEC_STATUS_ERROR;
- return nRet;
- }
- }
- m_bFirstPage = TRUE;
- m_PauseStep = 0;
- if(m_pPage) {
- delete m_pPage;
- }
- JBIG2_ALLOC(m_pPage, CJBig2_Image(width, height, stride, pBuf));
- m_bBufSpecified = TRUE;
- if(m_pPage && pPause && pPause->NeedToPauseNow()) {
- m_PauseStep = 1;
- m_ProcessiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;
- return nRet;
- }
- int ret = Continue(pPause);
- return ret;
-}
-FX_INT32 CJBig2_Context::Continue(IFX_Pause* pPause)
-{
- m_ProcessiveStatus = FXCODEC_STATUS_DECODE_READY;
- FX_INT32 nRet;
- if(m_PauseStep <= 1) {
- switch(m_nStreamType) {
- case JBIG2_FILE_STREAM:
- nRet = decodeFile(pPause);
- break;
- case JBIG2_SQUENTIAL_STREAM:
- nRet = decode_SquentialOrgnazation(pPause);
- break;
- case JBIG2_RANDOM_STREAM:
- if(m_bFirstPage) {
- nRet = decode_RandomOrgnazation_FirstPage(pPause);
- } else {
- nRet = decode_RandomOrgnazation(pPause);
- }
- break;
- case JBIG2_EMBED_STREAM:
- nRet = decode_EmbedOrgnazation(pPause);
- break;
- default:
- m_ProcessiveStatus = FXCODEC_STATUS_ERROR;
- return JBIG2_ERROR_STREAM_TYPE;
- }
- } else if(m_PauseStep == 2) {
- nRet = decode_SquentialOrgnazation(pPause);
- } else if(m_PauseStep == 3) {
- nRet = decode_RandomOrgnazation_FirstPage(pPause);
- } else if(m_PauseStep == 4) {
- nRet = decode_RandomOrgnazation(pPause);
- } else if(m_PauseStep == 5) {
- m_ProcessiveStatus = FXCODEC_STATUS_DECODE_FINISH;
- return JBIG2_SUCCESS;
- }
- if(m_ProcessiveStatus == FXCODEC_STATUS_DECODE_TOBECONTINUE) {
- return nRet;
- }
- m_PauseStep = 5;
- if(!m_bBufSpecified && nRet == JBIG2_SUCCESS) {
- m_ProcessiveStatus = FXCODEC_STATUS_DECODE_FINISH;
- return JBIG2_SUCCESS;
- }
- if(nRet == JBIG2_SUCCESS) {
- m_ProcessiveStatus = FXCODEC_STATUS_DECODE_FINISH;
- } else {
- m_ProcessiveStatus = FXCODEC_STATUS_ERROR;
- }
- return nRet;
-}
-FX_INT32 CJBig2_Context::getNextPage(FX_BYTE *pBuf, FX_INT32 width, FX_INT32 height, FX_INT32 stride, IFX_Pause* pPause)
-{
- FX_INT32 nRet = JBIG2_ERROR_STREAM_TYPE;
- m_bFirstPage = FALSE;
- m_PauseStep = 0;
- if(m_pPage) {
- delete m_pPage;
- }
- JBIG2_ALLOC(m_pPage, CJBig2_Image(width, height, stride, pBuf));
- m_bBufSpecified = TRUE;
- if(m_pPage && pPause && pPause->NeedToPauseNow()) {
- m_PauseStep = 1;
- m_ProcessiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;
- return nRet;
- }
- return Continue(pPause);
- switch(m_nStreamType) {
- case JBIG2_FILE_STREAM:
- nRet = decodeFile(pPause);
- break;
- case JBIG2_SQUENTIAL_STREAM:
- nRet = decode_SquentialOrgnazation(pPause);
- break;
- case JBIG2_RANDOM_STREAM:
- nRet = decode_RandomOrgnazation(pPause);
- break;
- case JBIG2_EMBED_STREAM:
- nRet = decode_EmbedOrgnazation(pPause);
- break;
- default:
- return JBIG2_ERROR_STREAM_TYPE;
- }
- return nRet;
-}
-FX_INT32 CJBig2_Context::getFirstPage(CJBig2_Image **image, IFX_Pause* pPause)
-{
- FX_INT32 nRet;
- m_bFirstPage = TRUE;
- m_PauseStep = 0;
- if(m_pGlobalContext) {
- nRet = m_pGlobalContext->decode_EmbedOrgnazation(pPause);
- if(nRet != JBIG2_SUCCESS) {
- return nRet;
- }
- }
- m_bBufSpecified = FALSE;
- return Continue(pPause);
-}
-FX_INT32 CJBig2_Context::getNextPage(CJBig2_Image **image, IFX_Pause* pPause)
-{
- FX_INT32 nRet;
- m_bBufSpecified = FALSE;
- m_bFirstPage = FALSE;
- m_PauseStep = 0;
- switch(m_nStreamType) {
- case JBIG2_FILE_STREAM:
- nRet = decodeFile(pPause);
- break;
- case JBIG2_SQUENTIAL_STREAM:
- nRet = decode_SquentialOrgnazation(pPause);
- break;
- case JBIG2_RANDOM_STREAM:
- nRet = decode_RandomOrgnazation(pPause);
- break;
- case JBIG2_EMBED_STREAM:
- nRet = decode_EmbedOrgnazation(pPause);
- break;
- default:
- return JBIG2_ERROR_STREAM_TYPE;
- }
- if(nRet == JBIG2_SUCCESS) {
- *image = m_pPage;
- m_pPage = NULL;
- return JBIG2_SUCCESS;
- }
- return nRet;
-}
-CJBig2_Segment *CJBig2_Context::findSegmentByNumber(FX_DWORD dwNumber)
-{
- CJBig2_Segment *pSeg;
- FX_INT32 i;
- if(m_pGlobalContext) {
- pSeg = m_pGlobalContext->findSegmentByNumber(dwNumber);
- if(pSeg) {
- return pSeg;
- }
- }
- for(i = 0; i < m_pSegmentList->getLength(); i++) {
- pSeg = m_pSegmentList->getAt(i);
- if(pSeg->m_dwNumber == dwNumber) {
- return pSeg;
- }
- }
- return NULL;
-}
-CJBig2_Segment *CJBig2_Context::findReferredSegmentByTypeAndIndex(CJBig2_Segment *pSegment,
- FX_BYTE cType, FX_INT32 nIndex)
-{
- CJBig2_Segment *pSeg;
- FX_INT32 i, count;
- count = 0;
- for(i = 0; i < pSegment->m_nReferred_to_segment_count; i++) {
- pSeg = findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[i]);
- if(pSeg && pSeg->m_cFlags.s.type == cType) {
- if(count == nIndex) {
- return pSeg;
- } else {
- count ++;
- }
- }
- }
- return NULL;
-}
-FX_INT32 CJBig2_Context::parseSegmentHeader(CJBig2_Segment *pSegment)
-{
- FX_BYTE cSSize, cPSize;
- FX_BYTE cTemp;
- FX_WORD wTemp;
- FX_DWORD dwTemp;
- if((m_pStream->readInteger(&pSegment->m_dwNumber) != 0)
- || (m_pStream->read1Byte(&pSegment->m_cFlags.c) != 0)) {
- goto failed;
- }
- cTemp = m_pStream->getCurByte();
- if((cTemp >> 5) == 7) {
- if(m_pStream->readInteger((FX_DWORD*)&pSegment->m_nReferred_to_segment_count) != 0) {
- goto failed;
- }
- pSegment->m_nReferred_to_segment_count &= 0x1fffffff;
- if (pSegment->m_nReferred_to_segment_count > JBIG2_MAX_REFERRED_SEGMENT_COUNT) {
- m_pModule->JBig2_Error("Too many referred segments.");
- return JBIG2_ERROR_LIMIT;
- }
- dwTemp = 5 + 4 + (pSegment->m_nReferred_to_segment_count + 1) / 8;
- } else {
- if(m_pStream->read1Byte(&cTemp) != 0) {
- goto failed;
- }
- pSegment->m_nReferred_to_segment_count = cTemp >> 5;
- dwTemp = 5 + 1;
- }
- cSSize = pSegment->m_dwNumber > 65536 ? 4 : pSegment->m_dwNumber > 256 ? 2 : 1;
- cPSize = pSegment->m_cFlags.s.page_association_size ? 4 : 1;
- if(pSegment->m_nReferred_to_segment_count) {
- pSegment->m_pReferred_to_segment_numbers = (FX_DWORD*)m_pModule->JBig2_Malloc2(
- sizeof(FX_DWORD), pSegment->m_nReferred_to_segment_count);
- for(FX_INT32 i = 0; i < pSegment->m_nReferred_to_segment_count; i++) {
- switch(cSSize) {
- case 1:
- if(m_pStream->read1Byte(&cTemp) != 0) {
- goto failed;
- }
- pSegment->m_pReferred_to_segment_numbers[i] = cTemp;
- break;
- case 2:
- if(m_pStream->readShortInteger(&wTemp) != 0) {
- goto failed;
- }
- pSegment->m_pReferred_to_segment_numbers[i] = wTemp;
- break;
- case 4:
- if(m_pStream->readInteger(&dwTemp) != 0) {
- goto failed;
- }
- pSegment->m_pReferred_to_segment_numbers[i] = dwTemp;
- break;
- }
- if (pSegment->m_pReferred_to_segment_numbers[i] >= pSegment->m_dwNumber) {
- m_pModule->JBig2_Error("The referred segment number is greater than this segment number.");
- goto failed;
- }
- }
- }
- if(cPSize == 1) {
- if(m_pStream->read1Byte(&cTemp) != 0) {
- goto failed;
- }
- pSegment->m_dwPage_association = cTemp;
- } else {
- if(m_pStream->readInteger(&pSegment->m_dwPage_association) != 0) {
- goto failed;
- }
- }
- if(m_pStream->readInteger(&pSegment->m_dwData_length) != 0) {
- goto failed;
- }
- pSegment->m_pData = m_pStream->getPointer();
- pSegment->m_State = JBIG2_SEGMENT_DATA_UNPARSED;
- return JBIG2_SUCCESS;
-failed:
- m_pModule->JBig2_Error("header too short.");
- return JBIG2_ERROR_TOO_SHORT;
-}
-FX_INT32 CJBig2_Context::parseSegmentData(CJBig2_Segment *pSegment, IFX_Pause* pPause)
-{
- FX_INT32 ret = ProcessiveParseSegmentData(pSegment, pPause);
- while(m_ProcessiveStatus == FXCODEC_STATUS_DECODE_TOBECONTINUE && m_pStream->getByteLeft() > 0) {
- ret = ProcessiveParseSegmentData(pSegment, pPause);
- }
- return ret;
-}
-FX_INT32 CJBig2_Context::ProcessiveParseSegmentData(CJBig2_Segment *pSegment, IFX_Pause* pPause)
-{
- switch(pSegment->m_cFlags.s.type) {
- case 0:
- return parseSymbolDict(pSegment, pPause);
- case 4:
- case 6:
- case 7:
- if(m_nState == JBIG2_OUT_OF_PAGE) {
- goto failed2;
- } else {
- return parseTextRegion(pSegment);
- }
- case 16:
- return parsePatternDict(pSegment, pPause);
- case 20:
- case 22:
- case 23:
- if(m_nState == JBIG2_OUT_OF_PAGE) {
- goto failed2;
- } else {
- return parseHalftoneRegion(pSegment, pPause);
- }
- case 36:
- case 38:
- case 39:
- if(m_nState == JBIG2_OUT_OF_PAGE) {
- goto failed2;
- } else {
- return parseGenericRegion(pSegment, pPause);
- }
- case 40:
- case 42:
- case 43:
- if(m_nState == JBIG2_OUT_OF_PAGE) {
- goto failed2;
- } else {
- return parseGenericRefinementRegion(pSegment);
- }
- case 48: {
- FX_WORD wTemp;
- JBig2PageInfo *pPageInfo;
- JBIG2_ALLOC(pPageInfo, JBig2PageInfo);
- if((m_pStream->readInteger(&pPageInfo->m_dwWidth) != 0)
- || (m_pStream->readInteger(&pPageInfo->m_dwHeight) != 0)
- || (m_pStream->readInteger(&pPageInfo->m_dwResolutionX) != 0)
- || (m_pStream->readInteger(&pPageInfo->m_dwResolutionY) != 0)
- || (m_pStream->read1Byte(&pPageInfo->m_cFlags) != 0)
- || (m_pStream->readShortInteger(&wTemp) != 0)) {
- delete pPageInfo;
- goto failed1;
- }
- pPageInfo->m_bIsStriped = ((wTemp >> 15) & 1) ? 1 : 0;
- pPageInfo->m_wMaxStripeSize = wTemp & 0x7fff;
- if((pPageInfo->m_dwHeight == 0xffffffff) && (pPageInfo->m_bIsStriped != 1)) {
- m_pModule->JBig2_Warn("page height = 0xffffffff buf stripe field is 0");
- pPageInfo->m_bIsStriped = 1;
- }
- if(!m_bBufSpecified) {
- if(m_pPage) {
- delete m_pPage;
- }
- if(pPageInfo->m_dwHeight == 0xffffffff) {
- JBIG2_ALLOC(m_pPage, CJBig2_Image(pPageInfo->m_dwWidth, pPageInfo->m_wMaxStripeSize));
- } else {
- JBIG2_ALLOC(m_pPage, CJBig2_Image(pPageInfo->m_dwWidth, pPageInfo->m_dwHeight));
- }
- }
- m_pPage->fill((pPageInfo->m_cFlags & 4) ? 1 : 0);
- m_pPageInfoList->addItem(pPageInfo);
- m_nState = JBIG2_IN_PAGE;
- }
- break;
- case 49:
- m_nState = JBIG2_OUT_OF_PAGE;
- return JBIG2_END_OF_PAGE;
- break;
- case 50:
- m_pStream->offset(pSegment->m_dwData_length);
- break;
- case 51:
- return JBIG2_END_OF_FILE;
- case 52:
- m_pStream->offset(pSegment->m_dwData_length);
- break;
- case 53:
- return parseTable(pSegment);
- case 62:
- m_pStream->offset(pSegment->m_dwData_length);
- break;
- default:
- break;
- }
- return JBIG2_SUCCESS;
-failed1:
- m_pModule->JBig2_Error("segment data too short.");
- return JBIG2_ERROR_TOO_SHORT;
-failed2:
- m_pModule->JBig2_Error("segment syntax error.");
- return JBIG2_ERROR_FETAL;
-}
-FX_INT32 CJBig2_Context::parseSymbolDict(CJBig2_Segment *pSegment, IFX_Pause* pPause)
-{
- FX_DWORD dwTemp;
- FX_WORD wFlags;
- FX_BYTE cSDHUFFDH, cSDHUFFDW, cSDHUFFBMSIZE, cSDHUFFAGGINST;
- CJBig2_HuffmanTable *Table_B1 = NULL, *Table_B2 = NULL, *Table_B3 = NULL, *Table_B4 = NULL, *Table_B5 = NULL;
- FX_INT32 i, nIndex, nRet;
- CJBig2_Segment *pSeg = NULL, *pLRSeg = NULL;
- FX_BOOL bUsed;
- CJBig2_Image ** SDINSYMS = NULL;
- CJBig2_SDDProc *pSymbolDictDecoder;
- JBig2ArithCtx *gbContext = NULL, *grContext = NULL;
- CJBig2_ArithDecoder *pArithDecoder;
- JBIG2_ALLOC(pSymbolDictDecoder, CJBig2_SDDProc());
- if(m_pStream->readShortInteger(&wFlags) != 0) {
- m_pModule->JBig2_Error("symbol dictionary segment : data header too short.");
- nRet = JBIG2_ERROR_TOO_SHORT;
- goto failed;
- }
- pSymbolDictDecoder->SDHUFF = wFlags & 0x0001;
- pSymbolDictDecoder->SDREFAGG = (wFlags >> 1) & 0x0001;
- pSymbolDictDecoder->SDTEMPLATE = (wFlags >> 10) & 0x0003;
- pSymbolDictDecoder->SDRTEMPLATE = (wFlags >> 12) & 0x0003;
- cSDHUFFDH = (wFlags >> 2) & 0x0003;
- cSDHUFFDW = (wFlags >> 4) & 0x0003;
- cSDHUFFBMSIZE = (wFlags >> 6) & 0x0001;
- cSDHUFFAGGINST = (wFlags >> 7) & 0x0001;
- if(pSymbolDictDecoder->SDHUFF == 0) {
- if(pSymbolDictDecoder->SDTEMPLATE == 0) {
- dwTemp = 8;
- } else {
- dwTemp = 2;
- }
- for(i = 0; i < (FX_INT32)dwTemp; i++) {
- if(m_pStream->read1Byte((FX_BYTE*)&pSymbolDictDecoder->SDAT[i]) != 0) {
- m_pModule->JBig2_Error("symbol dictionary segment : data header too short.");
- nRet = JBIG2_ERROR_TOO_SHORT;
- goto failed;
- }
- }
- }
- if((pSymbolDictDecoder->SDREFAGG == 1) && (pSymbolDictDecoder->SDRTEMPLATE == 0)) {
- for(i = 0; i < 4; i++) {
- if(m_pStream->read1Byte((FX_BYTE*)&pSymbolDictDecoder->SDRAT[i]) != 0) {
- m_pModule->JBig2_Error("symbol dictionary segment : data header too short.");
- nRet = JBIG2_ERROR_TOO_SHORT;
- goto failed;
- }
- }
- }
- if((m_pStream->readInteger(&pSymbolDictDecoder->SDNUMEXSYMS) != 0)
- || (m_pStream->readInteger(&pSymbolDictDecoder->SDNUMNEWSYMS) != 0)) {
- m_pModule->JBig2_Error("symbol dictionary segment : data header too short.");
- nRet = JBIG2_ERROR_TOO_SHORT;
- goto failed;
- }
- if (pSymbolDictDecoder->SDNUMEXSYMS > JBIG2_MAX_EXPORT_SYSMBOLS
- || pSymbolDictDecoder->SDNUMNEWSYMS > JBIG2_MAX_NEW_SYSMBOLS) {
- m_pModule->JBig2_Error("symbol dictionary segment : too many export/new symbols.");
- nRet = JBIG2_ERROR_LIMIT;
- goto failed;
- }
- for(i = 0; i < pSegment->m_nReferred_to_segment_count; i++) {
- if(!findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[i])) {
- m_pModule->JBig2_Error("symbol dictionary segment : can't find refered to segments");
- nRet = JBIG2_ERROR_FETAL;
- goto failed;
- }
- }
- pSymbolDictDecoder->SDNUMINSYMS = 0;
- for(i = 0; i < pSegment->m_nReferred_to_segment_count; i++) {
- pSeg = findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[i]);
- if(pSeg->m_cFlags.s.type == 0) {
- pSymbolDictDecoder->SDNUMINSYMS += pSeg->m_Result.sd->SDNUMEXSYMS;
- pLRSeg = pSeg;
- }
- }
- if(pSymbolDictDecoder->SDNUMINSYMS == 0) {
- SDINSYMS = NULL;
- } else {
- SDINSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(
- sizeof(CJBig2_Image*), pSymbolDictDecoder->SDNUMINSYMS);
- dwTemp = 0;
- for(i = 0; i < pSegment->m_nReferred_to_segment_count; i++) {
- pSeg = findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[i]);
- if(pSeg->m_cFlags.s.type == 0) {
- JBIG2_memcpy(SDINSYMS + dwTemp, pSeg->m_Result.sd->SDEXSYMS,
- pSeg->m_Result.sd->SDNUMEXSYMS * sizeof(CJBig2_Image*));
- dwTemp += pSeg->m_Result.sd->SDNUMEXSYMS;
- }
- }
- }
- pSymbolDictDecoder->SDINSYMS = SDINSYMS;
- if(pSymbolDictDecoder->SDHUFF == 1) {
- if((cSDHUFFDH == 2) || (cSDHUFFDW == 2)) {
- m_pModule->JBig2_Error("symbol dictionary segment : SDHUFFDH=2 or SDHUFFDW=2 is not permitted.");
- nRet = JBIG2_ERROR_FETAL;
- goto failed;
- }
- nIndex = 0;
- if(cSDHUFFDH == 0) {
- JBIG2_ALLOC(Table_B4, CJBig2_HuffmanTable(HuffmanTable_B4,
- sizeof(HuffmanTable_B4) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B4));
- pSymbolDictDecoder->SDHUFFDH = Table_B4;
- } else if(cSDHUFFDH == 1) {
- JBIG2_ALLOC(Table_B5, CJBig2_HuffmanTable(HuffmanTable_B5,
- sizeof(HuffmanTable_B5) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B5));
- pSymbolDictDecoder->SDHUFFDH = Table_B5;
- } else {
- pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++);
- if(!pSeg) {
- m_pModule->JBig2_Error("symbol dictionary segment : SDHUFFDH can't find user supplied table.");
- nRet = JBIG2_ERROR_FETAL;
- goto failed;
- }
- pSymbolDictDecoder->SDHUFFDH = pSeg->m_Result.ht;
- }
- if(cSDHUFFDW == 0) {
- JBIG2_ALLOC(Table_B2, CJBig2_HuffmanTable(HuffmanTable_B2,
- sizeof(HuffmanTable_B2) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B2));
- pSymbolDictDecoder->SDHUFFDW = Table_B2;
- } else if(cSDHUFFDW == 1) {
- JBIG2_ALLOC(Table_B3, CJBig2_HuffmanTable(HuffmanTable_B3,
- sizeof(HuffmanTable_B3) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B3));
- pSymbolDictDecoder->SDHUFFDW = Table_B3;
- } else {
- pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++);
- if(!pSeg) {
- m_pModule->JBig2_Error("symbol dictionary segment : SDHUFFDW can't find user supplied table.");
- nRet = JBIG2_ERROR_FETAL;
- goto failed;
- }
- pSymbolDictDecoder->SDHUFFDW = pSeg->m_Result.ht;
- }
- if(cSDHUFFBMSIZE == 0) {
- JBIG2_ALLOC(Table_B1, CJBig2_HuffmanTable(HuffmanTable_B1,
- sizeof(HuffmanTable_B1) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B1));
- pSymbolDictDecoder->SDHUFFBMSIZE = Table_B1;
- } else {
- pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++);
- if(!pSeg) {
- m_pModule->JBig2_Error("symbol dictionary segment : SDHUFFBMSIZE can't find user supplied table.");
- nRet = JBIG2_ERROR_FETAL;
- goto failed;
- }
- pSymbolDictDecoder->SDHUFFBMSIZE = pSeg->m_Result.ht;
- }
- if(pSymbolDictDecoder->SDREFAGG == 1) {
- if(cSDHUFFAGGINST == 0) {
- if(!Table_B1) {
- JBIG2_ALLOC(Table_B1, CJBig2_HuffmanTable(HuffmanTable_B1,
- sizeof(HuffmanTable_B1) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B1));
- }
- pSymbolDictDecoder->SDHUFFAGGINST = Table_B1;
- } else {
- pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++);
- if(!pSeg) {
- m_pModule->JBig2_Error("symbol dictionary segment : SDHUFFAGGINST can't find user supplied table.");
- nRet = JBIG2_ERROR_FETAL;
- goto failed;
- }
- pSymbolDictDecoder->SDHUFFAGGINST = pSeg->m_Result.ht;
- }
- }
- }
- if((wFlags & 0x0100) && pLRSeg && pLRSeg->m_Result.sd->m_bContextRetained) {
- if (pSymbolDictDecoder->SDHUFF == 0) {
- dwTemp = pSymbolDictDecoder->SDTEMPLATE == 0 ? 65536 : pSymbolDictDecoder->SDTEMPLATE == 1 ?
- 8192 : 1024;
- gbContext = (JBig2ArithCtx*)m_pModule->JBig2_Malloc2(sizeof(JBig2ArithCtx), dwTemp);
- JBIG2_memcpy(gbContext, pLRSeg->m_Result.sd->m_gbContext, sizeof(JBig2ArithCtx)*dwTemp);
- }
- if (pSymbolDictDecoder->SDREFAGG == 1) {
- dwTemp = pSymbolDictDecoder->SDRTEMPLATE ? 1 << 10 : 1 << 13;
- grContext = (JBig2ArithCtx*)m_pModule->JBig2_Malloc2(sizeof(JBig2ArithCtx), dwTemp);
- JBIG2_memcpy(grContext, pLRSeg->m_Result.sd->m_grContext, sizeof(JBig2ArithCtx)*dwTemp);
- }
- } else {
- if (pSymbolDictDecoder->SDHUFF == 0) {
- dwTemp = pSymbolDictDecoder->SDTEMPLATE == 0 ? 65536 : pSymbolDictDecoder->SDTEMPLATE == 1 ?
- 8192 : 1024;
- gbContext = (JBig2ArithCtx*)m_pModule->JBig2_Malloc2(sizeof(JBig2ArithCtx), dwTemp);
- JBIG2_memset(gbContext, 0, sizeof(JBig2ArithCtx)*dwTemp);
- }
- if (pSymbolDictDecoder->SDREFAGG == 1) {
- dwTemp = pSymbolDictDecoder->SDRTEMPLATE ? 1 << 10 : 1 << 13;
- grContext = (JBig2ArithCtx*)m_pModule->JBig2_Malloc2(sizeof(JBig2ArithCtx), dwTemp);
- JBIG2_memset(grContext, 0, sizeof(JBig2ArithCtx)*dwTemp);
- }
- }
- pSegment->m_nResultType = JBIG2_SYMBOL_DICT_POINTER;
- if(pSymbolDictDecoder->SDHUFF == 0) {
- JBIG2_ALLOC(pArithDecoder, CJBig2_ArithDecoder(m_pStream));
- pSegment->m_Result.sd = pSymbolDictDecoder->decode_Arith(pArithDecoder, gbContext, grContext);
- delete pArithDecoder;
- if(pSegment->m_Result.sd == NULL) {
- nRet = JBIG2_ERROR_FETAL;
- goto failed;
- }
- m_pStream->alignByte();
- m_pStream->offset(2);
- } else {
- pSegment->m_Result.sd = pSymbolDictDecoder->decode_Huffman(m_pStream, gbContext, grContext, pPause);
- if(pSegment->m_Result.sd == NULL) {
- nRet = JBIG2_ERROR_FETAL;
- goto failed;
- }
- m_pStream->alignByte();
- }
- if(wFlags & 0x0200) {
- pSegment->m_Result.sd->m_bContextRetained = TRUE;
- if(pSymbolDictDecoder->SDHUFF == 0) {
- pSegment->m_Result.sd->m_gbContext = gbContext;
- }
- if(pSymbolDictDecoder->SDREFAGG == 1) {
- pSegment->m_Result.sd->m_grContext = grContext;
- }
- bUsed = TRUE;
- } else {
- bUsed = FALSE;
- }
- delete pSymbolDictDecoder;
- if(SDINSYMS) {
- m_pModule->JBig2_Free(SDINSYMS);
- }
- if(Table_B1) {
- delete Table_B1;
- }
- if(Table_B2) {
- delete Table_B2;
- }
- if(Table_B3) {
- delete Table_B3;
- }
- if(Table_B4) {
- delete Table_B4;
- }
- if(Table_B5) {
- delete Table_B5;
- }
- if(bUsed == FALSE) {
- if(gbContext) {
- m_pModule->JBig2_Free(gbContext);
- }
- if(grContext) {
- m_pModule->JBig2_Free(grContext);
- }
- }
- return JBIG2_SUCCESS;
-failed:
- delete pSymbolDictDecoder;
- if(SDINSYMS) {
- m_pModule->JBig2_Free(SDINSYMS);
- }
- if(Table_B1) {
- delete Table_B1;
- }
- if(Table_B2) {
- delete Table_B2;
- }
- if(Table_B3) {
- delete Table_B3;
- }
- if(Table_B4) {
- delete Table_B4;
- }
- if(Table_B5) {
- delete Table_B5;
- }
- if(gbContext) {
- m_pModule->JBig2_Free(gbContext);
- }
- if(grContext) {
- m_pModule->JBig2_Free(grContext);
- }
- return nRet;
-}
-
-FX_BOOL CJBig2_Context::parseTextRegion(CJBig2_Segment *pSegment)
-{
- FX_DWORD dwTemp;
- FX_WORD wFlags;
- FX_INT32 i, nIndex, nRet;
- JBig2RegionInfo ri;
- CJBig2_Segment *pSeg;
- CJBig2_Image **SBSYMS = NULL;
- JBig2HuffmanCode *SBSYMCODES = NULL;
- FX_BYTE cSBHUFFFS, cSBHUFFDS, cSBHUFFDT, cSBHUFFRDW, cSBHUFFRDH, cSBHUFFRDX, cSBHUFFRDY, cSBHUFFRSIZE;
- CJBig2_HuffmanTable *Table_B1 = NULL,
- *Table_B6 = NULL,
- *Table_B7 = NULL,
- *Table_B8 = NULL,
- *Table_B9 = NULL,
- *Table_B10 = NULL,
- *Table_B11 = NULL,
- *Table_B12 = NULL,
- *Table_B13 = NULL,
- *Table_B14 = NULL,
- *Table_B15 = NULL;
- JBig2ArithCtx *grContext = NULL;
- CJBig2_ArithDecoder *pArithDecoder;
- CJBig2_TRDProc *pTRD;
- JBIG2_ALLOC(pTRD, CJBig2_TRDProc());
- if((parseRegionInfo(&ri) != JBIG2_SUCCESS)
- || (m_pStream->readShortInteger(&wFlags) != 0)) {
- m_pModule->JBig2_Error("text region segment : data header too short.");
- nRet = JBIG2_ERROR_TOO_SHORT;
- goto failed;
- }
- pTRD->SBW = ri.width;
- pTRD->SBH = ri.height;
- pTRD->SBHUFF = wFlags & 0x0001;
- pTRD->SBREFINE = (wFlags >> 1) & 0x0001;
- dwTemp = (wFlags >> 2) & 0x0003;
- pTRD->SBSTRIPS = 1 << dwTemp;
- pTRD->REFCORNER = (JBig2Corner)((wFlags >> 4) & 0x0003);
- pTRD->TRANSPOSED = (wFlags >> 6) & 0x0001;
- pTRD->SBCOMBOP = (JBig2ComposeOp)((wFlags >> 7) & 0x0003);
- pTRD->SBDEFPIXEL = (wFlags >> 9) & 0x0001;
- pTRD->SBDSOFFSET = (wFlags >> 10) & 0x001f;
- if(pTRD->SBDSOFFSET >= 0x0010) {
- pTRD->SBDSOFFSET = pTRD->SBDSOFFSET - 0x0020;
- }
- pTRD->SBRTEMPLATE = (wFlags >> 15) & 0x0001;
- if(pTRD->SBHUFF == 1) {
- if(m_pStream->readShortInteger(&wFlags) != 0) {
- m_pModule->JBig2_Error("text region segment : data header too short.");
- nRet = JBIG2_ERROR_TOO_SHORT;
- goto failed;
- }
- cSBHUFFFS = wFlags & 0x0003;
- cSBHUFFDS = (wFlags >> 2) & 0x0003;
- cSBHUFFDT = (wFlags >> 4) & 0x0003;
- cSBHUFFRDW = (wFlags >> 6) & 0x0003;
- cSBHUFFRDH = (wFlags >> 8) & 0x0003;
- cSBHUFFRDX = (wFlags >> 10) & 0x0003;
- cSBHUFFRDY = (wFlags >> 12) & 0x0003;
- cSBHUFFRSIZE = (wFlags >> 14) & 0x0001;
- }
- if((pTRD->SBREFINE == 1) && (pTRD->SBRTEMPLATE == 0)) {
- for(i = 0; i < 4; i++) {
- if(m_pStream->read1Byte((FX_BYTE*)&pTRD->SBRAT[i]) != 0) {
- m_pModule->JBig2_Error("text region segment : data header too short.");
- nRet = JBIG2_ERROR_TOO_SHORT;
- goto failed;
- }
- }
- }
- if(m_pStream->readInteger(&pTRD->SBNUMINSTANCES) != 0) {
- m_pModule->JBig2_Error("text region segment : data header too short.");
- nRet = JBIG2_ERROR_TOO_SHORT;
- goto failed;
- }
- for(i = 0; i < pSegment->m_nReferred_to_segment_count; i++) {
- if(!findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[i])) {
- m_pModule->JBig2_Error("text region segment : can't find refered to segments");
- nRet = JBIG2_ERROR_FETAL;
- goto failed;
- }
- }
- pTRD->SBNUMSYMS = 0;
- for(i = 0; i < pSegment->m_nReferred_to_segment_count; i++) {
- pSeg = findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[i]);
- if(pSeg->m_cFlags.s.type == 0) {
- pTRD->SBNUMSYMS += pSeg->m_Result.sd->SDNUMEXSYMS;
- }
- }
- if (pTRD->SBNUMSYMS > 0) {
- SBSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(
- sizeof(CJBig2_Image*), pTRD->SBNUMSYMS);
- dwTemp = 0;
- for(i = 0; i < pSegment->m_nReferred_to_segment_count; i++) {
- pSeg = findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[i]);
- if(pSeg->m_cFlags.s.type == 0) {
- JBIG2_memcpy(SBSYMS + dwTemp, pSeg->m_Result.sd->SDEXSYMS,
- pSeg->m_Result.sd->SDNUMEXSYMS * sizeof(CJBig2_Image*));
- dwTemp += pSeg->m_Result.sd->SDNUMEXSYMS;
- }
- }
- pTRD->SBSYMS = SBSYMS;
- } else {
- pTRD->SBSYMS = NULL;
- }
- if(pTRD->SBHUFF == 1) {
- SBSYMCODES = decodeSymbolIDHuffmanTable(m_pStream, pTRD->SBNUMSYMS);
- if(SBSYMCODES == NULL) {
- m_pModule->JBig2_Error("text region segment: symbol ID huffman table decode failure!");
- nRet = JBIG2_ERROR_FETAL;
- goto failed;
- }
- m_pStream->alignByte();
- pTRD->SBSYMCODES = SBSYMCODES;
- } else {
- dwTemp = 0;
- while((FX_DWORD)(1 << dwTemp) < pTRD->SBNUMSYMS) {
- dwTemp ++;
- }
- pTRD->SBSYMCODELEN = (FX_BYTE)dwTemp;
- }
- if(pTRD->SBHUFF == 1) {
- if((cSBHUFFFS == 2) || (cSBHUFFRDW == 2) || (cSBHUFFRDH == 2)
- || (cSBHUFFRDX == 2) || (cSBHUFFRDY == 2)) {
- m_pModule->JBig2_Error("text region segment : SBHUFFFS=2 or SBHUFFRDW=2 or "
- "SBHUFFRDH=2 or SBHUFFRDX=2 or SBHUFFRDY=2 is not permitted");
- nRet = JBIG2_ERROR_FETAL;
- goto failed;
- }
- nIndex = 0;
- if(cSBHUFFFS == 0) {
- JBIG2_ALLOC(Table_B6, CJBig2_HuffmanTable(HuffmanTable_B6,
- sizeof(HuffmanTable_B6) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B6));
- pTRD->SBHUFFFS = Table_B6;
- } else if(cSBHUFFFS == 1) {
- JBIG2_ALLOC(Table_B7, CJBig2_HuffmanTable(HuffmanTable_B7,
- sizeof(HuffmanTable_B7) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B7));
- pTRD->SBHUFFFS = Table_B7;
- } else {
- pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++);
- if(!pSeg) {
- m_pModule->JBig2_Error("text region segment : SBHUFFFS can't find user supplied table");
- nRet = JBIG2_ERROR_FETAL;
- goto failed;
- }
- pTRD->SBHUFFFS = pSeg->m_Result.ht;
- }
- if(cSBHUFFDS == 0) {
- JBIG2_ALLOC(Table_B8, CJBig2_HuffmanTable(HuffmanTable_B8,
- sizeof(HuffmanTable_B8) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B8));
- pTRD->SBHUFFDS = Table_B8;
- } else if(cSBHUFFDS == 1) {
- JBIG2_ALLOC(Table_B9, CJBig2_HuffmanTable(HuffmanTable_B9,
- sizeof(HuffmanTable_B9) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B9));
- pTRD->SBHUFFDS = Table_B9;
- } else if(cSBHUFFDS == 2) {
- JBIG2_ALLOC(Table_B10, CJBig2_HuffmanTable(HuffmanTable_B10,
- sizeof(HuffmanTable_B10) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B10));
- pTRD->SBHUFFDS = Table_B10;
- } else {
- pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++);
- if(!pSeg) {
- m_pModule->JBig2_Error("text region segment : SBHUFFDS can't find user supplied table");
- nRet = JBIG2_ERROR_FETAL;
- goto failed;
- }
- pTRD->SBHUFFDS = pSeg->m_Result.ht;
- }
- if(cSBHUFFDT == 0) {
- JBIG2_ALLOC(Table_B11, CJBig2_HuffmanTable(HuffmanTable_B11,
- sizeof(HuffmanTable_B11) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B11));
- pTRD->SBHUFFDT = Table_B11;
- } else if(cSBHUFFDT == 1) {
- JBIG2_ALLOC(Table_B12, CJBig2_HuffmanTable(HuffmanTable_B12,
- sizeof(HuffmanTable_B12) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B12));
- pTRD->SBHUFFDT = Table_B12;
- } else if(cSBHUFFDT == 2) {
- JBIG2_ALLOC(Table_B13, CJBig2_HuffmanTable(HuffmanTable_B13,
- sizeof(HuffmanTable_B13) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B13));
- pTRD->SBHUFFDT = Table_B13;
- } else {
- pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++);
- if(!pSeg) {
- m_pModule->JBig2_Error("text region segment : SBHUFFDT can't find user supplied table");
- nRet = JBIG2_ERROR_FETAL;
- goto failed;
- }
- pTRD->SBHUFFDT = pSeg->m_Result.ht;
- }
- if(cSBHUFFRDW == 0) {
- JBIG2_ALLOC(Table_B14, CJBig2_HuffmanTable(HuffmanTable_B14,
- sizeof(HuffmanTable_B14) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B14));
- pTRD->SBHUFFRDW = Table_B14;
- } else if(cSBHUFFRDW == 1) {
- JBIG2_ALLOC(Table_B15, CJBig2_HuffmanTable(HuffmanTable_B15,
- sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B15));
- pTRD->SBHUFFRDW = Table_B15;
- } else {
- pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++);
- if(!pSeg) {
- m_pModule->JBig2_Error("text region segment : SBHUFFRDW can't find user supplied table");
- nRet = JBIG2_ERROR_FETAL;
- goto failed;
- }
- pTRD->SBHUFFRDW = pSeg->m_Result.ht;
- }
- if(cSBHUFFRDH == 0) {
- if(!Table_B14) {
- JBIG2_ALLOC(Table_B14, CJBig2_HuffmanTable(HuffmanTable_B14,
- sizeof(HuffmanTable_B14) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B14));
- }
- pTRD->SBHUFFRDH = Table_B14;
- } else if(cSBHUFFRDH == 1) {
- if(!Table_B15) {
- JBIG2_ALLOC(Table_B15, CJBig2_HuffmanTable(HuffmanTable_B15,
- sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B15));
- }
- pTRD->SBHUFFRDH = Table_B15;
- } else {
- pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++);
- if(!pSeg) {
- m_pModule->JBig2_Error("text region segment : SBHUFFRDH can't find user supplied table");
- nRet = JBIG2_ERROR_FETAL;
- goto failed;
- }
- pTRD->SBHUFFRDH = pSeg->m_Result.ht;
- }
- if(cSBHUFFRDX == 0) {
- if(!Table_B14) {
- JBIG2_ALLOC(Table_B14, CJBig2_HuffmanTable(HuffmanTable_B14,
- sizeof(HuffmanTable_B14) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B14));
- }
- pTRD->SBHUFFRDX = Table_B14;
- } else if(cSBHUFFRDX == 1) {
- if(!Table_B15) {
- JBIG2_ALLOC(Table_B15, CJBig2_HuffmanTable(HuffmanTable_B15,
- sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B15));
- }
- pTRD->SBHUFFRDX = Table_B15;
- } else {
- pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++);
- if(!pSeg) {
- m_pModule->JBig2_Error("text region segment : SBHUFFRDX can't find user supplied table");
- nRet = JBIG2_ERROR_FETAL;
- goto failed;
- }
- pTRD->SBHUFFRDX = pSeg->m_Result.ht;
- }
- if(cSBHUFFRDY == 0) {
- if(!Table_B14) {
- JBIG2_ALLOC(Table_B14, CJBig2_HuffmanTable(HuffmanTable_B14,
- sizeof(HuffmanTable_B14) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B14));
- }
- pTRD->SBHUFFRDY = Table_B14;
- } else if(cSBHUFFRDY == 1) {
- if(!Table_B15) {
- JBIG2_ALLOC(Table_B15, CJBig2_HuffmanTable(HuffmanTable_B15,
- sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B15));
- }
- pTRD->SBHUFFRDY = Table_B15;
- } else {
- pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++);
- if(!pSeg) {
- m_pModule->JBig2_Error("text region segment : SBHUFFRDY can't find user supplied table");
- nRet = JBIG2_ERROR_FETAL;
- goto failed;
- }
- pTRD->SBHUFFRDY = pSeg->m_Result.ht;
- }
- if(cSBHUFFRSIZE == 0) {
- JBIG2_ALLOC(Table_B1, CJBig2_HuffmanTable(HuffmanTable_B1,
- sizeof(HuffmanTable_B1) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B1));
- pTRD->SBHUFFRSIZE = Table_B1;
- } else {
- pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++);
- if(!pSeg) {
- m_pModule->JBig2_Error("text region segment : SBHUFFRSIZE can't find user supplied table");
- nRet = JBIG2_ERROR_FETAL;
- goto failed;
- }
- pTRD->SBHUFFRSIZE = pSeg->m_Result.ht;
- }
- }
- if(pTRD->SBREFINE == 1) {
- dwTemp = pTRD->SBRTEMPLATE ? 1 << 10 : 1 << 13;
- grContext = (JBig2ArithCtx*)m_pModule->JBig2_Malloc2(sizeof(JBig2ArithCtx), dwTemp);
- JBIG2_memset(grContext, 0, sizeof(JBig2ArithCtx)*dwTemp);
- }
- if(pTRD->SBHUFF == 0) {
- JBIG2_ALLOC(pArithDecoder, CJBig2_ArithDecoder(m_pStream));
- pSegment->m_nResultType = JBIG2_IMAGE_POINTER;
- pSegment->m_Result.im = pTRD->decode_Arith(pArithDecoder, grContext);
- delete pArithDecoder;
- if(pSegment->m_Result.im == NULL) {
- nRet = JBIG2_ERROR_FETAL;
- goto failed;
- }
- m_pStream->alignByte();
- m_pStream->offset(2);
- } else {
- pSegment->m_nResultType = JBIG2_IMAGE_POINTER;
- pSegment->m_Result.im = pTRD->decode_Huffman(m_pStream, grContext);
- if(pSegment->m_Result.im == NULL) {
- nRet = JBIG2_ERROR_FETAL;
- goto failed;
- }
- m_pStream->alignByte();
- }
- if(pSegment->m_cFlags.s.type != 4) {
- if(!m_bBufSpecified) {
- JBig2PageInfo *pPageInfo = m_pPageInfoList->getLast();
- if ((pPageInfo->m_bIsStriped == 1) && (ri.y + ri.height > m_pPage->m_nHeight)) {
- m_pPage->expand(ri.y + ri.height, (pPageInfo->m_cFlags & 4) ? 1 : 0);
- }
- }
- m_pPage->composeFrom(ri.x, ri.y, pSegment->m_Result.im, (JBig2ComposeOp)(ri.flags & 0x03));
- delete pSegment->m_Result.im;
- pSegment->m_Result.im = NULL;
- }
- delete pTRD;
- if(SBSYMS) {
- m_pModule->JBig2_Free(SBSYMS);
- }
- if(SBSYMCODES) {
- m_pModule->JBig2_Free(SBSYMCODES);
- }
- if(grContext) {
- m_pModule->JBig2_Free(grContext);
- }
- if(Table_B1) {
- delete Table_B1;
- }
- if(Table_B6) {
- delete Table_B6;
- }
- if(Table_B7) {
- delete Table_B7;
- }
- if(Table_B8) {
- delete Table_B8;
- }
- if(Table_B9) {
- delete Table_B9;
- }
- if(Table_B10) {
- delete Table_B10;
- }
- if(Table_B11) {
- delete Table_B11;
- }
- if(Table_B12) {
- delete Table_B12;
- }
- if(Table_B13) {
- delete Table_B13;
- }
- if(Table_B14) {
- delete Table_B14;
- }
- if(Table_B15) {
- delete Table_B15;
- }
- return JBIG2_SUCCESS;
-failed:
- delete pTRD;
- if(SBSYMS) {
- m_pModule->JBig2_Free(SBSYMS);
- }
- if(SBSYMCODES) {
- m_pModule->JBig2_Free(SBSYMCODES);
- }
- if(grContext) {
- m_pModule->JBig2_Free(grContext);
- }
- if(Table_B1) {
- delete Table_B1;
- }
- if(Table_B6) {
- delete Table_B6;
- }
- if(Table_B7) {
- delete Table_B7;
- }
- if(Table_B8) {
- delete Table_B8;
- }
- if(Table_B9) {
- delete Table_B9;
- }
- if(Table_B10) {
- delete Table_B10;
- }
- if(Table_B11) {
- delete Table_B11;
- }
- if(Table_B12) {
- delete Table_B12;
- }
- if(Table_B13) {
- delete Table_B13;
- }
- if(Table_B14) {
- delete Table_B14;
- }
- if(Table_B15) {
- delete Table_B15;
- }
- return nRet;
-}
-
-FX_BOOL CJBig2_Context::parsePatternDict(CJBig2_Segment *pSegment, IFX_Pause* pPause)
-{
- FX_DWORD dwTemp;
- FX_BYTE cFlags;
- JBig2ArithCtx *gbContext;
- CJBig2_ArithDecoder *pArithDecoder;
- CJBig2_PDDProc *pPDD;
- FX_INT32 nRet;
- JBIG2_ALLOC(pPDD, CJBig2_PDDProc());
- if((m_pStream->read1Byte(&cFlags) != 0)
- || (m_pStream->read1Byte(&pPDD->HDPW) != 0)
- || (m_pStream->read1Byte(&pPDD->HDPH) != 0)
- || (m_pStream->readInteger(&pPDD->GRAYMAX) != 0)) {
- m_pModule->JBig2_Error("pattern dictionary segment : data header too short.");
- nRet = JBIG2_ERROR_TOO_SHORT;
- goto failed;
- }
- if (pPDD->GRAYMAX > JBIG2_MAX_PATTERN_INDEX) {
- m_pModule->JBig2_Error("pattern dictionary segment : too max gray max.");
- nRet = JBIG2_ERROR_LIMIT;
- goto failed;
- }
- pPDD->HDMMR = cFlags & 0x01;
- pPDD->HDTEMPLATE = (cFlags >> 1) & 0x03;
- pSegment->m_nResultType = JBIG2_PATTERN_DICT_POINTER;
- if(pPDD->HDMMR == 0) {
- dwTemp = pPDD->HDTEMPLATE == 0 ? 65536 : pPDD->HDTEMPLATE == 1 ? 8192 : 1024;
- gbContext = (JBig2ArithCtx*)m_pModule->JBig2_Malloc2(sizeof(JBig2ArithCtx), dwTemp);
- JBIG2_memset(gbContext, 0, sizeof(JBig2ArithCtx)*dwTemp);
- JBIG2_ALLOC(pArithDecoder, CJBig2_ArithDecoder(m_pStream));
- pSegment->m_Result.pd = pPDD->decode_Arith(pArithDecoder, gbContext, pPause);
- delete pArithDecoder;
- if(pSegment->m_Result.pd == NULL) {
- m_pModule->JBig2_Free(gbContext);
- nRet = JBIG2_ERROR_FETAL;
- goto failed;
- }
- m_pModule->JBig2_Free(gbContext);
- m_pStream->alignByte();
- m_pStream->offset(2);
- } else {
- pSegment->m_Result.pd = pPDD->decode_MMR(m_pStream, pPause);
- if(pSegment->m_Result.pd == NULL) {
- nRet = JBIG2_ERROR_FETAL;
- goto failed;
- }
- m_pStream->alignByte();
- }
- delete pPDD;
- return JBIG2_SUCCESS;
-failed:
- delete pPDD;
- return nRet;
-}
-FX_BOOL CJBig2_Context::parseHalftoneRegion(CJBig2_Segment *pSegment, IFX_Pause* pPause)
-{
- FX_DWORD dwTemp;
- FX_BYTE cFlags;
- JBig2RegionInfo ri;
- CJBig2_Segment *pSeg;
- CJBig2_PatternDict *pPatternDict;
- JBig2ArithCtx *gbContext;
- CJBig2_ArithDecoder *pArithDecoder;
- CJBig2_HTRDProc *pHRD;
- FX_INT32 nRet;
- JBIG2_ALLOC(pHRD, CJBig2_HTRDProc());
- if((parseRegionInfo(&ri) != JBIG2_SUCCESS)
- || (m_pStream->read1Byte(&cFlags) != 0)
- || (m_pStream->readInteger(&pHRD->HGW) != 0)
- || (m_pStream->readInteger(&pHRD->HGH) != 0)
- || (m_pStream->readInteger((FX_DWORD*)&pHRD->HGX) != 0)
- || (m_pStream->readInteger((FX_DWORD*)&pHRD->HGY) != 0)
- || (m_pStream->readShortInteger(&pHRD->HRX) != 0)
- || (m_pStream->readShortInteger(&pHRD->HRY) != 0)) {
- m_pModule->JBig2_Error("halftone region segment : data header too short.");
- nRet = JBIG2_ERROR_TOO_SHORT;
- goto failed;
- }
- pHRD->HBW = ri.width;
- pHRD->HBH = ri.height;
- pHRD->HMMR = cFlags & 0x01;
- pHRD->HTEMPLATE = (cFlags >> 1) & 0x03;
- pHRD->HENABLESKIP = (cFlags >> 3) & 0x01;
- pHRD->HCOMBOP = (JBig2ComposeOp)((cFlags >> 4) & 0x07);
- pHRD->HDEFPIXEL = (cFlags >> 7) & 0x01;
- if(pSegment->m_nReferred_to_segment_count != 1) {
- m_pModule->JBig2_Error("halftone region segment : refered to segment count not equals 1");
- nRet = JBIG2_ERROR_FETAL;
- goto failed;
- }
- pSeg = findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[0]);
- if( (pSeg == NULL) || (pSeg->m_cFlags.s.type != 16)) {
- m_pModule->JBig2_Error("halftone region segment : refered to segment is not pattern dict");
- nRet = JBIG2_ERROR_FETAL;
- goto failed;
- }
- pPatternDict = pSeg->m_Result.pd;
- if((pPatternDict == NULL) || (pPatternDict->NUMPATS == 0)) {
- m_pModule->JBig2_Error("halftone region segment : has no patterns input");
- nRet = JBIG2_ERROR_FETAL;
- goto failed;
- }
- pHRD->HNUMPATS = pPatternDict->NUMPATS;
- pHRD->HPATS = pPatternDict->HDPATS;
- pHRD->HPW = pPatternDict->HDPATS[0]->m_nWidth;
- pHRD->HPH = pPatternDict->HDPATS[0]->m_nHeight;
- pSegment->m_nResultType = JBIG2_IMAGE_POINTER;
- if(pHRD->HMMR == 0) {
- dwTemp = pHRD->HTEMPLATE == 0 ? 65536 : pHRD->HTEMPLATE == 1 ? 8192 : 1024;
- gbContext = (JBig2ArithCtx*)m_pModule->JBig2_Malloc2(sizeof(JBig2ArithCtx), dwTemp);
- JBIG2_memset(gbContext, 0, sizeof(JBig2ArithCtx)*dwTemp);
- JBIG2_ALLOC(pArithDecoder, CJBig2_ArithDecoder(m_pStream));
- pSegment->m_Result.im = pHRD->decode_Arith(pArithDecoder, gbContext, pPause);
- delete pArithDecoder;
- if(pSegment->m_Result.im == NULL) {
- m_pModule->JBig2_Free(gbContext);
- nRet = JBIG2_ERROR_FETAL;
- goto failed;
- }
- m_pModule->JBig2_Free(gbContext);
- m_pStream->alignByte();
- m_pStream->offset(2);
- } else {
- pSegment->m_Result.im = pHRD->decode_MMR(m_pStream, pPause);
- if(pSegment->m_Result.im == NULL) {
- nRet = JBIG2_ERROR_FETAL;
- goto failed;
- }
- m_pStream->alignByte();
- }
- if(pSegment->m_cFlags.s.type != 20) {
- if(!m_bBufSpecified) {
- JBig2PageInfo *pPageInfo = m_pPageInfoList->getLast();
- if ((pPageInfo->m_bIsStriped == 1) && (ri.y + ri.height > m_pPage->m_nHeight)) {
- m_pPage->expand(ri.y + ri.height, (pPageInfo->m_cFlags & 4) ? 1 : 0);
- }
- }
- m_pPage->composeFrom(ri.x, ri.y, pSegment->m_Result.im, (JBig2ComposeOp)(ri.flags & 0x03));
- delete pSegment->m_Result.im;
- pSegment->m_Result.im = NULL;
- }
- delete pHRD;
- return JBIG2_SUCCESS;
-failed:
- delete pHRD;
- return nRet;
-}
-
-FX_BOOL CJBig2_Context::parseGenericRegion(CJBig2_Segment *pSegment, IFX_Pause* pPause)
-{
- FX_DWORD dwTemp;
- FX_BYTE cFlags;
- FX_INT32 i, nRet;
- if(m_pGRD == NULL) {
- JBIG2_ALLOC(m_pGRD, CJBig2_GRDProc());
- if((parseRegionInfo(&m_ri) != JBIG2_SUCCESS)
- || (m_pStream->read1Byte(&cFlags) != 0)) {
- m_pModule->JBig2_Error("generic region segment : data header too short.");
- nRet = JBIG2_ERROR_TOO_SHORT;
- goto failed;
- }
- if (m_ri.height < 0 || m_ri.width < 0) {
- m_pModule->JBig2_Error("generic region segment : wrong data.");
- nRet = JBIG2_FAILED;
- goto failed;
- }
- m_pGRD->GBW = m_ri.width;
- m_pGRD->GBH = m_ri.height;
- m_pGRD->MMR = cFlags & 0x01;
- m_pGRD->GBTEMPLATE = (cFlags >> 1) & 0x03;
- m_pGRD->TPGDON = (cFlags >> 3) & 0x01;
- if(m_pGRD->MMR == 0) {
- if(m_pGRD->GBTEMPLATE == 0) {
- for(i = 0; i < 8; i++) {
- if(m_pStream->read1Byte((FX_BYTE*)&m_pGRD->GBAT[i]) != 0) {
- m_pModule->JBig2_Error("generic region segment : data header too short.");
- nRet = JBIG2_ERROR_TOO_SHORT;
- goto failed;
- }
- }
- } else {
- for(i = 0; i < 2; i++) {
- if(m_pStream->read1Byte((FX_BYTE*)&m_pGRD->GBAT[i]) != 0) {
- m_pModule->JBig2_Error("generic region segment : data header too short.");
- nRet = JBIG2_ERROR_TOO_SHORT;
- goto failed;
- }
- }
- }
- }
- m_pGRD->USESKIP = 0;
- }
- pSegment->m_nResultType = JBIG2_IMAGE_POINTER;
- if(m_pGRD->MMR == 0) {
- dwTemp = m_pGRD->GBTEMPLATE == 0 ? 65536 : m_pGRD->GBTEMPLATE == 1 ? 8192 : 1024;
- if(m_gbContext == NULL) {
- m_gbContext = (JBig2ArithCtx*)m_pModule->JBig2_Malloc(sizeof(JBig2ArithCtx) * dwTemp);
- JBIG2_memset(m_gbContext, 0, sizeof(JBig2ArithCtx)*dwTemp);
- }
- if(m_pArithDecoder == NULL) {
- JBIG2_ALLOC(m_pArithDecoder, CJBig2_ArithDecoder(m_pStream));
- m_ProcessiveStatus = m_pGRD->Start_decode_Arith(&pSegment->m_Result.im, m_pArithDecoder, m_gbContext, pPause);
- } else {
- m_ProcessiveStatus = m_pGRD->Continue_decode(pPause);
- }
- OutputBitmap(pSegment->m_Result.im);
- if(m_ProcessiveStatus == FXCODEC_STATUS_DECODE_TOBECONTINUE) {
- if(pSegment->m_cFlags.s.type != 36) {
- if(!m_bBufSpecified) {
- JBig2PageInfo *pPageInfo = m_pPageInfoList->getLast();
- if ((pPageInfo->m_bIsStriped == 1) && (m_ri.y + m_ri.height > m_pPage->m_nHeight)) {
- m_pPage->expand(m_ri.y + m_ri.height, (pPageInfo->m_cFlags & 4) ? 1 : 0);
- }
- }
- FX_RECT Rect = m_pGRD->GetReplaceRect();
- m_pPage->composeFrom(m_ri.x + Rect.left, m_ri.y + Rect.top, pSegment->m_Result.im, (JBig2ComposeOp)(m_ri.flags & 0x03), &Rect);
- }
- return JBIG2_SUCCESS;
- } else {
- delete m_pArithDecoder;
- m_pArithDecoder = NULL;
- if(pSegment->m_Result.im == NULL) {
- m_pModule->JBig2_Free(m_gbContext);
- nRet = JBIG2_ERROR_FETAL;
- m_gbContext = NULL;
- m_ProcessiveStatus = FXCODEC_STATUS_ERROR;
- goto failed;
- }
- m_pModule->JBig2_Free(m_gbContext);
- m_gbContext = NULL;
- m_pStream->alignByte();
- m_pStream->offset(2);
- }
- } else {
- FXCODEC_STATUS status = m_pGRD->Start_decode_MMR(&pSegment->m_Result.im, m_pStream, pPause);
- while(status == FXCODEC_STATUS_DECODE_TOBECONTINUE) {
- m_pGRD->Continue_decode(pPause);
- }
- if(pSegment->m_Result.im == NULL) {
- nRet = JBIG2_ERROR_FETAL;
- goto failed;
- }
- m_pStream->alignByte();
- }
- if(pSegment->m_cFlags.s.type != 36) {
- if(!m_bBufSpecified) {
- JBig2PageInfo *pPageInfo = m_pPageInfoList->getLast();
- if ((pPageInfo->m_bIsStriped == 1) && (m_ri.y + m_ri.height > m_pPage->m_nHeight)) {
- m_pPage->expand(m_ri.y + m_ri.height, (pPageInfo->m_cFlags & 4) ? 1 : 0);
- }
- }
- FX_RECT Rect = m_pGRD->GetReplaceRect();
- m_pPage->composeFrom(m_ri.x + Rect.left, m_ri.y + Rect.top, pSegment->m_Result.im, (JBig2ComposeOp)(m_ri.flags & 0x03), &Rect);
- delete pSegment->m_Result.im;
- pSegment->m_Result.im = NULL;
- }
- delete m_pGRD;
- m_pGRD = NULL;
- return JBIG2_SUCCESS;
-failed:
- delete m_pGRD;
- m_pGRD = NULL;
- return nRet;
-}
-
-FX_BOOL CJBig2_Context::parseGenericRefinementRegion(CJBig2_Segment *pSegment)
-{
- FX_DWORD dwTemp;
- JBig2RegionInfo ri;
- CJBig2_Segment *pSeg;
- FX_INT32 i, nRet;
- FX_BYTE cFlags;
- JBig2ArithCtx *grContext;
- CJBig2_GRRDProc *pGRRD;
- CJBig2_ArithDecoder *pArithDecoder;
- JBIG2_ALLOC(pGRRD, CJBig2_GRRDProc());
- if((parseRegionInfo(&ri) != JBIG2_SUCCESS)
- || (m_pStream->read1Byte(&cFlags) != 0)) {
- m_pModule->JBig2_Error("generic refinement region segment : data header too short.");
- nRet = JBIG2_ERROR_TOO_SHORT;
- goto failed;
- }
- pGRRD->GRW = ri.width;
- pGRRD->GRH = ri.height;
- pGRRD->GRTEMPLATE = cFlags & 0x01;
- pGRRD->TPGRON = (cFlags >> 1) & 0x01;
- if(pGRRD->GRTEMPLATE == 0) {
- for(i = 0; i < 4; i++) {
- if(m_pStream->read1Byte((FX_BYTE*)&pGRRD->GRAT[i]) != 0) {
- m_pModule->JBig2_Error("generic refinement region segment : data header too short.");
- nRet = JBIG2_ERROR_TOO_SHORT;
- goto failed;
- }
- }
- }
- pSeg = NULL;
- if(pSegment->m_nReferred_to_segment_count > 0) {
- for(i = 0; i < pSegment->m_nReferred_to_segment_count; i++) {
- pSeg = this->findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[0]);
- if(pSeg == NULL) {
- m_pModule->JBig2_Error("generic refinement region segment : can't find refered to segments");
- nRet = JBIG2_ERROR_FETAL;
- goto failed;
- }
- if((pSeg->m_cFlags.s.type == 4) || (pSeg->m_cFlags.s.type == 20)
- || (pSeg->m_cFlags.s.type == 36) || (pSeg->m_cFlags.s.type == 40)) {
- break;
- }
- }
- if(i >= pSegment->m_nReferred_to_segment_count) {
- m_pModule->JBig2_Error("generic refinement region segment : can't find refered to intermediate region");
- nRet = JBIG2_ERROR_FETAL;
- goto failed;
- }
- pGRRD->GRREFERENCE = pSeg->m_Result.im;
- } else {
- pGRRD->GRREFERENCE = m_pPage;
- }
- pGRRD->GRREFERENCEDX = 0;
- pGRRD->GRREFERENCEDY = 0;
- dwTemp = pGRRD->GRTEMPLATE ? 1 << 10 : 1 << 13;
- grContext = (JBig2ArithCtx*)m_pModule->JBig2_Malloc2(sizeof(JBig2ArithCtx), dwTemp);
- JBIG2_memset(grContext, 0, sizeof(JBig2ArithCtx)*dwTemp);
- JBIG2_ALLOC(pArithDecoder, CJBig2_ArithDecoder(m_pStream));
- pSegment->m_nResultType = JBIG2_IMAGE_POINTER;
- pSegment->m_Result.im = pGRRD->decode(pArithDecoder, grContext);
- delete pArithDecoder;
- if(pSegment->m_Result.im == NULL) {
- m_pModule->JBig2_Free(grContext);
- nRet = JBIG2_ERROR_FETAL;
- goto failed;
- }
- m_pModule->JBig2_Free(grContext);
- m_pStream->alignByte();
- m_pStream->offset(2);
- if(pSegment->m_cFlags.s.type != 40) {
- if(!m_bBufSpecified) {
- JBig2PageInfo *pPageInfo = m_pPageInfoList->getLast();
- if ((pPageInfo->m_bIsStriped == 1) && (ri.y + ri.height > m_pPage->m_nHeight)) {
- m_pPage->expand(ri.y + ri.height, (pPageInfo->m_cFlags & 4) ? 1 : 0);
- }
- }
- m_pPage->composeFrom(ri.x, ri.y, pSegment->m_Result.im, (JBig2ComposeOp)(ri.flags & 0x03));
- delete pSegment->m_Result.im;
- pSegment->m_Result.im = NULL;
- }
- delete pGRRD;
- return JBIG2_SUCCESS;
-failed:
- delete pGRRD;
- return nRet;
-}
-FX_BOOL CJBig2_Context::parseTable(CJBig2_Segment *pSegment)
-{
- pSegment->m_nResultType = JBIG2_HUFFMAN_TABLE_POINTER;
- JBIG2_ALLOC(pSegment->m_Result.ht, CJBig2_HuffmanTable(m_pStream));
- if(!pSegment->m_Result.ht->isOK()) {
- delete pSegment->m_Result.ht;
- pSegment->m_Result.ht = NULL;
- return JBIG2_ERROR_FETAL;
- }
- m_pStream->alignByte();
- return JBIG2_SUCCESS;
-}
-FX_INT32 CJBig2_Context::parseRegionInfo(JBig2RegionInfo *pRI)
-{
- if((m_pStream->readInteger((FX_DWORD*)&pRI->width) != 0)
- || (m_pStream->readInteger((FX_DWORD*)&pRI->height) != 0)
- || (m_pStream->readInteger((FX_DWORD*)&pRI->x) != 0)
- || (m_pStream->readInteger((FX_DWORD*)&pRI->y) != 0)
- || (m_pStream->read1Byte(&pRI->flags) != 0)) {
- return JBIG2_ERROR_TOO_SHORT;
- }
- return JBIG2_SUCCESS;
-}
-JBig2HuffmanCode *CJBig2_Context::decodeSymbolIDHuffmanTable(CJBig2_BitStream *pStream,
- FX_DWORD SBNUMSYMS)
-{
- JBig2HuffmanCode *SBSYMCODES;
- FX_INT32 runcodes[35], runcodes_len[35], runcode;
- FX_INT32 i, j, nTemp, nVal, nBits;
- FX_INT32 run;
- SBSYMCODES = (JBig2HuffmanCode*)m_pModule->JBig2_Malloc2(sizeof(JBig2HuffmanCode), SBNUMSYMS);
- for (i = 0; i < 35; i ++) {
- if(pStream->readNBits(4, &runcodes_len[i]) != 0) {
- goto failed;
- }
- }
- huffman_assign_code(runcodes, runcodes_len, 35);
- i = 0;
- while(i < (int)SBNUMSYMS) {
- nVal = 0;
- nBits = 0;
- for(;;) {
- if(pStream->read1Bit(&nTemp) != 0) {
- goto failed;
- }
- nVal = (nVal << 1) | nTemp;
- nBits ++;
- for(j = 0; j < 35; j++) {
- if((nBits == runcodes_len[j]) && (nVal == runcodes[j])) {
- break;
- }
- }
- if(j < 35) {
- break;
- }
- }
- runcode = j;
- if(runcode < 32) {
- SBSYMCODES[i].codelen = runcode;
- run = 0;
- } else if(runcode == 32) {
- if(pStream->readNBits(2, &nTemp) != 0) {
- goto failed;
- }
- run = nTemp + 3;
- } else if(runcode == 33) {
- if(pStream->readNBits(3, &nTemp) != 0) {
- goto failed;
- }
- run = nTemp + 3;
- } else if(runcode == 34) {
- if(pStream->readNBits(7, &nTemp) != 0) {
- goto failed;
- }
- run = nTemp + 11;
- }
- if(run > 0) {
- if (i + run > (int)SBNUMSYMS) {
- goto failed;
- }
- for(j = 0; j < run; j++) {
- if(runcode == 32 && i > 0) {
- SBSYMCODES[i + j].codelen = SBSYMCODES[i - 1].codelen;
- } else {
- SBSYMCODES[i + j].codelen = 0;
- }
- }
- i += run;
- } else {
- i ++;
- }
- }
- huffman_assign_code(SBSYMCODES, SBNUMSYMS);
- return SBSYMCODES;
-failed:
- m_pModule->JBig2_Free(SBSYMCODES);
- return NULL;
-}
-void CJBig2_Context::huffman_assign_code(int* CODES, int* PREFLEN, int NTEMP)
-{
- int CURLEN, LENMAX, CURCODE, CURTEMP, i;
- int *LENCOUNT;
- int *FIRSTCODE;
- LENMAX = 0;
- for(i = 0; i < NTEMP; i++) {
- if(PREFLEN[i] > LENMAX) {
- LENMAX = PREFLEN[i];
- }
- }
- LENCOUNT = (int*)m_pModule->JBig2_Malloc2(sizeof(int), (LENMAX + 1));
- JBIG2_memset(LENCOUNT, 0, sizeof(int) * (LENMAX + 1));
- FIRSTCODE = (int*)m_pModule->JBig2_Malloc2(sizeof(int), (LENMAX + 1));
- for(i = 0; i < NTEMP; i++) {
- LENCOUNT[PREFLEN[i]] ++;
- }
- CURLEN = 1;
- FIRSTCODE[0] = 0;
- LENCOUNT[0] = 0;
- while(CURLEN <= LENMAX) {
- FIRSTCODE[CURLEN] = (FIRSTCODE[CURLEN - 1] + LENCOUNT[CURLEN - 1]) << 1;
- CURCODE = FIRSTCODE[CURLEN];
- CURTEMP = 0;
- while(CURTEMP < NTEMP) {
- if(PREFLEN[CURTEMP] == CURLEN) {
- CODES[CURTEMP] = CURCODE;
- CURCODE = CURCODE + 1;
- }
- CURTEMP = CURTEMP + 1;
- }
- CURLEN = CURLEN + 1;
- }
- m_pModule->JBig2_Free(LENCOUNT);
- m_pModule->JBig2_Free(FIRSTCODE);
-}
-void CJBig2_Context::huffman_assign_code(JBig2HuffmanCode *SBSYMCODES, int NTEMP)
-{
- int CURLEN, LENMAX, CURCODE, CURTEMP, i;
- int *LENCOUNT;
- int *FIRSTCODE;
- LENMAX = 0;
- for(i = 0; i < NTEMP; i++) {
- if(SBSYMCODES[i].codelen > LENMAX) {
- LENMAX = SBSYMCODES[i].codelen;
- }
- }
- LENCOUNT = (int*)m_pModule->JBig2_Malloc2(sizeof(int), (LENMAX + 1));
- JBIG2_memset(LENCOUNT, 0, sizeof(int) * (LENMAX + 1));
- FIRSTCODE = (int*)m_pModule->JBig2_Malloc2(sizeof(int), (LENMAX + 1));
- for(i = 0; i < NTEMP; i++) {
- LENCOUNT[SBSYMCODES[i].codelen] ++;
- }
- CURLEN = 1;
- FIRSTCODE[0] = 0;
- LENCOUNT[0] = 0;
- while(CURLEN <= LENMAX) {
- FIRSTCODE[CURLEN] = (FIRSTCODE[CURLEN - 1] + LENCOUNT[CURLEN - 1]) << 1;
- CURCODE = FIRSTCODE[CURLEN];
- CURTEMP = 0;
- while(CURTEMP < NTEMP) {
- if(SBSYMCODES[CURTEMP].codelen == CURLEN) {
- SBSYMCODES[CURTEMP].code = CURCODE;
- CURCODE = CURCODE + 1;
- }
- CURTEMP = CURTEMP + 1;
- }
- CURLEN = CURLEN + 1;
- }
- m_pModule->JBig2_Free(LENCOUNT);
- m_pModule->JBig2_Free(FIRSTCODE);
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "JBig2_Context.h"
+void OutputBitmap(CJBig2_Image* pImage)
+{
+ if(!pImage) {
+ return;
+ }
+}
+CJBig2_Context *CJBig2_Context::CreateContext(CJBig2_Module *pModule, FX_BYTE *pGlobalData, FX_DWORD dwGlobalLength,
+ FX_BYTE *pData, FX_DWORD dwLength, FX_INT32 nStreamType, IFX_Pause* pPause)
+{
+ return new(pModule) CJBig2_Context(pGlobalData, dwGlobalLength, pData, dwLength, nStreamType, pPause);
+}
+void CJBig2_Context::DestroyContext(CJBig2_Context *pContext)
+{
+ if(pContext) {
+ delete pContext;
+ }
+}
+CJBig2_Context::CJBig2_Context(FX_BYTE *pGlobalData, FX_DWORD dwGlobalLength,
+ FX_BYTE *pData, FX_DWORD dwLength, FX_INT32 nStreamType, IFX_Pause* pPause)
+{
+ if(pGlobalData && (dwGlobalLength > 0)) {
+ JBIG2_ALLOC(m_pGlobalContext, CJBig2_Context(NULL, 0, pGlobalData, dwGlobalLength,
+ JBIG2_EMBED_STREAM, pPause));
+ } else {
+ m_pGlobalContext = NULL;
+ }
+ JBIG2_ALLOC(m_pStream, CJBig2_BitStream(pData, dwLength));
+ m_nStreamType = nStreamType;
+ m_nState = JBIG2_OUT_OF_PAGE;
+ JBIG2_ALLOC(m_pSegmentList, CJBig2_List<CJBig2_Segment>);
+ JBIG2_ALLOC(m_pPageInfoList, CJBig2_List<JBig2PageInfo>(1));
+ m_pPage = NULL;
+ m_bBufSpecified = FALSE;
+ m_pPause = pPause;
+ m_nSegmentDecoded = 0;
+ m_PauseStep = 10;
+ m_pArithDecoder = NULL;
+ m_pGRD = NULL;
+ m_gbContext = NULL;
+ m_pSegment = NULL;
+ m_dwOffset = 0;
+ m_ProcessiveStatus = FXCODEC_STATUS_FRAME_READY;
+}
+CJBig2_Context::~CJBig2_Context()
+{
+ if(m_pArithDecoder) {
+ delete m_pArithDecoder;
+ }
+ m_pArithDecoder = NULL;
+ if(m_pGRD) {
+ delete m_pGRD;
+ }
+ m_pGRD = NULL;
+ if(m_gbContext) {
+ delete m_gbContext;
+ }
+ m_gbContext = NULL;
+ if(m_pGlobalContext) {
+ delete m_pGlobalContext;
+ }
+ m_pGlobalContext = NULL;
+ if(m_pPageInfoList) {
+ delete m_pPageInfoList;
+ }
+ m_pPageInfoList = NULL;
+ if(m_bBufSpecified && m_pPage) {
+ delete m_pPage;
+ }
+ m_pPage = NULL;
+ if(m_pStream) {
+ delete m_pStream;
+ }
+ m_pStream = NULL;
+ if(m_pSegmentList) {
+ delete m_pSegmentList;
+ }
+ m_pSegmentList = NULL;
+}
+FX_INT32 CJBig2_Context::decodeFile(IFX_Pause* pPause)
+{
+ FX_BYTE cFlags;
+ FX_DWORD dwTemp;
+ const FX_BYTE fileID[] = {0x97, 0x4A, 0x42, 0x32, 0x0D, 0x0A, 0x1A, 0x0A};
+ FX_INT32 nRet;
+ if(m_pStream->getByteLeft() < 8) {
+ m_pModule->JBig2_Error("file header too short.");
+ nRet = JBIG2_ERROR_TOO_SHORT;
+ goto failed;
+ }
+ if(JBIG2_memcmp(m_pStream->getPointer(), fileID, 8) != 0) {
+ m_pModule->JBig2_Error("not jbig2 file");
+ nRet = JBIG2_ERROR_FILE_FORMAT;
+ goto failed;
+ }
+ m_pStream->offset(8);
+ if(m_pStream->read1Byte(&cFlags) != 0) {
+ m_pModule->JBig2_Error("file header too short.");
+ nRet = JBIG2_ERROR_TOO_SHORT;
+ goto failed;
+ }
+ if(!(cFlags & 0x02)) {
+ if(m_pStream->readInteger(&dwTemp) != 0) {
+ m_pModule->JBig2_Error("file header too short.");
+ nRet = JBIG2_ERROR_TOO_SHORT;
+ goto failed;
+ }
+ if(dwTemp > 0) {
+ delete m_pPageInfoList;
+ JBIG2_ALLOC(m_pPageInfoList, CJBig2_List<JBig2PageInfo>(dwTemp));
+ }
+ }
+ if(cFlags & 0x01) {
+ m_nStreamType = JBIG2_SQUENTIAL_STREAM;
+ return decode_SquentialOrgnazation(pPause);
+ } else {
+ m_nStreamType = JBIG2_RANDOM_STREAM;
+ return decode_RandomOrgnazation_FirstPage(pPause);
+ }
+failed:
+ return nRet;
+}
+FX_INT32 CJBig2_Context::decode_SquentialOrgnazation(IFX_Pause* pPause)
+{
+ FX_INT32 nRet;
+ if(m_pStream->getByteLeft() > 0) {
+ while(m_pStream->getByteLeft() >= JBIG2_MIN_SEGMENT_SIZE) {
+ if(m_pSegment == NULL) {
+ JBIG2_ALLOC(m_pSegment, CJBig2_Segment());
+ nRet = parseSegmentHeader(m_pSegment);
+ if(nRet != JBIG2_SUCCESS) {
+ delete m_pSegment;
+ m_pSegment = NULL;
+ return nRet;
+ }
+ m_dwOffset = m_pStream->getOffset();
+ }
+ nRet = parseSegmentData(m_pSegment, pPause);
+ if(m_ProcessiveStatus == FXCODEC_STATUS_DECODE_TOBECONTINUE) {
+ m_ProcessiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;
+ m_PauseStep = 2;
+ return JBIG2_SUCCESS;
+ }
+ if((nRet == JBIG2_END_OF_PAGE) || (nRet == JBIG2_END_OF_FILE)) {
+ delete m_pSegment;
+ m_pSegment = NULL;
+ break;
+ } else if(nRet != JBIG2_SUCCESS) {
+ delete m_pSegment;
+ m_pSegment = NULL;
+ return nRet;
+ }
+ m_pSegmentList->addItem(m_pSegment);
+ if(m_pSegment->m_dwData_length != 0xffffffff) {
+ m_dwOffset = m_dwOffset + m_pSegment->m_dwData_length;
+ m_pStream->setOffset(m_dwOffset);
+ } else {
+ m_pStream->offset(4);
+ }
+ OutputBitmap(m_pPage);
+ m_pSegment = NULL;
+ if(m_pStream->getByteLeft() > 0 && m_pPage && pPause && pPause->NeedToPauseNow()) {
+ m_ProcessiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;
+ m_PauseStep = 2;
+ return JBIG2_SUCCESS;
+ }
+ }
+ } else {
+ return JBIG2_END_OF_FILE;
+ }
+ return JBIG2_SUCCESS;
+}
+FX_INT32 CJBig2_Context::decode_EmbedOrgnazation(IFX_Pause* pPause)
+{
+ return decode_SquentialOrgnazation(pPause);
+}
+FX_INT32 CJBig2_Context::decode_RandomOrgnazation_FirstPage(IFX_Pause* pPause)
+{
+ CJBig2_Segment *pSegment;
+ FX_INT32 nRet;
+ while(m_pStream->getByteLeft() > JBIG2_MIN_SEGMENT_SIZE) {
+ JBIG2_ALLOC(pSegment, CJBig2_Segment());
+ nRet = parseSegmentHeader(pSegment);
+ if(nRet != JBIG2_SUCCESS) {
+ delete pSegment;
+ return nRet;
+ } else if(pSegment->m_cFlags.s.type == 51) {
+ delete pSegment;
+ break;
+ }
+ m_pSegmentList->addItem(pSegment);
+ if(pPause && m_pPause && pPause->NeedToPauseNow()) {
+ m_PauseStep = 3;
+ m_ProcessiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;
+ return JBIG2_SUCCESS;
+ }
+ }
+ m_nSegmentDecoded = 0;
+ return decode_RandomOrgnazation(pPause);
+}
+FX_INT32 CJBig2_Context::decode_RandomOrgnazation(IFX_Pause* pPause)
+{
+ FX_INT32 nRet;
+ for(; m_nSegmentDecoded < m_pSegmentList->getLength(); m_nSegmentDecoded++) {
+ nRet = parseSegmentData(m_pSegmentList->getAt(m_nSegmentDecoded), pPause);
+ if((nRet == JBIG2_END_OF_PAGE) || (nRet == JBIG2_END_OF_FILE)) {
+ break;
+ } else if(nRet != JBIG2_SUCCESS) {
+ return nRet;
+ }
+ if(m_pPage && pPause && pPause->NeedToPauseNow()) {
+ m_PauseStep = 4;
+ m_ProcessiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;
+ return JBIG2_SUCCESS;
+ }
+ }
+ return JBIG2_SUCCESS;
+}
+FX_INT32 CJBig2_Context::getFirstPage(FX_BYTE *pBuf, FX_INT32 width, FX_INT32 height, FX_INT32 stride, IFX_Pause* pPause)
+{
+ FX_INT32 nRet = 0;
+ if(m_pGlobalContext) {
+ nRet = m_pGlobalContext->decode_EmbedOrgnazation(pPause);
+ if(nRet != JBIG2_SUCCESS) {
+ m_ProcessiveStatus = FXCODEC_STATUS_ERROR;
+ return nRet;
+ }
+ }
+ m_bFirstPage = TRUE;
+ m_PauseStep = 0;
+ if(m_pPage) {
+ delete m_pPage;
+ }
+ JBIG2_ALLOC(m_pPage, CJBig2_Image(width, height, stride, pBuf));
+ m_bBufSpecified = TRUE;
+ if(m_pPage && pPause && pPause->NeedToPauseNow()) {
+ m_PauseStep = 1;
+ m_ProcessiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;
+ return nRet;
+ }
+ int ret = Continue(pPause);
+ return ret;
+}
+FX_INT32 CJBig2_Context::Continue(IFX_Pause* pPause)
+{
+ m_ProcessiveStatus = FXCODEC_STATUS_DECODE_READY;
+ FX_INT32 nRet;
+ if(m_PauseStep <= 1) {
+ switch(m_nStreamType) {
+ case JBIG2_FILE_STREAM:
+ nRet = decodeFile(pPause);
+ break;
+ case JBIG2_SQUENTIAL_STREAM:
+ nRet = decode_SquentialOrgnazation(pPause);
+ break;
+ case JBIG2_RANDOM_STREAM:
+ if(m_bFirstPage) {
+ nRet = decode_RandomOrgnazation_FirstPage(pPause);
+ } else {
+ nRet = decode_RandomOrgnazation(pPause);
+ }
+ break;
+ case JBIG2_EMBED_STREAM:
+ nRet = decode_EmbedOrgnazation(pPause);
+ break;
+ default:
+ m_ProcessiveStatus = FXCODEC_STATUS_ERROR;
+ return JBIG2_ERROR_STREAM_TYPE;
+ }
+ } else if(m_PauseStep == 2) {
+ nRet = decode_SquentialOrgnazation(pPause);
+ } else if(m_PauseStep == 3) {
+ nRet = decode_RandomOrgnazation_FirstPage(pPause);
+ } else if(m_PauseStep == 4) {
+ nRet = decode_RandomOrgnazation(pPause);
+ } else if(m_PauseStep == 5) {
+ m_ProcessiveStatus = FXCODEC_STATUS_DECODE_FINISH;
+ return JBIG2_SUCCESS;
+ }
+ if(m_ProcessiveStatus == FXCODEC_STATUS_DECODE_TOBECONTINUE) {
+ return nRet;
+ }
+ m_PauseStep = 5;
+ if(!m_bBufSpecified && nRet == JBIG2_SUCCESS) {
+ m_ProcessiveStatus = FXCODEC_STATUS_DECODE_FINISH;
+ return JBIG2_SUCCESS;
+ }
+ if(nRet == JBIG2_SUCCESS) {
+ m_ProcessiveStatus = FXCODEC_STATUS_DECODE_FINISH;
+ } else {
+ m_ProcessiveStatus = FXCODEC_STATUS_ERROR;
+ }
+ return nRet;
+}
+FX_INT32 CJBig2_Context::getNextPage(FX_BYTE *pBuf, FX_INT32 width, FX_INT32 height, FX_INT32 stride, IFX_Pause* pPause)
+{
+ FX_INT32 nRet = JBIG2_ERROR_STREAM_TYPE;
+ m_bFirstPage = FALSE;
+ m_PauseStep = 0;
+ if(m_pPage) {
+ delete m_pPage;
+ }
+ JBIG2_ALLOC(m_pPage, CJBig2_Image(width, height, stride, pBuf));
+ m_bBufSpecified = TRUE;
+ if(m_pPage && pPause && pPause->NeedToPauseNow()) {
+ m_PauseStep = 1;
+ m_ProcessiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;
+ return nRet;
+ }
+ return Continue(pPause);
+ switch(m_nStreamType) {
+ case JBIG2_FILE_STREAM:
+ nRet = decodeFile(pPause);
+ break;
+ case JBIG2_SQUENTIAL_STREAM:
+ nRet = decode_SquentialOrgnazation(pPause);
+ break;
+ case JBIG2_RANDOM_STREAM:
+ nRet = decode_RandomOrgnazation(pPause);
+ break;
+ case JBIG2_EMBED_STREAM:
+ nRet = decode_EmbedOrgnazation(pPause);
+ break;
+ default:
+ return JBIG2_ERROR_STREAM_TYPE;
+ }
+ return nRet;
+}
+FX_INT32 CJBig2_Context::getFirstPage(CJBig2_Image **image, IFX_Pause* pPause)
+{
+ FX_INT32 nRet;
+ m_bFirstPage = TRUE;
+ m_PauseStep = 0;
+ if(m_pGlobalContext) {
+ nRet = m_pGlobalContext->decode_EmbedOrgnazation(pPause);
+ if(nRet != JBIG2_SUCCESS) {
+ return nRet;
+ }
+ }
+ m_bBufSpecified = FALSE;
+ return Continue(pPause);
+}
+FX_INT32 CJBig2_Context::getNextPage(CJBig2_Image **image, IFX_Pause* pPause)
+{
+ FX_INT32 nRet;
+ m_bBufSpecified = FALSE;
+ m_bFirstPage = FALSE;
+ m_PauseStep = 0;
+ switch(m_nStreamType) {
+ case JBIG2_FILE_STREAM:
+ nRet = decodeFile(pPause);
+ break;
+ case JBIG2_SQUENTIAL_STREAM:
+ nRet = decode_SquentialOrgnazation(pPause);
+ break;
+ case JBIG2_RANDOM_STREAM:
+ nRet = decode_RandomOrgnazation(pPause);
+ break;
+ case JBIG2_EMBED_STREAM:
+ nRet = decode_EmbedOrgnazation(pPause);
+ break;
+ default:
+ return JBIG2_ERROR_STREAM_TYPE;
+ }
+ if(nRet == JBIG2_SUCCESS) {
+ *image = m_pPage;
+ m_pPage = NULL;
+ return JBIG2_SUCCESS;
+ }
+ return nRet;
+}
+CJBig2_Segment *CJBig2_Context::findSegmentByNumber(FX_DWORD dwNumber)
+{
+ CJBig2_Segment *pSeg;
+ FX_INT32 i;
+ if(m_pGlobalContext) {
+ pSeg = m_pGlobalContext->findSegmentByNumber(dwNumber);
+ if(pSeg) {
+ return pSeg;
+ }
+ }
+ for(i = 0; i < m_pSegmentList->getLength(); i++) {
+ pSeg = m_pSegmentList->getAt(i);
+ if(pSeg->m_dwNumber == dwNumber) {
+ return pSeg;
+ }
+ }
+ return NULL;
+}
+CJBig2_Segment *CJBig2_Context::findReferredSegmentByTypeAndIndex(CJBig2_Segment *pSegment,
+ FX_BYTE cType, FX_INT32 nIndex)
+{
+ CJBig2_Segment *pSeg;
+ FX_INT32 i, count;
+ count = 0;
+ for(i = 0; i < pSegment->m_nReferred_to_segment_count; i++) {
+ pSeg = findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[i]);
+ if(pSeg && pSeg->m_cFlags.s.type == cType) {
+ if(count == nIndex) {
+ return pSeg;
+ } else {
+ count ++;
+ }
+ }
+ }
+ return NULL;
+}
+FX_INT32 CJBig2_Context::parseSegmentHeader(CJBig2_Segment *pSegment)
+{
+ FX_BYTE cSSize, cPSize;
+ FX_BYTE cTemp;
+ FX_WORD wTemp;
+ FX_DWORD dwTemp;
+ if((m_pStream->readInteger(&pSegment->m_dwNumber) != 0)
+ || (m_pStream->read1Byte(&pSegment->m_cFlags.c) != 0)) {
+ goto failed;
+ }
+ cTemp = m_pStream->getCurByte();
+ if((cTemp >> 5) == 7) {
+ if(m_pStream->readInteger((FX_DWORD*)&pSegment->m_nReferred_to_segment_count) != 0) {
+ goto failed;
+ }
+ pSegment->m_nReferred_to_segment_count &= 0x1fffffff;
+ if (pSegment->m_nReferred_to_segment_count > JBIG2_MAX_REFERRED_SEGMENT_COUNT) {
+ m_pModule->JBig2_Error("Too many referred segments.");
+ return JBIG2_ERROR_LIMIT;
+ }
+ dwTemp = 5 + 4 + (pSegment->m_nReferred_to_segment_count + 1) / 8;
+ } else {
+ if(m_pStream->read1Byte(&cTemp) != 0) {
+ goto failed;
+ }
+ pSegment->m_nReferred_to_segment_count = cTemp >> 5;
+ dwTemp = 5 + 1;
+ }
+ cSSize = pSegment->m_dwNumber > 65536 ? 4 : pSegment->m_dwNumber > 256 ? 2 : 1;
+ cPSize = pSegment->m_cFlags.s.page_association_size ? 4 : 1;
+ if(pSegment->m_nReferred_to_segment_count) {
+ pSegment->m_pReferred_to_segment_numbers = (FX_DWORD*)m_pModule->JBig2_Malloc2(
+ sizeof(FX_DWORD), pSegment->m_nReferred_to_segment_count);
+ for(FX_INT32 i = 0; i < pSegment->m_nReferred_to_segment_count; i++) {
+ switch(cSSize) {
+ case 1:
+ if(m_pStream->read1Byte(&cTemp) != 0) {
+ goto failed;
+ }
+ pSegment->m_pReferred_to_segment_numbers[i] = cTemp;
+ break;
+ case 2:
+ if(m_pStream->readShortInteger(&wTemp) != 0) {
+ goto failed;
+ }
+ pSegment->m_pReferred_to_segment_numbers[i] = wTemp;
+ break;
+ case 4:
+ if(m_pStream->readInteger(&dwTemp) != 0) {
+ goto failed;
+ }
+ pSegment->m_pReferred_to_segment_numbers[i] = dwTemp;
+ break;
+ }
+ if (pSegment->m_pReferred_to_segment_numbers[i] >= pSegment->m_dwNumber) {
+ m_pModule->JBig2_Error("The referred segment number is greater than this segment number.");
+ goto failed;
+ }
+ }
+ }
+ if(cPSize == 1) {
+ if(m_pStream->read1Byte(&cTemp) != 0) {
+ goto failed;
+ }
+ pSegment->m_dwPage_association = cTemp;
+ } else {
+ if(m_pStream->readInteger(&pSegment->m_dwPage_association) != 0) {
+ goto failed;
+ }
+ }
+ if(m_pStream->readInteger(&pSegment->m_dwData_length) != 0) {
+ goto failed;
+ }
+ pSegment->m_pData = m_pStream->getPointer();
+ pSegment->m_State = JBIG2_SEGMENT_DATA_UNPARSED;
+ return JBIG2_SUCCESS;
+failed:
+ m_pModule->JBig2_Error("header too short.");
+ return JBIG2_ERROR_TOO_SHORT;
+}
+FX_INT32 CJBig2_Context::parseSegmentData(CJBig2_Segment *pSegment, IFX_Pause* pPause)
+{
+ FX_INT32 ret = ProcessiveParseSegmentData(pSegment, pPause);
+ while(m_ProcessiveStatus == FXCODEC_STATUS_DECODE_TOBECONTINUE && m_pStream->getByteLeft() > 0) {
+ ret = ProcessiveParseSegmentData(pSegment, pPause);
+ }
+ return ret;
+}
+FX_INT32 CJBig2_Context::ProcessiveParseSegmentData(CJBig2_Segment *pSegment, IFX_Pause* pPause)
+{
+ switch(pSegment->m_cFlags.s.type) {
+ case 0:
+ return parseSymbolDict(pSegment, pPause);
+ case 4:
+ case 6:
+ case 7:
+ if(m_nState == JBIG2_OUT_OF_PAGE) {
+ goto failed2;
+ } else {
+ return parseTextRegion(pSegment);
+ }
+ case 16:
+ return parsePatternDict(pSegment, pPause);
+ case 20:
+ case 22:
+ case 23:
+ if(m_nState == JBIG2_OUT_OF_PAGE) {
+ goto failed2;
+ } else {
+ return parseHalftoneRegion(pSegment, pPause);
+ }
+ case 36:
+ case 38:
+ case 39:
+ if(m_nState == JBIG2_OUT_OF_PAGE) {
+ goto failed2;
+ } else {
+ return parseGenericRegion(pSegment, pPause);
+ }
+ case 40:
+ case 42:
+ case 43:
+ if(m_nState == JBIG2_OUT_OF_PAGE) {
+ goto failed2;
+ } else {
+ return parseGenericRefinementRegion(pSegment);
+ }
+ case 48: {
+ FX_WORD wTemp;
+ JBig2PageInfo *pPageInfo;
+ JBIG2_ALLOC(pPageInfo, JBig2PageInfo);
+ if((m_pStream->readInteger(&pPageInfo->m_dwWidth) != 0)
+ || (m_pStream->readInteger(&pPageInfo->m_dwHeight) != 0)
+ || (m_pStream->readInteger(&pPageInfo->m_dwResolutionX) != 0)
+ || (m_pStream->readInteger(&pPageInfo->m_dwResolutionY) != 0)
+ || (m_pStream->read1Byte(&pPageInfo->m_cFlags) != 0)
+ || (m_pStream->readShortInteger(&wTemp) != 0)) {
+ delete pPageInfo;
+ goto failed1;
+ }
+ pPageInfo->m_bIsStriped = ((wTemp >> 15) & 1) ? 1 : 0;
+ pPageInfo->m_wMaxStripeSize = wTemp & 0x7fff;
+ if((pPageInfo->m_dwHeight == 0xffffffff) && (pPageInfo->m_bIsStriped != 1)) {
+ m_pModule->JBig2_Warn("page height = 0xffffffff buf stripe field is 0");
+ pPageInfo->m_bIsStriped = 1;
+ }
+ if(!m_bBufSpecified) {
+ if(m_pPage) {
+ delete m_pPage;
+ }
+ if(pPageInfo->m_dwHeight == 0xffffffff) {
+ JBIG2_ALLOC(m_pPage, CJBig2_Image(pPageInfo->m_dwWidth, pPageInfo->m_wMaxStripeSize));
+ } else {
+ JBIG2_ALLOC(m_pPage, CJBig2_Image(pPageInfo->m_dwWidth, pPageInfo->m_dwHeight));
+ }
+ }
+ m_pPage->fill((pPageInfo->m_cFlags & 4) ? 1 : 0);
+ m_pPageInfoList->addItem(pPageInfo);
+ m_nState = JBIG2_IN_PAGE;
+ }
+ break;
+ case 49:
+ m_nState = JBIG2_OUT_OF_PAGE;
+ return JBIG2_END_OF_PAGE;
+ break;
+ case 50:
+ m_pStream->offset(pSegment->m_dwData_length);
+ break;
+ case 51:
+ return JBIG2_END_OF_FILE;
+ case 52:
+ m_pStream->offset(pSegment->m_dwData_length);
+ break;
+ case 53:
+ return parseTable(pSegment);
+ case 62:
+ m_pStream->offset(pSegment->m_dwData_length);
+ break;
+ default:
+ break;
+ }
+ return JBIG2_SUCCESS;
+failed1:
+ m_pModule->JBig2_Error("segment data too short.");
+ return JBIG2_ERROR_TOO_SHORT;
+failed2:
+ m_pModule->JBig2_Error("segment syntax error.");
+ return JBIG2_ERROR_FETAL;
+}
+FX_INT32 CJBig2_Context::parseSymbolDict(CJBig2_Segment *pSegment, IFX_Pause* pPause)
+{
+ FX_DWORD dwTemp;
+ FX_WORD wFlags;
+ FX_BYTE cSDHUFFDH, cSDHUFFDW, cSDHUFFBMSIZE, cSDHUFFAGGINST;
+ CJBig2_HuffmanTable *Table_B1 = NULL, *Table_B2 = NULL, *Table_B3 = NULL, *Table_B4 = NULL, *Table_B5 = NULL;
+ FX_INT32 i, nIndex, nRet;
+ CJBig2_Segment *pSeg = NULL, *pLRSeg = NULL;
+ FX_BOOL bUsed;
+ CJBig2_Image ** SDINSYMS = NULL;
+ CJBig2_SDDProc *pSymbolDictDecoder;
+ JBig2ArithCtx *gbContext = NULL, *grContext = NULL;
+ CJBig2_ArithDecoder *pArithDecoder;
+ JBIG2_ALLOC(pSymbolDictDecoder, CJBig2_SDDProc());
+ if(m_pStream->readShortInteger(&wFlags) != 0) {
+ m_pModule->JBig2_Error("symbol dictionary segment : data header too short.");
+ nRet = JBIG2_ERROR_TOO_SHORT;
+ goto failed;
+ }
+ pSymbolDictDecoder->SDHUFF = wFlags & 0x0001;
+ pSymbolDictDecoder->SDREFAGG = (wFlags >> 1) & 0x0001;
+ pSymbolDictDecoder->SDTEMPLATE = (wFlags >> 10) & 0x0003;
+ pSymbolDictDecoder->SDRTEMPLATE = (wFlags >> 12) & 0x0003;
+ cSDHUFFDH = (wFlags >> 2) & 0x0003;
+ cSDHUFFDW = (wFlags >> 4) & 0x0003;
+ cSDHUFFBMSIZE = (wFlags >> 6) & 0x0001;
+ cSDHUFFAGGINST = (wFlags >> 7) & 0x0001;
+ if(pSymbolDictDecoder->SDHUFF == 0) {
+ if(pSymbolDictDecoder->SDTEMPLATE == 0) {
+ dwTemp = 8;
+ } else {
+ dwTemp = 2;
+ }
+ for(i = 0; i < (FX_INT32)dwTemp; i++) {
+ if(m_pStream->read1Byte((FX_BYTE*)&pSymbolDictDecoder->SDAT[i]) != 0) {
+ m_pModule->JBig2_Error("symbol dictionary segment : data header too short.");
+ nRet = JBIG2_ERROR_TOO_SHORT;
+ goto failed;
+ }
+ }
+ }
+ if((pSymbolDictDecoder->SDREFAGG == 1) && (pSymbolDictDecoder->SDRTEMPLATE == 0)) {
+ for(i = 0; i < 4; i++) {
+ if(m_pStream->read1Byte((FX_BYTE*)&pSymbolDictDecoder->SDRAT[i]) != 0) {
+ m_pModule->JBig2_Error("symbol dictionary segment : data header too short.");
+ nRet = JBIG2_ERROR_TOO_SHORT;
+ goto failed;
+ }
+ }
+ }
+ if((m_pStream->readInteger(&pSymbolDictDecoder->SDNUMEXSYMS) != 0)
+ || (m_pStream->readInteger(&pSymbolDictDecoder->SDNUMNEWSYMS) != 0)) {
+ m_pModule->JBig2_Error("symbol dictionary segment : data header too short.");
+ nRet = JBIG2_ERROR_TOO_SHORT;
+ goto failed;
+ }
+ if (pSymbolDictDecoder->SDNUMEXSYMS > JBIG2_MAX_EXPORT_SYSMBOLS
+ || pSymbolDictDecoder->SDNUMNEWSYMS > JBIG2_MAX_NEW_SYSMBOLS) {
+ m_pModule->JBig2_Error("symbol dictionary segment : too many export/new symbols.");
+ nRet = JBIG2_ERROR_LIMIT;
+ goto failed;
+ }
+ for(i = 0; i < pSegment->m_nReferred_to_segment_count; i++) {
+ if(!findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[i])) {
+ m_pModule->JBig2_Error("symbol dictionary segment : can't find refered to segments");
+ nRet = JBIG2_ERROR_FETAL;
+ goto failed;
+ }
+ }
+ pSymbolDictDecoder->SDNUMINSYMS = 0;
+ for(i = 0; i < pSegment->m_nReferred_to_segment_count; i++) {
+ pSeg = findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[i]);
+ if(pSeg->m_cFlags.s.type == 0) {
+ pSymbolDictDecoder->SDNUMINSYMS += pSeg->m_Result.sd->SDNUMEXSYMS;
+ pLRSeg = pSeg;
+ }
+ }
+ if(pSymbolDictDecoder->SDNUMINSYMS == 0) {
+ SDINSYMS = NULL;
+ } else {
+ SDINSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(
+ sizeof(CJBig2_Image*), pSymbolDictDecoder->SDNUMINSYMS);
+ dwTemp = 0;
+ for(i = 0; i < pSegment->m_nReferred_to_segment_count; i++) {
+ pSeg = findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[i]);
+ if(pSeg->m_cFlags.s.type == 0) {
+ JBIG2_memcpy(SDINSYMS + dwTemp, pSeg->m_Result.sd->SDEXSYMS,
+ pSeg->m_Result.sd->SDNUMEXSYMS * sizeof(CJBig2_Image*));
+ dwTemp += pSeg->m_Result.sd->SDNUMEXSYMS;
+ }
+ }
+ }
+ pSymbolDictDecoder->SDINSYMS = SDINSYMS;
+ if(pSymbolDictDecoder->SDHUFF == 1) {
+ if((cSDHUFFDH == 2) || (cSDHUFFDW == 2)) {
+ m_pModule->JBig2_Error("symbol dictionary segment : SDHUFFDH=2 or SDHUFFDW=2 is not permitted.");
+ nRet = JBIG2_ERROR_FETAL;
+ goto failed;
+ }
+ nIndex = 0;
+ if(cSDHUFFDH == 0) {
+ JBIG2_ALLOC(Table_B4, CJBig2_HuffmanTable(HuffmanTable_B4,
+ sizeof(HuffmanTable_B4) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B4));
+ pSymbolDictDecoder->SDHUFFDH = Table_B4;
+ } else if(cSDHUFFDH == 1) {
+ JBIG2_ALLOC(Table_B5, CJBig2_HuffmanTable(HuffmanTable_B5,
+ sizeof(HuffmanTable_B5) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B5));
+ pSymbolDictDecoder->SDHUFFDH = Table_B5;
+ } else {
+ pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++);
+ if(!pSeg) {
+ m_pModule->JBig2_Error("symbol dictionary segment : SDHUFFDH can't find user supplied table.");
+ nRet = JBIG2_ERROR_FETAL;
+ goto failed;
+ }
+ pSymbolDictDecoder->SDHUFFDH = pSeg->m_Result.ht;
+ }
+ if(cSDHUFFDW == 0) {
+ JBIG2_ALLOC(Table_B2, CJBig2_HuffmanTable(HuffmanTable_B2,
+ sizeof(HuffmanTable_B2) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B2));
+ pSymbolDictDecoder->SDHUFFDW = Table_B2;
+ } else if(cSDHUFFDW == 1) {
+ JBIG2_ALLOC(Table_B3, CJBig2_HuffmanTable(HuffmanTable_B3,
+ sizeof(HuffmanTable_B3) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B3));
+ pSymbolDictDecoder->SDHUFFDW = Table_B3;
+ } else {
+ pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++);
+ if(!pSeg) {
+ m_pModule->JBig2_Error("symbol dictionary segment : SDHUFFDW can't find user supplied table.");
+ nRet = JBIG2_ERROR_FETAL;
+ goto failed;
+ }
+ pSymbolDictDecoder->SDHUFFDW = pSeg->m_Result.ht;
+ }
+ if(cSDHUFFBMSIZE == 0) {
+ JBIG2_ALLOC(Table_B1, CJBig2_HuffmanTable(HuffmanTable_B1,
+ sizeof(HuffmanTable_B1) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B1));
+ pSymbolDictDecoder->SDHUFFBMSIZE = Table_B1;
+ } else {
+ pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++);
+ if(!pSeg) {
+ m_pModule->JBig2_Error("symbol dictionary segment : SDHUFFBMSIZE can't find user supplied table.");
+ nRet = JBIG2_ERROR_FETAL;
+ goto failed;
+ }
+ pSymbolDictDecoder->SDHUFFBMSIZE = pSeg->m_Result.ht;
+ }
+ if(pSymbolDictDecoder->SDREFAGG == 1) {
+ if(cSDHUFFAGGINST == 0) {
+ if(!Table_B1) {
+ JBIG2_ALLOC(Table_B1, CJBig2_HuffmanTable(HuffmanTable_B1,
+ sizeof(HuffmanTable_B1) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B1));
+ }
+ pSymbolDictDecoder->SDHUFFAGGINST = Table_B1;
+ } else {
+ pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++);
+ if(!pSeg) {
+ m_pModule->JBig2_Error("symbol dictionary segment : SDHUFFAGGINST can't find user supplied table.");
+ nRet = JBIG2_ERROR_FETAL;
+ goto failed;
+ }
+ pSymbolDictDecoder->SDHUFFAGGINST = pSeg->m_Result.ht;
+ }
+ }
+ }
+ if((wFlags & 0x0100) && pLRSeg && pLRSeg->m_Result.sd->m_bContextRetained) {
+ if (pSymbolDictDecoder->SDHUFF == 0) {
+ dwTemp = pSymbolDictDecoder->SDTEMPLATE == 0 ? 65536 : pSymbolDictDecoder->SDTEMPLATE == 1 ?
+ 8192 : 1024;
+ gbContext = (JBig2ArithCtx*)m_pModule->JBig2_Malloc2(sizeof(JBig2ArithCtx), dwTemp);
+ JBIG2_memcpy(gbContext, pLRSeg->m_Result.sd->m_gbContext, sizeof(JBig2ArithCtx)*dwTemp);
+ }
+ if (pSymbolDictDecoder->SDREFAGG == 1) {
+ dwTemp = pSymbolDictDecoder->SDRTEMPLATE ? 1 << 10 : 1 << 13;
+ grContext = (JBig2ArithCtx*)m_pModule->JBig2_Malloc2(sizeof(JBig2ArithCtx), dwTemp);
+ JBIG2_memcpy(grContext, pLRSeg->m_Result.sd->m_grContext, sizeof(JBig2ArithCtx)*dwTemp);
+ }
+ } else {
+ if (pSymbolDictDecoder->SDHUFF == 0) {
+ dwTemp = pSymbolDictDecoder->SDTEMPLATE == 0 ? 65536 : pSymbolDictDecoder->SDTEMPLATE == 1 ?
+ 8192 : 1024;
+ gbContext = (JBig2ArithCtx*)m_pModule->JBig2_Malloc2(sizeof(JBig2ArithCtx), dwTemp);
+ JBIG2_memset(gbContext, 0, sizeof(JBig2ArithCtx)*dwTemp);
+ }
+ if (pSymbolDictDecoder->SDREFAGG == 1) {
+ dwTemp = pSymbolDictDecoder->SDRTEMPLATE ? 1 << 10 : 1 << 13;
+ grContext = (JBig2ArithCtx*)m_pModule->JBig2_Malloc2(sizeof(JBig2ArithCtx), dwTemp);
+ JBIG2_memset(grContext, 0, sizeof(JBig2ArithCtx)*dwTemp);
+ }
+ }
+ pSegment->m_nResultType = JBIG2_SYMBOL_DICT_POINTER;
+ if(pSymbolDictDecoder->SDHUFF == 0) {
+ JBIG2_ALLOC(pArithDecoder, CJBig2_ArithDecoder(m_pStream));
+ pSegment->m_Result.sd = pSymbolDictDecoder->decode_Arith(pArithDecoder, gbContext, grContext);
+ delete pArithDecoder;
+ if(pSegment->m_Result.sd == NULL) {
+ nRet = JBIG2_ERROR_FETAL;
+ goto failed;
+ }
+ m_pStream->alignByte();
+ m_pStream->offset(2);
+ } else {
+ pSegment->m_Result.sd = pSymbolDictDecoder->decode_Huffman(m_pStream, gbContext, grContext, pPause);
+ if(pSegment->m_Result.sd == NULL) {
+ nRet = JBIG2_ERROR_FETAL;
+ goto failed;
+ }
+ m_pStream->alignByte();
+ }
+ if(wFlags & 0x0200) {
+ pSegment->m_Result.sd->m_bContextRetained = TRUE;
+ if(pSymbolDictDecoder->SDHUFF == 0) {
+ pSegment->m_Result.sd->m_gbContext = gbContext;
+ }
+ if(pSymbolDictDecoder->SDREFAGG == 1) {
+ pSegment->m_Result.sd->m_grContext = grContext;
+ }
+ bUsed = TRUE;
+ } else {
+ bUsed = FALSE;
+ }
+ delete pSymbolDictDecoder;
+ if(SDINSYMS) {
+ m_pModule->JBig2_Free(SDINSYMS);
+ }
+ if(Table_B1) {
+ delete Table_B1;
+ }
+ if(Table_B2) {
+ delete Table_B2;
+ }
+ if(Table_B3) {
+ delete Table_B3;
+ }
+ if(Table_B4) {
+ delete Table_B4;
+ }
+ if(Table_B5) {
+ delete Table_B5;
+ }
+ if(bUsed == FALSE) {
+ if(gbContext) {
+ m_pModule->JBig2_Free(gbContext);
+ }
+ if(grContext) {
+ m_pModule->JBig2_Free(grContext);
+ }
+ }
+ return JBIG2_SUCCESS;
+failed:
+ delete pSymbolDictDecoder;
+ if(SDINSYMS) {
+ m_pModule->JBig2_Free(SDINSYMS);
+ }
+ if(Table_B1) {
+ delete Table_B1;
+ }
+ if(Table_B2) {
+ delete Table_B2;
+ }
+ if(Table_B3) {
+ delete Table_B3;
+ }
+ if(Table_B4) {
+ delete Table_B4;
+ }
+ if(Table_B5) {
+ delete Table_B5;
+ }
+ if(gbContext) {
+ m_pModule->JBig2_Free(gbContext);
+ }
+ if(grContext) {
+ m_pModule->JBig2_Free(grContext);
+ }
+ return nRet;
+}
+
+FX_BOOL CJBig2_Context::parseTextRegion(CJBig2_Segment *pSegment)
+{
+ FX_DWORD dwTemp;
+ FX_WORD wFlags;
+ FX_INT32 i, nIndex, nRet;
+ JBig2RegionInfo ri;
+ CJBig2_Segment *pSeg;
+ CJBig2_Image **SBSYMS = NULL;
+ JBig2HuffmanCode *SBSYMCODES = NULL;
+ FX_BYTE cSBHUFFFS, cSBHUFFDS, cSBHUFFDT, cSBHUFFRDW, cSBHUFFRDH, cSBHUFFRDX, cSBHUFFRDY, cSBHUFFRSIZE;
+ CJBig2_HuffmanTable *Table_B1 = NULL,
+ *Table_B6 = NULL,
+ *Table_B7 = NULL,
+ *Table_B8 = NULL,
+ *Table_B9 = NULL,
+ *Table_B10 = NULL,
+ *Table_B11 = NULL,
+ *Table_B12 = NULL,
+ *Table_B13 = NULL,
+ *Table_B14 = NULL,
+ *Table_B15 = NULL;
+ JBig2ArithCtx *grContext = NULL;
+ CJBig2_ArithDecoder *pArithDecoder;
+ CJBig2_TRDProc *pTRD;
+ JBIG2_ALLOC(pTRD, CJBig2_TRDProc());
+ if((parseRegionInfo(&ri) != JBIG2_SUCCESS)
+ || (m_pStream->readShortInteger(&wFlags) != 0)) {
+ m_pModule->JBig2_Error("text region segment : data header too short.");
+ nRet = JBIG2_ERROR_TOO_SHORT;
+ goto failed;
+ }
+ pTRD->SBW = ri.width;
+ pTRD->SBH = ri.height;
+ pTRD->SBHUFF = wFlags & 0x0001;
+ pTRD->SBREFINE = (wFlags >> 1) & 0x0001;
+ dwTemp = (wFlags >> 2) & 0x0003;
+ pTRD->SBSTRIPS = 1 << dwTemp;
+ pTRD->REFCORNER = (JBig2Corner)((wFlags >> 4) & 0x0003);
+ pTRD->TRANSPOSED = (wFlags >> 6) & 0x0001;
+ pTRD->SBCOMBOP = (JBig2ComposeOp)((wFlags >> 7) & 0x0003);
+ pTRD->SBDEFPIXEL = (wFlags >> 9) & 0x0001;
+ pTRD->SBDSOFFSET = (wFlags >> 10) & 0x001f;
+ if(pTRD->SBDSOFFSET >= 0x0010) {
+ pTRD->SBDSOFFSET = pTRD->SBDSOFFSET - 0x0020;
+ }
+ pTRD->SBRTEMPLATE = (wFlags >> 15) & 0x0001;
+ if(pTRD->SBHUFF == 1) {
+ if(m_pStream->readShortInteger(&wFlags) != 0) {
+ m_pModule->JBig2_Error("text region segment : data header too short.");
+ nRet = JBIG2_ERROR_TOO_SHORT;
+ goto failed;
+ }
+ cSBHUFFFS = wFlags & 0x0003;
+ cSBHUFFDS = (wFlags >> 2) & 0x0003;
+ cSBHUFFDT = (wFlags >> 4) & 0x0003;
+ cSBHUFFRDW = (wFlags >> 6) & 0x0003;
+ cSBHUFFRDH = (wFlags >> 8) & 0x0003;
+ cSBHUFFRDX = (wFlags >> 10) & 0x0003;
+ cSBHUFFRDY = (wFlags >> 12) & 0x0003;
+ cSBHUFFRSIZE = (wFlags >> 14) & 0x0001;
+ }
+ if((pTRD->SBREFINE == 1) && (pTRD->SBRTEMPLATE == 0)) {
+ for(i = 0; i < 4; i++) {
+ if(m_pStream->read1Byte((FX_BYTE*)&pTRD->SBRAT[i]) != 0) {
+ m_pModule->JBig2_Error("text region segment : data header too short.");
+ nRet = JBIG2_ERROR_TOO_SHORT;
+ goto failed;
+ }
+ }
+ }
+ if(m_pStream->readInteger(&pTRD->SBNUMINSTANCES) != 0) {
+ m_pModule->JBig2_Error("text region segment : data header too short.");
+ nRet = JBIG2_ERROR_TOO_SHORT;
+ goto failed;
+ }
+ for(i = 0; i < pSegment->m_nReferred_to_segment_count; i++) {
+ if(!findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[i])) {
+ m_pModule->JBig2_Error("text region segment : can't find refered to segments");
+ nRet = JBIG2_ERROR_FETAL;
+ goto failed;
+ }
+ }
+ pTRD->SBNUMSYMS = 0;
+ for(i = 0; i < pSegment->m_nReferred_to_segment_count; i++) {
+ pSeg = findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[i]);
+ if(pSeg->m_cFlags.s.type == 0) {
+ pTRD->SBNUMSYMS += pSeg->m_Result.sd->SDNUMEXSYMS;
+ }
+ }
+ if (pTRD->SBNUMSYMS > 0) {
+ SBSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(
+ sizeof(CJBig2_Image*), pTRD->SBNUMSYMS);
+ dwTemp = 0;
+ for(i = 0; i < pSegment->m_nReferred_to_segment_count; i++) {
+ pSeg = findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[i]);
+ if(pSeg->m_cFlags.s.type == 0) {
+ JBIG2_memcpy(SBSYMS + dwTemp, pSeg->m_Result.sd->SDEXSYMS,
+ pSeg->m_Result.sd->SDNUMEXSYMS * sizeof(CJBig2_Image*));
+ dwTemp += pSeg->m_Result.sd->SDNUMEXSYMS;
+ }
+ }
+ pTRD->SBSYMS = SBSYMS;
+ } else {
+ pTRD->SBSYMS = NULL;
+ }
+ if(pTRD->SBHUFF == 1) {
+ SBSYMCODES = decodeSymbolIDHuffmanTable(m_pStream, pTRD->SBNUMSYMS);
+ if(SBSYMCODES == NULL) {
+ m_pModule->JBig2_Error("text region segment: symbol ID huffman table decode failure!");
+ nRet = JBIG2_ERROR_FETAL;
+ goto failed;
+ }
+ m_pStream->alignByte();
+ pTRD->SBSYMCODES = SBSYMCODES;
+ } else {
+ dwTemp = 0;
+ while((FX_DWORD)(1 << dwTemp) < pTRD->SBNUMSYMS) {
+ dwTemp ++;
+ }
+ pTRD->SBSYMCODELEN = (FX_BYTE)dwTemp;
+ }
+ if(pTRD->SBHUFF == 1) {
+ if((cSBHUFFFS == 2) || (cSBHUFFRDW == 2) || (cSBHUFFRDH == 2)
+ || (cSBHUFFRDX == 2) || (cSBHUFFRDY == 2)) {
+ m_pModule->JBig2_Error("text region segment : SBHUFFFS=2 or SBHUFFRDW=2 or "
+ "SBHUFFRDH=2 or SBHUFFRDX=2 or SBHUFFRDY=2 is not permitted");
+ nRet = JBIG2_ERROR_FETAL;
+ goto failed;
+ }
+ nIndex = 0;
+ if(cSBHUFFFS == 0) {
+ JBIG2_ALLOC(Table_B6, CJBig2_HuffmanTable(HuffmanTable_B6,
+ sizeof(HuffmanTable_B6) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B6));
+ pTRD->SBHUFFFS = Table_B6;
+ } else if(cSBHUFFFS == 1) {
+ JBIG2_ALLOC(Table_B7, CJBig2_HuffmanTable(HuffmanTable_B7,
+ sizeof(HuffmanTable_B7) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B7));
+ pTRD->SBHUFFFS = Table_B7;
+ } else {
+ pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++);
+ if(!pSeg) {
+ m_pModule->JBig2_Error("text region segment : SBHUFFFS can't find user supplied table");
+ nRet = JBIG2_ERROR_FETAL;
+ goto failed;
+ }
+ pTRD->SBHUFFFS = pSeg->m_Result.ht;
+ }
+ if(cSBHUFFDS == 0) {
+ JBIG2_ALLOC(Table_B8, CJBig2_HuffmanTable(HuffmanTable_B8,
+ sizeof(HuffmanTable_B8) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B8));
+ pTRD->SBHUFFDS = Table_B8;
+ } else if(cSBHUFFDS == 1) {
+ JBIG2_ALLOC(Table_B9, CJBig2_HuffmanTable(HuffmanTable_B9,
+ sizeof(HuffmanTable_B9) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B9));
+ pTRD->SBHUFFDS = Table_B9;
+ } else if(cSBHUFFDS == 2) {
+ JBIG2_ALLOC(Table_B10, CJBig2_HuffmanTable(HuffmanTable_B10,
+ sizeof(HuffmanTable_B10) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B10));
+ pTRD->SBHUFFDS = Table_B10;
+ } else {
+ pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++);
+ if(!pSeg) {
+ m_pModule->JBig2_Error("text region segment : SBHUFFDS can't find user supplied table");
+ nRet = JBIG2_ERROR_FETAL;
+ goto failed;
+ }
+ pTRD->SBHUFFDS = pSeg->m_Result.ht;
+ }
+ if(cSBHUFFDT == 0) {
+ JBIG2_ALLOC(Table_B11, CJBig2_HuffmanTable(HuffmanTable_B11,
+ sizeof(HuffmanTable_B11) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B11));
+ pTRD->SBHUFFDT = Table_B11;
+ } else if(cSBHUFFDT == 1) {
+ JBIG2_ALLOC(Table_B12, CJBig2_HuffmanTable(HuffmanTable_B12,
+ sizeof(HuffmanTable_B12) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B12));
+ pTRD->SBHUFFDT = Table_B12;
+ } else if(cSBHUFFDT == 2) {
+ JBIG2_ALLOC(Table_B13, CJBig2_HuffmanTable(HuffmanTable_B13,
+ sizeof(HuffmanTable_B13) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B13));
+ pTRD->SBHUFFDT = Table_B13;
+ } else {
+ pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++);
+ if(!pSeg) {
+ m_pModule->JBig2_Error("text region segment : SBHUFFDT can't find user supplied table");
+ nRet = JBIG2_ERROR_FETAL;
+ goto failed;
+ }
+ pTRD->SBHUFFDT = pSeg->m_Result.ht;
+ }
+ if(cSBHUFFRDW == 0) {
+ JBIG2_ALLOC(Table_B14, CJBig2_HuffmanTable(HuffmanTable_B14,
+ sizeof(HuffmanTable_B14) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B14));
+ pTRD->SBHUFFRDW = Table_B14;
+ } else if(cSBHUFFRDW == 1) {
+ JBIG2_ALLOC(Table_B15, CJBig2_HuffmanTable(HuffmanTable_B15,
+ sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B15));
+ pTRD->SBHUFFRDW = Table_B15;
+ } else {
+ pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++);
+ if(!pSeg) {
+ m_pModule->JBig2_Error("text region segment : SBHUFFRDW can't find user supplied table");
+ nRet = JBIG2_ERROR_FETAL;
+ goto failed;
+ }
+ pTRD->SBHUFFRDW = pSeg->m_Result.ht;
+ }
+ if(cSBHUFFRDH == 0) {
+ if(!Table_B14) {
+ JBIG2_ALLOC(Table_B14, CJBig2_HuffmanTable(HuffmanTable_B14,
+ sizeof(HuffmanTable_B14) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B14));
+ }
+ pTRD->SBHUFFRDH = Table_B14;
+ } else if(cSBHUFFRDH == 1) {
+ if(!Table_B15) {
+ JBIG2_ALLOC(Table_B15, CJBig2_HuffmanTable(HuffmanTable_B15,
+ sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B15));
+ }
+ pTRD->SBHUFFRDH = Table_B15;
+ } else {
+ pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++);
+ if(!pSeg) {
+ m_pModule->JBig2_Error("text region segment : SBHUFFRDH can't find user supplied table");
+ nRet = JBIG2_ERROR_FETAL;
+ goto failed;
+ }
+ pTRD->SBHUFFRDH = pSeg->m_Result.ht;
+ }
+ if(cSBHUFFRDX == 0) {
+ if(!Table_B14) {
+ JBIG2_ALLOC(Table_B14, CJBig2_HuffmanTable(HuffmanTable_B14,
+ sizeof(HuffmanTable_B14) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B14));
+ }
+ pTRD->SBHUFFRDX = Table_B14;
+ } else if(cSBHUFFRDX == 1) {
+ if(!Table_B15) {
+ JBIG2_ALLOC(Table_B15, CJBig2_HuffmanTable(HuffmanTable_B15,
+ sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B15));
+ }
+ pTRD->SBHUFFRDX = Table_B15;
+ } else {
+ pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++);
+ if(!pSeg) {
+ m_pModule->JBig2_Error("text region segment : SBHUFFRDX can't find user supplied table");
+ nRet = JBIG2_ERROR_FETAL;
+ goto failed;
+ }
+ pTRD->SBHUFFRDX = pSeg->m_Result.ht;
+ }
+ if(cSBHUFFRDY == 0) {
+ if(!Table_B14) {
+ JBIG2_ALLOC(Table_B14, CJBig2_HuffmanTable(HuffmanTable_B14,
+ sizeof(HuffmanTable_B14) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B14));
+ }
+ pTRD->SBHUFFRDY = Table_B14;
+ } else if(cSBHUFFRDY == 1) {
+ if(!Table_B15) {
+ JBIG2_ALLOC(Table_B15, CJBig2_HuffmanTable(HuffmanTable_B15,
+ sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B15));
+ }
+ pTRD->SBHUFFRDY = Table_B15;
+ } else {
+ pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++);
+ if(!pSeg) {
+ m_pModule->JBig2_Error("text region segment : SBHUFFRDY can't find user supplied table");
+ nRet = JBIG2_ERROR_FETAL;
+ goto failed;
+ }
+ pTRD->SBHUFFRDY = pSeg->m_Result.ht;
+ }
+ if(cSBHUFFRSIZE == 0) {
+ JBIG2_ALLOC(Table_B1, CJBig2_HuffmanTable(HuffmanTable_B1,
+ sizeof(HuffmanTable_B1) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B1));
+ pTRD->SBHUFFRSIZE = Table_B1;
+ } else {
+ pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++);
+ if(!pSeg) {
+ m_pModule->JBig2_Error("text region segment : SBHUFFRSIZE can't find user supplied table");
+ nRet = JBIG2_ERROR_FETAL;
+ goto failed;
+ }
+ pTRD->SBHUFFRSIZE = pSeg->m_Result.ht;
+ }
+ }
+ if(pTRD->SBREFINE == 1) {
+ dwTemp = pTRD->SBRTEMPLATE ? 1 << 10 : 1 << 13;
+ grContext = (JBig2ArithCtx*)m_pModule->JBig2_Malloc2(sizeof(JBig2ArithCtx), dwTemp);
+ JBIG2_memset(grContext, 0, sizeof(JBig2ArithCtx)*dwTemp);
+ }
+ if(pTRD->SBHUFF == 0) {
+ JBIG2_ALLOC(pArithDecoder, CJBig2_ArithDecoder(m_pStream));
+ pSegment->m_nResultType = JBIG2_IMAGE_POINTER;
+ pSegment->m_Result.im = pTRD->decode_Arith(pArithDecoder, grContext);
+ delete pArithDecoder;
+ if(pSegment->m_Result.im == NULL) {
+ nRet = JBIG2_ERROR_FETAL;
+ goto failed;
+ }
+ m_pStream->alignByte();
+ m_pStream->offset(2);
+ } else {
+ pSegment->m_nResultType = JBIG2_IMAGE_POINTER;
+ pSegment->m_Result.im = pTRD->decode_Huffman(m_pStream, grContext);
+ if(pSegment->m_Result.im == NULL) {
+ nRet = JBIG2_ERROR_FETAL;
+ goto failed;
+ }
+ m_pStream->alignByte();
+ }
+ if(pSegment->m_cFlags.s.type != 4) {
+ if(!m_bBufSpecified) {
+ JBig2PageInfo *pPageInfo = m_pPageInfoList->getLast();
+ if ((pPageInfo->m_bIsStriped == 1) && (ri.y + ri.height > m_pPage->m_nHeight)) {
+ m_pPage->expand(ri.y + ri.height, (pPageInfo->m_cFlags & 4) ? 1 : 0);
+ }
+ }
+ m_pPage->composeFrom(ri.x, ri.y, pSegment->m_Result.im, (JBig2ComposeOp)(ri.flags & 0x03));
+ delete pSegment->m_Result.im;
+ pSegment->m_Result.im = NULL;
+ }
+ delete pTRD;
+ if(SBSYMS) {
+ m_pModule->JBig2_Free(SBSYMS);
+ }
+ if(SBSYMCODES) {
+ m_pModule->JBig2_Free(SBSYMCODES);
+ }
+ if(grContext) {
+ m_pModule->JBig2_Free(grContext);
+ }
+ if(Table_B1) {
+ delete Table_B1;
+ }
+ if(Table_B6) {
+ delete Table_B6;
+ }
+ if(Table_B7) {
+ delete Table_B7;
+ }
+ if(Table_B8) {
+ delete Table_B8;
+ }
+ if(Table_B9) {
+ delete Table_B9;
+ }
+ if(Table_B10) {
+ delete Table_B10;
+ }
+ if(Table_B11) {
+ delete Table_B11;
+ }
+ if(Table_B12) {
+ delete Table_B12;
+ }
+ if(Table_B13) {
+ delete Table_B13;
+ }
+ if(Table_B14) {
+ delete Table_B14;
+ }
+ if(Table_B15) {
+ delete Table_B15;
+ }
+ return JBIG2_SUCCESS;
+failed:
+ delete pTRD;
+ if(SBSYMS) {
+ m_pModule->JBig2_Free(SBSYMS);
+ }
+ if(SBSYMCODES) {
+ m_pModule->JBig2_Free(SBSYMCODES);
+ }
+ if(grContext) {
+ m_pModule->JBig2_Free(grContext);
+ }
+ if(Table_B1) {
+ delete Table_B1;
+ }
+ if(Table_B6) {
+ delete Table_B6;
+ }
+ if(Table_B7) {
+ delete Table_B7;
+ }
+ if(Table_B8) {
+ delete Table_B8;
+ }
+ if(Table_B9) {
+ delete Table_B9;
+ }
+ if(Table_B10) {
+ delete Table_B10;
+ }
+ if(Table_B11) {
+ delete Table_B11;
+ }
+ if(Table_B12) {
+ delete Table_B12;
+ }
+ if(Table_B13) {
+ delete Table_B13;
+ }
+ if(Table_B14) {
+ delete Table_B14;
+ }
+ if(Table_B15) {
+ delete Table_B15;
+ }
+ return nRet;
+}
+
+FX_BOOL CJBig2_Context::parsePatternDict(CJBig2_Segment *pSegment, IFX_Pause* pPause)
+{
+ FX_DWORD dwTemp;
+ FX_BYTE cFlags;
+ JBig2ArithCtx *gbContext;
+ CJBig2_ArithDecoder *pArithDecoder;
+ CJBig2_PDDProc *pPDD;
+ FX_INT32 nRet;
+ JBIG2_ALLOC(pPDD, CJBig2_PDDProc());
+ if((m_pStream->read1Byte(&cFlags) != 0)
+ || (m_pStream->read1Byte(&pPDD->HDPW) != 0)
+ || (m_pStream->read1Byte(&pPDD->HDPH) != 0)
+ || (m_pStream->readInteger(&pPDD->GRAYMAX) != 0)) {
+ m_pModule->JBig2_Error("pattern dictionary segment : data header too short.");
+ nRet = JBIG2_ERROR_TOO_SHORT;
+ goto failed;
+ }
+ if (pPDD->GRAYMAX > JBIG2_MAX_PATTERN_INDEX) {
+ m_pModule->JBig2_Error("pattern dictionary segment : too max gray max.");
+ nRet = JBIG2_ERROR_LIMIT;
+ goto failed;
+ }
+ pPDD->HDMMR = cFlags & 0x01;
+ pPDD->HDTEMPLATE = (cFlags >> 1) & 0x03;
+ pSegment->m_nResultType = JBIG2_PATTERN_DICT_POINTER;
+ if(pPDD->HDMMR == 0) {
+ dwTemp = pPDD->HDTEMPLATE == 0 ? 65536 : pPDD->HDTEMPLATE == 1 ? 8192 : 1024;
+ gbContext = (JBig2ArithCtx*)m_pModule->JBig2_Malloc2(sizeof(JBig2ArithCtx), dwTemp);
+ JBIG2_memset(gbContext, 0, sizeof(JBig2ArithCtx)*dwTemp);
+ JBIG2_ALLOC(pArithDecoder, CJBig2_ArithDecoder(m_pStream));
+ pSegment->m_Result.pd = pPDD->decode_Arith(pArithDecoder, gbContext, pPause);
+ delete pArithDecoder;
+ if(pSegment->m_Result.pd == NULL) {
+ m_pModule->JBig2_Free(gbContext);
+ nRet = JBIG2_ERROR_FETAL;
+ goto failed;
+ }
+ m_pModule->JBig2_Free(gbContext);
+ m_pStream->alignByte();
+ m_pStream->offset(2);
+ } else {
+ pSegment->m_Result.pd = pPDD->decode_MMR(m_pStream, pPause);
+ if(pSegment->m_Result.pd == NULL) {
+ nRet = JBIG2_ERROR_FETAL;
+ goto failed;
+ }
+ m_pStream->alignByte();
+ }
+ delete pPDD;
+ return JBIG2_SUCCESS;
+failed:
+ delete pPDD;
+ return nRet;
+}
+FX_BOOL CJBig2_Context::parseHalftoneRegion(CJBig2_Segment *pSegment, IFX_Pause* pPause)
+{
+ FX_DWORD dwTemp;
+ FX_BYTE cFlags;
+ JBig2RegionInfo ri;
+ CJBig2_Segment *pSeg;
+ CJBig2_PatternDict *pPatternDict;
+ JBig2ArithCtx *gbContext;
+ CJBig2_ArithDecoder *pArithDecoder;
+ CJBig2_HTRDProc *pHRD;
+ FX_INT32 nRet;
+ JBIG2_ALLOC(pHRD, CJBig2_HTRDProc());
+ if((parseRegionInfo(&ri) != JBIG2_SUCCESS)
+ || (m_pStream->read1Byte(&cFlags) != 0)
+ || (m_pStream->readInteger(&pHRD->HGW) != 0)
+ || (m_pStream->readInteger(&pHRD->HGH) != 0)
+ || (m_pStream->readInteger((FX_DWORD*)&pHRD->HGX) != 0)
+ || (m_pStream->readInteger((FX_DWORD*)&pHRD->HGY) != 0)
+ || (m_pStream->readShortInteger(&pHRD->HRX) != 0)
+ || (m_pStream->readShortInteger(&pHRD->HRY) != 0)) {
+ m_pModule->JBig2_Error("halftone region segment : data header too short.");
+ nRet = JBIG2_ERROR_TOO_SHORT;
+ goto failed;
+ }
+ pHRD->HBW = ri.width;
+ pHRD->HBH = ri.height;
+ pHRD->HMMR = cFlags & 0x01;
+ pHRD->HTEMPLATE = (cFlags >> 1) & 0x03;
+ pHRD->HENABLESKIP = (cFlags >> 3) & 0x01;
+ pHRD->HCOMBOP = (JBig2ComposeOp)((cFlags >> 4) & 0x07);
+ pHRD->HDEFPIXEL = (cFlags >> 7) & 0x01;
+ if(pSegment->m_nReferred_to_segment_count != 1) {
+ m_pModule->JBig2_Error("halftone region segment : refered to segment count not equals 1");
+ nRet = JBIG2_ERROR_FETAL;
+ goto failed;
+ }
+ pSeg = findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[0]);
+ if( (pSeg == NULL) || (pSeg->m_cFlags.s.type != 16)) {
+ m_pModule->JBig2_Error("halftone region segment : refered to segment is not pattern dict");
+ nRet = JBIG2_ERROR_FETAL;
+ goto failed;
+ }
+ pPatternDict = pSeg->m_Result.pd;
+ if((pPatternDict == NULL) || (pPatternDict->NUMPATS == 0)) {
+ m_pModule->JBig2_Error("halftone region segment : has no patterns input");
+ nRet = JBIG2_ERROR_FETAL;
+ goto failed;
+ }
+ pHRD->HNUMPATS = pPatternDict->NUMPATS;
+ pHRD->HPATS = pPatternDict->HDPATS;
+ pHRD->HPW = pPatternDict->HDPATS[0]->m_nWidth;
+ pHRD->HPH = pPatternDict->HDPATS[0]->m_nHeight;
+ pSegment->m_nResultType = JBIG2_IMAGE_POINTER;
+ if(pHRD->HMMR == 0) {
+ dwTemp = pHRD->HTEMPLATE == 0 ? 65536 : pHRD->HTEMPLATE == 1 ? 8192 : 1024;
+ gbContext = (JBig2ArithCtx*)m_pModule->JBig2_Malloc2(sizeof(JBig2ArithCtx), dwTemp);
+ JBIG2_memset(gbContext, 0, sizeof(JBig2ArithCtx)*dwTemp);
+ JBIG2_ALLOC(pArithDecoder, CJBig2_ArithDecoder(m_pStream));
+ pSegment->m_Result.im = pHRD->decode_Arith(pArithDecoder, gbContext, pPause);
+ delete pArithDecoder;
+ if(pSegment->m_Result.im == NULL) {
+ m_pModule->JBig2_Free(gbContext);
+ nRet = JBIG2_ERROR_FETAL;
+ goto failed;
+ }
+ m_pModule->JBig2_Free(gbContext);
+ m_pStream->alignByte();
+ m_pStream->offset(2);
+ } else {
+ pSegment->m_Result.im = pHRD->decode_MMR(m_pStream, pPause);
+ if(pSegment->m_Result.im == NULL) {
+ nRet = JBIG2_ERROR_FETAL;
+ goto failed;
+ }
+ m_pStream->alignByte();
+ }
+ if(pSegment->m_cFlags.s.type != 20) {
+ if(!m_bBufSpecified) {
+ JBig2PageInfo *pPageInfo = m_pPageInfoList->getLast();
+ if ((pPageInfo->m_bIsStriped == 1) && (ri.y + ri.height > m_pPage->m_nHeight)) {
+ m_pPage->expand(ri.y + ri.height, (pPageInfo->m_cFlags & 4) ? 1 : 0);
+ }
+ }
+ m_pPage->composeFrom(ri.x, ri.y, pSegment->m_Result.im, (JBig2ComposeOp)(ri.flags & 0x03));
+ delete pSegment->m_Result.im;
+ pSegment->m_Result.im = NULL;
+ }
+ delete pHRD;
+ return JBIG2_SUCCESS;
+failed:
+ delete pHRD;
+ return nRet;
+}
+
+FX_BOOL CJBig2_Context::parseGenericRegion(CJBig2_Segment *pSegment, IFX_Pause* pPause)
+{
+ FX_DWORD dwTemp;
+ FX_BYTE cFlags;
+ FX_INT32 i, nRet;
+ if(m_pGRD == NULL) {
+ JBIG2_ALLOC(m_pGRD, CJBig2_GRDProc());
+ if((parseRegionInfo(&m_ri) != JBIG2_SUCCESS)
+ || (m_pStream->read1Byte(&cFlags) != 0)) {
+ m_pModule->JBig2_Error("generic region segment : data header too short.");
+ nRet = JBIG2_ERROR_TOO_SHORT;
+ goto failed;
+ }
+ if (m_ri.height < 0 || m_ri.width < 0) {
+ m_pModule->JBig2_Error("generic region segment : wrong data.");
+ nRet = JBIG2_FAILED;
+ goto failed;
+ }
+ m_pGRD->GBW = m_ri.width;
+ m_pGRD->GBH = m_ri.height;
+ m_pGRD->MMR = cFlags & 0x01;
+ m_pGRD->GBTEMPLATE = (cFlags >> 1) & 0x03;
+ m_pGRD->TPGDON = (cFlags >> 3) & 0x01;
+ if(m_pGRD->MMR == 0) {
+ if(m_pGRD->GBTEMPLATE == 0) {
+ for(i = 0; i < 8; i++) {
+ if(m_pStream->read1Byte((FX_BYTE*)&m_pGRD->GBAT[i]) != 0) {
+ m_pModule->JBig2_Error("generic region segment : data header too short.");
+ nRet = JBIG2_ERROR_TOO_SHORT;
+ goto failed;
+ }
+ }
+ } else {
+ for(i = 0; i < 2; i++) {
+ if(m_pStream->read1Byte((FX_BYTE*)&m_pGRD->GBAT[i]) != 0) {
+ m_pModule->JBig2_Error("generic region segment : data header too short.");
+ nRet = JBIG2_ERROR_TOO_SHORT;
+ goto failed;
+ }
+ }
+ }
+ }
+ m_pGRD->USESKIP = 0;
+ }
+ pSegment->m_nResultType = JBIG2_IMAGE_POINTER;
+ if(m_pGRD->MMR == 0) {
+ dwTemp = m_pGRD->GBTEMPLATE == 0 ? 65536 : m_pGRD->GBTEMPLATE == 1 ? 8192 : 1024;
+ if(m_gbContext == NULL) {
+ m_gbContext = (JBig2ArithCtx*)m_pModule->JBig2_Malloc(sizeof(JBig2ArithCtx) * dwTemp);
+ JBIG2_memset(m_gbContext, 0, sizeof(JBig2ArithCtx)*dwTemp);
+ }
+ if(m_pArithDecoder == NULL) {
+ JBIG2_ALLOC(m_pArithDecoder, CJBig2_ArithDecoder(m_pStream));
+ m_ProcessiveStatus = m_pGRD->Start_decode_Arith(&pSegment->m_Result.im, m_pArithDecoder, m_gbContext, pPause);
+ } else {
+ m_ProcessiveStatus = m_pGRD->Continue_decode(pPause);
+ }
+ OutputBitmap(pSegment->m_Result.im);
+ if(m_ProcessiveStatus == FXCODEC_STATUS_DECODE_TOBECONTINUE) {
+ if(pSegment->m_cFlags.s.type != 36) {
+ if(!m_bBufSpecified) {
+ JBig2PageInfo *pPageInfo = m_pPageInfoList->getLast();
+ if ((pPageInfo->m_bIsStriped == 1) && (m_ri.y + m_ri.height > m_pPage->m_nHeight)) {
+ m_pPage->expand(m_ri.y + m_ri.height, (pPageInfo->m_cFlags & 4) ? 1 : 0);
+ }
+ }
+ FX_RECT Rect = m_pGRD->GetReplaceRect();
+ m_pPage->composeFrom(m_ri.x + Rect.left, m_ri.y + Rect.top, pSegment->m_Result.im, (JBig2ComposeOp)(m_ri.flags & 0x03), &Rect);
+ }
+ return JBIG2_SUCCESS;
+ } else {
+ delete m_pArithDecoder;
+ m_pArithDecoder = NULL;
+ if(pSegment->m_Result.im == NULL) {
+ m_pModule->JBig2_Free(m_gbContext);
+ nRet = JBIG2_ERROR_FETAL;
+ m_gbContext = NULL;
+ m_ProcessiveStatus = FXCODEC_STATUS_ERROR;
+ goto failed;
+ }
+ m_pModule->JBig2_Free(m_gbContext);
+ m_gbContext = NULL;
+ m_pStream->alignByte();
+ m_pStream->offset(2);
+ }
+ } else {
+ FXCODEC_STATUS status = m_pGRD->Start_decode_MMR(&pSegment->m_Result.im, m_pStream, pPause);
+ while(status == FXCODEC_STATUS_DECODE_TOBECONTINUE) {
+ m_pGRD->Continue_decode(pPause);
+ }
+ if(pSegment->m_Result.im == NULL) {
+ nRet = JBIG2_ERROR_FETAL;
+ goto failed;
+ }
+ m_pStream->alignByte();
+ }
+ if(pSegment->m_cFlags.s.type != 36) {
+ if(!m_bBufSpecified) {
+ JBig2PageInfo *pPageInfo = m_pPageInfoList->getLast();
+ if ((pPageInfo->m_bIsStriped == 1) && (m_ri.y + m_ri.height > m_pPage->m_nHeight)) {
+ m_pPage->expand(m_ri.y + m_ri.height, (pPageInfo->m_cFlags & 4) ? 1 : 0);
+ }
+ }
+ FX_RECT Rect = m_pGRD->GetReplaceRect();
+ m_pPage->composeFrom(m_ri.x + Rect.left, m_ri.y + Rect.top, pSegment->m_Result.im, (JBig2ComposeOp)(m_ri.flags & 0x03), &Rect);
+ delete pSegment->m_Result.im;
+ pSegment->m_Result.im = NULL;
+ }
+ delete m_pGRD;
+ m_pGRD = NULL;
+ return JBIG2_SUCCESS;
+failed:
+ delete m_pGRD;
+ m_pGRD = NULL;
+ return nRet;
+}
+
+FX_BOOL CJBig2_Context::parseGenericRefinementRegion(CJBig2_Segment *pSegment)
+{
+ FX_DWORD dwTemp;
+ JBig2RegionInfo ri;
+ CJBig2_Segment *pSeg;
+ FX_INT32 i, nRet;
+ FX_BYTE cFlags;
+ JBig2ArithCtx *grContext;
+ CJBig2_GRRDProc *pGRRD;
+ CJBig2_ArithDecoder *pArithDecoder;
+ JBIG2_ALLOC(pGRRD, CJBig2_GRRDProc());
+ if((parseRegionInfo(&ri) != JBIG2_SUCCESS)
+ || (m_pStream->read1Byte(&cFlags) != 0)) {
+ m_pModule->JBig2_Error("generic refinement region segment : data header too short.");
+ nRet = JBIG2_ERROR_TOO_SHORT;
+ goto failed;
+ }
+ pGRRD->GRW = ri.width;
+ pGRRD->GRH = ri.height;
+ pGRRD->GRTEMPLATE = cFlags & 0x01;
+ pGRRD->TPGRON = (cFlags >> 1) & 0x01;
+ if(pGRRD->GRTEMPLATE == 0) {
+ for(i = 0; i < 4; i++) {
+ if(m_pStream->read1Byte((FX_BYTE*)&pGRRD->GRAT[i]) != 0) {
+ m_pModule->JBig2_Error("generic refinement region segment : data header too short.");
+ nRet = JBIG2_ERROR_TOO_SHORT;
+ goto failed;
+ }
+ }
+ }
+ pSeg = NULL;
+ if(pSegment->m_nReferred_to_segment_count > 0) {
+ for(i = 0; i < pSegment->m_nReferred_to_segment_count; i++) {
+ pSeg = this->findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[0]);
+ if(pSeg == NULL) {
+ m_pModule->JBig2_Error("generic refinement region segment : can't find refered to segments");
+ nRet = JBIG2_ERROR_FETAL;
+ goto failed;
+ }
+ if((pSeg->m_cFlags.s.type == 4) || (pSeg->m_cFlags.s.type == 20)
+ || (pSeg->m_cFlags.s.type == 36) || (pSeg->m_cFlags.s.type == 40)) {
+ break;
+ }
+ }
+ if(i >= pSegment->m_nReferred_to_segment_count) {
+ m_pModule->JBig2_Error("generic refinement region segment : can't find refered to intermediate region");
+ nRet = JBIG2_ERROR_FETAL;
+ goto failed;
+ }
+ pGRRD->GRREFERENCE = pSeg->m_Result.im;
+ } else {
+ pGRRD->GRREFERENCE = m_pPage;
+ }
+ pGRRD->GRREFERENCEDX = 0;
+ pGRRD->GRREFERENCEDY = 0;
+ dwTemp = pGRRD->GRTEMPLATE ? 1 << 10 : 1 << 13;
+ grContext = (JBig2ArithCtx*)m_pModule->JBig2_Malloc2(sizeof(JBig2ArithCtx), dwTemp);
+ JBIG2_memset(grContext, 0, sizeof(JBig2ArithCtx)*dwTemp);
+ JBIG2_ALLOC(pArithDecoder, CJBig2_ArithDecoder(m_pStream));
+ pSegment->m_nResultType = JBIG2_IMAGE_POINTER;
+ pSegment->m_Result.im = pGRRD->decode(pArithDecoder, grContext);
+ delete pArithDecoder;
+ if(pSegment->m_Result.im == NULL) {
+ m_pModule->JBig2_Free(grContext);
+ nRet = JBIG2_ERROR_FETAL;
+ goto failed;
+ }
+ m_pModule->JBig2_Free(grContext);
+ m_pStream->alignByte();
+ m_pStream->offset(2);
+ if(pSegment->m_cFlags.s.type != 40) {
+ if(!m_bBufSpecified) {
+ JBig2PageInfo *pPageInfo = m_pPageInfoList->getLast();
+ if ((pPageInfo->m_bIsStriped == 1) && (ri.y + ri.height > m_pPage->m_nHeight)) {
+ m_pPage->expand(ri.y + ri.height, (pPageInfo->m_cFlags & 4) ? 1 : 0);
+ }
+ }
+ m_pPage->composeFrom(ri.x, ri.y, pSegment->m_Result.im, (JBig2ComposeOp)(ri.flags & 0x03));
+ delete pSegment->m_Result.im;
+ pSegment->m_Result.im = NULL;
+ }
+ delete pGRRD;
+ return JBIG2_SUCCESS;
+failed:
+ delete pGRRD;
+ return nRet;
+}
+FX_BOOL CJBig2_Context::parseTable(CJBig2_Segment *pSegment)
+{
+ pSegment->m_nResultType = JBIG2_HUFFMAN_TABLE_POINTER;
+ JBIG2_ALLOC(pSegment->m_Result.ht, CJBig2_HuffmanTable(m_pStream));
+ if(!pSegment->m_Result.ht->isOK()) {
+ delete pSegment->m_Result.ht;
+ pSegment->m_Result.ht = NULL;
+ return JBIG2_ERROR_FETAL;
+ }
+ m_pStream->alignByte();
+ return JBIG2_SUCCESS;
+}
+FX_INT32 CJBig2_Context::parseRegionInfo(JBig2RegionInfo *pRI)
+{
+ if((m_pStream->readInteger((FX_DWORD*)&pRI->width) != 0)
+ || (m_pStream->readInteger((FX_DWORD*)&pRI->height) != 0)
+ || (m_pStream->readInteger((FX_DWORD*)&pRI->x) != 0)
+ || (m_pStream->readInteger((FX_DWORD*)&pRI->y) != 0)
+ || (m_pStream->read1Byte(&pRI->flags) != 0)) {
+ return JBIG2_ERROR_TOO_SHORT;
+ }
+ return JBIG2_SUCCESS;
+}
+JBig2HuffmanCode *CJBig2_Context::decodeSymbolIDHuffmanTable(CJBig2_BitStream *pStream,
+ FX_DWORD SBNUMSYMS)
+{
+ JBig2HuffmanCode *SBSYMCODES;
+ FX_INT32 runcodes[35], runcodes_len[35], runcode;
+ FX_INT32 i, j, nTemp, nVal, nBits;
+ FX_INT32 run;
+ SBSYMCODES = (JBig2HuffmanCode*)m_pModule->JBig2_Malloc2(sizeof(JBig2HuffmanCode), SBNUMSYMS);
+ for (i = 0; i < 35; i ++) {
+ if(pStream->readNBits(4, &runcodes_len[i]) != 0) {
+ goto failed;
+ }
+ }
+ huffman_assign_code(runcodes, runcodes_len, 35);
+ i = 0;
+ while(i < (int)SBNUMSYMS) {
+ nVal = 0;
+ nBits = 0;
+ for(;;) {
+ if(pStream->read1Bit(&nTemp) != 0) {
+ goto failed;
+ }
+ nVal = (nVal << 1) | nTemp;
+ nBits ++;
+ for(j = 0; j < 35; j++) {
+ if((nBits == runcodes_len[j]) && (nVal == runcodes[j])) {
+ break;
+ }
+ }
+ if(j < 35) {
+ break;
+ }
+ }
+ runcode = j;
+ if(runcode < 32) {
+ SBSYMCODES[i].codelen = runcode;
+ run = 0;
+ } else if(runcode == 32) {
+ if(pStream->readNBits(2, &nTemp) != 0) {
+ goto failed;
+ }
+ run = nTemp + 3;
+ } else if(runcode == 33) {
+ if(pStream->readNBits(3, &nTemp) != 0) {
+ goto failed;
+ }
+ run = nTemp + 3;
+ } else if(runcode == 34) {
+ if(pStream->readNBits(7, &nTemp) != 0) {
+ goto failed;
+ }
+ run = nTemp + 11;
+ }
+ if(run > 0) {
+ if (i + run > (int)SBNUMSYMS) {
+ goto failed;
+ }
+ for(j = 0; j < run; j++) {
+ if(runcode == 32 && i > 0) {
+ SBSYMCODES[i + j].codelen = SBSYMCODES[i - 1].codelen;
+ } else {
+ SBSYMCODES[i + j].codelen = 0;
+ }
+ }
+ i += run;
+ } else {
+ i ++;
+ }
+ }
+ huffman_assign_code(SBSYMCODES, SBNUMSYMS);
+ return SBSYMCODES;
+failed:
+ m_pModule->JBig2_Free(SBSYMCODES);
+ return NULL;
+}
+void CJBig2_Context::huffman_assign_code(int* CODES, int* PREFLEN, int NTEMP)
+{
+ int CURLEN, LENMAX, CURCODE, CURTEMP, i;
+ int *LENCOUNT;
+ int *FIRSTCODE;
+ LENMAX = 0;
+ for(i = 0; i < NTEMP; i++) {
+ if(PREFLEN[i] > LENMAX) {
+ LENMAX = PREFLEN[i];
+ }
+ }
+ LENCOUNT = (int*)m_pModule->JBig2_Malloc2(sizeof(int), (LENMAX + 1));
+ JBIG2_memset(LENCOUNT, 0, sizeof(int) * (LENMAX + 1));
+ FIRSTCODE = (int*)m_pModule->JBig2_Malloc2(sizeof(int), (LENMAX + 1));
+ for(i = 0; i < NTEMP; i++) {
+ LENCOUNT[PREFLEN[i]] ++;
+ }
+ CURLEN = 1;
+ FIRSTCODE[0] = 0;
+ LENCOUNT[0] = 0;
+ while(CURLEN <= LENMAX) {
+ FIRSTCODE[CURLEN] = (FIRSTCODE[CURLEN - 1] + LENCOUNT[CURLEN - 1]) << 1;
+ CURCODE = FIRSTCODE[CURLEN];
+ CURTEMP = 0;
+ while(CURTEMP < NTEMP) {
+ if(PREFLEN[CURTEMP] == CURLEN) {
+ CODES[CURTEMP] = CURCODE;
+ CURCODE = CURCODE + 1;
+ }
+ CURTEMP = CURTEMP + 1;
+ }
+ CURLEN = CURLEN + 1;
+ }
+ m_pModule->JBig2_Free(LENCOUNT);
+ m_pModule->JBig2_Free(FIRSTCODE);
+}
+void CJBig2_Context::huffman_assign_code(JBig2HuffmanCode *SBSYMCODES, int NTEMP)
+{
+ int CURLEN, LENMAX, CURCODE, CURTEMP, i;
+ int *LENCOUNT;
+ int *FIRSTCODE;
+ LENMAX = 0;
+ for(i = 0; i < NTEMP; i++) {
+ if(SBSYMCODES[i].codelen > LENMAX) {
+ LENMAX = SBSYMCODES[i].codelen;
+ }
+ }
+ LENCOUNT = (int*)m_pModule->JBig2_Malloc2(sizeof(int), (LENMAX + 1));
+ JBIG2_memset(LENCOUNT, 0, sizeof(int) * (LENMAX + 1));
+ FIRSTCODE = (int*)m_pModule->JBig2_Malloc2(sizeof(int), (LENMAX + 1));
+ for(i = 0; i < NTEMP; i++) {
+ LENCOUNT[SBSYMCODES[i].codelen] ++;
+ }
+ CURLEN = 1;
+ FIRSTCODE[0] = 0;
+ LENCOUNT[0] = 0;
+ while(CURLEN <= LENMAX) {
+ FIRSTCODE[CURLEN] = (FIRSTCODE[CURLEN - 1] + LENCOUNT[CURLEN - 1]) << 1;
+ CURCODE = FIRSTCODE[CURLEN];
+ CURTEMP = 0;
+ while(CURTEMP < NTEMP) {
+ if(SBSYMCODES[CURTEMP].codelen == CURLEN) {
+ SBSYMCODES[CURTEMP].code = CURCODE;
+ CURCODE = CURCODE + 1;
+ }
+ CURTEMP = CURTEMP + 1;
+ }
+ CURLEN = CURLEN + 1;
+ }
+ m_pModule->JBig2_Free(LENCOUNT);
+ m_pModule->JBig2_Free(FIRSTCODE);
+}
diff --git a/core/src/fxcodec/jbig2/JBig2_Context.h b/core/src/fxcodec/jbig2/JBig2_Context.h
index 369dba3512..90bd7ddbbe 100644
--- a/core/src/fxcodec/jbig2/JBig2_Context.h
+++ b/core/src/fxcodec/jbig2/JBig2_Context.h
@@ -1,135 +1,135 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef _JBIG2_CONTEXT_H_
-#define _JBIG2_CONTEXT_H_
-#include "JBig2_Module.h"
-#include "JBig2_List.h"
-#include "JBig2_Segment.h"
-#include "JBig2_Page.h"
-#include "JBig2_GeneralDecoder.h"
-#include "../../../include/fxcodec/fx_codec_def.h"
-#include "../../../include/fxcrt/fx_basic.h"
-typedef enum {
- JBIG2_OUT_OF_PAGE = 0,
- JBIG2_IN_PAGE,
-} JBig2State;
-#define JBIG2_SUCCESS 0
-#define JBIG2_FAILED -1
-#define JBIG2_ERROR_TOO_SHORT -2
-#define JBIG2_ERROR_FETAL -3
-#define JBIG2_END_OF_PAGE 2
-#define JBIG2_END_OF_FILE 3
-#define JBIG2_ERROR_FILE_FORMAT -4
-#define JBIG2_ERROR_STREAM_TYPE -5
-#define JBIG2_ERROR_LIMIT -6
-#define JBIG2_FILE_STREAM 0
-#define JBIG2_SQUENTIAL_STREAM 1
-#define JBIG2_RANDOM_STREAM 2
-#define JBIG2_EMBED_STREAM 3
-#define JBIG2_MIN_SEGMENT_SIZE 11
-class CJBig2_Context : public CJBig2_Object
-{
-public:
-
- static CJBig2_Context *CreateContext(CJBig2_Module *pModule, FX_BYTE *pGlobalData, FX_DWORD dwGlobalLength,
- FX_BYTE *pData, FX_DWORD dwLength, FX_INT32 nStreamType, IFX_Pause* pPause = NULL);
-
- static void DestroyContext(CJBig2_Context *pContext);
-
- FX_INT32 getFirstPage(FX_BYTE *pBuf, FX_INT32 width, FX_INT32 height, FX_INT32 stride, IFX_Pause* pPause);
-
- FX_INT32 getNextPage(FX_BYTE *pBuf, FX_INT32 width, FX_INT32 height, FX_INT32 stride, IFX_Pause* pPause);
-
- FX_INT32 getFirstPage(CJBig2_Image **image, IFX_Pause* pPause);
-
- FX_INT32 getNextPage(CJBig2_Image **image, IFX_Pause* pPause);
- FX_INT32 Continue(IFX_Pause* pPause);
- FXCODEC_STATUS GetProcessiveStatus()
- {
- return m_ProcessiveStatus;
- };
-private:
-
- CJBig2_Context(FX_BYTE *pGlobalData, FX_DWORD dwGlobalLength,
- FX_BYTE *pData, FX_DWORD dwLength, FX_INT32 nStreamType, IFX_Pause* pPause);
-
- ~CJBig2_Context();
-
- FX_INT32 decodeFile(IFX_Pause* pPause);
-
- FX_INT32 decode_SquentialOrgnazation(IFX_Pause* pPause);
-
- FX_INT32 decode_EmbedOrgnazation(IFX_Pause* pPause);
-
- FX_INT32 decode_RandomOrgnazation_FirstPage(IFX_Pause* pPause);
-
- FX_INT32 decode_RandomOrgnazation(IFX_Pause* pPause);
-
- CJBig2_Segment *findSegmentByNumber(FX_DWORD dwNumber);
-
- CJBig2_Segment *findReferredSegmentByTypeAndIndex(CJBig2_Segment *pSegment, FX_BYTE cType, FX_INT32 nIndex);
-
- FX_INT32 parseSegmentHeader(CJBig2_Segment *pSegment);
-
- FX_INT32 parseSegmentData(CJBig2_Segment *pSegment, IFX_Pause* pPause);
- FX_INT32 ProcessiveParseSegmentData(CJBig2_Segment *pSegment, IFX_Pause* pPause);
-
- FX_INT32 parseSymbolDict(CJBig2_Segment *pSegment, IFX_Pause* pPause);
-
- FX_INT32 parseTextRegion(CJBig2_Segment *pSegment);
-
- FX_INT32 parsePatternDict(CJBig2_Segment *pSegment, IFX_Pause* pPause);
-
- FX_INT32 parseHalftoneRegion(CJBig2_Segment *pSegment, IFX_Pause* pPause);
-
- FX_INT32 parseGenericRegion(CJBig2_Segment *pSegment, IFX_Pause* pPause);
-
- FX_INT32 parseGenericRefinementRegion(CJBig2_Segment *pSegment);
-
- FX_INT32 parseTable(CJBig2_Segment *pSegment);
-
- FX_INT32 parseRegionInfo(JBig2RegionInfo *pRI);
-
-
-
- JBig2HuffmanCode *decodeSymbolIDHuffmanTable(CJBig2_BitStream *pStream, FX_DWORD SBNUMSYMS);
-
- void huffman_assign_code(int* CODES, int* PREFLEN, int NTEMP);
-
- void huffman_assign_code(JBig2HuffmanCode *SBSYMCODES, int NTEMP);
-
-private:
-
- CJBig2_Context *m_pGlobalContext;
-
- FX_INT32 m_nStreamType;
-
- CJBig2_BitStream *m_pStream;
-
- FX_INT32 m_nState;
-
- CJBig2_List<CJBig2_Segment> *m_pSegmentList;
-
- CJBig2_List<JBig2PageInfo> *m_pPageInfoList;
-
- CJBig2_Image *m_pPage;
-
- FX_BOOL m_bBufSpecified;
-
- FX_INT32 m_nSegmentDecoded;
- IFX_Pause* m_pPause;
- FX_INT32 m_PauseStep;
- FXCODEC_STATUS m_ProcessiveStatus;
- FX_BOOL m_bFirstPage;
- CJBig2_ArithDecoder *m_pArithDecoder;
- CJBig2_GRDProc *m_pGRD;
- JBig2ArithCtx *m_gbContext;
- CJBig2_Segment *m_pSegment;
- FX_DWORD m_dwOffset;
- JBig2RegionInfo m_ri;
-};
-#endif
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _JBIG2_CONTEXT_H_
+#define _JBIG2_CONTEXT_H_
+#include "JBig2_Module.h"
+#include "JBig2_List.h"
+#include "JBig2_Segment.h"
+#include "JBig2_Page.h"
+#include "JBig2_GeneralDecoder.h"
+#include "../../../include/fxcodec/fx_codec_def.h"
+#include "../../../include/fxcrt/fx_basic.h"
+typedef enum {
+ JBIG2_OUT_OF_PAGE = 0,
+ JBIG2_IN_PAGE,
+} JBig2State;
+#define JBIG2_SUCCESS 0
+#define JBIG2_FAILED -1
+#define JBIG2_ERROR_TOO_SHORT -2
+#define JBIG2_ERROR_FETAL -3
+#define JBIG2_END_OF_PAGE 2
+#define JBIG2_END_OF_FILE 3
+#define JBIG2_ERROR_FILE_FORMAT -4
+#define JBIG2_ERROR_STREAM_TYPE -5
+#define JBIG2_ERROR_LIMIT -6
+#define JBIG2_FILE_STREAM 0
+#define JBIG2_SQUENTIAL_STREAM 1
+#define JBIG2_RANDOM_STREAM 2
+#define JBIG2_EMBED_STREAM 3
+#define JBIG2_MIN_SEGMENT_SIZE 11
+class CJBig2_Context : public CJBig2_Object
+{
+public:
+
+ static CJBig2_Context *CreateContext(CJBig2_Module *pModule, FX_BYTE *pGlobalData, FX_DWORD dwGlobalLength,
+ FX_BYTE *pData, FX_DWORD dwLength, FX_INT32 nStreamType, IFX_Pause* pPause = NULL);
+
+ static void DestroyContext(CJBig2_Context *pContext);
+
+ FX_INT32 getFirstPage(FX_BYTE *pBuf, FX_INT32 width, FX_INT32 height, FX_INT32 stride, IFX_Pause* pPause);
+
+ FX_INT32 getNextPage(FX_BYTE *pBuf, FX_INT32 width, FX_INT32 height, FX_INT32 stride, IFX_Pause* pPause);
+
+ FX_INT32 getFirstPage(CJBig2_Image **image, IFX_Pause* pPause);
+
+ FX_INT32 getNextPage(CJBig2_Image **image, IFX_Pause* pPause);
+ FX_INT32 Continue(IFX_Pause* pPause);
+ FXCODEC_STATUS GetProcessiveStatus()
+ {
+ return m_ProcessiveStatus;
+ };
+private:
+
+ CJBig2_Context(FX_BYTE *pGlobalData, FX_DWORD dwGlobalLength,
+ FX_BYTE *pData, FX_DWORD dwLength, FX_INT32 nStreamType, IFX_Pause* pPause);
+
+ ~CJBig2_Context();
+
+ FX_INT32 decodeFile(IFX_Pause* pPause);
+
+ FX_INT32 decode_SquentialOrgnazation(IFX_Pause* pPause);
+
+ FX_INT32 decode_EmbedOrgnazation(IFX_Pause* pPause);
+
+ FX_INT32 decode_RandomOrgnazation_FirstPage(IFX_Pause* pPause);
+
+ FX_INT32 decode_RandomOrgnazation(IFX_Pause* pPause);
+
+ CJBig2_Segment *findSegmentByNumber(FX_DWORD dwNumber);
+
+ CJBig2_Segment *findReferredSegmentByTypeAndIndex(CJBig2_Segment *pSegment, FX_BYTE cType, FX_INT32 nIndex);
+
+ FX_INT32 parseSegmentHeader(CJBig2_Segment *pSegment);
+
+ FX_INT32 parseSegmentData(CJBig2_Segment *pSegment, IFX_Pause* pPause);
+ FX_INT32 ProcessiveParseSegmentData(CJBig2_Segment *pSegment, IFX_Pause* pPause);
+
+ FX_INT32 parseSymbolDict(CJBig2_Segment *pSegment, IFX_Pause* pPause);
+
+ FX_INT32 parseTextRegion(CJBig2_Segment *pSegment);
+
+ FX_INT32 parsePatternDict(CJBig2_Segment *pSegment, IFX_Pause* pPause);
+
+ FX_INT32 parseHalftoneRegion(CJBig2_Segment *pSegment, IFX_Pause* pPause);
+
+ FX_INT32 parseGenericRegion(CJBig2_Segment *pSegment, IFX_Pause* pPause);
+
+ FX_INT32 parseGenericRefinementRegion(CJBig2_Segment *pSegment);
+
+ FX_INT32 parseTable(CJBig2_Segment *pSegment);
+
+ FX_INT32 parseRegionInfo(JBig2RegionInfo *pRI);
+
+
+
+ JBig2HuffmanCode *decodeSymbolIDHuffmanTable(CJBig2_BitStream *pStream, FX_DWORD SBNUMSYMS);
+
+ void huffman_assign_code(int* CODES, int* PREFLEN, int NTEMP);
+
+ void huffman_assign_code(JBig2HuffmanCode *SBSYMCODES, int NTEMP);
+
+private:
+
+ CJBig2_Context *m_pGlobalContext;
+
+ FX_INT32 m_nStreamType;
+
+ CJBig2_BitStream *m_pStream;
+
+ FX_INT32 m_nState;
+
+ CJBig2_List<CJBig2_Segment> *m_pSegmentList;
+
+ CJBig2_List<JBig2PageInfo> *m_pPageInfoList;
+
+ CJBig2_Image *m_pPage;
+
+ FX_BOOL m_bBufSpecified;
+
+ FX_INT32 m_nSegmentDecoded;
+ IFX_Pause* m_pPause;
+ FX_INT32 m_PauseStep;
+ FXCODEC_STATUS m_ProcessiveStatus;
+ FX_BOOL m_bFirstPage;
+ CJBig2_ArithDecoder *m_pArithDecoder;
+ CJBig2_GRDProc *m_pGRD;
+ JBig2ArithCtx *m_gbContext;
+ CJBig2_Segment *m_pSegment;
+ FX_DWORD m_dwOffset;
+ JBig2RegionInfo m_ri;
+};
+#endif
diff --git a/core/src/fxcodec/jbig2/JBig2_Define.h b/core/src/fxcodec/jbig2/JBig2_Define.h
index 1019b6af5d..ccf15d07ba 100644
--- a/core/src/fxcodec/jbig2/JBig2_Define.h
+++ b/core/src/fxcodec/jbig2/JBig2_Define.h
@@ -1,34 +1,34 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef _JBIG2_DEFINE_H_
-#define _JBIG2_DEFINE_H_
-#include "../../../include/fxcrt/fx_system.h"
-#define JBIG2_memset FXSYS_memset8
-#define JBIG2_memcmp FXSYS_memcmp32
-#define JBIG2_memcpy FXSYS_memcpy32
-#include "JBig2_Object.h"
-#define JBIG2_OOB 1
-typedef struct {
- FX_INT32 width,
- height;
- FX_INT32 x,
- y;
- FX_BYTE flags;
-} JBig2RegionInfo;
-typedef struct {
- FX_INT32 codelen;
- FX_INT32 code;
-} JBig2HuffmanCode;
-extern "C" {
- void _FaxG4Decode(void *pModule, FX_LPCBYTE src_buf, FX_DWORD src_size, int* pbitpos, FX_LPBYTE dest_buf, int width, int height, int pitch = 0);
-};
-#define JBIG2_MAX_REFERRED_SEGMENT_COUNT 64
-#define JBIG2_MAX_EXPORT_SYSMBOLS 65535
-#define JBIG2_MAX_NEW_SYSMBOLS 65535
-#define JBIG2_MAX_PATTERN_INDEX 65535
-#define JBIG2_MAX_IMAGE_SIZE 65535
-#endif
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _JBIG2_DEFINE_H_
+#define _JBIG2_DEFINE_H_
+#include "../../../include/fxcrt/fx_system.h"
+#define JBIG2_memset FXSYS_memset8
+#define JBIG2_memcmp FXSYS_memcmp32
+#define JBIG2_memcpy FXSYS_memcpy32
+#include "JBig2_Object.h"
+#define JBIG2_OOB 1
+typedef struct {
+ FX_INT32 width,
+ height;
+ FX_INT32 x,
+ y;
+ FX_BYTE flags;
+} JBig2RegionInfo;
+typedef struct {
+ FX_INT32 codelen;
+ FX_INT32 code;
+} JBig2HuffmanCode;
+extern "C" {
+ void _FaxG4Decode(void *pModule, FX_LPCBYTE src_buf, FX_DWORD src_size, int* pbitpos, FX_LPBYTE dest_buf, int width, int height, int pitch = 0);
+};
+#define JBIG2_MAX_REFERRED_SEGMENT_COUNT 64
+#define JBIG2_MAX_EXPORT_SYSMBOLS 65535
+#define JBIG2_MAX_NEW_SYSMBOLS 65535
+#define JBIG2_MAX_PATTERN_INDEX 65535
+#define JBIG2_MAX_IMAGE_SIZE 65535
+#endif
diff --git a/core/src/fxcodec/jbig2/JBig2_GeneralDecoder.cpp b/core/src/fxcodec/jbig2/JBig2_GeneralDecoder.cpp
index 9aa714a228..5847b20a93 100644
--- a/core/src/fxcodec/jbig2/JBig2_GeneralDecoder.cpp
+++ b/core/src/fxcodec/jbig2/JBig2_GeneralDecoder.cpp
@@ -1,4290 +1,4290 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "JBig2_GeneralDecoder.h"
-#include "JBig2_ArithDecoder.h"
-#include "JBig2_ArithIntDecoder.h"
-#include "JBig2_HuffmanDecoder.h"
-#include "JBig2_HuffmanTable.h"
-#include "JBig2_PatternDict.h"
-CJBig2_Image *CJBig2_GRDProc::decode_Arith(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)
-{
- if (GBW == 0 || GBH == 0) {
- CJBig2_Image* pImage;
- JBIG2_ALLOC(pImage, CJBig2_Image(GBW, GBH));
- return pImage;
- }
- if(GBTEMPLATE == 0) {
- if((GBAT[0] == 3) && (GBAT[1] == (signed char) - 1)
- && (GBAT[2] == (signed char) - 3) && (GBAT[3] == (signed char) - 1)
- && (GBAT[4] == 2) && (GBAT[5] == (signed char) - 2)
- && (GBAT[6] == (signed char) - 2) && (GBAT[7] == (signed char) - 2)) {
- return decode_Arith_Template0_opt3(pArithDecoder, gbContext);
- } else {
- return decode_Arith_Template0_unopt(pArithDecoder, gbContext);
- }
- } else if(GBTEMPLATE == 1) {
- if((GBAT[0] == 3) && (GBAT[1] == (signed char) - 1)) {
- return decode_Arith_Template1_opt3(pArithDecoder, gbContext);
- } else {
- return decode_Arith_Template1_unopt(pArithDecoder, gbContext);
- }
- } else if(GBTEMPLATE == 2) {
- if((GBAT[0] == 2) && (GBAT[1] == (signed char) - 1)) {
- return decode_Arith_Template2_opt3(pArithDecoder, gbContext);
- } else {
- return decode_Arith_Template2_unopt(pArithDecoder, gbContext);
- }
- } else {
- if((GBAT[0] == 2) && (GBAT[1] == (signed char) - 1)) {
- return decode_Arith_Template3_opt3(pArithDecoder, gbContext);
- } else {
- return decode_Arith_Template3_unopt(pArithDecoder, gbContext);
- }
- }
-}
-CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template0_opt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)
-{
- FX_BOOL LTP, SLTP, bVal;
- FX_DWORD CONTEXT;
- CJBig2_Image *GBREG;
- FX_DWORD line1, line2, line3;
- LTP = 0;
- JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
- GBREG->fill(0);
- for(FX_DWORD h = 0; h < GBH; h++) {
- if(TPGDON) {
- SLTP = pArithDecoder->DECODE(&gbContext[0x9b25]);
- LTP = LTP ^ SLTP;
- }
- if(LTP == 1) {
- GBREG->copyLine(h, h - 1);
- } else {
- line1 = GBREG->getPixel(2, h - 2);
- line1 |= GBREG->getPixel(1, h - 2) << 1;
- line1 |= GBREG->getPixel(0, h - 2) << 2;
- line2 = GBREG->getPixel(3, h - 1);
- line2 |= GBREG->getPixel(2, h - 1) << 1;
- line2 |= GBREG->getPixel(1, h - 1) << 2;
- line2 |= GBREG->getPixel(0, h - 1) << 3;
- line3 = 0;
- for(FX_DWORD w = 0; w < GBW; w++) {
- if(USESKIP && SKIP->getPixel(w, h)) {
- bVal = 0;
- } else {
- CONTEXT = line3;
- CONTEXT |= line2 << 4;
- CONTEXT |= line1 << 11;
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
- }
- if(bVal) {
- GBREG->setPixel(w, h, bVal);
- }
- line1 = ((line1 << 1) | GBREG->getPixel(w + 3, h - 2)) & 0x1f;
- line2 = ((line2 << 1) | GBREG->getPixel(w + 4, h - 1)) & 0x7f;
- line3 = ((line3 << 1) | bVal) & 0x0f;
- }
- }
- }
- return GBREG;
-}
-CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template0_opt2(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)
-{
- FX_BOOL LTP, SLTP, bVal;
- FX_DWORD CONTEXT;
- CJBig2_Image *GBREG;
- FX_DWORD line1, line2;
- FX_BYTE *pLine, cVal;
- FX_INTPTR nStride, nStride2;
- FX_INT32 nBits, k;
- LTP = 0;
- JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
- if (GBREG->m_pData == NULL) {
- delete GBREG;
- m_pModule->JBig2_Error("Generic region decoding procedure: Create Image Failed with width = %d, height = %d\n", GBW, GBH);
- return NULL;
- }
- pLine = GBREG->m_pData;
- nStride = GBREG->m_nStride;
- nStride2 = nStride << 1;
- for(FX_DWORD h = 0; h < GBH; h++) {
- if(TPGDON) {
- SLTP = pArithDecoder->DECODE(&gbContext[0x9b25]);
- LTP = LTP ^ SLTP;
- }
- if(LTP == 1) {
- GBREG->copyLine(h, h - 1);
- } else {
- line1 = (h > 1) ? pLine[-nStride2] << 6 : 0;
- line2 = (h > 0) ? pLine[-nStride] : 0;
- CONTEXT = (line1 & 0xf800) | (line2 & 0x07f0);
- for(FX_DWORD w = 0; w < GBW; w += 8) {
- if(w + 8 < GBW) {
- nBits = 8;
- if(h > 1) {
- line1 = (line1 << 8) | (pLine[-nStride2 + (w >> 3) + 1] << 6);
- }
- if(h > 0) {
- line2 = (line2 << 8) | (pLine[-nStride + (w >> 3) + 1]);
- }
- } else {
- nBits = GBW - w;
- if(h > 1) {
- line1 <<= 8;
- }
- if(h > 0) {
- line2 <<= 8;
- }
- }
- cVal = 0;
- for(k = 0; k < nBits; k++) {
- if(USESKIP && SKIP->getPixel(w, h)) {
- bVal = 0;
- } else {
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
- }
- cVal |= bVal << (7 - k);
- CONTEXT = ((CONTEXT & 0x7bf7) << 1) | bVal
- | ((line1 >> (7 - k)) & 0x0800)
- | ((line2 >> (7 - k)) & 0x0010);
- }
- pLine[w >> 3] = cVal;
- }
- }
- pLine += nStride;
- }
- return GBREG;
-}
-CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template0_opt3(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)
-{
- FX_BOOL LTP, SLTP, bVal;
- FX_DWORD CONTEXT;
- CJBig2_Image *GBREG;
- FX_DWORD line1, line2;
- FX_BYTE *pLine, *pLine1, *pLine2, cVal;
- FX_INT32 nStride, nStride2, k;
- FX_INT32 nLineBytes, nBitsLeft, cc;
- LTP = 0;
- JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
- if (GBREG->m_pData == NULL) {
- delete GBREG;
- m_pModule->JBig2_Error("Generic region decoding procedure: Create Image Failed with width = %d, height = %d\n", GBW, GBH);
- return NULL;
- }
- pLine = GBREG->m_pData;
- nStride = GBREG->m_nStride;
- nStride2 = nStride << 1;
- nLineBytes = ((GBW + 7) >> 3) - 1;
- nBitsLeft = GBW - (nLineBytes << 3);
- FX_DWORD height = GBH & 0x7fffffff;
- for(FX_DWORD h = 0; h < height; h++) {
- if(TPGDON) {
- SLTP = pArithDecoder->DECODE(&gbContext[0x9b25]);
- LTP = LTP ^ SLTP;
- }
- if(LTP == 1) {
- GBREG->copyLine(h, h - 1);
- } else {
- if(h > 1) {
- pLine1 = pLine - nStride2;
- pLine2 = pLine - nStride;
- line1 = (*pLine1++) << 6;
- line2 = *pLine2++;
- CONTEXT = ((line1 & 0xf800) | (line2 & 0x07f0));
- for(cc = 0; cc < nLineBytes; cc++) {
- line1 = (line1 << 8) | ((*pLine1++) << 6);
- line2 = (line2 << 8) | (*pLine2++);
- cVal = 0;
- for(k = 7; k >= 0; k--) {
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
- cVal |= bVal << k;
- CONTEXT = (((CONTEXT & 0x7bf7) << 1) | bVal
- | ((line1 >> k) & 0x0800)
- | ((line2 >> k) & 0x0010));
- }
- pLine[cc] = cVal;
- }
- line1 <<= 8;
- line2 <<= 8;
- cVal = 0;
- for(k = 0; k < nBitsLeft; k++) {
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
- cVal |= bVal << (7 - k);
- CONTEXT = (((CONTEXT & 0x7bf7) << 1) | bVal
- | ((line1 >> (7 - k)) & 0x0800)
- | ((line2 >> (7 - k)) & 0x0010));
- }
- pLine[nLineBytes] = cVal;
- } else {
- pLine2 = pLine - nStride;
- line2 = (h & 1) ? (*pLine2++) : 0;
- CONTEXT = (line2 & 0x07f0);
- for(cc = 0; cc < nLineBytes; cc++) {
- if(h & 1) {
- line2 = (line2 << 8) | (*pLine2++);
- }
- cVal = 0;
- for(k = 7; k >= 0; k--) {
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
- cVal |= bVal << k;
- CONTEXT = (((CONTEXT & 0x7bf7) << 1) | bVal
- | ((line2 >> k) & 0x0010));
- }
- pLine[cc] = cVal;
- }
- line2 <<= 8;
- cVal = 0;
- for(k = 0; k < nBitsLeft; k++) {
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
- cVal |= bVal << (7 - k);
- CONTEXT = (((CONTEXT & 0x7bf7) << 1) | bVal
- | (((line2 >> (7 - k))) & 0x0010));
- }
- pLine[nLineBytes] = cVal;
- }
- }
- pLine += nStride;
- }
- return GBREG;
-}
-CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template0_unopt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)
-{
- FX_BOOL LTP, SLTP, bVal;
- FX_DWORD CONTEXT;
- CJBig2_Image *GBREG;
- FX_DWORD line1, line2, line3;
- LTP = 0;
- JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
- GBREG->fill(0);
- for(FX_DWORD h = 0; h < GBH; h++) {
- if(TPGDON) {
- SLTP = pArithDecoder->DECODE(&gbContext[0x9b25]);
- LTP = LTP ^ SLTP;
- }
- if(LTP == 1) {
- GBREG->copyLine(h, h - 1);
- } else {
- line1 = GBREG->getPixel(1, h - 2);
- line1 |= GBREG->getPixel(0, h - 2) << 1;
- line2 = GBREG->getPixel(2, h - 1);
- line2 |= GBREG->getPixel(1, h - 1) << 1;
- line2 |= GBREG->getPixel(0, h - 1) << 2;
- line3 = 0;
- for(FX_DWORD w = 0; w < GBW; w++) {
- if(USESKIP && SKIP->getPixel(w, h)) {
- bVal = 0;
- } else {
- CONTEXT = line3;
- CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 4;
- CONTEXT |= line2 << 5;
- CONTEXT |= GBREG->getPixel(w + GBAT[2], h + GBAT[3]) << 10;
- CONTEXT |= GBREG->getPixel(w + GBAT[4], h + GBAT[5]) << 11;
- CONTEXT |= line1 << 12;
- CONTEXT |= GBREG->getPixel(w + GBAT[6], h + GBAT[7]) << 15;
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
- }
- if(bVal) {
- GBREG->setPixel(w, h, bVal);
- }
- line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 2)) & 0x07;
- line2 = ((line2 << 1) | GBREG->getPixel(w + 3, h - 1)) & 0x1f;
- line3 = ((line3 << 1) | bVal) & 0x0f;
- }
- }
- }
- return GBREG;
-}
-CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template1_opt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)
-{
- FX_BOOL LTP, SLTP, bVal;
- FX_DWORD CONTEXT;
- CJBig2_Image *GBREG;
- FX_DWORD line1, line2, line3;
- LTP = 0;
- JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
- GBREG->fill(0);
- for(FX_DWORD h = 0; h < GBH; h++) {
- if(TPGDON) {
- SLTP = pArithDecoder->DECODE(&gbContext[0x0795]);
- LTP = LTP ^ SLTP;
- }
- if(LTP == 1) {
- GBREG->copyLine(h, h - 1);
- } else {
- line1 = GBREG->getPixel(2, h - 2);
- line1 |= GBREG->getPixel(1, h - 2) << 1;
- line1 |= GBREG->getPixel(0, h - 2) << 2;
- line2 = GBREG->getPixel(3, h - 1);
- line2 |= GBREG->getPixel(2, h - 1) << 1;
- line2 |= GBREG->getPixel(1, h - 1) << 2;
- line2 |= GBREG->getPixel(0, h - 1) << 3;
- line3 = 0;
- for(FX_DWORD w = 0; w < GBW; w++) {
- if(USESKIP && SKIP->getPixel(w, h)) {
- bVal = 0;
- } else {
- CONTEXT = line3;
- CONTEXT |= line2 << 3;
- CONTEXT |= line1 << 9;
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
- }
- if(bVal) {
- GBREG->setPixel(w, h, bVal);
- }
- line1 = ((line1 << 1) | GBREG->getPixel(w + 3, h - 2)) & 0x0f;
- line2 = ((line2 << 1) | GBREG->getPixel(w + 4, h - 1)) & 0x3f;
- line3 = ((line3 << 1) | bVal) & 0x07;
- }
- }
- }
- return GBREG;
-}
-CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template1_opt2(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)
-{
- FX_BOOL LTP, SLTP, bVal;
- FX_DWORD CONTEXT;
- CJBig2_Image *GBREG;
- FX_DWORD line1, line2;
- FX_BYTE *pLine, cVal;
- FX_INTPTR nStride, nStride2;
- FX_INT32 nBits, k;
- LTP = 0;
- JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
- if (GBREG->m_pData == NULL) {
- delete GBREG;
- m_pModule->JBig2_Error("Generic region decoding procedure: Create Image Failed with width = %d, height = %d\n", GBW, GBH);
- return NULL;
- }
- pLine = GBREG->m_pData;
- nStride = GBREG->m_nStride;
- nStride2 = nStride << 1;
- for(FX_DWORD h = 0; h < GBH; h++) {
- if(TPGDON) {
- SLTP = pArithDecoder->DECODE(&gbContext[0x0795]);
- LTP = LTP ^ SLTP;
- }
- if(LTP == 1) {
- GBREG->copyLine(h, h - 1);
- } else {
- line1 = (h > 1) ? pLine[-nStride2] << 4 : 0;
- line2 = (h > 0) ? pLine[-nStride] : 0;
- CONTEXT = (line1 & 0x1e00) | ((line2 >> 1) & 0x01f8);
- for(FX_DWORD w = 0; w < GBW; w += 8) {
- if(w + 8 < GBW) {
- nBits = 8;
- if(h > 1) {
- line1 = (line1 << 8) | (pLine[-nStride2 + (w >> 3) + 1] << 4);
- }
- if(h > 0) {
- line2 = (line2 << 8) | (pLine[-nStride + (w >> 3) + 1]);
- }
- } else {
- nBits = GBW - w;
- if(h > 1) {
- line1 <<= 8;
- }
- if(h > 0) {
- line2 <<= 8;
- }
- }
- cVal = 0;
- for(k = 0; k < nBits; k++) {
- if(USESKIP && SKIP->getPixel(w, h)) {
- bVal = 0;
- } else {
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
- }
- cVal |= bVal << (7 - k);
- CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal
- | ((line1 >> (7 - k)) & 0x0200)
- | ((line2 >> (8 - k)) & 0x0008);
- }
- pLine[w >> 3] = cVal;
- }
- }
- pLine += nStride;
- }
- return GBREG;
-}
-CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template1_opt3(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)
-{
- FX_BOOL LTP, SLTP, bVal;
- FX_DWORD CONTEXT;
- CJBig2_Image *GBREG;
- FX_DWORD line1, line2;
- FX_BYTE *pLine, *pLine1, *pLine2, cVal;
- FX_INT32 nStride, nStride2, k;
- FX_INT32 nLineBytes, nBitsLeft, cc;
- LTP = 0;
- JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
- if (GBREG->m_pData == NULL) {
- delete GBREG;
- m_pModule->JBig2_Error("Generic region decoding procedure: Create Image Failed with width = %d, height = %d\n", GBW, GBH);
- return NULL;
- }
- pLine = GBREG->m_pData;
- nStride = GBREG->m_nStride;
- nStride2 = nStride << 1;
- nLineBytes = ((GBW + 7) >> 3) - 1;
- nBitsLeft = GBW - (nLineBytes << 3);
- for(FX_DWORD h = 0; h < GBH; h++) {
- if(TPGDON) {
- SLTP = pArithDecoder->DECODE(&gbContext[0x0795]);
- LTP = LTP ^ SLTP;
- }
- if(LTP == 1) {
- GBREG->copyLine(h, h - 1);
- } else {
- if(h > 1) {
- pLine1 = pLine - nStride2;
- pLine2 = pLine - nStride;
- line1 = (*pLine1++) << 4;
- line2 = *pLine2++;
- CONTEXT = (line1 & 0x1e00) | ((line2 >> 1) & 0x01f8);
- for(cc = 0; cc < nLineBytes; cc++) {
- line1 = (line1 << 8) | ((*pLine1++) << 4);
- line2 = (line2 << 8) | (*pLine2++);
- cVal = 0;
- for(k = 7; k >= 0; k--) {
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
- cVal |= bVal << k;
- CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal
- | ((line1 >> k) & 0x0200)
- | ((line2 >> (k + 1)) & 0x0008);
- }
- pLine[cc] = cVal;
- }
- line1 <<= 8;
- line2 <<= 8;
- cVal = 0;
- for(k = 0; k < nBitsLeft; k++) {
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
- cVal |= bVal << (7 - k);
- CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal
- | ((line1 >> (7 - k)) & 0x0200)
- | ((line2 >> (8 - k)) & 0x0008);
- }
- pLine[nLineBytes] = cVal;
- } else {
- pLine2 = pLine - nStride;
- line2 = (h & 1) ? (*pLine2++) : 0;
- CONTEXT = (line2 >> 1) & 0x01f8;
- for(cc = 0; cc < nLineBytes; cc++) {
- if(h & 1) {
- line2 = (line2 << 8) | (*pLine2++);
- }
- cVal = 0;
- for(k = 7; k >= 0; k--) {
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
- cVal |= bVal << k;
- CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal
- | ((line2 >> (k + 1)) & 0x0008);
- }
- pLine[cc] = cVal;
- }
- line2 <<= 8;
- cVal = 0;
- for(k = 0; k < nBitsLeft; k++) {
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
- cVal |= bVal << (7 - k);
- CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal
- | ((line2 >> (8 - k)) & 0x0008);
- }
- pLine[nLineBytes] = cVal;
- }
- }
- pLine += nStride;
- }
- return GBREG;
-}
-CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template1_unopt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)
-{
- FX_BOOL LTP, SLTP, bVal;
- FX_DWORD CONTEXT;
- CJBig2_Image *GBREG;
- FX_DWORD line1, line2, line3;
- LTP = 0;
- JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
- GBREG->fill(0);
- for(FX_DWORD h = 0; h < GBH; h++) {
- if(TPGDON) {
- SLTP = pArithDecoder->DECODE(&gbContext[0x0795]);
- LTP = LTP ^ SLTP;
- }
- if(LTP == 1) {
- GBREG->copyLine(h, h - 1);
- } else {
- line1 = GBREG->getPixel(2, h - 2);
- line1 |= GBREG->getPixel(1, h - 2) << 1;
- line1 |= GBREG->getPixel(0, h - 2) << 2;
- line2 = GBREG->getPixel(2, h - 1);
- line2 |= GBREG->getPixel(1, h - 1) << 1;
- line2 |= GBREG->getPixel(0, h - 1) << 2;
- line3 = 0;
- for(FX_DWORD w = 0; w < GBW; w++) {
- if(USESKIP && SKIP->getPixel(w, h)) {
- bVal = 0;
- } else {
- CONTEXT = line3;
- CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 3;
- CONTEXT |= line2 << 4;
- CONTEXT |= line1 << 9;
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
- }
- if(bVal) {
- GBREG->setPixel(w, h, bVal);
- }
- line1 = ((line1 << 1) | GBREG->getPixel(w + 3, h - 2)) & 0x0f;
- line2 = ((line2 << 1) | GBREG->getPixel(w + 3, h - 1)) & 0x1f;
- line3 = ((line3 << 1) | bVal) & 0x07;
- }
- }
- }
- return GBREG;
-}
-CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template2_opt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)
-{
- FX_BOOL LTP, SLTP, bVal;
- FX_DWORD CONTEXT;
- CJBig2_Image *GBREG;
- FX_DWORD line1, line2, line3;
- LTP = 0;
- JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
- GBREG->fill(0);
- for(FX_DWORD h = 0; h < GBH; h++) {
- if(TPGDON) {
- SLTP = pArithDecoder->DECODE(&gbContext[0x00e5]);
- LTP = LTP ^ SLTP;
- }
- if(LTP == 1) {
- GBREG->copyLine(h, h - 1);
- } else {
- line1 = GBREG->getPixel(1, h - 2);
- line1 |= GBREG->getPixel(0, h - 2) << 1;
- line2 = GBREG->getPixel(2, h - 1);
- line2 |= GBREG->getPixel(1, h - 1) << 1;
- line2 |= GBREG->getPixel(0, h - 1) << 2;
- line3 = 0;
- for(FX_DWORD w = 0; w < GBW; w++) {
- if(USESKIP && SKIP->getPixel(w, h)) {
- bVal = 0;
- } else {
- CONTEXT = line3;
- CONTEXT |= line2 << 2;
- CONTEXT |= line1 << 7;
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
- }
- if(bVal) {
- GBREG->setPixel(w, h, bVal);
- }
- line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 2)) & 0x07;
- line2 = ((line2 << 1) | GBREG->getPixel(w + 3, h - 1)) & 0x1f;
- line3 = ((line3 << 1) | bVal) & 0x03;
- }
- }
- }
- return GBREG;
-}
-CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template2_opt2(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)
-{
- FX_BOOL LTP, SLTP, bVal;
- FX_DWORD CONTEXT;
- CJBig2_Image *GBREG;
- FX_DWORD line1, line2;
- FX_BYTE *pLine, cVal;
- FX_INTPTR nStride, nStride2;
- FX_INT32 nBits, k;
- LTP = 0;
- JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
- if (GBREG->m_pData == NULL) {
- delete GBREG;
- m_pModule->JBig2_Error("Generic region decoding procedure: Create Image Failed with width = %d, height = %d\n", GBW, GBH);
- return NULL;
- }
- pLine = GBREG->m_pData;
- nStride = GBREG->m_nStride;
- nStride2 = nStride << 1;
- for(FX_DWORD h = 0; h < GBH; h++) {
- if(TPGDON) {
- SLTP = pArithDecoder->DECODE(&gbContext[0x00e5]);
- LTP = LTP ^ SLTP;
- }
- if(LTP == 1) {
- GBREG->copyLine(h, h - 1);
- } else {
- line1 = (h > 1) ? pLine[-nStride2] << 1 : 0;
- line2 = (h > 0) ? pLine[-nStride] : 0;
- CONTEXT = (line1 & 0x0380) | ((line2 >> 3) & 0x007c);
- for(FX_DWORD w = 0; w < GBW; w += 8) {
- if(w + 8 < GBW) {
- nBits = 8;
- if(h > 1) {
- line1 = (line1 << 8) | (pLine[-nStride2 + (w >> 3) + 1] << 1);
- }
- if(h > 0) {
- line2 = (line2 << 8) | (pLine[-nStride + (w >> 3) + 1]);
- }
- } else {
- nBits = GBW - w;
- if(h > 1) {
- line1 <<= 8;
- }
- if(h > 0) {
- line2 <<= 8;
- }
- }
- cVal = 0;
- for(k = 0; k < nBits; k++) {
- if(USESKIP && SKIP->getPixel(w, h)) {
- bVal = 0;
- } else {
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
- }
- cVal |= bVal << (7 - k);
- CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal
- | ((line1 >> (7 - k)) & 0x0080)
- | ((line2 >> (10 - k)) & 0x0004);
- }
- pLine[w >> 3] = cVal;
- }
- }
- pLine += nStride;
- }
- return GBREG;
-}
-CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template2_opt3(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)
-{
- FX_BOOL LTP, SLTP, bVal;
- FX_DWORD CONTEXT;
- CJBig2_Image *GBREG;
- FX_DWORD line1, line2;
- FX_BYTE *pLine, *pLine1, *pLine2, cVal;
- FX_INT32 nStride, nStride2, k;
- FX_INT32 nLineBytes, nBitsLeft, cc;
- LTP = 0;
- JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
- if (GBREG->m_pData == NULL) {
- delete GBREG;
- m_pModule->JBig2_Error("Generic region decoding procedure: Create Image Failed with width = %d, height = %d\n", GBW, GBH);
- return NULL;
- }
- pLine = GBREG->m_pData;
- nStride = GBREG->m_nStride;
- nStride2 = nStride << 1;
- nLineBytes = ((GBW + 7) >> 3) - 1;
- nBitsLeft = GBW - (nLineBytes << 3);
- for(FX_DWORD h = 0; h < GBH; h++) {
- if(TPGDON) {
- SLTP = pArithDecoder->DECODE(&gbContext[0x00e5]);
- LTP = LTP ^ SLTP;
- }
- if(LTP == 1) {
- GBREG->copyLine(h, h - 1);
- } else {
- if(h > 1) {
- pLine1 = pLine - nStride2;
- pLine2 = pLine - nStride;
- line1 = (*pLine1++) << 1;
- line2 = *pLine2++;
- CONTEXT = (line1 & 0x0380) | ((line2 >> 3) & 0x007c);
- for(cc = 0; cc < nLineBytes; cc++) {
- line1 = (line1 << 8) | ((*pLine1++) << 1);
- line2 = (line2 << 8) | (*pLine2++);
- cVal = 0;
- for(k = 7; k >= 0; k--) {
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
- cVal |= bVal << k;
- CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal
- | ((line1 >> k) & 0x0080)
- | ((line2 >> (k + 3)) & 0x0004);
- }
- pLine[cc] = cVal;
- }
- line1 <<= 8;
- line2 <<= 8;
- cVal = 0;
- for(k = 0; k < nBitsLeft; k++) {
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
- cVal |= bVal << (7 - k);
- CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal
- | ((line1 >> (7 - k)) & 0x0080)
- | ((line2 >> (10 - k)) & 0x0004);
- }
- pLine[nLineBytes] = cVal;
- } else {
- pLine2 = pLine - nStride;
- line2 = (h & 1) ? (*pLine2++) : 0;
- CONTEXT = (line2 >> 3) & 0x007c;
- for(cc = 0; cc < nLineBytes; cc++) {
- if(h & 1) {
- line2 = (line2 << 8) | (*pLine2++);
- }
- cVal = 0;
- for(k = 7; k >= 0; k--) {
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
- cVal |= bVal << k;
- CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal
- | ((line2 >> (k + 3)) & 0x0004);
- }
- pLine[cc] = cVal;
- }
- line2 <<= 8;
- cVal = 0;
- for(k = 0; k < nBitsLeft; k++) {
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
- cVal |= bVal << (7 - k);
- CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal
- | (((line2 >> (10 - k))) & 0x0004);
- }
- pLine[nLineBytes] = cVal;
- }
- }
- pLine += nStride;
- }
- return GBREG;
-}
-CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template2_unopt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)
-{
- FX_BOOL LTP, SLTP, bVal;
- FX_DWORD CONTEXT;
- CJBig2_Image *GBREG;
- FX_DWORD line1, line2, line3;
- LTP = 0;
- JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
- GBREG->fill(0);
- for(FX_DWORD h = 0; h < GBH; h++) {
- if(TPGDON) {
- SLTP = pArithDecoder->DECODE(&gbContext[0x00e5]);
- LTP = LTP ^ SLTP;
- }
- if(LTP == 1) {
- GBREG->copyLine(h, h - 1);
- } else {
- line1 = GBREG->getPixel(1, h - 2);
- line1 |= GBREG->getPixel(0, h - 2) << 1;
- line2 = GBREG->getPixel(1, h - 1);
- line2 |= GBREG->getPixel(0, h - 1) << 1;
- line3 = 0;
- for(FX_DWORD w = 0; w < GBW; w++) {
- if(USESKIP && SKIP->getPixel(w, h)) {
- bVal = 0;
- } else {
- CONTEXT = line3;
- CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 2;
- CONTEXT |= line2 << 3;
- CONTEXT |= line1 << 7;
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
- }
- if(bVal) {
- GBREG->setPixel(w, h, bVal);
- }
- line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 2)) & 0x07;
- line2 = ((line2 << 1) | GBREG->getPixel(w + 2, h - 1)) & 0x0f;
- line3 = ((line3 << 1) | bVal) & 0x03;
- }
- }
- }
- return GBREG;
-}
-CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template3_opt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)
-{
- FX_BOOL LTP, SLTP, bVal;
- FX_DWORD CONTEXT;
- CJBig2_Image *GBREG;
- FX_DWORD line1, line2;
- LTP = 0;
- JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
- GBREG->fill(0);
- for(FX_DWORD h = 0; h < GBH; h++) {
- if(TPGDON) {
- SLTP = pArithDecoder->DECODE(&gbContext[0x0195]);
- LTP = LTP ^ SLTP;
- }
- if(LTP == 1) {
- GBREG->copyLine(h, h - 1);
- } else {
- line1 = GBREG->getPixel(2, h - 1);
- line1 |= GBREG->getPixel(1, h - 1) << 1;
- line1 |= GBREG->getPixel(0, h - 1) << 2;
- line2 = 0;
- for(FX_DWORD w = 0; w < GBW; w++) {
- if(USESKIP && SKIP->getPixel(w, h)) {
- bVal = 0;
- } else {
- CONTEXT = line2;
- CONTEXT |= line1 << 4;
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
- }
- if(bVal) {
- GBREG->setPixel(w, h, bVal);
- }
- line1 = ((line1 << 1) | GBREG->getPixel(w + 3, h - 1)) & 0x3f;
- line2 = ((line2 << 1) | bVal) & 0x0f;
- }
- }
- }
- return GBREG;
-}
-CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template3_opt2(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)
-{
- FX_BOOL LTP, SLTP, bVal;
- FX_DWORD CONTEXT;
- CJBig2_Image *GBREG;
- FX_DWORD line1;
- FX_BYTE *pLine, cVal;
- FX_INTPTR nStride, nStride2;
- FX_INT32 nBits, k;
- LTP = 0;
- JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
- if (GBREG->m_pData == NULL) {
- delete GBREG;
- m_pModule->JBig2_Error("Generic region decoding procedure: Create Image Failed with width = %d, height = %d\n", GBW, GBH);
- return NULL;
- }
- pLine = GBREG->m_pData;
- nStride = GBREG->m_nStride;
- nStride2 = nStride << 1;
- for(FX_DWORD h = 0; h < GBH; h++) {
- if(TPGDON) {
- SLTP = pArithDecoder->DECODE(&gbContext[0x0195]);
- LTP = LTP ^ SLTP;
- }
- if(LTP == 1) {
- GBREG->copyLine(h, h - 1);
- } else {
- line1 = (h > 0) ? pLine[-nStride] : 0;
- CONTEXT = (line1 >> 1) & 0x03f0;
- for(FX_DWORD w = 0; w < GBW; w += 8) {
- if(w + 8 < GBW) {
- nBits = 8;
- if(h > 0) {
- line1 = (line1 << 8) | (pLine[-nStride + (w >> 3) + 1]);
- }
- } else {
- nBits = GBW - w;
- if(h > 0) {
- line1 <<= 8;
- }
- }
- cVal = 0;
- for(k = 0; k < nBits; k++) {
- if(USESKIP && SKIP->getPixel(w, h)) {
- bVal = 0;
- } else {
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
- }
- cVal |= bVal << (7 - k);
- CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal
- | ((line1 >> (8 - k)) & 0x0010);
- }
- pLine[w >> 3] = cVal;
- }
- }
- pLine += nStride;
- }
- return GBREG;
-}
-CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template3_opt3(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)
-{
- FX_BOOL LTP, SLTP, bVal;
- FX_DWORD CONTEXT;
- CJBig2_Image *GBREG;
- FX_DWORD line1;
- FX_BYTE *pLine, *pLine1, cVal;
- FX_INT32 nStride, k;
- FX_INT32 nLineBytes, nBitsLeft, cc;
- LTP = 0;
- JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
- if (GBREG->m_pData == NULL) {
- delete GBREG;
- m_pModule->JBig2_Error("Generic region decoding procedure: Create Image Failed with width = %d, height = %d\n", GBW, GBH);
- return NULL;
- }
- pLine = GBREG->m_pData;
- nStride = GBREG->m_nStride;
- nLineBytes = ((GBW + 7) >> 3) - 1;
- nBitsLeft = GBW - (nLineBytes << 3);
- for(FX_DWORD h = 0; h < GBH; h++) {
- if(TPGDON) {
- SLTP = pArithDecoder->DECODE(&gbContext[0x0195]);
- LTP = LTP ^ SLTP;
- }
- if(LTP == 1) {
- GBREG->copyLine(h, h - 1);
- } else {
- if(h > 0) {
- pLine1 = pLine - nStride;
- line1 = *pLine1++;
- CONTEXT = (line1 >> 1) & 0x03f0;
- for(cc = 0; cc < nLineBytes; cc++) {
- line1 = (line1 << 8) | (*pLine1++);
- cVal = 0;
- for(k = 7; k >= 0; k--) {
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
- cVal |= bVal << k;
- CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal
- | ((line1 >> (k + 1)) & 0x0010);
- }
- pLine[cc] = cVal;
- }
- line1 <<= 8;
- cVal = 0;
- for(k = 0; k < nBitsLeft; k++) {
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
- cVal |= bVal << (7 - k);
- CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal
- | ((line1 >> (8 - k)) & 0x0010);
- }
- pLine[nLineBytes] = cVal;
- } else {
- CONTEXT = 0;
- for(cc = 0; cc < nLineBytes; cc++) {
- cVal = 0;
- for(k = 7; k >= 0; k--) {
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
- cVal |= bVal << k;
- CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal;
- }
- pLine[cc] = cVal;
- }
- cVal = 0;
- for(k = 0; k < nBitsLeft; k++) {
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
- cVal |= bVal << (7 - k);
- CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal;
- }
- pLine[nLineBytes] = cVal;
- }
- }
- pLine += nStride;
- }
- return GBREG;
-}
-CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template3_unopt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)
-{
- FX_BOOL LTP, SLTP, bVal;
- FX_DWORD CONTEXT;
- CJBig2_Image *GBREG;
- FX_DWORD line1, line2;
- LTP = 0;
- JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
- GBREG->fill(0);
- for(FX_DWORD h = 0; h < GBH; h++) {
- if(TPGDON) {
- SLTP = pArithDecoder->DECODE(&gbContext[0x0195]);
- LTP = LTP ^ SLTP;
- }
- if(LTP == 1) {
- GBREG->copyLine(h, h - 1);
- } else {
- line1 = GBREG->getPixel(1, h - 1);
- line1 |= GBREG->getPixel(0, h - 1) << 1;
- line2 = 0;
- for(FX_DWORD w = 0; w < GBW; w++) {
- if(USESKIP && SKIP->getPixel(w, h)) {
- bVal = 0;
- } else {
- CONTEXT = line2;
- CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 4;
- CONTEXT |= line1 << 5;
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
- }
- if(bVal) {
- GBREG->setPixel(w, h, bVal);
- }
- line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 1)) & 0x1f;
- line2 = ((line2 << 1) | bVal) & 0x0f;
- }
- }
- }
- return GBREG;
-}
-CJBig2_Image *CJBig2_GRDProc::decode_Arith_V2(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)
-{
- FX_BOOL LTP, SLTP, bVal;
- FX_DWORD CONTEXT;
- CJBig2_Image *GBREG;
- FX_DWORD line1, line2, line3;
- LTP = 0;
- JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
- GBREG->fill(0);
- for(FX_DWORD h = 0; h < GBH; h++) {
- if(TPGDON) {
- switch(GBTEMPLATE) {
- case 0:
- CONTEXT = 0x9b25;
- break;
- case 1:
- CONTEXT = 0x0795;
- break;
- case 2:
- CONTEXT = 0x00e5;
- break;
- case 3:
- CONTEXT = 0x0195;
- break;
- }
- SLTP = pArithDecoder->DECODE(&gbContext[CONTEXT]);
- LTP = LTP ^ SLTP;
- }
- if(LTP == 1) {
- GBREG->copyLine(h, h - 1);
- } else {
- switch(GBTEMPLATE) {
- case 0: {
- line1 = GBREG->getPixel(1, h - 2);
- line1 |= GBREG->getPixel(0, h - 2) << 1;
- line2 = GBREG->getPixel(2, h - 1);
- line2 |= GBREG->getPixel(1, h - 1) << 1;
- line2 |= GBREG->getPixel(0, h - 1) << 2;
- line3 = 0;
- for(FX_DWORD w = 0; w < GBW; w++) {
- if(USESKIP && SKIP->getPixel(w, h)) {
- bVal = 0;
- } else {
- CONTEXT = line3;
- CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 4;
- CONTEXT |= line2 << 5;
- CONTEXT |= GBREG->getPixel(w + GBAT[2], h + GBAT[3]) << 10;
- CONTEXT |= GBREG->getPixel(w + GBAT[4], h + GBAT[5]) << 11;
- CONTEXT |= line1 << 12;
- CONTEXT |= GBREG->getPixel(w + GBAT[6], h + GBAT[7]) << 15;
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
- }
- if(bVal) {
- GBREG->setPixel(w, h, bVal);
- }
- line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 2)) & 0x07;
- line2 = ((line2 << 1) | GBREG->getPixel(w + 3, h - 1)) & 0x1f;
- line3 = ((line3 << 1) | bVal) & 0x0f;
- }
- }
- break;
- case 1: {
- line1 = GBREG->getPixel(2, h - 2);
- line1 |= GBREG->getPixel(1, h - 2) << 1;
- line1 |= GBREG->getPixel(0, h - 2) << 2;
- line2 = GBREG->getPixel(2, h - 1);
- line2 |= GBREG->getPixel(1, h - 1) << 1;
- line2 |= GBREG->getPixel(0, h - 1) << 2;
- line3 = 0;
- for(FX_DWORD w = 0; w < GBW; w++) {
- if(USESKIP && SKIP->getPixel(w, h)) {
- bVal = 0;
- } else {
- CONTEXT = line3;
- CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 3;
- CONTEXT |= line2 << 4;
- CONTEXT |= line1 << 9;
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
- }
- if(bVal) {
- GBREG->setPixel(w, h, bVal);
- }
- line1 = ((line1 << 1) | GBREG->getPixel(w + 3, h - 2)) & 0x0f;
- line2 = ((line2 << 1) | GBREG->getPixel(w + 3, h - 1)) & 0x1f;
- line3 = ((line3 << 1) | bVal) & 0x07;
- }
- }
- break;
- case 2: {
- line1 = GBREG->getPixel(1, h - 2);
- line1 |= GBREG->getPixel(0, h - 2) << 1;
- line2 = GBREG->getPixel(1, h - 1);
- line2 |= GBREG->getPixel(0, h - 1) << 1;
- line3 = 0;
- for(FX_DWORD w = 0; w < GBW; w++) {
- if(USESKIP && SKIP->getPixel(w, h)) {
- bVal = 0;
- } else {
- CONTEXT = line3;
- CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 2;
- CONTEXT |= line2 << 3;
- CONTEXT |= line1 << 7;
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
- }
- if(bVal) {
- GBREG->setPixel(w, h, bVal);
- }
- line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 2)) & 0x07;
- line2 = ((line2 << 1) | GBREG->getPixel(w + 2, h - 1)) & 0x0f;
- line3 = ((line3 << 1) | bVal) & 0x03;
- }
- }
- break;
- case 3: {
- line1 = GBREG->getPixel(1, h - 1);
- line1 |= GBREG->getPixel(0, h - 1) << 1;
- line2 = 0;
- for(FX_DWORD w = 0; w < GBW; w++) {
- if(USESKIP && SKIP->getPixel(w, h)) {
- bVal = 0;
- } else {
- CONTEXT = line2;
- CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 4;
- CONTEXT |= line1 << 5;
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
- }
- if(bVal) {
- GBREG->setPixel(w, h, bVal);
- }
- line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 1)) & 0x1f;
- line2 = ((line2 << 1) | bVal) & 0x0f;
- }
- }
- break;
- }
- }
- }
- return GBREG;
-}
-CJBig2_Image *CJBig2_GRDProc::decode_Arith_V1(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)
-{
- FX_BOOL LTP, SLTP, bVal;
- FX_DWORD CONTEXT = 0;
- CJBig2_Image *GBREG;
- LTP = 0;
- JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
- GBREG->fill(0);
- for(FX_DWORD h = 0; h < GBH; h++) {
- if(TPGDON) {
- switch(GBTEMPLATE) {
- case 0:
- CONTEXT = 0x9b25;
- break;
- case 1:
- CONTEXT = 0x0795;
- break;
- case 2:
- CONTEXT = 0x00e5;
- break;
- case 3:
- CONTEXT = 0x0195;
- break;
- }
- SLTP = pArithDecoder->DECODE(&gbContext[CONTEXT]);
- LTP = LTP ^ SLTP;
- }
- if(LTP == 1) {
- for(FX_DWORD w = 0; w < GBW; w++) {
- GBREG->setPixel(w, h, GBREG->getPixel(w, h - 1));
- }
- } else {
- for(FX_DWORD w = 0; w < GBW; w++) {
- if(USESKIP && SKIP->getPixel(w, h)) {
- GBREG->setPixel(w, h, 0);
- } else {
- CONTEXT = 0;
- switch(GBTEMPLATE) {
- case 0:
- CONTEXT |= GBREG->getPixel(w - 1, h);
- CONTEXT |= GBREG->getPixel(w - 2, h) << 1;
- CONTEXT |= GBREG->getPixel(w - 3, h) << 2;
- CONTEXT |= GBREG->getPixel(w - 4, h) << 3;
- CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 4;
- CONTEXT |= GBREG->getPixel(w + 2, h - 1) << 5;
- CONTEXT |= GBREG->getPixel(w + 1, h - 1) << 6;
- CONTEXT |= GBREG->getPixel(w, h - 1) << 7;
- CONTEXT |= GBREG->getPixel(w - 1, h - 1) << 8;
- CONTEXT |= GBREG->getPixel(w - 2, h - 1) << 9;
- CONTEXT |= GBREG->getPixel(w + GBAT[2], h + GBAT[3]) << 10;
- CONTEXT |= GBREG->getPixel(w + GBAT[4], h + GBAT[5]) << 11;
- CONTEXT |= GBREG->getPixel(w + 1, h - 2) << 12;
- CONTEXT |= GBREG->getPixel(w, h - 2) << 13;
- CONTEXT |= GBREG->getPixel(w - 1, h - 2) << 14;
- CONTEXT |= GBREG->getPixel(w + GBAT[6], h + GBAT[7]) << 15;
- break;
- case 1:
- CONTEXT |= GBREG->getPixel(w - 1, h);
- CONTEXT |= GBREG->getPixel(w - 2, h) << 1;
- CONTEXT |= GBREG->getPixel(w - 3, h) << 2;
- CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 3;
- CONTEXT |= GBREG->getPixel(w + 2, h - 1) << 4;
- CONTEXT |= GBREG->getPixel(w + 1, h - 1) << 5;
- CONTEXT |= GBREG->getPixel(w, h - 1) << 6;
- CONTEXT |= GBREG->getPixel(w - 1, h - 1) << 7;
- CONTEXT |= GBREG->getPixel(w - 2, h - 1) << 8;
- CONTEXT |= GBREG->getPixel(w + 2, h - 2) << 9;
- CONTEXT |= GBREG->getPixel(w + 1, h - 2) << 10;
- CONTEXT |= GBREG->getPixel(w, h - 2) << 11;
- CONTEXT |= GBREG->getPixel(w - 1, h - 2) << 12;
- break;
- case 2:
- CONTEXT |= GBREG->getPixel(w - 1, h);
- CONTEXT |= GBREG->getPixel(w - 2, h) << 1;
- CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 2;
- CONTEXT |= GBREG->getPixel(w + 1, h - 1) << 3;
- CONTEXT |= GBREG->getPixel(w, h - 1) << 4;
- CONTEXT |= GBREG->getPixel(w - 1, h - 1) << 5;
- CONTEXT |= GBREG->getPixel(w - 2, h - 1) << 6;
- CONTEXT |= GBREG->getPixel(w + 1, h - 2) << 7;
- CONTEXT |= GBREG->getPixel(w, h - 2) << 8;
- CONTEXT |= GBREG->getPixel(w - 1, h - 2) << 9;
- break;
- case 3:
- CONTEXT |= GBREG->getPixel(w - 1, h);
- CONTEXT |= GBREG->getPixel(w - 2, h) << 1;
- CONTEXT |= GBREG->getPixel(w - 3, h) << 2;
- CONTEXT |= GBREG->getPixel(w - 4, h) << 3;
- CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 4;
- CONTEXT |= GBREG->getPixel(w + 1, h - 1) << 5;
- CONTEXT |= GBREG->getPixel(w, h - 1) << 6;
- CONTEXT |= GBREG->getPixel(w - 1, h - 1) << 7;
- CONTEXT |= GBREG->getPixel(w - 2, h - 1) << 8;
- CONTEXT |= GBREG->getPixel(w - 3, h - 1) << 9;
- break;
- }
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
- GBREG->setPixel(w, h, bVal);
- }
- }
- }
- }
- return GBREG;
-}
-CJBig2_Image *CJBig2_GRDProc::decode_MMR(CJBig2_BitStream *pStream)
-{
- int bitpos, i;
- CJBig2_Image *pImage;
- JBIG2_ALLOC(pImage, CJBig2_Image(GBW, GBH));
- if (pImage->m_pData == NULL) {
- delete pImage;
- m_pModule->JBig2_Error("Generic region decoding procedure: Create Image Failed with width = %d, height = %d\n", GBW, GBH);
- return NULL;
- }
- bitpos = (int)pStream->getBitPos();
- _FaxG4Decode(m_pModule, pStream->getBuf(), pStream->getLength(), &bitpos, pImage->m_pData, GBW, GBH, pImage->m_nStride);
- pStream->setBitPos(bitpos);
- for(i = 0; (FX_DWORD)i < pImage->m_nStride * GBH; i++) {
- pImage->m_pData[i] = ~pImage->m_pData[i];
- }
- return pImage;
-}
-CJBig2_Image *CJBig2_GRRDProc::decode(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext)
-{
- if (GRW == 0 || GRH == 0) {
- CJBig2_Image* pImage;
- JBIG2_ALLOC(pImage, CJBig2_Image(GRW, GRH));
- return pImage;
- }
- if(GRTEMPLATE == 0) {
- if((GRAT[0] == (signed char) - 1) && (GRAT[1] == (signed char) - 1)
- && (GRAT[2] == (signed char) - 1) && (GRAT[3] == (signed char) - 1)
- && (GRREFERENCEDX == 0) && (GRW == (FX_DWORD)GRREFERENCE->m_nWidth)) {
- return decode_Template0_opt(pArithDecoder, grContext);
- } else {
- return decode_Template0_unopt(pArithDecoder, grContext);
- }
- } else {
- if((GRREFERENCEDX == 0) && (GRW == (FX_DWORD)GRREFERENCE->m_nWidth)) {
- return decode_Template1_opt(pArithDecoder, grContext);
- } else {
- return decode_Template1_unopt(pArithDecoder, grContext);
- }
- }
-}
-CJBig2_Image *CJBig2_GRRDProc::decode_Template0_unopt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext)
-{
- FX_BOOL LTP, SLTP, bVal;
- FX_DWORD CONTEXT;
- CJBig2_Image *GRREG;
- FX_DWORD line1, line2, line3, line4, line5;
- LTP = 0;
- JBIG2_ALLOC(GRREG, CJBig2_Image(GRW, GRH));
- GRREG->fill(0);
- for(FX_DWORD h = 0; h < GRH; h++) {
- if(TPGRON) {
- SLTP = pArithDecoder->DECODE(&grContext[0x0010]);
- LTP = LTP ^ SLTP;
- }
- if(LTP == 0) {
- line1 = GRREG->getPixel(1, h - 1);
- line1 |= GRREG->getPixel(0, h - 1) << 1;
- line2 = 0;
- line3 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY - 1);
- line3 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY - 1) << 1;
- line4 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY);
- line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY) << 1;
- line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX - 1, h - GRREFERENCEDY) << 2;
- line5 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY + 1);
- line5 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY + 1) << 1;
- line5 |= GRREFERENCE->getPixel(-GRREFERENCEDX - 1, h - GRREFERENCEDY + 1) << 2;
- for(FX_DWORD w = 0; w < GRW; w++) {
- CONTEXT = line5;
- CONTEXT |= line4 << 3;
- CONTEXT |= line3 << 6;
- CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + GRAT[2], h - GRREFERENCEDY + GRAT[3]) << 8;
- CONTEXT |= line2 << 9;
- CONTEXT |= line1 << 10;
- CONTEXT |= GRREG->getPixel(w + GRAT[0], h + GRAT[1]) << 12;
- bVal = pArithDecoder->DECODE(&grContext[CONTEXT]);
- GRREG->setPixel(w, h, bVal);
- line1 = ((line1 << 1) | GRREG->getPixel(w + 2, h - 1)) & 0x03;
- line2 = ((line2 << 1) | bVal) & 0x01;
- line3 = ((line3 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY - 1)) & 0x03;
- line4 = ((line4 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY)) & 0x07;
- line5 = ((line5 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY + 1)) & 0x07;
- }
- } else {
- line1 = GRREG->getPixel(1, h - 1);
- line1 |= GRREG->getPixel(0, h - 1) << 1;
- line2 = 0;
- line3 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY - 1);
- line3 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY - 1) << 1;
- line4 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY);
- line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY) << 1;
- line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX - 1, h - GRREFERENCEDY) << 2;
- line5 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY + 1);
- line5 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY + 1) << 1;
- line5 |= GRREFERENCE->getPixel(-GRREFERENCEDX - 1, h - GRREFERENCEDY + 1) << 2;
- for(FX_DWORD w = 0; w < GRW; w++) {
- bVal = GRREFERENCE->getPixel(w, h);
- if(!(TPGRON && (bVal == GRREFERENCE->getPixel(w - 1, h - 1))
- && (bVal == GRREFERENCE->getPixel(w, h - 1))
- && (bVal == GRREFERENCE->getPixel(w + 1, h - 1))
- && (bVal == GRREFERENCE->getPixel(w - 1, h))
- && (bVal == GRREFERENCE->getPixel(w + 1, h))
- && (bVal == GRREFERENCE->getPixel(w - 1, h + 1))
- && (bVal == GRREFERENCE->getPixel(w, h + 1))
- && (bVal == GRREFERENCE->getPixel(w + 1, h + 1)))) {
- CONTEXT = line5;
- CONTEXT |= line4 << 3;
- CONTEXT |= line3 << 6;
- CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + GRAT[2], h - GRREFERENCEDY + GRAT[3]) << 8;
- CONTEXT |= line2 << 9;
- CONTEXT |= line1 << 10;
- CONTEXT |= GRREG->getPixel(w + GRAT[0], h + GRAT[1]) << 12;
- bVal = pArithDecoder->DECODE(&grContext[CONTEXT]);
- }
- GRREG->setPixel(w, h, bVal);
- line1 = ((line1 << 1) | GRREG->getPixel(w + 2, h - 1)) & 0x03;
- line2 = ((line2 << 1) | bVal) & 0x01;
- line3 = ((line3 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY - 1)) & 0x03;
- line4 = ((line4 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY)) & 0x07;
- line5 = ((line5 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY + 1)) & 0x07;
- }
- }
- }
- return GRREG;
-}
-CJBig2_Image *CJBig2_GRRDProc::decode_Template0_opt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext)
-{
- FX_BOOL LTP, SLTP, bVal;
- FX_DWORD CONTEXT;
- CJBig2_Image *GRREG;
- FX_DWORD line1, line1_r, line2_r, line3_r;
- FX_BYTE *pLine, *pLineR, cVal;
- FX_INTPTR nStride, nStrideR, nOffset;
- FX_INT32 k, nBits;
- FX_INT32 GRWR, GRHR;
- FX_INT32 GRW, GRH;
- GRW = (FX_INT32)CJBig2_GRRDProc::GRW;
- GRH = (FX_INT32)CJBig2_GRRDProc::GRH;
- LTP = 0;
- JBIG2_ALLOC(GRREG, CJBig2_Image(GRW, GRH));
- if (GRREG->m_pData == NULL) {
- delete GRREG;
- m_pModule->JBig2_Error("Generic refinement region decoding procedure: Create Image Failed with width = %d, height = %d\n", GRW, GRH);
- return NULL;
- }
- pLine = GRREG->m_pData;
- pLineR = GRREFERENCE->m_pData;
- nStride = GRREG->m_nStride;
- nStrideR = GRREFERENCE->m_nStride;
- GRWR = (FX_INT32)GRREFERENCE->m_nWidth;
- GRHR = (FX_INT32)GRREFERENCE->m_nHeight;
- if (GRREFERENCEDY < -GRHR + 1 || GRREFERENCEDY > GRHR - 1) {
- GRREFERENCEDY = 0;
- }
- nOffset = -GRREFERENCEDY * nStrideR;
- for (FX_INT32 h = 0; h < GRH; h++) {
- if(TPGRON) {
- SLTP = pArithDecoder->DECODE(&grContext[0x0010]);
- LTP = LTP ^ SLTP;
- }
- line1 = (h > 0) ? pLine[-nStride] << 4 : 0;
- FX_INT32 reference_h = h - GRREFERENCEDY;
- FX_BOOL line1_r_ok = (reference_h > 0 && reference_h < GRHR + 1);
- FX_BOOL line2_r_ok = (reference_h > -1 && reference_h < GRHR);
- FX_BOOL line3_r_ok = (reference_h > -2 && reference_h < GRHR - 1);
- line1_r = line1_r_ok ? pLineR[nOffset - nStrideR] : 0;
- line2_r = line2_r_ok ? pLineR[nOffset] : 0;
- line3_r = line3_r_ok ? pLineR[nOffset + nStrideR] : 0;
- if(LTP == 0) {
- CONTEXT = (line1 & 0x1c00) | (line1_r & 0x01c0)
- | ((line2_r >> 3) & 0x0038) | ((line3_r >> 6) & 0x0007);
- for (FX_INT32 w = 0; w < GRW; w += 8) {
- nBits = GRW - w > 8 ? 8 : GRW - w;
- if (h > 0)
- line1 = (line1 << 8) |
- (w + 8 < GRW ? pLine[-nStride + (w >> 3) + 1] << 4 : 0);
- if (h > GRHR + GRREFERENCEDY + 1) {
- line1_r = 0;
- line2_r = 0;
- line3_r = 0;
- } else {
- if(line1_r_ok)
- line1_r = (line1_r << 8) |
- (w + 8 < GRWR ? pLineR[nOffset - nStrideR + (w >> 3) + 1] : 0);
- if(line2_r_ok)
- line2_r = (line2_r << 8) |
- (w + 8 < GRWR ? pLineR[nOffset + (w >> 3) + 1] : 0);
- if(line3_r_ok)
- line3_r = (line3_r << 8) |
- (w + 8 < GRWR ? pLineR[nOffset + nStrideR + (w >> 3) + 1] : 0);
- else {
- line3_r = 0;
- }
- }
- cVal = 0;
- for (k = 0; k < nBits; k++) {
- bVal = pArithDecoder->DECODE(&grContext[CONTEXT]);
- cVal |= bVal << (7 - k);
- CONTEXT = ((CONTEXT & 0x0cdb) << 1) | (bVal << 9) |
- ((line1 >> (7 - k)) & 0x0400) |
- ((line1_r >> (7 - k)) & 0x0040) |
- ((line2_r >> (10 - k)) & 0x0008) |
- ((line3_r >> (13 - k)) & 0x0001);
- }
- pLine[w >> 3] = cVal;
- }
- } else {
- CONTEXT = (line1 & 0x1c00) | (line1_r & 0x01c0)
- | ((line2_r >> 3) & 0x0038) | ((line3_r >> 6) & 0x0007);
- for (FX_INT32 w = 0; w < GRW; w += 8) {
- nBits = GRW - w > 8 ? 8 : GRW - w;
- if (h > 0)
- line1 = (line1 << 8) |
- (w + 8 < GRW ? pLine[-nStride + (w >> 3) + 1] << 4 : 0);
- if(line1_r_ok)
- line1_r = (line1_r << 8) |
- (w + 8 < GRWR ? pLineR[nOffset - nStrideR + (w >> 3) + 1] : 0);
- if(line2_r_ok)
- line2_r = (line2_r << 8) |
- (w + 8 < GRWR ? pLineR[nOffset + (w >> 3) + 1] : 0);
- if(line3_r_ok)
- line3_r = (line3_r << 8) |
- (w + 8 < GRWR ? pLineR[nOffset + nStrideR + (w >> 3) + 1] : 0);
- else {
- line3_r = 0;
- }
- cVal = 0;
- for (k = 0; k < nBits; k++) {
- bVal = GRREFERENCE->getPixel(w + k, h);
- if(!(TPGRON && (bVal == GRREFERENCE->getPixel(w + k - 1, h - 1))
- && (bVal == GRREFERENCE->getPixel(w + k, h - 1))
- && (bVal == GRREFERENCE->getPixel(w + k + 1, h - 1))
- && (bVal == GRREFERENCE->getPixel(w + k - 1, h))
- && (bVal == GRREFERENCE->getPixel(w + k + 1, h))
- && (bVal == GRREFERENCE->getPixel(w + k - 1, h + 1))
- && (bVal == GRREFERENCE->getPixel(w + k, h + 1))
- && (bVal == GRREFERENCE->getPixel(w + k + 1, h + 1)))) {
- bVal = pArithDecoder->DECODE(&grContext[CONTEXT]);
- }
- cVal |= bVal << (7 - k);
- CONTEXT = ((CONTEXT & 0x0cdb) << 1) | (bVal << 9) |
- ((line1 >> (7 - k)) & 0x0400) |
- ((line1_r >> (7 - k)) & 0x0040) |
- ((line2_r >> (10 - k)) & 0x0008) |
- ((line3_r >> (13 - k)) & 0x0001);
- }
- pLine[w >> 3] = cVal;
- }
- }
- pLine += nStride;
- if (h < GRHR + GRREFERENCEDY) {
- pLineR += nStrideR;
- }
- }
- return GRREG;
-}
-CJBig2_Image *CJBig2_GRRDProc::decode_Template1_unopt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext)
-{
- FX_BOOL LTP, SLTP, bVal;
- FX_DWORD CONTEXT;
- CJBig2_Image *GRREG;
- FX_DWORD line1, line2, line3, line4, line5;
- LTP = 0;
- JBIG2_ALLOC(GRREG, CJBig2_Image(GRW, GRH));
- GRREG->fill(0);
- for(FX_DWORD h = 0; h < GRH; h++) {
- if(TPGRON) {
- SLTP = pArithDecoder->DECODE(&grContext[0x0008]);
- LTP = LTP ^ SLTP;
- }
- if(LTP == 0) {
- line1 = GRREG->getPixel(1, h - 1);
- line1 |= GRREG->getPixel(0, h - 1) << 1;
- line1 |= GRREG->getPixel(-1, h - 1) << 2;
- line2 = 0;
- line3 = GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY - 1);
- line4 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY);
- line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY) << 1;
- line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX - 1, h - GRREFERENCEDY) << 2;
- line5 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY + 1);
- line5 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY + 1) << 1;
- for(FX_DWORD w = 0; w < GRW; w++) {
- CONTEXT = line5;
- CONTEXT |= line4 << 2;
- CONTEXT |= line3 << 5;
- CONTEXT |= line2 << 6;
- CONTEXT |= line1 << 7;
- bVal = pArithDecoder->DECODE(&grContext[CONTEXT]);
- GRREG->setPixel(w, h, bVal);
- line1 = ((line1 << 1) | GRREG->getPixel(w + 2, h - 1)) & 0x07;
- line2 = ((line2 << 1) | bVal) & 0x01;
- line3 = ((line3 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY - 1)) & 0x01;
- line4 = ((line4 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY)) & 0x07;
- line5 = ((line5 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY + 1)) & 0x03;
- }
- } else {
- line1 = GRREG->getPixel(1, h - 1);
- line1 |= GRREG->getPixel(0, h - 1) << 1;
- line1 |= GRREG->getPixel(-1, h - 1) << 2;
- line2 = 0;
- line3 = GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY - 1);
- line4 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY);
- line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY) << 1;
- line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX - 1, h - GRREFERENCEDY) << 2;
- line5 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY + 1);
- line5 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY + 1) << 1;
- for(FX_DWORD w = 0; w < GRW; w++) {
- bVal = GRREFERENCE->getPixel(w, h);
- if(!(TPGRON && (bVal == GRREFERENCE->getPixel(w - 1, h - 1))
- && (bVal == GRREFERENCE->getPixel(w, h - 1))
- && (bVal == GRREFERENCE->getPixel(w + 1, h - 1))
- && (bVal == GRREFERENCE->getPixel(w - 1, h))
- && (bVal == GRREFERENCE->getPixel(w + 1, h))
- && (bVal == GRREFERENCE->getPixel(w - 1, h + 1))
- && (bVal == GRREFERENCE->getPixel(w, h + 1))
- && (bVal == GRREFERENCE->getPixel(w + 1, h + 1)))) {
- CONTEXT = line5;
- CONTEXT |= line4 << 2;
- CONTEXT |= line3 << 5;
- CONTEXT |= line2 << 6;
- CONTEXT |= line1 << 7;
- bVal = pArithDecoder->DECODE(&grContext[CONTEXT]);
- }
- GRREG->setPixel(w, h, bVal);
- line1 = ((line1 << 1) | GRREG->getPixel(w + 2, h - 1)) & 0x07;
- line2 = ((line2 << 1) | bVal) & 0x01;
- line3 = ((line3 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY - 1)) & 0x01;
- line4 = ((line4 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY)) & 0x07;
- line5 = ((line5 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY + 1)) & 0x03;
- }
- }
- }
- return GRREG;
-}
-CJBig2_Image *CJBig2_GRRDProc::decode_Template1_opt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext)
-{
- FX_BOOL LTP, SLTP, bVal;
- FX_DWORD CONTEXT;
- CJBig2_Image *GRREG;
- FX_DWORD line1, line1_r, line2_r, line3_r;
- FX_BYTE *pLine, *pLineR, cVal;
- FX_INTPTR nStride, nStrideR, nOffset;
- FX_INT32 k, nBits;
- FX_INT32 GRWR, GRHR;
- FX_INT32 GRW, GRH;
- GRW = (FX_INT32)CJBig2_GRRDProc::GRW;
- GRH = (FX_INT32)CJBig2_GRRDProc::GRH;
- LTP = 0;
- JBIG2_ALLOC(GRREG, CJBig2_Image(GRW, GRH));
- if (GRREG->m_pData == NULL) {
- delete GRREG;
- m_pModule->JBig2_Error("Generic refinement region decoding procedure: Create Image Failed with width = %d, height = %d\n", GRW, GRH);
- return NULL;
- }
- pLine = GRREG->m_pData;
- pLineR = GRREFERENCE->m_pData;
- nStride = GRREG->m_nStride;
- nStrideR = GRREFERENCE->m_nStride;
- GRWR = (FX_INT32)GRREFERENCE->m_nWidth;
- GRHR = (FX_INT32)GRREFERENCE->m_nHeight;
- if (GRREFERENCEDY < -GRHR + 1 || GRREFERENCEDY > GRHR - 1) {
- GRREFERENCEDY = 0;
- }
- nOffset = -GRREFERENCEDY * nStrideR;
- for (FX_INT32 h = 0; h < GRH; h++) {
- if(TPGRON) {
- SLTP = pArithDecoder->DECODE(&grContext[0x0008]);
- LTP = LTP ^ SLTP;
- }
- line1 = (h > 0) ? pLine[-nStride] << 1 : 0;
- FX_INT32 reference_h = h - GRREFERENCEDY;
- FX_BOOL line1_r_ok = (reference_h > 0 && reference_h < GRHR + 1);
- FX_BOOL line2_r_ok = (reference_h > -1 && reference_h < GRHR);
- FX_BOOL line3_r_ok = (reference_h > -2 && reference_h < GRHR - 1);
- line1_r = line1_r_ok ? pLineR[nOffset - nStrideR] : 0;
- line2_r = line2_r_ok ? pLineR[nOffset] : 0;
- line3_r = line3_r_ok ? pLineR[nOffset + nStrideR] : 0;
- if(LTP == 0) {
- CONTEXT = (line1 & 0x0380) | ((line1_r >> 2) & 0x0020)
- | ((line2_r >> 4) & 0x001c) | ((line3_r >> 6) & 0x0003);
- for (FX_INT32 w = 0; w < GRW; w += 8) {
- nBits = GRW - w > 8 ? 8 : GRW - w;
- if (h > 0)
- line1 = (line1 << 8) |
- (w + 8 < GRW ? pLine[-nStride + (w >> 3) + 1] << 1 : 0);
- if(line1_r_ok)
- line1_r = (line1_r << 8) |
- (w + 8 < GRWR ? pLineR[nOffset - nStrideR + (w >> 3) + 1] : 0);
- if(line2_r_ok)
- line2_r = (line2_r << 8) |
- (w + 8 < GRWR ? pLineR[nOffset + (w >> 3) + 1] : 0);
- if(line3_r_ok)
- line3_r = (line3_r << 8) |
- (w + 8 < GRWR ? pLineR[nOffset + nStrideR + (w >> 3) + 1] : 0);
- else {
- line3_r = 0;
- }
- cVal = 0;
- for (k = 0; k < nBits; k++) {
- bVal = pArithDecoder->DECODE(&grContext[CONTEXT]);
- cVal |= bVal << (7 - k);
- CONTEXT = ((CONTEXT & 0x018d) << 1) | (bVal << 6) |
- ((line1 >> (7 - k)) & 0x0080) |
- ((line1_r >> (9 - k)) & 0x0020) |
- ((line2_r >> (11 - k)) & 0x0004) |
- ((line3_r >> (13 - k)) & 0x0001);
- }
- pLine[w >> 3] = cVal;
- }
- } else {
- CONTEXT = (line1 & 0x0380) | ((line1_r >> 2) & 0x0020)
- | ((line2_r >> 4) & 0x001c) | ((line3_r >> 6) & 0x0003);
- for (FX_INT32 w = 0; w < GRW; w += 8) {
- nBits = GRW - w > 8 ? 8 : GRW - w;
- if (h > 0)
- line1 = (line1 << 8) |
- (w + 8 < GRW ? pLine[-nStride + (w >> 3) + 1] << 1 : 0);
- if(line1_r_ok)
- line1_r = (line1_r << 8) |
- (w + 8 < GRWR ? pLineR[nOffset - nStrideR + (w >> 3) + 1] : 0);
- if(line2_r_ok)
- line2_r = (line2_r << 8) |
- (w + 8 < GRWR ? pLineR[nOffset + (w >> 3) + 1] : 0);
- if(line3_r_ok)
- line3_r = (line3_r << 8) |
- (w + 8 < GRWR ? pLineR[nOffset + nStrideR + (w >> 3) + 1] : 0);
- else {
- line3_r = 0;
- }
- cVal = 0;
- for (k = 0; k < nBits; k++) {
- bVal = GRREFERENCE->getPixel(w + k, h);
- if(!(TPGRON && (bVal == GRREFERENCE->getPixel(w + k - 1, h - 1))
- && (bVal == GRREFERENCE->getPixel(w + k, h - 1))
- && (bVal == GRREFERENCE->getPixel(w + k + 1, h - 1))
- && (bVal == GRREFERENCE->getPixel(w + k - 1, h))
- && (bVal == GRREFERENCE->getPixel(w + k + 1, h))
- && (bVal == GRREFERENCE->getPixel(w + k - 1, h + 1))
- && (bVal == GRREFERENCE->getPixel(w + k, h + 1))
- && (bVal == GRREFERENCE->getPixel(w + k + 1, h + 1)))) {
- bVal = pArithDecoder->DECODE(&grContext[CONTEXT]);
- }
- cVal |= bVal << (7 - k);
- CONTEXT = ((CONTEXT & 0x018d) << 1) | (bVal << 6) |
- ((line1 >> (7 - k)) & 0x0080) |
- ((line1_r >> (9 - k)) & 0x0020) |
- ((line2_r >> (11 - k)) & 0x0004) |
- ((line3_r >> (13 - k)) & 0x0001);
- }
- pLine[w >> 3] = cVal;
- }
- }
- pLine += nStride;
- if (h < GRHR + GRREFERENCEDY) {
- pLineR += nStrideR;
- }
- }
- return GRREG;
-}
-CJBig2_Image *CJBig2_GRRDProc::decode_V1(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext)
-{
- FX_BOOL LTP, SLTP, bVal;
- FX_BOOL TPGRPIX, TPGRVAL;
- FX_DWORD CONTEXT;
- CJBig2_Image *GRREG;
- LTP = 0;
- JBIG2_ALLOC(GRREG, CJBig2_Image(GRW, GRH));
- GRREG->fill(0);
- for(FX_DWORD h = 0; h < GRH; h++) {
- if(TPGRON) {
- switch(GRTEMPLATE) {
- case 0:
- CONTEXT = 0x0010;
- break;
- case 1:
- CONTEXT = 0x0008;
- break;
- }
- SLTP = pArithDecoder->DECODE(&grContext[CONTEXT]);
- LTP = LTP ^ SLTP;
- }
- if(LTP == 0) {
- for(FX_DWORD w = 0; w < GRW; w++) {
- CONTEXT = 0;
- switch(GRTEMPLATE) {
- case 0:
- CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY + 1);
- CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY + 1) << 1;
- CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX - 1, h - GRREFERENCEDY + 1) << 2;
- CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY) << 3;
- CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY) << 4;
- CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX - 1, h - GRREFERENCEDY) << 5;
- CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY - 1) << 6;
- CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY - 1) << 7;
- CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + GRAT[2], h - GRREFERENCEDY + GRAT[3]) << 8;
- CONTEXT |= GRREG->getPixel(w - 1, h) << 9;
- CONTEXT |= GRREG->getPixel(w + 1, h - 1) << 10;
- CONTEXT |= GRREG->getPixel(w, h - 1) << 11;
- CONTEXT |= GRREG->getPixel(w + GRAT[0], h + GRAT[1]) << 12;
- break;
- case 1:
- CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY + 1);
- CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY + 1) << 1;
- CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY) << 2;
- CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY) << 3;
- CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX - 1, h - GRREFERENCEDY) << 4;
- CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY - 1) << 5;
- CONTEXT |= GRREG->getPixel(w - 1, h) << 6;
- CONTEXT |= GRREG->getPixel(w + 1, h - 1) << 7;
- CONTEXT |= GRREG->getPixel(w, h - 1) << 8;
- CONTEXT |= GRREG->getPixel(w - 1, h - 1) << 9;
- break;
- }
- bVal = pArithDecoder->DECODE(&grContext[CONTEXT]);
- GRREG->setPixel(w, h, bVal);
- }
- } else {
- for(FX_DWORD w = 0; w < GRW; w++) {
- bVal = GRREFERENCE->getPixel(w, h);
- if(TPGRON && (bVal == GRREFERENCE->getPixel(w - 1, h - 1))
- && (bVal == GRREFERENCE->getPixel(w, h - 1))
- && (bVal == GRREFERENCE->getPixel(w + 1, h - 1))
- && (bVal == GRREFERENCE->getPixel(w - 1, h))
- && (bVal == GRREFERENCE->getPixel(w + 1, h))
- && (bVal == GRREFERENCE->getPixel(w - 1, h + 1))
- && (bVal == GRREFERENCE->getPixel(w, h + 1))
- && (bVal == GRREFERENCE->getPixel(w + 1, h + 1))) {
- TPGRPIX = 1;
- TPGRVAL = bVal;
- } else {
- TPGRPIX = 0;
- }
- if(TPGRPIX) {
- GRREG->setPixel(w, h, TPGRVAL);
- } else {
- CONTEXT = 0;
- switch(GRTEMPLATE) {
- case 0:
- CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY + 1);
- CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY + 1) << 1;
- CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX - 1, h - GRREFERENCEDY + 1) << 2;
- CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY) << 3;
- CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY) << 4;
- CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX - 1, h - GRREFERENCEDY) << 5;
- CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY - 1) << 6;
- CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY - 1) << 7;
- CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + GRAT[2], h - GRREFERENCEDY + GRAT[3]) << 8;
- CONTEXT |= GRREG->getPixel(w - 1, h) << 9;
- CONTEXT |= GRREG->getPixel(w + 1, h - 1) << 10;
- CONTEXT |= GRREG->getPixel(w, h - 1) << 11;
- CONTEXT |= GRREG->getPixel(w + GRAT[0], h + GRAT[1]) << 12;
- break;
- case 1:
- CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY + 1);
- CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY + 1) << 1;
- CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY) << 2;
- CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY) << 3;
- CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX - 1, h - GRREFERENCEDY) << 4;
- CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY - 1) << 5;
- CONTEXT |= GRREG->getPixel(w - 1, h) << 6;
- CONTEXT |= GRREG->getPixel(w + 1, h - 1) << 7;
- CONTEXT |= GRREG->getPixel(w, h - 1) << 8;
- CONTEXT |= GRREG->getPixel(w - 1, h - 1) << 9;
- break;
- }
- bVal = pArithDecoder->DECODE(&grContext[CONTEXT]);
- GRREG->setPixel(w, h, bVal);
- }
- }
- }
- }
- return GRREG;
-}
-CJBig2_Image *CJBig2_TRDProc::decode_Huffman(CJBig2_BitStream *pStream, JBig2ArithCtx *grContext)
-{
- FX_INT32 STRIPT, FIRSTS;
- FX_DWORD NINSTANCES;
- FX_INT32 DT, DFS, CURS;
- FX_BYTE CURT;
- FX_INT32 SI, TI;
- FX_DWORD IDI;
- CJBig2_Image *IBI;
- FX_DWORD WI, HI;
- FX_INT32 IDS;
- FX_BOOL RI;
- FX_INT32 RDWI, RDHI, RDXI, RDYI;
- CJBig2_Image *IBOI;
- FX_DWORD WOI, HOI;
- CJBig2_Image *SBREG;
- FX_BOOL bFirst;
- FX_DWORD nTmp;
- FX_INT32 nVal, nBits;
- CJBig2_HuffmanDecoder *pHuffmanDecoder;
- CJBig2_GRRDProc *pGRRD;
- CJBig2_ArithDecoder *pArithDecoder;
- JBIG2_ALLOC(pHuffmanDecoder, CJBig2_HuffmanDecoder(pStream));
- JBIG2_ALLOC(SBREG, CJBig2_Image(SBW, SBH));
- SBREG->fill(SBDEFPIXEL);
- if(pHuffmanDecoder->decodeAValue(SBHUFFDT, &STRIPT) != 0) {
- m_pModule->JBig2_Error("text region decoding procedure (huffman): too short.");
- goto failed;
- }
- STRIPT *= SBSTRIPS;
- STRIPT = -STRIPT;
- FIRSTS = 0;
- NINSTANCES = 0;
- while(NINSTANCES < SBNUMINSTANCES) {
- if(pHuffmanDecoder->decodeAValue(SBHUFFDT, &DT) != 0) {
- m_pModule->JBig2_Error("text region decoding procedure (huffman): too short.");
- goto failed;
- }
- DT *= SBSTRIPS;
- STRIPT = STRIPT + DT;
- bFirst = TRUE;
- for(;;) {
- if(bFirst) {
- if(pHuffmanDecoder->decodeAValue(SBHUFFFS, &DFS) != 0) {
- m_pModule->JBig2_Error("text region decoding procedure (huffman): too short.");
- goto failed;
- }
- FIRSTS = FIRSTS + DFS;
- CURS = FIRSTS;
- bFirst = FALSE;
- } else {
- nVal = pHuffmanDecoder->decodeAValue(SBHUFFDS, &IDS);
- if(nVal == JBIG2_OOB) {
- break;
- } else if(nVal != 0) {
- m_pModule->JBig2_Error("text region decoding procedure (huffman): too short.");
- goto failed;
- } else {
- CURS = CURS + IDS + SBDSOFFSET;
- }
- }
- if(SBSTRIPS == 1) {
- CURT = 0;
- } else {
- nTmp = 1;
- while((FX_DWORD)(1 << nTmp) < SBSTRIPS) {
- nTmp ++;
- }
- if(pStream->readNBits(nTmp, &nVal) != 0) {
- m_pModule->JBig2_Error("text region decoding procedure (huffman): too short.");
- goto failed;
- }
- CURT = nVal;
- }
- TI = STRIPT + CURT;
- nVal = 0;
- nBits = 0;
- for(;;) {
- if(pStream->read1Bit(&nTmp) != 0) {
- m_pModule->JBig2_Error("text region decoding procedure (huffman): too short.");
- goto failed;
- }
- nVal = (nVal << 1) | nTmp;
- nBits ++;
- for(IDI = 0; IDI < SBNUMSYMS; IDI++) {
- if((nBits == SBSYMCODES[IDI].codelen) && (nVal == SBSYMCODES[IDI].code)) {
- break;
- }
- }
- if(IDI < SBNUMSYMS) {
- break;
- }
- }
- if(SBREFINE == 0) {
- RI = 0;
- } else {
- if(pStream->read1Bit(&RI) != 0) {
- m_pModule->JBig2_Error("text region decoding procedure (huffman): too short.");
- goto failed;
- }
- }
- if(RI == 0) {
- IBI = SBSYMS[IDI];
- } else {
- if((pHuffmanDecoder->decodeAValue(SBHUFFRDW, &RDWI) != 0)
- || (pHuffmanDecoder->decodeAValue(SBHUFFRDH, &RDHI) != 0)
- || (pHuffmanDecoder->decodeAValue(SBHUFFRDX, &RDXI) != 0)
- || (pHuffmanDecoder->decodeAValue(SBHUFFRDY, &RDYI) != 0)
- || (pHuffmanDecoder->decodeAValue(SBHUFFRSIZE, &nVal) != 0)) {
- m_pModule->JBig2_Error("text region decoding procedure (huffman): too short.");
- goto failed;
- }
- pStream->alignByte();
- nTmp = pStream->getOffset();
- IBOI = SBSYMS[IDI];
- if (!IBOI) {
- goto failed;
- }
- WOI = IBOI->m_nWidth;
- HOI = IBOI->m_nHeight;
- if ((int)(WOI + RDWI) < 0 || (int)(HOI + RDHI) < 0) {
- m_pModule->JBig2_Error("text region decoding procedure (huffman): Invalid RDWI or RDHI value.");
- goto failed;
- }
- JBIG2_ALLOC(pGRRD, CJBig2_GRRDProc());
- pGRRD->GRW = WOI + RDWI;
- pGRRD->GRH = HOI + RDHI;
- pGRRD->GRTEMPLATE = SBRTEMPLATE;
- pGRRD->GRREFERENCE = IBOI;
- pGRRD->GRREFERENCEDX = (RDWI >> 2) + RDXI;
- pGRRD->GRREFERENCEDY = (RDHI >> 2) + RDYI;
- pGRRD->TPGRON = 0;
- pGRRD->GRAT[0] = SBRAT[0];
- pGRRD->GRAT[1] = SBRAT[1];
- pGRRD->GRAT[2] = SBRAT[2];
- pGRRD->GRAT[3] = SBRAT[3];
- JBIG2_ALLOC(pArithDecoder, CJBig2_ArithDecoder(pStream));
- IBI = pGRRD->decode(pArithDecoder, grContext);
- if(IBI == NULL) {
- delete pGRRD;
- delete pArithDecoder;
- goto failed;
- }
- delete pArithDecoder;
- pStream->alignByte();
- pStream->offset(2);
- if((FX_DWORD)nVal != (pStream->getOffset() - nTmp)) {
- delete IBI;
- delete pGRRD;
- m_pModule->JBig2_Error("text region decoding procedure (huffman):"
- "bytes processed by generic refinement region decoding procedure doesn't equal SBHUFFRSIZE.");
- goto failed;
- }
- delete pGRRD;
- }
- if (!IBI) {
- continue;
- }
- WI = IBI->m_nWidth;
- HI = IBI->m_nHeight;
- if(TRANSPOSED == 0 && ((REFCORNER == JBIG2_CORNER_TOPRIGHT)
- || (REFCORNER == JBIG2_CORNER_BOTTOMRIGHT))) {
- CURS = CURS + WI - 1;
- } else if(TRANSPOSED == 1 && ((REFCORNER == JBIG2_CORNER_BOTTOMLEFT)
- || (REFCORNER == JBIG2_CORNER_BOTTOMRIGHT))) {
- CURS = CURS + HI - 1;
- }
- SI = CURS;
- if(TRANSPOSED == 0) {
- switch(REFCORNER) {
- case JBIG2_CORNER_TOPLEFT:
- SBREG->composeFrom(SI, TI, IBI, SBCOMBOP);
- break;
- case JBIG2_CORNER_TOPRIGHT:
- SBREG->composeFrom(SI - WI + 1, TI, IBI, SBCOMBOP);
- break;
- case JBIG2_CORNER_BOTTOMLEFT:
- SBREG->composeFrom(SI, TI - HI + 1, IBI, SBCOMBOP);
- break;
- case JBIG2_CORNER_BOTTOMRIGHT:
- SBREG->composeFrom(SI - WI + 1, TI - HI + 1, IBI, SBCOMBOP);
- break;
- }
- } else {
- switch(REFCORNER) {
- case JBIG2_CORNER_TOPLEFT:
- SBREG->composeFrom(TI, SI, IBI, SBCOMBOP);
- break;
- case JBIG2_CORNER_TOPRIGHT:
- SBREG->composeFrom(TI - WI + 1, SI, IBI, SBCOMBOP);
- break;
- case JBIG2_CORNER_BOTTOMLEFT:
- SBREG->composeFrom(TI, SI - HI + 1, IBI, SBCOMBOP);
- break;
- case JBIG2_CORNER_BOTTOMRIGHT:
- SBREG->composeFrom(TI - WI + 1, SI - HI + 1, IBI, SBCOMBOP);
- break;
- }
- }
- if(RI != 0) {
- delete IBI;
- }
- if(TRANSPOSED == 0 && ((REFCORNER == JBIG2_CORNER_TOPLEFT)
- || (REFCORNER == JBIG2_CORNER_BOTTOMLEFT))) {
- CURS = CURS + WI - 1;
- } else if(TRANSPOSED == 1 && ((REFCORNER == JBIG2_CORNER_TOPLEFT)
- || (REFCORNER == JBIG2_CORNER_TOPRIGHT))) {
- CURS = CURS + HI - 1;
- }
- NINSTANCES = NINSTANCES + 1;
- }
- }
- delete pHuffmanDecoder;
- return SBREG;
-failed:
- delete pHuffmanDecoder;
- delete SBREG;
- return NULL;
-}
-CJBig2_Image *CJBig2_TRDProc::decode_Arith(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext,
- JBig2IntDecoderState *pIDS)
-{
- FX_INT32 STRIPT, FIRSTS;
- FX_DWORD NINSTANCES;
- FX_INT32 DT, DFS, CURS;
- FX_INT32 CURT;
- FX_INT32 SI, TI;
- FX_DWORD IDI;
- CJBig2_Image *IBI;
- FX_DWORD WI, HI;
- FX_INT32 IDS;
- FX_BOOL RI;
- FX_INT32 RDWI, RDHI, RDXI, RDYI;
- CJBig2_Image *IBOI;
- FX_DWORD WOI, HOI;
- CJBig2_Image *SBREG;
- FX_BOOL bFirst;
- FX_INT32 nRet, nVal;
- FX_INT32 bRetained;
- CJBig2_ArithIntDecoder *IADT, *IAFS, *IADS, *IAIT, *IARI, *IARDW, *IARDH, *IARDX, *IARDY;
- CJBig2_ArithIaidDecoder *IAID;
- CJBig2_GRRDProc *pGRRD;
- if(pIDS) {
- IADT = pIDS->IADT;
- IAFS = pIDS->IAFS;
- IADS = pIDS->IADS;
- IAIT = pIDS->IAIT;
- IARI = pIDS->IARI;
- IARDW = pIDS->IARDW;
- IARDH = pIDS->IARDH;
- IARDX = pIDS->IARDX;
- IARDY = pIDS->IARDY;
- IAID = pIDS->IAID;
- bRetained = TRUE;
- } else {
- JBIG2_ALLOC(IADT, CJBig2_ArithIntDecoder());
- JBIG2_ALLOC(IAFS, CJBig2_ArithIntDecoder());
- JBIG2_ALLOC(IADS, CJBig2_ArithIntDecoder());
- JBIG2_ALLOC(IAIT, CJBig2_ArithIntDecoder());
- JBIG2_ALLOC(IARI, CJBig2_ArithIntDecoder());
- JBIG2_ALLOC(IARDW, CJBig2_ArithIntDecoder());
- JBIG2_ALLOC(IARDH, CJBig2_ArithIntDecoder());
- JBIG2_ALLOC(IARDX, CJBig2_ArithIntDecoder());
- JBIG2_ALLOC(IARDY, CJBig2_ArithIntDecoder());
- JBIG2_ALLOC(IAID , CJBig2_ArithIaidDecoder(SBSYMCODELEN));
- bRetained = FALSE;
- }
- JBIG2_ALLOC(SBREG, CJBig2_Image(SBW, SBH));
- SBREG->fill(SBDEFPIXEL);
- if(IADT->decode(pArithDecoder, &STRIPT) == -1) {
- m_pModule->JBig2_Error("text region decoding procedure (arith): too short.");
- goto failed;
- }
- STRIPT *= SBSTRIPS;
- STRIPT = -STRIPT;
- FIRSTS = 0;
- NINSTANCES = 0;
- while(NINSTANCES < SBNUMINSTANCES) {
- if(IADT->decode(pArithDecoder, &DT) == -1) {
- m_pModule->JBig2_Error("text region decoding procedure (arith): too short.");
- goto failed;
- }
- DT *= SBSTRIPS;
- STRIPT = STRIPT + DT;
- bFirst = TRUE;
- for(;;) {
- if(bFirst) {
- if(IAFS->decode(pArithDecoder, &DFS) == -1) {
- m_pModule->JBig2_Error("text region decoding procedure (arith): too short.");
- goto failed;
- }
- FIRSTS = FIRSTS + DFS;
- CURS = FIRSTS;
- bFirst = FALSE;
- } else {
- nRet = IADS->decode(pArithDecoder, &IDS);
- if(nRet == JBIG2_OOB) {
- break;
- } else if(nRet != 0) {
- m_pModule->JBig2_Error("text region decoding procedure (arith): too short.");
- goto failed;
- } else {
- CURS = CURS + IDS + SBDSOFFSET;
- }
- }
- if (NINSTANCES >= SBNUMINSTANCES) {
- break;
- }
- if(SBSTRIPS == 1) {
- CURT = 0;
- } else {
- if(IAIT->decode(pArithDecoder, &nVal) == -1) {
- m_pModule->JBig2_Error("text region decoding procedure (arith): too short.");
- goto failed;
- }
- CURT = nVal;
- }
- TI = STRIPT + CURT;
- if(IAID->decode(pArithDecoder, &nVal) == -1) {
- m_pModule->JBig2_Error("text region decoding procedure (arith): too short.");
- goto failed;
- }
- IDI = nVal;
- if(IDI >= SBNUMSYMS) {
- m_pModule->JBig2_Error("text region decoding procedure (arith): symbol id out of range.(%d/%d)",
- IDI, SBNUMSYMS);
- goto failed;
- }
- if(SBREFINE == 0) {
- RI = 0;
- } else {
- if(IARI->decode(pArithDecoder, &RI) == -1) {
- m_pModule->JBig2_Error("text region decoding procedure (arith): too short.");
- goto failed;
- }
- }
- if (!SBSYMS[IDI]) {
- goto failed;
- }
- if(RI == 0) {
- IBI = SBSYMS[IDI];
- } else {
- if((IARDW->decode(pArithDecoder, &RDWI) == -1)
- || (IARDH->decode(pArithDecoder, &RDHI) == -1)
- || (IARDX->decode(pArithDecoder, &RDXI) == -1)
- || (IARDY->decode(pArithDecoder, &RDYI) == -1)) {
- m_pModule->JBig2_Error("text region decoding procedure (arith): too short.");
- goto failed;
- }
- IBOI = SBSYMS[IDI];
- WOI = IBOI->m_nWidth;
- HOI = IBOI->m_nHeight;
- if ((int)(WOI + RDWI) < 0 || (int)(HOI + RDHI) < 0) {
- m_pModule->JBig2_Error("text region decoding procedure (arith): Invalid RDWI or RDHI value.");
- goto failed;
- }
- JBIG2_ALLOC(pGRRD, CJBig2_GRRDProc());
- pGRRD->GRW = WOI + RDWI;
- pGRRD->GRH = HOI + RDHI;
- pGRRD->GRTEMPLATE = SBRTEMPLATE;
- pGRRD->GRREFERENCE = IBOI;
- pGRRD->GRREFERENCEDX = (RDWI >> 1) + RDXI;
- pGRRD->GRREFERENCEDY = (RDHI >> 1) + RDYI;
- pGRRD->TPGRON = 0;
- pGRRD->GRAT[0] = SBRAT[0];
- pGRRD->GRAT[1] = SBRAT[1];
- pGRRD->GRAT[2] = SBRAT[2];
- pGRRD->GRAT[3] = SBRAT[3];
- IBI = pGRRD->decode(pArithDecoder, grContext);
- if(IBI == NULL) {
- delete pGRRD;
- goto failed;
- }
- delete pGRRD;
- }
- WI = IBI->m_nWidth;
- HI = IBI->m_nHeight;
- if(TRANSPOSED == 0 && ((REFCORNER == JBIG2_CORNER_TOPRIGHT)
- || (REFCORNER == JBIG2_CORNER_BOTTOMRIGHT))) {
- CURS = CURS + WI - 1;
- } else if(TRANSPOSED == 1 && ((REFCORNER == JBIG2_CORNER_BOTTOMLEFT)
- || (REFCORNER == JBIG2_CORNER_BOTTOMRIGHT))) {
- CURS = CURS + HI - 1;
- }
- SI = CURS;
- if(TRANSPOSED == 0) {
- switch(REFCORNER) {
- case JBIG2_CORNER_TOPLEFT:
- SBREG->composeFrom(SI, TI, IBI, SBCOMBOP);
- break;
- case JBIG2_CORNER_TOPRIGHT:
- SBREG->composeFrom(SI - WI + 1, TI, IBI, SBCOMBOP);
- break;
- case JBIG2_CORNER_BOTTOMLEFT:
- SBREG->composeFrom(SI, TI - HI + 1, IBI, SBCOMBOP);
- break;
- case JBIG2_CORNER_BOTTOMRIGHT:
- SBREG->composeFrom(SI - WI + 1, TI - HI + 1, IBI, SBCOMBOP);
- break;
- }
- } else {
- switch(REFCORNER) {
- case JBIG2_CORNER_TOPLEFT:
- SBREG->composeFrom(TI, SI, IBI, SBCOMBOP);
- break;
- case JBIG2_CORNER_TOPRIGHT:
- SBREG->composeFrom(TI - WI + 1, SI, IBI, SBCOMBOP);
- break;
- case JBIG2_CORNER_BOTTOMLEFT:
- SBREG->composeFrom(TI, SI - HI + 1, IBI, SBCOMBOP);
- break;
- case JBIG2_CORNER_BOTTOMRIGHT:
- SBREG->composeFrom(TI - WI + 1, SI - HI + 1, IBI, SBCOMBOP);
- break;
- }
- }
- if(RI != 0) {
- delete IBI;
- }
- if(TRANSPOSED == 0 && ((REFCORNER == JBIG2_CORNER_TOPLEFT)
- || (REFCORNER == JBIG2_CORNER_BOTTOMLEFT))) {
- CURS = CURS + WI - 1;
- } else if(TRANSPOSED == 1 && ((REFCORNER == JBIG2_CORNER_TOPLEFT)
- || (REFCORNER == JBIG2_CORNER_TOPRIGHT))) {
- CURS = CURS + HI - 1;
- }
- NINSTANCES = NINSTANCES + 1;
- }
- }
- if(bRetained == FALSE) {
- delete IADT;
- delete IAFS;
- delete IADS;
- delete IAIT;
- delete IARI;
- delete IARDW;
- delete IARDH;
- delete IARDX;
- delete IARDY;
- delete IAID;
- }
- return SBREG;
-failed:
- if(bRetained == FALSE) {
- delete IADT;
- delete IAFS;
- delete IADS;
- delete IAIT;
- delete IARI;
- delete IARDW;
- delete IARDH;
- delete IARDX;
- delete IARDY;
- delete IAID;
- }
- delete SBREG;
- return NULL;
-}
-CJBig2_SymbolDict *CJBig2_SDDProc::decode_Arith(CJBig2_ArithDecoder *pArithDecoder,
- JBig2ArithCtx *gbContext, JBig2ArithCtx *grContext)
-{
- CJBig2_Image **SDNEWSYMS;
- FX_DWORD HCHEIGHT, NSYMSDECODED;
- FX_INT32 HCDH;
- FX_DWORD SYMWIDTH, TOTWIDTH, HCFIRSTSYM;
- FX_INT32 DW;
- CJBig2_Image *BS;
- FX_DWORD I, J, REFAGGNINST;
- FX_BOOL *EXFLAGS;
- FX_DWORD EXINDEX;
- FX_BOOL CUREXFLAG;
- FX_DWORD EXRUNLENGTH;
- FX_INT32 nVal;
- FX_DWORD nTmp;
- FX_BOOL SBHUFF;
- FX_DWORD SBNUMSYMS;
- FX_BYTE SBSYMCODELEN;
- FX_DWORD IDI;
- FX_INT32 RDXI, RDYI;
- CJBig2_Image **SBSYMS;
- CJBig2_HuffmanTable *SBHUFFFS, *SBHUFFDS, *SBHUFFDT, *SBHUFFRDW, *SBHUFFRDH, *SBHUFFRDX, *SBHUFFRDY,
- *SBHUFFRSIZE;
- CJBig2_GRRDProc *pGRRD;
- CJBig2_GRDProc *pGRD;
- CJBig2_ArithIntDecoder *IADH, *IADW, *IAAI, *IARDX, *IARDY, *IAEX,
- *IADT, *IAFS, *IADS, *IAIT, *IARI, *IARDW, *IARDH;
- CJBig2_ArithIaidDecoder *IAID;
- CJBig2_SymbolDict *pDict;
- JBIG2_ALLOC(IADH, CJBig2_ArithIntDecoder());
- JBIG2_ALLOC(IADW, CJBig2_ArithIntDecoder());
- JBIG2_ALLOC(IAAI, CJBig2_ArithIntDecoder());
- JBIG2_ALLOC(IARDX, CJBig2_ArithIntDecoder());
- JBIG2_ALLOC(IARDY, CJBig2_ArithIntDecoder());
- JBIG2_ALLOC(IAEX, CJBig2_ArithIntDecoder());
- JBIG2_ALLOC(IADT, CJBig2_ArithIntDecoder());
- JBIG2_ALLOC(IAFS, CJBig2_ArithIntDecoder());
- JBIG2_ALLOC(IADS, CJBig2_ArithIntDecoder());
- JBIG2_ALLOC(IAIT, CJBig2_ArithIntDecoder());
- JBIG2_ALLOC(IARI, CJBig2_ArithIntDecoder());
- JBIG2_ALLOC(IARDW, CJBig2_ArithIntDecoder());
- JBIG2_ALLOC(IARDH, CJBig2_ArithIntDecoder());
- nTmp = 0;
- while((FX_DWORD)(1 << nTmp) < (SDNUMINSYMS + SDNUMNEWSYMS)) {
- nTmp ++;
- }
- JBIG2_ALLOC(IAID, CJBig2_ArithIaidDecoder((FX_BYTE)nTmp));
- SDNEWSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(SDNUMNEWSYMS, sizeof(CJBig2_Image*));
- FXSYS_memset32(SDNEWSYMS, 0 , SDNUMNEWSYMS * sizeof(CJBig2_Image*));
- HCHEIGHT = 0;
- NSYMSDECODED = 0;
- while(NSYMSDECODED < SDNUMNEWSYMS) {
- BS = NULL;
- if(IADH->decode(pArithDecoder, &HCDH) == -1) {
- m_pModule->JBig2_Error("symbol dictionary decoding procedure (arith): too short.");
- goto failed;
- }
- HCHEIGHT = HCHEIGHT + HCDH;
- if ((int)HCHEIGHT < 0 || (int)HCHEIGHT > JBIG2_MAX_IMAGE_SIZE) {
- m_pModule->JBig2_Error("symbol dictionary decoding procedure (arith): invalid HCHEIGHT value.");
- goto failed;
- }
- SYMWIDTH = 0;
- TOTWIDTH = 0;
- HCFIRSTSYM = NSYMSDECODED;
- for(;;) {
- nVal = IADW->decode(pArithDecoder, &DW);
- if(nVal == JBIG2_OOB) {
- break;
- } else if(nVal != 0) {
- m_pModule->JBig2_Error("symbol dictionary decoding procedure (arith): too short.");
- goto failed;
- } else {
- if (NSYMSDECODED >= SDNUMNEWSYMS) {
- m_pModule->JBig2_Error("symbol dictionary decoding procedure (arith): NSYMSDECODED >= SDNUMNEWSYMS.");
- goto failed;
- }
- SYMWIDTH = SYMWIDTH + DW;
- if ((int)SYMWIDTH < 0 || (int)SYMWIDTH > JBIG2_MAX_IMAGE_SIZE) {
- m_pModule->JBig2_Error("symbol dictionary decoding procedure (arith): invalid SYMWIDTH value.");
- goto failed;
- } else if (HCHEIGHT == 0 || SYMWIDTH == 0) {
- TOTWIDTH = TOTWIDTH + SYMWIDTH;
- SDNEWSYMS[NSYMSDECODED] = NULL;
- NSYMSDECODED = NSYMSDECODED + 1;
- continue;
- }
- TOTWIDTH = TOTWIDTH + SYMWIDTH;
- }
- if(SDREFAGG == 0) {
- JBIG2_ALLOC(pGRD, CJBig2_GRDProc());
- pGRD->MMR = 0;
- pGRD->GBW = SYMWIDTH;
- pGRD->GBH = HCHEIGHT;
- pGRD->GBTEMPLATE = SDTEMPLATE;
- pGRD->TPGDON = 0;
- pGRD->USESKIP = 0;
- pGRD->GBAT[0] = SDAT[0];
- pGRD->GBAT[1] = SDAT[1];
- pGRD->GBAT[2] = SDAT[2];
- pGRD->GBAT[3] = SDAT[3];
- pGRD->GBAT[4] = SDAT[4];
- pGRD->GBAT[5] = SDAT[5];
- pGRD->GBAT[6] = SDAT[6];
- pGRD->GBAT[7] = SDAT[7];
- BS = pGRD->decode_Arith(pArithDecoder, gbContext);
- if(BS == NULL) {
- delete pGRD;
- goto failed;
- }
- delete pGRD;
- } else {
- if(IAAI->decode(pArithDecoder, (int*)&REFAGGNINST) == -1) {
- m_pModule->JBig2_Error("symbol dictionary decoding procedure (arith): too short.");
- goto failed;
- }
- if(REFAGGNINST > 1) {
- CJBig2_TRDProc *pDecoder;
- JBIG2_ALLOC(pDecoder, CJBig2_TRDProc());
- pDecoder->SBHUFF = SDHUFF;
- pDecoder->SBREFINE = 1;
- pDecoder->SBW = SYMWIDTH;
- pDecoder->SBH = HCHEIGHT;
- pDecoder->SBNUMINSTANCES = REFAGGNINST;
- pDecoder->SBSTRIPS = 1;
- pDecoder->SBNUMSYMS = SDNUMINSYMS + NSYMSDECODED;
- SBNUMSYMS = pDecoder->SBNUMSYMS;
- nTmp = 0;
- while((FX_DWORD)(1 << nTmp) < SBNUMSYMS) {
- nTmp ++;
- }
- SBSYMCODELEN = (FX_BYTE)nTmp;
- pDecoder->SBSYMCODELEN = SBSYMCODELEN;
- SBSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(SBNUMSYMS, sizeof(CJBig2_Image*));
- JBIG2_memcpy(SBSYMS, SDINSYMS, SDNUMINSYMS * sizeof(CJBig2_Image*));
- JBIG2_memcpy(SBSYMS + SDNUMINSYMS, SDNEWSYMS, NSYMSDECODED * sizeof(CJBig2_Image*));
- pDecoder->SBSYMS = SBSYMS;
- pDecoder->SBDEFPIXEL = 0;
- pDecoder->SBCOMBOP = JBIG2_COMPOSE_OR;
- pDecoder->TRANSPOSED = 0;
- pDecoder->REFCORNER = JBIG2_CORNER_TOPLEFT;
- pDecoder->SBDSOFFSET = 0;
- JBIG2_ALLOC(SBHUFFFS, CJBig2_HuffmanTable(HuffmanTable_B6,
- sizeof(HuffmanTable_B6) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B6));
- JBIG2_ALLOC(SBHUFFDS, CJBig2_HuffmanTable(HuffmanTable_B8,
- sizeof(HuffmanTable_B8) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B8));
- JBIG2_ALLOC(SBHUFFDT, CJBig2_HuffmanTable(HuffmanTable_B11,
- sizeof(HuffmanTable_B11) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B11));
- JBIG2_ALLOC(SBHUFFRDW, CJBig2_HuffmanTable(HuffmanTable_B15,
- sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B15));
- JBIG2_ALLOC(SBHUFFRDH, CJBig2_HuffmanTable(HuffmanTable_B15,
- sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B15));
- JBIG2_ALLOC(SBHUFFRDX, CJBig2_HuffmanTable(HuffmanTable_B15,
- sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B15));
- JBIG2_ALLOC(SBHUFFRDY, CJBig2_HuffmanTable(HuffmanTable_B15,
- sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B15));
- JBIG2_ALLOC(SBHUFFRSIZE, CJBig2_HuffmanTable(HuffmanTable_B1,
- sizeof(HuffmanTable_B1) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B1));
- pDecoder->SBHUFFFS = SBHUFFFS;
- pDecoder->SBHUFFDS = SBHUFFDS;
- pDecoder->SBHUFFDT = SBHUFFDT;
- pDecoder->SBHUFFRDW = SBHUFFRDW;
- pDecoder->SBHUFFRDH = SBHUFFRDH;
- pDecoder->SBHUFFRDX = SBHUFFRDX;
- pDecoder->SBHUFFRDY = SBHUFFRDY;
- pDecoder->SBHUFFRSIZE = SBHUFFRSIZE;
- pDecoder->SBRTEMPLATE = SDRTEMPLATE;
- pDecoder->SBRAT[0] = SDRAT[0];
- pDecoder->SBRAT[1] = SDRAT[1];
- pDecoder->SBRAT[2] = SDRAT[2];
- pDecoder->SBRAT[3] = SDRAT[3];
- JBig2IntDecoderState ids;
- ids.IADT = IADT;
- ids.IAFS = IAFS;
- ids.IADS = IADS;
- ids.IAIT = IAIT;
- ids.IARI = IARI;
- ids.IARDW = IARDW;
- ids.IARDH = IARDH;
- ids.IARDX = IARDX;
- ids.IARDY = IARDY;
- ids.IAID = IAID;
- BS = pDecoder->decode_Arith(pArithDecoder, grContext, &ids);
- if(BS == NULL) {
- m_pModule->JBig2_Free(SBSYMS);
- delete SBHUFFFS;
- delete SBHUFFDS;
- delete SBHUFFDT;
- delete SBHUFFRDW;
- delete SBHUFFRDH;
- delete SBHUFFRDX;
- delete SBHUFFRDY;
- delete SBHUFFRSIZE;
- delete pDecoder;
- goto failed;
- }
- m_pModule->JBig2_Free(SBSYMS);
- delete SBHUFFFS;
- delete SBHUFFDS;
- delete SBHUFFDT;
- delete SBHUFFRDW;
- delete SBHUFFRDH;
- delete SBHUFFRDX;
- delete SBHUFFRDY;
- delete SBHUFFRSIZE;
- delete pDecoder;
- } else if(REFAGGNINST == 1) {
- SBHUFF = SDHUFF;
- SBNUMSYMS = SDNUMINSYMS + NSYMSDECODED;
- if(IAID->decode(pArithDecoder, (int*)&IDI) == -1) {
- m_pModule->JBig2_Error("symbol dictionary decoding procedure (arith): too short.");
- goto failed;
- }
- if((IARDX->decode(pArithDecoder, &RDXI) == -1)
- || (IARDY->decode(pArithDecoder, &RDYI) == -1)) {
- m_pModule->JBig2_Error("symbol dictionary decoding procedure (arith): too short.");
- goto failed;
- }
- if (IDI >= SBNUMSYMS) {
- m_pModule->JBig2_Error("symbol dictionary decoding procedure (arith):"
- " refinement references unknown symbol %d", IDI);
- goto failed;
- }
- SBSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(SBNUMSYMS, sizeof(CJBig2_Image*));
- JBIG2_memcpy(SBSYMS, SDINSYMS, SDNUMINSYMS * sizeof(CJBig2_Image*));
- JBIG2_memcpy(SBSYMS + SDNUMINSYMS, SDNEWSYMS, NSYMSDECODED * sizeof(CJBig2_Image*));
- if (!SBSYMS[IDI]) {
- m_pModule->JBig2_Free(SBSYMS);
- goto failed;
- }
- JBIG2_ALLOC(pGRRD, CJBig2_GRRDProc());
- pGRRD->GRW = SYMWIDTH;
- pGRRD->GRH = HCHEIGHT;
- pGRRD->GRTEMPLATE = SDRTEMPLATE;
- pGRRD->GRREFERENCE = SBSYMS[IDI];
- pGRRD->GRREFERENCEDX = RDXI;
- pGRRD->GRREFERENCEDY = RDYI;
- pGRRD->TPGRON = 0;
- pGRRD->GRAT[0] = SDRAT[0];
- pGRRD->GRAT[1] = SDRAT[1];
- pGRRD->GRAT[2] = SDRAT[2];
- pGRRD->GRAT[3] = SDRAT[3];
- BS = pGRRD->decode(pArithDecoder, grContext);
- if(BS == NULL) {
- m_pModule->JBig2_Free(SBSYMS);
- delete pGRRD;
- goto failed;
- }
- m_pModule->JBig2_Free(SBSYMS);
- delete pGRRD;
- }
- }
- SDNEWSYMS[NSYMSDECODED] = BS;
- BS = NULL;
- NSYMSDECODED = NSYMSDECODED + 1;
- }
- }
- EXINDEX = 0;
- CUREXFLAG = 0;
- EXFLAGS = (FX_BOOL*)m_pModule->JBig2_Malloc2(sizeof(FX_BOOL), (SDNUMINSYMS + SDNUMNEWSYMS));
- while(EXINDEX < SDNUMINSYMS + SDNUMNEWSYMS) {
- if(IAEX->decode(pArithDecoder, (int*)&EXRUNLENGTH) == -1) {
- m_pModule->JBig2_Free(EXFLAGS);
- m_pModule->JBig2_Error("symbol dictionary decoding procedure (arith): too short.");
- goto failed;
- }
- if (EXINDEX + EXRUNLENGTH > SDNUMINSYMS + SDNUMNEWSYMS) {
- m_pModule->JBig2_Free(EXFLAGS);
- m_pModule->JBig2_Error("symbol dictionary decoding procedure (arith): Invalid EXRUNLENGTH value.");
- goto failed;
- }
- if(EXRUNLENGTH != 0) {
- for(I = EXINDEX; I < EXINDEX + EXRUNLENGTH; I++) {
- EXFLAGS[I] = CUREXFLAG;
- }
- }
- EXINDEX = EXINDEX + EXRUNLENGTH;
- CUREXFLAG = !CUREXFLAG;
- }
- JBIG2_ALLOC(pDict, CJBig2_SymbolDict());
- pDict->SDNUMEXSYMS = SDNUMEXSYMS;
- pDict->SDEXSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(sizeof(CJBig2_Image*), SDNUMEXSYMS);
- I = J = 0;
- for(I = 0; I < SDNUMINSYMS + SDNUMNEWSYMS; I++) {
- if(EXFLAGS[I] && J < SDNUMEXSYMS) {
- if(I < SDNUMINSYMS) {
- JBIG2_ALLOC(pDict->SDEXSYMS[J], CJBig2_Image(*SDINSYMS[I]));
- } else {
- pDict->SDEXSYMS[J] = SDNEWSYMS[I - SDNUMINSYMS];
- }
- J = J + 1;
- } else if (!EXFLAGS[I] && I >= SDNUMINSYMS) {
- delete SDNEWSYMS[I - SDNUMINSYMS];
- }
- }
- if (J < SDNUMEXSYMS) {
- pDict->SDNUMEXSYMS = J;
- }
- m_pModule->JBig2_Free(EXFLAGS);
- m_pModule->JBig2_Free(SDNEWSYMS);
- delete IADH;
- delete IADW;
- delete IAAI;
- delete IARDX;
- delete IARDY;
- delete IAEX;
- delete IAID;
- delete IADT;
- delete IAFS;
- delete IADS;
- delete IAIT;
- delete IARI;
- delete IARDW;
- delete IARDH;
- return pDict;
-failed:
- for(I = 0; I < NSYMSDECODED; I++) {
- if (SDNEWSYMS[I]) {
- delete SDNEWSYMS[I];
- SDNEWSYMS[I] = NULL;
- }
- }
- m_pModule->JBig2_Free(SDNEWSYMS);
- delete IADH;
- delete IADW;
- delete IAAI;
- delete IARDX;
- delete IARDY;
- delete IAEX;
- delete IAID;
- delete IADT;
- delete IAFS;
- delete IADS;
- delete IAIT;
- delete IARI;
- delete IARDW;
- delete IARDH;
- return NULL;
-}
-CJBig2_SymbolDict *CJBig2_SDDProc::decode_Huffman(CJBig2_BitStream *pStream,
- JBig2ArithCtx *gbContext, JBig2ArithCtx *grContext, IFX_Pause* pPause)
-{
- CJBig2_Image **SDNEWSYMS;
- FX_DWORD *SDNEWSYMWIDTHS;
- FX_DWORD HCHEIGHT, NSYMSDECODED;
- FX_INT32 HCDH;
- FX_DWORD SYMWIDTH, TOTWIDTH, HCFIRSTSYM;
- FX_INT32 DW;
- CJBig2_Image *BS, *BHC;
- FX_DWORD I, J, REFAGGNINST;
- FX_BOOL *EXFLAGS;
- FX_DWORD EXINDEX;
- FX_BOOL CUREXFLAG;
- FX_DWORD EXRUNLENGTH;
- FX_INT32 nVal, nBits;
- FX_DWORD nTmp;
- FX_BOOL SBHUFF;
- FX_DWORD SBNUMSYMS;
- FX_BYTE SBSYMCODELEN;
- JBig2HuffmanCode *SBSYMCODES;
- FX_DWORD IDI;
- FX_INT32 RDXI, RDYI;
- FX_DWORD BMSIZE;
- FX_DWORD stride;
- CJBig2_Image **SBSYMS;
- CJBig2_HuffmanTable *SBHUFFFS, *SBHUFFDS, *SBHUFFDT, *SBHUFFRDW, *SBHUFFRDH, *SBHUFFRDX, *SBHUFFRDY,
- *SBHUFFRSIZE, *pTable;
- CJBig2_HuffmanDecoder *pHuffmanDecoder;
- CJBig2_GRRDProc *pGRRD;
- CJBig2_ArithDecoder *pArithDecoder;
- CJBig2_GRDProc *pGRD;
- CJBig2_SymbolDict *pDict;
- JBIG2_ALLOC(pHuffmanDecoder, CJBig2_HuffmanDecoder(pStream));
- SDNEWSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(SDNUMNEWSYMS, sizeof(CJBig2_Image*));
- FXSYS_memset32(SDNEWSYMS, 0 , SDNUMNEWSYMS * sizeof(CJBig2_Image*));
- SDNEWSYMWIDTHS = NULL;
- BHC = NULL;
- if(SDREFAGG == 0) {
- SDNEWSYMWIDTHS = (FX_DWORD *)m_pModule->JBig2_Malloc2(SDNUMNEWSYMS, sizeof(FX_DWORD));
- FXSYS_memset32(SDNEWSYMWIDTHS, 0 , SDNUMNEWSYMS * sizeof(FX_DWORD));
- }
- HCHEIGHT = 0;
- NSYMSDECODED = 0;
- BS = NULL;
- while(NSYMSDECODED < SDNUMNEWSYMS) {
- if(pHuffmanDecoder->decodeAValue(SDHUFFDH, &HCDH) != 0) {
- m_pModule->JBig2_Error("symbol dictionary decoding procedure (huffman): too short.");
- goto failed;
- }
- HCHEIGHT = HCHEIGHT + HCDH;
- if ((int)HCHEIGHT < 0 || (int)HCHEIGHT > JBIG2_MAX_IMAGE_SIZE) {
- m_pModule->JBig2_Error("symbol dictionary decoding procedure (huffman): invalid HCHEIGHT value.");
- goto failed;
- }
- SYMWIDTH = 0;
- TOTWIDTH = 0;
- HCFIRSTSYM = NSYMSDECODED;
- for(;;) {
- nVal = pHuffmanDecoder->decodeAValue(SDHUFFDW, &DW);
- if(nVal == JBIG2_OOB) {
- break;
- } else if(nVal != 0) {
- m_pModule->JBig2_Error("symbol dictionary decoding procedure (huffman): too short.");
- goto failed;
- } else {
- if (NSYMSDECODED >= SDNUMNEWSYMS) {
- m_pModule->JBig2_Error("symbol dictionary decoding procedure (huffman): NSYMSDECODED >= SDNUMNEWSYMS.");
- goto failed;
- }
- SYMWIDTH = SYMWIDTH + DW;
- if ((int)SYMWIDTH < 0 || (int)SYMWIDTH > JBIG2_MAX_IMAGE_SIZE) {
- m_pModule->JBig2_Error("symbol dictionary decoding procedure (huffman): invalid SYMWIDTH value.");
- goto failed;
- } else if (HCHEIGHT == 0 || SYMWIDTH == 0) {
- TOTWIDTH = TOTWIDTH + SYMWIDTH;
- SDNEWSYMS[NSYMSDECODED] = NULL;
- NSYMSDECODED = NSYMSDECODED + 1;
- continue;
- }
- TOTWIDTH = TOTWIDTH + SYMWIDTH;
- }
- if(SDREFAGG == 1) {
- if(pHuffmanDecoder->decodeAValue(SDHUFFAGGINST, (int*)&REFAGGNINST) != 0) {
- m_pModule->JBig2_Error("symbol dictionary decoding procedure (huffman): too short.");
- goto failed;
- }
- BS = NULL;
- if(REFAGGNINST > 1) {
- CJBig2_TRDProc *pDecoder;
- JBIG2_ALLOC(pDecoder, CJBig2_TRDProc());
- pDecoder->SBHUFF = SDHUFF;
- pDecoder->SBREFINE = 1;
- pDecoder->SBW = SYMWIDTH;
- pDecoder->SBH = HCHEIGHT;
- pDecoder->SBNUMINSTANCES = REFAGGNINST;
- pDecoder->SBSTRIPS = 1;
- pDecoder->SBNUMSYMS = SDNUMINSYMS + NSYMSDECODED;
- SBNUMSYMS = pDecoder->SBNUMSYMS;
- SBSYMCODES = (JBig2HuffmanCode*)m_pModule->JBig2_Malloc2(SBNUMSYMS, sizeof(JBig2HuffmanCode));
- nTmp = 1;
- while((FX_DWORD)(1 << nTmp) < SBNUMSYMS) {
- nTmp ++;
- }
- for(I = 0; I < SBNUMSYMS; I++) {
- SBSYMCODES[I].codelen = nTmp;
- SBSYMCODES[I].code = I;
- }
- pDecoder->SBSYMCODES = SBSYMCODES;
- SBSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(SBNUMSYMS, sizeof(CJBig2_Image*));
- JBIG2_memcpy(SBSYMS, SDINSYMS, SDNUMINSYMS * sizeof(CJBig2_Image*));
- JBIG2_memcpy(SBSYMS + SDNUMINSYMS, SDNEWSYMS, NSYMSDECODED * sizeof(CJBig2_Image*));
- pDecoder->SBSYMS = SBSYMS;
- pDecoder->SBDEFPIXEL = 0;
- pDecoder->SBCOMBOP = JBIG2_COMPOSE_OR;
- pDecoder->TRANSPOSED = 0;
- pDecoder->REFCORNER = JBIG2_CORNER_TOPLEFT;
- pDecoder->SBDSOFFSET = 0;
- JBIG2_ALLOC(SBHUFFFS, CJBig2_HuffmanTable(HuffmanTable_B6,
- sizeof(HuffmanTable_B6) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B6));
- JBIG2_ALLOC(SBHUFFDS, CJBig2_HuffmanTable(HuffmanTable_B8,
- sizeof(HuffmanTable_B8) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B8));
- JBIG2_ALLOC(SBHUFFDT, CJBig2_HuffmanTable(HuffmanTable_B11,
- sizeof(HuffmanTable_B11) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B11));
- JBIG2_ALLOC(SBHUFFRDW, CJBig2_HuffmanTable(HuffmanTable_B15,
- sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B15));
- JBIG2_ALLOC(SBHUFFRDH, CJBig2_HuffmanTable(HuffmanTable_B15,
- sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B15));
- JBIG2_ALLOC(SBHUFFRDX, CJBig2_HuffmanTable(HuffmanTable_B15,
- sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B15));
- JBIG2_ALLOC(SBHUFFRDY, CJBig2_HuffmanTable(HuffmanTable_B15,
- sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B15));
- JBIG2_ALLOC(SBHUFFRSIZE, CJBig2_HuffmanTable(HuffmanTable_B1,
- sizeof(HuffmanTable_B1) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B1));
- pDecoder->SBHUFFFS = SBHUFFFS;
- pDecoder->SBHUFFDS = SBHUFFDS;
- pDecoder->SBHUFFDT = SBHUFFDT;
- pDecoder->SBHUFFRDW = SBHUFFRDW;
- pDecoder->SBHUFFRDH = SBHUFFRDH;
- pDecoder->SBHUFFRDX = SBHUFFRDX;
- pDecoder->SBHUFFRDY = SBHUFFRDY;
- pDecoder->SBHUFFRSIZE = SBHUFFRSIZE;
- pDecoder->SBRTEMPLATE = SDRTEMPLATE;
- pDecoder->SBRAT[0] = SDRAT[0];
- pDecoder->SBRAT[1] = SDRAT[1];
- pDecoder->SBRAT[2] = SDRAT[2];
- pDecoder->SBRAT[3] = SDRAT[3];
- BS = pDecoder->decode_Huffman(pStream, grContext);
- if(BS == NULL) {
- m_pModule->JBig2_Free(SBSYMCODES);
- m_pModule->JBig2_Free(SBSYMS);
- delete SBHUFFFS;
- delete SBHUFFDS;
- delete SBHUFFDT;
- delete SBHUFFRDW;
- delete SBHUFFRDH;
- delete SBHUFFRDX;
- delete SBHUFFRDY;
- delete SBHUFFRSIZE;
- delete pDecoder;
- goto failed;
- }
- m_pModule->JBig2_Free(SBSYMCODES);
- m_pModule->JBig2_Free(SBSYMS);
- delete SBHUFFFS;
- delete SBHUFFDS;
- delete SBHUFFDT;
- delete SBHUFFRDW;
- delete SBHUFFRDH;
- delete SBHUFFRDX;
- delete SBHUFFRDY;
- delete SBHUFFRSIZE;
- delete pDecoder;
- } else if(REFAGGNINST == 1) {
- SBHUFF = SDHUFF;
- SBNUMSYMS = SDNUMINSYMS + SDNUMNEWSYMS;
- nTmp = 1;
- while((FX_DWORD)(1 << nTmp) < SBNUMSYMS) {
- nTmp ++;
- }
- SBSYMCODELEN = (FX_BYTE)nTmp;
- SBSYMCODES = (JBig2HuffmanCode*)m_pModule->JBig2_Malloc2(SBNUMSYMS, sizeof(JBig2HuffmanCode));
- for(I = 0; I < SBNUMSYMS; I++) {
- SBSYMCODES[I].codelen = SBSYMCODELEN;
- SBSYMCODES[I].code = I;
- }
- nVal = 0;
- nBits = 0;
- for(;;) {
- if(pStream->read1Bit(&nTmp) != 0) {
- m_pModule->JBig2_Free(SBSYMCODES);
- m_pModule->JBig2_Error("symbol dictionary decoding procedure (huffman): too short.");
- goto failed;
- }
- nVal = (nVal << 1) | nTmp;
- for(IDI = 0; IDI < SBNUMSYMS; IDI++) {
- if((nVal == SBSYMCODES[IDI].code)
- && (nBits == SBSYMCODES[IDI].codelen)) {
- break;
- }
- }
- if(IDI < SBNUMSYMS) {
- break;
- }
- }
- m_pModule->JBig2_Free(SBSYMCODES);
- JBIG2_ALLOC(SBHUFFRDX, CJBig2_HuffmanTable(HuffmanTable_B15,
- sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B15));
- JBIG2_ALLOC(SBHUFFRSIZE, CJBig2_HuffmanTable(HuffmanTable_B1,
- sizeof(HuffmanTable_B1) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B1));
- if((pHuffmanDecoder->decodeAValue(SBHUFFRDX, &RDXI) != 0)
- || (pHuffmanDecoder->decodeAValue(SBHUFFRDX, &RDYI) != 0)
- || (pHuffmanDecoder->decodeAValue(SBHUFFRSIZE, &nVal) != 0)) {
- delete SBHUFFRDX;
- delete SBHUFFRSIZE;
- m_pModule->JBig2_Error("symbol dictionary decoding procedure (huffman): too short.");
- goto failed;
- }
- delete SBHUFFRDX;
- delete SBHUFFRSIZE;
- pStream->alignByte();
- nTmp = pStream->getOffset();
- SBSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(SBNUMSYMS, sizeof(CJBig2_Image*));
- JBIG2_memcpy(SBSYMS, SDINSYMS, SDNUMINSYMS * sizeof(CJBig2_Image*));
- JBIG2_memcpy(SBSYMS + SDNUMINSYMS, SDNEWSYMS, NSYMSDECODED * sizeof(CJBig2_Image*));
- JBIG2_ALLOC(pGRRD, CJBig2_GRRDProc());
- pGRRD->GRW = SYMWIDTH;
- pGRRD->GRH = HCHEIGHT;
- pGRRD->GRTEMPLATE = SDRTEMPLATE;
- pGRRD->GRREFERENCE = SBSYMS[IDI];
- pGRRD->GRREFERENCEDX = RDXI;
- pGRRD->GRREFERENCEDY = RDYI;
- pGRRD->TPGRON = 0;
- pGRRD->GRAT[0] = SDRAT[0];
- pGRRD->GRAT[1] = SDRAT[1];
- pGRRD->GRAT[2] = SDRAT[2];
- pGRRD->GRAT[3] = SDRAT[3];
- JBIG2_ALLOC(pArithDecoder, CJBig2_ArithDecoder(pStream));
- BS = pGRRD->decode(pArithDecoder, grContext);
- if(BS == NULL) {
- m_pModule->JBig2_Free(SBSYMS);
- delete pGRRD;
- delete pArithDecoder;
- goto failed;
- }
- pStream->alignByte();
- pStream->offset(2);
- if((FX_DWORD)nVal != (pStream->getOffset() - nTmp)) {
- delete BS;
- m_pModule->JBig2_Free(SBSYMS);
- delete pGRRD;
- delete pArithDecoder;
- m_pModule->JBig2_Error("symbol dictionary decoding procedure (huffman):"
- "bytes processed by generic refinement region decoding procedure doesn't equal SBHUFFRSIZE.");
- goto failed;
- }
- m_pModule->JBig2_Free(SBSYMS);
- delete pGRRD;
- delete pArithDecoder;
- }
- SDNEWSYMS[NSYMSDECODED] = BS;
- }
- if(SDREFAGG == 0) {
- SDNEWSYMWIDTHS[NSYMSDECODED] = SYMWIDTH;
- }
- NSYMSDECODED = NSYMSDECODED + 1;
- }
- if(SDREFAGG == 0) {
- if(pHuffmanDecoder->decodeAValue(SDHUFFBMSIZE, (FX_INT32*)&BMSIZE) != 0) {
- m_pModule->JBig2_Error("symbol dictionary decoding procedure (huffman): too short.");
- goto failed;
- }
- pStream->alignByte();
- if(BMSIZE == 0) {
- stride = (TOTWIDTH + 7) >> 3;
- if(pStream->getByteLeft() >= stride * HCHEIGHT) {
- JBIG2_ALLOC(BHC, CJBig2_Image(TOTWIDTH, HCHEIGHT));
- for(I = 0; I < HCHEIGHT; I ++) {
- JBIG2_memcpy(BHC->m_pData + I * BHC->m_nStride, pStream->getPointer(), stride);
- pStream->offset(stride);
- }
- } else {
- m_pModule->JBig2_Error("symbol dictionary decoding procedure (huffman): too short.");
- goto failed;
- }
- } else {
- JBIG2_ALLOC(pGRD, CJBig2_GRDProc());
- pGRD->MMR = 1;
- pGRD->GBW = TOTWIDTH;
- pGRD->GBH = HCHEIGHT;
- FXCODEC_STATUS status = pGRD->Start_decode_MMR(&BHC, pStream);
- while(status == FXCODEC_STATUS_DECODE_TOBECONTINUE) {
- pGRD->Continue_decode(pPause);
- }
- delete pGRD;
- pStream->alignByte();
- }
- nTmp = 0;
- if (!BHC) {
- continue;
- }
- for(I = HCFIRSTSYM; I < NSYMSDECODED; I++) {
- SDNEWSYMS[I] = BHC->subImage(nTmp, 0, SDNEWSYMWIDTHS[I], HCHEIGHT);
- nTmp += SDNEWSYMWIDTHS[I];
- }
- delete BHC;
- BHC = NULL;
- }
- }
- EXINDEX = 0;
- CUREXFLAG = 0;
- JBIG2_ALLOC(pTable, CJBig2_HuffmanTable(HuffmanTable_B1,
- sizeof(HuffmanTable_B1) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B1));
- EXFLAGS = (FX_BOOL*)m_pModule->JBig2_Malloc2(sizeof(FX_BOOL), (SDNUMINSYMS + SDNUMNEWSYMS));
- while(EXINDEX < SDNUMINSYMS + SDNUMNEWSYMS) {
- if(pHuffmanDecoder->decodeAValue(pTable, (int*)&EXRUNLENGTH) != 0) {
- delete pTable;
- m_pModule->JBig2_Free(EXFLAGS);
- m_pModule->JBig2_Error("symbol dictionary decoding procedure (huffman): too short.");
- goto failed;
- }
- if (EXINDEX + EXRUNLENGTH > SDNUMINSYMS + SDNUMNEWSYMS) {
- delete pTable;
- m_pModule->JBig2_Free(EXFLAGS);
- m_pModule->JBig2_Error("symbol dictionary decoding procedure (arith): Invalid EXRUNLENGTH value.");
- goto failed;
- }
- if(EXRUNLENGTH != 0) {
- for(I = EXINDEX; I < EXINDEX + EXRUNLENGTH; I++) {
- EXFLAGS[I] = CUREXFLAG;
- }
- }
- EXINDEX = EXINDEX + EXRUNLENGTH;
- CUREXFLAG = !CUREXFLAG;
- }
- delete pTable;
- JBIG2_ALLOC(pDict, CJBig2_SymbolDict());
- pDict->SDNUMEXSYMS = SDNUMEXSYMS;
- pDict->SDEXSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(sizeof(CJBig2_Image*), SDNUMEXSYMS);
- I = J = 0;
- for(I = 0; I < SDNUMINSYMS + SDNUMNEWSYMS; I++) {
- if(EXFLAGS[I] && J < SDNUMEXSYMS) {
- if(I < SDNUMINSYMS) {
- JBIG2_ALLOC(pDict->SDEXSYMS[J], CJBig2_Image(*SDINSYMS[I]));
- } else {
- pDict->SDEXSYMS[J] = SDNEWSYMS[I - SDNUMINSYMS];
- }
- J = J + 1;
- } else if (!EXFLAGS[I] && I >= SDNUMINSYMS) {
- delete SDNEWSYMS[I - SDNUMINSYMS];
- }
- }
- if (J < SDNUMEXSYMS) {
- pDict->SDNUMEXSYMS = J;
- }
- m_pModule->JBig2_Free(EXFLAGS);
- m_pModule->JBig2_Free(SDNEWSYMS);
- if(SDREFAGG == 0) {
- m_pModule->JBig2_Free(SDNEWSYMWIDTHS);
- }
- delete pHuffmanDecoder;
- return pDict;
-failed:
- for(I = 0; I < NSYMSDECODED; I++) {
- if (SDNEWSYMS[I]) {
- delete SDNEWSYMS[I];
- }
- }
- m_pModule->JBig2_Free(SDNEWSYMS);
- if(SDREFAGG == 0) {
- m_pModule->JBig2_Free(SDNEWSYMWIDTHS);
- }
- delete pHuffmanDecoder;
- return NULL;
-}
-CJBig2_Image *CJBig2_HTRDProc::decode_Arith(CJBig2_ArithDecoder *pArithDecoder,
- JBig2ArithCtx *gbContext, IFX_Pause* pPause)
-{
- FX_DWORD ng, mg;
- FX_INT32 x, y;
- CJBig2_Image *HSKIP;
- FX_DWORD HBPP;
- FX_DWORD *GI;
- CJBig2_Image *HTREG;
- CJBig2_GSIDProc *pGID;
- JBIG2_ALLOC(HTREG, CJBig2_Image(HBW, HBH));
- HTREG->fill(HDEFPIXEL);
- HSKIP = NULL;
- if(HENABLESKIP == 1) {
- JBIG2_ALLOC(HSKIP, CJBig2_Image(HGW, HGH));
- for(mg = 0; mg < HGH; mg++) {
- for(ng = 0; ng < HGW; ng++) {
- x = (HGX + mg * HRY + ng * HRX) >> 8;
- y = (HGY + mg * HRX - ng * HRY) >> 8;
- if((x + HPW <= 0) | (x >= (FX_INT32)HBW)
- | (y + HPH <= 0) | (y >= (FX_INT32)HPH)) {
- HSKIP->setPixel(ng, mg, 1);
- } else {
- HSKIP->setPixel(ng, mg, 0);
- }
- }
- }
- }
- HBPP = 1;
- while((FX_DWORD)(1 << HBPP) < HNUMPATS) {
- HBPP ++;
- }
- JBIG2_ALLOC(pGID, CJBig2_GSIDProc());
- pGID->GSMMR = HMMR;
- pGID->GSW = HGW;
- pGID->GSH = HGH;
- pGID->GSBPP = (FX_BYTE)HBPP;
- pGID->GSUSESKIP = HENABLESKIP;
- pGID->GSKIP = HSKIP;
- pGID->GSTEMPLATE = HTEMPLATE;
- GI = pGID->decode_Arith(pArithDecoder, gbContext, pPause);
- if(GI == NULL) {
- goto failed;
- }
- for(mg = 0; mg < HGH; mg++) {
- for(ng = 0; ng < HGW; ng++) {
- x = (HGX + mg * HRY + ng * HRX) >> 8;
- y = (HGY + mg * HRX - ng * HRY) >> 8;
- FX_DWORD pat_index = GI[mg * HGW + ng];
- if (pat_index >= HNUMPATS) {
- pat_index = HNUMPATS - 1;
- }
- HTREG->composeFrom(x, y, HPATS[pat_index], HCOMBOP);
- }
- }
- m_pModule->JBig2_Free(GI);
- if(HSKIP) {
- delete HSKIP;
- }
- delete pGID;
- return HTREG;
-failed:
- if(HSKIP) {
- delete HSKIP;
- }
- delete pGID;
- delete HTREG;
- return NULL;
-}
-CJBig2_Image *CJBig2_HTRDProc::decode_MMR(CJBig2_BitStream *pStream, IFX_Pause* pPause)
-{
- FX_DWORD ng, mg;
- FX_INT32 x, y;
- FX_DWORD HBPP;
- FX_DWORD *GI;
- CJBig2_Image *HTREG;
- CJBig2_GSIDProc *pGID;
- JBIG2_ALLOC(HTREG, CJBig2_Image(HBW, HBH));
- HTREG->fill(HDEFPIXEL);
- HBPP = 1;
- while((FX_DWORD)(1 << HBPP) < HNUMPATS) {
- HBPP ++;
- }
- JBIG2_ALLOC(pGID, CJBig2_GSIDProc());
- pGID->GSMMR = HMMR;
- pGID->GSW = HGW;
- pGID->GSH = HGH;
- pGID->GSBPP = (FX_BYTE)HBPP;
- pGID->GSUSESKIP = 0;
- GI = pGID->decode_MMR(pStream, pPause);
- if(GI == NULL) {
- goto failed;
- }
- for(mg = 0; mg < HGH; mg++) {
- for(ng = 0; ng < HGW; ng++) {
- x = (HGX + mg * HRY + ng * HRX) >> 8;
- y = (HGY + mg * HRX - ng * HRY) >> 8;
- FX_DWORD pat_index = GI[mg * HGW + ng];
- if (pat_index >= HNUMPATS) {
- pat_index = HNUMPATS - 1;
- }
- HTREG->composeFrom(x, y, HPATS[pat_index], HCOMBOP);
- }
- }
- m_pModule->JBig2_Free(GI);
- delete pGID;
- return HTREG;
-failed:
- delete pGID;
- delete HTREG;
- return NULL;
-}
-CJBig2_PatternDict *CJBig2_PDDProc::decode_Arith(CJBig2_ArithDecoder *pArithDecoder,
- JBig2ArithCtx *gbContext, IFX_Pause* pPause)
-{
- FX_DWORD GRAY;
- CJBig2_Image *BHDC = NULL;
- CJBig2_PatternDict *pDict;
- CJBig2_GRDProc *pGRD;
- JBIG2_ALLOC(pDict, CJBig2_PatternDict());
- pDict->NUMPATS = GRAYMAX + 1;
- pDict->HDPATS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(sizeof(CJBig2_Image*), pDict->NUMPATS);
- JBIG2_memset(pDict->HDPATS, 0, sizeof(CJBig2_Image*)*pDict->NUMPATS);
- JBIG2_ALLOC(pGRD, CJBig2_GRDProc());
- pGRD->MMR = HDMMR;
- pGRD->GBW = (GRAYMAX + 1) * HDPW;
- pGRD->GBH = HDPH;
- pGRD->GBTEMPLATE = HDTEMPLATE;
- pGRD->TPGDON = 0;
- pGRD->USESKIP = 0;
- pGRD->GBAT[0] = -(FX_INT32)HDPW;
- pGRD->GBAT[1] = 0;
- if(pGRD->GBTEMPLATE == 0) {
- pGRD->GBAT[2] = -3;
- pGRD->GBAT[3] = -1;
- pGRD->GBAT[4] = 2;
- pGRD->GBAT[5] = -2;
- pGRD->GBAT[6] = -2;
- pGRD->GBAT[7] = -2;
- }
- FXCODEC_STATUS status = pGRD->Start_decode_Arith(&BHDC, pArithDecoder, gbContext);
- while(status == FXCODEC_STATUS_DECODE_TOBECONTINUE) {
- pGRD->Continue_decode(pPause);
- }
- if(BHDC == NULL) {
- delete pGRD;
- goto failed;
- }
- delete pGRD;
- GRAY = 0;
- while(GRAY <= GRAYMAX) {
- pDict->HDPATS[GRAY] = BHDC->subImage(HDPW * GRAY, 0, HDPW, HDPH);
- GRAY = GRAY + 1;
- }
- delete BHDC;
- return pDict;
-failed:
- delete pDict;
- return NULL;
-}
-
-CJBig2_PatternDict *CJBig2_PDDProc::decode_MMR(CJBig2_BitStream *pStream, IFX_Pause* pPause)
-{
- FX_DWORD GRAY;
- CJBig2_Image *BHDC = NULL;
- CJBig2_PatternDict *pDict;
- CJBig2_GRDProc *pGRD;
- JBIG2_ALLOC(pDict, CJBig2_PatternDict());
- pDict->NUMPATS = GRAYMAX + 1;
- pDict->HDPATS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(sizeof(CJBig2_Image*), pDict->NUMPATS);
- JBIG2_memset(pDict->HDPATS, 0, sizeof(CJBig2_Image*)*pDict->NUMPATS);
- JBIG2_ALLOC(pGRD, CJBig2_GRDProc());
- pGRD->MMR = HDMMR;
- pGRD->GBW = (GRAYMAX + 1) * HDPW;
- pGRD->GBH = HDPH;
- FXCODEC_STATUS status = pGRD->Start_decode_MMR(&BHDC, pStream);
- while(status == FXCODEC_STATUS_DECODE_TOBECONTINUE) {
- pGRD->Continue_decode(pPause);
- }
- if(BHDC == NULL) {
- delete pGRD;
- goto failed;
- }
- delete pGRD;
- GRAY = 0;
- while(GRAY <= GRAYMAX) {
- pDict->HDPATS[GRAY] = BHDC->subImage(HDPW * GRAY, 0, HDPW, HDPH);
- GRAY = GRAY + 1;
- }
- delete BHDC;
- return pDict;
-failed:
- delete pDict;
- return NULL;
-}
-FX_DWORD *CJBig2_GSIDProc::decode_Arith(CJBig2_ArithDecoder *pArithDecoder,
- JBig2ArithCtx *gbContext, IFX_Pause* pPause)
-{
- CJBig2_Image **GSPLANES;
- FX_INT32 J, K;
- FX_DWORD x, y;
- FX_DWORD *GSVALS;
- CJBig2_GRDProc *pGRD;
- GSPLANES = (CJBig2_Image **)m_pModule->JBig2_Malloc2(sizeof(CJBig2_Image*), GSBPP);
- if (!GSPLANES) {
- return NULL;
- }
- GSVALS = (FX_DWORD*)m_pModule->JBig2_Malloc3(sizeof(FX_DWORD), GSW, GSH);
- if (!GSVALS) {
- m_pModule->JBig2_Free(GSPLANES);
- return NULL;
- }
- JBIG2_memset(GSPLANES, 0, sizeof(CJBig2_Image*)*GSBPP);
- JBIG2_memset(GSVALS, 0, sizeof(FX_DWORD)*GSW * GSH);
- JBIG2_ALLOC(pGRD, CJBig2_GRDProc());
- pGRD->MMR = GSMMR;
- pGRD->GBW = GSW;
- pGRD->GBH = GSH;
- pGRD->GBTEMPLATE = GSTEMPLATE;
- pGRD->TPGDON = 0;
- pGRD->USESKIP = GSUSESKIP;
- pGRD->SKIP = GSKIP;
- if(GSTEMPLATE <= 1) {
- pGRD->GBAT[0] = 3;
- } else {
- pGRD->GBAT[0] = 2;
- }
- pGRD->GBAT[1] = -1;
- if(pGRD->GBTEMPLATE == 0) {
- pGRD->GBAT[2] = -3;
- pGRD->GBAT[3] = -1;
- pGRD->GBAT[4] = 2;
- pGRD->GBAT[5] = -2;
- pGRD->GBAT[6] = -2;
- pGRD->GBAT[7] = -2;
- }
- FXCODEC_STATUS status = pGRD->Start_decode_Arith(&GSPLANES[GSBPP - 1], pArithDecoder, gbContext);
- while(status == FXCODEC_STATUS_DECODE_TOBECONTINUE) {
- pGRD->Continue_decode(pPause);
- }
- if(GSPLANES[GSBPP - 1] == NULL) {
- goto failed;
- }
- J = GSBPP - 2;
- while(J >= 0) {
- FXCODEC_STATUS status = pGRD->Start_decode_Arith(&GSPLANES[J], pArithDecoder, gbContext);
- while(status == FXCODEC_STATUS_DECODE_TOBECONTINUE) {
- pGRD->Continue_decode(pPause);
- }
- if(GSPLANES[J] == NULL) {
- for(K = GSBPP - 1; K > J; K--) {
- delete GSPLANES[K];
- goto failed;
- }
- }
- GSPLANES[J]->composeFrom(0, 0, GSPLANES[J + 1], JBIG2_COMPOSE_XOR);
- J = J - 1;
- }
- for(y = 0; y < GSH; y++) {
- for(x = 0; x < GSW; x++) {
- for(J = 0; J < GSBPP; J++) {
- GSVALS[y * GSW + x] |= GSPLANES[J]->getPixel(x, y) << J;
- }
- }
- }
- for(J = 0; J < GSBPP; J++) {
- delete GSPLANES[J];
- }
- m_pModule->JBig2_Free(GSPLANES);
- delete pGRD;
- return GSVALS;
-failed:
- m_pModule->JBig2_Free(GSPLANES);
- delete pGRD;
- m_pModule->JBig2_Free(GSVALS);
- return NULL;
-}
-FX_DWORD *CJBig2_GSIDProc::decode_MMR(CJBig2_BitStream *pStream, IFX_Pause* pPause)
-{
- CJBig2_Image **GSPLANES;
- FX_INT32 J, K;
- FX_DWORD x, y;
- FX_DWORD *GSVALS;
- CJBig2_GRDProc *pGRD;
- GSPLANES = (CJBig2_Image **)m_pModule->JBig2_Malloc2(sizeof(CJBig2_Image*), GSBPP);
- if (!GSPLANES) {
- return NULL;
- }
- GSVALS = (FX_DWORD*)m_pModule->JBig2_Malloc3(sizeof(FX_DWORD), GSW, GSH);
- if (!GSVALS) {
- if (GSPLANES) {
- m_pModule->JBig2_Free(GSPLANES);
- }
- return NULL;
- }
- JBIG2_memset(GSPLANES, 0, sizeof(CJBig2_Image*)*GSBPP);
- JBIG2_memset(GSVALS, 0, sizeof(FX_DWORD)*GSW * GSH);
- JBIG2_ALLOC(pGRD, CJBig2_GRDProc());
- pGRD->MMR = GSMMR;
- pGRD->GBW = GSW;
- pGRD->GBH = GSH;
- FXCODEC_STATUS status = pGRD->Start_decode_MMR(&GSPLANES[GSBPP - 1], pStream);
- while(status == FXCODEC_STATUS_DECODE_TOBECONTINUE) {
- pGRD->Continue_decode(pPause);
- }
- if(GSPLANES[GSBPP - 1] == NULL) {
- goto failed;
- }
- pStream->alignByte();
- pStream->offset(3);
- J = GSBPP - 2;
- while(J >= 0) {
- FXCODEC_STATUS status = pGRD->Start_decode_MMR(&GSPLANES[J], pStream);
- while(status == FXCODEC_STATUS_DECODE_TOBECONTINUE) {
- pGRD->Continue_decode(pPause);
- }
- if(GSPLANES[J] == NULL) {
- for(K = GSBPP - 1; K > J; K--) {
- delete GSPLANES[K];
- goto failed;
- }
- }
- pStream->alignByte();
- pStream->offset(3);
- GSPLANES[J]->composeFrom(0, 0, GSPLANES[J + 1], JBIG2_COMPOSE_XOR);
- J = J - 1;
- }
- for(y = 0; y < GSH; y++) {
- for(x = 0; x < GSW; x++) {
- for(J = 0; J < GSBPP; J++) {
- GSVALS[y * GSW + x] |= GSPLANES[J]->getPixel(x, y) << J;
- }
- }
- }
- for(J = 0; J < GSBPP; J++) {
- delete GSPLANES[J];
- }
- m_pModule->JBig2_Free(GSPLANES);
- delete pGRD;
- return GSVALS;
-failed:
- m_pModule->JBig2_Free(GSPLANES);
- delete pGRD;
- m_pModule->JBig2_Free(GSVALS);
- return NULL;
-}
-FXCODEC_STATUS CJBig2_GRDProc::Start_decode_Arith(CJBig2_Image** pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause)
-{
- if (GBW == 0 || GBH == 0) {
- m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;
- return FXCODEC_STATUS_DECODE_FINISH;
- }
- m_ProssiveStatus = FXCODEC_STATUS_DECODE_READY;
- m_pPause = pPause;
- if(*pImage == NULL) {
- JBIG2_ALLOC((*pImage), CJBig2_Image(GBW, GBH));
- }
- if ((*pImage)->m_pData == NULL) {
- delete *pImage;
- *pImage = NULL;
- m_pModule->JBig2_Error("Generic region decoding procedure: Create Image Failed with width = %d, height = %d\n", GBW, GBH);
- m_ProssiveStatus = FXCODEC_STATUS_ERROR;
- return FXCODEC_STATUS_ERROR;
- }
- m_DecodeType = 1;
- m_pImage = pImage;
- (*m_pImage)->fill(0);
- m_pArithDecoder = pArithDecoder;
- m_gbContext = gbContext;
- LTP = 0;
- m_pLine = NULL;
- m_loopIndex = 0;
- return decode_Arith(pPause);
-}
-FXCODEC_STATUS CJBig2_GRDProc::decode_Arith(IFX_Pause* pPause)
-{
- int iline = m_loopIndex;
- CJBig2_Image* pImage = *m_pImage;
- if(GBTEMPLATE == 0) {
- if((GBAT[0] == 3) && (GBAT[1] == (signed char) - 1)
- && (GBAT[2] == (signed char) - 3) && (GBAT[3] == (signed char) - 1)
- && (GBAT[4] == 2) && (GBAT[5] == (signed char) - 2)
- && (GBAT[6] == (signed char) - 2) && (GBAT[7] == (signed char) - 2)) {
- m_ProssiveStatus = decode_Arith_Template0_opt3(pImage, m_pArithDecoder, m_gbContext, pPause);
- } else {
- m_ProssiveStatus = decode_Arith_Template0_unopt(pImage, m_pArithDecoder, m_gbContext, pPause);
- }
- } else if(GBTEMPLATE == 1) {
- if((GBAT[0] == 3) && (GBAT[1] == (signed char) - 1)) {
- m_ProssiveStatus = decode_Arith_Template1_opt3(pImage, m_pArithDecoder, m_gbContext, pPause);
- } else {
- m_ProssiveStatus = decode_Arith_Template1_unopt(pImage, m_pArithDecoder, m_gbContext, pPause);
- }
- } else if(GBTEMPLATE == 2) {
- if((GBAT[0] == 2) && (GBAT[1] == (signed char) - 1)) {
- m_ProssiveStatus = decode_Arith_Template2_opt3(pImage, m_pArithDecoder, m_gbContext, pPause);
- } else {
- m_ProssiveStatus = decode_Arith_Template2_unopt(pImage, m_pArithDecoder, m_gbContext, pPause);
- }
- } else {
- if((GBAT[0] == 2) && (GBAT[1] == (signed char) - 1)) {
- m_ProssiveStatus = decode_Arith_Template3_opt3(pImage, m_pArithDecoder, m_gbContext, pPause);
- } else {
- m_ProssiveStatus = decode_Arith_Template3_unopt(pImage, m_pArithDecoder, m_gbContext, pPause);
- }
- }
- m_ReplaceRect.left = 0;
- m_ReplaceRect.right = pImage->m_nWidth;
- m_ReplaceRect.top = iline;
- m_ReplaceRect.bottom = m_loopIndex;
- if(m_ProssiveStatus == FXCODEC_STATUS_DECODE_FINISH) {
- m_loopIndex = 0;
- }
- return m_ProssiveStatus;
-}
-FXCODEC_STATUS CJBig2_GRDProc::Start_decode_Arith_V2(CJBig2_Image** pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause)
-{
- if(GBW == 0 || GBH == 0) {
- * pImage = NULL;
- m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;
- return FXCODEC_STATUS_DECODE_FINISH;
- }
- if(*pImage == NULL) {
- JBIG2_ALLOC((*pImage), CJBig2_Image(GBW, GBH));
- }
- if ((*pImage)->m_pData == NULL) {
- delete *pImage;
- *pImage = NULL;
- m_pModule->JBig2_Error("Generic region decoding procedure: Create Image Failed with width = %d, height = %d\n", GBW, GBH);
- m_ProssiveStatus = FXCODEC_STATUS_ERROR;
- return FXCODEC_STATUS_ERROR;
- }
- m_ProssiveStatus = FXCODEC_STATUS_DECODE_READY;
- m_DecodeType = 2;
- m_pPause = pPause;
- m_pImage = pImage;
- (*m_pImage)->fill(0);
- LTP = 0;
- m_loopIndex = 0;
- m_pArithDecoder = pArithDecoder;
- m_gbContext = gbContext;
- return decode_Arith_V2(pPause);
-}
-FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_V2(IFX_Pause* pPause)
-{
- FX_BOOL SLTP, bVal;
- FX_DWORD CONTEXT;
- CJBig2_Image *GBREG = *m_pImage;
- FX_DWORD line1, line2, line3;
- LTP = 0;
- JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
- GBREG->fill(0);
- for(; m_loopIndex < GBH; m_loopIndex++) {
- if(TPGDON) {
- switch(GBTEMPLATE) {
- case 0:
- CONTEXT = 0x9b25;
- break;
- case 1:
- CONTEXT = 0x0795;
- break;
- case 2:
- CONTEXT = 0x00e5;
- break;
- case 3:
- CONTEXT = 0x0195;
- break;
- }
- SLTP = m_pArithDecoder->DECODE(&m_gbContext[CONTEXT]);
- LTP = LTP ^ SLTP;
- }
- if(LTP == 1) {
- GBREG->copyLine(m_loopIndex, m_loopIndex - 1);
- } else {
- switch(GBTEMPLATE) {
- case 0: {
- line1 = GBREG->getPixel(1, m_loopIndex - 2);
- line1 |= GBREG->getPixel(0, m_loopIndex - 2) << 1;
- line2 = GBREG->getPixel(2, m_loopIndex - 1);
- line2 |= GBREG->getPixel(1, m_loopIndex - 1) << 1;
- line2 |= GBREG->getPixel(0, m_loopIndex - 1) << 2;
- line3 = 0;
- for(FX_DWORD w = 0; w < GBW; w++) {
- if(USESKIP && SKIP->getPixel(w, m_loopIndex)) {
- bVal = 0;
- } else {
- CONTEXT = line3;
- CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) << 4;
- CONTEXT |= line2 << 5;
- CONTEXT |= GBREG->getPixel(w + GBAT[2], m_loopIndex + GBAT[3]) << 10;
- CONTEXT |= GBREG->getPixel(w + GBAT[4], m_loopIndex + GBAT[5]) << 11;
- CONTEXT |= line1 << 12;
- CONTEXT |= GBREG->getPixel(w + GBAT[6], m_loopIndex + GBAT[7]) << 15;
- bVal = m_pArithDecoder->DECODE(&m_gbContext[CONTEXT]);
- }
- if(bVal) {
- GBREG->setPixel(w, m_loopIndex, bVal);
- }
- line1 = ((line1 << 1) | GBREG->getPixel(w + 2, m_loopIndex - 2)) & 0x07;
- line2 = ((line2 << 1) | GBREG->getPixel(w + 3, m_loopIndex - 1)) & 0x1f;
- line3 = ((line3 << 1) | bVal) & 0x0f;
- }
- }
- break;
- case 1: {
- line1 = GBREG->getPixel(2, m_loopIndex - 2);
- line1 |= GBREG->getPixel(1, m_loopIndex - 2) << 1;
- line1 |= GBREG->getPixel(0, m_loopIndex - 2) << 2;
- line2 = GBREG->getPixel(2, m_loopIndex - 1);
- line2 |= GBREG->getPixel(1, m_loopIndex - 1) << 1;
- line2 |= GBREG->getPixel(0, m_loopIndex - 1) << 2;
- line3 = 0;
- for(FX_DWORD w = 0; w < GBW; w++) {
- if(USESKIP && SKIP->getPixel(w, m_loopIndex)) {
- bVal = 0;
- } else {
- CONTEXT = line3;
- CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) << 3;
- CONTEXT |= line2 << 4;
- CONTEXT |= line1 << 9;
- bVal = m_pArithDecoder->DECODE(&m_gbContext[CONTEXT]);
- }
- if(bVal) {
- GBREG->setPixel(w, m_loopIndex, bVal);
- }
- line1 = ((line1 << 1) | GBREG->getPixel(w + 3, m_loopIndex - 2)) & 0x0f;
- line2 = ((line2 << 1) | GBREG->getPixel(w + 3, m_loopIndex - 1)) & 0x1f;
- line3 = ((line3 << 1) | bVal) & 0x07;
- }
- }
- break;
- case 2: {
- line1 = GBREG->getPixel(1, m_loopIndex - 2);
- line1 |= GBREG->getPixel(0, m_loopIndex - 2) << 1;
- line2 = GBREG->getPixel(1, m_loopIndex - 1);
- line2 |= GBREG->getPixel(0, m_loopIndex - 1) << 1;
- line3 = 0;
- for(FX_DWORD w = 0; w < GBW; w++) {
- if(USESKIP && SKIP->getPixel(w, m_loopIndex)) {
- bVal = 0;
- } else {
- CONTEXT = line3;
- CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) << 2;
- CONTEXT |= line2 << 3;
- CONTEXT |= line1 << 7;
- bVal = m_pArithDecoder->DECODE(&m_gbContext[CONTEXT]);
- }
- if(bVal) {
- GBREG->setPixel(w, m_loopIndex, bVal);
- }
- line1 = ((line1 << 1) | GBREG->getPixel(w + 2, m_loopIndex - 2)) & 0x07;
- line2 = ((line2 << 1) | GBREG->getPixel(w + 2, m_loopIndex - 1)) & 0x0f;
- line3 = ((line3 << 1) | bVal) & 0x03;
- }
- }
- break;
- case 3: {
- line1 = GBREG->getPixel(1, m_loopIndex - 1);
- line1 |= GBREG->getPixel(0, m_loopIndex - 1) << 1;
- line2 = 0;
- for(FX_DWORD w = 0; w < GBW; w++) {
- if(USESKIP && SKIP->getPixel(w, m_loopIndex)) {
- bVal = 0;
- } else {
- CONTEXT = line2;
- CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) << 4;
- CONTEXT |= line1 << 5;
- bVal = m_pArithDecoder->DECODE(&m_gbContext[CONTEXT]);
- }
- if(bVal) {
- GBREG->setPixel(w, m_loopIndex, bVal);
- }
- line1 = ((line1 << 1) | GBREG->getPixel(w + 2, m_loopIndex - 1)) & 0x1f;
- line2 = ((line2 << 1) | bVal) & 0x0f;
- }
- }
- break;
- }
- }
- if(pPause && pPause->NeedToPauseNow()) {
- m_loopIndex ++;
- m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;
- return FXCODEC_STATUS_DECODE_TOBECONTINUE;
- }
- }
- m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;
- return FXCODEC_STATUS_DECODE_FINISH;
-}
-FXCODEC_STATUS CJBig2_GRDProc::Start_decode_Arith_V1(CJBig2_Image** pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause)
-{
- if(GBW == 0 || GBH == 0) {
- * pImage = NULL;
- m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;
- return FXCODEC_STATUS_DECODE_FINISH;
- }
- if(*pImage == NULL) {
- JBIG2_ALLOC((*pImage), CJBig2_Image(GBW, GBH));
- }
- if ((*pImage)->m_pData == NULL) {
- delete *pImage;
- *pImage = NULL;
- m_pModule->JBig2_Error("Generic region decoding procedure: Create Image Failed with width = %d, height = %d\n", GBW, GBH);
- m_ProssiveStatus = FXCODEC_STATUS_ERROR;
- return FXCODEC_STATUS_ERROR;
- }
- m_ProssiveStatus = FXCODEC_STATUS_DECODE_READY;
- m_pPause = pPause;
- m_pImage = pImage;
- m_DecodeType = 3;
- (*m_pImage)->fill(0);
- LTP = 0;
- m_loopIndex = 0;
- m_pArithDecoder = pArithDecoder;
- m_gbContext = gbContext;
- return decode_Arith_V1(pPause);
-}
-FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_V1(IFX_Pause* pPause)
-{
- FX_BOOL SLTP, bVal;
- FX_DWORD CONTEXT = 0;
- CJBig2_Image *GBREG = (*m_pImage);
- for(; m_loopIndex < GBH; m_loopIndex++) {
- if(TPGDON) {
- switch(GBTEMPLATE) {
- case 0:
- CONTEXT = 0x9b25;
- break;
- case 1:
- CONTEXT = 0x0795;
- break;
- case 2:
- CONTEXT = 0x00e5;
- break;
- case 3:
- CONTEXT = 0x0195;
- break;
- }
- SLTP = m_pArithDecoder->DECODE(&m_gbContext[CONTEXT]);
- LTP = LTP ^ SLTP;
- }
- if(LTP == 1) {
- for(FX_DWORD w = 0; w < GBW; w++) {
- GBREG->setPixel(w, m_loopIndex, GBREG->getPixel(w, m_loopIndex - 1));
- }
- } else {
- for(FX_DWORD w = 0; w < GBW; w++) {
- if(USESKIP && SKIP->getPixel(w, m_loopIndex)) {
- GBREG->setPixel(w, m_loopIndex, 0);
- } else {
- CONTEXT = 0;
- switch(GBTEMPLATE) {
- case 0:
- CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex);
- CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex) << 1;
- CONTEXT |= GBREG->getPixel(w - 3, m_loopIndex) << 2;
- CONTEXT |= GBREG->getPixel(w - 4, m_loopIndex) << 3;
- CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) << 4;
- CONTEXT |= GBREG->getPixel(w + 2, m_loopIndex - 1) << 5;
- CONTEXT |= GBREG->getPixel(w + 1, m_loopIndex - 1) << 6;
- CONTEXT |= GBREG->getPixel(w, m_loopIndex - 1) << 7;
- CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex - 1) << 8;
- CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex - 1) << 9;
- CONTEXT |= GBREG->getPixel(w + GBAT[2], m_loopIndex + GBAT[3]) << 10;
- CONTEXT |= GBREG->getPixel(w + GBAT[4], m_loopIndex + GBAT[5]) << 11;
- CONTEXT |= GBREG->getPixel(w + 1, m_loopIndex - 2) << 12;
- CONTEXT |= GBREG->getPixel(w, m_loopIndex - 2) << 13;
- CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex - 2) << 14;
- CONTEXT |= GBREG->getPixel(w + GBAT[6], m_loopIndex + GBAT[7]) << 15;
- break;
- case 1:
- CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex);
- CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex) << 1;
- CONTEXT |= GBREG->getPixel(w - 3, m_loopIndex) << 2;
- CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) << 3;
- CONTEXT |= GBREG->getPixel(w + 2, m_loopIndex - 1) << 4;
- CONTEXT |= GBREG->getPixel(w + 1, m_loopIndex - 1) << 5;
- CONTEXT |= GBREG->getPixel(w, m_loopIndex - 1) << 6;
- CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex - 1) << 7;
- CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex - 1) << 8;
- CONTEXT |= GBREG->getPixel(w + 2, m_loopIndex - 2) << 9;
- CONTEXT |= GBREG->getPixel(w + 1, m_loopIndex - 2) << 10;
- CONTEXT |= GBREG->getPixel(w, m_loopIndex - 2) << 11;
- CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex - 2) << 12;
- break;
- case 2:
- CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex);
- CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex) << 1;
- CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) << 2;
- CONTEXT |= GBREG->getPixel(w + 1, m_loopIndex - 1) << 3;
- CONTEXT |= GBREG->getPixel(w, m_loopIndex - 1) << 4;
- CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex - 1) << 5;
- CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex - 1) << 6;
- CONTEXT |= GBREG->getPixel(w + 1, m_loopIndex - 2) << 7;
- CONTEXT |= GBREG->getPixel(w, m_loopIndex - 2) << 8;
- CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex - 2) << 9;
- break;
- case 3:
- CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex);
- CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex) << 1;
- CONTEXT |= GBREG->getPixel(w - 3, m_loopIndex) << 2;
- CONTEXT |= GBREG->getPixel(w - 4, m_loopIndex) << 3;
- CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) << 4;
- CONTEXT |= GBREG->getPixel(w + 1, m_loopIndex - 1) << 5;
- CONTEXT |= GBREG->getPixel(w, m_loopIndex - 1) << 6;
- CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex - 1) << 7;
- CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex - 1) << 8;
- CONTEXT |= GBREG->getPixel(w - 3, m_loopIndex - 1) << 9;
- break;
- }
- bVal = m_pArithDecoder->DECODE(&m_gbContext[CONTEXT]);
- GBREG->setPixel(w, m_loopIndex, bVal);
- }
- }
- }
- if(pPause && pPause->NeedToPauseNow()) {
- m_loopIndex ++;
- m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;
- return FXCODEC_STATUS_DECODE_TOBECONTINUE;
- }
- }
- m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;
- return FXCODEC_STATUS_DECODE_FINISH;
-}
-FXCODEC_STATUS CJBig2_GRDProc::Start_decode_MMR(CJBig2_Image** pImage, CJBig2_BitStream *pStream, IFX_Pause* pPause)
-{
- int bitpos, i;
- JBIG2_ALLOC((* pImage), CJBig2_Image(GBW, GBH));
- if ((* pImage)->m_pData == NULL) {
- delete (* pImage);
- (* pImage) = NULL;
- m_pModule->JBig2_Error("Generic region decoding procedure: Create Image Failed with width = %d, height = %d\n", GBW, GBH);
- m_ProssiveStatus = FXCODEC_STATUS_ERROR;
- return m_ProssiveStatus;
- }
- bitpos = (int)pStream->getBitPos();
- _FaxG4Decode(m_pModule, pStream->getBuf(), pStream->getLength(), &bitpos, (* pImage)->m_pData, GBW, GBH, (* pImage)->m_nStride);
- pStream->setBitPos(bitpos);
- for(i = 0; (FX_DWORD)i < (* pImage)->m_nStride * GBH; i++) {
- (* pImage)->m_pData[i] = ~(* pImage)->m_pData[i];
- }
- m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;
- return m_ProssiveStatus;
-}
-FXCODEC_STATUS CJBig2_GRDProc::decode_MMR()
-{
- return m_ProssiveStatus;
-}
-FXCODEC_STATUS CJBig2_GRDProc::Continue_decode(IFX_Pause* pPause)
-{
- if(m_ProssiveStatus != FXCODEC_STATUS_DECODE_TOBECONTINUE) {
- return m_ProssiveStatus;
- }
- switch (m_DecodeType) {
- case 1:
- return decode_Arith(pPause);
- case 2:
- return decode_Arith_V2(pPause);
- case 3:
- return decode_Arith_V1(pPause);
- case 4:
- return decode_MMR();
- }
- m_ProssiveStatus = FXCODEC_STATUS_ERROR;
- return m_ProssiveStatus;
-}
-FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template0_opt3(CJBig2_Image *pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause)
-{
- FX_BOOL SLTP, bVal;
- FX_DWORD CONTEXT;
- FX_DWORD line1, line2;
- FX_BYTE *pLine1, *pLine2, cVal;
- FX_INT32 nStride, nStride2, k;
- FX_INT32 nLineBytes, nBitsLeft, cc;
- if(m_pLine == NULL) {
- m_pLine = pImage->m_pData;
- }
- nStride = pImage->m_nStride;
- nStride2 = nStride << 1;
- nLineBytes = ((GBW + 7) >> 3) - 1;
- nBitsLeft = GBW - (nLineBytes << 3);
- FX_DWORD height = GBH & 0x7fffffff;
- for(; m_loopIndex < height; m_loopIndex++) {
- if(TPGDON) {
- SLTP = pArithDecoder->DECODE(&gbContext[0x9b25]);
- LTP = LTP ^ SLTP;
- }
- if(LTP == 1) {
- pImage->copyLine(m_loopIndex, m_loopIndex - 1);
- } else {
- if(m_loopIndex > 1) {
- pLine1 = m_pLine - nStride2;
- pLine2 = m_pLine - nStride;
- line1 = (*pLine1++) << 6;
- line2 = *pLine2++;
- CONTEXT = ((line1 & 0xf800) | (line2 & 0x07f0));
- for(cc = 0; cc < nLineBytes; cc++) {
- line1 = (line1 << 8) | ((*pLine1++) << 6);
- line2 = (line2 << 8) | (*pLine2++);
- cVal = 0;
- for(k = 7; k >= 0; k--) {
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
- cVal |= bVal << k;
- CONTEXT = (((CONTEXT & 0x7bf7) << 1) | bVal
- | ((line1 >> k) & 0x0800)
- | ((line2 >> k) & 0x0010));
- }
- m_pLine[cc] = cVal;
- }
- line1 <<= 8;
- line2 <<= 8;
- cVal = 0;
- for(k = 0; k < nBitsLeft; k++) {
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
- cVal |= bVal << (7 - k);
- CONTEXT = (((CONTEXT & 0x7bf7) << 1) | bVal
- | ((line1 >> (7 - k)) & 0x0800)
- | ((line2 >> (7 - k)) & 0x0010));
- }
- m_pLine[nLineBytes] = cVal;
- } else {
- pLine2 = m_pLine - nStride;
- line2 = (m_loopIndex & 1) ? (*pLine2++) : 0;
- CONTEXT = (line2 & 0x07f0);
- for(cc = 0; cc < nLineBytes; cc++) {
- if(m_loopIndex & 1) {
- line2 = (line2 << 8) | (*pLine2++);
- }
- cVal = 0;
- for(k = 7; k >= 0; k--) {
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
- cVal |= bVal << k;
- CONTEXT = (((CONTEXT & 0x7bf7) << 1) | bVal
- | ((line2 >> k) & 0x0010));
- }
- m_pLine[cc] = cVal;
- }
- line2 <<= 8;
- cVal = 0;
- for(k = 0; k < nBitsLeft; k++) {
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
- cVal |= bVal << (7 - k);
- CONTEXT = (((CONTEXT & 0x7bf7) << 1) | bVal
- | ((line2 >> (7 - k)) & 0x0010));
- }
- m_pLine[nLineBytes] = cVal;
- }
- }
- m_pLine += nStride;
- if(pPause && pPause->NeedToPauseNow()) {
- m_loopIndex++;
- m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;
- return FXCODEC_STATUS_DECODE_TOBECONTINUE;
- }
- }
- m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;
- return FXCODEC_STATUS_DECODE_FINISH;
-}
-FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template0_unopt(CJBig2_Image * pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause)
-{
- FX_BOOL SLTP, bVal;
- FX_DWORD CONTEXT;
- FX_DWORD line1, line2, line3;
- for(; m_loopIndex < GBH; m_loopIndex++) {
- if(TPGDON) {
- SLTP = pArithDecoder->DECODE(&gbContext[0x9b25]);
- LTP = LTP ^ SLTP;
- }
- if(LTP == 1) {
- pImage->copyLine(m_loopIndex, m_loopIndex - 1);
- } else {
- line1 = pImage->getPixel(1, m_loopIndex - 2);
- line1 |= pImage->getPixel(0, m_loopIndex - 2) << 1;
- line2 = pImage->getPixel(2, m_loopIndex - 1);
- line2 |= pImage->getPixel(1, m_loopIndex - 1) << 1;
- line2 |= pImage->getPixel(0, m_loopIndex - 1) << 2;
- line3 = 0;
- for(FX_DWORD w = 0; w < GBW; w++) {
- if(USESKIP && SKIP->getPixel(w, m_loopIndex)) {
- bVal = 0;
- } else {
- CONTEXT = line3;
- CONTEXT |= pImage->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) << 4;
- CONTEXT |= line2 << 5;
- CONTEXT |= pImage->getPixel(w + GBAT[2], m_loopIndex + GBAT[3]) << 10;
- CONTEXT |= pImage->getPixel(w + GBAT[4], m_loopIndex + GBAT[5]) << 11;
- CONTEXT |= line1 << 12;
- CONTEXT |= pImage->getPixel(w + GBAT[6], m_loopIndex + GBAT[7]) << 15;
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
- }
- if(bVal) {
- pImage->setPixel(w, m_loopIndex, bVal);
- }
- line1 = ((line1 << 1) | pImage->getPixel(w + 2, m_loopIndex - 2)) & 0x07;
- line2 = ((line2 << 1) | pImage->getPixel(w + 3, m_loopIndex - 1)) & 0x1f;
- line3 = ((line3 << 1) | bVal) & 0x0f;
- }
- }
- if(pPause && pPause->NeedToPauseNow()) {
- m_loopIndex++;
- m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;
- return FXCODEC_STATUS_DECODE_TOBECONTINUE;
- }
- }
- m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;
- return FXCODEC_STATUS_DECODE_FINISH;
-}
-FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template1_opt3(CJBig2_Image *pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause)
-{
- FX_BOOL SLTP, bVal;
- FX_DWORD CONTEXT;
- FX_DWORD line1, line2;
- FX_BYTE *pLine1, *pLine2, cVal;
- FX_INT32 nStride, nStride2, k;
- FX_INT32 nLineBytes, nBitsLeft, cc;
- if (!m_pLine) {
- m_pLine = pImage->m_pData;
- }
- nStride = pImage->m_nStride;
- nStride2 = nStride << 1;
- nLineBytes = ((GBW + 7) >> 3) - 1;
- nBitsLeft = GBW - (nLineBytes << 3);
- for(; m_loopIndex < GBH; m_loopIndex++) {
- if(TPGDON) {
- SLTP = pArithDecoder->DECODE(&gbContext[0x0795]);
- LTP = LTP ^ SLTP;
- }
- if(LTP == 1) {
- pImage->copyLine(m_loopIndex, m_loopIndex - 1);
- } else {
- if(m_loopIndex > 1) {
- pLine1 = m_pLine - nStride2;
- pLine2 = m_pLine - nStride;
- line1 = (*pLine1++) << 4;
- line2 = *pLine2++;
- CONTEXT = (line1 & 0x1e00) | ((line2 >> 1) & 0x01f8);
- for(cc = 0; cc < nLineBytes; cc++) {
- line1 = (line1 << 8) | ((*pLine1++) << 4);
- line2 = (line2 << 8) | (*pLine2++);
- cVal = 0;
- for(k = 7; k >= 0; k--) {
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
- cVal |= bVal << k;
- CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal
- | ((line1 >> k) & 0x0200)
- | ((line2 >> (k + 1)) & 0x0008);
- }
- m_pLine[cc] = cVal;
- }
- line1 <<= 8;
- line2 <<= 8;
- cVal = 0;
- for(k = 0; k < nBitsLeft; k++) {
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
- cVal |= bVal << (7 - k);
- CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal
- | ((line1 >> (7 - k)) & 0x0200)
- | ((line2 >> (8 - k)) & 0x0008);
- }
- m_pLine[nLineBytes] = cVal;
- } else {
- pLine2 = m_pLine - nStride;
- line2 = (m_loopIndex & 1) ? (*pLine2++) : 0;
- CONTEXT = (line2 >> 1) & 0x01f8;
- for(cc = 0; cc < nLineBytes; cc++) {
- if(m_loopIndex & 1) {
- line2 = (line2 << 8) | (*pLine2++);
- }
- cVal = 0;
- for(k = 7; k >= 0; k--) {
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
- cVal |= bVal << k;
- CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal
- | ((line2 >> (k + 1)) & 0x0008);
- }
- m_pLine[cc] = cVal;
- }
- line2 <<= 8;
- cVal = 0;
- for(k = 0; k < nBitsLeft; k++) {
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
- cVal |= bVal << (7 - k);
- CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal
- | ((line2 >> (8 - k)) & 0x0008);
- }
- m_pLine[nLineBytes] = cVal;
- }
- }
- m_pLine += nStride;
- if(pPause && pPause->NeedToPauseNow()) {
- m_loopIndex++;
- m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;
- return FXCODEC_STATUS_DECODE_TOBECONTINUE;
- }
- }
- m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;
- return FXCODEC_STATUS_DECODE_FINISH;
-}
-FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template1_unopt(CJBig2_Image * pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause)
-{
- FX_BOOL SLTP, bVal;
- FX_DWORD CONTEXT;
- FX_DWORD line1, line2, line3;
- for(FX_DWORD h = 0; h < GBH; h++) {
- if(TPGDON) {
- SLTP = pArithDecoder->DECODE(&gbContext[0x0795]);
- LTP = LTP ^ SLTP;
- }
- if(LTP == 1) {
- pImage->copyLine(h, h - 1);
- } else {
- line1 = pImage->getPixel(2, h - 2);
- line1 |= pImage->getPixel(1, h - 2) << 1;
- line1 |= pImage->getPixel(0, h - 2) << 2;
- line2 = pImage->getPixel(2, h - 1);
- line2 |= pImage->getPixel(1, h - 1) << 1;
- line2 |= pImage->getPixel(0, h - 1) << 2;
- line3 = 0;
- for(FX_DWORD w = 0; w < GBW; w++) {
- if(USESKIP && SKIP->getPixel(w, h)) {
- bVal = 0;
- } else {
- CONTEXT = line3;
- CONTEXT |= pImage->getPixel(w + GBAT[0], h + GBAT[1]) << 3;
- CONTEXT |= line2 << 4;
- CONTEXT |= line1 << 9;
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
- }
- if(bVal) {
- pImage->setPixel(w, h, bVal);
- }
- line1 = ((line1 << 1) | pImage->getPixel(w + 3, h - 2)) & 0x0f;
- line2 = ((line2 << 1) | pImage->getPixel(w + 3, h - 1)) & 0x1f;
- line3 = ((line3 << 1) | bVal) & 0x07;
- }
- }
- if(pPause && pPause->NeedToPauseNow()) {
- m_loopIndex++;
- m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;
- return FXCODEC_STATUS_DECODE_TOBECONTINUE;
- }
- }
- m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;
- return FXCODEC_STATUS_DECODE_FINISH;
-}
-FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template2_opt3(CJBig2_Image *pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause)
-{
- FX_BOOL SLTP, bVal;
- FX_DWORD CONTEXT;
- FX_DWORD line1, line2;
- FX_BYTE *pLine1, *pLine2, cVal;
- FX_INT32 nStride, nStride2, k;
- FX_INT32 nLineBytes, nBitsLeft, cc;
- if(!m_pLine) {
- m_pLine = pImage->m_pData;
- }
- nStride = pImage->m_nStride;
- nStride2 = nStride << 1;
- nLineBytes = ((GBW + 7) >> 3) - 1;
- nBitsLeft = GBW - (nLineBytes << 3);
- for(; m_loopIndex < GBH; m_loopIndex++) {
- if(TPGDON) {
- SLTP = pArithDecoder->DECODE(&gbContext[0x00e5]);
- LTP = LTP ^ SLTP;
- }
- if(LTP == 1) {
- pImage->copyLine(m_loopIndex, m_loopIndex - 1);
- } else {
- if(m_loopIndex > 1) {
- pLine1 = m_pLine - nStride2;
- pLine2 = m_pLine - nStride;
- line1 = (*pLine1++) << 1;
- line2 = *pLine2++;
- CONTEXT = (line1 & 0x0380) | ((line2 >> 3) & 0x007c);
- for(cc = 0; cc < nLineBytes; cc++) {
- line1 = (line1 << 8) | ((*pLine1++) << 1);
- line2 = (line2 << 8) | (*pLine2++);
- cVal = 0;
- for(k = 7; k >= 0; k--) {
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
- cVal |= bVal << k;
- CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal
- | ((line1 >> k) & 0x0080)
- | ((line2 >> (k + 3)) & 0x0004);
- }
- m_pLine[cc] = cVal;
- }
- line1 <<= 8;
- line2 <<= 8;
- cVal = 0;
- for(k = 0; k < nBitsLeft; k++) {
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
- cVal |= bVal << (7 - k);
- CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal
- | ((line1 >> (7 - k)) & 0x0080)
- | ((line2 >> (10 - k)) & 0x0004);
- }
- m_pLine[nLineBytes] = cVal;
- } else {
- pLine2 = m_pLine - nStride;
- line2 = (m_loopIndex & 1) ? (*pLine2++) : 0;
- CONTEXT = (line2 >> 3) & 0x007c;
- for(cc = 0; cc < nLineBytes; cc++) {
- if(m_loopIndex & 1) {
- line2 = (line2 << 8) | (*pLine2++);
- }
- cVal = 0;
- for(k = 7; k >= 0; k--) {
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
- cVal |= bVal << k;
- CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal
- | ((line2 >> (k + 3)) & 0x0004);
- }
- m_pLine[cc] = cVal;
- }
- line2 <<= 8;
- cVal = 0;
- for(k = 0; k < nBitsLeft; k++) {
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
- cVal |= bVal << (7 - k);
- CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal
- | (((line2 >> (10 - k))) & 0x0004);
- }
- m_pLine[nLineBytes] = cVal;
- }
- }
- m_pLine += nStride;
- if(pPause && m_loopIndex % 50 == 0 && pPause->NeedToPauseNow()) {
- m_loopIndex++;
- m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;
- return FXCODEC_STATUS_DECODE_TOBECONTINUE;
- }
- }
- m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;
- return FXCODEC_STATUS_DECODE_FINISH;
-}
-FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template2_unopt(CJBig2_Image * pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause)
-{
- FX_BOOL SLTP, bVal;
- FX_DWORD CONTEXT;
- FX_DWORD line1, line2, line3;
- for(; m_loopIndex < GBH; m_loopIndex++) {
- if(TPGDON) {
- SLTP = pArithDecoder->DECODE(&gbContext[0x00e5]);
- LTP = LTP ^ SLTP;
- }
- if(LTP == 1) {
- pImage->copyLine(m_loopIndex, m_loopIndex - 1);
- } else {
- line1 = pImage->getPixel(1, m_loopIndex - 2);
- line1 |= pImage->getPixel(0, m_loopIndex - 2) << 1;
- line2 = pImage->getPixel(1, m_loopIndex - 1);
- line2 |= pImage->getPixel(0, m_loopIndex - 1) << 1;
- line3 = 0;
- for(FX_DWORD w = 0; w < GBW; w++) {
- if(USESKIP && SKIP->getPixel(w, m_loopIndex)) {
- bVal = 0;
- } else {
- CONTEXT = line3;
- CONTEXT |= pImage->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) << 2;
- CONTEXT |= line2 << 3;
- CONTEXT |= line1 << 7;
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
- }
- if(bVal) {
- pImage->setPixel(w, m_loopIndex, bVal);
- }
- line1 = ((line1 << 1) | pImage->getPixel(w + 2, m_loopIndex - 2)) & 0x07;
- line2 = ((line2 << 1) | pImage->getPixel(w + 2, m_loopIndex - 1)) & 0x0f;
- line3 = ((line3 << 1) | bVal) & 0x03;
- }
- }
- if(pPause && pPause->NeedToPauseNow()) {
- m_loopIndex++;
- m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;
- return FXCODEC_STATUS_DECODE_TOBECONTINUE;
- }
- }
- m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;
- return FXCODEC_STATUS_DECODE_FINISH;
-}
-FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template3_opt3(CJBig2_Image *pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause)
-{
- FX_BOOL SLTP, bVal;
- FX_DWORD CONTEXT;
- FX_DWORD line1;
- FX_BYTE *pLine1, cVal;
- FX_INT32 nStride, k;
- FX_INT32 nLineBytes, nBitsLeft, cc;
- if (!m_pLine) {
- m_pLine = pImage->m_pData;
- }
- nStride = pImage->m_nStride;
- nLineBytes = ((GBW + 7) >> 3) - 1;
- nBitsLeft = GBW - (nLineBytes << 3);
- for(; m_loopIndex < GBH; m_loopIndex++) {
- if(TPGDON) {
- SLTP = pArithDecoder->DECODE(&gbContext[0x0195]);
- LTP = LTP ^ SLTP;
- }
- if(LTP == 1) {
- pImage->copyLine(m_loopIndex, m_loopIndex - 1);
- } else {
- if(m_loopIndex > 0) {
- pLine1 = m_pLine - nStride;
- line1 = *pLine1++;
- CONTEXT = (line1 >> 1) & 0x03f0;
- for(cc = 0; cc < nLineBytes; cc++) {
- line1 = (line1 << 8) | (*pLine1++);
- cVal = 0;
- for(k = 7; k >= 0; k--) {
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
- cVal |= bVal << k;
- CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal
- | ((line1 >> (k + 1)) & 0x0010);
- }
- m_pLine[cc] = cVal;
- }
- line1 <<= 8;
- cVal = 0;
- for(k = 0; k < nBitsLeft; k++) {
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
- cVal |= bVal << (7 - k);
- CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal
- | ((line1 >> (8 - k)) & 0x0010);
- }
- m_pLine[nLineBytes] = cVal;
- } else {
- CONTEXT = 0;
- for(cc = 0; cc < nLineBytes; cc++) {
- cVal = 0;
- for(k = 7; k >= 0; k--) {
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
- cVal |= bVal << k;
- CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal;
- }
- m_pLine[cc] = cVal;
- }
- cVal = 0;
- for(k = 0; k < nBitsLeft; k++) {
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
- cVal |= bVal << (7 - k);
- CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal;
- }
- m_pLine[nLineBytes] = cVal;
- }
- }
- m_pLine += nStride;
- if(pPause && pPause->NeedToPauseNow()) {
- m_loopIndex++;
- m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;
- return FXCODEC_STATUS_DECODE_TOBECONTINUE;
- }
- }
- m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;
- return FXCODEC_STATUS_DECODE_FINISH;
-}
-FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template3_unopt(CJBig2_Image * pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause)
-{
- FX_BOOL SLTP, bVal;
- FX_DWORD CONTEXT;
- FX_DWORD line1, line2;
- for(; m_loopIndex < GBH; m_loopIndex++) {
- if(TPGDON) {
- SLTP = pArithDecoder->DECODE(&gbContext[0x0195]);
- LTP = LTP ^ SLTP;
- }
- if(LTP == 1) {
- pImage->copyLine(m_loopIndex, m_loopIndex - 1);
- } else {
- line1 = pImage->getPixel(1, m_loopIndex - 1);
- line1 |= pImage->getPixel(0, m_loopIndex - 1) << 1;
- line2 = 0;
- for(FX_DWORD w = 0; w < GBW; w++) {
- if(USESKIP && SKIP->getPixel(w, m_loopIndex)) {
- bVal = 0;
- } else {
- CONTEXT = line2;
- CONTEXT |= pImage->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) << 4;
- CONTEXT |= line1 << 5;
- bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
- }
- if(bVal) {
- pImage->setPixel(w, m_loopIndex, bVal);
- }
- line1 = ((line1 << 1) | pImage->getPixel(w + 2, m_loopIndex - 1)) & 0x1f;
- line2 = ((line2 << 1) | bVal) & 0x0f;
- }
- }
- if(pPause && pPause->NeedToPauseNow()) {
- m_loopIndex++;
- m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;
- return FXCODEC_STATUS_DECODE_TOBECONTINUE;
- }
- }
- m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;
- return FXCODEC_STATUS_DECODE_FINISH;
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "JBig2_GeneralDecoder.h"
+#include "JBig2_ArithDecoder.h"
+#include "JBig2_ArithIntDecoder.h"
+#include "JBig2_HuffmanDecoder.h"
+#include "JBig2_HuffmanTable.h"
+#include "JBig2_PatternDict.h"
+CJBig2_Image *CJBig2_GRDProc::decode_Arith(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)
+{
+ if (GBW == 0 || GBH == 0) {
+ CJBig2_Image* pImage;
+ JBIG2_ALLOC(pImage, CJBig2_Image(GBW, GBH));
+ return pImage;
+ }
+ if(GBTEMPLATE == 0) {
+ if((GBAT[0] == 3) && (GBAT[1] == (signed char) - 1)
+ && (GBAT[2] == (signed char) - 3) && (GBAT[3] == (signed char) - 1)
+ && (GBAT[4] == 2) && (GBAT[5] == (signed char) - 2)
+ && (GBAT[6] == (signed char) - 2) && (GBAT[7] == (signed char) - 2)) {
+ return decode_Arith_Template0_opt3(pArithDecoder, gbContext);
+ } else {
+ return decode_Arith_Template0_unopt(pArithDecoder, gbContext);
+ }
+ } else if(GBTEMPLATE == 1) {
+ if((GBAT[0] == 3) && (GBAT[1] == (signed char) - 1)) {
+ return decode_Arith_Template1_opt3(pArithDecoder, gbContext);
+ } else {
+ return decode_Arith_Template1_unopt(pArithDecoder, gbContext);
+ }
+ } else if(GBTEMPLATE == 2) {
+ if((GBAT[0] == 2) && (GBAT[1] == (signed char) - 1)) {
+ return decode_Arith_Template2_opt3(pArithDecoder, gbContext);
+ } else {
+ return decode_Arith_Template2_unopt(pArithDecoder, gbContext);
+ }
+ } else {
+ if((GBAT[0] == 2) && (GBAT[1] == (signed char) - 1)) {
+ return decode_Arith_Template3_opt3(pArithDecoder, gbContext);
+ } else {
+ return decode_Arith_Template3_unopt(pArithDecoder, gbContext);
+ }
+ }
+}
+CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template0_opt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)
+{
+ FX_BOOL LTP, SLTP, bVal;
+ FX_DWORD CONTEXT;
+ CJBig2_Image *GBREG;
+ FX_DWORD line1, line2, line3;
+ LTP = 0;
+ JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
+ GBREG->fill(0);
+ for(FX_DWORD h = 0; h < GBH; h++) {
+ if(TPGDON) {
+ SLTP = pArithDecoder->DECODE(&gbContext[0x9b25]);
+ LTP = LTP ^ SLTP;
+ }
+ if(LTP == 1) {
+ GBREG->copyLine(h, h - 1);
+ } else {
+ line1 = GBREG->getPixel(2, h - 2);
+ line1 |= GBREG->getPixel(1, h - 2) << 1;
+ line1 |= GBREG->getPixel(0, h - 2) << 2;
+ line2 = GBREG->getPixel(3, h - 1);
+ line2 |= GBREG->getPixel(2, h - 1) << 1;
+ line2 |= GBREG->getPixel(1, h - 1) << 2;
+ line2 |= GBREG->getPixel(0, h - 1) << 3;
+ line3 = 0;
+ for(FX_DWORD w = 0; w < GBW; w++) {
+ if(USESKIP && SKIP->getPixel(w, h)) {
+ bVal = 0;
+ } else {
+ CONTEXT = line3;
+ CONTEXT |= line2 << 4;
+ CONTEXT |= line1 << 11;
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ }
+ if(bVal) {
+ GBREG->setPixel(w, h, bVal);
+ }
+ line1 = ((line1 << 1) | GBREG->getPixel(w + 3, h - 2)) & 0x1f;
+ line2 = ((line2 << 1) | GBREG->getPixel(w + 4, h - 1)) & 0x7f;
+ line3 = ((line3 << 1) | bVal) & 0x0f;
+ }
+ }
+ }
+ return GBREG;
+}
+CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template0_opt2(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)
+{
+ FX_BOOL LTP, SLTP, bVal;
+ FX_DWORD CONTEXT;
+ CJBig2_Image *GBREG;
+ FX_DWORD line1, line2;
+ FX_BYTE *pLine, cVal;
+ FX_INTPTR nStride, nStride2;
+ FX_INT32 nBits, k;
+ LTP = 0;
+ JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
+ if (GBREG->m_pData == NULL) {
+ delete GBREG;
+ m_pModule->JBig2_Error("Generic region decoding procedure: Create Image Failed with width = %d, height = %d\n", GBW, GBH);
+ return NULL;
+ }
+ pLine = GBREG->m_pData;
+ nStride = GBREG->m_nStride;
+ nStride2 = nStride << 1;
+ for(FX_DWORD h = 0; h < GBH; h++) {
+ if(TPGDON) {
+ SLTP = pArithDecoder->DECODE(&gbContext[0x9b25]);
+ LTP = LTP ^ SLTP;
+ }
+ if(LTP == 1) {
+ GBREG->copyLine(h, h - 1);
+ } else {
+ line1 = (h > 1) ? pLine[-nStride2] << 6 : 0;
+ line2 = (h > 0) ? pLine[-nStride] : 0;
+ CONTEXT = (line1 & 0xf800) | (line2 & 0x07f0);
+ for(FX_DWORD w = 0; w < GBW; w += 8) {
+ if(w + 8 < GBW) {
+ nBits = 8;
+ if(h > 1) {
+ line1 = (line1 << 8) | (pLine[-nStride2 + (w >> 3) + 1] << 6);
+ }
+ if(h > 0) {
+ line2 = (line2 << 8) | (pLine[-nStride + (w >> 3) + 1]);
+ }
+ } else {
+ nBits = GBW - w;
+ if(h > 1) {
+ line1 <<= 8;
+ }
+ if(h > 0) {
+ line2 <<= 8;
+ }
+ }
+ cVal = 0;
+ for(k = 0; k < nBits; k++) {
+ if(USESKIP && SKIP->getPixel(w, h)) {
+ bVal = 0;
+ } else {
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ }
+ cVal |= bVal << (7 - k);
+ CONTEXT = ((CONTEXT & 0x7bf7) << 1) | bVal
+ | ((line1 >> (7 - k)) & 0x0800)
+ | ((line2 >> (7 - k)) & 0x0010);
+ }
+ pLine[w >> 3] = cVal;
+ }
+ }
+ pLine += nStride;
+ }
+ return GBREG;
+}
+CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template0_opt3(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)
+{
+ FX_BOOL LTP, SLTP, bVal;
+ FX_DWORD CONTEXT;
+ CJBig2_Image *GBREG;
+ FX_DWORD line1, line2;
+ FX_BYTE *pLine, *pLine1, *pLine2, cVal;
+ FX_INT32 nStride, nStride2, k;
+ FX_INT32 nLineBytes, nBitsLeft, cc;
+ LTP = 0;
+ JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
+ if (GBREG->m_pData == NULL) {
+ delete GBREG;
+ m_pModule->JBig2_Error("Generic region decoding procedure: Create Image Failed with width = %d, height = %d\n", GBW, GBH);
+ return NULL;
+ }
+ pLine = GBREG->m_pData;
+ nStride = GBREG->m_nStride;
+ nStride2 = nStride << 1;
+ nLineBytes = ((GBW + 7) >> 3) - 1;
+ nBitsLeft = GBW - (nLineBytes << 3);
+ FX_DWORD height = GBH & 0x7fffffff;
+ for(FX_DWORD h = 0; h < height; h++) {
+ if(TPGDON) {
+ SLTP = pArithDecoder->DECODE(&gbContext[0x9b25]);
+ LTP = LTP ^ SLTP;
+ }
+ if(LTP == 1) {
+ GBREG->copyLine(h, h - 1);
+ } else {
+ if(h > 1) {
+ pLine1 = pLine - nStride2;
+ pLine2 = pLine - nStride;
+ line1 = (*pLine1++) << 6;
+ line2 = *pLine2++;
+ CONTEXT = ((line1 & 0xf800) | (line2 & 0x07f0));
+ for(cc = 0; cc < nLineBytes; cc++) {
+ line1 = (line1 << 8) | ((*pLine1++) << 6);
+ line2 = (line2 << 8) | (*pLine2++);
+ cVal = 0;
+ for(k = 7; k >= 0; k--) {
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ cVal |= bVal << k;
+ CONTEXT = (((CONTEXT & 0x7bf7) << 1) | bVal
+ | ((line1 >> k) & 0x0800)
+ | ((line2 >> k) & 0x0010));
+ }
+ pLine[cc] = cVal;
+ }
+ line1 <<= 8;
+ line2 <<= 8;
+ cVal = 0;
+ for(k = 0; k < nBitsLeft; k++) {
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ cVal |= bVal << (7 - k);
+ CONTEXT = (((CONTEXT & 0x7bf7) << 1) | bVal
+ | ((line1 >> (7 - k)) & 0x0800)
+ | ((line2 >> (7 - k)) & 0x0010));
+ }
+ pLine[nLineBytes] = cVal;
+ } else {
+ pLine2 = pLine - nStride;
+ line2 = (h & 1) ? (*pLine2++) : 0;
+ CONTEXT = (line2 & 0x07f0);
+ for(cc = 0; cc < nLineBytes; cc++) {
+ if(h & 1) {
+ line2 = (line2 << 8) | (*pLine2++);
+ }
+ cVal = 0;
+ for(k = 7; k >= 0; k--) {
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ cVal |= bVal << k;
+ CONTEXT = (((CONTEXT & 0x7bf7) << 1) | bVal
+ | ((line2 >> k) & 0x0010));
+ }
+ pLine[cc] = cVal;
+ }
+ line2 <<= 8;
+ cVal = 0;
+ for(k = 0; k < nBitsLeft; k++) {
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ cVal |= bVal << (7 - k);
+ CONTEXT = (((CONTEXT & 0x7bf7) << 1) | bVal
+ | (((line2 >> (7 - k))) & 0x0010));
+ }
+ pLine[nLineBytes] = cVal;
+ }
+ }
+ pLine += nStride;
+ }
+ return GBREG;
+}
+CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template0_unopt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)
+{
+ FX_BOOL LTP, SLTP, bVal;
+ FX_DWORD CONTEXT;
+ CJBig2_Image *GBREG;
+ FX_DWORD line1, line2, line3;
+ LTP = 0;
+ JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
+ GBREG->fill(0);
+ for(FX_DWORD h = 0; h < GBH; h++) {
+ if(TPGDON) {
+ SLTP = pArithDecoder->DECODE(&gbContext[0x9b25]);
+ LTP = LTP ^ SLTP;
+ }
+ if(LTP == 1) {
+ GBREG->copyLine(h, h - 1);
+ } else {
+ line1 = GBREG->getPixel(1, h - 2);
+ line1 |= GBREG->getPixel(0, h - 2) << 1;
+ line2 = GBREG->getPixel(2, h - 1);
+ line2 |= GBREG->getPixel(1, h - 1) << 1;
+ line2 |= GBREG->getPixel(0, h - 1) << 2;
+ line3 = 0;
+ for(FX_DWORD w = 0; w < GBW; w++) {
+ if(USESKIP && SKIP->getPixel(w, h)) {
+ bVal = 0;
+ } else {
+ CONTEXT = line3;
+ CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 4;
+ CONTEXT |= line2 << 5;
+ CONTEXT |= GBREG->getPixel(w + GBAT[2], h + GBAT[3]) << 10;
+ CONTEXT |= GBREG->getPixel(w + GBAT[4], h + GBAT[5]) << 11;
+ CONTEXT |= line1 << 12;
+ CONTEXT |= GBREG->getPixel(w + GBAT[6], h + GBAT[7]) << 15;
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ }
+ if(bVal) {
+ GBREG->setPixel(w, h, bVal);
+ }
+ line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 2)) & 0x07;
+ line2 = ((line2 << 1) | GBREG->getPixel(w + 3, h - 1)) & 0x1f;
+ line3 = ((line3 << 1) | bVal) & 0x0f;
+ }
+ }
+ }
+ return GBREG;
+}
+CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template1_opt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)
+{
+ FX_BOOL LTP, SLTP, bVal;
+ FX_DWORD CONTEXT;
+ CJBig2_Image *GBREG;
+ FX_DWORD line1, line2, line3;
+ LTP = 0;
+ JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
+ GBREG->fill(0);
+ for(FX_DWORD h = 0; h < GBH; h++) {
+ if(TPGDON) {
+ SLTP = pArithDecoder->DECODE(&gbContext[0x0795]);
+ LTP = LTP ^ SLTP;
+ }
+ if(LTP == 1) {
+ GBREG->copyLine(h, h - 1);
+ } else {
+ line1 = GBREG->getPixel(2, h - 2);
+ line1 |= GBREG->getPixel(1, h - 2) << 1;
+ line1 |= GBREG->getPixel(0, h - 2) << 2;
+ line2 = GBREG->getPixel(3, h - 1);
+ line2 |= GBREG->getPixel(2, h - 1) << 1;
+ line2 |= GBREG->getPixel(1, h - 1) << 2;
+ line2 |= GBREG->getPixel(0, h - 1) << 3;
+ line3 = 0;
+ for(FX_DWORD w = 0; w < GBW; w++) {
+ if(USESKIP && SKIP->getPixel(w, h)) {
+ bVal = 0;
+ } else {
+ CONTEXT = line3;
+ CONTEXT |= line2 << 3;
+ CONTEXT |= line1 << 9;
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ }
+ if(bVal) {
+ GBREG->setPixel(w, h, bVal);
+ }
+ line1 = ((line1 << 1) | GBREG->getPixel(w + 3, h - 2)) & 0x0f;
+ line2 = ((line2 << 1) | GBREG->getPixel(w + 4, h - 1)) & 0x3f;
+ line3 = ((line3 << 1) | bVal) & 0x07;
+ }
+ }
+ }
+ return GBREG;
+}
+CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template1_opt2(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)
+{
+ FX_BOOL LTP, SLTP, bVal;
+ FX_DWORD CONTEXT;
+ CJBig2_Image *GBREG;
+ FX_DWORD line1, line2;
+ FX_BYTE *pLine, cVal;
+ FX_INTPTR nStride, nStride2;
+ FX_INT32 nBits, k;
+ LTP = 0;
+ JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
+ if (GBREG->m_pData == NULL) {
+ delete GBREG;
+ m_pModule->JBig2_Error("Generic region decoding procedure: Create Image Failed with width = %d, height = %d\n", GBW, GBH);
+ return NULL;
+ }
+ pLine = GBREG->m_pData;
+ nStride = GBREG->m_nStride;
+ nStride2 = nStride << 1;
+ for(FX_DWORD h = 0; h < GBH; h++) {
+ if(TPGDON) {
+ SLTP = pArithDecoder->DECODE(&gbContext[0x0795]);
+ LTP = LTP ^ SLTP;
+ }
+ if(LTP == 1) {
+ GBREG->copyLine(h, h - 1);
+ } else {
+ line1 = (h > 1) ? pLine[-nStride2] << 4 : 0;
+ line2 = (h > 0) ? pLine[-nStride] : 0;
+ CONTEXT = (line1 & 0x1e00) | ((line2 >> 1) & 0x01f8);
+ for(FX_DWORD w = 0; w < GBW; w += 8) {
+ if(w + 8 < GBW) {
+ nBits = 8;
+ if(h > 1) {
+ line1 = (line1 << 8) | (pLine[-nStride2 + (w >> 3) + 1] << 4);
+ }
+ if(h > 0) {
+ line2 = (line2 << 8) | (pLine[-nStride + (w >> 3) + 1]);
+ }
+ } else {
+ nBits = GBW - w;
+ if(h > 1) {
+ line1 <<= 8;
+ }
+ if(h > 0) {
+ line2 <<= 8;
+ }
+ }
+ cVal = 0;
+ for(k = 0; k < nBits; k++) {
+ if(USESKIP && SKIP->getPixel(w, h)) {
+ bVal = 0;
+ } else {
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ }
+ cVal |= bVal << (7 - k);
+ CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal
+ | ((line1 >> (7 - k)) & 0x0200)
+ | ((line2 >> (8 - k)) & 0x0008);
+ }
+ pLine[w >> 3] = cVal;
+ }
+ }
+ pLine += nStride;
+ }
+ return GBREG;
+}
+CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template1_opt3(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)
+{
+ FX_BOOL LTP, SLTP, bVal;
+ FX_DWORD CONTEXT;
+ CJBig2_Image *GBREG;
+ FX_DWORD line1, line2;
+ FX_BYTE *pLine, *pLine1, *pLine2, cVal;
+ FX_INT32 nStride, nStride2, k;
+ FX_INT32 nLineBytes, nBitsLeft, cc;
+ LTP = 0;
+ JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
+ if (GBREG->m_pData == NULL) {
+ delete GBREG;
+ m_pModule->JBig2_Error("Generic region decoding procedure: Create Image Failed with width = %d, height = %d\n", GBW, GBH);
+ return NULL;
+ }
+ pLine = GBREG->m_pData;
+ nStride = GBREG->m_nStride;
+ nStride2 = nStride << 1;
+ nLineBytes = ((GBW + 7) >> 3) - 1;
+ nBitsLeft = GBW - (nLineBytes << 3);
+ for(FX_DWORD h = 0; h < GBH; h++) {
+ if(TPGDON) {
+ SLTP = pArithDecoder->DECODE(&gbContext[0x0795]);
+ LTP = LTP ^ SLTP;
+ }
+ if(LTP == 1) {
+ GBREG->copyLine(h, h - 1);
+ } else {
+ if(h > 1) {
+ pLine1 = pLine - nStride2;
+ pLine2 = pLine - nStride;
+ line1 = (*pLine1++) << 4;
+ line2 = *pLine2++;
+ CONTEXT = (line1 & 0x1e00) | ((line2 >> 1) & 0x01f8);
+ for(cc = 0; cc < nLineBytes; cc++) {
+ line1 = (line1 << 8) | ((*pLine1++) << 4);
+ line2 = (line2 << 8) | (*pLine2++);
+ cVal = 0;
+ for(k = 7; k >= 0; k--) {
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ cVal |= bVal << k;
+ CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal
+ | ((line1 >> k) & 0x0200)
+ | ((line2 >> (k + 1)) & 0x0008);
+ }
+ pLine[cc] = cVal;
+ }
+ line1 <<= 8;
+ line2 <<= 8;
+ cVal = 0;
+ for(k = 0; k < nBitsLeft; k++) {
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ cVal |= bVal << (7 - k);
+ CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal
+ | ((line1 >> (7 - k)) & 0x0200)
+ | ((line2 >> (8 - k)) & 0x0008);
+ }
+ pLine[nLineBytes] = cVal;
+ } else {
+ pLine2 = pLine - nStride;
+ line2 = (h & 1) ? (*pLine2++) : 0;
+ CONTEXT = (line2 >> 1) & 0x01f8;
+ for(cc = 0; cc < nLineBytes; cc++) {
+ if(h & 1) {
+ line2 = (line2 << 8) | (*pLine2++);
+ }
+ cVal = 0;
+ for(k = 7; k >= 0; k--) {
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ cVal |= bVal << k;
+ CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal
+ | ((line2 >> (k + 1)) & 0x0008);
+ }
+ pLine[cc] = cVal;
+ }
+ line2 <<= 8;
+ cVal = 0;
+ for(k = 0; k < nBitsLeft; k++) {
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ cVal |= bVal << (7 - k);
+ CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal
+ | ((line2 >> (8 - k)) & 0x0008);
+ }
+ pLine[nLineBytes] = cVal;
+ }
+ }
+ pLine += nStride;
+ }
+ return GBREG;
+}
+CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template1_unopt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)
+{
+ FX_BOOL LTP, SLTP, bVal;
+ FX_DWORD CONTEXT;
+ CJBig2_Image *GBREG;
+ FX_DWORD line1, line2, line3;
+ LTP = 0;
+ JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
+ GBREG->fill(0);
+ for(FX_DWORD h = 0; h < GBH; h++) {
+ if(TPGDON) {
+ SLTP = pArithDecoder->DECODE(&gbContext[0x0795]);
+ LTP = LTP ^ SLTP;
+ }
+ if(LTP == 1) {
+ GBREG->copyLine(h, h - 1);
+ } else {
+ line1 = GBREG->getPixel(2, h - 2);
+ line1 |= GBREG->getPixel(1, h - 2) << 1;
+ line1 |= GBREG->getPixel(0, h - 2) << 2;
+ line2 = GBREG->getPixel(2, h - 1);
+ line2 |= GBREG->getPixel(1, h - 1) << 1;
+ line2 |= GBREG->getPixel(0, h - 1) << 2;
+ line3 = 0;
+ for(FX_DWORD w = 0; w < GBW; w++) {
+ if(USESKIP && SKIP->getPixel(w, h)) {
+ bVal = 0;
+ } else {
+ CONTEXT = line3;
+ CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 3;
+ CONTEXT |= line2 << 4;
+ CONTEXT |= line1 << 9;
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ }
+ if(bVal) {
+ GBREG->setPixel(w, h, bVal);
+ }
+ line1 = ((line1 << 1) | GBREG->getPixel(w + 3, h - 2)) & 0x0f;
+ line2 = ((line2 << 1) | GBREG->getPixel(w + 3, h - 1)) & 0x1f;
+ line3 = ((line3 << 1) | bVal) & 0x07;
+ }
+ }
+ }
+ return GBREG;
+}
+CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template2_opt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)
+{
+ FX_BOOL LTP, SLTP, bVal;
+ FX_DWORD CONTEXT;
+ CJBig2_Image *GBREG;
+ FX_DWORD line1, line2, line3;
+ LTP = 0;
+ JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
+ GBREG->fill(0);
+ for(FX_DWORD h = 0; h < GBH; h++) {
+ if(TPGDON) {
+ SLTP = pArithDecoder->DECODE(&gbContext[0x00e5]);
+ LTP = LTP ^ SLTP;
+ }
+ if(LTP == 1) {
+ GBREG->copyLine(h, h - 1);
+ } else {
+ line1 = GBREG->getPixel(1, h - 2);
+ line1 |= GBREG->getPixel(0, h - 2) << 1;
+ line2 = GBREG->getPixel(2, h - 1);
+ line2 |= GBREG->getPixel(1, h - 1) << 1;
+ line2 |= GBREG->getPixel(0, h - 1) << 2;
+ line3 = 0;
+ for(FX_DWORD w = 0; w < GBW; w++) {
+ if(USESKIP && SKIP->getPixel(w, h)) {
+ bVal = 0;
+ } else {
+ CONTEXT = line3;
+ CONTEXT |= line2 << 2;
+ CONTEXT |= line1 << 7;
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ }
+ if(bVal) {
+ GBREG->setPixel(w, h, bVal);
+ }
+ line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 2)) & 0x07;
+ line2 = ((line2 << 1) | GBREG->getPixel(w + 3, h - 1)) & 0x1f;
+ line3 = ((line3 << 1) | bVal) & 0x03;
+ }
+ }
+ }
+ return GBREG;
+}
+CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template2_opt2(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)
+{
+ FX_BOOL LTP, SLTP, bVal;
+ FX_DWORD CONTEXT;
+ CJBig2_Image *GBREG;
+ FX_DWORD line1, line2;
+ FX_BYTE *pLine, cVal;
+ FX_INTPTR nStride, nStride2;
+ FX_INT32 nBits, k;
+ LTP = 0;
+ JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
+ if (GBREG->m_pData == NULL) {
+ delete GBREG;
+ m_pModule->JBig2_Error("Generic region decoding procedure: Create Image Failed with width = %d, height = %d\n", GBW, GBH);
+ return NULL;
+ }
+ pLine = GBREG->m_pData;
+ nStride = GBREG->m_nStride;
+ nStride2 = nStride << 1;
+ for(FX_DWORD h = 0; h < GBH; h++) {
+ if(TPGDON) {
+ SLTP = pArithDecoder->DECODE(&gbContext[0x00e5]);
+ LTP = LTP ^ SLTP;
+ }
+ if(LTP == 1) {
+ GBREG->copyLine(h, h - 1);
+ } else {
+ line1 = (h > 1) ? pLine[-nStride2] << 1 : 0;
+ line2 = (h > 0) ? pLine[-nStride] : 0;
+ CONTEXT = (line1 & 0x0380) | ((line2 >> 3) & 0x007c);
+ for(FX_DWORD w = 0; w < GBW; w += 8) {
+ if(w + 8 < GBW) {
+ nBits = 8;
+ if(h > 1) {
+ line1 = (line1 << 8) | (pLine[-nStride2 + (w >> 3) + 1] << 1);
+ }
+ if(h > 0) {
+ line2 = (line2 << 8) | (pLine[-nStride + (w >> 3) + 1]);
+ }
+ } else {
+ nBits = GBW - w;
+ if(h > 1) {
+ line1 <<= 8;
+ }
+ if(h > 0) {
+ line2 <<= 8;
+ }
+ }
+ cVal = 0;
+ for(k = 0; k < nBits; k++) {
+ if(USESKIP && SKIP->getPixel(w, h)) {
+ bVal = 0;
+ } else {
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ }
+ cVal |= bVal << (7 - k);
+ CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal
+ | ((line1 >> (7 - k)) & 0x0080)
+ | ((line2 >> (10 - k)) & 0x0004);
+ }
+ pLine[w >> 3] = cVal;
+ }
+ }
+ pLine += nStride;
+ }
+ return GBREG;
+}
+CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template2_opt3(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)
+{
+ FX_BOOL LTP, SLTP, bVal;
+ FX_DWORD CONTEXT;
+ CJBig2_Image *GBREG;
+ FX_DWORD line1, line2;
+ FX_BYTE *pLine, *pLine1, *pLine2, cVal;
+ FX_INT32 nStride, nStride2, k;
+ FX_INT32 nLineBytes, nBitsLeft, cc;
+ LTP = 0;
+ JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
+ if (GBREG->m_pData == NULL) {
+ delete GBREG;
+ m_pModule->JBig2_Error("Generic region decoding procedure: Create Image Failed with width = %d, height = %d\n", GBW, GBH);
+ return NULL;
+ }
+ pLine = GBREG->m_pData;
+ nStride = GBREG->m_nStride;
+ nStride2 = nStride << 1;
+ nLineBytes = ((GBW + 7) >> 3) - 1;
+ nBitsLeft = GBW - (nLineBytes << 3);
+ for(FX_DWORD h = 0; h < GBH; h++) {
+ if(TPGDON) {
+ SLTP = pArithDecoder->DECODE(&gbContext[0x00e5]);
+ LTP = LTP ^ SLTP;
+ }
+ if(LTP == 1) {
+ GBREG->copyLine(h, h - 1);
+ } else {
+ if(h > 1) {
+ pLine1 = pLine - nStride2;
+ pLine2 = pLine - nStride;
+ line1 = (*pLine1++) << 1;
+ line2 = *pLine2++;
+ CONTEXT = (line1 & 0x0380) | ((line2 >> 3) & 0x007c);
+ for(cc = 0; cc < nLineBytes; cc++) {
+ line1 = (line1 << 8) | ((*pLine1++) << 1);
+ line2 = (line2 << 8) | (*pLine2++);
+ cVal = 0;
+ for(k = 7; k >= 0; k--) {
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ cVal |= bVal << k;
+ CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal
+ | ((line1 >> k) & 0x0080)
+ | ((line2 >> (k + 3)) & 0x0004);
+ }
+ pLine[cc] = cVal;
+ }
+ line1 <<= 8;
+ line2 <<= 8;
+ cVal = 0;
+ for(k = 0; k < nBitsLeft; k++) {
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ cVal |= bVal << (7 - k);
+ CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal
+ | ((line1 >> (7 - k)) & 0x0080)
+ | ((line2 >> (10 - k)) & 0x0004);
+ }
+ pLine[nLineBytes] = cVal;
+ } else {
+ pLine2 = pLine - nStride;
+ line2 = (h & 1) ? (*pLine2++) : 0;
+ CONTEXT = (line2 >> 3) & 0x007c;
+ for(cc = 0; cc < nLineBytes; cc++) {
+ if(h & 1) {
+ line2 = (line2 << 8) | (*pLine2++);
+ }
+ cVal = 0;
+ for(k = 7; k >= 0; k--) {
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ cVal |= bVal << k;
+ CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal
+ | ((line2 >> (k + 3)) & 0x0004);
+ }
+ pLine[cc] = cVal;
+ }
+ line2 <<= 8;
+ cVal = 0;
+ for(k = 0; k < nBitsLeft; k++) {
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ cVal |= bVal << (7 - k);
+ CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal
+ | (((line2 >> (10 - k))) & 0x0004);
+ }
+ pLine[nLineBytes] = cVal;
+ }
+ }
+ pLine += nStride;
+ }
+ return GBREG;
+}
+CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template2_unopt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)
+{
+ FX_BOOL LTP, SLTP, bVal;
+ FX_DWORD CONTEXT;
+ CJBig2_Image *GBREG;
+ FX_DWORD line1, line2, line3;
+ LTP = 0;
+ JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
+ GBREG->fill(0);
+ for(FX_DWORD h = 0; h < GBH; h++) {
+ if(TPGDON) {
+ SLTP = pArithDecoder->DECODE(&gbContext[0x00e5]);
+ LTP = LTP ^ SLTP;
+ }
+ if(LTP == 1) {
+ GBREG->copyLine(h, h - 1);
+ } else {
+ line1 = GBREG->getPixel(1, h - 2);
+ line1 |= GBREG->getPixel(0, h - 2) << 1;
+ line2 = GBREG->getPixel(1, h - 1);
+ line2 |= GBREG->getPixel(0, h - 1) << 1;
+ line3 = 0;
+ for(FX_DWORD w = 0; w < GBW; w++) {
+ if(USESKIP && SKIP->getPixel(w, h)) {
+ bVal = 0;
+ } else {
+ CONTEXT = line3;
+ CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 2;
+ CONTEXT |= line2 << 3;
+ CONTEXT |= line1 << 7;
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ }
+ if(bVal) {
+ GBREG->setPixel(w, h, bVal);
+ }
+ line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 2)) & 0x07;
+ line2 = ((line2 << 1) | GBREG->getPixel(w + 2, h - 1)) & 0x0f;
+ line3 = ((line3 << 1) | bVal) & 0x03;
+ }
+ }
+ }
+ return GBREG;
+}
+CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template3_opt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)
+{
+ FX_BOOL LTP, SLTP, bVal;
+ FX_DWORD CONTEXT;
+ CJBig2_Image *GBREG;
+ FX_DWORD line1, line2;
+ LTP = 0;
+ JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
+ GBREG->fill(0);
+ for(FX_DWORD h = 0; h < GBH; h++) {
+ if(TPGDON) {
+ SLTP = pArithDecoder->DECODE(&gbContext[0x0195]);
+ LTP = LTP ^ SLTP;
+ }
+ if(LTP == 1) {
+ GBREG->copyLine(h, h - 1);
+ } else {
+ line1 = GBREG->getPixel(2, h - 1);
+ line1 |= GBREG->getPixel(1, h - 1) << 1;
+ line1 |= GBREG->getPixel(0, h - 1) << 2;
+ line2 = 0;
+ for(FX_DWORD w = 0; w < GBW; w++) {
+ if(USESKIP && SKIP->getPixel(w, h)) {
+ bVal = 0;
+ } else {
+ CONTEXT = line2;
+ CONTEXT |= line1 << 4;
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ }
+ if(bVal) {
+ GBREG->setPixel(w, h, bVal);
+ }
+ line1 = ((line1 << 1) | GBREG->getPixel(w + 3, h - 1)) & 0x3f;
+ line2 = ((line2 << 1) | bVal) & 0x0f;
+ }
+ }
+ }
+ return GBREG;
+}
+CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template3_opt2(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)
+{
+ FX_BOOL LTP, SLTP, bVal;
+ FX_DWORD CONTEXT;
+ CJBig2_Image *GBREG;
+ FX_DWORD line1;
+ FX_BYTE *pLine, cVal;
+ FX_INTPTR nStride, nStride2;
+ FX_INT32 nBits, k;
+ LTP = 0;
+ JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
+ if (GBREG->m_pData == NULL) {
+ delete GBREG;
+ m_pModule->JBig2_Error("Generic region decoding procedure: Create Image Failed with width = %d, height = %d\n", GBW, GBH);
+ return NULL;
+ }
+ pLine = GBREG->m_pData;
+ nStride = GBREG->m_nStride;
+ nStride2 = nStride << 1;
+ for(FX_DWORD h = 0; h < GBH; h++) {
+ if(TPGDON) {
+ SLTP = pArithDecoder->DECODE(&gbContext[0x0195]);
+ LTP = LTP ^ SLTP;
+ }
+ if(LTP == 1) {
+ GBREG->copyLine(h, h - 1);
+ } else {
+ line1 = (h > 0) ? pLine[-nStride] : 0;
+ CONTEXT = (line1 >> 1) & 0x03f0;
+ for(FX_DWORD w = 0; w < GBW; w += 8) {
+ if(w + 8 < GBW) {
+ nBits = 8;
+ if(h > 0) {
+ line1 = (line1 << 8) | (pLine[-nStride + (w >> 3) + 1]);
+ }
+ } else {
+ nBits = GBW - w;
+ if(h > 0) {
+ line1 <<= 8;
+ }
+ }
+ cVal = 0;
+ for(k = 0; k < nBits; k++) {
+ if(USESKIP && SKIP->getPixel(w, h)) {
+ bVal = 0;
+ } else {
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ }
+ cVal |= bVal << (7 - k);
+ CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal
+ | ((line1 >> (8 - k)) & 0x0010);
+ }
+ pLine[w >> 3] = cVal;
+ }
+ }
+ pLine += nStride;
+ }
+ return GBREG;
+}
+CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template3_opt3(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)
+{
+ FX_BOOL LTP, SLTP, bVal;
+ FX_DWORD CONTEXT;
+ CJBig2_Image *GBREG;
+ FX_DWORD line1;
+ FX_BYTE *pLine, *pLine1, cVal;
+ FX_INT32 nStride, k;
+ FX_INT32 nLineBytes, nBitsLeft, cc;
+ LTP = 0;
+ JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
+ if (GBREG->m_pData == NULL) {
+ delete GBREG;
+ m_pModule->JBig2_Error("Generic region decoding procedure: Create Image Failed with width = %d, height = %d\n", GBW, GBH);
+ return NULL;
+ }
+ pLine = GBREG->m_pData;
+ nStride = GBREG->m_nStride;
+ nLineBytes = ((GBW + 7) >> 3) - 1;
+ nBitsLeft = GBW - (nLineBytes << 3);
+ for(FX_DWORD h = 0; h < GBH; h++) {
+ if(TPGDON) {
+ SLTP = pArithDecoder->DECODE(&gbContext[0x0195]);
+ LTP = LTP ^ SLTP;
+ }
+ if(LTP == 1) {
+ GBREG->copyLine(h, h - 1);
+ } else {
+ if(h > 0) {
+ pLine1 = pLine - nStride;
+ line1 = *pLine1++;
+ CONTEXT = (line1 >> 1) & 0x03f0;
+ for(cc = 0; cc < nLineBytes; cc++) {
+ line1 = (line1 << 8) | (*pLine1++);
+ cVal = 0;
+ for(k = 7; k >= 0; k--) {
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ cVal |= bVal << k;
+ CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal
+ | ((line1 >> (k + 1)) & 0x0010);
+ }
+ pLine[cc] = cVal;
+ }
+ line1 <<= 8;
+ cVal = 0;
+ for(k = 0; k < nBitsLeft; k++) {
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ cVal |= bVal << (7 - k);
+ CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal
+ | ((line1 >> (8 - k)) & 0x0010);
+ }
+ pLine[nLineBytes] = cVal;
+ } else {
+ CONTEXT = 0;
+ for(cc = 0; cc < nLineBytes; cc++) {
+ cVal = 0;
+ for(k = 7; k >= 0; k--) {
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ cVal |= bVal << k;
+ CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal;
+ }
+ pLine[cc] = cVal;
+ }
+ cVal = 0;
+ for(k = 0; k < nBitsLeft; k++) {
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ cVal |= bVal << (7 - k);
+ CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal;
+ }
+ pLine[nLineBytes] = cVal;
+ }
+ }
+ pLine += nStride;
+ }
+ return GBREG;
+}
+CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template3_unopt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)
+{
+ FX_BOOL LTP, SLTP, bVal;
+ FX_DWORD CONTEXT;
+ CJBig2_Image *GBREG;
+ FX_DWORD line1, line2;
+ LTP = 0;
+ JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
+ GBREG->fill(0);
+ for(FX_DWORD h = 0; h < GBH; h++) {
+ if(TPGDON) {
+ SLTP = pArithDecoder->DECODE(&gbContext[0x0195]);
+ LTP = LTP ^ SLTP;
+ }
+ if(LTP == 1) {
+ GBREG->copyLine(h, h - 1);
+ } else {
+ line1 = GBREG->getPixel(1, h - 1);
+ line1 |= GBREG->getPixel(0, h - 1) << 1;
+ line2 = 0;
+ for(FX_DWORD w = 0; w < GBW; w++) {
+ if(USESKIP && SKIP->getPixel(w, h)) {
+ bVal = 0;
+ } else {
+ CONTEXT = line2;
+ CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 4;
+ CONTEXT |= line1 << 5;
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ }
+ if(bVal) {
+ GBREG->setPixel(w, h, bVal);
+ }
+ line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 1)) & 0x1f;
+ line2 = ((line2 << 1) | bVal) & 0x0f;
+ }
+ }
+ }
+ return GBREG;
+}
+CJBig2_Image *CJBig2_GRDProc::decode_Arith_V2(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)
+{
+ FX_BOOL LTP, SLTP, bVal;
+ FX_DWORD CONTEXT;
+ CJBig2_Image *GBREG;
+ FX_DWORD line1, line2, line3;
+ LTP = 0;
+ JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
+ GBREG->fill(0);
+ for(FX_DWORD h = 0; h < GBH; h++) {
+ if(TPGDON) {
+ switch(GBTEMPLATE) {
+ case 0:
+ CONTEXT = 0x9b25;
+ break;
+ case 1:
+ CONTEXT = 0x0795;
+ break;
+ case 2:
+ CONTEXT = 0x00e5;
+ break;
+ case 3:
+ CONTEXT = 0x0195;
+ break;
+ }
+ SLTP = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ LTP = LTP ^ SLTP;
+ }
+ if(LTP == 1) {
+ GBREG->copyLine(h, h - 1);
+ } else {
+ switch(GBTEMPLATE) {
+ case 0: {
+ line1 = GBREG->getPixel(1, h - 2);
+ line1 |= GBREG->getPixel(0, h - 2) << 1;
+ line2 = GBREG->getPixel(2, h - 1);
+ line2 |= GBREG->getPixel(1, h - 1) << 1;
+ line2 |= GBREG->getPixel(0, h - 1) << 2;
+ line3 = 0;
+ for(FX_DWORD w = 0; w < GBW; w++) {
+ if(USESKIP && SKIP->getPixel(w, h)) {
+ bVal = 0;
+ } else {
+ CONTEXT = line3;
+ CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 4;
+ CONTEXT |= line2 << 5;
+ CONTEXT |= GBREG->getPixel(w + GBAT[2], h + GBAT[3]) << 10;
+ CONTEXT |= GBREG->getPixel(w + GBAT[4], h + GBAT[5]) << 11;
+ CONTEXT |= line1 << 12;
+ CONTEXT |= GBREG->getPixel(w + GBAT[6], h + GBAT[7]) << 15;
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ }
+ if(bVal) {
+ GBREG->setPixel(w, h, bVal);
+ }
+ line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 2)) & 0x07;
+ line2 = ((line2 << 1) | GBREG->getPixel(w + 3, h - 1)) & 0x1f;
+ line3 = ((line3 << 1) | bVal) & 0x0f;
+ }
+ }
+ break;
+ case 1: {
+ line1 = GBREG->getPixel(2, h - 2);
+ line1 |= GBREG->getPixel(1, h - 2) << 1;
+ line1 |= GBREG->getPixel(0, h - 2) << 2;
+ line2 = GBREG->getPixel(2, h - 1);
+ line2 |= GBREG->getPixel(1, h - 1) << 1;
+ line2 |= GBREG->getPixel(0, h - 1) << 2;
+ line3 = 0;
+ for(FX_DWORD w = 0; w < GBW; w++) {
+ if(USESKIP && SKIP->getPixel(w, h)) {
+ bVal = 0;
+ } else {
+ CONTEXT = line3;
+ CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 3;
+ CONTEXT |= line2 << 4;
+ CONTEXT |= line1 << 9;
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ }
+ if(bVal) {
+ GBREG->setPixel(w, h, bVal);
+ }
+ line1 = ((line1 << 1) | GBREG->getPixel(w + 3, h - 2)) & 0x0f;
+ line2 = ((line2 << 1) | GBREG->getPixel(w + 3, h - 1)) & 0x1f;
+ line3 = ((line3 << 1) | bVal) & 0x07;
+ }
+ }
+ break;
+ case 2: {
+ line1 = GBREG->getPixel(1, h - 2);
+ line1 |= GBREG->getPixel(0, h - 2) << 1;
+ line2 = GBREG->getPixel(1, h - 1);
+ line2 |= GBREG->getPixel(0, h - 1) << 1;
+ line3 = 0;
+ for(FX_DWORD w = 0; w < GBW; w++) {
+ if(USESKIP && SKIP->getPixel(w, h)) {
+ bVal = 0;
+ } else {
+ CONTEXT = line3;
+ CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 2;
+ CONTEXT |= line2 << 3;
+ CONTEXT |= line1 << 7;
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ }
+ if(bVal) {
+ GBREG->setPixel(w, h, bVal);
+ }
+ line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 2)) & 0x07;
+ line2 = ((line2 << 1) | GBREG->getPixel(w + 2, h - 1)) & 0x0f;
+ line3 = ((line3 << 1) | bVal) & 0x03;
+ }
+ }
+ break;
+ case 3: {
+ line1 = GBREG->getPixel(1, h - 1);
+ line1 |= GBREG->getPixel(0, h - 1) << 1;
+ line2 = 0;
+ for(FX_DWORD w = 0; w < GBW; w++) {
+ if(USESKIP && SKIP->getPixel(w, h)) {
+ bVal = 0;
+ } else {
+ CONTEXT = line2;
+ CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 4;
+ CONTEXT |= line1 << 5;
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ }
+ if(bVal) {
+ GBREG->setPixel(w, h, bVal);
+ }
+ line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 1)) & 0x1f;
+ line2 = ((line2 << 1) | bVal) & 0x0f;
+ }
+ }
+ break;
+ }
+ }
+ }
+ return GBREG;
+}
+CJBig2_Image *CJBig2_GRDProc::decode_Arith_V1(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)
+{
+ FX_BOOL LTP, SLTP, bVal;
+ FX_DWORD CONTEXT = 0;
+ CJBig2_Image *GBREG;
+ LTP = 0;
+ JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
+ GBREG->fill(0);
+ for(FX_DWORD h = 0; h < GBH; h++) {
+ if(TPGDON) {
+ switch(GBTEMPLATE) {
+ case 0:
+ CONTEXT = 0x9b25;
+ break;
+ case 1:
+ CONTEXT = 0x0795;
+ break;
+ case 2:
+ CONTEXT = 0x00e5;
+ break;
+ case 3:
+ CONTEXT = 0x0195;
+ break;
+ }
+ SLTP = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ LTP = LTP ^ SLTP;
+ }
+ if(LTP == 1) {
+ for(FX_DWORD w = 0; w < GBW; w++) {
+ GBREG->setPixel(w, h, GBREG->getPixel(w, h - 1));
+ }
+ } else {
+ for(FX_DWORD w = 0; w < GBW; w++) {
+ if(USESKIP && SKIP->getPixel(w, h)) {
+ GBREG->setPixel(w, h, 0);
+ } else {
+ CONTEXT = 0;
+ switch(GBTEMPLATE) {
+ case 0:
+ CONTEXT |= GBREG->getPixel(w - 1, h);
+ CONTEXT |= GBREG->getPixel(w - 2, h) << 1;
+ CONTEXT |= GBREG->getPixel(w - 3, h) << 2;
+ CONTEXT |= GBREG->getPixel(w - 4, h) << 3;
+ CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 4;
+ CONTEXT |= GBREG->getPixel(w + 2, h - 1) << 5;
+ CONTEXT |= GBREG->getPixel(w + 1, h - 1) << 6;
+ CONTEXT |= GBREG->getPixel(w, h - 1) << 7;
+ CONTEXT |= GBREG->getPixel(w - 1, h - 1) << 8;
+ CONTEXT |= GBREG->getPixel(w - 2, h - 1) << 9;
+ CONTEXT |= GBREG->getPixel(w + GBAT[2], h + GBAT[3]) << 10;
+ CONTEXT |= GBREG->getPixel(w + GBAT[4], h + GBAT[5]) << 11;
+ CONTEXT |= GBREG->getPixel(w + 1, h - 2) << 12;
+ CONTEXT |= GBREG->getPixel(w, h - 2) << 13;
+ CONTEXT |= GBREG->getPixel(w - 1, h - 2) << 14;
+ CONTEXT |= GBREG->getPixel(w + GBAT[6], h + GBAT[7]) << 15;
+ break;
+ case 1:
+ CONTEXT |= GBREG->getPixel(w - 1, h);
+ CONTEXT |= GBREG->getPixel(w - 2, h) << 1;
+ CONTEXT |= GBREG->getPixel(w - 3, h) << 2;
+ CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 3;
+ CONTEXT |= GBREG->getPixel(w + 2, h - 1) << 4;
+ CONTEXT |= GBREG->getPixel(w + 1, h - 1) << 5;
+ CONTEXT |= GBREG->getPixel(w, h - 1) << 6;
+ CONTEXT |= GBREG->getPixel(w - 1, h - 1) << 7;
+ CONTEXT |= GBREG->getPixel(w - 2, h - 1) << 8;
+ CONTEXT |= GBREG->getPixel(w + 2, h - 2) << 9;
+ CONTEXT |= GBREG->getPixel(w + 1, h - 2) << 10;
+ CONTEXT |= GBREG->getPixel(w, h - 2) << 11;
+ CONTEXT |= GBREG->getPixel(w - 1, h - 2) << 12;
+ break;
+ case 2:
+ CONTEXT |= GBREG->getPixel(w - 1, h);
+ CONTEXT |= GBREG->getPixel(w - 2, h) << 1;
+ CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 2;
+ CONTEXT |= GBREG->getPixel(w + 1, h - 1) << 3;
+ CONTEXT |= GBREG->getPixel(w, h - 1) << 4;
+ CONTEXT |= GBREG->getPixel(w - 1, h - 1) << 5;
+ CONTEXT |= GBREG->getPixel(w - 2, h - 1) << 6;
+ CONTEXT |= GBREG->getPixel(w + 1, h - 2) << 7;
+ CONTEXT |= GBREG->getPixel(w, h - 2) << 8;
+ CONTEXT |= GBREG->getPixel(w - 1, h - 2) << 9;
+ break;
+ case 3:
+ CONTEXT |= GBREG->getPixel(w - 1, h);
+ CONTEXT |= GBREG->getPixel(w - 2, h) << 1;
+ CONTEXT |= GBREG->getPixel(w - 3, h) << 2;
+ CONTEXT |= GBREG->getPixel(w - 4, h) << 3;
+ CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 4;
+ CONTEXT |= GBREG->getPixel(w + 1, h - 1) << 5;
+ CONTEXT |= GBREG->getPixel(w, h - 1) << 6;
+ CONTEXT |= GBREG->getPixel(w - 1, h - 1) << 7;
+ CONTEXT |= GBREG->getPixel(w - 2, h - 1) << 8;
+ CONTEXT |= GBREG->getPixel(w - 3, h - 1) << 9;
+ break;
+ }
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ GBREG->setPixel(w, h, bVal);
+ }
+ }
+ }
+ }
+ return GBREG;
+}
+CJBig2_Image *CJBig2_GRDProc::decode_MMR(CJBig2_BitStream *pStream)
+{
+ int bitpos, i;
+ CJBig2_Image *pImage;
+ JBIG2_ALLOC(pImage, CJBig2_Image(GBW, GBH));
+ if (pImage->m_pData == NULL) {
+ delete pImage;
+ m_pModule->JBig2_Error("Generic region decoding procedure: Create Image Failed with width = %d, height = %d\n", GBW, GBH);
+ return NULL;
+ }
+ bitpos = (int)pStream->getBitPos();
+ _FaxG4Decode(m_pModule, pStream->getBuf(), pStream->getLength(), &bitpos, pImage->m_pData, GBW, GBH, pImage->m_nStride);
+ pStream->setBitPos(bitpos);
+ for(i = 0; (FX_DWORD)i < pImage->m_nStride * GBH; i++) {
+ pImage->m_pData[i] = ~pImage->m_pData[i];
+ }
+ return pImage;
+}
+CJBig2_Image *CJBig2_GRRDProc::decode(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext)
+{
+ if (GRW == 0 || GRH == 0) {
+ CJBig2_Image* pImage;
+ JBIG2_ALLOC(pImage, CJBig2_Image(GRW, GRH));
+ return pImage;
+ }
+ if(GRTEMPLATE == 0) {
+ if((GRAT[0] == (signed char) - 1) && (GRAT[1] == (signed char) - 1)
+ && (GRAT[2] == (signed char) - 1) && (GRAT[3] == (signed char) - 1)
+ && (GRREFERENCEDX == 0) && (GRW == (FX_DWORD)GRREFERENCE->m_nWidth)) {
+ return decode_Template0_opt(pArithDecoder, grContext);
+ } else {
+ return decode_Template0_unopt(pArithDecoder, grContext);
+ }
+ } else {
+ if((GRREFERENCEDX == 0) && (GRW == (FX_DWORD)GRREFERENCE->m_nWidth)) {
+ return decode_Template1_opt(pArithDecoder, grContext);
+ } else {
+ return decode_Template1_unopt(pArithDecoder, grContext);
+ }
+ }
+}
+CJBig2_Image *CJBig2_GRRDProc::decode_Template0_unopt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext)
+{
+ FX_BOOL LTP, SLTP, bVal;
+ FX_DWORD CONTEXT;
+ CJBig2_Image *GRREG;
+ FX_DWORD line1, line2, line3, line4, line5;
+ LTP = 0;
+ JBIG2_ALLOC(GRREG, CJBig2_Image(GRW, GRH));
+ GRREG->fill(0);
+ for(FX_DWORD h = 0; h < GRH; h++) {
+ if(TPGRON) {
+ SLTP = pArithDecoder->DECODE(&grContext[0x0010]);
+ LTP = LTP ^ SLTP;
+ }
+ if(LTP == 0) {
+ line1 = GRREG->getPixel(1, h - 1);
+ line1 |= GRREG->getPixel(0, h - 1) << 1;
+ line2 = 0;
+ line3 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY - 1);
+ line3 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY - 1) << 1;
+ line4 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY);
+ line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY) << 1;
+ line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX - 1, h - GRREFERENCEDY) << 2;
+ line5 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY + 1);
+ line5 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY + 1) << 1;
+ line5 |= GRREFERENCE->getPixel(-GRREFERENCEDX - 1, h - GRREFERENCEDY + 1) << 2;
+ for(FX_DWORD w = 0; w < GRW; w++) {
+ CONTEXT = line5;
+ CONTEXT |= line4 << 3;
+ CONTEXT |= line3 << 6;
+ CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + GRAT[2], h - GRREFERENCEDY + GRAT[3]) << 8;
+ CONTEXT |= line2 << 9;
+ CONTEXT |= line1 << 10;
+ CONTEXT |= GRREG->getPixel(w + GRAT[0], h + GRAT[1]) << 12;
+ bVal = pArithDecoder->DECODE(&grContext[CONTEXT]);
+ GRREG->setPixel(w, h, bVal);
+ line1 = ((line1 << 1) | GRREG->getPixel(w + 2, h - 1)) & 0x03;
+ line2 = ((line2 << 1) | bVal) & 0x01;
+ line3 = ((line3 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY - 1)) & 0x03;
+ line4 = ((line4 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY)) & 0x07;
+ line5 = ((line5 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY + 1)) & 0x07;
+ }
+ } else {
+ line1 = GRREG->getPixel(1, h - 1);
+ line1 |= GRREG->getPixel(0, h - 1) << 1;
+ line2 = 0;
+ line3 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY - 1);
+ line3 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY - 1) << 1;
+ line4 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY);
+ line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY) << 1;
+ line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX - 1, h - GRREFERENCEDY) << 2;
+ line5 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY + 1);
+ line5 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY + 1) << 1;
+ line5 |= GRREFERENCE->getPixel(-GRREFERENCEDX - 1, h - GRREFERENCEDY + 1) << 2;
+ for(FX_DWORD w = 0; w < GRW; w++) {
+ bVal = GRREFERENCE->getPixel(w, h);
+ if(!(TPGRON && (bVal == GRREFERENCE->getPixel(w - 1, h - 1))
+ && (bVal == GRREFERENCE->getPixel(w, h - 1))
+ && (bVal == GRREFERENCE->getPixel(w + 1, h - 1))
+ && (bVal == GRREFERENCE->getPixel(w - 1, h))
+ && (bVal == GRREFERENCE->getPixel(w + 1, h))
+ && (bVal == GRREFERENCE->getPixel(w - 1, h + 1))
+ && (bVal == GRREFERENCE->getPixel(w, h + 1))
+ && (bVal == GRREFERENCE->getPixel(w + 1, h + 1)))) {
+ CONTEXT = line5;
+ CONTEXT |= line4 << 3;
+ CONTEXT |= line3 << 6;
+ CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + GRAT[2], h - GRREFERENCEDY + GRAT[3]) << 8;
+ CONTEXT |= line2 << 9;
+ CONTEXT |= line1 << 10;
+ CONTEXT |= GRREG->getPixel(w + GRAT[0], h + GRAT[1]) << 12;
+ bVal = pArithDecoder->DECODE(&grContext[CONTEXT]);
+ }
+ GRREG->setPixel(w, h, bVal);
+ line1 = ((line1 << 1) | GRREG->getPixel(w + 2, h - 1)) & 0x03;
+ line2 = ((line2 << 1) | bVal) & 0x01;
+ line3 = ((line3 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY - 1)) & 0x03;
+ line4 = ((line4 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY)) & 0x07;
+ line5 = ((line5 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY + 1)) & 0x07;
+ }
+ }
+ }
+ return GRREG;
+}
+CJBig2_Image *CJBig2_GRRDProc::decode_Template0_opt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext)
+{
+ FX_BOOL LTP, SLTP, bVal;
+ FX_DWORD CONTEXT;
+ CJBig2_Image *GRREG;
+ FX_DWORD line1, line1_r, line2_r, line3_r;
+ FX_BYTE *pLine, *pLineR, cVal;
+ FX_INTPTR nStride, nStrideR, nOffset;
+ FX_INT32 k, nBits;
+ FX_INT32 GRWR, GRHR;
+ FX_INT32 GRW, GRH;
+ GRW = (FX_INT32)CJBig2_GRRDProc::GRW;
+ GRH = (FX_INT32)CJBig2_GRRDProc::GRH;
+ LTP = 0;
+ JBIG2_ALLOC(GRREG, CJBig2_Image(GRW, GRH));
+ if (GRREG->m_pData == NULL) {
+ delete GRREG;
+ m_pModule->JBig2_Error("Generic refinement region decoding procedure: Create Image Failed with width = %d, height = %d\n", GRW, GRH);
+ return NULL;
+ }
+ pLine = GRREG->m_pData;
+ pLineR = GRREFERENCE->m_pData;
+ nStride = GRREG->m_nStride;
+ nStrideR = GRREFERENCE->m_nStride;
+ GRWR = (FX_INT32)GRREFERENCE->m_nWidth;
+ GRHR = (FX_INT32)GRREFERENCE->m_nHeight;
+ if (GRREFERENCEDY < -GRHR + 1 || GRREFERENCEDY > GRHR - 1) {
+ GRREFERENCEDY = 0;
+ }
+ nOffset = -GRREFERENCEDY * nStrideR;
+ for (FX_INT32 h = 0; h < GRH; h++) {
+ if(TPGRON) {
+ SLTP = pArithDecoder->DECODE(&grContext[0x0010]);
+ LTP = LTP ^ SLTP;
+ }
+ line1 = (h > 0) ? pLine[-nStride] << 4 : 0;
+ FX_INT32 reference_h = h - GRREFERENCEDY;
+ FX_BOOL line1_r_ok = (reference_h > 0 && reference_h < GRHR + 1);
+ FX_BOOL line2_r_ok = (reference_h > -1 && reference_h < GRHR);
+ FX_BOOL line3_r_ok = (reference_h > -2 && reference_h < GRHR - 1);
+ line1_r = line1_r_ok ? pLineR[nOffset - nStrideR] : 0;
+ line2_r = line2_r_ok ? pLineR[nOffset] : 0;
+ line3_r = line3_r_ok ? pLineR[nOffset + nStrideR] : 0;
+ if(LTP == 0) {
+ CONTEXT = (line1 & 0x1c00) | (line1_r & 0x01c0)
+ | ((line2_r >> 3) & 0x0038) | ((line3_r >> 6) & 0x0007);
+ for (FX_INT32 w = 0; w < GRW; w += 8) {
+ nBits = GRW - w > 8 ? 8 : GRW - w;
+ if (h > 0)
+ line1 = (line1 << 8) |
+ (w + 8 < GRW ? pLine[-nStride + (w >> 3) + 1] << 4 : 0);
+ if (h > GRHR + GRREFERENCEDY + 1) {
+ line1_r = 0;
+ line2_r = 0;
+ line3_r = 0;
+ } else {
+ if(line1_r_ok)
+ line1_r = (line1_r << 8) |
+ (w + 8 < GRWR ? pLineR[nOffset - nStrideR + (w >> 3) + 1] : 0);
+ if(line2_r_ok)
+ line2_r = (line2_r << 8) |
+ (w + 8 < GRWR ? pLineR[nOffset + (w >> 3) + 1] : 0);
+ if(line3_r_ok)
+ line3_r = (line3_r << 8) |
+ (w + 8 < GRWR ? pLineR[nOffset + nStrideR + (w >> 3) + 1] : 0);
+ else {
+ line3_r = 0;
+ }
+ }
+ cVal = 0;
+ for (k = 0; k < nBits; k++) {
+ bVal = pArithDecoder->DECODE(&grContext[CONTEXT]);
+ cVal |= bVal << (7 - k);
+ CONTEXT = ((CONTEXT & 0x0cdb) << 1) | (bVal << 9) |
+ ((line1 >> (7 - k)) & 0x0400) |
+ ((line1_r >> (7 - k)) & 0x0040) |
+ ((line2_r >> (10 - k)) & 0x0008) |
+ ((line3_r >> (13 - k)) & 0x0001);
+ }
+ pLine[w >> 3] = cVal;
+ }
+ } else {
+ CONTEXT = (line1 & 0x1c00) | (line1_r & 0x01c0)
+ | ((line2_r >> 3) & 0x0038) | ((line3_r >> 6) & 0x0007);
+ for (FX_INT32 w = 0; w < GRW; w += 8) {
+ nBits = GRW - w > 8 ? 8 : GRW - w;
+ if (h > 0)
+ line1 = (line1 << 8) |
+ (w + 8 < GRW ? pLine[-nStride + (w >> 3) + 1] << 4 : 0);
+ if(line1_r_ok)
+ line1_r = (line1_r << 8) |
+ (w + 8 < GRWR ? pLineR[nOffset - nStrideR + (w >> 3) + 1] : 0);
+ if(line2_r_ok)
+ line2_r = (line2_r << 8) |
+ (w + 8 < GRWR ? pLineR[nOffset + (w >> 3) + 1] : 0);
+ if(line3_r_ok)
+ line3_r = (line3_r << 8) |
+ (w + 8 < GRWR ? pLineR[nOffset + nStrideR + (w >> 3) + 1] : 0);
+ else {
+ line3_r = 0;
+ }
+ cVal = 0;
+ for (k = 0; k < nBits; k++) {
+ bVal = GRREFERENCE->getPixel(w + k, h);
+ if(!(TPGRON && (bVal == GRREFERENCE->getPixel(w + k - 1, h - 1))
+ && (bVal == GRREFERENCE->getPixel(w + k, h - 1))
+ && (bVal == GRREFERENCE->getPixel(w + k + 1, h - 1))
+ && (bVal == GRREFERENCE->getPixel(w + k - 1, h))
+ && (bVal == GRREFERENCE->getPixel(w + k + 1, h))
+ && (bVal == GRREFERENCE->getPixel(w + k - 1, h + 1))
+ && (bVal == GRREFERENCE->getPixel(w + k, h + 1))
+ && (bVal == GRREFERENCE->getPixel(w + k + 1, h + 1)))) {
+ bVal = pArithDecoder->DECODE(&grContext[CONTEXT]);
+ }
+ cVal |= bVal << (7 - k);
+ CONTEXT = ((CONTEXT & 0x0cdb) << 1) | (bVal << 9) |
+ ((line1 >> (7 - k)) & 0x0400) |
+ ((line1_r >> (7 - k)) & 0x0040) |
+ ((line2_r >> (10 - k)) & 0x0008) |
+ ((line3_r >> (13 - k)) & 0x0001);
+ }
+ pLine[w >> 3] = cVal;
+ }
+ }
+ pLine += nStride;
+ if (h < GRHR + GRREFERENCEDY) {
+ pLineR += nStrideR;
+ }
+ }
+ return GRREG;
+}
+CJBig2_Image *CJBig2_GRRDProc::decode_Template1_unopt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext)
+{
+ FX_BOOL LTP, SLTP, bVal;
+ FX_DWORD CONTEXT;
+ CJBig2_Image *GRREG;
+ FX_DWORD line1, line2, line3, line4, line5;
+ LTP = 0;
+ JBIG2_ALLOC(GRREG, CJBig2_Image(GRW, GRH));
+ GRREG->fill(0);
+ for(FX_DWORD h = 0; h < GRH; h++) {
+ if(TPGRON) {
+ SLTP = pArithDecoder->DECODE(&grContext[0x0008]);
+ LTP = LTP ^ SLTP;
+ }
+ if(LTP == 0) {
+ line1 = GRREG->getPixel(1, h - 1);
+ line1 |= GRREG->getPixel(0, h - 1) << 1;
+ line1 |= GRREG->getPixel(-1, h - 1) << 2;
+ line2 = 0;
+ line3 = GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY - 1);
+ line4 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY);
+ line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY) << 1;
+ line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX - 1, h - GRREFERENCEDY) << 2;
+ line5 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY + 1);
+ line5 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY + 1) << 1;
+ for(FX_DWORD w = 0; w < GRW; w++) {
+ CONTEXT = line5;
+ CONTEXT |= line4 << 2;
+ CONTEXT |= line3 << 5;
+ CONTEXT |= line2 << 6;
+ CONTEXT |= line1 << 7;
+ bVal = pArithDecoder->DECODE(&grContext[CONTEXT]);
+ GRREG->setPixel(w, h, bVal);
+ line1 = ((line1 << 1) | GRREG->getPixel(w + 2, h - 1)) & 0x07;
+ line2 = ((line2 << 1) | bVal) & 0x01;
+ line3 = ((line3 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY - 1)) & 0x01;
+ line4 = ((line4 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY)) & 0x07;
+ line5 = ((line5 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY + 1)) & 0x03;
+ }
+ } else {
+ line1 = GRREG->getPixel(1, h - 1);
+ line1 |= GRREG->getPixel(0, h - 1) << 1;
+ line1 |= GRREG->getPixel(-1, h - 1) << 2;
+ line2 = 0;
+ line3 = GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY - 1);
+ line4 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY);
+ line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY) << 1;
+ line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX - 1, h - GRREFERENCEDY) << 2;
+ line5 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY + 1);
+ line5 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY + 1) << 1;
+ for(FX_DWORD w = 0; w < GRW; w++) {
+ bVal = GRREFERENCE->getPixel(w, h);
+ if(!(TPGRON && (bVal == GRREFERENCE->getPixel(w - 1, h - 1))
+ && (bVal == GRREFERENCE->getPixel(w, h - 1))
+ && (bVal == GRREFERENCE->getPixel(w + 1, h - 1))
+ && (bVal == GRREFERENCE->getPixel(w - 1, h))
+ && (bVal == GRREFERENCE->getPixel(w + 1, h))
+ && (bVal == GRREFERENCE->getPixel(w - 1, h + 1))
+ && (bVal == GRREFERENCE->getPixel(w, h + 1))
+ && (bVal == GRREFERENCE->getPixel(w + 1, h + 1)))) {
+ CONTEXT = line5;
+ CONTEXT |= line4 << 2;
+ CONTEXT |= line3 << 5;
+ CONTEXT |= line2 << 6;
+ CONTEXT |= line1 << 7;
+ bVal = pArithDecoder->DECODE(&grContext[CONTEXT]);
+ }
+ GRREG->setPixel(w, h, bVal);
+ line1 = ((line1 << 1) | GRREG->getPixel(w + 2, h - 1)) & 0x07;
+ line2 = ((line2 << 1) | bVal) & 0x01;
+ line3 = ((line3 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY - 1)) & 0x01;
+ line4 = ((line4 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY)) & 0x07;
+ line5 = ((line5 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY + 1)) & 0x03;
+ }
+ }
+ }
+ return GRREG;
+}
+CJBig2_Image *CJBig2_GRRDProc::decode_Template1_opt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext)
+{
+ FX_BOOL LTP, SLTP, bVal;
+ FX_DWORD CONTEXT;
+ CJBig2_Image *GRREG;
+ FX_DWORD line1, line1_r, line2_r, line3_r;
+ FX_BYTE *pLine, *pLineR, cVal;
+ FX_INTPTR nStride, nStrideR, nOffset;
+ FX_INT32 k, nBits;
+ FX_INT32 GRWR, GRHR;
+ FX_INT32 GRW, GRH;
+ GRW = (FX_INT32)CJBig2_GRRDProc::GRW;
+ GRH = (FX_INT32)CJBig2_GRRDProc::GRH;
+ LTP = 0;
+ JBIG2_ALLOC(GRREG, CJBig2_Image(GRW, GRH));
+ if (GRREG->m_pData == NULL) {
+ delete GRREG;
+ m_pModule->JBig2_Error("Generic refinement region decoding procedure: Create Image Failed with width = %d, height = %d\n", GRW, GRH);
+ return NULL;
+ }
+ pLine = GRREG->m_pData;
+ pLineR = GRREFERENCE->m_pData;
+ nStride = GRREG->m_nStride;
+ nStrideR = GRREFERENCE->m_nStride;
+ GRWR = (FX_INT32)GRREFERENCE->m_nWidth;
+ GRHR = (FX_INT32)GRREFERENCE->m_nHeight;
+ if (GRREFERENCEDY < -GRHR + 1 || GRREFERENCEDY > GRHR - 1) {
+ GRREFERENCEDY = 0;
+ }
+ nOffset = -GRREFERENCEDY * nStrideR;
+ for (FX_INT32 h = 0; h < GRH; h++) {
+ if(TPGRON) {
+ SLTP = pArithDecoder->DECODE(&grContext[0x0008]);
+ LTP = LTP ^ SLTP;
+ }
+ line1 = (h > 0) ? pLine[-nStride] << 1 : 0;
+ FX_INT32 reference_h = h - GRREFERENCEDY;
+ FX_BOOL line1_r_ok = (reference_h > 0 && reference_h < GRHR + 1);
+ FX_BOOL line2_r_ok = (reference_h > -1 && reference_h < GRHR);
+ FX_BOOL line3_r_ok = (reference_h > -2 && reference_h < GRHR - 1);
+ line1_r = line1_r_ok ? pLineR[nOffset - nStrideR] : 0;
+ line2_r = line2_r_ok ? pLineR[nOffset] : 0;
+ line3_r = line3_r_ok ? pLineR[nOffset + nStrideR] : 0;
+ if(LTP == 0) {
+ CONTEXT = (line1 & 0x0380) | ((line1_r >> 2) & 0x0020)
+ | ((line2_r >> 4) & 0x001c) | ((line3_r >> 6) & 0x0003);
+ for (FX_INT32 w = 0; w < GRW; w += 8) {
+ nBits = GRW - w > 8 ? 8 : GRW - w;
+ if (h > 0)
+ line1 = (line1 << 8) |
+ (w + 8 < GRW ? pLine[-nStride + (w >> 3) + 1] << 1 : 0);
+ if(line1_r_ok)
+ line1_r = (line1_r << 8) |
+ (w + 8 < GRWR ? pLineR[nOffset - nStrideR + (w >> 3) + 1] : 0);
+ if(line2_r_ok)
+ line2_r = (line2_r << 8) |
+ (w + 8 < GRWR ? pLineR[nOffset + (w >> 3) + 1] : 0);
+ if(line3_r_ok)
+ line3_r = (line3_r << 8) |
+ (w + 8 < GRWR ? pLineR[nOffset + nStrideR + (w >> 3) + 1] : 0);
+ else {
+ line3_r = 0;
+ }
+ cVal = 0;
+ for (k = 0; k < nBits; k++) {
+ bVal = pArithDecoder->DECODE(&grContext[CONTEXT]);
+ cVal |= bVal << (7 - k);
+ CONTEXT = ((CONTEXT & 0x018d) << 1) | (bVal << 6) |
+ ((line1 >> (7 - k)) & 0x0080) |
+ ((line1_r >> (9 - k)) & 0x0020) |
+ ((line2_r >> (11 - k)) & 0x0004) |
+ ((line3_r >> (13 - k)) & 0x0001);
+ }
+ pLine[w >> 3] = cVal;
+ }
+ } else {
+ CONTEXT = (line1 & 0x0380) | ((line1_r >> 2) & 0x0020)
+ | ((line2_r >> 4) & 0x001c) | ((line3_r >> 6) & 0x0003);
+ for (FX_INT32 w = 0; w < GRW; w += 8) {
+ nBits = GRW - w > 8 ? 8 : GRW - w;
+ if (h > 0)
+ line1 = (line1 << 8) |
+ (w + 8 < GRW ? pLine[-nStride + (w >> 3) + 1] << 1 : 0);
+ if(line1_r_ok)
+ line1_r = (line1_r << 8) |
+ (w + 8 < GRWR ? pLineR[nOffset - nStrideR + (w >> 3) + 1] : 0);
+ if(line2_r_ok)
+ line2_r = (line2_r << 8) |
+ (w + 8 < GRWR ? pLineR[nOffset + (w >> 3) + 1] : 0);
+ if(line3_r_ok)
+ line3_r = (line3_r << 8) |
+ (w + 8 < GRWR ? pLineR[nOffset + nStrideR + (w >> 3) + 1] : 0);
+ else {
+ line3_r = 0;
+ }
+ cVal = 0;
+ for (k = 0; k < nBits; k++) {
+ bVal = GRREFERENCE->getPixel(w + k, h);
+ if(!(TPGRON && (bVal == GRREFERENCE->getPixel(w + k - 1, h - 1))
+ && (bVal == GRREFERENCE->getPixel(w + k, h - 1))
+ && (bVal == GRREFERENCE->getPixel(w + k + 1, h - 1))
+ && (bVal == GRREFERENCE->getPixel(w + k - 1, h))
+ && (bVal == GRREFERENCE->getPixel(w + k + 1, h))
+ && (bVal == GRREFERENCE->getPixel(w + k - 1, h + 1))
+ && (bVal == GRREFERENCE->getPixel(w + k, h + 1))
+ && (bVal == GRREFERENCE->getPixel(w + k + 1, h + 1)))) {
+ bVal = pArithDecoder->DECODE(&grContext[CONTEXT]);
+ }
+ cVal |= bVal << (7 - k);
+ CONTEXT = ((CONTEXT & 0x018d) << 1) | (bVal << 6) |
+ ((line1 >> (7 - k)) & 0x0080) |
+ ((line1_r >> (9 - k)) & 0x0020) |
+ ((line2_r >> (11 - k)) & 0x0004) |
+ ((line3_r >> (13 - k)) & 0x0001);
+ }
+ pLine[w >> 3] = cVal;
+ }
+ }
+ pLine += nStride;
+ if (h < GRHR + GRREFERENCEDY) {
+ pLineR += nStrideR;
+ }
+ }
+ return GRREG;
+}
+CJBig2_Image *CJBig2_GRRDProc::decode_V1(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext)
+{
+ FX_BOOL LTP, SLTP, bVal;
+ FX_BOOL TPGRPIX, TPGRVAL;
+ FX_DWORD CONTEXT;
+ CJBig2_Image *GRREG;
+ LTP = 0;
+ JBIG2_ALLOC(GRREG, CJBig2_Image(GRW, GRH));
+ GRREG->fill(0);
+ for(FX_DWORD h = 0; h < GRH; h++) {
+ if(TPGRON) {
+ switch(GRTEMPLATE) {
+ case 0:
+ CONTEXT = 0x0010;
+ break;
+ case 1:
+ CONTEXT = 0x0008;
+ break;
+ }
+ SLTP = pArithDecoder->DECODE(&grContext[CONTEXT]);
+ LTP = LTP ^ SLTP;
+ }
+ if(LTP == 0) {
+ for(FX_DWORD w = 0; w < GRW; w++) {
+ CONTEXT = 0;
+ switch(GRTEMPLATE) {
+ case 0:
+ CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY + 1);
+ CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY + 1) << 1;
+ CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX - 1, h - GRREFERENCEDY + 1) << 2;
+ CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY) << 3;
+ CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY) << 4;
+ CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX - 1, h - GRREFERENCEDY) << 5;
+ CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY - 1) << 6;
+ CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY - 1) << 7;
+ CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + GRAT[2], h - GRREFERENCEDY + GRAT[3]) << 8;
+ CONTEXT |= GRREG->getPixel(w - 1, h) << 9;
+ CONTEXT |= GRREG->getPixel(w + 1, h - 1) << 10;
+ CONTEXT |= GRREG->getPixel(w, h - 1) << 11;
+ CONTEXT |= GRREG->getPixel(w + GRAT[0], h + GRAT[1]) << 12;
+ break;
+ case 1:
+ CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY + 1);
+ CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY + 1) << 1;
+ CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY) << 2;
+ CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY) << 3;
+ CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX - 1, h - GRREFERENCEDY) << 4;
+ CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY - 1) << 5;
+ CONTEXT |= GRREG->getPixel(w - 1, h) << 6;
+ CONTEXT |= GRREG->getPixel(w + 1, h - 1) << 7;
+ CONTEXT |= GRREG->getPixel(w, h - 1) << 8;
+ CONTEXT |= GRREG->getPixel(w - 1, h - 1) << 9;
+ break;
+ }
+ bVal = pArithDecoder->DECODE(&grContext[CONTEXT]);
+ GRREG->setPixel(w, h, bVal);
+ }
+ } else {
+ for(FX_DWORD w = 0; w < GRW; w++) {
+ bVal = GRREFERENCE->getPixel(w, h);
+ if(TPGRON && (bVal == GRREFERENCE->getPixel(w - 1, h - 1))
+ && (bVal == GRREFERENCE->getPixel(w, h - 1))
+ && (bVal == GRREFERENCE->getPixel(w + 1, h - 1))
+ && (bVal == GRREFERENCE->getPixel(w - 1, h))
+ && (bVal == GRREFERENCE->getPixel(w + 1, h))
+ && (bVal == GRREFERENCE->getPixel(w - 1, h + 1))
+ && (bVal == GRREFERENCE->getPixel(w, h + 1))
+ && (bVal == GRREFERENCE->getPixel(w + 1, h + 1))) {
+ TPGRPIX = 1;
+ TPGRVAL = bVal;
+ } else {
+ TPGRPIX = 0;
+ }
+ if(TPGRPIX) {
+ GRREG->setPixel(w, h, TPGRVAL);
+ } else {
+ CONTEXT = 0;
+ switch(GRTEMPLATE) {
+ case 0:
+ CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY + 1);
+ CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY + 1) << 1;
+ CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX - 1, h - GRREFERENCEDY + 1) << 2;
+ CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY) << 3;
+ CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY) << 4;
+ CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX - 1, h - GRREFERENCEDY) << 5;
+ CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY - 1) << 6;
+ CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY - 1) << 7;
+ CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + GRAT[2], h - GRREFERENCEDY + GRAT[3]) << 8;
+ CONTEXT |= GRREG->getPixel(w - 1, h) << 9;
+ CONTEXT |= GRREG->getPixel(w + 1, h - 1) << 10;
+ CONTEXT |= GRREG->getPixel(w, h - 1) << 11;
+ CONTEXT |= GRREG->getPixel(w + GRAT[0], h + GRAT[1]) << 12;
+ break;
+ case 1:
+ CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY + 1);
+ CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY + 1) << 1;
+ CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY) << 2;
+ CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY) << 3;
+ CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX - 1, h - GRREFERENCEDY) << 4;
+ CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY - 1) << 5;
+ CONTEXT |= GRREG->getPixel(w - 1, h) << 6;
+ CONTEXT |= GRREG->getPixel(w + 1, h - 1) << 7;
+ CONTEXT |= GRREG->getPixel(w, h - 1) << 8;
+ CONTEXT |= GRREG->getPixel(w - 1, h - 1) << 9;
+ break;
+ }
+ bVal = pArithDecoder->DECODE(&grContext[CONTEXT]);
+ GRREG->setPixel(w, h, bVal);
+ }
+ }
+ }
+ }
+ return GRREG;
+}
+CJBig2_Image *CJBig2_TRDProc::decode_Huffman(CJBig2_BitStream *pStream, JBig2ArithCtx *grContext)
+{
+ FX_INT32 STRIPT, FIRSTS;
+ FX_DWORD NINSTANCES;
+ FX_INT32 DT, DFS, CURS;
+ FX_BYTE CURT;
+ FX_INT32 SI, TI;
+ FX_DWORD IDI;
+ CJBig2_Image *IBI;
+ FX_DWORD WI, HI;
+ FX_INT32 IDS;
+ FX_BOOL RI;
+ FX_INT32 RDWI, RDHI, RDXI, RDYI;
+ CJBig2_Image *IBOI;
+ FX_DWORD WOI, HOI;
+ CJBig2_Image *SBREG;
+ FX_BOOL bFirst;
+ FX_DWORD nTmp;
+ FX_INT32 nVal, nBits;
+ CJBig2_HuffmanDecoder *pHuffmanDecoder;
+ CJBig2_GRRDProc *pGRRD;
+ CJBig2_ArithDecoder *pArithDecoder;
+ JBIG2_ALLOC(pHuffmanDecoder, CJBig2_HuffmanDecoder(pStream));
+ JBIG2_ALLOC(SBREG, CJBig2_Image(SBW, SBH));
+ SBREG->fill(SBDEFPIXEL);
+ if(pHuffmanDecoder->decodeAValue(SBHUFFDT, &STRIPT) != 0) {
+ m_pModule->JBig2_Error("text region decoding procedure (huffman): too short.");
+ goto failed;
+ }
+ STRIPT *= SBSTRIPS;
+ STRIPT = -STRIPT;
+ FIRSTS = 0;
+ NINSTANCES = 0;
+ while(NINSTANCES < SBNUMINSTANCES) {
+ if(pHuffmanDecoder->decodeAValue(SBHUFFDT, &DT) != 0) {
+ m_pModule->JBig2_Error("text region decoding procedure (huffman): too short.");
+ goto failed;
+ }
+ DT *= SBSTRIPS;
+ STRIPT = STRIPT + DT;
+ bFirst = TRUE;
+ for(;;) {
+ if(bFirst) {
+ if(pHuffmanDecoder->decodeAValue(SBHUFFFS, &DFS) != 0) {
+ m_pModule->JBig2_Error("text region decoding procedure (huffman): too short.");
+ goto failed;
+ }
+ FIRSTS = FIRSTS + DFS;
+ CURS = FIRSTS;
+ bFirst = FALSE;
+ } else {
+ nVal = pHuffmanDecoder->decodeAValue(SBHUFFDS, &IDS);
+ if(nVal == JBIG2_OOB) {
+ break;
+ } else if(nVal != 0) {
+ m_pModule->JBig2_Error("text region decoding procedure (huffman): too short.");
+ goto failed;
+ } else {
+ CURS = CURS + IDS + SBDSOFFSET;
+ }
+ }
+ if(SBSTRIPS == 1) {
+ CURT = 0;
+ } else {
+ nTmp = 1;
+ while((FX_DWORD)(1 << nTmp) < SBSTRIPS) {
+ nTmp ++;
+ }
+ if(pStream->readNBits(nTmp, &nVal) != 0) {
+ m_pModule->JBig2_Error("text region decoding procedure (huffman): too short.");
+ goto failed;
+ }
+ CURT = nVal;
+ }
+ TI = STRIPT + CURT;
+ nVal = 0;
+ nBits = 0;
+ for(;;) {
+ if(pStream->read1Bit(&nTmp) != 0) {
+ m_pModule->JBig2_Error("text region decoding procedure (huffman): too short.");
+ goto failed;
+ }
+ nVal = (nVal << 1) | nTmp;
+ nBits ++;
+ for(IDI = 0; IDI < SBNUMSYMS; IDI++) {
+ if((nBits == SBSYMCODES[IDI].codelen) && (nVal == SBSYMCODES[IDI].code)) {
+ break;
+ }
+ }
+ if(IDI < SBNUMSYMS) {
+ break;
+ }
+ }
+ if(SBREFINE == 0) {
+ RI = 0;
+ } else {
+ if(pStream->read1Bit(&RI) != 0) {
+ m_pModule->JBig2_Error("text region decoding procedure (huffman): too short.");
+ goto failed;
+ }
+ }
+ if(RI == 0) {
+ IBI = SBSYMS[IDI];
+ } else {
+ if((pHuffmanDecoder->decodeAValue(SBHUFFRDW, &RDWI) != 0)
+ || (pHuffmanDecoder->decodeAValue(SBHUFFRDH, &RDHI) != 0)
+ || (pHuffmanDecoder->decodeAValue(SBHUFFRDX, &RDXI) != 0)
+ || (pHuffmanDecoder->decodeAValue(SBHUFFRDY, &RDYI) != 0)
+ || (pHuffmanDecoder->decodeAValue(SBHUFFRSIZE, &nVal) != 0)) {
+ m_pModule->JBig2_Error("text region decoding procedure (huffman): too short.");
+ goto failed;
+ }
+ pStream->alignByte();
+ nTmp = pStream->getOffset();
+ IBOI = SBSYMS[IDI];
+ if (!IBOI) {
+ goto failed;
+ }
+ WOI = IBOI->m_nWidth;
+ HOI = IBOI->m_nHeight;
+ if ((int)(WOI + RDWI) < 0 || (int)(HOI + RDHI) < 0) {
+ m_pModule->JBig2_Error("text region decoding procedure (huffman): Invalid RDWI or RDHI value.");
+ goto failed;
+ }
+ JBIG2_ALLOC(pGRRD, CJBig2_GRRDProc());
+ pGRRD->GRW = WOI + RDWI;
+ pGRRD->GRH = HOI + RDHI;
+ pGRRD->GRTEMPLATE = SBRTEMPLATE;
+ pGRRD->GRREFERENCE = IBOI;
+ pGRRD->GRREFERENCEDX = (RDWI >> 2) + RDXI;
+ pGRRD->GRREFERENCEDY = (RDHI >> 2) + RDYI;
+ pGRRD->TPGRON = 0;
+ pGRRD->GRAT[0] = SBRAT[0];
+ pGRRD->GRAT[1] = SBRAT[1];
+ pGRRD->GRAT[2] = SBRAT[2];
+ pGRRD->GRAT[3] = SBRAT[3];
+ JBIG2_ALLOC(pArithDecoder, CJBig2_ArithDecoder(pStream));
+ IBI = pGRRD->decode(pArithDecoder, grContext);
+ if(IBI == NULL) {
+ delete pGRRD;
+ delete pArithDecoder;
+ goto failed;
+ }
+ delete pArithDecoder;
+ pStream->alignByte();
+ pStream->offset(2);
+ if((FX_DWORD)nVal != (pStream->getOffset() - nTmp)) {
+ delete IBI;
+ delete pGRRD;
+ m_pModule->JBig2_Error("text region decoding procedure (huffman):"
+ "bytes processed by generic refinement region decoding procedure doesn't equal SBHUFFRSIZE.");
+ goto failed;
+ }
+ delete pGRRD;
+ }
+ if (!IBI) {
+ continue;
+ }
+ WI = IBI->m_nWidth;
+ HI = IBI->m_nHeight;
+ if(TRANSPOSED == 0 && ((REFCORNER == JBIG2_CORNER_TOPRIGHT)
+ || (REFCORNER == JBIG2_CORNER_BOTTOMRIGHT))) {
+ CURS = CURS + WI - 1;
+ } else if(TRANSPOSED == 1 && ((REFCORNER == JBIG2_CORNER_BOTTOMLEFT)
+ || (REFCORNER == JBIG2_CORNER_BOTTOMRIGHT))) {
+ CURS = CURS + HI - 1;
+ }
+ SI = CURS;
+ if(TRANSPOSED == 0) {
+ switch(REFCORNER) {
+ case JBIG2_CORNER_TOPLEFT:
+ SBREG->composeFrom(SI, TI, IBI, SBCOMBOP);
+ break;
+ case JBIG2_CORNER_TOPRIGHT:
+ SBREG->composeFrom(SI - WI + 1, TI, IBI, SBCOMBOP);
+ break;
+ case JBIG2_CORNER_BOTTOMLEFT:
+ SBREG->composeFrom(SI, TI - HI + 1, IBI, SBCOMBOP);
+ break;
+ case JBIG2_CORNER_BOTTOMRIGHT:
+ SBREG->composeFrom(SI - WI + 1, TI - HI + 1, IBI, SBCOMBOP);
+ break;
+ }
+ } else {
+ switch(REFCORNER) {
+ case JBIG2_CORNER_TOPLEFT:
+ SBREG->composeFrom(TI, SI, IBI, SBCOMBOP);
+ break;
+ case JBIG2_CORNER_TOPRIGHT:
+ SBREG->composeFrom(TI - WI + 1, SI, IBI, SBCOMBOP);
+ break;
+ case JBIG2_CORNER_BOTTOMLEFT:
+ SBREG->composeFrom(TI, SI - HI + 1, IBI, SBCOMBOP);
+ break;
+ case JBIG2_CORNER_BOTTOMRIGHT:
+ SBREG->composeFrom(TI - WI + 1, SI - HI + 1, IBI, SBCOMBOP);
+ break;
+ }
+ }
+ if(RI != 0) {
+ delete IBI;
+ }
+ if(TRANSPOSED == 0 && ((REFCORNER == JBIG2_CORNER_TOPLEFT)
+ || (REFCORNER == JBIG2_CORNER_BOTTOMLEFT))) {
+ CURS = CURS + WI - 1;
+ } else if(TRANSPOSED == 1 && ((REFCORNER == JBIG2_CORNER_TOPLEFT)
+ || (REFCORNER == JBIG2_CORNER_TOPRIGHT))) {
+ CURS = CURS + HI - 1;
+ }
+ NINSTANCES = NINSTANCES + 1;
+ }
+ }
+ delete pHuffmanDecoder;
+ return SBREG;
+failed:
+ delete pHuffmanDecoder;
+ delete SBREG;
+ return NULL;
+}
+CJBig2_Image *CJBig2_TRDProc::decode_Arith(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext,
+ JBig2IntDecoderState *pIDS)
+{
+ FX_INT32 STRIPT, FIRSTS;
+ FX_DWORD NINSTANCES;
+ FX_INT32 DT, DFS, CURS;
+ FX_INT32 CURT;
+ FX_INT32 SI, TI;
+ FX_DWORD IDI;
+ CJBig2_Image *IBI;
+ FX_DWORD WI, HI;
+ FX_INT32 IDS;
+ FX_BOOL RI;
+ FX_INT32 RDWI, RDHI, RDXI, RDYI;
+ CJBig2_Image *IBOI;
+ FX_DWORD WOI, HOI;
+ CJBig2_Image *SBREG;
+ FX_BOOL bFirst;
+ FX_INT32 nRet, nVal;
+ FX_INT32 bRetained;
+ CJBig2_ArithIntDecoder *IADT, *IAFS, *IADS, *IAIT, *IARI, *IARDW, *IARDH, *IARDX, *IARDY;
+ CJBig2_ArithIaidDecoder *IAID;
+ CJBig2_GRRDProc *pGRRD;
+ if(pIDS) {
+ IADT = pIDS->IADT;
+ IAFS = pIDS->IAFS;
+ IADS = pIDS->IADS;
+ IAIT = pIDS->IAIT;
+ IARI = pIDS->IARI;
+ IARDW = pIDS->IARDW;
+ IARDH = pIDS->IARDH;
+ IARDX = pIDS->IARDX;
+ IARDY = pIDS->IARDY;
+ IAID = pIDS->IAID;
+ bRetained = TRUE;
+ } else {
+ JBIG2_ALLOC(IADT, CJBig2_ArithIntDecoder());
+ JBIG2_ALLOC(IAFS, CJBig2_ArithIntDecoder());
+ JBIG2_ALLOC(IADS, CJBig2_ArithIntDecoder());
+ JBIG2_ALLOC(IAIT, CJBig2_ArithIntDecoder());
+ JBIG2_ALLOC(IARI, CJBig2_ArithIntDecoder());
+ JBIG2_ALLOC(IARDW, CJBig2_ArithIntDecoder());
+ JBIG2_ALLOC(IARDH, CJBig2_ArithIntDecoder());
+ JBIG2_ALLOC(IARDX, CJBig2_ArithIntDecoder());
+ JBIG2_ALLOC(IARDY, CJBig2_ArithIntDecoder());
+ JBIG2_ALLOC(IAID , CJBig2_ArithIaidDecoder(SBSYMCODELEN));
+ bRetained = FALSE;
+ }
+ JBIG2_ALLOC(SBREG, CJBig2_Image(SBW, SBH));
+ SBREG->fill(SBDEFPIXEL);
+ if(IADT->decode(pArithDecoder, &STRIPT) == -1) {
+ m_pModule->JBig2_Error("text region decoding procedure (arith): too short.");
+ goto failed;
+ }
+ STRIPT *= SBSTRIPS;
+ STRIPT = -STRIPT;
+ FIRSTS = 0;
+ NINSTANCES = 0;
+ while(NINSTANCES < SBNUMINSTANCES) {
+ if(IADT->decode(pArithDecoder, &DT) == -1) {
+ m_pModule->JBig2_Error("text region decoding procedure (arith): too short.");
+ goto failed;
+ }
+ DT *= SBSTRIPS;
+ STRIPT = STRIPT + DT;
+ bFirst = TRUE;
+ for(;;) {
+ if(bFirst) {
+ if(IAFS->decode(pArithDecoder, &DFS) == -1) {
+ m_pModule->JBig2_Error("text region decoding procedure (arith): too short.");
+ goto failed;
+ }
+ FIRSTS = FIRSTS + DFS;
+ CURS = FIRSTS;
+ bFirst = FALSE;
+ } else {
+ nRet = IADS->decode(pArithDecoder, &IDS);
+ if(nRet == JBIG2_OOB) {
+ break;
+ } else if(nRet != 0) {
+ m_pModule->JBig2_Error("text region decoding procedure (arith): too short.");
+ goto failed;
+ } else {
+ CURS = CURS + IDS + SBDSOFFSET;
+ }
+ }
+ if (NINSTANCES >= SBNUMINSTANCES) {
+ break;
+ }
+ if(SBSTRIPS == 1) {
+ CURT = 0;
+ } else {
+ if(IAIT->decode(pArithDecoder, &nVal) == -1) {
+ m_pModule->JBig2_Error("text region decoding procedure (arith): too short.");
+ goto failed;
+ }
+ CURT = nVal;
+ }
+ TI = STRIPT + CURT;
+ if(IAID->decode(pArithDecoder, &nVal) == -1) {
+ m_pModule->JBig2_Error("text region decoding procedure (arith): too short.");
+ goto failed;
+ }
+ IDI = nVal;
+ if(IDI >= SBNUMSYMS) {
+ m_pModule->JBig2_Error("text region decoding procedure (arith): symbol id out of range.(%d/%d)",
+ IDI, SBNUMSYMS);
+ goto failed;
+ }
+ if(SBREFINE == 0) {
+ RI = 0;
+ } else {
+ if(IARI->decode(pArithDecoder, &RI) == -1) {
+ m_pModule->JBig2_Error("text region decoding procedure (arith): too short.");
+ goto failed;
+ }
+ }
+ if (!SBSYMS[IDI]) {
+ goto failed;
+ }
+ if(RI == 0) {
+ IBI = SBSYMS[IDI];
+ } else {
+ if((IARDW->decode(pArithDecoder, &RDWI) == -1)
+ || (IARDH->decode(pArithDecoder, &RDHI) == -1)
+ || (IARDX->decode(pArithDecoder, &RDXI) == -1)
+ || (IARDY->decode(pArithDecoder, &RDYI) == -1)) {
+ m_pModule->JBig2_Error("text region decoding procedure (arith): too short.");
+ goto failed;
+ }
+ IBOI = SBSYMS[IDI];
+ WOI = IBOI->m_nWidth;
+ HOI = IBOI->m_nHeight;
+ if ((int)(WOI + RDWI) < 0 || (int)(HOI + RDHI) < 0) {
+ m_pModule->JBig2_Error("text region decoding procedure (arith): Invalid RDWI or RDHI value.");
+ goto failed;
+ }
+ JBIG2_ALLOC(pGRRD, CJBig2_GRRDProc());
+ pGRRD->GRW = WOI + RDWI;
+ pGRRD->GRH = HOI + RDHI;
+ pGRRD->GRTEMPLATE = SBRTEMPLATE;
+ pGRRD->GRREFERENCE = IBOI;
+ pGRRD->GRREFERENCEDX = (RDWI >> 1) + RDXI;
+ pGRRD->GRREFERENCEDY = (RDHI >> 1) + RDYI;
+ pGRRD->TPGRON = 0;
+ pGRRD->GRAT[0] = SBRAT[0];
+ pGRRD->GRAT[1] = SBRAT[1];
+ pGRRD->GRAT[2] = SBRAT[2];
+ pGRRD->GRAT[3] = SBRAT[3];
+ IBI = pGRRD->decode(pArithDecoder, grContext);
+ if(IBI == NULL) {
+ delete pGRRD;
+ goto failed;
+ }
+ delete pGRRD;
+ }
+ WI = IBI->m_nWidth;
+ HI = IBI->m_nHeight;
+ if(TRANSPOSED == 0 && ((REFCORNER == JBIG2_CORNER_TOPRIGHT)
+ || (REFCORNER == JBIG2_CORNER_BOTTOMRIGHT))) {
+ CURS = CURS + WI - 1;
+ } else if(TRANSPOSED == 1 && ((REFCORNER == JBIG2_CORNER_BOTTOMLEFT)
+ || (REFCORNER == JBIG2_CORNER_BOTTOMRIGHT))) {
+ CURS = CURS + HI - 1;
+ }
+ SI = CURS;
+ if(TRANSPOSED == 0) {
+ switch(REFCORNER) {
+ case JBIG2_CORNER_TOPLEFT:
+ SBREG->composeFrom(SI, TI, IBI, SBCOMBOP);
+ break;
+ case JBIG2_CORNER_TOPRIGHT:
+ SBREG->composeFrom(SI - WI + 1, TI, IBI, SBCOMBOP);
+ break;
+ case JBIG2_CORNER_BOTTOMLEFT:
+ SBREG->composeFrom(SI, TI - HI + 1, IBI, SBCOMBOP);
+ break;
+ case JBIG2_CORNER_BOTTOMRIGHT:
+ SBREG->composeFrom(SI - WI + 1, TI - HI + 1, IBI, SBCOMBOP);
+ break;
+ }
+ } else {
+ switch(REFCORNER) {
+ case JBIG2_CORNER_TOPLEFT:
+ SBREG->composeFrom(TI, SI, IBI, SBCOMBOP);
+ break;
+ case JBIG2_CORNER_TOPRIGHT:
+ SBREG->composeFrom(TI - WI + 1, SI, IBI, SBCOMBOP);
+ break;
+ case JBIG2_CORNER_BOTTOMLEFT:
+ SBREG->composeFrom(TI, SI - HI + 1, IBI, SBCOMBOP);
+ break;
+ case JBIG2_CORNER_BOTTOMRIGHT:
+ SBREG->composeFrom(TI - WI + 1, SI - HI + 1, IBI, SBCOMBOP);
+ break;
+ }
+ }
+ if(RI != 0) {
+ delete IBI;
+ }
+ if(TRANSPOSED == 0 && ((REFCORNER == JBIG2_CORNER_TOPLEFT)
+ || (REFCORNER == JBIG2_CORNER_BOTTOMLEFT))) {
+ CURS = CURS + WI - 1;
+ } else if(TRANSPOSED == 1 && ((REFCORNER == JBIG2_CORNER_TOPLEFT)
+ || (REFCORNER == JBIG2_CORNER_TOPRIGHT))) {
+ CURS = CURS + HI - 1;
+ }
+ NINSTANCES = NINSTANCES + 1;
+ }
+ }
+ if(bRetained == FALSE) {
+ delete IADT;
+ delete IAFS;
+ delete IADS;
+ delete IAIT;
+ delete IARI;
+ delete IARDW;
+ delete IARDH;
+ delete IARDX;
+ delete IARDY;
+ delete IAID;
+ }
+ return SBREG;
+failed:
+ if(bRetained == FALSE) {
+ delete IADT;
+ delete IAFS;
+ delete IADS;
+ delete IAIT;
+ delete IARI;
+ delete IARDW;
+ delete IARDH;
+ delete IARDX;
+ delete IARDY;
+ delete IAID;
+ }
+ delete SBREG;
+ return NULL;
+}
+CJBig2_SymbolDict *CJBig2_SDDProc::decode_Arith(CJBig2_ArithDecoder *pArithDecoder,
+ JBig2ArithCtx *gbContext, JBig2ArithCtx *grContext)
+{
+ CJBig2_Image **SDNEWSYMS;
+ FX_DWORD HCHEIGHT, NSYMSDECODED;
+ FX_INT32 HCDH;
+ FX_DWORD SYMWIDTH, TOTWIDTH, HCFIRSTSYM;
+ FX_INT32 DW;
+ CJBig2_Image *BS;
+ FX_DWORD I, J, REFAGGNINST;
+ FX_BOOL *EXFLAGS;
+ FX_DWORD EXINDEX;
+ FX_BOOL CUREXFLAG;
+ FX_DWORD EXRUNLENGTH;
+ FX_INT32 nVal;
+ FX_DWORD nTmp;
+ FX_BOOL SBHUFF;
+ FX_DWORD SBNUMSYMS;
+ FX_BYTE SBSYMCODELEN;
+ FX_DWORD IDI;
+ FX_INT32 RDXI, RDYI;
+ CJBig2_Image **SBSYMS;
+ CJBig2_HuffmanTable *SBHUFFFS, *SBHUFFDS, *SBHUFFDT, *SBHUFFRDW, *SBHUFFRDH, *SBHUFFRDX, *SBHUFFRDY,
+ *SBHUFFRSIZE;
+ CJBig2_GRRDProc *pGRRD;
+ CJBig2_GRDProc *pGRD;
+ CJBig2_ArithIntDecoder *IADH, *IADW, *IAAI, *IARDX, *IARDY, *IAEX,
+ *IADT, *IAFS, *IADS, *IAIT, *IARI, *IARDW, *IARDH;
+ CJBig2_ArithIaidDecoder *IAID;
+ CJBig2_SymbolDict *pDict;
+ JBIG2_ALLOC(IADH, CJBig2_ArithIntDecoder());
+ JBIG2_ALLOC(IADW, CJBig2_ArithIntDecoder());
+ JBIG2_ALLOC(IAAI, CJBig2_ArithIntDecoder());
+ JBIG2_ALLOC(IARDX, CJBig2_ArithIntDecoder());
+ JBIG2_ALLOC(IARDY, CJBig2_ArithIntDecoder());
+ JBIG2_ALLOC(IAEX, CJBig2_ArithIntDecoder());
+ JBIG2_ALLOC(IADT, CJBig2_ArithIntDecoder());
+ JBIG2_ALLOC(IAFS, CJBig2_ArithIntDecoder());
+ JBIG2_ALLOC(IADS, CJBig2_ArithIntDecoder());
+ JBIG2_ALLOC(IAIT, CJBig2_ArithIntDecoder());
+ JBIG2_ALLOC(IARI, CJBig2_ArithIntDecoder());
+ JBIG2_ALLOC(IARDW, CJBig2_ArithIntDecoder());
+ JBIG2_ALLOC(IARDH, CJBig2_ArithIntDecoder());
+ nTmp = 0;
+ while((FX_DWORD)(1 << nTmp) < (SDNUMINSYMS + SDNUMNEWSYMS)) {
+ nTmp ++;
+ }
+ JBIG2_ALLOC(IAID, CJBig2_ArithIaidDecoder((FX_BYTE)nTmp));
+ SDNEWSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(SDNUMNEWSYMS, sizeof(CJBig2_Image*));
+ FXSYS_memset32(SDNEWSYMS, 0 , SDNUMNEWSYMS * sizeof(CJBig2_Image*));
+ HCHEIGHT = 0;
+ NSYMSDECODED = 0;
+ while(NSYMSDECODED < SDNUMNEWSYMS) {
+ BS = NULL;
+ if(IADH->decode(pArithDecoder, &HCDH) == -1) {
+ m_pModule->JBig2_Error("symbol dictionary decoding procedure (arith): too short.");
+ goto failed;
+ }
+ HCHEIGHT = HCHEIGHT + HCDH;
+ if ((int)HCHEIGHT < 0 || (int)HCHEIGHT > JBIG2_MAX_IMAGE_SIZE) {
+ m_pModule->JBig2_Error("symbol dictionary decoding procedure (arith): invalid HCHEIGHT value.");
+ goto failed;
+ }
+ SYMWIDTH = 0;
+ TOTWIDTH = 0;
+ HCFIRSTSYM = NSYMSDECODED;
+ for(;;) {
+ nVal = IADW->decode(pArithDecoder, &DW);
+ if(nVal == JBIG2_OOB) {
+ break;
+ } else if(nVal != 0) {
+ m_pModule->JBig2_Error("symbol dictionary decoding procedure (arith): too short.");
+ goto failed;
+ } else {
+ if (NSYMSDECODED >= SDNUMNEWSYMS) {
+ m_pModule->JBig2_Error("symbol dictionary decoding procedure (arith): NSYMSDECODED >= SDNUMNEWSYMS.");
+ goto failed;
+ }
+ SYMWIDTH = SYMWIDTH + DW;
+ if ((int)SYMWIDTH < 0 || (int)SYMWIDTH > JBIG2_MAX_IMAGE_SIZE) {
+ m_pModule->JBig2_Error("symbol dictionary decoding procedure (arith): invalid SYMWIDTH value.");
+ goto failed;
+ } else if (HCHEIGHT == 0 || SYMWIDTH == 0) {
+ TOTWIDTH = TOTWIDTH + SYMWIDTH;
+ SDNEWSYMS[NSYMSDECODED] = NULL;
+ NSYMSDECODED = NSYMSDECODED + 1;
+ continue;
+ }
+ TOTWIDTH = TOTWIDTH + SYMWIDTH;
+ }
+ if(SDREFAGG == 0) {
+ JBIG2_ALLOC(pGRD, CJBig2_GRDProc());
+ pGRD->MMR = 0;
+ pGRD->GBW = SYMWIDTH;
+ pGRD->GBH = HCHEIGHT;
+ pGRD->GBTEMPLATE = SDTEMPLATE;
+ pGRD->TPGDON = 0;
+ pGRD->USESKIP = 0;
+ pGRD->GBAT[0] = SDAT[0];
+ pGRD->GBAT[1] = SDAT[1];
+ pGRD->GBAT[2] = SDAT[2];
+ pGRD->GBAT[3] = SDAT[3];
+ pGRD->GBAT[4] = SDAT[4];
+ pGRD->GBAT[5] = SDAT[5];
+ pGRD->GBAT[6] = SDAT[6];
+ pGRD->GBAT[7] = SDAT[7];
+ BS = pGRD->decode_Arith(pArithDecoder, gbContext);
+ if(BS == NULL) {
+ delete pGRD;
+ goto failed;
+ }
+ delete pGRD;
+ } else {
+ if(IAAI->decode(pArithDecoder, (int*)&REFAGGNINST) == -1) {
+ m_pModule->JBig2_Error("symbol dictionary decoding procedure (arith): too short.");
+ goto failed;
+ }
+ if(REFAGGNINST > 1) {
+ CJBig2_TRDProc *pDecoder;
+ JBIG2_ALLOC(pDecoder, CJBig2_TRDProc());
+ pDecoder->SBHUFF = SDHUFF;
+ pDecoder->SBREFINE = 1;
+ pDecoder->SBW = SYMWIDTH;
+ pDecoder->SBH = HCHEIGHT;
+ pDecoder->SBNUMINSTANCES = REFAGGNINST;
+ pDecoder->SBSTRIPS = 1;
+ pDecoder->SBNUMSYMS = SDNUMINSYMS + NSYMSDECODED;
+ SBNUMSYMS = pDecoder->SBNUMSYMS;
+ nTmp = 0;
+ while((FX_DWORD)(1 << nTmp) < SBNUMSYMS) {
+ nTmp ++;
+ }
+ SBSYMCODELEN = (FX_BYTE)nTmp;
+ pDecoder->SBSYMCODELEN = SBSYMCODELEN;
+ SBSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(SBNUMSYMS, sizeof(CJBig2_Image*));
+ JBIG2_memcpy(SBSYMS, SDINSYMS, SDNUMINSYMS * sizeof(CJBig2_Image*));
+ JBIG2_memcpy(SBSYMS + SDNUMINSYMS, SDNEWSYMS, NSYMSDECODED * sizeof(CJBig2_Image*));
+ pDecoder->SBSYMS = SBSYMS;
+ pDecoder->SBDEFPIXEL = 0;
+ pDecoder->SBCOMBOP = JBIG2_COMPOSE_OR;
+ pDecoder->TRANSPOSED = 0;
+ pDecoder->REFCORNER = JBIG2_CORNER_TOPLEFT;
+ pDecoder->SBDSOFFSET = 0;
+ JBIG2_ALLOC(SBHUFFFS, CJBig2_HuffmanTable(HuffmanTable_B6,
+ sizeof(HuffmanTable_B6) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B6));
+ JBIG2_ALLOC(SBHUFFDS, CJBig2_HuffmanTable(HuffmanTable_B8,
+ sizeof(HuffmanTable_B8) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B8));
+ JBIG2_ALLOC(SBHUFFDT, CJBig2_HuffmanTable(HuffmanTable_B11,
+ sizeof(HuffmanTable_B11) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B11));
+ JBIG2_ALLOC(SBHUFFRDW, CJBig2_HuffmanTable(HuffmanTable_B15,
+ sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B15));
+ JBIG2_ALLOC(SBHUFFRDH, CJBig2_HuffmanTable(HuffmanTable_B15,
+ sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B15));
+ JBIG2_ALLOC(SBHUFFRDX, CJBig2_HuffmanTable(HuffmanTable_B15,
+ sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B15));
+ JBIG2_ALLOC(SBHUFFRDY, CJBig2_HuffmanTable(HuffmanTable_B15,
+ sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B15));
+ JBIG2_ALLOC(SBHUFFRSIZE, CJBig2_HuffmanTable(HuffmanTable_B1,
+ sizeof(HuffmanTable_B1) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B1));
+ pDecoder->SBHUFFFS = SBHUFFFS;
+ pDecoder->SBHUFFDS = SBHUFFDS;
+ pDecoder->SBHUFFDT = SBHUFFDT;
+ pDecoder->SBHUFFRDW = SBHUFFRDW;
+ pDecoder->SBHUFFRDH = SBHUFFRDH;
+ pDecoder->SBHUFFRDX = SBHUFFRDX;
+ pDecoder->SBHUFFRDY = SBHUFFRDY;
+ pDecoder->SBHUFFRSIZE = SBHUFFRSIZE;
+ pDecoder->SBRTEMPLATE = SDRTEMPLATE;
+ pDecoder->SBRAT[0] = SDRAT[0];
+ pDecoder->SBRAT[1] = SDRAT[1];
+ pDecoder->SBRAT[2] = SDRAT[2];
+ pDecoder->SBRAT[3] = SDRAT[3];
+ JBig2IntDecoderState ids;
+ ids.IADT = IADT;
+ ids.IAFS = IAFS;
+ ids.IADS = IADS;
+ ids.IAIT = IAIT;
+ ids.IARI = IARI;
+ ids.IARDW = IARDW;
+ ids.IARDH = IARDH;
+ ids.IARDX = IARDX;
+ ids.IARDY = IARDY;
+ ids.IAID = IAID;
+ BS = pDecoder->decode_Arith(pArithDecoder, grContext, &ids);
+ if(BS == NULL) {
+ m_pModule->JBig2_Free(SBSYMS);
+ delete SBHUFFFS;
+ delete SBHUFFDS;
+ delete SBHUFFDT;
+ delete SBHUFFRDW;
+ delete SBHUFFRDH;
+ delete SBHUFFRDX;
+ delete SBHUFFRDY;
+ delete SBHUFFRSIZE;
+ delete pDecoder;
+ goto failed;
+ }
+ m_pModule->JBig2_Free(SBSYMS);
+ delete SBHUFFFS;
+ delete SBHUFFDS;
+ delete SBHUFFDT;
+ delete SBHUFFRDW;
+ delete SBHUFFRDH;
+ delete SBHUFFRDX;
+ delete SBHUFFRDY;
+ delete SBHUFFRSIZE;
+ delete pDecoder;
+ } else if(REFAGGNINST == 1) {
+ SBHUFF = SDHUFF;
+ SBNUMSYMS = SDNUMINSYMS + NSYMSDECODED;
+ if(IAID->decode(pArithDecoder, (int*)&IDI) == -1) {
+ m_pModule->JBig2_Error("symbol dictionary decoding procedure (arith): too short.");
+ goto failed;
+ }
+ if((IARDX->decode(pArithDecoder, &RDXI) == -1)
+ || (IARDY->decode(pArithDecoder, &RDYI) == -1)) {
+ m_pModule->JBig2_Error("symbol dictionary decoding procedure (arith): too short.");
+ goto failed;
+ }
+ if (IDI >= SBNUMSYMS) {
+ m_pModule->JBig2_Error("symbol dictionary decoding procedure (arith):"
+ " refinement references unknown symbol %d", IDI);
+ goto failed;
+ }
+ SBSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(SBNUMSYMS, sizeof(CJBig2_Image*));
+ JBIG2_memcpy(SBSYMS, SDINSYMS, SDNUMINSYMS * sizeof(CJBig2_Image*));
+ JBIG2_memcpy(SBSYMS + SDNUMINSYMS, SDNEWSYMS, NSYMSDECODED * sizeof(CJBig2_Image*));
+ if (!SBSYMS[IDI]) {
+ m_pModule->JBig2_Free(SBSYMS);
+ goto failed;
+ }
+ JBIG2_ALLOC(pGRRD, CJBig2_GRRDProc());
+ pGRRD->GRW = SYMWIDTH;
+ pGRRD->GRH = HCHEIGHT;
+ pGRRD->GRTEMPLATE = SDRTEMPLATE;
+ pGRRD->GRREFERENCE = SBSYMS[IDI];
+ pGRRD->GRREFERENCEDX = RDXI;
+ pGRRD->GRREFERENCEDY = RDYI;
+ pGRRD->TPGRON = 0;
+ pGRRD->GRAT[0] = SDRAT[0];
+ pGRRD->GRAT[1] = SDRAT[1];
+ pGRRD->GRAT[2] = SDRAT[2];
+ pGRRD->GRAT[3] = SDRAT[3];
+ BS = pGRRD->decode(pArithDecoder, grContext);
+ if(BS == NULL) {
+ m_pModule->JBig2_Free(SBSYMS);
+ delete pGRRD;
+ goto failed;
+ }
+ m_pModule->JBig2_Free(SBSYMS);
+ delete pGRRD;
+ }
+ }
+ SDNEWSYMS[NSYMSDECODED] = BS;
+ BS = NULL;
+ NSYMSDECODED = NSYMSDECODED + 1;
+ }
+ }
+ EXINDEX = 0;
+ CUREXFLAG = 0;
+ EXFLAGS = (FX_BOOL*)m_pModule->JBig2_Malloc2(sizeof(FX_BOOL), (SDNUMINSYMS + SDNUMNEWSYMS));
+ while(EXINDEX < SDNUMINSYMS + SDNUMNEWSYMS) {
+ if(IAEX->decode(pArithDecoder, (int*)&EXRUNLENGTH) == -1) {
+ m_pModule->JBig2_Free(EXFLAGS);
+ m_pModule->JBig2_Error("symbol dictionary decoding procedure (arith): too short.");
+ goto failed;
+ }
+ if (EXINDEX + EXRUNLENGTH > SDNUMINSYMS + SDNUMNEWSYMS) {
+ m_pModule->JBig2_Free(EXFLAGS);
+ m_pModule->JBig2_Error("symbol dictionary decoding procedure (arith): Invalid EXRUNLENGTH value.");
+ goto failed;
+ }
+ if(EXRUNLENGTH != 0) {
+ for(I = EXINDEX; I < EXINDEX + EXRUNLENGTH; I++) {
+ EXFLAGS[I] = CUREXFLAG;
+ }
+ }
+ EXINDEX = EXINDEX + EXRUNLENGTH;
+ CUREXFLAG = !CUREXFLAG;
+ }
+ JBIG2_ALLOC(pDict, CJBig2_SymbolDict());
+ pDict->SDNUMEXSYMS = SDNUMEXSYMS;
+ pDict->SDEXSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(sizeof(CJBig2_Image*), SDNUMEXSYMS);
+ I = J = 0;
+ for(I = 0; I < SDNUMINSYMS + SDNUMNEWSYMS; I++) {
+ if(EXFLAGS[I] && J < SDNUMEXSYMS) {
+ if(I < SDNUMINSYMS) {
+ JBIG2_ALLOC(pDict->SDEXSYMS[J], CJBig2_Image(*SDINSYMS[I]));
+ } else {
+ pDict->SDEXSYMS[J] = SDNEWSYMS[I - SDNUMINSYMS];
+ }
+ J = J + 1;
+ } else if (!EXFLAGS[I] && I >= SDNUMINSYMS) {
+ delete SDNEWSYMS[I - SDNUMINSYMS];
+ }
+ }
+ if (J < SDNUMEXSYMS) {
+ pDict->SDNUMEXSYMS = J;
+ }
+ m_pModule->JBig2_Free(EXFLAGS);
+ m_pModule->JBig2_Free(SDNEWSYMS);
+ delete IADH;
+ delete IADW;
+ delete IAAI;
+ delete IARDX;
+ delete IARDY;
+ delete IAEX;
+ delete IAID;
+ delete IADT;
+ delete IAFS;
+ delete IADS;
+ delete IAIT;
+ delete IARI;
+ delete IARDW;
+ delete IARDH;
+ return pDict;
+failed:
+ for(I = 0; I < NSYMSDECODED; I++) {
+ if (SDNEWSYMS[I]) {
+ delete SDNEWSYMS[I];
+ SDNEWSYMS[I] = NULL;
+ }
+ }
+ m_pModule->JBig2_Free(SDNEWSYMS);
+ delete IADH;
+ delete IADW;
+ delete IAAI;
+ delete IARDX;
+ delete IARDY;
+ delete IAEX;
+ delete IAID;
+ delete IADT;
+ delete IAFS;
+ delete IADS;
+ delete IAIT;
+ delete IARI;
+ delete IARDW;
+ delete IARDH;
+ return NULL;
+}
+CJBig2_SymbolDict *CJBig2_SDDProc::decode_Huffman(CJBig2_BitStream *pStream,
+ JBig2ArithCtx *gbContext, JBig2ArithCtx *grContext, IFX_Pause* pPause)
+{
+ CJBig2_Image **SDNEWSYMS;
+ FX_DWORD *SDNEWSYMWIDTHS;
+ FX_DWORD HCHEIGHT, NSYMSDECODED;
+ FX_INT32 HCDH;
+ FX_DWORD SYMWIDTH, TOTWIDTH, HCFIRSTSYM;
+ FX_INT32 DW;
+ CJBig2_Image *BS, *BHC;
+ FX_DWORD I, J, REFAGGNINST;
+ FX_BOOL *EXFLAGS;
+ FX_DWORD EXINDEX;
+ FX_BOOL CUREXFLAG;
+ FX_DWORD EXRUNLENGTH;
+ FX_INT32 nVal, nBits;
+ FX_DWORD nTmp;
+ FX_BOOL SBHUFF;
+ FX_DWORD SBNUMSYMS;
+ FX_BYTE SBSYMCODELEN;
+ JBig2HuffmanCode *SBSYMCODES;
+ FX_DWORD IDI;
+ FX_INT32 RDXI, RDYI;
+ FX_DWORD BMSIZE;
+ FX_DWORD stride;
+ CJBig2_Image **SBSYMS;
+ CJBig2_HuffmanTable *SBHUFFFS, *SBHUFFDS, *SBHUFFDT, *SBHUFFRDW, *SBHUFFRDH, *SBHUFFRDX, *SBHUFFRDY,
+ *SBHUFFRSIZE, *pTable;
+ CJBig2_HuffmanDecoder *pHuffmanDecoder;
+ CJBig2_GRRDProc *pGRRD;
+ CJBig2_ArithDecoder *pArithDecoder;
+ CJBig2_GRDProc *pGRD;
+ CJBig2_SymbolDict *pDict;
+ JBIG2_ALLOC(pHuffmanDecoder, CJBig2_HuffmanDecoder(pStream));
+ SDNEWSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(SDNUMNEWSYMS, sizeof(CJBig2_Image*));
+ FXSYS_memset32(SDNEWSYMS, 0 , SDNUMNEWSYMS * sizeof(CJBig2_Image*));
+ SDNEWSYMWIDTHS = NULL;
+ BHC = NULL;
+ if(SDREFAGG == 0) {
+ SDNEWSYMWIDTHS = (FX_DWORD *)m_pModule->JBig2_Malloc2(SDNUMNEWSYMS, sizeof(FX_DWORD));
+ FXSYS_memset32(SDNEWSYMWIDTHS, 0 , SDNUMNEWSYMS * sizeof(FX_DWORD));
+ }
+ HCHEIGHT = 0;
+ NSYMSDECODED = 0;
+ BS = NULL;
+ while(NSYMSDECODED < SDNUMNEWSYMS) {
+ if(pHuffmanDecoder->decodeAValue(SDHUFFDH, &HCDH) != 0) {
+ m_pModule->JBig2_Error("symbol dictionary decoding procedure (huffman): too short.");
+ goto failed;
+ }
+ HCHEIGHT = HCHEIGHT + HCDH;
+ if ((int)HCHEIGHT < 0 || (int)HCHEIGHT > JBIG2_MAX_IMAGE_SIZE) {
+ m_pModule->JBig2_Error("symbol dictionary decoding procedure (huffman): invalid HCHEIGHT value.");
+ goto failed;
+ }
+ SYMWIDTH = 0;
+ TOTWIDTH = 0;
+ HCFIRSTSYM = NSYMSDECODED;
+ for(;;) {
+ nVal = pHuffmanDecoder->decodeAValue(SDHUFFDW, &DW);
+ if(nVal == JBIG2_OOB) {
+ break;
+ } else if(nVal != 0) {
+ m_pModule->JBig2_Error("symbol dictionary decoding procedure (huffman): too short.");
+ goto failed;
+ } else {
+ if (NSYMSDECODED >= SDNUMNEWSYMS) {
+ m_pModule->JBig2_Error("symbol dictionary decoding procedure (huffman): NSYMSDECODED >= SDNUMNEWSYMS.");
+ goto failed;
+ }
+ SYMWIDTH = SYMWIDTH + DW;
+ if ((int)SYMWIDTH < 0 || (int)SYMWIDTH > JBIG2_MAX_IMAGE_SIZE) {
+ m_pModule->JBig2_Error("symbol dictionary decoding procedure (huffman): invalid SYMWIDTH value.");
+ goto failed;
+ } else if (HCHEIGHT == 0 || SYMWIDTH == 0) {
+ TOTWIDTH = TOTWIDTH + SYMWIDTH;
+ SDNEWSYMS[NSYMSDECODED] = NULL;
+ NSYMSDECODED = NSYMSDECODED + 1;
+ continue;
+ }
+ TOTWIDTH = TOTWIDTH + SYMWIDTH;
+ }
+ if(SDREFAGG == 1) {
+ if(pHuffmanDecoder->decodeAValue(SDHUFFAGGINST, (int*)&REFAGGNINST) != 0) {
+ m_pModule->JBig2_Error("symbol dictionary decoding procedure (huffman): too short.");
+ goto failed;
+ }
+ BS = NULL;
+ if(REFAGGNINST > 1) {
+ CJBig2_TRDProc *pDecoder;
+ JBIG2_ALLOC(pDecoder, CJBig2_TRDProc());
+ pDecoder->SBHUFF = SDHUFF;
+ pDecoder->SBREFINE = 1;
+ pDecoder->SBW = SYMWIDTH;
+ pDecoder->SBH = HCHEIGHT;
+ pDecoder->SBNUMINSTANCES = REFAGGNINST;
+ pDecoder->SBSTRIPS = 1;
+ pDecoder->SBNUMSYMS = SDNUMINSYMS + NSYMSDECODED;
+ SBNUMSYMS = pDecoder->SBNUMSYMS;
+ SBSYMCODES = (JBig2HuffmanCode*)m_pModule->JBig2_Malloc2(SBNUMSYMS, sizeof(JBig2HuffmanCode));
+ nTmp = 1;
+ while((FX_DWORD)(1 << nTmp) < SBNUMSYMS) {
+ nTmp ++;
+ }
+ for(I = 0; I < SBNUMSYMS; I++) {
+ SBSYMCODES[I].codelen = nTmp;
+ SBSYMCODES[I].code = I;
+ }
+ pDecoder->SBSYMCODES = SBSYMCODES;
+ SBSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(SBNUMSYMS, sizeof(CJBig2_Image*));
+ JBIG2_memcpy(SBSYMS, SDINSYMS, SDNUMINSYMS * sizeof(CJBig2_Image*));
+ JBIG2_memcpy(SBSYMS + SDNUMINSYMS, SDNEWSYMS, NSYMSDECODED * sizeof(CJBig2_Image*));
+ pDecoder->SBSYMS = SBSYMS;
+ pDecoder->SBDEFPIXEL = 0;
+ pDecoder->SBCOMBOP = JBIG2_COMPOSE_OR;
+ pDecoder->TRANSPOSED = 0;
+ pDecoder->REFCORNER = JBIG2_CORNER_TOPLEFT;
+ pDecoder->SBDSOFFSET = 0;
+ JBIG2_ALLOC(SBHUFFFS, CJBig2_HuffmanTable(HuffmanTable_B6,
+ sizeof(HuffmanTable_B6) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B6));
+ JBIG2_ALLOC(SBHUFFDS, CJBig2_HuffmanTable(HuffmanTable_B8,
+ sizeof(HuffmanTable_B8) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B8));
+ JBIG2_ALLOC(SBHUFFDT, CJBig2_HuffmanTable(HuffmanTable_B11,
+ sizeof(HuffmanTable_B11) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B11));
+ JBIG2_ALLOC(SBHUFFRDW, CJBig2_HuffmanTable(HuffmanTable_B15,
+ sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B15));
+ JBIG2_ALLOC(SBHUFFRDH, CJBig2_HuffmanTable(HuffmanTable_B15,
+ sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B15));
+ JBIG2_ALLOC(SBHUFFRDX, CJBig2_HuffmanTable(HuffmanTable_B15,
+ sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B15));
+ JBIG2_ALLOC(SBHUFFRDY, CJBig2_HuffmanTable(HuffmanTable_B15,
+ sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B15));
+ JBIG2_ALLOC(SBHUFFRSIZE, CJBig2_HuffmanTable(HuffmanTable_B1,
+ sizeof(HuffmanTable_B1) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B1));
+ pDecoder->SBHUFFFS = SBHUFFFS;
+ pDecoder->SBHUFFDS = SBHUFFDS;
+ pDecoder->SBHUFFDT = SBHUFFDT;
+ pDecoder->SBHUFFRDW = SBHUFFRDW;
+ pDecoder->SBHUFFRDH = SBHUFFRDH;
+ pDecoder->SBHUFFRDX = SBHUFFRDX;
+ pDecoder->SBHUFFRDY = SBHUFFRDY;
+ pDecoder->SBHUFFRSIZE = SBHUFFRSIZE;
+ pDecoder->SBRTEMPLATE = SDRTEMPLATE;
+ pDecoder->SBRAT[0] = SDRAT[0];
+ pDecoder->SBRAT[1] = SDRAT[1];
+ pDecoder->SBRAT[2] = SDRAT[2];
+ pDecoder->SBRAT[3] = SDRAT[3];
+ BS = pDecoder->decode_Huffman(pStream, grContext);
+ if(BS == NULL) {
+ m_pModule->JBig2_Free(SBSYMCODES);
+ m_pModule->JBig2_Free(SBSYMS);
+ delete SBHUFFFS;
+ delete SBHUFFDS;
+ delete SBHUFFDT;
+ delete SBHUFFRDW;
+ delete SBHUFFRDH;
+ delete SBHUFFRDX;
+ delete SBHUFFRDY;
+ delete SBHUFFRSIZE;
+ delete pDecoder;
+ goto failed;
+ }
+ m_pModule->JBig2_Free(SBSYMCODES);
+ m_pModule->JBig2_Free(SBSYMS);
+ delete SBHUFFFS;
+ delete SBHUFFDS;
+ delete SBHUFFDT;
+ delete SBHUFFRDW;
+ delete SBHUFFRDH;
+ delete SBHUFFRDX;
+ delete SBHUFFRDY;
+ delete SBHUFFRSIZE;
+ delete pDecoder;
+ } else if(REFAGGNINST == 1) {
+ SBHUFF = SDHUFF;
+ SBNUMSYMS = SDNUMINSYMS + SDNUMNEWSYMS;
+ nTmp = 1;
+ while((FX_DWORD)(1 << nTmp) < SBNUMSYMS) {
+ nTmp ++;
+ }
+ SBSYMCODELEN = (FX_BYTE)nTmp;
+ SBSYMCODES = (JBig2HuffmanCode*)m_pModule->JBig2_Malloc2(SBNUMSYMS, sizeof(JBig2HuffmanCode));
+ for(I = 0; I < SBNUMSYMS; I++) {
+ SBSYMCODES[I].codelen = SBSYMCODELEN;
+ SBSYMCODES[I].code = I;
+ }
+ nVal = 0;
+ nBits = 0;
+ for(;;) {
+ if(pStream->read1Bit(&nTmp) != 0) {
+ m_pModule->JBig2_Free(SBSYMCODES);
+ m_pModule->JBig2_Error("symbol dictionary decoding procedure (huffman): too short.");
+ goto failed;
+ }
+ nVal = (nVal << 1) | nTmp;
+ for(IDI = 0; IDI < SBNUMSYMS; IDI++) {
+ if((nVal == SBSYMCODES[IDI].code)
+ && (nBits == SBSYMCODES[IDI].codelen)) {
+ break;
+ }
+ }
+ if(IDI < SBNUMSYMS) {
+ break;
+ }
+ }
+ m_pModule->JBig2_Free(SBSYMCODES);
+ JBIG2_ALLOC(SBHUFFRDX, CJBig2_HuffmanTable(HuffmanTable_B15,
+ sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B15));
+ JBIG2_ALLOC(SBHUFFRSIZE, CJBig2_HuffmanTable(HuffmanTable_B1,
+ sizeof(HuffmanTable_B1) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B1));
+ if((pHuffmanDecoder->decodeAValue(SBHUFFRDX, &RDXI) != 0)
+ || (pHuffmanDecoder->decodeAValue(SBHUFFRDX, &RDYI) != 0)
+ || (pHuffmanDecoder->decodeAValue(SBHUFFRSIZE, &nVal) != 0)) {
+ delete SBHUFFRDX;
+ delete SBHUFFRSIZE;
+ m_pModule->JBig2_Error("symbol dictionary decoding procedure (huffman): too short.");
+ goto failed;
+ }
+ delete SBHUFFRDX;
+ delete SBHUFFRSIZE;
+ pStream->alignByte();
+ nTmp = pStream->getOffset();
+ SBSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(SBNUMSYMS, sizeof(CJBig2_Image*));
+ JBIG2_memcpy(SBSYMS, SDINSYMS, SDNUMINSYMS * sizeof(CJBig2_Image*));
+ JBIG2_memcpy(SBSYMS + SDNUMINSYMS, SDNEWSYMS, NSYMSDECODED * sizeof(CJBig2_Image*));
+ JBIG2_ALLOC(pGRRD, CJBig2_GRRDProc());
+ pGRRD->GRW = SYMWIDTH;
+ pGRRD->GRH = HCHEIGHT;
+ pGRRD->GRTEMPLATE = SDRTEMPLATE;
+ pGRRD->GRREFERENCE = SBSYMS[IDI];
+ pGRRD->GRREFERENCEDX = RDXI;
+ pGRRD->GRREFERENCEDY = RDYI;
+ pGRRD->TPGRON = 0;
+ pGRRD->GRAT[0] = SDRAT[0];
+ pGRRD->GRAT[1] = SDRAT[1];
+ pGRRD->GRAT[2] = SDRAT[2];
+ pGRRD->GRAT[3] = SDRAT[3];
+ JBIG2_ALLOC(pArithDecoder, CJBig2_ArithDecoder(pStream));
+ BS = pGRRD->decode(pArithDecoder, grContext);
+ if(BS == NULL) {
+ m_pModule->JBig2_Free(SBSYMS);
+ delete pGRRD;
+ delete pArithDecoder;
+ goto failed;
+ }
+ pStream->alignByte();
+ pStream->offset(2);
+ if((FX_DWORD)nVal != (pStream->getOffset() - nTmp)) {
+ delete BS;
+ m_pModule->JBig2_Free(SBSYMS);
+ delete pGRRD;
+ delete pArithDecoder;
+ m_pModule->JBig2_Error("symbol dictionary decoding procedure (huffman):"
+ "bytes processed by generic refinement region decoding procedure doesn't equal SBHUFFRSIZE.");
+ goto failed;
+ }
+ m_pModule->JBig2_Free(SBSYMS);
+ delete pGRRD;
+ delete pArithDecoder;
+ }
+ SDNEWSYMS[NSYMSDECODED] = BS;
+ }
+ if(SDREFAGG == 0) {
+ SDNEWSYMWIDTHS[NSYMSDECODED] = SYMWIDTH;
+ }
+ NSYMSDECODED = NSYMSDECODED + 1;
+ }
+ if(SDREFAGG == 0) {
+ if(pHuffmanDecoder->decodeAValue(SDHUFFBMSIZE, (FX_INT32*)&BMSIZE) != 0) {
+ m_pModule->JBig2_Error("symbol dictionary decoding procedure (huffman): too short.");
+ goto failed;
+ }
+ pStream->alignByte();
+ if(BMSIZE == 0) {
+ stride = (TOTWIDTH + 7) >> 3;
+ if(pStream->getByteLeft() >= stride * HCHEIGHT) {
+ JBIG2_ALLOC(BHC, CJBig2_Image(TOTWIDTH, HCHEIGHT));
+ for(I = 0; I < HCHEIGHT; I ++) {
+ JBIG2_memcpy(BHC->m_pData + I * BHC->m_nStride, pStream->getPointer(), stride);
+ pStream->offset(stride);
+ }
+ } else {
+ m_pModule->JBig2_Error("symbol dictionary decoding procedure (huffman): too short.");
+ goto failed;
+ }
+ } else {
+ JBIG2_ALLOC(pGRD, CJBig2_GRDProc());
+ pGRD->MMR = 1;
+ pGRD->GBW = TOTWIDTH;
+ pGRD->GBH = HCHEIGHT;
+ FXCODEC_STATUS status = pGRD->Start_decode_MMR(&BHC, pStream);
+ while(status == FXCODEC_STATUS_DECODE_TOBECONTINUE) {
+ pGRD->Continue_decode(pPause);
+ }
+ delete pGRD;
+ pStream->alignByte();
+ }
+ nTmp = 0;
+ if (!BHC) {
+ continue;
+ }
+ for(I = HCFIRSTSYM; I < NSYMSDECODED; I++) {
+ SDNEWSYMS[I] = BHC->subImage(nTmp, 0, SDNEWSYMWIDTHS[I], HCHEIGHT);
+ nTmp += SDNEWSYMWIDTHS[I];
+ }
+ delete BHC;
+ BHC = NULL;
+ }
+ }
+ EXINDEX = 0;
+ CUREXFLAG = 0;
+ JBIG2_ALLOC(pTable, CJBig2_HuffmanTable(HuffmanTable_B1,
+ sizeof(HuffmanTable_B1) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B1));
+ EXFLAGS = (FX_BOOL*)m_pModule->JBig2_Malloc2(sizeof(FX_BOOL), (SDNUMINSYMS + SDNUMNEWSYMS));
+ while(EXINDEX < SDNUMINSYMS + SDNUMNEWSYMS) {
+ if(pHuffmanDecoder->decodeAValue(pTable, (int*)&EXRUNLENGTH) != 0) {
+ delete pTable;
+ m_pModule->JBig2_Free(EXFLAGS);
+ m_pModule->JBig2_Error("symbol dictionary decoding procedure (huffman): too short.");
+ goto failed;
+ }
+ if (EXINDEX + EXRUNLENGTH > SDNUMINSYMS + SDNUMNEWSYMS) {
+ delete pTable;
+ m_pModule->JBig2_Free(EXFLAGS);
+ m_pModule->JBig2_Error("symbol dictionary decoding procedure (arith): Invalid EXRUNLENGTH value.");
+ goto failed;
+ }
+ if(EXRUNLENGTH != 0) {
+ for(I = EXINDEX; I < EXINDEX + EXRUNLENGTH; I++) {
+ EXFLAGS[I] = CUREXFLAG;
+ }
+ }
+ EXINDEX = EXINDEX + EXRUNLENGTH;
+ CUREXFLAG = !CUREXFLAG;
+ }
+ delete pTable;
+ JBIG2_ALLOC(pDict, CJBig2_SymbolDict());
+ pDict->SDNUMEXSYMS = SDNUMEXSYMS;
+ pDict->SDEXSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(sizeof(CJBig2_Image*), SDNUMEXSYMS);
+ I = J = 0;
+ for(I = 0; I < SDNUMINSYMS + SDNUMNEWSYMS; I++) {
+ if(EXFLAGS[I] && J < SDNUMEXSYMS) {
+ if(I < SDNUMINSYMS) {
+ JBIG2_ALLOC(pDict->SDEXSYMS[J], CJBig2_Image(*SDINSYMS[I]));
+ } else {
+ pDict->SDEXSYMS[J] = SDNEWSYMS[I - SDNUMINSYMS];
+ }
+ J = J + 1;
+ } else if (!EXFLAGS[I] && I >= SDNUMINSYMS) {
+ delete SDNEWSYMS[I - SDNUMINSYMS];
+ }
+ }
+ if (J < SDNUMEXSYMS) {
+ pDict->SDNUMEXSYMS = J;
+ }
+ m_pModule->JBig2_Free(EXFLAGS);
+ m_pModule->JBig2_Free(SDNEWSYMS);
+ if(SDREFAGG == 0) {
+ m_pModule->JBig2_Free(SDNEWSYMWIDTHS);
+ }
+ delete pHuffmanDecoder;
+ return pDict;
+failed:
+ for(I = 0; I < NSYMSDECODED; I++) {
+ if (SDNEWSYMS[I]) {
+ delete SDNEWSYMS[I];
+ }
+ }
+ m_pModule->JBig2_Free(SDNEWSYMS);
+ if(SDREFAGG == 0) {
+ m_pModule->JBig2_Free(SDNEWSYMWIDTHS);
+ }
+ delete pHuffmanDecoder;
+ return NULL;
+}
+CJBig2_Image *CJBig2_HTRDProc::decode_Arith(CJBig2_ArithDecoder *pArithDecoder,
+ JBig2ArithCtx *gbContext, IFX_Pause* pPause)
+{
+ FX_DWORD ng, mg;
+ FX_INT32 x, y;
+ CJBig2_Image *HSKIP;
+ FX_DWORD HBPP;
+ FX_DWORD *GI;
+ CJBig2_Image *HTREG;
+ CJBig2_GSIDProc *pGID;
+ JBIG2_ALLOC(HTREG, CJBig2_Image(HBW, HBH));
+ HTREG->fill(HDEFPIXEL);
+ HSKIP = NULL;
+ if(HENABLESKIP == 1) {
+ JBIG2_ALLOC(HSKIP, CJBig2_Image(HGW, HGH));
+ for(mg = 0; mg < HGH; mg++) {
+ for(ng = 0; ng < HGW; ng++) {
+ x = (HGX + mg * HRY + ng * HRX) >> 8;
+ y = (HGY + mg * HRX - ng * HRY) >> 8;
+ if((x + HPW <= 0) | (x >= (FX_INT32)HBW)
+ | (y + HPH <= 0) | (y >= (FX_INT32)HPH)) {
+ HSKIP->setPixel(ng, mg, 1);
+ } else {
+ HSKIP->setPixel(ng, mg, 0);
+ }
+ }
+ }
+ }
+ HBPP = 1;
+ while((FX_DWORD)(1 << HBPP) < HNUMPATS) {
+ HBPP ++;
+ }
+ JBIG2_ALLOC(pGID, CJBig2_GSIDProc());
+ pGID->GSMMR = HMMR;
+ pGID->GSW = HGW;
+ pGID->GSH = HGH;
+ pGID->GSBPP = (FX_BYTE)HBPP;
+ pGID->GSUSESKIP = HENABLESKIP;
+ pGID->GSKIP = HSKIP;
+ pGID->GSTEMPLATE = HTEMPLATE;
+ GI = pGID->decode_Arith(pArithDecoder, gbContext, pPause);
+ if(GI == NULL) {
+ goto failed;
+ }
+ for(mg = 0; mg < HGH; mg++) {
+ for(ng = 0; ng < HGW; ng++) {
+ x = (HGX + mg * HRY + ng * HRX) >> 8;
+ y = (HGY + mg * HRX - ng * HRY) >> 8;
+ FX_DWORD pat_index = GI[mg * HGW + ng];
+ if (pat_index >= HNUMPATS) {
+ pat_index = HNUMPATS - 1;
+ }
+ HTREG->composeFrom(x, y, HPATS[pat_index], HCOMBOP);
+ }
+ }
+ m_pModule->JBig2_Free(GI);
+ if(HSKIP) {
+ delete HSKIP;
+ }
+ delete pGID;
+ return HTREG;
+failed:
+ if(HSKIP) {
+ delete HSKIP;
+ }
+ delete pGID;
+ delete HTREG;
+ return NULL;
+}
+CJBig2_Image *CJBig2_HTRDProc::decode_MMR(CJBig2_BitStream *pStream, IFX_Pause* pPause)
+{
+ FX_DWORD ng, mg;
+ FX_INT32 x, y;
+ FX_DWORD HBPP;
+ FX_DWORD *GI;
+ CJBig2_Image *HTREG;
+ CJBig2_GSIDProc *pGID;
+ JBIG2_ALLOC(HTREG, CJBig2_Image(HBW, HBH));
+ HTREG->fill(HDEFPIXEL);
+ HBPP = 1;
+ while((FX_DWORD)(1 << HBPP) < HNUMPATS) {
+ HBPP ++;
+ }
+ JBIG2_ALLOC(pGID, CJBig2_GSIDProc());
+ pGID->GSMMR = HMMR;
+ pGID->GSW = HGW;
+ pGID->GSH = HGH;
+ pGID->GSBPP = (FX_BYTE)HBPP;
+ pGID->GSUSESKIP = 0;
+ GI = pGID->decode_MMR(pStream, pPause);
+ if(GI == NULL) {
+ goto failed;
+ }
+ for(mg = 0; mg < HGH; mg++) {
+ for(ng = 0; ng < HGW; ng++) {
+ x = (HGX + mg * HRY + ng * HRX) >> 8;
+ y = (HGY + mg * HRX - ng * HRY) >> 8;
+ FX_DWORD pat_index = GI[mg * HGW + ng];
+ if (pat_index >= HNUMPATS) {
+ pat_index = HNUMPATS - 1;
+ }
+ HTREG->composeFrom(x, y, HPATS[pat_index], HCOMBOP);
+ }
+ }
+ m_pModule->JBig2_Free(GI);
+ delete pGID;
+ return HTREG;
+failed:
+ delete pGID;
+ delete HTREG;
+ return NULL;
+}
+CJBig2_PatternDict *CJBig2_PDDProc::decode_Arith(CJBig2_ArithDecoder *pArithDecoder,
+ JBig2ArithCtx *gbContext, IFX_Pause* pPause)
+{
+ FX_DWORD GRAY;
+ CJBig2_Image *BHDC = NULL;
+ CJBig2_PatternDict *pDict;
+ CJBig2_GRDProc *pGRD;
+ JBIG2_ALLOC(pDict, CJBig2_PatternDict());
+ pDict->NUMPATS = GRAYMAX + 1;
+ pDict->HDPATS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(sizeof(CJBig2_Image*), pDict->NUMPATS);
+ JBIG2_memset(pDict->HDPATS, 0, sizeof(CJBig2_Image*)*pDict->NUMPATS);
+ JBIG2_ALLOC(pGRD, CJBig2_GRDProc());
+ pGRD->MMR = HDMMR;
+ pGRD->GBW = (GRAYMAX + 1) * HDPW;
+ pGRD->GBH = HDPH;
+ pGRD->GBTEMPLATE = HDTEMPLATE;
+ pGRD->TPGDON = 0;
+ pGRD->USESKIP = 0;
+ pGRD->GBAT[0] = -(FX_INT32)HDPW;
+ pGRD->GBAT[1] = 0;
+ if(pGRD->GBTEMPLATE == 0) {
+ pGRD->GBAT[2] = -3;
+ pGRD->GBAT[3] = -1;
+ pGRD->GBAT[4] = 2;
+ pGRD->GBAT[5] = -2;
+ pGRD->GBAT[6] = -2;
+ pGRD->GBAT[7] = -2;
+ }
+ FXCODEC_STATUS status = pGRD->Start_decode_Arith(&BHDC, pArithDecoder, gbContext);
+ while(status == FXCODEC_STATUS_DECODE_TOBECONTINUE) {
+ pGRD->Continue_decode(pPause);
+ }
+ if(BHDC == NULL) {
+ delete pGRD;
+ goto failed;
+ }
+ delete pGRD;
+ GRAY = 0;
+ while(GRAY <= GRAYMAX) {
+ pDict->HDPATS[GRAY] = BHDC->subImage(HDPW * GRAY, 0, HDPW, HDPH);
+ GRAY = GRAY + 1;
+ }
+ delete BHDC;
+ return pDict;
+failed:
+ delete pDict;
+ return NULL;
+}
+
+CJBig2_PatternDict *CJBig2_PDDProc::decode_MMR(CJBig2_BitStream *pStream, IFX_Pause* pPause)
+{
+ FX_DWORD GRAY;
+ CJBig2_Image *BHDC = NULL;
+ CJBig2_PatternDict *pDict;
+ CJBig2_GRDProc *pGRD;
+ JBIG2_ALLOC(pDict, CJBig2_PatternDict());
+ pDict->NUMPATS = GRAYMAX + 1;
+ pDict->HDPATS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(sizeof(CJBig2_Image*), pDict->NUMPATS);
+ JBIG2_memset(pDict->HDPATS, 0, sizeof(CJBig2_Image*)*pDict->NUMPATS);
+ JBIG2_ALLOC(pGRD, CJBig2_GRDProc());
+ pGRD->MMR = HDMMR;
+ pGRD->GBW = (GRAYMAX + 1) * HDPW;
+ pGRD->GBH = HDPH;
+ FXCODEC_STATUS status = pGRD->Start_decode_MMR(&BHDC, pStream);
+ while(status == FXCODEC_STATUS_DECODE_TOBECONTINUE) {
+ pGRD->Continue_decode(pPause);
+ }
+ if(BHDC == NULL) {
+ delete pGRD;
+ goto failed;
+ }
+ delete pGRD;
+ GRAY = 0;
+ while(GRAY <= GRAYMAX) {
+ pDict->HDPATS[GRAY] = BHDC->subImage(HDPW * GRAY, 0, HDPW, HDPH);
+ GRAY = GRAY + 1;
+ }
+ delete BHDC;
+ return pDict;
+failed:
+ delete pDict;
+ return NULL;
+}
+FX_DWORD *CJBig2_GSIDProc::decode_Arith(CJBig2_ArithDecoder *pArithDecoder,
+ JBig2ArithCtx *gbContext, IFX_Pause* pPause)
+{
+ CJBig2_Image **GSPLANES;
+ FX_INT32 J, K;
+ FX_DWORD x, y;
+ FX_DWORD *GSVALS;
+ CJBig2_GRDProc *pGRD;
+ GSPLANES = (CJBig2_Image **)m_pModule->JBig2_Malloc2(sizeof(CJBig2_Image*), GSBPP);
+ if (!GSPLANES) {
+ return NULL;
+ }
+ GSVALS = (FX_DWORD*)m_pModule->JBig2_Malloc3(sizeof(FX_DWORD), GSW, GSH);
+ if (!GSVALS) {
+ m_pModule->JBig2_Free(GSPLANES);
+ return NULL;
+ }
+ JBIG2_memset(GSPLANES, 0, sizeof(CJBig2_Image*)*GSBPP);
+ JBIG2_memset(GSVALS, 0, sizeof(FX_DWORD)*GSW * GSH);
+ JBIG2_ALLOC(pGRD, CJBig2_GRDProc());
+ pGRD->MMR = GSMMR;
+ pGRD->GBW = GSW;
+ pGRD->GBH = GSH;
+ pGRD->GBTEMPLATE = GSTEMPLATE;
+ pGRD->TPGDON = 0;
+ pGRD->USESKIP = GSUSESKIP;
+ pGRD->SKIP = GSKIP;
+ if(GSTEMPLATE <= 1) {
+ pGRD->GBAT[0] = 3;
+ } else {
+ pGRD->GBAT[0] = 2;
+ }
+ pGRD->GBAT[1] = -1;
+ if(pGRD->GBTEMPLATE == 0) {
+ pGRD->GBAT[2] = -3;
+ pGRD->GBAT[3] = -1;
+ pGRD->GBAT[4] = 2;
+ pGRD->GBAT[5] = -2;
+ pGRD->GBAT[6] = -2;
+ pGRD->GBAT[7] = -2;
+ }
+ FXCODEC_STATUS status = pGRD->Start_decode_Arith(&GSPLANES[GSBPP - 1], pArithDecoder, gbContext);
+ while(status == FXCODEC_STATUS_DECODE_TOBECONTINUE) {
+ pGRD->Continue_decode(pPause);
+ }
+ if(GSPLANES[GSBPP - 1] == NULL) {
+ goto failed;
+ }
+ J = GSBPP - 2;
+ while(J >= 0) {
+ FXCODEC_STATUS status = pGRD->Start_decode_Arith(&GSPLANES[J], pArithDecoder, gbContext);
+ while(status == FXCODEC_STATUS_DECODE_TOBECONTINUE) {
+ pGRD->Continue_decode(pPause);
+ }
+ if(GSPLANES[J] == NULL) {
+ for(K = GSBPP - 1; K > J; K--) {
+ delete GSPLANES[K];
+ goto failed;
+ }
+ }
+ GSPLANES[J]->composeFrom(0, 0, GSPLANES[J + 1], JBIG2_COMPOSE_XOR);
+ J = J - 1;
+ }
+ for(y = 0; y < GSH; y++) {
+ for(x = 0; x < GSW; x++) {
+ for(J = 0; J < GSBPP; J++) {
+ GSVALS[y * GSW + x] |= GSPLANES[J]->getPixel(x, y) << J;
+ }
+ }
+ }
+ for(J = 0; J < GSBPP; J++) {
+ delete GSPLANES[J];
+ }
+ m_pModule->JBig2_Free(GSPLANES);
+ delete pGRD;
+ return GSVALS;
+failed:
+ m_pModule->JBig2_Free(GSPLANES);
+ delete pGRD;
+ m_pModule->JBig2_Free(GSVALS);
+ return NULL;
+}
+FX_DWORD *CJBig2_GSIDProc::decode_MMR(CJBig2_BitStream *pStream, IFX_Pause* pPause)
+{
+ CJBig2_Image **GSPLANES;
+ FX_INT32 J, K;
+ FX_DWORD x, y;
+ FX_DWORD *GSVALS;
+ CJBig2_GRDProc *pGRD;
+ GSPLANES = (CJBig2_Image **)m_pModule->JBig2_Malloc2(sizeof(CJBig2_Image*), GSBPP);
+ if (!GSPLANES) {
+ return NULL;
+ }
+ GSVALS = (FX_DWORD*)m_pModule->JBig2_Malloc3(sizeof(FX_DWORD), GSW, GSH);
+ if (!GSVALS) {
+ if (GSPLANES) {
+ m_pModule->JBig2_Free(GSPLANES);
+ }
+ return NULL;
+ }
+ JBIG2_memset(GSPLANES, 0, sizeof(CJBig2_Image*)*GSBPP);
+ JBIG2_memset(GSVALS, 0, sizeof(FX_DWORD)*GSW * GSH);
+ JBIG2_ALLOC(pGRD, CJBig2_GRDProc());
+ pGRD->MMR = GSMMR;
+ pGRD->GBW = GSW;
+ pGRD->GBH = GSH;
+ FXCODEC_STATUS status = pGRD->Start_decode_MMR(&GSPLANES[GSBPP - 1], pStream);
+ while(status == FXCODEC_STATUS_DECODE_TOBECONTINUE) {
+ pGRD->Continue_decode(pPause);
+ }
+ if(GSPLANES[GSBPP - 1] == NULL) {
+ goto failed;
+ }
+ pStream->alignByte();
+ pStream->offset(3);
+ J = GSBPP - 2;
+ while(J >= 0) {
+ FXCODEC_STATUS status = pGRD->Start_decode_MMR(&GSPLANES[J], pStream);
+ while(status == FXCODEC_STATUS_DECODE_TOBECONTINUE) {
+ pGRD->Continue_decode(pPause);
+ }
+ if(GSPLANES[J] == NULL) {
+ for(K = GSBPP - 1; K > J; K--) {
+ delete GSPLANES[K];
+ goto failed;
+ }
+ }
+ pStream->alignByte();
+ pStream->offset(3);
+ GSPLANES[J]->composeFrom(0, 0, GSPLANES[J + 1], JBIG2_COMPOSE_XOR);
+ J = J - 1;
+ }
+ for(y = 0; y < GSH; y++) {
+ for(x = 0; x < GSW; x++) {
+ for(J = 0; J < GSBPP; J++) {
+ GSVALS[y * GSW + x] |= GSPLANES[J]->getPixel(x, y) << J;
+ }
+ }
+ }
+ for(J = 0; J < GSBPP; J++) {
+ delete GSPLANES[J];
+ }
+ m_pModule->JBig2_Free(GSPLANES);
+ delete pGRD;
+ return GSVALS;
+failed:
+ m_pModule->JBig2_Free(GSPLANES);
+ delete pGRD;
+ m_pModule->JBig2_Free(GSVALS);
+ return NULL;
+}
+FXCODEC_STATUS CJBig2_GRDProc::Start_decode_Arith(CJBig2_Image** pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause)
+{
+ if (GBW == 0 || GBH == 0) {
+ m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;
+ return FXCODEC_STATUS_DECODE_FINISH;
+ }
+ m_ProssiveStatus = FXCODEC_STATUS_DECODE_READY;
+ m_pPause = pPause;
+ if(*pImage == NULL) {
+ JBIG2_ALLOC((*pImage), CJBig2_Image(GBW, GBH));
+ }
+ if ((*pImage)->m_pData == NULL) {
+ delete *pImage;
+ *pImage = NULL;
+ m_pModule->JBig2_Error("Generic region decoding procedure: Create Image Failed with width = %d, height = %d\n", GBW, GBH);
+ m_ProssiveStatus = FXCODEC_STATUS_ERROR;
+ return FXCODEC_STATUS_ERROR;
+ }
+ m_DecodeType = 1;
+ m_pImage = pImage;
+ (*m_pImage)->fill(0);
+ m_pArithDecoder = pArithDecoder;
+ m_gbContext = gbContext;
+ LTP = 0;
+ m_pLine = NULL;
+ m_loopIndex = 0;
+ return decode_Arith(pPause);
+}
+FXCODEC_STATUS CJBig2_GRDProc::decode_Arith(IFX_Pause* pPause)
+{
+ int iline = m_loopIndex;
+ CJBig2_Image* pImage = *m_pImage;
+ if(GBTEMPLATE == 0) {
+ if((GBAT[0] == 3) && (GBAT[1] == (signed char) - 1)
+ && (GBAT[2] == (signed char) - 3) && (GBAT[3] == (signed char) - 1)
+ && (GBAT[4] == 2) && (GBAT[5] == (signed char) - 2)
+ && (GBAT[6] == (signed char) - 2) && (GBAT[7] == (signed char) - 2)) {
+ m_ProssiveStatus = decode_Arith_Template0_opt3(pImage, m_pArithDecoder, m_gbContext, pPause);
+ } else {
+ m_ProssiveStatus = decode_Arith_Template0_unopt(pImage, m_pArithDecoder, m_gbContext, pPause);
+ }
+ } else if(GBTEMPLATE == 1) {
+ if((GBAT[0] == 3) && (GBAT[1] == (signed char) - 1)) {
+ m_ProssiveStatus = decode_Arith_Template1_opt3(pImage, m_pArithDecoder, m_gbContext, pPause);
+ } else {
+ m_ProssiveStatus = decode_Arith_Template1_unopt(pImage, m_pArithDecoder, m_gbContext, pPause);
+ }
+ } else if(GBTEMPLATE == 2) {
+ if((GBAT[0] == 2) && (GBAT[1] == (signed char) - 1)) {
+ m_ProssiveStatus = decode_Arith_Template2_opt3(pImage, m_pArithDecoder, m_gbContext, pPause);
+ } else {
+ m_ProssiveStatus = decode_Arith_Template2_unopt(pImage, m_pArithDecoder, m_gbContext, pPause);
+ }
+ } else {
+ if((GBAT[0] == 2) && (GBAT[1] == (signed char) - 1)) {
+ m_ProssiveStatus = decode_Arith_Template3_opt3(pImage, m_pArithDecoder, m_gbContext, pPause);
+ } else {
+ m_ProssiveStatus = decode_Arith_Template3_unopt(pImage, m_pArithDecoder, m_gbContext, pPause);
+ }
+ }
+ m_ReplaceRect.left = 0;
+ m_ReplaceRect.right = pImage->m_nWidth;
+ m_ReplaceRect.top = iline;
+ m_ReplaceRect.bottom = m_loopIndex;
+ if(m_ProssiveStatus == FXCODEC_STATUS_DECODE_FINISH) {
+ m_loopIndex = 0;
+ }
+ return m_ProssiveStatus;
+}
+FXCODEC_STATUS CJBig2_GRDProc::Start_decode_Arith_V2(CJBig2_Image** pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause)
+{
+ if(GBW == 0 || GBH == 0) {
+ * pImage = NULL;
+ m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;
+ return FXCODEC_STATUS_DECODE_FINISH;
+ }
+ if(*pImage == NULL) {
+ JBIG2_ALLOC((*pImage), CJBig2_Image(GBW, GBH));
+ }
+ if ((*pImage)->m_pData == NULL) {
+ delete *pImage;
+ *pImage = NULL;
+ m_pModule->JBig2_Error("Generic region decoding procedure: Create Image Failed with width = %d, height = %d\n", GBW, GBH);
+ m_ProssiveStatus = FXCODEC_STATUS_ERROR;
+ return FXCODEC_STATUS_ERROR;
+ }
+ m_ProssiveStatus = FXCODEC_STATUS_DECODE_READY;
+ m_DecodeType = 2;
+ m_pPause = pPause;
+ m_pImage = pImage;
+ (*m_pImage)->fill(0);
+ LTP = 0;
+ m_loopIndex = 0;
+ m_pArithDecoder = pArithDecoder;
+ m_gbContext = gbContext;
+ return decode_Arith_V2(pPause);
+}
+FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_V2(IFX_Pause* pPause)
+{
+ FX_BOOL SLTP, bVal;
+ FX_DWORD CONTEXT;
+ CJBig2_Image *GBREG = *m_pImage;
+ FX_DWORD line1, line2, line3;
+ LTP = 0;
+ JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
+ GBREG->fill(0);
+ for(; m_loopIndex < GBH; m_loopIndex++) {
+ if(TPGDON) {
+ switch(GBTEMPLATE) {
+ case 0:
+ CONTEXT = 0x9b25;
+ break;
+ case 1:
+ CONTEXT = 0x0795;
+ break;
+ case 2:
+ CONTEXT = 0x00e5;
+ break;
+ case 3:
+ CONTEXT = 0x0195;
+ break;
+ }
+ SLTP = m_pArithDecoder->DECODE(&m_gbContext[CONTEXT]);
+ LTP = LTP ^ SLTP;
+ }
+ if(LTP == 1) {
+ GBREG->copyLine(m_loopIndex, m_loopIndex - 1);
+ } else {
+ switch(GBTEMPLATE) {
+ case 0: {
+ line1 = GBREG->getPixel(1, m_loopIndex - 2);
+ line1 |= GBREG->getPixel(0, m_loopIndex - 2) << 1;
+ line2 = GBREG->getPixel(2, m_loopIndex - 1);
+ line2 |= GBREG->getPixel(1, m_loopIndex - 1) << 1;
+ line2 |= GBREG->getPixel(0, m_loopIndex - 1) << 2;
+ line3 = 0;
+ for(FX_DWORD w = 0; w < GBW; w++) {
+ if(USESKIP && SKIP->getPixel(w, m_loopIndex)) {
+ bVal = 0;
+ } else {
+ CONTEXT = line3;
+ CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) << 4;
+ CONTEXT |= line2 << 5;
+ CONTEXT |= GBREG->getPixel(w + GBAT[2], m_loopIndex + GBAT[3]) << 10;
+ CONTEXT |= GBREG->getPixel(w + GBAT[4], m_loopIndex + GBAT[5]) << 11;
+ CONTEXT |= line1 << 12;
+ CONTEXT |= GBREG->getPixel(w + GBAT[6], m_loopIndex + GBAT[7]) << 15;
+ bVal = m_pArithDecoder->DECODE(&m_gbContext[CONTEXT]);
+ }
+ if(bVal) {
+ GBREG->setPixel(w, m_loopIndex, bVal);
+ }
+ line1 = ((line1 << 1) | GBREG->getPixel(w + 2, m_loopIndex - 2)) & 0x07;
+ line2 = ((line2 << 1) | GBREG->getPixel(w + 3, m_loopIndex - 1)) & 0x1f;
+ line3 = ((line3 << 1) | bVal) & 0x0f;
+ }
+ }
+ break;
+ case 1: {
+ line1 = GBREG->getPixel(2, m_loopIndex - 2);
+ line1 |= GBREG->getPixel(1, m_loopIndex - 2) << 1;
+ line1 |= GBREG->getPixel(0, m_loopIndex - 2) << 2;
+ line2 = GBREG->getPixel(2, m_loopIndex - 1);
+ line2 |= GBREG->getPixel(1, m_loopIndex - 1) << 1;
+ line2 |= GBREG->getPixel(0, m_loopIndex - 1) << 2;
+ line3 = 0;
+ for(FX_DWORD w = 0; w < GBW; w++) {
+ if(USESKIP && SKIP->getPixel(w, m_loopIndex)) {
+ bVal = 0;
+ } else {
+ CONTEXT = line3;
+ CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) << 3;
+ CONTEXT |= line2 << 4;
+ CONTEXT |= line1 << 9;
+ bVal = m_pArithDecoder->DECODE(&m_gbContext[CONTEXT]);
+ }
+ if(bVal) {
+ GBREG->setPixel(w, m_loopIndex, bVal);
+ }
+ line1 = ((line1 << 1) | GBREG->getPixel(w + 3, m_loopIndex - 2)) & 0x0f;
+ line2 = ((line2 << 1) | GBREG->getPixel(w + 3, m_loopIndex - 1)) & 0x1f;
+ line3 = ((line3 << 1) | bVal) & 0x07;
+ }
+ }
+ break;
+ case 2: {
+ line1 = GBREG->getPixel(1, m_loopIndex - 2);
+ line1 |= GBREG->getPixel(0, m_loopIndex - 2) << 1;
+ line2 = GBREG->getPixel(1, m_loopIndex - 1);
+ line2 |= GBREG->getPixel(0, m_loopIndex - 1) << 1;
+ line3 = 0;
+ for(FX_DWORD w = 0; w < GBW; w++) {
+ if(USESKIP && SKIP->getPixel(w, m_loopIndex)) {
+ bVal = 0;
+ } else {
+ CONTEXT = line3;
+ CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) << 2;
+ CONTEXT |= line2 << 3;
+ CONTEXT |= line1 << 7;
+ bVal = m_pArithDecoder->DECODE(&m_gbContext[CONTEXT]);
+ }
+ if(bVal) {
+ GBREG->setPixel(w, m_loopIndex, bVal);
+ }
+ line1 = ((line1 << 1) | GBREG->getPixel(w + 2, m_loopIndex - 2)) & 0x07;
+ line2 = ((line2 << 1) | GBREG->getPixel(w + 2, m_loopIndex - 1)) & 0x0f;
+ line3 = ((line3 << 1) | bVal) & 0x03;
+ }
+ }
+ break;
+ case 3: {
+ line1 = GBREG->getPixel(1, m_loopIndex - 1);
+ line1 |= GBREG->getPixel(0, m_loopIndex - 1) << 1;
+ line2 = 0;
+ for(FX_DWORD w = 0; w < GBW; w++) {
+ if(USESKIP && SKIP->getPixel(w, m_loopIndex)) {
+ bVal = 0;
+ } else {
+ CONTEXT = line2;
+ CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) << 4;
+ CONTEXT |= line1 << 5;
+ bVal = m_pArithDecoder->DECODE(&m_gbContext[CONTEXT]);
+ }
+ if(bVal) {
+ GBREG->setPixel(w, m_loopIndex, bVal);
+ }
+ line1 = ((line1 << 1) | GBREG->getPixel(w + 2, m_loopIndex - 1)) & 0x1f;
+ line2 = ((line2 << 1) | bVal) & 0x0f;
+ }
+ }
+ break;
+ }
+ }
+ if(pPause && pPause->NeedToPauseNow()) {
+ m_loopIndex ++;
+ m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;
+ return FXCODEC_STATUS_DECODE_TOBECONTINUE;
+ }
+ }
+ m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;
+ return FXCODEC_STATUS_DECODE_FINISH;
+}
+FXCODEC_STATUS CJBig2_GRDProc::Start_decode_Arith_V1(CJBig2_Image** pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause)
+{
+ if(GBW == 0 || GBH == 0) {
+ * pImage = NULL;
+ m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;
+ return FXCODEC_STATUS_DECODE_FINISH;
+ }
+ if(*pImage == NULL) {
+ JBIG2_ALLOC((*pImage), CJBig2_Image(GBW, GBH));
+ }
+ if ((*pImage)->m_pData == NULL) {
+ delete *pImage;
+ *pImage = NULL;
+ m_pModule->JBig2_Error("Generic region decoding procedure: Create Image Failed with width = %d, height = %d\n", GBW, GBH);
+ m_ProssiveStatus = FXCODEC_STATUS_ERROR;
+ return FXCODEC_STATUS_ERROR;
+ }
+ m_ProssiveStatus = FXCODEC_STATUS_DECODE_READY;
+ m_pPause = pPause;
+ m_pImage = pImage;
+ m_DecodeType = 3;
+ (*m_pImage)->fill(0);
+ LTP = 0;
+ m_loopIndex = 0;
+ m_pArithDecoder = pArithDecoder;
+ m_gbContext = gbContext;
+ return decode_Arith_V1(pPause);
+}
+FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_V1(IFX_Pause* pPause)
+{
+ FX_BOOL SLTP, bVal;
+ FX_DWORD CONTEXT = 0;
+ CJBig2_Image *GBREG = (*m_pImage);
+ for(; m_loopIndex < GBH; m_loopIndex++) {
+ if(TPGDON) {
+ switch(GBTEMPLATE) {
+ case 0:
+ CONTEXT = 0x9b25;
+ break;
+ case 1:
+ CONTEXT = 0x0795;
+ break;
+ case 2:
+ CONTEXT = 0x00e5;
+ break;
+ case 3:
+ CONTEXT = 0x0195;
+ break;
+ }
+ SLTP = m_pArithDecoder->DECODE(&m_gbContext[CONTEXT]);
+ LTP = LTP ^ SLTP;
+ }
+ if(LTP == 1) {
+ for(FX_DWORD w = 0; w < GBW; w++) {
+ GBREG->setPixel(w, m_loopIndex, GBREG->getPixel(w, m_loopIndex - 1));
+ }
+ } else {
+ for(FX_DWORD w = 0; w < GBW; w++) {
+ if(USESKIP && SKIP->getPixel(w, m_loopIndex)) {
+ GBREG->setPixel(w, m_loopIndex, 0);
+ } else {
+ CONTEXT = 0;
+ switch(GBTEMPLATE) {
+ case 0:
+ CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex);
+ CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex) << 1;
+ CONTEXT |= GBREG->getPixel(w - 3, m_loopIndex) << 2;
+ CONTEXT |= GBREG->getPixel(w - 4, m_loopIndex) << 3;
+ CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) << 4;
+ CONTEXT |= GBREG->getPixel(w + 2, m_loopIndex - 1) << 5;
+ CONTEXT |= GBREG->getPixel(w + 1, m_loopIndex - 1) << 6;
+ CONTEXT |= GBREG->getPixel(w, m_loopIndex - 1) << 7;
+ CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex - 1) << 8;
+ CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex - 1) << 9;
+ CONTEXT |= GBREG->getPixel(w + GBAT[2], m_loopIndex + GBAT[3]) << 10;
+ CONTEXT |= GBREG->getPixel(w + GBAT[4], m_loopIndex + GBAT[5]) << 11;
+ CONTEXT |= GBREG->getPixel(w + 1, m_loopIndex - 2) << 12;
+ CONTEXT |= GBREG->getPixel(w, m_loopIndex - 2) << 13;
+ CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex - 2) << 14;
+ CONTEXT |= GBREG->getPixel(w + GBAT[6], m_loopIndex + GBAT[7]) << 15;
+ break;
+ case 1:
+ CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex);
+ CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex) << 1;
+ CONTEXT |= GBREG->getPixel(w - 3, m_loopIndex) << 2;
+ CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) << 3;
+ CONTEXT |= GBREG->getPixel(w + 2, m_loopIndex - 1) << 4;
+ CONTEXT |= GBREG->getPixel(w + 1, m_loopIndex - 1) << 5;
+ CONTEXT |= GBREG->getPixel(w, m_loopIndex - 1) << 6;
+ CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex - 1) << 7;
+ CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex - 1) << 8;
+ CONTEXT |= GBREG->getPixel(w + 2, m_loopIndex - 2) << 9;
+ CONTEXT |= GBREG->getPixel(w + 1, m_loopIndex - 2) << 10;
+ CONTEXT |= GBREG->getPixel(w, m_loopIndex - 2) << 11;
+ CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex - 2) << 12;
+ break;
+ case 2:
+ CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex);
+ CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex) << 1;
+ CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) << 2;
+ CONTEXT |= GBREG->getPixel(w + 1, m_loopIndex - 1) << 3;
+ CONTEXT |= GBREG->getPixel(w, m_loopIndex - 1) << 4;
+ CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex - 1) << 5;
+ CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex - 1) << 6;
+ CONTEXT |= GBREG->getPixel(w + 1, m_loopIndex - 2) << 7;
+ CONTEXT |= GBREG->getPixel(w, m_loopIndex - 2) << 8;
+ CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex - 2) << 9;
+ break;
+ case 3:
+ CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex);
+ CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex) << 1;
+ CONTEXT |= GBREG->getPixel(w - 3, m_loopIndex) << 2;
+ CONTEXT |= GBREG->getPixel(w - 4, m_loopIndex) << 3;
+ CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) << 4;
+ CONTEXT |= GBREG->getPixel(w + 1, m_loopIndex - 1) << 5;
+ CONTEXT |= GBREG->getPixel(w, m_loopIndex - 1) << 6;
+ CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex - 1) << 7;
+ CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex - 1) << 8;
+ CONTEXT |= GBREG->getPixel(w - 3, m_loopIndex - 1) << 9;
+ break;
+ }
+ bVal = m_pArithDecoder->DECODE(&m_gbContext[CONTEXT]);
+ GBREG->setPixel(w, m_loopIndex, bVal);
+ }
+ }
+ }
+ if(pPause && pPause->NeedToPauseNow()) {
+ m_loopIndex ++;
+ m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;
+ return FXCODEC_STATUS_DECODE_TOBECONTINUE;
+ }
+ }
+ m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;
+ return FXCODEC_STATUS_DECODE_FINISH;
+}
+FXCODEC_STATUS CJBig2_GRDProc::Start_decode_MMR(CJBig2_Image** pImage, CJBig2_BitStream *pStream, IFX_Pause* pPause)
+{
+ int bitpos, i;
+ JBIG2_ALLOC((* pImage), CJBig2_Image(GBW, GBH));
+ if ((* pImage)->m_pData == NULL) {
+ delete (* pImage);
+ (* pImage) = NULL;
+ m_pModule->JBig2_Error("Generic region decoding procedure: Create Image Failed with width = %d, height = %d\n", GBW, GBH);
+ m_ProssiveStatus = FXCODEC_STATUS_ERROR;
+ return m_ProssiveStatus;
+ }
+ bitpos = (int)pStream->getBitPos();
+ _FaxG4Decode(m_pModule, pStream->getBuf(), pStream->getLength(), &bitpos, (* pImage)->m_pData, GBW, GBH, (* pImage)->m_nStride);
+ pStream->setBitPos(bitpos);
+ for(i = 0; (FX_DWORD)i < (* pImage)->m_nStride * GBH; i++) {
+ (* pImage)->m_pData[i] = ~(* pImage)->m_pData[i];
+ }
+ m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;
+ return m_ProssiveStatus;
+}
+FXCODEC_STATUS CJBig2_GRDProc::decode_MMR()
+{
+ return m_ProssiveStatus;
+}
+FXCODEC_STATUS CJBig2_GRDProc::Continue_decode(IFX_Pause* pPause)
+{
+ if(m_ProssiveStatus != FXCODEC_STATUS_DECODE_TOBECONTINUE) {
+ return m_ProssiveStatus;
+ }
+ switch (m_DecodeType) {
+ case 1:
+ return decode_Arith(pPause);
+ case 2:
+ return decode_Arith_V2(pPause);
+ case 3:
+ return decode_Arith_V1(pPause);
+ case 4:
+ return decode_MMR();
+ }
+ m_ProssiveStatus = FXCODEC_STATUS_ERROR;
+ return m_ProssiveStatus;
+}
+FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template0_opt3(CJBig2_Image *pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause)
+{
+ FX_BOOL SLTP, bVal;
+ FX_DWORD CONTEXT;
+ FX_DWORD line1, line2;
+ FX_BYTE *pLine1, *pLine2, cVal;
+ FX_INT32 nStride, nStride2, k;
+ FX_INT32 nLineBytes, nBitsLeft, cc;
+ if(m_pLine == NULL) {
+ m_pLine = pImage->m_pData;
+ }
+ nStride = pImage->m_nStride;
+ nStride2 = nStride << 1;
+ nLineBytes = ((GBW + 7) >> 3) - 1;
+ nBitsLeft = GBW - (nLineBytes << 3);
+ FX_DWORD height = GBH & 0x7fffffff;
+ for(; m_loopIndex < height; m_loopIndex++) {
+ if(TPGDON) {
+ SLTP = pArithDecoder->DECODE(&gbContext[0x9b25]);
+ LTP = LTP ^ SLTP;
+ }
+ if(LTP == 1) {
+ pImage->copyLine(m_loopIndex, m_loopIndex - 1);
+ } else {
+ if(m_loopIndex > 1) {
+ pLine1 = m_pLine - nStride2;
+ pLine2 = m_pLine - nStride;
+ line1 = (*pLine1++) << 6;
+ line2 = *pLine2++;
+ CONTEXT = ((line1 & 0xf800) | (line2 & 0x07f0));
+ for(cc = 0; cc < nLineBytes; cc++) {
+ line1 = (line1 << 8) | ((*pLine1++) << 6);
+ line2 = (line2 << 8) | (*pLine2++);
+ cVal = 0;
+ for(k = 7; k >= 0; k--) {
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ cVal |= bVal << k;
+ CONTEXT = (((CONTEXT & 0x7bf7) << 1) | bVal
+ | ((line1 >> k) & 0x0800)
+ | ((line2 >> k) & 0x0010));
+ }
+ m_pLine[cc] = cVal;
+ }
+ line1 <<= 8;
+ line2 <<= 8;
+ cVal = 0;
+ for(k = 0; k < nBitsLeft; k++) {
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ cVal |= bVal << (7 - k);
+ CONTEXT = (((CONTEXT & 0x7bf7) << 1) | bVal
+ | ((line1 >> (7 - k)) & 0x0800)
+ | ((line2 >> (7 - k)) & 0x0010));
+ }
+ m_pLine[nLineBytes] = cVal;
+ } else {
+ pLine2 = m_pLine - nStride;
+ line2 = (m_loopIndex & 1) ? (*pLine2++) : 0;
+ CONTEXT = (line2 & 0x07f0);
+ for(cc = 0; cc < nLineBytes; cc++) {
+ if(m_loopIndex & 1) {
+ line2 = (line2 << 8) | (*pLine2++);
+ }
+ cVal = 0;
+ for(k = 7; k >= 0; k--) {
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ cVal |= bVal << k;
+ CONTEXT = (((CONTEXT & 0x7bf7) << 1) | bVal
+ | ((line2 >> k) & 0x0010));
+ }
+ m_pLine[cc] = cVal;
+ }
+ line2 <<= 8;
+ cVal = 0;
+ for(k = 0; k < nBitsLeft; k++) {
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ cVal |= bVal << (7 - k);
+ CONTEXT = (((CONTEXT & 0x7bf7) << 1) | bVal
+ | ((line2 >> (7 - k)) & 0x0010));
+ }
+ m_pLine[nLineBytes] = cVal;
+ }
+ }
+ m_pLine += nStride;
+ if(pPause && pPause->NeedToPauseNow()) {
+ m_loopIndex++;
+ m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;
+ return FXCODEC_STATUS_DECODE_TOBECONTINUE;
+ }
+ }
+ m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;
+ return FXCODEC_STATUS_DECODE_FINISH;
+}
+FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template0_unopt(CJBig2_Image * pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause)
+{
+ FX_BOOL SLTP, bVal;
+ FX_DWORD CONTEXT;
+ FX_DWORD line1, line2, line3;
+ for(; m_loopIndex < GBH; m_loopIndex++) {
+ if(TPGDON) {
+ SLTP = pArithDecoder->DECODE(&gbContext[0x9b25]);
+ LTP = LTP ^ SLTP;
+ }
+ if(LTP == 1) {
+ pImage->copyLine(m_loopIndex, m_loopIndex - 1);
+ } else {
+ line1 = pImage->getPixel(1, m_loopIndex - 2);
+ line1 |= pImage->getPixel(0, m_loopIndex - 2) << 1;
+ line2 = pImage->getPixel(2, m_loopIndex - 1);
+ line2 |= pImage->getPixel(1, m_loopIndex - 1) << 1;
+ line2 |= pImage->getPixel(0, m_loopIndex - 1) << 2;
+ line3 = 0;
+ for(FX_DWORD w = 0; w < GBW; w++) {
+ if(USESKIP && SKIP->getPixel(w, m_loopIndex)) {
+ bVal = 0;
+ } else {
+ CONTEXT = line3;
+ CONTEXT |= pImage->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) << 4;
+ CONTEXT |= line2 << 5;
+ CONTEXT |= pImage->getPixel(w + GBAT[2], m_loopIndex + GBAT[3]) << 10;
+ CONTEXT |= pImage->getPixel(w + GBAT[4], m_loopIndex + GBAT[5]) << 11;
+ CONTEXT |= line1 << 12;
+ CONTEXT |= pImage->getPixel(w + GBAT[6], m_loopIndex + GBAT[7]) << 15;
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ }
+ if(bVal) {
+ pImage->setPixel(w, m_loopIndex, bVal);
+ }
+ line1 = ((line1 << 1) | pImage->getPixel(w + 2, m_loopIndex - 2)) & 0x07;
+ line2 = ((line2 << 1) | pImage->getPixel(w + 3, m_loopIndex - 1)) & 0x1f;
+ line3 = ((line3 << 1) | bVal) & 0x0f;
+ }
+ }
+ if(pPause && pPause->NeedToPauseNow()) {
+ m_loopIndex++;
+ m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;
+ return FXCODEC_STATUS_DECODE_TOBECONTINUE;
+ }
+ }
+ m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;
+ return FXCODEC_STATUS_DECODE_FINISH;
+}
+FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template1_opt3(CJBig2_Image *pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause)
+{
+ FX_BOOL SLTP, bVal;
+ FX_DWORD CONTEXT;
+ FX_DWORD line1, line2;
+ FX_BYTE *pLine1, *pLine2, cVal;
+ FX_INT32 nStride, nStride2, k;
+ FX_INT32 nLineBytes, nBitsLeft, cc;
+ if (!m_pLine) {
+ m_pLine = pImage->m_pData;
+ }
+ nStride = pImage->m_nStride;
+ nStride2 = nStride << 1;
+ nLineBytes = ((GBW + 7) >> 3) - 1;
+ nBitsLeft = GBW - (nLineBytes << 3);
+ for(; m_loopIndex < GBH; m_loopIndex++) {
+ if(TPGDON) {
+ SLTP = pArithDecoder->DECODE(&gbContext[0x0795]);
+ LTP = LTP ^ SLTP;
+ }
+ if(LTP == 1) {
+ pImage->copyLine(m_loopIndex, m_loopIndex - 1);
+ } else {
+ if(m_loopIndex > 1) {
+ pLine1 = m_pLine - nStride2;
+ pLine2 = m_pLine - nStride;
+ line1 = (*pLine1++) << 4;
+ line2 = *pLine2++;
+ CONTEXT = (line1 & 0x1e00) | ((line2 >> 1) & 0x01f8);
+ for(cc = 0; cc < nLineBytes; cc++) {
+ line1 = (line1 << 8) | ((*pLine1++) << 4);
+ line2 = (line2 << 8) | (*pLine2++);
+ cVal = 0;
+ for(k = 7; k >= 0; k--) {
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ cVal |= bVal << k;
+ CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal
+ | ((line1 >> k) & 0x0200)
+ | ((line2 >> (k + 1)) & 0x0008);
+ }
+ m_pLine[cc] = cVal;
+ }
+ line1 <<= 8;
+ line2 <<= 8;
+ cVal = 0;
+ for(k = 0; k < nBitsLeft; k++) {
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ cVal |= bVal << (7 - k);
+ CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal
+ | ((line1 >> (7 - k)) & 0x0200)
+ | ((line2 >> (8 - k)) & 0x0008);
+ }
+ m_pLine[nLineBytes] = cVal;
+ } else {
+ pLine2 = m_pLine - nStride;
+ line2 = (m_loopIndex & 1) ? (*pLine2++) : 0;
+ CONTEXT = (line2 >> 1) & 0x01f8;
+ for(cc = 0; cc < nLineBytes; cc++) {
+ if(m_loopIndex & 1) {
+ line2 = (line2 << 8) | (*pLine2++);
+ }
+ cVal = 0;
+ for(k = 7; k >= 0; k--) {
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ cVal |= bVal << k;
+ CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal
+ | ((line2 >> (k + 1)) & 0x0008);
+ }
+ m_pLine[cc] = cVal;
+ }
+ line2 <<= 8;
+ cVal = 0;
+ for(k = 0; k < nBitsLeft; k++) {
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ cVal |= bVal << (7 - k);
+ CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal
+ | ((line2 >> (8 - k)) & 0x0008);
+ }
+ m_pLine[nLineBytes] = cVal;
+ }
+ }
+ m_pLine += nStride;
+ if(pPause && pPause->NeedToPauseNow()) {
+ m_loopIndex++;
+ m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;
+ return FXCODEC_STATUS_DECODE_TOBECONTINUE;
+ }
+ }
+ m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;
+ return FXCODEC_STATUS_DECODE_FINISH;
+}
+FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template1_unopt(CJBig2_Image * pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause)
+{
+ FX_BOOL SLTP, bVal;
+ FX_DWORD CONTEXT;
+ FX_DWORD line1, line2, line3;
+ for(FX_DWORD h = 0; h < GBH; h++) {
+ if(TPGDON) {
+ SLTP = pArithDecoder->DECODE(&gbContext[0x0795]);
+ LTP = LTP ^ SLTP;
+ }
+ if(LTP == 1) {
+ pImage->copyLine(h, h - 1);
+ } else {
+ line1 = pImage->getPixel(2, h - 2);
+ line1 |= pImage->getPixel(1, h - 2) << 1;
+ line1 |= pImage->getPixel(0, h - 2) << 2;
+ line2 = pImage->getPixel(2, h - 1);
+ line2 |= pImage->getPixel(1, h - 1) << 1;
+ line2 |= pImage->getPixel(0, h - 1) << 2;
+ line3 = 0;
+ for(FX_DWORD w = 0; w < GBW; w++) {
+ if(USESKIP && SKIP->getPixel(w, h)) {
+ bVal = 0;
+ } else {
+ CONTEXT = line3;
+ CONTEXT |= pImage->getPixel(w + GBAT[0], h + GBAT[1]) << 3;
+ CONTEXT |= line2 << 4;
+ CONTEXT |= line1 << 9;
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ }
+ if(bVal) {
+ pImage->setPixel(w, h, bVal);
+ }
+ line1 = ((line1 << 1) | pImage->getPixel(w + 3, h - 2)) & 0x0f;
+ line2 = ((line2 << 1) | pImage->getPixel(w + 3, h - 1)) & 0x1f;
+ line3 = ((line3 << 1) | bVal) & 0x07;
+ }
+ }
+ if(pPause && pPause->NeedToPauseNow()) {
+ m_loopIndex++;
+ m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;
+ return FXCODEC_STATUS_DECODE_TOBECONTINUE;
+ }
+ }
+ m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;
+ return FXCODEC_STATUS_DECODE_FINISH;
+}
+FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template2_opt3(CJBig2_Image *pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause)
+{
+ FX_BOOL SLTP, bVal;
+ FX_DWORD CONTEXT;
+ FX_DWORD line1, line2;
+ FX_BYTE *pLine1, *pLine2, cVal;
+ FX_INT32 nStride, nStride2, k;
+ FX_INT32 nLineBytes, nBitsLeft, cc;
+ if(!m_pLine) {
+ m_pLine = pImage->m_pData;
+ }
+ nStride = pImage->m_nStride;
+ nStride2 = nStride << 1;
+ nLineBytes = ((GBW + 7) >> 3) - 1;
+ nBitsLeft = GBW - (nLineBytes << 3);
+ for(; m_loopIndex < GBH; m_loopIndex++) {
+ if(TPGDON) {
+ SLTP = pArithDecoder->DECODE(&gbContext[0x00e5]);
+ LTP = LTP ^ SLTP;
+ }
+ if(LTP == 1) {
+ pImage->copyLine(m_loopIndex, m_loopIndex - 1);
+ } else {
+ if(m_loopIndex > 1) {
+ pLine1 = m_pLine - nStride2;
+ pLine2 = m_pLine - nStride;
+ line1 = (*pLine1++) << 1;
+ line2 = *pLine2++;
+ CONTEXT = (line1 & 0x0380) | ((line2 >> 3) & 0x007c);
+ for(cc = 0; cc < nLineBytes; cc++) {
+ line1 = (line1 << 8) | ((*pLine1++) << 1);
+ line2 = (line2 << 8) | (*pLine2++);
+ cVal = 0;
+ for(k = 7; k >= 0; k--) {
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ cVal |= bVal << k;
+ CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal
+ | ((line1 >> k) & 0x0080)
+ | ((line2 >> (k + 3)) & 0x0004);
+ }
+ m_pLine[cc] = cVal;
+ }
+ line1 <<= 8;
+ line2 <<= 8;
+ cVal = 0;
+ for(k = 0; k < nBitsLeft; k++) {
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ cVal |= bVal << (7 - k);
+ CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal
+ | ((line1 >> (7 - k)) & 0x0080)
+ | ((line2 >> (10 - k)) & 0x0004);
+ }
+ m_pLine[nLineBytes] = cVal;
+ } else {
+ pLine2 = m_pLine - nStride;
+ line2 = (m_loopIndex & 1) ? (*pLine2++) : 0;
+ CONTEXT = (line2 >> 3) & 0x007c;
+ for(cc = 0; cc < nLineBytes; cc++) {
+ if(m_loopIndex & 1) {
+ line2 = (line2 << 8) | (*pLine2++);
+ }
+ cVal = 0;
+ for(k = 7; k >= 0; k--) {
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ cVal |= bVal << k;
+ CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal
+ | ((line2 >> (k + 3)) & 0x0004);
+ }
+ m_pLine[cc] = cVal;
+ }
+ line2 <<= 8;
+ cVal = 0;
+ for(k = 0; k < nBitsLeft; k++) {
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ cVal |= bVal << (7 - k);
+ CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal
+ | (((line2 >> (10 - k))) & 0x0004);
+ }
+ m_pLine[nLineBytes] = cVal;
+ }
+ }
+ m_pLine += nStride;
+ if(pPause && m_loopIndex % 50 == 0 && pPause->NeedToPauseNow()) {
+ m_loopIndex++;
+ m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;
+ return FXCODEC_STATUS_DECODE_TOBECONTINUE;
+ }
+ }
+ m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;
+ return FXCODEC_STATUS_DECODE_FINISH;
+}
+FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template2_unopt(CJBig2_Image * pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause)
+{
+ FX_BOOL SLTP, bVal;
+ FX_DWORD CONTEXT;
+ FX_DWORD line1, line2, line3;
+ for(; m_loopIndex < GBH; m_loopIndex++) {
+ if(TPGDON) {
+ SLTP = pArithDecoder->DECODE(&gbContext[0x00e5]);
+ LTP = LTP ^ SLTP;
+ }
+ if(LTP == 1) {
+ pImage->copyLine(m_loopIndex, m_loopIndex - 1);
+ } else {
+ line1 = pImage->getPixel(1, m_loopIndex - 2);
+ line1 |= pImage->getPixel(0, m_loopIndex - 2) << 1;
+ line2 = pImage->getPixel(1, m_loopIndex - 1);
+ line2 |= pImage->getPixel(0, m_loopIndex - 1) << 1;
+ line3 = 0;
+ for(FX_DWORD w = 0; w < GBW; w++) {
+ if(USESKIP && SKIP->getPixel(w, m_loopIndex)) {
+ bVal = 0;
+ } else {
+ CONTEXT = line3;
+ CONTEXT |= pImage->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) << 2;
+ CONTEXT |= line2 << 3;
+ CONTEXT |= line1 << 7;
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ }
+ if(bVal) {
+ pImage->setPixel(w, m_loopIndex, bVal);
+ }
+ line1 = ((line1 << 1) | pImage->getPixel(w + 2, m_loopIndex - 2)) & 0x07;
+ line2 = ((line2 << 1) | pImage->getPixel(w + 2, m_loopIndex - 1)) & 0x0f;
+ line3 = ((line3 << 1) | bVal) & 0x03;
+ }
+ }
+ if(pPause && pPause->NeedToPauseNow()) {
+ m_loopIndex++;
+ m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;
+ return FXCODEC_STATUS_DECODE_TOBECONTINUE;
+ }
+ }
+ m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;
+ return FXCODEC_STATUS_DECODE_FINISH;
+}
+FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template3_opt3(CJBig2_Image *pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause)
+{
+ FX_BOOL SLTP, bVal;
+ FX_DWORD CONTEXT;
+ FX_DWORD line1;
+ FX_BYTE *pLine1, cVal;
+ FX_INT32 nStride, k;
+ FX_INT32 nLineBytes, nBitsLeft, cc;
+ if (!m_pLine) {
+ m_pLine = pImage->m_pData;
+ }
+ nStride = pImage->m_nStride;
+ nLineBytes = ((GBW + 7) >> 3) - 1;
+ nBitsLeft = GBW - (nLineBytes << 3);
+ for(; m_loopIndex < GBH; m_loopIndex++) {
+ if(TPGDON) {
+ SLTP = pArithDecoder->DECODE(&gbContext[0x0195]);
+ LTP = LTP ^ SLTP;
+ }
+ if(LTP == 1) {
+ pImage->copyLine(m_loopIndex, m_loopIndex - 1);
+ } else {
+ if(m_loopIndex > 0) {
+ pLine1 = m_pLine - nStride;
+ line1 = *pLine1++;
+ CONTEXT = (line1 >> 1) & 0x03f0;
+ for(cc = 0; cc < nLineBytes; cc++) {
+ line1 = (line1 << 8) | (*pLine1++);
+ cVal = 0;
+ for(k = 7; k >= 0; k--) {
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ cVal |= bVal << k;
+ CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal
+ | ((line1 >> (k + 1)) & 0x0010);
+ }
+ m_pLine[cc] = cVal;
+ }
+ line1 <<= 8;
+ cVal = 0;
+ for(k = 0; k < nBitsLeft; k++) {
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ cVal |= bVal << (7 - k);
+ CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal
+ | ((line1 >> (8 - k)) & 0x0010);
+ }
+ m_pLine[nLineBytes] = cVal;
+ } else {
+ CONTEXT = 0;
+ for(cc = 0; cc < nLineBytes; cc++) {
+ cVal = 0;
+ for(k = 7; k >= 0; k--) {
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ cVal |= bVal << k;
+ CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal;
+ }
+ m_pLine[cc] = cVal;
+ }
+ cVal = 0;
+ for(k = 0; k < nBitsLeft; k++) {
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ cVal |= bVal << (7 - k);
+ CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal;
+ }
+ m_pLine[nLineBytes] = cVal;
+ }
+ }
+ m_pLine += nStride;
+ if(pPause && pPause->NeedToPauseNow()) {
+ m_loopIndex++;
+ m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;
+ return FXCODEC_STATUS_DECODE_TOBECONTINUE;
+ }
+ }
+ m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;
+ return FXCODEC_STATUS_DECODE_FINISH;
+}
+FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template3_unopt(CJBig2_Image * pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause)
+{
+ FX_BOOL SLTP, bVal;
+ FX_DWORD CONTEXT;
+ FX_DWORD line1, line2;
+ for(; m_loopIndex < GBH; m_loopIndex++) {
+ if(TPGDON) {
+ SLTP = pArithDecoder->DECODE(&gbContext[0x0195]);
+ LTP = LTP ^ SLTP;
+ }
+ if(LTP == 1) {
+ pImage->copyLine(m_loopIndex, m_loopIndex - 1);
+ } else {
+ line1 = pImage->getPixel(1, m_loopIndex - 1);
+ line1 |= pImage->getPixel(0, m_loopIndex - 1) << 1;
+ line2 = 0;
+ for(FX_DWORD w = 0; w < GBW; w++) {
+ if(USESKIP && SKIP->getPixel(w, m_loopIndex)) {
+ bVal = 0;
+ } else {
+ CONTEXT = line2;
+ CONTEXT |= pImage->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) << 4;
+ CONTEXT |= line1 << 5;
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ }
+ if(bVal) {
+ pImage->setPixel(w, m_loopIndex, bVal);
+ }
+ line1 = ((line1 << 1) | pImage->getPixel(w + 2, m_loopIndex - 1)) & 0x1f;
+ line2 = ((line2 << 1) | bVal) & 0x0f;
+ }
+ }
+ if(pPause && pPause->NeedToPauseNow()) {
+ m_loopIndex++;
+ m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;
+ return FXCODEC_STATUS_DECODE_TOBECONTINUE;
+ }
+ }
+ m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;
+ return FXCODEC_STATUS_DECODE_FINISH;
+}
diff --git a/core/src/fxcodec/jbig2/JBig2_GeneralDecoder.h b/core/src/fxcodec/jbig2/JBig2_GeneralDecoder.h
index a89d0d62ef..3f43c979a5 100644
--- a/core/src/fxcodec/jbig2/JBig2_GeneralDecoder.h
+++ b/core/src/fxcodec/jbig2/JBig2_GeneralDecoder.h
@@ -1,278 +1,278 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef _JBIG2_GENERAL_DECODER_H_
-#define _JBIG2_GENERAL_DECODER_H_
-#include "../../../include/fxcodec/fx_codec_def.h"
-#include "../../../include/fxcrt/fx_basic.h"
-#include "JBig2_Define.h"
-#include "JBig2_SymbolDict.h"
-#include "JBig2_ArithDecoder.h"
-#include "JBig2_ArithIntDecoder.h"
-#include "../../../include/fxcrt/fx_coordinates.h"
-class CJBig2_HuffmanTable;
-class CJBig2_Image;
-class CJBig2_PatternDict;
-typedef enum {
- JBIG2_CORNER_BOTTOMLEFT = 0,
- JBIG2_CORNER_TOPLEFT = 1,
- JBIG2_CORNER_BOTTOMRIGHT = 2,
- JBIG2_CORNER_TOPRIGHT = 3
-} JBig2Corner;
-class CJBig2_GRDProc : public CJBig2_Object
-{
-public:
- CJBig2_GRDProc()
- {
- m_loopIndex = 0;
- m_pLine = NULL;
- m_pPause = NULL;
- m_DecodeType = 0;
- LTP = 0;
- m_ReplaceRect.left = 0;
- m_ReplaceRect.bottom = 0;
- m_ReplaceRect.top = 0;
- m_ReplaceRect.right = 0;
- }
-
- CJBig2_Image *decode_Arith(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
-
- CJBig2_Image *decode_Arith_V2(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
-
- CJBig2_Image *decode_Arith_V1(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
-
- CJBig2_Image *decode_MMR(CJBig2_BitStream *pStream);
- FXCODEC_STATUS Start_decode_Arith(CJBig2_Image** pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause = NULL);
- FXCODEC_STATUS Start_decode_Arith_V2(CJBig2_Image** pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause = NULL);
- FXCODEC_STATUS Start_decode_Arith_V1(CJBig2_Image** pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause = NULL);
- FXCODEC_STATUS Start_decode_MMR(CJBig2_Image** pImage, CJBig2_BitStream *pStream, IFX_Pause* pPause = NULL);
- FXCODEC_STATUS Continue_decode(IFX_Pause* pPause);
- FX_RECT GetReplaceRect()
- {
- return m_ReplaceRect;
- };
-private:
- FXCODEC_STATUS decode_Arith(IFX_Pause* pPause);
- FXCODEC_STATUS decode_Arith_V2(IFX_Pause* pPause);
- FXCODEC_STATUS decode_Arith_V1(IFX_Pause* pPause);
- FXCODEC_STATUS decode_MMR();
- FXCODEC_STATUS decode_Arith_Template0_opt3(CJBig2_Image*pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause);
- FXCODEC_STATUS decode_Arith_Template0_unopt(CJBig2_Image *pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause);
- FXCODEC_STATUS decode_Arith_Template1_opt3(CJBig2_Image *pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause);
- FXCODEC_STATUS decode_Arith_Template1_unopt(CJBig2_Image * pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause);
- FXCODEC_STATUS decode_Arith_Template2_opt3(CJBig2_Image *pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause);
- FXCODEC_STATUS decode_Arith_Template2_unopt(CJBig2_Image * pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause);
- FXCODEC_STATUS decode_Arith_Template3_opt3(CJBig2_Image *pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause);
- FXCODEC_STATUS decode_Arith_Template3_unopt(CJBig2_Image * pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause);
- FX_DWORD m_loopIndex;
- FX_BYTE * m_pLine;
- IFX_Pause* m_pPause;
- FXCODEC_STATUS m_ProssiveStatus;
- CJBig2_Image** m_pImage;
- CJBig2_ArithDecoder *m_pArithDecoder;
- JBig2ArithCtx *m_gbContext;
- FX_WORD m_DecodeType;
- FX_BOOL LTP;
- FX_RECT m_ReplaceRect;
-private:
-
- CJBig2_Image *decode_Arith_Template0_opt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
-
- CJBig2_Image *decode_Arith_Template0_opt2(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
-
- CJBig2_Image *decode_Arith_Template0_opt3(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
-
- CJBig2_Image *decode_Arith_Template0_unopt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
-
- CJBig2_Image *decode_Arith_Template1_opt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
-
- CJBig2_Image *decode_Arith_Template1_opt2(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
-
- CJBig2_Image *decode_Arith_Template1_opt3(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
-
- CJBig2_Image *decode_Arith_Template1_unopt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
-
- CJBig2_Image *decode_Arith_Template2_opt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
-
- CJBig2_Image *decode_Arith_Template2_opt2(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
-
- CJBig2_Image *decode_Arith_Template2_opt3(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
-
- CJBig2_Image *decode_Arith_Template2_unopt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
-
- CJBig2_Image *decode_Arith_Template3_opt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
-
- CJBig2_Image *decode_Arith_Template3_opt2(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
-
- CJBig2_Image *decode_Arith_Template3_opt3(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
-
- CJBig2_Image *decode_Arith_Template3_unopt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
-public:
- FX_BOOL MMR;
- FX_DWORD GBW;
- FX_DWORD GBH;
- FX_BYTE GBTEMPLATE;
- FX_BOOL TPGDON;
- FX_BOOL USESKIP;
- CJBig2_Image * SKIP;
- signed char GBAT[8];
-};
-class CJBig2_GRRDProc : public CJBig2_Object
-{
-public:
-
- CJBig2_Image *decode(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext);
-
- CJBig2_Image *decode_Template0_unopt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext);
-
- CJBig2_Image *decode_Template0_opt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext);
-
- CJBig2_Image *decode_Template1_unopt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext);
-
- CJBig2_Image *decode_Template1_opt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext);
-
- CJBig2_Image *decode_V1(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext);
-public:
- FX_DWORD GRW;
- FX_DWORD GRH;
- FX_BOOL GRTEMPLATE;
- CJBig2_Image *GRREFERENCE;
- FX_INT32 GRREFERENCEDX;
- FX_INT32 GRREFERENCEDY;
- FX_BOOL TPGRON;
- signed char GRAT[4];
-};
-typedef struct {
- CJBig2_ArithIntDecoder *IADT,
- *IAFS,
- *IADS,
- *IAIT,
- *IARI,
- *IARDW,
- *IARDH,
- *IARDX,
- *IARDY;
- CJBig2_ArithIaidDecoder *IAID;
-} JBig2IntDecoderState;
-class CJBig2_TRDProc : public CJBig2_Object
-{
-public:
-
- CJBig2_Image *decode_Huffman(CJBig2_BitStream *pStream, JBig2ArithCtx *grContext);
-
- CJBig2_Image *decode_Arith(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext,
- JBig2IntDecoderState *pIDS = NULL);
-public:
- FX_BOOL SBHUFF;
- FX_BOOL SBREFINE;
- FX_DWORD SBW;
- FX_DWORD SBH;
- FX_DWORD SBNUMINSTANCES;
- FX_DWORD SBSTRIPS;
- FX_DWORD SBNUMSYMS;
-
- JBig2HuffmanCode *SBSYMCODES;
- FX_BYTE SBSYMCODELEN;
-
- CJBig2_Image **SBSYMS;
- FX_BOOL SBDEFPIXEL;
-
- JBig2ComposeOp SBCOMBOP;
- FX_BOOL TRANSPOSED;
-
- JBig2Corner REFCORNER;
- signed char SBDSOFFSET;
- CJBig2_HuffmanTable *SBHUFFFS,
- *SBHUFFDS,
- *SBHUFFDT,
- *SBHUFFRDW,
- *SBHUFFRDH,
- *SBHUFFRDX,
- *SBHUFFRDY,
- *SBHUFFRSIZE;
- FX_BOOL SBRTEMPLATE;
- signed char SBRAT[4];
-};
-class CJBig2_SDDProc : public CJBig2_Object
-{
-public:
-
- CJBig2_SymbolDict *decode_Arith(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, JBig2ArithCtx *grContext);
-
- CJBig2_SymbolDict *decode_Huffman(CJBig2_BitStream *pStream, JBig2ArithCtx *gbContext, JBig2ArithCtx *grContext, IFX_Pause* pPause);
-public:
- FX_BOOL SDHUFF;
- FX_BOOL SDREFAGG;
- FX_DWORD SDNUMINSYMS;
- CJBig2_Image ** SDINSYMS;
- FX_DWORD SDNUMNEWSYMS;
- FX_DWORD SDNUMEXSYMS;
- CJBig2_HuffmanTable *SDHUFFDH,
- *SDHUFFDW,
- *SDHUFFBMSIZE,
- *SDHUFFAGGINST;
- FX_BYTE SDTEMPLATE;
- signed char SDAT[8];
- FX_BOOL SDRTEMPLATE;
- signed char SDRAT[4];
-};
-class CJBig2_HTRDProc : public CJBig2_Object
-{
-public:
-
- CJBig2_Image *decode_Arith(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause);
-
- CJBig2_Image *decode_MMR(CJBig2_BitStream *pStream, IFX_Pause* pPause);
-public:
- FX_DWORD HBW,
- HBH;
- FX_BOOL HMMR;
- FX_BYTE HTEMPLATE;
- FX_DWORD HNUMPATS;
- CJBig2_Image **HPATS;
- FX_BOOL HDEFPIXEL;
- JBig2ComposeOp HCOMBOP;
- FX_BOOL HENABLESKIP;
- FX_DWORD HGW,
- HGH;
- FX_INT32 HGX,
- HGY;
- FX_WORD HRX,
- HRY;
- FX_BYTE HPW,
- HPH;
-};
-class CJBig2_PDDProc : public CJBig2_Object
-{
-public:
-
- CJBig2_PatternDict *decode_Arith(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause);
-
- CJBig2_PatternDict *decode_MMR(CJBig2_BitStream *pStream, IFX_Pause* pPause);
-public:
- FX_BOOL HDMMR;
- FX_BYTE HDPW,
- HDPH;
- FX_DWORD GRAYMAX;
- FX_BYTE HDTEMPLATE;
-};
-class CJBig2_GSIDProc : public CJBig2_Object
-{
-public:
-
- FX_DWORD *decode_Arith(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause);
-
- FX_DWORD *decode_MMR(CJBig2_BitStream *pStream, IFX_Pause* pPause);
-public:
- FX_BOOL GSMMR;
- FX_BOOL GSUSESKIP;
- FX_BYTE GSBPP;
- FX_DWORD GSW,
- GSH;
- FX_BYTE GSTEMPLATE;
- CJBig2_Image *GSKIP;
-};
-#endif
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _JBIG2_GENERAL_DECODER_H_
+#define _JBIG2_GENERAL_DECODER_H_
+#include "../../../include/fxcodec/fx_codec_def.h"
+#include "../../../include/fxcrt/fx_basic.h"
+#include "JBig2_Define.h"
+#include "JBig2_SymbolDict.h"
+#include "JBig2_ArithDecoder.h"
+#include "JBig2_ArithIntDecoder.h"
+#include "../../../include/fxcrt/fx_coordinates.h"
+class CJBig2_HuffmanTable;
+class CJBig2_Image;
+class CJBig2_PatternDict;
+typedef enum {
+ JBIG2_CORNER_BOTTOMLEFT = 0,
+ JBIG2_CORNER_TOPLEFT = 1,
+ JBIG2_CORNER_BOTTOMRIGHT = 2,
+ JBIG2_CORNER_TOPRIGHT = 3
+} JBig2Corner;
+class CJBig2_GRDProc : public CJBig2_Object
+{
+public:
+ CJBig2_GRDProc()
+ {
+ m_loopIndex = 0;
+ m_pLine = NULL;
+ m_pPause = NULL;
+ m_DecodeType = 0;
+ LTP = 0;
+ m_ReplaceRect.left = 0;
+ m_ReplaceRect.bottom = 0;
+ m_ReplaceRect.top = 0;
+ m_ReplaceRect.right = 0;
+ }
+
+ CJBig2_Image *decode_Arith(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
+
+ CJBig2_Image *decode_Arith_V2(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
+
+ CJBig2_Image *decode_Arith_V1(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
+
+ CJBig2_Image *decode_MMR(CJBig2_BitStream *pStream);
+ FXCODEC_STATUS Start_decode_Arith(CJBig2_Image** pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause = NULL);
+ FXCODEC_STATUS Start_decode_Arith_V2(CJBig2_Image** pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause = NULL);
+ FXCODEC_STATUS Start_decode_Arith_V1(CJBig2_Image** pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause = NULL);
+ FXCODEC_STATUS Start_decode_MMR(CJBig2_Image** pImage, CJBig2_BitStream *pStream, IFX_Pause* pPause = NULL);
+ FXCODEC_STATUS Continue_decode(IFX_Pause* pPause);
+ FX_RECT GetReplaceRect()
+ {
+ return m_ReplaceRect;
+ };
+private:
+ FXCODEC_STATUS decode_Arith(IFX_Pause* pPause);
+ FXCODEC_STATUS decode_Arith_V2(IFX_Pause* pPause);
+ FXCODEC_STATUS decode_Arith_V1(IFX_Pause* pPause);
+ FXCODEC_STATUS decode_MMR();
+ FXCODEC_STATUS decode_Arith_Template0_opt3(CJBig2_Image*pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause);
+ FXCODEC_STATUS decode_Arith_Template0_unopt(CJBig2_Image *pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause);
+ FXCODEC_STATUS decode_Arith_Template1_opt3(CJBig2_Image *pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause);
+ FXCODEC_STATUS decode_Arith_Template1_unopt(CJBig2_Image * pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause);
+ FXCODEC_STATUS decode_Arith_Template2_opt3(CJBig2_Image *pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause);
+ FXCODEC_STATUS decode_Arith_Template2_unopt(CJBig2_Image * pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause);
+ FXCODEC_STATUS decode_Arith_Template3_opt3(CJBig2_Image *pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause);
+ FXCODEC_STATUS decode_Arith_Template3_unopt(CJBig2_Image * pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause);
+ FX_DWORD m_loopIndex;
+ FX_BYTE * m_pLine;
+ IFX_Pause* m_pPause;
+ FXCODEC_STATUS m_ProssiveStatus;
+ CJBig2_Image** m_pImage;
+ CJBig2_ArithDecoder *m_pArithDecoder;
+ JBig2ArithCtx *m_gbContext;
+ FX_WORD m_DecodeType;
+ FX_BOOL LTP;
+ FX_RECT m_ReplaceRect;
+private:
+
+ CJBig2_Image *decode_Arith_Template0_opt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
+
+ CJBig2_Image *decode_Arith_Template0_opt2(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
+
+ CJBig2_Image *decode_Arith_Template0_opt3(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
+
+ CJBig2_Image *decode_Arith_Template0_unopt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
+
+ CJBig2_Image *decode_Arith_Template1_opt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
+
+ CJBig2_Image *decode_Arith_Template1_opt2(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
+
+ CJBig2_Image *decode_Arith_Template1_opt3(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
+
+ CJBig2_Image *decode_Arith_Template1_unopt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
+
+ CJBig2_Image *decode_Arith_Template2_opt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
+
+ CJBig2_Image *decode_Arith_Template2_opt2(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
+
+ CJBig2_Image *decode_Arith_Template2_opt3(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
+
+ CJBig2_Image *decode_Arith_Template2_unopt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
+
+ CJBig2_Image *decode_Arith_Template3_opt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
+
+ CJBig2_Image *decode_Arith_Template3_opt2(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
+
+ CJBig2_Image *decode_Arith_Template3_opt3(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
+
+ CJBig2_Image *decode_Arith_Template3_unopt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
+public:
+ FX_BOOL MMR;
+ FX_DWORD GBW;
+ FX_DWORD GBH;
+ FX_BYTE GBTEMPLATE;
+ FX_BOOL TPGDON;
+ FX_BOOL USESKIP;
+ CJBig2_Image * SKIP;
+ signed char GBAT[8];
+};
+class CJBig2_GRRDProc : public CJBig2_Object
+{
+public:
+
+ CJBig2_Image *decode(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext);
+
+ CJBig2_Image *decode_Template0_unopt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext);
+
+ CJBig2_Image *decode_Template0_opt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext);
+
+ CJBig2_Image *decode_Template1_unopt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext);
+
+ CJBig2_Image *decode_Template1_opt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext);
+
+ CJBig2_Image *decode_V1(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext);
+public:
+ FX_DWORD GRW;
+ FX_DWORD GRH;
+ FX_BOOL GRTEMPLATE;
+ CJBig2_Image *GRREFERENCE;
+ FX_INT32 GRREFERENCEDX;
+ FX_INT32 GRREFERENCEDY;
+ FX_BOOL TPGRON;
+ signed char GRAT[4];
+};
+typedef struct {
+ CJBig2_ArithIntDecoder *IADT,
+ *IAFS,
+ *IADS,
+ *IAIT,
+ *IARI,
+ *IARDW,
+ *IARDH,
+ *IARDX,
+ *IARDY;
+ CJBig2_ArithIaidDecoder *IAID;
+} JBig2IntDecoderState;
+class CJBig2_TRDProc : public CJBig2_Object
+{
+public:
+
+ CJBig2_Image *decode_Huffman(CJBig2_BitStream *pStream, JBig2ArithCtx *grContext);
+
+ CJBig2_Image *decode_Arith(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext,
+ JBig2IntDecoderState *pIDS = NULL);
+public:
+ FX_BOOL SBHUFF;
+ FX_BOOL SBREFINE;
+ FX_DWORD SBW;
+ FX_DWORD SBH;
+ FX_DWORD SBNUMINSTANCES;
+ FX_DWORD SBSTRIPS;
+ FX_DWORD SBNUMSYMS;
+
+ JBig2HuffmanCode *SBSYMCODES;
+ FX_BYTE SBSYMCODELEN;
+
+ CJBig2_Image **SBSYMS;
+ FX_BOOL SBDEFPIXEL;
+
+ JBig2ComposeOp SBCOMBOP;
+ FX_BOOL TRANSPOSED;
+
+ JBig2Corner REFCORNER;
+ signed char SBDSOFFSET;
+ CJBig2_HuffmanTable *SBHUFFFS,
+ *SBHUFFDS,
+ *SBHUFFDT,
+ *SBHUFFRDW,
+ *SBHUFFRDH,
+ *SBHUFFRDX,
+ *SBHUFFRDY,
+ *SBHUFFRSIZE;
+ FX_BOOL SBRTEMPLATE;
+ signed char SBRAT[4];
+};
+class CJBig2_SDDProc : public CJBig2_Object
+{
+public:
+
+ CJBig2_SymbolDict *decode_Arith(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, JBig2ArithCtx *grContext);
+
+ CJBig2_SymbolDict *decode_Huffman(CJBig2_BitStream *pStream, JBig2ArithCtx *gbContext, JBig2ArithCtx *grContext, IFX_Pause* pPause);
+public:
+ FX_BOOL SDHUFF;
+ FX_BOOL SDREFAGG;
+ FX_DWORD SDNUMINSYMS;
+ CJBig2_Image ** SDINSYMS;
+ FX_DWORD SDNUMNEWSYMS;
+ FX_DWORD SDNUMEXSYMS;
+ CJBig2_HuffmanTable *SDHUFFDH,
+ *SDHUFFDW,
+ *SDHUFFBMSIZE,
+ *SDHUFFAGGINST;
+ FX_BYTE SDTEMPLATE;
+ signed char SDAT[8];
+ FX_BOOL SDRTEMPLATE;
+ signed char SDRAT[4];
+};
+class CJBig2_HTRDProc : public CJBig2_Object
+{
+public:
+
+ CJBig2_Image *decode_Arith(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause);
+
+ CJBig2_Image *decode_MMR(CJBig2_BitStream *pStream, IFX_Pause* pPause);
+public:
+ FX_DWORD HBW,
+ HBH;
+ FX_BOOL HMMR;
+ FX_BYTE HTEMPLATE;
+ FX_DWORD HNUMPATS;
+ CJBig2_Image **HPATS;
+ FX_BOOL HDEFPIXEL;
+ JBig2ComposeOp HCOMBOP;
+ FX_BOOL HENABLESKIP;
+ FX_DWORD HGW,
+ HGH;
+ FX_INT32 HGX,
+ HGY;
+ FX_WORD HRX,
+ HRY;
+ FX_BYTE HPW,
+ HPH;
+};
+class CJBig2_PDDProc : public CJBig2_Object
+{
+public:
+
+ CJBig2_PatternDict *decode_Arith(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause);
+
+ CJBig2_PatternDict *decode_MMR(CJBig2_BitStream *pStream, IFX_Pause* pPause);
+public:
+ FX_BOOL HDMMR;
+ FX_BYTE HDPW,
+ HDPH;
+ FX_DWORD GRAYMAX;
+ FX_BYTE HDTEMPLATE;
+};
+class CJBig2_GSIDProc : public CJBig2_Object
+{
+public:
+
+ FX_DWORD *decode_Arith(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause);
+
+ FX_DWORD *decode_MMR(CJBig2_BitStream *pStream, IFX_Pause* pPause);
+public:
+ FX_BOOL GSMMR;
+ FX_BOOL GSUSESKIP;
+ FX_BYTE GSBPP;
+ FX_DWORD GSW,
+ GSH;
+ FX_BYTE GSTEMPLATE;
+ CJBig2_Image *GSKIP;
+};
+#endif
diff --git a/core/src/fxcodec/jbig2/JBig2_HuffmanDecoder.cpp b/core/src/fxcodec/jbig2/JBig2_HuffmanDecoder.cpp
index 8199fe7c21..dd820ae4ca 100644
--- a/core/src/fxcodec/jbig2/JBig2_HuffmanDecoder.cpp
+++ b/core/src/fxcodec/jbig2/JBig2_HuffmanDecoder.cpp
@@ -1,55 +1,55 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "JBig2_HuffmanDecoder.h"
-CJBig2_HuffmanDecoder::CJBig2_HuffmanDecoder(CJBig2_BitStream *pStream)
-{
- m_pStream = pStream;
-}
-CJBig2_HuffmanDecoder::~CJBig2_HuffmanDecoder()
-{
-}
-int CJBig2_HuffmanDecoder::decodeAValue(CJBig2_HuffmanTable *pTable, int *nResult)
-{
- int nVal, nTmp, i, nBits;
- nVal = 0;
- nBits = 0;
- while(1) {
- if(m_pStream->read1Bit(&nTmp) == -1) {
- return -1;
- }
- nVal = (nVal << 1) | nTmp;
- nBits ++;
- for(i = 0; i < pTable->NTEMP; i++) {
- if((pTable->PREFLEN[i] == nBits) && (pTable->CODES[i] == nVal)) {
- if((pTable->HTOOB == 1) && (i == pTable->NTEMP - 1)) {
- return JBIG2_OOB;
- }
- if(m_pStream->readNBits(pTable->RANGELEN[i], &nTmp) == -1) {
- return -1;
- }
- if(pTable->HTOOB) {
- if(i == pTable->NTEMP - 3) {
- *nResult = pTable->RANGELOW[i] - nTmp;
- return 0;
- } else {
- *nResult = pTable->RANGELOW[i] + nTmp;
- return 0;
- }
- } else {
- if(i == pTable->NTEMP - 2) {
- *nResult = pTable->RANGELOW[i] - nTmp;
- return 0;
- } else {
- *nResult = pTable->RANGELOW[i] + nTmp;
- return 0;
- }
- }
- }
- }
- }
- return -2;
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "JBig2_HuffmanDecoder.h"
+CJBig2_HuffmanDecoder::CJBig2_HuffmanDecoder(CJBig2_BitStream *pStream)
+{
+ m_pStream = pStream;
+}
+CJBig2_HuffmanDecoder::~CJBig2_HuffmanDecoder()
+{
+}
+int CJBig2_HuffmanDecoder::decodeAValue(CJBig2_HuffmanTable *pTable, int *nResult)
+{
+ int nVal, nTmp, i, nBits;
+ nVal = 0;
+ nBits = 0;
+ while(1) {
+ if(m_pStream->read1Bit(&nTmp) == -1) {
+ return -1;
+ }
+ nVal = (nVal << 1) | nTmp;
+ nBits ++;
+ for(i = 0; i < pTable->NTEMP; i++) {
+ if((pTable->PREFLEN[i] == nBits) && (pTable->CODES[i] == nVal)) {
+ if((pTable->HTOOB == 1) && (i == pTable->NTEMP - 1)) {
+ return JBIG2_OOB;
+ }
+ if(m_pStream->readNBits(pTable->RANGELEN[i], &nTmp) == -1) {
+ return -1;
+ }
+ if(pTable->HTOOB) {
+ if(i == pTable->NTEMP - 3) {
+ *nResult = pTable->RANGELOW[i] - nTmp;
+ return 0;
+ } else {
+ *nResult = pTable->RANGELOW[i] + nTmp;
+ return 0;
+ }
+ } else {
+ if(i == pTable->NTEMP - 2) {
+ *nResult = pTable->RANGELOW[i] - nTmp;
+ return 0;
+ } else {
+ *nResult = pTable->RANGELOW[i] + nTmp;
+ return 0;
+ }
+ }
+ }
+ }
+ }
+ return -2;
+}
diff --git a/core/src/fxcodec/jbig2/JBig2_HuffmanDecoder.h b/core/src/fxcodec/jbig2/JBig2_HuffmanDecoder.h
index 38b2021d20..60ec2900d3 100644
--- a/core/src/fxcodec/jbig2/JBig2_HuffmanDecoder.h
+++ b/core/src/fxcodec/jbig2/JBig2_HuffmanDecoder.h
@@ -1,24 +1,24 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef _JBIG2_HUFFMAN_DECODER_H_
-#define _JBIG2_HUFFMAN_DECODER_H_
-#include "JBig2_BitStream.h"
-#include "JBig2_HuffmanTable.h"
-class CJBig2_HuffmanDecoder : public CJBig2_Object
-{
-public:
-
- CJBig2_HuffmanDecoder(CJBig2_BitStream *pStream);
-
- ~CJBig2_HuffmanDecoder();
-
- int decodeAValue(CJBig2_HuffmanTable *pTable, int *nResult);
-private:
-
- CJBig2_BitStream *m_pStream;
-};
-#endif
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _JBIG2_HUFFMAN_DECODER_H_
+#define _JBIG2_HUFFMAN_DECODER_H_
+#include "JBig2_BitStream.h"
+#include "JBig2_HuffmanTable.h"
+class CJBig2_HuffmanDecoder : public CJBig2_Object
+{
+public:
+
+ CJBig2_HuffmanDecoder(CJBig2_BitStream *pStream);
+
+ ~CJBig2_HuffmanDecoder();
+
+ int decodeAValue(CJBig2_HuffmanTable *pTable, int *nResult);
+private:
+
+ CJBig2_BitStream *m_pStream;
+};
+#endif
diff --git a/core/src/fxcodec/jbig2/JBig2_HuffmanTable.cpp b/core/src/fxcodec/jbig2/JBig2_HuffmanTable.cpp
index af4a54988d..0a5bc8e645 100644
--- a/core/src/fxcodec/jbig2/JBig2_HuffmanTable.cpp
+++ b/core/src/fxcodec/jbig2/JBig2_HuffmanTable.cpp
@@ -1,193 +1,193 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "JBig2_HuffmanTable.h"
-#include "JBig2_BitStream.h"
-#include <string.h>
-
-CJBig2_HuffmanTable::CJBig2_HuffmanTable(const JBig2TableLine *pTable, int nLines,
- FX_BOOL bHTOOB)
-{
- init();
- m_bOK = parseFromStandardTable(pTable, nLines, bHTOOB);
-}
-
-CJBig2_HuffmanTable::CJBig2_HuffmanTable(CJBig2_BitStream *pStream)
-{
- init();
- m_bOK = parseFromCodedBuffer(pStream);
-}
-
-CJBig2_HuffmanTable::~CJBig2_HuffmanTable()
-{
- if(CODES) {
- m_pModule->JBig2_Free(CODES);
- }
- if(PREFLEN) {
- m_pModule->JBig2_Free(PREFLEN);
- }
- if(RANGELEN) {
- m_pModule->JBig2_Free(RANGELEN);
- }
- if(RANGELOW) {
- m_pModule->JBig2_Free(RANGELOW);
- }
-}
-void CJBig2_HuffmanTable::init()
-{
- HTOOB = FALSE;
- NTEMP = 0;
- CODES = NULL;
- PREFLEN = NULL;
- RANGELEN = NULL;
- RANGELOW = NULL;
-}
-int CJBig2_HuffmanTable::parseFromStandardTable(const JBig2TableLine *pTable, int nLines, FX_BOOL bHTOOB)
-{
- int CURLEN, LENMAX, CURCODE, CURTEMP, i;
- int *LENCOUNT;
- int *FIRSTCODE;
- HTOOB = bHTOOB;
- NTEMP = nLines;
- CODES = (int*)m_pModule->JBig2_Malloc2(sizeof(int), NTEMP);
- PREFLEN = (int*)m_pModule->JBig2_Malloc2(sizeof(int), NTEMP);
- RANGELEN = (int*)m_pModule->JBig2_Malloc2(sizeof(int), NTEMP);
- RANGELOW = (int*)m_pModule->JBig2_Malloc2(sizeof(int), NTEMP);
- LENMAX = 0;
- for(i = 0; i < NTEMP; i++) {
- PREFLEN[i] = pTable[i].PREFLEN;
- RANGELEN[i] = pTable[i].RANDELEN;
- RANGELOW[i] = pTable[i].RANGELOW;
- if(PREFLEN[i] > LENMAX) {
- LENMAX = PREFLEN[i];
- }
- }
- LENCOUNT = (int*)m_pModule->JBig2_Malloc2(sizeof(int), (LENMAX + 1));
- JBIG2_memset(LENCOUNT, 0, sizeof(int) * (LENMAX + 1));
- FIRSTCODE = (int*)m_pModule->JBig2_Malloc2(sizeof(int), (LENMAX + 1));
- for(i = 0; i < NTEMP; i++) {
- LENCOUNT[PREFLEN[i]] ++;
- }
- CURLEN = 1;
- FIRSTCODE[0] = 0;
- LENCOUNT[0] = 0;
- while(CURLEN <= LENMAX) {
- FIRSTCODE[CURLEN] = (FIRSTCODE[CURLEN - 1] + LENCOUNT[CURLEN - 1]) << 1;
- CURCODE = FIRSTCODE[CURLEN];
- CURTEMP = 0;
- while(CURTEMP < NTEMP) {
- if(PREFLEN[CURTEMP] == CURLEN) {
- CODES[CURTEMP] = CURCODE;
- CURCODE = CURCODE + 1;
- }
- CURTEMP = CURTEMP + 1;
- }
- CURLEN = CURLEN + 1;
- }
- m_pModule->JBig2_Free(LENCOUNT);
- m_pModule->JBig2_Free(FIRSTCODE);
- return 1;
-}
-
-#define HT_CHECK_MEMORY_ADJUST \
- if(NTEMP >= nSize) \
- { \
- nSize += 16; \
- PREFLEN = (int*)m_pModule->JBig2_Realloc(PREFLEN,sizeof(int)*nSize); \
- RANGELEN = (int*)m_pModule->JBig2_Realloc(RANGELEN,sizeof(int)*nSize); \
- RANGELOW = (int*)m_pModule->JBig2_Realloc(RANGELOW,sizeof(int)*nSize); \
- }
-int CJBig2_HuffmanTable::parseFromCodedBuffer(CJBig2_BitStream *pStream)
-{
- unsigned char HTPS, HTRS;
- int HTLOW, HTHIGH;
- int CURRANGELOW;
- int nSize = 16;
- int CURLEN, LENMAX, CURCODE, CURTEMP, i;
- int *LENCOUNT;
- int *FIRSTCODE;
- unsigned char cTemp;
- if(pStream->read1Byte(&cTemp) == -1) {
- goto failed;
- }
- HTOOB = cTemp & 0x01;
- HTPS = ((cTemp >> 1) & 0x07) + 1;
- HTRS = ((cTemp >> 4) & 0x07) + 1;
- if(pStream->readInteger((FX_DWORD*)&HTLOW) == -1 ||
- pStream->readInteger((FX_DWORD*)&HTHIGH) == -1) {
- goto failed;
- }
- PREFLEN = (int*)m_pModule->JBig2_Malloc2(sizeof(int), nSize);
- RANGELEN = (int*)m_pModule->JBig2_Malloc2(sizeof(int), nSize);
- RANGELOW = (int*)m_pModule->JBig2_Malloc2(sizeof(int), nSize);
- CURRANGELOW = HTLOW;
- NTEMP = 0;
- do {
- HT_CHECK_MEMORY_ADJUST
- if((pStream->readNBits(HTPS, &PREFLEN[NTEMP]) == -1)
- || (pStream->readNBits(HTRS, &RANGELEN[NTEMP]) == -1)) {
- goto failed;
- }
- RANGELOW[NTEMP] = CURRANGELOW;
- CURRANGELOW = CURRANGELOW + (1 << RANGELEN[NTEMP]);
- NTEMP = NTEMP + 1;
- } while(CURRANGELOW < HTHIGH);
- HT_CHECK_MEMORY_ADJUST
- if(pStream->readNBits(HTPS, &PREFLEN[NTEMP]) == -1) {
- goto failed;
- }
- RANGELEN[NTEMP] = 32;
- RANGELOW[NTEMP] = HTLOW - 1;
- NTEMP = NTEMP + 1;
- HT_CHECK_MEMORY_ADJUST
- if(pStream->readNBits(HTPS, &PREFLEN[NTEMP]) == -1) {
- goto failed;
- }
- RANGELEN[NTEMP] = 32;
- RANGELOW[NTEMP] = HTHIGH;
- NTEMP = NTEMP + 1;
- if(HTOOB) {
- HT_CHECK_MEMORY_ADJUST
- if(pStream->readNBits(HTPS, &PREFLEN[NTEMP]) == -1) {
- goto failed;
- }
- NTEMP = NTEMP + 1;
- }
- CODES = (int*)m_pModule->JBig2_Malloc2(sizeof(int), NTEMP);
- LENMAX = 0;
- for(i = 0; i < NTEMP; i++) {
- if(PREFLEN[i] > LENMAX) {
- LENMAX = PREFLEN[i];
- }
- }
- LENCOUNT = (int*)m_pModule->JBig2_Malloc2(sizeof(int), (LENMAX + 1));
- JBIG2_memset(LENCOUNT, 0, sizeof(int) * (LENMAX + 1));
- FIRSTCODE = (int*)m_pModule->JBig2_Malloc2(sizeof(int), (LENMAX + 1));
- for(i = 0; i < NTEMP; i++) {
- LENCOUNT[PREFLEN[i]] ++;
- }
- CURLEN = 1;
- FIRSTCODE[0] = 0;
- LENCOUNT[0] = 0;
- while(CURLEN <= LENMAX) {
- FIRSTCODE[CURLEN] = (FIRSTCODE[CURLEN - 1] + LENCOUNT[CURLEN - 1]) << 1;
- CURCODE = FIRSTCODE[CURLEN];
- CURTEMP = 0;
- while(CURTEMP < NTEMP) {
- if(PREFLEN[CURTEMP] == CURLEN) {
- CODES[CURTEMP] = CURCODE;
- CURCODE = CURCODE + 1;
- }
- CURTEMP = CURTEMP + 1;
- }
- CURLEN = CURLEN + 1;
- }
- m_pModule->JBig2_Free(LENCOUNT);
- m_pModule->JBig2_Free(FIRSTCODE);
- return TRUE;
-failed:
- return FALSE;
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "JBig2_HuffmanTable.h"
+#include "JBig2_BitStream.h"
+#include <string.h>
+
+CJBig2_HuffmanTable::CJBig2_HuffmanTable(const JBig2TableLine *pTable, int nLines,
+ FX_BOOL bHTOOB)
+{
+ init();
+ m_bOK = parseFromStandardTable(pTable, nLines, bHTOOB);
+}
+
+CJBig2_HuffmanTable::CJBig2_HuffmanTable(CJBig2_BitStream *pStream)
+{
+ init();
+ m_bOK = parseFromCodedBuffer(pStream);
+}
+
+CJBig2_HuffmanTable::~CJBig2_HuffmanTable()
+{
+ if(CODES) {
+ m_pModule->JBig2_Free(CODES);
+ }
+ if(PREFLEN) {
+ m_pModule->JBig2_Free(PREFLEN);
+ }
+ if(RANGELEN) {
+ m_pModule->JBig2_Free(RANGELEN);
+ }
+ if(RANGELOW) {
+ m_pModule->JBig2_Free(RANGELOW);
+ }
+}
+void CJBig2_HuffmanTable::init()
+{
+ HTOOB = FALSE;
+ NTEMP = 0;
+ CODES = NULL;
+ PREFLEN = NULL;
+ RANGELEN = NULL;
+ RANGELOW = NULL;
+}
+int CJBig2_HuffmanTable::parseFromStandardTable(const JBig2TableLine *pTable, int nLines, FX_BOOL bHTOOB)
+{
+ int CURLEN, LENMAX, CURCODE, CURTEMP, i;
+ int *LENCOUNT;
+ int *FIRSTCODE;
+ HTOOB = bHTOOB;
+ NTEMP = nLines;
+ CODES = (int*)m_pModule->JBig2_Malloc2(sizeof(int), NTEMP);
+ PREFLEN = (int*)m_pModule->JBig2_Malloc2(sizeof(int), NTEMP);
+ RANGELEN = (int*)m_pModule->JBig2_Malloc2(sizeof(int), NTEMP);
+ RANGELOW = (int*)m_pModule->JBig2_Malloc2(sizeof(int), NTEMP);
+ LENMAX = 0;
+ for(i = 0; i < NTEMP; i++) {
+ PREFLEN[i] = pTable[i].PREFLEN;
+ RANGELEN[i] = pTable[i].RANDELEN;
+ RANGELOW[i] = pTable[i].RANGELOW;
+ if(PREFLEN[i] > LENMAX) {
+ LENMAX = PREFLEN[i];
+ }
+ }
+ LENCOUNT = (int*)m_pModule->JBig2_Malloc2(sizeof(int), (LENMAX + 1));
+ JBIG2_memset(LENCOUNT, 0, sizeof(int) * (LENMAX + 1));
+ FIRSTCODE = (int*)m_pModule->JBig2_Malloc2(sizeof(int), (LENMAX + 1));
+ for(i = 0; i < NTEMP; i++) {
+ LENCOUNT[PREFLEN[i]] ++;
+ }
+ CURLEN = 1;
+ FIRSTCODE[0] = 0;
+ LENCOUNT[0] = 0;
+ while(CURLEN <= LENMAX) {
+ FIRSTCODE[CURLEN] = (FIRSTCODE[CURLEN - 1] + LENCOUNT[CURLEN - 1]) << 1;
+ CURCODE = FIRSTCODE[CURLEN];
+ CURTEMP = 0;
+ while(CURTEMP < NTEMP) {
+ if(PREFLEN[CURTEMP] == CURLEN) {
+ CODES[CURTEMP] = CURCODE;
+ CURCODE = CURCODE + 1;
+ }
+ CURTEMP = CURTEMP + 1;
+ }
+ CURLEN = CURLEN + 1;
+ }
+ m_pModule->JBig2_Free(LENCOUNT);
+ m_pModule->JBig2_Free(FIRSTCODE);
+ return 1;
+}
+
+#define HT_CHECK_MEMORY_ADJUST \
+ if(NTEMP >= nSize) \
+ { \
+ nSize += 16; \
+ PREFLEN = (int*)m_pModule->JBig2_Realloc(PREFLEN,sizeof(int)*nSize); \
+ RANGELEN = (int*)m_pModule->JBig2_Realloc(RANGELEN,sizeof(int)*nSize); \
+ RANGELOW = (int*)m_pModule->JBig2_Realloc(RANGELOW,sizeof(int)*nSize); \
+ }
+int CJBig2_HuffmanTable::parseFromCodedBuffer(CJBig2_BitStream *pStream)
+{
+ unsigned char HTPS, HTRS;
+ int HTLOW, HTHIGH;
+ int CURRANGELOW;
+ int nSize = 16;
+ int CURLEN, LENMAX, CURCODE, CURTEMP, i;
+ int *LENCOUNT;
+ int *FIRSTCODE;
+ unsigned char cTemp;
+ if(pStream->read1Byte(&cTemp) == -1) {
+ goto failed;
+ }
+ HTOOB = cTemp & 0x01;
+ HTPS = ((cTemp >> 1) & 0x07) + 1;
+ HTRS = ((cTemp >> 4) & 0x07) + 1;
+ if(pStream->readInteger((FX_DWORD*)&HTLOW) == -1 ||
+ pStream->readInteger((FX_DWORD*)&HTHIGH) == -1) {
+ goto failed;
+ }
+ PREFLEN = (int*)m_pModule->JBig2_Malloc2(sizeof(int), nSize);
+ RANGELEN = (int*)m_pModule->JBig2_Malloc2(sizeof(int), nSize);
+ RANGELOW = (int*)m_pModule->JBig2_Malloc2(sizeof(int), nSize);
+ CURRANGELOW = HTLOW;
+ NTEMP = 0;
+ do {
+ HT_CHECK_MEMORY_ADJUST
+ if((pStream->readNBits(HTPS, &PREFLEN[NTEMP]) == -1)
+ || (pStream->readNBits(HTRS, &RANGELEN[NTEMP]) == -1)) {
+ goto failed;
+ }
+ RANGELOW[NTEMP] = CURRANGELOW;
+ CURRANGELOW = CURRANGELOW + (1 << RANGELEN[NTEMP]);
+ NTEMP = NTEMP + 1;
+ } while(CURRANGELOW < HTHIGH);
+ HT_CHECK_MEMORY_ADJUST
+ if(pStream->readNBits(HTPS, &PREFLEN[NTEMP]) == -1) {
+ goto failed;
+ }
+ RANGELEN[NTEMP] = 32;
+ RANGELOW[NTEMP] = HTLOW - 1;
+ NTEMP = NTEMP + 1;
+ HT_CHECK_MEMORY_ADJUST
+ if(pStream->readNBits(HTPS, &PREFLEN[NTEMP]) == -1) {
+ goto failed;
+ }
+ RANGELEN[NTEMP] = 32;
+ RANGELOW[NTEMP] = HTHIGH;
+ NTEMP = NTEMP + 1;
+ if(HTOOB) {
+ HT_CHECK_MEMORY_ADJUST
+ if(pStream->readNBits(HTPS, &PREFLEN[NTEMP]) == -1) {
+ goto failed;
+ }
+ NTEMP = NTEMP + 1;
+ }
+ CODES = (int*)m_pModule->JBig2_Malloc2(sizeof(int), NTEMP);
+ LENMAX = 0;
+ for(i = 0; i < NTEMP; i++) {
+ if(PREFLEN[i] > LENMAX) {
+ LENMAX = PREFLEN[i];
+ }
+ }
+ LENCOUNT = (int*)m_pModule->JBig2_Malloc2(sizeof(int), (LENMAX + 1));
+ JBIG2_memset(LENCOUNT, 0, sizeof(int) * (LENMAX + 1));
+ FIRSTCODE = (int*)m_pModule->JBig2_Malloc2(sizeof(int), (LENMAX + 1));
+ for(i = 0; i < NTEMP; i++) {
+ LENCOUNT[PREFLEN[i]] ++;
+ }
+ CURLEN = 1;
+ FIRSTCODE[0] = 0;
+ LENCOUNT[0] = 0;
+ while(CURLEN <= LENMAX) {
+ FIRSTCODE[CURLEN] = (FIRSTCODE[CURLEN - 1] + LENCOUNT[CURLEN - 1]) << 1;
+ CURCODE = FIRSTCODE[CURLEN];
+ CURTEMP = 0;
+ while(CURTEMP < NTEMP) {
+ if(PREFLEN[CURTEMP] == CURLEN) {
+ CODES[CURTEMP] = CURCODE;
+ CURCODE = CURCODE + 1;
+ }
+ CURTEMP = CURTEMP + 1;
+ }
+ CURLEN = CURLEN + 1;
+ }
+ m_pModule->JBig2_Free(LENCOUNT);
+ m_pModule->JBig2_Free(FIRSTCODE);
+ return TRUE;
+failed:
+ return FALSE;
+}
diff --git a/core/src/fxcodec/jbig2/JBig2_HuffmanTable.h b/core/src/fxcodec/jbig2/JBig2_HuffmanTable.h
index df051c28d4..d68ced2fca 100644
--- a/core/src/fxcodec/jbig2/JBig2_HuffmanTable.h
+++ b/core/src/fxcodec/jbig2/JBig2_HuffmanTable.h
@@ -1,42 +1,42 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef _JBIG2_HUFFMAN_TABLE_H_
-#define _JBIG2_HUFFMAN_TABLE_H_
-#include "JBig2_Module.h"
-#include "JBig2_HuffmanTable_Standard.h"
-#include "JBig2_BitStream.h"
-class CJBig2_HuffmanTable : public CJBig2_Object
-{
-public:
-
- CJBig2_HuffmanTable(const JBig2TableLine *pTable, int nLines, FX_BOOL bHTOOB);
-
- CJBig2_HuffmanTable(CJBig2_BitStream *pStream);
-
- ~CJBig2_HuffmanTable();
-
- void init();
-
- int parseFromStandardTable(const JBig2TableLine *pTable, int nLines, FX_BOOL bHTOOB);
-
- int parseFromCodedBuffer(CJBig2_BitStream *pStream);
-
- FX_BOOL isOK()
- {
- return m_bOK;
- }
-private:
- FX_BOOL HTOOB;
- int NTEMP;
- int *CODES;
- int *PREFLEN;
- int *RANGELEN;
- int *RANGELOW;
- FX_BOOL m_bOK;
- friend class CJBig2_HuffmanDecoder;
-};
-#endif
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _JBIG2_HUFFMAN_TABLE_H_
+#define _JBIG2_HUFFMAN_TABLE_H_
+#include "JBig2_Module.h"
+#include "JBig2_HuffmanTable_Standard.h"
+#include "JBig2_BitStream.h"
+class CJBig2_HuffmanTable : public CJBig2_Object
+{
+public:
+
+ CJBig2_HuffmanTable(const JBig2TableLine *pTable, int nLines, FX_BOOL bHTOOB);
+
+ CJBig2_HuffmanTable(CJBig2_BitStream *pStream);
+
+ ~CJBig2_HuffmanTable();
+
+ void init();
+
+ int parseFromStandardTable(const JBig2TableLine *pTable, int nLines, FX_BOOL bHTOOB);
+
+ int parseFromCodedBuffer(CJBig2_BitStream *pStream);
+
+ FX_BOOL isOK()
+ {
+ return m_bOK;
+ }
+private:
+ FX_BOOL HTOOB;
+ int NTEMP;
+ int *CODES;
+ int *PREFLEN;
+ int *RANGELEN;
+ int *RANGELOW;
+ FX_BOOL m_bOK;
+ friend class CJBig2_HuffmanDecoder;
+};
+#endif
diff --git a/core/src/fxcodec/jbig2/JBig2_HuffmanTable_Standard.h b/core/src/fxcodec/jbig2/JBig2_HuffmanTable_Standard.h
index f6114364f1..428b2c3671 100644
--- a/core/src/fxcodec/jbig2/JBig2_HuffmanTable_Standard.h
+++ b/core/src/fxcodec/jbig2/JBig2_HuffmanTable_Standard.h
@@ -1,251 +1,251 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef _JBIG2_HUFFMAN_TABLE_STANDARD_H_
-#define _JBIG2_HUFFMAN_TABLE_STANDARD_H_
-typedef struct {
- int PREFLEN;
- int RANDELEN;
- int RANGELOW;
-} JBig2TableLine;
-const FX_BOOL HuffmanTable_HTOOB_B1 = FALSE;
-const JBig2TableLine HuffmanTable_B1[] = {
- { 1, 4, 0 },
- { 2, 8, 16 },
- { 3, 16, 272 },
- { 0, 32, -1 },
- { 3, 32, 65808 }
-};
-const FX_BOOL HuffmanTable_HTOOB_B2 = TRUE;
-const JBig2TableLine HuffmanTable_B2[] = {
- { 1, 0, 0 },
- { 2, 0, 1 },
- { 3, 0, 2 },
- { 4, 3, 3 },
- { 5, 6, 11 },
- { 0, 32, -1 },
- { 6, 32, 75 },
- { 6, 0, 0 }
-};
-const FX_BOOL HuffmanTable_HTOOB_B3 = TRUE;
-const JBig2TableLine HuffmanTable_B3[] = {
- { 8, 8, -256 },
- { 1, 0, 0 },
- { 2, 0, 1 },
- { 3, 0, 2 },
- { 4, 3, 3 },
- { 5, 6, 11 },
- { 8, 32, -257 },
- { 7, 32, 75 },
- { 6, 0, 0 }
-};
-const FX_BOOL HuffmanTable_HTOOB_B4 = FALSE;
-const JBig2TableLine HuffmanTable_B4[] = {
- { 1, 0, 1 },
- { 2, 0, 2 },
- { 3, 0, 3 },
- { 4, 3, 4 },
- { 5, 6, 12 },
- { 0, 32, -1 },
- { 5, 32, 76 },
-};
-const FX_BOOL HuffmanTable_HTOOB_B5 = FALSE;
-const JBig2TableLine HuffmanTable_B5[] = {
- { 7, 8, -255 },
- { 1, 0, 1 },
- { 2, 0, 2 },
- { 3, 0, 3 },
- { 4, 3, 4 },
- { 5, 6, 12 },
- { 7, 32, -256 },
- { 6, 32, 76 }
-};
-const FX_BOOL HuffmanTable_HTOOB_B6 = FALSE;
-const JBig2TableLine HuffmanTable_B6[] = {
- { 5, 10, -2048 },
- { 4, 9, -1024 },
- { 4, 8, -512 },
- { 4, 7, -256 },
- { 5, 6, -128 },
- { 5, 5, -64 },
- { 4, 5, -32 },
- { 2, 7, 0 },
- { 3, 7, 128 },
- { 3, 8, 256 },
- { 4, 9, 512 },
- { 4, 10, 1024 },
- { 6, 32, -2049 },
- { 6, 32, 2048 }
-};
-const FX_BOOL HuffmanTable_HTOOB_B7 = FALSE;
-const JBig2TableLine HuffmanTable_B7[] = {
- { 4, 9, -1024 },
- { 3, 8, -512 },
- { 4, 7, -256 },
- { 5, 6, -128 },
- { 5, 5, -64 },
- { 4, 5, -32 },
- { 4, 5, 0 },
- { 5, 5, 32 },
- { 5, 6, 64 },
- { 4, 7, 128 },
- { 3, 8, 256 },
- { 3, 9, 512 },
- { 3, 10, 1024 },
- { 5, 32, -1025 },
- { 5, 32, 2048 },
-};
-const FX_BOOL HuffmanTable_HTOOB_B8 = TRUE;
-const JBig2TableLine HuffmanTable_B8[] = {
- { 8, 3, -15 },
- { 9, 1, -7 },
- { 8, 1, -5 },
- { 9, 0, -3 },
- { 7, 0, -2 },
- { 4, 0, -1 },
- { 2, 1, 0 },
- { 5, 0, 2 },
- { 6, 0, 3 },
- { 3, 4, 4 },
- { 6, 1, 20 },
- { 4, 4, 22 },
- { 4, 5, 38 },
- { 5, 6, 70 },
- { 5, 7, 134 },
- { 6, 7, 262 },
- { 7, 8, 390 },
- { 6, 10, 646 },
- { 9, 32, -16 },
- { 9, 32, 1670 },
- { 2, 0, 0 }
-};
-const FX_BOOL HuffmanTable_HTOOB_B9 = TRUE;
-const JBig2TableLine HuffmanTable_B9[] = {
- { 8, 4, -31 },
- { 9, 2, -15 },
- { 8, 2, -11 },
- { 9, 1, -7 },
- { 7, 1, -5 },
- { 4, 1, -3 },
- { 3, 1, -1 },
- { 3, 1, 1 },
- { 5, 1, 3 },
- { 6, 1, 5 },
- { 3, 5, 7 },
- { 6, 2, 39 },
- { 4, 5, 43 },
- { 4, 6, 75 },
- { 5, 7, 139 },
- { 5, 8, 267 },
- { 6, 8, 523 },
- { 7, 9, 779 },
- { 6, 11, 1291 },
- { 9, 32, -32 },
- { 9, 32, 3339 },
- { 2, 0, 0 }
-};
-const FX_BOOL HuffmanTable_HTOOB_B10 = TRUE;
-const JBig2TableLine HuffmanTable_B10[] = {
- { 7, 4, -21 },
- { 8, 0, -5 },
- { 7, 0, -4 },
- { 5, 0, -3 },
- { 2, 2, -2 },
- { 5, 0, 2 },
- { 6, 0, 3 },
- { 7, 0, 4 },
- { 8, 0, 5 },
- { 2, 6, 6 },
- { 5, 5, 70 },
- { 6, 5, 102 },
- { 6, 6, 134 },
- { 6, 7, 198 },
- { 6, 8, 326 },
- { 6, 9, 582 },
- { 6, 10, 1094 },
- { 7, 11, 2118 },
- { 8, 32, -22 },
- { 8, 32, 4166 },
- { 2, 0, 0 }
-};
-const FX_BOOL HuffmanTable_HTOOB_B11 = FALSE;
-const JBig2TableLine HuffmanTable_B11[] = {
- { 1, 0, 1 },
- { 2, 1, 2 },
- { 4, 0, 4 },
- { 4, 1, 5 },
- { 5, 1, 7 },
- { 5, 2, 9 },
- { 6, 2, 13 },
- { 7, 2, 17 },
- { 7, 3, 21 },
- { 7, 4, 29 },
- { 7, 5, 45 },
- { 7, 6, 77 },
- { 0, 32, 0 },
- { 7, 32, 141 }
-};
-const FX_BOOL HuffmanTable_HTOOB_B12 = FALSE;
-const JBig2TableLine HuffmanTable_B12[] = {
- { 1, 0, 1 },
- { 2, 0, 2 },
- { 3, 1, 3 },
- { 5, 0, 5 },
- { 5, 1, 6 },
- { 6, 1, 8 },
- { 7, 0, 10 },
- { 7, 1, 11 },
- { 7, 2, 13 },
- { 7, 3, 17 },
- { 7, 4, 25 },
- { 8, 5, 41 },
- { 0, 32, 0 },
- { 8, 32, 73 }
-};
-const FX_BOOL HuffmanTable_HTOOB_B13 = FALSE;
-const JBig2TableLine HuffmanTable_B13[] = {
- { 1, 0, 1 },
- { 3, 0, 2 },
- { 4, 0, 3 },
- { 5, 0, 4 },
- { 4, 1, 5 },
- { 3, 3, 7 },
- { 6, 1, 15 },
- { 6, 2, 17 },
- { 6, 3, 21 },
- { 6, 4, 29 },
- { 6, 5, 45 },
- { 7, 6, 77 },
- { 0, 32, 0 },
- { 7, 32, 141 }
-};
-const FX_BOOL HuffmanTable_HTOOB_B14 = FALSE;
-const JBig2TableLine HuffmanTable_B14[] = {
- { 3, 0, -2 },
- { 3, 0, -1 },
- { 1, 0, 0 },
- { 3, 0, 1 },
- { 3, 0, 2 },
- { 0, 32, -3 },
- { 0, 32, 3 }
-};
-const FX_BOOL HuffmanTable_HTOOB_B15 = FALSE;
-const JBig2TableLine HuffmanTable_B15[] = {
- { 7, 4, -24 },
- { 6, 2, -8 },
- { 5, 1, -4 },
- { 4, 0, -2 },
- { 3, 0, -1 },
- { 1, 0, 0 },
- { 3, 0, 1 },
- { 4, 0, 2 },
- { 5, 1, 3 },
- { 6, 2, 5 },
- { 7, 4, 9 },
- { 7, 32, -25 },
- { 7, 32, 25 }
-};
-#endif
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _JBIG2_HUFFMAN_TABLE_STANDARD_H_
+#define _JBIG2_HUFFMAN_TABLE_STANDARD_H_
+typedef struct {
+ int PREFLEN;
+ int RANDELEN;
+ int RANGELOW;
+} JBig2TableLine;
+const FX_BOOL HuffmanTable_HTOOB_B1 = FALSE;
+const JBig2TableLine HuffmanTable_B1[] = {
+ { 1, 4, 0 },
+ { 2, 8, 16 },
+ { 3, 16, 272 },
+ { 0, 32, -1 },
+ { 3, 32, 65808 }
+};
+const FX_BOOL HuffmanTable_HTOOB_B2 = TRUE;
+const JBig2TableLine HuffmanTable_B2[] = {
+ { 1, 0, 0 },
+ { 2, 0, 1 },
+ { 3, 0, 2 },
+ { 4, 3, 3 },
+ { 5, 6, 11 },
+ { 0, 32, -1 },
+ { 6, 32, 75 },
+ { 6, 0, 0 }
+};
+const FX_BOOL HuffmanTable_HTOOB_B3 = TRUE;
+const JBig2TableLine HuffmanTable_B3[] = {
+ { 8, 8, -256 },
+ { 1, 0, 0 },
+ { 2, 0, 1 },
+ { 3, 0, 2 },
+ { 4, 3, 3 },
+ { 5, 6, 11 },
+ { 8, 32, -257 },
+ { 7, 32, 75 },
+ { 6, 0, 0 }
+};
+const FX_BOOL HuffmanTable_HTOOB_B4 = FALSE;
+const JBig2TableLine HuffmanTable_B4[] = {
+ { 1, 0, 1 },
+ { 2, 0, 2 },
+ { 3, 0, 3 },
+ { 4, 3, 4 },
+ { 5, 6, 12 },
+ { 0, 32, -1 },
+ { 5, 32, 76 },
+};
+const FX_BOOL HuffmanTable_HTOOB_B5 = FALSE;
+const JBig2TableLine HuffmanTable_B5[] = {
+ { 7, 8, -255 },
+ { 1, 0, 1 },
+ { 2, 0, 2 },
+ { 3, 0, 3 },
+ { 4, 3, 4 },
+ { 5, 6, 12 },
+ { 7, 32, -256 },
+ { 6, 32, 76 }
+};
+const FX_BOOL HuffmanTable_HTOOB_B6 = FALSE;
+const JBig2TableLine HuffmanTable_B6[] = {
+ { 5, 10, -2048 },
+ { 4, 9, -1024 },
+ { 4, 8, -512 },
+ { 4, 7, -256 },
+ { 5, 6, -128 },
+ { 5, 5, -64 },
+ { 4, 5, -32 },
+ { 2, 7, 0 },
+ { 3, 7, 128 },
+ { 3, 8, 256 },
+ { 4, 9, 512 },
+ { 4, 10, 1024 },
+ { 6, 32, -2049 },
+ { 6, 32, 2048 }
+};
+const FX_BOOL HuffmanTable_HTOOB_B7 = FALSE;
+const JBig2TableLine HuffmanTable_B7[] = {
+ { 4, 9, -1024 },
+ { 3, 8, -512 },
+ { 4, 7, -256 },
+ { 5, 6, -128 },
+ { 5, 5, -64 },
+ { 4, 5, -32 },
+ { 4, 5, 0 },
+ { 5, 5, 32 },
+ { 5, 6, 64 },
+ { 4, 7, 128 },
+ { 3, 8, 256 },
+ { 3, 9, 512 },
+ { 3, 10, 1024 },
+ { 5, 32, -1025 },
+ { 5, 32, 2048 },
+};
+const FX_BOOL HuffmanTable_HTOOB_B8 = TRUE;
+const JBig2TableLine HuffmanTable_B8[] = {
+ { 8, 3, -15 },
+ { 9, 1, -7 },
+ { 8, 1, -5 },
+ { 9, 0, -3 },
+ { 7, 0, -2 },
+ { 4, 0, -1 },
+ { 2, 1, 0 },
+ { 5, 0, 2 },
+ { 6, 0, 3 },
+ { 3, 4, 4 },
+ { 6, 1, 20 },
+ { 4, 4, 22 },
+ { 4, 5, 38 },
+ { 5, 6, 70 },
+ { 5, 7, 134 },
+ { 6, 7, 262 },
+ { 7, 8, 390 },
+ { 6, 10, 646 },
+ { 9, 32, -16 },
+ { 9, 32, 1670 },
+ { 2, 0, 0 }
+};
+const FX_BOOL HuffmanTable_HTOOB_B9 = TRUE;
+const JBig2TableLine HuffmanTable_B9[] = {
+ { 8, 4, -31 },
+ { 9, 2, -15 },
+ { 8, 2, -11 },
+ { 9, 1, -7 },
+ { 7, 1, -5 },
+ { 4, 1, -3 },
+ { 3, 1, -1 },
+ { 3, 1, 1 },
+ { 5, 1, 3 },
+ { 6, 1, 5 },
+ { 3, 5, 7 },
+ { 6, 2, 39 },
+ { 4, 5, 43 },
+ { 4, 6, 75 },
+ { 5, 7, 139 },
+ { 5, 8, 267 },
+ { 6, 8, 523 },
+ { 7, 9, 779 },
+ { 6, 11, 1291 },
+ { 9, 32, -32 },
+ { 9, 32, 3339 },
+ { 2, 0, 0 }
+};
+const FX_BOOL HuffmanTable_HTOOB_B10 = TRUE;
+const JBig2TableLine HuffmanTable_B10[] = {
+ { 7, 4, -21 },
+ { 8, 0, -5 },
+ { 7, 0, -4 },
+ { 5, 0, -3 },
+ { 2, 2, -2 },
+ { 5, 0, 2 },
+ { 6, 0, 3 },
+ { 7, 0, 4 },
+ { 8, 0, 5 },
+ { 2, 6, 6 },
+ { 5, 5, 70 },
+ { 6, 5, 102 },
+ { 6, 6, 134 },
+ { 6, 7, 198 },
+ { 6, 8, 326 },
+ { 6, 9, 582 },
+ { 6, 10, 1094 },
+ { 7, 11, 2118 },
+ { 8, 32, -22 },
+ { 8, 32, 4166 },
+ { 2, 0, 0 }
+};
+const FX_BOOL HuffmanTable_HTOOB_B11 = FALSE;
+const JBig2TableLine HuffmanTable_B11[] = {
+ { 1, 0, 1 },
+ { 2, 1, 2 },
+ { 4, 0, 4 },
+ { 4, 1, 5 },
+ { 5, 1, 7 },
+ { 5, 2, 9 },
+ { 6, 2, 13 },
+ { 7, 2, 17 },
+ { 7, 3, 21 },
+ { 7, 4, 29 },
+ { 7, 5, 45 },
+ { 7, 6, 77 },
+ { 0, 32, 0 },
+ { 7, 32, 141 }
+};
+const FX_BOOL HuffmanTable_HTOOB_B12 = FALSE;
+const JBig2TableLine HuffmanTable_B12[] = {
+ { 1, 0, 1 },
+ { 2, 0, 2 },
+ { 3, 1, 3 },
+ { 5, 0, 5 },
+ { 5, 1, 6 },
+ { 6, 1, 8 },
+ { 7, 0, 10 },
+ { 7, 1, 11 },
+ { 7, 2, 13 },
+ { 7, 3, 17 },
+ { 7, 4, 25 },
+ { 8, 5, 41 },
+ { 0, 32, 0 },
+ { 8, 32, 73 }
+};
+const FX_BOOL HuffmanTable_HTOOB_B13 = FALSE;
+const JBig2TableLine HuffmanTable_B13[] = {
+ { 1, 0, 1 },
+ { 3, 0, 2 },
+ { 4, 0, 3 },
+ { 5, 0, 4 },
+ { 4, 1, 5 },
+ { 3, 3, 7 },
+ { 6, 1, 15 },
+ { 6, 2, 17 },
+ { 6, 3, 21 },
+ { 6, 4, 29 },
+ { 6, 5, 45 },
+ { 7, 6, 77 },
+ { 0, 32, 0 },
+ { 7, 32, 141 }
+};
+const FX_BOOL HuffmanTable_HTOOB_B14 = FALSE;
+const JBig2TableLine HuffmanTable_B14[] = {
+ { 3, 0, -2 },
+ { 3, 0, -1 },
+ { 1, 0, 0 },
+ { 3, 0, 1 },
+ { 3, 0, 2 },
+ { 0, 32, -3 },
+ { 0, 32, 3 }
+};
+const FX_BOOL HuffmanTable_HTOOB_B15 = FALSE;
+const JBig2TableLine HuffmanTable_B15[] = {
+ { 7, 4, -24 },
+ { 6, 2, -8 },
+ { 5, 1, -4 },
+ { 4, 0, -2 },
+ { 3, 0, -1 },
+ { 1, 0, 0 },
+ { 3, 0, 1 },
+ { 4, 0, 2 },
+ { 5, 1, 3 },
+ { 6, 2, 5 },
+ { 7, 4, 9 },
+ { 7, 32, -25 },
+ { 7, 32, 25 }
+};
+#endif
diff --git a/core/src/fxcodec/jbig2/JBig2_Image.cpp b/core/src/fxcodec/jbig2/JBig2_Image.cpp
index 1719028176..09353c0e81 100644
--- a/core/src/fxcodec/jbig2/JBig2_Image.cpp
+++ b/core/src/fxcodec/jbig2/JBig2_Image.cpp
@@ -1,1619 +1,1619 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "JBig2_Image.h"
-#include "../../../include/fxcrt/fx_basic.h"
-#include "../../../include/fxcrt/fx_coordinates.h"
-#include <limits.h>
-CJBig2_Image::CJBig2_Image(FX_INT32 w, FX_INT32 h)
-{
- m_nWidth = w;
- m_nHeight = h;
- if (m_nWidth <= 0 || m_nHeight <= 0 || m_nWidth > INT_MAX - 31) {
- m_pData = NULL;
- m_bNeedFree = FALSE;
- return;
- }
- m_nStride = ((w + 31) >> 5) << 2;
- if (m_nStride * m_nHeight > 0 && 104857600 / (int)m_nStride > m_nHeight) {
- m_pData = (FX_BYTE *)m_pModule->JBig2_Malloc2(m_nStride, m_nHeight);
- } else {
- m_pData = NULL;
- }
- m_bNeedFree = TRUE;
-}
-CJBig2_Image::CJBig2_Image(FX_INT32 w, FX_INT32 h, FX_INT32 stride, FX_BYTE*pBuf)
-{
- m_nWidth = w;
- m_nHeight = h;
- m_nStride = stride;
- m_pData = pBuf;
- m_bNeedFree = FALSE;
-}
-CJBig2_Image::CJBig2_Image(CJBig2_Image &im)
-{
- m_pModule = im.m_pModule;
- m_nWidth = im.m_nWidth;
- m_nHeight = im.m_nHeight;
- m_nStride = im.m_nStride;
- if (im.m_pData) {
- m_pData = (FX_BYTE*)m_pModule->JBig2_Malloc2(m_nStride, m_nHeight);
- JBIG2_memcpy(m_pData, im.m_pData, m_nStride * m_nHeight);
- } else {
- m_pData = NULL;
- }
- m_bNeedFree = TRUE;
-}
-CJBig2_Image::~CJBig2_Image()
-{
- if(m_bNeedFree && m_pData) {
- m_pModule->JBig2_Free(m_pData);
- }
-}
-FX_BOOL CJBig2_Image::getPixel(FX_INT32 x, FX_INT32 y)
-{
- if (!m_pData) {
- return 0;
- }
- FX_INT32 m, n;
- if(x < 0 || x >= m_nWidth) {
- return 0;
- }
- if(y < 0 || y >= m_nHeight) {
- return 0;
- }
- m = y * m_nStride + (x >> 3);
- n = x & 7;
- return ((m_pData[m] >> (7 - n)) & 1);
-}
-
-FX_INT32 CJBig2_Image::setPixel(FX_INT32 x, FX_INT32 y, FX_BOOL v)
-{
- if (!m_pData) {
- return 0;
- }
- FX_INT32 m, n;
- if(x < 0 || x >= m_nWidth) {
- return 0;
- }
- if(y < 0 || y >= m_nHeight) {
- return 0;
- }
- m = y * m_nStride + (x >> 3);
- n = x & 7;
- if(v) {
- m_pData[m] |= 1 << (7 - n);
- } else {
- m_pData[m] &= ~(1 << (7 - n));
- }
- return 1;
-}
-void CJBig2_Image::copyLine(FX_INT32 hTo, FX_INT32 hFrom)
-{
- if (!m_pData) {
- return;
- }
- if(hFrom < 0 || hFrom >= m_nHeight) {
- JBIG2_memset(m_pData + hTo * m_nStride, 0, m_nStride);
- } else {
- JBIG2_memcpy(m_pData + hTo * m_nStride, m_pData + hFrom * m_nStride, m_nStride);
- }
-}
-void CJBig2_Image::fill(FX_BOOL v)
-{
- if (!m_pData) {
- return;
- }
- JBIG2_memset(m_pData, v ? 0xff : 0, m_nStride * m_nHeight);
-}
-FX_BOOL CJBig2_Image::composeTo(CJBig2_Image *pDst, FX_INT32 x, FX_INT32 y, JBig2ComposeOp op)
-{
- if (!m_pData) {
- return FALSE;
- }
- return composeTo_opt2(pDst, x, y, op);
-}
-FX_BOOL CJBig2_Image::composeTo(CJBig2_Image *pDst, FX_INT32 x, FX_INT32 y, JBig2ComposeOp op, const FX_RECT* pSrcRect)
-{
- if (!m_pData) {
- return FALSE;
- }
- if (NULL == pSrcRect || *pSrcRect == FX_RECT(0, 0, m_nWidth, m_nHeight)) {
- return composeTo_opt2(pDst, x, y, op);
- }
- return composeTo_opt2(pDst, x, y, op, pSrcRect);
-}
-FX_BOOL CJBig2_Image::composeTo_unopt(CJBig2_Image *pDst, FX_INT32 x, FX_INT32 y, JBig2ComposeOp op)
-{
- FX_INT32 w, h, dx, dy;
- FX_INT32 i, j;
- w = m_nWidth;
- h = m_nHeight;
- dx = dy = 0;
- if(x < 0) {
- dx += -x;
- w -= -x;
- x = 0;
- }
- if(y < 0) {
- dy += -y;
- h -= -y;
- y = 0;
- }
- if(x + w > pDst->m_nWidth) {
- w = pDst->m_nWidth - x;
- }
- if(y + h > pDst->m_nHeight) {
- h = pDst->m_nHeight - y;
- }
- switch(op) {
- case JBIG2_COMPOSE_OR:
- for(j = 0; j < h; j++) {
- for(i = 0; i < w; i++) {
- pDst->setPixel(x + i, y + j,
- (getPixel(i + dx, j + dy) | pDst->getPixel(x + i, y + j)) & 1);
- }
- }
- break;
- case JBIG2_COMPOSE_AND:
- for(j = 0; j < h; j++) {
- for(i = 0; i < w; i++) {
- pDst->setPixel(x + i, y + j,
- (getPixel(i + dx, j + dy) & pDst->getPixel(x + i, y + j)) & 1);
- }
- }
- break;
- case JBIG2_COMPOSE_XOR:
- for(j = 0; j < h; j++) {
- for(i = 0; i < w; i++) {
- pDst->setPixel(x + i, y + j,
- (getPixel(i + dx, j + dy) ^ pDst->getPixel(x + i, y + j)) & 1);
- }
- }
- break;
- case JBIG2_COMPOSE_XNOR:
- for(j = 0; j < h; j++) {
- for(i = 0; i < w; i++) {
- pDst->setPixel(x + i, y + j,
- (~(getPixel(i + dx, j + dy) ^ pDst->getPixel(x + i, y + j))) & 1);
- }
- }
- break;
- case JBIG2_COMPOSE_REPLACE:
- for(j = 0; j < h; j++) {
- for(i = 0; i < w; i++) {
- pDst->setPixel(x + i, y + j, getPixel(i + dx, j + dy));
- }
- }
- break;
- }
- return TRUE;
-}
-
-FX_BOOL CJBig2_Image::composeTo_opt(CJBig2_Image *pDst, FX_INT32 x, FX_INT32 y, JBig2ComposeOp op)
-{
- FX_INT32 x0, x1, y0, y1, xx, yy;
- FX_BYTE *pLineSrc, *pLineDst, *srcPtr, *destPtr;
- FX_DWORD src0, src1, src, dest, s1, s2, m1, m2, m3;
- FX_BOOL oneByte;
- if (!m_pData) {
- return FALSE;
- }
- if (y < 0) {
- y0 = -y;
- } else {
- y0 = 0;
- }
- if (y + m_nHeight > pDst->m_nHeight) {
- y1 = pDst->m_nHeight - y;
- } else {
- y1 = m_nHeight;
- }
- if (y0 >= y1) {
- return FALSE;
- }
- if (x >= 0) {
- x0 = x & ~7;
- } else {
- x0 = 0;
- }
- x1 = x + m_nWidth;
- if (x1 > pDst->m_nWidth) {
- x1 = pDst->m_nWidth;
- }
- if (x0 >= x1) {
- return FALSE;
- }
- s1 = x & 7;
- s2 = 8 - s1;
- m1 = 0xff >> (x1 & 7);
- m2 = 0xff << (((x1 & 7) == 0) ? 0 : 8 - (x1 & 7));
- m3 = (0xff >> s1) & m2;
- oneByte = x0 == ((x1 - 1) & ~7);
- pLineDst = pDst->m_pData + y * pDst->m_nStride;
- pLineSrc = m_pData + y0 * m_nStride;
- if(oneByte) {
- if(x >= 0) {
- switch(op) {
- case JBIG2_COMPOSE_OR: {
- for (yy = y0; yy < y1; ++yy) {
- destPtr = pLineDst + (x >> 3);
- srcPtr = pLineSrc;
- dest = *destPtr;
- dest |= (*srcPtr >> s1) & m2;
- *destPtr = (FX_BYTE)dest;
- pLineDst += pDst->m_nStride;
- pLineSrc += m_nStride;
- }
- }
- break;
- case JBIG2_COMPOSE_AND: {
- for (yy = y0; yy < y1; ++yy) {
- destPtr = pLineDst + (x >> 3);
- srcPtr = pLineSrc;
- dest = *destPtr;
- dest &= ((0xff00 | *srcPtr) >> s1) | m1;
- *destPtr = (FX_BYTE)dest;
- pLineDst += pDst->m_nStride;
- pLineSrc += m_nStride;
- }
- }
- break;
- case JBIG2_COMPOSE_XOR: {
- for (yy = y0; yy < y1; ++yy) {
- destPtr = pLineDst + (x >> 3);
- srcPtr = pLineSrc;
- dest = *destPtr;
- dest ^= (*srcPtr >> s1) & m2;
- *destPtr = (FX_BYTE)dest;
- pLineDst += pDst->m_nStride;
- pLineSrc += m_nStride;
- }
- }
- break;
- case JBIG2_COMPOSE_XNOR: {
- for (yy = y0; yy < y1; ++yy) {
- destPtr = pLineDst + (x >> 3);
- srcPtr = pLineSrc;
- dest = *destPtr;
- dest ^= ((*srcPtr ^ 0xff) >> s1) & m2;
- *destPtr = (FX_BYTE)dest;
- pLineDst += pDst->m_nStride;
- pLineSrc += m_nStride;
- }
- }
- break;
- case JBIG2_COMPOSE_REPLACE: {
- for (yy = y0; yy < y1; ++yy) {
- destPtr = pLineDst + (x >> 3);
- srcPtr = pLineSrc;
- dest = *destPtr;
- dest = (dest & ~m3) | ((*srcPtr >> s1) & m3);
- *destPtr = (FX_BYTE)dest;
- pLineDst += pDst->m_nStride;
- pLineSrc += m_nStride;
- }
- }
- break;
- }
- } else {
- switch(op) {
- case JBIG2_COMPOSE_OR: {
- for(yy = y0; yy < y1; ++yy) {
- destPtr = pLineDst;
- srcPtr = pLineSrc + (-x >> 3);
- dest = *destPtr;
- dest |= *srcPtr & m2;
- *destPtr = (FX_BYTE)dest;
- pLineDst += pDst->m_nStride;
- pLineSrc += m_nStride;
- }
- }
- break;
- case JBIG2_COMPOSE_AND: {
- for(yy = y0; yy < y1; ++yy) {
- destPtr = pLineDst;
- srcPtr = pLineSrc + (-x >> 3);
- dest = *destPtr;
- dest &= *srcPtr | m1;
- *destPtr = (FX_BYTE)dest;
- pLineDst += pDst->m_nStride;
- pLineSrc += m_nStride;
- }
- }
- break;
- case JBIG2_COMPOSE_XOR: {
- for(yy = y0; yy < y1; ++yy) {
- destPtr = pLineDst;
- srcPtr = pLineSrc + (-x >> 3);
- dest = *destPtr;
- dest ^= *srcPtr & m2;
- *destPtr = (FX_BYTE)dest;
- pLineDst += pDst->m_nStride;
- pLineSrc += m_nStride;
- }
- }
- break;
- case JBIG2_COMPOSE_XNOR: {
- for(yy = y0; yy < y1; ++yy) {
- destPtr = pLineDst;
- srcPtr = pLineSrc + (-x >> 3);
- dest = *destPtr;
- dest ^= (*srcPtr ^ 0xff) & m2;
- *destPtr = (FX_BYTE)dest;
- pLineDst += pDst->m_nStride;
- pLineSrc += m_nStride;
- }
- }
- break;
- case JBIG2_COMPOSE_REPLACE: {
- for(yy = y0; yy < y1; ++yy) {
- destPtr = pLineDst;
- srcPtr = pLineSrc + (-x >> 3);
- dest = *destPtr;
- dest = (*srcPtr & m2) | (dest & m1);
- *destPtr = (FX_BYTE)dest;
- pLineDst += pDst->m_nStride;
- pLineSrc += m_nStride;
- }
- }
- break;
- }
- }
- } else {
- if(x >= 0) {
- switch(op) {
- case JBIG2_COMPOSE_OR: {
- for(yy = y0; yy < y1; ++yy) {
- destPtr = pLineDst + (x >> 3);
- srcPtr = pLineSrc;
- src1 = *srcPtr++;
- dest = *destPtr;
- dest |= src1 >> s1;
- *destPtr++ = (FX_BYTE)dest;
- xx = x0 + 8;
- for (; xx < x1 - 8; xx += 8) {
- dest = *destPtr;
- src0 = src1;
- src1 = *srcPtr++;
- src = (((src0 << 8) | src1) >> s1) & 0xff;
- dest |= src;
- *destPtr++ = (FX_BYTE)dest;
- }
- dest = *destPtr;
- src0 = src1;
- if(srcPtr - pLineSrc < m_nStride) {
- src1 = *srcPtr++;
- } else {
- src1 = 0;
- }
- src = (((src0 << 8) | src1) >> s1) & 0xff;
- dest |= src & m2;
- *destPtr = (FX_BYTE)dest;
- pLineDst += pDst->m_nStride;
- pLineSrc += m_nStride;
- }
- }
- break;
- case JBIG2_COMPOSE_AND: {
- for(yy = y0; yy < y1; ++yy) {
- destPtr = pLineDst + (x >> 3);
- srcPtr = pLineSrc;
- src1 = *srcPtr++;
- dest = *destPtr;
- dest &= (0xff00 | src1) >> s1;
- *destPtr++ = (FX_BYTE)dest;
- xx = x0 + 8;
- for (; xx < x1 - 8; xx += 8) {
- dest = *destPtr;
- src0 = src1;
- src1 = *srcPtr++;
- src = (((src0 << 8) | src1) >> s1) & 0xff;
- dest &= src;
- *destPtr++ = (FX_BYTE)dest;
- }
- dest = *destPtr;
- src0 = src1;
- if(srcPtr - pLineSrc < m_nStride) {
- src1 = *srcPtr++;
- } else {
- src1 = 0;
- }
- src = (((src0 << 8) | src1) >> s1) & 0xff;
- dest &= src | m1;
- *destPtr = (FX_BYTE)dest;
- pLineDst += pDst->m_nStride;
- pLineSrc += m_nStride;
- }
- }
- break;
- case JBIG2_COMPOSE_XOR: {
- for(yy = y0; yy < y1; ++yy) {
- destPtr = pLineDst + (x >> 3);
- srcPtr = pLineSrc;
- src1 = *srcPtr++;
- dest = *destPtr;
- dest ^= src1 >> s1;
- *destPtr++ = (FX_BYTE)dest;
- xx = x0 + 8;
- for (; xx < x1 - 8; xx += 8) {
- dest = *destPtr;
- src0 = src1;
- src1 = *srcPtr++;
- src = (((src0 << 8) | src1) >> s1) & 0xff;
- dest ^= src;
- *destPtr++ = (FX_BYTE)dest;
- }
- dest = *destPtr;
- src0 = src1;
- if(srcPtr - pLineSrc < m_nStride) {
- src1 = *srcPtr++;
- } else {
- src1 = 0;
- }
- src = (((src0 << 8) | src1) >> s1) & 0xff;
- dest ^= src & m2;
- *destPtr = (FX_BYTE)dest;
- pLineDst += pDst->m_nStride;
- pLineSrc += m_nStride;
- }
- }
- break;
- case JBIG2_COMPOSE_XNOR: {
- for(yy = y0; yy < y1; ++yy) {
- destPtr = pLineDst + (x >> 3);
- srcPtr = pLineSrc;
- src1 = *srcPtr++;
- dest = *destPtr;
- dest ^= (src1 ^ 0xff) >> s1;
- *destPtr++ = (FX_BYTE)dest;
- xx = x0 + 8;
- for (; xx < x1 - 8; xx += 8) {
- dest = *destPtr;
- src0 = src1;
- src1 = *srcPtr++;
- src = (((src0 << 8) | src1) >> s1) & 0xff;
- dest ^= src ^ 0xff;
- *destPtr++ = (FX_BYTE)dest;
- }
- dest = *destPtr;
- src0 = src1;
- if(srcPtr - pLineSrc < m_nStride) {
- src1 = *srcPtr++;
- } else {
- src1 = 0;
- }
- src = (((src0 << 8) | src1) >> s1) & 0xff;
- dest ^= (src ^ 0xff) & m2;
- *destPtr = (FX_BYTE)dest;
- pLineDst += pDst->m_nStride;
- pLineSrc += m_nStride;
- }
- }
- break;
- case JBIG2_COMPOSE_REPLACE: {
- for(yy = y0; yy < y1; ++yy) {
- destPtr = pLineDst + (x >> 3);
- srcPtr = pLineSrc;
- src1 = *srcPtr++;
- dest = *destPtr;
- dest = (dest & (0xff << s2)) | (src1 >> s1);
- *destPtr++ = (FX_BYTE)dest;
- xx = x0 + 8;
- for (; xx < x1 - 8; xx += 8) {
- dest = *destPtr;
- src0 = src1;
- src1 = *srcPtr++;
- src = (((src0 << 8) | src1) >> s1) & 0xff;
- dest = src;
- *destPtr++ = (FX_BYTE)dest;
- }
- dest = *destPtr;
- src0 = src1;
- if(srcPtr - pLineSrc < m_nStride) {
- src1 = *srcPtr++;
- } else {
- src1 = 0;
- }
- src = (((src0 << 8) | src1) >> s1) & 0xff;
- dest = (src & m2) | (dest & m1);
- *destPtr = (FX_BYTE)dest;
- pLineDst += pDst->m_nStride;
- pLineSrc += m_nStride;
- }
- }
- break;
- }
- } else {
- switch(op) {
- case JBIG2_COMPOSE_OR: {
- for(yy = y0; yy < y1; ++yy) {
- destPtr = pLineDst;
- srcPtr = pLineSrc + (-x >> 3);
- src1 = *srcPtr++;
- xx = x0;
- for (; xx < x1 - 8; xx += 8) {
- dest = *destPtr;
- src0 = src1;
- src1 = *srcPtr++;
- src = (((src0 << 8) | src1) >> s1) & 0xff;
- dest |= src;
- *destPtr++ = (FX_BYTE)dest;
- }
- dest = *destPtr;
- src0 = src1;
- if(srcPtr - pLineSrc < m_nStride) {
- src1 = *srcPtr++;
- } else {
- src1 = 0;
- }
- src = (((src0 << 8) | src1) >> s1) & 0xff;
- dest |= src & m2;
- *destPtr = (FX_BYTE)dest;
- pLineDst += pDst->m_nStride;
- pLineSrc += m_nStride;
- }
- }
- break;
- case JBIG2_COMPOSE_AND: {
- for(yy = y0; yy < y1; ++yy) {
- destPtr = pLineDst;
- srcPtr = pLineSrc + (-x >> 3);
- src1 = *srcPtr++;
- xx = x0;
- for (; xx < x1 - 8; xx += 8) {
- dest = *destPtr;
- src0 = src1;
- src1 = *srcPtr++;
- src = (((src0 << 8) | src1) >> s1) & 0xff;
- dest &= src;
- *destPtr++ = (FX_BYTE)dest;
- }
- dest = *destPtr;
- src0 = src1;
- if(srcPtr - pLineSrc < m_nStride) {
- src1 = *srcPtr++;
- } else {
- src1 = 0;
- }
- src = (((src0 << 8) | src1) >> s1) & 0xff;
- dest &= src | m1;
- *destPtr = (FX_BYTE)dest;
- pLineDst += pDst->m_nStride;
- pLineSrc += m_nStride;
- }
- }
- break;
- case JBIG2_COMPOSE_XOR: {
- for(yy = y0; yy < y1; ++yy) {
- destPtr = pLineDst;
- srcPtr = pLineSrc + (-x >> 3);
- src1 = *srcPtr++;
- xx = x0;
- for (; xx < x1 - 8; xx += 8) {
- dest = *destPtr;
- src0 = src1;
- src1 = *srcPtr++;
- src = (((src0 << 8) | src1) >> s1) & 0xff;
- dest ^= src;
- *destPtr++ = (FX_BYTE)dest;
- }
- dest = *destPtr;
- src0 = src1;
- if(srcPtr - pLineSrc < m_nStride) {
- src1 = *srcPtr++;
- } else {
- src1 = 0;
- }
- src = (((src0 << 8) | src1) >> s1) & 0xff;
- dest ^= src & m2;
- *destPtr = (FX_BYTE)dest;
- pLineDst += pDst->m_nStride;
- pLineSrc += m_nStride;
- }
- }
- break;
- case JBIG2_COMPOSE_XNOR: {
- for(yy = y0; yy < y1; ++yy) {
- destPtr = pLineDst;
- srcPtr = pLineSrc + (-x >> 3);
- src1 = *srcPtr++;
- xx = x0;
- for (; xx < x1 - 8; xx += 8) {
- dest = *destPtr;
- src0 = src1;
- src1 = *srcPtr++;
- src = (((src0 << 8) | src1) >> s1) & 0xff;
- dest ^= src ^ 0xff;
- *destPtr++ = (FX_BYTE)dest;
- }
- dest = *destPtr;
- src0 = src1;
- if(srcPtr - pLineSrc < m_nStride) {
- src1 = *srcPtr++;
- } else {
- src1 = 0;
- }
- src = (((src0 << 8) | src1) >> s1) & 0xff;
- dest ^= (src ^ 0xff) & m2;
- *destPtr = (FX_BYTE)dest;
- pLineDst += pDst->m_nStride;
- pLineSrc += m_nStride;
- }
- }
- break;
- case JBIG2_COMPOSE_REPLACE: {
- for(yy = y0; yy < y1; ++yy) {
- destPtr = pLineDst;
- srcPtr = pLineSrc + (-x >> 3);
- src1 = *srcPtr++;
- xx = x0;
- for (; xx < x1 - 8; xx += 8) {
- dest = *destPtr;
- src0 = src1;
- src1 = *srcPtr++;
- src = (((src0 << 8) | src1) >> s1) & 0xff;
- dest = src;
- *destPtr++ = (FX_BYTE)dest;
- }
- dest = *destPtr;
- src0 = src1;
- if(srcPtr - pLineSrc < m_nStride) {
- src1 = *srcPtr++;
- } else {
- src1 = 0;
- }
- src = (((src0 << 8) | src1) >> s1) & 0xff;
- dest = (src & m2) | (dest & m1);
- *destPtr = (FX_BYTE)dest;
- pLineDst += pDst->m_nStride;
- pLineSrc += m_nStride;
- }
- }
- break;
- }
- }
- }
- return TRUE;
-}
-FX_BOOL CJBig2_Image::composeFrom(FX_INT32 x, FX_INT32 y, CJBig2_Image *pSrc, JBig2ComposeOp op)
-{
- if (!m_pData) {
- return FALSE;
- }
- return pSrc->composeTo(this, x, y, op);
-}
-FX_BOOL CJBig2_Image::composeFrom(FX_INT32 x, FX_INT32 y, CJBig2_Image *pSrc, JBig2ComposeOp op, const FX_RECT* pSrcRect)
-{
- if (!m_pData) {
- return FALSE;
- }
- return pSrc->composeTo(this, x, y, op, pSrcRect);
-}
-CJBig2_Image *CJBig2_Image::subImage_unopt(FX_INT32 x, FX_INT32 y, FX_INT32 w, FX_INT32 h)
-{
- CJBig2_Image *pImage;
- FX_INT32 i, j;
- JBIG2_ALLOC(pImage, CJBig2_Image(w, h));
- for(j = 0; j < h; j++) {
- for(i = 0; i < w; i++) {
- pImage->setPixel(i, j, getPixel(x + i, y + j));
- }
- }
- return pImage;
-}
-#define JBIG2_GETDWORD(buf) ((FX_DWORD)(((buf)[0] << 24) | ((buf)[1] << 16) | ((buf)[2] << 8) | (buf)[3]))
-CJBig2_Image *CJBig2_Image::subImage(FX_INT32 x, FX_INT32 y, FX_INT32 w, FX_INT32 h)
-{
- CJBig2_Image *pImage;
- FX_INT32 m, n, j;
- FX_BYTE *pLineSrc, *pLineDst;
- FX_DWORD wTmp;
- FX_BYTE *pSrc, *pSrcEnd, *pDst, *pDstEnd;
- if (w == 0 || h == 0) {
- return NULL;
- }
- JBIG2_ALLOC(pImage, CJBig2_Image(w, h));
- if (!m_pData) {
- pImage->fill(0);
- return pImage;
- }
- if (!pImage->m_pData) {
- return pImage;
- }
- pLineSrc = m_pData + m_nStride * y;
- pLineDst = pImage->m_pData;
- m = (x >> 5) << 2;
- n = x & 31;
- if(n == 0) {
- for(j = 0; j < h; j++) {
- pSrc = pLineSrc + m;
- pSrcEnd = pLineSrc + m_nStride;
- pDst = pLineDst;
- pDstEnd = pLineDst + pImage->m_nStride;
- for(; pDst < pDstEnd; pSrc += 4, pDst += 4) {
- *((FX_DWORD *)pDst) = *((FX_DWORD *)pSrc);
- }
- pLineSrc += m_nStride;
- pLineDst += pImage->m_nStride;
- }
- } else {
- for(j = 0; j < h; j++) {
- pSrc = pLineSrc + m;
- pSrcEnd = pLineSrc + m_nStride;
- pDst = pLineDst;
- pDstEnd = pLineDst + pImage->m_nStride;
- for(; pDst < pDstEnd; pSrc += 4, pDst += 4) {
- if(pSrc + 4 < pSrcEnd) {
- wTmp = (JBIG2_GETDWORD(pSrc) << n) | (JBIG2_GETDWORD(pSrc + 4) >> (32 - n));
- } else {
- wTmp = JBIG2_GETDWORD(pSrc) << n;
- }
- pDst[0] = (FX_BYTE)(wTmp >> 24);
- pDst[1] = (FX_BYTE)(wTmp >> 16);
- pDst[2] = (FX_BYTE)(wTmp >> 8);
- pDst[3] = (FX_BYTE)wTmp;
- }
- pLineSrc += m_nStride;
- pLineDst += pImage->m_nStride;
- }
- }
- return pImage;
-}
-void CJBig2_Image::expand(FX_INT32 h, FX_BOOL v)
-{
- if (!m_pData) {
- return;
- }
- m_pData = (FX_BYTE*)m_pModule->JBig2_Realloc(m_pData, h * m_nStride);
- if(h > m_nHeight) {
- JBIG2_memset(m_pData + m_nHeight * m_nStride, v ? 0xff : 0, (h - m_nHeight)*m_nStride);
- }
- m_nHeight = h;
-}
-FX_BOOL CJBig2_Image::composeTo_opt2(CJBig2_Image *pDst, FX_INT32 x, FX_INT32 y, JBig2ComposeOp op)
-{
- FX_INT32 xs0, ys0, xs1, ys1, xd0, yd0, xd1, yd1, xx, yy, w, h, middleDwords, lineLeft;
- FX_DWORD s1, d1, d2, shift, shift1, shift2, tmp, tmp1, tmp2, maskL, maskR, maskM;
- FX_BYTE *lineSrc, *lineDst, *sp, *dp;
- if (!m_pData) {
- return FALSE;
- }
- if (x < -1048576 || x > 1048576 || y < -1048576 || y > 1048576) {
- return FALSE;
- }
- if(y < 0) {
- ys0 = -y;
- } else {
- ys0 = 0;
- }
- if(y + m_nHeight > pDst->m_nHeight) {
- ys1 = pDst->m_nHeight - y;
- } else {
- ys1 = m_nHeight;
- }
- if(x < 0) {
- xs0 = -x;
- } else {
- xs0 = 0;
- }
- if(x + m_nWidth > pDst->m_nWidth) {
- xs1 = pDst->m_nWidth - x;
- } else {
- xs1 = m_nWidth;
- }
- if((ys0 >= ys1) || (xs0 >= xs1)) {
- return 0;
- }
- w = xs1 - xs0;
- h = ys1 - ys0;
- if(y < 0) {
- yd0 = 0;
- } else {
- yd0 = y;
- }
- if(x < 0) {
- xd0 = 0;
- } else {
- xd0 = x;
- }
- xd1 = xd0 + w;
- yd1 = yd0 + h;
- d1 = xd0 & 31;
- d2 = xd1 & 31;
- s1 = xs0 & 31;
- maskL = 0xffffffff >> d1;
- maskR = 0xffffffff << ((32 - (xd1 & 31)) % 32);
- maskM = maskL & maskR;
- lineSrc = m_pData + ys0 * m_nStride + ((xs0 >> 5) << 2);
- lineLeft = m_nStride - ((xs0 >> 5) << 2);
- lineDst = pDst->m_pData + yd0 * pDst->m_nStride + ((xd0 >> 5) << 2);
- if((xd0 & ~31) == ((xd1 - 1) & ~31)) {
- if((xs0 & ~31) == ((xs1 - 1) & ~31)) {
- if(s1 > d1) {
- shift = s1 - d1;
- for(yy = yd0; yy < yd1; yy++) {
- tmp1 = JBIG2_GETDWORD(lineSrc) << shift;
- tmp2 = JBIG2_GETDWORD(lineDst);
- switch(op) {
- case JBIG2_COMPOSE_OR:
- tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM);
- break;
- case JBIG2_COMPOSE_AND:
- tmp = (tmp2 & ~maskM) | ((tmp1 & tmp2) & maskM);
- break;
- case JBIG2_COMPOSE_XOR:
- tmp = (tmp2 & ~maskM) | ((tmp1 ^ tmp2) & maskM);
- break;
- case JBIG2_COMPOSE_XNOR:
- tmp = (tmp2 & ~maskM) | ((~(tmp1 ^ tmp2)) & maskM);
- break;
- case JBIG2_COMPOSE_REPLACE:
- tmp = (tmp2 & ~maskM) | (tmp1 & maskM);
- break;
- }
- lineDst[0] = (FX_BYTE)(tmp >> 24);
- lineDst[1] = (FX_BYTE)(tmp >> 16);
- lineDst[2] = (FX_BYTE)(tmp >> 8);
- lineDst[3] = (FX_BYTE)tmp;
- lineSrc += m_nStride;
- lineDst += pDst->m_nStride;
- }
- } else {
- shift = d1 - s1;
- for(yy = yd0; yy < yd1; yy++) {
- tmp1 = JBIG2_GETDWORD(lineSrc) >> shift;
- tmp2 = JBIG2_GETDWORD(lineDst);
- switch(op) {
- case JBIG2_COMPOSE_OR:
- tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM);
- break;
- case JBIG2_COMPOSE_AND:
- tmp = (tmp2 & ~maskM) | ((tmp1 & tmp2) & maskM);
- break;
- case JBIG2_COMPOSE_XOR:
- tmp = (tmp2 & ~maskM) | ((tmp1 ^ tmp2) & maskM);
- break;
- case JBIG2_COMPOSE_XNOR:
- tmp = (tmp2 & ~maskM) | ((~(tmp1 ^ tmp2)) & maskM);
- break;
- case JBIG2_COMPOSE_REPLACE:
- tmp = (tmp2 & ~maskM) | (tmp1 & maskM);
- break;
- }
- lineDst[0] = (FX_BYTE)(tmp >> 24);
- lineDst[1] = (FX_BYTE)(tmp >> 16);
- lineDst[2] = (FX_BYTE)(tmp >> 8);
- lineDst[3] = (FX_BYTE)tmp;
- lineSrc += m_nStride;
- lineDst += pDst->m_nStride;
- }
- }
- } else {
- shift1 = s1 - d1;
- shift2 = 32 - shift1;
- for(yy = yd0; yy < yd1; yy++) {
- tmp1 = (JBIG2_GETDWORD(lineSrc) << shift1) | (JBIG2_GETDWORD(lineSrc + 4) >> shift2);
- tmp2 = JBIG2_GETDWORD(lineDst);
- switch(op) {
- case JBIG2_COMPOSE_OR:
- tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM);
- break;
- case JBIG2_COMPOSE_AND:
- tmp = (tmp2 & ~maskM) | ((tmp1 & tmp2) & maskM);
- break;
- case JBIG2_COMPOSE_XOR:
- tmp = (tmp2 & ~maskM) | ((tmp1 ^ tmp2) & maskM);
- break;
- case JBIG2_COMPOSE_XNOR:
- tmp = (tmp2 & ~maskM) | ((~(tmp1 ^ tmp2)) & maskM);
- break;
- case JBIG2_COMPOSE_REPLACE:
- tmp = (tmp2 & ~maskM) | (tmp1 & maskM);
- break;
- }
- lineDst[0] = (FX_BYTE)(tmp >> 24);
- lineDst[1] = (FX_BYTE)(tmp >> 16);
- lineDst[2] = (FX_BYTE)(tmp >> 8);
- lineDst[3] = (FX_BYTE)tmp;
- lineSrc += m_nStride;
- lineDst += pDst->m_nStride;
- }
- }
- } else {
- if(s1 > d1) {
- shift1 = s1 - d1;
- shift2 = 32 - shift1;
- middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5);
- for(yy = yd0; yy < yd1; yy++) {
- sp = lineSrc;
- dp = lineDst;
- if(d1 != 0) {
- tmp1 = (JBIG2_GETDWORD(sp) << shift1) | (JBIG2_GETDWORD(sp + 4) >> shift2);
- tmp2 = JBIG2_GETDWORD(dp);
- switch(op) {
- case JBIG2_COMPOSE_OR:
- tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL);
- break;
- case JBIG2_COMPOSE_AND:
- tmp = (tmp2 & ~maskL) | ((tmp1 & tmp2) & maskL);
- break;
- case JBIG2_COMPOSE_XOR:
- tmp = (tmp2 & ~maskL) | ((tmp1 ^ tmp2) & maskL);
- break;
- case JBIG2_COMPOSE_XNOR:
- tmp = (tmp2 & ~maskL) | ((~(tmp1 ^ tmp2)) & maskL);
- break;
- case JBIG2_COMPOSE_REPLACE:
- tmp = (tmp2 & ~maskL) | (tmp1 & maskL);
- break;
- }
- dp[0] = (FX_BYTE)(tmp >> 24);
- dp[1] = (FX_BYTE)(tmp >> 16);
- dp[2] = (FX_BYTE)(tmp >> 8);
- dp[3] = (FX_BYTE)tmp;
- sp += 4;
- dp += 4;
- }
- for(xx = 0; xx < middleDwords; xx++) {
- tmp1 = (JBIG2_GETDWORD(sp) << shift1) | (JBIG2_GETDWORD(sp + 4) >> shift2);
- tmp2 = JBIG2_GETDWORD(dp);
- switch(op) {
- case JBIG2_COMPOSE_OR:
- tmp = tmp1 | tmp2;
- break;
- case JBIG2_COMPOSE_AND:
- tmp = tmp1 & tmp2;
- break;
- case JBIG2_COMPOSE_XOR:
- tmp = tmp1 ^ tmp2;
- break;
- case JBIG2_COMPOSE_XNOR:
- tmp = ~(tmp1 ^ tmp2);
- break;
- case JBIG2_COMPOSE_REPLACE:
- tmp = tmp1;
- break;
- }
- dp[0] = (FX_BYTE)(tmp >> 24);
- dp[1] = (FX_BYTE)(tmp >> 16);
- dp[2] = (FX_BYTE)(tmp >> 8);
- dp[3] = (FX_BYTE)tmp;
- sp += 4;
- dp += 4;
- }
- if(d2 != 0) {
- tmp1 = (JBIG2_GETDWORD(sp) << shift1) | (
- ((sp + 4) < lineSrc + lineLeft ? JBIG2_GETDWORD(sp + 4) : 0) >> shift2);
- tmp2 = JBIG2_GETDWORD(dp);
- switch(op) {
- case JBIG2_COMPOSE_OR:
- tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR);
- break;
- case JBIG2_COMPOSE_AND:
- tmp = (tmp2 & ~maskR) | ((tmp1 & tmp2) & maskR);
- break;
- case JBIG2_COMPOSE_XOR:
- tmp = (tmp2 & ~maskR) | ((tmp1 ^ tmp2) & maskR);
- break;
- case JBIG2_COMPOSE_XNOR:
- tmp = (tmp2 & ~maskR) | ((~(tmp1 ^ tmp2)) & maskR);
- break;
- case JBIG2_COMPOSE_REPLACE:
- tmp = (tmp2 & ~maskR) | (tmp1 & maskR);
- break;
- }
- dp[0] = (FX_BYTE)(tmp >> 24);
- dp[1] = (FX_BYTE)(tmp >> 16);
- dp[2] = (FX_BYTE)(tmp >> 8);
- dp[3] = (FX_BYTE)tmp;
- }
- lineSrc += m_nStride;
- lineDst += pDst->m_nStride;
- }
- } else if(s1 == d1) {
- middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5);
- for(yy = yd0; yy < yd1; yy++) {
- sp = lineSrc;
- dp = lineDst;
- if(d1 != 0) {
- tmp1 = JBIG2_GETDWORD(sp);
- tmp2 = JBIG2_GETDWORD(dp);
- switch(op) {
- case JBIG2_COMPOSE_OR:
- tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL);
- break;
- case JBIG2_COMPOSE_AND:
- tmp = (tmp2 & ~maskL) | ((tmp1 & tmp2) & maskL);
- break;
- case JBIG2_COMPOSE_XOR:
- tmp = (tmp2 & ~maskL) | ((tmp1 ^ tmp2) & maskL);
- break;
- case JBIG2_COMPOSE_XNOR:
- tmp = (tmp2 & ~maskL) | ((~(tmp1 ^ tmp2)) & maskL);
- break;
- case JBIG2_COMPOSE_REPLACE:
- tmp = (tmp2 & ~maskL) | (tmp1 & maskL);
- break;
- }
- dp[0] = (FX_BYTE)(tmp >> 24);
- dp[1] = (FX_BYTE)(tmp >> 16);
- dp[2] = (FX_BYTE)(tmp >> 8);
- dp[3] = (FX_BYTE)tmp;
- sp += 4;
- dp += 4;
- }
- for(xx = 0; xx < middleDwords; xx++) {
- tmp1 = JBIG2_GETDWORD(sp);
- tmp2 = JBIG2_GETDWORD(dp);
- switch(op) {
- case JBIG2_COMPOSE_OR:
- tmp = tmp1 | tmp2;
- break;
- case JBIG2_COMPOSE_AND:
- tmp = tmp1 & tmp2;
- break;
- case JBIG2_COMPOSE_XOR:
- tmp = tmp1 ^ tmp2;
- break;
- case JBIG2_COMPOSE_XNOR:
- tmp = ~(tmp1 ^ tmp2);
- break;
- case JBIG2_COMPOSE_REPLACE:
- tmp = tmp1;
- break;
- }
- dp[0] = (FX_BYTE)(tmp >> 24);
- dp[1] = (FX_BYTE)(tmp >> 16);
- dp[2] = (FX_BYTE)(tmp >> 8);
- dp[3] = (FX_BYTE)tmp;
- sp += 4;
- dp += 4;
- }
- if(d2 != 0) {
- tmp1 = JBIG2_GETDWORD(sp);
- tmp2 = JBIG2_GETDWORD(dp);
- switch(op) {
- case JBIG2_COMPOSE_OR:
- tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR);
- break;
- case JBIG2_COMPOSE_AND:
- tmp = (tmp2 & ~maskR) | ((tmp1 & tmp2) & maskR);
- break;
- case JBIG2_COMPOSE_XOR:
- tmp = (tmp2 & ~maskR) | ((tmp1 ^ tmp2) & maskR);
- break;
- case JBIG2_COMPOSE_XNOR:
- tmp = (tmp2 & ~maskR) | ((~(tmp1 ^ tmp2)) & maskR);
- break;
- case JBIG2_COMPOSE_REPLACE:
- tmp = (tmp2 & ~maskR) | (tmp1 & maskR);
- break;
- }
- dp[0] = (FX_BYTE)(tmp >> 24);
- dp[1] = (FX_BYTE)(tmp >> 16);
- dp[2] = (FX_BYTE)(tmp >> 8);
- dp[3] = (FX_BYTE)tmp;
- }
- lineSrc += m_nStride;
- lineDst += pDst->m_nStride;
- }
- } else {
- shift1 = d1 - s1;
- shift2 = 32 - shift1;
- middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5);
- for(yy = yd0; yy < yd1; yy++) {
- sp = lineSrc;
- dp = lineDst;
- if(d1 != 0) {
- tmp1 = JBIG2_GETDWORD(sp) >> shift1;
- tmp2 = JBIG2_GETDWORD(dp);
- switch(op) {
- case JBIG2_COMPOSE_OR:
- tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL);
- break;
- case JBIG2_COMPOSE_AND:
- tmp = (tmp2 & ~maskL) | ((tmp1 & tmp2) & maskL);
- break;
- case JBIG2_COMPOSE_XOR:
- tmp = (tmp2 & ~maskL) | ((tmp1 ^ tmp2) & maskL);
- break;
- case JBIG2_COMPOSE_XNOR:
- tmp = (tmp2 & ~maskL) | ((~(tmp1 ^ tmp2)) & maskL);
- break;
- case JBIG2_COMPOSE_REPLACE:
- tmp = (tmp2 & ~maskL) | (tmp1 & maskL);
- break;
- }
- dp[0] = (FX_BYTE)(tmp >> 24);
- dp[1] = (FX_BYTE)(tmp >> 16);
- dp[2] = (FX_BYTE)(tmp >> 8);
- dp[3] = (FX_BYTE)tmp;
- dp += 4;
- }
- for(xx = 0; xx < middleDwords; xx++) {
- tmp1 = (JBIG2_GETDWORD(sp) << shift2) | ((JBIG2_GETDWORD(sp + 4)) >> shift1);
- tmp2 = JBIG2_GETDWORD(dp);
- switch(op) {
- case JBIG2_COMPOSE_OR:
- tmp = tmp1 | tmp2;
- break;
- case JBIG2_COMPOSE_AND:
- tmp = tmp1 & tmp2;
- break;
- case JBIG2_COMPOSE_XOR:
- tmp = tmp1 ^ tmp2;
- break;
- case JBIG2_COMPOSE_XNOR:
- tmp = ~(tmp1 ^ tmp2);
- break;
- case JBIG2_COMPOSE_REPLACE:
- tmp = tmp1;
- break;
- }
- dp[0] = (FX_BYTE)(tmp >> 24);
- dp[1] = (FX_BYTE)(tmp >> 16);
- dp[2] = (FX_BYTE)(tmp >> 8);
- dp[3] = (FX_BYTE)tmp;
- sp += 4;
- dp += 4;
- }
- if(d2 != 0) {
- tmp1 = (JBIG2_GETDWORD(sp) << shift2) | (
- ((sp + 4) < lineSrc + lineLeft ? JBIG2_GETDWORD(sp + 4) : 0) >> shift1);
- tmp2 = JBIG2_GETDWORD(dp);
- switch(op) {
- case JBIG2_COMPOSE_OR:
- tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR);
- break;
- case JBIG2_COMPOSE_AND:
- tmp = (tmp2 & ~maskR) | ((tmp1 & tmp2) & maskR);
- break;
- case JBIG2_COMPOSE_XOR:
- tmp = (tmp2 & ~maskR) | ((tmp1 ^ tmp2) & maskR);
- break;
- case JBIG2_COMPOSE_XNOR:
- tmp = (tmp2 & ~maskR) | ((~(tmp1 ^ tmp2)) & maskR);
- break;
- case JBIG2_COMPOSE_REPLACE:
- tmp = (tmp2 & ~maskR) | (tmp1 & maskR);
- break;
- }
- dp[0] = (FX_BYTE)(tmp >> 24);
- dp[1] = (FX_BYTE)(tmp >> 16);
- dp[2] = (FX_BYTE)(tmp >> 8);
- dp[3] = (FX_BYTE)tmp;
- }
- lineSrc += m_nStride;
- lineDst += pDst->m_nStride;
- }
- }
- }
- return 1;
-}
-FX_BOOL CJBig2_Image::composeTo_opt2(CJBig2_Image *pDst, FX_INT32 x, FX_INT32 y, JBig2ComposeOp op, const FX_RECT* pSrcRect)
-{
- FX_INT32 xs0, ys0, xs1, ys1, xd0, yd0, xd1, yd1, xx, yy, w, h, middleDwords, lineLeft;
- FX_DWORD s1, d1, d2, shift, shift1, shift2, tmp, tmp1, tmp2, maskL, maskR, maskM;
- FX_BYTE *lineSrc, *lineDst, *sp, *dp;
- FX_INT32 sw, sh;
- if (!m_pData) {
- return FALSE;
- }
- if (x < -1048576 || x > 1048576 || y < -1048576 || y > 1048576) {
- return FALSE;
- }
- sw = pSrcRect->Width();
- sh = pSrcRect->Height();
- if(y < 0) {
- ys0 = -y;
- } else {
- ys0 = 0;
- }
- if(y + sh > pDst->m_nHeight) {
- ys1 = pDst->m_nHeight - y;
- } else {
- ys1 = sh;
- }
- if(x < 0) {
- xs0 = -x;
- } else {
- xs0 = 0;
- }
- if(x + sw > pDst->m_nWidth) {
- xs1 = pDst->m_nWidth - x;
- } else {
- xs1 = sw;
- }
- if((ys0 >= ys1) || (xs0 >= xs1)) {
- return 0;
- }
- w = xs1 - xs0;
- h = ys1 - ys0;
- if(y < 0) {
- yd0 = 0;
- } else {
- yd0 = y;
- }
- if(x < 0) {
- xd0 = 0;
- } else {
- xd0 = x;
- }
- xd1 = xd0 + w;
- yd1 = yd0 + h;
- d1 = xd0 & 31;
- d2 = xd1 & 31;
- s1 = xs0 & 31;
- maskL = 0xffffffff >> d1;
- maskR = 0xffffffff << ((32 - (xd1 & 31)) % 32);
- maskM = maskL & maskR;
- lineSrc = m_pData + (pSrcRect->top + ys0) * m_nStride + (((xs0 + pSrcRect->left) >> 5) << 2);
- lineLeft = m_nStride - ((xs0 >> 5) << 2);
- lineDst = pDst->m_pData + yd0 * pDst->m_nStride + ((xd0 >> 5) << 2);
- if((xd0 & ~31) == ((xd1 - 1) & ~31)) {
- if((xs0 & ~31) == ((xs1 - 1) & ~31)) {
- if(s1 > d1) {
- shift = s1 - d1;
- for(yy = yd0; yy < yd1; yy++) {
- tmp1 = JBIG2_GETDWORD(lineSrc) << shift;
- tmp2 = JBIG2_GETDWORD(lineDst);
- switch(op) {
- case JBIG2_COMPOSE_OR:
- tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM);
- break;
- case JBIG2_COMPOSE_AND:
- tmp = (tmp2 & ~maskM) | ((tmp1 & tmp2) & maskM);
- break;
- case JBIG2_COMPOSE_XOR:
- tmp = (tmp2 & ~maskM) | ((tmp1 ^ tmp2) & maskM);
- break;
- case JBIG2_COMPOSE_XNOR:
- tmp = (tmp2 & ~maskM) | ((~(tmp1 ^ tmp2)) & maskM);
- break;
- case JBIG2_COMPOSE_REPLACE:
- tmp = (tmp2 & ~maskM) | (tmp1 & maskM);
- break;
- }
- lineDst[0] = (FX_BYTE)(tmp >> 24);
- lineDst[1] = (FX_BYTE)(tmp >> 16);
- lineDst[2] = (FX_BYTE)(tmp >> 8);
- lineDst[3] = (FX_BYTE)tmp;
- lineSrc += m_nStride;
- lineDst += pDst->m_nStride;
- }
- } else {
- shift = d1 - s1;
- for(yy = yd0; yy < yd1; yy++) {
- tmp1 = JBIG2_GETDWORD(lineSrc) >> shift;
- tmp2 = JBIG2_GETDWORD(lineDst);
- switch(op) {
- case JBIG2_COMPOSE_OR:
- tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM);
- break;
- case JBIG2_COMPOSE_AND:
- tmp = (tmp2 & ~maskM) | ((tmp1 & tmp2) & maskM);
- break;
- case JBIG2_COMPOSE_XOR:
- tmp = (tmp2 & ~maskM) | ((tmp1 ^ tmp2) & maskM);
- break;
- case JBIG2_COMPOSE_XNOR:
- tmp = (tmp2 & ~maskM) | ((~(tmp1 ^ tmp2)) & maskM);
- break;
- case JBIG2_COMPOSE_REPLACE:
- tmp = (tmp2 & ~maskM) | (tmp1 & maskM);
- break;
- }
- lineDst[0] = (FX_BYTE)(tmp >> 24);
- lineDst[1] = (FX_BYTE)(tmp >> 16);
- lineDst[2] = (FX_BYTE)(tmp >> 8);
- lineDst[3] = (FX_BYTE)tmp;
- lineSrc += m_nStride;
- lineDst += pDst->m_nStride;
- }
- }
- } else {
- shift1 = s1 - d1;
- shift2 = 32 - shift1;
- for(yy = yd0; yy < yd1; yy++) {
- tmp1 = (JBIG2_GETDWORD(lineSrc) << shift1) | (JBIG2_GETDWORD(lineSrc + 4) >> shift2);
- tmp2 = JBIG2_GETDWORD(lineDst);
- switch(op) {
- case JBIG2_COMPOSE_OR:
- tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM);
- break;
- case JBIG2_COMPOSE_AND:
- tmp = (tmp2 & ~maskM) | ((tmp1 & tmp2) & maskM);
- break;
- case JBIG2_COMPOSE_XOR:
- tmp = (tmp2 & ~maskM) | ((tmp1 ^ tmp2) & maskM);
- break;
- case JBIG2_COMPOSE_XNOR:
- tmp = (tmp2 & ~maskM) | ((~(tmp1 ^ tmp2)) & maskM);
- break;
- case JBIG2_COMPOSE_REPLACE:
- tmp = (tmp2 & ~maskM) | (tmp1 & maskM);
- break;
- }
- lineDst[0] = (FX_BYTE)(tmp >> 24);
- lineDst[1] = (FX_BYTE)(tmp >> 16);
- lineDst[2] = (FX_BYTE)(tmp >> 8);
- lineDst[3] = (FX_BYTE)tmp;
- lineSrc += m_nStride;
- lineDst += pDst->m_nStride;
- }
- }
- } else {
- if(s1 > d1) {
- shift1 = s1 - d1;
- shift2 = 32 - shift1;
- middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5);
- for(yy = yd0; yy < yd1; yy++) {
- sp = lineSrc;
- dp = lineDst;
- if(d1 != 0) {
- tmp1 = (JBIG2_GETDWORD(sp) << shift1) | (JBIG2_GETDWORD(sp + 4) >> shift2);
- tmp2 = JBIG2_GETDWORD(dp);
- switch(op) {
- case JBIG2_COMPOSE_OR:
- tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL);
- break;
- case JBIG2_COMPOSE_AND:
- tmp = (tmp2 & ~maskL) | ((tmp1 & tmp2) & maskL);
- break;
- case JBIG2_COMPOSE_XOR:
- tmp = (tmp2 & ~maskL) | ((tmp1 ^ tmp2) & maskL);
- break;
- case JBIG2_COMPOSE_XNOR:
- tmp = (tmp2 & ~maskL) | ((~(tmp1 ^ tmp2)) & maskL);
- break;
- case JBIG2_COMPOSE_REPLACE:
- tmp = (tmp2 & ~maskL) | (tmp1 & maskL);
- break;
- }
- dp[0] = (FX_BYTE)(tmp >> 24);
- dp[1] = (FX_BYTE)(tmp >> 16);
- dp[2] = (FX_BYTE)(tmp >> 8);
- dp[3] = (FX_BYTE)tmp;
- sp += 4;
- dp += 4;
- }
- for(xx = 0; xx < middleDwords; xx++) {
- tmp1 = (JBIG2_GETDWORD(sp) << shift1) | (JBIG2_GETDWORD(sp + 4) >> shift2);
- tmp2 = JBIG2_GETDWORD(dp);
- switch(op) {
- case JBIG2_COMPOSE_OR:
- tmp = tmp1 | tmp2;
- break;
- case JBIG2_COMPOSE_AND:
- tmp = tmp1 & tmp2;
- break;
- case JBIG2_COMPOSE_XOR:
- tmp = tmp1 ^ tmp2;
- break;
- case JBIG2_COMPOSE_XNOR:
- tmp = ~(tmp1 ^ tmp2);
- break;
- case JBIG2_COMPOSE_REPLACE:
- tmp = tmp1;
- break;
- }
- dp[0] = (FX_BYTE)(tmp >> 24);
- dp[1] = (FX_BYTE)(tmp >> 16);
- dp[2] = (FX_BYTE)(tmp >> 8);
- dp[3] = (FX_BYTE)tmp;
- sp += 4;
- dp += 4;
- }
- if(d2 != 0) {
- tmp1 = (JBIG2_GETDWORD(sp) << shift1) | (
- ((sp + 4) < lineSrc + lineLeft ? JBIG2_GETDWORD(sp + 4) : 0) >> shift2);
- tmp2 = JBIG2_GETDWORD(dp);
- switch(op) {
- case JBIG2_COMPOSE_OR:
- tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR);
- break;
- case JBIG2_COMPOSE_AND:
- tmp = (tmp2 & ~maskR) | ((tmp1 & tmp2) & maskR);
- break;
- case JBIG2_COMPOSE_XOR:
- tmp = (tmp2 & ~maskR) | ((tmp1 ^ tmp2) & maskR);
- break;
- case JBIG2_COMPOSE_XNOR:
- tmp = (tmp2 & ~maskR) | ((~(tmp1 ^ tmp2)) & maskR);
- break;
- case JBIG2_COMPOSE_REPLACE:
- tmp = (tmp2 & ~maskR) | (tmp1 & maskR);
- break;
- }
- dp[0] = (FX_BYTE)(tmp >> 24);
- dp[1] = (FX_BYTE)(tmp >> 16);
- dp[2] = (FX_BYTE)(tmp >> 8);
- dp[3] = (FX_BYTE)tmp;
- }
- lineSrc += m_nStride;
- lineDst += pDst->m_nStride;
- }
- } else if(s1 == d1) {
- middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5);
- for(yy = yd0; yy < yd1; yy++) {
- sp = lineSrc;
- dp = lineDst;
- if(d1 != 0) {
- tmp1 = JBIG2_GETDWORD(sp);
- tmp2 = JBIG2_GETDWORD(dp);
- switch(op) {
- case JBIG2_COMPOSE_OR:
- tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL);
- break;
- case JBIG2_COMPOSE_AND:
- tmp = (tmp2 & ~maskL) | ((tmp1 & tmp2) & maskL);
- break;
- case JBIG2_COMPOSE_XOR:
- tmp = (tmp2 & ~maskL) | ((tmp1 ^ tmp2) & maskL);
- break;
- case JBIG2_COMPOSE_XNOR:
- tmp = (tmp2 & ~maskL) | ((~(tmp1 ^ tmp2)) & maskL);
- break;
- case JBIG2_COMPOSE_REPLACE:
- tmp = (tmp2 & ~maskL) | (tmp1 & maskL);
- break;
- }
- dp[0] = (FX_BYTE)(tmp >> 24);
- dp[1] = (FX_BYTE)(tmp >> 16);
- dp[2] = (FX_BYTE)(tmp >> 8);
- dp[3] = (FX_BYTE)tmp;
- sp += 4;
- dp += 4;
- }
- for(xx = 0; xx < middleDwords; xx++) {
- tmp1 = JBIG2_GETDWORD(sp);
- tmp2 = JBIG2_GETDWORD(dp);
- switch(op) {
- case JBIG2_COMPOSE_OR:
- tmp = tmp1 | tmp2;
- break;
- case JBIG2_COMPOSE_AND:
- tmp = tmp1 & tmp2;
- break;
- case JBIG2_COMPOSE_XOR:
- tmp = tmp1 ^ tmp2;
- break;
- case JBIG2_COMPOSE_XNOR:
- tmp = ~(tmp1 ^ tmp2);
- break;
- case JBIG2_COMPOSE_REPLACE:
- tmp = tmp1;
- break;
- }
- dp[0] = (FX_BYTE)(tmp >> 24);
- dp[1] = (FX_BYTE)(tmp >> 16);
- dp[2] = (FX_BYTE)(tmp >> 8);
- dp[3] = (FX_BYTE)tmp;
- sp += 4;
- dp += 4;
- }
- if(d2 != 0) {
- tmp1 = JBIG2_GETDWORD(sp);
- tmp2 = JBIG2_GETDWORD(dp);
- switch(op) {
- case JBIG2_COMPOSE_OR:
- tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR);
- break;
- case JBIG2_COMPOSE_AND:
- tmp = (tmp2 & ~maskR) | ((tmp1 & tmp2) & maskR);
- break;
- case JBIG2_COMPOSE_XOR:
- tmp = (tmp2 & ~maskR) | ((tmp1 ^ tmp2) & maskR);
- break;
- case JBIG2_COMPOSE_XNOR:
- tmp = (tmp2 & ~maskR) | ((~(tmp1 ^ tmp2)) & maskR);
- break;
- case JBIG2_COMPOSE_REPLACE:
- tmp = (tmp2 & ~maskR) | (tmp1 & maskR);
- break;
- }
- dp[0] = (FX_BYTE)(tmp >> 24);
- dp[1] = (FX_BYTE)(tmp >> 16);
- dp[2] = (FX_BYTE)(tmp >> 8);
- dp[3] = (FX_BYTE)tmp;
- }
- lineSrc += m_nStride;
- lineDst += pDst->m_nStride;
- }
- } else {
- shift1 = d1 - s1;
- shift2 = 32 - shift1;
- middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5);
- for(yy = yd0; yy < yd1; yy++) {
- sp = lineSrc;
- dp = lineDst;
- if(d1 != 0) {
- tmp1 = JBIG2_GETDWORD(sp) >> shift1;
- tmp2 = JBIG2_GETDWORD(dp);
- switch(op) {
- case JBIG2_COMPOSE_OR:
- tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL);
- break;
- case JBIG2_COMPOSE_AND:
- tmp = (tmp2 & ~maskL) | ((tmp1 & tmp2) & maskL);
- break;
- case JBIG2_COMPOSE_XOR:
- tmp = (tmp2 & ~maskL) | ((tmp1 ^ tmp2) & maskL);
- break;
- case JBIG2_COMPOSE_XNOR:
- tmp = (tmp2 & ~maskL) | ((~(tmp1 ^ tmp2)) & maskL);
- break;
- case JBIG2_COMPOSE_REPLACE:
- tmp = (tmp2 & ~maskL) | (tmp1 & maskL);
- break;
- }
- dp[0] = (FX_BYTE)(tmp >> 24);
- dp[1] = (FX_BYTE)(tmp >> 16);
- dp[2] = (FX_BYTE)(tmp >> 8);
- dp[3] = (FX_BYTE)tmp;
- dp += 4;
- }
- for(xx = 0; xx < middleDwords; xx++) {
- tmp1 = (JBIG2_GETDWORD(sp) << shift2) | ((JBIG2_GETDWORD(sp + 4)) >> shift1);
- tmp2 = JBIG2_GETDWORD(dp);
- switch(op) {
- case JBIG2_COMPOSE_OR:
- tmp = tmp1 | tmp2;
- break;
- case JBIG2_COMPOSE_AND:
- tmp = tmp1 & tmp2;
- break;
- case JBIG2_COMPOSE_XOR:
- tmp = tmp1 ^ tmp2;
- break;
- case JBIG2_COMPOSE_XNOR:
- tmp = ~(tmp1 ^ tmp2);
- break;
- case JBIG2_COMPOSE_REPLACE:
- tmp = tmp1;
- break;
- }
- dp[0] = (FX_BYTE)(tmp >> 24);
- dp[1] = (FX_BYTE)(tmp >> 16);
- dp[2] = (FX_BYTE)(tmp >> 8);
- dp[3] = (FX_BYTE)tmp;
- sp += 4;
- dp += 4;
- }
- if(d2 != 0) {
- tmp1 = (JBIG2_GETDWORD(sp) << shift2) | (
- ((sp + 4) < lineSrc + lineLeft ? JBIG2_GETDWORD(sp + 4) : 0) >> shift1);
- tmp2 = JBIG2_GETDWORD(dp);
- switch(op) {
- case JBIG2_COMPOSE_OR:
- tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR);
- break;
- case JBIG2_COMPOSE_AND:
- tmp = (tmp2 & ~maskR) | ((tmp1 & tmp2) & maskR);
- break;
- case JBIG2_COMPOSE_XOR:
- tmp = (tmp2 & ~maskR) | ((tmp1 ^ tmp2) & maskR);
- break;
- case JBIG2_COMPOSE_XNOR:
- tmp = (tmp2 & ~maskR) | ((~(tmp1 ^ tmp2)) & maskR);
- break;
- case JBIG2_COMPOSE_REPLACE:
- tmp = (tmp2 & ~maskR) | (tmp1 & maskR);
- break;
- }
- dp[0] = (FX_BYTE)(tmp >> 24);
- dp[1] = (FX_BYTE)(tmp >> 16);
- dp[2] = (FX_BYTE)(tmp >> 8);
- dp[3] = (FX_BYTE)tmp;
- }
- lineSrc += m_nStride;
- lineDst += pDst->m_nStride;
- }
- }
- }
- return 1;
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "JBig2_Image.h"
+#include "../../../include/fxcrt/fx_basic.h"
+#include "../../../include/fxcrt/fx_coordinates.h"
+#include <limits.h>
+CJBig2_Image::CJBig2_Image(FX_INT32 w, FX_INT32 h)
+{
+ m_nWidth = w;
+ m_nHeight = h;
+ if (m_nWidth <= 0 || m_nHeight <= 0 || m_nWidth > INT_MAX - 31) {
+ m_pData = NULL;
+ m_bNeedFree = FALSE;
+ return;
+ }
+ m_nStride = ((w + 31) >> 5) << 2;
+ if (m_nStride * m_nHeight > 0 && 104857600 / (int)m_nStride > m_nHeight) {
+ m_pData = (FX_BYTE *)m_pModule->JBig2_Malloc2(m_nStride, m_nHeight);
+ } else {
+ m_pData = NULL;
+ }
+ m_bNeedFree = TRUE;
+}
+CJBig2_Image::CJBig2_Image(FX_INT32 w, FX_INT32 h, FX_INT32 stride, FX_BYTE*pBuf)
+{
+ m_nWidth = w;
+ m_nHeight = h;
+ m_nStride = stride;
+ m_pData = pBuf;
+ m_bNeedFree = FALSE;
+}
+CJBig2_Image::CJBig2_Image(CJBig2_Image &im)
+{
+ m_pModule = im.m_pModule;
+ m_nWidth = im.m_nWidth;
+ m_nHeight = im.m_nHeight;
+ m_nStride = im.m_nStride;
+ if (im.m_pData) {
+ m_pData = (FX_BYTE*)m_pModule->JBig2_Malloc2(m_nStride, m_nHeight);
+ JBIG2_memcpy(m_pData, im.m_pData, m_nStride * m_nHeight);
+ } else {
+ m_pData = NULL;
+ }
+ m_bNeedFree = TRUE;
+}
+CJBig2_Image::~CJBig2_Image()
+{
+ if(m_bNeedFree && m_pData) {
+ m_pModule->JBig2_Free(m_pData);
+ }
+}
+FX_BOOL CJBig2_Image::getPixel(FX_INT32 x, FX_INT32 y)
+{
+ if (!m_pData) {
+ return 0;
+ }
+ FX_INT32 m, n;
+ if(x < 0 || x >= m_nWidth) {
+ return 0;
+ }
+ if(y < 0 || y >= m_nHeight) {
+ return 0;
+ }
+ m = y * m_nStride + (x >> 3);
+ n = x & 7;
+ return ((m_pData[m] >> (7 - n)) & 1);
+}
+
+FX_INT32 CJBig2_Image::setPixel(FX_INT32 x, FX_INT32 y, FX_BOOL v)
+{
+ if (!m_pData) {
+ return 0;
+ }
+ FX_INT32 m, n;
+ if(x < 0 || x >= m_nWidth) {
+ return 0;
+ }
+ if(y < 0 || y >= m_nHeight) {
+ return 0;
+ }
+ m = y * m_nStride + (x >> 3);
+ n = x & 7;
+ if(v) {
+ m_pData[m] |= 1 << (7 - n);
+ } else {
+ m_pData[m] &= ~(1 << (7 - n));
+ }
+ return 1;
+}
+void CJBig2_Image::copyLine(FX_INT32 hTo, FX_INT32 hFrom)
+{
+ if (!m_pData) {
+ return;
+ }
+ if(hFrom < 0 || hFrom >= m_nHeight) {
+ JBIG2_memset(m_pData + hTo * m_nStride, 0, m_nStride);
+ } else {
+ JBIG2_memcpy(m_pData + hTo * m_nStride, m_pData + hFrom * m_nStride, m_nStride);
+ }
+}
+void CJBig2_Image::fill(FX_BOOL v)
+{
+ if (!m_pData) {
+ return;
+ }
+ JBIG2_memset(m_pData, v ? 0xff : 0, m_nStride * m_nHeight);
+}
+FX_BOOL CJBig2_Image::composeTo(CJBig2_Image *pDst, FX_INT32 x, FX_INT32 y, JBig2ComposeOp op)
+{
+ if (!m_pData) {
+ return FALSE;
+ }
+ return composeTo_opt2(pDst, x, y, op);
+}
+FX_BOOL CJBig2_Image::composeTo(CJBig2_Image *pDst, FX_INT32 x, FX_INT32 y, JBig2ComposeOp op, const FX_RECT* pSrcRect)
+{
+ if (!m_pData) {
+ return FALSE;
+ }
+ if (NULL == pSrcRect || *pSrcRect == FX_RECT(0, 0, m_nWidth, m_nHeight)) {
+ return composeTo_opt2(pDst, x, y, op);
+ }
+ return composeTo_opt2(pDst, x, y, op, pSrcRect);
+}
+FX_BOOL CJBig2_Image::composeTo_unopt(CJBig2_Image *pDst, FX_INT32 x, FX_INT32 y, JBig2ComposeOp op)
+{
+ FX_INT32 w, h, dx, dy;
+ FX_INT32 i, j;
+ w = m_nWidth;
+ h = m_nHeight;
+ dx = dy = 0;
+ if(x < 0) {
+ dx += -x;
+ w -= -x;
+ x = 0;
+ }
+ if(y < 0) {
+ dy += -y;
+ h -= -y;
+ y = 0;
+ }
+ if(x + w > pDst->m_nWidth) {
+ w = pDst->m_nWidth - x;
+ }
+ if(y + h > pDst->m_nHeight) {
+ h = pDst->m_nHeight - y;
+ }
+ switch(op) {
+ case JBIG2_COMPOSE_OR:
+ for(j = 0; j < h; j++) {
+ for(i = 0; i < w; i++) {
+ pDst->setPixel(x + i, y + j,
+ (getPixel(i + dx, j + dy) | pDst->getPixel(x + i, y + j)) & 1);
+ }
+ }
+ break;
+ case JBIG2_COMPOSE_AND:
+ for(j = 0; j < h; j++) {
+ for(i = 0; i < w; i++) {
+ pDst->setPixel(x + i, y + j,
+ (getPixel(i + dx, j + dy) & pDst->getPixel(x + i, y + j)) & 1);
+ }
+ }
+ break;
+ case JBIG2_COMPOSE_XOR:
+ for(j = 0; j < h; j++) {
+ for(i = 0; i < w; i++) {
+ pDst->setPixel(x + i, y + j,
+ (getPixel(i + dx, j + dy) ^ pDst->getPixel(x + i, y + j)) & 1);
+ }
+ }
+ break;
+ case JBIG2_COMPOSE_XNOR:
+ for(j = 0; j < h; j++) {
+ for(i = 0; i < w; i++) {
+ pDst->setPixel(x + i, y + j,
+ (~(getPixel(i + dx, j + dy) ^ pDst->getPixel(x + i, y + j))) & 1);
+ }
+ }
+ break;
+ case JBIG2_COMPOSE_REPLACE:
+ for(j = 0; j < h; j++) {
+ for(i = 0; i < w; i++) {
+ pDst->setPixel(x + i, y + j, getPixel(i + dx, j + dy));
+ }
+ }
+ break;
+ }
+ return TRUE;
+}
+
+FX_BOOL CJBig2_Image::composeTo_opt(CJBig2_Image *pDst, FX_INT32 x, FX_INT32 y, JBig2ComposeOp op)
+{
+ FX_INT32 x0, x1, y0, y1, xx, yy;
+ FX_BYTE *pLineSrc, *pLineDst, *srcPtr, *destPtr;
+ FX_DWORD src0, src1, src, dest, s1, s2, m1, m2, m3;
+ FX_BOOL oneByte;
+ if (!m_pData) {
+ return FALSE;
+ }
+ if (y < 0) {
+ y0 = -y;
+ } else {
+ y0 = 0;
+ }
+ if (y + m_nHeight > pDst->m_nHeight) {
+ y1 = pDst->m_nHeight - y;
+ } else {
+ y1 = m_nHeight;
+ }
+ if (y0 >= y1) {
+ return FALSE;
+ }
+ if (x >= 0) {
+ x0 = x & ~7;
+ } else {
+ x0 = 0;
+ }
+ x1 = x + m_nWidth;
+ if (x1 > pDst->m_nWidth) {
+ x1 = pDst->m_nWidth;
+ }
+ if (x0 >= x1) {
+ return FALSE;
+ }
+ s1 = x & 7;
+ s2 = 8 - s1;
+ m1 = 0xff >> (x1 & 7);
+ m2 = 0xff << (((x1 & 7) == 0) ? 0 : 8 - (x1 & 7));
+ m3 = (0xff >> s1) & m2;
+ oneByte = x0 == ((x1 - 1) & ~7);
+ pLineDst = pDst->m_pData + y * pDst->m_nStride;
+ pLineSrc = m_pData + y0 * m_nStride;
+ if(oneByte) {
+ if(x >= 0) {
+ switch(op) {
+ case JBIG2_COMPOSE_OR: {
+ for (yy = y0; yy < y1; ++yy) {
+ destPtr = pLineDst + (x >> 3);
+ srcPtr = pLineSrc;
+ dest = *destPtr;
+ dest |= (*srcPtr >> s1) & m2;
+ *destPtr = (FX_BYTE)dest;
+ pLineDst += pDst->m_nStride;
+ pLineSrc += m_nStride;
+ }
+ }
+ break;
+ case JBIG2_COMPOSE_AND: {
+ for (yy = y0; yy < y1; ++yy) {
+ destPtr = pLineDst + (x >> 3);
+ srcPtr = pLineSrc;
+ dest = *destPtr;
+ dest &= ((0xff00 | *srcPtr) >> s1) | m1;
+ *destPtr = (FX_BYTE)dest;
+ pLineDst += pDst->m_nStride;
+ pLineSrc += m_nStride;
+ }
+ }
+ break;
+ case JBIG2_COMPOSE_XOR: {
+ for (yy = y0; yy < y1; ++yy) {
+ destPtr = pLineDst + (x >> 3);
+ srcPtr = pLineSrc;
+ dest = *destPtr;
+ dest ^= (*srcPtr >> s1) & m2;
+ *destPtr = (FX_BYTE)dest;
+ pLineDst += pDst->m_nStride;
+ pLineSrc += m_nStride;
+ }
+ }
+ break;
+ case JBIG2_COMPOSE_XNOR: {
+ for (yy = y0; yy < y1; ++yy) {
+ destPtr = pLineDst + (x >> 3);
+ srcPtr = pLineSrc;
+ dest = *destPtr;
+ dest ^= ((*srcPtr ^ 0xff) >> s1) & m2;
+ *destPtr = (FX_BYTE)dest;
+ pLineDst += pDst->m_nStride;
+ pLineSrc += m_nStride;
+ }
+ }
+ break;
+ case JBIG2_COMPOSE_REPLACE: {
+ for (yy = y0; yy < y1; ++yy) {
+ destPtr = pLineDst + (x >> 3);
+ srcPtr = pLineSrc;
+ dest = *destPtr;
+ dest = (dest & ~m3) | ((*srcPtr >> s1) & m3);
+ *destPtr = (FX_BYTE)dest;
+ pLineDst += pDst->m_nStride;
+ pLineSrc += m_nStride;
+ }
+ }
+ break;
+ }
+ } else {
+ switch(op) {
+ case JBIG2_COMPOSE_OR: {
+ for(yy = y0; yy < y1; ++yy) {
+ destPtr = pLineDst;
+ srcPtr = pLineSrc + (-x >> 3);
+ dest = *destPtr;
+ dest |= *srcPtr & m2;
+ *destPtr = (FX_BYTE)dest;
+ pLineDst += pDst->m_nStride;
+ pLineSrc += m_nStride;
+ }
+ }
+ break;
+ case JBIG2_COMPOSE_AND: {
+ for(yy = y0; yy < y1; ++yy) {
+ destPtr = pLineDst;
+ srcPtr = pLineSrc + (-x >> 3);
+ dest = *destPtr;
+ dest &= *srcPtr | m1;
+ *destPtr = (FX_BYTE)dest;
+ pLineDst += pDst->m_nStride;
+ pLineSrc += m_nStride;
+ }
+ }
+ break;
+ case JBIG2_COMPOSE_XOR: {
+ for(yy = y0; yy < y1; ++yy) {
+ destPtr = pLineDst;
+ srcPtr = pLineSrc + (-x >> 3);
+ dest = *destPtr;
+ dest ^= *srcPtr & m2;
+ *destPtr = (FX_BYTE)dest;
+ pLineDst += pDst->m_nStride;
+ pLineSrc += m_nStride;
+ }
+ }
+ break;
+ case JBIG2_COMPOSE_XNOR: {
+ for(yy = y0; yy < y1; ++yy) {
+ destPtr = pLineDst;
+ srcPtr = pLineSrc + (-x >> 3);
+ dest = *destPtr;
+ dest ^= (*srcPtr ^ 0xff) & m2;
+ *destPtr = (FX_BYTE)dest;
+ pLineDst += pDst->m_nStride;
+ pLineSrc += m_nStride;
+ }
+ }
+ break;
+ case JBIG2_COMPOSE_REPLACE: {
+ for(yy = y0; yy < y1; ++yy) {
+ destPtr = pLineDst;
+ srcPtr = pLineSrc + (-x >> 3);
+ dest = *destPtr;
+ dest = (*srcPtr & m2) | (dest & m1);
+ *destPtr = (FX_BYTE)dest;
+ pLineDst += pDst->m_nStride;
+ pLineSrc += m_nStride;
+ }
+ }
+ break;
+ }
+ }
+ } else {
+ if(x >= 0) {
+ switch(op) {
+ case JBIG2_COMPOSE_OR: {
+ for(yy = y0; yy < y1; ++yy) {
+ destPtr = pLineDst + (x >> 3);
+ srcPtr = pLineSrc;
+ src1 = *srcPtr++;
+ dest = *destPtr;
+ dest |= src1 >> s1;
+ *destPtr++ = (FX_BYTE)dest;
+ xx = x0 + 8;
+ for (; xx < x1 - 8; xx += 8) {
+ dest = *destPtr;
+ src0 = src1;
+ src1 = *srcPtr++;
+ src = (((src0 << 8) | src1) >> s1) & 0xff;
+ dest |= src;
+ *destPtr++ = (FX_BYTE)dest;
+ }
+ dest = *destPtr;
+ src0 = src1;
+ if(srcPtr - pLineSrc < m_nStride) {
+ src1 = *srcPtr++;
+ } else {
+ src1 = 0;
+ }
+ src = (((src0 << 8) | src1) >> s1) & 0xff;
+ dest |= src & m2;
+ *destPtr = (FX_BYTE)dest;
+ pLineDst += pDst->m_nStride;
+ pLineSrc += m_nStride;
+ }
+ }
+ break;
+ case JBIG2_COMPOSE_AND: {
+ for(yy = y0; yy < y1; ++yy) {
+ destPtr = pLineDst + (x >> 3);
+ srcPtr = pLineSrc;
+ src1 = *srcPtr++;
+ dest = *destPtr;
+ dest &= (0xff00 | src1) >> s1;
+ *destPtr++ = (FX_BYTE)dest;
+ xx = x0 + 8;
+ for (; xx < x1 - 8; xx += 8) {
+ dest = *destPtr;
+ src0 = src1;
+ src1 = *srcPtr++;
+ src = (((src0 << 8) | src1) >> s1) & 0xff;
+ dest &= src;
+ *destPtr++ = (FX_BYTE)dest;
+ }
+ dest = *destPtr;
+ src0 = src1;
+ if(srcPtr - pLineSrc < m_nStride) {
+ src1 = *srcPtr++;
+ } else {
+ src1 = 0;
+ }
+ src = (((src0 << 8) | src1) >> s1) & 0xff;
+ dest &= src | m1;
+ *destPtr = (FX_BYTE)dest;
+ pLineDst += pDst->m_nStride;
+ pLineSrc += m_nStride;
+ }
+ }
+ break;
+ case JBIG2_COMPOSE_XOR: {
+ for(yy = y0; yy < y1; ++yy) {
+ destPtr = pLineDst + (x >> 3);
+ srcPtr = pLineSrc;
+ src1 = *srcPtr++;
+ dest = *destPtr;
+ dest ^= src1 >> s1;
+ *destPtr++ = (FX_BYTE)dest;
+ xx = x0 + 8;
+ for (; xx < x1 - 8; xx += 8) {
+ dest = *destPtr;
+ src0 = src1;
+ src1 = *srcPtr++;
+ src = (((src0 << 8) | src1) >> s1) & 0xff;
+ dest ^= src;
+ *destPtr++ = (FX_BYTE)dest;
+ }
+ dest = *destPtr;
+ src0 = src1;
+ if(srcPtr - pLineSrc < m_nStride) {
+ src1 = *srcPtr++;
+ } else {
+ src1 = 0;
+ }
+ src = (((src0 << 8) | src1) >> s1) & 0xff;
+ dest ^= src & m2;
+ *destPtr = (FX_BYTE)dest;
+ pLineDst += pDst->m_nStride;
+ pLineSrc += m_nStride;
+ }
+ }
+ break;
+ case JBIG2_COMPOSE_XNOR: {
+ for(yy = y0; yy < y1; ++yy) {
+ destPtr = pLineDst + (x >> 3);
+ srcPtr = pLineSrc;
+ src1 = *srcPtr++;
+ dest = *destPtr;
+ dest ^= (src1 ^ 0xff) >> s1;
+ *destPtr++ = (FX_BYTE)dest;
+ xx = x0 + 8;
+ for (; xx < x1 - 8; xx += 8) {
+ dest = *destPtr;
+ src0 = src1;
+ src1 = *srcPtr++;
+ src = (((src0 << 8) | src1) >> s1) & 0xff;
+ dest ^= src ^ 0xff;
+ *destPtr++ = (FX_BYTE)dest;
+ }
+ dest = *destPtr;
+ src0 = src1;
+ if(srcPtr - pLineSrc < m_nStride) {
+ src1 = *srcPtr++;
+ } else {
+ src1 = 0;
+ }
+ src = (((src0 << 8) | src1) >> s1) & 0xff;
+ dest ^= (src ^ 0xff) & m2;
+ *destPtr = (FX_BYTE)dest;
+ pLineDst += pDst->m_nStride;
+ pLineSrc += m_nStride;
+ }
+ }
+ break;
+ case JBIG2_COMPOSE_REPLACE: {
+ for(yy = y0; yy < y1; ++yy) {
+ destPtr = pLineDst + (x >> 3);
+ srcPtr = pLineSrc;
+ src1 = *srcPtr++;
+ dest = *destPtr;
+ dest = (dest & (0xff << s2)) | (src1 >> s1);
+ *destPtr++ = (FX_BYTE)dest;
+ xx = x0 + 8;
+ for (; xx < x1 - 8; xx += 8) {
+ dest = *destPtr;
+ src0 = src1;
+ src1 = *srcPtr++;
+ src = (((src0 << 8) | src1) >> s1) & 0xff;
+ dest = src;
+ *destPtr++ = (FX_BYTE)dest;
+ }
+ dest = *destPtr;
+ src0 = src1;
+ if(srcPtr - pLineSrc < m_nStride) {
+ src1 = *srcPtr++;
+ } else {
+ src1 = 0;
+ }
+ src = (((src0 << 8) | src1) >> s1) & 0xff;
+ dest = (src & m2) | (dest & m1);
+ *destPtr = (FX_BYTE)dest;
+ pLineDst += pDst->m_nStride;
+ pLineSrc += m_nStride;
+ }
+ }
+ break;
+ }
+ } else {
+ switch(op) {
+ case JBIG2_COMPOSE_OR: {
+ for(yy = y0; yy < y1; ++yy) {
+ destPtr = pLineDst;
+ srcPtr = pLineSrc + (-x >> 3);
+ src1 = *srcPtr++;
+ xx = x0;
+ for (; xx < x1 - 8; xx += 8) {
+ dest = *destPtr;
+ src0 = src1;
+ src1 = *srcPtr++;
+ src = (((src0 << 8) | src1) >> s1) & 0xff;
+ dest |= src;
+ *destPtr++ = (FX_BYTE)dest;
+ }
+ dest = *destPtr;
+ src0 = src1;
+ if(srcPtr - pLineSrc < m_nStride) {
+ src1 = *srcPtr++;
+ } else {
+ src1 = 0;
+ }
+ src = (((src0 << 8) | src1) >> s1) & 0xff;
+ dest |= src & m2;
+ *destPtr = (FX_BYTE)dest;
+ pLineDst += pDst->m_nStride;
+ pLineSrc += m_nStride;
+ }
+ }
+ break;
+ case JBIG2_COMPOSE_AND: {
+ for(yy = y0; yy < y1; ++yy) {
+ destPtr = pLineDst;
+ srcPtr = pLineSrc + (-x >> 3);
+ src1 = *srcPtr++;
+ xx = x0;
+ for (; xx < x1 - 8; xx += 8) {
+ dest = *destPtr;
+ src0 = src1;
+ src1 = *srcPtr++;
+ src = (((src0 << 8) | src1) >> s1) & 0xff;
+ dest &= src;
+ *destPtr++ = (FX_BYTE)dest;
+ }
+ dest = *destPtr;
+ src0 = src1;
+ if(srcPtr - pLineSrc < m_nStride) {
+ src1 = *srcPtr++;
+ } else {
+ src1 = 0;
+ }
+ src = (((src0 << 8) | src1) >> s1) & 0xff;
+ dest &= src | m1;
+ *destPtr = (FX_BYTE)dest;
+ pLineDst += pDst->m_nStride;
+ pLineSrc += m_nStride;
+ }
+ }
+ break;
+ case JBIG2_COMPOSE_XOR: {
+ for(yy = y0; yy < y1; ++yy) {
+ destPtr = pLineDst;
+ srcPtr = pLineSrc + (-x >> 3);
+ src1 = *srcPtr++;
+ xx = x0;
+ for (; xx < x1 - 8; xx += 8) {
+ dest = *destPtr;
+ src0 = src1;
+ src1 = *srcPtr++;
+ src = (((src0 << 8) | src1) >> s1) & 0xff;
+ dest ^= src;
+ *destPtr++ = (FX_BYTE)dest;
+ }
+ dest = *destPtr;
+ src0 = src1;
+ if(srcPtr - pLineSrc < m_nStride) {
+ src1 = *srcPtr++;
+ } else {
+ src1 = 0;
+ }
+ src = (((src0 << 8) | src1) >> s1) & 0xff;
+ dest ^= src & m2;
+ *destPtr = (FX_BYTE)dest;
+ pLineDst += pDst->m_nStride;
+ pLineSrc += m_nStride;
+ }
+ }
+ break;
+ case JBIG2_COMPOSE_XNOR: {
+ for(yy = y0; yy < y1; ++yy) {
+ destPtr = pLineDst;
+ srcPtr = pLineSrc + (-x >> 3);
+ src1 = *srcPtr++;
+ xx = x0;
+ for (; xx < x1 - 8; xx += 8) {
+ dest = *destPtr;
+ src0 = src1;
+ src1 = *srcPtr++;
+ src = (((src0 << 8) | src1) >> s1) & 0xff;
+ dest ^= src ^ 0xff;
+ *destPtr++ = (FX_BYTE)dest;
+ }
+ dest = *destPtr;
+ src0 = src1;
+ if(srcPtr - pLineSrc < m_nStride) {
+ src1 = *srcPtr++;
+ } else {
+ src1 = 0;
+ }
+ src = (((src0 << 8) | src1) >> s1) & 0xff;
+ dest ^= (src ^ 0xff) & m2;
+ *destPtr = (FX_BYTE)dest;
+ pLineDst += pDst->m_nStride;
+ pLineSrc += m_nStride;
+ }
+ }
+ break;
+ case JBIG2_COMPOSE_REPLACE: {
+ for(yy = y0; yy < y1; ++yy) {
+ destPtr = pLineDst;
+ srcPtr = pLineSrc + (-x >> 3);
+ src1 = *srcPtr++;
+ xx = x0;
+ for (; xx < x1 - 8; xx += 8) {
+ dest = *destPtr;
+ src0 = src1;
+ src1 = *srcPtr++;
+ src = (((src0 << 8) | src1) >> s1) & 0xff;
+ dest = src;
+ *destPtr++ = (FX_BYTE)dest;
+ }
+ dest = *destPtr;
+ src0 = src1;
+ if(srcPtr - pLineSrc < m_nStride) {
+ src1 = *srcPtr++;
+ } else {
+ src1 = 0;
+ }
+ src = (((src0 << 8) | src1) >> s1) & 0xff;
+ dest = (src & m2) | (dest & m1);
+ *destPtr = (FX_BYTE)dest;
+ pLineDst += pDst->m_nStride;
+ pLineSrc += m_nStride;
+ }
+ }
+ break;
+ }
+ }
+ }
+ return TRUE;
+}
+FX_BOOL CJBig2_Image::composeFrom(FX_INT32 x, FX_INT32 y, CJBig2_Image *pSrc, JBig2ComposeOp op)
+{
+ if (!m_pData) {
+ return FALSE;
+ }
+ return pSrc->composeTo(this, x, y, op);
+}
+FX_BOOL CJBig2_Image::composeFrom(FX_INT32 x, FX_INT32 y, CJBig2_Image *pSrc, JBig2ComposeOp op, const FX_RECT* pSrcRect)
+{
+ if (!m_pData) {
+ return FALSE;
+ }
+ return pSrc->composeTo(this, x, y, op, pSrcRect);
+}
+CJBig2_Image *CJBig2_Image::subImage_unopt(FX_INT32 x, FX_INT32 y, FX_INT32 w, FX_INT32 h)
+{
+ CJBig2_Image *pImage;
+ FX_INT32 i, j;
+ JBIG2_ALLOC(pImage, CJBig2_Image(w, h));
+ for(j = 0; j < h; j++) {
+ for(i = 0; i < w; i++) {
+ pImage->setPixel(i, j, getPixel(x + i, y + j));
+ }
+ }
+ return pImage;
+}
+#define JBIG2_GETDWORD(buf) ((FX_DWORD)(((buf)[0] << 24) | ((buf)[1] << 16) | ((buf)[2] << 8) | (buf)[3]))
+CJBig2_Image *CJBig2_Image::subImage(FX_INT32 x, FX_INT32 y, FX_INT32 w, FX_INT32 h)
+{
+ CJBig2_Image *pImage;
+ FX_INT32 m, n, j;
+ FX_BYTE *pLineSrc, *pLineDst;
+ FX_DWORD wTmp;
+ FX_BYTE *pSrc, *pSrcEnd, *pDst, *pDstEnd;
+ if (w == 0 || h == 0) {
+ return NULL;
+ }
+ JBIG2_ALLOC(pImage, CJBig2_Image(w, h));
+ if (!m_pData) {
+ pImage->fill(0);
+ return pImage;
+ }
+ if (!pImage->m_pData) {
+ return pImage;
+ }
+ pLineSrc = m_pData + m_nStride * y;
+ pLineDst = pImage->m_pData;
+ m = (x >> 5) << 2;
+ n = x & 31;
+ if(n == 0) {
+ for(j = 0; j < h; j++) {
+ pSrc = pLineSrc + m;
+ pSrcEnd = pLineSrc + m_nStride;
+ pDst = pLineDst;
+ pDstEnd = pLineDst + pImage->m_nStride;
+ for(; pDst < pDstEnd; pSrc += 4, pDst += 4) {
+ *((FX_DWORD *)pDst) = *((FX_DWORD *)pSrc);
+ }
+ pLineSrc += m_nStride;
+ pLineDst += pImage->m_nStride;
+ }
+ } else {
+ for(j = 0; j < h; j++) {
+ pSrc = pLineSrc + m;
+ pSrcEnd = pLineSrc + m_nStride;
+ pDst = pLineDst;
+ pDstEnd = pLineDst + pImage->m_nStride;
+ for(; pDst < pDstEnd; pSrc += 4, pDst += 4) {
+ if(pSrc + 4 < pSrcEnd) {
+ wTmp = (JBIG2_GETDWORD(pSrc) << n) | (JBIG2_GETDWORD(pSrc + 4) >> (32 - n));
+ } else {
+ wTmp = JBIG2_GETDWORD(pSrc) << n;
+ }
+ pDst[0] = (FX_BYTE)(wTmp >> 24);
+ pDst[1] = (FX_BYTE)(wTmp >> 16);
+ pDst[2] = (FX_BYTE)(wTmp >> 8);
+ pDst[3] = (FX_BYTE)wTmp;
+ }
+ pLineSrc += m_nStride;
+ pLineDst += pImage->m_nStride;
+ }
+ }
+ return pImage;
+}
+void CJBig2_Image::expand(FX_INT32 h, FX_BOOL v)
+{
+ if (!m_pData) {
+ return;
+ }
+ m_pData = (FX_BYTE*)m_pModule->JBig2_Realloc(m_pData, h * m_nStride);
+ if(h > m_nHeight) {
+ JBIG2_memset(m_pData + m_nHeight * m_nStride, v ? 0xff : 0, (h - m_nHeight)*m_nStride);
+ }
+ m_nHeight = h;
+}
+FX_BOOL CJBig2_Image::composeTo_opt2(CJBig2_Image *pDst, FX_INT32 x, FX_INT32 y, JBig2ComposeOp op)
+{
+ FX_INT32 xs0, ys0, xs1, ys1, xd0, yd0, xd1, yd1, xx, yy, w, h, middleDwords, lineLeft;
+ FX_DWORD s1, d1, d2, shift, shift1, shift2, tmp, tmp1, tmp2, maskL, maskR, maskM;
+ FX_BYTE *lineSrc, *lineDst, *sp, *dp;
+ if (!m_pData) {
+ return FALSE;
+ }
+ if (x < -1048576 || x > 1048576 || y < -1048576 || y > 1048576) {
+ return FALSE;
+ }
+ if(y < 0) {
+ ys0 = -y;
+ } else {
+ ys0 = 0;
+ }
+ if(y + m_nHeight > pDst->m_nHeight) {
+ ys1 = pDst->m_nHeight - y;
+ } else {
+ ys1 = m_nHeight;
+ }
+ if(x < 0) {
+ xs0 = -x;
+ } else {
+ xs0 = 0;
+ }
+ if(x + m_nWidth > pDst->m_nWidth) {
+ xs1 = pDst->m_nWidth - x;
+ } else {
+ xs1 = m_nWidth;
+ }
+ if((ys0 >= ys1) || (xs0 >= xs1)) {
+ return 0;
+ }
+ w = xs1 - xs0;
+ h = ys1 - ys0;
+ if(y < 0) {
+ yd0 = 0;
+ } else {
+ yd0 = y;
+ }
+ if(x < 0) {
+ xd0 = 0;
+ } else {
+ xd0 = x;
+ }
+ xd1 = xd0 + w;
+ yd1 = yd0 + h;
+ d1 = xd0 & 31;
+ d2 = xd1 & 31;
+ s1 = xs0 & 31;
+ maskL = 0xffffffff >> d1;
+ maskR = 0xffffffff << ((32 - (xd1 & 31)) % 32);
+ maskM = maskL & maskR;
+ lineSrc = m_pData + ys0 * m_nStride + ((xs0 >> 5) << 2);
+ lineLeft = m_nStride - ((xs0 >> 5) << 2);
+ lineDst = pDst->m_pData + yd0 * pDst->m_nStride + ((xd0 >> 5) << 2);
+ if((xd0 & ~31) == ((xd1 - 1) & ~31)) {
+ if((xs0 & ~31) == ((xs1 - 1) & ~31)) {
+ if(s1 > d1) {
+ shift = s1 - d1;
+ for(yy = yd0; yy < yd1; yy++) {
+ tmp1 = JBIG2_GETDWORD(lineSrc) << shift;
+ tmp2 = JBIG2_GETDWORD(lineDst);
+ switch(op) {
+ case JBIG2_COMPOSE_OR:
+ tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM);
+ break;
+ case JBIG2_COMPOSE_AND:
+ tmp = (tmp2 & ~maskM) | ((tmp1 & tmp2) & maskM);
+ break;
+ case JBIG2_COMPOSE_XOR:
+ tmp = (tmp2 & ~maskM) | ((tmp1 ^ tmp2) & maskM);
+ break;
+ case JBIG2_COMPOSE_XNOR:
+ tmp = (tmp2 & ~maskM) | ((~(tmp1 ^ tmp2)) & maskM);
+ break;
+ case JBIG2_COMPOSE_REPLACE:
+ tmp = (tmp2 & ~maskM) | (tmp1 & maskM);
+ break;
+ }
+ lineDst[0] = (FX_BYTE)(tmp >> 24);
+ lineDst[1] = (FX_BYTE)(tmp >> 16);
+ lineDst[2] = (FX_BYTE)(tmp >> 8);
+ lineDst[3] = (FX_BYTE)tmp;
+ lineSrc += m_nStride;
+ lineDst += pDst->m_nStride;
+ }
+ } else {
+ shift = d1 - s1;
+ for(yy = yd0; yy < yd1; yy++) {
+ tmp1 = JBIG2_GETDWORD(lineSrc) >> shift;
+ tmp2 = JBIG2_GETDWORD(lineDst);
+ switch(op) {
+ case JBIG2_COMPOSE_OR:
+ tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM);
+ break;
+ case JBIG2_COMPOSE_AND:
+ tmp = (tmp2 & ~maskM) | ((tmp1 & tmp2) & maskM);
+ break;
+ case JBIG2_COMPOSE_XOR:
+ tmp = (tmp2 & ~maskM) | ((tmp1 ^ tmp2) & maskM);
+ break;
+ case JBIG2_COMPOSE_XNOR:
+ tmp = (tmp2 & ~maskM) | ((~(tmp1 ^ tmp2)) & maskM);
+ break;
+ case JBIG2_COMPOSE_REPLACE:
+ tmp = (tmp2 & ~maskM) | (tmp1 & maskM);
+ break;
+ }
+ lineDst[0] = (FX_BYTE)(tmp >> 24);
+ lineDst[1] = (FX_BYTE)(tmp >> 16);
+ lineDst[2] = (FX_BYTE)(tmp >> 8);
+ lineDst[3] = (FX_BYTE)tmp;
+ lineSrc += m_nStride;
+ lineDst += pDst->m_nStride;
+ }
+ }
+ } else {
+ shift1 = s1 - d1;
+ shift2 = 32 - shift1;
+ for(yy = yd0; yy < yd1; yy++) {
+ tmp1 = (JBIG2_GETDWORD(lineSrc) << shift1) | (JBIG2_GETDWORD(lineSrc + 4) >> shift2);
+ tmp2 = JBIG2_GETDWORD(lineDst);
+ switch(op) {
+ case JBIG2_COMPOSE_OR:
+ tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM);
+ break;
+ case JBIG2_COMPOSE_AND:
+ tmp = (tmp2 & ~maskM) | ((tmp1 & tmp2) & maskM);
+ break;
+ case JBIG2_COMPOSE_XOR:
+ tmp = (tmp2 & ~maskM) | ((tmp1 ^ tmp2) & maskM);
+ break;
+ case JBIG2_COMPOSE_XNOR:
+ tmp = (tmp2 & ~maskM) | ((~(tmp1 ^ tmp2)) & maskM);
+ break;
+ case JBIG2_COMPOSE_REPLACE:
+ tmp = (tmp2 & ~maskM) | (tmp1 & maskM);
+ break;
+ }
+ lineDst[0] = (FX_BYTE)(tmp >> 24);
+ lineDst[1] = (FX_BYTE)(tmp >> 16);
+ lineDst[2] = (FX_BYTE)(tmp >> 8);
+ lineDst[3] = (FX_BYTE)tmp;
+ lineSrc += m_nStride;
+ lineDst += pDst->m_nStride;
+ }
+ }
+ } else {
+ if(s1 > d1) {
+ shift1 = s1 - d1;
+ shift2 = 32 - shift1;
+ middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5);
+ for(yy = yd0; yy < yd1; yy++) {
+ sp = lineSrc;
+ dp = lineDst;
+ if(d1 != 0) {
+ tmp1 = (JBIG2_GETDWORD(sp) << shift1) | (JBIG2_GETDWORD(sp + 4) >> shift2);
+ tmp2 = JBIG2_GETDWORD(dp);
+ switch(op) {
+ case JBIG2_COMPOSE_OR:
+ tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL);
+ break;
+ case JBIG2_COMPOSE_AND:
+ tmp = (tmp2 & ~maskL) | ((tmp1 & tmp2) & maskL);
+ break;
+ case JBIG2_COMPOSE_XOR:
+ tmp = (tmp2 & ~maskL) | ((tmp1 ^ tmp2) & maskL);
+ break;
+ case JBIG2_COMPOSE_XNOR:
+ tmp = (tmp2 & ~maskL) | ((~(tmp1 ^ tmp2)) & maskL);
+ break;
+ case JBIG2_COMPOSE_REPLACE:
+ tmp = (tmp2 & ~maskL) | (tmp1 & maskL);
+ break;
+ }
+ dp[0] = (FX_BYTE)(tmp >> 24);
+ dp[1] = (FX_BYTE)(tmp >> 16);
+ dp[2] = (FX_BYTE)(tmp >> 8);
+ dp[3] = (FX_BYTE)tmp;
+ sp += 4;
+ dp += 4;
+ }
+ for(xx = 0; xx < middleDwords; xx++) {
+ tmp1 = (JBIG2_GETDWORD(sp) << shift1) | (JBIG2_GETDWORD(sp + 4) >> shift2);
+ tmp2 = JBIG2_GETDWORD(dp);
+ switch(op) {
+ case JBIG2_COMPOSE_OR:
+ tmp = tmp1 | tmp2;
+ break;
+ case JBIG2_COMPOSE_AND:
+ tmp = tmp1 & tmp2;
+ break;
+ case JBIG2_COMPOSE_XOR:
+ tmp = tmp1 ^ tmp2;
+ break;
+ case JBIG2_COMPOSE_XNOR:
+ tmp = ~(tmp1 ^ tmp2);
+ break;
+ case JBIG2_COMPOSE_REPLACE:
+ tmp = tmp1;
+ break;
+ }
+ dp[0] = (FX_BYTE)(tmp >> 24);
+ dp[1] = (FX_BYTE)(tmp >> 16);
+ dp[2] = (FX_BYTE)(tmp >> 8);
+ dp[3] = (FX_BYTE)tmp;
+ sp += 4;
+ dp += 4;
+ }
+ if(d2 != 0) {
+ tmp1 = (JBIG2_GETDWORD(sp) << shift1) | (
+ ((sp + 4) < lineSrc + lineLeft ? JBIG2_GETDWORD(sp + 4) : 0) >> shift2);
+ tmp2 = JBIG2_GETDWORD(dp);
+ switch(op) {
+ case JBIG2_COMPOSE_OR:
+ tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR);
+ break;
+ case JBIG2_COMPOSE_AND:
+ tmp = (tmp2 & ~maskR) | ((tmp1 & tmp2) & maskR);
+ break;
+ case JBIG2_COMPOSE_XOR:
+ tmp = (tmp2 & ~maskR) | ((tmp1 ^ tmp2) & maskR);
+ break;
+ case JBIG2_COMPOSE_XNOR:
+ tmp = (tmp2 & ~maskR) | ((~(tmp1 ^ tmp2)) & maskR);
+ break;
+ case JBIG2_COMPOSE_REPLACE:
+ tmp = (tmp2 & ~maskR) | (tmp1 & maskR);
+ break;
+ }
+ dp[0] = (FX_BYTE)(tmp >> 24);
+ dp[1] = (FX_BYTE)(tmp >> 16);
+ dp[2] = (FX_BYTE)(tmp >> 8);
+ dp[3] = (FX_BYTE)tmp;
+ }
+ lineSrc += m_nStride;
+ lineDst += pDst->m_nStride;
+ }
+ } else if(s1 == d1) {
+ middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5);
+ for(yy = yd0; yy < yd1; yy++) {
+ sp = lineSrc;
+ dp = lineDst;
+ if(d1 != 0) {
+ tmp1 = JBIG2_GETDWORD(sp);
+ tmp2 = JBIG2_GETDWORD(dp);
+ switch(op) {
+ case JBIG2_COMPOSE_OR:
+ tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL);
+ break;
+ case JBIG2_COMPOSE_AND:
+ tmp = (tmp2 & ~maskL) | ((tmp1 & tmp2) & maskL);
+ break;
+ case JBIG2_COMPOSE_XOR:
+ tmp = (tmp2 & ~maskL) | ((tmp1 ^ tmp2) & maskL);
+ break;
+ case JBIG2_COMPOSE_XNOR:
+ tmp = (tmp2 & ~maskL) | ((~(tmp1 ^ tmp2)) & maskL);
+ break;
+ case JBIG2_COMPOSE_REPLACE:
+ tmp = (tmp2 & ~maskL) | (tmp1 & maskL);
+ break;
+ }
+ dp[0] = (FX_BYTE)(tmp >> 24);
+ dp[1] = (FX_BYTE)(tmp >> 16);
+ dp[2] = (FX_BYTE)(tmp >> 8);
+ dp[3] = (FX_BYTE)tmp;
+ sp += 4;
+ dp += 4;
+ }
+ for(xx = 0; xx < middleDwords; xx++) {
+ tmp1 = JBIG2_GETDWORD(sp);
+ tmp2 = JBIG2_GETDWORD(dp);
+ switch(op) {
+ case JBIG2_COMPOSE_OR:
+ tmp = tmp1 | tmp2;
+ break;
+ case JBIG2_COMPOSE_AND:
+ tmp = tmp1 & tmp2;
+ break;
+ case JBIG2_COMPOSE_XOR:
+ tmp = tmp1 ^ tmp2;
+ break;
+ case JBIG2_COMPOSE_XNOR:
+ tmp = ~(tmp1 ^ tmp2);
+ break;
+ case JBIG2_COMPOSE_REPLACE:
+ tmp = tmp1;
+ break;
+ }
+ dp[0] = (FX_BYTE)(tmp >> 24);
+ dp[1] = (FX_BYTE)(tmp >> 16);
+ dp[2] = (FX_BYTE)(tmp >> 8);
+ dp[3] = (FX_BYTE)tmp;
+ sp += 4;
+ dp += 4;
+ }
+ if(d2 != 0) {
+ tmp1 = JBIG2_GETDWORD(sp);
+ tmp2 = JBIG2_GETDWORD(dp);
+ switch(op) {
+ case JBIG2_COMPOSE_OR:
+ tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR);
+ break;
+ case JBIG2_COMPOSE_AND:
+ tmp = (tmp2 & ~maskR) | ((tmp1 & tmp2) & maskR);
+ break;
+ case JBIG2_COMPOSE_XOR:
+ tmp = (tmp2 & ~maskR) | ((tmp1 ^ tmp2) & maskR);
+ break;
+ case JBIG2_COMPOSE_XNOR:
+ tmp = (tmp2 & ~maskR) | ((~(tmp1 ^ tmp2)) & maskR);
+ break;
+ case JBIG2_COMPOSE_REPLACE:
+ tmp = (tmp2 & ~maskR) | (tmp1 & maskR);
+ break;
+ }
+ dp[0] = (FX_BYTE)(tmp >> 24);
+ dp[1] = (FX_BYTE)(tmp >> 16);
+ dp[2] = (FX_BYTE)(tmp >> 8);
+ dp[3] = (FX_BYTE)tmp;
+ }
+ lineSrc += m_nStride;
+ lineDst += pDst->m_nStride;
+ }
+ } else {
+ shift1 = d1 - s1;
+ shift2 = 32 - shift1;
+ middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5);
+ for(yy = yd0; yy < yd1; yy++) {
+ sp = lineSrc;
+ dp = lineDst;
+ if(d1 != 0) {
+ tmp1 = JBIG2_GETDWORD(sp) >> shift1;
+ tmp2 = JBIG2_GETDWORD(dp);
+ switch(op) {
+ case JBIG2_COMPOSE_OR:
+ tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL);
+ break;
+ case JBIG2_COMPOSE_AND:
+ tmp = (tmp2 & ~maskL) | ((tmp1 & tmp2) & maskL);
+ break;
+ case JBIG2_COMPOSE_XOR:
+ tmp = (tmp2 & ~maskL) | ((tmp1 ^ tmp2) & maskL);
+ break;
+ case JBIG2_COMPOSE_XNOR:
+ tmp = (tmp2 & ~maskL) | ((~(tmp1 ^ tmp2)) & maskL);
+ break;
+ case JBIG2_COMPOSE_REPLACE:
+ tmp = (tmp2 & ~maskL) | (tmp1 & maskL);
+ break;
+ }
+ dp[0] = (FX_BYTE)(tmp >> 24);
+ dp[1] = (FX_BYTE)(tmp >> 16);
+ dp[2] = (FX_BYTE)(tmp >> 8);
+ dp[3] = (FX_BYTE)tmp;
+ dp += 4;
+ }
+ for(xx = 0; xx < middleDwords; xx++) {
+ tmp1 = (JBIG2_GETDWORD(sp) << shift2) | ((JBIG2_GETDWORD(sp + 4)) >> shift1);
+ tmp2 = JBIG2_GETDWORD(dp);
+ switch(op) {
+ case JBIG2_COMPOSE_OR:
+ tmp = tmp1 | tmp2;
+ break;
+ case JBIG2_COMPOSE_AND:
+ tmp = tmp1 & tmp2;
+ break;
+ case JBIG2_COMPOSE_XOR:
+ tmp = tmp1 ^ tmp2;
+ break;
+ case JBIG2_COMPOSE_XNOR:
+ tmp = ~(tmp1 ^ tmp2);
+ break;
+ case JBIG2_COMPOSE_REPLACE:
+ tmp = tmp1;
+ break;
+ }
+ dp[0] = (FX_BYTE)(tmp >> 24);
+ dp[1] = (FX_BYTE)(tmp >> 16);
+ dp[2] = (FX_BYTE)(tmp >> 8);
+ dp[3] = (FX_BYTE)tmp;
+ sp += 4;
+ dp += 4;
+ }
+ if(d2 != 0) {
+ tmp1 = (JBIG2_GETDWORD(sp) << shift2) | (
+ ((sp + 4) < lineSrc + lineLeft ? JBIG2_GETDWORD(sp + 4) : 0) >> shift1);
+ tmp2 = JBIG2_GETDWORD(dp);
+ switch(op) {
+ case JBIG2_COMPOSE_OR:
+ tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR);
+ break;
+ case JBIG2_COMPOSE_AND:
+ tmp = (tmp2 & ~maskR) | ((tmp1 & tmp2) & maskR);
+ break;
+ case JBIG2_COMPOSE_XOR:
+ tmp = (tmp2 & ~maskR) | ((tmp1 ^ tmp2) & maskR);
+ break;
+ case JBIG2_COMPOSE_XNOR:
+ tmp = (tmp2 & ~maskR) | ((~(tmp1 ^ tmp2)) & maskR);
+ break;
+ case JBIG2_COMPOSE_REPLACE:
+ tmp = (tmp2 & ~maskR) | (tmp1 & maskR);
+ break;
+ }
+ dp[0] = (FX_BYTE)(tmp >> 24);
+ dp[1] = (FX_BYTE)(tmp >> 16);
+ dp[2] = (FX_BYTE)(tmp >> 8);
+ dp[3] = (FX_BYTE)tmp;
+ }
+ lineSrc += m_nStride;
+ lineDst += pDst->m_nStride;
+ }
+ }
+ }
+ return 1;
+}
+FX_BOOL CJBig2_Image::composeTo_opt2(CJBig2_Image *pDst, FX_INT32 x, FX_INT32 y, JBig2ComposeOp op, const FX_RECT* pSrcRect)
+{
+ FX_INT32 xs0, ys0, xs1, ys1, xd0, yd0, xd1, yd1, xx, yy, w, h, middleDwords, lineLeft;
+ FX_DWORD s1, d1, d2, shift, shift1, shift2, tmp, tmp1, tmp2, maskL, maskR, maskM;
+ FX_BYTE *lineSrc, *lineDst, *sp, *dp;
+ FX_INT32 sw, sh;
+ if (!m_pData) {
+ return FALSE;
+ }
+ if (x < -1048576 || x > 1048576 || y < -1048576 || y > 1048576) {
+ return FALSE;
+ }
+ sw = pSrcRect->Width();
+ sh = pSrcRect->Height();
+ if(y < 0) {
+ ys0 = -y;
+ } else {
+ ys0 = 0;
+ }
+ if(y + sh > pDst->m_nHeight) {
+ ys1 = pDst->m_nHeight - y;
+ } else {
+ ys1 = sh;
+ }
+ if(x < 0) {
+ xs0 = -x;
+ } else {
+ xs0 = 0;
+ }
+ if(x + sw > pDst->m_nWidth) {
+ xs1 = pDst->m_nWidth - x;
+ } else {
+ xs1 = sw;
+ }
+ if((ys0 >= ys1) || (xs0 >= xs1)) {
+ return 0;
+ }
+ w = xs1 - xs0;
+ h = ys1 - ys0;
+ if(y < 0) {
+ yd0 = 0;
+ } else {
+ yd0 = y;
+ }
+ if(x < 0) {
+ xd0 = 0;
+ } else {
+ xd0 = x;
+ }
+ xd1 = xd0 + w;
+ yd1 = yd0 + h;
+ d1 = xd0 & 31;
+ d2 = xd1 & 31;
+ s1 = xs0 & 31;
+ maskL = 0xffffffff >> d1;
+ maskR = 0xffffffff << ((32 - (xd1 & 31)) % 32);
+ maskM = maskL & maskR;
+ lineSrc = m_pData + (pSrcRect->top + ys0) * m_nStride + (((xs0 + pSrcRect->left) >> 5) << 2);
+ lineLeft = m_nStride - ((xs0 >> 5) << 2);
+ lineDst = pDst->m_pData + yd0 * pDst->m_nStride + ((xd0 >> 5) << 2);
+ if((xd0 & ~31) == ((xd1 - 1) & ~31)) {
+ if((xs0 & ~31) == ((xs1 - 1) & ~31)) {
+ if(s1 > d1) {
+ shift = s1 - d1;
+ for(yy = yd0; yy < yd1; yy++) {
+ tmp1 = JBIG2_GETDWORD(lineSrc) << shift;
+ tmp2 = JBIG2_GETDWORD(lineDst);
+ switch(op) {
+ case JBIG2_COMPOSE_OR:
+ tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM);
+ break;
+ case JBIG2_COMPOSE_AND:
+ tmp = (tmp2 & ~maskM) | ((tmp1 & tmp2) & maskM);
+ break;
+ case JBIG2_COMPOSE_XOR:
+ tmp = (tmp2 & ~maskM) | ((tmp1 ^ tmp2) & maskM);
+ break;
+ case JBIG2_COMPOSE_XNOR:
+ tmp = (tmp2 & ~maskM) | ((~(tmp1 ^ tmp2)) & maskM);
+ break;
+ case JBIG2_COMPOSE_REPLACE:
+ tmp = (tmp2 & ~maskM) | (tmp1 & maskM);
+ break;
+ }
+ lineDst[0] = (FX_BYTE)(tmp >> 24);
+ lineDst[1] = (FX_BYTE)(tmp >> 16);
+ lineDst[2] = (FX_BYTE)(tmp >> 8);
+ lineDst[3] = (FX_BYTE)tmp;
+ lineSrc += m_nStride;
+ lineDst += pDst->m_nStride;
+ }
+ } else {
+ shift = d1 - s1;
+ for(yy = yd0; yy < yd1; yy++) {
+ tmp1 = JBIG2_GETDWORD(lineSrc) >> shift;
+ tmp2 = JBIG2_GETDWORD(lineDst);
+ switch(op) {
+ case JBIG2_COMPOSE_OR:
+ tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM);
+ break;
+ case JBIG2_COMPOSE_AND:
+ tmp = (tmp2 & ~maskM) | ((tmp1 & tmp2) & maskM);
+ break;
+ case JBIG2_COMPOSE_XOR:
+ tmp = (tmp2 & ~maskM) | ((tmp1 ^ tmp2) & maskM);
+ break;
+ case JBIG2_COMPOSE_XNOR:
+ tmp = (tmp2 & ~maskM) | ((~(tmp1 ^ tmp2)) & maskM);
+ break;
+ case JBIG2_COMPOSE_REPLACE:
+ tmp = (tmp2 & ~maskM) | (tmp1 & maskM);
+ break;
+ }
+ lineDst[0] = (FX_BYTE)(tmp >> 24);
+ lineDst[1] = (FX_BYTE)(tmp >> 16);
+ lineDst[2] = (FX_BYTE)(tmp >> 8);
+ lineDst[3] = (FX_BYTE)tmp;
+ lineSrc += m_nStride;
+ lineDst += pDst->m_nStride;
+ }
+ }
+ } else {
+ shift1 = s1 - d1;
+ shift2 = 32 - shift1;
+ for(yy = yd0; yy < yd1; yy++) {
+ tmp1 = (JBIG2_GETDWORD(lineSrc) << shift1) | (JBIG2_GETDWORD(lineSrc + 4) >> shift2);
+ tmp2 = JBIG2_GETDWORD(lineDst);
+ switch(op) {
+ case JBIG2_COMPOSE_OR:
+ tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM);
+ break;
+ case JBIG2_COMPOSE_AND:
+ tmp = (tmp2 & ~maskM) | ((tmp1 & tmp2) & maskM);
+ break;
+ case JBIG2_COMPOSE_XOR:
+ tmp = (tmp2 & ~maskM) | ((tmp1 ^ tmp2) & maskM);
+ break;
+ case JBIG2_COMPOSE_XNOR:
+ tmp = (tmp2 & ~maskM) | ((~(tmp1 ^ tmp2)) & maskM);
+ break;
+ case JBIG2_COMPOSE_REPLACE:
+ tmp = (tmp2 & ~maskM) | (tmp1 & maskM);
+ break;
+ }
+ lineDst[0] = (FX_BYTE)(tmp >> 24);
+ lineDst[1] = (FX_BYTE)(tmp >> 16);
+ lineDst[2] = (FX_BYTE)(tmp >> 8);
+ lineDst[3] = (FX_BYTE)tmp;
+ lineSrc += m_nStride;
+ lineDst += pDst->m_nStride;
+ }
+ }
+ } else {
+ if(s1 > d1) {
+ shift1 = s1 - d1;
+ shift2 = 32 - shift1;
+ middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5);
+ for(yy = yd0; yy < yd1; yy++) {
+ sp = lineSrc;
+ dp = lineDst;
+ if(d1 != 0) {
+ tmp1 = (JBIG2_GETDWORD(sp) << shift1) | (JBIG2_GETDWORD(sp + 4) >> shift2);
+ tmp2 = JBIG2_GETDWORD(dp);
+ switch(op) {
+ case JBIG2_COMPOSE_OR:
+ tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL);
+ break;
+ case JBIG2_COMPOSE_AND:
+ tmp = (tmp2 & ~maskL) | ((tmp1 & tmp2) & maskL);
+ break;
+ case JBIG2_COMPOSE_XOR:
+ tmp = (tmp2 & ~maskL) | ((tmp1 ^ tmp2) & maskL);
+ break;
+ case JBIG2_COMPOSE_XNOR:
+ tmp = (tmp2 & ~maskL) | ((~(tmp1 ^ tmp2)) & maskL);
+ break;
+ case JBIG2_COMPOSE_REPLACE:
+ tmp = (tmp2 & ~maskL) | (tmp1 & maskL);
+ break;
+ }
+ dp[0] = (FX_BYTE)(tmp >> 24);
+ dp[1] = (FX_BYTE)(tmp >> 16);
+ dp[2] = (FX_BYTE)(tmp >> 8);
+ dp[3] = (FX_BYTE)tmp;
+ sp += 4;
+ dp += 4;
+ }
+ for(xx = 0; xx < middleDwords; xx++) {
+ tmp1 = (JBIG2_GETDWORD(sp) << shift1) | (JBIG2_GETDWORD(sp + 4) >> shift2);
+ tmp2 = JBIG2_GETDWORD(dp);
+ switch(op) {
+ case JBIG2_COMPOSE_OR:
+ tmp = tmp1 | tmp2;
+ break;
+ case JBIG2_COMPOSE_AND:
+ tmp = tmp1 & tmp2;
+ break;
+ case JBIG2_COMPOSE_XOR:
+ tmp = tmp1 ^ tmp2;
+ break;
+ case JBIG2_COMPOSE_XNOR:
+ tmp = ~(tmp1 ^ tmp2);
+ break;
+ case JBIG2_COMPOSE_REPLACE:
+ tmp = tmp1;
+ break;
+ }
+ dp[0] = (FX_BYTE)(tmp >> 24);
+ dp[1] = (FX_BYTE)(tmp >> 16);
+ dp[2] = (FX_BYTE)(tmp >> 8);
+ dp[3] = (FX_BYTE)tmp;
+ sp += 4;
+ dp += 4;
+ }
+ if(d2 != 0) {
+ tmp1 = (JBIG2_GETDWORD(sp) << shift1) | (
+ ((sp + 4) < lineSrc + lineLeft ? JBIG2_GETDWORD(sp + 4) : 0) >> shift2);
+ tmp2 = JBIG2_GETDWORD(dp);
+ switch(op) {
+ case JBIG2_COMPOSE_OR:
+ tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR);
+ break;
+ case JBIG2_COMPOSE_AND:
+ tmp = (tmp2 & ~maskR) | ((tmp1 & tmp2) & maskR);
+ break;
+ case JBIG2_COMPOSE_XOR:
+ tmp = (tmp2 & ~maskR) | ((tmp1 ^ tmp2) & maskR);
+ break;
+ case JBIG2_COMPOSE_XNOR:
+ tmp = (tmp2 & ~maskR) | ((~(tmp1 ^ tmp2)) & maskR);
+ break;
+ case JBIG2_COMPOSE_REPLACE:
+ tmp = (tmp2 & ~maskR) | (tmp1 & maskR);
+ break;
+ }
+ dp[0] = (FX_BYTE)(tmp >> 24);
+ dp[1] = (FX_BYTE)(tmp >> 16);
+ dp[2] = (FX_BYTE)(tmp >> 8);
+ dp[3] = (FX_BYTE)tmp;
+ }
+ lineSrc += m_nStride;
+ lineDst += pDst->m_nStride;
+ }
+ } else if(s1 == d1) {
+ middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5);
+ for(yy = yd0; yy < yd1; yy++) {
+ sp = lineSrc;
+ dp = lineDst;
+ if(d1 != 0) {
+ tmp1 = JBIG2_GETDWORD(sp);
+ tmp2 = JBIG2_GETDWORD(dp);
+ switch(op) {
+ case JBIG2_COMPOSE_OR:
+ tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL);
+ break;
+ case JBIG2_COMPOSE_AND:
+ tmp = (tmp2 & ~maskL) | ((tmp1 & tmp2) & maskL);
+ break;
+ case JBIG2_COMPOSE_XOR:
+ tmp = (tmp2 & ~maskL) | ((tmp1 ^ tmp2) & maskL);
+ break;
+ case JBIG2_COMPOSE_XNOR:
+ tmp = (tmp2 & ~maskL) | ((~(tmp1 ^ tmp2)) & maskL);
+ break;
+ case JBIG2_COMPOSE_REPLACE:
+ tmp = (tmp2 & ~maskL) | (tmp1 & maskL);
+ break;
+ }
+ dp[0] = (FX_BYTE)(tmp >> 24);
+ dp[1] = (FX_BYTE)(tmp >> 16);
+ dp[2] = (FX_BYTE)(tmp >> 8);
+ dp[3] = (FX_BYTE)tmp;
+ sp += 4;
+ dp += 4;
+ }
+ for(xx = 0; xx < middleDwords; xx++) {
+ tmp1 = JBIG2_GETDWORD(sp);
+ tmp2 = JBIG2_GETDWORD(dp);
+ switch(op) {
+ case JBIG2_COMPOSE_OR:
+ tmp = tmp1 | tmp2;
+ break;
+ case JBIG2_COMPOSE_AND:
+ tmp = tmp1 & tmp2;
+ break;
+ case JBIG2_COMPOSE_XOR:
+ tmp = tmp1 ^ tmp2;
+ break;
+ case JBIG2_COMPOSE_XNOR:
+ tmp = ~(tmp1 ^ tmp2);
+ break;
+ case JBIG2_COMPOSE_REPLACE:
+ tmp = tmp1;
+ break;
+ }
+ dp[0] = (FX_BYTE)(tmp >> 24);
+ dp[1] = (FX_BYTE)(tmp >> 16);
+ dp[2] = (FX_BYTE)(tmp >> 8);
+ dp[3] = (FX_BYTE)tmp;
+ sp += 4;
+ dp += 4;
+ }
+ if(d2 != 0) {
+ tmp1 = JBIG2_GETDWORD(sp);
+ tmp2 = JBIG2_GETDWORD(dp);
+ switch(op) {
+ case JBIG2_COMPOSE_OR:
+ tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR);
+ break;
+ case JBIG2_COMPOSE_AND:
+ tmp = (tmp2 & ~maskR) | ((tmp1 & tmp2) & maskR);
+ break;
+ case JBIG2_COMPOSE_XOR:
+ tmp = (tmp2 & ~maskR) | ((tmp1 ^ tmp2) & maskR);
+ break;
+ case JBIG2_COMPOSE_XNOR:
+ tmp = (tmp2 & ~maskR) | ((~(tmp1 ^ tmp2)) & maskR);
+ break;
+ case JBIG2_COMPOSE_REPLACE:
+ tmp = (tmp2 & ~maskR) | (tmp1 & maskR);
+ break;
+ }
+ dp[0] = (FX_BYTE)(tmp >> 24);
+ dp[1] = (FX_BYTE)(tmp >> 16);
+ dp[2] = (FX_BYTE)(tmp >> 8);
+ dp[3] = (FX_BYTE)tmp;
+ }
+ lineSrc += m_nStride;
+ lineDst += pDst->m_nStride;
+ }
+ } else {
+ shift1 = d1 - s1;
+ shift2 = 32 - shift1;
+ middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5);
+ for(yy = yd0; yy < yd1; yy++) {
+ sp = lineSrc;
+ dp = lineDst;
+ if(d1 != 0) {
+ tmp1 = JBIG2_GETDWORD(sp) >> shift1;
+ tmp2 = JBIG2_GETDWORD(dp);
+ switch(op) {
+ case JBIG2_COMPOSE_OR:
+ tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL);
+ break;
+ case JBIG2_COMPOSE_AND:
+ tmp = (tmp2 & ~maskL) | ((tmp1 & tmp2) & maskL);
+ break;
+ case JBIG2_COMPOSE_XOR:
+ tmp = (tmp2 & ~maskL) | ((tmp1 ^ tmp2) & maskL);
+ break;
+ case JBIG2_COMPOSE_XNOR:
+ tmp = (tmp2 & ~maskL) | ((~(tmp1 ^ tmp2)) & maskL);
+ break;
+ case JBIG2_COMPOSE_REPLACE:
+ tmp = (tmp2 & ~maskL) | (tmp1 & maskL);
+ break;
+ }
+ dp[0] = (FX_BYTE)(tmp >> 24);
+ dp[1] = (FX_BYTE)(tmp >> 16);
+ dp[2] = (FX_BYTE)(tmp >> 8);
+ dp[3] = (FX_BYTE)tmp;
+ dp += 4;
+ }
+ for(xx = 0; xx < middleDwords; xx++) {
+ tmp1 = (JBIG2_GETDWORD(sp) << shift2) | ((JBIG2_GETDWORD(sp + 4)) >> shift1);
+ tmp2 = JBIG2_GETDWORD(dp);
+ switch(op) {
+ case JBIG2_COMPOSE_OR:
+ tmp = tmp1 | tmp2;
+ break;
+ case JBIG2_COMPOSE_AND:
+ tmp = tmp1 & tmp2;
+ break;
+ case JBIG2_COMPOSE_XOR:
+ tmp = tmp1 ^ tmp2;
+ break;
+ case JBIG2_COMPOSE_XNOR:
+ tmp = ~(tmp1 ^ tmp2);
+ break;
+ case JBIG2_COMPOSE_REPLACE:
+ tmp = tmp1;
+ break;
+ }
+ dp[0] = (FX_BYTE)(tmp >> 24);
+ dp[1] = (FX_BYTE)(tmp >> 16);
+ dp[2] = (FX_BYTE)(tmp >> 8);
+ dp[3] = (FX_BYTE)tmp;
+ sp += 4;
+ dp += 4;
+ }
+ if(d2 != 0) {
+ tmp1 = (JBIG2_GETDWORD(sp) << shift2) | (
+ ((sp + 4) < lineSrc + lineLeft ? JBIG2_GETDWORD(sp + 4) : 0) >> shift1);
+ tmp2 = JBIG2_GETDWORD(dp);
+ switch(op) {
+ case JBIG2_COMPOSE_OR:
+ tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR);
+ break;
+ case JBIG2_COMPOSE_AND:
+ tmp = (tmp2 & ~maskR) | ((tmp1 & tmp2) & maskR);
+ break;
+ case JBIG2_COMPOSE_XOR:
+ tmp = (tmp2 & ~maskR) | ((tmp1 ^ tmp2) & maskR);
+ break;
+ case JBIG2_COMPOSE_XNOR:
+ tmp = (tmp2 & ~maskR) | ((~(tmp1 ^ tmp2)) & maskR);
+ break;
+ case JBIG2_COMPOSE_REPLACE:
+ tmp = (tmp2 & ~maskR) | (tmp1 & maskR);
+ break;
+ }
+ dp[0] = (FX_BYTE)(tmp >> 24);
+ dp[1] = (FX_BYTE)(tmp >> 16);
+ dp[2] = (FX_BYTE)(tmp >> 8);
+ dp[3] = (FX_BYTE)tmp;
+ }
+ lineSrc += m_nStride;
+ lineDst += pDst->m_nStride;
+ }
+ }
+ }
+ return 1;
+}
diff --git a/core/src/fxcodec/jbig2/JBig2_Image.h b/core/src/fxcodec/jbig2/JBig2_Image.h
index 3c69f647e3..5d06695c7c 100644
--- a/core/src/fxcodec/jbig2/JBig2_Image.h
+++ b/core/src/fxcodec/jbig2/JBig2_Image.h
@@ -1,68 +1,68 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef _JBIG2_IMAGE_H_
-#define _JBIG2_IMAGE_H_
-#include "JBig2_Define.h"
-#include "JBig2_Module.h"
-typedef enum {
- JBIG2_COMPOSE_OR = 0,
- JBIG2_COMPOSE_AND = 1,
- JBIG2_COMPOSE_XOR = 2,
- JBIG2_COMPOSE_XNOR = 3,
- JBIG2_COMPOSE_REPLACE = 4
-} JBig2ComposeOp;
-struct FX_RECT;
-class CJBig2_Image : public CJBig2_Object
-{
-public:
-
- CJBig2_Image(FX_INT32 w, FX_INT32 h);
-
- CJBig2_Image(FX_INT32 w, FX_INT32 h, FX_INT32 stride, FX_BYTE*pBuf);
-
- CJBig2_Image(CJBig2_Image &im);
-
- ~CJBig2_Image();
-
- FX_BOOL getPixel(FX_INT32 x, FX_INT32 y);
-
- FX_INT32 setPixel(FX_INT32 x, FX_INT32 y, FX_BOOL v);
-
- void copyLine(FX_INT32 hTo, FX_INT32 hFrom);
-
- void fill(FX_BOOL v);
-
- FX_BOOL composeTo(CJBig2_Image *pDst, FX_INT32 x, FX_INT32 y, JBig2ComposeOp op);
- FX_BOOL composeTo(CJBig2_Image *pDst, FX_INT32 x, FX_INT32 y, JBig2ComposeOp op, const FX_RECT* pSrcRect);
-
- FX_BOOL composeTo_unopt(CJBig2_Image *pDst, FX_INT32 x, FX_INT32 y, JBig2ComposeOp op);
-
- FX_BOOL composeTo_opt(CJBig2_Image *pDst, FX_INT32 x, FX_INT32 y, JBig2ComposeOp op);
-
- FX_BOOL composeTo_opt2(CJBig2_Image *pDst, FX_INT32 x, FX_INT32 y, JBig2ComposeOp op);
- FX_BOOL composeTo_opt2(CJBig2_Image *pDst, FX_INT32 x, FX_INT32 y, JBig2ComposeOp op, const FX_RECT* pSrcRect);
-
- FX_BOOL composeFrom(FX_INT32 x, FX_INT32 y, CJBig2_Image *pSrc, JBig2ComposeOp op);
- FX_BOOL composeFrom(FX_INT32 x, FX_INT32 y, CJBig2_Image *pSrc, JBig2ComposeOp op, const FX_RECT* pSrcRect);
- CJBig2_Image *subImage_unopt(FX_INT32 x, FX_INT32 y, FX_INT32 w, FX_INT32 h);
-
- CJBig2_Image *subImage(FX_INT32 x, FX_INT32 y, FX_INT32 w, FX_INT32 h);
-
- void expand(FX_INT32 h, FX_BOOL v);
-public:
-
- FX_INT32 m_nWidth;
-
- FX_INT32 m_nHeight;
-
- FX_INT32 m_nStride;
-
- FX_BYTE *m_pData;
-
- FX_BOOL m_bNeedFree;
-};
-#endif
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _JBIG2_IMAGE_H_
+#define _JBIG2_IMAGE_H_
+#include "JBig2_Define.h"
+#include "JBig2_Module.h"
+typedef enum {
+ JBIG2_COMPOSE_OR = 0,
+ JBIG2_COMPOSE_AND = 1,
+ JBIG2_COMPOSE_XOR = 2,
+ JBIG2_COMPOSE_XNOR = 3,
+ JBIG2_COMPOSE_REPLACE = 4
+} JBig2ComposeOp;
+struct FX_RECT;
+class CJBig2_Image : public CJBig2_Object
+{
+public:
+
+ CJBig2_Image(FX_INT32 w, FX_INT32 h);
+
+ CJBig2_Image(FX_INT32 w, FX_INT32 h, FX_INT32 stride, FX_BYTE*pBuf);
+
+ CJBig2_Image(CJBig2_Image &im);
+
+ ~CJBig2_Image();
+
+ FX_BOOL getPixel(FX_INT32 x, FX_INT32 y);
+
+ FX_INT32 setPixel(FX_INT32 x, FX_INT32 y, FX_BOOL v);
+
+ void copyLine(FX_INT32 hTo, FX_INT32 hFrom);
+
+ void fill(FX_BOOL v);
+
+ FX_BOOL composeTo(CJBig2_Image *pDst, FX_INT32 x, FX_INT32 y, JBig2ComposeOp op);
+ FX_BOOL composeTo(CJBig2_Image *pDst, FX_INT32 x, FX_INT32 y, JBig2ComposeOp op, const FX_RECT* pSrcRect);
+
+ FX_BOOL composeTo_unopt(CJBig2_Image *pDst, FX_INT32 x, FX_INT32 y, JBig2ComposeOp op);
+
+ FX_BOOL composeTo_opt(CJBig2_Image *pDst, FX_INT32 x, FX_INT32 y, JBig2ComposeOp op);
+
+ FX_BOOL composeTo_opt2(CJBig2_Image *pDst, FX_INT32 x, FX_INT32 y, JBig2ComposeOp op);
+ FX_BOOL composeTo_opt2(CJBig2_Image *pDst, FX_INT32 x, FX_INT32 y, JBig2ComposeOp op, const FX_RECT* pSrcRect);
+
+ FX_BOOL composeFrom(FX_INT32 x, FX_INT32 y, CJBig2_Image *pSrc, JBig2ComposeOp op);
+ FX_BOOL composeFrom(FX_INT32 x, FX_INT32 y, CJBig2_Image *pSrc, JBig2ComposeOp op, const FX_RECT* pSrcRect);
+ CJBig2_Image *subImage_unopt(FX_INT32 x, FX_INT32 y, FX_INT32 w, FX_INT32 h);
+
+ CJBig2_Image *subImage(FX_INT32 x, FX_INT32 y, FX_INT32 w, FX_INT32 h);
+
+ void expand(FX_INT32 h, FX_BOOL v);
+public:
+
+ FX_INT32 m_nWidth;
+
+ FX_INT32 m_nHeight;
+
+ FX_INT32 m_nStride;
+
+ FX_BYTE *m_pData;
+
+ FX_BOOL m_bNeedFree;
+};
+#endif
diff --git a/core/src/fxcodec/jbig2/JBig2_List.h b/core/src/fxcodec/jbig2/JBig2_List.h
index a737d9e112..9292724b1e 100644
--- a/core/src/fxcodec/jbig2/JBig2_List.h
+++ b/core/src/fxcodec/jbig2/JBig2_List.h
@@ -1,67 +1,67 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef _JBIG2_LIST_H_
-#define _JBIG2_LIST_H_
-#include "JBig2_Define.h"
-#include "JBig2_Object.h"
-template <class TYPE>
-class CJBig2_List : public CJBig2_Object
-{
-public:
-
- CJBig2_List(FX_INT32 nSize = 8)
- {
- m_nSize = nSize;
- m_pArray = (TYPE**)m_pModule->JBig2_Malloc2(sizeof(TYPE*), nSize);
- m_nLength = 0;
- }
-
- ~CJBig2_List()
- {
- clear();
- m_pModule->JBig2_Free(m_pArray);
- }
-
- void clear()
- {
- FX_INT32 i;
- for(i = 0; i < m_nLength; i++) {
- delete m_pArray[i];
- }
- m_nLength = 0;
- }
-
- void addItem(TYPE *pItem)
- {
- if(m_nLength >= m_nSize) {
- m_nSize += 8;
- m_pArray = (TYPE**)m_pModule->JBig2_Realloc(m_pArray, sizeof(TYPE*)*m_nSize);
- }
- m_pArray[m_nLength++] = pItem;
- }
-
-
- FX_INT32 getLength()
- {
- return m_nLength;
- }
-
- TYPE *getAt(FX_INT32 nIndex)
- {
- return m_pArray[nIndex];
- }
-
- TYPE *getLast()
- {
- return m_pArray[m_nLength - 1];
- }
-private:
- FX_INT32 m_nSize;
- TYPE **m_pArray;
- FX_INT32 m_nLength;
-};
-#endif
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _JBIG2_LIST_H_
+#define _JBIG2_LIST_H_
+#include "JBig2_Define.h"
+#include "JBig2_Object.h"
+template <class TYPE>
+class CJBig2_List : public CJBig2_Object
+{
+public:
+
+ CJBig2_List(FX_INT32 nSize = 8)
+ {
+ m_nSize = nSize;
+ m_pArray = (TYPE**)m_pModule->JBig2_Malloc2(sizeof(TYPE*), nSize);
+ m_nLength = 0;
+ }
+
+ ~CJBig2_List()
+ {
+ clear();
+ m_pModule->JBig2_Free(m_pArray);
+ }
+
+ void clear()
+ {
+ FX_INT32 i;
+ for(i = 0; i < m_nLength; i++) {
+ delete m_pArray[i];
+ }
+ m_nLength = 0;
+ }
+
+ void addItem(TYPE *pItem)
+ {
+ if(m_nLength >= m_nSize) {
+ m_nSize += 8;
+ m_pArray = (TYPE**)m_pModule->JBig2_Realloc(m_pArray, sizeof(TYPE*)*m_nSize);
+ }
+ m_pArray[m_nLength++] = pItem;
+ }
+
+
+ FX_INT32 getLength()
+ {
+ return m_nLength;
+ }
+
+ TYPE *getAt(FX_INT32 nIndex)
+ {
+ return m_pArray[nIndex];
+ }
+
+ TYPE *getLast()
+ {
+ return m_pArray[m_nLength - 1];
+ }
+private:
+ FX_INT32 m_nSize;
+ TYPE **m_pArray;
+ FX_INT32 m_nLength;
+};
+#endif
diff --git a/core/src/fxcodec/jbig2/JBig2_Module.h b/core/src/fxcodec/jbig2/JBig2_Module.h
index ccde5ade02..3a01eb094c 100644
--- a/core/src/fxcodec/jbig2/JBig2_Module.h
+++ b/core/src/fxcodec/jbig2/JBig2_Module.h
@@ -1,32 +1,32 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef _JBIG2_MODULE_H_
-#define _JBIG2_MODULE_H_
-#include "JBig2_Define.h"
-class CJBig2_Module
-{
-public:
-
- virtual void *JBig2_Malloc(FX_DWORD dwSize) = 0;
-
- virtual void *JBig2_Malloc2(FX_DWORD num, FX_DWORD dwSize) = 0;
-
- virtual void *JBig2_Malloc3(FX_DWORD num, FX_DWORD dwSize, FX_DWORD dwSize2) = 0;
-
- virtual void *JBig2_Realloc(FX_LPVOID pMem, FX_DWORD dwSize) = 0;
-
- virtual void JBig2_Free(FX_LPVOID pMem) = 0;
-
- virtual void JBig2_Assert(FX_INT32 nExpression) {};
-
- virtual void JBig2_Error(FX_LPCSTR format, ...) {};
-
- virtual void JBig2_Warn(FX_LPCSTR format, ...) {};
-
- virtual void JBig2_Log(FX_LPCSTR format, ...) {};
-};
-#endif
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _JBIG2_MODULE_H_
+#define _JBIG2_MODULE_H_
+#include "JBig2_Define.h"
+class CJBig2_Module
+{
+public:
+
+ virtual void *JBig2_Malloc(FX_DWORD dwSize) = 0;
+
+ virtual void *JBig2_Malloc2(FX_DWORD num, FX_DWORD dwSize) = 0;
+
+ virtual void *JBig2_Malloc3(FX_DWORD num, FX_DWORD dwSize, FX_DWORD dwSize2) = 0;
+
+ virtual void *JBig2_Realloc(FX_LPVOID pMem, FX_DWORD dwSize) = 0;
+
+ virtual void JBig2_Free(FX_LPVOID pMem) = 0;
+
+ virtual void JBig2_Assert(FX_INT32 nExpression) {};
+
+ virtual void JBig2_Error(FX_LPCSTR format, ...) {};
+
+ virtual void JBig2_Warn(FX_LPCSTR format, ...) {};
+
+ virtual void JBig2_Log(FX_LPCSTR format, ...) {};
+};
+#endif
diff --git a/core/src/fxcodec/jbig2/JBig2_Object.cpp b/core/src/fxcodec/jbig2/JBig2_Object.cpp
index 3a94f0e65a..2bb267b085 100644
--- a/core/src/fxcodec/jbig2/JBig2_Object.cpp
+++ b/core/src/fxcodec/jbig2/JBig2_Object.cpp
@@ -1,72 +1,72 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "JBig2_Object.h"
-#include "JBig2_Module.h"
-void *CJBig2_Object::operator new(size_t size, CJBig2_Module *pModule, FX_LPCSTR filename, int line)
-{
- CJBig2_Object *p;
- p = (CJBig2_Object *)pModule->JBig2_Malloc((FX_DWORD)size);
- p->m_pModule = pModule;
- return p;
-}
-void CJBig2_Object::operator delete(void *p, CJBig2_Module *pModule, FX_LPCSTR filename, int line)
-{
- pModule->JBig2_Free(p);
-}
-void *CJBig2_Object::operator new(size_t size, CJBig2_Module *pModule)
-{
- CJBig2_Object *p;
- p = (CJBig2_Object *)pModule->JBig2_Malloc((FX_DWORD)size);
- p->m_pModule = pModule;
- return p;
-}
-void CJBig2_Object::operator delete(void *p)
-{
- ((CJBig2_Object *)p)->m_pModule->JBig2_Free(p);
-}
-void CJBig2_Object::operator delete(void *p, CJBig2_Module *pModule)
-{
- pModule->JBig2_Free(p);
-}
-void *CJBig2_Object::operator new[](size_t size, CJBig2_Module *pModule, size_t unit_size,
- FX_LPCSTR filename, int line)
-{
- void *p;
- FX_BYTE *pCur, *pEnd;
- p = (FX_BYTE *)pModule->JBig2_Malloc((FX_DWORD)size);
- pCur = (FX_BYTE *)p;
- pEnd = pCur + size;
- for(; pCur < pEnd; pCur += unit_size) {
- ((CJBig2_Object *)pCur)->m_pModule = pModule;
- }
- return p;
-}
-void CJBig2_Object::operator delete[](void *p, CJBig2_Module *pModule, size_t unit_size,
- FX_LPCSTR filename, int line)
-{
- pModule->JBig2_Free(p);
-}
-void *CJBig2_Object::operator new[](size_t size, CJBig2_Module *pModule, size_t unit_size)
-{
- void *p;
- FX_BYTE *pCur, *pEnd;
- p = (FX_BYTE *)pModule->JBig2_Malloc((FX_DWORD)size);
- pCur = (FX_BYTE *)p;
- pEnd = pCur + size;
- for(; pCur < pEnd; pCur += unit_size) {
- ((CJBig2_Object *)pCur)->m_pModule = pModule;
- }
- return p;
-}
-void CJBig2_Object::operator delete[](void* p)
-{
- ((CJBig2_Object *)p)->m_pModule->JBig2_Free(p);
-}
-void CJBig2_Object::operator delete[](void *p, CJBig2_Module *pModule, size_t unit_size)
-{
- pModule->JBig2_Free(p);
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "JBig2_Object.h"
+#include "JBig2_Module.h"
+void *CJBig2_Object::operator new(size_t size, CJBig2_Module *pModule, FX_LPCSTR filename, int line)
+{
+ CJBig2_Object *p;
+ p = (CJBig2_Object *)pModule->JBig2_Malloc((FX_DWORD)size);
+ p->m_pModule = pModule;
+ return p;
+}
+void CJBig2_Object::operator delete(void *p, CJBig2_Module *pModule, FX_LPCSTR filename, int line)
+{
+ pModule->JBig2_Free(p);
+}
+void *CJBig2_Object::operator new(size_t size, CJBig2_Module *pModule)
+{
+ CJBig2_Object *p;
+ p = (CJBig2_Object *)pModule->JBig2_Malloc((FX_DWORD)size);
+ p->m_pModule = pModule;
+ return p;
+}
+void CJBig2_Object::operator delete(void *p)
+{
+ ((CJBig2_Object *)p)->m_pModule->JBig2_Free(p);
+}
+void CJBig2_Object::operator delete(void *p, CJBig2_Module *pModule)
+{
+ pModule->JBig2_Free(p);
+}
+void *CJBig2_Object::operator new[](size_t size, CJBig2_Module *pModule, size_t unit_size,
+ FX_LPCSTR filename, int line)
+{
+ void *p;
+ FX_BYTE *pCur, *pEnd;
+ p = (FX_BYTE *)pModule->JBig2_Malloc((FX_DWORD)size);
+ pCur = (FX_BYTE *)p;
+ pEnd = pCur + size;
+ for(; pCur < pEnd; pCur += unit_size) {
+ ((CJBig2_Object *)pCur)->m_pModule = pModule;
+ }
+ return p;
+}
+void CJBig2_Object::operator delete[](void *p, CJBig2_Module *pModule, size_t unit_size,
+ FX_LPCSTR filename, int line)
+{
+ pModule->JBig2_Free(p);
+}
+void *CJBig2_Object::operator new[](size_t size, CJBig2_Module *pModule, size_t unit_size)
+{
+ void *p;
+ FX_BYTE *pCur, *pEnd;
+ p = (FX_BYTE *)pModule->JBig2_Malloc((FX_DWORD)size);
+ pCur = (FX_BYTE *)p;
+ pEnd = pCur + size;
+ for(; pCur < pEnd; pCur += unit_size) {
+ ((CJBig2_Object *)pCur)->m_pModule = pModule;
+ }
+ return p;
+}
+void CJBig2_Object::operator delete[](void* p)
+{
+ ((CJBig2_Object *)p)->m_pModule->JBig2_Free(p);
+}
+void CJBig2_Object::operator delete[](void *p, CJBig2_Module *pModule, size_t unit_size)
+{
+ pModule->JBig2_Free(p);
+}
diff --git a/core/src/fxcodec/jbig2/JBig2_Object.h b/core/src/fxcodec/jbig2/JBig2_Object.h
index 7fef1a21a9..23eecbf171 100644
--- a/core/src/fxcodec/jbig2/JBig2_Object.h
+++ b/core/src/fxcodec/jbig2/JBig2_Object.h
@@ -1,43 +1,43 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef _JBIG2_OBJECT_H_
-#define _JBIG2_OBJECT_H_
-#include "JBig2_Define.h"
-class CJBig2_Module;
-#define _JBIG2_NO_EXPECTION_
-class CJBig2_Object
-{
-public:
-
- void *operator new(size_t size, CJBig2_Module *pModule, FX_LPCSTR filename, int line);
-
- void operator delete(void *p, CJBig2_Module *pModule, FX_LPCSTR filename, int line);
-
- void *operator new(size_t size, CJBig2_Module *pModule);
-
- void operator delete(void *p);
-
- void operator delete(void *p, CJBig2_Module *pModule);
-
- void *operator new[](size_t size, CJBig2_Module *pModule, size_t unit_size,
- FX_LPCSTR filename, int line);
-
- void operator delete[](void *p, CJBig2_Module *pModule, size_t unit_size,
- FX_LPCSTR filename, int line);
-
- void *operator new[](size_t size, CJBig2_Module *pModule, size_t unit_size);
-
- void operator delete[](void* p);
-
- void operator delete[](void *p, CJBig2_Module *pModule, size_t unit_size);
-public:
-
- CJBig2_Module *m_pModule;
-};
-#define JBIG2_NEW new(m_pModule)
-#define JBIG2_ALLOC(p, a) p = JBIG2_NEW a; p->m_pModule = m_pModule;
-#endif
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _JBIG2_OBJECT_H_
+#define _JBIG2_OBJECT_H_
+#include "JBig2_Define.h"
+class CJBig2_Module;
+#define _JBIG2_NO_EXPECTION_
+class CJBig2_Object
+{
+public:
+
+ void *operator new(size_t size, CJBig2_Module *pModule, FX_LPCSTR filename, int line);
+
+ void operator delete(void *p, CJBig2_Module *pModule, FX_LPCSTR filename, int line);
+
+ void *operator new(size_t size, CJBig2_Module *pModule);
+
+ void operator delete(void *p);
+
+ void operator delete(void *p, CJBig2_Module *pModule);
+
+ void *operator new[](size_t size, CJBig2_Module *pModule, size_t unit_size,
+ FX_LPCSTR filename, int line);
+
+ void operator delete[](void *p, CJBig2_Module *pModule, size_t unit_size,
+ FX_LPCSTR filename, int line);
+
+ void *operator new[](size_t size, CJBig2_Module *pModule, size_t unit_size);
+
+ void operator delete[](void* p);
+
+ void operator delete[](void *p, CJBig2_Module *pModule, size_t unit_size);
+public:
+
+ CJBig2_Module *m_pModule;
+};
+#define JBIG2_NEW new(m_pModule)
+#define JBIG2_ALLOC(p, a) p = JBIG2_NEW a; p->m_pModule = m_pModule;
+#endif
diff --git a/core/src/fxcodec/jbig2/JBig2_Page.h b/core/src/fxcodec/jbig2/JBig2_Page.h
index 490705448c..d7399bd452 100644
--- a/core/src/fxcodec/jbig2/JBig2_Page.h
+++ b/core/src/fxcodec/jbig2/JBig2_Page.h
@@ -1,19 +1,19 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef _JBIG2_PAGE_H_
-#define _JBIG2_PAGE_H_
-#include "JBig2_Image.h"
-struct JBig2PageInfo : public CJBig2_Object {
- FX_DWORD m_dwWidth,
- m_dwHeight;
- FX_DWORD m_dwResolutionX,
- m_dwResolutionY;
- FX_BYTE m_cFlags;
- FX_BOOL m_bIsStriped;
- FX_WORD m_wMaxStripeSize;
-};
-#endif
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _JBIG2_PAGE_H_
+#define _JBIG2_PAGE_H_
+#include "JBig2_Image.h"
+struct JBig2PageInfo : public CJBig2_Object {
+ FX_DWORD m_dwWidth,
+ m_dwHeight;
+ FX_DWORD m_dwResolutionX,
+ m_dwResolutionY;
+ FX_BYTE m_cFlags;
+ FX_BOOL m_bIsStriped;
+ FX_WORD m_wMaxStripeSize;
+};
+#endif
diff --git a/core/src/fxcodec/jbig2/JBig2_PatternDict.cpp b/core/src/fxcodec/jbig2/JBig2_PatternDict.cpp
index 58c52a5848..0c6e5be8ce 100644
--- a/core/src/fxcodec/jbig2/JBig2_PatternDict.cpp
+++ b/core/src/fxcodec/jbig2/JBig2_PatternDict.cpp
@@ -1,24 +1,24 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "JBig2_PatternDict.h"
-CJBig2_PatternDict::CJBig2_PatternDict()
-{
- NUMPATS = 0;
- HDPATS = NULL;
-}
-
-CJBig2_PatternDict::~CJBig2_PatternDict()
-{
- if(HDPATS) {
- for(FX_DWORD i = 0; i < NUMPATS; i++) {
- if(HDPATS[i]) {
- delete HDPATS[i];
- }
- }
- m_pModule->JBig2_Free(HDPATS);
- }
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "JBig2_PatternDict.h"
+CJBig2_PatternDict::CJBig2_PatternDict()
+{
+ NUMPATS = 0;
+ HDPATS = NULL;
+}
+
+CJBig2_PatternDict::~CJBig2_PatternDict()
+{
+ if(HDPATS) {
+ for(FX_DWORD i = 0; i < NUMPATS; i++) {
+ if(HDPATS[i]) {
+ delete HDPATS[i];
+ }
+ }
+ m_pModule->JBig2_Free(HDPATS);
+ }
+}
diff --git a/core/src/fxcodec/jbig2/JBig2_PatternDict.h b/core/src/fxcodec/jbig2/JBig2_PatternDict.h
index c8686507d9..b75cbde999 100644
--- a/core/src/fxcodec/jbig2/JBig2_PatternDict.h
+++ b/core/src/fxcodec/jbig2/JBig2_PatternDict.h
@@ -1,22 +1,22 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef _JBIG2_PATTERN_DICT_H_
-#define _JBIG2_PATTERN_DICT_H_
-#include "JBig2_Define.h"
-#include "JBig2_Image.h"
-class CJBig2_PatternDict : public CJBig2_Object
-{
-public:
-
- CJBig2_PatternDict();
-
- ~CJBig2_PatternDict();
-public:
- FX_DWORD NUMPATS;
- CJBig2_Image **HDPATS;
-};
-#endif
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _JBIG2_PATTERN_DICT_H_
+#define _JBIG2_PATTERN_DICT_H_
+#include "JBig2_Define.h"
+#include "JBig2_Image.h"
+class CJBig2_PatternDict : public CJBig2_Object
+{
+public:
+
+ CJBig2_PatternDict();
+
+ ~CJBig2_PatternDict();
+public:
+ FX_DWORD NUMPATS;
+ CJBig2_Image **HDPATS;
+};
+#endif
diff --git a/core/src/fxcodec/jbig2/JBig2_Segment.cpp b/core/src/fxcodec/jbig2/JBig2_Segment.cpp
index 788207dc6e..b7eed35987 100644
--- a/core/src/fxcodec/jbig2/JBig2_Segment.cpp
+++ b/core/src/fxcodec/jbig2/JBig2_Segment.cpp
@@ -1,53 +1,53 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "JBig2_Segment.h"
-CJBig2_Segment::CJBig2_Segment()
-{
- init();
-}
-CJBig2_Segment::~CJBig2_Segment()
-{
- clean();
-}
-void CJBig2_Segment::init()
-{
- m_dwNumber = 0;
- m_cFlags.c = 0;
- m_nReferred_to_segment_count = 0;
- m_pReferred_to_segment_numbers = NULL;
- m_dwPage_association = 0;
- m_dwData_length = 0;
- m_dwHeader_Length = 0;
- m_pData = NULL;
- m_State = JBIG2_SEGMENT_HEADER_UNPARSED;
- m_nResultType = JBIG2_VOID_POINTER;
- m_Result.vd = NULL;
-}
-void CJBig2_Segment::clean()
-{
- if(m_pReferred_to_segment_numbers) {
- m_pModule->JBig2_Free(m_pReferred_to_segment_numbers);
- }
- if(m_Result.vd) {
- switch(m_nResultType) {
- case JBIG2_IMAGE_POINTER:
- delete m_Result.im;
- break;
- case JBIG2_SYMBOL_DICT_POINTER:
- delete m_Result.sd;
- break;
- case JBIG2_PATTERN_DICT_POINTER:
- delete m_Result.pd;
- break;
- case JBIG2_HUFFMAN_TABLE_POINTER:
- delete m_Result.ht;
- break;
- default:
- m_pModule->JBig2_Free(m_Result.vd);
- }
- }
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "JBig2_Segment.h"
+CJBig2_Segment::CJBig2_Segment()
+{
+ init();
+}
+CJBig2_Segment::~CJBig2_Segment()
+{
+ clean();
+}
+void CJBig2_Segment::init()
+{
+ m_dwNumber = 0;
+ m_cFlags.c = 0;
+ m_nReferred_to_segment_count = 0;
+ m_pReferred_to_segment_numbers = NULL;
+ m_dwPage_association = 0;
+ m_dwData_length = 0;
+ m_dwHeader_Length = 0;
+ m_pData = NULL;
+ m_State = JBIG2_SEGMENT_HEADER_UNPARSED;
+ m_nResultType = JBIG2_VOID_POINTER;
+ m_Result.vd = NULL;
+}
+void CJBig2_Segment::clean()
+{
+ if(m_pReferred_to_segment_numbers) {
+ m_pModule->JBig2_Free(m_pReferred_to_segment_numbers);
+ }
+ if(m_Result.vd) {
+ switch(m_nResultType) {
+ case JBIG2_IMAGE_POINTER:
+ delete m_Result.im;
+ break;
+ case JBIG2_SYMBOL_DICT_POINTER:
+ delete m_Result.sd;
+ break;
+ case JBIG2_PATTERN_DICT_POINTER:
+ delete m_Result.pd;
+ break;
+ case JBIG2_HUFFMAN_TABLE_POINTER:
+ delete m_Result.ht;
+ break;
+ default:
+ m_pModule->JBig2_Free(m_Result.vd);
+ }
+ }
+}
diff --git a/core/src/fxcodec/jbig2/JBig2_Segment.h b/core/src/fxcodec/jbig2/JBig2_Segment.h
index 48c31b17bb..33ee721a1b 100644
--- a/core/src/fxcodec/jbig2/JBig2_Segment.h
+++ b/core/src/fxcodec/jbig2/JBig2_Segment.h
@@ -1,68 +1,68 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef _JBIG2_SEGMENT_H_
-#define _JBIG2_SEGMENT_H_
-#include "JBig2_Define.h"
-#include "JBig2_SymbolDict.h"
-#include "JBig2_PatternDict.h"
-#include "JBig2_Module.h"
-#include "JBig2_HuffmanTable.h"
-#define JBIG2_GET_INT32(buf) (((buf)[0]<<24) | ((buf)[1]<<16) | ((buf)[2]<<8) | (buf)[3])
-#define JBIG2_GET_INT16(buf) (((buf)[0]<<8) | (buf)[1])
-typedef enum {
- JBIG2_SEGMENT_HEADER_UNPARSED,
- JBIG2_SEGMENT_DATA_UNPARSED,
- JBIG2_SEGMENT_PARSE_COMPLETE,
- JBIG2_SEGMENT_PAUSED,
- JBIG2_SEGMENT_ERROR
-} JBig2_SegmentState;
-typedef enum {
- JBIG2_VOID_POINTER = 0,
- JBIG2_IMAGE_POINTER,
- JBIG2_SYMBOL_DICT_POINTER,
- JBIG2_PATTERN_DICT_POINTER,
- JBIG2_HUFFMAN_TABLE_POINTER
-} JBig2_ResultType;
-class CJBig2_Segment : public CJBig2_Object
-{
-public:
-
- CJBig2_Segment();
-
- ~CJBig2_Segment();
-
- void init();
-
- void clean();
-public:
- FX_DWORD m_dwNumber;
- union {
- struct {
- FX_BYTE type : 6;
- FX_BYTE page_association_size : 1;
- FX_BYTE deferred_non_retain : 1;
- } s;
- FX_BYTE c;
- } m_cFlags;
- FX_INT32 m_nReferred_to_segment_count;
- FX_DWORD * m_pReferred_to_segment_numbers;
- FX_DWORD m_dwPage_association;
- FX_DWORD m_dwData_length;
-
- FX_DWORD m_dwHeader_Length;
- FX_BYTE *m_pData;
- JBig2_SegmentState m_State;
- JBig2_ResultType m_nResultType;
- union {
- CJBig2_SymbolDict *sd;
- CJBig2_PatternDict *pd;
- CJBig2_Image *im;
- CJBig2_HuffmanTable *ht;
- FX_LPVOID vd;
- } m_Result;
-};
-#endif
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _JBIG2_SEGMENT_H_
+#define _JBIG2_SEGMENT_H_
+#include "JBig2_Define.h"
+#include "JBig2_SymbolDict.h"
+#include "JBig2_PatternDict.h"
+#include "JBig2_Module.h"
+#include "JBig2_HuffmanTable.h"
+#define JBIG2_GET_INT32(buf) (((buf)[0]<<24) | ((buf)[1]<<16) | ((buf)[2]<<8) | (buf)[3])
+#define JBIG2_GET_INT16(buf) (((buf)[0]<<8) | (buf)[1])
+typedef enum {
+ JBIG2_SEGMENT_HEADER_UNPARSED,
+ JBIG2_SEGMENT_DATA_UNPARSED,
+ JBIG2_SEGMENT_PARSE_COMPLETE,
+ JBIG2_SEGMENT_PAUSED,
+ JBIG2_SEGMENT_ERROR
+} JBig2_SegmentState;
+typedef enum {
+ JBIG2_VOID_POINTER = 0,
+ JBIG2_IMAGE_POINTER,
+ JBIG2_SYMBOL_DICT_POINTER,
+ JBIG2_PATTERN_DICT_POINTER,
+ JBIG2_HUFFMAN_TABLE_POINTER
+} JBig2_ResultType;
+class CJBig2_Segment : public CJBig2_Object
+{
+public:
+
+ CJBig2_Segment();
+
+ ~CJBig2_Segment();
+
+ void init();
+
+ void clean();
+public:
+ FX_DWORD m_dwNumber;
+ union {
+ struct {
+ FX_BYTE type : 6;
+ FX_BYTE page_association_size : 1;
+ FX_BYTE deferred_non_retain : 1;
+ } s;
+ FX_BYTE c;
+ } m_cFlags;
+ FX_INT32 m_nReferred_to_segment_count;
+ FX_DWORD * m_pReferred_to_segment_numbers;
+ FX_DWORD m_dwPage_association;
+ FX_DWORD m_dwData_length;
+
+ FX_DWORD m_dwHeader_Length;
+ FX_BYTE *m_pData;
+ JBig2_SegmentState m_State;
+ JBig2_ResultType m_nResultType;
+ union {
+ CJBig2_SymbolDict *sd;
+ CJBig2_PatternDict *pd;
+ CJBig2_Image *im;
+ CJBig2_HuffmanTable *ht;
+ FX_LPVOID vd;
+ } m_Result;
+};
+#endif
diff --git a/core/src/fxcodec/jbig2/JBig2_SymbolDict.cpp b/core/src/fxcodec/jbig2/JBig2_SymbolDict.cpp
index 8516c045c6..67e54c0cea 100644
--- a/core/src/fxcodec/jbig2/JBig2_SymbolDict.cpp
+++ b/core/src/fxcodec/jbig2/JBig2_SymbolDict.cpp
@@ -1,34 +1,34 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "JBig2_SymbolDict.h"
-CJBig2_SymbolDict::CJBig2_SymbolDict()
-{
- SDNUMEXSYMS = 0;
- SDEXSYMS = NULL;
- m_bContextRetained = FALSE;
- m_gbContext = m_grContext = NULL;
-}
-
-CJBig2_SymbolDict::~CJBig2_SymbolDict()
-{
- if(SDEXSYMS) {
- for(FX_DWORD i = 0; i < SDNUMEXSYMS; i++) {
- if(SDEXSYMS[i]) {
- delete SDEXSYMS[i];
- }
- }
- m_pModule->JBig2_Free(SDEXSYMS);
- }
- if(m_bContextRetained) {
- if(m_gbContext) {
- m_pModule->JBig2_Free(m_gbContext);
- }
- if(m_grContext) {
- m_pModule->JBig2_Free(m_grContext);
- }
- }
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "JBig2_SymbolDict.h"
+CJBig2_SymbolDict::CJBig2_SymbolDict()
+{
+ SDNUMEXSYMS = 0;
+ SDEXSYMS = NULL;
+ m_bContextRetained = FALSE;
+ m_gbContext = m_grContext = NULL;
+}
+
+CJBig2_SymbolDict::~CJBig2_SymbolDict()
+{
+ if(SDEXSYMS) {
+ for(FX_DWORD i = 0; i < SDNUMEXSYMS; i++) {
+ if(SDEXSYMS[i]) {
+ delete SDEXSYMS[i];
+ }
+ }
+ m_pModule->JBig2_Free(SDEXSYMS);
+ }
+ if(m_bContextRetained) {
+ if(m_gbContext) {
+ m_pModule->JBig2_Free(m_gbContext);
+ }
+ if(m_grContext) {
+ m_pModule->JBig2_Free(m_grContext);
+ }
+ }
+}
diff --git a/core/src/fxcodec/jbig2/JBig2_SymbolDict.h b/core/src/fxcodec/jbig2/JBig2_SymbolDict.h
index cb97a167d1..cfe75db4c9 100644
--- a/core/src/fxcodec/jbig2/JBig2_SymbolDict.h
+++ b/core/src/fxcodec/jbig2/JBig2_SymbolDict.h
@@ -1,26 +1,26 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef _JBIG2_SYMBOL_DICT_H_
-#define _JBIG2_SYMBOL_DICT_H_
-#include "JBig2_Define.h"
-#include "JBig2_ArithDecoder.h"
-#include "JBig2_Image.h"
-class CJBig2_SymbolDict : public CJBig2_Object
-{
-public:
-
- CJBig2_SymbolDict();
-
- ~CJBig2_SymbolDict();
-public:
- FX_DWORD SDNUMEXSYMS;
- CJBig2_Image **SDEXSYMS;
- FX_BOOL m_bContextRetained;
- JBig2ArithCtx *m_gbContext,
- *m_grContext;
-};
-#endif
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _JBIG2_SYMBOL_DICT_H_
+#define _JBIG2_SYMBOL_DICT_H_
+#include "JBig2_Define.h"
+#include "JBig2_ArithDecoder.h"
+#include "JBig2_Image.h"
+class CJBig2_SymbolDict : public CJBig2_Object
+{
+public:
+
+ CJBig2_SymbolDict();
+
+ ~CJBig2_SymbolDict();
+public:
+ FX_DWORD SDNUMEXSYMS;
+ CJBig2_Image **SDEXSYMS;
+ FX_BOOL m_bContextRetained;
+ JBig2ArithCtx *m_gbContext,
+ *m_grContext;
+};
+#endif
diff --git a/core/src/fxcodec/lcms2/include/fx_lcms2.h b/core/src/fxcodec/lcms2/include/fx_lcms2.h
index 53038322d3..e6413188d8 100644
--- a/core/src/fxcodec/lcms2/include/fx_lcms2.h
+++ b/core/src/fxcodec/lcms2/include/fx_lcms2.h
@@ -1,10 +1,10 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef _FX_LCMS2_H_
-#define _FX_LCMS2_H_
-#include "../lcms2-2.6/include/lcms2.h"
-#endif
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FX_LCMS2_H_
+#define _FX_LCMS2_H_
+#include "../lcms2-2.6/include/lcms2.h"
+#endif
diff --git a/core/src/fxcodec/lcms2/include/fx_lcms2_plugin.h b/core/src/fxcodec/lcms2/include/fx_lcms2_plugin.h
index 1103b7f698..4ab5775718 100644
--- a/core/src/fxcodec/lcms2/include/fx_lcms2_plugin.h
+++ b/core/src/fxcodec/lcms2/include/fx_lcms2_plugin.h
@@ -1,10 +1,10 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef _FX_LCMS2_H_
-#define _FX_LCMS2_H_
-#include "../lcms2-2.6/include/lcms2_plugin.h"
-#endif
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FX_LCMS2_H_
+#define _FX_LCMS2_H_
+#include "../lcms2-2.6/include/lcms2_plugin.h"
+#endif
diff --git a/core/src/fxcodec/lcms2/lcms2-2.6/src/cmserr.c b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmserr.c
index 745238c6e2..87c6320cff 100644
--- a/core/src/fxcodec/lcms2/lcms2-2.6/src/cmserr.c
+++ b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmserr.c
@@ -260,50 +260,50 @@ cmsBool _cmsRegisterMemHandlerPlugin(cmsContext ContextID, cmsPluginBase* Plugi
}
// Generic allocate
-void* CMSEXPORT _cmsMalloc(cmsContext ContextID, cmsUInt32Number size)
-{
- return FXMEM_DefaultAlloc(size, FXMEM_NONLEAVE);
-}
-
-// Generic allocate & zero
-void* CMSEXPORT _cmsMallocZero(cmsContext ContextID, cmsUInt32Number size)
-{
- void* p = FXMEM_DefaultAlloc(size, FXMEM_NONLEAVE);
- if (p) FXSYS_memset32(p, 0, size);
- return p;
-}
-
-// Generic calloc
-void* CMSEXPORT _cmsCalloc(cmsContext ContextID, cmsUInt32Number num, cmsUInt32Number size)
-{
- cmsUInt32Number total = num * size;
- if (total == 0 || total / size != num || total >= 512 * 1024 * 1024)
- return NULL;
-
- return _cmsMallocZero(ContextID, num * size);
-}
-
-// Generic reallocate
-void* CMSEXPORT _cmsRealloc(cmsContext ContextID, void* Ptr, cmsUInt32Number size)
-{
- return FXMEM_DefaultRealloc(Ptr, size, FXMEM_NONLEAVE);
-}
-
-// Generic free memory
-void CMSEXPORT _cmsFree(cmsContext ContextID, void* Ptr)
-{
- if (Ptr != NULL) FXMEM_DefaultFree(Ptr, 0);
-}
-
-// Generic block duplication
-void* CMSEXPORT _cmsDupMem(cmsContext ContextID, const void* Org, cmsUInt32Number size)
-{
- void* p = FXMEM_DefaultAlloc(size, FXMEM_NONLEAVE);
- FXSYS_memmove32(p, Org, size);
- return p;
-}
-
-_cmsMemPluginChunkType _cmsMemPluginChunk = {_cmsMalloc, _cmsMallocZero, _cmsFree,
+void* CMSEXPORT _cmsMalloc(cmsContext ContextID, cmsUInt32Number size)
+{
+ return FXMEM_DefaultAlloc(size, FXMEM_NONLEAVE);
+}
+
+// Generic allocate & zero
+void* CMSEXPORT _cmsMallocZero(cmsContext ContextID, cmsUInt32Number size)
+{
+ void* p = FXMEM_DefaultAlloc(size, FXMEM_NONLEAVE);
+ if (p) FXSYS_memset32(p, 0, size);
+ return p;
+}
+
+// Generic calloc
+void* CMSEXPORT _cmsCalloc(cmsContext ContextID, cmsUInt32Number num, cmsUInt32Number size)
+{
+ cmsUInt32Number total = num * size;
+ if (total == 0 || total / size != num || total >= 512 * 1024 * 1024)
+ return NULL;
+
+ return _cmsMallocZero(ContextID, num * size);
+}
+
+// Generic reallocate
+void* CMSEXPORT _cmsRealloc(cmsContext ContextID, void* Ptr, cmsUInt32Number size)
+{
+ return FXMEM_DefaultRealloc(Ptr, size, FXMEM_NONLEAVE);
+}
+
+// Generic free memory
+void CMSEXPORT _cmsFree(cmsContext ContextID, void* Ptr)
+{
+ if (Ptr != NULL) FXMEM_DefaultFree(Ptr, 0);
+}
+
+// Generic block duplication
+void* CMSEXPORT _cmsDupMem(cmsContext ContextID, const void* Org, cmsUInt32Number size)
+{
+ void* p = FXMEM_DefaultAlloc(size, FXMEM_NONLEAVE);
+ FXSYS_memmove32(p, Org, size);
+ return p;
+}
+
+_cmsMemPluginChunkType _cmsMemPluginChunk = {_cmsMalloc, _cmsMallocZero, _cmsFree,
_cmsRealloc, _cmsCalloc, _cmsDupMem
};
diff --git a/core/src/fxcodec/lcms2/lcms2-2.6/src/cmsgmt.c b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmsgmt.c
index 09427650c9..1103363a78 100644
--- a/core/src/fxcodec/lcms2/lcms2-2.6/src/cmsgmt.c
+++ b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmsgmt.c
@@ -1,590 +1,590 @@
-//---------------------------------------------------------------------------------
-//
-// Little Color Management System
-// Copyright (c) 1998-2012 Marti Maria Saguer
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the "Software"),
-// to deal in the Software without restriction, including without limitation
-// the rights to use, copy, modify, merge, publish, distribute, sublicense,
-// and/or sell copies of the Software, and to permit persons to whom the Software
-// is furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
-// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-//
-//---------------------------------------------------------------------------------
-//
-
-#include "lcms2_internal.h"
-
-
-// Auxiliar: append a Lab identity after the given sequence of profiles
-// and return the transform. Lab profile is closed, rest of profiles are kept open.
-cmsHTRANSFORM _cmsChain2Lab(cmsContext ContextID,
- cmsUInt32Number nProfiles,
- cmsUInt32Number InputFormat,
- cmsUInt32Number OutputFormat,
- const cmsUInt32Number Intents[],
- const cmsHPROFILE hProfiles[],
- const cmsBool BPC[],
- const cmsFloat64Number AdaptationStates[],
- cmsUInt32Number dwFlags)
-{
- cmsHTRANSFORM xform;
- cmsHPROFILE hLab;
- cmsHPROFILE ProfileList[256];
- cmsBool BPCList[256];
- cmsFloat64Number AdaptationList[256];
- cmsUInt32Number IntentList[256];
- cmsUInt32Number i;
-
- // This is a rather big number and there is no need of dynamic memory
- // since we are adding a profile, 254 + 1 = 255 and this is the limit
- if (nProfiles > 254) return NULL;
-
- // The output space
- hLab = cmsCreateLab4ProfileTHR(ContextID, NULL);
- if (hLab == NULL) return NULL;
-
- // Create a copy of parameters
- for (i=0; i < nProfiles; i++) {
-
- ProfileList[i] = hProfiles[i];
- BPCList[i] = BPC[i];
- AdaptationList[i] = AdaptationStates[i];
- IntentList[i] = Intents[i];
- }
-
- // Place Lab identity at chain's end.
- ProfileList[nProfiles] = hLab;
- BPCList[nProfiles] = 0;
- AdaptationList[nProfiles] = 1.0;
- IntentList[nProfiles] = INTENT_RELATIVE_COLORIMETRIC;
-
- // Create the transform
- xform = cmsCreateExtendedTransform(ContextID, nProfiles + 1, ProfileList,
- BPCList,
- IntentList,
- AdaptationList,
- NULL, 0,
- InputFormat,
- OutputFormat,
- dwFlags);
-
- cmsCloseProfile(hLab);
-
- return xform;
-}
-
-
-// Compute K -> L* relationship. Flags may include black point compensation. In this case,
-// the relationship is assumed from the profile with BPC to a black point zero.
-static
-cmsToneCurve* ComputeKToLstar(cmsContext ContextID,
- cmsUInt32Number nPoints,
- cmsUInt32Number nProfiles,
- const cmsUInt32Number Intents[],
- const cmsHPROFILE hProfiles[],
- const cmsBool BPC[],
- const cmsFloat64Number AdaptationStates[],
- cmsUInt32Number dwFlags)
-{
- cmsToneCurve* out = NULL;
- cmsUInt32Number i;
- cmsHTRANSFORM xform;
- cmsCIELab Lab;
- cmsFloat32Number cmyk[4];
- cmsFloat32Number* SampledPoints;
-
- xform = _cmsChain2Lab(ContextID, nProfiles, TYPE_CMYK_FLT, TYPE_Lab_DBL, Intents, hProfiles, BPC, AdaptationStates, dwFlags);
- if (xform == NULL) return NULL;
-
- SampledPoints = (cmsFloat32Number*) _cmsCalloc(ContextID, nPoints, sizeof(cmsFloat32Number));
- if (SampledPoints == NULL) goto Error;
-
- for (i=0; i < nPoints; i++) {
-
- cmyk[0] = 0;
- cmyk[1] = 0;
- cmyk[2] = 0;
- cmyk[3] = (cmsFloat32Number) ((i * 100.0) / (nPoints-1));
-
- cmsDoTransform(xform, cmyk, &Lab, 1);
- SampledPoints[i]= (cmsFloat32Number) (1.0 - Lab.L / 100.0); // Negate K for easier operation
- }
-
- out = cmsBuildTabulatedToneCurveFloat(ContextID, nPoints, SampledPoints);
-
-Error:
-
- cmsDeleteTransform(xform);
- if (SampledPoints) _cmsFree(ContextID, SampledPoints);
-
- return out;
-}
-
-
-// Compute Black tone curve on a CMYK -> CMYK transform. This is done by
-// using the proof direction on both profiles to find K->L* relationship
-// then joining both curves. dwFlags may include black point compensation.
-cmsToneCurve* _cmsBuildKToneCurve(cmsContext ContextID,
- cmsUInt32Number nPoints,
- cmsUInt32Number nProfiles,
- const cmsUInt32Number Intents[],
- const cmsHPROFILE hProfiles[],
- const cmsBool BPC[],
- const cmsFloat64Number AdaptationStates[],
- cmsUInt32Number dwFlags)
-{
- cmsToneCurve *in, *out, *KTone;
-
- // Make sure CMYK -> CMYK
- if (cmsGetColorSpace(hProfiles[0]) != cmsSigCmykData ||
- cmsGetColorSpace(hProfiles[nProfiles-1])!= cmsSigCmykData) return NULL;
-
-
- // Make sure last is an output profile
- if (cmsGetDeviceClass(hProfiles[nProfiles - 1]) != cmsSigOutputClass) return NULL;
-
- // Create individual curves. BPC works also as each K to L* is
- // computed as a BPC to zero black point in case of L*
- in = ComputeKToLstar(ContextID, nPoints, nProfiles - 1, Intents, hProfiles, BPC, AdaptationStates, dwFlags);
- if (in == NULL) return NULL;
-
- out = ComputeKToLstar(ContextID, nPoints, 1,
- Intents + (nProfiles - 1),
- &hProfiles [nProfiles - 1],
- BPC + (nProfiles - 1),
- AdaptationStates + (nProfiles - 1),
- dwFlags);
- if (out == NULL) {
- cmsFreeToneCurve(in);
- return NULL;
- }
-
- // Build the relationship. This effectively limits the maximum accuracy to 16 bits, but
- // since this is used on black-preserving LUTs, we are not loosing accuracy in any case
- KTone = cmsJoinToneCurve(ContextID, in, out, nPoints);
-
- // Get rid of components
- cmsFreeToneCurve(in); cmsFreeToneCurve(out);
-
- // Something went wrong...
- if (KTone == NULL) return NULL;
-
- // Make sure it is monotonic
- if (!cmsIsToneCurveMonotonic(KTone)) {
- cmsFreeToneCurve(KTone);
- return NULL;
- }
-
- return KTone;
-}
-
-
-// Gamut LUT Creation -----------------------------------------------------------------------------------------
-
-// Used by gamut & softproofing
-
-typedef struct {
-
- cmsHTRANSFORM hInput; // From whatever input color space. 16 bits to DBL
- cmsHTRANSFORM hForward, hReverse; // Transforms going from Lab to colorant and back
- cmsFloat64Number Thereshold; // The thereshold after which is considered out of gamut
-
- } GAMUTCHAIN;
-
-// This sampler does compute gamut boundaries by comparing original
-// values with a transform going back and forth. Values above ERR_THERESHOLD
-// of maximum are considered out of gamut.
-
-#define ERR_THERESHOLD 5
-
-
-static
-int GamutSampler(register const cmsUInt16Number In[], register cmsUInt16Number Out[], register void* Cargo)
-{
- GAMUTCHAIN* t = (GAMUTCHAIN* ) Cargo;
- cmsCIELab LabIn1, LabOut1;
- cmsCIELab LabIn2, LabOut2;
- cmsUInt16Number Proof[cmsMAXCHANNELS], Proof2[cmsMAXCHANNELS];
- cmsFloat64Number dE1, dE2, ErrorRatio;
-
- // Assume in-gamut by default.
- ErrorRatio = 1.0;
-
- // Convert input to Lab
- cmsDoTransform(t -> hInput, In, &LabIn1, 1);
-
- // converts from PCS to colorant. This always
- // does return in-gamut values,
- cmsDoTransform(t -> hForward, &LabIn1, Proof, 1);
-
- // Now, do the inverse, from colorant to PCS.
- cmsDoTransform(t -> hReverse, Proof, &LabOut1, 1);
-
- memmove(&LabIn2, &LabOut1, sizeof(cmsCIELab));
-
- // Try again, but this time taking Check as input
- cmsDoTransform(t -> hForward, &LabOut1, Proof2, 1);
- cmsDoTransform(t -> hReverse, Proof2, &LabOut2, 1);
-
- // Take difference of direct value
- dE1 = cmsDeltaE(&LabIn1, &LabOut1);
-
- // Take difference of converted value
- dE2 = cmsDeltaE(&LabIn2, &LabOut2);
-
-
- // if dE1 is small and dE2 is small, value is likely to be in gamut
- if (dE1 < t->Thereshold && dE2 < t->Thereshold)
- Out[0] = 0;
- else {
-
- // if dE1 is small and dE2 is big, undefined. Assume in gamut
- if (dE1 < t->Thereshold && dE2 > t->Thereshold)
- Out[0] = 0;
- else
- // dE1 is big and dE2 is small, clearly out of gamut
- if (dE1 > t->Thereshold && dE2 < t->Thereshold)
- Out[0] = (cmsUInt16Number) _cmsQuickFloor((dE1 - t->Thereshold) + .5);
- else {
-
- // dE1 is big and dE2 is also big, could be due to perceptual mapping
- // so take error ratio
- if (dE2 == 0.0)
- ErrorRatio = dE1;
- else
- ErrorRatio = dE1 / dE2;
-
- if (ErrorRatio > t->Thereshold)
- Out[0] = (cmsUInt16Number) _cmsQuickFloor((ErrorRatio - t->Thereshold) + .5);
- else
- Out[0] = 0;
- }
- }
-
-
- return TRUE;
-}
-
-// Does compute a gamut LUT going back and forth across pcs -> relativ. colorimetric intent -> pcs
-// the dE obtained is then annotated on the LUT. Values truely out of gamut are clipped to dE = 0xFFFE
-// and values changed are supposed to be handled by any gamut remapping, so, are out of gamut as well.
-//
-// **WARNING: This algorithm does assume that gamut remapping algorithms does NOT move in-gamut colors,
-// of course, many perceptual and saturation intents does not work in such way, but relativ. ones should.
-
-cmsPipeline* _cmsCreateGamutCheckPipeline(cmsContext ContextID,
- cmsHPROFILE hProfiles[],
- cmsBool BPC[],
- cmsUInt32Number Intents[],
- cmsFloat64Number AdaptationStates[],
- cmsUInt32Number nGamutPCSposition,
- cmsHPROFILE hGamut)
-{
- cmsHPROFILE hLab;
- cmsPipeline* Gamut;
- cmsStage* CLUT;
- cmsUInt32Number dwFormat;
- GAMUTCHAIN Chain;
- int nChannels, nGridpoints;
- cmsColorSpaceSignature ColorSpace;
- cmsUInt32Number i;
- cmsHPROFILE ProfileList[256];
- cmsBool BPCList[256];
- cmsFloat64Number AdaptationList[256];
- cmsUInt32Number IntentList[256];
-
- memset(&Chain, 0, sizeof(GAMUTCHAIN));
-
-
- if (nGamutPCSposition <= 0 || nGamutPCSposition > 255) {
- cmsSignalError(ContextID, cmsERROR_RANGE, "Wrong position of PCS. 1..255 expected, %d found.", nGamutPCSposition);
- return NULL;
- }
-
- hLab = cmsCreateLab4ProfileTHR(ContextID, NULL);
- if (hLab == NULL) return NULL;
-
-
- // The figure of merit. On matrix-shaper profiles, should be almost zero as
- // the conversion is pretty exact. On LUT based profiles, different resolutions
- // of input and output CLUT may result in differences.
-
- if (cmsIsMatrixShaper(hGamut)) {
-
- Chain.Thereshold = 1.0;
- }
- else {
- Chain.Thereshold = ERR_THERESHOLD;
- }
-
-
- // Create a copy of parameters
- for (i=0; i < nGamutPCSposition; i++) {
- ProfileList[i] = hProfiles[i];
- BPCList[i] = BPC[i];
- AdaptationList[i] = AdaptationStates[i];
- IntentList[i] = Intents[i];
- }
-
- // Fill Lab identity
- ProfileList[nGamutPCSposition] = hLab;
- BPCList[nGamutPCSposition] = 0;
- AdaptationList[nGamutPCSposition] = 1.0;
- IntentList[nGamutPCSposition] = INTENT_RELATIVE_COLORIMETRIC;
-
-
- ColorSpace = cmsGetColorSpace(hGamut);
-
- nChannels = cmsChannelsOf(ColorSpace);
- nGridpoints = _cmsReasonableGridpointsByColorspace(ColorSpace, cmsFLAGS_HIGHRESPRECALC);
- dwFormat = (CHANNELS_SH(nChannels)|BYTES_SH(2));
-
- // 16 bits to Lab double
- Chain.hInput = cmsCreateExtendedTransform(ContextID,
- nGamutPCSposition + 1,
- ProfileList,
- BPCList,
- IntentList,
- AdaptationList,
- NULL, 0,
- dwFormat, TYPE_Lab_DBL,
- cmsFLAGS_NOCACHE);
-
-
- // Does create the forward step. Lab double to device
- dwFormat = (CHANNELS_SH(nChannels)|BYTES_SH(2));
- Chain.hForward = cmsCreateTransformTHR(ContextID,
- hLab, TYPE_Lab_DBL,
- hGamut, dwFormat,
- INTENT_RELATIVE_COLORIMETRIC,
- cmsFLAGS_NOCACHE);
-
- // Does create the backwards step
- Chain.hReverse = cmsCreateTransformTHR(ContextID, hGamut, dwFormat,
- hLab, TYPE_Lab_DBL,
- INTENT_RELATIVE_COLORIMETRIC,
- cmsFLAGS_NOCACHE);
-
-
- // All ok?
- if (Chain.hInput && Chain.hForward && Chain.hReverse) {
-
- // Go on, try to compute gamut LUT from PCS. This consist on a single channel containing
- // dE when doing a transform back and forth on the colorimetric intent.
-
- Gamut = cmsPipelineAlloc(ContextID, 3, 1);
- if (Gamut != NULL) {
-
- CLUT = cmsStageAllocCLut16bit(ContextID, nGridpoints, nChannels, 1, NULL);
- if (!cmsPipelineInsertStage(Gamut, cmsAT_BEGIN, CLUT)) {
- cmsPipelineFree(Gamut);
- Gamut = NULL;
- }
- else {
- cmsStageSampleCLut16bit(CLUT, GamutSampler, (void*) &Chain, 0);
- }
- }
- }
- else
- Gamut = NULL; // Didn't work...
-
- // Free all needed stuff.
- if (Chain.hInput) cmsDeleteTransform(Chain.hInput);
- if (Chain.hForward) cmsDeleteTransform(Chain.hForward);
- if (Chain.hReverse) cmsDeleteTransform(Chain.hReverse);
- if (hLab) cmsCloseProfile(hLab);
-
- // And return computed hull
- return Gamut;
-}
-
-// Total Area Coverage estimation ----------------------------------------------------------------
-
-typedef struct {
- cmsUInt32Number nOutputChans;
- cmsHTRANSFORM hRoundTrip;
- cmsFloat32Number MaxTAC;
- cmsFloat32Number MaxInput[cmsMAXCHANNELS];
-
-} cmsTACestimator;
-
-
-// This callback just accounts the maximum ink dropped in the given node. It does not populate any
-// memory, as the destination table is NULL. Its only purpose it to know the global maximum.
-static
-int EstimateTAC(register const cmsUInt16Number In[], register cmsUInt16Number Out[], register void * Cargo)
-{
- cmsTACestimator* bp = (cmsTACestimator*) Cargo;
- cmsFloat32Number RoundTrip[cmsMAXCHANNELS];
- cmsUInt32Number i;
- cmsFloat32Number Sum;
-
-
- // Evaluate the xform
- cmsDoTransform(bp->hRoundTrip, In, RoundTrip, 1);
-
- // All all amounts of ink
- for (Sum=0, i=0; i < bp ->nOutputChans; i++)
- Sum += RoundTrip[i];
-
- // If above maximum, keep track of input values
- if (Sum > bp ->MaxTAC) {
-
- bp ->MaxTAC = Sum;
-
- for (i=0; i < bp ->nOutputChans; i++) {
- bp ->MaxInput[i] = In[i];
- }
- }
-
- return TRUE;
-
- cmsUNUSED_PARAMETER(Out);
-}
-
-
-// Detect Total area coverage of the profile
-cmsFloat64Number CMSEXPORT cmsDetectTAC(cmsHPROFILE hProfile)
-{
- cmsTACestimator bp;
- cmsUInt32Number dwFormatter;
- cmsUInt32Number GridPoints[MAX_INPUT_DIMENSIONS];
- cmsHPROFILE hLab;
- cmsContext ContextID = cmsGetProfileContextID(hProfile);
-
- // TAC only works on output profiles
- if (cmsGetDeviceClass(hProfile) != cmsSigOutputClass) {
- return 0;
- }
-
- // Create a fake formatter for result
- dwFormatter = cmsFormatterForColorspaceOfProfile(hProfile, 4, TRUE);
-
- bp.nOutputChans = T_CHANNELS(dwFormatter);
- bp.MaxTAC = 0; // Initial TAC is 0
-
- // for safety
- if (bp.nOutputChans >= cmsMAXCHANNELS) return 0;
-
- hLab = cmsCreateLab4ProfileTHR(ContextID, NULL);
- if (hLab == NULL) return 0;
- // Setup a roundtrip on perceptual intent in output profile for TAC estimation
- bp.hRoundTrip = cmsCreateTransformTHR(ContextID, hLab, TYPE_Lab_16,
- hProfile, dwFormatter, INTENT_PERCEPTUAL, cmsFLAGS_NOOPTIMIZE|cmsFLAGS_NOCACHE);
-
- cmsCloseProfile(hLab);
- if (bp.hRoundTrip == NULL) return 0;
-
- // For L* we only need black and white. For C* we need many points
- GridPoints[0] = 6;
- GridPoints[1] = 74;
- GridPoints[2] = 74;
-
-
- if (!cmsSliceSpace16(3, GridPoints, EstimateTAC, &bp)) {
- bp.MaxTAC = 0;
- }
-
- cmsDeleteTransform(bp.hRoundTrip);
-
- // Results in %
- return bp.MaxTAC;
-}
-
-
-// Carefully, clamp on CIELab space.
-
-cmsBool CMSEXPORT cmsDesaturateLab(cmsCIELab* Lab,
- double amax, double amin,
- double bmax, double bmin)
-{
-
- // Whole Luma surface to zero
-
- if (Lab -> L < 0) {
-
- Lab-> L = Lab->a = Lab-> b = 0.0;
- return FALSE;
- }
-
- // Clamp white, DISCARD HIGHLIGHTS. This is done
- // in such way because icc spec doesn't allow the
- // use of L>100 as a highlight means.
-
- if (Lab->L > 100)
- Lab -> L = 100;
-
- // Check out gamut prism, on a, b faces
-
- if (Lab -> a < amin || Lab->a > amax||
- Lab -> b < bmin || Lab->b > bmax) {
-
- cmsCIELCh LCh;
- double h, slope;
-
- // Falls outside a, b limits. Transports to LCh space,
- // and then do the clipping
-
-
- if (Lab -> a == 0.0) { // Is hue exactly 90?
-
- // atan will not work, so clamp here
- Lab -> b = Lab->b < 0 ? bmin : bmax;
- return TRUE;
- }
-
- cmsLab2LCh(&LCh, Lab);
-
- slope = Lab -> b / Lab -> a;
- h = LCh.h;
-
- // There are 4 zones
-
- if ((h >= 0. && h < 45.) ||
- (h >= 315 && h <= 360.)) {
-
- // clip by amax
- Lab -> a = amax;
- Lab -> b = amax * slope;
- }
- else
- if (h >= 45. && h < 135.)
- {
- // clip by bmax
- Lab -> b = bmax;
- Lab -> a = bmax / slope;
- }
- else
- if (h >= 135. && h < 225.) {
- // clip by amin
- Lab -> a = amin;
- Lab -> b = amin * slope;
-
- }
- else
- if (h >= 225. && h < 315.) {
- // clip by bmin
- Lab -> b = bmin;
- Lab -> a = bmin / slope;
- }
- else {
- cmsSignalError(0, cmsERROR_RANGE, "Invalid angle");
- return FALSE;
- }
-
- }
-
- return TRUE;
-}
+//---------------------------------------------------------------------------------
+//
+// Little Color Management System
+// Copyright (c) 1998-2012 Marti Maria Saguer
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the Software
+// is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+//---------------------------------------------------------------------------------
+//
+
+#include "lcms2_internal.h"
+
+
+// Auxiliar: append a Lab identity after the given sequence of profiles
+// and return the transform. Lab profile is closed, rest of profiles are kept open.
+cmsHTRANSFORM _cmsChain2Lab(cmsContext ContextID,
+ cmsUInt32Number nProfiles,
+ cmsUInt32Number InputFormat,
+ cmsUInt32Number OutputFormat,
+ const cmsUInt32Number Intents[],
+ const cmsHPROFILE hProfiles[],
+ const cmsBool BPC[],
+ const cmsFloat64Number AdaptationStates[],
+ cmsUInt32Number dwFlags)
+{
+ cmsHTRANSFORM xform;
+ cmsHPROFILE hLab;
+ cmsHPROFILE ProfileList[256];
+ cmsBool BPCList[256];
+ cmsFloat64Number AdaptationList[256];
+ cmsUInt32Number IntentList[256];
+ cmsUInt32Number i;
+
+ // This is a rather big number and there is no need of dynamic memory
+ // since we are adding a profile, 254 + 1 = 255 and this is the limit
+ if (nProfiles > 254) return NULL;
+
+ // The output space
+ hLab = cmsCreateLab4ProfileTHR(ContextID, NULL);
+ if (hLab == NULL) return NULL;
+
+ // Create a copy of parameters
+ for (i=0; i < nProfiles; i++) {
+
+ ProfileList[i] = hProfiles[i];
+ BPCList[i] = BPC[i];
+ AdaptationList[i] = AdaptationStates[i];
+ IntentList[i] = Intents[i];
+ }
+
+ // Place Lab identity at chain's end.
+ ProfileList[nProfiles] = hLab;
+ BPCList[nProfiles] = 0;
+ AdaptationList[nProfiles] = 1.0;
+ IntentList[nProfiles] = INTENT_RELATIVE_COLORIMETRIC;
+
+ // Create the transform
+ xform = cmsCreateExtendedTransform(ContextID, nProfiles + 1, ProfileList,
+ BPCList,
+ IntentList,
+ AdaptationList,
+ NULL, 0,
+ InputFormat,
+ OutputFormat,
+ dwFlags);
+
+ cmsCloseProfile(hLab);
+
+ return xform;
+}
+
+
+// Compute K -> L* relationship. Flags may include black point compensation. In this case,
+// the relationship is assumed from the profile with BPC to a black point zero.
+static
+cmsToneCurve* ComputeKToLstar(cmsContext ContextID,
+ cmsUInt32Number nPoints,
+ cmsUInt32Number nProfiles,
+ const cmsUInt32Number Intents[],
+ const cmsHPROFILE hProfiles[],
+ const cmsBool BPC[],
+ const cmsFloat64Number AdaptationStates[],
+ cmsUInt32Number dwFlags)
+{
+ cmsToneCurve* out = NULL;
+ cmsUInt32Number i;
+ cmsHTRANSFORM xform;
+ cmsCIELab Lab;
+ cmsFloat32Number cmyk[4];
+ cmsFloat32Number* SampledPoints;
+
+ xform = _cmsChain2Lab(ContextID, nProfiles, TYPE_CMYK_FLT, TYPE_Lab_DBL, Intents, hProfiles, BPC, AdaptationStates, dwFlags);
+ if (xform == NULL) return NULL;
+
+ SampledPoints = (cmsFloat32Number*) _cmsCalloc(ContextID, nPoints, sizeof(cmsFloat32Number));
+ if (SampledPoints == NULL) goto Error;
+
+ for (i=0; i < nPoints; i++) {
+
+ cmyk[0] = 0;
+ cmyk[1] = 0;
+ cmyk[2] = 0;
+ cmyk[3] = (cmsFloat32Number) ((i * 100.0) / (nPoints-1));
+
+ cmsDoTransform(xform, cmyk, &Lab, 1);
+ SampledPoints[i]= (cmsFloat32Number) (1.0 - Lab.L / 100.0); // Negate K for easier operation
+ }
+
+ out = cmsBuildTabulatedToneCurveFloat(ContextID, nPoints, SampledPoints);
+
+Error:
+
+ cmsDeleteTransform(xform);
+ if (SampledPoints) _cmsFree(ContextID, SampledPoints);
+
+ return out;
+}
+
+
+// Compute Black tone curve on a CMYK -> CMYK transform. This is done by
+// using the proof direction on both profiles to find K->L* relationship
+// then joining both curves. dwFlags may include black point compensation.
+cmsToneCurve* _cmsBuildKToneCurve(cmsContext ContextID,
+ cmsUInt32Number nPoints,
+ cmsUInt32Number nProfiles,
+ const cmsUInt32Number Intents[],
+ const cmsHPROFILE hProfiles[],
+ const cmsBool BPC[],
+ const cmsFloat64Number AdaptationStates[],
+ cmsUInt32Number dwFlags)
+{
+ cmsToneCurve *in, *out, *KTone;
+
+ // Make sure CMYK -> CMYK
+ if (cmsGetColorSpace(hProfiles[0]) != cmsSigCmykData ||
+ cmsGetColorSpace(hProfiles[nProfiles-1])!= cmsSigCmykData) return NULL;
+
+
+ // Make sure last is an output profile
+ if (cmsGetDeviceClass(hProfiles[nProfiles - 1]) != cmsSigOutputClass) return NULL;
+
+ // Create individual curves. BPC works also as each K to L* is
+ // computed as a BPC to zero black point in case of L*
+ in = ComputeKToLstar(ContextID, nPoints, nProfiles - 1, Intents, hProfiles, BPC, AdaptationStates, dwFlags);
+ if (in == NULL) return NULL;
+
+ out = ComputeKToLstar(ContextID, nPoints, 1,
+ Intents + (nProfiles - 1),
+ &hProfiles [nProfiles - 1],
+ BPC + (nProfiles - 1),
+ AdaptationStates + (nProfiles - 1),
+ dwFlags);
+ if (out == NULL) {
+ cmsFreeToneCurve(in);
+ return NULL;
+ }
+
+ // Build the relationship. This effectively limits the maximum accuracy to 16 bits, but
+ // since this is used on black-preserving LUTs, we are not loosing accuracy in any case
+ KTone = cmsJoinToneCurve(ContextID, in, out, nPoints);
+
+ // Get rid of components
+ cmsFreeToneCurve(in); cmsFreeToneCurve(out);
+
+ // Something went wrong...
+ if (KTone == NULL) return NULL;
+
+ // Make sure it is monotonic
+ if (!cmsIsToneCurveMonotonic(KTone)) {
+ cmsFreeToneCurve(KTone);
+ return NULL;
+ }
+
+ return KTone;
+}
+
+
+// Gamut LUT Creation -----------------------------------------------------------------------------------------
+
+// Used by gamut & softproofing
+
+typedef struct {
+
+ cmsHTRANSFORM hInput; // From whatever input color space. 16 bits to DBL
+ cmsHTRANSFORM hForward, hReverse; // Transforms going from Lab to colorant and back
+ cmsFloat64Number Thereshold; // The thereshold after which is considered out of gamut
+
+ } GAMUTCHAIN;
+
+// This sampler does compute gamut boundaries by comparing original
+// values with a transform going back and forth. Values above ERR_THERESHOLD
+// of maximum are considered out of gamut.
+
+#define ERR_THERESHOLD 5
+
+
+static
+int GamutSampler(register const cmsUInt16Number In[], register cmsUInt16Number Out[], register void* Cargo)
+{
+ GAMUTCHAIN* t = (GAMUTCHAIN* ) Cargo;
+ cmsCIELab LabIn1, LabOut1;
+ cmsCIELab LabIn2, LabOut2;
+ cmsUInt16Number Proof[cmsMAXCHANNELS], Proof2[cmsMAXCHANNELS];
+ cmsFloat64Number dE1, dE2, ErrorRatio;
+
+ // Assume in-gamut by default.
+ ErrorRatio = 1.0;
+
+ // Convert input to Lab
+ cmsDoTransform(t -> hInput, In, &LabIn1, 1);
+
+ // converts from PCS to colorant. This always
+ // does return in-gamut values,
+ cmsDoTransform(t -> hForward, &LabIn1, Proof, 1);
+
+ // Now, do the inverse, from colorant to PCS.
+ cmsDoTransform(t -> hReverse, Proof, &LabOut1, 1);
+
+ memmove(&LabIn2, &LabOut1, sizeof(cmsCIELab));
+
+ // Try again, but this time taking Check as input
+ cmsDoTransform(t -> hForward, &LabOut1, Proof2, 1);
+ cmsDoTransform(t -> hReverse, Proof2, &LabOut2, 1);
+
+ // Take difference of direct value
+ dE1 = cmsDeltaE(&LabIn1, &LabOut1);
+
+ // Take difference of converted value
+ dE2 = cmsDeltaE(&LabIn2, &LabOut2);
+
+
+ // if dE1 is small and dE2 is small, value is likely to be in gamut
+ if (dE1 < t->Thereshold && dE2 < t->Thereshold)
+ Out[0] = 0;
+ else {
+
+ // if dE1 is small and dE2 is big, undefined. Assume in gamut
+ if (dE1 < t->Thereshold && dE2 > t->Thereshold)
+ Out[0] = 0;
+ else
+ // dE1 is big and dE2 is small, clearly out of gamut
+ if (dE1 > t->Thereshold && dE2 < t->Thereshold)
+ Out[0] = (cmsUInt16Number) _cmsQuickFloor((dE1 - t->Thereshold) + .5);
+ else {
+
+ // dE1 is big and dE2 is also big, could be due to perceptual mapping
+ // so take error ratio
+ if (dE2 == 0.0)
+ ErrorRatio = dE1;
+ else
+ ErrorRatio = dE1 / dE2;
+
+ if (ErrorRatio > t->Thereshold)
+ Out[0] = (cmsUInt16Number) _cmsQuickFloor((ErrorRatio - t->Thereshold) + .5);
+ else
+ Out[0] = 0;
+ }
+ }
+
+
+ return TRUE;
+}
+
+// Does compute a gamut LUT going back and forth across pcs -> relativ. colorimetric intent -> pcs
+// the dE obtained is then annotated on the LUT. Values truely out of gamut are clipped to dE = 0xFFFE
+// and values changed are supposed to be handled by any gamut remapping, so, are out of gamut as well.
+//
+// **WARNING: This algorithm does assume that gamut remapping algorithms does NOT move in-gamut colors,
+// of course, many perceptual and saturation intents does not work in such way, but relativ. ones should.
+
+cmsPipeline* _cmsCreateGamutCheckPipeline(cmsContext ContextID,
+ cmsHPROFILE hProfiles[],
+ cmsBool BPC[],
+ cmsUInt32Number Intents[],
+ cmsFloat64Number AdaptationStates[],
+ cmsUInt32Number nGamutPCSposition,
+ cmsHPROFILE hGamut)
+{
+ cmsHPROFILE hLab;
+ cmsPipeline* Gamut;
+ cmsStage* CLUT;
+ cmsUInt32Number dwFormat;
+ GAMUTCHAIN Chain;
+ int nChannels, nGridpoints;
+ cmsColorSpaceSignature ColorSpace;
+ cmsUInt32Number i;
+ cmsHPROFILE ProfileList[256];
+ cmsBool BPCList[256];
+ cmsFloat64Number AdaptationList[256];
+ cmsUInt32Number IntentList[256];
+
+ memset(&Chain, 0, sizeof(GAMUTCHAIN));
+
+
+ if (nGamutPCSposition <= 0 || nGamutPCSposition > 255) {
+ cmsSignalError(ContextID, cmsERROR_RANGE, "Wrong position of PCS. 1..255 expected, %d found.", nGamutPCSposition);
+ return NULL;
+ }
+
+ hLab = cmsCreateLab4ProfileTHR(ContextID, NULL);
+ if (hLab == NULL) return NULL;
+
+
+ // The figure of merit. On matrix-shaper profiles, should be almost zero as
+ // the conversion is pretty exact. On LUT based profiles, different resolutions
+ // of input and output CLUT may result in differences.
+
+ if (cmsIsMatrixShaper(hGamut)) {
+
+ Chain.Thereshold = 1.0;
+ }
+ else {
+ Chain.Thereshold = ERR_THERESHOLD;
+ }
+
+
+ // Create a copy of parameters
+ for (i=0; i < nGamutPCSposition; i++) {
+ ProfileList[i] = hProfiles[i];
+ BPCList[i] = BPC[i];
+ AdaptationList[i] = AdaptationStates[i];
+ IntentList[i] = Intents[i];
+ }
+
+ // Fill Lab identity
+ ProfileList[nGamutPCSposition] = hLab;
+ BPCList[nGamutPCSposition] = 0;
+ AdaptationList[nGamutPCSposition] = 1.0;
+ IntentList[nGamutPCSposition] = INTENT_RELATIVE_COLORIMETRIC;
+
+
+ ColorSpace = cmsGetColorSpace(hGamut);
+
+ nChannels = cmsChannelsOf(ColorSpace);
+ nGridpoints = _cmsReasonableGridpointsByColorspace(ColorSpace, cmsFLAGS_HIGHRESPRECALC);
+ dwFormat = (CHANNELS_SH(nChannels)|BYTES_SH(2));
+
+ // 16 bits to Lab double
+ Chain.hInput = cmsCreateExtendedTransform(ContextID,
+ nGamutPCSposition + 1,
+ ProfileList,
+ BPCList,
+ IntentList,
+ AdaptationList,
+ NULL, 0,
+ dwFormat, TYPE_Lab_DBL,
+ cmsFLAGS_NOCACHE);
+
+
+ // Does create the forward step. Lab double to device
+ dwFormat = (CHANNELS_SH(nChannels)|BYTES_SH(2));
+ Chain.hForward = cmsCreateTransformTHR(ContextID,
+ hLab, TYPE_Lab_DBL,
+ hGamut, dwFormat,
+ INTENT_RELATIVE_COLORIMETRIC,
+ cmsFLAGS_NOCACHE);
+
+ // Does create the backwards step
+ Chain.hReverse = cmsCreateTransformTHR(ContextID, hGamut, dwFormat,
+ hLab, TYPE_Lab_DBL,
+ INTENT_RELATIVE_COLORIMETRIC,
+ cmsFLAGS_NOCACHE);
+
+
+ // All ok?
+ if (Chain.hInput && Chain.hForward && Chain.hReverse) {
+
+ // Go on, try to compute gamut LUT from PCS. This consist on a single channel containing
+ // dE when doing a transform back and forth on the colorimetric intent.
+
+ Gamut = cmsPipelineAlloc(ContextID, 3, 1);
+ if (Gamut != NULL) {
+
+ CLUT = cmsStageAllocCLut16bit(ContextID, nGridpoints, nChannels, 1, NULL);
+ if (!cmsPipelineInsertStage(Gamut, cmsAT_BEGIN, CLUT)) {
+ cmsPipelineFree(Gamut);
+ Gamut = NULL;
+ }
+ else {
+ cmsStageSampleCLut16bit(CLUT, GamutSampler, (void*) &Chain, 0);
+ }
+ }
+ }
+ else
+ Gamut = NULL; // Didn't work...
+
+ // Free all needed stuff.
+ if (Chain.hInput) cmsDeleteTransform(Chain.hInput);
+ if (Chain.hForward) cmsDeleteTransform(Chain.hForward);
+ if (Chain.hReverse) cmsDeleteTransform(Chain.hReverse);
+ if (hLab) cmsCloseProfile(hLab);
+
+ // And return computed hull
+ return Gamut;
+}
+
+// Total Area Coverage estimation ----------------------------------------------------------------
+
+typedef struct {
+ cmsUInt32Number nOutputChans;
+ cmsHTRANSFORM hRoundTrip;
+ cmsFloat32Number MaxTAC;
+ cmsFloat32Number MaxInput[cmsMAXCHANNELS];
+
+} cmsTACestimator;
+
+
+// This callback just accounts the maximum ink dropped in the given node. It does not populate any
+// memory, as the destination table is NULL. Its only purpose it to know the global maximum.
+static
+int EstimateTAC(register const cmsUInt16Number In[], register cmsUInt16Number Out[], register void * Cargo)
+{
+ cmsTACestimator* bp = (cmsTACestimator*) Cargo;
+ cmsFloat32Number RoundTrip[cmsMAXCHANNELS];
+ cmsUInt32Number i;
+ cmsFloat32Number Sum;
+
+
+ // Evaluate the xform
+ cmsDoTransform(bp->hRoundTrip, In, RoundTrip, 1);
+
+ // All all amounts of ink
+ for (Sum=0, i=0; i < bp ->nOutputChans; i++)
+ Sum += RoundTrip[i];
+
+ // If above maximum, keep track of input values
+ if (Sum > bp ->MaxTAC) {
+
+ bp ->MaxTAC = Sum;
+
+ for (i=0; i < bp ->nOutputChans; i++) {
+ bp ->MaxInput[i] = In[i];
+ }
+ }
+
+ return TRUE;
+
+ cmsUNUSED_PARAMETER(Out);
+}
+
+
+// Detect Total area coverage of the profile
+cmsFloat64Number CMSEXPORT cmsDetectTAC(cmsHPROFILE hProfile)
+{
+ cmsTACestimator bp;
+ cmsUInt32Number dwFormatter;
+ cmsUInt32Number GridPoints[MAX_INPUT_DIMENSIONS];
+ cmsHPROFILE hLab;
+ cmsContext ContextID = cmsGetProfileContextID(hProfile);
+
+ // TAC only works on output profiles
+ if (cmsGetDeviceClass(hProfile) != cmsSigOutputClass) {
+ return 0;
+ }
+
+ // Create a fake formatter for result
+ dwFormatter = cmsFormatterForColorspaceOfProfile(hProfile, 4, TRUE);
+
+ bp.nOutputChans = T_CHANNELS(dwFormatter);
+ bp.MaxTAC = 0; // Initial TAC is 0
+
+ // for safety
+ if (bp.nOutputChans >= cmsMAXCHANNELS) return 0;
+
+ hLab = cmsCreateLab4ProfileTHR(ContextID, NULL);
+ if (hLab == NULL) return 0;
+ // Setup a roundtrip on perceptual intent in output profile for TAC estimation
+ bp.hRoundTrip = cmsCreateTransformTHR(ContextID, hLab, TYPE_Lab_16,
+ hProfile, dwFormatter, INTENT_PERCEPTUAL, cmsFLAGS_NOOPTIMIZE|cmsFLAGS_NOCACHE);
+
+ cmsCloseProfile(hLab);
+ if (bp.hRoundTrip == NULL) return 0;
+
+ // For L* we only need black and white. For C* we need many points
+ GridPoints[0] = 6;
+ GridPoints[1] = 74;
+ GridPoints[2] = 74;
+
+
+ if (!cmsSliceSpace16(3, GridPoints, EstimateTAC, &bp)) {
+ bp.MaxTAC = 0;
+ }
+
+ cmsDeleteTransform(bp.hRoundTrip);
+
+ // Results in %
+ return bp.MaxTAC;
+}
+
+
+// Carefully, clamp on CIELab space.
+
+cmsBool CMSEXPORT cmsDesaturateLab(cmsCIELab* Lab,
+ double amax, double amin,
+ double bmax, double bmin)
+{
+
+ // Whole Luma surface to zero
+
+ if (Lab -> L < 0) {
+
+ Lab-> L = Lab->a = Lab-> b = 0.0;
+ return FALSE;
+ }
+
+ // Clamp white, DISCARD HIGHLIGHTS. This is done
+ // in such way because icc spec doesn't allow the
+ // use of L>100 as a highlight means.
+
+ if (Lab->L > 100)
+ Lab -> L = 100;
+
+ // Check out gamut prism, on a, b faces
+
+ if (Lab -> a < amin || Lab->a > amax||
+ Lab -> b < bmin || Lab->b > bmax) {
+
+ cmsCIELCh LCh;
+ double h, slope;
+
+ // Falls outside a, b limits. Transports to LCh space,
+ // and then do the clipping
+
+
+ if (Lab -> a == 0.0) { // Is hue exactly 90?
+
+ // atan will not work, so clamp here
+ Lab -> b = Lab->b < 0 ? bmin : bmax;
+ return TRUE;
+ }
+
+ cmsLab2LCh(&LCh, Lab);
+
+ slope = Lab -> b / Lab -> a;
+ h = LCh.h;
+
+ // There are 4 zones
+
+ if ((h >= 0. && h < 45.) ||
+ (h >= 315 && h <= 360.)) {
+
+ // clip by amax
+ Lab -> a = amax;
+ Lab -> b = amax * slope;
+ }
+ else
+ if (h >= 45. && h < 135.)
+ {
+ // clip by bmax
+ Lab -> b = bmax;
+ Lab -> a = bmax / slope;
+ }
+ else
+ if (h >= 135. && h < 225.) {
+ // clip by amin
+ Lab -> a = amin;
+ Lab -> b = amin * slope;
+
+ }
+ else
+ if (h >= 225. && h < 315.) {
+ // clip by bmin
+ Lab -> b = bmin;
+ Lab -> a = bmin / slope;
+ }
+ else {
+ cmsSignalError(0, cmsERROR_RANGE, "Invalid angle");
+ return FALSE;
+ }
+
+ }
+
+ return TRUE;
+}
diff --git a/core/src/fxcodec/lcms2/src/fx_cmscam02.c b/core/src/fxcodec/lcms2/src/fx_cmscam02.c
index 05584aa8f8..3268424870 100644
--- a/core/src/fxcodec/lcms2/src/fx_cmscam02.c
+++ b/core/src/fxcodec/lcms2/src/fx_cmscam02.c
@@ -1,7 +1,7 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../lcms2-2.6/src/cmscam02.c"
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../lcms2-2.6/src/cmscam02.c"
diff --git a/core/src/fxcodec/lcms2/src/fx_cmscgats.c b/core/src/fxcodec/lcms2/src/fx_cmscgats.c
index 80dcba7830..9e00fe6c3e 100644
--- a/core/src/fxcodec/lcms2/src/fx_cmscgats.c
+++ b/core/src/fxcodec/lcms2/src/fx_cmscgats.c
@@ -1,7 +1,7 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../lcms2-2.6/src/cmscgats.c"
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../lcms2-2.6/src/cmscgats.c"
diff --git a/core/src/fxcodec/lcms2/src/fx_cmscnvrt.c b/core/src/fxcodec/lcms2/src/fx_cmscnvrt.c
index 9b8a292f7b..9b9eb99c70 100644
--- a/core/src/fxcodec/lcms2/src/fx_cmscnvrt.c
+++ b/core/src/fxcodec/lcms2/src/fx_cmscnvrt.c
@@ -1,7 +1,7 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../lcms2-2.6/src/cmscnvrt.c"
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../lcms2-2.6/src/cmscnvrt.c"
diff --git a/core/src/fxcodec/lcms2/src/fx_cmserr.c b/core/src/fxcodec/lcms2/src/fx_cmserr.c
index 6929e7b34c..27d0696c85 100644
--- a/core/src/fxcodec/lcms2/src/fx_cmserr.c
+++ b/core/src/fxcodec/lcms2/src/fx_cmserr.c
@@ -1,7 +1,7 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../lcms2-2.6/src/cmserr.c"
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../lcms2-2.6/src/cmserr.c"
diff --git a/core/src/fxcodec/lcms2/src/fx_cmsgamma.c b/core/src/fxcodec/lcms2/src/fx_cmsgamma.c
index f5bb690220..9936c62b0f 100644
--- a/core/src/fxcodec/lcms2/src/fx_cmsgamma.c
+++ b/core/src/fxcodec/lcms2/src/fx_cmsgamma.c
@@ -1,7 +1,7 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../lcms2-2.6/src/cmsgamma.c"
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../lcms2-2.6/src/cmsgamma.c"
diff --git a/core/src/fxcodec/lcms2/src/fx_cmsgmt.c b/core/src/fxcodec/lcms2/src/fx_cmsgmt.c
index ea82b15be0..dfe4cc86f0 100644
--- a/core/src/fxcodec/lcms2/src/fx_cmsgmt.c
+++ b/core/src/fxcodec/lcms2/src/fx_cmsgmt.c
@@ -1,7 +1,7 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../lcms2-2.6/src/cmsgmt.c"
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../lcms2-2.6/src/cmsgmt.c"
diff --git a/core/src/fxcodec/lcms2/src/fx_cmshalf.c b/core/src/fxcodec/lcms2/src/fx_cmshalf.c
index 6ed6b2b075..9c7e07c580 100644
--- a/core/src/fxcodec/lcms2/src/fx_cmshalf.c
+++ b/core/src/fxcodec/lcms2/src/fx_cmshalf.c
@@ -1,7 +1,7 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../lcms2-2.6/src/cmshalf.c"
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../lcms2-2.6/src/cmshalf.c"
diff --git a/core/src/fxcodec/lcms2/src/fx_cmsintrp.c b/core/src/fxcodec/lcms2/src/fx_cmsintrp.c
index affca53ca9..8eacd55bc0 100644
--- a/core/src/fxcodec/lcms2/src/fx_cmsintrp.c
+++ b/core/src/fxcodec/lcms2/src/fx_cmsintrp.c
@@ -1,7 +1,7 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../lcms2-2.6/src/cmsintrp.c"
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../lcms2-2.6/src/cmsintrp.c"
diff --git a/core/src/fxcodec/lcms2/src/fx_cmsio0.c b/core/src/fxcodec/lcms2/src/fx_cmsio0.c
index 2b6bc689cc..a4aed23c94 100644
--- a/core/src/fxcodec/lcms2/src/fx_cmsio0.c
+++ b/core/src/fxcodec/lcms2/src/fx_cmsio0.c
@@ -1,7 +1,7 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../lcms2-2.6/src/cmsio0.c"
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../lcms2-2.6/src/cmsio0.c"
diff --git a/core/src/fxcodec/lcms2/src/fx_cmsio1.c b/core/src/fxcodec/lcms2/src/fx_cmsio1.c
index 192e879063..34ce927c4f 100644
--- a/core/src/fxcodec/lcms2/src/fx_cmsio1.c
+++ b/core/src/fxcodec/lcms2/src/fx_cmsio1.c
@@ -1,7 +1,7 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../lcms2-2.6/src/cmsio1.c"
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../lcms2-2.6/src/cmsio1.c"
diff --git a/core/src/fxcodec/lcms2/src/fx_cmslut.c b/core/src/fxcodec/lcms2/src/fx_cmslut.c
index d9a319c774..d032e3b0cb 100644
--- a/core/src/fxcodec/lcms2/src/fx_cmslut.c
+++ b/core/src/fxcodec/lcms2/src/fx_cmslut.c
@@ -1,7 +1,7 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../lcms2-2.6/src/cmslut.c"
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../lcms2-2.6/src/cmslut.c"
diff --git a/core/src/fxcodec/lcms2/src/fx_cmsmd5.c b/core/src/fxcodec/lcms2/src/fx_cmsmd5.c
index 3a3a99719c..028db4a8eb 100644
--- a/core/src/fxcodec/lcms2/src/fx_cmsmd5.c
+++ b/core/src/fxcodec/lcms2/src/fx_cmsmd5.c
@@ -1,7 +1,7 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../lcms2-2.6/src/cmsmd5.c"
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../lcms2-2.6/src/cmsmd5.c"
diff --git a/core/src/fxcodec/lcms2/src/fx_cmsmtrx.c b/core/src/fxcodec/lcms2/src/fx_cmsmtrx.c
index 667ac1f09e..ad04dcc307 100644
--- a/core/src/fxcodec/lcms2/src/fx_cmsmtrx.c
+++ b/core/src/fxcodec/lcms2/src/fx_cmsmtrx.c
@@ -1,7 +1,7 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../lcms2-2.6/src/cmsmtrx.c"
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../lcms2-2.6/src/cmsmtrx.c"
diff --git a/core/src/fxcodec/lcms2/src/fx_cmsnamed.c b/core/src/fxcodec/lcms2/src/fx_cmsnamed.c
index 5e1b028e94..93a0132aa7 100644
--- a/core/src/fxcodec/lcms2/src/fx_cmsnamed.c
+++ b/core/src/fxcodec/lcms2/src/fx_cmsnamed.c
@@ -1,7 +1,7 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../lcms2-2.6/src/cmsnamed.c"
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../lcms2-2.6/src/cmsnamed.c"
diff --git a/core/src/fxcodec/lcms2/src/fx_cmsopt.c b/core/src/fxcodec/lcms2/src/fx_cmsopt.c
index f12429c551..e16c735cbb 100644
--- a/core/src/fxcodec/lcms2/src/fx_cmsopt.c
+++ b/core/src/fxcodec/lcms2/src/fx_cmsopt.c
@@ -1,7 +1,7 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../lcms2-2.6/src/cmsopt.c"
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../lcms2-2.6/src/cmsopt.c"
diff --git a/core/src/fxcodec/lcms2/src/fx_cmspack.c b/core/src/fxcodec/lcms2/src/fx_cmspack.c
index 6e0640905d..d125d33a32 100644
--- a/core/src/fxcodec/lcms2/src/fx_cmspack.c
+++ b/core/src/fxcodec/lcms2/src/fx_cmspack.c
@@ -1,7 +1,7 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../lcms2-2.6/src/cmspack.c"
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../lcms2-2.6/src/cmspack.c"
diff --git a/core/src/fxcodec/lcms2/src/fx_cmspcs.c b/core/src/fxcodec/lcms2/src/fx_cmspcs.c
index 48ce39de52..2a9d6dde99 100644
--- a/core/src/fxcodec/lcms2/src/fx_cmspcs.c
+++ b/core/src/fxcodec/lcms2/src/fx_cmspcs.c
@@ -1,7 +1,7 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../lcms2-2.6/src/cmspcs.c"
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../lcms2-2.6/src/cmspcs.c"
diff --git a/core/src/fxcodec/lcms2/src/fx_cmsplugin.c b/core/src/fxcodec/lcms2/src/fx_cmsplugin.c
index 39266c2222..ab7e6c31ee 100644
--- a/core/src/fxcodec/lcms2/src/fx_cmsplugin.c
+++ b/core/src/fxcodec/lcms2/src/fx_cmsplugin.c
@@ -1,7 +1,7 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../lcms2-2.6/src/cmsplugin.c"
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../lcms2-2.6/src/cmsplugin.c"
diff --git a/core/src/fxcodec/lcms2/src/fx_cmsps2.c b/core/src/fxcodec/lcms2/src/fx_cmsps2.c
index dcf55409e4..b6a1ea9f97 100644
--- a/core/src/fxcodec/lcms2/src/fx_cmsps2.c
+++ b/core/src/fxcodec/lcms2/src/fx_cmsps2.c
@@ -1,7 +1,7 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../lcms2-2.6/src/cmsps2.c"
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../lcms2-2.6/src/cmsps2.c"
diff --git a/core/src/fxcodec/lcms2/src/fx_cmssamp.c b/core/src/fxcodec/lcms2/src/fx_cmssamp.c
index f1468fe16d..5e5c0316b2 100644
--- a/core/src/fxcodec/lcms2/src/fx_cmssamp.c
+++ b/core/src/fxcodec/lcms2/src/fx_cmssamp.c
@@ -1,7 +1,7 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../lcms2-2.6/src/cmssamp.c"
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../lcms2-2.6/src/cmssamp.c"
diff --git a/core/src/fxcodec/lcms2/src/fx_cmssm.c b/core/src/fxcodec/lcms2/src/fx_cmssm.c
index a53ad71f42..b8c716041e 100644
--- a/core/src/fxcodec/lcms2/src/fx_cmssm.c
+++ b/core/src/fxcodec/lcms2/src/fx_cmssm.c
@@ -1,7 +1,7 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../lcms2-2.6/src/cmssm.c"
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../lcms2-2.6/src/cmssm.c"
diff --git a/core/src/fxcodec/lcms2/src/fx_cmstypes.c b/core/src/fxcodec/lcms2/src/fx_cmstypes.c
index 19f9e706c1..cf64a61dd9 100644
--- a/core/src/fxcodec/lcms2/src/fx_cmstypes.c
+++ b/core/src/fxcodec/lcms2/src/fx_cmstypes.c
@@ -1,7 +1,7 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../lcms2-2.6/src/cmstypes.c"
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../lcms2-2.6/src/cmstypes.c"
diff --git a/core/src/fxcodec/lcms2/src/fx_cmsvirt.c b/core/src/fxcodec/lcms2/src/fx_cmsvirt.c
index 3e5397f11b..cc60d1f9f1 100644
--- a/core/src/fxcodec/lcms2/src/fx_cmsvirt.c
+++ b/core/src/fxcodec/lcms2/src/fx_cmsvirt.c
@@ -1,7 +1,7 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../lcms2-2.6/src/cmsvirt.c"
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../lcms2-2.6/src/cmsvirt.c"
diff --git a/core/src/fxcodec/lcms2/src/fx_cmswtpnt.c b/core/src/fxcodec/lcms2/src/fx_cmswtpnt.c
index c11afd6016..d46c60a985 100644
--- a/core/src/fxcodec/lcms2/src/fx_cmswtpnt.c
+++ b/core/src/fxcodec/lcms2/src/fx_cmswtpnt.c
@@ -1,7 +1,7 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../lcms2-2.6/src/cmswtpnt.c"
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../lcms2-2.6/src/cmswtpnt.c"
diff --git a/core/src/fxcodec/lcms2/src/fx_cmsxform.c b/core/src/fxcodec/lcms2/src/fx_cmsxform.c
index a4b6d85536..e8cd83af42 100644
--- a/core/src/fxcodec/lcms2/src/fx_cmsxform.c
+++ b/core/src/fxcodec/lcms2/src/fx_cmsxform.c
@@ -1,7 +1,7 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../lcms2-2.6/src/cmsxform.c"
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../lcms2-2.6/src/cmsxform.c"
diff --git a/core/src/fxcodec/libjpeg/cderror.h b/core/src/fxcodec/libjpeg/cderror.h
index c19d38fb4a..70435e161c 100644
--- a/core/src/fxcodec/libjpeg/cderror.h
+++ b/core/src/fxcodec/libjpeg/cderror.h
@@ -1,132 +1,132 @@
-/*
- * cderror.h
- *
- * Copyright (C) 1994-1997, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file defines the error and message codes for the cjpeg/djpeg
- * applications. These strings are not needed as part of the JPEG library
- * proper.
- * Edit this file to add new codes, or to translate the message strings to
- * some other language.
- */
-
-/*
- * To define the enum list of message codes, include this file without
- * defining macro JMESSAGE. To create a message string table, include it
- * again with a suitable JMESSAGE definition (see jerror.c for an example).
- */
-#ifndef JMESSAGE
-#ifndef CDERROR_H
-#define CDERROR_H
-/* First time through, define the enum list */
-#define JMAKE_ENUM_LIST
-#else
-/* Repeated inclusions of this file are no-ops unless JMESSAGE is defined */
-#define JMESSAGE(code,string)
-#endif /* CDERROR_H */
-#endif /* JMESSAGE */
-
-#ifdef JMAKE_ENUM_LIST
-
-typedef enum {
-
-#define JMESSAGE(code,string) code ,
-
-#endif /* JMAKE_ENUM_LIST */
-
-JMESSAGE(JMSG_FIRSTADDONCODE=1000, NULL) /* Must be first entry! */
-
-#ifdef BMP_SUPPORTED
-JMESSAGE(JERR_BMP_BADCMAP, "Unsupported BMP colormap format")
-JMESSAGE(JERR_BMP_BADDEPTH, "Only 8- and 24-bit BMP files are supported")
-JMESSAGE(JERR_BMP_BADHEADER, "Invalid BMP file: bad header length")
-JMESSAGE(JERR_BMP_BADPLANES, "Invalid BMP file: biPlanes not equal to 1")
-JMESSAGE(JERR_BMP_COLORSPACE, "BMP output must be grayscale or RGB")
-JMESSAGE(JERR_BMP_COMPRESSED, "Sorry, compressed BMPs not yet supported")
-JMESSAGE(JERR_BMP_NOT, "Not a BMP file - does not start with BM")
-JMESSAGE(JTRC_BMP, "%ux%u 24-bit BMP image")
-JMESSAGE(JTRC_BMP_MAPPED, "%ux%u 8-bit colormapped BMP image")
-JMESSAGE(JTRC_BMP_OS2, "%ux%u 24-bit OS2 BMP image")
-JMESSAGE(JTRC_BMP_OS2_MAPPED, "%ux%u 8-bit colormapped OS2 BMP image")
-#endif /* BMP_SUPPORTED */
-
-#ifdef GIF_SUPPORTED
-JMESSAGE(JERR_GIF_BUG, "GIF output got confused")
-JMESSAGE(JERR_GIF_CODESIZE, "Bogus GIF codesize %d")
-JMESSAGE(JERR_GIF_COLORSPACE, "GIF output must be grayscale or RGB")
-JMESSAGE(JERR_GIF_IMAGENOTFOUND, "Too few images in GIF file")
-JMESSAGE(JERR_GIF_NOT, "Not a GIF file")
-JMESSAGE(JTRC_GIF, "%ux%ux%d GIF image")
-JMESSAGE(JTRC_GIF_BADVERSION,
- "Warning: unexpected GIF version number '%c%c%c'")
-JMESSAGE(JTRC_GIF_EXTENSION, "Ignoring GIF extension block of type 0x%02x")
-JMESSAGE(JTRC_GIF_NONSQUARE, "Caution: nonsquare pixels in input")
-JMESSAGE(JWRN_GIF_BADDATA, "Corrupt data in GIF file")
-JMESSAGE(JWRN_GIF_CHAR, "Bogus char 0x%02x in GIF file, ignoring")
-JMESSAGE(JWRN_GIF_ENDCODE, "Premature end of GIF image")
-JMESSAGE(JWRN_GIF_NOMOREDATA, "Ran out of GIF bits")
-#endif /* GIF_SUPPORTED */
-
-#ifdef PPM_SUPPORTED
-JMESSAGE(JERR_PPM_COLORSPACE, "PPM output must be grayscale or RGB")
-JMESSAGE(JERR_PPM_NONNUMERIC, "Nonnumeric data in PPM file")
-JMESSAGE(JERR_PPM_NOT, "Not a PPM/PGM file")
-JMESSAGE(JTRC_PGM, "%ux%u PGM image")
-JMESSAGE(JTRC_PGM_TEXT, "%ux%u text PGM image")
-JMESSAGE(JTRC_PPM, "%ux%u PPM image")
-JMESSAGE(JTRC_PPM_TEXT, "%ux%u text PPM image")
-#endif /* PPM_SUPPORTED */
-
-#ifdef RLE_SUPPORTED
-JMESSAGE(JERR_RLE_BADERROR, "Bogus error code from RLE library")
-JMESSAGE(JERR_RLE_COLORSPACE, "RLE output must be grayscale or RGB")
-JMESSAGE(JERR_RLE_DIMENSIONS, "Image dimensions (%ux%u) too large for RLE")
-JMESSAGE(JERR_RLE_EMPTY, "Empty RLE file")
-JMESSAGE(JERR_RLE_EOF, "Premature EOF in RLE header")
-JMESSAGE(JERR_RLE_MEM, "Insufficient memory for RLE header")
-JMESSAGE(JERR_RLE_NOT, "Not an RLE file")
-JMESSAGE(JERR_RLE_TOOMANYCHANNELS, "Cannot handle %d output channels for RLE")
-JMESSAGE(JERR_RLE_UNSUPPORTED, "Cannot handle this RLE setup")
-JMESSAGE(JTRC_RLE, "%ux%u full-color RLE file")
-JMESSAGE(JTRC_RLE_FULLMAP, "%ux%u full-color RLE file with map of length %d")
-JMESSAGE(JTRC_RLE_GRAY, "%ux%u grayscale RLE file")
-JMESSAGE(JTRC_RLE_MAPGRAY, "%ux%u grayscale RLE file with map of length %d")
-JMESSAGE(JTRC_RLE_MAPPED, "%ux%u colormapped RLE file with map of length %d")
-#endif /* RLE_SUPPORTED */
-
-#ifdef TARGA_SUPPORTED
-JMESSAGE(JERR_TGA_BADCMAP, "Unsupported Targa colormap format")
-JMESSAGE(JERR_TGA_BADPARMS, "Invalid or unsupported Targa file")
-JMESSAGE(JERR_TGA_COLORSPACE, "Targa output must be grayscale or RGB")
-JMESSAGE(JTRC_TGA, "%ux%u RGB Targa image")
-JMESSAGE(JTRC_TGA_GRAY, "%ux%u grayscale Targa image")
-JMESSAGE(JTRC_TGA_MAPPED, "%ux%u colormapped Targa image")
-#else
-JMESSAGE(JERR_TGA_NOTCOMP, "Targa support was not compiled")
-#endif /* TARGA_SUPPORTED */
-
-JMESSAGE(JERR_BAD_CMAP_FILE,
- "Color map file is invalid or of unsupported format")
-JMESSAGE(JERR_TOO_MANY_COLORS,
- "Output file format cannot handle %d colormap entries")
-JMESSAGE(JERR_UNGETC_FAILED, "ungetc failed")
-#ifdef TARGA_SUPPORTED
-JMESSAGE(JERR_UNKNOWN_FORMAT,
- "Unrecognized input file format --- perhaps you need -targa")
-#else
-JMESSAGE(JERR_UNKNOWN_FORMAT, "Unrecognized input file format")
-#endif
-JMESSAGE(JERR_UNSUPPORTED_FORMAT, "Unsupported output file format")
-
-#ifdef JMAKE_ENUM_LIST
-
- JMSG_LASTADDONCODE
-} ADDON_MESSAGE_CODE;
-
-#undef JMAKE_ENUM_LIST
-#endif /* JMAKE_ENUM_LIST */
-
-/* Zap JMESSAGE macro so that future re-inclusions do nothing by default */
-#undef JMESSAGE
+/*
+ * cderror.h
+ *
+ * Copyright (C) 1994-1997, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file defines the error and message codes for the cjpeg/djpeg
+ * applications. These strings are not needed as part of the JPEG library
+ * proper.
+ * Edit this file to add new codes, or to translate the message strings to
+ * some other language.
+ */
+
+/*
+ * To define the enum list of message codes, include this file without
+ * defining macro JMESSAGE. To create a message string table, include it
+ * again with a suitable JMESSAGE definition (see jerror.c for an example).
+ */
+#ifndef JMESSAGE
+#ifndef CDERROR_H
+#define CDERROR_H
+/* First time through, define the enum list */
+#define JMAKE_ENUM_LIST
+#else
+/* Repeated inclusions of this file are no-ops unless JMESSAGE is defined */
+#define JMESSAGE(code,string)
+#endif /* CDERROR_H */
+#endif /* JMESSAGE */
+
+#ifdef JMAKE_ENUM_LIST
+
+typedef enum {
+
+#define JMESSAGE(code,string) code ,
+
+#endif /* JMAKE_ENUM_LIST */
+
+JMESSAGE(JMSG_FIRSTADDONCODE=1000, NULL) /* Must be first entry! */
+
+#ifdef BMP_SUPPORTED
+JMESSAGE(JERR_BMP_BADCMAP, "Unsupported BMP colormap format")
+JMESSAGE(JERR_BMP_BADDEPTH, "Only 8- and 24-bit BMP files are supported")
+JMESSAGE(JERR_BMP_BADHEADER, "Invalid BMP file: bad header length")
+JMESSAGE(JERR_BMP_BADPLANES, "Invalid BMP file: biPlanes not equal to 1")
+JMESSAGE(JERR_BMP_COLORSPACE, "BMP output must be grayscale or RGB")
+JMESSAGE(JERR_BMP_COMPRESSED, "Sorry, compressed BMPs not yet supported")
+JMESSAGE(JERR_BMP_NOT, "Not a BMP file - does not start with BM")
+JMESSAGE(JTRC_BMP, "%ux%u 24-bit BMP image")
+JMESSAGE(JTRC_BMP_MAPPED, "%ux%u 8-bit colormapped BMP image")
+JMESSAGE(JTRC_BMP_OS2, "%ux%u 24-bit OS2 BMP image")
+JMESSAGE(JTRC_BMP_OS2_MAPPED, "%ux%u 8-bit colormapped OS2 BMP image")
+#endif /* BMP_SUPPORTED */
+
+#ifdef GIF_SUPPORTED
+JMESSAGE(JERR_GIF_BUG, "GIF output got confused")
+JMESSAGE(JERR_GIF_CODESIZE, "Bogus GIF codesize %d")
+JMESSAGE(JERR_GIF_COLORSPACE, "GIF output must be grayscale or RGB")
+JMESSAGE(JERR_GIF_IMAGENOTFOUND, "Too few images in GIF file")
+JMESSAGE(JERR_GIF_NOT, "Not a GIF file")
+JMESSAGE(JTRC_GIF, "%ux%ux%d GIF image")
+JMESSAGE(JTRC_GIF_BADVERSION,
+ "Warning: unexpected GIF version number '%c%c%c'")
+JMESSAGE(JTRC_GIF_EXTENSION, "Ignoring GIF extension block of type 0x%02x")
+JMESSAGE(JTRC_GIF_NONSQUARE, "Caution: nonsquare pixels in input")
+JMESSAGE(JWRN_GIF_BADDATA, "Corrupt data in GIF file")
+JMESSAGE(JWRN_GIF_CHAR, "Bogus char 0x%02x in GIF file, ignoring")
+JMESSAGE(JWRN_GIF_ENDCODE, "Premature end of GIF image")
+JMESSAGE(JWRN_GIF_NOMOREDATA, "Ran out of GIF bits")
+#endif /* GIF_SUPPORTED */
+
+#ifdef PPM_SUPPORTED
+JMESSAGE(JERR_PPM_COLORSPACE, "PPM output must be grayscale or RGB")
+JMESSAGE(JERR_PPM_NONNUMERIC, "Nonnumeric data in PPM file")
+JMESSAGE(JERR_PPM_NOT, "Not a PPM/PGM file")
+JMESSAGE(JTRC_PGM, "%ux%u PGM image")
+JMESSAGE(JTRC_PGM_TEXT, "%ux%u text PGM image")
+JMESSAGE(JTRC_PPM, "%ux%u PPM image")
+JMESSAGE(JTRC_PPM_TEXT, "%ux%u text PPM image")
+#endif /* PPM_SUPPORTED */
+
+#ifdef RLE_SUPPORTED
+JMESSAGE(JERR_RLE_BADERROR, "Bogus error code from RLE library")
+JMESSAGE(JERR_RLE_COLORSPACE, "RLE output must be grayscale or RGB")
+JMESSAGE(JERR_RLE_DIMENSIONS, "Image dimensions (%ux%u) too large for RLE")
+JMESSAGE(JERR_RLE_EMPTY, "Empty RLE file")
+JMESSAGE(JERR_RLE_EOF, "Premature EOF in RLE header")
+JMESSAGE(JERR_RLE_MEM, "Insufficient memory for RLE header")
+JMESSAGE(JERR_RLE_NOT, "Not an RLE file")
+JMESSAGE(JERR_RLE_TOOMANYCHANNELS, "Cannot handle %d output channels for RLE")
+JMESSAGE(JERR_RLE_UNSUPPORTED, "Cannot handle this RLE setup")
+JMESSAGE(JTRC_RLE, "%ux%u full-color RLE file")
+JMESSAGE(JTRC_RLE_FULLMAP, "%ux%u full-color RLE file with map of length %d")
+JMESSAGE(JTRC_RLE_GRAY, "%ux%u grayscale RLE file")
+JMESSAGE(JTRC_RLE_MAPGRAY, "%ux%u grayscale RLE file with map of length %d")
+JMESSAGE(JTRC_RLE_MAPPED, "%ux%u colormapped RLE file with map of length %d")
+#endif /* RLE_SUPPORTED */
+
+#ifdef TARGA_SUPPORTED
+JMESSAGE(JERR_TGA_BADCMAP, "Unsupported Targa colormap format")
+JMESSAGE(JERR_TGA_BADPARMS, "Invalid or unsupported Targa file")
+JMESSAGE(JERR_TGA_COLORSPACE, "Targa output must be grayscale or RGB")
+JMESSAGE(JTRC_TGA, "%ux%u RGB Targa image")
+JMESSAGE(JTRC_TGA_GRAY, "%ux%u grayscale Targa image")
+JMESSAGE(JTRC_TGA_MAPPED, "%ux%u colormapped Targa image")
+#else
+JMESSAGE(JERR_TGA_NOTCOMP, "Targa support was not compiled")
+#endif /* TARGA_SUPPORTED */
+
+JMESSAGE(JERR_BAD_CMAP_FILE,
+ "Color map file is invalid or of unsupported format")
+JMESSAGE(JERR_TOO_MANY_COLORS,
+ "Output file format cannot handle %d colormap entries")
+JMESSAGE(JERR_UNGETC_FAILED, "ungetc failed")
+#ifdef TARGA_SUPPORTED
+JMESSAGE(JERR_UNKNOWN_FORMAT,
+ "Unrecognized input file format --- perhaps you need -targa")
+#else
+JMESSAGE(JERR_UNKNOWN_FORMAT, "Unrecognized input file format")
+#endif
+JMESSAGE(JERR_UNSUPPORTED_FORMAT, "Unsupported output file format")
+
+#ifdef JMAKE_ENUM_LIST
+
+ JMSG_LASTADDONCODE
+} ADDON_MESSAGE_CODE;
+
+#undef JMAKE_ENUM_LIST
+#endif /* JMAKE_ENUM_LIST */
+
+/* Zap JMESSAGE macro so that future re-inclusions do nothing by default */
+#undef JMESSAGE
diff --git a/core/src/fxcodec/libjpeg/cdjpeg.h b/core/src/fxcodec/libjpeg/cdjpeg.h
index be12278810..3d728ee9c7 100644
--- a/core/src/fxcodec/libjpeg/cdjpeg.h
+++ b/core/src/fxcodec/libjpeg/cdjpeg.h
@@ -1,184 +1,184 @@
-/*
- * cdjpeg.h
- *
- * Copyright (C) 1994-1997, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains common declarations for the sample applications
- * cjpeg and djpeg. It is NOT used by the core JPEG library.
- */
-
-#define JPEG_CJPEG_DJPEG /* define proper options in jconfig.h */
-#define JPEG_INTERNAL_OPTIONS /* cjpeg.c,djpeg.c need to see xxx_SUPPORTED */
-#include "jinclude.h"
-#include "jpeglib.h"
-#include "jerror.h" /* get library error codes too */
-#include "cderror.h" /* get application-specific error codes */
-
-
-/*
- * Object interface for cjpeg's source file decoding modules
- */
-
-typedef struct cjpeg_source_struct * cjpeg_source_ptr;
-
-struct cjpeg_source_struct {
- JMETHOD(void, start_input, (j_compress_ptr cinfo,
- cjpeg_source_ptr sinfo));
- JMETHOD(JDIMENSION, get_pixel_rows, (j_compress_ptr cinfo,
- cjpeg_source_ptr sinfo));
- JMETHOD(void, finish_input, (j_compress_ptr cinfo,
- cjpeg_source_ptr sinfo));
-
- FXSYS_FILE *input_file;
-
- JSAMPARRAY buffer;
- JDIMENSION buffer_height;
-};
-
-
-/*
- * Object interface for djpeg's output file encoding modules
- */
-
-typedef struct djpeg_dest_struct * djpeg_dest_ptr;
-
-struct djpeg_dest_struct {
- /* start_output is called after jpeg_start_decompress finishes.
- * The color map will be ready at this time, if one is needed.
- */
- JMETHOD(void, start_output, (j_decompress_ptr cinfo,
- djpeg_dest_ptr dinfo));
- /* Emit the specified number of pixel rows from the buffer. */
- JMETHOD(void, put_pixel_rows, (j_decompress_ptr cinfo,
- djpeg_dest_ptr dinfo,
- JDIMENSION rows_supplied));
- /* Finish up at the end of the image. */
- JMETHOD(void, finish_output, (j_decompress_ptr cinfo,
- djpeg_dest_ptr dinfo));
-
- /* Target file spec; filled in by djpeg.c after object is created. */
- FXSYS_FILE * output_file;
-
- /* Output pixel-row buffer. Created by module init or start_output.
- * Width is cinfo->output_width * cinfo->output_components;
- * height is buffer_height.
- */
- JSAMPARRAY buffer;
- JDIMENSION buffer_height;
-};
-
-
-/*
- * cjpeg/djpeg may need to perform extra passes to convert to or from
- * the source/destination file format. The JPEG library does not know
- * about these passes, but we'd like them to be counted by the progress
- * monitor. We use an expanded progress monitor object to hold the
- * additional pass count.
- */
-
-struct cdjpeg_progress_mgr {
- struct jpeg_progress_mgr pub; /* fields known to JPEG library */
- int completed_extra_passes; /* extra passes completed */
- int total_extra_passes; /* total extra */
- /* last printed percentage stored here to avoid multiple printouts */
- int percent_done;
-};
-
-typedef struct cdjpeg_progress_mgr * cd_progress_ptr;
-
-
-/* Short forms of external names for systems with brain-damaged linkers. */
-
-#ifdef NEED_SHORT_EXTERNAL_NAMES
-#define jinit_read_bmp jIRdBMP
-#define jinit_write_bmp jIWrBMP
-#define jinit_read_gif jIRdGIF
-#define jinit_write_gif jIWrGIF
-#define jinit_read_ppm jIRdPPM
-#define jinit_write_ppm jIWrPPM
-#define jinit_read_rle jIRdRLE
-#define jinit_write_rle jIWrRLE
-#define jinit_read_targa jIRdTarga
-#define jinit_write_targa jIWrTarga
-#define read_quant_tables RdQTables
-#define read_scan_script RdScnScript
-#define set_quant_slots SetQSlots
-#define set_sample_factors SetSFacts
-#define read_color_map RdCMap
-#define enable_signal_catcher EnSigCatcher
-#define start_progress_monitor StProgMon
-#define end_progress_monitor EnProgMon
-#define read_stdin RdStdin
-#define write_stdout WrStdout
-#endif /* NEED_SHORT_EXTERNAL_NAMES */
-
-/* Module selection routines for I/O modules. */
-
-EXTERN(cjpeg_source_ptr) jinit_read_bmp JPP((j_compress_ptr cinfo));
-EXTERN(djpeg_dest_ptr) jinit_write_bmp JPP((j_decompress_ptr cinfo,
- boolean is_os2));
-EXTERN(cjpeg_source_ptr) jinit_read_gif JPP((j_compress_ptr cinfo));
-EXTERN(djpeg_dest_ptr) jinit_write_gif JPP((j_decompress_ptr cinfo));
-EXTERN(cjpeg_source_ptr) jinit_read_ppm JPP((j_compress_ptr cinfo));
-EXTERN(djpeg_dest_ptr) jinit_write_ppm JPP((j_decompress_ptr cinfo));
-EXTERN(cjpeg_source_ptr) jinit_read_rle JPP((j_compress_ptr cinfo));
-EXTERN(djpeg_dest_ptr) jinit_write_rle JPP((j_decompress_ptr cinfo));
-EXTERN(cjpeg_source_ptr) jinit_read_targa JPP((j_compress_ptr cinfo));
-EXTERN(djpeg_dest_ptr) jinit_write_targa JPP((j_decompress_ptr cinfo));
-
-/* cjpeg support routines (in rdswitch.c) */
-
-EXTERN(boolean) read_quant_tables JPP((j_compress_ptr cinfo, char * filename,
- int scale_factor, boolean force_baseline));
-EXTERN(boolean) read_scan_script JPP((j_compress_ptr cinfo, char * filename));
-EXTERN(boolean) set_quant_slots JPP((j_compress_ptr cinfo, char *arg));
-EXTERN(boolean) set_sample_factors JPP((j_compress_ptr cinfo, char *arg));
-
-/* djpeg support routines (in rdcolmap.c) */
-
-EXTERN(void) read_color_map JPP((j_decompress_ptr cinfo, FXSYS_FILE * infile));
-
-/* common support routines (in cdjpeg.c) */
-
-EXTERN(void) enable_signal_catcher JPP((j_common_ptr cinfo));
-EXTERN(void) start_progress_monitor JPP((j_common_ptr cinfo,
- cd_progress_ptr progress));
-EXTERN(void) end_progress_monitor JPP((j_common_ptr cinfo));
-EXTERN(boolean) keymatch JPP((char * arg, const char * keyword, int minchars));
-EXTERN(FXSYS_FILE *) read_stdin JPP((void));
-EXTERN(FXSYS_FILE *) write_stdout JPP((void));
-
-/* miscellaneous useful macros */
-
-#ifdef DONT_USE_B_MODE /* define mode parameters for fopen() */
-#define READ_BINARY "r"
-#define WRITE_BINARY "w"
-#else
-#ifdef VMS /* VMS is very nonstandard */
-#define READ_BINARY "rb", "ctx=stm"
-#define WRITE_BINARY "wb", "ctx=stm"
-#else /* standard ANSI-compliant case */
-#define READ_BINARY "rb"
-#define WRITE_BINARY "wb"
-#endif
-#endif
-
-#ifndef EXIT_FAILURE /* define exit() codes if not provided */
-#define EXIT_FAILURE 1
-#endif
-#ifndef EXIT_SUCCESS
-#ifdef VMS
-#define EXIT_SUCCESS 1 /* VMS is very nonstandard */
-#else
-#define EXIT_SUCCESS 0
-#endif
-#endif
-#ifndef EXIT_WARNING
-#ifdef VMS
-#define EXIT_WARNING 1 /* VMS is very nonstandard */
-#else
-#define EXIT_WARNING 2
-#endif
-#endif
+/*
+ * cdjpeg.h
+ *
+ * Copyright (C) 1994-1997, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains common declarations for the sample applications
+ * cjpeg and djpeg. It is NOT used by the core JPEG library.
+ */
+
+#define JPEG_CJPEG_DJPEG /* define proper options in jconfig.h */
+#define JPEG_INTERNAL_OPTIONS /* cjpeg.c,djpeg.c need to see xxx_SUPPORTED */
+#include "jinclude.h"
+#include "jpeglib.h"
+#include "jerror.h" /* get library error codes too */
+#include "cderror.h" /* get application-specific error codes */
+
+
+/*
+ * Object interface for cjpeg's source file decoding modules
+ */
+
+typedef struct cjpeg_source_struct * cjpeg_source_ptr;
+
+struct cjpeg_source_struct {
+ JMETHOD(void, start_input, (j_compress_ptr cinfo,
+ cjpeg_source_ptr sinfo));
+ JMETHOD(JDIMENSION, get_pixel_rows, (j_compress_ptr cinfo,
+ cjpeg_source_ptr sinfo));
+ JMETHOD(void, finish_input, (j_compress_ptr cinfo,
+ cjpeg_source_ptr sinfo));
+
+ FXSYS_FILE *input_file;
+
+ JSAMPARRAY buffer;
+ JDIMENSION buffer_height;
+};
+
+
+/*
+ * Object interface for djpeg's output file encoding modules
+ */
+
+typedef struct djpeg_dest_struct * djpeg_dest_ptr;
+
+struct djpeg_dest_struct {
+ /* start_output is called after jpeg_start_decompress finishes.
+ * The color map will be ready at this time, if one is needed.
+ */
+ JMETHOD(void, start_output, (j_decompress_ptr cinfo,
+ djpeg_dest_ptr dinfo));
+ /* Emit the specified number of pixel rows from the buffer. */
+ JMETHOD(void, put_pixel_rows, (j_decompress_ptr cinfo,
+ djpeg_dest_ptr dinfo,
+ JDIMENSION rows_supplied));
+ /* Finish up at the end of the image. */
+ JMETHOD(void, finish_output, (j_decompress_ptr cinfo,
+ djpeg_dest_ptr dinfo));
+
+ /* Target file spec; filled in by djpeg.c after object is created. */
+ FXSYS_FILE * output_file;
+
+ /* Output pixel-row buffer. Created by module init or start_output.
+ * Width is cinfo->output_width * cinfo->output_components;
+ * height is buffer_height.
+ */
+ JSAMPARRAY buffer;
+ JDIMENSION buffer_height;
+};
+
+
+/*
+ * cjpeg/djpeg may need to perform extra passes to convert to or from
+ * the source/destination file format. The JPEG library does not know
+ * about these passes, but we'd like them to be counted by the progress
+ * monitor. We use an expanded progress monitor object to hold the
+ * additional pass count.
+ */
+
+struct cdjpeg_progress_mgr {
+ struct jpeg_progress_mgr pub; /* fields known to JPEG library */
+ int completed_extra_passes; /* extra passes completed */
+ int total_extra_passes; /* total extra */
+ /* last printed percentage stored here to avoid multiple printouts */
+ int percent_done;
+};
+
+typedef struct cdjpeg_progress_mgr * cd_progress_ptr;
+
+
+/* Short forms of external names for systems with brain-damaged linkers. */
+
+#ifdef NEED_SHORT_EXTERNAL_NAMES
+#define jinit_read_bmp jIRdBMP
+#define jinit_write_bmp jIWrBMP
+#define jinit_read_gif jIRdGIF
+#define jinit_write_gif jIWrGIF
+#define jinit_read_ppm jIRdPPM
+#define jinit_write_ppm jIWrPPM
+#define jinit_read_rle jIRdRLE
+#define jinit_write_rle jIWrRLE
+#define jinit_read_targa jIRdTarga
+#define jinit_write_targa jIWrTarga
+#define read_quant_tables RdQTables
+#define read_scan_script RdScnScript
+#define set_quant_slots SetQSlots
+#define set_sample_factors SetSFacts
+#define read_color_map RdCMap
+#define enable_signal_catcher EnSigCatcher
+#define start_progress_monitor StProgMon
+#define end_progress_monitor EnProgMon
+#define read_stdin RdStdin
+#define write_stdout WrStdout
+#endif /* NEED_SHORT_EXTERNAL_NAMES */
+
+/* Module selection routines for I/O modules. */
+
+EXTERN(cjpeg_source_ptr) jinit_read_bmp JPP((j_compress_ptr cinfo));
+EXTERN(djpeg_dest_ptr) jinit_write_bmp JPP((j_decompress_ptr cinfo,
+ boolean is_os2));
+EXTERN(cjpeg_source_ptr) jinit_read_gif JPP((j_compress_ptr cinfo));
+EXTERN(djpeg_dest_ptr) jinit_write_gif JPP((j_decompress_ptr cinfo));
+EXTERN(cjpeg_source_ptr) jinit_read_ppm JPP((j_compress_ptr cinfo));
+EXTERN(djpeg_dest_ptr) jinit_write_ppm JPP((j_decompress_ptr cinfo));
+EXTERN(cjpeg_source_ptr) jinit_read_rle JPP((j_compress_ptr cinfo));
+EXTERN(djpeg_dest_ptr) jinit_write_rle JPP((j_decompress_ptr cinfo));
+EXTERN(cjpeg_source_ptr) jinit_read_targa JPP((j_compress_ptr cinfo));
+EXTERN(djpeg_dest_ptr) jinit_write_targa JPP((j_decompress_ptr cinfo));
+
+/* cjpeg support routines (in rdswitch.c) */
+
+EXTERN(boolean) read_quant_tables JPP((j_compress_ptr cinfo, char * filename,
+ int scale_factor, boolean force_baseline));
+EXTERN(boolean) read_scan_script JPP((j_compress_ptr cinfo, char * filename));
+EXTERN(boolean) set_quant_slots JPP((j_compress_ptr cinfo, char *arg));
+EXTERN(boolean) set_sample_factors JPP((j_compress_ptr cinfo, char *arg));
+
+/* djpeg support routines (in rdcolmap.c) */
+
+EXTERN(void) read_color_map JPP((j_decompress_ptr cinfo, FXSYS_FILE * infile));
+
+/* common support routines (in cdjpeg.c) */
+
+EXTERN(void) enable_signal_catcher JPP((j_common_ptr cinfo));
+EXTERN(void) start_progress_monitor JPP((j_common_ptr cinfo,
+ cd_progress_ptr progress));
+EXTERN(void) end_progress_monitor JPP((j_common_ptr cinfo));
+EXTERN(boolean) keymatch JPP((char * arg, const char * keyword, int minchars));
+EXTERN(FXSYS_FILE *) read_stdin JPP((void));
+EXTERN(FXSYS_FILE *) write_stdout JPP((void));
+
+/* miscellaneous useful macros */
+
+#ifdef DONT_USE_B_MODE /* define mode parameters for fopen() */
+#define READ_BINARY "r"
+#define WRITE_BINARY "w"
+#else
+#ifdef VMS /* VMS is very nonstandard */
+#define READ_BINARY "rb", "ctx=stm"
+#define WRITE_BINARY "wb", "ctx=stm"
+#else /* standard ANSI-compliant case */
+#define READ_BINARY "rb"
+#define WRITE_BINARY "wb"
+#endif
+#endif
+
+#ifndef EXIT_FAILURE /* define exit() codes if not provided */
+#define EXIT_FAILURE 1
+#endif
+#ifndef EXIT_SUCCESS
+#ifdef VMS
+#define EXIT_SUCCESS 1 /* VMS is very nonstandard */
+#else
+#define EXIT_SUCCESS 0
+#endif
+#endif
+#ifndef EXIT_WARNING
+#ifdef VMS
+#define EXIT_WARNING 1 /* VMS is very nonstandard */
+#else
+#define EXIT_WARNING 2
+#endif
+#endif
diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jcapimin.c b/core/src/fxcodec/libjpeg/fpdfapi_jcapimin.c
index ec88cff26d..ec04fd2f15 100644
--- a/core/src/fxcodec/libjpeg/fpdfapi_jcapimin.c
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jcapimin.c
@@ -1,283 +1,283 @@
-#if !defined(_FX_JPEG_TURBO_)
-/*
- * jcapimin.c
- *
- * Copyright (C) 1994-1998, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains application interface code for the compression half
- * of the JPEG library. These are the "minimum" API routines that may be
- * needed in either the normal full-compression case or the transcoding-only
- * case.
- *
- * Most of the routines intended to be called directly by an application
- * are in this file or in jcapistd.c. But also see jcparam.c for
- * parameter-setup helper routines, jcomapi.c for routines shared by
- * compression and decompression, and jctrans.c for the transcoding case.
- */
-
-#define JPEG_INTERNALS
-#include "jinclude.h"
-#include "jpeglib.h"
-
-
-/*
- * Initialization of a JPEG compression object.
- * The error manager must already be set up (in case memory manager fails).
- */
-
-GLOBAL(void)
-jpeg_CreateCompress (j_compress_ptr cinfo, int version, size_t structsize)
-{
- int i;
-
- /* Guard against version mismatches between library and caller. */
- cinfo->mem = NULL; /* so jpeg_destroy knows mem mgr not called */
- if (version != JPEG_LIB_VERSION)
- ERREXIT2(cinfo, JERR_BAD_LIB_VERSION, JPEG_LIB_VERSION, version);
- if (structsize != SIZEOF(struct jpeg_compress_struct))
- ERREXIT2(cinfo, JERR_BAD_STRUCT_SIZE,
- (int) SIZEOF(struct jpeg_compress_struct), (int) structsize);
-
- /* For debugging purposes, we zero the whole master structure.
- * But the application has already set the err pointer, and may have set
- * client_data, so we have to save and restore those fields.
- * Note: if application hasn't set client_data, tools like Purify may
- * complain here.
- */
- {
- struct jpeg_error_mgr * err = cinfo->err;
- void * client_data = cinfo->client_data; /* ignore Purify complaint here */
- MEMZERO(cinfo, SIZEOF(struct jpeg_compress_struct));
- cinfo->err = err;
- cinfo->client_data = client_data;
- }
- cinfo->is_decompressor = FALSE;
-
- /* Initialize a memory manager instance for this object */
- jinit_memory_mgr((j_common_ptr) cinfo);
-
- /* Zero out pointers to permanent structures. */
- cinfo->progress = NULL;
- cinfo->dest = NULL;
-
- cinfo->comp_info = NULL;
-
- for (i = 0; i < NUM_QUANT_TBLS; i++)
- cinfo->quant_tbl_ptrs[i] = NULL;
-
- for (i = 0; i < NUM_HUFF_TBLS; i++) {
- cinfo->dc_huff_tbl_ptrs[i] = NULL;
- cinfo->ac_huff_tbl_ptrs[i] = NULL;
- }
-
- cinfo->script_space = NULL;
-
- cinfo->input_gamma = 1.0; /* in case application forgets */
-
- /* OK, I'm ready */
- cinfo->global_state = CSTATE_START;
-}
-
-
-/*
- * Destruction of a JPEG compression object
- */
-
-GLOBAL(void)
-jpeg_destroy_compress (j_compress_ptr cinfo)
-{
- jpeg_destroy((j_common_ptr) cinfo); /* use common routine */
-}
-
-
-/*
- * Abort processing of a JPEG compression operation,
- * but don't destroy the object itself.
- */
-
-GLOBAL(void)
-jpeg_abort_compress (j_compress_ptr cinfo)
-{
- jpeg_abort((j_common_ptr) cinfo); /* use common routine */
-}
-
-
-/*
- * Forcibly suppress or un-suppress all quantization and Huffman tables.
- * Marks all currently defined tables as already written (if suppress)
- * or not written (if !suppress). This will control whether they get emitted
- * by a subsequent jpeg_start_compress call.
- *
- * This routine is exported for use by applications that want to produce
- * abbreviated JPEG datastreams. It logically belongs in jcparam.c, but
- * since it is called by jpeg_start_compress, we put it here --- otherwise
- * jcparam.o would be linked whether the application used it or not.
- */
-
-GLOBAL(void)
-jpeg_suppress_tables (j_compress_ptr cinfo, boolean suppress)
-{
- int i;
- JQUANT_TBL * qtbl;
- JHUFF_TBL * htbl;
-
- for (i = 0; i < NUM_QUANT_TBLS; i++) {
- if ((qtbl = cinfo->quant_tbl_ptrs[i]) != NULL)
- qtbl->sent_table = suppress;
- }
-
- for (i = 0; i < NUM_HUFF_TBLS; i++) {
- if ((htbl = cinfo->dc_huff_tbl_ptrs[i]) != NULL)
- htbl->sent_table = suppress;
- if ((htbl = cinfo->ac_huff_tbl_ptrs[i]) != NULL)
- htbl->sent_table = suppress;
- }
-}
-
-
-/*
- * Finish JPEG compression.
- *
- * If a multipass operating mode was selected, this may do a great deal of
- * work including most of the actual output.
- */
-
-GLOBAL(void)
-jpeg_finish_compress (j_compress_ptr cinfo)
-{
- JDIMENSION iMCU_row;
-
- if (cinfo->global_state == CSTATE_SCANNING ||
- cinfo->global_state == CSTATE_RAW_OK) {
- /* Terminate first pass */
- if (cinfo->next_scanline < cinfo->image_height)
- ERREXIT(cinfo, JERR_TOO_LITTLE_DATA);
- (*cinfo->master->finish_pass) (cinfo);
- } else if (cinfo->global_state != CSTATE_WRCOEFS)
- ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
- /* Perform any remaining passes */
- while (! cinfo->master->is_last_pass) {
- (*cinfo->master->prepare_for_pass) (cinfo);
- for (iMCU_row = 0; iMCU_row < cinfo->total_iMCU_rows; iMCU_row++) {
- if (cinfo->progress != NULL) {
- cinfo->progress->pass_counter = (long) iMCU_row;
- cinfo->progress->pass_limit = (long) cinfo->total_iMCU_rows;
- (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);
- }
- /* We bypass the main controller and invoke coef controller directly;
- * all work is being done from the coefficient buffer.
- */
- if (! (*cinfo->coef->compress_data) (cinfo, (JSAMPIMAGE) NULL))
- ERREXIT(cinfo, JERR_CANT_SUSPEND);
- }
- (*cinfo->master->finish_pass) (cinfo);
- }
- /* Write EOI, do final cleanup */
- (*cinfo->marker->write_file_trailer) (cinfo);
- (*cinfo->dest->term_destination) (cinfo);
- /* We can use jpeg_abort to release memory and reset global_state */
- jpeg_abort((j_common_ptr) cinfo);
-}
-
-
-/*
- * Write a special marker.
- * This is only recommended for writing COM or APPn markers.
- * Must be called after jpeg_start_compress() and before
- * first call to jpeg_write_scanlines() or jpeg_write_raw_data().
- */
-
-GLOBAL(void)
-jpeg_write_marker (j_compress_ptr cinfo, int marker,
- const JOCTET *dataptr, unsigned int datalen)
-{
- JMETHOD(void, write_marker_byte, (j_compress_ptr info, int val));
-
- if (cinfo->next_scanline != 0 ||
- (cinfo->global_state != CSTATE_SCANNING &&
- cinfo->global_state != CSTATE_RAW_OK &&
- cinfo->global_state != CSTATE_WRCOEFS))
- ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
-
- (*cinfo->marker->write_marker_header) (cinfo, marker, datalen);
- write_marker_byte = cinfo->marker->write_marker_byte; /* copy for speed */
- while (datalen--) {
- (*write_marker_byte) (cinfo, *dataptr);
- dataptr++;
- }
-}
-
-/* Same, but piecemeal. */
-
-GLOBAL(void)
-jpeg_write_m_header (j_compress_ptr cinfo, int marker, unsigned int datalen)
-{
- if (cinfo->next_scanline != 0 ||
- (cinfo->global_state != CSTATE_SCANNING &&
- cinfo->global_state != CSTATE_RAW_OK &&
- cinfo->global_state != CSTATE_WRCOEFS))
- ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
-
- (*cinfo->marker->write_marker_header) (cinfo, marker, datalen);
-}
-
-GLOBAL(void)
-jpeg_write_m_byte (j_compress_ptr cinfo, int val)
-{
- (*cinfo->marker->write_marker_byte) (cinfo, val);
-}
-
-
-/*
- * Alternate compression function: just write an abbreviated table file.
- * Before calling this, all parameters and a data destination must be set up.
- *
- * To produce a pair of files containing abbreviated tables and abbreviated
- * image data, one would proceed as follows:
- *
- * initialize JPEG object
- * set JPEG parameters
- * set destination to table file
- * jpeg_write_tables(cinfo);
- * set destination to image file
- * jpeg_start_compress(cinfo, FALSE);
- * write data...
- * jpeg_finish_compress(cinfo);
- *
- * jpeg_write_tables has the side effect of marking all tables written
- * (same as jpeg_suppress_tables(..., TRUE)). Thus a subsequent start_compress
- * will not re-emit the tables unless it is passed write_all_tables=TRUE.
- */
-
-GLOBAL(void)
-jpeg_write_tables (j_compress_ptr cinfo)
-{
- if (cinfo->global_state != CSTATE_START)
- ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
-
- /* (Re)initialize error mgr and destination modules */
- (*cinfo->err->reset_error_mgr) ((j_common_ptr) cinfo);
- (*cinfo->dest->init_destination) (cinfo);
- /* Initialize the marker writer ... bit of a crock to do it here. */
- jinit_marker_writer(cinfo);
- /* Write them tables! */
- (*cinfo->marker->write_tables_only) (cinfo);
- /* And clean up. */
- (*cinfo->dest->term_destination) (cinfo);
- /*
- * In library releases up through v6a, we called jpeg_abort() here to free
- * any working memory allocated by the destination manager and marker
- * writer. Some applications had a problem with that: they allocated space
- * of their own from the library memory manager, and didn't want it to go
- * away during write_tables. So now we do nothing. This will cause a
- * memory leak if an app calls write_tables repeatedly without doing a full
- * compression cycle or otherwise resetting the JPEG object. However, that
- * seems less bad than unexpectedly freeing memory in the normal case.
- * An app that prefers the old behavior can call jpeg_abort for itself after
- * each call to jpeg_write_tables().
- */
-}
-
-#endif //_FX_JPEG_TURBO_
+#if !defined(_FX_JPEG_TURBO_)
+/*
+ * jcapimin.c
+ *
+ * Copyright (C) 1994-1998, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains application interface code for the compression half
+ * of the JPEG library. These are the "minimum" API routines that may be
+ * needed in either the normal full-compression case or the transcoding-only
+ * case.
+ *
+ * Most of the routines intended to be called directly by an application
+ * are in this file or in jcapistd.c. But also see jcparam.c for
+ * parameter-setup helper routines, jcomapi.c for routines shared by
+ * compression and decompression, and jctrans.c for the transcoding case.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+
+
+/*
+ * Initialization of a JPEG compression object.
+ * The error manager must already be set up (in case memory manager fails).
+ */
+
+GLOBAL(void)
+jpeg_CreateCompress (j_compress_ptr cinfo, int version, size_t structsize)
+{
+ int i;
+
+ /* Guard against version mismatches between library and caller. */
+ cinfo->mem = NULL; /* so jpeg_destroy knows mem mgr not called */
+ if (version != JPEG_LIB_VERSION)
+ ERREXIT2(cinfo, JERR_BAD_LIB_VERSION, JPEG_LIB_VERSION, version);
+ if (structsize != SIZEOF(struct jpeg_compress_struct))
+ ERREXIT2(cinfo, JERR_BAD_STRUCT_SIZE,
+ (int) SIZEOF(struct jpeg_compress_struct), (int) structsize);
+
+ /* For debugging purposes, we zero the whole master structure.
+ * But the application has already set the err pointer, and may have set
+ * client_data, so we have to save and restore those fields.
+ * Note: if application hasn't set client_data, tools like Purify may
+ * complain here.
+ */
+ {
+ struct jpeg_error_mgr * err = cinfo->err;
+ void * client_data = cinfo->client_data; /* ignore Purify complaint here */
+ MEMZERO(cinfo, SIZEOF(struct jpeg_compress_struct));
+ cinfo->err = err;
+ cinfo->client_data = client_data;
+ }
+ cinfo->is_decompressor = FALSE;
+
+ /* Initialize a memory manager instance for this object */
+ jinit_memory_mgr((j_common_ptr) cinfo);
+
+ /* Zero out pointers to permanent structures. */
+ cinfo->progress = NULL;
+ cinfo->dest = NULL;
+
+ cinfo->comp_info = NULL;
+
+ for (i = 0; i < NUM_QUANT_TBLS; i++)
+ cinfo->quant_tbl_ptrs[i] = NULL;
+
+ for (i = 0; i < NUM_HUFF_TBLS; i++) {
+ cinfo->dc_huff_tbl_ptrs[i] = NULL;
+ cinfo->ac_huff_tbl_ptrs[i] = NULL;
+ }
+
+ cinfo->script_space = NULL;
+
+ cinfo->input_gamma = 1.0; /* in case application forgets */
+
+ /* OK, I'm ready */
+ cinfo->global_state = CSTATE_START;
+}
+
+
+/*
+ * Destruction of a JPEG compression object
+ */
+
+GLOBAL(void)
+jpeg_destroy_compress (j_compress_ptr cinfo)
+{
+ jpeg_destroy((j_common_ptr) cinfo); /* use common routine */
+}
+
+
+/*
+ * Abort processing of a JPEG compression operation,
+ * but don't destroy the object itself.
+ */
+
+GLOBAL(void)
+jpeg_abort_compress (j_compress_ptr cinfo)
+{
+ jpeg_abort((j_common_ptr) cinfo); /* use common routine */
+}
+
+
+/*
+ * Forcibly suppress or un-suppress all quantization and Huffman tables.
+ * Marks all currently defined tables as already written (if suppress)
+ * or not written (if !suppress). This will control whether they get emitted
+ * by a subsequent jpeg_start_compress call.
+ *
+ * This routine is exported for use by applications that want to produce
+ * abbreviated JPEG datastreams. It logically belongs in jcparam.c, but
+ * since it is called by jpeg_start_compress, we put it here --- otherwise
+ * jcparam.o would be linked whether the application used it or not.
+ */
+
+GLOBAL(void)
+jpeg_suppress_tables (j_compress_ptr cinfo, boolean suppress)
+{
+ int i;
+ JQUANT_TBL * qtbl;
+ JHUFF_TBL * htbl;
+
+ for (i = 0; i < NUM_QUANT_TBLS; i++) {
+ if ((qtbl = cinfo->quant_tbl_ptrs[i]) != NULL)
+ qtbl->sent_table = suppress;
+ }
+
+ for (i = 0; i < NUM_HUFF_TBLS; i++) {
+ if ((htbl = cinfo->dc_huff_tbl_ptrs[i]) != NULL)
+ htbl->sent_table = suppress;
+ if ((htbl = cinfo->ac_huff_tbl_ptrs[i]) != NULL)
+ htbl->sent_table = suppress;
+ }
+}
+
+
+/*
+ * Finish JPEG compression.
+ *
+ * If a multipass operating mode was selected, this may do a great deal of
+ * work including most of the actual output.
+ */
+
+GLOBAL(void)
+jpeg_finish_compress (j_compress_ptr cinfo)
+{
+ JDIMENSION iMCU_row;
+
+ if (cinfo->global_state == CSTATE_SCANNING ||
+ cinfo->global_state == CSTATE_RAW_OK) {
+ /* Terminate first pass */
+ if (cinfo->next_scanline < cinfo->image_height)
+ ERREXIT(cinfo, JERR_TOO_LITTLE_DATA);
+ (*cinfo->master->finish_pass) (cinfo);
+ } else if (cinfo->global_state != CSTATE_WRCOEFS)
+ ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
+ /* Perform any remaining passes */
+ while (! cinfo->master->is_last_pass) {
+ (*cinfo->master->prepare_for_pass) (cinfo);
+ for (iMCU_row = 0; iMCU_row < cinfo->total_iMCU_rows; iMCU_row++) {
+ if (cinfo->progress != NULL) {
+ cinfo->progress->pass_counter = (long) iMCU_row;
+ cinfo->progress->pass_limit = (long) cinfo->total_iMCU_rows;
+ (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);
+ }
+ /* We bypass the main controller and invoke coef controller directly;
+ * all work is being done from the coefficient buffer.
+ */
+ if (! (*cinfo->coef->compress_data) (cinfo, (JSAMPIMAGE) NULL))
+ ERREXIT(cinfo, JERR_CANT_SUSPEND);
+ }
+ (*cinfo->master->finish_pass) (cinfo);
+ }
+ /* Write EOI, do final cleanup */
+ (*cinfo->marker->write_file_trailer) (cinfo);
+ (*cinfo->dest->term_destination) (cinfo);
+ /* We can use jpeg_abort to release memory and reset global_state */
+ jpeg_abort((j_common_ptr) cinfo);
+}
+
+
+/*
+ * Write a special marker.
+ * This is only recommended for writing COM or APPn markers.
+ * Must be called after jpeg_start_compress() and before
+ * first call to jpeg_write_scanlines() or jpeg_write_raw_data().
+ */
+
+GLOBAL(void)
+jpeg_write_marker (j_compress_ptr cinfo, int marker,
+ const JOCTET *dataptr, unsigned int datalen)
+{
+ JMETHOD(void, write_marker_byte, (j_compress_ptr info, int val));
+
+ if (cinfo->next_scanline != 0 ||
+ (cinfo->global_state != CSTATE_SCANNING &&
+ cinfo->global_state != CSTATE_RAW_OK &&
+ cinfo->global_state != CSTATE_WRCOEFS))
+ ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
+
+ (*cinfo->marker->write_marker_header) (cinfo, marker, datalen);
+ write_marker_byte = cinfo->marker->write_marker_byte; /* copy for speed */
+ while (datalen--) {
+ (*write_marker_byte) (cinfo, *dataptr);
+ dataptr++;
+ }
+}
+
+/* Same, but piecemeal. */
+
+GLOBAL(void)
+jpeg_write_m_header (j_compress_ptr cinfo, int marker, unsigned int datalen)
+{
+ if (cinfo->next_scanline != 0 ||
+ (cinfo->global_state != CSTATE_SCANNING &&
+ cinfo->global_state != CSTATE_RAW_OK &&
+ cinfo->global_state != CSTATE_WRCOEFS))
+ ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
+
+ (*cinfo->marker->write_marker_header) (cinfo, marker, datalen);
+}
+
+GLOBAL(void)
+jpeg_write_m_byte (j_compress_ptr cinfo, int val)
+{
+ (*cinfo->marker->write_marker_byte) (cinfo, val);
+}
+
+
+/*
+ * Alternate compression function: just write an abbreviated table file.
+ * Before calling this, all parameters and a data destination must be set up.
+ *
+ * To produce a pair of files containing abbreviated tables and abbreviated
+ * image data, one would proceed as follows:
+ *
+ * initialize JPEG object
+ * set JPEG parameters
+ * set destination to table file
+ * jpeg_write_tables(cinfo);
+ * set destination to image file
+ * jpeg_start_compress(cinfo, FALSE);
+ * write data...
+ * jpeg_finish_compress(cinfo);
+ *
+ * jpeg_write_tables has the side effect of marking all tables written
+ * (same as jpeg_suppress_tables(..., TRUE)). Thus a subsequent start_compress
+ * will not re-emit the tables unless it is passed write_all_tables=TRUE.
+ */
+
+GLOBAL(void)
+jpeg_write_tables (j_compress_ptr cinfo)
+{
+ if (cinfo->global_state != CSTATE_START)
+ ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
+
+ /* (Re)initialize error mgr and destination modules */
+ (*cinfo->err->reset_error_mgr) ((j_common_ptr) cinfo);
+ (*cinfo->dest->init_destination) (cinfo);
+ /* Initialize the marker writer ... bit of a crock to do it here. */
+ jinit_marker_writer(cinfo);
+ /* Write them tables! */
+ (*cinfo->marker->write_tables_only) (cinfo);
+ /* And clean up. */
+ (*cinfo->dest->term_destination) (cinfo);
+ /*
+ * In library releases up through v6a, we called jpeg_abort() here to free
+ * any working memory allocated by the destination manager and marker
+ * writer. Some applications had a problem with that: they allocated space
+ * of their own from the library memory manager, and didn't want it to go
+ * away during write_tables. So now we do nothing. This will cause a
+ * memory leak if an app calls write_tables repeatedly without doing a full
+ * compression cycle or otherwise resetting the JPEG object. However, that
+ * seems less bad than unexpectedly freeing memory in the normal case.
+ * An app that prefers the old behavior can call jpeg_abort for itself after
+ * each call to jpeg_write_tables().
+ */
+}
+
+#endif //_FX_JPEG_TURBO_
diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jcapistd.c b/core/src/fxcodec/libjpeg/fpdfapi_jcapistd.c
index bf13542539..9d765e6f01 100644
--- a/core/src/fxcodec/libjpeg/fpdfapi_jcapistd.c
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jcapistd.c
@@ -1,164 +1,164 @@
-#if !defined(_FX_JPEG_TURBO_)
-/*
- * jcapistd.c
- *
- * Copyright (C) 1994-1996, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains application interface code for the compression half
- * of the JPEG library. These are the "standard" API routines that are
- * used in the normal full-compression case. They are not used by a
- * transcoding-only application. Note that if an application links in
- * jpeg_start_compress, it will end up linking in the entire compressor.
- * We thus must separate this file from jcapimin.c to avoid linking the
- * whole compression library into a transcoder.
- */
-
-#define JPEG_INTERNALS
-#include "jinclude.h"
-#include "jpeglib.h"
-
-
-/*
- * Compression initialization.
- * Before calling this, all parameters and a data destination must be set up.
- *
- * We require a write_all_tables parameter as a failsafe check when writing
- * multiple datastreams from the same compression object. Since prior runs
- * will have left all the tables marked sent_table=TRUE, a subsequent run
- * would emit an abbreviated stream (no tables) by default. This may be what
- * is wanted, but for safety's sake it should not be the default behavior:
- * programmers should have to make a deliberate choice to emit abbreviated
- * images. Therefore the documentation and examples should encourage people
- * to pass write_all_tables=TRUE; then it will take active thought to do the
- * wrong thing.
- */
-
-GLOBAL(void)
-jpeg_start_compress (j_compress_ptr cinfo, boolean write_all_tables)
-{
- if (cinfo->global_state != CSTATE_START)
- ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
-
- if (write_all_tables)
- jpeg_suppress_tables(cinfo, FALSE); /* mark all tables to be written */
-
- /* (Re)initialize error mgr and destination modules */
- (*cinfo->err->reset_error_mgr) ((j_common_ptr) cinfo);
- (*cinfo->dest->init_destination) (cinfo);
- /* Perform master selection of active modules */
- jinit_compress_master(cinfo);
- /* Set up for the first pass */
- (*cinfo->master->prepare_for_pass) (cinfo);
- /* Ready for application to drive first pass through jpeg_write_scanlines
- * or jpeg_write_raw_data.
- */
- cinfo->next_scanline = 0;
- cinfo->global_state = (cinfo->raw_data_in ? CSTATE_RAW_OK : CSTATE_SCANNING);
-}
-
-
-/*
- * Write some scanlines of data to the JPEG compressor.
- *
- * The return value will be the number of lines actually written.
- * This should be less than the supplied num_lines only in case that
- * the data destination module has requested suspension of the compressor,
- * or if more than image_height scanlines are passed in.
- *
- * Note: we warn about excess calls to jpeg_write_scanlines() since
- * this likely signals an application programmer error. However,
- * excess scanlines passed in the last valid call are *silently* ignored,
- * so that the application need not adjust num_lines for end-of-image
- * when using a multiple-scanline buffer.
- */
-
-GLOBAL(JDIMENSION)
-jpeg_write_scanlines (j_compress_ptr cinfo, JSAMPARRAY scanlines,
- JDIMENSION num_lines)
-{
- JDIMENSION row_ctr, rows_left;
-
- if (cinfo->global_state != CSTATE_SCANNING)
- ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
- if (cinfo->next_scanline >= cinfo->image_height)
- WARNMS(cinfo, JWRN_TOO_MUCH_DATA);
-
- /* Call progress monitor hook if present */
- if (cinfo->progress != NULL) {
- cinfo->progress->pass_counter = (long) cinfo->next_scanline;
- cinfo->progress->pass_limit = (long) cinfo->image_height;
- (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);
- }
-
- /* Give master control module another chance if this is first call to
- * jpeg_write_scanlines. This lets output of the frame/scan headers be
- * delayed so that application can write COM, etc, markers between
- * jpeg_start_compress and jpeg_write_scanlines.
- */
- if (cinfo->master->call_pass_startup)
- (*cinfo->master->pass_startup) (cinfo);
-
- /* Ignore any extra scanlines at bottom of image. */
- rows_left = cinfo->image_height - cinfo->next_scanline;
- if (num_lines > rows_left)
- num_lines = rows_left;
-
- row_ctr = 0;
- (*cinfo->main->process_data) (cinfo, scanlines, &row_ctr, num_lines);
- cinfo->next_scanline += row_ctr;
- return row_ctr;
-}
-
-
-/*
- * Alternate entry point to write raw data.
- * Processes exactly one iMCU row per call, unless suspended.
- */
-
-GLOBAL(JDIMENSION)
-jpeg_write_raw_data (j_compress_ptr cinfo, JSAMPIMAGE data,
- JDIMENSION num_lines)
-{
- JDIMENSION lines_per_iMCU_row;
-
- if (cinfo->global_state != CSTATE_RAW_OK)
- ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
- if (cinfo->next_scanline >= cinfo->image_height) {
- WARNMS(cinfo, JWRN_TOO_MUCH_DATA);
- return 0;
- }
-
- /* Call progress monitor hook if present */
- if (cinfo->progress != NULL) {
- cinfo->progress->pass_counter = (long) cinfo->next_scanline;
- cinfo->progress->pass_limit = (long) cinfo->image_height;
- (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);
- }
-
- /* Give master control module another chance if this is first call to
- * jpeg_write_raw_data. This lets output of the frame/scan headers be
- * delayed so that application can write COM, etc, markers between
- * jpeg_start_compress and jpeg_write_raw_data.
- */
- if (cinfo->master->call_pass_startup)
- (*cinfo->master->pass_startup) (cinfo);
-
- /* Verify that at least one iMCU row has been passed. */
- lines_per_iMCU_row = cinfo->max_v_samp_factor * DCTSIZE;
- if (num_lines < lines_per_iMCU_row)
- ERREXIT(cinfo, JERR_BUFFER_SIZE);
-
- /* Directly compress the row. */
- if (! (*cinfo->coef->compress_data) (cinfo, data)) {
- /* If compressor did not consume the whole row, suspend processing. */
- return 0;
- }
-
- /* OK, we processed one iMCU row. */
- cinfo->next_scanline += lines_per_iMCU_row;
- return lines_per_iMCU_row;
-}
-
-#endif //_FX_JPEG_TURBO_
+#if !defined(_FX_JPEG_TURBO_)
+/*
+ * jcapistd.c
+ *
+ * Copyright (C) 1994-1996, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains application interface code for the compression half
+ * of the JPEG library. These are the "standard" API routines that are
+ * used in the normal full-compression case. They are not used by a
+ * transcoding-only application. Note that if an application links in
+ * jpeg_start_compress, it will end up linking in the entire compressor.
+ * We thus must separate this file from jcapimin.c to avoid linking the
+ * whole compression library into a transcoder.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+
+
+/*
+ * Compression initialization.
+ * Before calling this, all parameters and a data destination must be set up.
+ *
+ * We require a write_all_tables parameter as a failsafe check when writing
+ * multiple datastreams from the same compression object. Since prior runs
+ * will have left all the tables marked sent_table=TRUE, a subsequent run
+ * would emit an abbreviated stream (no tables) by default. This may be what
+ * is wanted, but for safety's sake it should not be the default behavior:
+ * programmers should have to make a deliberate choice to emit abbreviated
+ * images. Therefore the documentation and examples should encourage people
+ * to pass write_all_tables=TRUE; then it will take active thought to do the
+ * wrong thing.
+ */
+
+GLOBAL(void)
+jpeg_start_compress (j_compress_ptr cinfo, boolean write_all_tables)
+{
+ if (cinfo->global_state != CSTATE_START)
+ ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
+
+ if (write_all_tables)
+ jpeg_suppress_tables(cinfo, FALSE); /* mark all tables to be written */
+
+ /* (Re)initialize error mgr and destination modules */
+ (*cinfo->err->reset_error_mgr) ((j_common_ptr) cinfo);
+ (*cinfo->dest->init_destination) (cinfo);
+ /* Perform master selection of active modules */
+ jinit_compress_master(cinfo);
+ /* Set up for the first pass */
+ (*cinfo->master->prepare_for_pass) (cinfo);
+ /* Ready for application to drive first pass through jpeg_write_scanlines
+ * or jpeg_write_raw_data.
+ */
+ cinfo->next_scanline = 0;
+ cinfo->global_state = (cinfo->raw_data_in ? CSTATE_RAW_OK : CSTATE_SCANNING);
+}
+
+
+/*
+ * Write some scanlines of data to the JPEG compressor.
+ *
+ * The return value will be the number of lines actually written.
+ * This should be less than the supplied num_lines only in case that
+ * the data destination module has requested suspension of the compressor,
+ * or if more than image_height scanlines are passed in.
+ *
+ * Note: we warn about excess calls to jpeg_write_scanlines() since
+ * this likely signals an application programmer error. However,
+ * excess scanlines passed in the last valid call are *silently* ignored,
+ * so that the application need not adjust num_lines for end-of-image
+ * when using a multiple-scanline buffer.
+ */
+
+GLOBAL(JDIMENSION)
+jpeg_write_scanlines (j_compress_ptr cinfo, JSAMPARRAY scanlines,
+ JDIMENSION num_lines)
+{
+ JDIMENSION row_ctr, rows_left;
+
+ if (cinfo->global_state != CSTATE_SCANNING)
+ ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
+ if (cinfo->next_scanline >= cinfo->image_height)
+ WARNMS(cinfo, JWRN_TOO_MUCH_DATA);
+
+ /* Call progress monitor hook if present */
+ if (cinfo->progress != NULL) {
+ cinfo->progress->pass_counter = (long) cinfo->next_scanline;
+ cinfo->progress->pass_limit = (long) cinfo->image_height;
+ (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);
+ }
+
+ /* Give master control module another chance if this is first call to
+ * jpeg_write_scanlines. This lets output of the frame/scan headers be
+ * delayed so that application can write COM, etc, markers between
+ * jpeg_start_compress and jpeg_write_scanlines.
+ */
+ if (cinfo->master->call_pass_startup)
+ (*cinfo->master->pass_startup) (cinfo);
+
+ /* Ignore any extra scanlines at bottom of image. */
+ rows_left = cinfo->image_height - cinfo->next_scanline;
+ if (num_lines > rows_left)
+ num_lines = rows_left;
+
+ row_ctr = 0;
+ (*cinfo->main->process_data) (cinfo, scanlines, &row_ctr, num_lines);
+ cinfo->next_scanline += row_ctr;
+ return row_ctr;
+}
+
+
+/*
+ * Alternate entry point to write raw data.
+ * Processes exactly one iMCU row per call, unless suspended.
+ */
+
+GLOBAL(JDIMENSION)
+jpeg_write_raw_data (j_compress_ptr cinfo, JSAMPIMAGE data,
+ JDIMENSION num_lines)
+{
+ JDIMENSION lines_per_iMCU_row;
+
+ if (cinfo->global_state != CSTATE_RAW_OK)
+ ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
+ if (cinfo->next_scanline >= cinfo->image_height) {
+ WARNMS(cinfo, JWRN_TOO_MUCH_DATA);
+ return 0;
+ }
+
+ /* Call progress monitor hook if present */
+ if (cinfo->progress != NULL) {
+ cinfo->progress->pass_counter = (long) cinfo->next_scanline;
+ cinfo->progress->pass_limit = (long) cinfo->image_height;
+ (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);
+ }
+
+ /* Give master control module another chance if this is first call to
+ * jpeg_write_raw_data. This lets output of the frame/scan headers be
+ * delayed so that application can write COM, etc, markers between
+ * jpeg_start_compress and jpeg_write_raw_data.
+ */
+ if (cinfo->master->call_pass_startup)
+ (*cinfo->master->pass_startup) (cinfo);
+
+ /* Verify that at least one iMCU row has been passed. */
+ lines_per_iMCU_row = cinfo->max_v_samp_factor * DCTSIZE;
+ if (num_lines < lines_per_iMCU_row)
+ ERREXIT(cinfo, JERR_BUFFER_SIZE);
+
+ /* Directly compress the row. */
+ if (! (*cinfo->coef->compress_data) (cinfo, data)) {
+ /* If compressor did not consume the whole row, suspend processing. */
+ return 0;
+ }
+
+ /* OK, we processed one iMCU row. */
+ cinfo->next_scanline += lines_per_iMCU_row;
+ return lines_per_iMCU_row;
+}
+
+#endif //_FX_JPEG_TURBO_
diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jccoefct.c b/core/src/fxcodec/libjpeg/fpdfapi_jccoefct.c
index ea2a4a6cbb..08910ef6f3 100644
--- a/core/src/fxcodec/libjpeg/fpdfapi_jccoefct.c
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jccoefct.c
@@ -1,452 +1,452 @@
-#if !defined(_FX_JPEG_TURBO_)
-/*
- * jccoefct.c
- *
- * Copyright (C) 1994-1997, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains the coefficient buffer controller for compression.
- * This controller is the top level of the JPEG compressor proper.
- * The coefficient buffer lies between forward-DCT and entropy encoding steps.
- */
-
-#define JPEG_INTERNALS
-#include "jinclude.h"
-#include "jpeglib.h"
-
-
-/* We use a full-image coefficient buffer when doing Huffman optimization,
- * and also for writing multiple-scan JPEG files. In all cases, the DCT
- * step is run during the first pass, and subsequent passes need only read
- * the buffered coefficients.
- */
-#ifdef ENTROPY_OPT_SUPPORTED
-#define FULL_COEF_BUFFER_SUPPORTED
-#else
-#ifdef C_MULTISCAN_FILES_SUPPORTED
-#define FULL_COEF_BUFFER_SUPPORTED
-#endif
-#endif
-
-
-/* Private buffer controller object */
-
-typedef struct {
- struct jpeg_c_coef_controller pub; /* public fields */
-
- JDIMENSION iMCU_row_num; /* iMCU row # within image */
- JDIMENSION mcu_ctr; /* counts MCUs processed in current row */
- int MCU_vert_offset; /* counts MCU rows within iMCU row */
- int MCU_rows_per_iMCU_row; /* number of such rows needed */
-
- /* For single-pass compression, it's sufficient to buffer just one MCU
- * (although this may prove a bit slow in practice). We allocate a
- * workspace of C_MAX_BLOCKS_IN_MCU coefficient blocks, and reuse it for each
- * MCU constructed and sent. (On 80x86, the workspace is FAR even though
- * it's not really very big; this is to keep the module interfaces unchanged
- * when a large coefficient buffer is necessary.)
- * In multi-pass modes, this array points to the current MCU's blocks
- * within the virtual arrays.
- */
- JBLOCKROW MCU_buffer[C_MAX_BLOCKS_IN_MCU];
-
- /* In multi-pass modes, we need a virtual block array for each component. */
- jvirt_barray_ptr whole_image[MAX_COMPONENTS];
-} my_coef_controller;
-
-typedef my_coef_controller * my_coef_ptr;
-
-
-/* Forward declarations */
-METHODDEF(boolean) compress_data
- JPP((j_compress_ptr cinfo, JSAMPIMAGE input_buf));
-#ifdef FULL_COEF_BUFFER_SUPPORTED
-METHODDEF(boolean) compress_first_pass
- JPP((j_compress_ptr cinfo, JSAMPIMAGE input_buf));
-METHODDEF(boolean) compress_output
- JPP((j_compress_ptr cinfo, JSAMPIMAGE input_buf));
-#endif
-
-
-LOCAL(void)
-start_iMCU_row (j_compress_ptr cinfo)
-/* Reset within-iMCU-row counters for a new row */
-{
- my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
-
- /* In an interleaved scan, an MCU row is the same as an iMCU row.
- * In a noninterleaved scan, an iMCU row has v_samp_factor MCU rows.
- * But at the bottom of the image, process only what's left.
- */
- if (cinfo->comps_in_scan > 1) {
- coef->MCU_rows_per_iMCU_row = 1;
- } else {
- if (coef->iMCU_row_num < (cinfo->total_iMCU_rows-1))
- coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->v_samp_factor;
- else
- coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->last_row_height;
- }
-
- coef->mcu_ctr = 0;
- coef->MCU_vert_offset = 0;
-}
-
-
-/*
- * Initialize for a processing pass.
- */
-
-METHODDEF(void)
-start_pass_coef (j_compress_ptr cinfo, J_BUF_MODE pass_mode)
-{
- my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
-
- coef->iMCU_row_num = 0;
- start_iMCU_row(cinfo);
-
- switch (pass_mode) {
- case JBUF_PASS_THRU:
- if (coef->whole_image[0] != NULL)
- ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
- coef->pub.compress_data = compress_data;
- break;
-#ifdef FULL_COEF_BUFFER_SUPPORTED
- case JBUF_SAVE_AND_PASS:
- if (coef->whole_image[0] == NULL)
- ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
- coef->pub.compress_data = compress_first_pass;
- break;
- case JBUF_CRANK_DEST:
- if (coef->whole_image[0] == NULL)
- ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
- coef->pub.compress_data = compress_output;
- break;
-#endif
- default:
- ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
- break;
- }
-}
-
-
-/*
- * Process some data in the single-pass case.
- * We process the equivalent of one fully interleaved MCU row ("iMCU" row)
- * per call, ie, v_samp_factor block rows for each component in the image.
- * Returns TRUE if the iMCU row is completed, FALSE if suspended.
- *
- * NB: input_buf contains a plane for each component in image,
- * which we index according to the component's SOF position.
- */
-
-METHODDEF(boolean)
-compress_data (j_compress_ptr cinfo, JSAMPIMAGE input_buf)
-{
- my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
- JDIMENSION MCU_col_num; /* index of current MCU within row */
- JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;
- JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
- int blkn, bi, ci, yindex, yoffset, blockcnt;
- JDIMENSION ypos, xpos;
- jpeg_component_info *compptr;
-
- /* Loop to write as much as one whole iMCU row */
- for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
- yoffset++) {
- for (MCU_col_num = coef->mcu_ctr; MCU_col_num <= last_MCU_col;
- MCU_col_num++) {
- /* Determine where data comes from in input_buf and do the DCT thing.
- * Each call on forward_DCT processes a horizontal row of DCT blocks
- * as wide as an MCU; we rely on having allocated the MCU_buffer[] blocks
- * sequentially. Dummy blocks at the right or bottom edge are filled in
- * specially. The data in them does not matter for image reconstruction,
- * so we fill them with values that will encode to the smallest amount of
- * data, viz: all zeroes in the AC entries, DC entries equal to previous
- * block's DC value. (Thanks to Thomas Kinsman for this idea.)
- */
- blkn = 0;
- for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
- compptr = cinfo->cur_comp_info[ci];
- blockcnt = (MCU_col_num < last_MCU_col) ? compptr->MCU_width
- : compptr->last_col_width;
- xpos = MCU_col_num * compptr->MCU_sample_width;
- ypos = yoffset * DCTSIZE; /* ypos == (yoffset+yindex) * DCTSIZE */
- for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
- if (coef->iMCU_row_num < last_iMCU_row ||
- yoffset+yindex < compptr->last_row_height) {
- (*cinfo->fdct->forward_DCT) (cinfo, compptr,
- input_buf[compptr->component_index],
- coef->MCU_buffer[blkn],
- ypos, xpos, (JDIMENSION) blockcnt);
- if (blockcnt < compptr->MCU_width) {
- /* Create some dummy blocks at the right edge of the image. */
- jzero_far((void FAR *) coef->MCU_buffer[blkn + blockcnt],
- (compptr->MCU_width - blockcnt) * SIZEOF(JBLOCK));
- for (bi = blockcnt; bi < compptr->MCU_width; bi++) {
- coef->MCU_buffer[blkn+bi][0][0] = coef->MCU_buffer[blkn+bi-1][0][0];
- }
- }
- } else {
- /* Create a row of dummy blocks at the bottom of the image. */
- jzero_far((void FAR *) coef->MCU_buffer[blkn],
- compptr->MCU_width * SIZEOF(JBLOCK));
- for (bi = 0; bi < compptr->MCU_width; bi++) {
- coef->MCU_buffer[blkn+bi][0][0] = coef->MCU_buffer[blkn-1][0][0];
- }
- }
- blkn += compptr->MCU_width;
- ypos += DCTSIZE;
- }
- }
- /* Try to write the MCU. In event of a suspension failure, we will
- * re-DCT the MCU on restart (a bit inefficient, could be fixed...)
- */
- if (! (*cinfo->entropy->encode_mcu) (cinfo, coef->MCU_buffer)) {
- /* Suspension forced; update state counters and exit */
- coef->MCU_vert_offset = yoffset;
- coef->mcu_ctr = MCU_col_num;
- return FALSE;
- }
- }
- /* Completed an MCU row, but perhaps not an iMCU row */
- coef->mcu_ctr = 0;
- }
- /* Completed the iMCU row, advance counters for next one */
- coef->iMCU_row_num++;
- start_iMCU_row(cinfo);
- return TRUE;
-}
-
-
-#ifdef FULL_COEF_BUFFER_SUPPORTED
-
-/*
- * Process some data in the first pass of a multi-pass case.
- * We process the equivalent of one fully interleaved MCU row ("iMCU" row)
- * per call, ie, v_samp_factor block rows for each component in the image.
- * This amount of data is read from the source buffer, DCT'd and quantized,
- * and saved into the virtual arrays. We also generate suitable dummy blocks
- * as needed at the right and lower edges. (The dummy blocks are constructed
- * in the virtual arrays, which have been padded appropriately.) This makes
- * it possible for subsequent passes not to worry about real vs. dummy blocks.
- *
- * We must also emit the data to the entropy encoder. This is conveniently
- * done by calling compress_output() after we've loaded the current strip
- * of the virtual arrays.
- *
- * NB: input_buf contains a plane for each component in image. All
- * components are DCT'd and loaded into the virtual arrays in this pass.
- * However, it may be that only a subset of the components are emitted to
- * the entropy encoder during this first pass; be careful about looking
- * at the scan-dependent variables (MCU dimensions, etc).
- */
-
-METHODDEF(boolean)
-compress_first_pass (j_compress_ptr cinfo, JSAMPIMAGE input_buf)
-{
- my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
- JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
- JDIMENSION blocks_across, MCUs_across, MCUindex;
- int bi, ci, h_samp_factor, block_row, block_rows, ndummy;
- JCOEF lastDC;
- jpeg_component_info *compptr;
- JBLOCKARRAY buffer;
- JBLOCKROW thisblockrow, lastblockrow;
-
- for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
- ci++, compptr++) {
- /* Align the virtual buffer for this component. */
- buffer = (*cinfo->mem->access_virt_barray)
- ((j_common_ptr) cinfo, coef->whole_image[ci],
- coef->iMCU_row_num * compptr->v_samp_factor,
- (JDIMENSION) compptr->v_samp_factor, TRUE);
- /* Count non-dummy DCT block rows in this iMCU row. */
- if (coef->iMCU_row_num < last_iMCU_row)
- block_rows = compptr->v_samp_factor;
- else {
- /* NB: can't use last_row_height here, since may not be set! */
- block_rows = (int) (compptr->height_in_blocks % compptr->v_samp_factor);
- if (block_rows == 0) block_rows = compptr->v_samp_factor;
- }
- blocks_across = compptr->width_in_blocks;
- h_samp_factor = compptr->h_samp_factor;
- /* Count number of dummy blocks to be added at the right margin. */
- ndummy = (int) (blocks_across % h_samp_factor);
- if (ndummy > 0)
- ndummy = h_samp_factor - ndummy;
- /* Perform DCT for all non-dummy blocks in this iMCU row. Each call
- * on forward_DCT processes a complete horizontal row of DCT blocks.
- */
- for (block_row = 0; block_row < block_rows; block_row++) {
- thisblockrow = buffer[block_row];
- (*cinfo->fdct->forward_DCT) (cinfo, compptr,
- input_buf[ci], thisblockrow,
- (JDIMENSION) (block_row * DCTSIZE),
- (JDIMENSION) 0, blocks_across);
- if (ndummy > 0) {
- /* Create dummy blocks at the right edge of the image. */
- thisblockrow += blocks_across; /* => first dummy block */
- jzero_far((void FAR *) thisblockrow, ndummy * SIZEOF(JBLOCK));
- lastDC = thisblockrow[-1][0];
- for (bi = 0; bi < ndummy; bi++) {
- thisblockrow[bi][0] = lastDC;
- }
- }
- }
- /* If at end of image, create dummy block rows as needed.
- * The tricky part here is that within each MCU, we want the DC values
- * of the dummy blocks to match the last real block's DC value.
- * This squeezes a few more bytes out of the resulting file...
- */
- if (coef->iMCU_row_num == last_iMCU_row) {
- blocks_across += ndummy; /* include lower right corner */
- MCUs_across = blocks_across / h_samp_factor;
- for (block_row = block_rows; block_row < compptr->v_samp_factor;
- block_row++) {
- thisblockrow = buffer[block_row];
- lastblockrow = buffer[block_row-1];
- jzero_far((void FAR *) thisblockrow,
- (size_t) (blocks_across * SIZEOF(JBLOCK)));
- for (MCUindex = 0; MCUindex < MCUs_across; MCUindex++) {
- lastDC = lastblockrow[h_samp_factor-1][0];
- for (bi = 0; bi < h_samp_factor; bi++) {
- thisblockrow[bi][0] = lastDC;
- }
- thisblockrow += h_samp_factor; /* advance to next MCU in row */
- lastblockrow += h_samp_factor;
- }
- }
- }
- }
- /* NB: compress_output will increment iMCU_row_num if successful.
- * A suspension return will result in redoing all the work above next time.
- */
-
- /* Emit data to the entropy encoder, sharing code with subsequent passes */
- return compress_output(cinfo, input_buf);
-}
-
-
-/*
- * Process some data in subsequent passes of a multi-pass case.
- * We process the equivalent of one fully interleaved MCU row ("iMCU" row)
- * per call, ie, v_samp_factor block rows for each component in the scan.
- * The data is obtained from the virtual arrays and fed to the entropy coder.
- * Returns TRUE if the iMCU row is completed, FALSE if suspended.
- *
- * NB: input_buf is ignored; it is likely to be a NULL pointer.
- */
-
-METHODDEF(boolean)
-compress_output (j_compress_ptr cinfo, JSAMPIMAGE input_buf)
-{
- my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
- JDIMENSION MCU_col_num; /* index of current MCU within row */
- int blkn, ci, xindex, yindex, yoffset;
- JDIMENSION start_col;
- JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
- JBLOCKROW buffer_ptr;
- jpeg_component_info *compptr;
-
- /* Align the virtual buffers for the components used in this scan.
- * NB: during first pass, this is safe only because the buffers will
- * already be aligned properly, so jmemmgr.c won't need to do any I/O.
- */
- for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
- compptr = cinfo->cur_comp_info[ci];
- buffer[ci] = (*cinfo->mem->access_virt_barray)
- ((j_common_ptr) cinfo, coef->whole_image[compptr->component_index],
- coef->iMCU_row_num * compptr->v_samp_factor,
- (JDIMENSION) compptr->v_samp_factor, FALSE);
- }
-
- /* Loop to process one whole iMCU row */
- for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
- yoffset++) {
- for (MCU_col_num = coef->mcu_ctr; MCU_col_num < cinfo->MCUs_per_row;
- MCU_col_num++) {
- /* Construct list of pointers to DCT blocks belonging to this MCU */
- blkn = 0; /* index of current DCT block within MCU */
- for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
- compptr = cinfo->cur_comp_info[ci];
- start_col = MCU_col_num * compptr->MCU_width;
- for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
- buffer_ptr = buffer[ci][yindex+yoffset] + start_col;
- for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
- coef->MCU_buffer[blkn++] = buffer_ptr++;
- }
- }
- }
- /* Try to write the MCU. */
- if (! (*cinfo->entropy->encode_mcu) (cinfo, coef->MCU_buffer)) {
- /* Suspension forced; update state counters and exit */
- coef->MCU_vert_offset = yoffset;
- coef->mcu_ctr = MCU_col_num;
- return FALSE;
- }
- }
- /* Completed an MCU row, but perhaps not an iMCU row */
- coef->mcu_ctr = 0;
- }
- /* Completed the iMCU row, advance counters for next one */
- coef->iMCU_row_num++;
- start_iMCU_row(cinfo);
- return TRUE;
-}
-
-#endif /* FULL_COEF_BUFFER_SUPPORTED */
-
-
-/*
- * Initialize coefficient buffer controller.
- */
-
-GLOBAL(void)
-jinit_c_coef_controller (j_compress_ptr cinfo, boolean need_full_buffer)
-{
- my_coef_ptr coef;
-
- coef = (my_coef_ptr)
- (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
- SIZEOF(my_coef_controller));
- cinfo->coef = (struct jpeg_c_coef_controller *) coef;
- coef->pub.start_pass = start_pass_coef;
-
- /* Create the coefficient buffer. */
- if (need_full_buffer) {
-#ifdef FULL_COEF_BUFFER_SUPPORTED
- /* Allocate a full-image virtual array for each component, */
- /* padded to a multiple of samp_factor DCT blocks in each direction. */
- int ci;
- jpeg_component_info *compptr;
-
- for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
- ci++, compptr++) {
- coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
- ((j_common_ptr) cinfo, JPOOL_IMAGE, FALSE,
- (JDIMENSION) jround_up((long) compptr->width_in_blocks,
- (long) compptr->h_samp_factor),
- (JDIMENSION) jround_up((long) compptr->height_in_blocks,
- (long) compptr->v_samp_factor),
- (JDIMENSION) compptr->v_samp_factor);
- }
-#else
- ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
-#endif
- } else {
- /* We only need a single-MCU buffer. */
- JBLOCKROW buffer;
- int i;
-
- buffer = (JBLOCKROW)
- (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE,
- C_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK));
- for (i = 0; i < C_MAX_BLOCKS_IN_MCU; i++) {
- coef->MCU_buffer[i] = buffer + i;
- }
- coef->whole_image[0] = NULL; /* flag for no virtual arrays */
- }
-}
-
-#endif //_FX_JPEG_TURBO_
+#if !defined(_FX_JPEG_TURBO_)
+/*
+ * jccoefct.c
+ *
+ * Copyright (C) 1994-1997, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains the coefficient buffer controller for compression.
+ * This controller is the top level of the JPEG compressor proper.
+ * The coefficient buffer lies between forward-DCT and entropy encoding steps.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+
+
+/* We use a full-image coefficient buffer when doing Huffman optimization,
+ * and also for writing multiple-scan JPEG files. In all cases, the DCT
+ * step is run during the first pass, and subsequent passes need only read
+ * the buffered coefficients.
+ */
+#ifdef ENTROPY_OPT_SUPPORTED
+#define FULL_COEF_BUFFER_SUPPORTED
+#else
+#ifdef C_MULTISCAN_FILES_SUPPORTED
+#define FULL_COEF_BUFFER_SUPPORTED
+#endif
+#endif
+
+
+/* Private buffer controller object */
+
+typedef struct {
+ struct jpeg_c_coef_controller pub; /* public fields */
+
+ JDIMENSION iMCU_row_num; /* iMCU row # within image */
+ JDIMENSION mcu_ctr; /* counts MCUs processed in current row */
+ int MCU_vert_offset; /* counts MCU rows within iMCU row */
+ int MCU_rows_per_iMCU_row; /* number of such rows needed */
+
+ /* For single-pass compression, it's sufficient to buffer just one MCU
+ * (although this may prove a bit slow in practice). We allocate a
+ * workspace of C_MAX_BLOCKS_IN_MCU coefficient blocks, and reuse it for each
+ * MCU constructed and sent. (On 80x86, the workspace is FAR even though
+ * it's not really very big; this is to keep the module interfaces unchanged
+ * when a large coefficient buffer is necessary.)
+ * In multi-pass modes, this array points to the current MCU's blocks
+ * within the virtual arrays.
+ */
+ JBLOCKROW MCU_buffer[C_MAX_BLOCKS_IN_MCU];
+
+ /* In multi-pass modes, we need a virtual block array for each component. */
+ jvirt_barray_ptr whole_image[MAX_COMPONENTS];
+} my_coef_controller;
+
+typedef my_coef_controller * my_coef_ptr;
+
+
+/* Forward declarations */
+METHODDEF(boolean) compress_data
+ JPP((j_compress_ptr cinfo, JSAMPIMAGE input_buf));
+#ifdef FULL_COEF_BUFFER_SUPPORTED
+METHODDEF(boolean) compress_first_pass
+ JPP((j_compress_ptr cinfo, JSAMPIMAGE input_buf));
+METHODDEF(boolean) compress_output
+ JPP((j_compress_ptr cinfo, JSAMPIMAGE input_buf));
+#endif
+
+
+LOCAL(void)
+start_iMCU_row (j_compress_ptr cinfo)
+/* Reset within-iMCU-row counters for a new row */
+{
+ my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
+
+ /* In an interleaved scan, an MCU row is the same as an iMCU row.
+ * In a noninterleaved scan, an iMCU row has v_samp_factor MCU rows.
+ * But at the bottom of the image, process only what's left.
+ */
+ if (cinfo->comps_in_scan > 1) {
+ coef->MCU_rows_per_iMCU_row = 1;
+ } else {
+ if (coef->iMCU_row_num < (cinfo->total_iMCU_rows-1))
+ coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->v_samp_factor;
+ else
+ coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->last_row_height;
+ }
+
+ coef->mcu_ctr = 0;
+ coef->MCU_vert_offset = 0;
+}
+
+
+/*
+ * Initialize for a processing pass.
+ */
+
+METHODDEF(void)
+start_pass_coef (j_compress_ptr cinfo, J_BUF_MODE pass_mode)
+{
+ my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
+
+ coef->iMCU_row_num = 0;
+ start_iMCU_row(cinfo);
+
+ switch (pass_mode) {
+ case JBUF_PASS_THRU:
+ if (coef->whole_image[0] != NULL)
+ ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
+ coef->pub.compress_data = compress_data;
+ break;
+#ifdef FULL_COEF_BUFFER_SUPPORTED
+ case JBUF_SAVE_AND_PASS:
+ if (coef->whole_image[0] == NULL)
+ ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
+ coef->pub.compress_data = compress_first_pass;
+ break;
+ case JBUF_CRANK_DEST:
+ if (coef->whole_image[0] == NULL)
+ ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
+ coef->pub.compress_data = compress_output;
+ break;
+#endif
+ default:
+ ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
+ break;
+ }
+}
+
+
+/*
+ * Process some data in the single-pass case.
+ * We process the equivalent of one fully interleaved MCU row ("iMCU" row)
+ * per call, ie, v_samp_factor block rows for each component in the image.
+ * Returns TRUE if the iMCU row is completed, FALSE if suspended.
+ *
+ * NB: input_buf contains a plane for each component in image,
+ * which we index according to the component's SOF position.
+ */
+
+METHODDEF(boolean)
+compress_data (j_compress_ptr cinfo, JSAMPIMAGE input_buf)
+{
+ my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
+ JDIMENSION MCU_col_num; /* index of current MCU within row */
+ JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;
+ JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
+ int blkn, bi, ci, yindex, yoffset, blockcnt;
+ JDIMENSION ypos, xpos;
+ jpeg_component_info *compptr;
+
+ /* Loop to write as much as one whole iMCU row */
+ for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
+ yoffset++) {
+ for (MCU_col_num = coef->mcu_ctr; MCU_col_num <= last_MCU_col;
+ MCU_col_num++) {
+ /* Determine where data comes from in input_buf and do the DCT thing.
+ * Each call on forward_DCT processes a horizontal row of DCT blocks
+ * as wide as an MCU; we rely on having allocated the MCU_buffer[] blocks
+ * sequentially. Dummy blocks at the right or bottom edge are filled in
+ * specially. The data in them does not matter for image reconstruction,
+ * so we fill them with values that will encode to the smallest amount of
+ * data, viz: all zeroes in the AC entries, DC entries equal to previous
+ * block's DC value. (Thanks to Thomas Kinsman for this idea.)
+ */
+ blkn = 0;
+ for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
+ compptr = cinfo->cur_comp_info[ci];
+ blockcnt = (MCU_col_num < last_MCU_col) ? compptr->MCU_width
+ : compptr->last_col_width;
+ xpos = MCU_col_num * compptr->MCU_sample_width;
+ ypos = yoffset * DCTSIZE; /* ypos == (yoffset+yindex) * DCTSIZE */
+ for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
+ if (coef->iMCU_row_num < last_iMCU_row ||
+ yoffset+yindex < compptr->last_row_height) {
+ (*cinfo->fdct->forward_DCT) (cinfo, compptr,
+ input_buf[compptr->component_index],
+ coef->MCU_buffer[blkn],
+ ypos, xpos, (JDIMENSION) blockcnt);
+ if (blockcnt < compptr->MCU_width) {
+ /* Create some dummy blocks at the right edge of the image. */
+ jzero_far((void FAR *) coef->MCU_buffer[blkn + blockcnt],
+ (compptr->MCU_width - blockcnt) * SIZEOF(JBLOCK));
+ for (bi = blockcnt; bi < compptr->MCU_width; bi++) {
+ coef->MCU_buffer[blkn+bi][0][0] = coef->MCU_buffer[blkn+bi-1][0][0];
+ }
+ }
+ } else {
+ /* Create a row of dummy blocks at the bottom of the image. */
+ jzero_far((void FAR *) coef->MCU_buffer[blkn],
+ compptr->MCU_width * SIZEOF(JBLOCK));
+ for (bi = 0; bi < compptr->MCU_width; bi++) {
+ coef->MCU_buffer[blkn+bi][0][0] = coef->MCU_buffer[blkn-1][0][0];
+ }
+ }
+ blkn += compptr->MCU_width;
+ ypos += DCTSIZE;
+ }
+ }
+ /* Try to write the MCU. In event of a suspension failure, we will
+ * re-DCT the MCU on restart (a bit inefficient, could be fixed...)
+ */
+ if (! (*cinfo->entropy->encode_mcu) (cinfo, coef->MCU_buffer)) {
+ /* Suspension forced; update state counters and exit */
+ coef->MCU_vert_offset = yoffset;
+ coef->mcu_ctr = MCU_col_num;
+ return FALSE;
+ }
+ }
+ /* Completed an MCU row, but perhaps not an iMCU row */
+ coef->mcu_ctr = 0;
+ }
+ /* Completed the iMCU row, advance counters for next one */
+ coef->iMCU_row_num++;
+ start_iMCU_row(cinfo);
+ return TRUE;
+}
+
+
+#ifdef FULL_COEF_BUFFER_SUPPORTED
+
+/*
+ * Process some data in the first pass of a multi-pass case.
+ * We process the equivalent of one fully interleaved MCU row ("iMCU" row)
+ * per call, ie, v_samp_factor block rows for each component in the image.
+ * This amount of data is read from the source buffer, DCT'd and quantized,
+ * and saved into the virtual arrays. We also generate suitable dummy blocks
+ * as needed at the right and lower edges. (The dummy blocks are constructed
+ * in the virtual arrays, which have been padded appropriately.) This makes
+ * it possible for subsequent passes not to worry about real vs. dummy blocks.
+ *
+ * We must also emit the data to the entropy encoder. This is conveniently
+ * done by calling compress_output() after we've loaded the current strip
+ * of the virtual arrays.
+ *
+ * NB: input_buf contains a plane for each component in image. All
+ * components are DCT'd and loaded into the virtual arrays in this pass.
+ * However, it may be that only a subset of the components are emitted to
+ * the entropy encoder during this first pass; be careful about looking
+ * at the scan-dependent variables (MCU dimensions, etc).
+ */
+
+METHODDEF(boolean)
+compress_first_pass (j_compress_ptr cinfo, JSAMPIMAGE input_buf)
+{
+ my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
+ JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
+ JDIMENSION blocks_across, MCUs_across, MCUindex;
+ int bi, ci, h_samp_factor, block_row, block_rows, ndummy;
+ JCOEF lastDC;
+ jpeg_component_info *compptr;
+ JBLOCKARRAY buffer;
+ JBLOCKROW thisblockrow, lastblockrow;
+
+ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+ ci++, compptr++) {
+ /* Align the virtual buffer for this component. */
+ buffer = (*cinfo->mem->access_virt_barray)
+ ((j_common_ptr) cinfo, coef->whole_image[ci],
+ coef->iMCU_row_num * compptr->v_samp_factor,
+ (JDIMENSION) compptr->v_samp_factor, TRUE);
+ /* Count non-dummy DCT block rows in this iMCU row. */
+ if (coef->iMCU_row_num < last_iMCU_row)
+ block_rows = compptr->v_samp_factor;
+ else {
+ /* NB: can't use last_row_height here, since may not be set! */
+ block_rows = (int) (compptr->height_in_blocks % compptr->v_samp_factor);
+ if (block_rows == 0) block_rows = compptr->v_samp_factor;
+ }
+ blocks_across = compptr->width_in_blocks;
+ h_samp_factor = compptr->h_samp_factor;
+ /* Count number of dummy blocks to be added at the right margin. */
+ ndummy = (int) (blocks_across % h_samp_factor);
+ if (ndummy > 0)
+ ndummy = h_samp_factor - ndummy;
+ /* Perform DCT for all non-dummy blocks in this iMCU row. Each call
+ * on forward_DCT processes a complete horizontal row of DCT blocks.
+ */
+ for (block_row = 0; block_row < block_rows; block_row++) {
+ thisblockrow = buffer[block_row];
+ (*cinfo->fdct->forward_DCT) (cinfo, compptr,
+ input_buf[ci], thisblockrow,
+ (JDIMENSION) (block_row * DCTSIZE),
+ (JDIMENSION) 0, blocks_across);
+ if (ndummy > 0) {
+ /* Create dummy blocks at the right edge of the image. */
+ thisblockrow += blocks_across; /* => first dummy block */
+ jzero_far((void FAR *) thisblockrow, ndummy * SIZEOF(JBLOCK));
+ lastDC = thisblockrow[-1][0];
+ for (bi = 0; bi < ndummy; bi++) {
+ thisblockrow[bi][0] = lastDC;
+ }
+ }
+ }
+ /* If at end of image, create dummy block rows as needed.
+ * The tricky part here is that within each MCU, we want the DC values
+ * of the dummy blocks to match the last real block's DC value.
+ * This squeezes a few more bytes out of the resulting file...
+ */
+ if (coef->iMCU_row_num == last_iMCU_row) {
+ blocks_across += ndummy; /* include lower right corner */
+ MCUs_across = blocks_across / h_samp_factor;
+ for (block_row = block_rows; block_row < compptr->v_samp_factor;
+ block_row++) {
+ thisblockrow = buffer[block_row];
+ lastblockrow = buffer[block_row-1];
+ jzero_far((void FAR *) thisblockrow,
+ (size_t) (blocks_across * SIZEOF(JBLOCK)));
+ for (MCUindex = 0; MCUindex < MCUs_across; MCUindex++) {
+ lastDC = lastblockrow[h_samp_factor-1][0];
+ for (bi = 0; bi < h_samp_factor; bi++) {
+ thisblockrow[bi][0] = lastDC;
+ }
+ thisblockrow += h_samp_factor; /* advance to next MCU in row */
+ lastblockrow += h_samp_factor;
+ }
+ }
+ }
+ }
+ /* NB: compress_output will increment iMCU_row_num if successful.
+ * A suspension return will result in redoing all the work above next time.
+ */
+
+ /* Emit data to the entropy encoder, sharing code with subsequent passes */
+ return compress_output(cinfo, input_buf);
+}
+
+
+/*
+ * Process some data in subsequent passes of a multi-pass case.
+ * We process the equivalent of one fully interleaved MCU row ("iMCU" row)
+ * per call, ie, v_samp_factor block rows for each component in the scan.
+ * The data is obtained from the virtual arrays and fed to the entropy coder.
+ * Returns TRUE if the iMCU row is completed, FALSE if suspended.
+ *
+ * NB: input_buf is ignored; it is likely to be a NULL pointer.
+ */
+
+METHODDEF(boolean)
+compress_output (j_compress_ptr cinfo, JSAMPIMAGE input_buf)
+{
+ my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
+ JDIMENSION MCU_col_num; /* index of current MCU within row */
+ int blkn, ci, xindex, yindex, yoffset;
+ JDIMENSION start_col;
+ JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
+ JBLOCKROW buffer_ptr;
+ jpeg_component_info *compptr;
+
+ /* Align the virtual buffers for the components used in this scan.
+ * NB: during first pass, this is safe only because the buffers will
+ * already be aligned properly, so jmemmgr.c won't need to do any I/O.
+ */
+ for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
+ compptr = cinfo->cur_comp_info[ci];
+ buffer[ci] = (*cinfo->mem->access_virt_barray)
+ ((j_common_ptr) cinfo, coef->whole_image[compptr->component_index],
+ coef->iMCU_row_num * compptr->v_samp_factor,
+ (JDIMENSION) compptr->v_samp_factor, FALSE);
+ }
+
+ /* Loop to process one whole iMCU row */
+ for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
+ yoffset++) {
+ for (MCU_col_num = coef->mcu_ctr; MCU_col_num < cinfo->MCUs_per_row;
+ MCU_col_num++) {
+ /* Construct list of pointers to DCT blocks belonging to this MCU */
+ blkn = 0; /* index of current DCT block within MCU */
+ for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
+ compptr = cinfo->cur_comp_info[ci];
+ start_col = MCU_col_num * compptr->MCU_width;
+ for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
+ buffer_ptr = buffer[ci][yindex+yoffset] + start_col;
+ for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
+ coef->MCU_buffer[blkn++] = buffer_ptr++;
+ }
+ }
+ }
+ /* Try to write the MCU. */
+ if (! (*cinfo->entropy->encode_mcu) (cinfo, coef->MCU_buffer)) {
+ /* Suspension forced; update state counters and exit */
+ coef->MCU_vert_offset = yoffset;
+ coef->mcu_ctr = MCU_col_num;
+ return FALSE;
+ }
+ }
+ /* Completed an MCU row, but perhaps not an iMCU row */
+ coef->mcu_ctr = 0;
+ }
+ /* Completed the iMCU row, advance counters for next one */
+ coef->iMCU_row_num++;
+ start_iMCU_row(cinfo);
+ return TRUE;
+}
+
+#endif /* FULL_COEF_BUFFER_SUPPORTED */
+
+
+/*
+ * Initialize coefficient buffer controller.
+ */
+
+GLOBAL(void)
+jinit_c_coef_controller (j_compress_ptr cinfo, boolean need_full_buffer)
+{
+ my_coef_ptr coef;
+
+ coef = (my_coef_ptr)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ SIZEOF(my_coef_controller));
+ cinfo->coef = (struct jpeg_c_coef_controller *) coef;
+ coef->pub.start_pass = start_pass_coef;
+
+ /* Create the coefficient buffer. */
+ if (need_full_buffer) {
+#ifdef FULL_COEF_BUFFER_SUPPORTED
+ /* Allocate a full-image virtual array for each component, */
+ /* padded to a multiple of samp_factor DCT blocks in each direction. */
+ int ci;
+ jpeg_component_info *compptr;
+
+ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+ ci++, compptr++) {
+ coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
+ ((j_common_ptr) cinfo, JPOOL_IMAGE, FALSE,
+ (JDIMENSION) jround_up((long) compptr->width_in_blocks,
+ (long) compptr->h_samp_factor),
+ (JDIMENSION) jround_up((long) compptr->height_in_blocks,
+ (long) compptr->v_samp_factor),
+ (JDIMENSION) compptr->v_samp_factor);
+ }
+#else
+ ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
+#endif
+ } else {
+ /* We only need a single-MCU buffer. */
+ JBLOCKROW buffer;
+ int i;
+
+ buffer = (JBLOCKROW)
+ (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ C_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK));
+ for (i = 0; i < C_MAX_BLOCKS_IN_MCU; i++) {
+ coef->MCU_buffer[i] = buffer + i;
+ }
+ coef->whole_image[0] = NULL; /* flag for no virtual arrays */
+ }
+}
+
+#endif //_FX_JPEG_TURBO_
diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jccolor.c b/core/src/fxcodec/libjpeg/fpdfapi_jccolor.c
index 8ff863a14b..809a05b5a1 100644
--- a/core/src/fxcodec/libjpeg/fpdfapi_jccolor.c
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jccolor.c
@@ -1,462 +1,462 @@
-#if !defined(_FX_JPEG_TURBO_)
-/*
- * jccolor.c
- *
- * Copyright (C) 1991-1996, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains input colorspace conversion routines.
- */
-
-#define JPEG_INTERNALS
-#include "jinclude.h"
-#include "jpeglib.h"
-
-
-/* Private subobject */
-
-typedef struct {
- struct jpeg_color_converter pub; /* public fields */
-
- /* Private state for RGB->YCC conversion */
- INT32 * rgb_ycc_tab; /* => table for RGB to YCbCr conversion */
-} my_color_converter;
-
-typedef my_color_converter * my_cconvert_ptr;
-
-
-/**************** RGB -> YCbCr conversion: most common case **************/
-
-/*
- * YCbCr is defined per CCIR 601-1, except that Cb and Cr are
- * normalized to the range 0..MAXJSAMPLE rather than -0.5 .. 0.5.
- * The conversion equations to be implemented are therefore
- * Y = 0.29900 * R + 0.58700 * G + 0.11400 * B
- * Cb = -0.16874 * R - 0.33126 * G + 0.50000 * B + CENTERJSAMPLE
- * Cr = 0.50000 * R - 0.41869 * G - 0.08131 * B + CENTERJSAMPLE
- * (These numbers are derived from TIFF 6.0 section 21, dated 3-June-92.)
- * Note: older versions of the IJG code used a zero offset of MAXJSAMPLE/2,
- * rather than CENTERJSAMPLE, for Cb and Cr. This gave equal positive and
- * negative swings for Cb/Cr, but meant that grayscale values (Cb=Cr=0)
- * were not represented exactly. Now we sacrifice exact representation of
- * maximum red and maximum blue in order to get exact grayscales.
- *
- * To avoid floating-point arithmetic, we represent the fractional constants
- * as integers scaled up by 2^16 (about 4 digits precision); we have to divide
- * the products by 2^16, with appropriate rounding, to get the correct answer.
- *
- * For even more speed, we avoid doing any multiplications in the inner loop
- * by precalculating the constants times R,G,B for all possible values.
- * For 8-bit JSAMPLEs this is very reasonable (only 256 entries per table);
- * for 12-bit samples it is still acceptable. It's not very reasonable for
- * 16-bit samples, but if you want lossless storage you shouldn't be changing
- * colorspace anyway.
- * The CENTERJSAMPLE offsets and the rounding fudge-factor of 0.5 are included
- * in the tables to save adding them separately in the inner loop.
- */
-
-#define SCALEBITS 16 /* speediest right-shift on some machines */
-#define CBCR_OFFSET ((INT32) CENTERJSAMPLE << SCALEBITS)
-#define ONE_HALF ((INT32) 1 << (SCALEBITS-1))
-#define FIX(x) ((INT32) ((x) * (1L<<SCALEBITS) + 0.5))
-
-/* We allocate one big table and divide it up into eight parts, instead of
- * doing eight alloc_small requests. This lets us use a single table base
- * address, which can be held in a register in the inner loops on many
- * machines (more than can hold all eight addresses, anyway).
- */
-
-#define R_Y_OFF 0 /* offset to R => Y section */
-#define G_Y_OFF (1*(MAXJSAMPLE+1)) /* offset to G => Y section */
-#define B_Y_OFF (2*(MAXJSAMPLE+1)) /* etc. */
-#define R_CB_OFF (3*(MAXJSAMPLE+1))
-#define G_CB_OFF (4*(MAXJSAMPLE+1))
-#define B_CB_OFF (5*(MAXJSAMPLE+1))
-#define R_CR_OFF B_CB_OFF /* B=>Cb, R=>Cr are the same */
-#define G_CR_OFF (6*(MAXJSAMPLE+1))
-#define B_CR_OFF (7*(MAXJSAMPLE+1))
-#define TABLE_SIZE (8*(MAXJSAMPLE+1))
-
-
-/*
- * Initialize for RGB->YCC colorspace conversion.
- */
-
-METHODDEF(void)
-rgb_ycc_start (j_compress_ptr cinfo)
-{
- my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
- INT32 * rgb_ycc_tab;
- INT32 i;
-
- /* Allocate and fill in the conversion tables. */
- cconvert->rgb_ycc_tab = rgb_ycc_tab = (INT32 *)
- (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
- (TABLE_SIZE * SIZEOF(INT32)));
-
- for (i = 0; i <= MAXJSAMPLE; i++) {
- rgb_ycc_tab[i+R_Y_OFF] = FIX(0.29900) * i;
- rgb_ycc_tab[i+G_Y_OFF] = FIX(0.58700) * i;
- rgb_ycc_tab[i+B_Y_OFF] = FIX(0.11400) * i + ONE_HALF;
- rgb_ycc_tab[i+R_CB_OFF] = (-FIX(0.16874)) * i;
- rgb_ycc_tab[i+G_CB_OFF] = (-FIX(0.33126)) * i;
- /* We use a rounding fudge-factor of 0.5-epsilon for Cb and Cr.
- * This ensures that the maximum output will round to MAXJSAMPLE
- * not MAXJSAMPLE+1, and thus that we don't have to range-limit.
- */
- rgb_ycc_tab[i+B_CB_OFF] = FIX(0.50000) * i + CBCR_OFFSET + ONE_HALF-1;
-/* B=>Cb and R=>Cr tables are the same
- rgb_ycc_tab[i+R_CR_OFF] = FIX(0.50000) * i + CBCR_OFFSET + ONE_HALF-1;
-*/
- rgb_ycc_tab[i+G_CR_OFF] = (-FIX(0.41869)) * i;
- rgb_ycc_tab[i+B_CR_OFF] = (-FIX(0.08131)) * i;
- }
-}
-
-
-/*
- * Convert some rows of samples to the JPEG colorspace.
- *
- * Note that we change from the application's interleaved-pixel format
- * to our internal noninterleaved, one-plane-per-component format.
- * The input buffer is therefore three times as wide as the output buffer.
- *
- * A starting row offset is provided only for the output buffer. The caller
- * can easily adjust the passed input_buf value to accommodate any row
- * offset required on that side.
- */
-
-METHODDEF(void)
-rgb_ycc_convert (j_compress_ptr cinfo,
- JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
- JDIMENSION output_row, int num_rows)
-{
- my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
- register int r, g, b;
- register INT32 * ctab = cconvert->rgb_ycc_tab;
- register JSAMPROW inptr;
- register JSAMPROW outptr0, outptr1, outptr2;
- register JDIMENSION col;
- JDIMENSION num_cols = cinfo->image_width;
-
- while (--num_rows >= 0) {
- inptr = *input_buf++;
- outptr0 = output_buf[0][output_row];
- outptr1 = output_buf[1][output_row];
- outptr2 = output_buf[2][output_row];
- output_row++;
- for (col = 0; col < num_cols; col++) {
- r = GETJSAMPLE(inptr[RGB_RED]);
- g = GETJSAMPLE(inptr[RGB_GREEN]);
- b = GETJSAMPLE(inptr[RGB_BLUE]);
- inptr += RGB_PIXELSIZE;
- /* If the inputs are 0..MAXJSAMPLE, the outputs of these equations
- * must be too; we do not need an explicit range-limiting operation.
- * Hence the value being shifted is never negative, and we don't
- * need the general RIGHT_SHIFT macro.
- */
- /* Y */
- outptr0[col] = (JSAMPLE)
- ((ctab[r+R_Y_OFF] + ctab[g+G_Y_OFF] + ctab[b+B_Y_OFF])
- >> SCALEBITS);
- /* Cb */
- outptr1[col] = (JSAMPLE)
- ((ctab[r+R_CB_OFF] + ctab[g+G_CB_OFF] + ctab[b+B_CB_OFF])
- >> SCALEBITS);
- /* Cr */
- outptr2[col] = (JSAMPLE)
- ((ctab[r+R_CR_OFF] + ctab[g+G_CR_OFF] + ctab[b+B_CR_OFF])
- >> SCALEBITS);
- }
- }
-}
-
-
-/**************** Cases other than RGB -> YCbCr **************/
-
-
-/*
- * Convert some rows of samples to the JPEG colorspace.
- * This version handles RGB->grayscale conversion, which is the same
- * as the RGB->Y portion of RGB->YCbCr.
- * We assume rgb_ycc_start has been called (we only use the Y tables).
- */
-
-METHODDEF(void)
-rgb_gray_convert (j_compress_ptr cinfo,
- JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
- JDIMENSION output_row, int num_rows)
-{
- my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
- register int r, g, b;
- register INT32 * ctab = cconvert->rgb_ycc_tab;
- register JSAMPROW inptr;
- register JSAMPROW outptr;
- register JDIMENSION col;
- JDIMENSION num_cols = cinfo->image_width;
-
- while (--num_rows >= 0) {
- inptr = *input_buf++;
- outptr = output_buf[0][output_row];
- output_row++;
- for (col = 0; col < num_cols; col++) {
- r = GETJSAMPLE(inptr[RGB_RED]);
- g = GETJSAMPLE(inptr[RGB_GREEN]);
- b = GETJSAMPLE(inptr[RGB_BLUE]);
- inptr += RGB_PIXELSIZE;
- /* Y */
- outptr[col] = (JSAMPLE)
- ((ctab[r+R_Y_OFF] + ctab[g+G_Y_OFF] + ctab[b+B_Y_OFF])
- >> SCALEBITS);
- }
- }
-}
-
-
-/*
- * Convert some rows of samples to the JPEG colorspace.
- * This version handles Adobe-style CMYK->YCCK conversion,
- * where we convert R=1-C, G=1-M, and B=1-Y to YCbCr using the same
- * conversion as above, while passing K (black) unchanged.
- * We assume rgb_ycc_start has been called.
- */
-
-METHODDEF(void)
-cmyk_ycck_convert (j_compress_ptr cinfo,
- JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
- JDIMENSION output_row, int num_rows)
-{
- my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
- register int r, g, b;
- register INT32 * ctab = cconvert->rgb_ycc_tab;
- register JSAMPROW inptr;
- register JSAMPROW outptr0, outptr1, outptr2, outptr3;
- register JDIMENSION col;
- JDIMENSION num_cols = cinfo->image_width;
-
- while (--num_rows >= 0) {
- inptr = *input_buf++;
- outptr0 = output_buf[0][output_row];
- outptr1 = output_buf[1][output_row];
- outptr2 = output_buf[2][output_row];
- outptr3 = output_buf[3][output_row];
- output_row++;
- for (col = 0; col < num_cols; col++) {
- r = MAXJSAMPLE - GETJSAMPLE(inptr[0]);
- g = MAXJSAMPLE - GETJSAMPLE(inptr[1]);
- b = MAXJSAMPLE - GETJSAMPLE(inptr[2]);
- /* K passes through as-is */
- outptr3[col] = inptr[3]; /* don't need GETJSAMPLE here */
- inptr += 4;
- /* If the inputs are 0..MAXJSAMPLE, the outputs of these equations
- * must be too; we do not need an explicit range-limiting operation.
- * Hence the value being shifted is never negative, and we don't
- * need the general RIGHT_SHIFT macro.
- */
- /* Y */
- outptr0[col] = (JSAMPLE)
- ((ctab[r+R_Y_OFF] + ctab[g+G_Y_OFF] + ctab[b+B_Y_OFF])
- >> SCALEBITS);
- /* Cb */
- outptr1[col] = (JSAMPLE)
- ((ctab[r+R_CB_OFF] + ctab[g+G_CB_OFF] + ctab[b+B_CB_OFF])
- >> SCALEBITS);
- /* Cr */
- outptr2[col] = (JSAMPLE)
- ((ctab[r+R_CR_OFF] + ctab[g+G_CR_OFF] + ctab[b+B_CR_OFF])
- >> SCALEBITS);
- }
- }
-}
-
-
-/*
- * Convert some rows of samples to the JPEG colorspace.
- * This version handles grayscale output with no conversion.
- * The source can be either plain grayscale or YCbCr (since Y == gray).
- */
-
-METHODDEF(void)
-grayscale_convert (j_compress_ptr cinfo,
- JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
- JDIMENSION output_row, int num_rows)
-{
- register JSAMPROW inptr;
- register JSAMPROW outptr;
- register JDIMENSION col;
- JDIMENSION num_cols = cinfo->image_width;
- int instride = cinfo->input_components;
-
- while (--num_rows >= 0) {
- inptr = *input_buf++;
- outptr = output_buf[0][output_row];
- output_row++;
- for (col = 0; col < num_cols; col++) {
- outptr[col] = inptr[0]; /* don't need GETJSAMPLE() here */
- inptr += instride;
- }
- }
-}
-
-
-/*
- * Convert some rows of samples to the JPEG colorspace.
- * This version handles multi-component colorspaces without conversion.
- * We assume input_components == num_components.
- */
-
-METHODDEF(void)
-null_convert (j_compress_ptr cinfo,
- JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
- JDIMENSION output_row, int num_rows)
-{
- register JSAMPROW inptr;
- register JSAMPROW outptr;
- register JDIMENSION col;
- register int ci;
- int nc = cinfo->num_components;
- JDIMENSION num_cols = cinfo->image_width;
-
- while (--num_rows >= 0) {
- /* It seems fastest to make a separate pass for each component. */
- for (ci = 0; ci < nc; ci++) {
- inptr = *input_buf;
- outptr = output_buf[ci][output_row];
- for (col = 0; col < num_cols; col++) {
- outptr[col] = inptr[ci]; /* don't need GETJSAMPLE() here */
- inptr += nc;
- }
- }
- input_buf++;
- output_row++;
- }
-}
-
-
-/*
- * Empty method for start_pass.
- */
-
-METHODDEF(void)
-null_method (j_compress_ptr cinfo)
-{
- /* no work needed */
-}
-
-
-/*
- * Module initialization routine for input colorspace conversion.
- */
-
-GLOBAL(void)
-jinit_color_converter (j_compress_ptr cinfo)
-{
- my_cconvert_ptr cconvert;
-
- cconvert = (my_cconvert_ptr)
- (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
- SIZEOF(my_color_converter));
- cinfo->cconvert = (struct jpeg_color_converter *) cconvert;
- /* set start_pass to null method until we find out differently */
- cconvert->pub.start_pass = null_method;
-
- /* Make sure input_components agrees with in_color_space */
- switch (cinfo->in_color_space) {
- case JCS_GRAYSCALE:
- if (cinfo->input_components != 1)
- ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);
- break;
-
- case JCS_RGB:
-#if RGB_PIXELSIZE != 3
- if (cinfo->input_components != RGB_PIXELSIZE)
- ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);
- break;
-#endif /* else share code with YCbCr */
-
- case JCS_YCbCr:
- if (cinfo->input_components != 3)
- ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);
- break;
-
- case JCS_CMYK:
- case JCS_YCCK:
- if (cinfo->input_components != 4)
- ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);
- break;
-
- default: /* JCS_UNKNOWN can be anything */
- if (cinfo->input_components < 1)
- ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);
- break;
- }
-
- /* Check num_components, set conversion method based on requested space */
- switch (cinfo->jpeg_color_space) {
- case JCS_GRAYSCALE:
- if (cinfo->num_components != 1)
- ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
- if (cinfo->in_color_space == JCS_GRAYSCALE)
- cconvert->pub.color_convert = grayscale_convert;
- else if (cinfo->in_color_space == JCS_RGB) {
- cconvert->pub.start_pass = rgb_ycc_start;
- cconvert->pub.color_convert = rgb_gray_convert;
- } else if (cinfo->in_color_space == JCS_YCbCr)
- cconvert->pub.color_convert = grayscale_convert;
- else
- ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
- break;
-
- case JCS_RGB:
- if (cinfo->num_components != 3)
- ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
- if (cinfo->in_color_space == JCS_RGB && RGB_PIXELSIZE == 3)
- cconvert->pub.color_convert = null_convert;
- else
- ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
- break;
-
- case JCS_YCbCr:
- if (cinfo->num_components != 3)
- ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
- if (cinfo->in_color_space == JCS_RGB) {
- cconvert->pub.start_pass = rgb_ycc_start;
- cconvert->pub.color_convert = rgb_ycc_convert;
- } else if (cinfo->in_color_space == JCS_YCbCr)
- cconvert->pub.color_convert = null_convert;
- else
- ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
- break;
-
- case JCS_CMYK:
- if (cinfo->num_components != 4)
- ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
- if (cinfo->in_color_space == JCS_CMYK)
- cconvert->pub.color_convert = null_convert;
- else
- ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
- break;
-
- case JCS_YCCK:
- if (cinfo->num_components != 4)
- ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
- if (cinfo->in_color_space == JCS_CMYK) {
- cconvert->pub.start_pass = rgb_ycc_start;
- cconvert->pub.color_convert = cmyk_ycck_convert;
- } else if (cinfo->in_color_space == JCS_YCCK)
- cconvert->pub.color_convert = null_convert;
- else
- ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
- break;
-
- default: /* allow null conversion of JCS_UNKNOWN */
- if (cinfo->jpeg_color_space != cinfo->in_color_space ||
- cinfo->num_components != cinfo->input_components)
- ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
- cconvert->pub.color_convert = null_convert;
- break;
- }
-}
-
-#endif //_FX_JPEG_TURBO_
+#if !defined(_FX_JPEG_TURBO_)
+/*
+ * jccolor.c
+ *
+ * Copyright (C) 1991-1996, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains input colorspace conversion routines.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+
+
+/* Private subobject */
+
+typedef struct {
+ struct jpeg_color_converter pub; /* public fields */
+
+ /* Private state for RGB->YCC conversion */
+ INT32 * rgb_ycc_tab; /* => table for RGB to YCbCr conversion */
+} my_color_converter;
+
+typedef my_color_converter * my_cconvert_ptr;
+
+
+/**************** RGB -> YCbCr conversion: most common case **************/
+
+/*
+ * YCbCr is defined per CCIR 601-1, except that Cb and Cr are
+ * normalized to the range 0..MAXJSAMPLE rather than -0.5 .. 0.5.
+ * The conversion equations to be implemented are therefore
+ * Y = 0.29900 * R + 0.58700 * G + 0.11400 * B
+ * Cb = -0.16874 * R - 0.33126 * G + 0.50000 * B + CENTERJSAMPLE
+ * Cr = 0.50000 * R - 0.41869 * G - 0.08131 * B + CENTERJSAMPLE
+ * (These numbers are derived from TIFF 6.0 section 21, dated 3-June-92.)
+ * Note: older versions of the IJG code used a zero offset of MAXJSAMPLE/2,
+ * rather than CENTERJSAMPLE, for Cb and Cr. This gave equal positive and
+ * negative swings for Cb/Cr, but meant that grayscale values (Cb=Cr=0)
+ * were not represented exactly. Now we sacrifice exact representation of
+ * maximum red and maximum blue in order to get exact grayscales.
+ *
+ * To avoid floating-point arithmetic, we represent the fractional constants
+ * as integers scaled up by 2^16 (about 4 digits precision); we have to divide
+ * the products by 2^16, with appropriate rounding, to get the correct answer.
+ *
+ * For even more speed, we avoid doing any multiplications in the inner loop
+ * by precalculating the constants times R,G,B for all possible values.
+ * For 8-bit JSAMPLEs this is very reasonable (only 256 entries per table);
+ * for 12-bit samples it is still acceptable. It's not very reasonable for
+ * 16-bit samples, but if you want lossless storage you shouldn't be changing
+ * colorspace anyway.
+ * The CENTERJSAMPLE offsets and the rounding fudge-factor of 0.5 are included
+ * in the tables to save adding them separately in the inner loop.
+ */
+
+#define SCALEBITS 16 /* speediest right-shift on some machines */
+#define CBCR_OFFSET ((INT32) CENTERJSAMPLE << SCALEBITS)
+#define ONE_HALF ((INT32) 1 << (SCALEBITS-1))
+#define FIX(x) ((INT32) ((x) * (1L<<SCALEBITS) + 0.5))
+
+/* We allocate one big table and divide it up into eight parts, instead of
+ * doing eight alloc_small requests. This lets us use a single table base
+ * address, which can be held in a register in the inner loops on many
+ * machines (more than can hold all eight addresses, anyway).
+ */
+
+#define R_Y_OFF 0 /* offset to R => Y section */
+#define G_Y_OFF (1*(MAXJSAMPLE+1)) /* offset to G => Y section */
+#define B_Y_OFF (2*(MAXJSAMPLE+1)) /* etc. */
+#define R_CB_OFF (3*(MAXJSAMPLE+1))
+#define G_CB_OFF (4*(MAXJSAMPLE+1))
+#define B_CB_OFF (5*(MAXJSAMPLE+1))
+#define R_CR_OFF B_CB_OFF /* B=>Cb, R=>Cr are the same */
+#define G_CR_OFF (6*(MAXJSAMPLE+1))
+#define B_CR_OFF (7*(MAXJSAMPLE+1))
+#define TABLE_SIZE (8*(MAXJSAMPLE+1))
+
+
+/*
+ * Initialize for RGB->YCC colorspace conversion.
+ */
+
+METHODDEF(void)
+rgb_ycc_start (j_compress_ptr cinfo)
+{
+ my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
+ INT32 * rgb_ycc_tab;
+ INT32 i;
+
+ /* Allocate and fill in the conversion tables. */
+ cconvert->rgb_ycc_tab = rgb_ycc_tab = (INT32 *)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ (TABLE_SIZE * SIZEOF(INT32)));
+
+ for (i = 0; i <= MAXJSAMPLE; i++) {
+ rgb_ycc_tab[i+R_Y_OFF] = FIX(0.29900) * i;
+ rgb_ycc_tab[i+G_Y_OFF] = FIX(0.58700) * i;
+ rgb_ycc_tab[i+B_Y_OFF] = FIX(0.11400) * i + ONE_HALF;
+ rgb_ycc_tab[i+R_CB_OFF] = (-FIX(0.16874)) * i;
+ rgb_ycc_tab[i+G_CB_OFF] = (-FIX(0.33126)) * i;
+ /* We use a rounding fudge-factor of 0.5-epsilon for Cb and Cr.
+ * This ensures that the maximum output will round to MAXJSAMPLE
+ * not MAXJSAMPLE+1, and thus that we don't have to range-limit.
+ */
+ rgb_ycc_tab[i+B_CB_OFF] = FIX(0.50000) * i + CBCR_OFFSET + ONE_HALF-1;
+/* B=>Cb and R=>Cr tables are the same
+ rgb_ycc_tab[i+R_CR_OFF] = FIX(0.50000) * i + CBCR_OFFSET + ONE_HALF-1;
+*/
+ rgb_ycc_tab[i+G_CR_OFF] = (-FIX(0.41869)) * i;
+ rgb_ycc_tab[i+B_CR_OFF] = (-FIX(0.08131)) * i;
+ }
+}
+
+
+/*
+ * Convert some rows of samples to the JPEG colorspace.
+ *
+ * Note that we change from the application's interleaved-pixel format
+ * to our internal noninterleaved, one-plane-per-component format.
+ * The input buffer is therefore three times as wide as the output buffer.
+ *
+ * A starting row offset is provided only for the output buffer. The caller
+ * can easily adjust the passed input_buf value to accommodate any row
+ * offset required on that side.
+ */
+
+METHODDEF(void)
+rgb_ycc_convert (j_compress_ptr cinfo,
+ JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
+ JDIMENSION output_row, int num_rows)
+{
+ my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
+ register int r, g, b;
+ register INT32 * ctab = cconvert->rgb_ycc_tab;
+ register JSAMPROW inptr;
+ register JSAMPROW outptr0, outptr1, outptr2;
+ register JDIMENSION col;
+ JDIMENSION num_cols = cinfo->image_width;
+
+ while (--num_rows >= 0) {
+ inptr = *input_buf++;
+ outptr0 = output_buf[0][output_row];
+ outptr1 = output_buf[1][output_row];
+ outptr2 = output_buf[2][output_row];
+ output_row++;
+ for (col = 0; col < num_cols; col++) {
+ r = GETJSAMPLE(inptr[RGB_RED]);
+ g = GETJSAMPLE(inptr[RGB_GREEN]);
+ b = GETJSAMPLE(inptr[RGB_BLUE]);
+ inptr += RGB_PIXELSIZE;
+ /* If the inputs are 0..MAXJSAMPLE, the outputs of these equations
+ * must be too; we do not need an explicit range-limiting operation.
+ * Hence the value being shifted is never negative, and we don't
+ * need the general RIGHT_SHIFT macro.
+ */
+ /* Y */
+ outptr0[col] = (JSAMPLE)
+ ((ctab[r+R_Y_OFF] + ctab[g+G_Y_OFF] + ctab[b+B_Y_OFF])
+ >> SCALEBITS);
+ /* Cb */
+ outptr1[col] = (JSAMPLE)
+ ((ctab[r+R_CB_OFF] + ctab[g+G_CB_OFF] + ctab[b+B_CB_OFF])
+ >> SCALEBITS);
+ /* Cr */
+ outptr2[col] = (JSAMPLE)
+ ((ctab[r+R_CR_OFF] + ctab[g+G_CR_OFF] + ctab[b+B_CR_OFF])
+ >> SCALEBITS);
+ }
+ }
+}
+
+
+/**************** Cases other than RGB -> YCbCr **************/
+
+
+/*
+ * Convert some rows of samples to the JPEG colorspace.
+ * This version handles RGB->grayscale conversion, which is the same
+ * as the RGB->Y portion of RGB->YCbCr.
+ * We assume rgb_ycc_start has been called (we only use the Y tables).
+ */
+
+METHODDEF(void)
+rgb_gray_convert (j_compress_ptr cinfo,
+ JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
+ JDIMENSION output_row, int num_rows)
+{
+ my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
+ register int r, g, b;
+ register INT32 * ctab = cconvert->rgb_ycc_tab;
+ register JSAMPROW inptr;
+ register JSAMPROW outptr;
+ register JDIMENSION col;
+ JDIMENSION num_cols = cinfo->image_width;
+
+ while (--num_rows >= 0) {
+ inptr = *input_buf++;
+ outptr = output_buf[0][output_row];
+ output_row++;
+ for (col = 0; col < num_cols; col++) {
+ r = GETJSAMPLE(inptr[RGB_RED]);
+ g = GETJSAMPLE(inptr[RGB_GREEN]);
+ b = GETJSAMPLE(inptr[RGB_BLUE]);
+ inptr += RGB_PIXELSIZE;
+ /* Y */
+ outptr[col] = (JSAMPLE)
+ ((ctab[r+R_Y_OFF] + ctab[g+G_Y_OFF] + ctab[b+B_Y_OFF])
+ >> SCALEBITS);
+ }
+ }
+}
+
+
+/*
+ * Convert some rows of samples to the JPEG colorspace.
+ * This version handles Adobe-style CMYK->YCCK conversion,
+ * where we convert R=1-C, G=1-M, and B=1-Y to YCbCr using the same
+ * conversion as above, while passing K (black) unchanged.
+ * We assume rgb_ycc_start has been called.
+ */
+
+METHODDEF(void)
+cmyk_ycck_convert (j_compress_ptr cinfo,
+ JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
+ JDIMENSION output_row, int num_rows)
+{
+ my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
+ register int r, g, b;
+ register INT32 * ctab = cconvert->rgb_ycc_tab;
+ register JSAMPROW inptr;
+ register JSAMPROW outptr0, outptr1, outptr2, outptr3;
+ register JDIMENSION col;
+ JDIMENSION num_cols = cinfo->image_width;
+
+ while (--num_rows >= 0) {
+ inptr = *input_buf++;
+ outptr0 = output_buf[0][output_row];
+ outptr1 = output_buf[1][output_row];
+ outptr2 = output_buf[2][output_row];
+ outptr3 = output_buf[3][output_row];
+ output_row++;
+ for (col = 0; col < num_cols; col++) {
+ r = MAXJSAMPLE - GETJSAMPLE(inptr[0]);
+ g = MAXJSAMPLE - GETJSAMPLE(inptr[1]);
+ b = MAXJSAMPLE - GETJSAMPLE(inptr[2]);
+ /* K passes through as-is */
+ outptr3[col] = inptr[3]; /* don't need GETJSAMPLE here */
+ inptr += 4;
+ /* If the inputs are 0..MAXJSAMPLE, the outputs of these equations
+ * must be too; we do not need an explicit range-limiting operation.
+ * Hence the value being shifted is never negative, and we don't
+ * need the general RIGHT_SHIFT macro.
+ */
+ /* Y */
+ outptr0[col] = (JSAMPLE)
+ ((ctab[r+R_Y_OFF] + ctab[g+G_Y_OFF] + ctab[b+B_Y_OFF])
+ >> SCALEBITS);
+ /* Cb */
+ outptr1[col] = (JSAMPLE)
+ ((ctab[r+R_CB_OFF] + ctab[g+G_CB_OFF] + ctab[b+B_CB_OFF])
+ >> SCALEBITS);
+ /* Cr */
+ outptr2[col] = (JSAMPLE)
+ ((ctab[r+R_CR_OFF] + ctab[g+G_CR_OFF] + ctab[b+B_CR_OFF])
+ >> SCALEBITS);
+ }
+ }
+}
+
+
+/*
+ * Convert some rows of samples to the JPEG colorspace.
+ * This version handles grayscale output with no conversion.
+ * The source can be either plain grayscale or YCbCr (since Y == gray).
+ */
+
+METHODDEF(void)
+grayscale_convert (j_compress_ptr cinfo,
+ JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
+ JDIMENSION output_row, int num_rows)
+{
+ register JSAMPROW inptr;
+ register JSAMPROW outptr;
+ register JDIMENSION col;
+ JDIMENSION num_cols = cinfo->image_width;
+ int instride = cinfo->input_components;
+
+ while (--num_rows >= 0) {
+ inptr = *input_buf++;
+ outptr = output_buf[0][output_row];
+ output_row++;
+ for (col = 0; col < num_cols; col++) {
+ outptr[col] = inptr[0]; /* don't need GETJSAMPLE() here */
+ inptr += instride;
+ }
+ }
+}
+
+
+/*
+ * Convert some rows of samples to the JPEG colorspace.
+ * This version handles multi-component colorspaces without conversion.
+ * We assume input_components == num_components.
+ */
+
+METHODDEF(void)
+null_convert (j_compress_ptr cinfo,
+ JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
+ JDIMENSION output_row, int num_rows)
+{
+ register JSAMPROW inptr;
+ register JSAMPROW outptr;
+ register JDIMENSION col;
+ register int ci;
+ int nc = cinfo->num_components;
+ JDIMENSION num_cols = cinfo->image_width;
+
+ while (--num_rows >= 0) {
+ /* It seems fastest to make a separate pass for each component. */
+ for (ci = 0; ci < nc; ci++) {
+ inptr = *input_buf;
+ outptr = output_buf[ci][output_row];
+ for (col = 0; col < num_cols; col++) {
+ outptr[col] = inptr[ci]; /* don't need GETJSAMPLE() here */
+ inptr += nc;
+ }
+ }
+ input_buf++;
+ output_row++;
+ }
+}
+
+
+/*
+ * Empty method for start_pass.
+ */
+
+METHODDEF(void)
+null_method (j_compress_ptr cinfo)
+{
+ /* no work needed */
+}
+
+
+/*
+ * Module initialization routine for input colorspace conversion.
+ */
+
+GLOBAL(void)
+jinit_color_converter (j_compress_ptr cinfo)
+{
+ my_cconvert_ptr cconvert;
+
+ cconvert = (my_cconvert_ptr)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ SIZEOF(my_color_converter));
+ cinfo->cconvert = (struct jpeg_color_converter *) cconvert;
+ /* set start_pass to null method until we find out differently */
+ cconvert->pub.start_pass = null_method;
+
+ /* Make sure input_components agrees with in_color_space */
+ switch (cinfo->in_color_space) {
+ case JCS_GRAYSCALE:
+ if (cinfo->input_components != 1)
+ ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);
+ break;
+
+ case JCS_RGB:
+#if RGB_PIXELSIZE != 3
+ if (cinfo->input_components != RGB_PIXELSIZE)
+ ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);
+ break;
+#endif /* else share code with YCbCr */
+
+ case JCS_YCbCr:
+ if (cinfo->input_components != 3)
+ ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);
+ break;
+
+ case JCS_CMYK:
+ case JCS_YCCK:
+ if (cinfo->input_components != 4)
+ ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);
+ break;
+
+ default: /* JCS_UNKNOWN can be anything */
+ if (cinfo->input_components < 1)
+ ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);
+ break;
+ }
+
+ /* Check num_components, set conversion method based on requested space */
+ switch (cinfo->jpeg_color_space) {
+ case JCS_GRAYSCALE:
+ if (cinfo->num_components != 1)
+ ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
+ if (cinfo->in_color_space == JCS_GRAYSCALE)
+ cconvert->pub.color_convert = grayscale_convert;
+ else if (cinfo->in_color_space == JCS_RGB) {
+ cconvert->pub.start_pass = rgb_ycc_start;
+ cconvert->pub.color_convert = rgb_gray_convert;
+ } else if (cinfo->in_color_space == JCS_YCbCr)
+ cconvert->pub.color_convert = grayscale_convert;
+ else
+ ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
+ break;
+
+ case JCS_RGB:
+ if (cinfo->num_components != 3)
+ ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
+ if (cinfo->in_color_space == JCS_RGB && RGB_PIXELSIZE == 3)
+ cconvert->pub.color_convert = null_convert;
+ else
+ ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
+ break;
+
+ case JCS_YCbCr:
+ if (cinfo->num_components != 3)
+ ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
+ if (cinfo->in_color_space == JCS_RGB) {
+ cconvert->pub.start_pass = rgb_ycc_start;
+ cconvert->pub.color_convert = rgb_ycc_convert;
+ } else if (cinfo->in_color_space == JCS_YCbCr)
+ cconvert->pub.color_convert = null_convert;
+ else
+ ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
+ break;
+
+ case JCS_CMYK:
+ if (cinfo->num_components != 4)
+ ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
+ if (cinfo->in_color_space == JCS_CMYK)
+ cconvert->pub.color_convert = null_convert;
+ else
+ ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
+ break;
+
+ case JCS_YCCK:
+ if (cinfo->num_components != 4)
+ ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
+ if (cinfo->in_color_space == JCS_CMYK) {
+ cconvert->pub.start_pass = rgb_ycc_start;
+ cconvert->pub.color_convert = cmyk_ycck_convert;
+ } else if (cinfo->in_color_space == JCS_YCCK)
+ cconvert->pub.color_convert = null_convert;
+ else
+ ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
+ break;
+
+ default: /* allow null conversion of JCS_UNKNOWN */
+ if (cinfo->jpeg_color_space != cinfo->in_color_space ||
+ cinfo->num_components != cinfo->input_components)
+ ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
+ cconvert->pub.color_convert = null_convert;
+ break;
+ }
+}
+
+#endif //_FX_JPEG_TURBO_
diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jcdctmgr.c b/core/src/fxcodec/libjpeg/fpdfapi_jcdctmgr.c
index d4082043a5..cbd7d11207 100644
--- a/core/src/fxcodec/libjpeg/fpdfapi_jcdctmgr.c
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jcdctmgr.c
@@ -1,390 +1,390 @@
-#if !defined(_FX_JPEG_TURBO_)
-/*
- * jcdctmgr.c
- *
- * Copyright (C) 1994-1996, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains the forward-DCT management logic.
- * This code selects a particular DCT implementation to be used,
- * and it performs related housekeeping chores including coefficient
- * quantization.
- */
-
-#define JPEG_INTERNALS
-#include "jinclude.h"
-#include "jpeglib.h"
-#include "jdct.h" /* Private declarations for DCT subsystem */
-
-
-/* Private subobject for this module */
-
-typedef struct {
- struct jpeg_forward_dct pub; /* public fields */
-
- /* Pointer to the DCT routine actually in use */
- forward_DCT_method_ptr do_dct;
-
- /* The actual post-DCT divisors --- not identical to the quant table
- * entries, because of scaling (especially for an unnormalized DCT).
- * Each table is given in normal array order.
- */
- DCTELEM * divisors[NUM_QUANT_TBLS];
-
-#ifdef DCT_FLOAT_SUPPORTED
- /* Same as above for the floating-point case. */
- float_DCT_method_ptr do_float_dct;
- FAST_FLOAT * float_divisors[NUM_QUANT_TBLS];
-#endif
-} my_fdct_controller;
-
-typedef my_fdct_controller * my_fdct_ptr;
-
-
-/*
- * Initialize for a processing pass.
- * Verify that all referenced Q-tables are present, and set up
- * the divisor table for each one.
- * In the current implementation, DCT of all components is done during
- * the first pass, even if only some components will be output in the
- * first scan. Hence all components should be examined here.
- */
-
-METHODDEF(void)
-start_pass_fdctmgr (j_compress_ptr cinfo)
-{
- my_fdct_ptr fdct = (my_fdct_ptr) cinfo->fdct;
- int ci, qtblno, i;
- jpeg_component_info *compptr;
- JQUANT_TBL * qtbl;
- DCTELEM * dtbl;
-
- for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
- ci++, compptr++) {
- qtblno = compptr->quant_tbl_no;
- /* Make sure specified quantization table is present */
- if (qtblno < 0 || qtblno >= NUM_QUANT_TBLS ||
- cinfo->quant_tbl_ptrs[qtblno] == NULL)
- ERREXIT1(cinfo, JERR_NO_QUANT_TABLE, qtblno);
- qtbl = cinfo->quant_tbl_ptrs[qtblno];
- /* Compute divisors for this quant table */
- /* We may do this more than once for same table, but it's not a big deal */
- switch (cinfo->dct_method) {
-#ifdef DCT_ISLOW_SUPPORTED
- case JDCT_ISLOW:
- /* For LL&M IDCT method, divisors are equal to raw quantization
- * coefficients multiplied by 8 (to counteract scaling).
- */
- if (fdct->divisors[qtblno] == NULL) {
- fdct->divisors[qtblno] = (DCTELEM *)
- (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
- DCTSIZE2 * SIZEOF(DCTELEM));
- }
- dtbl = fdct->divisors[qtblno];
- for (i = 0; i < DCTSIZE2; i++) {
- dtbl[i] = ((DCTELEM) qtbl->quantval[i]) << 3;
- }
- break;
-#endif
-#ifdef DCT_IFAST_SUPPORTED
- case JDCT_IFAST:
- {
- /* For AA&N IDCT method, divisors are equal to quantization
- * coefficients scaled by scalefactor[row]*scalefactor[col], where
- * scalefactor[0] = 1
- * scalefactor[k] = cos(k*PI/16) * sqrt(2) for k=1..7
- * We apply a further scale factor of 8.
- */
-#define CONST_BITS 14
- static const INT16 aanscales[DCTSIZE2] = {
- /* precomputed values scaled up by 14 bits */
- 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520,
- 22725, 31521, 29692, 26722, 22725, 17855, 12299, 6270,
- 21407, 29692, 27969, 25172, 21407, 16819, 11585, 5906,
- 19266, 26722, 25172, 22654, 19266, 15137, 10426, 5315,
- 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520,
- 12873, 17855, 16819, 15137, 12873, 10114, 6967, 3552,
- 8867, 12299, 11585, 10426, 8867, 6967, 4799, 2446,
- 4520, 6270, 5906, 5315, 4520, 3552, 2446, 1247
- };
- SHIFT_TEMPS
-
- if (fdct->divisors[qtblno] == NULL) {
- fdct->divisors[qtblno] = (DCTELEM *)
- (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
- DCTSIZE2 * SIZEOF(DCTELEM));
- }
- dtbl = fdct->divisors[qtblno];
- for (i = 0; i < DCTSIZE2; i++) {
- dtbl[i] = (DCTELEM)
- DESCALE(MULTIPLY16V16((INT32) qtbl->quantval[i],
- (INT32) aanscales[i]),
- CONST_BITS-3);
- }
- }
- break;
-#endif
-#ifdef DCT_FLOAT_SUPPORTED
- case JDCT_FLOAT:
- {
- /* For float AA&N IDCT method, divisors are equal to quantization
- * coefficients scaled by scalefactor[row]*scalefactor[col], where
- * scalefactor[0] = 1
- * scalefactor[k] = cos(k*PI/16) * sqrt(2) for k=1..7
- * We apply a further scale factor of 8.
- * What's actually stored is 1/divisor so that the inner loop can
- * use a multiplication rather than a division.
- */
- FAST_FLOAT * fdtbl;
- int row, col;
- static const double aanscalefactor[DCTSIZE] = {
- 1.0, 1.387039845, 1.306562965, 1.175875602,
- 1.0, 0.785694958, 0.541196100, 0.275899379
- };
-
- if (fdct->float_divisors[qtblno] == NULL) {
- fdct->float_divisors[qtblno] = (FAST_FLOAT *)
- (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
- DCTSIZE2 * SIZEOF(FAST_FLOAT));
- }
- fdtbl = fdct->float_divisors[qtblno];
- i = 0;
- for (row = 0; row < DCTSIZE; row++) {
- for (col = 0; col < DCTSIZE; col++) {
- fdtbl[i] = (FAST_FLOAT)
- (1.0 / (((double) qtbl->quantval[i] *
- aanscalefactor[row] * aanscalefactor[col] * 8.0)));
- i++;
- }
- }
- }
- break;
-#endif
- default:
- ERREXIT(cinfo, JERR_NOT_COMPILED);
- break;
- }
- }
-}
-
-
-/*
- * Perform forward DCT on one or more blocks of a component.
- *
- * The input samples are taken from the sample_data[] array starting at
- * position start_row/start_col, and moving to the right for any additional
- * blocks. The quantized coefficients are returned in coef_blocks[].
- */
-
-METHODDEF(void)
-forward_DCT (j_compress_ptr cinfo, jpeg_component_info * compptr,
- JSAMPARRAY sample_data, JBLOCKROW coef_blocks,
- JDIMENSION start_row, JDIMENSION start_col,
- JDIMENSION num_blocks)
-/* This version is used for integer DCT implementations. */
-{
- /* This routine is heavily used, so it's worth coding it tightly. */
- my_fdct_ptr fdct = (my_fdct_ptr) cinfo->fdct;
- forward_DCT_method_ptr do_dct = fdct->do_dct;
- DCTELEM * divisors = fdct->divisors[compptr->quant_tbl_no];
- DCTELEM workspace[DCTSIZE2]; /* work area for FDCT subroutine */
- JDIMENSION bi;
-
- sample_data += start_row; /* fold in the vertical offset once */
-
- for (bi = 0; bi < num_blocks; bi++, start_col += DCTSIZE) {
- /* Load data into workspace, applying unsigned->signed conversion */
- { register DCTELEM *workspaceptr;
- register JSAMPROW elemptr;
- register int elemr;
-
- workspaceptr = workspace;
- for (elemr = 0; elemr < DCTSIZE; elemr++) {
- elemptr = sample_data[elemr] + start_col;
-#if DCTSIZE == 8 /* unroll the inner loop */
- *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;
- *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;
- *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;
- *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;
- *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;
- *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;
- *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;
- *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;
-#else
- { register int elemc;
- for (elemc = DCTSIZE; elemc > 0; elemc--) {
- *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;
- }
- }
-#endif
- }
- }
-
- /* Perform the DCT */
- (*do_dct) (workspace);
-
- /* Quantize/descale the coefficients, and store into coef_blocks[] */
- { register DCTELEM temp, qval;
- register int i;
- register JCOEFPTR output_ptr = coef_blocks[bi];
-
- for (i = 0; i < DCTSIZE2; i++) {
- qval = divisors[i];
- temp = workspace[i];
- /* Divide the coefficient value by qval, ensuring proper rounding.
- * Since C does not specify the direction of rounding for negative
- * quotients, we have to force the dividend positive for portability.
- *
- * In most files, at least half of the output values will be zero
- * (at default quantization settings, more like three-quarters...)
- * so we should ensure that this case is fast. On many machines,
- * a comparison is enough cheaper than a divide to make a special test
- * a win. Since both inputs will be nonnegative, we need only test
- * for a < b to discover whether a/b is 0.
- * If your machine's division is fast enough, define FAST_DIVIDE.
- */
-#ifdef FAST_DIVIDE
-#define DIVIDE_BY(a,b) a /= b
-#else
-#define DIVIDE_BY(a,b) if (a >= b) a /= b; else a = 0
-#endif
- if (temp < 0) {
- temp = -temp;
- temp += qval>>1; /* for rounding */
- DIVIDE_BY(temp, qval);
- temp = -temp;
- } else {
- temp += qval>>1; /* for rounding */
- DIVIDE_BY(temp, qval);
- }
- output_ptr[i] = (JCOEF) temp;
- }
- }
- }
-}
-
-
-#ifdef DCT_FLOAT_SUPPORTED
-
-METHODDEF(void)
-forward_DCT_float (j_compress_ptr cinfo, jpeg_component_info * compptr,
- JSAMPARRAY sample_data, JBLOCKROW coef_blocks,
- JDIMENSION start_row, JDIMENSION start_col,
- JDIMENSION num_blocks)
-/* This version is used for floating-point DCT implementations. */
-{
- /* This routine is heavily used, so it's worth coding it tightly. */
- my_fdct_ptr fdct = (my_fdct_ptr) cinfo->fdct;
- float_DCT_method_ptr do_dct = fdct->do_float_dct;
- FAST_FLOAT * divisors = fdct->float_divisors[compptr->quant_tbl_no];
- FAST_FLOAT workspace[DCTSIZE2]; /* work area for FDCT subroutine */
- JDIMENSION bi;
-
- sample_data += start_row; /* fold in the vertical offset once */
-
- for (bi = 0; bi < num_blocks; bi++, start_col += DCTSIZE) {
- /* Load data into workspace, applying unsigned->signed conversion */
- { register FAST_FLOAT *workspaceptr;
- register JSAMPROW elemptr;
- register int elemr;
-
- workspaceptr = workspace;
- for (elemr = 0; elemr < DCTSIZE; elemr++) {
- elemptr = sample_data[elemr] + start_col;
-#if DCTSIZE == 8 /* unroll the inner loop */
- *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);
- *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);
- *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);
- *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);
- *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);
- *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);
- *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);
- *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);
-#else
- { register int elemc;
- for (elemc = DCTSIZE; elemc > 0; elemc--) {
- *workspaceptr++ = (FAST_FLOAT)
- (GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);
- }
- }
-#endif
- }
- }
-
- /* Perform the DCT */
- (*do_dct) (workspace);
-
- /* Quantize/descale the coefficients, and store into coef_blocks[] */
- { register FAST_FLOAT temp;
- register int i;
- register JCOEFPTR output_ptr = coef_blocks[bi];
-
- for (i = 0; i < DCTSIZE2; i++) {
- /* Apply the quantization and scaling factor */
- temp = workspace[i] * divisors[i];
- /* Round to nearest integer.
- * Since C does not specify the direction of rounding for negative
- * quotients, we have to force the dividend positive for portability.
- * The maximum coefficient size is +-16K (for 12-bit data), so this
- * code should work for either 16-bit or 32-bit ints.
- */
- output_ptr[i] = (JCOEF) ((int) (temp + (FAST_FLOAT) 16384.5) - 16384);
- }
- }
- }
-}
-
-#endif /* DCT_FLOAT_SUPPORTED */
-
-
-/*
- * Initialize FDCT manager.
- */
-
-GLOBAL(void)
-jinit_forward_dct (j_compress_ptr cinfo)
-{
- my_fdct_ptr fdct;
- int i;
-
- fdct = (my_fdct_ptr)
- (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
- SIZEOF(my_fdct_controller));
- cinfo->fdct = (struct jpeg_forward_dct *) fdct;
- fdct->pub.start_pass = start_pass_fdctmgr;
-
- switch (cinfo->dct_method) {
-#ifdef DCT_ISLOW_SUPPORTED
- case JDCT_ISLOW:
- fdct->pub.forward_DCT = forward_DCT;
- fdct->do_dct = jpeg_fdct_islow;
- break;
-#endif
-#ifdef DCT_IFAST_SUPPORTED
- case JDCT_IFAST:
- fdct->pub.forward_DCT = forward_DCT;
- fdct->do_dct = jpeg_fdct_ifast;
- break;
-#endif
-#ifdef DCT_FLOAT_SUPPORTED
- case JDCT_FLOAT:
- fdct->pub.forward_DCT = forward_DCT_float;
- fdct->do_float_dct = jpeg_fdct_float;
- break;
-#endif
- default:
- ERREXIT(cinfo, JERR_NOT_COMPILED);
- break;
- }
-
- /* Mark divisor tables unallocated */
- for (i = 0; i < NUM_QUANT_TBLS; i++) {
- fdct->divisors[i] = NULL;
-#ifdef DCT_FLOAT_SUPPORTED
- fdct->float_divisors[i] = NULL;
-#endif
- }
-}
-
-#endif //_FX_JPEG_TURBO_
+#if !defined(_FX_JPEG_TURBO_)
+/*
+ * jcdctmgr.c
+ *
+ * Copyright (C) 1994-1996, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains the forward-DCT management logic.
+ * This code selects a particular DCT implementation to be used,
+ * and it performs related housekeeping chores including coefficient
+ * quantization.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+#include "jdct.h" /* Private declarations for DCT subsystem */
+
+
+/* Private subobject for this module */
+
+typedef struct {
+ struct jpeg_forward_dct pub; /* public fields */
+
+ /* Pointer to the DCT routine actually in use */
+ forward_DCT_method_ptr do_dct;
+
+ /* The actual post-DCT divisors --- not identical to the quant table
+ * entries, because of scaling (especially for an unnormalized DCT).
+ * Each table is given in normal array order.
+ */
+ DCTELEM * divisors[NUM_QUANT_TBLS];
+
+#ifdef DCT_FLOAT_SUPPORTED
+ /* Same as above for the floating-point case. */
+ float_DCT_method_ptr do_float_dct;
+ FAST_FLOAT * float_divisors[NUM_QUANT_TBLS];
+#endif
+} my_fdct_controller;
+
+typedef my_fdct_controller * my_fdct_ptr;
+
+
+/*
+ * Initialize for a processing pass.
+ * Verify that all referenced Q-tables are present, and set up
+ * the divisor table for each one.
+ * In the current implementation, DCT of all components is done during
+ * the first pass, even if only some components will be output in the
+ * first scan. Hence all components should be examined here.
+ */
+
+METHODDEF(void)
+start_pass_fdctmgr (j_compress_ptr cinfo)
+{
+ my_fdct_ptr fdct = (my_fdct_ptr) cinfo->fdct;
+ int ci, qtblno, i;
+ jpeg_component_info *compptr;
+ JQUANT_TBL * qtbl;
+ DCTELEM * dtbl;
+
+ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+ ci++, compptr++) {
+ qtblno = compptr->quant_tbl_no;
+ /* Make sure specified quantization table is present */
+ if (qtblno < 0 || qtblno >= NUM_QUANT_TBLS ||
+ cinfo->quant_tbl_ptrs[qtblno] == NULL)
+ ERREXIT1(cinfo, JERR_NO_QUANT_TABLE, qtblno);
+ qtbl = cinfo->quant_tbl_ptrs[qtblno];
+ /* Compute divisors for this quant table */
+ /* We may do this more than once for same table, but it's not a big deal */
+ switch (cinfo->dct_method) {
+#ifdef DCT_ISLOW_SUPPORTED
+ case JDCT_ISLOW:
+ /* For LL&M IDCT method, divisors are equal to raw quantization
+ * coefficients multiplied by 8 (to counteract scaling).
+ */
+ if (fdct->divisors[qtblno] == NULL) {
+ fdct->divisors[qtblno] = (DCTELEM *)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ DCTSIZE2 * SIZEOF(DCTELEM));
+ }
+ dtbl = fdct->divisors[qtblno];
+ for (i = 0; i < DCTSIZE2; i++) {
+ dtbl[i] = ((DCTELEM) qtbl->quantval[i]) << 3;
+ }
+ break;
+#endif
+#ifdef DCT_IFAST_SUPPORTED
+ case JDCT_IFAST:
+ {
+ /* For AA&N IDCT method, divisors are equal to quantization
+ * coefficients scaled by scalefactor[row]*scalefactor[col], where
+ * scalefactor[0] = 1
+ * scalefactor[k] = cos(k*PI/16) * sqrt(2) for k=1..7
+ * We apply a further scale factor of 8.
+ */
+#define CONST_BITS 14
+ static const INT16 aanscales[DCTSIZE2] = {
+ /* precomputed values scaled up by 14 bits */
+ 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520,
+ 22725, 31521, 29692, 26722, 22725, 17855, 12299, 6270,
+ 21407, 29692, 27969, 25172, 21407, 16819, 11585, 5906,
+ 19266, 26722, 25172, 22654, 19266, 15137, 10426, 5315,
+ 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520,
+ 12873, 17855, 16819, 15137, 12873, 10114, 6967, 3552,
+ 8867, 12299, 11585, 10426, 8867, 6967, 4799, 2446,
+ 4520, 6270, 5906, 5315, 4520, 3552, 2446, 1247
+ };
+ SHIFT_TEMPS
+
+ if (fdct->divisors[qtblno] == NULL) {
+ fdct->divisors[qtblno] = (DCTELEM *)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ DCTSIZE2 * SIZEOF(DCTELEM));
+ }
+ dtbl = fdct->divisors[qtblno];
+ for (i = 0; i < DCTSIZE2; i++) {
+ dtbl[i] = (DCTELEM)
+ DESCALE(MULTIPLY16V16((INT32) qtbl->quantval[i],
+ (INT32) aanscales[i]),
+ CONST_BITS-3);
+ }
+ }
+ break;
+#endif
+#ifdef DCT_FLOAT_SUPPORTED
+ case JDCT_FLOAT:
+ {
+ /* For float AA&N IDCT method, divisors are equal to quantization
+ * coefficients scaled by scalefactor[row]*scalefactor[col], where
+ * scalefactor[0] = 1
+ * scalefactor[k] = cos(k*PI/16) * sqrt(2) for k=1..7
+ * We apply a further scale factor of 8.
+ * What's actually stored is 1/divisor so that the inner loop can
+ * use a multiplication rather than a division.
+ */
+ FAST_FLOAT * fdtbl;
+ int row, col;
+ static const double aanscalefactor[DCTSIZE] = {
+ 1.0, 1.387039845, 1.306562965, 1.175875602,
+ 1.0, 0.785694958, 0.541196100, 0.275899379
+ };
+
+ if (fdct->float_divisors[qtblno] == NULL) {
+ fdct->float_divisors[qtblno] = (FAST_FLOAT *)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ DCTSIZE2 * SIZEOF(FAST_FLOAT));
+ }
+ fdtbl = fdct->float_divisors[qtblno];
+ i = 0;
+ for (row = 0; row < DCTSIZE; row++) {
+ for (col = 0; col < DCTSIZE; col++) {
+ fdtbl[i] = (FAST_FLOAT)
+ (1.0 / (((double) qtbl->quantval[i] *
+ aanscalefactor[row] * aanscalefactor[col] * 8.0)));
+ i++;
+ }
+ }
+ }
+ break;
+#endif
+ default:
+ ERREXIT(cinfo, JERR_NOT_COMPILED);
+ break;
+ }
+ }
+}
+
+
+/*
+ * Perform forward DCT on one or more blocks of a component.
+ *
+ * The input samples are taken from the sample_data[] array starting at
+ * position start_row/start_col, and moving to the right for any additional
+ * blocks. The quantized coefficients are returned in coef_blocks[].
+ */
+
+METHODDEF(void)
+forward_DCT (j_compress_ptr cinfo, jpeg_component_info * compptr,
+ JSAMPARRAY sample_data, JBLOCKROW coef_blocks,
+ JDIMENSION start_row, JDIMENSION start_col,
+ JDIMENSION num_blocks)
+/* This version is used for integer DCT implementations. */
+{
+ /* This routine is heavily used, so it's worth coding it tightly. */
+ my_fdct_ptr fdct = (my_fdct_ptr) cinfo->fdct;
+ forward_DCT_method_ptr do_dct = fdct->do_dct;
+ DCTELEM * divisors = fdct->divisors[compptr->quant_tbl_no];
+ DCTELEM workspace[DCTSIZE2]; /* work area for FDCT subroutine */
+ JDIMENSION bi;
+
+ sample_data += start_row; /* fold in the vertical offset once */
+
+ for (bi = 0; bi < num_blocks; bi++, start_col += DCTSIZE) {
+ /* Load data into workspace, applying unsigned->signed conversion */
+ { register DCTELEM *workspaceptr;
+ register JSAMPROW elemptr;
+ register int elemr;
+
+ workspaceptr = workspace;
+ for (elemr = 0; elemr < DCTSIZE; elemr++) {
+ elemptr = sample_data[elemr] + start_col;
+#if DCTSIZE == 8 /* unroll the inner loop */
+ *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;
+ *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;
+ *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;
+ *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;
+ *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;
+ *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;
+ *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;
+ *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;
+#else
+ { register int elemc;
+ for (elemc = DCTSIZE; elemc > 0; elemc--) {
+ *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;
+ }
+ }
+#endif
+ }
+ }
+
+ /* Perform the DCT */
+ (*do_dct) (workspace);
+
+ /* Quantize/descale the coefficients, and store into coef_blocks[] */
+ { register DCTELEM temp, qval;
+ register int i;
+ register JCOEFPTR output_ptr = coef_blocks[bi];
+
+ for (i = 0; i < DCTSIZE2; i++) {
+ qval = divisors[i];
+ temp = workspace[i];
+ /* Divide the coefficient value by qval, ensuring proper rounding.
+ * Since C does not specify the direction of rounding for negative
+ * quotients, we have to force the dividend positive for portability.
+ *
+ * In most files, at least half of the output values will be zero
+ * (at default quantization settings, more like three-quarters...)
+ * so we should ensure that this case is fast. On many machines,
+ * a comparison is enough cheaper than a divide to make a special test
+ * a win. Since both inputs will be nonnegative, we need only test
+ * for a < b to discover whether a/b is 0.
+ * If your machine's division is fast enough, define FAST_DIVIDE.
+ */
+#ifdef FAST_DIVIDE
+#define DIVIDE_BY(a,b) a /= b
+#else
+#define DIVIDE_BY(a,b) if (a >= b) a /= b; else a = 0
+#endif
+ if (temp < 0) {
+ temp = -temp;
+ temp += qval>>1; /* for rounding */
+ DIVIDE_BY(temp, qval);
+ temp = -temp;
+ } else {
+ temp += qval>>1; /* for rounding */
+ DIVIDE_BY(temp, qval);
+ }
+ output_ptr[i] = (JCOEF) temp;
+ }
+ }
+ }
+}
+
+
+#ifdef DCT_FLOAT_SUPPORTED
+
+METHODDEF(void)
+forward_DCT_float (j_compress_ptr cinfo, jpeg_component_info * compptr,
+ JSAMPARRAY sample_data, JBLOCKROW coef_blocks,
+ JDIMENSION start_row, JDIMENSION start_col,
+ JDIMENSION num_blocks)
+/* This version is used for floating-point DCT implementations. */
+{
+ /* This routine is heavily used, so it's worth coding it tightly. */
+ my_fdct_ptr fdct = (my_fdct_ptr) cinfo->fdct;
+ float_DCT_method_ptr do_dct = fdct->do_float_dct;
+ FAST_FLOAT * divisors = fdct->float_divisors[compptr->quant_tbl_no];
+ FAST_FLOAT workspace[DCTSIZE2]; /* work area for FDCT subroutine */
+ JDIMENSION bi;
+
+ sample_data += start_row; /* fold in the vertical offset once */
+
+ for (bi = 0; bi < num_blocks; bi++, start_col += DCTSIZE) {
+ /* Load data into workspace, applying unsigned->signed conversion */
+ { register FAST_FLOAT *workspaceptr;
+ register JSAMPROW elemptr;
+ register int elemr;
+
+ workspaceptr = workspace;
+ for (elemr = 0; elemr < DCTSIZE; elemr++) {
+ elemptr = sample_data[elemr] + start_col;
+#if DCTSIZE == 8 /* unroll the inner loop */
+ *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);
+ *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);
+ *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);
+ *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);
+ *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);
+ *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);
+ *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);
+ *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);
+#else
+ { register int elemc;
+ for (elemc = DCTSIZE; elemc > 0; elemc--) {
+ *workspaceptr++ = (FAST_FLOAT)
+ (GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);
+ }
+ }
+#endif
+ }
+ }
+
+ /* Perform the DCT */
+ (*do_dct) (workspace);
+
+ /* Quantize/descale the coefficients, and store into coef_blocks[] */
+ { register FAST_FLOAT temp;
+ register int i;
+ register JCOEFPTR output_ptr = coef_blocks[bi];
+
+ for (i = 0; i < DCTSIZE2; i++) {
+ /* Apply the quantization and scaling factor */
+ temp = workspace[i] * divisors[i];
+ /* Round to nearest integer.
+ * Since C does not specify the direction of rounding for negative
+ * quotients, we have to force the dividend positive for portability.
+ * The maximum coefficient size is +-16K (for 12-bit data), so this
+ * code should work for either 16-bit or 32-bit ints.
+ */
+ output_ptr[i] = (JCOEF) ((int) (temp + (FAST_FLOAT) 16384.5) - 16384);
+ }
+ }
+ }
+}
+
+#endif /* DCT_FLOAT_SUPPORTED */
+
+
+/*
+ * Initialize FDCT manager.
+ */
+
+GLOBAL(void)
+jinit_forward_dct (j_compress_ptr cinfo)
+{
+ my_fdct_ptr fdct;
+ int i;
+
+ fdct = (my_fdct_ptr)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ SIZEOF(my_fdct_controller));
+ cinfo->fdct = (struct jpeg_forward_dct *) fdct;
+ fdct->pub.start_pass = start_pass_fdctmgr;
+
+ switch (cinfo->dct_method) {
+#ifdef DCT_ISLOW_SUPPORTED
+ case JDCT_ISLOW:
+ fdct->pub.forward_DCT = forward_DCT;
+ fdct->do_dct = jpeg_fdct_islow;
+ break;
+#endif
+#ifdef DCT_IFAST_SUPPORTED
+ case JDCT_IFAST:
+ fdct->pub.forward_DCT = forward_DCT;
+ fdct->do_dct = jpeg_fdct_ifast;
+ break;
+#endif
+#ifdef DCT_FLOAT_SUPPORTED
+ case JDCT_FLOAT:
+ fdct->pub.forward_DCT = forward_DCT_float;
+ fdct->do_float_dct = jpeg_fdct_float;
+ break;
+#endif
+ default:
+ ERREXIT(cinfo, JERR_NOT_COMPILED);
+ break;
+ }
+
+ /* Mark divisor tables unallocated */
+ for (i = 0; i < NUM_QUANT_TBLS; i++) {
+ fdct->divisors[i] = NULL;
+#ifdef DCT_FLOAT_SUPPORTED
+ fdct->float_divisors[i] = NULL;
+#endif
+ }
+}
+
+#endif //_FX_JPEG_TURBO_
diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jchuff.c b/core/src/fxcodec/libjpeg/fpdfapi_jchuff.c
index 9ed1fe6da2..2a65aa253b 100644
--- a/core/src/fxcodec/libjpeg/fpdfapi_jchuff.c
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jchuff.c
@@ -1,915 +1,915 @@
-#if !defined(_FX_JPEG_TURBO_)
-/*
- * jchuff.c
- *
- * Copyright (C) 1991-1997, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains Huffman entropy encoding routines.
- *
- * Much of the complexity here has to do with supporting output suspension.
- * If the data destination module demands suspension, we want to be able to
- * back up to the start of the current MCU. To do this, we copy state
- * variables into local working storage, and update them back to the
- * permanent JPEG objects only upon successful completion of an MCU.
- */
-
-#define JPEG_INTERNALS
-#include "jinclude.h"
-#include "jpeglib.h"
-#include "jchuff.h" /* Declarations shared with jcphuff.c */
-
-#ifdef _FX_MANAGED_CODE_
-#define savable_state savable_state_c
-#endif
-
-/* Expanded entropy encoder object for Huffman encoding.
- *
- * The savable_state subrecord contains fields that change within an MCU,
- * but must not be updated permanently until we complete the MCU.
- */
-
-typedef struct {
- INT32 put_buffer; /* current bit-accumulation buffer */
- int put_bits; /* # of bits now in it */
- int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */
-} savable_state;
-
-/* This macro is to work around compilers with missing or broken
- * structure assignment. You'll need to fix this code if you have
- * such a compiler and you change MAX_COMPS_IN_SCAN.
- */
-
-#ifndef NO_STRUCT_ASSIGN
-#define ASSIGN_STATE(dest,src) ((dest) = (src))
-#else
-#if MAX_COMPS_IN_SCAN == 4
-#define ASSIGN_STATE(dest,src) \
- ((dest).put_buffer = (src).put_buffer, \
- (dest).put_bits = (src).put_bits, \
- (dest).last_dc_val[0] = (src).last_dc_val[0], \
- (dest).last_dc_val[1] = (src).last_dc_val[1], \
- (dest).last_dc_val[2] = (src).last_dc_val[2], \
- (dest).last_dc_val[3] = (src).last_dc_val[3])
-#endif
-#endif
-
-
-typedef struct {
- struct jpeg_entropy_encoder pub; /* public fields */
-
- savable_state saved; /* Bit buffer & DC state at start of MCU */
-
- /* These fields are NOT loaded into local working state. */
- unsigned int restarts_to_go; /* MCUs left in this restart interval */
- int next_restart_num; /* next restart number to write (0-7) */
-
- /* Pointers to derived tables (these workspaces have image lifespan) */
- c_derived_tbl * dc_derived_tbls[NUM_HUFF_TBLS];
- c_derived_tbl * ac_derived_tbls[NUM_HUFF_TBLS];
-
-#ifdef ENTROPY_OPT_SUPPORTED /* Statistics tables for optimization */
- long * dc_count_ptrs[NUM_HUFF_TBLS];
- long * ac_count_ptrs[NUM_HUFF_TBLS];
-#endif
-} huff_entropy_encoder;
-
-typedef huff_entropy_encoder * huff_entropy_ptr;
-
-/* Working state while writing an MCU.
- * This struct contains all the fields that are needed by subroutines.
- */
-
-typedef struct {
- JOCTET * next_output_byte; /* => next byte to write in buffer */
- size_t free_in_buffer; /* # of byte spaces remaining in buffer */
- savable_state cur; /* Current bit buffer & DC state */
- j_compress_ptr cinfo; /* dump_buffer needs access to this */
-} working_state;
-
-
-/* Forward declarations */
-METHODDEF(boolean) encode_mcu_huff JPP((j_compress_ptr cinfo,
- JBLOCKROW *MCU_data));
-METHODDEF(void) finish_pass_huff JPP((j_compress_ptr cinfo));
-#ifdef ENTROPY_OPT_SUPPORTED
-METHODDEF(boolean) encode_mcu_gather JPP((j_compress_ptr cinfo,
- JBLOCKROW *MCU_data));
-METHODDEF(void) finish_pass_gather JPP((j_compress_ptr cinfo));
-#endif
-
-
-/*
- * Initialize for a Huffman-compressed scan.
- * If gather_statistics is TRUE, we do not output anything during the scan,
- * just count the Huffman symbols used and generate Huffman code tables.
- */
-
-METHODDEF(void)
-start_pass_huff (j_compress_ptr cinfo, boolean gather_statistics)
-{
- huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
- int ci, dctbl, actbl;
- jpeg_component_info * compptr;
-
- if (gather_statistics) {
-#ifdef ENTROPY_OPT_SUPPORTED
- entropy->pub.encode_mcu = encode_mcu_gather;
- entropy->pub.finish_pass = finish_pass_gather;
-#else
- ERREXIT(cinfo, JERR_NOT_COMPILED);
-#endif
- } else {
- entropy->pub.encode_mcu = encode_mcu_huff;
- entropy->pub.finish_pass = finish_pass_huff;
- }
-
- for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
- compptr = cinfo->cur_comp_info[ci];
- dctbl = compptr->dc_tbl_no;
- actbl = compptr->ac_tbl_no;
- if (gather_statistics) {
-#ifdef ENTROPY_OPT_SUPPORTED
- /* Check for invalid table indexes */
- /* (make_c_derived_tbl does this in the other path) */
- if (dctbl < 0 || dctbl >= NUM_HUFF_TBLS)
- ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, dctbl);
- if (actbl < 0 || actbl >= NUM_HUFF_TBLS)
- ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, actbl);
- /* Allocate and zero the statistics tables */
- /* Note that jpeg_gen_optimal_table expects 257 entries in each table! */
- if (entropy->dc_count_ptrs[dctbl] == NULL)
- entropy->dc_count_ptrs[dctbl] = (long *)
- (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
- 257 * SIZEOF(long));
- MEMZERO(entropy->dc_count_ptrs[dctbl], 257 * SIZEOF(long));
- if (entropy->ac_count_ptrs[actbl] == NULL)
- entropy->ac_count_ptrs[actbl] = (long *)
- (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
- 257 * SIZEOF(long));
- MEMZERO(entropy->ac_count_ptrs[actbl], 257 * SIZEOF(long));
-#endif
- } else {
- /* Compute derived values for Huffman tables */
- /* We may do this more than once for a table, but it's not expensive */
- jpeg_make_c_derived_tbl(cinfo, TRUE, dctbl,
- & entropy->dc_derived_tbls[dctbl]);
- jpeg_make_c_derived_tbl(cinfo, FALSE, actbl,
- & entropy->ac_derived_tbls[actbl]);
- }
- /* Initialize DC predictions to 0 */
- entropy->saved.last_dc_val[ci] = 0;
- }
-
- /* Initialize bit buffer to empty */
- entropy->saved.put_buffer = 0;
- entropy->saved.put_bits = 0;
-
- /* Initialize restart stuff */
- entropy->restarts_to_go = cinfo->restart_interval;
- entropy->next_restart_num = 0;
-}
-
-
-/*
- * Compute the derived values for a Huffman table.
- * This routine also performs some validation checks on the table.
- *
- * Note this is also used by jcphuff.c.
- */
-
-GLOBAL(void)
-jpeg_make_c_derived_tbl (j_compress_ptr cinfo, boolean isDC, int tblno,
- c_derived_tbl ** pdtbl)
-{
- JHUFF_TBL *htbl;
- c_derived_tbl *dtbl;
- int p, i, l, lastp, _si, maxsymbol;
- char huffsize[257];
- unsigned int huffcode[257];
- unsigned int code;
-
- /* Note that huffsize[] and huffcode[] are filled in code-length order,
- * paralleling the order of the symbols themselves in htbl->huffval[].
- */
-
- /* Find the input Huffman table */
- if (tblno < 0 || tblno >= NUM_HUFF_TBLS)
- ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tblno);
- htbl =
- isDC ? cinfo->dc_huff_tbl_ptrs[tblno] : cinfo->ac_huff_tbl_ptrs[tblno];
- if (htbl == NULL)
- ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tblno);
-
- /* Allocate a workspace if we haven't already done so. */
- if (*pdtbl == NULL)
- *pdtbl = (c_derived_tbl *)
- (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
- SIZEOF(c_derived_tbl));
- dtbl = *pdtbl;
-
- /* Figure C.1: make table of Huffman code length for each symbol */
-
- p = 0;
- for (l = 1; l <= 16; l++) {
- i = (int) htbl->bits[l];
- if (i < 0 || p + i > 256) /* protect against table overrun */
- ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
- while (i--)
- huffsize[p++] = (char) l;
- }
- huffsize[p] = 0;
- lastp = p;
-
- /* Figure C.2: generate the codes themselves */
- /* We also validate that the counts represent a legal Huffman code tree. */
-
- code = 0;
- _si = huffsize[0];
- p = 0;
- while (huffsize[p]) {
- while (((int) huffsize[p]) == _si) {
- huffcode[p++] = code;
- code++;
- }
- /* code is now 1 more than the last code used for codelength si; but
- * it must still fit in si bits, since no code is allowed to be all ones.
- */
- if (((INT32) code) >= (((INT32) 1) << _si))
- ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
- code <<= 1;
- _si++;
- }
-
- /* Figure C.3: generate encoding tables */
- /* These are code and size indexed by symbol value */
-
- /* Set all codeless symbols to have code length 0;
- * this lets us detect duplicate VAL entries here, and later
- * allows emit_bits to detect any attempt to emit such symbols.
- */
- MEMZERO(dtbl->ehufsi, SIZEOF(dtbl->ehufsi));
-
- /* This is also a convenient place to check for out-of-range
- * and duplicated VAL entries. We allow 0..255 for AC symbols
- * but only 0..15 for DC. (We could constrain them further
- * based on data depth and mode, but this seems enough.)
- */
- maxsymbol = isDC ? 15 : 255;
-
- for (p = 0; p < lastp; p++) {
- i = htbl->huffval[p];
- if (i < 0 || i > maxsymbol || dtbl->ehufsi[i])
- ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
- dtbl->ehufco[i] = huffcode[p];
- dtbl->ehufsi[i] = huffsize[p];
- }
-}
-
-
-/* Outputting bytes to the file */
-
-/* Emit a byte, taking 'action' if must suspend. */
-#define emit_byte(state,val,action) \
- { *(state)->next_output_byte++ = (JOCTET) (val); \
- if (--(state)->free_in_buffer == 0) \
- if (! dump_buffer(state)) \
- { action; } }
-
-
-LOCAL(boolean)
-dump_buffer (working_state * state)
-/* Empty the output buffer; return TRUE if successful, FALSE if must suspend */
-{
- struct jpeg_destination_mgr * dest = state->cinfo->dest;
-
- if (! (*dest->empty_output_buffer) (state->cinfo))
- return FALSE;
- /* After a successful buffer dump, must reset buffer pointers */
- state->next_output_byte = dest->next_output_byte;
- state->free_in_buffer = dest->free_in_buffer;
- return TRUE;
-}
-
-
-/* Outputting bits to the file */
-
-/* Only the right 24 bits of put_buffer are used; the valid bits are
- * left-justified in this part. At most 16 bits can be passed to emit_bits
- * in one call, and we never retain more than 7 bits in put_buffer
- * between calls, so 24 bits are sufficient.
- */
-
-INLINE
-LOCAL(boolean)
-emit_bits (working_state * state, unsigned int code, int size)
-/* Emit some bits; return TRUE if successful, FALSE if must suspend */
-{
- /* This routine is heavily used, so it's worth coding tightly. */
- register INT32 put_buffer = (INT32) code;
- register int put_bits = state->cur.put_bits;
-
- /* if size is 0, caller used an invalid Huffman table entry */
- if (size == 0)
- ERREXIT(state->cinfo, JERR_HUFF_MISSING_CODE);
-
- put_buffer &= (((INT32) 1)<<size) - 1; /* mask off any extra bits in code */
-
- put_bits += size; /* new number of bits in buffer */
-
- put_buffer <<= 24 - put_bits; /* align incoming bits */
-
- put_buffer |= state->cur.put_buffer; /* and merge with old buffer contents */
-
- while (put_bits >= 8) {
- int c = (int) ((put_buffer >> 16) & 0xFF);
-
- emit_byte(state, c, return FALSE);
- if (c == 0xFF) { /* need to stuff a zero byte? */
- emit_byte(state, 0, return FALSE);
- }
- put_buffer <<= 8;
- put_bits -= 8;
- }
-
- state->cur.put_buffer = put_buffer; /* update state variables */
- state->cur.put_bits = put_bits;
-
- return TRUE;
-}
-
-
-LOCAL(boolean)
-flush_bits (working_state * state)
-{
- if (! emit_bits(state, 0x7F, 7)) /* fill any partial byte with ones */
- return FALSE;
- state->cur.put_buffer = 0; /* and reset bit-buffer to empty */
- state->cur.put_bits = 0;
- return TRUE;
-}
-
-
-/* Encode a single block's worth of coefficients */
-
-LOCAL(boolean)
-encode_one_block (working_state * state, JCOEFPTR block, int last_dc_val,
- c_derived_tbl *dctbl, c_derived_tbl *actbl)
-{
- register int temp, temp2;
- register int nbits;
- register int k, r, i;
-
- /* Encode the DC coefficient difference per section F.1.2.1 */
-
- temp = temp2 = block[0] - last_dc_val;
-
- if (temp < 0) {
- temp = -temp; /* temp is abs value of input */
- /* For a negative input, want temp2 = bitwise complement of abs(input) */
- /* This code assumes we are on a two's complement machine */
- temp2--;
- }
-
- /* Find the number of bits needed for the magnitude of the coefficient */
- nbits = 0;
- while (temp) {
- nbits++;
- temp >>= 1;
- }
- /* Check for out-of-range coefficient values.
- * Since we're encoding a difference, the range limit is twice as much.
- */
- if (nbits > MAX_COEF_BITS+1)
- ERREXIT(state->cinfo, JERR_BAD_DCT_COEF);
-
- /* Emit the Huffman-coded symbol for the number of bits */
- if (! emit_bits(state, dctbl->ehufco[nbits], dctbl->ehufsi[nbits]))
- return FALSE;
-
- /* Emit that number of bits of the value, if positive, */
- /* or the complement of its magnitude, if negative. */
- if (nbits) /* emit_bits rejects calls with size 0 */
- if (! emit_bits(state, (unsigned int) temp2, nbits))
- return FALSE;
-
- /* Encode the AC coefficients per section F.1.2.2 */
-
- r = 0; /* r = run length of zeros */
-
- for (k = 1; k < DCTSIZE2; k++) {
- if ((temp = block[jpeg_natural_order[k]]) == 0) {
- r++;
- } else {
- /* if run length > 15, must emit special run-length-16 codes (0xF0) */
- while (r > 15) {
- if (! emit_bits(state, actbl->ehufco[0xF0], actbl->ehufsi[0xF0]))
- return FALSE;
- r -= 16;
- }
-
- temp2 = temp;
- if (temp < 0) {
- temp = -temp; /* temp is abs value of input */
- /* This code assumes we are on a two's complement machine */
- temp2--;
- }
-
- /* Find the number of bits needed for the magnitude of the coefficient */
- nbits = 1; /* there must be at least one 1 bit */
- while ((temp >>= 1))
- nbits++;
- /* Check for out-of-range coefficient values */
- if (nbits > MAX_COEF_BITS)
- ERREXIT(state->cinfo, JERR_BAD_DCT_COEF);
-
- /* Emit Huffman symbol for run length / number of bits */
- i = (r << 4) + nbits;
- if (! emit_bits(state, actbl->ehufco[i], actbl->ehufsi[i]))
- return FALSE;
-
- /* Emit that number of bits of the value, if positive, */
- /* or the complement of its magnitude, if negative. */
- if (! emit_bits(state, (unsigned int) temp2, nbits))
- return FALSE;
-
- r = 0;
- }
- }
-
- /* If the last coef(s) were zero, emit an end-of-block code */
- if (r > 0)
- if (! emit_bits(state, actbl->ehufco[0], actbl->ehufsi[0]))
- return FALSE;
-
- return TRUE;
-}
-
-
-/*
- * Emit a restart marker & resynchronize predictions.
- */
-
-LOCAL(boolean)
-emit_restart (working_state * state, int restart_num)
-{
- int ci;
-
- if (! flush_bits(state))
- return FALSE;
-
- emit_byte(state, 0xFF, return FALSE);
- emit_byte(state, JPEG_RST0 + restart_num, return FALSE);
-
- /* Re-initialize DC predictions to 0 */
- for (ci = 0; ci < state->cinfo->comps_in_scan; ci++)
- state->cur.last_dc_val[ci] = 0;
-
- /* The restart counter is not updated until we successfully write the MCU. */
-
- return TRUE;
-}
-
-
-/*
- * Encode and output one MCU's worth of Huffman-compressed coefficients.
- */
-
-METHODDEF(boolean)
-encode_mcu_huff (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
-{
- huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
- working_state state;
- int blkn, ci;
- jpeg_component_info * compptr;
-
- /* Load up working state */
- state.next_output_byte = cinfo->dest->next_output_byte;
- state.free_in_buffer = cinfo->dest->free_in_buffer;
- ASSIGN_STATE(state.cur, entropy->saved);
- state.cinfo = cinfo;
-
- /* Emit restart marker if needed */
- if (cinfo->restart_interval) {
- if (entropy->restarts_to_go == 0)
- if (! emit_restart(&state, entropy->next_restart_num))
- return FALSE;
- }
-
- /* Encode the MCU data blocks */
- for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
- ci = cinfo->MCU_membership[blkn];
- compptr = cinfo->cur_comp_info[ci];
- if (! encode_one_block(&state,
- MCU_data[blkn][0], state.cur.last_dc_val[ci],
- entropy->dc_derived_tbls[compptr->dc_tbl_no],
- entropy->ac_derived_tbls[compptr->ac_tbl_no]))
- return FALSE;
- /* Update last_dc_val */
- state.cur.last_dc_val[ci] = MCU_data[blkn][0][0];
- }
-
- /* Completed MCU, so update state */
- cinfo->dest->next_output_byte = state.next_output_byte;
- cinfo->dest->free_in_buffer = state.free_in_buffer;
- ASSIGN_STATE(entropy->saved, state.cur);
-
- /* Update restart-interval state too */
- if (cinfo->restart_interval) {
- if (entropy->restarts_to_go == 0) {
- entropy->restarts_to_go = cinfo->restart_interval;
- entropy->next_restart_num++;
- entropy->next_restart_num &= 7;
- }
- entropy->restarts_to_go--;
- }
-
- return TRUE;
-}
-
-
-/*
- * Finish up at the end of a Huffman-compressed scan.
- */
-
-METHODDEF(void)
-finish_pass_huff (j_compress_ptr cinfo)
-{
- huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
- working_state state;
-
- /* Load up working state ... flush_bits needs it */
- state.next_output_byte = cinfo->dest->next_output_byte;
- state.free_in_buffer = cinfo->dest->free_in_buffer;
- ASSIGN_STATE(state.cur, entropy->saved);
- state.cinfo = cinfo;
-
- /* Flush out the last data */
- if (! flush_bits(&state))
- ERREXIT(cinfo, JERR_CANT_SUSPEND);
-
- /* Update state */
- cinfo->dest->next_output_byte = state.next_output_byte;
- cinfo->dest->free_in_buffer = state.free_in_buffer;
- ASSIGN_STATE(entropy->saved, state.cur);
-}
-
-
-/*
- * Huffman coding optimization.
- *
- * We first scan the supplied data and count the number of uses of each symbol
- * that is to be Huffman-coded. (This process MUST agree with the code above.)
- * Then we build a Huffman coding tree for the observed counts.
- * Symbols which are not needed at all for the particular image are not
- * assigned any code, which saves space in the DHT marker as well as in
- * the compressed data.
- */
-
-#ifdef ENTROPY_OPT_SUPPORTED
-
-
-/* Process a single block's worth of coefficients */
-
-LOCAL(void)
-htest_one_block (j_compress_ptr cinfo, JCOEFPTR block, int last_dc_val,
- long dc_counts[], long ac_counts[])
-{
- register int temp;
- register int nbits;
- register int k, r;
-
- /* Encode the DC coefficient difference per section F.1.2.1 */
-
- temp = block[0] - last_dc_val;
- if (temp < 0)
- temp = -temp;
-
- /* Find the number of bits needed for the magnitude of the coefficient */
- nbits = 0;
- while (temp) {
- nbits++;
- temp >>= 1;
- }
- /* Check for out-of-range coefficient values.
- * Since we're encoding a difference, the range limit is twice as much.
- */
- if (nbits > MAX_COEF_BITS+1)
- ERREXIT(cinfo, JERR_BAD_DCT_COEF);
-
- /* Count the Huffman symbol for the number of bits */
- dc_counts[nbits]++;
-
- /* Encode the AC coefficients per section F.1.2.2 */
-
- r = 0; /* r = run length of zeros */
-
- for (k = 1; k < DCTSIZE2; k++) {
- if ((temp = block[jpeg_natural_order[k]]) == 0) {
- r++;
- } else {
- /* if run length > 15, must emit special run-length-16 codes (0xF0) */
- while (r > 15) {
- ac_counts[0xF0]++;
- r -= 16;
- }
-
- /* Find the number of bits needed for the magnitude of the coefficient */
- if (temp < 0)
- temp = -temp;
-
- /* Find the number of bits needed for the magnitude of the coefficient */
- nbits = 1; /* there must be at least one 1 bit */
- while ((temp >>= 1))
- nbits++;
- /* Check for out-of-range coefficient values */
- if (nbits > MAX_COEF_BITS)
- ERREXIT(cinfo, JERR_BAD_DCT_COEF);
-
- /* Count Huffman symbol for run length / number of bits */
- ac_counts[(r << 4) + nbits]++;
-
- r = 0;
- }
- }
-
- /* If the last coef(s) were zero, emit an end-of-block code */
- if (r > 0)
- ac_counts[0]++;
-}
-
-
-/*
- * Trial-encode one MCU's worth of Huffman-compressed coefficients.
- * No data is actually output, so no suspension return is possible.
- */
-
-METHODDEF(boolean)
-encode_mcu_gather (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
-{
- huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
- int blkn, ci;
- jpeg_component_info * compptr;
-
- /* Take care of restart intervals if needed */
- if (cinfo->restart_interval) {
- if (entropy->restarts_to_go == 0) {
- /* Re-initialize DC predictions to 0 */
- for (ci = 0; ci < cinfo->comps_in_scan; ci++)
- entropy->saved.last_dc_val[ci] = 0;
- /* Update restart state */
- entropy->restarts_to_go = cinfo->restart_interval;
- }
- entropy->restarts_to_go--;
- }
-
- for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
- ci = cinfo->MCU_membership[blkn];
- compptr = cinfo->cur_comp_info[ci];
- htest_one_block(cinfo, MCU_data[blkn][0], entropy->saved.last_dc_val[ci],
- entropy->dc_count_ptrs[compptr->dc_tbl_no],
- entropy->ac_count_ptrs[compptr->ac_tbl_no]);
- entropy->saved.last_dc_val[ci] = MCU_data[blkn][0][0];
- }
-
- return TRUE;
-}
-
-
-/*
- * Generate the best Huffman code table for the given counts, fill htbl.
- * Note this is also used by jcphuff.c.
- *
- * The JPEG standard requires that no symbol be assigned a codeword of all
- * one bits (so that padding bits added at the end of a compressed segment
- * can't look like a valid code). Because of the canonical ordering of
- * codewords, this just means that there must be an unused slot in the
- * longest codeword length category. Section K.2 of the JPEG spec suggests
- * reserving such a slot by pretending that symbol 256 is a valid symbol
- * with count 1. In theory that's not optimal; giving it count zero but
- * including it in the symbol set anyway should give a better Huffman code.
- * But the theoretically better code actually seems to come out worse in
- * practice, because it produces more all-ones bytes (which incur stuffed
- * zero bytes in the final file). In any case the difference is tiny.
- *
- * The JPEG standard requires Huffman codes to be no more than 16 bits long.
- * If some symbols have a very small but nonzero probability, the Huffman tree
- * must be adjusted to meet the code length restriction. We currently use
- * the adjustment method suggested in JPEG section K.2. This method is *not*
- * optimal; it may not choose the best possible limited-length code. But
- * typically only very-low-frequency symbols will be given less-than-optimal
- * lengths, so the code is almost optimal. Experimental comparisons against
- * an optimal limited-length-code algorithm indicate that the difference is
- * microscopic --- usually less than a hundredth of a percent of total size.
- * So the extra complexity of an optimal algorithm doesn't seem worthwhile.
- */
-
-GLOBAL(void)
-jpeg_gen_optimal_table (j_compress_ptr cinfo, JHUFF_TBL * htbl, long freq[])
-{
-#define MAX_CLEN 32 /* assumed maximum initial code length */
- UINT8 bits[MAX_CLEN+1]; /* bits[k] = # of symbols with code length k */
- int codesize[257]; /* codesize[k] = code length of symbol k */
- int others[257]; /* next symbol in current branch of tree */
- int c1, c2;
- int p, i, j;
- long v;
-
- /* This algorithm is explained in section K.2 of the JPEG standard */
-
- MEMZERO(bits, SIZEOF(bits));
- MEMZERO(codesize, SIZEOF(codesize));
- for (i = 0; i < 257; i++)
- others[i] = -1; /* init links to empty */
-
- freq[256] = 1; /* make sure 256 has a nonzero count */
- /* Including the pseudo-symbol 256 in the Huffman procedure guarantees
- * that no real symbol is given code-value of all ones, because 256
- * will be placed last in the largest codeword category.
- */
-
- /* Huffman's basic algorithm to assign optimal code lengths to symbols */
-
- for (;;) {
- /* Find the smallest nonzero frequency, set c1 = its symbol */
- /* In case of ties, take the larger symbol number */
- c1 = -1;
- v = 1000000000L;
- for (i = 0; i <= 256; i++) {
- if (freq[i] && freq[i] <= v) {
- v = freq[i];
- c1 = i;
- }
- }
-
- /* Find the next smallest nonzero frequency, set c2 = its symbol */
- /* In case of ties, take the larger symbol number */
- c2 = -1;
- v = 1000000000L;
- for (i = 0; i <= 256; i++) {
- if (freq[i] && freq[i] <= v && i != c1) {
- v = freq[i];
- c2 = i;
- }
- }
-
- /* Done if we've merged everything into one frequency */
- if (c2 < 0)
- break;
-
- /* Else merge the two counts/trees */
- freq[c1] += freq[c2];
- freq[c2] = 0;
-
- /* Increment the codesize of everything in c1's tree branch */
- codesize[c1]++;
- while (others[c1] >= 0) {
- c1 = others[c1];
- codesize[c1]++;
- }
-
- others[c1] = c2; /* chain c2 onto c1's tree branch */
-
- /* Increment the codesize of everything in c2's tree branch */
- codesize[c2]++;
- while (others[c2] >= 0) {
- c2 = others[c2];
- codesize[c2]++;
- }
- }
-
- /* Now count the number of symbols of each code length */
- for (i = 0; i <= 256; i++) {
- if (codesize[i]) {
- /* The JPEG standard seems to think that this can't happen, */
- /* but I'm paranoid... */
- if (codesize[i] > MAX_CLEN)
- ERREXIT(cinfo, JERR_HUFF_CLEN_OVERFLOW);
-
- bits[codesize[i]]++;
- }
- }
-
- /* JPEG doesn't allow symbols with code lengths over 16 bits, so if the pure
- * Huffman procedure assigned any such lengths, we must adjust the coding.
- * Here is what the JPEG spec says about how this next bit works:
- * Since symbols are paired for the longest Huffman code, the symbols are
- * removed from this length category two at a time. The prefix for the pair
- * (which is one bit shorter) is allocated to one of the pair; then,
- * skipping the BITS entry for that prefix length, a code word from the next
- * shortest nonzero BITS entry is converted into a prefix for two code words
- * one bit longer.
- */
-
- for (i = MAX_CLEN; i > 16; i--) {
- while (bits[i] > 0) {
- j = i - 2; /* find length of new prefix to be used */
- while (bits[j] == 0)
- j--;
-
- bits[i] -= 2; /* remove two symbols */
- bits[i-1]++; /* one goes in this length */
- bits[j+1] += 2; /* two new symbols in this length */
- bits[j]--; /* symbol of this length is now a prefix */
- }
- }
-
- /* Remove the count for the pseudo-symbol 256 from the largest codelength */
- while (bits[i] == 0) /* find largest codelength still in use */
- i--;
- bits[i]--;
-
- /* Return final symbol counts (only for lengths 0..16) */
- MEMCOPY(htbl->bits, bits, SIZEOF(htbl->bits));
-
- /* Return a list of the symbols sorted by code length */
- /* It's not real clear to me why we don't need to consider the codelength
- * changes made above, but the JPEG spec seems to think this works.
- */
- p = 0;
- for (i = 1; i <= MAX_CLEN; i++) {
- for (j = 0; j <= 255; j++) {
- if (codesize[j] == i) {
- htbl->huffval[p] = (UINT8) j;
- p++;
- }
- }
- }
-
- /* Set sent_table FALSE so updated table will be written to JPEG file. */
- htbl->sent_table = FALSE;
-}
-
-
-/*
- * Finish up a statistics-gathering pass and create the new Huffman tables.
- */
-
-METHODDEF(void)
-finish_pass_gather (j_compress_ptr cinfo)
-{
- huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
- int ci, dctbl, actbl;
- jpeg_component_info * compptr;
- JHUFF_TBL **htblptr;
- boolean did_dc[NUM_HUFF_TBLS];
- boolean did_ac[NUM_HUFF_TBLS];
-
- /* It's important not to apply jpeg_gen_optimal_table more than once
- * per table, because it clobbers the input frequency counts!
- */
- MEMZERO(did_dc, SIZEOF(did_dc));
- MEMZERO(did_ac, SIZEOF(did_ac));
-
- for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
- compptr = cinfo->cur_comp_info[ci];
- dctbl = compptr->dc_tbl_no;
- actbl = compptr->ac_tbl_no;
- if (! did_dc[dctbl]) {
- htblptr = & cinfo->dc_huff_tbl_ptrs[dctbl];
- if (*htblptr == NULL)
- *htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo);
- jpeg_gen_optimal_table(cinfo, *htblptr, entropy->dc_count_ptrs[dctbl]);
- did_dc[dctbl] = TRUE;
- }
- if (! did_ac[actbl]) {
- htblptr = & cinfo->ac_huff_tbl_ptrs[actbl];
- if (*htblptr == NULL)
- *htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo);
- jpeg_gen_optimal_table(cinfo, *htblptr, entropy->ac_count_ptrs[actbl]);
- did_ac[actbl] = TRUE;
- }
- }
-}
-
-
-#endif /* ENTROPY_OPT_SUPPORTED */
-
-
-/*
- * Module initialization routine for Huffman entropy encoding.
- */
-
-GLOBAL(void)
-jinit_huff_encoder (j_compress_ptr cinfo)
-{
- huff_entropy_ptr entropy;
- int i;
-
- entropy = (huff_entropy_ptr)
- (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
- SIZEOF(huff_entropy_encoder));
- cinfo->entropy = (struct jpeg_entropy_encoder *) entropy;
- entropy->pub.start_pass = start_pass_huff;
-
- /* Mark tables unallocated */
- for (i = 0; i < NUM_HUFF_TBLS; i++) {
- entropy->dc_derived_tbls[i] = entropy->ac_derived_tbls[i] = NULL;
-#ifdef ENTROPY_OPT_SUPPORTED
- entropy->dc_count_ptrs[i] = entropy->ac_count_ptrs[i] = NULL;
-#endif
- }
-}
-
-#endif //_FX_JPEG_TURBO_
+#if !defined(_FX_JPEG_TURBO_)
+/*
+ * jchuff.c
+ *
+ * Copyright (C) 1991-1997, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains Huffman entropy encoding routines.
+ *
+ * Much of the complexity here has to do with supporting output suspension.
+ * If the data destination module demands suspension, we want to be able to
+ * back up to the start of the current MCU. To do this, we copy state
+ * variables into local working storage, and update them back to the
+ * permanent JPEG objects only upon successful completion of an MCU.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+#include "jchuff.h" /* Declarations shared with jcphuff.c */
+
+#ifdef _FX_MANAGED_CODE_
+#define savable_state savable_state_c
+#endif
+
+/* Expanded entropy encoder object for Huffman encoding.
+ *
+ * The savable_state subrecord contains fields that change within an MCU,
+ * but must not be updated permanently until we complete the MCU.
+ */
+
+typedef struct {
+ INT32 put_buffer; /* current bit-accumulation buffer */
+ int put_bits; /* # of bits now in it */
+ int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */
+} savable_state;
+
+/* This macro is to work around compilers with missing or broken
+ * structure assignment. You'll need to fix this code if you have
+ * such a compiler and you change MAX_COMPS_IN_SCAN.
+ */
+
+#ifndef NO_STRUCT_ASSIGN
+#define ASSIGN_STATE(dest,src) ((dest) = (src))
+#else
+#if MAX_COMPS_IN_SCAN == 4
+#define ASSIGN_STATE(dest,src) \
+ ((dest).put_buffer = (src).put_buffer, \
+ (dest).put_bits = (src).put_bits, \
+ (dest).last_dc_val[0] = (src).last_dc_val[0], \
+ (dest).last_dc_val[1] = (src).last_dc_val[1], \
+ (dest).last_dc_val[2] = (src).last_dc_val[2], \
+ (dest).last_dc_val[3] = (src).last_dc_val[3])
+#endif
+#endif
+
+
+typedef struct {
+ struct jpeg_entropy_encoder pub; /* public fields */
+
+ savable_state saved; /* Bit buffer & DC state at start of MCU */
+
+ /* These fields are NOT loaded into local working state. */
+ unsigned int restarts_to_go; /* MCUs left in this restart interval */
+ int next_restart_num; /* next restart number to write (0-7) */
+
+ /* Pointers to derived tables (these workspaces have image lifespan) */
+ c_derived_tbl * dc_derived_tbls[NUM_HUFF_TBLS];
+ c_derived_tbl * ac_derived_tbls[NUM_HUFF_TBLS];
+
+#ifdef ENTROPY_OPT_SUPPORTED /* Statistics tables for optimization */
+ long * dc_count_ptrs[NUM_HUFF_TBLS];
+ long * ac_count_ptrs[NUM_HUFF_TBLS];
+#endif
+} huff_entropy_encoder;
+
+typedef huff_entropy_encoder * huff_entropy_ptr;
+
+/* Working state while writing an MCU.
+ * This struct contains all the fields that are needed by subroutines.
+ */
+
+typedef struct {
+ JOCTET * next_output_byte; /* => next byte to write in buffer */
+ size_t free_in_buffer; /* # of byte spaces remaining in buffer */
+ savable_state cur; /* Current bit buffer & DC state */
+ j_compress_ptr cinfo; /* dump_buffer needs access to this */
+} working_state;
+
+
+/* Forward declarations */
+METHODDEF(boolean) encode_mcu_huff JPP((j_compress_ptr cinfo,
+ JBLOCKROW *MCU_data));
+METHODDEF(void) finish_pass_huff JPP((j_compress_ptr cinfo));
+#ifdef ENTROPY_OPT_SUPPORTED
+METHODDEF(boolean) encode_mcu_gather JPP((j_compress_ptr cinfo,
+ JBLOCKROW *MCU_data));
+METHODDEF(void) finish_pass_gather JPP((j_compress_ptr cinfo));
+#endif
+
+
+/*
+ * Initialize for a Huffman-compressed scan.
+ * If gather_statistics is TRUE, we do not output anything during the scan,
+ * just count the Huffman symbols used and generate Huffman code tables.
+ */
+
+METHODDEF(void)
+start_pass_huff (j_compress_ptr cinfo, boolean gather_statistics)
+{
+ huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
+ int ci, dctbl, actbl;
+ jpeg_component_info * compptr;
+
+ if (gather_statistics) {
+#ifdef ENTROPY_OPT_SUPPORTED
+ entropy->pub.encode_mcu = encode_mcu_gather;
+ entropy->pub.finish_pass = finish_pass_gather;
+#else
+ ERREXIT(cinfo, JERR_NOT_COMPILED);
+#endif
+ } else {
+ entropy->pub.encode_mcu = encode_mcu_huff;
+ entropy->pub.finish_pass = finish_pass_huff;
+ }
+
+ for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
+ compptr = cinfo->cur_comp_info[ci];
+ dctbl = compptr->dc_tbl_no;
+ actbl = compptr->ac_tbl_no;
+ if (gather_statistics) {
+#ifdef ENTROPY_OPT_SUPPORTED
+ /* Check for invalid table indexes */
+ /* (make_c_derived_tbl does this in the other path) */
+ if (dctbl < 0 || dctbl >= NUM_HUFF_TBLS)
+ ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, dctbl);
+ if (actbl < 0 || actbl >= NUM_HUFF_TBLS)
+ ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, actbl);
+ /* Allocate and zero the statistics tables */
+ /* Note that jpeg_gen_optimal_table expects 257 entries in each table! */
+ if (entropy->dc_count_ptrs[dctbl] == NULL)
+ entropy->dc_count_ptrs[dctbl] = (long *)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ 257 * SIZEOF(long));
+ MEMZERO(entropy->dc_count_ptrs[dctbl], 257 * SIZEOF(long));
+ if (entropy->ac_count_ptrs[actbl] == NULL)
+ entropy->ac_count_ptrs[actbl] = (long *)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ 257 * SIZEOF(long));
+ MEMZERO(entropy->ac_count_ptrs[actbl], 257 * SIZEOF(long));
+#endif
+ } else {
+ /* Compute derived values for Huffman tables */
+ /* We may do this more than once for a table, but it's not expensive */
+ jpeg_make_c_derived_tbl(cinfo, TRUE, dctbl,
+ & entropy->dc_derived_tbls[dctbl]);
+ jpeg_make_c_derived_tbl(cinfo, FALSE, actbl,
+ & entropy->ac_derived_tbls[actbl]);
+ }
+ /* Initialize DC predictions to 0 */
+ entropy->saved.last_dc_val[ci] = 0;
+ }
+
+ /* Initialize bit buffer to empty */
+ entropy->saved.put_buffer = 0;
+ entropy->saved.put_bits = 0;
+
+ /* Initialize restart stuff */
+ entropy->restarts_to_go = cinfo->restart_interval;
+ entropy->next_restart_num = 0;
+}
+
+
+/*
+ * Compute the derived values for a Huffman table.
+ * This routine also performs some validation checks on the table.
+ *
+ * Note this is also used by jcphuff.c.
+ */
+
+GLOBAL(void)
+jpeg_make_c_derived_tbl (j_compress_ptr cinfo, boolean isDC, int tblno,
+ c_derived_tbl ** pdtbl)
+{
+ JHUFF_TBL *htbl;
+ c_derived_tbl *dtbl;
+ int p, i, l, lastp, _si, maxsymbol;
+ char huffsize[257];
+ unsigned int huffcode[257];
+ unsigned int code;
+
+ /* Note that huffsize[] and huffcode[] are filled in code-length order,
+ * paralleling the order of the symbols themselves in htbl->huffval[].
+ */
+
+ /* Find the input Huffman table */
+ if (tblno < 0 || tblno >= NUM_HUFF_TBLS)
+ ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tblno);
+ htbl =
+ isDC ? cinfo->dc_huff_tbl_ptrs[tblno] : cinfo->ac_huff_tbl_ptrs[tblno];
+ if (htbl == NULL)
+ ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tblno);
+
+ /* Allocate a workspace if we haven't already done so. */
+ if (*pdtbl == NULL)
+ *pdtbl = (c_derived_tbl *)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ SIZEOF(c_derived_tbl));
+ dtbl = *pdtbl;
+
+ /* Figure C.1: make table of Huffman code length for each symbol */
+
+ p = 0;
+ for (l = 1; l <= 16; l++) {
+ i = (int) htbl->bits[l];
+ if (i < 0 || p + i > 256) /* protect against table overrun */
+ ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
+ while (i--)
+ huffsize[p++] = (char) l;
+ }
+ huffsize[p] = 0;
+ lastp = p;
+
+ /* Figure C.2: generate the codes themselves */
+ /* We also validate that the counts represent a legal Huffman code tree. */
+
+ code = 0;
+ _si = huffsize[0];
+ p = 0;
+ while (huffsize[p]) {
+ while (((int) huffsize[p]) == _si) {
+ huffcode[p++] = code;
+ code++;
+ }
+ /* code is now 1 more than the last code used for codelength si; but
+ * it must still fit in si bits, since no code is allowed to be all ones.
+ */
+ if (((INT32) code) >= (((INT32) 1) << _si))
+ ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
+ code <<= 1;
+ _si++;
+ }
+
+ /* Figure C.3: generate encoding tables */
+ /* These are code and size indexed by symbol value */
+
+ /* Set all codeless symbols to have code length 0;
+ * this lets us detect duplicate VAL entries here, and later
+ * allows emit_bits to detect any attempt to emit such symbols.
+ */
+ MEMZERO(dtbl->ehufsi, SIZEOF(dtbl->ehufsi));
+
+ /* This is also a convenient place to check for out-of-range
+ * and duplicated VAL entries. We allow 0..255 for AC symbols
+ * but only 0..15 for DC. (We could constrain them further
+ * based on data depth and mode, but this seems enough.)
+ */
+ maxsymbol = isDC ? 15 : 255;
+
+ for (p = 0; p < lastp; p++) {
+ i = htbl->huffval[p];
+ if (i < 0 || i > maxsymbol || dtbl->ehufsi[i])
+ ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
+ dtbl->ehufco[i] = huffcode[p];
+ dtbl->ehufsi[i] = huffsize[p];
+ }
+}
+
+
+/* Outputting bytes to the file */
+
+/* Emit a byte, taking 'action' if must suspend. */
+#define emit_byte(state,val,action) \
+ { *(state)->next_output_byte++ = (JOCTET) (val); \
+ if (--(state)->free_in_buffer == 0) \
+ if (! dump_buffer(state)) \
+ { action; } }
+
+
+LOCAL(boolean)
+dump_buffer (working_state * state)
+/* Empty the output buffer; return TRUE if successful, FALSE if must suspend */
+{
+ struct jpeg_destination_mgr * dest = state->cinfo->dest;
+
+ if (! (*dest->empty_output_buffer) (state->cinfo))
+ return FALSE;
+ /* After a successful buffer dump, must reset buffer pointers */
+ state->next_output_byte = dest->next_output_byte;
+ state->free_in_buffer = dest->free_in_buffer;
+ return TRUE;
+}
+
+
+/* Outputting bits to the file */
+
+/* Only the right 24 bits of put_buffer are used; the valid bits are
+ * left-justified in this part. At most 16 bits can be passed to emit_bits
+ * in one call, and we never retain more than 7 bits in put_buffer
+ * between calls, so 24 bits are sufficient.
+ */
+
+INLINE
+LOCAL(boolean)
+emit_bits (working_state * state, unsigned int code, int size)
+/* Emit some bits; return TRUE if successful, FALSE if must suspend */
+{
+ /* This routine is heavily used, so it's worth coding tightly. */
+ register INT32 put_buffer = (INT32) code;
+ register int put_bits = state->cur.put_bits;
+
+ /* if size is 0, caller used an invalid Huffman table entry */
+ if (size == 0)
+ ERREXIT(state->cinfo, JERR_HUFF_MISSING_CODE);
+
+ put_buffer &= (((INT32) 1)<<size) - 1; /* mask off any extra bits in code */
+
+ put_bits += size; /* new number of bits in buffer */
+
+ put_buffer <<= 24 - put_bits; /* align incoming bits */
+
+ put_buffer |= state->cur.put_buffer; /* and merge with old buffer contents */
+
+ while (put_bits >= 8) {
+ int c = (int) ((put_buffer >> 16) & 0xFF);
+
+ emit_byte(state, c, return FALSE);
+ if (c == 0xFF) { /* need to stuff a zero byte? */
+ emit_byte(state, 0, return FALSE);
+ }
+ put_buffer <<= 8;
+ put_bits -= 8;
+ }
+
+ state->cur.put_buffer = put_buffer; /* update state variables */
+ state->cur.put_bits = put_bits;
+
+ return TRUE;
+}
+
+
+LOCAL(boolean)
+flush_bits (working_state * state)
+{
+ if (! emit_bits(state, 0x7F, 7)) /* fill any partial byte with ones */
+ return FALSE;
+ state->cur.put_buffer = 0; /* and reset bit-buffer to empty */
+ state->cur.put_bits = 0;
+ return TRUE;
+}
+
+
+/* Encode a single block's worth of coefficients */
+
+LOCAL(boolean)
+encode_one_block (working_state * state, JCOEFPTR block, int last_dc_val,
+ c_derived_tbl *dctbl, c_derived_tbl *actbl)
+{
+ register int temp, temp2;
+ register int nbits;
+ register int k, r, i;
+
+ /* Encode the DC coefficient difference per section F.1.2.1 */
+
+ temp = temp2 = block[0] - last_dc_val;
+
+ if (temp < 0) {
+ temp = -temp; /* temp is abs value of input */
+ /* For a negative input, want temp2 = bitwise complement of abs(input) */
+ /* This code assumes we are on a two's complement machine */
+ temp2--;
+ }
+
+ /* Find the number of bits needed for the magnitude of the coefficient */
+ nbits = 0;
+ while (temp) {
+ nbits++;
+ temp >>= 1;
+ }
+ /* Check for out-of-range coefficient values.
+ * Since we're encoding a difference, the range limit is twice as much.
+ */
+ if (nbits > MAX_COEF_BITS+1)
+ ERREXIT(state->cinfo, JERR_BAD_DCT_COEF);
+
+ /* Emit the Huffman-coded symbol for the number of bits */
+ if (! emit_bits(state, dctbl->ehufco[nbits], dctbl->ehufsi[nbits]))
+ return FALSE;
+
+ /* Emit that number of bits of the value, if positive, */
+ /* or the complement of its magnitude, if negative. */
+ if (nbits) /* emit_bits rejects calls with size 0 */
+ if (! emit_bits(state, (unsigned int) temp2, nbits))
+ return FALSE;
+
+ /* Encode the AC coefficients per section F.1.2.2 */
+
+ r = 0; /* r = run length of zeros */
+
+ for (k = 1; k < DCTSIZE2; k++) {
+ if ((temp = block[jpeg_natural_order[k]]) == 0) {
+ r++;
+ } else {
+ /* if run length > 15, must emit special run-length-16 codes (0xF0) */
+ while (r > 15) {
+ if (! emit_bits(state, actbl->ehufco[0xF0], actbl->ehufsi[0xF0]))
+ return FALSE;
+ r -= 16;
+ }
+
+ temp2 = temp;
+ if (temp < 0) {
+ temp = -temp; /* temp is abs value of input */
+ /* This code assumes we are on a two's complement machine */
+ temp2--;
+ }
+
+ /* Find the number of bits needed for the magnitude of the coefficient */
+ nbits = 1; /* there must be at least one 1 bit */
+ while ((temp >>= 1))
+ nbits++;
+ /* Check for out-of-range coefficient values */
+ if (nbits > MAX_COEF_BITS)
+ ERREXIT(state->cinfo, JERR_BAD_DCT_COEF);
+
+ /* Emit Huffman symbol for run length / number of bits */
+ i = (r << 4) + nbits;
+ if (! emit_bits(state, actbl->ehufco[i], actbl->ehufsi[i]))
+ return FALSE;
+
+ /* Emit that number of bits of the value, if positive, */
+ /* or the complement of its magnitude, if negative. */
+ if (! emit_bits(state, (unsigned int) temp2, nbits))
+ return FALSE;
+
+ r = 0;
+ }
+ }
+
+ /* If the last coef(s) were zero, emit an end-of-block code */
+ if (r > 0)
+ if (! emit_bits(state, actbl->ehufco[0], actbl->ehufsi[0]))
+ return FALSE;
+
+ return TRUE;
+}
+
+
+/*
+ * Emit a restart marker & resynchronize predictions.
+ */
+
+LOCAL(boolean)
+emit_restart (working_state * state, int restart_num)
+{
+ int ci;
+
+ if (! flush_bits(state))
+ return FALSE;
+
+ emit_byte(state, 0xFF, return FALSE);
+ emit_byte(state, JPEG_RST0 + restart_num, return FALSE);
+
+ /* Re-initialize DC predictions to 0 */
+ for (ci = 0; ci < state->cinfo->comps_in_scan; ci++)
+ state->cur.last_dc_val[ci] = 0;
+
+ /* The restart counter is not updated until we successfully write the MCU. */
+
+ return TRUE;
+}
+
+
+/*
+ * Encode and output one MCU's worth of Huffman-compressed coefficients.
+ */
+
+METHODDEF(boolean)
+encode_mcu_huff (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
+{
+ huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
+ working_state state;
+ int blkn, ci;
+ jpeg_component_info * compptr;
+
+ /* Load up working state */
+ state.next_output_byte = cinfo->dest->next_output_byte;
+ state.free_in_buffer = cinfo->dest->free_in_buffer;
+ ASSIGN_STATE(state.cur, entropy->saved);
+ state.cinfo = cinfo;
+
+ /* Emit restart marker if needed */
+ if (cinfo->restart_interval) {
+ if (entropy->restarts_to_go == 0)
+ if (! emit_restart(&state, entropy->next_restart_num))
+ return FALSE;
+ }
+
+ /* Encode the MCU data blocks */
+ for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
+ ci = cinfo->MCU_membership[blkn];
+ compptr = cinfo->cur_comp_info[ci];
+ if (! encode_one_block(&state,
+ MCU_data[blkn][0], state.cur.last_dc_val[ci],
+ entropy->dc_derived_tbls[compptr->dc_tbl_no],
+ entropy->ac_derived_tbls[compptr->ac_tbl_no]))
+ return FALSE;
+ /* Update last_dc_val */
+ state.cur.last_dc_val[ci] = MCU_data[blkn][0][0];
+ }
+
+ /* Completed MCU, so update state */
+ cinfo->dest->next_output_byte = state.next_output_byte;
+ cinfo->dest->free_in_buffer = state.free_in_buffer;
+ ASSIGN_STATE(entropy->saved, state.cur);
+
+ /* Update restart-interval state too */
+ if (cinfo->restart_interval) {
+ if (entropy->restarts_to_go == 0) {
+ entropy->restarts_to_go = cinfo->restart_interval;
+ entropy->next_restart_num++;
+ entropy->next_restart_num &= 7;
+ }
+ entropy->restarts_to_go--;
+ }
+
+ return TRUE;
+}
+
+
+/*
+ * Finish up at the end of a Huffman-compressed scan.
+ */
+
+METHODDEF(void)
+finish_pass_huff (j_compress_ptr cinfo)
+{
+ huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
+ working_state state;
+
+ /* Load up working state ... flush_bits needs it */
+ state.next_output_byte = cinfo->dest->next_output_byte;
+ state.free_in_buffer = cinfo->dest->free_in_buffer;
+ ASSIGN_STATE(state.cur, entropy->saved);
+ state.cinfo = cinfo;
+
+ /* Flush out the last data */
+ if (! flush_bits(&state))
+ ERREXIT(cinfo, JERR_CANT_SUSPEND);
+
+ /* Update state */
+ cinfo->dest->next_output_byte = state.next_output_byte;
+ cinfo->dest->free_in_buffer = state.free_in_buffer;
+ ASSIGN_STATE(entropy->saved, state.cur);
+}
+
+
+/*
+ * Huffman coding optimization.
+ *
+ * We first scan the supplied data and count the number of uses of each symbol
+ * that is to be Huffman-coded. (This process MUST agree with the code above.)
+ * Then we build a Huffman coding tree for the observed counts.
+ * Symbols which are not needed at all for the particular image are not
+ * assigned any code, which saves space in the DHT marker as well as in
+ * the compressed data.
+ */
+
+#ifdef ENTROPY_OPT_SUPPORTED
+
+
+/* Process a single block's worth of coefficients */
+
+LOCAL(void)
+htest_one_block (j_compress_ptr cinfo, JCOEFPTR block, int last_dc_val,
+ long dc_counts[], long ac_counts[])
+{
+ register int temp;
+ register int nbits;
+ register int k, r;
+
+ /* Encode the DC coefficient difference per section F.1.2.1 */
+
+ temp = block[0] - last_dc_val;
+ if (temp < 0)
+ temp = -temp;
+
+ /* Find the number of bits needed for the magnitude of the coefficient */
+ nbits = 0;
+ while (temp) {
+ nbits++;
+ temp >>= 1;
+ }
+ /* Check for out-of-range coefficient values.
+ * Since we're encoding a difference, the range limit is twice as much.
+ */
+ if (nbits > MAX_COEF_BITS+1)
+ ERREXIT(cinfo, JERR_BAD_DCT_COEF);
+
+ /* Count the Huffman symbol for the number of bits */
+ dc_counts[nbits]++;
+
+ /* Encode the AC coefficients per section F.1.2.2 */
+
+ r = 0; /* r = run length of zeros */
+
+ for (k = 1; k < DCTSIZE2; k++) {
+ if ((temp = block[jpeg_natural_order[k]]) == 0) {
+ r++;
+ } else {
+ /* if run length > 15, must emit special run-length-16 codes (0xF0) */
+ while (r > 15) {
+ ac_counts[0xF0]++;
+ r -= 16;
+ }
+
+ /* Find the number of bits needed for the magnitude of the coefficient */
+ if (temp < 0)
+ temp = -temp;
+
+ /* Find the number of bits needed for the magnitude of the coefficient */
+ nbits = 1; /* there must be at least one 1 bit */
+ while ((temp >>= 1))
+ nbits++;
+ /* Check for out-of-range coefficient values */
+ if (nbits > MAX_COEF_BITS)
+ ERREXIT(cinfo, JERR_BAD_DCT_COEF);
+
+ /* Count Huffman symbol for run length / number of bits */
+ ac_counts[(r << 4) + nbits]++;
+
+ r = 0;
+ }
+ }
+
+ /* If the last coef(s) were zero, emit an end-of-block code */
+ if (r > 0)
+ ac_counts[0]++;
+}
+
+
+/*
+ * Trial-encode one MCU's worth of Huffman-compressed coefficients.
+ * No data is actually output, so no suspension return is possible.
+ */
+
+METHODDEF(boolean)
+encode_mcu_gather (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
+{
+ huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
+ int blkn, ci;
+ jpeg_component_info * compptr;
+
+ /* Take care of restart intervals if needed */
+ if (cinfo->restart_interval) {
+ if (entropy->restarts_to_go == 0) {
+ /* Re-initialize DC predictions to 0 */
+ for (ci = 0; ci < cinfo->comps_in_scan; ci++)
+ entropy->saved.last_dc_val[ci] = 0;
+ /* Update restart state */
+ entropy->restarts_to_go = cinfo->restart_interval;
+ }
+ entropy->restarts_to_go--;
+ }
+
+ for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
+ ci = cinfo->MCU_membership[blkn];
+ compptr = cinfo->cur_comp_info[ci];
+ htest_one_block(cinfo, MCU_data[blkn][0], entropy->saved.last_dc_val[ci],
+ entropy->dc_count_ptrs[compptr->dc_tbl_no],
+ entropy->ac_count_ptrs[compptr->ac_tbl_no]);
+ entropy->saved.last_dc_val[ci] = MCU_data[blkn][0][0];
+ }
+
+ return TRUE;
+}
+
+
+/*
+ * Generate the best Huffman code table for the given counts, fill htbl.
+ * Note this is also used by jcphuff.c.
+ *
+ * The JPEG standard requires that no symbol be assigned a codeword of all
+ * one bits (so that padding bits added at the end of a compressed segment
+ * can't look like a valid code). Because of the canonical ordering of
+ * codewords, this just means that there must be an unused slot in the
+ * longest codeword length category. Section K.2 of the JPEG spec suggests
+ * reserving such a slot by pretending that symbol 256 is a valid symbol
+ * with count 1. In theory that's not optimal; giving it count zero but
+ * including it in the symbol set anyway should give a better Huffman code.
+ * But the theoretically better code actually seems to come out worse in
+ * practice, because it produces more all-ones bytes (which incur stuffed
+ * zero bytes in the final file). In any case the difference is tiny.
+ *
+ * The JPEG standard requires Huffman codes to be no more than 16 bits long.
+ * If some symbols have a very small but nonzero probability, the Huffman tree
+ * must be adjusted to meet the code length restriction. We currently use
+ * the adjustment method suggested in JPEG section K.2. This method is *not*
+ * optimal; it may not choose the best possible limited-length code. But
+ * typically only very-low-frequency symbols will be given less-than-optimal
+ * lengths, so the code is almost optimal. Experimental comparisons against
+ * an optimal limited-length-code algorithm indicate that the difference is
+ * microscopic --- usually less than a hundredth of a percent of total size.
+ * So the extra complexity of an optimal algorithm doesn't seem worthwhile.
+ */
+
+GLOBAL(void)
+jpeg_gen_optimal_table (j_compress_ptr cinfo, JHUFF_TBL * htbl, long freq[])
+{
+#define MAX_CLEN 32 /* assumed maximum initial code length */
+ UINT8 bits[MAX_CLEN+1]; /* bits[k] = # of symbols with code length k */
+ int codesize[257]; /* codesize[k] = code length of symbol k */
+ int others[257]; /* next symbol in current branch of tree */
+ int c1, c2;
+ int p, i, j;
+ long v;
+
+ /* This algorithm is explained in section K.2 of the JPEG standard */
+
+ MEMZERO(bits, SIZEOF(bits));
+ MEMZERO(codesize, SIZEOF(codesize));
+ for (i = 0; i < 257; i++)
+ others[i] = -1; /* init links to empty */
+
+ freq[256] = 1; /* make sure 256 has a nonzero count */
+ /* Including the pseudo-symbol 256 in the Huffman procedure guarantees
+ * that no real symbol is given code-value of all ones, because 256
+ * will be placed last in the largest codeword category.
+ */
+
+ /* Huffman's basic algorithm to assign optimal code lengths to symbols */
+
+ for (;;) {
+ /* Find the smallest nonzero frequency, set c1 = its symbol */
+ /* In case of ties, take the larger symbol number */
+ c1 = -1;
+ v = 1000000000L;
+ for (i = 0; i <= 256; i++) {
+ if (freq[i] && freq[i] <= v) {
+ v = freq[i];
+ c1 = i;
+ }
+ }
+
+ /* Find the next smallest nonzero frequency, set c2 = its symbol */
+ /* In case of ties, take the larger symbol number */
+ c2 = -1;
+ v = 1000000000L;
+ for (i = 0; i <= 256; i++) {
+ if (freq[i] && freq[i] <= v && i != c1) {
+ v = freq[i];
+ c2 = i;
+ }
+ }
+
+ /* Done if we've merged everything into one frequency */
+ if (c2 < 0)
+ break;
+
+ /* Else merge the two counts/trees */
+ freq[c1] += freq[c2];
+ freq[c2] = 0;
+
+ /* Increment the codesize of everything in c1's tree branch */
+ codesize[c1]++;
+ while (others[c1] >= 0) {
+ c1 = others[c1];
+ codesize[c1]++;
+ }
+
+ others[c1] = c2; /* chain c2 onto c1's tree branch */
+
+ /* Increment the codesize of everything in c2's tree branch */
+ codesize[c2]++;
+ while (others[c2] >= 0) {
+ c2 = others[c2];
+ codesize[c2]++;
+ }
+ }
+
+ /* Now count the number of symbols of each code length */
+ for (i = 0; i <= 256; i++) {
+ if (codesize[i]) {
+ /* The JPEG standard seems to think that this can't happen, */
+ /* but I'm paranoid... */
+ if (codesize[i] > MAX_CLEN)
+ ERREXIT(cinfo, JERR_HUFF_CLEN_OVERFLOW);
+
+ bits[codesize[i]]++;
+ }
+ }
+
+ /* JPEG doesn't allow symbols with code lengths over 16 bits, so if the pure
+ * Huffman procedure assigned any such lengths, we must adjust the coding.
+ * Here is what the JPEG spec says about how this next bit works:
+ * Since symbols are paired for the longest Huffman code, the symbols are
+ * removed from this length category two at a time. The prefix for the pair
+ * (which is one bit shorter) is allocated to one of the pair; then,
+ * skipping the BITS entry for that prefix length, a code word from the next
+ * shortest nonzero BITS entry is converted into a prefix for two code words
+ * one bit longer.
+ */
+
+ for (i = MAX_CLEN; i > 16; i--) {
+ while (bits[i] > 0) {
+ j = i - 2; /* find length of new prefix to be used */
+ while (bits[j] == 0)
+ j--;
+
+ bits[i] -= 2; /* remove two symbols */
+ bits[i-1]++; /* one goes in this length */
+ bits[j+1] += 2; /* two new symbols in this length */
+ bits[j]--; /* symbol of this length is now a prefix */
+ }
+ }
+
+ /* Remove the count for the pseudo-symbol 256 from the largest codelength */
+ while (bits[i] == 0) /* find largest codelength still in use */
+ i--;
+ bits[i]--;
+
+ /* Return final symbol counts (only for lengths 0..16) */
+ MEMCOPY(htbl->bits, bits, SIZEOF(htbl->bits));
+
+ /* Return a list of the symbols sorted by code length */
+ /* It's not real clear to me why we don't need to consider the codelength
+ * changes made above, but the JPEG spec seems to think this works.
+ */
+ p = 0;
+ for (i = 1; i <= MAX_CLEN; i++) {
+ for (j = 0; j <= 255; j++) {
+ if (codesize[j] == i) {
+ htbl->huffval[p] = (UINT8) j;
+ p++;
+ }
+ }
+ }
+
+ /* Set sent_table FALSE so updated table will be written to JPEG file. */
+ htbl->sent_table = FALSE;
+}
+
+
+/*
+ * Finish up a statistics-gathering pass and create the new Huffman tables.
+ */
+
+METHODDEF(void)
+finish_pass_gather (j_compress_ptr cinfo)
+{
+ huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
+ int ci, dctbl, actbl;
+ jpeg_component_info * compptr;
+ JHUFF_TBL **htblptr;
+ boolean did_dc[NUM_HUFF_TBLS];
+ boolean did_ac[NUM_HUFF_TBLS];
+
+ /* It's important not to apply jpeg_gen_optimal_table more than once
+ * per table, because it clobbers the input frequency counts!
+ */
+ MEMZERO(did_dc, SIZEOF(did_dc));
+ MEMZERO(did_ac, SIZEOF(did_ac));
+
+ for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
+ compptr = cinfo->cur_comp_info[ci];
+ dctbl = compptr->dc_tbl_no;
+ actbl = compptr->ac_tbl_no;
+ if (! did_dc[dctbl]) {
+ htblptr = & cinfo->dc_huff_tbl_ptrs[dctbl];
+ if (*htblptr == NULL)
+ *htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo);
+ jpeg_gen_optimal_table(cinfo, *htblptr, entropy->dc_count_ptrs[dctbl]);
+ did_dc[dctbl] = TRUE;
+ }
+ if (! did_ac[actbl]) {
+ htblptr = & cinfo->ac_huff_tbl_ptrs[actbl];
+ if (*htblptr == NULL)
+ *htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo);
+ jpeg_gen_optimal_table(cinfo, *htblptr, entropy->ac_count_ptrs[actbl]);
+ did_ac[actbl] = TRUE;
+ }
+ }
+}
+
+
+#endif /* ENTROPY_OPT_SUPPORTED */
+
+
+/*
+ * Module initialization routine for Huffman entropy encoding.
+ */
+
+GLOBAL(void)
+jinit_huff_encoder (j_compress_ptr cinfo)
+{
+ huff_entropy_ptr entropy;
+ int i;
+
+ entropy = (huff_entropy_ptr)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ SIZEOF(huff_entropy_encoder));
+ cinfo->entropy = (struct jpeg_entropy_encoder *) entropy;
+ entropy->pub.start_pass = start_pass_huff;
+
+ /* Mark tables unallocated */
+ for (i = 0; i < NUM_HUFF_TBLS; i++) {
+ entropy->dc_derived_tbls[i] = entropy->ac_derived_tbls[i] = NULL;
+#ifdef ENTROPY_OPT_SUPPORTED
+ entropy->dc_count_ptrs[i] = entropy->ac_count_ptrs[i] = NULL;
+#endif
+ }
+}
+
+#endif //_FX_JPEG_TURBO_
diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jcinit.c b/core/src/fxcodec/libjpeg/fpdfapi_jcinit.c
index a0d8f8148f..58e5d18764 100644
--- a/core/src/fxcodec/libjpeg/fpdfapi_jcinit.c
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jcinit.c
@@ -1,75 +1,75 @@
-#if !defined(_FX_JPEG_TURBO_)
-/*
- * jcinit.c
- *
- * Copyright (C) 1991-1997, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains initialization logic for the JPEG compressor.
- * This routine is in charge of selecting the modules to be executed and
- * making an initialization call to each one.
- *
- * Logically, this code belongs in jcmaster.c. It's split out because
- * linking this routine implies linking the entire compression library.
- * For a transcoding-only application, we want to be able to use jcmaster.c
- * without linking in the whole library.
- */
-
-#define JPEG_INTERNALS
-#include "jinclude.h"
-#include "jpeglib.h"
-
-
-/*
- * Master selection of compression modules.
- * This is done once at the start of processing an image. We determine
- * which modules will be used and give them appropriate initialization calls.
- */
-
-GLOBAL(void)
-jinit_compress_master (j_compress_ptr cinfo)
-{
- /* Initialize master control (includes parameter checking/processing) */
- jinit_c_master_control(cinfo, FALSE /* full compression */);
-
- /* Preprocessing */
- if (! cinfo->raw_data_in) {
- jinit_color_converter(cinfo);
- jinit_downsampler(cinfo);
- jinit_c_prep_controller(cinfo, FALSE /* never need full buffer here */);
- }
- /* Forward DCT */
- jinit_forward_dct(cinfo);
- /* Entropy encoding: either Huffman or arithmetic coding. */
- if (cinfo->arith_code) {
- ERREXIT(cinfo, JERR_ARITH_NOTIMPL);
- } else {
- if (cinfo->progressive_mode) {
-#ifdef C_PROGRESSIVE_SUPPORTED
- jinit_phuff_encoder(cinfo);
-#else
- ERREXIT(cinfo, JERR_NOT_COMPILED);
-#endif
- } else
- jinit_huff_encoder(cinfo);
- }
-
- /* Need a full-image coefficient buffer in any multi-pass mode. */
- jinit_c_coef_controller(cinfo,
- (boolean) (cinfo->num_scans > 1 || cinfo->optimize_coding));
- jinit_c_main_controller(cinfo, FALSE /* never need full buffer here */);
-
- jinit_marker_writer(cinfo);
-
- /* We can now tell the memory manager to allocate virtual arrays. */
- (*cinfo->mem->realize_virt_arrays) ((j_common_ptr) cinfo);
-
- /* Write the datastream header (SOI) immediately.
- * Frame and scan headers are postponed till later.
- * This lets application insert special markers after the SOI.
- */
- (*cinfo->marker->write_file_header) (cinfo);
-}
-
-#endif //_FX_JPEG_TURBO_
+#if !defined(_FX_JPEG_TURBO_)
+/*
+ * jcinit.c
+ *
+ * Copyright (C) 1991-1997, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains initialization logic for the JPEG compressor.
+ * This routine is in charge of selecting the modules to be executed and
+ * making an initialization call to each one.
+ *
+ * Logically, this code belongs in jcmaster.c. It's split out because
+ * linking this routine implies linking the entire compression library.
+ * For a transcoding-only application, we want to be able to use jcmaster.c
+ * without linking in the whole library.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+
+
+/*
+ * Master selection of compression modules.
+ * This is done once at the start of processing an image. We determine
+ * which modules will be used and give them appropriate initialization calls.
+ */
+
+GLOBAL(void)
+jinit_compress_master (j_compress_ptr cinfo)
+{
+ /* Initialize master control (includes parameter checking/processing) */
+ jinit_c_master_control(cinfo, FALSE /* full compression */);
+
+ /* Preprocessing */
+ if (! cinfo->raw_data_in) {
+ jinit_color_converter(cinfo);
+ jinit_downsampler(cinfo);
+ jinit_c_prep_controller(cinfo, FALSE /* never need full buffer here */);
+ }
+ /* Forward DCT */
+ jinit_forward_dct(cinfo);
+ /* Entropy encoding: either Huffman or arithmetic coding. */
+ if (cinfo->arith_code) {
+ ERREXIT(cinfo, JERR_ARITH_NOTIMPL);
+ } else {
+ if (cinfo->progressive_mode) {
+#ifdef C_PROGRESSIVE_SUPPORTED
+ jinit_phuff_encoder(cinfo);
+#else
+ ERREXIT(cinfo, JERR_NOT_COMPILED);
+#endif
+ } else
+ jinit_huff_encoder(cinfo);
+ }
+
+ /* Need a full-image coefficient buffer in any multi-pass mode. */
+ jinit_c_coef_controller(cinfo,
+ (boolean) (cinfo->num_scans > 1 || cinfo->optimize_coding));
+ jinit_c_main_controller(cinfo, FALSE /* never need full buffer here */);
+
+ jinit_marker_writer(cinfo);
+
+ /* We can now tell the memory manager to allocate virtual arrays. */
+ (*cinfo->mem->realize_virt_arrays) ((j_common_ptr) cinfo);
+
+ /* Write the datastream header (SOI) immediately.
+ * Frame and scan headers are postponed till later.
+ * This lets application insert special markers after the SOI.
+ */
+ (*cinfo->marker->write_file_header) (cinfo);
+}
+
+#endif //_FX_JPEG_TURBO_
diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jcmainct.c b/core/src/fxcodec/libjpeg/fpdfapi_jcmainct.c
index 25d61f2284..4bf2c403ea 100644
--- a/core/src/fxcodec/libjpeg/fpdfapi_jcmainct.c
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jcmainct.c
@@ -1,296 +1,296 @@
-#if !defined(_FX_JPEG_TURBO_)
-/*
- * jcmainct.c
- *
- * Copyright (C) 1994-1996, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains the main buffer controller for compression.
- * The main buffer lies between the pre-processor and the JPEG
- * compressor proper; it holds downsampled data in the JPEG colorspace.
- */
-
-#define JPEG_INTERNALS
-#include "jinclude.h"
-#include "jpeglib.h"
-
-
-/* Note: currently, there is no operating mode in which a full-image buffer
- * is needed at this step. If there were, that mode could not be used with
- * "raw data" input, since this module is bypassed in that case. However,
- * we've left the code here for possible use in special applications.
- */
-#undef FULL_MAIN_BUFFER_SUPPORTED
-
-
-/* Private buffer controller object */
-
-typedef struct {
- struct jpeg_c_main_controller pub; /* public fields */
-
- JDIMENSION cur_iMCU_row; /* number of current iMCU row */
- JDIMENSION rowgroup_ctr; /* counts row groups received in iMCU row */
- boolean suspended; /* remember if we suspended output */
- J_BUF_MODE pass_mode; /* current operating mode */
-
- /* If using just a strip buffer, this points to the entire set of buffers
- * (we allocate one for each component). In the full-image case, this
- * points to the currently accessible strips of the virtual arrays.
- */
- JSAMPARRAY buffer[MAX_COMPONENTS];
-
-#ifdef FULL_MAIN_BUFFER_SUPPORTED
- /* If using full-image storage, this array holds pointers to virtual-array
- * control blocks for each component. Unused if not full-image storage.
- */
- jvirt_sarray_ptr whole_image[MAX_COMPONENTS];
-#endif
-} my_main_controller;
-
-typedef my_main_controller * my_main_ptr;
-
-
-/* Forward declarations */
-METHODDEF(void) process_data_simple_main
- JPP((j_compress_ptr cinfo, JSAMPARRAY input_buf,
- JDIMENSION *in_row_ctr, JDIMENSION in_rows_avail));
-#ifdef FULL_MAIN_BUFFER_SUPPORTED
-METHODDEF(void) process_data_buffer_main
- JPP((j_compress_ptr cinfo, JSAMPARRAY input_buf,
- JDIMENSION *in_row_ctr, JDIMENSION in_rows_avail));
-#endif
-
-
-/*
- * Initialize for a processing pass.
- */
-
-METHODDEF(void)
-start_pass_main (j_compress_ptr cinfo, J_BUF_MODE pass_mode)
-{
- my_main_ptr main = (my_main_ptr) cinfo->main;
-
- /* Do nothing in raw-data mode. */
- if (cinfo->raw_data_in)
- return;
-
- main->cur_iMCU_row = 0; /* initialize counters */
- main->rowgroup_ctr = 0;
- main->suspended = FALSE;
- main->pass_mode = pass_mode; /* save mode for use by process_data */
-
- switch (pass_mode) {
- case JBUF_PASS_THRU:
-#ifdef FULL_MAIN_BUFFER_SUPPORTED
- if (main->whole_image[0] != NULL)
- ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
-#endif
- main->pub.process_data = process_data_simple_main;
- break;
-#ifdef FULL_MAIN_BUFFER_SUPPORTED
- case JBUF_SAVE_SOURCE:
- case JBUF_CRANK_DEST:
- case JBUF_SAVE_AND_PASS:
- if (main->whole_image[0] == NULL)
- ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
- main->pub.process_data = process_data_buffer_main;
- break;
-#endif
- default:
- ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
- break;
- }
-}
-
-
-/*
- * Process some data.
- * This routine handles the simple pass-through mode,
- * where we have only a strip buffer.
- */
-
-METHODDEF(void)
-process_data_simple_main (j_compress_ptr cinfo,
- JSAMPARRAY input_buf, JDIMENSION *in_row_ctr,
- JDIMENSION in_rows_avail)
-{
- my_main_ptr main = (my_main_ptr) cinfo->main;
-
- while (main->cur_iMCU_row < cinfo->total_iMCU_rows) {
- /* Read input data if we haven't filled the main buffer yet */
- if (main->rowgroup_ctr < DCTSIZE)
- (*cinfo->prep->pre_process_data) (cinfo,
- input_buf, in_row_ctr, in_rows_avail,
- main->buffer, &main->rowgroup_ctr,
- (JDIMENSION) DCTSIZE);
-
- /* If we don't have a full iMCU row buffered, return to application for
- * more data. Note that preprocessor will always pad to fill the iMCU row
- * at the bottom of the image.
- */
- if (main->rowgroup_ctr != DCTSIZE)
- return;
-
- /* Send the completed row to the compressor */
- if (! (*cinfo->coef->compress_data) (cinfo, main->buffer)) {
- /* If compressor did not consume the whole row, then we must need to
- * suspend processing and return to the application. In this situation
- * we pretend we didn't yet consume the last input row; otherwise, if
- * it happened to be the last row of the image, the application would
- * think we were done.
- */
- if (! main->suspended) {
- (*in_row_ctr)--;
- main->suspended = TRUE;
- }
- return;
- }
- /* We did finish the row. Undo our little suspension hack if a previous
- * call suspended; then mark the main buffer empty.
- */
- if (main->suspended) {
- (*in_row_ctr)++;
- main->suspended = FALSE;
- }
- main->rowgroup_ctr = 0;
- main->cur_iMCU_row++;
- }
-}
-
-
-#ifdef FULL_MAIN_BUFFER_SUPPORTED
-
-/*
- * Process some data.
- * This routine handles all of the modes that use a full-size buffer.
- */
-
-METHODDEF(void)
-process_data_buffer_main (j_compress_ptr cinfo,
- JSAMPARRAY input_buf, JDIMENSION *in_row_ctr,
- JDIMENSION in_rows_avail)
-{
- my_main_ptr main = (my_main_ptr) cinfo->main;
- int ci;
- jpeg_component_info *compptr;
- boolean writing = (main->pass_mode != JBUF_CRANK_DEST);
-
- while (main->cur_iMCU_row < cinfo->total_iMCU_rows) {
- /* Realign the virtual buffers if at the start of an iMCU row. */
- if (main->rowgroup_ctr == 0) {
- for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
- ci++, compptr++) {
- main->buffer[ci] = (*cinfo->mem->access_virt_sarray)
- ((j_common_ptr) cinfo, main->whole_image[ci],
- main->cur_iMCU_row * (compptr->v_samp_factor * DCTSIZE),
- (JDIMENSION) (compptr->v_samp_factor * DCTSIZE), writing);
- }
- /* In a read pass, pretend we just read some source data. */
- if (! writing) {
- *in_row_ctr += cinfo->max_v_samp_factor * DCTSIZE;
- main->rowgroup_ctr = DCTSIZE;
- }
- }
-
- /* If a write pass, read input data until the current iMCU row is full. */
- /* Note: preprocessor will pad if necessary to fill the last iMCU row. */
- if (writing) {
- (*cinfo->prep->pre_process_data) (cinfo,
- input_buf, in_row_ctr, in_rows_avail,
- main->buffer, &main->rowgroup_ctr,
- (JDIMENSION) DCTSIZE);
- /* Return to application if we need more data to fill the iMCU row. */
- if (main->rowgroup_ctr < DCTSIZE)
- return;
- }
-
- /* Emit data, unless this is a sink-only pass. */
- if (main->pass_mode != JBUF_SAVE_SOURCE) {
- if (! (*cinfo->coef->compress_data) (cinfo, main->buffer)) {
- /* If compressor did not consume the whole row, then we must need to
- * suspend processing and return to the application. In this situation
- * we pretend we didn't yet consume the last input row; otherwise, if
- * it happened to be the last row of the image, the application would
- * think we were done.
- */
- if (! main->suspended) {
- (*in_row_ctr)--;
- main->suspended = TRUE;
- }
- return;
- }
- /* We did finish the row. Undo our little suspension hack if a previous
- * call suspended; then mark the main buffer empty.
- */
- if (main->suspended) {
- (*in_row_ctr)++;
- main->suspended = FALSE;
- }
- }
-
- /* If get here, we are done with this iMCU row. Mark buffer empty. */
- main->rowgroup_ctr = 0;
- main->cur_iMCU_row++;
- }
-}
-
-#endif /* FULL_MAIN_BUFFER_SUPPORTED */
-
-
-/*
- * Initialize main buffer controller.
- */
-
-GLOBAL(void)
-jinit_c_main_controller (j_compress_ptr cinfo, boolean need_full_buffer)
-{
- my_main_ptr main;
- int ci;
- jpeg_component_info *compptr;
-
- main = (my_main_ptr)
- (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
- SIZEOF(my_main_controller));
- cinfo->main = (struct jpeg_c_main_controller *) main;
- main->pub.start_pass = start_pass_main;
-
- /* We don't need to create a buffer in raw-data mode. */
- if (cinfo->raw_data_in)
- return;
-
- /* Create the buffer. It holds downsampled data, so each component
- * may be of a different size.
- */
- if (need_full_buffer) {
-#ifdef FULL_MAIN_BUFFER_SUPPORTED
- /* Allocate a full-image virtual array for each component */
- /* Note we pad the bottom to a multiple of the iMCU height */
- for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
- ci++, compptr++) {
- main->whole_image[ci] = (*cinfo->mem->request_virt_sarray)
- ((j_common_ptr) cinfo, JPOOL_IMAGE, FALSE,
- compptr->width_in_blocks * DCTSIZE,
- (JDIMENSION) jround_up((long) compptr->height_in_blocks,
- (long) compptr->v_samp_factor) * DCTSIZE,
- (JDIMENSION) (compptr->v_samp_factor * DCTSIZE));
- }
-#else
- ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
-#endif
- } else {
-#ifdef FULL_MAIN_BUFFER_SUPPORTED
- main->whole_image[0] = NULL; /* flag for no virtual arrays */
-#endif
- /* Allocate a strip buffer for each component */
- for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
- ci++, compptr++) {
- main->buffer[ci] = (*cinfo->mem->alloc_sarray)
- ((j_common_ptr) cinfo, JPOOL_IMAGE,
- compptr->width_in_blocks * DCTSIZE,
- (JDIMENSION) (compptr->v_samp_factor * DCTSIZE));
- }
- }
-}
-
-#endif //_FX_JPEG_TURBO_
+#if !defined(_FX_JPEG_TURBO_)
+/*
+ * jcmainct.c
+ *
+ * Copyright (C) 1994-1996, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains the main buffer controller for compression.
+ * The main buffer lies between the pre-processor and the JPEG
+ * compressor proper; it holds downsampled data in the JPEG colorspace.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+
+
+/* Note: currently, there is no operating mode in which a full-image buffer
+ * is needed at this step. If there were, that mode could not be used with
+ * "raw data" input, since this module is bypassed in that case. However,
+ * we've left the code here for possible use in special applications.
+ */
+#undef FULL_MAIN_BUFFER_SUPPORTED
+
+
+/* Private buffer controller object */
+
+typedef struct {
+ struct jpeg_c_main_controller pub; /* public fields */
+
+ JDIMENSION cur_iMCU_row; /* number of current iMCU row */
+ JDIMENSION rowgroup_ctr; /* counts row groups received in iMCU row */
+ boolean suspended; /* remember if we suspended output */
+ J_BUF_MODE pass_mode; /* current operating mode */
+
+ /* If using just a strip buffer, this points to the entire set of buffers
+ * (we allocate one for each component). In the full-image case, this
+ * points to the currently accessible strips of the virtual arrays.
+ */
+ JSAMPARRAY buffer[MAX_COMPONENTS];
+
+#ifdef FULL_MAIN_BUFFER_SUPPORTED
+ /* If using full-image storage, this array holds pointers to virtual-array
+ * control blocks for each component. Unused if not full-image storage.
+ */
+ jvirt_sarray_ptr whole_image[MAX_COMPONENTS];
+#endif
+} my_main_controller;
+
+typedef my_main_controller * my_main_ptr;
+
+
+/* Forward declarations */
+METHODDEF(void) process_data_simple_main
+ JPP((j_compress_ptr cinfo, JSAMPARRAY input_buf,
+ JDIMENSION *in_row_ctr, JDIMENSION in_rows_avail));
+#ifdef FULL_MAIN_BUFFER_SUPPORTED
+METHODDEF(void) process_data_buffer_main
+ JPP((j_compress_ptr cinfo, JSAMPARRAY input_buf,
+ JDIMENSION *in_row_ctr, JDIMENSION in_rows_avail));
+#endif
+
+
+/*
+ * Initialize for a processing pass.
+ */
+
+METHODDEF(void)
+start_pass_main (j_compress_ptr cinfo, J_BUF_MODE pass_mode)
+{
+ my_main_ptr main = (my_main_ptr) cinfo->main;
+
+ /* Do nothing in raw-data mode. */
+ if (cinfo->raw_data_in)
+ return;
+
+ main->cur_iMCU_row = 0; /* initialize counters */
+ main->rowgroup_ctr = 0;
+ main->suspended = FALSE;
+ main->pass_mode = pass_mode; /* save mode for use by process_data */
+
+ switch (pass_mode) {
+ case JBUF_PASS_THRU:
+#ifdef FULL_MAIN_BUFFER_SUPPORTED
+ if (main->whole_image[0] != NULL)
+ ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
+#endif
+ main->pub.process_data = process_data_simple_main;
+ break;
+#ifdef FULL_MAIN_BUFFER_SUPPORTED
+ case JBUF_SAVE_SOURCE:
+ case JBUF_CRANK_DEST:
+ case JBUF_SAVE_AND_PASS:
+ if (main->whole_image[0] == NULL)
+ ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
+ main->pub.process_data = process_data_buffer_main;
+ break;
+#endif
+ default:
+ ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
+ break;
+ }
+}
+
+
+/*
+ * Process some data.
+ * This routine handles the simple pass-through mode,
+ * where we have only a strip buffer.
+ */
+
+METHODDEF(void)
+process_data_simple_main (j_compress_ptr cinfo,
+ JSAMPARRAY input_buf, JDIMENSION *in_row_ctr,
+ JDIMENSION in_rows_avail)
+{
+ my_main_ptr main = (my_main_ptr) cinfo->main;
+
+ while (main->cur_iMCU_row < cinfo->total_iMCU_rows) {
+ /* Read input data if we haven't filled the main buffer yet */
+ if (main->rowgroup_ctr < DCTSIZE)
+ (*cinfo->prep->pre_process_data) (cinfo,
+ input_buf, in_row_ctr, in_rows_avail,
+ main->buffer, &main->rowgroup_ctr,
+ (JDIMENSION) DCTSIZE);
+
+ /* If we don't have a full iMCU row buffered, return to application for
+ * more data. Note that preprocessor will always pad to fill the iMCU row
+ * at the bottom of the image.
+ */
+ if (main->rowgroup_ctr != DCTSIZE)
+ return;
+
+ /* Send the completed row to the compressor */
+ if (! (*cinfo->coef->compress_data) (cinfo, main->buffer)) {
+ /* If compressor did not consume the whole row, then we must need to
+ * suspend processing and return to the application. In this situation
+ * we pretend we didn't yet consume the last input row; otherwise, if
+ * it happened to be the last row of the image, the application would
+ * think we were done.
+ */
+ if (! main->suspended) {
+ (*in_row_ctr)--;
+ main->suspended = TRUE;
+ }
+ return;
+ }
+ /* We did finish the row. Undo our little suspension hack if a previous
+ * call suspended; then mark the main buffer empty.
+ */
+ if (main->suspended) {
+ (*in_row_ctr)++;
+ main->suspended = FALSE;
+ }
+ main->rowgroup_ctr = 0;
+ main->cur_iMCU_row++;
+ }
+}
+
+
+#ifdef FULL_MAIN_BUFFER_SUPPORTED
+
+/*
+ * Process some data.
+ * This routine handles all of the modes that use a full-size buffer.
+ */
+
+METHODDEF(void)
+process_data_buffer_main (j_compress_ptr cinfo,
+ JSAMPARRAY input_buf, JDIMENSION *in_row_ctr,
+ JDIMENSION in_rows_avail)
+{
+ my_main_ptr main = (my_main_ptr) cinfo->main;
+ int ci;
+ jpeg_component_info *compptr;
+ boolean writing = (main->pass_mode != JBUF_CRANK_DEST);
+
+ while (main->cur_iMCU_row < cinfo->total_iMCU_rows) {
+ /* Realign the virtual buffers if at the start of an iMCU row. */
+ if (main->rowgroup_ctr == 0) {
+ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+ ci++, compptr++) {
+ main->buffer[ci] = (*cinfo->mem->access_virt_sarray)
+ ((j_common_ptr) cinfo, main->whole_image[ci],
+ main->cur_iMCU_row * (compptr->v_samp_factor * DCTSIZE),
+ (JDIMENSION) (compptr->v_samp_factor * DCTSIZE), writing);
+ }
+ /* In a read pass, pretend we just read some source data. */
+ if (! writing) {
+ *in_row_ctr += cinfo->max_v_samp_factor * DCTSIZE;
+ main->rowgroup_ctr = DCTSIZE;
+ }
+ }
+
+ /* If a write pass, read input data until the current iMCU row is full. */
+ /* Note: preprocessor will pad if necessary to fill the last iMCU row. */
+ if (writing) {
+ (*cinfo->prep->pre_process_data) (cinfo,
+ input_buf, in_row_ctr, in_rows_avail,
+ main->buffer, &main->rowgroup_ctr,
+ (JDIMENSION) DCTSIZE);
+ /* Return to application if we need more data to fill the iMCU row. */
+ if (main->rowgroup_ctr < DCTSIZE)
+ return;
+ }
+
+ /* Emit data, unless this is a sink-only pass. */
+ if (main->pass_mode != JBUF_SAVE_SOURCE) {
+ if (! (*cinfo->coef->compress_data) (cinfo, main->buffer)) {
+ /* If compressor did not consume the whole row, then we must need to
+ * suspend processing and return to the application. In this situation
+ * we pretend we didn't yet consume the last input row; otherwise, if
+ * it happened to be the last row of the image, the application would
+ * think we were done.
+ */
+ if (! main->suspended) {
+ (*in_row_ctr)--;
+ main->suspended = TRUE;
+ }
+ return;
+ }
+ /* We did finish the row. Undo our little suspension hack if a previous
+ * call suspended; then mark the main buffer empty.
+ */
+ if (main->suspended) {
+ (*in_row_ctr)++;
+ main->suspended = FALSE;
+ }
+ }
+
+ /* If get here, we are done with this iMCU row. Mark buffer empty. */
+ main->rowgroup_ctr = 0;
+ main->cur_iMCU_row++;
+ }
+}
+
+#endif /* FULL_MAIN_BUFFER_SUPPORTED */
+
+
+/*
+ * Initialize main buffer controller.
+ */
+
+GLOBAL(void)
+jinit_c_main_controller (j_compress_ptr cinfo, boolean need_full_buffer)
+{
+ my_main_ptr main;
+ int ci;
+ jpeg_component_info *compptr;
+
+ main = (my_main_ptr)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ SIZEOF(my_main_controller));
+ cinfo->main = (struct jpeg_c_main_controller *) main;
+ main->pub.start_pass = start_pass_main;
+
+ /* We don't need to create a buffer in raw-data mode. */
+ if (cinfo->raw_data_in)
+ return;
+
+ /* Create the buffer. It holds downsampled data, so each component
+ * may be of a different size.
+ */
+ if (need_full_buffer) {
+#ifdef FULL_MAIN_BUFFER_SUPPORTED
+ /* Allocate a full-image virtual array for each component */
+ /* Note we pad the bottom to a multiple of the iMCU height */
+ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+ ci++, compptr++) {
+ main->whole_image[ci] = (*cinfo->mem->request_virt_sarray)
+ ((j_common_ptr) cinfo, JPOOL_IMAGE, FALSE,
+ compptr->width_in_blocks * DCTSIZE,
+ (JDIMENSION) jround_up((long) compptr->height_in_blocks,
+ (long) compptr->v_samp_factor) * DCTSIZE,
+ (JDIMENSION) (compptr->v_samp_factor * DCTSIZE));
+ }
+#else
+ ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
+#endif
+ } else {
+#ifdef FULL_MAIN_BUFFER_SUPPORTED
+ main->whole_image[0] = NULL; /* flag for no virtual arrays */
+#endif
+ /* Allocate a strip buffer for each component */
+ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+ ci++, compptr++) {
+ main->buffer[ci] = (*cinfo->mem->alloc_sarray)
+ ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ compptr->width_in_blocks * DCTSIZE,
+ (JDIMENSION) (compptr->v_samp_factor * DCTSIZE));
+ }
+ }
+}
+
+#endif //_FX_JPEG_TURBO_
diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jcmarker.c b/core/src/fxcodec/libjpeg/fpdfapi_jcmarker.c
index d0a9e87650..f1c89d92a9 100644
--- a/core/src/fxcodec/libjpeg/fpdfapi_jcmarker.c
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jcmarker.c
@@ -1,667 +1,667 @@
-#if !defined(_FX_JPEG_TURBO_)
-/*
- * jcmarker.c
- *
- * Copyright (C) 1991-1998, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains routines to write JPEG datastream markers.
- */
-
-#define JPEG_INTERNALS
-#include "jinclude.h"
-#include "jpeglib.h"
-
-
-typedef enum { /* JPEG marker codes */
- M_SOF0 = 0xc0,
- M_SOF1 = 0xc1,
- M_SOF2 = 0xc2,
- M_SOF3 = 0xc3,
-
- M_SOF5 = 0xc5,
- M_SOF6 = 0xc6,
- M_SOF7 = 0xc7,
-
- M_JPG = 0xc8,
- M_SOF9 = 0xc9,
- M_SOF10 = 0xca,
- M_SOF11 = 0xcb,
-
- M_SOF13 = 0xcd,
- M_SOF14 = 0xce,
- M_SOF15 = 0xcf,
-
- M_DHT = 0xc4,
-
- M_DAC = 0xcc,
-
- M_RST0 = 0xd0,
- M_RST1 = 0xd1,
- M_RST2 = 0xd2,
- M_RST3 = 0xd3,
- M_RST4 = 0xd4,
- M_RST5 = 0xd5,
- M_RST6 = 0xd6,
- M_RST7 = 0xd7,
-
- M_SOI = 0xd8,
- M_EOI = 0xd9,
- M_SOS = 0xda,
- M_DQT = 0xdb,
- M_DNL = 0xdc,
- M_DRI = 0xdd,
- M_DHP = 0xde,
- M_EXP = 0xdf,
-
- M_APP0 = 0xe0,
- M_APP1 = 0xe1,
- M_APP2 = 0xe2,
- M_APP3 = 0xe3,
- M_APP4 = 0xe4,
- M_APP5 = 0xe5,
- M_APP6 = 0xe6,
- M_APP7 = 0xe7,
- M_APP8 = 0xe8,
- M_APP9 = 0xe9,
- M_APP10 = 0xea,
- M_APP11 = 0xeb,
- M_APP12 = 0xec,
- M_APP13 = 0xed,
- M_APP14 = 0xee,
- M_APP15 = 0xef,
-
- M_JPG0 = 0xf0,
- M_JPG13 = 0xfd,
- M_COM = 0xfe,
-
- M_TEM = 0x01,
-
- M_ERROR = 0x100
-} JPEG_MARKER;
-
-
-/* Private state */
-
-typedef struct {
- struct jpeg_marker_writer pub; /* public fields */
-
- unsigned int last_restart_interval; /* last DRI value emitted; 0 after SOI */
-} my_marker_writer;
-
-typedef my_marker_writer * my_marker_ptr;
-
-
-/*
- * Basic output routines.
- *
- * Note that we do not support suspension while writing a marker.
- * Therefore, an application using suspension must ensure that there is
- * enough buffer space for the initial markers (typ. 600-700 bytes) before
- * calling jpeg_start_compress, and enough space to write the trailing EOI
- * (a few bytes) before calling jpeg_finish_compress. Multipass compression
- * modes are not supported at all with suspension, so those two are the only
- * points where markers will be written.
- */
-
-LOCAL(void)
-emit_byte (j_compress_ptr cinfo, int val)
-/* Emit a byte */
-{
- struct jpeg_destination_mgr * dest = cinfo->dest;
-
- *(dest->next_output_byte)++ = (JOCTET) val;
- if (--dest->free_in_buffer == 0) {
- if (! (*dest->empty_output_buffer) (cinfo))
- ERREXIT(cinfo, JERR_CANT_SUSPEND);
- }
-}
-
-
-LOCAL(void)
-emit_marker (j_compress_ptr cinfo, JPEG_MARKER mark)
-/* Emit a marker code */
-{
- emit_byte(cinfo, 0xFF);
- emit_byte(cinfo, (int) mark);
-}
-
-
-LOCAL(void)
-emit_2bytes (j_compress_ptr cinfo, int value)
-/* Emit a 2-byte integer; these are always MSB first in JPEG files */
-{
- emit_byte(cinfo, (value >> 8) & 0xFF);
- emit_byte(cinfo, value & 0xFF);
-}
-
-
-/*
- * Routines to write specific marker types.
- */
-
-LOCAL(int)
-emit_dqt (j_compress_ptr cinfo, int index)
-/* Emit a DQT marker */
-/* Returns the precision used (0 = 8bits, 1 = 16bits) for baseline checking */
-{
- JQUANT_TBL * qtbl = cinfo->quant_tbl_ptrs[index];
- int prec;
- int i;
-
- if (qtbl == NULL)
- ERREXIT1(cinfo, JERR_NO_QUANT_TABLE, index);
-
- prec = 0;
- for (i = 0; i < DCTSIZE2; i++) {
- if (qtbl->quantval[i] > 255)
- prec = 1;
- }
-
- if (! qtbl->sent_table) {
- emit_marker(cinfo, M_DQT);
-
- emit_2bytes(cinfo, prec ? DCTSIZE2*2 + 1 + 2 : DCTSIZE2 + 1 + 2);
-
- emit_byte(cinfo, index + (prec<<4));
-
- for (i = 0; i < DCTSIZE2; i++) {
- /* The table entries must be emitted in zigzag order. */
- unsigned int qval = qtbl->quantval[jpeg_natural_order[i]];
- if (prec)
- emit_byte(cinfo, (int) (qval >> 8));
- emit_byte(cinfo, (int) (qval & 0xFF));
- }
-
- qtbl->sent_table = TRUE;
- }
-
- return prec;
-}
-
-
-LOCAL(void)
-emit_dht (j_compress_ptr cinfo, int index, boolean is_ac)
-/* Emit a DHT marker */
-{
- JHUFF_TBL * htbl;
- int length, i;
-
- if (is_ac) {
- htbl = cinfo->ac_huff_tbl_ptrs[index];
- index += 0x10; /* output index has AC bit set */
- } else {
- htbl = cinfo->dc_huff_tbl_ptrs[index];
- }
-
- if (htbl == NULL)
- ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, index);
-
- if (! htbl->sent_table) {
- emit_marker(cinfo, M_DHT);
-
- length = 0;
- for (i = 1; i <= 16; i++)
- length += htbl->bits[i];
-
- emit_2bytes(cinfo, length + 2 + 1 + 16);
- emit_byte(cinfo, index);
-
- for (i = 1; i <= 16; i++)
- emit_byte(cinfo, htbl->bits[i]);
-
- for (i = 0; i < length; i++)
- emit_byte(cinfo, htbl->huffval[i]);
-
- htbl->sent_table = TRUE;
- }
-}
-
-
-LOCAL(void)
-emit_dac (j_compress_ptr cinfo)
-/* Emit a DAC marker */
-/* Since the useful info is so small, we want to emit all the tables in */
-/* one DAC marker. Therefore this routine does its own scan of the table. */
-{
-#ifdef C_ARITH_CODING_SUPPORTED
- char dc_in_use[NUM_ARITH_TBLS];
- char ac_in_use[NUM_ARITH_TBLS];
- int length, i;
- jpeg_component_info *compptr;
-
- for (i = 0; i < NUM_ARITH_TBLS; i++)
- dc_in_use[i] = ac_in_use[i] = 0;
-
- for (i = 0; i < cinfo->comps_in_scan; i++) {
- compptr = cinfo->cur_comp_info[i];
- dc_in_use[compptr->dc_tbl_no] = 1;
- ac_in_use[compptr->ac_tbl_no] = 1;
- }
-
- length = 0;
- for (i = 0; i < NUM_ARITH_TBLS; i++)
- length += dc_in_use[i] + ac_in_use[i];
-
- emit_marker(cinfo, M_DAC);
-
- emit_2bytes(cinfo, length*2 + 2);
-
- for (i = 0; i < NUM_ARITH_TBLS; i++) {
- if (dc_in_use[i]) {
- emit_byte(cinfo, i);
- emit_byte(cinfo, cinfo->arith_dc_L[i] + (cinfo->arith_dc_U[i]<<4));
- }
- if (ac_in_use[i]) {
- emit_byte(cinfo, i + 0x10);
- emit_byte(cinfo, cinfo->arith_ac_K[i]);
- }
- }
-#endif /* C_ARITH_CODING_SUPPORTED */
-}
-
-
-LOCAL(void)
-emit_dri (j_compress_ptr cinfo)
-/* Emit a DRI marker */
-{
- emit_marker(cinfo, M_DRI);
-
- emit_2bytes(cinfo, 4); /* fixed length */
-
- emit_2bytes(cinfo, (int) cinfo->restart_interval);
-}
-
-
-LOCAL(void)
-emit_sof (j_compress_ptr cinfo, JPEG_MARKER code)
-/* Emit a SOF marker */
-{
- int ci;
- jpeg_component_info *compptr;
-
- emit_marker(cinfo, code);
-
- emit_2bytes(cinfo, 3 * cinfo->num_components + 2 + 5 + 1); /* length */
-
- /* Make sure image isn't bigger than SOF field can handle */
- if ((long) cinfo->image_height > 65535L ||
- (long) cinfo->image_width > 65535L)
- ERREXIT1(cinfo, JERR_IMAGE_TOO_BIG, (unsigned int) 65535);
-
- emit_byte(cinfo, cinfo->data_precision);
- emit_2bytes(cinfo, (int) cinfo->image_height);
- emit_2bytes(cinfo, (int) cinfo->image_width);
-
- emit_byte(cinfo, cinfo->num_components);
-
- for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
- ci++, compptr++) {
- emit_byte(cinfo, compptr->component_id);
- emit_byte(cinfo, (compptr->h_samp_factor << 4) + compptr->v_samp_factor);
- emit_byte(cinfo, compptr->quant_tbl_no);
- }
-}
-
-
-LOCAL(void)
-emit_sos (j_compress_ptr cinfo)
-/* Emit a SOS marker */
-{
- int i, td, ta;
- jpeg_component_info *compptr;
-
- emit_marker(cinfo, M_SOS);
-
- emit_2bytes(cinfo, 2 * cinfo->comps_in_scan + 2 + 1 + 3); /* length */
-
- emit_byte(cinfo, cinfo->comps_in_scan);
-
- for (i = 0; i < cinfo->comps_in_scan; i++) {
- compptr = cinfo->cur_comp_info[i];
- emit_byte(cinfo, compptr->component_id);
- td = compptr->dc_tbl_no;
- ta = compptr->ac_tbl_no;
- if (cinfo->progressive_mode) {
- /* Progressive mode: only DC or only AC tables are used in one scan;
- * furthermore, Huffman coding of DC refinement uses no table at all.
- * We emit 0 for unused field(s); this is recommended by the P&M text
- * but does not seem to be specified in the standard.
- */
- if (cinfo->Ss == 0) {
- ta = 0; /* DC scan */
- if (cinfo->Ah != 0 && !cinfo->arith_code)
- td = 0; /* no DC table either */
- } else {
- td = 0; /* AC scan */
- }
- }
- emit_byte(cinfo, (td << 4) + ta);
- }
-
- emit_byte(cinfo, cinfo->Ss);
- emit_byte(cinfo, cinfo->Se);
- emit_byte(cinfo, (cinfo->Ah << 4) + cinfo->Al);
-}
-
-
-LOCAL(void)
-emit_jfif_app0 (j_compress_ptr cinfo)
-/* Emit a JFIF-compliant APP0 marker */
-{
- /*
- * Length of APP0 block (2 bytes)
- * Block ID (4 bytes - ASCII "JFIF")
- * Zero byte (1 byte to terminate the ID string)
- * Version Major, Minor (2 bytes - major first)
- * Units (1 byte - 0x00 = none, 0x01 = inch, 0x02 = cm)
- * Xdpu (2 bytes - dots per unit horizontal)
- * Ydpu (2 bytes - dots per unit vertical)
- * Thumbnail X size (1 byte)
- * Thumbnail Y size (1 byte)
- */
-
- emit_marker(cinfo, M_APP0);
-
- emit_2bytes(cinfo, 2 + 4 + 1 + 2 + 1 + 2 + 2 + 1 + 1); /* length */
-
- emit_byte(cinfo, 0x4A); /* Identifier: ASCII "JFIF" */
- emit_byte(cinfo, 0x46);
- emit_byte(cinfo, 0x49);
- emit_byte(cinfo, 0x46);
- emit_byte(cinfo, 0);
- emit_byte(cinfo, cinfo->JFIF_major_version); /* Version fields */
- emit_byte(cinfo, cinfo->JFIF_minor_version);
- emit_byte(cinfo, cinfo->density_unit); /* Pixel size information */
- emit_2bytes(cinfo, (int) cinfo->X_density);
- emit_2bytes(cinfo, (int) cinfo->Y_density);
- emit_byte(cinfo, 0); /* No thumbnail image */
- emit_byte(cinfo, 0);
-}
-
-
-LOCAL(void)
-emit_adobe_app14 (j_compress_ptr cinfo)
-/* Emit an Adobe APP14 marker */
-{
- /*
- * Length of APP14 block (2 bytes)
- * Block ID (5 bytes - ASCII "Adobe")
- * Version Number (2 bytes - currently 100)
- * Flags0 (2 bytes - currently 0)
- * Flags1 (2 bytes - currently 0)
- * Color transform (1 byte)
- *
- * Although Adobe TN 5116 mentions Version = 101, all the Adobe files
- * now in circulation seem to use Version = 100, so that's what we write.
- *
- * We write the color transform byte as 1 if the JPEG color space is
- * YCbCr, 2 if it's YCCK, 0 otherwise. Adobe's definition has to do with
- * whether the encoder performed a transformation, which is pretty useless.
- */
-
- emit_marker(cinfo, M_APP14);
-
- emit_2bytes(cinfo, 2 + 5 + 2 + 2 + 2 + 1); /* length */
-
- emit_byte(cinfo, 0x41); /* Identifier: ASCII "Adobe" */
- emit_byte(cinfo, 0x64);
- emit_byte(cinfo, 0x6F);
- emit_byte(cinfo, 0x62);
- emit_byte(cinfo, 0x65);
- emit_2bytes(cinfo, 100); /* Version */
- emit_2bytes(cinfo, 0); /* Flags0 */
- emit_2bytes(cinfo, 0); /* Flags1 */
- switch (cinfo->jpeg_color_space) {
- case JCS_YCbCr:
- emit_byte(cinfo, 1); /* Color transform = 1 */
- break;
- case JCS_YCCK:
- emit_byte(cinfo, 2); /* Color transform = 2 */
- break;
- default:
- emit_byte(cinfo, 0); /* Color transform = 0 */
- break;
- }
-}
-
-
-/*
- * These routines allow writing an arbitrary marker with parameters.
- * The only intended use is to emit COM or APPn markers after calling
- * write_file_header and before calling write_frame_header.
- * Other uses are not guaranteed to produce desirable results.
- * Counting the parameter bytes properly is the caller's responsibility.
- */
-
-METHODDEF(void)
-write_marker_header (j_compress_ptr cinfo, int marker, unsigned int datalen)
-/* Emit an arbitrary marker header */
-{
- if (datalen > (unsigned int) 65533) /* safety check */
- ERREXIT(cinfo, JERR_BAD_LENGTH);
-
- emit_marker(cinfo, (JPEG_MARKER) marker);
-
- emit_2bytes(cinfo, (int) (datalen + 2)); /* total length */
-}
-
-METHODDEF(void)
-write_marker_byte (j_compress_ptr cinfo, int val)
-/* Emit one byte of marker parameters following write_marker_header */
-{
- emit_byte(cinfo, val);
-}
-
-
-/*
- * Write datastream header.
- * This consists of an SOI and optional APPn markers.
- * We recommend use of the JFIF marker, but not the Adobe marker,
- * when using YCbCr or grayscale data. The JFIF marker should NOT
- * be used for any other JPEG colorspace. The Adobe marker is helpful
- * to distinguish RGB, CMYK, and YCCK colorspaces.
- * Note that an application can write additional header markers after
- * jpeg_start_compress returns.
- */
-
-METHODDEF(void)
-write_file_header (j_compress_ptr cinfo)
-{
- my_marker_ptr marker = (my_marker_ptr) cinfo->marker;
-
- emit_marker(cinfo, M_SOI); /* first the SOI */
-
- /* SOI is defined to reset restart interval to 0 */
- marker->last_restart_interval = 0;
-
- if (cinfo->write_JFIF_header) /* next an optional JFIF APP0 */
- emit_jfif_app0(cinfo);
- if (cinfo->write_Adobe_marker) /* next an optional Adobe APP14 */
- emit_adobe_app14(cinfo);
-}
-
-
-/*
- * Write frame header.
- * This consists of DQT and SOFn markers.
- * Note that we do not emit the SOF until we have emitted the DQT(s).
- * This avoids compatibility problems with incorrect implementations that
- * try to error-check the quant table numbers as soon as they see the SOF.
- */
-
-METHODDEF(void)
-write_frame_header (j_compress_ptr cinfo)
-{
- int ci, prec;
- boolean is_baseline;
- jpeg_component_info *compptr;
-
- /* Emit DQT for each quantization table.
- * Note that emit_dqt() suppresses any duplicate tables.
- */
- prec = 0;
- for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
- ci++, compptr++) {
- prec += emit_dqt(cinfo, compptr->quant_tbl_no);
- }
- /* now prec is nonzero iff there are any 16-bit quant tables. */
-
- /* Check for a non-baseline specification.
- * Note we assume that Huffman table numbers won't be changed later.
- */
- if (cinfo->arith_code || cinfo->progressive_mode ||
- cinfo->data_precision != 8) {
- is_baseline = FALSE;
- } else {
- is_baseline = TRUE;
- for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
- ci++, compptr++) {
- if (compptr->dc_tbl_no > 1 || compptr->ac_tbl_no > 1)
- is_baseline = FALSE;
- }
- if (prec && is_baseline) {
- is_baseline = FALSE;
- /* If it's baseline except for quantizer size, warn the user */
- TRACEMS(cinfo, 0, JTRC_16BIT_TABLES);
- }
- }
-
- /* Emit the proper SOF marker */
- if (cinfo->arith_code) {
- emit_sof(cinfo, M_SOF9); /* SOF code for arithmetic coding */
- } else {
- if (cinfo->progressive_mode)
- emit_sof(cinfo, M_SOF2); /* SOF code for progressive Huffman */
- else if (is_baseline)
- emit_sof(cinfo, M_SOF0); /* SOF code for baseline implementation */
- else
- emit_sof(cinfo, M_SOF1); /* SOF code for non-baseline Huffman file */
- }
-}
-
-
-/*
- * Write scan header.
- * This consists of DHT or DAC markers, optional DRI, and SOS.
- * Compressed data will be written following the SOS.
- */
-
-METHODDEF(void)
-write_scan_header (j_compress_ptr cinfo)
-{
- my_marker_ptr marker = (my_marker_ptr) cinfo->marker;
- int i;
- jpeg_component_info *compptr;
-
- if (cinfo->arith_code) {
- /* Emit arith conditioning info. We may have some duplication
- * if the file has multiple scans, but it's so small it's hardly
- * worth worrying about.
- */
- emit_dac(cinfo);
- } else {
- /* Emit Huffman tables.
- * Note that emit_dht() suppresses any duplicate tables.
- */
- for (i = 0; i < cinfo->comps_in_scan; i++) {
- compptr = cinfo->cur_comp_info[i];
- if (cinfo->progressive_mode) {
- /* Progressive mode: only DC or only AC tables are used in one scan */
- if (cinfo->Ss == 0) {
- if (cinfo->Ah == 0) /* DC needs no table for refinement scan */
- emit_dht(cinfo, compptr->dc_tbl_no, FALSE);
- } else {
- emit_dht(cinfo, compptr->ac_tbl_no, TRUE);
- }
- } else {
- /* Sequential mode: need both DC and AC tables */
- emit_dht(cinfo, compptr->dc_tbl_no, FALSE);
- emit_dht(cinfo, compptr->ac_tbl_no, TRUE);
- }
- }
- }
-
- /* Emit DRI if required --- note that DRI value could change for each scan.
- * We avoid wasting space with unnecessary DRIs, however.
- */
- if (cinfo->restart_interval != marker->last_restart_interval) {
- emit_dri(cinfo);
- marker->last_restart_interval = cinfo->restart_interval;
- }
-
- emit_sos(cinfo);
-}
-
-
-/*
- * Write datastream trailer.
- */
-
-METHODDEF(void)
-write_file_trailer (j_compress_ptr cinfo)
-{
- emit_marker(cinfo, M_EOI);
-}
-
-
-/*
- * Write an abbreviated table-specification datastream.
- * This consists of SOI, DQT and DHT tables, and EOI.
- * Any table that is defined and not marked sent_table = TRUE will be
- * emitted. Note that all tables will be marked sent_table = TRUE at exit.
- */
-
-METHODDEF(void)
-write_tables_only (j_compress_ptr cinfo)
-{
- int i;
-
- emit_marker(cinfo, M_SOI);
-
- for (i = 0; i < NUM_QUANT_TBLS; i++) {
- if (cinfo->quant_tbl_ptrs[i] != NULL)
- (void) emit_dqt(cinfo, i);
- }
-
- if (! cinfo->arith_code) {
- for (i = 0; i < NUM_HUFF_TBLS; i++) {
- if (cinfo->dc_huff_tbl_ptrs[i] != NULL)
- emit_dht(cinfo, i, FALSE);
- if (cinfo->ac_huff_tbl_ptrs[i] != NULL)
- emit_dht(cinfo, i, TRUE);
- }
- }
-
- emit_marker(cinfo, M_EOI);
-}
-
-
-/*
- * Initialize the marker writer module.
- */
-
-GLOBAL(void)
-jinit_marker_writer (j_compress_ptr cinfo)
-{
- my_marker_ptr marker;
-
- /* Create the subobject */
- marker = (my_marker_ptr)
- (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
- SIZEOF(my_marker_writer));
- cinfo->marker = (struct jpeg_marker_writer *) marker;
- /* Initialize method pointers */
- marker->pub.write_file_header = write_file_header;
- marker->pub.write_frame_header = write_frame_header;
- marker->pub.write_scan_header = write_scan_header;
- marker->pub.write_file_trailer = write_file_trailer;
- marker->pub.write_tables_only = write_tables_only;
- marker->pub.write_marker_header = write_marker_header;
- marker->pub.write_marker_byte = write_marker_byte;
- /* Initialize private state */
- marker->last_restart_interval = 0;
-}
-
-#endif //_FX_JPEG_TURBO_
+#if !defined(_FX_JPEG_TURBO_)
+/*
+ * jcmarker.c
+ *
+ * Copyright (C) 1991-1998, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains routines to write JPEG datastream markers.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+
+
+typedef enum { /* JPEG marker codes */
+ M_SOF0 = 0xc0,
+ M_SOF1 = 0xc1,
+ M_SOF2 = 0xc2,
+ M_SOF3 = 0xc3,
+
+ M_SOF5 = 0xc5,
+ M_SOF6 = 0xc6,
+ M_SOF7 = 0xc7,
+
+ M_JPG = 0xc8,
+ M_SOF9 = 0xc9,
+ M_SOF10 = 0xca,
+ M_SOF11 = 0xcb,
+
+ M_SOF13 = 0xcd,
+ M_SOF14 = 0xce,
+ M_SOF15 = 0xcf,
+
+ M_DHT = 0xc4,
+
+ M_DAC = 0xcc,
+
+ M_RST0 = 0xd0,
+ M_RST1 = 0xd1,
+ M_RST2 = 0xd2,
+ M_RST3 = 0xd3,
+ M_RST4 = 0xd4,
+ M_RST5 = 0xd5,
+ M_RST6 = 0xd6,
+ M_RST7 = 0xd7,
+
+ M_SOI = 0xd8,
+ M_EOI = 0xd9,
+ M_SOS = 0xda,
+ M_DQT = 0xdb,
+ M_DNL = 0xdc,
+ M_DRI = 0xdd,
+ M_DHP = 0xde,
+ M_EXP = 0xdf,
+
+ M_APP0 = 0xe0,
+ M_APP1 = 0xe1,
+ M_APP2 = 0xe2,
+ M_APP3 = 0xe3,
+ M_APP4 = 0xe4,
+ M_APP5 = 0xe5,
+ M_APP6 = 0xe6,
+ M_APP7 = 0xe7,
+ M_APP8 = 0xe8,
+ M_APP9 = 0xe9,
+ M_APP10 = 0xea,
+ M_APP11 = 0xeb,
+ M_APP12 = 0xec,
+ M_APP13 = 0xed,
+ M_APP14 = 0xee,
+ M_APP15 = 0xef,
+
+ M_JPG0 = 0xf0,
+ M_JPG13 = 0xfd,
+ M_COM = 0xfe,
+
+ M_TEM = 0x01,
+
+ M_ERROR = 0x100
+} JPEG_MARKER;
+
+
+/* Private state */
+
+typedef struct {
+ struct jpeg_marker_writer pub; /* public fields */
+
+ unsigned int last_restart_interval; /* last DRI value emitted; 0 after SOI */
+} my_marker_writer;
+
+typedef my_marker_writer * my_marker_ptr;
+
+
+/*
+ * Basic output routines.
+ *
+ * Note that we do not support suspension while writing a marker.
+ * Therefore, an application using suspension must ensure that there is
+ * enough buffer space for the initial markers (typ. 600-700 bytes) before
+ * calling jpeg_start_compress, and enough space to write the trailing EOI
+ * (a few bytes) before calling jpeg_finish_compress. Multipass compression
+ * modes are not supported at all with suspension, so those two are the only
+ * points where markers will be written.
+ */
+
+LOCAL(void)
+emit_byte (j_compress_ptr cinfo, int val)
+/* Emit a byte */
+{
+ struct jpeg_destination_mgr * dest = cinfo->dest;
+
+ *(dest->next_output_byte)++ = (JOCTET) val;
+ if (--dest->free_in_buffer == 0) {
+ if (! (*dest->empty_output_buffer) (cinfo))
+ ERREXIT(cinfo, JERR_CANT_SUSPEND);
+ }
+}
+
+
+LOCAL(void)
+emit_marker (j_compress_ptr cinfo, JPEG_MARKER mark)
+/* Emit a marker code */
+{
+ emit_byte(cinfo, 0xFF);
+ emit_byte(cinfo, (int) mark);
+}
+
+
+LOCAL(void)
+emit_2bytes (j_compress_ptr cinfo, int value)
+/* Emit a 2-byte integer; these are always MSB first in JPEG files */
+{
+ emit_byte(cinfo, (value >> 8) & 0xFF);
+ emit_byte(cinfo, value & 0xFF);
+}
+
+
+/*
+ * Routines to write specific marker types.
+ */
+
+LOCAL(int)
+emit_dqt (j_compress_ptr cinfo, int index)
+/* Emit a DQT marker */
+/* Returns the precision used (0 = 8bits, 1 = 16bits) for baseline checking */
+{
+ JQUANT_TBL * qtbl = cinfo->quant_tbl_ptrs[index];
+ int prec;
+ int i;
+
+ if (qtbl == NULL)
+ ERREXIT1(cinfo, JERR_NO_QUANT_TABLE, index);
+
+ prec = 0;
+ for (i = 0; i < DCTSIZE2; i++) {
+ if (qtbl->quantval[i] > 255)
+ prec = 1;
+ }
+
+ if (! qtbl->sent_table) {
+ emit_marker(cinfo, M_DQT);
+
+ emit_2bytes(cinfo, prec ? DCTSIZE2*2 + 1 + 2 : DCTSIZE2 + 1 + 2);
+
+ emit_byte(cinfo, index + (prec<<4));
+
+ for (i = 0; i < DCTSIZE2; i++) {
+ /* The table entries must be emitted in zigzag order. */
+ unsigned int qval = qtbl->quantval[jpeg_natural_order[i]];
+ if (prec)
+ emit_byte(cinfo, (int) (qval >> 8));
+ emit_byte(cinfo, (int) (qval & 0xFF));
+ }
+
+ qtbl->sent_table = TRUE;
+ }
+
+ return prec;
+}
+
+
+LOCAL(void)
+emit_dht (j_compress_ptr cinfo, int index, boolean is_ac)
+/* Emit a DHT marker */
+{
+ JHUFF_TBL * htbl;
+ int length, i;
+
+ if (is_ac) {
+ htbl = cinfo->ac_huff_tbl_ptrs[index];
+ index += 0x10; /* output index has AC bit set */
+ } else {
+ htbl = cinfo->dc_huff_tbl_ptrs[index];
+ }
+
+ if (htbl == NULL)
+ ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, index);
+
+ if (! htbl->sent_table) {
+ emit_marker(cinfo, M_DHT);
+
+ length = 0;
+ for (i = 1; i <= 16; i++)
+ length += htbl->bits[i];
+
+ emit_2bytes(cinfo, length + 2 + 1 + 16);
+ emit_byte(cinfo, index);
+
+ for (i = 1; i <= 16; i++)
+ emit_byte(cinfo, htbl->bits[i]);
+
+ for (i = 0; i < length; i++)
+ emit_byte(cinfo, htbl->huffval[i]);
+
+ htbl->sent_table = TRUE;
+ }
+}
+
+
+LOCAL(void)
+emit_dac (j_compress_ptr cinfo)
+/* Emit a DAC marker */
+/* Since the useful info is so small, we want to emit all the tables in */
+/* one DAC marker. Therefore this routine does its own scan of the table. */
+{
+#ifdef C_ARITH_CODING_SUPPORTED
+ char dc_in_use[NUM_ARITH_TBLS];
+ char ac_in_use[NUM_ARITH_TBLS];
+ int length, i;
+ jpeg_component_info *compptr;
+
+ for (i = 0; i < NUM_ARITH_TBLS; i++)
+ dc_in_use[i] = ac_in_use[i] = 0;
+
+ for (i = 0; i < cinfo->comps_in_scan; i++) {
+ compptr = cinfo->cur_comp_info[i];
+ dc_in_use[compptr->dc_tbl_no] = 1;
+ ac_in_use[compptr->ac_tbl_no] = 1;
+ }
+
+ length = 0;
+ for (i = 0; i < NUM_ARITH_TBLS; i++)
+ length += dc_in_use[i] + ac_in_use[i];
+
+ emit_marker(cinfo, M_DAC);
+
+ emit_2bytes(cinfo, length*2 + 2);
+
+ for (i = 0; i < NUM_ARITH_TBLS; i++) {
+ if (dc_in_use[i]) {
+ emit_byte(cinfo, i);
+ emit_byte(cinfo, cinfo->arith_dc_L[i] + (cinfo->arith_dc_U[i]<<4));
+ }
+ if (ac_in_use[i]) {
+ emit_byte(cinfo, i + 0x10);
+ emit_byte(cinfo, cinfo->arith_ac_K[i]);
+ }
+ }
+#endif /* C_ARITH_CODING_SUPPORTED */
+}
+
+
+LOCAL(void)
+emit_dri (j_compress_ptr cinfo)
+/* Emit a DRI marker */
+{
+ emit_marker(cinfo, M_DRI);
+
+ emit_2bytes(cinfo, 4); /* fixed length */
+
+ emit_2bytes(cinfo, (int) cinfo->restart_interval);
+}
+
+
+LOCAL(void)
+emit_sof (j_compress_ptr cinfo, JPEG_MARKER code)
+/* Emit a SOF marker */
+{
+ int ci;
+ jpeg_component_info *compptr;
+
+ emit_marker(cinfo, code);
+
+ emit_2bytes(cinfo, 3 * cinfo->num_components + 2 + 5 + 1); /* length */
+
+ /* Make sure image isn't bigger than SOF field can handle */
+ if ((long) cinfo->image_height > 65535L ||
+ (long) cinfo->image_width > 65535L)
+ ERREXIT1(cinfo, JERR_IMAGE_TOO_BIG, (unsigned int) 65535);
+
+ emit_byte(cinfo, cinfo->data_precision);
+ emit_2bytes(cinfo, (int) cinfo->image_height);
+ emit_2bytes(cinfo, (int) cinfo->image_width);
+
+ emit_byte(cinfo, cinfo->num_components);
+
+ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+ ci++, compptr++) {
+ emit_byte(cinfo, compptr->component_id);
+ emit_byte(cinfo, (compptr->h_samp_factor << 4) + compptr->v_samp_factor);
+ emit_byte(cinfo, compptr->quant_tbl_no);
+ }
+}
+
+
+LOCAL(void)
+emit_sos (j_compress_ptr cinfo)
+/* Emit a SOS marker */
+{
+ int i, td, ta;
+ jpeg_component_info *compptr;
+
+ emit_marker(cinfo, M_SOS);
+
+ emit_2bytes(cinfo, 2 * cinfo->comps_in_scan + 2 + 1 + 3); /* length */
+
+ emit_byte(cinfo, cinfo->comps_in_scan);
+
+ for (i = 0; i < cinfo->comps_in_scan; i++) {
+ compptr = cinfo->cur_comp_info[i];
+ emit_byte(cinfo, compptr->component_id);
+ td = compptr->dc_tbl_no;
+ ta = compptr->ac_tbl_no;
+ if (cinfo->progressive_mode) {
+ /* Progressive mode: only DC or only AC tables are used in one scan;
+ * furthermore, Huffman coding of DC refinement uses no table at all.
+ * We emit 0 for unused field(s); this is recommended by the P&M text
+ * but does not seem to be specified in the standard.
+ */
+ if (cinfo->Ss == 0) {
+ ta = 0; /* DC scan */
+ if (cinfo->Ah != 0 && !cinfo->arith_code)
+ td = 0; /* no DC table either */
+ } else {
+ td = 0; /* AC scan */
+ }
+ }
+ emit_byte(cinfo, (td << 4) + ta);
+ }
+
+ emit_byte(cinfo, cinfo->Ss);
+ emit_byte(cinfo, cinfo->Se);
+ emit_byte(cinfo, (cinfo->Ah << 4) + cinfo->Al);
+}
+
+
+LOCAL(void)
+emit_jfif_app0 (j_compress_ptr cinfo)
+/* Emit a JFIF-compliant APP0 marker */
+{
+ /*
+ * Length of APP0 block (2 bytes)
+ * Block ID (4 bytes - ASCII "JFIF")
+ * Zero byte (1 byte to terminate the ID string)
+ * Version Major, Minor (2 bytes - major first)
+ * Units (1 byte - 0x00 = none, 0x01 = inch, 0x02 = cm)
+ * Xdpu (2 bytes - dots per unit horizontal)
+ * Ydpu (2 bytes - dots per unit vertical)
+ * Thumbnail X size (1 byte)
+ * Thumbnail Y size (1 byte)
+ */
+
+ emit_marker(cinfo, M_APP0);
+
+ emit_2bytes(cinfo, 2 + 4 + 1 + 2 + 1 + 2 + 2 + 1 + 1); /* length */
+
+ emit_byte(cinfo, 0x4A); /* Identifier: ASCII "JFIF" */
+ emit_byte(cinfo, 0x46);
+ emit_byte(cinfo, 0x49);
+ emit_byte(cinfo, 0x46);
+ emit_byte(cinfo, 0);
+ emit_byte(cinfo, cinfo->JFIF_major_version); /* Version fields */
+ emit_byte(cinfo, cinfo->JFIF_minor_version);
+ emit_byte(cinfo, cinfo->density_unit); /* Pixel size information */
+ emit_2bytes(cinfo, (int) cinfo->X_density);
+ emit_2bytes(cinfo, (int) cinfo->Y_density);
+ emit_byte(cinfo, 0); /* No thumbnail image */
+ emit_byte(cinfo, 0);
+}
+
+
+LOCAL(void)
+emit_adobe_app14 (j_compress_ptr cinfo)
+/* Emit an Adobe APP14 marker */
+{
+ /*
+ * Length of APP14 block (2 bytes)
+ * Block ID (5 bytes - ASCII "Adobe")
+ * Version Number (2 bytes - currently 100)
+ * Flags0 (2 bytes - currently 0)
+ * Flags1 (2 bytes - currently 0)
+ * Color transform (1 byte)
+ *
+ * Although Adobe TN 5116 mentions Version = 101, all the Adobe files
+ * now in circulation seem to use Version = 100, so that's what we write.
+ *
+ * We write the color transform byte as 1 if the JPEG color space is
+ * YCbCr, 2 if it's YCCK, 0 otherwise. Adobe's definition has to do with
+ * whether the encoder performed a transformation, which is pretty useless.
+ */
+
+ emit_marker(cinfo, M_APP14);
+
+ emit_2bytes(cinfo, 2 + 5 + 2 + 2 + 2 + 1); /* length */
+
+ emit_byte(cinfo, 0x41); /* Identifier: ASCII "Adobe" */
+ emit_byte(cinfo, 0x64);
+ emit_byte(cinfo, 0x6F);
+ emit_byte(cinfo, 0x62);
+ emit_byte(cinfo, 0x65);
+ emit_2bytes(cinfo, 100); /* Version */
+ emit_2bytes(cinfo, 0); /* Flags0 */
+ emit_2bytes(cinfo, 0); /* Flags1 */
+ switch (cinfo->jpeg_color_space) {
+ case JCS_YCbCr:
+ emit_byte(cinfo, 1); /* Color transform = 1 */
+ break;
+ case JCS_YCCK:
+ emit_byte(cinfo, 2); /* Color transform = 2 */
+ break;
+ default:
+ emit_byte(cinfo, 0); /* Color transform = 0 */
+ break;
+ }
+}
+
+
+/*
+ * These routines allow writing an arbitrary marker with parameters.
+ * The only intended use is to emit COM or APPn markers after calling
+ * write_file_header and before calling write_frame_header.
+ * Other uses are not guaranteed to produce desirable results.
+ * Counting the parameter bytes properly is the caller's responsibility.
+ */
+
+METHODDEF(void)
+write_marker_header (j_compress_ptr cinfo, int marker, unsigned int datalen)
+/* Emit an arbitrary marker header */
+{
+ if (datalen > (unsigned int) 65533) /* safety check */
+ ERREXIT(cinfo, JERR_BAD_LENGTH);
+
+ emit_marker(cinfo, (JPEG_MARKER) marker);
+
+ emit_2bytes(cinfo, (int) (datalen + 2)); /* total length */
+}
+
+METHODDEF(void)
+write_marker_byte (j_compress_ptr cinfo, int val)
+/* Emit one byte of marker parameters following write_marker_header */
+{
+ emit_byte(cinfo, val);
+}
+
+
+/*
+ * Write datastream header.
+ * This consists of an SOI and optional APPn markers.
+ * We recommend use of the JFIF marker, but not the Adobe marker,
+ * when using YCbCr or grayscale data. The JFIF marker should NOT
+ * be used for any other JPEG colorspace. The Adobe marker is helpful
+ * to distinguish RGB, CMYK, and YCCK colorspaces.
+ * Note that an application can write additional header markers after
+ * jpeg_start_compress returns.
+ */
+
+METHODDEF(void)
+write_file_header (j_compress_ptr cinfo)
+{
+ my_marker_ptr marker = (my_marker_ptr) cinfo->marker;
+
+ emit_marker(cinfo, M_SOI); /* first the SOI */
+
+ /* SOI is defined to reset restart interval to 0 */
+ marker->last_restart_interval = 0;
+
+ if (cinfo->write_JFIF_header) /* next an optional JFIF APP0 */
+ emit_jfif_app0(cinfo);
+ if (cinfo->write_Adobe_marker) /* next an optional Adobe APP14 */
+ emit_adobe_app14(cinfo);
+}
+
+
+/*
+ * Write frame header.
+ * This consists of DQT and SOFn markers.
+ * Note that we do not emit the SOF until we have emitted the DQT(s).
+ * This avoids compatibility problems with incorrect implementations that
+ * try to error-check the quant table numbers as soon as they see the SOF.
+ */
+
+METHODDEF(void)
+write_frame_header (j_compress_ptr cinfo)
+{
+ int ci, prec;
+ boolean is_baseline;
+ jpeg_component_info *compptr;
+
+ /* Emit DQT for each quantization table.
+ * Note that emit_dqt() suppresses any duplicate tables.
+ */
+ prec = 0;
+ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+ ci++, compptr++) {
+ prec += emit_dqt(cinfo, compptr->quant_tbl_no);
+ }
+ /* now prec is nonzero iff there are any 16-bit quant tables. */
+
+ /* Check for a non-baseline specification.
+ * Note we assume that Huffman table numbers won't be changed later.
+ */
+ if (cinfo->arith_code || cinfo->progressive_mode ||
+ cinfo->data_precision != 8) {
+ is_baseline = FALSE;
+ } else {
+ is_baseline = TRUE;
+ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+ ci++, compptr++) {
+ if (compptr->dc_tbl_no > 1 || compptr->ac_tbl_no > 1)
+ is_baseline = FALSE;
+ }
+ if (prec && is_baseline) {
+ is_baseline = FALSE;
+ /* If it's baseline except for quantizer size, warn the user */
+ TRACEMS(cinfo, 0, JTRC_16BIT_TABLES);
+ }
+ }
+
+ /* Emit the proper SOF marker */
+ if (cinfo->arith_code) {
+ emit_sof(cinfo, M_SOF9); /* SOF code for arithmetic coding */
+ } else {
+ if (cinfo->progressive_mode)
+ emit_sof(cinfo, M_SOF2); /* SOF code for progressive Huffman */
+ else if (is_baseline)
+ emit_sof(cinfo, M_SOF0); /* SOF code for baseline implementation */
+ else
+ emit_sof(cinfo, M_SOF1); /* SOF code for non-baseline Huffman file */
+ }
+}
+
+
+/*
+ * Write scan header.
+ * This consists of DHT or DAC markers, optional DRI, and SOS.
+ * Compressed data will be written following the SOS.
+ */
+
+METHODDEF(void)
+write_scan_header (j_compress_ptr cinfo)
+{
+ my_marker_ptr marker = (my_marker_ptr) cinfo->marker;
+ int i;
+ jpeg_component_info *compptr;
+
+ if (cinfo->arith_code) {
+ /* Emit arith conditioning info. We may have some duplication
+ * if the file has multiple scans, but it's so small it's hardly
+ * worth worrying about.
+ */
+ emit_dac(cinfo);
+ } else {
+ /* Emit Huffman tables.
+ * Note that emit_dht() suppresses any duplicate tables.
+ */
+ for (i = 0; i < cinfo->comps_in_scan; i++) {
+ compptr = cinfo->cur_comp_info[i];
+ if (cinfo->progressive_mode) {
+ /* Progressive mode: only DC or only AC tables are used in one scan */
+ if (cinfo->Ss == 0) {
+ if (cinfo->Ah == 0) /* DC needs no table for refinement scan */
+ emit_dht(cinfo, compptr->dc_tbl_no, FALSE);
+ } else {
+ emit_dht(cinfo, compptr->ac_tbl_no, TRUE);
+ }
+ } else {
+ /* Sequential mode: need both DC and AC tables */
+ emit_dht(cinfo, compptr->dc_tbl_no, FALSE);
+ emit_dht(cinfo, compptr->ac_tbl_no, TRUE);
+ }
+ }
+ }
+
+ /* Emit DRI if required --- note that DRI value could change for each scan.
+ * We avoid wasting space with unnecessary DRIs, however.
+ */
+ if (cinfo->restart_interval != marker->last_restart_interval) {
+ emit_dri(cinfo);
+ marker->last_restart_interval = cinfo->restart_interval;
+ }
+
+ emit_sos(cinfo);
+}
+
+
+/*
+ * Write datastream trailer.
+ */
+
+METHODDEF(void)
+write_file_trailer (j_compress_ptr cinfo)
+{
+ emit_marker(cinfo, M_EOI);
+}
+
+
+/*
+ * Write an abbreviated table-specification datastream.
+ * This consists of SOI, DQT and DHT tables, and EOI.
+ * Any table that is defined and not marked sent_table = TRUE will be
+ * emitted. Note that all tables will be marked sent_table = TRUE at exit.
+ */
+
+METHODDEF(void)
+write_tables_only (j_compress_ptr cinfo)
+{
+ int i;
+
+ emit_marker(cinfo, M_SOI);
+
+ for (i = 0; i < NUM_QUANT_TBLS; i++) {
+ if (cinfo->quant_tbl_ptrs[i] != NULL)
+ (void) emit_dqt(cinfo, i);
+ }
+
+ if (! cinfo->arith_code) {
+ for (i = 0; i < NUM_HUFF_TBLS; i++) {
+ if (cinfo->dc_huff_tbl_ptrs[i] != NULL)
+ emit_dht(cinfo, i, FALSE);
+ if (cinfo->ac_huff_tbl_ptrs[i] != NULL)
+ emit_dht(cinfo, i, TRUE);
+ }
+ }
+
+ emit_marker(cinfo, M_EOI);
+}
+
+
+/*
+ * Initialize the marker writer module.
+ */
+
+GLOBAL(void)
+jinit_marker_writer (j_compress_ptr cinfo)
+{
+ my_marker_ptr marker;
+
+ /* Create the subobject */
+ marker = (my_marker_ptr)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ SIZEOF(my_marker_writer));
+ cinfo->marker = (struct jpeg_marker_writer *) marker;
+ /* Initialize method pointers */
+ marker->pub.write_file_header = write_file_header;
+ marker->pub.write_frame_header = write_frame_header;
+ marker->pub.write_scan_header = write_scan_header;
+ marker->pub.write_file_trailer = write_file_trailer;
+ marker->pub.write_tables_only = write_tables_only;
+ marker->pub.write_marker_header = write_marker_header;
+ marker->pub.write_marker_byte = write_marker_byte;
+ /* Initialize private state */
+ marker->last_restart_interval = 0;
+}
+
+#endif //_FX_JPEG_TURBO_
diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jcmaster.c b/core/src/fxcodec/libjpeg/fpdfapi_jcmaster.c
index 870f775191..45322a53b3 100644
--- a/core/src/fxcodec/libjpeg/fpdfapi_jcmaster.c
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jcmaster.c
@@ -1,593 +1,593 @@
-#if !defined(_FX_JPEG_TURBO_)
-/*
- * jcmaster.c
- *
- * Copyright (C) 1991-1997, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains master control logic for the JPEG compressor.
- * These routines are concerned with parameter validation, initial setup,
- * and inter-pass control (determining the number of passes and the work
- * to be done in each pass).
- */
-
-#define JPEG_INTERNALS
-#include "jinclude.h"
-#include "jpeglib.h"
-
-
-/* Private state */
-
-typedef enum {
- main_pass, /* input data, also do first output step */
- huff_opt_pass, /* Huffman code optimization pass */
- output_pass /* data output pass */
-} c_pass_type;
-
-typedef struct {
- struct jpeg_comp_master pub; /* public fields */
-
- c_pass_type pass_type; /* the type of the current pass */
-
- int pass_number; /* # of passes completed */
- int total_passes; /* total # of passes needed */
-
- int scan_number; /* current index in scan_info[] */
-} my_comp_master;
-
-typedef my_comp_master * my_master_ptr;
-
-
-/*
- * Support routines that do various essential calculations.
- */
-
-LOCAL(void)
-initial_setup (j_compress_ptr cinfo)
-/* Do computations that are needed before master selection phase */
-{
- int ci;
- jpeg_component_info *compptr;
- long samplesperrow;
- JDIMENSION jd_samplesperrow;
-
- /* Sanity check on image dimensions */
- if (cinfo->image_height <= 0 || cinfo->image_width <= 0
- || cinfo->num_components <= 0 || cinfo->input_components <= 0)
- ERREXIT(cinfo, JERR_EMPTY_IMAGE);
-
- /* Make sure image isn't bigger than I can handle */
- if ((long) cinfo->image_height > (long) JPEG_MAX_DIMENSION ||
- (long) cinfo->image_width > (long) JPEG_MAX_DIMENSION)
- ERREXIT1(cinfo, JERR_IMAGE_TOO_BIG, (unsigned int) JPEG_MAX_DIMENSION);
-
- /* Width of an input scanline must be representable as JDIMENSION. */
- samplesperrow = (long) cinfo->image_width * (long) cinfo->input_components;
- jd_samplesperrow = (JDIMENSION) samplesperrow;
- if ((long) jd_samplesperrow != samplesperrow)
- ERREXIT(cinfo, JERR_WIDTH_OVERFLOW);
-
- /* For now, precision must match compiled-in value... */
- if (cinfo->data_precision != BITS_IN_JSAMPLE)
- ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
-
- /* Check that number of components won't exceed internal array sizes */
- if (cinfo->num_components > MAX_COMPONENTS)
- ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->num_components,
- MAX_COMPONENTS);
-
- /* Compute maximum sampling factors; check factor validity */
- cinfo->max_h_samp_factor = 1;
- cinfo->max_v_samp_factor = 1;
- for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
- ci++, compptr++) {
- if (compptr->h_samp_factor<=0 || compptr->h_samp_factor>MAX_SAMP_FACTOR ||
- compptr->v_samp_factor<=0 || compptr->v_samp_factor>MAX_SAMP_FACTOR)
- ERREXIT(cinfo, JERR_BAD_SAMPLING);
- cinfo->max_h_samp_factor = MAX(cinfo->max_h_samp_factor,
- compptr->h_samp_factor);
- cinfo->max_v_samp_factor = MAX(cinfo->max_v_samp_factor,
- compptr->v_samp_factor);
- }
-
- /* Compute dimensions of components */
- for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
- ci++, compptr++) {
- /* Fill in the correct component_index value; don't rely on application */
- compptr->component_index = ci;
- /* For compression, we never do DCT scaling. */
- compptr->DCT_scaled_size = DCTSIZE;
- /* Size in DCT blocks */
- compptr->width_in_blocks = (JDIMENSION)
- jdiv_round_up((long) cinfo->image_width * (long) compptr->h_samp_factor,
- (long) (cinfo->max_h_samp_factor * DCTSIZE));
- compptr->height_in_blocks = (JDIMENSION)
- jdiv_round_up((long) cinfo->image_height * (long) compptr->v_samp_factor,
- (long) (cinfo->max_v_samp_factor * DCTSIZE));
- /* Size in samples */
- compptr->downsampled_width = (JDIMENSION)
- jdiv_round_up((long) cinfo->image_width * (long) compptr->h_samp_factor,
- (long) cinfo->max_h_samp_factor);
- compptr->downsampled_height = (JDIMENSION)
- jdiv_round_up((long) cinfo->image_height * (long) compptr->v_samp_factor,
- (long) cinfo->max_v_samp_factor);
- /* Mark component needed (this flag isn't actually used for compression) */
- compptr->component_needed = TRUE;
- }
-
- /* Compute number of fully interleaved MCU rows (number of times that
- * main controller will call coefficient controller).
- */
- cinfo->total_iMCU_rows = (JDIMENSION)
- jdiv_round_up((long) cinfo->image_height,
- (long) (cinfo->max_v_samp_factor*DCTSIZE));
-}
-
-
-#ifdef C_MULTISCAN_FILES_SUPPORTED
-
-LOCAL(void)
-validate_script (j_compress_ptr cinfo)
-/* Verify that the scan script in cinfo->scan_info[] is valid; also
- * determine whether it uses progressive JPEG, and set cinfo->progressive_mode.
- */
-{
- const jpeg_scan_info * scanptr;
- int scanno, ncomps, ci, coefi, thisi;
- int Ss, Se, Ah, Al;
- boolean component_sent[MAX_COMPONENTS];
-#ifdef C_PROGRESSIVE_SUPPORTED
- int * last_bitpos_ptr;
- int last_bitpos[MAX_COMPONENTS][DCTSIZE2];
- /* -1 until that coefficient has been seen; then last Al for it */
-#endif
-
- if (cinfo->num_scans <= 0)
- ERREXIT1(cinfo, JERR_BAD_SCAN_SCRIPT, 0);
-
- /* For sequential JPEG, all scans must have Ss=0, Se=DCTSIZE2-1;
- * for progressive JPEG, no scan can have this.
- */
- scanptr = cinfo->scan_info;
- if (scanptr->Ss != 0 || scanptr->Se != DCTSIZE2-1) {
-#ifdef C_PROGRESSIVE_SUPPORTED
- cinfo->progressive_mode = TRUE;
- last_bitpos_ptr = & last_bitpos[0][0];
- for (ci = 0; ci < cinfo->num_components; ci++)
- for (coefi = 0; coefi < DCTSIZE2; coefi++)
- *last_bitpos_ptr++ = -1;
-#else
- ERREXIT(cinfo, JERR_NOT_COMPILED);
-#endif
- } else {
- cinfo->progressive_mode = FALSE;
- for (ci = 0; ci < cinfo->num_components; ci++)
- component_sent[ci] = FALSE;
- }
-
- for (scanno = 1; scanno <= cinfo->num_scans; scanptr++, scanno++) {
- /* Validate component indexes */
- ncomps = scanptr->comps_in_scan;
- if (ncomps <= 0 || ncomps > MAX_COMPS_IN_SCAN)
- ERREXIT2(cinfo, JERR_COMPONENT_COUNT, ncomps, MAX_COMPS_IN_SCAN);
- for (ci = 0; ci < ncomps; ci++) {
- thisi = scanptr->component_index[ci];
- if (thisi < 0 || thisi >= cinfo->num_components)
- ERREXIT1(cinfo, JERR_BAD_SCAN_SCRIPT, scanno);
- /* Components must appear in SOF order within each scan */
- if (ci > 0 && thisi <= scanptr->component_index[ci-1])
- ERREXIT1(cinfo, JERR_BAD_SCAN_SCRIPT, scanno);
- }
- /* Validate progression parameters */
- Ss = scanptr->Ss;
- Se = scanptr->Se;
- Ah = scanptr->Ah;
- Al = scanptr->Al;
- if (cinfo->progressive_mode) {
-#ifdef C_PROGRESSIVE_SUPPORTED
- /* The JPEG spec simply gives the ranges 0..13 for Ah and Al, but that
- * seems wrong: the upper bound ought to depend on data precision.
- * Perhaps they really meant 0..N+1 for N-bit precision.
- * Here we allow 0..10 for 8-bit data; Al larger than 10 results in
- * out-of-range reconstructed DC values during the first DC scan,
- * which might cause problems for some decoders.
- */
-#if BITS_IN_JSAMPLE == 8
-#define MAX_AH_AL 10
-#else
-#define MAX_AH_AL 13
-#endif
- if (Ss < 0 || Ss >= DCTSIZE2 || Se < Ss || Se >= DCTSIZE2 ||
- Ah < 0 || Ah > MAX_AH_AL || Al < 0 || Al > MAX_AH_AL)
- ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno);
- if (Ss == 0) {
- if (Se != 0) /* DC and AC together not OK */
- ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno);
- } else {
- if (ncomps != 1) /* AC scans must be for only one component */
- ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno);
- }
- for (ci = 0; ci < ncomps; ci++) {
- last_bitpos_ptr = & last_bitpos[scanptr->component_index[ci]][0];
- if (Ss != 0 && last_bitpos_ptr[0] < 0) /* AC without prior DC scan */
- ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno);
- for (coefi = Ss; coefi <= Se; coefi++) {
- if (last_bitpos_ptr[coefi] < 0) {
- /* first scan of this coefficient */
- if (Ah != 0)
- ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno);
- } else {
- /* not first scan */
- if (Ah != last_bitpos_ptr[coefi] || Al != Ah-1)
- ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno);
- }
- last_bitpos_ptr[coefi] = Al;
- }
- }
-#endif
- } else {
- /* For sequential JPEG, all progression parameters must be these: */
- if (Ss != 0 || Se != DCTSIZE2-1 || Ah != 0 || Al != 0)
- ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno);
- /* Make sure components are not sent twice */
- for (ci = 0; ci < ncomps; ci++) {
- thisi = scanptr->component_index[ci];
- if (component_sent[thisi])
- ERREXIT1(cinfo, JERR_BAD_SCAN_SCRIPT, scanno);
- component_sent[thisi] = TRUE;
- }
- }
- }
-
- /* Now verify that everything got sent. */
- if (cinfo->progressive_mode) {
-#ifdef C_PROGRESSIVE_SUPPORTED
- /* For progressive mode, we only check that at least some DC data
- * got sent for each component; the spec does not require that all bits
- * of all coefficients be transmitted. Would it be wiser to enforce
- * transmission of all coefficient bits??
- */
- for (ci = 0; ci < cinfo->num_components; ci++) {
- if (last_bitpos[ci][0] < 0)
- ERREXIT(cinfo, JERR_MISSING_DATA);
- }
-#endif
- } else {
- for (ci = 0; ci < cinfo->num_components; ci++) {
- if (! component_sent[ci])
- ERREXIT(cinfo, JERR_MISSING_DATA);
- }
- }
-}
-
-#endif /* C_MULTISCAN_FILES_SUPPORTED */
-
-
-LOCAL(void)
-select_scan_parameters (j_compress_ptr cinfo)
-/* Set up the scan parameters for the current scan */
-{
- int ci;
-
-#ifdef C_MULTISCAN_FILES_SUPPORTED
- if (cinfo->scan_info != NULL) {
- /* Prepare for current scan --- the script is already validated */
- my_master_ptr master = (my_master_ptr) cinfo->master;
- const jpeg_scan_info * scanptr = cinfo->scan_info + master->scan_number;
-
- cinfo->comps_in_scan = scanptr->comps_in_scan;
- for (ci = 0; ci < scanptr->comps_in_scan; ci++) {
- cinfo->cur_comp_info[ci] =
- &cinfo->comp_info[scanptr->component_index[ci]];
- }
- cinfo->Ss = scanptr->Ss;
- cinfo->Se = scanptr->Se;
- cinfo->Ah = scanptr->Ah;
- cinfo->Al = scanptr->Al;
- }
- else
-#endif
- {
- /* Prepare for single sequential-JPEG scan containing all components */
- if (cinfo->num_components > MAX_COMPS_IN_SCAN)
- ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->num_components,
- MAX_COMPS_IN_SCAN);
- cinfo->comps_in_scan = cinfo->num_components;
- for (ci = 0; ci < cinfo->num_components; ci++) {
- cinfo->cur_comp_info[ci] = &cinfo->comp_info[ci];
- }
- cinfo->Ss = 0;
- cinfo->Se = DCTSIZE2-1;
- cinfo->Ah = 0;
- cinfo->Al = 0;
- }
-}
-
-
-LOCAL(void)
-per_scan_setup (j_compress_ptr cinfo)
-/* Do computations that are needed before processing a JPEG scan */
-/* cinfo->comps_in_scan and cinfo->cur_comp_info[] are already set */
-{
- int ci, mcublks, tmp;
- jpeg_component_info *compptr;
-
- if (cinfo->comps_in_scan == 1) {
-
- /* Noninterleaved (single-component) scan */
- compptr = cinfo->cur_comp_info[0];
-
- /* Overall image size in MCUs */
- cinfo->MCUs_per_row = compptr->width_in_blocks;
- cinfo->MCU_rows_in_scan = compptr->height_in_blocks;
-
- /* For noninterleaved scan, always one block per MCU */
- compptr->MCU_width = 1;
- compptr->MCU_height = 1;
- compptr->MCU_blocks = 1;
- compptr->MCU_sample_width = DCTSIZE;
- compptr->last_col_width = 1;
- /* For noninterleaved scans, it is convenient to define last_row_height
- * as the number of block rows present in the last iMCU row.
- */
- tmp = (int) (compptr->height_in_blocks % compptr->v_samp_factor);
- if (tmp == 0) tmp = compptr->v_samp_factor;
- compptr->last_row_height = tmp;
-
- /* Prepare array describing MCU composition */
- cinfo->blocks_in_MCU = 1;
- cinfo->MCU_membership[0] = 0;
-
- } else {
-
- /* Interleaved (multi-component) scan */
- if (cinfo->comps_in_scan <= 0 || cinfo->comps_in_scan > MAX_COMPS_IN_SCAN)
- ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->comps_in_scan,
- MAX_COMPS_IN_SCAN);
-
- /* Overall image size in MCUs */
- cinfo->MCUs_per_row = (JDIMENSION)
- jdiv_round_up((long) cinfo->image_width,
- (long) (cinfo->max_h_samp_factor*DCTSIZE));
- cinfo->MCU_rows_in_scan = (JDIMENSION)
- jdiv_round_up((long) cinfo->image_height,
- (long) (cinfo->max_v_samp_factor*DCTSIZE));
-
- cinfo->blocks_in_MCU = 0;
-
- for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
- compptr = cinfo->cur_comp_info[ci];
- /* Sampling factors give # of blocks of component in each MCU */
- compptr->MCU_width = compptr->h_samp_factor;
- compptr->MCU_height = compptr->v_samp_factor;
- compptr->MCU_blocks = compptr->MCU_width * compptr->MCU_height;
- compptr->MCU_sample_width = compptr->MCU_width * DCTSIZE;
- /* Figure number of non-dummy blocks in last MCU column & row */
- tmp = (int) (compptr->width_in_blocks % compptr->MCU_width);
- if (tmp == 0) tmp = compptr->MCU_width;
- compptr->last_col_width = tmp;
- tmp = (int) (compptr->height_in_blocks % compptr->MCU_height);
- if (tmp == 0) tmp = compptr->MCU_height;
- compptr->last_row_height = tmp;
- /* Prepare array describing MCU composition */
- mcublks = compptr->MCU_blocks;
- if (cinfo->blocks_in_MCU + mcublks > C_MAX_BLOCKS_IN_MCU)
- ERREXIT(cinfo, JERR_BAD_MCU_SIZE);
- while (mcublks-- > 0) {
- cinfo->MCU_membership[cinfo->blocks_in_MCU++] = ci;
- }
- }
-
- }
-
- /* Convert restart specified in rows to actual MCU count. */
- /* Note that count must fit in 16 bits, so we provide limiting. */
- if (cinfo->restart_in_rows > 0) {
- long nominal = (long) cinfo->restart_in_rows * (long) cinfo->MCUs_per_row;
- cinfo->restart_interval = (unsigned int) MIN(nominal, 65535L);
- }
-}
-
-
-/*
- * Per-pass setup.
- * This is called at the beginning of each pass. We determine which modules
- * will be active during this pass and give them appropriate start_pass calls.
- * We also set is_last_pass to indicate whether any more passes will be
- * required.
- */
-
-METHODDEF(void)
-prepare_for_pass (j_compress_ptr cinfo)
-{
- my_master_ptr master = (my_master_ptr) cinfo->master;
-
- switch (master->pass_type) {
- case main_pass:
- /* Initial pass: will collect input data, and do either Huffman
- * optimization or data output for the first scan.
- */
- select_scan_parameters(cinfo);
- per_scan_setup(cinfo);
- if (! cinfo->raw_data_in) {
- (*cinfo->cconvert->start_pass) (cinfo);
- (*cinfo->downsample->start_pass) (cinfo);
- (*cinfo->prep->start_pass) (cinfo, JBUF_PASS_THRU);
- }
- (*cinfo->fdct->start_pass) (cinfo);
- (*cinfo->entropy->start_pass) (cinfo, cinfo->optimize_coding);
- (*cinfo->coef->start_pass) (cinfo,
- (master->total_passes > 1 ?
- JBUF_SAVE_AND_PASS : JBUF_PASS_THRU));
- (*cinfo->main->start_pass) (cinfo, JBUF_PASS_THRU);
- if (cinfo->optimize_coding) {
- /* No immediate data output; postpone writing frame/scan headers */
- master->pub.call_pass_startup = FALSE;
- } else {
- /* Will write frame/scan headers at first jpeg_write_scanlines call */
- master->pub.call_pass_startup = TRUE;
- }
- break;
-#ifdef ENTROPY_OPT_SUPPORTED
- case huff_opt_pass:
- /* Do Huffman optimization for a scan after the first one. */
- select_scan_parameters(cinfo);
- per_scan_setup(cinfo);
- if (cinfo->Ss != 0 || cinfo->Ah == 0 || cinfo->arith_code) {
- (*cinfo->entropy->start_pass) (cinfo, TRUE);
- (*cinfo->coef->start_pass) (cinfo, JBUF_CRANK_DEST);
- master->pub.call_pass_startup = FALSE;
- break;
- }
- /* Special case: Huffman DC refinement scans need no Huffman table
- * and therefore we can skip the optimization pass for them.
- */
- master->pass_type = output_pass;
- master->pass_number++;
- /*FALLTHROUGH*/
-#endif
- case output_pass:
- /* Do a data-output pass. */
- /* We need not repeat per-scan setup if prior optimization pass did it. */
- if (! cinfo->optimize_coding) {
- select_scan_parameters(cinfo);
- per_scan_setup(cinfo);
- }
- (*cinfo->entropy->start_pass) (cinfo, FALSE);
- (*cinfo->coef->start_pass) (cinfo, JBUF_CRANK_DEST);
- /* We emit frame/scan headers now */
- if (master->scan_number == 0)
- (*cinfo->marker->write_frame_header) (cinfo);
- (*cinfo->marker->write_scan_header) (cinfo);
- master->pub.call_pass_startup = FALSE;
- break;
- default:
- ERREXIT(cinfo, JERR_NOT_COMPILED);
- }
-
- master->pub.is_last_pass = (master->pass_number == master->total_passes-1);
-
- /* Set up progress monitor's pass info if present */
- if (cinfo->progress != NULL) {
- cinfo->progress->completed_passes = master->pass_number;
- cinfo->progress->total_passes = master->total_passes;
- }
-}
-
-
-/*
- * Special start-of-pass hook.
- * This is called by jpeg_write_scanlines if call_pass_startup is TRUE.
- * In single-pass processing, we need this hook because we don't want to
- * write frame/scan headers during jpeg_start_compress; we want to let the
- * application write COM markers etc. between jpeg_start_compress and the
- * jpeg_write_scanlines loop.
- * In multi-pass processing, this routine is not used.
- */
-
-METHODDEF(void)
-pass_startup (j_compress_ptr cinfo)
-{
- cinfo->master->call_pass_startup = FALSE; /* reset flag so call only once */
-
- (*cinfo->marker->write_frame_header) (cinfo);
- (*cinfo->marker->write_scan_header) (cinfo);
-}
-
-
-/*
- * Finish up at end of pass.
- */
-
-METHODDEF(void)
-finish_pass_master (j_compress_ptr cinfo)
-{
- my_master_ptr master = (my_master_ptr) cinfo->master;
-
- /* The entropy coder always needs an end-of-pass call,
- * either to analyze statistics or to flush its output buffer.
- */
- (*cinfo->entropy->finish_pass) (cinfo);
-
- /* Update state for next pass */
- switch (master->pass_type) {
- case main_pass:
- /* next pass is either output of scan 0 (after optimization)
- * or output of scan 1 (if no optimization).
- */
- master->pass_type = output_pass;
- if (! cinfo->optimize_coding)
- master->scan_number++;
- break;
- case huff_opt_pass:
- /* next pass is always output of current scan */
- master->pass_type = output_pass;
- break;
- case output_pass:
- /* next pass is either optimization or output of next scan */
- if (cinfo->optimize_coding)
- master->pass_type = huff_opt_pass;
- master->scan_number++;
- break;
- }
-
- master->pass_number++;
-}
-
-
-/*
- * Initialize master compression control.
- */
-
-GLOBAL(void)
-jinit_c_master_control (j_compress_ptr cinfo, boolean transcode_only)
-{
- my_master_ptr master;
-
- master = (my_master_ptr)
- (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
- SIZEOF(my_comp_master));
- cinfo->master = (struct jpeg_comp_master *) master;
- master->pub.prepare_for_pass = prepare_for_pass;
- master->pub.pass_startup = pass_startup;
- master->pub.finish_pass = finish_pass_master;
- master->pub.is_last_pass = FALSE;
-
- /* Validate parameters, determine derived values */
- initial_setup(cinfo);
-
- if (cinfo->scan_info != NULL) {
-#ifdef C_MULTISCAN_FILES_SUPPORTED
- validate_script(cinfo);
-#else
- ERREXIT(cinfo, JERR_NOT_COMPILED);
-#endif
- } else {
- cinfo->progressive_mode = FALSE;
- cinfo->num_scans = 1;
- }
-
- if (cinfo->progressive_mode) /* TEMPORARY HACK ??? */
- cinfo->optimize_coding = TRUE; /* assume default tables no good for progressive mode */
-
- /* Initialize my private state */
- if (transcode_only) {
- /* no main pass in transcoding */
- if (cinfo->optimize_coding)
- master->pass_type = huff_opt_pass;
- else
- master->pass_type = output_pass;
- } else {
- /* for normal compression, first pass is always this type: */
- master->pass_type = main_pass;
- }
- master->scan_number = 0;
- master->pass_number = 0;
- if (cinfo->optimize_coding)
- master->total_passes = cinfo->num_scans * 2;
- else
- master->total_passes = cinfo->num_scans;
-}
-
-#endif //_FX_JPEG_TURBO_
+#if !defined(_FX_JPEG_TURBO_)
+/*
+ * jcmaster.c
+ *
+ * Copyright (C) 1991-1997, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains master control logic for the JPEG compressor.
+ * These routines are concerned with parameter validation, initial setup,
+ * and inter-pass control (determining the number of passes and the work
+ * to be done in each pass).
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+
+
+/* Private state */
+
+typedef enum {
+ main_pass, /* input data, also do first output step */
+ huff_opt_pass, /* Huffman code optimization pass */
+ output_pass /* data output pass */
+} c_pass_type;
+
+typedef struct {
+ struct jpeg_comp_master pub; /* public fields */
+
+ c_pass_type pass_type; /* the type of the current pass */
+
+ int pass_number; /* # of passes completed */
+ int total_passes; /* total # of passes needed */
+
+ int scan_number; /* current index in scan_info[] */
+} my_comp_master;
+
+typedef my_comp_master * my_master_ptr;
+
+
+/*
+ * Support routines that do various essential calculations.
+ */
+
+LOCAL(void)
+initial_setup (j_compress_ptr cinfo)
+/* Do computations that are needed before master selection phase */
+{
+ int ci;
+ jpeg_component_info *compptr;
+ long samplesperrow;
+ JDIMENSION jd_samplesperrow;
+
+ /* Sanity check on image dimensions */
+ if (cinfo->image_height <= 0 || cinfo->image_width <= 0
+ || cinfo->num_components <= 0 || cinfo->input_components <= 0)
+ ERREXIT(cinfo, JERR_EMPTY_IMAGE);
+
+ /* Make sure image isn't bigger than I can handle */
+ if ((long) cinfo->image_height > (long) JPEG_MAX_DIMENSION ||
+ (long) cinfo->image_width > (long) JPEG_MAX_DIMENSION)
+ ERREXIT1(cinfo, JERR_IMAGE_TOO_BIG, (unsigned int) JPEG_MAX_DIMENSION);
+
+ /* Width of an input scanline must be representable as JDIMENSION. */
+ samplesperrow = (long) cinfo->image_width * (long) cinfo->input_components;
+ jd_samplesperrow = (JDIMENSION) samplesperrow;
+ if ((long) jd_samplesperrow != samplesperrow)
+ ERREXIT(cinfo, JERR_WIDTH_OVERFLOW);
+
+ /* For now, precision must match compiled-in value... */
+ if (cinfo->data_precision != BITS_IN_JSAMPLE)
+ ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
+
+ /* Check that number of components won't exceed internal array sizes */
+ if (cinfo->num_components > MAX_COMPONENTS)
+ ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->num_components,
+ MAX_COMPONENTS);
+
+ /* Compute maximum sampling factors; check factor validity */
+ cinfo->max_h_samp_factor = 1;
+ cinfo->max_v_samp_factor = 1;
+ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+ ci++, compptr++) {
+ if (compptr->h_samp_factor<=0 || compptr->h_samp_factor>MAX_SAMP_FACTOR ||
+ compptr->v_samp_factor<=0 || compptr->v_samp_factor>MAX_SAMP_FACTOR)
+ ERREXIT(cinfo, JERR_BAD_SAMPLING);
+ cinfo->max_h_samp_factor = MAX(cinfo->max_h_samp_factor,
+ compptr->h_samp_factor);
+ cinfo->max_v_samp_factor = MAX(cinfo->max_v_samp_factor,
+ compptr->v_samp_factor);
+ }
+
+ /* Compute dimensions of components */
+ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+ ci++, compptr++) {
+ /* Fill in the correct component_index value; don't rely on application */
+ compptr->component_index = ci;
+ /* For compression, we never do DCT scaling. */
+ compptr->DCT_scaled_size = DCTSIZE;
+ /* Size in DCT blocks */
+ compptr->width_in_blocks = (JDIMENSION)
+ jdiv_round_up((long) cinfo->image_width * (long) compptr->h_samp_factor,
+ (long) (cinfo->max_h_samp_factor * DCTSIZE));
+ compptr->height_in_blocks = (JDIMENSION)
+ jdiv_round_up((long) cinfo->image_height * (long) compptr->v_samp_factor,
+ (long) (cinfo->max_v_samp_factor * DCTSIZE));
+ /* Size in samples */
+ compptr->downsampled_width = (JDIMENSION)
+ jdiv_round_up((long) cinfo->image_width * (long) compptr->h_samp_factor,
+ (long) cinfo->max_h_samp_factor);
+ compptr->downsampled_height = (JDIMENSION)
+ jdiv_round_up((long) cinfo->image_height * (long) compptr->v_samp_factor,
+ (long) cinfo->max_v_samp_factor);
+ /* Mark component needed (this flag isn't actually used for compression) */
+ compptr->component_needed = TRUE;
+ }
+
+ /* Compute number of fully interleaved MCU rows (number of times that
+ * main controller will call coefficient controller).
+ */
+ cinfo->total_iMCU_rows = (JDIMENSION)
+ jdiv_round_up((long) cinfo->image_height,
+ (long) (cinfo->max_v_samp_factor*DCTSIZE));
+}
+
+
+#ifdef C_MULTISCAN_FILES_SUPPORTED
+
+LOCAL(void)
+validate_script (j_compress_ptr cinfo)
+/* Verify that the scan script in cinfo->scan_info[] is valid; also
+ * determine whether it uses progressive JPEG, and set cinfo->progressive_mode.
+ */
+{
+ const jpeg_scan_info * scanptr;
+ int scanno, ncomps, ci, coefi, thisi;
+ int Ss, Se, Ah, Al;
+ boolean component_sent[MAX_COMPONENTS];
+#ifdef C_PROGRESSIVE_SUPPORTED
+ int * last_bitpos_ptr;
+ int last_bitpos[MAX_COMPONENTS][DCTSIZE2];
+ /* -1 until that coefficient has been seen; then last Al for it */
+#endif
+
+ if (cinfo->num_scans <= 0)
+ ERREXIT1(cinfo, JERR_BAD_SCAN_SCRIPT, 0);
+
+ /* For sequential JPEG, all scans must have Ss=0, Se=DCTSIZE2-1;
+ * for progressive JPEG, no scan can have this.
+ */
+ scanptr = cinfo->scan_info;
+ if (scanptr->Ss != 0 || scanptr->Se != DCTSIZE2-1) {
+#ifdef C_PROGRESSIVE_SUPPORTED
+ cinfo->progressive_mode = TRUE;
+ last_bitpos_ptr = & last_bitpos[0][0];
+ for (ci = 0; ci < cinfo->num_components; ci++)
+ for (coefi = 0; coefi < DCTSIZE2; coefi++)
+ *last_bitpos_ptr++ = -1;
+#else
+ ERREXIT(cinfo, JERR_NOT_COMPILED);
+#endif
+ } else {
+ cinfo->progressive_mode = FALSE;
+ for (ci = 0; ci < cinfo->num_components; ci++)
+ component_sent[ci] = FALSE;
+ }
+
+ for (scanno = 1; scanno <= cinfo->num_scans; scanptr++, scanno++) {
+ /* Validate component indexes */
+ ncomps = scanptr->comps_in_scan;
+ if (ncomps <= 0 || ncomps > MAX_COMPS_IN_SCAN)
+ ERREXIT2(cinfo, JERR_COMPONENT_COUNT, ncomps, MAX_COMPS_IN_SCAN);
+ for (ci = 0; ci < ncomps; ci++) {
+ thisi = scanptr->component_index[ci];
+ if (thisi < 0 || thisi >= cinfo->num_components)
+ ERREXIT1(cinfo, JERR_BAD_SCAN_SCRIPT, scanno);
+ /* Components must appear in SOF order within each scan */
+ if (ci > 0 && thisi <= scanptr->component_index[ci-1])
+ ERREXIT1(cinfo, JERR_BAD_SCAN_SCRIPT, scanno);
+ }
+ /* Validate progression parameters */
+ Ss = scanptr->Ss;
+ Se = scanptr->Se;
+ Ah = scanptr->Ah;
+ Al = scanptr->Al;
+ if (cinfo->progressive_mode) {
+#ifdef C_PROGRESSIVE_SUPPORTED
+ /* The JPEG spec simply gives the ranges 0..13 for Ah and Al, but that
+ * seems wrong: the upper bound ought to depend on data precision.
+ * Perhaps they really meant 0..N+1 for N-bit precision.
+ * Here we allow 0..10 for 8-bit data; Al larger than 10 results in
+ * out-of-range reconstructed DC values during the first DC scan,
+ * which might cause problems for some decoders.
+ */
+#if BITS_IN_JSAMPLE == 8
+#define MAX_AH_AL 10
+#else
+#define MAX_AH_AL 13
+#endif
+ if (Ss < 0 || Ss >= DCTSIZE2 || Se < Ss || Se >= DCTSIZE2 ||
+ Ah < 0 || Ah > MAX_AH_AL || Al < 0 || Al > MAX_AH_AL)
+ ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno);
+ if (Ss == 0) {
+ if (Se != 0) /* DC and AC together not OK */
+ ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno);
+ } else {
+ if (ncomps != 1) /* AC scans must be for only one component */
+ ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno);
+ }
+ for (ci = 0; ci < ncomps; ci++) {
+ last_bitpos_ptr = & last_bitpos[scanptr->component_index[ci]][0];
+ if (Ss != 0 && last_bitpos_ptr[0] < 0) /* AC without prior DC scan */
+ ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno);
+ for (coefi = Ss; coefi <= Se; coefi++) {
+ if (last_bitpos_ptr[coefi] < 0) {
+ /* first scan of this coefficient */
+ if (Ah != 0)
+ ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno);
+ } else {
+ /* not first scan */
+ if (Ah != last_bitpos_ptr[coefi] || Al != Ah-1)
+ ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno);
+ }
+ last_bitpos_ptr[coefi] = Al;
+ }
+ }
+#endif
+ } else {
+ /* For sequential JPEG, all progression parameters must be these: */
+ if (Ss != 0 || Se != DCTSIZE2-1 || Ah != 0 || Al != 0)
+ ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno);
+ /* Make sure components are not sent twice */
+ for (ci = 0; ci < ncomps; ci++) {
+ thisi = scanptr->component_index[ci];
+ if (component_sent[thisi])
+ ERREXIT1(cinfo, JERR_BAD_SCAN_SCRIPT, scanno);
+ component_sent[thisi] = TRUE;
+ }
+ }
+ }
+
+ /* Now verify that everything got sent. */
+ if (cinfo->progressive_mode) {
+#ifdef C_PROGRESSIVE_SUPPORTED
+ /* For progressive mode, we only check that at least some DC data
+ * got sent for each component; the spec does not require that all bits
+ * of all coefficients be transmitted. Would it be wiser to enforce
+ * transmission of all coefficient bits??
+ */
+ for (ci = 0; ci < cinfo->num_components; ci++) {
+ if (last_bitpos[ci][0] < 0)
+ ERREXIT(cinfo, JERR_MISSING_DATA);
+ }
+#endif
+ } else {
+ for (ci = 0; ci < cinfo->num_components; ci++) {
+ if (! component_sent[ci])
+ ERREXIT(cinfo, JERR_MISSING_DATA);
+ }
+ }
+}
+
+#endif /* C_MULTISCAN_FILES_SUPPORTED */
+
+
+LOCAL(void)
+select_scan_parameters (j_compress_ptr cinfo)
+/* Set up the scan parameters for the current scan */
+{
+ int ci;
+
+#ifdef C_MULTISCAN_FILES_SUPPORTED
+ if (cinfo->scan_info != NULL) {
+ /* Prepare for current scan --- the script is already validated */
+ my_master_ptr master = (my_master_ptr) cinfo->master;
+ const jpeg_scan_info * scanptr = cinfo->scan_info + master->scan_number;
+
+ cinfo->comps_in_scan = scanptr->comps_in_scan;
+ for (ci = 0; ci < scanptr->comps_in_scan; ci++) {
+ cinfo->cur_comp_info[ci] =
+ &cinfo->comp_info[scanptr->component_index[ci]];
+ }
+ cinfo->Ss = scanptr->Ss;
+ cinfo->Se = scanptr->Se;
+ cinfo->Ah = scanptr->Ah;
+ cinfo->Al = scanptr->Al;
+ }
+ else
+#endif
+ {
+ /* Prepare for single sequential-JPEG scan containing all components */
+ if (cinfo->num_components > MAX_COMPS_IN_SCAN)
+ ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->num_components,
+ MAX_COMPS_IN_SCAN);
+ cinfo->comps_in_scan = cinfo->num_components;
+ for (ci = 0; ci < cinfo->num_components; ci++) {
+ cinfo->cur_comp_info[ci] = &cinfo->comp_info[ci];
+ }
+ cinfo->Ss = 0;
+ cinfo->Se = DCTSIZE2-1;
+ cinfo->Ah = 0;
+ cinfo->Al = 0;
+ }
+}
+
+
+LOCAL(void)
+per_scan_setup (j_compress_ptr cinfo)
+/* Do computations that are needed before processing a JPEG scan */
+/* cinfo->comps_in_scan and cinfo->cur_comp_info[] are already set */
+{
+ int ci, mcublks, tmp;
+ jpeg_component_info *compptr;
+
+ if (cinfo->comps_in_scan == 1) {
+
+ /* Noninterleaved (single-component) scan */
+ compptr = cinfo->cur_comp_info[0];
+
+ /* Overall image size in MCUs */
+ cinfo->MCUs_per_row = compptr->width_in_blocks;
+ cinfo->MCU_rows_in_scan = compptr->height_in_blocks;
+
+ /* For noninterleaved scan, always one block per MCU */
+ compptr->MCU_width = 1;
+ compptr->MCU_height = 1;
+ compptr->MCU_blocks = 1;
+ compptr->MCU_sample_width = DCTSIZE;
+ compptr->last_col_width = 1;
+ /* For noninterleaved scans, it is convenient to define last_row_height
+ * as the number of block rows present in the last iMCU row.
+ */
+ tmp = (int) (compptr->height_in_blocks % compptr->v_samp_factor);
+ if (tmp == 0) tmp = compptr->v_samp_factor;
+ compptr->last_row_height = tmp;
+
+ /* Prepare array describing MCU composition */
+ cinfo->blocks_in_MCU = 1;
+ cinfo->MCU_membership[0] = 0;
+
+ } else {
+
+ /* Interleaved (multi-component) scan */
+ if (cinfo->comps_in_scan <= 0 || cinfo->comps_in_scan > MAX_COMPS_IN_SCAN)
+ ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->comps_in_scan,
+ MAX_COMPS_IN_SCAN);
+
+ /* Overall image size in MCUs */
+ cinfo->MCUs_per_row = (JDIMENSION)
+ jdiv_round_up((long) cinfo->image_width,
+ (long) (cinfo->max_h_samp_factor*DCTSIZE));
+ cinfo->MCU_rows_in_scan = (JDIMENSION)
+ jdiv_round_up((long) cinfo->image_height,
+ (long) (cinfo->max_v_samp_factor*DCTSIZE));
+
+ cinfo->blocks_in_MCU = 0;
+
+ for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
+ compptr = cinfo->cur_comp_info[ci];
+ /* Sampling factors give # of blocks of component in each MCU */
+ compptr->MCU_width = compptr->h_samp_factor;
+ compptr->MCU_height = compptr->v_samp_factor;
+ compptr->MCU_blocks = compptr->MCU_width * compptr->MCU_height;
+ compptr->MCU_sample_width = compptr->MCU_width * DCTSIZE;
+ /* Figure number of non-dummy blocks in last MCU column & row */
+ tmp = (int) (compptr->width_in_blocks % compptr->MCU_width);
+ if (tmp == 0) tmp = compptr->MCU_width;
+ compptr->last_col_width = tmp;
+ tmp = (int) (compptr->height_in_blocks % compptr->MCU_height);
+ if (tmp == 0) tmp = compptr->MCU_height;
+ compptr->last_row_height = tmp;
+ /* Prepare array describing MCU composition */
+ mcublks = compptr->MCU_blocks;
+ if (cinfo->blocks_in_MCU + mcublks > C_MAX_BLOCKS_IN_MCU)
+ ERREXIT(cinfo, JERR_BAD_MCU_SIZE);
+ while (mcublks-- > 0) {
+ cinfo->MCU_membership[cinfo->blocks_in_MCU++] = ci;
+ }
+ }
+
+ }
+
+ /* Convert restart specified in rows to actual MCU count. */
+ /* Note that count must fit in 16 bits, so we provide limiting. */
+ if (cinfo->restart_in_rows > 0) {
+ long nominal = (long) cinfo->restart_in_rows * (long) cinfo->MCUs_per_row;
+ cinfo->restart_interval = (unsigned int) MIN(nominal, 65535L);
+ }
+}
+
+
+/*
+ * Per-pass setup.
+ * This is called at the beginning of each pass. We determine which modules
+ * will be active during this pass and give them appropriate start_pass calls.
+ * We also set is_last_pass to indicate whether any more passes will be
+ * required.
+ */
+
+METHODDEF(void)
+prepare_for_pass (j_compress_ptr cinfo)
+{
+ my_master_ptr master = (my_master_ptr) cinfo->master;
+
+ switch (master->pass_type) {
+ case main_pass:
+ /* Initial pass: will collect input data, and do either Huffman
+ * optimization or data output for the first scan.
+ */
+ select_scan_parameters(cinfo);
+ per_scan_setup(cinfo);
+ if (! cinfo->raw_data_in) {
+ (*cinfo->cconvert->start_pass) (cinfo);
+ (*cinfo->downsample->start_pass) (cinfo);
+ (*cinfo->prep->start_pass) (cinfo, JBUF_PASS_THRU);
+ }
+ (*cinfo->fdct->start_pass) (cinfo);
+ (*cinfo->entropy->start_pass) (cinfo, cinfo->optimize_coding);
+ (*cinfo->coef->start_pass) (cinfo,
+ (master->total_passes > 1 ?
+ JBUF_SAVE_AND_PASS : JBUF_PASS_THRU));
+ (*cinfo->main->start_pass) (cinfo, JBUF_PASS_THRU);
+ if (cinfo->optimize_coding) {
+ /* No immediate data output; postpone writing frame/scan headers */
+ master->pub.call_pass_startup = FALSE;
+ } else {
+ /* Will write frame/scan headers at first jpeg_write_scanlines call */
+ master->pub.call_pass_startup = TRUE;
+ }
+ break;
+#ifdef ENTROPY_OPT_SUPPORTED
+ case huff_opt_pass:
+ /* Do Huffman optimization for a scan after the first one. */
+ select_scan_parameters(cinfo);
+ per_scan_setup(cinfo);
+ if (cinfo->Ss != 0 || cinfo->Ah == 0 || cinfo->arith_code) {
+ (*cinfo->entropy->start_pass) (cinfo, TRUE);
+ (*cinfo->coef->start_pass) (cinfo, JBUF_CRANK_DEST);
+ master->pub.call_pass_startup = FALSE;
+ break;
+ }
+ /* Special case: Huffman DC refinement scans need no Huffman table
+ * and therefore we can skip the optimization pass for them.
+ */
+ master->pass_type = output_pass;
+ master->pass_number++;
+ /*FALLTHROUGH*/
+#endif
+ case output_pass:
+ /* Do a data-output pass. */
+ /* We need not repeat per-scan setup if prior optimization pass did it. */
+ if (! cinfo->optimize_coding) {
+ select_scan_parameters(cinfo);
+ per_scan_setup(cinfo);
+ }
+ (*cinfo->entropy->start_pass) (cinfo, FALSE);
+ (*cinfo->coef->start_pass) (cinfo, JBUF_CRANK_DEST);
+ /* We emit frame/scan headers now */
+ if (master->scan_number == 0)
+ (*cinfo->marker->write_frame_header) (cinfo);
+ (*cinfo->marker->write_scan_header) (cinfo);
+ master->pub.call_pass_startup = FALSE;
+ break;
+ default:
+ ERREXIT(cinfo, JERR_NOT_COMPILED);
+ }
+
+ master->pub.is_last_pass = (master->pass_number == master->total_passes-1);
+
+ /* Set up progress monitor's pass info if present */
+ if (cinfo->progress != NULL) {
+ cinfo->progress->completed_passes = master->pass_number;
+ cinfo->progress->total_passes = master->total_passes;
+ }
+}
+
+
+/*
+ * Special start-of-pass hook.
+ * This is called by jpeg_write_scanlines if call_pass_startup is TRUE.
+ * In single-pass processing, we need this hook because we don't want to
+ * write frame/scan headers during jpeg_start_compress; we want to let the
+ * application write COM markers etc. between jpeg_start_compress and the
+ * jpeg_write_scanlines loop.
+ * In multi-pass processing, this routine is not used.
+ */
+
+METHODDEF(void)
+pass_startup (j_compress_ptr cinfo)
+{
+ cinfo->master->call_pass_startup = FALSE; /* reset flag so call only once */
+
+ (*cinfo->marker->write_frame_header) (cinfo);
+ (*cinfo->marker->write_scan_header) (cinfo);
+}
+
+
+/*
+ * Finish up at end of pass.
+ */
+
+METHODDEF(void)
+finish_pass_master (j_compress_ptr cinfo)
+{
+ my_master_ptr master = (my_master_ptr) cinfo->master;
+
+ /* The entropy coder always needs an end-of-pass call,
+ * either to analyze statistics or to flush its output buffer.
+ */
+ (*cinfo->entropy->finish_pass) (cinfo);
+
+ /* Update state for next pass */
+ switch (master->pass_type) {
+ case main_pass:
+ /* next pass is either output of scan 0 (after optimization)
+ * or output of scan 1 (if no optimization).
+ */
+ master->pass_type = output_pass;
+ if (! cinfo->optimize_coding)
+ master->scan_number++;
+ break;
+ case huff_opt_pass:
+ /* next pass is always output of current scan */
+ master->pass_type = output_pass;
+ break;
+ case output_pass:
+ /* next pass is either optimization or output of next scan */
+ if (cinfo->optimize_coding)
+ master->pass_type = huff_opt_pass;
+ master->scan_number++;
+ break;
+ }
+
+ master->pass_number++;
+}
+
+
+/*
+ * Initialize master compression control.
+ */
+
+GLOBAL(void)
+jinit_c_master_control (j_compress_ptr cinfo, boolean transcode_only)
+{
+ my_master_ptr master;
+
+ master = (my_master_ptr)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ SIZEOF(my_comp_master));
+ cinfo->master = (struct jpeg_comp_master *) master;
+ master->pub.prepare_for_pass = prepare_for_pass;
+ master->pub.pass_startup = pass_startup;
+ master->pub.finish_pass = finish_pass_master;
+ master->pub.is_last_pass = FALSE;
+
+ /* Validate parameters, determine derived values */
+ initial_setup(cinfo);
+
+ if (cinfo->scan_info != NULL) {
+#ifdef C_MULTISCAN_FILES_SUPPORTED
+ validate_script(cinfo);
+#else
+ ERREXIT(cinfo, JERR_NOT_COMPILED);
+#endif
+ } else {
+ cinfo->progressive_mode = FALSE;
+ cinfo->num_scans = 1;
+ }
+
+ if (cinfo->progressive_mode) /* TEMPORARY HACK ??? */
+ cinfo->optimize_coding = TRUE; /* assume default tables no good for progressive mode */
+
+ /* Initialize my private state */
+ if (transcode_only) {
+ /* no main pass in transcoding */
+ if (cinfo->optimize_coding)
+ master->pass_type = huff_opt_pass;
+ else
+ master->pass_type = output_pass;
+ } else {
+ /* for normal compression, first pass is always this type: */
+ master->pass_type = main_pass;
+ }
+ master->scan_number = 0;
+ master->pass_number = 0;
+ if (cinfo->optimize_coding)
+ master->total_passes = cinfo->num_scans * 2;
+ else
+ master->total_passes = cinfo->num_scans;
+}
+
+#endif //_FX_JPEG_TURBO_
diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jcomapi.c b/core/src/fxcodec/libjpeg/fpdfapi_jcomapi.c
index 964909ac4e..aad37d8879 100644
--- a/core/src/fxcodec/libjpeg/fpdfapi_jcomapi.c
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jcomapi.c
@@ -1,109 +1,109 @@
-#if !defined(_FX_JPEG_TURBO_)
-/*
- * jcomapi.c
- *
- * Copyright (C) 1994-1997, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains application interface routines that are used for both
- * compression and decompression.
- */
-
-#define JPEG_INTERNALS
-#include "jinclude.h"
-#include "jpeglib.h"
-
-
-/*
- * Abort processing of a JPEG compression or decompression operation,
- * but don't destroy the object itself.
- *
- * For this, we merely clean up all the nonpermanent memory pools.
- * Note that temp files (virtual arrays) are not allowed to belong to
- * the permanent pool, so we will be able to close all temp files here.
- * Closing a data source or destination, if necessary, is the application's
- * responsibility.
- */
-
-GLOBAL(void)
-jpeg_abort (j_common_ptr cinfo)
-{
- int pool;
-
- /* Do nothing if called on a not-initialized or destroyed JPEG object. */
- if (cinfo->mem == NULL)
- return;
-
- /* Releasing pools in reverse order might help avoid fragmentation
- * with some (brain-damaged) malloc libraries.
- */
- for (pool = JPOOL_NUMPOOLS-1; pool > JPOOL_PERMANENT; pool--) {
- (*cinfo->mem->free_pool) (cinfo, pool);
- }
-
- /* Reset overall state for possible reuse of object */
- if (cinfo->is_decompressor) {
- cinfo->global_state = DSTATE_START;
- /* Try to keep application from accessing now-deleted marker list.
- * A bit kludgy to do it here, but this is the most central place.
- */
- ((j_decompress_ptr) cinfo)->marker_list = NULL;
- } else {
- cinfo->global_state = CSTATE_START;
- }
-}
-
-
-/*
- * Destruction of a JPEG object.
- *
- * Everything gets deallocated except the master jpeg_compress_struct itself
- * and the error manager struct. Both of these are supplied by the application
- * and must be freed, if necessary, by the application. (Often they are on
- * the stack and so don't need to be freed anyway.)
- * Closing a data source or destination, if necessary, is the application's
- * responsibility.
- */
-
-GLOBAL(void)
-jpeg_destroy (j_common_ptr cinfo)
-{
- /* We need only tell the memory manager to release everything. */
- /* NB: mem pointer is NULL if memory mgr failed to initialize. */
- if (cinfo->mem != NULL)
- (*cinfo->mem->self_destruct) (cinfo);
- cinfo->mem = NULL; /* be safe if jpeg_destroy is called twice */
- cinfo->global_state = 0; /* mark it destroyed */
-}
-
-
-/*
- * Convenience routines for allocating quantization and Huffman tables.
- * (Would jutils.c be a more reasonable place to put these?)
- */
-
-GLOBAL(JQUANT_TBL *)
-jpeg_alloc_quant_table (j_common_ptr cinfo)
-{
- JQUANT_TBL *tbl;
-
- tbl = (JQUANT_TBL *)
- (*cinfo->mem->alloc_small) (cinfo, JPOOL_PERMANENT, SIZEOF(JQUANT_TBL));
- tbl->sent_table = FALSE; /* make sure this is false in any new table */
- return tbl;
-}
-
-
-GLOBAL(JHUFF_TBL *)
-jpeg_alloc_huff_table (j_common_ptr cinfo)
-{
- JHUFF_TBL *tbl;
-
- tbl = (JHUFF_TBL *)
- (*cinfo->mem->alloc_small) (cinfo, JPOOL_PERMANENT, SIZEOF(JHUFF_TBL));
- tbl->sent_table = FALSE; /* make sure this is false in any new table */
- return tbl;
-}
-
-#endif //_FX_JPEG_TURBO_
+#if !defined(_FX_JPEG_TURBO_)
+/*
+ * jcomapi.c
+ *
+ * Copyright (C) 1994-1997, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains application interface routines that are used for both
+ * compression and decompression.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+
+
+/*
+ * Abort processing of a JPEG compression or decompression operation,
+ * but don't destroy the object itself.
+ *
+ * For this, we merely clean up all the nonpermanent memory pools.
+ * Note that temp files (virtual arrays) are not allowed to belong to
+ * the permanent pool, so we will be able to close all temp files here.
+ * Closing a data source or destination, if necessary, is the application's
+ * responsibility.
+ */
+
+GLOBAL(void)
+jpeg_abort (j_common_ptr cinfo)
+{
+ int pool;
+
+ /* Do nothing if called on a not-initialized or destroyed JPEG object. */
+ if (cinfo->mem == NULL)
+ return;
+
+ /* Releasing pools in reverse order might help avoid fragmentation
+ * with some (brain-damaged) malloc libraries.
+ */
+ for (pool = JPOOL_NUMPOOLS-1; pool > JPOOL_PERMANENT; pool--) {
+ (*cinfo->mem->free_pool) (cinfo, pool);
+ }
+
+ /* Reset overall state for possible reuse of object */
+ if (cinfo->is_decompressor) {
+ cinfo->global_state = DSTATE_START;
+ /* Try to keep application from accessing now-deleted marker list.
+ * A bit kludgy to do it here, but this is the most central place.
+ */
+ ((j_decompress_ptr) cinfo)->marker_list = NULL;
+ } else {
+ cinfo->global_state = CSTATE_START;
+ }
+}
+
+
+/*
+ * Destruction of a JPEG object.
+ *
+ * Everything gets deallocated except the master jpeg_compress_struct itself
+ * and the error manager struct. Both of these are supplied by the application
+ * and must be freed, if necessary, by the application. (Often they are on
+ * the stack and so don't need to be freed anyway.)
+ * Closing a data source or destination, if necessary, is the application's
+ * responsibility.
+ */
+
+GLOBAL(void)
+jpeg_destroy (j_common_ptr cinfo)
+{
+ /* We need only tell the memory manager to release everything. */
+ /* NB: mem pointer is NULL if memory mgr failed to initialize. */
+ if (cinfo->mem != NULL)
+ (*cinfo->mem->self_destruct) (cinfo);
+ cinfo->mem = NULL; /* be safe if jpeg_destroy is called twice */
+ cinfo->global_state = 0; /* mark it destroyed */
+}
+
+
+/*
+ * Convenience routines for allocating quantization and Huffman tables.
+ * (Would jutils.c be a more reasonable place to put these?)
+ */
+
+GLOBAL(JQUANT_TBL *)
+jpeg_alloc_quant_table (j_common_ptr cinfo)
+{
+ JQUANT_TBL *tbl;
+
+ tbl = (JQUANT_TBL *)
+ (*cinfo->mem->alloc_small) (cinfo, JPOOL_PERMANENT, SIZEOF(JQUANT_TBL));
+ tbl->sent_table = FALSE; /* make sure this is false in any new table */
+ return tbl;
+}
+
+
+GLOBAL(JHUFF_TBL *)
+jpeg_alloc_huff_table (j_common_ptr cinfo)
+{
+ JHUFF_TBL *tbl;
+
+ tbl = (JHUFF_TBL *)
+ (*cinfo->mem->alloc_small) (cinfo, JPOOL_PERMANENT, SIZEOF(JHUFF_TBL));
+ tbl->sent_table = FALSE; /* make sure this is false in any new table */
+ return tbl;
+}
+
+#endif //_FX_JPEG_TURBO_
diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jcparam.c b/core/src/fxcodec/libjpeg/fpdfapi_jcparam.c
index 8b1b9b9fb6..f3ea109878 100644
--- a/core/src/fxcodec/libjpeg/fpdfapi_jcparam.c
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jcparam.c
@@ -1,613 +1,613 @@
-#if !defined(_FX_JPEG_TURBO_)
-/*
- * jcparam.c
- *
- * Copyright (C) 1991-1998, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains optional default-setting code for the JPEG compressor.
- * Applications do not have to use this file, but those that don't use it
- * must know a lot more about the innards of the JPEG code.
- */
-
-#define JPEG_INTERNALS
-#include "jinclude.h"
-#include "jpeglib.h"
-
-
-/*
- * Quantization table setup routines
- */
-
-GLOBAL(void)
-jpeg_add_quant_table (j_compress_ptr cinfo, int which_tbl,
- const unsigned int *basic_table,
- int scale_factor, boolean force_baseline)
-/* Define a quantization table equal to the basic_table times
- * a scale factor (given as a percentage).
- * If force_baseline is TRUE, the computed quantization table entries
- * are limited to 1..255 for JPEG baseline compatibility.
- */
-{
- JQUANT_TBL ** qtblptr;
- int i;
- long temp;
-
- /* Safety check to ensure start_compress not called yet. */
- if (cinfo->global_state != CSTATE_START)
- ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
-
- if (which_tbl < 0 || which_tbl >= NUM_QUANT_TBLS)
- ERREXIT1(cinfo, JERR_DQT_INDEX, which_tbl);
-
- qtblptr = & cinfo->quant_tbl_ptrs[which_tbl];
-
- if (*qtblptr == NULL)
- *qtblptr = jpeg_alloc_quant_table((j_common_ptr) cinfo);
-
- for (i = 0; i < DCTSIZE2; i++) {
- temp = ((long) basic_table[i] * scale_factor + 50L) / 100L;
- /* limit the values to the valid range */
- if (temp <= 0L) temp = 1L;
- if (temp > 32767L) temp = 32767L; /* max quantizer needed for 12 bits */
- if (force_baseline && temp > 255L)
- temp = 255L; /* limit to baseline range if requested */
- (*qtblptr)->quantval[i] = (UINT16) temp;
- }
-
- /* Initialize sent_table FALSE so table will be written to JPEG file. */
- (*qtblptr)->sent_table = FALSE;
-}
-
-
-GLOBAL(void)
-jpeg_set_linear_quality (j_compress_ptr cinfo, int scale_factor,
- boolean force_baseline)
-/* Set or change the 'quality' (quantization) setting, using default tables
- * and a straight percentage-scaling quality scale. In most cases it's better
- * to use jpeg_set_quality (below); this entry point is provided for
- * applications that insist on a linear percentage scaling.
- */
-{
- /* These are the sample quantization tables given in JPEG spec section K.1.
- * The spec says that the values given produce "good" quality, and
- * when divided by 2, "very good" quality.
- */
- static const unsigned int std_luminance_quant_tbl[DCTSIZE2] = {
- 16, 11, 10, 16, 24, 40, 51, 61,
- 12, 12, 14, 19, 26, 58, 60, 55,
- 14, 13, 16, 24, 40, 57, 69, 56,
- 14, 17, 22, 29, 51, 87, 80, 62,
- 18, 22, 37, 56, 68, 109, 103, 77,
- 24, 35, 55, 64, 81, 104, 113, 92,
- 49, 64, 78, 87, 103, 121, 120, 101,
- 72, 92, 95, 98, 112, 100, 103, 99
- };
- static const unsigned int std_chrominance_quant_tbl[DCTSIZE2] = {
- 17, 18, 24, 47, 99, 99, 99, 99,
- 18, 21, 26, 66, 99, 99, 99, 99,
- 24, 26, 56, 99, 99, 99, 99, 99,
- 47, 66, 99, 99, 99, 99, 99, 99,
- 99, 99, 99, 99, 99, 99, 99, 99,
- 99, 99, 99, 99, 99, 99, 99, 99,
- 99, 99, 99, 99, 99, 99, 99, 99,
- 99, 99, 99, 99, 99, 99, 99, 99
- };
-
- /* Set up two quantization tables using the specified scaling */
- jpeg_add_quant_table(cinfo, 0, std_luminance_quant_tbl,
- scale_factor, force_baseline);
- jpeg_add_quant_table(cinfo, 1, std_chrominance_quant_tbl,
- scale_factor, force_baseline);
-}
-
-
-GLOBAL(int)
-jpeg_quality_scaling (int quality)
-/* Convert a user-specified quality rating to a percentage scaling factor
- * for an underlying quantization table, using our recommended scaling curve.
- * The input 'quality' factor should be 0 (terrible) to 100 (very good).
- */
-{
- /* Safety limit on quality factor. Convert 0 to 1 to avoid zero divide. */
- if (quality <= 0) quality = 1;
- if (quality > 100) quality = 100;
-
- /* The basic table is used as-is (scaling 100) for a quality of 50.
- * Qualities 50..100 are converted to scaling percentage 200 - 2*Q;
- * note that at Q=100 the scaling is 0, which will cause jpeg_add_quant_table
- * to make all the table entries 1 (hence, minimum quantization loss).
- * Qualities 1..50 are converted to scaling percentage 5000/Q.
- */
- if (quality < 50)
- quality = 5000 / quality;
- else
- quality = 200 - quality*2;
-
- return quality;
-}
-
-
-GLOBAL(void)
-jpeg_set_quality (j_compress_ptr cinfo, int quality, boolean force_baseline)
-/* Set or change the 'quality' (quantization) setting, using default tables.
- * This is the standard quality-adjusting entry point for typical user
- * interfaces; only those who want detailed control over quantization tables
- * would use the preceding three routines directly.
- */
-{
- /* Convert user 0-100 rating to percentage scaling */
- quality = jpeg_quality_scaling(quality);
-
- /* Set up standard quality tables */
- jpeg_set_linear_quality(cinfo, quality, force_baseline);
-}
-
-
-/*
- * Huffman table setup routines
- */
-
-LOCAL(void)
-add_huff_table (j_compress_ptr cinfo,
- JHUFF_TBL **htblptr, const UINT8 *bits, const UINT8 *val)
-/* Define a Huffman table */
-{
- int nsymbols, len;
-
- if (*htblptr == NULL)
- *htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo);
-
- /* Copy the number-of-symbols-of-each-code-length counts */
- MEMCOPY((*htblptr)->bits, bits, SIZEOF((*htblptr)->bits));
-
- /* Validate the counts. We do this here mainly so we can copy the right
- * number of symbols from the val[] array, without risking marching off
- * the end of memory. jchuff.c will do a more thorough test later.
- */
- nsymbols = 0;
- for (len = 1; len <= 16; len++)
- nsymbols += bits[len];
- if (nsymbols < 1 || nsymbols > 256)
- ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
-
- MEMCOPY((*htblptr)->huffval, val, nsymbols * SIZEOF(UINT8));
-
- /* Initialize sent_table FALSE so table will be written to JPEG file. */
- (*htblptr)->sent_table = FALSE;
-}
-
-
-LOCAL(void)
-std_huff_tables (j_compress_ptr cinfo)
-/* Set up the standard Huffman tables (cf. JPEG standard section K.3) */
-/* IMPORTANT: these are only valid for 8-bit data precision! */
-{
- static const UINT8 bits_dc_luminance[17] =
- { /* 0-base */ 0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 };
- static const UINT8 val_dc_luminance[] =
- { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
-
- static const UINT8 bits_dc_chrominance[17] =
- { /* 0-base */ 0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 };
- static const UINT8 val_dc_chrominance[] =
- { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
-
- static const UINT8 bits_ac_luminance[17] =
- { /* 0-base */ 0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d };
- static const UINT8 val_ac_luminance[] =
- { 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12,
- 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07,
- 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08,
- 0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0,
- 0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16,
- 0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28,
- 0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
- 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,
- 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,
- 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
- 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,
- 0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,
- 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98,
- 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
- 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6,
- 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5,
- 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4,
- 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2,
- 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea,
- 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
- 0xf9, 0xfa };
-
- static const UINT8 bits_ac_chrominance[17] =
- { /* 0-base */ 0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77 };
- static const UINT8 val_ac_chrominance[] =
- { 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21,
- 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71,
- 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91,
- 0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0,
- 0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34,
- 0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26,
- 0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38,
- 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48,
- 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,
- 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68,
- 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
- 0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
- 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96,
- 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5,
- 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4,
- 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3,
- 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2,
- 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda,
- 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9,
- 0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
- 0xf9, 0xfa };
-
- add_huff_table(cinfo, &cinfo->dc_huff_tbl_ptrs[0],
- bits_dc_luminance, val_dc_luminance);
- add_huff_table(cinfo, &cinfo->ac_huff_tbl_ptrs[0],
- bits_ac_luminance, val_ac_luminance);
- add_huff_table(cinfo, &cinfo->dc_huff_tbl_ptrs[1],
- bits_dc_chrominance, val_dc_chrominance);
- add_huff_table(cinfo, &cinfo->ac_huff_tbl_ptrs[1],
- bits_ac_chrominance, val_ac_chrominance);
-}
-
-
-/*
- * Default parameter setup for compression.
- *
- * Applications that don't choose to use this routine must do their
- * own setup of all these parameters. Alternately, you can call this
- * to establish defaults and then alter parameters selectively. This
- * is the recommended approach since, if we add any new parameters,
- * your code will still work (they'll be set to reasonable defaults).
- */
-
-GLOBAL(void)
-jpeg_set_defaults (j_compress_ptr cinfo)
-{
- int i;
-
- /* Safety check to ensure start_compress not called yet. */
- if (cinfo->global_state != CSTATE_START)
- ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
-
- /* Allocate comp_info array large enough for maximum component count.
- * Array is made permanent in case application wants to compress
- * multiple images at same param settings.
- */
- if (cinfo->comp_info == NULL)
- cinfo->comp_info = (jpeg_component_info *)
- (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
- MAX_COMPONENTS * SIZEOF(jpeg_component_info));
-
- /* Initialize everything not dependent on the color space */
-
- cinfo->data_precision = BITS_IN_JSAMPLE;
- /* Set up two quantization tables using default quality of 75 */
- jpeg_set_quality(cinfo, 75, TRUE);
- /* Set up two Huffman tables */
- std_huff_tables(cinfo);
-
- /* Initialize default arithmetic coding conditioning */
- for (i = 0; i < NUM_ARITH_TBLS; i++) {
- cinfo->arith_dc_L[i] = 0;
- cinfo->arith_dc_U[i] = 1;
- cinfo->arith_ac_K[i] = 5;
- }
-
- /* Default is no multiple-scan output */
- cinfo->scan_info = NULL;
- cinfo->num_scans = 0;
-
- /* Expect normal source image, not raw downsampled data */
- cinfo->raw_data_in = FALSE;
-
- /* Use Huffman coding, not arithmetic coding, by default */
- cinfo->arith_code = FALSE;
-
- /* By default, don't do extra passes to optimize entropy coding */
- cinfo->optimize_coding = FALSE;
- /* The standard Huffman tables are only valid for 8-bit data precision.
- * If the precision is higher, force optimization on so that usable
- * tables will be computed. This test can be removed if default tables
- * are supplied that are valid for the desired precision.
- */
- if (cinfo->data_precision > 8)
- cinfo->optimize_coding = TRUE;
-
- /* By default, use the simpler non-cosited sampling alignment */
- cinfo->CCIR601_sampling = FALSE;
-
- /* No input smoothing */
- cinfo->smoothing_factor = 0;
-
- /* DCT algorithm preference */
- cinfo->dct_method = JDCT_DEFAULT;
-
- /* No restart markers */
- cinfo->restart_interval = 0;
- cinfo->restart_in_rows = 0;
-
- /* Fill in default JFIF marker parameters. Note that whether the marker
- * will actually be written is determined by jpeg_set_colorspace.
- *
- * By default, the library emits JFIF version code 1.01.
- * An application that wants to emit JFIF 1.02 extension markers should set
- * JFIF_minor_version to 2. We could probably get away with just defaulting
- * to 1.02, but there may still be some decoders in use that will complain
- * about that; saying 1.01 should minimize compatibility problems.
- */
- cinfo->JFIF_major_version = 1; /* Default JFIF version = 1.01 */
- cinfo->JFIF_minor_version = 1;
- cinfo->density_unit = 0; /* Pixel size is unknown by default */
- cinfo->X_density = 1; /* Pixel aspect ratio is square by default */
- cinfo->Y_density = 1;
-
- /* Choose JPEG colorspace based on input space, set defaults accordingly */
-
- jpeg_default_colorspace(cinfo);
-}
-
-
-/*
- * Select an appropriate JPEG colorspace for in_color_space.
- */
-
-GLOBAL(void)
-jpeg_default_colorspace (j_compress_ptr cinfo)
-{
- switch (cinfo->in_color_space) {
- case JCS_GRAYSCALE:
- jpeg_set_colorspace(cinfo, JCS_GRAYSCALE);
- break;
- case JCS_RGB:
- jpeg_set_colorspace(cinfo, JCS_YCbCr);
- break;
- case JCS_YCbCr:
- jpeg_set_colorspace(cinfo, JCS_YCbCr);
- break;
- case JCS_CMYK:
- jpeg_set_colorspace(cinfo, JCS_CMYK); /* By default, no translation */
- break;
- case JCS_YCCK:
- jpeg_set_colorspace(cinfo, JCS_YCCK);
- break;
- case JCS_UNKNOWN:
- jpeg_set_colorspace(cinfo, JCS_UNKNOWN);
- break;
- default:
- ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);
- }
-}
-
-
-/*
- * Set the JPEG colorspace, and choose colorspace-dependent default values.
- */
-
-GLOBAL(void)
-jpeg_set_colorspace (j_compress_ptr cinfo, J_COLOR_SPACE colorspace)
-{
- jpeg_component_info * compptr;
- int ci;
-
-#define SET_COMP(index,id,hsamp,vsamp,quant,dctbl,actbl) \
- (compptr = &cinfo->comp_info[index], \
- compptr->component_id = (id), \
- compptr->h_samp_factor = (hsamp), \
- compptr->v_samp_factor = (vsamp), \
- compptr->quant_tbl_no = (quant), \
- compptr->dc_tbl_no = (dctbl), \
- compptr->ac_tbl_no = (actbl) )
-
- /* Safety check to ensure start_compress not called yet. */
- if (cinfo->global_state != CSTATE_START)
- ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
-
- /* For all colorspaces, we use Q and Huff tables 0 for luminance components,
- * tables 1 for chrominance components.
- */
-
- cinfo->jpeg_color_space = colorspace;
-
- cinfo->write_JFIF_header = FALSE; /* No marker for non-JFIF colorspaces */
- cinfo->write_Adobe_marker = FALSE; /* write no Adobe marker by default */
-
- switch (colorspace) {
- case JCS_GRAYSCALE:
- cinfo->write_JFIF_header = TRUE; /* Write a JFIF marker */
- cinfo->num_components = 1;
- /* JFIF specifies component ID 1 */
- SET_COMP(0, 1, 1,1, 0, 0,0);
- break;
- case JCS_RGB:
- cinfo->write_Adobe_marker = TRUE; /* write Adobe marker to flag RGB */
- cinfo->num_components = 3;
- SET_COMP(0, 0x52 /* 'R' */, 1,1, 0, 0,0);
- SET_COMP(1, 0x47 /* 'G' */, 1,1, 0, 0,0);
- SET_COMP(2, 0x42 /* 'B' */, 1,1, 0, 0,0);
- break;
- case JCS_YCbCr:
- cinfo->write_JFIF_header = TRUE; /* Write a JFIF marker */
- cinfo->num_components = 3;
- /* JFIF specifies component IDs 1,2,3 */
- /* We default to 2x2 subsamples of chrominance */
- SET_COMP(0, 1, 2,2, 0, 0,0);
- SET_COMP(1, 2, 1,1, 1, 1,1);
- SET_COMP(2, 3, 1,1, 1, 1,1);
- break;
- case JCS_CMYK:
- cinfo->write_Adobe_marker = TRUE; /* write Adobe marker to flag CMYK */
- cinfo->num_components = 4;
- SET_COMP(0, 0x43 /* 'C' */, 1,1, 0, 0,0);
- SET_COMP(1, 0x4D /* 'M' */, 1,1, 0, 0,0);
- SET_COMP(2, 0x59 /* 'Y' */, 1,1, 0, 0,0);
- SET_COMP(3, 0x4B /* 'K' */, 1,1, 0, 0,0);
- break;
- case JCS_YCCK:
- cinfo->write_Adobe_marker = TRUE; /* write Adobe marker to flag YCCK */
- cinfo->num_components = 4;
- SET_COMP(0, 1, 2,2, 0, 0,0);
- SET_COMP(1, 2, 1,1, 1, 1,1);
- SET_COMP(2, 3, 1,1, 1, 1,1);
- SET_COMP(3, 4, 2,2, 0, 0,0);
- break;
- case JCS_UNKNOWN:
- cinfo->num_components = cinfo->input_components;
- if (cinfo->num_components < 1 || cinfo->num_components > MAX_COMPONENTS)
- ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->num_components,
- MAX_COMPONENTS);
- for (ci = 0; ci < cinfo->num_components; ci++) {
- SET_COMP(ci, ci, 1,1, 0, 0,0);
- }
- break;
- default:
- ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
- }
-}
-
-
-#ifdef C_PROGRESSIVE_SUPPORTED
-
-LOCAL(jpeg_scan_info *)
-fill_a_scan (jpeg_scan_info * scanptr, int ci,
- int Ss, int Se, int Ah, int Al)
-/* Support routine: generate one scan for specified component */
-{
- scanptr->comps_in_scan = 1;
- scanptr->component_index[0] = ci;
- scanptr->Ss = Ss;
- scanptr->Se = Se;
- scanptr->Ah = Ah;
- scanptr->Al = Al;
- scanptr++;
- return scanptr;
-}
-
-LOCAL(jpeg_scan_info *)
-fill_scans (jpeg_scan_info * scanptr, int ncomps,
- int Ss, int Se, int Ah, int Al)
-/* Support routine: generate one scan for each component */
-{
- int ci;
-
- for (ci = 0; ci < ncomps; ci++) {
- scanptr->comps_in_scan = 1;
- scanptr->component_index[0] = ci;
- scanptr->Ss = Ss;
- scanptr->Se = Se;
- scanptr->Ah = Ah;
- scanptr->Al = Al;
- scanptr++;
- }
- return scanptr;
-}
-
-LOCAL(jpeg_scan_info *)
-fill_dc_scans (jpeg_scan_info * scanptr, int ncomps, int Ah, int Al)
-/* Support routine: generate interleaved DC scan if possible, else N scans */
-{
- int ci;
-
- if (ncomps <= MAX_COMPS_IN_SCAN) {
- /* Single interleaved DC scan */
- scanptr->comps_in_scan = ncomps;
- for (ci = 0; ci < ncomps; ci++)
- scanptr->component_index[ci] = ci;
- scanptr->Ss = scanptr->Se = 0;
- scanptr->Ah = Ah;
- scanptr->Al = Al;
- scanptr++;
- } else {
- /* Noninterleaved DC scan for each component */
- scanptr = fill_scans(scanptr, ncomps, 0, 0, Ah, Al);
- }
- return scanptr;
-}
-
-
-/*
- * Create a recommended progressive-JPEG script.
- * cinfo->num_components and cinfo->jpeg_color_space must be correct.
- */
-
-GLOBAL(void)
-jpeg_simple_progression (j_compress_ptr cinfo)
-{
- int ncomps = cinfo->num_components;
- int nscans;
- jpeg_scan_info * scanptr;
-
- /* Safety check to ensure start_compress not called yet. */
- if (cinfo->global_state != CSTATE_START)
- ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
-
- /* Figure space needed for script. Calculation must match code below! */
- if (ncomps == 3 && cinfo->jpeg_color_space == JCS_YCbCr) {
- /* Custom script for YCbCr color images. */
- nscans = 10;
- } else {
- /* All-purpose script for other color spaces. */
- if (ncomps > MAX_COMPS_IN_SCAN)
- nscans = 6 * ncomps; /* 2 DC + 4 AC scans per component */
- else
- nscans = 2 + 4 * ncomps; /* 2 DC scans; 4 AC scans per component */
- }
-
- /* Allocate space for script.
- * We need to put it in the permanent pool in case the application performs
- * multiple compressions without changing the settings. To avoid a memory
- * leak if jpeg_simple_progression is called repeatedly for the same JPEG
- * object, we try to re-use previously allocated space, and we allocate
- * enough space to handle YCbCr even if initially asked for grayscale.
- */
- if (cinfo->script_space == NULL || cinfo->script_space_size < nscans) {
- cinfo->script_space_size = MAX(nscans, 10);
- cinfo->script_space = (jpeg_scan_info *)
- (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
- cinfo->script_space_size * SIZEOF(jpeg_scan_info));
- }
- scanptr = cinfo->script_space;
- cinfo->scan_info = scanptr;
- cinfo->num_scans = nscans;
-
- if (ncomps == 3 && cinfo->jpeg_color_space == JCS_YCbCr) {
- /* Custom script for YCbCr color images. */
- /* Initial DC scan */
- scanptr = fill_dc_scans(scanptr, ncomps, 0, 1);
- /* Initial AC scan: get some luma data out in a hurry */
- scanptr = fill_a_scan(scanptr, 0, 1, 5, 0, 2);
- /* Chroma data is too small to be worth expending many scans on */
- scanptr = fill_a_scan(scanptr, 2, 1, 63, 0, 1);
- scanptr = fill_a_scan(scanptr, 1, 1, 63, 0, 1);
- /* Complete spectral selection for luma AC */
- scanptr = fill_a_scan(scanptr, 0, 6, 63, 0, 2);
- /* Refine next bit of luma AC */
- scanptr = fill_a_scan(scanptr, 0, 1, 63, 2, 1);
- /* Finish DC successive approximation */
- scanptr = fill_dc_scans(scanptr, ncomps, 1, 0);
- /* Finish AC successive approximation */
- scanptr = fill_a_scan(scanptr, 2, 1, 63, 1, 0);
- scanptr = fill_a_scan(scanptr, 1, 1, 63, 1, 0);
- /* Luma bottom bit comes last since it's usually largest scan */
- scanptr = fill_a_scan(scanptr, 0, 1, 63, 1, 0);
- } else {
- /* All-purpose script for other color spaces. */
- /* Successive approximation first pass */
- scanptr = fill_dc_scans(scanptr, ncomps, 0, 1);
- scanptr = fill_scans(scanptr, ncomps, 1, 5, 0, 2);
- scanptr = fill_scans(scanptr, ncomps, 6, 63, 0, 2);
- /* Successive approximation second pass */
- scanptr = fill_scans(scanptr, ncomps, 1, 63, 2, 1);
- /* Successive approximation final pass */
- scanptr = fill_dc_scans(scanptr, ncomps, 1, 0);
- scanptr = fill_scans(scanptr, ncomps, 1, 63, 1, 0);
- }
-}
-
-#endif /* C_PROGRESSIVE_SUPPORTED */
-
-#endif //_FX_JPEG_TURBO_
+#if !defined(_FX_JPEG_TURBO_)
+/*
+ * jcparam.c
+ *
+ * Copyright (C) 1991-1998, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains optional default-setting code for the JPEG compressor.
+ * Applications do not have to use this file, but those that don't use it
+ * must know a lot more about the innards of the JPEG code.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+
+
+/*
+ * Quantization table setup routines
+ */
+
+GLOBAL(void)
+jpeg_add_quant_table (j_compress_ptr cinfo, int which_tbl,
+ const unsigned int *basic_table,
+ int scale_factor, boolean force_baseline)
+/* Define a quantization table equal to the basic_table times
+ * a scale factor (given as a percentage).
+ * If force_baseline is TRUE, the computed quantization table entries
+ * are limited to 1..255 for JPEG baseline compatibility.
+ */
+{
+ JQUANT_TBL ** qtblptr;
+ int i;
+ long temp;
+
+ /* Safety check to ensure start_compress not called yet. */
+ if (cinfo->global_state != CSTATE_START)
+ ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
+
+ if (which_tbl < 0 || which_tbl >= NUM_QUANT_TBLS)
+ ERREXIT1(cinfo, JERR_DQT_INDEX, which_tbl);
+
+ qtblptr = & cinfo->quant_tbl_ptrs[which_tbl];
+
+ if (*qtblptr == NULL)
+ *qtblptr = jpeg_alloc_quant_table((j_common_ptr) cinfo);
+
+ for (i = 0; i < DCTSIZE2; i++) {
+ temp = ((long) basic_table[i] * scale_factor + 50L) / 100L;
+ /* limit the values to the valid range */
+ if (temp <= 0L) temp = 1L;
+ if (temp > 32767L) temp = 32767L; /* max quantizer needed for 12 bits */
+ if (force_baseline && temp > 255L)
+ temp = 255L; /* limit to baseline range if requested */
+ (*qtblptr)->quantval[i] = (UINT16) temp;
+ }
+
+ /* Initialize sent_table FALSE so table will be written to JPEG file. */
+ (*qtblptr)->sent_table = FALSE;
+}
+
+
+GLOBAL(void)
+jpeg_set_linear_quality (j_compress_ptr cinfo, int scale_factor,
+ boolean force_baseline)
+/* Set or change the 'quality' (quantization) setting, using default tables
+ * and a straight percentage-scaling quality scale. In most cases it's better
+ * to use jpeg_set_quality (below); this entry point is provided for
+ * applications that insist on a linear percentage scaling.
+ */
+{
+ /* These are the sample quantization tables given in JPEG spec section K.1.
+ * The spec says that the values given produce "good" quality, and
+ * when divided by 2, "very good" quality.
+ */
+ static const unsigned int std_luminance_quant_tbl[DCTSIZE2] = {
+ 16, 11, 10, 16, 24, 40, 51, 61,
+ 12, 12, 14, 19, 26, 58, 60, 55,
+ 14, 13, 16, 24, 40, 57, 69, 56,
+ 14, 17, 22, 29, 51, 87, 80, 62,
+ 18, 22, 37, 56, 68, 109, 103, 77,
+ 24, 35, 55, 64, 81, 104, 113, 92,
+ 49, 64, 78, 87, 103, 121, 120, 101,
+ 72, 92, 95, 98, 112, 100, 103, 99
+ };
+ static const unsigned int std_chrominance_quant_tbl[DCTSIZE2] = {
+ 17, 18, 24, 47, 99, 99, 99, 99,
+ 18, 21, 26, 66, 99, 99, 99, 99,
+ 24, 26, 56, 99, 99, 99, 99, 99,
+ 47, 66, 99, 99, 99, 99, 99, 99,
+ 99, 99, 99, 99, 99, 99, 99, 99,
+ 99, 99, 99, 99, 99, 99, 99, 99,
+ 99, 99, 99, 99, 99, 99, 99, 99,
+ 99, 99, 99, 99, 99, 99, 99, 99
+ };
+
+ /* Set up two quantization tables using the specified scaling */
+ jpeg_add_quant_table(cinfo, 0, std_luminance_quant_tbl,
+ scale_factor, force_baseline);
+ jpeg_add_quant_table(cinfo, 1, std_chrominance_quant_tbl,
+ scale_factor, force_baseline);
+}
+
+
+GLOBAL(int)
+jpeg_quality_scaling (int quality)
+/* Convert a user-specified quality rating to a percentage scaling factor
+ * for an underlying quantization table, using our recommended scaling curve.
+ * The input 'quality' factor should be 0 (terrible) to 100 (very good).
+ */
+{
+ /* Safety limit on quality factor. Convert 0 to 1 to avoid zero divide. */
+ if (quality <= 0) quality = 1;
+ if (quality > 100) quality = 100;
+
+ /* The basic table is used as-is (scaling 100) for a quality of 50.
+ * Qualities 50..100 are converted to scaling percentage 200 - 2*Q;
+ * note that at Q=100 the scaling is 0, which will cause jpeg_add_quant_table
+ * to make all the table entries 1 (hence, minimum quantization loss).
+ * Qualities 1..50 are converted to scaling percentage 5000/Q.
+ */
+ if (quality < 50)
+ quality = 5000 / quality;
+ else
+ quality = 200 - quality*2;
+
+ return quality;
+}
+
+
+GLOBAL(void)
+jpeg_set_quality (j_compress_ptr cinfo, int quality, boolean force_baseline)
+/* Set or change the 'quality' (quantization) setting, using default tables.
+ * This is the standard quality-adjusting entry point for typical user
+ * interfaces; only those who want detailed control over quantization tables
+ * would use the preceding three routines directly.
+ */
+{
+ /* Convert user 0-100 rating to percentage scaling */
+ quality = jpeg_quality_scaling(quality);
+
+ /* Set up standard quality tables */
+ jpeg_set_linear_quality(cinfo, quality, force_baseline);
+}
+
+
+/*
+ * Huffman table setup routines
+ */
+
+LOCAL(void)
+add_huff_table (j_compress_ptr cinfo,
+ JHUFF_TBL **htblptr, const UINT8 *bits, const UINT8 *val)
+/* Define a Huffman table */
+{
+ int nsymbols, len;
+
+ if (*htblptr == NULL)
+ *htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo);
+
+ /* Copy the number-of-symbols-of-each-code-length counts */
+ MEMCOPY((*htblptr)->bits, bits, SIZEOF((*htblptr)->bits));
+
+ /* Validate the counts. We do this here mainly so we can copy the right
+ * number of symbols from the val[] array, without risking marching off
+ * the end of memory. jchuff.c will do a more thorough test later.
+ */
+ nsymbols = 0;
+ for (len = 1; len <= 16; len++)
+ nsymbols += bits[len];
+ if (nsymbols < 1 || nsymbols > 256)
+ ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
+
+ MEMCOPY((*htblptr)->huffval, val, nsymbols * SIZEOF(UINT8));
+
+ /* Initialize sent_table FALSE so table will be written to JPEG file. */
+ (*htblptr)->sent_table = FALSE;
+}
+
+
+LOCAL(void)
+std_huff_tables (j_compress_ptr cinfo)
+/* Set up the standard Huffman tables (cf. JPEG standard section K.3) */
+/* IMPORTANT: these are only valid for 8-bit data precision! */
+{
+ static const UINT8 bits_dc_luminance[17] =
+ { /* 0-base */ 0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 };
+ static const UINT8 val_dc_luminance[] =
+ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
+
+ static const UINT8 bits_dc_chrominance[17] =
+ { /* 0-base */ 0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 };
+ static const UINT8 val_dc_chrominance[] =
+ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
+
+ static const UINT8 bits_ac_luminance[17] =
+ { /* 0-base */ 0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d };
+ static const UINT8 val_ac_luminance[] =
+ { 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12,
+ 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07,
+ 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08,
+ 0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0,
+ 0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16,
+ 0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28,
+ 0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
+ 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,
+ 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,
+ 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
+ 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,
+ 0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,
+ 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98,
+ 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
+ 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6,
+ 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5,
+ 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4,
+ 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2,
+ 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea,
+ 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
+ 0xf9, 0xfa };
+
+ static const UINT8 bits_ac_chrominance[17] =
+ { /* 0-base */ 0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77 };
+ static const UINT8 val_ac_chrominance[] =
+ { 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21,
+ 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71,
+ 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91,
+ 0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0,
+ 0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34,
+ 0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26,
+ 0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38,
+ 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48,
+ 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,
+ 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68,
+ 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
+ 0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
+ 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96,
+ 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5,
+ 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4,
+ 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3,
+ 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2,
+ 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda,
+ 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9,
+ 0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
+ 0xf9, 0xfa };
+
+ add_huff_table(cinfo, &cinfo->dc_huff_tbl_ptrs[0],
+ bits_dc_luminance, val_dc_luminance);
+ add_huff_table(cinfo, &cinfo->ac_huff_tbl_ptrs[0],
+ bits_ac_luminance, val_ac_luminance);
+ add_huff_table(cinfo, &cinfo->dc_huff_tbl_ptrs[1],
+ bits_dc_chrominance, val_dc_chrominance);
+ add_huff_table(cinfo, &cinfo->ac_huff_tbl_ptrs[1],
+ bits_ac_chrominance, val_ac_chrominance);
+}
+
+
+/*
+ * Default parameter setup for compression.
+ *
+ * Applications that don't choose to use this routine must do their
+ * own setup of all these parameters. Alternately, you can call this
+ * to establish defaults and then alter parameters selectively. This
+ * is the recommended approach since, if we add any new parameters,
+ * your code will still work (they'll be set to reasonable defaults).
+ */
+
+GLOBAL(void)
+jpeg_set_defaults (j_compress_ptr cinfo)
+{
+ int i;
+
+ /* Safety check to ensure start_compress not called yet. */
+ if (cinfo->global_state != CSTATE_START)
+ ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
+
+ /* Allocate comp_info array large enough for maximum component count.
+ * Array is made permanent in case application wants to compress
+ * multiple images at same param settings.
+ */
+ if (cinfo->comp_info == NULL)
+ cinfo->comp_info = (jpeg_component_info *)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
+ MAX_COMPONENTS * SIZEOF(jpeg_component_info));
+
+ /* Initialize everything not dependent on the color space */
+
+ cinfo->data_precision = BITS_IN_JSAMPLE;
+ /* Set up two quantization tables using default quality of 75 */
+ jpeg_set_quality(cinfo, 75, TRUE);
+ /* Set up two Huffman tables */
+ std_huff_tables(cinfo);
+
+ /* Initialize default arithmetic coding conditioning */
+ for (i = 0; i < NUM_ARITH_TBLS; i++) {
+ cinfo->arith_dc_L[i] = 0;
+ cinfo->arith_dc_U[i] = 1;
+ cinfo->arith_ac_K[i] = 5;
+ }
+
+ /* Default is no multiple-scan output */
+ cinfo->scan_info = NULL;
+ cinfo->num_scans = 0;
+
+ /* Expect normal source image, not raw downsampled data */
+ cinfo->raw_data_in = FALSE;
+
+ /* Use Huffman coding, not arithmetic coding, by default */
+ cinfo->arith_code = FALSE;
+
+ /* By default, don't do extra passes to optimize entropy coding */
+ cinfo->optimize_coding = FALSE;
+ /* The standard Huffman tables are only valid for 8-bit data precision.
+ * If the precision is higher, force optimization on so that usable
+ * tables will be computed. This test can be removed if default tables
+ * are supplied that are valid for the desired precision.
+ */
+ if (cinfo->data_precision > 8)
+ cinfo->optimize_coding = TRUE;
+
+ /* By default, use the simpler non-cosited sampling alignment */
+ cinfo->CCIR601_sampling = FALSE;
+
+ /* No input smoothing */
+ cinfo->smoothing_factor = 0;
+
+ /* DCT algorithm preference */
+ cinfo->dct_method = JDCT_DEFAULT;
+
+ /* No restart markers */
+ cinfo->restart_interval = 0;
+ cinfo->restart_in_rows = 0;
+
+ /* Fill in default JFIF marker parameters. Note that whether the marker
+ * will actually be written is determined by jpeg_set_colorspace.
+ *
+ * By default, the library emits JFIF version code 1.01.
+ * An application that wants to emit JFIF 1.02 extension markers should set
+ * JFIF_minor_version to 2. We could probably get away with just defaulting
+ * to 1.02, but there may still be some decoders in use that will complain
+ * about that; saying 1.01 should minimize compatibility problems.
+ */
+ cinfo->JFIF_major_version = 1; /* Default JFIF version = 1.01 */
+ cinfo->JFIF_minor_version = 1;
+ cinfo->density_unit = 0; /* Pixel size is unknown by default */
+ cinfo->X_density = 1; /* Pixel aspect ratio is square by default */
+ cinfo->Y_density = 1;
+
+ /* Choose JPEG colorspace based on input space, set defaults accordingly */
+
+ jpeg_default_colorspace(cinfo);
+}
+
+
+/*
+ * Select an appropriate JPEG colorspace for in_color_space.
+ */
+
+GLOBAL(void)
+jpeg_default_colorspace (j_compress_ptr cinfo)
+{
+ switch (cinfo->in_color_space) {
+ case JCS_GRAYSCALE:
+ jpeg_set_colorspace(cinfo, JCS_GRAYSCALE);
+ break;
+ case JCS_RGB:
+ jpeg_set_colorspace(cinfo, JCS_YCbCr);
+ break;
+ case JCS_YCbCr:
+ jpeg_set_colorspace(cinfo, JCS_YCbCr);
+ break;
+ case JCS_CMYK:
+ jpeg_set_colorspace(cinfo, JCS_CMYK); /* By default, no translation */
+ break;
+ case JCS_YCCK:
+ jpeg_set_colorspace(cinfo, JCS_YCCK);
+ break;
+ case JCS_UNKNOWN:
+ jpeg_set_colorspace(cinfo, JCS_UNKNOWN);
+ break;
+ default:
+ ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);
+ }
+}
+
+
+/*
+ * Set the JPEG colorspace, and choose colorspace-dependent default values.
+ */
+
+GLOBAL(void)
+jpeg_set_colorspace (j_compress_ptr cinfo, J_COLOR_SPACE colorspace)
+{
+ jpeg_component_info * compptr;
+ int ci;
+
+#define SET_COMP(index,id,hsamp,vsamp,quant,dctbl,actbl) \
+ (compptr = &cinfo->comp_info[index], \
+ compptr->component_id = (id), \
+ compptr->h_samp_factor = (hsamp), \
+ compptr->v_samp_factor = (vsamp), \
+ compptr->quant_tbl_no = (quant), \
+ compptr->dc_tbl_no = (dctbl), \
+ compptr->ac_tbl_no = (actbl) )
+
+ /* Safety check to ensure start_compress not called yet. */
+ if (cinfo->global_state != CSTATE_START)
+ ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
+
+ /* For all colorspaces, we use Q and Huff tables 0 for luminance components,
+ * tables 1 for chrominance components.
+ */
+
+ cinfo->jpeg_color_space = colorspace;
+
+ cinfo->write_JFIF_header = FALSE; /* No marker for non-JFIF colorspaces */
+ cinfo->write_Adobe_marker = FALSE; /* write no Adobe marker by default */
+
+ switch (colorspace) {
+ case JCS_GRAYSCALE:
+ cinfo->write_JFIF_header = TRUE; /* Write a JFIF marker */
+ cinfo->num_components = 1;
+ /* JFIF specifies component ID 1 */
+ SET_COMP(0, 1, 1,1, 0, 0,0);
+ break;
+ case JCS_RGB:
+ cinfo->write_Adobe_marker = TRUE; /* write Adobe marker to flag RGB */
+ cinfo->num_components = 3;
+ SET_COMP(0, 0x52 /* 'R' */, 1,1, 0, 0,0);
+ SET_COMP(1, 0x47 /* 'G' */, 1,1, 0, 0,0);
+ SET_COMP(2, 0x42 /* 'B' */, 1,1, 0, 0,0);
+ break;
+ case JCS_YCbCr:
+ cinfo->write_JFIF_header = TRUE; /* Write a JFIF marker */
+ cinfo->num_components = 3;
+ /* JFIF specifies component IDs 1,2,3 */
+ /* We default to 2x2 subsamples of chrominance */
+ SET_COMP(0, 1, 2,2, 0, 0,0);
+ SET_COMP(1, 2, 1,1, 1, 1,1);
+ SET_COMP(2, 3, 1,1, 1, 1,1);
+ break;
+ case JCS_CMYK:
+ cinfo->write_Adobe_marker = TRUE; /* write Adobe marker to flag CMYK */
+ cinfo->num_components = 4;
+ SET_COMP(0, 0x43 /* 'C' */, 1,1, 0, 0,0);
+ SET_COMP(1, 0x4D /* 'M' */, 1,1, 0, 0,0);
+ SET_COMP(2, 0x59 /* 'Y' */, 1,1, 0, 0,0);
+ SET_COMP(3, 0x4B /* 'K' */, 1,1, 0, 0,0);
+ break;
+ case JCS_YCCK:
+ cinfo->write_Adobe_marker = TRUE; /* write Adobe marker to flag YCCK */
+ cinfo->num_components = 4;
+ SET_COMP(0, 1, 2,2, 0, 0,0);
+ SET_COMP(1, 2, 1,1, 1, 1,1);
+ SET_COMP(2, 3, 1,1, 1, 1,1);
+ SET_COMP(3, 4, 2,2, 0, 0,0);
+ break;
+ case JCS_UNKNOWN:
+ cinfo->num_components = cinfo->input_components;
+ if (cinfo->num_components < 1 || cinfo->num_components > MAX_COMPONENTS)
+ ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->num_components,
+ MAX_COMPONENTS);
+ for (ci = 0; ci < cinfo->num_components; ci++) {
+ SET_COMP(ci, ci, 1,1, 0, 0,0);
+ }
+ break;
+ default:
+ ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
+ }
+}
+
+
+#ifdef C_PROGRESSIVE_SUPPORTED
+
+LOCAL(jpeg_scan_info *)
+fill_a_scan (jpeg_scan_info * scanptr, int ci,
+ int Ss, int Se, int Ah, int Al)
+/* Support routine: generate one scan for specified component */
+{
+ scanptr->comps_in_scan = 1;
+ scanptr->component_index[0] = ci;
+ scanptr->Ss = Ss;
+ scanptr->Se = Se;
+ scanptr->Ah = Ah;
+ scanptr->Al = Al;
+ scanptr++;
+ return scanptr;
+}
+
+LOCAL(jpeg_scan_info *)
+fill_scans (jpeg_scan_info * scanptr, int ncomps,
+ int Ss, int Se, int Ah, int Al)
+/* Support routine: generate one scan for each component */
+{
+ int ci;
+
+ for (ci = 0; ci < ncomps; ci++) {
+ scanptr->comps_in_scan = 1;
+ scanptr->component_index[0] = ci;
+ scanptr->Ss = Ss;
+ scanptr->Se = Se;
+ scanptr->Ah = Ah;
+ scanptr->Al = Al;
+ scanptr++;
+ }
+ return scanptr;
+}
+
+LOCAL(jpeg_scan_info *)
+fill_dc_scans (jpeg_scan_info * scanptr, int ncomps, int Ah, int Al)
+/* Support routine: generate interleaved DC scan if possible, else N scans */
+{
+ int ci;
+
+ if (ncomps <= MAX_COMPS_IN_SCAN) {
+ /* Single interleaved DC scan */
+ scanptr->comps_in_scan = ncomps;
+ for (ci = 0; ci < ncomps; ci++)
+ scanptr->component_index[ci] = ci;
+ scanptr->Ss = scanptr->Se = 0;
+ scanptr->Ah = Ah;
+ scanptr->Al = Al;
+ scanptr++;
+ } else {
+ /* Noninterleaved DC scan for each component */
+ scanptr = fill_scans(scanptr, ncomps, 0, 0, Ah, Al);
+ }
+ return scanptr;
+}
+
+
+/*
+ * Create a recommended progressive-JPEG script.
+ * cinfo->num_components and cinfo->jpeg_color_space must be correct.
+ */
+
+GLOBAL(void)
+jpeg_simple_progression (j_compress_ptr cinfo)
+{
+ int ncomps = cinfo->num_components;
+ int nscans;
+ jpeg_scan_info * scanptr;
+
+ /* Safety check to ensure start_compress not called yet. */
+ if (cinfo->global_state != CSTATE_START)
+ ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
+
+ /* Figure space needed for script. Calculation must match code below! */
+ if (ncomps == 3 && cinfo->jpeg_color_space == JCS_YCbCr) {
+ /* Custom script for YCbCr color images. */
+ nscans = 10;
+ } else {
+ /* All-purpose script for other color spaces. */
+ if (ncomps > MAX_COMPS_IN_SCAN)
+ nscans = 6 * ncomps; /* 2 DC + 4 AC scans per component */
+ else
+ nscans = 2 + 4 * ncomps; /* 2 DC scans; 4 AC scans per component */
+ }
+
+ /* Allocate space for script.
+ * We need to put it in the permanent pool in case the application performs
+ * multiple compressions without changing the settings. To avoid a memory
+ * leak if jpeg_simple_progression is called repeatedly for the same JPEG
+ * object, we try to re-use previously allocated space, and we allocate
+ * enough space to handle YCbCr even if initially asked for grayscale.
+ */
+ if (cinfo->script_space == NULL || cinfo->script_space_size < nscans) {
+ cinfo->script_space_size = MAX(nscans, 10);
+ cinfo->script_space = (jpeg_scan_info *)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
+ cinfo->script_space_size * SIZEOF(jpeg_scan_info));
+ }
+ scanptr = cinfo->script_space;
+ cinfo->scan_info = scanptr;
+ cinfo->num_scans = nscans;
+
+ if (ncomps == 3 && cinfo->jpeg_color_space == JCS_YCbCr) {
+ /* Custom script for YCbCr color images. */
+ /* Initial DC scan */
+ scanptr = fill_dc_scans(scanptr, ncomps, 0, 1);
+ /* Initial AC scan: get some luma data out in a hurry */
+ scanptr = fill_a_scan(scanptr, 0, 1, 5, 0, 2);
+ /* Chroma data is too small to be worth expending many scans on */
+ scanptr = fill_a_scan(scanptr, 2, 1, 63, 0, 1);
+ scanptr = fill_a_scan(scanptr, 1, 1, 63, 0, 1);
+ /* Complete spectral selection for luma AC */
+ scanptr = fill_a_scan(scanptr, 0, 6, 63, 0, 2);
+ /* Refine next bit of luma AC */
+ scanptr = fill_a_scan(scanptr, 0, 1, 63, 2, 1);
+ /* Finish DC successive approximation */
+ scanptr = fill_dc_scans(scanptr, ncomps, 1, 0);
+ /* Finish AC successive approximation */
+ scanptr = fill_a_scan(scanptr, 2, 1, 63, 1, 0);
+ scanptr = fill_a_scan(scanptr, 1, 1, 63, 1, 0);
+ /* Luma bottom bit comes last since it's usually largest scan */
+ scanptr = fill_a_scan(scanptr, 0, 1, 63, 1, 0);
+ } else {
+ /* All-purpose script for other color spaces. */
+ /* Successive approximation first pass */
+ scanptr = fill_dc_scans(scanptr, ncomps, 0, 1);
+ scanptr = fill_scans(scanptr, ncomps, 1, 5, 0, 2);
+ scanptr = fill_scans(scanptr, ncomps, 6, 63, 0, 2);
+ /* Successive approximation second pass */
+ scanptr = fill_scans(scanptr, ncomps, 1, 63, 2, 1);
+ /* Successive approximation final pass */
+ scanptr = fill_dc_scans(scanptr, ncomps, 1, 0);
+ scanptr = fill_scans(scanptr, ncomps, 1, 63, 1, 0);
+ }
+}
+
+#endif /* C_PROGRESSIVE_SUPPORTED */
+
+#endif //_FX_JPEG_TURBO_
diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jcphuff.c b/core/src/fxcodec/libjpeg/fpdfapi_jcphuff.c
index c2655fbb48..6d89b6b2c0 100644
--- a/core/src/fxcodec/libjpeg/fpdfapi_jcphuff.c
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jcphuff.c
@@ -1,836 +1,836 @@
-#if !defined(_FX_JPEG_TURBO_)
-/*
- * jcphuff.c
- *
- * Copyright (C) 1995-1997, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains Huffman entropy encoding routines for progressive JPEG.
- *
- * We do not support output suspension in this module, since the library
- * currently does not allow multiple-scan files to be written with output
- * suspension.
- */
-
-#define JPEG_INTERNALS
-#include "jinclude.h"
-#include "jpeglib.h"
-#include "jchuff.h" /* Declarations shared with jchuff.c */
-
-#ifdef C_PROGRESSIVE_SUPPORTED
-
-/* Expanded entropy encoder object for progressive Huffman encoding. */
-
-typedef struct {
- struct jpeg_entropy_encoder pub; /* public fields */
-
- /* Mode flag: TRUE for optimization, FALSE for actual data output */
- boolean gather_statistics;
-
- /* Bit-level coding status.
- * next_output_byte/free_in_buffer are local copies of cinfo->dest fields.
- */
- JOCTET * next_output_byte; /* => next byte to write in buffer */
- size_t free_in_buffer; /* # of byte spaces remaining in buffer */
- INT32 put_buffer; /* current bit-accumulation buffer */
- int put_bits; /* # of bits now in it */
- j_compress_ptr cinfo; /* link to cinfo (needed for dump_buffer) */
-
- /* Coding status for DC components */
- int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */
-
- /* Coding status for AC components */
- int ac_tbl_no; /* the table number of the single component */
- unsigned int EOBRUN; /* run length of EOBs */
- unsigned int BE; /* # of buffered correction bits before MCU */
- char * bit_buffer; /* buffer for correction bits (1 per char) */
- /* packing correction bits tightly would save some space but cost time... */
-
- unsigned int restarts_to_go; /* MCUs left in this restart interval */
- int next_restart_num; /* next restart number to write (0-7) */
-
- /* Pointers to derived tables (these workspaces have image lifespan).
- * Since any one scan codes only DC or only AC, we only need one set
- * of tables, not one for DC and one for AC.
- */
- c_derived_tbl * derived_tbls[NUM_HUFF_TBLS];
-
- /* Statistics tables for optimization; again, one set is enough */
- long * count_ptrs[NUM_HUFF_TBLS];
-} phuff_entropy_encoder;
-
-typedef phuff_entropy_encoder * phuff_entropy_ptr;
-
-/* MAX_CORR_BITS is the number of bits the AC refinement correction-bit
- * buffer can hold. Larger sizes may slightly improve compression, but
- * 1000 is already well into the realm of overkill.
- * The minimum safe size is 64 bits.
- */
-
-#define MAX_CORR_BITS 1000 /* Max # of correction bits I can buffer */
-
-/* IRIGHT_SHIFT is like RIGHT_SHIFT, but works on int rather than INT32.
- * We assume that int right shift is unsigned if INT32 right shift is,
- * which should be safe.
- */
-
-#ifdef RIGHT_SHIFT_IS_UNSIGNED
-#define ISHIFT_TEMPS int ishift_temp;
-#define IRIGHT_SHIFT(x,shft) \
- ((ishift_temp = (x)) < 0 ? \
- (ishift_temp >> (shft)) | ((~0) << (16-(shft))) : \
- (ishift_temp >> (shft)))
-#else
-#define ISHIFT_TEMPS
-#define IRIGHT_SHIFT(x,shft) ((x) >> (shft))
-#endif
-
-/* Forward declarations */
-METHODDEF(boolean) encode_mcu_DC_first JPP((j_compress_ptr cinfo,
- JBLOCKROW *MCU_data));
-METHODDEF(boolean) encode_mcu_AC_first JPP((j_compress_ptr cinfo,
- JBLOCKROW *MCU_data));
-METHODDEF(boolean) encode_mcu_DC_refine JPP((j_compress_ptr cinfo,
- JBLOCKROW *MCU_data));
-METHODDEF(boolean) encode_mcu_AC_refine JPP((j_compress_ptr cinfo,
- JBLOCKROW *MCU_data));
-METHODDEF(void) finish_pass_phuff JPP((j_compress_ptr cinfo));
-METHODDEF(void) finish_pass_gather_phuff JPP((j_compress_ptr cinfo));
-
-
-/*
- * Initialize for a Huffman-compressed scan using progressive JPEG.
- */
-
-METHODDEF(void)
-start_pass_phuff (j_compress_ptr cinfo, boolean gather_statistics)
-{
- phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
- boolean is_DC_band;
- int ci, tbl;
- jpeg_component_info * compptr;
-
- entropy->cinfo = cinfo;
- entropy->gather_statistics = gather_statistics;
-
- is_DC_band = (cinfo->Ss == 0);
-
- /* We assume jcmaster.c already validated the scan parameters. */
-
- /* Select execution routines */
- if (cinfo->Ah == 0) {
- if (is_DC_band)
- entropy->pub.encode_mcu = encode_mcu_DC_first;
- else
- entropy->pub.encode_mcu = encode_mcu_AC_first;
- } else {
- if (is_DC_band)
- entropy->pub.encode_mcu = encode_mcu_DC_refine;
- else {
- entropy->pub.encode_mcu = encode_mcu_AC_refine;
- /* AC refinement needs a correction bit buffer */
- if (entropy->bit_buffer == NULL)
- entropy->bit_buffer = (char *)
- (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
- MAX_CORR_BITS * SIZEOF(char));
- }
- }
- if (gather_statistics)
- entropy->pub.finish_pass = finish_pass_gather_phuff;
- else
- entropy->pub.finish_pass = finish_pass_phuff;
-
- /* Only DC coefficients may be interleaved, so cinfo->comps_in_scan = 1
- * for AC coefficients.
- */
- for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
- compptr = cinfo->cur_comp_info[ci];
- /* Initialize DC predictions to 0 */
- entropy->last_dc_val[ci] = 0;
- /* Get table index */
- if (is_DC_band) {
- if (cinfo->Ah != 0) /* DC refinement needs no table */
- continue;
- tbl = compptr->dc_tbl_no;
- } else {
- entropy->ac_tbl_no = tbl = compptr->ac_tbl_no;
- }
- if (gather_statistics) {
- /* Check for invalid table index */
- /* (make_c_derived_tbl does this in the other path) */
- if (tbl < 0 || tbl >= NUM_HUFF_TBLS)
- ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tbl);
- /* Allocate and zero the statistics tables */
- /* Note that jpeg_gen_optimal_table expects 257 entries in each table! */
- if (entropy->count_ptrs[tbl] == NULL)
- entropy->count_ptrs[tbl] = (long *)
- (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
- 257 * SIZEOF(long));
- MEMZERO(entropy->count_ptrs[tbl], 257 * SIZEOF(long));
- } else {
- /* Compute derived values for Huffman table */
- /* We may do this more than once for a table, but it's not expensive */
- jpeg_make_c_derived_tbl(cinfo, is_DC_band, tbl,
- & entropy->derived_tbls[tbl]);
- }
- }
-
- /* Initialize AC stuff */
- entropy->EOBRUN = 0;
- entropy->BE = 0;
-
- /* Initialize bit buffer to empty */
- entropy->put_buffer = 0;
- entropy->put_bits = 0;
-
- /* Initialize restart stuff */
- entropy->restarts_to_go = cinfo->restart_interval;
- entropy->next_restart_num = 0;
-}
-
-
-/* Outputting bytes to the file.
- * NB: these must be called only when actually outputting,
- * that is, entropy->gather_statistics == FALSE.
- */
-
-/* Emit a byte */
-#define emit_byte(entropy,val) \
- { *(entropy)->next_output_byte++ = (JOCTET) (val); \
- if (--(entropy)->free_in_buffer == 0) \
- dump_buffer(entropy); }
-
-
-LOCAL(void)
-dump_buffer (phuff_entropy_ptr entropy)
-/* Empty the output buffer; we do not support suspension in this module. */
-{
- struct jpeg_destination_mgr * dest = entropy->cinfo->dest;
-
- if (! (*dest->empty_output_buffer) (entropy->cinfo))
- ERREXIT(entropy->cinfo, JERR_CANT_SUSPEND);
- /* After a successful buffer dump, must reset buffer pointers */
- entropy->next_output_byte = dest->next_output_byte;
- entropy->free_in_buffer = dest->free_in_buffer;
-}
-
-
-/* Outputting bits to the file */
-
-/* Only the right 24 bits of put_buffer are used; the valid bits are
- * left-justified in this part. At most 16 bits can be passed to emit_bits
- * in one call, and we never retain more than 7 bits in put_buffer
- * between calls, so 24 bits are sufficient.
- */
-
-INLINE
-LOCAL(void)
-emit_bits (phuff_entropy_ptr entropy, unsigned int code, int size)
-/* Emit some bits, unless we are in gather mode */
-{
- /* This routine is heavily used, so it's worth coding tightly. */
- register INT32 put_buffer = (INT32) code;
- register int put_bits = entropy->put_bits;
-
- /* if size is 0, caller used an invalid Huffman table entry */
- if (size == 0)
- ERREXIT(entropy->cinfo, JERR_HUFF_MISSING_CODE);
-
- if (entropy->gather_statistics)
- return; /* do nothing if we're only getting stats */
-
- put_buffer &= (((INT32) 1)<<size) - 1; /* mask off any extra bits in code */
-
- put_bits += size; /* new number of bits in buffer */
-
- put_buffer <<= 24 - put_bits; /* align incoming bits */
-
- put_buffer |= entropy->put_buffer; /* and merge with old buffer contents */
-
- while (put_bits >= 8) {
- int c = (int) ((put_buffer >> 16) & 0xFF);
-
- emit_byte(entropy, c);
- if (c == 0xFF) { /* need to stuff a zero byte? */
- emit_byte(entropy, 0);
- }
- put_buffer <<= 8;
- put_bits -= 8;
- }
-
- entropy->put_buffer = put_buffer; /* update variables */
- entropy->put_bits = put_bits;
-}
-
-
-LOCAL(void)
-flush_bits (phuff_entropy_ptr entropy)
-{
- emit_bits(entropy, 0x7F, 7); /* fill any partial byte with ones */
- entropy->put_buffer = 0; /* and reset bit-buffer to empty */
- entropy->put_bits = 0;
-}
-
-
-/*
- * Emit (or just count) a Huffman symbol.
- */
-
-INLINE
-LOCAL(void)
-emit_symbol (phuff_entropy_ptr entropy, int tbl_no, int symbol)
-{
- if (entropy->gather_statistics)
- entropy->count_ptrs[tbl_no][symbol]++;
- else {
- c_derived_tbl * tbl = entropy->derived_tbls[tbl_no];
- emit_bits(entropy, tbl->ehufco[symbol], tbl->ehufsi[symbol]);
- }
-}
-
-
-/*
- * Emit bits from a correction bit buffer.
- */
-
-LOCAL(void)
-emit_buffered_bits (phuff_entropy_ptr entropy, char * bufstart,
- unsigned int nbits)
-{
- if (entropy->gather_statistics)
- return; /* no real work */
-
- while (nbits > 0) {
- emit_bits(entropy, (unsigned int) (*bufstart), 1);
- bufstart++;
- nbits--;
- }
-}
-
-
-/*
- * Emit any pending EOBRUN symbol.
- */
-
-LOCAL(void)
-emit_eobrun (phuff_entropy_ptr entropy)
-{
- register int temp, nbits;
-
- if (entropy->EOBRUN > 0) { /* if there is any pending EOBRUN */
- temp = entropy->EOBRUN;
- nbits = 0;
- while ((temp >>= 1))
- nbits++;
- /* safety check: shouldn't happen given limited correction-bit buffer */
- if (nbits > 14)
- ERREXIT(entropy->cinfo, JERR_HUFF_MISSING_CODE);
-
- emit_symbol(entropy, entropy->ac_tbl_no, nbits << 4);
- if (nbits)
- emit_bits(entropy, entropy->EOBRUN, nbits);
-
- entropy->EOBRUN = 0;
-
- /* Emit any buffered correction bits */
- emit_buffered_bits(entropy, entropy->bit_buffer, entropy->BE);
- entropy->BE = 0;
- }
-}
-
-
-/*
- * Emit a restart marker & resynchronize predictions.
- */
-
-LOCAL(void)
-emit_restart (phuff_entropy_ptr entropy, int restart_num)
-{
- int ci;
-
- emit_eobrun(entropy);
-
- if (! entropy->gather_statistics) {
- flush_bits(entropy);
- emit_byte(entropy, 0xFF);
- emit_byte(entropy, JPEG_RST0 + restart_num);
- }
-
- if (entropy->cinfo->Ss == 0) {
- /* Re-initialize DC predictions to 0 */
- for (ci = 0; ci < entropy->cinfo->comps_in_scan; ci++)
- entropy->last_dc_val[ci] = 0;
- } else {
- /* Re-initialize all AC-related fields to 0 */
- entropy->EOBRUN = 0;
- entropy->BE = 0;
- }
-}
-
-
-/*
- * MCU encoding for DC initial scan (either spectral selection,
- * or first pass of successive approximation).
- */
-
-METHODDEF(boolean)
-encode_mcu_DC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
-{
- phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
- register int temp, temp2;
- register int nbits;
- int blkn, ci;
- int Al = cinfo->Al;
- JBLOCKROW block;
- jpeg_component_info * compptr;
- ISHIFT_TEMPS
-
- entropy->next_output_byte = cinfo->dest->next_output_byte;
- entropy->free_in_buffer = cinfo->dest->free_in_buffer;
-
- /* Emit restart marker if needed */
- if (cinfo->restart_interval)
- if (entropy->restarts_to_go == 0)
- emit_restart(entropy, entropy->next_restart_num);
-
- /* Encode the MCU data blocks */
- for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
- block = MCU_data[blkn];
- ci = cinfo->MCU_membership[blkn];
- compptr = cinfo->cur_comp_info[ci];
-
- /* Compute the DC value after the required point transform by Al.
- * This is simply an arithmetic right shift.
- */
- temp2 = IRIGHT_SHIFT((int) ((*block)[0]), Al);
-
- /* DC differences are figured on the point-transformed values. */
- temp = temp2 - entropy->last_dc_val[ci];
- entropy->last_dc_val[ci] = temp2;
-
- /* Encode the DC coefficient difference per section G.1.2.1 */
- temp2 = temp;
- if (temp < 0) {
- temp = -temp; /* temp is abs value of input */
- /* For a negative input, want temp2 = bitwise complement of abs(input) */
- /* This code assumes we are on a two's complement machine */
- temp2--;
- }
-
- /* Find the number of bits needed for the magnitude of the coefficient */
- nbits = 0;
- while (temp) {
- nbits++;
- temp >>= 1;
- }
- /* Check for out-of-range coefficient values.
- * Since we're encoding a difference, the range limit is twice as much.
- */
- if (nbits > MAX_COEF_BITS+1)
- ERREXIT(cinfo, JERR_BAD_DCT_COEF);
-
- /* Count/emit the Huffman-coded symbol for the number of bits */
- emit_symbol(entropy, compptr->dc_tbl_no, nbits);
-
- /* Emit that number of bits of the value, if positive, */
- /* or the complement of its magnitude, if negative. */
- if (nbits) /* emit_bits rejects calls with size 0 */
- emit_bits(entropy, (unsigned int) temp2, nbits);
- }
-
- cinfo->dest->next_output_byte = entropy->next_output_byte;
- cinfo->dest->free_in_buffer = entropy->free_in_buffer;
-
- /* Update restart-interval state too */
- if (cinfo->restart_interval) {
- if (entropy->restarts_to_go == 0) {
- entropy->restarts_to_go = cinfo->restart_interval;
- entropy->next_restart_num++;
- entropy->next_restart_num &= 7;
- }
- entropy->restarts_to_go--;
- }
-
- return TRUE;
-}
-
-
-/*
- * MCU encoding for AC initial scan (either spectral selection,
- * or first pass of successive approximation).
- */
-
-METHODDEF(boolean)
-encode_mcu_AC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
-{
- phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
- register int temp, temp2;
- register int nbits;
- register int r, k;
- int Se = cinfo->Se;
- int Al = cinfo->Al;
- JBLOCKROW block;
-
- entropy->next_output_byte = cinfo->dest->next_output_byte;
- entropy->free_in_buffer = cinfo->dest->free_in_buffer;
-
- /* Emit restart marker if needed */
- if (cinfo->restart_interval)
- if (entropy->restarts_to_go == 0)
- emit_restart(entropy, entropy->next_restart_num);
-
- /* Encode the MCU data block */
- block = MCU_data[0];
-
- /* Encode the AC coefficients per section G.1.2.2, fig. G.3 */
-
- r = 0; /* r = run length of zeros */
-
- for (k = cinfo->Ss; k <= Se; k++) {
- if ((temp = (*block)[jpeg_natural_order[k]]) == 0) {
- r++;
- continue;
- }
- /* We must apply the point transform by Al. For AC coefficients this
- * is an integer division with rounding towards 0. To do this portably
- * in C, we shift after obtaining the absolute value; so the code is
- * interwoven with finding the abs value (temp) and output bits (temp2).
- */
- if (temp < 0) {
- temp = -temp; /* temp is abs value of input */
- temp >>= Al; /* apply the point transform */
- /* For a negative coef, want temp2 = bitwise complement of abs(coef) */
- temp2 = ~temp;
- } else {
- temp >>= Al; /* apply the point transform */
- temp2 = temp;
- }
- /* Watch out for case that nonzero coef is zero after point transform */
- if (temp == 0) {
- r++;
- continue;
- }
-
- /* Emit any pending EOBRUN */
- if (entropy->EOBRUN > 0)
- emit_eobrun(entropy);
- /* if run length > 15, must emit special run-length-16 codes (0xF0) */
- while (r > 15) {
- emit_symbol(entropy, entropy->ac_tbl_no, 0xF0);
- r -= 16;
- }
-
- /* Find the number of bits needed for the magnitude of the coefficient */
- nbits = 1; /* there must be at least one 1 bit */
- while ((temp >>= 1))
- nbits++;
- /* Check for out-of-range coefficient values */
- if (nbits > MAX_COEF_BITS)
- ERREXIT(cinfo, JERR_BAD_DCT_COEF);
-
- /* Count/emit Huffman symbol for run length / number of bits */
- emit_symbol(entropy, entropy->ac_tbl_no, (r << 4) + nbits);
-
- /* Emit that number of bits of the value, if positive, */
- /* or the complement of its magnitude, if negative. */
- emit_bits(entropy, (unsigned int) temp2, nbits);
-
- r = 0; /* reset zero run length */
- }
-
- if (r > 0) { /* If there are trailing zeroes, */
- entropy->EOBRUN++; /* count an EOB */
- if (entropy->EOBRUN == 0x7FFF)
- emit_eobrun(entropy); /* force it out to avoid overflow */
- }
-
- cinfo->dest->next_output_byte = entropy->next_output_byte;
- cinfo->dest->free_in_buffer = entropy->free_in_buffer;
-
- /* Update restart-interval state too */
- if (cinfo->restart_interval) {
- if (entropy->restarts_to_go == 0) {
- entropy->restarts_to_go = cinfo->restart_interval;
- entropy->next_restart_num++;
- entropy->next_restart_num &= 7;
- }
- entropy->restarts_to_go--;
- }
-
- return TRUE;
-}
-
-
-/*
- * MCU encoding for DC successive approximation refinement scan.
- * Note: we assume such scans can be multi-component, although the spec
- * is not very clear on the point.
- */
-
-METHODDEF(boolean)
-encode_mcu_DC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
-{
- phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
- register int temp;
- int blkn;
- int Al = cinfo->Al;
- JBLOCKROW block;
-
- entropy->next_output_byte = cinfo->dest->next_output_byte;
- entropy->free_in_buffer = cinfo->dest->free_in_buffer;
-
- /* Emit restart marker if needed */
- if (cinfo->restart_interval)
- if (entropy->restarts_to_go == 0)
- emit_restart(entropy, entropy->next_restart_num);
-
- /* Encode the MCU data blocks */
- for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
- block = MCU_data[blkn];
-
- /* We simply emit the Al'th bit of the DC coefficient value. */
- temp = (*block)[0];
- emit_bits(entropy, (unsigned int) (temp >> Al), 1);
- }
-
- cinfo->dest->next_output_byte = entropy->next_output_byte;
- cinfo->dest->free_in_buffer = entropy->free_in_buffer;
-
- /* Update restart-interval state too */
- if (cinfo->restart_interval) {
- if (entropy->restarts_to_go == 0) {
- entropy->restarts_to_go = cinfo->restart_interval;
- entropy->next_restart_num++;
- entropy->next_restart_num &= 7;
- }
- entropy->restarts_to_go--;
- }
-
- return TRUE;
-}
-
-
-/*
- * MCU encoding for AC successive approximation refinement scan.
- */
-
-METHODDEF(boolean)
-encode_mcu_AC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
-{
- phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
- register int temp;
- register int r, k;
- int EOB;
- char *BR_buffer;
- unsigned int BR;
- int Se = cinfo->Se;
- int Al = cinfo->Al;
- JBLOCKROW block;
- int absvalues[DCTSIZE2];
-
- entropy->next_output_byte = cinfo->dest->next_output_byte;
- entropy->free_in_buffer = cinfo->dest->free_in_buffer;
-
- /* Emit restart marker if needed */
- if (cinfo->restart_interval)
- if (entropy->restarts_to_go == 0)
- emit_restart(entropy, entropy->next_restart_num);
-
- /* Encode the MCU data block */
- block = MCU_data[0];
-
- /* It is convenient to make a pre-pass to determine the transformed
- * coefficients' absolute values and the EOB position.
- */
- EOB = 0;
- for (k = cinfo->Ss; k <= Se; k++) {
- temp = (*block)[jpeg_natural_order[k]];
- /* We must apply the point transform by Al. For AC coefficients this
- * is an integer division with rounding towards 0. To do this portably
- * in C, we shift after obtaining the absolute value.
- */
- if (temp < 0)
- temp = -temp; /* temp is abs value of input */
- temp >>= Al; /* apply the point transform */
- absvalues[k] = temp; /* save abs value for main pass */
- if (temp == 1)
- EOB = k; /* EOB = index of last newly-nonzero coef */
- }
-
- /* Encode the AC coefficients per section G.1.2.3, fig. G.7 */
-
- r = 0; /* r = run length of zeros */
- BR = 0; /* BR = count of buffered bits added now */
- BR_buffer = entropy->bit_buffer + entropy->BE; /* Append bits to buffer */
-
- for (k = cinfo->Ss; k <= Se; k++) {
- if ((temp = absvalues[k]) == 0) {
- r++;
- continue;
- }
-
- /* Emit any required ZRLs, but not if they can be folded into EOB */
- while (r > 15 && k <= EOB) {
- /* emit any pending EOBRUN and the BE correction bits */
- emit_eobrun(entropy);
- /* Emit ZRL */
- emit_symbol(entropy, entropy->ac_tbl_no, 0xF0);
- r -= 16;
- /* Emit buffered correction bits that must be associated with ZRL */
- emit_buffered_bits(entropy, BR_buffer, BR);
- BR_buffer = entropy->bit_buffer; /* BE bits are gone now */
- BR = 0;
- }
-
- /* If the coef was previously nonzero, it only needs a correction bit.
- * NOTE: a straight translation of the spec's figure G.7 would suggest
- * that we also need to test r > 15. But if r > 15, we can only get here
- * if k > EOB, which implies that this coefficient is not 1.
- */
- if (temp > 1) {
- /* The correction bit is the next bit of the absolute value. */
- BR_buffer[BR++] = (char) (temp & 1);
- continue;
- }
-
- /* Emit any pending EOBRUN and the BE correction bits */
- emit_eobrun(entropy);
-
- /* Count/emit Huffman symbol for run length / number of bits */
- emit_symbol(entropy, entropy->ac_tbl_no, (r << 4) + 1);
-
- /* Emit output bit for newly-nonzero coef */
- temp = ((*block)[jpeg_natural_order[k]] < 0) ? 0 : 1;
- emit_bits(entropy, (unsigned int) temp, 1);
-
- /* Emit buffered correction bits that must be associated with this code */
- emit_buffered_bits(entropy, BR_buffer, BR);
- BR_buffer = entropy->bit_buffer; /* BE bits are gone now */
- BR = 0;
- r = 0; /* reset zero run length */
- }
-
- if (r > 0 || BR > 0) { /* If there are trailing zeroes, */
- entropy->EOBRUN++; /* count an EOB */
- entropy->BE += BR; /* concat my correction bits to older ones */
- /* We force out the EOB if we risk either:
- * 1. overflow of the EOB counter;
- * 2. overflow of the correction bit buffer during the next MCU.
- */
- if (entropy->EOBRUN == 0x7FFF || entropy->BE > (MAX_CORR_BITS-DCTSIZE2+1))
- emit_eobrun(entropy);
- }
-
- cinfo->dest->next_output_byte = entropy->next_output_byte;
- cinfo->dest->free_in_buffer = entropy->free_in_buffer;
-
- /* Update restart-interval state too */
- if (cinfo->restart_interval) {
- if (entropy->restarts_to_go == 0) {
- entropy->restarts_to_go = cinfo->restart_interval;
- entropy->next_restart_num++;
- entropy->next_restart_num &= 7;
- }
- entropy->restarts_to_go--;
- }
-
- return TRUE;
-}
-
-
-/*
- * Finish up at the end of a Huffman-compressed progressive scan.
- */
-
-METHODDEF(void)
-finish_pass_phuff (j_compress_ptr cinfo)
-{
- phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
-
- entropy->next_output_byte = cinfo->dest->next_output_byte;
- entropy->free_in_buffer = cinfo->dest->free_in_buffer;
-
- /* Flush out any buffered data */
- emit_eobrun(entropy);
- flush_bits(entropy);
-
- cinfo->dest->next_output_byte = entropy->next_output_byte;
- cinfo->dest->free_in_buffer = entropy->free_in_buffer;
-}
-
-
-/*
- * Finish up a statistics-gathering pass and create the new Huffman tables.
- */
-
-METHODDEF(void)
-finish_pass_gather_phuff (j_compress_ptr cinfo)
-{
- phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
- boolean is_DC_band;
- int ci, tbl;
- jpeg_component_info * compptr;
- JHUFF_TBL **htblptr;
- boolean did[NUM_HUFF_TBLS];
-
- /* Flush out buffered data (all we care about is counting the EOB symbol) */
- emit_eobrun(entropy);
-
- is_DC_band = (cinfo->Ss == 0);
-
- /* It's important not to apply jpeg_gen_optimal_table more than once
- * per table, because it clobbers the input frequency counts!
- */
- MEMZERO(did, SIZEOF(did));
-
- for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
- compptr = cinfo->cur_comp_info[ci];
- if (is_DC_band) {
- if (cinfo->Ah != 0) /* DC refinement needs no table */
- continue;
- tbl = compptr->dc_tbl_no;
- } else {
- tbl = compptr->ac_tbl_no;
- }
- if (! did[tbl]) {
- if (is_DC_band)
- htblptr = & cinfo->dc_huff_tbl_ptrs[tbl];
- else
- htblptr = & cinfo->ac_huff_tbl_ptrs[tbl];
- if (*htblptr == NULL)
- *htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo);
- jpeg_gen_optimal_table(cinfo, *htblptr, entropy->count_ptrs[tbl]);
- did[tbl] = TRUE;
- }
- }
-}
-
-
-/*
- * Module initialization routine for progressive Huffman entropy encoding.
- */
-
-GLOBAL(void)
-jinit_phuff_encoder (j_compress_ptr cinfo)
-{
- phuff_entropy_ptr entropy;
- int i;
-
- entropy = (phuff_entropy_ptr)
- (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
- SIZEOF(phuff_entropy_encoder));
- cinfo->entropy = (struct jpeg_entropy_encoder *) entropy;
- entropy->pub.start_pass = start_pass_phuff;
-
- /* Mark tables unallocated */
- for (i = 0; i < NUM_HUFF_TBLS; i++) {
- entropy->derived_tbls[i] = NULL;
- entropy->count_ptrs[i] = NULL;
- }
- entropy->bit_buffer = NULL; /* needed only in AC refinement scan */
-}
-
-#endif /* C_PROGRESSIVE_SUPPORTED */
-
-#endif //_FX_JPEG_TURBO_
+#if !defined(_FX_JPEG_TURBO_)
+/*
+ * jcphuff.c
+ *
+ * Copyright (C) 1995-1997, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains Huffman entropy encoding routines for progressive JPEG.
+ *
+ * We do not support output suspension in this module, since the library
+ * currently does not allow multiple-scan files to be written with output
+ * suspension.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+#include "jchuff.h" /* Declarations shared with jchuff.c */
+
+#ifdef C_PROGRESSIVE_SUPPORTED
+
+/* Expanded entropy encoder object for progressive Huffman encoding. */
+
+typedef struct {
+ struct jpeg_entropy_encoder pub; /* public fields */
+
+ /* Mode flag: TRUE for optimization, FALSE for actual data output */
+ boolean gather_statistics;
+
+ /* Bit-level coding status.
+ * next_output_byte/free_in_buffer are local copies of cinfo->dest fields.
+ */
+ JOCTET * next_output_byte; /* => next byte to write in buffer */
+ size_t free_in_buffer; /* # of byte spaces remaining in buffer */
+ INT32 put_buffer; /* current bit-accumulation buffer */
+ int put_bits; /* # of bits now in it */
+ j_compress_ptr cinfo; /* link to cinfo (needed for dump_buffer) */
+
+ /* Coding status for DC components */
+ int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */
+
+ /* Coding status for AC components */
+ int ac_tbl_no; /* the table number of the single component */
+ unsigned int EOBRUN; /* run length of EOBs */
+ unsigned int BE; /* # of buffered correction bits before MCU */
+ char * bit_buffer; /* buffer for correction bits (1 per char) */
+ /* packing correction bits tightly would save some space but cost time... */
+
+ unsigned int restarts_to_go; /* MCUs left in this restart interval */
+ int next_restart_num; /* next restart number to write (0-7) */
+
+ /* Pointers to derived tables (these workspaces have image lifespan).
+ * Since any one scan codes only DC or only AC, we only need one set
+ * of tables, not one for DC and one for AC.
+ */
+ c_derived_tbl * derived_tbls[NUM_HUFF_TBLS];
+
+ /* Statistics tables for optimization; again, one set is enough */
+ long * count_ptrs[NUM_HUFF_TBLS];
+} phuff_entropy_encoder;
+
+typedef phuff_entropy_encoder * phuff_entropy_ptr;
+
+/* MAX_CORR_BITS is the number of bits the AC refinement correction-bit
+ * buffer can hold. Larger sizes may slightly improve compression, but
+ * 1000 is already well into the realm of overkill.
+ * The minimum safe size is 64 bits.
+ */
+
+#define MAX_CORR_BITS 1000 /* Max # of correction bits I can buffer */
+
+/* IRIGHT_SHIFT is like RIGHT_SHIFT, but works on int rather than INT32.
+ * We assume that int right shift is unsigned if INT32 right shift is,
+ * which should be safe.
+ */
+
+#ifdef RIGHT_SHIFT_IS_UNSIGNED
+#define ISHIFT_TEMPS int ishift_temp;
+#define IRIGHT_SHIFT(x,shft) \
+ ((ishift_temp = (x)) < 0 ? \
+ (ishift_temp >> (shft)) | ((~0) << (16-(shft))) : \
+ (ishift_temp >> (shft)))
+#else
+#define ISHIFT_TEMPS
+#define IRIGHT_SHIFT(x,shft) ((x) >> (shft))
+#endif
+
+/* Forward declarations */
+METHODDEF(boolean) encode_mcu_DC_first JPP((j_compress_ptr cinfo,
+ JBLOCKROW *MCU_data));
+METHODDEF(boolean) encode_mcu_AC_first JPP((j_compress_ptr cinfo,
+ JBLOCKROW *MCU_data));
+METHODDEF(boolean) encode_mcu_DC_refine JPP((j_compress_ptr cinfo,
+ JBLOCKROW *MCU_data));
+METHODDEF(boolean) encode_mcu_AC_refine JPP((j_compress_ptr cinfo,
+ JBLOCKROW *MCU_data));
+METHODDEF(void) finish_pass_phuff JPP((j_compress_ptr cinfo));
+METHODDEF(void) finish_pass_gather_phuff JPP((j_compress_ptr cinfo));
+
+
+/*
+ * Initialize for a Huffman-compressed scan using progressive JPEG.
+ */
+
+METHODDEF(void)
+start_pass_phuff (j_compress_ptr cinfo, boolean gather_statistics)
+{
+ phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
+ boolean is_DC_band;
+ int ci, tbl;
+ jpeg_component_info * compptr;
+
+ entropy->cinfo = cinfo;
+ entropy->gather_statistics = gather_statistics;
+
+ is_DC_band = (cinfo->Ss == 0);
+
+ /* We assume jcmaster.c already validated the scan parameters. */
+
+ /* Select execution routines */
+ if (cinfo->Ah == 0) {
+ if (is_DC_band)
+ entropy->pub.encode_mcu = encode_mcu_DC_first;
+ else
+ entropy->pub.encode_mcu = encode_mcu_AC_first;
+ } else {
+ if (is_DC_band)
+ entropy->pub.encode_mcu = encode_mcu_DC_refine;
+ else {
+ entropy->pub.encode_mcu = encode_mcu_AC_refine;
+ /* AC refinement needs a correction bit buffer */
+ if (entropy->bit_buffer == NULL)
+ entropy->bit_buffer = (char *)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ MAX_CORR_BITS * SIZEOF(char));
+ }
+ }
+ if (gather_statistics)
+ entropy->pub.finish_pass = finish_pass_gather_phuff;
+ else
+ entropy->pub.finish_pass = finish_pass_phuff;
+
+ /* Only DC coefficients may be interleaved, so cinfo->comps_in_scan = 1
+ * for AC coefficients.
+ */
+ for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
+ compptr = cinfo->cur_comp_info[ci];
+ /* Initialize DC predictions to 0 */
+ entropy->last_dc_val[ci] = 0;
+ /* Get table index */
+ if (is_DC_band) {
+ if (cinfo->Ah != 0) /* DC refinement needs no table */
+ continue;
+ tbl = compptr->dc_tbl_no;
+ } else {
+ entropy->ac_tbl_no = tbl = compptr->ac_tbl_no;
+ }
+ if (gather_statistics) {
+ /* Check for invalid table index */
+ /* (make_c_derived_tbl does this in the other path) */
+ if (tbl < 0 || tbl >= NUM_HUFF_TBLS)
+ ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tbl);
+ /* Allocate and zero the statistics tables */
+ /* Note that jpeg_gen_optimal_table expects 257 entries in each table! */
+ if (entropy->count_ptrs[tbl] == NULL)
+ entropy->count_ptrs[tbl] = (long *)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ 257 * SIZEOF(long));
+ MEMZERO(entropy->count_ptrs[tbl], 257 * SIZEOF(long));
+ } else {
+ /* Compute derived values for Huffman table */
+ /* We may do this more than once for a table, but it's not expensive */
+ jpeg_make_c_derived_tbl(cinfo, is_DC_band, tbl,
+ & entropy->derived_tbls[tbl]);
+ }
+ }
+
+ /* Initialize AC stuff */
+ entropy->EOBRUN = 0;
+ entropy->BE = 0;
+
+ /* Initialize bit buffer to empty */
+ entropy->put_buffer = 0;
+ entropy->put_bits = 0;
+
+ /* Initialize restart stuff */
+ entropy->restarts_to_go = cinfo->restart_interval;
+ entropy->next_restart_num = 0;
+}
+
+
+/* Outputting bytes to the file.
+ * NB: these must be called only when actually outputting,
+ * that is, entropy->gather_statistics == FALSE.
+ */
+
+/* Emit a byte */
+#define emit_byte(entropy,val) \
+ { *(entropy)->next_output_byte++ = (JOCTET) (val); \
+ if (--(entropy)->free_in_buffer == 0) \
+ dump_buffer(entropy); }
+
+
+LOCAL(void)
+dump_buffer (phuff_entropy_ptr entropy)
+/* Empty the output buffer; we do not support suspension in this module. */
+{
+ struct jpeg_destination_mgr * dest = entropy->cinfo->dest;
+
+ if (! (*dest->empty_output_buffer) (entropy->cinfo))
+ ERREXIT(entropy->cinfo, JERR_CANT_SUSPEND);
+ /* After a successful buffer dump, must reset buffer pointers */
+ entropy->next_output_byte = dest->next_output_byte;
+ entropy->free_in_buffer = dest->free_in_buffer;
+}
+
+
+/* Outputting bits to the file */
+
+/* Only the right 24 bits of put_buffer are used; the valid bits are
+ * left-justified in this part. At most 16 bits can be passed to emit_bits
+ * in one call, and we never retain more than 7 bits in put_buffer
+ * between calls, so 24 bits are sufficient.
+ */
+
+INLINE
+LOCAL(void)
+emit_bits (phuff_entropy_ptr entropy, unsigned int code, int size)
+/* Emit some bits, unless we are in gather mode */
+{
+ /* This routine is heavily used, so it's worth coding tightly. */
+ register INT32 put_buffer = (INT32) code;
+ register int put_bits = entropy->put_bits;
+
+ /* if size is 0, caller used an invalid Huffman table entry */
+ if (size == 0)
+ ERREXIT(entropy->cinfo, JERR_HUFF_MISSING_CODE);
+
+ if (entropy->gather_statistics)
+ return; /* do nothing if we're only getting stats */
+
+ put_buffer &= (((INT32) 1)<<size) - 1; /* mask off any extra bits in code */
+
+ put_bits += size; /* new number of bits in buffer */
+
+ put_buffer <<= 24 - put_bits; /* align incoming bits */
+
+ put_buffer |= entropy->put_buffer; /* and merge with old buffer contents */
+
+ while (put_bits >= 8) {
+ int c = (int) ((put_buffer >> 16) & 0xFF);
+
+ emit_byte(entropy, c);
+ if (c == 0xFF) { /* need to stuff a zero byte? */
+ emit_byte(entropy, 0);
+ }
+ put_buffer <<= 8;
+ put_bits -= 8;
+ }
+
+ entropy->put_buffer = put_buffer; /* update variables */
+ entropy->put_bits = put_bits;
+}
+
+
+LOCAL(void)
+flush_bits (phuff_entropy_ptr entropy)
+{
+ emit_bits(entropy, 0x7F, 7); /* fill any partial byte with ones */
+ entropy->put_buffer = 0; /* and reset bit-buffer to empty */
+ entropy->put_bits = 0;
+}
+
+
+/*
+ * Emit (or just count) a Huffman symbol.
+ */
+
+INLINE
+LOCAL(void)
+emit_symbol (phuff_entropy_ptr entropy, int tbl_no, int symbol)
+{
+ if (entropy->gather_statistics)
+ entropy->count_ptrs[tbl_no][symbol]++;
+ else {
+ c_derived_tbl * tbl = entropy->derived_tbls[tbl_no];
+ emit_bits(entropy, tbl->ehufco[symbol], tbl->ehufsi[symbol]);
+ }
+}
+
+
+/*
+ * Emit bits from a correction bit buffer.
+ */
+
+LOCAL(void)
+emit_buffered_bits (phuff_entropy_ptr entropy, char * bufstart,
+ unsigned int nbits)
+{
+ if (entropy->gather_statistics)
+ return; /* no real work */
+
+ while (nbits > 0) {
+ emit_bits(entropy, (unsigned int) (*bufstart), 1);
+ bufstart++;
+ nbits--;
+ }
+}
+
+
+/*
+ * Emit any pending EOBRUN symbol.
+ */
+
+LOCAL(void)
+emit_eobrun (phuff_entropy_ptr entropy)
+{
+ register int temp, nbits;
+
+ if (entropy->EOBRUN > 0) { /* if there is any pending EOBRUN */
+ temp = entropy->EOBRUN;
+ nbits = 0;
+ while ((temp >>= 1))
+ nbits++;
+ /* safety check: shouldn't happen given limited correction-bit buffer */
+ if (nbits > 14)
+ ERREXIT(entropy->cinfo, JERR_HUFF_MISSING_CODE);
+
+ emit_symbol(entropy, entropy->ac_tbl_no, nbits << 4);
+ if (nbits)
+ emit_bits(entropy, entropy->EOBRUN, nbits);
+
+ entropy->EOBRUN = 0;
+
+ /* Emit any buffered correction bits */
+ emit_buffered_bits(entropy, entropy->bit_buffer, entropy->BE);
+ entropy->BE = 0;
+ }
+}
+
+
+/*
+ * Emit a restart marker & resynchronize predictions.
+ */
+
+LOCAL(void)
+emit_restart (phuff_entropy_ptr entropy, int restart_num)
+{
+ int ci;
+
+ emit_eobrun(entropy);
+
+ if (! entropy->gather_statistics) {
+ flush_bits(entropy);
+ emit_byte(entropy, 0xFF);
+ emit_byte(entropy, JPEG_RST0 + restart_num);
+ }
+
+ if (entropy->cinfo->Ss == 0) {
+ /* Re-initialize DC predictions to 0 */
+ for (ci = 0; ci < entropy->cinfo->comps_in_scan; ci++)
+ entropy->last_dc_val[ci] = 0;
+ } else {
+ /* Re-initialize all AC-related fields to 0 */
+ entropy->EOBRUN = 0;
+ entropy->BE = 0;
+ }
+}
+
+
+/*
+ * MCU encoding for DC initial scan (either spectral selection,
+ * or first pass of successive approximation).
+ */
+
+METHODDEF(boolean)
+encode_mcu_DC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
+{
+ phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
+ register int temp, temp2;
+ register int nbits;
+ int blkn, ci;
+ int Al = cinfo->Al;
+ JBLOCKROW block;
+ jpeg_component_info * compptr;
+ ISHIFT_TEMPS
+
+ entropy->next_output_byte = cinfo->dest->next_output_byte;
+ entropy->free_in_buffer = cinfo->dest->free_in_buffer;
+
+ /* Emit restart marker if needed */
+ if (cinfo->restart_interval)
+ if (entropy->restarts_to_go == 0)
+ emit_restart(entropy, entropy->next_restart_num);
+
+ /* Encode the MCU data blocks */
+ for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
+ block = MCU_data[blkn];
+ ci = cinfo->MCU_membership[blkn];
+ compptr = cinfo->cur_comp_info[ci];
+
+ /* Compute the DC value after the required point transform by Al.
+ * This is simply an arithmetic right shift.
+ */
+ temp2 = IRIGHT_SHIFT((int) ((*block)[0]), Al);
+
+ /* DC differences are figured on the point-transformed values. */
+ temp = temp2 - entropy->last_dc_val[ci];
+ entropy->last_dc_val[ci] = temp2;
+
+ /* Encode the DC coefficient difference per section G.1.2.1 */
+ temp2 = temp;
+ if (temp < 0) {
+ temp = -temp; /* temp is abs value of input */
+ /* For a negative input, want temp2 = bitwise complement of abs(input) */
+ /* This code assumes we are on a two's complement machine */
+ temp2--;
+ }
+
+ /* Find the number of bits needed for the magnitude of the coefficient */
+ nbits = 0;
+ while (temp) {
+ nbits++;
+ temp >>= 1;
+ }
+ /* Check for out-of-range coefficient values.
+ * Since we're encoding a difference, the range limit is twice as much.
+ */
+ if (nbits > MAX_COEF_BITS+1)
+ ERREXIT(cinfo, JERR_BAD_DCT_COEF);
+
+ /* Count/emit the Huffman-coded symbol for the number of bits */
+ emit_symbol(entropy, compptr->dc_tbl_no, nbits);
+
+ /* Emit that number of bits of the value, if positive, */
+ /* or the complement of its magnitude, if negative. */
+ if (nbits) /* emit_bits rejects calls with size 0 */
+ emit_bits(entropy, (unsigned int) temp2, nbits);
+ }
+
+ cinfo->dest->next_output_byte = entropy->next_output_byte;
+ cinfo->dest->free_in_buffer = entropy->free_in_buffer;
+
+ /* Update restart-interval state too */
+ if (cinfo->restart_interval) {
+ if (entropy->restarts_to_go == 0) {
+ entropy->restarts_to_go = cinfo->restart_interval;
+ entropy->next_restart_num++;
+ entropy->next_restart_num &= 7;
+ }
+ entropy->restarts_to_go--;
+ }
+
+ return TRUE;
+}
+
+
+/*
+ * MCU encoding for AC initial scan (either spectral selection,
+ * or first pass of successive approximation).
+ */
+
+METHODDEF(boolean)
+encode_mcu_AC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
+{
+ phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
+ register int temp, temp2;
+ register int nbits;
+ register int r, k;
+ int Se = cinfo->Se;
+ int Al = cinfo->Al;
+ JBLOCKROW block;
+
+ entropy->next_output_byte = cinfo->dest->next_output_byte;
+ entropy->free_in_buffer = cinfo->dest->free_in_buffer;
+
+ /* Emit restart marker if needed */
+ if (cinfo->restart_interval)
+ if (entropy->restarts_to_go == 0)
+ emit_restart(entropy, entropy->next_restart_num);
+
+ /* Encode the MCU data block */
+ block = MCU_data[0];
+
+ /* Encode the AC coefficients per section G.1.2.2, fig. G.3 */
+
+ r = 0; /* r = run length of zeros */
+
+ for (k = cinfo->Ss; k <= Se; k++) {
+ if ((temp = (*block)[jpeg_natural_order[k]]) == 0) {
+ r++;
+ continue;
+ }
+ /* We must apply the point transform by Al. For AC coefficients this
+ * is an integer division with rounding towards 0. To do this portably
+ * in C, we shift after obtaining the absolute value; so the code is
+ * interwoven with finding the abs value (temp) and output bits (temp2).
+ */
+ if (temp < 0) {
+ temp = -temp; /* temp is abs value of input */
+ temp >>= Al; /* apply the point transform */
+ /* For a negative coef, want temp2 = bitwise complement of abs(coef) */
+ temp2 = ~temp;
+ } else {
+ temp >>= Al; /* apply the point transform */
+ temp2 = temp;
+ }
+ /* Watch out for case that nonzero coef is zero after point transform */
+ if (temp == 0) {
+ r++;
+ continue;
+ }
+
+ /* Emit any pending EOBRUN */
+ if (entropy->EOBRUN > 0)
+ emit_eobrun(entropy);
+ /* if run length > 15, must emit special run-length-16 codes (0xF0) */
+ while (r > 15) {
+ emit_symbol(entropy, entropy->ac_tbl_no, 0xF0);
+ r -= 16;
+ }
+
+ /* Find the number of bits needed for the magnitude of the coefficient */
+ nbits = 1; /* there must be at least one 1 bit */
+ while ((temp >>= 1))
+ nbits++;
+ /* Check for out-of-range coefficient values */
+ if (nbits > MAX_COEF_BITS)
+ ERREXIT(cinfo, JERR_BAD_DCT_COEF);
+
+ /* Count/emit Huffman symbol for run length / number of bits */
+ emit_symbol(entropy, entropy->ac_tbl_no, (r << 4) + nbits);
+
+ /* Emit that number of bits of the value, if positive, */
+ /* or the complement of its magnitude, if negative. */
+ emit_bits(entropy, (unsigned int) temp2, nbits);
+
+ r = 0; /* reset zero run length */
+ }
+
+ if (r > 0) { /* If there are trailing zeroes, */
+ entropy->EOBRUN++; /* count an EOB */
+ if (entropy->EOBRUN == 0x7FFF)
+ emit_eobrun(entropy); /* force it out to avoid overflow */
+ }
+
+ cinfo->dest->next_output_byte = entropy->next_output_byte;
+ cinfo->dest->free_in_buffer = entropy->free_in_buffer;
+
+ /* Update restart-interval state too */
+ if (cinfo->restart_interval) {
+ if (entropy->restarts_to_go == 0) {
+ entropy->restarts_to_go = cinfo->restart_interval;
+ entropy->next_restart_num++;
+ entropy->next_restart_num &= 7;
+ }
+ entropy->restarts_to_go--;
+ }
+
+ return TRUE;
+}
+
+
+/*
+ * MCU encoding for DC successive approximation refinement scan.
+ * Note: we assume such scans can be multi-component, although the spec
+ * is not very clear on the point.
+ */
+
+METHODDEF(boolean)
+encode_mcu_DC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
+{
+ phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
+ register int temp;
+ int blkn;
+ int Al = cinfo->Al;
+ JBLOCKROW block;
+
+ entropy->next_output_byte = cinfo->dest->next_output_byte;
+ entropy->free_in_buffer = cinfo->dest->free_in_buffer;
+
+ /* Emit restart marker if needed */
+ if (cinfo->restart_interval)
+ if (entropy->restarts_to_go == 0)
+ emit_restart(entropy, entropy->next_restart_num);
+
+ /* Encode the MCU data blocks */
+ for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
+ block = MCU_data[blkn];
+
+ /* We simply emit the Al'th bit of the DC coefficient value. */
+ temp = (*block)[0];
+ emit_bits(entropy, (unsigned int) (temp >> Al), 1);
+ }
+
+ cinfo->dest->next_output_byte = entropy->next_output_byte;
+ cinfo->dest->free_in_buffer = entropy->free_in_buffer;
+
+ /* Update restart-interval state too */
+ if (cinfo->restart_interval) {
+ if (entropy->restarts_to_go == 0) {
+ entropy->restarts_to_go = cinfo->restart_interval;
+ entropy->next_restart_num++;
+ entropy->next_restart_num &= 7;
+ }
+ entropy->restarts_to_go--;
+ }
+
+ return TRUE;
+}
+
+
+/*
+ * MCU encoding for AC successive approximation refinement scan.
+ */
+
+METHODDEF(boolean)
+encode_mcu_AC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
+{
+ phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
+ register int temp;
+ register int r, k;
+ int EOB;
+ char *BR_buffer;
+ unsigned int BR;
+ int Se = cinfo->Se;
+ int Al = cinfo->Al;
+ JBLOCKROW block;
+ int absvalues[DCTSIZE2];
+
+ entropy->next_output_byte = cinfo->dest->next_output_byte;
+ entropy->free_in_buffer = cinfo->dest->free_in_buffer;
+
+ /* Emit restart marker if needed */
+ if (cinfo->restart_interval)
+ if (entropy->restarts_to_go == 0)
+ emit_restart(entropy, entropy->next_restart_num);
+
+ /* Encode the MCU data block */
+ block = MCU_data[0];
+
+ /* It is convenient to make a pre-pass to determine the transformed
+ * coefficients' absolute values and the EOB position.
+ */
+ EOB = 0;
+ for (k = cinfo->Ss; k <= Se; k++) {
+ temp = (*block)[jpeg_natural_order[k]];
+ /* We must apply the point transform by Al. For AC coefficients this
+ * is an integer division with rounding towards 0. To do this portably
+ * in C, we shift after obtaining the absolute value.
+ */
+ if (temp < 0)
+ temp = -temp; /* temp is abs value of input */
+ temp >>= Al; /* apply the point transform */
+ absvalues[k] = temp; /* save abs value for main pass */
+ if (temp == 1)
+ EOB = k; /* EOB = index of last newly-nonzero coef */
+ }
+
+ /* Encode the AC coefficients per section G.1.2.3, fig. G.7 */
+
+ r = 0; /* r = run length of zeros */
+ BR = 0; /* BR = count of buffered bits added now */
+ BR_buffer = entropy->bit_buffer + entropy->BE; /* Append bits to buffer */
+
+ for (k = cinfo->Ss; k <= Se; k++) {
+ if ((temp = absvalues[k]) == 0) {
+ r++;
+ continue;
+ }
+
+ /* Emit any required ZRLs, but not if they can be folded into EOB */
+ while (r > 15 && k <= EOB) {
+ /* emit any pending EOBRUN and the BE correction bits */
+ emit_eobrun(entropy);
+ /* Emit ZRL */
+ emit_symbol(entropy, entropy->ac_tbl_no, 0xF0);
+ r -= 16;
+ /* Emit buffered correction bits that must be associated with ZRL */
+ emit_buffered_bits(entropy, BR_buffer, BR);
+ BR_buffer = entropy->bit_buffer; /* BE bits are gone now */
+ BR = 0;
+ }
+
+ /* If the coef was previously nonzero, it only needs a correction bit.
+ * NOTE: a straight translation of the spec's figure G.7 would suggest
+ * that we also need to test r > 15. But if r > 15, we can only get here
+ * if k > EOB, which implies that this coefficient is not 1.
+ */
+ if (temp > 1) {
+ /* The correction bit is the next bit of the absolute value. */
+ BR_buffer[BR++] = (char) (temp & 1);
+ continue;
+ }
+
+ /* Emit any pending EOBRUN and the BE correction bits */
+ emit_eobrun(entropy);
+
+ /* Count/emit Huffman symbol for run length / number of bits */
+ emit_symbol(entropy, entropy->ac_tbl_no, (r << 4) + 1);
+
+ /* Emit output bit for newly-nonzero coef */
+ temp = ((*block)[jpeg_natural_order[k]] < 0) ? 0 : 1;
+ emit_bits(entropy, (unsigned int) temp, 1);
+
+ /* Emit buffered correction bits that must be associated with this code */
+ emit_buffered_bits(entropy, BR_buffer, BR);
+ BR_buffer = entropy->bit_buffer; /* BE bits are gone now */
+ BR = 0;
+ r = 0; /* reset zero run length */
+ }
+
+ if (r > 0 || BR > 0) { /* If there are trailing zeroes, */
+ entropy->EOBRUN++; /* count an EOB */
+ entropy->BE += BR; /* concat my correction bits to older ones */
+ /* We force out the EOB if we risk either:
+ * 1. overflow of the EOB counter;
+ * 2. overflow of the correction bit buffer during the next MCU.
+ */
+ if (entropy->EOBRUN == 0x7FFF || entropy->BE > (MAX_CORR_BITS-DCTSIZE2+1))
+ emit_eobrun(entropy);
+ }
+
+ cinfo->dest->next_output_byte = entropy->next_output_byte;
+ cinfo->dest->free_in_buffer = entropy->free_in_buffer;
+
+ /* Update restart-interval state too */
+ if (cinfo->restart_interval) {
+ if (entropy->restarts_to_go == 0) {
+ entropy->restarts_to_go = cinfo->restart_interval;
+ entropy->next_restart_num++;
+ entropy->next_restart_num &= 7;
+ }
+ entropy->restarts_to_go--;
+ }
+
+ return TRUE;
+}
+
+
+/*
+ * Finish up at the end of a Huffman-compressed progressive scan.
+ */
+
+METHODDEF(void)
+finish_pass_phuff (j_compress_ptr cinfo)
+{
+ phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
+
+ entropy->next_output_byte = cinfo->dest->next_output_byte;
+ entropy->free_in_buffer = cinfo->dest->free_in_buffer;
+
+ /* Flush out any buffered data */
+ emit_eobrun(entropy);
+ flush_bits(entropy);
+
+ cinfo->dest->next_output_byte = entropy->next_output_byte;
+ cinfo->dest->free_in_buffer = entropy->free_in_buffer;
+}
+
+
+/*
+ * Finish up a statistics-gathering pass and create the new Huffman tables.
+ */
+
+METHODDEF(void)
+finish_pass_gather_phuff (j_compress_ptr cinfo)
+{
+ phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
+ boolean is_DC_band;
+ int ci, tbl;
+ jpeg_component_info * compptr;
+ JHUFF_TBL **htblptr;
+ boolean did[NUM_HUFF_TBLS];
+
+ /* Flush out buffered data (all we care about is counting the EOB symbol) */
+ emit_eobrun(entropy);
+
+ is_DC_band = (cinfo->Ss == 0);
+
+ /* It's important not to apply jpeg_gen_optimal_table more than once
+ * per table, because it clobbers the input frequency counts!
+ */
+ MEMZERO(did, SIZEOF(did));
+
+ for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
+ compptr = cinfo->cur_comp_info[ci];
+ if (is_DC_band) {
+ if (cinfo->Ah != 0) /* DC refinement needs no table */
+ continue;
+ tbl = compptr->dc_tbl_no;
+ } else {
+ tbl = compptr->ac_tbl_no;
+ }
+ if (! did[tbl]) {
+ if (is_DC_band)
+ htblptr = & cinfo->dc_huff_tbl_ptrs[tbl];
+ else
+ htblptr = & cinfo->ac_huff_tbl_ptrs[tbl];
+ if (*htblptr == NULL)
+ *htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo);
+ jpeg_gen_optimal_table(cinfo, *htblptr, entropy->count_ptrs[tbl]);
+ did[tbl] = TRUE;
+ }
+ }
+}
+
+
+/*
+ * Module initialization routine for progressive Huffman entropy encoding.
+ */
+
+GLOBAL(void)
+jinit_phuff_encoder (j_compress_ptr cinfo)
+{
+ phuff_entropy_ptr entropy;
+ int i;
+
+ entropy = (phuff_entropy_ptr)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ SIZEOF(phuff_entropy_encoder));
+ cinfo->entropy = (struct jpeg_entropy_encoder *) entropy;
+ entropy->pub.start_pass = start_pass_phuff;
+
+ /* Mark tables unallocated */
+ for (i = 0; i < NUM_HUFF_TBLS; i++) {
+ entropy->derived_tbls[i] = NULL;
+ entropy->count_ptrs[i] = NULL;
+ }
+ entropy->bit_buffer = NULL; /* needed only in AC refinement scan */
+}
+
+#endif /* C_PROGRESSIVE_SUPPORTED */
+
+#endif //_FX_JPEG_TURBO_
diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jcprepct.c b/core/src/fxcodec/libjpeg/fpdfapi_jcprepct.c
index 539d87bbae..57f3fc1108 100644
--- a/core/src/fxcodec/libjpeg/fpdfapi_jcprepct.c
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jcprepct.c
@@ -1,357 +1,357 @@
-#if !defined(_FX_JPEG_TURBO_)
-/*
- * jcprepct.c
- *
- * Copyright (C) 1994-1996, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains the compression preprocessing controller.
- * This controller manages the color conversion, downsampling,
- * and edge expansion steps.
- *
- * Most of the complexity here is associated with buffering input rows
- * as required by the downsampler. See the comments at the head of
- * jcsample.c for the downsampler's needs.
- */
-
-#define JPEG_INTERNALS
-#include "jinclude.h"
-#include "jpeglib.h"
-
-
-/* At present, jcsample.c can request context rows only for smoothing.
- * In the future, we might also need context rows for CCIR601 sampling
- * or other more-complex downsampling procedures. The code to support
- * context rows should be compiled only if needed.
- */
-#ifdef INPUT_SMOOTHING_SUPPORTED
-#define CONTEXT_ROWS_SUPPORTED
-#endif
-
-
-/*
- * For the simple (no-context-row) case, we just need to buffer one
- * row group's worth of pixels for the downsampling step. At the bottom of
- * the image, we pad to a full row group by replicating the last pixel row.
- * The downsampler's last output row is then replicated if needed to pad
- * out to a full iMCU row.
- *
- * When providing context rows, we must buffer three row groups' worth of
- * pixels. Three row groups are physically allocated, but the row pointer
- * arrays are made five row groups high, with the extra pointers above and
- * below "wrapping around" to point to the last and first real row groups.
- * This allows the downsampler to access the proper context rows.
- * At the top and bottom of the image, we create dummy context rows by
- * copying the first or last real pixel row. This copying could be avoided
- * by pointer hacking as is done in jdmainct.c, but it doesn't seem worth the
- * trouble on the compression side.
- */
-
-
-/* Private buffer controller object */
-
-typedef struct {
- struct jpeg_c_prep_controller pub; /* public fields */
-
- /* Downsampling input buffer. This buffer holds color-converted data
- * until we have enough to do a downsample step.
- */
- JSAMPARRAY color_buf[MAX_COMPONENTS];
-
- JDIMENSION rows_to_go; /* counts rows remaining in source image */
- int next_buf_row; /* index of next row to store in color_buf */
-
-#ifdef CONTEXT_ROWS_SUPPORTED /* only needed for context case */
- int this_row_group; /* starting row index of group to process */
- int next_buf_stop; /* downsample when we reach this index */
-#endif
-} my_prep_controller;
-
-typedef my_prep_controller * my_prep_ptr;
-
-
-/*
- * Initialize for a processing pass.
- */
-
-METHODDEF(void)
-start_pass_prep (j_compress_ptr cinfo, J_BUF_MODE pass_mode)
-{
- my_prep_ptr prep = (my_prep_ptr) cinfo->prep;
-
- if (pass_mode != JBUF_PASS_THRU)
- ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
-
- /* Initialize total-height counter for detecting bottom of image */
- prep->rows_to_go = cinfo->image_height;
- /* Mark the conversion buffer empty */
- prep->next_buf_row = 0;
-#ifdef CONTEXT_ROWS_SUPPORTED
- /* Preset additional state variables for context mode.
- * These aren't used in non-context mode, so we needn't test which mode.
- */
- prep->this_row_group = 0;
- /* Set next_buf_stop to stop after two row groups have been read in. */
- prep->next_buf_stop = 2 * cinfo->max_v_samp_factor;
-#endif
-}
-
-
-/*
- * Expand an image vertically from height input_rows to height output_rows,
- * by duplicating the bottom row.
- */
-
-LOCAL(void)
-expand_bottom_edge (JSAMPARRAY image_data, JDIMENSION num_cols,
- int input_rows, int output_rows)
-{
- register int row;
-
- for (row = input_rows; row < output_rows; row++) {
- jcopy_sample_rows(image_data, input_rows-1, image_data, row,
- 1, num_cols);
- }
-}
-
-
-/*
- * Process some data in the simple no-context case.
- *
- * Preprocessor output data is counted in "row groups". A row group
- * is defined to be v_samp_factor sample rows of each component.
- * Downsampling will produce this much data from each max_v_samp_factor
- * input rows.
- */
-
-METHODDEF(void)
-pre_process_data (j_compress_ptr cinfo,
- JSAMPARRAY input_buf, JDIMENSION *in_row_ctr,
- JDIMENSION in_rows_avail,
- JSAMPIMAGE output_buf, JDIMENSION *out_row_group_ctr,
- JDIMENSION out_row_groups_avail)
-{
- my_prep_ptr prep = (my_prep_ptr) cinfo->prep;
- int numrows, ci;
- JDIMENSION inrows;
- jpeg_component_info * compptr;
-
- while (*in_row_ctr < in_rows_avail &&
- *out_row_group_ctr < out_row_groups_avail) {
- /* Do color conversion to fill the conversion buffer. */
- inrows = in_rows_avail - *in_row_ctr;
- numrows = cinfo->max_v_samp_factor - prep->next_buf_row;
- numrows = (int) MIN((JDIMENSION) numrows, inrows);
- (*cinfo->cconvert->color_convert) (cinfo, input_buf + *in_row_ctr,
- prep->color_buf,
- (JDIMENSION) prep->next_buf_row,
- numrows);
- *in_row_ctr += numrows;
- prep->next_buf_row += numrows;
- prep->rows_to_go -= numrows;
- /* If at bottom of image, pad to fill the conversion buffer. */
- if (prep->rows_to_go == 0 &&
- prep->next_buf_row < cinfo->max_v_samp_factor) {
- for (ci = 0; ci < cinfo->num_components; ci++) {
- expand_bottom_edge(prep->color_buf[ci], cinfo->image_width,
- prep->next_buf_row, cinfo->max_v_samp_factor);
- }
- prep->next_buf_row = cinfo->max_v_samp_factor;
- }
- /* If we've filled the conversion buffer, empty it. */
- if (prep->next_buf_row == cinfo->max_v_samp_factor) {
- (*cinfo->downsample->downsample) (cinfo,
- prep->color_buf, (JDIMENSION) 0,
- output_buf, *out_row_group_ctr);
- prep->next_buf_row = 0;
- (*out_row_group_ctr)++;
- }
- /* If at bottom of image, pad the output to a full iMCU height.
- * Note we assume the caller is providing a one-iMCU-height output buffer!
- */
- if (prep->rows_to_go == 0 &&
- *out_row_group_ctr < out_row_groups_avail) {
- for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
- ci++, compptr++) {
- expand_bottom_edge(output_buf[ci],
- compptr->width_in_blocks * DCTSIZE,
- (int) (*out_row_group_ctr * compptr->v_samp_factor),
- (int) (out_row_groups_avail * compptr->v_samp_factor));
- }
- *out_row_group_ctr = out_row_groups_avail;
- break; /* can exit outer loop without test */
- }
- }
-}
-
-
-#ifdef CONTEXT_ROWS_SUPPORTED
-
-/*
- * Process some data in the context case.
- */
-
-METHODDEF(void)
-pre_process_context (j_compress_ptr cinfo,
- JSAMPARRAY input_buf, JDIMENSION *in_row_ctr,
- JDIMENSION in_rows_avail,
- JSAMPIMAGE output_buf, JDIMENSION *out_row_group_ctr,
- JDIMENSION out_row_groups_avail)
-{
- my_prep_ptr prep = (my_prep_ptr) cinfo->prep;
- int numrows, ci;
- int buf_height = cinfo->max_v_samp_factor * 3;
- JDIMENSION inrows;
-
- while (*out_row_group_ctr < out_row_groups_avail) {
- if (*in_row_ctr < in_rows_avail) {
- /* Do color conversion to fill the conversion buffer. */
- inrows = in_rows_avail - *in_row_ctr;
- numrows = prep->next_buf_stop - prep->next_buf_row;
- numrows = (int) MIN((JDIMENSION) numrows, inrows);
- (*cinfo->cconvert->color_convert) (cinfo, input_buf + *in_row_ctr,
- prep->color_buf,
- (JDIMENSION) prep->next_buf_row,
- numrows);
- /* Pad at top of image, if first time through */
- if (prep->rows_to_go == cinfo->image_height) {
- for (ci = 0; ci < cinfo->num_components; ci++) {
- int row;
- for (row = 1; row <= cinfo->max_v_samp_factor; row++) {
- jcopy_sample_rows(prep->color_buf[ci], 0,
- prep->color_buf[ci], -row,
- 1, cinfo->image_width);
- }
- }
- }
- *in_row_ctr += numrows;
- prep->next_buf_row += numrows;
- prep->rows_to_go -= numrows;
- } else {
- /* Return for more data, unless we are at the bottom of the image. */
- if (prep->rows_to_go != 0)
- break;
- /* When at bottom of image, pad to fill the conversion buffer. */
- if (prep->next_buf_row < prep->next_buf_stop) {
- for (ci = 0; ci < cinfo->num_components; ci++) {
- expand_bottom_edge(prep->color_buf[ci], cinfo->image_width,
- prep->next_buf_row, prep->next_buf_stop);
- }
- prep->next_buf_row = prep->next_buf_stop;
- }
- }
- /* If we've gotten enough data, downsample a row group. */
- if (prep->next_buf_row == prep->next_buf_stop) {
- (*cinfo->downsample->downsample) (cinfo,
- prep->color_buf,
- (JDIMENSION) prep->this_row_group,
- output_buf, *out_row_group_ctr);
- (*out_row_group_ctr)++;
- /* Advance pointers with wraparound as necessary. */
- prep->this_row_group += cinfo->max_v_samp_factor;
- if (prep->this_row_group >= buf_height)
- prep->this_row_group = 0;
- if (prep->next_buf_row >= buf_height)
- prep->next_buf_row = 0;
- prep->next_buf_stop = prep->next_buf_row + cinfo->max_v_samp_factor;
- }
- }
-}
-
-
-/*
- * Create the wrapped-around downsampling input buffer needed for context mode.
- */
-
-LOCAL(void)
-create_context_buffer (j_compress_ptr cinfo)
-{
- my_prep_ptr prep = (my_prep_ptr) cinfo->prep;
- int rgroup_height = cinfo->max_v_samp_factor;
- int ci, i;
- jpeg_component_info * compptr;
- JSAMPARRAY true_buffer, fake_buffer;
-
- /* Grab enough space for fake row pointers for all the components;
- * we need five row groups' worth of pointers for each component.
- */
- fake_buffer = (JSAMPARRAY)
- (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
- (cinfo->num_components * 5 * rgroup_height) *
- SIZEOF(JSAMPROW));
-
- for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
- ci++, compptr++) {
- /* Allocate the actual buffer space (3 row groups) for this component.
- * We make the buffer wide enough to allow the downsampler to edge-expand
- * horizontally within the buffer, if it so chooses.
- */
- true_buffer = (*cinfo->mem->alloc_sarray)
- ((j_common_ptr) cinfo, JPOOL_IMAGE,
- (JDIMENSION) (((long) compptr->width_in_blocks * DCTSIZE *
- cinfo->max_h_samp_factor) / compptr->h_samp_factor),
- (JDIMENSION) (3 * rgroup_height));
- /* Copy true buffer row pointers into the middle of the fake row array */
- MEMCOPY(fake_buffer + rgroup_height, true_buffer,
- 3 * rgroup_height * SIZEOF(JSAMPROW));
- /* Fill in the above and below wraparound pointers */
- for (i = 0; i < rgroup_height; i++) {
- fake_buffer[i] = true_buffer[2 * rgroup_height + i];
- fake_buffer[4 * rgroup_height + i] = true_buffer[i];
- }
- prep->color_buf[ci] = fake_buffer + rgroup_height;
- fake_buffer += 5 * rgroup_height; /* point to space for next component */
- }
-}
-
-#endif /* CONTEXT_ROWS_SUPPORTED */
-
-
-/*
- * Initialize preprocessing controller.
- */
-
-GLOBAL(void)
-jinit_c_prep_controller (j_compress_ptr cinfo, boolean need_full_buffer)
-{
- my_prep_ptr prep;
- int ci;
- jpeg_component_info * compptr;
-
- if (need_full_buffer) /* safety check */
- ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
-
- prep = (my_prep_ptr)
- (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
- SIZEOF(my_prep_controller));
- cinfo->prep = (struct jpeg_c_prep_controller *) prep;
- prep->pub.start_pass = start_pass_prep;
-
- /* Allocate the color conversion buffer.
- * We make the buffer wide enough to allow the downsampler to edge-expand
- * horizontally within the buffer, if it so chooses.
- */
- if (cinfo->downsample->need_context_rows) {
- /* Set up to provide context rows */
-#ifdef CONTEXT_ROWS_SUPPORTED
- prep->pub.pre_process_data = pre_process_context;
- create_context_buffer(cinfo);
-#else
- ERREXIT(cinfo, JERR_NOT_COMPILED);
-#endif
- } else {
- /* No context, just make it tall enough for one row group */
- prep->pub.pre_process_data = pre_process_data;
- for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
- ci++, compptr++) {
- prep->color_buf[ci] = (*cinfo->mem->alloc_sarray)
- ((j_common_ptr) cinfo, JPOOL_IMAGE,
- (JDIMENSION) (((long) compptr->width_in_blocks * DCTSIZE *
- cinfo->max_h_samp_factor) / compptr->h_samp_factor),
- (JDIMENSION) cinfo->max_v_samp_factor);
- }
- }
-}
-
-#endif //_FX_JPEG_TURBO_
+#if !defined(_FX_JPEG_TURBO_)
+/*
+ * jcprepct.c
+ *
+ * Copyright (C) 1994-1996, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains the compression preprocessing controller.
+ * This controller manages the color conversion, downsampling,
+ * and edge expansion steps.
+ *
+ * Most of the complexity here is associated with buffering input rows
+ * as required by the downsampler. See the comments at the head of
+ * jcsample.c for the downsampler's needs.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+
+
+/* At present, jcsample.c can request context rows only for smoothing.
+ * In the future, we might also need context rows for CCIR601 sampling
+ * or other more-complex downsampling procedures. The code to support
+ * context rows should be compiled only if needed.
+ */
+#ifdef INPUT_SMOOTHING_SUPPORTED
+#define CONTEXT_ROWS_SUPPORTED
+#endif
+
+
+/*
+ * For the simple (no-context-row) case, we just need to buffer one
+ * row group's worth of pixels for the downsampling step. At the bottom of
+ * the image, we pad to a full row group by replicating the last pixel row.
+ * The downsampler's last output row is then replicated if needed to pad
+ * out to a full iMCU row.
+ *
+ * When providing context rows, we must buffer three row groups' worth of
+ * pixels. Three row groups are physically allocated, but the row pointer
+ * arrays are made five row groups high, with the extra pointers above and
+ * below "wrapping around" to point to the last and first real row groups.
+ * This allows the downsampler to access the proper context rows.
+ * At the top and bottom of the image, we create dummy context rows by
+ * copying the first or last real pixel row. This copying could be avoided
+ * by pointer hacking as is done in jdmainct.c, but it doesn't seem worth the
+ * trouble on the compression side.
+ */
+
+
+/* Private buffer controller object */
+
+typedef struct {
+ struct jpeg_c_prep_controller pub; /* public fields */
+
+ /* Downsampling input buffer. This buffer holds color-converted data
+ * until we have enough to do a downsample step.
+ */
+ JSAMPARRAY color_buf[MAX_COMPONENTS];
+
+ JDIMENSION rows_to_go; /* counts rows remaining in source image */
+ int next_buf_row; /* index of next row to store in color_buf */
+
+#ifdef CONTEXT_ROWS_SUPPORTED /* only needed for context case */
+ int this_row_group; /* starting row index of group to process */
+ int next_buf_stop; /* downsample when we reach this index */
+#endif
+} my_prep_controller;
+
+typedef my_prep_controller * my_prep_ptr;
+
+
+/*
+ * Initialize for a processing pass.
+ */
+
+METHODDEF(void)
+start_pass_prep (j_compress_ptr cinfo, J_BUF_MODE pass_mode)
+{
+ my_prep_ptr prep = (my_prep_ptr) cinfo->prep;
+
+ if (pass_mode != JBUF_PASS_THRU)
+ ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
+
+ /* Initialize total-height counter for detecting bottom of image */
+ prep->rows_to_go = cinfo->image_height;
+ /* Mark the conversion buffer empty */
+ prep->next_buf_row = 0;
+#ifdef CONTEXT_ROWS_SUPPORTED
+ /* Preset additional state variables for context mode.
+ * These aren't used in non-context mode, so we needn't test which mode.
+ */
+ prep->this_row_group = 0;
+ /* Set next_buf_stop to stop after two row groups have been read in. */
+ prep->next_buf_stop = 2 * cinfo->max_v_samp_factor;
+#endif
+}
+
+
+/*
+ * Expand an image vertically from height input_rows to height output_rows,
+ * by duplicating the bottom row.
+ */
+
+LOCAL(void)
+expand_bottom_edge (JSAMPARRAY image_data, JDIMENSION num_cols,
+ int input_rows, int output_rows)
+{
+ register int row;
+
+ for (row = input_rows; row < output_rows; row++) {
+ jcopy_sample_rows(image_data, input_rows-1, image_data, row,
+ 1, num_cols);
+ }
+}
+
+
+/*
+ * Process some data in the simple no-context case.
+ *
+ * Preprocessor output data is counted in "row groups". A row group
+ * is defined to be v_samp_factor sample rows of each component.
+ * Downsampling will produce this much data from each max_v_samp_factor
+ * input rows.
+ */
+
+METHODDEF(void)
+pre_process_data (j_compress_ptr cinfo,
+ JSAMPARRAY input_buf, JDIMENSION *in_row_ctr,
+ JDIMENSION in_rows_avail,
+ JSAMPIMAGE output_buf, JDIMENSION *out_row_group_ctr,
+ JDIMENSION out_row_groups_avail)
+{
+ my_prep_ptr prep = (my_prep_ptr) cinfo->prep;
+ int numrows, ci;
+ JDIMENSION inrows;
+ jpeg_component_info * compptr;
+
+ while (*in_row_ctr < in_rows_avail &&
+ *out_row_group_ctr < out_row_groups_avail) {
+ /* Do color conversion to fill the conversion buffer. */
+ inrows = in_rows_avail - *in_row_ctr;
+ numrows = cinfo->max_v_samp_factor - prep->next_buf_row;
+ numrows = (int) MIN((JDIMENSION) numrows, inrows);
+ (*cinfo->cconvert->color_convert) (cinfo, input_buf + *in_row_ctr,
+ prep->color_buf,
+ (JDIMENSION) prep->next_buf_row,
+ numrows);
+ *in_row_ctr += numrows;
+ prep->next_buf_row += numrows;
+ prep->rows_to_go -= numrows;
+ /* If at bottom of image, pad to fill the conversion buffer. */
+ if (prep->rows_to_go == 0 &&
+ prep->next_buf_row < cinfo->max_v_samp_factor) {
+ for (ci = 0; ci < cinfo->num_components; ci++) {
+ expand_bottom_edge(prep->color_buf[ci], cinfo->image_width,
+ prep->next_buf_row, cinfo->max_v_samp_factor);
+ }
+ prep->next_buf_row = cinfo->max_v_samp_factor;
+ }
+ /* If we've filled the conversion buffer, empty it. */
+ if (prep->next_buf_row == cinfo->max_v_samp_factor) {
+ (*cinfo->downsample->downsample) (cinfo,
+ prep->color_buf, (JDIMENSION) 0,
+ output_buf, *out_row_group_ctr);
+ prep->next_buf_row = 0;
+ (*out_row_group_ctr)++;
+ }
+ /* If at bottom of image, pad the output to a full iMCU height.
+ * Note we assume the caller is providing a one-iMCU-height output buffer!
+ */
+ if (prep->rows_to_go == 0 &&
+ *out_row_group_ctr < out_row_groups_avail) {
+ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+ ci++, compptr++) {
+ expand_bottom_edge(output_buf[ci],
+ compptr->width_in_blocks * DCTSIZE,
+ (int) (*out_row_group_ctr * compptr->v_samp_factor),
+ (int) (out_row_groups_avail * compptr->v_samp_factor));
+ }
+ *out_row_group_ctr = out_row_groups_avail;
+ break; /* can exit outer loop without test */
+ }
+ }
+}
+
+
+#ifdef CONTEXT_ROWS_SUPPORTED
+
+/*
+ * Process some data in the context case.
+ */
+
+METHODDEF(void)
+pre_process_context (j_compress_ptr cinfo,
+ JSAMPARRAY input_buf, JDIMENSION *in_row_ctr,
+ JDIMENSION in_rows_avail,
+ JSAMPIMAGE output_buf, JDIMENSION *out_row_group_ctr,
+ JDIMENSION out_row_groups_avail)
+{
+ my_prep_ptr prep = (my_prep_ptr) cinfo->prep;
+ int numrows, ci;
+ int buf_height = cinfo->max_v_samp_factor * 3;
+ JDIMENSION inrows;
+
+ while (*out_row_group_ctr < out_row_groups_avail) {
+ if (*in_row_ctr < in_rows_avail) {
+ /* Do color conversion to fill the conversion buffer. */
+ inrows = in_rows_avail - *in_row_ctr;
+ numrows = prep->next_buf_stop - prep->next_buf_row;
+ numrows = (int) MIN((JDIMENSION) numrows, inrows);
+ (*cinfo->cconvert->color_convert) (cinfo, input_buf + *in_row_ctr,
+ prep->color_buf,
+ (JDIMENSION) prep->next_buf_row,
+ numrows);
+ /* Pad at top of image, if first time through */
+ if (prep->rows_to_go == cinfo->image_height) {
+ for (ci = 0; ci < cinfo->num_components; ci++) {
+ int row;
+ for (row = 1; row <= cinfo->max_v_samp_factor; row++) {
+ jcopy_sample_rows(prep->color_buf[ci], 0,
+ prep->color_buf[ci], -row,
+ 1, cinfo->image_width);
+ }
+ }
+ }
+ *in_row_ctr += numrows;
+ prep->next_buf_row += numrows;
+ prep->rows_to_go -= numrows;
+ } else {
+ /* Return for more data, unless we are at the bottom of the image. */
+ if (prep->rows_to_go != 0)
+ break;
+ /* When at bottom of image, pad to fill the conversion buffer. */
+ if (prep->next_buf_row < prep->next_buf_stop) {
+ for (ci = 0; ci < cinfo->num_components; ci++) {
+ expand_bottom_edge(prep->color_buf[ci], cinfo->image_width,
+ prep->next_buf_row, prep->next_buf_stop);
+ }
+ prep->next_buf_row = prep->next_buf_stop;
+ }
+ }
+ /* If we've gotten enough data, downsample a row group. */
+ if (prep->next_buf_row == prep->next_buf_stop) {
+ (*cinfo->downsample->downsample) (cinfo,
+ prep->color_buf,
+ (JDIMENSION) prep->this_row_group,
+ output_buf, *out_row_group_ctr);
+ (*out_row_group_ctr)++;
+ /* Advance pointers with wraparound as necessary. */
+ prep->this_row_group += cinfo->max_v_samp_factor;
+ if (prep->this_row_group >= buf_height)
+ prep->this_row_group = 0;
+ if (prep->next_buf_row >= buf_height)
+ prep->next_buf_row = 0;
+ prep->next_buf_stop = prep->next_buf_row + cinfo->max_v_samp_factor;
+ }
+ }
+}
+
+
+/*
+ * Create the wrapped-around downsampling input buffer needed for context mode.
+ */
+
+LOCAL(void)
+create_context_buffer (j_compress_ptr cinfo)
+{
+ my_prep_ptr prep = (my_prep_ptr) cinfo->prep;
+ int rgroup_height = cinfo->max_v_samp_factor;
+ int ci, i;
+ jpeg_component_info * compptr;
+ JSAMPARRAY true_buffer, fake_buffer;
+
+ /* Grab enough space for fake row pointers for all the components;
+ * we need five row groups' worth of pointers for each component.
+ */
+ fake_buffer = (JSAMPARRAY)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ (cinfo->num_components * 5 * rgroup_height) *
+ SIZEOF(JSAMPROW));
+
+ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+ ci++, compptr++) {
+ /* Allocate the actual buffer space (3 row groups) for this component.
+ * We make the buffer wide enough to allow the downsampler to edge-expand
+ * horizontally within the buffer, if it so chooses.
+ */
+ true_buffer = (*cinfo->mem->alloc_sarray)
+ ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ (JDIMENSION) (((long) compptr->width_in_blocks * DCTSIZE *
+ cinfo->max_h_samp_factor) / compptr->h_samp_factor),
+ (JDIMENSION) (3 * rgroup_height));
+ /* Copy true buffer row pointers into the middle of the fake row array */
+ MEMCOPY(fake_buffer + rgroup_height, true_buffer,
+ 3 * rgroup_height * SIZEOF(JSAMPROW));
+ /* Fill in the above and below wraparound pointers */
+ for (i = 0; i < rgroup_height; i++) {
+ fake_buffer[i] = true_buffer[2 * rgroup_height + i];
+ fake_buffer[4 * rgroup_height + i] = true_buffer[i];
+ }
+ prep->color_buf[ci] = fake_buffer + rgroup_height;
+ fake_buffer += 5 * rgroup_height; /* point to space for next component */
+ }
+}
+
+#endif /* CONTEXT_ROWS_SUPPORTED */
+
+
+/*
+ * Initialize preprocessing controller.
+ */
+
+GLOBAL(void)
+jinit_c_prep_controller (j_compress_ptr cinfo, boolean need_full_buffer)
+{
+ my_prep_ptr prep;
+ int ci;
+ jpeg_component_info * compptr;
+
+ if (need_full_buffer) /* safety check */
+ ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
+
+ prep = (my_prep_ptr)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ SIZEOF(my_prep_controller));
+ cinfo->prep = (struct jpeg_c_prep_controller *) prep;
+ prep->pub.start_pass = start_pass_prep;
+
+ /* Allocate the color conversion buffer.
+ * We make the buffer wide enough to allow the downsampler to edge-expand
+ * horizontally within the buffer, if it so chooses.
+ */
+ if (cinfo->downsample->need_context_rows) {
+ /* Set up to provide context rows */
+#ifdef CONTEXT_ROWS_SUPPORTED
+ prep->pub.pre_process_data = pre_process_context;
+ create_context_buffer(cinfo);
+#else
+ ERREXIT(cinfo, JERR_NOT_COMPILED);
+#endif
+ } else {
+ /* No context, just make it tall enough for one row group */
+ prep->pub.pre_process_data = pre_process_data;
+ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+ ci++, compptr++) {
+ prep->color_buf[ci] = (*cinfo->mem->alloc_sarray)
+ ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ (JDIMENSION) (((long) compptr->width_in_blocks * DCTSIZE *
+ cinfo->max_h_samp_factor) / compptr->h_samp_factor),
+ (JDIMENSION) cinfo->max_v_samp_factor);
+ }
+ }
+}
+
+#endif //_FX_JPEG_TURBO_
diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jcsample.c b/core/src/fxcodec/libjpeg/fpdfapi_jcsample.c
index 7256bd7356..5e1e828740 100644
--- a/core/src/fxcodec/libjpeg/fpdfapi_jcsample.c
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jcsample.c
@@ -1,522 +1,522 @@
-#if !defined(_FX_JPEG_TURBO_)
-/*
- * jcsample.c
- *
- * Copyright (C) 1991-1996, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains downsampling routines.
- *
- * Downsampling input data is counted in "row groups". A row group
- * is defined to be max_v_samp_factor pixel rows of each component,
- * from which the downsampler produces v_samp_factor sample rows.
- * A single row group is processed in each call to the downsampler module.
- *
- * The downsampler is responsible for edge-expansion of its output data
- * to fill an integral number of DCT blocks horizontally. The source buffer
- * may be modified if it is helpful for this purpose (the source buffer is
- * allocated wide enough to correspond to the desired output width).
- * The caller (the prep controller) is responsible for vertical padding.
- *
- * The downsampler may request "context rows" by setting need_context_rows
- * during startup. In this case, the input arrays will contain at least
- * one row group's worth of pixels above and below the passed-in data;
- * the caller will create dummy rows at image top and bottom by replicating
- * the first or last real pixel row.
- *
- * An excellent reference for image resampling is
- * Digital Image Warping, George Wolberg, 1990.
- * Pub. by IEEE Computer Society Press, Los Alamitos, CA. ISBN 0-8186-8944-7.
- *
- * The downsampling algorithm used here is a simple average of the source
- * pixels covered by the output pixel. The hi-falutin sampling literature
- * refers to this as a "box filter". In general the characteristics of a box
- * filter are not very good, but for the specific cases we normally use (1:1
- * and 2:1 ratios) the box is equivalent to a "triangle filter" which is not
- * nearly so bad. If you intend to use other sampling ratios, you'd be well
- * advised to improve this code.
- *
- * A simple input-smoothing capability is provided. This is mainly intended
- * for cleaning up color-dithered GIF input files (if you find it inadequate,
- * we suggest using an external filtering program such as pnmconvol). When
- * enabled, each input pixel P is replaced by a weighted sum of itself and its
- * eight neighbors. P's weight is 1-8*SF and each neighbor's weight is SF,
- * where SF = (smoothing_factor / 1024).
- * Currently, smoothing is only supported for 2h2v sampling factors.
- */
-
-#define JPEG_INTERNALS
-#include "jinclude.h"
-#include "jpeglib.h"
-
-
-/* Pointer to routine to downsample a single component */
-typedef JMETHOD(void, downsample1_ptr,
- (j_compress_ptr cinfo, jpeg_component_info * compptr,
- JSAMPARRAY input_data, JSAMPARRAY output_data));
-
-/* Private subobject */
-
-typedef struct {
- struct jpeg_downsampler pub; /* public fields */
-
- /* Downsampling method pointers, one per component */
- downsample1_ptr methods[MAX_COMPONENTS];
-} my_downsampler;
-
-typedef my_downsampler * my_downsample_ptr;
-
-
-/*
- * Initialize for a downsampling pass.
- */
-
-METHODDEF(void)
-start_pass_downsample (j_compress_ptr cinfo)
-{
- /* no work for now */
-}
-
-
-/*
- * Expand a component horizontally from width input_cols to width output_cols,
- * by duplicating the rightmost samples.
- */
-
-LOCAL(void)
-expand_right_edge (JSAMPARRAY image_data, int num_rows,
- JDIMENSION input_cols, JDIMENSION output_cols)
-{
- register JSAMPROW ptr;
- register JSAMPLE pixval;
- register int count;
- int row;
- int numcols = (int) (output_cols - input_cols);
-
- if (numcols > 0) {
- for (row = 0; row < num_rows; row++) {
- ptr = image_data[row] + input_cols;
- pixval = ptr[-1]; /* don't need GETJSAMPLE() here */
- for (count = numcols; count > 0; count--)
- *ptr++ = pixval;
- }
- }
-}
-
-
-/*
- * Do downsampling for a whole row group (all components).
- *
- * In this version we simply downsample each component independently.
- */
-
-METHODDEF(void)
-sep_downsample (j_compress_ptr cinfo,
- JSAMPIMAGE input_buf, JDIMENSION in_row_index,
- JSAMPIMAGE output_buf, JDIMENSION out_row_group_index)
-{
- my_downsample_ptr downsample = (my_downsample_ptr) cinfo->downsample;
- int ci;
- jpeg_component_info * compptr;
- JSAMPARRAY in_ptr, out_ptr;
-
- for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
- ci++, compptr++) {
- in_ptr = input_buf[ci] + in_row_index;
- out_ptr = output_buf[ci] + (out_row_group_index * compptr->v_samp_factor);
- (*downsample->methods[ci]) (cinfo, compptr, in_ptr, out_ptr);
- }
-}
-
-
-/*
- * Downsample pixel values of a single component.
- * One row group is processed per call.
- * This version handles arbitrary integral sampling ratios, without smoothing.
- * Note that this version is not actually used for customary sampling ratios.
- */
-
-METHODDEF(void)
-int_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr,
- JSAMPARRAY input_data, JSAMPARRAY output_data)
-{
- int inrow, outrow, h_expand, v_expand, numpix, numpix2, h, v;
- JDIMENSION outcol, outcol_h; /* outcol_h == outcol*h_expand */
- JDIMENSION output_cols = compptr->width_in_blocks * DCTSIZE;
- JSAMPROW inptr, outptr;
- INT32 outvalue;
-
- h_expand = cinfo->max_h_samp_factor / compptr->h_samp_factor;
- v_expand = cinfo->max_v_samp_factor / compptr->v_samp_factor;
- numpix = h_expand * v_expand;
- numpix2 = numpix/2;
-
- /* Expand input data enough to let all the output samples be generated
- * by the standard loop. Special-casing padded output would be more
- * efficient.
- */
- expand_right_edge(input_data, cinfo->max_v_samp_factor,
- cinfo->image_width, output_cols * h_expand);
-
- inrow = 0;
- for (outrow = 0; outrow < compptr->v_samp_factor; outrow++) {
- outptr = output_data[outrow];
- for (outcol = 0, outcol_h = 0; outcol < output_cols;
- outcol++, outcol_h += h_expand) {
- outvalue = 0;
- for (v = 0; v < v_expand; v++) {
- inptr = input_data[inrow+v] + outcol_h;
- for (h = 0; h < h_expand; h++) {
- outvalue += (INT32) GETJSAMPLE(*inptr++);
- }
- }
- *outptr++ = (JSAMPLE) ((outvalue + numpix2) / numpix);
- }
- inrow += v_expand;
- }
-}
-
-
-/*
- * Downsample pixel values of a single component.
- * This version handles the special case of a full-size component,
- * without smoothing.
- */
-
-METHODDEF(void)
-fullsize_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr,
- JSAMPARRAY input_data, JSAMPARRAY output_data)
-{
- /* Copy the data */
- jcopy_sample_rows(input_data, 0, output_data, 0,
- cinfo->max_v_samp_factor, cinfo->image_width);
- /* Edge-expand */
- expand_right_edge(output_data, cinfo->max_v_samp_factor,
- cinfo->image_width, compptr->width_in_blocks * DCTSIZE);
-}
-
-
-/*
- * Downsample pixel values of a single component.
- * This version handles the common case of 2:1 horizontal and 1:1 vertical,
- * without smoothing.
- *
- * A note about the "bias" calculations: when rounding fractional values to
- * integer, we do not want to always round 0.5 up to the next integer.
- * If we did that, we'd introduce a noticeable bias towards larger values.
- * Instead, this code is arranged so that 0.5 will be rounded up or down at
- * alternate pixel locations (a simple ordered dither pattern).
- */
-
-METHODDEF(void)
-h2v1_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr,
- JSAMPARRAY input_data, JSAMPARRAY output_data)
-{
- int outrow;
- JDIMENSION outcol;
- JDIMENSION output_cols = compptr->width_in_blocks * DCTSIZE;
- register JSAMPROW inptr, outptr;
- register int bias;
-
- /* Expand input data enough to let all the output samples be generated
- * by the standard loop. Special-casing padded output would be more
- * efficient.
- */
- expand_right_edge(input_data, cinfo->max_v_samp_factor,
- cinfo->image_width, output_cols * 2);
-
- for (outrow = 0; outrow < compptr->v_samp_factor; outrow++) {
- outptr = output_data[outrow];
- inptr = input_data[outrow];
- bias = 0; /* bias = 0,1,0,1,... for successive samples */
- for (outcol = 0; outcol < output_cols; outcol++) {
- *outptr++ = (JSAMPLE) ((GETJSAMPLE(*inptr) + GETJSAMPLE(inptr[1])
- + bias) >> 1);
- bias ^= 1; /* 0=>1, 1=>0 */
- inptr += 2;
- }
- }
-}
-
-
-/*
- * Downsample pixel values of a single component.
- * This version handles the standard case of 2:1 horizontal and 2:1 vertical,
- * without smoothing.
- */
-
-METHODDEF(void)
-h2v2_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr,
- JSAMPARRAY input_data, JSAMPARRAY output_data)
-{
- int inrow, outrow;
- JDIMENSION outcol;
- JDIMENSION output_cols = compptr->width_in_blocks * DCTSIZE;
- register JSAMPROW inptr0, inptr1, outptr;
- register int bias;
-
- /* Expand input data enough to let all the output samples be generated
- * by the standard loop. Special-casing padded output would be more
- * efficient.
- */
- expand_right_edge(input_data, cinfo->max_v_samp_factor,
- cinfo->image_width, output_cols * 2);
-
- inrow = 0;
- for (outrow = 0; outrow < compptr->v_samp_factor; outrow++) {
- outptr = output_data[outrow];
- inptr0 = input_data[inrow];
- inptr1 = input_data[inrow+1];
- bias = 1; /* bias = 1,2,1,2,... for successive samples */
- for (outcol = 0; outcol < output_cols; outcol++) {
- *outptr++ = (JSAMPLE) ((GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[1]) +
- GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[1])
- + bias) >> 2);
- bias ^= 3; /* 1=>2, 2=>1 */
- inptr0 += 2; inptr1 += 2;
- }
- inrow += 2;
- }
-}
-
-
-#ifdef INPUT_SMOOTHING_SUPPORTED
-
-/*
- * Downsample pixel values of a single component.
- * This version handles the standard case of 2:1 horizontal and 2:1 vertical,
- * with smoothing. One row of context is required.
- */
-
-METHODDEF(void)
-h2v2_smooth_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr,
- JSAMPARRAY input_data, JSAMPARRAY output_data)
-{
- int inrow, outrow;
- JDIMENSION colctr;
- JDIMENSION output_cols = compptr->width_in_blocks * DCTSIZE;
- register JSAMPROW inptr0, inptr1, above_ptr, below_ptr, outptr;
- INT32 membersum, neighsum, memberscale, neighscale;
-
- /* Expand input data enough to let all the output samples be generated
- * by the standard loop. Special-casing padded output would be more
- * efficient.
- */
- expand_right_edge(input_data - 1, cinfo->max_v_samp_factor + 2,
- cinfo->image_width, output_cols * 2);
-
- /* We don't bother to form the individual "smoothed" input pixel values;
- * we can directly compute the output which is the average of the four
- * smoothed values. Each of the four member pixels contributes a fraction
- * (1-8*SF) to its own smoothed image and a fraction SF to each of the three
- * other smoothed pixels, therefore a total fraction (1-5*SF)/4 to the final
- * output. The four corner-adjacent neighbor pixels contribute a fraction
- * SF to just one smoothed pixel, or SF/4 to the final output; while the
- * eight edge-adjacent neighbors contribute SF to each of two smoothed
- * pixels, or SF/2 overall. In order to use integer arithmetic, these
- * factors are scaled by 2^16 = 65536.
- * Also recall that SF = smoothing_factor / 1024.
- */
-
- memberscale = 16384 - cinfo->smoothing_factor * 80; /* scaled (1-5*SF)/4 */
- neighscale = cinfo->smoothing_factor * 16; /* scaled SF/4 */
-
- inrow = 0;
- for (outrow = 0; outrow < compptr->v_samp_factor; outrow++) {
- outptr = output_data[outrow];
- inptr0 = input_data[inrow];
- inptr1 = input_data[inrow+1];
- above_ptr = input_data[inrow-1];
- below_ptr = input_data[inrow+2];
-
- /* Special case for first column: pretend column -1 is same as column 0 */
- membersum = GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[1]) +
- GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[1]);
- neighsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(above_ptr[1]) +
- GETJSAMPLE(*below_ptr) + GETJSAMPLE(below_ptr[1]) +
- GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[2]) +
- GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[2]);
- neighsum += neighsum;
- neighsum += GETJSAMPLE(*above_ptr) + GETJSAMPLE(above_ptr[2]) +
- GETJSAMPLE(*below_ptr) + GETJSAMPLE(below_ptr[2]);
- membersum = membersum * memberscale + neighsum * neighscale;
- *outptr++ = (JSAMPLE) ((membersum + 32768) >> 16);
- inptr0 += 2; inptr1 += 2; above_ptr += 2; below_ptr += 2;
-
- for (colctr = output_cols - 2; colctr > 0; colctr--) {
- /* sum of pixels directly mapped to this output element */
- membersum = GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[1]) +
- GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[1]);
- /* sum of edge-neighbor pixels */
- neighsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(above_ptr[1]) +
- GETJSAMPLE(*below_ptr) + GETJSAMPLE(below_ptr[1]) +
- GETJSAMPLE(inptr0[-1]) + GETJSAMPLE(inptr0[2]) +
- GETJSAMPLE(inptr1[-1]) + GETJSAMPLE(inptr1[2]);
- /* The edge-neighbors count twice as much as corner-neighbors */
- neighsum += neighsum;
- /* Add in the corner-neighbors */
- neighsum += GETJSAMPLE(above_ptr[-1]) + GETJSAMPLE(above_ptr[2]) +
- GETJSAMPLE(below_ptr[-1]) + GETJSAMPLE(below_ptr[2]);
- /* form final output scaled up by 2^16 */
- membersum = membersum * memberscale + neighsum * neighscale;
- /* round, descale and output it */
- *outptr++ = (JSAMPLE) ((membersum + 32768) >> 16);
- inptr0 += 2; inptr1 += 2; above_ptr += 2; below_ptr += 2;
- }
-
- /* Special case for last column */
- membersum = GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[1]) +
- GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[1]);
- neighsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(above_ptr[1]) +
- GETJSAMPLE(*below_ptr) + GETJSAMPLE(below_ptr[1]) +
- GETJSAMPLE(inptr0[-1]) + GETJSAMPLE(inptr0[1]) +
- GETJSAMPLE(inptr1[-1]) + GETJSAMPLE(inptr1[1]);
- neighsum += neighsum;
- neighsum += GETJSAMPLE(above_ptr[-1]) + GETJSAMPLE(above_ptr[1]) +
- GETJSAMPLE(below_ptr[-1]) + GETJSAMPLE(below_ptr[1]);
- membersum = membersum * memberscale + neighsum * neighscale;
- *outptr = (JSAMPLE) ((membersum + 32768) >> 16);
-
- inrow += 2;
- }
-}
-
-
-/*
- * Downsample pixel values of a single component.
- * This version handles the special case of a full-size component,
- * with smoothing. One row of context is required.
- */
-
-METHODDEF(void)
-fullsize_smooth_downsample (j_compress_ptr cinfo, jpeg_component_info *compptr,
- JSAMPARRAY input_data, JSAMPARRAY output_data)
-{
- int outrow;
- JDIMENSION colctr;
- JDIMENSION output_cols = compptr->width_in_blocks * DCTSIZE;
- register JSAMPROW inptr, above_ptr, below_ptr, outptr;
- INT32 membersum, neighsum, memberscale, neighscale;
- int colsum, lastcolsum, nextcolsum;
-
- /* Expand input data enough to let all the output samples be generated
- * by the standard loop. Special-casing padded output would be more
- * efficient.
- */
- expand_right_edge(input_data - 1, cinfo->max_v_samp_factor + 2,
- cinfo->image_width, output_cols);
-
- /* Each of the eight neighbor pixels contributes a fraction SF to the
- * smoothed pixel, while the main pixel contributes (1-8*SF). In order
- * to use integer arithmetic, these factors are multiplied by 2^16 = 65536.
- * Also recall that SF = smoothing_factor / 1024.
- */
-
- memberscale = 65536L - cinfo->smoothing_factor * 512L; /* scaled 1-8*SF */
- neighscale = cinfo->smoothing_factor * 64; /* scaled SF */
-
- for (outrow = 0; outrow < compptr->v_samp_factor; outrow++) {
- outptr = output_data[outrow];
- inptr = input_data[outrow];
- above_ptr = input_data[outrow-1];
- below_ptr = input_data[outrow+1];
-
- /* Special case for first column */
- colsum = GETJSAMPLE(*above_ptr++) + GETJSAMPLE(*below_ptr++) +
- GETJSAMPLE(*inptr);
- membersum = GETJSAMPLE(*inptr++);
- nextcolsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(*below_ptr) +
- GETJSAMPLE(*inptr);
- neighsum = colsum + (colsum - membersum) + nextcolsum;
- membersum = membersum * memberscale + neighsum * neighscale;
- *outptr++ = (JSAMPLE) ((membersum + 32768) >> 16);
- lastcolsum = colsum; colsum = nextcolsum;
-
- for (colctr = output_cols - 2; colctr > 0; colctr--) {
- membersum = GETJSAMPLE(*inptr++);
- above_ptr++; below_ptr++;
- nextcolsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(*below_ptr) +
- GETJSAMPLE(*inptr);
- neighsum = lastcolsum + (colsum - membersum) + nextcolsum;
- membersum = membersum * memberscale + neighsum * neighscale;
- *outptr++ = (JSAMPLE) ((membersum + 32768) >> 16);
- lastcolsum = colsum; colsum = nextcolsum;
- }
-
- /* Special case for last column */
- membersum = GETJSAMPLE(*inptr);
- neighsum = lastcolsum + (colsum - membersum) + colsum;
- membersum = membersum * memberscale + neighsum * neighscale;
- *outptr = (JSAMPLE) ((membersum + 32768) >> 16);
-
- }
-}
-
-#endif /* INPUT_SMOOTHING_SUPPORTED */
-
-
-/*
- * Module initialization routine for downsampling.
- * Note that we must select a routine for each component.
- */
-
-GLOBAL(void)
-jinit_downsampler (j_compress_ptr cinfo)
-{
- my_downsample_ptr downsample;
- int ci;
- jpeg_component_info * compptr;
- boolean smoothok = TRUE;
-
- downsample = (my_downsample_ptr)
- (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
- SIZEOF(my_downsampler));
- cinfo->downsample = (struct jpeg_downsampler *) downsample;
- downsample->pub.start_pass = start_pass_downsample;
- downsample->pub.downsample = sep_downsample;
- downsample->pub.need_context_rows = FALSE;
-
- if (cinfo->CCIR601_sampling)
- ERREXIT(cinfo, JERR_CCIR601_NOTIMPL);
-
- /* Verify we can handle the sampling factors, and set up method pointers */
- for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
- ci++, compptr++) {
- if (compptr->h_samp_factor == cinfo->max_h_samp_factor &&
- compptr->v_samp_factor == cinfo->max_v_samp_factor) {
-#ifdef INPUT_SMOOTHING_SUPPORTED
- if (cinfo->smoothing_factor) {
- downsample->methods[ci] = fullsize_smooth_downsample;
- downsample->pub.need_context_rows = TRUE;
- } else
-#endif
- downsample->methods[ci] = fullsize_downsample;
- } else if (compptr->h_samp_factor * 2 == cinfo->max_h_samp_factor &&
- compptr->v_samp_factor == cinfo->max_v_samp_factor) {
- smoothok = FALSE;
- downsample->methods[ci] = h2v1_downsample;
- } else if (compptr->h_samp_factor * 2 == cinfo->max_h_samp_factor &&
- compptr->v_samp_factor * 2 == cinfo->max_v_samp_factor) {
-#ifdef INPUT_SMOOTHING_SUPPORTED
- if (cinfo->smoothing_factor) {
- downsample->methods[ci] = h2v2_smooth_downsample;
- downsample->pub.need_context_rows = TRUE;
- } else
-#endif
- downsample->methods[ci] = h2v2_downsample;
- } else if ((cinfo->max_h_samp_factor % compptr->h_samp_factor) == 0 &&
- (cinfo->max_v_samp_factor % compptr->v_samp_factor) == 0) {
- smoothok = FALSE;
- downsample->methods[ci] = int_downsample;
- } else
- ERREXIT(cinfo, JERR_FRACT_SAMPLE_NOTIMPL);
- }
-
-#ifdef INPUT_SMOOTHING_SUPPORTED
- if (cinfo->smoothing_factor && !smoothok)
- TRACEMS(cinfo, 0, JTRC_SMOOTH_NOTIMPL);
-#endif
-}
-
-#endif //_FX_JPEG_TURBO_
+#if !defined(_FX_JPEG_TURBO_)
+/*
+ * jcsample.c
+ *
+ * Copyright (C) 1991-1996, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains downsampling routines.
+ *
+ * Downsampling input data is counted in "row groups". A row group
+ * is defined to be max_v_samp_factor pixel rows of each component,
+ * from which the downsampler produces v_samp_factor sample rows.
+ * A single row group is processed in each call to the downsampler module.
+ *
+ * The downsampler is responsible for edge-expansion of its output data
+ * to fill an integral number of DCT blocks horizontally. The source buffer
+ * may be modified if it is helpful for this purpose (the source buffer is
+ * allocated wide enough to correspond to the desired output width).
+ * The caller (the prep controller) is responsible for vertical padding.
+ *
+ * The downsampler may request "context rows" by setting need_context_rows
+ * during startup. In this case, the input arrays will contain at least
+ * one row group's worth of pixels above and below the passed-in data;
+ * the caller will create dummy rows at image top and bottom by replicating
+ * the first or last real pixel row.
+ *
+ * An excellent reference for image resampling is
+ * Digital Image Warping, George Wolberg, 1990.
+ * Pub. by IEEE Computer Society Press, Los Alamitos, CA. ISBN 0-8186-8944-7.
+ *
+ * The downsampling algorithm used here is a simple average of the source
+ * pixels covered by the output pixel. The hi-falutin sampling literature
+ * refers to this as a "box filter". In general the characteristics of a box
+ * filter are not very good, but for the specific cases we normally use (1:1
+ * and 2:1 ratios) the box is equivalent to a "triangle filter" which is not
+ * nearly so bad. If you intend to use other sampling ratios, you'd be well
+ * advised to improve this code.
+ *
+ * A simple input-smoothing capability is provided. This is mainly intended
+ * for cleaning up color-dithered GIF input files (if you find it inadequate,
+ * we suggest using an external filtering program such as pnmconvol). When
+ * enabled, each input pixel P is replaced by a weighted sum of itself and its
+ * eight neighbors. P's weight is 1-8*SF and each neighbor's weight is SF,
+ * where SF = (smoothing_factor / 1024).
+ * Currently, smoothing is only supported for 2h2v sampling factors.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+
+
+/* Pointer to routine to downsample a single component */
+typedef JMETHOD(void, downsample1_ptr,
+ (j_compress_ptr cinfo, jpeg_component_info * compptr,
+ JSAMPARRAY input_data, JSAMPARRAY output_data));
+
+/* Private subobject */
+
+typedef struct {
+ struct jpeg_downsampler pub; /* public fields */
+
+ /* Downsampling method pointers, one per component */
+ downsample1_ptr methods[MAX_COMPONENTS];
+} my_downsampler;
+
+typedef my_downsampler * my_downsample_ptr;
+
+
+/*
+ * Initialize for a downsampling pass.
+ */
+
+METHODDEF(void)
+start_pass_downsample (j_compress_ptr cinfo)
+{
+ /* no work for now */
+}
+
+
+/*
+ * Expand a component horizontally from width input_cols to width output_cols,
+ * by duplicating the rightmost samples.
+ */
+
+LOCAL(void)
+expand_right_edge (JSAMPARRAY image_data, int num_rows,
+ JDIMENSION input_cols, JDIMENSION output_cols)
+{
+ register JSAMPROW ptr;
+ register JSAMPLE pixval;
+ register int count;
+ int row;
+ int numcols = (int) (output_cols - input_cols);
+
+ if (numcols > 0) {
+ for (row = 0; row < num_rows; row++) {
+ ptr = image_data[row] + input_cols;
+ pixval = ptr[-1]; /* don't need GETJSAMPLE() here */
+ for (count = numcols; count > 0; count--)
+ *ptr++ = pixval;
+ }
+ }
+}
+
+
+/*
+ * Do downsampling for a whole row group (all components).
+ *
+ * In this version we simply downsample each component independently.
+ */
+
+METHODDEF(void)
+sep_downsample (j_compress_ptr cinfo,
+ JSAMPIMAGE input_buf, JDIMENSION in_row_index,
+ JSAMPIMAGE output_buf, JDIMENSION out_row_group_index)
+{
+ my_downsample_ptr downsample = (my_downsample_ptr) cinfo->downsample;
+ int ci;
+ jpeg_component_info * compptr;
+ JSAMPARRAY in_ptr, out_ptr;
+
+ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+ ci++, compptr++) {
+ in_ptr = input_buf[ci] + in_row_index;
+ out_ptr = output_buf[ci] + (out_row_group_index * compptr->v_samp_factor);
+ (*downsample->methods[ci]) (cinfo, compptr, in_ptr, out_ptr);
+ }
+}
+
+
+/*
+ * Downsample pixel values of a single component.
+ * One row group is processed per call.
+ * This version handles arbitrary integral sampling ratios, without smoothing.
+ * Note that this version is not actually used for customary sampling ratios.
+ */
+
+METHODDEF(void)
+int_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr,
+ JSAMPARRAY input_data, JSAMPARRAY output_data)
+{
+ int inrow, outrow, h_expand, v_expand, numpix, numpix2, h, v;
+ JDIMENSION outcol, outcol_h; /* outcol_h == outcol*h_expand */
+ JDIMENSION output_cols = compptr->width_in_blocks * DCTSIZE;
+ JSAMPROW inptr, outptr;
+ INT32 outvalue;
+
+ h_expand = cinfo->max_h_samp_factor / compptr->h_samp_factor;
+ v_expand = cinfo->max_v_samp_factor / compptr->v_samp_factor;
+ numpix = h_expand * v_expand;
+ numpix2 = numpix/2;
+
+ /* Expand input data enough to let all the output samples be generated
+ * by the standard loop. Special-casing padded output would be more
+ * efficient.
+ */
+ expand_right_edge(input_data, cinfo->max_v_samp_factor,
+ cinfo->image_width, output_cols * h_expand);
+
+ inrow = 0;
+ for (outrow = 0; outrow < compptr->v_samp_factor; outrow++) {
+ outptr = output_data[outrow];
+ for (outcol = 0, outcol_h = 0; outcol < output_cols;
+ outcol++, outcol_h += h_expand) {
+ outvalue = 0;
+ for (v = 0; v < v_expand; v++) {
+ inptr = input_data[inrow+v] + outcol_h;
+ for (h = 0; h < h_expand; h++) {
+ outvalue += (INT32) GETJSAMPLE(*inptr++);
+ }
+ }
+ *outptr++ = (JSAMPLE) ((outvalue + numpix2) / numpix);
+ }
+ inrow += v_expand;
+ }
+}
+
+
+/*
+ * Downsample pixel values of a single component.
+ * This version handles the special case of a full-size component,
+ * without smoothing.
+ */
+
+METHODDEF(void)
+fullsize_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr,
+ JSAMPARRAY input_data, JSAMPARRAY output_data)
+{
+ /* Copy the data */
+ jcopy_sample_rows(input_data, 0, output_data, 0,
+ cinfo->max_v_samp_factor, cinfo->image_width);
+ /* Edge-expand */
+ expand_right_edge(output_data, cinfo->max_v_samp_factor,
+ cinfo->image_width, compptr->width_in_blocks * DCTSIZE);
+}
+
+
+/*
+ * Downsample pixel values of a single component.
+ * This version handles the common case of 2:1 horizontal and 1:1 vertical,
+ * without smoothing.
+ *
+ * A note about the "bias" calculations: when rounding fractional values to
+ * integer, we do not want to always round 0.5 up to the next integer.
+ * If we did that, we'd introduce a noticeable bias towards larger values.
+ * Instead, this code is arranged so that 0.5 will be rounded up or down at
+ * alternate pixel locations (a simple ordered dither pattern).
+ */
+
+METHODDEF(void)
+h2v1_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr,
+ JSAMPARRAY input_data, JSAMPARRAY output_data)
+{
+ int outrow;
+ JDIMENSION outcol;
+ JDIMENSION output_cols = compptr->width_in_blocks * DCTSIZE;
+ register JSAMPROW inptr, outptr;
+ register int bias;
+
+ /* Expand input data enough to let all the output samples be generated
+ * by the standard loop. Special-casing padded output would be more
+ * efficient.
+ */
+ expand_right_edge(input_data, cinfo->max_v_samp_factor,
+ cinfo->image_width, output_cols * 2);
+
+ for (outrow = 0; outrow < compptr->v_samp_factor; outrow++) {
+ outptr = output_data[outrow];
+ inptr = input_data[outrow];
+ bias = 0; /* bias = 0,1,0,1,... for successive samples */
+ for (outcol = 0; outcol < output_cols; outcol++) {
+ *outptr++ = (JSAMPLE) ((GETJSAMPLE(*inptr) + GETJSAMPLE(inptr[1])
+ + bias) >> 1);
+ bias ^= 1; /* 0=>1, 1=>0 */
+ inptr += 2;
+ }
+ }
+}
+
+
+/*
+ * Downsample pixel values of a single component.
+ * This version handles the standard case of 2:1 horizontal and 2:1 vertical,
+ * without smoothing.
+ */
+
+METHODDEF(void)
+h2v2_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr,
+ JSAMPARRAY input_data, JSAMPARRAY output_data)
+{
+ int inrow, outrow;
+ JDIMENSION outcol;
+ JDIMENSION output_cols = compptr->width_in_blocks * DCTSIZE;
+ register JSAMPROW inptr0, inptr1, outptr;
+ register int bias;
+
+ /* Expand input data enough to let all the output samples be generated
+ * by the standard loop. Special-casing padded output would be more
+ * efficient.
+ */
+ expand_right_edge(input_data, cinfo->max_v_samp_factor,
+ cinfo->image_width, output_cols * 2);
+
+ inrow = 0;
+ for (outrow = 0; outrow < compptr->v_samp_factor; outrow++) {
+ outptr = output_data[outrow];
+ inptr0 = input_data[inrow];
+ inptr1 = input_data[inrow+1];
+ bias = 1; /* bias = 1,2,1,2,... for successive samples */
+ for (outcol = 0; outcol < output_cols; outcol++) {
+ *outptr++ = (JSAMPLE) ((GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[1]) +
+ GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[1])
+ + bias) >> 2);
+ bias ^= 3; /* 1=>2, 2=>1 */
+ inptr0 += 2; inptr1 += 2;
+ }
+ inrow += 2;
+ }
+}
+
+
+#ifdef INPUT_SMOOTHING_SUPPORTED
+
+/*
+ * Downsample pixel values of a single component.
+ * This version handles the standard case of 2:1 horizontal and 2:1 vertical,
+ * with smoothing. One row of context is required.
+ */
+
+METHODDEF(void)
+h2v2_smooth_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr,
+ JSAMPARRAY input_data, JSAMPARRAY output_data)
+{
+ int inrow, outrow;
+ JDIMENSION colctr;
+ JDIMENSION output_cols = compptr->width_in_blocks * DCTSIZE;
+ register JSAMPROW inptr0, inptr1, above_ptr, below_ptr, outptr;
+ INT32 membersum, neighsum, memberscale, neighscale;
+
+ /* Expand input data enough to let all the output samples be generated
+ * by the standard loop. Special-casing padded output would be more
+ * efficient.
+ */
+ expand_right_edge(input_data - 1, cinfo->max_v_samp_factor + 2,
+ cinfo->image_width, output_cols * 2);
+
+ /* We don't bother to form the individual "smoothed" input pixel values;
+ * we can directly compute the output which is the average of the four
+ * smoothed values. Each of the four member pixels contributes a fraction
+ * (1-8*SF) to its own smoothed image and a fraction SF to each of the three
+ * other smoothed pixels, therefore a total fraction (1-5*SF)/4 to the final
+ * output. The four corner-adjacent neighbor pixels contribute a fraction
+ * SF to just one smoothed pixel, or SF/4 to the final output; while the
+ * eight edge-adjacent neighbors contribute SF to each of two smoothed
+ * pixels, or SF/2 overall. In order to use integer arithmetic, these
+ * factors are scaled by 2^16 = 65536.
+ * Also recall that SF = smoothing_factor / 1024.
+ */
+
+ memberscale = 16384 - cinfo->smoothing_factor * 80; /* scaled (1-5*SF)/4 */
+ neighscale = cinfo->smoothing_factor * 16; /* scaled SF/4 */
+
+ inrow = 0;
+ for (outrow = 0; outrow < compptr->v_samp_factor; outrow++) {
+ outptr = output_data[outrow];
+ inptr0 = input_data[inrow];
+ inptr1 = input_data[inrow+1];
+ above_ptr = input_data[inrow-1];
+ below_ptr = input_data[inrow+2];
+
+ /* Special case for first column: pretend column -1 is same as column 0 */
+ membersum = GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[1]) +
+ GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[1]);
+ neighsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(above_ptr[1]) +
+ GETJSAMPLE(*below_ptr) + GETJSAMPLE(below_ptr[1]) +
+ GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[2]) +
+ GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[2]);
+ neighsum += neighsum;
+ neighsum += GETJSAMPLE(*above_ptr) + GETJSAMPLE(above_ptr[2]) +
+ GETJSAMPLE(*below_ptr) + GETJSAMPLE(below_ptr[2]);
+ membersum = membersum * memberscale + neighsum * neighscale;
+ *outptr++ = (JSAMPLE) ((membersum + 32768) >> 16);
+ inptr0 += 2; inptr1 += 2; above_ptr += 2; below_ptr += 2;
+
+ for (colctr = output_cols - 2; colctr > 0; colctr--) {
+ /* sum of pixels directly mapped to this output element */
+ membersum = GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[1]) +
+ GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[1]);
+ /* sum of edge-neighbor pixels */
+ neighsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(above_ptr[1]) +
+ GETJSAMPLE(*below_ptr) + GETJSAMPLE(below_ptr[1]) +
+ GETJSAMPLE(inptr0[-1]) + GETJSAMPLE(inptr0[2]) +
+ GETJSAMPLE(inptr1[-1]) + GETJSAMPLE(inptr1[2]);
+ /* The edge-neighbors count twice as much as corner-neighbors */
+ neighsum += neighsum;
+ /* Add in the corner-neighbors */
+ neighsum += GETJSAMPLE(above_ptr[-1]) + GETJSAMPLE(above_ptr[2]) +
+ GETJSAMPLE(below_ptr[-1]) + GETJSAMPLE(below_ptr[2]);
+ /* form final output scaled up by 2^16 */
+ membersum = membersum * memberscale + neighsum * neighscale;
+ /* round, descale and output it */
+ *outptr++ = (JSAMPLE) ((membersum + 32768) >> 16);
+ inptr0 += 2; inptr1 += 2; above_ptr += 2; below_ptr += 2;
+ }
+
+ /* Special case for last column */
+ membersum = GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[1]) +
+ GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[1]);
+ neighsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(above_ptr[1]) +
+ GETJSAMPLE(*below_ptr) + GETJSAMPLE(below_ptr[1]) +
+ GETJSAMPLE(inptr0[-1]) + GETJSAMPLE(inptr0[1]) +
+ GETJSAMPLE(inptr1[-1]) + GETJSAMPLE(inptr1[1]);
+ neighsum += neighsum;
+ neighsum += GETJSAMPLE(above_ptr[-1]) + GETJSAMPLE(above_ptr[1]) +
+ GETJSAMPLE(below_ptr[-1]) + GETJSAMPLE(below_ptr[1]);
+ membersum = membersum * memberscale + neighsum * neighscale;
+ *outptr = (JSAMPLE) ((membersum + 32768) >> 16);
+
+ inrow += 2;
+ }
+}
+
+
+/*
+ * Downsample pixel values of a single component.
+ * This version handles the special case of a full-size component,
+ * with smoothing. One row of context is required.
+ */
+
+METHODDEF(void)
+fullsize_smooth_downsample (j_compress_ptr cinfo, jpeg_component_info *compptr,
+ JSAMPARRAY input_data, JSAMPARRAY output_data)
+{
+ int outrow;
+ JDIMENSION colctr;
+ JDIMENSION output_cols = compptr->width_in_blocks * DCTSIZE;
+ register JSAMPROW inptr, above_ptr, below_ptr, outptr;
+ INT32 membersum, neighsum, memberscale, neighscale;
+ int colsum, lastcolsum, nextcolsum;
+
+ /* Expand input data enough to let all the output samples be generated
+ * by the standard loop. Special-casing padded output would be more
+ * efficient.
+ */
+ expand_right_edge(input_data - 1, cinfo->max_v_samp_factor + 2,
+ cinfo->image_width, output_cols);
+
+ /* Each of the eight neighbor pixels contributes a fraction SF to the
+ * smoothed pixel, while the main pixel contributes (1-8*SF). In order
+ * to use integer arithmetic, these factors are multiplied by 2^16 = 65536.
+ * Also recall that SF = smoothing_factor / 1024.
+ */
+
+ memberscale = 65536L - cinfo->smoothing_factor * 512L; /* scaled 1-8*SF */
+ neighscale = cinfo->smoothing_factor * 64; /* scaled SF */
+
+ for (outrow = 0; outrow < compptr->v_samp_factor; outrow++) {
+ outptr = output_data[outrow];
+ inptr = input_data[outrow];
+ above_ptr = input_data[outrow-1];
+ below_ptr = input_data[outrow+1];
+
+ /* Special case for first column */
+ colsum = GETJSAMPLE(*above_ptr++) + GETJSAMPLE(*below_ptr++) +
+ GETJSAMPLE(*inptr);
+ membersum = GETJSAMPLE(*inptr++);
+ nextcolsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(*below_ptr) +
+ GETJSAMPLE(*inptr);
+ neighsum = colsum + (colsum - membersum) + nextcolsum;
+ membersum = membersum * memberscale + neighsum * neighscale;
+ *outptr++ = (JSAMPLE) ((membersum + 32768) >> 16);
+ lastcolsum = colsum; colsum = nextcolsum;
+
+ for (colctr = output_cols - 2; colctr > 0; colctr--) {
+ membersum = GETJSAMPLE(*inptr++);
+ above_ptr++; below_ptr++;
+ nextcolsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(*below_ptr) +
+ GETJSAMPLE(*inptr);
+ neighsum = lastcolsum + (colsum - membersum) + nextcolsum;
+ membersum = membersum * memberscale + neighsum * neighscale;
+ *outptr++ = (JSAMPLE) ((membersum + 32768) >> 16);
+ lastcolsum = colsum; colsum = nextcolsum;
+ }
+
+ /* Special case for last column */
+ membersum = GETJSAMPLE(*inptr);
+ neighsum = lastcolsum + (colsum - membersum) + colsum;
+ membersum = membersum * memberscale + neighsum * neighscale;
+ *outptr = (JSAMPLE) ((membersum + 32768) >> 16);
+
+ }
+}
+
+#endif /* INPUT_SMOOTHING_SUPPORTED */
+
+
+/*
+ * Module initialization routine for downsampling.
+ * Note that we must select a routine for each component.
+ */
+
+GLOBAL(void)
+jinit_downsampler (j_compress_ptr cinfo)
+{
+ my_downsample_ptr downsample;
+ int ci;
+ jpeg_component_info * compptr;
+ boolean smoothok = TRUE;
+
+ downsample = (my_downsample_ptr)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ SIZEOF(my_downsampler));
+ cinfo->downsample = (struct jpeg_downsampler *) downsample;
+ downsample->pub.start_pass = start_pass_downsample;
+ downsample->pub.downsample = sep_downsample;
+ downsample->pub.need_context_rows = FALSE;
+
+ if (cinfo->CCIR601_sampling)
+ ERREXIT(cinfo, JERR_CCIR601_NOTIMPL);
+
+ /* Verify we can handle the sampling factors, and set up method pointers */
+ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+ ci++, compptr++) {
+ if (compptr->h_samp_factor == cinfo->max_h_samp_factor &&
+ compptr->v_samp_factor == cinfo->max_v_samp_factor) {
+#ifdef INPUT_SMOOTHING_SUPPORTED
+ if (cinfo->smoothing_factor) {
+ downsample->methods[ci] = fullsize_smooth_downsample;
+ downsample->pub.need_context_rows = TRUE;
+ } else
+#endif
+ downsample->methods[ci] = fullsize_downsample;
+ } else if (compptr->h_samp_factor * 2 == cinfo->max_h_samp_factor &&
+ compptr->v_samp_factor == cinfo->max_v_samp_factor) {
+ smoothok = FALSE;
+ downsample->methods[ci] = h2v1_downsample;
+ } else if (compptr->h_samp_factor * 2 == cinfo->max_h_samp_factor &&
+ compptr->v_samp_factor * 2 == cinfo->max_v_samp_factor) {
+#ifdef INPUT_SMOOTHING_SUPPORTED
+ if (cinfo->smoothing_factor) {
+ downsample->methods[ci] = h2v2_smooth_downsample;
+ downsample->pub.need_context_rows = TRUE;
+ } else
+#endif
+ downsample->methods[ci] = h2v2_downsample;
+ } else if ((cinfo->max_h_samp_factor % compptr->h_samp_factor) == 0 &&
+ (cinfo->max_v_samp_factor % compptr->v_samp_factor) == 0) {
+ smoothok = FALSE;
+ downsample->methods[ci] = int_downsample;
+ } else
+ ERREXIT(cinfo, JERR_FRACT_SAMPLE_NOTIMPL);
+ }
+
+#ifdef INPUT_SMOOTHING_SUPPORTED
+ if (cinfo->smoothing_factor && !smoothok)
+ TRACEMS(cinfo, 0, JTRC_SMOOTH_NOTIMPL);
+#endif
+}
+
+#endif //_FX_JPEG_TURBO_
diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jctrans.c b/core/src/fxcodec/libjpeg/fpdfapi_jctrans.c
index ed541159f1..40d166736b 100644
--- a/core/src/fxcodec/libjpeg/fpdfapi_jctrans.c
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jctrans.c
@@ -1,391 +1,391 @@
-#if !defined(_FX_JPEG_TURBO_)
-/*
- * jctrans.c
- *
- * Copyright (C) 1995-1998, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains library routines for transcoding compression,
- * that is, writing raw DCT coefficient arrays to an output JPEG file.
- * The routines in jcapimin.c will also be needed by a transcoder.
- */
-
-#define JPEG_INTERNALS
-#include "jinclude.h"
-#include "jpeglib.h"
-
-
-/* Forward declarations */
-LOCAL(void) transencode_master_selection
- JPP((j_compress_ptr cinfo, jvirt_barray_ptr * coef_arrays));
-LOCAL(void) transencode_coef_controller
- JPP((j_compress_ptr cinfo, jvirt_barray_ptr * coef_arrays));
-
-
-/*
- * Compression initialization for writing raw-coefficient data.
- * Before calling this, all parameters and a data destination must be set up.
- * Call jpeg_finish_compress() to actually write the data.
- *
- * The number of passed virtual arrays must match cinfo->num_components.
- * Note that the virtual arrays need not be filled or even realized at
- * the time write_coefficients is called; indeed, if the virtual arrays
- * were requested from this compression object's memory manager, they
- * typically will be realized during this routine and filled afterwards.
- */
-
-GLOBAL(void)
-jpeg_write_coefficients (j_compress_ptr cinfo, jvirt_barray_ptr * coef_arrays)
-{
- if (cinfo->global_state != CSTATE_START)
- ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
- /* Mark all tables to be written */
- jpeg_suppress_tables(cinfo, FALSE);
- /* (Re)initialize error mgr and destination modules */
- (*cinfo->err->reset_error_mgr) ((j_common_ptr) cinfo);
- (*cinfo->dest->init_destination) (cinfo);
- /* Perform master selection of active modules */
- transencode_master_selection(cinfo, coef_arrays);
- /* Wait for jpeg_finish_compress() call */
- cinfo->next_scanline = 0; /* so jpeg_write_marker works */
- cinfo->global_state = CSTATE_WRCOEFS;
-}
-
-
-/*
- * Initialize the compression object with default parameters,
- * then copy from the source object all parameters needed for lossless
- * transcoding. Parameters that can be varied without loss (such as
- * scan script and Huffman optimization) are left in their default states.
- */
-
-GLOBAL(void)
-jpeg_copy_critical_parameters (j_decompress_ptr srcinfo,
- j_compress_ptr dstinfo)
-{
- JQUANT_TBL ** qtblptr;
- jpeg_component_info *incomp, *outcomp;
- JQUANT_TBL *c_quant, *slot_quant;
- int tblno, ci, coefi;
-
- /* Safety check to ensure start_compress not called yet. */
- if (dstinfo->global_state != CSTATE_START)
- ERREXIT1(dstinfo, JERR_BAD_STATE, dstinfo->global_state);
- /* Copy fundamental image dimensions */
- dstinfo->image_width = srcinfo->image_width;
- dstinfo->image_height = srcinfo->image_height;
- dstinfo->input_components = srcinfo->num_components;
- dstinfo->in_color_space = srcinfo->jpeg_color_space;
- /* Initialize all parameters to default values */
- jpeg_set_defaults(dstinfo);
- /* jpeg_set_defaults may choose wrong colorspace, eg YCbCr if input is RGB.
- * Fix it to get the right header markers for the image colorspace.
- */
- jpeg_set_colorspace(dstinfo, srcinfo->jpeg_color_space);
- dstinfo->data_precision = srcinfo->data_precision;
- dstinfo->CCIR601_sampling = srcinfo->CCIR601_sampling;
- /* Copy the source's quantization tables. */
- for (tblno = 0; tblno < NUM_QUANT_TBLS; tblno++) {
- if (srcinfo->quant_tbl_ptrs[tblno] != NULL) {
- qtblptr = & dstinfo->quant_tbl_ptrs[tblno];
- if (*qtblptr == NULL)
- *qtblptr = jpeg_alloc_quant_table((j_common_ptr) dstinfo);
- MEMCOPY((*qtblptr)->quantval,
- srcinfo->quant_tbl_ptrs[tblno]->quantval,
- SIZEOF((*qtblptr)->quantval));
- (*qtblptr)->sent_table = FALSE;
- }
- }
- /* Copy the source's per-component info.
- * Note we assume jpeg_set_defaults has allocated the dest comp_info array.
- */
- dstinfo->num_components = srcinfo->num_components;
- if (dstinfo->num_components < 1 || dstinfo->num_components > MAX_COMPONENTS)
- ERREXIT2(dstinfo, JERR_COMPONENT_COUNT, dstinfo->num_components,
- MAX_COMPONENTS);
- for (ci = 0, incomp = srcinfo->comp_info, outcomp = dstinfo->comp_info;
- ci < dstinfo->num_components; ci++, incomp++, outcomp++) {
- outcomp->component_id = incomp->component_id;
- outcomp->h_samp_factor = incomp->h_samp_factor;
- outcomp->v_samp_factor = incomp->v_samp_factor;
- outcomp->quant_tbl_no = incomp->quant_tbl_no;
- /* Make sure saved quantization table for component matches the qtable
- * slot. If not, the input file re-used this qtable slot.
- * IJG encoder currently cannot duplicate this.
- */
- tblno = outcomp->quant_tbl_no;
- if (tblno < 0 || tblno >= NUM_QUANT_TBLS ||
- srcinfo->quant_tbl_ptrs[tblno] == NULL)
- ERREXIT1(dstinfo, JERR_NO_QUANT_TABLE, tblno);
- slot_quant = srcinfo->quant_tbl_ptrs[tblno];
- c_quant = incomp->quant_table;
- if (c_quant != NULL) {
- for (coefi = 0; coefi < DCTSIZE2; coefi++) {
- if (c_quant->quantval[coefi] != slot_quant->quantval[coefi])
- ERREXIT1(dstinfo, JERR_MISMATCHED_QUANT_TABLE, tblno);
- }
- }
- /* Note: we do not copy the source's Huffman table assignments;
- * instead we rely on jpeg_set_colorspace to have made a suitable choice.
- */
- }
- /* Also copy JFIF version and resolution information, if available.
- * Strictly speaking this isn't "critical" info, but it's nearly
- * always appropriate to copy it if available. In particular,
- * if the application chooses to copy JFIF 1.02 extension markers from
- * the source file, we need to copy the version to make sure we don't
- * emit a file that has 1.02 extensions but a claimed version of 1.01.
- * We will *not*, however, copy version info from mislabeled "2.01" files.
- */
- if (srcinfo->saw_JFIF_marker) {
- if (srcinfo->JFIF_major_version == 1) {
- dstinfo->JFIF_major_version = srcinfo->JFIF_major_version;
- dstinfo->JFIF_minor_version = srcinfo->JFIF_minor_version;
- }
- dstinfo->density_unit = srcinfo->density_unit;
- dstinfo->X_density = srcinfo->X_density;
- dstinfo->Y_density = srcinfo->Y_density;
- }
-}
-
-
-/*
- * Master selection of compression modules for transcoding.
- * This substitutes for jcinit.c's initialization of the full compressor.
- */
-
-LOCAL(void)
-transencode_master_selection (j_compress_ptr cinfo,
- jvirt_barray_ptr * coef_arrays)
-{
- /* Although we don't actually use input_components for transcoding,
- * jcmaster.c's initial_setup will complain if input_components is 0.
- */
- cinfo->input_components = 1;
- /* Initialize master control (includes parameter checking/processing) */
- jinit_c_master_control(cinfo, TRUE /* transcode only */);
-
- /* Entropy encoding: either Huffman or arithmetic coding. */
- if (cinfo->arith_code) {
- ERREXIT(cinfo, JERR_ARITH_NOTIMPL);
- } else {
- if (cinfo->progressive_mode) {
-#ifdef C_PROGRESSIVE_SUPPORTED
- jinit_phuff_encoder(cinfo);
-#else
- ERREXIT(cinfo, JERR_NOT_COMPILED);
-#endif
- } else
- jinit_huff_encoder(cinfo);
- }
-
- /* We need a special coefficient buffer controller. */
- transencode_coef_controller(cinfo, coef_arrays);
-
- jinit_marker_writer(cinfo);
-
- /* We can now tell the memory manager to allocate virtual arrays. */
- (*cinfo->mem->realize_virt_arrays) ((j_common_ptr) cinfo);
-
- /* Write the datastream header (SOI, JFIF) immediately.
- * Frame and scan headers are postponed till later.
- * This lets application insert special markers after the SOI.
- */
- (*cinfo->marker->write_file_header) (cinfo);
-}
-
-
-/*
- * The rest of this file is a special implementation of the coefficient
- * buffer controller. This is similar to jccoefct.c, but it handles only
- * output from presupplied virtual arrays. Furthermore, we generate any
- * dummy padding blocks on-the-fly rather than expecting them to be present
- * in the arrays.
- */
-
-/* Private buffer controller object */
-
-typedef struct {
- struct jpeg_c_coef_controller pub; /* public fields */
-
- JDIMENSION iMCU_row_num; /* iMCU row # within image */
- JDIMENSION mcu_ctr; /* counts MCUs processed in current row */
- int MCU_vert_offset; /* counts MCU rows within iMCU row */
- int MCU_rows_per_iMCU_row; /* number of such rows needed */
-
- /* Virtual block array for each component. */
- jvirt_barray_ptr * whole_image;
-
- /* Workspace for constructing dummy blocks at right/bottom edges. */
- JBLOCKROW dummy_buffer[C_MAX_BLOCKS_IN_MCU];
-} my_coef_controller;
-
-typedef my_coef_controller * my_coef_ptr;
-
-
-LOCAL(void)
-start_iMCU_row (j_compress_ptr cinfo)
-/* Reset within-iMCU-row counters for a new row */
-{
- my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
-
- /* In an interleaved scan, an MCU row is the same as an iMCU row.
- * In a noninterleaved scan, an iMCU row has v_samp_factor MCU rows.
- * But at the bottom of the image, process only what's left.
- */
- if (cinfo->comps_in_scan > 1) {
- coef->MCU_rows_per_iMCU_row = 1;
- } else {
- if (coef->iMCU_row_num < (cinfo->total_iMCU_rows-1))
- coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->v_samp_factor;
- else
- coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->last_row_height;
- }
-
- coef->mcu_ctr = 0;
- coef->MCU_vert_offset = 0;
-}
-
-
-/*
- * Initialize for a processing pass.
- */
-
-METHODDEF(void)
-start_pass_coef (j_compress_ptr cinfo, J_BUF_MODE pass_mode)
-{
- my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
-
- if (pass_mode != JBUF_CRANK_DEST)
- ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
-
- coef->iMCU_row_num = 0;
- start_iMCU_row(cinfo);
-}
-
-
-/*
- * Process some data.
- * We process the equivalent of one fully interleaved MCU row ("iMCU" row)
- * per call, ie, v_samp_factor block rows for each component in the scan.
- * The data is obtained from the virtual arrays and fed to the entropy coder.
- * Returns TRUE if the iMCU row is completed, FALSE if suspended.
- *
- * NB: input_buf is ignored; it is likely to be a NULL pointer.
- */
-
-METHODDEF(boolean)
-compress_output (j_compress_ptr cinfo, JSAMPIMAGE input_buf)
-{
- my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
- JDIMENSION MCU_col_num; /* index of current MCU within row */
- JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;
- JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
- int blkn, ci, xindex, yindex, yoffset, blockcnt;
- JDIMENSION start_col;
- JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
- JBLOCKROW MCU_buffer[C_MAX_BLOCKS_IN_MCU];
- JBLOCKROW buffer_ptr;
- jpeg_component_info *compptr;
-
- /* Align the virtual buffers for the components used in this scan. */
- for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
- compptr = cinfo->cur_comp_info[ci];
- buffer[ci] = (*cinfo->mem->access_virt_barray)
- ((j_common_ptr) cinfo, coef->whole_image[compptr->component_index],
- coef->iMCU_row_num * compptr->v_samp_factor,
- (JDIMENSION) compptr->v_samp_factor, FALSE);
- }
-
- /* Loop to process one whole iMCU row */
- for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
- yoffset++) {
- for (MCU_col_num = coef->mcu_ctr; MCU_col_num < cinfo->MCUs_per_row;
- MCU_col_num++) {
- /* Construct list of pointers to DCT blocks belonging to this MCU */
- blkn = 0; /* index of current DCT block within MCU */
- for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
- compptr = cinfo->cur_comp_info[ci];
- start_col = MCU_col_num * compptr->MCU_width;
- blockcnt = (MCU_col_num < last_MCU_col) ? compptr->MCU_width
- : compptr->last_col_width;
- for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
- if (coef->iMCU_row_num < last_iMCU_row ||
- yindex+yoffset < compptr->last_row_height) {
- /* Fill in pointers to real blocks in this row */
- buffer_ptr = buffer[ci][yindex+yoffset] + start_col;
- for (xindex = 0; xindex < blockcnt; xindex++)
- MCU_buffer[blkn++] = buffer_ptr++;
- } else {
- /* At bottom of image, need a whole row of dummy blocks */
- xindex = 0;
- }
- /* Fill in any dummy blocks needed in this row.
- * Dummy blocks are filled in the same way as in jccoefct.c:
- * all zeroes in the AC entries, DC entries equal to previous
- * block's DC value. The init routine has already zeroed the
- * AC entries, so we need only set the DC entries correctly.
- */
- for (; xindex < compptr->MCU_width; xindex++) {
- MCU_buffer[blkn] = coef->dummy_buffer[blkn];
- MCU_buffer[blkn][0][0] = MCU_buffer[blkn-1][0][0];
- blkn++;
- }
- }
- }
- /* Try to write the MCU. */
- if (! (*cinfo->entropy->encode_mcu) (cinfo, MCU_buffer)) {
- /* Suspension forced; update state counters and exit */
- coef->MCU_vert_offset = yoffset;
- coef->mcu_ctr = MCU_col_num;
- return FALSE;
- }
- }
- /* Completed an MCU row, but perhaps not an iMCU row */
- coef->mcu_ctr = 0;
- }
- /* Completed the iMCU row, advance counters for next one */
- coef->iMCU_row_num++;
- start_iMCU_row(cinfo);
- return TRUE;
-}
-
-
-/*
- * Initialize coefficient buffer controller.
- *
- * Each passed coefficient array must be the right size for that
- * coefficient: width_in_blocks wide and height_in_blocks high,
- * with unitheight at least v_samp_factor.
- */
-
-LOCAL(void)
-transencode_coef_controller (j_compress_ptr cinfo,
- jvirt_barray_ptr * coef_arrays)
-{
- my_coef_ptr coef;
- JBLOCKROW buffer;
- int i;
-
- coef = (my_coef_ptr)
- (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
- SIZEOF(my_coef_controller));
- cinfo->coef = (struct jpeg_c_coef_controller *) coef;
- coef->pub.start_pass = start_pass_coef;
- coef->pub.compress_data = compress_output;
-
- /* Save pointer to virtual arrays */
- coef->whole_image = coef_arrays;
-
- /* Allocate and pre-zero space for dummy DCT blocks. */
- buffer = (JBLOCKROW)
- (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE,
- C_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK));
- jzero_far((void FAR *) buffer, C_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK));
- for (i = 0; i < C_MAX_BLOCKS_IN_MCU; i++) {
- coef->dummy_buffer[i] = buffer + i;
- }
-}
-
-#endif //_FX_JPEG_TURBO_
+#if !defined(_FX_JPEG_TURBO_)
+/*
+ * jctrans.c
+ *
+ * Copyright (C) 1995-1998, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains library routines for transcoding compression,
+ * that is, writing raw DCT coefficient arrays to an output JPEG file.
+ * The routines in jcapimin.c will also be needed by a transcoder.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+
+
+/* Forward declarations */
+LOCAL(void) transencode_master_selection
+ JPP((j_compress_ptr cinfo, jvirt_barray_ptr * coef_arrays));
+LOCAL(void) transencode_coef_controller
+ JPP((j_compress_ptr cinfo, jvirt_barray_ptr * coef_arrays));
+
+
+/*
+ * Compression initialization for writing raw-coefficient data.
+ * Before calling this, all parameters and a data destination must be set up.
+ * Call jpeg_finish_compress() to actually write the data.
+ *
+ * The number of passed virtual arrays must match cinfo->num_components.
+ * Note that the virtual arrays need not be filled or even realized at
+ * the time write_coefficients is called; indeed, if the virtual arrays
+ * were requested from this compression object's memory manager, they
+ * typically will be realized during this routine and filled afterwards.
+ */
+
+GLOBAL(void)
+jpeg_write_coefficients (j_compress_ptr cinfo, jvirt_barray_ptr * coef_arrays)
+{
+ if (cinfo->global_state != CSTATE_START)
+ ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
+ /* Mark all tables to be written */
+ jpeg_suppress_tables(cinfo, FALSE);
+ /* (Re)initialize error mgr and destination modules */
+ (*cinfo->err->reset_error_mgr) ((j_common_ptr) cinfo);
+ (*cinfo->dest->init_destination) (cinfo);
+ /* Perform master selection of active modules */
+ transencode_master_selection(cinfo, coef_arrays);
+ /* Wait for jpeg_finish_compress() call */
+ cinfo->next_scanline = 0; /* so jpeg_write_marker works */
+ cinfo->global_state = CSTATE_WRCOEFS;
+}
+
+
+/*
+ * Initialize the compression object with default parameters,
+ * then copy from the source object all parameters needed for lossless
+ * transcoding. Parameters that can be varied without loss (such as
+ * scan script and Huffman optimization) are left in their default states.
+ */
+
+GLOBAL(void)
+jpeg_copy_critical_parameters (j_decompress_ptr srcinfo,
+ j_compress_ptr dstinfo)
+{
+ JQUANT_TBL ** qtblptr;
+ jpeg_component_info *incomp, *outcomp;
+ JQUANT_TBL *c_quant, *slot_quant;
+ int tblno, ci, coefi;
+
+ /* Safety check to ensure start_compress not called yet. */
+ if (dstinfo->global_state != CSTATE_START)
+ ERREXIT1(dstinfo, JERR_BAD_STATE, dstinfo->global_state);
+ /* Copy fundamental image dimensions */
+ dstinfo->image_width = srcinfo->image_width;
+ dstinfo->image_height = srcinfo->image_height;
+ dstinfo->input_components = srcinfo->num_components;
+ dstinfo->in_color_space = srcinfo->jpeg_color_space;
+ /* Initialize all parameters to default values */
+ jpeg_set_defaults(dstinfo);
+ /* jpeg_set_defaults may choose wrong colorspace, eg YCbCr if input is RGB.
+ * Fix it to get the right header markers for the image colorspace.
+ */
+ jpeg_set_colorspace(dstinfo, srcinfo->jpeg_color_space);
+ dstinfo->data_precision = srcinfo->data_precision;
+ dstinfo->CCIR601_sampling = srcinfo->CCIR601_sampling;
+ /* Copy the source's quantization tables. */
+ for (tblno = 0; tblno < NUM_QUANT_TBLS; tblno++) {
+ if (srcinfo->quant_tbl_ptrs[tblno] != NULL) {
+ qtblptr = & dstinfo->quant_tbl_ptrs[tblno];
+ if (*qtblptr == NULL)
+ *qtblptr = jpeg_alloc_quant_table((j_common_ptr) dstinfo);
+ MEMCOPY((*qtblptr)->quantval,
+ srcinfo->quant_tbl_ptrs[tblno]->quantval,
+ SIZEOF((*qtblptr)->quantval));
+ (*qtblptr)->sent_table = FALSE;
+ }
+ }
+ /* Copy the source's per-component info.
+ * Note we assume jpeg_set_defaults has allocated the dest comp_info array.
+ */
+ dstinfo->num_components = srcinfo->num_components;
+ if (dstinfo->num_components < 1 || dstinfo->num_components > MAX_COMPONENTS)
+ ERREXIT2(dstinfo, JERR_COMPONENT_COUNT, dstinfo->num_components,
+ MAX_COMPONENTS);
+ for (ci = 0, incomp = srcinfo->comp_info, outcomp = dstinfo->comp_info;
+ ci < dstinfo->num_components; ci++, incomp++, outcomp++) {
+ outcomp->component_id = incomp->component_id;
+ outcomp->h_samp_factor = incomp->h_samp_factor;
+ outcomp->v_samp_factor = incomp->v_samp_factor;
+ outcomp->quant_tbl_no = incomp->quant_tbl_no;
+ /* Make sure saved quantization table for component matches the qtable
+ * slot. If not, the input file re-used this qtable slot.
+ * IJG encoder currently cannot duplicate this.
+ */
+ tblno = outcomp->quant_tbl_no;
+ if (tblno < 0 || tblno >= NUM_QUANT_TBLS ||
+ srcinfo->quant_tbl_ptrs[tblno] == NULL)
+ ERREXIT1(dstinfo, JERR_NO_QUANT_TABLE, tblno);
+ slot_quant = srcinfo->quant_tbl_ptrs[tblno];
+ c_quant = incomp->quant_table;
+ if (c_quant != NULL) {
+ for (coefi = 0; coefi < DCTSIZE2; coefi++) {
+ if (c_quant->quantval[coefi] != slot_quant->quantval[coefi])
+ ERREXIT1(dstinfo, JERR_MISMATCHED_QUANT_TABLE, tblno);
+ }
+ }
+ /* Note: we do not copy the source's Huffman table assignments;
+ * instead we rely on jpeg_set_colorspace to have made a suitable choice.
+ */
+ }
+ /* Also copy JFIF version and resolution information, if available.
+ * Strictly speaking this isn't "critical" info, but it's nearly
+ * always appropriate to copy it if available. In particular,
+ * if the application chooses to copy JFIF 1.02 extension markers from
+ * the source file, we need to copy the version to make sure we don't
+ * emit a file that has 1.02 extensions but a claimed version of 1.01.
+ * We will *not*, however, copy version info from mislabeled "2.01" files.
+ */
+ if (srcinfo->saw_JFIF_marker) {
+ if (srcinfo->JFIF_major_version == 1) {
+ dstinfo->JFIF_major_version = srcinfo->JFIF_major_version;
+ dstinfo->JFIF_minor_version = srcinfo->JFIF_minor_version;
+ }
+ dstinfo->density_unit = srcinfo->density_unit;
+ dstinfo->X_density = srcinfo->X_density;
+ dstinfo->Y_density = srcinfo->Y_density;
+ }
+}
+
+
+/*
+ * Master selection of compression modules for transcoding.
+ * This substitutes for jcinit.c's initialization of the full compressor.
+ */
+
+LOCAL(void)
+transencode_master_selection (j_compress_ptr cinfo,
+ jvirt_barray_ptr * coef_arrays)
+{
+ /* Although we don't actually use input_components for transcoding,
+ * jcmaster.c's initial_setup will complain if input_components is 0.
+ */
+ cinfo->input_components = 1;
+ /* Initialize master control (includes parameter checking/processing) */
+ jinit_c_master_control(cinfo, TRUE /* transcode only */);
+
+ /* Entropy encoding: either Huffman or arithmetic coding. */
+ if (cinfo->arith_code) {
+ ERREXIT(cinfo, JERR_ARITH_NOTIMPL);
+ } else {
+ if (cinfo->progressive_mode) {
+#ifdef C_PROGRESSIVE_SUPPORTED
+ jinit_phuff_encoder(cinfo);
+#else
+ ERREXIT(cinfo, JERR_NOT_COMPILED);
+#endif
+ } else
+ jinit_huff_encoder(cinfo);
+ }
+
+ /* We need a special coefficient buffer controller. */
+ transencode_coef_controller(cinfo, coef_arrays);
+
+ jinit_marker_writer(cinfo);
+
+ /* We can now tell the memory manager to allocate virtual arrays. */
+ (*cinfo->mem->realize_virt_arrays) ((j_common_ptr) cinfo);
+
+ /* Write the datastream header (SOI, JFIF) immediately.
+ * Frame and scan headers are postponed till later.
+ * This lets application insert special markers after the SOI.
+ */
+ (*cinfo->marker->write_file_header) (cinfo);
+}
+
+
+/*
+ * The rest of this file is a special implementation of the coefficient
+ * buffer controller. This is similar to jccoefct.c, but it handles only
+ * output from presupplied virtual arrays. Furthermore, we generate any
+ * dummy padding blocks on-the-fly rather than expecting them to be present
+ * in the arrays.
+ */
+
+/* Private buffer controller object */
+
+typedef struct {
+ struct jpeg_c_coef_controller pub; /* public fields */
+
+ JDIMENSION iMCU_row_num; /* iMCU row # within image */
+ JDIMENSION mcu_ctr; /* counts MCUs processed in current row */
+ int MCU_vert_offset; /* counts MCU rows within iMCU row */
+ int MCU_rows_per_iMCU_row; /* number of such rows needed */
+
+ /* Virtual block array for each component. */
+ jvirt_barray_ptr * whole_image;
+
+ /* Workspace for constructing dummy blocks at right/bottom edges. */
+ JBLOCKROW dummy_buffer[C_MAX_BLOCKS_IN_MCU];
+} my_coef_controller;
+
+typedef my_coef_controller * my_coef_ptr;
+
+
+LOCAL(void)
+start_iMCU_row (j_compress_ptr cinfo)
+/* Reset within-iMCU-row counters for a new row */
+{
+ my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
+
+ /* In an interleaved scan, an MCU row is the same as an iMCU row.
+ * In a noninterleaved scan, an iMCU row has v_samp_factor MCU rows.
+ * But at the bottom of the image, process only what's left.
+ */
+ if (cinfo->comps_in_scan > 1) {
+ coef->MCU_rows_per_iMCU_row = 1;
+ } else {
+ if (coef->iMCU_row_num < (cinfo->total_iMCU_rows-1))
+ coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->v_samp_factor;
+ else
+ coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->last_row_height;
+ }
+
+ coef->mcu_ctr = 0;
+ coef->MCU_vert_offset = 0;
+}
+
+
+/*
+ * Initialize for a processing pass.
+ */
+
+METHODDEF(void)
+start_pass_coef (j_compress_ptr cinfo, J_BUF_MODE pass_mode)
+{
+ my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
+
+ if (pass_mode != JBUF_CRANK_DEST)
+ ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
+
+ coef->iMCU_row_num = 0;
+ start_iMCU_row(cinfo);
+}
+
+
+/*
+ * Process some data.
+ * We process the equivalent of one fully interleaved MCU row ("iMCU" row)
+ * per call, ie, v_samp_factor block rows for each component in the scan.
+ * The data is obtained from the virtual arrays and fed to the entropy coder.
+ * Returns TRUE if the iMCU row is completed, FALSE if suspended.
+ *
+ * NB: input_buf is ignored; it is likely to be a NULL pointer.
+ */
+
+METHODDEF(boolean)
+compress_output (j_compress_ptr cinfo, JSAMPIMAGE input_buf)
+{
+ my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
+ JDIMENSION MCU_col_num; /* index of current MCU within row */
+ JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;
+ JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
+ int blkn, ci, xindex, yindex, yoffset, blockcnt;
+ JDIMENSION start_col;
+ JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
+ JBLOCKROW MCU_buffer[C_MAX_BLOCKS_IN_MCU];
+ JBLOCKROW buffer_ptr;
+ jpeg_component_info *compptr;
+
+ /* Align the virtual buffers for the components used in this scan. */
+ for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
+ compptr = cinfo->cur_comp_info[ci];
+ buffer[ci] = (*cinfo->mem->access_virt_barray)
+ ((j_common_ptr) cinfo, coef->whole_image[compptr->component_index],
+ coef->iMCU_row_num * compptr->v_samp_factor,
+ (JDIMENSION) compptr->v_samp_factor, FALSE);
+ }
+
+ /* Loop to process one whole iMCU row */
+ for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
+ yoffset++) {
+ for (MCU_col_num = coef->mcu_ctr; MCU_col_num < cinfo->MCUs_per_row;
+ MCU_col_num++) {
+ /* Construct list of pointers to DCT blocks belonging to this MCU */
+ blkn = 0; /* index of current DCT block within MCU */
+ for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
+ compptr = cinfo->cur_comp_info[ci];
+ start_col = MCU_col_num * compptr->MCU_width;
+ blockcnt = (MCU_col_num < last_MCU_col) ? compptr->MCU_width
+ : compptr->last_col_width;
+ for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
+ if (coef->iMCU_row_num < last_iMCU_row ||
+ yindex+yoffset < compptr->last_row_height) {
+ /* Fill in pointers to real blocks in this row */
+ buffer_ptr = buffer[ci][yindex+yoffset] + start_col;
+ for (xindex = 0; xindex < blockcnt; xindex++)
+ MCU_buffer[blkn++] = buffer_ptr++;
+ } else {
+ /* At bottom of image, need a whole row of dummy blocks */
+ xindex = 0;
+ }
+ /* Fill in any dummy blocks needed in this row.
+ * Dummy blocks are filled in the same way as in jccoefct.c:
+ * all zeroes in the AC entries, DC entries equal to previous
+ * block's DC value. The init routine has already zeroed the
+ * AC entries, so we need only set the DC entries correctly.
+ */
+ for (; xindex < compptr->MCU_width; xindex++) {
+ MCU_buffer[blkn] = coef->dummy_buffer[blkn];
+ MCU_buffer[blkn][0][0] = MCU_buffer[blkn-1][0][0];
+ blkn++;
+ }
+ }
+ }
+ /* Try to write the MCU. */
+ if (! (*cinfo->entropy->encode_mcu) (cinfo, MCU_buffer)) {
+ /* Suspension forced; update state counters and exit */
+ coef->MCU_vert_offset = yoffset;
+ coef->mcu_ctr = MCU_col_num;
+ return FALSE;
+ }
+ }
+ /* Completed an MCU row, but perhaps not an iMCU row */
+ coef->mcu_ctr = 0;
+ }
+ /* Completed the iMCU row, advance counters for next one */
+ coef->iMCU_row_num++;
+ start_iMCU_row(cinfo);
+ return TRUE;
+}
+
+
+/*
+ * Initialize coefficient buffer controller.
+ *
+ * Each passed coefficient array must be the right size for that
+ * coefficient: width_in_blocks wide and height_in_blocks high,
+ * with unitheight at least v_samp_factor.
+ */
+
+LOCAL(void)
+transencode_coef_controller (j_compress_ptr cinfo,
+ jvirt_barray_ptr * coef_arrays)
+{
+ my_coef_ptr coef;
+ JBLOCKROW buffer;
+ int i;
+
+ coef = (my_coef_ptr)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ SIZEOF(my_coef_controller));
+ cinfo->coef = (struct jpeg_c_coef_controller *) coef;
+ coef->pub.start_pass = start_pass_coef;
+ coef->pub.compress_data = compress_output;
+
+ /* Save pointer to virtual arrays */
+ coef->whole_image = coef_arrays;
+
+ /* Allocate and pre-zero space for dummy DCT blocks. */
+ buffer = (JBLOCKROW)
+ (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ C_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK));
+ jzero_far((void FAR *) buffer, C_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK));
+ for (i = 0; i < C_MAX_BLOCKS_IN_MCU; i++) {
+ coef->dummy_buffer[i] = buffer + i;
+ }
+}
+
+#endif //_FX_JPEG_TURBO_
diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jdapimin.c b/core/src/fxcodec/libjpeg/fpdfapi_jdapimin.c
index 1b24b707b2..80c52cd29f 100644
--- a/core/src/fxcodec/libjpeg/fpdfapi_jdapimin.c
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jdapimin.c
@@ -1,398 +1,398 @@
-#if !defined(_FX_JPEG_TURBO_)
-/*
- * jdapimin.c
- *
- * Copyright (C) 1994-1998, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains application interface code for the decompression half
- * of the JPEG library. These are the "minimum" API routines that may be
- * needed in either the normal full-decompression case or the
- * transcoding-only case.
- *
- * Most of the routines intended to be called directly by an application
- * are in this file or in jdapistd.c. But also see jcomapi.c for routines
- * shared by compression and decompression, and jdtrans.c for the transcoding
- * case.
- */
-
-#define JPEG_INTERNALS
-#include "jinclude.h"
-#include "jpeglib.h"
-
-
-/*
- * Initialization of a JPEG decompression object.
- * The error manager must already be set up (in case memory manager fails).
- */
-
-GLOBAL(void)
-jpeg_CreateDecompress (j_decompress_ptr cinfo, int version, size_t structsize)
-{
- int i;
-
- /* Guard against version mismatches between library and caller. */
- cinfo->mem = NULL; /* so jpeg_destroy knows mem mgr not called */
- if (version != JPEG_LIB_VERSION)
- ERREXIT2(cinfo, JERR_BAD_LIB_VERSION, JPEG_LIB_VERSION, version);
- if (structsize != SIZEOF(struct jpeg_decompress_struct))
- ERREXIT2(cinfo, JERR_BAD_STRUCT_SIZE,
- (int) SIZEOF(struct jpeg_decompress_struct), (int) structsize);
-
- /* For debugging purposes, we zero the whole master structure.
- * But the application has already set the err pointer, and may have set
- * client_data, so we have to save and restore those fields.
- * Note: if application hasn't set client_data, tools like Purify may
- * complain here.
- */
- {
- struct jpeg_error_mgr * err = cinfo->err;
- void * client_data = cinfo->client_data; /* ignore Purify complaint here */
- MEMZERO(cinfo, SIZEOF(struct jpeg_decompress_struct));
- cinfo->err = err;
- cinfo->client_data = client_data;
- }
- cinfo->is_decompressor = TRUE;
-
- /* Initialize a memory manager instance for this object */
- jinit_memory_mgr((j_common_ptr) cinfo);
-
- /* Zero out pointers to permanent structures. */
- cinfo->progress = NULL;
- cinfo->src = NULL;
-
- for (i = 0; i < NUM_QUANT_TBLS; i++)
- cinfo->quant_tbl_ptrs[i] = NULL;
-
- for (i = 0; i < NUM_HUFF_TBLS; i++) {
- cinfo->dc_huff_tbl_ptrs[i] = NULL;
- cinfo->ac_huff_tbl_ptrs[i] = NULL;
- }
-
- /* Initialize marker processor so application can override methods
- * for COM, APPn markers before calling jpeg_read_header.
- */
- cinfo->marker_list = NULL;
- jinit_marker_reader(cinfo);
-
- /* And initialize the overall input controller. */
- jinit_input_controller(cinfo);
-
- /* OK, I'm ready */
- cinfo->global_state = DSTATE_START;
-}
-
-
-/*
- * Destruction of a JPEG decompression object
- */
-
-GLOBAL(void)
-jpeg_destroy_decompress (j_decompress_ptr cinfo)
-{
- jpeg_destroy((j_common_ptr) cinfo); /* use common routine */
-}
-
-
-/*
- * Abort processing of a JPEG decompression operation,
- * but don't destroy the object itself.
- */
-
-GLOBAL(void)
-jpeg_abort_decompress (j_decompress_ptr cinfo)
-{
- jpeg_abort((j_common_ptr) cinfo); /* use common routine */
-}
-
-
-/*
- * Set default decompression parameters.
- */
-
-LOCAL(void)
-default_decompress_parms (j_decompress_ptr cinfo)
-{
- /* Guess the input colorspace, and set output colorspace accordingly. */
- /* (Wish JPEG committee had provided a real way to specify this...) */
- /* Note application may override our guesses. */
- switch (cinfo->num_components) {
- case 1:
- cinfo->jpeg_color_space = JCS_GRAYSCALE;
- cinfo->out_color_space = JCS_GRAYSCALE;
- break;
-
- case 3:
- if (cinfo->saw_JFIF_marker) {
- cinfo->jpeg_color_space = JCS_YCbCr; /* JFIF implies YCbCr */
- } else if (cinfo->saw_Adobe_marker) {
- switch (cinfo->Adobe_transform) {
- case 0:
- cinfo->jpeg_color_space = JCS_RGB;
- break;
- case 1:
- cinfo->jpeg_color_space = JCS_YCbCr;
- break;
- default:
- WARNMS1(cinfo, JWRN_ADOBE_XFORM, cinfo->Adobe_transform);
- cinfo->jpeg_color_space = JCS_YCbCr; /* assume it's YCbCr */
- break;
- }
- } else {
- /* Saw no special markers, try to guess from the component IDs */
- int cid0 = cinfo->comp_info[0].component_id;
- int cid1 = cinfo->comp_info[1].component_id;
- int cid2 = cinfo->comp_info[2].component_id;
-
- if (cid0 == 1 && cid1 == 2 && cid2 == 3)
- cinfo->jpeg_color_space = JCS_YCbCr; /* assume JFIF w/out marker */
- else if (cid0 == 82 && cid1 == 71 && cid2 == 66)
- cinfo->jpeg_color_space = JCS_RGB; /* ASCII 'R', 'G', 'B' */
- else {
- TRACEMS3(cinfo, 1, JTRC_UNKNOWN_IDS, cid0, cid1, cid2);
- cinfo->jpeg_color_space = JCS_YCbCr; /* assume it's YCbCr */
- }
- }
- /* Always guess RGB is proper output colorspace. */
- cinfo->out_color_space = JCS_RGB;
- break;
-
- case 4:
- if (cinfo->saw_Adobe_marker) {
- switch (cinfo->Adobe_transform) {
- case 0:
- cinfo->jpeg_color_space = JCS_CMYK;
- break;
- case 2:
- cinfo->jpeg_color_space = JCS_YCCK;
- break;
- default:
- WARNMS1(cinfo, JWRN_ADOBE_XFORM, cinfo->Adobe_transform);
- cinfo->jpeg_color_space = JCS_YCCK; /* assume it's YCCK */
- break;
- }
- } else {
- /* No special markers, assume straight CMYK. */
- cinfo->jpeg_color_space = JCS_CMYK;
- }
- cinfo->out_color_space = JCS_CMYK;
- break;
-
- default:
- cinfo->jpeg_color_space = JCS_UNKNOWN;
- cinfo->out_color_space = JCS_UNKNOWN;
- break;
- }
-
- /* Set defaults for other decompression parameters. */
- cinfo->scale_num = 1; /* 1:1 scaling */
- cinfo->scale_denom = 1;
- cinfo->output_gamma = 1.0;
- cinfo->buffered_image = FALSE;
- cinfo->raw_data_out = FALSE;
- cinfo->dct_method = JDCT_DEFAULT;
- cinfo->do_fancy_upsampling = TRUE;
- cinfo->do_block_smoothing = TRUE;
- cinfo->quantize_colors = FALSE;
- /* We set these in case application only sets quantize_colors. */
- cinfo->dither_mode = JDITHER_FS;
-#ifdef QUANT_2PASS_SUPPORTED
- cinfo->two_pass_quantize = TRUE;
-#else
- cinfo->two_pass_quantize = FALSE;
-#endif
- cinfo->desired_number_of_colors = 256;
- cinfo->colormap = NULL;
- /* Initialize for no mode change in buffered-image mode. */
- cinfo->enable_1pass_quant = FALSE;
- cinfo->enable_external_quant = FALSE;
- cinfo->enable_2pass_quant = FALSE;
-}
-
-
-/*
- * Decompression startup: read start of JPEG datastream to see what's there.
- * Need only initialize JPEG object and supply a data source before calling.
- *
- * This routine will read as far as the first SOS marker (ie, actual start of
- * compressed data), and will save all tables and parameters in the JPEG
- * object. It will also initialize the decompression parameters to default
- * values, and finally return JPEG_HEADER_OK. On return, the application may
- * adjust the decompression parameters and then call jpeg_start_decompress.
- * (Or, if the application only wanted to determine the image parameters,
- * the data need not be decompressed. In that case, call jpeg_abort or
- * jpeg_destroy to release any temporary space.)
- * If an abbreviated (tables only) datastream is presented, the routine will
- * return JPEG_HEADER_TABLES_ONLY upon reaching EOI. The application may then
- * re-use the JPEG object to read the abbreviated image datastream(s).
- * It is unnecessary (but OK) to call jpeg_abort in this case.
- * The JPEG_SUSPENDED return code only occurs if the data source module
- * requests suspension of the decompressor. In this case the application
- * should load more source data and then re-call jpeg_read_header to resume
- * processing.
- * If a non-suspending data source is used and require_image is TRUE, then the
- * return code need not be inspected since only JPEG_HEADER_OK is possible.
- *
- * This routine is now just a front end to jpeg_consume_input, with some
- * extra error checking.
- */
-
-GLOBAL(int)
-jpeg_read_header (j_decompress_ptr cinfo, boolean require_image)
-{
- int retcode;
-
- if (cinfo->global_state != DSTATE_START &&
- cinfo->global_state != DSTATE_INHEADER)
- ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
-
- retcode = jpeg_consume_input(cinfo);
-
- switch (retcode) {
- case JPEG_REACHED_SOS:
- retcode = JPEG_HEADER_OK;
- break;
- case JPEG_REACHED_EOI:
- if (require_image) /* Complain if application wanted an image */
- ERREXIT(cinfo, JERR_NO_IMAGE);
- /* Reset to start state; it would be safer to require the application to
- * call jpeg_abort, but we can't change it now for compatibility reasons.
- * A side effect is to free any temporary memory (there shouldn't be any).
- */
- jpeg_abort((j_common_ptr) cinfo); /* sets state = DSTATE_START */
- retcode = JPEG_HEADER_TABLES_ONLY;
- break;
- case JPEG_SUSPENDED:
- /* no work */
- break;
- }
-
- return retcode;
-}
-
-
-/*
- * Consume data in advance of what the decompressor requires.
- * This can be called at any time once the decompressor object has
- * been created and a data source has been set up.
- *
- * This routine is essentially a state machine that handles a couple
- * of critical state-transition actions, namely initial setup and
- * transition from header scanning to ready-for-start_decompress.
- * All the actual input is done via the input controller's consume_input
- * method.
- */
-
-GLOBAL(int)
-jpeg_consume_input (j_decompress_ptr cinfo)
-{
- int retcode = JPEG_SUSPENDED;
-
- /* NB: every possible DSTATE value should be listed in this switch */
- switch (cinfo->global_state) {
- case DSTATE_START:
- /* Start-of-datastream actions: reset appropriate modules */
- (*cinfo->inputctl->reset_input_controller) (cinfo);
- /* Initialize application's data source module */
- (*cinfo->src->init_source) (cinfo);
- cinfo->global_state = DSTATE_INHEADER;
- /*FALLTHROUGH*/
- case DSTATE_INHEADER:
- retcode = (*cinfo->inputctl->consume_input) (cinfo);
- if (retcode == JPEG_REACHED_SOS) { /* Found SOS, prepare to decompress */
- /* Set up default parameters based on header data */
- default_decompress_parms(cinfo);
- /* Set global state: ready for start_decompress */
- cinfo->global_state = DSTATE_READY;
- }
- break;
- case DSTATE_READY:
- /* Can't advance past first SOS until start_decompress is called */
- retcode = JPEG_REACHED_SOS;
- break;
- case DSTATE_PRELOAD:
- case DSTATE_PRESCAN:
- case DSTATE_SCANNING:
- case DSTATE_RAW_OK:
- case DSTATE_BUFIMAGE:
- case DSTATE_BUFPOST:
- case DSTATE_STOPPING:
- retcode = (*cinfo->inputctl->consume_input) (cinfo);
- break;
- default:
- ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
- }
- return retcode;
-}
-
-
-/*
- * Have we finished reading the input file?
- */
-
-GLOBAL(boolean)
-jpeg_input_complete (j_decompress_ptr cinfo)
-{
- /* Check for valid jpeg object */
- if (cinfo->global_state < DSTATE_START ||
- cinfo->global_state > DSTATE_STOPPING)
- ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
- return cinfo->inputctl->eoi_reached;
-}
-
-
-/*
- * Is there more than one scan?
- */
-
-GLOBAL(boolean)
-jpeg_has_multiple_scans (j_decompress_ptr cinfo)
-{
- /* Only valid after jpeg_read_header completes */
- if (cinfo->global_state < DSTATE_READY ||
- cinfo->global_state > DSTATE_STOPPING)
- ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
- return cinfo->inputctl->has_multiple_scans;
-}
-
-
-/*
- * Finish JPEG decompression.
- *
- * This will normally just verify the file trailer and release temp storage.
- *
- * Returns FALSE if suspended. The return value need be inspected only if
- * a suspending data source is used.
- */
-
-GLOBAL(boolean)
-jpeg_finish_decompress (j_decompress_ptr cinfo)
-{
- if ((cinfo->global_state == DSTATE_SCANNING ||
- cinfo->global_state == DSTATE_RAW_OK) && ! cinfo->buffered_image) {
- /* Terminate final pass of non-buffered mode */
- if (cinfo->output_scanline < cinfo->output_height)
- ERREXIT(cinfo, JERR_TOO_LITTLE_DATA);
- (*cinfo->master->finish_output_pass) (cinfo);
- cinfo->global_state = DSTATE_STOPPING;
- } else if (cinfo->global_state == DSTATE_BUFIMAGE) {
- /* Finishing after a buffered-image operation */
- cinfo->global_state = DSTATE_STOPPING;
- } else if (cinfo->global_state != DSTATE_STOPPING) {
- /* STOPPING = repeat call after a suspension, anything else is error */
- ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
- }
- /* Read until EOI */
- while (! cinfo->inputctl->eoi_reached) {
- if ((*cinfo->inputctl->consume_input) (cinfo) == JPEG_SUSPENDED)
- return FALSE; /* Suspend, come back later */
- }
- /* Do final cleanup */
- (*cinfo->src->term_source) (cinfo);
- /* We can use jpeg_abort to release memory and reset global_state */
- jpeg_abort((j_common_ptr) cinfo);
- return TRUE;
-}
-
-#endif //_FX_JPEG_TURBO_
+#if !defined(_FX_JPEG_TURBO_)
+/*
+ * jdapimin.c
+ *
+ * Copyright (C) 1994-1998, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains application interface code for the decompression half
+ * of the JPEG library. These are the "minimum" API routines that may be
+ * needed in either the normal full-decompression case or the
+ * transcoding-only case.
+ *
+ * Most of the routines intended to be called directly by an application
+ * are in this file or in jdapistd.c. But also see jcomapi.c for routines
+ * shared by compression and decompression, and jdtrans.c for the transcoding
+ * case.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+
+
+/*
+ * Initialization of a JPEG decompression object.
+ * The error manager must already be set up (in case memory manager fails).
+ */
+
+GLOBAL(void)
+jpeg_CreateDecompress (j_decompress_ptr cinfo, int version, size_t structsize)
+{
+ int i;
+
+ /* Guard against version mismatches between library and caller. */
+ cinfo->mem = NULL; /* so jpeg_destroy knows mem mgr not called */
+ if (version != JPEG_LIB_VERSION)
+ ERREXIT2(cinfo, JERR_BAD_LIB_VERSION, JPEG_LIB_VERSION, version);
+ if (structsize != SIZEOF(struct jpeg_decompress_struct))
+ ERREXIT2(cinfo, JERR_BAD_STRUCT_SIZE,
+ (int) SIZEOF(struct jpeg_decompress_struct), (int) structsize);
+
+ /* For debugging purposes, we zero the whole master structure.
+ * But the application has already set the err pointer, and may have set
+ * client_data, so we have to save and restore those fields.
+ * Note: if application hasn't set client_data, tools like Purify may
+ * complain here.
+ */
+ {
+ struct jpeg_error_mgr * err = cinfo->err;
+ void * client_data = cinfo->client_data; /* ignore Purify complaint here */
+ MEMZERO(cinfo, SIZEOF(struct jpeg_decompress_struct));
+ cinfo->err = err;
+ cinfo->client_data = client_data;
+ }
+ cinfo->is_decompressor = TRUE;
+
+ /* Initialize a memory manager instance for this object */
+ jinit_memory_mgr((j_common_ptr) cinfo);
+
+ /* Zero out pointers to permanent structures. */
+ cinfo->progress = NULL;
+ cinfo->src = NULL;
+
+ for (i = 0; i < NUM_QUANT_TBLS; i++)
+ cinfo->quant_tbl_ptrs[i] = NULL;
+
+ for (i = 0; i < NUM_HUFF_TBLS; i++) {
+ cinfo->dc_huff_tbl_ptrs[i] = NULL;
+ cinfo->ac_huff_tbl_ptrs[i] = NULL;
+ }
+
+ /* Initialize marker processor so application can override methods
+ * for COM, APPn markers before calling jpeg_read_header.
+ */
+ cinfo->marker_list = NULL;
+ jinit_marker_reader(cinfo);
+
+ /* And initialize the overall input controller. */
+ jinit_input_controller(cinfo);
+
+ /* OK, I'm ready */
+ cinfo->global_state = DSTATE_START;
+}
+
+
+/*
+ * Destruction of a JPEG decompression object
+ */
+
+GLOBAL(void)
+jpeg_destroy_decompress (j_decompress_ptr cinfo)
+{
+ jpeg_destroy((j_common_ptr) cinfo); /* use common routine */
+}
+
+
+/*
+ * Abort processing of a JPEG decompression operation,
+ * but don't destroy the object itself.
+ */
+
+GLOBAL(void)
+jpeg_abort_decompress (j_decompress_ptr cinfo)
+{
+ jpeg_abort((j_common_ptr) cinfo); /* use common routine */
+}
+
+
+/*
+ * Set default decompression parameters.
+ */
+
+LOCAL(void)
+default_decompress_parms (j_decompress_ptr cinfo)
+{
+ /* Guess the input colorspace, and set output colorspace accordingly. */
+ /* (Wish JPEG committee had provided a real way to specify this...) */
+ /* Note application may override our guesses. */
+ switch (cinfo->num_components) {
+ case 1:
+ cinfo->jpeg_color_space = JCS_GRAYSCALE;
+ cinfo->out_color_space = JCS_GRAYSCALE;
+ break;
+
+ case 3:
+ if (cinfo->saw_JFIF_marker) {
+ cinfo->jpeg_color_space = JCS_YCbCr; /* JFIF implies YCbCr */
+ } else if (cinfo->saw_Adobe_marker) {
+ switch (cinfo->Adobe_transform) {
+ case 0:
+ cinfo->jpeg_color_space = JCS_RGB;
+ break;
+ case 1:
+ cinfo->jpeg_color_space = JCS_YCbCr;
+ break;
+ default:
+ WARNMS1(cinfo, JWRN_ADOBE_XFORM, cinfo->Adobe_transform);
+ cinfo->jpeg_color_space = JCS_YCbCr; /* assume it's YCbCr */
+ break;
+ }
+ } else {
+ /* Saw no special markers, try to guess from the component IDs */
+ int cid0 = cinfo->comp_info[0].component_id;
+ int cid1 = cinfo->comp_info[1].component_id;
+ int cid2 = cinfo->comp_info[2].component_id;
+
+ if (cid0 == 1 && cid1 == 2 && cid2 == 3)
+ cinfo->jpeg_color_space = JCS_YCbCr; /* assume JFIF w/out marker */
+ else if (cid0 == 82 && cid1 == 71 && cid2 == 66)
+ cinfo->jpeg_color_space = JCS_RGB; /* ASCII 'R', 'G', 'B' */
+ else {
+ TRACEMS3(cinfo, 1, JTRC_UNKNOWN_IDS, cid0, cid1, cid2);
+ cinfo->jpeg_color_space = JCS_YCbCr; /* assume it's YCbCr */
+ }
+ }
+ /* Always guess RGB is proper output colorspace. */
+ cinfo->out_color_space = JCS_RGB;
+ break;
+
+ case 4:
+ if (cinfo->saw_Adobe_marker) {
+ switch (cinfo->Adobe_transform) {
+ case 0:
+ cinfo->jpeg_color_space = JCS_CMYK;
+ break;
+ case 2:
+ cinfo->jpeg_color_space = JCS_YCCK;
+ break;
+ default:
+ WARNMS1(cinfo, JWRN_ADOBE_XFORM, cinfo->Adobe_transform);
+ cinfo->jpeg_color_space = JCS_YCCK; /* assume it's YCCK */
+ break;
+ }
+ } else {
+ /* No special markers, assume straight CMYK. */
+ cinfo->jpeg_color_space = JCS_CMYK;
+ }
+ cinfo->out_color_space = JCS_CMYK;
+ break;
+
+ default:
+ cinfo->jpeg_color_space = JCS_UNKNOWN;
+ cinfo->out_color_space = JCS_UNKNOWN;
+ break;
+ }
+
+ /* Set defaults for other decompression parameters. */
+ cinfo->scale_num = 1; /* 1:1 scaling */
+ cinfo->scale_denom = 1;
+ cinfo->output_gamma = 1.0;
+ cinfo->buffered_image = FALSE;
+ cinfo->raw_data_out = FALSE;
+ cinfo->dct_method = JDCT_DEFAULT;
+ cinfo->do_fancy_upsampling = TRUE;
+ cinfo->do_block_smoothing = TRUE;
+ cinfo->quantize_colors = FALSE;
+ /* We set these in case application only sets quantize_colors. */
+ cinfo->dither_mode = JDITHER_FS;
+#ifdef QUANT_2PASS_SUPPORTED
+ cinfo->two_pass_quantize = TRUE;
+#else
+ cinfo->two_pass_quantize = FALSE;
+#endif
+ cinfo->desired_number_of_colors = 256;
+ cinfo->colormap = NULL;
+ /* Initialize for no mode change in buffered-image mode. */
+ cinfo->enable_1pass_quant = FALSE;
+ cinfo->enable_external_quant = FALSE;
+ cinfo->enable_2pass_quant = FALSE;
+}
+
+
+/*
+ * Decompression startup: read start of JPEG datastream to see what's there.
+ * Need only initialize JPEG object and supply a data source before calling.
+ *
+ * This routine will read as far as the first SOS marker (ie, actual start of
+ * compressed data), and will save all tables and parameters in the JPEG
+ * object. It will also initialize the decompression parameters to default
+ * values, and finally return JPEG_HEADER_OK. On return, the application may
+ * adjust the decompression parameters and then call jpeg_start_decompress.
+ * (Or, if the application only wanted to determine the image parameters,
+ * the data need not be decompressed. In that case, call jpeg_abort or
+ * jpeg_destroy to release any temporary space.)
+ * If an abbreviated (tables only) datastream is presented, the routine will
+ * return JPEG_HEADER_TABLES_ONLY upon reaching EOI. The application may then
+ * re-use the JPEG object to read the abbreviated image datastream(s).
+ * It is unnecessary (but OK) to call jpeg_abort in this case.
+ * The JPEG_SUSPENDED return code only occurs if the data source module
+ * requests suspension of the decompressor. In this case the application
+ * should load more source data and then re-call jpeg_read_header to resume
+ * processing.
+ * If a non-suspending data source is used and require_image is TRUE, then the
+ * return code need not be inspected since only JPEG_HEADER_OK is possible.
+ *
+ * This routine is now just a front end to jpeg_consume_input, with some
+ * extra error checking.
+ */
+
+GLOBAL(int)
+jpeg_read_header (j_decompress_ptr cinfo, boolean require_image)
+{
+ int retcode;
+
+ if (cinfo->global_state != DSTATE_START &&
+ cinfo->global_state != DSTATE_INHEADER)
+ ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
+
+ retcode = jpeg_consume_input(cinfo);
+
+ switch (retcode) {
+ case JPEG_REACHED_SOS:
+ retcode = JPEG_HEADER_OK;
+ break;
+ case JPEG_REACHED_EOI:
+ if (require_image) /* Complain if application wanted an image */
+ ERREXIT(cinfo, JERR_NO_IMAGE);
+ /* Reset to start state; it would be safer to require the application to
+ * call jpeg_abort, but we can't change it now for compatibility reasons.
+ * A side effect is to free any temporary memory (there shouldn't be any).
+ */
+ jpeg_abort((j_common_ptr) cinfo); /* sets state = DSTATE_START */
+ retcode = JPEG_HEADER_TABLES_ONLY;
+ break;
+ case JPEG_SUSPENDED:
+ /* no work */
+ break;
+ }
+
+ return retcode;
+}
+
+
+/*
+ * Consume data in advance of what the decompressor requires.
+ * This can be called at any time once the decompressor object has
+ * been created and a data source has been set up.
+ *
+ * This routine is essentially a state machine that handles a couple
+ * of critical state-transition actions, namely initial setup and
+ * transition from header scanning to ready-for-start_decompress.
+ * All the actual input is done via the input controller's consume_input
+ * method.
+ */
+
+GLOBAL(int)
+jpeg_consume_input (j_decompress_ptr cinfo)
+{
+ int retcode = JPEG_SUSPENDED;
+
+ /* NB: every possible DSTATE value should be listed in this switch */
+ switch (cinfo->global_state) {
+ case DSTATE_START:
+ /* Start-of-datastream actions: reset appropriate modules */
+ (*cinfo->inputctl->reset_input_controller) (cinfo);
+ /* Initialize application's data source module */
+ (*cinfo->src->init_source) (cinfo);
+ cinfo->global_state = DSTATE_INHEADER;
+ /*FALLTHROUGH*/
+ case DSTATE_INHEADER:
+ retcode = (*cinfo->inputctl->consume_input) (cinfo);
+ if (retcode == JPEG_REACHED_SOS) { /* Found SOS, prepare to decompress */
+ /* Set up default parameters based on header data */
+ default_decompress_parms(cinfo);
+ /* Set global state: ready for start_decompress */
+ cinfo->global_state = DSTATE_READY;
+ }
+ break;
+ case DSTATE_READY:
+ /* Can't advance past first SOS until start_decompress is called */
+ retcode = JPEG_REACHED_SOS;
+ break;
+ case DSTATE_PRELOAD:
+ case DSTATE_PRESCAN:
+ case DSTATE_SCANNING:
+ case DSTATE_RAW_OK:
+ case DSTATE_BUFIMAGE:
+ case DSTATE_BUFPOST:
+ case DSTATE_STOPPING:
+ retcode = (*cinfo->inputctl->consume_input) (cinfo);
+ break;
+ default:
+ ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
+ }
+ return retcode;
+}
+
+
+/*
+ * Have we finished reading the input file?
+ */
+
+GLOBAL(boolean)
+jpeg_input_complete (j_decompress_ptr cinfo)
+{
+ /* Check for valid jpeg object */
+ if (cinfo->global_state < DSTATE_START ||
+ cinfo->global_state > DSTATE_STOPPING)
+ ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
+ return cinfo->inputctl->eoi_reached;
+}
+
+
+/*
+ * Is there more than one scan?
+ */
+
+GLOBAL(boolean)
+jpeg_has_multiple_scans (j_decompress_ptr cinfo)
+{
+ /* Only valid after jpeg_read_header completes */
+ if (cinfo->global_state < DSTATE_READY ||
+ cinfo->global_state > DSTATE_STOPPING)
+ ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
+ return cinfo->inputctl->has_multiple_scans;
+}
+
+
+/*
+ * Finish JPEG decompression.
+ *
+ * This will normally just verify the file trailer and release temp storage.
+ *
+ * Returns FALSE if suspended. The return value need be inspected only if
+ * a suspending data source is used.
+ */
+
+GLOBAL(boolean)
+jpeg_finish_decompress (j_decompress_ptr cinfo)
+{
+ if ((cinfo->global_state == DSTATE_SCANNING ||
+ cinfo->global_state == DSTATE_RAW_OK) && ! cinfo->buffered_image) {
+ /* Terminate final pass of non-buffered mode */
+ if (cinfo->output_scanline < cinfo->output_height)
+ ERREXIT(cinfo, JERR_TOO_LITTLE_DATA);
+ (*cinfo->master->finish_output_pass) (cinfo);
+ cinfo->global_state = DSTATE_STOPPING;
+ } else if (cinfo->global_state == DSTATE_BUFIMAGE) {
+ /* Finishing after a buffered-image operation */
+ cinfo->global_state = DSTATE_STOPPING;
+ } else if (cinfo->global_state != DSTATE_STOPPING) {
+ /* STOPPING = repeat call after a suspension, anything else is error */
+ ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
+ }
+ /* Read until EOI */
+ while (! cinfo->inputctl->eoi_reached) {
+ if ((*cinfo->inputctl->consume_input) (cinfo) == JPEG_SUSPENDED)
+ return FALSE; /* Suspend, come back later */
+ }
+ /* Do final cleanup */
+ (*cinfo->src->term_source) (cinfo);
+ /* We can use jpeg_abort to release memory and reset global_state */
+ jpeg_abort((j_common_ptr) cinfo);
+ return TRUE;
+}
+
+#endif //_FX_JPEG_TURBO_
diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jdapistd.c b/core/src/fxcodec/libjpeg/fpdfapi_jdapistd.c
index 8c969eb309..4c31f7640c 100644
--- a/core/src/fxcodec/libjpeg/fpdfapi_jdapistd.c
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jdapistd.c
@@ -1,279 +1,279 @@
-#if !defined(_FX_JPEG_TURBO_)
-/*
- * jdapistd.c
- *
- * Copyright (C) 1994-1996, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains application interface code for the decompression half
- * of the JPEG library. These are the "standard" API routines that are
- * used in the normal full-decompression case. They are not used by a
- * transcoding-only application. Note that if an application links in
- * jpeg_start_decompress, it will end up linking in the entire decompressor.
- * We thus must separate this file from jdapimin.c to avoid linking the
- * whole decompression library into a transcoder.
- */
-
-#define JPEG_INTERNALS
-#include "jinclude.h"
-#include "jpeglib.h"
-
-
-/* Forward declarations */
-LOCAL(boolean) output_pass_setup JPP((j_decompress_ptr cinfo));
-
-
-/*
- * Decompression initialization.
- * jpeg_read_header must be completed before calling this.
- *
- * If a multipass operating mode was selected, this will do all but the
- * last pass, and thus may take a great deal of time.
- *
- * Returns FALSE if suspended. The return value need be inspected only if
- * a suspending data source is used.
- */
-
-GLOBAL(boolean)
-jpeg_start_decompress (j_decompress_ptr cinfo)
-{
- if (cinfo->global_state == DSTATE_READY) {
- /* First call: initialize master control, select active modules */
- jinit_master_decompress(cinfo);
- if (cinfo->buffered_image) {
- /* No more work here; expecting jpeg_start_output next */
- cinfo->global_state = DSTATE_BUFIMAGE;
- return TRUE;
- }
- cinfo->global_state = DSTATE_PRELOAD;
- }
- if (cinfo->global_state == DSTATE_PRELOAD) {
- /* If file has multiple scans, absorb them all into the coef buffer */
- if (cinfo->inputctl->has_multiple_scans) {
-#ifdef D_MULTISCAN_FILES_SUPPORTED
- for (;;) {
- int retcode;
- /* Call progress monitor hook if present */
- if (cinfo->progress != NULL)
- (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);
- /* Absorb some more input */
- retcode = (*cinfo->inputctl->consume_input) (cinfo);
- if (retcode == JPEG_SUSPENDED)
- return FALSE;
- if (retcode == JPEG_REACHED_EOI)
- break;
- /* Advance progress counter if appropriate */
- if (cinfo->progress != NULL &&
- (retcode == JPEG_ROW_COMPLETED || retcode == JPEG_REACHED_SOS)) {
- if (++cinfo->progress->pass_counter >= cinfo->progress->pass_limit) {
- /* jdmaster underestimated number of scans; ratchet up one scan */
- cinfo->progress->pass_limit += (long) cinfo->total_iMCU_rows;
- }
- }
- }
-#else
- ERREXIT(cinfo, JERR_NOT_COMPILED);
-#endif /* D_MULTISCAN_FILES_SUPPORTED */
- }
- cinfo->output_scan_number = cinfo->input_scan_number;
- } else if (cinfo->global_state != DSTATE_PRESCAN)
- ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
- /* Perform any dummy output passes, and set up for the final pass */
- return output_pass_setup(cinfo);
-}
-
-
-/*
- * Set up for an output pass, and perform any dummy pass(es) needed.
- * Common subroutine for jpeg_start_decompress and jpeg_start_output.
- * Entry: global_state = DSTATE_PRESCAN only if previously suspended.
- * Exit: If done, returns TRUE and sets global_state for proper output mode.
- * If suspended, returns FALSE and sets global_state = DSTATE_PRESCAN.
- */
-
-LOCAL(boolean)
-output_pass_setup (j_decompress_ptr cinfo)
-{
- if (cinfo->global_state != DSTATE_PRESCAN) {
- /* First call: do pass setup */
- (*cinfo->master->prepare_for_output_pass) (cinfo);
- cinfo->output_scanline = 0;
- cinfo->global_state = DSTATE_PRESCAN;
- }
- /* Loop over any required dummy passes */
- while (cinfo->master->is_dummy_pass) {
-#ifdef QUANT_2PASS_SUPPORTED
- /* Crank through the dummy pass */
- while (cinfo->output_scanline < cinfo->output_height) {
- JDIMENSION last_scanline;
- /* Call progress monitor hook if present */
- if (cinfo->progress != NULL) {
- cinfo->progress->pass_counter = (long) cinfo->output_scanline;
- cinfo->progress->pass_limit = (long) cinfo->output_height;
- (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);
- }
- /* Process some data */
- last_scanline = cinfo->output_scanline;
- (*cinfo->main->process_data) (cinfo, (JSAMPARRAY) NULL,
- &cinfo->output_scanline, (JDIMENSION) 0);
- if (cinfo->output_scanline == last_scanline)
- return FALSE; /* No progress made, must suspend */
- }
- /* Finish up dummy pass, and set up for another one */
- (*cinfo->master->finish_output_pass) (cinfo);
- (*cinfo->master->prepare_for_output_pass) (cinfo);
- cinfo->output_scanline = 0;
-#else
- ERREXIT(cinfo, JERR_NOT_COMPILED);
-#endif /* QUANT_2PASS_SUPPORTED */
- }
- /* Ready for application to drive output pass through
- * jpeg_read_scanlines or jpeg_read_raw_data.
- */
- cinfo->global_state = cinfo->raw_data_out ? DSTATE_RAW_OK : DSTATE_SCANNING;
- return TRUE;
-}
-
-
-/*
- * Read some scanlines of data from the JPEG decompressor.
- *
- * The return value will be the number of lines actually read.
- * This may be less than the number requested in several cases,
- * including bottom of image, data source suspension, and operating
- * modes that emit multiple scanlines at a time.
- *
- * Note: we warn about excess calls to jpeg_read_scanlines() since
- * this likely signals an application programmer error. However,
- * an oversize buffer (max_lines > scanlines remaining) is not an error.
- */
-
-GLOBAL(JDIMENSION)
-jpeg_read_scanlines (j_decompress_ptr cinfo, JSAMPARRAY scanlines,
- JDIMENSION max_lines)
-{
- JDIMENSION row_ctr;
-
- if (cinfo->global_state != DSTATE_SCANNING)
- return 0; /* XYQ 2010-6-27: don't throw exception here */
-/* ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); */
- if (cinfo->output_scanline >= cinfo->output_height) {
- WARNMS(cinfo, JWRN_TOO_MUCH_DATA);
- return 0;
- }
-
- /* Call progress monitor hook if present */
- if (cinfo->progress != NULL) {
- cinfo->progress->pass_counter = (long) cinfo->output_scanline;
- cinfo->progress->pass_limit = (long) cinfo->output_height;
- (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);
- }
-
- /* Process some data */
- row_ctr = 0;
- (*cinfo->main->process_data) (cinfo, scanlines, &row_ctr, max_lines);
- cinfo->output_scanline += row_ctr;
- return row_ctr;
-}
-
-
-/*
- * Alternate entry point to read raw data.
- * Processes exactly one iMCU row per call, unless suspended.
- */
-
-GLOBAL(JDIMENSION)
-jpeg_read_raw_data (j_decompress_ptr cinfo, JSAMPIMAGE data,
- JDIMENSION max_lines)
-{
- JDIMENSION lines_per_iMCU_row;
-
- if (cinfo->global_state != DSTATE_RAW_OK)
- ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
- if (cinfo->output_scanline >= cinfo->output_height) {
- WARNMS(cinfo, JWRN_TOO_MUCH_DATA);
- return 0;
- }
-
- /* Call progress monitor hook if present */
- if (cinfo->progress != NULL) {
- cinfo->progress->pass_counter = (long) cinfo->output_scanline;
- cinfo->progress->pass_limit = (long) cinfo->output_height;
- (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);
- }
-
- /* Verify that at least one iMCU row can be returned. */
- lines_per_iMCU_row = cinfo->max_v_samp_factor * cinfo->min_DCT_scaled_size;
- if (max_lines < lines_per_iMCU_row)
- ERREXIT(cinfo, JERR_BUFFER_SIZE);
-
- /* Decompress directly into user's buffer. */
- if (! (*cinfo->coef->decompress_data) (cinfo, data))
- return 0; /* suspension forced, can do nothing more */
-
- /* OK, we processed one iMCU row. */
- cinfo->output_scanline += lines_per_iMCU_row;
- return lines_per_iMCU_row;
-}
-
-
-/* Additional entry points for buffered-image mode. */
-
-#ifdef D_MULTISCAN_FILES_SUPPORTED
-
-/*
- * Initialize for an output pass in buffered-image mode.
- */
-
-GLOBAL(boolean)
-jpeg_start_output (j_decompress_ptr cinfo, int scan_number)
-{
- if (cinfo->global_state != DSTATE_BUFIMAGE &&
- cinfo->global_state != DSTATE_PRESCAN)
- ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
- /* Limit scan number to valid range */
- if (scan_number <= 0)
- scan_number = 1;
- if (cinfo->inputctl->eoi_reached &&
- scan_number > cinfo->input_scan_number)
- scan_number = cinfo->input_scan_number;
- cinfo->output_scan_number = scan_number;
- /* Perform any dummy output passes, and set up for the real pass */
- return output_pass_setup(cinfo);
-}
-
-
-/*
- * Finish up after an output pass in buffered-image mode.
- *
- * Returns FALSE if suspended. The return value need be inspected only if
- * a suspending data source is used.
- */
-
-GLOBAL(boolean)
-jpeg_finish_output (j_decompress_ptr cinfo)
-{
- if ((cinfo->global_state == DSTATE_SCANNING ||
- cinfo->global_state == DSTATE_RAW_OK) && cinfo->buffered_image) {
- /* Terminate this pass. */
- /* We do not require the whole pass to have been completed. */
- (*cinfo->master->finish_output_pass) (cinfo);
- cinfo->global_state = DSTATE_BUFPOST;
- } else if (cinfo->global_state != DSTATE_BUFPOST) {
- /* BUFPOST = repeat call after a suspension, anything else is error */
- ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
- }
- /* Read markers looking for SOS or EOI */
- while (cinfo->input_scan_number <= cinfo->output_scan_number &&
- ! cinfo->inputctl->eoi_reached) {
- if ((*cinfo->inputctl->consume_input) (cinfo) == JPEG_SUSPENDED)
- return FALSE; /* Suspend, come back later */
- }
- cinfo->global_state = DSTATE_BUFIMAGE;
- return TRUE;
-}
-
-#endif /* D_MULTISCAN_FILES_SUPPORTED */
-
-#endif //_FX_JPEG_TURBO_
+#if !defined(_FX_JPEG_TURBO_)
+/*
+ * jdapistd.c
+ *
+ * Copyright (C) 1994-1996, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains application interface code for the decompression half
+ * of the JPEG library. These are the "standard" API routines that are
+ * used in the normal full-decompression case. They are not used by a
+ * transcoding-only application. Note that if an application links in
+ * jpeg_start_decompress, it will end up linking in the entire decompressor.
+ * We thus must separate this file from jdapimin.c to avoid linking the
+ * whole decompression library into a transcoder.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+
+
+/* Forward declarations */
+LOCAL(boolean) output_pass_setup JPP((j_decompress_ptr cinfo));
+
+
+/*
+ * Decompression initialization.
+ * jpeg_read_header must be completed before calling this.
+ *
+ * If a multipass operating mode was selected, this will do all but the
+ * last pass, and thus may take a great deal of time.
+ *
+ * Returns FALSE if suspended. The return value need be inspected only if
+ * a suspending data source is used.
+ */
+
+GLOBAL(boolean)
+jpeg_start_decompress (j_decompress_ptr cinfo)
+{
+ if (cinfo->global_state == DSTATE_READY) {
+ /* First call: initialize master control, select active modules */
+ jinit_master_decompress(cinfo);
+ if (cinfo->buffered_image) {
+ /* No more work here; expecting jpeg_start_output next */
+ cinfo->global_state = DSTATE_BUFIMAGE;
+ return TRUE;
+ }
+ cinfo->global_state = DSTATE_PRELOAD;
+ }
+ if (cinfo->global_state == DSTATE_PRELOAD) {
+ /* If file has multiple scans, absorb them all into the coef buffer */
+ if (cinfo->inputctl->has_multiple_scans) {
+#ifdef D_MULTISCAN_FILES_SUPPORTED
+ for (;;) {
+ int retcode;
+ /* Call progress monitor hook if present */
+ if (cinfo->progress != NULL)
+ (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);
+ /* Absorb some more input */
+ retcode = (*cinfo->inputctl->consume_input) (cinfo);
+ if (retcode == JPEG_SUSPENDED)
+ return FALSE;
+ if (retcode == JPEG_REACHED_EOI)
+ break;
+ /* Advance progress counter if appropriate */
+ if (cinfo->progress != NULL &&
+ (retcode == JPEG_ROW_COMPLETED || retcode == JPEG_REACHED_SOS)) {
+ if (++cinfo->progress->pass_counter >= cinfo->progress->pass_limit) {
+ /* jdmaster underestimated number of scans; ratchet up one scan */
+ cinfo->progress->pass_limit += (long) cinfo->total_iMCU_rows;
+ }
+ }
+ }
+#else
+ ERREXIT(cinfo, JERR_NOT_COMPILED);
+#endif /* D_MULTISCAN_FILES_SUPPORTED */
+ }
+ cinfo->output_scan_number = cinfo->input_scan_number;
+ } else if (cinfo->global_state != DSTATE_PRESCAN)
+ ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
+ /* Perform any dummy output passes, and set up for the final pass */
+ return output_pass_setup(cinfo);
+}
+
+
+/*
+ * Set up for an output pass, and perform any dummy pass(es) needed.
+ * Common subroutine for jpeg_start_decompress and jpeg_start_output.
+ * Entry: global_state = DSTATE_PRESCAN only if previously suspended.
+ * Exit: If done, returns TRUE and sets global_state for proper output mode.
+ * If suspended, returns FALSE and sets global_state = DSTATE_PRESCAN.
+ */
+
+LOCAL(boolean)
+output_pass_setup (j_decompress_ptr cinfo)
+{
+ if (cinfo->global_state != DSTATE_PRESCAN) {
+ /* First call: do pass setup */
+ (*cinfo->master->prepare_for_output_pass) (cinfo);
+ cinfo->output_scanline = 0;
+ cinfo->global_state = DSTATE_PRESCAN;
+ }
+ /* Loop over any required dummy passes */
+ while (cinfo->master->is_dummy_pass) {
+#ifdef QUANT_2PASS_SUPPORTED
+ /* Crank through the dummy pass */
+ while (cinfo->output_scanline < cinfo->output_height) {
+ JDIMENSION last_scanline;
+ /* Call progress monitor hook if present */
+ if (cinfo->progress != NULL) {
+ cinfo->progress->pass_counter = (long) cinfo->output_scanline;
+ cinfo->progress->pass_limit = (long) cinfo->output_height;
+ (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);
+ }
+ /* Process some data */
+ last_scanline = cinfo->output_scanline;
+ (*cinfo->main->process_data) (cinfo, (JSAMPARRAY) NULL,
+ &cinfo->output_scanline, (JDIMENSION) 0);
+ if (cinfo->output_scanline == last_scanline)
+ return FALSE; /* No progress made, must suspend */
+ }
+ /* Finish up dummy pass, and set up for another one */
+ (*cinfo->master->finish_output_pass) (cinfo);
+ (*cinfo->master->prepare_for_output_pass) (cinfo);
+ cinfo->output_scanline = 0;
+#else
+ ERREXIT(cinfo, JERR_NOT_COMPILED);
+#endif /* QUANT_2PASS_SUPPORTED */
+ }
+ /* Ready for application to drive output pass through
+ * jpeg_read_scanlines or jpeg_read_raw_data.
+ */
+ cinfo->global_state = cinfo->raw_data_out ? DSTATE_RAW_OK : DSTATE_SCANNING;
+ return TRUE;
+}
+
+
+/*
+ * Read some scanlines of data from the JPEG decompressor.
+ *
+ * The return value will be the number of lines actually read.
+ * This may be less than the number requested in several cases,
+ * including bottom of image, data source suspension, and operating
+ * modes that emit multiple scanlines at a time.
+ *
+ * Note: we warn about excess calls to jpeg_read_scanlines() since
+ * this likely signals an application programmer error. However,
+ * an oversize buffer (max_lines > scanlines remaining) is not an error.
+ */
+
+GLOBAL(JDIMENSION)
+jpeg_read_scanlines (j_decompress_ptr cinfo, JSAMPARRAY scanlines,
+ JDIMENSION max_lines)
+{
+ JDIMENSION row_ctr;
+
+ if (cinfo->global_state != DSTATE_SCANNING)
+ return 0; /* XYQ 2010-6-27: don't throw exception here */
+/* ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); */
+ if (cinfo->output_scanline >= cinfo->output_height) {
+ WARNMS(cinfo, JWRN_TOO_MUCH_DATA);
+ return 0;
+ }
+
+ /* Call progress monitor hook if present */
+ if (cinfo->progress != NULL) {
+ cinfo->progress->pass_counter = (long) cinfo->output_scanline;
+ cinfo->progress->pass_limit = (long) cinfo->output_height;
+ (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);
+ }
+
+ /* Process some data */
+ row_ctr = 0;
+ (*cinfo->main->process_data) (cinfo, scanlines, &row_ctr, max_lines);
+ cinfo->output_scanline += row_ctr;
+ return row_ctr;
+}
+
+
+/*
+ * Alternate entry point to read raw data.
+ * Processes exactly one iMCU row per call, unless suspended.
+ */
+
+GLOBAL(JDIMENSION)
+jpeg_read_raw_data (j_decompress_ptr cinfo, JSAMPIMAGE data,
+ JDIMENSION max_lines)
+{
+ JDIMENSION lines_per_iMCU_row;
+
+ if (cinfo->global_state != DSTATE_RAW_OK)
+ ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
+ if (cinfo->output_scanline >= cinfo->output_height) {
+ WARNMS(cinfo, JWRN_TOO_MUCH_DATA);
+ return 0;
+ }
+
+ /* Call progress monitor hook if present */
+ if (cinfo->progress != NULL) {
+ cinfo->progress->pass_counter = (long) cinfo->output_scanline;
+ cinfo->progress->pass_limit = (long) cinfo->output_height;
+ (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);
+ }
+
+ /* Verify that at least one iMCU row can be returned. */
+ lines_per_iMCU_row = cinfo->max_v_samp_factor * cinfo->min_DCT_scaled_size;
+ if (max_lines < lines_per_iMCU_row)
+ ERREXIT(cinfo, JERR_BUFFER_SIZE);
+
+ /* Decompress directly into user's buffer. */
+ if (! (*cinfo->coef->decompress_data) (cinfo, data))
+ return 0; /* suspension forced, can do nothing more */
+
+ /* OK, we processed one iMCU row. */
+ cinfo->output_scanline += lines_per_iMCU_row;
+ return lines_per_iMCU_row;
+}
+
+
+/* Additional entry points for buffered-image mode. */
+
+#ifdef D_MULTISCAN_FILES_SUPPORTED
+
+/*
+ * Initialize for an output pass in buffered-image mode.
+ */
+
+GLOBAL(boolean)
+jpeg_start_output (j_decompress_ptr cinfo, int scan_number)
+{
+ if (cinfo->global_state != DSTATE_BUFIMAGE &&
+ cinfo->global_state != DSTATE_PRESCAN)
+ ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
+ /* Limit scan number to valid range */
+ if (scan_number <= 0)
+ scan_number = 1;
+ if (cinfo->inputctl->eoi_reached &&
+ scan_number > cinfo->input_scan_number)
+ scan_number = cinfo->input_scan_number;
+ cinfo->output_scan_number = scan_number;
+ /* Perform any dummy output passes, and set up for the real pass */
+ return output_pass_setup(cinfo);
+}
+
+
+/*
+ * Finish up after an output pass in buffered-image mode.
+ *
+ * Returns FALSE if suspended. The return value need be inspected only if
+ * a suspending data source is used.
+ */
+
+GLOBAL(boolean)
+jpeg_finish_output (j_decompress_ptr cinfo)
+{
+ if ((cinfo->global_state == DSTATE_SCANNING ||
+ cinfo->global_state == DSTATE_RAW_OK) && cinfo->buffered_image) {
+ /* Terminate this pass. */
+ /* We do not require the whole pass to have been completed. */
+ (*cinfo->master->finish_output_pass) (cinfo);
+ cinfo->global_state = DSTATE_BUFPOST;
+ } else if (cinfo->global_state != DSTATE_BUFPOST) {
+ /* BUFPOST = repeat call after a suspension, anything else is error */
+ ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
+ }
+ /* Read markers looking for SOS or EOI */
+ while (cinfo->input_scan_number <= cinfo->output_scan_number &&
+ ! cinfo->inputctl->eoi_reached) {
+ if ((*cinfo->inputctl->consume_input) (cinfo) == JPEG_SUSPENDED)
+ return FALSE; /* Suspend, come back later */
+ }
+ cinfo->global_state = DSTATE_BUFIMAGE;
+ return TRUE;
+}
+
+#endif /* D_MULTISCAN_FILES_SUPPORTED */
+
+#endif //_FX_JPEG_TURBO_
diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jdcoefct.c b/core/src/fxcodec/libjpeg/fpdfapi_jdcoefct.c
index 89041f36f4..099833a8d6 100644
--- a/core/src/fxcodec/libjpeg/fpdfapi_jdcoefct.c
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jdcoefct.c
@@ -1,739 +1,739 @@
-#if !defined(_FX_JPEG_TURBO_)
-/*
- * jdcoefct.c
- *
- * Copyright (C) 1994-1997, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains the coefficient buffer controller for decompression.
- * This controller is the top level of the JPEG decompressor proper.
- * The coefficient buffer lies between entropy decoding and inverse-DCT steps.
- *
- * In buffered-image mode, this controller is the interface between
- * input-oriented processing and output-oriented processing.
- * Also, the input side (only) is used when reading a file for transcoding.
- */
-
-#define JPEG_INTERNALS
-#include "jinclude.h"
-#include "jpeglib.h"
-
-/* Block smoothing is only applicable for progressive JPEG, so: */
-#ifndef D_PROGRESSIVE_SUPPORTED
-#undef BLOCK_SMOOTHING_SUPPORTED
-#endif
-
-/* Private buffer controller object */
-
-typedef struct {
- struct jpeg_d_coef_controller pub; /* public fields */
-
- /* These variables keep track of the current location of the input side. */
- /* cinfo->input_iMCU_row is also used for this. */
- JDIMENSION MCU_ctr; /* counts MCUs processed in current row */
- int MCU_vert_offset; /* counts MCU rows within iMCU row */
- int MCU_rows_per_iMCU_row; /* number of such rows needed */
-
- /* The output side's location is represented by cinfo->output_iMCU_row. */
-
- /* In single-pass modes, it's sufficient to buffer just one MCU.
- * We allocate a workspace of D_MAX_BLOCKS_IN_MCU coefficient blocks,
- * and let the entropy decoder write into that workspace each time.
- * (On 80x86, the workspace is FAR even though it's not really very big;
- * this is to keep the module interfaces unchanged when a large coefficient
- * buffer is necessary.)
- * In multi-pass modes, this array points to the current MCU's blocks
- * within the virtual arrays; it is used only by the input side.
- */
- JBLOCKROW MCU_buffer[D_MAX_BLOCKS_IN_MCU];
-
-#ifdef D_MULTISCAN_FILES_SUPPORTED
- /* In multi-pass modes, we need a virtual block array for each component. */
- jvirt_barray_ptr whole_image[MAX_COMPONENTS];
-#endif
-
-#ifdef BLOCK_SMOOTHING_SUPPORTED
- /* When doing block smoothing, we latch coefficient Al values here */
- int * coef_bits_latch;
-#define SAVED_COEFS 6 /* we save coef_bits[0..5] */
-#endif
-} my_coef_controller;
-
-typedef my_coef_controller * my_coef_ptr;
-
-/* Forward declarations */
-METHODDEF(int) decompress_onepass
- JPP((j_decompress_ptr cinfo, JSAMPIMAGE output_buf));
-#ifdef D_MULTISCAN_FILES_SUPPORTED
-METHODDEF(int) decompress_data
- JPP((j_decompress_ptr cinfo, JSAMPIMAGE output_buf));
-#endif
-#ifdef BLOCK_SMOOTHING_SUPPORTED
-LOCAL(boolean) smoothing_ok JPP((j_decompress_ptr cinfo));
-METHODDEF(int) decompress_smooth_data
- JPP((j_decompress_ptr cinfo, JSAMPIMAGE output_buf));
-#endif
-
-
-LOCAL(void)
-start_iMCU_row (j_decompress_ptr cinfo)
-/* Reset within-iMCU-row counters for a new row (input side) */
-{
- my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
-
- /* In an interleaved scan, an MCU row is the same as an iMCU row.
- * In a noninterleaved scan, an iMCU row has v_samp_factor MCU rows.
- * But at the bottom of the image, process only what's left.
- */
- if (cinfo->comps_in_scan > 1) {
- coef->MCU_rows_per_iMCU_row = 1;
- } else {
- if (cinfo->input_iMCU_row < (cinfo->total_iMCU_rows-1))
- coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->v_samp_factor;
- else
- coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->last_row_height;
- }
-
- coef->MCU_ctr = 0;
- coef->MCU_vert_offset = 0;
-}
-
-
-/*
- * Initialize for an input processing pass.
- */
-
-METHODDEF(void)
-start_input_pass (j_decompress_ptr cinfo)
-{
- cinfo->input_iMCU_row = 0;
- start_iMCU_row(cinfo);
-}
-
-
-/*
- * Initialize for an output processing pass.
- */
-
-METHODDEF(void)
-start_output_pass (j_decompress_ptr cinfo)
-{
-#ifdef BLOCK_SMOOTHING_SUPPORTED
- my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
-
- /* If multipass, check to see whether to use block smoothing on this pass */
- if (coef->pub.coef_arrays != NULL) {
- if (cinfo->do_block_smoothing && smoothing_ok(cinfo))
- coef->pub.decompress_data = decompress_smooth_data;
- else
- coef->pub.decompress_data = decompress_data;
- }
-#endif
- cinfo->output_iMCU_row = 0;
-}
-
-
-/*
- * Decompress and return some data in the single-pass case.
- * Always attempts to emit one fully interleaved MCU row ("iMCU" row).
- * Input and output must run in lockstep since we have only a one-MCU buffer.
- * Return value is JPEG_ROW_COMPLETED, JPEG_SCAN_COMPLETED, or JPEG_SUSPENDED.
- *
- * NB: output_buf contains a plane for each component in image,
- * which we index according to the component's SOF position.
- */
-
-METHODDEF(int)
-decompress_onepass (j_decompress_ptr cinfo, JSAMPIMAGE output_buf)
-{
- my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
- JDIMENSION MCU_col_num; /* index of current MCU within row */
- JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;
- JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
- int blkn, ci, xindex, yindex, yoffset, useful_width;
- JSAMPARRAY output_ptr;
- JDIMENSION start_col, output_col;
- jpeg_component_info *compptr;
- inverse_DCT_method_ptr inverse_DCT;
-
- /* Loop to process as much as one whole iMCU row */
- for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
- yoffset++) {
- for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col;
- MCU_col_num++) {
- /* Try to fetch an MCU. Entropy decoder expects buffer to be zeroed. */
- jzero_far((void FAR *) coef->MCU_buffer[0],
- (size_t) (cinfo->blocks_in_MCU * SIZEOF(JBLOCK)));
- if (! (*cinfo->entropy->decode_mcu) (cinfo, coef->MCU_buffer)) {
- /* Suspension forced; update state counters and exit */
- coef->MCU_vert_offset = yoffset;
- coef->MCU_ctr = MCU_col_num;
- return JPEG_SUSPENDED;
- }
- /* Determine where data should go in output_buf and do the IDCT thing.
- * We skip dummy blocks at the right and bottom edges (but blkn gets
- * incremented past them!). Note the inner loop relies on having
- * allocated the MCU_buffer[] blocks sequentially.
- */
- blkn = 0; /* index of current DCT block within MCU */
- for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
- compptr = cinfo->cur_comp_info[ci];
- /* Don't bother to IDCT an uninteresting component. */
- if (! compptr->component_needed) {
- blkn += compptr->MCU_blocks;
- continue;
- }
- inverse_DCT = cinfo->idct->inverse_DCT[compptr->component_index];
- useful_width = (MCU_col_num < last_MCU_col) ? compptr->MCU_width
- : compptr->last_col_width;
- output_ptr = output_buf[compptr->component_index] +
- yoffset * compptr->DCT_scaled_size;
- start_col = MCU_col_num * compptr->MCU_sample_width;
- for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
- if (cinfo->input_iMCU_row < last_iMCU_row ||
- yoffset+yindex < compptr->last_row_height) {
- output_col = start_col;
- for (xindex = 0; xindex < useful_width; xindex++) {
- (*inverse_DCT) (cinfo, compptr,
- (JCOEFPTR) coef->MCU_buffer[blkn+xindex],
- output_ptr, output_col);
- output_col += compptr->DCT_scaled_size;
- }
- }
- blkn += compptr->MCU_width;
- output_ptr += compptr->DCT_scaled_size;
- }
- }
- }
- /* Completed an MCU row, but perhaps not an iMCU row */
- coef->MCU_ctr = 0;
- }
- /* Completed the iMCU row, advance counters for next one */
- cinfo->output_iMCU_row++;
- if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
- start_iMCU_row(cinfo);
- return JPEG_ROW_COMPLETED;
- }
- /* Completed the scan */
- (*cinfo->inputctl->finish_input_pass) (cinfo);
- return JPEG_SCAN_COMPLETED;
-}
-
-
-/*
- * Dummy consume-input routine for single-pass operation.
- */
-
-METHODDEF(int)
-dummy_consume_data (j_decompress_ptr cinfo)
-{
- return JPEG_SUSPENDED; /* Always indicate nothing was done */
-}
-
-
-#ifdef D_MULTISCAN_FILES_SUPPORTED
-
-/*
- * Consume input data and store it in the full-image coefficient buffer.
- * We read as much as one fully interleaved MCU row ("iMCU" row) per call,
- * ie, v_samp_factor block rows for each component in the scan.
- * Return value is JPEG_ROW_COMPLETED, JPEG_SCAN_COMPLETED, or JPEG_SUSPENDED.
- */
-
-METHODDEF(int)
-consume_data (j_decompress_ptr cinfo)
-{
- my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
- JDIMENSION MCU_col_num; /* index of current MCU within row */
- int blkn, ci, xindex, yindex, yoffset;
- JDIMENSION start_col;
- JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
- JBLOCKROW buffer_ptr;
- jpeg_component_info *compptr;
-
- /* Align the virtual buffers for the components used in this scan. */
- for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
- compptr = cinfo->cur_comp_info[ci];
- buffer[ci] = (*cinfo->mem->access_virt_barray)
- ((j_common_ptr) cinfo, coef->whole_image[compptr->component_index],
- cinfo->input_iMCU_row * compptr->v_samp_factor,
- (JDIMENSION) compptr->v_samp_factor, TRUE);
- /* Note: entropy decoder expects buffer to be zeroed,
- * but this is handled automatically by the memory manager
- * because we requested a pre-zeroed array.
- */
- }
-
- /* Loop to process one whole iMCU row */
- for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
- yoffset++) {
- for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
- MCU_col_num++) {
- /* Construct list of pointers to DCT blocks belonging to this MCU */
- blkn = 0; /* index of current DCT block within MCU */
- for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
- compptr = cinfo->cur_comp_info[ci];
- start_col = MCU_col_num * compptr->MCU_width;
- for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
- buffer_ptr = buffer[ci][yindex+yoffset] + start_col;
- for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
- coef->MCU_buffer[blkn++] = buffer_ptr++;
- }
- }
- }
- /* Try to fetch the MCU. */
- if (! (*cinfo->entropy->decode_mcu) (cinfo, coef->MCU_buffer)) {
- /* Suspension forced; update state counters and exit */
- coef->MCU_vert_offset = yoffset;
- coef->MCU_ctr = MCU_col_num;
- return JPEG_SUSPENDED;
- }
- }
- /* Completed an MCU row, but perhaps not an iMCU row */
- coef->MCU_ctr = 0;
- }
- /* Completed the iMCU row, advance counters for next one */
- if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
- start_iMCU_row(cinfo);
- return JPEG_ROW_COMPLETED;
- }
- /* Completed the scan */
- (*cinfo->inputctl->finish_input_pass) (cinfo);
- return JPEG_SCAN_COMPLETED;
-}
-
-
-/*
- * Decompress and return some data in the multi-pass case.
- * Always attempts to emit one fully interleaved MCU row ("iMCU" row).
- * Return value is JPEG_ROW_COMPLETED, JPEG_SCAN_COMPLETED, or JPEG_SUSPENDED.
- *
- * NB: output_buf contains a plane for each component in image.
- */
-
-METHODDEF(int)
-decompress_data (j_decompress_ptr cinfo, JSAMPIMAGE output_buf)
-{
- my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
- JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
- JDIMENSION block_num;
- int ci, block_row, block_rows;
- JBLOCKARRAY buffer;
- JBLOCKROW buffer_ptr;
- JSAMPARRAY output_ptr;
- JDIMENSION output_col;
- jpeg_component_info *compptr;
- inverse_DCT_method_ptr inverse_DCT;
-
- /* Force some input to be done if we are getting ahead of the input. */
- while (cinfo->input_scan_number < cinfo->output_scan_number ||
- (cinfo->input_scan_number == cinfo->output_scan_number &&
- cinfo->input_iMCU_row <= cinfo->output_iMCU_row)) {
- if ((*cinfo->inputctl->consume_input)(cinfo) == JPEG_SUSPENDED)
- return JPEG_SUSPENDED;
- }
-
- /* OK, output from the virtual arrays. */
- for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
- ci++, compptr++) {
- /* Don't bother to IDCT an uninteresting component. */
- if (! compptr->component_needed)
- continue;
- /* Align the virtual buffer for this component. */
- buffer = (*cinfo->mem->access_virt_barray)
- ((j_common_ptr) cinfo, coef->whole_image[ci],
- cinfo->output_iMCU_row * compptr->v_samp_factor,
- (JDIMENSION) compptr->v_samp_factor, FALSE);
- /* Count non-dummy DCT block rows in this iMCU row. */
- if (cinfo->output_iMCU_row < last_iMCU_row)
- block_rows = compptr->v_samp_factor;
- else {
- /* NB: can't use last_row_height here; it is input-side-dependent! */
- block_rows = (int) (compptr->height_in_blocks % compptr->v_samp_factor);
- if (block_rows == 0) block_rows = compptr->v_samp_factor;
- }
- inverse_DCT = cinfo->idct->inverse_DCT[ci];
- output_ptr = output_buf[ci];
- /* Loop over all DCT blocks to be processed. */
- for (block_row = 0; block_row < block_rows; block_row++) {
- buffer_ptr = buffer[block_row];
- output_col = 0;
- for (block_num = 0; block_num < compptr->width_in_blocks; block_num++) {
- (*inverse_DCT) (cinfo, compptr, (JCOEFPTR) buffer_ptr,
- output_ptr, output_col);
- buffer_ptr++;
- output_col += compptr->DCT_scaled_size;
- }
- output_ptr += compptr->DCT_scaled_size;
- }
- }
-
- if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
- return JPEG_ROW_COMPLETED;
- return JPEG_SCAN_COMPLETED;
-}
-
-#endif /* D_MULTISCAN_FILES_SUPPORTED */
-
-
-#ifdef BLOCK_SMOOTHING_SUPPORTED
-
-/*
- * This code applies interblock smoothing as described by section K.8
- * of the JPEG standard: the first 5 AC coefficients are estimated from
- * the DC values of a DCT block and its 8 neighboring blocks.
- * We apply smoothing only for progressive JPEG decoding, and only if
- * the coefficients it can estimate are not yet known to full precision.
- */
-
-/* Natural-order array positions of the first 5 zigzag-order coefficients */
-#define Q01_POS 1
-#define Q10_POS 8
-#define Q20_POS 16
-#define Q11_POS 9
-#define Q02_POS 2
-
-/*
- * Determine whether block smoothing is applicable and safe.
- * We also latch the current states of the coef_bits[] entries for the
- * AC coefficients; otherwise, if the input side of the decompressor
- * advances into a new scan, we might think the coefficients are known
- * more accurately than they really are.
- */
-
-LOCAL(boolean)
-smoothing_ok (j_decompress_ptr cinfo)
-{
- my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
- boolean smoothing_useful = FALSE;
- int ci, coefi;
- jpeg_component_info *compptr;
- JQUANT_TBL * qtable;
- int * coef_bits;
- int * coef_bits_latch;
-
- if (! cinfo->progressive_mode || cinfo->coef_bits == NULL)
- return FALSE;
-
- /* Allocate latch area if not already done */
- if (coef->coef_bits_latch == NULL)
- coef->coef_bits_latch = (int *)
- (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
- cinfo->num_components *
- (SAVED_COEFS * SIZEOF(int)));
- coef_bits_latch = coef->coef_bits_latch;
-
- for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
- ci++, compptr++) {
- /* All components' quantization values must already be latched. */
- if ((qtable = compptr->quant_table) == NULL)
- return FALSE;
- /* Verify DC & first 5 AC quantizers are nonzero to avoid zero-divide. */
- if (qtable->quantval[0] == 0 ||
- qtable->quantval[Q01_POS] == 0 ||
- qtable->quantval[Q10_POS] == 0 ||
- qtable->quantval[Q20_POS] == 0 ||
- qtable->quantval[Q11_POS] == 0 ||
- qtable->quantval[Q02_POS] == 0)
- return FALSE;
- /* DC values must be at least partly known for all components. */
- coef_bits = cinfo->coef_bits[ci];
- if (coef_bits[0] < 0)
- return FALSE;
- /* Block smoothing is helpful if some AC coefficients remain inaccurate. */
- for (coefi = 1; coefi <= 5; coefi++) {
- coef_bits_latch[coefi] = coef_bits[coefi];
- if (coef_bits[coefi] != 0)
- smoothing_useful = TRUE;
- }
- coef_bits_latch += SAVED_COEFS;
- }
-
- return smoothing_useful;
-}
-
-
-/*
- * Variant of decompress_data for use when doing block smoothing.
- */
-
-METHODDEF(int)
-decompress_smooth_data (j_decompress_ptr cinfo, JSAMPIMAGE output_buf)
-{
- my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
- JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
- JDIMENSION block_num, last_block_column;
- int ci, block_row, block_rows, access_rows;
- JBLOCKARRAY buffer;
- JBLOCKROW buffer_ptr, prev_block_row, next_block_row;
- JSAMPARRAY output_ptr;
- JDIMENSION output_col;
- jpeg_component_info *compptr;
- inverse_DCT_method_ptr inverse_DCT;
- boolean first_row, last_row;
- JBLOCK workspace;
- int *coef_bits;
- JQUANT_TBL *quanttbl;
- INT32 Q00,Q01,Q02,Q10,Q11,Q20, num;
- int DC1,DC2,DC3,DC4,DC5,DC6,DC7,DC8,DC9;
- int Al, pred;
-
- /* Force some input to be done if we are getting ahead of the input. */
- while (cinfo->input_scan_number <= cinfo->output_scan_number &&
- ! cinfo->inputctl->eoi_reached) {
- if (cinfo->input_scan_number == cinfo->output_scan_number) {
- /* If input is working on current scan, we ordinarily want it to
- * have completed the current row. But if input scan is DC,
- * we want it to keep one row ahead so that next block row's DC
- * values are up to date.
- */
- JDIMENSION delta = (cinfo->Ss == 0) ? 1 : 0;
- if (cinfo->input_iMCU_row > cinfo->output_iMCU_row+delta)
- break;
- }
- if ((*cinfo->inputctl->consume_input)(cinfo) == JPEG_SUSPENDED)
- return JPEG_SUSPENDED;
- }
-
- /* OK, output from the virtual arrays. */
- for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
- ci++, compptr++) {
- /* Don't bother to IDCT an uninteresting component. */
- if (! compptr->component_needed)
- continue;
- /* Count non-dummy DCT block rows in this iMCU row. */
- if (cinfo->output_iMCU_row < last_iMCU_row) {
- block_rows = compptr->v_samp_factor;
- access_rows = block_rows * 2; /* this and next iMCU row */
- last_row = FALSE;
- } else {
- /* NB: can't use last_row_height here; it is input-side-dependent! */
- block_rows = (int) (compptr->height_in_blocks % compptr->v_samp_factor);
- if (block_rows == 0) block_rows = compptr->v_samp_factor;
- access_rows = block_rows; /* this iMCU row only */
- last_row = TRUE;
- }
- /* Align the virtual buffer for this component. */
- if (cinfo->output_iMCU_row > 0) {
- access_rows += compptr->v_samp_factor; /* prior iMCU row too */
- buffer = (*cinfo->mem->access_virt_barray)
- ((j_common_ptr) cinfo, coef->whole_image[ci],
- (cinfo->output_iMCU_row - 1) * compptr->v_samp_factor,
- (JDIMENSION) access_rows, FALSE);
- buffer += compptr->v_samp_factor; /* point to current iMCU row */
- first_row = FALSE;
- } else {
- buffer = (*cinfo->mem->access_virt_barray)
- ((j_common_ptr) cinfo, coef->whole_image[ci],
- (JDIMENSION) 0, (JDIMENSION) access_rows, FALSE);
- first_row = TRUE;
- }
- /* Fetch component-dependent info */
- coef_bits = coef->coef_bits_latch + (ci * SAVED_COEFS);
- quanttbl = compptr->quant_table;
- Q00 = quanttbl->quantval[0];
- Q01 = quanttbl->quantval[Q01_POS];
- Q10 = quanttbl->quantval[Q10_POS];
- Q20 = quanttbl->quantval[Q20_POS];
- Q11 = quanttbl->quantval[Q11_POS];
- Q02 = quanttbl->quantval[Q02_POS];
- inverse_DCT = cinfo->idct->inverse_DCT[ci];
- output_ptr = output_buf[ci];
- /* Loop over all DCT blocks to be processed. */
- for (block_row = 0; block_row < block_rows; block_row++) {
- buffer_ptr = buffer[block_row];
- if (first_row && block_row == 0)
- prev_block_row = buffer_ptr;
- else
- prev_block_row = buffer[block_row-1];
- if (last_row && block_row == block_rows-1)
- next_block_row = buffer_ptr;
- else
- next_block_row = buffer[block_row+1];
- /* We fetch the surrounding DC values using a sliding-register approach.
- * Initialize all nine here so as to do the right thing on narrow pics.
- */
- DC1 = DC2 = DC3 = (int) prev_block_row[0][0];
- DC4 = DC5 = DC6 = (int) buffer_ptr[0][0];
- DC7 = DC8 = DC9 = (int) next_block_row[0][0];
- output_col = 0;
- last_block_column = compptr->width_in_blocks - 1;
- for (block_num = 0; block_num <= last_block_column; block_num++) {
- /* Fetch current DCT block into workspace so we can modify it. */
- jcopy_block_row(buffer_ptr, (JBLOCKROW) workspace, (JDIMENSION) 1);
- /* Update DC values */
- if (block_num < last_block_column) {
- DC3 = (int) prev_block_row[1][0];
- DC6 = (int) buffer_ptr[1][0];
- DC9 = (int) next_block_row[1][0];
- }
- /* Compute coefficient estimates per K.8.
- * An estimate is applied only if coefficient is still zero,
- * and is not known to be fully accurate.
- */
- /* AC01 */
- if ((Al=coef_bits[1]) != 0 && workspace[1] == 0) {
- num = 36 * Q00 * (DC4 - DC6);
- if (num >= 0) {
- pred = (int) (((Q01<<7) + num) / (Q01<<8));
- if (Al > 0 && pred >= (1<<Al))
- pred = (1<<Al)-1;
- } else {
- pred = (int) (((Q01<<7) - num) / (Q01<<8));
- if (Al > 0 && pred >= (1<<Al))
- pred = (1<<Al)-1;
- pred = -pred;
- }
- workspace[1] = (JCOEF) pred;
- }
- /* AC10 */
- if ((Al=coef_bits[2]) != 0 && workspace[8] == 0) {
- num = 36 * Q00 * (DC2 - DC8);
- if (num >= 0) {
- pred = (int) (((Q10<<7) + num) / (Q10<<8));
- if (Al > 0 && pred >= (1<<Al))
- pred = (1<<Al)-1;
- } else {
- pred = (int) (((Q10<<7) - num) / (Q10<<8));
- if (Al > 0 && pred >= (1<<Al))
- pred = (1<<Al)-1;
- pred = -pred;
- }
- workspace[8] = (JCOEF) pred;
- }
- /* AC20 */
- if ((Al=coef_bits[3]) != 0 && workspace[16] == 0) {
- num = 9 * Q00 * (DC2 + DC8 - 2*DC5);
- if (num >= 0) {
- pred = (int) (((Q20<<7) + num) / (Q20<<8));
- if (Al > 0 && pred >= (1<<Al))
- pred = (1<<Al)-1;
- } else {
- pred = (int) (((Q20<<7) - num) / (Q20<<8));
- if (Al > 0 && pred >= (1<<Al))
- pred = (1<<Al)-1;
- pred = -pred;
- }
- workspace[16] = (JCOEF) pred;
- }
- /* AC11 */
- if ((Al=coef_bits[4]) != 0 && workspace[9] == 0) {
- num = 5 * Q00 * (DC1 - DC3 - DC7 + DC9);
- if (num >= 0) {
- pred = (int) (((Q11<<7) + num) / (Q11<<8));
- if (Al > 0 && pred >= (1<<Al))
- pred = (1<<Al)-1;
- } else {
- pred = (int) (((Q11<<7) - num) / (Q11<<8));
- if (Al > 0 && pred >= (1<<Al))
- pred = (1<<Al)-1;
- pred = -pred;
- }
- workspace[9] = (JCOEF) pred;
- }
- /* AC02 */
- if ((Al=coef_bits[5]) != 0 && workspace[2] == 0) {
- num = 9 * Q00 * (DC4 + DC6 - 2*DC5);
- if (num >= 0) {
- pred = (int) (((Q02<<7) + num) / (Q02<<8));
- if (Al > 0 && pred >= (1<<Al))
- pred = (1<<Al)-1;
- } else {
- pred = (int) (((Q02<<7) - num) / (Q02<<8));
- if (Al > 0 && pred >= (1<<Al))
- pred = (1<<Al)-1;
- pred = -pred;
- }
- workspace[2] = (JCOEF) pred;
- }
- /* OK, do the IDCT */
- (*inverse_DCT) (cinfo, compptr, (JCOEFPTR) workspace,
- output_ptr, output_col);
- /* Advance for next column */
- DC1 = DC2; DC2 = DC3;
- DC4 = DC5; DC5 = DC6;
- DC7 = DC8; DC8 = DC9;
- buffer_ptr++, prev_block_row++, next_block_row++;
- output_col += compptr->DCT_scaled_size;
- }
- output_ptr += compptr->DCT_scaled_size;
- }
- }
-
- if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
- return JPEG_ROW_COMPLETED;
- return JPEG_SCAN_COMPLETED;
-}
-
-#endif /* BLOCK_SMOOTHING_SUPPORTED */
-
-
-/*
- * Initialize coefficient buffer controller.
- */
-
-GLOBAL(void)
-jinit_d_coef_controller (j_decompress_ptr cinfo, boolean need_full_buffer)
-{
- my_coef_ptr coef;
-
- coef = (my_coef_ptr)
- (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
- SIZEOF(my_coef_controller));
- cinfo->coef = (struct jpeg_d_coef_controller *) coef;
- coef->pub.start_input_pass = start_input_pass;
- coef->pub.start_output_pass = start_output_pass;
-#ifdef BLOCK_SMOOTHING_SUPPORTED
- coef->coef_bits_latch = NULL;
-#endif
-
- /* Create the coefficient buffer. */
- if (need_full_buffer) {
-#ifdef D_MULTISCAN_FILES_SUPPORTED
- /* Allocate a full-image virtual array for each component, */
- /* padded to a multiple of samp_factor DCT blocks in each direction. */
- /* Note we ask for a pre-zeroed array. */
- int ci, access_rows;
- jpeg_component_info *compptr;
-
- for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
- ci++, compptr++) {
- access_rows = compptr->v_samp_factor;
-#ifdef BLOCK_SMOOTHING_SUPPORTED
- /* If block smoothing could be used, need a bigger window */
- if (cinfo->progressive_mode)
- access_rows *= 3;
-#endif
- coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
- ((j_common_ptr) cinfo, JPOOL_IMAGE, TRUE,
- (JDIMENSION) jround_up((long) compptr->width_in_blocks,
- (long) compptr->h_samp_factor),
- (JDIMENSION) jround_up((long) compptr->height_in_blocks,
- (long) compptr->v_samp_factor),
- (JDIMENSION) access_rows);
- }
- coef->pub.consume_data = consume_data;
- coef->pub.decompress_data = decompress_data;
- coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
-#else
- ERREXIT(cinfo, JERR_NOT_COMPILED);
-#endif
- } else {
- /* We only need a single-MCU buffer. */
- JBLOCKROW buffer;
- int i;
-
- buffer = (JBLOCKROW)
- (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE,
- D_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK));
- for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
- coef->MCU_buffer[i] = buffer + i;
- }
- coef->pub.consume_data = dummy_consume_data;
- coef->pub.decompress_data = decompress_onepass;
- coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
- }
-}
-
-#endif //_FX_JPEG_TURBO_
+#if !defined(_FX_JPEG_TURBO_)
+/*
+ * jdcoefct.c
+ *
+ * Copyright (C) 1994-1997, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains the coefficient buffer controller for decompression.
+ * This controller is the top level of the JPEG decompressor proper.
+ * The coefficient buffer lies between entropy decoding and inverse-DCT steps.
+ *
+ * In buffered-image mode, this controller is the interface between
+ * input-oriented processing and output-oriented processing.
+ * Also, the input side (only) is used when reading a file for transcoding.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+
+/* Block smoothing is only applicable for progressive JPEG, so: */
+#ifndef D_PROGRESSIVE_SUPPORTED
+#undef BLOCK_SMOOTHING_SUPPORTED
+#endif
+
+/* Private buffer controller object */
+
+typedef struct {
+ struct jpeg_d_coef_controller pub; /* public fields */
+
+ /* These variables keep track of the current location of the input side. */
+ /* cinfo->input_iMCU_row is also used for this. */
+ JDIMENSION MCU_ctr; /* counts MCUs processed in current row */
+ int MCU_vert_offset; /* counts MCU rows within iMCU row */
+ int MCU_rows_per_iMCU_row; /* number of such rows needed */
+
+ /* The output side's location is represented by cinfo->output_iMCU_row. */
+
+ /* In single-pass modes, it's sufficient to buffer just one MCU.
+ * We allocate a workspace of D_MAX_BLOCKS_IN_MCU coefficient blocks,
+ * and let the entropy decoder write into that workspace each time.
+ * (On 80x86, the workspace is FAR even though it's not really very big;
+ * this is to keep the module interfaces unchanged when a large coefficient
+ * buffer is necessary.)
+ * In multi-pass modes, this array points to the current MCU's blocks
+ * within the virtual arrays; it is used only by the input side.
+ */
+ JBLOCKROW MCU_buffer[D_MAX_BLOCKS_IN_MCU];
+
+#ifdef D_MULTISCAN_FILES_SUPPORTED
+ /* In multi-pass modes, we need a virtual block array for each component. */
+ jvirt_barray_ptr whole_image[MAX_COMPONENTS];
+#endif
+
+#ifdef BLOCK_SMOOTHING_SUPPORTED
+ /* When doing block smoothing, we latch coefficient Al values here */
+ int * coef_bits_latch;
+#define SAVED_COEFS 6 /* we save coef_bits[0..5] */
+#endif
+} my_coef_controller;
+
+typedef my_coef_controller * my_coef_ptr;
+
+/* Forward declarations */
+METHODDEF(int) decompress_onepass
+ JPP((j_decompress_ptr cinfo, JSAMPIMAGE output_buf));
+#ifdef D_MULTISCAN_FILES_SUPPORTED
+METHODDEF(int) decompress_data
+ JPP((j_decompress_ptr cinfo, JSAMPIMAGE output_buf));
+#endif
+#ifdef BLOCK_SMOOTHING_SUPPORTED
+LOCAL(boolean) smoothing_ok JPP((j_decompress_ptr cinfo));
+METHODDEF(int) decompress_smooth_data
+ JPP((j_decompress_ptr cinfo, JSAMPIMAGE output_buf));
+#endif
+
+
+LOCAL(void)
+start_iMCU_row (j_decompress_ptr cinfo)
+/* Reset within-iMCU-row counters for a new row (input side) */
+{
+ my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
+
+ /* In an interleaved scan, an MCU row is the same as an iMCU row.
+ * In a noninterleaved scan, an iMCU row has v_samp_factor MCU rows.
+ * But at the bottom of the image, process only what's left.
+ */
+ if (cinfo->comps_in_scan > 1) {
+ coef->MCU_rows_per_iMCU_row = 1;
+ } else {
+ if (cinfo->input_iMCU_row < (cinfo->total_iMCU_rows-1))
+ coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->v_samp_factor;
+ else
+ coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->last_row_height;
+ }
+
+ coef->MCU_ctr = 0;
+ coef->MCU_vert_offset = 0;
+}
+
+
+/*
+ * Initialize for an input processing pass.
+ */
+
+METHODDEF(void)
+start_input_pass (j_decompress_ptr cinfo)
+{
+ cinfo->input_iMCU_row = 0;
+ start_iMCU_row(cinfo);
+}
+
+
+/*
+ * Initialize for an output processing pass.
+ */
+
+METHODDEF(void)
+start_output_pass (j_decompress_ptr cinfo)
+{
+#ifdef BLOCK_SMOOTHING_SUPPORTED
+ my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
+
+ /* If multipass, check to see whether to use block smoothing on this pass */
+ if (coef->pub.coef_arrays != NULL) {
+ if (cinfo->do_block_smoothing && smoothing_ok(cinfo))
+ coef->pub.decompress_data = decompress_smooth_data;
+ else
+ coef->pub.decompress_data = decompress_data;
+ }
+#endif
+ cinfo->output_iMCU_row = 0;
+}
+
+
+/*
+ * Decompress and return some data in the single-pass case.
+ * Always attempts to emit one fully interleaved MCU row ("iMCU" row).
+ * Input and output must run in lockstep since we have only a one-MCU buffer.
+ * Return value is JPEG_ROW_COMPLETED, JPEG_SCAN_COMPLETED, or JPEG_SUSPENDED.
+ *
+ * NB: output_buf contains a plane for each component in image,
+ * which we index according to the component's SOF position.
+ */
+
+METHODDEF(int)
+decompress_onepass (j_decompress_ptr cinfo, JSAMPIMAGE output_buf)
+{
+ my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
+ JDIMENSION MCU_col_num; /* index of current MCU within row */
+ JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;
+ JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
+ int blkn, ci, xindex, yindex, yoffset, useful_width;
+ JSAMPARRAY output_ptr;
+ JDIMENSION start_col, output_col;
+ jpeg_component_info *compptr;
+ inverse_DCT_method_ptr inverse_DCT;
+
+ /* Loop to process as much as one whole iMCU row */
+ for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
+ yoffset++) {
+ for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col;
+ MCU_col_num++) {
+ /* Try to fetch an MCU. Entropy decoder expects buffer to be zeroed. */
+ jzero_far((void FAR *) coef->MCU_buffer[0],
+ (size_t) (cinfo->blocks_in_MCU * SIZEOF(JBLOCK)));
+ if (! (*cinfo->entropy->decode_mcu) (cinfo, coef->MCU_buffer)) {
+ /* Suspension forced; update state counters and exit */
+ coef->MCU_vert_offset = yoffset;
+ coef->MCU_ctr = MCU_col_num;
+ return JPEG_SUSPENDED;
+ }
+ /* Determine where data should go in output_buf and do the IDCT thing.
+ * We skip dummy blocks at the right and bottom edges (but blkn gets
+ * incremented past them!). Note the inner loop relies on having
+ * allocated the MCU_buffer[] blocks sequentially.
+ */
+ blkn = 0; /* index of current DCT block within MCU */
+ for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
+ compptr = cinfo->cur_comp_info[ci];
+ /* Don't bother to IDCT an uninteresting component. */
+ if (! compptr->component_needed) {
+ blkn += compptr->MCU_blocks;
+ continue;
+ }
+ inverse_DCT = cinfo->idct->inverse_DCT[compptr->component_index];
+ useful_width = (MCU_col_num < last_MCU_col) ? compptr->MCU_width
+ : compptr->last_col_width;
+ output_ptr = output_buf[compptr->component_index] +
+ yoffset * compptr->DCT_scaled_size;
+ start_col = MCU_col_num * compptr->MCU_sample_width;
+ for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
+ if (cinfo->input_iMCU_row < last_iMCU_row ||
+ yoffset+yindex < compptr->last_row_height) {
+ output_col = start_col;
+ for (xindex = 0; xindex < useful_width; xindex++) {
+ (*inverse_DCT) (cinfo, compptr,
+ (JCOEFPTR) coef->MCU_buffer[blkn+xindex],
+ output_ptr, output_col);
+ output_col += compptr->DCT_scaled_size;
+ }
+ }
+ blkn += compptr->MCU_width;
+ output_ptr += compptr->DCT_scaled_size;
+ }
+ }
+ }
+ /* Completed an MCU row, but perhaps not an iMCU row */
+ coef->MCU_ctr = 0;
+ }
+ /* Completed the iMCU row, advance counters for next one */
+ cinfo->output_iMCU_row++;
+ if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
+ start_iMCU_row(cinfo);
+ return JPEG_ROW_COMPLETED;
+ }
+ /* Completed the scan */
+ (*cinfo->inputctl->finish_input_pass) (cinfo);
+ return JPEG_SCAN_COMPLETED;
+}
+
+
+/*
+ * Dummy consume-input routine for single-pass operation.
+ */
+
+METHODDEF(int)
+dummy_consume_data (j_decompress_ptr cinfo)
+{
+ return JPEG_SUSPENDED; /* Always indicate nothing was done */
+}
+
+
+#ifdef D_MULTISCAN_FILES_SUPPORTED
+
+/*
+ * Consume input data and store it in the full-image coefficient buffer.
+ * We read as much as one fully interleaved MCU row ("iMCU" row) per call,
+ * ie, v_samp_factor block rows for each component in the scan.
+ * Return value is JPEG_ROW_COMPLETED, JPEG_SCAN_COMPLETED, or JPEG_SUSPENDED.
+ */
+
+METHODDEF(int)
+consume_data (j_decompress_ptr cinfo)
+{
+ my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
+ JDIMENSION MCU_col_num; /* index of current MCU within row */
+ int blkn, ci, xindex, yindex, yoffset;
+ JDIMENSION start_col;
+ JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
+ JBLOCKROW buffer_ptr;
+ jpeg_component_info *compptr;
+
+ /* Align the virtual buffers for the components used in this scan. */
+ for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
+ compptr = cinfo->cur_comp_info[ci];
+ buffer[ci] = (*cinfo->mem->access_virt_barray)
+ ((j_common_ptr) cinfo, coef->whole_image[compptr->component_index],
+ cinfo->input_iMCU_row * compptr->v_samp_factor,
+ (JDIMENSION) compptr->v_samp_factor, TRUE);
+ /* Note: entropy decoder expects buffer to be zeroed,
+ * but this is handled automatically by the memory manager
+ * because we requested a pre-zeroed array.
+ */
+ }
+
+ /* Loop to process one whole iMCU row */
+ for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
+ yoffset++) {
+ for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
+ MCU_col_num++) {
+ /* Construct list of pointers to DCT blocks belonging to this MCU */
+ blkn = 0; /* index of current DCT block within MCU */
+ for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
+ compptr = cinfo->cur_comp_info[ci];
+ start_col = MCU_col_num * compptr->MCU_width;
+ for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
+ buffer_ptr = buffer[ci][yindex+yoffset] + start_col;
+ for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
+ coef->MCU_buffer[blkn++] = buffer_ptr++;
+ }
+ }
+ }
+ /* Try to fetch the MCU. */
+ if (! (*cinfo->entropy->decode_mcu) (cinfo, coef->MCU_buffer)) {
+ /* Suspension forced; update state counters and exit */
+ coef->MCU_vert_offset = yoffset;
+ coef->MCU_ctr = MCU_col_num;
+ return JPEG_SUSPENDED;
+ }
+ }
+ /* Completed an MCU row, but perhaps not an iMCU row */
+ coef->MCU_ctr = 0;
+ }
+ /* Completed the iMCU row, advance counters for next one */
+ if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
+ start_iMCU_row(cinfo);
+ return JPEG_ROW_COMPLETED;
+ }
+ /* Completed the scan */
+ (*cinfo->inputctl->finish_input_pass) (cinfo);
+ return JPEG_SCAN_COMPLETED;
+}
+
+
+/*
+ * Decompress and return some data in the multi-pass case.
+ * Always attempts to emit one fully interleaved MCU row ("iMCU" row).
+ * Return value is JPEG_ROW_COMPLETED, JPEG_SCAN_COMPLETED, or JPEG_SUSPENDED.
+ *
+ * NB: output_buf contains a plane for each component in image.
+ */
+
+METHODDEF(int)
+decompress_data (j_decompress_ptr cinfo, JSAMPIMAGE output_buf)
+{
+ my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
+ JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
+ JDIMENSION block_num;
+ int ci, block_row, block_rows;
+ JBLOCKARRAY buffer;
+ JBLOCKROW buffer_ptr;
+ JSAMPARRAY output_ptr;
+ JDIMENSION output_col;
+ jpeg_component_info *compptr;
+ inverse_DCT_method_ptr inverse_DCT;
+
+ /* Force some input to be done if we are getting ahead of the input. */
+ while (cinfo->input_scan_number < cinfo->output_scan_number ||
+ (cinfo->input_scan_number == cinfo->output_scan_number &&
+ cinfo->input_iMCU_row <= cinfo->output_iMCU_row)) {
+ if ((*cinfo->inputctl->consume_input)(cinfo) == JPEG_SUSPENDED)
+ return JPEG_SUSPENDED;
+ }
+
+ /* OK, output from the virtual arrays. */
+ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+ ci++, compptr++) {
+ /* Don't bother to IDCT an uninteresting component. */
+ if (! compptr->component_needed)
+ continue;
+ /* Align the virtual buffer for this component. */
+ buffer = (*cinfo->mem->access_virt_barray)
+ ((j_common_ptr) cinfo, coef->whole_image[ci],
+ cinfo->output_iMCU_row * compptr->v_samp_factor,
+ (JDIMENSION) compptr->v_samp_factor, FALSE);
+ /* Count non-dummy DCT block rows in this iMCU row. */
+ if (cinfo->output_iMCU_row < last_iMCU_row)
+ block_rows = compptr->v_samp_factor;
+ else {
+ /* NB: can't use last_row_height here; it is input-side-dependent! */
+ block_rows = (int) (compptr->height_in_blocks % compptr->v_samp_factor);
+ if (block_rows == 0) block_rows = compptr->v_samp_factor;
+ }
+ inverse_DCT = cinfo->idct->inverse_DCT[ci];
+ output_ptr = output_buf[ci];
+ /* Loop over all DCT blocks to be processed. */
+ for (block_row = 0; block_row < block_rows; block_row++) {
+ buffer_ptr = buffer[block_row];
+ output_col = 0;
+ for (block_num = 0; block_num < compptr->width_in_blocks; block_num++) {
+ (*inverse_DCT) (cinfo, compptr, (JCOEFPTR) buffer_ptr,
+ output_ptr, output_col);
+ buffer_ptr++;
+ output_col += compptr->DCT_scaled_size;
+ }
+ output_ptr += compptr->DCT_scaled_size;
+ }
+ }
+
+ if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
+ return JPEG_ROW_COMPLETED;
+ return JPEG_SCAN_COMPLETED;
+}
+
+#endif /* D_MULTISCAN_FILES_SUPPORTED */
+
+
+#ifdef BLOCK_SMOOTHING_SUPPORTED
+
+/*
+ * This code applies interblock smoothing as described by section K.8
+ * of the JPEG standard: the first 5 AC coefficients are estimated from
+ * the DC values of a DCT block and its 8 neighboring blocks.
+ * We apply smoothing only for progressive JPEG decoding, and only if
+ * the coefficients it can estimate are not yet known to full precision.
+ */
+
+/* Natural-order array positions of the first 5 zigzag-order coefficients */
+#define Q01_POS 1
+#define Q10_POS 8
+#define Q20_POS 16
+#define Q11_POS 9
+#define Q02_POS 2
+
+/*
+ * Determine whether block smoothing is applicable and safe.
+ * We also latch the current states of the coef_bits[] entries for the
+ * AC coefficients; otherwise, if the input side of the decompressor
+ * advances into a new scan, we might think the coefficients are known
+ * more accurately than they really are.
+ */
+
+LOCAL(boolean)
+smoothing_ok (j_decompress_ptr cinfo)
+{
+ my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
+ boolean smoothing_useful = FALSE;
+ int ci, coefi;
+ jpeg_component_info *compptr;
+ JQUANT_TBL * qtable;
+ int * coef_bits;
+ int * coef_bits_latch;
+
+ if (! cinfo->progressive_mode || cinfo->coef_bits == NULL)
+ return FALSE;
+
+ /* Allocate latch area if not already done */
+ if (coef->coef_bits_latch == NULL)
+ coef->coef_bits_latch = (int *)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ cinfo->num_components *
+ (SAVED_COEFS * SIZEOF(int)));
+ coef_bits_latch = coef->coef_bits_latch;
+
+ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+ ci++, compptr++) {
+ /* All components' quantization values must already be latched. */
+ if ((qtable = compptr->quant_table) == NULL)
+ return FALSE;
+ /* Verify DC & first 5 AC quantizers are nonzero to avoid zero-divide. */
+ if (qtable->quantval[0] == 0 ||
+ qtable->quantval[Q01_POS] == 0 ||
+ qtable->quantval[Q10_POS] == 0 ||
+ qtable->quantval[Q20_POS] == 0 ||
+ qtable->quantval[Q11_POS] == 0 ||
+ qtable->quantval[Q02_POS] == 0)
+ return FALSE;
+ /* DC values must be at least partly known for all components. */
+ coef_bits = cinfo->coef_bits[ci];
+ if (coef_bits[0] < 0)
+ return FALSE;
+ /* Block smoothing is helpful if some AC coefficients remain inaccurate. */
+ for (coefi = 1; coefi <= 5; coefi++) {
+ coef_bits_latch[coefi] = coef_bits[coefi];
+ if (coef_bits[coefi] != 0)
+ smoothing_useful = TRUE;
+ }
+ coef_bits_latch += SAVED_COEFS;
+ }
+
+ return smoothing_useful;
+}
+
+
+/*
+ * Variant of decompress_data for use when doing block smoothing.
+ */
+
+METHODDEF(int)
+decompress_smooth_data (j_decompress_ptr cinfo, JSAMPIMAGE output_buf)
+{
+ my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
+ JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
+ JDIMENSION block_num, last_block_column;
+ int ci, block_row, block_rows, access_rows;
+ JBLOCKARRAY buffer;
+ JBLOCKROW buffer_ptr, prev_block_row, next_block_row;
+ JSAMPARRAY output_ptr;
+ JDIMENSION output_col;
+ jpeg_component_info *compptr;
+ inverse_DCT_method_ptr inverse_DCT;
+ boolean first_row, last_row;
+ JBLOCK workspace;
+ int *coef_bits;
+ JQUANT_TBL *quanttbl;
+ INT32 Q00,Q01,Q02,Q10,Q11,Q20, num;
+ int DC1,DC2,DC3,DC4,DC5,DC6,DC7,DC8,DC9;
+ int Al, pred;
+
+ /* Force some input to be done if we are getting ahead of the input. */
+ while (cinfo->input_scan_number <= cinfo->output_scan_number &&
+ ! cinfo->inputctl->eoi_reached) {
+ if (cinfo->input_scan_number == cinfo->output_scan_number) {
+ /* If input is working on current scan, we ordinarily want it to
+ * have completed the current row. But if input scan is DC,
+ * we want it to keep one row ahead so that next block row's DC
+ * values are up to date.
+ */
+ JDIMENSION delta = (cinfo->Ss == 0) ? 1 : 0;
+ if (cinfo->input_iMCU_row > cinfo->output_iMCU_row+delta)
+ break;
+ }
+ if ((*cinfo->inputctl->consume_input)(cinfo) == JPEG_SUSPENDED)
+ return JPEG_SUSPENDED;
+ }
+
+ /* OK, output from the virtual arrays. */
+ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+ ci++, compptr++) {
+ /* Don't bother to IDCT an uninteresting component. */
+ if (! compptr->component_needed)
+ continue;
+ /* Count non-dummy DCT block rows in this iMCU row. */
+ if (cinfo->output_iMCU_row < last_iMCU_row) {
+ block_rows = compptr->v_samp_factor;
+ access_rows = block_rows * 2; /* this and next iMCU row */
+ last_row = FALSE;
+ } else {
+ /* NB: can't use last_row_height here; it is input-side-dependent! */
+ block_rows = (int) (compptr->height_in_blocks % compptr->v_samp_factor);
+ if (block_rows == 0) block_rows = compptr->v_samp_factor;
+ access_rows = block_rows; /* this iMCU row only */
+ last_row = TRUE;
+ }
+ /* Align the virtual buffer for this component. */
+ if (cinfo->output_iMCU_row > 0) {
+ access_rows += compptr->v_samp_factor; /* prior iMCU row too */
+ buffer = (*cinfo->mem->access_virt_barray)
+ ((j_common_ptr) cinfo, coef->whole_image[ci],
+ (cinfo->output_iMCU_row - 1) * compptr->v_samp_factor,
+ (JDIMENSION) access_rows, FALSE);
+ buffer += compptr->v_samp_factor; /* point to current iMCU row */
+ first_row = FALSE;
+ } else {
+ buffer = (*cinfo->mem->access_virt_barray)
+ ((j_common_ptr) cinfo, coef->whole_image[ci],
+ (JDIMENSION) 0, (JDIMENSION) access_rows, FALSE);
+ first_row = TRUE;
+ }
+ /* Fetch component-dependent info */
+ coef_bits = coef->coef_bits_latch + (ci * SAVED_COEFS);
+ quanttbl = compptr->quant_table;
+ Q00 = quanttbl->quantval[0];
+ Q01 = quanttbl->quantval[Q01_POS];
+ Q10 = quanttbl->quantval[Q10_POS];
+ Q20 = quanttbl->quantval[Q20_POS];
+ Q11 = quanttbl->quantval[Q11_POS];
+ Q02 = quanttbl->quantval[Q02_POS];
+ inverse_DCT = cinfo->idct->inverse_DCT[ci];
+ output_ptr = output_buf[ci];
+ /* Loop over all DCT blocks to be processed. */
+ for (block_row = 0; block_row < block_rows; block_row++) {
+ buffer_ptr = buffer[block_row];
+ if (first_row && block_row == 0)
+ prev_block_row = buffer_ptr;
+ else
+ prev_block_row = buffer[block_row-1];
+ if (last_row && block_row == block_rows-1)
+ next_block_row = buffer_ptr;
+ else
+ next_block_row = buffer[block_row+1];
+ /* We fetch the surrounding DC values using a sliding-register approach.
+ * Initialize all nine here so as to do the right thing on narrow pics.
+ */
+ DC1 = DC2 = DC3 = (int) prev_block_row[0][0];
+ DC4 = DC5 = DC6 = (int) buffer_ptr[0][0];
+ DC7 = DC8 = DC9 = (int) next_block_row[0][0];
+ output_col = 0;
+ last_block_column = compptr->width_in_blocks - 1;
+ for (block_num = 0; block_num <= last_block_column; block_num++) {
+ /* Fetch current DCT block into workspace so we can modify it. */
+ jcopy_block_row(buffer_ptr, (JBLOCKROW) workspace, (JDIMENSION) 1);
+ /* Update DC values */
+ if (block_num < last_block_column) {
+ DC3 = (int) prev_block_row[1][0];
+ DC6 = (int) buffer_ptr[1][0];
+ DC9 = (int) next_block_row[1][0];
+ }
+ /* Compute coefficient estimates per K.8.
+ * An estimate is applied only if coefficient is still zero,
+ * and is not known to be fully accurate.
+ */
+ /* AC01 */
+ if ((Al=coef_bits[1]) != 0 && workspace[1] == 0) {
+ num = 36 * Q00 * (DC4 - DC6);
+ if (num >= 0) {
+ pred = (int) (((Q01<<7) + num) / (Q01<<8));
+ if (Al > 0 && pred >= (1<<Al))
+ pred = (1<<Al)-1;
+ } else {
+ pred = (int) (((Q01<<7) - num) / (Q01<<8));
+ if (Al > 0 && pred >= (1<<Al))
+ pred = (1<<Al)-1;
+ pred = -pred;
+ }
+ workspace[1] = (JCOEF) pred;
+ }
+ /* AC10 */
+ if ((Al=coef_bits[2]) != 0 && workspace[8] == 0) {
+ num = 36 * Q00 * (DC2 - DC8);
+ if (num >= 0) {
+ pred = (int) (((Q10<<7) + num) / (Q10<<8));
+ if (Al > 0 && pred >= (1<<Al))
+ pred = (1<<Al)-1;
+ } else {
+ pred = (int) (((Q10<<7) - num) / (Q10<<8));
+ if (Al > 0 && pred >= (1<<Al))
+ pred = (1<<Al)-1;
+ pred = -pred;
+ }
+ workspace[8] = (JCOEF) pred;
+ }
+ /* AC20 */
+ if ((Al=coef_bits[3]) != 0 && workspace[16] == 0) {
+ num = 9 * Q00 * (DC2 + DC8 - 2*DC5);
+ if (num >= 0) {
+ pred = (int) (((Q20<<7) + num) / (Q20<<8));
+ if (Al > 0 && pred >= (1<<Al))
+ pred = (1<<Al)-1;
+ } else {
+ pred = (int) (((Q20<<7) - num) / (Q20<<8));
+ if (Al > 0 && pred >= (1<<Al))
+ pred = (1<<Al)-1;
+ pred = -pred;
+ }
+ workspace[16] = (JCOEF) pred;
+ }
+ /* AC11 */
+ if ((Al=coef_bits[4]) != 0 && workspace[9] == 0) {
+ num = 5 * Q00 * (DC1 - DC3 - DC7 + DC9);
+ if (num >= 0) {
+ pred = (int) (((Q11<<7) + num) / (Q11<<8));
+ if (Al > 0 && pred >= (1<<Al))
+ pred = (1<<Al)-1;
+ } else {
+ pred = (int) (((Q11<<7) - num) / (Q11<<8));
+ if (Al > 0 && pred >= (1<<Al))
+ pred = (1<<Al)-1;
+ pred = -pred;
+ }
+ workspace[9] = (JCOEF) pred;
+ }
+ /* AC02 */
+ if ((Al=coef_bits[5]) != 0 && workspace[2] == 0) {
+ num = 9 * Q00 * (DC4 + DC6 - 2*DC5);
+ if (num >= 0) {
+ pred = (int) (((Q02<<7) + num) / (Q02<<8));
+ if (Al > 0 && pred >= (1<<Al))
+ pred = (1<<Al)-1;
+ } else {
+ pred = (int) (((Q02<<7) - num) / (Q02<<8));
+ if (Al > 0 && pred >= (1<<Al))
+ pred = (1<<Al)-1;
+ pred = -pred;
+ }
+ workspace[2] = (JCOEF) pred;
+ }
+ /* OK, do the IDCT */
+ (*inverse_DCT) (cinfo, compptr, (JCOEFPTR) workspace,
+ output_ptr, output_col);
+ /* Advance for next column */
+ DC1 = DC2; DC2 = DC3;
+ DC4 = DC5; DC5 = DC6;
+ DC7 = DC8; DC8 = DC9;
+ buffer_ptr++, prev_block_row++, next_block_row++;
+ output_col += compptr->DCT_scaled_size;
+ }
+ output_ptr += compptr->DCT_scaled_size;
+ }
+ }
+
+ if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
+ return JPEG_ROW_COMPLETED;
+ return JPEG_SCAN_COMPLETED;
+}
+
+#endif /* BLOCK_SMOOTHING_SUPPORTED */
+
+
+/*
+ * Initialize coefficient buffer controller.
+ */
+
+GLOBAL(void)
+jinit_d_coef_controller (j_decompress_ptr cinfo, boolean need_full_buffer)
+{
+ my_coef_ptr coef;
+
+ coef = (my_coef_ptr)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ SIZEOF(my_coef_controller));
+ cinfo->coef = (struct jpeg_d_coef_controller *) coef;
+ coef->pub.start_input_pass = start_input_pass;
+ coef->pub.start_output_pass = start_output_pass;
+#ifdef BLOCK_SMOOTHING_SUPPORTED
+ coef->coef_bits_latch = NULL;
+#endif
+
+ /* Create the coefficient buffer. */
+ if (need_full_buffer) {
+#ifdef D_MULTISCAN_FILES_SUPPORTED
+ /* Allocate a full-image virtual array for each component, */
+ /* padded to a multiple of samp_factor DCT blocks in each direction. */
+ /* Note we ask for a pre-zeroed array. */
+ int ci, access_rows;
+ jpeg_component_info *compptr;
+
+ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+ ci++, compptr++) {
+ access_rows = compptr->v_samp_factor;
+#ifdef BLOCK_SMOOTHING_SUPPORTED
+ /* If block smoothing could be used, need a bigger window */
+ if (cinfo->progressive_mode)
+ access_rows *= 3;
+#endif
+ coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
+ ((j_common_ptr) cinfo, JPOOL_IMAGE, TRUE,
+ (JDIMENSION) jround_up((long) compptr->width_in_blocks,
+ (long) compptr->h_samp_factor),
+ (JDIMENSION) jround_up((long) compptr->height_in_blocks,
+ (long) compptr->v_samp_factor),
+ (JDIMENSION) access_rows);
+ }
+ coef->pub.consume_data = consume_data;
+ coef->pub.decompress_data = decompress_data;
+ coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
+#else
+ ERREXIT(cinfo, JERR_NOT_COMPILED);
+#endif
+ } else {
+ /* We only need a single-MCU buffer. */
+ JBLOCKROW buffer;
+ int i;
+
+ buffer = (JBLOCKROW)
+ (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ D_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK));
+ for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
+ coef->MCU_buffer[i] = buffer + i;
+ }
+ coef->pub.consume_data = dummy_consume_data;
+ coef->pub.decompress_data = decompress_onepass;
+ coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
+ }
+}
+
+#endif //_FX_JPEG_TURBO_
diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jdcolor.c b/core/src/fxcodec/libjpeg/fpdfapi_jdcolor.c
index 5cd35f5ec9..c17329b86d 100644
--- a/core/src/fxcodec/libjpeg/fpdfapi_jdcolor.c
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jdcolor.c
@@ -1,399 +1,399 @@
-#if !defined(_FX_JPEG_TURBO_)
-/*
- * jdcolor.c
- *
- * Copyright (C) 1991-1997, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains output colorspace conversion routines.
- */
-
-#define JPEG_INTERNALS
-#include "jinclude.h"
-#include "jpeglib.h"
-
-
-/* Private subobject */
-
-typedef struct {
- struct jpeg_color_deconverter pub; /* public fields */
-
- /* Private state for YCC->RGB conversion */
- int * Cr_r_tab; /* => table for Cr to R conversion */
- int * Cb_b_tab; /* => table for Cb to B conversion */
- INT32 * Cr_g_tab; /* => table for Cr to G conversion */
- INT32 * Cb_g_tab; /* => table for Cb to G conversion */
-} my_color_deconverter;
-
-typedef my_color_deconverter * my_cconvert_ptr;
-
-
-/**************** YCbCr -> RGB conversion: most common case **************/
-
-/*
- * YCbCr is defined per CCIR 601-1, except that Cb and Cr are
- * normalized to the range 0..MAXJSAMPLE rather than -0.5 .. 0.5.
- * The conversion equations to be implemented are therefore
- * R = Y + 1.40200 * Cr
- * G = Y - 0.34414 * Cb - 0.71414 * Cr
- * B = Y + 1.77200 * Cb
- * where Cb and Cr represent the incoming values less CENTERJSAMPLE.
- * (These numbers are derived from TIFF 6.0 section 21, dated 3-June-92.)
- *
- * To avoid floating-point arithmetic, we represent the fractional constants
- * as integers scaled up by 2^16 (about 4 digits precision); we have to divide
- * the products by 2^16, with appropriate rounding, to get the correct answer.
- * Notice that Y, being an integral input, does not contribute any fraction
- * so it need not participate in the rounding.
- *
- * For even more speed, we avoid doing any multiplications in the inner loop
- * by precalculating the constants times Cb and Cr for all possible values.
- * For 8-bit JSAMPLEs this is very reasonable (only 256 entries per table);
- * for 12-bit samples it is still acceptable. It's not very reasonable for
- * 16-bit samples, but if you want lossless storage you shouldn't be changing
- * colorspace anyway.
- * The Cr=>R and Cb=>B values can be rounded to integers in advance; the
- * values for the G calculation are left scaled up, since we must add them
- * together before rounding.
- */
-
-#define SCALEBITS 16 /* speediest right-shift on some machines */
-#define ONE_HALF ((INT32) 1 << (SCALEBITS-1))
-#define FIX(x) ((INT32) ((x) * (1L<<SCALEBITS) + 0.5))
-
-
-/*
- * Initialize tables for YCC->RGB colorspace conversion.
- */
-
-LOCAL(void)
-build_ycc_rgb_table (j_decompress_ptr cinfo)
-{
- my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
- int i;
- INT32 x;
- SHIFT_TEMPS
-
- cconvert->Cr_r_tab = (int *)
- (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
- (MAXJSAMPLE+1) * SIZEOF(int));
- cconvert->Cb_b_tab = (int *)
- (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
- (MAXJSAMPLE+1) * SIZEOF(int));
- cconvert->Cr_g_tab = (INT32 *)
- (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
- (MAXJSAMPLE+1) * SIZEOF(INT32));
- cconvert->Cb_g_tab = (INT32 *)
- (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
- (MAXJSAMPLE+1) * SIZEOF(INT32));
-
- for (i = 0, x = -CENTERJSAMPLE; i <= MAXJSAMPLE; i++, x++) {
- /* i is the actual input pixel value, in the range 0..MAXJSAMPLE */
- /* The Cb or Cr value we are thinking of is x = i - CENTERJSAMPLE */
- /* Cr=>R value is nearest int to 1.40200 * x */
- cconvert->Cr_r_tab[i] = (int)
- RIGHT_SHIFT(FIX(1.40200) * x + ONE_HALF, SCALEBITS);
- /* Cb=>B value is nearest int to 1.77200 * x */
- cconvert->Cb_b_tab[i] = (int)
- RIGHT_SHIFT(FIX(1.77200) * x + ONE_HALF, SCALEBITS);
- /* Cr=>G value is scaled-up -0.71414 * x */
- cconvert->Cr_g_tab[i] = (- FIX(0.71414)) * x;
- /* Cb=>G value is scaled-up -0.34414 * x */
- /* We also add in ONE_HALF so that need not do it in inner loop */
- cconvert->Cb_g_tab[i] = (- FIX(0.34414)) * x + ONE_HALF;
- }
-}
-
-
-/*
- * Convert some rows of samples to the output colorspace.
- *
- * Note that we change from noninterleaved, one-plane-per-component format
- * to interleaved-pixel format. The output buffer is therefore three times
- * as wide as the input buffer.
- * A starting row offset is provided only for the input buffer. The caller
- * can easily adjust the passed output_buf value to accommodate any row
- * offset required on that side.
- */
-
-METHODDEF(void)
-ycc_rgb_convert (j_decompress_ptr cinfo,
- JSAMPIMAGE input_buf, JDIMENSION input_row,
- JSAMPARRAY output_buf, int num_rows)
-{
- my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
- register int y, cb, cr;
- register JSAMPROW outptr;
- register JSAMPROW inptr0, inptr1, inptr2;
- register JDIMENSION col;
- JDIMENSION num_cols = cinfo->output_width;
- /* copy these pointers into registers if possible */
- register JSAMPLE * range_limit = cinfo->sample_range_limit;
- register int * Crrtab = cconvert->Cr_r_tab;
- register int * Cbbtab = cconvert->Cb_b_tab;
- register INT32 * Crgtab = cconvert->Cr_g_tab;
- register INT32 * Cbgtab = cconvert->Cb_g_tab;
- SHIFT_TEMPS
-
- while (--num_rows >= 0) {
- inptr0 = input_buf[0][input_row];
- inptr1 = input_buf[1][input_row];
- inptr2 = input_buf[2][input_row];
- input_row++;
- outptr = *output_buf++;
- for (col = 0; col < num_cols; col++) {
- y = GETJSAMPLE(inptr0[col]);
- cb = GETJSAMPLE(inptr1[col]);
- cr = GETJSAMPLE(inptr2[col]);
- /* Range-limiting is essential due to noise introduced by DCT losses. */
- outptr[RGB_RED] = range_limit[y + Crrtab[cr]];
- outptr[RGB_GREEN] = range_limit[y +
- ((int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr],
- SCALEBITS))];
- outptr[RGB_BLUE] = range_limit[y + Cbbtab[cb]];
- outptr += RGB_PIXELSIZE;
- }
- }
-}
-
-
-/**************** Cases other than YCbCr -> RGB **************/
-
-
-/*
- * Color conversion for no colorspace change: just copy the data,
- * converting from separate-planes to interleaved representation.
- */
-
-METHODDEF(void)
-null_convert (j_decompress_ptr cinfo,
- JSAMPIMAGE input_buf, JDIMENSION input_row,
- JSAMPARRAY output_buf, int num_rows)
-{
- register JSAMPROW inptr, outptr;
- register JDIMENSION count;
- register int num_components = cinfo->num_components;
- JDIMENSION num_cols = cinfo->output_width;
- int ci;
-
- while (--num_rows >= 0) {
- for (ci = 0; ci < num_components; ci++) {
- inptr = input_buf[ci][input_row];
- outptr = output_buf[0] + ci;
- for (count = num_cols; count > 0; count--) {
- *outptr = *inptr++; /* needn't bother with GETJSAMPLE() here */
- outptr += num_components;
- }
- }
- input_row++;
- output_buf++;
- }
-}
-
-
-/*
- * Color conversion for grayscale: just copy the data.
- * This also works for YCbCr -> grayscale conversion, in which
- * we just copy the Y (luminance) component and ignore chrominance.
- */
-
-METHODDEF(void)
-grayscale_convert (j_decompress_ptr cinfo,
- JSAMPIMAGE input_buf, JDIMENSION input_row,
- JSAMPARRAY output_buf, int num_rows)
-{
- jcopy_sample_rows(input_buf[0], (int) input_row, output_buf, 0,
- num_rows, cinfo->output_width);
-}
-
-
-/*
- * Convert grayscale to RGB: just duplicate the graylevel three times.
- * This is provided to support applications that don't want to cope
- * with grayscale as a separate case.
- */
-
-METHODDEF(void)
-gray_rgb_convert (j_decompress_ptr cinfo,
- JSAMPIMAGE input_buf, JDIMENSION input_row,
- JSAMPARRAY output_buf, int num_rows)
-{
- register JSAMPROW inptr, outptr;
- register JDIMENSION col;
- JDIMENSION num_cols = cinfo->output_width;
-
- while (--num_rows >= 0) {
- inptr = input_buf[0][input_row++];
- outptr = *output_buf++;
- for (col = 0; col < num_cols; col++) {
- /* We can dispense with GETJSAMPLE() here */
- outptr[RGB_RED] = outptr[RGB_GREEN] = outptr[RGB_BLUE] = inptr[col];
- outptr += RGB_PIXELSIZE;
- }
- }
-}
-
-
-/*
- * Adobe-style YCCK->CMYK conversion.
- * We convert YCbCr to R=1-C, G=1-M, and B=1-Y using the same
- * conversion as above, while passing K (black) unchanged.
- * We assume build_ycc_rgb_table has been called.
- */
-
-METHODDEF(void)
-ycck_cmyk_convert (j_decompress_ptr cinfo,
- JSAMPIMAGE input_buf, JDIMENSION input_row,
- JSAMPARRAY output_buf, int num_rows)
-{
- my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
- register int y, cb, cr;
- register JSAMPROW outptr;
- register JSAMPROW inptr0, inptr1, inptr2, inptr3;
- register JDIMENSION col;
- JDIMENSION num_cols = cinfo->output_width;
- /* copy these pointers into registers if possible */
- register JSAMPLE * range_limit = cinfo->sample_range_limit;
- register int * Crrtab = cconvert->Cr_r_tab;
- register int * Cbbtab = cconvert->Cb_b_tab;
- register INT32 * Crgtab = cconvert->Cr_g_tab;
- register INT32 * Cbgtab = cconvert->Cb_g_tab;
- SHIFT_TEMPS
-
- while (--num_rows >= 0) {
- inptr0 = input_buf[0][input_row];
- inptr1 = input_buf[1][input_row];
- inptr2 = input_buf[2][input_row];
- inptr3 = input_buf[3][input_row];
- input_row++;
- outptr = *output_buf++;
- for (col = 0; col < num_cols; col++) {
- y = GETJSAMPLE(inptr0[col]);
- cb = GETJSAMPLE(inptr1[col]);
- cr = GETJSAMPLE(inptr2[col]);
- /* Range-limiting is essential due to noise introduced by DCT losses. */
- outptr[0] = range_limit[MAXJSAMPLE - (y + Crrtab[cr])]; /* red */
- outptr[1] = range_limit[MAXJSAMPLE - (y + /* green */
- ((int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr],
- SCALEBITS)))];
- outptr[2] = range_limit[MAXJSAMPLE - (y + Cbbtab[cb])]; /* blue */
- /* K passes through unchanged */
- outptr[3] = inptr3[col]; /* don't need GETJSAMPLE here */
- outptr += 4;
- }
- }
-}
-
-
-/*
- * Empty method for start_pass.
- */
-
-METHODDEF(void)
-start_pass_dcolor (j_decompress_ptr cinfo)
-{
- /* no work needed */
-}
-
-
-/*
- * Module initialization routine for output colorspace conversion.
- */
-
-GLOBAL(void)
-jinit_color_deconverter (j_decompress_ptr cinfo)
-{
- my_cconvert_ptr cconvert;
- int ci;
-
- cconvert = (my_cconvert_ptr)
- (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
- SIZEOF(my_color_deconverter));
- cinfo->cconvert = (struct jpeg_color_deconverter *) cconvert;
- cconvert->pub.start_pass = start_pass_dcolor;
-
- /* Make sure num_components agrees with jpeg_color_space */
- switch (cinfo->jpeg_color_space) {
- case JCS_GRAYSCALE:
- if (cinfo->num_components != 1)
- ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
- break;
-
- case JCS_RGB:
- case JCS_YCbCr:
- if (cinfo->num_components != 3)
- ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
- break;
-
- case JCS_CMYK:
- case JCS_YCCK:
- if (cinfo->num_components != 4)
- ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
- break;
-
- default: /* JCS_UNKNOWN can be anything */
- if (cinfo->num_components < 1)
- ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
- break;
- }
-
- /* Set out_color_components and conversion method based on requested space.
- * Also clear the component_needed flags for any unused components,
- * so that earlier pipeline stages can avoid useless computation.
- */
-
- switch (cinfo->out_color_space) {
- case JCS_GRAYSCALE:
- cinfo->out_color_components = 1;
- if (cinfo->jpeg_color_space == JCS_GRAYSCALE ||
- cinfo->jpeg_color_space == JCS_YCbCr) {
- cconvert->pub.color_convert = grayscale_convert;
- /* For color->grayscale conversion, only the Y (0) component is needed */
- for (ci = 1; ci < cinfo->num_components; ci++)
- cinfo->comp_info[ci].component_needed = FALSE;
- } else
- ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
- break;
-
- case JCS_RGB:
- cinfo->out_color_components = RGB_PIXELSIZE;
- if (cinfo->jpeg_color_space == JCS_YCbCr) {
- cconvert->pub.color_convert = ycc_rgb_convert;
- build_ycc_rgb_table(cinfo);
- } else if (cinfo->jpeg_color_space == JCS_GRAYSCALE) {
- cconvert->pub.color_convert = gray_rgb_convert;
- } else if (cinfo->jpeg_color_space == JCS_RGB && RGB_PIXELSIZE == 3) {
- cconvert->pub.color_convert = null_convert;
- } else
- ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
- break;
-
- case JCS_CMYK:
- cinfo->out_color_components = 4;
- if (cinfo->jpeg_color_space == JCS_YCCK) {
- cconvert->pub.color_convert = ycck_cmyk_convert;
- build_ycc_rgb_table(cinfo);
- } else if (cinfo->jpeg_color_space == JCS_CMYK) {
- cconvert->pub.color_convert = null_convert;
- } else
- ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
- break;
-
- default:
- /* Permit null conversion to same output space */
- if (cinfo->out_color_space == cinfo->jpeg_color_space) {
- cinfo->out_color_components = cinfo->num_components;
- cconvert->pub.color_convert = null_convert;
- } else /* unsupported non-null conversion */
- ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
- break;
- }
-
- if (cinfo->quantize_colors)
- cinfo->output_components = 1; /* single colormapped output component */
- else
- cinfo->output_components = cinfo->out_color_components;
-}
-
-#endif //_FX_JPEG_TURBO_
+#if !defined(_FX_JPEG_TURBO_)
+/*
+ * jdcolor.c
+ *
+ * Copyright (C) 1991-1997, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains output colorspace conversion routines.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+
+
+/* Private subobject */
+
+typedef struct {
+ struct jpeg_color_deconverter pub; /* public fields */
+
+ /* Private state for YCC->RGB conversion */
+ int * Cr_r_tab; /* => table for Cr to R conversion */
+ int * Cb_b_tab; /* => table for Cb to B conversion */
+ INT32 * Cr_g_tab; /* => table for Cr to G conversion */
+ INT32 * Cb_g_tab; /* => table for Cb to G conversion */
+} my_color_deconverter;
+
+typedef my_color_deconverter * my_cconvert_ptr;
+
+
+/**************** YCbCr -> RGB conversion: most common case **************/
+
+/*
+ * YCbCr is defined per CCIR 601-1, except that Cb and Cr are
+ * normalized to the range 0..MAXJSAMPLE rather than -0.5 .. 0.5.
+ * The conversion equations to be implemented are therefore
+ * R = Y + 1.40200 * Cr
+ * G = Y - 0.34414 * Cb - 0.71414 * Cr
+ * B = Y + 1.77200 * Cb
+ * where Cb and Cr represent the incoming values less CENTERJSAMPLE.
+ * (These numbers are derived from TIFF 6.0 section 21, dated 3-June-92.)
+ *
+ * To avoid floating-point arithmetic, we represent the fractional constants
+ * as integers scaled up by 2^16 (about 4 digits precision); we have to divide
+ * the products by 2^16, with appropriate rounding, to get the correct answer.
+ * Notice that Y, being an integral input, does not contribute any fraction
+ * so it need not participate in the rounding.
+ *
+ * For even more speed, we avoid doing any multiplications in the inner loop
+ * by precalculating the constants times Cb and Cr for all possible values.
+ * For 8-bit JSAMPLEs this is very reasonable (only 256 entries per table);
+ * for 12-bit samples it is still acceptable. It's not very reasonable for
+ * 16-bit samples, but if you want lossless storage you shouldn't be changing
+ * colorspace anyway.
+ * The Cr=>R and Cb=>B values can be rounded to integers in advance; the
+ * values for the G calculation are left scaled up, since we must add them
+ * together before rounding.
+ */
+
+#define SCALEBITS 16 /* speediest right-shift on some machines */
+#define ONE_HALF ((INT32) 1 << (SCALEBITS-1))
+#define FIX(x) ((INT32) ((x) * (1L<<SCALEBITS) + 0.5))
+
+
+/*
+ * Initialize tables for YCC->RGB colorspace conversion.
+ */
+
+LOCAL(void)
+build_ycc_rgb_table (j_decompress_ptr cinfo)
+{
+ my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
+ int i;
+ INT32 x;
+ SHIFT_TEMPS
+
+ cconvert->Cr_r_tab = (int *)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ (MAXJSAMPLE+1) * SIZEOF(int));
+ cconvert->Cb_b_tab = (int *)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ (MAXJSAMPLE+1) * SIZEOF(int));
+ cconvert->Cr_g_tab = (INT32 *)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ (MAXJSAMPLE+1) * SIZEOF(INT32));
+ cconvert->Cb_g_tab = (INT32 *)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ (MAXJSAMPLE+1) * SIZEOF(INT32));
+
+ for (i = 0, x = -CENTERJSAMPLE; i <= MAXJSAMPLE; i++, x++) {
+ /* i is the actual input pixel value, in the range 0..MAXJSAMPLE */
+ /* The Cb or Cr value we are thinking of is x = i - CENTERJSAMPLE */
+ /* Cr=>R value is nearest int to 1.40200 * x */
+ cconvert->Cr_r_tab[i] = (int)
+ RIGHT_SHIFT(FIX(1.40200) * x + ONE_HALF, SCALEBITS);
+ /* Cb=>B value is nearest int to 1.77200 * x */
+ cconvert->Cb_b_tab[i] = (int)
+ RIGHT_SHIFT(FIX(1.77200) * x + ONE_HALF, SCALEBITS);
+ /* Cr=>G value is scaled-up -0.71414 * x */
+ cconvert->Cr_g_tab[i] = (- FIX(0.71414)) * x;
+ /* Cb=>G value is scaled-up -0.34414 * x */
+ /* We also add in ONE_HALF so that need not do it in inner loop */
+ cconvert->Cb_g_tab[i] = (- FIX(0.34414)) * x + ONE_HALF;
+ }
+}
+
+
+/*
+ * Convert some rows of samples to the output colorspace.
+ *
+ * Note that we change from noninterleaved, one-plane-per-component format
+ * to interleaved-pixel format. The output buffer is therefore three times
+ * as wide as the input buffer.
+ * A starting row offset is provided only for the input buffer. The caller
+ * can easily adjust the passed output_buf value to accommodate any row
+ * offset required on that side.
+ */
+
+METHODDEF(void)
+ycc_rgb_convert (j_decompress_ptr cinfo,
+ JSAMPIMAGE input_buf, JDIMENSION input_row,
+ JSAMPARRAY output_buf, int num_rows)
+{
+ my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
+ register int y, cb, cr;
+ register JSAMPROW outptr;
+ register JSAMPROW inptr0, inptr1, inptr2;
+ register JDIMENSION col;
+ JDIMENSION num_cols = cinfo->output_width;
+ /* copy these pointers into registers if possible */
+ register JSAMPLE * range_limit = cinfo->sample_range_limit;
+ register int * Crrtab = cconvert->Cr_r_tab;
+ register int * Cbbtab = cconvert->Cb_b_tab;
+ register INT32 * Crgtab = cconvert->Cr_g_tab;
+ register INT32 * Cbgtab = cconvert->Cb_g_tab;
+ SHIFT_TEMPS
+
+ while (--num_rows >= 0) {
+ inptr0 = input_buf[0][input_row];
+ inptr1 = input_buf[1][input_row];
+ inptr2 = input_buf[2][input_row];
+ input_row++;
+ outptr = *output_buf++;
+ for (col = 0; col < num_cols; col++) {
+ y = GETJSAMPLE(inptr0[col]);
+ cb = GETJSAMPLE(inptr1[col]);
+ cr = GETJSAMPLE(inptr2[col]);
+ /* Range-limiting is essential due to noise introduced by DCT losses. */
+ outptr[RGB_RED] = range_limit[y + Crrtab[cr]];
+ outptr[RGB_GREEN] = range_limit[y +
+ ((int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr],
+ SCALEBITS))];
+ outptr[RGB_BLUE] = range_limit[y + Cbbtab[cb]];
+ outptr += RGB_PIXELSIZE;
+ }
+ }
+}
+
+
+/**************** Cases other than YCbCr -> RGB **************/
+
+
+/*
+ * Color conversion for no colorspace change: just copy the data,
+ * converting from separate-planes to interleaved representation.
+ */
+
+METHODDEF(void)
+null_convert (j_decompress_ptr cinfo,
+ JSAMPIMAGE input_buf, JDIMENSION input_row,
+ JSAMPARRAY output_buf, int num_rows)
+{
+ register JSAMPROW inptr, outptr;
+ register JDIMENSION count;
+ register int num_components = cinfo->num_components;
+ JDIMENSION num_cols = cinfo->output_width;
+ int ci;
+
+ while (--num_rows >= 0) {
+ for (ci = 0; ci < num_components; ci++) {
+ inptr = input_buf[ci][input_row];
+ outptr = output_buf[0] + ci;
+ for (count = num_cols; count > 0; count--) {
+ *outptr = *inptr++; /* needn't bother with GETJSAMPLE() here */
+ outptr += num_components;
+ }
+ }
+ input_row++;
+ output_buf++;
+ }
+}
+
+
+/*
+ * Color conversion for grayscale: just copy the data.
+ * This also works for YCbCr -> grayscale conversion, in which
+ * we just copy the Y (luminance) component and ignore chrominance.
+ */
+
+METHODDEF(void)
+grayscale_convert (j_decompress_ptr cinfo,
+ JSAMPIMAGE input_buf, JDIMENSION input_row,
+ JSAMPARRAY output_buf, int num_rows)
+{
+ jcopy_sample_rows(input_buf[0], (int) input_row, output_buf, 0,
+ num_rows, cinfo->output_width);
+}
+
+
+/*
+ * Convert grayscale to RGB: just duplicate the graylevel three times.
+ * This is provided to support applications that don't want to cope
+ * with grayscale as a separate case.
+ */
+
+METHODDEF(void)
+gray_rgb_convert (j_decompress_ptr cinfo,
+ JSAMPIMAGE input_buf, JDIMENSION input_row,
+ JSAMPARRAY output_buf, int num_rows)
+{
+ register JSAMPROW inptr, outptr;
+ register JDIMENSION col;
+ JDIMENSION num_cols = cinfo->output_width;
+
+ while (--num_rows >= 0) {
+ inptr = input_buf[0][input_row++];
+ outptr = *output_buf++;
+ for (col = 0; col < num_cols; col++) {
+ /* We can dispense with GETJSAMPLE() here */
+ outptr[RGB_RED] = outptr[RGB_GREEN] = outptr[RGB_BLUE] = inptr[col];
+ outptr += RGB_PIXELSIZE;
+ }
+ }
+}
+
+
+/*
+ * Adobe-style YCCK->CMYK conversion.
+ * We convert YCbCr to R=1-C, G=1-M, and B=1-Y using the same
+ * conversion as above, while passing K (black) unchanged.
+ * We assume build_ycc_rgb_table has been called.
+ */
+
+METHODDEF(void)
+ycck_cmyk_convert (j_decompress_ptr cinfo,
+ JSAMPIMAGE input_buf, JDIMENSION input_row,
+ JSAMPARRAY output_buf, int num_rows)
+{
+ my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
+ register int y, cb, cr;
+ register JSAMPROW outptr;
+ register JSAMPROW inptr0, inptr1, inptr2, inptr3;
+ register JDIMENSION col;
+ JDIMENSION num_cols = cinfo->output_width;
+ /* copy these pointers into registers if possible */
+ register JSAMPLE * range_limit = cinfo->sample_range_limit;
+ register int * Crrtab = cconvert->Cr_r_tab;
+ register int * Cbbtab = cconvert->Cb_b_tab;
+ register INT32 * Crgtab = cconvert->Cr_g_tab;
+ register INT32 * Cbgtab = cconvert->Cb_g_tab;
+ SHIFT_TEMPS
+
+ while (--num_rows >= 0) {
+ inptr0 = input_buf[0][input_row];
+ inptr1 = input_buf[1][input_row];
+ inptr2 = input_buf[2][input_row];
+ inptr3 = input_buf[3][input_row];
+ input_row++;
+ outptr = *output_buf++;
+ for (col = 0; col < num_cols; col++) {
+ y = GETJSAMPLE(inptr0[col]);
+ cb = GETJSAMPLE(inptr1[col]);
+ cr = GETJSAMPLE(inptr2[col]);
+ /* Range-limiting is essential due to noise introduced by DCT losses. */
+ outptr[0] = range_limit[MAXJSAMPLE - (y + Crrtab[cr])]; /* red */
+ outptr[1] = range_limit[MAXJSAMPLE - (y + /* green */
+ ((int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr],
+ SCALEBITS)))];
+ outptr[2] = range_limit[MAXJSAMPLE - (y + Cbbtab[cb])]; /* blue */
+ /* K passes through unchanged */
+ outptr[3] = inptr3[col]; /* don't need GETJSAMPLE here */
+ outptr += 4;
+ }
+ }
+}
+
+
+/*
+ * Empty method for start_pass.
+ */
+
+METHODDEF(void)
+start_pass_dcolor (j_decompress_ptr cinfo)
+{
+ /* no work needed */
+}
+
+
+/*
+ * Module initialization routine for output colorspace conversion.
+ */
+
+GLOBAL(void)
+jinit_color_deconverter (j_decompress_ptr cinfo)
+{
+ my_cconvert_ptr cconvert;
+ int ci;
+
+ cconvert = (my_cconvert_ptr)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ SIZEOF(my_color_deconverter));
+ cinfo->cconvert = (struct jpeg_color_deconverter *) cconvert;
+ cconvert->pub.start_pass = start_pass_dcolor;
+
+ /* Make sure num_components agrees with jpeg_color_space */
+ switch (cinfo->jpeg_color_space) {
+ case JCS_GRAYSCALE:
+ if (cinfo->num_components != 1)
+ ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
+ break;
+
+ case JCS_RGB:
+ case JCS_YCbCr:
+ if (cinfo->num_components != 3)
+ ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
+ break;
+
+ case JCS_CMYK:
+ case JCS_YCCK:
+ if (cinfo->num_components != 4)
+ ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
+ break;
+
+ default: /* JCS_UNKNOWN can be anything */
+ if (cinfo->num_components < 1)
+ ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
+ break;
+ }
+
+ /* Set out_color_components and conversion method based on requested space.
+ * Also clear the component_needed flags for any unused components,
+ * so that earlier pipeline stages can avoid useless computation.
+ */
+
+ switch (cinfo->out_color_space) {
+ case JCS_GRAYSCALE:
+ cinfo->out_color_components = 1;
+ if (cinfo->jpeg_color_space == JCS_GRAYSCALE ||
+ cinfo->jpeg_color_space == JCS_YCbCr) {
+ cconvert->pub.color_convert = grayscale_convert;
+ /* For color->grayscale conversion, only the Y (0) component is needed */
+ for (ci = 1; ci < cinfo->num_components; ci++)
+ cinfo->comp_info[ci].component_needed = FALSE;
+ } else
+ ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
+ break;
+
+ case JCS_RGB:
+ cinfo->out_color_components = RGB_PIXELSIZE;
+ if (cinfo->jpeg_color_space == JCS_YCbCr) {
+ cconvert->pub.color_convert = ycc_rgb_convert;
+ build_ycc_rgb_table(cinfo);
+ } else if (cinfo->jpeg_color_space == JCS_GRAYSCALE) {
+ cconvert->pub.color_convert = gray_rgb_convert;
+ } else if (cinfo->jpeg_color_space == JCS_RGB && RGB_PIXELSIZE == 3) {
+ cconvert->pub.color_convert = null_convert;
+ } else
+ ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
+ break;
+
+ case JCS_CMYK:
+ cinfo->out_color_components = 4;
+ if (cinfo->jpeg_color_space == JCS_YCCK) {
+ cconvert->pub.color_convert = ycck_cmyk_convert;
+ build_ycc_rgb_table(cinfo);
+ } else if (cinfo->jpeg_color_space == JCS_CMYK) {
+ cconvert->pub.color_convert = null_convert;
+ } else
+ ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
+ break;
+
+ default:
+ /* Permit null conversion to same output space */
+ if (cinfo->out_color_space == cinfo->jpeg_color_space) {
+ cinfo->out_color_components = cinfo->num_components;
+ cconvert->pub.color_convert = null_convert;
+ } else /* unsupported non-null conversion */
+ ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
+ break;
+ }
+
+ if (cinfo->quantize_colors)
+ cinfo->output_components = 1; /* single colormapped output component */
+ else
+ cinfo->output_components = cinfo->out_color_components;
+}
+
+#endif //_FX_JPEG_TURBO_
diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jddctmgr.c b/core/src/fxcodec/libjpeg/fpdfapi_jddctmgr.c
index 811d51d51a..5226456414 100644
--- a/core/src/fxcodec/libjpeg/fpdfapi_jddctmgr.c
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jddctmgr.c
@@ -1,272 +1,272 @@
-#if !defined(_FX_JPEG_TURBO_)
-/*
- * jddctmgr.c
- *
- * Copyright (C) 1994-1996, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains the inverse-DCT management logic.
- * This code selects a particular IDCT implementation to be used,
- * and it performs related housekeeping chores. No code in this file
- * is executed per IDCT step, only during output pass setup.
- *
- * Note that the IDCT routines are responsible for performing coefficient
- * dequantization as well as the IDCT proper. This module sets up the
- * dequantization multiplier table needed by the IDCT routine.
- */
-
-#define JPEG_INTERNALS
-#include "jinclude.h"
-#include "jpeglib.h"
-#include "jdct.h" /* Private declarations for DCT subsystem */
-
-
-/*
- * The decompressor input side (jdinput.c) saves away the appropriate
- * quantization table for each component at the start of the first scan
- * involving that component. (This is necessary in order to correctly
- * decode files that reuse Q-table slots.)
- * When we are ready to make an output pass, the saved Q-table is converted
- * to a multiplier table that will actually be used by the IDCT routine.
- * The multiplier table contents are IDCT-method-dependent. To support
- * application changes in IDCT method between scans, we can remake the
- * multiplier tables if necessary.
- * In buffered-image mode, the first output pass may occur before any data
- * has been seen for some components, and thus before their Q-tables have
- * been saved away. To handle this case, multiplier tables are preset
- * to zeroes; the result of the IDCT will be a neutral gray level.
- */
-
-
-/* Private subobject for this module */
-
-typedef struct {
- struct jpeg_inverse_dct pub; /* public fields */
-
- /* This array contains the IDCT method code that each multiplier table
- * is currently set up for, or -1 if it's not yet set up.
- * The actual multiplier tables are pointed to by dct_table in the
- * per-component comp_info structures.
- */
- int cur_method[MAX_COMPONENTS];
-} my_idct_controller;
-
-typedef my_idct_controller * my_idct_ptr;
-
-
-/* Allocated multiplier tables: big enough for any supported variant */
-
-typedef union {
- ISLOW_MULT_TYPE islow_array[DCTSIZE2];
-#ifdef DCT_IFAST_SUPPORTED
- IFAST_MULT_TYPE ifast_array[DCTSIZE2];
-#endif
-#ifdef DCT_FLOAT_SUPPORTED
- FLOAT_MULT_TYPE float_array[DCTSIZE2];
-#endif
-} multiplier_table;
-
-
-/* The current scaled-IDCT routines require ISLOW-style multiplier tables,
- * so be sure to compile that code if either ISLOW or SCALING is requested.
- */
-#ifdef DCT_ISLOW_SUPPORTED
-#define PROVIDE_ISLOW_TABLES
-#else
-#ifdef IDCT_SCALING_SUPPORTED
-#define PROVIDE_ISLOW_TABLES
-#endif
-#endif
-
-
-/*
- * Prepare for an output pass.
- * Here we select the proper IDCT routine for each component and build
- * a matching multiplier table.
- */
-
-METHODDEF(void)
-start_pass (j_decompress_ptr cinfo)
-{
- my_idct_ptr idct = (my_idct_ptr) cinfo->idct;
- int ci, i;
- jpeg_component_info *compptr;
- int method = 0;
- inverse_DCT_method_ptr method_ptr = NULL;
- JQUANT_TBL * qtbl;
-
- for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
- ci++, compptr++) {
- /* Select the proper IDCT routine for this component's scaling */
- switch (compptr->DCT_scaled_size) {
-#ifdef IDCT_SCALING_SUPPORTED
- case 1:
- method_ptr = jpeg_idct_1x1;
- method = JDCT_ISLOW; /* jidctred uses islow-style table */
- break;
- case 2:
- method_ptr = jpeg_idct_2x2;
- method = JDCT_ISLOW; /* jidctred uses islow-style table */
- break;
- case 4:
- method_ptr = jpeg_idct_4x4;
- method = JDCT_ISLOW; /* jidctred uses islow-style table */
- break;
-#endif
- case DCTSIZE:
- switch (cinfo->dct_method) {
-#ifdef DCT_ISLOW_SUPPORTED
- case JDCT_ISLOW:
- method_ptr = jpeg_idct_islow;
- method = JDCT_ISLOW;
- break;
-#endif
-#ifdef DCT_IFAST_SUPPORTED
- case JDCT_IFAST:
- method_ptr = jpeg_idct_ifast;
- method = JDCT_IFAST;
- break;
-#endif
-#ifdef DCT_FLOAT_SUPPORTED
- case JDCT_FLOAT:
- method_ptr = jpeg_idct_float;
- method = JDCT_FLOAT;
- break;
-#endif
- default:
- ERREXIT(cinfo, JERR_NOT_COMPILED);
- break;
- }
- break;
- default:
- ERREXIT1(cinfo, JERR_BAD_DCTSIZE, compptr->DCT_scaled_size);
- break;
- }
- idct->pub.inverse_DCT[ci] = method_ptr;
- /* Create multiplier table from quant table.
- * However, we can skip this if the component is uninteresting
- * or if we already built the table. Also, if no quant table
- * has yet been saved for the component, we leave the
- * multiplier table all-zero; we'll be reading zeroes from the
- * coefficient controller's buffer anyway.
- */
- if (! compptr->component_needed || idct->cur_method[ci] == method)
- continue;
- qtbl = compptr->quant_table;
- if (qtbl == NULL) /* happens if no data yet for component */
- continue;
- idct->cur_method[ci] = method;
- switch (method) {
-#ifdef PROVIDE_ISLOW_TABLES
- case JDCT_ISLOW:
- {
- /* For LL&M IDCT method, multipliers are equal to raw quantization
- * coefficients, but are stored as ints to ensure access efficiency.
- */
- ISLOW_MULT_TYPE * ismtbl = (ISLOW_MULT_TYPE *) compptr->dct_table;
- for (i = 0; i < DCTSIZE2; i++) {
- ismtbl[i] = (ISLOW_MULT_TYPE) qtbl->quantval[i];
- }
- }
- break;
-#endif
-#ifdef DCT_IFAST_SUPPORTED
- case JDCT_IFAST:
- {
- /* For AA&N IDCT method, multipliers are equal to quantization
- * coefficients scaled by scalefactor[row]*scalefactor[col], where
- * scalefactor[0] = 1
- * scalefactor[k] = cos(k*PI/16) * sqrt(2) for k=1..7
- * For integer operation, the multiplier table is to be scaled by
- * IFAST_SCALE_BITS.
- */
- IFAST_MULT_TYPE * ifmtbl = (IFAST_MULT_TYPE *) compptr->dct_table;
-#define CONST_BITS 14
- static const INT16 aanscales[DCTSIZE2] = {
- /* precomputed values scaled up by 14 bits */
- 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520,
- 22725, 31521, 29692, 26722, 22725, 17855, 12299, 6270,
- 21407, 29692, 27969, 25172, 21407, 16819, 11585, 5906,
- 19266, 26722, 25172, 22654, 19266, 15137, 10426, 5315,
- 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520,
- 12873, 17855, 16819, 15137, 12873, 10114, 6967, 3552,
- 8867, 12299, 11585, 10426, 8867, 6967, 4799, 2446,
- 4520, 6270, 5906, 5315, 4520, 3552, 2446, 1247
- };
- SHIFT_TEMPS
-
- for (i = 0; i < DCTSIZE2; i++) {
- ifmtbl[i] = (IFAST_MULT_TYPE)
- DESCALE(MULTIPLY16V16((INT32) qtbl->quantval[i],
- (INT32) aanscales[i]),
- CONST_BITS-IFAST_SCALE_BITS);
- }
- }
- break;
-#endif
-#ifdef DCT_FLOAT_SUPPORTED
- case JDCT_FLOAT:
- {
- /* For float AA&N IDCT method, multipliers are equal to quantization
- * coefficients scaled by scalefactor[row]*scalefactor[col], where
- * scalefactor[0] = 1
- * scalefactor[k] = cos(k*PI/16) * sqrt(2) for k=1..7
- */
- FLOAT_MULT_TYPE * fmtbl = (FLOAT_MULT_TYPE *) compptr->dct_table;
- int row, col;
- static const double aanscalefactor[DCTSIZE] = {
- 1.0, 1.387039845, 1.306562965, 1.175875602,
- 1.0, 0.785694958, 0.541196100, 0.275899379
- };
-
- i = 0;
- for (row = 0; row < DCTSIZE; row++) {
- for (col = 0; col < DCTSIZE; col++) {
- fmtbl[i] = (FLOAT_MULT_TYPE)
- ((double) qtbl->quantval[i] *
- aanscalefactor[row] * aanscalefactor[col]);
- i++;
- }
- }
- }
- break;
-#endif
- default:
- ERREXIT(cinfo, JERR_NOT_COMPILED);
- break;
- }
- }
-}
-
-
-/*
- * Initialize IDCT manager.
- */
-
-GLOBAL(void)
-jinit_inverse_dct (j_decompress_ptr cinfo)
-{
- my_idct_ptr idct;
- int ci;
- jpeg_component_info *compptr;
-
- idct = (my_idct_ptr)
- (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
- SIZEOF(my_idct_controller));
- cinfo->idct = (struct jpeg_inverse_dct *) idct;
- idct->pub.start_pass = start_pass;
-
- for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
- ci++, compptr++) {
- /* Allocate and pre-zero a multiplier table for each component */
- compptr->dct_table =
- (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
- SIZEOF(multiplier_table));
- MEMZERO(compptr->dct_table, SIZEOF(multiplier_table));
- /* Mark multiplier table not yet set up for any method */
- idct->cur_method[ci] = -1;
- }
-}
-
-#endif //_FX_JPEG_TURBO_
+#if !defined(_FX_JPEG_TURBO_)
+/*
+ * jddctmgr.c
+ *
+ * Copyright (C) 1994-1996, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains the inverse-DCT management logic.
+ * This code selects a particular IDCT implementation to be used,
+ * and it performs related housekeeping chores. No code in this file
+ * is executed per IDCT step, only during output pass setup.
+ *
+ * Note that the IDCT routines are responsible for performing coefficient
+ * dequantization as well as the IDCT proper. This module sets up the
+ * dequantization multiplier table needed by the IDCT routine.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+#include "jdct.h" /* Private declarations for DCT subsystem */
+
+
+/*
+ * The decompressor input side (jdinput.c) saves away the appropriate
+ * quantization table for each component at the start of the first scan
+ * involving that component. (This is necessary in order to correctly
+ * decode files that reuse Q-table slots.)
+ * When we are ready to make an output pass, the saved Q-table is converted
+ * to a multiplier table that will actually be used by the IDCT routine.
+ * The multiplier table contents are IDCT-method-dependent. To support
+ * application changes in IDCT method between scans, we can remake the
+ * multiplier tables if necessary.
+ * In buffered-image mode, the first output pass may occur before any data
+ * has been seen for some components, and thus before their Q-tables have
+ * been saved away. To handle this case, multiplier tables are preset
+ * to zeroes; the result of the IDCT will be a neutral gray level.
+ */
+
+
+/* Private subobject for this module */
+
+typedef struct {
+ struct jpeg_inverse_dct pub; /* public fields */
+
+ /* This array contains the IDCT method code that each multiplier table
+ * is currently set up for, or -1 if it's not yet set up.
+ * The actual multiplier tables are pointed to by dct_table in the
+ * per-component comp_info structures.
+ */
+ int cur_method[MAX_COMPONENTS];
+} my_idct_controller;
+
+typedef my_idct_controller * my_idct_ptr;
+
+
+/* Allocated multiplier tables: big enough for any supported variant */
+
+typedef union {
+ ISLOW_MULT_TYPE islow_array[DCTSIZE2];
+#ifdef DCT_IFAST_SUPPORTED
+ IFAST_MULT_TYPE ifast_array[DCTSIZE2];
+#endif
+#ifdef DCT_FLOAT_SUPPORTED
+ FLOAT_MULT_TYPE float_array[DCTSIZE2];
+#endif
+} multiplier_table;
+
+
+/* The current scaled-IDCT routines require ISLOW-style multiplier tables,
+ * so be sure to compile that code if either ISLOW or SCALING is requested.
+ */
+#ifdef DCT_ISLOW_SUPPORTED
+#define PROVIDE_ISLOW_TABLES
+#else
+#ifdef IDCT_SCALING_SUPPORTED
+#define PROVIDE_ISLOW_TABLES
+#endif
+#endif
+
+
+/*
+ * Prepare for an output pass.
+ * Here we select the proper IDCT routine for each component and build
+ * a matching multiplier table.
+ */
+
+METHODDEF(void)
+start_pass (j_decompress_ptr cinfo)
+{
+ my_idct_ptr idct = (my_idct_ptr) cinfo->idct;
+ int ci, i;
+ jpeg_component_info *compptr;
+ int method = 0;
+ inverse_DCT_method_ptr method_ptr = NULL;
+ JQUANT_TBL * qtbl;
+
+ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+ ci++, compptr++) {
+ /* Select the proper IDCT routine for this component's scaling */
+ switch (compptr->DCT_scaled_size) {
+#ifdef IDCT_SCALING_SUPPORTED
+ case 1:
+ method_ptr = jpeg_idct_1x1;
+ method = JDCT_ISLOW; /* jidctred uses islow-style table */
+ break;
+ case 2:
+ method_ptr = jpeg_idct_2x2;
+ method = JDCT_ISLOW; /* jidctred uses islow-style table */
+ break;
+ case 4:
+ method_ptr = jpeg_idct_4x4;
+ method = JDCT_ISLOW; /* jidctred uses islow-style table */
+ break;
+#endif
+ case DCTSIZE:
+ switch (cinfo->dct_method) {
+#ifdef DCT_ISLOW_SUPPORTED
+ case JDCT_ISLOW:
+ method_ptr = jpeg_idct_islow;
+ method = JDCT_ISLOW;
+ break;
+#endif
+#ifdef DCT_IFAST_SUPPORTED
+ case JDCT_IFAST:
+ method_ptr = jpeg_idct_ifast;
+ method = JDCT_IFAST;
+ break;
+#endif
+#ifdef DCT_FLOAT_SUPPORTED
+ case JDCT_FLOAT:
+ method_ptr = jpeg_idct_float;
+ method = JDCT_FLOAT;
+ break;
+#endif
+ default:
+ ERREXIT(cinfo, JERR_NOT_COMPILED);
+ break;
+ }
+ break;
+ default:
+ ERREXIT1(cinfo, JERR_BAD_DCTSIZE, compptr->DCT_scaled_size);
+ break;
+ }
+ idct->pub.inverse_DCT[ci] = method_ptr;
+ /* Create multiplier table from quant table.
+ * However, we can skip this if the component is uninteresting
+ * or if we already built the table. Also, if no quant table
+ * has yet been saved for the component, we leave the
+ * multiplier table all-zero; we'll be reading zeroes from the
+ * coefficient controller's buffer anyway.
+ */
+ if (! compptr->component_needed || idct->cur_method[ci] == method)
+ continue;
+ qtbl = compptr->quant_table;
+ if (qtbl == NULL) /* happens if no data yet for component */
+ continue;
+ idct->cur_method[ci] = method;
+ switch (method) {
+#ifdef PROVIDE_ISLOW_TABLES
+ case JDCT_ISLOW:
+ {
+ /* For LL&M IDCT method, multipliers are equal to raw quantization
+ * coefficients, but are stored as ints to ensure access efficiency.
+ */
+ ISLOW_MULT_TYPE * ismtbl = (ISLOW_MULT_TYPE *) compptr->dct_table;
+ for (i = 0; i < DCTSIZE2; i++) {
+ ismtbl[i] = (ISLOW_MULT_TYPE) qtbl->quantval[i];
+ }
+ }
+ break;
+#endif
+#ifdef DCT_IFAST_SUPPORTED
+ case JDCT_IFAST:
+ {
+ /* For AA&N IDCT method, multipliers are equal to quantization
+ * coefficients scaled by scalefactor[row]*scalefactor[col], where
+ * scalefactor[0] = 1
+ * scalefactor[k] = cos(k*PI/16) * sqrt(2) for k=1..7
+ * For integer operation, the multiplier table is to be scaled by
+ * IFAST_SCALE_BITS.
+ */
+ IFAST_MULT_TYPE * ifmtbl = (IFAST_MULT_TYPE *) compptr->dct_table;
+#define CONST_BITS 14
+ static const INT16 aanscales[DCTSIZE2] = {
+ /* precomputed values scaled up by 14 bits */
+ 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520,
+ 22725, 31521, 29692, 26722, 22725, 17855, 12299, 6270,
+ 21407, 29692, 27969, 25172, 21407, 16819, 11585, 5906,
+ 19266, 26722, 25172, 22654, 19266, 15137, 10426, 5315,
+ 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520,
+ 12873, 17855, 16819, 15137, 12873, 10114, 6967, 3552,
+ 8867, 12299, 11585, 10426, 8867, 6967, 4799, 2446,
+ 4520, 6270, 5906, 5315, 4520, 3552, 2446, 1247
+ };
+ SHIFT_TEMPS
+
+ for (i = 0; i < DCTSIZE2; i++) {
+ ifmtbl[i] = (IFAST_MULT_TYPE)
+ DESCALE(MULTIPLY16V16((INT32) qtbl->quantval[i],
+ (INT32) aanscales[i]),
+ CONST_BITS-IFAST_SCALE_BITS);
+ }
+ }
+ break;
+#endif
+#ifdef DCT_FLOAT_SUPPORTED
+ case JDCT_FLOAT:
+ {
+ /* For float AA&N IDCT method, multipliers are equal to quantization
+ * coefficients scaled by scalefactor[row]*scalefactor[col], where
+ * scalefactor[0] = 1
+ * scalefactor[k] = cos(k*PI/16) * sqrt(2) for k=1..7
+ */
+ FLOAT_MULT_TYPE * fmtbl = (FLOAT_MULT_TYPE *) compptr->dct_table;
+ int row, col;
+ static const double aanscalefactor[DCTSIZE] = {
+ 1.0, 1.387039845, 1.306562965, 1.175875602,
+ 1.0, 0.785694958, 0.541196100, 0.275899379
+ };
+
+ i = 0;
+ for (row = 0; row < DCTSIZE; row++) {
+ for (col = 0; col < DCTSIZE; col++) {
+ fmtbl[i] = (FLOAT_MULT_TYPE)
+ ((double) qtbl->quantval[i] *
+ aanscalefactor[row] * aanscalefactor[col]);
+ i++;
+ }
+ }
+ }
+ break;
+#endif
+ default:
+ ERREXIT(cinfo, JERR_NOT_COMPILED);
+ break;
+ }
+ }
+}
+
+
+/*
+ * Initialize IDCT manager.
+ */
+
+GLOBAL(void)
+jinit_inverse_dct (j_decompress_ptr cinfo)
+{
+ my_idct_ptr idct;
+ int ci;
+ jpeg_component_info *compptr;
+
+ idct = (my_idct_ptr)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ SIZEOF(my_idct_controller));
+ cinfo->idct = (struct jpeg_inverse_dct *) idct;
+ idct->pub.start_pass = start_pass;
+
+ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+ ci++, compptr++) {
+ /* Allocate and pre-zero a multiplier table for each component */
+ compptr->dct_table =
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ SIZEOF(multiplier_table));
+ MEMZERO(compptr->dct_table, SIZEOF(multiplier_table));
+ /* Mark multiplier table not yet set up for any method */
+ idct->cur_method[ci] = -1;
+ }
+}
+
+#endif //_FX_JPEG_TURBO_
diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jdhuff.c b/core/src/fxcodec/libjpeg/fpdfapi_jdhuff.c
index b724d52b95..dc37db58a9 100644
--- a/core/src/fxcodec/libjpeg/fpdfapi_jdhuff.c
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jdhuff.c
@@ -1,657 +1,657 @@
-#if !defined(_FX_JPEG_TURBO_)
-/*
- * jdhuff.c
- *
- * Copyright (C) 1991-1997, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains Huffman entropy decoding routines.
- *
- * Much of the complexity here has to do with supporting input suspension.
- * If the data source module demands suspension, we want to be able to back
- * up to the start of the current MCU. To do this, we copy state variables
- * into local working storage, and update them back to the permanent
- * storage only upon successful completion of an MCU.
- */
-
-#define JPEG_INTERNALS
-#include "jinclude.h"
-#include "jpeglib.h"
-#include "jdhuff.h" /* Declarations shared with jdphuff.c */
-
-#ifdef _FX_MANAGED_CODE_
-#define savable_state savable_state_d
-#endif
-
-/*
- * Expanded entropy decoder object for Huffman decoding.
- *
- * The savable_state subrecord contains fields that change within an MCU,
- * but must not be updated permanently until we complete the MCU.
- */
-
-typedef struct {
- int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */
-} savable_state;
-
-/* This macro is to work around compilers with missing or broken
- * structure assignment. You'll need to fix this code if you have
- * such a compiler and you change MAX_COMPS_IN_SCAN.
- */
-
-#ifndef NO_STRUCT_ASSIGN
-#define ASSIGN_STATE(dest,src) ((dest) = (src))
-#else
-#if MAX_COMPS_IN_SCAN == 4
-#define ASSIGN_STATE(dest,src) \
- ((dest).last_dc_val[0] = (src).last_dc_val[0], \
- (dest).last_dc_val[1] = (src).last_dc_val[1], \
- (dest).last_dc_val[2] = (src).last_dc_val[2], \
- (dest).last_dc_val[3] = (src).last_dc_val[3])
-#endif
-#endif
-
-
-typedef struct {
- struct jpeg_entropy_decoder pub; /* public fields */
-
- /* These fields are loaded into local variables at start of each MCU.
- * In case of suspension, we exit WITHOUT updating them.
- */
- bitread_perm_state bitstate; /* Bit buffer at start of MCU */
- savable_state saved; /* Other state at start of MCU */
-
- /* These fields are NOT loaded into local working state. */
- unsigned int restarts_to_go; /* MCUs left in this restart interval */
-
- /* Pointers to derived tables (these workspaces have image lifespan) */
- d_derived_tbl * dc_derived_tbls[NUM_HUFF_TBLS];
- d_derived_tbl * ac_derived_tbls[NUM_HUFF_TBLS];
-
- /* Precalculated info set up by start_pass for use in decode_mcu: */
-
- /* Pointers to derived tables to be used for each block within an MCU */
- d_derived_tbl * dc_cur_tbls[D_MAX_BLOCKS_IN_MCU];
- d_derived_tbl * ac_cur_tbls[D_MAX_BLOCKS_IN_MCU];
- /* Whether we care about the DC and AC coefficient values for each block */
- boolean dc_needed[D_MAX_BLOCKS_IN_MCU];
- boolean ac_needed[D_MAX_BLOCKS_IN_MCU];
-} huff_entropy_decoder;
-
-typedef huff_entropy_decoder * huff_entropy_ptr;
-
-
-/*
- * Initialize for a Huffman-compressed scan.
- */
-
-METHODDEF(void)
-start_pass_huff_decoder (j_decompress_ptr cinfo)
-{
- huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
- int ci, blkn, dctbl, actbl;
- jpeg_component_info * compptr;
-
- /* Check that the scan parameters Ss, Se, Ah/Al are OK for sequential JPEG.
- * This ought to be an error condition, but we make it a warning because
- * there are some baseline files out there with all zeroes in these bytes.
- */
- if (cinfo->Ss != 0 || cinfo->Se != DCTSIZE2-1 ||
- cinfo->Ah != 0 || cinfo->Al != 0)
- WARNMS(cinfo, JWRN_NOT_SEQUENTIAL);
-
- for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
- compptr = cinfo->cur_comp_info[ci];
- dctbl = compptr->dc_tbl_no;
- actbl = compptr->ac_tbl_no;
- /* Compute derived values for Huffman tables */
- /* We may do this more than once for a table, but it's not expensive */
- jpeg_make_d_derived_tbl(cinfo, TRUE, dctbl,
- & entropy->dc_derived_tbls[dctbl]);
- jpeg_make_d_derived_tbl(cinfo, FALSE, actbl,
- & entropy->ac_derived_tbls[actbl]);
- /* Initialize DC predictions to 0 */
- entropy->saved.last_dc_val[ci] = 0;
- }
-
- /* Precalculate decoding info for each block in an MCU of this scan */
- for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
- ci = cinfo->MCU_membership[blkn];
- compptr = cinfo->cur_comp_info[ci];
- /* Precalculate which table to use for each block */
- entropy->dc_cur_tbls[blkn] = entropy->dc_derived_tbls[compptr->dc_tbl_no];
- entropy->ac_cur_tbls[blkn] = entropy->ac_derived_tbls[compptr->ac_tbl_no];
- /* Decide whether we really care about the coefficient values */
- if (compptr->component_needed) {
- entropy->dc_needed[blkn] = TRUE;
- /* we don't need the ACs if producing a 1/8th-size image */
- entropy->ac_needed[blkn] = (compptr->DCT_scaled_size > 1);
- } else {
- entropy->dc_needed[blkn] = entropy->ac_needed[blkn] = FALSE;
- }
- }
-
- /* Initialize bitread state variables */
- entropy->bitstate.bits_left = 0;
- entropy->bitstate.get_buffer = 0; /* unnecessary, but keeps Purify quiet */
- entropy->pub.insufficient_data = FALSE;
-
- /* Initialize restart counter */
- entropy->restarts_to_go = cinfo->restart_interval;
-}
-
-
-/*
- * Compute the derived values for a Huffman table.
- * This routine also performs some validation checks on the table.
- *
- * Note this is also used by jdphuff.c.
- */
-
-GLOBAL(void)
-jpeg_make_d_derived_tbl (j_decompress_ptr cinfo, boolean isDC, int tblno,
- d_derived_tbl ** pdtbl)
-{
- JHUFF_TBL *htbl;
- d_derived_tbl *dtbl;
- int p, i, l, _si, numsymbols;
- int lookbits, ctr;
- char huffsize[257];
- unsigned int huffcode[257];
- unsigned int code;
-
- /* Note that huffsize[] and huffcode[] are filled in code-length order,
- * paralleling the order of the symbols themselves in htbl->huffval[].
- */
-
- /* Find the input Huffman table */
- if (tblno < 0 || tblno >= NUM_HUFF_TBLS)
- ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tblno);
- htbl =
- isDC ? cinfo->dc_huff_tbl_ptrs[tblno] : cinfo->ac_huff_tbl_ptrs[tblno];
- if (htbl == NULL)
- ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tblno);
-
- /* Allocate a workspace if we haven't already done so. */
- if (*pdtbl == NULL)
- *pdtbl = (d_derived_tbl *)
- (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
- SIZEOF(d_derived_tbl));
- dtbl = *pdtbl;
- dtbl->pub = htbl; /* fill in back link */
-
- /* Figure C.1: make table of Huffman code length for each symbol */
-
- p = 0;
- for (l = 1; l <= 16; l++) {
- i = (int) htbl->bits[l];
- if (i < 0 || p + i > 256) /* protect against table overrun */
- ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
- while (i--)
- huffsize[p++] = (char) l;
- }
- huffsize[p] = 0;
- numsymbols = p;
-
- /* Figure C.2: generate the codes themselves */
- /* We also validate that the counts represent a legal Huffman code tree. */
-
- code = 0;
- _si = huffsize[0];
- p = 0;
- while (huffsize[p]) {
- while (((int) huffsize[p]) == _si) {
- huffcode[p++] = code;
- code++;
- }
- /* code is now 1 more than the last code used for codelength si; but
- * it must still fit in si bits, since no code is allowed to be all ones.
- */
- if (((INT32) code) >= (((INT32) 1) << _si))
- ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
- code <<= 1;
- _si++;
- }
-
- /* Figure F.15: generate decoding tables for bit-sequential decoding */
-
- p = 0;
- for (l = 1; l <= 16; l++) {
- if (htbl->bits[l]) {
- /* valoffset[l] = huffval[] index of 1st symbol of code length l,
- * minus the minimum code of length l
- */
- dtbl->valoffset[l] = (INT32) p - (INT32) huffcode[p];
- p += htbl->bits[l];
- dtbl->maxcode[l] = huffcode[p-1]; /* maximum code of length l */
- } else {
- dtbl->maxcode[l] = -1; /* -1 if no codes of this length */
- }
- }
- dtbl->maxcode[17] = 0xFFFFFL; /* ensures jpeg_huff_decode terminates */
-
- /* Compute lookahead tables to speed up decoding.
- * First we set all the table entries to 0, indicating "too long";
- * then we iterate through the Huffman codes that are short enough and
- * fill in all the entries that correspond to bit sequences starting
- * with that code.
- */
-
- MEMZERO(dtbl->look_nbits, SIZEOF(dtbl->look_nbits));
-
- p = 0;
- for (l = 1; l <= HUFF_LOOKAHEAD; l++) {
- for (i = 1; i <= (int) htbl->bits[l]; i++, p++) {
- /* l = current code's length, p = its index in huffcode[] & huffval[]. */
- /* Generate left-justified code followed by all possible bit sequences */
- lookbits = huffcode[p] << (HUFF_LOOKAHEAD-l);
- for (ctr = 1 << (HUFF_LOOKAHEAD-l); ctr > 0; ctr--) {
- dtbl->look_nbits[lookbits] = l;
- dtbl->look_sym[lookbits] = htbl->huffval[p];
- lookbits++;
- }
- }
- }
-
- /* Validate symbols as being reasonable.
- * For AC tables, we make no check, but accept all byte values 0..255.
- * For DC tables, we require the symbols to be in range 0..15.
- * (Tighter bounds could be applied depending on the data depth and mode,
- * but this is sufficient to ensure safe decoding.)
- */
- if (isDC) {
- for (i = 0; i < numsymbols; i++) {
- int sym = htbl->huffval[i];
- if (sym < 0 || sym > 15)
- ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
- }
- }
-}
-
-
-/*
- * Out-of-line code for bit fetching (shared with jdphuff.c).
- * See jdhuff.h for info about usage.
- * Note: current values of get_buffer and bits_left are passed as parameters,
- * but are returned in the corresponding fields of the state struct.
- *
- * On most machines MIN_GET_BITS should be 25 to allow the full 32-bit width
- * of get_buffer to be used. (On machines with wider words, an even larger
- * buffer could be used.) However, on some machines 32-bit shifts are
- * quite slow and take time proportional to the number of places shifted.
- * (This is true with most PC compilers, for instance.) In this case it may
- * be a win to set MIN_GET_BITS to the minimum value of 15. This reduces the
- * average shift distance at the cost of more calls to jpeg_fill_bit_buffer.
- */
-
-#ifdef SLOW_SHIFT_32
-#define MIN_GET_BITS 15 /* minimum allowable value */
-#else
-#define MIN_GET_BITS (BIT_BUF_SIZE-7)
-#endif
-
-
-GLOBAL(boolean)
-jpeg_fill_bit_buffer (bitread_working_state * state,
- register bit_buf_type get_buffer, register int bits_left,
- int nbits)
-/* Load up the bit buffer to a depth of at least nbits */
-{
- /* Copy heavily used state fields into locals (hopefully registers) */
- register const JOCTET * next_input_byte = state->next_input_byte;
- register size_t bytes_in_buffer = state->bytes_in_buffer;
- j_decompress_ptr cinfo = state->cinfo;
-
- /* Attempt to load at least MIN_GET_BITS bits into get_buffer. */
- /* (It is assumed that no request will be for more than that many bits.) */
- /* We fail to do so only if we hit a marker or are forced to suspend. */
-
- if (cinfo->unread_marker == 0) { /* cannot advance past a marker */
- while (bits_left < MIN_GET_BITS) {
- register int c;
-
- /* Attempt to read a byte */
- if (bytes_in_buffer == 0) {
- if (! (*cinfo->src->fill_input_buffer) (cinfo))
- return FALSE;
- next_input_byte = cinfo->src->next_input_byte;
- bytes_in_buffer = cinfo->src->bytes_in_buffer;
- }
- bytes_in_buffer--;
- c = GETJOCTET(*next_input_byte++);
-
- /* If it's 0xFF, check and discard stuffed zero byte */
- if (c == 0xFF) {
- /* Loop here to discard any padding FF's on terminating marker,
- * so that we can save a valid unread_marker value. NOTE: we will
- * accept multiple FF's followed by a 0 as meaning a single FF data
- * byte. This data pattern is not valid according to the standard.
- */
- do {
- if (bytes_in_buffer == 0) {
- if (! (*cinfo->src->fill_input_buffer) (cinfo))
- return FALSE;
- next_input_byte = cinfo->src->next_input_byte;
- bytes_in_buffer = cinfo->src->bytes_in_buffer;
- }
- bytes_in_buffer--;
- c = GETJOCTET(*next_input_byte++);
- } while (c == 0xFF);
-
- if (c == 0) {
- /* Found FF/00, which represents an FF data byte */
- c = 0xFF;
- } else {
- /* Oops, it's actually a marker indicating end of compressed data.
- * Save the marker code for later use.
- * Fine point: it might appear that we should save the marker into
- * bitread working state, not straight into permanent state. But
- * once we have hit a marker, we cannot need to suspend within the
- * current MCU, because we will read no more bytes from the data
- * source. So it is OK to update permanent state right away.
- */
- cinfo->unread_marker = c;
- /* See if we need to insert some fake zero bits. */
- goto no_more_bytes;
- }
- }
-
- /* OK, load c into get_buffer */
- get_buffer = (get_buffer << 8) | c;
- bits_left += 8;
- } /* end while */
- } else {
- no_more_bytes:
- /* We get here if we've read the marker that terminates the compressed
- * data segment. There should be enough bits in the buffer register
- * to satisfy the request; if so, no problem.
- */
- if (nbits > bits_left) {
- /* Uh-oh. Report corrupted data to user and stuff zeroes into
- * the data stream, so that we can produce some kind of image.
- * We use a nonvolatile flag to ensure that only one warning message
- * appears per data segment.
- */
- if (! cinfo->entropy->insufficient_data) {
- WARNMS(cinfo, JWRN_HIT_MARKER);
- cinfo->entropy->insufficient_data = TRUE;
- }
- /* Fill the buffer with zero bits */
- get_buffer <<= MIN_GET_BITS - bits_left;
- bits_left = MIN_GET_BITS;
- }
- }
-
- /* Unload the local registers */
- state->next_input_byte = next_input_byte;
- state->bytes_in_buffer = bytes_in_buffer;
- state->get_buffer = get_buffer;
- state->bits_left = bits_left;
-
- return TRUE;
-}
-
-
-/*
- * Out-of-line code for Huffman code decoding.
- * See jdhuff.h for info about usage.
- */
-
-GLOBAL(int)
-jpeg_huff_decode (bitread_working_state * state,
- register bit_buf_type get_buffer, register int bits_left,
- d_derived_tbl * htbl, int min_bits)
-{
- register int l = min_bits;
- register INT32 code;
-
- /* HUFF_DECODE has determined that the code is at least min_bits */
- /* bits long, so fetch that many bits in one swoop. */
-
- CHECK_BIT_BUFFER(*state, l, return -1);
- code = GET_BITS(l);
-
- /* Collect the rest of the Huffman code one bit at a time. */
- /* This is per Figure F.16 in the JPEG spec. */
-
- while (code > htbl->maxcode[l]) {
- code <<= 1;
- CHECK_BIT_BUFFER(*state, 1, return -1);
- code |= GET_BITS(1);
- l++;
- }
-
- /* Unload the local registers */
- state->get_buffer = get_buffer;
- state->bits_left = bits_left;
-
- /* With garbage input we may reach the sentinel value l = 17. */
-
- if (l > 16) {
- WARNMS(state->cinfo, JWRN_HUFF_BAD_CODE);
- return 0; /* fake a zero as the safest result */
- }
-
- return htbl->pub->huffval[ (int) (code + htbl->valoffset[l]) ];
-}
-
-
-/*
- * Figure F.12: extend sign bit.
- * On some machines, a shift and add will be faster than a table lookup.
- */
-
-#ifdef AVOID_TABLES
-
-#define HUFF_EXTEND(x,s) ((x) < (1<<((s)-1)) ? (x) + (((-1)<<(s)) + 1) : (x))
-
-#else
-
-#define HUFF_EXTEND(x,s) ((x) < extend_test[s] ? (x) + extend_offset[s] : (x))
-
-static const int extend_test[16] = /* entry n is 2**(n-1) */
- { 0, 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080,
- 0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000 };
-
-static const int extend_offset[16] = /* entry n is (-1 << n) + 1 */
- { 0, ((-1)<<1) + 1, ((-1)<<2) + 1, ((-1)<<3) + 1, ((-1)<<4) + 1,
- ((-1)<<5) + 1, ((-1)<<6) + 1, ((-1)<<7) + 1, ((-1)<<8) + 1,
- ((-1)<<9) + 1, ((-1)<<10) + 1, ((-1)<<11) + 1, ((-1)<<12) + 1,
- ((-1)<<13) + 1, ((-1)<<14) + 1, ((-1)<<15) + 1 };
-
-#endif /* AVOID_TABLES */
-
-
-/*
- * Check for a restart marker & resynchronize decoder.
- * Returns FALSE if must suspend.
- */
-
-LOCAL(boolean)
-process_restart (j_decompress_ptr cinfo)
-{
- huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
- int ci;
-
- /* Throw away any unused bits remaining in bit buffer; */
- /* include any full bytes in next_marker's count of discarded bytes */
- cinfo->marker->discarded_bytes += entropy->bitstate.bits_left / 8;
- entropy->bitstate.bits_left = 0;
-
- /* Advance past the RSTn marker */
- if (! (*cinfo->marker->read_restart_marker) (cinfo))
- return FALSE;
-
- /* Re-initialize DC predictions to 0 */
- for (ci = 0; ci < cinfo->comps_in_scan; ci++)
- entropy->saved.last_dc_val[ci] = 0;
-
- /* Reset restart counter */
- entropy->restarts_to_go = cinfo->restart_interval;
-
- /* Reset out-of-data flag, unless read_restart_marker left us smack up
- * against a marker. In that case we will end up treating the next data
- * segment as empty, and we can avoid producing bogus output pixels by
- * leaving the flag set.
- */
- if (cinfo->unread_marker == 0)
- entropy->pub.insufficient_data = FALSE;
-
- return TRUE;
-}
-
-
-/*
- * Decode and return one MCU's worth of Huffman-compressed coefficients.
- * The coefficients are reordered from zigzag order into natural array order,
- * but are not dequantized.
- *
- * The i'th block of the MCU is stored into the block pointed to by
- * MCU_data[i]. WE ASSUME THIS AREA HAS BEEN ZEROED BY THE CALLER.
- * (Wholesale zeroing is usually a little faster than retail...)
- *
- * Returns FALSE if data source requested suspension. In that case no
- * changes have been made to permanent state. (Exception: some output
- * coefficients may already have been assigned. This is harmless for
- * this module, since we'll just re-assign them on the next call.)
- */
-
-METHODDEF(boolean)
-decode_mcu (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
-{
- huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
- int blkn;
- BITREAD_STATE_VARS;
- savable_state state;
-
- /* Process restart marker if needed; may have to suspend */
- if (cinfo->restart_interval) {
- if (entropy->restarts_to_go == 0)
- if (! process_restart(cinfo))
- return FALSE;
- }
-
- /* If we've run out of data, just leave the MCU set to zeroes.
- * This way, we return uniform gray for the remainder of the segment.
- */
- if (! entropy->pub.insufficient_data) {
-
- /* Load up working state */
- BITREAD_LOAD_STATE(cinfo,entropy->bitstate);
- ASSIGN_STATE(state, entropy->saved);
-
- /* Outer loop handles each block in the MCU */
-
- for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
- JBLOCKROW block = MCU_data[blkn];
- d_derived_tbl * dctbl = entropy->dc_cur_tbls[blkn];
- d_derived_tbl * actbl = entropy->ac_cur_tbls[blkn];
- register int s, k, r;
-
- /* Decode a single block's worth of coefficients */
-
- /* Section F.2.2.1: decode the DC coefficient difference */
- HUFF_DECODE(s, br_state, dctbl, return FALSE, label1);
- if (s) {
- CHECK_BIT_BUFFER(br_state, s, return FALSE);
- r = GET_BITS(s);
- s = HUFF_EXTEND(r, s);
- }
-
- if (entropy->dc_needed[blkn]) {
- /* Convert DC difference to actual value, update last_dc_val */
- int ci = cinfo->MCU_membership[blkn];
- s += state.last_dc_val[ci];
- state.last_dc_val[ci] = s;
- /* Output the DC coefficient (assumes jpeg_natural_order[0] = 0) */
- (*block)[0] = (JCOEF) s;
- }
-
- if (entropy->ac_needed[blkn]) {
-
- /* Section F.2.2.2: decode the AC coefficients */
- /* Since zeroes are skipped, output area must be cleared beforehand */
- for (k = 1; k < DCTSIZE2; k++) {
- HUFF_DECODE(s, br_state, actbl, return FALSE, label2);
-
- r = s >> 4;
- s &= 15;
-
- if (s) {
- k += r;
- CHECK_BIT_BUFFER(br_state, s, return FALSE);
- r = GET_BITS(s);
- s = HUFF_EXTEND(r, s);
- /* Output coefficient in natural (dezigzagged) order.
- * Note: the extra entries in jpeg_natural_order[] will save us
- * if k >= DCTSIZE2, which could happen if the data is corrupted.
- */
- (*block)[jpeg_natural_order[k]] = (JCOEF) s;
- } else {
- if (r != 15)
- break;
- k += 15;
- }
- }
-
- } else {
-
- /* Section F.2.2.2: decode the AC coefficients */
- /* In this path we just discard the values */
- for (k = 1; k < DCTSIZE2; k++) {
- HUFF_DECODE(s, br_state, actbl, return FALSE, label3);
-
- r = s >> 4;
- s &= 15;
-
- if (s) {
- k += r;
- CHECK_BIT_BUFFER(br_state, s, return FALSE);
- DROP_BITS(s);
- } else {
- if (r != 15)
- break;
- k += 15;
- }
- }
-
- }
- }
-
- /* Completed MCU, so update state */
- BITREAD_SAVE_STATE(cinfo,entropy->bitstate);
- ASSIGN_STATE(entropy->saved, state);
- }
-
- /* Account for restart interval (no-op if not using restarts) */
- entropy->restarts_to_go--;
-
- return TRUE;
-}
-
-
-/*
- * Module initialization routine for Huffman entropy decoding.
- */
-
-GLOBAL(void)
-jinit_huff_decoder (j_decompress_ptr cinfo)
-{
- huff_entropy_ptr entropy;
- int i;
-
- entropy = (huff_entropy_ptr)
- (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
- SIZEOF(huff_entropy_decoder));
- cinfo->entropy = (struct jpeg_entropy_decoder *) entropy;
- entropy->pub.start_pass = start_pass_huff_decoder;
- entropy->pub.decode_mcu = decode_mcu;
-
- /* Mark tables unallocated */
- for (i = 0; i < NUM_HUFF_TBLS; i++) {
- entropy->dc_derived_tbls[i] = entropy->ac_derived_tbls[i] = NULL;
- }
-}
-
-#endif //_FX_JPEG_TURBO_
+#if !defined(_FX_JPEG_TURBO_)
+/*
+ * jdhuff.c
+ *
+ * Copyright (C) 1991-1997, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains Huffman entropy decoding routines.
+ *
+ * Much of the complexity here has to do with supporting input suspension.
+ * If the data source module demands suspension, we want to be able to back
+ * up to the start of the current MCU. To do this, we copy state variables
+ * into local working storage, and update them back to the permanent
+ * storage only upon successful completion of an MCU.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+#include "jdhuff.h" /* Declarations shared with jdphuff.c */
+
+#ifdef _FX_MANAGED_CODE_
+#define savable_state savable_state_d
+#endif
+
+/*
+ * Expanded entropy decoder object for Huffman decoding.
+ *
+ * The savable_state subrecord contains fields that change within an MCU,
+ * but must not be updated permanently until we complete the MCU.
+ */
+
+typedef struct {
+ int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */
+} savable_state;
+
+/* This macro is to work around compilers with missing or broken
+ * structure assignment. You'll need to fix this code if you have
+ * such a compiler and you change MAX_COMPS_IN_SCAN.
+ */
+
+#ifndef NO_STRUCT_ASSIGN
+#define ASSIGN_STATE(dest,src) ((dest) = (src))
+#else
+#if MAX_COMPS_IN_SCAN == 4
+#define ASSIGN_STATE(dest,src) \
+ ((dest).last_dc_val[0] = (src).last_dc_val[0], \
+ (dest).last_dc_val[1] = (src).last_dc_val[1], \
+ (dest).last_dc_val[2] = (src).last_dc_val[2], \
+ (dest).last_dc_val[3] = (src).last_dc_val[3])
+#endif
+#endif
+
+
+typedef struct {
+ struct jpeg_entropy_decoder pub; /* public fields */
+
+ /* These fields are loaded into local variables at start of each MCU.
+ * In case of suspension, we exit WITHOUT updating them.
+ */
+ bitread_perm_state bitstate; /* Bit buffer at start of MCU */
+ savable_state saved; /* Other state at start of MCU */
+
+ /* These fields are NOT loaded into local working state. */
+ unsigned int restarts_to_go; /* MCUs left in this restart interval */
+
+ /* Pointers to derived tables (these workspaces have image lifespan) */
+ d_derived_tbl * dc_derived_tbls[NUM_HUFF_TBLS];
+ d_derived_tbl * ac_derived_tbls[NUM_HUFF_TBLS];
+
+ /* Precalculated info set up by start_pass for use in decode_mcu: */
+
+ /* Pointers to derived tables to be used for each block within an MCU */
+ d_derived_tbl * dc_cur_tbls[D_MAX_BLOCKS_IN_MCU];
+ d_derived_tbl * ac_cur_tbls[D_MAX_BLOCKS_IN_MCU];
+ /* Whether we care about the DC and AC coefficient values for each block */
+ boolean dc_needed[D_MAX_BLOCKS_IN_MCU];
+ boolean ac_needed[D_MAX_BLOCKS_IN_MCU];
+} huff_entropy_decoder;
+
+typedef huff_entropy_decoder * huff_entropy_ptr;
+
+
+/*
+ * Initialize for a Huffman-compressed scan.
+ */
+
+METHODDEF(void)
+start_pass_huff_decoder (j_decompress_ptr cinfo)
+{
+ huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
+ int ci, blkn, dctbl, actbl;
+ jpeg_component_info * compptr;
+
+ /* Check that the scan parameters Ss, Se, Ah/Al are OK for sequential JPEG.
+ * This ought to be an error condition, but we make it a warning because
+ * there are some baseline files out there with all zeroes in these bytes.
+ */
+ if (cinfo->Ss != 0 || cinfo->Se != DCTSIZE2-1 ||
+ cinfo->Ah != 0 || cinfo->Al != 0)
+ WARNMS(cinfo, JWRN_NOT_SEQUENTIAL);
+
+ for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
+ compptr = cinfo->cur_comp_info[ci];
+ dctbl = compptr->dc_tbl_no;
+ actbl = compptr->ac_tbl_no;
+ /* Compute derived values for Huffman tables */
+ /* We may do this more than once for a table, but it's not expensive */
+ jpeg_make_d_derived_tbl(cinfo, TRUE, dctbl,
+ & entropy->dc_derived_tbls[dctbl]);
+ jpeg_make_d_derived_tbl(cinfo, FALSE, actbl,
+ & entropy->ac_derived_tbls[actbl]);
+ /* Initialize DC predictions to 0 */
+ entropy->saved.last_dc_val[ci] = 0;
+ }
+
+ /* Precalculate decoding info for each block in an MCU of this scan */
+ for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
+ ci = cinfo->MCU_membership[blkn];
+ compptr = cinfo->cur_comp_info[ci];
+ /* Precalculate which table to use for each block */
+ entropy->dc_cur_tbls[blkn] = entropy->dc_derived_tbls[compptr->dc_tbl_no];
+ entropy->ac_cur_tbls[blkn] = entropy->ac_derived_tbls[compptr->ac_tbl_no];
+ /* Decide whether we really care about the coefficient values */
+ if (compptr->component_needed) {
+ entropy->dc_needed[blkn] = TRUE;
+ /* we don't need the ACs if producing a 1/8th-size image */
+ entropy->ac_needed[blkn] = (compptr->DCT_scaled_size > 1);
+ } else {
+ entropy->dc_needed[blkn] = entropy->ac_needed[blkn] = FALSE;
+ }
+ }
+
+ /* Initialize bitread state variables */
+ entropy->bitstate.bits_left = 0;
+ entropy->bitstate.get_buffer = 0; /* unnecessary, but keeps Purify quiet */
+ entropy->pub.insufficient_data = FALSE;
+
+ /* Initialize restart counter */
+ entropy->restarts_to_go = cinfo->restart_interval;
+}
+
+
+/*
+ * Compute the derived values for a Huffman table.
+ * This routine also performs some validation checks on the table.
+ *
+ * Note this is also used by jdphuff.c.
+ */
+
+GLOBAL(void)
+jpeg_make_d_derived_tbl (j_decompress_ptr cinfo, boolean isDC, int tblno,
+ d_derived_tbl ** pdtbl)
+{
+ JHUFF_TBL *htbl;
+ d_derived_tbl *dtbl;
+ int p, i, l, _si, numsymbols;
+ int lookbits, ctr;
+ char huffsize[257];
+ unsigned int huffcode[257];
+ unsigned int code;
+
+ /* Note that huffsize[] and huffcode[] are filled in code-length order,
+ * paralleling the order of the symbols themselves in htbl->huffval[].
+ */
+
+ /* Find the input Huffman table */
+ if (tblno < 0 || tblno >= NUM_HUFF_TBLS)
+ ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tblno);
+ htbl =
+ isDC ? cinfo->dc_huff_tbl_ptrs[tblno] : cinfo->ac_huff_tbl_ptrs[tblno];
+ if (htbl == NULL)
+ ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tblno);
+
+ /* Allocate a workspace if we haven't already done so. */
+ if (*pdtbl == NULL)
+ *pdtbl = (d_derived_tbl *)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ SIZEOF(d_derived_tbl));
+ dtbl = *pdtbl;
+ dtbl->pub = htbl; /* fill in back link */
+
+ /* Figure C.1: make table of Huffman code length for each symbol */
+
+ p = 0;
+ for (l = 1; l <= 16; l++) {
+ i = (int) htbl->bits[l];
+ if (i < 0 || p + i > 256) /* protect against table overrun */
+ ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
+ while (i--)
+ huffsize[p++] = (char) l;
+ }
+ huffsize[p] = 0;
+ numsymbols = p;
+
+ /* Figure C.2: generate the codes themselves */
+ /* We also validate that the counts represent a legal Huffman code tree. */
+
+ code = 0;
+ _si = huffsize[0];
+ p = 0;
+ while (huffsize[p]) {
+ while (((int) huffsize[p]) == _si) {
+ huffcode[p++] = code;
+ code++;
+ }
+ /* code is now 1 more than the last code used for codelength si; but
+ * it must still fit in si bits, since no code is allowed to be all ones.
+ */
+ if (((INT32) code) >= (((INT32) 1) << _si))
+ ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
+ code <<= 1;
+ _si++;
+ }
+
+ /* Figure F.15: generate decoding tables for bit-sequential decoding */
+
+ p = 0;
+ for (l = 1; l <= 16; l++) {
+ if (htbl->bits[l]) {
+ /* valoffset[l] = huffval[] index of 1st symbol of code length l,
+ * minus the minimum code of length l
+ */
+ dtbl->valoffset[l] = (INT32) p - (INT32) huffcode[p];
+ p += htbl->bits[l];
+ dtbl->maxcode[l] = huffcode[p-1]; /* maximum code of length l */
+ } else {
+ dtbl->maxcode[l] = -1; /* -1 if no codes of this length */
+ }
+ }
+ dtbl->maxcode[17] = 0xFFFFFL; /* ensures jpeg_huff_decode terminates */
+
+ /* Compute lookahead tables to speed up decoding.
+ * First we set all the table entries to 0, indicating "too long";
+ * then we iterate through the Huffman codes that are short enough and
+ * fill in all the entries that correspond to bit sequences starting
+ * with that code.
+ */
+
+ MEMZERO(dtbl->look_nbits, SIZEOF(dtbl->look_nbits));
+
+ p = 0;
+ for (l = 1; l <= HUFF_LOOKAHEAD; l++) {
+ for (i = 1; i <= (int) htbl->bits[l]; i++, p++) {
+ /* l = current code's length, p = its index in huffcode[] & huffval[]. */
+ /* Generate left-justified code followed by all possible bit sequences */
+ lookbits = huffcode[p] << (HUFF_LOOKAHEAD-l);
+ for (ctr = 1 << (HUFF_LOOKAHEAD-l); ctr > 0; ctr--) {
+ dtbl->look_nbits[lookbits] = l;
+ dtbl->look_sym[lookbits] = htbl->huffval[p];
+ lookbits++;
+ }
+ }
+ }
+
+ /* Validate symbols as being reasonable.
+ * For AC tables, we make no check, but accept all byte values 0..255.
+ * For DC tables, we require the symbols to be in range 0..15.
+ * (Tighter bounds could be applied depending on the data depth and mode,
+ * but this is sufficient to ensure safe decoding.)
+ */
+ if (isDC) {
+ for (i = 0; i < numsymbols; i++) {
+ int sym = htbl->huffval[i];
+ if (sym < 0 || sym > 15)
+ ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
+ }
+ }
+}
+
+
+/*
+ * Out-of-line code for bit fetching (shared with jdphuff.c).
+ * See jdhuff.h for info about usage.
+ * Note: current values of get_buffer and bits_left are passed as parameters,
+ * but are returned in the corresponding fields of the state struct.
+ *
+ * On most machines MIN_GET_BITS should be 25 to allow the full 32-bit width
+ * of get_buffer to be used. (On machines with wider words, an even larger
+ * buffer could be used.) However, on some machines 32-bit shifts are
+ * quite slow and take time proportional to the number of places shifted.
+ * (This is true with most PC compilers, for instance.) In this case it may
+ * be a win to set MIN_GET_BITS to the minimum value of 15. This reduces the
+ * average shift distance at the cost of more calls to jpeg_fill_bit_buffer.
+ */
+
+#ifdef SLOW_SHIFT_32
+#define MIN_GET_BITS 15 /* minimum allowable value */
+#else
+#define MIN_GET_BITS (BIT_BUF_SIZE-7)
+#endif
+
+
+GLOBAL(boolean)
+jpeg_fill_bit_buffer (bitread_working_state * state,
+ register bit_buf_type get_buffer, register int bits_left,
+ int nbits)
+/* Load up the bit buffer to a depth of at least nbits */
+{
+ /* Copy heavily used state fields into locals (hopefully registers) */
+ register const JOCTET * next_input_byte = state->next_input_byte;
+ register size_t bytes_in_buffer = state->bytes_in_buffer;
+ j_decompress_ptr cinfo = state->cinfo;
+
+ /* Attempt to load at least MIN_GET_BITS bits into get_buffer. */
+ /* (It is assumed that no request will be for more than that many bits.) */
+ /* We fail to do so only if we hit a marker or are forced to suspend. */
+
+ if (cinfo->unread_marker == 0) { /* cannot advance past a marker */
+ while (bits_left < MIN_GET_BITS) {
+ register int c;
+
+ /* Attempt to read a byte */
+ if (bytes_in_buffer == 0) {
+ if (! (*cinfo->src->fill_input_buffer) (cinfo))
+ return FALSE;
+ next_input_byte = cinfo->src->next_input_byte;
+ bytes_in_buffer = cinfo->src->bytes_in_buffer;
+ }
+ bytes_in_buffer--;
+ c = GETJOCTET(*next_input_byte++);
+
+ /* If it's 0xFF, check and discard stuffed zero byte */
+ if (c == 0xFF) {
+ /* Loop here to discard any padding FF's on terminating marker,
+ * so that we can save a valid unread_marker value. NOTE: we will
+ * accept multiple FF's followed by a 0 as meaning a single FF data
+ * byte. This data pattern is not valid according to the standard.
+ */
+ do {
+ if (bytes_in_buffer == 0) {
+ if (! (*cinfo->src->fill_input_buffer) (cinfo))
+ return FALSE;
+ next_input_byte = cinfo->src->next_input_byte;
+ bytes_in_buffer = cinfo->src->bytes_in_buffer;
+ }
+ bytes_in_buffer--;
+ c = GETJOCTET(*next_input_byte++);
+ } while (c == 0xFF);
+
+ if (c == 0) {
+ /* Found FF/00, which represents an FF data byte */
+ c = 0xFF;
+ } else {
+ /* Oops, it's actually a marker indicating end of compressed data.
+ * Save the marker code for later use.
+ * Fine point: it might appear that we should save the marker into
+ * bitread working state, not straight into permanent state. But
+ * once we have hit a marker, we cannot need to suspend within the
+ * current MCU, because we will read no more bytes from the data
+ * source. So it is OK to update permanent state right away.
+ */
+ cinfo->unread_marker = c;
+ /* See if we need to insert some fake zero bits. */
+ goto no_more_bytes;
+ }
+ }
+
+ /* OK, load c into get_buffer */
+ get_buffer = (get_buffer << 8) | c;
+ bits_left += 8;
+ } /* end while */
+ } else {
+ no_more_bytes:
+ /* We get here if we've read the marker that terminates the compressed
+ * data segment. There should be enough bits in the buffer register
+ * to satisfy the request; if so, no problem.
+ */
+ if (nbits > bits_left) {
+ /* Uh-oh. Report corrupted data to user and stuff zeroes into
+ * the data stream, so that we can produce some kind of image.
+ * We use a nonvolatile flag to ensure that only one warning message
+ * appears per data segment.
+ */
+ if (! cinfo->entropy->insufficient_data) {
+ WARNMS(cinfo, JWRN_HIT_MARKER);
+ cinfo->entropy->insufficient_data = TRUE;
+ }
+ /* Fill the buffer with zero bits */
+ get_buffer <<= MIN_GET_BITS - bits_left;
+ bits_left = MIN_GET_BITS;
+ }
+ }
+
+ /* Unload the local registers */
+ state->next_input_byte = next_input_byte;
+ state->bytes_in_buffer = bytes_in_buffer;
+ state->get_buffer = get_buffer;
+ state->bits_left = bits_left;
+
+ return TRUE;
+}
+
+
+/*
+ * Out-of-line code for Huffman code decoding.
+ * See jdhuff.h for info about usage.
+ */
+
+GLOBAL(int)
+jpeg_huff_decode (bitread_working_state * state,
+ register bit_buf_type get_buffer, register int bits_left,
+ d_derived_tbl * htbl, int min_bits)
+{
+ register int l = min_bits;
+ register INT32 code;
+
+ /* HUFF_DECODE has determined that the code is at least min_bits */
+ /* bits long, so fetch that many bits in one swoop. */
+
+ CHECK_BIT_BUFFER(*state, l, return -1);
+ code = GET_BITS(l);
+
+ /* Collect the rest of the Huffman code one bit at a time. */
+ /* This is per Figure F.16 in the JPEG spec. */
+
+ while (code > htbl->maxcode[l]) {
+ code <<= 1;
+ CHECK_BIT_BUFFER(*state, 1, return -1);
+ code |= GET_BITS(1);
+ l++;
+ }
+
+ /* Unload the local registers */
+ state->get_buffer = get_buffer;
+ state->bits_left = bits_left;
+
+ /* With garbage input we may reach the sentinel value l = 17. */
+
+ if (l > 16) {
+ WARNMS(state->cinfo, JWRN_HUFF_BAD_CODE);
+ return 0; /* fake a zero as the safest result */
+ }
+
+ return htbl->pub->huffval[ (int) (code + htbl->valoffset[l]) ];
+}
+
+
+/*
+ * Figure F.12: extend sign bit.
+ * On some machines, a shift and add will be faster than a table lookup.
+ */
+
+#ifdef AVOID_TABLES
+
+#define HUFF_EXTEND(x,s) ((x) < (1<<((s)-1)) ? (x) + (((-1)<<(s)) + 1) : (x))
+
+#else
+
+#define HUFF_EXTEND(x,s) ((x) < extend_test[s] ? (x) + extend_offset[s] : (x))
+
+static const int extend_test[16] = /* entry n is 2**(n-1) */
+ { 0, 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080,
+ 0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000 };
+
+static const int extend_offset[16] = /* entry n is (-1 << n) + 1 */
+ { 0, ((-1)<<1) + 1, ((-1)<<2) + 1, ((-1)<<3) + 1, ((-1)<<4) + 1,
+ ((-1)<<5) + 1, ((-1)<<6) + 1, ((-1)<<7) + 1, ((-1)<<8) + 1,
+ ((-1)<<9) + 1, ((-1)<<10) + 1, ((-1)<<11) + 1, ((-1)<<12) + 1,
+ ((-1)<<13) + 1, ((-1)<<14) + 1, ((-1)<<15) + 1 };
+
+#endif /* AVOID_TABLES */
+
+
+/*
+ * Check for a restart marker & resynchronize decoder.
+ * Returns FALSE if must suspend.
+ */
+
+LOCAL(boolean)
+process_restart (j_decompress_ptr cinfo)
+{
+ huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
+ int ci;
+
+ /* Throw away any unused bits remaining in bit buffer; */
+ /* include any full bytes in next_marker's count of discarded bytes */
+ cinfo->marker->discarded_bytes += entropy->bitstate.bits_left / 8;
+ entropy->bitstate.bits_left = 0;
+
+ /* Advance past the RSTn marker */
+ if (! (*cinfo->marker->read_restart_marker) (cinfo))
+ return FALSE;
+
+ /* Re-initialize DC predictions to 0 */
+ for (ci = 0; ci < cinfo->comps_in_scan; ci++)
+ entropy->saved.last_dc_val[ci] = 0;
+
+ /* Reset restart counter */
+ entropy->restarts_to_go = cinfo->restart_interval;
+
+ /* Reset out-of-data flag, unless read_restart_marker left us smack up
+ * against a marker. In that case we will end up treating the next data
+ * segment as empty, and we can avoid producing bogus output pixels by
+ * leaving the flag set.
+ */
+ if (cinfo->unread_marker == 0)
+ entropy->pub.insufficient_data = FALSE;
+
+ return TRUE;
+}
+
+
+/*
+ * Decode and return one MCU's worth of Huffman-compressed coefficients.
+ * The coefficients are reordered from zigzag order into natural array order,
+ * but are not dequantized.
+ *
+ * The i'th block of the MCU is stored into the block pointed to by
+ * MCU_data[i]. WE ASSUME THIS AREA HAS BEEN ZEROED BY THE CALLER.
+ * (Wholesale zeroing is usually a little faster than retail...)
+ *
+ * Returns FALSE if data source requested suspension. In that case no
+ * changes have been made to permanent state. (Exception: some output
+ * coefficients may already have been assigned. This is harmless for
+ * this module, since we'll just re-assign them on the next call.)
+ */
+
+METHODDEF(boolean)
+decode_mcu (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
+{
+ huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
+ int blkn;
+ BITREAD_STATE_VARS;
+ savable_state state;
+
+ /* Process restart marker if needed; may have to suspend */
+ if (cinfo->restart_interval) {
+ if (entropy->restarts_to_go == 0)
+ if (! process_restart(cinfo))
+ return FALSE;
+ }
+
+ /* If we've run out of data, just leave the MCU set to zeroes.
+ * This way, we return uniform gray for the remainder of the segment.
+ */
+ if (! entropy->pub.insufficient_data) {
+
+ /* Load up working state */
+ BITREAD_LOAD_STATE(cinfo,entropy->bitstate);
+ ASSIGN_STATE(state, entropy->saved);
+
+ /* Outer loop handles each block in the MCU */
+
+ for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
+ JBLOCKROW block = MCU_data[blkn];
+ d_derived_tbl * dctbl = entropy->dc_cur_tbls[blkn];
+ d_derived_tbl * actbl = entropy->ac_cur_tbls[blkn];
+ register int s, k, r;
+
+ /* Decode a single block's worth of coefficients */
+
+ /* Section F.2.2.1: decode the DC coefficient difference */
+ HUFF_DECODE(s, br_state, dctbl, return FALSE, label1);
+ if (s) {
+ CHECK_BIT_BUFFER(br_state, s, return FALSE);
+ r = GET_BITS(s);
+ s = HUFF_EXTEND(r, s);
+ }
+
+ if (entropy->dc_needed[blkn]) {
+ /* Convert DC difference to actual value, update last_dc_val */
+ int ci = cinfo->MCU_membership[blkn];
+ s += state.last_dc_val[ci];
+ state.last_dc_val[ci] = s;
+ /* Output the DC coefficient (assumes jpeg_natural_order[0] = 0) */
+ (*block)[0] = (JCOEF) s;
+ }
+
+ if (entropy->ac_needed[blkn]) {
+
+ /* Section F.2.2.2: decode the AC coefficients */
+ /* Since zeroes are skipped, output area must be cleared beforehand */
+ for (k = 1; k < DCTSIZE2; k++) {
+ HUFF_DECODE(s, br_state, actbl, return FALSE, label2);
+
+ r = s >> 4;
+ s &= 15;
+
+ if (s) {
+ k += r;
+ CHECK_BIT_BUFFER(br_state, s, return FALSE);
+ r = GET_BITS(s);
+ s = HUFF_EXTEND(r, s);
+ /* Output coefficient in natural (dezigzagged) order.
+ * Note: the extra entries in jpeg_natural_order[] will save us
+ * if k >= DCTSIZE2, which could happen if the data is corrupted.
+ */
+ (*block)[jpeg_natural_order[k]] = (JCOEF) s;
+ } else {
+ if (r != 15)
+ break;
+ k += 15;
+ }
+ }
+
+ } else {
+
+ /* Section F.2.2.2: decode the AC coefficients */
+ /* In this path we just discard the values */
+ for (k = 1; k < DCTSIZE2; k++) {
+ HUFF_DECODE(s, br_state, actbl, return FALSE, label3);
+
+ r = s >> 4;
+ s &= 15;
+
+ if (s) {
+ k += r;
+ CHECK_BIT_BUFFER(br_state, s, return FALSE);
+ DROP_BITS(s);
+ } else {
+ if (r != 15)
+ break;
+ k += 15;
+ }
+ }
+
+ }
+ }
+
+ /* Completed MCU, so update state */
+ BITREAD_SAVE_STATE(cinfo,entropy->bitstate);
+ ASSIGN_STATE(entropy->saved, state);
+ }
+
+ /* Account for restart interval (no-op if not using restarts) */
+ entropy->restarts_to_go--;
+
+ return TRUE;
+}
+
+
+/*
+ * Module initialization routine for Huffman entropy decoding.
+ */
+
+GLOBAL(void)
+jinit_huff_decoder (j_decompress_ptr cinfo)
+{
+ huff_entropy_ptr entropy;
+ int i;
+
+ entropy = (huff_entropy_ptr)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ SIZEOF(huff_entropy_decoder));
+ cinfo->entropy = (struct jpeg_entropy_decoder *) entropy;
+ entropy->pub.start_pass = start_pass_huff_decoder;
+ entropy->pub.decode_mcu = decode_mcu;
+
+ /* Mark tables unallocated */
+ for (i = 0; i < NUM_HUFF_TBLS; i++) {
+ entropy->dc_derived_tbls[i] = entropy->ac_derived_tbls[i] = NULL;
+ }
+}
+
+#endif //_FX_JPEG_TURBO_
diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jdinput.c b/core/src/fxcodec/libjpeg/fpdfapi_jdinput.c
index 46a7efce2e..6e714e928e 100644
--- a/core/src/fxcodec/libjpeg/fpdfapi_jdinput.c
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jdinput.c
@@ -1,384 +1,384 @@
-#if !defined(_FX_JPEG_TURBO_)
-/*
- * jdinput.c
- *
- * Copyright (C) 1991-1997, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains input control logic for the JPEG decompressor.
- * These routines are concerned with controlling the decompressor's input
- * processing (marker reading and coefficient decoding). The actual input
- * reading is done in jdmarker.c, jdhuff.c, and jdphuff.c.
- */
-
-#define JPEG_INTERNALS
-#include "jinclude.h"
-#include "jpeglib.h"
-
-
-/* Private state */
-
-typedef struct {
- struct jpeg_input_controller pub; /* public fields */
-
- boolean inheaders; /* TRUE until first SOS is reached */
-} my_input_controller;
-
-typedef my_input_controller * my_inputctl_ptr;
-
-
-/* Forward declarations */
-METHODDEF(int) consume_markers JPP((j_decompress_ptr cinfo));
-
-
-/*
- * Routines to calculate various quantities related to the size of the image.
- */
-
-LOCAL(void)
-initial_setup (j_decompress_ptr cinfo)
-/* Called once, when first SOS marker is reached */
-{
- int ci;
- jpeg_component_info *compptr;
-
- /* Make sure image isn't bigger than I can handle */
- if ((long) cinfo->image_height > (long) JPEG_MAX_DIMENSION ||
- (long) cinfo->image_width > (long) JPEG_MAX_DIMENSION)
- ERREXIT1(cinfo, JERR_IMAGE_TOO_BIG, (unsigned int) JPEG_MAX_DIMENSION);
-
- /* For now, precision must match compiled-in value... */
- if (cinfo->data_precision != BITS_IN_JSAMPLE)
- ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
-
- /* Check that number of components won't exceed internal array sizes */
- if (cinfo->num_components > MAX_COMPONENTS)
- ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->num_components,
- MAX_COMPONENTS);
-
- /* Compute maximum sampling factors; check factor validity */
- cinfo->max_h_samp_factor = 1;
- cinfo->max_v_samp_factor = 1;
- for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
- ci++, compptr++) {
- if (compptr->h_samp_factor<=0 || compptr->h_samp_factor>MAX_SAMP_FACTOR ||
- compptr->v_samp_factor<=0 || compptr->v_samp_factor>MAX_SAMP_FACTOR)
- ERREXIT(cinfo, JERR_BAD_SAMPLING);
- cinfo->max_h_samp_factor = MAX(cinfo->max_h_samp_factor,
- compptr->h_samp_factor);
- cinfo->max_v_samp_factor = MAX(cinfo->max_v_samp_factor,
- compptr->v_samp_factor);
- }
-
- /* We initialize DCT_scaled_size and min_DCT_scaled_size to DCTSIZE.
- * In the full decompressor, this will be overridden by jdmaster.c;
- * but in the transcoder, jdmaster.c is not used, so we must do it here.
- */
- cinfo->min_DCT_scaled_size = DCTSIZE;
-
- /* Compute dimensions of components */
- for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
- ci++, compptr++) {
- compptr->DCT_scaled_size = DCTSIZE;
- /* Size in DCT blocks */
- compptr->width_in_blocks = (JDIMENSION)
- jdiv_round_up((long) cinfo->image_width * (long) compptr->h_samp_factor,
- (long) (cinfo->max_h_samp_factor * DCTSIZE));
- compptr->height_in_blocks = (JDIMENSION)
- jdiv_round_up((long) cinfo->image_height * (long) compptr->v_samp_factor,
- (long) (cinfo->max_v_samp_factor * DCTSIZE));
- /* downsampled_width and downsampled_height will also be overridden by
- * jdmaster.c if we are doing full decompression. The transcoder library
- * doesn't use these values, but the calling application might.
- */
- /* Size in samples */
- compptr->downsampled_width = (JDIMENSION)
- jdiv_round_up((long) cinfo->image_width * (long) compptr->h_samp_factor,
- (long) cinfo->max_h_samp_factor);
- compptr->downsampled_height = (JDIMENSION)
- jdiv_round_up((long) cinfo->image_height * (long) compptr->v_samp_factor,
- (long) cinfo->max_v_samp_factor);
- /* Mark component needed, until color conversion says otherwise */
- compptr->component_needed = TRUE;
- /* Mark no quantization table yet saved for component */
- compptr->quant_table = NULL;
- }
-
- /* Compute number of fully interleaved MCU rows. */
- cinfo->total_iMCU_rows = (JDIMENSION)
- jdiv_round_up((long) cinfo->image_height,
- (long) (cinfo->max_v_samp_factor*DCTSIZE));
-
- /* Decide whether file contains multiple scans */
- if (cinfo->comps_in_scan < cinfo->num_components || cinfo->progressive_mode)
- cinfo->inputctl->has_multiple_scans = TRUE;
- else
- cinfo->inputctl->has_multiple_scans = FALSE;
-}
-
-
-LOCAL(void)
-per_scan_setup (j_decompress_ptr cinfo)
-/* Do computations that are needed before processing a JPEG scan */
-/* cinfo->comps_in_scan and cinfo->cur_comp_info[] were set from SOS marker */
-{
- int ci, mcublks, tmp;
- jpeg_component_info *compptr;
-
- if (cinfo->comps_in_scan == 1) {
-
- /* Noninterleaved (single-component) scan */
- compptr = cinfo->cur_comp_info[0];
-
- /* Overall image size in MCUs */
- cinfo->MCUs_per_row = compptr->width_in_blocks;
- cinfo->MCU_rows_in_scan = compptr->height_in_blocks;
-
- /* For noninterleaved scan, always one block per MCU */
- compptr->MCU_width = 1;
- compptr->MCU_height = 1;
- compptr->MCU_blocks = 1;
- compptr->MCU_sample_width = compptr->DCT_scaled_size;
- compptr->last_col_width = 1;
- /* For noninterleaved scans, it is convenient to define last_row_height
- * as the number of block rows present in the last iMCU row.
- */
- tmp = (int) (compptr->height_in_blocks % compptr->v_samp_factor);
- if (tmp == 0) tmp = compptr->v_samp_factor;
- compptr->last_row_height = tmp;
-
- /* Prepare array describing MCU composition */
- cinfo->blocks_in_MCU = 1;
- cinfo->MCU_membership[0] = 0;
-
- } else {
-
- /* Interleaved (multi-component) scan */
- if (cinfo->comps_in_scan <= 0 || cinfo->comps_in_scan > MAX_COMPS_IN_SCAN)
- ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->comps_in_scan,
- MAX_COMPS_IN_SCAN);
-
- /* Overall image size in MCUs */
- cinfo->MCUs_per_row = (JDIMENSION)
- jdiv_round_up((long) cinfo->image_width,
- (long) (cinfo->max_h_samp_factor*DCTSIZE));
- cinfo->MCU_rows_in_scan = (JDIMENSION)
- jdiv_round_up((long) cinfo->image_height,
- (long) (cinfo->max_v_samp_factor*DCTSIZE));
-
- cinfo->blocks_in_MCU = 0;
-
- for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
- compptr = cinfo->cur_comp_info[ci];
- /* Sampling factors give # of blocks of component in each MCU */
- compptr->MCU_width = compptr->h_samp_factor;
- compptr->MCU_height = compptr->v_samp_factor;
- compptr->MCU_blocks = compptr->MCU_width * compptr->MCU_height;
- compptr->MCU_sample_width = compptr->MCU_width * compptr->DCT_scaled_size;
- /* Figure number of non-dummy blocks in last MCU column & row */
- tmp = (int) (compptr->width_in_blocks % compptr->MCU_width);
- if (tmp == 0) tmp = compptr->MCU_width;
- compptr->last_col_width = tmp;
- tmp = (int) (compptr->height_in_blocks % compptr->MCU_height);
- if (tmp == 0) tmp = compptr->MCU_height;
- compptr->last_row_height = tmp;
- /* Prepare array describing MCU composition */
- mcublks = compptr->MCU_blocks;
- if (cinfo->blocks_in_MCU + mcublks > D_MAX_BLOCKS_IN_MCU)
- ERREXIT(cinfo, JERR_BAD_MCU_SIZE);
- while (mcublks-- > 0) {
- cinfo->MCU_membership[cinfo->blocks_in_MCU++] = ci;
- }
- }
-
- }
-}
-
-
-/*
- * Save away a copy of the Q-table referenced by each component present
- * in the current scan, unless already saved during a prior scan.
- *
- * In a multiple-scan JPEG file, the encoder could assign different components
- * the same Q-table slot number, but change table definitions between scans
- * so that each component uses a different Q-table. (The IJG encoder is not
- * currently capable of doing this, but other encoders might.) Since we want
- * to be able to dequantize all the components at the end of the file, this
- * means that we have to save away the table actually used for each component.
- * We do this by copying the table at the start of the first scan containing
- * the component.
- * The JPEG spec prohibits the encoder from changing the contents of a Q-table
- * slot between scans of a component using that slot. If the encoder does so
- * anyway, this decoder will simply use the Q-table values that were current
- * at the start of the first scan for the component.
- *
- * The decompressor output side looks only at the saved quant tables,
- * not at the current Q-table slots.
- */
-
-LOCAL(void)
-latch_quant_tables (j_decompress_ptr cinfo)
-{
- int ci, qtblno;
- jpeg_component_info *compptr;
- JQUANT_TBL * qtbl;
-
- for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
- compptr = cinfo->cur_comp_info[ci];
- /* No work if we already saved Q-table for this component */
- if (compptr->quant_table != NULL)
- continue;
- /* Make sure specified quantization table is present */
- qtblno = compptr->quant_tbl_no;
- if (qtblno < 0 || qtblno >= NUM_QUANT_TBLS ||
- cinfo->quant_tbl_ptrs[qtblno] == NULL)
- ERREXIT1(cinfo, JERR_NO_QUANT_TABLE, qtblno);
- /* OK, save away the quantization table */
- qtbl = (JQUANT_TBL *)
- (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
- SIZEOF(JQUANT_TBL));
- MEMCOPY(qtbl, cinfo->quant_tbl_ptrs[qtblno], SIZEOF(JQUANT_TBL));
- compptr->quant_table = qtbl;
- }
-}
-
-
-/*
- * Initialize the input modules to read a scan of compressed data.
- * The first call to this is done by jdmaster.c after initializing
- * the entire decompressor (during jpeg_start_decompress).
- * Subsequent calls come from consume_markers, below.
- */
-
-METHODDEF(void)
-start_input_pass (j_decompress_ptr cinfo)
-{
- per_scan_setup(cinfo);
- latch_quant_tables(cinfo);
- (*cinfo->entropy->start_pass) (cinfo);
- (*cinfo->coef->start_input_pass) (cinfo);
- cinfo->inputctl->consume_input = cinfo->coef->consume_data;
-}
-
-
-/*
- * Finish up after inputting a compressed-data scan.
- * This is called by the coefficient controller after it's read all
- * the expected data of the scan.
- */
-
-METHODDEF(void)
-finish_input_pass (j_decompress_ptr cinfo)
-{
- cinfo->inputctl->consume_input = consume_markers;
-}
-
-
-/*
- * Read JPEG markers before, between, or after compressed-data scans.
- * Change state as necessary when a new scan is reached.
- * Return value is JPEG_SUSPENDED, JPEG_REACHED_SOS, or JPEG_REACHED_EOI.
- *
- * The consume_input method pointer points either here or to the
- * coefficient controller's consume_data routine, depending on whether
- * we are reading a compressed data segment or inter-segment markers.
- */
-
-METHODDEF(int)
-consume_markers (j_decompress_ptr cinfo)
-{
- my_inputctl_ptr inputctl = (my_inputctl_ptr) cinfo->inputctl;
- int val;
-
- if (inputctl->pub.eoi_reached) /* After hitting EOI, read no further */
- return JPEG_REACHED_EOI;
-
- val = (*cinfo->marker->read_markers) (cinfo);
-
- switch (val) {
- case JPEG_REACHED_SOS: /* Found SOS */
- if (inputctl->inheaders) { /* 1st SOS */
- initial_setup(cinfo);
- inputctl->inheaders = FALSE;
- /* Note: start_input_pass must be called by jdmaster.c
- * before any more input can be consumed. jdapimin.c is
- * responsible for enforcing this sequencing.
- */
- } else { /* 2nd or later SOS marker */
- if (! inputctl->pub.has_multiple_scans)
- ERREXIT(cinfo, JERR_EOI_EXPECTED); /* Oops, I wasn't expecting this! */
- start_input_pass(cinfo);
- }
- break;
- case JPEG_REACHED_EOI: /* Found EOI */
- inputctl->pub.eoi_reached = TRUE;
- if (inputctl->inheaders) { /* Tables-only datastream, apparently */
- if (cinfo->marker->saw_SOF)
- ERREXIT(cinfo, JERR_SOF_NO_SOS);
- } else {
- /* Prevent infinite loop in coef ctlr's decompress_data routine
- * if user set output_scan_number larger than number of scans.
- */
- if (cinfo->output_scan_number > cinfo->input_scan_number)
- cinfo->output_scan_number = cinfo->input_scan_number;
- }
- break;
- case JPEG_SUSPENDED:
- break;
- }
-
- return val;
-}
-
-
-/*
- * Reset state to begin a fresh datastream.
- */
-
-METHODDEF(void)
-reset_input_controller (j_decompress_ptr cinfo)
-{
- my_inputctl_ptr inputctl = (my_inputctl_ptr) cinfo->inputctl;
-
- inputctl->pub.consume_input = consume_markers;
- inputctl->pub.has_multiple_scans = FALSE; /* "unknown" would be better */
- inputctl->pub.eoi_reached = FALSE;
- inputctl->inheaders = TRUE;
- /* Reset other modules */
- (*cinfo->err->reset_error_mgr) ((j_common_ptr) cinfo);
- (*cinfo->marker->reset_marker_reader) (cinfo);
- /* Reset progression state -- would be cleaner if entropy decoder did this */
- cinfo->coef_bits = NULL;
-}
-
-
-/*
- * Initialize the input controller module.
- * This is called only once, when the decompression object is created.
- */
-
-GLOBAL(void)
-jinit_input_controller (j_decompress_ptr cinfo)
-{
- my_inputctl_ptr inputctl;
-
- /* Create subobject in permanent pool */
- inputctl = (my_inputctl_ptr)
- (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
- SIZEOF(my_input_controller));
- cinfo->inputctl = (struct jpeg_input_controller *) inputctl;
- /* Initialize method pointers */
- inputctl->pub.consume_input = consume_markers;
- inputctl->pub.reset_input_controller = reset_input_controller;
- inputctl->pub.start_input_pass = start_input_pass;
- inputctl->pub.finish_input_pass = finish_input_pass;
- /* Initialize state: can't use reset_input_controller since we don't
- * want to try to reset other modules yet.
- */
- inputctl->pub.has_multiple_scans = FALSE; /* "unknown" would be better */
- inputctl->pub.eoi_reached = FALSE;
- inputctl->inheaders = TRUE;
-}
-
-#endif //_FX_JPEG_TURBO_
+#if !defined(_FX_JPEG_TURBO_)
+/*
+ * jdinput.c
+ *
+ * Copyright (C) 1991-1997, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains input control logic for the JPEG decompressor.
+ * These routines are concerned with controlling the decompressor's input
+ * processing (marker reading and coefficient decoding). The actual input
+ * reading is done in jdmarker.c, jdhuff.c, and jdphuff.c.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+
+
+/* Private state */
+
+typedef struct {
+ struct jpeg_input_controller pub; /* public fields */
+
+ boolean inheaders; /* TRUE until first SOS is reached */
+} my_input_controller;
+
+typedef my_input_controller * my_inputctl_ptr;
+
+
+/* Forward declarations */
+METHODDEF(int) consume_markers JPP((j_decompress_ptr cinfo));
+
+
+/*
+ * Routines to calculate various quantities related to the size of the image.
+ */
+
+LOCAL(void)
+initial_setup (j_decompress_ptr cinfo)
+/* Called once, when first SOS marker is reached */
+{
+ int ci;
+ jpeg_component_info *compptr;
+
+ /* Make sure image isn't bigger than I can handle */
+ if ((long) cinfo->image_height > (long) JPEG_MAX_DIMENSION ||
+ (long) cinfo->image_width > (long) JPEG_MAX_DIMENSION)
+ ERREXIT1(cinfo, JERR_IMAGE_TOO_BIG, (unsigned int) JPEG_MAX_DIMENSION);
+
+ /* For now, precision must match compiled-in value... */
+ if (cinfo->data_precision != BITS_IN_JSAMPLE)
+ ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
+
+ /* Check that number of components won't exceed internal array sizes */
+ if (cinfo->num_components > MAX_COMPONENTS)
+ ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->num_components,
+ MAX_COMPONENTS);
+
+ /* Compute maximum sampling factors; check factor validity */
+ cinfo->max_h_samp_factor = 1;
+ cinfo->max_v_samp_factor = 1;
+ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+ ci++, compptr++) {
+ if (compptr->h_samp_factor<=0 || compptr->h_samp_factor>MAX_SAMP_FACTOR ||
+ compptr->v_samp_factor<=0 || compptr->v_samp_factor>MAX_SAMP_FACTOR)
+ ERREXIT(cinfo, JERR_BAD_SAMPLING);
+ cinfo->max_h_samp_factor = MAX(cinfo->max_h_samp_factor,
+ compptr->h_samp_factor);
+ cinfo->max_v_samp_factor = MAX(cinfo->max_v_samp_factor,
+ compptr->v_samp_factor);
+ }
+
+ /* We initialize DCT_scaled_size and min_DCT_scaled_size to DCTSIZE.
+ * In the full decompressor, this will be overridden by jdmaster.c;
+ * but in the transcoder, jdmaster.c is not used, so we must do it here.
+ */
+ cinfo->min_DCT_scaled_size = DCTSIZE;
+
+ /* Compute dimensions of components */
+ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+ ci++, compptr++) {
+ compptr->DCT_scaled_size = DCTSIZE;
+ /* Size in DCT blocks */
+ compptr->width_in_blocks = (JDIMENSION)
+ jdiv_round_up((long) cinfo->image_width * (long) compptr->h_samp_factor,
+ (long) (cinfo->max_h_samp_factor * DCTSIZE));
+ compptr->height_in_blocks = (JDIMENSION)
+ jdiv_round_up((long) cinfo->image_height * (long) compptr->v_samp_factor,
+ (long) (cinfo->max_v_samp_factor * DCTSIZE));
+ /* downsampled_width and downsampled_height will also be overridden by
+ * jdmaster.c if we are doing full decompression. The transcoder library
+ * doesn't use these values, but the calling application might.
+ */
+ /* Size in samples */
+ compptr->downsampled_width = (JDIMENSION)
+ jdiv_round_up((long) cinfo->image_width * (long) compptr->h_samp_factor,
+ (long) cinfo->max_h_samp_factor);
+ compptr->downsampled_height = (JDIMENSION)
+ jdiv_round_up((long) cinfo->image_height * (long) compptr->v_samp_factor,
+ (long) cinfo->max_v_samp_factor);
+ /* Mark component needed, until color conversion says otherwise */
+ compptr->component_needed = TRUE;
+ /* Mark no quantization table yet saved for component */
+ compptr->quant_table = NULL;
+ }
+
+ /* Compute number of fully interleaved MCU rows. */
+ cinfo->total_iMCU_rows = (JDIMENSION)
+ jdiv_round_up((long) cinfo->image_height,
+ (long) (cinfo->max_v_samp_factor*DCTSIZE));
+
+ /* Decide whether file contains multiple scans */
+ if (cinfo->comps_in_scan < cinfo->num_components || cinfo->progressive_mode)
+ cinfo->inputctl->has_multiple_scans = TRUE;
+ else
+ cinfo->inputctl->has_multiple_scans = FALSE;
+}
+
+
+LOCAL(void)
+per_scan_setup (j_decompress_ptr cinfo)
+/* Do computations that are needed before processing a JPEG scan */
+/* cinfo->comps_in_scan and cinfo->cur_comp_info[] were set from SOS marker */
+{
+ int ci, mcublks, tmp;
+ jpeg_component_info *compptr;
+
+ if (cinfo->comps_in_scan == 1) {
+
+ /* Noninterleaved (single-component) scan */
+ compptr = cinfo->cur_comp_info[0];
+
+ /* Overall image size in MCUs */
+ cinfo->MCUs_per_row = compptr->width_in_blocks;
+ cinfo->MCU_rows_in_scan = compptr->height_in_blocks;
+
+ /* For noninterleaved scan, always one block per MCU */
+ compptr->MCU_width = 1;
+ compptr->MCU_height = 1;
+ compptr->MCU_blocks = 1;
+ compptr->MCU_sample_width = compptr->DCT_scaled_size;
+ compptr->last_col_width = 1;
+ /* For noninterleaved scans, it is convenient to define last_row_height
+ * as the number of block rows present in the last iMCU row.
+ */
+ tmp = (int) (compptr->height_in_blocks % compptr->v_samp_factor);
+ if (tmp == 0) tmp = compptr->v_samp_factor;
+ compptr->last_row_height = tmp;
+
+ /* Prepare array describing MCU composition */
+ cinfo->blocks_in_MCU = 1;
+ cinfo->MCU_membership[0] = 0;
+
+ } else {
+
+ /* Interleaved (multi-component) scan */
+ if (cinfo->comps_in_scan <= 0 || cinfo->comps_in_scan > MAX_COMPS_IN_SCAN)
+ ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->comps_in_scan,
+ MAX_COMPS_IN_SCAN);
+
+ /* Overall image size in MCUs */
+ cinfo->MCUs_per_row = (JDIMENSION)
+ jdiv_round_up((long) cinfo->image_width,
+ (long) (cinfo->max_h_samp_factor*DCTSIZE));
+ cinfo->MCU_rows_in_scan = (JDIMENSION)
+ jdiv_round_up((long) cinfo->image_height,
+ (long) (cinfo->max_v_samp_factor*DCTSIZE));
+
+ cinfo->blocks_in_MCU = 0;
+
+ for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
+ compptr = cinfo->cur_comp_info[ci];
+ /* Sampling factors give # of blocks of component in each MCU */
+ compptr->MCU_width = compptr->h_samp_factor;
+ compptr->MCU_height = compptr->v_samp_factor;
+ compptr->MCU_blocks = compptr->MCU_width * compptr->MCU_height;
+ compptr->MCU_sample_width = compptr->MCU_width * compptr->DCT_scaled_size;
+ /* Figure number of non-dummy blocks in last MCU column & row */
+ tmp = (int) (compptr->width_in_blocks % compptr->MCU_width);
+ if (tmp == 0) tmp = compptr->MCU_width;
+ compptr->last_col_width = tmp;
+ tmp = (int) (compptr->height_in_blocks % compptr->MCU_height);
+ if (tmp == 0) tmp = compptr->MCU_height;
+ compptr->last_row_height = tmp;
+ /* Prepare array describing MCU composition */
+ mcublks = compptr->MCU_blocks;
+ if (cinfo->blocks_in_MCU + mcublks > D_MAX_BLOCKS_IN_MCU)
+ ERREXIT(cinfo, JERR_BAD_MCU_SIZE);
+ while (mcublks-- > 0) {
+ cinfo->MCU_membership[cinfo->blocks_in_MCU++] = ci;
+ }
+ }
+
+ }
+}
+
+
+/*
+ * Save away a copy of the Q-table referenced by each component present
+ * in the current scan, unless already saved during a prior scan.
+ *
+ * In a multiple-scan JPEG file, the encoder could assign different components
+ * the same Q-table slot number, but change table definitions between scans
+ * so that each component uses a different Q-table. (The IJG encoder is not
+ * currently capable of doing this, but other encoders might.) Since we want
+ * to be able to dequantize all the components at the end of the file, this
+ * means that we have to save away the table actually used for each component.
+ * We do this by copying the table at the start of the first scan containing
+ * the component.
+ * The JPEG spec prohibits the encoder from changing the contents of a Q-table
+ * slot between scans of a component using that slot. If the encoder does so
+ * anyway, this decoder will simply use the Q-table values that were current
+ * at the start of the first scan for the component.
+ *
+ * The decompressor output side looks only at the saved quant tables,
+ * not at the current Q-table slots.
+ */
+
+LOCAL(void)
+latch_quant_tables (j_decompress_ptr cinfo)
+{
+ int ci, qtblno;
+ jpeg_component_info *compptr;
+ JQUANT_TBL * qtbl;
+
+ for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
+ compptr = cinfo->cur_comp_info[ci];
+ /* No work if we already saved Q-table for this component */
+ if (compptr->quant_table != NULL)
+ continue;
+ /* Make sure specified quantization table is present */
+ qtblno = compptr->quant_tbl_no;
+ if (qtblno < 0 || qtblno >= NUM_QUANT_TBLS ||
+ cinfo->quant_tbl_ptrs[qtblno] == NULL)
+ ERREXIT1(cinfo, JERR_NO_QUANT_TABLE, qtblno);
+ /* OK, save away the quantization table */
+ qtbl = (JQUANT_TBL *)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ SIZEOF(JQUANT_TBL));
+ MEMCOPY(qtbl, cinfo->quant_tbl_ptrs[qtblno], SIZEOF(JQUANT_TBL));
+ compptr->quant_table = qtbl;
+ }
+}
+
+
+/*
+ * Initialize the input modules to read a scan of compressed data.
+ * The first call to this is done by jdmaster.c after initializing
+ * the entire decompressor (during jpeg_start_decompress).
+ * Subsequent calls come from consume_markers, below.
+ */
+
+METHODDEF(void)
+start_input_pass (j_decompress_ptr cinfo)
+{
+ per_scan_setup(cinfo);
+ latch_quant_tables(cinfo);
+ (*cinfo->entropy->start_pass) (cinfo);
+ (*cinfo->coef->start_input_pass) (cinfo);
+ cinfo->inputctl->consume_input = cinfo->coef->consume_data;
+}
+
+
+/*
+ * Finish up after inputting a compressed-data scan.
+ * This is called by the coefficient controller after it's read all
+ * the expected data of the scan.
+ */
+
+METHODDEF(void)
+finish_input_pass (j_decompress_ptr cinfo)
+{
+ cinfo->inputctl->consume_input = consume_markers;
+}
+
+
+/*
+ * Read JPEG markers before, between, or after compressed-data scans.
+ * Change state as necessary when a new scan is reached.
+ * Return value is JPEG_SUSPENDED, JPEG_REACHED_SOS, or JPEG_REACHED_EOI.
+ *
+ * The consume_input method pointer points either here or to the
+ * coefficient controller's consume_data routine, depending on whether
+ * we are reading a compressed data segment or inter-segment markers.
+ */
+
+METHODDEF(int)
+consume_markers (j_decompress_ptr cinfo)
+{
+ my_inputctl_ptr inputctl = (my_inputctl_ptr) cinfo->inputctl;
+ int val;
+
+ if (inputctl->pub.eoi_reached) /* After hitting EOI, read no further */
+ return JPEG_REACHED_EOI;
+
+ val = (*cinfo->marker->read_markers) (cinfo);
+
+ switch (val) {
+ case JPEG_REACHED_SOS: /* Found SOS */
+ if (inputctl->inheaders) { /* 1st SOS */
+ initial_setup(cinfo);
+ inputctl->inheaders = FALSE;
+ /* Note: start_input_pass must be called by jdmaster.c
+ * before any more input can be consumed. jdapimin.c is
+ * responsible for enforcing this sequencing.
+ */
+ } else { /* 2nd or later SOS marker */
+ if (! inputctl->pub.has_multiple_scans)
+ ERREXIT(cinfo, JERR_EOI_EXPECTED); /* Oops, I wasn't expecting this! */
+ start_input_pass(cinfo);
+ }
+ break;
+ case JPEG_REACHED_EOI: /* Found EOI */
+ inputctl->pub.eoi_reached = TRUE;
+ if (inputctl->inheaders) { /* Tables-only datastream, apparently */
+ if (cinfo->marker->saw_SOF)
+ ERREXIT(cinfo, JERR_SOF_NO_SOS);
+ } else {
+ /* Prevent infinite loop in coef ctlr's decompress_data routine
+ * if user set output_scan_number larger than number of scans.
+ */
+ if (cinfo->output_scan_number > cinfo->input_scan_number)
+ cinfo->output_scan_number = cinfo->input_scan_number;
+ }
+ break;
+ case JPEG_SUSPENDED:
+ break;
+ }
+
+ return val;
+}
+
+
+/*
+ * Reset state to begin a fresh datastream.
+ */
+
+METHODDEF(void)
+reset_input_controller (j_decompress_ptr cinfo)
+{
+ my_inputctl_ptr inputctl = (my_inputctl_ptr) cinfo->inputctl;
+
+ inputctl->pub.consume_input = consume_markers;
+ inputctl->pub.has_multiple_scans = FALSE; /* "unknown" would be better */
+ inputctl->pub.eoi_reached = FALSE;
+ inputctl->inheaders = TRUE;
+ /* Reset other modules */
+ (*cinfo->err->reset_error_mgr) ((j_common_ptr) cinfo);
+ (*cinfo->marker->reset_marker_reader) (cinfo);
+ /* Reset progression state -- would be cleaner if entropy decoder did this */
+ cinfo->coef_bits = NULL;
+}
+
+
+/*
+ * Initialize the input controller module.
+ * This is called only once, when the decompression object is created.
+ */
+
+GLOBAL(void)
+jinit_input_controller (j_decompress_ptr cinfo)
+{
+ my_inputctl_ptr inputctl;
+
+ /* Create subobject in permanent pool */
+ inputctl = (my_inputctl_ptr)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
+ SIZEOF(my_input_controller));
+ cinfo->inputctl = (struct jpeg_input_controller *) inputctl;
+ /* Initialize method pointers */
+ inputctl->pub.consume_input = consume_markers;
+ inputctl->pub.reset_input_controller = reset_input_controller;
+ inputctl->pub.start_input_pass = start_input_pass;
+ inputctl->pub.finish_input_pass = finish_input_pass;
+ /* Initialize state: can't use reset_input_controller since we don't
+ * want to try to reset other modules yet.
+ */
+ inputctl->pub.has_multiple_scans = FALSE; /* "unknown" would be better */
+ inputctl->pub.eoi_reached = FALSE;
+ inputctl->inheaders = TRUE;
+}
+
+#endif //_FX_JPEG_TURBO_
diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jdmainct.c b/core/src/fxcodec/libjpeg/fpdfapi_jdmainct.c
index 0fc77c7c17..1483e6fff0 100644
--- a/core/src/fxcodec/libjpeg/fpdfapi_jdmainct.c
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jdmainct.c
@@ -1,515 +1,515 @@
-#if !defined(_FX_JPEG_TURBO_)
-/*
- * jdmainct.c
- *
- * Copyright (C) 1994-1996, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains the main buffer controller for decompression.
- * The main buffer lies between the JPEG decompressor proper and the
- * post-processor; it holds downsampled data in the JPEG colorspace.
- *
- * Note that this code is bypassed in raw-data mode, since the application
- * supplies the equivalent of the main buffer in that case.
- */
-
-#define JPEG_INTERNALS
-#include "jinclude.h"
-#include "jpeglib.h"
-
-
-/*
- * In the current system design, the main buffer need never be a full-image
- * buffer; any full-height buffers will be found inside the coefficient or
- * postprocessing controllers. Nonetheless, the main controller is not
- * trivial. Its responsibility is to provide context rows for upsampling/
- * rescaling, and doing this in an efficient fashion is a bit tricky.
- *
- * Postprocessor input data is counted in "row groups". A row group
- * is defined to be (v_samp_factor * DCT_scaled_size / min_DCT_scaled_size)
- * sample rows of each component. (We require DCT_scaled_size values to be
- * chosen such that these numbers are integers. In practice DCT_scaled_size
- * values will likely be powers of two, so we actually have the stronger
- * condition that DCT_scaled_size / min_DCT_scaled_size is an integer.)
- * Upsampling will typically produce max_v_samp_factor pixel rows from each
- * row group (times any additional scale factor that the upsampler is
- * applying).
- *
- * The coefficient controller will deliver data to us one iMCU row at a time;
- * each iMCU row contains v_samp_factor * DCT_scaled_size sample rows, or
- * exactly min_DCT_scaled_size row groups. (This amount of data corresponds
- * to one row of MCUs when the image is fully interleaved.) Note that the
- * number of sample rows varies across components, but the number of row
- * groups does not. Some garbage sample rows may be included in the last iMCU
- * row at the bottom of the image.
- *
- * Depending on the vertical scaling algorithm used, the upsampler may need
- * access to the sample row(s) above and below its current input row group.
- * The upsampler is required to set need_context_rows TRUE at global selection
- * time if so. When need_context_rows is FALSE, this controller can simply
- * obtain one iMCU row at a time from the coefficient controller and dole it
- * out as row groups to the postprocessor.
- *
- * When need_context_rows is TRUE, this controller guarantees that the buffer
- * passed to postprocessing contains at least one row group's worth of samples
- * above and below the row group(s) being processed. Note that the context
- * rows "above" the first passed row group appear at negative row offsets in
- * the passed buffer. At the top and bottom of the image, the required
- * context rows are manufactured by duplicating the first or last real sample
- * row; this avoids having special cases in the upsampling inner loops.
- *
- * The amount of context is fixed at one row group just because that's a
- * convenient number for this controller to work with. The existing
- * upsamplers really only need one sample row of context. An upsampler
- * supporting arbitrary output rescaling might wish for more than one row
- * group of context when shrinking the image; tough, we don't handle that.
- * (This is justified by the assumption that downsizing will be handled mostly
- * by adjusting the DCT_scaled_size values, so that the actual scale factor at
- * the upsample step needn't be much less than one.)
- *
- * To provide the desired context, we have to retain the last two row groups
- * of one iMCU row while reading in the next iMCU row. (The last row group
- * can't be processed until we have another row group for its below-context,
- * and so we have to save the next-to-last group too for its above-context.)
- * We could do this most simply by copying data around in our buffer, but
- * that'd be very slow. We can avoid copying any data by creating a rather
- * strange pointer structure. Here's how it works. We allocate a workspace
- * consisting of M+2 row groups (where M = min_DCT_scaled_size is the number
- * of row groups per iMCU row). We create two sets of redundant pointers to
- * the workspace. Labeling the physical row groups 0 to M+1, the synthesized
- * pointer lists look like this:
- * M+1 M-1
- * master pointer --> 0 master pointer --> 0
- * 1 1
- * ... ...
- * M-3 M-3
- * M-2 M
- * M-1 M+1
- * M M-2
- * M+1 M-1
- * 0 0
- * We read alternate iMCU rows using each master pointer; thus the last two
- * row groups of the previous iMCU row remain un-overwritten in the workspace.
- * The pointer lists are set up so that the required context rows appear to
- * be adjacent to the proper places when we pass the pointer lists to the
- * upsampler.
- *
- * The above pictures describe the normal state of the pointer lists.
- * At top and bottom of the image, we diddle the pointer lists to duplicate
- * the first or last sample row as necessary (this is cheaper than copying
- * sample rows around).
- *
- * This scheme breaks down if M < 2, ie, min_DCT_scaled_size is 1. In that
- * situation each iMCU row provides only one row group so the buffering logic
- * must be different (eg, we must read two iMCU rows before we can emit the
- * first row group). For now, we simply do not support providing context
- * rows when min_DCT_scaled_size is 1. That combination seems unlikely to
- * be worth providing --- if someone wants a 1/8th-size preview, they probably
- * want it quick and dirty, so a context-free upsampler is sufficient.
- */
-
-
-/* Private buffer controller object */
-
-typedef struct {
- struct jpeg_d_main_controller pub; /* public fields */
-
- /* Pointer to allocated workspace (M or M+2 row groups). */
- JSAMPARRAY buffer[MAX_COMPONENTS];
-
- boolean buffer_full; /* Have we gotten an iMCU row from decoder? */
- JDIMENSION rowgroup_ctr; /* counts row groups output to postprocessor */
-
- /* Remaining fields are only used in the context case. */
-
- /* These are the master pointers to the funny-order pointer lists. */
- JSAMPIMAGE xbuffer[2]; /* pointers to weird pointer lists */
-
- int whichptr; /* indicates which pointer set is now in use */
- int context_state; /* process_data state machine status */
- JDIMENSION rowgroups_avail; /* row groups available to postprocessor */
- JDIMENSION iMCU_row_ctr; /* counts iMCU rows to detect image top/bot */
-} my_main_controller;
-
-typedef my_main_controller * my_main_ptr;
-
-/* context_state values: */
-#define CTX_PREPARE_FOR_IMCU 0 /* need to prepare for MCU row */
-#define CTX_PROCESS_IMCU 1 /* feeding iMCU to postprocessor */
-#define CTX_POSTPONED_ROW 2 /* feeding postponed row group */
-
-
-/* Forward declarations */
-METHODDEF(void) process_data_simple_main
- JPP((j_decompress_ptr cinfo, JSAMPARRAY output_buf,
- JDIMENSION *out_row_ctr, JDIMENSION out_rows_avail));
-METHODDEF(void) process_data_context_main
- JPP((j_decompress_ptr cinfo, JSAMPARRAY output_buf,
- JDIMENSION *out_row_ctr, JDIMENSION out_rows_avail));
-#ifdef QUANT_2PASS_SUPPORTED
-METHODDEF(void) process_data_crank_post
- JPP((j_decompress_ptr cinfo, JSAMPARRAY output_buf,
- JDIMENSION *out_row_ctr, JDIMENSION out_rows_avail));
-#endif
-
-
-LOCAL(void)
-alloc_funny_pointers (j_decompress_ptr cinfo)
-/* Allocate space for the funny pointer lists.
- * This is done only once, not once per pass.
- */
-{
- my_main_ptr main = (my_main_ptr) cinfo->main;
- int ci, rgroup;
- int M = cinfo->min_DCT_scaled_size;
- jpeg_component_info *compptr;
- JSAMPARRAY xbuf;
-
- /* Get top-level space for component array pointers.
- * We alloc both arrays with one call to save a few cycles.
- */
- main->xbuffer[0] = (JSAMPIMAGE)
- (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
- cinfo->num_components * 2 * SIZEOF(JSAMPARRAY));
- main->xbuffer[1] = main->xbuffer[0] + cinfo->num_components;
-
- for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
- ci++, compptr++) {
- rgroup = (compptr->v_samp_factor * compptr->DCT_scaled_size) /
- cinfo->min_DCT_scaled_size; /* height of a row group of component */
- /* Get space for pointer lists --- M+4 row groups in each list.
- * We alloc both pointer lists with one call to save a few cycles.
- */
- xbuf = (JSAMPARRAY)
- (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
- 2 * (rgroup * (M + 4)) * SIZEOF(JSAMPROW));
- xbuf += rgroup; /* want one row group at negative offsets */
- main->xbuffer[0][ci] = xbuf;
- xbuf += rgroup * (M + 4);
- main->xbuffer[1][ci] = xbuf;
- }
-}
-
-
-LOCAL(void)
-make_funny_pointers (j_decompress_ptr cinfo)
-/* Create the funny pointer lists discussed in the comments above.
- * The actual workspace is already allocated (in main->buffer),
- * and the space for the pointer lists is allocated too.
- * This routine just fills in the curiously ordered lists.
- * This will be repeated at the beginning of each pass.
- */
-{
- my_main_ptr main = (my_main_ptr) cinfo->main;
- int ci, i, rgroup;
- int M = cinfo->min_DCT_scaled_size;
- jpeg_component_info *compptr;
- JSAMPARRAY buf, xbuf0, xbuf1;
-
- for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
- ci++, compptr++) {
- rgroup = (compptr->v_samp_factor * compptr->DCT_scaled_size) /
- cinfo->min_DCT_scaled_size; /* height of a row group of component */
- xbuf0 = main->xbuffer[0][ci];
- xbuf1 = main->xbuffer[1][ci];
- /* First copy the workspace pointers as-is */
- buf = main->buffer[ci];
- for (i = 0; i < rgroup * (M + 2); i++) {
- xbuf0[i] = xbuf1[i] = buf[i];
- }
- /* In the second list, put the last four row groups in swapped order */
- for (i = 0; i < rgroup * 2; i++) {
- xbuf1[rgroup*(M-2) + i] = buf[rgroup*M + i];
- xbuf1[rgroup*M + i] = buf[rgroup*(M-2) + i];
- }
- /* The wraparound pointers at top and bottom will be filled later
- * (see set_wraparound_pointers, below). Initially we want the "above"
- * pointers to duplicate the first actual data line. This only needs
- * to happen in xbuffer[0].
- */
- for (i = 0; i < rgroup; i++) {
- xbuf0[i - rgroup] = xbuf0[0];
- }
- }
-}
-
-
-LOCAL(void)
-set_wraparound_pointers (j_decompress_ptr cinfo)
-/* Set up the "wraparound" pointers at top and bottom of the pointer lists.
- * This changes the pointer list state from top-of-image to the normal state.
- */
-{
- my_main_ptr main = (my_main_ptr) cinfo->main;
- int ci, i, rgroup;
- int M = cinfo->min_DCT_scaled_size;
- jpeg_component_info *compptr;
- JSAMPARRAY xbuf0, xbuf1;
-
- for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
- ci++, compptr++) {
- rgroup = (compptr->v_samp_factor * compptr->DCT_scaled_size) /
- cinfo->min_DCT_scaled_size; /* height of a row group of component */
- xbuf0 = main->xbuffer[0][ci];
- xbuf1 = main->xbuffer[1][ci];
- for (i = 0; i < rgroup; i++) {
- xbuf0[i - rgroup] = xbuf0[rgroup*(M+1) + i];
- xbuf1[i - rgroup] = xbuf1[rgroup*(M+1) + i];
- xbuf0[rgroup*(M+2) + i] = xbuf0[i];
- xbuf1[rgroup*(M+2) + i] = xbuf1[i];
- }
- }
-}
-
-
-LOCAL(void)
-set_bottom_pointers (j_decompress_ptr cinfo)
-/* Change the pointer lists to duplicate the last sample row at the bottom
- * of the image. whichptr indicates which xbuffer holds the final iMCU row.
- * Also sets rowgroups_avail to indicate number of nondummy row groups in row.
- */
-{
- my_main_ptr main = (my_main_ptr) cinfo->main;
- int ci, i, rgroup, iMCUheight, rows_left;
- jpeg_component_info *compptr;
- JSAMPARRAY xbuf;
-
- for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
- ci++, compptr++) {
- /* Count sample rows in one iMCU row and in one row group */
- iMCUheight = compptr->v_samp_factor * compptr->DCT_scaled_size;
- rgroup = iMCUheight / cinfo->min_DCT_scaled_size;
- /* Count nondummy sample rows remaining for this component */
- rows_left = (int) (compptr->downsampled_height % (JDIMENSION) iMCUheight);
- if (rows_left == 0) rows_left = iMCUheight;
- /* Count nondummy row groups. Should get same answer for each component,
- * so we need only do it once.
- */
- if (ci == 0) {
- main->rowgroups_avail = (JDIMENSION) ((rows_left-1) / rgroup + 1);
- }
- /* Duplicate the last real sample row rgroup*2 times; this pads out the
- * last partial rowgroup and ensures at least one full rowgroup of context.
- */
- xbuf = main->xbuffer[main->whichptr][ci];
- for (i = 0; i < rgroup * 2; i++) {
- xbuf[rows_left + i] = xbuf[rows_left-1];
- }
- }
-}
-
-
-/*
- * Initialize for a processing pass.
- */
-
-METHODDEF(void)
-start_pass_main (j_decompress_ptr cinfo, J_BUF_MODE pass_mode)
-{
- my_main_ptr main = (my_main_ptr) cinfo->main;
-
- switch (pass_mode) {
- case JBUF_PASS_THRU:
- if (cinfo->upsample->need_context_rows) {
- main->pub.process_data = process_data_context_main;
- make_funny_pointers(cinfo); /* Create the xbuffer[] lists */
- main->whichptr = 0; /* Read first iMCU row into xbuffer[0] */
- main->context_state = CTX_PREPARE_FOR_IMCU;
- main->iMCU_row_ctr = 0;
- } else {
- /* Simple case with no context needed */
- main->pub.process_data = process_data_simple_main;
- }
- main->buffer_full = FALSE; /* Mark buffer empty */
- main->rowgroup_ctr = 0;
- break;
-#ifdef QUANT_2PASS_SUPPORTED
- case JBUF_CRANK_DEST:
- /* For last pass of 2-pass quantization, just crank the postprocessor */
- main->pub.process_data = process_data_crank_post;
- break;
-#endif
- default:
- ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
- break;
- }
-}
-
-
-/*
- * Process some data.
- * This handles the simple case where no context is required.
- */
-
-METHODDEF(void)
-process_data_simple_main (j_decompress_ptr cinfo,
- JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
- JDIMENSION out_rows_avail)
-{
- my_main_ptr main = (my_main_ptr) cinfo->main;
- JDIMENSION rowgroups_avail;
-
- /* Read input data if we haven't filled the main buffer yet */
- if (! main->buffer_full) {
- if (! (*cinfo->coef->decompress_data) (cinfo, main->buffer))
- return; /* suspension forced, can do nothing more */
- main->buffer_full = TRUE; /* OK, we have an iMCU row to work with */
- }
-
- /* There are always min_DCT_scaled_size row groups in an iMCU row. */
- rowgroups_avail = (JDIMENSION) cinfo->min_DCT_scaled_size;
- /* Note: at the bottom of the image, we may pass extra garbage row groups
- * to the postprocessor. The postprocessor has to check for bottom
- * of image anyway (at row resolution), so no point in us doing it too.
- */
-
- /* Feed the postprocessor */
- (*cinfo->post->post_process_data) (cinfo, main->buffer,
- &main->rowgroup_ctr, rowgroups_avail,
- output_buf, out_row_ctr, out_rows_avail);
-
- /* Has postprocessor consumed all the data yet? If so, mark buffer empty */
- if (main->rowgroup_ctr >= rowgroups_avail) {
- main->buffer_full = FALSE;
- main->rowgroup_ctr = 0;
- }
-}
-
-
-/*
- * Process some data.
- * This handles the case where context rows must be provided.
- */
-
-METHODDEF(void)
-process_data_context_main (j_decompress_ptr cinfo,
- JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
- JDIMENSION out_rows_avail)
-{
- my_main_ptr main = (my_main_ptr) cinfo->main;
-
- /* Read input data if we haven't filled the main buffer yet */
- if (! main->buffer_full) {
- if (! (*cinfo->coef->decompress_data) (cinfo,
- main->xbuffer[main->whichptr]))
- return; /* suspension forced, can do nothing more */
- main->buffer_full = TRUE; /* OK, we have an iMCU row to work with */
- main->iMCU_row_ctr++; /* count rows received */
- }
-
- /* Postprocessor typically will not swallow all the input data it is handed
- * in one call (due to filling the output buffer first). Must be prepared
- * to exit and restart. This switch lets us keep track of how far we got.
- * Note that each case falls through to the next on successful completion.
- */
- switch (main->context_state) {
- case CTX_POSTPONED_ROW:
- /* Call postprocessor using previously set pointers for postponed row */
- (*cinfo->post->post_process_data) (cinfo, main->xbuffer[main->whichptr],
- &main->rowgroup_ctr, main->rowgroups_avail,
- output_buf, out_row_ctr, out_rows_avail);
- if (main->rowgroup_ctr < main->rowgroups_avail)
- return; /* Need to suspend */
- main->context_state = CTX_PREPARE_FOR_IMCU;
- if (*out_row_ctr >= out_rows_avail)
- return; /* Postprocessor exactly filled output buf */
- /*FALLTHROUGH*/
- case CTX_PREPARE_FOR_IMCU:
- /* Prepare to process first M-1 row groups of this iMCU row */
- main->rowgroup_ctr = 0;
- main->rowgroups_avail = (JDIMENSION) (cinfo->min_DCT_scaled_size - 1);
- /* Check for bottom of image: if so, tweak pointers to "duplicate"
- * the last sample row, and adjust rowgroups_avail to ignore padding rows.
- */
- if (main->iMCU_row_ctr == cinfo->total_iMCU_rows)
- set_bottom_pointers(cinfo);
- main->context_state = CTX_PROCESS_IMCU;
- /*FALLTHROUGH*/
- case CTX_PROCESS_IMCU:
- /* Call postprocessor using previously set pointers */
- (*cinfo->post->post_process_data) (cinfo, main->xbuffer[main->whichptr],
- &main->rowgroup_ctr, main->rowgroups_avail,
- output_buf, out_row_ctr, out_rows_avail);
- if (main->rowgroup_ctr < main->rowgroups_avail)
- return; /* Need to suspend */
- /* After the first iMCU, change wraparound pointers to normal state */
- if (main->iMCU_row_ctr == 1)
- set_wraparound_pointers(cinfo);
- /* Prepare to load new iMCU row using other xbuffer list */
- main->whichptr ^= 1; /* 0=>1 or 1=>0 */
- main->buffer_full = FALSE;
- /* Still need to process last row group of this iMCU row, */
- /* which is saved at index M+1 of the other xbuffer */
- main->rowgroup_ctr = (JDIMENSION) (cinfo->min_DCT_scaled_size + 1);
- main->rowgroups_avail = (JDIMENSION) (cinfo->min_DCT_scaled_size + 2);
- main->context_state = CTX_POSTPONED_ROW;
- }
-}
-
-
-/*
- * Process some data.
- * Final pass of two-pass quantization: just call the postprocessor.
- * Source data will be the postprocessor controller's internal buffer.
- */
-
-#ifdef QUANT_2PASS_SUPPORTED
-
-METHODDEF(void)
-process_data_crank_post (j_decompress_ptr cinfo,
- JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
- JDIMENSION out_rows_avail)
-{
- (*cinfo->post->post_process_data) (cinfo, (JSAMPIMAGE) NULL,
- (JDIMENSION *) NULL, (JDIMENSION) 0,
- output_buf, out_row_ctr, out_rows_avail);
-}
-
-#endif /* QUANT_2PASS_SUPPORTED */
-
-
-/*
- * Initialize main buffer controller.
- */
-
-GLOBAL(void)
-jinit_d_main_controller (j_decompress_ptr cinfo, boolean need_full_buffer)
-{
- my_main_ptr main;
- int ci, rgroup, ngroups;
- jpeg_component_info *compptr;
-
- main = (my_main_ptr)
- (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
- SIZEOF(my_main_controller));
- cinfo->main = (struct jpeg_d_main_controller *) main;
- main->pub.start_pass = start_pass_main;
-
- if (need_full_buffer) /* shouldn't happen */
- ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
-
- /* Allocate the workspace.
- * ngroups is the number of row groups we need.
- */
- if (cinfo->upsample->need_context_rows) {
- if (cinfo->min_DCT_scaled_size < 2) /* unsupported, see comments above */
- ERREXIT(cinfo, JERR_NOTIMPL);
- alloc_funny_pointers(cinfo); /* Alloc space for xbuffer[] lists */
- ngroups = cinfo->min_DCT_scaled_size + 2;
- } else {
- ngroups = cinfo->min_DCT_scaled_size;
- }
-
- for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
- ci++, compptr++) {
- rgroup = (compptr->v_samp_factor * compptr->DCT_scaled_size) /
- cinfo->min_DCT_scaled_size; /* height of a row group of component */
- main->buffer[ci] = (*cinfo->mem->alloc_sarray)
- ((j_common_ptr) cinfo, JPOOL_IMAGE,
- compptr->width_in_blocks * compptr->DCT_scaled_size,
- (JDIMENSION) (rgroup * ngroups));
- }
-}
-
-#endif //_FX_JPEG_TURBO_
+#if !defined(_FX_JPEG_TURBO_)
+/*
+ * jdmainct.c
+ *
+ * Copyright (C) 1994-1996, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains the main buffer controller for decompression.
+ * The main buffer lies between the JPEG decompressor proper and the
+ * post-processor; it holds downsampled data in the JPEG colorspace.
+ *
+ * Note that this code is bypassed in raw-data mode, since the application
+ * supplies the equivalent of the main buffer in that case.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+
+
+/*
+ * In the current system design, the main buffer need never be a full-image
+ * buffer; any full-height buffers will be found inside the coefficient or
+ * postprocessing controllers. Nonetheless, the main controller is not
+ * trivial. Its responsibility is to provide context rows for upsampling/
+ * rescaling, and doing this in an efficient fashion is a bit tricky.
+ *
+ * Postprocessor input data is counted in "row groups". A row group
+ * is defined to be (v_samp_factor * DCT_scaled_size / min_DCT_scaled_size)
+ * sample rows of each component. (We require DCT_scaled_size values to be
+ * chosen such that these numbers are integers. In practice DCT_scaled_size
+ * values will likely be powers of two, so we actually have the stronger
+ * condition that DCT_scaled_size / min_DCT_scaled_size is an integer.)
+ * Upsampling will typically produce max_v_samp_factor pixel rows from each
+ * row group (times any additional scale factor that the upsampler is
+ * applying).
+ *
+ * The coefficient controller will deliver data to us one iMCU row at a time;
+ * each iMCU row contains v_samp_factor * DCT_scaled_size sample rows, or
+ * exactly min_DCT_scaled_size row groups. (This amount of data corresponds
+ * to one row of MCUs when the image is fully interleaved.) Note that the
+ * number of sample rows varies across components, but the number of row
+ * groups does not. Some garbage sample rows may be included in the last iMCU
+ * row at the bottom of the image.
+ *
+ * Depending on the vertical scaling algorithm used, the upsampler may need
+ * access to the sample row(s) above and below its current input row group.
+ * The upsampler is required to set need_context_rows TRUE at global selection
+ * time if so. When need_context_rows is FALSE, this controller can simply
+ * obtain one iMCU row at a time from the coefficient controller and dole it
+ * out as row groups to the postprocessor.
+ *
+ * When need_context_rows is TRUE, this controller guarantees that the buffer
+ * passed to postprocessing contains at least one row group's worth of samples
+ * above and below the row group(s) being processed. Note that the context
+ * rows "above" the first passed row group appear at negative row offsets in
+ * the passed buffer. At the top and bottom of the image, the required
+ * context rows are manufactured by duplicating the first or last real sample
+ * row; this avoids having special cases in the upsampling inner loops.
+ *
+ * The amount of context is fixed at one row group just because that's a
+ * convenient number for this controller to work with. The existing
+ * upsamplers really only need one sample row of context. An upsampler
+ * supporting arbitrary output rescaling might wish for more than one row
+ * group of context when shrinking the image; tough, we don't handle that.
+ * (This is justified by the assumption that downsizing will be handled mostly
+ * by adjusting the DCT_scaled_size values, so that the actual scale factor at
+ * the upsample step needn't be much less than one.)
+ *
+ * To provide the desired context, we have to retain the last two row groups
+ * of one iMCU row while reading in the next iMCU row. (The last row group
+ * can't be processed until we have another row group for its below-context,
+ * and so we have to save the next-to-last group too for its above-context.)
+ * We could do this most simply by copying data around in our buffer, but
+ * that'd be very slow. We can avoid copying any data by creating a rather
+ * strange pointer structure. Here's how it works. We allocate a workspace
+ * consisting of M+2 row groups (where M = min_DCT_scaled_size is the number
+ * of row groups per iMCU row). We create two sets of redundant pointers to
+ * the workspace. Labeling the physical row groups 0 to M+1, the synthesized
+ * pointer lists look like this:
+ * M+1 M-1
+ * master pointer --> 0 master pointer --> 0
+ * 1 1
+ * ... ...
+ * M-3 M-3
+ * M-2 M
+ * M-1 M+1
+ * M M-2
+ * M+1 M-1
+ * 0 0
+ * We read alternate iMCU rows using each master pointer; thus the last two
+ * row groups of the previous iMCU row remain un-overwritten in the workspace.
+ * The pointer lists are set up so that the required context rows appear to
+ * be adjacent to the proper places when we pass the pointer lists to the
+ * upsampler.
+ *
+ * The above pictures describe the normal state of the pointer lists.
+ * At top and bottom of the image, we diddle the pointer lists to duplicate
+ * the first or last sample row as necessary (this is cheaper than copying
+ * sample rows around).
+ *
+ * This scheme breaks down if M < 2, ie, min_DCT_scaled_size is 1. In that
+ * situation each iMCU row provides only one row group so the buffering logic
+ * must be different (eg, we must read two iMCU rows before we can emit the
+ * first row group). For now, we simply do not support providing context
+ * rows when min_DCT_scaled_size is 1. That combination seems unlikely to
+ * be worth providing --- if someone wants a 1/8th-size preview, they probably
+ * want it quick and dirty, so a context-free upsampler is sufficient.
+ */
+
+
+/* Private buffer controller object */
+
+typedef struct {
+ struct jpeg_d_main_controller pub; /* public fields */
+
+ /* Pointer to allocated workspace (M or M+2 row groups). */
+ JSAMPARRAY buffer[MAX_COMPONENTS];
+
+ boolean buffer_full; /* Have we gotten an iMCU row from decoder? */
+ JDIMENSION rowgroup_ctr; /* counts row groups output to postprocessor */
+
+ /* Remaining fields are only used in the context case. */
+
+ /* These are the master pointers to the funny-order pointer lists. */
+ JSAMPIMAGE xbuffer[2]; /* pointers to weird pointer lists */
+
+ int whichptr; /* indicates which pointer set is now in use */
+ int context_state; /* process_data state machine status */
+ JDIMENSION rowgroups_avail; /* row groups available to postprocessor */
+ JDIMENSION iMCU_row_ctr; /* counts iMCU rows to detect image top/bot */
+} my_main_controller;
+
+typedef my_main_controller * my_main_ptr;
+
+/* context_state values: */
+#define CTX_PREPARE_FOR_IMCU 0 /* need to prepare for MCU row */
+#define CTX_PROCESS_IMCU 1 /* feeding iMCU to postprocessor */
+#define CTX_POSTPONED_ROW 2 /* feeding postponed row group */
+
+
+/* Forward declarations */
+METHODDEF(void) process_data_simple_main
+ JPP((j_decompress_ptr cinfo, JSAMPARRAY output_buf,
+ JDIMENSION *out_row_ctr, JDIMENSION out_rows_avail));
+METHODDEF(void) process_data_context_main
+ JPP((j_decompress_ptr cinfo, JSAMPARRAY output_buf,
+ JDIMENSION *out_row_ctr, JDIMENSION out_rows_avail));
+#ifdef QUANT_2PASS_SUPPORTED
+METHODDEF(void) process_data_crank_post
+ JPP((j_decompress_ptr cinfo, JSAMPARRAY output_buf,
+ JDIMENSION *out_row_ctr, JDIMENSION out_rows_avail));
+#endif
+
+
+LOCAL(void)
+alloc_funny_pointers (j_decompress_ptr cinfo)
+/* Allocate space for the funny pointer lists.
+ * This is done only once, not once per pass.
+ */
+{
+ my_main_ptr main = (my_main_ptr) cinfo->main;
+ int ci, rgroup;
+ int M = cinfo->min_DCT_scaled_size;
+ jpeg_component_info *compptr;
+ JSAMPARRAY xbuf;
+
+ /* Get top-level space for component array pointers.
+ * We alloc both arrays with one call to save a few cycles.
+ */
+ main->xbuffer[0] = (JSAMPIMAGE)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ cinfo->num_components * 2 * SIZEOF(JSAMPARRAY));
+ main->xbuffer[1] = main->xbuffer[0] + cinfo->num_components;
+
+ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+ ci++, compptr++) {
+ rgroup = (compptr->v_samp_factor * compptr->DCT_scaled_size) /
+ cinfo->min_DCT_scaled_size; /* height of a row group of component */
+ /* Get space for pointer lists --- M+4 row groups in each list.
+ * We alloc both pointer lists with one call to save a few cycles.
+ */
+ xbuf = (JSAMPARRAY)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ 2 * (rgroup * (M + 4)) * SIZEOF(JSAMPROW));
+ xbuf += rgroup; /* want one row group at negative offsets */
+ main->xbuffer[0][ci] = xbuf;
+ xbuf += rgroup * (M + 4);
+ main->xbuffer[1][ci] = xbuf;
+ }
+}
+
+
+LOCAL(void)
+make_funny_pointers (j_decompress_ptr cinfo)
+/* Create the funny pointer lists discussed in the comments above.
+ * The actual workspace is already allocated (in main->buffer),
+ * and the space for the pointer lists is allocated too.
+ * This routine just fills in the curiously ordered lists.
+ * This will be repeated at the beginning of each pass.
+ */
+{
+ my_main_ptr main = (my_main_ptr) cinfo->main;
+ int ci, i, rgroup;
+ int M = cinfo->min_DCT_scaled_size;
+ jpeg_component_info *compptr;
+ JSAMPARRAY buf, xbuf0, xbuf1;
+
+ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+ ci++, compptr++) {
+ rgroup = (compptr->v_samp_factor * compptr->DCT_scaled_size) /
+ cinfo->min_DCT_scaled_size; /* height of a row group of component */
+ xbuf0 = main->xbuffer[0][ci];
+ xbuf1 = main->xbuffer[1][ci];
+ /* First copy the workspace pointers as-is */
+ buf = main->buffer[ci];
+ for (i = 0; i < rgroup * (M + 2); i++) {
+ xbuf0[i] = xbuf1[i] = buf[i];
+ }
+ /* In the second list, put the last four row groups in swapped order */
+ for (i = 0; i < rgroup * 2; i++) {
+ xbuf1[rgroup*(M-2) + i] = buf[rgroup*M + i];
+ xbuf1[rgroup*M + i] = buf[rgroup*(M-2) + i];
+ }
+ /* The wraparound pointers at top and bottom will be filled later
+ * (see set_wraparound_pointers, below). Initially we want the "above"
+ * pointers to duplicate the first actual data line. This only needs
+ * to happen in xbuffer[0].
+ */
+ for (i = 0; i < rgroup; i++) {
+ xbuf0[i - rgroup] = xbuf0[0];
+ }
+ }
+}
+
+
+LOCAL(void)
+set_wraparound_pointers (j_decompress_ptr cinfo)
+/* Set up the "wraparound" pointers at top and bottom of the pointer lists.
+ * This changes the pointer list state from top-of-image to the normal state.
+ */
+{
+ my_main_ptr main = (my_main_ptr) cinfo->main;
+ int ci, i, rgroup;
+ int M = cinfo->min_DCT_scaled_size;
+ jpeg_component_info *compptr;
+ JSAMPARRAY xbuf0, xbuf1;
+
+ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+ ci++, compptr++) {
+ rgroup = (compptr->v_samp_factor * compptr->DCT_scaled_size) /
+ cinfo->min_DCT_scaled_size; /* height of a row group of component */
+ xbuf0 = main->xbuffer[0][ci];
+ xbuf1 = main->xbuffer[1][ci];
+ for (i = 0; i < rgroup; i++) {
+ xbuf0[i - rgroup] = xbuf0[rgroup*(M+1) + i];
+ xbuf1[i - rgroup] = xbuf1[rgroup*(M+1) + i];
+ xbuf0[rgroup*(M+2) + i] = xbuf0[i];
+ xbuf1[rgroup*(M+2) + i] = xbuf1[i];
+ }
+ }
+}
+
+
+LOCAL(void)
+set_bottom_pointers (j_decompress_ptr cinfo)
+/* Change the pointer lists to duplicate the last sample row at the bottom
+ * of the image. whichptr indicates which xbuffer holds the final iMCU row.
+ * Also sets rowgroups_avail to indicate number of nondummy row groups in row.
+ */
+{
+ my_main_ptr main = (my_main_ptr) cinfo->main;
+ int ci, i, rgroup, iMCUheight, rows_left;
+ jpeg_component_info *compptr;
+ JSAMPARRAY xbuf;
+
+ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+ ci++, compptr++) {
+ /* Count sample rows in one iMCU row and in one row group */
+ iMCUheight = compptr->v_samp_factor * compptr->DCT_scaled_size;
+ rgroup = iMCUheight / cinfo->min_DCT_scaled_size;
+ /* Count nondummy sample rows remaining for this component */
+ rows_left = (int) (compptr->downsampled_height % (JDIMENSION) iMCUheight);
+ if (rows_left == 0) rows_left = iMCUheight;
+ /* Count nondummy row groups. Should get same answer for each component,
+ * so we need only do it once.
+ */
+ if (ci == 0) {
+ main->rowgroups_avail = (JDIMENSION) ((rows_left-1) / rgroup + 1);
+ }
+ /* Duplicate the last real sample row rgroup*2 times; this pads out the
+ * last partial rowgroup and ensures at least one full rowgroup of context.
+ */
+ xbuf = main->xbuffer[main->whichptr][ci];
+ for (i = 0; i < rgroup * 2; i++) {
+ xbuf[rows_left + i] = xbuf[rows_left-1];
+ }
+ }
+}
+
+
+/*
+ * Initialize for a processing pass.
+ */
+
+METHODDEF(void)
+start_pass_main (j_decompress_ptr cinfo, J_BUF_MODE pass_mode)
+{
+ my_main_ptr main = (my_main_ptr) cinfo->main;
+
+ switch (pass_mode) {
+ case JBUF_PASS_THRU:
+ if (cinfo->upsample->need_context_rows) {
+ main->pub.process_data = process_data_context_main;
+ make_funny_pointers(cinfo); /* Create the xbuffer[] lists */
+ main->whichptr = 0; /* Read first iMCU row into xbuffer[0] */
+ main->context_state = CTX_PREPARE_FOR_IMCU;
+ main->iMCU_row_ctr = 0;
+ } else {
+ /* Simple case with no context needed */
+ main->pub.process_data = process_data_simple_main;
+ }
+ main->buffer_full = FALSE; /* Mark buffer empty */
+ main->rowgroup_ctr = 0;
+ break;
+#ifdef QUANT_2PASS_SUPPORTED
+ case JBUF_CRANK_DEST:
+ /* For last pass of 2-pass quantization, just crank the postprocessor */
+ main->pub.process_data = process_data_crank_post;
+ break;
+#endif
+ default:
+ ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
+ break;
+ }
+}
+
+
+/*
+ * Process some data.
+ * This handles the simple case where no context is required.
+ */
+
+METHODDEF(void)
+process_data_simple_main (j_decompress_ptr cinfo,
+ JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
+ JDIMENSION out_rows_avail)
+{
+ my_main_ptr main = (my_main_ptr) cinfo->main;
+ JDIMENSION rowgroups_avail;
+
+ /* Read input data if we haven't filled the main buffer yet */
+ if (! main->buffer_full) {
+ if (! (*cinfo->coef->decompress_data) (cinfo, main->buffer))
+ return; /* suspension forced, can do nothing more */
+ main->buffer_full = TRUE; /* OK, we have an iMCU row to work with */
+ }
+
+ /* There are always min_DCT_scaled_size row groups in an iMCU row. */
+ rowgroups_avail = (JDIMENSION) cinfo->min_DCT_scaled_size;
+ /* Note: at the bottom of the image, we may pass extra garbage row groups
+ * to the postprocessor. The postprocessor has to check for bottom
+ * of image anyway (at row resolution), so no point in us doing it too.
+ */
+
+ /* Feed the postprocessor */
+ (*cinfo->post->post_process_data) (cinfo, main->buffer,
+ &main->rowgroup_ctr, rowgroups_avail,
+ output_buf, out_row_ctr, out_rows_avail);
+
+ /* Has postprocessor consumed all the data yet? If so, mark buffer empty */
+ if (main->rowgroup_ctr >= rowgroups_avail) {
+ main->buffer_full = FALSE;
+ main->rowgroup_ctr = 0;
+ }
+}
+
+
+/*
+ * Process some data.
+ * This handles the case where context rows must be provided.
+ */
+
+METHODDEF(void)
+process_data_context_main (j_decompress_ptr cinfo,
+ JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
+ JDIMENSION out_rows_avail)
+{
+ my_main_ptr main = (my_main_ptr) cinfo->main;
+
+ /* Read input data if we haven't filled the main buffer yet */
+ if (! main->buffer_full) {
+ if (! (*cinfo->coef->decompress_data) (cinfo,
+ main->xbuffer[main->whichptr]))
+ return; /* suspension forced, can do nothing more */
+ main->buffer_full = TRUE; /* OK, we have an iMCU row to work with */
+ main->iMCU_row_ctr++; /* count rows received */
+ }
+
+ /* Postprocessor typically will not swallow all the input data it is handed
+ * in one call (due to filling the output buffer first). Must be prepared
+ * to exit and restart. This switch lets us keep track of how far we got.
+ * Note that each case falls through to the next on successful completion.
+ */
+ switch (main->context_state) {
+ case CTX_POSTPONED_ROW:
+ /* Call postprocessor using previously set pointers for postponed row */
+ (*cinfo->post->post_process_data) (cinfo, main->xbuffer[main->whichptr],
+ &main->rowgroup_ctr, main->rowgroups_avail,
+ output_buf, out_row_ctr, out_rows_avail);
+ if (main->rowgroup_ctr < main->rowgroups_avail)
+ return; /* Need to suspend */
+ main->context_state = CTX_PREPARE_FOR_IMCU;
+ if (*out_row_ctr >= out_rows_avail)
+ return; /* Postprocessor exactly filled output buf */
+ /*FALLTHROUGH*/
+ case CTX_PREPARE_FOR_IMCU:
+ /* Prepare to process first M-1 row groups of this iMCU row */
+ main->rowgroup_ctr = 0;
+ main->rowgroups_avail = (JDIMENSION) (cinfo->min_DCT_scaled_size - 1);
+ /* Check for bottom of image: if so, tweak pointers to "duplicate"
+ * the last sample row, and adjust rowgroups_avail to ignore padding rows.
+ */
+ if (main->iMCU_row_ctr == cinfo->total_iMCU_rows)
+ set_bottom_pointers(cinfo);
+ main->context_state = CTX_PROCESS_IMCU;
+ /*FALLTHROUGH*/
+ case CTX_PROCESS_IMCU:
+ /* Call postprocessor using previously set pointers */
+ (*cinfo->post->post_process_data) (cinfo, main->xbuffer[main->whichptr],
+ &main->rowgroup_ctr, main->rowgroups_avail,
+ output_buf, out_row_ctr, out_rows_avail);
+ if (main->rowgroup_ctr < main->rowgroups_avail)
+ return; /* Need to suspend */
+ /* After the first iMCU, change wraparound pointers to normal state */
+ if (main->iMCU_row_ctr == 1)
+ set_wraparound_pointers(cinfo);
+ /* Prepare to load new iMCU row using other xbuffer list */
+ main->whichptr ^= 1; /* 0=>1 or 1=>0 */
+ main->buffer_full = FALSE;
+ /* Still need to process last row group of this iMCU row, */
+ /* which is saved at index M+1 of the other xbuffer */
+ main->rowgroup_ctr = (JDIMENSION) (cinfo->min_DCT_scaled_size + 1);
+ main->rowgroups_avail = (JDIMENSION) (cinfo->min_DCT_scaled_size + 2);
+ main->context_state = CTX_POSTPONED_ROW;
+ }
+}
+
+
+/*
+ * Process some data.
+ * Final pass of two-pass quantization: just call the postprocessor.
+ * Source data will be the postprocessor controller's internal buffer.
+ */
+
+#ifdef QUANT_2PASS_SUPPORTED
+
+METHODDEF(void)
+process_data_crank_post (j_decompress_ptr cinfo,
+ JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
+ JDIMENSION out_rows_avail)
+{
+ (*cinfo->post->post_process_data) (cinfo, (JSAMPIMAGE) NULL,
+ (JDIMENSION *) NULL, (JDIMENSION) 0,
+ output_buf, out_row_ctr, out_rows_avail);
+}
+
+#endif /* QUANT_2PASS_SUPPORTED */
+
+
+/*
+ * Initialize main buffer controller.
+ */
+
+GLOBAL(void)
+jinit_d_main_controller (j_decompress_ptr cinfo, boolean need_full_buffer)
+{
+ my_main_ptr main;
+ int ci, rgroup, ngroups;
+ jpeg_component_info *compptr;
+
+ main = (my_main_ptr)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ SIZEOF(my_main_controller));
+ cinfo->main = (struct jpeg_d_main_controller *) main;
+ main->pub.start_pass = start_pass_main;
+
+ if (need_full_buffer) /* shouldn't happen */
+ ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
+
+ /* Allocate the workspace.
+ * ngroups is the number of row groups we need.
+ */
+ if (cinfo->upsample->need_context_rows) {
+ if (cinfo->min_DCT_scaled_size < 2) /* unsupported, see comments above */
+ ERREXIT(cinfo, JERR_NOTIMPL);
+ alloc_funny_pointers(cinfo); /* Alloc space for xbuffer[] lists */
+ ngroups = cinfo->min_DCT_scaled_size + 2;
+ } else {
+ ngroups = cinfo->min_DCT_scaled_size;
+ }
+
+ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+ ci++, compptr++) {
+ rgroup = (compptr->v_samp_factor * compptr->DCT_scaled_size) /
+ cinfo->min_DCT_scaled_size; /* height of a row group of component */
+ main->buffer[ci] = (*cinfo->mem->alloc_sarray)
+ ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ compptr->width_in_blocks * compptr->DCT_scaled_size,
+ (JDIMENSION) (rgroup * ngroups));
+ }
+}
+
+#endif //_FX_JPEG_TURBO_
diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jdmarker.c b/core/src/fxcodec/libjpeg/fpdfapi_jdmarker.c
index 60f2139f58..bcd017f920 100644
--- a/core/src/fxcodec/libjpeg/fpdfapi_jdmarker.c
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jdmarker.c
@@ -1,1396 +1,1396 @@
-#if !defined(_FX_JPEG_TURBO_)
-/*
- * jdmarker.c
- *
- * Copyright (C) 1991-1998, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains routines to decode JPEG datastream markers.
- * Most of the complexity arises from our desire to support input
- * suspension: if not all of the data for a marker is available,
- * we must exit back to the application. On resumption, we reprocess
- * the marker.
- */
-
-#define JPEG_INTERNALS
-#include "jinclude.h"
-#include "jpeglib.h"
-
-
-typedef enum { /* JPEG marker codes */
- M_SOF0 = 0xc0,
- M_SOF1 = 0xc1,
- M_SOF2 = 0xc2,
- M_SOF3 = 0xc3,
-
- M_SOF5 = 0xc5,
- M_SOF6 = 0xc6,
- M_SOF7 = 0xc7,
-
- M_JPG = 0xc8,
- M_SOF9 = 0xc9,
- M_SOF10 = 0xca,
- M_SOF11 = 0xcb,
-
- M_SOF13 = 0xcd,
- M_SOF14 = 0xce,
- M_SOF15 = 0xcf,
-
- M_DHT = 0xc4,
-
- M_DAC = 0xcc,
-
- M_RST0 = 0xd0,
- M_RST1 = 0xd1,
- M_RST2 = 0xd2,
- M_RST3 = 0xd3,
- M_RST4 = 0xd4,
- M_RST5 = 0xd5,
- M_RST6 = 0xd6,
- M_RST7 = 0xd7,
-
- M_SOI = 0xd8,
- M_EOI = 0xd9,
- M_SOS = 0xda,
- M_DQT = 0xdb,
- M_DNL = 0xdc,
- M_DRI = 0xdd,
- M_DHP = 0xde,
- M_EXP = 0xdf,
-
- M_APP0 = 0xe0,
- M_APP1 = 0xe1,
- M_APP2 = 0xe2,
- M_APP3 = 0xe3,
- M_APP4 = 0xe4,
- M_APP5 = 0xe5,
- M_APP6 = 0xe6,
- M_APP7 = 0xe7,
- M_APP8 = 0xe8,
- M_APP9 = 0xe9,
- M_APP10 = 0xea,
- M_APP11 = 0xeb,
- M_APP12 = 0xec,
- M_APP13 = 0xed,
- M_APP14 = 0xee,
- M_APP15 = 0xef,
-
- M_JPG0 = 0xf0,
- M_JPG13 = 0xfd,
- M_COM = 0xfe,
-
- M_TEM = 0x01,
-
- M_ERROR = 0x100
-} JPEG_MARKER;
-
-
-/* Private state */
-
-typedef struct {
- struct jpeg_marker_reader pub; /* public fields */
-
- /* Application-overridable marker processing methods */
- jpeg_marker_parser_method process_COM;
- jpeg_marker_parser_method process_APPn[16];
-
- /* Limit on marker data length to save for each marker type */
- unsigned int length_limit_COM;
- unsigned int length_limit_APPn[16];
-
- /* Status of COM/APPn marker saving */
- jpeg_saved_marker_ptr cur_marker; /* NULL if not processing a marker */
- unsigned int bytes_read; /* data bytes read so far in marker */
- /* Note: cur_marker is not linked into marker_list until it's all read. */
-} my_marker_reader;
-
-typedef my_marker_reader * my_marker_ptr;
-
-
-/*
- * Macros for fetching data from the data source module.
- *
- * At all times, cinfo->src->next_input_byte and ->bytes_in_buffer reflect
- * the current restart point; we update them only when we have reached a
- * suitable place to restart if a suspension occurs.
- */
-
-/* Declare and initialize local copies of input pointer/count */
-#define INPUT_VARS(cinfo) \
- struct jpeg_source_mgr * datasrc = (cinfo)->src; \
- const JOCTET * next_input_byte = datasrc->next_input_byte; \
- size_t bytes_in_buffer = datasrc->bytes_in_buffer
-
-/* Unload the local copies --- do this only at a restart boundary */
-#define INPUT_SYNC(cinfo) \
- ( datasrc->next_input_byte = next_input_byte, \
- datasrc->bytes_in_buffer = bytes_in_buffer )
-
-/* Reload the local copies --- used only in MAKE_BYTE_AVAIL */
-#define INPUT_RELOAD(cinfo) \
- ( next_input_byte = datasrc->next_input_byte, \
- bytes_in_buffer = datasrc->bytes_in_buffer )
-
-/* Internal macro for INPUT_BYTE and INPUT_2BYTES: make a byte available.
- * Note we do *not* do INPUT_SYNC before calling fill_input_buffer,
- * but we must reload the local copies after a successful fill.
- */
-#define MAKE_BYTE_AVAIL(cinfo,action) \
- if (bytes_in_buffer == 0) { \
- if (! (*datasrc->fill_input_buffer) (cinfo)) \
- { action; } \
- INPUT_RELOAD(cinfo); \
- }
-
-/* Read a byte into variable V.
- * If must suspend, take the specified action (typically "return FALSE").
- */
-#define INPUT_BYTE(cinfo,V,action) \
- MAKESTMT( MAKE_BYTE_AVAIL(cinfo,action); \
- bytes_in_buffer--; \
- V = GETJOCTET(*next_input_byte++); )
-
-/* As above, but read two bytes interpreted as an unsigned 16-bit integer.
- * V should be declared unsigned int or perhaps INT32.
- */
-#define INPUT_2BYTES(cinfo,V,action) \
- MAKESTMT( MAKE_BYTE_AVAIL(cinfo,action); \
- bytes_in_buffer--; \
- V = ((unsigned int) GETJOCTET(*next_input_byte++)) << 8; \
- MAKE_BYTE_AVAIL(cinfo,action); \
- bytes_in_buffer--; \
- V += GETJOCTET(*next_input_byte++); )
-
-
-/*
- * Routines to process JPEG markers.
- *
- * Entry condition: JPEG marker itself has been read and its code saved
- * in cinfo->unread_marker; input restart point is just after the marker.
- *
- * Exit: if return TRUE, have read and processed any parameters, and have
- * updated the restart point to point after the parameters.
- * If return FALSE, was forced to suspend before reaching end of
- * marker parameters; restart point has not been moved. Same routine
- * will be called again after application supplies more input data.
- *
- * This approach to suspension assumes that all of a marker's parameters
- * can fit into a single input bufferload. This should hold for "normal"
- * markers. Some COM/APPn markers might have large parameter segments
- * that might not fit. If we are simply dropping such a marker, we use
- * skip_input_data to get past it, and thereby put the problem on the
- * source manager's shoulders. If we are saving the marker's contents
- * into memory, we use a slightly different convention: when forced to
- * suspend, the marker processor updates the restart point to the end of
- * what it's consumed (ie, the end of the buffer) before returning FALSE.
- * On resumption, cinfo->unread_marker still contains the marker code,
- * but the data source will point to the next chunk of marker data.
- * The marker processor must retain internal state to deal with this.
- *
- * Note that we don't bother to avoid duplicate trace messages if a
- * suspension occurs within marker parameters. Other side effects
- * require more care.
- */
-
-
-LOCAL(boolean)
-get_soi (j_decompress_ptr cinfo)
-/* Process an SOI marker */
-{
- int i;
-
- TRACEMS(cinfo, 1, JTRC_SOI);
-
- if (cinfo->marker->saw_SOI)
- ERREXIT(cinfo, JERR_SOI_DUPLICATE);
-
- /* Reset all parameters that are defined to be reset by SOI */
-
- for (i = 0; i < NUM_ARITH_TBLS; i++) {
- cinfo->arith_dc_L[i] = 0;
- cinfo->arith_dc_U[i] = 1;
- cinfo->arith_ac_K[i] = 5;
- }
- cinfo->restart_interval = 0;
-
- /* Set initial assumptions for colorspace etc */
-
- cinfo->jpeg_color_space = JCS_UNKNOWN;
- cinfo->CCIR601_sampling = FALSE; /* Assume non-CCIR sampling??? */
-
- cinfo->saw_JFIF_marker = FALSE;
- cinfo->JFIF_major_version = 1; /* set default JFIF APP0 values */
- cinfo->JFIF_minor_version = 1;
- cinfo->density_unit = 0;
- cinfo->X_density = 1;
- cinfo->Y_density = 1;
- cinfo->saw_Adobe_marker = FALSE;
- cinfo->Adobe_transform = 0;
-
- cinfo->marker->saw_SOI = TRUE;
-
- return TRUE;
-}
-
-
-LOCAL(boolean)
-get_sof (j_decompress_ptr cinfo, boolean is_prog, boolean is_arith)
-/* Process a SOFn marker */
-{
- INT32 length;
- int c, ci;
- jpeg_component_info * compptr;
- /* LiuSunliang added 20111209 */
- JDIMENSION image_width, image_height;
- INPUT_VARS(cinfo);
-
- cinfo->progressive_mode = is_prog;
- cinfo->arith_code = is_arith;
-
- INPUT_2BYTES(cinfo, length, return FALSE);
-
- INPUT_BYTE(cinfo, cinfo->data_precision, return FALSE);
- INPUT_2BYTES(cinfo, image_height, return FALSE);
- INPUT_2BYTES(cinfo, image_width, return FALSE);
- INPUT_BYTE(cinfo, cinfo->num_components, return FALSE);
-
- if (image_width <= JPEG_MAX_DIMENSION)
- cinfo->image_width = image_width;
-
- if (image_height <= JPEG_MAX_DIMENSION)
- cinfo->image_height = image_height;
-
- length -= 8;
-
- TRACEMS4(cinfo, 1, JTRC_SOF, cinfo->unread_marker,
- (int) cinfo->image_width, (int) cinfo->image_height,
- cinfo->num_components);
-
- if (cinfo->marker->saw_SOF)
- ERREXIT(cinfo, JERR_SOF_DUPLICATE);
-
- /* We don't support files in which the image height is initially specified */
- /* as 0 and is later redefined by DNL. As long as we have to check that, */
- /* might as well have a general sanity check. */
- if (cinfo->image_height <= 0 || cinfo->image_width <= 0
- || cinfo->num_components <= 0)
- ERREXIT(cinfo, JERR_EMPTY_IMAGE);
-
- if (length != (cinfo->num_components * 3))
- ERREXIT(cinfo, JERR_BAD_LENGTH);
-
- if (cinfo->comp_info == NULL) /* do only once, even if suspend */
- cinfo->comp_info = (jpeg_component_info *) (*cinfo->mem->alloc_small)
- ((j_common_ptr) cinfo, JPOOL_IMAGE,
- cinfo->num_components * SIZEOF(jpeg_component_info));
-
- for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
- ci++, compptr++) {
- compptr->component_index = ci;
- INPUT_BYTE(cinfo, compptr->component_id, return FALSE);
- /* XYQ 2008-03-25: Adobe CMYK JPEG has serious flaw: the K channel has same component id as C channel */
- {
- int i;
- for (i = 0; i < ci; i ++)
- if (compptr->component_id == cinfo->comp_info[i].component_id) break;
- if (i < ci)
- /* Found the error! We replace the id with something unlikely used elsewhere */
- compptr->component_id += 0xf0;
- }
- /* end of modification */
- INPUT_BYTE(cinfo, c, return FALSE);
- compptr->h_samp_factor = (c >> 4) & 15;
- compptr->v_samp_factor = (c ) & 15;
- INPUT_BYTE(cinfo, compptr->quant_tbl_no, return FALSE);
-
- TRACEMS4(cinfo, 1, JTRC_SOF_COMPONENT,
- compptr->component_id, compptr->h_samp_factor,
- compptr->v_samp_factor, compptr->quant_tbl_no);
- }
-
- cinfo->marker->saw_SOF = TRUE;
-
- INPUT_SYNC(cinfo);
- return TRUE;
-}
-
-
-LOCAL(boolean)
-get_sos (j_decompress_ptr cinfo)
-/* Process a SOS marker */
-{
- INT32 length;
- int i, ci, n, c, cc;
- jpeg_component_info * compptr;
- INPUT_VARS(cinfo);
-
- if (! cinfo->marker->saw_SOF)
- ERREXIT(cinfo, JERR_SOS_NO_SOF);
-
- INPUT_2BYTES(cinfo, length, return FALSE);
-
- INPUT_BYTE(cinfo, n, return FALSE); /* Number of components */
-
- TRACEMS1(cinfo, 1, JTRC_SOS, n);
-
- if (length != (n * 2 + 6) || n < 1 || n > MAX_COMPS_IN_SCAN)
- ERREXIT(cinfo, JERR_BAD_LENGTH);
-
- cinfo->comps_in_scan = n;
-
- /* Collect the component-spec parameters */
-
- for (i = 0; i < n; i++) {
- INPUT_BYTE(cinfo, cc, return FALSE);
- INPUT_BYTE(cinfo, c, return FALSE);
-
- /* XYQ 2008-03-25: Adobe CMYK JPEG has serious flaw: the K channel has same component id as C channel */
- {
- int j;
- for (j = 0; j < i; j ++)
- if (cc == cinfo->cur_comp_info[j]->component_id) break;
- if (j < i)
- /* found the error! */
- cc += 0xf0;
- }
- /* end of modification */
- for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
- ci++, compptr++) {
- if (cc == compptr->component_id)
- goto id_found;
- }
-
- ERREXIT1(cinfo, JERR_BAD_COMPONENT_ID, cc);
-
- id_found:
-
- cinfo->cur_comp_info[i] = compptr;
- compptr->dc_tbl_no = (c >> 4) & 15;
- compptr->ac_tbl_no = (c ) & 15;
-
- TRACEMS3(cinfo, 1, JTRC_SOS_COMPONENT, cc,
- compptr->dc_tbl_no, compptr->ac_tbl_no);
- /* This CSi (cc) should differ from the previous CSi */
- for (ci = 0; ci < i; ci++) {
- if (cinfo->cur_comp_info[ci] == compptr)
- ERREXIT1(cinfo, JERR_BAD_COMPONENT_ID, cc);
- }
- }
-
- /* Collect the additional scan parameters Ss, Se, Ah/Al. */
- INPUT_BYTE(cinfo, c, return FALSE);
- cinfo->Ss = c;
- INPUT_BYTE(cinfo, c, return FALSE);
- cinfo->Se = c;
- INPUT_BYTE(cinfo, c, return FALSE);
- cinfo->Ah = (c >> 4) & 15;
- cinfo->Al = (c ) & 15;
-
- TRACEMS4(cinfo, 1, JTRC_SOS_PARAMS, cinfo->Ss, cinfo->Se,
- cinfo->Ah, cinfo->Al);
-
- /* Prepare to scan data & restart markers */
- cinfo->marker->next_restart_num = 0;
-
- /* Count another SOS marker */
- cinfo->input_scan_number++;
-
- INPUT_SYNC(cinfo);
- return TRUE;
-}
-
-
-#ifdef D_ARITH_CODING_SUPPORTED
-
-LOCAL(boolean)
-get_dac (j_decompress_ptr cinfo)
-/* Process a DAC marker */
-{
- INT32 length;
- int index, val;
- INPUT_VARS(cinfo);
-
- INPUT_2BYTES(cinfo, length, return FALSE);
- length -= 2;
-
- while (length > 0) {
- INPUT_BYTE(cinfo, index, return FALSE);
- INPUT_BYTE(cinfo, val, return FALSE);
-
- length -= 2;
-
- TRACEMS2(cinfo, 1, JTRC_DAC, index, val);
-
- if (index < 0 || index >= (2*NUM_ARITH_TBLS))
- ERREXIT1(cinfo, JERR_DAC_INDEX, index);
-
- if (index >= NUM_ARITH_TBLS) { /* define AC table */
- cinfo->arith_ac_K[index-NUM_ARITH_TBLS] = (UINT8) val;
- } else { /* define DC table */
- cinfo->arith_dc_L[index] = (UINT8) (val & 0x0F);
- cinfo->arith_dc_U[index] = (UINT8) (val >> 4);
- if (cinfo->arith_dc_L[index] > cinfo->arith_dc_U[index])
- ERREXIT1(cinfo, JERR_DAC_VALUE, val);
- }
- }
-
- if (length != 0)
- ERREXIT(cinfo, JERR_BAD_LENGTH);
-
- INPUT_SYNC(cinfo);
- return TRUE;
-}
-
-#else /* ! D_ARITH_CODING_SUPPORTED */
-
-#define get_dac(cinfo) skip_variable(cinfo)
-
-#endif /* D_ARITH_CODING_SUPPORTED */
-
-
-LOCAL(boolean)
-get_dht (j_decompress_ptr cinfo)
-/* Process a DHT marker */
-{
- INT32 length;
- UINT8 bits[17];
- UINT8 huffval[256];
- int i, index, count;
- JHUFF_TBL **htblptr;
- INPUT_VARS(cinfo);
-
- INPUT_2BYTES(cinfo, length, return FALSE);
- length -= 2;
-
- while (length > 16) {
- INPUT_BYTE(cinfo, index, return FALSE);
-
- TRACEMS1(cinfo, 1, JTRC_DHT, index);
-
- bits[0] = 0;
- count = 0;
- for (i = 1; i <= 16; i++) {
- INPUT_BYTE(cinfo, bits[i], return FALSE);
- count += bits[i];
- }
-
- length -= 1 + 16;
-
- TRACEMS8(cinfo, 2, JTRC_HUFFBITS,
- bits[1], bits[2], bits[3], bits[4],
- bits[5], bits[6], bits[7], bits[8]);
- TRACEMS8(cinfo, 2, JTRC_HUFFBITS,
- bits[9], bits[10], bits[11], bits[12],
- bits[13], bits[14], bits[15], bits[16]);
-
- /* Here we just do minimal validation of the counts to avoid walking
- * off the end of our table space. jdhuff.c will check more carefully.
- */
- if (count > 256 || ((INT32) count) > length)
- ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
-
- for (i = 0; i < count; i++)
- INPUT_BYTE(cinfo, huffval[i], return FALSE);
-
- length -= count;
-
- if (index & 0x10) { /* AC table definition */
- index -= 0x10;
- htblptr = &cinfo->ac_huff_tbl_ptrs[index];
- } else { /* DC table definition */
- htblptr = &cinfo->dc_huff_tbl_ptrs[index];
- }
-
- if (index < 0 || index >= NUM_HUFF_TBLS)
- ERREXIT1(cinfo, JERR_DHT_INDEX, index);
-
- if (*htblptr == NULL)
- *htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo);
-
- MEMCOPY((*htblptr)->bits, bits, SIZEOF((*htblptr)->bits));
- MEMCOPY((*htblptr)->huffval, huffval, SIZEOF((*htblptr)->huffval));
- }
-
- if (length != 0)
- ERREXIT(cinfo, JERR_BAD_LENGTH);
-
- INPUT_SYNC(cinfo);
- return TRUE;
-}
-
-
-LOCAL(boolean)
-get_dqt (j_decompress_ptr cinfo)
-/* Process a DQT marker */
-{
- INT32 length;
- int n, i, prec;
- unsigned int tmp;
- JQUANT_TBL *quant_ptr;
- INPUT_VARS(cinfo);
-
- INPUT_2BYTES(cinfo, length, return FALSE);
- length -= 2;
-
- while (length > 0) {
- INPUT_BYTE(cinfo, n, return FALSE);
- prec = n >> 4;
- n &= 0x0F;
-
- TRACEMS2(cinfo, 1, JTRC_DQT, n, prec);
-
- if (n >= NUM_QUANT_TBLS)
- ERREXIT1(cinfo, JERR_DQT_INDEX, n);
-
- if (cinfo->quant_tbl_ptrs[n] == NULL)
- cinfo->quant_tbl_ptrs[n] = jpeg_alloc_quant_table((j_common_ptr) cinfo);
- quant_ptr = cinfo->quant_tbl_ptrs[n];
-
- for (i = 0; i < DCTSIZE2; i++) {
- if (prec)
- INPUT_2BYTES(cinfo, tmp, return FALSE);
- else
- INPUT_BYTE(cinfo, tmp, return FALSE);
- /* We convert the zigzag-order table to natural array order. */
- quant_ptr->quantval[jpeg_natural_order[i]] = (UINT16) tmp;
- }
-
- if (cinfo->err->trace_level >= 2) {
- for (i = 0; i < DCTSIZE2; i += 8) {
- TRACEMS8(cinfo, 2, JTRC_QUANTVALS,
- quant_ptr->quantval[i], quant_ptr->quantval[i+1],
- quant_ptr->quantval[i+2], quant_ptr->quantval[i+3],
- quant_ptr->quantval[i+4], quant_ptr->quantval[i+5],
- quant_ptr->quantval[i+6], quant_ptr->quantval[i+7]);
- }
- }
-
- length -= DCTSIZE2+1;
- if (prec) length -= DCTSIZE2;
- }
-
- if (length != 0)
- ERREXIT(cinfo, JERR_BAD_LENGTH);
-
- INPUT_SYNC(cinfo);
- return TRUE;
-}
-
-
-LOCAL(boolean)
-get_dri (j_decompress_ptr cinfo)
-/* Process a DRI marker */
-{
- INT32 length;
- unsigned int tmp;
- INPUT_VARS(cinfo);
-
- INPUT_2BYTES(cinfo, length, return FALSE);
-
- if (length != 4)
- ERREXIT(cinfo, JERR_BAD_LENGTH);
-
- INPUT_2BYTES(cinfo, tmp, return FALSE);
-
- TRACEMS1(cinfo, 1, JTRC_DRI, tmp);
-
- cinfo->restart_interval = tmp;
-
- INPUT_SYNC(cinfo);
- return TRUE;
-}
-
-
-/*
- * Routines for processing APPn and COM markers.
- * These are either saved in memory or discarded, per application request.
- * APP0 and APP14 are specially checked to see if they are
- * JFIF and Adobe markers, respectively.
- */
-
-#define APP0_DATA_LEN 14 /* Length of interesting data in APP0 */
-#define APP14_DATA_LEN 12 /* Length of interesting data in APP14 */
-#define APPN_DATA_LEN 14 /* Must be the largest of the above!! */
-
-
-LOCAL(void)
-examine_app0 (j_decompress_ptr cinfo, JOCTET FAR * data,
- unsigned int datalen, INT32 remaining)
-/* Examine first few bytes from an APP0.
- * Take appropriate action if it is a JFIF marker.
- * datalen is # of bytes at data[], remaining is length of rest of marker data.
- */
-{
- INT32 totallen = (INT32) datalen + remaining;
-
- if (datalen >= APP0_DATA_LEN &&
- GETJOCTET(data[0]) == 0x4A &&
- GETJOCTET(data[1]) == 0x46 &&
- GETJOCTET(data[2]) == 0x49 &&
- GETJOCTET(data[3]) == 0x46 &&
- GETJOCTET(data[4]) == 0) {
- /* Found JFIF APP0 marker: save info */
- cinfo->saw_JFIF_marker = TRUE;
- cinfo->JFIF_major_version = GETJOCTET(data[5]);
- cinfo->JFIF_minor_version = GETJOCTET(data[6]);
- cinfo->density_unit = GETJOCTET(data[7]);
- cinfo->X_density = (GETJOCTET(data[8]) << 8) + GETJOCTET(data[9]);
- cinfo->Y_density = (GETJOCTET(data[10]) << 8) + GETJOCTET(data[11]);
- /* Check version.
- * Major version must be 1, anything else signals an incompatible change.
- * (We used to treat this as an error, but now it's a nonfatal warning,
- * because some bozo at Hijaak couldn't read the spec.)
- * Minor version should be 0..2, but process anyway if newer.
- */
- if (cinfo->JFIF_major_version != 1)
- WARNMS2(cinfo, JWRN_JFIF_MAJOR,
- cinfo->JFIF_major_version, cinfo->JFIF_minor_version);
- /* Generate trace messages */
- TRACEMS5(cinfo, 1, JTRC_JFIF,
- cinfo->JFIF_major_version, cinfo->JFIF_minor_version,
- cinfo->X_density, cinfo->Y_density, cinfo->density_unit);
- /* Validate thumbnail dimensions and issue appropriate messages */
- if (GETJOCTET(data[12]) | GETJOCTET(data[13]))
- TRACEMS2(cinfo, 1, JTRC_JFIF_THUMBNAIL,
- GETJOCTET(data[12]), GETJOCTET(data[13]));
- totallen -= APP0_DATA_LEN;
- if (totallen !=
- ((INT32)GETJOCTET(data[12]) * (INT32)GETJOCTET(data[13]) * (INT32) 3))
- TRACEMS1(cinfo, 1, JTRC_JFIF_BADTHUMBNAILSIZE, (int) totallen);
- } else if (datalen >= 6 &&
- GETJOCTET(data[0]) == 0x4A &&
- GETJOCTET(data[1]) == 0x46 &&
- GETJOCTET(data[2]) == 0x58 &&
- GETJOCTET(data[3]) == 0x58 &&
- GETJOCTET(data[4]) == 0) {
- /* Found JFIF "JFXX" extension APP0 marker */
- /* The library doesn't actually do anything with these,
- * but we try to produce a helpful trace message.
- */
- switch (GETJOCTET(data[5])) {
- case 0x10:
- TRACEMS1(cinfo, 1, JTRC_THUMB_JPEG, (int) totallen);
- break;
- case 0x11:
- TRACEMS1(cinfo, 1, JTRC_THUMB_PALETTE, (int) totallen);
- break;
- case 0x13:
- TRACEMS1(cinfo, 1, JTRC_THUMB_RGB, (int) totallen);
- break;
- default:
- TRACEMS2(cinfo, 1, JTRC_JFIF_EXTENSION,
- GETJOCTET(data[5]), (int) totallen);
- break;
- }
- } else {
- /* Start of APP0 does not match "JFIF" or "JFXX", or too short */
- TRACEMS1(cinfo, 1, JTRC_APP0, (int) totallen);
- }
-}
-
-
-LOCAL(void)
-examine_app14 (j_decompress_ptr cinfo, JOCTET FAR * data,
- unsigned int datalen, INT32 remaining)
-/* Examine first few bytes from an APP14.
- * Take appropriate action if it is an Adobe marker.
- * datalen is # of bytes at data[], remaining is length of rest of marker data.
- */
-{
- unsigned int version, flags0, flags1, transform;
-
- if (datalen >= APP14_DATA_LEN &&
- GETJOCTET(data[0]) == 0x41 &&
- GETJOCTET(data[1]) == 0x64 &&
- GETJOCTET(data[2]) == 0x6F &&
- GETJOCTET(data[3]) == 0x62 &&
- GETJOCTET(data[4]) == 0x65) {
- /* Found Adobe APP14 marker */
- version = (GETJOCTET(data[5]) << 8) + GETJOCTET(data[6]);
- flags0 = (GETJOCTET(data[7]) << 8) + GETJOCTET(data[8]);
- flags1 = (GETJOCTET(data[9]) << 8) + GETJOCTET(data[10]);
- transform = GETJOCTET(data[11]);
- TRACEMS4(cinfo, 1, JTRC_ADOBE, version, flags0, flags1, transform);
- cinfo->saw_Adobe_marker = TRUE;
- cinfo->Adobe_transform = (UINT8) transform;
- } else {
- /* Start of APP14 does not match "Adobe", or too short */
- TRACEMS1(cinfo, 1, JTRC_APP14, (int) (datalen + remaining));
- }
-}
-
-
-METHODDEF(boolean)
-get_interesting_appn (j_decompress_ptr cinfo)
-/* Process an APP0 or APP14 marker without saving it */
-{
- INT32 length;
- JOCTET b[APPN_DATA_LEN];
- unsigned int i, numtoread;
- INPUT_VARS(cinfo);
-
- INPUT_2BYTES(cinfo, length, return FALSE);
- length -= 2;
-
- /* get the interesting part of the marker data */
- if (length >= APPN_DATA_LEN)
- numtoread = APPN_DATA_LEN;
- else if (length > 0)
- numtoread = (unsigned int) length;
- else
- numtoread = 0;
- for (i = 0; i < numtoread; i++)
- INPUT_BYTE(cinfo, b[i], return FALSE);
- length -= numtoread;
-
- /* process it */
- switch (cinfo->unread_marker) {
- case M_APP0:
- examine_app0(cinfo, (JOCTET FAR *) b, numtoread, length);
- break;
- case M_APP14:
- examine_app14(cinfo, (JOCTET FAR *) b, numtoread, length);
- break;
- default:
- /* can't get here unless jpeg_save_markers chooses wrong processor */
- ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, cinfo->unread_marker);
- break;
- }
-
- /* skip any remaining data -- could be lots */
- INPUT_SYNC(cinfo);
- if (length > 0)
- (*cinfo->src->skip_input_data) (cinfo, (long) length);
-
- return TRUE;
-}
-
-
-#ifdef SAVE_MARKERS_SUPPORTED
-
-METHODDEF(boolean)
-save_marker (j_decompress_ptr cinfo)
-/* Save an APPn or COM marker into the marker list */
-{
- my_marker_ptr marker = (my_marker_ptr) cinfo->marker;
- jpeg_saved_marker_ptr cur_marker = marker->cur_marker;
- unsigned int bytes_read, data_length;
- JOCTET FAR * data;
- INT32 length = 0;
- INPUT_VARS(cinfo);
-
- if (cur_marker == NULL) {
- /* begin reading a marker */
- INPUT_2BYTES(cinfo, length, return FALSE);
- length -= 2;
- if (length >= 0) { /* watch out for bogus length word */
- /* figure out how much we want to save */
- unsigned int limit;
- if (cinfo->unread_marker == (int) M_COM)
- limit = marker->length_limit_COM;
- else
- limit = marker->length_limit_APPn[cinfo->unread_marker - (int) M_APP0];
- if ((unsigned int) length < limit)
- limit = (unsigned int) length;
- /* allocate and initialize the marker item */
- cur_marker = (jpeg_saved_marker_ptr)
- (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE,
- SIZEOF(struct jpeg_marker_struct) + limit);
- cur_marker->next = NULL;
- cur_marker->marker = (UINT8) cinfo->unread_marker;
- cur_marker->original_length = (unsigned int) length;
- cur_marker->data_length = limit;
- /* data area is just beyond the jpeg_marker_struct */
- data = cur_marker->data = (JOCTET FAR *) (cur_marker + 1);
- marker->cur_marker = cur_marker;
- marker->bytes_read = 0;
- bytes_read = 0;
- data_length = limit;
- } else {
- /* deal with bogus length word */
- bytes_read = data_length = 0;
- data = NULL;
- }
- } else {
- /* resume reading a marker */
- bytes_read = marker->bytes_read;
- data_length = cur_marker->data_length;
- data = cur_marker->data + bytes_read;
- }
-
- while (bytes_read < data_length) {
- INPUT_SYNC(cinfo); /* move the restart point to here */
- marker->bytes_read = bytes_read;
- /* If there's not at least one byte in buffer, suspend */
- MAKE_BYTE_AVAIL(cinfo, return FALSE);
- /* Copy bytes with reasonable rapidity */
- while (bytes_read < data_length && bytes_in_buffer > 0) {
- *data++ = *next_input_byte++;
- bytes_in_buffer--;
- bytes_read++;
- }
- }
-
- /* Done reading what we want to read */
- if (cur_marker != NULL) { /* will be NULL if bogus length word */
- /* Add new marker to end of list */
- if (cinfo->marker_list == NULL) {
- cinfo->marker_list = cur_marker;
- } else {
- jpeg_saved_marker_ptr prev = cinfo->marker_list;
- while (prev->next != NULL)
- prev = prev->next;
- prev->next = cur_marker;
- }
- /* Reset pointer & calc remaining data length */
- data = cur_marker->data;
- length = cur_marker->original_length - data_length;
- }
- /* Reset to initial state for next marker */
- marker->cur_marker = NULL;
-
- /* Process the marker if interesting; else just make a generic trace msg */
- switch (cinfo->unread_marker) {
- case M_APP0:
- examine_app0(cinfo, data, data_length, length);
- break;
- case M_APP14:
- examine_app14(cinfo, data, data_length, length);
- break;
- default:
- TRACEMS2(cinfo, 1, JTRC_MISC_MARKER, cinfo->unread_marker,
- (int) (data_length + length));
- break;
- }
-
- /* skip any remaining data -- could be lots */
- INPUT_SYNC(cinfo); /* do before skip_input_data */
- if (length > 0)
- (*cinfo->src->skip_input_data) (cinfo, (long) length);
-
- return TRUE;
-}
-
-#endif /* SAVE_MARKERS_SUPPORTED */
-
-
-METHODDEF(boolean)
-skip_variable (j_decompress_ptr cinfo)
-/* Skip over an unknown or uninteresting variable-length marker */
-{
- INT32 length;
- INPUT_VARS(cinfo);
-
- INPUT_2BYTES(cinfo, length, return FALSE);
- length -= 2;
-
- TRACEMS2(cinfo, 1, JTRC_MISC_MARKER, cinfo->unread_marker, (int) length);
-
- INPUT_SYNC(cinfo); /* do before skip_input_data */
- if (length > 0)
- (*cinfo->src->skip_input_data) (cinfo, (long) length);
-
- return TRUE;
-}
-
-
-/*
- * Find the next JPEG marker, save it in cinfo->unread_marker.
- * Returns FALSE if had to suspend before reaching a marker;
- * in that case cinfo->unread_marker is unchanged.
- *
- * Note that the result might not be a valid marker code,
- * but it will never be 0 or FF.
- */
-
-LOCAL(boolean)
-next_marker (j_decompress_ptr cinfo)
-{
- int c;
- INPUT_VARS(cinfo);
-
- for (;;) {
- INPUT_BYTE(cinfo, c, return FALSE);
- /* Skip any non-FF bytes.
- * This may look a bit inefficient, but it will not occur in a valid file.
- * We sync after each discarded byte so that a suspending data source
- * can discard the byte from its buffer.
- */
- while (c != 0xFF) {
- cinfo->marker->discarded_bytes++;
- INPUT_SYNC(cinfo);
- INPUT_BYTE(cinfo, c, return FALSE);
- }
- /* This loop swallows any duplicate FF bytes. Extra FFs are legal as
- * pad bytes, so don't count them in discarded_bytes. We assume there
- * will not be so many consecutive FF bytes as to overflow a suspending
- * data source's input buffer.
- */
- do {
- INPUT_BYTE(cinfo, c, return FALSE);
- } while (c == 0xFF);
- if (c != 0)
- break; /* found a valid marker, exit loop */
- /* Reach here if we found a stuffed-zero data sequence (FF/00).
- * Discard it and loop back to try again.
- */
- cinfo->marker->discarded_bytes += 2;
- INPUT_SYNC(cinfo);
- }
-
- if (cinfo->marker->discarded_bytes != 0) {
- WARNMS2(cinfo, JWRN_EXTRANEOUS_DATA, cinfo->marker->discarded_bytes, c);
- cinfo->marker->discarded_bytes = 0;
- }
-
- cinfo->unread_marker = c;
-
- INPUT_SYNC(cinfo);
- return TRUE;
-}
-
-
-LOCAL(boolean)
-first_marker (j_decompress_ptr cinfo)
-/* Like next_marker, but used to obtain the initial SOI marker. */
-/* For this marker, we do not allow preceding garbage or fill; otherwise,
- * we might well scan an entire input file before realizing it ain't JPEG.
- * If an application wants to process non-JFIF files, it must seek to the
- * SOI before calling the JPEG library.
- */
-{
- int c, c2;
- INPUT_VARS(cinfo);
-
- INPUT_BYTE(cinfo, c, return FALSE);
- INPUT_BYTE(cinfo, c2, return FALSE);
- if (c != 0xFF || c2 != (int) M_SOI)
- ERREXIT2(cinfo, JERR_NO_SOI, c, c2);
-
- cinfo->unread_marker = c2;
-
- INPUT_SYNC(cinfo);
- return TRUE;
-}
-
-
-/*
- * Read markers until SOS or EOI.
- *
- * Returns same codes as are defined for jpeg_consume_input:
- * JPEG_SUSPENDED, JPEG_REACHED_SOS, or JPEG_REACHED_EOI.
- */
-
-METHODDEF(int)
-read_markers (j_decompress_ptr cinfo)
-{
- /* Outer loop repeats once for each marker. */
- for (;;) {
- /* Collect the marker proper, unless we already did. */
- /* NB: first_marker() enforces the requirement that SOI appear first. */
- if (cinfo->unread_marker == 0) {
- if (! cinfo->marker->saw_SOI) {
- if (! first_marker(cinfo))
- return JPEG_SUSPENDED;
- } else {
- if (! next_marker(cinfo))
- return JPEG_SUSPENDED;
- }
- }
- /* At this point cinfo->unread_marker contains the marker code and the
- * input point is just past the marker proper, but before any parameters.
- * A suspension will cause us to return with this state still true.
- */
- switch (cinfo->unread_marker) {
- case M_SOI:
- if (! get_soi(cinfo))
- return JPEG_SUSPENDED;
- break;
-
- case M_SOF0: /* Baseline */
- case M_SOF1: /* Extended sequential, Huffman */
- if (! get_sof(cinfo, FALSE, FALSE))
- return JPEG_SUSPENDED;
- break;
-
- case M_SOF2: /* Progressive, Huffman */
- if (! get_sof(cinfo, TRUE, FALSE))
- return JPEG_SUSPENDED;
- break;
-
- case M_SOF9: /* Extended sequential, arithmetic */
- if (! get_sof(cinfo, FALSE, TRUE))
- return JPEG_SUSPENDED;
- break;
-
- case M_SOF10: /* Progressive, arithmetic */
- if (! get_sof(cinfo, TRUE, TRUE))
- return JPEG_SUSPENDED;
- break;
-
- /* Currently unsupported SOFn types */
- case M_SOF3: /* Lossless, Huffman */
- case M_SOF5: /* Differential sequential, Huffman */
- case M_SOF6: /* Differential progressive, Huffman */
- case M_SOF7: /* Differential lossless, Huffman */
- case M_JPG: /* Reserved for JPEG extensions */
- case M_SOF11: /* Lossless, arithmetic */
- case M_SOF13: /* Differential sequential, arithmetic */
- case M_SOF14: /* Differential progressive, arithmetic */
- case M_SOF15: /* Differential lossless, arithmetic */
- ERREXIT1(cinfo, JERR_SOF_UNSUPPORTED, cinfo->unread_marker);
- break;
-
- case M_SOS:
- if (! get_sos(cinfo))
- return JPEG_SUSPENDED;
- cinfo->unread_marker = 0; /* processed the marker */
- return JPEG_REACHED_SOS;
-
- case M_EOI:
- TRACEMS(cinfo, 1, JTRC_EOI);
- cinfo->unread_marker = 0; /* processed the marker */
- return JPEG_REACHED_EOI;
-
- case M_DAC:
- if (! get_dac(cinfo))
- return JPEG_SUSPENDED;
- break;
-
- case M_DHT:
- if (! get_dht(cinfo))
- return JPEG_SUSPENDED;
- break;
-
- case M_DQT:
- if (! get_dqt(cinfo))
- return JPEG_SUSPENDED;
- break;
-
- case M_DRI:
- if (! get_dri(cinfo))
- return JPEG_SUSPENDED;
- break;
-
- case M_APP0:
- case M_APP1:
- case M_APP2:
- case M_APP3:
- case M_APP4:
- case M_APP5:
- case M_APP6:
- case M_APP7:
- case M_APP8:
- case M_APP9:
- case M_APP10:
- case M_APP11:
- case M_APP12:
- case M_APP13:
- case M_APP14:
- case M_APP15:
- if (! (*((my_marker_ptr) cinfo->marker)->process_APPn[
- cinfo->unread_marker - (int) M_APP0]) (cinfo))
- return JPEG_SUSPENDED;
- break;
-
- case M_COM:
- if (! (*((my_marker_ptr) cinfo->marker)->process_COM) (cinfo))
- return JPEG_SUSPENDED;
- break;
-
- case M_RST0: /* these are all parameterless */
- case M_RST1:
- case M_RST2:
- case M_RST3:
- case M_RST4:
- case M_RST5:
- case M_RST6:
- case M_RST7:
- case M_TEM:
- TRACEMS1(cinfo, 1, JTRC_PARMLESS_MARKER, cinfo->unread_marker);
- break;
-
- case M_DNL: /* Ignore DNL ... perhaps the wrong thing */
- if (! skip_variable(cinfo))
- return JPEG_SUSPENDED;
- break;
-
- default: /* must be DHP, EXP, JPGn, or RESn */
- /* For now, we treat the reserved markers as fatal errors since they are
- * likely to be used to signal incompatible JPEG Part 3 extensions.
- * Once the JPEG 3 version-number marker is well defined, this code
- * ought to change!
- */
- ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, cinfo->unread_marker);
- break;
- }
- /* Successfully processed marker, so reset state variable */
- cinfo->unread_marker = 0;
- } /* end loop */
-}
-
-
-/*
- * Read a restart marker, which is expected to appear next in the datastream;
- * if the marker is not there, take appropriate recovery action.
- * Returns FALSE if suspension is required.
- *
- * This is called by the entropy decoder after it has read an appropriate
- * number of MCUs. cinfo->unread_marker may be nonzero if the entropy decoder
- * has already read a marker from the data source. Under normal conditions
- * cinfo->unread_marker will be reset to 0 before returning; if not reset,
- * it holds a marker which the decoder will be unable to read past.
- */
-
-METHODDEF(boolean)
-read_restart_marker (j_decompress_ptr cinfo)
-{
- /* Obtain a marker unless we already did. */
- /* Note that next_marker will complain if it skips any data. */
- if (cinfo->unread_marker == 0) {
- if (! next_marker(cinfo))
- return FALSE;
- }
-
- if (cinfo->unread_marker ==
- ((int) M_RST0 + cinfo->marker->next_restart_num)) {
- /* Normal case --- swallow the marker and let entropy decoder continue */
- TRACEMS1(cinfo, 3, JTRC_RST, cinfo->marker->next_restart_num);
- cinfo->unread_marker = 0;
- } else {
- /* Uh-oh, the restart markers have been messed up. */
- /* Let the data source manager determine how to resync. */
- if (! (*cinfo->src->resync_to_restart) (cinfo,
- cinfo->marker->next_restart_num))
- return FALSE;
- }
-
- /* Update next-restart state */
- cinfo->marker->next_restart_num = (cinfo->marker->next_restart_num + 1) & 7;
-
- return TRUE;
-}
-
-
-/*
- * This is the default resync_to_restart method for data source managers
- * to use if they don't have any better approach. Some data source managers
- * may be able to back up, or may have additional knowledge about the data
- * which permits a more intelligent recovery strategy; such managers would
- * presumably supply their own resync method.
- *
- * read_restart_marker calls resync_to_restart if it finds a marker other than
- * the restart marker it was expecting. (This code is *not* used unless
- * a nonzero restart interval has been declared.) cinfo->unread_marker is
- * the marker code actually found (might be anything, except 0 or FF).
- * The desired restart marker number (0..7) is passed as a parameter.
- * This routine is supposed to apply whatever error recovery strategy seems
- * appropriate in order to position the input stream to the next data segment.
- * Note that cinfo->unread_marker is treated as a marker appearing before
- * the current data-source input point; usually it should be reset to zero
- * before returning.
- * Returns FALSE if suspension is required.
- *
- * This implementation is substantially constrained by wanting to treat the
- * input as a data stream; this means we can't back up. Therefore, we have
- * only the following actions to work with:
- * 1. Simply discard the marker and let the entropy decoder resume at next
- * byte of file.
- * 2. Read forward until we find another marker, discarding intervening
- * data. (In theory we could look ahead within the current bufferload,
- * without having to discard data if we don't find the desired marker.
- * This idea is not implemented here, in part because it makes behavior
- * dependent on buffer size and chance buffer-boundary positions.)
- * 3. Leave the marker unread (by failing to zero cinfo->unread_marker).
- * This will cause the entropy decoder to process an empty data segment,
- * inserting dummy zeroes, and then we will reprocess the marker.
- *
- * #2 is appropriate if we think the desired marker lies ahead, while #3 is
- * appropriate if the found marker is a future restart marker (indicating
- * that we have missed the desired restart marker, probably because it got
- * corrupted).
- * We apply #2 or #3 if the found marker is a restart marker no more than
- * two counts behind or ahead of the expected one. We also apply #2 if the
- * found marker is not a legal JPEG marker code (it's certainly bogus data).
- * If the found marker is a restart marker more than 2 counts away, we do #1
- * (too much risk that the marker is erroneous; with luck we will be able to
- * resync at some future point).
- * For any valid non-restart JPEG marker, we apply #3. This keeps us from
- * overrunning the end of a scan. An implementation limited to single-scan
- * files might find it better to apply #2 for markers other than EOI, since
- * any other marker would have to be bogus data in that case.
- */
-
-GLOBAL(boolean)
-jpeg_resync_to_restart (j_decompress_ptr cinfo, int desired)
-{
- int marker = cinfo->unread_marker;
- int action = 1;
-
- /* Always put up a warning. */
- WARNMS2(cinfo, JWRN_MUST_RESYNC, marker, desired);
-
- /* Outer loop handles repeated decision after scanning forward. */
- for (;;) {
- if (marker < (int) M_SOF0)
- action = 2; /* invalid marker */
- else if (marker < (int) M_RST0 || marker > (int) M_RST7)
- action = 3; /* valid non-restart marker */
- else {
- if (marker == ((int) M_RST0 + ((desired+1) & 7)) ||
- marker == ((int) M_RST0 + ((desired+2) & 7)))
- action = 3; /* one of the next two expected restarts */
- else if (marker == ((int) M_RST0 + ((desired-1) & 7)) ||
- marker == ((int) M_RST0 + ((desired-2) & 7)))
- action = 2; /* a prior restart, so advance */
- else
- action = 1; /* desired restart or too far away */
- }
- TRACEMS2(cinfo, 4, JTRC_RECOVERY_ACTION, marker, action);
- switch (action) {
- case 1:
- /* Discard marker and let entropy decoder resume processing. */
- cinfo->unread_marker = 0;
- return TRUE;
- case 2:
- /* Scan to the next marker, and repeat the decision loop. */
- if (! next_marker(cinfo))
- return FALSE;
- marker = cinfo->unread_marker;
- break;
- case 3:
- /* Return without advancing past this marker. */
- /* Entropy decoder will be forced to process an empty segment. */
- return TRUE;
- }
- } /* end loop */
-}
-
-
-/*
- * Reset marker processing state to begin a fresh datastream.
- */
-
-METHODDEF(void)
-reset_marker_reader (j_decompress_ptr cinfo)
-{
- my_marker_ptr marker = (my_marker_ptr) cinfo->marker;
-
- cinfo->comp_info = NULL; /* until allocated by get_sof */
- cinfo->input_scan_number = 0; /* no SOS seen yet */
- cinfo->unread_marker = 0; /* no pending marker */
- marker->pub.saw_SOI = FALSE; /* set internal state too */
- marker->pub.saw_SOF = FALSE;
- marker->pub.discarded_bytes = 0;
- marker->cur_marker = NULL;
-}
-
-
-/*
- * Initialize the marker reader module.
- * This is called only once, when the decompression object is created.
- */
-
-GLOBAL(void)
-jinit_marker_reader (j_decompress_ptr cinfo)
-{
- my_marker_ptr marker;
- int i;
-
- /* Create subobject in permanent pool */
- marker = (my_marker_ptr)
- (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
- SIZEOF(my_marker_reader));
- cinfo->marker = (struct jpeg_marker_reader *) marker;
- /* Initialize public method pointers */
- marker->pub.reset_marker_reader = reset_marker_reader;
- marker->pub.read_markers = read_markers;
- marker->pub.read_restart_marker = read_restart_marker;
- /* Initialize COM/APPn processing.
- * By default, we examine and then discard APP0 and APP14,
- * but simply discard COM and all other APPn.
- */
- marker->process_COM = skip_variable;
- marker->length_limit_COM = 0;
- for (i = 0; i < 16; i++) {
- marker->process_APPn[i] = skip_variable;
- marker->length_limit_APPn[i] = 0;
- }
- marker->process_APPn[0] = get_interesting_appn;
- marker->process_APPn[14] = get_interesting_appn;
- /* Reset marker processing state */
- reset_marker_reader(cinfo);
-}
-
-
-/*
- * Control saving of COM and APPn markers into marker_list.
- */
-
-#ifdef SAVE_MARKERS_SUPPORTED
-
-GLOBAL(void)
-jpeg_save_markers (j_decompress_ptr cinfo, int marker_code,
- unsigned int length_limit)
-{
- my_marker_ptr marker = (my_marker_ptr) cinfo->marker;
- long maxlength;
- jpeg_marker_parser_method processor;
-
- /* Length limit mustn't be larger than what we can allocate
- * (should only be a concern in a 16-bit environment).
- */
- maxlength = cinfo->mem->max_alloc_chunk - SIZEOF(struct jpeg_marker_struct);
- if (((long) length_limit) > maxlength)
- length_limit = (unsigned int) maxlength;
-
- /* Choose processor routine to use.
- * APP0/APP14 have special requirements.
- */
- if (length_limit) {
- processor = save_marker;
- /* If saving APP0/APP14, save at least enough for our internal use. */
- if (marker_code == (int) M_APP0 && length_limit < APP0_DATA_LEN)
- length_limit = APP0_DATA_LEN;
- else if (marker_code == (int) M_APP14 && length_limit < APP14_DATA_LEN)
- length_limit = APP14_DATA_LEN;
- } else {
- processor = skip_variable;
- /* If discarding APP0/APP14, use our regular on-the-fly processor. */
- if (marker_code == (int) M_APP0 || marker_code == (int) M_APP14)
- processor = get_interesting_appn;
- }
-
- if (marker_code == (int) M_COM) {
- marker->process_COM = processor;
- marker->length_limit_COM = length_limit;
- } else if (marker_code >= (int) M_APP0 && marker_code <= (int) M_APP15) {
- marker->process_APPn[marker_code - (int) M_APP0] = processor;
- marker->length_limit_APPn[marker_code - (int) M_APP0] = length_limit;
- } else
- ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, marker_code);
-}
-
-#endif /* SAVE_MARKERS_SUPPORTED */
-
-
-/*
- * Install a special processing method for COM or APPn markers.
- */
-
-GLOBAL(void)
-jpeg_set_marker_processor (j_decompress_ptr cinfo, int marker_code,
- jpeg_marker_parser_method routine)
-{
- my_marker_ptr marker = (my_marker_ptr) cinfo->marker;
-
- if (marker_code == (int) M_COM)
- marker->process_COM = routine;
- else if (marker_code >= (int) M_APP0 && marker_code <= (int) M_APP15)
- marker->process_APPn[marker_code - (int) M_APP0] = routine;
- else
- ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, marker_code);
-}
-
-#endif //_FX_JPEG_TURBO_
+#if !defined(_FX_JPEG_TURBO_)
+/*
+ * jdmarker.c
+ *
+ * Copyright (C) 1991-1998, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains routines to decode JPEG datastream markers.
+ * Most of the complexity arises from our desire to support input
+ * suspension: if not all of the data for a marker is available,
+ * we must exit back to the application. On resumption, we reprocess
+ * the marker.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+
+
+typedef enum { /* JPEG marker codes */
+ M_SOF0 = 0xc0,
+ M_SOF1 = 0xc1,
+ M_SOF2 = 0xc2,
+ M_SOF3 = 0xc3,
+
+ M_SOF5 = 0xc5,
+ M_SOF6 = 0xc6,
+ M_SOF7 = 0xc7,
+
+ M_JPG = 0xc8,
+ M_SOF9 = 0xc9,
+ M_SOF10 = 0xca,
+ M_SOF11 = 0xcb,
+
+ M_SOF13 = 0xcd,
+ M_SOF14 = 0xce,
+ M_SOF15 = 0xcf,
+
+ M_DHT = 0xc4,
+
+ M_DAC = 0xcc,
+
+ M_RST0 = 0xd0,
+ M_RST1 = 0xd1,
+ M_RST2 = 0xd2,
+ M_RST3 = 0xd3,
+ M_RST4 = 0xd4,
+ M_RST5 = 0xd5,
+ M_RST6 = 0xd6,
+ M_RST7 = 0xd7,
+
+ M_SOI = 0xd8,
+ M_EOI = 0xd9,
+ M_SOS = 0xda,
+ M_DQT = 0xdb,
+ M_DNL = 0xdc,
+ M_DRI = 0xdd,
+ M_DHP = 0xde,
+ M_EXP = 0xdf,
+
+ M_APP0 = 0xe0,
+ M_APP1 = 0xe1,
+ M_APP2 = 0xe2,
+ M_APP3 = 0xe3,
+ M_APP4 = 0xe4,
+ M_APP5 = 0xe5,
+ M_APP6 = 0xe6,
+ M_APP7 = 0xe7,
+ M_APP8 = 0xe8,
+ M_APP9 = 0xe9,
+ M_APP10 = 0xea,
+ M_APP11 = 0xeb,
+ M_APP12 = 0xec,
+ M_APP13 = 0xed,
+ M_APP14 = 0xee,
+ M_APP15 = 0xef,
+
+ M_JPG0 = 0xf0,
+ M_JPG13 = 0xfd,
+ M_COM = 0xfe,
+
+ M_TEM = 0x01,
+
+ M_ERROR = 0x100
+} JPEG_MARKER;
+
+
+/* Private state */
+
+typedef struct {
+ struct jpeg_marker_reader pub; /* public fields */
+
+ /* Application-overridable marker processing methods */
+ jpeg_marker_parser_method process_COM;
+ jpeg_marker_parser_method process_APPn[16];
+
+ /* Limit on marker data length to save for each marker type */
+ unsigned int length_limit_COM;
+ unsigned int length_limit_APPn[16];
+
+ /* Status of COM/APPn marker saving */
+ jpeg_saved_marker_ptr cur_marker; /* NULL if not processing a marker */
+ unsigned int bytes_read; /* data bytes read so far in marker */
+ /* Note: cur_marker is not linked into marker_list until it's all read. */
+} my_marker_reader;
+
+typedef my_marker_reader * my_marker_ptr;
+
+
+/*
+ * Macros for fetching data from the data source module.
+ *
+ * At all times, cinfo->src->next_input_byte and ->bytes_in_buffer reflect
+ * the current restart point; we update them only when we have reached a
+ * suitable place to restart if a suspension occurs.
+ */
+
+/* Declare and initialize local copies of input pointer/count */
+#define INPUT_VARS(cinfo) \
+ struct jpeg_source_mgr * datasrc = (cinfo)->src; \
+ const JOCTET * next_input_byte = datasrc->next_input_byte; \
+ size_t bytes_in_buffer = datasrc->bytes_in_buffer
+
+/* Unload the local copies --- do this only at a restart boundary */
+#define INPUT_SYNC(cinfo) \
+ ( datasrc->next_input_byte = next_input_byte, \
+ datasrc->bytes_in_buffer = bytes_in_buffer )
+
+/* Reload the local copies --- used only in MAKE_BYTE_AVAIL */
+#define INPUT_RELOAD(cinfo) \
+ ( next_input_byte = datasrc->next_input_byte, \
+ bytes_in_buffer = datasrc->bytes_in_buffer )
+
+/* Internal macro for INPUT_BYTE and INPUT_2BYTES: make a byte available.
+ * Note we do *not* do INPUT_SYNC before calling fill_input_buffer,
+ * but we must reload the local copies after a successful fill.
+ */
+#define MAKE_BYTE_AVAIL(cinfo,action) \
+ if (bytes_in_buffer == 0) { \
+ if (! (*datasrc->fill_input_buffer) (cinfo)) \
+ { action; } \
+ INPUT_RELOAD(cinfo); \
+ }
+
+/* Read a byte into variable V.
+ * If must suspend, take the specified action (typically "return FALSE").
+ */
+#define INPUT_BYTE(cinfo,V,action) \
+ MAKESTMT( MAKE_BYTE_AVAIL(cinfo,action); \
+ bytes_in_buffer--; \
+ V = GETJOCTET(*next_input_byte++); )
+
+/* As above, but read two bytes interpreted as an unsigned 16-bit integer.
+ * V should be declared unsigned int or perhaps INT32.
+ */
+#define INPUT_2BYTES(cinfo,V,action) \
+ MAKESTMT( MAKE_BYTE_AVAIL(cinfo,action); \
+ bytes_in_buffer--; \
+ V = ((unsigned int) GETJOCTET(*next_input_byte++)) << 8; \
+ MAKE_BYTE_AVAIL(cinfo,action); \
+ bytes_in_buffer--; \
+ V += GETJOCTET(*next_input_byte++); )
+
+
+/*
+ * Routines to process JPEG markers.
+ *
+ * Entry condition: JPEG marker itself has been read and its code saved
+ * in cinfo->unread_marker; input restart point is just after the marker.
+ *
+ * Exit: if return TRUE, have read and processed any parameters, and have
+ * updated the restart point to point after the parameters.
+ * If return FALSE, was forced to suspend before reaching end of
+ * marker parameters; restart point has not been moved. Same routine
+ * will be called again after application supplies more input data.
+ *
+ * This approach to suspension assumes that all of a marker's parameters
+ * can fit into a single input bufferload. This should hold for "normal"
+ * markers. Some COM/APPn markers might have large parameter segments
+ * that might not fit. If we are simply dropping such a marker, we use
+ * skip_input_data to get past it, and thereby put the problem on the
+ * source manager's shoulders. If we are saving the marker's contents
+ * into memory, we use a slightly different convention: when forced to
+ * suspend, the marker processor updates the restart point to the end of
+ * what it's consumed (ie, the end of the buffer) before returning FALSE.
+ * On resumption, cinfo->unread_marker still contains the marker code,
+ * but the data source will point to the next chunk of marker data.
+ * The marker processor must retain internal state to deal with this.
+ *
+ * Note that we don't bother to avoid duplicate trace messages if a
+ * suspension occurs within marker parameters. Other side effects
+ * require more care.
+ */
+
+
+LOCAL(boolean)
+get_soi (j_decompress_ptr cinfo)
+/* Process an SOI marker */
+{
+ int i;
+
+ TRACEMS(cinfo, 1, JTRC_SOI);
+
+ if (cinfo->marker->saw_SOI)
+ ERREXIT(cinfo, JERR_SOI_DUPLICATE);
+
+ /* Reset all parameters that are defined to be reset by SOI */
+
+ for (i = 0; i < NUM_ARITH_TBLS; i++) {
+ cinfo->arith_dc_L[i] = 0;
+ cinfo->arith_dc_U[i] = 1;
+ cinfo->arith_ac_K[i] = 5;
+ }
+ cinfo->restart_interval = 0;
+
+ /* Set initial assumptions for colorspace etc */
+
+ cinfo->jpeg_color_space = JCS_UNKNOWN;
+ cinfo->CCIR601_sampling = FALSE; /* Assume non-CCIR sampling??? */
+
+ cinfo->saw_JFIF_marker = FALSE;
+ cinfo->JFIF_major_version = 1; /* set default JFIF APP0 values */
+ cinfo->JFIF_minor_version = 1;
+ cinfo->density_unit = 0;
+ cinfo->X_density = 1;
+ cinfo->Y_density = 1;
+ cinfo->saw_Adobe_marker = FALSE;
+ cinfo->Adobe_transform = 0;
+
+ cinfo->marker->saw_SOI = TRUE;
+
+ return TRUE;
+}
+
+
+LOCAL(boolean)
+get_sof (j_decompress_ptr cinfo, boolean is_prog, boolean is_arith)
+/* Process a SOFn marker */
+{
+ INT32 length;
+ int c, ci;
+ jpeg_component_info * compptr;
+ /* LiuSunliang added 20111209 */
+ JDIMENSION image_width, image_height;
+ INPUT_VARS(cinfo);
+
+ cinfo->progressive_mode = is_prog;
+ cinfo->arith_code = is_arith;
+
+ INPUT_2BYTES(cinfo, length, return FALSE);
+
+ INPUT_BYTE(cinfo, cinfo->data_precision, return FALSE);
+ INPUT_2BYTES(cinfo, image_height, return FALSE);
+ INPUT_2BYTES(cinfo, image_width, return FALSE);
+ INPUT_BYTE(cinfo, cinfo->num_components, return FALSE);
+
+ if (image_width <= JPEG_MAX_DIMENSION)
+ cinfo->image_width = image_width;
+
+ if (image_height <= JPEG_MAX_DIMENSION)
+ cinfo->image_height = image_height;
+
+ length -= 8;
+
+ TRACEMS4(cinfo, 1, JTRC_SOF, cinfo->unread_marker,
+ (int) cinfo->image_width, (int) cinfo->image_height,
+ cinfo->num_components);
+
+ if (cinfo->marker->saw_SOF)
+ ERREXIT(cinfo, JERR_SOF_DUPLICATE);
+
+ /* We don't support files in which the image height is initially specified */
+ /* as 0 and is later redefined by DNL. As long as we have to check that, */
+ /* might as well have a general sanity check. */
+ if (cinfo->image_height <= 0 || cinfo->image_width <= 0
+ || cinfo->num_components <= 0)
+ ERREXIT(cinfo, JERR_EMPTY_IMAGE);
+
+ if (length != (cinfo->num_components * 3))
+ ERREXIT(cinfo, JERR_BAD_LENGTH);
+
+ if (cinfo->comp_info == NULL) /* do only once, even if suspend */
+ cinfo->comp_info = (jpeg_component_info *) (*cinfo->mem->alloc_small)
+ ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ cinfo->num_components * SIZEOF(jpeg_component_info));
+
+ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+ ci++, compptr++) {
+ compptr->component_index = ci;
+ INPUT_BYTE(cinfo, compptr->component_id, return FALSE);
+ /* XYQ 2008-03-25: Adobe CMYK JPEG has serious flaw: the K channel has same component id as C channel */
+ {
+ int i;
+ for (i = 0; i < ci; i ++)
+ if (compptr->component_id == cinfo->comp_info[i].component_id) break;
+ if (i < ci)
+ /* Found the error! We replace the id with something unlikely used elsewhere */
+ compptr->component_id += 0xf0;
+ }
+ /* end of modification */
+ INPUT_BYTE(cinfo, c, return FALSE);
+ compptr->h_samp_factor = (c >> 4) & 15;
+ compptr->v_samp_factor = (c ) & 15;
+ INPUT_BYTE(cinfo, compptr->quant_tbl_no, return FALSE);
+
+ TRACEMS4(cinfo, 1, JTRC_SOF_COMPONENT,
+ compptr->component_id, compptr->h_samp_factor,
+ compptr->v_samp_factor, compptr->quant_tbl_no);
+ }
+
+ cinfo->marker->saw_SOF = TRUE;
+
+ INPUT_SYNC(cinfo);
+ return TRUE;
+}
+
+
+LOCAL(boolean)
+get_sos (j_decompress_ptr cinfo)
+/* Process a SOS marker */
+{
+ INT32 length;
+ int i, ci, n, c, cc;
+ jpeg_component_info * compptr;
+ INPUT_VARS(cinfo);
+
+ if (! cinfo->marker->saw_SOF)
+ ERREXIT(cinfo, JERR_SOS_NO_SOF);
+
+ INPUT_2BYTES(cinfo, length, return FALSE);
+
+ INPUT_BYTE(cinfo, n, return FALSE); /* Number of components */
+
+ TRACEMS1(cinfo, 1, JTRC_SOS, n);
+
+ if (length != (n * 2 + 6) || n < 1 || n > MAX_COMPS_IN_SCAN)
+ ERREXIT(cinfo, JERR_BAD_LENGTH);
+
+ cinfo->comps_in_scan = n;
+
+ /* Collect the component-spec parameters */
+
+ for (i = 0; i < n; i++) {
+ INPUT_BYTE(cinfo, cc, return FALSE);
+ INPUT_BYTE(cinfo, c, return FALSE);
+
+ /* XYQ 2008-03-25: Adobe CMYK JPEG has serious flaw: the K channel has same component id as C channel */
+ {
+ int j;
+ for (j = 0; j < i; j ++)
+ if (cc == cinfo->cur_comp_info[j]->component_id) break;
+ if (j < i)
+ /* found the error! */
+ cc += 0xf0;
+ }
+ /* end of modification */
+ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+ ci++, compptr++) {
+ if (cc == compptr->component_id)
+ goto id_found;
+ }
+
+ ERREXIT1(cinfo, JERR_BAD_COMPONENT_ID, cc);
+
+ id_found:
+
+ cinfo->cur_comp_info[i] = compptr;
+ compptr->dc_tbl_no = (c >> 4) & 15;
+ compptr->ac_tbl_no = (c ) & 15;
+
+ TRACEMS3(cinfo, 1, JTRC_SOS_COMPONENT, cc,
+ compptr->dc_tbl_no, compptr->ac_tbl_no);
+ /* This CSi (cc) should differ from the previous CSi */
+ for (ci = 0; ci < i; ci++) {
+ if (cinfo->cur_comp_info[ci] == compptr)
+ ERREXIT1(cinfo, JERR_BAD_COMPONENT_ID, cc);
+ }
+ }
+
+ /* Collect the additional scan parameters Ss, Se, Ah/Al. */
+ INPUT_BYTE(cinfo, c, return FALSE);
+ cinfo->Ss = c;
+ INPUT_BYTE(cinfo, c, return FALSE);
+ cinfo->Se = c;
+ INPUT_BYTE(cinfo, c, return FALSE);
+ cinfo->Ah = (c >> 4) & 15;
+ cinfo->Al = (c ) & 15;
+
+ TRACEMS4(cinfo, 1, JTRC_SOS_PARAMS, cinfo->Ss, cinfo->Se,
+ cinfo->Ah, cinfo->Al);
+
+ /* Prepare to scan data & restart markers */
+ cinfo->marker->next_restart_num = 0;
+
+ /* Count another SOS marker */
+ cinfo->input_scan_number++;
+
+ INPUT_SYNC(cinfo);
+ return TRUE;
+}
+
+
+#ifdef D_ARITH_CODING_SUPPORTED
+
+LOCAL(boolean)
+get_dac (j_decompress_ptr cinfo)
+/* Process a DAC marker */
+{
+ INT32 length;
+ int index, val;
+ INPUT_VARS(cinfo);
+
+ INPUT_2BYTES(cinfo, length, return FALSE);
+ length -= 2;
+
+ while (length > 0) {
+ INPUT_BYTE(cinfo, index, return FALSE);
+ INPUT_BYTE(cinfo, val, return FALSE);
+
+ length -= 2;
+
+ TRACEMS2(cinfo, 1, JTRC_DAC, index, val);
+
+ if (index < 0 || index >= (2*NUM_ARITH_TBLS))
+ ERREXIT1(cinfo, JERR_DAC_INDEX, index);
+
+ if (index >= NUM_ARITH_TBLS) { /* define AC table */
+ cinfo->arith_ac_K[index-NUM_ARITH_TBLS] = (UINT8) val;
+ } else { /* define DC table */
+ cinfo->arith_dc_L[index] = (UINT8) (val & 0x0F);
+ cinfo->arith_dc_U[index] = (UINT8) (val >> 4);
+ if (cinfo->arith_dc_L[index] > cinfo->arith_dc_U[index])
+ ERREXIT1(cinfo, JERR_DAC_VALUE, val);
+ }
+ }
+
+ if (length != 0)
+ ERREXIT(cinfo, JERR_BAD_LENGTH);
+
+ INPUT_SYNC(cinfo);
+ return TRUE;
+}
+
+#else /* ! D_ARITH_CODING_SUPPORTED */
+
+#define get_dac(cinfo) skip_variable(cinfo)
+
+#endif /* D_ARITH_CODING_SUPPORTED */
+
+
+LOCAL(boolean)
+get_dht (j_decompress_ptr cinfo)
+/* Process a DHT marker */
+{
+ INT32 length;
+ UINT8 bits[17];
+ UINT8 huffval[256];
+ int i, index, count;
+ JHUFF_TBL **htblptr;
+ INPUT_VARS(cinfo);
+
+ INPUT_2BYTES(cinfo, length, return FALSE);
+ length -= 2;
+
+ while (length > 16) {
+ INPUT_BYTE(cinfo, index, return FALSE);
+
+ TRACEMS1(cinfo, 1, JTRC_DHT, index);
+
+ bits[0] = 0;
+ count = 0;
+ for (i = 1; i <= 16; i++) {
+ INPUT_BYTE(cinfo, bits[i], return FALSE);
+ count += bits[i];
+ }
+
+ length -= 1 + 16;
+
+ TRACEMS8(cinfo, 2, JTRC_HUFFBITS,
+ bits[1], bits[2], bits[3], bits[4],
+ bits[5], bits[6], bits[7], bits[8]);
+ TRACEMS8(cinfo, 2, JTRC_HUFFBITS,
+ bits[9], bits[10], bits[11], bits[12],
+ bits[13], bits[14], bits[15], bits[16]);
+
+ /* Here we just do minimal validation of the counts to avoid walking
+ * off the end of our table space. jdhuff.c will check more carefully.
+ */
+ if (count > 256 || ((INT32) count) > length)
+ ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
+
+ for (i = 0; i < count; i++)
+ INPUT_BYTE(cinfo, huffval[i], return FALSE);
+
+ length -= count;
+
+ if (index & 0x10) { /* AC table definition */
+ index -= 0x10;
+ htblptr = &cinfo->ac_huff_tbl_ptrs[index];
+ } else { /* DC table definition */
+ htblptr = &cinfo->dc_huff_tbl_ptrs[index];
+ }
+
+ if (index < 0 || index >= NUM_HUFF_TBLS)
+ ERREXIT1(cinfo, JERR_DHT_INDEX, index);
+
+ if (*htblptr == NULL)
+ *htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo);
+
+ MEMCOPY((*htblptr)->bits, bits, SIZEOF((*htblptr)->bits));
+ MEMCOPY((*htblptr)->huffval, huffval, SIZEOF((*htblptr)->huffval));
+ }
+
+ if (length != 0)
+ ERREXIT(cinfo, JERR_BAD_LENGTH);
+
+ INPUT_SYNC(cinfo);
+ return TRUE;
+}
+
+
+LOCAL(boolean)
+get_dqt (j_decompress_ptr cinfo)
+/* Process a DQT marker */
+{
+ INT32 length;
+ int n, i, prec;
+ unsigned int tmp;
+ JQUANT_TBL *quant_ptr;
+ INPUT_VARS(cinfo);
+
+ INPUT_2BYTES(cinfo, length, return FALSE);
+ length -= 2;
+
+ while (length > 0) {
+ INPUT_BYTE(cinfo, n, return FALSE);
+ prec = n >> 4;
+ n &= 0x0F;
+
+ TRACEMS2(cinfo, 1, JTRC_DQT, n, prec);
+
+ if (n >= NUM_QUANT_TBLS)
+ ERREXIT1(cinfo, JERR_DQT_INDEX, n);
+
+ if (cinfo->quant_tbl_ptrs[n] == NULL)
+ cinfo->quant_tbl_ptrs[n] = jpeg_alloc_quant_table((j_common_ptr) cinfo);
+ quant_ptr = cinfo->quant_tbl_ptrs[n];
+
+ for (i = 0; i < DCTSIZE2; i++) {
+ if (prec)
+ INPUT_2BYTES(cinfo, tmp, return FALSE);
+ else
+ INPUT_BYTE(cinfo, tmp, return FALSE);
+ /* We convert the zigzag-order table to natural array order. */
+ quant_ptr->quantval[jpeg_natural_order[i]] = (UINT16) tmp;
+ }
+
+ if (cinfo->err->trace_level >= 2) {
+ for (i = 0; i < DCTSIZE2; i += 8) {
+ TRACEMS8(cinfo, 2, JTRC_QUANTVALS,
+ quant_ptr->quantval[i], quant_ptr->quantval[i+1],
+ quant_ptr->quantval[i+2], quant_ptr->quantval[i+3],
+ quant_ptr->quantval[i+4], quant_ptr->quantval[i+5],
+ quant_ptr->quantval[i+6], quant_ptr->quantval[i+7]);
+ }
+ }
+
+ length -= DCTSIZE2+1;
+ if (prec) length -= DCTSIZE2;
+ }
+
+ if (length != 0)
+ ERREXIT(cinfo, JERR_BAD_LENGTH);
+
+ INPUT_SYNC(cinfo);
+ return TRUE;
+}
+
+
+LOCAL(boolean)
+get_dri (j_decompress_ptr cinfo)
+/* Process a DRI marker */
+{
+ INT32 length;
+ unsigned int tmp;
+ INPUT_VARS(cinfo);
+
+ INPUT_2BYTES(cinfo, length, return FALSE);
+
+ if (length != 4)
+ ERREXIT(cinfo, JERR_BAD_LENGTH);
+
+ INPUT_2BYTES(cinfo, tmp, return FALSE);
+
+ TRACEMS1(cinfo, 1, JTRC_DRI, tmp);
+
+ cinfo->restart_interval = tmp;
+
+ INPUT_SYNC(cinfo);
+ return TRUE;
+}
+
+
+/*
+ * Routines for processing APPn and COM markers.
+ * These are either saved in memory or discarded, per application request.
+ * APP0 and APP14 are specially checked to see if they are
+ * JFIF and Adobe markers, respectively.
+ */
+
+#define APP0_DATA_LEN 14 /* Length of interesting data in APP0 */
+#define APP14_DATA_LEN 12 /* Length of interesting data in APP14 */
+#define APPN_DATA_LEN 14 /* Must be the largest of the above!! */
+
+
+LOCAL(void)
+examine_app0 (j_decompress_ptr cinfo, JOCTET FAR * data,
+ unsigned int datalen, INT32 remaining)
+/* Examine first few bytes from an APP0.
+ * Take appropriate action if it is a JFIF marker.
+ * datalen is # of bytes at data[], remaining is length of rest of marker data.
+ */
+{
+ INT32 totallen = (INT32) datalen + remaining;
+
+ if (datalen >= APP0_DATA_LEN &&
+ GETJOCTET(data[0]) == 0x4A &&
+ GETJOCTET(data[1]) == 0x46 &&
+ GETJOCTET(data[2]) == 0x49 &&
+ GETJOCTET(data[3]) == 0x46 &&
+ GETJOCTET(data[4]) == 0) {
+ /* Found JFIF APP0 marker: save info */
+ cinfo->saw_JFIF_marker = TRUE;
+ cinfo->JFIF_major_version = GETJOCTET(data[5]);
+ cinfo->JFIF_minor_version = GETJOCTET(data[6]);
+ cinfo->density_unit = GETJOCTET(data[7]);
+ cinfo->X_density = (GETJOCTET(data[8]) << 8) + GETJOCTET(data[9]);
+ cinfo->Y_density = (GETJOCTET(data[10]) << 8) + GETJOCTET(data[11]);
+ /* Check version.
+ * Major version must be 1, anything else signals an incompatible change.
+ * (We used to treat this as an error, but now it's a nonfatal warning,
+ * because some bozo at Hijaak couldn't read the spec.)
+ * Minor version should be 0..2, but process anyway if newer.
+ */
+ if (cinfo->JFIF_major_version != 1)
+ WARNMS2(cinfo, JWRN_JFIF_MAJOR,
+ cinfo->JFIF_major_version, cinfo->JFIF_minor_version);
+ /* Generate trace messages */
+ TRACEMS5(cinfo, 1, JTRC_JFIF,
+ cinfo->JFIF_major_version, cinfo->JFIF_minor_version,
+ cinfo->X_density, cinfo->Y_density, cinfo->density_unit);
+ /* Validate thumbnail dimensions and issue appropriate messages */
+ if (GETJOCTET(data[12]) | GETJOCTET(data[13]))
+ TRACEMS2(cinfo, 1, JTRC_JFIF_THUMBNAIL,
+ GETJOCTET(data[12]), GETJOCTET(data[13]));
+ totallen -= APP0_DATA_LEN;
+ if (totallen !=
+ ((INT32)GETJOCTET(data[12]) * (INT32)GETJOCTET(data[13]) * (INT32) 3))
+ TRACEMS1(cinfo, 1, JTRC_JFIF_BADTHUMBNAILSIZE, (int) totallen);
+ } else if (datalen >= 6 &&
+ GETJOCTET(data[0]) == 0x4A &&
+ GETJOCTET(data[1]) == 0x46 &&
+ GETJOCTET(data[2]) == 0x58 &&
+ GETJOCTET(data[3]) == 0x58 &&
+ GETJOCTET(data[4]) == 0) {
+ /* Found JFIF "JFXX" extension APP0 marker */
+ /* The library doesn't actually do anything with these,
+ * but we try to produce a helpful trace message.
+ */
+ switch (GETJOCTET(data[5])) {
+ case 0x10:
+ TRACEMS1(cinfo, 1, JTRC_THUMB_JPEG, (int) totallen);
+ break;
+ case 0x11:
+ TRACEMS1(cinfo, 1, JTRC_THUMB_PALETTE, (int) totallen);
+ break;
+ case 0x13:
+ TRACEMS1(cinfo, 1, JTRC_THUMB_RGB, (int) totallen);
+ break;
+ default:
+ TRACEMS2(cinfo, 1, JTRC_JFIF_EXTENSION,
+ GETJOCTET(data[5]), (int) totallen);
+ break;
+ }
+ } else {
+ /* Start of APP0 does not match "JFIF" or "JFXX", or too short */
+ TRACEMS1(cinfo, 1, JTRC_APP0, (int) totallen);
+ }
+}
+
+
+LOCAL(void)
+examine_app14 (j_decompress_ptr cinfo, JOCTET FAR * data,
+ unsigned int datalen, INT32 remaining)
+/* Examine first few bytes from an APP14.
+ * Take appropriate action if it is an Adobe marker.
+ * datalen is # of bytes at data[], remaining is length of rest of marker data.
+ */
+{
+ unsigned int version, flags0, flags1, transform;
+
+ if (datalen >= APP14_DATA_LEN &&
+ GETJOCTET(data[0]) == 0x41 &&
+ GETJOCTET(data[1]) == 0x64 &&
+ GETJOCTET(data[2]) == 0x6F &&
+ GETJOCTET(data[3]) == 0x62 &&
+ GETJOCTET(data[4]) == 0x65) {
+ /* Found Adobe APP14 marker */
+ version = (GETJOCTET(data[5]) << 8) + GETJOCTET(data[6]);
+ flags0 = (GETJOCTET(data[7]) << 8) + GETJOCTET(data[8]);
+ flags1 = (GETJOCTET(data[9]) << 8) + GETJOCTET(data[10]);
+ transform = GETJOCTET(data[11]);
+ TRACEMS4(cinfo, 1, JTRC_ADOBE, version, flags0, flags1, transform);
+ cinfo->saw_Adobe_marker = TRUE;
+ cinfo->Adobe_transform = (UINT8) transform;
+ } else {
+ /* Start of APP14 does not match "Adobe", or too short */
+ TRACEMS1(cinfo, 1, JTRC_APP14, (int) (datalen + remaining));
+ }
+}
+
+
+METHODDEF(boolean)
+get_interesting_appn (j_decompress_ptr cinfo)
+/* Process an APP0 or APP14 marker without saving it */
+{
+ INT32 length;
+ JOCTET b[APPN_DATA_LEN];
+ unsigned int i, numtoread;
+ INPUT_VARS(cinfo);
+
+ INPUT_2BYTES(cinfo, length, return FALSE);
+ length -= 2;
+
+ /* get the interesting part of the marker data */
+ if (length >= APPN_DATA_LEN)
+ numtoread = APPN_DATA_LEN;
+ else if (length > 0)
+ numtoread = (unsigned int) length;
+ else
+ numtoread = 0;
+ for (i = 0; i < numtoread; i++)
+ INPUT_BYTE(cinfo, b[i], return FALSE);
+ length -= numtoread;
+
+ /* process it */
+ switch (cinfo->unread_marker) {
+ case M_APP0:
+ examine_app0(cinfo, (JOCTET FAR *) b, numtoread, length);
+ break;
+ case M_APP14:
+ examine_app14(cinfo, (JOCTET FAR *) b, numtoread, length);
+ break;
+ default:
+ /* can't get here unless jpeg_save_markers chooses wrong processor */
+ ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, cinfo->unread_marker);
+ break;
+ }
+
+ /* skip any remaining data -- could be lots */
+ INPUT_SYNC(cinfo);
+ if (length > 0)
+ (*cinfo->src->skip_input_data) (cinfo, (long) length);
+
+ return TRUE;
+}
+
+
+#ifdef SAVE_MARKERS_SUPPORTED
+
+METHODDEF(boolean)
+save_marker (j_decompress_ptr cinfo)
+/* Save an APPn or COM marker into the marker list */
+{
+ my_marker_ptr marker = (my_marker_ptr) cinfo->marker;
+ jpeg_saved_marker_ptr cur_marker = marker->cur_marker;
+ unsigned int bytes_read, data_length;
+ JOCTET FAR * data;
+ INT32 length = 0;
+ INPUT_VARS(cinfo);
+
+ if (cur_marker == NULL) {
+ /* begin reading a marker */
+ INPUT_2BYTES(cinfo, length, return FALSE);
+ length -= 2;
+ if (length >= 0) { /* watch out for bogus length word */
+ /* figure out how much we want to save */
+ unsigned int limit;
+ if (cinfo->unread_marker == (int) M_COM)
+ limit = marker->length_limit_COM;
+ else
+ limit = marker->length_limit_APPn[cinfo->unread_marker - (int) M_APP0];
+ if ((unsigned int) length < limit)
+ limit = (unsigned int) length;
+ /* allocate and initialize the marker item */
+ cur_marker = (jpeg_saved_marker_ptr)
+ (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ SIZEOF(struct jpeg_marker_struct) + limit);
+ cur_marker->next = NULL;
+ cur_marker->marker = (UINT8) cinfo->unread_marker;
+ cur_marker->original_length = (unsigned int) length;
+ cur_marker->data_length = limit;
+ /* data area is just beyond the jpeg_marker_struct */
+ data = cur_marker->data = (JOCTET FAR *) (cur_marker + 1);
+ marker->cur_marker = cur_marker;
+ marker->bytes_read = 0;
+ bytes_read = 0;
+ data_length = limit;
+ } else {
+ /* deal with bogus length word */
+ bytes_read = data_length = 0;
+ data = NULL;
+ }
+ } else {
+ /* resume reading a marker */
+ bytes_read = marker->bytes_read;
+ data_length = cur_marker->data_length;
+ data = cur_marker->data + bytes_read;
+ }
+
+ while (bytes_read < data_length) {
+ INPUT_SYNC(cinfo); /* move the restart point to here */
+ marker->bytes_read = bytes_read;
+ /* If there's not at least one byte in buffer, suspend */
+ MAKE_BYTE_AVAIL(cinfo, return FALSE);
+ /* Copy bytes with reasonable rapidity */
+ while (bytes_read < data_length && bytes_in_buffer > 0) {
+ *data++ = *next_input_byte++;
+ bytes_in_buffer--;
+ bytes_read++;
+ }
+ }
+
+ /* Done reading what we want to read */
+ if (cur_marker != NULL) { /* will be NULL if bogus length word */
+ /* Add new marker to end of list */
+ if (cinfo->marker_list == NULL) {
+ cinfo->marker_list = cur_marker;
+ } else {
+ jpeg_saved_marker_ptr prev = cinfo->marker_list;
+ while (prev->next != NULL)
+ prev = prev->next;
+ prev->next = cur_marker;
+ }
+ /* Reset pointer & calc remaining data length */
+ data = cur_marker->data;
+ length = cur_marker->original_length - data_length;
+ }
+ /* Reset to initial state for next marker */
+ marker->cur_marker = NULL;
+
+ /* Process the marker if interesting; else just make a generic trace msg */
+ switch (cinfo->unread_marker) {
+ case M_APP0:
+ examine_app0(cinfo, data, data_length, length);
+ break;
+ case M_APP14:
+ examine_app14(cinfo, data, data_length, length);
+ break;
+ default:
+ TRACEMS2(cinfo, 1, JTRC_MISC_MARKER, cinfo->unread_marker,
+ (int) (data_length + length));
+ break;
+ }
+
+ /* skip any remaining data -- could be lots */
+ INPUT_SYNC(cinfo); /* do before skip_input_data */
+ if (length > 0)
+ (*cinfo->src->skip_input_data) (cinfo, (long) length);
+
+ return TRUE;
+}
+
+#endif /* SAVE_MARKERS_SUPPORTED */
+
+
+METHODDEF(boolean)
+skip_variable (j_decompress_ptr cinfo)
+/* Skip over an unknown or uninteresting variable-length marker */
+{
+ INT32 length;
+ INPUT_VARS(cinfo);
+
+ INPUT_2BYTES(cinfo, length, return FALSE);
+ length -= 2;
+
+ TRACEMS2(cinfo, 1, JTRC_MISC_MARKER, cinfo->unread_marker, (int) length);
+
+ INPUT_SYNC(cinfo); /* do before skip_input_data */
+ if (length > 0)
+ (*cinfo->src->skip_input_data) (cinfo, (long) length);
+
+ return TRUE;
+}
+
+
+/*
+ * Find the next JPEG marker, save it in cinfo->unread_marker.
+ * Returns FALSE if had to suspend before reaching a marker;
+ * in that case cinfo->unread_marker is unchanged.
+ *
+ * Note that the result might not be a valid marker code,
+ * but it will never be 0 or FF.
+ */
+
+LOCAL(boolean)
+next_marker (j_decompress_ptr cinfo)
+{
+ int c;
+ INPUT_VARS(cinfo);
+
+ for (;;) {
+ INPUT_BYTE(cinfo, c, return FALSE);
+ /* Skip any non-FF bytes.
+ * This may look a bit inefficient, but it will not occur in a valid file.
+ * We sync after each discarded byte so that a suspending data source
+ * can discard the byte from its buffer.
+ */
+ while (c != 0xFF) {
+ cinfo->marker->discarded_bytes++;
+ INPUT_SYNC(cinfo);
+ INPUT_BYTE(cinfo, c, return FALSE);
+ }
+ /* This loop swallows any duplicate FF bytes. Extra FFs are legal as
+ * pad bytes, so don't count them in discarded_bytes. We assume there
+ * will not be so many consecutive FF bytes as to overflow a suspending
+ * data source's input buffer.
+ */
+ do {
+ INPUT_BYTE(cinfo, c, return FALSE);
+ } while (c == 0xFF);
+ if (c != 0)
+ break; /* found a valid marker, exit loop */
+ /* Reach here if we found a stuffed-zero data sequence (FF/00).
+ * Discard it and loop back to try again.
+ */
+ cinfo->marker->discarded_bytes += 2;
+ INPUT_SYNC(cinfo);
+ }
+
+ if (cinfo->marker->discarded_bytes != 0) {
+ WARNMS2(cinfo, JWRN_EXTRANEOUS_DATA, cinfo->marker->discarded_bytes, c);
+ cinfo->marker->discarded_bytes = 0;
+ }
+
+ cinfo->unread_marker = c;
+
+ INPUT_SYNC(cinfo);
+ return TRUE;
+}
+
+
+LOCAL(boolean)
+first_marker (j_decompress_ptr cinfo)
+/* Like next_marker, but used to obtain the initial SOI marker. */
+/* For this marker, we do not allow preceding garbage or fill; otherwise,
+ * we might well scan an entire input file before realizing it ain't JPEG.
+ * If an application wants to process non-JFIF files, it must seek to the
+ * SOI before calling the JPEG library.
+ */
+{
+ int c, c2;
+ INPUT_VARS(cinfo);
+
+ INPUT_BYTE(cinfo, c, return FALSE);
+ INPUT_BYTE(cinfo, c2, return FALSE);
+ if (c != 0xFF || c2 != (int) M_SOI)
+ ERREXIT2(cinfo, JERR_NO_SOI, c, c2);
+
+ cinfo->unread_marker = c2;
+
+ INPUT_SYNC(cinfo);
+ return TRUE;
+}
+
+
+/*
+ * Read markers until SOS or EOI.
+ *
+ * Returns same codes as are defined for jpeg_consume_input:
+ * JPEG_SUSPENDED, JPEG_REACHED_SOS, or JPEG_REACHED_EOI.
+ */
+
+METHODDEF(int)
+read_markers (j_decompress_ptr cinfo)
+{
+ /* Outer loop repeats once for each marker. */
+ for (;;) {
+ /* Collect the marker proper, unless we already did. */
+ /* NB: first_marker() enforces the requirement that SOI appear first. */
+ if (cinfo->unread_marker == 0) {
+ if (! cinfo->marker->saw_SOI) {
+ if (! first_marker(cinfo))
+ return JPEG_SUSPENDED;
+ } else {
+ if (! next_marker(cinfo))
+ return JPEG_SUSPENDED;
+ }
+ }
+ /* At this point cinfo->unread_marker contains the marker code and the
+ * input point is just past the marker proper, but before any parameters.
+ * A suspension will cause us to return with this state still true.
+ */
+ switch (cinfo->unread_marker) {
+ case M_SOI:
+ if (! get_soi(cinfo))
+ return JPEG_SUSPENDED;
+ break;
+
+ case M_SOF0: /* Baseline */
+ case M_SOF1: /* Extended sequential, Huffman */
+ if (! get_sof(cinfo, FALSE, FALSE))
+ return JPEG_SUSPENDED;
+ break;
+
+ case M_SOF2: /* Progressive, Huffman */
+ if (! get_sof(cinfo, TRUE, FALSE))
+ return JPEG_SUSPENDED;
+ break;
+
+ case M_SOF9: /* Extended sequential, arithmetic */
+ if (! get_sof(cinfo, FALSE, TRUE))
+ return JPEG_SUSPENDED;
+ break;
+
+ case M_SOF10: /* Progressive, arithmetic */
+ if (! get_sof(cinfo, TRUE, TRUE))
+ return JPEG_SUSPENDED;
+ break;
+
+ /* Currently unsupported SOFn types */
+ case M_SOF3: /* Lossless, Huffman */
+ case M_SOF5: /* Differential sequential, Huffman */
+ case M_SOF6: /* Differential progressive, Huffman */
+ case M_SOF7: /* Differential lossless, Huffman */
+ case M_JPG: /* Reserved for JPEG extensions */
+ case M_SOF11: /* Lossless, arithmetic */
+ case M_SOF13: /* Differential sequential, arithmetic */
+ case M_SOF14: /* Differential progressive, arithmetic */
+ case M_SOF15: /* Differential lossless, arithmetic */
+ ERREXIT1(cinfo, JERR_SOF_UNSUPPORTED, cinfo->unread_marker);
+ break;
+
+ case M_SOS:
+ if (! get_sos(cinfo))
+ return JPEG_SUSPENDED;
+ cinfo->unread_marker = 0; /* processed the marker */
+ return JPEG_REACHED_SOS;
+
+ case M_EOI:
+ TRACEMS(cinfo, 1, JTRC_EOI);
+ cinfo->unread_marker = 0; /* processed the marker */
+ return JPEG_REACHED_EOI;
+
+ case M_DAC:
+ if (! get_dac(cinfo))
+ return JPEG_SUSPENDED;
+ break;
+
+ case M_DHT:
+ if (! get_dht(cinfo))
+ return JPEG_SUSPENDED;
+ break;
+
+ case M_DQT:
+ if (! get_dqt(cinfo))
+ return JPEG_SUSPENDED;
+ break;
+
+ case M_DRI:
+ if (! get_dri(cinfo))
+ return JPEG_SUSPENDED;
+ break;
+
+ case M_APP0:
+ case M_APP1:
+ case M_APP2:
+ case M_APP3:
+ case M_APP4:
+ case M_APP5:
+ case M_APP6:
+ case M_APP7:
+ case M_APP8:
+ case M_APP9:
+ case M_APP10:
+ case M_APP11:
+ case M_APP12:
+ case M_APP13:
+ case M_APP14:
+ case M_APP15:
+ if (! (*((my_marker_ptr) cinfo->marker)->process_APPn[
+ cinfo->unread_marker - (int) M_APP0]) (cinfo))
+ return JPEG_SUSPENDED;
+ break;
+
+ case M_COM:
+ if (! (*((my_marker_ptr) cinfo->marker)->process_COM) (cinfo))
+ return JPEG_SUSPENDED;
+ break;
+
+ case M_RST0: /* these are all parameterless */
+ case M_RST1:
+ case M_RST2:
+ case M_RST3:
+ case M_RST4:
+ case M_RST5:
+ case M_RST6:
+ case M_RST7:
+ case M_TEM:
+ TRACEMS1(cinfo, 1, JTRC_PARMLESS_MARKER, cinfo->unread_marker);
+ break;
+
+ case M_DNL: /* Ignore DNL ... perhaps the wrong thing */
+ if (! skip_variable(cinfo))
+ return JPEG_SUSPENDED;
+ break;
+
+ default: /* must be DHP, EXP, JPGn, or RESn */
+ /* For now, we treat the reserved markers as fatal errors since they are
+ * likely to be used to signal incompatible JPEG Part 3 extensions.
+ * Once the JPEG 3 version-number marker is well defined, this code
+ * ought to change!
+ */
+ ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, cinfo->unread_marker);
+ break;
+ }
+ /* Successfully processed marker, so reset state variable */
+ cinfo->unread_marker = 0;
+ } /* end loop */
+}
+
+
+/*
+ * Read a restart marker, which is expected to appear next in the datastream;
+ * if the marker is not there, take appropriate recovery action.
+ * Returns FALSE if suspension is required.
+ *
+ * This is called by the entropy decoder after it has read an appropriate
+ * number of MCUs. cinfo->unread_marker may be nonzero if the entropy decoder
+ * has already read a marker from the data source. Under normal conditions
+ * cinfo->unread_marker will be reset to 0 before returning; if not reset,
+ * it holds a marker which the decoder will be unable to read past.
+ */
+
+METHODDEF(boolean)
+read_restart_marker (j_decompress_ptr cinfo)
+{
+ /* Obtain a marker unless we already did. */
+ /* Note that next_marker will complain if it skips any data. */
+ if (cinfo->unread_marker == 0) {
+ if (! next_marker(cinfo))
+ return FALSE;
+ }
+
+ if (cinfo->unread_marker ==
+ ((int) M_RST0 + cinfo->marker->next_restart_num)) {
+ /* Normal case --- swallow the marker and let entropy decoder continue */
+ TRACEMS1(cinfo, 3, JTRC_RST, cinfo->marker->next_restart_num);
+ cinfo->unread_marker = 0;
+ } else {
+ /* Uh-oh, the restart markers have been messed up. */
+ /* Let the data source manager determine how to resync. */
+ if (! (*cinfo->src->resync_to_restart) (cinfo,
+ cinfo->marker->next_restart_num))
+ return FALSE;
+ }
+
+ /* Update next-restart state */
+ cinfo->marker->next_restart_num = (cinfo->marker->next_restart_num + 1) & 7;
+
+ return TRUE;
+}
+
+
+/*
+ * This is the default resync_to_restart method for data source managers
+ * to use if they don't have any better approach. Some data source managers
+ * may be able to back up, or may have additional knowledge about the data
+ * which permits a more intelligent recovery strategy; such managers would
+ * presumably supply their own resync method.
+ *
+ * read_restart_marker calls resync_to_restart if it finds a marker other than
+ * the restart marker it was expecting. (This code is *not* used unless
+ * a nonzero restart interval has been declared.) cinfo->unread_marker is
+ * the marker code actually found (might be anything, except 0 or FF).
+ * The desired restart marker number (0..7) is passed as a parameter.
+ * This routine is supposed to apply whatever error recovery strategy seems
+ * appropriate in order to position the input stream to the next data segment.
+ * Note that cinfo->unread_marker is treated as a marker appearing before
+ * the current data-source input point; usually it should be reset to zero
+ * before returning.
+ * Returns FALSE if suspension is required.
+ *
+ * This implementation is substantially constrained by wanting to treat the
+ * input as a data stream; this means we can't back up. Therefore, we have
+ * only the following actions to work with:
+ * 1. Simply discard the marker and let the entropy decoder resume at next
+ * byte of file.
+ * 2. Read forward until we find another marker, discarding intervening
+ * data. (In theory we could look ahead within the current bufferload,
+ * without having to discard data if we don't find the desired marker.
+ * This idea is not implemented here, in part because it makes behavior
+ * dependent on buffer size and chance buffer-boundary positions.)
+ * 3. Leave the marker unread (by failing to zero cinfo->unread_marker).
+ * This will cause the entropy decoder to process an empty data segment,
+ * inserting dummy zeroes, and then we will reprocess the marker.
+ *
+ * #2 is appropriate if we think the desired marker lies ahead, while #3 is
+ * appropriate if the found marker is a future restart marker (indicating
+ * that we have missed the desired restart marker, probably because it got
+ * corrupted).
+ * We apply #2 or #3 if the found marker is a restart marker no more than
+ * two counts behind or ahead of the expected one. We also apply #2 if the
+ * found marker is not a legal JPEG marker code (it's certainly bogus data).
+ * If the found marker is a restart marker more than 2 counts away, we do #1
+ * (too much risk that the marker is erroneous; with luck we will be able to
+ * resync at some future point).
+ * For any valid non-restart JPEG marker, we apply #3. This keeps us from
+ * overrunning the end of a scan. An implementation limited to single-scan
+ * files might find it better to apply #2 for markers other than EOI, since
+ * any other marker would have to be bogus data in that case.
+ */
+
+GLOBAL(boolean)
+jpeg_resync_to_restart (j_decompress_ptr cinfo, int desired)
+{
+ int marker = cinfo->unread_marker;
+ int action = 1;
+
+ /* Always put up a warning. */
+ WARNMS2(cinfo, JWRN_MUST_RESYNC, marker, desired);
+
+ /* Outer loop handles repeated decision after scanning forward. */
+ for (;;) {
+ if (marker < (int) M_SOF0)
+ action = 2; /* invalid marker */
+ else if (marker < (int) M_RST0 || marker > (int) M_RST7)
+ action = 3; /* valid non-restart marker */
+ else {
+ if (marker == ((int) M_RST0 + ((desired+1) & 7)) ||
+ marker == ((int) M_RST0 + ((desired+2) & 7)))
+ action = 3; /* one of the next two expected restarts */
+ else if (marker == ((int) M_RST0 + ((desired-1) & 7)) ||
+ marker == ((int) M_RST0 + ((desired-2) & 7)))
+ action = 2; /* a prior restart, so advance */
+ else
+ action = 1; /* desired restart or too far away */
+ }
+ TRACEMS2(cinfo, 4, JTRC_RECOVERY_ACTION, marker, action);
+ switch (action) {
+ case 1:
+ /* Discard marker and let entropy decoder resume processing. */
+ cinfo->unread_marker = 0;
+ return TRUE;
+ case 2:
+ /* Scan to the next marker, and repeat the decision loop. */
+ if (! next_marker(cinfo))
+ return FALSE;
+ marker = cinfo->unread_marker;
+ break;
+ case 3:
+ /* Return without advancing past this marker. */
+ /* Entropy decoder will be forced to process an empty segment. */
+ return TRUE;
+ }
+ } /* end loop */
+}
+
+
+/*
+ * Reset marker processing state to begin a fresh datastream.
+ */
+
+METHODDEF(void)
+reset_marker_reader (j_decompress_ptr cinfo)
+{
+ my_marker_ptr marker = (my_marker_ptr) cinfo->marker;
+
+ cinfo->comp_info = NULL; /* until allocated by get_sof */
+ cinfo->input_scan_number = 0; /* no SOS seen yet */
+ cinfo->unread_marker = 0; /* no pending marker */
+ marker->pub.saw_SOI = FALSE; /* set internal state too */
+ marker->pub.saw_SOF = FALSE;
+ marker->pub.discarded_bytes = 0;
+ marker->cur_marker = NULL;
+}
+
+
+/*
+ * Initialize the marker reader module.
+ * This is called only once, when the decompression object is created.
+ */
+
+GLOBAL(void)
+jinit_marker_reader (j_decompress_ptr cinfo)
+{
+ my_marker_ptr marker;
+ int i;
+
+ /* Create subobject in permanent pool */
+ marker = (my_marker_ptr)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
+ SIZEOF(my_marker_reader));
+ cinfo->marker = (struct jpeg_marker_reader *) marker;
+ /* Initialize public method pointers */
+ marker->pub.reset_marker_reader = reset_marker_reader;
+ marker->pub.read_markers = read_markers;
+ marker->pub.read_restart_marker = read_restart_marker;
+ /* Initialize COM/APPn processing.
+ * By default, we examine and then discard APP0 and APP14,
+ * but simply discard COM and all other APPn.
+ */
+ marker->process_COM = skip_variable;
+ marker->length_limit_COM = 0;
+ for (i = 0; i < 16; i++) {
+ marker->process_APPn[i] = skip_variable;
+ marker->length_limit_APPn[i] = 0;
+ }
+ marker->process_APPn[0] = get_interesting_appn;
+ marker->process_APPn[14] = get_interesting_appn;
+ /* Reset marker processing state */
+ reset_marker_reader(cinfo);
+}
+
+
+/*
+ * Control saving of COM and APPn markers into marker_list.
+ */
+
+#ifdef SAVE_MARKERS_SUPPORTED
+
+GLOBAL(void)
+jpeg_save_markers (j_decompress_ptr cinfo, int marker_code,
+ unsigned int length_limit)
+{
+ my_marker_ptr marker = (my_marker_ptr) cinfo->marker;
+ long maxlength;
+ jpeg_marker_parser_method processor;
+
+ /* Length limit mustn't be larger than what we can allocate
+ * (should only be a concern in a 16-bit environment).
+ */
+ maxlength = cinfo->mem->max_alloc_chunk - SIZEOF(struct jpeg_marker_struct);
+ if (((long) length_limit) > maxlength)
+ length_limit = (unsigned int) maxlength;
+
+ /* Choose processor routine to use.
+ * APP0/APP14 have special requirements.
+ */
+ if (length_limit) {
+ processor = save_marker;
+ /* If saving APP0/APP14, save at least enough for our internal use. */
+ if (marker_code == (int) M_APP0 && length_limit < APP0_DATA_LEN)
+ length_limit = APP0_DATA_LEN;
+ else if (marker_code == (int) M_APP14 && length_limit < APP14_DATA_LEN)
+ length_limit = APP14_DATA_LEN;
+ } else {
+ processor = skip_variable;
+ /* If discarding APP0/APP14, use our regular on-the-fly processor. */
+ if (marker_code == (int) M_APP0 || marker_code == (int) M_APP14)
+ processor = get_interesting_appn;
+ }
+
+ if (marker_code == (int) M_COM) {
+ marker->process_COM = processor;
+ marker->length_limit_COM = length_limit;
+ } else if (marker_code >= (int) M_APP0 && marker_code <= (int) M_APP15) {
+ marker->process_APPn[marker_code - (int) M_APP0] = processor;
+ marker->length_limit_APPn[marker_code - (int) M_APP0] = length_limit;
+ } else
+ ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, marker_code);
+}
+
+#endif /* SAVE_MARKERS_SUPPORTED */
+
+
+/*
+ * Install a special processing method for COM or APPn markers.
+ */
+
+GLOBAL(void)
+jpeg_set_marker_processor (j_decompress_ptr cinfo, int marker_code,
+ jpeg_marker_parser_method routine)
+{
+ my_marker_ptr marker = (my_marker_ptr) cinfo->marker;
+
+ if (marker_code == (int) M_COM)
+ marker->process_COM = routine;
+ else if (marker_code >= (int) M_APP0 && marker_code <= (int) M_APP15)
+ marker->process_APPn[marker_code - (int) M_APP0] = routine;
+ else
+ ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, marker_code);
+}
+
+#endif //_FX_JPEG_TURBO_
diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jdmaster.c b/core/src/fxcodec/libjpeg/fpdfapi_jdmaster.c
index 4adfd82375..dae51e0fd2 100644
--- a/core/src/fxcodec/libjpeg/fpdfapi_jdmaster.c
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jdmaster.c
@@ -1,560 +1,560 @@
-#if !defined(_FX_JPEG_TURBO_)
-/*
- * jdmaster.c
- *
- * Copyright (C) 1991-1997, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains master control logic for the JPEG decompressor.
- * These routines are concerned with selecting the modules to be executed
- * and with determining the number of passes and the work to be done in each
- * pass.
- */
-
-#define JPEG_INTERNALS
-#include "jinclude.h"
-#include "jpeglib.h"
-
-
-/* Private state */
-
-typedef struct {
- struct jpeg_decomp_master pub; /* public fields */
-
- int pass_number; /* # of passes completed */
-
- boolean using_merged_upsample; /* TRUE if using merged upsample/cconvert */
-
- /* Saved references to initialized quantizer modules,
- * in case we need to switch modes.
- */
- struct jpeg_color_quantizer * quantizer_1pass;
- struct jpeg_color_quantizer * quantizer_2pass;
-} my_decomp_master;
-
-typedef my_decomp_master * my_master_ptr;
-
-
-/*
- * Determine whether merged upsample/color conversion should be used.
- * CRUCIAL: this must match the actual capabilities of jdmerge.c!
- */
-
-LOCAL(boolean)
-use_merged_upsample (j_decompress_ptr cinfo)
-{
-#ifdef UPSAMPLE_MERGING_SUPPORTED
- /* Merging is the equivalent of plain box-filter upsampling */
- if (cinfo->do_fancy_upsampling || cinfo->CCIR601_sampling)
- return FALSE;
- /* jdmerge.c only supports YCC=>RGB color conversion */
- if (cinfo->jpeg_color_space != JCS_YCbCr || cinfo->num_components != 3 ||
- cinfo->out_color_space != JCS_RGB ||
- cinfo->out_color_components != RGB_PIXELSIZE)
- return FALSE;
- /* and it only handles 2h1v or 2h2v sampling ratios */
- if (cinfo->comp_info[0].h_samp_factor != 2 ||
- cinfo->comp_info[1].h_samp_factor != 1 ||
- cinfo->comp_info[2].h_samp_factor != 1 ||
- cinfo->comp_info[0].v_samp_factor > 2 ||
- cinfo->comp_info[1].v_samp_factor != 1 ||
- cinfo->comp_info[2].v_samp_factor != 1)
- return FALSE;
- /* furthermore, it doesn't work if we've scaled the IDCTs differently */
- if (cinfo->comp_info[0].DCT_scaled_size != cinfo->min_DCT_scaled_size ||
- cinfo->comp_info[1].DCT_scaled_size != cinfo->min_DCT_scaled_size ||
- cinfo->comp_info[2].DCT_scaled_size != cinfo->min_DCT_scaled_size)
- return FALSE;
- /* ??? also need to test for upsample-time rescaling, when & if supported */
- return TRUE; /* by golly, it'll work... */
-#else
- return FALSE;
-#endif
-}
-
-
-/*
- * Compute output image dimensions and related values.
- * NOTE: this is exported for possible use by application.
- * Hence it mustn't do anything that can't be done twice.
- * Also note that it may be called before the master module is initialized!
- */
-
-GLOBAL(void)
-jpeg_calc_output_dimensions (j_decompress_ptr cinfo)
-/* Do computations that are needed before master selection phase */
-{
-#ifdef IDCT_SCALING_SUPPORTED
- int ci;
- jpeg_component_info *compptr;
-#endif
-
- /* Prevent application from calling me at wrong times */
- if (cinfo->global_state != DSTATE_READY)
- ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
-
-#ifdef IDCT_SCALING_SUPPORTED
-
- /* Compute actual output image dimensions and DCT scaling choices. */
- if (cinfo->scale_num * 8 <= cinfo->scale_denom) {
- /* Provide 1/8 scaling */
- cinfo->output_width = (JDIMENSION)
- jdiv_round_up((long) cinfo->image_width, 8L);
- cinfo->output_height = (JDIMENSION)
- jdiv_round_up((long) cinfo->image_height, 8L);
- cinfo->min_DCT_scaled_size = 1;
- } else if (cinfo->scale_num * 4 <= cinfo->scale_denom) {
- /* Provide 1/4 scaling */
- cinfo->output_width = (JDIMENSION)
- jdiv_round_up((long) cinfo->image_width, 4L);
- cinfo->output_height = (JDIMENSION)
- jdiv_round_up((long) cinfo->image_height, 4L);
- cinfo->min_DCT_scaled_size = 2;
- } else if (cinfo->scale_num * 2 <= cinfo->scale_denom) {
- /* Provide 1/2 scaling */
- cinfo->output_width = (JDIMENSION)
- jdiv_round_up((long) cinfo->image_width, 2L);
- cinfo->output_height = (JDIMENSION)
- jdiv_round_up((long) cinfo->image_height, 2L);
- cinfo->min_DCT_scaled_size = 4;
- } else {
- /* Provide 1/1 scaling */
- cinfo->output_width = cinfo->image_width;
- cinfo->output_height = cinfo->image_height;
- cinfo->min_DCT_scaled_size = DCTSIZE;
- }
- /* In selecting the actual DCT scaling for each component, we try to
- * scale up the chroma components via IDCT scaling rather than upsampling.
- * This saves time if the upsampler gets to use 1:1 scaling.
- * Note this code assumes that the supported DCT scalings are powers of 2.
- */
- for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
- ci++, compptr++) {
- int ssize = cinfo->min_DCT_scaled_size;
- while (ssize < DCTSIZE &&
- (compptr->h_samp_factor * ssize * 2 <=
- cinfo->max_h_samp_factor * cinfo->min_DCT_scaled_size) &&
- (compptr->v_samp_factor * ssize * 2 <=
- cinfo->max_v_samp_factor * cinfo->min_DCT_scaled_size)) {
- ssize = ssize * 2;
- }
- compptr->DCT_scaled_size = ssize;
- }
-
- /* Recompute downsampled dimensions of components;
- * application needs to know these if using raw downsampled data.
- */
- for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
- ci++, compptr++) {
- /* Size in samples, after IDCT scaling */
- compptr->downsampled_width = (JDIMENSION)
- jdiv_round_up((long) cinfo->image_width *
- (long) (compptr->h_samp_factor * compptr->DCT_scaled_size),
- (long) (cinfo->max_h_samp_factor * DCTSIZE));
- compptr->downsampled_height = (JDIMENSION)
- jdiv_round_up((long) cinfo->image_height *
- (long) (compptr->v_samp_factor * compptr->DCT_scaled_size),
- (long) (cinfo->max_v_samp_factor * DCTSIZE));
- }
-
-#else /* !IDCT_SCALING_SUPPORTED */
-
- /* Hardwire it to "no scaling" */
- cinfo->output_width = cinfo->image_width;
- cinfo->output_height = cinfo->image_height;
- /* jdinput.c has already initialized DCT_scaled_size to DCTSIZE,
- * and has computed unscaled downsampled_width and downsampled_height.
- */
-
-#endif /* IDCT_SCALING_SUPPORTED */
-
- /* Report number of components in selected colorspace. */
- /* Probably this should be in the color conversion module... */
- switch (cinfo->out_color_space) {
- case JCS_GRAYSCALE:
- cinfo->out_color_components = 1;
- break;
- case JCS_RGB:
-#if RGB_PIXELSIZE != 3
- cinfo->out_color_components = RGB_PIXELSIZE;
- break;
-#endif /* else share code with YCbCr */
- case JCS_YCbCr:
- cinfo->out_color_components = 3;
- break;
- case JCS_CMYK:
- case JCS_YCCK:
- cinfo->out_color_components = 4;
- break;
- default: /* else must be same colorspace as in file */
- cinfo->out_color_components = cinfo->num_components;
- break;
- }
- cinfo->output_components = (cinfo->quantize_colors ? 1 :
- cinfo->out_color_components);
-
- /* See if upsampler will want to emit more than one row at a time */
- if (use_merged_upsample(cinfo))
- cinfo->rec_outbuf_height = cinfo->max_v_samp_factor;
- else
- cinfo->rec_outbuf_height = 1;
-}
-
-
-/*
- * Several decompression processes need to range-limit values to the range
- * 0..MAXJSAMPLE; the input value may fall somewhat outside this range
- * due to noise introduced by quantization, roundoff error, etc. These
- * processes are inner loops and need to be as fast as possible. On most
- * machines, particularly CPUs with pipelines or instruction prefetch,
- * a (subscript-check-less) C table lookup
- * x = sample_range_limit[x];
- * is faster than explicit tests
- * if (x < 0) x = 0;
- * else if (x > MAXJSAMPLE) x = MAXJSAMPLE;
- * These processes all use a common table prepared by the routine below.
- *
- * For most steps we can mathematically guarantee that the initial value
- * of x is within MAXJSAMPLE+1 of the legal range, so a table running from
- * -(MAXJSAMPLE+1) to 2*MAXJSAMPLE+1 is sufficient. But for the initial
- * limiting step (just after the IDCT), a wildly out-of-range value is
- * possible if the input data is corrupt. To avoid any chance of indexing
- * off the end of memory and getting a bad-pointer trap, we perform the
- * post-IDCT limiting thus:
- * x = range_limit[x & MASK];
- * where MASK is 2 bits wider than legal sample data, ie 10 bits for 8-bit
- * samples. Under normal circumstances this is more than enough range and
- * a correct output will be generated; with bogus input data the mask will
- * cause wraparound, and we will safely generate a bogus-but-in-range output.
- * For the post-IDCT step, we want to convert the data from signed to unsigned
- * representation by adding CENTERJSAMPLE at the same time that we limit it.
- * So the post-IDCT limiting table ends up looking like this:
- * CENTERJSAMPLE,CENTERJSAMPLE+1,...,MAXJSAMPLE,
- * MAXJSAMPLE (repeat 2*(MAXJSAMPLE+1)-CENTERJSAMPLE times),
- * 0 (repeat 2*(MAXJSAMPLE+1)-CENTERJSAMPLE times),
- * 0,1,...,CENTERJSAMPLE-1
- * Negative inputs select values from the upper half of the table after
- * masking.
- *
- * We can save some space by overlapping the start of the post-IDCT table
- * with the simpler range limiting table. The post-IDCT table begins at
- * sample_range_limit + CENTERJSAMPLE.
- *
- * Note that the table is allocated in near data space on PCs; it's small
- * enough and used often enough to justify this.
- */
-
-LOCAL(void)
-prepare_range_limit_table (j_decompress_ptr cinfo)
-/* Allocate and fill in the sample_range_limit table */
-{
- JSAMPLE * table;
- int i;
-
- table = (JSAMPLE *)
- (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
- (5 * (MAXJSAMPLE+1) + CENTERJSAMPLE) * SIZEOF(JSAMPLE));
- table += (MAXJSAMPLE+1); /* allow negative subscripts of simple table */
- cinfo->sample_range_limit = table;
- /* First segment of "simple" table: limit[x] = 0 for x < 0 */
- MEMZERO(table - (MAXJSAMPLE+1), (MAXJSAMPLE+1) * SIZEOF(JSAMPLE));
- /* Main part of "simple" table: limit[x] = x */
- for (i = 0; i <= MAXJSAMPLE; i++)
- table[i] = (JSAMPLE) i;
- table += CENTERJSAMPLE; /* Point to where post-IDCT table starts */
- /* End of simple table, rest of first half of post-IDCT table */
- for (i = CENTERJSAMPLE; i < 2*(MAXJSAMPLE+1); i++)
- table[i] = MAXJSAMPLE;
- /* Second half of post-IDCT table */
- MEMZERO(table + (2 * (MAXJSAMPLE+1)),
- (2 * (MAXJSAMPLE+1) - CENTERJSAMPLE) * SIZEOF(JSAMPLE));
- MEMCOPY(table + (4 * (MAXJSAMPLE+1) - CENTERJSAMPLE),
- cinfo->sample_range_limit, CENTERJSAMPLE * SIZEOF(JSAMPLE));
-}
-
-
-/*
- * Master selection of decompression modules.
- * This is done once at jpeg_start_decompress time. We determine
- * which modules will be used and give them appropriate initialization calls.
- * We also initialize the decompressor input side to begin consuming data.
- *
- * Since jpeg_read_header has finished, we know what is in the SOF
- * and (first) SOS markers. We also have all the application parameter
- * settings.
- */
-
-LOCAL(void)
-master_selection (j_decompress_ptr cinfo)
-{
- my_master_ptr master = (my_master_ptr) cinfo->master;
- boolean use_c_buffer;
- long samplesperrow;
- JDIMENSION jd_samplesperrow;
-
- /* Initialize dimensions and other stuff */
- jpeg_calc_output_dimensions(cinfo);
- prepare_range_limit_table(cinfo);
-
- /* Width of an output scanline must be representable as JDIMENSION. */
- samplesperrow = (long) cinfo->output_width * (long) cinfo->out_color_components;
- jd_samplesperrow = (JDIMENSION) samplesperrow;
- if ((long) jd_samplesperrow != samplesperrow)
- ERREXIT(cinfo, JERR_WIDTH_OVERFLOW);
-
- /* Initialize my private state */
- master->pass_number = 0;
- master->using_merged_upsample = use_merged_upsample(cinfo);
-
- /* Color quantizer selection */
- master->quantizer_1pass = NULL;
- master->quantizer_2pass = NULL;
- /* No mode changes if not using buffered-image mode. */
- if (! cinfo->quantize_colors || ! cinfo->buffered_image) {
- cinfo->enable_1pass_quant = FALSE;
- cinfo->enable_external_quant = FALSE;
- cinfo->enable_2pass_quant = FALSE;
- }
- if (cinfo->quantize_colors) {
- if (cinfo->raw_data_out)
- ERREXIT(cinfo, JERR_NOTIMPL);
- /* 2-pass quantizer only works in 3-component color space. */
- if (cinfo->out_color_components != 3) {
- cinfo->enable_1pass_quant = TRUE;
- cinfo->enable_external_quant = FALSE;
- cinfo->enable_2pass_quant = FALSE;
- cinfo->colormap = NULL;
- } else if (cinfo->colormap != NULL) {
- cinfo->enable_external_quant = TRUE;
- } else if (cinfo->two_pass_quantize) {
- cinfo->enable_2pass_quant = TRUE;
- } else {
- cinfo->enable_1pass_quant = TRUE;
- }
-
- if (cinfo->enable_1pass_quant) {
-#ifdef QUANT_1PASS_SUPPORTED
- jinit_1pass_quantizer(cinfo);
- master->quantizer_1pass = cinfo->cquantize;
-#else
- ERREXIT(cinfo, JERR_NOT_COMPILED);
-#endif
- }
-
- /* We use the 2-pass code to map to external colormaps. */
- if (cinfo->enable_2pass_quant || cinfo->enable_external_quant) {
-#ifdef QUANT_2PASS_SUPPORTED
- jinit_2pass_quantizer(cinfo);
- master->quantizer_2pass = cinfo->cquantize;
-#else
- ERREXIT(cinfo, JERR_NOT_COMPILED);
-#endif
- }
- /* If both quantizers are initialized, the 2-pass one is left active;
- * this is necessary for starting with quantization to an external map.
- */
- }
-
- /* Post-processing: in particular, color conversion first */
- if (! cinfo->raw_data_out) {
- if (master->using_merged_upsample) {
-#ifdef UPSAMPLE_MERGING_SUPPORTED
- jinit_merged_upsampler(cinfo); /* does color conversion too */
-#else
- ERREXIT(cinfo, JERR_NOT_COMPILED);
-#endif
- } else {
- jinit_color_deconverter(cinfo);
- jinit_upsampler(cinfo);
- }
- jinit_d_post_controller(cinfo, cinfo->enable_2pass_quant);
- }
- /* Inverse DCT */
- jinit_inverse_dct(cinfo);
- /* Entropy decoding: either Huffman or arithmetic coding. */
- if (cinfo->arith_code) {
- ERREXIT(cinfo, JERR_ARITH_NOTIMPL);
- } else {
- if (cinfo->progressive_mode) {
-#ifdef D_PROGRESSIVE_SUPPORTED
- jinit_phuff_decoder(cinfo);
-#else
- ERREXIT(cinfo, JERR_NOT_COMPILED);
-#endif
- } else
- jinit_huff_decoder(cinfo);
- }
-
- /* Initialize principal buffer controllers. */
- use_c_buffer = cinfo->inputctl->has_multiple_scans || cinfo->buffered_image;
- jinit_d_coef_controller(cinfo, use_c_buffer);
-
- if (! cinfo->raw_data_out)
- jinit_d_main_controller(cinfo, FALSE /* never need full buffer here */);
-
- /* We can now tell the memory manager to allocate virtual arrays. */
- (*cinfo->mem->realize_virt_arrays) ((j_common_ptr) cinfo);
-
- /* Initialize input side of decompressor to consume first scan. */
- (*cinfo->inputctl->start_input_pass) (cinfo);
-
-#ifdef D_MULTISCAN_FILES_SUPPORTED
- /* If jpeg_start_decompress will read the whole file, initialize
- * progress monitoring appropriately. The input step is counted
- * as one pass.
- */
- if (cinfo->progress != NULL && ! cinfo->buffered_image &&
- cinfo->inputctl->has_multiple_scans) {
- int nscans;
- /* Estimate number of scans to set pass_limit. */
- if (cinfo->progressive_mode) {
- /* Arbitrarily estimate 2 interleaved DC scans + 3 AC scans/component. */
- nscans = 2 + 3 * cinfo->num_components;
- } else {
- /* For a nonprogressive multiscan file, estimate 1 scan per component. */
- nscans = cinfo->num_components;
- }
- cinfo->progress->pass_counter = 0L;
- cinfo->progress->pass_limit = (long) cinfo->total_iMCU_rows * nscans;
- cinfo->progress->completed_passes = 0;
- cinfo->progress->total_passes = (cinfo->enable_2pass_quant ? 3 : 2);
- /* Count the input pass as done */
- master->pass_number++;
- }
-#endif /* D_MULTISCAN_FILES_SUPPORTED */
-}
-
-
-/*
- * Per-pass setup.
- * This is called at the beginning of each output pass. We determine which
- * modules will be active during this pass and give them appropriate
- * start_pass calls. We also set is_dummy_pass to indicate whether this
- * is a "real" output pass or a dummy pass for color quantization.
- * (In the latter case, jdapistd.c will crank the pass to completion.)
- */
-
-METHODDEF(void)
-prepare_for_output_pass (j_decompress_ptr cinfo)
-{
- my_master_ptr master = (my_master_ptr) cinfo->master;
-
- if (master->pub.is_dummy_pass) {
-#ifdef QUANT_2PASS_SUPPORTED
- /* Final pass of 2-pass quantization */
- master->pub.is_dummy_pass = FALSE;
- (*cinfo->cquantize->start_pass) (cinfo, FALSE);
- (*cinfo->post->start_pass) (cinfo, JBUF_CRANK_DEST);
- (*cinfo->main->start_pass) (cinfo, JBUF_CRANK_DEST);
-#else
- ERREXIT(cinfo, JERR_NOT_COMPILED);
-#endif /* QUANT_2PASS_SUPPORTED */
- } else {
- if (cinfo->quantize_colors && cinfo->colormap == NULL) {
- /* Select new quantization method */
- if (cinfo->two_pass_quantize && cinfo->enable_2pass_quant) {
- cinfo->cquantize = master->quantizer_2pass;
- master->pub.is_dummy_pass = TRUE;
- } else if (cinfo->enable_1pass_quant) {
- cinfo->cquantize = master->quantizer_1pass;
- } else {
- ERREXIT(cinfo, JERR_MODE_CHANGE);
- }
- }
- (*cinfo->idct->start_pass) (cinfo);
- (*cinfo->coef->start_output_pass) (cinfo);
- if (! cinfo->raw_data_out) {
- if (! master->using_merged_upsample)
- (*cinfo->cconvert->start_pass) (cinfo);
- (*cinfo->upsample->start_pass) (cinfo);
- if (cinfo->quantize_colors)
- (*cinfo->cquantize->start_pass) (cinfo, master->pub.is_dummy_pass);
- (*cinfo->post->start_pass) (cinfo,
- (master->pub.is_dummy_pass ? JBUF_SAVE_AND_PASS : JBUF_PASS_THRU));
- (*cinfo->main->start_pass) (cinfo, JBUF_PASS_THRU);
- }
- }
-
- /* Set up progress monitor's pass info if present */
- if (cinfo->progress != NULL) {
- cinfo->progress->completed_passes = master->pass_number;
- cinfo->progress->total_passes = master->pass_number +
- (master->pub.is_dummy_pass ? 2 : 1);
- /* In buffered-image mode, we assume one more output pass if EOI not
- * yet reached, but no more passes if EOI has been reached.
- */
- if (cinfo->buffered_image && ! cinfo->inputctl->eoi_reached) {
- cinfo->progress->total_passes += (cinfo->enable_2pass_quant ? 2 : 1);
- }
- }
-}
-
-
-/*
- * Finish up at end of an output pass.
- */
-
-METHODDEF(void)
-finish_output_pass (j_decompress_ptr cinfo)
-{
- my_master_ptr master = (my_master_ptr) cinfo->master;
-
- if (cinfo->quantize_colors)
- (*cinfo->cquantize->finish_pass) (cinfo);
- master->pass_number++;
-}
-
-
-#ifdef D_MULTISCAN_FILES_SUPPORTED
-
-/*
- * Switch to a new external colormap between output passes.
- */
-
-GLOBAL(void)
-jpeg_new_colormap (j_decompress_ptr cinfo)
-{
- my_master_ptr master = (my_master_ptr) cinfo->master;
-
- /* Prevent application from calling me at wrong times */
- if (cinfo->global_state != DSTATE_BUFIMAGE)
- ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
-
- if (cinfo->quantize_colors && cinfo->enable_external_quant &&
- cinfo->colormap != NULL) {
- /* Select 2-pass quantizer for external colormap use */
- cinfo->cquantize = master->quantizer_2pass;
- /* Notify quantizer of colormap change */
- (*cinfo->cquantize->new_color_map) (cinfo);
- master->pub.is_dummy_pass = FALSE; /* just in case */
- } else
- ERREXIT(cinfo, JERR_MODE_CHANGE);
-}
-
-#endif /* D_MULTISCAN_FILES_SUPPORTED */
-
-
-/*
- * Initialize master decompression control and select active modules.
- * This is performed at the start of jpeg_start_decompress.
- */
-
-GLOBAL(void)
-jinit_master_decompress (j_decompress_ptr cinfo)
-{
- my_master_ptr master;
-
- master = (my_master_ptr)
- (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
- SIZEOF(my_decomp_master));
- cinfo->master = (struct jpeg_decomp_master *) master;
- master->pub.prepare_for_output_pass = prepare_for_output_pass;
- master->pub.finish_output_pass = finish_output_pass;
-
- master->pub.is_dummy_pass = FALSE;
-
- master_selection(cinfo);
-}
-
-#endif //_FX_JPEG_TURBO_
+#if !defined(_FX_JPEG_TURBO_)
+/*
+ * jdmaster.c
+ *
+ * Copyright (C) 1991-1997, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains master control logic for the JPEG decompressor.
+ * These routines are concerned with selecting the modules to be executed
+ * and with determining the number of passes and the work to be done in each
+ * pass.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+
+
+/* Private state */
+
+typedef struct {
+ struct jpeg_decomp_master pub; /* public fields */
+
+ int pass_number; /* # of passes completed */
+
+ boolean using_merged_upsample; /* TRUE if using merged upsample/cconvert */
+
+ /* Saved references to initialized quantizer modules,
+ * in case we need to switch modes.
+ */
+ struct jpeg_color_quantizer * quantizer_1pass;
+ struct jpeg_color_quantizer * quantizer_2pass;
+} my_decomp_master;
+
+typedef my_decomp_master * my_master_ptr;
+
+
+/*
+ * Determine whether merged upsample/color conversion should be used.
+ * CRUCIAL: this must match the actual capabilities of jdmerge.c!
+ */
+
+LOCAL(boolean)
+use_merged_upsample (j_decompress_ptr cinfo)
+{
+#ifdef UPSAMPLE_MERGING_SUPPORTED
+ /* Merging is the equivalent of plain box-filter upsampling */
+ if (cinfo->do_fancy_upsampling || cinfo->CCIR601_sampling)
+ return FALSE;
+ /* jdmerge.c only supports YCC=>RGB color conversion */
+ if (cinfo->jpeg_color_space != JCS_YCbCr || cinfo->num_components != 3 ||
+ cinfo->out_color_space != JCS_RGB ||
+ cinfo->out_color_components != RGB_PIXELSIZE)
+ return FALSE;
+ /* and it only handles 2h1v or 2h2v sampling ratios */
+ if (cinfo->comp_info[0].h_samp_factor != 2 ||
+ cinfo->comp_info[1].h_samp_factor != 1 ||
+ cinfo->comp_info[2].h_samp_factor != 1 ||
+ cinfo->comp_info[0].v_samp_factor > 2 ||
+ cinfo->comp_info[1].v_samp_factor != 1 ||
+ cinfo->comp_info[2].v_samp_factor != 1)
+ return FALSE;
+ /* furthermore, it doesn't work if we've scaled the IDCTs differently */
+ if (cinfo->comp_info[0].DCT_scaled_size != cinfo->min_DCT_scaled_size ||
+ cinfo->comp_info[1].DCT_scaled_size != cinfo->min_DCT_scaled_size ||
+ cinfo->comp_info[2].DCT_scaled_size != cinfo->min_DCT_scaled_size)
+ return FALSE;
+ /* ??? also need to test for upsample-time rescaling, when & if supported */
+ return TRUE; /* by golly, it'll work... */
+#else
+ return FALSE;
+#endif
+}
+
+
+/*
+ * Compute output image dimensions and related values.
+ * NOTE: this is exported for possible use by application.
+ * Hence it mustn't do anything that can't be done twice.
+ * Also note that it may be called before the master module is initialized!
+ */
+
+GLOBAL(void)
+jpeg_calc_output_dimensions (j_decompress_ptr cinfo)
+/* Do computations that are needed before master selection phase */
+{
+#ifdef IDCT_SCALING_SUPPORTED
+ int ci;
+ jpeg_component_info *compptr;
+#endif
+
+ /* Prevent application from calling me at wrong times */
+ if (cinfo->global_state != DSTATE_READY)
+ ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
+
+#ifdef IDCT_SCALING_SUPPORTED
+
+ /* Compute actual output image dimensions and DCT scaling choices. */
+ if (cinfo->scale_num * 8 <= cinfo->scale_denom) {
+ /* Provide 1/8 scaling */
+ cinfo->output_width = (JDIMENSION)
+ jdiv_round_up((long) cinfo->image_width, 8L);
+ cinfo->output_height = (JDIMENSION)
+ jdiv_round_up((long) cinfo->image_height, 8L);
+ cinfo->min_DCT_scaled_size = 1;
+ } else if (cinfo->scale_num * 4 <= cinfo->scale_denom) {
+ /* Provide 1/4 scaling */
+ cinfo->output_width = (JDIMENSION)
+ jdiv_round_up((long) cinfo->image_width, 4L);
+ cinfo->output_height = (JDIMENSION)
+ jdiv_round_up((long) cinfo->image_height, 4L);
+ cinfo->min_DCT_scaled_size = 2;
+ } else if (cinfo->scale_num * 2 <= cinfo->scale_denom) {
+ /* Provide 1/2 scaling */
+ cinfo->output_width = (JDIMENSION)
+ jdiv_round_up((long) cinfo->image_width, 2L);
+ cinfo->output_height = (JDIMENSION)
+ jdiv_round_up((long) cinfo->image_height, 2L);
+ cinfo->min_DCT_scaled_size = 4;
+ } else {
+ /* Provide 1/1 scaling */
+ cinfo->output_width = cinfo->image_width;
+ cinfo->output_height = cinfo->image_height;
+ cinfo->min_DCT_scaled_size = DCTSIZE;
+ }
+ /* In selecting the actual DCT scaling for each component, we try to
+ * scale up the chroma components via IDCT scaling rather than upsampling.
+ * This saves time if the upsampler gets to use 1:1 scaling.
+ * Note this code assumes that the supported DCT scalings are powers of 2.
+ */
+ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+ ci++, compptr++) {
+ int ssize = cinfo->min_DCT_scaled_size;
+ while (ssize < DCTSIZE &&
+ (compptr->h_samp_factor * ssize * 2 <=
+ cinfo->max_h_samp_factor * cinfo->min_DCT_scaled_size) &&
+ (compptr->v_samp_factor * ssize * 2 <=
+ cinfo->max_v_samp_factor * cinfo->min_DCT_scaled_size)) {
+ ssize = ssize * 2;
+ }
+ compptr->DCT_scaled_size = ssize;
+ }
+
+ /* Recompute downsampled dimensions of components;
+ * application needs to know these if using raw downsampled data.
+ */
+ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+ ci++, compptr++) {
+ /* Size in samples, after IDCT scaling */
+ compptr->downsampled_width = (JDIMENSION)
+ jdiv_round_up((long) cinfo->image_width *
+ (long) (compptr->h_samp_factor * compptr->DCT_scaled_size),
+ (long) (cinfo->max_h_samp_factor * DCTSIZE));
+ compptr->downsampled_height = (JDIMENSION)
+ jdiv_round_up((long) cinfo->image_height *
+ (long) (compptr->v_samp_factor * compptr->DCT_scaled_size),
+ (long) (cinfo->max_v_samp_factor * DCTSIZE));
+ }
+
+#else /* !IDCT_SCALING_SUPPORTED */
+
+ /* Hardwire it to "no scaling" */
+ cinfo->output_width = cinfo->image_width;
+ cinfo->output_height = cinfo->image_height;
+ /* jdinput.c has already initialized DCT_scaled_size to DCTSIZE,
+ * and has computed unscaled downsampled_width and downsampled_height.
+ */
+
+#endif /* IDCT_SCALING_SUPPORTED */
+
+ /* Report number of components in selected colorspace. */
+ /* Probably this should be in the color conversion module... */
+ switch (cinfo->out_color_space) {
+ case JCS_GRAYSCALE:
+ cinfo->out_color_components = 1;
+ break;
+ case JCS_RGB:
+#if RGB_PIXELSIZE != 3
+ cinfo->out_color_components = RGB_PIXELSIZE;
+ break;
+#endif /* else share code with YCbCr */
+ case JCS_YCbCr:
+ cinfo->out_color_components = 3;
+ break;
+ case JCS_CMYK:
+ case JCS_YCCK:
+ cinfo->out_color_components = 4;
+ break;
+ default: /* else must be same colorspace as in file */
+ cinfo->out_color_components = cinfo->num_components;
+ break;
+ }
+ cinfo->output_components = (cinfo->quantize_colors ? 1 :
+ cinfo->out_color_components);
+
+ /* See if upsampler will want to emit more than one row at a time */
+ if (use_merged_upsample(cinfo))
+ cinfo->rec_outbuf_height = cinfo->max_v_samp_factor;
+ else
+ cinfo->rec_outbuf_height = 1;
+}
+
+
+/*
+ * Several decompression processes need to range-limit values to the range
+ * 0..MAXJSAMPLE; the input value may fall somewhat outside this range
+ * due to noise introduced by quantization, roundoff error, etc. These
+ * processes are inner loops and need to be as fast as possible. On most
+ * machines, particularly CPUs with pipelines or instruction prefetch,
+ * a (subscript-check-less) C table lookup
+ * x = sample_range_limit[x];
+ * is faster than explicit tests
+ * if (x < 0) x = 0;
+ * else if (x > MAXJSAMPLE) x = MAXJSAMPLE;
+ * These processes all use a common table prepared by the routine below.
+ *
+ * For most steps we can mathematically guarantee that the initial value
+ * of x is within MAXJSAMPLE+1 of the legal range, so a table running from
+ * -(MAXJSAMPLE+1) to 2*MAXJSAMPLE+1 is sufficient. But for the initial
+ * limiting step (just after the IDCT), a wildly out-of-range value is
+ * possible if the input data is corrupt. To avoid any chance of indexing
+ * off the end of memory and getting a bad-pointer trap, we perform the
+ * post-IDCT limiting thus:
+ * x = range_limit[x & MASK];
+ * where MASK is 2 bits wider than legal sample data, ie 10 bits for 8-bit
+ * samples. Under normal circumstances this is more than enough range and
+ * a correct output will be generated; with bogus input data the mask will
+ * cause wraparound, and we will safely generate a bogus-but-in-range output.
+ * For the post-IDCT step, we want to convert the data from signed to unsigned
+ * representation by adding CENTERJSAMPLE at the same time that we limit it.
+ * So the post-IDCT limiting table ends up looking like this:
+ * CENTERJSAMPLE,CENTERJSAMPLE+1,...,MAXJSAMPLE,
+ * MAXJSAMPLE (repeat 2*(MAXJSAMPLE+1)-CENTERJSAMPLE times),
+ * 0 (repeat 2*(MAXJSAMPLE+1)-CENTERJSAMPLE times),
+ * 0,1,...,CENTERJSAMPLE-1
+ * Negative inputs select values from the upper half of the table after
+ * masking.
+ *
+ * We can save some space by overlapping the start of the post-IDCT table
+ * with the simpler range limiting table. The post-IDCT table begins at
+ * sample_range_limit + CENTERJSAMPLE.
+ *
+ * Note that the table is allocated in near data space on PCs; it's small
+ * enough and used often enough to justify this.
+ */
+
+LOCAL(void)
+prepare_range_limit_table (j_decompress_ptr cinfo)
+/* Allocate and fill in the sample_range_limit table */
+{
+ JSAMPLE * table;
+ int i;
+
+ table = (JSAMPLE *)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ (5 * (MAXJSAMPLE+1) + CENTERJSAMPLE) * SIZEOF(JSAMPLE));
+ table += (MAXJSAMPLE+1); /* allow negative subscripts of simple table */
+ cinfo->sample_range_limit = table;
+ /* First segment of "simple" table: limit[x] = 0 for x < 0 */
+ MEMZERO(table - (MAXJSAMPLE+1), (MAXJSAMPLE+1) * SIZEOF(JSAMPLE));
+ /* Main part of "simple" table: limit[x] = x */
+ for (i = 0; i <= MAXJSAMPLE; i++)
+ table[i] = (JSAMPLE) i;
+ table += CENTERJSAMPLE; /* Point to where post-IDCT table starts */
+ /* End of simple table, rest of first half of post-IDCT table */
+ for (i = CENTERJSAMPLE; i < 2*(MAXJSAMPLE+1); i++)
+ table[i] = MAXJSAMPLE;
+ /* Second half of post-IDCT table */
+ MEMZERO(table + (2 * (MAXJSAMPLE+1)),
+ (2 * (MAXJSAMPLE+1) - CENTERJSAMPLE) * SIZEOF(JSAMPLE));
+ MEMCOPY(table + (4 * (MAXJSAMPLE+1) - CENTERJSAMPLE),
+ cinfo->sample_range_limit, CENTERJSAMPLE * SIZEOF(JSAMPLE));
+}
+
+
+/*
+ * Master selection of decompression modules.
+ * This is done once at jpeg_start_decompress time. We determine
+ * which modules will be used and give them appropriate initialization calls.
+ * We also initialize the decompressor input side to begin consuming data.
+ *
+ * Since jpeg_read_header has finished, we know what is in the SOF
+ * and (first) SOS markers. We also have all the application parameter
+ * settings.
+ */
+
+LOCAL(void)
+master_selection (j_decompress_ptr cinfo)
+{
+ my_master_ptr master = (my_master_ptr) cinfo->master;
+ boolean use_c_buffer;
+ long samplesperrow;
+ JDIMENSION jd_samplesperrow;
+
+ /* Initialize dimensions and other stuff */
+ jpeg_calc_output_dimensions(cinfo);
+ prepare_range_limit_table(cinfo);
+
+ /* Width of an output scanline must be representable as JDIMENSION. */
+ samplesperrow = (long) cinfo->output_width * (long) cinfo->out_color_components;
+ jd_samplesperrow = (JDIMENSION) samplesperrow;
+ if ((long) jd_samplesperrow != samplesperrow)
+ ERREXIT(cinfo, JERR_WIDTH_OVERFLOW);
+
+ /* Initialize my private state */
+ master->pass_number = 0;
+ master->using_merged_upsample = use_merged_upsample(cinfo);
+
+ /* Color quantizer selection */
+ master->quantizer_1pass = NULL;
+ master->quantizer_2pass = NULL;
+ /* No mode changes if not using buffered-image mode. */
+ if (! cinfo->quantize_colors || ! cinfo->buffered_image) {
+ cinfo->enable_1pass_quant = FALSE;
+ cinfo->enable_external_quant = FALSE;
+ cinfo->enable_2pass_quant = FALSE;
+ }
+ if (cinfo->quantize_colors) {
+ if (cinfo->raw_data_out)
+ ERREXIT(cinfo, JERR_NOTIMPL);
+ /* 2-pass quantizer only works in 3-component color space. */
+ if (cinfo->out_color_components != 3) {
+ cinfo->enable_1pass_quant = TRUE;
+ cinfo->enable_external_quant = FALSE;
+ cinfo->enable_2pass_quant = FALSE;
+ cinfo->colormap = NULL;
+ } else if (cinfo->colormap != NULL) {
+ cinfo->enable_external_quant = TRUE;
+ } else if (cinfo->two_pass_quantize) {
+ cinfo->enable_2pass_quant = TRUE;
+ } else {
+ cinfo->enable_1pass_quant = TRUE;
+ }
+
+ if (cinfo->enable_1pass_quant) {
+#ifdef QUANT_1PASS_SUPPORTED
+ jinit_1pass_quantizer(cinfo);
+ master->quantizer_1pass = cinfo->cquantize;
+#else
+ ERREXIT(cinfo, JERR_NOT_COMPILED);
+#endif
+ }
+
+ /* We use the 2-pass code to map to external colormaps. */
+ if (cinfo->enable_2pass_quant || cinfo->enable_external_quant) {
+#ifdef QUANT_2PASS_SUPPORTED
+ jinit_2pass_quantizer(cinfo);
+ master->quantizer_2pass = cinfo->cquantize;
+#else
+ ERREXIT(cinfo, JERR_NOT_COMPILED);
+#endif
+ }
+ /* If both quantizers are initialized, the 2-pass one is left active;
+ * this is necessary for starting with quantization to an external map.
+ */
+ }
+
+ /* Post-processing: in particular, color conversion first */
+ if (! cinfo->raw_data_out) {
+ if (master->using_merged_upsample) {
+#ifdef UPSAMPLE_MERGING_SUPPORTED
+ jinit_merged_upsampler(cinfo); /* does color conversion too */
+#else
+ ERREXIT(cinfo, JERR_NOT_COMPILED);
+#endif
+ } else {
+ jinit_color_deconverter(cinfo);
+ jinit_upsampler(cinfo);
+ }
+ jinit_d_post_controller(cinfo, cinfo->enable_2pass_quant);
+ }
+ /* Inverse DCT */
+ jinit_inverse_dct(cinfo);
+ /* Entropy decoding: either Huffman or arithmetic coding. */
+ if (cinfo->arith_code) {
+ ERREXIT(cinfo, JERR_ARITH_NOTIMPL);
+ } else {
+ if (cinfo->progressive_mode) {
+#ifdef D_PROGRESSIVE_SUPPORTED
+ jinit_phuff_decoder(cinfo);
+#else
+ ERREXIT(cinfo, JERR_NOT_COMPILED);
+#endif
+ } else
+ jinit_huff_decoder(cinfo);
+ }
+
+ /* Initialize principal buffer controllers. */
+ use_c_buffer = cinfo->inputctl->has_multiple_scans || cinfo->buffered_image;
+ jinit_d_coef_controller(cinfo, use_c_buffer);
+
+ if (! cinfo->raw_data_out)
+ jinit_d_main_controller(cinfo, FALSE /* never need full buffer here */);
+
+ /* We can now tell the memory manager to allocate virtual arrays. */
+ (*cinfo->mem->realize_virt_arrays) ((j_common_ptr) cinfo);
+
+ /* Initialize input side of decompressor to consume first scan. */
+ (*cinfo->inputctl->start_input_pass) (cinfo);
+
+#ifdef D_MULTISCAN_FILES_SUPPORTED
+ /* If jpeg_start_decompress will read the whole file, initialize
+ * progress monitoring appropriately. The input step is counted
+ * as one pass.
+ */
+ if (cinfo->progress != NULL && ! cinfo->buffered_image &&
+ cinfo->inputctl->has_multiple_scans) {
+ int nscans;
+ /* Estimate number of scans to set pass_limit. */
+ if (cinfo->progressive_mode) {
+ /* Arbitrarily estimate 2 interleaved DC scans + 3 AC scans/component. */
+ nscans = 2 + 3 * cinfo->num_components;
+ } else {
+ /* For a nonprogressive multiscan file, estimate 1 scan per component. */
+ nscans = cinfo->num_components;
+ }
+ cinfo->progress->pass_counter = 0L;
+ cinfo->progress->pass_limit = (long) cinfo->total_iMCU_rows * nscans;
+ cinfo->progress->completed_passes = 0;
+ cinfo->progress->total_passes = (cinfo->enable_2pass_quant ? 3 : 2);
+ /* Count the input pass as done */
+ master->pass_number++;
+ }
+#endif /* D_MULTISCAN_FILES_SUPPORTED */
+}
+
+
+/*
+ * Per-pass setup.
+ * This is called at the beginning of each output pass. We determine which
+ * modules will be active during this pass and give them appropriate
+ * start_pass calls. We also set is_dummy_pass to indicate whether this
+ * is a "real" output pass or a dummy pass for color quantization.
+ * (In the latter case, jdapistd.c will crank the pass to completion.)
+ */
+
+METHODDEF(void)
+prepare_for_output_pass (j_decompress_ptr cinfo)
+{
+ my_master_ptr master = (my_master_ptr) cinfo->master;
+
+ if (master->pub.is_dummy_pass) {
+#ifdef QUANT_2PASS_SUPPORTED
+ /* Final pass of 2-pass quantization */
+ master->pub.is_dummy_pass = FALSE;
+ (*cinfo->cquantize->start_pass) (cinfo, FALSE);
+ (*cinfo->post->start_pass) (cinfo, JBUF_CRANK_DEST);
+ (*cinfo->main->start_pass) (cinfo, JBUF_CRANK_DEST);
+#else
+ ERREXIT(cinfo, JERR_NOT_COMPILED);
+#endif /* QUANT_2PASS_SUPPORTED */
+ } else {
+ if (cinfo->quantize_colors && cinfo->colormap == NULL) {
+ /* Select new quantization method */
+ if (cinfo->two_pass_quantize && cinfo->enable_2pass_quant) {
+ cinfo->cquantize = master->quantizer_2pass;
+ master->pub.is_dummy_pass = TRUE;
+ } else if (cinfo->enable_1pass_quant) {
+ cinfo->cquantize = master->quantizer_1pass;
+ } else {
+ ERREXIT(cinfo, JERR_MODE_CHANGE);
+ }
+ }
+ (*cinfo->idct->start_pass) (cinfo);
+ (*cinfo->coef->start_output_pass) (cinfo);
+ if (! cinfo->raw_data_out) {
+ if (! master->using_merged_upsample)
+ (*cinfo->cconvert->start_pass) (cinfo);
+ (*cinfo->upsample->start_pass) (cinfo);
+ if (cinfo->quantize_colors)
+ (*cinfo->cquantize->start_pass) (cinfo, master->pub.is_dummy_pass);
+ (*cinfo->post->start_pass) (cinfo,
+ (master->pub.is_dummy_pass ? JBUF_SAVE_AND_PASS : JBUF_PASS_THRU));
+ (*cinfo->main->start_pass) (cinfo, JBUF_PASS_THRU);
+ }
+ }
+
+ /* Set up progress monitor's pass info if present */
+ if (cinfo->progress != NULL) {
+ cinfo->progress->completed_passes = master->pass_number;
+ cinfo->progress->total_passes = master->pass_number +
+ (master->pub.is_dummy_pass ? 2 : 1);
+ /* In buffered-image mode, we assume one more output pass if EOI not
+ * yet reached, but no more passes if EOI has been reached.
+ */
+ if (cinfo->buffered_image && ! cinfo->inputctl->eoi_reached) {
+ cinfo->progress->total_passes += (cinfo->enable_2pass_quant ? 2 : 1);
+ }
+ }
+}
+
+
+/*
+ * Finish up at end of an output pass.
+ */
+
+METHODDEF(void)
+finish_output_pass (j_decompress_ptr cinfo)
+{
+ my_master_ptr master = (my_master_ptr) cinfo->master;
+
+ if (cinfo->quantize_colors)
+ (*cinfo->cquantize->finish_pass) (cinfo);
+ master->pass_number++;
+}
+
+
+#ifdef D_MULTISCAN_FILES_SUPPORTED
+
+/*
+ * Switch to a new external colormap between output passes.
+ */
+
+GLOBAL(void)
+jpeg_new_colormap (j_decompress_ptr cinfo)
+{
+ my_master_ptr master = (my_master_ptr) cinfo->master;
+
+ /* Prevent application from calling me at wrong times */
+ if (cinfo->global_state != DSTATE_BUFIMAGE)
+ ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
+
+ if (cinfo->quantize_colors && cinfo->enable_external_quant &&
+ cinfo->colormap != NULL) {
+ /* Select 2-pass quantizer for external colormap use */
+ cinfo->cquantize = master->quantizer_2pass;
+ /* Notify quantizer of colormap change */
+ (*cinfo->cquantize->new_color_map) (cinfo);
+ master->pub.is_dummy_pass = FALSE; /* just in case */
+ } else
+ ERREXIT(cinfo, JERR_MODE_CHANGE);
+}
+
+#endif /* D_MULTISCAN_FILES_SUPPORTED */
+
+
+/*
+ * Initialize master decompression control and select active modules.
+ * This is performed at the start of jpeg_start_decompress.
+ */
+
+GLOBAL(void)
+jinit_master_decompress (j_decompress_ptr cinfo)
+{
+ my_master_ptr master;
+
+ master = (my_master_ptr)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ SIZEOF(my_decomp_master));
+ cinfo->master = (struct jpeg_decomp_master *) master;
+ master->pub.prepare_for_output_pass = prepare_for_output_pass;
+ master->pub.finish_output_pass = finish_output_pass;
+
+ master->pub.is_dummy_pass = FALSE;
+
+ master_selection(cinfo);
+}
+
+#endif //_FX_JPEG_TURBO_
diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jdmerge.c b/core/src/fxcodec/libjpeg/fpdfapi_jdmerge.c
index 29a996c063..c229f86aa5 100644
--- a/core/src/fxcodec/libjpeg/fpdfapi_jdmerge.c
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jdmerge.c
@@ -1,406 +1,406 @@
-#if !defined(_FX_JPEG_TURBO_)
-/*
- * jdmerge.c
- *
- * Copyright (C) 1994-1996, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains code for merged upsampling/color conversion.
- *
- * This file combines functions from jdsample.c and jdcolor.c;
- * read those files first to understand what's going on.
- *
- * When the chroma components are to be upsampled by simple replication
- * (ie, box filtering), we can save some work in color conversion by
- * calculating all the output pixels corresponding to a pair of chroma
- * samples at one time. In the conversion equations
- * R = Y + K1 * Cr
- * G = Y + K2 * Cb + K3 * Cr
- * B = Y + K4 * Cb
- * only the Y term varies among the group of pixels corresponding to a pair
- * of chroma samples, so the rest of the terms can be calculated just once.
- * At typical sampling ratios, this eliminates half or three-quarters of the
- * multiplications needed for color conversion.
- *
- * This file currently provides implementations for the following cases:
- * YCbCr => RGB color conversion only.
- * Sampling ratios of 2h1v or 2h2v.
- * No scaling needed at upsample time.
- * Corner-aligned (non-CCIR601) sampling alignment.
- * Other special cases could be added, but in most applications these are
- * the only common cases. (For uncommon cases we fall back on the more
- * general code in jdsample.c and jdcolor.c.)
- */
-
-#define JPEG_INTERNALS
-#include "jinclude.h"
-#include "jpeglib.h"
-
-#ifdef UPSAMPLE_MERGING_SUPPORTED
-
-#ifdef _FX_MANAGED_CODE_
-#define my_upsampler my_upsampler_m
-#endif
-
-/* Private subobject */
-
-typedef struct {
- struct jpeg_upsampler pub; /* public fields */
-
- /* Pointer to routine to do actual upsampling/conversion of one row group */
- JMETHOD(void, upmethod, (j_decompress_ptr cinfo,
- JSAMPIMAGE input_buf, JDIMENSION in_row_group_ctr,
- JSAMPARRAY output_buf));
-
- /* Private state for YCC->RGB conversion */
- int * Cr_r_tab; /* => table for Cr to R conversion */
- int * Cb_b_tab; /* => table for Cb to B conversion */
- INT32 * Cr_g_tab; /* => table for Cr to G conversion */
- INT32 * Cb_g_tab; /* => table for Cb to G conversion */
-
- /* For 2:1 vertical sampling, we produce two output rows at a time.
- * We need a "spare" row buffer to hold the second output row if the
- * application provides just a one-row buffer; we also use the spare
- * to discard the dummy last row if the image height is odd.
- */
- JSAMPROW spare_row;
- boolean spare_full; /* T if spare buffer is occupied */
-
- JDIMENSION out_row_width; /* samples per output row */
- JDIMENSION rows_to_go; /* counts rows remaining in image */
-} my_upsampler;
-
-typedef my_upsampler * my_upsample_ptr;
-
-#define SCALEBITS 16 /* speediest right-shift on some machines */
-#define ONE_HALF ((INT32) 1 << (SCALEBITS-1))
-#define FIX(x) ((INT32) ((x) * (1L<<SCALEBITS) + 0.5))
-
-
-/*
- * Initialize tables for YCC->RGB colorspace conversion.
- * This is taken directly from jdcolor.c; see that file for more info.
- */
-
-LOCAL(void)
-build_ycc_rgb_table (j_decompress_ptr cinfo)
-{
- my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;
- int i;
- INT32 x;
- SHIFT_TEMPS
-
- upsample->Cr_r_tab = (int *)
- (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
- (MAXJSAMPLE+1) * SIZEOF(int));
- upsample->Cb_b_tab = (int *)
- (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
- (MAXJSAMPLE+1) * SIZEOF(int));
- upsample->Cr_g_tab = (INT32 *)
- (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
- (MAXJSAMPLE+1) * SIZEOF(INT32));
- upsample->Cb_g_tab = (INT32 *)
- (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
- (MAXJSAMPLE+1) * SIZEOF(INT32));
-
- for (i = 0, x = -CENTERJSAMPLE; i <= MAXJSAMPLE; i++, x++) {
- /* i is the actual input pixel value, in the range 0..MAXJSAMPLE */
- /* The Cb or Cr value we are thinking of is x = i - CENTERJSAMPLE */
- /* Cr=>R value is nearest int to 1.40200 * x */
- upsample->Cr_r_tab[i] = (int)
- RIGHT_SHIFT(FIX(1.40200) * x + ONE_HALF, SCALEBITS);
- /* Cb=>B value is nearest int to 1.77200 * x */
- upsample->Cb_b_tab[i] = (int)
- RIGHT_SHIFT(FIX(1.77200) * x + ONE_HALF, SCALEBITS);
- /* Cr=>G value is scaled-up -0.71414 * x */
- upsample->Cr_g_tab[i] = (- FIX(0.71414)) * x;
- /* Cb=>G value is scaled-up -0.34414 * x */
- /* We also add in ONE_HALF so that need not do it in inner loop */
- upsample->Cb_g_tab[i] = (- FIX(0.34414)) * x + ONE_HALF;
- }
-}
-
-
-/*
- * Initialize for an upsampling pass.
- */
-
-METHODDEF(void)
-start_pass_merged_upsample (j_decompress_ptr cinfo)
-{
- my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;
-
- /* Mark the spare buffer empty */
- upsample->spare_full = FALSE;
- /* Initialize total-height counter for detecting bottom of image */
- upsample->rows_to_go = cinfo->output_height;
-}
-
-
-/*
- * Control routine to do upsampling (and color conversion).
- *
- * The control routine just handles the row buffering considerations.
- */
-
-METHODDEF(void)
-merged_2v_upsample (j_decompress_ptr cinfo,
- JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr,
- JDIMENSION in_row_groups_avail,
- JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
- JDIMENSION out_rows_avail)
-/* 2:1 vertical sampling case: may need a spare row. */
-{
- my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;
- JSAMPROW work_ptrs[2];
- JDIMENSION num_rows; /* number of rows returned to caller */
-
- if (upsample->spare_full) {
- /* If we have a spare row saved from a previous cycle, just return it. */
- jcopy_sample_rows(& upsample->spare_row, 0, output_buf + *out_row_ctr, 0,
- 1, upsample->out_row_width);
- num_rows = 1;
- upsample->spare_full = FALSE;
- } else {
- /* Figure number of rows to return to caller. */
- num_rows = 2;
- /* Not more than the distance to the end of the image. */
- if (num_rows > upsample->rows_to_go)
- num_rows = upsample->rows_to_go;
- /* And not more than what the client can accept: */
- out_rows_avail -= *out_row_ctr;
- if (num_rows > out_rows_avail)
- num_rows = out_rows_avail;
- /* Create output pointer array for upsampler. */
- work_ptrs[0] = output_buf[*out_row_ctr];
- if (num_rows > 1) {
- work_ptrs[1] = output_buf[*out_row_ctr + 1];
- } else {
- work_ptrs[1] = upsample->spare_row;
- upsample->spare_full = TRUE;
- }
- /* Now do the upsampling. */
- (*upsample->upmethod) (cinfo, input_buf, *in_row_group_ctr, work_ptrs);
- }
-
- /* Adjust counts */
- *out_row_ctr += num_rows;
- upsample->rows_to_go -= num_rows;
- /* When the buffer is emptied, declare this input row group consumed */
- if (! upsample->spare_full)
- (*in_row_group_ctr)++;
-}
-
-
-METHODDEF(void)
-merged_1v_upsample (j_decompress_ptr cinfo,
- JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr,
- JDIMENSION in_row_groups_avail,
- JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
- JDIMENSION out_rows_avail)
-/* 1:1 vertical sampling case: much easier, never need a spare row. */
-{
- my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;
-
- /* Just do the upsampling. */
- (*upsample->upmethod) (cinfo, input_buf, *in_row_group_ctr,
- output_buf + *out_row_ctr);
- /* Adjust counts */
- (*out_row_ctr)++;
- (*in_row_group_ctr)++;
-}
-
-
-/*
- * These are the routines invoked by the control routines to do
- * the actual upsampling/conversion. One row group is processed per call.
- *
- * Note: since we may be writing directly into application-supplied buffers,
- * we have to be honest about the output width; we can't assume the buffer
- * has been rounded up to an even width.
- */
-
-
-/*
- * Upsample and color convert for the case of 2:1 horizontal and 1:1 vertical.
- */
-
-METHODDEF(void)
-h2v1_merged_upsample (j_decompress_ptr cinfo,
- JSAMPIMAGE input_buf, JDIMENSION in_row_group_ctr,
- JSAMPARRAY output_buf)
-{
- my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;
- register int y, cred, cgreen, cblue;
- int cb, cr;
- register JSAMPROW outptr;
- JSAMPROW inptr0, inptr1, inptr2;
- JDIMENSION col;
- /* copy these pointers into registers if possible */
- register JSAMPLE * range_limit = cinfo->sample_range_limit;
- int * Crrtab = upsample->Cr_r_tab;
- int * Cbbtab = upsample->Cb_b_tab;
- INT32 * Crgtab = upsample->Cr_g_tab;
- INT32 * Cbgtab = upsample->Cb_g_tab;
- SHIFT_TEMPS
-
- inptr0 = input_buf[0][in_row_group_ctr];
- inptr1 = input_buf[1][in_row_group_ctr];
- inptr2 = input_buf[2][in_row_group_ctr];
- outptr = output_buf[0];
- /* Loop for each pair of output pixels */
- for (col = cinfo->output_width >> 1; col > 0; col--) {
- /* Do the chroma part of the calculation */
- cb = GETJSAMPLE(*inptr1++);
- cr = GETJSAMPLE(*inptr2++);
- cred = Crrtab[cr];
- cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS);
- cblue = Cbbtab[cb];
- /* Fetch 2 Y values and emit 2 pixels */
- y = GETJSAMPLE(*inptr0++);
- outptr[RGB_RED] = range_limit[y + cred];
- outptr[RGB_GREEN] = range_limit[y + cgreen];
- outptr[RGB_BLUE] = range_limit[y + cblue];
- outptr += RGB_PIXELSIZE;
- y = GETJSAMPLE(*inptr0++);
- outptr[RGB_RED] = range_limit[y + cred];
- outptr[RGB_GREEN] = range_limit[y + cgreen];
- outptr[RGB_BLUE] = range_limit[y + cblue];
- outptr += RGB_PIXELSIZE;
- }
- /* If image width is odd, do the last output column separately */
- if (cinfo->output_width & 1) {
- cb = GETJSAMPLE(*inptr1);
- cr = GETJSAMPLE(*inptr2);
- cred = Crrtab[cr];
- cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS);
- cblue = Cbbtab[cb];
- y = GETJSAMPLE(*inptr0);
- outptr[RGB_RED] = range_limit[y + cred];
- outptr[RGB_GREEN] = range_limit[y + cgreen];
- outptr[RGB_BLUE] = range_limit[y + cblue];
- }
-}
-
-
-/*
- * Upsample and color convert for the case of 2:1 horizontal and 2:1 vertical.
- */
-
-METHODDEF(void)
-h2v2_merged_upsample (j_decompress_ptr cinfo,
- JSAMPIMAGE input_buf, JDIMENSION in_row_group_ctr,
- JSAMPARRAY output_buf)
-{
- my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;
- register int y, cred, cgreen, cblue;
- int cb, cr;
- register JSAMPROW outptr0, outptr1;
- JSAMPROW inptr00, inptr01, inptr1, inptr2;
- JDIMENSION col;
- /* copy these pointers into registers if possible */
- register JSAMPLE * range_limit = cinfo->sample_range_limit;
- int * Crrtab = upsample->Cr_r_tab;
- int * Cbbtab = upsample->Cb_b_tab;
- INT32 * Crgtab = upsample->Cr_g_tab;
- INT32 * Cbgtab = upsample->Cb_g_tab;
- SHIFT_TEMPS
-
- inptr00 = input_buf[0][in_row_group_ctr*2];
- inptr01 = input_buf[0][in_row_group_ctr*2 + 1];
- inptr1 = input_buf[1][in_row_group_ctr];
- inptr2 = input_buf[2][in_row_group_ctr];
- outptr0 = output_buf[0];
- outptr1 = output_buf[1];
- /* Loop for each group of output pixels */
- for (col = cinfo->output_width >> 1; col > 0; col--) {
- /* Do the chroma part of the calculation */
- cb = GETJSAMPLE(*inptr1++);
- cr = GETJSAMPLE(*inptr2++);
- cred = Crrtab[cr];
- cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS);
- cblue = Cbbtab[cb];
- /* Fetch 4 Y values and emit 4 pixels */
- y = GETJSAMPLE(*inptr00++);
- outptr0[RGB_RED] = range_limit[y + cred];
- outptr0[RGB_GREEN] = range_limit[y + cgreen];
- outptr0[RGB_BLUE] = range_limit[y + cblue];
- outptr0 += RGB_PIXELSIZE;
- y = GETJSAMPLE(*inptr00++);
- outptr0[RGB_RED] = range_limit[y + cred];
- outptr0[RGB_GREEN] = range_limit[y + cgreen];
- outptr0[RGB_BLUE] = range_limit[y + cblue];
- outptr0 += RGB_PIXELSIZE;
- y = GETJSAMPLE(*inptr01++);
- outptr1[RGB_RED] = range_limit[y + cred];
- outptr1[RGB_GREEN] = range_limit[y + cgreen];
- outptr1[RGB_BLUE] = range_limit[y + cblue];
- outptr1 += RGB_PIXELSIZE;
- y = GETJSAMPLE(*inptr01++);
- outptr1[RGB_RED] = range_limit[y + cred];
- outptr1[RGB_GREEN] = range_limit[y + cgreen];
- outptr1[RGB_BLUE] = range_limit[y + cblue];
- outptr1 += RGB_PIXELSIZE;
- }
- /* If image width is odd, do the last output column separately */
- if (cinfo->output_width & 1) {
- cb = GETJSAMPLE(*inptr1);
- cr = GETJSAMPLE(*inptr2);
- cred = Crrtab[cr];
- cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS);
- cblue = Cbbtab[cb];
- y = GETJSAMPLE(*inptr00);
- outptr0[RGB_RED] = range_limit[y + cred];
- outptr0[RGB_GREEN] = range_limit[y + cgreen];
- outptr0[RGB_BLUE] = range_limit[y + cblue];
- y = GETJSAMPLE(*inptr01);
- outptr1[RGB_RED] = range_limit[y + cred];
- outptr1[RGB_GREEN] = range_limit[y + cgreen];
- outptr1[RGB_BLUE] = range_limit[y + cblue];
- }
-}
-
-
-/*
- * Module initialization routine for merged upsampling/color conversion.
- *
- * NB: this is called under the conditions determined by use_merged_upsample()
- * in jdmaster.c. That routine MUST correspond to the actual capabilities
- * of this module; no safety checks are made here.
- */
-
-GLOBAL(void)
-jinit_merged_upsampler (j_decompress_ptr cinfo)
-{
- my_upsample_ptr upsample;
-
- upsample = (my_upsample_ptr)
- (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
- SIZEOF(my_upsampler));
- cinfo->upsample = (struct jpeg_upsampler *) upsample;
- upsample->pub.start_pass = start_pass_merged_upsample;
- upsample->pub.need_context_rows = FALSE;
-
- upsample->out_row_width = cinfo->output_width * cinfo->out_color_components;
-
- if (cinfo->max_v_samp_factor == 2) {
- upsample->pub.upsample = merged_2v_upsample;
- upsample->upmethod = h2v2_merged_upsample;
- /* Allocate a spare row buffer */
- upsample->spare_row = (JSAMPROW)
- (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE,
- (size_t) (upsample->out_row_width * SIZEOF(JSAMPLE)));
- } else {
- upsample->pub.upsample = merged_1v_upsample;
- upsample->upmethod = h2v1_merged_upsample;
- /* No spare row needed */
- upsample->spare_row = NULL;
- }
-
- build_ycc_rgb_table(cinfo);
-}
-
-#endif /* UPSAMPLE_MERGING_SUPPORTED */
-
-#endif //_FX_JPEG_TURBO_
+#if !defined(_FX_JPEG_TURBO_)
+/*
+ * jdmerge.c
+ *
+ * Copyright (C) 1994-1996, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains code for merged upsampling/color conversion.
+ *
+ * This file combines functions from jdsample.c and jdcolor.c;
+ * read those files first to understand what's going on.
+ *
+ * When the chroma components are to be upsampled by simple replication
+ * (ie, box filtering), we can save some work in color conversion by
+ * calculating all the output pixels corresponding to a pair of chroma
+ * samples at one time. In the conversion equations
+ * R = Y + K1 * Cr
+ * G = Y + K2 * Cb + K3 * Cr
+ * B = Y + K4 * Cb
+ * only the Y term varies among the group of pixels corresponding to a pair
+ * of chroma samples, so the rest of the terms can be calculated just once.
+ * At typical sampling ratios, this eliminates half or three-quarters of the
+ * multiplications needed for color conversion.
+ *
+ * This file currently provides implementations for the following cases:
+ * YCbCr => RGB color conversion only.
+ * Sampling ratios of 2h1v or 2h2v.
+ * No scaling needed at upsample time.
+ * Corner-aligned (non-CCIR601) sampling alignment.
+ * Other special cases could be added, but in most applications these are
+ * the only common cases. (For uncommon cases we fall back on the more
+ * general code in jdsample.c and jdcolor.c.)
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+
+#ifdef UPSAMPLE_MERGING_SUPPORTED
+
+#ifdef _FX_MANAGED_CODE_
+#define my_upsampler my_upsampler_m
+#endif
+
+/* Private subobject */
+
+typedef struct {
+ struct jpeg_upsampler pub; /* public fields */
+
+ /* Pointer to routine to do actual upsampling/conversion of one row group */
+ JMETHOD(void, upmethod, (j_decompress_ptr cinfo,
+ JSAMPIMAGE input_buf, JDIMENSION in_row_group_ctr,
+ JSAMPARRAY output_buf));
+
+ /* Private state for YCC->RGB conversion */
+ int * Cr_r_tab; /* => table for Cr to R conversion */
+ int * Cb_b_tab; /* => table for Cb to B conversion */
+ INT32 * Cr_g_tab; /* => table for Cr to G conversion */
+ INT32 * Cb_g_tab; /* => table for Cb to G conversion */
+
+ /* For 2:1 vertical sampling, we produce two output rows at a time.
+ * We need a "spare" row buffer to hold the second output row if the
+ * application provides just a one-row buffer; we also use the spare
+ * to discard the dummy last row if the image height is odd.
+ */
+ JSAMPROW spare_row;
+ boolean spare_full; /* T if spare buffer is occupied */
+
+ JDIMENSION out_row_width; /* samples per output row */
+ JDIMENSION rows_to_go; /* counts rows remaining in image */
+} my_upsampler;
+
+typedef my_upsampler * my_upsample_ptr;
+
+#define SCALEBITS 16 /* speediest right-shift on some machines */
+#define ONE_HALF ((INT32) 1 << (SCALEBITS-1))
+#define FIX(x) ((INT32) ((x) * (1L<<SCALEBITS) + 0.5))
+
+
+/*
+ * Initialize tables for YCC->RGB colorspace conversion.
+ * This is taken directly from jdcolor.c; see that file for more info.
+ */
+
+LOCAL(void)
+build_ycc_rgb_table (j_decompress_ptr cinfo)
+{
+ my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;
+ int i;
+ INT32 x;
+ SHIFT_TEMPS
+
+ upsample->Cr_r_tab = (int *)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ (MAXJSAMPLE+1) * SIZEOF(int));
+ upsample->Cb_b_tab = (int *)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ (MAXJSAMPLE+1) * SIZEOF(int));
+ upsample->Cr_g_tab = (INT32 *)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ (MAXJSAMPLE+1) * SIZEOF(INT32));
+ upsample->Cb_g_tab = (INT32 *)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ (MAXJSAMPLE+1) * SIZEOF(INT32));
+
+ for (i = 0, x = -CENTERJSAMPLE; i <= MAXJSAMPLE; i++, x++) {
+ /* i is the actual input pixel value, in the range 0..MAXJSAMPLE */
+ /* The Cb or Cr value we are thinking of is x = i - CENTERJSAMPLE */
+ /* Cr=>R value is nearest int to 1.40200 * x */
+ upsample->Cr_r_tab[i] = (int)
+ RIGHT_SHIFT(FIX(1.40200) * x + ONE_HALF, SCALEBITS);
+ /* Cb=>B value is nearest int to 1.77200 * x */
+ upsample->Cb_b_tab[i] = (int)
+ RIGHT_SHIFT(FIX(1.77200) * x + ONE_HALF, SCALEBITS);
+ /* Cr=>G value is scaled-up -0.71414 * x */
+ upsample->Cr_g_tab[i] = (- FIX(0.71414)) * x;
+ /* Cb=>G value is scaled-up -0.34414 * x */
+ /* We also add in ONE_HALF so that need not do it in inner loop */
+ upsample->Cb_g_tab[i] = (- FIX(0.34414)) * x + ONE_HALF;
+ }
+}
+
+
+/*
+ * Initialize for an upsampling pass.
+ */
+
+METHODDEF(void)
+start_pass_merged_upsample (j_decompress_ptr cinfo)
+{
+ my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;
+
+ /* Mark the spare buffer empty */
+ upsample->spare_full = FALSE;
+ /* Initialize total-height counter for detecting bottom of image */
+ upsample->rows_to_go = cinfo->output_height;
+}
+
+
+/*
+ * Control routine to do upsampling (and color conversion).
+ *
+ * The control routine just handles the row buffering considerations.
+ */
+
+METHODDEF(void)
+merged_2v_upsample (j_decompress_ptr cinfo,
+ JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr,
+ JDIMENSION in_row_groups_avail,
+ JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
+ JDIMENSION out_rows_avail)
+/* 2:1 vertical sampling case: may need a spare row. */
+{
+ my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;
+ JSAMPROW work_ptrs[2];
+ JDIMENSION num_rows; /* number of rows returned to caller */
+
+ if (upsample->spare_full) {
+ /* If we have a spare row saved from a previous cycle, just return it. */
+ jcopy_sample_rows(& upsample->spare_row, 0, output_buf + *out_row_ctr, 0,
+ 1, upsample->out_row_width);
+ num_rows = 1;
+ upsample->spare_full = FALSE;
+ } else {
+ /* Figure number of rows to return to caller. */
+ num_rows = 2;
+ /* Not more than the distance to the end of the image. */
+ if (num_rows > upsample->rows_to_go)
+ num_rows = upsample->rows_to_go;
+ /* And not more than what the client can accept: */
+ out_rows_avail -= *out_row_ctr;
+ if (num_rows > out_rows_avail)
+ num_rows = out_rows_avail;
+ /* Create output pointer array for upsampler. */
+ work_ptrs[0] = output_buf[*out_row_ctr];
+ if (num_rows > 1) {
+ work_ptrs[1] = output_buf[*out_row_ctr + 1];
+ } else {
+ work_ptrs[1] = upsample->spare_row;
+ upsample->spare_full = TRUE;
+ }
+ /* Now do the upsampling. */
+ (*upsample->upmethod) (cinfo, input_buf, *in_row_group_ctr, work_ptrs);
+ }
+
+ /* Adjust counts */
+ *out_row_ctr += num_rows;
+ upsample->rows_to_go -= num_rows;
+ /* When the buffer is emptied, declare this input row group consumed */
+ if (! upsample->spare_full)
+ (*in_row_group_ctr)++;
+}
+
+
+METHODDEF(void)
+merged_1v_upsample (j_decompress_ptr cinfo,
+ JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr,
+ JDIMENSION in_row_groups_avail,
+ JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
+ JDIMENSION out_rows_avail)
+/* 1:1 vertical sampling case: much easier, never need a spare row. */
+{
+ my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;
+
+ /* Just do the upsampling. */
+ (*upsample->upmethod) (cinfo, input_buf, *in_row_group_ctr,
+ output_buf + *out_row_ctr);
+ /* Adjust counts */
+ (*out_row_ctr)++;
+ (*in_row_group_ctr)++;
+}
+
+
+/*
+ * These are the routines invoked by the control routines to do
+ * the actual upsampling/conversion. One row group is processed per call.
+ *
+ * Note: since we may be writing directly into application-supplied buffers,
+ * we have to be honest about the output width; we can't assume the buffer
+ * has been rounded up to an even width.
+ */
+
+
+/*
+ * Upsample and color convert for the case of 2:1 horizontal and 1:1 vertical.
+ */
+
+METHODDEF(void)
+h2v1_merged_upsample (j_decompress_ptr cinfo,
+ JSAMPIMAGE input_buf, JDIMENSION in_row_group_ctr,
+ JSAMPARRAY output_buf)
+{
+ my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;
+ register int y, cred, cgreen, cblue;
+ int cb, cr;
+ register JSAMPROW outptr;
+ JSAMPROW inptr0, inptr1, inptr2;
+ JDIMENSION col;
+ /* copy these pointers into registers if possible */
+ register JSAMPLE * range_limit = cinfo->sample_range_limit;
+ int * Crrtab = upsample->Cr_r_tab;
+ int * Cbbtab = upsample->Cb_b_tab;
+ INT32 * Crgtab = upsample->Cr_g_tab;
+ INT32 * Cbgtab = upsample->Cb_g_tab;
+ SHIFT_TEMPS
+
+ inptr0 = input_buf[0][in_row_group_ctr];
+ inptr1 = input_buf[1][in_row_group_ctr];
+ inptr2 = input_buf[2][in_row_group_ctr];
+ outptr = output_buf[0];
+ /* Loop for each pair of output pixels */
+ for (col = cinfo->output_width >> 1; col > 0; col--) {
+ /* Do the chroma part of the calculation */
+ cb = GETJSAMPLE(*inptr1++);
+ cr = GETJSAMPLE(*inptr2++);
+ cred = Crrtab[cr];
+ cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS);
+ cblue = Cbbtab[cb];
+ /* Fetch 2 Y values and emit 2 pixels */
+ y = GETJSAMPLE(*inptr0++);
+ outptr[RGB_RED] = range_limit[y + cred];
+ outptr[RGB_GREEN] = range_limit[y + cgreen];
+ outptr[RGB_BLUE] = range_limit[y + cblue];
+ outptr += RGB_PIXELSIZE;
+ y = GETJSAMPLE(*inptr0++);
+ outptr[RGB_RED] = range_limit[y + cred];
+ outptr[RGB_GREEN] = range_limit[y + cgreen];
+ outptr[RGB_BLUE] = range_limit[y + cblue];
+ outptr += RGB_PIXELSIZE;
+ }
+ /* If image width is odd, do the last output column separately */
+ if (cinfo->output_width & 1) {
+ cb = GETJSAMPLE(*inptr1);
+ cr = GETJSAMPLE(*inptr2);
+ cred = Crrtab[cr];
+ cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS);
+ cblue = Cbbtab[cb];
+ y = GETJSAMPLE(*inptr0);
+ outptr[RGB_RED] = range_limit[y + cred];
+ outptr[RGB_GREEN] = range_limit[y + cgreen];
+ outptr[RGB_BLUE] = range_limit[y + cblue];
+ }
+}
+
+
+/*
+ * Upsample and color convert for the case of 2:1 horizontal and 2:1 vertical.
+ */
+
+METHODDEF(void)
+h2v2_merged_upsample (j_decompress_ptr cinfo,
+ JSAMPIMAGE input_buf, JDIMENSION in_row_group_ctr,
+ JSAMPARRAY output_buf)
+{
+ my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;
+ register int y, cred, cgreen, cblue;
+ int cb, cr;
+ register JSAMPROW outptr0, outptr1;
+ JSAMPROW inptr00, inptr01, inptr1, inptr2;
+ JDIMENSION col;
+ /* copy these pointers into registers if possible */
+ register JSAMPLE * range_limit = cinfo->sample_range_limit;
+ int * Crrtab = upsample->Cr_r_tab;
+ int * Cbbtab = upsample->Cb_b_tab;
+ INT32 * Crgtab = upsample->Cr_g_tab;
+ INT32 * Cbgtab = upsample->Cb_g_tab;
+ SHIFT_TEMPS
+
+ inptr00 = input_buf[0][in_row_group_ctr*2];
+ inptr01 = input_buf[0][in_row_group_ctr*2 + 1];
+ inptr1 = input_buf[1][in_row_group_ctr];
+ inptr2 = input_buf[2][in_row_group_ctr];
+ outptr0 = output_buf[0];
+ outptr1 = output_buf[1];
+ /* Loop for each group of output pixels */
+ for (col = cinfo->output_width >> 1; col > 0; col--) {
+ /* Do the chroma part of the calculation */
+ cb = GETJSAMPLE(*inptr1++);
+ cr = GETJSAMPLE(*inptr2++);
+ cred = Crrtab[cr];
+ cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS);
+ cblue = Cbbtab[cb];
+ /* Fetch 4 Y values and emit 4 pixels */
+ y = GETJSAMPLE(*inptr00++);
+ outptr0[RGB_RED] = range_limit[y + cred];
+ outptr0[RGB_GREEN] = range_limit[y + cgreen];
+ outptr0[RGB_BLUE] = range_limit[y + cblue];
+ outptr0 += RGB_PIXELSIZE;
+ y = GETJSAMPLE(*inptr00++);
+ outptr0[RGB_RED] = range_limit[y + cred];
+ outptr0[RGB_GREEN] = range_limit[y + cgreen];
+ outptr0[RGB_BLUE] = range_limit[y + cblue];
+ outptr0 += RGB_PIXELSIZE;
+ y = GETJSAMPLE(*inptr01++);
+ outptr1[RGB_RED] = range_limit[y + cred];
+ outptr1[RGB_GREEN] = range_limit[y + cgreen];
+ outptr1[RGB_BLUE] = range_limit[y + cblue];
+ outptr1 += RGB_PIXELSIZE;
+ y = GETJSAMPLE(*inptr01++);
+ outptr1[RGB_RED] = range_limit[y + cred];
+ outptr1[RGB_GREEN] = range_limit[y + cgreen];
+ outptr1[RGB_BLUE] = range_limit[y + cblue];
+ outptr1 += RGB_PIXELSIZE;
+ }
+ /* If image width is odd, do the last output column separately */
+ if (cinfo->output_width & 1) {
+ cb = GETJSAMPLE(*inptr1);
+ cr = GETJSAMPLE(*inptr2);
+ cred = Crrtab[cr];
+ cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS);
+ cblue = Cbbtab[cb];
+ y = GETJSAMPLE(*inptr00);
+ outptr0[RGB_RED] = range_limit[y + cred];
+ outptr0[RGB_GREEN] = range_limit[y + cgreen];
+ outptr0[RGB_BLUE] = range_limit[y + cblue];
+ y = GETJSAMPLE(*inptr01);
+ outptr1[RGB_RED] = range_limit[y + cred];
+ outptr1[RGB_GREEN] = range_limit[y + cgreen];
+ outptr1[RGB_BLUE] = range_limit[y + cblue];
+ }
+}
+
+
+/*
+ * Module initialization routine for merged upsampling/color conversion.
+ *
+ * NB: this is called under the conditions determined by use_merged_upsample()
+ * in jdmaster.c. That routine MUST correspond to the actual capabilities
+ * of this module; no safety checks are made here.
+ */
+
+GLOBAL(void)
+jinit_merged_upsampler (j_decompress_ptr cinfo)
+{
+ my_upsample_ptr upsample;
+
+ upsample = (my_upsample_ptr)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ SIZEOF(my_upsampler));
+ cinfo->upsample = (struct jpeg_upsampler *) upsample;
+ upsample->pub.start_pass = start_pass_merged_upsample;
+ upsample->pub.need_context_rows = FALSE;
+
+ upsample->out_row_width = cinfo->output_width * cinfo->out_color_components;
+
+ if (cinfo->max_v_samp_factor == 2) {
+ upsample->pub.upsample = merged_2v_upsample;
+ upsample->upmethod = h2v2_merged_upsample;
+ /* Allocate a spare row buffer */
+ upsample->spare_row = (JSAMPROW)
+ (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ (size_t) (upsample->out_row_width * SIZEOF(JSAMPLE)));
+ } else {
+ upsample->pub.upsample = merged_1v_upsample;
+ upsample->upmethod = h2v1_merged_upsample;
+ /* No spare row needed */
+ upsample->spare_row = NULL;
+ }
+
+ build_ycc_rgb_table(cinfo);
+}
+
+#endif /* UPSAMPLE_MERGING_SUPPORTED */
+
+#endif //_FX_JPEG_TURBO_
diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jdphuff.c b/core/src/fxcodec/libjpeg/fpdfapi_jdphuff.c
index 3c19d0ab24..128e412662 100644
--- a/core/src/fxcodec/libjpeg/fpdfapi_jdphuff.c
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jdphuff.c
@@ -1,671 +1,671 @@
-#if !defined(_FX_JPEG_TURBO_)
-/*
- * jdphuff.c
- *
- * Copyright (C) 1995-1997, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains Huffman entropy decoding routines for progressive JPEG.
- *
- * Much of the complexity here has to do with supporting input suspension.
- * If the data source module demands suspension, we want to be able to back
- * up to the start of the current MCU. To do this, we copy state variables
- * into local working storage, and update them back to the permanent
- * storage only upon successful completion of an MCU.
- */
-
-#define JPEG_INTERNALS
-#include "jinclude.h"
-#include "jpeglib.h"
-#include "jdhuff.h" /* Declarations shared with jdhuff.c */
-
-
-#ifdef D_PROGRESSIVE_SUPPORTED
-
-/*
- * Expanded entropy decoder object for progressive Huffman decoding.
- *
- * The savable_state subrecord contains fields that change within an MCU,
- * but must not be updated permanently until we complete the MCU.
- */
-
-typedef struct {
- unsigned int EOBRUN; /* remaining EOBs in EOBRUN */
- int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */
-} savable_state;
-
-/* This macro is to work around compilers with missing or broken
- * structure assignment. You'll need to fix this code if you have
- * such a compiler and you change MAX_COMPS_IN_SCAN.
- */
-
-#ifndef NO_STRUCT_ASSIGN
-#define ASSIGN_STATE(dest,src) ((dest) = (src))
-#else
-#if MAX_COMPS_IN_SCAN == 4
-#define ASSIGN_STATE(dest,src) \
- ((dest).EOBRUN = (src).EOBRUN, \
- (dest).last_dc_val[0] = (src).last_dc_val[0], \
- (dest).last_dc_val[1] = (src).last_dc_val[1], \
- (dest).last_dc_val[2] = (src).last_dc_val[2], \
- (dest).last_dc_val[3] = (src).last_dc_val[3])
-#endif
-#endif
-
-
-typedef struct {
- struct jpeg_entropy_decoder pub; /* public fields */
-
- /* These fields are loaded into local variables at start of each MCU.
- * In case of suspension, we exit WITHOUT updating them.
- */
- bitread_perm_state bitstate; /* Bit buffer at start of MCU */
- savable_state saved; /* Other state at start of MCU */
-
- /* These fields are NOT loaded into local working state. */
- unsigned int restarts_to_go; /* MCUs left in this restart interval */
-
- /* Pointers to derived tables (these workspaces have image lifespan) */
- d_derived_tbl * derived_tbls[NUM_HUFF_TBLS];
-
- d_derived_tbl * ac_derived_tbl; /* active table during an AC scan */
-} phuff_entropy_decoder;
-
-typedef phuff_entropy_decoder * phuff_entropy_ptr;
-
-/* Forward declarations */
-METHODDEF(boolean) decode_mcu_DC_first JPP((j_decompress_ptr cinfo,
- JBLOCKROW *MCU_data));
-METHODDEF(boolean) decode_mcu_AC_first JPP((j_decompress_ptr cinfo,
- JBLOCKROW *MCU_data));
-METHODDEF(boolean) decode_mcu_DC_refine JPP((j_decompress_ptr cinfo,
- JBLOCKROW *MCU_data));
-METHODDEF(boolean) decode_mcu_AC_refine JPP((j_decompress_ptr cinfo,
- JBLOCKROW *MCU_data));
-
-
-/*
- * Initialize for a Huffman-compressed scan.
- */
-
-METHODDEF(void)
-start_pass_phuff_decoder (j_decompress_ptr cinfo)
-{
- phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
- boolean is_DC_band, bad;
- int ci, coefi, tbl;
- int *coef_bit_ptr;
- jpeg_component_info * compptr;
-
- is_DC_band = (cinfo->Ss == 0);
-
- /* Validate scan parameters */
- bad = FALSE;
- if (is_DC_band) {
- if (cinfo->Se != 0)
- bad = TRUE;
- } else {
- /* need not check Ss/Se < 0 since they came from unsigned bytes */
- if (cinfo->Ss > cinfo->Se || cinfo->Se >= DCTSIZE2)
- bad = TRUE;
- /* AC scans may have only one component */
- if (cinfo->comps_in_scan != 1)
- bad = TRUE;
- }
- if (cinfo->Ah != 0) {
- /* Successive approximation refinement scan: must have Al = Ah-1. */
- if (cinfo->Al != cinfo->Ah-1)
- bad = TRUE;
- }
- if (cinfo->Al > 13) /* need not check for < 0 */
- bad = TRUE;
- /* Arguably the maximum Al value should be less than 13 for 8-bit precision,
- * but the spec doesn't say so, and we try to be liberal about what we
- * accept. Note: large Al values could result in out-of-range DC
- * coefficients during early scans, leading to bizarre displays due to
- * overflows in the IDCT math. But we won't crash.
- */
- if (bad)
- ERREXIT4(cinfo, JERR_BAD_PROGRESSION,
- cinfo->Ss, cinfo->Se, cinfo->Ah, cinfo->Al);
- /* Update progression status, and verify that scan order is legal.
- * Note that inter-scan inconsistencies are treated as warnings
- * not fatal errors ... not clear if this is right way to behave.
- */
- for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
- int cindex = cinfo->cur_comp_info[ci]->component_index;
- coef_bit_ptr = & cinfo->coef_bits[cindex][0];
- if (!is_DC_band && coef_bit_ptr[0] < 0) /* AC without prior DC scan */
- WARNMS2(cinfo, JWRN_BOGUS_PROGRESSION, cindex, 0);
- for (coefi = cinfo->Ss; coefi <= cinfo->Se; coefi++) {
- int expected = (coef_bit_ptr[coefi] < 0) ? 0 : coef_bit_ptr[coefi];
- if (cinfo->Ah != expected)
- WARNMS2(cinfo, JWRN_BOGUS_PROGRESSION, cindex, coefi);
- coef_bit_ptr[coefi] = cinfo->Al;
- }
- }
-
- /* Select MCU decoding routine */
- if (cinfo->Ah == 0) {
- if (is_DC_band)
- entropy->pub.decode_mcu = decode_mcu_DC_first;
- else
- entropy->pub.decode_mcu = decode_mcu_AC_first;
- } else {
- if (is_DC_band)
- entropy->pub.decode_mcu = decode_mcu_DC_refine;
- else
- entropy->pub.decode_mcu = decode_mcu_AC_refine;
- }
-
- for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
- compptr = cinfo->cur_comp_info[ci];
- /* Make sure requested tables are present, and compute derived tables.
- * We may build same derived table more than once, but it's not expensive.
- */
- if (is_DC_band) {
- if (cinfo->Ah == 0) { /* DC refinement needs no table */
- tbl = compptr->dc_tbl_no;
- jpeg_make_d_derived_tbl(cinfo, TRUE, tbl,
- & entropy->derived_tbls[tbl]);
- }
- } else {
- tbl = compptr->ac_tbl_no;
- jpeg_make_d_derived_tbl(cinfo, FALSE, tbl,
- & entropy->derived_tbls[tbl]);
- /* remember the single active table */
- entropy->ac_derived_tbl = entropy->derived_tbls[tbl];
- }
- /* Initialize DC predictions to 0 */
- entropy->saved.last_dc_val[ci] = 0;
- }
-
- /* Initialize bitread state variables */
- entropy->bitstate.bits_left = 0;
- entropy->bitstate.get_buffer = 0; /* unnecessary, but keeps Purify quiet */
- entropy->pub.insufficient_data = FALSE;
-
- /* Initialize private state variables */
- entropy->saved.EOBRUN = 0;
-
- /* Initialize restart counter */
- entropy->restarts_to_go = cinfo->restart_interval;
-}
-
-
-/*
- * Figure F.12: extend sign bit.
- * On some machines, a shift and add will be faster than a table lookup.
- */
-
-#ifdef AVOID_TABLES
-
-#define HUFF_EXTEND(x,s) ((x) < (1<<((s)-1)) ? (x) + (((-1)<<(s)) + 1) : (x))
-
-#else
-
-#define HUFF_EXTEND(x,s) ((x) < extend_test[s] ? (x) + extend_offset[s] : (x))
-
-static const int extend_test[16] = /* entry n is 2**(n-1) */
- { 0, 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080,
- 0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000 };
-
-static const int extend_offset[16] = /* entry n is (-1 << n) + 1 */
- { 0, ((-1)<<1) + 1, ((-1)<<2) + 1, ((-1)<<3) + 1, ((-1)<<4) + 1,
- ((-1)<<5) + 1, ((-1)<<6) + 1, ((-1)<<7) + 1, ((-1)<<8) + 1,
- ((-1)<<9) + 1, ((-1)<<10) + 1, ((-1)<<11) + 1, ((-1)<<12) + 1,
- ((-1)<<13) + 1, ((-1)<<14) + 1, ((-1)<<15) + 1 };
-
-#endif /* AVOID_TABLES */
-
-
-/*
- * Check for a restart marker & resynchronize decoder.
- * Returns FALSE if must suspend.
- */
-
-LOCAL(boolean)
-process_restart (j_decompress_ptr cinfo)
-{
- phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
- int ci;
-
- /* Throw away any unused bits remaining in bit buffer; */
- /* include any full bytes in next_marker's count of discarded bytes */
- cinfo->marker->discarded_bytes += entropy->bitstate.bits_left / 8;
- entropy->bitstate.bits_left = 0;
-
- /* Advance past the RSTn marker */
- if (! (*cinfo->marker->read_restart_marker) (cinfo))
- return FALSE;
-
- /* Re-initialize DC predictions to 0 */
- for (ci = 0; ci < cinfo->comps_in_scan; ci++)
- entropy->saved.last_dc_val[ci] = 0;
- /* Re-init EOB run count, too */
- entropy->saved.EOBRUN = 0;
-
- /* Reset restart counter */
- entropy->restarts_to_go = cinfo->restart_interval;
-
- /* Reset out-of-data flag, unless read_restart_marker left us smack up
- * against a marker. In that case we will end up treating the next data
- * segment as empty, and we can avoid producing bogus output pixels by
- * leaving the flag set.
- */
- if (cinfo->unread_marker == 0)
- entropy->pub.insufficient_data = FALSE;
-
- return TRUE;
-}
-
-
-/*
- * Huffman MCU decoding.
- * Each of these routines decodes and returns one MCU's worth of
- * Huffman-compressed coefficients.
- * The coefficients are reordered from zigzag order into natural array order,
- * but are not dequantized.
- *
- * The i'th block of the MCU is stored into the block pointed to by
- * MCU_data[i]. WE ASSUME THIS AREA IS INITIALLY ZEROED BY THE CALLER.
- *
- * We return FALSE if data source requested suspension. In that case no
- * changes have been made to permanent state. (Exception: some output
- * coefficients may already have been assigned. This is harmless for
- * spectral selection, since we'll just re-assign them on the next call.
- * Successive approximation AC refinement has to be more careful, however.)
- */
-
-/*
- * MCU decoding for DC initial scan (either spectral selection,
- * or first pass of successive approximation).
- */
-
-METHODDEF(boolean)
-decode_mcu_DC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
-{
- phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
- int Al = cinfo->Al;
- register int s, r;
- int blkn, ci;
- JBLOCKROW block;
- BITREAD_STATE_VARS;
- savable_state state;
- d_derived_tbl * tbl;
- jpeg_component_info * compptr;
-
- /* Process restart marker if needed; may have to suspend */
- if (cinfo->restart_interval) {
- if (entropy->restarts_to_go == 0)
- if (! process_restart(cinfo))
- return FALSE;
- }
-
- /* If we've run out of data, just leave the MCU set to zeroes.
- * This way, we return uniform gray for the remainder of the segment.
- */
- if (! entropy->pub.insufficient_data) {
-
- /* Load up working state */
- BITREAD_LOAD_STATE(cinfo,entropy->bitstate);
- ASSIGN_STATE(state, entropy->saved);
-
- /* Outer loop handles each block in the MCU */
-
- for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
- block = MCU_data[blkn];
- ci = cinfo->MCU_membership[blkn];
- compptr = cinfo->cur_comp_info[ci];
- tbl = entropy->derived_tbls[compptr->dc_tbl_no];
-
- /* Decode a single block's worth of coefficients */
-
- /* Section F.2.2.1: decode the DC coefficient difference */
- HUFF_DECODE(s, br_state, tbl, return FALSE, label1);
- if (s) {
- CHECK_BIT_BUFFER(br_state, s, return FALSE);
- r = GET_BITS(s);
- s = HUFF_EXTEND(r, s);
- }
-
- /* Convert DC difference to actual value, update last_dc_val */
- s += state.last_dc_val[ci];
- state.last_dc_val[ci] = s;
- /* Scale and output the coefficient (assumes jpeg_natural_order[0]=0) */
- (*block)[0] = (JCOEF) (s << Al);
- }
-
- /* Completed MCU, so update state */
- BITREAD_SAVE_STATE(cinfo,entropy->bitstate);
- ASSIGN_STATE(entropy->saved, state);
- }
-
- /* Account for restart interval (no-op if not using restarts) */
- entropy->restarts_to_go--;
-
- return TRUE;
-}
-
-
-/*
- * MCU decoding for AC initial scan (either spectral selection,
- * or first pass of successive approximation).
- */
-
-METHODDEF(boolean)
-decode_mcu_AC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
-{
- phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
- int Se = cinfo->Se;
- int Al = cinfo->Al;
- register int s, k, r;
- unsigned int EOBRUN;
- JBLOCKROW block;
- BITREAD_STATE_VARS;
- d_derived_tbl * tbl;
-
- /* Process restart marker if needed; may have to suspend */
- if (cinfo->restart_interval) {
- if (entropy->restarts_to_go == 0)
- if (! process_restart(cinfo))
- return FALSE;
- }
-
- /* If we've run out of data, just leave the MCU set to zeroes.
- * This way, we return uniform gray for the remainder of the segment.
- */
- if (! entropy->pub.insufficient_data) {
-
- /* Load up working state.
- * We can avoid loading/saving bitread state if in an EOB run.
- */
- EOBRUN = entropy->saved.EOBRUN; /* only part of saved state we need */
-
- /* There is always only one block per MCU */
-
- if (EOBRUN > 0) /* if it's a band of zeroes... */
- EOBRUN--; /* ...process it now (we do nothing) */
- else {
- BITREAD_LOAD_STATE(cinfo,entropy->bitstate);
- block = MCU_data[0];
- tbl = entropy->ac_derived_tbl;
-
- for (k = cinfo->Ss; k <= Se; k++) {
- HUFF_DECODE(s, br_state, tbl, return FALSE, label2);
- r = s >> 4;
- s &= 15;
- if (s) {
- k += r;
- CHECK_BIT_BUFFER(br_state, s, return FALSE);
- r = GET_BITS(s);
- s = HUFF_EXTEND(r, s);
- /* Scale and output coefficient in natural (dezigzagged) order */
- (*block)[jpeg_natural_order[k]] = (JCOEF) (s << Al);
- } else {
- if (r == 15) { /* ZRL */
- k += 15; /* skip 15 zeroes in band */
- } else { /* EOBr, run length is 2^r + appended bits */
- EOBRUN = 1 << r;
- if (r) { /* EOBr, r > 0 */
- CHECK_BIT_BUFFER(br_state, r, return FALSE);
- r = GET_BITS(r);
- EOBRUN += r;
- }
- EOBRUN--; /* this band is processed at this moment */
- break; /* force end-of-band */
- }
- }
- }
-
- BITREAD_SAVE_STATE(cinfo,entropy->bitstate);
- }
-
- /* Completed MCU, so update state */
- entropy->saved.EOBRUN = EOBRUN; /* only part of saved state we need */
- }
-
- /* Account for restart interval (no-op if not using restarts) */
- entropy->restarts_to_go--;
-
- return TRUE;
-}
-
-
-/*
- * MCU decoding for DC successive approximation refinement scan.
- * Note: we assume such scans can be multi-component, although the spec
- * is not very clear on the point.
- */
-
-METHODDEF(boolean)
-decode_mcu_DC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
-{
- phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
- int p1 = 1 << cinfo->Al; /* 1 in the bit position being coded */
- int blkn;
- JBLOCKROW block;
- BITREAD_STATE_VARS;
-
- /* Process restart marker if needed; may have to suspend */
- if (cinfo->restart_interval) {
- if (entropy->restarts_to_go == 0)
- if (! process_restart(cinfo))
- return FALSE;
- }
-
- /* Not worth the cycles to check insufficient_data here,
- * since we will not change the data anyway if we read zeroes.
- */
-
- /* Load up working state */
- BITREAD_LOAD_STATE(cinfo,entropy->bitstate);
-
- /* Outer loop handles each block in the MCU */
-
- for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
- block = MCU_data[blkn];
-
- /* Encoded data is simply the next bit of the two's-complement DC value */
- CHECK_BIT_BUFFER(br_state, 1, return FALSE);
- if (GET_BITS(1))
- (*block)[0] |= p1;
- /* Note: since we use |=, repeating the assignment later is safe */
- }
-
- /* Completed MCU, so update state */
- BITREAD_SAVE_STATE(cinfo,entropy->bitstate);
-
- /* Account for restart interval (no-op if not using restarts) */
- entropy->restarts_to_go--;
-
- return TRUE;
-}
-
-
-/*
- * MCU decoding for AC successive approximation refinement scan.
- */
-
-METHODDEF(boolean)
-decode_mcu_AC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
-{
- phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
- int Se = cinfo->Se;
- int p1 = 1 << cinfo->Al; /* 1 in the bit position being coded */
- int m1 = (-1) << cinfo->Al; /* -1 in the bit position being coded */
- register int s, k, r;
- unsigned int EOBRUN;
- JBLOCKROW block;
- JCOEFPTR thiscoef;
- BITREAD_STATE_VARS;
- d_derived_tbl * tbl;
- int num_newnz;
- int newnz_pos[DCTSIZE2];
-
- /* Process restart marker if needed; may have to suspend */
- if (cinfo->restart_interval) {
- if (entropy->restarts_to_go == 0)
- if (! process_restart(cinfo))
- return FALSE;
- }
-
- /* If we've run out of data, don't modify the MCU.
- */
- if (! entropy->pub.insufficient_data) {
-
- /* Load up working state */
- BITREAD_LOAD_STATE(cinfo,entropy->bitstate);
- EOBRUN = entropy->saved.EOBRUN; /* only part of saved state we need */
-
- /* There is always only one block per MCU */
- block = MCU_data[0];
- tbl = entropy->ac_derived_tbl;
-
- /* If we are forced to suspend, we must undo the assignments to any newly
- * nonzero coefficients in the block, because otherwise we'd get confused
- * next time about which coefficients were already nonzero.
- * But we need not undo addition of bits to already-nonzero coefficients;
- * instead, we can test the current bit to see if we already did it.
- */
- num_newnz = 0;
-
- /* initialize coefficient loop counter to start of band */
- k = cinfo->Ss;
-
- if (EOBRUN == 0) {
- for (; k <= Se; k++) {
- HUFF_DECODE(s, br_state, tbl, goto undoit, label3);
- r = s >> 4;
- s &= 15;
- if (s) {
- if (s != 1) /* size of new coef should always be 1 */
- WARNMS(cinfo, JWRN_HUFF_BAD_CODE);
- CHECK_BIT_BUFFER(br_state, 1, goto undoit);
- if (GET_BITS(1))
- s = p1; /* newly nonzero coef is positive */
- else
- s = m1; /* newly nonzero coef is negative */
- } else {
- if (r != 15) {
- EOBRUN = 1 << r; /* EOBr, run length is 2^r + appended bits */
- if (r) {
- CHECK_BIT_BUFFER(br_state, r, goto undoit);
- r = GET_BITS(r);
- EOBRUN += r;
- }
- break; /* rest of block is handled by EOB logic */
- }
- /* note s = 0 for processing ZRL */
- }
- /* Advance over already-nonzero coefs and r still-zero coefs,
- * appending correction bits to the nonzeroes. A correction bit is 1
- * if the absolute value of the coefficient must be increased.
- */
- do {
- thiscoef = *block + jpeg_natural_order[k];
- if (*thiscoef != 0) {
- CHECK_BIT_BUFFER(br_state, 1, goto undoit);
- if (GET_BITS(1)) {
- if ((*thiscoef & p1) == 0) { /* do nothing if already set it */
- if (*thiscoef >= 0)
- *thiscoef += p1;
- else
- *thiscoef += m1;
- }
- }
- } else {
- if (--r < 0)
- break; /* reached target zero coefficient */
- }
- k++;
- } while (k <= Se);
- if (s) {
- int pos = jpeg_natural_order[k];
- /* Output newly nonzero coefficient */
- (*block)[pos] = (JCOEF) s;
- /* Remember its position in case we have to suspend */
- newnz_pos[num_newnz++] = pos;
- }
- }
- }
-
- if (EOBRUN > 0) {
- /* Scan any remaining coefficient positions after the end-of-band
- * (the last newly nonzero coefficient, if any). Append a correction
- * bit to each already-nonzero coefficient. A correction bit is 1
- * if the absolute value of the coefficient must be increased.
- */
- for (; k <= Se; k++) {
- thiscoef = *block + jpeg_natural_order[k];
- if (*thiscoef != 0) {
- CHECK_BIT_BUFFER(br_state, 1, goto undoit);
- if (GET_BITS(1)) {
- if ((*thiscoef & p1) == 0) { /* do nothing if already changed it */
- if (*thiscoef >= 0)
- *thiscoef += p1;
- else
- *thiscoef += m1;
- }
- }
- }
- }
- /* Count one block completed in EOB run */
- EOBRUN--;
- }
-
- /* Completed MCU, so update state */
- BITREAD_SAVE_STATE(cinfo,entropy->bitstate);
- entropy->saved.EOBRUN = EOBRUN; /* only part of saved state we need */
- }
-
- /* Account for restart interval (no-op if not using restarts) */
- entropy->restarts_to_go--;
-
- return TRUE;
-
-undoit:
- /* Re-zero any output coefficients that we made newly nonzero */
- while (num_newnz > 0)
- (*block)[newnz_pos[--num_newnz]] = 0;
-
- return FALSE;
-}
-
-
-/*
- * Module initialization routine for progressive Huffman entropy decoding.
- */
-
-GLOBAL(void)
-jinit_phuff_decoder (j_decompress_ptr cinfo)
-{
- phuff_entropy_ptr entropy;
- int *coef_bit_ptr;
- int ci, i;
-
- entropy = (phuff_entropy_ptr)
- (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
- SIZEOF(phuff_entropy_decoder));
- cinfo->entropy = (struct jpeg_entropy_decoder *) entropy;
- entropy->pub.start_pass = start_pass_phuff_decoder;
-
- /* Mark derived tables unallocated */
- for (i = 0; i < NUM_HUFF_TBLS; i++) {
- entropy->derived_tbls[i] = NULL;
- }
-
- /* Create progression status table */
- cinfo->coef_bits = (int (*)[DCTSIZE2])
- (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
- cinfo->num_components*DCTSIZE2*SIZEOF(int));
- coef_bit_ptr = & cinfo->coef_bits[0][0];
- for (ci = 0; ci < cinfo->num_components; ci++)
- for (i = 0; i < DCTSIZE2; i++)
- *coef_bit_ptr++ = -1;
-}
-
-#endif /* D_PROGRESSIVE_SUPPORTED */
-
-#endif //_FX_JPEG_TURBO_
+#if !defined(_FX_JPEG_TURBO_)
+/*
+ * jdphuff.c
+ *
+ * Copyright (C) 1995-1997, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains Huffman entropy decoding routines for progressive JPEG.
+ *
+ * Much of the complexity here has to do with supporting input suspension.
+ * If the data source module demands suspension, we want to be able to back
+ * up to the start of the current MCU. To do this, we copy state variables
+ * into local working storage, and update them back to the permanent
+ * storage only upon successful completion of an MCU.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+#include "jdhuff.h" /* Declarations shared with jdhuff.c */
+
+
+#ifdef D_PROGRESSIVE_SUPPORTED
+
+/*
+ * Expanded entropy decoder object for progressive Huffman decoding.
+ *
+ * The savable_state subrecord contains fields that change within an MCU,
+ * but must not be updated permanently until we complete the MCU.
+ */
+
+typedef struct {
+ unsigned int EOBRUN; /* remaining EOBs in EOBRUN */
+ int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */
+} savable_state;
+
+/* This macro is to work around compilers with missing or broken
+ * structure assignment. You'll need to fix this code if you have
+ * such a compiler and you change MAX_COMPS_IN_SCAN.
+ */
+
+#ifndef NO_STRUCT_ASSIGN
+#define ASSIGN_STATE(dest,src) ((dest) = (src))
+#else
+#if MAX_COMPS_IN_SCAN == 4
+#define ASSIGN_STATE(dest,src) \
+ ((dest).EOBRUN = (src).EOBRUN, \
+ (dest).last_dc_val[0] = (src).last_dc_val[0], \
+ (dest).last_dc_val[1] = (src).last_dc_val[1], \
+ (dest).last_dc_val[2] = (src).last_dc_val[2], \
+ (dest).last_dc_val[3] = (src).last_dc_val[3])
+#endif
+#endif
+
+
+typedef struct {
+ struct jpeg_entropy_decoder pub; /* public fields */
+
+ /* These fields are loaded into local variables at start of each MCU.
+ * In case of suspension, we exit WITHOUT updating them.
+ */
+ bitread_perm_state bitstate; /* Bit buffer at start of MCU */
+ savable_state saved; /* Other state at start of MCU */
+
+ /* These fields are NOT loaded into local working state. */
+ unsigned int restarts_to_go; /* MCUs left in this restart interval */
+
+ /* Pointers to derived tables (these workspaces have image lifespan) */
+ d_derived_tbl * derived_tbls[NUM_HUFF_TBLS];
+
+ d_derived_tbl * ac_derived_tbl; /* active table during an AC scan */
+} phuff_entropy_decoder;
+
+typedef phuff_entropy_decoder * phuff_entropy_ptr;
+
+/* Forward declarations */
+METHODDEF(boolean) decode_mcu_DC_first JPP((j_decompress_ptr cinfo,
+ JBLOCKROW *MCU_data));
+METHODDEF(boolean) decode_mcu_AC_first JPP((j_decompress_ptr cinfo,
+ JBLOCKROW *MCU_data));
+METHODDEF(boolean) decode_mcu_DC_refine JPP((j_decompress_ptr cinfo,
+ JBLOCKROW *MCU_data));
+METHODDEF(boolean) decode_mcu_AC_refine JPP((j_decompress_ptr cinfo,
+ JBLOCKROW *MCU_data));
+
+
+/*
+ * Initialize for a Huffman-compressed scan.
+ */
+
+METHODDEF(void)
+start_pass_phuff_decoder (j_decompress_ptr cinfo)
+{
+ phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
+ boolean is_DC_band, bad;
+ int ci, coefi, tbl;
+ int *coef_bit_ptr;
+ jpeg_component_info * compptr;
+
+ is_DC_band = (cinfo->Ss == 0);
+
+ /* Validate scan parameters */
+ bad = FALSE;
+ if (is_DC_band) {
+ if (cinfo->Se != 0)
+ bad = TRUE;
+ } else {
+ /* need not check Ss/Se < 0 since they came from unsigned bytes */
+ if (cinfo->Ss > cinfo->Se || cinfo->Se >= DCTSIZE2)
+ bad = TRUE;
+ /* AC scans may have only one component */
+ if (cinfo->comps_in_scan != 1)
+ bad = TRUE;
+ }
+ if (cinfo->Ah != 0) {
+ /* Successive approximation refinement scan: must have Al = Ah-1. */
+ if (cinfo->Al != cinfo->Ah-1)
+ bad = TRUE;
+ }
+ if (cinfo->Al > 13) /* need not check for < 0 */
+ bad = TRUE;
+ /* Arguably the maximum Al value should be less than 13 for 8-bit precision,
+ * but the spec doesn't say so, and we try to be liberal about what we
+ * accept. Note: large Al values could result in out-of-range DC
+ * coefficients during early scans, leading to bizarre displays due to
+ * overflows in the IDCT math. But we won't crash.
+ */
+ if (bad)
+ ERREXIT4(cinfo, JERR_BAD_PROGRESSION,
+ cinfo->Ss, cinfo->Se, cinfo->Ah, cinfo->Al);
+ /* Update progression status, and verify that scan order is legal.
+ * Note that inter-scan inconsistencies are treated as warnings
+ * not fatal errors ... not clear if this is right way to behave.
+ */
+ for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
+ int cindex = cinfo->cur_comp_info[ci]->component_index;
+ coef_bit_ptr = & cinfo->coef_bits[cindex][0];
+ if (!is_DC_band && coef_bit_ptr[0] < 0) /* AC without prior DC scan */
+ WARNMS2(cinfo, JWRN_BOGUS_PROGRESSION, cindex, 0);
+ for (coefi = cinfo->Ss; coefi <= cinfo->Se; coefi++) {
+ int expected = (coef_bit_ptr[coefi] < 0) ? 0 : coef_bit_ptr[coefi];
+ if (cinfo->Ah != expected)
+ WARNMS2(cinfo, JWRN_BOGUS_PROGRESSION, cindex, coefi);
+ coef_bit_ptr[coefi] = cinfo->Al;
+ }
+ }
+
+ /* Select MCU decoding routine */
+ if (cinfo->Ah == 0) {
+ if (is_DC_band)
+ entropy->pub.decode_mcu = decode_mcu_DC_first;
+ else
+ entropy->pub.decode_mcu = decode_mcu_AC_first;
+ } else {
+ if (is_DC_band)
+ entropy->pub.decode_mcu = decode_mcu_DC_refine;
+ else
+ entropy->pub.decode_mcu = decode_mcu_AC_refine;
+ }
+
+ for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
+ compptr = cinfo->cur_comp_info[ci];
+ /* Make sure requested tables are present, and compute derived tables.
+ * We may build same derived table more than once, but it's not expensive.
+ */
+ if (is_DC_band) {
+ if (cinfo->Ah == 0) { /* DC refinement needs no table */
+ tbl = compptr->dc_tbl_no;
+ jpeg_make_d_derived_tbl(cinfo, TRUE, tbl,
+ & entropy->derived_tbls[tbl]);
+ }
+ } else {
+ tbl = compptr->ac_tbl_no;
+ jpeg_make_d_derived_tbl(cinfo, FALSE, tbl,
+ & entropy->derived_tbls[tbl]);
+ /* remember the single active table */
+ entropy->ac_derived_tbl = entropy->derived_tbls[tbl];
+ }
+ /* Initialize DC predictions to 0 */
+ entropy->saved.last_dc_val[ci] = 0;
+ }
+
+ /* Initialize bitread state variables */
+ entropy->bitstate.bits_left = 0;
+ entropy->bitstate.get_buffer = 0; /* unnecessary, but keeps Purify quiet */
+ entropy->pub.insufficient_data = FALSE;
+
+ /* Initialize private state variables */
+ entropy->saved.EOBRUN = 0;
+
+ /* Initialize restart counter */
+ entropy->restarts_to_go = cinfo->restart_interval;
+}
+
+
+/*
+ * Figure F.12: extend sign bit.
+ * On some machines, a shift and add will be faster than a table lookup.
+ */
+
+#ifdef AVOID_TABLES
+
+#define HUFF_EXTEND(x,s) ((x) < (1<<((s)-1)) ? (x) + (((-1)<<(s)) + 1) : (x))
+
+#else
+
+#define HUFF_EXTEND(x,s) ((x) < extend_test[s] ? (x) + extend_offset[s] : (x))
+
+static const int extend_test[16] = /* entry n is 2**(n-1) */
+ { 0, 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080,
+ 0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000 };
+
+static const int extend_offset[16] = /* entry n is (-1 << n) + 1 */
+ { 0, ((-1)<<1) + 1, ((-1)<<2) + 1, ((-1)<<3) + 1, ((-1)<<4) + 1,
+ ((-1)<<5) + 1, ((-1)<<6) + 1, ((-1)<<7) + 1, ((-1)<<8) + 1,
+ ((-1)<<9) + 1, ((-1)<<10) + 1, ((-1)<<11) + 1, ((-1)<<12) + 1,
+ ((-1)<<13) + 1, ((-1)<<14) + 1, ((-1)<<15) + 1 };
+
+#endif /* AVOID_TABLES */
+
+
+/*
+ * Check for a restart marker & resynchronize decoder.
+ * Returns FALSE if must suspend.
+ */
+
+LOCAL(boolean)
+process_restart (j_decompress_ptr cinfo)
+{
+ phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
+ int ci;
+
+ /* Throw away any unused bits remaining in bit buffer; */
+ /* include any full bytes in next_marker's count of discarded bytes */
+ cinfo->marker->discarded_bytes += entropy->bitstate.bits_left / 8;
+ entropy->bitstate.bits_left = 0;
+
+ /* Advance past the RSTn marker */
+ if (! (*cinfo->marker->read_restart_marker) (cinfo))
+ return FALSE;
+
+ /* Re-initialize DC predictions to 0 */
+ for (ci = 0; ci < cinfo->comps_in_scan; ci++)
+ entropy->saved.last_dc_val[ci] = 0;
+ /* Re-init EOB run count, too */
+ entropy->saved.EOBRUN = 0;
+
+ /* Reset restart counter */
+ entropy->restarts_to_go = cinfo->restart_interval;
+
+ /* Reset out-of-data flag, unless read_restart_marker left us smack up
+ * against a marker. In that case we will end up treating the next data
+ * segment as empty, and we can avoid producing bogus output pixels by
+ * leaving the flag set.
+ */
+ if (cinfo->unread_marker == 0)
+ entropy->pub.insufficient_data = FALSE;
+
+ return TRUE;
+}
+
+
+/*
+ * Huffman MCU decoding.
+ * Each of these routines decodes and returns one MCU's worth of
+ * Huffman-compressed coefficients.
+ * The coefficients are reordered from zigzag order into natural array order,
+ * but are not dequantized.
+ *
+ * The i'th block of the MCU is stored into the block pointed to by
+ * MCU_data[i]. WE ASSUME THIS AREA IS INITIALLY ZEROED BY THE CALLER.
+ *
+ * We return FALSE if data source requested suspension. In that case no
+ * changes have been made to permanent state. (Exception: some output
+ * coefficients may already have been assigned. This is harmless for
+ * spectral selection, since we'll just re-assign them on the next call.
+ * Successive approximation AC refinement has to be more careful, however.)
+ */
+
+/*
+ * MCU decoding for DC initial scan (either spectral selection,
+ * or first pass of successive approximation).
+ */
+
+METHODDEF(boolean)
+decode_mcu_DC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
+{
+ phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
+ int Al = cinfo->Al;
+ register int s, r;
+ int blkn, ci;
+ JBLOCKROW block;
+ BITREAD_STATE_VARS;
+ savable_state state;
+ d_derived_tbl * tbl;
+ jpeg_component_info * compptr;
+
+ /* Process restart marker if needed; may have to suspend */
+ if (cinfo->restart_interval) {
+ if (entropy->restarts_to_go == 0)
+ if (! process_restart(cinfo))
+ return FALSE;
+ }
+
+ /* If we've run out of data, just leave the MCU set to zeroes.
+ * This way, we return uniform gray for the remainder of the segment.
+ */
+ if (! entropy->pub.insufficient_data) {
+
+ /* Load up working state */
+ BITREAD_LOAD_STATE(cinfo,entropy->bitstate);
+ ASSIGN_STATE(state, entropy->saved);
+
+ /* Outer loop handles each block in the MCU */
+
+ for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
+ block = MCU_data[blkn];
+ ci = cinfo->MCU_membership[blkn];
+ compptr = cinfo->cur_comp_info[ci];
+ tbl = entropy->derived_tbls[compptr->dc_tbl_no];
+
+ /* Decode a single block's worth of coefficients */
+
+ /* Section F.2.2.1: decode the DC coefficient difference */
+ HUFF_DECODE(s, br_state, tbl, return FALSE, label1);
+ if (s) {
+ CHECK_BIT_BUFFER(br_state, s, return FALSE);
+ r = GET_BITS(s);
+ s = HUFF_EXTEND(r, s);
+ }
+
+ /* Convert DC difference to actual value, update last_dc_val */
+ s += state.last_dc_val[ci];
+ state.last_dc_val[ci] = s;
+ /* Scale and output the coefficient (assumes jpeg_natural_order[0]=0) */
+ (*block)[0] = (JCOEF) (s << Al);
+ }
+
+ /* Completed MCU, so update state */
+ BITREAD_SAVE_STATE(cinfo,entropy->bitstate);
+ ASSIGN_STATE(entropy->saved, state);
+ }
+
+ /* Account for restart interval (no-op if not using restarts) */
+ entropy->restarts_to_go--;
+
+ return TRUE;
+}
+
+
+/*
+ * MCU decoding for AC initial scan (either spectral selection,
+ * or first pass of successive approximation).
+ */
+
+METHODDEF(boolean)
+decode_mcu_AC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
+{
+ phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
+ int Se = cinfo->Se;
+ int Al = cinfo->Al;
+ register int s, k, r;
+ unsigned int EOBRUN;
+ JBLOCKROW block;
+ BITREAD_STATE_VARS;
+ d_derived_tbl * tbl;
+
+ /* Process restart marker if needed; may have to suspend */
+ if (cinfo->restart_interval) {
+ if (entropy->restarts_to_go == 0)
+ if (! process_restart(cinfo))
+ return FALSE;
+ }
+
+ /* If we've run out of data, just leave the MCU set to zeroes.
+ * This way, we return uniform gray for the remainder of the segment.
+ */
+ if (! entropy->pub.insufficient_data) {
+
+ /* Load up working state.
+ * We can avoid loading/saving bitread state if in an EOB run.
+ */
+ EOBRUN = entropy->saved.EOBRUN; /* only part of saved state we need */
+
+ /* There is always only one block per MCU */
+
+ if (EOBRUN > 0) /* if it's a band of zeroes... */
+ EOBRUN--; /* ...process it now (we do nothing) */
+ else {
+ BITREAD_LOAD_STATE(cinfo,entropy->bitstate);
+ block = MCU_data[0];
+ tbl = entropy->ac_derived_tbl;
+
+ for (k = cinfo->Ss; k <= Se; k++) {
+ HUFF_DECODE(s, br_state, tbl, return FALSE, label2);
+ r = s >> 4;
+ s &= 15;
+ if (s) {
+ k += r;
+ CHECK_BIT_BUFFER(br_state, s, return FALSE);
+ r = GET_BITS(s);
+ s = HUFF_EXTEND(r, s);
+ /* Scale and output coefficient in natural (dezigzagged) order */
+ (*block)[jpeg_natural_order[k]] = (JCOEF) (s << Al);
+ } else {
+ if (r == 15) { /* ZRL */
+ k += 15; /* skip 15 zeroes in band */
+ } else { /* EOBr, run length is 2^r + appended bits */
+ EOBRUN = 1 << r;
+ if (r) { /* EOBr, r > 0 */
+ CHECK_BIT_BUFFER(br_state, r, return FALSE);
+ r = GET_BITS(r);
+ EOBRUN += r;
+ }
+ EOBRUN--; /* this band is processed at this moment */
+ break; /* force end-of-band */
+ }
+ }
+ }
+
+ BITREAD_SAVE_STATE(cinfo,entropy->bitstate);
+ }
+
+ /* Completed MCU, so update state */
+ entropy->saved.EOBRUN = EOBRUN; /* only part of saved state we need */
+ }
+
+ /* Account for restart interval (no-op if not using restarts) */
+ entropy->restarts_to_go--;
+
+ return TRUE;
+}
+
+
+/*
+ * MCU decoding for DC successive approximation refinement scan.
+ * Note: we assume such scans can be multi-component, although the spec
+ * is not very clear on the point.
+ */
+
+METHODDEF(boolean)
+decode_mcu_DC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
+{
+ phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
+ int p1 = 1 << cinfo->Al; /* 1 in the bit position being coded */
+ int blkn;
+ JBLOCKROW block;
+ BITREAD_STATE_VARS;
+
+ /* Process restart marker if needed; may have to suspend */
+ if (cinfo->restart_interval) {
+ if (entropy->restarts_to_go == 0)
+ if (! process_restart(cinfo))
+ return FALSE;
+ }
+
+ /* Not worth the cycles to check insufficient_data here,
+ * since we will not change the data anyway if we read zeroes.
+ */
+
+ /* Load up working state */
+ BITREAD_LOAD_STATE(cinfo,entropy->bitstate);
+
+ /* Outer loop handles each block in the MCU */
+
+ for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
+ block = MCU_data[blkn];
+
+ /* Encoded data is simply the next bit of the two's-complement DC value */
+ CHECK_BIT_BUFFER(br_state, 1, return FALSE);
+ if (GET_BITS(1))
+ (*block)[0] |= p1;
+ /* Note: since we use |=, repeating the assignment later is safe */
+ }
+
+ /* Completed MCU, so update state */
+ BITREAD_SAVE_STATE(cinfo,entropy->bitstate);
+
+ /* Account for restart interval (no-op if not using restarts) */
+ entropy->restarts_to_go--;
+
+ return TRUE;
+}
+
+
+/*
+ * MCU decoding for AC successive approximation refinement scan.
+ */
+
+METHODDEF(boolean)
+decode_mcu_AC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
+{
+ phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
+ int Se = cinfo->Se;
+ int p1 = 1 << cinfo->Al; /* 1 in the bit position being coded */
+ int m1 = (-1) << cinfo->Al; /* -1 in the bit position being coded */
+ register int s, k, r;
+ unsigned int EOBRUN;
+ JBLOCKROW block;
+ JCOEFPTR thiscoef;
+ BITREAD_STATE_VARS;
+ d_derived_tbl * tbl;
+ int num_newnz;
+ int newnz_pos[DCTSIZE2];
+
+ /* Process restart marker if needed; may have to suspend */
+ if (cinfo->restart_interval) {
+ if (entropy->restarts_to_go == 0)
+ if (! process_restart(cinfo))
+ return FALSE;
+ }
+
+ /* If we've run out of data, don't modify the MCU.
+ */
+ if (! entropy->pub.insufficient_data) {
+
+ /* Load up working state */
+ BITREAD_LOAD_STATE(cinfo,entropy->bitstate);
+ EOBRUN = entropy->saved.EOBRUN; /* only part of saved state we need */
+
+ /* There is always only one block per MCU */
+ block = MCU_data[0];
+ tbl = entropy->ac_derived_tbl;
+
+ /* If we are forced to suspend, we must undo the assignments to any newly
+ * nonzero coefficients in the block, because otherwise we'd get confused
+ * next time about which coefficients were already nonzero.
+ * But we need not undo addition of bits to already-nonzero coefficients;
+ * instead, we can test the current bit to see if we already did it.
+ */
+ num_newnz = 0;
+
+ /* initialize coefficient loop counter to start of band */
+ k = cinfo->Ss;
+
+ if (EOBRUN == 0) {
+ for (; k <= Se; k++) {
+ HUFF_DECODE(s, br_state, tbl, goto undoit, label3);
+ r = s >> 4;
+ s &= 15;
+ if (s) {
+ if (s != 1) /* size of new coef should always be 1 */
+ WARNMS(cinfo, JWRN_HUFF_BAD_CODE);
+ CHECK_BIT_BUFFER(br_state, 1, goto undoit);
+ if (GET_BITS(1))
+ s = p1; /* newly nonzero coef is positive */
+ else
+ s = m1; /* newly nonzero coef is negative */
+ } else {
+ if (r != 15) {
+ EOBRUN = 1 << r; /* EOBr, run length is 2^r + appended bits */
+ if (r) {
+ CHECK_BIT_BUFFER(br_state, r, goto undoit);
+ r = GET_BITS(r);
+ EOBRUN += r;
+ }
+ break; /* rest of block is handled by EOB logic */
+ }
+ /* note s = 0 for processing ZRL */
+ }
+ /* Advance over already-nonzero coefs and r still-zero coefs,
+ * appending correction bits to the nonzeroes. A correction bit is 1
+ * if the absolute value of the coefficient must be increased.
+ */
+ do {
+ thiscoef = *block + jpeg_natural_order[k];
+ if (*thiscoef != 0) {
+ CHECK_BIT_BUFFER(br_state, 1, goto undoit);
+ if (GET_BITS(1)) {
+ if ((*thiscoef & p1) == 0) { /* do nothing if already set it */
+ if (*thiscoef >= 0)
+ *thiscoef += p1;
+ else
+ *thiscoef += m1;
+ }
+ }
+ } else {
+ if (--r < 0)
+ break; /* reached target zero coefficient */
+ }
+ k++;
+ } while (k <= Se);
+ if (s) {
+ int pos = jpeg_natural_order[k];
+ /* Output newly nonzero coefficient */
+ (*block)[pos] = (JCOEF) s;
+ /* Remember its position in case we have to suspend */
+ newnz_pos[num_newnz++] = pos;
+ }
+ }
+ }
+
+ if (EOBRUN > 0) {
+ /* Scan any remaining coefficient positions after the end-of-band
+ * (the last newly nonzero coefficient, if any). Append a correction
+ * bit to each already-nonzero coefficient. A correction bit is 1
+ * if the absolute value of the coefficient must be increased.
+ */
+ for (; k <= Se; k++) {
+ thiscoef = *block + jpeg_natural_order[k];
+ if (*thiscoef != 0) {
+ CHECK_BIT_BUFFER(br_state, 1, goto undoit);
+ if (GET_BITS(1)) {
+ if ((*thiscoef & p1) == 0) { /* do nothing if already changed it */
+ if (*thiscoef >= 0)
+ *thiscoef += p1;
+ else
+ *thiscoef += m1;
+ }
+ }
+ }
+ }
+ /* Count one block completed in EOB run */
+ EOBRUN--;
+ }
+
+ /* Completed MCU, so update state */
+ BITREAD_SAVE_STATE(cinfo,entropy->bitstate);
+ entropy->saved.EOBRUN = EOBRUN; /* only part of saved state we need */
+ }
+
+ /* Account for restart interval (no-op if not using restarts) */
+ entropy->restarts_to_go--;
+
+ return TRUE;
+
+undoit:
+ /* Re-zero any output coefficients that we made newly nonzero */
+ while (num_newnz > 0)
+ (*block)[newnz_pos[--num_newnz]] = 0;
+
+ return FALSE;
+}
+
+
+/*
+ * Module initialization routine for progressive Huffman entropy decoding.
+ */
+
+GLOBAL(void)
+jinit_phuff_decoder (j_decompress_ptr cinfo)
+{
+ phuff_entropy_ptr entropy;
+ int *coef_bit_ptr;
+ int ci, i;
+
+ entropy = (phuff_entropy_ptr)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ SIZEOF(phuff_entropy_decoder));
+ cinfo->entropy = (struct jpeg_entropy_decoder *) entropy;
+ entropy->pub.start_pass = start_pass_phuff_decoder;
+
+ /* Mark derived tables unallocated */
+ for (i = 0; i < NUM_HUFF_TBLS; i++) {
+ entropy->derived_tbls[i] = NULL;
+ }
+
+ /* Create progression status table */
+ cinfo->coef_bits = (int (*)[DCTSIZE2])
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ cinfo->num_components*DCTSIZE2*SIZEOF(int));
+ coef_bit_ptr = & cinfo->coef_bits[0][0];
+ for (ci = 0; ci < cinfo->num_components; ci++)
+ for (i = 0; i < DCTSIZE2; i++)
+ *coef_bit_ptr++ = -1;
+}
+
+#endif /* D_PROGRESSIVE_SUPPORTED */
+
+#endif //_FX_JPEG_TURBO_
diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jdpostct.c b/core/src/fxcodec/libjpeg/fpdfapi_jdpostct.c
index 855be5c8aa..13b1b1bb0c 100644
--- a/core/src/fxcodec/libjpeg/fpdfapi_jdpostct.c
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jdpostct.c
@@ -1,293 +1,293 @@
-#if !defined(_FX_JPEG_TURBO_)
-/*
- * jdpostct.c
- *
- * Copyright (C) 1994-1996, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains the decompression postprocessing controller.
- * This controller manages the upsampling, color conversion, and color
- * quantization/reduction steps; specifically, it controls the buffering
- * between upsample/color conversion and color quantization/reduction.
- *
- * If no color quantization/reduction is required, then this module has no
- * work to do, and it just hands off to the upsample/color conversion code.
- * An integrated upsample/convert/quantize process would replace this module
- * entirely.
- */
-
-#define JPEG_INTERNALS
-#include "jinclude.h"
-#include "jpeglib.h"
-
-
-/* Private buffer controller object */
-
-typedef struct {
- struct jpeg_d_post_controller pub; /* public fields */
-
- /* Color quantization source buffer: this holds output data from
- * the upsample/color conversion step to be passed to the quantizer.
- * For two-pass color quantization, we need a full-image buffer;
- * for one-pass operation, a strip buffer is sufficient.
- */
- jvirt_sarray_ptr whole_image; /* virtual array, or NULL if one-pass */
- JSAMPARRAY buffer; /* strip buffer, or current strip of virtual */
- JDIMENSION strip_height; /* buffer size in rows */
- /* for two-pass mode only: */
- JDIMENSION starting_row; /* row # of first row in current strip */
- JDIMENSION next_row; /* index of next row to fill/empty in strip */
-} my_post_controller;
-
-typedef my_post_controller * my_post_ptr;
-
-
-/* Forward declarations */
-METHODDEF(void) post_process_1pass
- JPP((j_decompress_ptr cinfo,
- JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr,
- JDIMENSION in_row_groups_avail,
- JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
- JDIMENSION out_rows_avail));
-#ifdef QUANT_2PASS_SUPPORTED
-METHODDEF(void) post_process_prepass
- JPP((j_decompress_ptr cinfo,
- JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr,
- JDIMENSION in_row_groups_avail,
- JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
- JDIMENSION out_rows_avail));
-METHODDEF(void) post_process_2pass
- JPP((j_decompress_ptr cinfo,
- JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr,
- JDIMENSION in_row_groups_avail,
- JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
- JDIMENSION out_rows_avail));
-#endif
-
-
-/*
- * Initialize for a processing pass.
- */
-
-METHODDEF(void)
-start_pass_dpost (j_decompress_ptr cinfo, J_BUF_MODE pass_mode)
-{
- my_post_ptr post = (my_post_ptr) cinfo->post;
-
- switch (pass_mode) {
- case JBUF_PASS_THRU:
- if (cinfo->quantize_colors) {
- /* Single-pass processing with color quantization. */
- post->pub.post_process_data = post_process_1pass;
- /* We could be doing buffered-image output before starting a 2-pass
- * color quantization; in that case, jinit_d_post_controller did not
- * allocate a strip buffer. Use the virtual-array buffer as workspace.
- */
- if (post->buffer == NULL) {
- post->buffer = (*cinfo->mem->access_virt_sarray)
- ((j_common_ptr) cinfo, post->whole_image,
- (JDIMENSION) 0, post->strip_height, TRUE);
- }
- } else {
- /* For single-pass processing without color quantization,
- * I have no work to do; just call the upsampler directly.
- */
- post->pub.post_process_data = cinfo->upsample->upsample;
- }
- break;
-#ifdef QUANT_2PASS_SUPPORTED
- case JBUF_SAVE_AND_PASS:
- /* First pass of 2-pass quantization */
- if (post->whole_image == NULL)
- ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
- post->pub.post_process_data = post_process_prepass;
- break;
- case JBUF_CRANK_DEST:
- /* Second pass of 2-pass quantization */
- if (post->whole_image == NULL)
- ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
- post->pub.post_process_data = post_process_2pass;
- break;
-#endif /* QUANT_2PASS_SUPPORTED */
- default:
- ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
- break;
- }
- post->starting_row = post->next_row = 0;
-}
-
-
-/*
- * Process some data in the one-pass (strip buffer) case.
- * This is used for color precision reduction as well as one-pass quantization.
- */
-
-METHODDEF(void)
-post_process_1pass (j_decompress_ptr cinfo,
- JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr,
- JDIMENSION in_row_groups_avail,
- JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
- JDIMENSION out_rows_avail)
-{
- my_post_ptr post = (my_post_ptr) cinfo->post;
- JDIMENSION num_rows, max_rows;
-
- /* Fill the buffer, but not more than what we can dump out in one go. */
- /* Note we rely on the upsampler to detect bottom of image. */
- max_rows = out_rows_avail - *out_row_ctr;
- if (max_rows > post->strip_height)
- max_rows = post->strip_height;
- num_rows = 0;
- (*cinfo->upsample->upsample) (cinfo,
- input_buf, in_row_group_ctr, in_row_groups_avail,
- post->buffer, &num_rows, max_rows);
- /* Quantize and emit data. */
- (*cinfo->cquantize->color_quantize) (cinfo,
- post->buffer, output_buf + *out_row_ctr, (int) num_rows);
- *out_row_ctr += num_rows;
-}
-
-
-#ifdef QUANT_2PASS_SUPPORTED
-
-/*
- * Process some data in the first pass of 2-pass quantization.
- */
-
-METHODDEF(void)
-post_process_prepass (j_decompress_ptr cinfo,
- JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr,
- JDIMENSION in_row_groups_avail,
- JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
- JDIMENSION out_rows_avail)
-{
- my_post_ptr post = (my_post_ptr) cinfo->post;
- JDIMENSION old_next_row, num_rows;
-
- /* Reposition virtual buffer if at start of strip. */
- if (post->next_row == 0) {
- post->buffer = (*cinfo->mem->access_virt_sarray)
- ((j_common_ptr) cinfo, post->whole_image,
- post->starting_row, post->strip_height, TRUE);
- }
-
- /* Upsample some data (up to a strip height's worth). */
- old_next_row = post->next_row;
- (*cinfo->upsample->upsample) (cinfo,
- input_buf, in_row_group_ctr, in_row_groups_avail,
- post->buffer, &post->next_row, post->strip_height);
-
- /* Allow quantizer to scan new data. No data is emitted, */
- /* but we advance out_row_ctr so outer loop can tell when we're done. */
- if (post->next_row > old_next_row) {
- num_rows = post->next_row - old_next_row;
- (*cinfo->cquantize->color_quantize) (cinfo, post->buffer + old_next_row,
- (JSAMPARRAY) NULL, (int) num_rows);
- *out_row_ctr += num_rows;
- }
-
- /* Advance if we filled the strip. */
- if (post->next_row >= post->strip_height) {
- post->starting_row += post->strip_height;
- post->next_row = 0;
- }
-}
-
-
-/*
- * Process some data in the second pass of 2-pass quantization.
- */
-
-METHODDEF(void)
-post_process_2pass (j_decompress_ptr cinfo,
- JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr,
- JDIMENSION in_row_groups_avail,
- JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
- JDIMENSION out_rows_avail)
-{
- my_post_ptr post = (my_post_ptr) cinfo->post;
- JDIMENSION num_rows, max_rows;
-
- /* Reposition virtual buffer if at start of strip. */
- if (post->next_row == 0) {
- post->buffer = (*cinfo->mem->access_virt_sarray)
- ((j_common_ptr) cinfo, post->whole_image,
- post->starting_row, post->strip_height, FALSE);
- }
-
- /* Determine number of rows to emit. */
- num_rows = post->strip_height - post->next_row; /* available in strip */
- max_rows = out_rows_avail - *out_row_ctr; /* available in output area */
- if (num_rows > max_rows)
- num_rows = max_rows;
- /* We have to check bottom of image here, can't depend on upsampler. */
- max_rows = cinfo->output_height - post->starting_row;
- if (num_rows > max_rows)
- num_rows = max_rows;
-
- /* Quantize and emit data. */
- (*cinfo->cquantize->color_quantize) (cinfo,
- post->buffer + post->next_row, output_buf + *out_row_ctr,
- (int) num_rows);
- *out_row_ctr += num_rows;
-
- /* Advance if we filled the strip. */
- post->next_row += num_rows;
- if (post->next_row >= post->strip_height) {
- post->starting_row += post->strip_height;
- post->next_row = 0;
- }
-}
-
-#endif /* QUANT_2PASS_SUPPORTED */
-
-
-/*
- * Initialize postprocessing controller.
- */
-
-GLOBAL(void)
-jinit_d_post_controller (j_decompress_ptr cinfo, boolean need_full_buffer)
-{
- my_post_ptr post;
-
- post = (my_post_ptr)
- (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
- SIZEOF(my_post_controller));
- cinfo->post = (struct jpeg_d_post_controller *) post;
- post->pub.start_pass = start_pass_dpost;
- post->whole_image = NULL; /* flag for no virtual arrays */
- post->buffer = NULL; /* flag for no strip buffer */
-
- /* Create the quantization buffer, if needed */
- if (cinfo->quantize_colors) {
- /* The buffer strip height is max_v_samp_factor, which is typically
- * an efficient number of rows for upsampling to return.
- * (In the presence of output rescaling, we might want to be smarter?)
- */
- post->strip_height = (JDIMENSION) cinfo->max_v_samp_factor;
- if (need_full_buffer) {
- /* Two-pass color quantization: need full-image storage. */
- /* We round up the number of rows to a multiple of the strip height. */
-#ifdef QUANT_2PASS_SUPPORTED
- post->whole_image = (*cinfo->mem->request_virt_sarray)
- ((j_common_ptr) cinfo, JPOOL_IMAGE, FALSE,
- cinfo->output_width * cinfo->out_color_components,
- (JDIMENSION) jround_up((long) cinfo->output_height,
- (long) post->strip_height),
- post->strip_height);
-#else
- ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
-#endif /* QUANT_2PASS_SUPPORTED */
- } else {
- /* One-pass color quantization: just make a strip buffer. */
- post->buffer = (*cinfo->mem->alloc_sarray)
- ((j_common_ptr) cinfo, JPOOL_IMAGE,
- cinfo->output_width * cinfo->out_color_components,
- post->strip_height);
- }
- }
-}
-
-#endif //_FX_JPEG_TURBO_
+#if !defined(_FX_JPEG_TURBO_)
+/*
+ * jdpostct.c
+ *
+ * Copyright (C) 1994-1996, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains the decompression postprocessing controller.
+ * This controller manages the upsampling, color conversion, and color
+ * quantization/reduction steps; specifically, it controls the buffering
+ * between upsample/color conversion and color quantization/reduction.
+ *
+ * If no color quantization/reduction is required, then this module has no
+ * work to do, and it just hands off to the upsample/color conversion code.
+ * An integrated upsample/convert/quantize process would replace this module
+ * entirely.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+
+
+/* Private buffer controller object */
+
+typedef struct {
+ struct jpeg_d_post_controller pub; /* public fields */
+
+ /* Color quantization source buffer: this holds output data from
+ * the upsample/color conversion step to be passed to the quantizer.
+ * For two-pass color quantization, we need a full-image buffer;
+ * for one-pass operation, a strip buffer is sufficient.
+ */
+ jvirt_sarray_ptr whole_image; /* virtual array, or NULL if one-pass */
+ JSAMPARRAY buffer; /* strip buffer, or current strip of virtual */
+ JDIMENSION strip_height; /* buffer size in rows */
+ /* for two-pass mode only: */
+ JDIMENSION starting_row; /* row # of first row in current strip */
+ JDIMENSION next_row; /* index of next row to fill/empty in strip */
+} my_post_controller;
+
+typedef my_post_controller * my_post_ptr;
+
+
+/* Forward declarations */
+METHODDEF(void) post_process_1pass
+ JPP((j_decompress_ptr cinfo,
+ JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr,
+ JDIMENSION in_row_groups_avail,
+ JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
+ JDIMENSION out_rows_avail));
+#ifdef QUANT_2PASS_SUPPORTED
+METHODDEF(void) post_process_prepass
+ JPP((j_decompress_ptr cinfo,
+ JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr,
+ JDIMENSION in_row_groups_avail,
+ JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
+ JDIMENSION out_rows_avail));
+METHODDEF(void) post_process_2pass
+ JPP((j_decompress_ptr cinfo,
+ JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr,
+ JDIMENSION in_row_groups_avail,
+ JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
+ JDIMENSION out_rows_avail));
+#endif
+
+
+/*
+ * Initialize for a processing pass.
+ */
+
+METHODDEF(void)
+start_pass_dpost (j_decompress_ptr cinfo, J_BUF_MODE pass_mode)
+{
+ my_post_ptr post = (my_post_ptr) cinfo->post;
+
+ switch (pass_mode) {
+ case JBUF_PASS_THRU:
+ if (cinfo->quantize_colors) {
+ /* Single-pass processing with color quantization. */
+ post->pub.post_process_data = post_process_1pass;
+ /* We could be doing buffered-image output before starting a 2-pass
+ * color quantization; in that case, jinit_d_post_controller did not
+ * allocate a strip buffer. Use the virtual-array buffer as workspace.
+ */
+ if (post->buffer == NULL) {
+ post->buffer = (*cinfo->mem->access_virt_sarray)
+ ((j_common_ptr) cinfo, post->whole_image,
+ (JDIMENSION) 0, post->strip_height, TRUE);
+ }
+ } else {
+ /* For single-pass processing without color quantization,
+ * I have no work to do; just call the upsampler directly.
+ */
+ post->pub.post_process_data = cinfo->upsample->upsample;
+ }
+ break;
+#ifdef QUANT_2PASS_SUPPORTED
+ case JBUF_SAVE_AND_PASS:
+ /* First pass of 2-pass quantization */
+ if (post->whole_image == NULL)
+ ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
+ post->pub.post_process_data = post_process_prepass;
+ break;
+ case JBUF_CRANK_DEST:
+ /* Second pass of 2-pass quantization */
+ if (post->whole_image == NULL)
+ ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
+ post->pub.post_process_data = post_process_2pass;
+ break;
+#endif /* QUANT_2PASS_SUPPORTED */
+ default:
+ ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
+ break;
+ }
+ post->starting_row = post->next_row = 0;
+}
+
+
+/*
+ * Process some data in the one-pass (strip buffer) case.
+ * This is used for color precision reduction as well as one-pass quantization.
+ */
+
+METHODDEF(void)
+post_process_1pass (j_decompress_ptr cinfo,
+ JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr,
+ JDIMENSION in_row_groups_avail,
+ JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
+ JDIMENSION out_rows_avail)
+{
+ my_post_ptr post = (my_post_ptr) cinfo->post;
+ JDIMENSION num_rows, max_rows;
+
+ /* Fill the buffer, but not more than what we can dump out in one go. */
+ /* Note we rely on the upsampler to detect bottom of image. */
+ max_rows = out_rows_avail - *out_row_ctr;
+ if (max_rows > post->strip_height)
+ max_rows = post->strip_height;
+ num_rows = 0;
+ (*cinfo->upsample->upsample) (cinfo,
+ input_buf, in_row_group_ctr, in_row_groups_avail,
+ post->buffer, &num_rows, max_rows);
+ /* Quantize and emit data. */
+ (*cinfo->cquantize->color_quantize) (cinfo,
+ post->buffer, output_buf + *out_row_ctr, (int) num_rows);
+ *out_row_ctr += num_rows;
+}
+
+
+#ifdef QUANT_2PASS_SUPPORTED
+
+/*
+ * Process some data in the first pass of 2-pass quantization.
+ */
+
+METHODDEF(void)
+post_process_prepass (j_decompress_ptr cinfo,
+ JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr,
+ JDIMENSION in_row_groups_avail,
+ JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
+ JDIMENSION out_rows_avail)
+{
+ my_post_ptr post = (my_post_ptr) cinfo->post;
+ JDIMENSION old_next_row, num_rows;
+
+ /* Reposition virtual buffer if at start of strip. */
+ if (post->next_row == 0) {
+ post->buffer = (*cinfo->mem->access_virt_sarray)
+ ((j_common_ptr) cinfo, post->whole_image,
+ post->starting_row, post->strip_height, TRUE);
+ }
+
+ /* Upsample some data (up to a strip height's worth). */
+ old_next_row = post->next_row;
+ (*cinfo->upsample->upsample) (cinfo,
+ input_buf, in_row_group_ctr, in_row_groups_avail,
+ post->buffer, &post->next_row, post->strip_height);
+
+ /* Allow quantizer to scan new data. No data is emitted, */
+ /* but we advance out_row_ctr so outer loop can tell when we're done. */
+ if (post->next_row > old_next_row) {
+ num_rows = post->next_row - old_next_row;
+ (*cinfo->cquantize->color_quantize) (cinfo, post->buffer + old_next_row,
+ (JSAMPARRAY) NULL, (int) num_rows);
+ *out_row_ctr += num_rows;
+ }
+
+ /* Advance if we filled the strip. */
+ if (post->next_row >= post->strip_height) {
+ post->starting_row += post->strip_height;
+ post->next_row = 0;
+ }
+}
+
+
+/*
+ * Process some data in the second pass of 2-pass quantization.
+ */
+
+METHODDEF(void)
+post_process_2pass (j_decompress_ptr cinfo,
+ JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr,
+ JDIMENSION in_row_groups_avail,
+ JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
+ JDIMENSION out_rows_avail)
+{
+ my_post_ptr post = (my_post_ptr) cinfo->post;
+ JDIMENSION num_rows, max_rows;
+
+ /* Reposition virtual buffer if at start of strip. */
+ if (post->next_row == 0) {
+ post->buffer = (*cinfo->mem->access_virt_sarray)
+ ((j_common_ptr) cinfo, post->whole_image,
+ post->starting_row, post->strip_height, FALSE);
+ }
+
+ /* Determine number of rows to emit. */
+ num_rows = post->strip_height - post->next_row; /* available in strip */
+ max_rows = out_rows_avail - *out_row_ctr; /* available in output area */
+ if (num_rows > max_rows)
+ num_rows = max_rows;
+ /* We have to check bottom of image here, can't depend on upsampler. */
+ max_rows = cinfo->output_height - post->starting_row;
+ if (num_rows > max_rows)
+ num_rows = max_rows;
+
+ /* Quantize and emit data. */
+ (*cinfo->cquantize->color_quantize) (cinfo,
+ post->buffer + post->next_row, output_buf + *out_row_ctr,
+ (int) num_rows);
+ *out_row_ctr += num_rows;
+
+ /* Advance if we filled the strip. */
+ post->next_row += num_rows;
+ if (post->next_row >= post->strip_height) {
+ post->starting_row += post->strip_height;
+ post->next_row = 0;
+ }
+}
+
+#endif /* QUANT_2PASS_SUPPORTED */
+
+
+/*
+ * Initialize postprocessing controller.
+ */
+
+GLOBAL(void)
+jinit_d_post_controller (j_decompress_ptr cinfo, boolean need_full_buffer)
+{
+ my_post_ptr post;
+
+ post = (my_post_ptr)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ SIZEOF(my_post_controller));
+ cinfo->post = (struct jpeg_d_post_controller *) post;
+ post->pub.start_pass = start_pass_dpost;
+ post->whole_image = NULL; /* flag for no virtual arrays */
+ post->buffer = NULL; /* flag for no strip buffer */
+
+ /* Create the quantization buffer, if needed */
+ if (cinfo->quantize_colors) {
+ /* The buffer strip height is max_v_samp_factor, which is typically
+ * an efficient number of rows for upsampling to return.
+ * (In the presence of output rescaling, we might want to be smarter?)
+ */
+ post->strip_height = (JDIMENSION) cinfo->max_v_samp_factor;
+ if (need_full_buffer) {
+ /* Two-pass color quantization: need full-image storage. */
+ /* We round up the number of rows to a multiple of the strip height. */
+#ifdef QUANT_2PASS_SUPPORTED
+ post->whole_image = (*cinfo->mem->request_virt_sarray)
+ ((j_common_ptr) cinfo, JPOOL_IMAGE, FALSE,
+ cinfo->output_width * cinfo->out_color_components,
+ (JDIMENSION) jround_up((long) cinfo->output_height,
+ (long) post->strip_height),
+ post->strip_height);
+#else
+ ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
+#endif /* QUANT_2PASS_SUPPORTED */
+ } else {
+ /* One-pass color quantization: just make a strip buffer. */
+ post->buffer = (*cinfo->mem->alloc_sarray)
+ ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ cinfo->output_width * cinfo->out_color_components,
+ post->strip_height);
+ }
+ }
+}
+
+#endif //_FX_JPEG_TURBO_
diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jdsample.c b/core/src/fxcodec/libjpeg/fpdfapi_jdsample.c
index a2eae954b5..da9c38ce38 100644
--- a/core/src/fxcodec/libjpeg/fpdfapi_jdsample.c
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jdsample.c
@@ -1,481 +1,481 @@
-#if !defined(_FX_JPEG_TURBO_)
-/*
- * jdsample.c
- *
- * Copyright (C) 1991-1996, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains upsampling routines.
- *
- * Upsampling input data is counted in "row groups". A row group
- * is defined to be (v_samp_factor * DCT_scaled_size / min_DCT_scaled_size)
- * sample rows of each component. Upsampling will normally produce
- * max_v_samp_factor pixel rows from each row group (but this could vary
- * if the upsampler is applying a scale factor of its own).
- *
- * An excellent reference for image resampling is
- * Digital Image Warping, George Wolberg, 1990.
- * Pub. by IEEE Computer Society Press, Los Alamitos, CA. ISBN 0-8186-8944-7.
- */
-
-#define JPEG_INTERNALS
-#include "jinclude.h"
-#include "jpeglib.h"
-
-
-/* Pointer to routine to upsample a single component */
-typedef JMETHOD(void, upsample1_ptr,
- (j_decompress_ptr cinfo, jpeg_component_info * compptr,
- JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr));
-
-/* Private subobject */
-
-typedef struct {
- struct jpeg_upsampler pub; /* public fields */
-
- /* Color conversion buffer. When using separate upsampling and color
- * conversion steps, this buffer holds one upsampled row group until it
- * has been color converted and output.
- * Note: we do not allocate any storage for component(s) which are full-size,
- * ie do not need rescaling. The corresponding entry of color_buf[] is
- * simply set to point to the input data array, thereby avoiding copying.
- */
- JSAMPARRAY color_buf[MAX_COMPONENTS];
-
- /* Per-component upsampling method pointers */
- upsample1_ptr methods[MAX_COMPONENTS];
-
- int next_row_out; /* counts rows emitted from color_buf */
- JDIMENSION rows_to_go; /* counts rows remaining in image */
-
- /* Height of an input row group for each component. */
- int rowgroup_height[MAX_COMPONENTS];
-
- /* These arrays save pixel expansion factors so that int_expand need not
- * recompute them each time. They are unused for other upsampling methods.
- */
- UINT8 h_expand[MAX_COMPONENTS];
- UINT8 v_expand[MAX_COMPONENTS];
-} my_upsampler;
-
-typedef my_upsampler * my_upsample_ptr;
-
-
-/*
- * Initialize for an upsampling pass.
- */
-
-METHODDEF(void)
-start_pass_upsample (j_decompress_ptr cinfo)
-{
- my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;
-
- /* Mark the conversion buffer empty */
- upsample->next_row_out = cinfo->max_v_samp_factor;
- /* Initialize total-height counter for detecting bottom of image */
- upsample->rows_to_go = cinfo->output_height;
-}
-
-
-/*
- * Control routine to do upsampling (and color conversion).
- *
- * In this version we upsample each component independently.
- * We upsample one row group into the conversion buffer, then apply
- * color conversion a row at a time.
- */
-
-METHODDEF(void)
-sep_upsample (j_decompress_ptr cinfo,
- JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr,
- JDIMENSION in_row_groups_avail,
- JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
- JDIMENSION out_rows_avail)
-{
- my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;
- int ci;
- jpeg_component_info * compptr;
- JDIMENSION num_rows;
-
- /* Fill the conversion buffer, if it's empty */
- if (upsample->next_row_out >= cinfo->max_v_samp_factor) {
- for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
- ci++, compptr++) {
- /* Invoke per-component upsample method. Notice we pass a POINTER
- * to color_buf[ci], so that fullsize_upsample can change it.
- */
- (*upsample->methods[ci]) (cinfo, compptr,
- input_buf[ci] + (*in_row_group_ctr * upsample->rowgroup_height[ci]),
- upsample->color_buf + ci);
- }
- upsample->next_row_out = 0;
- }
-
- /* Color-convert and emit rows */
-
- /* How many we have in the buffer: */
- num_rows = (JDIMENSION) (cinfo->max_v_samp_factor - upsample->next_row_out);
- /* Not more than the distance to the end of the image. Need this test
- * in case the image height is not a multiple of max_v_samp_factor:
- */
- if (num_rows > upsample->rows_to_go)
- num_rows = upsample->rows_to_go;
- /* And not more than what the client can accept: */
- out_rows_avail -= *out_row_ctr;
- if (num_rows > out_rows_avail)
- num_rows = out_rows_avail;
-
- (*cinfo->cconvert->color_convert) (cinfo, upsample->color_buf,
- (JDIMENSION) upsample->next_row_out,
- output_buf + *out_row_ctr,
- (int) num_rows);
-
- /* Adjust counts */
- *out_row_ctr += num_rows;
- upsample->rows_to_go -= num_rows;
- upsample->next_row_out += num_rows;
- /* When the buffer is emptied, declare this input row group consumed */
- if (upsample->next_row_out >= cinfo->max_v_samp_factor)
- (*in_row_group_ctr)++;
-}
-
-
-/*
- * These are the routines invoked by sep_upsample to upsample pixel values
- * of a single component. One row group is processed per call.
- */
-
-
-/*
- * For full-size components, we just make color_buf[ci] point at the
- * input buffer, and thus avoid copying any data. Note that this is
- * safe only because sep_upsample doesn't declare the input row group
- * "consumed" until we are done color converting and emitting it.
- */
-
-METHODDEF(void)
-fullsize_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr,
- JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr)
-{
- *output_data_ptr = input_data;
-}
-
-
-/*
- * This is a no-op version used for "uninteresting" components.
- * These components will not be referenced by color conversion.
- */
-
-METHODDEF(void)
-noop_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr,
- JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr)
-{
- *output_data_ptr = NULL; /* safety check */
-}
-
-
-/*
- * This version handles any integral sampling ratios.
- * This is not used for typical JPEG files, so it need not be fast.
- * Nor, for that matter, is it particularly accurate: the algorithm is
- * simple replication of the input pixel onto the corresponding output
- * pixels. The hi-falutin sampling literature refers to this as a
- * "box filter". A box filter tends to introduce visible artifacts,
- * so if you are actually going to use 3:1 or 4:1 sampling ratios
- * you would be well advised to improve this code.
- */
-
-METHODDEF(void)
-int_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr,
- JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr)
-{
- my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;
- JSAMPARRAY output_data = *output_data_ptr;
- register JSAMPROW inptr, outptr;
- register JSAMPLE invalue;
- register int h;
- JSAMPROW outend;
- int h_expand, v_expand;
- int inrow, outrow;
-
- h_expand = upsample->h_expand[compptr->component_index];
- v_expand = upsample->v_expand[compptr->component_index];
-
- inrow = outrow = 0;
- while (outrow < cinfo->max_v_samp_factor) {
- /* Generate one output row with proper horizontal expansion */
- inptr = input_data[inrow];
- outptr = output_data[outrow];
- outend = outptr + cinfo->output_width;
- while (outptr < outend) {
- invalue = *inptr++; /* don't need GETJSAMPLE() here */
- for (h = h_expand; h > 0; h--) {
- *outptr++ = invalue;
- }
- }
- /* Generate any additional output rows by duplicating the first one */
- if (v_expand > 1) {
- jcopy_sample_rows(output_data, outrow, output_data, outrow+1,
- v_expand-1, cinfo->output_width);
- }
- inrow++;
- outrow += v_expand;
- }
-}
-
-
-/*
- * Fast processing for the common case of 2:1 horizontal and 1:1 vertical.
- * It's still a box filter.
- */
-
-METHODDEF(void)
-h2v1_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr,
- JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr)
-{
- JSAMPARRAY output_data = *output_data_ptr;
- register JSAMPROW inptr, outptr;
- register JSAMPLE invalue;
- JSAMPROW outend;
- int inrow;
-
- for (inrow = 0; inrow < cinfo->max_v_samp_factor; inrow++) {
- inptr = input_data[inrow];
- outptr = output_data[inrow];
- outend = outptr + cinfo->output_width;
- while (outptr < outend) {
- invalue = *inptr++; /* don't need GETJSAMPLE() here */
- *outptr++ = invalue;
- *outptr++ = invalue;
- }
- }
-}
-
-
-/*
- * Fast processing for the common case of 2:1 horizontal and 2:1 vertical.
- * It's still a box filter.
- */
-
-METHODDEF(void)
-h2v2_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr,
- JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr)
-{
- JSAMPARRAY output_data = *output_data_ptr;
- register JSAMPROW inptr, outptr;
- register JSAMPLE invalue;
- JSAMPROW outend;
- int inrow, outrow;
-
- inrow = outrow = 0;
- while (outrow < cinfo->max_v_samp_factor) {
- inptr = input_data[inrow];
- outptr = output_data[outrow];
- outend = outptr + cinfo->output_width;
- while (outptr < outend) {
- invalue = *inptr++; /* don't need GETJSAMPLE() here */
- *outptr++ = invalue;
- *outptr++ = invalue;
- }
- jcopy_sample_rows(output_data, outrow, output_data, outrow+1,
- 1, cinfo->output_width);
- inrow++;
- outrow += 2;
- }
-}
-
-
-/*
- * Fancy processing for the common case of 2:1 horizontal and 1:1 vertical.
- *
- * The upsampling algorithm is linear interpolation between pixel centers,
- * also known as a "triangle filter". This is a good compromise between
- * speed and visual quality. The centers of the output pixels are 1/4 and 3/4
- * of the way between input pixel centers.
- *
- * A note about the "bias" calculations: when rounding fractional values to
- * integer, we do not want to always round 0.5 up to the next integer.
- * If we did that, we'd introduce a noticeable bias towards larger values.
- * Instead, this code is arranged so that 0.5 will be rounded up or down at
- * alternate pixel locations (a simple ordered dither pattern).
- */
-
-METHODDEF(void)
-h2v1_fancy_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr,
- JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr)
-{
- JSAMPARRAY output_data = *output_data_ptr;
- register JSAMPROW inptr, outptr;
- register int invalue;
- register JDIMENSION colctr;
- int inrow;
-
- for (inrow = 0; inrow < cinfo->max_v_samp_factor; inrow++) {
- inptr = input_data[inrow];
- outptr = output_data[inrow];
- /* Special case for first column */
- invalue = GETJSAMPLE(*inptr++);
- *outptr++ = (JSAMPLE) invalue;
- *outptr++ = (JSAMPLE) ((invalue * 3 + GETJSAMPLE(*inptr) + 2) >> 2);
-
- for (colctr = compptr->downsampled_width - 2; colctr > 0; colctr--) {
- /* General case: 3/4 * nearer pixel + 1/4 * further pixel */
- invalue = GETJSAMPLE(*inptr++) * 3;
- *outptr++ = (JSAMPLE) ((invalue + GETJSAMPLE(inptr[-2]) + 1) >> 2);
- *outptr++ = (JSAMPLE) ((invalue + GETJSAMPLE(*inptr) + 2) >> 2);
- }
-
- /* Special case for last column */
- invalue = GETJSAMPLE(*inptr);
- *outptr++ = (JSAMPLE) ((invalue * 3 + GETJSAMPLE(inptr[-1]) + 1) >> 2);
- *outptr++ = (JSAMPLE) invalue;
- }
-}
-
-
-/*
- * Fancy processing for the common case of 2:1 horizontal and 2:1 vertical.
- * Again a triangle filter; see comments for h2v1 case, above.
- *
- * It is OK for us to reference the adjacent input rows because we demanded
- * context from the main buffer controller (see initialization code).
- */
-
-METHODDEF(void)
-h2v2_fancy_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr,
- JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr)
-{
- JSAMPARRAY output_data = *output_data_ptr;
- register JSAMPROW inptr0, inptr1, outptr;
-#if BITS_IN_JSAMPLE == 8
- register int thiscolsum, lastcolsum, nextcolsum;
-#else
- register INT32 thiscolsum, lastcolsum, nextcolsum;
-#endif
- register JDIMENSION colctr;
- int inrow, outrow, v;
-
- inrow = outrow = 0;
- while (outrow < cinfo->max_v_samp_factor) {
- for (v = 0; v < 2; v++) {
- /* inptr0 points to nearest input row, inptr1 points to next nearest */
- inptr0 = input_data[inrow];
- if (v == 0) /* next nearest is row above */
- inptr1 = input_data[inrow-1];
- else /* next nearest is row below */
- inptr1 = input_data[inrow+1];
- outptr = output_data[outrow++];
-
- /* Special case for first column */
- thiscolsum = GETJSAMPLE(*inptr0++) * 3 + GETJSAMPLE(*inptr1++);
- nextcolsum = GETJSAMPLE(*inptr0++) * 3 + GETJSAMPLE(*inptr1++);
- *outptr++ = (JSAMPLE) ((thiscolsum * 4 + 8) >> 4);
- *outptr++ = (JSAMPLE) ((thiscolsum * 3 + nextcolsum + 7) >> 4);
- lastcolsum = thiscolsum; thiscolsum = nextcolsum;
-
- for (colctr = compptr->downsampled_width - 2; colctr > 0; colctr--) {
- /* General case: 3/4 * nearer pixel + 1/4 * further pixel in each */
- /* dimension, thus 9/16, 3/16, 3/16, 1/16 overall */
- nextcolsum = GETJSAMPLE(*inptr0++) * 3 + GETJSAMPLE(*inptr1++);
- *outptr++ = (JSAMPLE) ((thiscolsum * 3 + lastcolsum + 8) >> 4);
- *outptr++ = (JSAMPLE) ((thiscolsum * 3 + nextcolsum + 7) >> 4);
- lastcolsum = thiscolsum; thiscolsum = nextcolsum;
- }
-
- /* Special case for last column */
- *outptr++ = (JSAMPLE) ((thiscolsum * 3 + lastcolsum + 8) >> 4);
- *outptr++ = (JSAMPLE) ((thiscolsum * 4 + 7) >> 4);
- }
- inrow++;
- }
-}
-
-
-/*
- * Module initialization routine for upsampling.
- */
-
-GLOBAL(void)
-jinit_upsampler (j_decompress_ptr cinfo)
-{
- my_upsample_ptr upsample;
- int ci;
- jpeg_component_info * compptr;
- boolean need_buffer, do_fancy;
- int h_in_group, v_in_group, h_out_group, v_out_group;
-
- upsample = (my_upsample_ptr)
- (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
- SIZEOF(my_upsampler));
- cinfo->upsample = (struct jpeg_upsampler *) upsample;
- upsample->pub.start_pass = start_pass_upsample;
- upsample->pub.upsample = sep_upsample;
- upsample->pub.need_context_rows = FALSE; /* until we find out differently */
-
- if (cinfo->CCIR601_sampling) /* this isn't supported */
- ERREXIT(cinfo, JERR_CCIR601_NOTIMPL);
-
- /* jdmainct.c doesn't support context rows when min_DCT_scaled_size = 1,
- * so don't ask for it.
- */
- do_fancy = cinfo->do_fancy_upsampling && cinfo->min_DCT_scaled_size > 1;
-
- /* Verify we can handle the sampling factors, select per-component methods,
- * and create storage as needed.
- */
- for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
- ci++, compptr++) {
- /* Compute size of an "input group" after IDCT scaling. This many samples
- * are to be converted to max_h_samp_factor * max_v_samp_factor pixels.
- */
- h_in_group = (compptr->h_samp_factor * compptr->DCT_scaled_size) /
- cinfo->min_DCT_scaled_size;
- v_in_group = (compptr->v_samp_factor * compptr->DCT_scaled_size) /
- cinfo->min_DCT_scaled_size;
- h_out_group = cinfo->max_h_samp_factor;
- v_out_group = cinfo->max_v_samp_factor;
- upsample->rowgroup_height[ci] = v_in_group; /* save for use later */
- need_buffer = TRUE;
- if (! compptr->component_needed) {
- /* Don't bother to upsample an uninteresting component. */
- upsample->methods[ci] = noop_upsample;
- need_buffer = FALSE;
- } else if (h_in_group == h_out_group && v_in_group == v_out_group) {
- /* Fullsize components can be processed without any work. */
- upsample->methods[ci] = fullsize_upsample;
- need_buffer = FALSE;
- } else if (h_in_group * 2 == h_out_group &&
- v_in_group == v_out_group) {
- /* Special cases for 2h1v upsampling */
- if (do_fancy && compptr->downsampled_width > 2)
- upsample->methods[ci] = h2v1_fancy_upsample;
- else
- upsample->methods[ci] = h2v1_upsample;
- } else if (h_in_group * 2 == h_out_group &&
- v_in_group * 2 == v_out_group) {
- /* Special cases for 2h2v upsampling */
- if (do_fancy && compptr->downsampled_width > 2) {
- upsample->methods[ci] = h2v2_fancy_upsample;
- upsample->pub.need_context_rows = TRUE;
- } else
- upsample->methods[ci] = h2v2_upsample;
- } else if ((h_out_group % h_in_group) == 0 &&
- (v_out_group % v_in_group) == 0) {
- /* Generic integral-factors upsampling method */
- upsample->methods[ci] = int_upsample;
- upsample->h_expand[ci] = (UINT8) (h_out_group / h_in_group);
- upsample->v_expand[ci] = (UINT8) (v_out_group / v_in_group);
- } else
- ERREXIT(cinfo, JERR_FRACT_SAMPLE_NOTIMPL);
- if (need_buffer) {
- upsample->color_buf[ci] = (*cinfo->mem->alloc_sarray)
- ((j_common_ptr) cinfo, JPOOL_IMAGE,
- (JDIMENSION) jround_up((long) cinfo->output_width,
- (long) cinfo->max_h_samp_factor),
- (JDIMENSION) cinfo->max_v_samp_factor);
- }
- }
-}
-
-#endif //_FX_JPEG_TURBO_
+#if !defined(_FX_JPEG_TURBO_)
+/*
+ * jdsample.c
+ *
+ * Copyright (C) 1991-1996, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains upsampling routines.
+ *
+ * Upsampling input data is counted in "row groups". A row group
+ * is defined to be (v_samp_factor * DCT_scaled_size / min_DCT_scaled_size)
+ * sample rows of each component. Upsampling will normally produce
+ * max_v_samp_factor pixel rows from each row group (but this could vary
+ * if the upsampler is applying a scale factor of its own).
+ *
+ * An excellent reference for image resampling is
+ * Digital Image Warping, George Wolberg, 1990.
+ * Pub. by IEEE Computer Society Press, Los Alamitos, CA. ISBN 0-8186-8944-7.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+
+
+/* Pointer to routine to upsample a single component */
+typedef JMETHOD(void, upsample1_ptr,
+ (j_decompress_ptr cinfo, jpeg_component_info * compptr,
+ JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr));
+
+/* Private subobject */
+
+typedef struct {
+ struct jpeg_upsampler pub; /* public fields */
+
+ /* Color conversion buffer. When using separate upsampling and color
+ * conversion steps, this buffer holds one upsampled row group until it
+ * has been color converted and output.
+ * Note: we do not allocate any storage for component(s) which are full-size,
+ * ie do not need rescaling. The corresponding entry of color_buf[] is
+ * simply set to point to the input data array, thereby avoiding copying.
+ */
+ JSAMPARRAY color_buf[MAX_COMPONENTS];
+
+ /* Per-component upsampling method pointers */
+ upsample1_ptr methods[MAX_COMPONENTS];
+
+ int next_row_out; /* counts rows emitted from color_buf */
+ JDIMENSION rows_to_go; /* counts rows remaining in image */
+
+ /* Height of an input row group for each component. */
+ int rowgroup_height[MAX_COMPONENTS];
+
+ /* These arrays save pixel expansion factors so that int_expand need not
+ * recompute them each time. They are unused for other upsampling methods.
+ */
+ UINT8 h_expand[MAX_COMPONENTS];
+ UINT8 v_expand[MAX_COMPONENTS];
+} my_upsampler;
+
+typedef my_upsampler * my_upsample_ptr;
+
+
+/*
+ * Initialize for an upsampling pass.
+ */
+
+METHODDEF(void)
+start_pass_upsample (j_decompress_ptr cinfo)
+{
+ my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;
+
+ /* Mark the conversion buffer empty */
+ upsample->next_row_out = cinfo->max_v_samp_factor;
+ /* Initialize total-height counter for detecting bottom of image */
+ upsample->rows_to_go = cinfo->output_height;
+}
+
+
+/*
+ * Control routine to do upsampling (and color conversion).
+ *
+ * In this version we upsample each component independently.
+ * We upsample one row group into the conversion buffer, then apply
+ * color conversion a row at a time.
+ */
+
+METHODDEF(void)
+sep_upsample (j_decompress_ptr cinfo,
+ JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr,
+ JDIMENSION in_row_groups_avail,
+ JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
+ JDIMENSION out_rows_avail)
+{
+ my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;
+ int ci;
+ jpeg_component_info * compptr;
+ JDIMENSION num_rows;
+
+ /* Fill the conversion buffer, if it's empty */
+ if (upsample->next_row_out >= cinfo->max_v_samp_factor) {
+ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+ ci++, compptr++) {
+ /* Invoke per-component upsample method. Notice we pass a POINTER
+ * to color_buf[ci], so that fullsize_upsample can change it.
+ */
+ (*upsample->methods[ci]) (cinfo, compptr,
+ input_buf[ci] + (*in_row_group_ctr * upsample->rowgroup_height[ci]),
+ upsample->color_buf + ci);
+ }
+ upsample->next_row_out = 0;
+ }
+
+ /* Color-convert and emit rows */
+
+ /* How many we have in the buffer: */
+ num_rows = (JDIMENSION) (cinfo->max_v_samp_factor - upsample->next_row_out);
+ /* Not more than the distance to the end of the image. Need this test
+ * in case the image height is not a multiple of max_v_samp_factor:
+ */
+ if (num_rows > upsample->rows_to_go)
+ num_rows = upsample->rows_to_go;
+ /* And not more than what the client can accept: */
+ out_rows_avail -= *out_row_ctr;
+ if (num_rows > out_rows_avail)
+ num_rows = out_rows_avail;
+
+ (*cinfo->cconvert->color_convert) (cinfo, upsample->color_buf,
+ (JDIMENSION) upsample->next_row_out,
+ output_buf + *out_row_ctr,
+ (int) num_rows);
+
+ /* Adjust counts */
+ *out_row_ctr += num_rows;
+ upsample->rows_to_go -= num_rows;
+ upsample->next_row_out += num_rows;
+ /* When the buffer is emptied, declare this input row group consumed */
+ if (upsample->next_row_out >= cinfo->max_v_samp_factor)
+ (*in_row_group_ctr)++;
+}
+
+
+/*
+ * These are the routines invoked by sep_upsample to upsample pixel values
+ * of a single component. One row group is processed per call.
+ */
+
+
+/*
+ * For full-size components, we just make color_buf[ci] point at the
+ * input buffer, and thus avoid copying any data. Note that this is
+ * safe only because sep_upsample doesn't declare the input row group
+ * "consumed" until we are done color converting and emitting it.
+ */
+
+METHODDEF(void)
+fullsize_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr,
+ JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr)
+{
+ *output_data_ptr = input_data;
+}
+
+
+/*
+ * This is a no-op version used for "uninteresting" components.
+ * These components will not be referenced by color conversion.
+ */
+
+METHODDEF(void)
+noop_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr,
+ JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr)
+{
+ *output_data_ptr = NULL; /* safety check */
+}
+
+
+/*
+ * This version handles any integral sampling ratios.
+ * This is not used for typical JPEG files, so it need not be fast.
+ * Nor, for that matter, is it particularly accurate: the algorithm is
+ * simple replication of the input pixel onto the corresponding output
+ * pixels. The hi-falutin sampling literature refers to this as a
+ * "box filter". A box filter tends to introduce visible artifacts,
+ * so if you are actually going to use 3:1 or 4:1 sampling ratios
+ * you would be well advised to improve this code.
+ */
+
+METHODDEF(void)
+int_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr,
+ JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr)
+{
+ my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;
+ JSAMPARRAY output_data = *output_data_ptr;
+ register JSAMPROW inptr, outptr;
+ register JSAMPLE invalue;
+ register int h;
+ JSAMPROW outend;
+ int h_expand, v_expand;
+ int inrow, outrow;
+
+ h_expand = upsample->h_expand[compptr->component_index];
+ v_expand = upsample->v_expand[compptr->component_index];
+
+ inrow = outrow = 0;
+ while (outrow < cinfo->max_v_samp_factor) {
+ /* Generate one output row with proper horizontal expansion */
+ inptr = input_data[inrow];
+ outptr = output_data[outrow];
+ outend = outptr + cinfo->output_width;
+ while (outptr < outend) {
+ invalue = *inptr++; /* don't need GETJSAMPLE() here */
+ for (h = h_expand; h > 0; h--) {
+ *outptr++ = invalue;
+ }
+ }
+ /* Generate any additional output rows by duplicating the first one */
+ if (v_expand > 1) {
+ jcopy_sample_rows(output_data, outrow, output_data, outrow+1,
+ v_expand-1, cinfo->output_width);
+ }
+ inrow++;
+ outrow += v_expand;
+ }
+}
+
+
+/*
+ * Fast processing for the common case of 2:1 horizontal and 1:1 vertical.
+ * It's still a box filter.
+ */
+
+METHODDEF(void)
+h2v1_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr,
+ JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr)
+{
+ JSAMPARRAY output_data = *output_data_ptr;
+ register JSAMPROW inptr, outptr;
+ register JSAMPLE invalue;
+ JSAMPROW outend;
+ int inrow;
+
+ for (inrow = 0; inrow < cinfo->max_v_samp_factor; inrow++) {
+ inptr = input_data[inrow];
+ outptr = output_data[inrow];
+ outend = outptr + cinfo->output_width;
+ while (outptr < outend) {
+ invalue = *inptr++; /* don't need GETJSAMPLE() here */
+ *outptr++ = invalue;
+ *outptr++ = invalue;
+ }
+ }
+}
+
+
+/*
+ * Fast processing for the common case of 2:1 horizontal and 2:1 vertical.
+ * It's still a box filter.
+ */
+
+METHODDEF(void)
+h2v2_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr,
+ JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr)
+{
+ JSAMPARRAY output_data = *output_data_ptr;
+ register JSAMPROW inptr, outptr;
+ register JSAMPLE invalue;
+ JSAMPROW outend;
+ int inrow, outrow;
+
+ inrow = outrow = 0;
+ while (outrow < cinfo->max_v_samp_factor) {
+ inptr = input_data[inrow];
+ outptr = output_data[outrow];
+ outend = outptr + cinfo->output_width;
+ while (outptr < outend) {
+ invalue = *inptr++; /* don't need GETJSAMPLE() here */
+ *outptr++ = invalue;
+ *outptr++ = invalue;
+ }
+ jcopy_sample_rows(output_data, outrow, output_data, outrow+1,
+ 1, cinfo->output_width);
+ inrow++;
+ outrow += 2;
+ }
+}
+
+
+/*
+ * Fancy processing for the common case of 2:1 horizontal and 1:1 vertical.
+ *
+ * The upsampling algorithm is linear interpolation between pixel centers,
+ * also known as a "triangle filter". This is a good compromise between
+ * speed and visual quality. The centers of the output pixels are 1/4 and 3/4
+ * of the way between input pixel centers.
+ *
+ * A note about the "bias" calculations: when rounding fractional values to
+ * integer, we do not want to always round 0.5 up to the next integer.
+ * If we did that, we'd introduce a noticeable bias towards larger values.
+ * Instead, this code is arranged so that 0.5 will be rounded up or down at
+ * alternate pixel locations (a simple ordered dither pattern).
+ */
+
+METHODDEF(void)
+h2v1_fancy_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr,
+ JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr)
+{
+ JSAMPARRAY output_data = *output_data_ptr;
+ register JSAMPROW inptr, outptr;
+ register int invalue;
+ register JDIMENSION colctr;
+ int inrow;
+
+ for (inrow = 0; inrow < cinfo->max_v_samp_factor; inrow++) {
+ inptr = input_data[inrow];
+ outptr = output_data[inrow];
+ /* Special case for first column */
+ invalue = GETJSAMPLE(*inptr++);
+ *outptr++ = (JSAMPLE) invalue;
+ *outptr++ = (JSAMPLE) ((invalue * 3 + GETJSAMPLE(*inptr) + 2) >> 2);
+
+ for (colctr = compptr->downsampled_width - 2; colctr > 0; colctr--) {
+ /* General case: 3/4 * nearer pixel + 1/4 * further pixel */
+ invalue = GETJSAMPLE(*inptr++) * 3;
+ *outptr++ = (JSAMPLE) ((invalue + GETJSAMPLE(inptr[-2]) + 1) >> 2);
+ *outptr++ = (JSAMPLE) ((invalue + GETJSAMPLE(*inptr) + 2) >> 2);
+ }
+
+ /* Special case for last column */
+ invalue = GETJSAMPLE(*inptr);
+ *outptr++ = (JSAMPLE) ((invalue * 3 + GETJSAMPLE(inptr[-1]) + 1) >> 2);
+ *outptr++ = (JSAMPLE) invalue;
+ }
+}
+
+
+/*
+ * Fancy processing for the common case of 2:1 horizontal and 2:1 vertical.
+ * Again a triangle filter; see comments for h2v1 case, above.
+ *
+ * It is OK for us to reference the adjacent input rows because we demanded
+ * context from the main buffer controller (see initialization code).
+ */
+
+METHODDEF(void)
+h2v2_fancy_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr,
+ JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr)
+{
+ JSAMPARRAY output_data = *output_data_ptr;
+ register JSAMPROW inptr0, inptr1, outptr;
+#if BITS_IN_JSAMPLE == 8
+ register int thiscolsum, lastcolsum, nextcolsum;
+#else
+ register INT32 thiscolsum, lastcolsum, nextcolsum;
+#endif
+ register JDIMENSION colctr;
+ int inrow, outrow, v;
+
+ inrow = outrow = 0;
+ while (outrow < cinfo->max_v_samp_factor) {
+ for (v = 0; v < 2; v++) {
+ /* inptr0 points to nearest input row, inptr1 points to next nearest */
+ inptr0 = input_data[inrow];
+ if (v == 0) /* next nearest is row above */
+ inptr1 = input_data[inrow-1];
+ else /* next nearest is row below */
+ inptr1 = input_data[inrow+1];
+ outptr = output_data[outrow++];
+
+ /* Special case for first column */
+ thiscolsum = GETJSAMPLE(*inptr0++) * 3 + GETJSAMPLE(*inptr1++);
+ nextcolsum = GETJSAMPLE(*inptr0++) * 3 + GETJSAMPLE(*inptr1++);
+ *outptr++ = (JSAMPLE) ((thiscolsum * 4 + 8) >> 4);
+ *outptr++ = (JSAMPLE) ((thiscolsum * 3 + nextcolsum + 7) >> 4);
+ lastcolsum = thiscolsum; thiscolsum = nextcolsum;
+
+ for (colctr = compptr->downsampled_width - 2; colctr > 0; colctr--) {
+ /* General case: 3/4 * nearer pixel + 1/4 * further pixel in each */
+ /* dimension, thus 9/16, 3/16, 3/16, 1/16 overall */
+ nextcolsum = GETJSAMPLE(*inptr0++) * 3 + GETJSAMPLE(*inptr1++);
+ *outptr++ = (JSAMPLE) ((thiscolsum * 3 + lastcolsum + 8) >> 4);
+ *outptr++ = (JSAMPLE) ((thiscolsum * 3 + nextcolsum + 7) >> 4);
+ lastcolsum = thiscolsum; thiscolsum = nextcolsum;
+ }
+
+ /* Special case for last column */
+ *outptr++ = (JSAMPLE) ((thiscolsum * 3 + lastcolsum + 8) >> 4);
+ *outptr++ = (JSAMPLE) ((thiscolsum * 4 + 7) >> 4);
+ }
+ inrow++;
+ }
+}
+
+
+/*
+ * Module initialization routine for upsampling.
+ */
+
+GLOBAL(void)
+jinit_upsampler (j_decompress_ptr cinfo)
+{
+ my_upsample_ptr upsample;
+ int ci;
+ jpeg_component_info * compptr;
+ boolean need_buffer, do_fancy;
+ int h_in_group, v_in_group, h_out_group, v_out_group;
+
+ upsample = (my_upsample_ptr)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ SIZEOF(my_upsampler));
+ cinfo->upsample = (struct jpeg_upsampler *) upsample;
+ upsample->pub.start_pass = start_pass_upsample;
+ upsample->pub.upsample = sep_upsample;
+ upsample->pub.need_context_rows = FALSE; /* until we find out differently */
+
+ if (cinfo->CCIR601_sampling) /* this isn't supported */
+ ERREXIT(cinfo, JERR_CCIR601_NOTIMPL);
+
+ /* jdmainct.c doesn't support context rows when min_DCT_scaled_size = 1,
+ * so don't ask for it.
+ */
+ do_fancy = cinfo->do_fancy_upsampling && cinfo->min_DCT_scaled_size > 1;
+
+ /* Verify we can handle the sampling factors, select per-component methods,
+ * and create storage as needed.
+ */
+ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+ ci++, compptr++) {
+ /* Compute size of an "input group" after IDCT scaling. This many samples
+ * are to be converted to max_h_samp_factor * max_v_samp_factor pixels.
+ */
+ h_in_group = (compptr->h_samp_factor * compptr->DCT_scaled_size) /
+ cinfo->min_DCT_scaled_size;
+ v_in_group = (compptr->v_samp_factor * compptr->DCT_scaled_size) /
+ cinfo->min_DCT_scaled_size;
+ h_out_group = cinfo->max_h_samp_factor;
+ v_out_group = cinfo->max_v_samp_factor;
+ upsample->rowgroup_height[ci] = v_in_group; /* save for use later */
+ need_buffer = TRUE;
+ if (! compptr->component_needed) {
+ /* Don't bother to upsample an uninteresting component. */
+ upsample->methods[ci] = noop_upsample;
+ need_buffer = FALSE;
+ } else if (h_in_group == h_out_group && v_in_group == v_out_group) {
+ /* Fullsize components can be processed without any work. */
+ upsample->methods[ci] = fullsize_upsample;
+ need_buffer = FALSE;
+ } else if (h_in_group * 2 == h_out_group &&
+ v_in_group == v_out_group) {
+ /* Special cases for 2h1v upsampling */
+ if (do_fancy && compptr->downsampled_width > 2)
+ upsample->methods[ci] = h2v1_fancy_upsample;
+ else
+ upsample->methods[ci] = h2v1_upsample;
+ } else if (h_in_group * 2 == h_out_group &&
+ v_in_group * 2 == v_out_group) {
+ /* Special cases for 2h2v upsampling */
+ if (do_fancy && compptr->downsampled_width > 2) {
+ upsample->methods[ci] = h2v2_fancy_upsample;
+ upsample->pub.need_context_rows = TRUE;
+ } else
+ upsample->methods[ci] = h2v2_upsample;
+ } else if ((h_out_group % h_in_group) == 0 &&
+ (v_out_group % v_in_group) == 0) {
+ /* Generic integral-factors upsampling method */
+ upsample->methods[ci] = int_upsample;
+ upsample->h_expand[ci] = (UINT8) (h_out_group / h_in_group);
+ upsample->v_expand[ci] = (UINT8) (v_out_group / v_in_group);
+ } else
+ ERREXIT(cinfo, JERR_FRACT_SAMPLE_NOTIMPL);
+ if (need_buffer) {
+ upsample->color_buf[ci] = (*cinfo->mem->alloc_sarray)
+ ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ (JDIMENSION) jround_up((long) cinfo->output_width,
+ (long) cinfo->max_h_samp_factor),
+ (JDIMENSION) cinfo->max_v_samp_factor);
+ }
+ }
+}
+
+#endif //_FX_JPEG_TURBO_
diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jdtrans.c b/core/src/fxcodec/libjpeg/fpdfapi_jdtrans.c
index c076a6c2bd..ae44f36043 100644
--- a/core/src/fxcodec/libjpeg/fpdfapi_jdtrans.c
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jdtrans.c
@@ -1,146 +1,146 @@
-#if !defined(_FX_JPEG_TURBO_)
-/*
- * jdtrans.c
- *
- * Copyright (C) 1995-1997, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains library routines for transcoding decompression,
- * that is, reading raw DCT coefficient arrays from an input JPEG file.
- * The routines in jdapimin.c will also be needed by a transcoder.
- */
-
-#define JPEG_INTERNALS
-#include "jinclude.h"
-#include "jpeglib.h"
-
-
-/* Forward declarations */
-LOCAL(void) transdecode_master_selection JPP((j_decompress_ptr cinfo));
-
-
-/*
- * Read the coefficient arrays from a JPEG file.
- * jpeg_read_header must be completed before calling this.
- *
- * The entire image is read into a set of virtual coefficient-block arrays,
- * one per component. The return value is a pointer to the array of
- * virtual-array descriptors. These can be manipulated directly via the
- * JPEG memory manager, or handed off to jpeg_write_coefficients().
- * To release the memory occupied by the virtual arrays, call
- * jpeg_finish_decompress() when done with the data.
- *
- * An alternative usage is to simply obtain access to the coefficient arrays
- * during a buffered-image-mode decompression operation. This is allowed
- * after any jpeg_finish_output() call. The arrays can be accessed until
- * jpeg_finish_decompress() is called. (Note that any call to the library
- * may reposition the arrays, so don't rely on access_virt_barray() results
- * to stay valid across library calls.)
- *
- * Returns NULL if suspended. This case need be checked only if
- * a suspending data source is used.
- */
-
-GLOBAL(jvirt_barray_ptr *)
-jpeg_read_coefficients (j_decompress_ptr cinfo)
-{
- if (cinfo->global_state == DSTATE_READY) {
- /* First call: initialize active modules */
- transdecode_master_selection(cinfo);
- cinfo->global_state = DSTATE_RDCOEFS;
- }
- if (cinfo->global_state == DSTATE_RDCOEFS) {
- /* Absorb whole file into the coef buffer */
- for (;;) {
- int retcode;
- /* Call progress monitor hook if present */
- if (cinfo->progress != NULL)
- (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);
- /* Absorb some more input */
- retcode = (*cinfo->inputctl->consume_input) (cinfo);
- if (retcode == JPEG_SUSPENDED)
- return NULL;
- if (retcode == JPEG_REACHED_EOI)
- break;
- /* Advance progress counter if appropriate */
- if (cinfo->progress != NULL &&
- (retcode == JPEG_ROW_COMPLETED || retcode == JPEG_REACHED_SOS)) {
- if (++cinfo->progress->pass_counter >= cinfo->progress->pass_limit) {
- /* startup underestimated number of scans; ratchet up one scan */
- cinfo->progress->pass_limit += (long) cinfo->total_iMCU_rows;
- }
- }
- }
- /* Set state so that jpeg_finish_decompress does the right thing */
- cinfo->global_state = DSTATE_STOPPING;
- }
- /* At this point we should be in state DSTATE_STOPPING if being used
- * standalone, or in state DSTATE_BUFIMAGE if being invoked to get access
- * to the coefficients during a full buffered-image-mode decompression.
- */
- if ((cinfo->global_state == DSTATE_STOPPING ||
- cinfo->global_state == DSTATE_BUFIMAGE) && cinfo->buffered_image) {
- return cinfo->coef->coef_arrays;
- }
- /* Oops, improper usage */
- ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
- return NULL; /* keep compiler happy */
-}
-
-
-/*
- * Master selection of decompression modules for transcoding.
- * This substitutes for jdmaster.c's initialization of the full decompressor.
- */
-
-LOCAL(void)
-transdecode_master_selection (j_decompress_ptr cinfo)
-{
- /* This is effectively a buffered-image operation. */
- cinfo->buffered_image = TRUE;
-
- /* Entropy decoding: either Huffman or arithmetic coding. */
- if (cinfo->arith_code) {
- ERREXIT(cinfo, JERR_ARITH_NOTIMPL);
- } else {
- if (cinfo->progressive_mode) {
-#ifdef D_PROGRESSIVE_SUPPORTED
- jinit_phuff_decoder(cinfo);
-#else
- ERREXIT(cinfo, JERR_NOT_COMPILED);
-#endif
- } else
- jinit_huff_decoder(cinfo);
- }
-
- /* Always get a full-image coefficient buffer. */
- jinit_d_coef_controller(cinfo, TRUE);
-
- /* We can now tell the memory manager to allocate virtual arrays. */
- (*cinfo->mem->realize_virt_arrays) ((j_common_ptr) cinfo);
-
- /* Initialize input side of decompressor to consume first scan. */
- (*cinfo->inputctl->start_input_pass) (cinfo);
-
- /* Initialize progress monitoring. */
- if (cinfo->progress != NULL) {
- int nscans;
- /* Estimate number of scans to set pass_limit. */
- if (cinfo->progressive_mode) {
- /* Arbitrarily estimate 2 interleaved DC scans + 3 AC scans/component. */
- nscans = 2 + 3 * cinfo->num_components;
- } else if (cinfo->inputctl->has_multiple_scans) {
- /* For a nonprogressive multiscan file, estimate 1 scan per component. */
- nscans = cinfo->num_components;
- } else {
- nscans = 1;
- }
- cinfo->progress->pass_counter = 0L;
- cinfo->progress->pass_limit = (long) cinfo->total_iMCU_rows * nscans;
- cinfo->progress->completed_passes = 0;
- cinfo->progress->total_passes = 1;
- }
-}
-
-#endif //_FX_JPEG_TURBO_
+#if !defined(_FX_JPEG_TURBO_)
+/*
+ * jdtrans.c
+ *
+ * Copyright (C) 1995-1997, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains library routines for transcoding decompression,
+ * that is, reading raw DCT coefficient arrays from an input JPEG file.
+ * The routines in jdapimin.c will also be needed by a transcoder.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+
+
+/* Forward declarations */
+LOCAL(void) transdecode_master_selection JPP((j_decompress_ptr cinfo));
+
+
+/*
+ * Read the coefficient arrays from a JPEG file.
+ * jpeg_read_header must be completed before calling this.
+ *
+ * The entire image is read into a set of virtual coefficient-block arrays,
+ * one per component. The return value is a pointer to the array of
+ * virtual-array descriptors. These can be manipulated directly via the
+ * JPEG memory manager, or handed off to jpeg_write_coefficients().
+ * To release the memory occupied by the virtual arrays, call
+ * jpeg_finish_decompress() when done with the data.
+ *
+ * An alternative usage is to simply obtain access to the coefficient arrays
+ * during a buffered-image-mode decompression operation. This is allowed
+ * after any jpeg_finish_output() call. The arrays can be accessed until
+ * jpeg_finish_decompress() is called. (Note that any call to the library
+ * may reposition the arrays, so don't rely on access_virt_barray() results
+ * to stay valid across library calls.)
+ *
+ * Returns NULL if suspended. This case need be checked only if
+ * a suspending data source is used.
+ */
+
+GLOBAL(jvirt_barray_ptr *)
+jpeg_read_coefficients (j_decompress_ptr cinfo)
+{
+ if (cinfo->global_state == DSTATE_READY) {
+ /* First call: initialize active modules */
+ transdecode_master_selection(cinfo);
+ cinfo->global_state = DSTATE_RDCOEFS;
+ }
+ if (cinfo->global_state == DSTATE_RDCOEFS) {
+ /* Absorb whole file into the coef buffer */
+ for (;;) {
+ int retcode;
+ /* Call progress monitor hook if present */
+ if (cinfo->progress != NULL)
+ (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);
+ /* Absorb some more input */
+ retcode = (*cinfo->inputctl->consume_input) (cinfo);
+ if (retcode == JPEG_SUSPENDED)
+ return NULL;
+ if (retcode == JPEG_REACHED_EOI)
+ break;
+ /* Advance progress counter if appropriate */
+ if (cinfo->progress != NULL &&
+ (retcode == JPEG_ROW_COMPLETED || retcode == JPEG_REACHED_SOS)) {
+ if (++cinfo->progress->pass_counter >= cinfo->progress->pass_limit) {
+ /* startup underestimated number of scans; ratchet up one scan */
+ cinfo->progress->pass_limit += (long) cinfo->total_iMCU_rows;
+ }
+ }
+ }
+ /* Set state so that jpeg_finish_decompress does the right thing */
+ cinfo->global_state = DSTATE_STOPPING;
+ }
+ /* At this point we should be in state DSTATE_STOPPING if being used
+ * standalone, or in state DSTATE_BUFIMAGE if being invoked to get access
+ * to the coefficients during a full buffered-image-mode decompression.
+ */
+ if ((cinfo->global_state == DSTATE_STOPPING ||
+ cinfo->global_state == DSTATE_BUFIMAGE) && cinfo->buffered_image) {
+ return cinfo->coef->coef_arrays;
+ }
+ /* Oops, improper usage */
+ ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
+ return NULL; /* keep compiler happy */
+}
+
+
+/*
+ * Master selection of decompression modules for transcoding.
+ * This substitutes for jdmaster.c's initialization of the full decompressor.
+ */
+
+LOCAL(void)
+transdecode_master_selection (j_decompress_ptr cinfo)
+{
+ /* This is effectively a buffered-image operation. */
+ cinfo->buffered_image = TRUE;
+
+ /* Entropy decoding: either Huffman or arithmetic coding. */
+ if (cinfo->arith_code) {
+ ERREXIT(cinfo, JERR_ARITH_NOTIMPL);
+ } else {
+ if (cinfo->progressive_mode) {
+#ifdef D_PROGRESSIVE_SUPPORTED
+ jinit_phuff_decoder(cinfo);
+#else
+ ERREXIT(cinfo, JERR_NOT_COMPILED);
+#endif
+ } else
+ jinit_huff_decoder(cinfo);
+ }
+
+ /* Always get a full-image coefficient buffer. */
+ jinit_d_coef_controller(cinfo, TRUE);
+
+ /* We can now tell the memory manager to allocate virtual arrays. */
+ (*cinfo->mem->realize_virt_arrays) ((j_common_ptr) cinfo);
+
+ /* Initialize input side of decompressor to consume first scan. */
+ (*cinfo->inputctl->start_input_pass) (cinfo);
+
+ /* Initialize progress monitoring. */
+ if (cinfo->progress != NULL) {
+ int nscans;
+ /* Estimate number of scans to set pass_limit. */
+ if (cinfo->progressive_mode) {
+ /* Arbitrarily estimate 2 interleaved DC scans + 3 AC scans/component. */
+ nscans = 2 + 3 * cinfo->num_components;
+ } else if (cinfo->inputctl->has_multiple_scans) {
+ /* For a nonprogressive multiscan file, estimate 1 scan per component. */
+ nscans = cinfo->num_components;
+ } else {
+ nscans = 1;
+ }
+ cinfo->progress->pass_counter = 0L;
+ cinfo->progress->pass_limit = (long) cinfo->total_iMCU_rows * nscans;
+ cinfo->progress->completed_passes = 0;
+ cinfo->progress->total_passes = 1;
+ }
+}
+
+#endif //_FX_JPEG_TURBO_
diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jerror.c b/core/src/fxcodec/libjpeg/fpdfapi_jerror.c
index 9d673ba845..42e4066757 100644
--- a/core/src/fxcodec/libjpeg/fpdfapi_jerror.c
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jerror.c
@@ -1,255 +1,255 @@
-#if !defined(_FX_JPEG_TURBO_)
-/*
- * jerror.c
- *
- * Copyright (C) 1991-1998, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains simple error-reporting and trace-message routines.
- * These are suitable for Unix-like systems and others where writing to
- * stderr is the right thing to do. Many applications will want to replace
- * some or all of these routines.
- *
- * If you define USE_WINDOWS_MESSAGEBOX in jconfig.h or in the makefile,
- * you get a Windows-specific hack to display error messages in a dialog box.
- * It ain't much, but it beats dropping error messages into the bit bucket,
- * which is what happens to output to stderr under most Windows C compilers.
- *
- * These routines are used by both the compression and decompression code.
- */
-
-/* this is not a core library module, so it doesn't define JPEG_INTERNALS */
-#include "jinclude.h"
-#include "jpeglib.h"
-#include "jversion.h"
-#include "jerror.h"
-
-#ifndef EXIT_FAILURE /* define exit() codes if not provided */
-#define EXIT_FAILURE 1
-#endif
-
-
-/*
- * Create the message string table.
- * We do this from the master message list in jerror.h by re-reading
- * jerror.h with a suitable definition for macro JMESSAGE.
- * The message table is made an external symbol just in case any applications
- * want to refer to it directly.
- */
-
-#ifdef NEED_SHORT_EXTERNAL_NAMES
-#define jpeg_std_message_table jMsgTable
-#endif
-
-#define JMESSAGE(code,string) string ,
-
-const char * const jpeg_std_message_table[] = {
-#include "jerror.h"
- NULL
-};
-
-
-/*
- * Error exit handler: must not return to caller.
- *
- * Applications may override this if they want to get control back after
- * an error. Typically one would longjmp somewhere instead of exiting.
- * The setjmp buffer can be made a private field within an expanded error
- * handler object. Note that the info needed to generate an error message
- * is stored in the error object, so you can generate the message now or
- * later, at your convenience.
- * You should make sure that the JPEG object is cleaned up (with jpeg_abort
- * or jpeg_destroy) at some point.
- */
-
-METHODDEF(void)
-error_exit (j_common_ptr cinfo)
-{
- /* Always display the message */
- (*cinfo->err->output_message) (cinfo);
-
- /* Let the memory manager delete any temp files before we die */
- jpeg_destroy(cinfo);
-
-// exit(EXIT_FAILURE);
-}
-
-
-/*
- * Actual output of an error or trace message.
- * Applications may override this method to send JPEG messages somewhere
- * other than stderr.
- *
- * On Windows, printing to stderr is generally completely useless,
- * so we provide optional code to produce an error-dialog popup.
- * Most Windows applications will still prefer to override this routine,
- * but if they don't, it'll do something at least marginally useful.
- *
- * NOTE: to use the library in an environment that doesn't support the
- * C stdio library, you may have to delete the call to fprintf() entirely,
- * not just not use this routine.
- */
-
-METHODDEF(void)
-output_message (j_common_ptr cinfo)
-{
- char buffer[JMSG_LENGTH_MAX];
-
- /* Create the message */
- (*cinfo->err->format_message) (cinfo, buffer);
-
-#ifdef USE_WINDOWS_MESSAGEBOX
- /* Display it in a message dialog box */
- MessageBox(GetActiveWindow(), buffer, "JPEG Library Error",
- MB_OK | MB_ICONERROR);
-#else
- /* Send it to stderr, adding a newline */
-#ifndef _FPDFAPI_MINI_
- FXSYS_fprintf(stderr, "%s\n", buffer);
-#endif
-#endif
-}
-
-
-/*
- * Decide whether to emit a trace or warning message.
- * msg_level is one of:
- * -1: recoverable corrupt-data warning, may want to abort.
- * 0: important advisory messages (always display to user).
- * 1: first level of tracing detail.
- * 2,3,...: successively more detailed tracing messages.
- * An application might override this method if it wanted to abort on warnings
- * or change the policy about which messages to display.
- */
-
-METHODDEF(void)
-emit_message (j_common_ptr cinfo, int msg_level)
-{
- struct jpeg_error_mgr * err = cinfo->err;
-
- if (msg_level < 0) {
- /* It's a warning message. Since corrupt files may generate many warnings,
- * the policy implemented here is to show only the first warning,
- * unless trace_level >= 3.
- */
- if (err->num_warnings == 0 || err->trace_level >= 3)
- (*err->output_message) (cinfo);
- /* Always count warnings in num_warnings. */
- err->num_warnings++;
- } else {
- /* It's a trace message. Show it if trace_level >= msg_level. */
- if (err->trace_level >= msg_level)
- (*err->output_message) (cinfo);
- }
-}
-
-
-/*
- * Format a message string for the most recent JPEG error or message.
- * The message is stored into buffer, which should be at least JMSG_LENGTH_MAX
- * characters. Note that no '\n' character is added to the string.
- * Few applications should need to override this method.
- */
-
-METHODDEF(void)
-format_message (j_common_ptr cinfo, char * buffer)
-{
-#if 0 /* XYQ */
- struct jpeg_error_mgr * err = cinfo->err;
- int msg_code = err->msg_code;
- const char * msgtext = NULL;
- const char * msgptr;
- char ch;
- boolean isstring;
-
- /* Look up message string in proper table */
- if (msg_code > 0 && msg_code <= err->last_jpeg_message) {
- msgtext = err->jpeg_message_table[msg_code];
- } else if (err->addon_message_table != NULL &&
- msg_code >= err->first_addon_message &&
- msg_code <= err->last_addon_message) {
- msgtext = err->addon_message_table[msg_code - err->first_addon_message];
- }
-
- /* Defend against bogus message number */
- if (msgtext == NULL) {
- err->msg_parm.i[0] = msg_code;
- msgtext = err->jpeg_message_table[0];
- }
-
- /* Check for string parameter, as indicated by %s in the message text */
- isstring = FALSE;
- msgptr = msgtext;
- while ((ch = *msgptr++) != '\0') {
- if (ch == '%') {
- if (*msgptr == 's') isstring = TRUE;
- break;
- }
- }
-
- /* Format the message into the passed buffer */
- if (isstring)
- FXSYS_sprintf(buffer, msgtext, err->msg_parm.s);
- else
- FXSYS_sprintf(buffer, msgtext,
- err->msg_parm.i[0], err->msg_parm.i[1],
- err->msg_parm.i[2], err->msg_parm.i[3],
- err->msg_parm.i[4], err->msg_parm.i[5],
- err->msg_parm.i[6], err->msg_parm.i[7]);
-#endif
-}
-
-
-/*
- * Reset error state variables at start of a new image.
- * This is called during compression startup to reset trace/error
- * processing to default state, without losing any application-specific
- * method pointers. An application might possibly want to override
- * this method if it has additional error processing state.
- */
-
-METHODDEF(void)
-reset_error_mgr (j_common_ptr cinfo)
-{
- cinfo->err->num_warnings = 0;
- /* trace_level is not reset since it is an application-supplied parameter */
- cinfo->err->msg_code = 0; /* may be useful as a flag for "no error" */
-}
-
-
-/*
- * Fill in the standard error-handling methods in a jpeg_error_mgr object.
- * Typical call is:
- * struct jpeg_compress_struct cinfo;
- * struct jpeg_error_mgr err;
- *
- * cinfo.err = jpeg_std_error(&err);
- * after which the application may override some of the methods.
- */
-
-GLOBAL(struct jpeg_error_mgr *)
-jpeg_std_error (struct jpeg_error_mgr * err)
-{
- err->error_exit = error_exit;
- err->emit_message = emit_message;
- err->output_message = output_message;
- err->format_message = format_message;
- err->reset_error_mgr = reset_error_mgr;
-
- err->trace_level = 0; /* default = no tracing */
- err->num_warnings = 0; /* no warnings emitted yet */
- err->msg_code = 0; /* may be useful as a flag for "no error" */
-
- /* Initialize message table pointers */
- err->jpeg_message_table = jpeg_std_message_table;
- err->last_jpeg_message = (int) JMSG_LASTMSGCODE - 1;
-
- err->addon_message_table = NULL;
- err->first_addon_message = 0; /* for safety */
- err->last_addon_message = 0;
-
- return err;
-}
-
-#endif //_FX_JPEG_TURBO_
+#if !defined(_FX_JPEG_TURBO_)
+/*
+ * jerror.c
+ *
+ * Copyright (C) 1991-1998, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains simple error-reporting and trace-message routines.
+ * These are suitable for Unix-like systems and others where writing to
+ * stderr is the right thing to do. Many applications will want to replace
+ * some or all of these routines.
+ *
+ * If you define USE_WINDOWS_MESSAGEBOX in jconfig.h or in the makefile,
+ * you get a Windows-specific hack to display error messages in a dialog box.
+ * It ain't much, but it beats dropping error messages into the bit bucket,
+ * which is what happens to output to stderr under most Windows C compilers.
+ *
+ * These routines are used by both the compression and decompression code.
+ */
+
+/* this is not a core library module, so it doesn't define JPEG_INTERNALS */
+#include "jinclude.h"
+#include "jpeglib.h"
+#include "jversion.h"
+#include "jerror.h"
+
+#ifndef EXIT_FAILURE /* define exit() codes if not provided */
+#define EXIT_FAILURE 1
+#endif
+
+
+/*
+ * Create the message string table.
+ * We do this from the master message list in jerror.h by re-reading
+ * jerror.h with a suitable definition for macro JMESSAGE.
+ * The message table is made an external symbol just in case any applications
+ * want to refer to it directly.
+ */
+
+#ifdef NEED_SHORT_EXTERNAL_NAMES
+#define jpeg_std_message_table jMsgTable
+#endif
+
+#define JMESSAGE(code,string) string ,
+
+const char * const jpeg_std_message_table[] = {
+#include "jerror.h"
+ NULL
+};
+
+
+/*
+ * Error exit handler: must not return to caller.
+ *
+ * Applications may override this if they want to get control back after
+ * an error. Typically one would longjmp somewhere instead of exiting.
+ * The setjmp buffer can be made a private field within an expanded error
+ * handler object. Note that the info needed to generate an error message
+ * is stored in the error object, so you can generate the message now or
+ * later, at your convenience.
+ * You should make sure that the JPEG object is cleaned up (with jpeg_abort
+ * or jpeg_destroy) at some point.
+ */
+
+METHODDEF(void)
+error_exit (j_common_ptr cinfo)
+{
+ /* Always display the message */
+ (*cinfo->err->output_message) (cinfo);
+
+ /* Let the memory manager delete any temp files before we die */
+ jpeg_destroy(cinfo);
+
+// exit(EXIT_FAILURE);
+}
+
+
+/*
+ * Actual output of an error or trace message.
+ * Applications may override this method to send JPEG messages somewhere
+ * other than stderr.
+ *
+ * On Windows, printing to stderr is generally completely useless,
+ * so we provide optional code to produce an error-dialog popup.
+ * Most Windows applications will still prefer to override this routine,
+ * but if they don't, it'll do something at least marginally useful.
+ *
+ * NOTE: to use the library in an environment that doesn't support the
+ * C stdio library, you may have to delete the call to fprintf() entirely,
+ * not just not use this routine.
+ */
+
+METHODDEF(void)
+output_message (j_common_ptr cinfo)
+{
+ char buffer[JMSG_LENGTH_MAX];
+
+ /* Create the message */
+ (*cinfo->err->format_message) (cinfo, buffer);
+
+#ifdef USE_WINDOWS_MESSAGEBOX
+ /* Display it in a message dialog box */
+ MessageBox(GetActiveWindow(), buffer, "JPEG Library Error",
+ MB_OK | MB_ICONERROR);
+#else
+ /* Send it to stderr, adding a newline */
+#ifndef _FPDFAPI_MINI_
+ FXSYS_fprintf(stderr, "%s\n", buffer);
+#endif
+#endif
+}
+
+
+/*
+ * Decide whether to emit a trace or warning message.
+ * msg_level is one of:
+ * -1: recoverable corrupt-data warning, may want to abort.
+ * 0: important advisory messages (always display to user).
+ * 1: first level of tracing detail.
+ * 2,3,...: successively more detailed tracing messages.
+ * An application might override this method if it wanted to abort on warnings
+ * or change the policy about which messages to display.
+ */
+
+METHODDEF(void)
+emit_message (j_common_ptr cinfo, int msg_level)
+{
+ struct jpeg_error_mgr * err = cinfo->err;
+
+ if (msg_level < 0) {
+ /* It's a warning message. Since corrupt files may generate many warnings,
+ * the policy implemented here is to show only the first warning,
+ * unless trace_level >= 3.
+ */
+ if (err->num_warnings == 0 || err->trace_level >= 3)
+ (*err->output_message) (cinfo);
+ /* Always count warnings in num_warnings. */
+ err->num_warnings++;
+ } else {
+ /* It's a trace message. Show it if trace_level >= msg_level. */
+ if (err->trace_level >= msg_level)
+ (*err->output_message) (cinfo);
+ }
+}
+
+
+/*
+ * Format a message string for the most recent JPEG error or message.
+ * The message is stored into buffer, which should be at least JMSG_LENGTH_MAX
+ * characters. Note that no '\n' character is added to the string.
+ * Few applications should need to override this method.
+ */
+
+METHODDEF(void)
+format_message (j_common_ptr cinfo, char * buffer)
+{
+#if 0 /* XYQ */
+ struct jpeg_error_mgr * err = cinfo->err;
+ int msg_code = err->msg_code;
+ const char * msgtext = NULL;
+ const char * msgptr;
+ char ch;
+ boolean isstring;
+
+ /* Look up message string in proper table */
+ if (msg_code > 0 && msg_code <= err->last_jpeg_message) {
+ msgtext = err->jpeg_message_table[msg_code];
+ } else if (err->addon_message_table != NULL &&
+ msg_code >= err->first_addon_message &&
+ msg_code <= err->last_addon_message) {
+ msgtext = err->addon_message_table[msg_code - err->first_addon_message];
+ }
+
+ /* Defend against bogus message number */
+ if (msgtext == NULL) {
+ err->msg_parm.i[0] = msg_code;
+ msgtext = err->jpeg_message_table[0];
+ }
+
+ /* Check for string parameter, as indicated by %s in the message text */
+ isstring = FALSE;
+ msgptr = msgtext;
+ while ((ch = *msgptr++) != '\0') {
+ if (ch == '%') {
+ if (*msgptr == 's') isstring = TRUE;
+ break;
+ }
+ }
+
+ /* Format the message into the passed buffer */
+ if (isstring)
+ FXSYS_sprintf(buffer, msgtext, err->msg_parm.s);
+ else
+ FXSYS_sprintf(buffer, msgtext,
+ err->msg_parm.i[0], err->msg_parm.i[1],
+ err->msg_parm.i[2], err->msg_parm.i[3],
+ err->msg_parm.i[4], err->msg_parm.i[5],
+ err->msg_parm.i[6], err->msg_parm.i[7]);
+#endif
+}
+
+
+/*
+ * Reset error state variables at start of a new image.
+ * This is called during compression startup to reset trace/error
+ * processing to default state, without losing any application-specific
+ * method pointers. An application might possibly want to override
+ * this method if it has additional error processing state.
+ */
+
+METHODDEF(void)
+reset_error_mgr (j_common_ptr cinfo)
+{
+ cinfo->err->num_warnings = 0;
+ /* trace_level is not reset since it is an application-supplied parameter */
+ cinfo->err->msg_code = 0; /* may be useful as a flag for "no error" */
+}
+
+
+/*
+ * Fill in the standard error-handling methods in a jpeg_error_mgr object.
+ * Typical call is:
+ * struct jpeg_compress_struct cinfo;
+ * struct jpeg_error_mgr err;
+ *
+ * cinfo.err = jpeg_std_error(&err);
+ * after which the application may override some of the methods.
+ */
+
+GLOBAL(struct jpeg_error_mgr *)
+jpeg_std_error (struct jpeg_error_mgr * err)
+{
+ err->error_exit = error_exit;
+ err->emit_message = emit_message;
+ err->output_message = output_message;
+ err->format_message = format_message;
+ err->reset_error_mgr = reset_error_mgr;
+
+ err->trace_level = 0; /* default = no tracing */
+ err->num_warnings = 0; /* no warnings emitted yet */
+ err->msg_code = 0; /* may be useful as a flag for "no error" */
+
+ /* Initialize message table pointers */
+ err->jpeg_message_table = jpeg_std_message_table;
+ err->last_jpeg_message = (int) JMSG_LASTMSGCODE - 1;
+
+ err->addon_message_table = NULL;
+ err->first_addon_message = 0; /* for safety */
+ err->last_addon_message = 0;
+
+ return err;
+}
+
+#endif //_FX_JPEG_TURBO_
diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jfdctfst.c b/core/src/fxcodec/libjpeg/fpdfapi_jfdctfst.c
index 9cd3dd798e..b978b468d7 100644
--- a/core/src/fxcodec/libjpeg/fpdfapi_jfdctfst.c
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jfdctfst.c
@@ -1,227 +1,227 @@
-#if !defined(_FX_JPEG_TURBO_)
-/*
- * jfdctfst.c
- *
- * Copyright (C) 1994-1996, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains a fast, not so accurate integer implementation of the
- * forward DCT (Discrete Cosine Transform).
- *
- * A 2-D DCT can be done by 1-D DCT on each row followed by 1-D DCT
- * on each column. Direct algorithms are also available, but they are
- * much more complex and seem not to be any faster when reduced to code.
- *
- * This implementation is based on Arai, Agui, and Nakajima's algorithm for
- * scaled DCT. Their original paper (Trans. IEICE E-71(11):1095) is in
- * Japanese, but the algorithm is described in the Pennebaker & Mitchell
- * JPEG textbook (see REFERENCES section in file README). The following code
- * is based directly on figure 4-8 in P&M.
- * While an 8-point DCT cannot be done in less than 11 multiplies, it is
- * possible to arrange the computation so that many of the multiplies are
- * simple scalings of the final outputs. These multiplies can then be
- * folded into the multiplications or divisions by the JPEG quantization
- * table entries. The AA&N method leaves only 5 multiplies and 29 adds
- * to be done in the DCT itself.
- * The primary disadvantage of this method is that with fixed-point math,
- * accuracy is lost due to imprecise representation of the scaled
- * quantization values. The smaller the quantization table entry, the less
- * precise the scaled value, so this implementation does worse with high-
- * quality-setting files than with low-quality ones.
- */
-
-#define JPEG_INTERNALS
-#include "jinclude.h"
-#include "jpeglib.h"
-#include "jdct.h" /* Private declarations for DCT subsystem */
-
-#ifdef DCT_IFAST_SUPPORTED
-
-
-/*
- * This module is specialized to the case DCTSIZE = 8.
- */
-
-#if DCTSIZE != 8
- Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */
-#endif
-
-
-/* Scaling decisions are generally the same as in the LL&M algorithm;
- * see jfdctint.c for more details. However, we choose to descale
- * (right shift) multiplication products as soon as they are formed,
- * rather than carrying additional fractional bits into subsequent additions.
- * This compromises accuracy slightly, but it lets us save a few shifts.
- * More importantly, 16-bit arithmetic is then adequate (for 8-bit samples)
- * everywhere except in the multiplications proper; this saves a good deal
- * of work on 16-bit-int machines.
- *
- * Again to save a few shifts, the intermediate results between pass 1 and
- * pass 2 are not upscaled, but are represented only to integral precision.
- *
- * A final compromise is to represent the multiplicative constants to only
- * 8 fractional bits, rather than 13. This saves some shifting work on some
- * machines, and may also reduce the cost of multiplication (since there
- * are fewer one-bits in the constants).
- */
-
-#define CONST_BITS 8
-
-
-/* Some C compilers fail to reduce "FIX(constant)" at compile time, thus
- * causing a lot of useless floating-point operations at run time.
- * To get around this we use the following pre-calculated constants.
- * If you change CONST_BITS you may want to add appropriate values.
- * (With a reasonable C compiler, you can just rely on the FIX() macro...)
- */
-
-#if CONST_BITS == 8
-#define FIX_0_382683433 ((INT32) 98) /* FIX(0.382683433) */
-#define FIX_0_541196100 ((INT32) 139) /* FIX(0.541196100) */
-#define FIX_0_707106781 ((INT32) 181) /* FIX(0.707106781) */
-#define FIX_1_306562965 ((INT32) 334) /* FIX(1.306562965) */
-#else
-#define FIX_0_382683433 FIX(0.382683433)
-#define FIX_0_541196100 FIX(0.541196100)
-#define FIX_0_707106781 FIX(0.707106781)
-#define FIX_1_306562965 FIX(1.306562965)
-#endif
-
-
-/* We can gain a little more speed, with a further compromise in accuracy,
- * by omitting the addition in a descaling shift. This yields an incorrectly
- * rounded result half the time...
- */
-
-#ifndef USE_ACCURATE_ROUNDING
-#undef DESCALE
-#define DESCALE(x,n) RIGHT_SHIFT(x, n)
-#endif
-
-
-/* Multiply a DCTELEM variable by an INT32 constant, and immediately
- * descale to yield a DCTELEM result.
- */
-
-#define MULTIPLY(var,const) ((DCTELEM) DESCALE((var) * (const), CONST_BITS))
-
-
-/*
- * Perform the forward DCT on one block of samples.
- */
-
-GLOBAL(void)
-jpeg_fdct_ifast (DCTELEM * data)
-{
- DCTELEM tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
- DCTELEM tmp10, tmp11, tmp12, tmp13;
- DCTELEM z1, z2, z3, z4, z5, z11, z13;
- DCTELEM *dataptr;
- int ctr;
- SHIFT_TEMPS
-
- /* Pass 1: process rows. */
-
- dataptr = data;
- for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {
- tmp0 = dataptr[0] + dataptr[7];
- tmp7 = dataptr[0] - dataptr[7];
- tmp1 = dataptr[1] + dataptr[6];
- tmp6 = dataptr[1] - dataptr[6];
- tmp2 = dataptr[2] + dataptr[5];
- tmp5 = dataptr[2] - dataptr[5];
- tmp3 = dataptr[3] + dataptr[4];
- tmp4 = dataptr[3] - dataptr[4];
-
- /* Even part */
-
- tmp10 = tmp0 + tmp3; /* phase 2 */
- tmp13 = tmp0 - tmp3;
- tmp11 = tmp1 + tmp2;
- tmp12 = tmp1 - tmp2;
-
- dataptr[0] = tmp10 + tmp11; /* phase 3 */
- dataptr[4] = tmp10 - tmp11;
-
- z1 = MULTIPLY(tmp12 + tmp13, FIX_0_707106781); /* c4 */
- dataptr[2] = tmp13 + z1; /* phase 5 */
- dataptr[6] = tmp13 - z1;
-
- /* Odd part */
-
- tmp10 = tmp4 + tmp5; /* phase 2 */
- tmp11 = tmp5 + tmp6;
- tmp12 = tmp6 + tmp7;
-
- /* The rotator is modified from fig 4-8 to avoid extra negations. */
- z5 = MULTIPLY(tmp10 - tmp12, FIX_0_382683433); /* c6 */
- z2 = MULTIPLY(tmp10, FIX_0_541196100) + z5; /* c2-c6 */
- z4 = MULTIPLY(tmp12, FIX_1_306562965) + z5; /* c2+c6 */
- z3 = MULTIPLY(tmp11, FIX_0_707106781); /* c4 */
-
- z11 = tmp7 + z3; /* phase 5 */
- z13 = tmp7 - z3;
-
- dataptr[5] = z13 + z2; /* phase 6 */
- dataptr[3] = z13 - z2;
- dataptr[1] = z11 + z4;
- dataptr[7] = z11 - z4;
-
- dataptr += DCTSIZE; /* advance pointer to next row */
- }
-
- /* Pass 2: process columns. */
-
- dataptr = data;
- for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {
- tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*7];
- tmp7 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*7];
- tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*6];
- tmp6 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*6];
- tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*5];
- tmp5 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*5];
- tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*4];
- tmp4 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*4];
-
- /* Even part */
-
- tmp10 = tmp0 + tmp3; /* phase 2 */
- tmp13 = tmp0 - tmp3;
- tmp11 = tmp1 + tmp2;
- tmp12 = tmp1 - tmp2;
-
- dataptr[DCTSIZE*0] = tmp10 + tmp11; /* phase 3 */
- dataptr[DCTSIZE*4] = tmp10 - tmp11;
-
- z1 = MULTIPLY(tmp12 + tmp13, FIX_0_707106781); /* c4 */
- dataptr[DCTSIZE*2] = tmp13 + z1; /* phase 5 */
- dataptr[DCTSIZE*6] = tmp13 - z1;
-
- /* Odd part */
-
- tmp10 = tmp4 + tmp5; /* phase 2 */
- tmp11 = tmp5 + tmp6;
- tmp12 = tmp6 + tmp7;
-
- /* The rotator is modified from fig 4-8 to avoid extra negations. */
- z5 = MULTIPLY(tmp10 - tmp12, FIX_0_382683433); /* c6 */
- z2 = MULTIPLY(tmp10, FIX_0_541196100) + z5; /* c2-c6 */
- z4 = MULTIPLY(tmp12, FIX_1_306562965) + z5; /* c2+c6 */
- z3 = MULTIPLY(tmp11, FIX_0_707106781); /* c4 */
-
- z11 = tmp7 + z3; /* phase 5 */
- z13 = tmp7 - z3;
-
- dataptr[DCTSIZE*5] = z13 + z2; /* phase 6 */
- dataptr[DCTSIZE*3] = z13 - z2;
- dataptr[DCTSIZE*1] = z11 + z4;
- dataptr[DCTSIZE*7] = z11 - z4;
-
- dataptr++; /* advance pointer to next column */
- }
-}
-
-#endif /* DCT_IFAST_SUPPORTED */
-
-#endif //_FX_JPEG_TURBO_
+#if !defined(_FX_JPEG_TURBO_)
+/*
+ * jfdctfst.c
+ *
+ * Copyright (C) 1994-1996, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains a fast, not so accurate integer implementation of the
+ * forward DCT (Discrete Cosine Transform).
+ *
+ * A 2-D DCT can be done by 1-D DCT on each row followed by 1-D DCT
+ * on each column. Direct algorithms are also available, but they are
+ * much more complex and seem not to be any faster when reduced to code.
+ *
+ * This implementation is based on Arai, Agui, and Nakajima's algorithm for
+ * scaled DCT. Their original paper (Trans. IEICE E-71(11):1095) is in
+ * Japanese, but the algorithm is described in the Pennebaker & Mitchell
+ * JPEG textbook (see REFERENCES section in file README). The following code
+ * is based directly on figure 4-8 in P&M.
+ * While an 8-point DCT cannot be done in less than 11 multiplies, it is
+ * possible to arrange the computation so that many of the multiplies are
+ * simple scalings of the final outputs. These multiplies can then be
+ * folded into the multiplications or divisions by the JPEG quantization
+ * table entries. The AA&N method leaves only 5 multiplies and 29 adds
+ * to be done in the DCT itself.
+ * The primary disadvantage of this method is that with fixed-point math,
+ * accuracy is lost due to imprecise representation of the scaled
+ * quantization values. The smaller the quantization table entry, the less
+ * precise the scaled value, so this implementation does worse with high-
+ * quality-setting files than with low-quality ones.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+#include "jdct.h" /* Private declarations for DCT subsystem */
+
+#ifdef DCT_IFAST_SUPPORTED
+
+
+/*
+ * This module is specialized to the case DCTSIZE = 8.
+ */
+
+#if DCTSIZE != 8
+ Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */
+#endif
+
+
+/* Scaling decisions are generally the same as in the LL&M algorithm;
+ * see jfdctint.c for more details. However, we choose to descale
+ * (right shift) multiplication products as soon as they are formed,
+ * rather than carrying additional fractional bits into subsequent additions.
+ * This compromises accuracy slightly, but it lets us save a few shifts.
+ * More importantly, 16-bit arithmetic is then adequate (for 8-bit samples)
+ * everywhere except in the multiplications proper; this saves a good deal
+ * of work on 16-bit-int machines.
+ *
+ * Again to save a few shifts, the intermediate results between pass 1 and
+ * pass 2 are not upscaled, but are represented only to integral precision.
+ *
+ * A final compromise is to represent the multiplicative constants to only
+ * 8 fractional bits, rather than 13. This saves some shifting work on some
+ * machines, and may also reduce the cost of multiplication (since there
+ * are fewer one-bits in the constants).
+ */
+
+#define CONST_BITS 8
+
+
+/* Some C compilers fail to reduce "FIX(constant)" at compile time, thus
+ * causing a lot of useless floating-point operations at run time.
+ * To get around this we use the following pre-calculated constants.
+ * If you change CONST_BITS you may want to add appropriate values.
+ * (With a reasonable C compiler, you can just rely on the FIX() macro...)
+ */
+
+#if CONST_BITS == 8
+#define FIX_0_382683433 ((INT32) 98) /* FIX(0.382683433) */
+#define FIX_0_541196100 ((INT32) 139) /* FIX(0.541196100) */
+#define FIX_0_707106781 ((INT32) 181) /* FIX(0.707106781) */
+#define FIX_1_306562965 ((INT32) 334) /* FIX(1.306562965) */
+#else
+#define FIX_0_382683433 FIX(0.382683433)
+#define FIX_0_541196100 FIX(0.541196100)
+#define FIX_0_707106781 FIX(0.707106781)
+#define FIX_1_306562965 FIX(1.306562965)
+#endif
+
+
+/* We can gain a little more speed, with a further compromise in accuracy,
+ * by omitting the addition in a descaling shift. This yields an incorrectly
+ * rounded result half the time...
+ */
+
+#ifndef USE_ACCURATE_ROUNDING
+#undef DESCALE
+#define DESCALE(x,n) RIGHT_SHIFT(x, n)
+#endif
+
+
+/* Multiply a DCTELEM variable by an INT32 constant, and immediately
+ * descale to yield a DCTELEM result.
+ */
+
+#define MULTIPLY(var,const) ((DCTELEM) DESCALE((var) * (const), CONST_BITS))
+
+
+/*
+ * Perform the forward DCT on one block of samples.
+ */
+
+GLOBAL(void)
+jpeg_fdct_ifast (DCTELEM * data)
+{
+ DCTELEM tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
+ DCTELEM tmp10, tmp11, tmp12, tmp13;
+ DCTELEM z1, z2, z3, z4, z5, z11, z13;
+ DCTELEM *dataptr;
+ int ctr;
+ SHIFT_TEMPS
+
+ /* Pass 1: process rows. */
+
+ dataptr = data;
+ for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {
+ tmp0 = dataptr[0] + dataptr[7];
+ tmp7 = dataptr[0] - dataptr[7];
+ tmp1 = dataptr[1] + dataptr[6];
+ tmp6 = dataptr[1] - dataptr[6];
+ tmp2 = dataptr[2] + dataptr[5];
+ tmp5 = dataptr[2] - dataptr[5];
+ tmp3 = dataptr[3] + dataptr[4];
+ tmp4 = dataptr[3] - dataptr[4];
+
+ /* Even part */
+
+ tmp10 = tmp0 + tmp3; /* phase 2 */
+ tmp13 = tmp0 - tmp3;
+ tmp11 = tmp1 + tmp2;
+ tmp12 = tmp1 - tmp2;
+
+ dataptr[0] = tmp10 + tmp11; /* phase 3 */
+ dataptr[4] = tmp10 - tmp11;
+
+ z1 = MULTIPLY(tmp12 + tmp13, FIX_0_707106781); /* c4 */
+ dataptr[2] = tmp13 + z1; /* phase 5 */
+ dataptr[6] = tmp13 - z1;
+
+ /* Odd part */
+
+ tmp10 = tmp4 + tmp5; /* phase 2 */
+ tmp11 = tmp5 + tmp6;
+ tmp12 = tmp6 + tmp7;
+
+ /* The rotator is modified from fig 4-8 to avoid extra negations. */
+ z5 = MULTIPLY(tmp10 - tmp12, FIX_0_382683433); /* c6 */
+ z2 = MULTIPLY(tmp10, FIX_0_541196100) + z5; /* c2-c6 */
+ z4 = MULTIPLY(tmp12, FIX_1_306562965) + z5; /* c2+c6 */
+ z3 = MULTIPLY(tmp11, FIX_0_707106781); /* c4 */
+
+ z11 = tmp7 + z3; /* phase 5 */
+ z13 = tmp7 - z3;
+
+ dataptr[5] = z13 + z2; /* phase 6 */
+ dataptr[3] = z13 - z2;
+ dataptr[1] = z11 + z4;
+ dataptr[7] = z11 - z4;
+
+ dataptr += DCTSIZE; /* advance pointer to next row */
+ }
+
+ /* Pass 2: process columns. */
+
+ dataptr = data;
+ for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {
+ tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*7];
+ tmp7 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*7];
+ tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*6];
+ tmp6 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*6];
+ tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*5];
+ tmp5 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*5];
+ tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*4];
+ tmp4 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*4];
+
+ /* Even part */
+
+ tmp10 = tmp0 + tmp3; /* phase 2 */
+ tmp13 = tmp0 - tmp3;
+ tmp11 = tmp1 + tmp2;
+ tmp12 = tmp1 - tmp2;
+
+ dataptr[DCTSIZE*0] = tmp10 + tmp11; /* phase 3 */
+ dataptr[DCTSIZE*4] = tmp10 - tmp11;
+
+ z1 = MULTIPLY(tmp12 + tmp13, FIX_0_707106781); /* c4 */
+ dataptr[DCTSIZE*2] = tmp13 + z1; /* phase 5 */
+ dataptr[DCTSIZE*6] = tmp13 - z1;
+
+ /* Odd part */
+
+ tmp10 = tmp4 + tmp5; /* phase 2 */
+ tmp11 = tmp5 + tmp6;
+ tmp12 = tmp6 + tmp7;
+
+ /* The rotator is modified from fig 4-8 to avoid extra negations. */
+ z5 = MULTIPLY(tmp10 - tmp12, FIX_0_382683433); /* c6 */
+ z2 = MULTIPLY(tmp10, FIX_0_541196100) + z5; /* c2-c6 */
+ z4 = MULTIPLY(tmp12, FIX_1_306562965) + z5; /* c2+c6 */
+ z3 = MULTIPLY(tmp11, FIX_0_707106781); /* c4 */
+
+ z11 = tmp7 + z3; /* phase 5 */
+ z13 = tmp7 - z3;
+
+ dataptr[DCTSIZE*5] = z13 + z2; /* phase 6 */
+ dataptr[DCTSIZE*3] = z13 - z2;
+ dataptr[DCTSIZE*1] = z11 + z4;
+ dataptr[DCTSIZE*7] = z11 - z4;
+
+ dataptr++; /* advance pointer to next column */
+ }
+}
+
+#endif /* DCT_IFAST_SUPPORTED */
+
+#endif //_FX_JPEG_TURBO_
diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jfdctint.c b/core/src/fxcodec/libjpeg/fpdfapi_jfdctint.c
index 88810a7d8e..488505b062 100644
--- a/core/src/fxcodec/libjpeg/fpdfapi_jfdctint.c
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jfdctint.c
@@ -1,286 +1,286 @@
-#if !defined(_FX_JPEG_TURBO_)
-/*
- * jfdctint.c
- *
- * Copyright (C) 1991-1996, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains a slow-but-accurate integer implementation of the
- * forward DCT (Discrete Cosine Transform).
- *
- * A 2-D DCT can be done by 1-D DCT on each row followed by 1-D DCT
- * on each column. Direct algorithms are also available, but they are
- * much more complex and seem not to be any faster when reduced to code.
- *
- * This implementation is based on an algorithm described in
- * C. Loeffler, A. Ligtenberg and G. Moschytz, "Practical Fast 1-D DCT
- * Algorithms with 11 Multiplications", Proc. Int'l. Conf. on Acoustics,
- * Speech, and Signal Processing 1989 (ICASSP '89), pp. 988-991.
- * The primary algorithm described there uses 11 multiplies and 29 adds.
- * We use their alternate method with 12 multiplies and 32 adds.
- * The advantage of this method is that no data path contains more than one
- * multiplication; this allows a very simple and accurate implementation in
- * scaled fixed-point arithmetic, with a minimal number of shifts.
- */
-
-#define JPEG_INTERNALS
-#include "jinclude.h"
-#include "jpeglib.h"
-#include "jdct.h" /* Private declarations for DCT subsystem */
-
-#ifdef DCT_ISLOW_SUPPORTED
-
-
-/*
- * This module is specialized to the case DCTSIZE = 8.
- */
-
-#if DCTSIZE != 8
- Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */
-#endif
-
-
-/*
- * The poop on this scaling stuff is as follows:
- *
- * Each 1-D DCT step produces outputs which are a factor of sqrt(N)
- * larger than the true DCT outputs. The final outputs are therefore
- * a factor of N larger than desired; since N=8 this can be cured by
- * a simple right shift at the end of the algorithm. The advantage of
- * this arrangement is that we save two multiplications per 1-D DCT,
- * because the y0 and y4 outputs need not be divided by sqrt(N).
- * In the IJG code, this factor of 8 is removed by the quantization step
- * (in jcdctmgr.c), NOT in this module.
- *
- * We have to do addition and subtraction of the integer inputs, which
- * is no problem, and multiplication by fractional constants, which is
- * a problem to do in integer arithmetic. We multiply all the constants
- * by CONST_SCALE and convert them to integer constants (thus retaining
- * CONST_BITS bits of precision in the constants). After doing a
- * multiplication we have to divide the product by CONST_SCALE, with proper
- * rounding, to produce the correct output. This division can be done
- * cheaply as a right shift of CONST_BITS bits. We postpone shifting
- * as long as possible so that partial sums can be added together with
- * full fractional precision.
- *
- * The outputs of the first pass are scaled up by PASS1_BITS bits so that
- * they are represented to better-than-integral precision. These outputs
- * require BITS_IN_JSAMPLE + PASS1_BITS + 3 bits; this fits in a 16-bit word
- * with the recommended scaling. (For 12-bit sample data, the intermediate
- * array is INT32 anyway.)
- *
- * To avoid overflow of the 32-bit intermediate results in pass 2, we must
- * have BITS_IN_JSAMPLE + CONST_BITS + PASS1_BITS <= 26. Error analysis
- * shows that the values given below are the most effective.
- */
-
-#if BITS_IN_JSAMPLE == 8
-#define CONST_BITS 13
-#define PASS1_BITS 2
-#else
-#define CONST_BITS 13
-#define PASS1_BITS 1 /* lose a little precision to avoid overflow */
-#endif
-
-/* Some C compilers fail to reduce "FIX(constant)" at compile time, thus
- * causing a lot of useless floating-point operations at run time.
- * To get around this we use the following pre-calculated constants.
- * If you change CONST_BITS you may want to add appropriate values.
- * (With a reasonable C compiler, you can just rely on the FIX() macro...)
- */
-
-#if CONST_BITS == 13
-#define FIX_0_298631336 ((INT32) 2446) /* FIX(0.298631336) */
-#define FIX_0_390180644 ((INT32) 3196) /* FIX(0.390180644) */
-#define FIX_0_541196100 ((INT32) 4433) /* FIX(0.541196100) */
-#define FIX_0_765366865 ((INT32) 6270) /* FIX(0.765366865) */
-#define FIX_0_899976223 ((INT32) 7373) /* FIX(0.899976223) */
-#define FIX_1_175875602 ((INT32) 9633) /* FIX(1.175875602) */
-#define FIX_1_501321110 ((INT32) 12299) /* FIX(1.501321110) */
-#define FIX_1_847759065 ((INT32) 15137) /* FIX(1.847759065) */
-#define FIX_1_961570560 ((INT32) 16069) /* FIX(1.961570560) */
-#define FIX_2_053119869 ((INT32) 16819) /* FIX(2.053119869) */
-#define FIX_2_562915447 ((INT32) 20995) /* FIX(2.562915447) */
-#define FIX_3_072711026 ((INT32) 25172) /* FIX(3.072711026) */
-#else
-#define FIX_0_298631336 FIX(0.298631336)
-#define FIX_0_390180644 FIX(0.390180644)
-#define FIX_0_541196100 FIX(0.541196100)
-#define FIX_0_765366865 FIX(0.765366865)
-#define FIX_0_899976223 FIX(0.899976223)
-#define FIX_1_175875602 FIX(1.175875602)
-#define FIX_1_501321110 FIX(1.501321110)
-#define FIX_1_847759065 FIX(1.847759065)
-#define FIX_1_961570560 FIX(1.961570560)
-#define FIX_2_053119869 FIX(2.053119869)
-#define FIX_2_562915447 FIX(2.562915447)
-#define FIX_3_072711026 FIX(3.072711026)
-#endif
-
-
-/* Multiply an INT32 variable by an INT32 constant to yield an INT32 result.
- * For 8-bit samples with the recommended scaling, all the variable
- * and constant values involved are no more than 16 bits wide, so a
- * 16x16->32 bit multiply can be used instead of a full 32x32 multiply.
- * For 12-bit samples, a full 32-bit multiplication will be needed.
- */
-
-#if BITS_IN_JSAMPLE == 8
-#define MULTIPLY(var,const) MULTIPLY16C16(var,const)
-#else
-#define MULTIPLY(var,const) ((var) * (const))
-#endif
-
-
-/*
- * Perform the forward DCT on one block of samples.
- */
-
-GLOBAL(void)
-jpeg_fdct_islow (DCTELEM * data)
-{
- INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
- INT32 tmp10, tmp11, tmp12, tmp13;
- INT32 z1, z2, z3, z4, z5;
- DCTELEM *dataptr;
- int ctr;
- SHIFT_TEMPS
-
- /* Pass 1: process rows. */
- /* Note results are scaled up by sqrt(8) compared to a true DCT; */
- /* furthermore, we scale the results by 2**PASS1_BITS. */
-
- dataptr = data;
- for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {
- tmp0 = dataptr[0] + dataptr[7];
- tmp7 = dataptr[0] - dataptr[7];
- tmp1 = dataptr[1] + dataptr[6];
- tmp6 = dataptr[1] - dataptr[6];
- tmp2 = dataptr[2] + dataptr[5];
- tmp5 = dataptr[2] - dataptr[5];
- tmp3 = dataptr[3] + dataptr[4];
- tmp4 = dataptr[3] - dataptr[4];
-
- /* Even part per LL&M figure 1 --- note that published figure is faulty;
- * rotator "sqrt(2)*c1" should be "sqrt(2)*c6".
- */
-
- tmp10 = tmp0 + tmp3;
- tmp13 = tmp0 - tmp3;
- tmp11 = tmp1 + tmp2;
- tmp12 = tmp1 - tmp2;
-
- dataptr[0] = (DCTELEM) ((tmp10 + tmp11) << PASS1_BITS);
- dataptr[4] = (DCTELEM) ((tmp10 - tmp11) << PASS1_BITS);
-
- z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100);
- dataptr[2] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp13, FIX_0_765366865),
- CONST_BITS-PASS1_BITS);
- dataptr[6] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp12, - FIX_1_847759065),
- CONST_BITS-PASS1_BITS);
-
- /* Odd part per figure 8 --- note paper omits factor of sqrt(2).
- * cK represents cos(K*pi/16).
- * i0..i3 in the paper are tmp4..tmp7 here.
- */
-
- z1 = tmp4 + tmp7;
- z2 = tmp5 + tmp6;
- z3 = tmp4 + tmp6;
- z4 = tmp5 + tmp7;
- z5 = MULTIPLY(z3 + z4, FIX_1_175875602); /* sqrt(2) * c3 */
-
- tmp4 = MULTIPLY(tmp4, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */
- tmp5 = MULTIPLY(tmp5, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */
- tmp6 = MULTIPLY(tmp6, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */
- tmp7 = MULTIPLY(tmp7, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */
- z1 = MULTIPLY(z1, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */
- z2 = MULTIPLY(z2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */
- z3 = MULTIPLY(z3, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */
- z4 = MULTIPLY(z4, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */
-
- z3 += z5;
- z4 += z5;
-
- dataptr[7] = (DCTELEM) DESCALE(tmp4 + z1 + z3, CONST_BITS-PASS1_BITS);
- dataptr[5] = (DCTELEM) DESCALE(tmp5 + z2 + z4, CONST_BITS-PASS1_BITS);
- dataptr[3] = (DCTELEM) DESCALE(tmp6 + z2 + z3, CONST_BITS-PASS1_BITS);
- dataptr[1] = (DCTELEM) DESCALE(tmp7 + z1 + z4, CONST_BITS-PASS1_BITS);
-
- dataptr += DCTSIZE; /* advance pointer to next row */
- }
-
- /* Pass 2: process columns.
- * We remove the PASS1_BITS scaling, but leave the results scaled up
- * by an overall factor of 8.
- */
-
- dataptr = data;
- for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {
- tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*7];
- tmp7 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*7];
- tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*6];
- tmp6 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*6];
- tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*5];
- tmp5 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*5];
- tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*4];
- tmp4 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*4];
-
- /* Even part per LL&M figure 1 --- note that published figure is faulty;
- * rotator "sqrt(2)*c1" should be "sqrt(2)*c6".
- */
-
- tmp10 = tmp0 + tmp3;
- tmp13 = tmp0 - tmp3;
- tmp11 = tmp1 + tmp2;
- tmp12 = tmp1 - tmp2;
-
- dataptr[DCTSIZE*0] = (DCTELEM) DESCALE(tmp10 + tmp11, PASS1_BITS);
- dataptr[DCTSIZE*4] = (DCTELEM) DESCALE(tmp10 - tmp11, PASS1_BITS);
-
- z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100);
- dataptr[DCTSIZE*2] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp13, FIX_0_765366865),
- CONST_BITS+PASS1_BITS);
- dataptr[DCTSIZE*6] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp12, - FIX_1_847759065),
- CONST_BITS+PASS1_BITS);
-
- /* Odd part per figure 8 --- note paper omits factor of sqrt(2).
- * cK represents cos(K*pi/16).
- * i0..i3 in the paper are tmp4..tmp7 here.
- */
-
- z1 = tmp4 + tmp7;
- z2 = tmp5 + tmp6;
- z3 = tmp4 + tmp6;
- z4 = tmp5 + tmp7;
- z5 = MULTIPLY(z3 + z4, FIX_1_175875602); /* sqrt(2) * c3 */
-
- tmp4 = MULTIPLY(tmp4, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */
- tmp5 = MULTIPLY(tmp5, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */
- tmp6 = MULTIPLY(tmp6, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */
- tmp7 = MULTIPLY(tmp7, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */
- z1 = MULTIPLY(z1, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */
- z2 = MULTIPLY(z2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */
- z3 = MULTIPLY(z3, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */
- z4 = MULTIPLY(z4, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */
-
- z3 += z5;
- z4 += z5;
-
- dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp4 + z1 + z3,
- CONST_BITS+PASS1_BITS);
- dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp5 + z2 + z4,
- CONST_BITS+PASS1_BITS);
- dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp6 + z2 + z3,
- CONST_BITS+PASS1_BITS);
- dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp7 + z1 + z4,
- CONST_BITS+PASS1_BITS);
-
- dataptr++; /* advance pointer to next column */
- }
-}
-
-#endif /* DCT_ISLOW_SUPPORTED */
-
-#endif //_FX_JPEG_TURBO_
+#if !defined(_FX_JPEG_TURBO_)
+/*
+ * jfdctint.c
+ *
+ * Copyright (C) 1991-1996, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains a slow-but-accurate integer implementation of the
+ * forward DCT (Discrete Cosine Transform).
+ *
+ * A 2-D DCT can be done by 1-D DCT on each row followed by 1-D DCT
+ * on each column. Direct algorithms are also available, but they are
+ * much more complex and seem not to be any faster when reduced to code.
+ *
+ * This implementation is based on an algorithm described in
+ * C. Loeffler, A. Ligtenberg and G. Moschytz, "Practical Fast 1-D DCT
+ * Algorithms with 11 Multiplications", Proc. Int'l. Conf. on Acoustics,
+ * Speech, and Signal Processing 1989 (ICASSP '89), pp. 988-991.
+ * The primary algorithm described there uses 11 multiplies and 29 adds.
+ * We use their alternate method with 12 multiplies and 32 adds.
+ * The advantage of this method is that no data path contains more than one
+ * multiplication; this allows a very simple and accurate implementation in
+ * scaled fixed-point arithmetic, with a minimal number of shifts.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+#include "jdct.h" /* Private declarations for DCT subsystem */
+
+#ifdef DCT_ISLOW_SUPPORTED
+
+
+/*
+ * This module is specialized to the case DCTSIZE = 8.
+ */
+
+#if DCTSIZE != 8
+ Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */
+#endif
+
+
+/*
+ * The poop on this scaling stuff is as follows:
+ *
+ * Each 1-D DCT step produces outputs which are a factor of sqrt(N)
+ * larger than the true DCT outputs. The final outputs are therefore
+ * a factor of N larger than desired; since N=8 this can be cured by
+ * a simple right shift at the end of the algorithm. The advantage of
+ * this arrangement is that we save two multiplications per 1-D DCT,
+ * because the y0 and y4 outputs need not be divided by sqrt(N).
+ * In the IJG code, this factor of 8 is removed by the quantization step
+ * (in jcdctmgr.c), NOT in this module.
+ *
+ * We have to do addition and subtraction of the integer inputs, which
+ * is no problem, and multiplication by fractional constants, which is
+ * a problem to do in integer arithmetic. We multiply all the constants
+ * by CONST_SCALE and convert them to integer constants (thus retaining
+ * CONST_BITS bits of precision in the constants). After doing a
+ * multiplication we have to divide the product by CONST_SCALE, with proper
+ * rounding, to produce the correct output. This division can be done
+ * cheaply as a right shift of CONST_BITS bits. We postpone shifting
+ * as long as possible so that partial sums can be added together with
+ * full fractional precision.
+ *
+ * The outputs of the first pass are scaled up by PASS1_BITS bits so that
+ * they are represented to better-than-integral precision. These outputs
+ * require BITS_IN_JSAMPLE + PASS1_BITS + 3 bits; this fits in a 16-bit word
+ * with the recommended scaling. (For 12-bit sample data, the intermediate
+ * array is INT32 anyway.)
+ *
+ * To avoid overflow of the 32-bit intermediate results in pass 2, we must
+ * have BITS_IN_JSAMPLE + CONST_BITS + PASS1_BITS <= 26. Error analysis
+ * shows that the values given below are the most effective.
+ */
+
+#if BITS_IN_JSAMPLE == 8
+#define CONST_BITS 13
+#define PASS1_BITS 2
+#else
+#define CONST_BITS 13
+#define PASS1_BITS 1 /* lose a little precision to avoid overflow */
+#endif
+
+/* Some C compilers fail to reduce "FIX(constant)" at compile time, thus
+ * causing a lot of useless floating-point operations at run time.
+ * To get around this we use the following pre-calculated constants.
+ * If you change CONST_BITS you may want to add appropriate values.
+ * (With a reasonable C compiler, you can just rely on the FIX() macro...)
+ */
+
+#if CONST_BITS == 13
+#define FIX_0_298631336 ((INT32) 2446) /* FIX(0.298631336) */
+#define FIX_0_390180644 ((INT32) 3196) /* FIX(0.390180644) */
+#define FIX_0_541196100 ((INT32) 4433) /* FIX(0.541196100) */
+#define FIX_0_765366865 ((INT32) 6270) /* FIX(0.765366865) */
+#define FIX_0_899976223 ((INT32) 7373) /* FIX(0.899976223) */
+#define FIX_1_175875602 ((INT32) 9633) /* FIX(1.175875602) */
+#define FIX_1_501321110 ((INT32) 12299) /* FIX(1.501321110) */
+#define FIX_1_847759065 ((INT32) 15137) /* FIX(1.847759065) */
+#define FIX_1_961570560 ((INT32) 16069) /* FIX(1.961570560) */
+#define FIX_2_053119869 ((INT32) 16819) /* FIX(2.053119869) */
+#define FIX_2_562915447 ((INT32) 20995) /* FIX(2.562915447) */
+#define FIX_3_072711026 ((INT32) 25172) /* FIX(3.072711026) */
+#else
+#define FIX_0_298631336 FIX(0.298631336)
+#define FIX_0_390180644 FIX(0.390180644)
+#define FIX_0_541196100 FIX(0.541196100)
+#define FIX_0_765366865 FIX(0.765366865)
+#define FIX_0_899976223 FIX(0.899976223)
+#define FIX_1_175875602 FIX(1.175875602)
+#define FIX_1_501321110 FIX(1.501321110)
+#define FIX_1_847759065 FIX(1.847759065)
+#define FIX_1_961570560 FIX(1.961570560)
+#define FIX_2_053119869 FIX(2.053119869)
+#define FIX_2_562915447 FIX(2.562915447)
+#define FIX_3_072711026 FIX(3.072711026)
+#endif
+
+
+/* Multiply an INT32 variable by an INT32 constant to yield an INT32 result.
+ * For 8-bit samples with the recommended scaling, all the variable
+ * and constant values involved are no more than 16 bits wide, so a
+ * 16x16->32 bit multiply can be used instead of a full 32x32 multiply.
+ * For 12-bit samples, a full 32-bit multiplication will be needed.
+ */
+
+#if BITS_IN_JSAMPLE == 8
+#define MULTIPLY(var,const) MULTIPLY16C16(var,const)
+#else
+#define MULTIPLY(var,const) ((var) * (const))
+#endif
+
+
+/*
+ * Perform the forward DCT on one block of samples.
+ */
+
+GLOBAL(void)
+jpeg_fdct_islow (DCTELEM * data)
+{
+ INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
+ INT32 tmp10, tmp11, tmp12, tmp13;
+ INT32 z1, z2, z3, z4, z5;
+ DCTELEM *dataptr;
+ int ctr;
+ SHIFT_TEMPS
+
+ /* Pass 1: process rows. */
+ /* Note results are scaled up by sqrt(8) compared to a true DCT; */
+ /* furthermore, we scale the results by 2**PASS1_BITS. */
+
+ dataptr = data;
+ for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {
+ tmp0 = dataptr[0] + dataptr[7];
+ tmp7 = dataptr[0] - dataptr[7];
+ tmp1 = dataptr[1] + dataptr[6];
+ tmp6 = dataptr[1] - dataptr[6];
+ tmp2 = dataptr[2] + dataptr[5];
+ tmp5 = dataptr[2] - dataptr[5];
+ tmp3 = dataptr[3] + dataptr[4];
+ tmp4 = dataptr[3] - dataptr[4];
+
+ /* Even part per LL&M figure 1 --- note that published figure is faulty;
+ * rotator "sqrt(2)*c1" should be "sqrt(2)*c6".
+ */
+
+ tmp10 = tmp0 + tmp3;
+ tmp13 = tmp0 - tmp3;
+ tmp11 = tmp1 + tmp2;
+ tmp12 = tmp1 - tmp2;
+
+ dataptr[0] = (DCTELEM) ((tmp10 + tmp11) << PASS1_BITS);
+ dataptr[4] = (DCTELEM) ((tmp10 - tmp11) << PASS1_BITS);
+
+ z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100);
+ dataptr[2] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp13, FIX_0_765366865),
+ CONST_BITS-PASS1_BITS);
+ dataptr[6] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp12, - FIX_1_847759065),
+ CONST_BITS-PASS1_BITS);
+
+ /* Odd part per figure 8 --- note paper omits factor of sqrt(2).
+ * cK represents cos(K*pi/16).
+ * i0..i3 in the paper are tmp4..tmp7 here.
+ */
+
+ z1 = tmp4 + tmp7;
+ z2 = tmp5 + tmp6;
+ z3 = tmp4 + tmp6;
+ z4 = tmp5 + tmp7;
+ z5 = MULTIPLY(z3 + z4, FIX_1_175875602); /* sqrt(2) * c3 */
+
+ tmp4 = MULTIPLY(tmp4, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */
+ tmp5 = MULTIPLY(tmp5, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */
+ tmp6 = MULTIPLY(tmp6, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */
+ tmp7 = MULTIPLY(tmp7, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */
+ z1 = MULTIPLY(z1, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */
+ z2 = MULTIPLY(z2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */
+ z3 = MULTIPLY(z3, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */
+ z4 = MULTIPLY(z4, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */
+
+ z3 += z5;
+ z4 += z5;
+
+ dataptr[7] = (DCTELEM) DESCALE(tmp4 + z1 + z3, CONST_BITS-PASS1_BITS);
+ dataptr[5] = (DCTELEM) DESCALE(tmp5 + z2 + z4, CONST_BITS-PASS1_BITS);
+ dataptr[3] = (DCTELEM) DESCALE(tmp6 + z2 + z3, CONST_BITS-PASS1_BITS);
+ dataptr[1] = (DCTELEM) DESCALE(tmp7 + z1 + z4, CONST_BITS-PASS1_BITS);
+
+ dataptr += DCTSIZE; /* advance pointer to next row */
+ }
+
+ /* Pass 2: process columns.
+ * We remove the PASS1_BITS scaling, but leave the results scaled up
+ * by an overall factor of 8.
+ */
+
+ dataptr = data;
+ for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {
+ tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*7];
+ tmp7 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*7];
+ tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*6];
+ tmp6 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*6];
+ tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*5];
+ tmp5 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*5];
+ tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*4];
+ tmp4 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*4];
+
+ /* Even part per LL&M figure 1 --- note that published figure is faulty;
+ * rotator "sqrt(2)*c1" should be "sqrt(2)*c6".
+ */
+
+ tmp10 = tmp0 + tmp3;
+ tmp13 = tmp0 - tmp3;
+ tmp11 = tmp1 + tmp2;
+ tmp12 = tmp1 - tmp2;
+
+ dataptr[DCTSIZE*0] = (DCTELEM) DESCALE(tmp10 + tmp11, PASS1_BITS);
+ dataptr[DCTSIZE*4] = (DCTELEM) DESCALE(tmp10 - tmp11, PASS1_BITS);
+
+ z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100);
+ dataptr[DCTSIZE*2] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp13, FIX_0_765366865),
+ CONST_BITS+PASS1_BITS);
+ dataptr[DCTSIZE*6] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp12, - FIX_1_847759065),
+ CONST_BITS+PASS1_BITS);
+
+ /* Odd part per figure 8 --- note paper omits factor of sqrt(2).
+ * cK represents cos(K*pi/16).
+ * i0..i3 in the paper are tmp4..tmp7 here.
+ */
+
+ z1 = tmp4 + tmp7;
+ z2 = tmp5 + tmp6;
+ z3 = tmp4 + tmp6;
+ z4 = tmp5 + tmp7;
+ z5 = MULTIPLY(z3 + z4, FIX_1_175875602); /* sqrt(2) * c3 */
+
+ tmp4 = MULTIPLY(tmp4, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */
+ tmp5 = MULTIPLY(tmp5, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */
+ tmp6 = MULTIPLY(tmp6, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */
+ tmp7 = MULTIPLY(tmp7, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */
+ z1 = MULTIPLY(z1, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */
+ z2 = MULTIPLY(z2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */
+ z3 = MULTIPLY(z3, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */
+ z4 = MULTIPLY(z4, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */
+
+ z3 += z5;
+ z4 += z5;
+
+ dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp4 + z1 + z3,
+ CONST_BITS+PASS1_BITS);
+ dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp5 + z2 + z4,
+ CONST_BITS+PASS1_BITS);
+ dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp6 + z2 + z3,
+ CONST_BITS+PASS1_BITS);
+ dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp7 + z1 + z4,
+ CONST_BITS+PASS1_BITS);
+
+ dataptr++; /* advance pointer to next column */
+ }
+}
+
+#endif /* DCT_ISLOW_SUPPORTED */
+
+#endif //_FX_JPEG_TURBO_
diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jidctfst.c b/core/src/fxcodec/libjpeg/fpdfapi_jidctfst.c
index c0c504c2a6..26a8f68a27 100644
--- a/core/src/fxcodec/libjpeg/fpdfapi_jidctfst.c
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jidctfst.c
@@ -1,371 +1,371 @@
-#if !defined(_FX_JPEG_TURBO_)
-/*
- * jidctfst.c
- *
- * Copyright (C) 1994-1998, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains a fast, not so accurate integer implementation of the
- * inverse DCT (Discrete Cosine Transform). In the IJG code, this routine
- * must also perform dequantization of the input coefficients.
- *
- * A 2-D IDCT can be done by 1-D IDCT on each column followed by 1-D IDCT
- * on each row (or vice versa, but it's more convenient to emit a row at
- * a time). Direct algorithms are also available, but they are much more
- * complex and seem not to be any faster when reduced to code.
- *
- * This implementation is based on Arai, Agui, and Nakajima's algorithm for
- * scaled DCT. Their original paper (Trans. IEICE E-71(11):1095) is in
- * Japanese, but the algorithm is described in the Pennebaker & Mitchell
- * JPEG textbook (see REFERENCES section in file README). The following code
- * is based directly on figure 4-8 in P&M.
- * While an 8-point DCT cannot be done in less than 11 multiplies, it is
- * possible to arrange the computation so that many of the multiplies are
- * simple scalings of the final outputs. These multiplies can then be
- * folded into the multiplications or divisions by the JPEG quantization
- * table entries. The AA&N method leaves only 5 multiplies and 29 adds
- * to be done in the DCT itself.
- * The primary disadvantage of this method is that with fixed-point math,
- * accuracy is lost due to imprecise representation of the scaled
- * quantization values. The smaller the quantization table entry, the less
- * precise the scaled value, so this implementation does worse with high-
- * quality-setting files than with low-quality ones.
- */
-
-#define JPEG_INTERNALS
-#include "jinclude.h"
-#include "jpeglib.h"
-#include "jdct.h" /* Private declarations for DCT subsystem */
-
-#ifdef DCT_IFAST_SUPPORTED
-
-
-/*
- * This module is specialized to the case DCTSIZE = 8.
- */
-
-#if DCTSIZE != 8
- Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */
-#endif
-
-
-/* Scaling decisions are generally the same as in the LL&M algorithm;
- * see jidctint.c for more details. However, we choose to descale
- * (right shift) multiplication products as soon as they are formed,
- * rather than carrying additional fractional bits into subsequent additions.
- * This compromises accuracy slightly, but it lets us save a few shifts.
- * More importantly, 16-bit arithmetic is then adequate (for 8-bit samples)
- * everywhere except in the multiplications proper; this saves a good deal
- * of work on 16-bit-int machines.
- *
- * The dequantized coefficients are not integers because the AA&N scaling
- * factors have been incorporated. We represent them scaled up by PASS1_BITS,
- * so that the first and second IDCT rounds have the same input scaling.
- * For 8-bit JSAMPLEs, we choose IFAST_SCALE_BITS = PASS1_BITS so as to
- * avoid a descaling shift; this compromises accuracy rather drastically
- * for small quantization table entries, but it saves a lot of shifts.
- * For 12-bit JSAMPLEs, there's no hope of using 16x16 multiplies anyway,
- * so we use a much larger scaling factor to preserve accuracy.
- *
- * A final compromise is to represent the multiplicative constants to only
- * 8 fractional bits, rather than 13. This saves some shifting work on some
- * machines, and may also reduce the cost of multiplication (since there
- * are fewer one-bits in the constants).
- */
-
-#if BITS_IN_JSAMPLE == 8
-#define CONST_BITS 8
-#define PASS1_BITS 2
-#else
-#define CONST_BITS 8
-#define PASS1_BITS 1 /* lose a little precision to avoid overflow */
-#endif
-
-/* Some C compilers fail to reduce "FIX(constant)" at compile time, thus
- * causing a lot of useless floating-point operations at run time.
- * To get around this we use the following pre-calculated constants.
- * If you change CONST_BITS you may want to add appropriate values.
- * (With a reasonable C compiler, you can just rely on the FIX() macro...)
- */
-
-#if CONST_BITS == 8
-#define FIX_1_082392200 ((INT32) 277) /* FIX(1.082392200) */
-#define FIX_1_414213562 ((INT32) 362) /* FIX(1.414213562) */
-#define FIX_1_847759065 ((INT32) 473) /* FIX(1.847759065) */
-#define FIX_2_613125930 ((INT32) 669) /* FIX(2.613125930) */
-#else
-#define FIX_1_082392200 FIX(1.082392200)
-#define FIX_1_414213562 FIX(1.414213562)
-#define FIX_1_847759065 FIX(1.847759065)
-#define FIX_2_613125930 FIX(2.613125930)
-#endif
-
-
-/* We can gain a little more speed, with a further compromise in accuracy,
- * by omitting the addition in a descaling shift. This yields an incorrectly
- * rounded result half the time...
- */
-
-#ifndef USE_ACCURATE_ROUNDING
-#undef DESCALE
-#define DESCALE(x,n) RIGHT_SHIFT(x, n)
-#endif
-
-
-/* Multiply a DCTELEM variable by an INT32 constant, and immediately
- * descale to yield a DCTELEM result.
- */
-
-#define MULTIPLY(var,const) ((DCTELEM) DESCALE((var) * (const), CONST_BITS))
-
-
-/* Dequantize a coefficient by multiplying it by the multiplier-table
- * entry; produce a DCTELEM result. For 8-bit data a 16x16->16
- * multiplication will do. For 12-bit data, the multiplier table is
- * declared INT32, so a 32-bit multiply will be used.
- */
-
-#if BITS_IN_JSAMPLE == 8
-#define DEQUANTIZE(coef,quantval) (((IFAST_MULT_TYPE) (coef)) * (quantval))
-#else
-#define DEQUANTIZE(coef,quantval) \
- DESCALE((coef)*(quantval), IFAST_SCALE_BITS-PASS1_BITS)
-#endif
-
-
-/* Like DESCALE, but applies to a DCTELEM and produces an int.
- * We assume that int right shift is unsigned if INT32 right shift is.
- */
-
-#ifdef RIGHT_SHIFT_IS_UNSIGNED
-#define ISHIFT_TEMPS DCTELEM ishift_temp;
-#if BITS_IN_JSAMPLE == 8
-#define DCTELEMBITS 16 /* DCTELEM may be 16 or 32 bits */
-#else
-#define DCTELEMBITS 32 /* DCTELEM must be 32 bits */
-#endif
-#define IRIGHT_SHIFT(x,shft) \
- ((ishift_temp = (x)) < 0 ? \
- (ishift_temp >> (shft)) | ((~((DCTELEM) 0)) << (DCTELEMBITS-(shft))) : \
- (ishift_temp >> (shft)))
-#else
-#define ISHIFT_TEMPS
-#define IRIGHT_SHIFT(x,shft) ((x) >> (shft))
-#endif
-
-#ifdef USE_ACCURATE_ROUNDING
-#define IDESCALE(x,n) ((int) IRIGHT_SHIFT((x) + (1 << ((n)-1)), n))
-#else
-#define IDESCALE(x,n) ((int) IRIGHT_SHIFT(x, n))
-#endif
-
-
-/*
- * Perform dequantization and inverse DCT on one block of coefficients.
- */
-
-GLOBAL(void)
-jpeg_idct_ifast (j_decompress_ptr cinfo, jpeg_component_info * compptr,
- JCOEFPTR coef_block,
- JSAMPARRAY output_buf, JDIMENSION output_col)
-{
- DCTELEM tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
- DCTELEM tmp10, tmp11, tmp12, tmp13;
- DCTELEM z5, z10, z11, z12, z13;
- JCOEFPTR inptr;
- IFAST_MULT_TYPE * quantptr;
- int * wsptr;
- JSAMPROW outptr;
- JSAMPLE *range_limit = IDCT_range_limit(cinfo);
- int ctr;
- int workspace[DCTSIZE2]; /* buffers data between passes */
- SHIFT_TEMPS /* for DESCALE */
- ISHIFT_TEMPS /* for IDESCALE */
-
- /* Pass 1: process columns from input, store into work array. */
-
- inptr = coef_block;
- quantptr = (IFAST_MULT_TYPE *) compptr->dct_table;
- wsptr = workspace;
- for (ctr = DCTSIZE; ctr > 0; ctr--) {
- /* Due to quantization, we will usually find that many of the input
- * coefficients are zero, especially the AC terms. We can exploit this
- * by short-circuiting the IDCT calculation for any column in which all
- * the AC terms are zero. In that case each output is equal to the
- * DC coefficient (with scale factor as needed).
- * With typical images and quantization tables, half or more of the
- * column DCT calculations can be simplified this way.
- */
-
- if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*2] == 0 &&
- inptr[DCTSIZE*3] == 0 && inptr[DCTSIZE*4] == 0 &&
- inptr[DCTSIZE*5] == 0 && inptr[DCTSIZE*6] == 0 &&
- inptr[DCTSIZE*7] == 0) {
- /* AC terms all zero */
- int dcval = (int) DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
-
- wsptr[DCTSIZE*0] = dcval;
- wsptr[DCTSIZE*1] = dcval;
- wsptr[DCTSIZE*2] = dcval;
- wsptr[DCTSIZE*3] = dcval;
- wsptr[DCTSIZE*4] = dcval;
- wsptr[DCTSIZE*5] = dcval;
- wsptr[DCTSIZE*6] = dcval;
- wsptr[DCTSIZE*7] = dcval;
-
- inptr++; /* advance pointers to next column */
- quantptr++;
- wsptr++;
- continue;
- }
-
- /* Even part */
-
- tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
- tmp1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
- tmp2 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);
- tmp3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);
-
- tmp10 = tmp0 + tmp2; /* phase 3 */
- tmp11 = tmp0 - tmp2;
-
- tmp13 = tmp1 + tmp3; /* phases 5-3 */
- tmp12 = MULTIPLY(tmp1 - tmp3, FIX_1_414213562) - tmp13; /* 2*c4 */
-
- tmp0 = tmp10 + tmp13; /* phase 2 */
- tmp3 = tmp10 - tmp13;
- tmp1 = tmp11 + tmp12;
- tmp2 = tmp11 - tmp12;
-
- /* Odd part */
-
- tmp4 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
- tmp5 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
- tmp6 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);
- tmp7 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);
-
- z13 = tmp6 + tmp5; /* phase 6 */
- z10 = tmp6 - tmp5;
- z11 = tmp4 + tmp7;
- z12 = tmp4 - tmp7;
-
- tmp7 = z11 + z13; /* phase 5 */
- tmp11 = MULTIPLY(z11 - z13, FIX_1_414213562); /* 2*c4 */
-
- z5 = MULTIPLY(z10 + z12, FIX_1_847759065); /* 2*c2 */
- tmp10 = MULTIPLY(z12, FIX_1_082392200) - z5; /* 2*(c2-c6) */
- tmp12 = MULTIPLY(z10, - FIX_2_613125930) + z5; /* -2*(c2+c6) */
-
- tmp6 = tmp12 - tmp7; /* phase 2 */
- tmp5 = tmp11 - tmp6;
- tmp4 = tmp10 + tmp5;
-
- wsptr[DCTSIZE*0] = (int) (tmp0 + tmp7);
- wsptr[DCTSIZE*7] = (int) (tmp0 - tmp7);
- wsptr[DCTSIZE*1] = (int) (tmp1 + tmp6);
- wsptr[DCTSIZE*6] = (int) (tmp1 - tmp6);
- wsptr[DCTSIZE*2] = (int) (tmp2 + tmp5);
- wsptr[DCTSIZE*5] = (int) (tmp2 - tmp5);
- wsptr[DCTSIZE*4] = (int) (tmp3 + tmp4);
- wsptr[DCTSIZE*3] = (int) (tmp3 - tmp4);
-
- inptr++; /* advance pointers to next column */
- quantptr++;
- wsptr++;
- }
-
- /* Pass 2: process rows from work array, store into output array. */
- /* Note that we must descale the results by a factor of 8 == 2**3, */
- /* and also undo the PASS1_BITS scaling. */
-
- wsptr = workspace;
- for (ctr = 0; ctr < DCTSIZE; ctr++) {
- outptr = output_buf[ctr] + output_col;
- /* Rows of zeroes can be exploited in the same way as we did with columns.
- * However, the column calculation has created many nonzero AC terms, so
- * the simplification applies less often (typically 5% to 10% of the time).
- * On machines with very fast multiplication, it's possible that the
- * test takes more time than it's worth. In that case this section
- * may be commented out.
- */
-
-#ifndef NO_ZERO_ROW_TEST
- if (wsptr[1] == 0 && wsptr[2] == 0 && wsptr[3] == 0 && wsptr[4] == 0 &&
- wsptr[5] == 0 && wsptr[6] == 0 && wsptr[7] == 0) {
- /* AC terms all zero */
- JSAMPLE dcval = range_limit[IDESCALE(wsptr[0], PASS1_BITS+3)
- & RANGE_MASK];
-
- outptr[0] = dcval;
- outptr[1] = dcval;
- outptr[2] = dcval;
- outptr[3] = dcval;
- outptr[4] = dcval;
- outptr[5] = dcval;
- outptr[6] = dcval;
- outptr[7] = dcval;
-
- wsptr += DCTSIZE; /* advance pointer to next row */
- continue;
- }
-#endif
-
- /* Even part */
-
- tmp10 = ((DCTELEM) wsptr[0] + (DCTELEM) wsptr[4]);
- tmp11 = ((DCTELEM) wsptr[0] - (DCTELEM) wsptr[4]);
-
- tmp13 = ((DCTELEM) wsptr[2] + (DCTELEM) wsptr[6]);
- tmp12 = MULTIPLY((DCTELEM) wsptr[2] - (DCTELEM) wsptr[6], FIX_1_414213562)
- - tmp13;
-
- tmp0 = tmp10 + tmp13;
- tmp3 = tmp10 - tmp13;
- tmp1 = tmp11 + tmp12;
- tmp2 = tmp11 - tmp12;
-
- /* Odd part */
-
- z13 = (DCTELEM) wsptr[5] + (DCTELEM) wsptr[3];
- z10 = (DCTELEM) wsptr[5] - (DCTELEM) wsptr[3];
- z11 = (DCTELEM) wsptr[1] + (DCTELEM) wsptr[7];
- z12 = (DCTELEM) wsptr[1] - (DCTELEM) wsptr[7];
-
- tmp7 = z11 + z13; /* phase 5 */
- tmp11 = MULTIPLY(z11 - z13, FIX_1_414213562); /* 2*c4 */
-
- z5 = MULTIPLY(z10 + z12, FIX_1_847759065); /* 2*c2 */
- tmp10 = MULTIPLY(z12, FIX_1_082392200) - z5; /* 2*(c2-c6) */
- tmp12 = MULTIPLY(z10, - FIX_2_613125930) + z5; /* -2*(c2+c6) */
-
- tmp6 = tmp12 - tmp7; /* phase 2 */
- tmp5 = tmp11 - tmp6;
- tmp4 = tmp10 + tmp5;
-
- /* Final output stage: scale down by a factor of 8 and range-limit */
-
- outptr[0] = range_limit[IDESCALE(tmp0 + tmp7, PASS1_BITS+3)
- & RANGE_MASK];
- outptr[7] = range_limit[IDESCALE(tmp0 - tmp7, PASS1_BITS+3)
- & RANGE_MASK];
- outptr[1] = range_limit[IDESCALE(tmp1 + tmp6, PASS1_BITS+3)
- & RANGE_MASK];
- outptr[6] = range_limit[IDESCALE(tmp1 - tmp6, PASS1_BITS+3)
- & RANGE_MASK];
- outptr[2] = range_limit[IDESCALE(tmp2 + tmp5, PASS1_BITS+3)
- & RANGE_MASK];
- outptr[5] = range_limit[IDESCALE(tmp2 - tmp5, PASS1_BITS+3)
- & RANGE_MASK];
- outptr[4] = range_limit[IDESCALE(tmp3 + tmp4, PASS1_BITS+3)
- & RANGE_MASK];
- outptr[3] = range_limit[IDESCALE(tmp3 - tmp4, PASS1_BITS+3)
- & RANGE_MASK];
-
- wsptr += DCTSIZE; /* advance pointer to next row */
- }
-}
-
-#endif /* DCT_IFAST_SUPPORTED */
-
-#endif //_FX_JPEG_TURBO_
+#if !defined(_FX_JPEG_TURBO_)
+/*
+ * jidctfst.c
+ *
+ * Copyright (C) 1994-1998, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains a fast, not so accurate integer implementation of the
+ * inverse DCT (Discrete Cosine Transform). In the IJG code, this routine
+ * must also perform dequantization of the input coefficients.
+ *
+ * A 2-D IDCT can be done by 1-D IDCT on each column followed by 1-D IDCT
+ * on each row (or vice versa, but it's more convenient to emit a row at
+ * a time). Direct algorithms are also available, but they are much more
+ * complex and seem not to be any faster when reduced to code.
+ *
+ * This implementation is based on Arai, Agui, and Nakajima's algorithm for
+ * scaled DCT. Their original paper (Trans. IEICE E-71(11):1095) is in
+ * Japanese, but the algorithm is described in the Pennebaker & Mitchell
+ * JPEG textbook (see REFERENCES section in file README). The following code
+ * is based directly on figure 4-8 in P&M.
+ * While an 8-point DCT cannot be done in less than 11 multiplies, it is
+ * possible to arrange the computation so that many of the multiplies are
+ * simple scalings of the final outputs. These multiplies can then be
+ * folded into the multiplications or divisions by the JPEG quantization
+ * table entries. The AA&N method leaves only 5 multiplies and 29 adds
+ * to be done in the DCT itself.
+ * The primary disadvantage of this method is that with fixed-point math,
+ * accuracy is lost due to imprecise representation of the scaled
+ * quantization values. The smaller the quantization table entry, the less
+ * precise the scaled value, so this implementation does worse with high-
+ * quality-setting files than with low-quality ones.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+#include "jdct.h" /* Private declarations for DCT subsystem */
+
+#ifdef DCT_IFAST_SUPPORTED
+
+
+/*
+ * This module is specialized to the case DCTSIZE = 8.
+ */
+
+#if DCTSIZE != 8
+ Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */
+#endif
+
+
+/* Scaling decisions are generally the same as in the LL&M algorithm;
+ * see jidctint.c for more details. However, we choose to descale
+ * (right shift) multiplication products as soon as they are formed,
+ * rather than carrying additional fractional bits into subsequent additions.
+ * This compromises accuracy slightly, but it lets us save a few shifts.
+ * More importantly, 16-bit arithmetic is then adequate (for 8-bit samples)
+ * everywhere except in the multiplications proper; this saves a good deal
+ * of work on 16-bit-int machines.
+ *
+ * The dequantized coefficients are not integers because the AA&N scaling
+ * factors have been incorporated. We represent them scaled up by PASS1_BITS,
+ * so that the first and second IDCT rounds have the same input scaling.
+ * For 8-bit JSAMPLEs, we choose IFAST_SCALE_BITS = PASS1_BITS so as to
+ * avoid a descaling shift; this compromises accuracy rather drastically
+ * for small quantization table entries, but it saves a lot of shifts.
+ * For 12-bit JSAMPLEs, there's no hope of using 16x16 multiplies anyway,
+ * so we use a much larger scaling factor to preserve accuracy.
+ *
+ * A final compromise is to represent the multiplicative constants to only
+ * 8 fractional bits, rather than 13. This saves some shifting work on some
+ * machines, and may also reduce the cost of multiplication (since there
+ * are fewer one-bits in the constants).
+ */
+
+#if BITS_IN_JSAMPLE == 8
+#define CONST_BITS 8
+#define PASS1_BITS 2
+#else
+#define CONST_BITS 8
+#define PASS1_BITS 1 /* lose a little precision to avoid overflow */
+#endif
+
+/* Some C compilers fail to reduce "FIX(constant)" at compile time, thus
+ * causing a lot of useless floating-point operations at run time.
+ * To get around this we use the following pre-calculated constants.
+ * If you change CONST_BITS you may want to add appropriate values.
+ * (With a reasonable C compiler, you can just rely on the FIX() macro...)
+ */
+
+#if CONST_BITS == 8
+#define FIX_1_082392200 ((INT32) 277) /* FIX(1.082392200) */
+#define FIX_1_414213562 ((INT32) 362) /* FIX(1.414213562) */
+#define FIX_1_847759065 ((INT32) 473) /* FIX(1.847759065) */
+#define FIX_2_613125930 ((INT32) 669) /* FIX(2.613125930) */
+#else
+#define FIX_1_082392200 FIX(1.082392200)
+#define FIX_1_414213562 FIX(1.414213562)
+#define FIX_1_847759065 FIX(1.847759065)
+#define FIX_2_613125930 FIX(2.613125930)
+#endif
+
+
+/* We can gain a little more speed, with a further compromise in accuracy,
+ * by omitting the addition in a descaling shift. This yields an incorrectly
+ * rounded result half the time...
+ */
+
+#ifndef USE_ACCURATE_ROUNDING
+#undef DESCALE
+#define DESCALE(x,n) RIGHT_SHIFT(x, n)
+#endif
+
+
+/* Multiply a DCTELEM variable by an INT32 constant, and immediately
+ * descale to yield a DCTELEM result.
+ */
+
+#define MULTIPLY(var,const) ((DCTELEM) DESCALE((var) * (const), CONST_BITS))
+
+
+/* Dequantize a coefficient by multiplying it by the multiplier-table
+ * entry; produce a DCTELEM result. For 8-bit data a 16x16->16
+ * multiplication will do. For 12-bit data, the multiplier table is
+ * declared INT32, so a 32-bit multiply will be used.
+ */
+
+#if BITS_IN_JSAMPLE == 8
+#define DEQUANTIZE(coef,quantval) (((IFAST_MULT_TYPE) (coef)) * (quantval))
+#else
+#define DEQUANTIZE(coef,quantval) \
+ DESCALE((coef)*(quantval), IFAST_SCALE_BITS-PASS1_BITS)
+#endif
+
+
+/* Like DESCALE, but applies to a DCTELEM and produces an int.
+ * We assume that int right shift is unsigned if INT32 right shift is.
+ */
+
+#ifdef RIGHT_SHIFT_IS_UNSIGNED
+#define ISHIFT_TEMPS DCTELEM ishift_temp;
+#if BITS_IN_JSAMPLE == 8
+#define DCTELEMBITS 16 /* DCTELEM may be 16 or 32 bits */
+#else
+#define DCTELEMBITS 32 /* DCTELEM must be 32 bits */
+#endif
+#define IRIGHT_SHIFT(x,shft) \
+ ((ishift_temp = (x)) < 0 ? \
+ (ishift_temp >> (shft)) | ((~((DCTELEM) 0)) << (DCTELEMBITS-(shft))) : \
+ (ishift_temp >> (shft)))
+#else
+#define ISHIFT_TEMPS
+#define IRIGHT_SHIFT(x,shft) ((x) >> (shft))
+#endif
+
+#ifdef USE_ACCURATE_ROUNDING
+#define IDESCALE(x,n) ((int) IRIGHT_SHIFT((x) + (1 << ((n)-1)), n))
+#else
+#define IDESCALE(x,n) ((int) IRIGHT_SHIFT(x, n))
+#endif
+
+
+/*
+ * Perform dequantization and inverse DCT on one block of coefficients.
+ */
+
+GLOBAL(void)
+jpeg_idct_ifast (j_decompress_ptr cinfo, jpeg_component_info * compptr,
+ JCOEFPTR coef_block,
+ JSAMPARRAY output_buf, JDIMENSION output_col)
+{
+ DCTELEM tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
+ DCTELEM tmp10, tmp11, tmp12, tmp13;
+ DCTELEM z5, z10, z11, z12, z13;
+ JCOEFPTR inptr;
+ IFAST_MULT_TYPE * quantptr;
+ int * wsptr;
+ JSAMPROW outptr;
+ JSAMPLE *range_limit = IDCT_range_limit(cinfo);
+ int ctr;
+ int workspace[DCTSIZE2]; /* buffers data between passes */
+ SHIFT_TEMPS /* for DESCALE */
+ ISHIFT_TEMPS /* for IDESCALE */
+
+ /* Pass 1: process columns from input, store into work array. */
+
+ inptr = coef_block;
+ quantptr = (IFAST_MULT_TYPE *) compptr->dct_table;
+ wsptr = workspace;
+ for (ctr = DCTSIZE; ctr > 0; ctr--) {
+ /* Due to quantization, we will usually find that many of the input
+ * coefficients are zero, especially the AC terms. We can exploit this
+ * by short-circuiting the IDCT calculation for any column in which all
+ * the AC terms are zero. In that case each output is equal to the
+ * DC coefficient (with scale factor as needed).
+ * With typical images and quantization tables, half or more of the
+ * column DCT calculations can be simplified this way.
+ */
+
+ if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*2] == 0 &&
+ inptr[DCTSIZE*3] == 0 && inptr[DCTSIZE*4] == 0 &&
+ inptr[DCTSIZE*5] == 0 && inptr[DCTSIZE*6] == 0 &&
+ inptr[DCTSIZE*7] == 0) {
+ /* AC terms all zero */
+ int dcval = (int) DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
+
+ wsptr[DCTSIZE*0] = dcval;
+ wsptr[DCTSIZE*1] = dcval;
+ wsptr[DCTSIZE*2] = dcval;
+ wsptr[DCTSIZE*3] = dcval;
+ wsptr[DCTSIZE*4] = dcval;
+ wsptr[DCTSIZE*5] = dcval;
+ wsptr[DCTSIZE*6] = dcval;
+ wsptr[DCTSIZE*7] = dcval;
+
+ inptr++; /* advance pointers to next column */
+ quantptr++;
+ wsptr++;
+ continue;
+ }
+
+ /* Even part */
+
+ tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
+ tmp1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
+ tmp2 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);
+ tmp3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);
+
+ tmp10 = tmp0 + tmp2; /* phase 3 */
+ tmp11 = tmp0 - tmp2;
+
+ tmp13 = tmp1 + tmp3; /* phases 5-3 */
+ tmp12 = MULTIPLY(tmp1 - tmp3, FIX_1_414213562) - tmp13; /* 2*c4 */
+
+ tmp0 = tmp10 + tmp13; /* phase 2 */
+ tmp3 = tmp10 - tmp13;
+ tmp1 = tmp11 + tmp12;
+ tmp2 = tmp11 - tmp12;
+
+ /* Odd part */
+
+ tmp4 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
+ tmp5 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
+ tmp6 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);
+ tmp7 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);
+
+ z13 = tmp6 + tmp5; /* phase 6 */
+ z10 = tmp6 - tmp5;
+ z11 = tmp4 + tmp7;
+ z12 = tmp4 - tmp7;
+
+ tmp7 = z11 + z13; /* phase 5 */
+ tmp11 = MULTIPLY(z11 - z13, FIX_1_414213562); /* 2*c4 */
+
+ z5 = MULTIPLY(z10 + z12, FIX_1_847759065); /* 2*c2 */
+ tmp10 = MULTIPLY(z12, FIX_1_082392200) - z5; /* 2*(c2-c6) */
+ tmp12 = MULTIPLY(z10, - FIX_2_613125930) + z5; /* -2*(c2+c6) */
+
+ tmp6 = tmp12 - tmp7; /* phase 2 */
+ tmp5 = tmp11 - tmp6;
+ tmp4 = tmp10 + tmp5;
+
+ wsptr[DCTSIZE*0] = (int) (tmp0 + tmp7);
+ wsptr[DCTSIZE*7] = (int) (tmp0 - tmp7);
+ wsptr[DCTSIZE*1] = (int) (tmp1 + tmp6);
+ wsptr[DCTSIZE*6] = (int) (tmp1 - tmp6);
+ wsptr[DCTSIZE*2] = (int) (tmp2 + tmp5);
+ wsptr[DCTSIZE*5] = (int) (tmp2 - tmp5);
+ wsptr[DCTSIZE*4] = (int) (tmp3 + tmp4);
+ wsptr[DCTSIZE*3] = (int) (tmp3 - tmp4);
+
+ inptr++; /* advance pointers to next column */
+ quantptr++;
+ wsptr++;
+ }
+
+ /* Pass 2: process rows from work array, store into output array. */
+ /* Note that we must descale the results by a factor of 8 == 2**3, */
+ /* and also undo the PASS1_BITS scaling. */
+
+ wsptr = workspace;
+ for (ctr = 0; ctr < DCTSIZE; ctr++) {
+ outptr = output_buf[ctr] + output_col;
+ /* Rows of zeroes can be exploited in the same way as we did with columns.
+ * However, the column calculation has created many nonzero AC terms, so
+ * the simplification applies less often (typically 5% to 10% of the time).
+ * On machines with very fast multiplication, it's possible that the
+ * test takes more time than it's worth. In that case this section
+ * may be commented out.
+ */
+
+#ifndef NO_ZERO_ROW_TEST
+ if (wsptr[1] == 0 && wsptr[2] == 0 && wsptr[3] == 0 && wsptr[4] == 0 &&
+ wsptr[5] == 0 && wsptr[6] == 0 && wsptr[7] == 0) {
+ /* AC terms all zero */
+ JSAMPLE dcval = range_limit[IDESCALE(wsptr[0], PASS1_BITS+3)
+ & RANGE_MASK];
+
+ outptr[0] = dcval;
+ outptr[1] = dcval;
+ outptr[2] = dcval;
+ outptr[3] = dcval;
+ outptr[4] = dcval;
+ outptr[5] = dcval;
+ outptr[6] = dcval;
+ outptr[7] = dcval;
+
+ wsptr += DCTSIZE; /* advance pointer to next row */
+ continue;
+ }
+#endif
+
+ /* Even part */
+
+ tmp10 = ((DCTELEM) wsptr[0] + (DCTELEM) wsptr[4]);
+ tmp11 = ((DCTELEM) wsptr[0] - (DCTELEM) wsptr[4]);
+
+ tmp13 = ((DCTELEM) wsptr[2] + (DCTELEM) wsptr[6]);
+ tmp12 = MULTIPLY((DCTELEM) wsptr[2] - (DCTELEM) wsptr[6], FIX_1_414213562)
+ - tmp13;
+
+ tmp0 = tmp10 + tmp13;
+ tmp3 = tmp10 - tmp13;
+ tmp1 = tmp11 + tmp12;
+ tmp2 = tmp11 - tmp12;
+
+ /* Odd part */
+
+ z13 = (DCTELEM) wsptr[5] + (DCTELEM) wsptr[3];
+ z10 = (DCTELEM) wsptr[5] - (DCTELEM) wsptr[3];
+ z11 = (DCTELEM) wsptr[1] + (DCTELEM) wsptr[7];
+ z12 = (DCTELEM) wsptr[1] - (DCTELEM) wsptr[7];
+
+ tmp7 = z11 + z13; /* phase 5 */
+ tmp11 = MULTIPLY(z11 - z13, FIX_1_414213562); /* 2*c4 */
+
+ z5 = MULTIPLY(z10 + z12, FIX_1_847759065); /* 2*c2 */
+ tmp10 = MULTIPLY(z12, FIX_1_082392200) - z5; /* 2*(c2-c6) */
+ tmp12 = MULTIPLY(z10, - FIX_2_613125930) + z5; /* -2*(c2+c6) */
+
+ tmp6 = tmp12 - tmp7; /* phase 2 */
+ tmp5 = tmp11 - tmp6;
+ tmp4 = tmp10 + tmp5;
+
+ /* Final output stage: scale down by a factor of 8 and range-limit */
+
+ outptr[0] = range_limit[IDESCALE(tmp0 + tmp7, PASS1_BITS+3)
+ & RANGE_MASK];
+ outptr[7] = range_limit[IDESCALE(tmp0 - tmp7, PASS1_BITS+3)
+ & RANGE_MASK];
+ outptr[1] = range_limit[IDESCALE(tmp1 + tmp6, PASS1_BITS+3)
+ & RANGE_MASK];
+ outptr[6] = range_limit[IDESCALE(tmp1 - tmp6, PASS1_BITS+3)
+ & RANGE_MASK];
+ outptr[2] = range_limit[IDESCALE(tmp2 + tmp5, PASS1_BITS+3)
+ & RANGE_MASK];
+ outptr[5] = range_limit[IDESCALE(tmp2 - tmp5, PASS1_BITS+3)
+ & RANGE_MASK];
+ outptr[4] = range_limit[IDESCALE(tmp3 + tmp4, PASS1_BITS+3)
+ & RANGE_MASK];
+ outptr[3] = range_limit[IDESCALE(tmp3 - tmp4, PASS1_BITS+3)
+ & RANGE_MASK];
+
+ wsptr += DCTSIZE; /* advance pointer to next row */
+ }
+}
+
+#endif /* DCT_IFAST_SUPPORTED */
+
+#endif //_FX_JPEG_TURBO_
diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jidctint.c b/core/src/fxcodec/libjpeg/fpdfapi_jidctint.c
index 82f5cc742a..78a8d66552 100644
--- a/core/src/fxcodec/libjpeg/fpdfapi_jidctint.c
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jidctint.c
@@ -1,392 +1,392 @@
-#if !defined(_FX_JPEG_TURBO_)
-/*
- * jidctint.c
- *
- * Copyright (C) 1991-1998, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains a slow-but-accurate integer implementation of the
- * inverse DCT (Discrete Cosine Transform). In the IJG code, this routine
- * must also perform dequantization of the input coefficients.
- *
- * A 2-D IDCT can be done by 1-D IDCT on each column followed by 1-D IDCT
- * on each row (or vice versa, but it's more convenient to emit a row at
- * a time). Direct algorithms are also available, but they are much more
- * complex and seem not to be any faster when reduced to code.
- *
- * This implementation is based on an algorithm described in
- * C. Loeffler, A. Ligtenberg and G. Moschytz, "Practical Fast 1-D DCT
- * Algorithms with 11 Multiplications", Proc. Int'l. Conf. on Acoustics,
- * Speech, and Signal Processing 1989 (ICASSP '89), pp. 988-991.
- * The primary algorithm described there uses 11 multiplies and 29 adds.
- * We use their alternate method with 12 multiplies and 32 adds.
- * The advantage of this method is that no data path contains more than one
- * multiplication; this allows a very simple and accurate implementation in
- * scaled fixed-point arithmetic, with a minimal number of shifts.
- */
-
-#define JPEG_INTERNALS
-#include "jinclude.h"
-#include "jpeglib.h"
-#include "jdct.h" /* Private declarations for DCT subsystem */
-
-#ifdef DCT_ISLOW_SUPPORTED
-
-
-/*
- * This module is specialized to the case DCTSIZE = 8.
- */
-
-#if DCTSIZE != 8
- Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */
-#endif
-
-
-/*
- * The poop on this scaling stuff is as follows:
- *
- * Each 1-D IDCT step produces outputs which are a factor of sqrt(N)
- * larger than the true IDCT outputs. The final outputs are therefore
- * a factor of N larger than desired; since N=8 this can be cured by
- * a simple right shift at the end of the algorithm. The advantage of
- * this arrangement is that we save two multiplications per 1-D IDCT,
- * because the y0 and y4 inputs need not be divided by sqrt(N).
- *
- * We have to do addition and subtraction of the integer inputs, which
- * is no problem, and multiplication by fractional constants, which is
- * a problem to do in integer arithmetic. We multiply all the constants
- * by CONST_SCALE and convert them to integer constants (thus retaining
- * CONST_BITS bits of precision in the constants). After doing a
- * multiplication we have to divide the product by CONST_SCALE, with proper
- * rounding, to produce the correct output. This division can be done
- * cheaply as a right shift of CONST_BITS bits. We postpone shifting
- * as long as possible so that partial sums can be added together with
- * full fractional precision.
- *
- * The outputs of the first pass are scaled up by PASS1_BITS bits so that
- * they are represented to better-than-integral precision. These outputs
- * require BITS_IN_JSAMPLE + PASS1_BITS + 3 bits; this fits in a 16-bit word
- * with the recommended scaling. (To scale up 12-bit sample data further, an
- * intermediate INT32 array would be needed.)
- *
- * To avoid overflow of the 32-bit intermediate results in pass 2, we must
- * have BITS_IN_JSAMPLE + CONST_BITS + PASS1_BITS <= 26. Error analysis
- * shows that the values given below are the most effective.
- */
-
-#if BITS_IN_JSAMPLE == 8
-#define CONST_BITS 13
-#define PASS1_BITS 2
-#else
-#define CONST_BITS 13
-#define PASS1_BITS 1 /* lose a little precision to avoid overflow */
-#endif
-
-/* Some C compilers fail to reduce "FIX(constant)" at compile time, thus
- * causing a lot of useless floating-point operations at run time.
- * To get around this we use the following pre-calculated constants.
- * If you change CONST_BITS you may want to add appropriate values.
- * (With a reasonable C compiler, you can just rely on the FIX() macro...)
- */
-
-#if CONST_BITS == 13
-#define FIX_0_298631336 ((INT32) 2446) /* FIX(0.298631336) */
-#define FIX_0_390180644 ((INT32) 3196) /* FIX(0.390180644) */
-#define FIX_0_541196100 ((INT32) 4433) /* FIX(0.541196100) */
-#define FIX_0_765366865 ((INT32) 6270) /* FIX(0.765366865) */
-#define FIX_0_899976223 ((INT32) 7373) /* FIX(0.899976223) */
-#define FIX_1_175875602 ((INT32) 9633) /* FIX(1.175875602) */
-#define FIX_1_501321110 ((INT32) 12299) /* FIX(1.501321110) */
-#define FIX_1_847759065 ((INT32) 15137) /* FIX(1.847759065) */
-#define FIX_1_961570560 ((INT32) 16069) /* FIX(1.961570560) */
-#define FIX_2_053119869 ((INT32) 16819) /* FIX(2.053119869) */
-#define FIX_2_562915447 ((INT32) 20995) /* FIX(2.562915447) */
-#define FIX_3_072711026 ((INT32) 25172) /* FIX(3.072711026) */
-#else
-#define FIX_0_298631336 FIX(0.298631336)
-#define FIX_0_390180644 FIX(0.390180644)
-#define FIX_0_541196100 FIX(0.541196100)
-#define FIX_0_765366865 FIX(0.765366865)
-#define FIX_0_899976223 FIX(0.899976223)
-#define FIX_1_175875602 FIX(1.175875602)
-#define FIX_1_501321110 FIX(1.501321110)
-#define FIX_1_847759065 FIX(1.847759065)
-#define FIX_1_961570560 FIX(1.961570560)
-#define FIX_2_053119869 FIX(2.053119869)
-#define FIX_2_562915447 FIX(2.562915447)
-#define FIX_3_072711026 FIX(3.072711026)
-#endif
-
-
-/* Multiply an INT32 variable by an INT32 constant to yield an INT32 result.
- * For 8-bit samples with the recommended scaling, all the variable
- * and constant values involved are no more than 16 bits wide, so a
- * 16x16->32 bit multiply can be used instead of a full 32x32 multiply.
- * For 12-bit samples, a full 32-bit multiplication will be needed.
- */
-
-#if BITS_IN_JSAMPLE == 8
-#define MULTIPLY(var,const) MULTIPLY16C16(var,const)
-#else
-#define MULTIPLY(var,const) ((var) * (const))
-#endif
-
-
-/* Dequantize a coefficient by multiplying it by the multiplier-table
- * entry; produce an int result. In this module, both inputs and result
- * are 16 bits or less, so either int or short multiply will work.
- */
-
-#define DEQUANTIZE(coef,quantval) (((ISLOW_MULT_TYPE) (coef)) * (quantval))
-
-
-/*
- * Perform dequantization and inverse DCT on one block of coefficients.
- */
-
-GLOBAL(void)
-jpeg_idct_islow (j_decompress_ptr cinfo, jpeg_component_info * compptr,
- JCOEFPTR coef_block,
- JSAMPARRAY output_buf, JDIMENSION output_col)
-{
- INT32 tmp0, tmp1, tmp2, tmp3;
- INT32 tmp10, tmp11, tmp12, tmp13;
- INT32 z1, z2, z3, z4, z5;
- JCOEFPTR inptr;
- ISLOW_MULT_TYPE * quantptr;
- int * wsptr;
- JSAMPROW outptr;
- JSAMPLE *range_limit = IDCT_range_limit(cinfo);
- int ctr;
- int workspace[DCTSIZE2]; /* buffers data between passes */
- SHIFT_TEMPS
-
- /* Pass 1: process columns from input, store into work array. */
- /* Note results are scaled up by sqrt(8) compared to a true IDCT; */
- /* furthermore, we scale the results by 2**PASS1_BITS. */
-
- inptr = coef_block;
- quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
- wsptr = workspace;
- for (ctr = DCTSIZE; ctr > 0; ctr--) {
- /* Due to quantization, we will usually find that many of the input
- * coefficients are zero, especially the AC terms. We can exploit this
- * by short-circuiting the IDCT calculation for any column in which all
- * the AC terms are zero. In that case each output is equal to the
- * DC coefficient (with scale factor as needed).
- * With typical images and quantization tables, half or more of the
- * column DCT calculations can be simplified this way.
- */
-
- if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*2] == 0 &&
- inptr[DCTSIZE*3] == 0 && inptr[DCTSIZE*4] == 0 &&
- inptr[DCTSIZE*5] == 0 && inptr[DCTSIZE*6] == 0 &&
- inptr[DCTSIZE*7] == 0) {
- /* AC terms all zero */
- int dcval = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]) << PASS1_BITS;
-
- wsptr[DCTSIZE*0] = dcval;
- wsptr[DCTSIZE*1] = dcval;
- wsptr[DCTSIZE*2] = dcval;
- wsptr[DCTSIZE*3] = dcval;
- wsptr[DCTSIZE*4] = dcval;
- wsptr[DCTSIZE*5] = dcval;
- wsptr[DCTSIZE*6] = dcval;
- wsptr[DCTSIZE*7] = dcval;
-
- inptr++; /* advance pointers to next column */
- quantptr++;
- wsptr++;
- continue;
- }
-
- /* Even part: reverse the even part of the forward DCT. */
- /* The rotator is sqrt(2)*c(-6). */
-
- z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
- z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);
-
- z1 = MULTIPLY(z2 + z3, FIX_0_541196100);
- tmp2 = z1 + MULTIPLY(z3, - FIX_1_847759065);
- tmp3 = z1 + MULTIPLY(z2, FIX_0_765366865);
-
- z2 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
- z3 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);
-
- tmp0 = (z2 + z3) << CONST_BITS;
- tmp1 = (z2 - z3) << CONST_BITS;
-
- tmp10 = tmp0 + tmp3;
- tmp13 = tmp0 - tmp3;
- tmp11 = tmp1 + tmp2;
- tmp12 = tmp1 - tmp2;
-
- /* Odd part per figure 8; the matrix is unitary and hence its
- * transpose is its inverse. i0..i3 are y7,y5,y3,y1 respectively.
- */
-
- tmp0 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);
- tmp1 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);
- tmp2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
- tmp3 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
-
- z1 = tmp0 + tmp3;
- z2 = tmp1 + tmp2;
- z3 = tmp0 + tmp2;
- z4 = tmp1 + tmp3;
- z5 = MULTIPLY(z3 + z4, FIX_1_175875602); /* sqrt(2) * c3 */
-
- tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */
- tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */
- tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */
- tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */
- z1 = MULTIPLY(z1, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */
- z2 = MULTIPLY(z2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */
- z3 = MULTIPLY(z3, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */
- z4 = MULTIPLY(z4, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */
-
- z3 += z5;
- z4 += z5;
-
- tmp0 += z1 + z3;
- tmp1 += z2 + z4;
- tmp2 += z2 + z3;
- tmp3 += z1 + z4;
-
- /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */
-
- wsptr[DCTSIZE*0] = (int) DESCALE(tmp10 + tmp3, CONST_BITS-PASS1_BITS);
- wsptr[DCTSIZE*7] = (int) DESCALE(tmp10 - tmp3, CONST_BITS-PASS1_BITS);
- wsptr[DCTSIZE*1] = (int) DESCALE(tmp11 + tmp2, CONST_BITS-PASS1_BITS);
- wsptr[DCTSIZE*6] = (int) DESCALE(tmp11 - tmp2, CONST_BITS-PASS1_BITS);
- wsptr[DCTSIZE*2] = (int) DESCALE(tmp12 + tmp1, CONST_BITS-PASS1_BITS);
- wsptr[DCTSIZE*5] = (int) DESCALE(tmp12 - tmp1, CONST_BITS-PASS1_BITS);
- wsptr[DCTSIZE*3] = (int) DESCALE(tmp13 + tmp0, CONST_BITS-PASS1_BITS);
- wsptr[DCTSIZE*4] = (int) DESCALE(tmp13 - tmp0, CONST_BITS-PASS1_BITS);
-
- inptr++; /* advance pointers to next column */
- quantptr++;
- wsptr++;
- }
-
- /* Pass 2: process rows from work array, store into output array. */
- /* Note that we must descale the results by a factor of 8 == 2**3, */
- /* and also undo the PASS1_BITS scaling. */
-
- wsptr = workspace;
- for (ctr = 0; ctr < DCTSIZE; ctr++) {
- outptr = output_buf[ctr] + output_col;
- /* Rows of zeroes can be exploited in the same way as we did with columns.
- * However, the column calculation has created many nonzero AC terms, so
- * the simplification applies less often (typically 5% to 10% of the time).
- * On machines with very fast multiplication, it's possible that the
- * test takes more time than it's worth. In that case this section
- * may be commented out.
- */
-
-#ifndef NO_ZERO_ROW_TEST
- if (wsptr[1] == 0 && wsptr[2] == 0 && wsptr[3] == 0 && wsptr[4] == 0 &&
- wsptr[5] == 0 && wsptr[6] == 0 && wsptr[7] == 0) {
- /* AC terms all zero */
- JSAMPLE dcval = range_limit[(int) DESCALE((INT32) wsptr[0], PASS1_BITS+3)
- & RANGE_MASK];
-
- outptr[0] = dcval;
- outptr[1] = dcval;
- outptr[2] = dcval;
- outptr[3] = dcval;
- outptr[4] = dcval;
- outptr[5] = dcval;
- outptr[6] = dcval;
- outptr[7] = dcval;
-
- wsptr += DCTSIZE; /* advance pointer to next row */
- continue;
- }
-#endif
-
- /* Even part: reverse the even part of the forward DCT. */
- /* The rotator is sqrt(2)*c(-6). */
-
- z2 = (INT32) wsptr[2];
- z3 = (INT32) wsptr[6];
-
- z1 = MULTIPLY(z2 + z3, FIX_0_541196100);
- tmp2 = z1 + MULTIPLY(z3, - FIX_1_847759065);
- tmp3 = z1 + MULTIPLY(z2, FIX_0_765366865);
-
- tmp0 = ((INT32) wsptr[0] + (INT32) wsptr[4]) << CONST_BITS;
- tmp1 = ((INT32) wsptr[0] - (INT32) wsptr[4]) << CONST_BITS;
-
- tmp10 = tmp0 + tmp3;
- tmp13 = tmp0 - tmp3;
- tmp11 = tmp1 + tmp2;
- tmp12 = tmp1 - tmp2;
-
- /* Odd part per figure 8; the matrix is unitary and hence its
- * transpose is its inverse. i0..i3 are y7,y5,y3,y1 respectively.
- */
-
- tmp0 = (INT32) wsptr[7];
- tmp1 = (INT32) wsptr[5];
- tmp2 = (INT32) wsptr[3];
- tmp3 = (INT32) wsptr[1];
-
- z1 = tmp0 + tmp3;
- z2 = tmp1 + tmp2;
- z3 = tmp0 + tmp2;
- z4 = tmp1 + tmp3;
- z5 = MULTIPLY(z3 + z4, FIX_1_175875602); /* sqrt(2) * c3 */
-
- tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */
- tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */
- tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */
- tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */
- z1 = MULTIPLY(z1, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */
- z2 = MULTIPLY(z2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */
- z3 = MULTIPLY(z3, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */
- z4 = MULTIPLY(z4, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */
-
- z3 += z5;
- z4 += z5;
-
- tmp0 += z1 + z3;
- tmp1 += z2 + z4;
- tmp2 += z2 + z3;
- tmp3 += z1 + z4;
-
- /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */
-
- outptr[0] = range_limit[(int) DESCALE(tmp10 + tmp3,
- CONST_BITS+PASS1_BITS+3)
- & RANGE_MASK];
- outptr[7] = range_limit[(int) DESCALE(tmp10 - tmp3,
- CONST_BITS+PASS1_BITS+3)
- & RANGE_MASK];
- outptr[1] = range_limit[(int) DESCALE(tmp11 + tmp2,
- CONST_BITS+PASS1_BITS+3)
- & RANGE_MASK];
- outptr[6] = range_limit[(int) DESCALE(tmp11 - tmp2,
- CONST_BITS+PASS1_BITS+3)
- & RANGE_MASK];
- outptr[2] = range_limit[(int) DESCALE(tmp12 + tmp1,
- CONST_BITS+PASS1_BITS+3)
- & RANGE_MASK];
- outptr[5] = range_limit[(int) DESCALE(tmp12 - tmp1,
- CONST_BITS+PASS1_BITS+3)
- & RANGE_MASK];
- outptr[3] = range_limit[(int) DESCALE(tmp13 + tmp0,
- CONST_BITS+PASS1_BITS+3)
- & RANGE_MASK];
- outptr[4] = range_limit[(int) DESCALE(tmp13 - tmp0,
- CONST_BITS+PASS1_BITS+3)
- & RANGE_MASK];
-
- wsptr += DCTSIZE; /* advance pointer to next row */
- }
-}
-
-#endif /* DCT_ISLOW_SUPPORTED */
-
-#endif //_FX_JPEG_TURBO_
+#if !defined(_FX_JPEG_TURBO_)
+/*
+ * jidctint.c
+ *
+ * Copyright (C) 1991-1998, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains a slow-but-accurate integer implementation of the
+ * inverse DCT (Discrete Cosine Transform). In the IJG code, this routine
+ * must also perform dequantization of the input coefficients.
+ *
+ * A 2-D IDCT can be done by 1-D IDCT on each column followed by 1-D IDCT
+ * on each row (or vice versa, but it's more convenient to emit a row at
+ * a time). Direct algorithms are also available, but they are much more
+ * complex and seem not to be any faster when reduced to code.
+ *
+ * This implementation is based on an algorithm described in
+ * C. Loeffler, A. Ligtenberg and G. Moschytz, "Practical Fast 1-D DCT
+ * Algorithms with 11 Multiplications", Proc. Int'l. Conf. on Acoustics,
+ * Speech, and Signal Processing 1989 (ICASSP '89), pp. 988-991.
+ * The primary algorithm described there uses 11 multiplies and 29 adds.
+ * We use their alternate method with 12 multiplies and 32 adds.
+ * The advantage of this method is that no data path contains more than one
+ * multiplication; this allows a very simple and accurate implementation in
+ * scaled fixed-point arithmetic, with a minimal number of shifts.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+#include "jdct.h" /* Private declarations for DCT subsystem */
+
+#ifdef DCT_ISLOW_SUPPORTED
+
+
+/*
+ * This module is specialized to the case DCTSIZE = 8.
+ */
+
+#if DCTSIZE != 8
+ Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */
+#endif
+
+
+/*
+ * The poop on this scaling stuff is as follows:
+ *
+ * Each 1-D IDCT step produces outputs which are a factor of sqrt(N)
+ * larger than the true IDCT outputs. The final outputs are therefore
+ * a factor of N larger than desired; since N=8 this can be cured by
+ * a simple right shift at the end of the algorithm. The advantage of
+ * this arrangement is that we save two multiplications per 1-D IDCT,
+ * because the y0 and y4 inputs need not be divided by sqrt(N).
+ *
+ * We have to do addition and subtraction of the integer inputs, which
+ * is no problem, and multiplication by fractional constants, which is
+ * a problem to do in integer arithmetic. We multiply all the constants
+ * by CONST_SCALE and convert them to integer constants (thus retaining
+ * CONST_BITS bits of precision in the constants). After doing a
+ * multiplication we have to divide the product by CONST_SCALE, with proper
+ * rounding, to produce the correct output. This division can be done
+ * cheaply as a right shift of CONST_BITS bits. We postpone shifting
+ * as long as possible so that partial sums can be added together with
+ * full fractional precision.
+ *
+ * The outputs of the first pass are scaled up by PASS1_BITS bits so that
+ * they are represented to better-than-integral precision. These outputs
+ * require BITS_IN_JSAMPLE + PASS1_BITS + 3 bits; this fits in a 16-bit word
+ * with the recommended scaling. (To scale up 12-bit sample data further, an
+ * intermediate INT32 array would be needed.)
+ *
+ * To avoid overflow of the 32-bit intermediate results in pass 2, we must
+ * have BITS_IN_JSAMPLE + CONST_BITS + PASS1_BITS <= 26. Error analysis
+ * shows that the values given below are the most effective.
+ */
+
+#if BITS_IN_JSAMPLE == 8
+#define CONST_BITS 13
+#define PASS1_BITS 2
+#else
+#define CONST_BITS 13
+#define PASS1_BITS 1 /* lose a little precision to avoid overflow */
+#endif
+
+/* Some C compilers fail to reduce "FIX(constant)" at compile time, thus
+ * causing a lot of useless floating-point operations at run time.
+ * To get around this we use the following pre-calculated constants.
+ * If you change CONST_BITS you may want to add appropriate values.
+ * (With a reasonable C compiler, you can just rely on the FIX() macro...)
+ */
+
+#if CONST_BITS == 13
+#define FIX_0_298631336 ((INT32) 2446) /* FIX(0.298631336) */
+#define FIX_0_390180644 ((INT32) 3196) /* FIX(0.390180644) */
+#define FIX_0_541196100 ((INT32) 4433) /* FIX(0.541196100) */
+#define FIX_0_765366865 ((INT32) 6270) /* FIX(0.765366865) */
+#define FIX_0_899976223 ((INT32) 7373) /* FIX(0.899976223) */
+#define FIX_1_175875602 ((INT32) 9633) /* FIX(1.175875602) */
+#define FIX_1_501321110 ((INT32) 12299) /* FIX(1.501321110) */
+#define FIX_1_847759065 ((INT32) 15137) /* FIX(1.847759065) */
+#define FIX_1_961570560 ((INT32) 16069) /* FIX(1.961570560) */
+#define FIX_2_053119869 ((INT32) 16819) /* FIX(2.053119869) */
+#define FIX_2_562915447 ((INT32) 20995) /* FIX(2.562915447) */
+#define FIX_3_072711026 ((INT32) 25172) /* FIX(3.072711026) */
+#else
+#define FIX_0_298631336 FIX(0.298631336)
+#define FIX_0_390180644 FIX(0.390180644)
+#define FIX_0_541196100 FIX(0.541196100)
+#define FIX_0_765366865 FIX(0.765366865)
+#define FIX_0_899976223 FIX(0.899976223)
+#define FIX_1_175875602 FIX(1.175875602)
+#define FIX_1_501321110 FIX(1.501321110)
+#define FIX_1_847759065 FIX(1.847759065)
+#define FIX_1_961570560 FIX(1.961570560)
+#define FIX_2_053119869 FIX(2.053119869)
+#define FIX_2_562915447 FIX(2.562915447)
+#define FIX_3_072711026 FIX(3.072711026)
+#endif
+
+
+/* Multiply an INT32 variable by an INT32 constant to yield an INT32 result.
+ * For 8-bit samples with the recommended scaling, all the variable
+ * and constant values involved are no more than 16 bits wide, so a
+ * 16x16->32 bit multiply can be used instead of a full 32x32 multiply.
+ * For 12-bit samples, a full 32-bit multiplication will be needed.
+ */
+
+#if BITS_IN_JSAMPLE == 8
+#define MULTIPLY(var,const) MULTIPLY16C16(var,const)
+#else
+#define MULTIPLY(var,const) ((var) * (const))
+#endif
+
+
+/* Dequantize a coefficient by multiplying it by the multiplier-table
+ * entry; produce an int result. In this module, both inputs and result
+ * are 16 bits or less, so either int or short multiply will work.
+ */
+
+#define DEQUANTIZE(coef,quantval) (((ISLOW_MULT_TYPE) (coef)) * (quantval))
+
+
+/*
+ * Perform dequantization and inverse DCT on one block of coefficients.
+ */
+
+GLOBAL(void)
+jpeg_idct_islow (j_decompress_ptr cinfo, jpeg_component_info * compptr,
+ JCOEFPTR coef_block,
+ JSAMPARRAY output_buf, JDIMENSION output_col)
+{
+ INT32 tmp0, tmp1, tmp2, tmp3;
+ INT32 tmp10, tmp11, tmp12, tmp13;
+ INT32 z1, z2, z3, z4, z5;
+ JCOEFPTR inptr;
+ ISLOW_MULT_TYPE * quantptr;
+ int * wsptr;
+ JSAMPROW outptr;
+ JSAMPLE *range_limit = IDCT_range_limit(cinfo);
+ int ctr;
+ int workspace[DCTSIZE2]; /* buffers data between passes */
+ SHIFT_TEMPS
+
+ /* Pass 1: process columns from input, store into work array. */
+ /* Note results are scaled up by sqrt(8) compared to a true IDCT; */
+ /* furthermore, we scale the results by 2**PASS1_BITS. */
+
+ inptr = coef_block;
+ quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
+ wsptr = workspace;
+ for (ctr = DCTSIZE; ctr > 0; ctr--) {
+ /* Due to quantization, we will usually find that many of the input
+ * coefficients are zero, especially the AC terms. We can exploit this
+ * by short-circuiting the IDCT calculation for any column in which all
+ * the AC terms are zero. In that case each output is equal to the
+ * DC coefficient (with scale factor as needed).
+ * With typical images and quantization tables, half or more of the
+ * column DCT calculations can be simplified this way.
+ */
+
+ if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*2] == 0 &&
+ inptr[DCTSIZE*3] == 0 && inptr[DCTSIZE*4] == 0 &&
+ inptr[DCTSIZE*5] == 0 && inptr[DCTSIZE*6] == 0 &&
+ inptr[DCTSIZE*7] == 0) {
+ /* AC terms all zero */
+ int dcval = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]) << PASS1_BITS;
+
+ wsptr[DCTSIZE*0] = dcval;
+ wsptr[DCTSIZE*1] = dcval;
+ wsptr[DCTSIZE*2] = dcval;
+ wsptr[DCTSIZE*3] = dcval;
+ wsptr[DCTSIZE*4] = dcval;
+ wsptr[DCTSIZE*5] = dcval;
+ wsptr[DCTSIZE*6] = dcval;
+ wsptr[DCTSIZE*7] = dcval;
+
+ inptr++; /* advance pointers to next column */
+ quantptr++;
+ wsptr++;
+ continue;
+ }
+
+ /* Even part: reverse the even part of the forward DCT. */
+ /* The rotator is sqrt(2)*c(-6). */
+
+ z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
+ z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);
+
+ z1 = MULTIPLY(z2 + z3, FIX_0_541196100);
+ tmp2 = z1 + MULTIPLY(z3, - FIX_1_847759065);
+ tmp3 = z1 + MULTIPLY(z2, FIX_0_765366865);
+
+ z2 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
+ z3 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);
+
+ tmp0 = (z2 + z3) << CONST_BITS;
+ tmp1 = (z2 - z3) << CONST_BITS;
+
+ tmp10 = tmp0 + tmp3;
+ tmp13 = tmp0 - tmp3;
+ tmp11 = tmp1 + tmp2;
+ tmp12 = tmp1 - tmp2;
+
+ /* Odd part per figure 8; the matrix is unitary and hence its
+ * transpose is its inverse. i0..i3 are y7,y5,y3,y1 respectively.
+ */
+
+ tmp0 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);
+ tmp1 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);
+ tmp2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
+ tmp3 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
+
+ z1 = tmp0 + tmp3;
+ z2 = tmp1 + tmp2;
+ z3 = tmp0 + tmp2;
+ z4 = tmp1 + tmp3;
+ z5 = MULTIPLY(z3 + z4, FIX_1_175875602); /* sqrt(2) * c3 */
+
+ tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */
+ tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */
+ tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */
+ tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */
+ z1 = MULTIPLY(z1, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */
+ z2 = MULTIPLY(z2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */
+ z3 = MULTIPLY(z3, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */
+ z4 = MULTIPLY(z4, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */
+
+ z3 += z5;
+ z4 += z5;
+
+ tmp0 += z1 + z3;
+ tmp1 += z2 + z4;
+ tmp2 += z2 + z3;
+ tmp3 += z1 + z4;
+
+ /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */
+
+ wsptr[DCTSIZE*0] = (int) DESCALE(tmp10 + tmp3, CONST_BITS-PASS1_BITS);
+ wsptr[DCTSIZE*7] = (int) DESCALE(tmp10 - tmp3, CONST_BITS-PASS1_BITS);
+ wsptr[DCTSIZE*1] = (int) DESCALE(tmp11 + tmp2, CONST_BITS-PASS1_BITS);
+ wsptr[DCTSIZE*6] = (int) DESCALE(tmp11 - tmp2, CONST_BITS-PASS1_BITS);
+ wsptr[DCTSIZE*2] = (int) DESCALE(tmp12 + tmp1, CONST_BITS-PASS1_BITS);
+ wsptr[DCTSIZE*5] = (int) DESCALE(tmp12 - tmp1, CONST_BITS-PASS1_BITS);
+ wsptr[DCTSIZE*3] = (int) DESCALE(tmp13 + tmp0, CONST_BITS-PASS1_BITS);
+ wsptr[DCTSIZE*4] = (int) DESCALE(tmp13 - tmp0, CONST_BITS-PASS1_BITS);
+
+ inptr++; /* advance pointers to next column */
+ quantptr++;
+ wsptr++;
+ }
+
+ /* Pass 2: process rows from work array, store into output array. */
+ /* Note that we must descale the results by a factor of 8 == 2**3, */
+ /* and also undo the PASS1_BITS scaling. */
+
+ wsptr = workspace;
+ for (ctr = 0; ctr < DCTSIZE; ctr++) {
+ outptr = output_buf[ctr] + output_col;
+ /* Rows of zeroes can be exploited in the same way as we did with columns.
+ * However, the column calculation has created many nonzero AC terms, so
+ * the simplification applies less often (typically 5% to 10% of the time).
+ * On machines with very fast multiplication, it's possible that the
+ * test takes more time than it's worth. In that case this section
+ * may be commented out.
+ */
+
+#ifndef NO_ZERO_ROW_TEST
+ if (wsptr[1] == 0 && wsptr[2] == 0 && wsptr[3] == 0 && wsptr[4] == 0 &&
+ wsptr[5] == 0 && wsptr[6] == 0 && wsptr[7] == 0) {
+ /* AC terms all zero */
+ JSAMPLE dcval = range_limit[(int) DESCALE((INT32) wsptr[0], PASS1_BITS+3)
+ & RANGE_MASK];
+
+ outptr[0] = dcval;
+ outptr[1] = dcval;
+ outptr[2] = dcval;
+ outptr[3] = dcval;
+ outptr[4] = dcval;
+ outptr[5] = dcval;
+ outptr[6] = dcval;
+ outptr[7] = dcval;
+
+ wsptr += DCTSIZE; /* advance pointer to next row */
+ continue;
+ }
+#endif
+
+ /* Even part: reverse the even part of the forward DCT. */
+ /* The rotator is sqrt(2)*c(-6). */
+
+ z2 = (INT32) wsptr[2];
+ z3 = (INT32) wsptr[6];
+
+ z1 = MULTIPLY(z2 + z3, FIX_0_541196100);
+ tmp2 = z1 + MULTIPLY(z3, - FIX_1_847759065);
+ tmp3 = z1 + MULTIPLY(z2, FIX_0_765366865);
+
+ tmp0 = ((INT32) wsptr[0] + (INT32) wsptr[4]) << CONST_BITS;
+ tmp1 = ((INT32) wsptr[0] - (INT32) wsptr[4]) << CONST_BITS;
+
+ tmp10 = tmp0 + tmp3;
+ tmp13 = tmp0 - tmp3;
+ tmp11 = tmp1 + tmp2;
+ tmp12 = tmp1 - tmp2;
+
+ /* Odd part per figure 8; the matrix is unitary and hence its
+ * transpose is its inverse. i0..i3 are y7,y5,y3,y1 respectively.
+ */
+
+ tmp0 = (INT32) wsptr[7];
+ tmp1 = (INT32) wsptr[5];
+ tmp2 = (INT32) wsptr[3];
+ tmp3 = (INT32) wsptr[1];
+
+ z1 = tmp0 + tmp3;
+ z2 = tmp1 + tmp2;
+ z3 = tmp0 + tmp2;
+ z4 = tmp1 + tmp3;
+ z5 = MULTIPLY(z3 + z4, FIX_1_175875602); /* sqrt(2) * c3 */
+
+ tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */
+ tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */
+ tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */
+ tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */
+ z1 = MULTIPLY(z1, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */
+ z2 = MULTIPLY(z2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */
+ z3 = MULTIPLY(z3, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */
+ z4 = MULTIPLY(z4, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */
+
+ z3 += z5;
+ z4 += z5;
+
+ tmp0 += z1 + z3;
+ tmp1 += z2 + z4;
+ tmp2 += z2 + z3;
+ tmp3 += z1 + z4;
+
+ /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */
+
+ outptr[0] = range_limit[(int) DESCALE(tmp10 + tmp3,
+ CONST_BITS+PASS1_BITS+3)
+ & RANGE_MASK];
+ outptr[7] = range_limit[(int) DESCALE(tmp10 - tmp3,
+ CONST_BITS+PASS1_BITS+3)
+ & RANGE_MASK];
+ outptr[1] = range_limit[(int) DESCALE(tmp11 + tmp2,
+ CONST_BITS+PASS1_BITS+3)
+ & RANGE_MASK];
+ outptr[6] = range_limit[(int) DESCALE(tmp11 - tmp2,
+ CONST_BITS+PASS1_BITS+3)
+ & RANGE_MASK];
+ outptr[2] = range_limit[(int) DESCALE(tmp12 + tmp1,
+ CONST_BITS+PASS1_BITS+3)
+ & RANGE_MASK];
+ outptr[5] = range_limit[(int) DESCALE(tmp12 - tmp1,
+ CONST_BITS+PASS1_BITS+3)
+ & RANGE_MASK];
+ outptr[3] = range_limit[(int) DESCALE(tmp13 + tmp0,
+ CONST_BITS+PASS1_BITS+3)
+ & RANGE_MASK];
+ outptr[4] = range_limit[(int) DESCALE(tmp13 - tmp0,
+ CONST_BITS+PASS1_BITS+3)
+ & RANGE_MASK];
+
+ wsptr += DCTSIZE; /* advance pointer to next row */
+ }
+}
+
+#endif /* DCT_ISLOW_SUPPORTED */
+
+#endif //_FX_JPEG_TURBO_
diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jidctred.c b/core/src/fxcodec/libjpeg/fpdfapi_jidctred.c
index 7eb1d74afa..8b4b807192 100644
--- a/core/src/fxcodec/libjpeg/fpdfapi_jidctred.c
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jidctred.c
@@ -1,401 +1,401 @@
-#if !defined(_FX_JPEG_TURBO_)
-/*
- * jidctred.c
- *
- * Copyright (C) 1994-1998, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains inverse-DCT routines that produce reduced-size output:
- * either 4x4, 2x2, or 1x1 pixels from an 8x8 DCT block.
- *
- * The implementation is based on the Loeffler, Ligtenberg and Moschytz (LL&M)
- * algorithm used in jidctint.c. We simply replace each 8-to-8 1-D IDCT step
- * with an 8-to-4 step that produces the four averages of two adjacent outputs
- * (or an 8-to-2 step producing two averages of four outputs, for 2x2 output).
- * These steps were derived by computing the corresponding values at the end
- * of the normal LL&M code, then simplifying as much as possible.
- *
- * 1x1 is trivial: just take the DC coefficient divided by 8.
- *
- * See jidctint.c for additional comments.
- */
-
-#define JPEG_INTERNALS
-#include "jinclude.h"
-#include "jpeglib.h"
-#include "jdct.h" /* Private declarations for DCT subsystem */
-
-#ifdef IDCT_SCALING_SUPPORTED
-
-
-/*
- * This module is specialized to the case DCTSIZE = 8.
- */
-
-#if DCTSIZE != 8
- Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */
-#endif
-
-
-/* Scaling is the same as in jidctint.c. */
-
-#if BITS_IN_JSAMPLE == 8
-#define CONST_BITS 13
-#define PASS1_BITS 2
-#else
-#define CONST_BITS 13
-#define PASS1_BITS 1 /* lose a little precision to avoid overflow */
-#endif
-
-/* Some C compilers fail to reduce "FIX(constant)" at compile time, thus
- * causing a lot of useless floating-point operations at run time.
- * To get around this we use the following pre-calculated constants.
- * If you change CONST_BITS you may want to add appropriate values.
- * (With a reasonable C compiler, you can just rely on the FIX() macro...)
- */
-
-#if CONST_BITS == 13
-#define FIX_0_211164243 ((INT32) 1730) /* FIX(0.211164243) */
-#define FIX_0_509795579 ((INT32) 4176) /* FIX(0.509795579) */
-#define FIX_0_601344887 ((INT32) 4926) /* FIX(0.601344887) */
-#define FIX_0_720959822 ((INT32) 5906) /* FIX(0.720959822) */
-#define FIX_0_765366865 ((INT32) 6270) /* FIX(0.765366865) */
-#define FIX_0_850430095 ((INT32) 6967) /* FIX(0.850430095) */
-#define FIX_0_899976223 ((INT32) 7373) /* FIX(0.899976223) */
-#define FIX_1_061594337 ((INT32) 8697) /* FIX(1.061594337) */
-#define FIX_1_272758580 ((INT32) 10426) /* FIX(1.272758580) */
-#define FIX_1_451774981 ((INT32) 11893) /* FIX(1.451774981) */
-#define FIX_1_847759065 ((INT32) 15137) /* FIX(1.847759065) */
-#define FIX_2_172734803 ((INT32) 17799) /* FIX(2.172734803) */
-#define FIX_2_562915447 ((INT32) 20995) /* FIX(2.562915447) */
-#define FIX_3_624509785 ((INT32) 29692) /* FIX(3.624509785) */
-#else
-#define FIX_0_211164243 FIX(0.211164243)
-#define FIX_0_509795579 FIX(0.509795579)
-#define FIX_0_601344887 FIX(0.601344887)
-#define FIX_0_720959822 FIX(0.720959822)
-#define FIX_0_765366865 FIX(0.765366865)
-#define FIX_0_850430095 FIX(0.850430095)
-#define FIX_0_899976223 FIX(0.899976223)
-#define FIX_1_061594337 FIX(1.061594337)
-#define FIX_1_272758580 FIX(1.272758580)
-#define FIX_1_451774981 FIX(1.451774981)
-#define FIX_1_847759065 FIX(1.847759065)
-#define FIX_2_172734803 FIX(2.172734803)
-#define FIX_2_562915447 FIX(2.562915447)
-#define FIX_3_624509785 FIX(3.624509785)
-#endif
-
-
-/* Multiply an INT32 variable by an INT32 constant to yield an INT32 result.
- * For 8-bit samples with the recommended scaling, all the variable
- * and constant values involved are no more than 16 bits wide, so a
- * 16x16->32 bit multiply can be used instead of a full 32x32 multiply.
- * For 12-bit samples, a full 32-bit multiplication will be needed.
- */
-
-#if BITS_IN_JSAMPLE == 8
-#define MULTIPLY(var,const) MULTIPLY16C16(var,const)
-#else
-#define MULTIPLY(var,const) ((var) * (const))
-#endif
-
-
-/* Dequantize a coefficient by multiplying it by the multiplier-table
- * entry; produce an int result. In this module, both inputs and result
- * are 16 bits or less, so either int or short multiply will work.
- */
-
-#define DEQUANTIZE(coef,quantval) (((ISLOW_MULT_TYPE) (coef)) * (quantval))
-
-
-/*
- * Perform dequantization and inverse DCT on one block of coefficients,
- * producing a reduced-size 4x4 output block.
- */
-
-GLOBAL(void)
-jpeg_idct_4x4 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
- JCOEFPTR coef_block,
- JSAMPARRAY output_buf, JDIMENSION output_col)
-{
- INT32 tmp0, tmp2, tmp10, tmp12;
- INT32 z1, z2, z3, z4;
- JCOEFPTR inptr;
- ISLOW_MULT_TYPE * quantptr;
- int * wsptr;
- JSAMPROW outptr;
- JSAMPLE *range_limit = IDCT_range_limit(cinfo);
- int ctr;
- int workspace[DCTSIZE*4]; /* buffers data between passes */
- SHIFT_TEMPS
-
- /* Pass 1: process columns from input, store into work array. */
-
- inptr = coef_block;
- quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
- wsptr = workspace;
- for (ctr = DCTSIZE; ctr > 0; inptr++, quantptr++, wsptr++, ctr--) {
- /* Don't bother to process column 4, because second pass won't use it */
- if (ctr == DCTSIZE-4)
- continue;
- if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*2] == 0 &&
- inptr[DCTSIZE*3] == 0 && inptr[DCTSIZE*5] == 0 &&
- inptr[DCTSIZE*6] == 0 && inptr[DCTSIZE*7] == 0) {
- /* AC terms all zero; we need not examine term 4 for 4x4 output */
- int dcval = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]) << PASS1_BITS;
-
- wsptr[DCTSIZE*0] = dcval;
- wsptr[DCTSIZE*1] = dcval;
- wsptr[DCTSIZE*2] = dcval;
- wsptr[DCTSIZE*3] = dcval;
-
- continue;
- }
-
- /* Even part */
-
- tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
- tmp0 <<= (CONST_BITS+1);
-
- z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
- z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);
-
- tmp2 = MULTIPLY(z2, FIX_1_847759065) + MULTIPLY(z3, - FIX_0_765366865);
-
- tmp10 = tmp0 + tmp2;
- tmp12 = tmp0 - tmp2;
-
- /* Odd part */
-
- z1 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);
- z2 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);
- z3 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
- z4 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
-
- tmp0 = MULTIPLY(z1, - FIX_0_211164243) /* sqrt(2) * (c3-c1) */
- + MULTIPLY(z2, FIX_1_451774981) /* sqrt(2) * (c3+c7) */
- + MULTIPLY(z3, - FIX_2_172734803) /* sqrt(2) * (-c1-c5) */
- + MULTIPLY(z4, FIX_1_061594337); /* sqrt(2) * (c5+c7) */
-
- tmp2 = MULTIPLY(z1, - FIX_0_509795579) /* sqrt(2) * (c7-c5) */
- + MULTIPLY(z2, - FIX_0_601344887) /* sqrt(2) * (c5-c1) */
- + MULTIPLY(z3, FIX_0_899976223) /* sqrt(2) * (c3-c7) */
- + MULTIPLY(z4, FIX_2_562915447); /* sqrt(2) * (c1+c3) */
-
- /* Final output stage */
-
- wsptr[DCTSIZE*0] = (int) DESCALE(tmp10 + tmp2, CONST_BITS-PASS1_BITS+1);
- wsptr[DCTSIZE*3] = (int) DESCALE(tmp10 - tmp2, CONST_BITS-PASS1_BITS+1);
- wsptr[DCTSIZE*1] = (int) DESCALE(tmp12 + tmp0, CONST_BITS-PASS1_BITS+1);
- wsptr[DCTSIZE*2] = (int) DESCALE(tmp12 - tmp0, CONST_BITS-PASS1_BITS+1);
- }
-
- /* Pass 2: process 4 rows from work array, store into output array. */
-
- wsptr = workspace;
- for (ctr = 0; ctr < 4; ctr++) {
- outptr = output_buf[ctr] + output_col;
- /* It's not clear whether a zero row test is worthwhile here ... */
-
-#ifndef NO_ZERO_ROW_TEST
- if (wsptr[1] == 0 && wsptr[2] == 0 && wsptr[3] == 0 &&
- wsptr[5] == 0 && wsptr[6] == 0 && wsptr[7] == 0) {
- /* AC terms all zero */
- JSAMPLE dcval = range_limit[(int) DESCALE((INT32) wsptr[0], PASS1_BITS+3)
- & RANGE_MASK];
-
- outptr[0] = dcval;
- outptr[1] = dcval;
- outptr[2] = dcval;
- outptr[3] = dcval;
-
- wsptr += DCTSIZE; /* advance pointer to next row */
- continue;
- }
-#endif
-
- /* Even part */
-
- tmp0 = ((INT32) wsptr[0]) << (CONST_BITS+1);
-
- tmp2 = MULTIPLY((INT32) wsptr[2], FIX_1_847759065)
- + MULTIPLY((INT32) wsptr[6], - FIX_0_765366865);
-
- tmp10 = tmp0 + tmp2;
- tmp12 = tmp0 - tmp2;
-
- /* Odd part */
-
- z1 = (INT32) wsptr[7];
- z2 = (INT32) wsptr[5];
- z3 = (INT32) wsptr[3];
- z4 = (INT32) wsptr[1];
-
- tmp0 = MULTIPLY(z1, - FIX_0_211164243) /* sqrt(2) * (c3-c1) */
- + MULTIPLY(z2, FIX_1_451774981) /* sqrt(2) * (c3+c7) */
- + MULTIPLY(z3, - FIX_2_172734803) /* sqrt(2) * (-c1-c5) */
- + MULTIPLY(z4, FIX_1_061594337); /* sqrt(2) * (c5+c7) */
-
- tmp2 = MULTIPLY(z1, - FIX_0_509795579) /* sqrt(2) * (c7-c5) */
- + MULTIPLY(z2, - FIX_0_601344887) /* sqrt(2) * (c5-c1) */
- + MULTIPLY(z3, FIX_0_899976223) /* sqrt(2) * (c3-c7) */
- + MULTIPLY(z4, FIX_2_562915447); /* sqrt(2) * (c1+c3) */
-
- /* Final output stage */
-
- outptr[0] = range_limit[(int) DESCALE(tmp10 + tmp2,
- CONST_BITS+PASS1_BITS+3+1)
- & RANGE_MASK];
- outptr[3] = range_limit[(int) DESCALE(tmp10 - tmp2,
- CONST_BITS+PASS1_BITS+3+1)
- & RANGE_MASK];
- outptr[1] = range_limit[(int) DESCALE(tmp12 + tmp0,
- CONST_BITS+PASS1_BITS+3+1)
- & RANGE_MASK];
- outptr[2] = range_limit[(int) DESCALE(tmp12 - tmp0,
- CONST_BITS+PASS1_BITS+3+1)
- & RANGE_MASK];
-
- wsptr += DCTSIZE; /* advance pointer to next row */
- }
-}
-
-
-/*
- * Perform dequantization and inverse DCT on one block of coefficients,
- * producing a reduced-size 2x2 output block.
- */
-
-GLOBAL(void)
-jpeg_idct_2x2 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
- JCOEFPTR coef_block,
- JSAMPARRAY output_buf, JDIMENSION output_col)
-{
- INT32 tmp0, tmp10, z1;
- JCOEFPTR inptr;
- ISLOW_MULT_TYPE * quantptr;
- int * wsptr;
- JSAMPROW outptr;
- JSAMPLE *range_limit = IDCT_range_limit(cinfo);
- int ctr;
- int workspace[DCTSIZE*2]; /* buffers data between passes */
- SHIFT_TEMPS
-
- /* Pass 1: process columns from input, store into work array. */
-
- inptr = coef_block;
- quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
- wsptr = workspace;
- for (ctr = DCTSIZE; ctr > 0; inptr++, quantptr++, wsptr++, ctr--) {
- /* Don't bother to process columns 2,4,6 */
- if (ctr == DCTSIZE-2 || ctr == DCTSIZE-4 || ctr == DCTSIZE-6)
- continue;
- if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*3] == 0 &&
- inptr[DCTSIZE*5] == 0 && inptr[DCTSIZE*7] == 0) {
- /* AC terms all zero; we need not examine terms 2,4,6 for 2x2 output */
- int dcval = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]) << PASS1_BITS;
-
- wsptr[DCTSIZE*0] = dcval;
- wsptr[DCTSIZE*1] = dcval;
-
- continue;
- }
-
- /* Even part */
-
- z1 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
- tmp10 = z1 << (CONST_BITS+2);
-
- /* Odd part */
-
- z1 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);
- tmp0 = MULTIPLY(z1, - FIX_0_720959822); /* sqrt(2) * (c7-c5+c3-c1) */
- z1 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);
- tmp0 += MULTIPLY(z1, FIX_0_850430095); /* sqrt(2) * (-c1+c3+c5+c7) */
- z1 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
- tmp0 += MULTIPLY(z1, - FIX_1_272758580); /* sqrt(2) * (-c1+c3-c5-c7) */
- z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
- tmp0 += MULTIPLY(z1, FIX_3_624509785); /* sqrt(2) * (c1+c3+c5+c7) */
-
- /* Final output stage */
-
- wsptr[DCTSIZE*0] = (int) DESCALE(tmp10 + tmp0, CONST_BITS-PASS1_BITS+2);
- wsptr[DCTSIZE*1] = (int) DESCALE(tmp10 - tmp0, CONST_BITS-PASS1_BITS+2);
- }
-
- /* Pass 2: process 2 rows from work array, store into output array. */
-
- wsptr = workspace;
- for (ctr = 0; ctr < 2; ctr++) {
- outptr = output_buf[ctr] + output_col;
- /* It's not clear whether a zero row test is worthwhile here ... */
-
-#ifndef NO_ZERO_ROW_TEST
- if (wsptr[1] == 0 && wsptr[3] == 0 && wsptr[5] == 0 && wsptr[7] == 0) {
- /* AC terms all zero */
- JSAMPLE dcval = range_limit[(int) DESCALE((INT32) wsptr[0], PASS1_BITS+3)
- & RANGE_MASK];
-
- outptr[0] = dcval;
- outptr[1] = dcval;
-
- wsptr += DCTSIZE; /* advance pointer to next row */
- continue;
- }
-#endif
-
- /* Even part */
-
- tmp10 = ((INT32) wsptr[0]) << (CONST_BITS+2);
-
- /* Odd part */
-
- tmp0 = MULTIPLY((INT32) wsptr[7], - FIX_0_720959822) /* sqrt(2) * (c7-c5+c3-c1) */
- + MULTIPLY((INT32) wsptr[5], FIX_0_850430095) /* sqrt(2) * (-c1+c3+c5+c7) */
- + MULTIPLY((INT32) wsptr[3], - FIX_1_272758580) /* sqrt(2) * (-c1+c3-c5-c7) */
- + MULTIPLY((INT32) wsptr[1], FIX_3_624509785); /* sqrt(2) * (c1+c3+c5+c7) */
-
- /* Final output stage */
-
- outptr[0] = range_limit[(int) DESCALE(tmp10 + tmp0,
- CONST_BITS+PASS1_BITS+3+2)
- & RANGE_MASK];
- outptr[1] = range_limit[(int) DESCALE(tmp10 - tmp0,
- CONST_BITS+PASS1_BITS+3+2)
- & RANGE_MASK];
-
- wsptr += DCTSIZE; /* advance pointer to next row */
- }
-}
-
-
-/*
- * Perform dequantization and inverse DCT on one block of coefficients,
- * producing a reduced-size 1x1 output block.
- */
-
-GLOBAL(void)
-jpeg_idct_1x1 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
- JCOEFPTR coef_block,
- JSAMPARRAY output_buf, JDIMENSION output_col)
-{
- int dcval;
- ISLOW_MULT_TYPE * quantptr;
- JSAMPLE *range_limit = IDCT_range_limit(cinfo);
- SHIFT_TEMPS
-
- /* We hardly need an inverse DCT routine for this: just take the
- * average pixel value, which is one-eighth of the DC coefficient.
- */
- quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
- dcval = DEQUANTIZE(coef_block[0], quantptr[0]);
- dcval = (int) DESCALE((INT32) dcval, 3);
-
- output_buf[0][output_col] = range_limit[dcval & RANGE_MASK];
-}
-
-#endif /* IDCT_SCALING_SUPPORTED */
-
-#endif //_FX_JPEG_TURBO_
+#if !defined(_FX_JPEG_TURBO_)
+/*
+ * jidctred.c
+ *
+ * Copyright (C) 1994-1998, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains inverse-DCT routines that produce reduced-size output:
+ * either 4x4, 2x2, or 1x1 pixels from an 8x8 DCT block.
+ *
+ * The implementation is based on the Loeffler, Ligtenberg and Moschytz (LL&M)
+ * algorithm used in jidctint.c. We simply replace each 8-to-8 1-D IDCT step
+ * with an 8-to-4 step that produces the four averages of two adjacent outputs
+ * (or an 8-to-2 step producing two averages of four outputs, for 2x2 output).
+ * These steps were derived by computing the corresponding values at the end
+ * of the normal LL&M code, then simplifying as much as possible.
+ *
+ * 1x1 is trivial: just take the DC coefficient divided by 8.
+ *
+ * See jidctint.c for additional comments.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+#include "jdct.h" /* Private declarations for DCT subsystem */
+
+#ifdef IDCT_SCALING_SUPPORTED
+
+
+/*
+ * This module is specialized to the case DCTSIZE = 8.
+ */
+
+#if DCTSIZE != 8
+ Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */
+#endif
+
+
+/* Scaling is the same as in jidctint.c. */
+
+#if BITS_IN_JSAMPLE == 8
+#define CONST_BITS 13
+#define PASS1_BITS 2
+#else
+#define CONST_BITS 13
+#define PASS1_BITS 1 /* lose a little precision to avoid overflow */
+#endif
+
+/* Some C compilers fail to reduce "FIX(constant)" at compile time, thus
+ * causing a lot of useless floating-point operations at run time.
+ * To get around this we use the following pre-calculated constants.
+ * If you change CONST_BITS you may want to add appropriate values.
+ * (With a reasonable C compiler, you can just rely on the FIX() macro...)
+ */
+
+#if CONST_BITS == 13
+#define FIX_0_211164243 ((INT32) 1730) /* FIX(0.211164243) */
+#define FIX_0_509795579 ((INT32) 4176) /* FIX(0.509795579) */
+#define FIX_0_601344887 ((INT32) 4926) /* FIX(0.601344887) */
+#define FIX_0_720959822 ((INT32) 5906) /* FIX(0.720959822) */
+#define FIX_0_765366865 ((INT32) 6270) /* FIX(0.765366865) */
+#define FIX_0_850430095 ((INT32) 6967) /* FIX(0.850430095) */
+#define FIX_0_899976223 ((INT32) 7373) /* FIX(0.899976223) */
+#define FIX_1_061594337 ((INT32) 8697) /* FIX(1.061594337) */
+#define FIX_1_272758580 ((INT32) 10426) /* FIX(1.272758580) */
+#define FIX_1_451774981 ((INT32) 11893) /* FIX(1.451774981) */
+#define FIX_1_847759065 ((INT32) 15137) /* FIX(1.847759065) */
+#define FIX_2_172734803 ((INT32) 17799) /* FIX(2.172734803) */
+#define FIX_2_562915447 ((INT32) 20995) /* FIX(2.562915447) */
+#define FIX_3_624509785 ((INT32) 29692) /* FIX(3.624509785) */
+#else
+#define FIX_0_211164243 FIX(0.211164243)
+#define FIX_0_509795579 FIX(0.509795579)
+#define FIX_0_601344887 FIX(0.601344887)
+#define FIX_0_720959822 FIX(0.720959822)
+#define FIX_0_765366865 FIX(0.765366865)
+#define FIX_0_850430095 FIX(0.850430095)
+#define FIX_0_899976223 FIX(0.899976223)
+#define FIX_1_061594337 FIX(1.061594337)
+#define FIX_1_272758580 FIX(1.272758580)
+#define FIX_1_451774981 FIX(1.451774981)
+#define FIX_1_847759065 FIX(1.847759065)
+#define FIX_2_172734803 FIX(2.172734803)
+#define FIX_2_562915447 FIX(2.562915447)
+#define FIX_3_624509785 FIX(3.624509785)
+#endif
+
+
+/* Multiply an INT32 variable by an INT32 constant to yield an INT32 result.
+ * For 8-bit samples with the recommended scaling, all the variable
+ * and constant values involved are no more than 16 bits wide, so a
+ * 16x16->32 bit multiply can be used instead of a full 32x32 multiply.
+ * For 12-bit samples, a full 32-bit multiplication will be needed.
+ */
+
+#if BITS_IN_JSAMPLE == 8
+#define MULTIPLY(var,const) MULTIPLY16C16(var,const)
+#else
+#define MULTIPLY(var,const) ((var) * (const))
+#endif
+
+
+/* Dequantize a coefficient by multiplying it by the multiplier-table
+ * entry; produce an int result. In this module, both inputs and result
+ * are 16 bits or less, so either int or short multiply will work.
+ */
+
+#define DEQUANTIZE(coef,quantval) (((ISLOW_MULT_TYPE) (coef)) * (quantval))
+
+
+/*
+ * Perform dequantization and inverse DCT on one block of coefficients,
+ * producing a reduced-size 4x4 output block.
+ */
+
+GLOBAL(void)
+jpeg_idct_4x4 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
+ JCOEFPTR coef_block,
+ JSAMPARRAY output_buf, JDIMENSION output_col)
+{
+ INT32 tmp0, tmp2, tmp10, tmp12;
+ INT32 z1, z2, z3, z4;
+ JCOEFPTR inptr;
+ ISLOW_MULT_TYPE * quantptr;
+ int * wsptr;
+ JSAMPROW outptr;
+ JSAMPLE *range_limit = IDCT_range_limit(cinfo);
+ int ctr;
+ int workspace[DCTSIZE*4]; /* buffers data between passes */
+ SHIFT_TEMPS
+
+ /* Pass 1: process columns from input, store into work array. */
+
+ inptr = coef_block;
+ quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
+ wsptr = workspace;
+ for (ctr = DCTSIZE; ctr > 0; inptr++, quantptr++, wsptr++, ctr--) {
+ /* Don't bother to process column 4, because second pass won't use it */
+ if (ctr == DCTSIZE-4)
+ continue;
+ if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*2] == 0 &&
+ inptr[DCTSIZE*3] == 0 && inptr[DCTSIZE*5] == 0 &&
+ inptr[DCTSIZE*6] == 0 && inptr[DCTSIZE*7] == 0) {
+ /* AC terms all zero; we need not examine term 4 for 4x4 output */
+ int dcval = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]) << PASS1_BITS;
+
+ wsptr[DCTSIZE*0] = dcval;
+ wsptr[DCTSIZE*1] = dcval;
+ wsptr[DCTSIZE*2] = dcval;
+ wsptr[DCTSIZE*3] = dcval;
+
+ continue;
+ }
+
+ /* Even part */
+
+ tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
+ tmp0 <<= (CONST_BITS+1);
+
+ z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
+ z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);
+
+ tmp2 = MULTIPLY(z2, FIX_1_847759065) + MULTIPLY(z3, - FIX_0_765366865);
+
+ tmp10 = tmp0 + tmp2;
+ tmp12 = tmp0 - tmp2;
+
+ /* Odd part */
+
+ z1 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);
+ z2 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);
+ z3 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
+ z4 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
+
+ tmp0 = MULTIPLY(z1, - FIX_0_211164243) /* sqrt(2) * (c3-c1) */
+ + MULTIPLY(z2, FIX_1_451774981) /* sqrt(2) * (c3+c7) */
+ + MULTIPLY(z3, - FIX_2_172734803) /* sqrt(2) * (-c1-c5) */
+ + MULTIPLY(z4, FIX_1_061594337); /* sqrt(2) * (c5+c7) */
+
+ tmp2 = MULTIPLY(z1, - FIX_0_509795579) /* sqrt(2) * (c7-c5) */
+ + MULTIPLY(z2, - FIX_0_601344887) /* sqrt(2) * (c5-c1) */
+ + MULTIPLY(z3, FIX_0_899976223) /* sqrt(2) * (c3-c7) */
+ + MULTIPLY(z4, FIX_2_562915447); /* sqrt(2) * (c1+c3) */
+
+ /* Final output stage */
+
+ wsptr[DCTSIZE*0] = (int) DESCALE(tmp10 + tmp2, CONST_BITS-PASS1_BITS+1);
+ wsptr[DCTSIZE*3] = (int) DESCALE(tmp10 - tmp2, CONST_BITS-PASS1_BITS+1);
+ wsptr[DCTSIZE*1] = (int) DESCALE(tmp12 + tmp0, CONST_BITS-PASS1_BITS+1);
+ wsptr[DCTSIZE*2] = (int) DESCALE(tmp12 - tmp0, CONST_BITS-PASS1_BITS+1);
+ }
+
+ /* Pass 2: process 4 rows from work array, store into output array. */
+
+ wsptr = workspace;
+ for (ctr = 0; ctr < 4; ctr++) {
+ outptr = output_buf[ctr] + output_col;
+ /* It's not clear whether a zero row test is worthwhile here ... */
+
+#ifndef NO_ZERO_ROW_TEST
+ if (wsptr[1] == 0 && wsptr[2] == 0 && wsptr[3] == 0 &&
+ wsptr[5] == 0 && wsptr[6] == 0 && wsptr[7] == 0) {
+ /* AC terms all zero */
+ JSAMPLE dcval = range_limit[(int) DESCALE((INT32) wsptr[0], PASS1_BITS+3)
+ & RANGE_MASK];
+
+ outptr[0] = dcval;
+ outptr[1] = dcval;
+ outptr[2] = dcval;
+ outptr[3] = dcval;
+
+ wsptr += DCTSIZE; /* advance pointer to next row */
+ continue;
+ }
+#endif
+
+ /* Even part */
+
+ tmp0 = ((INT32) wsptr[0]) << (CONST_BITS+1);
+
+ tmp2 = MULTIPLY((INT32) wsptr[2], FIX_1_847759065)
+ + MULTIPLY((INT32) wsptr[6], - FIX_0_765366865);
+
+ tmp10 = tmp0 + tmp2;
+ tmp12 = tmp0 - tmp2;
+
+ /* Odd part */
+
+ z1 = (INT32) wsptr[7];
+ z2 = (INT32) wsptr[5];
+ z3 = (INT32) wsptr[3];
+ z4 = (INT32) wsptr[1];
+
+ tmp0 = MULTIPLY(z1, - FIX_0_211164243) /* sqrt(2) * (c3-c1) */
+ + MULTIPLY(z2, FIX_1_451774981) /* sqrt(2) * (c3+c7) */
+ + MULTIPLY(z3, - FIX_2_172734803) /* sqrt(2) * (-c1-c5) */
+ + MULTIPLY(z4, FIX_1_061594337); /* sqrt(2) * (c5+c7) */
+
+ tmp2 = MULTIPLY(z1, - FIX_0_509795579) /* sqrt(2) * (c7-c5) */
+ + MULTIPLY(z2, - FIX_0_601344887) /* sqrt(2) * (c5-c1) */
+ + MULTIPLY(z3, FIX_0_899976223) /* sqrt(2) * (c3-c7) */
+ + MULTIPLY(z4, FIX_2_562915447); /* sqrt(2) * (c1+c3) */
+
+ /* Final output stage */
+
+ outptr[0] = range_limit[(int) DESCALE(tmp10 + tmp2,
+ CONST_BITS+PASS1_BITS+3+1)
+ & RANGE_MASK];
+ outptr[3] = range_limit[(int) DESCALE(tmp10 - tmp2,
+ CONST_BITS+PASS1_BITS+3+1)
+ & RANGE_MASK];
+ outptr[1] = range_limit[(int) DESCALE(tmp12 + tmp0,
+ CONST_BITS+PASS1_BITS+3+1)
+ & RANGE_MASK];
+ outptr[2] = range_limit[(int) DESCALE(tmp12 - tmp0,
+ CONST_BITS+PASS1_BITS+3+1)
+ & RANGE_MASK];
+
+ wsptr += DCTSIZE; /* advance pointer to next row */
+ }
+}
+
+
+/*
+ * Perform dequantization and inverse DCT on one block of coefficients,
+ * producing a reduced-size 2x2 output block.
+ */
+
+GLOBAL(void)
+jpeg_idct_2x2 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
+ JCOEFPTR coef_block,
+ JSAMPARRAY output_buf, JDIMENSION output_col)
+{
+ INT32 tmp0, tmp10, z1;
+ JCOEFPTR inptr;
+ ISLOW_MULT_TYPE * quantptr;
+ int * wsptr;
+ JSAMPROW outptr;
+ JSAMPLE *range_limit = IDCT_range_limit(cinfo);
+ int ctr;
+ int workspace[DCTSIZE*2]; /* buffers data between passes */
+ SHIFT_TEMPS
+
+ /* Pass 1: process columns from input, store into work array. */
+
+ inptr = coef_block;
+ quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
+ wsptr = workspace;
+ for (ctr = DCTSIZE; ctr > 0; inptr++, quantptr++, wsptr++, ctr--) {
+ /* Don't bother to process columns 2,4,6 */
+ if (ctr == DCTSIZE-2 || ctr == DCTSIZE-4 || ctr == DCTSIZE-6)
+ continue;
+ if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*3] == 0 &&
+ inptr[DCTSIZE*5] == 0 && inptr[DCTSIZE*7] == 0) {
+ /* AC terms all zero; we need not examine terms 2,4,6 for 2x2 output */
+ int dcval = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]) << PASS1_BITS;
+
+ wsptr[DCTSIZE*0] = dcval;
+ wsptr[DCTSIZE*1] = dcval;
+
+ continue;
+ }
+
+ /* Even part */
+
+ z1 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
+ tmp10 = z1 << (CONST_BITS+2);
+
+ /* Odd part */
+
+ z1 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);
+ tmp0 = MULTIPLY(z1, - FIX_0_720959822); /* sqrt(2) * (c7-c5+c3-c1) */
+ z1 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);
+ tmp0 += MULTIPLY(z1, FIX_0_850430095); /* sqrt(2) * (-c1+c3+c5+c7) */
+ z1 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
+ tmp0 += MULTIPLY(z1, - FIX_1_272758580); /* sqrt(2) * (-c1+c3-c5-c7) */
+ z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
+ tmp0 += MULTIPLY(z1, FIX_3_624509785); /* sqrt(2) * (c1+c3+c5+c7) */
+
+ /* Final output stage */
+
+ wsptr[DCTSIZE*0] = (int) DESCALE(tmp10 + tmp0, CONST_BITS-PASS1_BITS+2);
+ wsptr[DCTSIZE*1] = (int) DESCALE(tmp10 - tmp0, CONST_BITS-PASS1_BITS+2);
+ }
+
+ /* Pass 2: process 2 rows from work array, store into output array. */
+
+ wsptr = workspace;
+ for (ctr = 0; ctr < 2; ctr++) {
+ outptr = output_buf[ctr] + output_col;
+ /* It's not clear whether a zero row test is worthwhile here ... */
+
+#ifndef NO_ZERO_ROW_TEST
+ if (wsptr[1] == 0 && wsptr[3] == 0 && wsptr[5] == 0 && wsptr[7] == 0) {
+ /* AC terms all zero */
+ JSAMPLE dcval = range_limit[(int) DESCALE((INT32) wsptr[0], PASS1_BITS+3)
+ & RANGE_MASK];
+
+ outptr[0] = dcval;
+ outptr[1] = dcval;
+
+ wsptr += DCTSIZE; /* advance pointer to next row */
+ continue;
+ }
+#endif
+
+ /* Even part */
+
+ tmp10 = ((INT32) wsptr[0]) << (CONST_BITS+2);
+
+ /* Odd part */
+
+ tmp0 = MULTIPLY((INT32) wsptr[7], - FIX_0_720959822) /* sqrt(2) * (c7-c5+c3-c1) */
+ + MULTIPLY((INT32) wsptr[5], FIX_0_850430095) /* sqrt(2) * (-c1+c3+c5+c7) */
+ + MULTIPLY((INT32) wsptr[3], - FIX_1_272758580) /* sqrt(2) * (-c1+c3-c5-c7) */
+ + MULTIPLY((INT32) wsptr[1], FIX_3_624509785); /* sqrt(2) * (c1+c3+c5+c7) */
+
+ /* Final output stage */
+
+ outptr[0] = range_limit[(int) DESCALE(tmp10 + tmp0,
+ CONST_BITS+PASS1_BITS+3+2)
+ & RANGE_MASK];
+ outptr[1] = range_limit[(int) DESCALE(tmp10 - tmp0,
+ CONST_BITS+PASS1_BITS+3+2)
+ & RANGE_MASK];
+
+ wsptr += DCTSIZE; /* advance pointer to next row */
+ }
+}
+
+
+/*
+ * Perform dequantization and inverse DCT on one block of coefficients,
+ * producing a reduced-size 1x1 output block.
+ */
+
+GLOBAL(void)
+jpeg_idct_1x1 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
+ JCOEFPTR coef_block,
+ JSAMPARRAY output_buf, JDIMENSION output_col)
+{
+ int dcval;
+ ISLOW_MULT_TYPE * quantptr;
+ JSAMPLE *range_limit = IDCT_range_limit(cinfo);
+ SHIFT_TEMPS
+
+ /* We hardly need an inverse DCT routine for this: just take the
+ * average pixel value, which is one-eighth of the DC coefficient.
+ */
+ quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
+ dcval = DEQUANTIZE(coef_block[0], quantptr[0]);
+ dcval = (int) DESCALE((INT32) dcval, 3);
+
+ output_buf[0][output_col] = range_limit[dcval & RANGE_MASK];
+}
+
+#endif /* IDCT_SCALING_SUPPORTED */
+
+#endif //_FX_JPEG_TURBO_
diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jmemmgr.c b/core/src/fxcodec/libjpeg/fpdfapi_jmemmgr.c
index 19ee66597b..630102fc2e 100644
--- a/core/src/fxcodec/libjpeg/fpdfapi_jmemmgr.c
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jmemmgr.c
@@ -1,1123 +1,1123 @@
-#if !defined(_FX_JPEG_TURBO_)
-/*
- * jmemmgr.c
- *
- * Copyright (C) 1991-1997, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains the JPEG system-independent memory management
- * routines. This code is usable across a wide variety of machines; most
- * of the system dependencies have been isolated in a separate file.
- * The major functions provided here are:
- * * pool-based allocation and freeing of memory;
- * * policy decisions about how to divide available memory among the
- * virtual arrays;
- * * control logic for swapping virtual arrays between main memory and
- * backing storage.
- * The separate system-dependent file provides the actual backing-storage
- * access code, and it contains the policy decision about how much total
- * main memory to use.
- * This file is system-dependent in the sense that some of its functions
- * are unnecessary in some systems. For example, if there is enough virtual
- * memory so that backing storage will never be used, much of the virtual
- * array control logic could be removed. (Of course, if you have that much
- * memory then you shouldn't care about a little bit of unused code...)
- */
-
-#define JPEG_INTERNALS
-#define AM_MEMORY_MANAGER /* we define jvirt_Xarray_control structs */
-#include "jinclude.h"
-#include "jpeglib.h"
-#include "jmemsys.h" /* import the system-dependent declarations */
-
-#define NO_GETENV /* XYQ: 2007-5-22 Don't use it */
-
-#ifndef NO_GETENV
-#ifndef HAVE_STDLIB_H /* <stdlib.h> should declare getenv() */
-extern char * getenv JPP((const char * name));
-#endif
-#endif
-
-
-/*
- * Some important notes:
- * The allocation routines provided here must never return NULL.
- * They should exit to error_exit if unsuccessful.
- *
- * It's not a good idea to try to merge the sarray and barray routines,
- * even though they are textually almost the same, because samples are
- * usually stored as bytes while coefficients are shorts or ints. Thus,
- * in machines where byte pointers have a different representation from
- * word pointers, the resulting machine code could not be the same.
- */
-
-
-/*
- * Many machines require storage alignment: longs must start on 4-byte
- * boundaries, doubles on 8-byte boundaries, etc. On such machines, malloc()
- * always returns pointers that are multiples of the worst-case alignment
- * requirement, and we had better do so too.
- * There isn't any really portable way to determine the worst-case alignment
- * requirement. This module assumes that the alignment requirement is
- * multiples of sizeof(ALIGN_TYPE).
- * By default, we define ALIGN_TYPE as double. This is necessary on some
- * workstations (where doubles really do need 8-byte alignment) and will work
- * fine on nearly everything. If your machine has lesser alignment needs,
- * you can save a few bytes by making ALIGN_TYPE smaller.
- * The only place I know of where this will NOT work is certain Macintosh
- * 680x0 compilers that define double as a 10-byte IEEE extended float.
- * Doing 10-byte alignment is counterproductive because longwords won't be
- * aligned well. Put "#define ALIGN_TYPE long" in jconfig.h if you have
- * such a compiler.
- */
-
-#ifndef ALIGN_TYPE /* so can override from jconfig.h */
-#define ALIGN_TYPE double
-#endif
-
-
-/*
- * We allocate objects from "pools", where each pool is gotten with a single
- * request to jpeg_get_small() or jpeg_get_large(). There is no per-object
- * overhead within a pool, except for alignment padding. Each pool has a
- * header with a link to the next pool of the same class.
- * Small and large pool headers are identical except that the latter's
- * link pointer must be FAR on 80x86 machines.
- * Notice that the "real" header fields are union'ed with a dummy ALIGN_TYPE
- * field. This forces the compiler to make SIZEOF(small_pool_hdr) a multiple
- * of the alignment requirement of ALIGN_TYPE.
- */
-
-typedef union small_pool_struct * small_pool_ptr;
-
-typedef union small_pool_struct {
- struct {
- small_pool_ptr next; /* next in list of pools */
- size_t bytes_used; /* how many bytes already used within pool */
- size_t bytes_left; /* bytes still available in this pool */
- } hdr;
- ALIGN_TYPE dummy; /* included in union to ensure alignment */
-} small_pool_hdr;
-
-typedef union large_pool_struct FAR * large_pool_ptr;
-
-typedef union large_pool_struct {
- struct {
- large_pool_ptr next; /* next in list of pools */
- size_t bytes_used; /* how many bytes already used within pool */
- size_t bytes_left; /* bytes still available in this pool */
- } hdr;
- ALIGN_TYPE dummy; /* included in union to ensure alignment */
-} large_pool_hdr;
-
-
-/*
- * Here is the full definition of a memory manager object.
- */
-
-typedef struct {
- struct jpeg_memory_mgr pub; /* public fields */
-
- /* Each pool identifier (lifetime class) names a linked list of pools. */
- small_pool_ptr small_list[JPOOL_NUMPOOLS];
- large_pool_ptr large_list[JPOOL_NUMPOOLS];
-
- /* Since we only have one lifetime class of virtual arrays, only one
- * linked list is necessary (for each datatype). Note that the virtual
- * array control blocks being linked together are actually stored somewhere
- * in the small-pool list.
- */
- jvirt_sarray_ptr virt_sarray_list;
- jvirt_barray_ptr virt_barray_list;
-
- /* This counts total space obtained from jpeg_get_small/large */
- long total_space_allocated;
-
- /* alloc_sarray and alloc_barray set this value for use by virtual
- * array routines.
- */
- JDIMENSION last_rowsperchunk; /* from most recent alloc_sarray/barray */
-} my_memory_mgr;
-
-typedef my_memory_mgr * my_mem_ptr;
-
-
-/*
- * The control blocks for virtual arrays.
- * Note that these blocks are allocated in the "small" pool area.
- * System-dependent info for the associated backing store (if any) is hidden
- * inside the backing_store_info struct.
- */
-
-struct jvirt_sarray_control {
- JSAMPARRAY mem_buffer; /* => the in-memory buffer */
- JDIMENSION rows_in_array; /* total virtual array height */
- JDIMENSION samplesperrow; /* width of array (and of memory buffer) */
- JDIMENSION maxaccess; /* max rows accessed by access_virt_sarray */
- JDIMENSION rows_in_mem; /* height of memory buffer */
- JDIMENSION rowsperchunk; /* allocation chunk size in mem_buffer */
- JDIMENSION cur_start_row; /* first logical row # in the buffer */
- JDIMENSION first_undef_row; /* row # of first uninitialized row */
- boolean pre_zero; /* pre-zero mode requested? */
- boolean dirty; /* do current buffer contents need written? */
- boolean b_s_open; /* is backing-store data valid? */
- jvirt_sarray_ptr next; /* link to next virtual sarray control block */
- backing_store_info b_s_info; /* System-dependent control info */
-};
-
-struct jvirt_barray_control {
- JBLOCKARRAY mem_buffer; /* => the in-memory buffer */
- JDIMENSION rows_in_array; /* total virtual array height */
- JDIMENSION blocksperrow; /* width of array (and of memory buffer) */
- JDIMENSION maxaccess; /* max rows accessed by access_virt_barray */
- JDIMENSION rows_in_mem; /* height of memory buffer */
- JDIMENSION rowsperchunk; /* allocation chunk size in mem_buffer */
- JDIMENSION cur_start_row; /* first logical row # in the buffer */
- JDIMENSION first_undef_row; /* row # of first uninitialized row */
- boolean pre_zero; /* pre-zero mode requested? */
- boolean dirty; /* do current buffer contents need written? */
- boolean b_s_open; /* is backing-store data valid? */
- jvirt_barray_ptr next; /* link to next virtual barray control block */
- backing_store_info b_s_info; /* System-dependent control info */
-};
-
-
-#ifdef MEM_STATS /* optional extra stuff for statistics */
-
-LOCAL(void)
-print_mem_stats (j_common_ptr cinfo, int pool_id)
-{
- my_mem_ptr mem = (my_mem_ptr) cinfo->mem;
- small_pool_ptr shdr_ptr;
- large_pool_ptr lhdr_ptr;
-
- /* Since this is only a debugging stub, we can cheat a little by using
- * fprintf directly rather than going through the trace message code.
- * This is helpful because message parm array can't handle longs.
- */
- FXSYS_fprintf(stderr, "Freeing pool %d, total space = %ld\n",
- pool_id, mem->total_space_allocated);
-
- for (lhdr_ptr = mem->large_list[pool_id]; lhdr_ptr != NULL;
- lhdr_ptr = lhdr_ptr->hdr.next) {
- FXSYS_fprintf(stderr, " Large chunk used %ld\n",
- (long) lhdr_ptr->hdr.bytes_used);
- }
-
- for (shdr_ptr = mem->small_list[pool_id]; shdr_ptr != NULL;
- shdr_ptr = shdr_ptr->hdr.next) {
- FXSYS_fprintf(stderr, " Small chunk used %ld free %ld\n",
- (long) shdr_ptr->hdr.bytes_used,
- (long) shdr_ptr->hdr.bytes_left);
- }
-}
-
-#endif /* MEM_STATS */
-
-
-LOCAL(void)
-out_of_memory (j_common_ptr cinfo, int which)
-/* Report an out-of-memory error and stop execution */
-/* If we compiled MEM_STATS support, report alloc requests before dying */
-{
-#ifdef MEM_STATS
- cinfo->err->trace_level = 2; /* force self_destruct to report stats */
-#endif
- ERREXIT1(cinfo, JERR_OUT_OF_MEMORY, which);
-}
-
-
-/*
- * Allocation of "small" objects.
- *
- * For these, we use pooled storage. When a new pool must be created,
- * we try to get enough space for the current request plus a "slop" factor,
- * where the slop will be the amount of leftover space in the new pool.
- * The speed vs. space tradeoff is largely determined by the slop values.
- * A different slop value is provided for each pool class (lifetime),
- * and we also distinguish the first pool of a class from later ones.
- * NOTE: the values given work fairly well on both 16- and 32-bit-int
- * machines, but may be too small if longs are 64 bits or more.
- */
-
-static const size_t first_pool_slop[JPOOL_NUMPOOLS] =
-{
- 1600, /* first PERMANENT pool */
- 16000 /* first IMAGE pool */
-};
-
-static const size_t extra_pool_slop[JPOOL_NUMPOOLS] =
-{
- 0, /* additional PERMANENT pools */
- 5000 /* additional IMAGE pools */
-};
-
-#define MIN_SLOP 50 /* greater than 0 to avoid futile looping */
-
-
-METHODDEF(void *)
-alloc_small (j_common_ptr cinfo, int pool_id, size_t sizeofobject)
-/* Allocate a "small" object */
-{
- my_mem_ptr mem = (my_mem_ptr) cinfo->mem;
- small_pool_ptr hdr_ptr, prev_hdr_ptr;
- char * data_ptr;
- size_t odd_bytes, min_request, slop;
-
- /* Check for unsatisfiable request (do now to ensure no overflow below) */
- if (sizeofobject > (size_t) (MAX_ALLOC_CHUNK-SIZEOF(small_pool_hdr)))
- out_of_memory(cinfo, 1); /* request exceeds malloc's ability */
-
- /* Round up the requested size to a multiple of SIZEOF(ALIGN_TYPE) */
- odd_bytes = sizeofobject % SIZEOF(ALIGN_TYPE);
- if (odd_bytes > 0)
- sizeofobject += SIZEOF(ALIGN_TYPE) - odd_bytes;
-
- /* See if space is available in any existing pool */
- if (pool_id < 0 || pool_id >= JPOOL_NUMPOOLS)
- ERREXIT1(cinfo, JERR_BAD_POOL_ID, pool_id); /* safety check */
- prev_hdr_ptr = NULL;
- hdr_ptr = mem->small_list[pool_id];
- while (hdr_ptr != NULL) {
- if (hdr_ptr->hdr.bytes_left >= sizeofobject)
- break; /* found pool with enough space */
- prev_hdr_ptr = hdr_ptr;
- hdr_ptr = hdr_ptr->hdr.next;
- }
-
- /* Time to make a new pool? */
- if (hdr_ptr == NULL) {
- /* min_request is what we need now, slop is what will be leftover */
- min_request = sizeofobject + SIZEOF(small_pool_hdr);
- if (prev_hdr_ptr == NULL) /* first pool in class? */
- slop = first_pool_slop[pool_id];
- else
- slop = extra_pool_slop[pool_id];
- /* Don't ask for more than MAX_ALLOC_CHUNK */
- if (slop > (size_t) (MAX_ALLOC_CHUNK-min_request))
- slop = (size_t) (MAX_ALLOC_CHUNK-min_request);
- /* Try to get space, if fail reduce slop and try again */
- for (;;) {
- hdr_ptr = (small_pool_ptr) jpeg_get_small(cinfo, min_request + slop);
- if (hdr_ptr != NULL)
- break;
- slop /= 2;
- if (slop < MIN_SLOP) /* give up when it gets real small */
- out_of_memory(cinfo, 2); /* jpeg_get_small failed */
- }
- mem->total_space_allocated += min_request + slop;
- /* Success, initialize the new pool header and add to end of list */
- hdr_ptr->hdr.next = NULL;
- hdr_ptr->hdr.bytes_used = 0;
- hdr_ptr->hdr.bytes_left = sizeofobject + slop;
- if (prev_hdr_ptr == NULL) /* first pool in class? */
- mem->small_list[pool_id] = hdr_ptr;
- else
- prev_hdr_ptr->hdr.next = hdr_ptr;
- }
-
- /* OK, allocate the object from the current pool */
- data_ptr = (char *) (hdr_ptr + 1); /* point to first data byte in pool */
- data_ptr += hdr_ptr->hdr.bytes_used; /* point to place for object */
- hdr_ptr->hdr.bytes_used += sizeofobject;
- hdr_ptr->hdr.bytes_left -= sizeofobject;
-
- return (void *) data_ptr;
-}
-
-
-/*
- * Allocation of "large" objects.
- *
- * The external semantics of these are the same as "small" objects,
- * except that FAR pointers are used on 80x86. However the pool
- * management heuristics are quite different. We assume that each
- * request is large enough that it may as well be passed directly to
- * jpeg_get_large; the pool management just links everything together
- * so that we can free it all on demand.
- * Note: the major use of "large" objects is in JSAMPARRAY and JBLOCKARRAY
- * structures. The routines that create these structures (see below)
- * deliberately bunch rows together to ensure a large request size.
- */
-
-METHODDEF(void FAR *)
-alloc_large (j_common_ptr cinfo, int pool_id, size_t sizeofobject)
-/* Allocate a "large" object */
-{
- my_mem_ptr mem = (my_mem_ptr) cinfo->mem;
- large_pool_ptr hdr_ptr;
- size_t odd_bytes;
-
- /* Check for unsatisfiable request (do now to ensure no overflow below) */
- if (sizeofobject > (size_t) (MAX_ALLOC_CHUNK-SIZEOF(large_pool_hdr)))
- out_of_memory(cinfo, 3); /* request exceeds malloc's ability */
-
- /* Round up the requested size to a multiple of SIZEOF(ALIGN_TYPE) */
- odd_bytes = sizeofobject % SIZEOF(ALIGN_TYPE);
- if (odd_bytes > 0)
- sizeofobject += SIZEOF(ALIGN_TYPE) - odd_bytes;
-
- /* Always make a new pool */
- if (pool_id < 0 || pool_id >= JPOOL_NUMPOOLS)
- ERREXIT1(cinfo, JERR_BAD_POOL_ID, pool_id); /* safety check */
-
- hdr_ptr = (large_pool_ptr) jpeg_get_large(cinfo, sizeofobject +
- SIZEOF(large_pool_hdr));
- if (hdr_ptr == NULL)
- out_of_memory(cinfo, 4); /* jpeg_get_large failed */
- mem->total_space_allocated += sizeofobject + SIZEOF(large_pool_hdr);
-
- /* Success, initialize the new pool header and add to list */
- hdr_ptr->hdr.next = mem->large_list[pool_id];
- /* We maintain space counts in each pool header for statistical purposes,
- * even though they are not needed for allocation.
- */
- hdr_ptr->hdr.bytes_used = sizeofobject;
- hdr_ptr->hdr.bytes_left = 0;
- mem->large_list[pool_id] = hdr_ptr;
-
- return (void FAR *) (hdr_ptr + 1); /* point to first data byte in pool */
-}
-
-
-/*
- * Creation of 2-D sample arrays.
- * The pointers are in near heap, the samples themselves in FAR heap.
- *
- * To minimize allocation overhead and to allow I/O of large contiguous
- * blocks, we allocate the sample rows in groups of as many rows as possible
- * without exceeding MAX_ALLOC_CHUNK total bytes per allocation request.
- * NB: the virtual array control routines, later in this file, know about
- * this chunking of rows. The rowsperchunk value is left in the mem manager
- * object so that it can be saved away if this sarray is the workspace for
- * a virtual array.
- */
-
-METHODDEF(JSAMPARRAY)
-alloc_sarray (j_common_ptr cinfo, int pool_id,
- JDIMENSION samplesperrow, JDIMENSION numrows)
-/* Allocate a 2-D sample array */
-{
- my_mem_ptr mem = (my_mem_ptr) cinfo->mem;
- JSAMPARRAY result;
- JSAMPROW workspace;
- JDIMENSION rowsperchunk, currow, i;
- long ltemp;
-
- /* Calculate max # of rows allowed in one allocation chunk */
- ltemp = (MAX_ALLOC_CHUNK-SIZEOF(large_pool_hdr)) /
- ((long) samplesperrow * SIZEOF(JSAMPLE));
- if (ltemp <= 0)
- ERREXIT(cinfo, JERR_WIDTH_OVERFLOW);
- if (ltemp < (long) numrows)
- rowsperchunk = (JDIMENSION) ltemp;
- else
- rowsperchunk = numrows;
- mem->last_rowsperchunk = rowsperchunk;
-
- /* Get space for row pointers (small object) */
- result = (JSAMPARRAY) alloc_small(cinfo, pool_id,
- (size_t) (numrows * SIZEOF(JSAMPROW)));
-
- /* Get the rows themselves (large objects) */
- currow = 0;
- while (currow < numrows) {
- rowsperchunk = MIN(rowsperchunk, numrows - currow);
- workspace = (JSAMPROW) alloc_large(cinfo, pool_id,
- (size_t) ((size_t) rowsperchunk * (size_t) samplesperrow
- * SIZEOF(JSAMPLE)));
- for (i = rowsperchunk; i > 0; i--) {
- result[currow++] = workspace;
- workspace += samplesperrow;
- }
- }
-
- return result;
-}
-
-
-/*
- * Creation of 2-D coefficient-block arrays.
- * This is essentially the same as the code for sample arrays, above.
- */
-
-METHODDEF(JBLOCKARRAY)
-alloc_barray (j_common_ptr cinfo, int pool_id,
- JDIMENSION blocksperrow, JDIMENSION numrows)
-/* Allocate a 2-D coefficient-block array */
-{
- my_mem_ptr mem = (my_mem_ptr) cinfo->mem;
- JBLOCKARRAY result;
- JBLOCKROW workspace;
- JDIMENSION rowsperchunk, currow, i;
- long ltemp;
-
- /* Calculate max # of rows allowed in one allocation chunk */
- ltemp = (MAX_ALLOC_CHUNK-SIZEOF(large_pool_hdr)) /
- ((long) blocksperrow * SIZEOF(JBLOCK));
- if (ltemp <= 0)
- ERREXIT(cinfo, JERR_WIDTH_OVERFLOW);
- if (ltemp < (long) numrows)
- rowsperchunk = (JDIMENSION) ltemp;
- else
- rowsperchunk = numrows;
- mem->last_rowsperchunk = rowsperchunk;
-
- /* Get space for row pointers (small object) */
- result = (JBLOCKARRAY) alloc_small(cinfo, pool_id,
- (size_t) (numrows * SIZEOF(JBLOCKROW)));
-
- /* Get the rows themselves (large objects) */
- currow = 0;
- while (currow < numrows) {
- rowsperchunk = MIN(rowsperchunk, numrows - currow);
- workspace = (JBLOCKROW) alloc_large(cinfo, pool_id,
- (size_t) ((size_t) rowsperchunk * (size_t) blocksperrow
- * SIZEOF(JBLOCK)));
- for (i = rowsperchunk; i > 0; i--) {
- result[currow++] = workspace;
- workspace += blocksperrow;
- }
- }
-
- return result;
-}
-
-
-/*
- * About virtual array management:
- *
- * The above "normal" array routines are only used to allocate strip buffers
- * (as wide as the image, but just a few rows high). Full-image-sized buffers
- * are handled as "virtual" arrays. The array is still accessed a strip at a
- * time, but the memory manager must save the whole array for repeated
- * accesses. The intended implementation is that there is a strip buffer in
- * memory (as high as is possible given the desired memory limit), plus a
- * backing file that holds the rest of the array.
- *
- * The request_virt_array routines are told the total size of the image and
- * the maximum number of rows that will be accessed at once. The in-memory
- * buffer must be at least as large as the maxaccess value.
- *
- * The request routines create control blocks but not the in-memory buffers.
- * That is postponed until realize_virt_arrays is called. At that time the
- * total amount of space needed is known (approximately, anyway), so free
- * memory can be divided up fairly.
- *
- * The access_virt_array routines are responsible for making a specific strip
- * area accessible (after reading or writing the backing file, if necessary).
- * Note that the access routines are told whether the caller intends to modify
- * the accessed strip; during a read-only pass this saves having to rewrite
- * data to disk. The access routines are also responsible for pre-zeroing
- * any newly accessed rows, if pre-zeroing was requested.
- *
- * In current usage, the access requests are usually for nonoverlapping
- * strips; that is, successive access start_row numbers differ by exactly
- * num_rows = maxaccess. This means we can get good performance with simple
- * buffer dump/reload logic, by making the in-memory buffer be a multiple
- * of the access height; then there will never be accesses across bufferload
- * boundaries. The code will still work with overlapping access requests,
- * but it doesn't handle bufferload overlaps very efficiently.
- */
-
-
-METHODDEF(jvirt_sarray_ptr)
-request_virt_sarray (j_common_ptr cinfo, int pool_id, boolean pre_zero,
- JDIMENSION samplesperrow, JDIMENSION numrows,
- JDIMENSION maxaccess)
-/* Request a virtual 2-D sample array */
-{
- my_mem_ptr mem = (my_mem_ptr) cinfo->mem;
- jvirt_sarray_ptr result;
-
- /* Only IMAGE-lifetime virtual arrays are currently supported */
- if (pool_id != JPOOL_IMAGE)
- ERREXIT1(cinfo, JERR_BAD_POOL_ID, pool_id); /* safety check */
-
- /* get control block */
- result = (jvirt_sarray_ptr) alloc_small(cinfo, pool_id,
- SIZEOF(struct jvirt_sarray_control));
-
- result->mem_buffer = NULL; /* marks array not yet realized */
- result->rows_in_array = numrows;
- result->samplesperrow = samplesperrow;
- result->maxaccess = maxaccess;
- result->pre_zero = pre_zero;
- result->b_s_open = FALSE; /* no associated backing-store object */
- result->next = mem->virt_sarray_list; /* add to list of virtual arrays */
- mem->virt_sarray_list = result;
-
- return result;
-}
-
-
-METHODDEF(jvirt_barray_ptr)
-request_virt_barray (j_common_ptr cinfo, int pool_id, boolean pre_zero,
- JDIMENSION blocksperrow, JDIMENSION numrows,
- JDIMENSION maxaccess)
-/* Request a virtual 2-D coefficient-block array */
-{
- my_mem_ptr mem = (my_mem_ptr) cinfo->mem;
- jvirt_barray_ptr result;
-
- /* Only IMAGE-lifetime virtual arrays are currently supported */
- if (pool_id != JPOOL_IMAGE)
- ERREXIT1(cinfo, JERR_BAD_POOL_ID, pool_id); /* safety check */
-
- /* get control block */
- result = (jvirt_barray_ptr) alloc_small(cinfo, pool_id,
- SIZEOF(struct jvirt_barray_control));
-
- result->mem_buffer = NULL; /* marks array not yet realized */
- result->rows_in_array = numrows;
- result->blocksperrow = blocksperrow;
- result->maxaccess = maxaccess;
- result->pre_zero = pre_zero;
- result->b_s_open = FALSE; /* no associated backing-store object */
- result->next = mem->virt_barray_list; /* add to list of virtual arrays */
- mem->virt_barray_list = result;
-
- return result;
-}
-
-
-METHODDEF(void)
-realize_virt_arrays (j_common_ptr cinfo)
-/* Allocate the in-memory buffers for any unrealized virtual arrays */
-{
- my_mem_ptr mem = (my_mem_ptr) cinfo->mem;
- long space_per_minheight, maximum_space, avail_mem;
- long minheights, max_minheights;
- jvirt_sarray_ptr sptr;
- jvirt_barray_ptr bptr;
-
- /* Compute the minimum space needed (maxaccess rows in each buffer)
- * and the maximum space needed (full image height in each buffer).
- * These may be of use to the system-dependent jpeg_mem_available routine.
- */
- space_per_minheight = 0;
- maximum_space = 0;
- for (sptr = mem->virt_sarray_list; sptr != NULL; sptr = sptr->next) {
- if (sptr->mem_buffer == NULL) { /* if not realized yet */
- space_per_minheight += (long) sptr->maxaccess *
- (long) sptr->samplesperrow * SIZEOF(JSAMPLE);
- maximum_space += (long) sptr->rows_in_array *
- (long) sptr->samplesperrow * SIZEOF(JSAMPLE);
- }
- }
- for (bptr = mem->virt_barray_list; bptr != NULL; bptr = bptr->next) {
- if (bptr->mem_buffer == NULL) { /* if not realized yet */
- space_per_minheight += (long) bptr->maxaccess *
- (long) bptr->blocksperrow * SIZEOF(JBLOCK);
- maximum_space += (long) bptr->rows_in_array *
- (long) bptr->blocksperrow * SIZEOF(JBLOCK);
- }
- }
-
- if (space_per_minheight <= 0)
- return; /* no unrealized arrays, no work */
-
- /* Determine amount of memory to actually use; this is system-dependent. */
- avail_mem = jpeg_mem_available(cinfo, space_per_minheight, maximum_space,
- mem->total_space_allocated);
-
- /* If the maximum space needed is available, make all the buffers full
- * height; otherwise parcel it out with the same number of minheights
- * in each buffer.
- */
- if (avail_mem >= maximum_space)
- max_minheights = 1000000000L;
- else {
- max_minheights = avail_mem / space_per_minheight;
- /* If there doesn't seem to be enough space, try to get the minimum
- * anyway. This allows a "stub" implementation of jpeg_mem_available().
- */
- if (max_minheights <= 0)
- max_minheights = 1;
- }
-
- /* Allocate the in-memory buffers and initialize backing store as needed. */
-
- for (sptr = mem->virt_sarray_list; sptr != NULL; sptr = sptr->next) {
- if (sptr->mem_buffer == NULL) { /* if not realized yet */
- minheights = ((long) sptr->rows_in_array - 1L) / sptr->maxaccess + 1L;
- if (minheights <= max_minheights) {
- /* This buffer fits in memory */
- sptr->rows_in_mem = sptr->rows_in_array;
- } else {
- /* It doesn't fit in memory, create backing store. */
- sptr->rows_in_mem = (JDIMENSION) (max_minheights * sptr->maxaccess);
- jpeg_open_backing_store(cinfo, & sptr->b_s_info,
- (long) sptr->rows_in_array *
- (long) sptr->samplesperrow *
- (long) SIZEOF(JSAMPLE));
- sptr->b_s_open = TRUE;
- }
- sptr->mem_buffer = alloc_sarray(cinfo, JPOOL_IMAGE,
- sptr->samplesperrow, sptr->rows_in_mem);
- sptr->rowsperchunk = mem->last_rowsperchunk;
- sptr->cur_start_row = 0;
- sptr->first_undef_row = 0;
- sptr->dirty = FALSE;
- }
- }
-
- for (bptr = mem->virt_barray_list; bptr != NULL; bptr = bptr->next) {
- if (bptr->mem_buffer == NULL) { /* if not realized yet */
- minheights = ((long) bptr->rows_in_array - 1L) / bptr->maxaccess + 1L;
- if (minheights <= max_minheights) {
- /* This buffer fits in memory */
- bptr->rows_in_mem = bptr->rows_in_array;
- } else {
- /* It doesn't fit in memory, create backing store. */
- bptr->rows_in_mem = (JDIMENSION) (max_minheights * bptr->maxaccess);
- jpeg_open_backing_store(cinfo, & bptr->b_s_info,
- (long) bptr->rows_in_array *
- (long) bptr->blocksperrow *
- (long) SIZEOF(JBLOCK));
- bptr->b_s_open = TRUE;
- }
- bptr->mem_buffer = alloc_barray(cinfo, JPOOL_IMAGE,
- bptr->blocksperrow, bptr->rows_in_mem);
- bptr->rowsperchunk = mem->last_rowsperchunk;
- bptr->cur_start_row = 0;
- bptr->first_undef_row = 0;
- bptr->dirty = FALSE;
- }
- }
-}
-
-
-LOCAL(void)
-do_sarray_io (j_common_ptr cinfo, jvirt_sarray_ptr ptr, boolean writing)
-/* Do backing store read or write of a virtual sample array */
-{
- long bytesperrow, file_offset, byte_count, rows, thisrow, i;
-
- bytesperrow = (long) ptr->samplesperrow * SIZEOF(JSAMPLE);
- file_offset = ptr->cur_start_row * bytesperrow;
- /* Loop to read or write each allocation chunk in mem_buffer */
- for (i = 0; i < (long) ptr->rows_in_mem; i += ptr->rowsperchunk) {
- /* One chunk, but check for short chunk at end of buffer */
- rows = MIN((long) ptr->rowsperchunk, (long) ptr->rows_in_mem - i);
- /* Transfer no more than is currently defined */
- thisrow = (long) ptr->cur_start_row + i;
- rows = MIN(rows, (long) ptr->first_undef_row - thisrow);
- /* Transfer no more than fits in file */
- rows = MIN(rows, (long) ptr->rows_in_array - thisrow);
- if (rows <= 0) /* this chunk might be past end of file! */
- break;
- byte_count = rows * bytesperrow;
- if (writing)
- (*ptr->b_s_info.write_backing_store) (cinfo, & ptr->b_s_info,
- (void FAR *) ptr->mem_buffer[i],
- file_offset, byte_count);
- else
- (*ptr->b_s_info.read_backing_store) (cinfo, & ptr->b_s_info,
- (void FAR *) ptr->mem_buffer[i],
- file_offset, byte_count);
- file_offset += byte_count;
- }
-}
-
-
-LOCAL(void)
-do_barray_io (j_common_ptr cinfo, jvirt_barray_ptr ptr, boolean writing)
-/* Do backing store read or write of a virtual coefficient-block array */
-{
- long bytesperrow, file_offset, byte_count, rows, thisrow, i;
-
- bytesperrow = (long) ptr->blocksperrow * SIZEOF(JBLOCK);
- file_offset = ptr->cur_start_row * bytesperrow;
- /* Loop to read or write each allocation chunk in mem_buffer */
- for (i = 0; i < (long) ptr->rows_in_mem; i += ptr->rowsperchunk) {
- /* One chunk, but check for short chunk at end of buffer */
- rows = MIN((long) ptr->rowsperchunk, (long) ptr->rows_in_mem - i);
- /* Transfer no more than is currently defined */
- thisrow = (long) ptr->cur_start_row + i;
- rows = MIN(rows, (long) ptr->first_undef_row - thisrow);
- /* Transfer no more than fits in file */
- rows = MIN(rows, (long) ptr->rows_in_array - thisrow);
- if (rows <= 0) /* this chunk might be past end of file! */
- break;
- byte_count = rows * bytesperrow;
- if (writing)
- (*ptr->b_s_info.write_backing_store) (cinfo, & ptr->b_s_info,
- (void FAR *) ptr->mem_buffer[i],
- file_offset, byte_count);
- else
- (*ptr->b_s_info.read_backing_store) (cinfo, & ptr->b_s_info,
- (void FAR *) ptr->mem_buffer[i],
- file_offset, byte_count);
- file_offset += byte_count;
- }
-}
-
-
-METHODDEF(JSAMPARRAY)
-access_virt_sarray (j_common_ptr cinfo, jvirt_sarray_ptr ptr,
- JDIMENSION start_row, JDIMENSION num_rows,
- boolean writable)
-/* Access the part of a virtual sample array starting at start_row */
-/* and extending for num_rows rows. writable is true if */
-/* caller intends to modify the accessed area. */
-{
- JDIMENSION end_row = start_row + num_rows;
- JDIMENSION undef_row;
-
- /* debugging check */
- if (end_row > ptr->rows_in_array || num_rows > ptr->maxaccess ||
- ptr->mem_buffer == NULL)
- ERREXIT(cinfo, JERR_BAD_VIRTUAL_ACCESS);
-
- /* Make the desired part of the virtual array accessible */
- if (start_row < ptr->cur_start_row ||
- end_row > ptr->cur_start_row+ptr->rows_in_mem) {
- if (! ptr->b_s_open)
- ERREXIT(cinfo, JERR_VIRTUAL_BUG);
- /* Flush old buffer contents if necessary */
- if (ptr->dirty) {
- do_sarray_io(cinfo, ptr, TRUE);
- ptr->dirty = FALSE;
- }
- /* Decide what part of virtual array to access.
- * Algorithm: if target address > current window, assume forward scan,
- * load starting at target address. If target address < current window,
- * assume backward scan, load so that target area is top of window.
- * Note that when switching from forward write to forward read, will have
- * start_row = 0, so the limiting case applies and we load from 0 anyway.
- */
- if (start_row > ptr->cur_start_row) {
- ptr->cur_start_row = start_row;
- } else {
- /* use long arithmetic here to avoid overflow & unsigned problems */
- long ltemp;
-
- ltemp = (long) end_row - (long) ptr->rows_in_mem;
- if (ltemp < 0)
- ltemp = 0; /* don't fall off front end of file */
- ptr->cur_start_row = (JDIMENSION) ltemp;
- }
- /* Read in the selected part of the array.
- * During the initial write pass, we will do no actual read
- * because the selected part is all undefined.
- */
- do_sarray_io(cinfo, ptr, FALSE);
- }
- /* Ensure the accessed part of the array is defined; prezero if needed.
- * To improve locality of access, we only prezero the part of the array
- * that the caller is about to access, not the entire in-memory array.
- */
- if (ptr->first_undef_row < end_row) {
- if (ptr->first_undef_row < start_row) {
- if (writable) /* writer skipped over a section of array */
- ERREXIT(cinfo, JERR_BAD_VIRTUAL_ACCESS);
- undef_row = start_row; /* but reader is allowed to read ahead */
- } else {
- undef_row = ptr->first_undef_row;
- }
- if (writable)
- ptr->first_undef_row = end_row;
- if (ptr->pre_zero) {
- size_t bytesperrow = (size_t) ptr->samplesperrow * SIZEOF(JSAMPLE);
- undef_row -= ptr->cur_start_row; /* make indexes relative to buffer */
- end_row -= ptr->cur_start_row;
- while (undef_row < end_row) {
- jzero_far((void FAR *) ptr->mem_buffer[undef_row], bytesperrow);
- undef_row++;
- }
- } else {
- if (! writable) /* reader looking at undefined data */
- ERREXIT(cinfo, JERR_BAD_VIRTUAL_ACCESS);
- }
- }
- /* Flag the buffer dirty if caller will write in it */
- if (writable)
- ptr->dirty = TRUE;
- /* Return address of proper part of the buffer */
- return ptr->mem_buffer + (start_row - ptr->cur_start_row);
-}
-
-
-METHODDEF(JBLOCKARRAY)
-access_virt_barray (j_common_ptr cinfo, jvirt_barray_ptr ptr,
- JDIMENSION start_row, JDIMENSION num_rows,
- boolean writable)
-/* Access the part of a virtual block array starting at start_row */
-/* and extending for num_rows rows. writable is true if */
-/* caller intends to modify the accessed area. */
-{
- JDIMENSION end_row = start_row + num_rows;
- JDIMENSION undef_row;
-
- /* debugging check */
- if (end_row > ptr->rows_in_array || num_rows > ptr->maxaccess ||
- ptr->mem_buffer == NULL)
- ERREXIT(cinfo, JERR_BAD_VIRTUAL_ACCESS);
-
- /* Make the desired part of the virtual array accessible */
- if (start_row < ptr->cur_start_row ||
- end_row > ptr->cur_start_row+ptr->rows_in_mem) {
- if (! ptr->b_s_open)
- ERREXIT(cinfo, JERR_VIRTUAL_BUG);
- /* Flush old buffer contents if necessary */
- if (ptr->dirty) {
- do_barray_io(cinfo, ptr, TRUE);
- ptr->dirty = FALSE;
- }
- /* Decide what part of virtual array to access.
- * Algorithm: if target address > current window, assume forward scan,
- * load starting at target address. If target address < current window,
- * assume backward scan, load so that target area is top of window.
- * Note that when switching from forward write to forward read, will have
- * start_row = 0, so the limiting case applies and we load from 0 anyway.
- */
- if (start_row > ptr->cur_start_row) {
- ptr->cur_start_row = start_row;
- } else {
- /* use long arithmetic here to avoid overflow & unsigned problems */
- long ltemp;
-
- ltemp = (long) end_row - (long) ptr->rows_in_mem;
- if (ltemp < 0)
- ltemp = 0; /* don't fall off front end of file */
- ptr->cur_start_row = (JDIMENSION) ltemp;
- }
- /* Read in the selected part of the array.
- * During the initial write pass, we will do no actual read
- * because the selected part is all undefined.
- */
- do_barray_io(cinfo, ptr, FALSE);
- }
- /* Ensure the accessed part of the array is defined; prezero if needed.
- * To improve locality of access, we only prezero the part of the array
- * that the caller is about to access, not the entire in-memory array.
- */
- if (ptr->first_undef_row < end_row) {
- if (ptr->first_undef_row < start_row) {
- if (writable) /* writer skipped over a section of array */
- ERREXIT(cinfo, JERR_BAD_VIRTUAL_ACCESS);
- undef_row = start_row; /* but reader is allowed to read ahead */
- } else {
- undef_row = ptr->first_undef_row;
- }
- if (writable)
- ptr->first_undef_row = end_row;
- if (ptr->pre_zero) {
- size_t bytesperrow = (size_t) ptr->blocksperrow * SIZEOF(JBLOCK);
- undef_row -= ptr->cur_start_row; /* make indexes relative to buffer */
- end_row -= ptr->cur_start_row;
- while (undef_row < end_row) {
- jzero_far((void FAR *) ptr->mem_buffer[undef_row], bytesperrow);
- undef_row++;
- }
- } else {
- if (! writable) /* reader looking at undefined data */
- ERREXIT(cinfo, JERR_BAD_VIRTUAL_ACCESS);
- }
- }
- /* Flag the buffer dirty if caller will write in it */
- if (writable)
- ptr->dirty = TRUE;
- /* Return address of proper part of the buffer */
- return ptr->mem_buffer + (start_row - ptr->cur_start_row);
-}
-
-
-/*
- * Release all objects belonging to a specified pool.
- */
-
-METHODDEF(void)
-free_pool (j_common_ptr cinfo, int pool_id)
-{
- my_mem_ptr mem = (my_mem_ptr) cinfo->mem;
- small_pool_ptr shdr_ptr;
- large_pool_ptr lhdr_ptr;
- size_t space_freed;
-
- if (pool_id < 0 || pool_id >= JPOOL_NUMPOOLS)
- ERREXIT1(cinfo, JERR_BAD_POOL_ID, pool_id); /* safety check */
-
-#ifdef MEM_STATS
- if (cinfo->err->trace_level > 1)
- print_mem_stats(cinfo, pool_id); /* print pool's memory usage statistics */
-#endif
-
- /* If freeing IMAGE pool, close any virtual arrays first */
- if (pool_id == JPOOL_IMAGE) {
- jvirt_sarray_ptr sptr;
- jvirt_barray_ptr bptr;
-
- for (sptr = mem->virt_sarray_list; sptr != NULL; sptr = sptr->next) {
- if (sptr->b_s_open) { /* there may be no backing store */
- sptr->b_s_open = FALSE; /* prevent recursive close if error */
- (*sptr->b_s_info.close_backing_store) (cinfo, & sptr->b_s_info);
- }
- }
- mem->virt_sarray_list = NULL;
- for (bptr = mem->virt_barray_list; bptr != NULL; bptr = bptr->next) {
- if (bptr->b_s_open) { /* there may be no backing store */
- bptr->b_s_open = FALSE; /* prevent recursive close if error */
- (*bptr->b_s_info.close_backing_store) (cinfo, & bptr->b_s_info);
- }
- }
- mem->virt_barray_list = NULL;
- }
-
- /* Release large objects */
- lhdr_ptr = mem->large_list[pool_id];
- mem->large_list[pool_id] = NULL;
-
- while (lhdr_ptr != NULL) {
- large_pool_ptr next_lhdr_ptr = lhdr_ptr->hdr.next;
- space_freed = lhdr_ptr->hdr.bytes_used +
- lhdr_ptr->hdr.bytes_left +
- SIZEOF(large_pool_hdr);
- jpeg_free_large(cinfo, (void FAR *) lhdr_ptr, space_freed);
- mem->total_space_allocated -= space_freed;
- lhdr_ptr = next_lhdr_ptr;
- }
-
- /* Release small objects */
- shdr_ptr = mem->small_list[pool_id];
- mem->small_list[pool_id] = NULL;
-
- while (shdr_ptr != NULL) {
- small_pool_ptr next_shdr_ptr = shdr_ptr->hdr.next;
- space_freed = shdr_ptr->hdr.bytes_used +
- shdr_ptr->hdr.bytes_left +
- SIZEOF(small_pool_hdr);
- jpeg_free_small(cinfo, (void *) shdr_ptr, space_freed);
- mem->total_space_allocated -= space_freed;
- shdr_ptr = next_shdr_ptr;
- }
-}
-
-
-/*
- * Close up shop entirely.
- * Note that this cannot be called unless cinfo->mem is non-NULL.
- */
-
-METHODDEF(void)
-self_destruct (j_common_ptr cinfo)
-{
- int pool;
-
- /* Close all backing store, release all memory.
- * Releasing pools in reverse order might help avoid fragmentation
- * with some (brain-damaged) malloc libraries.
- */
- for (pool = JPOOL_NUMPOOLS-1; pool >= JPOOL_PERMANENT; pool--) {
- free_pool(cinfo, pool);
- }
-
- /* Release the memory manager control block too. */
- jpeg_free_small(cinfo, (void *) cinfo->mem, SIZEOF(my_memory_mgr));
- cinfo->mem = NULL; /* ensures I will be called only once */
-
- jpeg_mem_term(cinfo); /* system-dependent cleanup */
-}
-
-
-/*
- * Memory manager initialization.
- * When this is called, only the error manager pointer is valid in cinfo!
- */
-
-GLOBAL(void)
-jinit_memory_mgr (j_common_ptr cinfo)
-{
- my_mem_ptr mem;
- long max_to_use;
- int pool;
- size_t test_mac;
-
- cinfo->mem = NULL; /* for safety if init fails */
-
- /* Check for configuration errors.
- * SIZEOF(ALIGN_TYPE) should be a power of 2; otherwise, it probably
- * doesn't reflect any real hardware alignment requirement.
- * The test is a little tricky: for X>0, X and X-1 have no one-bits
- * in common if and only if X is a power of 2, ie has only one one-bit.
- * Some compilers may give an "unreachable code" warning here; ignore it.
- */
- if ((SIZEOF(ALIGN_TYPE) & (SIZEOF(ALIGN_TYPE)-1)) != 0)
- ERREXIT(cinfo, JERR_BAD_ALIGN_TYPE);
- /* MAX_ALLOC_CHUNK must be representable as type size_t, and must be
- * a multiple of SIZEOF(ALIGN_TYPE).
- * Again, an "unreachable code" warning may be ignored here.
- * But a "constant too large" warning means you need to fix MAX_ALLOC_CHUNK.
- */
- test_mac = (size_t) MAX_ALLOC_CHUNK;
- if ((long) test_mac != MAX_ALLOC_CHUNK ||
- (MAX_ALLOC_CHUNK % SIZEOF(ALIGN_TYPE)) != 0)
- ERREXIT(cinfo, JERR_BAD_ALLOC_CHUNK);
-
- max_to_use = jpeg_mem_init(cinfo); /* system-dependent initialization */
-
- /* Attempt to allocate memory manager's control block */
- mem = (my_mem_ptr) jpeg_get_small(cinfo, SIZEOF(my_memory_mgr));
-
- if (mem == NULL) {
- jpeg_mem_term(cinfo); /* system-dependent cleanup */
- ERREXIT1(cinfo, JERR_OUT_OF_MEMORY, 0);
- }
-
- /* OK, fill in the method pointers */
- mem->pub.alloc_small = alloc_small;
- mem->pub.alloc_large = alloc_large;
- mem->pub.alloc_sarray = alloc_sarray;
- mem->pub.alloc_barray = alloc_barray;
- mem->pub.request_virt_sarray = request_virt_sarray;
- mem->pub.request_virt_barray = request_virt_barray;
- mem->pub.realize_virt_arrays = realize_virt_arrays;
- mem->pub.access_virt_sarray = access_virt_sarray;
- mem->pub.access_virt_barray = access_virt_barray;
- mem->pub.free_pool = free_pool;
- mem->pub.self_destruct = self_destruct;
-
- /* Make MAX_ALLOC_CHUNK accessible to other modules */
- mem->pub.max_alloc_chunk = MAX_ALLOC_CHUNK;
-
- /* Initialize working state */
- mem->pub.max_memory_to_use = max_to_use;
-
- for (pool = JPOOL_NUMPOOLS-1; pool >= JPOOL_PERMANENT; pool--) {
- mem->small_list[pool] = NULL;
- mem->large_list[pool] = NULL;
- }
- mem->virt_sarray_list = NULL;
- mem->virt_barray_list = NULL;
-
- mem->total_space_allocated = SIZEOF(my_memory_mgr);
-
- /* Declare ourselves open for business */
- cinfo->mem = & mem->pub;
-
- /* Check for an environment variable JPEGMEM; if found, override the
- * default max_memory setting from jpeg_mem_init. Note that the
- * surrounding application may again override this value.
- * If your system doesn't support getenv(), define NO_GETENV to disable
- * this feature.
- */
-#ifndef NO_GETENV
- { char * memenv;
-
- if ((memenv = getenv("JPEGMEM")) != NULL) {
- char ch = 'x';
-
- if (sscanf(memenv, "%ld%c", &max_to_use, &ch) > 0) {
- if (ch == 'm' || ch == 'M')
- max_to_use *= 1000L;
- mem->pub.max_memory_to_use = max_to_use * 1000L;
- }
- }
- }
-#endif
-
-}
-
-#endif //_FX_JPEG_TURBO_
+#if !defined(_FX_JPEG_TURBO_)
+/*
+ * jmemmgr.c
+ *
+ * Copyright (C) 1991-1997, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains the JPEG system-independent memory management
+ * routines. This code is usable across a wide variety of machines; most
+ * of the system dependencies have been isolated in a separate file.
+ * The major functions provided here are:
+ * * pool-based allocation and freeing of memory;
+ * * policy decisions about how to divide available memory among the
+ * virtual arrays;
+ * * control logic for swapping virtual arrays between main memory and
+ * backing storage.
+ * The separate system-dependent file provides the actual backing-storage
+ * access code, and it contains the policy decision about how much total
+ * main memory to use.
+ * This file is system-dependent in the sense that some of its functions
+ * are unnecessary in some systems. For example, if there is enough virtual
+ * memory so that backing storage will never be used, much of the virtual
+ * array control logic could be removed. (Of course, if you have that much
+ * memory then you shouldn't care about a little bit of unused code...)
+ */
+
+#define JPEG_INTERNALS
+#define AM_MEMORY_MANAGER /* we define jvirt_Xarray_control structs */
+#include "jinclude.h"
+#include "jpeglib.h"
+#include "jmemsys.h" /* import the system-dependent declarations */
+
+#define NO_GETENV /* XYQ: 2007-5-22 Don't use it */
+
+#ifndef NO_GETENV
+#ifndef HAVE_STDLIB_H /* <stdlib.h> should declare getenv() */
+extern char * getenv JPP((const char * name));
+#endif
+#endif
+
+
+/*
+ * Some important notes:
+ * The allocation routines provided here must never return NULL.
+ * They should exit to error_exit if unsuccessful.
+ *
+ * It's not a good idea to try to merge the sarray and barray routines,
+ * even though they are textually almost the same, because samples are
+ * usually stored as bytes while coefficients are shorts or ints. Thus,
+ * in machines where byte pointers have a different representation from
+ * word pointers, the resulting machine code could not be the same.
+ */
+
+
+/*
+ * Many machines require storage alignment: longs must start on 4-byte
+ * boundaries, doubles on 8-byte boundaries, etc. On such machines, malloc()
+ * always returns pointers that are multiples of the worst-case alignment
+ * requirement, and we had better do so too.
+ * There isn't any really portable way to determine the worst-case alignment
+ * requirement. This module assumes that the alignment requirement is
+ * multiples of sizeof(ALIGN_TYPE).
+ * By default, we define ALIGN_TYPE as double. This is necessary on some
+ * workstations (where doubles really do need 8-byte alignment) and will work
+ * fine on nearly everything. If your machine has lesser alignment needs,
+ * you can save a few bytes by making ALIGN_TYPE smaller.
+ * The only place I know of where this will NOT work is certain Macintosh
+ * 680x0 compilers that define double as a 10-byte IEEE extended float.
+ * Doing 10-byte alignment is counterproductive because longwords won't be
+ * aligned well. Put "#define ALIGN_TYPE long" in jconfig.h if you have
+ * such a compiler.
+ */
+
+#ifndef ALIGN_TYPE /* so can override from jconfig.h */
+#define ALIGN_TYPE double
+#endif
+
+
+/*
+ * We allocate objects from "pools", where each pool is gotten with a single
+ * request to jpeg_get_small() or jpeg_get_large(). There is no per-object
+ * overhead within a pool, except for alignment padding. Each pool has a
+ * header with a link to the next pool of the same class.
+ * Small and large pool headers are identical except that the latter's
+ * link pointer must be FAR on 80x86 machines.
+ * Notice that the "real" header fields are union'ed with a dummy ALIGN_TYPE
+ * field. This forces the compiler to make SIZEOF(small_pool_hdr) a multiple
+ * of the alignment requirement of ALIGN_TYPE.
+ */
+
+typedef union small_pool_struct * small_pool_ptr;
+
+typedef union small_pool_struct {
+ struct {
+ small_pool_ptr next; /* next in list of pools */
+ size_t bytes_used; /* how many bytes already used within pool */
+ size_t bytes_left; /* bytes still available in this pool */
+ } hdr;
+ ALIGN_TYPE dummy; /* included in union to ensure alignment */
+} small_pool_hdr;
+
+typedef union large_pool_struct FAR * large_pool_ptr;
+
+typedef union large_pool_struct {
+ struct {
+ large_pool_ptr next; /* next in list of pools */
+ size_t bytes_used; /* how many bytes already used within pool */
+ size_t bytes_left; /* bytes still available in this pool */
+ } hdr;
+ ALIGN_TYPE dummy; /* included in union to ensure alignment */
+} large_pool_hdr;
+
+
+/*
+ * Here is the full definition of a memory manager object.
+ */
+
+typedef struct {
+ struct jpeg_memory_mgr pub; /* public fields */
+
+ /* Each pool identifier (lifetime class) names a linked list of pools. */
+ small_pool_ptr small_list[JPOOL_NUMPOOLS];
+ large_pool_ptr large_list[JPOOL_NUMPOOLS];
+
+ /* Since we only have one lifetime class of virtual arrays, only one
+ * linked list is necessary (for each datatype). Note that the virtual
+ * array control blocks being linked together are actually stored somewhere
+ * in the small-pool list.
+ */
+ jvirt_sarray_ptr virt_sarray_list;
+ jvirt_barray_ptr virt_barray_list;
+
+ /* This counts total space obtained from jpeg_get_small/large */
+ long total_space_allocated;
+
+ /* alloc_sarray and alloc_barray set this value for use by virtual
+ * array routines.
+ */
+ JDIMENSION last_rowsperchunk; /* from most recent alloc_sarray/barray */
+} my_memory_mgr;
+
+typedef my_memory_mgr * my_mem_ptr;
+
+
+/*
+ * The control blocks for virtual arrays.
+ * Note that these blocks are allocated in the "small" pool area.
+ * System-dependent info for the associated backing store (if any) is hidden
+ * inside the backing_store_info struct.
+ */
+
+struct jvirt_sarray_control {
+ JSAMPARRAY mem_buffer; /* => the in-memory buffer */
+ JDIMENSION rows_in_array; /* total virtual array height */
+ JDIMENSION samplesperrow; /* width of array (and of memory buffer) */
+ JDIMENSION maxaccess; /* max rows accessed by access_virt_sarray */
+ JDIMENSION rows_in_mem; /* height of memory buffer */
+ JDIMENSION rowsperchunk; /* allocation chunk size in mem_buffer */
+ JDIMENSION cur_start_row; /* first logical row # in the buffer */
+ JDIMENSION first_undef_row; /* row # of first uninitialized row */
+ boolean pre_zero; /* pre-zero mode requested? */
+ boolean dirty; /* do current buffer contents need written? */
+ boolean b_s_open; /* is backing-store data valid? */
+ jvirt_sarray_ptr next; /* link to next virtual sarray control block */
+ backing_store_info b_s_info; /* System-dependent control info */
+};
+
+struct jvirt_barray_control {
+ JBLOCKARRAY mem_buffer; /* => the in-memory buffer */
+ JDIMENSION rows_in_array; /* total virtual array height */
+ JDIMENSION blocksperrow; /* width of array (and of memory buffer) */
+ JDIMENSION maxaccess; /* max rows accessed by access_virt_barray */
+ JDIMENSION rows_in_mem; /* height of memory buffer */
+ JDIMENSION rowsperchunk; /* allocation chunk size in mem_buffer */
+ JDIMENSION cur_start_row; /* first logical row # in the buffer */
+ JDIMENSION first_undef_row; /* row # of first uninitialized row */
+ boolean pre_zero; /* pre-zero mode requested? */
+ boolean dirty; /* do current buffer contents need written? */
+ boolean b_s_open; /* is backing-store data valid? */
+ jvirt_barray_ptr next; /* link to next virtual barray control block */
+ backing_store_info b_s_info; /* System-dependent control info */
+};
+
+
+#ifdef MEM_STATS /* optional extra stuff for statistics */
+
+LOCAL(void)
+print_mem_stats (j_common_ptr cinfo, int pool_id)
+{
+ my_mem_ptr mem = (my_mem_ptr) cinfo->mem;
+ small_pool_ptr shdr_ptr;
+ large_pool_ptr lhdr_ptr;
+
+ /* Since this is only a debugging stub, we can cheat a little by using
+ * fprintf directly rather than going through the trace message code.
+ * This is helpful because message parm array can't handle longs.
+ */
+ FXSYS_fprintf(stderr, "Freeing pool %d, total space = %ld\n",
+ pool_id, mem->total_space_allocated);
+
+ for (lhdr_ptr = mem->large_list[pool_id]; lhdr_ptr != NULL;
+ lhdr_ptr = lhdr_ptr->hdr.next) {
+ FXSYS_fprintf(stderr, " Large chunk used %ld\n",
+ (long) lhdr_ptr->hdr.bytes_used);
+ }
+
+ for (shdr_ptr = mem->small_list[pool_id]; shdr_ptr != NULL;
+ shdr_ptr = shdr_ptr->hdr.next) {
+ FXSYS_fprintf(stderr, " Small chunk used %ld free %ld\n",
+ (long) shdr_ptr->hdr.bytes_used,
+ (long) shdr_ptr->hdr.bytes_left);
+ }
+}
+
+#endif /* MEM_STATS */
+
+
+LOCAL(void)
+out_of_memory (j_common_ptr cinfo, int which)
+/* Report an out-of-memory error and stop execution */
+/* If we compiled MEM_STATS support, report alloc requests before dying */
+{
+#ifdef MEM_STATS
+ cinfo->err->trace_level = 2; /* force self_destruct to report stats */
+#endif
+ ERREXIT1(cinfo, JERR_OUT_OF_MEMORY, which);
+}
+
+
+/*
+ * Allocation of "small" objects.
+ *
+ * For these, we use pooled storage. When a new pool must be created,
+ * we try to get enough space for the current request plus a "slop" factor,
+ * where the slop will be the amount of leftover space in the new pool.
+ * The speed vs. space tradeoff is largely determined by the slop values.
+ * A different slop value is provided for each pool class (lifetime),
+ * and we also distinguish the first pool of a class from later ones.
+ * NOTE: the values given work fairly well on both 16- and 32-bit-int
+ * machines, but may be too small if longs are 64 bits or more.
+ */
+
+static const size_t first_pool_slop[JPOOL_NUMPOOLS] =
+{
+ 1600, /* first PERMANENT pool */
+ 16000 /* first IMAGE pool */
+};
+
+static const size_t extra_pool_slop[JPOOL_NUMPOOLS] =
+{
+ 0, /* additional PERMANENT pools */
+ 5000 /* additional IMAGE pools */
+};
+
+#define MIN_SLOP 50 /* greater than 0 to avoid futile looping */
+
+
+METHODDEF(void *)
+alloc_small (j_common_ptr cinfo, int pool_id, size_t sizeofobject)
+/* Allocate a "small" object */
+{
+ my_mem_ptr mem = (my_mem_ptr) cinfo->mem;
+ small_pool_ptr hdr_ptr, prev_hdr_ptr;
+ char * data_ptr;
+ size_t odd_bytes, min_request, slop;
+
+ /* Check for unsatisfiable request (do now to ensure no overflow below) */
+ if (sizeofobject > (size_t) (MAX_ALLOC_CHUNK-SIZEOF(small_pool_hdr)))
+ out_of_memory(cinfo, 1); /* request exceeds malloc's ability */
+
+ /* Round up the requested size to a multiple of SIZEOF(ALIGN_TYPE) */
+ odd_bytes = sizeofobject % SIZEOF(ALIGN_TYPE);
+ if (odd_bytes > 0)
+ sizeofobject += SIZEOF(ALIGN_TYPE) - odd_bytes;
+
+ /* See if space is available in any existing pool */
+ if (pool_id < 0 || pool_id >= JPOOL_NUMPOOLS)
+ ERREXIT1(cinfo, JERR_BAD_POOL_ID, pool_id); /* safety check */
+ prev_hdr_ptr = NULL;
+ hdr_ptr = mem->small_list[pool_id];
+ while (hdr_ptr != NULL) {
+ if (hdr_ptr->hdr.bytes_left >= sizeofobject)
+ break; /* found pool with enough space */
+ prev_hdr_ptr = hdr_ptr;
+ hdr_ptr = hdr_ptr->hdr.next;
+ }
+
+ /* Time to make a new pool? */
+ if (hdr_ptr == NULL) {
+ /* min_request is what we need now, slop is what will be leftover */
+ min_request = sizeofobject + SIZEOF(small_pool_hdr);
+ if (prev_hdr_ptr == NULL) /* first pool in class? */
+ slop = first_pool_slop[pool_id];
+ else
+ slop = extra_pool_slop[pool_id];
+ /* Don't ask for more than MAX_ALLOC_CHUNK */
+ if (slop > (size_t) (MAX_ALLOC_CHUNK-min_request))
+ slop = (size_t) (MAX_ALLOC_CHUNK-min_request);
+ /* Try to get space, if fail reduce slop and try again */
+ for (;;) {
+ hdr_ptr = (small_pool_ptr) jpeg_get_small(cinfo, min_request + slop);
+ if (hdr_ptr != NULL)
+ break;
+ slop /= 2;
+ if (slop < MIN_SLOP) /* give up when it gets real small */
+ out_of_memory(cinfo, 2); /* jpeg_get_small failed */
+ }
+ mem->total_space_allocated += min_request + slop;
+ /* Success, initialize the new pool header and add to end of list */
+ hdr_ptr->hdr.next = NULL;
+ hdr_ptr->hdr.bytes_used = 0;
+ hdr_ptr->hdr.bytes_left = sizeofobject + slop;
+ if (prev_hdr_ptr == NULL) /* first pool in class? */
+ mem->small_list[pool_id] = hdr_ptr;
+ else
+ prev_hdr_ptr->hdr.next = hdr_ptr;
+ }
+
+ /* OK, allocate the object from the current pool */
+ data_ptr = (char *) (hdr_ptr + 1); /* point to first data byte in pool */
+ data_ptr += hdr_ptr->hdr.bytes_used; /* point to place for object */
+ hdr_ptr->hdr.bytes_used += sizeofobject;
+ hdr_ptr->hdr.bytes_left -= sizeofobject;
+
+ return (void *) data_ptr;
+}
+
+
+/*
+ * Allocation of "large" objects.
+ *
+ * The external semantics of these are the same as "small" objects,
+ * except that FAR pointers are used on 80x86. However the pool
+ * management heuristics are quite different. We assume that each
+ * request is large enough that it may as well be passed directly to
+ * jpeg_get_large; the pool management just links everything together
+ * so that we can free it all on demand.
+ * Note: the major use of "large" objects is in JSAMPARRAY and JBLOCKARRAY
+ * structures. The routines that create these structures (see below)
+ * deliberately bunch rows together to ensure a large request size.
+ */
+
+METHODDEF(void FAR *)
+alloc_large (j_common_ptr cinfo, int pool_id, size_t sizeofobject)
+/* Allocate a "large" object */
+{
+ my_mem_ptr mem = (my_mem_ptr) cinfo->mem;
+ large_pool_ptr hdr_ptr;
+ size_t odd_bytes;
+
+ /* Check for unsatisfiable request (do now to ensure no overflow below) */
+ if (sizeofobject > (size_t) (MAX_ALLOC_CHUNK-SIZEOF(large_pool_hdr)))
+ out_of_memory(cinfo, 3); /* request exceeds malloc's ability */
+
+ /* Round up the requested size to a multiple of SIZEOF(ALIGN_TYPE) */
+ odd_bytes = sizeofobject % SIZEOF(ALIGN_TYPE);
+ if (odd_bytes > 0)
+ sizeofobject += SIZEOF(ALIGN_TYPE) - odd_bytes;
+
+ /* Always make a new pool */
+ if (pool_id < 0 || pool_id >= JPOOL_NUMPOOLS)
+ ERREXIT1(cinfo, JERR_BAD_POOL_ID, pool_id); /* safety check */
+
+ hdr_ptr = (large_pool_ptr) jpeg_get_large(cinfo, sizeofobject +
+ SIZEOF(large_pool_hdr));
+ if (hdr_ptr == NULL)
+ out_of_memory(cinfo, 4); /* jpeg_get_large failed */
+ mem->total_space_allocated += sizeofobject + SIZEOF(large_pool_hdr);
+
+ /* Success, initialize the new pool header and add to list */
+ hdr_ptr->hdr.next = mem->large_list[pool_id];
+ /* We maintain space counts in each pool header for statistical purposes,
+ * even though they are not needed for allocation.
+ */
+ hdr_ptr->hdr.bytes_used = sizeofobject;
+ hdr_ptr->hdr.bytes_left = 0;
+ mem->large_list[pool_id] = hdr_ptr;
+
+ return (void FAR *) (hdr_ptr + 1); /* point to first data byte in pool */
+}
+
+
+/*
+ * Creation of 2-D sample arrays.
+ * The pointers are in near heap, the samples themselves in FAR heap.
+ *
+ * To minimize allocation overhead and to allow I/O of large contiguous
+ * blocks, we allocate the sample rows in groups of as many rows as possible
+ * without exceeding MAX_ALLOC_CHUNK total bytes per allocation request.
+ * NB: the virtual array control routines, later in this file, know about
+ * this chunking of rows. The rowsperchunk value is left in the mem manager
+ * object so that it can be saved away if this sarray is the workspace for
+ * a virtual array.
+ */
+
+METHODDEF(JSAMPARRAY)
+alloc_sarray (j_common_ptr cinfo, int pool_id,
+ JDIMENSION samplesperrow, JDIMENSION numrows)
+/* Allocate a 2-D sample array */
+{
+ my_mem_ptr mem = (my_mem_ptr) cinfo->mem;
+ JSAMPARRAY result;
+ JSAMPROW workspace;
+ JDIMENSION rowsperchunk, currow, i;
+ long ltemp;
+
+ /* Calculate max # of rows allowed in one allocation chunk */
+ ltemp = (MAX_ALLOC_CHUNK-SIZEOF(large_pool_hdr)) /
+ ((long) samplesperrow * SIZEOF(JSAMPLE));
+ if (ltemp <= 0)
+ ERREXIT(cinfo, JERR_WIDTH_OVERFLOW);
+ if (ltemp < (long) numrows)
+ rowsperchunk = (JDIMENSION) ltemp;
+ else
+ rowsperchunk = numrows;
+ mem->last_rowsperchunk = rowsperchunk;
+
+ /* Get space for row pointers (small object) */
+ result = (JSAMPARRAY) alloc_small(cinfo, pool_id,
+ (size_t) (numrows * SIZEOF(JSAMPROW)));
+
+ /* Get the rows themselves (large objects) */
+ currow = 0;
+ while (currow < numrows) {
+ rowsperchunk = MIN(rowsperchunk, numrows - currow);
+ workspace = (JSAMPROW) alloc_large(cinfo, pool_id,
+ (size_t) ((size_t) rowsperchunk * (size_t) samplesperrow
+ * SIZEOF(JSAMPLE)));
+ for (i = rowsperchunk; i > 0; i--) {
+ result[currow++] = workspace;
+ workspace += samplesperrow;
+ }
+ }
+
+ return result;
+}
+
+
+/*
+ * Creation of 2-D coefficient-block arrays.
+ * This is essentially the same as the code for sample arrays, above.
+ */
+
+METHODDEF(JBLOCKARRAY)
+alloc_barray (j_common_ptr cinfo, int pool_id,
+ JDIMENSION blocksperrow, JDIMENSION numrows)
+/* Allocate a 2-D coefficient-block array */
+{
+ my_mem_ptr mem = (my_mem_ptr) cinfo->mem;
+ JBLOCKARRAY result;
+ JBLOCKROW workspace;
+ JDIMENSION rowsperchunk, currow, i;
+ long ltemp;
+
+ /* Calculate max # of rows allowed in one allocation chunk */
+ ltemp = (MAX_ALLOC_CHUNK-SIZEOF(large_pool_hdr)) /
+ ((long) blocksperrow * SIZEOF(JBLOCK));
+ if (ltemp <= 0)
+ ERREXIT(cinfo, JERR_WIDTH_OVERFLOW);
+ if (ltemp < (long) numrows)
+ rowsperchunk = (JDIMENSION) ltemp;
+ else
+ rowsperchunk = numrows;
+ mem->last_rowsperchunk = rowsperchunk;
+
+ /* Get space for row pointers (small object) */
+ result = (JBLOCKARRAY) alloc_small(cinfo, pool_id,
+ (size_t) (numrows * SIZEOF(JBLOCKROW)));
+
+ /* Get the rows themselves (large objects) */
+ currow = 0;
+ while (currow < numrows) {
+ rowsperchunk = MIN(rowsperchunk, numrows - currow);
+ workspace = (JBLOCKROW) alloc_large(cinfo, pool_id,
+ (size_t) ((size_t) rowsperchunk * (size_t) blocksperrow
+ * SIZEOF(JBLOCK)));
+ for (i = rowsperchunk; i > 0; i--) {
+ result[currow++] = workspace;
+ workspace += blocksperrow;
+ }
+ }
+
+ return result;
+}
+
+
+/*
+ * About virtual array management:
+ *
+ * The above "normal" array routines are only used to allocate strip buffers
+ * (as wide as the image, but just a few rows high). Full-image-sized buffers
+ * are handled as "virtual" arrays. The array is still accessed a strip at a
+ * time, but the memory manager must save the whole array for repeated
+ * accesses. The intended implementation is that there is a strip buffer in
+ * memory (as high as is possible given the desired memory limit), plus a
+ * backing file that holds the rest of the array.
+ *
+ * The request_virt_array routines are told the total size of the image and
+ * the maximum number of rows that will be accessed at once. The in-memory
+ * buffer must be at least as large as the maxaccess value.
+ *
+ * The request routines create control blocks but not the in-memory buffers.
+ * That is postponed until realize_virt_arrays is called. At that time the
+ * total amount of space needed is known (approximately, anyway), so free
+ * memory can be divided up fairly.
+ *
+ * The access_virt_array routines are responsible for making a specific strip
+ * area accessible (after reading or writing the backing file, if necessary).
+ * Note that the access routines are told whether the caller intends to modify
+ * the accessed strip; during a read-only pass this saves having to rewrite
+ * data to disk. The access routines are also responsible for pre-zeroing
+ * any newly accessed rows, if pre-zeroing was requested.
+ *
+ * In current usage, the access requests are usually for nonoverlapping
+ * strips; that is, successive access start_row numbers differ by exactly
+ * num_rows = maxaccess. This means we can get good performance with simple
+ * buffer dump/reload logic, by making the in-memory buffer be a multiple
+ * of the access height; then there will never be accesses across bufferload
+ * boundaries. The code will still work with overlapping access requests,
+ * but it doesn't handle bufferload overlaps very efficiently.
+ */
+
+
+METHODDEF(jvirt_sarray_ptr)
+request_virt_sarray (j_common_ptr cinfo, int pool_id, boolean pre_zero,
+ JDIMENSION samplesperrow, JDIMENSION numrows,
+ JDIMENSION maxaccess)
+/* Request a virtual 2-D sample array */
+{
+ my_mem_ptr mem = (my_mem_ptr) cinfo->mem;
+ jvirt_sarray_ptr result;
+
+ /* Only IMAGE-lifetime virtual arrays are currently supported */
+ if (pool_id != JPOOL_IMAGE)
+ ERREXIT1(cinfo, JERR_BAD_POOL_ID, pool_id); /* safety check */
+
+ /* get control block */
+ result = (jvirt_sarray_ptr) alloc_small(cinfo, pool_id,
+ SIZEOF(struct jvirt_sarray_control));
+
+ result->mem_buffer = NULL; /* marks array not yet realized */
+ result->rows_in_array = numrows;
+ result->samplesperrow = samplesperrow;
+ result->maxaccess = maxaccess;
+ result->pre_zero = pre_zero;
+ result->b_s_open = FALSE; /* no associated backing-store object */
+ result->next = mem->virt_sarray_list; /* add to list of virtual arrays */
+ mem->virt_sarray_list = result;
+
+ return result;
+}
+
+
+METHODDEF(jvirt_barray_ptr)
+request_virt_barray (j_common_ptr cinfo, int pool_id, boolean pre_zero,
+ JDIMENSION blocksperrow, JDIMENSION numrows,
+ JDIMENSION maxaccess)
+/* Request a virtual 2-D coefficient-block array */
+{
+ my_mem_ptr mem = (my_mem_ptr) cinfo->mem;
+ jvirt_barray_ptr result;
+
+ /* Only IMAGE-lifetime virtual arrays are currently supported */
+ if (pool_id != JPOOL_IMAGE)
+ ERREXIT1(cinfo, JERR_BAD_POOL_ID, pool_id); /* safety check */
+
+ /* get control block */
+ result = (jvirt_barray_ptr) alloc_small(cinfo, pool_id,
+ SIZEOF(struct jvirt_barray_control));
+
+ result->mem_buffer = NULL; /* marks array not yet realized */
+ result->rows_in_array = numrows;
+ result->blocksperrow = blocksperrow;
+ result->maxaccess = maxaccess;
+ result->pre_zero = pre_zero;
+ result->b_s_open = FALSE; /* no associated backing-store object */
+ result->next = mem->virt_barray_list; /* add to list of virtual arrays */
+ mem->virt_barray_list = result;
+
+ return result;
+}
+
+
+METHODDEF(void)
+realize_virt_arrays (j_common_ptr cinfo)
+/* Allocate the in-memory buffers for any unrealized virtual arrays */
+{
+ my_mem_ptr mem = (my_mem_ptr) cinfo->mem;
+ long space_per_minheight, maximum_space, avail_mem;
+ long minheights, max_minheights;
+ jvirt_sarray_ptr sptr;
+ jvirt_barray_ptr bptr;
+
+ /* Compute the minimum space needed (maxaccess rows in each buffer)
+ * and the maximum space needed (full image height in each buffer).
+ * These may be of use to the system-dependent jpeg_mem_available routine.
+ */
+ space_per_minheight = 0;
+ maximum_space = 0;
+ for (sptr = mem->virt_sarray_list; sptr != NULL; sptr = sptr->next) {
+ if (sptr->mem_buffer == NULL) { /* if not realized yet */
+ space_per_minheight += (long) sptr->maxaccess *
+ (long) sptr->samplesperrow * SIZEOF(JSAMPLE);
+ maximum_space += (long) sptr->rows_in_array *
+ (long) sptr->samplesperrow * SIZEOF(JSAMPLE);
+ }
+ }
+ for (bptr = mem->virt_barray_list; bptr != NULL; bptr = bptr->next) {
+ if (bptr->mem_buffer == NULL) { /* if not realized yet */
+ space_per_minheight += (long) bptr->maxaccess *
+ (long) bptr->blocksperrow * SIZEOF(JBLOCK);
+ maximum_space += (long) bptr->rows_in_array *
+ (long) bptr->blocksperrow * SIZEOF(JBLOCK);
+ }
+ }
+
+ if (space_per_minheight <= 0)
+ return; /* no unrealized arrays, no work */
+
+ /* Determine amount of memory to actually use; this is system-dependent. */
+ avail_mem = jpeg_mem_available(cinfo, space_per_minheight, maximum_space,
+ mem->total_space_allocated);
+
+ /* If the maximum space needed is available, make all the buffers full
+ * height; otherwise parcel it out with the same number of minheights
+ * in each buffer.
+ */
+ if (avail_mem >= maximum_space)
+ max_minheights = 1000000000L;
+ else {
+ max_minheights = avail_mem / space_per_minheight;
+ /* If there doesn't seem to be enough space, try to get the minimum
+ * anyway. This allows a "stub" implementation of jpeg_mem_available().
+ */
+ if (max_minheights <= 0)
+ max_minheights = 1;
+ }
+
+ /* Allocate the in-memory buffers and initialize backing store as needed. */
+
+ for (sptr = mem->virt_sarray_list; sptr != NULL; sptr = sptr->next) {
+ if (sptr->mem_buffer == NULL) { /* if not realized yet */
+ minheights = ((long) sptr->rows_in_array - 1L) / sptr->maxaccess + 1L;
+ if (minheights <= max_minheights) {
+ /* This buffer fits in memory */
+ sptr->rows_in_mem = sptr->rows_in_array;
+ } else {
+ /* It doesn't fit in memory, create backing store. */
+ sptr->rows_in_mem = (JDIMENSION) (max_minheights * sptr->maxaccess);
+ jpeg_open_backing_store(cinfo, & sptr->b_s_info,
+ (long) sptr->rows_in_array *
+ (long) sptr->samplesperrow *
+ (long) SIZEOF(JSAMPLE));
+ sptr->b_s_open = TRUE;
+ }
+ sptr->mem_buffer = alloc_sarray(cinfo, JPOOL_IMAGE,
+ sptr->samplesperrow, sptr->rows_in_mem);
+ sptr->rowsperchunk = mem->last_rowsperchunk;
+ sptr->cur_start_row = 0;
+ sptr->first_undef_row = 0;
+ sptr->dirty = FALSE;
+ }
+ }
+
+ for (bptr = mem->virt_barray_list; bptr != NULL; bptr = bptr->next) {
+ if (bptr->mem_buffer == NULL) { /* if not realized yet */
+ minheights = ((long) bptr->rows_in_array - 1L) / bptr->maxaccess + 1L;
+ if (minheights <= max_minheights) {
+ /* This buffer fits in memory */
+ bptr->rows_in_mem = bptr->rows_in_array;
+ } else {
+ /* It doesn't fit in memory, create backing store. */
+ bptr->rows_in_mem = (JDIMENSION) (max_minheights * bptr->maxaccess);
+ jpeg_open_backing_store(cinfo, & bptr->b_s_info,
+ (long) bptr->rows_in_array *
+ (long) bptr->blocksperrow *
+ (long) SIZEOF(JBLOCK));
+ bptr->b_s_open = TRUE;
+ }
+ bptr->mem_buffer = alloc_barray(cinfo, JPOOL_IMAGE,
+ bptr->blocksperrow, bptr->rows_in_mem);
+ bptr->rowsperchunk = mem->last_rowsperchunk;
+ bptr->cur_start_row = 0;
+ bptr->first_undef_row = 0;
+ bptr->dirty = FALSE;
+ }
+ }
+}
+
+
+LOCAL(void)
+do_sarray_io (j_common_ptr cinfo, jvirt_sarray_ptr ptr, boolean writing)
+/* Do backing store read or write of a virtual sample array */
+{
+ long bytesperrow, file_offset, byte_count, rows, thisrow, i;
+
+ bytesperrow = (long) ptr->samplesperrow * SIZEOF(JSAMPLE);
+ file_offset = ptr->cur_start_row * bytesperrow;
+ /* Loop to read or write each allocation chunk in mem_buffer */
+ for (i = 0; i < (long) ptr->rows_in_mem; i += ptr->rowsperchunk) {
+ /* One chunk, but check for short chunk at end of buffer */
+ rows = MIN((long) ptr->rowsperchunk, (long) ptr->rows_in_mem - i);
+ /* Transfer no more than is currently defined */
+ thisrow = (long) ptr->cur_start_row + i;
+ rows = MIN(rows, (long) ptr->first_undef_row - thisrow);
+ /* Transfer no more than fits in file */
+ rows = MIN(rows, (long) ptr->rows_in_array - thisrow);
+ if (rows <= 0) /* this chunk might be past end of file! */
+ break;
+ byte_count = rows * bytesperrow;
+ if (writing)
+ (*ptr->b_s_info.write_backing_store) (cinfo, & ptr->b_s_info,
+ (void FAR *) ptr->mem_buffer[i],
+ file_offset, byte_count);
+ else
+ (*ptr->b_s_info.read_backing_store) (cinfo, & ptr->b_s_info,
+ (void FAR *) ptr->mem_buffer[i],
+ file_offset, byte_count);
+ file_offset += byte_count;
+ }
+}
+
+
+LOCAL(void)
+do_barray_io (j_common_ptr cinfo, jvirt_barray_ptr ptr, boolean writing)
+/* Do backing store read or write of a virtual coefficient-block array */
+{
+ long bytesperrow, file_offset, byte_count, rows, thisrow, i;
+
+ bytesperrow = (long) ptr->blocksperrow * SIZEOF(JBLOCK);
+ file_offset = ptr->cur_start_row * bytesperrow;
+ /* Loop to read or write each allocation chunk in mem_buffer */
+ for (i = 0; i < (long) ptr->rows_in_mem; i += ptr->rowsperchunk) {
+ /* One chunk, but check for short chunk at end of buffer */
+ rows = MIN((long) ptr->rowsperchunk, (long) ptr->rows_in_mem - i);
+ /* Transfer no more than is currently defined */
+ thisrow = (long) ptr->cur_start_row + i;
+ rows = MIN(rows, (long) ptr->first_undef_row - thisrow);
+ /* Transfer no more than fits in file */
+ rows = MIN(rows, (long) ptr->rows_in_array - thisrow);
+ if (rows <= 0) /* this chunk might be past end of file! */
+ break;
+ byte_count = rows * bytesperrow;
+ if (writing)
+ (*ptr->b_s_info.write_backing_store) (cinfo, & ptr->b_s_info,
+ (void FAR *) ptr->mem_buffer[i],
+ file_offset, byte_count);
+ else
+ (*ptr->b_s_info.read_backing_store) (cinfo, & ptr->b_s_info,
+ (void FAR *) ptr->mem_buffer[i],
+ file_offset, byte_count);
+ file_offset += byte_count;
+ }
+}
+
+
+METHODDEF(JSAMPARRAY)
+access_virt_sarray (j_common_ptr cinfo, jvirt_sarray_ptr ptr,
+ JDIMENSION start_row, JDIMENSION num_rows,
+ boolean writable)
+/* Access the part of a virtual sample array starting at start_row */
+/* and extending for num_rows rows. writable is true if */
+/* caller intends to modify the accessed area. */
+{
+ JDIMENSION end_row = start_row + num_rows;
+ JDIMENSION undef_row;
+
+ /* debugging check */
+ if (end_row > ptr->rows_in_array || num_rows > ptr->maxaccess ||
+ ptr->mem_buffer == NULL)
+ ERREXIT(cinfo, JERR_BAD_VIRTUAL_ACCESS);
+
+ /* Make the desired part of the virtual array accessible */
+ if (start_row < ptr->cur_start_row ||
+ end_row > ptr->cur_start_row+ptr->rows_in_mem) {
+ if (! ptr->b_s_open)
+ ERREXIT(cinfo, JERR_VIRTUAL_BUG);
+ /* Flush old buffer contents if necessary */
+ if (ptr->dirty) {
+ do_sarray_io(cinfo, ptr, TRUE);
+ ptr->dirty = FALSE;
+ }
+ /* Decide what part of virtual array to access.
+ * Algorithm: if target address > current window, assume forward scan,
+ * load starting at target address. If target address < current window,
+ * assume backward scan, load so that target area is top of window.
+ * Note that when switching from forward write to forward read, will have
+ * start_row = 0, so the limiting case applies and we load from 0 anyway.
+ */
+ if (start_row > ptr->cur_start_row) {
+ ptr->cur_start_row = start_row;
+ } else {
+ /* use long arithmetic here to avoid overflow & unsigned problems */
+ long ltemp;
+
+ ltemp = (long) end_row - (long) ptr->rows_in_mem;
+ if (ltemp < 0)
+ ltemp = 0; /* don't fall off front end of file */
+ ptr->cur_start_row = (JDIMENSION) ltemp;
+ }
+ /* Read in the selected part of the array.
+ * During the initial write pass, we will do no actual read
+ * because the selected part is all undefined.
+ */
+ do_sarray_io(cinfo, ptr, FALSE);
+ }
+ /* Ensure the accessed part of the array is defined; prezero if needed.
+ * To improve locality of access, we only prezero the part of the array
+ * that the caller is about to access, not the entire in-memory array.
+ */
+ if (ptr->first_undef_row < end_row) {
+ if (ptr->first_undef_row < start_row) {
+ if (writable) /* writer skipped over a section of array */
+ ERREXIT(cinfo, JERR_BAD_VIRTUAL_ACCESS);
+ undef_row = start_row; /* but reader is allowed to read ahead */
+ } else {
+ undef_row = ptr->first_undef_row;
+ }
+ if (writable)
+ ptr->first_undef_row = end_row;
+ if (ptr->pre_zero) {
+ size_t bytesperrow = (size_t) ptr->samplesperrow * SIZEOF(JSAMPLE);
+ undef_row -= ptr->cur_start_row; /* make indexes relative to buffer */
+ end_row -= ptr->cur_start_row;
+ while (undef_row < end_row) {
+ jzero_far((void FAR *) ptr->mem_buffer[undef_row], bytesperrow);
+ undef_row++;
+ }
+ } else {
+ if (! writable) /* reader looking at undefined data */
+ ERREXIT(cinfo, JERR_BAD_VIRTUAL_ACCESS);
+ }
+ }
+ /* Flag the buffer dirty if caller will write in it */
+ if (writable)
+ ptr->dirty = TRUE;
+ /* Return address of proper part of the buffer */
+ return ptr->mem_buffer + (start_row - ptr->cur_start_row);
+}
+
+
+METHODDEF(JBLOCKARRAY)
+access_virt_barray (j_common_ptr cinfo, jvirt_barray_ptr ptr,
+ JDIMENSION start_row, JDIMENSION num_rows,
+ boolean writable)
+/* Access the part of a virtual block array starting at start_row */
+/* and extending for num_rows rows. writable is true if */
+/* caller intends to modify the accessed area. */
+{
+ JDIMENSION end_row = start_row + num_rows;
+ JDIMENSION undef_row;
+
+ /* debugging check */
+ if (end_row > ptr->rows_in_array || num_rows > ptr->maxaccess ||
+ ptr->mem_buffer == NULL)
+ ERREXIT(cinfo, JERR_BAD_VIRTUAL_ACCESS);
+
+ /* Make the desired part of the virtual array accessible */
+ if (start_row < ptr->cur_start_row ||
+ end_row > ptr->cur_start_row+ptr->rows_in_mem) {
+ if (! ptr->b_s_open)
+ ERREXIT(cinfo, JERR_VIRTUAL_BUG);
+ /* Flush old buffer contents if necessary */
+ if (ptr->dirty) {
+ do_barray_io(cinfo, ptr, TRUE);
+ ptr->dirty = FALSE;
+ }
+ /* Decide what part of virtual array to access.
+ * Algorithm: if target address > current window, assume forward scan,
+ * load starting at target address. If target address < current window,
+ * assume backward scan, load so that target area is top of window.
+ * Note that when switching from forward write to forward read, will have
+ * start_row = 0, so the limiting case applies and we load from 0 anyway.
+ */
+ if (start_row > ptr->cur_start_row) {
+ ptr->cur_start_row = start_row;
+ } else {
+ /* use long arithmetic here to avoid overflow & unsigned problems */
+ long ltemp;
+
+ ltemp = (long) end_row - (long) ptr->rows_in_mem;
+ if (ltemp < 0)
+ ltemp = 0; /* don't fall off front end of file */
+ ptr->cur_start_row = (JDIMENSION) ltemp;
+ }
+ /* Read in the selected part of the array.
+ * During the initial write pass, we will do no actual read
+ * because the selected part is all undefined.
+ */
+ do_barray_io(cinfo, ptr, FALSE);
+ }
+ /* Ensure the accessed part of the array is defined; prezero if needed.
+ * To improve locality of access, we only prezero the part of the array
+ * that the caller is about to access, not the entire in-memory array.
+ */
+ if (ptr->first_undef_row < end_row) {
+ if (ptr->first_undef_row < start_row) {
+ if (writable) /* writer skipped over a section of array */
+ ERREXIT(cinfo, JERR_BAD_VIRTUAL_ACCESS);
+ undef_row = start_row; /* but reader is allowed to read ahead */
+ } else {
+ undef_row = ptr->first_undef_row;
+ }
+ if (writable)
+ ptr->first_undef_row = end_row;
+ if (ptr->pre_zero) {
+ size_t bytesperrow = (size_t) ptr->blocksperrow * SIZEOF(JBLOCK);
+ undef_row -= ptr->cur_start_row; /* make indexes relative to buffer */
+ end_row -= ptr->cur_start_row;
+ while (undef_row < end_row) {
+ jzero_far((void FAR *) ptr->mem_buffer[undef_row], bytesperrow);
+ undef_row++;
+ }
+ } else {
+ if (! writable) /* reader looking at undefined data */
+ ERREXIT(cinfo, JERR_BAD_VIRTUAL_ACCESS);
+ }
+ }
+ /* Flag the buffer dirty if caller will write in it */
+ if (writable)
+ ptr->dirty = TRUE;
+ /* Return address of proper part of the buffer */
+ return ptr->mem_buffer + (start_row - ptr->cur_start_row);
+}
+
+
+/*
+ * Release all objects belonging to a specified pool.
+ */
+
+METHODDEF(void)
+free_pool (j_common_ptr cinfo, int pool_id)
+{
+ my_mem_ptr mem = (my_mem_ptr) cinfo->mem;
+ small_pool_ptr shdr_ptr;
+ large_pool_ptr lhdr_ptr;
+ size_t space_freed;
+
+ if (pool_id < 0 || pool_id >= JPOOL_NUMPOOLS)
+ ERREXIT1(cinfo, JERR_BAD_POOL_ID, pool_id); /* safety check */
+
+#ifdef MEM_STATS
+ if (cinfo->err->trace_level > 1)
+ print_mem_stats(cinfo, pool_id); /* print pool's memory usage statistics */
+#endif
+
+ /* If freeing IMAGE pool, close any virtual arrays first */
+ if (pool_id == JPOOL_IMAGE) {
+ jvirt_sarray_ptr sptr;
+ jvirt_barray_ptr bptr;
+
+ for (sptr = mem->virt_sarray_list; sptr != NULL; sptr = sptr->next) {
+ if (sptr->b_s_open) { /* there may be no backing store */
+ sptr->b_s_open = FALSE; /* prevent recursive close if error */
+ (*sptr->b_s_info.close_backing_store) (cinfo, & sptr->b_s_info);
+ }
+ }
+ mem->virt_sarray_list = NULL;
+ for (bptr = mem->virt_barray_list; bptr != NULL; bptr = bptr->next) {
+ if (bptr->b_s_open) { /* there may be no backing store */
+ bptr->b_s_open = FALSE; /* prevent recursive close if error */
+ (*bptr->b_s_info.close_backing_store) (cinfo, & bptr->b_s_info);
+ }
+ }
+ mem->virt_barray_list = NULL;
+ }
+
+ /* Release large objects */
+ lhdr_ptr = mem->large_list[pool_id];
+ mem->large_list[pool_id] = NULL;
+
+ while (lhdr_ptr != NULL) {
+ large_pool_ptr next_lhdr_ptr = lhdr_ptr->hdr.next;
+ space_freed = lhdr_ptr->hdr.bytes_used +
+ lhdr_ptr->hdr.bytes_left +
+ SIZEOF(large_pool_hdr);
+ jpeg_free_large(cinfo, (void FAR *) lhdr_ptr, space_freed);
+ mem->total_space_allocated -= space_freed;
+ lhdr_ptr = next_lhdr_ptr;
+ }
+
+ /* Release small objects */
+ shdr_ptr = mem->small_list[pool_id];
+ mem->small_list[pool_id] = NULL;
+
+ while (shdr_ptr != NULL) {
+ small_pool_ptr next_shdr_ptr = shdr_ptr->hdr.next;
+ space_freed = shdr_ptr->hdr.bytes_used +
+ shdr_ptr->hdr.bytes_left +
+ SIZEOF(small_pool_hdr);
+ jpeg_free_small(cinfo, (void *) shdr_ptr, space_freed);
+ mem->total_space_allocated -= space_freed;
+ shdr_ptr = next_shdr_ptr;
+ }
+}
+
+
+/*
+ * Close up shop entirely.
+ * Note that this cannot be called unless cinfo->mem is non-NULL.
+ */
+
+METHODDEF(void)
+self_destruct (j_common_ptr cinfo)
+{
+ int pool;
+
+ /* Close all backing store, release all memory.
+ * Releasing pools in reverse order might help avoid fragmentation
+ * with some (brain-damaged) malloc libraries.
+ */
+ for (pool = JPOOL_NUMPOOLS-1; pool >= JPOOL_PERMANENT; pool--) {
+ free_pool(cinfo, pool);
+ }
+
+ /* Release the memory manager control block too. */
+ jpeg_free_small(cinfo, (void *) cinfo->mem, SIZEOF(my_memory_mgr));
+ cinfo->mem = NULL; /* ensures I will be called only once */
+
+ jpeg_mem_term(cinfo); /* system-dependent cleanup */
+}
+
+
+/*
+ * Memory manager initialization.
+ * When this is called, only the error manager pointer is valid in cinfo!
+ */
+
+GLOBAL(void)
+jinit_memory_mgr (j_common_ptr cinfo)
+{
+ my_mem_ptr mem;
+ long max_to_use;
+ int pool;
+ size_t test_mac;
+
+ cinfo->mem = NULL; /* for safety if init fails */
+
+ /* Check for configuration errors.
+ * SIZEOF(ALIGN_TYPE) should be a power of 2; otherwise, it probably
+ * doesn't reflect any real hardware alignment requirement.
+ * The test is a little tricky: for X>0, X and X-1 have no one-bits
+ * in common if and only if X is a power of 2, ie has only one one-bit.
+ * Some compilers may give an "unreachable code" warning here; ignore it.
+ */
+ if ((SIZEOF(ALIGN_TYPE) & (SIZEOF(ALIGN_TYPE)-1)) != 0)
+ ERREXIT(cinfo, JERR_BAD_ALIGN_TYPE);
+ /* MAX_ALLOC_CHUNK must be representable as type size_t, and must be
+ * a multiple of SIZEOF(ALIGN_TYPE).
+ * Again, an "unreachable code" warning may be ignored here.
+ * But a "constant too large" warning means you need to fix MAX_ALLOC_CHUNK.
+ */
+ test_mac = (size_t) MAX_ALLOC_CHUNK;
+ if ((long) test_mac != MAX_ALLOC_CHUNK ||
+ (MAX_ALLOC_CHUNK % SIZEOF(ALIGN_TYPE)) != 0)
+ ERREXIT(cinfo, JERR_BAD_ALLOC_CHUNK);
+
+ max_to_use = jpeg_mem_init(cinfo); /* system-dependent initialization */
+
+ /* Attempt to allocate memory manager's control block */
+ mem = (my_mem_ptr) jpeg_get_small(cinfo, SIZEOF(my_memory_mgr));
+
+ if (mem == NULL) {
+ jpeg_mem_term(cinfo); /* system-dependent cleanup */
+ ERREXIT1(cinfo, JERR_OUT_OF_MEMORY, 0);
+ }
+
+ /* OK, fill in the method pointers */
+ mem->pub.alloc_small = alloc_small;
+ mem->pub.alloc_large = alloc_large;
+ mem->pub.alloc_sarray = alloc_sarray;
+ mem->pub.alloc_barray = alloc_barray;
+ mem->pub.request_virt_sarray = request_virt_sarray;
+ mem->pub.request_virt_barray = request_virt_barray;
+ mem->pub.realize_virt_arrays = realize_virt_arrays;
+ mem->pub.access_virt_sarray = access_virt_sarray;
+ mem->pub.access_virt_barray = access_virt_barray;
+ mem->pub.free_pool = free_pool;
+ mem->pub.self_destruct = self_destruct;
+
+ /* Make MAX_ALLOC_CHUNK accessible to other modules */
+ mem->pub.max_alloc_chunk = MAX_ALLOC_CHUNK;
+
+ /* Initialize working state */
+ mem->pub.max_memory_to_use = max_to_use;
+
+ for (pool = JPOOL_NUMPOOLS-1; pool >= JPOOL_PERMANENT; pool--) {
+ mem->small_list[pool] = NULL;
+ mem->large_list[pool] = NULL;
+ }
+ mem->virt_sarray_list = NULL;
+ mem->virt_barray_list = NULL;
+
+ mem->total_space_allocated = SIZEOF(my_memory_mgr);
+
+ /* Declare ourselves open for business */
+ cinfo->mem = & mem->pub;
+
+ /* Check for an environment variable JPEGMEM; if found, override the
+ * default max_memory setting from jpeg_mem_init. Note that the
+ * surrounding application may again override this value.
+ * If your system doesn't support getenv(), define NO_GETENV to disable
+ * this feature.
+ */
+#ifndef NO_GETENV
+ { char * memenv;
+
+ if ((memenv = getenv("JPEGMEM")) != NULL) {
+ char ch = 'x';
+
+ if (sscanf(memenv, "%ld%c", &max_to_use, &ch) > 0) {
+ if (ch == 'm' || ch == 'M')
+ max_to_use *= 1000L;
+ mem->pub.max_memory_to_use = max_to_use * 1000L;
+ }
+ }
+ }
+#endif
+
+}
+
+#endif //_FX_JPEG_TURBO_
diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jmemnobs.c b/core/src/fxcodec/libjpeg/fpdfapi_jmemnobs.c
index 98aed723a6..f1f789a1a6 100644
--- a/core/src/fxcodec/libjpeg/fpdfapi_jmemnobs.c
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jmemnobs.c
@@ -1,126 +1,126 @@
-#if !defined(_FX_JPEG_TURBO_)
-/*
- * jmemnobs.c
- *
- * Copyright (C) 1992-1996, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file provides a really simple implementation of the system-
- * dependent portion of the JPEG memory manager. This implementation
- * assumes that no backing-store files are needed: all required space
- * can be obtained from malloc().
- * This is very portable in the sense that it'll compile on almost anything,
- * but you'd better have lots of main memory (or virtual memory) if you want
- * to process big images.
- * Note that the max_memory_to_use option is ignored by this implementation.
- */
-
-#define JPEG_INTERNALS
-#include "jinclude.h"
-#include "jpeglib.h"
-#include "jmemsys.h" /* import the system-dependent declarations */
-
-#ifndef HAVE_STDLIB_H /* <stdlib.h> should declare malloc(),free() */
-extern void * malloc JPP((size_t size));
-extern void free JPP((void *ptr));
-#endif
-
-#if defined(_FX_MANAGED_CODE_) && defined(__cplusplus)
-extern "C" {
-#endif
-
-void* FXMEM_DefaultAlloc(int byte_size, int);
-void FXMEM_DefaultFree(void* pointer, int);
-
-#if defined(_FX_MANAGED_CODE_) && defined(__cplusplus)
-}
-#endif
-
-/*
- * Memory allocation and freeing are controlled by the regular library
- * routines malloc() and free().
- */
-
-GLOBAL(void *)
-jpeg_get_small (j_common_ptr cinfo, size_t sizeofobject)
-{
-// return (void *) malloc(sizeofobject);
- return FXMEM_DefaultAlloc(sizeofobject, 0);
-}
-
-GLOBAL(void)
-jpeg_free_small (j_common_ptr cinfo, void * object, size_t sizeofobject)
-{
-// free(object);
- FXMEM_DefaultFree(object, 0);
-}
-
-
-/*
- * "Large" objects are treated the same as "small" ones.
- * NB: although we include FAR keywords in the routine declarations,
- * this file won't actually work in 80x86 small/medium model; at least,
- * you probably won't be able to process useful-size images in only 64KB.
- */
-
-GLOBAL(void FAR *)
-jpeg_get_large (j_common_ptr cinfo, size_t sizeofobject)
-{
-// return (void FAR *) malloc(sizeofobject);
- return FXMEM_DefaultAlloc(sizeofobject, 0);
-}
-
-GLOBAL(void)
-jpeg_free_large (j_common_ptr cinfo, void FAR * object, size_t sizeofobject)
-{
-// free(object);
- FXMEM_DefaultFree(object, 0);
-}
-
-
-/*
- * This routine computes the total memory space available for allocation.
- * Here we always say, "we got all you want bud!"
- */
-
-GLOBAL(long)
-jpeg_mem_available (j_common_ptr cinfo, long min_bytes_needed,
- long max_bytes_needed, long already_allocated)
-{
- return max_bytes_needed;
-}
-
-
-/*
- * Backing store (temporary file) management.
- * Since jpeg_mem_available always promised the moon,
- * this should never be called and we can just error out.
- */
-
-GLOBAL(void)
-jpeg_open_backing_store (j_common_ptr cinfo, backing_store_ptr info,
- long total_bytes_needed)
-{
- ERREXIT(cinfo, JERR_NO_BACKING_STORE);
-}
-
-
-/*
- * These routines take care of any system-dependent initialization and
- * cleanup required. Here, there isn't any.
- */
-
-GLOBAL(long)
-jpeg_mem_init (j_common_ptr cinfo)
-{
- return 0; /* just set max_memory_to_use to 0 */
-}
-
-GLOBAL(void)
-jpeg_mem_term (j_common_ptr cinfo)
-{
- /* no work */
-}
-
-#endif //_FX_JPEG_TURBO_
+#if !defined(_FX_JPEG_TURBO_)
+/*
+ * jmemnobs.c
+ *
+ * Copyright (C) 1992-1996, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file provides a really simple implementation of the system-
+ * dependent portion of the JPEG memory manager. This implementation
+ * assumes that no backing-store files are needed: all required space
+ * can be obtained from malloc().
+ * This is very portable in the sense that it'll compile on almost anything,
+ * but you'd better have lots of main memory (or virtual memory) if you want
+ * to process big images.
+ * Note that the max_memory_to_use option is ignored by this implementation.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+#include "jmemsys.h" /* import the system-dependent declarations */
+
+#ifndef HAVE_STDLIB_H /* <stdlib.h> should declare malloc(),free() */
+extern void * malloc JPP((size_t size));
+extern void free JPP((void *ptr));
+#endif
+
+#if defined(_FX_MANAGED_CODE_) && defined(__cplusplus)
+extern "C" {
+#endif
+
+void* FXMEM_DefaultAlloc(int byte_size, int);
+void FXMEM_DefaultFree(void* pointer, int);
+
+#if defined(_FX_MANAGED_CODE_) && defined(__cplusplus)
+}
+#endif
+
+/*
+ * Memory allocation and freeing are controlled by the regular library
+ * routines malloc() and free().
+ */
+
+GLOBAL(void *)
+jpeg_get_small (j_common_ptr cinfo, size_t sizeofobject)
+{
+// return (void *) malloc(sizeofobject);
+ return FXMEM_DefaultAlloc(sizeofobject, 0);
+}
+
+GLOBAL(void)
+jpeg_free_small (j_common_ptr cinfo, void * object, size_t sizeofobject)
+{
+// free(object);
+ FXMEM_DefaultFree(object, 0);
+}
+
+
+/*
+ * "Large" objects are treated the same as "small" ones.
+ * NB: although we include FAR keywords in the routine declarations,
+ * this file won't actually work in 80x86 small/medium model; at least,
+ * you probably won't be able to process useful-size images in only 64KB.
+ */
+
+GLOBAL(void FAR *)
+jpeg_get_large (j_common_ptr cinfo, size_t sizeofobject)
+{
+// return (void FAR *) malloc(sizeofobject);
+ return FXMEM_DefaultAlloc(sizeofobject, 0);
+}
+
+GLOBAL(void)
+jpeg_free_large (j_common_ptr cinfo, void FAR * object, size_t sizeofobject)
+{
+// free(object);
+ FXMEM_DefaultFree(object, 0);
+}
+
+
+/*
+ * This routine computes the total memory space available for allocation.
+ * Here we always say, "we got all you want bud!"
+ */
+
+GLOBAL(long)
+jpeg_mem_available (j_common_ptr cinfo, long min_bytes_needed,
+ long max_bytes_needed, long already_allocated)
+{
+ return max_bytes_needed;
+}
+
+
+/*
+ * Backing store (temporary file) management.
+ * Since jpeg_mem_available always promised the moon,
+ * this should never be called and we can just error out.
+ */
+
+GLOBAL(void)
+jpeg_open_backing_store (j_common_ptr cinfo, backing_store_ptr info,
+ long total_bytes_needed)
+{
+ ERREXIT(cinfo, JERR_NO_BACKING_STORE);
+}
+
+
+/*
+ * These routines take care of any system-dependent initialization and
+ * cleanup required. Here, there isn't any.
+ */
+
+GLOBAL(long)
+jpeg_mem_init (j_common_ptr cinfo)
+{
+ return 0; /* just set max_memory_to_use to 0 */
+}
+
+GLOBAL(void)
+jpeg_mem_term (j_common_ptr cinfo)
+{
+ /* no work */
+}
+
+#endif //_FX_JPEG_TURBO_
diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jutils.c b/core/src/fxcodec/libjpeg/fpdfapi_jutils.c
index 251fd504e5..c6f7248af8 100644
--- a/core/src/fxcodec/libjpeg/fpdfapi_jutils.c
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jutils.c
@@ -1,182 +1,182 @@
-#if !defined(_FX_JPEG_TURBO_)
-/*
- * jutils.c
- *
- * Copyright (C) 1991-1996, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains tables and miscellaneous utility routines needed
- * for both compression and decompression.
- * Note we prefix all global names with "j" to minimize conflicts with
- * a surrounding application.
- */
-
-#define JPEG_INTERNALS
-#include "jinclude.h"
-#include "jpeglib.h"
-
-
-/*
- * jpeg_zigzag_order[i] is the zigzag-order position of the i'th element
- * of a DCT block read in natural order (left to right, top to bottom).
- */
-
-#if 0 /* This table is not actually needed in v6a */
-
-const int jpeg_zigzag_order[DCTSIZE2] = {
- 0, 1, 5, 6, 14, 15, 27, 28,
- 2, 4, 7, 13, 16, 26, 29, 42,
- 3, 8, 12, 17, 25, 30, 41, 43,
- 9, 11, 18, 24, 31, 40, 44, 53,
- 10, 19, 23, 32, 39, 45, 52, 54,
- 20, 22, 33, 38, 46, 51, 55, 60,
- 21, 34, 37, 47, 50, 56, 59, 61,
- 35, 36, 48, 49, 57, 58, 62, 63
-};
-
-#endif
-
-/*
- * jpeg_natural_order[i] is the natural-order position of the i'th element
- * of zigzag order.
- *
- * When reading corrupted data, the Huffman decoders could attempt
- * to reference an entry beyond the end of this array (if the decoded
- * zero run length reaches past the end of the block). To prevent
- * wild stores without adding an inner-loop test, we put some extra
- * "63"s after the real entries. This will cause the extra coefficient
- * to be stored in location 63 of the block, not somewhere random.
- * The worst case would be a run-length of 15, which means we need 16
- * fake entries.
- */
-
-const int jpeg_natural_order[DCTSIZE2+16] = {
- 0, 1, 8, 16, 9, 2, 3, 10,
- 17, 24, 32, 25, 18, 11, 4, 5,
- 12, 19, 26, 33, 40, 48, 41, 34,
- 27, 20, 13, 6, 7, 14, 21, 28,
- 35, 42, 49, 56, 57, 50, 43, 36,
- 29, 22, 15, 23, 30, 37, 44, 51,
- 58, 59, 52, 45, 38, 31, 39, 46,
- 53, 60, 61, 54, 47, 55, 62, 63,
- 63, 63, 63, 63, 63, 63, 63, 63, /* extra entries for safety in decoder */
- 63, 63, 63, 63, 63, 63, 63, 63
-};
-
-
-/*
- * Arithmetic utilities
- */
-
-GLOBAL(long)
-jdiv_round_up (long a, long b)
-/* Compute a/b rounded up to next integer, ie, ceil(a/b) */
-/* Assumes a >= 0, b > 0 */
-{
- return (a + b - 1L) / b;
-}
-
-
-GLOBAL(long)
-jround_up (long a, long b)
-/* Compute a rounded up to next multiple of b, ie, ceil(a/b)*b */
-/* Assumes a >= 0, b > 0 */
-{
- a += b - 1L;
- return a - (a % b);
-}
-
-
-/* On normal machines we can apply MEMCOPY() and MEMZERO() to sample arrays
- * and coefficient-block arrays. This won't work on 80x86 because the arrays
- * are FAR and we're assuming a small-pointer memory model. However, some
- * DOS compilers provide far-pointer versions of memcpy() and memset() even
- * in the small-model libraries. These will be used if USE_FMEM is defined.
- * Otherwise, the routines below do it the hard way. (The performance cost
- * is not all that great, because these routines aren't very heavily used.)
- */
-
-#ifndef NEED_FAR_POINTERS /* normal case, same as regular macros */
-#define FMEMCOPY(dest,src,size) MEMCOPY(dest,src,size)
-#define FMEMZERO(target,size) MEMZERO(target,size)
-#else /* 80x86 case, define if we can */
-#ifdef USE_FMEM
-#define FMEMCOPY(dest,src,size) _fmemcpy((void FAR *)(dest), (const void FAR *)(src), (size_t)(size))
-#define FMEMZERO(target,size) _fmemset((void FAR *)(target), 0, (size_t)(size))
-#endif
-#endif
-
-
-GLOBAL(void)
-jcopy_sample_rows (JSAMPARRAY input_array, int source_row,
- JSAMPARRAY output_array, int dest_row,
- int num_rows, JDIMENSION num_cols)
-/* Copy some rows of samples from one place to another.
- * num_rows rows are copied from input_array[source_row++]
- * to output_array[dest_row++]; these areas may overlap for duplication.
- * The source and destination arrays must be at least as wide as num_cols.
- */
-{
- register JSAMPROW inptr, outptr;
-#ifdef FMEMCOPY
- register size_t count = (size_t) (num_cols * SIZEOF(JSAMPLE));
-#else
- register JDIMENSION count;
-#endif
- register int row;
-
- input_array += source_row;
- output_array += dest_row;
-
- for (row = num_rows; row > 0; row--) {
- inptr = *input_array++;
- outptr = *output_array++;
-#ifdef FMEMCOPY
- FMEMCOPY(outptr, inptr, count);
-#else
- for (count = num_cols; count > 0; count--)
- *outptr++ = *inptr++; /* needn't bother with GETJSAMPLE() here */
-#endif
- }
-}
-
-
-GLOBAL(void)
-jcopy_block_row (JBLOCKROW input_row, JBLOCKROW output_row,
- JDIMENSION num_blocks)
-/* Copy a row of coefficient blocks from one place to another. */
-{
-#ifdef FMEMCOPY
- FMEMCOPY(output_row, input_row, num_blocks * (DCTSIZE2 * SIZEOF(JCOEF)));
-#else
- register JCOEFPTR inptr, outptr;
- register long count;
-
- inptr = (JCOEFPTR) input_row;
- outptr = (JCOEFPTR) output_row;
- for (count = (long) num_blocks * DCTSIZE2; count > 0; count--) {
- *outptr++ = *inptr++;
- }
-#endif
-}
-
-
-GLOBAL(void)
-jzero_far (void FAR * target, size_t bytestozero)
-/* Zero out a chunk of FAR memory. */
-/* This might be sample-array data, block-array data, or alloc_large data. */
-{
-#ifdef FMEMZERO
- FMEMZERO(target, bytestozero);
-#else
- register char FAR * ptr = (char FAR *) target;
- register size_t count;
-
- for (count = bytestozero; count > 0; count--) {
- *ptr++ = 0;
- }
-#endif
-}
-
-#endif //_FX_JPEG_TURBO_
+#if !defined(_FX_JPEG_TURBO_)
+/*
+ * jutils.c
+ *
+ * Copyright (C) 1991-1996, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains tables and miscellaneous utility routines needed
+ * for both compression and decompression.
+ * Note we prefix all global names with "j" to minimize conflicts with
+ * a surrounding application.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+
+
+/*
+ * jpeg_zigzag_order[i] is the zigzag-order position of the i'th element
+ * of a DCT block read in natural order (left to right, top to bottom).
+ */
+
+#if 0 /* This table is not actually needed in v6a */
+
+const int jpeg_zigzag_order[DCTSIZE2] = {
+ 0, 1, 5, 6, 14, 15, 27, 28,
+ 2, 4, 7, 13, 16, 26, 29, 42,
+ 3, 8, 12, 17, 25, 30, 41, 43,
+ 9, 11, 18, 24, 31, 40, 44, 53,
+ 10, 19, 23, 32, 39, 45, 52, 54,
+ 20, 22, 33, 38, 46, 51, 55, 60,
+ 21, 34, 37, 47, 50, 56, 59, 61,
+ 35, 36, 48, 49, 57, 58, 62, 63
+};
+
+#endif
+
+/*
+ * jpeg_natural_order[i] is the natural-order position of the i'th element
+ * of zigzag order.
+ *
+ * When reading corrupted data, the Huffman decoders could attempt
+ * to reference an entry beyond the end of this array (if the decoded
+ * zero run length reaches past the end of the block). To prevent
+ * wild stores without adding an inner-loop test, we put some extra
+ * "63"s after the real entries. This will cause the extra coefficient
+ * to be stored in location 63 of the block, not somewhere random.
+ * The worst case would be a run-length of 15, which means we need 16
+ * fake entries.
+ */
+
+const int jpeg_natural_order[DCTSIZE2+16] = {
+ 0, 1, 8, 16, 9, 2, 3, 10,
+ 17, 24, 32, 25, 18, 11, 4, 5,
+ 12, 19, 26, 33, 40, 48, 41, 34,
+ 27, 20, 13, 6, 7, 14, 21, 28,
+ 35, 42, 49, 56, 57, 50, 43, 36,
+ 29, 22, 15, 23, 30, 37, 44, 51,
+ 58, 59, 52, 45, 38, 31, 39, 46,
+ 53, 60, 61, 54, 47, 55, 62, 63,
+ 63, 63, 63, 63, 63, 63, 63, 63, /* extra entries for safety in decoder */
+ 63, 63, 63, 63, 63, 63, 63, 63
+};
+
+
+/*
+ * Arithmetic utilities
+ */
+
+GLOBAL(long)
+jdiv_round_up (long a, long b)
+/* Compute a/b rounded up to next integer, ie, ceil(a/b) */
+/* Assumes a >= 0, b > 0 */
+{
+ return (a + b - 1L) / b;
+}
+
+
+GLOBAL(long)
+jround_up (long a, long b)
+/* Compute a rounded up to next multiple of b, ie, ceil(a/b)*b */
+/* Assumes a >= 0, b > 0 */
+{
+ a += b - 1L;
+ return a - (a % b);
+}
+
+
+/* On normal machines we can apply MEMCOPY() and MEMZERO() to sample arrays
+ * and coefficient-block arrays. This won't work on 80x86 because the arrays
+ * are FAR and we're assuming a small-pointer memory model. However, some
+ * DOS compilers provide far-pointer versions of memcpy() and memset() even
+ * in the small-model libraries. These will be used if USE_FMEM is defined.
+ * Otherwise, the routines below do it the hard way. (The performance cost
+ * is not all that great, because these routines aren't very heavily used.)
+ */
+
+#ifndef NEED_FAR_POINTERS /* normal case, same as regular macros */
+#define FMEMCOPY(dest,src,size) MEMCOPY(dest,src,size)
+#define FMEMZERO(target,size) MEMZERO(target,size)
+#else /* 80x86 case, define if we can */
+#ifdef USE_FMEM
+#define FMEMCOPY(dest,src,size) _fmemcpy((void FAR *)(dest), (const void FAR *)(src), (size_t)(size))
+#define FMEMZERO(target,size) _fmemset((void FAR *)(target), 0, (size_t)(size))
+#endif
+#endif
+
+
+GLOBAL(void)
+jcopy_sample_rows (JSAMPARRAY input_array, int source_row,
+ JSAMPARRAY output_array, int dest_row,
+ int num_rows, JDIMENSION num_cols)
+/* Copy some rows of samples from one place to another.
+ * num_rows rows are copied from input_array[source_row++]
+ * to output_array[dest_row++]; these areas may overlap for duplication.
+ * The source and destination arrays must be at least as wide as num_cols.
+ */
+{
+ register JSAMPROW inptr, outptr;
+#ifdef FMEMCOPY
+ register size_t count = (size_t) (num_cols * SIZEOF(JSAMPLE));
+#else
+ register JDIMENSION count;
+#endif
+ register int row;
+
+ input_array += source_row;
+ output_array += dest_row;
+
+ for (row = num_rows; row > 0; row--) {
+ inptr = *input_array++;
+ outptr = *output_array++;
+#ifdef FMEMCOPY
+ FMEMCOPY(outptr, inptr, count);
+#else
+ for (count = num_cols; count > 0; count--)
+ *outptr++ = *inptr++; /* needn't bother with GETJSAMPLE() here */
+#endif
+ }
+}
+
+
+GLOBAL(void)
+jcopy_block_row (JBLOCKROW input_row, JBLOCKROW output_row,
+ JDIMENSION num_blocks)
+/* Copy a row of coefficient blocks from one place to another. */
+{
+#ifdef FMEMCOPY
+ FMEMCOPY(output_row, input_row, num_blocks * (DCTSIZE2 * SIZEOF(JCOEF)));
+#else
+ register JCOEFPTR inptr, outptr;
+ register long count;
+
+ inptr = (JCOEFPTR) input_row;
+ outptr = (JCOEFPTR) output_row;
+ for (count = (long) num_blocks * DCTSIZE2; count > 0; count--) {
+ *outptr++ = *inptr++;
+ }
+#endif
+}
+
+
+GLOBAL(void)
+jzero_far (void FAR * target, size_t bytestozero)
+/* Zero out a chunk of FAR memory. */
+/* This might be sample-array data, block-array data, or alloc_large data. */
+{
+#ifdef FMEMZERO
+ FMEMZERO(target, bytestozero);
+#else
+ register char FAR * ptr = (char FAR *) target;
+ register size_t count;
+
+ for (count = bytestozero; count > 0; count--) {
+ *ptr++ = 0;
+ }
+#endif
+}
+
+#endif //_FX_JPEG_TURBO_
diff --git a/core/src/fxcodec/libjpeg/jchuff.h b/core/src/fxcodec/libjpeg/jchuff.h
index 8c02c09ad0..a9599fc1e6 100644
--- a/core/src/fxcodec/libjpeg/jchuff.h
+++ b/core/src/fxcodec/libjpeg/jchuff.h
@@ -1,47 +1,47 @@
-/*
- * jchuff.h
- *
- * Copyright (C) 1991-1997, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains declarations for Huffman entropy encoding routines
- * that are shared between the sequential encoder (jchuff.c) and the
- * progressive encoder (jcphuff.c). No other modules need to see these.
- */
-
-/* The legal range of a DCT coefficient is
- * -1024 .. +1023 for 8-bit data;
- * -16384 .. +16383 for 12-bit data.
- * Hence the magnitude should always fit in 10 or 14 bits respectively.
- */
-
-#if BITS_IN_JSAMPLE == 8
-#define MAX_COEF_BITS 10
-#else
-#define MAX_COEF_BITS 14
-#endif
-
-/* Derived data constructed for each Huffman table */
-
-typedef struct {
- unsigned int ehufco[256]; /* code for each symbol */
- char ehufsi[256]; /* length of code for each symbol */
- /* If no code has been allocated for a symbol S, ehufsi[S] contains 0 */
-} c_derived_tbl;
-
-/* Short forms of external names for systems with brain-damaged linkers. */
-
-#ifdef NEED_SHORT_EXTERNAL_NAMES
-#define jpeg_make_c_derived_tbl jMkCDerived
-#define jpeg_gen_optimal_table jGenOptTbl
-#endif /* NEED_SHORT_EXTERNAL_NAMES */
-
-/* Expand a Huffman table definition into the derived format */
-EXTERN(void) jpeg_make_c_derived_tbl
- JPP((j_compress_ptr cinfo, boolean isDC, int tblno,
- c_derived_tbl ** pdtbl));
-
-/* Generate an optimal table definition given the specified counts */
-EXTERN(void) jpeg_gen_optimal_table
- JPP((j_compress_ptr cinfo, JHUFF_TBL * htbl, long freq[]));
+/*
+ * jchuff.h
+ *
+ * Copyright (C) 1991-1997, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains declarations for Huffman entropy encoding routines
+ * that are shared between the sequential encoder (jchuff.c) and the
+ * progressive encoder (jcphuff.c). No other modules need to see these.
+ */
+
+/* The legal range of a DCT coefficient is
+ * -1024 .. +1023 for 8-bit data;
+ * -16384 .. +16383 for 12-bit data.
+ * Hence the magnitude should always fit in 10 or 14 bits respectively.
+ */
+
+#if BITS_IN_JSAMPLE == 8
+#define MAX_COEF_BITS 10
+#else
+#define MAX_COEF_BITS 14
+#endif
+
+/* Derived data constructed for each Huffman table */
+
+typedef struct {
+ unsigned int ehufco[256]; /* code for each symbol */
+ char ehufsi[256]; /* length of code for each symbol */
+ /* If no code has been allocated for a symbol S, ehufsi[S] contains 0 */
+} c_derived_tbl;
+
+/* Short forms of external names for systems with brain-damaged linkers. */
+
+#ifdef NEED_SHORT_EXTERNAL_NAMES
+#define jpeg_make_c_derived_tbl jMkCDerived
+#define jpeg_gen_optimal_table jGenOptTbl
+#endif /* NEED_SHORT_EXTERNAL_NAMES */
+
+/* Expand a Huffman table definition into the derived format */
+EXTERN(void) jpeg_make_c_derived_tbl
+ JPP((j_compress_ptr cinfo, boolean isDC, int tblno,
+ c_derived_tbl ** pdtbl));
+
+/* Generate an optimal table definition given the specified counts */
+EXTERN(void) jpeg_gen_optimal_table
+ JPP((j_compress_ptr cinfo, JHUFF_TBL * htbl, long freq[]));
diff --git a/core/src/fxcodec/libjpeg/jconfig.h b/core/src/fxcodec/libjpeg/jconfig.h
index 2f4da14c54..7e291c75bd 100644
--- a/core/src/fxcodec/libjpeg/jconfig.h
+++ b/core/src/fxcodec/libjpeg/jconfig.h
@@ -1,45 +1,45 @@
-/* jconfig.vc --- jconfig.h for Microsoft Visual C++ on Windows 95 or NT. */
-/* see jconfig.doc for explanations */
-
-#define HAVE_PROTOTYPES
-#define HAVE_UNSIGNED_CHAR
-#define HAVE_UNSIGNED_SHORT
-/* #define void char */
-/* #define const */
-#undef CHAR_IS_UNSIGNED
-#define HAVE_STDDEF_H
-#define HAVE_STDLIB_H
-#undef NEED_BSD_STRINGS
-#undef NEED_SYS_TYPES_H
-#undef NEED_FAR_POINTERS /* we presume a 32-bit flat memory model */
-#undef NEED_SHORT_EXTERNAL_NAMES
-#undef INCOMPLETE_TYPES_BROKEN
-
-/* Define "boolean" as unsigned char, not int, per Windows custom */
-#ifndef __RPCNDR_H__ /* don't conflict if rpcndr.h already read */
-typedef unsigned char boolean;
-#endif
-#define HAVE_BOOLEAN /* prevent jmorecfg.h from redefining it */
-
-
-#ifdef JPEG_INTERNALS
-
-#undef RIGHT_SHIFT_IS_UNSIGNED
-
-#endif /* JPEG_INTERNALS */
-
-#ifdef JPEG_CJPEG_DJPEG
-
-#define BMP_SUPPORTED /* BMP image file format */
-#define GIF_SUPPORTED /* GIF image file format */
-#define PPM_SUPPORTED /* PBMPLUS PPM/PGM image file format */
-#undef RLE_SUPPORTED /* Utah RLE image file format */
-#define TARGA_SUPPORTED /* Targa image file format */
-
-#define TWO_FILE_COMMANDLINE /* optional */
-#define USE_SETMODE /* Microsoft has setmode() */
-#undef NEED_SIGNAL_CATCHER
-#undef DONT_USE_B_MODE
-#undef PROGRESS_REPORT /* optional */
-
-#endif /* JPEG_CJPEG_DJPEG */
+/* jconfig.vc --- jconfig.h for Microsoft Visual C++ on Windows 95 or NT. */
+/* see jconfig.doc for explanations */
+
+#define HAVE_PROTOTYPES
+#define HAVE_UNSIGNED_CHAR
+#define HAVE_UNSIGNED_SHORT
+/* #define void char */
+/* #define const */
+#undef CHAR_IS_UNSIGNED
+#define HAVE_STDDEF_H
+#define HAVE_STDLIB_H
+#undef NEED_BSD_STRINGS
+#undef NEED_SYS_TYPES_H
+#undef NEED_FAR_POINTERS /* we presume a 32-bit flat memory model */
+#undef NEED_SHORT_EXTERNAL_NAMES
+#undef INCOMPLETE_TYPES_BROKEN
+
+/* Define "boolean" as unsigned char, not int, per Windows custom */
+#ifndef __RPCNDR_H__ /* don't conflict if rpcndr.h already read */
+typedef unsigned char boolean;
+#endif
+#define HAVE_BOOLEAN /* prevent jmorecfg.h from redefining it */
+
+
+#ifdef JPEG_INTERNALS
+
+#undef RIGHT_SHIFT_IS_UNSIGNED
+
+#endif /* JPEG_INTERNALS */
+
+#ifdef JPEG_CJPEG_DJPEG
+
+#define BMP_SUPPORTED /* BMP image file format */
+#define GIF_SUPPORTED /* GIF image file format */
+#define PPM_SUPPORTED /* PBMPLUS PPM/PGM image file format */
+#undef RLE_SUPPORTED /* Utah RLE image file format */
+#define TARGA_SUPPORTED /* Targa image file format */
+
+#define TWO_FILE_COMMANDLINE /* optional */
+#define USE_SETMODE /* Microsoft has setmode() */
+#undef NEED_SIGNAL_CATCHER
+#undef DONT_USE_B_MODE
+#undef PROGRESS_REPORT /* optional */
+
+#endif /* JPEG_CJPEG_DJPEG */
diff --git a/core/src/fxcodec/libjpeg/jdct.h b/core/src/fxcodec/libjpeg/jdct.h
index b664cab0d2..04192a266a 100644
--- a/core/src/fxcodec/libjpeg/jdct.h
+++ b/core/src/fxcodec/libjpeg/jdct.h
@@ -1,176 +1,176 @@
-/*
- * jdct.h
- *
- * Copyright (C) 1994-1996, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This include file contains common declarations for the forward and
- * inverse DCT modules. These declarations are private to the DCT managers
- * (jcdctmgr.c, jddctmgr.c) and the individual DCT algorithms.
- * The individual DCT algorithms are kept in separate files to ease
- * machine-dependent tuning (e.g., assembly coding).
- */
-
-
-/*
- * A forward DCT routine is given a pointer to a work area of type DCTELEM[];
- * the DCT is to be performed in-place in that buffer. Type DCTELEM is int
- * for 8-bit samples, INT32 for 12-bit samples. (NOTE: Floating-point DCT
- * implementations use an array of type FAST_FLOAT, instead.)
- * The DCT inputs are expected to be signed (range +-CENTERJSAMPLE).
- * The DCT outputs are returned scaled up by a factor of 8; they therefore
- * have a range of +-8K for 8-bit data, +-128K for 12-bit data. This
- * convention improves accuracy in integer implementations and saves some
- * work in floating-point ones.
- * Quantization of the output coefficients is done by jcdctmgr.c.
- */
-
-#if BITS_IN_JSAMPLE == 8
-typedef int DCTELEM; /* 16 or 32 bits is fine */
-#else
-typedef INT32 DCTELEM; /* must have 32 bits */
-#endif
-
-typedef JMETHOD(void, forward_DCT_method_ptr, (DCTELEM * data));
-typedef JMETHOD(void, float_DCT_method_ptr, (FAST_FLOAT * data));
-
-
-/*
- * An inverse DCT routine is given a pointer to the input JBLOCK and a pointer
- * to an output sample array. The routine must dequantize the input data as
- * well as perform the IDCT; for dequantization, it uses the multiplier table
- * pointed to by compptr->dct_table. The output data is to be placed into the
- * sample array starting at a specified column. (Any row offset needed will
- * be applied to the array pointer before it is passed to the IDCT code.)
- * Note that the number of samples emitted by the IDCT routine is
- * DCT_scaled_size * DCT_scaled_size.
- */
-
-/* typedef inverse_DCT_method_ptr is declared in jpegint.h */
-
-/*
- * Each IDCT routine has its own ideas about the best dct_table element type.
- */
-
-typedef MULTIPLIER ISLOW_MULT_TYPE; /* short or int, whichever is faster */
-#if BITS_IN_JSAMPLE == 8
-typedef MULTIPLIER IFAST_MULT_TYPE; /* 16 bits is OK, use short if faster */
-#define IFAST_SCALE_BITS 2 /* fractional bits in scale factors */
-#else
-typedef INT32 IFAST_MULT_TYPE; /* need 32 bits for scaled quantizers */
-#define IFAST_SCALE_BITS 13 /* fractional bits in scale factors */
-#endif
-typedef FAST_FLOAT FLOAT_MULT_TYPE; /* preferred floating type */
-
-
-/*
- * Each IDCT routine is responsible for range-limiting its results and
- * converting them to unsigned form (0..MAXJSAMPLE). The raw outputs could
- * be quite far out of range if the input data is corrupt, so a bulletproof
- * range-limiting step is required. We use a mask-and-table-lookup method
- * to do the combined operations quickly. See the comments with
- * prepare_range_limit_table (in jdmaster.c) for more info.
- */
-
-#define IDCT_range_limit(cinfo) ((cinfo)->sample_range_limit + CENTERJSAMPLE)
-
-#define RANGE_MASK (MAXJSAMPLE * 4 + 3) /* 2 bits wider than legal samples */
-
-
-/* Short forms of external names for systems with brain-damaged linkers. */
-
-#ifdef NEED_SHORT_EXTERNAL_NAMES
-#define jpeg_fdct_islow jFDislow
-#define jpeg_fdct_ifast jFDifast
-#define jpeg_fdct_float jFDfloat
-#define jpeg_idct_islow jRDislow
-#define jpeg_idct_ifast jRDifast
-#define jpeg_idct_float jRDfloat
-#define jpeg_idct_4x4 jRD4x4
-#define jpeg_idct_2x2 jRD2x2
-#define jpeg_idct_1x1 jRD1x1
-#endif /* NEED_SHORT_EXTERNAL_NAMES */
-
-/* Extern declarations for the forward and inverse DCT routines. */
-
-EXTERN(void) jpeg_fdct_islow JPP((DCTELEM * data));
-EXTERN(void) jpeg_fdct_ifast JPP((DCTELEM * data));
-EXTERN(void) jpeg_fdct_float JPP((FAST_FLOAT * data));
-
-EXTERN(void) jpeg_idct_islow
- JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,
- JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col));
-EXTERN(void) jpeg_idct_ifast
- JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,
- JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col));
-EXTERN(void) jpeg_idct_float
- JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,
- JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col));
-EXTERN(void) jpeg_idct_4x4
- JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,
- JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col));
-EXTERN(void) jpeg_idct_2x2
- JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,
- JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col));
-EXTERN(void) jpeg_idct_1x1
- JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,
- JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col));
-
-
-/*
- * Macros for handling fixed-point arithmetic; these are used by many
- * but not all of the DCT/IDCT modules.
- *
- * All values are expected to be of type INT32.
- * Fractional constants are scaled left by CONST_BITS bits.
- * CONST_BITS is defined within each module using these macros,
- * and may differ from one module to the next.
- */
-
-#define ONE ((INT32) 1)
-#define CONST_SCALE (ONE << CONST_BITS)
-
-/* Convert a positive real constant to an integer scaled by CONST_SCALE.
- * Caution: some C compilers fail to reduce "FIX(constant)" at compile time,
- * thus causing a lot of useless floating-point operations at run time.
- */
-
-#define FIX(x) ((INT32) ((x) * CONST_SCALE + 0.5))
-
-/* Descale and correctly round an INT32 value that's scaled by N bits.
- * We assume RIGHT_SHIFT rounds towards minus infinity, so adding
- * the fudge factor is correct for either sign of X.
- */
-
-#define DESCALE(x,n) RIGHT_SHIFT((x) + (ONE << ((n)-1)), n)
-
-/* Multiply an INT32 variable by an INT32 constant to yield an INT32 result.
- * This macro is used only when the two inputs will actually be no more than
- * 16 bits wide, so that a 16x16->32 bit multiply can be used instead of a
- * full 32x32 multiply. This provides a useful speedup on many machines.
- * Unfortunately there is no way to specify a 16x16->32 multiply portably
- * in C, but some C compilers will do the right thing if you provide the
- * correct combination of casts.
- */
-
-#ifdef SHORTxSHORT_32 /* may work if 'int' is 32 bits */
-#define MULTIPLY16C16(var,const) (((INT16) (var)) * ((INT16) (const)))
-#endif
-#ifdef SHORTxLCONST_32 /* known to work with Microsoft C 6.0 */
-#define MULTIPLY16C16(var,const) (((INT16) (var)) * ((INT32) (const)))
-#endif
-
-#ifndef MULTIPLY16C16 /* default definition */
-#define MULTIPLY16C16(var,const) ((var) * (const))
-#endif
-
-/* Same except both inputs are variables. */
-
-#ifdef SHORTxSHORT_32 /* may work if 'int' is 32 bits */
-#define MULTIPLY16V16(var1,var2) (((INT16) (var1)) * ((INT16) (var2)))
-#endif
-
-#ifndef MULTIPLY16V16 /* default definition */
-#define MULTIPLY16V16(var1,var2) ((var1) * (var2))
-#endif
+/*
+ * jdct.h
+ *
+ * Copyright (C) 1994-1996, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This include file contains common declarations for the forward and
+ * inverse DCT modules. These declarations are private to the DCT managers
+ * (jcdctmgr.c, jddctmgr.c) and the individual DCT algorithms.
+ * The individual DCT algorithms are kept in separate files to ease
+ * machine-dependent tuning (e.g., assembly coding).
+ */
+
+
+/*
+ * A forward DCT routine is given a pointer to a work area of type DCTELEM[];
+ * the DCT is to be performed in-place in that buffer. Type DCTELEM is int
+ * for 8-bit samples, INT32 for 12-bit samples. (NOTE: Floating-point DCT
+ * implementations use an array of type FAST_FLOAT, instead.)
+ * The DCT inputs are expected to be signed (range +-CENTERJSAMPLE).
+ * The DCT outputs are returned scaled up by a factor of 8; they therefore
+ * have a range of +-8K for 8-bit data, +-128K for 12-bit data. This
+ * convention improves accuracy in integer implementations and saves some
+ * work in floating-point ones.
+ * Quantization of the output coefficients is done by jcdctmgr.c.
+ */
+
+#if BITS_IN_JSAMPLE == 8
+typedef int DCTELEM; /* 16 or 32 bits is fine */
+#else
+typedef INT32 DCTELEM; /* must have 32 bits */
+#endif
+
+typedef JMETHOD(void, forward_DCT_method_ptr, (DCTELEM * data));
+typedef JMETHOD(void, float_DCT_method_ptr, (FAST_FLOAT * data));
+
+
+/*
+ * An inverse DCT routine is given a pointer to the input JBLOCK and a pointer
+ * to an output sample array. The routine must dequantize the input data as
+ * well as perform the IDCT; for dequantization, it uses the multiplier table
+ * pointed to by compptr->dct_table. The output data is to be placed into the
+ * sample array starting at a specified column. (Any row offset needed will
+ * be applied to the array pointer before it is passed to the IDCT code.)
+ * Note that the number of samples emitted by the IDCT routine is
+ * DCT_scaled_size * DCT_scaled_size.
+ */
+
+/* typedef inverse_DCT_method_ptr is declared in jpegint.h */
+
+/*
+ * Each IDCT routine has its own ideas about the best dct_table element type.
+ */
+
+typedef MULTIPLIER ISLOW_MULT_TYPE; /* short or int, whichever is faster */
+#if BITS_IN_JSAMPLE == 8
+typedef MULTIPLIER IFAST_MULT_TYPE; /* 16 bits is OK, use short if faster */
+#define IFAST_SCALE_BITS 2 /* fractional bits in scale factors */
+#else
+typedef INT32 IFAST_MULT_TYPE; /* need 32 bits for scaled quantizers */
+#define IFAST_SCALE_BITS 13 /* fractional bits in scale factors */
+#endif
+typedef FAST_FLOAT FLOAT_MULT_TYPE; /* preferred floating type */
+
+
+/*
+ * Each IDCT routine is responsible for range-limiting its results and
+ * converting them to unsigned form (0..MAXJSAMPLE). The raw outputs could
+ * be quite far out of range if the input data is corrupt, so a bulletproof
+ * range-limiting step is required. We use a mask-and-table-lookup method
+ * to do the combined operations quickly. See the comments with
+ * prepare_range_limit_table (in jdmaster.c) for more info.
+ */
+
+#define IDCT_range_limit(cinfo) ((cinfo)->sample_range_limit + CENTERJSAMPLE)
+
+#define RANGE_MASK (MAXJSAMPLE * 4 + 3) /* 2 bits wider than legal samples */
+
+
+/* Short forms of external names for systems with brain-damaged linkers. */
+
+#ifdef NEED_SHORT_EXTERNAL_NAMES
+#define jpeg_fdct_islow jFDislow
+#define jpeg_fdct_ifast jFDifast
+#define jpeg_fdct_float jFDfloat
+#define jpeg_idct_islow jRDislow
+#define jpeg_idct_ifast jRDifast
+#define jpeg_idct_float jRDfloat
+#define jpeg_idct_4x4 jRD4x4
+#define jpeg_idct_2x2 jRD2x2
+#define jpeg_idct_1x1 jRD1x1
+#endif /* NEED_SHORT_EXTERNAL_NAMES */
+
+/* Extern declarations for the forward and inverse DCT routines. */
+
+EXTERN(void) jpeg_fdct_islow JPP((DCTELEM * data));
+EXTERN(void) jpeg_fdct_ifast JPP((DCTELEM * data));
+EXTERN(void) jpeg_fdct_float JPP((FAST_FLOAT * data));
+
+EXTERN(void) jpeg_idct_islow
+ JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,
+ JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col));
+EXTERN(void) jpeg_idct_ifast
+ JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,
+ JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col));
+EXTERN(void) jpeg_idct_float
+ JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,
+ JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col));
+EXTERN(void) jpeg_idct_4x4
+ JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,
+ JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col));
+EXTERN(void) jpeg_idct_2x2
+ JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,
+ JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col));
+EXTERN(void) jpeg_idct_1x1
+ JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,
+ JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col));
+
+
+/*
+ * Macros for handling fixed-point arithmetic; these are used by many
+ * but not all of the DCT/IDCT modules.
+ *
+ * All values are expected to be of type INT32.
+ * Fractional constants are scaled left by CONST_BITS bits.
+ * CONST_BITS is defined within each module using these macros,
+ * and may differ from one module to the next.
+ */
+
+#define ONE ((INT32) 1)
+#define CONST_SCALE (ONE << CONST_BITS)
+
+/* Convert a positive real constant to an integer scaled by CONST_SCALE.
+ * Caution: some C compilers fail to reduce "FIX(constant)" at compile time,
+ * thus causing a lot of useless floating-point operations at run time.
+ */
+
+#define FIX(x) ((INT32) ((x) * CONST_SCALE + 0.5))
+
+/* Descale and correctly round an INT32 value that's scaled by N bits.
+ * We assume RIGHT_SHIFT rounds towards minus infinity, so adding
+ * the fudge factor is correct for either sign of X.
+ */
+
+#define DESCALE(x,n) RIGHT_SHIFT((x) + (ONE << ((n)-1)), n)
+
+/* Multiply an INT32 variable by an INT32 constant to yield an INT32 result.
+ * This macro is used only when the two inputs will actually be no more than
+ * 16 bits wide, so that a 16x16->32 bit multiply can be used instead of a
+ * full 32x32 multiply. This provides a useful speedup on many machines.
+ * Unfortunately there is no way to specify a 16x16->32 multiply portably
+ * in C, but some C compilers will do the right thing if you provide the
+ * correct combination of casts.
+ */
+
+#ifdef SHORTxSHORT_32 /* may work if 'int' is 32 bits */
+#define MULTIPLY16C16(var,const) (((INT16) (var)) * ((INT16) (const)))
+#endif
+#ifdef SHORTxLCONST_32 /* known to work with Microsoft C 6.0 */
+#define MULTIPLY16C16(var,const) (((INT16) (var)) * ((INT32) (const)))
+#endif
+
+#ifndef MULTIPLY16C16 /* default definition */
+#define MULTIPLY16C16(var,const) ((var) * (const))
+#endif
+
+/* Same except both inputs are variables. */
+
+#ifdef SHORTxSHORT_32 /* may work if 'int' is 32 bits */
+#define MULTIPLY16V16(var1,var2) (((INT16) (var1)) * ((INT16) (var2)))
+#endif
+
+#ifndef MULTIPLY16V16 /* default definition */
+#define MULTIPLY16V16(var1,var2) ((var1) * (var2))
+#endif
diff --git a/core/src/fxcodec/libjpeg/jdhuff.h b/core/src/fxcodec/libjpeg/jdhuff.h
index 12c0747709..ae19b6cafd 100644
--- a/core/src/fxcodec/libjpeg/jdhuff.h
+++ b/core/src/fxcodec/libjpeg/jdhuff.h
@@ -1,201 +1,201 @@
-/*
- * jdhuff.h
- *
- * Copyright (C) 1991-1997, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains declarations for Huffman entropy decoding routines
- * that are shared between the sequential decoder (jdhuff.c) and the
- * progressive decoder (jdphuff.c). No other modules need to see these.
- */
-
-/* Short forms of external names for systems with brain-damaged linkers. */
-
-#ifdef NEED_SHORT_EXTERNAL_NAMES
-#define jpeg_make_d_derived_tbl jMkDDerived
-#define jpeg_fill_bit_buffer jFilBitBuf
-#define jpeg_huff_decode jHufDecode
-#endif /* NEED_SHORT_EXTERNAL_NAMES */
-
-
-/* Derived data constructed for each Huffman table */
-
-#define HUFF_LOOKAHEAD 8 /* # of bits of lookahead */
-
-typedef struct {
- /* Basic tables: (element [0] of each array is unused) */
- INT32 maxcode[18]; /* largest code of length k (-1 if none) */
- /* (maxcode[17] is a sentinel to ensure jpeg_huff_decode terminates) */
- INT32 valoffset[17]; /* huffval[] offset for codes of length k */
- /* valoffset[k] = huffval[] index of 1st symbol of code length k, less
- * the smallest code of length k; so given a code of length k, the
- * corresponding symbol is huffval[code + valoffset[k]]
- */
-
- /* Link to public Huffman table (needed only in jpeg_huff_decode) */
- JHUFF_TBL *pub;
-
- /* Lookahead tables: indexed by the next HUFF_LOOKAHEAD bits of
- * the input data stream. If the next Huffman code is no more
- * than HUFF_LOOKAHEAD bits long, we can obtain its length and
- * the corresponding symbol directly from these tables.
- */
- int look_nbits[1<<HUFF_LOOKAHEAD]; /* # bits, or 0 if too long */
- UINT8 look_sym[1<<HUFF_LOOKAHEAD]; /* symbol, or unused */
-} d_derived_tbl;
-
-/* Expand a Huffman table definition into the derived format */
-EXTERN(void) jpeg_make_d_derived_tbl
- JPP((j_decompress_ptr cinfo, boolean isDC, int tblno,
- d_derived_tbl ** pdtbl));
-
-
-/*
- * Fetching the next N bits from the input stream is a time-critical operation
- * for the Huffman decoders. We implement it with a combination of inline
- * macros and out-of-line subroutines. Note that N (the number of bits
- * demanded at one time) never exceeds 15 for JPEG use.
- *
- * We read source bytes into get_buffer and dole out bits as needed.
- * If get_buffer already contains enough bits, they are fetched in-line
- * by the macros CHECK_BIT_BUFFER and GET_BITS. When there aren't enough
- * bits, jpeg_fill_bit_buffer is called; it will attempt to fill get_buffer
- * as full as possible (not just to the number of bits needed; this
- * prefetching reduces the overhead cost of calling jpeg_fill_bit_buffer).
- * Note that jpeg_fill_bit_buffer may return FALSE to indicate suspension.
- * On TRUE return, jpeg_fill_bit_buffer guarantees that get_buffer contains
- * at least the requested number of bits --- dummy zeroes are inserted if
- * necessary.
- */
-
-typedef INT32 bit_buf_type; /* type of bit-extraction buffer */
-#define BIT_BUF_SIZE 32 /* size of buffer in bits */
-
-/* If long is > 32 bits on your machine, and shifting/masking longs is
- * reasonably fast, making bit_buf_type be long and setting BIT_BUF_SIZE
- * appropriately should be a win. Unfortunately we can't define the size
- * with something like #define BIT_BUF_SIZE (sizeof(bit_buf_type)*8)
- * because not all machines measure sizeof in 8-bit bytes.
- */
-
-typedef struct { /* Bitreading state saved across MCUs */
- bit_buf_type get_buffer; /* current bit-extraction buffer */
- int bits_left; /* # of unused bits in it */
-} bitread_perm_state;
-
-typedef struct { /* Bitreading working state within an MCU */
- /* Current data source location */
- /* We need a copy, rather than munging the original, in case of suspension */
- const JOCTET * next_input_byte; /* => next byte to read from source */
- size_t bytes_in_buffer; /* # of bytes remaining in source buffer */
- /* Bit input buffer --- note these values are kept in register variables,
- * not in this struct, inside the inner loops.
- */
- bit_buf_type get_buffer; /* current bit-extraction buffer */
- int bits_left; /* # of unused bits in it */
- /* Pointer needed by jpeg_fill_bit_buffer. */
- j_decompress_ptr cinfo; /* back link to decompress master record */
-} bitread_working_state;
-
-/* Macros to declare and load/save bitread local variables. */
-#define BITREAD_STATE_VARS \
- register bit_buf_type get_buffer; \
- register int bits_left; \
- bitread_working_state br_state
-
-#define BITREAD_LOAD_STATE(cinfop,permstate) \
- br_state.cinfo = cinfop; \
- br_state.next_input_byte = cinfop->src->next_input_byte; \
- br_state.bytes_in_buffer = cinfop->src->bytes_in_buffer; \
- get_buffer = permstate.get_buffer; \
- bits_left = permstate.bits_left;
-
-#define BITREAD_SAVE_STATE(cinfop,permstate) \
- cinfop->src->next_input_byte = br_state.next_input_byte; \
- cinfop->src->bytes_in_buffer = br_state.bytes_in_buffer; \
- permstate.get_buffer = get_buffer; \
- permstate.bits_left = bits_left
-
-/*
- * These macros provide the in-line portion of bit fetching.
- * Use CHECK_BIT_BUFFER to ensure there are N bits in get_buffer
- * before using GET_BITS, PEEK_BITS, or DROP_BITS.
- * The variables get_buffer and bits_left are assumed to be locals,
- * but the state struct might not be (jpeg_huff_decode needs this).
- * CHECK_BIT_BUFFER(state,n,action);
- * Ensure there are N bits in get_buffer; if suspend, take action.
- * val = GET_BITS(n);
- * Fetch next N bits.
- * val = PEEK_BITS(n);
- * Fetch next N bits without removing them from the buffer.
- * DROP_BITS(n);
- * Discard next N bits.
- * The value N should be a simple variable, not an expression, because it
- * is evaluated multiple times.
- */
-
-#define CHECK_BIT_BUFFER(state,nbits,action) \
- { if (bits_left < (nbits)) { \
- if (! jpeg_fill_bit_buffer(&(state),get_buffer,bits_left,nbits)) \
- { action; } \
- get_buffer = (state).get_buffer; bits_left = (state).bits_left; } }
-
-#define GET_BITS(nbits) \
- (((int) (get_buffer >> (bits_left -= (nbits)))) & ((1<<(nbits))-1))
-
-#define PEEK_BITS(nbits) \
- (((int) (get_buffer >> (bits_left - (nbits)))) & ((1<<(nbits))-1))
-
-#define DROP_BITS(nbits) \
- (bits_left -= (nbits))
-
-/* Load up the bit buffer to a depth of at least nbits */
-EXTERN(boolean) jpeg_fill_bit_buffer
- JPP((bitread_working_state * state, register bit_buf_type get_buffer,
- register int bits_left, int nbits));
-
-
-/*
- * Code for extracting next Huffman-coded symbol from input bit stream.
- * Again, this is time-critical and we make the main paths be macros.
- *
- * We use a lookahead table to process codes of up to HUFF_LOOKAHEAD bits
- * without looping. Usually, more than 95% of the Huffman codes will be 8
- * or fewer bits long. The few overlength codes are handled with a loop,
- * which need not be inline code.
- *
- * Notes about the HUFF_DECODE macro:
- * 1. Near the end of the data segment, we may fail to get enough bits
- * for a lookahead. In that case, we do it the hard way.
- * 2. If the lookahead table contains no entry, the next code must be
- * more than HUFF_LOOKAHEAD bits long.
- * 3. jpeg_huff_decode returns -1 if forced to suspend.
- */
-
-#define HUFF_DECODE(result,state,htbl,failaction,slowlabel) \
-{ register int nb, look; \
- if (bits_left < HUFF_LOOKAHEAD) { \
- if (! jpeg_fill_bit_buffer(&state,get_buffer,bits_left, 0)) {failaction;} \
- get_buffer = state.get_buffer; bits_left = state.bits_left; \
- if (bits_left < HUFF_LOOKAHEAD) { \
- nb = 1; goto slowlabel; \
- } \
- } \
- look = PEEK_BITS(HUFF_LOOKAHEAD); \
- if ((nb = htbl->look_nbits[look]) != 0) { \
- DROP_BITS(nb); \
- result = htbl->look_sym[look]; \
- } else { \
- nb = HUFF_LOOKAHEAD+1; \
-slowlabel: \
- if ((result=jpeg_huff_decode(&state,get_buffer,bits_left,htbl,nb)) < 0) \
- { failaction; } \
- get_buffer = state.get_buffer; bits_left = state.bits_left; \
- } \
-}
-
-/* Out-of-line case for Huffman code fetching */
-EXTERN(int) jpeg_huff_decode
- JPP((bitread_working_state * state, register bit_buf_type get_buffer,
- register int bits_left, d_derived_tbl * htbl, int min_bits));
+/*
+ * jdhuff.h
+ *
+ * Copyright (C) 1991-1997, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains declarations for Huffman entropy decoding routines
+ * that are shared between the sequential decoder (jdhuff.c) and the
+ * progressive decoder (jdphuff.c). No other modules need to see these.
+ */
+
+/* Short forms of external names for systems with brain-damaged linkers. */
+
+#ifdef NEED_SHORT_EXTERNAL_NAMES
+#define jpeg_make_d_derived_tbl jMkDDerived
+#define jpeg_fill_bit_buffer jFilBitBuf
+#define jpeg_huff_decode jHufDecode
+#endif /* NEED_SHORT_EXTERNAL_NAMES */
+
+
+/* Derived data constructed for each Huffman table */
+
+#define HUFF_LOOKAHEAD 8 /* # of bits of lookahead */
+
+typedef struct {
+ /* Basic tables: (element [0] of each array is unused) */
+ INT32 maxcode[18]; /* largest code of length k (-1 if none) */
+ /* (maxcode[17] is a sentinel to ensure jpeg_huff_decode terminates) */
+ INT32 valoffset[17]; /* huffval[] offset for codes of length k */
+ /* valoffset[k] = huffval[] index of 1st symbol of code length k, less
+ * the smallest code of length k; so given a code of length k, the
+ * corresponding symbol is huffval[code + valoffset[k]]
+ */
+
+ /* Link to public Huffman table (needed only in jpeg_huff_decode) */
+ JHUFF_TBL *pub;
+
+ /* Lookahead tables: indexed by the next HUFF_LOOKAHEAD bits of
+ * the input data stream. If the next Huffman code is no more
+ * than HUFF_LOOKAHEAD bits long, we can obtain its length and
+ * the corresponding symbol directly from these tables.
+ */
+ int look_nbits[1<<HUFF_LOOKAHEAD]; /* # bits, or 0 if too long */
+ UINT8 look_sym[1<<HUFF_LOOKAHEAD]; /* symbol, or unused */
+} d_derived_tbl;
+
+/* Expand a Huffman table definition into the derived format */
+EXTERN(void) jpeg_make_d_derived_tbl
+ JPP((j_decompress_ptr cinfo, boolean isDC, int tblno,
+ d_derived_tbl ** pdtbl));
+
+
+/*
+ * Fetching the next N bits from the input stream is a time-critical operation
+ * for the Huffman decoders. We implement it with a combination of inline
+ * macros and out-of-line subroutines. Note that N (the number of bits
+ * demanded at one time) never exceeds 15 for JPEG use.
+ *
+ * We read source bytes into get_buffer and dole out bits as needed.
+ * If get_buffer already contains enough bits, they are fetched in-line
+ * by the macros CHECK_BIT_BUFFER and GET_BITS. When there aren't enough
+ * bits, jpeg_fill_bit_buffer is called; it will attempt to fill get_buffer
+ * as full as possible (not just to the number of bits needed; this
+ * prefetching reduces the overhead cost of calling jpeg_fill_bit_buffer).
+ * Note that jpeg_fill_bit_buffer may return FALSE to indicate suspension.
+ * On TRUE return, jpeg_fill_bit_buffer guarantees that get_buffer contains
+ * at least the requested number of bits --- dummy zeroes are inserted if
+ * necessary.
+ */
+
+typedef INT32 bit_buf_type; /* type of bit-extraction buffer */
+#define BIT_BUF_SIZE 32 /* size of buffer in bits */
+
+/* If long is > 32 bits on your machine, and shifting/masking longs is
+ * reasonably fast, making bit_buf_type be long and setting BIT_BUF_SIZE
+ * appropriately should be a win. Unfortunately we can't define the size
+ * with something like #define BIT_BUF_SIZE (sizeof(bit_buf_type)*8)
+ * because not all machines measure sizeof in 8-bit bytes.
+ */
+
+typedef struct { /* Bitreading state saved across MCUs */
+ bit_buf_type get_buffer; /* current bit-extraction buffer */
+ int bits_left; /* # of unused bits in it */
+} bitread_perm_state;
+
+typedef struct { /* Bitreading working state within an MCU */
+ /* Current data source location */
+ /* We need a copy, rather than munging the original, in case of suspension */
+ const JOCTET * next_input_byte; /* => next byte to read from source */
+ size_t bytes_in_buffer; /* # of bytes remaining in source buffer */
+ /* Bit input buffer --- note these values are kept in register variables,
+ * not in this struct, inside the inner loops.
+ */
+ bit_buf_type get_buffer; /* current bit-extraction buffer */
+ int bits_left; /* # of unused bits in it */
+ /* Pointer needed by jpeg_fill_bit_buffer. */
+ j_decompress_ptr cinfo; /* back link to decompress master record */
+} bitread_working_state;
+
+/* Macros to declare and load/save bitread local variables. */
+#define BITREAD_STATE_VARS \
+ register bit_buf_type get_buffer; \
+ register int bits_left; \
+ bitread_working_state br_state
+
+#define BITREAD_LOAD_STATE(cinfop,permstate) \
+ br_state.cinfo = cinfop; \
+ br_state.next_input_byte = cinfop->src->next_input_byte; \
+ br_state.bytes_in_buffer = cinfop->src->bytes_in_buffer; \
+ get_buffer = permstate.get_buffer; \
+ bits_left = permstate.bits_left;
+
+#define BITREAD_SAVE_STATE(cinfop,permstate) \
+ cinfop->src->next_input_byte = br_state.next_input_byte; \
+ cinfop->src->bytes_in_buffer = br_state.bytes_in_buffer; \
+ permstate.get_buffer = get_buffer; \
+ permstate.bits_left = bits_left
+
+/*
+ * These macros provide the in-line portion of bit fetching.
+ * Use CHECK_BIT_BUFFER to ensure there are N bits in get_buffer
+ * before using GET_BITS, PEEK_BITS, or DROP_BITS.
+ * The variables get_buffer and bits_left are assumed to be locals,
+ * but the state struct might not be (jpeg_huff_decode needs this).
+ * CHECK_BIT_BUFFER(state,n,action);
+ * Ensure there are N bits in get_buffer; if suspend, take action.
+ * val = GET_BITS(n);
+ * Fetch next N bits.
+ * val = PEEK_BITS(n);
+ * Fetch next N bits without removing them from the buffer.
+ * DROP_BITS(n);
+ * Discard next N bits.
+ * The value N should be a simple variable, not an expression, because it
+ * is evaluated multiple times.
+ */
+
+#define CHECK_BIT_BUFFER(state,nbits,action) \
+ { if (bits_left < (nbits)) { \
+ if (! jpeg_fill_bit_buffer(&(state),get_buffer,bits_left,nbits)) \
+ { action; } \
+ get_buffer = (state).get_buffer; bits_left = (state).bits_left; } }
+
+#define GET_BITS(nbits) \
+ (((int) (get_buffer >> (bits_left -= (nbits)))) & ((1<<(nbits))-1))
+
+#define PEEK_BITS(nbits) \
+ (((int) (get_buffer >> (bits_left - (nbits)))) & ((1<<(nbits))-1))
+
+#define DROP_BITS(nbits) \
+ (bits_left -= (nbits))
+
+/* Load up the bit buffer to a depth of at least nbits */
+EXTERN(boolean) jpeg_fill_bit_buffer
+ JPP((bitread_working_state * state, register bit_buf_type get_buffer,
+ register int bits_left, int nbits));
+
+
+/*
+ * Code for extracting next Huffman-coded symbol from input bit stream.
+ * Again, this is time-critical and we make the main paths be macros.
+ *
+ * We use a lookahead table to process codes of up to HUFF_LOOKAHEAD bits
+ * without looping. Usually, more than 95% of the Huffman codes will be 8
+ * or fewer bits long. The few overlength codes are handled with a loop,
+ * which need not be inline code.
+ *
+ * Notes about the HUFF_DECODE macro:
+ * 1. Near the end of the data segment, we may fail to get enough bits
+ * for a lookahead. In that case, we do it the hard way.
+ * 2. If the lookahead table contains no entry, the next code must be
+ * more than HUFF_LOOKAHEAD bits long.
+ * 3. jpeg_huff_decode returns -1 if forced to suspend.
+ */
+
+#define HUFF_DECODE(result,state,htbl,failaction,slowlabel) \
+{ register int nb, look; \
+ if (bits_left < HUFF_LOOKAHEAD) { \
+ if (! jpeg_fill_bit_buffer(&state,get_buffer,bits_left, 0)) {failaction;} \
+ get_buffer = state.get_buffer; bits_left = state.bits_left; \
+ if (bits_left < HUFF_LOOKAHEAD) { \
+ nb = 1; goto slowlabel; \
+ } \
+ } \
+ look = PEEK_BITS(HUFF_LOOKAHEAD); \
+ if ((nb = htbl->look_nbits[look]) != 0) { \
+ DROP_BITS(nb); \
+ result = htbl->look_sym[look]; \
+ } else { \
+ nb = HUFF_LOOKAHEAD+1; \
+slowlabel: \
+ if ((result=jpeg_huff_decode(&state,get_buffer,bits_left,htbl,nb)) < 0) \
+ { failaction; } \
+ get_buffer = state.get_buffer; bits_left = state.bits_left; \
+ } \
+}
+
+/* Out-of-line case for Huffman code fetching */
+EXTERN(int) jpeg_huff_decode
+ JPP((bitread_working_state * state, register bit_buf_type get_buffer,
+ register int bits_left, d_derived_tbl * htbl, int min_bits));
diff --git a/core/src/fxcodec/libjpeg/jerror.h b/core/src/fxcodec/libjpeg/jerror.h
index a2b8f96f8f..06d344067a 100644
--- a/core/src/fxcodec/libjpeg/jerror.h
+++ b/core/src/fxcodec/libjpeg/jerror.h
@@ -1,291 +1,291 @@
-/*
- * jerror.h
- *
- * Copyright (C) 1994-1997, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file defines the error and message codes for the JPEG library.
- * Edit this file to add new codes, or to translate the message strings to
- * some other language.
- * A set of error-reporting macros are defined too. Some applications using
- * the JPEG library may wish to include this file to get the error codes
- * and/or the macros.
- */
-
-/*
- * To define the enum list of message codes, include this file without
- * defining macro JMESSAGE. To create a message string table, include it
- * again with a suitable JMESSAGE definition (see jerror.c for an example).
- */
-#ifndef JMESSAGE
-#ifndef JERROR_H
-/* First time through, define the enum list */
-#define JMAKE_ENUM_LIST
-#else
-/* Repeated inclusions of this file are no-ops unless JMESSAGE is defined */
-#define JMESSAGE(code,string)
-#endif /* JERROR_H */
-#endif /* JMESSAGE */
-
-#ifdef JMAKE_ENUM_LIST
-
-typedef enum {
-
-#define JMESSAGE(code,string) code ,
-
-#endif /* JMAKE_ENUM_LIST */
-
-JMESSAGE(JMSG_NOMESSAGE, "Bogus message code %d") /* Must be first entry! */
-
-/* For maintenance convenience, list is alphabetical by message code name */
-JMESSAGE(JERR_ARITH_NOTIMPL,
- "Sorry, there are legal restrictions on arithmetic coding")
-JMESSAGE(JERR_BAD_ALIGN_TYPE, "ALIGN_TYPE is wrong, please fix")
-JMESSAGE(JERR_BAD_ALLOC_CHUNK, "MAX_ALLOC_CHUNK is wrong, please fix")
-JMESSAGE(JERR_BAD_BUFFER_MODE, "Bogus buffer control mode")
-JMESSAGE(JERR_BAD_COMPONENT_ID, "Invalid component ID %d in SOS")
-JMESSAGE(JERR_BAD_DCT_COEF, "DCT coefficient out of range")
-JMESSAGE(JERR_BAD_DCTSIZE, "IDCT output block size %d not supported")
-JMESSAGE(JERR_BAD_HUFF_TABLE, "Bogus Huffman table definition")
-JMESSAGE(JERR_BAD_IN_COLORSPACE, "Bogus input colorspace")
-JMESSAGE(JERR_BAD_J_COLORSPACE, "Bogus JPEG colorspace")
-JMESSAGE(JERR_BAD_LENGTH, "Bogus marker length")
-JMESSAGE(JERR_BAD_LIB_VERSION,
- "Wrong JPEG library version: library is %d, caller expects %d")
-JMESSAGE(JERR_BAD_MCU_SIZE, "Sampling factors too large for interleaved scan")
-JMESSAGE(JERR_BAD_POOL_ID, "Invalid memory pool code %d")
-JMESSAGE(JERR_BAD_PRECISION, "Unsupported JPEG data precision %d")
-JMESSAGE(JERR_BAD_PROGRESSION,
- "Invalid progressive parameters Ss=%d Se=%d Ah=%d Al=%d")
-JMESSAGE(JERR_BAD_PROG_SCRIPT,
- "Invalid progressive parameters at scan script entry %d")
-JMESSAGE(JERR_BAD_SAMPLING, "Bogus sampling factors")
-JMESSAGE(JERR_BAD_SCAN_SCRIPT, "Invalid scan script at entry %d")
-JMESSAGE(JERR_BAD_STATE, "Improper call to JPEG library in state %d")
-JMESSAGE(JERR_BAD_STRUCT_SIZE,
- "JPEG parameter struct mismatch: library thinks size is %u, caller expects %u")
-JMESSAGE(JERR_BAD_VIRTUAL_ACCESS, "Bogus virtual array access")
-JMESSAGE(JERR_BUFFER_SIZE, "Buffer passed to JPEG library is too small")
-JMESSAGE(JERR_CANT_SUSPEND, "Suspension not allowed here")
-JMESSAGE(JERR_CCIR601_NOTIMPL, "CCIR601 sampling not implemented yet")
-JMESSAGE(JERR_COMPONENT_COUNT, "Too many color components: %d, max %d")
-JMESSAGE(JERR_CONVERSION_NOTIMPL, "Unsupported color conversion request")
-JMESSAGE(JERR_DAC_INDEX, "Bogus DAC index %d")
-JMESSAGE(JERR_DAC_VALUE, "Bogus DAC value 0x%x")
-JMESSAGE(JERR_DHT_INDEX, "Bogus DHT index %d")
-JMESSAGE(JERR_DQT_INDEX, "Bogus DQT index %d")
-JMESSAGE(JERR_EMPTY_IMAGE, "Empty JPEG image (DNL not supported)")
-JMESSAGE(JERR_EMS_READ, "Read from EMS failed")
-JMESSAGE(JERR_EMS_WRITE, "Write to EMS failed")
-JMESSAGE(JERR_EOI_EXPECTED, "Didn't expect more than one scan")
-JMESSAGE(JERR_FILE_READ, "Input file read error")
-JMESSAGE(JERR_FILE_WRITE, "Output file write error --- out of disk space?")
-JMESSAGE(JERR_FRACT_SAMPLE_NOTIMPL, "Fractional sampling not implemented yet")
-JMESSAGE(JERR_HUFF_CLEN_OVERFLOW, "Huffman code size table overflow")
-JMESSAGE(JERR_HUFF_MISSING_CODE, "Missing Huffman code table entry")
-JMESSAGE(JERR_IMAGE_TOO_BIG, "Maximum supported image dimension is %u pixels")
-JMESSAGE(JERR_INPUT_EMPTY, "Empty input file")
-JMESSAGE(JERR_INPUT_EOF, "Premature end of input file")
-JMESSAGE(JERR_MISMATCHED_QUANT_TABLE,
- "Cannot transcode due to multiple use of quantization table %d")
-JMESSAGE(JERR_MISSING_DATA, "Scan script does not transmit all data")
-JMESSAGE(JERR_MODE_CHANGE, "Invalid color quantization mode change")
-JMESSAGE(JERR_NOTIMPL, "Not implemented yet")
-JMESSAGE(JERR_NOT_COMPILED, "Requested feature was omitted at compile time")
-JMESSAGE(JERR_NO_BACKING_STORE, "Backing store not supported")
-JMESSAGE(JERR_NO_HUFF_TABLE, "Huffman table 0x%02x was not defined")
-JMESSAGE(JERR_NO_IMAGE, "JPEG datastream contains no image")
-JMESSAGE(JERR_NO_QUANT_TABLE, "Quantization table 0x%02x was not defined")
-JMESSAGE(JERR_NO_SOI, "Not a JPEG file: starts with 0x%02x 0x%02x")
-JMESSAGE(JERR_OUT_OF_MEMORY, "Insufficient memory (case %d)")
-JMESSAGE(JERR_QUANT_COMPONENTS,
- "Cannot quantize more than %d color components")
-JMESSAGE(JERR_QUANT_FEW_COLORS, "Cannot quantize to fewer than %d colors")
-JMESSAGE(JERR_QUANT_MANY_COLORS, "Cannot quantize to more than %d colors")
-JMESSAGE(JERR_SOF_DUPLICATE, "Invalid JPEG file structure: two SOF markers")
-JMESSAGE(JERR_SOF_NO_SOS, "Invalid JPEG file structure: missing SOS marker")
-JMESSAGE(JERR_SOF_UNSUPPORTED, "Unsupported JPEG process: SOF type 0x%02x")
-JMESSAGE(JERR_SOI_DUPLICATE, "Invalid JPEG file structure: two SOI markers")
-JMESSAGE(JERR_SOS_NO_SOF, "Invalid JPEG file structure: SOS before SOF")
-JMESSAGE(JERR_TFILE_CREATE, "Failed to create temporary file %s")
-JMESSAGE(JERR_TFILE_READ, "Read failed on temporary file")
-JMESSAGE(JERR_TFILE_SEEK, "Seek failed on temporary file")
-JMESSAGE(JERR_TFILE_WRITE,
- "Write failed on temporary file --- out of disk space?")
-JMESSAGE(JERR_TOO_LITTLE_DATA, "Application transferred too few scanlines")
-JMESSAGE(JERR_UNKNOWN_MARKER, "Unsupported marker type 0x%02x")
-JMESSAGE(JERR_VIRTUAL_BUG, "Virtual array controller messed up")
-JMESSAGE(JERR_WIDTH_OVERFLOW, "Image too wide for this implementation")
-JMESSAGE(JERR_XMS_READ, "Read from XMS failed")
-JMESSAGE(JERR_XMS_WRITE, "Write to XMS failed")
-JMESSAGE(JMSG_COPYRIGHT, JCOPYRIGHT)
-JMESSAGE(JMSG_VERSION, JVERSION)
-JMESSAGE(JTRC_16BIT_TABLES,
- "Caution: quantization tables are too coarse for baseline JPEG")
-JMESSAGE(JTRC_ADOBE,
- "Adobe APP14 marker: version %d, flags 0x%04x 0x%04x, transform %d")
-JMESSAGE(JTRC_APP0, "Unknown APP0 marker (not JFIF), length %u")
-JMESSAGE(JTRC_APP14, "Unknown APP14 marker (not Adobe), length %u")
-JMESSAGE(JTRC_DAC, "Define Arithmetic Table 0x%02x: 0x%02x")
-JMESSAGE(JTRC_DHT, "Define Huffman Table 0x%02x")
-JMESSAGE(JTRC_DQT, "Define Quantization Table %d precision %d")
-JMESSAGE(JTRC_DRI, "Define Restart Interval %u")
-JMESSAGE(JTRC_EMS_CLOSE, "Freed EMS handle %u")
-JMESSAGE(JTRC_EMS_OPEN, "Obtained EMS handle %u")
-JMESSAGE(JTRC_EOI, "End Of Image")
-JMESSAGE(JTRC_HUFFBITS, " %3d %3d %3d %3d %3d %3d %3d %3d")
-JMESSAGE(JTRC_JFIF, "JFIF APP0 marker: version %d.%02d, density %dx%d %d")
-JMESSAGE(JTRC_JFIF_BADTHUMBNAILSIZE,
- "Warning: thumbnail image size does not match data length %u")
-JMESSAGE(JTRC_JFIF_EXTENSION,
- "JFIF extension marker: type 0x%02x, length %u")
-JMESSAGE(JTRC_JFIF_THUMBNAIL, " with %d x %d thumbnail image")
-JMESSAGE(JTRC_MISC_MARKER, "Miscellaneous marker 0x%02x, length %u")
-JMESSAGE(JTRC_PARMLESS_MARKER, "Unexpected marker 0x%02x")
-JMESSAGE(JTRC_QUANTVALS, " %4u %4u %4u %4u %4u %4u %4u %4u")
-JMESSAGE(JTRC_QUANT_3_NCOLORS, "Quantizing to %d = %d*%d*%d colors")
-JMESSAGE(JTRC_QUANT_NCOLORS, "Quantizing to %d colors")
-JMESSAGE(JTRC_QUANT_SELECTED, "Selected %d colors for quantization")
-JMESSAGE(JTRC_RECOVERY_ACTION, "At marker 0x%02x, recovery action %d")
-JMESSAGE(JTRC_RST, "RST%d")
-JMESSAGE(JTRC_SMOOTH_NOTIMPL,
- "Smoothing not supported with nonstandard sampling ratios")
-JMESSAGE(JTRC_SOF, "Start Of Frame 0x%02x: width=%u, height=%u, components=%d")
-JMESSAGE(JTRC_SOF_COMPONENT, " Component %d: %dhx%dv q=%d")
-JMESSAGE(JTRC_SOI, "Start of Image")
-JMESSAGE(JTRC_SOS, "Start Of Scan: %d components")
-JMESSAGE(JTRC_SOS_COMPONENT, " Component %d: dc=%d ac=%d")
-JMESSAGE(JTRC_SOS_PARAMS, " Ss=%d, Se=%d, Ah=%d, Al=%d")
-JMESSAGE(JTRC_TFILE_CLOSE, "Closed temporary file %s")
-JMESSAGE(JTRC_TFILE_OPEN, "Opened temporary file %s")
-JMESSAGE(JTRC_THUMB_JPEG,
- "JFIF extension marker: JPEG-compressed thumbnail image, length %u")
-JMESSAGE(JTRC_THUMB_PALETTE,
- "JFIF extension marker: palette thumbnail image, length %u")
-JMESSAGE(JTRC_THUMB_RGB,
- "JFIF extension marker: RGB thumbnail image, length %u")
-JMESSAGE(JTRC_UNKNOWN_IDS,
- "Unrecognized component IDs %d %d %d, assuming YCbCr")
-JMESSAGE(JTRC_XMS_CLOSE, "Freed XMS handle %u")
-JMESSAGE(JTRC_XMS_OPEN, "Obtained XMS handle %u")
-JMESSAGE(JWRN_ADOBE_XFORM, "Unknown Adobe color transform code %d")
-JMESSAGE(JWRN_BOGUS_PROGRESSION,
- "Inconsistent progression sequence for component %d coefficient %d")
-JMESSAGE(JWRN_EXTRANEOUS_DATA,
- "Corrupt JPEG data: %u extraneous bytes before marker 0x%02x")
-JMESSAGE(JWRN_HIT_MARKER, "Corrupt JPEG data: premature end of data segment")
-JMESSAGE(JWRN_HUFF_BAD_CODE, "Corrupt JPEG data: bad Huffman code")
-JMESSAGE(JWRN_JFIF_MAJOR, "Warning: unknown JFIF revision number %d.%02d")
-JMESSAGE(JWRN_JPEG_EOF, "Premature end of JPEG file")
-JMESSAGE(JWRN_MUST_RESYNC,
- "Corrupt JPEG data: found marker 0x%02x instead of RST%d")
-JMESSAGE(JWRN_NOT_SEQUENTIAL, "Invalid SOS parameters for sequential JPEG")
-JMESSAGE(JWRN_TOO_MUCH_DATA, "Application transferred too many scanlines")
-
-#ifdef JMAKE_ENUM_LIST
-
- JMSG_LASTMSGCODE
-} J_MESSAGE_CODE;
-
-#undef JMAKE_ENUM_LIST
-#endif /* JMAKE_ENUM_LIST */
-
-/* Zap JMESSAGE macro so that future re-inclusions do nothing by default */
-#undef JMESSAGE
-
-
-#ifndef JERROR_H
-#define JERROR_H
-
-/* Macros to simplify using the error and trace message stuff */
-/* The first parameter is either type of cinfo pointer */
-
-/* Fatal errors (print message and exit) */
-#define ERREXIT(cinfo,code) \
- ((cinfo)->err->msg_code = (code), \
- (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo)))
-#define ERREXIT1(cinfo,code,p1) \
- ((cinfo)->err->msg_code = (code), \
- (cinfo)->err->msg_parm.i[0] = (p1), \
- (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo)))
-#define ERREXIT2(cinfo,code,p1,p2) \
- ((cinfo)->err->msg_code = (code), \
- (cinfo)->err->msg_parm.i[0] = (p1), \
- (cinfo)->err->msg_parm.i[1] = (p2), \
- (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo)))
-#define ERREXIT3(cinfo,code,p1,p2,p3) \
- ((cinfo)->err->msg_code = (code), \
- (cinfo)->err->msg_parm.i[0] = (p1), \
- (cinfo)->err->msg_parm.i[1] = (p2), \
- (cinfo)->err->msg_parm.i[2] = (p3), \
- (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo)))
-#define ERREXIT4(cinfo,code,p1,p2,p3,p4) \
- ((cinfo)->err->msg_code = (code), \
- (cinfo)->err->msg_parm.i[0] = (p1), \
- (cinfo)->err->msg_parm.i[1] = (p2), \
- (cinfo)->err->msg_parm.i[2] = (p3), \
- (cinfo)->err->msg_parm.i[3] = (p4), \
- (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo)))
-#define ERREXITS(cinfo,code,str) \
- ((cinfo)->err->msg_code = (code), \
- FXSYS_strncpy((cinfo)->err->msg_parm.s, (str), JMSG_STR_PARM_MAX), \
- (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo)))
-
-#define MAKESTMT(stuff) do { stuff } while (0)
-
-/* Nonfatal errors (we can keep going, but the data is probably corrupt) */
-#define WARNMS(cinfo,code) \
- ((cinfo)->err->msg_code = (code), \
- (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), -1))
-#define WARNMS1(cinfo,code,p1) \
- ((cinfo)->err->msg_code = (code), \
- (cinfo)->err->msg_parm.i[0] = (p1), \
- (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), -1))
-#define WARNMS2(cinfo,code,p1,p2) \
- ((cinfo)->err->msg_code = (code), \
- (cinfo)->err->msg_parm.i[0] = (p1), \
- (cinfo)->err->msg_parm.i[1] = (p2), \
- (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), -1))
-
-/* Informational/debugging messages */
-#define TRACEMS(cinfo,lvl,code) \
- ((cinfo)->err->msg_code = (code), \
- (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)))
-#define TRACEMS1(cinfo,lvl,code,p1) \
- ((cinfo)->err->msg_code = (code), \
- (cinfo)->err->msg_parm.i[0] = (p1), \
- (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)))
-#define TRACEMS2(cinfo,lvl,code,p1,p2) \
- ((cinfo)->err->msg_code = (code), \
- (cinfo)->err->msg_parm.i[0] = (p1), \
- (cinfo)->err->msg_parm.i[1] = (p2), \
- (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)))
-#define TRACEMS3(cinfo,lvl,code,p1,p2,p3) \
- MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \
- _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); \
- (cinfo)->err->msg_code = (code); \
- (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); )
-#define TRACEMS4(cinfo,lvl,code,p1,p2,p3,p4) \
- MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \
- _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); _mp[3] = (p4); \
- (cinfo)->err->msg_code = (code); \
- (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); )
-#define TRACEMS5(cinfo,lvl,code,p1,p2,p3,p4,p5) \
- MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \
- _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); _mp[3] = (p4); \
- _mp[4] = (p5); \
- (cinfo)->err->msg_code = (code); \
- (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); )
-#define TRACEMS8(cinfo,lvl,code,p1,p2,p3,p4,p5,p6,p7,p8) \
- MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \
- _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); _mp[3] = (p4); \
- _mp[4] = (p5); _mp[5] = (p6); _mp[6] = (p7); _mp[7] = (p8); \
- (cinfo)->err->msg_code = (code); \
- (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); )
-#define TRACEMSS(cinfo,lvl,code,str) \
- ((cinfo)->err->msg_code = (code), \
- FXSYS_strncpy((cinfo)->err->msg_parm.s, (str), JMSG_STR_PARM_MAX), \
- (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)))
-
-#endif /* JERROR_H */
+/*
+ * jerror.h
+ *
+ * Copyright (C) 1994-1997, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file defines the error and message codes for the JPEG library.
+ * Edit this file to add new codes, or to translate the message strings to
+ * some other language.
+ * A set of error-reporting macros are defined too. Some applications using
+ * the JPEG library may wish to include this file to get the error codes
+ * and/or the macros.
+ */
+
+/*
+ * To define the enum list of message codes, include this file without
+ * defining macro JMESSAGE. To create a message string table, include it
+ * again with a suitable JMESSAGE definition (see jerror.c for an example).
+ */
+#ifndef JMESSAGE
+#ifndef JERROR_H
+/* First time through, define the enum list */
+#define JMAKE_ENUM_LIST
+#else
+/* Repeated inclusions of this file are no-ops unless JMESSAGE is defined */
+#define JMESSAGE(code,string)
+#endif /* JERROR_H */
+#endif /* JMESSAGE */
+
+#ifdef JMAKE_ENUM_LIST
+
+typedef enum {
+
+#define JMESSAGE(code,string) code ,
+
+#endif /* JMAKE_ENUM_LIST */
+
+JMESSAGE(JMSG_NOMESSAGE, "Bogus message code %d") /* Must be first entry! */
+
+/* For maintenance convenience, list is alphabetical by message code name */
+JMESSAGE(JERR_ARITH_NOTIMPL,
+ "Sorry, there are legal restrictions on arithmetic coding")
+JMESSAGE(JERR_BAD_ALIGN_TYPE, "ALIGN_TYPE is wrong, please fix")
+JMESSAGE(JERR_BAD_ALLOC_CHUNK, "MAX_ALLOC_CHUNK is wrong, please fix")
+JMESSAGE(JERR_BAD_BUFFER_MODE, "Bogus buffer control mode")
+JMESSAGE(JERR_BAD_COMPONENT_ID, "Invalid component ID %d in SOS")
+JMESSAGE(JERR_BAD_DCT_COEF, "DCT coefficient out of range")
+JMESSAGE(JERR_BAD_DCTSIZE, "IDCT output block size %d not supported")
+JMESSAGE(JERR_BAD_HUFF_TABLE, "Bogus Huffman table definition")
+JMESSAGE(JERR_BAD_IN_COLORSPACE, "Bogus input colorspace")
+JMESSAGE(JERR_BAD_J_COLORSPACE, "Bogus JPEG colorspace")
+JMESSAGE(JERR_BAD_LENGTH, "Bogus marker length")
+JMESSAGE(JERR_BAD_LIB_VERSION,
+ "Wrong JPEG library version: library is %d, caller expects %d")
+JMESSAGE(JERR_BAD_MCU_SIZE, "Sampling factors too large for interleaved scan")
+JMESSAGE(JERR_BAD_POOL_ID, "Invalid memory pool code %d")
+JMESSAGE(JERR_BAD_PRECISION, "Unsupported JPEG data precision %d")
+JMESSAGE(JERR_BAD_PROGRESSION,
+ "Invalid progressive parameters Ss=%d Se=%d Ah=%d Al=%d")
+JMESSAGE(JERR_BAD_PROG_SCRIPT,
+ "Invalid progressive parameters at scan script entry %d")
+JMESSAGE(JERR_BAD_SAMPLING, "Bogus sampling factors")
+JMESSAGE(JERR_BAD_SCAN_SCRIPT, "Invalid scan script at entry %d")
+JMESSAGE(JERR_BAD_STATE, "Improper call to JPEG library in state %d")
+JMESSAGE(JERR_BAD_STRUCT_SIZE,
+ "JPEG parameter struct mismatch: library thinks size is %u, caller expects %u")
+JMESSAGE(JERR_BAD_VIRTUAL_ACCESS, "Bogus virtual array access")
+JMESSAGE(JERR_BUFFER_SIZE, "Buffer passed to JPEG library is too small")
+JMESSAGE(JERR_CANT_SUSPEND, "Suspension not allowed here")
+JMESSAGE(JERR_CCIR601_NOTIMPL, "CCIR601 sampling not implemented yet")
+JMESSAGE(JERR_COMPONENT_COUNT, "Too many color components: %d, max %d")
+JMESSAGE(JERR_CONVERSION_NOTIMPL, "Unsupported color conversion request")
+JMESSAGE(JERR_DAC_INDEX, "Bogus DAC index %d")
+JMESSAGE(JERR_DAC_VALUE, "Bogus DAC value 0x%x")
+JMESSAGE(JERR_DHT_INDEX, "Bogus DHT index %d")
+JMESSAGE(JERR_DQT_INDEX, "Bogus DQT index %d")
+JMESSAGE(JERR_EMPTY_IMAGE, "Empty JPEG image (DNL not supported)")
+JMESSAGE(JERR_EMS_READ, "Read from EMS failed")
+JMESSAGE(JERR_EMS_WRITE, "Write to EMS failed")
+JMESSAGE(JERR_EOI_EXPECTED, "Didn't expect more than one scan")
+JMESSAGE(JERR_FILE_READ, "Input file read error")
+JMESSAGE(JERR_FILE_WRITE, "Output file write error --- out of disk space?")
+JMESSAGE(JERR_FRACT_SAMPLE_NOTIMPL, "Fractional sampling not implemented yet")
+JMESSAGE(JERR_HUFF_CLEN_OVERFLOW, "Huffman code size table overflow")
+JMESSAGE(JERR_HUFF_MISSING_CODE, "Missing Huffman code table entry")
+JMESSAGE(JERR_IMAGE_TOO_BIG, "Maximum supported image dimension is %u pixels")
+JMESSAGE(JERR_INPUT_EMPTY, "Empty input file")
+JMESSAGE(JERR_INPUT_EOF, "Premature end of input file")
+JMESSAGE(JERR_MISMATCHED_QUANT_TABLE,
+ "Cannot transcode due to multiple use of quantization table %d")
+JMESSAGE(JERR_MISSING_DATA, "Scan script does not transmit all data")
+JMESSAGE(JERR_MODE_CHANGE, "Invalid color quantization mode change")
+JMESSAGE(JERR_NOTIMPL, "Not implemented yet")
+JMESSAGE(JERR_NOT_COMPILED, "Requested feature was omitted at compile time")
+JMESSAGE(JERR_NO_BACKING_STORE, "Backing store not supported")
+JMESSAGE(JERR_NO_HUFF_TABLE, "Huffman table 0x%02x was not defined")
+JMESSAGE(JERR_NO_IMAGE, "JPEG datastream contains no image")
+JMESSAGE(JERR_NO_QUANT_TABLE, "Quantization table 0x%02x was not defined")
+JMESSAGE(JERR_NO_SOI, "Not a JPEG file: starts with 0x%02x 0x%02x")
+JMESSAGE(JERR_OUT_OF_MEMORY, "Insufficient memory (case %d)")
+JMESSAGE(JERR_QUANT_COMPONENTS,
+ "Cannot quantize more than %d color components")
+JMESSAGE(JERR_QUANT_FEW_COLORS, "Cannot quantize to fewer than %d colors")
+JMESSAGE(JERR_QUANT_MANY_COLORS, "Cannot quantize to more than %d colors")
+JMESSAGE(JERR_SOF_DUPLICATE, "Invalid JPEG file structure: two SOF markers")
+JMESSAGE(JERR_SOF_NO_SOS, "Invalid JPEG file structure: missing SOS marker")
+JMESSAGE(JERR_SOF_UNSUPPORTED, "Unsupported JPEG process: SOF type 0x%02x")
+JMESSAGE(JERR_SOI_DUPLICATE, "Invalid JPEG file structure: two SOI markers")
+JMESSAGE(JERR_SOS_NO_SOF, "Invalid JPEG file structure: SOS before SOF")
+JMESSAGE(JERR_TFILE_CREATE, "Failed to create temporary file %s")
+JMESSAGE(JERR_TFILE_READ, "Read failed on temporary file")
+JMESSAGE(JERR_TFILE_SEEK, "Seek failed on temporary file")
+JMESSAGE(JERR_TFILE_WRITE,
+ "Write failed on temporary file --- out of disk space?")
+JMESSAGE(JERR_TOO_LITTLE_DATA, "Application transferred too few scanlines")
+JMESSAGE(JERR_UNKNOWN_MARKER, "Unsupported marker type 0x%02x")
+JMESSAGE(JERR_VIRTUAL_BUG, "Virtual array controller messed up")
+JMESSAGE(JERR_WIDTH_OVERFLOW, "Image too wide for this implementation")
+JMESSAGE(JERR_XMS_READ, "Read from XMS failed")
+JMESSAGE(JERR_XMS_WRITE, "Write to XMS failed")
+JMESSAGE(JMSG_COPYRIGHT, JCOPYRIGHT)
+JMESSAGE(JMSG_VERSION, JVERSION)
+JMESSAGE(JTRC_16BIT_TABLES,
+ "Caution: quantization tables are too coarse for baseline JPEG")
+JMESSAGE(JTRC_ADOBE,
+ "Adobe APP14 marker: version %d, flags 0x%04x 0x%04x, transform %d")
+JMESSAGE(JTRC_APP0, "Unknown APP0 marker (not JFIF), length %u")
+JMESSAGE(JTRC_APP14, "Unknown APP14 marker (not Adobe), length %u")
+JMESSAGE(JTRC_DAC, "Define Arithmetic Table 0x%02x: 0x%02x")
+JMESSAGE(JTRC_DHT, "Define Huffman Table 0x%02x")
+JMESSAGE(JTRC_DQT, "Define Quantization Table %d precision %d")
+JMESSAGE(JTRC_DRI, "Define Restart Interval %u")
+JMESSAGE(JTRC_EMS_CLOSE, "Freed EMS handle %u")
+JMESSAGE(JTRC_EMS_OPEN, "Obtained EMS handle %u")
+JMESSAGE(JTRC_EOI, "End Of Image")
+JMESSAGE(JTRC_HUFFBITS, " %3d %3d %3d %3d %3d %3d %3d %3d")
+JMESSAGE(JTRC_JFIF, "JFIF APP0 marker: version %d.%02d, density %dx%d %d")
+JMESSAGE(JTRC_JFIF_BADTHUMBNAILSIZE,
+ "Warning: thumbnail image size does not match data length %u")
+JMESSAGE(JTRC_JFIF_EXTENSION,
+ "JFIF extension marker: type 0x%02x, length %u")
+JMESSAGE(JTRC_JFIF_THUMBNAIL, " with %d x %d thumbnail image")
+JMESSAGE(JTRC_MISC_MARKER, "Miscellaneous marker 0x%02x, length %u")
+JMESSAGE(JTRC_PARMLESS_MARKER, "Unexpected marker 0x%02x")
+JMESSAGE(JTRC_QUANTVALS, " %4u %4u %4u %4u %4u %4u %4u %4u")
+JMESSAGE(JTRC_QUANT_3_NCOLORS, "Quantizing to %d = %d*%d*%d colors")
+JMESSAGE(JTRC_QUANT_NCOLORS, "Quantizing to %d colors")
+JMESSAGE(JTRC_QUANT_SELECTED, "Selected %d colors for quantization")
+JMESSAGE(JTRC_RECOVERY_ACTION, "At marker 0x%02x, recovery action %d")
+JMESSAGE(JTRC_RST, "RST%d")
+JMESSAGE(JTRC_SMOOTH_NOTIMPL,
+ "Smoothing not supported with nonstandard sampling ratios")
+JMESSAGE(JTRC_SOF, "Start Of Frame 0x%02x: width=%u, height=%u, components=%d")
+JMESSAGE(JTRC_SOF_COMPONENT, " Component %d: %dhx%dv q=%d")
+JMESSAGE(JTRC_SOI, "Start of Image")
+JMESSAGE(JTRC_SOS, "Start Of Scan: %d components")
+JMESSAGE(JTRC_SOS_COMPONENT, " Component %d: dc=%d ac=%d")
+JMESSAGE(JTRC_SOS_PARAMS, " Ss=%d, Se=%d, Ah=%d, Al=%d")
+JMESSAGE(JTRC_TFILE_CLOSE, "Closed temporary file %s")
+JMESSAGE(JTRC_TFILE_OPEN, "Opened temporary file %s")
+JMESSAGE(JTRC_THUMB_JPEG,
+ "JFIF extension marker: JPEG-compressed thumbnail image, length %u")
+JMESSAGE(JTRC_THUMB_PALETTE,
+ "JFIF extension marker: palette thumbnail image, length %u")
+JMESSAGE(JTRC_THUMB_RGB,
+ "JFIF extension marker: RGB thumbnail image, length %u")
+JMESSAGE(JTRC_UNKNOWN_IDS,
+ "Unrecognized component IDs %d %d %d, assuming YCbCr")
+JMESSAGE(JTRC_XMS_CLOSE, "Freed XMS handle %u")
+JMESSAGE(JTRC_XMS_OPEN, "Obtained XMS handle %u")
+JMESSAGE(JWRN_ADOBE_XFORM, "Unknown Adobe color transform code %d")
+JMESSAGE(JWRN_BOGUS_PROGRESSION,
+ "Inconsistent progression sequence for component %d coefficient %d")
+JMESSAGE(JWRN_EXTRANEOUS_DATA,
+ "Corrupt JPEG data: %u extraneous bytes before marker 0x%02x")
+JMESSAGE(JWRN_HIT_MARKER, "Corrupt JPEG data: premature end of data segment")
+JMESSAGE(JWRN_HUFF_BAD_CODE, "Corrupt JPEG data: bad Huffman code")
+JMESSAGE(JWRN_JFIF_MAJOR, "Warning: unknown JFIF revision number %d.%02d")
+JMESSAGE(JWRN_JPEG_EOF, "Premature end of JPEG file")
+JMESSAGE(JWRN_MUST_RESYNC,
+ "Corrupt JPEG data: found marker 0x%02x instead of RST%d")
+JMESSAGE(JWRN_NOT_SEQUENTIAL, "Invalid SOS parameters for sequential JPEG")
+JMESSAGE(JWRN_TOO_MUCH_DATA, "Application transferred too many scanlines")
+
+#ifdef JMAKE_ENUM_LIST
+
+ JMSG_LASTMSGCODE
+} J_MESSAGE_CODE;
+
+#undef JMAKE_ENUM_LIST
+#endif /* JMAKE_ENUM_LIST */
+
+/* Zap JMESSAGE macro so that future re-inclusions do nothing by default */
+#undef JMESSAGE
+
+
+#ifndef JERROR_H
+#define JERROR_H
+
+/* Macros to simplify using the error and trace message stuff */
+/* The first parameter is either type of cinfo pointer */
+
+/* Fatal errors (print message and exit) */
+#define ERREXIT(cinfo,code) \
+ ((cinfo)->err->msg_code = (code), \
+ (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo)))
+#define ERREXIT1(cinfo,code,p1) \
+ ((cinfo)->err->msg_code = (code), \
+ (cinfo)->err->msg_parm.i[0] = (p1), \
+ (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo)))
+#define ERREXIT2(cinfo,code,p1,p2) \
+ ((cinfo)->err->msg_code = (code), \
+ (cinfo)->err->msg_parm.i[0] = (p1), \
+ (cinfo)->err->msg_parm.i[1] = (p2), \
+ (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo)))
+#define ERREXIT3(cinfo,code,p1,p2,p3) \
+ ((cinfo)->err->msg_code = (code), \
+ (cinfo)->err->msg_parm.i[0] = (p1), \
+ (cinfo)->err->msg_parm.i[1] = (p2), \
+ (cinfo)->err->msg_parm.i[2] = (p3), \
+ (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo)))
+#define ERREXIT4(cinfo,code,p1,p2,p3,p4) \
+ ((cinfo)->err->msg_code = (code), \
+ (cinfo)->err->msg_parm.i[0] = (p1), \
+ (cinfo)->err->msg_parm.i[1] = (p2), \
+ (cinfo)->err->msg_parm.i[2] = (p3), \
+ (cinfo)->err->msg_parm.i[3] = (p4), \
+ (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo)))
+#define ERREXITS(cinfo,code,str) \
+ ((cinfo)->err->msg_code = (code), \
+ FXSYS_strncpy((cinfo)->err->msg_parm.s, (str), JMSG_STR_PARM_MAX), \
+ (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo)))
+
+#define MAKESTMT(stuff) do { stuff } while (0)
+
+/* Nonfatal errors (we can keep going, but the data is probably corrupt) */
+#define WARNMS(cinfo,code) \
+ ((cinfo)->err->msg_code = (code), \
+ (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), -1))
+#define WARNMS1(cinfo,code,p1) \
+ ((cinfo)->err->msg_code = (code), \
+ (cinfo)->err->msg_parm.i[0] = (p1), \
+ (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), -1))
+#define WARNMS2(cinfo,code,p1,p2) \
+ ((cinfo)->err->msg_code = (code), \
+ (cinfo)->err->msg_parm.i[0] = (p1), \
+ (cinfo)->err->msg_parm.i[1] = (p2), \
+ (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), -1))
+
+/* Informational/debugging messages */
+#define TRACEMS(cinfo,lvl,code) \
+ ((cinfo)->err->msg_code = (code), \
+ (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)))
+#define TRACEMS1(cinfo,lvl,code,p1) \
+ ((cinfo)->err->msg_code = (code), \
+ (cinfo)->err->msg_parm.i[0] = (p1), \
+ (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)))
+#define TRACEMS2(cinfo,lvl,code,p1,p2) \
+ ((cinfo)->err->msg_code = (code), \
+ (cinfo)->err->msg_parm.i[0] = (p1), \
+ (cinfo)->err->msg_parm.i[1] = (p2), \
+ (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)))
+#define TRACEMS3(cinfo,lvl,code,p1,p2,p3) \
+ MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \
+ _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); \
+ (cinfo)->err->msg_code = (code); \
+ (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); )
+#define TRACEMS4(cinfo,lvl,code,p1,p2,p3,p4) \
+ MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \
+ _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); _mp[3] = (p4); \
+ (cinfo)->err->msg_code = (code); \
+ (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); )
+#define TRACEMS5(cinfo,lvl,code,p1,p2,p3,p4,p5) \
+ MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \
+ _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); _mp[3] = (p4); \
+ _mp[4] = (p5); \
+ (cinfo)->err->msg_code = (code); \
+ (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); )
+#define TRACEMS8(cinfo,lvl,code,p1,p2,p3,p4,p5,p6,p7,p8) \
+ MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \
+ _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); _mp[3] = (p4); \
+ _mp[4] = (p5); _mp[5] = (p6); _mp[6] = (p7); _mp[7] = (p8); \
+ (cinfo)->err->msg_code = (code); \
+ (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); )
+#define TRACEMSS(cinfo,lvl,code,str) \
+ ((cinfo)->err->msg_code = (code), \
+ FXSYS_strncpy((cinfo)->err->msg_parm.s, (str), JMSG_STR_PARM_MAX), \
+ (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)))
+
+#endif /* JERROR_H */
diff --git a/core/src/fxcodec/libjpeg/jinclude.h b/core/src/fxcodec/libjpeg/jinclude.h
index 070188a9b6..0c7aa68360 100644
--- a/core/src/fxcodec/libjpeg/jinclude.h
+++ b/core/src/fxcodec/libjpeg/jinclude.h
@@ -1,102 +1,102 @@
-/*
- * jinclude.h
- *
- * Copyright (C) 1991-1994, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file exists to provide a single place to fix any problems with
- * including the wrong system include files. (Common problems are taken
- * care of by the standard jconfig symbols, but on really weird systems
- * you may have to edit this file.)
- *
- * NOTE: this file is NOT intended to be included by applications using the
- * JPEG library. Most applications need only include jpeglib.h.
- */
-
-
-/* Include auto-config file to find out which system include files we need. */
-
-#include "jconfig.h" /* auto configuration options */
-#define JCONFIG_INCLUDED /* so that jpeglib.h doesn't do it again */
-
-#include "../../../include/fxcrt/fx_system.h"
-/*
- * We need the NULL macro and size_t typedef.
- * On an ANSI-conforming system it is sufficient to include <stddef.h>.
- * Otherwise, we get them from <stdlib.h> or <stdio.h>; we may have to
- * pull in <sys/types.h> as well.
- * Note that the core JPEG library does not require <stdio.h>;
- * only the default error handler and data source/destination modules do.
- * But we must pull it in because of the references to FILE in jpeglib.h.
- * You can remove those references if you want to compile without <stdio.h>.
- */
-
-#ifdef _DEBUG
-#define CRTDBG_MAP_ALLOC
-//#include <stdlib.h>
-//#include <crtdbg.h>
-#endif
-
-#ifdef HAVE_STDDEF_H
-#include <stddef.h>
-#endif
-
-#ifdef HAVE_STDLIB_H
-//#include <stdlib.h>
-#endif
-
-#ifdef NEED_SYS_TYPES_H
-#include <sys/types.h>
-#endif
-
-#ifndef FAR
-#define FAR
-#endif
-
-//#include <stdio.h>
-
-/*
- * We need memory copying and zeroing functions, plus strncpy().
- * ANSI and System V implementations declare these in <string.h>.
- * BSD doesn't have the mem() functions, but it does have bcopy()/bzero().
- * Some systems may declare memset and memcpy in <memory.h>.
- *
- * NOTE: we assume the size parameters to these functions are of type size_t.
- * Change the casts in these macros if not!
- */
-
-#ifdef NEED_BSD_STRINGS
-
-//#include <strings.h>
-#define MEMZERO(target,size) bzero((void *)(target), (size_t)(size))
-#define MEMCOPY(dest,src,size) bcopy((const void *)(src), (void *)(dest), (size_t)(size))
-
-#else /* not BSD, assume ANSI/SysV string lib */
-
-//#include <string.h>
-#define MEMZERO(target,size) FXSYS_memset32((void *)(target), 0, (size_t)(size))
-#define MEMCOPY(dest,src,size) FXSYS_memcpy32((void *)(dest), (const void *)(src), (size_t)(size))
-
-#endif
-
-/*
- * In ANSI C, and indeed any rational implementation, size_t is also the
- * type returned by sizeof(). However, it seems there are some irrational
- * implementations out there, in which sizeof() returns an int even though
- * size_t is defined as long or unsigned long. To ensure consistent results
- * we always use this SIZEOF() macro in place of using sizeof() directly.
- */
-
-#define SIZEOF(object) ((size_t) sizeof(object))
-
-/*
- * The modules that use fread() and fwrite() always invoke them through
- * these macros. On some systems you may need to twiddle the argument casts.
- * CAUTION: argument order is different from underlying functions!
- */
-
-#define JFREAD(file,buf,sizeofbuf) \
- ((size_t) FXSYS_fread((void *) (buf), (size_t) 1, (size_t) (sizeofbuf), (file)))
-#define JFWRITE(file,buf,sizeofbuf) \
- ((size_t) FXSYS_fwrite((const void *) (buf), (size_t) 1, (size_t) (sizeofbuf), (file)))
+/*
+ * jinclude.h
+ *
+ * Copyright (C) 1991-1994, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file exists to provide a single place to fix any problems with
+ * including the wrong system include files. (Common problems are taken
+ * care of by the standard jconfig symbols, but on really weird systems
+ * you may have to edit this file.)
+ *
+ * NOTE: this file is NOT intended to be included by applications using the
+ * JPEG library. Most applications need only include jpeglib.h.
+ */
+
+
+/* Include auto-config file to find out which system include files we need. */
+
+#include "jconfig.h" /* auto configuration options */
+#define JCONFIG_INCLUDED /* so that jpeglib.h doesn't do it again */
+
+#include "../../../include/fxcrt/fx_system.h"
+/*
+ * We need the NULL macro and size_t typedef.
+ * On an ANSI-conforming system it is sufficient to include <stddef.h>.
+ * Otherwise, we get them from <stdlib.h> or <stdio.h>; we may have to
+ * pull in <sys/types.h> as well.
+ * Note that the core JPEG library does not require <stdio.h>;
+ * only the default error handler and data source/destination modules do.
+ * But we must pull it in because of the references to FILE in jpeglib.h.
+ * You can remove those references if you want to compile without <stdio.h>.
+ */
+
+#ifdef _DEBUG
+#define CRTDBG_MAP_ALLOC
+//#include <stdlib.h>
+//#include <crtdbg.h>
+#endif
+
+#ifdef HAVE_STDDEF_H
+#include <stddef.h>
+#endif
+
+#ifdef HAVE_STDLIB_H
+//#include <stdlib.h>
+#endif
+
+#ifdef NEED_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+
+#ifndef FAR
+#define FAR
+#endif
+
+//#include <stdio.h>
+
+/*
+ * We need memory copying and zeroing functions, plus strncpy().
+ * ANSI and System V implementations declare these in <string.h>.
+ * BSD doesn't have the mem() functions, but it does have bcopy()/bzero().
+ * Some systems may declare memset and memcpy in <memory.h>.
+ *
+ * NOTE: we assume the size parameters to these functions are of type size_t.
+ * Change the casts in these macros if not!
+ */
+
+#ifdef NEED_BSD_STRINGS
+
+//#include <strings.h>
+#define MEMZERO(target,size) bzero((void *)(target), (size_t)(size))
+#define MEMCOPY(dest,src,size) bcopy((const void *)(src), (void *)(dest), (size_t)(size))
+
+#else /* not BSD, assume ANSI/SysV string lib */
+
+//#include <string.h>
+#define MEMZERO(target,size) FXSYS_memset32((void *)(target), 0, (size_t)(size))
+#define MEMCOPY(dest,src,size) FXSYS_memcpy32((void *)(dest), (const void *)(src), (size_t)(size))
+
+#endif
+
+/*
+ * In ANSI C, and indeed any rational implementation, size_t is also the
+ * type returned by sizeof(). However, it seems there are some irrational
+ * implementations out there, in which sizeof() returns an int even though
+ * size_t is defined as long or unsigned long. To ensure consistent results
+ * we always use this SIZEOF() macro in place of using sizeof() directly.
+ */
+
+#define SIZEOF(object) ((size_t) sizeof(object))
+
+/*
+ * The modules that use fread() and fwrite() always invoke them through
+ * these macros. On some systems you may need to twiddle the argument casts.
+ * CAUTION: argument order is different from underlying functions!
+ */
+
+#define JFREAD(file,buf,sizeofbuf) \
+ ((size_t) FXSYS_fread((void *) (buf), (size_t) 1, (size_t) (sizeofbuf), (file)))
+#define JFWRITE(file,buf,sizeofbuf) \
+ ((size_t) FXSYS_fwrite((const void *) (buf), (size_t) 1, (size_t) (sizeofbuf), (file)))
diff --git a/core/src/fxcodec/libjpeg/jmemsys.h b/core/src/fxcodec/libjpeg/jmemsys.h
index baa7b7f993..ef1481514b 100644
--- a/core/src/fxcodec/libjpeg/jmemsys.h
+++ b/core/src/fxcodec/libjpeg/jmemsys.h
@@ -1,200 +1,200 @@
-/*
- * jmemsys.h
- *
- * Copyright (C) 1992-1997, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This include file defines the interface between the system-independent
- * and system-dependent portions of the JPEG memory manager. No other
- * modules need include it. (The system-independent portion is jmemmgr.c;
- * there are several different versions of the system-dependent portion.)
- *
- * This file works as-is for the system-dependent memory managers supplied
- * in the IJG distribution. You may need to modify it if you write a
- * custom memory manager. If system-dependent changes are needed in
- * this file, the best method is to #ifdef them based on a configuration
- * symbol supplied in jconfig.h, as we have done with USE_MSDOS_MEMMGR
- * and USE_MAC_MEMMGR.
- */
-
-
-/* Short forms of external names for systems with brain-damaged linkers. */
-
-#ifdef NEED_SHORT_EXTERNAL_NAMES
-#define jpeg_get_small jGetSmall
-#define jpeg_free_small jFreeSmall
-#define jpeg_get_large jGetLarge
-#define jpeg_free_large jFreeLarge
-#define jpeg_mem_available jMemAvail
-#define jpeg_open_backing_store jOpenBackStore
-#define jpeg_mem_init jMemInit
-#define jpeg_mem_term jMemTerm
-#endif /* NEED_SHORT_EXTERNAL_NAMES */
-
-
-/*
- * These two functions are used to allocate and release small chunks of
- * memory. (Typically the total amount requested through jpeg_get_small is
- * no more than 20K or so; this will be requested in chunks of a few K each.)
- * Behavior should be the same as for the standard library functions malloc
- * and free; in particular, jpeg_get_small must return NULL on failure.
- * On most systems, these ARE malloc and free. jpeg_free_small is passed the
- * size of the object being freed, just in case it's needed.
- * On an 80x86 machine using small-data memory model, these manage near heap.
- */
-
-EXTERN(void *) jpeg_get_small JPP((j_common_ptr cinfo, size_t sizeofobject));
-EXTERN(void) jpeg_free_small JPP((j_common_ptr cinfo, void * object,
- size_t sizeofobject));
-
-/*
- * These two functions are used to allocate and release large chunks of
- * memory (up to the total free space designated by jpeg_mem_available).
- * The interface is the same as above, except that on an 80x86 machine,
- * far pointers are used. On most other machines these are identical to
- * the jpeg_get/free_small routines; but we keep them separate anyway,
- * in case a different allocation strategy is desirable for large chunks.
- */
-
-EXTERN(void FAR *) jpeg_get_large JPP((j_common_ptr cinfo,
- size_t sizeofobject));
-EXTERN(void) jpeg_free_large JPP((j_common_ptr cinfo, void FAR * object,
- size_t sizeofobject));
-
-/*
- * The macro MAX_ALLOC_CHUNK designates the maximum number of bytes that may
- * be requested in a single call to jpeg_get_large (and jpeg_get_small for that
- * matter, but that case should never come into play). This macro is needed
- * to model the 64Kb-segment-size limit of far addressing on 80x86 machines.
- * On those machines, we expect that jconfig.h will provide a proper value.
- * On machines with 32-bit flat address spaces, any large constant may be used.
- *
- * NB: jmemmgr.c expects that MAX_ALLOC_CHUNK will be representable as type
- * size_t and will be a multiple of sizeof(align_type).
- */
-
-#ifndef MAX_ALLOC_CHUNK /* may be overridden in jconfig.h */
-#define MAX_ALLOC_CHUNK 1000000000L
-#endif
-
-/*
- * This routine computes the total space still available for allocation by
- * jpeg_get_large. If more space than this is needed, backing store will be
- * used. NOTE: any memory already allocated must not be counted.
- *
- * There is a minimum space requirement, corresponding to the minimum
- * feasible buffer sizes; jmemmgr.c will request that much space even if
- * jpeg_mem_available returns zero. The maximum space needed, enough to hold
- * all working storage in memory, is also passed in case it is useful.
- * Finally, the total space already allocated is passed. If no better
- * method is available, cinfo->mem->max_memory_to_use - already_allocated
- * is often a suitable calculation.
- *
- * It is OK for jpeg_mem_available to underestimate the space available
- * (that'll just lead to more backing-store access than is really necessary).
- * However, an overestimate will lead to failure. Hence it's wise to subtract
- * a slop factor from the true available space. 5% should be enough.
- *
- * On machines with lots of virtual memory, any large constant may be returned.
- * Conversely, zero may be returned to always use the minimum amount of memory.
- */
-
-EXTERN(long) jpeg_mem_available JPP((j_common_ptr cinfo,
- long min_bytes_needed,
- long max_bytes_needed,
- long already_allocated));
-
-
-/*
- * This structure holds whatever state is needed to access a single
- * backing-store object. The read/write/close method pointers are called
- * by jmemmgr.c to manipulate the backing-store object; all other fields
- * are private to the system-dependent backing store routines.
- */
-
-#define TEMP_NAME_LENGTH 64 /* max length of a temporary file's name */
-
-
-#ifdef USE_MSDOS_MEMMGR /* DOS-specific junk */
-
-typedef unsigned short XMSH; /* type of extended-memory handles */
-typedef unsigned short EMSH; /* type of expanded-memory handles */
-
-typedef union {
- short file_handle; /* DOS file handle if it's a temp file */
- XMSH xms_handle; /* handle if it's a chunk of XMS */
- EMSH ems_handle; /* handle if it's a chunk of EMS */
-} handle_union;
-
-#endif /* USE_MSDOS_MEMMGR */
-
-#ifdef USE_MAC_MEMMGR /* Mac-specific junk */
-#include <Files.h>
-#endif /* USE_MAC_MEMMGR */
-
-
-typedef struct backing_store_struct * backing_store_ptr;
-
-typedef struct backing_store_struct {
- /* Methods for reading/writing/closing this backing-store object */
- JMETHOD(void, read_backing_store, (j_common_ptr cinfo,
- backing_store_ptr info,
- void FAR * buffer_address,
- long file_offset, long byte_count));
- JMETHOD(void, write_backing_store, (j_common_ptr cinfo,
- backing_store_ptr info,
- void FAR * buffer_address,
- long file_offset, long byte_count));
- JMETHOD(void, close_backing_store, (j_common_ptr cinfo,
- backing_store_ptr info));
-
- /* Private fields for system-dependent backing-store management */
-#ifdef USE_MSDOS_MEMMGR
- /* For the MS-DOS manager (jmemdos.c), we need: */
- handle_union handle; /* reference to backing-store storage object */
- char temp_name[TEMP_NAME_LENGTH]; /* name if it's a file */
-#else
-#ifdef USE_MAC_MEMMGR
- /* For the Mac manager (jmemmac.c), we need: */
- short temp_file; /* file reference number to temp file */
- FSSpec tempSpec; /* the FSSpec for the temp file */
- char temp_name[TEMP_NAME_LENGTH]; /* name if it's a file */
-#else
- /* For a typical implementation with temp files, we need: */
-#ifndef _FPDFAPI_MINI_
- FXSYS_FILE * temp_file; /* stdio reference to temp file */
- char temp_name[TEMP_NAME_LENGTH]; /* name of temp file */
-#endif
-#endif
-#endif
-} backing_store_info;
-
-
-/*
- * Initial opening of a backing-store object. This must fill in the
- * read/write/close pointers in the object. The read/write routines
- * may take an error exit if the specified maximum file size is exceeded.
- * (If jpeg_mem_available always returns a large value, this routine can
- * just take an error exit.)
- */
-
-EXTERN(void) jpeg_open_backing_store JPP((j_common_ptr cinfo,
- backing_store_ptr info,
- long total_bytes_needed));
-
-
-/*
- * These routines take care of any system-dependent initialization and
- * cleanup required. jpeg_mem_init will be called before anything is
- * allocated (and, therefore, nothing in cinfo is of use except the error
- * manager pointer). It should return a suitable default value for
- * max_memory_to_use; this may subsequently be overridden by the surrounding
- * application. (Note that max_memory_to_use is only important if
- * jpeg_mem_available chooses to consult it ... no one else will.)
- * jpeg_mem_term may assume that all requested memory has been freed and that
- * all opened backing-store objects have been closed.
- */
-
-EXTERN(long) jpeg_mem_init JPP((j_common_ptr cinfo));
-EXTERN(void) jpeg_mem_term JPP((j_common_ptr cinfo));
+/*
+ * jmemsys.h
+ *
+ * Copyright (C) 1992-1997, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This include file defines the interface between the system-independent
+ * and system-dependent portions of the JPEG memory manager. No other
+ * modules need include it. (The system-independent portion is jmemmgr.c;
+ * there are several different versions of the system-dependent portion.)
+ *
+ * This file works as-is for the system-dependent memory managers supplied
+ * in the IJG distribution. You may need to modify it if you write a
+ * custom memory manager. If system-dependent changes are needed in
+ * this file, the best method is to #ifdef them based on a configuration
+ * symbol supplied in jconfig.h, as we have done with USE_MSDOS_MEMMGR
+ * and USE_MAC_MEMMGR.
+ */
+
+
+/* Short forms of external names for systems with brain-damaged linkers. */
+
+#ifdef NEED_SHORT_EXTERNAL_NAMES
+#define jpeg_get_small jGetSmall
+#define jpeg_free_small jFreeSmall
+#define jpeg_get_large jGetLarge
+#define jpeg_free_large jFreeLarge
+#define jpeg_mem_available jMemAvail
+#define jpeg_open_backing_store jOpenBackStore
+#define jpeg_mem_init jMemInit
+#define jpeg_mem_term jMemTerm
+#endif /* NEED_SHORT_EXTERNAL_NAMES */
+
+
+/*
+ * These two functions are used to allocate and release small chunks of
+ * memory. (Typically the total amount requested through jpeg_get_small is
+ * no more than 20K or so; this will be requested in chunks of a few K each.)
+ * Behavior should be the same as for the standard library functions malloc
+ * and free; in particular, jpeg_get_small must return NULL on failure.
+ * On most systems, these ARE malloc and free. jpeg_free_small is passed the
+ * size of the object being freed, just in case it's needed.
+ * On an 80x86 machine using small-data memory model, these manage near heap.
+ */
+
+EXTERN(void *) jpeg_get_small JPP((j_common_ptr cinfo, size_t sizeofobject));
+EXTERN(void) jpeg_free_small JPP((j_common_ptr cinfo, void * object,
+ size_t sizeofobject));
+
+/*
+ * These two functions are used to allocate and release large chunks of
+ * memory (up to the total free space designated by jpeg_mem_available).
+ * The interface is the same as above, except that on an 80x86 machine,
+ * far pointers are used. On most other machines these are identical to
+ * the jpeg_get/free_small routines; but we keep them separate anyway,
+ * in case a different allocation strategy is desirable for large chunks.
+ */
+
+EXTERN(void FAR *) jpeg_get_large JPP((j_common_ptr cinfo,
+ size_t sizeofobject));
+EXTERN(void) jpeg_free_large JPP((j_common_ptr cinfo, void FAR * object,
+ size_t sizeofobject));
+
+/*
+ * The macro MAX_ALLOC_CHUNK designates the maximum number of bytes that may
+ * be requested in a single call to jpeg_get_large (and jpeg_get_small for that
+ * matter, but that case should never come into play). This macro is needed
+ * to model the 64Kb-segment-size limit of far addressing on 80x86 machines.
+ * On those machines, we expect that jconfig.h will provide a proper value.
+ * On machines with 32-bit flat address spaces, any large constant may be used.
+ *
+ * NB: jmemmgr.c expects that MAX_ALLOC_CHUNK will be representable as type
+ * size_t and will be a multiple of sizeof(align_type).
+ */
+
+#ifndef MAX_ALLOC_CHUNK /* may be overridden in jconfig.h */
+#define MAX_ALLOC_CHUNK 1000000000L
+#endif
+
+/*
+ * This routine computes the total space still available for allocation by
+ * jpeg_get_large. If more space than this is needed, backing store will be
+ * used. NOTE: any memory already allocated must not be counted.
+ *
+ * There is a minimum space requirement, corresponding to the minimum
+ * feasible buffer sizes; jmemmgr.c will request that much space even if
+ * jpeg_mem_available returns zero. The maximum space needed, enough to hold
+ * all working storage in memory, is also passed in case it is useful.
+ * Finally, the total space already allocated is passed. If no better
+ * method is available, cinfo->mem->max_memory_to_use - already_allocated
+ * is often a suitable calculation.
+ *
+ * It is OK for jpeg_mem_available to underestimate the space available
+ * (that'll just lead to more backing-store access than is really necessary).
+ * However, an overestimate will lead to failure. Hence it's wise to subtract
+ * a slop factor from the true available space. 5% should be enough.
+ *
+ * On machines with lots of virtual memory, any large constant may be returned.
+ * Conversely, zero may be returned to always use the minimum amount of memory.
+ */
+
+EXTERN(long) jpeg_mem_available JPP((j_common_ptr cinfo,
+ long min_bytes_needed,
+ long max_bytes_needed,
+ long already_allocated));
+
+
+/*
+ * This structure holds whatever state is needed to access a single
+ * backing-store object. The read/write/close method pointers are called
+ * by jmemmgr.c to manipulate the backing-store object; all other fields
+ * are private to the system-dependent backing store routines.
+ */
+
+#define TEMP_NAME_LENGTH 64 /* max length of a temporary file's name */
+
+
+#ifdef USE_MSDOS_MEMMGR /* DOS-specific junk */
+
+typedef unsigned short XMSH; /* type of extended-memory handles */
+typedef unsigned short EMSH; /* type of expanded-memory handles */
+
+typedef union {
+ short file_handle; /* DOS file handle if it's a temp file */
+ XMSH xms_handle; /* handle if it's a chunk of XMS */
+ EMSH ems_handle; /* handle if it's a chunk of EMS */
+} handle_union;
+
+#endif /* USE_MSDOS_MEMMGR */
+
+#ifdef USE_MAC_MEMMGR /* Mac-specific junk */
+#include <Files.h>
+#endif /* USE_MAC_MEMMGR */
+
+
+typedef struct backing_store_struct * backing_store_ptr;
+
+typedef struct backing_store_struct {
+ /* Methods for reading/writing/closing this backing-store object */
+ JMETHOD(void, read_backing_store, (j_common_ptr cinfo,
+ backing_store_ptr info,
+ void FAR * buffer_address,
+ long file_offset, long byte_count));
+ JMETHOD(void, write_backing_store, (j_common_ptr cinfo,
+ backing_store_ptr info,
+ void FAR * buffer_address,
+ long file_offset, long byte_count));
+ JMETHOD(void, close_backing_store, (j_common_ptr cinfo,
+ backing_store_ptr info));
+
+ /* Private fields for system-dependent backing-store management */
+#ifdef USE_MSDOS_MEMMGR
+ /* For the MS-DOS manager (jmemdos.c), we need: */
+ handle_union handle; /* reference to backing-store storage object */
+ char temp_name[TEMP_NAME_LENGTH]; /* name if it's a file */
+#else
+#ifdef USE_MAC_MEMMGR
+ /* For the Mac manager (jmemmac.c), we need: */
+ short temp_file; /* file reference number to temp file */
+ FSSpec tempSpec; /* the FSSpec for the temp file */
+ char temp_name[TEMP_NAME_LENGTH]; /* name if it's a file */
+#else
+ /* For a typical implementation with temp files, we need: */
+#ifndef _FPDFAPI_MINI_
+ FXSYS_FILE * temp_file; /* stdio reference to temp file */
+ char temp_name[TEMP_NAME_LENGTH]; /* name of temp file */
+#endif
+#endif
+#endif
+} backing_store_info;
+
+
+/*
+ * Initial opening of a backing-store object. This must fill in the
+ * read/write/close pointers in the object. The read/write routines
+ * may take an error exit if the specified maximum file size is exceeded.
+ * (If jpeg_mem_available always returns a large value, this routine can
+ * just take an error exit.)
+ */
+
+EXTERN(void) jpeg_open_backing_store JPP((j_common_ptr cinfo,
+ backing_store_ptr info,
+ long total_bytes_needed));
+
+
+/*
+ * These routines take care of any system-dependent initialization and
+ * cleanup required. jpeg_mem_init will be called before anything is
+ * allocated (and, therefore, nothing in cinfo is of use except the error
+ * manager pointer). It should return a suitable default value for
+ * max_memory_to_use; this may subsequently be overridden by the surrounding
+ * application. (Note that max_memory_to_use is only important if
+ * jpeg_mem_available chooses to consult it ... no one else will.)
+ * jpeg_mem_term may assume that all requested memory has been freed and that
+ * all opened backing-store objects have been closed.
+ */
+
+EXTERN(long) jpeg_mem_init JPP((j_common_ptr cinfo));
+EXTERN(void) jpeg_mem_term JPP((j_common_ptr cinfo));
diff --git a/core/src/fxcodec/libjpeg/jmorecfg.h b/core/src/fxcodec/libjpeg/jmorecfg.h
index 3602114a5c..88d210954c 100644
--- a/core/src/fxcodec/libjpeg/jmorecfg.h
+++ b/core/src/fxcodec/libjpeg/jmorecfg.h
@@ -1,376 +1,376 @@
-/*
- * jmorecfg.h
- *
- * Copyright (C) 1991-1997, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains additional configuration options that customize the
- * JPEG software for special applications or support machine-dependent
- * optimizations. Most users will not need to touch this file.
- */
-
-#ifdef _MSC_VER
-#pragma warning (disable : 4142)
-#endif
-
-/*
- * Define BITS_IN_JSAMPLE as either
- * 8 for 8-bit sample values (the usual setting)
- * 12 for 12-bit sample values
- * Only 8 and 12 are legal data precisions for lossy JPEG according to the
- * JPEG standard, and the IJG code does not support anything else!
- * We do not support run-time selection of data precision, sorry.
- */
-
-#define BITS_IN_JSAMPLE 8 /* use 8 or 12 */
-
-
-/*
- * Maximum number of components (color channels) allowed in JPEG image.
- * To meet the letter of the JPEG spec, set this to 255. However, darn
- * few applications need more than 4 channels (maybe 5 for CMYK + alpha
- * mask). We recommend 10 as a reasonable compromise; use 4 if you are
- * really short on memory. (Each allowed component costs a hundred or so
- * bytes of storage, whether actually used in an image or not.)
- */
-
-#define MAX_COMPONENTS 10 /* maximum number of image components */
-
-
-/*
- * Basic data types.
- * You may need to change these if you have a machine with unusual data
- * type sizes; for example, "char" not 8 bits, "short" not 16 bits,
- * or "long" not 32 bits. We don't care whether "int" is 16 or 32 bits,
- * but it had better be at least 16.
- */
-
-/* Representation of a single sample (pixel element value).
- * We frequently allocate large arrays of these, so it's important to keep
- * them small. But if you have memory to burn and access to char or short
- * arrays is very slow on your hardware, you might want to change these.
- */
-
-#if BITS_IN_JSAMPLE == 8
-/* JSAMPLE should be the smallest type that will hold the values 0..255.
- * You can use a signed char by having GETJSAMPLE mask it with 0xFF.
- */
-
-#ifdef HAVE_UNSIGNED_CHAR
-
-typedef unsigned char JSAMPLE;
-#define GETJSAMPLE(value) ((int) (value))
-
-#else /* not HAVE_UNSIGNED_CHAR */
-
-typedef char JSAMPLE;
-#ifdef CHAR_IS_UNSIGNED
-#define GETJSAMPLE(value) ((int) (value))
-#else
-#define GETJSAMPLE(value) ((int) (value) & 0xFF)
-#endif /* CHAR_IS_UNSIGNED */
-
-#endif /* HAVE_UNSIGNED_CHAR */
-
-#define MAXJSAMPLE 255
-#define CENTERJSAMPLE 128
-
-#endif /* BITS_IN_JSAMPLE == 8 */
-
-
-#if BITS_IN_JSAMPLE == 12
-/* JSAMPLE should be the smallest type that will hold the values 0..4095.
- * On nearly all machines "short" will do nicely.
- */
-
-typedef short JSAMPLE;
-#define GETJSAMPLE(value) ((int) (value))
-
-#define MAXJSAMPLE 4095
-#define CENTERJSAMPLE 2048
-
-#endif /* BITS_IN_JSAMPLE == 12 */
-
-
-/* Representation of a DCT frequency coefficient.
- * This should be a signed value of at least 16 bits; "short" is usually OK.
- * Again, we allocate large arrays of these, but you can change to int
- * if you have memory to burn and "short" is really slow.
- */
-
-typedef short JCOEF;
-
-
-/* Compressed datastreams are represented as arrays of JOCTET.
- * These must be EXACTLY 8 bits wide, at least once they are written to
- * external storage. Note that when using the stdio data source/destination
- * managers, this is also the data type passed to fread/fwrite.
- */
-
-#ifdef HAVE_UNSIGNED_CHAR
-
-typedef unsigned char JOCTET;
-#define GETJOCTET(value) (value)
-
-#else /* not HAVE_UNSIGNED_CHAR */
-
-typedef char JOCTET;
-#ifdef CHAR_IS_UNSIGNED
-#define GETJOCTET(value) (value)
-#else
-#define GETJOCTET(value) ((value) & 0xFF)
-#endif /* CHAR_IS_UNSIGNED */
-
-#endif /* HAVE_UNSIGNED_CHAR */
-
-
-/* These typedefs are used for various table entries and so forth.
- * They must be at least as wide as specified; but making them too big
- * won't cost a huge amount of memory, so we don't provide special
- * extraction code like we did for JSAMPLE. (In other words, these
- * typedefs live at a different point on the speed/space tradeoff curve.)
- */
-
-#if _FX_OS_ != _FX_VXWORKS_
-
-/* UINT8 must hold at least the values 0..255. */
-
-#ifdef HAVE_UNSIGNED_CHAR
-typedef unsigned char UINT8;
-#else /* not HAVE_UNSIGNED_CHAR */
-#ifdef CHAR_IS_UNSIGNED
-typedef char UINT8;
-#else /* not CHAR_IS_UNSIGNED */
-typedef short UINT8;
-#endif /* CHAR_IS_UNSIGNED */
-#endif /* HAVE_UNSIGNED_CHAR */
-
-
-/* UINT16 must hold at least the values 0..65535. */
-
-#ifdef HAVE_UNSIGNED_SHORT
-typedef unsigned short UINT16;
-#else /* not HAVE_UNSIGNED_SHORT */
-typedef unsigned int UINT16;
-#endif /* HAVE_UNSIGNED_SHORT */
-
-/* INT16 must hold at least the values -32768..32767. */
-
-#ifndef XMD_H /* X11/xmd.h correctly defines INT16 */
-typedef short INT16;
-#endif
-
-/* INT32 must hold at least signed 32-bit values. */
-
-#ifndef XMD_H /* X11/xmd.h correctly defines INT32 */
-typedef int INT32;
-#endif
-
-#endif
-
-/* Datatype used for image dimensions. The JPEG standard only supports
- * images up to 64K*64K due to 16-bit fields in SOF markers. Therefore
- * "unsigned int" is sufficient on all machines. However, if you need to
- * handle larger images and you don't mind deviating from the spec, you
- * can change this datatype.
- */
-
-typedef unsigned int JDIMENSION;
-
-#define JPEG_MAX_DIMENSION 65500L /* a tad under 64K to prevent overflows */
-
-
-/* These macros are used in all function definitions and extern declarations.
- * You could modify them if you need to change function linkage conventions;
- * in particular, you'll need to do that to make the library a Windows DLL.
- * Another application is to make all functions global for use with debuggers
- * or code profilers that require it.
- */
-
-/* a function called through method pointers: */
-#define METHODDEF(type) static type
-/* a function used only in its module: */
-#define LOCAL(type) static type
-/* a function referenced thru EXTERNs: */
-#define GLOBAL(type) type
-
-#ifdef _FX_MANAGED_CODE_
-#define EXTERN(type) extern "C" type
-#else
-/* a reference to a GLOBAL function: */
-#define EXTERN(type) extern type
-#endif
-
-
-/* This macro is used to declare a "method", that is, a function pointer.
- * We want to supply prototype parameters if the compiler can cope.
- * Note that the arglist parameter must be parenthesized!
- * Again, you can customize this if you need special linkage keywords.
- */
-
-#ifdef HAVE_PROTOTYPES
-#define JMETHOD(type,methodname,arglist) type (*methodname) arglist
-#else
-#define JMETHOD(type,methodname,arglist) type (*methodname) ()
-#endif
-
-
-/* Here is the pseudo-keyword for declaring pointers that must be "far"
- * on 80x86 machines. Most of the specialized coding for 80x86 is handled
- * by just saying "FAR *" where such a pointer is needed. In a few places
- * explicit coding is needed; see uses of the NEED_FAR_POINTERS symbol.
- */
-
-#ifdef NEED_FAR_POINTERS
-#define FAR far
-#else
-//#define FAR
-#endif
-
-
-/*
- * On a few systems, type boolean and/or its values FALSE, TRUE may appear
- * in standard header files. Or you may have conflicts with application-
- * specific header files that you want to include together with these files.
- * Defining HAVE_BOOLEAN before including jpeglib.h should make it work.
- */
-
-#ifndef HAVE_BOOLEAN
-typedef int boolean;
-#endif
-#ifndef FALSE /* in case these macros already exist */
-#define FALSE 0 /* values of boolean */
-#endif
-#ifndef TRUE
-#define TRUE 1
-#endif
-
-
-/*
- * The remaining options affect code selection within the JPEG library,
- * but they don't need to be visible to most applications using the library.
- * To minimize application namespace pollution, the symbols won't be
- * defined unless JPEG_INTERNALS or JPEG_INTERNAL_OPTIONS has been defined.
- */
-
-#ifdef JPEG_INTERNALS
-#define JPEG_INTERNAL_OPTIONS
-#endif
-
-#ifdef JPEG_INTERNAL_OPTIONS
-
-
-/*
- * These defines indicate whether to include various optional functions.
- * Undefining some of these symbols will produce a smaller but less capable
- * library. Note that you can leave certain source files out of the
- * compilation/linking process if you've #undef'd the corresponding symbols.
- * (You may HAVE to do that if your compiler doesn't like null source files.)
- */
-
-/* Arithmetic coding is unsupported for legal reasons. Complaints to IBM. */
-
-/* Capability options common to encoder and decoder: */
-
-#define DCT_ISLOW_SUPPORTED /* slow but accurate integer algorithm */
-#define DCT_IFAST_SUPPORTED /* faster, less accurate integer method */
-#undef DCT_FLOAT_SUPPORTED /* floating-point: accurate, fast on fast HW */
-
-/* Encoder capability options: */
-
-#undef C_ARITH_CODING_SUPPORTED /* Arithmetic coding back end? */
-#define C_MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? */
-#define C_PROGRESSIVE_SUPPORTED /* Progressive JPEG? (Requires MULTISCAN)*/
-#define ENTROPY_OPT_SUPPORTED /* Optimization of entropy coding parms? */
-/* Note: if you selected 12-bit data precision, it is dangerous to turn off
- * ENTROPY_OPT_SUPPORTED. The standard Huffman tables are only good for 8-bit
- * precision, so jchuff.c normally uses entropy optimization to compute
- * usable tables for higher precision. If you don't want to do optimization,
- * you'll have to supply different default Huffman tables.
- * The exact same statements apply for progressive JPEG: the default tables
- * don't work for progressive mode. (This may get fixed, however.)
- */
-#define INPUT_SMOOTHING_SUPPORTED /* Input image smoothing option? */
-
-/* Decoder capability options: */
-
-#undef D_ARITH_CODING_SUPPORTED /* Arithmetic coding back end? */
-#define D_MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? */
-#define D_PROGRESSIVE_SUPPORTED /* Progressive JPEG? (Requires MULTISCAN)*/
-#define SAVE_MARKERS_SUPPORTED /* jpeg_save_markers() needed? */
-#define BLOCK_SMOOTHING_SUPPORTED /* Block smoothing? (Progressive only) */
-#define IDCT_SCALING_SUPPORTED /* Output rescaling via IDCT? */
-#undef UPSAMPLE_SCALING_SUPPORTED /* Output rescaling at upsample stage? */
-#define UPSAMPLE_MERGING_SUPPORTED /* Fast path for sloppy upsampling? */
-#undef QUANT_1PASS_SUPPORTED /* 1-pass color quantization? */
-#undef QUANT_2PASS_SUPPORTED /* 2-pass color quantization? */
-
-/* more capability options later, no doubt */
-
-
-/*
- * Ordering of RGB data in scanlines passed to or from the application.
- * If your application wants to deal with data in the order B,G,R, just
- * change these macros. You can also deal with formats such as R,G,B,X
- * (one extra byte per pixel) by changing RGB_PIXELSIZE. Note that changing
- * the offsets will also change the order in which colormap data is organized.
- * RESTRICTIONS:
- * 1. The sample applications cjpeg,djpeg do NOT support modified RGB formats.
- * 2. These macros only affect RGB<=>YCbCr color conversion, so they are not
- * useful if you are using JPEG color spaces other than YCbCr or grayscale.
- * 3. The color quantizer modules will not behave desirably if RGB_PIXELSIZE
- * is not 3 (they don't understand about dummy color components!). So you
- * can't use color quantization if you change that value.
- */
-
-#define RGB_RED 0 /* Offset of Red in an RGB scanline element */
-#define RGB_GREEN 1 /* Offset of Green */
-#define RGB_BLUE 2 /* Offset of Blue */
-#define RGB_PIXELSIZE 3 /* JSAMPLEs per RGB scanline element */
-
-
-/* Definitions for speed-related optimizations. */
-
-
-/* If your compiler supports inline functions, define INLINE
- * as the inline keyword; otherwise define it as empty.
- */
-
-#ifndef INLINE
-#ifdef __GNUC__ /* for instance, GNU C knows about inline */
-#define INLINE __inline__
-#endif
-#ifndef INLINE
-#define INLINE /* default is to define it as empty */
-#endif
-#endif
-
-
-/* On some machines (notably 68000 series) "int" is 32 bits, but multiplying
- * two 16-bit shorts is faster than multiplying two ints. Define MULTIPLIER
- * as short on such a machine. MULTIPLIER must be at least 16 bits wide.
- */
-
-#ifndef MULTIPLIER
-#define MULTIPLIER int /* type for fastest integer multiply */
-#endif
-
-
-/* FAST_FLOAT should be either float or double, whichever is done faster
- * by your compiler. (Note that this type is only used in the floating point
- * DCT routines, so it only matters if you've defined DCT_FLOAT_SUPPORTED.)
- * Typically, float is faster in ANSI C compilers, while double is faster in
- * pre-ANSI compilers (because they insist on converting to double anyway).
- * The code below therefore chooses float if we have ANSI-style prototypes.
- */
-
-#ifndef FAST_FLOAT
-#ifdef HAVE_PROTOTYPES
-#define FAST_FLOAT float
-#else
-#define FAST_FLOAT double
-#endif
-#endif
-
-#endif /* JPEG_INTERNAL_OPTIONS */
+/*
+ * jmorecfg.h
+ *
+ * Copyright (C) 1991-1997, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains additional configuration options that customize the
+ * JPEG software for special applications or support machine-dependent
+ * optimizations. Most users will not need to touch this file.
+ */
+
+#ifdef _MSC_VER
+#pragma warning (disable : 4142)
+#endif
+
+/*
+ * Define BITS_IN_JSAMPLE as either
+ * 8 for 8-bit sample values (the usual setting)
+ * 12 for 12-bit sample values
+ * Only 8 and 12 are legal data precisions for lossy JPEG according to the
+ * JPEG standard, and the IJG code does not support anything else!
+ * We do not support run-time selection of data precision, sorry.
+ */
+
+#define BITS_IN_JSAMPLE 8 /* use 8 or 12 */
+
+
+/*
+ * Maximum number of components (color channels) allowed in JPEG image.
+ * To meet the letter of the JPEG spec, set this to 255. However, darn
+ * few applications need more than 4 channels (maybe 5 for CMYK + alpha
+ * mask). We recommend 10 as a reasonable compromise; use 4 if you are
+ * really short on memory. (Each allowed component costs a hundred or so
+ * bytes of storage, whether actually used in an image or not.)
+ */
+
+#define MAX_COMPONENTS 10 /* maximum number of image components */
+
+
+/*
+ * Basic data types.
+ * You may need to change these if you have a machine with unusual data
+ * type sizes; for example, "char" not 8 bits, "short" not 16 bits,
+ * or "long" not 32 bits. We don't care whether "int" is 16 or 32 bits,
+ * but it had better be at least 16.
+ */
+
+/* Representation of a single sample (pixel element value).
+ * We frequently allocate large arrays of these, so it's important to keep
+ * them small. But if you have memory to burn and access to char or short
+ * arrays is very slow on your hardware, you might want to change these.
+ */
+
+#if BITS_IN_JSAMPLE == 8
+/* JSAMPLE should be the smallest type that will hold the values 0..255.
+ * You can use a signed char by having GETJSAMPLE mask it with 0xFF.
+ */
+
+#ifdef HAVE_UNSIGNED_CHAR
+
+typedef unsigned char JSAMPLE;
+#define GETJSAMPLE(value) ((int) (value))
+
+#else /* not HAVE_UNSIGNED_CHAR */
+
+typedef char JSAMPLE;
+#ifdef CHAR_IS_UNSIGNED
+#define GETJSAMPLE(value) ((int) (value))
+#else
+#define GETJSAMPLE(value) ((int) (value) & 0xFF)
+#endif /* CHAR_IS_UNSIGNED */
+
+#endif /* HAVE_UNSIGNED_CHAR */
+
+#define MAXJSAMPLE 255
+#define CENTERJSAMPLE 128
+
+#endif /* BITS_IN_JSAMPLE == 8 */
+
+
+#if BITS_IN_JSAMPLE == 12
+/* JSAMPLE should be the smallest type that will hold the values 0..4095.
+ * On nearly all machines "short" will do nicely.
+ */
+
+typedef short JSAMPLE;
+#define GETJSAMPLE(value) ((int) (value))
+
+#define MAXJSAMPLE 4095
+#define CENTERJSAMPLE 2048
+
+#endif /* BITS_IN_JSAMPLE == 12 */
+
+
+/* Representation of a DCT frequency coefficient.
+ * This should be a signed value of at least 16 bits; "short" is usually OK.
+ * Again, we allocate large arrays of these, but you can change to int
+ * if you have memory to burn and "short" is really slow.
+ */
+
+typedef short JCOEF;
+
+
+/* Compressed datastreams are represented as arrays of JOCTET.
+ * These must be EXACTLY 8 bits wide, at least once they are written to
+ * external storage. Note that when using the stdio data source/destination
+ * managers, this is also the data type passed to fread/fwrite.
+ */
+
+#ifdef HAVE_UNSIGNED_CHAR
+
+typedef unsigned char JOCTET;
+#define GETJOCTET(value) (value)
+
+#else /* not HAVE_UNSIGNED_CHAR */
+
+typedef char JOCTET;
+#ifdef CHAR_IS_UNSIGNED
+#define GETJOCTET(value) (value)
+#else
+#define GETJOCTET(value) ((value) & 0xFF)
+#endif /* CHAR_IS_UNSIGNED */
+
+#endif /* HAVE_UNSIGNED_CHAR */
+
+
+/* These typedefs are used for various table entries and so forth.
+ * They must be at least as wide as specified; but making them too big
+ * won't cost a huge amount of memory, so we don't provide special
+ * extraction code like we did for JSAMPLE. (In other words, these
+ * typedefs live at a different point on the speed/space tradeoff curve.)
+ */
+
+#if _FX_OS_ != _FX_VXWORKS_
+
+/* UINT8 must hold at least the values 0..255. */
+
+#ifdef HAVE_UNSIGNED_CHAR
+typedef unsigned char UINT8;
+#else /* not HAVE_UNSIGNED_CHAR */
+#ifdef CHAR_IS_UNSIGNED
+typedef char UINT8;
+#else /* not CHAR_IS_UNSIGNED */
+typedef short UINT8;
+#endif /* CHAR_IS_UNSIGNED */
+#endif /* HAVE_UNSIGNED_CHAR */
+
+
+/* UINT16 must hold at least the values 0..65535. */
+
+#ifdef HAVE_UNSIGNED_SHORT
+typedef unsigned short UINT16;
+#else /* not HAVE_UNSIGNED_SHORT */
+typedef unsigned int UINT16;
+#endif /* HAVE_UNSIGNED_SHORT */
+
+/* INT16 must hold at least the values -32768..32767. */
+
+#ifndef XMD_H /* X11/xmd.h correctly defines INT16 */
+typedef short INT16;
+#endif
+
+/* INT32 must hold at least signed 32-bit values. */
+
+#ifndef XMD_H /* X11/xmd.h correctly defines INT32 */
+typedef int INT32;
+#endif
+
+#endif
+
+/* Datatype used for image dimensions. The JPEG standard only supports
+ * images up to 64K*64K due to 16-bit fields in SOF markers. Therefore
+ * "unsigned int" is sufficient on all machines. However, if you need to
+ * handle larger images and you don't mind deviating from the spec, you
+ * can change this datatype.
+ */
+
+typedef unsigned int JDIMENSION;
+
+#define JPEG_MAX_DIMENSION 65500L /* a tad under 64K to prevent overflows */
+
+
+/* These macros are used in all function definitions and extern declarations.
+ * You could modify them if you need to change function linkage conventions;
+ * in particular, you'll need to do that to make the library a Windows DLL.
+ * Another application is to make all functions global for use with debuggers
+ * or code profilers that require it.
+ */
+
+/* a function called through method pointers: */
+#define METHODDEF(type) static type
+/* a function used only in its module: */
+#define LOCAL(type) static type
+/* a function referenced thru EXTERNs: */
+#define GLOBAL(type) type
+
+#ifdef _FX_MANAGED_CODE_
+#define EXTERN(type) extern "C" type
+#else
+/* a reference to a GLOBAL function: */
+#define EXTERN(type) extern type
+#endif
+
+
+/* This macro is used to declare a "method", that is, a function pointer.
+ * We want to supply prototype parameters if the compiler can cope.
+ * Note that the arglist parameter must be parenthesized!
+ * Again, you can customize this if you need special linkage keywords.
+ */
+
+#ifdef HAVE_PROTOTYPES
+#define JMETHOD(type,methodname,arglist) type (*methodname) arglist
+#else
+#define JMETHOD(type,methodname,arglist) type (*methodname) ()
+#endif
+
+
+/* Here is the pseudo-keyword for declaring pointers that must be "far"
+ * on 80x86 machines. Most of the specialized coding for 80x86 is handled
+ * by just saying "FAR *" where such a pointer is needed. In a few places
+ * explicit coding is needed; see uses of the NEED_FAR_POINTERS symbol.
+ */
+
+#ifdef NEED_FAR_POINTERS
+#define FAR far
+#else
+//#define FAR
+#endif
+
+
+/*
+ * On a few systems, type boolean and/or its values FALSE, TRUE may appear
+ * in standard header files. Or you may have conflicts with application-
+ * specific header files that you want to include together with these files.
+ * Defining HAVE_BOOLEAN before including jpeglib.h should make it work.
+ */
+
+#ifndef HAVE_BOOLEAN
+typedef int boolean;
+#endif
+#ifndef FALSE /* in case these macros already exist */
+#define FALSE 0 /* values of boolean */
+#endif
+#ifndef TRUE
+#define TRUE 1
+#endif
+
+
+/*
+ * The remaining options affect code selection within the JPEG library,
+ * but they don't need to be visible to most applications using the library.
+ * To minimize application namespace pollution, the symbols won't be
+ * defined unless JPEG_INTERNALS or JPEG_INTERNAL_OPTIONS has been defined.
+ */
+
+#ifdef JPEG_INTERNALS
+#define JPEG_INTERNAL_OPTIONS
+#endif
+
+#ifdef JPEG_INTERNAL_OPTIONS
+
+
+/*
+ * These defines indicate whether to include various optional functions.
+ * Undefining some of these symbols will produce a smaller but less capable
+ * library. Note that you can leave certain source files out of the
+ * compilation/linking process if you've #undef'd the corresponding symbols.
+ * (You may HAVE to do that if your compiler doesn't like null source files.)
+ */
+
+/* Arithmetic coding is unsupported for legal reasons. Complaints to IBM. */
+
+/* Capability options common to encoder and decoder: */
+
+#define DCT_ISLOW_SUPPORTED /* slow but accurate integer algorithm */
+#define DCT_IFAST_SUPPORTED /* faster, less accurate integer method */
+#undef DCT_FLOAT_SUPPORTED /* floating-point: accurate, fast on fast HW */
+
+/* Encoder capability options: */
+
+#undef C_ARITH_CODING_SUPPORTED /* Arithmetic coding back end? */
+#define C_MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? */
+#define C_PROGRESSIVE_SUPPORTED /* Progressive JPEG? (Requires MULTISCAN)*/
+#define ENTROPY_OPT_SUPPORTED /* Optimization of entropy coding parms? */
+/* Note: if you selected 12-bit data precision, it is dangerous to turn off
+ * ENTROPY_OPT_SUPPORTED. The standard Huffman tables are only good for 8-bit
+ * precision, so jchuff.c normally uses entropy optimization to compute
+ * usable tables for higher precision. If you don't want to do optimization,
+ * you'll have to supply different default Huffman tables.
+ * The exact same statements apply for progressive JPEG: the default tables
+ * don't work for progressive mode. (This may get fixed, however.)
+ */
+#define INPUT_SMOOTHING_SUPPORTED /* Input image smoothing option? */
+
+/* Decoder capability options: */
+
+#undef D_ARITH_CODING_SUPPORTED /* Arithmetic coding back end? */
+#define D_MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? */
+#define D_PROGRESSIVE_SUPPORTED /* Progressive JPEG? (Requires MULTISCAN)*/
+#define SAVE_MARKERS_SUPPORTED /* jpeg_save_markers() needed? */
+#define BLOCK_SMOOTHING_SUPPORTED /* Block smoothing? (Progressive only) */
+#define IDCT_SCALING_SUPPORTED /* Output rescaling via IDCT? */
+#undef UPSAMPLE_SCALING_SUPPORTED /* Output rescaling at upsample stage? */
+#define UPSAMPLE_MERGING_SUPPORTED /* Fast path for sloppy upsampling? */
+#undef QUANT_1PASS_SUPPORTED /* 1-pass color quantization? */
+#undef QUANT_2PASS_SUPPORTED /* 2-pass color quantization? */
+
+/* more capability options later, no doubt */
+
+
+/*
+ * Ordering of RGB data in scanlines passed to or from the application.
+ * If your application wants to deal with data in the order B,G,R, just
+ * change these macros. You can also deal with formats such as R,G,B,X
+ * (one extra byte per pixel) by changing RGB_PIXELSIZE. Note that changing
+ * the offsets will also change the order in which colormap data is organized.
+ * RESTRICTIONS:
+ * 1. The sample applications cjpeg,djpeg do NOT support modified RGB formats.
+ * 2. These macros only affect RGB<=>YCbCr color conversion, so they are not
+ * useful if you are using JPEG color spaces other than YCbCr or grayscale.
+ * 3. The color quantizer modules will not behave desirably if RGB_PIXELSIZE
+ * is not 3 (they don't understand about dummy color components!). So you
+ * can't use color quantization if you change that value.
+ */
+
+#define RGB_RED 0 /* Offset of Red in an RGB scanline element */
+#define RGB_GREEN 1 /* Offset of Green */
+#define RGB_BLUE 2 /* Offset of Blue */
+#define RGB_PIXELSIZE 3 /* JSAMPLEs per RGB scanline element */
+
+
+/* Definitions for speed-related optimizations. */
+
+
+/* If your compiler supports inline functions, define INLINE
+ * as the inline keyword; otherwise define it as empty.
+ */
+
+#ifndef INLINE
+#ifdef __GNUC__ /* for instance, GNU C knows about inline */
+#define INLINE __inline__
+#endif
+#ifndef INLINE
+#define INLINE /* default is to define it as empty */
+#endif
+#endif
+
+
+/* On some machines (notably 68000 series) "int" is 32 bits, but multiplying
+ * two 16-bit shorts is faster than multiplying two ints. Define MULTIPLIER
+ * as short on such a machine. MULTIPLIER must be at least 16 bits wide.
+ */
+
+#ifndef MULTIPLIER
+#define MULTIPLIER int /* type for fastest integer multiply */
+#endif
+
+
+/* FAST_FLOAT should be either float or double, whichever is done faster
+ * by your compiler. (Note that this type is only used in the floating point
+ * DCT routines, so it only matters if you've defined DCT_FLOAT_SUPPORTED.)
+ * Typically, float is faster in ANSI C compilers, while double is faster in
+ * pre-ANSI compilers (because they insist on converting to double anyway).
+ * The code below therefore chooses float if we have ANSI-style prototypes.
+ */
+
+#ifndef FAST_FLOAT
+#ifdef HAVE_PROTOTYPES
+#define FAST_FLOAT float
+#else
+#define FAST_FLOAT double
+#endif
+#endif
+
+#endif /* JPEG_INTERNAL_OPTIONS */
diff --git a/core/src/fxcodec/libjpeg/jpegint.h b/core/src/fxcodec/libjpeg/jpegint.h
index 685a3610b2..95b00d405c 100644
--- a/core/src/fxcodec/libjpeg/jpegint.h
+++ b/core/src/fxcodec/libjpeg/jpegint.h
@@ -1,392 +1,392 @@
-/*
- * jpegint.h
- *
- * Copyright (C) 1991-1997, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file provides common declarations for the various JPEG modules.
- * These declarations are considered internal to the JPEG library; most
- * applications using the library shouldn't need to include this file.
- */
-
-
-/* Declarations for both compression & decompression */
-
-typedef enum { /* Operating modes for buffer controllers */
- JBUF_PASS_THRU, /* Plain stripwise operation */
- /* Remaining modes require a full-image buffer to have been created */
- JBUF_SAVE_SOURCE, /* Run source subobject only, save output */
- JBUF_CRANK_DEST, /* Run dest subobject only, using saved data */
- JBUF_SAVE_AND_PASS /* Run both subobjects, save output */
-} J_BUF_MODE;
-
-/* Values of global_state field (jdapi.c has some dependencies on ordering!) */
-#define CSTATE_START 100 /* after create_compress */
-#define CSTATE_SCANNING 101 /* start_compress done, write_scanlines OK */
-#define CSTATE_RAW_OK 102 /* start_compress done, write_raw_data OK */
-#define CSTATE_WRCOEFS 103 /* jpeg_write_coefficients done */
-#define DSTATE_START 200 /* after create_decompress */
-#define DSTATE_INHEADER 201 /* reading header markers, no SOS yet */
-#define DSTATE_READY 202 /* found SOS, ready for start_decompress */
-#define DSTATE_PRELOAD 203 /* reading multiscan file in start_decompress*/
-#define DSTATE_PRESCAN 204 /* performing dummy pass for 2-pass quant */
-#define DSTATE_SCANNING 205 /* start_decompress done, read_scanlines OK */
-#define DSTATE_RAW_OK 206 /* start_decompress done, read_raw_data OK */
-#define DSTATE_BUFIMAGE 207 /* expecting jpeg_start_output */
-#define DSTATE_BUFPOST 208 /* looking for SOS/EOI in jpeg_finish_output */
-#define DSTATE_RDCOEFS 209 /* reading file in jpeg_read_coefficients */
-#define DSTATE_STOPPING 210 /* looking for EOI in jpeg_finish_decompress */
-
-
-/* Declarations for compression modules */
-
-/* Master control module */
-struct jpeg_comp_master {
- JMETHOD(void, prepare_for_pass, (j_compress_ptr cinfo));
- JMETHOD(void, pass_startup, (j_compress_ptr cinfo));
- JMETHOD(void, finish_pass, (j_compress_ptr cinfo));
-
- /* State variables made visible to other modules */
- boolean call_pass_startup; /* True if pass_startup must be called */
- boolean is_last_pass; /* True during last pass */
-};
-
-/* Main buffer control (downsampled-data buffer) */
-struct jpeg_c_main_controller {
- JMETHOD(void, start_pass, (j_compress_ptr cinfo, J_BUF_MODE pass_mode));
- JMETHOD(void, process_data, (j_compress_ptr cinfo,
- JSAMPARRAY input_buf, JDIMENSION *in_row_ctr,
- JDIMENSION in_rows_avail));
-};
-
-/* Compression preprocessing (downsampling input buffer control) */
-struct jpeg_c_prep_controller {
- JMETHOD(void, start_pass, (j_compress_ptr cinfo, J_BUF_MODE pass_mode));
- JMETHOD(void, pre_process_data, (j_compress_ptr cinfo,
- JSAMPARRAY input_buf,
- JDIMENSION *in_row_ctr,
- JDIMENSION in_rows_avail,
- JSAMPIMAGE output_buf,
- JDIMENSION *out_row_group_ctr,
- JDIMENSION out_row_groups_avail));
-};
-
-/* Coefficient buffer control */
-struct jpeg_c_coef_controller {
- JMETHOD(void, start_pass, (j_compress_ptr cinfo, J_BUF_MODE pass_mode));
- JMETHOD(boolean, compress_data, (j_compress_ptr cinfo,
- JSAMPIMAGE input_buf));
-};
-
-/* Colorspace conversion */
-struct jpeg_color_converter {
- JMETHOD(void, start_pass, (j_compress_ptr cinfo));
- JMETHOD(void, color_convert, (j_compress_ptr cinfo,
- JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
- JDIMENSION output_row, int num_rows));
-};
-
-/* Downsampling */
-struct jpeg_downsampler {
- JMETHOD(void, start_pass, (j_compress_ptr cinfo));
- JMETHOD(void, downsample, (j_compress_ptr cinfo,
- JSAMPIMAGE input_buf, JDIMENSION in_row_index,
- JSAMPIMAGE output_buf,
- JDIMENSION out_row_group_index));
-
- boolean need_context_rows; /* TRUE if need rows above & below */
-};
-
-/* Forward DCT (also controls coefficient quantization) */
-struct jpeg_forward_dct {
- JMETHOD(void, start_pass, (j_compress_ptr cinfo));
- /* perhaps this should be an array??? */
- JMETHOD(void, forward_DCT, (j_compress_ptr cinfo,
- jpeg_component_info * compptr,
- JSAMPARRAY sample_data, JBLOCKROW coef_blocks,
- JDIMENSION start_row, JDIMENSION start_col,
- JDIMENSION num_blocks));
-};
-
-/* Entropy encoding */
-struct jpeg_entropy_encoder {
- JMETHOD(void, start_pass, (j_compress_ptr cinfo, boolean gather_statistics));
- JMETHOD(boolean, encode_mcu, (j_compress_ptr cinfo, JBLOCKROW *MCU_data));
- JMETHOD(void, finish_pass, (j_compress_ptr cinfo));
-};
-
-/* Marker writing */
-struct jpeg_marker_writer {
- JMETHOD(void, write_file_header, (j_compress_ptr cinfo));
- JMETHOD(void, write_frame_header, (j_compress_ptr cinfo));
- JMETHOD(void, write_scan_header, (j_compress_ptr cinfo));
- JMETHOD(void, write_file_trailer, (j_compress_ptr cinfo));
- JMETHOD(void, write_tables_only, (j_compress_ptr cinfo));
- /* These routines are exported to allow insertion of extra markers */
- /* Probably only COM and APPn markers should be written this way */
- JMETHOD(void, write_marker_header, (j_compress_ptr cinfo, int marker,
- unsigned int datalen));
- JMETHOD(void, write_marker_byte, (j_compress_ptr cinfo, int val));
-};
-
-
-/* Declarations for decompression modules */
-
-/* Master control module */
-struct jpeg_decomp_master {
- JMETHOD(void, prepare_for_output_pass, (j_decompress_ptr cinfo));
- JMETHOD(void, finish_output_pass, (j_decompress_ptr cinfo));
-
- /* State variables made visible to other modules */
- boolean is_dummy_pass; /* True during 1st pass for 2-pass quant */
-};
-
-/* Input control module */
-struct jpeg_input_controller {
- JMETHOD(int, consume_input, (j_decompress_ptr cinfo));
- JMETHOD(void, reset_input_controller, (j_decompress_ptr cinfo));
- JMETHOD(void, start_input_pass, (j_decompress_ptr cinfo));
- JMETHOD(void, finish_input_pass, (j_decompress_ptr cinfo));
-
- /* State variables made visible to other modules */
- boolean has_multiple_scans; /* True if file has multiple scans */
- boolean eoi_reached; /* True when EOI has been consumed */
-};
-
-/* Main buffer control (downsampled-data buffer) */
-struct jpeg_d_main_controller {
- JMETHOD(void, start_pass, (j_decompress_ptr cinfo, J_BUF_MODE pass_mode));
- JMETHOD(void, process_data, (j_decompress_ptr cinfo,
- JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
- JDIMENSION out_rows_avail));
-};
-
-/* Coefficient buffer control */
-struct jpeg_d_coef_controller {
- JMETHOD(void, start_input_pass, (j_decompress_ptr cinfo));
- JMETHOD(int, consume_data, (j_decompress_ptr cinfo));
- JMETHOD(void, start_output_pass, (j_decompress_ptr cinfo));
- JMETHOD(int, decompress_data, (j_decompress_ptr cinfo,
- JSAMPIMAGE output_buf));
- /* Pointer to array of coefficient virtual arrays, or NULL if none */
- jvirt_barray_ptr *coef_arrays;
-};
-
-/* Decompression postprocessing (color quantization buffer control) */
-struct jpeg_d_post_controller {
- JMETHOD(void, start_pass, (j_decompress_ptr cinfo, J_BUF_MODE pass_mode));
- JMETHOD(void, post_process_data, (j_decompress_ptr cinfo,
- JSAMPIMAGE input_buf,
- JDIMENSION *in_row_group_ctr,
- JDIMENSION in_row_groups_avail,
- JSAMPARRAY output_buf,
- JDIMENSION *out_row_ctr,
- JDIMENSION out_rows_avail));
-};
-
-/* Marker reading & parsing */
-struct jpeg_marker_reader {
- JMETHOD(void, reset_marker_reader, (j_decompress_ptr cinfo));
- /* Read markers until SOS or EOI.
- * Returns same codes as are defined for jpeg_consume_input:
- * JPEG_SUSPENDED, JPEG_REACHED_SOS, or JPEG_REACHED_EOI.
- */
- JMETHOD(int, read_markers, (j_decompress_ptr cinfo));
- /* Read a restart marker --- exported for use by entropy decoder only */
- jpeg_marker_parser_method read_restart_marker;
-
- /* State of marker reader --- nominally internal, but applications
- * supplying COM or APPn handlers might like to know the state.
- */
- boolean saw_SOI; /* found SOI? */
- boolean saw_SOF; /* found SOF? */
- int next_restart_num; /* next restart number expected (0-7) */
- unsigned int discarded_bytes; /* # of bytes skipped looking for a marker */
-};
-
-/* Entropy decoding */
-struct jpeg_entropy_decoder {
- JMETHOD(void, start_pass, (j_decompress_ptr cinfo));
- JMETHOD(boolean, decode_mcu, (j_decompress_ptr cinfo,
- JBLOCKROW *MCU_data));
-
- /* This is here to share code between baseline and progressive decoders; */
- /* other modules probably should not use it */
- boolean insufficient_data; /* set TRUE after emitting warning */
-};
-
-/* Inverse DCT (also performs dequantization) */
-typedef JMETHOD(void, inverse_DCT_method_ptr,
- (j_decompress_ptr cinfo, jpeg_component_info * compptr,
- JCOEFPTR coef_block,
- JSAMPARRAY output_buf, JDIMENSION output_col));
-
-struct jpeg_inverse_dct {
- JMETHOD(void, start_pass, (j_decompress_ptr cinfo));
- /* It is useful to allow each component to have a separate IDCT method. */
- inverse_DCT_method_ptr inverse_DCT[MAX_COMPONENTS];
-};
-
-/* Upsampling (note that upsampler must also call color converter) */
-struct jpeg_upsampler {
- JMETHOD(void, start_pass, (j_decompress_ptr cinfo));
- JMETHOD(void, upsample, (j_decompress_ptr cinfo,
- JSAMPIMAGE input_buf,
- JDIMENSION *in_row_group_ctr,
- JDIMENSION in_row_groups_avail,
- JSAMPARRAY output_buf,
- JDIMENSION *out_row_ctr,
- JDIMENSION out_rows_avail));
-
- boolean need_context_rows; /* TRUE if need rows above & below */
-};
-
-/* Colorspace conversion */
-struct jpeg_color_deconverter {
- JMETHOD(void, start_pass, (j_decompress_ptr cinfo));
- JMETHOD(void, color_convert, (j_decompress_ptr cinfo,
- JSAMPIMAGE input_buf, JDIMENSION input_row,
- JSAMPARRAY output_buf, int num_rows));
-};
-
-/* Color quantization or color precision reduction */
-struct jpeg_color_quantizer {
- JMETHOD(void, start_pass, (j_decompress_ptr cinfo, boolean is_pre_scan));
- JMETHOD(void, color_quantize, (j_decompress_ptr cinfo,
- JSAMPARRAY input_buf, JSAMPARRAY output_buf,
- int num_rows));
- JMETHOD(void, finish_pass, (j_decompress_ptr cinfo));
- JMETHOD(void, new_color_map, (j_decompress_ptr cinfo));
-};
-
-
-/* Miscellaneous useful macros */
-
-#undef MAX
-#define MAX(a,b) ((a) > (b) ? (a) : (b))
-#undef MIN
-#define MIN(a,b) ((a) < (b) ? (a) : (b))
-
-
-/* We assume that right shift corresponds to signed division by 2 with
- * rounding towards minus infinity. This is correct for typical "arithmetic
- * shift" instructions that shift in copies of the sign bit. But some
- * C compilers implement >> with an unsigned shift. For these machines you
- * must define RIGHT_SHIFT_IS_UNSIGNED.
- * RIGHT_SHIFT provides a proper signed right shift of an INT32 quantity.
- * It is only applied with constant shift counts. SHIFT_TEMPS must be
- * included in the variables of any routine using RIGHT_SHIFT.
- */
-
-#ifdef RIGHT_SHIFT_IS_UNSIGNED
-#define SHIFT_TEMPS INT32 shift_temp;
-#define RIGHT_SHIFT(x,shft) \
- ((shift_temp = (x)) < 0 ? \
- (shift_temp >> (shft)) | ((~((INT32) 0)) << (32-(shft))) : \
- (shift_temp >> (shft)))
-#else
-#define SHIFT_TEMPS
-#define RIGHT_SHIFT(x,shft) ((x) >> (shft))
-#endif
-
-
-/* Short forms of external names for systems with brain-damaged linkers. */
-
-#ifdef NEED_SHORT_EXTERNAL_NAMES
-#define jinit_compress_master jICompress
-#define jinit_c_master_control jICMaster
-#define jinit_c_main_controller jICMainC
-#define jinit_c_prep_controller jICPrepC
-#define jinit_c_coef_controller jICCoefC
-#define jinit_color_converter jICColor
-#define jinit_downsampler jIDownsampler
-#define jinit_forward_dct jIFDCT
-#define jinit_huff_encoder jIHEncoder
-#define jinit_phuff_encoder jIPHEncoder
-#define jinit_marker_writer jIMWriter
-#define jinit_master_decompress jIDMaster
-#define jinit_d_main_controller jIDMainC
-#define jinit_d_coef_controller jIDCoefC
-#define jinit_d_post_controller jIDPostC
-#define jinit_input_controller jIInCtlr
-#define jinit_marker_reader jIMReader
-#define jinit_huff_decoder jIHDecoder
-#define jinit_phuff_decoder jIPHDecoder
-#define jinit_inverse_dct jIIDCT
-#define jinit_upsampler jIUpsampler
-#define jinit_color_deconverter jIDColor
-#define jinit_1pass_quantizer jI1Quant
-#define jinit_2pass_quantizer jI2Quant
-#define jinit_merged_upsampler jIMUpsampler
-#define jinit_memory_mgr jIMemMgr
-#define jdiv_round_up jDivRound
-#define jround_up jRound
-#define jcopy_sample_rows jCopySamples
-#define jcopy_block_row jCopyBlocks
-#define jzero_far jZeroFar
-#define jpeg_zigzag_order jZIGTable
-#define jpeg_natural_order jZAGTable
-#endif /* NEED_SHORT_EXTERNAL_NAMES */
-
-
-/* Compression module initialization routines */
-EXTERN(void) jinit_compress_master JPP((j_compress_ptr cinfo));
-EXTERN(void) jinit_c_master_control JPP((j_compress_ptr cinfo,
- boolean transcode_only));
-EXTERN(void) jinit_c_main_controller JPP((j_compress_ptr cinfo,
- boolean need_full_buffer));
-EXTERN(void) jinit_c_prep_controller JPP((j_compress_ptr cinfo,
- boolean need_full_buffer));
-EXTERN(void) jinit_c_coef_controller JPP((j_compress_ptr cinfo,
- boolean need_full_buffer));
-EXTERN(void) jinit_color_converter JPP((j_compress_ptr cinfo));
-EXTERN(void) jinit_downsampler JPP((j_compress_ptr cinfo));
-EXTERN(void) jinit_forward_dct JPP((j_compress_ptr cinfo));
-EXTERN(void) jinit_huff_encoder JPP((j_compress_ptr cinfo));
-EXTERN(void) jinit_phuff_encoder JPP((j_compress_ptr cinfo));
-EXTERN(void) jinit_marker_writer JPP((j_compress_ptr cinfo));
-/* Decompression module initialization routines */
-EXTERN(void) jinit_master_decompress JPP((j_decompress_ptr cinfo));
-EXTERN(void) jinit_d_main_controller JPP((j_decompress_ptr cinfo,
- boolean need_full_buffer));
-EXTERN(void) jinit_d_coef_controller JPP((j_decompress_ptr cinfo,
- boolean need_full_buffer));
-EXTERN(void) jinit_d_post_controller JPP((j_decompress_ptr cinfo,
- boolean need_full_buffer));
-EXTERN(void) jinit_input_controller JPP((j_decompress_ptr cinfo));
-EXTERN(void) jinit_marker_reader JPP((j_decompress_ptr cinfo));
-EXTERN(void) jinit_huff_decoder JPP((j_decompress_ptr cinfo));
-EXTERN(void) jinit_phuff_decoder JPP((j_decompress_ptr cinfo));
-EXTERN(void) jinit_inverse_dct JPP((j_decompress_ptr cinfo));
-EXTERN(void) jinit_upsampler JPP((j_decompress_ptr cinfo));
-EXTERN(void) jinit_color_deconverter JPP((j_decompress_ptr cinfo));
-EXTERN(void) jinit_1pass_quantizer JPP((j_decompress_ptr cinfo));
-EXTERN(void) jinit_2pass_quantizer JPP((j_decompress_ptr cinfo));
-EXTERN(void) jinit_merged_upsampler JPP((j_decompress_ptr cinfo));
-/* Memory manager initialization */
-EXTERN(void) jinit_memory_mgr JPP((j_common_ptr cinfo));
-
-/* Utility routines in jutils.c */
-EXTERN(long) jdiv_round_up JPP((long a, long b));
-EXTERN(long) jround_up JPP((long a, long b));
-EXTERN(void) jcopy_sample_rows JPP((JSAMPARRAY input_array, int source_row,
- JSAMPARRAY output_array, int dest_row,
- int num_rows, JDIMENSION num_cols));
-EXTERN(void) jcopy_block_row JPP((JBLOCKROW input_row, JBLOCKROW output_row,
- JDIMENSION num_blocks));
-EXTERN(void) jzero_far JPP((void FAR * target, size_t bytestozero));
-/* Constant tables in jutils.c */
-#if 0 /* This table is not actually needed in v6a */
-extern const int jpeg_zigzag_order[]; /* natural coef order to zigzag order */
-#endif
-extern const int jpeg_natural_order[]; /* zigzag coef order to natural order */
-
-/* Suppress undefined-structure complaints if necessary. */
-
-#ifdef INCOMPLETE_TYPES_BROKEN
-#ifndef AM_MEMORY_MANAGER /* only jmemmgr.c defines these */
-struct jvirt_sarray_control { long dummy; };
-struct jvirt_barray_control { long dummy; };
-#endif
-#endif /* INCOMPLETE_TYPES_BROKEN */
+/*
+ * jpegint.h
+ *
+ * Copyright (C) 1991-1997, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file provides common declarations for the various JPEG modules.
+ * These declarations are considered internal to the JPEG library; most
+ * applications using the library shouldn't need to include this file.
+ */
+
+
+/* Declarations for both compression & decompression */
+
+typedef enum { /* Operating modes for buffer controllers */
+ JBUF_PASS_THRU, /* Plain stripwise operation */
+ /* Remaining modes require a full-image buffer to have been created */
+ JBUF_SAVE_SOURCE, /* Run source subobject only, save output */
+ JBUF_CRANK_DEST, /* Run dest subobject only, using saved data */
+ JBUF_SAVE_AND_PASS /* Run both subobjects, save output */
+} J_BUF_MODE;
+
+/* Values of global_state field (jdapi.c has some dependencies on ordering!) */
+#define CSTATE_START 100 /* after create_compress */
+#define CSTATE_SCANNING 101 /* start_compress done, write_scanlines OK */
+#define CSTATE_RAW_OK 102 /* start_compress done, write_raw_data OK */
+#define CSTATE_WRCOEFS 103 /* jpeg_write_coefficients done */
+#define DSTATE_START 200 /* after create_decompress */
+#define DSTATE_INHEADER 201 /* reading header markers, no SOS yet */
+#define DSTATE_READY 202 /* found SOS, ready for start_decompress */
+#define DSTATE_PRELOAD 203 /* reading multiscan file in start_decompress*/
+#define DSTATE_PRESCAN 204 /* performing dummy pass for 2-pass quant */
+#define DSTATE_SCANNING 205 /* start_decompress done, read_scanlines OK */
+#define DSTATE_RAW_OK 206 /* start_decompress done, read_raw_data OK */
+#define DSTATE_BUFIMAGE 207 /* expecting jpeg_start_output */
+#define DSTATE_BUFPOST 208 /* looking for SOS/EOI in jpeg_finish_output */
+#define DSTATE_RDCOEFS 209 /* reading file in jpeg_read_coefficients */
+#define DSTATE_STOPPING 210 /* looking for EOI in jpeg_finish_decompress */
+
+
+/* Declarations for compression modules */
+
+/* Master control module */
+struct jpeg_comp_master {
+ JMETHOD(void, prepare_for_pass, (j_compress_ptr cinfo));
+ JMETHOD(void, pass_startup, (j_compress_ptr cinfo));
+ JMETHOD(void, finish_pass, (j_compress_ptr cinfo));
+
+ /* State variables made visible to other modules */
+ boolean call_pass_startup; /* True if pass_startup must be called */
+ boolean is_last_pass; /* True during last pass */
+};
+
+/* Main buffer control (downsampled-data buffer) */
+struct jpeg_c_main_controller {
+ JMETHOD(void, start_pass, (j_compress_ptr cinfo, J_BUF_MODE pass_mode));
+ JMETHOD(void, process_data, (j_compress_ptr cinfo,
+ JSAMPARRAY input_buf, JDIMENSION *in_row_ctr,
+ JDIMENSION in_rows_avail));
+};
+
+/* Compression preprocessing (downsampling input buffer control) */
+struct jpeg_c_prep_controller {
+ JMETHOD(void, start_pass, (j_compress_ptr cinfo, J_BUF_MODE pass_mode));
+ JMETHOD(void, pre_process_data, (j_compress_ptr cinfo,
+ JSAMPARRAY input_buf,
+ JDIMENSION *in_row_ctr,
+ JDIMENSION in_rows_avail,
+ JSAMPIMAGE output_buf,
+ JDIMENSION *out_row_group_ctr,
+ JDIMENSION out_row_groups_avail));
+};
+
+/* Coefficient buffer control */
+struct jpeg_c_coef_controller {
+ JMETHOD(void, start_pass, (j_compress_ptr cinfo, J_BUF_MODE pass_mode));
+ JMETHOD(boolean, compress_data, (j_compress_ptr cinfo,
+ JSAMPIMAGE input_buf));
+};
+
+/* Colorspace conversion */
+struct jpeg_color_converter {
+ JMETHOD(void, start_pass, (j_compress_ptr cinfo));
+ JMETHOD(void, color_convert, (j_compress_ptr cinfo,
+ JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
+ JDIMENSION output_row, int num_rows));
+};
+
+/* Downsampling */
+struct jpeg_downsampler {
+ JMETHOD(void, start_pass, (j_compress_ptr cinfo));
+ JMETHOD(void, downsample, (j_compress_ptr cinfo,
+ JSAMPIMAGE input_buf, JDIMENSION in_row_index,
+ JSAMPIMAGE output_buf,
+ JDIMENSION out_row_group_index));
+
+ boolean need_context_rows; /* TRUE if need rows above & below */
+};
+
+/* Forward DCT (also controls coefficient quantization) */
+struct jpeg_forward_dct {
+ JMETHOD(void, start_pass, (j_compress_ptr cinfo));
+ /* perhaps this should be an array??? */
+ JMETHOD(void, forward_DCT, (j_compress_ptr cinfo,
+ jpeg_component_info * compptr,
+ JSAMPARRAY sample_data, JBLOCKROW coef_blocks,
+ JDIMENSION start_row, JDIMENSION start_col,
+ JDIMENSION num_blocks));
+};
+
+/* Entropy encoding */
+struct jpeg_entropy_encoder {
+ JMETHOD(void, start_pass, (j_compress_ptr cinfo, boolean gather_statistics));
+ JMETHOD(boolean, encode_mcu, (j_compress_ptr cinfo, JBLOCKROW *MCU_data));
+ JMETHOD(void, finish_pass, (j_compress_ptr cinfo));
+};
+
+/* Marker writing */
+struct jpeg_marker_writer {
+ JMETHOD(void, write_file_header, (j_compress_ptr cinfo));
+ JMETHOD(void, write_frame_header, (j_compress_ptr cinfo));
+ JMETHOD(void, write_scan_header, (j_compress_ptr cinfo));
+ JMETHOD(void, write_file_trailer, (j_compress_ptr cinfo));
+ JMETHOD(void, write_tables_only, (j_compress_ptr cinfo));
+ /* These routines are exported to allow insertion of extra markers */
+ /* Probably only COM and APPn markers should be written this way */
+ JMETHOD(void, write_marker_header, (j_compress_ptr cinfo, int marker,
+ unsigned int datalen));
+ JMETHOD(void, write_marker_byte, (j_compress_ptr cinfo, int val));
+};
+
+
+/* Declarations for decompression modules */
+
+/* Master control module */
+struct jpeg_decomp_master {
+ JMETHOD(void, prepare_for_output_pass, (j_decompress_ptr cinfo));
+ JMETHOD(void, finish_output_pass, (j_decompress_ptr cinfo));
+
+ /* State variables made visible to other modules */
+ boolean is_dummy_pass; /* True during 1st pass for 2-pass quant */
+};
+
+/* Input control module */
+struct jpeg_input_controller {
+ JMETHOD(int, consume_input, (j_decompress_ptr cinfo));
+ JMETHOD(void, reset_input_controller, (j_decompress_ptr cinfo));
+ JMETHOD(void, start_input_pass, (j_decompress_ptr cinfo));
+ JMETHOD(void, finish_input_pass, (j_decompress_ptr cinfo));
+
+ /* State variables made visible to other modules */
+ boolean has_multiple_scans; /* True if file has multiple scans */
+ boolean eoi_reached; /* True when EOI has been consumed */
+};
+
+/* Main buffer control (downsampled-data buffer) */
+struct jpeg_d_main_controller {
+ JMETHOD(void, start_pass, (j_decompress_ptr cinfo, J_BUF_MODE pass_mode));
+ JMETHOD(void, process_data, (j_decompress_ptr cinfo,
+ JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
+ JDIMENSION out_rows_avail));
+};
+
+/* Coefficient buffer control */
+struct jpeg_d_coef_controller {
+ JMETHOD(void, start_input_pass, (j_decompress_ptr cinfo));
+ JMETHOD(int, consume_data, (j_decompress_ptr cinfo));
+ JMETHOD(void, start_output_pass, (j_decompress_ptr cinfo));
+ JMETHOD(int, decompress_data, (j_decompress_ptr cinfo,
+ JSAMPIMAGE output_buf));
+ /* Pointer to array of coefficient virtual arrays, or NULL if none */
+ jvirt_barray_ptr *coef_arrays;
+};
+
+/* Decompression postprocessing (color quantization buffer control) */
+struct jpeg_d_post_controller {
+ JMETHOD(void, start_pass, (j_decompress_ptr cinfo, J_BUF_MODE pass_mode));
+ JMETHOD(void, post_process_data, (j_decompress_ptr cinfo,
+ JSAMPIMAGE input_buf,
+ JDIMENSION *in_row_group_ctr,
+ JDIMENSION in_row_groups_avail,
+ JSAMPARRAY output_buf,
+ JDIMENSION *out_row_ctr,
+ JDIMENSION out_rows_avail));
+};
+
+/* Marker reading & parsing */
+struct jpeg_marker_reader {
+ JMETHOD(void, reset_marker_reader, (j_decompress_ptr cinfo));
+ /* Read markers until SOS or EOI.
+ * Returns same codes as are defined for jpeg_consume_input:
+ * JPEG_SUSPENDED, JPEG_REACHED_SOS, or JPEG_REACHED_EOI.
+ */
+ JMETHOD(int, read_markers, (j_decompress_ptr cinfo));
+ /* Read a restart marker --- exported for use by entropy decoder only */
+ jpeg_marker_parser_method read_restart_marker;
+
+ /* State of marker reader --- nominally internal, but applications
+ * supplying COM or APPn handlers might like to know the state.
+ */
+ boolean saw_SOI; /* found SOI? */
+ boolean saw_SOF; /* found SOF? */
+ int next_restart_num; /* next restart number expected (0-7) */
+ unsigned int discarded_bytes; /* # of bytes skipped looking for a marker */
+};
+
+/* Entropy decoding */
+struct jpeg_entropy_decoder {
+ JMETHOD(void, start_pass, (j_decompress_ptr cinfo));
+ JMETHOD(boolean, decode_mcu, (j_decompress_ptr cinfo,
+ JBLOCKROW *MCU_data));
+
+ /* This is here to share code between baseline and progressive decoders; */
+ /* other modules probably should not use it */
+ boolean insufficient_data; /* set TRUE after emitting warning */
+};
+
+/* Inverse DCT (also performs dequantization) */
+typedef JMETHOD(void, inverse_DCT_method_ptr,
+ (j_decompress_ptr cinfo, jpeg_component_info * compptr,
+ JCOEFPTR coef_block,
+ JSAMPARRAY output_buf, JDIMENSION output_col));
+
+struct jpeg_inverse_dct {
+ JMETHOD(void, start_pass, (j_decompress_ptr cinfo));
+ /* It is useful to allow each component to have a separate IDCT method. */
+ inverse_DCT_method_ptr inverse_DCT[MAX_COMPONENTS];
+};
+
+/* Upsampling (note that upsampler must also call color converter) */
+struct jpeg_upsampler {
+ JMETHOD(void, start_pass, (j_decompress_ptr cinfo));
+ JMETHOD(void, upsample, (j_decompress_ptr cinfo,
+ JSAMPIMAGE input_buf,
+ JDIMENSION *in_row_group_ctr,
+ JDIMENSION in_row_groups_avail,
+ JSAMPARRAY output_buf,
+ JDIMENSION *out_row_ctr,
+ JDIMENSION out_rows_avail));
+
+ boolean need_context_rows; /* TRUE if need rows above & below */
+};
+
+/* Colorspace conversion */
+struct jpeg_color_deconverter {
+ JMETHOD(void, start_pass, (j_decompress_ptr cinfo));
+ JMETHOD(void, color_convert, (j_decompress_ptr cinfo,
+ JSAMPIMAGE input_buf, JDIMENSION input_row,
+ JSAMPARRAY output_buf, int num_rows));
+};
+
+/* Color quantization or color precision reduction */
+struct jpeg_color_quantizer {
+ JMETHOD(void, start_pass, (j_decompress_ptr cinfo, boolean is_pre_scan));
+ JMETHOD(void, color_quantize, (j_decompress_ptr cinfo,
+ JSAMPARRAY input_buf, JSAMPARRAY output_buf,
+ int num_rows));
+ JMETHOD(void, finish_pass, (j_decompress_ptr cinfo));
+ JMETHOD(void, new_color_map, (j_decompress_ptr cinfo));
+};
+
+
+/* Miscellaneous useful macros */
+
+#undef MAX
+#define MAX(a,b) ((a) > (b) ? (a) : (b))
+#undef MIN
+#define MIN(a,b) ((a) < (b) ? (a) : (b))
+
+
+/* We assume that right shift corresponds to signed division by 2 with
+ * rounding towards minus infinity. This is correct for typical "arithmetic
+ * shift" instructions that shift in copies of the sign bit. But some
+ * C compilers implement >> with an unsigned shift. For these machines you
+ * must define RIGHT_SHIFT_IS_UNSIGNED.
+ * RIGHT_SHIFT provides a proper signed right shift of an INT32 quantity.
+ * It is only applied with constant shift counts. SHIFT_TEMPS must be
+ * included in the variables of any routine using RIGHT_SHIFT.
+ */
+
+#ifdef RIGHT_SHIFT_IS_UNSIGNED
+#define SHIFT_TEMPS INT32 shift_temp;
+#define RIGHT_SHIFT(x,shft) \
+ ((shift_temp = (x)) < 0 ? \
+ (shift_temp >> (shft)) | ((~((INT32) 0)) << (32-(shft))) : \
+ (shift_temp >> (shft)))
+#else
+#define SHIFT_TEMPS
+#define RIGHT_SHIFT(x,shft) ((x) >> (shft))
+#endif
+
+
+/* Short forms of external names for systems with brain-damaged linkers. */
+
+#ifdef NEED_SHORT_EXTERNAL_NAMES
+#define jinit_compress_master jICompress
+#define jinit_c_master_control jICMaster
+#define jinit_c_main_controller jICMainC
+#define jinit_c_prep_controller jICPrepC
+#define jinit_c_coef_controller jICCoefC
+#define jinit_color_converter jICColor
+#define jinit_downsampler jIDownsampler
+#define jinit_forward_dct jIFDCT
+#define jinit_huff_encoder jIHEncoder
+#define jinit_phuff_encoder jIPHEncoder
+#define jinit_marker_writer jIMWriter
+#define jinit_master_decompress jIDMaster
+#define jinit_d_main_controller jIDMainC
+#define jinit_d_coef_controller jIDCoefC
+#define jinit_d_post_controller jIDPostC
+#define jinit_input_controller jIInCtlr
+#define jinit_marker_reader jIMReader
+#define jinit_huff_decoder jIHDecoder
+#define jinit_phuff_decoder jIPHDecoder
+#define jinit_inverse_dct jIIDCT
+#define jinit_upsampler jIUpsampler
+#define jinit_color_deconverter jIDColor
+#define jinit_1pass_quantizer jI1Quant
+#define jinit_2pass_quantizer jI2Quant
+#define jinit_merged_upsampler jIMUpsampler
+#define jinit_memory_mgr jIMemMgr
+#define jdiv_round_up jDivRound
+#define jround_up jRound
+#define jcopy_sample_rows jCopySamples
+#define jcopy_block_row jCopyBlocks
+#define jzero_far jZeroFar
+#define jpeg_zigzag_order jZIGTable
+#define jpeg_natural_order jZAGTable
+#endif /* NEED_SHORT_EXTERNAL_NAMES */
+
+
+/* Compression module initialization routines */
+EXTERN(void) jinit_compress_master JPP((j_compress_ptr cinfo));
+EXTERN(void) jinit_c_master_control JPP((j_compress_ptr cinfo,
+ boolean transcode_only));
+EXTERN(void) jinit_c_main_controller JPP((j_compress_ptr cinfo,
+ boolean need_full_buffer));
+EXTERN(void) jinit_c_prep_controller JPP((j_compress_ptr cinfo,
+ boolean need_full_buffer));
+EXTERN(void) jinit_c_coef_controller JPP((j_compress_ptr cinfo,
+ boolean need_full_buffer));
+EXTERN(void) jinit_color_converter JPP((j_compress_ptr cinfo));
+EXTERN(void) jinit_downsampler JPP((j_compress_ptr cinfo));
+EXTERN(void) jinit_forward_dct JPP((j_compress_ptr cinfo));
+EXTERN(void) jinit_huff_encoder JPP((j_compress_ptr cinfo));
+EXTERN(void) jinit_phuff_encoder JPP((j_compress_ptr cinfo));
+EXTERN(void) jinit_marker_writer JPP((j_compress_ptr cinfo));
+/* Decompression module initialization routines */
+EXTERN(void) jinit_master_decompress JPP((j_decompress_ptr cinfo));
+EXTERN(void) jinit_d_main_controller JPP((j_decompress_ptr cinfo,
+ boolean need_full_buffer));
+EXTERN(void) jinit_d_coef_controller JPP((j_decompress_ptr cinfo,
+ boolean need_full_buffer));
+EXTERN(void) jinit_d_post_controller JPP((j_decompress_ptr cinfo,
+ boolean need_full_buffer));
+EXTERN(void) jinit_input_controller JPP((j_decompress_ptr cinfo));
+EXTERN(void) jinit_marker_reader JPP((j_decompress_ptr cinfo));
+EXTERN(void) jinit_huff_decoder JPP((j_decompress_ptr cinfo));
+EXTERN(void) jinit_phuff_decoder JPP((j_decompress_ptr cinfo));
+EXTERN(void) jinit_inverse_dct JPP((j_decompress_ptr cinfo));
+EXTERN(void) jinit_upsampler JPP((j_decompress_ptr cinfo));
+EXTERN(void) jinit_color_deconverter JPP((j_decompress_ptr cinfo));
+EXTERN(void) jinit_1pass_quantizer JPP((j_decompress_ptr cinfo));
+EXTERN(void) jinit_2pass_quantizer JPP((j_decompress_ptr cinfo));
+EXTERN(void) jinit_merged_upsampler JPP((j_decompress_ptr cinfo));
+/* Memory manager initialization */
+EXTERN(void) jinit_memory_mgr JPP((j_common_ptr cinfo));
+
+/* Utility routines in jutils.c */
+EXTERN(long) jdiv_round_up JPP((long a, long b));
+EXTERN(long) jround_up JPP((long a, long b));
+EXTERN(void) jcopy_sample_rows JPP((JSAMPARRAY input_array, int source_row,
+ JSAMPARRAY output_array, int dest_row,
+ int num_rows, JDIMENSION num_cols));
+EXTERN(void) jcopy_block_row JPP((JBLOCKROW input_row, JBLOCKROW output_row,
+ JDIMENSION num_blocks));
+EXTERN(void) jzero_far JPP((void FAR * target, size_t bytestozero));
+/* Constant tables in jutils.c */
+#if 0 /* This table is not actually needed in v6a */
+extern const int jpeg_zigzag_order[]; /* natural coef order to zigzag order */
+#endif
+extern const int jpeg_natural_order[]; /* zigzag coef order to natural order */
+
+/* Suppress undefined-structure complaints if necessary. */
+
+#ifdef INCOMPLETE_TYPES_BROKEN
+#ifndef AM_MEMORY_MANAGER /* only jmemmgr.c defines these */
+struct jvirt_sarray_control { long dummy; };
+struct jvirt_barray_control { long dummy; };
+#endif
+#endif /* INCOMPLETE_TYPES_BROKEN */
diff --git a/core/src/fxcodec/libjpeg/jpeglib.h b/core/src/fxcodec/libjpeg/jpeglib.h
index ac2aff90fd..7de5ab726e 100644
--- a/core/src/fxcodec/libjpeg/jpeglib.h
+++ b/core/src/fxcodec/libjpeg/jpeglib.h
@@ -1,1165 +1,1165 @@
-/*
- * jpeglib.h
- *
- * Copyright (C) 1991-1998, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file defines the application interface for the JPEG library.
- * Most applications using the library need only include this file,
- * and perhaps jerror.h if they want to know the exact error codes.
- */
-
-#ifndef JPEGLIB_H
-#define JPEGLIB_H
-
-#define FOXIT_PREFIX(origName) FPDFAPIJPEG_##origName
-
-#define jcopy_block_row FOXIT_PREFIX(jcopy_block_row)
-#define jcopy_sample_rows FOXIT_PREFIX(jcopy_sample_rows)
-#define jdiv_round_up FOXIT_PREFIX(jdiv_round_up)
-#define jinit_1pass_quantizer FOXIT_PREFIX(jinit_1pass_quantizer)
-#define jinit_2pass_quantizer FOXIT_PREFIX(jinit_2pass_quantizer)
-#define jinit_color_deconverter FOXIT_PREFIX(jinit_color_deconverter)
-#define jinit_d_coef_controller FOXIT_PREFIX(jinit_d_coef_controller)
-#define jinit_d_main_controller FOXIT_PREFIX(jinit_d_main_controller)
-#define jinit_d_post_controller FOXIT_PREFIX(jinit_d_post_controller)
-#define jinit_huff_decoder FOXIT_PREFIX(jinit_huff_decoder)
-#define jinit_input_controller FOXIT_PREFIX(jinit_input_controller)
-#define jinit_inverse_dct FOXIT_PREFIX(jinit_inverse_dct)
-#define jinit_marker_reader FOXIT_PREFIX(jinit_marker_reader)
-#define jinit_master_decompress FOXIT_PREFIX(jinit_master_decompress)
-#define jinit_memory_mgr FOXIT_PREFIX(jinit_memory_mgr)
-#define jinit_merged_upsampler FOXIT_PREFIX(jinit_merged_upsampler)
-#define jinit_phuff_decoder FOXIT_PREFIX(jinit_phuff_decoder)
-#define jinit_upsampler FOXIT_PREFIX(jinit_upsampler)
-#define jpeg_CreateDecompress FOXIT_PREFIX(jpeg_CreateDecompress)
-#define jpeg_abort FOXIT_PREFIX(jpeg_abort)
-#define jpeg_abort_decompress FOXIT_PREFIX(jpeg_abort_decompress)
-#define jpeg_alloc_huff_table FOXIT_PREFIX(jpeg_alloc_huff_table)
-#define jpeg_alloc_quant_table FOXIT_PREFIX(jpeg_alloc_quant_table)
-#define jpeg_calc_output_dimensions FOXIT_PREFIX(jpeg_calc_output_dimensions)
-#define jpeg_consume_input FOXIT_PREFIX(jpeg_consume_input)
-#define jpeg_destroy FOXIT_PREFIX(jpeg_destroy)
-#define jpeg_destroy_decompress FOXIT_PREFIX(jpeg_destroy_decompress)
-#define jpeg_fill_bit_buffer FOXIT_PREFIX(jpeg_fill_bit_buffer)
-#define jpeg_finish_decompress FOXIT_PREFIX(jpeg_finish_decompress)
-#define jpeg_finish_output FOXIT_PREFIX(jpeg_finish_output)
-#define jpeg_free_large FOXIT_PREFIX(jpeg_free_large)
-#define jpeg_free_small FOXIT_PREFIX(jpeg_free_small)
-#define jpeg_get_large FOXIT_PREFIX(jpeg_get_large)
-#define jpeg_get_small FOXIT_PREFIX(jpeg_get_small)
-#define jpeg_has_multiple_scans FOXIT_PREFIX(jpeg_has_multiple_scans)
-#define jpeg_huff_decode FOXIT_PREFIX(jpeg_huff_decode)
-#define jpeg_idct_1x1 FOXIT_PREFIX(jpeg_idct_1x1)
-#define jpeg_idct_2x2 FOXIT_PREFIX(jpeg_idct_2x2)
-#define jpeg_idct_4x4 FOXIT_PREFIX(jpeg_idct_4x4)
-#define jpeg_idct_float FOXIT_PREFIX(jpeg_idct_float)
-#define jpeg_idct_ifast FOXIT_PREFIX(jpeg_idct_ifast)
-#define jpeg_idct_islow FOXIT_PREFIX(jpeg_idct_islow)
-#define jpeg_input_complete FOXIT_PREFIX(jpeg_input_complete)
-#define jpeg_make_d_derived_tbl FOXIT_PREFIX(jpeg_make_d_derived_tbl)
-#define jpeg_mem_available FOXIT_PREFIX(jpeg_mem_available)
-#define jpeg_mem_init FOXIT_PREFIX(jpeg_mem_init)
-#define jpeg_mem_term FOXIT_PREFIX(jpeg_mem_term)
-#define jpeg_natural_order FOXIT_PREFIX(jpeg_natural_order)
-#define jpeg_new_colormap FOXIT_PREFIX(jpeg_new_colormap)
-#define jpeg_open_backing_store FOXIT_PREFIX(jpeg_open_backing_store)
-#define jpeg_read_coefficients FOXIT_PREFIX(jpeg_read_coefficients)
-#define jpeg_read_header FOXIT_PREFIX(jpeg_read_header)
-#define jpeg_read_raw_data FOXIT_PREFIX(jpeg_read_raw_data)
-#define jpeg_read_scanlines FOXIT_PREFIX(jpeg_read_scanlines)
-#define jpeg_resync_to_restart FOXIT_PREFIX(jpeg_resync_to_restart)
-#define jpeg_save_markers FOXIT_PREFIX(jpeg_save_markers)
-#define jpeg_set_marker_processor FOXIT_PREFIX(jpeg_set_marker_processor)
-#define jpeg_start_decompress FOXIT_PREFIX(jpeg_start_decompress)
-#define jpeg_start_output FOXIT_PREFIX(jpeg_start_output)
-#define jpeg_std_error FOXIT_PREFIX(jpeg_std_error)
-#define jpeg_std_message_table FOXIT_PREFIX(jpeg_std_message_table)
-#define jpeg_stdio_src FOXIT_PREFIX(jpeg_stdio_src)
-#define jround_up FOXIT_PREFIX(jround_up)
-#define jzero_far FOXIT_PREFIX(jzero_far)
-
- /*
- * First we include the configuration files that record how this
- * installation of the JPEG library is set up. jconfig.h can be
- * generated automatically for many systems. jmorecfg.h contains
- * manual configuration options that most people need not worry about.
- */
-
-#ifndef JCONFIG_INCLUDED /* in case jinclude.h already did */
-#include "jconfig.h" /* widely used configuration options */
-#endif
-#include "jmorecfg.h" /* seldom changed options */
-
-
-/* Version ID for the JPEG library.
- * Might be useful for tests like "#if JPEG_LIB_VERSION >= 60".
- */
-
-#define JPEG_LIB_VERSION 62 /* Version 6b */
-
-
-/* Various constants determining the sizes of things.
- * All of these are specified by the JPEG standard, so don't change them
- * if you want to be compatible.
- */
-
-#define DCTSIZE 8 /* The basic DCT block is 8x8 samples */
-#define DCTSIZE2 64 /* DCTSIZE squared; # of elements in a block */
-#define NUM_QUANT_TBLS 4 /* Quantization tables are numbered 0..3 */
-#define NUM_HUFF_TBLS 4 /* Huffman tables are numbered 0..3 */
-#define NUM_ARITH_TBLS 16 /* Arith-coding tables are numbered 0..15 */
-#define MAX_COMPS_IN_SCAN 4 /* JPEG limit on # of components in one scan */
-#define MAX_SAMP_FACTOR 4 /* JPEG limit on sampling factors */
-/* Unfortunately, some bozo at Adobe saw no reason to be bound by the standard;
- * the PostScript DCT filter can emit files with many more than 10 blocks/MCU.
- * If you happen to run across such a file, you can up D_MAX_BLOCKS_IN_MCU
- * to handle it. We even let you do this from the jconfig.h file. However,
- * we strongly discourage changing C_MAX_BLOCKS_IN_MCU; just because Adobe
- * sometimes emits noncompliant files doesn't mean you should too.
- */
-#define C_MAX_BLOCKS_IN_MCU 10 /* compressor's limit on blocks per MCU */
-#ifndef D_MAX_BLOCKS_IN_MCU
-#define D_MAX_BLOCKS_IN_MCU 10 /* decompressor's limit on blocks per MCU */
-#endif
-
-
-/* Data structures for images (arrays of samples and of DCT coefficients).
- * On 80x86 machines, the image arrays are too big for near pointers,
- * but the pointer arrays can fit in near memory.
- */
-
-typedef JSAMPLE *JSAMPROW; /* ptr to one image row of pixel samples. */
-typedef JSAMPROW *JSAMPARRAY; /* ptr to some rows (a 2-D sample array) */
-typedef JSAMPARRAY *JSAMPIMAGE; /* a 3-D sample array: top index is color */
-
-typedef JCOEF JBLOCK[DCTSIZE2]; /* one block of coefficients */
-typedef JBLOCK *JBLOCKROW; /* pointer to one row of coefficient blocks */
-typedef JBLOCKROW *JBLOCKARRAY; /* a 2-D array of coefficient blocks */
-typedef JBLOCKARRAY *JBLOCKIMAGE; /* a 3-D array of coefficient blocks */
-
-typedef JCOEF *JCOEFPTR; /* useful in a couple of places */
-
-
-/* Types for JPEG compression parameters and working tables. */
-
-
-/* DCT coefficient quantization tables. */
-
-typedef struct {
- /* This array gives the coefficient quantizers in natural array order
- * (not the zigzag order in which they are stored in a JPEG DQT marker).
- * CAUTION: IJG versions prior to v6a kept this array in zigzag order.
- */
- UINT16 quantval[DCTSIZE2]; /* quantization step for each coefficient */
- /* This field is used only during compression. It's initialized FALSE when
- * the table is created, and set TRUE when it's been output to the file.
- * You could suppress output of a table by setting this to TRUE.
- * (See jpeg_suppress_tables for an example.)
- */
- boolean sent_table; /* TRUE when table has been output */
-} JQUANT_TBL;
-
-
-/* Huffman coding tables. */
-
-typedef struct {
- /* These two fields directly represent the contents of a JPEG DHT marker */
- UINT8 bits[17]; /* bits[k] = # of symbols with codes of */
- /* length k bits; bits[0] is unused */
- UINT8 huffval[256]; /* The symbols, in order of incr code length */
- /* This field is used only during compression. It's initialized FALSE when
- * the table is created, and set TRUE when it's been output to the file.
- * You could suppress output of a table by setting this to TRUE.
- * (See jpeg_suppress_tables for an example.)
- */
- boolean sent_table; /* TRUE when table has been output */
-} JHUFF_TBL;
-
-
-/* Basic info about one component (color channel). */
-
-typedef struct {
- /* These values are fixed over the whole image. */
- /* For compression, they must be supplied by parameter setup; */
- /* for decompression, they are read from the SOF marker. */
- int component_id; /* identifier for this component (0..255) */
- int component_index; /* its index in SOF or cinfo->comp_info[] */
- int h_samp_factor; /* horizontal sampling factor (1..4) */
- int v_samp_factor; /* vertical sampling factor (1..4) */
- int quant_tbl_no; /* quantization table selector (0..3) */
- /* These values may vary between scans. */
- /* For compression, they must be supplied by parameter setup; */
- /* for decompression, they are read from the SOS marker. */
- /* The decompressor output side may not use these variables. */
- int dc_tbl_no; /* DC entropy table selector (0..3) */
- int ac_tbl_no; /* AC entropy table selector (0..3) */
-
- /* Remaining fields should be treated as private by applications. */
-
- /* These values are computed during compression or decompression startup: */
- /* Component's size in DCT blocks.
- * Any dummy blocks added to complete an MCU are not counted; therefore
- * these values do not depend on whether a scan is interleaved or not.
- */
- JDIMENSION width_in_blocks;
- JDIMENSION height_in_blocks;
- /* Size of a DCT block in samples. Always DCTSIZE for compression.
- * For decompression this is the size of the output from one DCT block,
- * reflecting any scaling we choose to apply during the IDCT step.
- * Values of 1,2,4,8 are likely to be supported. Note that different
- * components may receive different IDCT scalings.
- */
- int DCT_scaled_size;
- /* The downsampled dimensions are the component's actual, unpadded number
- * of samples at the main buffer (preprocessing/compression interface), thus
- * downsampled_width = ceil(image_width * Hi/Hmax)
- * and similarly for height. For decompression, IDCT scaling is included, so
- * downsampled_width = ceil(image_width * Hi/Hmax * DCT_scaled_size/DCTSIZE)
- */
- JDIMENSION downsampled_width; /* actual width in samples */
- JDIMENSION downsampled_height; /* actual height in samples */
- /* This flag is used only for decompression. In cases where some of the
- * components will be ignored (eg grayscale output from YCbCr image),
- * we can skip most computations for the unused components.
- */
- boolean component_needed; /* do we need the value of this component? */
-
- /* These values are computed before starting a scan of the component. */
- /* The decompressor output side may not use these variables. */
- int MCU_width; /* number of blocks per MCU, horizontally */
- int MCU_height; /* number of blocks per MCU, vertically */
- int MCU_blocks; /* MCU_width * MCU_height */
- int MCU_sample_width; /* MCU width in samples, MCU_width*DCT_scaled_size */
- int last_col_width; /* # of non-dummy blocks across in last MCU */
- int last_row_height; /* # of non-dummy blocks down in last MCU */
-
- /* Saved quantization table for component; NULL if none yet saved.
- * See jdinput.c comments about the need for this information.
- * This field is currently used only for decompression.
- */
- JQUANT_TBL * quant_table;
-
- /* Private per-component storage for DCT or IDCT subsystem. */
- void * dct_table;
-} jpeg_component_info;
-
-
-/* The script for encoding a multiple-scan file is an array of these: */
-
-typedef struct {
- int comps_in_scan; /* number of components encoded in this scan */
- int component_index[MAX_COMPS_IN_SCAN]; /* their SOF/comp_info[] indexes */
- int Ss, Se; /* progressive JPEG spectral selection parms */
- int Ah, Al; /* progressive JPEG successive approx. parms */
-} jpeg_scan_info;
-
-/* The decompressor can save APPn and COM markers in a list of these: */
-
-typedef struct jpeg_marker_struct * jpeg_saved_marker_ptr;
-
-struct jpeg_marker_struct {
- jpeg_saved_marker_ptr next; /* next in list, or NULL */
- UINT8 marker; /* marker code: JPEG_COM, or JPEG_APP0+n */
- unsigned int original_length; /* # bytes of data in the file */
- unsigned int data_length; /* # bytes of data saved at data[] */
- JOCTET * data; /* the data contained in the marker */
- /* the marker length word is not counted in data_length or original_length */
-};
-
-/* Known color spaces. */
-
-typedef enum {
- JCS_UNKNOWN, /* error/unspecified */
- JCS_GRAYSCALE, /* monochrome */
- JCS_RGB, /* red/green/blue */
- JCS_YCbCr, /* Y/Cb/Cr (also known as YUV) */
- JCS_CMYK, /* C/M/Y/K */
- JCS_YCCK /* Y/Cb/Cr/K */
-} J_COLOR_SPACE;
-
-/* DCT/IDCT algorithm options. */
-
-typedef enum {
- JDCT_ISLOW, /* slow but accurate integer algorithm */
- JDCT_IFAST, /* faster, less accurate integer method */
- JDCT_FLOAT /* floating-point: accurate, fast on fast HW */
-} J_DCT_METHOD;
-
-#ifndef JDCT_DEFAULT /* may be overridden in jconfig.h */
-#define JDCT_DEFAULT JDCT_ISLOW
-#endif
-#ifndef JDCT_FASTEST /* may be overridden in jconfig.h */
-#define JDCT_FASTEST JDCT_IFAST
-#endif
-
-/* Dithering options for decompression. */
-
-typedef enum {
- JDITHER_NONE, /* no dithering */
- JDITHER_ORDERED, /* simple ordered dither */
- JDITHER_FS /* Floyd-Steinberg error diffusion dither */
-} J_DITHER_MODE;
-
-
-/* Common fields between JPEG compression and decompression master structs. */
-
-#define jpeg_common_fields \
- struct jpeg_error_mgr * err; /* Error handler module */\
- struct jpeg_memory_mgr * mem; /* Memory manager module */\
- struct jpeg_progress_mgr * progress; /* Progress monitor, or NULL if none */\
- void * client_data; /* Available for use by application */\
- boolean is_decompressor; /* So common code can tell which is which */\
- int global_state /* For checking call sequence validity */
-
-/* Routines that are to be used by both halves of the library are declared
- * to receive a pointer to this structure. There are no actual instances of
- * jpeg_common_struct, only of jpeg_compress_struct and jpeg_decompress_struct.
- */
-struct jpeg_common_struct {
- jpeg_common_fields; /* Fields common to both master struct types */
- /* Additional fields follow in an actual jpeg_compress_struct or
- * jpeg_decompress_struct. All three structs must agree on these
- * initial fields! (This would be a lot cleaner in C++.)
- */
-};
-
-typedef struct jpeg_common_struct * j_common_ptr;
-typedef struct jpeg_compress_struct * j_compress_ptr;
-typedef struct jpeg_decompress_struct * j_decompress_ptr;
-
-
-/* Master record for a compression instance */
-
-struct jpeg_compress_struct {
- jpeg_common_fields; /* Fields shared with jpeg_decompress_struct */
-
- /* Destination for compressed data */
- struct jpeg_destination_mgr * dest;
-
- /* Description of source image --- these fields must be filled in by
- * outer application before starting compression. in_color_space must
- * be correct before you can even call jpeg_set_defaults().
- */
-
- JDIMENSION image_width; /* input image width */
- JDIMENSION image_height; /* input image height */
- int input_components; /* # of color components in input image */
- J_COLOR_SPACE in_color_space; /* colorspace of input image */
-
- double input_gamma; /* image gamma of input image */
-
- /* Compression parameters --- these fields must be set before calling
- * jpeg_start_compress(). We recommend calling jpeg_set_defaults() to
- * initialize everything to reasonable defaults, then changing anything
- * the application specifically wants to change. That way you won't get
- * burnt when new parameters are added. Also note that there are several
- * helper routines to simplify changing parameters.
- */
-
- int data_precision; /* bits of precision in image data */
-
- int num_components; /* # of color components in JPEG image */
- J_COLOR_SPACE jpeg_color_space; /* colorspace of JPEG image */
-
- jpeg_component_info * comp_info;
- /* comp_info[i] describes component that appears i'th in SOF */
-
- JQUANT_TBL * quant_tbl_ptrs[NUM_QUANT_TBLS];
- /* ptrs to coefficient quantization tables, or NULL if not defined */
-
- JHUFF_TBL * dc_huff_tbl_ptrs[NUM_HUFF_TBLS];
- JHUFF_TBL * ac_huff_tbl_ptrs[NUM_HUFF_TBLS];
- /* ptrs to Huffman coding tables, or NULL if not defined */
-
- UINT8 arith_dc_L[NUM_ARITH_TBLS]; /* L values for DC arith-coding tables */
- UINT8 arith_dc_U[NUM_ARITH_TBLS]; /* U values for DC arith-coding tables */
- UINT8 arith_ac_K[NUM_ARITH_TBLS]; /* Kx values for AC arith-coding tables */
-
- int num_scans; /* # of entries in scan_info array */
- const jpeg_scan_info * scan_info; /* script for multi-scan file, or NULL */
- /* The default value of scan_info is NULL, which causes a single-scan
- * sequential JPEG file to be emitted. To create a multi-scan file,
- * set num_scans and scan_info to point to an array of scan definitions.
- */
-
- boolean raw_data_in; /* TRUE=caller supplies downsampled data */
- boolean arith_code; /* TRUE=arithmetic coding, FALSE=Huffman */
- boolean optimize_coding; /* TRUE=optimize entropy encoding parms */
- boolean CCIR601_sampling; /* TRUE=first samples are cosited */
- int smoothing_factor; /* 1..100, or 0 for no input smoothing */
- J_DCT_METHOD dct_method; /* DCT algorithm selector */
-
- /* The restart interval can be specified in absolute MCUs by setting
- * restart_interval, or in MCU rows by setting restart_in_rows
- * (in which case the correct restart_interval will be figured
- * for each scan).
- */
- unsigned int restart_interval; /* MCUs per restart, or 0 for no restart */
- int restart_in_rows; /* if > 0, MCU rows per restart interval */
-
- /* Parameters controlling emission of special markers. */
-
- boolean write_JFIF_header; /* should a JFIF marker be written? */
- UINT8 JFIF_major_version; /* What to write for the JFIF version number */
- UINT8 JFIF_minor_version;
- /* These three values are not used by the JPEG code, merely copied */
- /* into the JFIF APP0 marker. density_unit can be 0 for unknown, */
- /* 1 for dots/inch, or 2 for dots/cm. Note that the pixel aspect */
- /* ratio is defined by X_density/Y_density even when density_unit=0. */
- UINT8 density_unit; /* JFIF code for pixel size units */
- UINT16 X_density; /* Horizontal pixel density */
- UINT16 Y_density; /* Vertical pixel density */
- boolean write_Adobe_marker; /* should an Adobe marker be written? */
-
- /* State variable: index of next scanline to be written to
- * jpeg_write_scanlines(). Application may use this to control its
- * processing loop, e.g., "while (next_scanline < image_height)".
- */
-
- JDIMENSION next_scanline; /* 0 .. image_height-1 */
-
- /* Remaining fields are known throughout compressor, but generally
- * should not be touched by a surrounding application.
- */
-
- /*
- * These fields are computed during compression startup
- */
- boolean progressive_mode; /* TRUE if scan script uses progressive mode */
- int max_h_samp_factor; /* largest h_samp_factor */
- int max_v_samp_factor; /* largest v_samp_factor */
-
- JDIMENSION total_iMCU_rows; /* # of iMCU rows to be input to coef ctlr */
- /* The coefficient controller receives data in units of MCU rows as defined
- * for fully interleaved scans (whether the JPEG file is interleaved or not).
- * There are v_samp_factor * DCTSIZE sample rows of each component in an
- * "iMCU" (interleaved MCU) row.
- */
-
- /*
- * These fields are valid during any one scan.
- * They describe the components and MCUs actually appearing in the scan.
- */
- int comps_in_scan; /* # of JPEG components in this scan */
- jpeg_component_info * cur_comp_info[MAX_COMPS_IN_SCAN];
- /* *cur_comp_info[i] describes component that appears i'th in SOS */
-
- JDIMENSION MCUs_per_row; /* # of MCUs across the image */
- JDIMENSION MCU_rows_in_scan; /* # of MCU rows in the image */
-
- int blocks_in_MCU; /* # of DCT blocks per MCU */
- int MCU_membership[C_MAX_BLOCKS_IN_MCU];
- /* MCU_membership[i] is index in cur_comp_info of component owning */
- /* i'th block in an MCU */
-
- int Ss, Se, Ah, Al; /* progressive JPEG parameters for scan */
-
- /*
- * Links to compression subobjects (methods and private variables of modules)
- */
- struct jpeg_comp_master * master;
- struct jpeg_c_main_controller * main;
- struct jpeg_c_prep_controller * prep;
- struct jpeg_c_coef_controller * coef;
- struct jpeg_marker_writer * marker;
- struct jpeg_color_converter * cconvert;
- struct jpeg_downsampler * downsample;
- struct jpeg_forward_dct * fdct;
- struct jpeg_entropy_encoder * entropy;
- jpeg_scan_info * script_space; /* workspace for jpeg_simple_progression */
- int script_space_size;
-};
-
-
-/* Master record for a decompression instance */
-
-struct jpeg_decompress_struct {
- jpeg_common_fields; /* Fields shared with jpeg_compress_struct */
-
- /* Source of compressed data */
- struct jpeg_source_mgr * src;
-
- /* Basic description of image --- filled in by jpeg_read_header(). */
- /* Application may inspect these values to decide how to process image. */
-
- JDIMENSION image_width; /* nominal image width (from SOF marker) */
- JDIMENSION image_height; /* nominal image height */
- int num_components; /* # of color components in JPEG image */
- J_COLOR_SPACE jpeg_color_space; /* colorspace of JPEG image */
-
- /* Decompression processing parameters --- these fields must be set before
- * calling jpeg_start_decompress(). Note that jpeg_read_header() initializes
- * them to default values.
- */
-
- J_COLOR_SPACE out_color_space; /* colorspace for output */
-
- unsigned int scale_num, scale_denom; /* fraction by which to scale image */
-
- double output_gamma; /* image gamma wanted in output */
-
- boolean buffered_image; /* TRUE=multiple output passes */
- boolean raw_data_out; /* TRUE=downsampled data wanted */
-
- J_DCT_METHOD dct_method; /* IDCT algorithm selector */
- boolean do_fancy_upsampling; /* TRUE=apply fancy upsampling */
- boolean do_block_smoothing; /* TRUE=apply interblock smoothing */
-
- boolean quantize_colors; /* TRUE=colormapped output wanted */
- /* the following are ignored if not quantize_colors: */
- J_DITHER_MODE dither_mode; /* type of color dithering to use */
- boolean two_pass_quantize; /* TRUE=use two-pass color quantization */
- int desired_number_of_colors; /* max # colors to use in created colormap */
- /* these are significant only in buffered-image mode: */
- boolean enable_1pass_quant; /* enable future use of 1-pass quantizer */
- boolean enable_external_quant;/* enable future use of external colormap */
- boolean enable_2pass_quant; /* enable future use of 2-pass quantizer */
-
- /* Description of actual output image that will be returned to application.
- * These fields are computed by jpeg_start_decompress().
- * You can also use jpeg_calc_output_dimensions() to determine these values
- * in advance of calling jpeg_start_decompress().
- */
-
- JDIMENSION output_width; /* scaled image width */
- JDIMENSION output_height; /* scaled image height */
- int out_color_components; /* # of color components in out_color_space */
- int output_components; /* # of color components returned */
- /* output_components is 1 (a colormap index) when quantizing colors;
- * otherwise it equals out_color_components.
- */
- int rec_outbuf_height; /* min recommended height of scanline buffer */
- /* If the buffer passed to jpeg_read_scanlines() is less than this many rows
- * high, space and time will be wasted due to unnecessary data copying.
- * Usually rec_outbuf_height will be 1 or 2, at most 4.
- */
-
- /* When quantizing colors, the output colormap is described by these fields.
- * The application can supply a colormap by setting colormap non-NULL before
- * calling jpeg_start_decompress; otherwise a colormap is created during
- * jpeg_start_decompress or jpeg_start_output.
- * The map has out_color_components rows and actual_number_of_colors columns.
- */
- int actual_number_of_colors; /* number of entries in use */
- JSAMPARRAY colormap; /* The color map as a 2-D pixel array */
-
- /* State variables: these variables indicate the progress of decompression.
- * The application may examine these but must not modify them.
- */
-
- /* Row index of next scanline to be read from jpeg_read_scanlines().
- * Application may use this to control its processing loop, e.g.,
- * "while (output_scanline < output_height)".
- */
- JDIMENSION output_scanline; /* 0 .. output_height-1 */
-
- /* Current input scan number and number of iMCU rows completed in scan.
- * These indicate the progress of the decompressor input side.
- */
- int input_scan_number; /* Number of SOS markers seen so far */
- JDIMENSION input_iMCU_row; /* Number of iMCU rows completed */
-
- /* The "output scan number" is the notional scan being displayed by the
- * output side. The decompressor will not allow output scan/row number
- * to get ahead of input scan/row, but it can fall arbitrarily far behind.
- */
- int output_scan_number; /* Nominal scan number being displayed */
- JDIMENSION output_iMCU_row; /* Number of iMCU rows read */
-
- /* Current progression status. coef_bits[c][i] indicates the precision
- * with which component c's DCT coefficient i (in zigzag order) is known.
- * It is -1 when no data has yet been received, otherwise it is the point
- * transform (shift) value for the most recent scan of the coefficient
- * (thus, 0 at completion of the progression).
- * This pointer is NULL when reading a non-progressive file.
- */
- int (*coef_bits)[DCTSIZE2]; /* -1 or current Al value for each coef */
-
- /* Internal JPEG parameters --- the application usually need not look at
- * these fields. Note that the decompressor output side may not use
- * any parameters that can change between scans.
- */
-
- /* Quantization and Huffman tables are carried forward across input
- * datastreams when processing abbreviated JPEG datastreams.
- */
-
- JQUANT_TBL * quant_tbl_ptrs[NUM_QUANT_TBLS];
- /* ptrs to coefficient quantization tables, or NULL if not defined */
-
- JHUFF_TBL * dc_huff_tbl_ptrs[NUM_HUFF_TBLS];
- JHUFF_TBL * ac_huff_tbl_ptrs[NUM_HUFF_TBLS];
- /* ptrs to Huffman coding tables, or NULL if not defined */
-
- /* These parameters are never carried across datastreams, since they
- * are given in SOF/SOS markers or defined to be reset by SOI.
- */
-
- int data_precision; /* bits of precision in image data */
-
- jpeg_component_info * comp_info;
- /* comp_info[i] describes component that appears i'th in SOF */
-
- boolean progressive_mode; /* TRUE if SOFn specifies progressive mode */
- boolean arith_code; /* TRUE=arithmetic coding, FALSE=Huffman */
-
- UINT8 arith_dc_L[NUM_ARITH_TBLS]; /* L values for DC arith-coding tables */
- UINT8 arith_dc_U[NUM_ARITH_TBLS]; /* U values for DC arith-coding tables */
- UINT8 arith_ac_K[NUM_ARITH_TBLS]; /* Kx values for AC arith-coding tables */
-
- unsigned int restart_interval; /* MCUs per restart interval, or 0 for no restart */
-
- /* These fields record data obtained from optional markers recognized by
- * the JPEG library.
- */
- boolean saw_JFIF_marker; /* TRUE iff a JFIF APP0 marker was found */
- /* Data copied from JFIF marker; only valid if saw_JFIF_marker is TRUE: */
- UINT8 JFIF_major_version; /* JFIF version number */
- UINT8 JFIF_minor_version;
- UINT8 density_unit; /* JFIF code for pixel size units */
- UINT16 X_density; /* Horizontal pixel density */
- UINT16 Y_density; /* Vertical pixel density */
- boolean saw_Adobe_marker; /* TRUE iff an Adobe APP14 marker was found */
- UINT8 Adobe_transform; /* Color transform code from Adobe marker */
-
- boolean CCIR601_sampling; /* TRUE=first samples are cosited */
-
- /* Aside from the specific data retained from APPn markers known to the
- * library, the uninterpreted contents of any or all APPn and COM markers
- * can be saved in a list for examination by the application.
- */
- jpeg_saved_marker_ptr marker_list; /* Head of list of saved markers */
-
- /* Remaining fields are known throughout decompressor, but generally
- * should not be touched by a surrounding application.
- */
-
- /*
- * These fields are computed during decompression startup
- */
- int max_h_samp_factor; /* largest h_samp_factor */
- int max_v_samp_factor; /* largest v_samp_factor */
-
- int min_DCT_scaled_size; /* smallest DCT_scaled_size of any component */
-
- JDIMENSION total_iMCU_rows; /* # of iMCU rows in image */
- /* The coefficient controller's input and output progress is measured in
- * units of "iMCU" (interleaved MCU) rows. These are the same as MCU rows
- * in fully interleaved JPEG scans, but are used whether the scan is
- * interleaved or not. We define an iMCU row as v_samp_factor DCT block
- * rows of each component. Therefore, the IDCT output contains
- * v_samp_factor*DCT_scaled_size sample rows of a component per iMCU row.
- */
-
- JSAMPLE * sample_range_limit; /* table for fast range-limiting */
-
- /*
- * These fields are valid during any one scan.
- * They describe the components and MCUs actually appearing in the scan.
- * Note that the decompressor output side must not use these fields.
- */
- int comps_in_scan; /* # of JPEG components in this scan */
- jpeg_component_info * cur_comp_info[MAX_COMPS_IN_SCAN];
- /* *cur_comp_info[i] describes component that appears i'th in SOS */
-
- JDIMENSION MCUs_per_row; /* # of MCUs across the image */
- JDIMENSION MCU_rows_in_scan; /* # of MCU rows in the image */
-
- int blocks_in_MCU; /* # of DCT blocks per MCU */
- int MCU_membership[D_MAX_BLOCKS_IN_MCU];
- /* MCU_membership[i] is index in cur_comp_info of component owning */
- /* i'th block in an MCU */
-
- int Ss, Se, Ah, Al; /* progressive JPEG parameters for scan */
-
- /* This field is shared between entropy decoder and marker parser.
- * It is either zero or the code of a JPEG marker that has been
- * read from the data source, but has not yet been processed.
- */
- int unread_marker;
-
- /*
- * Links to decompression subobjects (methods, private variables of modules)
- */
- struct jpeg_decomp_master * master;
- struct jpeg_d_main_controller * main;
- struct jpeg_d_coef_controller * coef;
- struct jpeg_d_post_controller * post;
- struct jpeg_input_controller * inputctl;
- struct jpeg_marker_reader * marker;
- struct jpeg_entropy_decoder * entropy;
- struct jpeg_inverse_dct * idct;
- struct jpeg_upsampler * upsample;
- struct jpeg_color_deconverter * cconvert;
- struct jpeg_color_quantizer * cquantize;
-};
-
-
-/* "Object" declarations for JPEG modules that may be supplied or called
- * directly by the surrounding application.
- * As with all objects in the JPEG library, these structs only define the
- * publicly visible methods and state variables of a module. Additional
- * private fields may exist after the public ones.
- */
-
-
-/* Error handler object */
-
-struct jpeg_error_mgr {
- /* Error exit handler: does not return to caller */
- JMETHOD(void, error_exit, (j_common_ptr cinfo));
- /* Conditionally emit a trace or warning message */
- JMETHOD(void, emit_message, (j_common_ptr cinfo, int msg_level));
- /* Routine that actually outputs a trace or error message */
- JMETHOD(void, output_message, (j_common_ptr cinfo));
- /* Format a message string for the most recent JPEG error or message */
- JMETHOD(void, format_message, (j_common_ptr cinfo, char * buffer));
-#define JMSG_LENGTH_MAX 200 /* recommended size of format_message buffer */
- /* Reset error state variables at start of a new image */
- JMETHOD(void, reset_error_mgr, (j_common_ptr cinfo));
-
- /* The message ID code and any parameters are saved here.
- * A message can have one string parameter or up to 8 int parameters.
- */
- int msg_code;
-#define JMSG_STR_PARM_MAX 80
- union {
- int i[8];
- char s[JMSG_STR_PARM_MAX];
- } msg_parm;
-
- /* Standard state variables for error facility */
-
- int trace_level; /* max msg_level that will be displayed */
-
- /* For recoverable corrupt-data errors, we emit a warning message,
- * but keep going unless emit_message chooses to abort. emit_message
- * should count warnings in num_warnings. The surrounding application
- * can check for bad data by seeing if num_warnings is nonzero at the
- * end of processing.
- */
- long num_warnings; /* number of corrupt-data warnings */
-
- /* These fields point to the table(s) of error message strings.
- * An application can change the table pointer to switch to a different
- * message list (typically, to change the language in which errors are
- * reported). Some applications may wish to add additional error codes
- * that will be handled by the JPEG library error mechanism; the second
- * table pointer is used for this purpose.
- *
- * First table includes all errors generated by JPEG library itself.
- * Error code 0 is reserved for a "no such error string" message.
- */
- const char * const * jpeg_message_table; /* Library errors */
- int last_jpeg_message; /* Table contains strings 0..last_jpeg_message */
- /* Second table can be added by application (see cjpeg/djpeg for example).
- * It contains strings numbered first_addon_message..last_addon_message.
- */
- const char * const * addon_message_table; /* Non-library errors */
- int first_addon_message; /* code for first string in addon table */
- int last_addon_message; /* code for last string in addon table */
-};
-
-
-/* Progress monitor object */
-
-struct jpeg_progress_mgr {
- JMETHOD(void, progress_monitor, (j_common_ptr cinfo));
-
- long pass_counter; /* work units completed in this pass */
- long pass_limit; /* total number of work units in this pass */
- int completed_passes; /* passes completed so far */
- int total_passes; /* total number of passes expected */
-};
-
-
-/* Data destination object for compression */
-
-struct jpeg_destination_mgr {
- JOCTET * next_output_byte; /* => next byte to write in buffer */
- size_t free_in_buffer; /* # of byte spaces remaining in buffer */
-
- JMETHOD(void, init_destination, (j_compress_ptr cinfo));
- JMETHOD(boolean, empty_output_buffer, (j_compress_ptr cinfo));
- JMETHOD(void, term_destination, (j_compress_ptr cinfo));
-};
-
-
-/* Data source object for decompression */
-
-struct jpeg_source_mgr {
- const JOCTET * next_input_byte; /* => next byte to read from buffer */
- size_t bytes_in_buffer; /* # of bytes remaining in buffer */
-
- JMETHOD(void, init_source, (j_decompress_ptr cinfo));
- JMETHOD(boolean, fill_input_buffer, (j_decompress_ptr cinfo));
- JMETHOD(void, skip_input_data, (j_decompress_ptr cinfo, long num_bytes));
- JMETHOD(boolean, resync_to_restart, (j_decompress_ptr cinfo, int desired));
- JMETHOD(void, term_source, (j_decompress_ptr cinfo));
-};
-
-
-/* Memory manager object.
- * Allocates "small" objects (a few K total), "large" objects (tens of K),
- * and "really big" objects (virtual arrays with backing store if needed).
- * The memory manager does not allow individual objects to be freed; rather,
- * each created object is assigned to a pool, and whole pools can be freed
- * at once. This is faster and more convenient than remembering exactly what
- * to free, especially where malloc()/free() are not too speedy.
- * NB: alloc routines never return NULL. They exit to error_exit if not
- * successful.
- */
-
-#define JPOOL_PERMANENT 0 /* lasts until master record is destroyed */
-#define JPOOL_IMAGE 1 /* lasts until done with image/datastream */
-#define JPOOL_NUMPOOLS 2
-
-typedef struct jvirt_sarray_control * jvirt_sarray_ptr;
-typedef struct jvirt_barray_control * jvirt_barray_ptr;
-
-
-struct jpeg_memory_mgr {
- /* Method pointers */
- JMETHOD(void *, alloc_small, (j_common_ptr cinfo, int pool_id,
- size_t sizeofobject));
- JMETHOD(void *, alloc_large, (j_common_ptr cinfo, int pool_id,
- size_t sizeofobject));
- JMETHOD(JSAMPARRAY, alloc_sarray, (j_common_ptr cinfo, int pool_id,
- JDIMENSION samplesperrow,
- JDIMENSION numrows));
- JMETHOD(JBLOCKARRAY, alloc_barray, (j_common_ptr cinfo, int pool_id,
- JDIMENSION blocksperrow,
- JDIMENSION numrows));
- JMETHOD(jvirt_sarray_ptr, request_virt_sarray, (j_common_ptr cinfo,
- int pool_id,
- boolean pre_zero,
- JDIMENSION samplesperrow,
- JDIMENSION numrows,
- JDIMENSION maxaccess));
- JMETHOD(jvirt_barray_ptr, request_virt_barray, (j_common_ptr cinfo,
- int pool_id,
- boolean pre_zero,
- JDIMENSION blocksperrow,
- JDIMENSION numrows,
- JDIMENSION maxaccess));
- JMETHOD(void, realize_virt_arrays, (j_common_ptr cinfo));
- JMETHOD(JSAMPARRAY, access_virt_sarray, (j_common_ptr cinfo,
- jvirt_sarray_ptr ptr,
- JDIMENSION start_row,
- JDIMENSION num_rows,
- boolean writable));
- JMETHOD(JBLOCKARRAY, access_virt_barray, (j_common_ptr cinfo,
- jvirt_barray_ptr ptr,
- JDIMENSION start_row,
- JDIMENSION num_rows,
- boolean writable));
- JMETHOD(void, free_pool, (j_common_ptr cinfo, int pool_id));
- JMETHOD(void, self_destruct, (j_common_ptr cinfo));
-
- /* Limit on memory allocation for this JPEG object. (Note that this is
- * merely advisory, not a guaranteed maximum; it only affects the space
- * used for virtual-array buffers.) May be changed by outer application
- * after creating the JPEG object.
- */
- long max_memory_to_use;
-
- /* Maximum allocation request accepted by alloc_large. */
- long max_alloc_chunk;
-};
-
-
-/* Routine signature for application-supplied marker processing methods.
- * Need not pass marker code since it is stored in cinfo->unread_marker.
- */
-typedef JMETHOD(boolean, jpeg_marker_parser_method, (j_decompress_ptr cinfo));
-
-
-/* Declarations for routines called by application.
- * The JPP macro hides prototype parameters from compilers that can't cope.
- * Note JPP requires double parentheses.
- */
-
-#ifdef HAVE_PROTOTYPES
-#define JPP(arglist) arglist
-#else
-#define JPP(arglist) ()
-#endif
-
-
-/* Short forms of external names for systems with brain-damaged linkers.
- * We shorten external names to be unique in the first six letters, which
- * is good enough for all known systems.
- * (If your compiler itself needs names to be unique in less than 15
- * characters, you are out of luck. Get a better compiler.)
- */
-
-#ifdef NEED_SHORT_EXTERNAL_NAMES
-#define jpeg_std_error jStdError
-#define jpeg_CreateCompress jCreaCompress
-#define jpeg_CreateDecompress jCreaDecompress
-#define jpeg_destroy_compress jDestCompress
-#define jpeg_destroy_decompress jDestDecompress
-#define jpeg_stdio_dest jStdDest
-#define jpeg_stdio_src jStdSrc
-#define jpeg_set_defaults jSetDefaults
-#define jpeg_set_colorspace jSetColorspace
-#define jpeg_default_colorspace jDefColorspace
-#define jpeg_set_quality jSetQuality
-#define jpeg_set_linear_quality jSetLQuality
-#define jpeg_add_quant_table jAddQuantTable
-#define jpeg_quality_scaling jQualityScaling
-#define jpeg_simple_progression jSimProgress
-#define jpeg_suppress_tables jSuppressTables
-#define jpeg_alloc_quant_table jAlcQTable
-#define jpeg_alloc_huff_table jAlcHTable
-#define jpeg_start_compress jStrtCompress
-#define jpeg_write_scanlines jWrtScanlines
-#define jpeg_finish_compress jFinCompress
-#define jpeg_write_raw_data jWrtRawData
-#define jpeg_write_marker jWrtMarker
-#define jpeg_write_m_header jWrtMHeader
-#define jpeg_write_m_byte jWrtMByte
-#define jpeg_write_tables jWrtTables
-#define jpeg_read_header jReadHeader
-#define jpeg_start_decompress jStrtDecompress
-#define jpeg_read_scanlines jReadScanlines
-#define jpeg_finish_decompress jFinDecompress
-#define jpeg_read_raw_data jReadRawData
-#define jpeg_has_multiple_scans jHasMultScn
-#define jpeg_start_output jStrtOutput
-#define jpeg_finish_output jFinOutput
-#define jpeg_input_complete jInComplete
-#define jpeg_new_colormap jNewCMap
-#define jpeg_consume_input jConsumeInput
-#define jpeg_calc_output_dimensions jCalcDimensions
-#define jpeg_save_markers jSaveMarkers
-#define jpeg_set_marker_processor jSetMarker
-#define jpeg_read_coefficients jReadCoefs
-#define jpeg_write_coefficients jWrtCoefs
-#define jpeg_copy_critical_parameters jCopyCrit
-#define jpeg_abort_compress jAbrtCompress
-#define jpeg_abort_decompress jAbrtDecompress
-#define jpeg_abort jAbort
-#define jpeg_destroy jDestroy
-#define jpeg_resync_to_restart jResyncRestart
-#endif /* NEED_SHORT_EXTERNAL_NAMES */
-
-
-/* Default error-management setup */
-EXTERN(struct jpeg_error_mgr *) jpeg_std_error
- JPP((struct jpeg_error_mgr * err));
-
-/* Initialization of JPEG compression objects.
- * jpeg_create_compress() and jpeg_create_decompress() are the exported
- * names that applications should call. These expand to calls on
- * jpeg_CreateCompress and jpeg_CreateDecompress with additional information
- * passed for version mismatch checking.
- * NB: you must set up the error-manager BEFORE calling jpeg_create_xxx.
- */
-#define jpeg_create_compress(cinfo) \
- jpeg_CreateCompress((cinfo), JPEG_LIB_VERSION, \
- (size_t) sizeof(struct jpeg_compress_struct))
-#define jpeg_create_decompress(cinfo) \
- jpeg_CreateDecompress((cinfo), JPEG_LIB_VERSION, \
- (size_t) sizeof(struct jpeg_decompress_struct))
-EXTERN(void) jpeg_CreateCompress JPP((j_compress_ptr cinfo,
- int version, size_t structsize));
-EXTERN(void) jpeg_CreateDecompress JPP((j_decompress_ptr cinfo,
- int version, size_t structsize));
-/* Destruction of JPEG compression objects */
-EXTERN(void) jpeg_destroy_compress JPP((j_compress_ptr cinfo));
-EXTERN(void) jpeg_destroy_decompress JPP((j_decompress_ptr cinfo));
-
-#if 0
-/* Standard data source and destination managers: stdio streams. */
-/* Caller is responsible for opening the file before and closing after. */
-EXTERN(void) jpeg_stdio_dest JPP((j_compress_ptr cinfo, FXSYS_FILE * outfile));
-EXTERN(void) jpeg_stdio_src JPP((j_decompress_ptr cinfo, FXSYS_FILE * infile));
-#endif
-
-/* Default parameter setup for compression */
-EXTERN(void) jpeg_set_defaults JPP((j_compress_ptr cinfo));
-/* Compression parameter setup aids */
-EXTERN(void) jpeg_set_colorspace JPP((j_compress_ptr cinfo,
- J_COLOR_SPACE colorspace));
-EXTERN(void) jpeg_default_colorspace JPP((j_compress_ptr cinfo));
-EXTERN(void) jpeg_set_quality JPP((j_compress_ptr cinfo, int quality,
- boolean force_baseline));
-EXTERN(void) jpeg_set_linear_quality JPP((j_compress_ptr cinfo,
- int scale_factor,
- boolean force_baseline));
-EXTERN(void) jpeg_add_quant_table JPP((j_compress_ptr cinfo, int which_tbl,
- const unsigned int *basic_table,
- int scale_factor,
- boolean force_baseline));
-EXTERN(int) jpeg_quality_scaling JPP((int quality));
-EXTERN(void) jpeg_simple_progression JPP((j_compress_ptr cinfo));
-EXTERN(void) jpeg_suppress_tables JPP((j_compress_ptr cinfo,
- boolean suppress));
-EXTERN(JQUANT_TBL *) jpeg_alloc_quant_table JPP((j_common_ptr cinfo));
-EXTERN(JHUFF_TBL *) jpeg_alloc_huff_table JPP((j_common_ptr cinfo));
-
-/* Main entry points for compression */
-EXTERN(void) jpeg_start_compress JPP((j_compress_ptr cinfo,
- boolean write_all_tables));
-EXTERN(JDIMENSION) jpeg_write_scanlines JPP((j_compress_ptr cinfo,
- JSAMPARRAY scanlines,
- JDIMENSION num_lines));
-EXTERN(void) jpeg_finish_compress JPP((j_compress_ptr cinfo));
-
-/* Replaces jpeg_write_scanlines when writing raw downsampled data. */
-EXTERN(JDIMENSION) jpeg_write_raw_data JPP((j_compress_ptr cinfo,
- JSAMPIMAGE data,
- JDIMENSION num_lines));
-
-/* Write a special marker. See libjpeg.doc concerning safe usage. */
-EXTERN(void) jpeg_write_marker
- JPP((j_compress_ptr cinfo, int marker,
- const JOCTET * dataptr, unsigned int datalen));
-/* Same, but piecemeal. */
-EXTERN(void) jpeg_write_m_header
- JPP((j_compress_ptr cinfo, int marker, unsigned int datalen));
-EXTERN(void) jpeg_write_m_byte
- JPP((j_compress_ptr cinfo, int val));
-
-/* Alternate compression function: just write an abbreviated table file */
-EXTERN(void) jpeg_write_tables JPP((j_compress_ptr cinfo));
-
-/* Decompression startup: read start of JPEG datastream to see what's there */
-EXTERN(int) jpeg_read_header JPP((j_decompress_ptr cinfo,
- boolean require_image));
-/* Return value is one of: */
-#define JPEG_SUSPENDED 0 /* Suspended due to lack of input data */
-#define JPEG_HEADER_OK 1 /* Found valid image datastream */
-#define JPEG_HEADER_TABLES_ONLY 2 /* Found valid table-specs-only datastream */
-/* If you pass require_image = TRUE (normal case), you need not check for
- * a TABLES_ONLY return code; an abbreviated file will cause an error exit.
- * JPEG_SUSPENDED is only possible if you use a data source module that can
- * give a suspension return (the stdio source module doesn't).
- */
-
-/* Main entry points for decompression */
-EXTERN(boolean) jpeg_start_decompress JPP((j_decompress_ptr cinfo));
-EXTERN(JDIMENSION) jpeg_read_scanlines JPP((j_decompress_ptr cinfo,
- JSAMPARRAY scanlines,
- JDIMENSION max_lines));
-EXTERN(boolean) jpeg_finish_decompress JPP((j_decompress_ptr cinfo));
-
-/* Replaces jpeg_read_scanlines when reading raw downsampled data. */
-EXTERN(JDIMENSION) jpeg_read_raw_data JPP((j_decompress_ptr cinfo,
- JSAMPIMAGE data,
- JDIMENSION max_lines));
-
-/* Additional entry points for buffered-image mode. */
-EXTERN(boolean) jpeg_has_multiple_scans JPP((j_decompress_ptr cinfo));
-EXTERN(boolean) jpeg_start_output JPP((j_decompress_ptr cinfo,
- int scan_number));
-EXTERN(boolean) jpeg_finish_output JPP((j_decompress_ptr cinfo));
-EXTERN(boolean) jpeg_input_complete JPP((j_decompress_ptr cinfo));
-EXTERN(void) jpeg_new_colormap JPP((j_decompress_ptr cinfo));
-EXTERN(int) jpeg_consume_input JPP((j_decompress_ptr cinfo));
-/* Return value is one of: */
-/* #define JPEG_SUSPENDED 0 Suspended due to lack of input data */
-#define JPEG_REACHED_SOS 1 /* Reached start of new scan */
-#define JPEG_REACHED_EOI 2 /* Reached end of image */
-#define JPEG_ROW_COMPLETED 3 /* Completed one iMCU row */
-#define JPEG_SCAN_COMPLETED 4 /* Completed last iMCU row of a scan */
-
-/* Precalculate output dimensions for current decompression parameters. */
-EXTERN(void) jpeg_calc_output_dimensions JPP((j_decompress_ptr cinfo));
-
-/* Control saving of COM and APPn markers into marker_list. */
-EXTERN(void) jpeg_save_markers
- JPP((j_decompress_ptr cinfo, int marker_code,
- unsigned int length_limit));
-
-/* Install a special processing method for COM or APPn markers. */
-EXTERN(void) jpeg_set_marker_processor
- JPP((j_decompress_ptr cinfo, int marker_code,
- jpeg_marker_parser_method routine));
-
-/* Read or write raw DCT coefficients --- useful for lossless transcoding. */
-EXTERN(jvirt_barray_ptr *) jpeg_read_coefficients JPP((j_decompress_ptr cinfo));
-EXTERN(void) jpeg_write_coefficients JPP((j_compress_ptr cinfo,
- jvirt_barray_ptr * coef_arrays));
-EXTERN(void) jpeg_copy_critical_parameters JPP((j_decompress_ptr srcinfo,
- j_compress_ptr dstinfo));
-
-/* If you choose to abort compression or decompression before completing
- * jpeg_finish_(de)compress, then you need to clean up to release memory,
- * temporary files, etc. You can just call jpeg_destroy_(de)compress
- * if you're done with the JPEG object, but if you want to clean it up and
- * reuse it, call this:
- */
-EXTERN(void) jpeg_abort_compress JPP((j_compress_ptr cinfo));
-EXTERN(void) jpeg_abort_decompress JPP((j_decompress_ptr cinfo));
-
-/* Generic versions of jpeg_abort and jpeg_destroy that work on either
- * flavor of JPEG object. These may be more convenient in some places.
- */
-EXTERN(void) jpeg_abort JPP((j_common_ptr cinfo));
-EXTERN(void) jpeg_destroy JPP((j_common_ptr cinfo));
-
-/* Default restart-marker-resync procedure for use by data source modules */
-EXTERN(boolean) jpeg_resync_to_restart JPP((j_decompress_ptr cinfo,
- int desired));
-
-
-/* These marker codes are exported since applications and data source modules
- * are likely to want to use them.
- */
-
-#define JPEG_RST0 0xD0 /* RST0 marker code */
-#define JPEG_EOI 0xD9 /* EOI marker code */
-#define JPEG_APP0 0xE0 /* APP0 marker code */
-#define JPEG_COM 0xFE /* COM marker code */
-
-
-/* If we have a brain-damaged compiler that emits warnings (or worse, errors)
- * for structure definitions that are never filled in, keep it quiet by
- * supplying dummy definitions for the various substructures.
- */
-
-#ifdef INCOMPLETE_TYPES_BROKEN
-#ifndef JPEG_INTERNALS /* will be defined in jpegint.h */
-struct jvirt_sarray_control { long dummy; };
-struct jvirt_barray_control { long dummy; };
-struct jpeg_comp_master { long dummy; };
-struct jpeg_c_main_controller { long dummy; };
-struct jpeg_c_prep_controller { long dummy; };
-struct jpeg_c_coef_controller { long dummy; };
-struct jpeg_marker_writer { long dummy; };
-struct jpeg_color_converter { long dummy; };
-struct jpeg_downsampler { long dummy; };
-struct jpeg_forward_dct { long dummy; };
-struct jpeg_entropy_encoder { long dummy; };
-struct jpeg_decomp_master { long dummy; };
-struct jpeg_d_main_controller { long dummy; };
-struct jpeg_d_coef_controller { long dummy; };
-struct jpeg_d_post_controller { long dummy; };
-struct jpeg_input_controller { long dummy; };
-struct jpeg_marker_reader { long dummy; };
-struct jpeg_entropy_decoder { long dummy; };
-struct jpeg_inverse_dct { long dummy; };
-struct jpeg_upsampler { long dummy; };
-struct jpeg_color_deconverter { long dummy; };
-struct jpeg_color_quantizer { long dummy; };
-#endif /* JPEG_INTERNALS */
-#endif /* INCOMPLETE_TYPES_BROKEN */
-
-
-/*
- * The JPEG library modules define JPEG_INTERNALS before including this file.
- * The internal structure declarations are read only when that is true.
- * Applications using the library should not include jpegint.h, but may wish
- * to include jerror.h.
- */
-
-#ifdef JPEG_INTERNALS
-#include "jpegint.h" /* fetch private declarations */
-#include "jerror.h" /* fetch error codes too */
-#endif
-
-#endif /* JPEGLIB_H */
+/*
+ * jpeglib.h
+ *
+ * Copyright (C) 1991-1998, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file defines the application interface for the JPEG library.
+ * Most applications using the library need only include this file,
+ * and perhaps jerror.h if they want to know the exact error codes.
+ */
+
+#ifndef JPEGLIB_H
+#define JPEGLIB_H
+
+#define FOXIT_PREFIX(origName) FPDFAPIJPEG_##origName
+
+#define jcopy_block_row FOXIT_PREFIX(jcopy_block_row)
+#define jcopy_sample_rows FOXIT_PREFIX(jcopy_sample_rows)
+#define jdiv_round_up FOXIT_PREFIX(jdiv_round_up)
+#define jinit_1pass_quantizer FOXIT_PREFIX(jinit_1pass_quantizer)
+#define jinit_2pass_quantizer FOXIT_PREFIX(jinit_2pass_quantizer)
+#define jinit_color_deconverter FOXIT_PREFIX(jinit_color_deconverter)
+#define jinit_d_coef_controller FOXIT_PREFIX(jinit_d_coef_controller)
+#define jinit_d_main_controller FOXIT_PREFIX(jinit_d_main_controller)
+#define jinit_d_post_controller FOXIT_PREFIX(jinit_d_post_controller)
+#define jinit_huff_decoder FOXIT_PREFIX(jinit_huff_decoder)
+#define jinit_input_controller FOXIT_PREFIX(jinit_input_controller)
+#define jinit_inverse_dct FOXIT_PREFIX(jinit_inverse_dct)
+#define jinit_marker_reader FOXIT_PREFIX(jinit_marker_reader)
+#define jinit_master_decompress FOXIT_PREFIX(jinit_master_decompress)
+#define jinit_memory_mgr FOXIT_PREFIX(jinit_memory_mgr)
+#define jinit_merged_upsampler FOXIT_PREFIX(jinit_merged_upsampler)
+#define jinit_phuff_decoder FOXIT_PREFIX(jinit_phuff_decoder)
+#define jinit_upsampler FOXIT_PREFIX(jinit_upsampler)
+#define jpeg_CreateDecompress FOXIT_PREFIX(jpeg_CreateDecompress)
+#define jpeg_abort FOXIT_PREFIX(jpeg_abort)
+#define jpeg_abort_decompress FOXIT_PREFIX(jpeg_abort_decompress)
+#define jpeg_alloc_huff_table FOXIT_PREFIX(jpeg_alloc_huff_table)
+#define jpeg_alloc_quant_table FOXIT_PREFIX(jpeg_alloc_quant_table)
+#define jpeg_calc_output_dimensions FOXIT_PREFIX(jpeg_calc_output_dimensions)
+#define jpeg_consume_input FOXIT_PREFIX(jpeg_consume_input)
+#define jpeg_destroy FOXIT_PREFIX(jpeg_destroy)
+#define jpeg_destroy_decompress FOXIT_PREFIX(jpeg_destroy_decompress)
+#define jpeg_fill_bit_buffer FOXIT_PREFIX(jpeg_fill_bit_buffer)
+#define jpeg_finish_decompress FOXIT_PREFIX(jpeg_finish_decompress)
+#define jpeg_finish_output FOXIT_PREFIX(jpeg_finish_output)
+#define jpeg_free_large FOXIT_PREFIX(jpeg_free_large)
+#define jpeg_free_small FOXIT_PREFIX(jpeg_free_small)
+#define jpeg_get_large FOXIT_PREFIX(jpeg_get_large)
+#define jpeg_get_small FOXIT_PREFIX(jpeg_get_small)
+#define jpeg_has_multiple_scans FOXIT_PREFIX(jpeg_has_multiple_scans)
+#define jpeg_huff_decode FOXIT_PREFIX(jpeg_huff_decode)
+#define jpeg_idct_1x1 FOXIT_PREFIX(jpeg_idct_1x1)
+#define jpeg_idct_2x2 FOXIT_PREFIX(jpeg_idct_2x2)
+#define jpeg_idct_4x4 FOXIT_PREFIX(jpeg_idct_4x4)
+#define jpeg_idct_float FOXIT_PREFIX(jpeg_idct_float)
+#define jpeg_idct_ifast FOXIT_PREFIX(jpeg_idct_ifast)
+#define jpeg_idct_islow FOXIT_PREFIX(jpeg_idct_islow)
+#define jpeg_input_complete FOXIT_PREFIX(jpeg_input_complete)
+#define jpeg_make_d_derived_tbl FOXIT_PREFIX(jpeg_make_d_derived_tbl)
+#define jpeg_mem_available FOXIT_PREFIX(jpeg_mem_available)
+#define jpeg_mem_init FOXIT_PREFIX(jpeg_mem_init)
+#define jpeg_mem_term FOXIT_PREFIX(jpeg_mem_term)
+#define jpeg_natural_order FOXIT_PREFIX(jpeg_natural_order)
+#define jpeg_new_colormap FOXIT_PREFIX(jpeg_new_colormap)
+#define jpeg_open_backing_store FOXIT_PREFIX(jpeg_open_backing_store)
+#define jpeg_read_coefficients FOXIT_PREFIX(jpeg_read_coefficients)
+#define jpeg_read_header FOXIT_PREFIX(jpeg_read_header)
+#define jpeg_read_raw_data FOXIT_PREFIX(jpeg_read_raw_data)
+#define jpeg_read_scanlines FOXIT_PREFIX(jpeg_read_scanlines)
+#define jpeg_resync_to_restart FOXIT_PREFIX(jpeg_resync_to_restart)
+#define jpeg_save_markers FOXIT_PREFIX(jpeg_save_markers)
+#define jpeg_set_marker_processor FOXIT_PREFIX(jpeg_set_marker_processor)
+#define jpeg_start_decompress FOXIT_PREFIX(jpeg_start_decompress)
+#define jpeg_start_output FOXIT_PREFIX(jpeg_start_output)
+#define jpeg_std_error FOXIT_PREFIX(jpeg_std_error)
+#define jpeg_std_message_table FOXIT_PREFIX(jpeg_std_message_table)
+#define jpeg_stdio_src FOXIT_PREFIX(jpeg_stdio_src)
+#define jround_up FOXIT_PREFIX(jround_up)
+#define jzero_far FOXIT_PREFIX(jzero_far)
+
+ /*
+ * First we include the configuration files that record how this
+ * installation of the JPEG library is set up. jconfig.h can be
+ * generated automatically for many systems. jmorecfg.h contains
+ * manual configuration options that most people need not worry about.
+ */
+
+#ifndef JCONFIG_INCLUDED /* in case jinclude.h already did */
+#include "jconfig.h" /* widely used configuration options */
+#endif
+#include "jmorecfg.h" /* seldom changed options */
+
+
+/* Version ID for the JPEG library.
+ * Might be useful for tests like "#if JPEG_LIB_VERSION >= 60".
+ */
+
+#define JPEG_LIB_VERSION 62 /* Version 6b */
+
+
+/* Various constants determining the sizes of things.
+ * All of these are specified by the JPEG standard, so don't change them
+ * if you want to be compatible.
+ */
+
+#define DCTSIZE 8 /* The basic DCT block is 8x8 samples */
+#define DCTSIZE2 64 /* DCTSIZE squared; # of elements in a block */
+#define NUM_QUANT_TBLS 4 /* Quantization tables are numbered 0..3 */
+#define NUM_HUFF_TBLS 4 /* Huffman tables are numbered 0..3 */
+#define NUM_ARITH_TBLS 16 /* Arith-coding tables are numbered 0..15 */
+#define MAX_COMPS_IN_SCAN 4 /* JPEG limit on # of components in one scan */
+#define MAX_SAMP_FACTOR 4 /* JPEG limit on sampling factors */
+/* Unfortunately, some bozo at Adobe saw no reason to be bound by the standard;
+ * the PostScript DCT filter can emit files with many more than 10 blocks/MCU.
+ * If you happen to run across such a file, you can up D_MAX_BLOCKS_IN_MCU
+ * to handle it. We even let you do this from the jconfig.h file. However,
+ * we strongly discourage changing C_MAX_BLOCKS_IN_MCU; just because Adobe
+ * sometimes emits noncompliant files doesn't mean you should too.
+ */
+#define C_MAX_BLOCKS_IN_MCU 10 /* compressor's limit on blocks per MCU */
+#ifndef D_MAX_BLOCKS_IN_MCU
+#define D_MAX_BLOCKS_IN_MCU 10 /* decompressor's limit on blocks per MCU */
+#endif
+
+
+/* Data structures for images (arrays of samples and of DCT coefficients).
+ * On 80x86 machines, the image arrays are too big for near pointers,
+ * but the pointer arrays can fit in near memory.
+ */
+
+typedef JSAMPLE *JSAMPROW; /* ptr to one image row of pixel samples. */
+typedef JSAMPROW *JSAMPARRAY; /* ptr to some rows (a 2-D sample array) */
+typedef JSAMPARRAY *JSAMPIMAGE; /* a 3-D sample array: top index is color */
+
+typedef JCOEF JBLOCK[DCTSIZE2]; /* one block of coefficients */
+typedef JBLOCK *JBLOCKROW; /* pointer to one row of coefficient blocks */
+typedef JBLOCKROW *JBLOCKARRAY; /* a 2-D array of coefficient blocks */
+typedef JBLOCKARRAY *JBLOCKIMAGE; /* a 3-D array of coefficient blocks */
+
+typedef JCOEF *JCOEFPTR; /* useful in a couple of places */
+
+
+/* Types for JPEG compression parameters and working tables. */
+
+
+/* DCT coefficient quantization tables. */
+
+typedef struct {
+ /* This array gives the coefficient quantizers in natural array order
+ * (not the zigzag order in which they are stored in a JPEG DQT marker).
+ * CAUTION: IJG versions prior to v6a kept this array in zigzag order.
+ */
+ UINT16 quantval[DCTSIZE2]; /* quantization step for each coefficient */
+ /* This field is used only during compression. It's initialized FALSE when
+ * the table is created, and set TRUE when it's been output to the file.
+ * You could suppress output of a table by setting this to TRUE.
+ * (See jpeg_suppress_tables for an example.)
+ */
+ boolean sent_table; /* TRUE when table has been output */
+} JQUANT_TBL;
+
+
+/* Huffman coding tables. */
+
+typedef struct {
+ /* These two fields directly represent the contents of a JPEG DHT marker */
+ UINT8 bits[17]; /* bits[k] = # of symbols with codes of */
+ /* length k bits; bits[0] is unused */
+ UINT8 huffval[256]; /* The symbols, in order of incr code length */
+ /* This field is used only during compression. It's initialized FALSE when
+ * the table is created, and set TRUE when it's been output to the file.
+ * You could suppress output of a table by setting this to TRUE.
+ * (See jpeg_suppress_tables for an example.)
+ */
+ boolean sent_table; /* TRUE when table has been output */
+} JHUFF_TBL;
+
+
+/* Basic info about one component (color channel). */
+
+typedef struct {
+ /* These values are fixed over the whole image. */
+ /* For compression, they must be supplied by parameter setup; */
+ /* for decompression, they are read from the SOF marker. */
+ int component_id; /* identifier for this component (0..255) */
+ int component_index; /* its index in SOF or cinfo->comp_info[] */
+ int h_samp_factor; /* horizontal sampling factor (1..4) */
+ int v_samp_factor; /* vertical sampling factor (1..4) */
+ int quant_tbl_no; /* quantization table selector (0..3) */
+ /* These values may vary between scans. */
+ /* For compression, they must be supplied by parameter setup; */
+ /* for decompression, they are read from the SOS marker. */
+ /* The decompressor output side may not use these variables. */
+ int dc_tbl_no; /* DC entropy table selector (0..3) */
+ int ac_tbl_no; /* AC entropy table selector (0..3) */
+
+ /* Remaining fields should be treated as private by applications. */
+
+ /* These values are computed during compression or decompression startup: */
+ /* Component's size in DCT blocks.
+ * Any dummy blocks added to complete an MCU are not counted; therefore
+ * these values do not depend on whether a scan is interleaved or not.
+ */
+ JDIMENSION width_in_blocks;
+ JDIMENSION height_in_blocks;
+ /* Size of a DCT block in samples. Always DCTSIZE for compression.
+ * For decompression this is the size of the output from one DCT block,
+ * reflecting any scaling we choose to apply during the IDCT step.
+ * Values of 1,2,4,8 are likely to be supported. Note that different
+ * components may receive different IDCT scalings.
+ */
+ int DCT_scaled_size;
+ /* The downsampled dimensions are the component's actual, unpadded number
+ * of samples at the main buffer (preprocessing/compression interface), thus
+ * downsampled_width = ceil(image_width * Hi/Hmax)
+ * and similarly for height. For decompression, IDCT scaling is included, so
+ * downsampled_width = ceil(image_width * Hi/Hmax * DCT_scaled_size/DCTSIZE)
+ */
+ JDIMENSION downsampled_width; /* actual width in samples */
+ JDIMENSION downsampled_height; /* actual height in samples */
+ /* This flag is used only for decompression. In cases where some of the
+ * components will be ignored (eg grayscale output from YCbCr image),
+ * we can skip most computations for the unused components.
+ */
+ boolean component_needed; /* do we need the value of this component? */
+
+ /* These values are computed before starting a scan of the component. */
+ /* The decompressor output side may not use these variables. */
+ int MCU_width; /* number of blocks per MCU, horizontally */
+ int MCU_height; /* number of blocks per MCU, vertically */
+ int MCU_blocks; /* MCU_width * MCU_height */
+ int MCU_sample_width; /* MCU width in samples, MCU_width*DCT_scaled_size */
+ int last_col_width; /* # of non-dummy blocks across in last MCU */
+ int last_row_height; /* # of non-dummy blocks down in last MCU */
+
+ /* Saved quantization table for component; NULL if none yet saved.
+ * See jdinput.c comments about the need for this information.
+ * This field is currently used only for decompression.
+ */
+ JQUANT_TBL * quant_table;
+
+ /* Private per-component storage for DCT or IDCT subsystem. */
+ void * dct_table;
+} jpeg_component_info;
+
+
+/* The script for encoding a multiple-scan file is an array of these: */
+
+typedef struct {
+ int comps_in_scan; /* number of components encoded in this scan */
+ int component_index[MAX_COMPS_IN_SCAN]; /* their SOF/comp_info[] indexes */
+ int Ss, Se; /* progressive JPEG spectral selection parms */
+ int Ah, Al; /* progressive JPEG successive approx. parms */
+} jpeg_scan_info;
+
+/* The decompressor can save APPn and COM markers in a list of these: */
+
+typedef struct jpeg_marker_struct * jpeg_saved_marker_ptr;
+
+struct jpeg_marker_struct {
+ jpeg_saved_marker_ptr next; /* next in list, or NULL */
+ UINT8 marker; /* marker code: JPEG_COM, or JPEG_APP0+n */
+ unsigned int original_length; /* # bytes of data in the file */
+ unsigned int data_length; /* # bytes of data saved at data[] */
+ JOCTET * data; /* the data contained in the marker */
+ /* the marker length word is not counted in data_length or original_length */
+};
+
+/* Known color spaces. */
+
+typedef enum {
+ JCS_UNKNOWN, /* error/unspecified */
+ JCS_GRAYSCALE, /* monochrome */
+ JCS_RGB, /* red/green/blue */
+ JCS_YCbCr, /* Y/Cb/Cr (also known as YUV) */
+ JCS_CMYK, /* C/M/Y/K */
+ JCS_YCCK /* Y/Cb/Cr/K */
+} J_COLOR_SPACE;
+
+/* DCT/IDCT algorithm options. */
+
+typedef enum {
+ JDCT_ISLOW, /* slow but accurate integer algorithm */
+ JDCT_IFAST, /* faster, less accurate integer method */
+ JDCT_FLOAT /* floating-point: accurate, fast on fast HW */
+} J_DCT_METHOD;
+
+#ifndef JDCT_DEFAULT /* may be overridden in jconfig.h */
+#define JDCT_DEFAULT JDCT_ISLOW
+#endif
+#ifndef JDCT_FASTEST /* may be overridden in jconfig.h */
+#define JDCT_FASTEST JDCT_IFAST
+#endif
+
+/* Dithering options for decompression. */
+
+typedef enum {
+ JDITHER_NONE, /* no dithering */
+ JDITHER_ORDERED, /* simple ordered dither */
+ JDITHER_FS /* Floyd-Steinberg error diffusion dither */
+} J_DITHER_MODE;
+
+
+/* Common fields between JPEG compression and decompression master structs. */
+
+#define jpeg_common_fields \
+ struct jpeg_error_mgr * err; /* Error handler module */\
+ struct jpeg_memory_mgr * mem; /* Memory manager module */\
+ struct jpeg_progress_mgr * progress; /* Progress monitor, or NULL if none */\
+ void * client_data; /* Available for use by application */\
+ boolean is_decompressor; /* So common code can tell which is which */\
+ int global_state /* For checking call sequence validity */
+
+/* Routines that are to be used by both halves of the library are declared
+ * to receive a pointer to this structure. There are no actual instances of
+ * jpeg_common_struct, only of jpeg_compress_struct and jpeg_decompress_struct.
+ */
+struct jpeg_common_struct {
+ jpeg_common_fields; /* Fields common to both master struct types */
+ /* Additional fields follow in an actual jpeg_compress_struct or
+ * jpeg_decompress_struct. All three structs must agree on these
+ * initial fields! (This would be a lot cleaner in C++.)
+ */
+};
+
+typedef struct jpeg_common_struct * j_common_ptr;
+typedef struct jpeg_compress_struct * j_compress_ptr;
+typedef struct jpeg_decompress_struct * j_decompress_ptr;
+
+
+/* Master record for a compression instance */
+
+struct jpeg_compress_struct {
+ jpeg_common_fields; /* Fields shared with jpeg_decompress_struct */
+
+ /* Destination for compressed data */
+ struct jpeg_destination_mgr * dest;
+
+ /* Description of source image --- these fields must be filled in by
+ * outer application before starting compression. in_color_space must
+ * be correct before you can even call jpeg_set_defaults().
+ */
+
+ JDIMENSION image_width; /* input image width */
+ JDIMENSION image_height; /* input image height */
+ int input_components; /* # of color components in input image */
+ J_COLOR_SPACE in_color_space; /* colorspace of input image */
+
+ double input_gamma; /* image gamma of input image */
+
+ /* Compression parameters --- these fields must be set before calling
+ * jpeg_start_compress(). We recommend calling jpeg_set_defaults() to
+ * initialize everything to reasonable defaults, then changing anything
+ * the application specifically wants to change. That way you won't get
+ * burnt when new parameters are added. Also note that there are several
+ * helper routines to simplify changing parameters.
+ */
+
+ int data_precision; /* bits of precision in image data */
+
+ int num_components; /* # of color components in JPEG image */
+ J_COLOR_SPACE jpeg_color_space; /* colorspace of JPEG image */
+
+ jpeg_component_info * comp_info;
+ /* comp_info[i] describes component that appears i'th in SOF */
+
+ JQUANT_TBL * quant_tbl_ptrs[NUM_QUANT_TBLS];
+ /* ptrs to coefficient quantization tables, or NULL if not defined */
+
+ JHUFF_TBL * dc_huff_tbl_ptrs[NUM_HUFF_TBLS];
+ JHUFF_TBL * ac_huff_tbl_ptrs[NUM_HUFF_TBLS];
+ /* ptrs to Huffman coding tables, or NULL if not defined */
+
+ UINT8 arith_dc_L[NUM_ARITH_TBLS]; /* L values for DC arith-coding tables */
+ UINT8 arith_dc_U[NUM_ARITH_TBLS]; /* U values for DC arith-coding tables */
+ UINT8 arith_ac_K[NUM_ARITH_TBLS]; /* Kx values for AC arith-coding tables */
+
+ int num_scans; /* # of entries in scan_info array */
+ const jpeg_scan_info * scan_info; /* script for multi-scan file, or NULL */
+ /* The default value of scan_info is NULL, which causes a single-scan
+ * sequential JPEG file to be emitted. To create a multi-scan file,
+ * set num_scans and scan_info to point to an array of scan definitions.
+ */
+
+ boolean raw_data_in; /* TRUE=caller supplies downsampled data */
+ boolean arith_code; /* TRUE=arithmetic coding, FALSE=Huffman */
+ boolean optimize_coding; /* TRUE=optimize entropy encoding parms */
+ boolean CCIR601_sampling; /* TRUE=first samples are cosited */
+ int smoothing_factor; /* 1..100, or 0 for no input smoothing */
+ J_DCT_METHOD dct_method; /* DCT algorithm selector */
+
+ /* The restart interval can be specified in absolute MCUs by setting
+ * restart_interval, or in MCU rows by setting restart_in_rows
+ * (in which case the correct restart_interval will be figured
+ * for each scan).
+ */
+ unsigned int restart_interval; /* MCUs per restart, or 0 for no restart */
+ int restart_in_rows; /* if > 0, MCU rows per restart interval */
+
+ /* Parameters controlling emission of special markers. */
+
+ boolean write_JFIF_header; /* should a JFIF marker be written? */
+ UINT8 JFIF_major_version; /* What to write for the JFIF version number */
+ UINT8 JFIF_minor_version;
+ /* These three values are not used by the JPEG code, merely copied */
+ /* into the JFIF APP0 marker. density_unit can be 0 for unknown, */
+ /* 1 for dots/inch, or 2 for dots/cm. Note that the pixel aspect */
+ /* ratio is defined by X_density/Y_density even when density_unit=0. */
+ UINT8 density_unit; /* JFIF code for pixel size units */
+ UINT16 X_density; /* Horizontal pixel density */
+ UINT16 Y_density; /* Vertical pixel density */
+ boolean write_Adobe_marker; /* should an Adobe marker be written? */
+
+ /* State variable: index of next scanline to be written to
+ * jpeg_write_scanlines(). Application may use this to control its
+ * processing loop, e.g., "while (next_scanline < image_height)".
+ */
+
+ JDIMENSION next_scanline; /* 0 .. image_height-1 */
+
+ /* Remaining fields are known throughout compressor, but generally
+ * should not be touched by a surrounding application.
+ */
+
+ /*
+ * These fields are computed during compression startup
+ */
+ boolean progressive_mode; /* TRUE if scan script uses progressive mode */
+ int max_h_samp_factor; /* largest h_samp_factor */
+ int max_v_samp_factor; /* largest v_samp_factor */
+
+ JDIMENSION total_iMCU_rows; /* # of iMCU rows to be input to coef ctlr */
+ /* The coefficient controller receives data in units of MCU rows as defined
+ * for fully interleaved scans (whether the JPEG file is interleaved or not).
+ * There are v_samp_factor * DCTSIZE sample rows of each component in an
+ * "iMCU" (interleaved MCU) row.
+ */
+
+ /*
+ * These fields are valid during any one scan.
+ * They describe the components and MCUs actually appearing in the scan.
+ */
+ int comps_in_scan; /* # of JPEG components in this scan */
+ jpeg_component_info * cur_comp_info[MAX_COMPS_IN_SCAN];
+ /* *cur_comp_info[i] describes component that appears i'th in SOS */
+
+ JDIMENSION MCUs_per_row; /* # of MCUs across the image */
+ JDIMENSION MCU_rows_in_scan; /* # of MCU rows in the image */
+
+ int blocks_in_MCU; /* # of DCT blocks per MCU */
+ int MCU_membership[C_MAX_BLOCKS_IN_MCU];
+ /* MCU_membership[i] is index in cur_comp_info of component owning */
+ /* i'th block in an MCU */
+
+ int Ss, Se, Ah, Al; /* progressive JPEG parameters for scan */
+
+ /*
+ * Links to compression subobjects (methods and private variables of modules)
+ */
+ struct jpeg_comp_master * master;
+ struct jpeg_c_main_controller * main;
+ struct jpeg_c_prep_controller * prep;
+ struct jpeg_c_coef_controller * coef;
+ struct jpeg_marker_writer * marker;
+ struct jpeg_color_converter * cconvert;
+ struct jpeg_downsampler * downsample;
+ struct jpeg_forward_dct * fdct;
+ struct jpeg_entropy_encoder * entropy;
+ jpeg_scan_info * script_space; /* workspace for jpeg_simple_progression */
+ int script_space_size;
+};
+
+
+/* Master record for a decompression instance */
+
+struct jpeg_decompress_struct {
+ jpeg_common_fields; /* Fields shared with jpeg_compress_struct */
+
+ /* Source of compressed data */
+ struct jpeg_source_mgr * src;
+
+ /* Basic description of image --- filled in by jpeg_read_header(). */
+ /* Application may inspect these values to decide how to process image. */
+
+ JDIMENSION image_width; /* nominal image width (from SOF marker) */
+ JDIMENSION image_height; /* nominal image height */
+ int num_components; /* # of color components in JPEG image */
+ J_COLOR_SPACE jpeg_color_space; /* colorspace of JPEG image */
+
+ /* Decompression processing parameters --- these fields must be set before
+ * calling jpeg_start_decompress(). Note that jpeg_read_header() initializes
+ * them to default values.
+ */
+
+ J_COLOR_SPACE out_color_space; /* colorspace for output */
+
+ unsigned int scale_num, scale_denom; /* fraction by which to scale image */
+
+ double output_gamma; /* image gamma wanted in output */
+
+ boolean buffered_image; /* TRUE=multiple output passes */
+ boolean raw_data_out; /* TRUE=downsampled data wanted */
+
+ J_DCT_METHOD dct_method; /* IDCT algorithm selector */
+ boolean do_fancy_upsampling; /* TRUE=apply fancy upsampling */
+ boolean do_block_smoothing; /* TRUE=apply interblock smoothing */
+
+ boolean quantize_colors; /* TRUE=colormapped output wanted */
+ /* the following are ignored if not quantize_colors: */
+ J_DITHER_MODE dither_mode; /* type of color dithering to use */
+ boolean two_pass_quantize; /* TRUE=use two-pass color quantization */
+ int desired_number_of_colors; /* max # colors to use in created colormap */
+ /* these are significant only in buffered-image mode: */
+ boolean enable_1pass_quant; /* enable future use of 1-pass quantizer */
+ boolean enable_external_quant;/* enable future use of external colormap */
+ boolean enable_2pass_quant; /* enable future use of 2-pass quantizer */
+
+ /* Description of actual output image that will be returned to application.
+ * These fields are computed by jpeg_start_decompress().
+ * You can also use jpeg_calc_output_dimensions() to determine these values
+ * in advance of calling jpeg_start_decompress().
+ */
+
+ JDIMENSION output_width; /* scaled image width */
+ JDIMENSION output_height; /* scaled image height */
+ int out_color_components; /* # of color components in out_color_space */
+ int output_components; /* # of color components returned */
+ /* output_components is 1 (a colormap index) when quantizing colors;
+ * otherwise it equals out_color_components.
+ */
+ int rec_outbuf_height; /* min recommended height of scanline buffer */
+ /* If the buffer passed to jpeg_read_scanlines() is less than this many rows
+ * high, space and time will be wasted due to unnecessary data copying.
+ * Usually rec_outbuf_height will be 1 or 2, at most 4.
+ */
+
+ /* When quantizing colors, the output colormap is described by these fields.
+ * The application can supply a colormap by setting colormap non-NULL before
+ * calling jpeg_start_decompress; otherwise a colormap is created during
+ * jpeg_start_decompress or jpeg_start_output.
+ * The map has out_color_components rows and actual_number_of_colors columns.
+ */
+ int actual_number_of_colors; /* number of entries in use */
+ JSAMPARRAY colormap; /* The color map as a 2-D pixel array */
+
+ /* State variables: these variables indicate the progress of decompression.
+ * The application may examine these but must not modify them.
+ */
+
+ /* Row index of next scanline to be read from jpeg_read_scanlines().
+ * Application may use this to control its processing loop, e.g.,
+ * "while (output_scanline < output_height)".
+ */
+ JDIMENSION output_scanline; /* 0 .. output_height-1 */
+
+ /* Current input scan number and number of iMCU rows completed in scan.
+ * These indicate the progress of the decompressor input side.
+ */
+ int input_scan_number; /* Number of SOS markers seen so far */
+ JDIMENSION input_iMCU_row; /* Number of iMCU rows completed */
+
+ /* The "output scan number" is the notional scan being displayed by the
+ * output side. The decompressor will not allow output scan/row number
+ * to get ahead of input scan/row, but it can fall arbitrarily far behind.
+ */
+ int output_scan_number; /* Nominal scan number being displayed */
+ JDIMENSION output_iMCU_row; /* Number of iMCU rows read */
+
+ /* Current progression status. coef_bits[c][i] indicates the precision
+ * with which component c's DCT coefficient i (in zigzag order) is known.
+ * It is -1 when no data has yet been received, otherwise it is the point
+ * transform (shift) value for the most recent scan of the coefficient
+ * (thus, 0 at completion of the progression).
+ * This pointer is NULL when reading a non-progressive file.
+ */
+ int (*coef_bits)[DCTSIZE2]; /* -1 or current Al value for each coef */
+
+ /* Internal JPEG parameters --- the application usually need not look at
+ * these fields. Note that the decompressor output side may not use
+ * any parameters that can change between scans.
+ */
+
+ /* Quantization and Huffman tables are carried forward across input
+ * datastreams when processing abbreviated JPEG datastreams.
+ */
+
+ JQUANT_TBL * quant_tbl_ptrs[NUM_QUANT_TBLS];
+ /* ptrs to coefficient quantization tables, or NULL if not defined */
+
+ JHUFF_TBL * dc_huff_tbl_ptrs[NUM_HUFF_TBLS];
+ JHUFF_TBL * ac_huff_tbl_ptrs[NUM_HUFF_TBLS];
+ /* ptrs to Huffman coding tables, or NULL if not defined */
+
+ /* These parameters are never carried across datastreams, since they
+ * are given in SOF/SOS markers or defined to be reset by SOI.
+ */
+
+ int data_precision; /* bits of precision in image data */
+
+ jpeg_component_info * comp_info;
+ /* comp_info[i] describes component that appears i'th in SOF */
+
+ boolean progressive_mode; /* TRUE if SOFn specifies progressive mode */
+ boolean arith_code; /* TRUE=arithmetic coding, FALSE=Huffman */
+
+ UINT8 arith_dc_L[NUM_ARITH_TBLS]; /* L values for DC arith-coding tables */
+ UINT8 arith_dc_U[NUM_ARITH_TBLS]; /* U values for DC arith-coding tables */
+ UINT8 arith_ac_K[NUM_ARITH_TBLS]; /* Kx values for AC arith-coding tables */
+
+ unsigned int restart_interval; /* MCUs per restart interval, or 0 for no restart */
+
+ /* These fields record data obtained from optional markers recognized by
+ * the JPEG library.
+ */
+ boolean saw_JFIF_marker; /* TRUE iff a JFIF APP0 marker was found */
+ /* Data copied from JFIF marker; only valid if saw_JFIF_marker is TRUE: */
+ UINT8 JFIF_major_version; /* JFIF version number */
+ UINT8 JFIF_minor_version;
+ UINT8 density_unit; /* JFIF code for pixel size units */
+ UINT16 X_density; /* Horizontal pixel density */
+ UINT16 Y_density; /* Vertical pixel density */
+ boolean saw_Adobe_marker; /* TRUE iff an Adobe APP14 marker was found */
+ UINT8 Adobe_transform; /* Color transform code from Adobe marker */
+
+ boolean CCIR601_sampling; /* TRUE=first samples are cosited */
+
+ /* Aside from the specific data retained from APPn markers known to the
+ * library, the uninterpreted contents of any or all APPn and COM markers
+ * can be saved in a list for examination by the application.
+ */
+ jpeg_saved_marker_ptr marker_list; /* Head of list of saved markers */
+
+ /* Remaining fields are known throughout decompressor, but generally
+ * should not be touched by a surrounding application.
+ */
+
+ /*
+ * These fields are computed during decompression startup
+ */
+ int max_h_samp_factor; /* largest h_samp_factor */
+ int max_v_samp_factor; /* largest v_samp_factor */
+
+ int min_DCT_scaled_size; /* smallest DCT_scaled_size of any component */
+
+ JDIMENSION total_iMCU_rows; /* # of iMCU rows in image */
+ /* The coefficient controller's input and output progress is measured in
+ * units of "iMCU" (interleaved MCU) rows. These are the same as MCU rows
+ * in fully interleaved JPEG scans, but are used whether the scan is
+ * interleaved or not. We define an iMCU row as v_samp_factor DCT block
+ * rows of each component. Therefore, the IDCT output contains
+ * v_samp_factor*DCT_scaled_size sample rows of a component per iMCU row.
+ */
+
+ JSAMPLE * sample_range_limit; /* table for fast range-limiting */
+
+ /*
+ * These fields are valid during any one scan.
+ * They describe the components and MCUs actually appearing in the scan.
+ * Note that the decompressor output side must not use these fields.
+ */
+ int comps_in_scan; /* # of JPEG components in this scan */
+ jpeg_component_info * cur_comp_info[MAX_COMPS_IN_SCAN];
+ /* *cur_comp_info[i] describes component that appears i'th in SOS */
+
+ JDIMENSION MCUs_per_row; /* # of MCUs across the image */
+ JDIMENSION MCU_rows_in_scan; /* # of MCU rows in the image */
+
+ int blocks_in_MCU; /* # of DCT blocks per MCU */
+ int MCU_membership[D_MAX_BLOCKS_IN_MCU];
+ /* MCU_membership[i] is index in cur_comp_info of component owning */
+ /* i'th block in an MCU */
+
+ int Ss, Se, Ah, Al; /* progressive JPEG parameters for scan */
+
+ /* This field is shared between entropy decoder and marker parser.
+ * It is either zero or the code of a JPEG marker that has been
+ * read from the data source, but has not yet been processed.
+ */
+ int unread_marker;
+
+ /*
+ * Links to decompression subobjects (methods, private variables of modules)
+ */
+ struct jpeg_decomp_master * master;
+ struct jpeg_d_main_controller * main;
+ struct jpeg_d_coef_controller * coef;
+ struct jpeg_d_post_controller * post;
+ struct jpeg_input_controller * inputctl;
+ struct jpeg_marker_reader * marker;
+ struct jpeg_entropy_decoder * entropy;
+ struct jpeg_inverse_dct * idct;
+ struct jpeg_upsampler * upsample;
+ struct jpeg_color_deconverter * cconvert;
+ struct jpeg_color_quantizer * cquantize;
+};
+
+
+/* "Object" declarations for JPEG modules that may be supplied or called
+ * directly by the surrounding application.
+ * As with all objects in the JPEG library, these structs only define the
+ * publicly visible methods and state variables of a module. Additional
+ * private fields may exist after the public ones.
+ */
+
+
+/* Error handler object */
+
+struct jpeg_error_mgr {
+ /* Error exit handler: does not return to caller */
+ JMETHOD(void, error_exit, (j_common_ptr cinfo));
+ /* Conditionally emit a trace or warning message */
+ JMETHOD(void, emit_message, (j_common_ptr cinfo, int msg_level));
+ /* Routine that actually outputs a trace or error message */
+ JMETHOD(void, output_message, (j_common_ptr cinfo));
+ /* Format a message string for the most recent JPEG error or message */
+ JMETHOD(void, format_message, (j_common_ptr cinfo, char * buffer));
+#define JMSG_LENGTH_MAX 200 /* recommended size of format_message buffer */
+ /* Reset error state variables at start of a new image */
+ JMETHOD(void, reset_error_mgr, (j_common_ptr cinfo));
+
+ /* The message ID code and any parameters are saved here.
+ * A message can have one string parameter or up to 8 int parameters.
+ */
+ int msg_code;
+#define JMSG_STR_PARM_MAX 80
+ union {
+ int i[8];
+ char s[JMSG_STR_PARM_MAX];
+ } msg_parm;
+
+ /* Standard state variables for error facility */
+
+ int trace_level; /* max msg_level that will be displayed */
+
+ /* For recoverable corrupt-data errors, we emit a warning message,
+ * but keep going unless emit_message chooses to abort. emit_message
+ * should count warnings in num_warnings. The surrounding application
+ * can check for bad data by seeing if num_warnings is nonzero at the
+ * end of processing.
+ */
+ long num_warnings; /* number of corrupt-data warnings */
+
+ /* These fields point to the table(s) of error message strings.
+ * An application can change the table pointer to switch to a different
+ * message list (typically, to change the language in which errors are
+ * reported). Some applications may wish to add additional error codes
+ * that will be handled by the JPEG library error mechanism; the second
+ * table pointer is used for this purpose.
+ *
+ * First table includes all errors generated by JPEG library itself.
+ * Error code 0 is reserved for a "no such error string" message.
+ */
+ const char * const * jpeg_message_table; /* Library errors */
+ int last_jpeg_message; /* Table contains strings 0..last_jpeg_message */
+ /* Second table can be added by application (see cjpeg/djpeg for example).
+ * It contains strings numbered first_addon_message..last_addon_message.
+ */
+ const char * const * addon_message_table; /* Non-library errors */
+ int first_addon_message; /* code for first string in addon table */
+ int last_addon_message; /* code for last string in addon table */
+};
+
+
+/* Progress monitor object */
+
+struct jpeg_progress_mgr {
+ JMETHOD(void, progress_monitor, (j_common_ptr cinfo));
+
+ long pass_counter; /* work units completed in this pass */
+ long pass_limit; /* total number of work units in this pass */
+ int completed_passes; /* passes completed so far */
+ int total_passes; /* total number of passes expected */
+};
+
+
+/* Data destination object for compression */
+
+struct jpeg_destination_mgr {
+ JOCTET * next_output_byte; /* => next byte to write in buffer */
+ size_t free_in_buffer; /* # of byte spaces remaining in buffer */
+
+ JMETHOD(void, init_destination, (j_compress_ptr cinfo));
+ JMETHOD(boolean, empty_output_buffer, (j_compress_ptr cinfo));
+ JMETHOD(void, term_destination, (j_compress_ptr cinfo));
+};
+
+
+/* Data source object for decompression */
+
+struct jpeg_source_mgr {
+ const JOCTET * next_input_byte; /* => next byte to read from buffer */
+ size_t bytes_in_buffer; /* # of bytes remaining in buffer */
+
+ JMETHOD(void, init_source, (j_decompress_ptr cinfo));
+ JMETHOD(boolean, fill_input_buffer, (j_decompress_ptr cinfo));
+ JMETHOD(void, skip_input_data, (j_decompress_ptr cinfo, long num_bytes));
+ JMETHOD(boolean, resync_to_restart, (j_decompress_ptr cinfo, int desired));
+ JMETHOD(void, term_source, (j_decompress_ptr cinfo));
+};
+
+
+/* Memory manager object.
+ * Allocates "small" objects (a few K total), "large" objects (tens of K),
+ * and "really big" objects (virtual arrays with backing store if needed).
+ * The memory manager does not allow individual objects to be freed; rather,
+ * each created object is assigned to a pool, and whole pools can be freed
+ * at once. This is faster and more convenient than remembering exactly what
+ * to free, especially where malloc()/free() are not too speedy.
+ * NB: alloc routines never return NULL. They exit to error_exit if not
+ * successful.
+ */
+
+#define JPOOL_PERMANENT 0 /* lasts until master record is destroyed */
+#define JPOOL_IMAGE 1 /* lasts until done with image/datastream */
+#define JPOOL_NUMPOOLS 2
+
+typedef struct jvirt_sarray_control * jvirt_sarray_ptr;
+typedef struct jvirt_barray_control * jvirt_barray_ptr;
+
+
+struct jpeg_memory_mgr {
+ /* Method pointers */
+ JMETHOD(void *, alloc_small, (j_common_ptr cinfo, int pool_id,
+ size_t sizeofobject));
+ JMETHOD(void *, alloc_large, (j_common_ptr cinfo, int pool_id,
+ size_t sizeofobject));
+ JMETHOD(JSAMPARRAY, alloc_sarray, (j_common_ptr cinfo, int pool_id,
+ JDIMENSION samplesperrow,
+ JDIMENSION numrows));
+ JMETHOD(JBLOCKARRAY, alloc_barray, (j_common_ptr cinfo, int pool_id,
+ JDIMENSION blocksperrow,
+ JDIMENSION numrows));
+ JMETHOD(jvirt_sarray_ptr, request_virt_sarray, (j_common_ptr cinfo,
+ int pool_id,
+ boolean pre_zero,
+ JDIMENSION samplesperrow,
+ JDIMENSION numrows,
+ JDIMENSION maxaccess));
+ JMETHOD(jvirt_barray_ptr, request_virt_barray, (j_common_ptr cinfo,
+ int pool_id,
+ boolean pre_zero,
+ JDIMENSION blocksperrow,
+ JDIMENSION numrows,
+ JDIMENSION maxaccess));
+ JMETHOD(void, realize_virt_arrays, (j_common_ptr cinfo));
+ JMETHOD(JSAMPARRAY, access_virt_sarray, (j_common_ptr cinfo,
+ jvirt_sarray_ptr ptr,
+ JDIMENSION start_row,
+ JDIMENSION num_rows,
+ boolean writable));
+ JMETHOD(JBLOCKARRAY, access_virt_barray, (j_common_ptr cinfo,
+ jvirt_barray_ptr ptr,
+ JDIMENSION start_row,
+ JDIMENSION num_rows,
+ boolean writable));
+ JMETHOD(void, free_pool, (j_common_ptr cinfo, int pool_id));
+ JMETHOD(void, self_destruct, (j_common_ptr cinfo));
+
+ /* Limit on memory allocation for this JPEG object. (Note that this is
+ * merely advisory, not a guaranteed maximum; it only affects the space
+ * used for virtual-array buffers.) May be changed by outer application
+ * after creating the JPEG object.
+ */
+ long max_memory_to_use;
+
+ /* Maximum allocation request accepted by alloc_large. */
+ long max_alloc_chunk;
+};
+
+
+/* Routine signature for application-supplied marker processing methods.
+ * Need not pass marker code since it is stored in cinfo->unread_marker.
+ */
+typedef JMETHOD(boolean, jpeg_marker_parser_method, (j_decompress_ptr cinfo));
+
+
+/* Declarations for routines called by application.
+ * The JPP macro hides prototype parameters from compilers that can't cope.
+ * Note JPP requires double parentheses.
+ */
+
+#ifdef HAVE_PROTOTYPES
+#define JPP(arglist) arglist
+#else
+#define JPP(arglist) ()
+#endif
+
+
+/* Short forms of external names for systems with brain-damaged linkers.
+ * We shorten external names to be unique in the first six letters, which
+ * is good enough for all known systems.
+ * (If your compiler itself needs names to be unique in less than 15
+ * characters, you are out of luck. Get a better compiler.)
+ */
+
+#ifdef NEED_SHORT_EXTERNAL_NAMES
+#define jpeg_std_error jStdError
+#define jpeg_CreateCompress jCreaCompress
+#define jpeg_CreateDecompress jCreaDecompress
+#define jpeg_destroy_compress jDestCompress
+#define jpeg_destroy_decompress jDestDecompress
+#define jpeg_stdio_dest jStdDest
+#define jpeg_stdio_src jStdSrc
+#define jpeg_set_defaults jSetDefaults
+#define jpeg_set_colorspace jSetColorspace
+#define jpeg_default_colorspace jDefColorspace
+#define jpeg_set_quality jSetQuality
+#define jpeg_set_linear_quality jSetLQuality
+#define jpeg_add_quant_table jAddQuantTable
+#define jpeg_quality_scaling jQualityScaling
+#define jpeg_simple_progression jSimProgress
+#define jpeg_suppress_tables jSuppressTables
+#define jpeg_alloc_quant_table jAlcQTable
+#define jpeg_alloc_huff_table jAlcHTable
+#define jpeg_start_compress jStrtCompress
+#define jpeg_write_scanlines jWrtScanlines
+#define jpeg_finish_compress jFinCompress
+#define jpeg_write_raw_data jWrtRawData
+#define jpeg_write_marker jWrtMarker
+#define jpeg_write_m_header jWrtMHeader
+#define jpeg_write_m_byte jWrtMByte
+#define jpeg_write_tables jWrtTables
+#define jpeg_read_header jReadHeader
+#define jpeg_start_decompress jStrtDecompress
+#define jpeg_read_scanlines jReadScanlines
+#define jpeg_finish_decompress jFinDecompress
+#define jpeg_read_raw_data jReadRawData
+#define jpeg_has_multiple_scans jHasMultScn
+#define jpeg_start_output jStrtOutput
+#define jpeg_finish_output jFinOutput
+#define jpeg_input_complete jInComplete
+#define jpeg_new_colormap jNewCMap
+#define jpeg_consume_input jConsumeInput
+#define jpeg_calc_output_dimensions jCalcDimensions
+#define jpeg_save_markers jSaveMarkers
+#define jpeg_set_marker_processor jSetMarker
+#define jpeg_read_coefficients jReadCoefs
+#define jpeg_write_coefficients jWrtCoefs
+#define jpeg_copy_critical_parameters jCopyCrit
+#define jpeg_abort_compress jAbrtCompress
+#define jpeg_abort_decompress jAbrtDecompress
+#define jpeg_abort jAbort
+#define jpeg_destroy jDestroy
+#define jpeg_resync_to_restart jResyncRestart
+#endif /* NEED_SHORT_EXTERNAL_NAMES */
+
+
+/* Default error-management setup */
+EXTERN(struct jpeg_error_mgr *) jpeg_std_error
+ JPP((struct jpeg_error_mgr * err));
+
+/* Initialization of JPEG compression objects.
+ * jpeg_create_compress() and jpeg_create_decompress() are the exported
+ * names that applications should call. These expand to calls on
+ * jpeg_CreateCompress and jpeg_CreateDecompress with additional information
+ * passed for version mismatch checking.
+ * NB: you must set up the error-manager BEFORE calling jpeg_create_xxx.
+ */
+#define jpeg_create_compress(cinfo) \
+ jpeg_CreateCompress((cinfo), JPEG_LIB_VERSION, \
+ (size_t) sizeof(struct jpeg_compress_struct))
+#define jpeg_create_decompress(cinfo) \
+ jpeg_CreateDecompress((cinfo), JPEG_LIB_VERSION, \
+ (size_t) sizeof(struct jpeg_decompress_struct))
+EXTERN(void) jpeg_CreateCompress JPP((j_compress_ptr cinfo,
+ int version, size_t structsize));
+EXTERN(void) jpeg_CreateDecompress JPP((j_decompress_ptr cinfo,
+ int version, size_t structsize));
+/* Destruction of JPEG compression objects */
+EXTERN(void) jpeg_destroy_compress JPP((j_compress_ptr cinfo));
+EXTERN(void) jpeg_destroy_decompress JPP((j_decompress_ptr cinfo));
+
+#if 0
+/* Standard data source and destination managers: stdio streams. */
+/* Caller is responsible for opening the file before and closing after. */
+EXTERN(void) jpeg_stdio_dest JPP((j_compress_ptr cinfo, FXSYS_FILE * outfile));
+EXTERN(void) jpeg_stdio_src JPP((j_decompress_ptr cinfo, FXSYS_FILE * infile));
+#endif
+
+/* Default parameter setup for compression */
+EXTERN(void) jpeg_set_defaults JPP((j_compress_ptr cinfo));
+/* Compression parameter setup aids */
+EXTERN(void) jpeg_set_colorspace JPP((j_compress_ptr cinfo,
+ J_COLOR_SPACE colorspace));
+EXTERN(void) jpeg_default_colorspace JPP((j_compress_ptr cinfo));
+EXTERN(void) jpeg_set_quality JPP((j_compress_ptr cinfo, int quality,
+ boolean force_baseline));
+EXTERN(void) jpeg_set_linear_quality JPP((j_compress_ptr cinfo,
+ int scale_factor,
+ boolean force_baseline));
+EXTERN(void) jpeg_add_quant_table JPP((j_compress_ptr cinfo, int which_tbl,
+ const unsigned int *basic_table,
+ int scale_factor,
+ boolean force_baseline));
+EXTERN(int) jpeg_quality_scaling JPP((int quality));
+EXTERN(void) jpeg_simple_progression JPP((j_compress_ptr cinfo));
+EXTERN(void) jpeg_suppress_tables JPP((j_compress_ptr cinfo,
+ boolean suppress));
+EXTERN(JQUANT_TBL *) jpeg_alloc_quant_table JPP((j_common_ptr cinfo));
+EXTERN(JHUFF_TBL *) jpeg_alloc_huff_table JPP((j_common_ptr cinfo));
+
+/* Main entry points for compression */
+EXTERN(void) jpeg_start_compress JPP((j_compress_ptr cinfo,
+ boolean write_all_tables));
+EXTERN(JDIMENSION) jpeg_write_scanlines JPP((j_compress_ptr cinfo,
+ JSAMPARRAY scanlines,
+ JDIMENSION num_lines));
+EXTERN(void) jpeg_finish_compress JPP((j_compress_ptr cinfo));
+
+/* Replaces jpeg_write_scanlines when writing raw downsampled data. */
+EXTERN(JDIMENSION) jpeg_write_raw_data JPP((j_compress_ptr cinfo,
+ JSAMPIMAGE data,
+ JDIMENSION num_lines));
+
+/* Write a special marker. See libjpeg.doc concerning safe usage. */
+EXTERN(void) jpeg_write_marker
+ JPP((j_compress_ptr cinfo, int marker,
+ const JOCTET * dataptr, unsigned int datalen));
+/* Same, but piecemeal. */
+EXTERN(void) jpeg_write_m_header
+ JPP((j_compress_ptr cinfo, int marker, unsigned int datalen));
+EXTERN(void) jpeg_write_m_byte
+ JPP((j_compress_ptr cinfo, int val));
+
+/* Alternate compression function: just write an abbreviated table file */
+EXTERN(void) jpeg_write_tables JPP((j_compress_ptr cinfo));
+
+/* Decompression startup: read start of JPEG datastream to see what's there */
+EXTERN(int) jpeg_read_header JPP((j_decompress_ptr cinfo,
+ boolean require_image));
+/* Return value is one of: */
+#define JPEG_SUSPENDED 0 /* Suspended due to lack of input data */
+#define JPEG_HEADER_OK 1 /* Found valid image datastream */
+#define JPEG_HEADER_TABLES_ONLY 2 /* Found valid table-specs-only datastream */
+/* If you pass require_image = TRUE (normal case), you need not check for
+ * a TABLES_ONLY return code; an abbreviated file will cause an error exit.
+ * JPEG_SUSPENDED is only possible if you use a data source module that can
+ * give a suspension return (the stdio source module doesn't).
+ */
+
+/* Main entry points for decompression */
+EXTERN(boolean) jpeg_start_decompress JPP((j_decompress_ptr cinfo));
+EXTERN(JDIMENSION) jpeg_read_scanlines JPP((j_decompress_ptr cinfo,
+ JSAMPARRAY scanlines,
+ JDIMENSION max_lines));
+EXTERN(boolean) jpeg_finish_decompress JPP((j_decompress_ptr cinfo));
+
+/* Replaces jpeg_read_scanlines when reading raw downsampled data. */
+EXTERN(JDIMENSION) jpeg_read_raw_data JPP((j_decompress_ptr cinfo,
+ JSAMPIMAGE data,
+ JDIMENSION max_lines));
+
+/* Additional entry points for buffered-image mode. */
+EXTERN(boolean) jpeg_has_multiple_scans JPP((j_decompress_ptr cinfo));
+EXTERN(boolean) jpeg_start_output JPP((j_decompress_ptr cinfo,
+ int scan_number));
+EXTERN(boolean) jpeg_finish_output JPP((j_decompress_ptr cinfo));
+EXTERN(boolean) jpeg_input_complete JPP((j_decompress_ptr cinfo));
+EXTERN(void) jpeg_new_colormap JPP((j_decompress_ptr cinfo));
+EXTERN(int) jpeg_consume_input JPP((j_decompress_ptr cinfo));
+/* Return value is one of: */
+/* #define JPEG_SUSPENDED 0 Suspended due to lack of input data */
+#define JPEG_REACHED_SOS 1 /* Reached start of new scan */
+#define JPEG_REACHED_EOI 2 /* Reached end of image */
+#define JPEG_ROW_COMPLETED 3 /* Completed one iMCU row */
+#define JPEG_SCAN_COMPLETED 4 /* Completed last iMCU row of a scan */
+
+/* Precalculate output dimensions for current decompression parameters. */
+EXTERN(void) jpeg_calc_output_dimensions JPP((j_decompress_ptr cinfo));
+
+/* Control saving of COM and APPn markers into marker_list. */
+EXTERN(void) jpeg_save_markers
+ JPP((j_decompress_ptr cinfo, int marker_code,
+ unsigned int length_limit));
+
+/* Install a special processing method for COM or APPn markers. */
+EXTERN(void) jpeg_set_marker_processor
+ JPP((j_decompress_ptr cinfo, int marker_code,
+ jpeg_marker_parser_method routine));
+
+/* Read or write raw DCT coefficients --- useful for lossless transcoding. */
+EXTERN(jvirt_barray_ptr *) jpeg_read_coefficients JPP((j_decompress_ptr cinfo));
+EXTERN(void) jpeg_write_coefficients JPP((j_compress_ptr cinfo,
+ jvirt_barray_ptr * coef_arrays));
+EXTERN(void) jpeg_copy_critical_parameters JPP((j_decompress_ptr srcinfo,
+ j_compress_ptr dstinfo));
+
+/* If you choose to abort compression or decompression before completing
+ * jpeg_finish_(de)compress, then you need to clean up to release memory,
+ * temporary files, etc. You can just call jpeg_destroy_(de)compress
+ * if you're done with the JPEG object, but if you want to clean it up and
+ * reuse it, call this:
+ */
+EXTERN(void) jpeg_abort_compress JPP((j_compress_ptr cinfo));
+EXTERN(void) jpeg_abort_decompress JPP((j_decompress_ptr cinfo));
+
+/* Generic versions of jpeg_abort and jpeg_destroy that work on either
+ * flavor of JPEG object. These may be more convenient in some places.
+ */
+EXTERN(void) jpeg_abort JPP((j_common_ptr cinfo));
+EXTERN(void) jpeg_destroy JPP((j_common_ptr cinfo));
+
+/* Default restart-marker-resync procedure for use by data source modules */
+EXTERN(boolean) jpeg_resync_to_restart JPP((j_decompress_ptr cinfo,
+ int desired));
+
+
+/* These marker codes are exported since applications and data source modules
+ * are likely to want to use them.
+ */
+
+#define JPEG_RST0 0xD0 /* RST0 marker code */
+#define JPEG_EOI 0xD9 /* EOI marker code */
+#define JPEG_APP0 0xE0 /* APP0 marker code */
+#define JPEG_COM 0xFE /* COM marker code */
+
+
+/* If we have a brain-damaged compiler that emits warnings (or worse, errors)
+ * for structure definitions that are never filled in, keep it quiet by
+ * supplying dummy definitions for the various substructures.
+ */
+
+#ifdef INCOMPLETE_TYPES_BROKEN
+#ifndef JPEG_INTERNALS /* will be defined in jpegint.h */
+struct jvirt_sarray_control { long dummy; };
+struct jvirt_barray_control { long dummy; };
+struct jpeg_comp_master { long dummy; };
+struct jpeg_c_main_controller { long dummy; };
+struct jpeg_c_prep_controller { long dummy; };
+struct jpeg_c_coef_controller { long dummy; };
+struct jpeg_marker_writer { long dummy; };
+struct jpeg_color_converter { long dummy; };
+struct jpeg_downsampler { long dummy; };
+struct jpeg_forward_dct { long dummy; };
+struct jpeg_entropy_encoder { long dummy; };
+struct jpeg_decomp_master { long dummy; };
+struct jpeg_d_main_controller { long dummy; };
+struct jpeg_d_coef_controller { long dummy; };
+struct jpeg_d_post_controller { long dummy; };
+struct jpeg_input_controller { long dummy; };
+struct jpeg_marker_reader { long dummy; };
+struct jpeg_entropy_decoder { long dummy; };
+struct jpeg_inverse_dct { long dummy; };
+struct jpeg_upsampler { long dummy; };
+struct jpeg_color_deconverter { long dummy; };
+struct jpeg_color_quantizer { long dummy; };
+#endif /* JPEG_INTERNALS */
+#endif /* INCOMPLETE_TYPES_BROKEN */
+
+
+/*
+ * The JPEG library modules define JPEG_INTERNALS before including this file.
+ * The internal structure declarations are read only when that is true.
+ * Applications using the library should not include jpegint.h, but may wish
+ * to include jerror.h.
+ */
+
+#ifdef JPEG_INTERNALS
+#include "jpegint.h" /* fetch private declarations */
+#include "jerror.h" /* fetch error codes too */
+#endif
+
+#endif /* JPEGLIB_H */
diff --git a/core/src/fxcodec/libjpeg/jversion.h b/core/src/fxcodec/libjpeg/jversion.h
index dadd453a41..6472c58d35 100644
--- a/core/src/fxcodec/libjpeg/jversion.h
+++ b/core/src/fxcodec/libjpeg/jversion.h
@@ -1,14 +1,14 @@
-/*
- * jversion.h
- *
- * Copyright (C) 1991-1998, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains software version identification.
- */
-
-
-#define JVERSION "6b 27-Mar-1998"
-
-#define JCOPYRIGHT "Copyright (C) 1998, Thomas G. Lane"
+/*
+ * jversion.h
+ *
+ * Copyright (C) 1991-1998, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains software version identification.
+ */
+
+
+#define JVERSION "6b 27-Mar-1998"
+
+#define JCOPYRIGHT "Copyright (C) 1998, Thomas G. Lane"
diff --git a/core/src/fxcodec/libjpeg/transupp.h b/core/src/fxcodec/libjpeg/transupp.h
index eb0b05566a..5c2d32aff5 100644
--- a/core/src/fxcodec/libjpeg/transupp.h
+++ b/core/src/fxcodec/libjpeg/transupp.h
@@ -1,135 +1,135 @@
-/*
- * transupp.h
- *
- * Copyright (C) 1997, Thomas G. Lane.
- * This file is part of the Independent JPEG Group's software.
- * For conditions of distribution and use, see the accompanying README file.
- *
- * This file contains declarations for image transformation routines and
- * other utility code used by the jpegtran sample application. These are
- * NOT part of the core JPEG library. But we keep these routines separate
- * from jpegtran.c to ease the task of maintaining jpegtran-like programs
- * that have other user interfaces.
- *
- * NOTE: all the routines declared here have very specific requirements
- * about when they are to be executed during the reading and writing of the
- * source and destination files. See the comments in transupp.c, or see
- * jpegtran.c for an example of correct usage.
- */
-
-/* If you happen not to want the image transform support, disable it here */
-#ifndef TRANSFORMS_SUPPORTED
-#define TRANSFORMS_SUPPORTED 1 /* 0 disables transform code */
-#endif
-
-/* Short forms of external names for systems with brain-damaged linkers. */
-
-#ifdef NEED_SHORT_EXTERNAL_NAMES
-#define jtransform_request_workspace jTrRequest
-#define jtransform_adjust_parameters jTrAdjust
-#define jtransform_execute_transformation jTrExec
-#define jcopy_markers_setup jCMrkSetup
-#define jcopy_markers_execute jCMrkExec
-#endif /* NEED_SHORT_EXTERNAL_NAMES */
-
-
-/*
- * Codes for supported types of image transformations.
- */
-
-typedef enum {
- JXFORM_NONE, /* no transformation */
- JXFORM_FLIP_H, /* horizontal flip */
- JXFORM_FLIP_V, /* vertical flip */
- JXFORM_TRANSPOSE, /* transpose across UL-to-LR axis */
- JXFORM_TRANSVERSE, /* transpose across UR-to-LL axis */
- JXFORM_ROT_90, /* 90-degree clockwise rotation */
- JXFORM_ROT_180, /* 180-degree rotation */
- JXFORM_ROT_270 /* 270-degree clockwise (or 90 ccw) */
-} JXFORM_CODE;
-
-/*
- * Although rotating and flipping data expressed as DCT coefficients is not
- * hard, there is an asymmetry in the JPEG format specification for images
- * whose dimensions aren't multiples of the iMCU size. The right and bottom
- * image edges are padded out to the next iMCU boundary with junk data; but
- * no padding is possible at the top and left edges. If we were to flip
- * the whole image including the pad data, then pad garbage would become
- * visible at the top and/or left, and real pixels would disappear into the
- * pad margins --- perhaps permanently, since encoders & decoders may not
- * bother to preserve DCT blocks that appear to be completely outside the
- * nominal image area. So, we have to exclude any partial iMCUs from the
- * basic transformation.
- *
- * Transpose is the only transformation that can handle partial iMCUs at the
- * right and bottom edges completely cleanly. flip_h can flip partial iMCUs
- * at the bottom, but leaves any partial iMCUs at the right edge untouched.
- * Similarly flip_v leaves any partial iMCUs at the bottom edge untouched.
- * The other transforms are defined as combinations of these basic transforms
- * and process edge blocks in a way that preserves the equivalence.
- *
- * The "trim" option causes untransformable partial iMCUs to be dropped;
- * this is not strictly lossless, but it usually gives the best-looking
- * result for odd-size images. Note that when this option is active,
- * the expected mathematical equivalences between the transforms may not hold.
- * (For example, -rot 270 -trim trims only the bottom edge, but -rot 90 -trim
- * followed by -rot 180 -trim trims both edges.)
- *
- * We also offer a "force to grayscale" option, which simply discards the
- * chrominance channels of a YCbCr image. This is lossless in the sense that
- * the luminance channel is preserved exactly. It's not the same kind of
- * thing as the rotate/flip transformations, but it's convenient to handle it
- * as part of this package, mainly because the transformation routines have to
- * be aware of the option to know how many components to work on.
- */
-
-typedef struct {
- /* Options: set by caller */
- JXFORM_CODE transform; /* image transform operator */
- boolean trim; /* if TRUE, trim partial MCUs as needed */
- boolean force_grayscale; /* if TRUE, convert color image to grayscale */
-
- /* Internal workspace: caller should not touch these */
- int num_components; /* # of components in workspace */
- jvirt_barray_ptr * workspace_coef_arrays; /* workspace for transformations */
-} jpeg_transform_info;
-
-
-#if TRANSFORMS_SUPPORTED
-
-/* Request any required workspace */
-EXTERN(void) jtransform_request_workspace
- JPP((j_decompress_ptr srcinfo, jpeg_transform_info *info));
-/* Adjust output image parameters */
-EXTERN(jvirt_barray_ptr *) jtransform_adjust_parameters
- JPP((j_decompress_ptr srcinfo, j_compress_ptr dstinfo,
- jvirt_barray_ptr *src_coef_arrays,
- jpeg_transform_info *info));
-/* Execute the actual transformation, if any */
-EXTERN(void) jtransform_execute_transformation
- JPP((j_decompress_ptr srcinfo, j_compress_ptr dstinfo,
- jvirt_barray_ptr *src_coef_arrays,
- jpeg_transform_info *info));
-
-#endif /* TRANSFORMS_SUPPORTED */
-
-
-/*
- * Support for copying optional markers from source to destination file.
- */
-
-typedef enum {
- JCOPYOPT_NONE, /* copy no optional markers */
- JCOPYOPT_COMMENTS, /* copy only comment (COM) markers */
- JCOPYOPT_ALL /* copy all optional markers */
-} JCOPY_OPTION;
-
-#define JCOPYOPT_DEFAULT JCOPYOPT_COMMENTS /* recommended default */
-
-/* Setup decompression object to save desired markers in memory */
-EXTERN(void) jcopy_markers_setup
- JPP((j_decompress_ptr srcinfo, JCOPY_OPTION option));
-/* Copy markers saved in the given source object to the destination object */
-EXTERN(void) jcopy_markers_execute
- JPP((j_decompress_ptr srcinfo, j_compress_ptr dstinfo,
- JCOPY_OPTION option));
+/*
+ * transupp.h
+ *
+ * Copyright (C) 1997, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains declarations for image transformation routines and
+ * other utility code used by the jpegtran sample application. These are
+ * NOT part of the core JPEG library. But we keep these routines separate
+ * from jpegtran.c to ease the task of maintaining jpegtran-like programs
+ * that have other user interfaces.
+ *
+ * NOTE: all the routines declared here have very specific requirements
+ * about when they are to be executed during the reading and writing of the
+ * source and destination files. See the comments in transupp.c, or see
+ * jpegtran.c for an example of correct usage.
+ */
+
+/* If you happen not to want the image transform support, disable it here */
+#ifndef TRANSFORMS_SUPPORTED
+#define TRANSFORMS_SUPPORTED 1 /* 0 disables transform code */
+#endif
+
+/* Short forms of external names for systems with brain-damaged linkers. */
+
+#ifdef NEED_SHORT_EXTERNAL_NAMES
+#define jtransform_request_workspace jTrRequest
+#define jtransform_adjust_parameters jTrAdjust
+#define jtransform_execute_transformation jTrExec
+#define jcopy_markers_setup jCMrkSetup
+#define jcopy_markers_execute jCMrkExec
+#endif /* NEED_SHORT_EXTERNAL_NAMES */
+
+
+/*
+ * Codes for supported types of image transformations.
+ */
+
+typedef enum {
+ JXFORM_NONE, /* no transformation */
+ JXFORM_FLIP_H, /* horizontal flip */
+ JXFORM_FLIP_V, /* vertical flip */
+ JXFORM_TRANSPOSE, /* transpose across UL-to-LR axis */
+ JXFORM_TRANSVERSE, /* transpose across UR-to-LL axis */
+ JXFORM_ROT_90, /* 90-degree clockwise rotation */
+ JXFORM_ROT_180, /* 180-degree rotation */
+ JXFORM_ROT_270 /* 270-degree clockwise (or 90 ccw) */
+} JXFORM_CODE;
+
+/*
+ * Although rotating and flipping data expressed as DCT coefficients is not
+ * hard, there is an asymmetry in the JPEG format specification for images
+ * whose dimensions aren't multiples of the iMCU size. The right and bottom
+ * image edges are padded out to the next iMCU boundary with junk data; but
+ * no padding is possible at the top and left edges. If we were to flip
+ * the whole image including the pad data, then pad garbage would become
+ * visible at the top and/or left, and real pixels would disappear into the
+ * pad margins --- perhaps permanently, since encoders & decoders may not
+ * bother to preserve DCT blocks that appear to be completely outside the
+ * nominal image area. So, we have to exclude any partial iMCUs from the
+ * basic transformation.
+ *
+ * Transpose is the only transformation that can handle partial iMCUs at the
+ * right and bottom edges completely cleanly. flip_h can flip partial iMCUs
+ * at the bottom, but leaves any partial iMCUs at the right edge untouched.
+ * Similarly flip_v leaves any partial iMCUs at the bottom edge untouched.
+ * The other transforms are defined as combinations of these basic transforms
+ * and process edge blocks in a way that preserves the equivalence.
+ *
+ * The "trim" option causes untransformable partial iMCUs to be dropped;
+ * this is not strictly lossless, but it usually gives the best-looking
+ * result for odd-size images. Note that when this option is active,
+ * the expected mathematical equivalences between the transforms may not hold.
+ * (For example, -rot 270 -trim trims only the bottom edge, but -rot 90 -trim
+ * followed by -rot 180 -trim trims both edges.)
+ *
+ * We also offer a "force to grayscale" option, which simply discards the
+ * chrominance channels of a YCbCr image. This is lossless in the sense that
+ * the luminance channel is preserved exactly. It's not the same kind of
+ * thing as the rotate/flip transformations, but it's convenient to handle it
+ * as part of this package, mainly because the transformation routines have to
+ * be aware of the option to know how many components to work on.
+ */
+
+typedef struct {
+ /* Options: set by caller */
+ JXFORM_CODE transform; /* image transform operator */
+ boolean trim; /* if TRUE, trim partial MCUs as needed */
+ boolean force_grayscale; /* if TRUE, convert color image to grayscale */
+
+ /* Internal workspace: caller should not touch these */
+ int num_components; /* # of components in workspace */
+ jvirt_barray_ptr * workspace_coef_arrays; /* workspace for transformations */
+} jpeg_transform_info;
+
+
+#if TRANSFORMS_SUPPORTED
+
+/* Request any required workspace */
+EXTERN(void) jtransform_request_workspace
+ JPP((j_decompress_ptr srcinfo, jpeg_transform_info *info));
+/* Adjust output image parameters */
+EXTERN(jvirt_barray_ptr *) jtransform_adjust_parameters
+ JPP((j_decompress_ptr srcinfo, j_compress_ptr dstinfo,
+ jvirt_barray_ptr *src_coef_arrays,
+ jpeg_transform_info *info));
+/* Execute the actual transformation, if any */
+EXTERN(void) jtransform_execute_transformation
+ JPP((j_decompress_ptr srcinfo, j_compress_ptr dstinfo,
+ jvirt_barray_ptr *src_coef_arrays,
+ jpeg_transform_info *info));
+
+#endif /* TRANSFORMS_SUPPORTED */
+
+
+/*
+ * Support for copying optional markers from source to destination file.
+ */
+
+typedef enum {
+ JCOPYOPT_NONE, /* copy no optional markers */
+ JCOPYOPT_COMMENTS, /* copy only comment (COM) markers */
+ JCOPYOPT_ALL /* copy all optional markers */
+} JCOPY_OPTION;
+
+#define JCOPYOPT_DEFAULT JCOPYOPT_COMMENTS /* recommended default */
+
+/* Setup decompression object to save desired markers in memory */
+EXTERN(void) jcopy_markers_setup
+ JPP((j_decompress_ptr srcinfo, JCOPY_OPTION option));
+/* Copy markers saved in the given source object to the destination object */
+EXTERN(void) jcopy_markers_execute
+ JPP((j_decompress_ptr srcinfo, j_compress_ptr dstinfo,
+ JCOPY_OPTION option));
diff --git a/core/src/fxcrt/extension.h b/core/src/fxcrt/extension.h
index bf5c5ec6ad..8d9597bfd1 100644
--- a/core/src/fxcrt/extension.h
+++ b/core/src/fxcrt/extension.h
@@ -1,413 +1,413 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef _FXCRT_EXTENSION_IMP_
-#define _FXCRT_EXTENSION_IMP_
-class IFXCRT_FileAccess
-{
-public:
- virtual ~IFXCRT_FileAccess() {}
- virtual FX_BOOL Open(FX_BSTR fileName, FX_DWORD dwMode) = 0;
- virtual FX_BOOL Open(FX_WSTR fileName, FX_DWORD dwMode) = 0;
- virtual void Close() = 0;
- virtual void Release(IFX_Allocator* pAllocator = NULL) = 0;
- virtual FX_FILESIZE GetSize() const = 0;
- virtual FX_FILESIZE GetPosition() const = 0;
- virtual FX_FILESIZE SetPosition(FX_FILESIZE pos) = 0;
- virtual size_t Read(void* pBuffer, size_t szBuffer) = 0;
- virtual size_t Write(const void* pBuffer, size_t szBuffer) = 0;
- virtual size_t ReadPos(void* pBuffer, size_t szBuffer, FX_FILESIZE pos) = 0;
- virtual size_t WritePos(const void* pBuffer, size_t szBuffer, FX_FILESIZE pos) = 0;
- virtual FX_BOOL Flush() = 0;
- virtual FX_BOOL Truncate(FX_FILESIZE szFile) = 0;
-};
-IFXCRT_FileAccess* FXCRT_FileAccess_Create(IFX_Allocator* pAllocator = NULL);
-class CFX_CRTFileStream : public IFX_FileStream, public CFX_Object
-{
-public:
- CFX_CRTFileStream(IFXCRT_FileAccess* pFA, IFX_Allocator* pAllocator) : m_pAllocator(pAllocator), m_pFile(pFA), m_dwCount(1), m_bUseRange(FALSE), m_nOffset(0), m_nSize(0) {}
- ~CFX_CRTFileStream()
- {
- if (m_pFile) {
- m_pFile->Release(m_pAllocator);
- }
- }
- virtual IFX_FileStream* Retain()
- {
- m_dwCount ++;
- return this;
- }
- virtual void Release()
- {
- FX_DWORD nCount = -- m_dwCount;
- if (!nCount) {
- if (m_pAllocator) {
- FX_DeleteAtAllocator(this, m_pAllocator, CFX_CRTFileStream);
- } else {
- delete this;
- }
- }
- }
- virtual FX_FILESIZE GetSize()
- {
- return m_bUseRange ? m_nSize : m_pFile->GetSize();
- }
- virtual FX_BOOL IsEOF()
- {
- return GetPosition() >= GetSize();
- }
- virtual FX_FILESIZE GetPosition()
- {
- FX_FILESIZE pos = m_pFile->GetPosition();
- if (m_bUseRange) {
- pos -= m_nOffset;
- }
- return pos;
- }
- virtual FX_BOOL SetRange(FX_FILESIZE offset, FX_FILESIZE size)
- {
- if (offset < 0 || offset + size > m_pFile->GetSize()) {
- return FALSE;
- }
- m_nOffset = offset, m_nSize = size;
- m_bUseRange = TRUE;
- m_pFile->SetPosition(m_nOffset);
- return TRUE;
- }
- virtual void ClearRange()
- {
- m_bUseRange = FALSE;
- }
- virtual FX_BOOL ReadBlock(void* buffer, FX_FILESIZE offset, size_t size)
- {
- if (m_bUseRange) {
- if (offset + size > (size_t)GetSize()) {
- return FALSE;
- }
- offset += m_nOffset;
- }
- return (FX_BOOL)m_pFile->ReadPos(buffer, size, offset);
- }
- virtual size_t ReadBlock(void* buffer, size_t size)
- {
- if (m_bUseRange) {
- FX_FILESIZE availSize = m_nOffset + m_nSize - m_pFile->GetPosition();
- if ((size_t)availSize < size) {
- size -= size - (size_t)availSize;
- }
- }
- return m_pFile->Read(buffer, size);
- }
- virtual FX_BOOL WriteBlock(const void* buffer, FX_FILESIZE offset, size_t size)
- {
- if (m_bUseRange) {
- offset += m_nOffset;
- }
- return (FX_BOOL)m_pFile->WritePos(buffer, size, offset);
- }
- virtual FX_BOOL Flush()
- {
- return m_pFile->Flush();
- }
- IFX_Allocator* m_pAllocator;
- IFXCRT_FileAccess* m_pFile;
- FX_DWORD m_dwCount;
- FX_BOOL m_bUseRange;
- FX_FILESIZE m_nOffset;
- FX_FILESIZE m_nSize;
-};
-#define FX_MEMSTREAM_BlockSize (64 * 1024)
-#define FX_MEMSTREAM_Consecutive 0x01
-#define FX_MEMSTREAM_TakeOver 0x02
-class CFX_MemoryStream : public IFX_MemoryStream, public CFX_Object
-{
-public:
- CFX_MemoryStream(FX_BOOL bConsecutive, IFX_Allocator* pAllocator)
- : m_Blocks(pAllocator)
- , m_dwCount(1)
- , m_nTotalSize(0)
- , m_nCurSize(0)
- , m_nCurPos(0)
- , m_nGrowSize(FX_MEMSTREAM_BlockSize)
- , m_bUseRange(FALSE)
- {
- m_dwFlags = FX_MEMSTREAM_TakeOver | (bConsecutive ? FX_MEMSTREAM_Consecutive : 0);
- }
- CFX_MemoryStream(FX_LPBYTE pBuffer, size_t nSize, FX_BOOL bTakeOver, IFX_Allocator* pAllocator)
- : m_Blocks(pAllocator)
- , m_dwCount(1)
- , m_nTotalSize(nSize)
- , m_nCurSize(nSize)
- , m_nCurPos(0)
- , m_nGrowSize(FX_MEMSTREAM_BlockSize)
- , m_bUseRange(FALSE)
- {
- m_Blocks.Add(pBuffer);
- m_dwFlags = FX_MEMSTREAM_Consecutive | (bTakeOver ? FX_MEMSTREAM_TakeOver : 0);
- }
- ~CFX_MemoryStream()
- {
- IFX_Allocator* pAllocator = m_Blocks.m_pAllocator;
- if (m_dwFlags & FX_MEMSTREAM_TakeOver) {
- for (FX_INT32 i = 0; i < m_Blocks.GetSize(); i ++) {
- FX_Allocator_Free(pAllocator, (FX_LPBYTE)m_Blocks[i]);
- }
- }
- m_Blocks.RemoveAll();
- }
- virtual IFX_FileStream* Retain()
- {
- m_dwCount ++;
- return this;
- }
- virtual void Release()
- {
- FX_DWORD nCount = -- m_dwCount;
- if (nCount) {
- return;
- }
- IFX_Allocator* pAllocator = m_Blocks.m_pAllocator;
- if (pAllocator) {
- FX_DeleteAtAllocator(this, pAllocator, CFX_MemoryStream);
- } else {
- delete this;
- }
- }
- virtual FX_FILESIZE GetSize()
- {
- return m_bUseRange ? (FX_FILESIZE) m_nSize : (FX_FILESIZE)m_nCurSize;
- }
- virtual FX_BOOL IsEOF()
- {
- return m_nCurPos >= (size_t)GetSize();
- }
- virtual FX_FILESIZE GetPosition()
- {
- FX_FILESIZE pos = (FX_FILESIZE)m_nCurPos;
- if (m_bUseRange) {
- pos -= (FX_FILESIZE)m_nOffset;
- }
- return pos;
- }
- virtual FX_BOOL SetRange(FX_FILESIZE offset, FX_FILESIZE size)
- {
- if (offset < 0 || (size_t)(offset + size) > m_nCurSize) {
- return FALSE;
- }
- m_nOffset = (size_t)offset, m_nSize = (size_t)size;
- m_bUseRange = TRUE;
- m_nCurPos = m_nOffset;
- return TRUE;
- }
- virtual void ClearRange()
- {
- m_bUseRange = FALSE;
- }
- virtual FX_BOOL ReadBlock(void* buffer, FX_FILESIZE offset, size_t size)
- {
- if (!buffer || !size) {
- return FALSE;
- }
- if (m_bUseRange) {
- offset += (FX_FILESIZE)m_nOffset;
- }
- if ((size_t)offset + size > m_nCurSize) {
- return FALSE;
- }
- m_nCurPos = (size_t)offset + size;
- if (m_dwFlags & FX_MEMSTREAM_Consecutive) {
- FXSYS_memcpy32(buffer, (FX_LPBYTE)m_Blocks[0] + (size_t)offset, size);
- return TRUE;
- }
- size_t nStartBlock = (size_t)offset / m_nGrowSize;
- offset -= (FX_FILESIZE)(nStartBlock * m_nGrowSize);
- while (size) {
- size_t nRead = m_nGrowSize - (size_t)offset;
- if (nRead > size) {
- nRead = size;
- }
- FXSYS_memcpy32(buffer, (FX_LPBYTE)m_Blocks[(int)nStartBlock] + (size_t)offset, nRead);
- buffer = ((FX_LPBYTE)buffer) + nRead;
- size -= nRead;
- nStartBlock ++;
- offset = 0;
- }
- return TRUE;
- }
- virtual size_t ReadBlock(void* buffer, size_t size)
- {
- if (m_nCurPos >= m_nCurSize) {
- return 0;
- }
- if (m_bUseRange) {
- size_t availSize = m_nOffset + m_nSize - m_nCurPos;
- if (availSize < size) {
- size -= size - (size_t)availSize;
- }
- }
- size_t nRead = FX_MIN(size, m_nCurSize - m_nCurPos);
- if (!ReadBlock(buffer, (FX_INT32)m_nCurPos, nRead)) {
- return 0;
- }
- return nRead;
- }
- virtual FX_BOOL WriteBlock(const void* buffer, FX_FILESIZE offset, size_t size)
- {
- if (!buffer || !size) {
- return FALSE;
- }
- if (m_bUseRange) {
- offset += (FX_FILESIZE)m_nOffset;
- }
- if (m_dwFlags & FX_MEMSTREAM_Consecutive) {
- m_nCurPos = (size_t)offset + size;
- if (m_nCurPos > m_nTotalSize) {
- IFX_Allocator* pAllocator = m_Blocks.m_pAllocator;
- m_nTotalSize = (m_nCurPos + m_nGrowSize - 1) / m_nGrowSize * m_nGrowSize;
- if (m_Blocks.GetSize() < 1) {
- void* block = FX_Allocator_Alloc(pAllocator, FX_BYTE, m_nTotalSize);
- m_Blocks.Add(block);
- } else {
- m_Blocks[0] = FX_Allocator_Realloc(pAllocator, FX_BYTE, m_Blocks[0], m_nTotalSize);
- }
- if (!m_Blocks[0]) {
- m_Blocks.RemoveAll();
- return FALSE;
- }
- }
- FXSYS_memcpy32((FX_LPBYTE)m_Blocks[0] + (size_t)offset, buffer, size);
- if (m_nCurSize < m_nCurPos) {
- m_nCurSize = m_nCurPos;
- }
- return TRUE;
- }
- if (!ExpandBlocks((size_t)offset + size)) {
- return FALSE;
- }
- m_nCurPos = (size_t)offset + size;
- size_t nStartBlock = (size_t)offset / m_nGrowSize;
- offset -= (FX_FILESIZE)(nStartBlock * m_nGrowSize);
- while (size) {
- size_t nWrite = m_nGrowSize - (size_t)offset;
- if (nWrite > size) {
- nWrite = size;
- }
- FXSYS_memcpy32((FX_LPBYTE)m_Blocks[(int)nStartBlock] + (size_t)offset, buffer, nWrite);
- buffer = ((FX_LPBYTE)buffer) + nWrite;
- size -= nWrite;
- nStartBlock ++;
- offset = 0;
- }
- return TRUE;
- }
- virtual FX_BOOL Flush()
- {
- return TRUE;
- }
- virtual FX_BOOL IsConsecutive() const
- {
- return m_dwFlags & FX_MEMSTREAM_Consecutive;
- }
- virtual void EstimateSize(size_t nInitSize, size_t nGrowSize)
- {
- if (m_dwFlags & FX_MEMSTREAM_Consecutive) {
- if (m_Blocks.GetSize() < 1) {
- FX_LPBYTE pBlock = FX_Allocator_Alloc(m_Blocks.m_pAllocator, FX_BYTE, FX_MAX(nInitSize, 4096));
- if (pBlock) {
- m_Blocks.Add(pBlock);
- }
- }
- m_nGrowSize = FX_MAX(nGrowSize, 4096);
- } else if (m_Blocks.GetSize() < 1) {
- m_nGrowSize = FX_MAX(nGrowSize, 4096);
- }
- }
- virtual FX_LPBYTE GetBuffer() const
- {
- return m_Blocks.GetSize() ? (FX_LPBYTE)m_Blocks[0] : NULL;
- }
- virtual void AttachBuffer(FX_LPBYTE pBuffer, size_t nSize, FX_BOOL bTakeOver = FALSE)
- {
- if (!(m_dwFlags & FX_MEMSTREAM_Consecutive)) {
- return;
- }
- m_Blocks.RemoveAll();
- m_Blocks.Add(pBuffer);
- m_nTotalSize = m_nCurSize = nSize;
- m_nCurPos = 0;
- m_dwFlags = FX_MEMSTREAM_Consecutive | (bTakeOver ? FX_MEMSTREAM_TakeOver : 0);
- ClearRange();
- }
- virtual void DetachBuffer()
- {
- if (!(m_dwFlags & FX_MEMSTREAM_Consecutive)) {
- return;
- }
- m_Blocks.RemoveAll();
- m_nTotalSize = m_nCurSize = m_nCurPos = 0;
- m_dwFlags = FX_MEMSTREAM_TakeOver;
- ClearRange();
- }
-protected:
- CFX_PtrArray m_Blocks;
- FX_DWORD m_dwCount;
- size_t m_nTotalSize;
- size_t m_nCurSize;
- size_t m_nCurPos;
- size_t m_nGrowSize;
- FX_DWORD m_dwFlags;
- FX_BOOL m_bUseRange;
- size_t m_nOffset;
- size_t m_nSize;
- FX_BOOL ExpandBlocks(size_t size)
- {
- if (m_nCurSize < size) {
- m_nCurSize = size;
- }
- if (size <= m_nTotalSize) {
- return TRUE;
- }
- FX_INT32 iCount = m_Blocks.GetSize();
- size = (size - m_nTotalSize + m_nGrowSize - 1) / m_nGrowSize;
- m_Blocks.SetSize(m_Blocks.GetSize() + (FX_INT32)size, -1);
- IFX_Allocator* pAllocator = m_Blocks.m_pAllocator;
- while (size --) {
- FX_LPBYTE pBlock = FX_Allocator_Alloc(pAllocator, FX_BYTE, m_nGrowSize);
- if (!pBlock) {
- return FALSE;
- }
- m_Blocks.SetAt(iCount ++, pBlock);
- m_nTotalSize += m_nGrowSize;
- }
- return TRUE;
- }
-};
-#ifdef __cplusplus
-extern "C" {
-#endif
-#define MT_N 848
-#define MT_M 456
-#define MT_Matrix_A 0x9908b0df
-#define MT_Upper_Mask 0x80000000
-#define MT_Lower_Mask 0x7fffffff
-typedef struct _FX_MTRANDOMCONTEXT {
- _FX_MTRANDOMCONTEXT()
- {
- mti = MT_N + 1;
- bHaveSeed = FALSE;
- }
- FX_DWORD mti;
- FX_BOOL bHaveSeed;
- FX_DWORD mt[MT_N];
-} FX_MTRANDOMCONTEXT, * FX_LPMTRANDOMCONTEXT;
-typedef FX_MTRANDOMCONTEXT const * FX_LPCMTRANDOMCONTEXT;
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
-FX_BOOL FX_GenerateCryptoRandom(FX_LPDWORD pBuffer, FX_INT32 iCount);
-#endif
-#ifdef __cplusplus
-}
-#endif
-#endif
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FXCRT_EXTENSION_IMP_
+#define _FXCRT_EXTENSION_IMP_
+class IFXCRT_FileAccess
+{
+public:
+ virtual ~IFXCRT_FileAccess() {}
+ virtual FX_BOOL Open(FX_BSTR fileName, FX_DWORD dwMode) = 0;
+ virtual FX_BOOL Open(FX_WSTR fileName, FX_DWORD dwMode) = 0;
+ virtual void Close() = 0;
+ virtual void Release(IFX_Allocator* pAllocator = NULL) = 0;
+ virtual FX_FILESIZE GetSize() const = 0;
+ virtual FX_FILESIZE GetPosition() const = 0;
+ virtual FX_FILESIZE SetPosition(FX_FILESIZE pos) = 0;
+ virtual size_t Read(void* pBuffer, size_t szBuffer) = 0;
+ virtual size_t Write(const void* pBuffer, size_t szBuffer) = 0;
+ virtual size_t ReadPos(void* pBuffer, size_t szBuffer, FX_FILESIZE pos) = 0;
+ virtual size_t WritePos(const void* pBuffer, size_t szBuffer, FX_FILESIZE pos) = 0;
+ virtual FX_BOOL Flush() = 0;
+ virtual FX_BOOL Truncate(FX_FILESIZE szFile) = 0;
+};
+IFXCRT_FileAccess* FXCRT_FileAccess_Create(IFX_Allocator* pAllocator = NULL);
+class CFX_CRTFileStream : public IFX_FileStream, public CFX_Object
+{
+public:
+ CFX_CRTFileStream(IFXCRT_FileAccess* pFA, IFX_Allocator* pAllocator) : m_pAllocator(pAllocator), m_pFile(pFA), m_dwCount(1), m_bUseRange(FALSE), m_nOffset(0), m_nSize(0) {}
+ ~CFX_CRTFileStream()
+ {
+ if (m_pFile) {
+ m_pFile->Release(m_pAllocator);
+ }
+ }
+ virtual IFX_FileStream* Retain()
+ {
+ m_dwCount ++;
+ return this;
+ }
+ virtual void Release()
+ {
+ FX_DWORD nCount = -- m_dwCount;
+ if (!nCount) {
+ if (m_pAllocator) {
+ FX_DeleteAtAllocator(this, m_pAllocator, CFX_CRTFileStream);
+ } else {
+ delete this;
+ }
+ }
+ }
+ virtual FX_FILESIZE GetSize()
+ {
+ return m_bUseRange ? m_nSize : m_pFile->GetSize();
+ }
+ virtual FX_BOOL IsEOF()
+ {
+ return GetPosition() >= GetSize();
+ }
+ virtual FX_FILESIZE GetPosition()
+ {
+ FX_FILESIZE pos = m_pFile->GetPosition();
+ if (m_bUseRange) {
+ pos -= m_nOffset;
+ }
+ return pos;
+ }
+ virtual FX_BOOL SetRange(FX_FILESIZE offset, FX_FILESIZE size)
+ {
+ if (offset < 0 || offset + size > m_pFile->GetSize()) {
+ return FALSE;
+ }
+ m_nOffset = offset, m_nSize = size;
+ m_bUseRange = TRUE;
+ m_pFile->SetPosition(m_nOffset);
+ return TRUE;
+ }
+ virtual void ClearRange()
+ {
+ m_bUseRange = FALSE;
+ }
+ virtual FX_BOOL ReadBlock(void* buffer, FX_FILESIZE offset, size_t size)
+ {
+ if (m_bUseRange) {
+ if (offset + size > (size_t)GetSize()) {
+ return FALSE;
+ }
+ offset += m_nOffset;
+ }
+ return (FX_BOOL)m_pFile->ReadPos(buffer, size, offset);
+ }
+ virtual size_t ReadBlock(void* buffer, size_t size)
+ {
+ if (m_bUseRange) {
+ FX_FILESIZE availSize = m_nOffset + m_nSize - m_pFile->GetPosition();
+ if ((size_t)availSize < size) {
+ size -= size - (size_t)availSize;
+ }
+ }
+ return m_pFile->Read(buffer, size);
+ }
+ virtual FX_BOOL WriteBlock(const void* buffer, FX_FILESIZE offset, size_t size)
+ {
+ if (m_bUseRange) {
+ offset += m_nOffset;
+ }
+ return (FX_BOOL)m_pFile->WritePos(buffer, size, offset);
+ }
+ virtual FX_BOOL Flush()
+ {
+ return m_pFile->Flush();
+ }
+ IFX_Allocator* m_pAllocator;
+ IFXCRT_FileAccess* m_pFile;
+ FX_DWORD m_dwCount;
+ FX_BOOL m_bUseRange;
+ FX_FILESIZE m_nOffset;
+ FX_FILESIZE m_nSize;
+};
+#define FX_MEMSTREAM_BlockSize (64 * 1024)
+#define FX_MEMSTREAM_Consecutive 0x01
+#define FX_MEMSTREAM_TakeOver 0x02
+class CFX_MemoryStream : public IFX_MemoryStream, public CFX_Object
+{
+public:
+ CFX_MemoryStream(FX_BOOL bConsecutive, IFX_Allocator* pAllocator)
+ : m_Blocks(pAllocator)
+ , m_dwCount(1)
+ , m_nTotalSize(0)
+ , m_nCurSize(0)
+ , m_nCurPos(0)
+ , m_nGrowSize(FX_MEMSTREAM_BlockSize)
+ , m_bUseRange(FALSE)
+ {
+ m_dwFlags = FX_MEMSTREAM_TakeOver | (bConsecutive ? FX_MEMSTREAM_Consecutive : 0);
+ }
+ CFX_MemoryStream(FX_LPBYTE pBuffer, size_t nSize, FX_BOOL bTakeOver, IFX_Allocator* pAllocator)
+ : m_Blocks(pAllocator)
+ , m_dwCount(1)
+ , m_nTotalSize(nSize)
+ , m_nCurSize(nSize)
+ , m_nCurPos(0)
+ , m_nGrowSize(FX_MEMSTREAM_BlockSize)
+ , m_bUseRange(FALSE)
+ {
+ m_Blocks.Add(pBuffer);
+ m_dwFlags = FX_MEMSTREAM_Consecutive | (bTakeOver ? FX_MEMSTREAM_TakeOver : 0);
+ }
+ ~CFX_MemoryStream()
+ {
+ IFX_Allocator* pAllocator = m_Blocks.m_pAllocator;
+ if (m_dwFlags & FX_MEMSTREAM_TakeOver) {
+ for (FX_INT32 i = 0; i < m_Blocks.GetSize(); i ++) {
+ FX_Allocator_Free(pAllocator, (FX_LPBYTE)m_Blocks[i]);
+ }
+ }
+ m_Blocks.RemoveAll();
+ }
+ virtual IFX_FileStream* Retain()
+ {
+ m_dwCount ++;
+ return this;
+ }
+ virtual void Release()
+ {
+ FX_DWORD nCount = -- m_dwCount;
+ if (nCount) {
+ return;
+ }
+ IFX_Allocator* pAllocator = m_Blocks.m_pAllocator;
+ if (pAllocator) {
+ FX_DeleteAtAllocator(this, pAllocator, CFX_MemoryStream);
+ } else {
+ delete this;
+ }
+ }
+ virtual FX_FILESIZE GetSize()
+ {
+ return m_bUseRange ? (FX_FILESIZE) m_nSize : (FX_FILESIZE)m_nCurSize;
+ }
+ virtual FX_BOOL IsEOF()
+ {
+ return m_nCurPos >= (size_t)GetSize();
+ }
+ virtual FX_FILESIZE GetPosition()
+ {
+ FX_FILESIZE pos = (FX_FILESIZE)m_nCurPos;
+ if (m_bUseRange) {
+ pos -= (FX_FILESIZE)m_nOffset;
+ }
+ return pos;
+ }
+ virtual FX_BOOL SetRange(FX_FILESIZE offset, FX_FILESIZE size)
+ {
+ if (offset < 0 || (size_t)(offset + size) > m_nCurSize) {
+ return FALSE;
+ }
+ m_nOffset = (size_t)offset, m_nSize = (size_t)size;
+ m_bUseRange = TRUE;
+ m_nCurPos = m_nOffset;
+ return TRUE;
+ }
+ virtual void ClearRange()
+ {
+ m_bUseRange = FALSE;
+ }
+ virtual FX_BOOL ReadBlock(void* buffer, FX_FILESIZE offset, size_t size)
+ {
+ if (!buffer || !size) {
+ return FALSE;
+ }
+ if (m_bUseRange) {
+ offset += (FX_FILESIZE)m_nOffset;
+ }
+ if ((size_t)offset + size > m_nCurSize) {
+ return FALSE;
+ }
+ m_nCurPos = (size_t)offset + size;
+ if (m_dwFlags & FX_MEMSTREAM_Consecutive) {
+ FXSYS_memcpy32(buffer, (FX_LPBYTE)m_Blocks[0] + (size_t)offset, size);
+ return TRUE;
+ }
+ size_t nStartBlock = (size_t)offset / m_nGrowSize;
+ offset -= (FX_FILESIZE)(nStartBlock * m_nGrowSize);
+ while (size) {
+ size_t nRead = m_nGrowSize - (size_t)offset;
+ if (nRead > size) {
+ nRead = size;
+ }
+ FXSYS_memcpy32(buffer, (FX_LPBYTE)m_Blocks[(int)nStartBlock] + (size_t)offset, nRead);
+ buffer = ((FX_LPBYTE)buffer) + nRead;
+ size -= nRead;
+ nStartBlock ++;
+ offset = 0;
+ }
+ return TRUE;
+ }
+ virtual size_t ReadBlock(void* buffer, size_t size)
+ {
+ if (m_nCurPos >= m_nCurSize) {
+ return 0;
+ }
+ if (m_bUseRange) {
+ size_t availSize = m_nOffset + m_nSize - m_nCurPos;
+ if (availSize < size) {
+ size -= size - (size_t)availSize;
+ }
+ }
+ size_t nRead = FX_MIN(size, m_nCurSize - m_nCurPos);
+ if (!ReadBlock(buffer, (FX_INT32)m_nCurPos, nRead)) {
+ return 0;
+ }
+ return nRead;
+ }
+ virtual FX_BOOL WriteBlock(const void* buffer, FX_FILESIZE offset, size_t size)
+ {
+ if (!buffer || !size) {
+ return FALSE;
+ }
+ if (m_bUseRange) {
+ offset += (FX_FILESIZE)m_nOffset;
+ }
+ if (m_dwFlags & FX_MEMSTREAM_Consecutive) {
+ m_nCurPos = (size_t)offset + size;
+ if (m_nCurPos > m_nTotalSize) {
+ IFX_Allocator* pAllocator = m_Blocks.m_pAllocator;
+ m_nTotalSize = (m_nCurPos + m_nGrowSize - 1) / m_nGrowSize * m_nGrowSize;
+ if (m_Blocks.GetSize() < 1) {
+ void* block = FX_Allocator_Alloc(pAllocator, FX_BYTE, m_nTotalSize);
+ m_Blocks.Add(block);
+ } else {
+ m_Blocks[0] = FX_Allocator_Realloc(pAllocator, FX_BYTE, m_Blocks[0], m_nTotalSize);
+ }
+ if (!m_Blocks[0]) {
+ m_Blocks.RemoveAll();
+ return FALSE;
+ }
+ }
+ FXSYS_memcpy32((FX_LPBYTE)m_Blocks[0] + (size_t)offset, buffer, size);
+ if (m_nCurSize < m_nCurPos) {
+ m_nCurSize = m_nCurPos;
+ }
+ return TRUE;
+ }
+ if (!ExpandBlocks((size_t)offset + size)) {
+ return FALSE;
+ }
+ m_nCurPos = (size_t)offset + size;
+ size_t nStartBlock = (size_t)offset / m_nGrowSize;
+ offset -= (FX_FILESIZE)(nStartBlock * m_nGrowSize);
+ while (size) {
+ size_t nWrite = m_nGrowSize - (size_t)offset;
+ if (nWrite > size) {
+ nWrite = size;
+ }
+ FXSYS_memcpy32((FX_LPBYTE)m_Blocks[(int)nStartBlock] + (size_t)offset, buffer, nWrite);
+ buffer = ((FX_LPBYTE)buffer) + nWrite;
+ size -= nWrite;
+ nStartBlock ++;
+ offset = 0;
+ }
+ return TRUE;
+ }
+ virtual FX_BOOL Flush()
+ {
+ return TRUE;
+ }
+ virtual FX_BOOL IsConsecutive() const
+ {
+ return m_dwFlags & FX_MEMSTREAM_Consecutive;
+ }
+ virtual void EstimateSize(size_t nInitSize, size_t nGrowSize)
+ {
+ if (m_dwFlags & FX_MEMSTREAM_Consecutive) {
+ if (m_Blocks.GetSize() < 1) {
+ FX_LPBYTE pBlock = FX_Allocator_Alloc(m_Blocks.m_pAllocator, FX_BYTE, FX_MAX(nInitSize, 4096));
+ if (pBlock) {
+ m_Blocks.Add(pBlock);
+ }
+ }
+ m_nGrowSize = FX_MAX(nGrowSize, 4096);
+ } else if (m_Blocks.GetSize() < 1) {
+ m_nGrowSize = FX_MAX(nGrowSize, 4096);
+ }
+ }
+ virtual FX_LPBYTE GetBuffer() const
+ {
+ return m_Blocks.GetSize() ? (FX_LPBYTE)m_Blocks[0] : NULL;
+ }
+ virtual void AttachBuffer(FX_LPBYTE pBuffer, size_t nSize, FX_BOOL bTakeOver = FALSE)
+ {
+ if (!(m_dwFlags & FX_MEMSTREAM_Consecutive)) {
+ return;
+ }
+ m_Blocks.RemoveAll();
+ m_Blocks.Add(pBuffer);
+ m_nTotalSize = m_nCurSize = nSize;
+ m_nCurPos = 0;
+ m_dwFlags = FX_MEMSTREAM_Consecutive | (bTakeOver ? FX_MEMSTREAM_TakeOver : 0);
+ ClearRange();
+ }
+ virtual void DetachBuffer()
+ {
+ if (!(m_dwFlags & FX_MEMSTREAM_Consecutive)) {
+ return;
+ }
+ m_Blocks.RemoveAll();
+ m_nTotalSize = m_nCurSize = m_nCurPos = 0;
+ m_dwFlags = FX_MEMSTREAM_TakeOver;
+ ClearRange();
+ }
+protected:
+ CFX_PtrArray m_Blocks;
+ FX_DWORD m_dwCount;
+ size_t m_nTotalSize;
+ size_t m_nCurSize;
+ size_t m_nCurPos;
+ size_t m_nGrowSize;
+ FX_DWORD m_dwFlags;
+ FX_BOOL m_bUseRange;
+ size_t m_nOffset;
+ size_t m_nSize;
+ FX_BOOL ExpandBlocks(size_t size)
+ {
+ if (m_nCurSize < size) {
+ m_nCurSize = size;
+ }
+ if (size <= m_nTotalSize) {
+ return TRUE;
+ }
+ FX_INT32 iCount = m_Blocks.GetSize();
+ size = (size - m_nTotalSize + m_nGrowSize - 1) / m_nGrowSize;
+ m_Blocks.SetSize(m_Blocks.GetSize() + (FX_INT32)size, -1);
+ IFX_Allocator* pAllocator = m_Blocks.m_pAllocator;
+ while (size --) {
+ FX_LPBYTE pBlock = FX_Allocator_Alloc(pAllocator, FX_BYTE, m_nGrowSize);
+ if (!pBlock) {
+ return FALSE;
+ }
+ m_Blocks.SetAt(iCount ++, pBlock);
+ m_nTotalSize += m_nGrowSize;
+ }
+ return TRUE;
+ }
+};
+#ifdef __cplusplus
+extern "C" {
+#endif
+#define MT_N 848
+#define MT_M 456
+#define MT_Matrix_A 0x9908b0df
+#define MT_Upper_Mask 0x80000000
+#define MT_Lower_Mask 0x7fffffff
+typedef struct _FX_MTRANDOMCONTEXT {
+ _FX_MTRANDOMCONTEXT()
+ {
+ mti = MT_N + 1;
+ bHaveSeed = FALSE;
+ }
+ FX_DWORD mti;
+ FX_BOOL bHaveSeed;
+ FX_DWORD mt[MT_N];
+} FX_MTRANDOMCONTEXT, * FX_LPMTRANDOMCONTEXT;
+typedef FX_MTRANDOMCONTEXT const * FX_LPCMTRANDOMCONTEXT;
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+FX_BOOL FX_GenerateCryptoRandom(FX_LPDWORD pBuffer, FX_INT32 iCount);
+#endif
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/core/src/fxcrt/fx_basic_array.cpp b/core/src/fxcrt/fx_basic_array.cpp
index 36857ce336..93f2b2fec5 100644
--- a/core/src/fxcrt/fx_basic_array.cpp
+++ b/core/src/fxcrt/fx_basic_array.cpp
@@ -1,365 +1,365 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../include/fxcrt/fx_basic.h"
-CFX_BasicArray::CFX_BasicArray(int unit_size, IFX_Allocator* pAllocator)
- : m_pAllocator(pAllocator)
- , m_pData(NULL)
- , m_nSize(0)
- , m_nMaxSize(0)
- , m_nGrowBy(0)
-{
- if (unit_size < 0 || unit_size > (1 << 28)) {
- m_nUnitSize = 4;
- } else {
- m_nUnitSize = unit_size;
- }
-}
-CFX_BasicArray::~CFX_BasicArray()
-{
- FX_Allocator_Free(m_pAllocator, m_pData);
-}
-FX_BOOL CFX_BasicArray::SetSize(int nNewSize, int nGrowBy)
-{
- if (nNewSize < 0 || nNewSize > (1 << 28) / m_nUnitSize) {
- m_pData = NULL;
- m_nSize = m_nMaxSize = 0;
- return FALSE;
- }
- if (nGrowBy >= 0) {
- m_nGrowBy = nGrowBy;
- }
- if (nNewSize == 0) {
- if (m_pData != NULL) {
- FX_Allocator_Free(m_pAllocator, m_pData);
- m_pData = NULL;
- }
- m_nSize = m_nMaxSize = 0;
- } else if (m_pData == NULL) {
- m_pData = FX_Allocator_Alloc(m_pAllocator, FX_BYTE, nNewSize * m_nUnitSize);
- if (!m_pData) {
- m_nSize = m_nMaxSize = 0;
- return FALSE;
- }
- FXSYS_memset32(m_pData, 0, nNewSize * m_nUnitSize);
- m_nSize = m_nMaxSize = nNewSize;
- } else if (nNewSize <= m_nMaxSize) {
- if (nNewSize > m_nSize) {
- FXSYS_memset32(m_pData + m_nSize * m_nUnitSize, 0, (nNewSize - m_nSize) * m_nUnitSize);
- }
- m_nSize = nNewSize;
- } else {
- int nGrowBy = m_nGrowBy;
- if (nGrowBy == 0) {
- nGrowBy = m_nSize / 8;
- nGrowBy = (nGrowBy < 4) ? 4 : ((nGrowBy > 1024) ? 1024 : nGrowBy);
- }
- int nNewMax;
- if (nNewSize < m_nMaxSize + nGrowBy) {
- nNewMax = m_nMaxSize + nGrowBy;
- } else {
- nNewMax = nNewSize;
- }
- FX_LPBYTE pNewData = FX_Allocator_Realloc(m_pAllocator, FX_BYTE, m_pData, nNewMax * m_nUnitSize);
- if (pNewData == NULL) {
- return FALSE;
- }
- FXSYS_memset32(pNewData + m_nSize * m_nUnitSize, 0, (nNewMax - m_nSize) * m_nUnitSize);
- m_pData = pNewData;
- m_nSize = nNewSize;
- m_nMaxSize = nNewMax;
- }
- return TRUE;
-}
-FX_BOOL CFX_BasicArray::Append(const CFX_BasicArray& src)
-{
- int nOldSize = m_nSize;
- if (!SetSize(m_nSize + src.m_nSize, -1)) {
- return FALSE;
- }
- FXSYS_memcpy32(m_pData + nOldSize * m_nUnitSize, src.m_pData, src.m_nSize * m_nUnitSize);
- return TRUE;
-}
-FX_BOOL CFX_BasicArray::Copy(const CFX_BasicArray& src)
-{
- if (!SetSize(src.m_nSize, -1)) {
- return FALSE;
- }
- FXSYS_memcpy32(m_pData, src.m_pData, src.m_nSize * m_nUnitSize);
- return TRUE;
-}
-FX_LPBYTE CFX_BasicArray::InsertSpaceAt(int nIndex, int nCount)
-{
- if (nIndex < 0 || nCount <= 0) {
- return NULL;
- }
- if (nIndex >= m_nSize) {
- if (!SetSize(nIndex + nCount, -1)) {
- return NULL;
- }
- } else {
- int nOldSize = m_nSize;
- if (!SetSize(m_nSize + nCount, -1)) {
- return NULL;
- }
- FXSYS_memmove32(m_pData + (nIndex + nCount)*m_nUnitSize, m_pData + nIndex * m_nUnitSize,
- (nOldSize - nIndex) * m_nUnitSize);
- FXSYS_memset32(m_pData + nIndex * m_nUnitSize, 0, nCount * m_nUnitSize);
- }
- return m_pData + nIndex * m_nUnitSize;
-}
-FX_BOOL CFX_BasicArray::RemoveAt(int nIndex, int nCount)
-{
- if (nIndex < 0 || nCount <= 0 || m_nSize < nIndex + nCount) {
- return FALSE;
- }
- int nMoveCount = m_nSize - (nIndex + nCount);
- if (nMoveCount) {
- FXSYS_memmove32(m_pData + nIndex * m_nUnitSize, m_pData + (nIndex + nCount) * m_nUnitSize, nMoveCount * m_nUnitSize);
- }
- m_nSize -= nCount;
- return TRUE;
-}
-FX_BOOL CFX_BasicArray::InsertAt(int nStartIndex, const CFX_BasicArray* pNewArray)
-{
- if (pNewArray == NULL) {
- return FALSE;
- }
- if (pNewArray->m_nSize == 0) {
- return TRUE;
- }
- if (!InsertSpaceAt(nStartIndex, pNewArray->m_nSize)) {
- return FALSE;
- }
- FXSYS_memcpy32(m_pData + nStartIndex * m_nUnitSize, pNewArray->m_pData, pNewArray->m_nSize * m_nUnitSize);
- return TRUE;
-}
-const void* CFX_BasicArray::GetDataPtr(int index) const
-{
- if (index < 0 || index >= m_nSize || m_pData == NULL) {
- return NULL;
- }
- return m_pData + index * m_nUnitSize;
-}
-CFX_BaseSegmentedArray::CFX_BaseSegmentedArray(int unit_size, int segment_units, int index_size, IFX_Allocator* pAllocator)
- : m_pAllocator(pAllocator)
- , m_UnitSize(unit_size)
- , m_SegmentSize(segment_units)
- , m_IndexSize(index_size)
- , m_IndexDepth(0)
- , m_DataSize(0)
- , m_pIndex(NULL)
-{
-}
-void CFX_BaseSegmentedArray::SetUnitSize(int unit_size, int segment_units, int index_size)
-{
- ASSERT(m_DataSize == 0);
- m_UnitSize = unit_size;
- m_SegmentSize = segment_units;
- m_IndexSize = index_size;
-}
-CFX_BaseSegmentedArray::~CFX_BaseSegmentedArray()
-{
- RemoveAll();
-}
-static void _ClearIndex(IFX_Allocator* pAllcator, int level, int size, void** pIndex)
-{
- if (level == 0) {
- FX_Allocator_Free(pAllcator, pIndex);
- return;
- }
- for (int i = 0; i < size; i ++) {
- if (pIndex[i] == NULL) {
- continue;
- }
- _ClearIndex(pAllcator, level - 1, size, (void**)pIndex[i]);
- }
- FX_Allocator_Free(pAllcator, pIndex);
-}
-void CFX_BaseSegmentedArray::RemoveAll()
-{
- if (m_pIndex == NULL) {
- return;
- }
- _ClearIndex(m_pAllocator, m_IndexDepth, m_IndexSize, (void**)m_pIndex);
- m_pIndex = NULL;
- m_IndexDepth = 0;
- m_DataSize = 0;
-}
-void* CFX_BaseSegmentedArray::Add()
-{
- if (m_DataSize % m_SegmentSize) {
- return GetAt(m_DataSize ++);
- }
- void* pSegment = FX_Allocator_Alloc(m_pAllocator, FX_BYTE, m_UnitSize * m_SegmentSize);
- if (!pSegment) {
- return NULL;
- }
- if (m_pIndex == NULL) {
- m_pIndex = pSegment;
- m_DataSize ++;
- return pSegment;
- }
- if (m_IndexDepth == 0) {
- void** pIndex = (void**)FX_Allocator_Alloc(m_pAllocator, void*, m_IndexSize);
- if (pIndex == NULL) {
- FX_Allocator_Free(m_pAllocator, pSegment);
- return NULL;
- }
- FXSYS_memset32(pIndex, 0, sizeof(void*) * m_IndexSize);
- pIndex[0] = m_pIndex;
- pIndex[1] = pSegment;
- m_pIndex = pIndex;
- m_DataSize ++;
- m_IndexDepth ++;
- return pSegment;
- }
- int seg_index = m_DataSize / m_SegmentSize;
- if (seg_index % m_IndexSize) {
- void** pIndex = GetIndex(seg_index);
- pIndex[seg_index % m_IndexSize] = pSegment;
- m_DataSize ++;
- return pSegment;
- }
- int tree_size = 1;
- int i;
- for (i = 0; i < m_IndexDepth; i ++) {
- tree_size *= m_IndexSize;
- }
- if (m_DataSize == tree_size * m_SegmentSize) {
- void** pIndex = (void**)FX_Allocator_Alloc(m_pAllocator, void*, m_IndexSize);
- if (pIndex == NULL) {
- FX_Allocator_Free(m_pAllocator, pSegment);
- return NULL;
- }
- FXSYS_memset32(pIndex, 0, sizeof(void*) * m_IndexSize);
- pIndex[0] = m_pIndex;
- m_pIndex = pIndex;
- m_IndexDepth ++;
- } else {
- tree_size /= m_IndexSize;
- }
- void** pSpot = (void**)m_pIndex;
- for (i = 1; i < m_IndexDepth; i ++) {
- if (pSpot[seg_index / tree_size] == NULL) {
- pSpot[seg_index / tree_size] = (void*)FX_Allocator_Alloc(m_pAllocator, void*, m_IndexSize);
- if (pSpot[seg_index / tree_size] == NULL) {
- break;
- }
- FXSYS_memset32(pSpot[seg_index / tree_size], 0, sizeof(void*) * m_IndexSize);
- }
- pSpot = (void**)pSpot[seg_index / tree_size];
- seg_index = seg_index % tree_size;
- tree_size /= m_IndexSize;
- }
- if (i < m_IndexDepth) {
- FX_Allocator_Free(m_pAllocator, pSegment);
- RemoveAll();
- return NULL;
- }
- pSpot[seg_index % m_IndexSize] = pSegment;
- m_DataSize ++;
- return pSegment;
-}
-void** CFX_BaseSegmentedArray::GetIndex(int seg_index) const
-{
- ASSERT(m_IndexDepth != 0);
- if (m_IndexDepth == 1) {
- return (void**)m_pIndex;
- } else if (m_IndexDepth == 2) {
- return (void**)((void**)m_pIndex)[seg_index / m_IndexSize];
- }
- int tree_size = 1;
- int i;
- for (i = 1; i < m_IndexDepth; i ++) {
- tree_size *= m_IndexSize;
- }
- void** pSpot = (void**)m_pIndex;
- for (i = 1; i < m_IndexDepth; i ++) {
- pSpot = (void**)pSpot[seg_index / tree_size];
- seg_index = seg_index % tree_size;
- tree_size /= m_IndexSize;
- }
- return pSpot;
-}
-void* CFX_BaseSegmentedArray::IterateSegment(FX_LPCBYTE pSegment, int count, FX_BOOL (*callback)(void* param, void* pData), void* param) const
-{
- for (int i = 0; i < count; i ++) {
- if (!callback(param, (void*)(pSegment + i * m_UnitSize))) {
- return (void*)(pSegment + i * m_UnitSize);
- }
- }
- return NULL;
-}
-void* CFX_BaseSegmentedArray::IterateIndex(int level, int& start, void** pIndex, FX_BOOL (*callback)(void* param, void* pData), void* param) const
-{
- if (level == 0) {
- int count = m_DataSize - start;
- if (count > m_SegmentSize) {
- count = m_SegmentSize;
- }
- start += count;
- return IterateSegment((FX_LPCBYTE)pIndex, count, callback, param);
- }
- for (int i = 0; i < m_IndexSize; i ++) {
- if (pIndex[i] == NULL) {
- continue;
- }
- void* p = IterateIndex(level - 1, start, (void**)pIndex[i], callback, param);
- if (p) {
- return p;
- }
- }
- return NULL;
-}
-void* CFX_BaseSegmentedArray::Iterate(FX_BOOL (*callback)(void* param, void* pData), void* param) const
-{
- if (m_pIndex == NULL) {
- return NULL;
- }
- int start = 0;
- return IterateIndex(m_IndexDepth, start, (void**)m_pIndex, callback, param);
-}
-void* CFX_BaseSegmentedArray::GetAt(int index) const
-{
- if (index < 0 || index >= m_DataSize) {
- return NULL;
- }
- if (m_IndexDepth == 0) {
- return (FX_LPBYTE)m_pIndex + m_UnitSize * index;
- }
- int seg_index = index / m_SegmentSize;
- return (FX_LPBYTE)GetIndex(seg_index)[seg_index % m_IndexSize] + (index % m_SegmentSize) * m_UnitSize;
-}
-void CFX_BaseSegmentedArray::Delete(int index, int count)
-{
- if(index < 0 || count < 1 || index + count > m_DataSize) {
- return;
- }
- int i;
- for (i = index; i < m_DataSize - count; i ++) {
- FX_BYTE* pSrc = (FX_BYTE*)GetAt(i + count);
- FX_BYTE* pDest = (FX_BYTE*)GetAt(i);
- for (int j = 0; j < m_UnitSize; j ++) {
- pDest[j] = pSrc[j];
- }
- }
- int new_segs = (m_DataSize - count + m_SegmentSize - 1) / m_SegmentSize;
- int old_segs = (m_DataSize + m_SegmentSize - 1) / m_SegmentSize;
- if (new_segs < old_segs) {
- if(m_IndexDepth) {
- for (i = new_segs; i < old_segs; i ++) {
- void** pIndex = GetIndex(i);
- FX_Allocator_Free(m_pAllocator, pIndex[i % m_IndexSize]);
- pIndex[i % m_IndexSize] = NULL;
- }
- } else {
- FX_Allocator_Free(m_pAllocator, m_pIndex);
- m_pIndex = NULL;
- }
- }
- m_DataSize -= count;
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fxcrt/fx_basic.h"
+CFX_BasicArray::CFX_BasicArray(int unit_size, IFX_Allocator* pAllocator)
+ : m_pAllocator(pAllocator)
+ , m_pData(NULL)
+ , m_nSize(0)
+ , m_nMaxSize(0)
+ , m_nGrowBy(0)
+{
+ if (unit_size < 0 || unit_size > (1 << 28)) {
+ m_nUnitSize = 4;
+ } else {
+ m_nUnitSize = unit_size;
+ }
+}
+CFX_BasicArray::~CFX_BasicArray()
+{
+ FX_Allocator_Free(m_pAllocator, m_pData);
+}
+FX_BOOL CFX_BasicArray::SetSize(int nNewSize, int nGrowBy)
+{
+ if (nNewSize < 0 || nNewSize > (1 << 28) / m_nUnitSize) {
+ m_pData = NULL;
+ m_nSize = m_nMaxSize = 0;
+ return FALSE;
+ }
+ if (nGrowBy >= 0) {
+ m_nGrowBy = nGrowBy;
+ }
+ if (nNewSize == 0) {
+ if (m_pData != NULL) {
+ FX_Allocator_Free(m_pAllocator, m_pData);
+ m_pData = NULL;
+ }
+ m_nSize = m_nMaxSize = 0;
+ } else if (m_pData == NULL) {
+ m_pData = FX_Allocator_Alloc(m_pAllocator, FX_BYTE, nNewSize * m_nUnitSize);
+ if (!m_pData) {
+ m_nSize = m_nMaxSize = 0;
+ return FALSE;
+ }
+ FXSYS_memset32(m_pData, 0, nNewSize * m_nUnitSize);
+ m_nSize = m_nMaxSize = nNewSize;
+ } else if (nNewSize <= m_nMaxSize) {
+ if (nNewSize > m_nSize) {
+ FXSYS_memset32(m_pData + m_nSize * m_nUnitSize, 0, (nNewSize - m_nSize) * m_nUnitSize);
+ }
+ m_nSize = nNewSize;
+ } else {
+ int nGrowBy = m_nGrowBy;
+ if (nGrowBy == 0) {
+ nGrowBy = m_nSize / 8;
+ nGrowBy = (nGrowBy < 4) ? 4 : ((nGrowBy > 1024) ? 1024 : nGrowBy);
+ }
+ int nNewMax;
+ if (nNewSize < m_nMaxSize + nGrowBy) {
+ nNewMax = m_nMaxSize + nGrowBy;
+ } else {
+ nNewMax = nNewSize;
+ }
+ FX_LPBYTE pNewData = FX_Allocator_Realloc(m_pAllocator, FX_BYTE, m_pData, nNewMax * m_nUnitSize);
+ if (pNewData == NULL) {
+ return FALSE;
+ }
+ FXSYS_memset32(pNewData + m_nSize * m_nUnitSize, 0, (nNewMax - m_nSize) * m_nUnitSize);
+ m_pData = pNewData;
+ m_nSize = nNewSize;
+ m_nMaxSize = nNewMax;
+ }
+ return TRUE;
+}
+FX_BOOL CFX_BasicArray::Append(const CFX_BasicArray& src)
+{
+ int nOldSize = m_nSize;
+ if (!SetSize(m_nSize + src.m_nSize, -1)) {
+ return FALSE;
+ }
+ FXSYS_memcpy32(m_pData + nOldSize * m_nUnitSize, src.m_pData, src.m_nSize * m_nUnitSize);
+ return TRUE;
+}
+FX_BOOL CFX_BasicArray::Copy(const CFX_BasicArray& src)
+{
+ if (!SetSize(src.m_nSize, -1)) {
+ return FALSE;
+ }
+ FXSYS_memcpy32(m_pData, src.m_pData, src.m_nSize * m_nUnitSize);
+ return TRUE;
+}
+FX_LPBYTE CFX_BasicArray::InsertSpaceAt(int nIndex, int nCount)
+{
+ if (nIndex < 0 || nCount <= 0) {
+ return NULL;
+ }
+ if (nIndex >= m_nSize) {
+ if (!SetSize(nIndex + nCount, -1)) {
+ return NULL;
+ }
+ } else {
+ int nOldSize = m_nSize;
+ if (!SetSize(m_nSize + nCount, -1)) {
+ return NULL;
+ }
+ FXSYS_memmove32(m_pData + (nIndex + nCount)*m_nUnitSize, m_pData + nIndex * m_nUnitSize,
+ (nOldSize - nIndex) * m_nUnitSize);
+ FXSYS_memset32(m_pData + nIndex * m_nUnitSize, 0, nCount * m_nUnitSize);
+ }
+ return m_pData + nIndex * m_nUnitSize;
+}
+FX_BOOL CFX_BasicArray::RemoveAt(int nIndex, int nCount)
+{
+ if (nIndex < 0 || nCount <= 0 || m_nSize < nIndex + nCount) {
+ return FALSE;
+ }
+ int nMoveCount = m_nSize - (nIndex + nCount);
+ if (nMoveCount) {
+ FXSYS_memmove32(m_pData + nIndex * m_nUnitSize, m_pData + (nIndex + nCount) * m_nUnitSize, nMoveCount * m_nUnitSize);
+ }
+ m_nSize -= nCount;
+ return TRUE;
+}
+FX_BOOL CFX_BasicArray::InsertAt(int nStartIndex, const CFX_BasicArray* pNewArray)
+{
+ if (pNewArray == NULL) {
+ return FALSE;
+ }
+ if (pNewArray->m_nSize == 0) {
+ return TRUE;
+ }
+ if (!InsertSpaceAt(nStartIndex, pNewArray->m_nSize)) {
+ return FALSE;
+ }
+ FXSYS_memcpy32(m_pData + nStartIndex * m_nUnitSize, pNewArray->m_pData, pNewArray->m_nSize * m_nUnitSize);
+ return TRUE;
+}
+const void* CFX_BasicArray::GetDataPtr(int index) const
+{
+ if (index < 0 || index >= m_nSize || m_pData == NULL) {
+ return NULL;
+ }
+ return m_pData + index * m_nUnitSize;
+}
+CFX_BaseSegmentedArray::CFX_BaseSegmentedArray(int unit_size, int segment_units, int index_size, IFX_Allocator* pAllocator)
+ : m_pAllocator(pAllocator)
+ , m_UnitSize(unit_size)
+ , m_SegmentSize(segment_units)
+ , m_IndexSize(index_size)
+ , m_IndexDepth(0)
+ , m_DataSize(0)
+ , m_pIndex(NULL)
+{
+}
+void CFX_BaseSegmentedArray::SetUnitSize(int unit_size, int segment_units, int index_size)
+{
+ ASSERT(m_DataSize == 0);
+ m_UnitSize = unit_size;
+ m_SegmentSize = segment_units;
+ m_IndexSize = index_size;
+}
+CFX_BaseSegmentedArray::~CFX_BaseSegmentedArray()
+{
+ RemoveAll();
+}
+static void _ClearIndex(IFX_Allocator* pAllcator, int level, int size, void** pIndex)
+{
+ if (level == 0) {
+ FX_Allocator_Free(pAllcator, pIndex);
+ return;
+ }
+ for (int i = 0; i < size; i ++) {
+ if (pIndex[i] == NULL) {
+ continue;
+ }
+ _ClearIndex(pAllcator, level - 1, size, (void**)pIndex[i]);
+ }
+ FX_Allocator_Free(pAllcator, pIndex);
+}
+void CFX_BaseSegmentedArray::RemoveAll()
+{
+ if (m_pIndex == NULL) {
+ return;
+ }
+ _ClearIndex(m_pAllocator, m_IndexDepth, m_IndexSize, (void**)m_pIndex);
+ m_pIndex = NULL;
+ m_IndexDepth = 0;
+ m_DataSize = 0;
+}
+void* CFX_BaseSegmentedArray::Add()
+{
+ if (m_DataSize % m_SegmentSize) {
+ return GetAt(m_DataSize ++);
+ }
+ void* pSegment = FX_Allocator_Alloc(m_pAllocator, FX_BYTE, m_UnitSize * m_SegmentSize);
+ if (!pSegment) {
+ return NULL;
+ }
+ if (m_pIndex == NULL) {
+ m_pIndex = pSegment;
+ m_DataSize ++;
+ return pSegment;
+ }
+ if (m_IndexDepth == 0) {
+ void** pIndex = (void**)FX_Allocator_Alloc(m_pAllocator, void*, m_IndexSize);
+ if (pIndex == NULL) {
+ FX_Allocator_Free(m_pAllocator, pSegment);
+ return NULL;
+ }
+ FXSYS_memset32(pIndex, 0, sizeof(void*) * m_IndexSize);
+ pIndex[0] = m_pIndex;
+ pIndex[1] = pSegment;
+ m_pIndex = pIndex;
+ m_DataSize ++;
+ m_IndexDepth ++;
+ return pSegment;
+ }
+ int seg_index = m_DataSize / m_SegmentSize;
+ if (seg_index % m_IndexSize) {
+ void** pIndex = GetIndex(seg_index);
+ pIndex[seg_index % m_IndexSize] = pSegment;
+ m_DataSize ++;
+ return pSegment;
+ }
+ int tree_size = 1;
+ int i;
+ for (i = 0; i < m_IndexDepth; i ++) {
+ tree_size *= m_IndexSize;
+ }
+ if (m_DataSize == tree_size * m_SegmentSize) {
+ void** pIndex = (void**)FX_Allocator_Alloc(m_pAllocator, void*, m_IndexSize);
+ if (pIndex == NULL) {
+ FX_Allocator_Free(m_pAllocator, pSegment);
+ return NULL;
+ }
+ FXSYS_memset32(pIndex, 0, sizeof(void*) * m_IndexSize);
+ pIndex[0] = m_pIndex;
+ m_pIndex = pIndex;
+ m_IndexDepth ++;
+ } else {
+ tree_size /= m_IndexSize;
+ }
+ void** pSpot = (void**)m_pIndex;
+ for (i = 1; i < m_IndexDepth; i ++) {
+ if (pSpot[seg_index / tree_size] == NULL) {
+ pSpot[seg_index / tree_size] = (void*)FX_Allocator_Alloc(m_pAllocator, void*, m_IndexSize);
+ if (pSpot[seg_index / tree_size] == NULL) {
+ break;
+ }
+ FXSYS_memset32(pSpot[seg_index / tree_size], 0, sizeof(void*) * m_IndexSize);
+ }
+ pSpot = (void**)pSpot[seg_index / tree_size];
+ seg_index = seg_index % tree_size;
+ tree_size /= m_IndexSize;
+ }
+ if (i < m_IndexDepth) {
+ FX_Allocator_Free(m_pAllocator, pSegment);
+ RemoveAll();
+ return NULL;
+ }
+ pSpot[seg_index % m_IndexSize] = pSegment;
+ m_DataSize ++;
+ return pSegment;
+}
+void** CFX_BaseSegmentedArray::GetIndex(int seg_index) const
+{
+ ASSERT(m_IndexDepth != 0);
+ if (m_IndexDepth == 1) {
+ return (void**)m_pIndex;
+ } else if (m_IndexDepth == 2) {
+ return (void**)((void**)m_pIndex)[seg_index / m_IndexSize];
+ }
+ int tree_size = 1;
+ int i;
+ for (i = 1; i < m_IndexDepth; i ++) {
+ tree_size *= m_IndexSize;
+ }
+ void** pSpot = (void**)m_pIndex;
+ for (i = 1; i < m_IndexDepth; i ++) {
+ pSpot = (void**)pSpot[seg_index / tree_size];
+ seg_index = seg_index % tree_size;
+ tree_size /= m_IndexSize;
+ }
+ return pSpot;
+}
+void* CFX_BaseSegmentedArray::IterateSegment(FX_LPCBYTE pSegment, int count, FX_BOOL (*callback)(void* param, void* pData), void* param) const
+{
+ for (int i = 0; i < count; i ++) {
+ if (!callback(param, (void*)(pSegment + i * m_UnitSize))) {
+ return (void*)(pSegment + i * m_UnitSize);
+ }
+ }
+ return NULL;
+}
+void* CFX_BaseSegmentedArray::IterateIndex(int level, int& start, void** pIndex, FX_BOOL (*callback)(void* param, void* pData), void* param) const
+{
+ if (level == 0) {
+ int count = m_DataSize - start;
+ if (count > m_SegmentSize) {
+ count = m_SegmentSize;
+ }
+ start += count;
+ return IterateSegment((FX_LPCBYTE)pIndex, count, callback, param);
+ }
+ for (int i = 0; i < m_IndexSize; i ++) {
+ if (pIndex[i] == NULL) {
+ continue;
+ }
+ void* p = IterateIndex(level - 1, start, (void**)pIndex[i], callback, param);
+ if (p) {
+ return p;
+ }
+ }
+ return NULL;
+}
+void* CFX_BaseSegmentedArray::Iterate(FX_BOOL (*callback)(void* param, void* pData), void* param) const
+{
+ if (m_pIndex == NULL) {
+ return NULL;
+ }
+ int start = 0;
+ return IterateIndex(m_IndexDepth, start, (void**)m_pIndex, callback, param);
+}
+void* CFX_BaseSegmentedArray::GetAt(int index) const
+{
+ if (index < 0 || index >= m_DataSize) {
+ return NULL;
+ }
+ if (m_IndexDepth == 0) {
+ return (FX_LPBYTE)m_pIndex + m_UnitSize * index;
+ }
+ int seg_index = index / m_SegmentSize;
+ return (FX_LPBYTE)GetIndex(seg_index)[seg_index % m_IndexSize] + (index % m_SegmentSize) * m_UnitSize;
+}
+void CFX_BaseSegmentedArray::Delete(int index, int count)
+{
+ if(index < 0 || count < 1 || index + count > m_DataSize) {
+ return;
+ }
+ int i;
+ for (i = index; i < m_DataSize - count; i ++) {
+ FX_BYTE* pSrc = (FX_BYTE*)GetAt(i + count);
+ FX_BYTE* pDest = (FX_BYTE*)GetAt(i);
+ for (int j = 0; j < m_UnitSize; j ++) {
+ pDest[j] = pSrc[j];
+ }
+ }
+ int new_segs = (m_DataSize - count + m_SegmentSize - 1) / m_SegmentSize;
+ int old_segs = (m_DataSize + m_SegmentSize - 1) / m_SegmentSize;
+ if (new_segs < old_segs) {
+ if(m_IndexDepth) {
+ for (i = new_segs; i < old_segs; i ++) {
+ void** pIndex = GetIndex(i);
+ FX_Allocator_Free(m_pAllocator, pIndex[i % m_IndexSize]);
+ pIndex[i % m_IndexSize] = NULL;
+ }
+ } else {
+ FX_Allocator_Free(m_pAllocator, m_pIndex);
+ m_pIndex = NULL;
+ }
+ }
+ m_DataSize -= count;
+}
diff --git a/core/src/fxcrt/fx_basic_bstring.cpp b/core/src/fxcrt/fx_basic_bstring.cpp
index f28b069efc..ef52447771 100644
--- a/core/src/fxcrt/fx_basic_bstring.cpp
+++ b/core/src/fxcrt/fx_basic_bstring.cpp
@@ -1,1204 +1,1204 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../include/fxcrt/fx_basic.h"
-static int _Buffer_itoa(char* buf, int i, FX_DWORD flags)
-{
- if (i == 0) {
- buf[0] = '0';
- return 1;
- }
- char buf1[32];
- int buf_pos = 31;
- FX_DWORD u = i;
- if ((flags & FXFORMAT_SIGNED) && i < 0) {
- u = -i;
- }
- int base = 10;
- FX_LPCSTR string = "0123456789abcdef";
- if (flags & FXFORMAT_HEX) {
- base = 16;
- if (flags & FXFORMAT_CAPITAL) {
- string = "0123456789ABCDEF";
- }
- }
- while (u != 0) {
- buf1[buf_pos--] = string[u % base];
- u = u / base;
- }
- if ((flags & FXFORMAT_SIGNED) && i < 0) {
- buf1[buf_pos--] = '-';
- }
- int len = 31 - buf_pos;
- for (int ii = 0; ii < len; ii ++) {
- buf[ii] = buf1[ii + buf_pos + 1];
- }
- return len;
-}
-CFX_ByteString CFX_ByteString::FormatInteger(int i, FX_DWORD flags)
-{
- char buf[32];
- return CFX_ByteStringC(buf, _Buffer_itoa(buf, i, flags));
-}
-static CFX_StringData* FX_AllocString(int nLen)
-{
- if (nLen == 0) {
- return NULL;
- }
- CFX_StringData* pData = (CFX_StringData*)FX_Alloc(FX_BYTE, sizeof(long) * 3 + (nLen + 1) * sizeof(char));
- if (!pData) {
- return NULL;
- }
- pData->m_nAllocLength = nLen;
- pData->m_nDataLength = nLen;
- pData->m_nRefs = 1;
- pData->m_String[nLen] = 0;
- return pData;
-}
-static void FX_ReleaseString(CFX_StringData* pData)
-{
- if (pData == NULL) {
- return;
- }
- pData->m_nRefs --;
- if (pData->m_nRefs <= 0) {
- FX_Free(pData);
- }
-}
-CFX_ByteString::~CFX_ByteString()
-{
- if (m_pData == NULL) {
- return;
- }
- m_pData->m_nRefs --;
- if (m_pData->m_nRefs < 1) {
- FX_Free(m_pData);
- }
-}
-CFX_ByteString::CFX_ByteString(FX_LPCSTR lpsz, FX_STRSIZE nLen)
-{
- if (nLen < 0) {
- nLen = lpsz ? (FX_STRSIZE)FXSYS_strlen(lpsz) : 0;
- }
- if (nLen) {
- m_pData = FX_AllocString(nLen);
- if (m_pData) {
- FXSYS_memcpy32(m_pData->m_String, lpsz, nLen * sizeof(char));
- }
- } else {
- m_pData = NULL;
- }
-}
-CFX_ByteString::CFX_ByteString(FX_LPCBYTE lpsz, FX_STRSIZE nLen)
-{
- if (nLen > 0) {
- m_pData = FX_AllocString(nLen);
- if (m_pData) {
- FXSYS_memcpy32(m_pData->m_String, lpsz, nLen * sizeof(char));
- }
- } else {
- m_pData = NULL;
- }
-}
-CFX_ByteString::CFX_ByteString(char ch)
-{
- m_pData = FX_AllocString(1);
- if (m_pData) {
- m_pData->m_String[0] = ch;
- }
-}
-CFX_ByteString::CFX_ByteString(const CFX_ByteString& stringSrc)
-{
- if (stringSrc.m_pData == NULL) {
- m_pData = NULL;
- return;
- }
- if (stringSrc.m_pData->m_nRefs >= 0) {
- m_pData = stringSrc.m_pData;
- m_pData->m_nRefs ++;
- } else {
- m_pData = NULL;
- *this = stringSrc;
- }
-}
-CFX_ByteString::CFX_ByteString(FX_BSTR stringSrc)
-{
- if (stringSrc.IsEmpty()) {
- m_pData = NULL;
- return;
- } else {
- m_pData = NULL;
- *this = stringSrc;
- }
-}
-CFX_ByteString::CFX_ByteString(FX_BSTR str1, FX_BSTR str2)
-{
- m_pData = NULL;
- int nNewLen = str1.GetLength() + str2.GetLength();
- if (nNewLen == 0) {
- return;
- }
- m_pData = FX_AllocString(nNewLen);
- if (m_pData) {
- FXSYS_memcpy32(m_pData->m_String, str1.GetCStr(), str1.GetLength());
- FXSYS_memcpy32(m_pData->m_String + str1.GetLength(), str2.GetCStr(), str2.GetLength());
- }
-}
-const CFX_ByteString& CFX_ByteString::operator=(FX_LPCSTR lpsz)
-{
- if (lpsz == NULL || lpsz[0] == 0) {
- Empty();
- } else {
- AssignCopy((FX_STRSIZE)FXSYS_strlen(lpsz), lpsz);
- }
- return *this;
-}
-const CFX_ByteString& CFX_ByteString::operator=(FX_BSTR str)
-{
- if (str.IsEmpty()) {
- Empty();
- } else {
- AssignCopy(str.GetLength(), str.GetCStr());
- }
- return *this;
-}
-const CFX_ByteString& CFX_ByteString::operator=(const CFX_ByteString& stringSrc)
-{
- if (m_pData == stringSrc.m_pData) {
- return *this;
- }
- if (stringSrc.IsEmpty()) {
- Empty();
- } else if ((m_pData && m_pData->m_nRefs < 0) ||
- (stringSrc.m_pData && stringSrc.m_pData->m_nRefs < 0)) {
- AssignCopy(stringSrc.m_pData->m_nDataLength, stringSrc.m_pData->m_String);
- } else {
- Empty();
- m_pData = stringSrc.m_pData;
- if (m_pData) {
- m_pData->m_nRefs ++;
- }
- }
- return *this;
-}
-const CFX_ByteString& CFX_ByteString::operator=(const CFX_BinaryBuf& buf)
-{
- Load(buf.GetBuffer(), buf.GetSize());
- return *this;
-}
-void CFX_ByteString::Load(FX_LPCBYTE buf, FX_STRSIZE len)
-{
- Empty();
- if (len) {
- m_pData = FX_AllocString(len);
- if (m_pData) {
- FXSYS_memcpy32(m_pData->m_String, buf, len * sizeof(char));
- }
- } else {
- m_pData = NULL;
- }
-}
-const CFX_ByteString& CFX_ByteString::operator+=(FX_LPCSTR lpsz)
-{
- if (lpsz) {
- ConcatInPlace((FX_STRSIZE)FXSYS_strlen(lpsz), lpsz);
- }
- return *this;
-}
-const CFX_ByteString& CFX_ByteString::operator+=(char ch)
-{
- ConcatInPlace(1, &ch);
- return *this;
-}
-const CFX_ByteString& CFX_ByteString::operator+=(const CFX_ByteString& string)
-{
- if (string.m_pData == NULL) {
- return *this;
- }
- ConcatInPlace(string.m_pData->m_nDataLength, string.m_pData->m_String);
- return *this;
-}
-const CFX_ByteString& CFX_ByteString::operator+=(FX_BSTR string)
-{
- if (string.IsEmpty()) {
- return *this;
- }
- ConcatInPlace(string.GetLength(), string.GetCStr());
- return *this;
-}
-bool CFX_ByteString::Equal(FX_BSTR str) const
-{
- if (m_pData == NULL) {
- return str.IsEmpty();
- }
- return m_pData->m_nDataLength == str.GetLength() &&
- FXSYS_memcmp32(m_pData->m_String, str.GetCStr(), str.GetLength()) == 0;
-}
-bool CFX_ByteString::operator ==(const CFX_ByteString& s2) const
-{
- if (m_pData == NULL) {
- return s2.IsEmpty();
- }
- if (s2.m_pData == NULL) {
- return false;
- }
- return m_pData->m_nDataLength == s2.m_pData->m_nDataLength &&
- FXSYS_memcmp32(m_pData->m_String, s2.m_pData->m_String, m_pData->m_nDataLength) == 0;
-}
-void CFX_ByteString::Empty()
-{
- if (m_pData == NULL) {
- return;
- }
- if (m_pData->m_nRefs > 1) {
- m_pData->m_nRefs --;
- } else {
- FX_Free(m_pData);
- }
- m_pData = NULL;
-}
-bool CFX_ByteString::EqualNoCase(FX_BSTR str) const
-{
- if (m_pData == NULL) {
- return str.IsEmpty();
- }
- FX_STRSIZE len = str.GetLength();
- if (m_pData->m_nDataLength != len) {
- return false;
- }
- FX_LPCBYTE pThis = (FX_LPCBYTE)m_pData->m_String;
- FX_LPCBYTE pThat = (FX_LPCBYTE)str;
- for (FX_STRSIZE i = 0; i < len; i ++) {
- if ((*pThis) != (*pThat)) {
- FX_BYTE bThis = *pThis;
- if (bThis >= 'A' && bThis <= 'Z') {
- bThis += 'a' - 'A';
- }
- FX_BYTE bThat = *pThat;
- if (bThat >= 'A' && bThat <= 'Z') {
- bThat += 'a' - 'A';
- }
- if (bThis != bThat) {
- return false;
- }
- }
- pThis ++;
- pThat ++;
- }
- return true;
-}
-void CFX_ByteString::AssignCopy(FX_STRSIZE nSrcLen, FX_LPCSTR lpszSrcData)
-{
- AllocBeforeWrite(nSrcLen);
- FXSYS_memcpy32(m_pData->m_String, lpszSrcData, nSrcLen * sizeof(char));
- m_pData->m_nDataLength = nSrcLen;
- m_pData->m_String[nSrcLen] = 0;
-}
-void CFX_ByteString::CopyBeforeWrite()
-{
- if (m_pData == NULL || m_pData->m_nRefs <= 1) {
- return;
- }
- CFX_StringData* pData = m_pData;
- m_pData->m_nRefs --;
- FX_STRSIZE nDataLength = pData->m_nDataLength;
- m_pData = FX_AllocString(nDataLength);
- if (m_pData != NULL) {
- FXSYS_memcpy32(m_pData->m_String, pData->m_String, (nDataLength + 1) * sizeof(char));
- }
-}
-void CFX_ByteString::AllocBeforeWrite(FX_STRSIZE nLen)
-{
- if (m_pData && m_pData->m_nRefs <= 1 && m_pData->m_nAllocLength >= nLen) {
- return;
- }
- Empty();
- m_pData = FX_AllocString(nLen);
-}
-void CFX_ByteString::ReleaseBuffer(FX_STRSIZE nNewLength)
-{
- if (m_pData == NULL) {
- return;
- }
- CopyBeforeWrite();
- if (nNewLength == -1) {
- nNewLength = (FX_STRSIZE)FXSYS_strlen((FX_LPCSTR)m_pData->m_String);
- }
- if (nNewLength == 0) {
- Empty();
- return;
- }
- FXSYS_assert(nNewLength <= m_pData->m_nAllocLength);
- m_pData->m_nDataLength = nNewLength;
- m_pData->m_String[nNewLength] = 0;
-}
-FX_LPSTR CFX_ByteString::LockBuffer()
-{
- if (m_pData == NULL) {
- return NULL;
- }
- FX_LPSTR lpsz = GetBuffer(0);
- m_pData->m_nRefs = -1;
- return lpsz;
-}
-void CFX_ByteString::Reserve(FX_STRSIZE len)
-{
- GetBuffer(len);
- ReleaseBuffer(GetLength());
-}
-FX_LPSTR CFX_ByteString::GetBuffer(FX_STRSIZE nMinBufLength)
-{
- if (m_pData == NULL && nMinBufLength == 0) {
- return NULL;
- }
- if (m_pData && m_pData->m_nRefs <= 1 && m_pData->m_nAllocLength >= nMinBufLength) {
- return m_pData->m_String;
- }
- if (m_pData == NULL) {
- m_pData = FX_AllocString(nMinBufLength);
- if (!m_pData) {
- return NULL;
- }
- m_pData->m_nDataLength = 0;
- m_pData->m_String[0] = 0;
- return m_pData->m_String;
- }
- CFX_StringData* pOldData = m_pData;
- FX_STRSIZE nOldLen = pOldData->m_nDataLength;
- if (nMinBufLength < nOldLen) {
- nMinBufLength = nOldLen;
- }
- m_pData = FX_AllocString(nMinBufLength);
- if (!m_pData) {
- return NULL;
- }
- FXSYS_memcpy32(m_pData->m_String, pOldData->m_String, (nOldLen + 1)*sizeof(char));
- m_pData->m_nDataLength = nOldLen;
- pOldData->m_nRefs --;
- if (pOldData->m_nRefs <= 0) {
- FX_Free(pOldData);
- }
- return m_pData->m_String;
-}
-FX_STRSIZE CFX_ByteString::Delete(FX_STRSIZE nIndex, FX_STRSIZE nCount)
-{
- if (m_pData == NULL) {
- return 0;
- }
- if (nIndex < 0) {
- nIndex = 0;
- }
- FX_STRSIZE nOldLength = m_pData->m_nDataLength;
- if (nCount > 0 && nIndex < nOldLength) {
- FX_STRSIZE mLength = nIndex + nCount;
- if (mLength >= nOldLength) {
- m_pData->m_nDataLength = nIndex;
- return m_pData->m_nDataLength;
- }
- CopyBeforeWrite();
- int nBytesToCopy = nOldLength - mLength + 1;
- FXSYS_memmove32(m_pData->m_String + nIndex,
- m_pData->m_String + mLength, nBytesToCopy * sizeof(char));
- m_pData->m_nDataLength = nOldLength - nCount;
- }
- return m_pData->m_nDataLength;
-}
-void CFX_ByteString::ConcatInPlace(FX_STRSIZE nSrcLen, FX_LPCSTR lpszSrcData)
-{
- if (nSrcLen == 0 || lpszSrcData == NULL) {
- return;
- }
- if (m_pData == NULL) {
- m_pData = FX_AllocString(nSrcLen);
- if (!m_pData) {
- return;
- }
- FXSYS_memcpy32(m_pData->m_String, lpszSrcData, nSrcLen * sizeof(char));
- return;
- }
- if (m_pData->m_nRefs > 1 || m_pData->m_nDataLength + nSrcLen > m_pData->m_nAllocLength) {
- CFX_StringData* pOldData = m_pData;
- ConcatCopy(m_pData->m_nDataLength, m_pData->m_String, nSrcLen, lpszSrcData);
- FX_ReleaseString(pOldData);
- } else {
- FXSYS_memcpy32(m_pData->m_String + m_pData->m_nDataLength, lpszSrcData, nSrcLen * sizeof(char));
- m_pData->m_nDataLength += nSrcLen;
- m_pData->m_String[m_pData->m_nDataLength] = 0;
- }
-}
-void CFX_ByteString::ConcatCopy(FX_STRSIZE nSrc1Len, FX_LPCSTR lpszSrc1Data,
- FX_STRSIZE nSrc2Len, FX_LPCSTR lpszSrc2Data)
-{
- int nNewLen = nSrc1Len + nSrc2Len;
- if (nNewLen == 0) {
- return;
- }
- m_pData = FX_AllocString(nNewLen);
- if (m_pData) {
- FXSYS_memcpy32(m_pData->m_String, lpszSrc1Data, nSrc1Len * sizeof(char));
- FXSYS_memcpy32(m_pData->m_String + nSrc1Len, lpszSrc2Data, nSrc2Len * sizeof(char));
- }
-}
-CFX_ByteString CFX_ByteString::Mid(FX_STRSIZE nFirst) const
-{
- if (m_pData == NULL) {
- return CFX_ByteString();
- }
- return Mid(nFirst, m_pData->m_nDataLength - nFirst);
-}
-CFX_ByteString CFX_ByteString::Mid(FX_STRSIZE nFirst, FX_STRSIZE nCount) const
-{
- if (nFirst < 0) {
- nFirst = 0;
- }
- if (nCount < 0) {
- nCount = 0;
- }
- if (nFirst + nCount > m_pData->m_nDataLength) {
- nCount = m_pData->m_nDataLength - nFirst;
- }
- if (nFirst > m_pData->m_nDataLength) {
- nCount = 0;
- }
- if (nFirst == 0 && nFirst + nCount == m_pData->m_nDataLength) {
- return *this;
- }
- CFX_ByteString dest;
- AllocCopy(dest, nCount, nFirst, 0);
- return dest;
-}
-void CFX_ByteString::AllocCopy(CFX_ByteString& dest, FX_STRSIZE nCopyLen, FX_STRSIZE nCopyIndex,
- FX_STRSIZE nExtraLen) const
-{
- FX_STRSIZE nNewLen = nCopyLen + nExtraLen;
- if (nNewLen == 0) {
- return;
- }
- ASSERT(dest.m_pData == NULL);
- dest.m_pData = FX_AllocString(nNewLen);
- if (dest.m_pData) {
- FXSYS_memcpy32(dest.m_pData->m_String, m_pData->m_String + nCopyIndex, nCopyLen * sizeof(char));
- }
-}
-#define FORCE_ANSI 0x10000
-#define FORCE_UNICODE 0x20000
-#define FORCE_INT64 0x40000
-void CFX_ByteString::FormatV(FX_LPCSTR lpszFormat, va_list argList)
-{
- va_list argListSave;
-#if defined(__ARMCC_VERSION) || (!defined(_MSC_VER) && (_FX_CPU_ == _FX_X64_ || _FX_CPU_ == _FX_IA64_ || _FX_CPU_ == _FX_ARM64_)) || defined(__native_client__)
- va_copy(argListSave, argList);
-#else
- argListSave = argList;
-#endif
- int nMaxLen = 0;
- for (FX_LPCSTR lpsz = lpszFormat; *lpsz != 0; lpsz ++) {
- if (*lpsz != '%' || *(lpsz = lpsz + 1) == '%') {
- nMaxLen += (FX_STRSIZE)FXSYS_strlen(lpsz);
- continue;
- }
- int nItemLen = 0;
- int nWidth = 0;
- for (; *lpsz != 0; lpsz ++) {
- if (*lpsz == '#') {
- nMaxLen += 2;
- } else if (*lpsz == '*') {
- nWidth = va_arg(argList, int);
- } else if (*lpsz == '-' || *lpsz == '+' || *lpsz == '0' ||
- *lpsz == ' ')
- ;
- else {
- break;
- }
- }
- if (nWidth == 0) {
- nWidth = FXSYS_atoi(lpsz);
- for (; (*lpsz) >= '0' && (*lpsz) <= '9'; lpsz ++)
- ;
- }
- if (nWidth < 0 || nWidth > 128 * 1024) {
- lpszFormat = "Bad width";
- nMaxLen = 10;
- break;
- }
- int nPrecision = 0;
- if (*lpsz == '.') {
- lpsz ++;
- if (*lpsz == '*') {
- nPrecision = va_arg(argList, int);
- lpsz ++;
- } else {
- nPrecision = FXSYS_atoi(lpsz);
- for (; (*lpsz) >= '0' && (*lpsz) <= '9'; lpsz ++)
- ;
- }
- }
- if (nPrecision < 0 || nPrecision > 128 * 1024) {
- lpszFormat = "Bad precision";
- nMaxLen = 14;
- break;
- }
- int nModifier = 0;
- if (FXSYS_strncmp(lpsz, "I64", 3) == 0) {
- lpsz += 3;
- nModifier = FORCE_INT64;
- } else {
- switch (*lpsz) {
- case 'h':
- nModifier = FORCE_ANSI;
- lpsz ++;
- break;
- case 'l':
- nModifier = FORCE_UNICODE;
- lpsz ++;
- break;
- case 'F':
- case 'N':
- case 'L':
- lpsz ++;
- break;
- }
- }
- switch (*lpsz | nModifier) {
- case 'c':
- case 'C':
- nItemLen = 2;
- va_arg(argList, int);
- break;
- case 'c'|FORCE_ANSI:
- case 'C'|FORCE_ANSI:
- nItemLen = 2;
- va_arg(argList, int);
- break;
- case 'c'|FORCE_UNICODE:
- case 'C'|FORCE_UNICODE:
- nItemLen = 2;
- va_arg(argList, int);
- break;
- case 's': {
- FX_LPCSTR pstrNextArg = va_arg(argList, FX_LPCSTR);
- if (pstrNextArg == NULL) {
- nItemLen = 6;
- } else {
- nItemLen = (FX_STRSIZE)FXSYS_strlen(pstrNextArg);
- if (nItemLen < 1) {
- nItemLen = 1;
- }
- }
- }
- break;
- case 'S': {
- FX_LPWSTR pstrNextArg = va_arg(argList, FX_LPWSTR);
- if (pstrNextArg == NULL) {
- nItemLen = 6;
- } else {
- nItemLen = (FX_STRSIZE)FXSYS_wcslen(pstrNextArg);
- if (nItemLen < 1) {
- nItemLen = 1;
- }
- }
- }
- break;
- case 's'|FORCE_ANSI:
- case 'S'|FORCE_ANSI: {
- FX_LPCSTR pstrNextArg = va_arg(argList, FX_LPCSTR);
- if (pstrNextArg == NULL) {
- nItemLen = 6;
- } else {
- nItemLen = (FX_STRSIZE)FXSYS_strlen(pstrNextArg);
- if (nItemLen < 1) {
- nItemLen = 1;
- }
- }
- }
- break;
- case 's'|FORCE_UNICODE:
- case 'S'|FORCE_UNICODE: {
- FX_LPWSTR pstrNextArg = va_arg(argList, FX_LPWSTR);
- if (pstrNextArg == NULL) {
- nItemLen = 6;
- } else {
- nItemLen = (FX_STRSIZE)FXSYS_wcslen(pstrNextArg);
- if (nItemLen < 1) {
- nItemLen = 1;
- }
- }
- }
- break;
- }
- if (nItemLen != 0) {
- if (nPrecision != 0 && nItemLen > nPrecision) {
- nItemLen = nPrecision;
- }
- if (nItemLen < nWidth) {
- nItemLen = nWidth;
- }
- } else {
- switch (*lpsz) {
- case 'd':
- case 'i':
- case 'u':
- case 'x':
- case 'X':
- case 'o':
- if (nModifier & FORCE_INT64) {
- va_arg(argList, FX_INT64);
- } else {
- va_arg(argList, int);
- }
- nItemLen = 32;
- if (nItemLen < nWidth + nPrecision) {
- nItemLen = nWidth + nPrecision;
- }
- break;
- case 'a':
- case 'A':
- case 'e':
- case 'E':
- case 'g':
- case 'G':
- va_arg(argList, double);
- nItemLen = 128;
- if (nItemLen < nWidth + nPrecision) {
- nItemLen = nWidth + nPrecision;
- }
- break;
- case 'f':
- if (nWidth + nPrecision > 100) {
- nItemLen = nPrecision + nWidth + 128;
- } else {
- double f;
- char pszTemp[256];
- f = va_arg(argList, double);
- FXSYS_sprintf(pszTemp, "%*.*f", nWidth, nPrecision + 6, f );
- nItemLen = (FX_STRSIZE)FXSYS_strlen(pszTemp);
- }
- break;
- case 'p':
- va_arg(argList, void*);
- nItemLen = 32;
- if (nItemLen < nWidth + nPrecision) {
- nItemLen = nWidth + nPrecision;
- }
- break;
- case 'n':
- va_arg(argList, int*);
- break;
- }
- }
- nMaxLen += nItemLen;
- }
- GetBuffer(nMaxLen);
- if (m_pData) {
- FXSYS_vsprintf(m_pData->m_String, lpszFormat, argListSave);
- ReleaseBuffer();
- }
- va_end(argListSave);
-}
-void CFX_ByteString::Format(FX_LPCSTR lpszFormat, ...)
-{
- va_list argList;
- va_start(argList, lpszFormat);
- FormatV(lpszFormat, argList);
- va_end(argList);
-}
-FX_STRSIZE CFX_ByteString::Insert(FX_STRSIZE nIndex, FX_CHAR ch)
-{
- CopyBeforeWrite();
- if (nIndex < 0) {
- nIndex = 0;
- }
- FX_STRSIZE nNewLength = m_pData ? m_pData->m_nDataLength : 0;
- if (nIndex > nNewLength) {
- nIndex = nNewLength;
- }
- nNewLength++;
- if (m_pData == NULL || m_pData->m_nAllocLength < nNewLength) {
- CFX_StringData* pOldData = m_pData;
- FX_LPCSTR pstr = m_pData->m_String;
- m_pData = FX_AllocString(nNewLength);
- if (!m_pData) {
- return 0;
- }
- if(pOldData != NULL) {
- FXSYS_memmove32(m_pData->m_String, pstr, (pOldData->m_nDataLength + 1)*sizeof(char));
- FX_ReleaseString(pOldData);
- } else {
- m_pData->m_String[0] = 0;
- }
- }
- FXSYS_memmove32(m_pData->m_String + nIndex + 1,
- m_pData->m_String + nIndex, (nNewLength - nIndex)*sizeof(char));
- m_pData->m_String[nIndex] = ch;
- m_pData->m_nDataLength = nNewLength;
- return nNewLength;
-}
-CFX_ByteString CFX_ByteString::Right(FX_STRSIZE nCount) const
-{
- if (m_pData == NULL) {
- return CFX_ByteString();
- }
- if (nCount < 0) {
- nCount = 0;
- }
- if (nCount >= m_pData->m_nDataLength) {
- return *this;
- }
- CFX_ByteString dest;
- AllocCopy(dest, nCount, m_pData->m_nDataLength - nCount, 0);
- return dest;
-}
-CFX_ByteString CFX_ByteString::Left(FX_STRSIZE nCount) const
-{
- if (m_pData == NULL) {
- return CFX_ByteString();
- }
- if (nCount < 0) {
- nCount = 0;
- }
- if (nCount >= m_pData->m_nDataLength) {
- return *this;
- }
- CFX_ByteString dest;
- AllocCopy(dest, nCount, 0, 0);
- return dest;
-}
-FX_STRSIZE CFX_ByteString::Find(FX_CHAR ch, FX_STRSIZE nStart) const
-{
- if (m_pData == NULL) {
- return -1;
- }
- FX_STRSIZE nLength = m_pData->m_nDataLength;
- if (nStart >= nLength) {
- return -1;
- }
- FX_LPCSTR lpsz = FXSYS_strchr(m_pData->m_String + nStart, ch);
- return (lpsz == NULL) ? -1 : (int)(lpsz - m_pData->m_String);
-}
-FX_STRSIZE CFX_ByteString::ReverseFind(FX_CHAR ch) const
-{
- if (m_pData == NULL) {
- return -1;
- }
- FX_STRSIZE nLength = m_pData->m_nDataLength;
- while (nLength) {
- if (m_pData->m_String[nLength - 1] == ch) {
- return nLength - 1;
- }
- nLength --;
- }
- return -1;
-}
-FX_LPCSTR FX_strstr(FX_LPCSTR str1, int len1, FX_LPCSTR str2, int len2)
-{
- if (len2 > len1 || len2 == 0) {
- return NULL;
- }
- FX_LPCSTR end_ptr = str1 + len1 - len2;
- while (str1 <= end_ptr) {
- int i = 0;
- while (1) {
- if (str1[i] != str2[i]) {
- break;
- }
- i ++;
- if (i == len2) {
- return str1;
- }
- }
- str1 ++;
- }
- return NULL;
-}
-FX_STRSIZE CFX_ByteString::Find(FX_BSTR lpszSub, FX_STRSIZE nStart) const
-{
- if (m_pData == NULL) {
- return -1;
- }
- FX_STRSIZE nLength = m_pData->m_nDataLength;
- if (nStart > nLength) {
- return -1;
- }
- FX_LPCSTR lpsz = FX_strstr(m_pData->m_String + nStart, m_pData->m_nDataLength - nStart,
- lpszSub.GetCStr(), lpszSub.GetLength());
- return (lpsz == NULL) ? -1 : (int)(lpsz - m_pData->m_String);
-}
-void CFX_ByteString::MakeLower()
-{
- if (m_pData == NULL) {
- return;
- }
- CopyBeforeWrite();
- if (GetLength() < 1) {
- return;
- }
- FXSYS_strlwr(m_pData->m_String);
-}
-void CFX_ByteString::MakeUpper()
-{
- if (m_pData == NULL) {
- return;
- }
- CopyBeforeWrite();
- if (GetLength() < 1) {
- return;
- }
- FXSYS_strupr(m_pData->m_String);
-}
-FX_STRSIZE CFX_ByteString::Remove(FX_CHAR chRemove)
-{
- if (m_pData == NULL) {
- return 0;
- }
- CopyBeforeWrite();
- if (GetLength() < 1) {
- return 0;
- }
- FX_LPSTR pstrSource = m_pData->m_String;
- FX_LPSTR pstrDest = m_pData->m_String;
- FX_LPSTR pstrEnd = m_pData->m_String + m_pData->m_nDataLength;
- while (pstrSource < pstrEnd) {
- if (*pstrSource != chRemove) {
- *pstrDest = *pstrSource;
- pstrDest ++;
- }
- pstrSource ++;
- }
- *pstrDest = 0;
- FX_STRSIZE nCount = (FX_STRSIZE)(pstrSource - pstrDest);
- m_pData->m_nDataLength -= nCount;
- return nCount;
-}
-FX_STRSIZE CFX_ByteString::Replace(FX_BSTR lpszOld, FX_BSTR lpszNew)
-{
- if (m_pData == NULL) {
- return 0;
- }
- if (lpszOld.IsEmpty()) {
- return 0;
- }
- FX_STRSIZE nSourceLen = lpszOld.GetLength();
- FX_STRSIZE nReplacementLen = lpszNew.GetLength();
- FX_STRSIZE nCount = 0;
- FX_LPCSTR pStart = m_pData->m_String;
- FX_LPSTR pEnd = m_pData->m_String + m_pData->m_nDataLength;
- while (1) {
- FX_LPCSTR pTarget = FX_strstr(pStart, (FX_STRSIZE)(pEnd - pStart), lpszOld.GetCStr(), nSourceLen);
- if (pTarget == NULL) {
- break;
- }
- nCount++;
- pStart = pTarget + nSourceLen;
- }
- if (nCount == 0) {
- return 0;
- }
- FX_STRSIZE nNewLength = m_pData->m_nDataLength + (nReplacementLen - nSourceLen) * nCount;
- if (nNewLength == 0) {
- Empty();
- return nCount;
- }
- CFX_StringData* pNewData = FX_AllocString(nNewLength);
- if (!pNewData) {
- return 0;
- }
- pStart = m_pData->m_String;
- FX_LPSTR pDest = pNewData->m_String;
- for (FX_STRSIZE i = 0; i < nCount; i ++) {
- FX_LPCSTR pTarget = FX_strstr(pStart, (FX_STRSIZE)(pEnd - pStart), lpszOld.GetCStr(), nSourceLen);
- FXSYS_memcpy32(pDest, pStart, pTarget - pStart);
- pDest += pTarget - pStart;
- FXSYS_memcpy32(pDest, lpszNew.GetCStr(), lpszNew.GetLength());
- pDest += lpszNew.GetLength();
- pStart = pTarget + nSourceLen;
- }
- FXSYS_memcpy32(pDest, pStart, pEnd - pStart);
- FX_ReleaseString(m_pData);
- m_pData = pNewData;
- return nCount;
-}
-void CFX_ByteString::SetAt(FX_STRSIZE nIndex, FX_CHAR ch)
-{
- if (m_pData == NULL) {
- return;
- }
- FXSYS_assert(nIndex >= 0);
- FXSYS_assert(nIndex < m_pData->m_nDataLength);
- CopyBeforeWrite();
- m_pData->m_String[nIndex] = ch;
-}
-CFX_ByteString CFX_ByteString::LoadFromFile(FX_BSTR filename)
-{
- FXSYS_FILE* file = FXSYS_fopen(CFX_ByteString(filename), "rb");
- if (file == NULL) {
- return CFX_ByteString();
- }
- FXSYS_fseek(file, 0, FXSYS_SEEK_END);
- int len = FXSYS_ftell(file);
- FXSYS_fseek(file, 0, FXSYS_SEEK_SET);
- CFX_ByteString str;
- FX_LPSTR buf = str.GetBuffer(len);
- size_t readCnt = FXSYS_fread(buf, 1, len, file);
- str.ReleaseBuffer(len);
- FXSYS_fclose(file);
- return str;
-}
-CFX_WideString CFX_ByteString::UTF8Decode() const
-{
- CFX_UTF8Decoder decoder;
- for (FX_STRSIZE i = 0; i < GetLength(); i ++) {
- decoder.Input((FX_BYTE)m_pData->m_String[i]);
- }
- return decoder.GetResult();
-}
-CFX_ByteString CFX_ByteString::FromUnicode(FX_LPCWSTR str, FX_STRSIZE len)
-{
- if (len < 0) {
- len = (FX_STRSIZE)FXSYS_wcslen(str);
- }
- CFX_ByteString bstr;
- bstr.ConvertFrom(CFX_WideString(str, len));
- return bstr;
-}
-CFX_ByteString CFX_ByteString::FromUnicode(const CFX_WideString& str)
-{
- return FromUnicode((FX_LPCWSTR)str, str.GetLength());
-}
-void CFX_ByteString::ConvertFrom(const CFX_WideString& str, CFX_CharMap* pCharMap)
-{
- if (pCharMap == NULL) {
- pCharMap = CFX_CharMap::GetDefaultMapper();
- }
- *this = (*pCharMap->m_GetByteString)(pCharMap, str);
-}
-int CFX_ByteString::Compare(FX_BSTR str) const
-{
- if (m_pData == NULL) {
- return str.IsEmpty() ? 0 : -1;
- }
- int this_len = m_pData->m_nDataLength;
- int that_len = str.GetLength();
- int min_len = this_len < that_len ? this_len : that_len;
- for (int i = 0; i < min_len; i ++) {
- if ((FX_BYTE)m_pData->m_String[i] < str.GetAt(i)) {
- return -1;
- } else if ((FX_BYTE)m_pData->m_String[i] > str.GetAt(i)) {
- return 1;
- }
- }
- if (this_len < that_len) {
- return -1;
- } else if (this_len > that_len) {
- return 1;
- }
- return 0;
-}
-void CFX_ByteString::TrimRight(FX_BSTR lpszTargets)
-{
- if (m_pData == NULL || lpszTargets.IsEmpty()) {
- return;
- }
- CopyBeforeWrite();
- FX_STRSIZE pos = GetLength();
- if (pos < 1) {
- return;
- }
- while (pos) {
- FX_STRSIZE i = 0;
- while (i < lpszTargets.GetLength() && lpszTargets[i] != m_pData->m_String[pos - 1]) {
- i ++;
- }
- if (i == lpszTargets.GetLength()) {
- break;
- }
- pos --;
- }
- if (pos < m_pData->m_nDataLength) {
- m_pData->m_String[pos] = 0;
- m_pData->m_nDataLength = pos;
- }
-}
-void CFX_ByteString::TrimRight(FX_CHAR chTarget)
-{
- TrimRight(CFX_ByteStringC(chTarget));
-}
-void CFX_ByteString::TrimRight()
-{
- TrimRight(FX_BSTRC("\x09\x0a\x0b\x0c\x0d\x20"));
-}
-void CFX_ByteString::TrimLeft(FX_BSTR lpszTargets)
-{
- if (m_pData == NULL) {
- return;
- }
- if (lpszTargets.IsEmpty()) {
- return;
- }
- CopyBeforeWrite();
- FX_STRSIZE len = GetLength();
- if (len < 1) {
- return;
- }
- FX_STRSIZE pos = 0;
- while (pos < len) {
- FX_STRSIZE i = 0;
- while (i < lpszTargets.GetLength() && lpszTargets[i] != m_pData->m_String[pos]) {
- i ++;
- }
- if (i == lpszTargets.GetLength()) {
- break;
- }
- pos ++;
- }
- if (pos) {
- FX_STRSIZE nDataLength = len - pos;
- FXSYS_memmove32(m_pData->m_String, m_pData->m_String + pos, (nDataLength + 1)*sizeof(FX_CHAR));
- m_pData->m_nDataLength = nDataLength;
- }
-}
-void CFX_ByteString::TrimLeft(FX_CHAR chTarget)
-{
- TrimLeft(CFX_ByteStringC(chTarget));
-}
-void CFX_ByteString::TrimLeft()
-{
- TrimLeft(FX_BSTRC("\x09\x0a\x0b\x0c\x0d\x20"));
-}
-FX_DWORD CFX_ByteString::GetID(FX_STRSIZE start_pos) const
-{
- return CFX_ByteStringC(*this).GetID(start_pos);
-}
-FX_DWORD CFX_ByteStringC::GetID(FX_STRSIZE start_pos) const
-{
- if (m_Length == 0) {
- return 0;
- }
- if (start_pos >= m_Length) {
- return 0;
- }
- FX_DWORD strid = 0;
- if (start_pos + 4 > m_Length) {
- for (FX_STRSIZE i = 0; i < m_Length - start_pos; i ++) {
- strid = strid * 256 + m_Ptr[start_pos + i];
- }
- strid = strid << ((4 - m_Length + start_pos) * 8);
- } else {
- for (int i = 0; i < 4; i ++) {
- strid = strid * 256 + m_Ptr[start_pos + i];
- }
- }
- return strid;
-}
-FX_STRSIZE FX_ftoa(FX_FLOAT d, FX_LPSTR buf)
-{
- buf[0] = '0';
- buf[1] = '\0';
- if (d == 0.0f) {
- return 1;
- }
- FX_BOOL bNegative = FALSE;
- if (d < 0) {
- bNegative = TRUE;
- d = -d;
- }
- int scale = 1;
- int scaled = FXSYS_round(d);
- while (scaled < 100000) {
- if (scale == 1000000) {
- break;
- }
- scale *= 10;
- scaled = FXSYS_round(d * scale);
- }
- if (scaled == 0) {
- return 1;
- }
- char buf2[32];
- int buf_size = 0;
- if (bNegative) {
- buf[buf_size++] = '-';
- }
- int i = scaled / scale;
- FXSYS_itoa(i, buf2, 10);
- FX_STRSIZE len = (FX_STRSIZE)FXSYS_strlen(buf2);
- FXSYS_memcpy32(buf + buf_size, buf2, len);
- buf_size += len;
- int fraction = scaled % scale;
- if (fraction == 0) {
- return buf_size;
- }
- buf[buf_size++] = '.';
- scale /= 10;
- while (fraction) {
- buf[buf_size++] = '0' + fraction / scale;
- fraction %= scale;
- scale /= 10;
- }
- return buf_size;
-}
-CFX_ByteString CFX_ByteString::FormatFloat(FX_FLOAT d, int precision)
-{
- FX_CHAR buf[32];
- FX_STRSIZE len = FX_ftoa(d, buf);
- return CFX_ByteString(buf, len);
-}
-void CFX_StringBufBase::Copy(FX_BSTR str)
-{
- m_Size = str.GetLength();
- if (m_Size > m_Limit) {
- m_Size = m_Limit;
- }
- FX_CHAR* pBuffer = (FX_CHAR*)(this + 1);
- FXSYS_memcpy32(pBuffer, str.GetPtr(), m_Size);
-}
-void CFX_StringBufBase::Append(FX_BSTR str)
-{
- int len = str.GetLength();
- if (len > m_Limit - m_Size) {
- len = m_Limit - m_Size;
- }
- FX_CHAR* pBuffer = (FX_CHAR*)(this + 1);
- FXSYS_memcpy32(pBuffer + m_Size, str.GetPtr(), len);
- m_Size += len;
-}
-void CFX_StringBufBase::Append(int i, FX_DWORD flags)
-{
- char buf[32];
- int len = _Buffer_itoa(buf, i, flags);
- Append(CFX_ByteStringC(buf, len));
-}
-void CFX_ByteStringL::Empty(IFX_Allocator* pAllocator)
-{
- if (m_Ptr) {
- FX_Allocator_Free(pAllocator, (FX_LPVOID)m_Ptr);
- }
- m_Ptr = NULL, m_Length = 0;
-}
-FX_LPSTR CFX_ByteStringL::AllocBuffer(FX_STRSIZE length, IFX_Allocator* pAllocator)
-{
- Empty(pAllocator);
- FX_LPSTR str = FX_Allocator_Alloc(pAllocator, FX_CHAR, length + 1);
- if (!str) {
- return NULL;
- }
- *(FX_LPSTR*)(&m_Ptr) = str;
- m_Length = length;
- return str;
-}
-void CFX_ByteStringL::Set(FX_BSTR src, IFX_Allocator* pAllocator)
-{
- Empty(pAllocator);
- if (src.GetCStr() != NULL && src.GetLength() > 0) {
- FX_LPSTR str = FX_Allocator_Alloc(pAllocator, FX_CHAR, src.GetLength() + 1);
- if (!str) {
- return;
- }
- FXSYS_memcpy32(str, src, src.GetLength());
- str[src.GetLength()] = '\0';
- *(FX_LPSTR*)(&m_Ptr) = str;
- m_Length = src.GetLength();
- }
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fxcrt/fx_basic.h"
+static int _Buffer_itoa(char* buf, int i, FX_DWORD flags)
+{
+ if (i == 0) {
+ buf[0] = '0';
+ return 1;
+ }
+ char buf1[32];
+ int buf_pos = 31;
+ FX_DWORD u = i;
+ if ((flags & FXFORMAT_SIGNED) && i < 0) {
+ u = -i;
+ }
+ int base = 10;
+ FX_LPCSTR string = "0123456789abcdef";
+ if (flags & FXFORMAT_HEX) {
+ base = 16;
+ if (flags & FXFORMAT_CAPITAL) {
+ string = "0123456789ABCDEF";
+ }
+ }
+ while (u != 0) {
+ buf1[buf_pos--] = string[u % base];
+ u = u / base;
+ }
+ if ((flags & FXFORMAT_SIGNED) && i < 0) {
+ buf1[buf_pos--] = '-';
+ }
+ int len = 31 - buf_pos;
+ for (int ii = 0; ii < len; ii ++) {
+ buf[ii] = buf1[ii + buf_pos + 1];
+ }
+ return len;
+}
+CFX_ByteString CFX_ByteString::FormatInteger(int i, FX_DWORD flags)
+{
+ char buf[32];
+ return CFX_ByteStringC(buf, _Buffer_itoa(buf, i, flags));
+}
+static CFX_StringData* FX_AllocString(int nLen)
+{
+ if (nLen == 0) {
+ return NULL;
+ }
+ CFX_StringData* pData = (CFX_StringData*)FX_Alloc(FX_BYTE, sizeof(long) * 3 + (nLen + 1) * sizeof(char));
+ if (!pData) {
+ return NULL;
+ }
+ pData->m_nAllocLength = nLen;
+ pData->m_nDataLength = nLen;
+ pData->m_nRefs = 1;
+ pData->m_String[nLen] = 0;
+ return pData;
+}
+static void FX_ReleaseString(CFX_StringData* pData)
+{
+ if (pData == NULL) {
+ return;
+ }
+ pData->m_nRefs --;
+ if (pData->m_nRefs <= 0) {
+ FX_Free(pData);
+ }
+}
+CFX_ByteString::~CFX_ByteString()
+{
+ if (m_pData == NULL) {
+ return;
+ }
+ m_pData->m_nRefs --;
+ if (m_pData->m_nRefs < 1) {
+ FX_Free(m_pData);
+ }
+}
+CFX_ByteString::CFX_ByteString(FX_LPCSTR lpsz, FX_STRSIZE nLen)
+{
+ if (nLen < 0) {
+ nLen = lpsz ? (FX_STRSIZE)FXSYS_strlen(lpsz) : 0;
+ }
+ if (nLen) {
+ m_pData = FX_AllocString(nLen);
+ if (m_pData) {
+ FXSYS_memcpy32(m_pData->m_String, lpsz, nLen * sizeof(char));
+ }
+ } else {
+ m_pData = NULL;
+ }
+}
+CFX_ByteString::CFX_ByteString(FX_LPCBYTE lpsz, FX_STRSIZE nLen)
+{
+ if (nLen > 0) {
+ m_pData = FX_AllocString(nLen);
+ if (m_pData) {
+ FXSYS_memcpy32(m_pData->m_String, lpsz, nLen * sizeof(char));
+ }
+ } else {
+ m_pData = NULL;
+ }
+}
+CFX_ByteString::CFX_ByteString(char ch)
+{
+ m_pData = FX_AllocString(1);
+ if (m_pData) {
+ m_pData->m_String[0] = ch;
+ }
+}
+CFX_ByteString::CFX_ByteString(const CFX_ByteString& stringSrc)
+{
+ if (stringSrc.m_pData == NULL) {
+ m_pData = NULL;
+ return;
+ }
+ if (stringSrc.m_pData->m_nRefs >= 0) {
+ m_pData = stringSrc.m_pData;
+ m_pData->m_nRefs ++;
+ } else {
+ m_pData = NULL;
+ *this = stringSrc;
+ }
+}
+CFX_ByteString::CFX_ByteString(FX_BSTR stringSrc)
+{
+ if (stringSrc.IsEmpty()) {
+ m_pData = NULL;
+ return;
+ } else {
+ m_pData = NULL;
+ *this = stringSrc;
+ }
+}
+CFX_ByteString::CFX_ByteString(FX_BSTR str1, FX_BSTR str2)
+{
+ m_pData = NULL;
+ int nNewLen = str1.GetLength() + str2.GetLength();
+ if (nNewLen == 0) {
+ return;
+ }
+ m_pData = FX_AllocString(nNewLen);
+ if (m_pData) {
+ FXSYS_memcpy32(m_pData->m_String, str1.GetCStr(), str1.GetLength());
+ FXSYS_memcpy32(m_pData->m_String + str1.GetLength(), str2.GetCStr(), str2.GetLength());
+ }
+}
+const CFX_ByteString& CFX_ByteString::operator=(FX_LPCSTR lpsz)
+{
+ if (lpsz == NULL || lpsz[0] == 0) {
+ Empty();
+ } else {
+ AssignCopy((FX_STRSIZE)FXSYS_strlen(lpsz), lpsz);
+ }
+ return *this;
+}
+const CFX_ByteString& CFX_ByteString::operator=(FX_BSTR str)
+{
+ if (str.IsEmpty()) {
+ Empty();
+ } else {
+ AssignCopy(str.GetLength(), str.GetCStr());
+ }
+ return *this;
+}
+const CFX_ByteString& CFX_ByteString::operator=(const CFX_ByteString& stringSrc)
+{
+ if (m_pData == stringSrc.m_pData) {
+ return *this;
+ }
+ if (stringSrc.IsEmpty()) {
+ Empty();
+ } else if ((m_pData && m_pData->m_nRefs < 0) ||
+ (stringSrc.m_pData && stringSrc.m_pData->m_nRefs < 0)) {
+ AssignCopy(stringSrc.m_pData->m_nDataLength, stringSrc.m_pData->m_String);
+ } else {
+ Empty();
+ m_pData = stringSrc.m_pData;
+ if (m_pData) {
+ m_pData->m_nRefs ++;
+ }
+ }
+ return *this;
+}
+const CFX_ByteString& CFX_ByteString::operator=(const CFX_BinaryBuf& buf)
+{
+ Load(buf.GetBuffer(), buf.GetSize());
+ return *this;
+}
+void CFX_ByteString::Load(FX_LPCBYTE buf, FX_STRSIZE len)
+{
+ Empty();
+ if (len) {
+ m_pData = FX_AllocString(len);
+ if (m_pData) {
+ FXSYS_memcpy32(m_pData->m_String, buf, len * sizeof(char));
+ }
+ } else {
+ m_pData = NULL;
+ }
+}
+const CFX_ByteString& CFX_ByteString::operator+=(FX_LPCSTR lpsz)
+{
+ if (lpsz) {
+ ConcatInPlace((FX_STRSIZE)FXSYS_strlen(lpsz), lpsz);
+ }
+ return *this;
+}
+const CFX_ByteString& CFX_ByteString::operator+=(char ch)
+{
+ ConcatInPlace(1, &ch);
+ return *this;
+}
+const CFX_ByteString& CFX_ByteString::operator+=(const CFX_ByteString& string)
+{
+ if (string.m_pData == NULL) {
+ return *this;
+ }
+ ConcatInPlace(string.m_pData->m_nDataLength, string.m_pData->m_String);
+ return *this;
+}
+const CFX_ByteString& CFX_ByteString::operator+=(FX_BSTR string)
+{
+ if (string.IsEmpty()) {
+ return *this;
+ }
+ ConcatInPlace(string.GetLength(), string.GetCStr());
+ return *this;
+}
+bool CFX_ByteString::Equal(FX_BSTR str) const
+{
+ if (m_pData == NULL) {
+ return str.IsEmpty();
+ }
+ return m_pData->m_nDataLength == str.GetLength() &&
+ FXSYS_memcmp32(m_pData->m_String, str.GetCStr(), str.GetLength()) == 0;
+}
+bool CFX_ByteString::operator ==(const CFX_ByteString& s2) const
+{
+ if (m_pData == NULL) {
+ return s2.IsEmpty();
+ }
+ if (s2.m_pData == NULL) {
+ return false;
+ }
+ return m_pData->m_nDataLength == s2.m_pData->m_nDataLength &&
+ FXSYS_memcmp32(m_pData->m_String, s2.m_pData->m_String, m_pData->m_nDataLength) == 0;
+}
+void CFX_ByteString::Empty()
+{
+ if (m_pData == NULL) {
+ return;
+ }
+ if (m_pData->m_nRefs > 1) {
+ m_pData->m_nRefs --;
+ } else {
+ FX_Free(m_pData);
+ }
+ m_pData = NULL;
+}
+bool CFX_ByteString::EqualNoCase(FX_BSTR str) const
+{
+ if (m_pData == NULL) {
+ return str.IsEmpty();
+ }
+ FX_STRSIZE len = str.GetLength();
+ if (m_pData->m_nDataLength != len) {
+ return false;
+ }
+ FX_LPCBYTE pThis = (FX_LPCBYTE)m_pData->m_String;
+ FX_LPCBYTE pThat = (FX_LPCBYTE)str;
+ for (FX_STRSIZE i = 0; i < len; i ++) {
+ if ((*pThis) != (*pThat)) {
+ FX_BYTE bThis = *pThis;
+ if (bThis >= 'A' && bThis <= 'Z') {
+ bThis += 'a' - 'A';
+ }
+ FX_BYTE bThat = *pThat;
+ if (bThat >= 'A' && bThat <= 'Z') {
+ bThat += 'a' - 'A';
+ }
+ if (bThis != bThat) {
+ return false;
+ }
+ }
+ pThis ++;
+ pThat ++;
+ }
+ return true;
+}
+void CFX_ByteString::AssignCopy(FX_STRSIZE nSrcLen, FX_LPCSTR lpszSrcData)
+{
+ AllocBeforeWrite(nSrcLen);
+ FXSYS_memcpy32(m_pData->m_String, lpszSrcData, nSrcLen * sizeof(char));
+ m_pData->m_nDataLength = nSrcLen;
+ m_pData->m_String[nSrcLen] = 0;
+}
+void CFX_ByteString::CopyBeforeWrite()
+{
+ if (m_pData == NULL || m_pData->m_nRefs <= 1) {
+ return;
+ }
+ CFX_StringData* pData = m_pData;
+ m_pData->m_nRefs --;
+ FX_STRSIZE nDataLength = pData->m_nDataLength;
+ m_pData = FX_AllocString(nDataLength);
+ if (m_pData != NULL) {
+ FXSYS_memcpy32(m_pData->m_String, pData->m_String, (nDataLength + 1) * sizeof(char));
+ }
+}
+void CFX_ByteString::AllocBeforeWrite(FX_STRSIZE nLen)
+{
+ if (m_pData && m_pData->m_nRefs <= 1 && m_pData->m_nAllocLength >= nLen) {
+ return;
+ }
+ Empty();
+ m_pData = FX_AllocString(nLen);
+}
+void CFX_ByteString::ReleaseBuffer(FX_STRSIZE nNewLength)
+{
+ if (m_pData == NULL) {
+ return;
+ }
+ CopyBeforeWrite();
+ if (nNewLength == -1) {
+ nNewLength = (FX_STRSIZE)FXSYS_strlen((FX_LPCSTR)m_pData->m_String);
+ }
+ if (nNewLength == 0) {
+ Empty();
+ return;
+ }
+ FXSYS_assert(nNewLength <= m_pData->m_nAllocLength);
+ m_pData->m_nDataLength = nNewLength;
+ m_pData->m_String[nNewLength] = 0;
+}
+FX_LPSTR CFX_ByteString::LockBuffer()
+{
+ if (m_pData == NULL) {
+ return NULL;
+ }
+ FX_LPSTR lpsz = GetBuffer(0);
+ m_pData->m_nRefs = -1;
+ return lpsz;
+}
+void CFX_ByteString::Reserve(FX_STRSIZE len)
+{
+ GetBuffer(len);
+ ReleaseBuffer(GetLength());
+}
+FX_LPSTR CFX_ByteString::GetBuffer(FX_STRSIZE nMinBufLength)
+{
+ if (m_pData == NULL && nMinBufLength == 0) {
+ return NULL;
+ }
+ if (m_pData && m_pData->m_nRefs <= 1 && m_pData->m_nAllocLength >= nMinBufLength) {
+ return m_pData->m_String;
+ }
+ if (m_pData == NULL) {
+ m_pData = FX_AllocString(nMinBufLength);
+ if (!m_pData) {
+ return NULL;
+ }
+ m_pData->m_nDataLength = 0;
+ m_pData->m_String[0] = 0;
+ return m_pData->m_String;
+ }
+ CFX_StringData* pOldData = m_pData;
+ FX_STRSIZE nOldLen = pOldData->m_nDataLength;
+ if (nMinBufLength < nOldLen) {
+ nMinBufLength = nOldLen;
+ }
+ m_pData = FX_AllocString(nMinBufLength);
+ if (!m_pData) {
+ return NULL;
+ }
+ FXSYS_memcpy32(m_pData->m_String, pOldData->m_String, (nOldLen + 1)*sizeof(char));
+ m_pData->m_nDataLength = nOldLen;
+ pOldData->m_nRefs --;
+ if (pOldData->m_nRefs <= 0) {
+ FX_Free(pOldData);
+ }
+ return m_pData->m_String;
+}
+FX_STRSIZE CFX_ByteString::Delete(FX_STRSIZE nIndex, FX_STRSIZE nCount)
+{
+ if (m_pData == NULL) {
+ return 0;
+ }
+ if (nIndex < 0) {
+ nIndex = 0;
+ }
+ FX_STRSIZE nOldLength = m_pData->m_nDataLength;
+ if (nCount > 0 && nIndex < nOldLength) {
+ FX_STRSIZE mLength = nIndex + nCount;
+ if (mLength >= nOldLength) {
+ m_pData->m_nDataLength = nIndex;
+ return m_pData->m_nDataLength;
+ }
+ CopyBeforeWrite();
+ int nBytesToCopy = nOldLength - mLength + 1;
+ FXSYS_memmove32(m_pData->m_String + nIndex,
+ m_pData->m_String + mLength, nBytesToCopy * sizeof(char));
+ m_pData->m_nDataLength = nOldLength - nCount;
+ }
+ return m_pData->m_nDataLength;
+}
+void CFX_ByteString::ConcatInPlace(FX_STRSIZE nSrcLen, FX_LPCSTR lpszSrcData)
+{
+ if (nSrcLen == 0 || lpszSrcData == NULL) {
+ return;
+ }
+ if (m_pData == NULL) {
+ m_pData = FX_AllocString(nSrcLen);
+ if (!m_pData) {
+ return;
+ }
+ FXSYS_memcpy32(m_pData->m_String, lpszSrcData, nSrcLen * sizeof(char));
+ return;
+ }
+ if (m_pData->m_nRefs > 1 || m_pData->m_nDataLength + nSrcLen > m_pData->m_nAllocLength) {
+ CFX_StringData* pOldData = m_pData;
+ ConcatCopy(m_pData->m_nDataLength, m_pData->m_String, nSrcLen, lpszSrcData);
+ FX_ReleaseString(pOldData);
+ } else {
+ FXSYS_memcpy32(m_pData->m_String + m_pData->m_nDataLength, lpszSrcData, nSrcLen * sizeof(char));
+ m_pData->m_nDataLength += nSrcLen;
+ m_pData->m_String[m_pData->m_nDataLength] = 0;
+ }
+}
+void CFX_ByteString::ConcatCopy(FX_STRSIZE nSrc1Len, FX_LPCSTR lpszSrc1Data,
+ FX_STRSIZE nSrc2Len, FX_LPCSTR lpszSrc2Data)
+{
+ int nNewLen = nSrc1Len + nSrc2Len;
+ if (nNewLen == 0) {
+ return;
+ }
+ m_pData = FX_AllocString(nNewLen);
+ if (m_pData) {
+ FXSYS_memcpy32(m_pData->m_String, lpszSrc1Data, nSrc1Len * sizeof(char));
+ FXSYS_memcpy32(m_pData->m_String + nSrc1Len, lpszSrc2Data, nSrc2Len * sizeof(char));
+ }
+}
+CFX_ByteString CFX_ByteString::Mid(FX_STRSIZE nFirst) const
+{
+ if (m_pData == NULL) {
+ return CFX_ByteString();
+ }
+ return Mid(nFirst, m_pData->m_nDataLength - nFirst);
+}
+CFX_ByteString CFX_ByteString::Mid(FX_STRSIZE nFirst, FX_STRSIZE nCount) const
+{
+ if (nFirst < 0) {
+ nFirst = 0;
+ }
+ if (nCount < 0) {
+ nCount = 0;
+ }
+ if (nFirst + nCount > m_pData->m_nDataLength) {
+ nCount = m_pData->m_nDataLength - nFirst;
+ }
+ if (nFirst > m_pData->m_nDataLength) {
+ nCount = 0;
+ }
+ if (nFirst == 0 && nFirst + nCount == m_pData->m_nDataLength) {
+ return *this;
+ }
+ CFX_ByteString dest;
+ AllocCopy(dest, nCount, nFirst, 0);
+ return dest;
+}
+void CFX_ByteString::AllocCopy(CFX_ByteString& dest, FX_STRSIZE nCopyLen, FX_STRSIZE nCopyIndex,
+ FX_STRSIZE nExtraLen) const
+{
+ FX_STRSIZE nNewLen = nCopyLen + nExtraLen;
+ if (nNewLen == 0) {
+ return;
+ }
+ ASSERT(dest.m_pData == NULL);
+ dest.m_pData = FX_AllocString(nNewLen);
+ if (dest.m_pData) {
+ FXSYS_memcpy32(dest.m_pData->m_String, m_pData->m_String + nCopyIndex, nCopyLen * sizeof(char));
+ }
+}
+#define FORCE_ANSI 0x10000
+#define FORCE_UNICODE 0x20000
+#define FORCE_INT64 0x40000
+void CFX_ByteString::FormatV(FX_LPCSTR lpszFormat, va_list argList)
+{
+ va_list argListSave;
+#if defined(__ARMCC_VERSION) || (!defined(_MSC_VER) && (_FX_CPU_ == _FX_X64_ || _FX_CPU_ == _FX_IA64_ || _FX_CPU_ == _FX_ARM64_)) || defined(__native_client__)
+ va_copy(argListSave, argList);
+#else
+ argListSave = argList;
+#endif
+ int nMaxLen = 0;
+ for (FX_LPCSTR lpsz = lpszFormat; *lpsz != 0; lpsz ++) {
+ if (*lpsz != '%' || *(lpsz = lpsz + 1) == '%') {
+ nMaxLen += (FX_STRSIZE)FXSYS_strlen(lpsz);
+ continue;
+ }
+ int nItemLen = 0;
+ int nWidth = 0;
+ for (; *lpsz != 0; lpsz ++) {
+ if (*lpsz == '#') {
+ nMaxLen += 2;
+ } else if (*lpsz == '*') {
+ nWidth = va_arg(argList, int);
+ } else if (*lpsz == '-' || *lpsz == '+' || *lpsz == '0' ||
+ *lpsz == ' ')
+ ;
+ else {
+ break;
+ }
+ }
+ if (nWidth == 0) {
+ nWidth = FXSYS_atoi(lpsz);
+ for (; (*lpsz) >= '0' && (*lpsz) <= '9'; lpsz ++)
+ ;
+ }
+ if (nWidth < 0 || nWidth > 128 * 1024) {
+ lpszFormat = "Bad width";
+ nMaxLen = 10;
+ break;
+ }
+ int nPrecision = 0;
+ if (*lpsz == '.') {
+ lpsz ++;
+ if (*lpsz == '*') {
+ nPrecision = va_arg(argList, int);
+ lpsz ++;
+ } else {
+ nPrecision = FXSYS_atoi(lpsz);
+ for (; (*lpsz) >= '0' && (*lpsz) <= '9'; lpsz ++)
+ ;
+ }
+ }
+ if (nPrecision < 0 || nPrecision > 128 * 1024) {
+ lpszFormat = "Bad precision";
+ nMaxLen = 14;
+ break;
+ }
+ int nModifier = 0;
+ if (FXSYS_strncmp(lpsz, "I64", 3) == 0) {
+ lpsz += 3;
+ nModifier = FORCE_INT64;
+ } else {
+ switch (*lpsz) {
+ case 'h':
+ nModifier = FORCE_ANSI;
+ lpsz ++;
+ break;
+ case 'l':
+ nModifier = FORCE_UNICODE;
+ lpsz ++;
+ break;
+ case 'F':
+ case 'N':
+ case 'L':
+ lpsz ++;
+ break;
+ }
+ }
+ switch (*lpsz | nModifier) {
+ case 'c':
+ case 'C':
+ nItemLen = 2;
+ va_arg(argList, int);
+ break;
+ case 'c'|FORCE_ANSI:
+ case 'C'|FORCE_ANSI:
+ nItemLen = 2;
+ va_arg(argList, int);
+ break;
+ case 'c'|FORCE_UNICODE:
+ case 'C'|FORCE_UNICODE:
+ nItemLen = 2;
+ va_arg(argList, int);
+ break;
+ case 's': {
+ FX_LPCSTR pstrNextArg = va_arg(argList, FX_LPCSTR);
+ if (pstrNextArg == NULL) {
+ nItemLen = 6;
+ } else {
+ nItemLen = (FX_STRSIZE)FXSYS_strlen(pstrNextArg);
+ if (nItemLen < 1) {
+ nItemLen = 1;
+ }
+ }
+ }
+ break;
+ case 'S': {
+ FX_LPWSTR pstrNextArg = va_arg(argList, FX_LPWSTR);
+ if (pstrNextArg == NULL) {
+ nItemLen = 6;
+ } else {
+ nItemLen = (FX_STRSIZE)FXSYS_wcslen(pstrNextArg);
+ if (nItemLen < 1) {
+ nItemLen = 1;
+ }
+ }
+ }
+ break;
+ case 's'|FORCE_ANSI:
+ case 'S'|FORCE_ANSI: {
+ FX_LPCSTR pstrNextArg = va_arg(argList, FX_LPCSTR);
+ if (pstrNextArg == NULL) {
+ nItemLen = 6;
+ } else {
+ nItemLen = (FX_STRSIZE)FXSYS_strlen(pstrNextArg);
+ if (nItemLen < 1) {
+ nItemLen = 1;
+ }
+ }
+ }
+ break;
+ case 's'|FORCE_UNICODE:
+ case 'S'|FORCE_UNICODE: {
+ FX_LPWSTR pstrNextArg = va_arg(argList, FX_LPWSTR);
+ if (pstrNextArg == NULL) {
+ nItemLen = 6;
+ } else {
+ nItemLen = (FX_STRSIZE)FXSYS_wcslen(pstrNextArg);
+ if (nItemLen < 1) {
+ nItemLen = 1;
+ }
+ }
+ }
+ break;
+ }
+ if (nItemLen != 0) {
+ if (nPrecision != 0 && nItemLen > nPrecision) {
+ nItemLen = nPrecision;
+ }
+ if (nItemLen < nWidth) {
+ nItemLen = nWidth;
+ }
+ } else {
+ switch (*lpsz) {
+ case 'd':
+ case 'i':
+ case 'u':
+ case 'x':
+ case 'X':
+ case 'o':
+ if (nModifier & FORCE_INT64) {
+ va_arg(argList, FX_INT64);
+ } else {
+ va_arg(argList, int);
+ }
+ nItemLen = 32;
+ if (nItemLen < nWidth + nPrecision) {
+ nItemLen = nWidth + nPrecision;
+ }
+ break;
+ case 'a':
+ case 'A':
+ case 'e':
+ case 'E':
+ case 'g':
+ case 'G':
+ va_arg(argList, double);
+ nItemLen = 128;
+ if (nItemLen < nWidth + nPrecision) {
+ nItemLen = nWidth + nPrecision;
+ }
+ break;
+ case 'f':
+ if (nWidth + nPrecision > 100) {
+ nItemLen = nPrecision + nWidth + 128;
+ } else {
+ double f;
+ char pszTemp[256];
+ f = va_arg(argList, double);
+ FXSYS_sprintf(pszTemp, "%*.*f", nWidth, nPrecision + 6, f );
+ nItemLen = (FX_STRSIZE)FXSYS_strlen(pszTemp);
+ }
+ break;
+ case 'p':
+ va_arg(argList, void*);
+ nItemLen = 32;
+ if (nItemLen < nWidth + nPrecision) {
+ nItemLen = nWidth + nPrecision;
+ }
+ break;
+ case 'n':
+ va_arg(argList, int*);
+ break;
+ }
+ }
+ nMaxLen += nItemLen;
+ }
+ GetBuffer(nMaxLen);
+ if (m_pData) {
+ FXSYS_vsprintf(m_pData->m_String, lpszFormat, argListSave);
+ ReleaseBuffer();
+ }
+ va_end(argListSave);
+}
+void CFX_ByteString::Format(FX_LPCSTR lpszFormat, ...)
+{
+ va_list argList;
+ va_start(argList, lpszFormat);
+ FormatV(lpszFormat, argList);
+ va_end(argList);
+}
+FX_STRSIZE CFX_ByteString::Insert(FX_STRSIZE nIndex, FX_CHAR ch)
+{
+ CopyBeforeWrite();
+ if (nIndex < 0) {
+ nIndex = 0;
+ }
+ FX_STRSIZE nNewLength = m_pData ? m_pData->m_nDataLength : 0;
+ if (nIndex > nNewLength) {
+ nIndex = nNewLength;
+ }
+ nNewLength++;
+ if (m_pData == NULL || m_pData->m_nAllocLength < nNewLength) {
+ CFX_StringData* pOldData = m_pData;
+ FX_LPCSTR pstr = m_pData->m_String;
+ m_pData = FX_AllocString(nNewLength);
+ if (!m_pData) {
+ return 0;
+ }
+ if(pOldData != NULL) {
+ FXSYS_memmove32(m_pData->m_String, pstr, (pOldData->m_nDataLength + 1)*sizeof(char));
+ FX_ReleaseString(pOldData);
+ } else {
+ m_pData->m_String[0] = 0;
+ }
+ }
+ FXSYS_memmove32(m_pData->m_String + nIndex + 1,
+ m_pData->m_String + nIndex, (nNewLength - nIndex)*sizeof(char));
+ m_pData->m_String[nIndex] = ch;
+ m_pData->m_nDataLength = nNewLength;
+ return nNewLength;
+}
+CFX_ByteString CFX_ByteString::Right(FX_STRSIZE nCount) const
+{
+ if (m_pData == NULL) {
+ return CFX_ByteString();
+ }
+ if (nCount < 0) {
+ nCount = 0;
+ }
+ if (nCount >= m_pData->m_nDataLength) {
+ return *this;
+ }
+ CFX_ByteString dest;
+ AllocCopy(dest, nCount, m_pData->m_nDataLength - nCount, 0);
+ return dest;
+}
+CFX_ByteString CFX_ByteString::Left(FX_STRSIZE nCount) const
+{
+ if (m_pData == NULL) {
+ return CFX_ByteString();
+ }
+ if (nCount < 0) {
+ nCount = 0;
+ }
+ if (nCount >= m_pData->m_nDataLength) {
+ return *this;
+ }
+ CFX_ByteString dest;
+ AllocCopy(dest, nCount, 0, 0);
+ return dest;
+}
+FX_STRSIZE CFX_ByteString::Find(FX_CHAR ch, FX_STRSIZE nStart) const
+{
+ if (m_pData == NULL) {
+ return -1;
+ }
+ FX_STRSIZE nLength = m_pData->m_nDataLength;
+ if (nStart >= nLength) {
+ return -1;
+ }
+ FX_LPCSTR lpsz = FXSYS_strchr(m_pData->m_String + nStart, ch);
+ return (lpsz == NULL) ? -1 : (int)(lpsz - m_pData->m_String);
+}
+FX_STRSIZE CFX_ByteString::ReverseFind(FX_CHAR ch) const
+{
+ if (m_pData == NULL) {
+ return -1;
+ }
+ FX_STRSIZE nLength = m_pData->m_nDataLength;
+ while (nLength) {
+ if (m_pData->m_String[nLength - 1] == ch) {
+ return nLength - 1;
+ }
+ nLength --;
+ }
+ return -1;
+}
+FX_LPCSTR FX_strstr(FX_LPCSTR str1, int len1, FX_LPCSTR str2, int len2)
+{
+ if (len2 > len1 || len2 == 0) {
+ return NULL;
+ }
+ FX_LPCSTR end_ptr = str1 + len1 - len2;
+ while (str1 <= end_ptr) {
+ int i = 0;
+ while (1) {
+ if (str1[i] != str2[i]) {
+ break;
+ }
+ i ++;
+ if (i == len2) {
+ return str1;
+ }
+ }
+ str1 ++;
+ }
+ return NULL;
+}
+FX_STRSIZE CFX_ByteString::Find(FX_BSTR lpszSub, FX_STRSIZE nStart) const
+{
+ if (m_pData == NULL) {
+ return -1;
+ }
+ FX_STRSIZE nLength = m_pData->m_nDataLength;
+ if (nStart > nLength) {
+ return -1;
+ }
+ FX_LPCSTR lpsz = FX_strstr(m_pData->m_String + nStart, m_pData->m_nDataLength - nStart,
+ lpszSub.GetCStr(), lpszSub.GetLength());
+ return (lpsz == NULL) ? -1 : (int)(lpsz - m_pData->m_String);
+}
+void CFX_ByteString::MakeLower()
+{
+ if (m_pData == NULL) {
+ return;
+ }
+ CopyBeforeWrite();
+ if (GetLength() < 1) {
+ return;
+ }
+ FXSYS_strlwr(m_pData->m_String);
+}
+void CFX_ByteString::MakeUpper()
+{
+ if (m_pData == NULL) {
+ return;
+ }
+ CopyBeforeWrite();
+ if (GetLength() < 1) {
+ return;
+ }
+ FXSYS_strupr(m_pData->m_String);
+}
+FX_STRSIZE CFX_ByteString::Remove(FX_CHAR chRemove)
+{
+ if (m_pData == NULL) {
+ return 0;
+ }
+ CopyBeforeWrite();
+ if (GetLength() < 1) {
+ return 0;
+ }
+ FX_LPSTR pstrSource = m_pData->m_String;
+ FX_LPSTR pstrDest = m_pData->m_String;
+ FX_LPSTR pstrEnd = m_pData->m_String + m_pData->m_nDataLength;
+ while (pstrSource < pstrEnd) {
+ if (*pstrSource != chRemove) {
+ *pstrDest = *pstrSource;
+ pstrDest ++;
+ }
+ pstrSource ++;
+ }
+ *pstrDest = 0;
+ FX_STRSIZE nCount = (FX_STRSIZE)(pstrSource - pstrDest);
+ m_pData->m_nDataLength -= nCount;
+ return nCount;
+}
+FX_STRSIZE CFX_ByteString::Replace(FX_BSTR lpszOld, FX_BSTR lpszNew)
+{
+ if (m_pData == NULL) {
+ return 0;
+ }
+ if (lpszOld.IsEmpty()) {
+ return 0;
+ }
+ FX_STRSIZE nSourceLen = lpszOld.GetLength();
+ FX_STRSIZE nReplacementLen = lpszNew.GetLength();
+ FX_STRSIZE nCount = 0;
+ FX_LPCSTR pStart = m_pData->m_String;
+ FX_LPSTR pEnd = m_pData->m_String + m_pData->m_nDataLength;
+ while (1) {
+ FX_LPCSTR pTarget = FX_strstr(pStart, (FX_STRSIZE)(pEnd - pStart), lpszOld.GetCStr(), nSourceLen);
+ if (pTarget == NULL) {
+ break;
+ }
+ nCount++;
+ pStart = pTarget + nSourceLen;
+ }
+ if (nCount == 0) {
+ return 0;
+ }
+ FX_STRSIZE nNewLength = m_pData->m_nDataLength + (nReplacementLen - nSourceLen) * nCount;
+ if (nNewLength == 0) {
+ Empty();
+ return nCount;
+ }
+ CFX_StringData* pNewData = FX_AllocString(nNewLength);
+ if (!pNewData) {
+ return 0;
+ }
+ pStart = m_pData->m_String;
+ FX_LPSTR pDest = pNewData->m_String;
+ for (FX_STRSIZE i = 0; i < nCount; i ++) {
+ FX_LPCSTR pTarget = FX_strstr(pStart, (FX_STRSIZE)(pEnd - pStart), lpszOld.GetCStr(), nSourceLen);
+ FXSYS_memcpy32(pDest, pStart, pTarget - pStart);
+ pDest += pTarget - pStart;
+ FXSYS_memcpy32(pDest, lpszNew.GetCStr(), lpszNew.GetLength());
+ pDest += lpszNew.GetLength();
+ pStart = pTarget + nSourceLen;
+ }
+ FXSYS_memcpy32(pDest, pStart, pEnd - pStart);
+ FX_ReleaseString(m_pData);
+ m_pData = pNewData;
+ return nCount;
+}
+void CFX_ByteString::SetAt(FX_STRSIZE nIndex, FX_CHAR ch)
+{
+ if (m_pData == NULL) {
+ return;
+ }
+ FXSYS_assert(nIndex >= 0);
+ FXSYS_assert(nIndex < m_pData->m_nDataLength);
+ CopyBeforeWrite();
+ m_pData->m_String[nIndex] = ch;
+}
+CFX_ByteString CFX_ByteString::LoadFromFile(FX_BSTR filename)
+{
+ FXSYS_FILE* file = FXSYS_fopen(CFX_ByteString(filename), "rb");
+ if (file == NULL) {
+ return CFX_ByteString();
+ }
+ FXSYS_fseek(file, 0, FXSYS_SEEK_END);
+ int len = FXSYS_ftell(file);
+ FXSYS_fseek(file, 0, FXSYS_SEEK_SET);
+ CFX_ByteString str;
+ FX_LPSTR buf = str.GetBuffer(len);
+ size_t readCnt = FXSYS_fread(buf, 1, len, file);
+ str.ReleaseBuffer(len);
+ FXSYS_fclose(file);
+ return str;
+}
+CFX_WideString CFX_ByteString::UTF8Decode() const
+{
+ CFX_UTF8Decoder decoder;
+ for (FX_STRSIZE i = 0; i < GetLength(); i ++) {
+ decoder.Input((FX_BYTE)m_pData->m_String[i]);
+ }
+ return decoder.GetResult();
+}
+CFX_ByteString CFX_ByteString::FromUnicode(FX_LPCWSTR str, FX_STRSIZE len)
+{
+ if (len < 0) {
+ len = (FX_STRSIZE)FXSYS_wcslen(str);
+ }
+ CFX_ByteString bstr;
+ bstr.ConvertFrom(CFX_WideString(str, len));
+ return bstr;
+}
+CFX_ByteString CFX_ByteString::FromUnicode(const CFX_WideString& str)
+{
+ return FromUnicode((FX_LPCWSTR)str, str.GetLength());
+}
+void CFX_ByteString::ConvertFrom(const CFX_WideString& str, CFX_CharMap* pCharMap)
+{
+ if (pCharMap == NULL) {
+ pCharMap = CFX_CharMap::GetDefaultMapper();
+ }
+ *this = (*pCharMap->m_GetByteString)(pCharMap, str);
+}
+int CFX_ByteString::Compare(FX_BSTR str) const
+{
+ if (m_pData == NULL) {
+ return str.IsEmpty() ? 0 : -1;
+ }
+ int this_len = m_pData->m_nDataLength;
+ int that_len = str.GetLength();
+ int min_len = this_len < that_len ? this_len : that_len;
+ for (int i = 0; i < min_len; i ++) {
+ if ((FX_BYTE)m_pData->m_String[i] < str.GetAt(i)) {
+ return -1;
+ } else if ((FX_BYTE)m_pData->m_String[i] > str.GetAt(i)) {
+ return 1;
+ }
+ }
+ if (this_len < that_len) {
+ return -1;
+ } else if (this_len > that_len) {
+ return 1;
+ }
+ return 0;
+}
+void CFX_ByteString::TrimRight(FX_BSTR lpszTargets)
+{
+ if (m_pData == NULL || lpszTargets.IsEmpty()) {
+ return;
+ }
+ CopyBeforeWrite();
+ FX_STRSIZE pos = GetLength();
+ if (pos < 1) {
+ return;
+ }
+ while (pos) {
+ FX_STRSIZE i = 0;
+ while (i < lpszTargets.GetLength() && lpszTargets[i] != m_pData->m_String[pos - 1]) {
+ i ++;
+ }
+ if (i == lpszTargets.GetLength()) {
+ break;
+ }
+ pos --;
+ }
+ if (pos < m_pData->m_nDataLength) {
+ m_pData->m_String[pos] = 0;
+ m_pData->m_nDataLength = pos;
+ }
+}
+void CFX_ByteString::TrimRight(FX_CHAR chTarget)
+{
+ TrimRight(CFX_ByteStringC(chTarget));
+}
+void CFX_ByteString::TrimRight()
+{
+ TrimRight(FX_BSTRC("\x09\x0a\x0b\x0c\x0d\x20"));
+}
+void CFX_ByteString::TrimLeft(FX_BSTR lpszTargets)
+{
+ if (m_pData == NULL) {
+ return;
+ }
+ if (lpszTargets.IsEmpty()) {
+ return;
+ }
+ CopyBeforeWrite();
+ FX_STRSIZE len = GetLength();
+ if (len < 1) {
+ return;
+ }
+ FX_STRSIZE pos = 0;
+ while (pos < len) {
+ FX_STRSIZE i = 0;
+ while (i < lpszTargets.GetLength() && lpszTargets[i] != m_pData->m_String[pos]) {
+ i ++;
+ }
+ if (i == lpszTargets.GetLength()) {
+ break;
+ }
+ pos ++;
+ }
+ if (pos) {
+ FX_STRSIZE nDataLength = len - pos;
+ FXSYS_memmove32(m_pData->m_String, m_pData->m_String + pos, (nDataLength + 1)*sizeof(FX_CHAR));
+ m_pData->m_nDataLength = nDataLength;
+ }
+}
+void CFX_ByteString::TrimLeft(FX_CHAR chTarget)
+{
+ TrimLeft(CFX_ByteStringC(chTarget));
+}
+void CFX_ByteString::TrimLeft()
+{
+ TrimLeft(FX_BSTRC("\x09\x0a\x0b\x0c\x0d\x20"));
+}
+FX_DWORD CFX_ByteString::GetID(FX_STRSIZE start_pos) const
+{
+ return CFX_ByteStringC(*this).GetID(start_pos);
+}
+FX_DWORD CFX_ByteStringC::GetID(FX_STRSIZE start_pos) const
+{
+ if (m_Length == 0) {
+ return 0;
+ }
+ if (start_pos >= m_Length) {
+ return 0;
+ }
+ FX_DWORD strid = 0;
+ if (start_pos + 4 > m_Length) {
+ for (FX_STRSIZE i = 0; i < m_Length - start_pos; i ++) {
+ strid = strid * 256 + m_Ptr[start_pos + i];
+ }
+ strid = strid << ((4 - m_Length + start_pos) * 8);
+ } else {
+ for (int i = 0; i < 4; i ++) {
+ strid = strid * 256 + m_Ptr[start_pos + i];
+ }
+ }
+ return strid;
+}
+FX_STRSIZE FX_ftoa(FX_FLOAT d, FX_LPSTR buf)
+{
+ buf[0] = '0';
+ buf[1] = '\0';
+ if (d == 0.0f) {
+ return 1;
+ }
+ FX_BOOL bNegative = FALSE;
+ if (d < 0) {
+ bNegative = TRUE;
+ d = -d;
+ }
+ int scale = 1;
+ int scaled = FXSYS_round(d);
+ while (scaled < 100000) {
+ if (scale == 1000000) {
+ break;
+ }
+ scale *= 10;
+ scaled = FXSYS_round(d * scale);
+ }
+ if (scaled == 0) {
+ return 1;
+ }
+ char buf2[32];
+ int buf_size = 0;
+ if (bNegative) {
+ buf[buf_size++] = '-';
+ }
+ int i = scaled / scale;
+ FXSYS_itoa(i, buf2, 10);
+ FX_STRSIZE len = (FX_STRSIZE)FXSYS_strlen(buf2);
+ FXSYS_memcpy32(buf + buf_size, buf2, len);
+ buf_size += len;
+ int fraction = scaled % scale;
+ if (fraction == 0) {
+ return buf_size;
+ }
+ buf[buf_size++] = '.';
+ scale /= 10;
+ while (fraction) {
+ buf[buf_size++] = '0' + fraction / scale;
+ fraction %= scale;
+ scale /= 10;
+ }
+ return buf_size;
+}
+CFX_ByteString CFX_ByteString::FormatFloat(FX_FLOAT d, int precision)
+{
+ FX_CHAR buf[32];
+ FX_STRSIZE len = FX_ftoa(d, buf);
+ return CFX_ByteString(buf, len);
+}
+void CFX_StringBufBase::Copy(FX_BSTR str)
+{
+ m_Size = str.GetLength();
+ if (m_Size > m_Limit) {
+ m_Size = m_Limit;
+ }
+ FX_CHAR* pBuffer = (FX_CHAR*)(this + 1);
+ FXSYS_memcpy32(pBuffer, str.GetPtr(), m_Size);
+}
+void CFX_StringBufBase::Append(FX_BSTR str)
+{
+ int len = str.GetLength();
+ if (len > m_Limit - m_Size) {
+ len = m_Limit - m_Size;
+ }
+ FX_CHAR* pBuffer = (FX_CHAR*)(this + 1);
+ FXSYS_memcpy32(pBuffer + m_Size, str.GetPtr(), len);
+ m_Size += len;
+}
+void CFX_StringBufBase::Append(int i, FX_DWORD flags)
+{
+ char buf[32];
+ int len = _Buffer_itoa(buf, i, flags);
+ Append(CFX_ByteStringC(buf, len));
+}
+void CFX_ByteStringL::Empty(IFX_Allocator* pAllocator)
+{
+ if (m_Ptr) {
+ FX_Allocator_Free(pAllocator, (FX_LPVOID)m_Ptr);
+ }
+ m_Ptr = NULL, m_Length = 0;
+}
+FX_LPSTR CFX_ByteStringL::AllocBuffer(FX_STRSIZE length, IFX_Allocator* pAllocator)
+{
+ Empty(pAllocator);
+ FX_LPSTR str = FX_Allocator_Alloc(pAllocator, FX_CHAR, length + 1);
+ if (!str) {
+ return NULL;
+ }
+ *(FX_LPSTR*)(&m_Ptr) = str;
+ m_Length = length;
+ return str;
+}
+void CFX_ByteStringL::Set(FX_BSTR src, IFX_Allocator* pAllocator)
+{
+ Empty(pAllocator);
+ if (src.GetCStr() != NULL && src.GetLength() > 0) {
+ FX_LPSTR str = FX_Allocator_Alloc(pAllocator, FX_CHAR, src.GetLength() + 1);
+ if (!str) {
+ return;
+ }
+ FXSYS_memcpy32(str, src, src.GetLength());
+ str[src.GetLength()] = '\0';
+ *(FX_LPSTR*)(&m_Ptr) = str;
+ m_Length = src.GetLength();
+ }
+}
diff --git a/core/src/fxcrt/fx_basic_buffer.cpp b/core/src/fxcrt/fx_basic_buffer.cpp
index ef3cd21350..4427857b27 100644
--- a/core/src/fxcrt/fx_basic_buffer.cpp
+++ b/core/src/fxcrt/fx_basic_buffer.cpp
@@ -1,574 +1,574 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../include/fxcrt/fx_basic.h"
-FX_STRSIZE FX_ftoa(FX_FLOAT f, FX_LPSTR buf);
-CFX_BinaryBuf::CFX_BinaryBuf(IFX_Allocator* pAllocator)
- : m_pAllocator(pAllocator)
- , m_AllocStep(0)
- , m_pBuffer(NULL)
- , m_DataSize(0)
- , m_AllocSize(0)
-{
-}
-CFX_BinaryBuf::CFX_BinaryBuf(FX_STRSIZE size, IFX_Allocator* pAllocator)
- : m_pAllocator(pAllocator)
- , m_AllocStep(0)
- , m_DataSize(size)
- , m_AllocSize(size)
-{
- m_pBuffer = FX_Allocator_Alloc(m_pAllocator, FX_BYTE, size);
-}
-CFX_BinaryBuf::~CFX_BinaryBuf()
-{
- if (m_pBuffer) {
- FX_Allocator_Free(m_pAllocator, m_pBuffer);
- }
-}
-void CFX_BinaryBuf::Delete(int start_index, int count)
-{
- if (!m_pBuffer || start_index < 0 || start_index + count > m_DataSize) {
- return;
- }
- FXSYS_memmove32(m_pBuffer + start_index, m_pBuffer + start_index + count, m_DataSize - start_index - count);
- m_DataSize -= count;
-}
-void CFX_BinaryBuf::Clear()
-{
- m_DataSize = 0;
-}
-void CFX_BinaryBuf::DetachBuffer()
-{
- m_DataSize = 0;
- m_pBuffer = NULL;
- m_AllocSize = 0;
-}
-void CFX_BinaryBuf::AttachData(void* buffer, FX_STRSIZE size)
-{
- if (m_pBuffer) {
- FX_Allocator_Free(m_pAllocator, m_pBuffer);
- }
- m_DataSize = size;
- m_pBuffer = (FX_LPBYTE)buffer;
- m_AllocSize = size;
-}
-void CFX_BinaryBuf::TakeOver(CFX_BinaryBuf& other)
-{
- AttachData(other.GetBuffer(), other.GetSize());
- other.DetachBuffer();
-}
-void CFX_BinaryBuf::EstimateSize(FX_STRSIZE size, FX_STRSIZE step)
-{
- m_AllocStep = step;
- if (m_AllocSize >= size) {
- return;
- }
- ExpandBuf(size - m_DataSize);
-}
-void CFX_BinaryBuf::ExpandBuf(FX_STRSIZE add_size)
-{
- FX_STRSIZE new_size = add_size + m_DataSize;
- if (m_AllocSize >= new_size) {
- return;
- }
- int alloc_step;
- if (m_AllocStep == 0) {
- alloc_step = m_AllocSize / 4;
- if (alloc_step < 128 ) {
- alloc_step = 128;
- }
- } else {
- alloc_step = m_AllocStep;
- }
- new_size = (new_size + alloc_step - 1) / alloc_step * alloc_step;
- FX_LPBYTE pNewBuffer = m_pBuffer;
- if (pNewBuffer) {
- pNewBuffer = FX_Allocator_Realloc(m_pAllocator, FX_BYTE, m_pBuffer, new_size);
- } else {
- pNewBuffer = FX_Allocator_Alloc(m_pAllocator, FX_BYTE, new_size);
- }
- if (pNewBuffer) {
- m_pBuffer = pNewBuffer;
- m_AllocSize = new_size;
- }
-}
-void CFX_BinaryBuf::CopyData(const void* pStr, FX_STRSIZE size)
-{
- if (size == 0) {
- m_DataSize = 0;
- return;
- }
- if (m_AllocSize < size) {
- ExpandBuf(size - m_DataSize);
- }
- if (!m_pBuffer) {
- return;
- }
- FXSYS_memcpy32(m_pBuffer, pStr, size);
- m_DataSize = size;
-}
-void CFX_BinaryBuf::AppendBlock(const void* pBuf, FX_STRSIZE size)
-{
- ExpandBuf(size);
- if (pBuf && m_pBuffer) {
- FXSYS_memcpy32(m_pBuffer + m_DataSize, pBuf, size);
- }
- m_DataSize += size;
-}
-void CFX_BinaryBuf::InsertBlock(FX_STRSIZE pos, const void* pBuf, FX_STRSIZE size)
-{
- ExpandBuf(size);
- if (!m_pBuffer) {
- return;
- }
- FXSYS_memmove32(m_pBuffer + pos + size, m_pBuffer + pos, m_DataSize - pos);
- if (pBuf) {
- FXSYS_memcpy32(m_pBuffer + pos, pBuf, size);
- }
- m_DataSize += size;
-}
-void CFX_BinaryBuf::AppendFill(FX_BYTE byte, FX_STRSIZE count)
-{
- ExpandBuf(count);
- if (!m_pBuffer) {
- return;
- }
- FXSYS_memset8(m_pBuffer + m_DataSize, byte, count);
- m_DataSize += count;
-}
-CFX_ByteStringC CFX_BinaryBuf::GetByteString() const
-{
- return CFX_ByteStringC(m_pBuffer, m_DataSize);
-}
-void CFX_BinaryBuf::GetByteStringL(CFX_ByteStringL &str) const
-{
- str.Set(CFX_ByteStringC(m_pBuffer, m_DataSize), m_pAllocator);
-}
-CFX_ByteTextBuf& CFX_ByteTextBuf::operator << (FX_BSTR lpsz)
-{
- AppendBlock((FX_LPCBYTE)lpsz, lpsz.GetLength());
- return *this;
-}
-CFX_ByteTextBuf& CFX_ByteTextBuf::operator << (int i)
-{
- char buf[32];
- FXSYS_itoa(i, buf, 10);
- AppendBlock(buf, (FX_STRSIZE)FXSYS_strlen(buf));
- return *this;
-}
-CFX_ByteTextBuf& CFX_ByteTextBuf::operator << (FX_DWORD i)
-{
- char buf[32];
- FXSYS_itoa(i, buf, 10);
- AppendBlock(buf, (FX_STRSIZE)FXSYS_strlen(buf));
- return *this;
-}
-CFX_ByteTextBuf& CFX_ByteTextBuf::operator << (double f)
-{
- char buf[32];
- FX_STRSIZE len = FX_ftoa((FX_FLOAT)f, buf);
- AppendBlock(buf, len);
- return *this;
-}
-CFX_ByteTextBuf& CFX_ByteTextBuf::operator << (const CFX_ByteTextBuf& buf)
-{
- AppendBlock(buf.m_pBuffer, buf.m_DataSize);
- return *this;
-}
-void CFX_ByteTextBuf::operator =(const CFX_ByteStringC& str)
-{
- CopyData((FX_LPCBYTE)str, str.GetLength());
-}
-void CFX_WideTextBuf::AppendChar(FX_WCHAR ch)
-{
- if (m_AllocSize < m_DataSize + (FX_STRSIZE)sizeof(FX_WCHAR)) {
- ExpandBuf(sizeof(FX_WCHAR));
- }
- ASSERT(m_pBuffer != NULL);
- *(FX_WCHAR*)(m_pBuffer + m_DataSize) = ch;
- m_DataSize += sizeof(FX_WCHAR);
-}
-CFX_WideTextBuf& CFX_WideTextBuf::operator << (FX_WSTR str)
-{
- AppendBlock(str.GetPtr(), str.GetLength() * sizeof(FX_WCHAR));
- return *this;
-}
-CFX_WideTextBuf& CFX_WideTextBuf::operator << (const CFX_WideString &str)
-{
- AppendBlock((FX_LPCWSTR)str, str.GetLength() * sizeof(FX_WCHAR));
- return *this;
-}
-CFX_WideTextBuf& CFX_WideTextBuf::operator << (int i)
-{
- char buf[32];
- FXSYS_itoa(i, buf, 10);
- FX_STRSIZE len = (FX_STRSIZE)FXSYS_strlen(buf);
- if (m_AllocSize < m_DataSize + (FX_STRSIZE)(len * sizeof(FX_WCHAR))) {
- ExpandBuf(len * sizeof(FX_WCHAR));
- }
- ASSERT(m_pBuffer != NULL);
- FX_LPWSTR str = (FX_WCHAR*)(m_pBuffer + m_DataSize);
- for (FX_STRSIZE j = 0; j < len; j ++) {
- *str ++ = buf[j];
- }
- m_DataSize += len * sizeof(FX_WCHAR);
- return *this;
-}
-CFX_WideTextBuf& CFX_WideTextBuf::operator << (double f)
-{
- char buf[32];
- FX_STRSIZE len = FX_ftoa((FX_FLOAT)f, buf);
- if (m_AllocSize < m_DataSize + (FX_STRSIZE)(len * sizeof(FX_WCHAR))) {
- ExpandBuf(len * sizeof(FX_WCHAR));
- }
- ASSERT(m_pBuffer != NULL);
- FX_LPWSTR str = (FX_WCHAR*)(m_pBuffer + m_DataSize);
- for (FX_STRSIZE i = 0; i < len; i ++) {
- *str ++ = buf[i];
- }
- m_DataSize += len * sizeof(FX_WCHAR);
- return *this;
-}
-CFX_WideTextBuf& CFX_WideTextBuf::operator << (FX_LPCWSTR lpsz)
-{
- AppendBlock(lpsz, (FX_STRSIZE)FXSYS_wcslen(lpsz)*sizeof(FX_WCHAR));
- return *this;
-}
-CFX_WideTextBuf& CFX_WideTextBuf::operator << (const CFX_WideTextBuf& buf)
-{
- AppendBlock(buf.m_pBuffer, buf.m_DataSize);
- return *this;
-}
-void CFX_WideTextBuf::operator =(FX_WSTR str)
-{
- CopyData(str.GetPtr(), str.GetLength() * sizeof(FX_WCHAR));
-}
-CFX_WideStringC CFX_WideTextBuf::GetWideString() const
-{
- return CFX_WideStringC((FX_LPCWSTR)m_pBuffer, m_DataSize / sizeof(FX_WCHAR));
-}
-void CFX_WideTextBuf::GetWideStringL(CFX_WideStringL& wideText) const
-{
- wideText.Set(CFX_WideStringC((FX_LPCWSTR)m_pBuffer, m_DataSize / sizeof(FX_WCHAR)), m_pAllocator);
-}
-CFX_ArchiveSaver& CFX_ArchiveSaver::operator << (FX_BYTE i)
-{
- if (m_pStream) {
- m_pStream->WriteBlock(&i, 1);
- } else {
- m_SavingBuf.AppendByte(i);
- }
- return *this;
-}
-CFX_ArchiveSaver& CFX_ArchiveSaver::operator << (int i)
-{
- if (m_pStream) {
- m_pStream->WriteBlock(&i, sizeof(int));
- } else {
- m_SavingBuf.AppendBlock(&i, sizeof(int));
- }
- return *this;
-}
-CFX_ArchiveSaver& CFX_ArchiveSaver::operator << (FX_DWORD i)
-{
- if (m_pStream) {
- m_pStream->WriteBlock(&i, sizeof(FX_DWORD));
- } else {
- m_SavingBuf.AppendBlock(&i, sizeof(FX_DWORD));
- }
- return *this;
-}
-CFX_ArchiveSaver& CFX_ArchiveSaver::operator << (FX_FLOAT f)
-{
- if (m_pStream) {
- m_pStream->WriteBlock(&f, sizeof(FX_FLOAT));
- } else {
- m_SavingBuf.AppendBlock(&f, sizeof(FX_FLOAT));
- }
- return *this;
-}
-CFX_ArchiveSaver& CFX_ArchiveSaver::operator << (FX_BSTR bstr)
-{
- int len = bstr.GetLength();
- if (m_pStream) {
- m_pStream->WriteBlock(&len, sizeof(int));
- m_pStream->WriteBlock(bstr, len);
- } else {
- m_SavingBuf.AppendBlock(&len, sizeof(int));
- m_SavingBuf.AppendBlock(bstr, len);
- }
- return *this;
-}
-CFX_ArchiveSaver& CFX_ArchiveSaver::operator << (FX_LPCWSTR wstr)
-{
- FX_STRSIZE len = (FX_STRSIZE)FXSYS_wcslen(wstr);
- if (m_pStream) {
- m_pStream->WriteBlock(&len, sizeof(int));
- m_pStream->WriteBlock(wstr, len);
- } else {
- m_SavingBuf.AppendBlock(&len, sizeof(int));
- m_SavingBuf.AppendBlock(wstr, len);
- }
- return *this;
-}
-CFX_ArchiveSaver& CFX_ArchiveSaver::operator << (const CFX_WideString& wstr)
-{
- CFX_ByteString encoded = wstr.UTF16LE_Encode();
- return operator << (encoded);
-}
-void CFX_ArchiveSaver::Write(const void* pData, FX_STRSIZE dwSize)
-{
- if (m_pStream) {
- m_pStream->WriteBlock(pData, dwSize);
- } else {
- m_SavingBuf.AppendBlock(pData, dwSize);
- }
-}
-CFX_ArchiveLoader::CFX_ArchiveLoader(FX_LPCBYTE pData, FX_DWORD dwSize)
-{
- m_pLoadingBuf = pData;
- m_LoadingPos = 0;
- m_LoadingSize = dwSize;
-}
-FX_BOOL CFX_ArchiveLoader::IsEOF()
-{
- return m_LoadingPos >= m_LoadingSize;
-}
-CFX_ArchiveLoader& CFX_ArchiveLoader::operator >> (FX_BYTE& i)
-{
- if (m_LoadingPos >= m_LoadingSize) {
- return *this;
- }
- i = m_pLoadingBuf[m_LoadingPos++];
- return *this;
-}
-CFX_ArchiveLoader& CFX_ArchiveLoader::operator >> (int& i)
-{
- Read(&i, sizeof(int));
- return *this;
-}
-CFX_ArchiveLoader& CFX_ArchiveLoader::operator >> (FX_DWORD& i)
-{
- Read(&i, sizeof(FX_DWORD));
- return *this;
-}
-CFX_ArchiveLoader& CFX_ArchiveLoader::operator >> (FX_FLOAT& i)
-{
- Read(&i, sizeof(FX_FLOAT));
- return *this;
-}
-CFX_ArchiveLoader& CFX_ArchiveLoader::operator >> (CFX_ByteString& str)
-{
- if (m_LoadingPos + 4 > m_LoadingSize) {
- return *this;
- }
- int len;
- operator >> (len);
- str.Empty();
- if (len <= 0 || m_LoadingPos + len > m_LoadingSize) {
- return *this;
- }
- FX_LPSTR buffer = str.GetBuffer(len);
- FXSYS_memcpy32(buffer, m_pLoadingBuf + m_LoadingPos, len);
- str.ReleaseBuffer(len);
- m_LoadingPos += len;
- return *this;
-}
-CFX_ArchiveLoader& CFX_ArchiveLoader::operator >> (CFX_WideString& str)
-{
- CFX_ByteString encoded;
- operator >> (encoded);
- str = CFX_WideString::FromUTF16LE((const unsigned short*)(FX_LPCSTR)encoded, encoded.GetLength());
- return *this;
-}
-FX_BOOL CFX_ArchiveLoader::Read(void* pBuf, FX_DWORD dwSize)
-{
- if (m_LoadingPos + dwSize > m_LoadingSize) {
- return FALSE;
- }
- FXSYS_memcpy32(pBuf, m_pLoadingBuf + m_LoadingPos, dwSize);
- m_LoadingPos += dwSize;
- return TRUE;
-}
-void CFX_BitStream::Init(FX_LPCBYTE pData, FX_DWORD dwSize)
-{
- m_pData = pData;
- m_BitSize = dwSize * 8;
- m_BitPos = 0;
-}
-void CFX_BitStream::ByteAlign()
-{
- int mod = m_BitPos % 8;
- if (mod == 0) {
- return;
- }
- m_BitPos += 8 - mod;
-}
-FX_DWORD CFX_BitStream::GetBits(FX_DWORD nBits)
-{
- if (nBits > m_BitSize || m_BitPos + nBits > m_BitSize) {
- return 0;
- }
- if (nBits == 1) {
- int bit = (m_pData[m_BitPos / 8] & (1 << (7 - m_BitPos % 8))) ? 1 : 0;
- m_BitPos ++;
- return bit;
- }
- FX_DWORD byte_pos = m_BitPos / 8;
- FX_DWORD bit_pos = m_BitPos % 8, bit_left = nBits;
- FX_DWORD result = 0;
- if (bit_pos) {
- if (8 - bit_pos >= bit_left) {
- result = (m_pData[byte_pos] & (0xff >> bit_pos)) >> (8 - bit_pos - bit_left);
- m_BitPos += bit_left;
- return result;
- }
- bit_left -= 8 - bit_pos;
- result = (m_pData[byte_pos++] & ((1 << (8 - bit_pos)) - 1)) << bit_left;
- }
- while (bit_left >= 8) {
- bit_left -= 8;
- result |= m_pData[byte_pos++] << bit_left;
- }
- if (bit_left) {
- result |= m_pData[byte_pos] >> (8 - bit_left);
- }
- m_BitPos += nBits;
- return result;
-}
-IFX_BufferArchive::IFX_BufferArchive(FX_STRSIZE size, IFX_Allocator* pAllocator)
- : m_pAllocator(pAllocator)
- , m_BufSize(size)
- , m_pBuffer(NULL)
- , m_Length(0)
-{
-}
-void IFX_BufferArchive::Clear()
-{
- m_Length = 0;
- if (m_pBuffer) {
- FX_Allocator_Free(m_pAllocator, m_pBuffer);
- m_pBuffer = NULL;
- }
-}
-FX_BOOL IFX_BufferArchive::Flush()
-{
- FX_BOOL bRet = DoWork(m_pBuffer, m_Length);
- m_Length = 0;
- return bRet;
-}
-FX_INT32 IFX_BufferArchive::AppendBlock(const void* pBuf, size_t size)
-{
- if (!pBuf || size < 1) {
- return 0;
- }
- if (!m_pBuffer) {
- m_pBuffer = FX_Allocator_Alloc(m_pAllocator, FX_BYTE, m_BufSize);
- if (!m_pBuffer) {
- return -1;
- }
- }
- FX_LPBYTE buffer = (FX_LPBYTE)pBuf;
- FX_STRSIZE temp_size = (FX_STRSIZE)size;
- while (temp_size > 0) {
- FX_STRSIZE buf_size = FX_MIN(m_BufSize - m_Length, (FX_STRSIZE)temp_size);
- FXSYS_memcpy32(m_pBuffer + m_Length, buffer, buf_size);
- m_Length += buf_size;
- if (m_Length == m_BufSize) {
- if (!Flush()) {
- return -1;
- }
- }
- temp_size -= buf_size;
- buffer += buf_size;
- }
- return (FX_INT32)size;
-}
-FX_INT32 IFX_BufferArchive::AppendByte(FX_BYTE byte)
-{
- return AppendBlock(&byte, 1);
-}
-FX_INT32 IFX_BufferArchive::AppendDWord(FX_DWORD i)
-{
- char buf[32];
- FXSYS_itoa(i, buf, 10);
- return AppendBlock(buf, (size_t)FXSYS_strlen(buf));
-}
-FX_INT32 IFX_BufferArchive::AppendString(FX_BSTR lpsz)
-{
- return AppendBlock((FX_LPCBYTE)lpsz, lpsz.GetLength());
-}
-CFX_FileBufferArchive::CFX_FileBufferArchive(FX_STRSIZE size, IFX_Allocator* pAllocator)
- : IFX_BufferArchive(size, pAllocator)
- , m_pFile(NULL)
- , m_bTakeover(FALSE)
-{
-}
-CFX_FileBufferArchive::~CFX_FileBufferArchive()
-{
- Clear();
-}
-void CFX_FileBufferArchive::Clear()
-{
- if (m_pFile && m_bTakeover) {
- m_pFile->Release();
- }
- m_pFile = NULL;
- m_bTakeover = FALSE;
- IFX_BufferArchive::Clear();
-}
-FX_BOOL CFX_FileBufferArchive::AttachFile(IFX_StreamWrite *pFile, FX_BOOL bTakeover )
-{
- if (!pFile) {
- return FALSE;
- }
- if (m_pFile && m_bTakeover) {
- m_pFile->Release();
- }
- m_pFile = pFile;
- m_bTakeover = bTakeover;
- return TRUE;
-}
-FX_BOOL CFX_FileBufferArchive::AttachFile(FX_LPCWSTR filename)
-{
- if (!filename) {
- return FALSE;
- }
- if (m_pFile && m_bTakeover) {
- m_pFile->Release();
- }
- m_pFile = FX_CreateFileWrite(filename);
- if (!m_pFile) {
- return FALSE;
- }
- m_bTakeover = TRUE;
- return TRUE;
-}
-FX_BOOL CFX_FileBufferArchive::AttachFile(FX_LPCSTR filename)
-{
- if (!filename) {
- return FALSE;
- }
- if (m_pFile && m_bTakeover) {
- m_pFile->Release();
- }
- m_pFile = FX_CreateFileWrite(filename);
- if (!m_pFile) {
- return FALSE;
- }
- m_bTakeover = TRUE;
- return TRUE;
-}
-FX_BOOL CFX_FileBufferArchive::DoWork(const void* pBuf, size_t size)
-{
- if (!m_pFile) {
- return FALSE;
- }
- if (!pBuf || size < 1) {
- return TRUE;
- }
- return m_pFile->WriteBlock(pBuf, size);
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fxcrt/fx_basic.h"
+FX_STRSIZE FX_ftoa(FX_FLOAT f, FX_LPSTR buf);
+CFX_BinaryBuf::CFX_BinaryBuf(IFX_Allocator* pAllocator)
+ : m_pAllocator(pAllocator)
+ , m_AllocStep(0)
+ , m_pBuffer(NULL)
+ , m_DataSize(0)
+ , m_AllocSize(0)
+{
+}
+CFX_BinaryBuf::CFX_BinaryBuf(FX_STRSIZE size, IFX_Allocator* pAllocator)
+ : m_pAllocator(pAllocator)
+ , m_AllocStep(0)
+ , m_DataSize(size)
+ , m_AllocSize(size)
+{
+ m_pBuffer = FX_Allocator_Alloc(m_pAllocator, FX_BYTE, size);
+}
+CFX_BinaryBuf::~CFX_BinaryBuf()
+{
+ if (m_pBuffer) {
+ FX_Allocator_Free(m_pAllocator, m_pBuffer);
+ }
+}
+void CFX_BinaryBuf::Delete(int start_index, int count)
+{
+ if (!m_pBuffer || start_index < 0 || start_index + count > m_DataSize) {
+ return;
+ }
+ FXSYS_memmove32(m_pBuffer + start_index, m_pBuffer + start_index + count, m_DataSize - start_index - count);
+ m_DataSize -= count;
+}
+void CFX_BinaryBuf::Clear()
+{
+ m_DataSize = 0;
+}
+void CFX_BinaryBuf::DetachBuffer()
+{
+ m_DataSize = 0;
+ m_pBuffer = NULL;
+ m_AllocSize = 0;
+}
+void CFX_BinaryBuf::AttachData(void* buffer, FX_STRSIZE size)
+{
+ if (m_pBuffer) {
+ FX_Allocator_Free(m_pAllocator, m_pBuffer);
+ }
+ m_DataSize = size;
+ m_pBuffer = (FX_LPBYTE)buffer;
+ m_AllocSize = size;
+}
+void CFX_BinaryBuf::TakeOver(CFX_BinaryBuf& other)
+{
+ AttachData(other.GetBuffer(), other.GetSize());
+ other.DetachBuffer();
+}
+void CFX_BinaryBuf::EstimateSize(FX_STRSIZE size, FX_STRSIZE step)
+{
+ m_AllocStep = step;
+ if (m_AllocSize >= size) {
+ return;
+ }
+ ExpandBuf(size - m_DataSize);
+}
+void CFX_BinaryBuf::ExpandBuf(FX_STRSIZE add_size)
+{
+ FX_STRSIZE new_size = add_size + m_DataSize;
+ if (m_AllocSize >= new_size) {
+ return;
+ }
+ int alloc_step;
+ if (m_AllocStep == 0) {
+ alloc_step = m_AllocSize / 4;
+ if (alloc_step < 128 ) {
+ alloc_step = 128;
+ }
+ } else {
+ alloc_step = m_AllocStep;
+ }
+ new_size = (new_size + alloc_step - 1) / alloc_step * alloc_step;
+ FX_LPBYTE pNewBuffer = m_pBuffer;
+ if (pNewBuffer) {
+ pNewBuffer = FX_Allocator_Realloc(m_pAllocator, FX_BYTE, m_pBuffer, new_size);
+ } else {
+ pNewBuffer = FX_Allocator_Alloc(m_pAllocator, FX_BYTE, new_size);
+ }
+ if (pNewBuffer) {
+ m_pBuffer = pNewBuffer;
+ m_AllocSize = new_size;
+ }
+}
+void CFX_BinaryBuf::CopyData(const void* pStr, FX_STRSIZE size)
+{
+ if (size == 0) {
+ m_DataSize = 0;
+ return;
+ }
+ if (m_AllocSize < size) {
+ ExpandBuf(size - m_DataSize);
+ }
+ if (!m_pBuffer) {
+ return;
+ }
+ FXSYS_memcpy32(m_pBuffer, pStr, size);
+ m_DataSize = size;
+}
+void CFX_BinaryBuf::AppendBlock(const void* pBuf, FX_STRSIZE size)
+{
+ ExpandBuf(size);
+ if (pBuf && m_pBuffer) {
+ FXSYS_memcpy32(m_pBuffer + m_DataSize, pBuf, size);
+ }
+ m_DataSize += size;
+}
+void CFX_BinaryBuf::InsertBlock(FX_STRSIZE pos, const void* pBuf, FX_STRSIZE size)
+{
+ ExpandBuf(size);
+ if (!m_pBuffer) {
+ return;
+ }
+ FXSYS_memmove32(m_pBuffer + pos + size, m_pBuffer + pos, m_DataSize - pos);
+ if (pBuf) {
+ FXSYS_memcpy32(m_pBuffer + pos, pBuf, size);
+ }
+ m_DataSize += size;
+}
+void CFX_BinaryBuf::AppendFill(FX_BYTE byte, FX_STRSIZE count)
+{
+ ExpandBuf(count);
+ if (!m_pBuffer) {
+ return;
+ }
+ FXSYS_memset8(m_pBuffer + m_DataSize, byte, count);
+ m_DataSize += count;
+}
+CFX_ByteStringC CFX_BinaryBuf::GetByteString() const
+{
+ return CFX_ByteStringC(m_pBuffer, m_DataSize);
+}
+void CFX_BinaryBuf::GetByteStringL(CFX_ByteStringL &str) const
+{
+ str.Set(CFX_ByteStringC(m_pBuffer, m_DataSize), m_pAllocator);
+}
+CFX_ByteTextBuf& CFX_ByteTextBuf::operator << (FX_BSTR lpsz)
+{
+ AppendBlock((FX_LPCBYTE)lpsz, lpsz.GetLength());
+ return *this;
+}
+CFX_ByteTextBuf& CFX_ByteTextBuf::operator << (int i)
+{
+ char buf[32];
+ FXSYS_itoa(i, buf, 10);
+ AppendBlock(buf, (FX_STRSIZE)FXSYS_strlen(buf));
+ return *this;
+}
+CFX_ByteTextBuf& CFX_ByteTextBuf::operator << (FX_DWORD i)
+{
+ char buf[32];
+ FXSYS_itoa(i, buf, 10);
+ AppendBlock(buf, (FX_STRSIZE)FXSYS_strlen(buf));
+ return *this;
+}
+CFX_ByteTextBuf& CFX_ByteTextBuf::operator << (double f)
+{
+ char buf[32];
+ FX_STRSIZE len = FX_ftoa((FX_FLOAT)f, buf);
+ AppendBlock(buf, len);
+ return *this;
+}
+CFX_ByteTextBuf& CFX_ByteTextBuf::operator << (const CFX_ByteTextBuf& buf)
+{
+ AppendBlock(buf.m_pBuffer, buf.m_DataSize);
+ return *this;
+}
+void CFX_ByteTextBuf::operator =(const CFX_ByteStringC& str)
+{
+ CopyData((FX_LPCBYTE)str, str.GetLength());
+}
+void CFX_WideTextBuf::AppendChar(FX_WCHAR ch)
+{
+ if (m_AllocSize < m_DataSize + (FX_STRSIZE)sizeof(FX_WCHAR)) {
+ ExpandBuf(sizeof(FX_WCHAR));
+ }
+ ASSERT(m_pBuffer != NULL);
+ *(FX_WCHAR*)(m_pBuffer + m_DataSize) = ch;
+ m_DataSize += sizeof(FX_WCHAR);
+}
+CFX_WideTextBuf& CFX_WideTextBuf::operator << (FX_WSTR str)
+{
+ AppendBlock(str.GetPtr(), str.GetLength() * sizeof(FX_WCHAR));
+ return *this;
+}
+CFX_WideTextBuf& CFX_WideTextBuf::operator << (const CFX_WideString &str)
+{
+ AppendBlock((FX_LPCWSTR)str, str.GetLength() * sizeof(FX_WCHAR));
+ return *this;
+}
+CFX_WideTextBuf& CFX_WideTextBuf::operator << (int i)
+{
+ char buf[32];
+ FXSYS_itoa(i, buf, 10);
+ FX_STRSIZE len = (FX_STRSIZE)FXSYS_strlen(buf);
+ if (m_AllocSize < m_DataSize + (FX_STRSIZE)(len * sizeof(FX_WCHAR))) {
+ ExpandBuf(len * sizeof(FX_WCHAR));
+ }
+ ASSERT(m_pBuffer != NULL);
+ FX_LPWSTR str = (FX_WCHAR*)(m_pBuffer + m_DataSize);
+ for (FX_STRSIZE j = 0; j < len; j ++) {
+ *str ++ = buf[j];
+ }
+ m_DataSize += len * sizeof(FX_WCHAR);
+ return *this;
+}
+CFX_WideTextBuf& CFX_WideTextBuf::operator << (double f)
+{
+ char buf[32];
+ FX_STRSIZE len = FX_ftoa((FX_FLOAT)f, buf);
+ if (m_AllocSize < m_DataSize + (FX_STRSIZE)(len * sizeof(FX_WCHAR))) {
+ ExpandBuf(len * sizeof(FX_WCHAR));
+ }
+ ASSERT(m_pBuffer != NULL);
+ FX_LPWSTR str = (FX_WCHAR*)(m_pBuffer + m_DataSize);
+ for (FX_STRSIZE i = 0; i < len; i ++) {
+ *str ++ = buf[i];
+ }
+ m_DataSize += len * sizeof(FX_WCHAR);
+ return *this;
+}
+CFX_WideTextBuf& CFX_WideTextBuf::operator << (FX_LPCWSTR lpsz)
+{
+ AppendBlock(lpsz, (FX_STRSIZE)FXSYS_wcslen(lpsz)*sizeof(FX_WCHAR));
+ return *this;
+}
+CFX_WideTextBuf& CFX_WideTextBuf::operator << (const CFX_WideTextBuf& buf)
+{
+ AppendBlock(buf.m_pBuffer, buf.m_DataSize);
+ return *this;
+}
+void CFX_WideTextBuf::operator =(FX_WSTR str)
+{
+ CopyData(str.GetPtr(), str.GetLength() * sizeof(FX_WCHAR));
+}
+CFX_WideStringC CFX_WideTextBuf::GetWideString() const
+{
+ return CFX_WideStringC((FX_LPCWSTR)m_pBuffer, m_DataSize / sizeof(FX_WCHAR));
+}
+void CFX_WideTextBuf::GetWideStringL(CFX_WideStringL& wideText) const
+{
+ wideText.Set(CFX_WideStringC((FX_LPCWSTR)m_pBuffer, m_DataSize / sizeof(FX_WCHAR)), m_pAllocator);
+}
+CFX_ArchiveSaver& CFX_ArchiveSaver::operator << (FX_BYTE i)
+{
+ if (m_pStream) {
+ m_pStream->WriteBlock(&i, 1);
+ } else {
+ m_SavingBuf.AppendByte(i);
+ }
+ return *this;
+}
+CFX_ArchiveSaver& CFX_ArchiveSaver::operator << (int i)
+{
+ if (m_pStream) {
+ m_pStream->WriteBlock(&i, sizeof(int));
+ } else {
+ m_SavingBuf.AppendBlock(&i, sizeof(int));
+ }
+ return *this;
+}
+CFX_ArchiveSaver& CFX_ArchiveSaver::operator << (FX_DWORD i)
+{
+ if (m_pStream) {
+ m_pStream->WriteBlock(&i, sizeof(FX_DWORD));
+ } else {
+ m_SavingBuf.AppendBlock(&i, sizeof(FX_DWORD));
+ }
+ return *this;
+}
+CFX_ArchiveSaver& CFX_ArchiveSaver::operator << (FX_FLOAT f)
+{
+ if (m_pStream) {
+ m_pStream->WriteBlock(&f, sizeof(FX_FLOAT));
+ } else {
+ m_SavingBuf.AppendBlock(&f, sizeof(FX_FLOAT));
+ }
+ return *this;
+}
+CFX_ArchiveSaver& CFX_ArchiveSaver::operator << (FX_BSTR bstr)
+{
+ int len = bstr.GetLength();
+ if (m_pStream) {
+ m_pStream->WriteBlock(&len, sizeof(int));
+ m_pStream->WriteBlock(bstr, len);
+ } else {
+ m_SavingBuf.AppendBlock(&len, sizeof(int));
+ m_SavingBuf.AppendBlock(bstr, len);
+ }
+ return *this;
+}
+CFX_ArchiveSaver& CFX_ArchiveSaver::operator << (FX_LPCWSTR wstr)
+{
+ FX_STRSIZE len = (FX_STRSIZE)FXSYS_wcslen(wstr);
+ if (m_pStream) {
+ m_pStream->WriteBlock(&len, sizeof(int));
+ m_pStream->WriteBlock(wstr, len);
+ } else {
+ m_SavingBuf.AppendBlock(&len, sizeof(int));
+ m_SavingBuf.AppendBlock(wstr, len);
+ }
+ return *this;
+}
+CFX_ArchiveSaver& CFX_ArchiveSaver::operator << (const CFX_WideString& wstr)
+{
+ CFX_ByteString encoded = wstr.UTF16LE_Encode();
+ return operator << (encoded);
+}
+void CFX_ArchiveSaver::Write(const void* pData, FX_STRSIZE dwSize)
+{
+ if (m_pStream) {
+ m_pStream->WriteBlock(pData, dwSize);
+ } else {
+ m_SavingBuf.AppendBlock(pData, dwSize);
+ }
+}
+CFX_ArchiveLoader::CFX_ArchiveLoader(FX_LPCBYTE pData, FX_DWORD dwSize)
+{
+ m_pLoadingBuf = pData;
+ m_LoadingPos = 0;
+ m_LoadingSize = dwSize;
+}
+FX_BOOL CFX_ArchiveLoader::IsEOF()
+{
+ return m_LoadingPos >= m_LoadingSize;
+}
+CFX_ArchiveLoader& CFX_ArchiveLoader::operator >> (FX_BYTE& i)
+{
+ if (m_LoadingPos >= m_LoadingSize) {
+ return *this;
+ }
+ i = m_pLoadingBuf[m_LoadingPos++];
+ return *this;
+}
+CFX_ArchiveLoader& CFX_ArchiveLoader::operator >> (int& i)
+{
+ Read(&i, sizeof(int));
+ return *this;
+}
+CFX_ArchiveLoader& CFX_ArchiveLoader::operator >> (FX_DWORD& i)
+{
+ Read(&i, sizeof(FX_DWORD));
+ return *this;
+}
+CFX_ArchiveLoader& CFX_ArchiveLoader::operator >> (FX_FLOAT& i)
+{
+ Read(&i, sizeof(FX_FLOAT));
+ return *this;
+}
+CFX_ArchiveLoader& CFX_ArchiveLoader::operator >> (CFX_ByteString& str)
+{
+ if (m_LoadingPos + 4 > m_LoadingSize) {
+ return *this;
+ }
+ int len;
+ operator >> (len);
+ str.Empty();
+ if (len <= 0 || m_LoadingPos + len > m_LoadingSize) {
+ return *this;
+ }
+ FX_LPSTR buffer = str.GetBuffer(len);
+ FXSYS_memcpy32(buffer, m_pLoadingBuf + m_LoadingPos, len);
+ str.ReleaseBuffer(len);
+ m_LoadingPos += len;
+ return *this;
+}
+CFX_ArchiveLoader& CFX_ArchiveLoader::operator >> (CFX_WideString& str)
+{
+ CFX_ByteString encoded;
+ operator >> (encoded);
+ str = CFX_WideString::FromUTF16LE((const unsigned short*)(FX_LPCSTR)encoded, encoded.GetLength());
+ return *this;
+}
+FX_BOOL CFX_ArchiveLoader::Read(void* pBuf, FX_DWORD dwSize)
+{
+ if (m_LoadingPos + dwSize > m_LoadingSize) {
+ return FALSE;
+ }
+ FXSYS_memcpy32(pBuf, m_pLoadingBuf + m_LoadingPos, dwSize);
+ m_LoadingPos += dwSize;
+ return TRUE;
+}
+void CFX_BitStream::Init(FX_LPCBYTE pData, FX_DWORD dwSize)
+{
+ m_pData = pData;
+ m_BitSize = dwSize * 8;
+ m_BitPos = 0;
+}
+void CFX_BitStream::ByteAlign()
+{
+ int mod = m_BitPos % 8;
+ if (mod == 0) {
+ return;
+ }
+ m_BitPos += 8 - mod;
+}
+FX_DWORD CFX_BitStream::GetBits(FX_DWORD nBits)
+{
+ if (nBits > m_BitSize || m_BitPos + nBits > m_BitSize) {
+ return 0;
+ }
+ if (nBits == 1) {
+ int bit = (m_pData[m_BitPos / 8] & (1 << (7 - m_BitPos % 8))) ? 1 : 0;
+ m_BitPos ++;
+ return bit;
+ }
+ FX_DWORD byte_pos = m_BitPos / 8;
+ FX_DWORD bit_pos = m_BitPos % 8, bit_left = nBits;
+ FX_DWORD result = 0;
+ if (bit_pos) {
+ if (8 - bit_pos >= bit_left) {
+ result = (m_pData[byte_pos] & (0xff >> bit_pos)) >> (8 - bit_pos - bit_left);
+ m_BitPos += bit_left;
+ return result;
+ }
+ bit_left -= 8 - bit_pos;
+ result = (m_pData[byte_pos++] & ((1 << (8 - bit_pos)) - 1)) << bit_left;
+ }
+ while (bit_left >= 8) {
+ bit_left -= 8;
+ result |= m_pData[byte_pos++] << bit_left;
+ }
+ if (bit_left) {
+ result |= m_pData[byte_pos] >> (8 - bit_left);
+ }
+ m_BitPos += nBits;
+ return result;
+}
+IFX_BufferArchive::IFX_BufferArchive(FX_STRSIZE size, IFX_Allocator* pAllocator)
+ : m_pAllocator(pAllocator)
+ , m_BufSize(size)
+ , m_pBuffer(NULL)
+ , m_Length(0)
+{
+}
+void IFX_BufferArchive::Clear()
+{
+ m_Length = 0;
+ if (m_pBuffer) {
+ FX_Allocator_Free(m_pAllocator, m_pBuffer);
+ m_pBuffer = NULL;
+ }
+}
+FX_BOOL IFX_BufferArchive::Flush()
+{
+ FX_BOOL bRet = DoWork(m_pBuffer, m_Length);
+ m_Length = 0;
+ return bRet;
+}
+FX_INT32 IFX_BufferArchive::AppendBlock(const void* pBuf, size_t size)
+{
+ if (!pBuf || size < 1) {
+ return 0;
+ }
+ if (!m_pBuffer) {
+ m_pBuffer = FX_Allocator_Alloc(m_pAllocator, FX_BYTE, m_BufSize);
+ if (!m_pBuffer) {
+ return -1;
+ }
+ }
+ FX_LPBYTE buffer = (FX_LPBYTE)pBuf;
+ FX_STRSIZE temp_size = (FX_STRSIZE)size;
+ while (temp_size > 0) {
+ FX_STRSIZE buf_size = FX_MIN(m_BufSize - m_Length, (FX_STRSIZE)temp_size);
+ FXSYS_memcpy32(m_pBuffer + m_Length, buffer, buf_size);
+ m_Length += buf_size;
+ if (m_Length == m_BufSize) {
+ if (!Flush()) {
+ return -1;
+ }
+ }
+ temp_size -= buf_size;
+ buffer += buf_size;
+ }
+ return (FX_INT32)size;
+}
+FX_INT32 IFX_BufferArchive::AppendByte(FX_BYTE byte)
+{
+ return AppendBlock(&byte, 1);
+}
+FX_INT32 IFX_BufferArchive::AppendDWord(FX_DWORD i)
+{
+ char buf[32];
+ FXSYS_itoa(i, buf, 10);
+ return AppendBlock(buf, (size_t)FXSYS_strlen(buf));
+}
+FX_INT32 IFX_BufferArchive::AppendString(FX_BSTR lpsz)
+{
+ return AppendBlock((FX_LPCBYTE)lpsz, lpsz.GetLength());
+}
+CFX_FileBufferArchive::CFX_FileBufferArchive(FX_STRSIZE size, IFX_Allocator* pAllocator)
+ : IFX_BufferArchive(size, pAllocator)
+ , m_pFile(NULL)
+ , m_bTakeover(FALSE)
+{
+}
+CFX_FileBufferArchive::~CFX_FileBufferArchive()
+{
+ Clear();
+}
+void CFX_FileBufferArchive::Clear()
+{
+ if (m_pFile && m_bTakeover) {
+ m_pFile->Release();
+ }
+ m_pFile = NULL;
+ m_bTakeover = FALSE;
+ IFX_BufferArchive::Clear();
+}
+FX_BOOL CFX_FileBufferArchive::AttachFile(IFX_StreamWrite *pFile, FX_BOOL bTakeover )
+{
+ if (!pFile) {
+ return FALSE;
+ }
+ if (m_pFile && m_bTakeover) {
+ m_pFile->Release();
+ }
+ m_pFile = pFile;
+ m_bTakeover = bTakeover;
+ return TRUE;
+}
+FX_BOOL CFX_FileBufferArchive::AttachFile(FX_LPCWSTR filename)
+{
+ if (!filename) {
+ return FALSE;
+ }
+ if (m_pFile && m_bTakeover) {
+ m_pFile->Release();
+ }
+ m_pFile = FX_CreateFileWrite(filename);
+ if (!m_pFile) {
+ return FALSE;
+ }
+ m_bTakeover = TRUE;
+ return TRUE;
+}
+FX_BOOL CFX_FileBufferArchive::AttachFile(FX_LPCSTR filename)
+{
+ if (!filename) {
+ return FALSE;
+ }
+ if (m_pFile && m_bTakeover) {
+ m_pFile->Release();
+ }
+ m_pFile = FX_CreateFileWrite(filename);
+ if (!m_pFile) {
+ return FALSE;
+ }
+ m_bTakeover = TRUE;
+ return TRUE;
+}
+FX_BOOL CFX_FileBufferArchive::DoWork(const void* pBuf, size_t size)
+{
+ if (!m_pFile) {
+ return FALSE;
+ }
+ if (!pBuf || size < 1) {
+ return TRUE;
+ }
+ return m_pFile->WriteBlock(pBuf, size);
+}
diff --git a/core/src/fxcrt/fx_basic_coords.cpp b/core/src/fxcrt/fx_basic_coords.cpp
index 47204e0aa3..f55c267da5 100644
--- a/core/src/fxcrt/fx_basic_coords.cpp
+++ b/core/src/fxcrt/fx_basic_coords.cpp
@@ -1,556 +1,556 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../include/fxcrt/fx_ext.h"
-void FX_RECT::Normalize()
-{
- if (left > right) {
- int temp = left;
- left = right;
- right = temp;
- }
- if (top > bottom) {
- int temp = top;
- top = bottom;
- bottom = temp;
- }
-}
-void FX_RECT::Intersect(const FX_RECT& src)
-{
- FX_RECT src_n = src;
- src_n.Normalize();
- Normalize();
- left = left > src_n.left ? left : src_n.left;
- top = top > src_n.top ? top : src_n.top;
- right = right < src_n.right ? right : src_n.right;
- bottom = bottom < src_n.bottom ? bottom : src_n.bottom;
- if (left > right || top > bottom) {
- left = top = right = bottom = 0;
- }
-}
-void FX_RECT::Union(const FX_RECT& other_rect)
-{
- Normalize();
- FX_RECT other = other_rect;
- other.Normalize();
- left = left < other.left ? left : other.left;
- right = right > other.right ? right : other.right;
- bottom = bottom > other.bottom ? bottom : other.bottom;
- top = top < other.top ? top : other.top;
-}
-FX_BOOL GetIntersection(FX_FLOAT low1, FX_FLOAT high1, FX_FLOAT low2, FX_FLOAT high2,
- FX_FLOAT& interlow, FX_FLOAT& interhigh)
-{
- if (low1 >= high2 || low2 >= high1) {
- return FALSE;
- }
- interlow = low1 > low2 ? low1 : low2;
- interhigh = high1 > high2 ? high2 : high1;
- return TRUE;
-}
-extern "C" int FXSYS_round(FX_FLOAT d)
-{
- int iRet = 0;
- if (d >= 0.0f) {
- iRet = (int)(d + 0.5f);
- if (iRet >= 0) {
- return iRet;
- }
- return -iRet;
- }
- return (int)(d - 0.5f);
-}
-CFX_FloatRect::CFX_FloatRect(const FX_RECT& rect)
-{
- left = (FX_FLOAT)(rect.left);
- right = (FX_FLOAT)(rect.right);
- bottom = (FX_FLOAT)(rect.top);
- top = (FX_FLOAT)(rect.bottom);
-}
-void CFX_FloatRect::Normalize()
-{
- FX_FLOAT temp;
- if (left > right) {
- temp = left;
- left = right;
- right = temp;
- }
- if (bottom > top) {
- temp = top;
- top = bottom;
- bottom = temp;
- }
-}
-void CFX_FloatRect::Intersect(const CFX_FloatRect& other_rect)
-{
- Normalize();
- CFX_FloatRect other = other_rect;
- other.Normalize();
- left = left > other.left ? left : other.left;
- right = right < other.right ? right : other.right;
- bottom = bottom > other.bottom ? bottom : other.bottom;
- top = top < other.top ? top : other.top;
- if (left > right || bottom > top) {
- left = right = bottom = top = 0;
- }
-}
-void CFX_FloatRect::Union(const CFX_FloatRect& other_rect)
-{
- Normalize();
- CFX_FloatRect other = other_rect;
- other.Normalize();
- left = left < other.left ? left : other.left;
- right = right > other.right ? right : other.right;
- bottom = bottom < other.bottom ? bottom : other.bottom;
- top = top > other.top ? top : other.top;
-}
-void CFX_FloatRect::Transform(const CFX_Matrix* pMatrix)
-{
- pMatrix->TransformRect(left, right, top, bottom);
-}
-int CFX_FloatRect::Substract4(CFX_FloatRect& s, CFX_FloatRect* pRects)
-{
- Normalize();
- s.Normalize();
- int nRects = 0;
- CFX_FloatRect rects[4];
- if (left < s.left) {
- rects[nRects].left = left;
- rects[nRects].right = s.left;
- rects[nRects].bottom = bottom;
- rects[nRects].top = top;
- nRects ++;
- }
- if (s.left < right && s.top < top) {
- rects[nRects].left = s.left;
- rects[nRects].right = right;
- rects[nRects].bottom = s.top;
- rects[nRects].top = top;
- nRects ++;
- }
- if (s.top > bottom && s.right < right) {
- rects[nRects].left = s.right;
- rects[nRects].right = right;
- rects[nRects].bottom = bottom;
- rects[nRects].top = s.top;
- nRects ++;
- }
- if (s.bottom > bottom) {
- rects[nRects].left = s.left;
- rects[nRects].right = s.right;
- rects[nRects].bottom = bottom;
- rects[nRects].top = s.bottom;
- nRects ++;
- }
- if (nRects == 0) {
- return 0;
- }
- for (int i = 0; i < nRects; i ++) {
- pRects[i] = rects[i];
- pRects[i].Intersect(*this);
- }
- return nRects;
-}
-FX_RECT CFX_FloatRect::GetOutterRect() const
-{
- CFX_FloatRect rect1 = *this;
- FX_RECT rect;
- rect.left = (int)FXSYS_floor(rect1.left);
- rect.right = (int)FXSYS_ceil(rect1.right);
- rect.top = (int)FXSYS_floor(rect1.bottom);
- rect.bottom = (int)FXSYS_ceil(rect1.top);
- rect.Normalize();
- return rect;
-}
-FX_RECT CFX_FloatRect::GetInnerRect() const
-{
- CFX_FloatRect rect1 = *this;
- FX_RECT rect;
- rect.left = (int)FXSYS_ceil(rect1.left);
- rect.right = (int)FXSYS_floor(rect1.right);
- rect.top = (int)FXSYS_ceil(rect1.bottom);
- rect.bottom = (int)FXSYS_floor(rect1.top);
- rect.Normalize();
- return rect;
-}
-static void _MatchFloatRange(FX_FLOAT f1, FX_FLOAT f2, int& i1, int& i2)
-{
- int length = (int)FXSYS_ceil(f2 - f1);
- int i1_1 = (int)FXSYS_floor(f1);
- int i1_2 = (int)FXSYS_ceil(f1);
- FX_FLOAT error1 = f1 - i1_1 + (FX_FLOAT)FXSYS_fabs(f2 - i1_1 - length);
- FX_FLOAT error2 = i1_2 - f1 + (FX_FLOAT)FXSYS_fabs(f2 - i1_2 - length);
- i1 = (error1 > error2) ? i1_2 : i1_1;
- i2 = i1 + length;
-}
-FX_RECT CFX_FloatRect::GetClosestRect() const
-{
- CFX_FloatRect rect1 = *this;
- FX_RECT rect;
- _MatchFloatRange(rect1.left, rect1.right, rect.left, rect.right);
- _MatchFloatRange(rect1.bottom, rect1.top, rect.top, rect.bottom);
- rect.Normalize();
- return rect;
-}
-FX_BOOL CFX_FloatRect::Contains(const CFX_FloatRect& other_rect) const
-{
- CFX_FloatRect n1 = *this;
- n1.Normalize();
- CFX_FloatRect n2 = other_rect;
- n2.Normalize();
- if (n2.left >= n1.left && n2.right <= n1.right && n2.bottom >= n1.bottom && n2.top <= n1.top) {
- return TRUE;
- }
- return FALSE;
-}
-FX_BOOL CFX_FloatRect::Contains(FX_FLOAT x, FX_FLOAT y) const
-{
- CFX_FloatRect n1 = *this;
- n1.Normalize();
- return x <= n1.right && x >= n1.left && y <= n1.top && y >= n1.bottom;
-}
-void CFX_FloatRect::UpdateRect(FX_FLOAT x, FX_FLOAT y)
-{
- if (left > x) {
- left = x;
- }
- if (right < x) {
- right = x;
- }
- if (bottom > y) {
- bottom = y;
- }
- if (top < y) {
- top = y;
- }
-}
-CFX_FloatRect CFX_FloatRect::GetBBox(const CFX_FloatPoint* pPoints, int nPoints)
-{
- if (nPoints == 0) {
- return CFX_FloatRect();
- }
- FX_FLOAT min_x = pPoints->x, max_x = pPoints->x, min_y = pPoints->y, max_y = pPoints->y;
- for (int i = 1; i < nPoints; i ++) {
- if (min_x > pPoints[i].x) {
- min_x = pPoints[i].x;
- }
- if (max_x < pPoints[i].x) {
- max_x = pPoints[i].x;
- }
- if (min_y > pPoints[i].y) {
- min_y = pPoints[i].y;
- }
- if (max_y < pPoints[i].y) {
- max_y = pPoints[i].y;
- }
- }
- return CFX_FloatRect(min_x, min_y, max_x, max_y);
-}
-void CFX_Matrix::Set(FX_FLOAT a, FX_FLOAT b, FX_FLOAT c, FX_FLOAT d, FX_FLOAT e, FX_FLOAT f)
-{
- this->a = a;
- this->b = b;
- this->c = c;
- this->d = d;
- this->e = e;
- this->f = f;
-}
-void CFX_Matrix::Set(const FX_FLOAT n[6])
-{
- FXSYS_memcpy32((void*)this, &n, sizeof(CFX_Matrix));
-}
-void CFX_Matrix::SetReverse(const CFX_Matrix &m)
-{
- FX_FLOAT i = m.a * m.d - m.b * m.c;
- if (FXSYS_fabs(i) == 0) {
- return;
- }
- FX_FLOAT j = -i;
- a = m.d / i;
- b = m.b / j;
- c = m.c / j;
- d = m.a / i;
- e = (m.c * m.f - m.d * m.e) / i;
- f = (m.a * m.f - m.b * m.e) / j;
-}
-static void FXCRT_Matrix_Concat(CFX_Matrix &m, const CFX_Matrix &m1, const CFX_Matrix &m2)
-{
- FX_FLOAT aa = m1.a * m2.a + m1.b * m2.c;
- FX_FLOAT bb = m1.a * m2.b + m1.b * m2.d;
- FX_FLOAT cc = m1.c * m2.a + m1.d * m2.c;
- FX_FLOAT dd = m1.c * m2.b + m1.d * m2.d;
- FX_FLOAT ee = m1.e * m2.a + m1.f * m2.c + m2.e;
- FX_FLOAT ff = m1.e * m2.b + m1.f * m2.d + m2.f;
- m.a = aa, m.b = bb, m.c = cc, m.d = dd, m.e = ee, m.f = ff;
-}
-void CFX_Matrix::Concat(FX_FLOAT a, FX_FLOAT b, FX_FLOAT c, FX_FLOAT d, FX_FLOAT e, FX_FLOAT f, FX_BOOL bPrepended)
-{
- CFX_Matrix m;
- m.Set(a, b, c, d, e, f);
- Concat(m, bPrepended);
-}
-void CFX_Matrix::Concat(const CFX_Matrix &m, FX_BOOL bPrepended)
-{
- if (bPrepended) {
- FXCRT_Matrix_Concat(*this, m, *this);
- } else {
- FXCRT_Matrix_Concat(*this, *this, m);
- }
-}
-void CFX_Matrix::ConcatInverse(const CFX_Matrix& src, FX_BOOL bPrepended)
-{
- CFX_Matrix m;
- m.SetReverse(src);
- Concat(m, bPrepended);
-}
-FX_BOOL CFX_Matrix::IsInvertible() const
-{
- return FXSYS_fabs(a * d - b * c) >= 0.0001f;
-}
-FX_BOOL CFX_Matrix::Is90Rotated() const
-{
- return FXSYS_fabs(a * 1000) < FXSYS_fabs(b) && FXSYS_fabs(d * 1000) < FXSYS_fabs(c);
-}
-FX_BOOL CFX_Matrix::IsScaled() const
-{
- return FXSYS_fabs(b * 1000) < FXSYS_fabs(a) && FXSYS_fabs(c * 1000) < FXSYS_fabs(d);
-}
-void CFX_Matrix::Translate(FX_FLOAT x, FX_FLOAT y, FX_BOOL bPrepended)
-{
- if (bPrepended) {
- e += x * a + y * c;
- f += y * d + x * b;
- } else {
- e += x, f += y;
- }
-}
-void CFX_Matrix::Scale(FX_FLOAT sx, FX_FLOAT sy, FX_BOOL bPrepended)
-{
- a *= sx, d *= sy;
- if (bPrepended) {
- b *= sx;
- c *= sy;
- } else {
- b *= sy;
- c *= sx;
- e *= sx;
- f *= sy;
- }
-}
-void CFX_Matrix::Rotate(FX_FLOAT fRadian, FX_BOOL bPrepended)
-{
- FX_FLOAT cosValue = FXSYS_cos(fRadian);
- FX_FLOAT sinValue = FXSYS_sin(fRadian);
- CFX_Matrix m;
- m.Set(cosValue, sinValue, -sinValue, cosValue, 0, 0);
- if (bPrepended) {
- FXCRT_Matrix_Concat(*this, m, *this);
- } else {
- FXCRT_Matrix_Concat(*this, *this, m);
- }
-}
-void CFX_Matrix::RotateAt(FX_FLOAT fRadian, FX_FLOAT dx, FX_FLOAT dy, FX_BOOL bPrepended)
-{
- Translate(dx, dy, bPrepended);
- Rotate(fRadian, bPrepended);
- Translate(-dx, -dy, bPrepended);
-}
-void CFX_Matrix::Shear(FX_FLOAT fAlphaRadian, FX_FLOAT fBetaRadian, FX_BOOL bPrepended)
-{
- CFX_Matrix m;
- m.Set(1, FXSYS_tan(fAlphaRadian), FXSYS_tan(fBetaRadian), 1, 0, 0);
- if (bPrepended) {
- FXCRT_Matrix_Concat(*this, m, *this);
- } else {
- FXCRT_Matrix_Concat(*this, *this, m);
- }
-}
-void CFX_Matrix::MatchRect(const CFX_FloatRect& dest, const CFX_FloatRect& src)
-{
- FX_FLOAT fDiff = src.left - src.right;
- a = FXSYS_fabs(fDiff) < 0.001f ? 1 : (dest.left - dest.right) / fDiff;
- fDiff = src.bottom - src.top;
- d = FXSYS_fabs(fDiff) < 0.001f ? 1 : (dest.bottom - dest.top) / fDiff;
- e = dest.left - src.left * a;
- f = dest.bottom - src.bottom * d;
- b = 0;
- c = 0;
-}
-FX_FLOAT CFX_Matrix::GetXUnit() const
-{
- if (b == 0) {
- return (a > 0 ? a : -a);
- }
- if (a == 0) {
- return (b > 0 ? b : -b);
- }
- return FXSYS_sqrt(a * a + b * b);
-}
-FX_FLOAT CFX_Matrix::GetYUnit() const
-{
- if (c == 0) {
- return (d > 0 ? d : -d);
- }
- if (d == 0) {
- return (c > 0 ? c : -c);
- }
- return FXSYS_sqrt(c * c + d * d);
-}
-void CFX_Matrix::GetUnitRect(CFX_RectF &rect) const
-{
- rect.left = rect.top = 0;
- rect.width = rect.height = 1;
- TransformRect(rect);
-}
-CFX_FloatRect CFX_Matrix::GetUnitRect() const
-{
- CFX_FloatRect rect(0, 0, 1, 1);
- rect.Transform((const CFX_Matrix*)this);
- return rect;
-}
-FX_FLOAT CFX_Matrix::GetUnitArea() const
-{
- FX_FLOAT A = FXSYS_sqrt(a * a + b * b);
- FX_FLOAT B = FXSYS_sqrt(c * c + d * d);
- FX_FLOAT ac = a + c, bd = b + d;
- FX_FLOAT C = FXSYS_sqrt(ac * ac + bd * bd);
- FX_FLOAT P = (A + B + C ) / 2;
- return FXSYS_sqrt(P * (P - A) * (P - B) * (P - C)) * 2;
-}
-FX_FLOAT CFX_Matrix::TransformXDistance(FX_FLOAT dx) const
-{
- FX_FLOAT fx = a * dx, fy = b * dx;
- return FXSYS_sqrt(fx * fx + fy * fy);
-}
-FX_INT32 CFX_Matrix::TransformXDistance(FX_INT32 dx) const
-{
- FX_FLOAT fx = a * dx, fy = b * dx;
- return FXSYS_round(FXSYS_sqrt(fx * fx + fy * fy));
-}
-FX_FLOAT CFX_Matrix::TransformYDistance(FX_FLOAT dy) const
-{
- FX_FLOAT fx = c * dy, fy = d * dy;
- return FXSYS_sqrt(fx * fx + fy * fy);
-}
-FX_INT32 CFX_Matrix::TransformYDistance(FX_INT32 dy) const
-{
- FX_FLOAT fx = c * dy, fy = d * dy;
- return FXSYS_round(FXSYS_sqrt(fx * fx + fy * fy));
-}
-FX_FLOAT CFX_Matrix::TransformDistance(FX_FLOAT dx, FX_FLOAT dy) const
-{
- FX_FLOAT fx = a * dx + c * dy, fy = b * dx + d * dy;
- return FXSYS_sqrt(fx * fx + fy * fy);
-}
-FX_INT32 CFX_Matrix::TransformDistance(FX_INT32 dx, FX_INT32 dy) const
-{
- FX_FLOAT fx = a * dx + c * dy, fy = b * dx + d * dy;
- return FXSYS_round(FXSYS_sqrt(fx * fx + fy * fy));
-}
-FX_FLOAT CFX_Matrix::TransformDistance(FX_FLOAT distance) const
-{
- return distance * (GetXUnit() + GetYUnit()) / 2;
-}
-void CFX_Matrix::TransformVector(CFX_VectorF &v) const
-{
- FX_FLOAT fx = a * v.x + c * v.y;
- FX_FLOAT fy = b * v.x + d * v.y;
- v.x = fx, v.y = fy;
-}
-void CFX_Matrix::TransformVector(CFX_Vector &v) const
-{
- FX_FLOAT fx = a * v.x + c * v.y;
- FX_FLOAT fy = b * v.x + d * v.y;
- v.x = FXSYS_round(fx);
- v.y = FXSYS_round(fy);
-}
-void CFX_Matrix::TransformPoints(CFX_Point *points, FX_INT32 iCount) const
-{
- FXSYS_assert(iCount > 0);
- FX_FLOAT fx, fy;
- for (FX_INT32 i = 0; i < iCount; i ++) {
- fx = a * points->x + c * points->y + e;
- fy = b * points->x + d * points->y + f;
- points->x = FXSYS_round(fx);
- points->y = FXSYS_round(fy);
- points ++;
- }
-}
-void CFX_Matrix::TransformPoints(CFX_PointF *points, FX_INT32 iCount) const
-{
- FXSYS_assert(iCount > 0);
- FX_FLOAT fx, fy;
- for (FX_INT32 i = 0; i < iCount; i ++) {
- fx = a * points->x + c * points->y + e;
- fy = b * points->x + d * points->y + f;
- points->x = fx, points->y = fy;
- points ++;
- }
-}
-void CFX_Matrix::TransformPoint(FX_FLOAT &x, FX_FLOAT &y) const
-{
- FX_FLOAT fx = a * x + c * y + e;
- FX_FLOAT fy = b * x + d * y + f;
- x = fx, y = fy;
-}
-void CFX_Matrix::TransformPoint(FX_INT32 &x, FX_INT32 &y) const
-{
- FX_FLOAT fx = a * x + c * y + e;
- FX_FLOAT fy = b * x + d * y + f;
- x = FXSYS_round(fx);
- y = FXSYS_round(fy);
-}
-void CFX_Matrix::TransformRect(CFX_RectF &rect) const
-{
- FX_FLOAT right = rect.right(), bottom = rect.bottom();
- TransformRect(rect.left, right, bottom, rect.top);
- rect.width = right - rect.left;
- rect.height = bottom - rect.top;
-}
-void CFX_Matrix::TransformRect(CFX_Rect &rect) const
-{
- FX_FLOAT left = (FX_FLOAT)rect.left;
- FX_FLOAT top = (FX_FLOAT)rect.bottom();
- FX_FLOAT right = (FX_FLOAT)rect.right();
- FX_FLOAT bottom = (FX_FLOAT)rect.top;
- TransformRect(left, right, top, bottom);
- rect.left = FXSYS_round(left);
- rect.top = FXSYS_round(bottom);
- rect.width = FXSYS_round(right - left);
- rect.height = FXSYS_round(top - bottom);
-}
-void CFX_Matrix::TransformRect(FX_FLOAT& left, FX_FLOAT& right, FX_FLOAT& top, FX_FLOAT& bottom) const
-{
- FX_FLOAT x[4], y[4];
- x[0] = left;
- y[0] = top;
- x[1] = left;
- y[1] = bottom;
- x[2] = right;
- y[2] = top;
- x[3] = right;
- y[3] = bottom;
- int i;
- for (i = 0; i < 4; i ++) {
- Transform(x[i], y[i], x[i], y[i]);
- }
- right = left = x[0];
- top = bottom = y[0];
- for (i = 1; i < 4; i ++) {
- if (right < x[i]) {
- right = x[i];
- }
- if (left > x[i]) {
- left = x[i];
- }
- if (top < y[i]) {
- top = y[i];
- }
- if (bottom > y[i]) {
- bottom = y[i];
- }
- }
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fxcrt/fx_ext.h"
+void FX_RECT::Normalize()
+{
+ if (left > right) {
+ int temp = left;
+ left = right;
+ right = temp;
+ }
+ if (top > bottom) {
+ int temp = top;
+ top = bottom;
+ bottom = temp;
+ }
+}
+void FX_RECT::Intersect(const FX_RECT& src)
+{
+ FX_RECT src_n = src;
+ src_n.Normalize();
+ Normalize();
+ left = left > src_n.left ? left : src_n.left;
+ top = top > src_n.top ? top : src_n.top;
+ right = right < src_n.right ? right : src_n.right;
+ bottom = bottom < src_n.bottom ? bottom : src_n.bottom;
+ if (left > right || top > bottom) {
+ left = top = right = bottom = 0;
+ }
+}
+void FX_RECT::Union(const FX_RECT& other_rect)
+{
+ Normalize();
+ FX_RECT other = other_rect;
+ other.Normalize();
+ left = left < other.left ? left : other.left;
+ right = right > other.right ? right : other.right;
+ bottom = bottom > other.bottom ? bottom : other.bottom;
+ top = top < other.top ? top : other.top;
+}
+FX_BOOL GetIntersection(FX_FLOAT low1, FX_FLOAT high1, FX_FLOAT low2, FX_FLOAT high2,
+ FX_FLOAT& interlow, FX_FLOAT& interhigh)
+{
+ if (low1 >= high2 || low2 >= high1) {
+ return FALSE;
+ }
+ interlow = low1 > low2 ? low1 : low2;
+ interhigh = high1 > high2 ? high2 : high1;
+ return TRUE;
+}
+extern "C" int FXSYS_round(FX_FLOAT d)
+{
+ int iRet = 0;
+ if (d >= 0.0f) {
+ iRet = (int)(d + 0.5f);
+ if (iRet >= 0) {
+ return iRet;
+ }
+ return -iRet;
+ }
+ return (int)(d - 0.5f);
+}
+CFX_FloatRect::CFX_FloatRect(const FX_RECT& rect)
+{
+ left = (FX_FLOAT)(rect.left);
+ right = (FX_FLOAT)(rect.right);
+ bottom = (FX_FLOAT)(rect.top);
+ top = (FX_FLOAT)(rect.bottom);
+}
+void CFX_FloatRect::Normalize()
+{
+ FX_FLOAT temp;
+ if (left > right) {
+ temp = left;
+ left = right;
+ right = temp;
+ }
+ if (bottom > top) {
+ temp = top;
+ top = bottom;
+ bottom = temp;
+ }
+}
+void CFX_FloatRect::Intersect(const CFX_FloatRect& other_rect)
+{
+ Normalize();
+ CFX_FloatRect other = other_rect;
+ other.Normalize();
+ left = left > other.left ? left : other.left;
+ right = right < other.right ? right : other.right;
+ bottom = bottom > other.bottom ? bottom : other.bottom;
+ top = top < other.top ? top : other.top;
+ if (left > right || bottom > top) {
+ left = right = bottom = top = 0;
+ }
+}
+void CFX_FloatRect::Union(const CFX_FloatRect& other_rect)
+{
+ Normalize();
+ CFX_FloatRect other = other_rect;
+ other.Normalize();
+ left = left < other.left ? left : other.left;
+ right = right > other.right ? right : other.right;
+ bottom = bottom < other.bottom ? bottom : other.bottom;
+ top = top > other.top ? top : other.top;
+}
+void CFX_FloatRect::Transform(const CFX_Matrix* pMatrix)
+{
+ pMatrix->TransformRect(left, right, top, bottom);
+}
+int CFX_FloatRect::Substract4(CFX_FloatRect& s, CFX_FloatRect* pRects)
+{
+ Normalize();
+ s.Normalize();
+ int nRects = 0;
+ CFX_FloatRect rects[4];
+ if (left < s.left) {
+ rects[nRects].left = left;
+ rects[nRects].right = s.left;
+ rects[nRects].bottom = bottom;
+ rects[nRects].top = top;
+ nRects ++;
+ }
+ if (s.left < right && s.top < top) {
+ rects[nRects].left = s.left;
+ rects[nRects].right = right;
+ rects[nRects].bottom = s.top;
+ rects[nRects].top = top;
+ nRects ++;
+ }
+ if (s.top > bottom && s.right < right) {
+ rects[nRects].left = s.right;
+ rects[nRects].right = right;
+ rects[nRects].bottom = bottom;
+ rects[nRects].top = s.top;
+ nRects ++;
+ }
+ if (s.bottom > bottom) {
+ rects[nRects].left = s.left;
+ rects[nRects].right = s.right;
+ rects[nRects].bottom = bottom;
+ rects[nRects].top = s.bottom;
+ nRects ++;
+ }
+ if (nRects == 0) {
+ return 0;
+ }
+ for (int i = 0; i < nRects; i ++) {
+ pRects[i] = rects[i];
+ pRects[i].Intersect(*this);
+ }
+ return nRects;
+}
+FX_RECT CFX_FloatRect::GetOutterRect() const
+{
+ CFX_FloatRect rect1 = *this;
+ FX_RECT rect;
+ rect.left = (int)FXSYS_floor(rect1.left);
+ rect.right = (int)FXSYS_ceil(rect1.right);
+ rect.top = (int)FXSYS_floor(rect1.bottom);
+ rect.bottom = (int)FXSYS_ceil(rect1.top);
+ rect.Normalize();
+ return rect;
+}
+FX_RECT CFX_FloatRect::GetInnerRect() const
+{
+ CFX_FloatRect rect1 = *this;
+ FX_RECT rect;
+ rect.left = (int)FXSYS_ceil(rect1.left);
+ rect.right = (int)FXSYS_floor(rect1.right);
+ rect.top = (int)FXSYS_ceil(rect1.bottom);
+ rect.bottom = (int)FXSYS_floor(rect1.top);
+ rect.Normalize();
+ return rect;
+}
+static void _MatchFloatRange(FX_FLOAT f1, FX_FLOAT f2, int& i1, int& i2)
+{
+ int length = (int)FXSYS_ceil(f2 - f1);
+ int i1_1 = (int)FXSYS_floor(f1);
+ int i1_2 = (int)FXSYS_ceil(f1);
+ FX_FLOAT error1 = f1 - i1_1 + (FX_FLOAT)FXSYS_fabs(f2 - i1_1 - length);
+ FX_FLOAT error2 = i1_2 - f1 + (FX_FLOAT)FXSYS_fabs(f2 - i1_2 - length);
+ i1 = (error1 > error2) ? i1_2 : i1_1;
+ i2 = i1 + length;
+}
+FX_RECT CFX_FloatRect::GetClosestRect() const
+{
+ CFX_FloatRect rect1 = *this;
+ FX_RECT rect;
+ _MatchFloatRange(rect1.left, rect1.right, rect.left, rect.right);
+ _MatchFloatRange(rect1.bottom, rect1.top, rect.top, rect.bottom);
+ rect.Normalize();
+ return rect;
+}
+FX_BOOL CFX_FloatRect::Contains(const CFX_FloatRect& other_rect) const
+{
+ CFX_FloatRect n1 = *this;
+ n1.Normalize();
+ CFX_FloatRect n2 = other_rect;
+ n2.Normalize();
+ if (n2.left >= n1.left && n2.right <= n1.right && n2.bottom >= n1.bottom && n2.top <= n1.top) {
+ return TRUE;
+ }
+ return FALSE;
+}
+FX_BOOL CFX_FloatRect::Contains(FX_FLOAT x, FX_FLOAT y) const
+{
+ CFX_FloatRect n1 = *this;
+ n1.Normalize();
+ return x <= n1.right && x >= n1.left && y <= n1.top && y >= n1.bottom;
+}
+void CFX_FloatRect::UpdateRect(FX_FLOAT x, FX_FLOAT y)
+{
+ if (left > x) {
+ left = x;
+ }
+ if (right < x) {
+ right = x;
+ }
+ if (bottom > y) {
+ bottom = y;
+ }
+ if (top < y) {
+ top = y;
+ }
+}
+CFX_FloatRect CFX_FloatRect::GetBBox(const CFX_FloatPoint* pPoints, int nPoints)
+{
+ if (nPoints == 0) {
+ return CFX_FloatRect();
+ }
+ FX_FLOAT min_x = pPoints->x, max_x = pPoints->x, min_y = pPoints->y, max_y = pPoints->y;
+ for (int i = 1; i < nPoints; i ++) {
+ if (min_x > pPoints[i].x) {
+ min_x = pPoints[i].x;
+ }
+ if (max_x < pPoints[i].x) {
+ max_x = pPoints[i].x;
+ }
+ if (min_y > pPoints[i].y) {
+ min_y = pPoints[i].y;
+ }
+ if (max_y < pPoints[i].y) {
+ max_y = pPoints[i].y;
+ }
+ }
+ return CFX_FloatRect(min_x, min_y, max_x, max_y);
+}
+void CFX_Matrix::Set(FX_FLOAT a, FX_FLOAT b, FX_FLOAT c, FX_FLOAT d, FX_FLOAT e, FX_FLOAT f)
+{
+ this->a = a;
+ this->b = b;
+ this->c = c;
+ this->d = d;
+ this->e = e;
+ this->f = f;
+}
+void CFX_Matrix::Set(const FX_FLOAT n[6])
+{
+ FXSYS_memcpy32((void*)this, &n, sizeof(CFX_Matrix));
+}
+void CFX_Matrix::SetReverse(const CFX_Matrix &m)
+{
+ FX_FLOAT i = m.a * m.d - m.b * m.c;
+ if (FXSYS_fabs(i) == 0) {
+ return;
+ }
+ FX_FLOAT j = -i;
+ a = m.d / i;
+ b = m.b / j;
+ c = m.c / j;
+ d = m.a / i;
+ e = (m.c * m.f - m.d * m.e) / i;
+ f = (m.a * m.f - m.b * m.e) / j;
+}
+static void FXCRT_Matrix_Concat(CFX_Matrix &m, const CFX_Matrix &m1, const CFX_Matrix &m2)
+{
+ FX_FLOAT aa = m1.a * m2.a + m1.b * m2.c;
+ FX_FLOAT bb = m1.a * m2.b + m1.b * m2.d;
+ FX_FLOAT cc = m1.c * m2.a + m1.d * m2.c;
+ FX_FLOAT dd = m1.c * m2.b + m1.d * m2.d;
+ FX_FLOAT ee = m1.e * m2.a + m1.f * m2.c + m2.e;
+ FX_FLOAT ff = m1.e * m2.b + m1.f * m2.d + m2.f;
+ m.a = aa, m.b = bb, m.c = cc, m.d = dd, m.e = ee, m.f = ff;
+}
+void CFX_Matrix::Concat(FX_FLOAT a, FX_FLOAT b, FX_FLOAT c, FX_FLOAT d, FX_FLOAT e, FX_FLOAT f, FX_BOOL bPrepended)
+{
+ CFX_Matrix m;
+ m.Set(a, b, c, d, e, f);
+ Concat(m, bPrepended);
+}
+void CFX_Matrix::Concat(const CFX_Matrix &m, FX_BOOL bPrepended)
+{
+ if (bPrepended) {
+ FXCRT_Matrix_Concat(*this, m, *this);
+ } else {
+ FXCRT_Matrix_Concat(*this, *this, m);
+ }
+}
+void CFX_Matrix::ConcatInverse(const CFX_Matrix& src, FX_BOOL bPrepended)
+{
+ CFX_Matrix m;
+ m.SetReverse(src);
+ Concat(m, bPrepended);
+}
+FX_BOOL CFX_Matrix::IsInvertible() const
+{
+ return FXSYS_fabs(a * d - b * c) >= 0.0001f;
+}
+FX_BOOL CFX_Matrix::Is90Rotated() const
+{
+ return FXSYS_fabs(a * 1000) < FXSYS_fabs(b) && FXSYS_fabs(d * 1000) < FXSYS_fabs(c);
+}
+FX_BOOL CFX_Matrix::IsScaled() const
+{
+ return FXSYS_fabs(b * 1000) < FXSYS_fabs(a) && FXSYS_fabs(c * 1000) < FXSYS_fabs(d);
+}
+void CFX_Matrix::Translate(FX_FLOAT x, FX_FLOAT y, FX_BOOL bPrepended)
+{
+ if (bPrepended) {
+ e += x * a + y * c;
+ f += y * d + x * b;
+ } else {
+ e += x, f += y;
+ }
+}
+void CFX_Matrix::Scale(FX_FLOAT sx, FX_FLOAT sy, FX_BOOL bPrepended)
+{
+ a *= sx, d *= sy;
+ if (bPrepended) {
+ b *= sx;
+ c *= sy;
+ } else {
+ b *= sy;
+ c *= sx;
+ e *= sx;
+ f *= sy;
+ }
+}
+void CFX_Matrix::Rotate(FX_FLOAT fRadian, FX_BOOL bPrepended)
+{
+ FX_FLOAT cosValue = FXSYS_cos(fRadian);
+ FX_FLOAT sinValue = FXSYS_sin(fRadian);
+ CFX_Matrix m;
+ m.Set(cosValue, sinValue, -sinValue, cosValue, 0, 0);
+ if (bPrepended) {
+ FXCRT_Matrix_Concat(*this, m, *this);
+ } else {
+ FXCRT_Matrix_Concat(*this, *this, m);
+ }
+}
+void CFX_Matrix::RotateAt(FX_FLOAT fRadian, FX_FLOAT dx, FX_FLOAT dy, FX_BOOL bPrepended)
+{
+ Translate(dx, dy, bPrepended);
+ Rotate(fRadian, bPrepended);
+ Translate(-dx, -dy, bPrepended);
+}
+void CFX_Matrix::Shear(FX_FLOAT fAlphaRadian, FX_FLOAT fBetaRadian, FX_BOOL bPrepended)
+{
+ CFX_Matrix m;
+ m.Set(1, FXSYS_tan(fAlphaRadian), FXSYS_tan(fBetaRadian), 1, 0, 0);
+ if (bPrepended) {
+ FXCRT_Matrix_Concat(*this, m, *this);
+ } else {
+ FXCRT_Matrix_Concat(*this, *this, m);
+ }
+}
+void CFX_Matrix::MatchRect(const CFX_FloatRect& dest, const CFX_FloatRect& src)
+{
+ FX_FLOAT fDiff = src.left - src.right;
+ a = FXSYS_fabs(fDiff) < 0.001f ? 1 : (dest.left - dest.right) / fDiff;
+ fDiff = src.bottom - src.top;
+ d = FXSYS_fabs(fDiff) < 0.001f ? 1 : (dest.bottom - dest.top) / fDiff;
+ e = dest.left - src.left * a;
+ f = dest.bottom - src.bottom * d;
+ b = 0;
+ c = 0;
+}
+FX_FLOAT CFX_Matrix::GetXUnit() const
+{
+ if (b == 0) {
+ return (a > 0 ? a : -a);
+ }
+ if (a == 0) {
+ return (b > 0 ? b : -b);
+ }
+ return FXSYS_sqrt(a * a + b * b);
+}
+FX_FLOAT CFX_Matrix::GetYUnit() const
+{
+ if (c == 0) {
+ return (d > 0 ? d : -d);
+ }
+ if (d == 0) {
+ return (c > 0 ? c : -c);
+ }
+ return FXSYS_sqrt(c * c + d * d);
+}
+void CFX_Matrix::GetUnitRect(CFX_RectF &rect) const
+{
+ rect.left = rect.top = 0;
+ rect.width = rect.height = 1;
+ TransformRect(rect);
+}
+CFX_FloatRect CFX_Matrix::GetUnitRect() const
+{
+ CFX_FloatRect rect(0, 0, 1, 1);
+ rect.Transform((const CFX_Matrix*)this);
+ return rect;
+}
+FX_FLOAT CFX_Matrix::GetUnitArea() const
+{
+ FX_FLOAT A = FXSYS_sqrt(a * a + b * b);
+ FX_FLOAT B = FXSYS_sqrt(c * c + d * d);
+ FX_FLOAT ac = a + c, bd = b + d;
+ FX_FLOAT C = FXSYS_sqrt(ac * ac + bd * bd);
+ FX_FLOAT P = (A + B + C ) / 2;
+ return FXSYS_sqrt(P * (P - A) * (P - B) * (P - C)) * 2;
+}
+FX_FLOAT CFX_Matrix::TransformXDistance(FX_FLOAT dx) const
+{
+ FX_FLOAT fx = a * dx, fy = b * dx;
+ return FXSYS_sqrt(fx * fx + fy * fy);
+}
+FX_INT32 CFX_Matrix::TransformXDistance(FX_INT32 dx) const
+{
+ FX_FLOAT fx = a * dx, fy = b * dx;
+ return FXSYS_round(FXSYS_sqrt(fx * fx + fy * fy));
+}
+FX_FLOAT CFX_Matrix::TransformYDistance(FX_FLOAT dy) const
+{
+ FX_FLOAT fx = c * dy, fy = d * dy;
+ return FXSYS_sqrt(fx * fx + fy * fy);
+}
+FX_INT32 CFX_Matrix::TransformYDistance(FX_INT32 dy) const
+{
+ FX_FLOAT fx = c * dy, fy = d * dy;
+ return FXSYS_round(FXSYS_sqrt(fx * fx + fy * fy));
+}
+FX_FLOAT CFX_Matrix::TransformDistance(FX_FLOAT dx, FX_FLOAT dy) const
+{
+ FX_FLOAT fx = a * dx + c * dy, fy = b * dx + d * dy;
+ return FXSYS_sqrt(fx * fx + fy * fy);
+}
+FX_INT32 CFX_Matrix::TransformDistance(FX_INT32 dx, FX_INT32 dy) const
+{
+ FX_FLOAT fx = a * dx + c * dy, fy = b * dx + d * dy;
+ return FXSYS_round(FXSYS_sqrt(fx * fx + fy * fy));
+}
+FX_FLOAT CFX_Matrix::TransformDistance(FX_FLOAT distance) const
+{
+ return distance * (GetXUnit() + GetYUnit()) / 2;
+}
+void CFX_Matrix::TransformVector(CFX_VectorF &v) const
+{
+ FX_FLOAT fx = a * v.x + c * v.y;
+ FX_FLOAT fy = b * v.x + d * v.y;
+ v.x = fx, v.y = fy;
+}
+void CFX_Matrix::TransformVector(CFX_Vector &v) const
+{
+ FX_FLOAT fx = a * v.x + c * v.y;
+ FX_FLOAT fy = b * v.x + d * v.y;
+ v.x = FXSYS_round(fx);
+ v.y = FXSYS_round(fy);
+}
+void CFX_Matrix::TransformPoints(CFX_Point *points, FX_INT32 iCount) const
+{
+ FXSYS_assert(iCount > 0);
+ FX_FLOAT fx, fy;
+ for (FX_INT32 i = 0; i < iCount; i ++) {
+ fx = a * points->x + c * points->y + e;
+ fy = b * points->x + d * points->y + f;
+ points->x = FXSYS_round(fx);
+ points->y = FXSYS_round(fy);
+ points ++;
+ }
+}
+void CFX_Matrix::TransformPoints(CFX_PointF *points, FX_INT32 iCount) const
+{
+ FXSYS_assert(iCount > 0);
+ FX_FLOAT fx, fy;
+ for (FX_INT32 i = 0; i < iCount; i ++) {
+ fx = a * points->x + c * points->y + e;
+ fy = b * points->x + d * points->y + f;
+ points->x = fx, points->y = fy;
+ points ++;
+ }
+}
+void CFX_Matrix::TransformPoint(FX_FLOAT &x, FX_FLOAT &y) const
+{
+ FX_FLOAT fx = a * x + c * y + e;
+ FX_FLOAT fy = b * x + d * y + f;
+ x = fx, y = fy;
+}
+void CFX_Matrix::TransformPoint(FX_INT32 &x, FX_INT32 &y) const
+{
+ FX_FLOAT fx = a * x + c * y + e;
+ FX_FLOAT fy = b * x + d * y + f;
+ x = FXSYS_round(fx);
+ y = FXSYS_round(fy);
+}
+void CFX_Matrix::TransformRect(CFX_RectF &rect) const
+{
+ FX_FLOAT right = rect.right(), bottom = rect.bottom();
+ TransformRect(rect.left, right, bottom, rect.top);
+ rect.width = right - rect.left;
+ rect.height = bottom - rect.top;
+}
+void CFX_Matrix::TransformRect(CFX_Rect &rect) const
+{
+ FX_FLOAT left = (FX_FLOAT)rect.left;
+ FX_FLOAT top = (FX_FLOAT)rect.bottom();
+ FX_FLOAT right = (FX_FLOAT)rect.right();
+ FX_FLOAT bottom = (FX_FLOAT)rect.top;
+ TransformRect(left, right, top, bottom);
+ rect.left = FXSYS_round(left);
+ rect.top = FXSYS_round(bottom);
+ rect.width = FXSYS_round(right - left);
+ rect.height = FXSYS_round(top - bottom);
+}
+void CFX_Matrix::TransformRect(FX_FLOAT& left, FX_FLOAT& right, FX_FLOAT& top, FX_FLOAT& bottom) const
+{
+ FX_FLOAT x[4], y[4];
+ x[0] = left;
+ y[0] = top;
+ x[1] = left;
+ y[1] = bottom;
+ x[2] = right;
+ y[2] = top;
+ x[3] = right;
+ y[3] = bottom;
+ int i;
+ for (i = 0; i < 4; i ++) {
+ Transform(x[i], y[i], x[i], y[i]);
+ }
+ right = left = x[0];
+ top = bottom = y[0];
+ for (i = 1; i < 4; i ++) {
+ if (right < x[i]) {
+ right = x[i];
+ }
+ if (left > x[i]) {
+ left = x[i];
+ }
+ if (top < y[i]) {
+ top = y[i];
+ }
+ if (bottom > y[i]) {
+ bottom = y[i];
+ }
+ }
+}
diff --git a/core/src/fxcrt/fx_basic_gcc.cpp b/core/src/fxcrt/fx_basic_gcc.cpp
index 20a1e58925..7f5bbade66 100644
--- a/core/src/fxcrt/fx_basic_gcc.cpp
+++ b/core/src/fxcrt/fx_basic_gcc.cpp
@@ -1,232 +1,232 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../include/fxcrt/fx_ext.h"
-template <class T, class STR_T>
-T FXSYS_StrToInt(STR_T str)
-{
- FX_BOOL neg = FALSE;
- if (str == NULL) {
- return 0;
- }
- if (*str == '-') {
- neg = TRUE;
- str ++;
- }
- T num = 0;
- while (*str) {
- if ((*str) < '0' || (*str) > '9') {
- break;
- }
- num = num * 10 + (*str) - '0';
- str ++;
- }
- return neg ? -num : num;
-}
-template <typename T, typename STR_T>
-STR_T FXSYS_IntToStr(T value, STR_T string, int radix)
-{
- int i = 0;
- if (value < 0) {
- string[i++] = '-';
- value = -value;
- } else if (value == 0) {
- string[0] = '0';
- string[1] = 0;
- return string;
- }
- int digits = 1;
- T order = value / 10;
- while(order > 0) {
- digits++;
- order = order / 10;
- }
- for (int d = digits - 1; d > -1; d--) {
- string[d + i] = "0123456789abcdef"[value % 10];
- value /= 10;
- }
- string[digits + i] = 0;
- return string;
-}
-#ifdef __cplusplus
-extern "C" {
-#endif
-FX_INT32 FXSYS_atoi(FX_LPCSTR str)
-{
- return FXSYS_StrToInt<FX_INT32, FX_LPCSTR>(str);
-}
-FX_INT32 FXSYS_wtoi(FX_LPCWSTR str)
-{
- return FXSYS_StrToInt<FX_INT32, FX_LPCWSTR>(str);
-}
-FX_INT64 FXSYS_atoi64(FX_LPCSTR str)
-{
- return FXSYS_StrToInt<FX_INT64, FX_LPCSTR>(str);
-}
-FX_INT64 FXSYS_wtoi64(FX_LPCWSTR str)
-{
- return FXSYS_StrToInt<FX_INT64, FX_LPCWSTR>(str);
-}
-FX_LPCSTR FXSYS_i64toa(FX_INT64 value, FX_LPSTR str, int radix)
-{
- return FXSYS_IntToStr<FX_INT64, FX_LPSTR>(value, str, radix);
-}
-FX_LPCWSTR FXSYS_i64tow(FX_INT64 value, FX_LPWSTR str, int radix)
-{
- return FXSYS_IntToStr<FX_INT64, FX_LPWSTR>(value, str, radix);
-}
-#ifdef __cplusplus
-}
-#endif
-#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
-#ifdef __cplusplus
-extern "C" {
-#endif
-int FXSYS_GetACP()
-{
- return 0;
-}
-FX_DWORD FXSYS_GetFullPathName(FX_LPCSTR filename, FX_DWORD buflen, FX_LPSTR buf, FX_LPSTR* filepart)
-{
- int srclen = FXSYS_strlen(filename);
- if (buf == NULL || (int)buflen < srclen + 1) {
- return srclen + 1;
- }
- FXSYS_strcpy(buf, filename);
- return srclen;
-}
-FX_DWORD FXSYS_GetModuleFileName(FX_LPVOID hModule, char* buf, FX_DWORD bufsize)
-{
- return (FX_DWORD) - 1;
-}
-#ifdef __cplusplus
-}
-#endif
-#endif
-#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
-#ifdef __cplusplus
-extern "C" {
-#endif
-FXSYS_FILE* FXSYS_wfopen(FX_LPCWSTR filename, FX_LPCWSTR mode)
-{
- return FXSYS_fopen(CFX_ByteString::FromUnicode(filename), CFX_ByteString::FromUnicode(mode));
-}
-char* FXSYS_strlwr(char* str)
-{
- if (str == NULL) {
- return NULL;
- }
- char* s = str;
- while (*str) {
- *str = FXSYS_tolower(*str);
- str ++;
- }
- return s;
-}
-char* FXSYS_strupr(char* str)
-{
- if (str == NULL) {
- return NULL;
- }
- char* s = str;
- while (*str) {
- *str = FXSYS_toupper(*str);
- str ++;
- }
- return s;
-}
-FX_WCHAR* FXSYS_wcslwr(FX_WCHAR* str)
-{
- if (str == NULL) {
- return NULL;
- }
- FX_WCHAR* s = str;
- while (*str) {
- *str = FXSYS_tolower(*str);
- str ++;
- }
- return s;
-}
-FX_WCHAR* FXSYS_wcsupr(FX_WCHAR* str)
-{
- if (str == NULL) {
- return NULL;
- }
- FX_WCHAR* s = str;
- while (*str) {
- *str = FXSYS_toupper(*str);
- str ++;
- }
- return s;
-}
-int FXSYS_stricmp(const char*dst, const char*src)
-{
- int f, l;
- do {
- if ( ((f = (unsigned char)(*(dst++))) >= 'A') && (f <= 'Z') ) {
- f -= ('A' - 'a');
- }
- if ( ((l = (unsigned char)(*(src++))) >= 'A') && (l <= 'Z') ) {
- l -= ('A' - 'a');
- }
- } while ( f && (f == l) );
- return(f - l);
-}
-int FXSYS_wcsicmp(const FX_WCHAR *dst, const FX_WCHAR *src)
-{
- FX_WCHAR f, l;
- do {
- if ( ((f = (FX_WCHAR)(*(dst++))) >= 'A') && (f <= 'Z') ) {
- f -= ('A' - 'a');
- }
- if ( ((l = (FX_WCHAR)(*(src++))) >= 'A') && (l <= 'Z') ) {
- l -= ('A' - 'a');
- }
- } while ( f && (f == l) );
- return(f - l);
-}
-char* FXSYS_itoa(int value, char* string, int radix)
-{
- return FXSYS_IntToStr<FX_INT32, FX_LPSTR>(value, string, radix);
-}
-#ifdef __cplusplus
-}
-#endif
-#endif
-#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
-#ifdef __cplusplus
-extern "C" {
-#endif
-int FXSYS_WideCharToMultiByte(FX_DWORD codepage, FX_DWORD dwFlags, FX_LPCWSTR wstr, int wlen,
- FX_LPSTR buf, int buflen, FX_LPCSTR default_str, FX_BOOL* pUseDefault)
-{
- int len = 0;
- for (int i = 0; i < wlen; i ++) {
- if (wstr[i] < 0x100) {
- if (buf && len < buflen) {
- buf[len] = (FX_CHAR)wstr[i];
- }
- len ++;
- }
- }
- return len;
-}
-int FXSYS_MultiByteToWideChar(FX_DWORD codepage, FX_DWORD dwFlags, FX_LPCSTR bstr, int blen,
- FX_LPWSTR buf, int buflen)
-{
- int wlen = 0;
- for (int i = 0; i < blen; i ++) {
- if (buf && wlen < buflen) {
- buf[wlen] = bstr[i];
- }
- wlen ++;
- }
- return wlen;
-}
-#ifdef __cplusplus
-}
-#endif
-#endif
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fxcrt/fx_ext.h"
+template <class T, class STR_T>
+T FXSYS_StrToInt(STR_T str)
+{
+ FX_BOOL neg = FALSE;
+ if (str == NULL) {
+ return 0;
+ }
+ if (*str == '-') {
+ neg = TRUE;
+ str ++;
+ }
+ T num = 0;
+ while (*str) {
+ if ((*str) < '0' || (*str) > '9') {
+ break;
+ }
+ num = num * 10 + (*str) - '0';
+ str ++;
+ }
+ return neg ? -num : num;
+}
+template <typename T, typename STR_T>
+STR_T FXSYS_IntToStr(T value, STR_T string, int radix)
+{
+ int i = 0;
+ if (value < 0) {
+ string[i++] = '-';
+ value = -value;
+ } else if (value == 0) {
+ string[0] = '0';
+ string[1] = 0;
+ return string;
+ }
+ int digits = 1;
+ T order = value / 10;
+ while(order > 0) {
+ digits++;
+ order = order / 10;
+ }
+ for (int d = digits - 1; d > -1; d--) {
+ string[d + i] = "0123456789abcdef"[value % 10];
+ value /= 10;
+ }
+ string[digits + i] = 0;
+ return string;
+}
+#ifdef __cplusplus
+extern "C" {
+#endif
+FX_INT32 FXSYS_atoi(FX_LPCSTR str)
+{
+ return FXSYS_StrToInt<FX_INT32, FX_LPCSTR>(str);
+}
+FX_INT32 FXSYS_wtoi(FX_LPCWSTR str)
+{
+ return FXSYS_StrToInt<FX_INT32, FX_LPCWSTR>(str);
+}
+FX_INT64 FXSYS_atoi64(FX_LPCSTR str)
+{
+ return FXSYS_StrToInt<FX_INT64, FX_LPCSTR>(str);
+}
+FX_INT64 FXSYS_wtoi64(FX_LPCWSTR str)
+{
+ return FXSYS_StrToInt<FX_INT64, FX_LPCWSTR>(str);
+}
+FX_LPCSTR FXSYS_i64toa(FX_INT64 value, FX_LPSTR str, int radix)
+{
+ return FXSYS_IntToStr<FX_INT64, FX_LPSTR>(value, str, radix);
+}
+FX_LPCWSTR FXSYS_i64tow(FX_INT64 value, FX_LPWSTR str, int radix)
+{
+ return FXSYS_IntToStr<FX_INT64, FX_LPWSTR>(value, str, radix);
+}
+#ifdef __cplusplus
+}
+#endif
+#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
+#ifdef __cplusplus
+extern "C" {
+#endif
+int FXSYS_GetACP()
+{
+ return 0;
+}
+FX_DWORD FXSYS_GetFullPathName(FX_LPCSTR filename, FX_DWORD buflen, FX_LPSTR buf, FX_LPSTR* filepart)
+{
+ int srclen = FXSYS_strlen(filename);
+ if (buf == NULL || (int)buflen < srclen + 1) {
+ return srclen + 1;
+ }
+ FXSYS_strcpy(buf, filename);
+ return srclen;
+}
+FX_DWORD FXSYS_GetModuleFileName(FX_LPVOID hModule, char* buf, FX_DWORD bufsize)
+{
+ return (FX_DWORD) - 1;
+}
+#ifdef __cplusplus
+}
+#endif
+#endif
+#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
+#ifdef __cplusplus
+extern "C" {
+#endif
+FXSYS_FILE* FXSYS_wfopen(FX_LPCWSTR filename, FX_LPCWSTR mode)
+{
+ return FXSYS_fopen(CFX_ByteString::FromUnicode(filename), CFX_ByteString::FromUnicode(mode));
+}
+char* FXSYS_strlwr(char* str)
+{
+ if (str == NULL) {
+ return NULL;
+ }
+ char* s = str;
+ while (*str) {
+ *str = FXSYS_tolower(*str);
+ str ++;
+ }
+ return s;
+}
+char* FXSYS_strupr(char* str)
+{
+ if (str == NULL) {
+ return NULL;
+ }
+ char* s = str;
+ while (*str) {
+ *str = FXSYS_toupper(*str);
+ str ++;
+ }
+ return s;
+}
+FX_WCHAR* FXSYS_wcslwr(FX_WCHAR* str)
+{
+ if (str == NULL) {
+ return NULL;
+ }
+ FX_WCHAR* s = str;
+ while (*str) {
+ *str = FXSYS_tolower(*str);
+ str ++;
+ }
+ return s;
+}
+FX_WCHAR* FXSYS_wcsupr(FX_WCHAR* str)
+{
+ if (str == NULL) {
+ return NULL;
+ }
+ FX_WCHAR* s = str;
+ while (*str) {
+ *str = FXSYS_toupper(*str);
+ str ++;
+ }
+ return s;
+}
+int FXSYS_stricmp(const char*dst, const char*src)
+{
+ int f, l;
+ do {
+ if ( ((f = (unsigned char)(*(dst++))) >= 'A') && (f <= 'Z') ) {
+ f -= ('A' - 'a');
+ }
+ if ( ((l = (unsigned char)(*(src++))) >= 'A') && (l <= 'Z') ) {
+ l -= ('A' - 'a');
+ }
+ } while ( f && (f == l) );
+ return(f - l);
+}
+int FXSYS_wcsicmp(const FX_WCHAR *dst, const FX_WCHAR *src)
+{
+ FX_WCHAR f, l;
+ do {
+ if ( ((f = (FX_WCHAR)(*(dst++))) >= 'A') && (f <= 'Z') ) {
+ f -= ('A' - 'a');
+ }
+ if ( ((l = (FX_WCHAR)(*(src++))) >= 'A') && (l <= 'Z') ) {
+ l -= ('A' - 'a');
+ }
+ } while ( f && (f == l) );
+ return(f - l);
+}
+char* FXSYS_itoa(int value, char* string, int radix)
+{
+ return FXSYS_IntToStr<FX_INT32, FX_LPSTR>(value, string, radix);
+}
+#ifdef __cplusplus
+}
+#endif
+#endif
+#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
+#ifdef __cplusplus
+extern "C" {
+#endif
+int FXSYS_WideCharToMultiByte(FX_DWORD codepage, FX_DWORD dwFlags, FX_LPCWSTR wstr, int wlen,
+ FX_LPSTR buf, int buflen, FX_LPCSTR default_str, FX_BOOL* pUseDefault)
+{
+ int len = 0;
+ for (int i = 0; i < wlen; i ++) {
+ if (wstr[i] < 0x100) {
+ if (buf && len < buflen) {
+ buf[len] = (FX_CHAR)wstr[i];
+ }
+ len ++;
+ }
+ }
+ return len;
+}
+int FXSYS_MultiByteToWideChar(FX_DWORD codepage, FX_DWORD dwFlags, FX_LPCSTR bstr, int blen,
+ FX_LPWSTR buf, int buflen)
+{
+ int wlen = 0;
+ for (int i = 0; i < blen; i ++) {
+ if (buf && wlen < buflen) {
+ buf[wlen] = bstr[i];
+ }
+ wlen ++;
+ }
+ return wlen;
+}
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/core/src/fxcrt/fx_basic_list.cpp b/core/src/fxcrt/fx_basic_list.cpp
index 92b3d2c0c4..bf7091268b 100644
--- a/core/src/fxcrt/fx_basic_list.cpp
+++ b/core/src/fxcrt/fx_basic_list.cpp
@@ -1,141 +1,141 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../include/fxcrt/fx_basic.h"
-#include "plex.h"
-CFX_PtrList::CFX_PtrList(int nBlockSize, IFX_Allocator* pAllocator)
- : m_pAllocator(pAllocator)
- , m_pNodeHead(NULL)
- , m_pNodeTail(NULL)
- , m_nCount(0)
- , m_pNodeFree(NULL)
- , m_pBlocks(NULL)
- , m_nBlockSize(nBlockSize)
-{
-}
-FX_POSITION CFX_PtrList::AddTail(void* newElement)
-{
- CNode* pNewNode = NewNode(m_pNodeTail, NULL);
- pNewNode->data = newElement;
- if (m_pNodeTail != NULL) {
- m_pNodeTail->pNext = pNewNode;
- } else {
- m_pNodeHead = pNewNode;
- }
- m_pNodeTail = pNewNode;
- return (FX_POSITION) pNewNode;
-}
-FX_POSITION CFX_PtrList::AddHead(void* newElement)
-{
- CNode* pNewNode = NewNode(NULL, m_pNodeHead);
- pNewNode->data = newElement;
- if (m_pNodeHead != NULL) {
- m_pNodeHead->pPrev = pNewNode;
- } else {
- m_pNodeTail = pNewNode;
- }
- m_pNodeHead = pNewNode;
- return (FX_POSITION) pNewNode;
-}
-FX_POSITION CFX_PtrList::InsertAfter(FX_POSITION position, void* newElement)
-{
- if (position == NULL) {
- return AddTail(newElement);
- }
- CNode* pOldNode = (CNode*) position;
- CNode* pNewNode = NewNode(pOldNode, pOldNode->pNext);
- pNewNode->data = newElement;
- if (pOldNode->pNext != NULL) {
- pOldNode->pNext->pPrev = pNewNode;
- } else {
- m_pNodeTail = pNewNode;
- }
- pOldNode->pNext = pNewNode;
- return (FX_POSITION) pNewNode;
-}
-void CFX_PtrList::RemoveAt(FX_POSITION position)
-{
- CNode* pOldNode = (CNode*) position;
- if (pOldNode == m_pNodeHead) {
- m_pNodeHead = pOldNode->pNext;
- } else {
- pOldNode->pPrev->pNext = pOldNode->pNext;
- }
- if (pOldNode == m_pNodeTail) {
- m_pNodeTail = pOldNode->pPrev;
- } else {
- pOldNode->pNext->pPrev = pOldNode->pPrev;
- }
- FreeNode(pOldNode);
-}
-void CFX_PtrList::FreeNode(CFX_PtrList::CNode* pNode)
-{
- pNode->pNext = m_pNodeFree;
- m_pNodeFree = pNode;
- m_nCount--;
- if (m_nCount == 0) {
- RemoveAll();
- }
-}
-void CFX_PtrList::RemoveAll()
-{
- m_nCount = 0;
- m_pNodeHead = m_pNodeTail = m_pNodeFree = NULL;
- m_pBlocks->FreeDataChain(m_pAllocator);
- m_pBlocks = NULL;
-}
-CFX_PtrList::CNode*
-CFX_PtrList::NewNode(CFX_PtrList::CNode* pPrev, CFX_PtrList::CNode* pNext)
-{
- if (m_pNodeFree == NULL) {
- CFX_Plex* pNewBlock = CFX_Plex::Create(m_pAllocator, m_pBlocks, m_nBlockSize, sizeof(CNode));
- CNode* pNode = (CNode*)pNewBlock->data();
- pNode += m_nBlockSize - 1;
- for (int i = m_nBlockSize - 1; i >= 0; i--, pNode--) {
- pNode->pNext = m_pNodeFree;
- m_pNodeFree = pNode;
- }
- }
- ASSERT(m_pNodeFree != NULL);
- CFX_PtrList::CNode* pNode = m_pNodeFree;
- m_pNodeFree = m_pNodeFree->pNext;
- pNode->pPrev = pPrev;
- pNode->pNext = pNext;
- m_nCount++;
- ASSERT(m_nCount > 0);
- pNode->data = 0;
- return pNode;
-}
-CFX_PtrList::~CFX_PtrList()
-{
- RemoveAll();
- ASSERT(m_nCount == 0);
-}
-FX_POSITION CFX_PtrList::FindIndex(int nIndex) const
-{
- if (nIndex >= m_nCount || nIndex < 0) {
- return NULL;
- }
- CNode* pNode = m_pNodeHead;
- while (nIndex--) {
- pNode = pNode->pNext;
- }
- return (FX_POSITION) pNode;
-}
-FX_POSITION CFX_PtrList::Find(void* searchValue, FX_POSITION startAfter) const
-{
- CNode* pNode = (CNode*) startAfter;
- if (pNode == NULL) {
- pNode = m_pNodeHead;
- } else {
- pNode = pNode->pNext;
- }
- for (; pNode != NULL; pNode = pNode->pNext)
- if (pNode->data == searchValue) {
- return (FX_POSITION) pNode;
- }
- return NULL;
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fxcrt/fx_basic.h"
+#include "plex.h"
+CFX_PtrList::CFX_PtrList(int nBlockSize, IFX_Allocator* pAllocator)
+ : m_pAllocator(pAllocator)
+ , m_pNodeHead(NULL)
+ , m_pNodeTail(NULL)
+ , m_nCount(0)
+ , m_pNodeFree(NULL)
+ , m_pBlocks(NULL)
+ , m_nBlockSize(nBlockSize)
+{
+}
+FX_POSITION CFX_PtrList::AddTail(void* newElement)
+{
+ CNode* pNewNode = NewNode(m_pNodeTail, NULL);
+ pNewNode->data = newElement;
+ if (m_pNodeTail != NULL) {
+ m_pNodeTail->pNext = pNewNode;
+ } else {
+ m_pNodeHead = pNewNode;
+ }
+ m_pNodeTail = pNewNode;
+ return (FX_POSITION) pNewNode;
+}
+FX_POSITION CFX_PtrList::AddHead(void* newElement)
+{
+ CNode* pNewNode = NewNode(NULL, m_pNodeHead);
+ pNewNode->data = newElement;
+ if (m_pNodeHead != NULL) {
+ m_pNodeHead->pPrev = pNewNode;
+ } else {
+ m_pNodeTail = pNewNode;
+ }
+ m_pNodeHead = pNewNode;
+ return (FX_POSITION) pNewNode;
+}
+FX_POSITION CFX_PtrList::InsertAfter(FX_POSITION position, void* newElement)
+{
+ if (position == NULL) {
+ return AddTail(newElement);
+ }
+ CNode* pOldNode = (CNode*) position;
+ CNode* pNewNode = NewNode(pOldNode, pOldNode->pNext);
+ pNewNode->data = newElement;
+ if (pOldNode->pNext != NULL) {
+ pOldNode->pNext->pPrev = pNewNode;
+ } else {
+ m_pNodeTail = pNewNode;
+ }
+ pOldNode->pNext = pNewNode;
+ return (FX_POSITION) pNewNode;
+}
+void CFX_PtrList::RemoveAt(FX_POSITION position)
+{
+ CNode* pOldNode = (CNode*) position;
+ if (pOldNode == m_pNodeHead) {
+ m_pNodeHead = pOldNode->pNext;
+ } else {
+ pOldNode->pPrev->pNext = pOldNode->pNext;
+ }
+ if (pOldNode == m_pNodeTail) {
+ m_pNodeTail = pOldNode->pPrev;
+ } else {
+ pOldNode->pNext->pPrev = pOldNode->pPrev;
+ }
+ FreeNode(pOldNode);
+}
+void CFX_PtrList::FreeNode(CFX_PtrList::CNode* pNode)
+{
+ pNode->pNext = m_pNodeFree;
+ m_pNodeFree = pNode;
+ m_nCount--;
+ if (m_nCount == 0) {
+ RemoveAll();
+ }
+}
+void CFX_PtrList::RemoveAll()
+{
+ m_nCount = 0;
+ m_pNodeHead = m_pNodeTail = m_pNodeFree = NULL;
+ m_pBlocks->FreeDataChain(m_pAllocator);
+ m_pBlocks = NULL;
+}
+CFX_PtrList::CNode*
+CFX_PtrList::NewNode(CFX_PtrList::CNode* pPrev, CFX_PtrList::CNode* pNext)
+{
+ if (m_pNodeFree == NULL) {
+ CFX_Plex* pNewBlock = CFX_Plex::Create(m_pAllocator, m_pBlocks, m_nBlockSize, sizeof(CNode));
+ CNode* pNode = (CNode*)pNewBlock->data();
+ pNode += m_nBlockSize - 1;
+ for (int i = m_nBlockSize - 1; i >= 0; i--, pNode--) {
+ pNode->pNext = m_pNodeFree;
+ m_pNodeFree = pNode;
+ }
+ }
+ ASSERT(m_pNodeFree != NULL);
+ CFX_PtrList::CNode* pNode = m_pNodeFree;
+ m_pNodeFree = m_pNodeFree->pNext;
+ pNode->pPrev = pPrev;
+ pNode->pNext = pNext;
+ m_nCount++;
+ ASSERT(m_nCount > 0);
+ pNode->data = 0;
+ return pNode;
+}
+CFX_PtrList::~CFX_PtrList()
+{
+ RemoveAll();
+ ASSERT(m_nCount == 0);
+}
+FX_POSITION CFX_PtrList::FindIndex(int nIndex) const
+{
+ if (nIndex >= m_nCount || nIndex < 0) {
+ return NULL;
+ }
+ CNode* pNode = m_pNodeHead;
+ while (nIndex--) {
+ pNode = pNode->pNext;
+ }
+ return (FX_POSITION) pNode;
+}
+FX_POSITION CFX_PtrList::Find(void* searchValue, FX_POSITION startAfter) const
+{
+ CNode* pNode = (CNode*) startAfter;
+ if (pNode == NULL) {
+ pNode = m_pNodeHead;
+ } else {
+ pNode = pNode->pNext;
+ }
+ for (; pNode != NULL; pNode = pNode->pNext)
+ if (pNode->data == searchValue) {
+ return (FX_POSITION) pNode;
+ }
+ return NULL;
+}
diff --git a/core/src/fxcrt/fx_basic_maps.cpp b/core/src/fxcrt/fx_basic_maps.cpp
index cb397ee8bd..a0b1788a82 100644
--- a/core/src/fxcrt/fx_basic_maps.cpp
+++ b/core/src/fxcrt/fx_basic_maps.cpp
@@ -1,654 +1,654 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../include/fxcrt/fx_ext.h"
-#include "plex.h"
-static void ConstructElement(CFX_ByteString* pNewData)
-{
- new (pNewData) CFX_ByteString();
-}
-static void DestructElement(CFX_ByteString* pOldData)
-{
- pOldData->~CFX_ByteString();
-}
-CFX_MapPtrToPtr::CFX_MapPtrToPtr(int nBlockSize, IFX_Allocator* pAllocator)
- : m_pAllocator(pAllocator)
- , m_pHashTable(NULL)
- , m_nHashTableSize(17)
- , m_nCount(0)
- , m_pFreeList(NULL)
- , m_pBlocks(NULL)
- , m_nBlockSize(nBlockSize)
-{
- ASSERT(m_nBlockSize > 0);
-}
-void CFX_MapPtrToPtr::RemoveAll()
-{
- if (m_pHashTable) {
- FX_Allocator_Free(m_pAllocator, m_pHashTable);
- m_pHashTable = NULL;
- }
- m_nCount = 0;
- m_pFreeList = NULL;
- m_pBlocks->FreeDataChain(m_pAllocator);
- m_pBlocks = NULL;
-}
-CFX_MapPtrToPtr::~CFX_MapPtrToPtr()
-{
- RemoveAll();
- ASSERT(m_nCount == 0);
-}
-FX_DWORD CFX_MapPtrToPtr::HashKey(void* key) const
-{
- return ((FX_DWORD)(FX_UINTPTR)key) >> 4;
-}
-void CFX_MapPtrToPtr::GetNextAssoc(FX_POSITION& rNextPosition, void*& rKey, void*& rValue) const
-{
- ASSERT(m_pHashTable != NULL);
- CAssoc* pAssocRet = (CAssoc*)rNextPosition;
- ASSERT(pAssocRet != NULL);
- if (pAssocRet == (CAssoc*) - 1) {
- for (FX_DWORD nBucket = 0; nBucket < m_nHashTableSize; nBucket++)
- if ((pAssocRet = m_pHashTable[nBucket]) != NULL) {
- break;
- }
- ASSERT(pAssocRet != NULL);
- }
- CAssoc* pAssocNext;
- if ((pAssocNext = pAssocRet->pNext) == NULL) {
- for (FX_DWORD nBucket = (HashKey(pAssocRet->key) % m_nHashTableSize) + 1; nBucket < m_nHashTableSize; nBucket ++) {
- if ((pAssocNext = m_pHashTable[nBucket]) != NULL) {
- break;
- }
- }
- }
- rNextPosition = (FX_POSITION) pAssocNext;
- rKey = pAssocRet->key;
- rValue = pAssocRet->value;
-}
-FX_BOOL CFX_MapPtrToPtr::Lookup(void* key, void*& rValue) const
-{
- FX_DWORD nHash;
- CAssoc* pAssoc = GetAssocAt(key, nHash);
- if (pAssoc == NULL) {
- return FALSE;
- }
- rValue = pAssoc->value;
- return TRUE;
-}
-void* CFX_MapPtrToPtr::GetValueAt(void* key) const
-{
- FX_DWORD nHash;
- CAssoc* pAssoc = GetAssocAt(key, nHash);
- if (pAssoc == NULL) {
- return NULL;
- }
- return pAssoc->value;
-}
-void*& CFX_MapPtrToPtr::operator[](void* key)
-{
- FX_DWORD nHash;
- CAssoc* pAssoc;
- if ((pAssoc = GetAssocAt(key, nHash)) == NULL) {
- if (m_pHashTable == NULL) {
- InitHashTable(m_nHashTableSize);
- }
- pAssoc = NewAssoc();
- pAssoc->key = key;
- pAssoc->pNext = m_pHashTable[nHash];
- m_pHashTable[nHash] = pAssoc;
- }
- return pAssoc->value;
-}
-CFX_MapPtrToPtr::CAssoc*
-CFX_MapPtrToPtr::GetAssocAt(void* key, FX_DWORD& nHash) const
-{
- nHash = HashKey(key) % m_nHashTableSize;
- if (m_pHashTable == NULL) {
- return NULL;
- }
- CAssoc* pAssoc;
- for (pAssoc = m_pHashTable[nHash]; pAssoc != NULL; pAssoc = pAssoc->pNext) {
- if (pAssoc->key == key) {
- return pAssoc;
- }
- }
- return NULL;
-}
-CFX_MapPtrToPtr::CAssoc*
-CFX_MapPtrToPtr::NewAssoc()
-{
- if (m_pFreeList == NULL) {
- CFX_Plex* newBlock = CFX_Plex::Create(m_pAllocator, m_pBlocks, m_nBlockSize, sizeof(CFX_MapPtrToPtr::CAssoc));
- CFX_MapPtrToPtr::CAssoc* pAssoc = (CFX_MapPtrToPtr::CAssoc*)newBlock->data();
- pAssoc += m_nBlockSize - 1;
- for (int i = m_nBlockSize - 1; i >= 0; i--, pAssoc--) {
- pAssoc->pNext = m_pFreeList;
- m_pFreeList = pAssoc;
- }
- }
- ASSERT(m_pFreeList != NULL);
- CFX_MapPtrToPtr::CAssoc* pAssoc = m_pFreeList;
- m_pFreeList = m_pFreeList->pNext;
- m_nCount++;
- ASSERT(m_nCount > 0);
- pAssoc->key = 0;
- pAssoc->value = 0;
- return pAssoc;
-}
-void CFX_MapPtrToPtr::InitHashTable(
- FX_DWORD nHashSize, FX_BOOL bAllocNow)
-{
- ASSERT(m_nCount == 0);
- ASSERT(nHashSize > 0);
- if (m_pHashTable != NULL) {
- FX_Allocator_Free(m_pAllocator, m_pHashTable);
- m_pHashTable = NULL;
- }
- if (bAllocNow) {
- m_pHashTable = FX_Allocator_Alloc(m_pAllocator, CAssoc*, nHashSize);
- if (m_pHashTable) {
- FXSYS_memset32(m_pHashTable, 0, sizeof(CAssoc*) * nHashSize);
- }
- }
- m_nHashTableSize = nHashSize;
-}
-FX_BOOL CFX_MapPtrToPtr::RemoveKey(void* key)
-{
- if (m_pHashTable == NULL) {
- return FALSE;
- }
- CAssoc** ppAssocPrev;
- ppAssocPrev = &m_pHashTable[HashKey(key) % m_nHashTableSize];
- CAssoc* pAssoc;
- for (pAssoc = *ppAssocPrev; pAssoc != NULL; pAssoc = pAssoc->pNext) {
- if (pAssoc->key == key) {
- *ppAssocPrev = pAssoc->pNext;
- FreeAssoc(pAssoc);
- return TRUE;
- }
- ppAssocPrev = &pAssoc->pNext;
- }
- return FALSE;
-}
-void CFX_MapPtrToPtr::FreeAssoc(CFX_MapPtrToPtr::CAssoc* pAssoc)
-{
- pAssoc->pNext = m_pFreeList;
- m_pFreeList = pAssoc;
- m_nCount--;
- ASSERT(m_nCount >= 0);
- if (m_nCount == 0) {
- RemoveAll();
- }
-}
-CFX_MapByteStringToPtr::CFX_MapByteStringToPtr(int nBlockSize, IFX_Allocator* pAllocator)
- : m_pAllocator(pAllocator)
- , m_pHashTable(NULL)
- , m_nHashTableSize(17)
- , m_nCount(0)
- , m_pFreeList(NULL)
- , m_pBlocks(NULL)
- , m_nBlockSize(nBlockSize)
-{
- ASSERT(m_nBlockSize > 0);
-}
-void CFX_MapByteStringToPtr::RemoveAll()
-{
- if (m_pHashTable != NULL) {
- for (FX_DWORD nHash = 0; nHash < m_nHashTableSize; nHash++) {
- CAssoc* pAssoc;
- for (pAssoc = m_pHashTable[nHash]; pAssoc != NULL;
- pAssoc = pAssoc->pNext) {
- DestructElement(&pAssoc->key);
- }
- }
- FX_Allocator_Free(m_pAllocator, m_pHashTable);
- m_pHashTable = NULL;
- }
- m_nCount = 0;
- m_pFreeList = NULL;
- m_pBlocks->FreeDataChain(m_pAllocator);
- m_pBlocks = NULL;
-}
-CFX_MapByteStringToPtr::~CFX_MapByteStringToPtr()
-{
- RemoveAll();
- ASSERT(m_nCount == 0);
-}
-void CFX_MapByteStringToPtr::GetNextAssoc(FX_POSITION& rNextPosition,
- CFX_ByteString& rKey, void*& rValue) const
-{
- ASSERT(m_pHashTable != NULL);
- CAssoc* pAssocRet = (CAssoc*)rNextPosition;
- ASSERT(pAssocRet != NULL);
- if (pAssocRet == (CAssoc*) - 1) {
- for (FX_DWORD nBucket = 0; nBucket < m_nHashTableSize; nBucket++)
- if ((pAssocRet = m_pHashTable[nBucket]) != NULL) {
- break;
- }
- ASSERT(pAssocRet != NULL);
- }
- CAssoc* pAssocNext;
- if ((pAssocNext = pAssocRet->pNext) == NULL) {
- for (FX_DWORD nBucket = pAssocRet->nHashValue + 1;
- nBucket < m_nHashTableSize; nBucket++)
- if ((pAssocNext = m_pHashTable[nBucket]) != NULL) {
- break;
- }
- }
- rNextPosition = (FX_POSITION) pAssocNext;
- rKey = pAssocRet->key;
- rValue = pAssocRet->value;
-}
-FX_LPVOID CFX_MapByteStringToPtr::GetNextValue(FX_POSITION& rNextPosition) const
-{
- ASSERT(m_pHashTable != NULL);
- CAssoc* pAssocRet = (CAssoc*)rNextPosition;
- ASSERT(pAssocRet != NULL);
- if (pAssocRet == (CAssoc*) - 1) {
- for (FX_DWORD nBucket = 0; nBucket < m_nHashTableSize; nBucket++)
- if ((pAssocRet = m_pHashTable[nBucket]) != NULL) {
- break;
- }
- ASSERT(pAssocRet != NULL);
- }
- CAssoc* pAssocNext;
- if ((pAssocNext = pAssocRet->pNext) == NULL) {
- for (FX_DWORD nBucket = pAssocRet->nHashValue + 1;
- nBucket < m_nHashTableSize; nBucket++)
- if ((pAssocNext = m_pHashTable[nBucket]) != NULL) {
- break;
- }
- }
- rNextPosition = (FX_POSITION) pAssocNext;
- return pAssocRet->value;
-}
-void*& CFX_MapByteStringToPtr::operator[](FX_BSTR key)
-{
- FX_DWORD nHash;
- CAssoc* pAssoc;
- if ((pAssoc = GetAssocAt(key, nHash)) == NULL) {
- if (m_pHashTable == NULL) {
- InitHashTable(m_nHashTableSize);
- }
- pAssoc = NewAssoc();
- pAssoc->nHashValue = nHash;
- pAssoc->key = key;
- pAssoc->pNext = m_pHashTable[nHash];
- m_pHashTable[nHash] = pAssoc;
- }
- return pAssoc->value;
-}
-CFX_MapByteStringToPtr::CAssoc*
-CFX_MapByteStringToPtr::NewAssoc()
-{
- if (m_pFreeList == NULL) {
- CFX_Plex* newBlock = CFX_Plex::Create(m_pAllocator, m_pBlocks, m_nBlockSize, sizeof(CFX_MapByteStringToPtr::CAssoc));
- CFX_MapByteStringToPtr::CAssoc* pAssoc = (CFX_MapByteStringToPtr::CAssoc*)newBlock->data();
- pAssoc += m_nBlockSize - 1;
- for (int i = m_nBlockSize - 1; i >= 0; i--, pAssoc--) {
- pAssoc->pNext = m_pFreeList;
- m_pFreeList = pAssoc;
- }
- }
- ASSERT(m_pFreeList != NULL);
- CFX_MapByteStringToPtr::CAssoc* pAssoc = m_pFreeList;
- m_pFreeList = m_pFreeList->pNext;
- m_nCount++;
- ASSERT(m_nCount > 0);
- ConstructElement(&pAssoc->key);
- pAssoc->value = 0;
- return pAssoc;
-}
-void CFX_MapByteStringToPtr::FreeAssoc(CFX_MapByteStringToPtr::CAssoc* pAssoc)
-{
- DestructElement(&pAssoc->key);
- pAssoc->pNext = m_pFreeList;
- m_pFreeList = pAssoc;
- m_nCount--;
- ASSERT(m_nCount >= 0);
- if (m_nCount == 0) {
- RemoveAll();
- }
-}
-CFX_MapByteStringToPtr::CAssoc*
-CFX_MapByteStringToPtr::GetAssocAt(FX_BSTR key, FX_DWORD& nHash) const
-{
- nHash = HashKey(key) % m_nHashTableSize;
- if (m_pHashTable == NULL) {
- return NULL;
- }
- CAssoc* pAssoc;
- for (pAssoc = m_pHashTable[nHash]; pAssoc != NULL; pAssoc = pAssoc->pNext) {
- if (pAssoc->key == key) {
- return pAssoc;
- }
- }
- return NULL;
-}
-FX_BOOL CFX_MapByteStringToPtr::Lookup(FX_BSTR key, void*& rValue) const
-{
- FX_DWORD nHash;
- CAssoc* pAssoc = GetAssocAt(key, nHash);
- if (pAssoc == NULL) {
- return FALSE;
- }
- rValue = pAssoc->value;
- return TRUE;
-}
-void CFX_MapByteStringToPtr::InitHashTable(
- FX_DWORD nHashSize, FX_BOOL bAllocNow)
-{
- ASSERT(m_nCount == 0);
- ASSERT(nHashSize > 0);
- if (m_pHashTable != NULL) {
- FX_Allocator_Free(m_pAllocator, m_pHashTable);
- m_pHashTable = NULL;
- }
- if (bAllocNow) {
- m_pHashTable = FX_Allocator_Alloc(m_pAllocator, CAssoc*, nHashSize);
- if (m_pHashTable) {
- FXSYS_memset32(m_pHashTable, 0, sizeof(CAssoc*) * nHashSize);
- }
- }
- m_nHashTableSize = nHashSize;
-}
-inline FX_DWORD CFX_MapByteStringToPtr::HashKey(FX_BSTR key) const
-{
- FX_DWORD nHash = 0;
- int len = key.GetLength();
- FX_LPCBYTE buf = key;
- for (int i = 0; i < len; i ++) {
- nHash = (nHash << 5) + nHash + buf[i];
- }
- return nHash;
-}
-FX_BOOL CFX_MapByteStringToPtr::RemoveKey(FX_BSTR key)
-{
- if (m_pHashTable == NULL) {
- return FALSE;
- }
- CAssoc** ppAssocPrev;
- ppAssocPrev = &m_pHashTable[HashKey(key) % m_nHashTableSize];
- CAssoc* pAssoc;
- for (pAssoc = *ppAssocPrev; pAssoc != NULL; pAssoc = pAssoc->pNext) {
- if (pAssoc->key == key) {
- *ppAssocPrev = pAssoc->pNext;
- FreeAssoc(pAssoc);
- return TRUE;
- }
- ppAssocPrev = &pAssoc->pNext;
- }
- return FALSE;
-}
-struct _CompactString {
- FX_BYTE m_CompactLen;
- FX_BYTE m_LenHigh;
- FX_BYTE m_LenLow;
- FX_BYTE m_Unused;
- FX_LPBYTE m_pBuffer;
-};
-static void _CompactStringRelease(IFX_Allocator* pAllocator, _CompactString* pCompact)
-{
- if (pCompact->m_CompactLen == 0xff) {
- FX_Allocator_Free(pAllocator, pCompact->m_pBuffer);
- }
-}
-static FX_BOOL _CompactStringSame(_CompactString* pCompact, FX_LPCBYTE pStr, int len)
-{
- if (len < sizeof(_CompactString)) {
- if (pCompact->m_CompactLen != len) {
- return FALSE;
- }
- return FXSYS_memcmp32(&pCompact->m_LenHigh, pStr, len) == 0;
- }
- if (pCompact->m_CompactLen != 0xff || pCompact->m_LenHigh * 256 + pCompact->m_LenLow != len) {
- return FALSE;
- }
- return FXSYS_memcmp32(pCompact->m_pBuffer, pStr, len) == 0;
-}
-static void _CompactStringStore(IFX_Allocator* pAllocator, _CompactString* pCompact, FX_LPCBYTE pStr, int len)
-{
- if (len < (int)sizeof(_CompactString)) {
- pCompact->m_CompactLen = (FX_BYTE)len;
- FXSYS_memcpy32(&pCompact->m_LenHigh, pStr, len);
- return;
- }
- pCompact->m_CompactLen = 0xff;
- pCompact->m_LenHigh = len / 256;
- pCompact->m_LenLow = len % 256;
- pCompact->m_pBuffer = FX_Allocator_Alloc(pAllocator, FX_BYTE, len);
- if (pCompact->m_pBuffer) {
- FXSYS_memcpy32(pCompact->m_pBuffer, pStr, len);
- }
-}
-static CFX_ByteStringC _CompactStringGet(_CompactString* pCompact)
-{
- if (pCompact->m_CompactLen == 0xff) {
- return CFX_ByteStringC(pCompact->m_pBuffer, pCompact->m_LenHigh * 256 + pCompact->m_LenLow);
- }
- if (pCompact->m_CompactLen == 0xfe) {
- return CFX_ByteStringC();
- }
- return CFX_ByteStringC(&pCompact->m_LenHigh, pCompact->m_CompactLen);
-}
-#define CMAP_ALLOC_STEP 8
-#define CMAP_INDEX_SIZE 8
-CFX_CMapByteStringToPtr::CFX_CMapByteStringToPtr(IFX_Allocator* pAllocator)
- : m_Buffer(sizeof(_CompactString) + sizeof(void*), CMAP_ALLOC_STEP, CMAP_INDEX_SIZE, pAllocator)
-{
-}
-CFX_CMapByteStringToPtr::~CFX_CMapByteStringToPtr()
-{
- RemoveAll();
-}
-void CFX_CMapByteStringToPtr::RemoveAll()
-{
- IFX_Allocator* pAllocator = m_Buffer.m_pAllocator;
- int size = m_Buffer.GetSize();
- for (int i = 0; i < size; i ++) {
- _CompactStringRelease(pAllocator, (_CompactString*)m_Buffer.GetAt(i));
- }
- m_Buffer.RemoveAll();
-}
-FX_POSITION CFX_CMapByteStringToPtr::GetStartPosition() const
-{
- int size = m_Buffer.GetSize();
- for (int i = 0; i < size; i ++) {
- _CompactString* pKey = (_CompactString*)m_Buffer.GetAt(i);
- if (pKey->m_CompactLen != 0xfe) {
- return (FX_POSITION)(FX_UINTPTR)(i + 1);
- }
- }
- return NULL;
-}
-void CFX_CMapByteStringToPtr::GetNextAssoc(FX_POSITION& rNextPosition, CFX_ByteString& rKey, void*& rValue) const
-{
- if (rNextPosition == NULL) {
- return;
- }
- int index = (int)(FX_UINTPTR)rNextPosition - 1;
- _CompactString* pKey = (_CompactString*)m_Buffer.GetAt(index);
- rKey = _CompactStringGet(pKey);
- rValue = *(void**)(pKey + 1);
- index ++;
- int size = m_Buffer.GetSize();
- while (index < size) {
- pKey = (_CompactString*)m_Buffer.GetAt(index);
- if (pKey->m_CompactLen != 0xfe) {
- rNextPosition = (FX_POSITION)(FX_UINTPTR)(index + 1);
- return;
- }
- index ++;
- }
- rNextPosition = NULL;
-}
-FX_LPVOID CFX_CMapByteStringToPtr::GetNextValue(FX_POSITION& rNextPosition) const
-{
- if (rNextPosition == NULL) {
- return NULL;
- }
- int index = (int)(FX_UINTPTR)rNextPosition - 1;
- _CompactString* pKey = (_CompactString*)m_Buffer.GetAt(index);
- FX_LPVOID rValue = *(void**)(pKey + 1);
- index ++;
- int size = m_Buffer.GetSize();
- while (index < size) {
- pKey = (_CompactString*)m_Buffer.GetAt(index);
- if (pKey->m_CompactLen != 0xfe) {
- rNextPosition = (FX_POSITION)(FX_UINTPTR)(index + 1);
- return rValue;
- }
- index ++;
- }
- rNextPosition = NULL;
- return rValue;
-}
-FX_BOOL _CMapLookupCallback(void* param, void* pData)
-{
- return !_CompactStringSame((_CompactString*)pData, ((CFX_ByteStringC*)param)->GetPtr(), ((CFX_ByteStringC*)param)->GetLength());
-}
-FX_BOOL CFX_CMapByteStringToPtr::Lookup(FX_BSTR key, void*& rValue) const
-{
- void* p = m_Buffer.Iterate(_CMapLookupCallback, (void*)&key);
- if (!p) {
- return FALSE;
- }
- rValue = *(void**)((_CompactString*)p + 1);
- return TRUE;
-}
-void CFX_CMapByteStringToPtr::SetAt(FX_BSTR key, void* value)
-{
- ASSERT(value != NULL);
- int index, key_len = key.GetLength();
- int size = m_Buffer.GetSize();
- for (index = 0; index < size; index ++) {
- _CompactString* pKey = (_CompactString*)m_Buffer.GetAt(index);
- if (!_CompactStringSame(pKey, (FX_LPCBYTE)key, key_len)) {
- continue;
- }
- *(void**)(pKey + 1) = value;
- return;
- }
- IFX_Allocator* pAllocator = m_Buffer.m_pAllocator;
- for (index = 0; index < size; index ++) {
- _CompactString* pKey = (_CompactString*)m_Buffer.GetAt(index);
- if (pKey->m_CompactLen) {
- continue;
- }
- _CompactStringStore(pAllocator, pKey, (FX_LPCBYTE)key, key_len);
- *(void**)(pKey + 1) = value;
- return;
- }
- _CompactString* pKey = (_CompactString*)m_Buffer.Add();
- _CompactStringStore(pAllocator, pKey, (FX_LPCBYTE)key, key_len);
- *(void**)(pKey + 1) = value;
-}
-void CFX_CMapByteStringToPtr::AddValue(FX_BSTR key, void* value)
-{
- ASSERT(value != NULL);
- _CompactString* pKey = (_CompactString*)m_Buffer.Add();
- _CompactStringStore(m_Buffer.m_pAllocator, pKey, (FX_LPCBYTE)key, key.GetLength());
- *(void**)(pKey + 1) = value;
-}
-void CFX_CMapByteStringToPtr::RemoveKey(FX_BSTR key)
-{
- int key_len = key.GetLength();
- IFX_Allocator* pAllocator = m_Buffer.m_pAllocator;
- int size = m_Buffer.GetSize();
- for (int index = 0; index < size; index ++) {
- _CompactString* pKey = (_CompactString*)m_Buffer.GetAt(index);
- if (!_CompactStringSame(pKey, (FX_LPCBYTE)key, key_len)) {
- continue;
- }
- _CompactStringRelease(pAllocator, pKey);
- pKey->m_CompactLen = 0xfe;
- return;
- }
-}
-int CFX_CMapByteStringToPtr::GetCount() const
-{
- int count = 0;
- int size = m_Buffer.GetSize();
- for (int i = 0; i < size; i ++) {
- _CompactString* pKey = (_CompactString*)m_Buffer.GetAt(i);
- if (pKey->m_CompactLen != 0xfe) {
- count ++;
- }
- }
- return count;
-}
-extern "C" {
- static int _CompareDWord(const void* p1, const void* p2)
- {
- return (*(FX_DWORD*)p1) - (*(FX_DWORD*)p2);
- }
-};
-struct _DWordPair {
- FX_DWORD key;
- FX_DWORD value;
-};
-FX_BOOL CFX_CMapDWordToDWord::Lookup(FX_DWORD key, FX_DWORD& value) const
-{
- FX_LPVOID pResult = FXSYS_bsearch(&key, m_Buffer.GetBuffer(), m_Buffer.GetSize() / sizeof(_DWordPair),
- sizeof(_DWordPair), _CompareDWord);
- if (pResult == NULL) {
- return FALSE;
- }
- value = ((FX_DWORD*)pResult)[1];
- return TRUE;
-}
-FX_POSITION CFX_CMapDWordToDWord::GetStartPosition() const
-{
- FX_DWORD count = m_Buffer.GetSize() / sizeof(_DWordPair);
- if (count == 0) {
- return NULL;
- }
- return (FX_POSITION)1;
-}
-void CFX_CMapDWordToDWord::GetNextAssoc(FX_POSITION& pos, FX_DWORD& key, FX_DWORD& value) const
-{
- if (pos == 0) {
- return;
- }
- FX_DWORD index = ((FX_DWORD)(FX_UINTPTR)pos) - 1;
- FX_DWORD count = m_Buffer.GetSize() / sizeof(_DWordPair);
- _DWordPair* buf = (_DWordPair*)m_Buffer.GetBuffer();
- key = buf[index].key;
- value = buf[index].value;
- if (index == count - 1) {
- pos = 0;
- } else {
- pos = (FX_POSITION)((FX_UINTPTR)pos + 1);
- }
-}
-void CFX_CMapDWordToDWord::SetAt(FX_DWORD key, FX_DWORD value)
-{
- FX_DWORD count = m_Buffer.GetSize() / sizeof(_DWordPair);
- _DWordPair* buf = (_DWordPair*)m_Buffer.GetBuffer();
- _DWordPair pair = {key, value};
- if (count == 0 || key > buf[count - 1].key) {
- m_Buffer.AppendBlock(&pair, sizeof(_DWordPair));
- return;
- }
- int low = 0, high = count - 1;
- while (low <= high) {
- int mid = (low + high) / 2;
- if (buf[mid].key < key) {
- low = mid + 1;
- } else if (buf[mid].key > key) {
- high = mid - 1;
- } else {
- buf[mid].value = value;
- return;
- }
- }
- m_Buffer.InsertBlock(low * sizeof(_DWordPair), &pair, sizeof(_DWordPair));
-}
-void CFX_CMapDWordToDWord::EstimateSize(FX_DWORD size, FX_DWORD grow_by)
-{
- m_Buffer.EstimateSize(size, grow_by);
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fxcrt/fx_ext.h"
+#include "plex.h"
+static void ConstructElement(CFX_ByteString* pNewData)
+{
+ new (pNewData) CFX_ByteString();
+}
+static void DestructElement(CFX_ByteString* pOldData)
+{
+ pOldData->~CFX_ByteString();
+}
+CFX_MapPtrToPtr::CFX_MapPtrToPtr(int nBlockSize, IFX_Allocator* pAllocator)
+ : m_pAllocator(pAllocator)
+ , m_pHashTable(NULL)
+ , m_nHashTableSize(17)
+ , m_nCount(0)
+ , m_pFreeList(NULL)
+ , m_pBlocks(NULL)
+ , m_nBlockSize(nBlockSize)
+{
+ ASSERT(m_nBlockSize > 0);
+}
+void CFX_MapPtrToPtr::RemoveAll()
+{
+ if (m_pHashTable) {
+ FX_Allocator_Free(m_pAllocator, m_pHashTable);
+ m_pHashTable = NULL;
+ }
+ m_nCount = 0;
+ m_pFreeList = NULL;
+ m_pBlocks->FreeDataChain(m_pAllocator);
+ m_pBlocks = NULL;
+}
+CFX_MapPtrToPtr::~CFX_MapPtrToPtr()
+{
+ RemoveAll();
+ ASSERT(m_nCount == 0);
+}
+FX_DWORD CFX_MapPtrToPtr::HashKey(void* key) const
+{
+ return ((FX_DWORD)(FX_UINTPTR)key) >> 4;
+}
+void CFX_MapPtrToPtr::GetNextAssoc(FX_POSITION& rNextPosition, void*& rKey, void*& rValue) const
+{
+ ASSERT(m_pHashTable != NULL);
+ CAssoc* pAssocRet = (CAssoc*)rNextPosition;
+ ASSERT(pAssocRet != NULL);
+ if (pAssocRet == (CAssoc*) - 1) {
+ for (FX_DWORD nBucket = 0; nBucket < m_nHashTableSize; nBucket++)
+ if ((pAssocRet = m_pHashTable[nBucket]) != NULL) {
+ break;
+ }
+ ASSERT(pAssocRet != NULL);
+ }
+ CAssoc* pAssocNext;
+ if ((pAssocNext = pAssocRet->pNext) == NULL) {
+ for (FX_DWORD nBucket = (HashKey(pAssocRet->key) % m_nHashTableSize) + 1; nBucket < m_nHashTableSize; nBucket ++) {
+ if ((pAssocNext = m_pHashTable[nBucket]) != NULL) {
+ break;
+ }
+ }
+ }
+ rNextPosition = (FX_POSITION) pAssocNext;
+ rKey = pAssocRet->key;
+ rValue = pAssocRet->value;
+}
+FX_BOOL CFX_MapPtrToPtr::Lookup(void* key, void*& rValue) const
+{
+ FX_DWORD nHash;
+ CAssoc* pAssoc = GetAssocAt(key, nHash);
+ if (pAssoc == NULL) {
+ return FALSE;
+ }
+ rValue = pAssoc->value;
+ return TRUE;
+}
+void* CFX_MapPtrToPtr::GetValueAt(void* key) const
+{
+ FX_DWORD nHash;
+ CAssoc* pAssoc = GetAssocAt(key, nHash);
+ if (pAssoc == NULL) {
+ return NULL;
+ }
+ return pAssoc->value;
+}
+void*& CFX_MapPtrToPtr::operator[](void* key)
+{
+ FX_DWORD nHash;
+ CAssoc* pAssoc;
+ if ((pAssoc = GetAssocAt(key, nHash)) == NULL) {
+ if (m_pHashTable == NULL) {
+ InitHashTable(m_nHashTableSize);
+ }
+ pAssoc = NewAssoc();
+ pAssoc->key = key;
+ pAssoc->pNext = m_pHashTable[nHash];
+ m_pHashTable[nHash] = pAssoc;
+ }
+ return pAssoc->value;
+}
+CFX_MapPtrToPtr::CAssoc*
+CFX_MapPtrToPtr::GetAssocAt(void* key, FX_DWORD& nHash) const
+{
+ nHash = HashKey(key) % m_nHashTableSize;
+ if (m_pHashTable == NULL) {
+ return NULL;
+ }
+ CAssoc* pAssoc;
+ for (pAssoc = m_pHashTable[nHash]; pAssoc != NULL; pAssoc = pAssoc->pNext) {
+ if (pAssoc->key == key) {
+ return pAssoc;
+ }
+ }
+ return NULL;
+}
+CFX_MapPtrToPtr::CAssoc*
+CFX_MapPtrToPtr::NewAssoc()
+{
+ if (m_pFreeList == NULL) {
+ CFX_Plex* newBlock = CFX_Plex::Create(m_pAllocator, m_pBlocks, m_nBlockSize, sizeof(CFX_MapPtrToPtr::CAssoc));
+ CFX_MapPtrToPtr::CAssoc* pAssoc = (CFX_MapPtrToPtr::CAssoc*)newBlock->data();
+ pAssoc += m_nBlockSize - 1;
+ for (int i = m_nBlockSize - 1; i >= 0; i--, pAssoc--) {
+ pAssoc->pNext = m_pFreeList;
+ m_pFreeList = pAssoc;
+ }
+ }
+ ASSERT(m_pFreeList != NULL);
+ CFX_MapPtrToPtr::CAssoc* pAssoc = m_pFreeList;
+ m_pFreeList = m_pFreeList->pNext;
+ m_nCount++;
+ ASSERT(m_nCount > 0);
+ pAssoc->key = 0;
+ pAssoc->value = 0;
+ return pAssoc;
+}
+void CFX_MapPtrToPtr::InitHashTable(
+ FX_DWORD nHashSize, FX_BOOL bAllocNow)
+{
+ ASSERT(m_nCount == 0);
+ ASSERT(nHashSize > 0);
+ if (m_pHashTable != NULL) {
+ FX_Allocator_Free(m_pAllocator, m_pHashTable);
+ m_pHashTable = NULL;
+ }
+ if (bAllocNow) {
+ m_pHashTable = FX_Allocator_Alloc(m_pAllocator, CAssoc*, nHashSize);
+ if (m_pHashTable) {
+ FXSYS_memset32(m_pHashTable, 0, sizeof(CAssoc*) * nHashSize);
+ }
+ }
+ m_nHashTableSize = nHashSize;
+}
+FX_BOOL CFX_MapPtrToPtr::RemoveKey(void* key)
+{
+ if (m_pHashTable == NULL) {
+ return FALSE;
+ }
+ CAssoc** ppAssocPrev;
+ ppAssocPrev = &m_pHashTable[HashKey(key) % m_nHashTableSize];
+ CAssoc* pAssoc;
+ for (pAssoc = *ppAssocPrev; pAssoc != NULL; pAssoc = pAssoc->pNext) {
+ if (pAssoc->key == key) {
+ *ppAssocPrev = pAssoc->pNext;
+ FreeAssoc(pAssoc);
+ return TRUE;
+ }
+ ppAssocPrev = &pAssoc->pNext;
+ }
+ return FALSE;
+}
+void CFX_MapPtrToPtr::FreeAssoc(CFX_MapPtrToPtr::CAssoc* pAssoc)
+{
+ pAssoc->pNext = m_pFreeList;
+ m_pFreeList = pAssoc;
+ m_nCount--;
+ ASSERT(m_nCount >= 0);
+ if (m_nCount == 0) {
+ RemoveAll();
+ }
+}
+CFX_MapByteStringToPtr::CFX_MapByteStringToPtr(int nBlockSize, IFX_Allocator* pAllocator)
+ : m_pAllocator(pAllocator)
+ , m_pHashTable(NULL)
+ , m_nHashTableSize(17)
+ , m_nCount(0)
+ , m_pFreeList(NULL)
+ , m_pBlocks(NULL)
+ , m_nBlockSize(nBlockSize)
+{
+ ASSERT(m_nBlockSize > 0);
+}
+void CFX_MapByteStringToPtr::RemoveAll()
+{
+ if (m_pHashTable != NULL) {
+ for (FX_DWORD nHash = 0; nHash < m_nHashTableSize; nHash++) {
+ CAssoc* pAssoc;
+ for (pAssoc = m_pHashTable[nHash]; pAssoc != NULL;
+ pAssoc = pAssoc->pNext) {
+ DestructElement(&pAssoc->key);
+ }
+ }
+ FX_Allocator_Free(m_pAllocator, m_pHashTable);
+ m_pHashTable = NULL;
+ }
+ m_nCount = 0;
+ m_pFreeList = NULL;
+ m_pBlocks->FreeDataChain(m_pAllocator);
+ m_pBlocks = NULL;
+}
+CFX_MapByteStringToPtr::~CFX_MapByteStringToPtr()
+{
+ RemoveAll();
+ ASSERT(m_nCount == 0);
+}
+void CFX_MapByteStringToPtr::GetNextAssoc(FX_POSITION& rNextPosition,
+ CFX_ByteString& rKey, void*& rValue) const
+{
+ ASSERT(m_pHashTable != NULL);
+ CAssoc* pAssocRet = (CAssoc*)rNextPosition;
+ ASSERT(pAssocRet != NULL);
+ if (pAssocRet == (CAssoc*) - 1) {
+ for (FX_DWORD nBucket = 0; nBucket < m_nHashTableSize; nBucket++)
+ if ((pAssocRet = m_pHashTable[nBucket]) != NULL) {
+ break;
+ }
+ ASSERT(pAssocRet != NULL);
+ }
+ CAssoc* pAssocNext;
+ if ((pAssocNext = pAssocRet->pNext) == NULL) {
+ for (FX_DWORD nBucket = pAssocRet->nHashValue + 1;
+ nBucket < m_nHashTableSize; nBucket++)
+ if ((pAssocNext = m_pHashTable[nBucket]) != NULL) {
+ break;
+ }
+ }
+ rNextPosition = (FX_POSITION) pAssocNext;
+ rKey = pAssocRet->key;
+ rValue = pAssocRet->value;
+}
+FX_LPVOID CFX_MapByteStringToPtr::GetNextValue(FX_POSITION& rNextPosition) const
+{
+ ASSERT(m_pHashTable != NULL);
+ CAssoc* pAssocRet = (CAssoc*)rNextPosition;
+ ASSERT(pAssocRet != NULL);
+ if (pAssocRet == (CAssoc*) - 1) {
+ for (FX_DWORD nBucket = 0; nBucket < m_nHashTableSize; nBucket++)
+ if ((pAssocRet = m_pHashTable[nBucket]) != NULL) {
+ break;
+ }
+ ASSERT(pAssocRet != NULL);
+ }
+ CAssoc* pAssocNext;
+ if ((pAssocNext = pAssocRet->pNext) == NULL) {
+ for (FX_DWORD nBucket = pAssocRet->nHashValue + 1;
+ nBucket < m_nHashTableSize; nBucket++)
+ if ((pAssocNext = m_pHashTable[nBucket]) != NULL) {
+ break;
+ }
+ }
+ rNextPosition = (FX_POSITION) pAssocNext;
+ return pAssocRet->value;
+}
+void*& CFX_MapByteStringToPtr::operator[](FX_BSTR key)
+{
+ FX_DWORD nHash;
+ CAssoc* pAssoc;
+ if ((pAssoc = GetAssocAt(key, nHash)) == NULL) {
+ if (m_pHashTable == NULL) {
+ InitHashTable(m_nHashTableSize);
+ }
+ pAssoc = NewAssoc();
+ pAssoc->nHashValue = nHash;
+ pAssoc->key = key;
+ pAssoc->pNext = m_pHashTable[nHash];
+ m_pHashTable[nHash] = pAssoc;
+ }
+ return pAssoc->value;
+}
+CFX_MapByteStringToPtr::CAssoc*
+CFX_MapByteStringToPtr::NewAssoc()
+{
+ if (m_pFreeList == NULL) {
+ CFX_Plex* newBlock = CFX_Plex::Create(m_pAllocator, m_pBlocks, m_nBlockSize, sizeof(CFX_MapByteStringToPtr::CAssoc));
+ CFX_MapByteStringToPtr::CAssoc* pAssoc = (CFX_MapByteStringToPtr::CAssoc*)newBlock->data();
+ pAssoc += m_nBlockSize - 1;
+ for (int i = m_nBlockSize - 1; i >= 0; i--, pAssoc--) {
+ pAssoc->pNext = m_pFreeList;
+ m_pFreeList = pAssoc;
+ }
+ }
+ ASSERT(m_pFreeList != NULL);
+ CFX_MapByteStringToPtr::CAssoc* pAssoc = m_pFreeList;
+ m_pFreeList = m_pFreeList->pNext;
+ m_nCount++;
+ ASSERT(m_nCount > 0);
+ ConstructElement(&pAssoc->key);
+ pAssoc->value = 0;
+ return pAssoc;
+}
+void CFX_MapByteStringToPtr::FreeAssoc(CFX_MapByteStringToPtr::CAssoc* pAssoc)
+{
+ DestructElement(&pAssoc->key);
+ pAssoc->pNext = m_pFreeList;
+ m_pFreeList = pAssoc;
+ m_nCount--;
+ ASSERT(m_nCount >= 0);
+ if (m_nCount == 0) {
+ RemoveAll();
+ }
+}
+CFX_MapByteStringToPtr::CAssoc*
+CFX_MapByteStringToPtr::GetAssocAt(FX_BSTR key, FX_DWORD& nHash) const
+{
+ nHash = HashKey(key) % m_nHashTableSize;
+ if (m_pHashTable == NULL) {
+ return NULL;
+ }
+ CAssoc* pAssoc;
+ for (pAssoc = m_pHashTable[nHash]; pAssoc != NULL; pAssoc = pAssoc->pNext) {
+ if (pAssoc->key == key) {
+ return pAssoc;
+ }
+ }
+ return NULL;
+}
+FX_BOOL CFX_MapByteStringToPtr::Lookup(FX_BSTR key, void*& rValue) const
+{
+ FX_DWORD nHash;
+ CAssoc* pAssoc = GetAssocAt(key, nHash);
+ if (pAssoc == NULL) {
+ return FALSE;
+ }
+ rValue = pAssoc->value;
+ return TRUE;
+}
+void CFX_MapByteStringToPtr::InitHashTable(
+ FX_DWORD nHashSize, FX_BOOL bAllocNow)
+{
+ ASSERT(m_nCount == 0);
+ ASSERT(nHashSize > 0);
+ if (m_pHashTable != NULL) {
+ FX_Allocator_Free(m_pAllocator, m_pHashTable);
+ m_pHashTable = NULL;
+ }
+ if (bAllocNow) {
+ m_pHashTable = FX_Allocator_Alloc(m_pAllocator, CAssoc*, nHashSize);
+ if (m_pHashTable) {
+ FXSYS_memset32(m_pHashTable, 0, sizeof(CAssoc*) * nHashSize);
+ }
+ }
+ m_nHashTableSize = nHashSize;
+}
+inline FX_DWORD CFX_MapByteStringToPtr::HashKey(FX_BSTR key) const
+{
+ FX_DWORD nHash = 0;
+ int len = key.GetLength();
+ FX_LPCBYTE buf = key;
+ for (int i = 0; i < len; i ++) {
+ nHash = (nHash << 5) + nHash + buf[i];
+ }
+ return nHash;
+}
+FX_BOOL CFX_MapByteStringToPtr::RemoveKey(FX_BSTR key)
+{
+ if (m_pHashTable == NULL) {
+ return FALSE;
+ }
+ CAssoc** ppAssocPrev;
+ ppAssocPrev = &m_pHashTable[HashKey(key) % m_nHashTableSize];
+ CAssoc* pAssoc;
+ for (pAssoc = *ppAssocPrev; pAssoc != NULL; pAssoc = pAssoc->pNext) {
+ if (pAssoc->key == key) {
+ *ppAssocPrev = pAssoc->pNext;
+ FreeAssoc(pAssoc);
+ return TRUE;
+ }
+ ppAssocPrev = &pAssoc->pNext;
+ }
+ return FALSE;
+}
+struct _CompactString {
+ FX_BYTE m_CompactLen;
+ FX_BYTE m_LenHigh;
+ FX_BYTE m_LenLow;
+ FX_BYTE m_Unused;
+ FX_LPBYTE m_pBuffer;
+};
+static void _CompactStringRelease(IFX_Allocator* pAllocator, _CompactString* pCompact)
+{
+ if (pCompact->m_CompactLen == 0xff) {
+ FX_Allocator_Free(pAllocator, pCompact->m_pBuffer);
+ }
+}
+static FX_BOOL _CompactStringSame(_CompactString* pCompact, FX_LPCBYTE pStr, int len)
+{
+ if (len < sizeof(_CompactString)) {
+ if (pCompact->m_CompactLen != len) {
+ return FALSE;
+ }
+ return FXSYS_memcmp32(&pCompact->m_LenHigh, pStr, len) == 0;
+ }
+ if (pCompact->m_CompactLen != 0xff || pCompact->m_LenHigh * 256 + pCompact->m_LenLow != len) {
+ return FALSE;
+ }
+ return FXSYS_memcmp32(pCompact->m_pBuffer, pStr, len) == 0;
+}
+static void _CompactStringStore(IFX_Allocator* pAllocator, _CompactString* pCompact, FX_LPCBYTE pStr, int len)
+{
+ if (len < (int)sizeof(_CompactString)) {
+ pCompact->m_CompactLen = (FX_BYTE)len;
+ FXSYS_memcpy32(&pCompact->m_LenHigh, pStr, len);
+ return;
+ }
+ pCompact->m_CompactLen = 0xff;
+ pCompact->m_LenHigh = len / 256;
+ pCompact->m_LenLow = len % 256;
+ pCompact->m_pBuffer = FX_Allocator_Alloc(pAllocator, FX_BYTE, len);
+ if (pCompact->m_pBuffer) {
+ FXSYS_memcpy32(pCompact->m_pBuffer, pStr, len);
+ }
+}
+static CFX_ByteStringC _CompactStringGet(_CompactString* pCompact)
+{
+ if (pCompact->m_CompactLen == 0xff) {
+ return CFX_ByteStringC(pCompact->m_pBuffer, pCompact->m_LenHigh * 256 + pCompact->m_LenLow);
+ }
+ if (pCompact->m_CompactLen == 0xfe) {
+ return CFX_ByteStringC();
+ }
+ return CFX_ByteStringC(&pCompact->m_LenHigh, pCompact->m_CompactLen);
+}
+#define CMAP_ALLOC_STEP 8
+#define CMAP_INDEX_SIZE 8
+CFX_CMapByteStringToPtr::CFX_CMapByteStringToPtr(IFX_Allocator* pAllocator)
+ : m_Buffer(sizeof(_CompactString) + sizeof(void*), CMAP_ALLOC_STEP, CMAP_INDEX_SIZE, pAllocator)
+{
+}
+CFX_CMapByteStringToPtr::~CFX_CMapByteStringToPtr()
+{
+ RemoveAll();
+}
+void CFX_CMapByteStringToPtr::RemoveAll()
+{
+ IFX_Allocator* pAllocator = m_Buffer.m_pAllocator;
+ int size = m_Buffer.GetSize();
+ for (int i = 0; i < size; i ++) {
+ _CompactStringRelease(pAllocator, (_CompactString*)m_Buffer.GetAt(i));
+ }
+ m_Buffer.RemoveAll();
+}
+FX_POSITION CFX_CMapByteStringToPtr::GetStartPosition() const
+{
+ int size = m_Buffer.GetSize();
+ for (int i = 0; i < size; i ++) {
+ _CompactString* pKey = (_CompactString*)m_Buffer.GetAt(i);
+ if (pKey->m_CompactLen != 0xfe) {
+ return (FX_POSITION)(FX_UINTPTR)(i + 1);
+ }
+ }
+ return NULL;
+}
+void CFX_CMapByteStringToPtr::GetNextAssoc(FX_POSITION& rNextPosition, CFX_ByteString& rKey, void*& rValue) const
+{
+ if (rNextPosition == NULL) {
+ return;
+ }
+ int index = (int)(FX_UINTPTR)rNextPosition - 1;
+ _CompactString* pKey = (_CompactString*)m_Buffer.GetAt(index);
+ rKey = _CompactStringGet(pKey);
+ rValue = *(void**)(pKey + 1);
+ index ++;
+ int size = m_Buffer.GetSize();
+ while (index < size) {
+ pKey = (_CompactString*)m_Buffer.GetAt(index);
+ if (pKey->m_CompactLen != 0xfe) {
+ rNextPosition = (FX_POSITION)(FX_UINTPTR)(index + 1);
+ return;
+ }
+ index ++;
+ }
+ rNextPosition = NULL;
+}
+FX_LPVOID CFX_CMapByteStringToPtr::GetNextValue(FX_POSITION& rNextPosition) const
+{
+ if (rNextPosition == NULL) {
+ return NULL;
+ }
+ int index = (int)(FX_UINTPTR)rNextPosition - 1;
+ _CompactString* pKey = (_CompactString*)m_Buffer.GetAt(index);
+ FX_LPVOID rValue = *(void**)(pKey + 1);
+ index ++;
+ int size = m_Buffer.GetSize();
+ while (index < size) {
+ pKey = (_CompactString*)m_Buffer.GetAt(index);
+ if (pKey->m_CompactLen != 0xfe) {
+ rNextPosition = (FX_POSITION)(FX_UINTPTR)(index + 1);
+ return rValue;
+ }
+ index ++;
+ }
+ rNextPosition = NULL;
+ return rValue;
+}
+FX_BOOL _CMapLookupCallback(void* param, void* pData)
+{
+ return !_CompactStringSame((_CompactString*)pData, ((CFX_ByteStringC*)param)->GetPtr(), ((CFX_ByteStringC*)param)->GetLength());
+}
+FX_BOOL CFX_CMapByteStringToPtr::Lookup(FX_BSTR key, void*& rValue) const
+{
+ void* p = m_Buffer.Iterate(_CMapLookupCallback, (void*)&key);
+ if (!p) {
+ return FALSE;
+ }
+ rValue = *(void**)((_CompactString*)p + 1);
+ return TRUE;
+}
+void CFX_CMapByteStringToPtr::SetAt(FX_BSTR key, void* value)
+{
+ ASSERT(value != NULL);
+ int index, key_len = key.GetLength();
+ int size = m_Buffer.GetSize();
+ for (index = 0; index < size; index ++) {
+ _CompactString* pKey = (_CompactString*)m_Buffer.GetAt(index);
+ if (!_CompactStringSame(pKey, (FX_LPCBYTE)key, key_len)) {
+ continue;
+ }
+ *(void**)(pKey + 1) = value;
+ return;
+ }
+ IFX_Allocator* pAllocator = m_Buffer.m_pAllocator;
+ for (index = 0; index < size; index ++) {
+ _CompactString* pKey = (_CompactString*)m_Buffer.GetAt(index);
+ if (pKey->m_CompactLen) {
+ continue;
+ }
+ _CompactStringStore(pAllocator, pKey, (FX_LPCBYTE)key, key_len);
+ *(void**)(pKey + 1) = value;
+ return;
+ }
+ _CompactString* pKey = (_CompactString*)m_Buffer.Add();
+ _CompactStringStore(pAllocator, pKey, (FX_LPCBYTE)key, key_len);
+ *(void**)(pKey + 1) = value;
+}
+void CFX_CMapByteStringToPtr::AddValue(FX_BSTR key, void* value)
+{
+ ASSERT(value != NULL);
+ _CompactString* pKey = (_CompactString*)m_Buffer.Add();
+ _CompactStringStore(m_Buffer.m_pAllocator, pKey, (FX_LPCBYTE)key, key.GetLength());
+ *(void**)(pKey + 1) = value;
+}
+void CFX_CMapByteStringToPtr::RemoveKey(FX_BSTR key)
+{
+ int key_len = key.GetLength();
+ IFX_Allocator* pAllocator = m_Buffer.m_pAllocator;
+ int size = m_Buffer.GetSize();
+ for (int index = 0; index < size; index ++) {
+ _CompactString* pKey = (_CompactString*)m_Buffer.GetAt(index);
+ if (!_CompactStringSame(pKey, (FX_LPCBYTE)key, key_len)) {
+ continue;
+ }
+ _CompactStringRelease(pAllocator, pKey);
+ pKey->m_CompactLen = 0xfe;
+ return;
+ }
+}
+int CFX_CMapByteStringToPtr::GetCount() const
+{
+ int count = 0;
+ int size = m_Buffer.GetSize();
+ for (int i = 0; i < size; i ++) {
+ _CompactString* pKey = (_CompactString*)m_Buffer.GetAt(i);
+ if (pKey->m_CompactLen != 0xfe) {
+ count ++;
+ }
+ }
+ return count;
+}
+extern "C" {
+ static int _CompareDWord(const void* p1, const void* p2)
+ {
+ return (*(FX_DWORD*)p1) - (*(FX_DWORD*)p2);
+ }
+};
+struct _DWordPair {
+ FX_DWORD key;
+ FX_DWORD value;
+};
+FX_BOOL CFX_CMapDWordToDWord::Lookup(FX_DWORD key, FX_DWORD& value) const
+{
+ FX_LPVOID pResult = FXSYS_bsearch(&key, m_Buffer.GetBuffer(), m_Buffer.GetSize() / sizeof(_DWordPair),
+ sizeof(_DWordPair), _CompareDWord);
+ if (pResult == NULL) {
+ return FALSE;
+ }
+ value = ((FX_DWORD*)pResult)[1];
+ return TRUE;
+}
+FX_POSITION CFX_CMapDWordToDWord::GetStartPosition() const
+{
+ FX_DWORD count = m_Buffer.GetSize() / sizeof(_DWordPair);
+ if (count == 0) {
+ return NULL;
+ }
+ return (FX_POSITION)1;
+}
+void CFX_CMapDWordToDWord::GetNextAssoc(FX_POSITION& pos, FX_DWORD& key, FX_DWORD& value) const
+{
+ if (pos == 0) {
+ return;
+ }
+ FX_DWORD index = ((FX_DWORD)(FX_UINTPTR)pos) - 1;
+ FX_DWORD count = m_Buffer.GetSize() / sizeof(_DWordPair);
+ _DWordPair* buf = (_DWordPair*)m_Buffer.GetBuffer();
+ key = buf[index].key;
+ value = buf[index].value;
+ if (index == count - 1) {
+ pos = 0;
+ } else {
+ pos = (FX_POSITION)((FX_UINTPTR)pos + 1);
+ }
+}
+void CFX_CMapDWordToDWord::SetAt(FX_DWORD key, FX_DWORD value)
+{
+ FX_DWORD count = m_Buffer.GetSize() / sizeof(_DWordPair);
+ _DWordPair* buf = (_DWordPair*)m_Buffer.GetBuffer();
+ _DWordPair pair = {key, value};
+ if (count == 0 || key > buf[count - 1].key) {
+ m_Buffer.AppendBlock(&pair, sizeof(_DWordPair));
+ return;
+ }
+ int low = 0, high = count - 1;
+ while (low <= high) {
+ int mid = (low + high) / 2;
+ if (buf[mid].key < key) {
+ low = mid + 1;
+ } else if (buf[mid].key > key) {
+ high = mid - 1;
+ } else {
+ buf[mid].value = value;
+ return;
+ }
+ }
+ m_Buffer.InsertBlock(low * sizeof(_DWordPair), &pair, sizeof(_DWordPair));
+}
+void CFX_CMapDWordToDWord::EstimateSize(FX_DWORD size, FX_DWORD grow_by)
+{
+ m_Buffer.EstimateSize(size, grow_by);
+}
diff --git a/core/src/fxcrt/fx_basic_memmgr.cpp b/core/src/fxcrt/fx_basic_memmgr.cpp
index 34df829060..5c862a2db5 100644
--- a/core/src/fxcrt/fx_basic_memmgr.cpp
+++ b/core/src/fxcrt/fx_basic_memmgr.cpp
@@ -1,306 +1,306 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../include/fxcrt/fx_basic.h"
-#include "mem_int.h"
-void FXMEM_DestroyFoxitMgr(FXMEM_FoxitMgr* pFoxitMgr)
-{
- if (pFoxitMgr == NULL) {
- return;
- }
- CFX_MemoryMgr* p = (CFX_MemoryMgr*)pFoxitMgr;
- if (p->m_pSystemMgr->CollectAll) {
- p->m_pSystemMgr->CollectAll(p->m_pSystemMgr);
- }
- if (p->m_bReleaseMgr) {
- p->m_pSystemMgr->Free(p->m_pSystemMgr, p, 0);
- }
- if (p->m_pExternalMemory) {
- free(p->m_pExternalMemory);
- }
-}
-#ifdef __cplusplus
-extern "C" {
-#endif
-static void* _DefAllocDebug(IFX_Allocator* pAllocator, size_t size, FX_LPCSTR filename, int line)
-{
- return ((FX_DefAllocator*)pAllocator)->m_pFoxitMgr->AllocDebug(size, 0, filename, line);
-}
-static void* _DefAlloc(IFX_Allocator* pAllocator, size_t size)
-{
- return ((FX_DefAllocator*)pAllocator)->m_pFoxitMgr->Alloc(size, 0);
-}
-static void* _DefReallocDebug(IFX_Allocator* pAllocator, void* p, size_t size, FX_LPCSTR filename, int line)
-{
- return ((FX_DefAllocator*)pAllocator)->m_pFoxitMgr->ReallocDebug(p, size, 0, filename, line);
-}
-static void* _DefRealloc(IFX_Allocator* pAllocator, void* p, size_t size)
-{
- return ((FX_DefAllocator*)pAllocator)->m_pFoxitMgr->Realloc(p, size, 0);
-}
-static void _DefFree(IFX_Allocator* pAllocator, void* p)
-{
- ((FX_DefAllocator*)pAllocator)->m_pFoxitMgr->Free(p, 0);
-}
-#ifdef __cplusplus
-}
-#endif
-void CFX_MemoryMgr::Init(FXMEM_SystemMgr* pSystemMgr)
-{
- m_pSystemMgr = pSystemMgr;
- IFX_Allocator &ac = m_DefAllocator.m_Allocator;
- ac.m_Alloc = _DefAlloc;
- ac.m_AllocDebug = _DefAllocDebug;
- ac.m_Realloc = _DefRealloc;
- ac.m_ReallocDebug = _DefReallocDebug;
- ac.m_Free = _DefFree;
- m_DefAllocator.m_pFoxitMgr = this;
- m_pExternalMemory = NULL;
- m_bReleaseMgr = TRUE;
-}
-void CFX_MemoryMgr::PurgeMgr()
-{
- if (m_pSystemMgr->Purge) {
- m_pSystemMgr->Purge(m_pSystemMgr);
- }
-}
-void* CFX_MemoryMgr::Alloc(size_t size, int flags)
-{
- void* p = m_pSystemMgr->Alloc(m_pSystemMgr, size, flags);
- if (p == NULL) {
- return NULL;
- }
- return p;
-}
-void* CFX_MemoryMgr::AllocDebug(size_t size, int flags, FX_LPCSTR file, int line)
-{
- void* p = m_pSystemMgr->AllocDebug(m_pSystemMgr, size, flags, file, line);
- if (p == NULL) {
- return NULL;
- }
- return p;
-}
-void* CFX_MemoryMgr::Realloc(void* p, size_t size, int flags)
-{
- void* p1 = m_pSystemMgr->Realloc(m_pSystemMgr, p, size, flags);
- if (p1 == NULL) {
- return NULL;
- }
- return p1;
-}
-void* CFX_MemoryMgr::ReallocDebug(void* p, size_t size, int flags, FX_LPCSTR file, int line)
-{
- void* p1 = m_pSystemMgr->ReallocDebug(m_pSystemMgr, p, size, flags, file, line);
- if (p1 == NULL) {
- return NULL;
- }
- return p1;
-}
-void CFX_MemoryMgr::Free(void* p, int flags)
-{
- if (p == NULL) {
- return;
- }
- m_pSystemMgr->Free(m_pSystemMgr, p, flags);
-}
-CFX_MemoryMgr* g_pDefFoxitMgr = NULL;
-void* FXMEM_DefaultAlloc(size_t size, int flags)
-{
- return g_pDefFoxitMgr->Alloc(size, flags);
-}
-void* FXMEM_DefaultAlloc2(size_t size, size_t unit, int flags)
-{
- return g_pDefFoxitMgr->Alloc(size * unit, flags);
-}
-void* FXMEM_DefaultRealloc(void* p, size_t size, int flags)
-{
- if (p == NULL) {
- return FXMEM_DefaultAlloc(size, flags);
- }
- return g_pDefFoxitMgr->Realloc(p, size, flags);
-}
-void* FXMEM_DefaultRealloc2(void* p, size_t size, size_t unit, int flags)
-{
- if (p == NULL) {
- return FXMEM_DefaultAlloc2(size, unit, flags);
- }
- return g_pDefFoxitMgr->Realloc(p, size * unit, flags);
-}
-void* FXMEM_DefaultAllocDebug(size_t size, int flags, FX_LPCSTR file, int line)
-{
- return g_pDefFoxitMgr->AllocDebug(size, flags, file, line);
-}
-void* FXMEM_DefaultAllocDebug2(size_t size, size_t unit, int flags, FX_LPCSTR file, int line)
-{
- return g_pDefFoxitMgr->AllocDebug(size * unit, flags, file, line);
-}
-void* FXMEM_DefaultReallocDebug(void* p, size_t size, int flags, FX_LPCSTR file, int line)
-{
- if (p == NULL) {
- return FXMEM_DefaultAllocDebug(size, flags, file, line);
- }
- return g_pDefFoxitMgr->ReallocDebug(p, size, flags, file, line);
-}
-void* FXMEM_DefaultReallocDebug2(void* p, size_t size, size_t unit, int flags, FX_LPCSTR file, int line)
-{
- if (p == NULL) {
- return FXMEM_DefaultAllocDebug2(size, unit, flags, file, line);
- }
- return g_pDefFoxitMgr->ReallocDebug(p, size * unit, flags, file, line);
-}
-void FXMEM_DefaultFree(void* p, int flags)
-{
- g_pDefFoxitMgr->Free(p, flags);
-}
-IFX_Allocator* FXMEM_GetDefAllocator()
-{
- return &g_pDefFoxitMgr->m_DefAllocator.m_Allocator;
-}
-void* CFX_Object::operator new(size_t size)
-{
- return g_pDefFoxitMgr->Alloc(size, 0);
-}
-void* CFX_Object::operator new[](size_t size)
-{
- return g_pDefFoxitMgr->Alloc(size, 0);
-}
-void* CFX_Object::operator new[](size_t size, FX_LPCSTR file, int line)
-{
- return g_pDefFoxitMgr->AllocDebug(size, 0, file, line);
-}
-void* CFX_Object::operator new(size_t size, FX_LPCSTR file, int line)
-{
- return g_pDefFoxitMgr->AllocDebug(size, 0, file, line);
-}
-void CFX_Object::operator delete(void* p)
-{
- g_pDefFoxitMgr->Free(p, 0);
-}
-void CFX_Object::operator delete[](void* p)
-{
- g_pDefFoxitMgr->Free(p, 0);
-}
-void CFX_Object::operator delete(void* p, FX_LPCSTR file, int line)
-{
- g_pDefFoxitMgr->Free(p, 0);
-}
-void CFX_Object::operator delete[](void* p, FX_LPCSTR file, int line)
-{
- g_pDefFoxitMgr->Free(p, 0);
-}
-void* CFX_AllocObject::operator new(size_t size, IFX_Allocator* pAllocator, FX_LPCSTR filename, int line)
-{
- void* p = pAllocator ? pAllocator->m_AllocDebug(pAllocator, size, filename, line) :
- g_pDefFoxitMgr->AllocDebug(size, 0, filename, line);
- ((CFX_AllocObject*)p)->m_pAllocator = pAllocator;
- return p;
-}
-void CFX_AllocObject::operator delete (void* p, IFX_Allocator* pAllocator, FX_LPCSTR filename, int line)
-{
- if (pAllocator) {
- pAllocator->m_Free(pAllocator, p);
- } else {
- g_pDefFoxitMgr->Free(p, 0);
- }
-}
-void* CFX_AllocObject::operator new(size_t size, IFX_Allocator* pAllocator)
-{
- void* p = pAllocator ? pAllocator->m_Alloc(pAllocator, size) : g_pDefFoxitMgr->Alloc(size, 0);
- ((CFX_AllocObject*)p)->m_pAllocator = pAllocator;
- return p;
-}
-void CFX_AllocObject::operator delete(void* p)
-{
- if (((CFX_AllocObject*)p)->m_pAllocator) {
- (((CFX_AllocObject*)p)->m_pAllocator)->m_Free(((CFX_AllocObject*)p)->m_pAllocator, p);
- } else {
- g_pDefFoxitMgr->Free(p, 0);
- }
-}
-void CFX_AllocObject::operator delete(void* p, IFX_Allocator* pAllocator)
-{
- if (pAllocator) {
- pAllocator->m_Free(pAllocator, p);
- } else {
- g_pDefFoxitMgr->Free(p, 0);
- }
-}
-extern "C" {
- static void* _GOPAllocDebug(IFX_Allocator* pAllocator, size_t size, FX_LPCSTR file, int line)
- {
- return ((CFX_GrowOnlyPool*)pAllocator)->Alloc(size);
- }
- static void* _GOPAlloc(IFX_Allocator* pAllocator, size_t size)
- {
- return ((CFX_GrowOnlyPool*)pAllocator)->Alloc(size);
- }
- static void* _GOPReallocDebug(IFX_Allocator* pAllocator, void* p, size_t new_size, FX_LPCSTR file, int line)
- {
- return ((CFX_GrowOnlyPool*)pAllocator)->Realloc(p, new_size);
- }
- static void* _GOPRealloc(IFX_Allocator* pAllocator, void* p, size_t new_size)
- {
- return ((CFX_GrowOnlyPool*)pAllocator)->Realloc(p, new_size);
- }
- static void _GOPFree(IFX_Allocator* pAllocator, void* p)
- {
- }
-};
-CFX_GrowOnlyPool::CFX_GrowOnlyPool(IFX_Allocator* pAllocator, size_t trunk_size)
-{
- m_TrunkSize = trunk_size;
- m_pFirstTrunk = NULL;
- m_pAllocator = pAllocator ? pAllocator : &g_pDefFoxitMgr->m_DefAllocator.m_Allocator;
- m_AllocDebug = _GOPAllocDebug;
- m_Alloc = _GOPAlloc;
- m_ReallocDebug = _GOPReallocDebug;
- m_Realloc = _GOPRealloc;
- m_Free = _GOPFree;
-}
-CFX_GrowOnlyPool::~CFX_GrowOnlyPool()
-{
- FreeAll();
-}
-void CFX_GrowOnlyPool::SetAllocator(IFX_Allocator* pAllocator)
-{
- ASSERT(m_pFirstTrunk == NULL);
- m_pAllocator = pAllocator ? pAllocator : &g_pDefFoxitMgr->m_DefAllocator.m_Allocator;
-}
-struct _FX_GrowOnlyTrunk {
- size_t m_Size;
- size_t m_Allocated;
- _FX_GrowOnlyTrunk* m_pNext;
-};
-void CFX_GrowOnlyPool::FreeAll()
-{
- _FX_GrowOnlyTrunk* pTrunk = (_FX_GrowOnlyTrunk*)m_pFirstTrunk;
- while (pTrunk) {
- _FX_GrowOnlyTrunk* pNext = pTrunk->m_pNext;
- m_pAllocator->m_Free(m_pAllocator, pTrunk);
- pTrunk = pNext;
- }
- m_pFirstTrunk = NULL;
-}
-void* CFX_GrowOnlyPool::Alloc(size_t size)
-{
- size = (size + 3) / 4 * 4;
- _FX_GrowOnlyTrunk* pTrunk = (_FX_GrowOnlyTrunk*)m_pFirstTrunk;
- while (pTrunk) {
- if (pTrunk->m_Size - pTrunk->m_Allocated >= size) {
- void* p = (FX_LPBYTE)(pTrunk + 1) + pTrunk->m_Allocated;
- pTrunk->m_Allocated += size;
- return p;
- }
- pTrunk = pTrunk->m_pNext;
- }
- size_t alloc_size = size > m_TrunkSize ? size : m_TrunkSize;
- pTrunk = (_FX_GrowOnlyTrunk*)m_pAllocator->m_Alloc(m_pAllocator, sizeof(_FX_GrowOnlyTrunk) + alloc_size);
- pTrunk->m_Size = alloc_size;
- pTrunk->m_Allocated = size;
- pTrunk->m_pNext = (_FX_GrowOnlyTrunk*)m_pFirstTrunk;
- m_pFirstTrunk = pTrunk;
- return pTrunk + 1;
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fxcrt/fx_basic.h"
+#include "mem_int.h"
+void FXMEM_DestroyFoxitMgr(FXMEM_FoxitMgr* pFoxitMgr)
+{
+ if (pFoxitMgr == NULL) {
+ return;
+ }
+ CFX_MemoryMgr* p = (CFX_MemoryMgr*)pFoxitMgr;
+ if (p->m_pSystemMgr->CollectAll) {
+ p->m_pSystemMgr->CollectAll(p->m_pSystemMgr);
+ }
+ if (p->m_bReleaseMgr) {
+ p->m_pSystemMgr->Free(p->m_pSystemMgr, p, 0);
+ }
+ if (p->m_pExternalMemory) {
+ free(p->m_pExternalMemory);
+ }
+}
+#ifdef __cplusplus
+extern "C" {
+#endif
+static void* _DefAllocDebug(IFX_Allocator* pAllocator, size_t size, FX_LPCSTR filename, int line)
+{
+ return ((FX_DefAllocator*)pAllocator)->m_pFoxitMgr->AllocDebug(size, 0, filename, line);
+}
+static void* _DefAlloc(IFX_Allocator* pAllocator, size_t size)
+{
+ return ((FX_DefAllocator*)pAllocator)->m_pFoxitMgr->Alloc(size, 0);
+}
+static void* _DefReallocDebug(IFX_Allocator* pAllocator, void* p, size_t size, FX_LPCSTR filename, int line)
+{
+ return ((FX_DefAllocator*)pAllocator)->m_pFoxitMgr->ReallocDebug(p, size, 0, filename, line);
+}
+static void* _DefRealloc(IFX_Allocator* pAllocator, void* p, size_t size)
+{
+ return ((FX_DefAllocator*)pAllocator)->m_pFoxitMgr->Realloc(p, size, 0);
+}
+static void _DefFree(IFX_Allocator* pAllocator, void* p)
+{
+ ((FX_DefAllocator*)pAllocator)->m_pFoxitMgr->Free(p, 0);
+}
+#ifdef __cplusplus
+}
+#endif
+void CFX_MemoryMgr::Init(FXMEM_SystemMgr* pSystemMgr)
+{
+ m_pSystemMgr = pSystemMgr;
+ IFX_Allocator &ac = m_DefAllocator.m_Allocator;
+ ac.m_Alloc = _DefAlloc;
+ ac.m_AllocDebug = _DefAllocDebug;
+ ac.m_Realloc = _DefRealloc;
+ ac.m_ReallocDebug = _DefReallocDebug;
+ ac.m_Free = _DefFree;
+ m_DefAllocator.m_pFoxitMgr = this;
+ m_pExternalMemory = NULL;
+ m_bReleaseMgr = TRUE;
+}
+void CFX_MemoryMgr::PurgeMgr()
+{
+ if (m_pSystemMgr->Purge) {
+ m_pSystemMgr->Purge(m_pSystemMgr);
+ }
+}
+void* CFX_MemoryMgr::Alloc(size_t size, int flags)
+{
+ void* p = m_pSystemMgr->Alloc(m_pSystemMgr, size, flags);
+ if (p == NULL) {
+ return NULL;
+ }
+ return p;
+}
+void* CFX_MemoryMgr::AllocDebug(size_t size, int flags, FX_LPCSTR file, int line)
+{
+ void* p = m_pSystemMgr->AllocDebug(m_pSystemMgr, size, flags, file, line);
+ if (p == NULL) {
+ return NULL;
+ }
+ return p;
+}
+void* CFX_MemoryMgr::Realloc(void* p, size_t size, int flags)
+{
+ void* p1 = m_pSystemMgr->Realloc(m_pSystemMgr, p, size, flags);
+ if (p1 == NULL) {
+ return NULL;
+ }
+ return p1;
+}
+void* CFX_MemoryMgr::ReallocDebug(void* p, size_t size, int flags, FX_LPCSTR file, int line)
+{
+ void* p1 = m_pSystemMgr->ReallocDebug(m_pSystemMgr, p, size, flags, file, line);
+ if (p1 == NULL) {
+ return NULL;
+ }
+ return p1;
+}
+void CFX_MemoryMgr::Free(void* p, int flags)
+{
+ if (p == NULL) {
+ return;
+ }
+ m_pSystemMgr->Free(m_pSystemMgr, p, flags);
+}
+CFX_MemoryMgr* g_pDefFoxitMgr = NULL;
+void* FXMEM_DefaultAlloc(size_t size, int flags)
+{
+ return g_pDefFoxitMgr->Alloc(size, flags);
+}
+void* FXMEM_DefaultAlloc2(size_t size, size_t unit, int flags)
+{
+ return g_pDefFoxitMgr->Alloc(size * unit, flags);
+}
+void* FXMEM_DefaultRealloc(void* p, size_t size, int flags)
+{
+ if (p == NULL) {
+ return FXMEM_DefaultAlloc(size, flags);
+ }
+ return g_pDefFoxitMgr->Realloc(p, size, flags);
+}
+void* FXMEM_DefaultRealloc2(void* p, size_t size, size_t unit, int flags)
+{
+ if (p == NULL) {
+ return FXMEM_DefaultAlloc2(size, unit, flags);
+ }
+ return g_pDefFoxitMgr->Realloc(p, size * unit, flags);
+}
+void* FXMEM_DefaultAllocDebug(size_t size, int flags, FX_LPCSTR file, int line)
+{
+ return g_pDefFoxitMgr->AllocDebug(size, flags, file, line);
+}
+void* FXMEM_DefaultAllocDebug2(size_t size, size_t unit, int flags, FX_LPCSTR file, int line)
+{
+ return g_pDefFoxitMgr->AllocDebug(size * unit, flags, file, line);
+}
+void* FXMEM_DefaultReallocDebug(void* p, size_t size, int flags, FX_LPCSTR file, int line)
+{
+ if (p == NULL) {
+ return FXMEM_DefaultAllocDebug(size, flags, file, line);
+ }
+ return g_pDefFoxitMgr->ReallocDebug(p, size, flags, file, line);
+}
+void* FXMEM_DefaultReallocDebug2(void* p, size_t size, size_t unit, int flags, FX_LPCSTR file, int line)
+{
+ if (p == NULL) {
+ return FXMEM_DefaultAllocDebug2(size, unit, flags, file, line);
+ }
+ return g_pDefFoxitMgr->ReallocDebug(p, size * unit, flags, file, line);
+}
+void FXMEM_DefaultFree(void* p, int flags)
+{
+ g_pDefFoxitMgr->Free(p, flags);
+}
+IFX_Allocator* FXMEM_GetDefAllocator()
+{
+ return &g_pDefFoxitMgr->m_DefAllocator.m_Allocator;
+}
+void* CFX_Object::operator new(size_t size)
+{
+ return g_pDefFoxitMgr->Alloc(size, 0);
+}
+void* CFX_Object::operator new[](size_t size)
+{
+ return g_pDefFoxitMgr->Alloc(size, 0);
+}
+void* CFX_Object::operator new[](size_t size, FX_LPCSTR file, int line)
+{
+ return g_pDefFoxitMgr->AllocDebug(size, 0, file, line);
+}
+void* CFX_Object::operator new(size_t size, FX_LPCSTR file, int line)
+{
+ return g_pDefFoxitMgr->AllocDebug(size, 0, file, line);
+}
+void CFX_Object::operator delete(void* p)
+{
+ g_pDefFoxitMgr->Free(p, 0);
+}
+void CFX_Object::operator delete[](void* p)
+{
+ g_pDefFoxitMgr->Free(p, 0);
+}
+void CFX_Object::operator delete(void* p, FX_LPCSTR file, int line)
+{
+ g_pDefFoxitMgr->Free(p, 0);
+}
+void CFX_Object::operator delete[](void* p, FX_LPCSTR file, int line)
+{
+ g_pDefFoxitMgr->Free(p, 0);
+}
+void* CFX_AllocObject::operator new(size_t size, IFX_Allocator* pAllocator, FX_LPCSTR filename, int line)
+{
+ void* p = pAllocator ? pAllocator->m_AllocDebug(pAllocator, size, filename, line) :
+ g_pDefFoxitMgr->AllocDebug(size, 0, filename, line);
+ ((CFX_AllocObject*)p)->m_pAllocator = pAllocator;
+ return p;
+}
+void CFX_AllocObject::operator delete (void* p, IFX_Allocator* pAllocator, FX_LPCSTR filename, int line)
+{
+ if (pAllocator) {
+ pAllocator->m_Free(pAllocator, p);
+ } else {
+ g_pDefFoxitMgr->Free(p, 0);
+ }
+}
+void* CFX_AllocObject::operator new(size_t size, IFX_Allocator* pAllocator)
+{
+ void* p = pAllocator ? pAllocator->m_Alloc(pAllocator, size) : g_pDefFoxitMgr->Alloc(size, 0);
+ ((CFX_AllocObject*)p)->m_pAllocator = pAllocator;
+ return p;
+}
+void CFX_AllocObject::operator delete(void* p)
+{
+ if (((CFX_AllocObject*)p)->m_pAllocator) {
+ (((CFX_AllocObject*)p)->m_pAllocator)->m_Free(((CFX_AllocObject*)p)->m_pAllocator, p);
+ } else {
+ g_pDefFoxitMgr->Free(p, 0);
+ }
+}
+void CFX_AllocObject::operator delete(void* p, IFX_Allocator* pAllocator)
+{
+ if (pAllocator) {
+ pAllocator->m_Free(pAllocator, p);
+ } else {
+ g_pDefFoxitMgr->Free(p, 0);
+ }
+}
+extern "C" {
+ static void* _GOPAllocDebug(IFX_Allocator* pAllocator, size_t size, FX_LPCSTR file, int line)
+ {
+ return ((CFX_GrowOnlyPool*)pAllocator)->Alloc(size);
+ }
+ static void* _GOPAlloc(IFX_Allocator* pAllocator, size_t size)
+ {
+ return ((CFX_GrowOnlyPool*)pAllocator)->Alloc(size);
+ }
+ static void* _GOPReallocDebug(IFX_Allocator* pAllocator, void* p, size_t new_size, FX_LPCSTR file, int line)
+ {
+ return ((CFX_GrowOnlyPool*)pAllocator)->Realloc(p, new_size);
+ }
+ static void* _GOPRealloc(IFX_Allocator* pAllocator, void* p, size_t new_size)
+ {
+ return ((CFX_GrowOnlyPool*)pAllocator)->Realloc(p, new_size);
+ }
+ static void _GOPFree(IFX_Allocator* pAllocator, void* p)
+ {
+ }
+};
+CFX_GrowOnlyPool::CFX_GrowOnlyPool(IFX_Allocator* pAllocator, size_t trunk_size)
+{
+ m_TrunkSize = trunk_size;
+ m_pFirstTrunk = NULL;
+ m_pAllocator = pAllocator ? pAllocator : &g_pDefFoxitMgr->m_DefAllocator.m_Allocator;
+ m_AllocDebug = _GOPAllocDebug;
+ m_Alloc = _GOPAlloc;
+ m_ReallocDebug = _GOPReallocDebug;
+ m_Realloc = _GOPRealloc;
+ m_Free = _GOPFree;
+}
+CFX_GrowOnlyPool::~CFX_GrowOnlyPool()
+{
+ FreeAll();
+}
+void CFX_GrowOnlyPool::SetAllocator(IFX_Allocator* pAllocator)
+{
+ ASSERT(m_pFirstTrunk == NULL);
+ m_pAllocator = pAllocator ? pAllocator : &g_pDefFoxitMgr->m_DefAllocator.m_Allocator;
+}
+struct _FX_GrowOnlyTrunk {
+ size_t m_Size;
+ size_t m_Allocated;
+ _FX_GrowOnlyTrunk* m_pNext;
+};
+void CFX_GrowOnlyPool::FreeAll()
+{
+ _FX_GrowOnlyTrunk* pTrunk = (_FX_GrowOnlyTrunk*)m_pFirstTrunk;
+ while (pTrunk) {
+ _FX_GrowOnlyTrunk* pNext = pTrunk->m_pNext;
+ m_pAllocator->m_Free(m_pAllocator, pTrunk);
+ pTrunk = pNext;
+ }
+ m_pFirstTrunk = NULL;
+}
+void* CFX_GrowOnlyPool::Alloc(size_t size)
+{
+ size = (size + 3) / 4 * 4;
+ _FX_GrowOnlyTrunk* pTrunk = (_FX_GrowOnlyTrunk*)m_pFirstTrunk;
+ while (pTrunk) {
+ if (pTrunk->m_Size - pTrunk->m_Allocated >= size) {
+ void* p = (FX_LPBYTE)(pTrunk + 1) + pTrunk->m_Allocated;
+ pTrunk->m_Allocated += size;
+ return p;
+ }
+ pTrunk = pTrunk->m_pNext;
+ }
+ size_t alloc_size = size > m_TrunkSize ? size : m_TrunkSize;
+ pTrunk = (_FX_GrowOnlyTrunk*)m_pAllocator->m_Alloc(m_pAllocator, sizeof(_FX_GrowOnlyTrunk) + alloc_size);
+ pTrunk->m_Size = alloc_size;
+ pTrunk->m_Allocated = size;
+ pTrunk->m_pNext = (_FX_GrowOnlyTrunk*)m_pFirstTrunk;
+ m_pFirstTrunk = pTrunk;
+ return pTrunk + 1;
+}
diff --git a/core/src/fxcrt/fx_basic_memmgr_mini.cpp b/core/src/fxcrt/fx_basic_memmgr_mini.cpp
index f8385e20d2..8d48bab935 100644
--- a/core/src/fxcrt/fx_basic_memmgr_mini.cpp
+++ b/core/src/fxcrt/fx_basic_memmgr_mini.cpp
@@ -1,822 +1,822 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../include/fxcrt/fx_ext.h"
-#include "mem_int.h"
-#ifdef _FPDFAPI_MINI_
-static FX_MEMCONFIG g_MemConfig = {
- 1,
- 5,
- 8,
- 4,
- 12,
- 8,
- 2,
- 4,
- 32,
- 64,
-};
-#else
-static FX_MEMCONFIG g_MemConfig = {
- 1,
- 8,
- 24,
- 8,
- 32,
- 16,
- 4,
- 8,
- 128,
- 64,
-};
-#endif
-void FXMEM_SetConfig(const FX_MEMCONFIG* memConfig)
-{
- g_MemConfig = *memConfig;
-}
-#ifdef __cplusplus
-extern "C" {
-#endif
-static void* FixedAlloc(FXMEM_SystemMgr* pMgr, size_t size, int flags)
-{
- return ((CFXMEM_FixedMgr*)pMgr->user)->Alloc(size);
-}
-static void* FixedAllocDebug(FXMEM_SystemMgr* pMgr, size_t size, int flags, FX_LPCSTR file, int line)
-{
- return ((CFXMEM_FixedMgr*)pMgr->user)->Alloc(size);
-}
-static void* FixedRealloc(FXMEM_SystemMgr* pMgr, void* pointer, size_t size, int flags)
-{
- return ((CFXMEM_FixedMgr*)pMgr->user)->Realloc(pointer, size);
-}
-static void* FixedReallocDebug(FXMEM_SystemMgr* pMgr, void* pointer, size_t size, int flags, FX_LPCSTR file, int line)
-{
- return ((CFXMEM_FixedMgr*)pMgr->user)->Realloc(pointer, size);
-}
-static void FixedFree(FXMEM_SystemMgr* pMgr, void* pointer, int flags)
-{
- ((CFXMEM_FixedMgr*)pMgr->user)->Free(pointer);
-}
-static void FixedPurge(FXMEM_SystemMgr* pMgr)
-{
- ((CFXMEM_FixedMgr*)pMgr->user)->Purge();
-}
-static void FixedCollectAll(FXMEM_SystemMgr* pMgr)
-{
- ((CFXMEM_FixedMgr*)pMgr->user)->FreeAll();
-}
-#define FIXEDMEM_MINIMUMSIZE (1024 * 1024 * 8)
-FXMEM_FoxitMgr* FXMEM_CreateMemoryMgr(size_t size, FX_BOOL extensible)
-{
- if (size < FIXEDMEM_MINIMUMSIZE) {
- size = FIXEDMEM_MINIMUMSIZE;
- }
- FX_LPVOID pMemory = malloc(size);
- if (!pMemory) {
- return NULL;
- }
- CFixedMgr_Proxy* pProxy = (CFixedMgr_Proxy*)pMemory;
- size_t offsetSize = (sizeof(CFixedMgr_Proxy) + 15) / 16 * 16;
- FXMEM_FoxitMgr* pFoxitMgr = pProxy->Initialize((FX_LPBYTE)pProxy + offsetSize, size - offsetSize, extensible);
- if (!pFoxitMgr) {
- free(pMemory);
- return NULL;
- }
- g_pDefFoxitMgr = (CFX_MemoryMgr*)pFoxitMgr;
- g_pDefFoxitMgr->m_pExternalMemory = pMemory;
- return pFoxitMgr;
-}
-FXMEM_FoxitMgr* FXMEM_CreateFixedMgr(void* pMemory, size_t size, FXMEM_SystemMgr2* pSystemMgr)
-{
- if (pMemory == NULL || size < FX_FIXEDMEM_PAGESIZE) {
- return NULL;
- }
- if (!pSystemMgr && size >= FIXEDMEM_PROXYSIZE_1) {
- CFixedMgr_Proxy* pProxy = (CFixedMgr_Proxy*)pMemory;
- size_t offsetSize = (sizeof(CFixedMgr_Proxy) + 15) / 16 * 16;
- return pProxy->Initialize((FX_LPBYTE)pProxy + offsetSize, size - offsetSize, FALSE);
- }
- CFXMEM_FixedMgr* pHeader = (CFXMEM_FixedMgr*)pMemory;
- pHeader->Initialize(size);
- pHeader->m_pExtender = pSystemMgr;
- CFX_MemoryMgr* p = (CFX_MemoryMgr*)pHeader->Alloc(sizeof(CFX_MemoryMgr));
- if (p == NULL) {
- return NULL;
- }
- p->Init(&pHeader->m_SystemMgr);
- return (FXMEM_FoxitMgr*)p;
-}
-size_t FXMEM_GetBlockSizeInFixedMgr(FXMEM_FoxitMgr* pFoxitMgr, void* ptr)
-{
- return pFoxitMgr ? ((CFXMEM_FixedMgr*)((CFX_MemoryMgr*)pFoxitMgr)->m_pSystemMgr->user)->GetSize(ptr) : 0;
-}
-#ifdef __cplusplus
-}
-#endif
-const FX_MEMCONFIG g_ProxyMgr_MemConfigs[6] = {
- {1, 2, 4, 0, 2, 2, 2, 0, 0, 0},
- {1, 4, 8, 0, 2, 2, 2, 0, 0, 0},
- {1, 4, 16, 4, 8, 8, 2, 1, 16, 16},
- {1, 8, 24, 4, 12, 12, 4, 2, 32, 16},
- {1, 8, 24, 8, 16, 16, 4, 2, 64, 32},
- {1, 8, 24, 8, 24, 32, 4, 2, 128, 64},
-};
-const FX_MEMCONFIG* FixedMgr_GetConfig(size_t nSize)
-{
- int index = 5;
- if (nSize <= FIXEDMEM_PROXYSIZE_0) {
- index = 0;
- } else if (nSize <= FIXEDMEM_PROXYSIZE_1) {
- index = 1;
- } else if (nSize <= FIXEDMEM_PROXYSIZE_2) {
- index = 2;
- } else if (nSize <= FIXEDMEM_PROXYSIZE_3) {
- index = 3;
- } else if (nSize <= FIXEDMEM_PROXYSIZE_4) {
- index = 4;
- }
- return &g_ProxyMgr_MemConfigs[index];
-}
-FXMEM_FoxitMgr* CFixedMgr_Proxy::Initialize(FX_LPVOID pBuffer, size_t nSize, FX_BOOL bExtensible)
-{
- FXSYS_assert(pBuffer != NULL && nSize >= FIXEDMEM_PROXYSIZE_1 - sizeof(CFixedMgr_Proxy));
- FXMEM_SetConfig(FixedMgr_GetConfig(nSize));
- m_SystemMgr.More = &CFixedMgr_Proxy::Common_More;
- m_SystemMgr.Free = &CFixedMgr_Proxy::Common_Free;
- m_pFixedPage = (CFXMEM_Page*)((FX_LPBYTE)pBuffer + FIXEDMEM_PROXYSIZE_0);
- m_pFixedPage->Initialize(nSize - FIXEDMEM_PROXYSIZE_0);
- m_pBuffer = pBuffer;
- m_nSize = nSize;
- m_bExtensible = bExtensible;
- return FXMEM_CreateFixedMgr(pBuffer, FIXEDMEM_PROXYSIZE_0, &m_SystemMgr);
-}
-FX_BOOL CFixedMgr_Proxy::Common_More(FXMEM_SystemMgr2* pMgr, size_t alloc_size, void** new_memory, size_t* new_size)
-{
- CFixedMgr_Proxy* pProxyMgr = (CFixedMgr_Proxy*)pMgr;
- FXSYS_assert(pProxyMgr != NULL && pProxyMgr->m_pFixedPage != NULL);
- *new_size = alloc_size;
- *new_memory = pProxyMgr->m_pFixedPage->Alloc(alloc_size);
- if (*new_memory == NULL && pProxyMgr->m_bExtensible) {
- *new_memory = malloc(alloc_size);
- }
- return *new_memory != NULL;
-}
-void CFixedMgr_Proxy::Common_Free(FXMEM_SystemMgr2* pMgr, void* memory)
-{
- CFixedMgr_Proxy* pProxyMgr = (CFixedMgr_Proxy*)pMgr;
- FXSYS_assert(pProxyMgr != NULL && pProxyMgr->m_pFixedPage != NULL);
- if (memory > pProxyMgr->m_pBuffer && memory < (FX_LPBYTE)pProxyMgr->m_pBuffer + pProxyMgr->m_nSize) {
- pProxyMgr->m_pFixedPage->Free(memory);
- } else if (pProxyMgr->m_bExtensible) {
- free(memory);
- }
-}
-void CFXMEM_Page::Initialize(size_t size)
-{
- CFXMEM_Block *pFirstBlock = (CFXMEM_Block*)(this + 1);
- m_nAvailSize = size - sizeof(CFXMEM_Page) - sizeof(CFXMEM_Block);
- pFirstBlock->m_nBlockSize = m_nAvailSize;
- pFirstBlock->m_pNextBlock = NULL;
- m_AvailHead.m_nBlockSize = m_nAvailSize;
- m_AvailHead.m_pNextBlock = pFirstBlock;
- m_pLimitPos = (CFXMEM_Block*)((FX_LPBYTE)this + size);
-}
-FX_LPVOID CFXMEM_Page::Alloc(CFXMEM_Block* pPrevBlock, CFXMEM_Block* pNextBlock, size_t size, size_t oldsize)
-{
- size_t gap = pNextBlock->m_nBlockSize - size;
- if (gap <= 64 + sizeof(CFXMEM_Block)) {
- pPrevBlock->m_pNextBlock = pNextBlock->m_pNextBlock;
- m_nAvailSize -= pNextBlock->m_nBlockSize;
- } else {
- m_nAvailSize -= size + sizeof(CFXMEM_Block);
- pNextBlock->m_nBlockSize = size;
- CFXMEM_Block *pNewBlock = (CFXMEM_Block*)((FX_LPBYTE)(pNextBlock + 1) + size);
- pNewBlock->m_nBlockSize = gap - sizeof(CFXMEM_Block);
- pNewBlock->m_pNextBlock = pNextBlock->m_pNextBlock;
- pPrevBlock->m_pNextBlock = pNewBlock;
- }
- return (FX_LPVOID)(pNextBlock + 1);
-}
-FX_LPVOID CFXMEM_Page::Alloc(size_t size)
-{
- size_t oldsize = size;
-#if _FX_WORDSIZE_ == _FX_W64_
- size = (size + 31) / 32 * 32;
-#else
- size = (size + 7) / 8 * 8;
-#endif
- if (m_nAvailSize < size) {
- return NULL;
- }
- CFXMEM_Block *pNextBlock;
- CFXMEM_Block *pPrevBlock = &m_AvailHead;
- while (TRUE) {
- pNextBlock = pPrevBlock->m_pNextBlock;
- if (!pNextBlock) {
- return NULL;
- }
- if (pNextBlock->m_nBlockSize >= size) {
- break;
- }
- pPrevBlock = pNextBlock;
- }
- return Alloc(pPrevBlock, pNextBlock, size, oldsize);
-}
-FX_LPVOID CFXMEM_Page::Realloc(FX_LPVOID p, size_t oldSize, size_t newSize)
-{
- FXSYS_assert(p > (FX_LPVOID)this && p < (FX_LPVOID)m_pLimitPos);
- size_t oldnewSize = newSize;
-#if _FX_WORDSIZE_ == _FX_W64_
- newSize = (newSize + 31) / 32 * 32;
-#else
- newSize = (newSize + 7) / 8 * 8;
-#endif
- CFXMEM_Block *pPrevBlock = &m_AvailHead;
- CFXMEM_Block *pNextBlock, *pPrevPrev;
- CFXMEM_Block *pBlock = (CFXMEM_Block*)p - 1;
- pPrevPrev = NULL;
- while (TRUE) {
- pNextBlock = pPrevBlock->m_pNextBlock;
- if (pNextBlock == NULL || pNextBlock > pBlock) {
- break;
- }
- if (pPrevBlock != &m_AvailHead && (FX_LPBYTE)pNextBlock == (FX_LPBYTE)(pPrevBlock + 1) + pPrevBlock->m_nBlockSize) {
- m_nAvailSize += sizeof(CFXMEM_Block);
- pPrevBlock->m_nBlockSize += pNextBlock->m_nBlockSize + sizeof(CFXMEM_Block);
- pPrevBlock->m_pNextBlock = pNextBlock->m_pNextBlock;
- } else {
- pPrevPrev = pPrevBlock;
- pPrevBlock = pNextBlock;
- }
- }
- if (pNextBlock) {
- CFXMEM_Block* pCurBlock = pNextBlock->m_pNextBlock;
- while ((FX_LPBYTE)pCurBlock == (FX_LPBYTE)(pNextBlock + 1) + pNextBlock->m_nBlockSize) {
- m_nAvailSize += sizeof(CFXMEM_Block);
- pNextBlock->m_nBlockSize += pCurBlock->m_nBlockSize + sizeof(CFXMEM_Block);
- pCurBlock = pCurBlock->m_pNextBlock;
- pNextBlock->m_pNextBlock = pCurBlock;
- }
- }
- size_t size = 0;
- FX_DWORD dwFlags = 0;
- if (pPrevBlock != &m_AvailHead && (FX_LPBYTE)pBlock == (FX_LPBYTE)(pPrevBlock + 1) + pPrevBlock->m_nBlockSize) {
- size += pPrevBlock->m_nBlockSize + oldSize + sizeof(CFXMEM_Block);
- dwFlags |= 0x10;
- }
- if (pNextBlock && (FX_LPBYTE)pNextBlock == (FX_LPBYTE)p + oldSize) {
- size += pNextBlock->m_nBlockSize + sizeof(CFXMEM_Block);
- dwFlags |= 0x01;
- }
- if (size >= newSize) {
- m_nAvailSize += pBlock->m_nBlockSize;
- CFXMEM_Block* pCurBlock = pBlock;
- if (dwFlags & 0x10) {
- pCurBlock = pPrevBlock;
- m_nAvailSize += sizeof(CFXMEM_Block);
- pCurBlock->m_nBlockSize += pBlock->m_nBlockSize + sizeof(CFXMEM_Block);
- pPrevBlock = pPrevPrev;
- }
- if (dwFlags & 0x01) {
- m_nAvailSize += sizeof(CFXMEM_Block);
- pCurBlock->m_nBlockSize += pNextBlock->m_nBlockSize + sizeof(CFXMEM_Block);
- pCurBlock->m_pNextBlock = pNextBlock->m_pNextBlock;
- }
- if (pCurBlock != pBlock) {
- FXSYS_memmove32((FX_LPVOID)(pCurBlock + 1), p, oldSize);
- }
- return Alloc(pPrevBlock, pCurBlock, newSize, oldnewSize);
- }
- return NULL;
-}
-void CFXMEM_Page::Free(FX_LPVOID p)
-{
- FXSYS_assert(p > (FX_LPVOID)this && p < (FX_LPVOID)m_pLimitPos);
- CFXMEM_Block *pPrevBlock = &m_AvailHead;
- CFXMEM_Block *pNextBlock;
- CFXMEM_Block *pBlock = (CFXMEM_Block*)p - 1;
- m_nAvailSize += pBlock->m_nBlockSize;
- while (TRUE) {
- pNextBlock = pPrevBlock->m_pNextBlock;
- if (pNextBlock == NULL || pNextBlock > pBlock) {
- break;
- }
- if (pPrevBlock != &m_AvailHead && (FX_LPBYTE)pNextBlock == (FX_LPBYTE)(pPrevBlock + 1) + pPrevBlock->m_nBlockSize) {
- m_nAvailSize += sizeof(CFXMEM_Block);
- pPrevBlock->m_nBlockSize += pNextBlock->m_nBlockSize + sizeof(CFXMEM_Block);
- pPrevBlock->m_pNextBlock = pNextBlock->m_pNextBlock;
- } else {
- pPrevBlock = pNextBlock;
- }
- }
- while ((FX_LPBYTE)pNextBlock == (FX_LPBYTE)(pBlock + 1) + pBlock->m_nBlockSize) {
- m_nAvailSize += sizeof(CFXMEM_Block);
- pBlock->m_nBlockSize += pNextBlock->m_nBlockSize + sizeof(CFXMEM_Block);
- pNextBlock = pNextBlock->m_pNextBlock;
- }
- pBlock->m_pNextBlock = pNextBlock;
- if (pPrevBlock != &m_AvailHead && (FX_LPBYTE)pBlock == (FX_LPBYTE)(pPrevBlock + 1) + pPrevBlock->m_nBlockSize) {
- m_nAvailSize += sizeof(CFXMEM_Block);
- pPrevBlock->m_nBlockSize += pBlock->m_nBlockSize + sizeof(CFXMEM_Block);
- pPrevBlock->m_pNextBlock = pBlock->m_pNextBlock;
- } else {
- FXSYS_assert(pPrevBlock != pBlock);
- pPrevBlock->m_pNextBlock = pBlock;
- }
-}
-void CFXMEM_Pages::Initialize(FX_LPBYTE pStart, size_t pageSize, size_t pages)
-{
- m_pStartPage = m_pCurPage = (CFXMEM_Page*)pStart;
- m_nPageSize = pageSize;
- for (size_t n = 0; n < pages; n++) {
- ((CFXMEM_Page*)pStart)->Initialize(pageSize);
- pStart += pageSize;
- }
- m_pLimitPos = (CFXMEM_Page*)pStart;
-}
-FX_BOOL CFXMEM_Pages::IsEmpty() const
-{
- if (m_pStartPage >= m_pLimitPos) {
- return TRUE;
- }
- FX_LPBYTE pPage = (FX_LPBYTE)m_pStartPage;
- while (pPage < (FX_LPBYTE)m_pLimitPos) {
- if (!((CFXMEM_Page*)pPage)->IsEmpty()) {
- return FALSE;
- }
- pPage += m_nPageSize;
- }
- return TRUE;
-}
-FX_LPVOID CFXMEM_Pages::Alloc(size_t size)
-{
- CFXMEM_Page *pCurPage = m_pCurPage;
- do {
- FX_LPVOID p = m_pCurPage->Alloc(size);
- if (p) {
- return p;
- }
- m_pCurPage = (CFXMEM_Page*)((FX_LPBYTE)m_pCurPage + m_nPageSize);
- if (m_pCurPage == m_pLimitPos) {
- m_pCurPage = m_pStartPage;
- }
- } while (m_pCurPage != pCurPage);
- return NULL;
-}
-FX_LPVOID CFXMEM_Pages::Realloc(FX_LPVOID p, size_t oldSize, size_t newSize)
-{
- FXSYS_assert (p > (FX_LPVOID)m_pStartPage && p < (FX_LPVOID)m_pLimitPos);
- CFXMEM_Page* pPage = (CFXMEM_Page*)((FX_LPBYTE)m_pStartPage + ((FX_LPBYTE)p - (FX_LPBYTE)m_pStartPage) / m_nPageSize * m_nPageSize);
- return pPage->Realloc(p, oldSize, newSize);
-}
-void CFXMEM_Pages::Free(FX_LPVOID p)
-{
- FXSYS_assert (p > (FX_LPVOID)m_pStartPage && p < (FX_LPVOID)m_pLimitPos);
- CFXMEM_Page* pPage = (CFXMEM_Page*)((FX_LPBYTE)m_pStartPage + ((FX_LPBYTE)p - (FX_LPBYTE)m_pStartPage) / m_nPageSize * m_nPageSize);
- pPage->Free(p);
-}
-void CFXMEM_Pool::Initialize(const FX_MEMCONFIG* pMemConfig, size_t size, size_t pageNum8Bytes, size_t pageNum16Bytes, size_t pageNum32Bytes, size_t pageNumMid)
-{
- m_pPrevPool = NULL;
- m_pNextPool = NULL;
- m_bAlone = FALSE;
- FX_LPBYTE pPage = (FX_LPBYTE)this + sizeof(CFXMEM_Pool);
- size -= sizeof(CFXMEM_Pool);
- m_8BytesPages.Initialize(pPage, pageNum8Bytes);
- pPage += pageNum8Bytes * FX_FIXEDMEM_PAGESIZE;
- size -= pageNum8Bytes * FX_FIXEDMEM_PAGESIZE;
- m_16BytesPages.Initialize(pPage, pageNum16Bytes);
- pPage += pageNum16Bytes * FX_FIXEDMEM_PAGESIZE;
- size -= pageNum16Bytes * FX_FIXEDMEM_PAGESIZE;
- m_32BytesPages.Initialize(pPage, pageNum32Bytes);
- pPage += pageNum32Bytes * FX_FIXEDMEM_PAGESIZE;
- size -= pageNum32Bytes * FX_FIXEDMEM_PAGESIZE;
- m_MidPages.Initialize(pPage, pMemConfig->nPageSize_Mid * FX_FIXEDMEM_PAGESIZE, pageNumMid);
- pPage += pageNumMid * pMemConfig->nPageSize_Mid * FX_FIXEDMEM_PAGESIZE;
- size -= pageNumMid * pMemConfig->nPageSize_Mid * FX_FIXEDMEM_PAGESIZE;
- if (size < FX_FIXEDMEM_MIDBLOCKSIZE) {
- m_pLargePage = NULL;
- } else {
- m_pLargePage = (CFXMEM_Page*)pPage;
- m_pLargePage->Initialize(size);
- }
- m_pLimitPos = pPage + size;
-}
-FX_BOOL CFXMEM_Pool::IsEmpty() const
-{
- if (!m_8BytesPages.IsEmpty()) {
- return FALSE;
- }
- if (!m_16BytesPages.IsEmpty()) {
- return FALSE;
- }
- if (!m_32BytesPages.IsEmpty()) {
- return FALSE;
- }
- if (!m_MidPages.IsEmpty()) {
- return FALSE;
- }
- return !m_pLargePage || m_pLargePage->IsEmpty();
-}
-size_t CFXMEM_Pool::GetSize(FX_LPVOID p) const
-{
- FXSYS_assert(p > (FX_LPVOID)this && p < (FX_LPVOID)m_pLimitPos);
- if (p < (FX_LPVOID)m_8BytesPages.m_pLimitPos) {
- return 8;
- }
- if (p < (FX_LPVOID)m_16BytesPages.m_pLimitPos) {
- return 16;
- }
- if (p < (FX_LPVOID)m_32BytesPages.m_pLimitPos) {
- return 32;
- }
- return ((CFXMEM_Block*)p - 1)->m_nBlockSize;
-}
-FX_LPVOID CFXMEM_Pool::Realloc(FX_LPVOID p, size_t oldSize, size_t newSize)
-{
- FXSYS_assert(p > (FX_LPVOID)this && p < (FX_LPVOID)m_pLimitPos);
- if (p > (FX_LPVOID)m_32BytesPages.m_pLimitPos) {
- if (p < (FX_LPVOID)m_MidPages.m_pLimitPos) {
- return m_MidPages.Realloc(p, oldSize, newSize);
- } else if (m_pLargePage) {
- return m_pLargePage->Realloc(p, oldSize, newSize);
- }
- }
- return NULL;
-}
-void CFXMEM_Pool::Free(FX_LPVOID p)
-{
- FXSYS_assert(p > (FX_LPVOID)this && p < (FX_LPVOID)m_pLimitPos);
- if (p < (FX_LPVOID)m_32BytesPages.m_pLimitPos) {
- if (p < (FX_LPVOID)m_8BytesPages.m_pLimitPos) {
- m_8BytesPages.Free(p);
- } else if (p < (FX_LPVOID)m_16BytesPages.m_pLimitPos) {
- m_16BytesPages.Free(p);
- } else {
- m_32BytesPages.Free(p);
- }
- return;
- } else if (p < (FX_LPVOID)m_MidPages.m_pLimitPos) {
- m_MidPages.Free(p);
- } else {
- m_pLargePage->Free(p);
- }
-}
-void CFXMEM_FixedMgr::Initialize(size_t size)
-{
- m_MemConfig = g_MemConfig;
- FXSYS_memset32(&m_SystemMgr, 0, sizeof m_SystemMgr);
- m_SystemMgr.Alloc = FixedAlloc;
- m_SystemMgr.AllocDebug = FixedAllocDebug;
- m_SystemMgr.Free = FixedFree;
- m_SystemMgr.Realloc = FixedRealloc;
- m_SystemMgr.ReallocDebug = FixedReallocDebug;
- m_SystemMgr.CollectAll = FixedCollectAll;
- m_SystemMgr.Purge = FixedPurge;
- m_SystemMgr.user = this;
- size -= sizeof(CFXMEM_FixedMgr);
- size_t nMidPages = 0;
- if (m_MemConfig.nPageSize_Mid) {
- nMidPages = (size - (m_MemConfig.nPageNum_Init8 + m_MemConfig.nPageNum_Init16 + m_MemConfig.nPageNum_Init32) * FX_FIXEDMEM_PAGESIZE) / (m_MemConfig.nPageSize_Mid * FX_FIXEDMEM_PAGESIZE);
- if (nMidPages > m_MemConfig.nPageNum_InitMid) {
- nMidPages = m_MemConfig.nPageNum_InitMid;
- }
- }
- m_FirstPool.Initialize(&m_MemConfig, size, m_MemConfig.nPageNum_Init8, m_MemConfig.nPageNum_Init16, m_MemConfig.nPageNum_Init32, nMidPages);
-}
-FX_LPVOID CFXMEM_FixedMgr::Alloc16(CFXMEM_Pool **pp32Pool, size_t size)
-{
- CFXMEM_Pool *pPool = &m_FirstPool;
- do {
- CFXMEM_16BytesPages &pages = pPool->m_16BytesPages;
- if (pages.HasFreeBlock()) {
- return pages.Alloc(size);
- }
- if (pp32Pool && pPool->m_32BytesPages.HasFreeBlock()) {
- *pp32Pool = pPool;
- }
- pPool = pPool->m_pNextPool;
- } while(pPool);
- return NULL;
-}
-FX_LPVOID CFXMEM_FixedMgr::Alloc32(size_t size)
-{
- if (size <= 8) {
- CFXMEM_8BytesPages &pages = m_FirstPool.m_8BytesPages;
- if (pages.HasFreeBlock()) {
- return pages.Alloc(size);
- }
- }
- CFXMEM_Pool *p32BytesPool;
- if (size <= 16) {
- p32BytesPool = NULL;
- FX_LPVOID p = Alloc16(&p32BytesPool, size);
- if (p) {
- return p;
- }
- } else {
- p32BytesPool = &m_FirstPool;
- }
- while (p32BytesPool) {
- CFXMEM_32BytesPages &pages = p32BytesPool->m_32BytesPages;
- if (pages.HasFreeBlock()) {
- return pages.Alloc(size);
- }
- p32BytesPool = p32BytesPool->m_pNextPool;
- }
- return NULL;
-}
-FX_LPVOID CFXMEM_FixedMgr::AllocSmall(size_t size)
-{
- FX_LPVOID p = Alloc32(size);
- if (p) {
- return p;
- }
- if (!m_pExtender) {
- return NULL;
- }
- size_t requiredSize = (m_MemConfig.nPageNum_More16 + m_MemConfig.nPageNum_More32) * FX_FIXEDMEM_PAGESIZE;
- if (!requiredSize) {
- return NULL;
- }
- CFXMEM_Pool *pNewPool = NULL;
- requiredSize += sizeof(CFXMEM_Pool);
- size_t newSize = requiredSize;
- if (!m_pExtender->More(m_pExtender, newSize, (void**)&pNewPool, &newSize)) {
- return NULL;
- }
- size_t nMidPages = 0;
- if (m_MemConfig.nPageSize_Mid) {
- nMidPages = (newSize - requiredSize) / (m_MemConfig.nPageSize_Mid * FX_FIXEDMEM_PAGESIZE);
- if (nMidPages > m_MemConfig.nPageNum_MoreMid) {
- nMidPages = m_MemConfig.nPageNum_MoreMid;
- }
- }
- pNewPool->Initialize(&m_MemConfig, newSize, 0, m_MemConfig.nPageNum_More16, m_MemConfig.nPageNum_More32, nMidPages);
- pNewPool->m_pPrevPool = &m_FirstPool;
- CFXMEM_Pool *pPool = m_FirstPool.m_pNextPool;
- pNewPool->m_pNextPool = pPool;
- if (pPool) {
- pPool->m_pPrevPool = pNewPool;
- }
- m_FirstPool.m_pNextPool = pNewPool;
- return Alloc32(size);
-}
-FX_LPVOID CFXMEM_FixedMgr::AllocMid(size_t size)
-{
- CFXMEM_Pool *pPool = &m_FirstPool;
- do {
- CFXMEM_Pages &pages = pPool->m_MidPages;
- if (pages.m_pLimitPos > pages.m_pStartPage) {
- FX_LPVOID p = pages.Alloc(size);
- if (p) {
- return p;
- }
- }
- pPool = pPool->m_pNextPool;
- } while(pPool);
- if (!m_pExtender) {
- return NULL;
- }
- size_t newSize = m_MemConfig.nPageSize_Mid * FX_FIXEDMEM_PAGESIZE * m_MemConfig.nPageNum_MoreMid;
- if (!newSize) {
- return NULL;
- }
- CFXMEM_Pool *pNewPool = NULL;
- newSize += sizeof(CFXMEM_Pool);
- if (!m_pExtender->More(m_pExtender, newSize, (void**)&pNewPool, &newSize)) {
- return NULL;
- }
- size_t nMidPages = (newSize - sizeof(CFXMEM_Pool)) / (m_MemConfig.nPageSize_Mid * FX_FIXEDMEM_PAGESIZE);
- if (nMidPages > m_MemConfig.nPageNum_MoreMid) {
- nMidPages = m_MemConfig.nPageNum_MoreMid;
- }
- pNewPool->Initialize(&m_MemConfig, newSize, 0, 0, 0, nMidPages);
- pNewPool->m_pPrevPool = &m_FirstPool;
- pPool = m_FirstPool.m_pNextPool;
- pNewPool->m_pNextPool = pPool;
- if (pPool) {
- pPool->m_pPrevPool = pNewPool;
- }
- m_FirstPool.m_pNextPool = pNewPool;
- return pNewPool->m_MidPages.Alloc(size);
-}
-FX_LPVOID CFXMEM_FixedMgr::AllocLarge(size_t size)
-{
- CFXMEM_Pool *pPool = &m_FirstPool;
- do {
- if (!pPool->m_bAlone && pPool->m_pLargePage) {
- FX_LPVOID p = pPool->m_pLargePage->Alloc(size);
- if (p) {
- return p;
- }
- }
- pPool = pPool->m_pNextPool;
- } while(pPool);
- if (!m_pExtender || !m_MemConfig.nPageSize_Large) {
- return NULL;
- }
- CFXMEM_Pool *pNewPool = NULL;
-#if _FX_WORDSIZE_ == _FX_W64_
- size_t newSize = ((size + 31) / 32 * 32 + sizeof(CFXMEM_Pool) + sizeof(CFXMEM_Page) + sizeof(CFXMEM_Block) + 4095) / 4096 * 4096;
-#else
- size_t newSize = (size + 7) / 8 * 8 + sizeof(CFXMEM_Pool) + sizeof(CFXMEM_Page) + sizeof(CFXMEM_Block);
-#endif
- if (newSize < m_MemConfig.nPageSize_Large * FX_FIXEDMEM_PAGESIZE) {
- newSize = m_MemConfig.nPageSize_Large * FX_FIXEDMEM_PAGESIZE;
- }
- if (!m_pExtender->More(m_pExtender, newSize, (void**)&pNewPool, &newSize)) {
- return NULL;
- }
- pNewPool->Initialize(&m_MemConfig, newSize, 0, 0, 0, 0);
- pNewPool->m_bAlone = size >= m_MemConfig.nPageSize_Alone * FX_FIXEDMEM_PAGESIZE;
- pNewPool->m_pPrevPool = &m_FirstPool;
- pPool = m_FirstPool.m_pNextPool;
- pNewPool->m_pNextPool = pPool;
- if (pPool) {
- pPool->m_pPrevPool = pNewPool;
- }
- m_FirstPool.m_pNextPool = pNewPool;
- return pNewPool->m_pLargePage->Alloc(size);
-}
-size_t CFXMEM_FixedMgr::GetSize(FX_LPVOID p) const
-{
- const CFXMEM_Pool *pFind = &m_FirstPool;
- do {
- if (p > (FX_LPVOID)pFind && p < pFind->m_pLimitPos) {
- return pFind->GetSize(p);
- }
- pFind = pFind->m_pNextPool;
- } while (pFind);
- return 0;
-}
-FX_LPVOID CFXMEM_FixedMgr::Alloc(size_t size)
-{
- FX_LPVOID p;
- if (size <= 32) {
- p = AllocSmall(size);
- if (p) {
- return p;
- }
- }
- if (size <= FX_FIXEDMEM_MIDBLOCKSIZE) {
- p = AllocMid(size);
- if (p) {
- return p;
- }
- }
- p = AllocLarge(size);
- return p;
-}
-FX_LPVOID CFXMEM_FixedMgr::ReallocSmall(CFXMEM_Pool* pPool, FX_LPVOID p, size_t oldSize, size_t newSize)
-{
- FX_LPVOID np = AllocSmall(newSize);
- if (!np) {
- return NULL;
- }
- FXSYS_memcpy32(np, p, oldSize);
- pPool->Free(p);
- return np;
-}
-FX_LPVOID CFXMEM_FixedMgr::Realloc(FX_LPVOID p, size_t newSize)
-{
- if (!p) {
- return Alloc(newSize);
- }
- size_t oldSize = 0;
- CFXMEM_Pool *pFind = &m_FirstPool;
- do {
- if (p > (FX_LPVOID)pFind && p < pFind->m_pLimitPos) {
- oldSize = pFind->GetSize(p);
- if (oldSize >= newSize) {
- return p;
- }
- break;
- }
- pFind = pFind->m_pNextPool;
- } while (pFind);
- if (!oldSize || !pFind) {
- return Alloc(newSize);
- }
- FX_LPVOID np = NULL;
- if (newSize <= 32) {
- np = ReallocSmall(pFind, p, oldSize, newSize);
- if (np) {
- return np;
- }
- }
- if (newSize <= FX_FIXEDMEM_MIDBLOCKSIZE) {
- np = pFind->Realloc(p, oldSize, newSize);
- if (np) {
- return np;
- }
- }
- np = Alloc(newSize);
- if (np) {
- FXSYS_memcpy32(np, p, oldSize);
- pFind->Free(p);
- }
- if (pFind->m_bAlone && pFind->IsEmpty()) {
- FreePool(pFind);
- }
- return np;
-}
-void CFXMEM_FixedMgr::Free(FX_LPVOID p)
-{
- CFXMEM_Pool *pFind = &m_FirstPool;
- do {
- if (p > (FX_LPVOID)pFind && p < pFind->m_pLimitPos) {
- pFind->Free(p);
- if (pFind->m_bAlone && pFind->IsEmpty()) {
- FreePool(pFind);
- }
- return;
- }
- pFind = pFind->m_pNextPool;
- } while (pFind);
-}
-void CFXMEM_FixedMgr::FreePool(CFXMEM_Pool* pPool)
-{
- FXSYS_assert(pPool->m_bAlone && pPool->IsEmpty());
- FXSYS_assert(m_pExtender != NULL);
- CFXMEM_Pool* pPrevPool = pPool->m_pPrevPool;
- CFXMEM_Pool* pNextPool = pPool->m_pNextPool;
- if (pPrevPool) {
- pPrevPool->m_pNextPool = pNextPool;
- }
- if (pNextPool) {
- pNextPool->m_pPrevPool = pPrevPool;
- }
- m_pExtender->Free(m_pExtender, pPool);
-}
-void CFXMEM_FixedMgr::FreeAll()
-{
- if (!m_pExtender) {
- return;
- }
- CFXMEM_Pool* pPool = m_FirstPool.m_pNextPool;
- while (pPool) {
- CFXMEM_Pool* pPrevPool = pPool;
- pPool = pPool->m_pNextPool;
- m_pExtender->Free(m_pExtender, pPrevPool);
- }
- m_FirstPool.m_pNextPool = NULL;
-}
-void CFXMEM_FixedMgr::Purge()
-{
- if (!m_pExtender) {
- return;
- }
- CFXMEM_Pool* pPool = m_FirstPool.m_pNextPool;
- while (pPool) {
- CFXMEM_Pool* pNextPool = pPool->m_pNextPool;
- if (pPool->IsEmpty()) {
- CFXMEM_Pool* pPrevPool = pPool->m_pPrevPool;
- pPrevPool->m_pNextPool = pNextPool;
- if (pNextPool) {
- pNextPool->m_pPrevPool = pPrevPool;
- }
- m_pExtender->Free(m_pExtender, pPool);
- }
- pPool = pNextPool;
- }
-}
-extern const FX_BYTE OneLeadPos[256] = {
- 8, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4,
- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-};
-extern const FX_BYTE ZeroLeadPos[256] = {
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
- 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 7, 8,
-};
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fxcrt/fx_ext.h"
+#include "mem_int.h"
+#ifdef _FPDFAPI_MINI_
+static FX_MEMCONFIG g_MemConfig = {
+ 1,
+ 5,
+ 8,
+ 4,
+ 12,
+ 8,
+ 2,
+ 4,
+ 32,
+ 64,
+};
+#else
+static FX_MEMCONFIG g_MemConfig = {
+ 1,
+ 8,
+ 24,
+ 8,
+ 32,
+ 16,
+ 4,
+ 8,
+ 128,
+ 64,
+};
+#endif
+void FXMEM_SetConfig(const FX_MEMCONFIG* memConfig)
+{
+ g_MemConfig = *memConfig;
+}
+#ifdef __cplusplus
+extern "C" {
+#endif
+static void* FixedAlloc(FXMEM_SystemMgr* pMgr, size_t size, int flags)
+{
+ return ((CFXMEM_FixedMgr*)pMgr->user)->Alloc(size);
+}
+static void* FixedAllocDebug(FXMEM_SystemMgr* pMgr, size_t size, int flags, FX_LPCSTR file, int line)
+{
+ return ((CFXMEM_FixedMgr*)pMgr->user)->Alloc(size);
+}
+static void* FixedRealloc(FXMEM_SystemMgr* pMgr, void* pointer, size_t size, int flags)
+{
+ return ((CFXMEM_FixedMgr*)pMgr->user)->Realloc(pointer, size);
+}
+static void* FixedReallocDebug(FXMEM_SystemMgr* pMgr, void* pointer, size_t size, int flags, FX_LPCSTR file, int line)
+{
+ return ((CFXMEM_FixedMgr*)pMgr->user)->Realloc(pointer, size);
+}
+static void FixedFree(FXMEM_SystemMgr* pMgr, void* pointer, int flags)
+{
+ ((CFXMEM_FixedMgr*)pMgr->user)->Free(pointer);
+}
+static void FixedPurge(FXMEM_SystemMgr* pMgr)
+{
+ ((CFXMEM_FixedMgr*)pMgr->user)->Purge();
+}
+static void FixedCollectAll(FXMEM_SystemMgr* pMgr)
+{
+ ((CFXMEM_FixedMgr*)pMgr->user)->FreeAll();
+}
+#define FIXEDMEM_MINIMUMSIZE (1024 * 1024 * 8)
+FXMEM_FoxitMgr* FXMEM_CreateMemoryMgr(size_t size, FX_BOOL extensible)
+{
+ if (size < FIXEDMEM_MINIMUMSIZE) {
+ size = FIXEDMEM_MINIMUMSIZE;
+ }
+ FX_LPVOID pMemory = malloc(size);
+ if (!pMemory) {
+ return NULL;
+ }
+ CFixedMgr_Proxy* pProxy = (CFixedMgr_Proxy*)pMemory;
+ size_t offsetSize = (sizeof(CFixedMgr_Proxy) + 15) / 16 * 16;
+ FXMEM_FoxitMgr* pFoxitMgr = pProxy->Initialize((FX_LPBYTE)pProxy + offsetSize, size - offsetSize, extensible);
+ if (!pFoxitMgr) {
+ free(pMemory);
+ return NULL;
+ }
+ g_pDefFoxitMgr = (CFX_MemoryMgr*)pFoxitMgr;
+ g_pDefFoxitMgr->m_pExternalMemory = pMemory;
+ return pFoxitMgr;
+}
+FXMEM_FoxitMgr* FXMEM_CreateFixedMgr(void* pMemory, size_t size, FXMEM_SystemMgr2* pSystemMgr)
+{
+ if (pMemory == NULL || size < FX_FIXEDMEM_PAGESIZE) {
+ return NULL;
+ }
+ if (!pSystemMgr && size >= FIXEDMEM_PROXYSIZE_1) {
+ CFixedMgr_Proxy* pProxy = (CFixedMgr_Proxy*)pMemory;
+ size_t offsetSize = (sizeof(CFixedMgr_Proxy) + 15) / 16 * 16;
+ return pProxy->Initialize((FX_LPBYTE)pProxy + offsetSize, size - offsetSize, FALSE);
+ }
+ CFXMEM_FixedMgr* pHeader = (CFXMEM_FixedMgr*)pMemory;
+ pHeader->Initialize(size);
+ pHeader->m_pExtender = pSystemMgr;
+ CFX_MemoryMgr* p = (CFX_MemoryMgr*)pHeader->Alloc(sizeof(CFX_MemoryMgr));
+ if (p == NULL) {
+ return NULL;
+ }
+ p->Init(&pHeader->m_SystemMgr);
+ return (FXMEM_FoxitMgr*)p;
+}
+size_t FXMEM_GetBlockSizeInFixedMgr(FXMEM_FoxitMgr* pFoxitMgr, void* ptr)
+{
+ return pFoxitMgr ? ((CFXMEM_FixedMgr*)((CFX_MemoryMgr*)pFoxitMgr)->m_pSystemMgr->user)->GetSize(ptr) : 0;
+}
+#ifdef __cplusplus
+}
+#endif
+const FX_MEMCONFIG g_ProxyMgr_MemConfigs[6] = {
+ {1, 2, 4, 0, 2, 2, 2, 0, 0, 0},
+ {1, 4, 8, 0, 2, 2, 2, 0, 0, 0},
+ {1, 4, 16, 4, 8, 8, 2, 1, 16, 16},
+ {1, 8, 24, 4, 12, 12, 4, 2, 32, 16},
+ {1, 8, 24, 8, 16, 16, 4, 2, 64, 32},
+ {1, 8, 24, 8, 24, 32, 4, 2, 128, 64},
+};
+const FX_MEMCONFIG* FixedMgr_GetConfig(size_t nSize)
+{
+ int index = 5;
+ if (nSize <= FIXEDMEM_PROXYSIZE_0) {
+ index = 0;
+ } else if (nSize <= FIXEDMEM_PROXYSIZE_1) {
+ index = 1;
+ } else if (nSize <= FIXEDMEM_PROXYSIZE_2) {
+ index = 2;
+ } else if (nSize <= FIXEDMEM_PROXYSIZE_3) {
+ index = 3;
+ } else if (nSize <= FIXEDMEM_PROXYSIZE_4) {
+ index = 4;
+ }
+ return &g_ProxyMgr_MemConfigs[index];
+}
+FXMEM_FoxitMgr* CFixedMgr_Proxy::Initialize(FX_LPVOID pBuffer, size_t nSize, FX_BOOL bExtensible)
+{
+ FXSYS_assert(pBuffer != NULL && nSize >= FIXEDMEM_PROXYSIZE_1 - sizeof(CFixedMgr_Proxy));
+ FXMEM_SetConfig(FixedMgr_GetConfig(nSize));
+ m_SystemMgr.More = &CFixedMgr_Proxy::Common_More;
+ m_SystemMgr.Free = &CFixedMgr_Proxy::Common_Free;
+ m_pFixedPage = (CFXMEM_Page*)((FX_LPBYTE)pBuffer + FIXEDMEM_PROXYSIZE_0);
+ m_pFixedPage->Initialize(nSize - FIXEDMEM_PROXYSIZE_0);
+ m_pBuffer = pBuffer;
+ m_nSize = nSize;
+ m_bExtensible = bExtensible;
+ return FXMEM_CreateFixedMgr(pBuffer, FIXEDMEM_PROXYSIZE_0, &m_SystemMgr);
+}
+FX_BOOL CFixedMgr_Proxy::Common_More(FXMEM_SystemMgr2* pMgr, size_t alloc_size, void** new_memory, size_t* new_size)
+{
+ CFixedMgr_Proxy* pProxyMgr = (CFixedMgr_Proxy*)pMgr;
+ FXSYS_assert(pProxyMgr != NULL && pProxyMgr->m_pFixedPage != NULL);
+ *new_size = alloc_size;
+ *new_memory = pProxyMgr->m_pFixedPage->Alloc(alloc_size);
+ if (*new_memory == NULL && pProxyMgr->m_bExtensible) {
+ *new_memory = malloc(alloc_size);
+ }
+ return *new_memory != NULL;
+}
+void CFixedMgr_Proxy::Common_Free(FXMEM_SystemMgr2* pMgr, void* memory)
+{
+ CFixedMgr_Proxy* pProxyMgr = (CFixedMgr_Proxy*)pMgr;
+ FXSYS_assert(pProxyMgr != NULL && pProxyMgr->m_pFixedPage != NULL);
+ if (memory > pProxyMgr->m_pBuffer && memory < (FX_LPBYTE)pProxyMgr->m_pBuffer + pProxyMgr->m_nSize) {
+ pProxyMgr->m_pFixedPage->Free(memory);
+ } else if (pProxyMgr->m_bExtensible) {
+ free(memory);
+ }
+}
+void CFXMEM_Page::Initialize(size_t size)
+{
+ CFXMEM_Block *pFirstBlock = (CFXMEM_Block*)(this + 1);
+ m_nAvailSize = size - sizeof(CFXMEM_Page) - sizeof(CFXMEM_Block);
+ pFirstBlock->m_nBlockSize = m_nAvailSize;
+ pFirstBlock->m_pNextBlock = NULL;
+ m_AvailHead.m_nBlockSize = m_nAvailSize;
+ m_AvailHead.m_pNextBlock = pFirstBlock;
+ m_pLimitPos = (CFXMEM_Block*)((FX_LPBYTE)this + size);
+}
+FX_LPVOID CFXMEM_Page::Alloc(CFXMEM_Block* pPrevBlock, CFXMEM_Block* pNextBlock, size_t size, size_t oldsize)
+{
+ size_t gap = pNextBlock->m_nBlockSize - size;
+ if (gap <= 64 + sizeof(CFXMEM_Block)) {
+ pPrevBlock->m_pNextBlock = pNextBlock->m_pNextBlock;
+ m_nAvailSize -= pNextBlock->m_nBlockSize;
+ } else {
+ m_nAvailSize -= size + sizeof(CFXMEM_Block);
+ pNextBlock->m_nBlockSize = size;
+ CFXMEM_Block *pNewBlock = (CFXMEM_Block*)((FX_LPBYTE)(pNextBlock + 1) + size);
+ pNewBlock->m_nBlockSize = gap - sizeof(CFXMEM_Block);
+ pNewBlock->m_pNextBlock = pNextBlock->m_pNextBlock;
+ pPrevBlock->m_pNextBlock = pNewBlock;
+ }
+ return (FX_LPVOID)(pNextBlock + 1);
+}
+FX_LPVOID CFXMEM_Page::Alloc(size_t size)
+{
+ size_t oldsize = size;
+#if _FX_WORDSIZE_ == _FX_W64_
+ size = (size + 31) / 32 * 32;
+#else
+ size = (size + 7) / 8 * 8;
+#endif
+ if (m_nAvailSize < size) {
+ return NULL;
+ }
+ CFXMEM_Block *pNextBlock;
+ CFXMEM_Block *pPrevBlock = &m_AvailHead;
+ while (TRUE) {
+ pNextBlock = pPrevBlock->m_pNextBlock;
+ if (!pNextBlock) {
+ return NULL;
+ }
+ if (pNextBlock->m_nBlockSize >= size) {
+ break;
+ }
+ pPrevBlock = pNextBlock;
+ }
+ return Alloc(pPrevBlock, pNextBlock, size, oldsize);
+}
+FX_LPVOID CFXMEM_Page::Realloc(FX_LPVOID p, size_t oldSize, size_t newSize)
+{
+ FXSYS_assert(p > (FX_LPVOID)this && p < (FX_LPVOID)m_pLimitPos);
+ size_t oldnewSize = newSize;
+#if _FX_WORDSIZE_ == _FX_W64_
+ newSize = (newSize + 31) / 32 * 32;
+#else
+ newSize = (newSize + 7) / 8 * 8;
+#endif
+ CFXMEM_Block *pPrevBlock = &m_AvailHead;
+ CFXMEM_Block *pNextBlock, *pPrevPrev;
+ CFXMEM_Block *pBlock = (CFXMEM_Block*)p - 1;
+ pPrevPrev = NULL;
+ while (TRUE) {
+ pNextBlock = pPrevBlock->m_pNextBlock;
+ if (pNextBlock == NULL || pNextBlock > pBlock) {
+ break;
+ }
+ if (pPrevBlock != &m_AvailHead && (FX_LPBYTE)pNextBlock == (FX_LPBYTE)(pPrevBlock + 1) + pPrevBlock->m_nBlockSize) {
+ m_nAvailSize += sizeof(CFXMEM_Block);
+ pPrevBlock->m_nBlockSize += pNextBlock->m_nBlockSize + sizeof(CFXMEM_Block);
+ pPrevBlock->m_pNextBlock = pNextBlock->m_pNextBlock;
+ } else {
+ pPrevPrev = pPrevBlock;
+ pPrevBlock = pNextBlock;
+ }
+ }
+ if (pNextBlock) {
+ CFXMEM_Block* pCurBlock = pNextBlock->m_pNextBlock;
+ while ((FX_LPBYTE)pCurBlock == (FX_LPBYTE)(pNextBlock + 1) + pNextBlock->m_nBlockSize) {
+ m_nAvailSize += sizeof(CFXMEM_Block);
+ pNextBlock->m_nBlockSize += pCurBlock->m_nBlockSize + sizeof(CFXMEM_Block);
+ pCurBlock = pCurBlock->m_pNextBlock;
+ pNextBlock->m_pNextBlock = pCurBlock;
+ }
+ }
+ size_t size = 0;
+ FX_DWORD dwFlags = 0;
+ if (pPrevBlock != &m_AvailHead && (FX_LPBYTE)pBlock == (FX_LPBYTE)(pPrevBlock + 1) + pPrevBlock->m_nBlockSize) {
+ size += pPrevBlock->m_nBlockSize + oldSize + sizeof(CFXMEM_Block);
+ dwFlags |= 0x10;
+ }
+ if (pNextBlock && (FX_LPBYTE)pNextBlock == (FX_LPBYTE)p + oldSize) {
+ size += pNextBlock->m_nBlockSize + sizeof(CFXMEM_Block);
+ dwFlags |= 0x01;
+ }
+ if (size >= newSize) {
+ m_nAvailSize += pBlock->m_nBlockSize;
+ CFXMEM_Block* pCurBlock = pBlock;
+ if (dwFlags & 0x10) {
+ pCurBlock = pPrevBlock;
+ m_nAvailSize += sizeof(CFXMEM_Block);
+ pCurBlock->m_nBlockSize += pBlock->m_nBlockSize + sizeof(CFXMEM_Block);
+ pPrevBlock = pPrevPrev;
+ }
+ if (dwFlags & 0x01) {
+ m_nAvailSize += sizeof(CFXMEM_Block);
+ pCurBlock->m_nBlockSize += pNextBlock->m_nBlockSize + sizeof(CFXMEM_Block);
+ pCurBlock->m_pNextBlock = pNextBlock->m_pNextBlock;
+ }
+ if (pCurBlock != pBlock) {
+ FXSYS_memmove32((FX_LPVOID)(pCurBlock + 1), p, oldSize);
+ }
+ return Alloc(pPrevBlock, pCurBlock, newSize, oldnewSize);
+ }
+ return NULL;
+}
+void CFXMEM_Page::Free(FX_LPVOID p)
+{
+ FXSYS_assert(p > (FX_LPVOID)this && p < (FX_LPVOID)m_pLimitPos);
+ CFXMEM_Block *pPrevBlock = &m_AvailHead;
+ CFXMEM_Block *pNextBlock;
+ CFXMEM_Block *pBlock = (CFXMEM_Block*)p - 1;
+ m_nAvailSize += pBlock->m_nBlockSize;
+ while (TRUE) {
+ pNextBlock = pPrevBlock->m_pNextBlock;
+ if (pNextBlock == NULL || pNextBlock > pBlock) {
+ break;
+ }
+ if (pPrevBlock != &m_AvailHead && (FX_LPBYTE)pNextBlock == (FX_LPBYTE)(pPrevBlock + 1) + pPrevBlock->m_nBlockSize) {
+ m_nAvailSize += sizeof(CFXMEM_Block);
+ pPrevBlock->m_nBlockSize += pNextBlock->m_nBlockSize + sizeof(CFXMEM_Block);
+ pPrevBlock->m_pNextBlock = pNextBlock->m_pNextBlock;
+ } else {
+ pPrevBlock = pNextBlock;
+ }
+ }
+ while ((FX_LPBYTE)pNextBlock == (FX_LPBYTE)(pBlock + 1) + pBlock->m_nBlockSize) {
+ m_nAvailSize += sizeof(CFXMEM_Block);
+ pBlock->m_nBlockSize += pNextBlock->m_nBlockSize + sizeof(CFXMEM_Block);
+ pNextBlock = pNextBlock->m_pNextBlock;
+ }
+ pBlock->m_pNextBlock = pNextBlock;
+ if (pPrevBlock != &m_AvailHead && (FX_LPBYTE)pBlock == (FX_LPBYTE)(pPrevBlock + 1) + pPrevBlock->m_nBlockSize) {
+ m_nAvailSize += sizeof(CFXMEM_Block);
+ pPrevBlock->m_nBlockSize += pBlock->m_nBlockSize + sizeof(CFXMEM_Block);
+ pPrevBlock->m_pNextBlock = pBlock->m_pNextBlock;
+ } else {
+ FXSYS_assert(pPrevBlock != pBlock);
+ pPrevBlock->m_pNextBlock = pBlock;
+ }
+}
+void CFXMEM_Pages::Initialize(FX_LPBYTE pStart, size_t pageSize, size_t pages)
+{
+ m_pStartPage = m_pCurPage = (CFXMEM_Page*)pStart;
+ m_nPageSize = pageSize;
+ for (size_t n = 0; n < pages; n++) {
+ ((CFXMEM_Page*)pStart)->Initialize(pageSize);
+ pStart += pageSize;
+ }
+ m_pLimitPos = (CFXMEM_Page*)pStart;
+}
+FX_BOOL CFXMEM_Pages::IsEmpty() const
+{
+ if (m_pStartPage >= m_pLimitPos) {
+ return TRUE;
+ }
+ FX_LPBYTE pPage = (FX_LPBYTE)m_pStartPage;
+ while (pPage < (FX_LPBYTE)m_pLimitPos) {
+ if (!((CFXMEM_Page*)pPage)->IsEmpty()) {
+ return FALSE;
+ }
+ pPage += m_nPageSize;
+ }
+ return TRUE;
+}
+FX_LPVOID CFXMEM_Pages::Alloc(size_t size)
+{
+ CFXMEM_Page *pCurPage = m_pCurPage;
+ do {
+ FX_LPVOID p = m_pCurPage->Alloc(size);
+ if (p) {
+ return p;
+ }
+ m_pCurPage = (CFXMEM_Page*)((FX_LPBYTE)m_pCurPage + m_nPageSize);
+ if (m_pCurPage == m_pLimitPos) {
+ m_pCurPage = m_pStartPage;
+ }
+ } while (m_pCurPage != pCurPage);
+ return NULL;
+}
+FX_LPVOID CFXMEM_Pages::Realloc(FX_LPVOID p, size_t oldSize, size_t newSize)
+{
+ FXSYS_assert (p > (FX_LPVOID)m_pStartPage && p < (FX_LPVOID)m_pLimitPos);
+ CFXMEM_Page* pPage = (CFXMEM_Page*)((FX_LPBYTE)m_pStartPage + ((FX_LPBYTE)p - (FX_LPBYTE)m_pStartPage) / m_nPageSize * m_nPageSize);
+ return pPage->Realloc(p, oldSize, newSize);
+}
+void CFXMEM_Pages::Free(FX_LPVOID p)
+{
+ FXSYS_assert (p > (FX_LPVOID)m_pStartPage && p < (FX_LPVOID)m_pLimitPos);
+ CFXMEM_Page* pPage = (CFXMEM_Page*)((FX_LPBYTE)m_pStartPage + ((FX_LPBYTE)p - (FX_LPBYTE)m_pStartPage) / m_nPageSize * m_nPageSize);
+ pPage->Free(p);
+}
+void CFXMEM_Pool::Initialize(const FX_MEMCONFIG* pMemConfig, size_t size, size_t pageNum8Bytes, size_t pageNum16Bytes, size_t pageNum32Bytes, size_t pageNumMid)
+{
+ m_pPrevPool = NULL;
+ m_pNextPool = NULL;
+ m_bAlone = FALSE;
+ FX_LPBYTE pPage = (FX_LPBYTE)this + sizeof(CFXMEM_Pool);
+ size -= sizeof(CFXMEM_Pool);
+ m_8BytesPages.Initialize(pPage, pageNum8Bytes);
+ pPage += pageNum8Bytes * FX_FIXEDMEM_PAGESIZE;
+ size -= pageNum8Bytes * FX_FIXEDMEM_PAGESIZE;
+ m_16BytesPages.Initialize(pPage, pageNum16Bytes);
+ pPage += pageNum16Bytes * FX_FIXEDMEM_PAGESIZE;
+ size -= pageNum16Bytes * FX_FIXEDMEM_PAGESIZE;
+ m_32BytesPages.Initialize(pPage, pageNum32Bytes);
+ pPage += pageNum32Bytes * FX_FIXEDMEM_PAGESIZE;
+ size -= pageNum32Bytes * FX_FIXEDMEM_PAGESIZE;
+ m_MidPages.Initialize(pPage, pMemConfig->nPageSize_Mid * FX_FIXEDMEM_PAGESIZE, pageNumMid);
+ pPage += pageNumMid * pMemConfig->nPageSize_Mid * FX_FIXEDMEM_PAGESIZE;
+ size -= pageNumMid * pMemConfig->nPageSize_Mid * FX_FIXEDMEM_PAGESIZE;
+ if (size < FX_FIXEDMEM_MIDBLOCKSIZE) {
+ m_pLargePage = NULL;
+ } else {
+ m_pLargePage = (CFXMEM_Page*)pPage;
+ m_pLargePage->Initialize(size);
+ }
+ m_pLimitPos = pPage + size;
+}
+FX_BOOL CFXMEM_Pool::IsEmpty() const
+{
+ if (!m_8BytesPages.IsEmpty()) {
+ return FALSE;
+ }
+ if (!m_16BytesPages.IsEmpty()) {
+ return FALSE;
+ }
+ if (!m_32BytesPages.IsEmpty()) {
+ return FALSE;
+ }
+ if (!m_MidPages.IsEmpty()) {
+ return FALSE;
+ }
+ return !m_pLargePage || m_pLargePage->IsEmpty();
+}
+size_t CFXMEM_Pool::GetSize(FX_LPVOID p) const
+{
+ FXSYS_assert(p > (FX_LPVOID)this && p < (FX_LPVOID)m_pLimitPos);
+ if (p < (FX_LPVOID)m_8BytesPages.m_pLimitPos) {
+ return 8;
+ }
+ if (p < (FX_LPVOID)m_16BytesPages.m_pLimitPos) {
+ return 16;
+ }
+ if (p < (FX_LPVOID)m_32BytesPages.m_pLimitPos) {
+ return 32;
+ }
+ return ((CFXMEM_Block*)p - 1)->m_nBlockSize;
+}
+FX_LPVOID CFXMEM_Pool::Realloc(FX_LPVOID p, size_t oldSize, size_t newSize)
+{
+ FXSYS_assert(p > (FX_LPVOID)this && p < (FX_LPVOID)m_pLimitPos);
+ if (p > (FX_LPVOID)m_32BytesPages.m_pLimitPos) {
+ if (p < (FX_LPVOID)m_MidPages.m_pLimitPos) {
+ return m_MidPages.Realloc(p, oldSize, newSize);
+ } else if (m_pLargePage) {
+ return m_pLargePage->Realloc(p, oldSize, newSize);
+ }
+ }
+ return NULL;
+}
+void CFXMEM_Pool::Free(FX_LPVOID p)
+{
+ FXSYS_assert(p > (FX_LPVOID)this && p < (FX_LPVOID)m_pLimitPos);
+ if (p < (FX_LPVOID)m_32BytesPages.m_pLimitPos) {
+ if (p < (FX_LPVOID)m_8BytesPages.m_pLimitPos) {
+ m_8BytesPages.Free(p);
+ } else if (p < (FX_LPVOID)m_16BytesPages.m_pLimitPos) {
+ m_16BytesPages.Free(p);
+ } else {
+ m_32BytesPages.Free(p);
+ }
+ return;
+ } else if (p < (FX_LPVOID)m_MidPages.m_pLimitPos) {
+ m_MidPages.Free(p);
+ } else {
+ m_pLargePage->Free(p);
+ }
+}
+void CFXMEM_FixedMgr::Initialize(size_t size)
+{
+ m_MemConfig = g_MemConfig;
+ FXSYS_memset32(&m_SystemMgr, 0, sizeof m_SystemMgr);
+ m_SystemMgr.Alloc = FixedAlloc;
+ m_SystemMgr.AllocDebug = FixedAllocDebug;
+ m_SystemMgr.Free = FixedFree;
+ m_SystemMgr.Realloc = FixedRealloc;
+ m_SystemMgr.ReallocDebug = FixedReallocDebug;
+ m_SystemMgr.CollectAll = FixedCollectAll;
+ m_SystemMgr.Purge = FixedPurge;
+ m_SystemMgr.user = this;
+ size -= sizeof(CFXMEM_FixedMgr);
+ size_t nMidPages = 0;
+ if (m_MemConfig.nPageSize_Mid) {
+ nMidPages = (size - (m_MemConfig.nPageNum_Init8 + m_MemConfig.nPageNum_Init16 + m_MemConfig.nPageNum_Init32) * FX_FIXEDMEM_PAGESIZE) / (m_MemConfig.nPageSize_Mid * FX_FIXEDMEM_PAGESIZE);
+ if (nMidPages > m_MemConfig.nPageNum_InitMid) {
+ nMidPages = m_MemConfig.nPageNum_InitMid;
+ }
+ }
+ m_FirstPool.Initialize(&m_MemConfig, size, m_MemConfig.nPageNum_Init8, m_MemConfig.nPageNum_Init16, m_MemConfig.nPageNum_Init32, nMidPages);
+}
+FX_LPVOID CFXMEM_FixedMgr::Alloc16(CFXMEM_Pool **pp32Pool, size_t size)
+{
+ CFXMEM_Pool *pPool = &m_FirstPool;
+ do {
+ CFXMEM_16BytesPages &pages = pPool->m_16BytesPages;
+ if (pages.HasFreeBlock()) {
+ return pages.Alloc(size);
+ }
+ if (pp32Pool && pPool->m_32BytesPages.HasFreeBlock()) {
+ *pp32Pool = pPool;
+ }
+ pPool = pPool->m_pNextPool;
+ } while(pPool);
+ return NULL;
+}
+FX_LPVOID CFXMEM_FixedMgr::Alloc32(size_t size)
+{
+ if (size <= 8) {
+ CFXMEM_8BytesPages &pages = m_FirstPool.m_8BytesPages;
+ if (pages.HasFreeBlock()) {
+ return pages.Alloc(size);
+ }
+ }
+ CFXMEM_Pool *p32BytesPool;
+ if (size <= 16) {
+ p32BytesPool = NULL;
+ FX_LPVOID p = Alloc16(&p32BytesPool, size);
+ if (p) {
+ return p;
+ }
+ } else {
+ p32BytesPool = &m_FirstPool;
+ }
+ while (p32BytesPool) {
+ CFXMEM_32BytesPages &pages = p32BytesPool->m_32BytesPages;
+ if (pages.HasFreeBlock()) {
+ return pages.Alloc(size);
+ }
+ p32BytesPool = p32BytesPool->m_pNextPool;
+ }
+ return NULL;
+}
+FX_LPVOID CFXMEM_FixedMgr::AllocSmall(size_t size)
+{
+ FX_LPVOID p = Alloc32(size);
+ if (p) {
+ return p;
+ }
+ if (!m_pExtender) {
+ return NULL;
+ }
+ size_t requiredSize = (m_MemConfig.nPageNum_More16 + m_MemConfig.nPageNum_More32) * FX_FIXEDMEM_PAGESIZE;
+ if (!requiredSize) {
+ return NULL;
+ }
+ CFXMEM_Pool *pNewPool = NULL;
+ requiredSize += sizeof(CFXMEM_Pool);
+ size_t newSize = requiredSize;
+ if (!m_pExtender->More(m_pExtender, newSize, (void**)&pNewPool, &newSize)) {
+ return NULL;
+ }
+ size_t nMidPages = 0;
+ if (m_MemConfig.nPageSize_Mid) {
+ nMidPages = (newSize - requiredSize) / (m_MemConfig.nPageSize_Mid * FX_FIXEDMEM_PAGESIZE);
+ if (nMidPages > m_MemConfig.nPageNum_MoreMid) {
+ nMidPages = m_MemConfig.nPageNum_MoreMid;
+ }
+ }
+ pNewPool->Initialize(&m_MemConfig, newSize, 0, m_MemConfig.nPageNum_More16, m_MemConfig.nPageNum_More32, nMidPages);
+ pNewPool->m_pPrevPool = &m_FirstPool;
+ CFXMEM_Pool *pPool = m_FirstPool.m_pNextPool;
+ pNewPool->m_pNextPool = pPool;
+ if (pPool) {
+ pPool->m_pPrevPool = pNewPool;
+ }
+ m_FirstPool.m_pNextPool = pNewPool;
+ return Alloc32(size);
+}
+FX_LPVOID CFXMEM_FixedMgr::AllocMid(size_t size)
+{
+ CFXMEM_Pool *pPool = &m_FirstPool;
+ do {
+ CFXMEM_Pages &pages = pPool->m_MidPages;
+ if (pages.m_pLimitPos > pages.m_pStartPage) {
+ FX_LPVOID p = pages.Alloc(size);
+ if (p) {
+ return p;
+ }
+ }
+ pPool = pPool->m_pNextPool;
+ } while(pPool);
+ if (!m_pExtender) {
+ return NULL;
+ }
+ size_t newSize = m_MemConfig.nPageSize_Mid * FX_FIXEDMEM_PAGESIZE * m_MemConfig.nPageNum_MoreMid;
+ if (!newSize) {
+ return NULL;
+ }
+ CFXMEM_Pool *pNewPool = NULL;
+ newSize += sizeof(CFXMEM_Pool);
+ if (!m_pExtender->More(m_pExtender, newSize, (void**)&pNewPool, &newSize)) {
+ return NULL;
+ }
+ size_t nMidPages = (newSize - sizeof(CFXMEM_Pool)) / (m_MemConfig.nPageSize_Mid * FX_FIXEDMEM_PAGESIZE);
+ if (nMidPages > m_MemConfig.nPageNum_MoreMid) {
+ nMidPages = m_MemConfig.nPageNum_MoreMid;
+ }
+ pNewPool->Initialize(&m_MemConfig, newSize, 0, 0, 0, nMidPages);
+ pNewPool->m_pPrevPool = &m_FirstPool;
+ pPool = m_FirstPool.m_pNextPool;
+ pNewPool->m_pNextPool = pPool;
+ if (pPool) {
+ pPool->m_pPrevPool = pNewPool;
+ }
+ m_FirstPool.m_pNextPool = pNewPool;
+ return pNewPool->m_MidPages.Alloc(size);
+}
+FX_LPVOID CFXMEM_FixedMgr::AllocLarge(size_t size)
+{
+ CFXMEM_Pool *pPool = &m_FirstPool;
+ do {
+ if (!pPool->m_bAlone && pPool->m_pLargePage) {
+ FX_LPVOID p = pPool->m_pLargePage->Alloc(size);
+ if (p) {
+ return p;
+ }
+ }
+ pPool = pPool->m_pNextPool;
+ } while(pPool);
+ if (!m_pExtender || !m_MemConfig.nPageSize_Large) {
+ return NULL;
+ }
+ CFXMEM_Pool *pNewPool = NULL;
+#if _FX_WORDSIZE_ == _FX_W64_
+ size_t newSize = ((size + 31) / 32 * 32 + sizeof(CFXMEM_Pool) + sizeof(CFXMEM_Page) + sizeof(CFXMEM_Block) + 4095) / 4096 * 4096;
+#else
+ size_t newSize = (size + 7) / 8 * 8 + sizeof(CFXMEM_Pool) + sizeof(CFXMEM_Page) + sizeof(CFXMEM_Block);
+#endif
+ if (newSize < m_MemConfig.nPageSize_Large * FX_FIXEDMEM_PAGESIZE) {
+ newSize = m_MemConfig.nPageSize_Large * FX_FIXEDMEM_PAGESIZE;
+ }
+ if (!m_pExtender->More(m_pExtender, newSize, (void**)&pNewPool, &newSize)) {
+ return NULL;
+ }
+ pNewPool->Initialize(&m_MemConfig, newSize, 0, 0, 0, 0);
+ pNewPool->m_bAlone = size >= m_MemConfig.nPageSize_Alone * FX_FIXEDMEM_PAGESIZE;
+ pNewPool->m_pPrevPool = &m_FirstPool;
+ pPool = m_FirstPool.m_pNextPool;
+ pNewPool->m_pNextPool = pPool;
+ if (pPool) {
+ pPool->m_pPrevPool = pNewPool;
+ }
+ m_FirstPool.m_pNextPool = pNewPool;
+ return pNewPool->m_pLargePage->Alloc(size);
+}
+size_t CFXMEM_FixedMgr::GetSize(FX_LPVOID p) const
+{
+ const CFXMEM_Pool *pFind = &m_FirstPool;
+ do {
+ if (p > (FX_LPVOID)pFind && p < pFind->m_pLimitPos) {
+ return pFind->GetSize(p);
+ }
+ pFind = pFind->m_pNextPool;
+ } while (pFind);
+ return 0;
+}
+FX_LPVOID CFXMEM_FixedMgr::Alloc(size_t size)
+{
+ FX_LPVOID p;
+ if (size <= 32) {
+ p = AllocSmall(size);
+ if (p) {
+ return p;
+ }
+ }
+ if (size <= FX_FIXEDMEM_MIDBLOCKSIZE) {
+ p = AllocMid(size);
+ if (p) {
+ return p;
+ }
+ }
+ p = AllocLarge(size);
+ return p;
+}
+FX_LPVOID CFXMEM_FixedMgr::ReallocSmall(CFXMEM_Pool* pPool, FX_LPVOID p, size_t oldSize, size_t newSize)
+{
+ FX_LPVOID np = AllocSmall(newSize);
+ if (!np) {
+ return NULL;
+ }
+ FXSYS_memcpy32(np, p, oldSize);
+ pPool->Free(p);
+ return np;
+}
+FX_LPVOID CFXMEM_FixedMgr::Realloc(FX_LPVOID p, size_t newSize)
+{
+ if (!p) {
+ return Alloc(newSize);
+ }
+ size_t oldSize = 0;
+ CFXMEM_Pool *pFind = &m_FirstPool;
+ do {
+ if (p > (FX_LPVOID)pFind && p < pFind->m_pLimitPos) {
+ oldSize = pFind->GetSize(p);
+ if (oldSize >= newSize) {
+ return p;
+ }
+ break;
+ }
+ pFind = pFind->m_pNextPool;
+ } while (pFind);
+ if (!oldSize || !pFind) {
+ return Alloc(newSize);
+ }
+ FX_LPVOID np = NULL;
+ if (newSize <= 32) {
+ np = ReallocSmall(pFind, p, oldSize, newSize);
+ if (np) {
+ return np;
+ }
+ }
+ if (newSize <= FX_FIXEDMEM_MIDBLOCKSIZE) {
+ np = pFind->Realloc(p, oldSize, newSize);
+ if (np) {
+ return np;
+ }
+ }
+ np = Alloc(newSize);
+ if (np) {
+ FXSYS_memcpy32(np, p, oldSize);
+ pFind->Free(p);
+ }
+ if (pFind->m_bAlone && pFind->IsEmpty()) {
+ FreePool(pFind);
+ }
+ return np;
+}
+void CFXMEM_FixedMgr::Free(FX_LPVOID p)
+{
+ CFXMEM_Pool *pFind = &m_FirstPool;
+ do {
+ if (p > (FX_LPVOID)pFind && p < pFind->m_pLimitPos) {
+ pFind->Free(p);
+ if (pFind->m_bAlone && pFind->IsEmpty()) {
+ FreePool(pFind);
+ }
+ return;
+ }
+ pFind = pFind->m_pNextPool;
+ } while (pFind);
+}
+void CFXMEM_FixedMgr::FreePool(CFXMEM_Pool* pPool)
+{
+ FXSYS_assert(pPool->m_bAlone && pPool->IsEmpty());
+ FXSYS_assert(m_pExtender != NULL);
+ CFXMEM_Pool* pPrevPool = pPool->m_pPrevPool;
+ CFXMEM_Pool* pNextPool = pPool->m_pNextPool;
+ if (pPrevPool) {
+ pPrevPool->m_pNextPool = pNextPool;
+ }
+ if (pNextPool) {
+ pNextPool->m_pPrevPool = pPrevPool;
+ }
+ m_pExtender->Free(m_pExtender, pPool);
+}
+void CFXMEM_FixedMgr::FreeAll()
+{
+ if (!m_pExtender) {
+ return;
+ }
+ CFXMEM_Pool* pPool = m_FirstPool.m_pNextPool;
+ while (pPool) {
+ CFXMEM_Pool* pPrevPool = pPool;
+ pPool = pPool->m_pNextPool;
+ m_pExtender->Free(m_pExtender, pPrevPool);
+ }
+ m_FirstPool.m_pNextPool = NULL;
+}
+void CFXMEM_FixedMgr::Purge()
+{
+ if (!m_pExtender) {
+ return;
+ }
+ CFXMEM_Pool* pPool = m_FirstPool.m_pNextPool;
+ while (pPool) {
+ CFXMEM_Pool* pNextPool = pPool->m_pNextPool;
+ if (pPool->IsEmpty()) {
+ CFXMEM_Pool* pPrevPool = pPool->m_pPrevPool;
+ pPrevPool->m_pNextPool = pNextPool;
+ if (pNextPool) {
+ pNextPool->m_pPrevPool = pPrevPool;
+ }
+ m_pExtender->Free(m_pExtender, pPool);
+ }
+ pPool = pNextPool;
+ }
+}
+extern const FX_BYTE OneLeadPos[256] = {
+ 8, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+};
+extern const FX_BYTE ZeroLeadPos[256] = {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 7, 8,
+};
diff --git a/core/src/fxcrt/fx_basic_plex.cpp b/core/src/fxcrt/fx_basic_plex.cpp
index dd3a8ba054..80c014a2b3 100644
--- a/core/src/fxcrt/fx_basic_plex.cpp
+++ b/core/src/fxcrt/fx_basic_plex.cpp
@@ -1,28 +1,28 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../include/fxcrt/fx_basic.h"
-#include "plex.h"
-CFX_Plex* CFX_Plex::Create(IFX_Allocator* pAllocator, CFX_Plex*& pHead, FX_DWORD nMax, FX_DWORD cbElement)
-{
- CFX_Plex* p = (CFX_Plex*)FX_Allocator_Alloc(pAllocator, FX_BYTE, sizeof(CFX_Plex) + nMax * cbElement);
- if (!p) {
- return NULL;
- }
- p->pNext = pHead;
- pHead = p;
- return p;
-}
-void CFX_Plex::FreeDataChain(IFX_Allocator* pAllocator)
-{
- CFX_Plex* p = this;
- while (p != NULL) {
- FX_BYTE* bytes = (FX_BYTE*) p;
- CFX_Plex* pNext = p->pNext;
- FX_Allocator_Free(pAllocator, bytes);
- p = pNext;
- }
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fxcrt/fx_basic.h"
+#include "plex.h"
+CFX_Plex* CFX_Plex::Create(IFX_Allocator* pAllocator, CFX_Plex*& pHead, FX_DWORD nMax, FX_DWORD cbElement)
+{
+ CFX_Plex* p = (CFX_Plex*)FX_Allocator_Alloc(pAllocator, FX_BYTE, sizeof(CFX_Plex) + nMax * cbElement);
+ if (!p) {
+ return NULL;
+ }
+ p->pNext = pHead;
+ pHead = p;
+ return p;
+}
+void CFX_Plex::FreeDataChain(IFX_Allocator* pAllocator)
+{
+ CFX_Plex* p = this;
+ while (p != NULL) {
+ FX_BYTE* bytes = (FX_BYTE*) p;
+ CFX_Plex* pNext = p->pNext;
+ FX_Allocator_Free(pAllocator, bytes);
+ p = pNext;
+ }
+}
diff --git a/core/src/fxcrt/fx_basic_utf.cpp b/core/src/fxcrt/fx_basic_utf.cpp
index b94e08df1d..c5aa360e6c 100644
--- a/core/src/fxcrt/fx_basic_utf.cpp
+++ b/core/src/fxcrt/fx_basic_utf.cpp
@@ -1,102 +1,102 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../include/fxcrt/fx_basic.h"
-void CFX_UTF8Decoder::Clear()
-{
- m_Buffer.Clear();
- m_PendingBytes = 0;
-}
-void CFX_UTF8Decoder::AppendChar(FX_DWORD ch)
-{
- m_Buffer.AppendChar((FX_WCHAR)ch);
-}
-void CFX_UTF8Decoder::Input(FX_BYTE byte)
-{
- if (byte < 0x80) {
- m_PendingBytes = 0;
- m_Buffer.AppendChar(byte);
- } else if (byte < 0xc0) {
- if (m_PendingBytes == 0) {
- return;
- }
- m_PendingBytes --;
- m_PendingChar |= (byte & 0x3f) << (m_PendingBytes * 6);
- if (m_PendingBytes == 0) {
- AppendChar(m_PendingChar);
- }
- } else if (byte < 0xe0) {
- m_PendingBytes = 1;
- m_PendingChar = (byte & 0x1f) << 6;
- } else if (byte < 0xf0) {
- m_PendingBytes = 2;
- m_PendingChar = (byte & 0x0f) << 12;
- } else if (byte < 0xf8) {
- m_PendingBytes = 3;
- m_PendingChar = (byte & 0x07) << 18;
- } else if (byte < 0xfc) {
- m_PendingBytes = 4;
- m_PendingChar = (byte & 0x03) << 24;
- } else if (byte < 0xfe) {
- m_PendingBytes = 5;
- m_PendingChar = (byte & 0x01) << 30;
- }
-}
-void CFX_UTF8Encoder::Input(FX_WCHAR unicode)
-{
- if ((FX_DWORD)unicode < 0x80) {
- m_Buffer.AppendChar(unicode);
- } else {
- if ((FX_DWORD)unicode >= 0x80000000) {
- return;
- }
- int nbytes = 0;
- if ((FX_DWORD)unicode < 0x800) {
- nbytes = 2;
- } else if ((FX_DWORD)unicode < 0x10000) {
- nbytes = 3;
- } else if ((FX_DWORD)unicode < 0x200000) {
- nbytes = 4;
- } else if ((FX_DWORD)unicode < 0x4000000) {
- nbytes = 5;
- } else {
- nbytes = 6;
- }
- static FX_BYTE prefix[] = {0xc0, 0xe0, 0xf0, 0xf8, 0xfc};
- int order = 1 << ((nbytes - 1) * 6);
- int code = unicode;
- m_Buffer.AppendChar(prefix[nbytes - 2] | (code / order));
- for (int i = 0; i < nbytes - 1; i ++) {
- code = code % order;
- order >>= 6;
- m_Buffer.AppendChar(0x80 | (code / order));
- }
- }
-}
-CFX_ByteString FX_UTF8Encode(FX_LPCWSTR pwsStr, FX_STRSIZE len)
-{
- FXSYS_assert(pwsStr != NULL);
- if (len < 0) {
- len = (FX_STRSIZE)FXSYS_wcslen(pwsStr);
- }
- CFX_UTF8Encoder encoder;
- while (len -- > 0) {
- encoder.Input(*pwsStr ++);
- }
- return encoder.GetResult();
-}
-void FX_UTF8Encode(FX_LPCWSTR pwsStr, FX_STRSIZE len, CFX_ByteStringL &utf8Str, IFX_Allocator* pAllocator)
-{
- FXSYS_assert(pwsStr != NULL);
- if (len < 0) {
- len = (FX_STRSIZE)FXSYS_wcslen(pwsStr);
- }
- CFX_UTF8Encoder encoder(pAllocator);
- while (len -- > 0) {
- encoder.Input(*pwsStr ++);
- }
- encoder.GetResult(utf8Str);
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fxcrt/fx_basic.h"
+void CFX_UTF8Decoder::Clear()
+{
+ m_Buffer.Clear();
+ m_PendingBytes = 0;
+}
+void CFX_UTF8Decoder::AppendChar(FX_DWORD ch)
+{
+ m_Buffer.AppendChar((FX_WCHAR)ch);
+}
+void CFX_UTF8Decoder::Input(FX_BYTE byte)
+{
+ if (byte < 0x80) {
+ m_PendingBytes = 0;
+ m_Buffer.AppendChar(byte);
+ } else if (byte < 0xc0) {
+ if (m_PendingBytes == 0) {
+ return;
+ }
+ m_PendingBytes --;
+ m_PendingChar |= (byte & 0x3f) << (m_PendingBytes * 6);
+ if (m_PendingBytes == 0) {
+ AppendChar(m_PendingChar);
+ }
+ } else if (byte < 0xe0) {
+ m_PendingBytes = 1;
+ m_PendingChar = (byte & 0x1f) << 6;
+ } else if (byte < 0xf0) {
+ m_PendingBytes = 2;
+ m_PendingChar = (byte & 0x0f) << 12;
+ } else if (byte < 0xf8) {
+ m_PendingBytes = 3;
+ m_PendingChar = (byte & 0x07) << 18;
+ } else if (byte < 0xfc) {
+ m_PendingBytes = 4;
+ m_PendingChar = (byte & 0x03) << 24;
+ } else if (byte < 0xfe) {
+ m_PendingBytes = 5;
+ m_PendingChar = (byte & 0x01) << 30;
+ }
+}
+void CFX_UTF8Encoder::Input(FX_WCHAR unicode)
+{
+ if ((FX_DWORD)unicode < 0x80) {
+ m_Buffer.AppendChar(unicode);
+ } else {
+ if ((FX_DWORD)unicode >= 0x80000000) {
+ return;
+ }
+ int nbytes = 0;
+ if ((FX_DWORD)unicode < 0x800) {
+ nbytes = 2;
+ } else if ((FX_DWORD)unicode < 0x10000) {
+ nbytes = 3;
+ } else if ((FX_DWORD)unicode < 0x200000) {
+ nbytes = 4;
+ } else if ((FX_DWORD)unicode < 0x4000000) {
+ nbytes = 5;
+ } else {
+ nbytes = 6;
+ }
+ static FX_BYTE prefix[] = {0xc0, 0xe0, 0xf0, 0xf8, 0xfc};
+ int order = 1 << ((nbytes - 1) * 6);
+ int code = unicode;
+ m_Buffer.AppendChar(prefix[nbytes - 2] | (code / order));
+ for (int i = 0; i < nbytes - 1; i ++) {
+ code = code % order;
+ order >>= 6;
+ m_Buffer.AppendChar(0x80 | (code / order));
+ }
+ }
+}
+CFX_ByteString FX_UTF8Encode(FX_LPCWSTR pwsStr, FX_STRSIZE len)
+{
+ FXSYS_assert(pwsStr != NULL);
+ if (len < 0) {
+ len = (FX_STRSIZE)FXSYS_wcslen(pwsStr);
+ }
+ CFX_UTF8Encoder encoder;
+ while (len -- > 0) {
+ encoder.Input(*pwsStr ++);
+ }
+ return encoder.GetResult();
+}
+void FX_UTF8Encode(FX_LPCWSTR pwsStr, FX_STRSIZE len, CFX_ByteStringL &utf8Str, IFX_Allocator* pAllocator)
+{
+ FXSYS_assert(pwsStr != NULL);
+ if (len < 0) {
+ len = (FX_STRSIZE)FXSYS_wcslen(pwsStr);
+ }
+ CFX_UTF8Encoder encoder(pAllocator);
+ while (len -- > 0) {
+ encoder.Input(*pwsStr ++);
+ }
+ encoder.GetResult(utf8Str);
+}
diff --git a/core/src/fxcrt/fx_basic_util.cpp b/core/src/fxcrt/fx_basic_util.cpp
index af4d42c0ae..1d947d3fed 100644
--- a/core/src/fxcrt/fx_basic_util.cpp
+++ b/core/src/fxcrt/fx_basic_util.cpp
@@ -1,444 +1,444 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../include/fxcrt/fx_basic.h"
-#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
-#include <sys/types.h>
-#include <dirent.h>
-#else
-#include <direct.h>
-#endif
-CFX_PrivateData::~CFX_PrivateData()
-{
- ClearAll();
-}
-void FX_PRIVATEDATA::FreeData()
-{
- if (m_pData == NULL) {
- return;
- }
- if (m_bSelfDestruct) {
- delete (CFX_DestructObject*)m_pData;
- } else if (m_pCallback) {
- m_pCallback(m_pData);
- }
-}
-void CFX_PrivateData::AddData(FX_LPVOID pModuleId, FX_LPVOID pData, PD_CALLBACK_FREEDATA callback, FX_BOOL bSelfDestruct)
-{
- if (pModuleId == NULL) {
- return;
- }
- FX_PRIVATEDATA* pList = m_DataList.GetData();
- int count = m_DataList.GetSize();
- for (int i = 0; i < count; i ++) {
- if (pList[i].m_pModuleId == pModuleId) {
- pList[i].FreeData();
- pList[i].m_pData = pData;
- pList[i].m_pCallback = callback;
- return;
- }
- }
- FX_PRIVATEDATA data = {pModuleId, pData, callback, bSelfDestruct};
- m_DataList.Add(data);
-}
-void CFX_PrivateData::SetPrivateData(FX_LPVOID pModuleId, FX_LPVOID pData, PD_CALLBACK_FREEDATA callback)
-{
- AddData(pModuleId, pData, callback, FALSE);
-}
-void CFX_PrivateData::SetPrivateObj(FX_LPVOID pModuleId, CFX_DestructObject* pObj)
-{
- AddData(pModuleId, pObj, NULL, TRUE);
-}
-FX_BOOL CFX_PrivateData::RemovePrivateData(FX_LPVOID pModuleId)
-{
- if (pModuleId == NULL) {
- return FALSE;
- }
- FX_PRIVATEDATA* pList = m_DataList.GetData();
- int count = m_DataList.GetSize();
- for (int i = 0; i < count; i ++) {
- if (pList[i].m_pModuleId == pModuleId) {
- m_DataList.RemoveAt(i);
- return TRUE;
- }
- }
- return FALSE;
-}
-FX_LPVOID CFX_PrivateData::GetPrivateData(FX_LPVOID pModuleId)
-{
- if (pModuleId == NULL) {
- return NULL;
- }
- FX_PRIVATEDATA* pList = m_DataList.GetData();
- int count = m_DataList.GetSize();
- for (int i = 0; i < count; i ++) {
- if (pList[i].m_pModuleId == pModuleId) {
- return pList[i].m_pData;
- }
- }
- return NULL;
-}
-void CFX_PrivateData::ClearAll()
-{
- FX_PRIVATEDATA* pList = m_DataList.GetData();
- int count = m_DataList.GetSize();
- for (int i = 0; i < count; i ++) {
- pList[i].FreeData();
- }
- m_DataList.RemoveAll();
-}
-void FX_atonum(FX_BSTR strc, FX_BOOL& bInteger, void* pData)
-{
- if (FXSYS_memchr(strc.GetPtr(), '.', strc.GetLength()) == NULL) {
- bInteger = TRUE;
- int cc = 0, integer = 0;
- FX_LPCSTR str = strc.GetCStr();
- int len = strc.GetLength();
- FX_BOOL bNegative = FALSE;
- if (str[0] == '+') {
- cc++;
- } else if (str[0] == '-') {
- bNegative = TRUE;
- cc++;
- }
- while (cc < len) {
- if (str[cc] < '0' || str[cc] > '9') {
- break;
- }
- integer = integer * 10 + str[cc] - '0';
- if (integer < 0) {
- break;
- }
- cc ++;
- }
- if (bNegative) {
- integer = -integer;
- }
- *(int*)pData = integer;
- } else {
- bInteger = FALSE;
- *(FX_FLOAT*)pData = FX_atof(strc);
- }
-}
-FX_FLOAT FX_atof(FX_BSTR strc)
-{
- if (strc.GetLength() == 0) {
- return 0.0;
- }
- int cc = 0;
- FX_BOOL bNegative = FALSE;
- FX_LPCSTR str = strc.GetCStr();
- int len = strc.GetLength();
- if (str[0] == '+') {
- cc++;
- } else if (str[0] == '-') {
- bNegative = TRUE;
- cc++;
- }
- while (cc < len) {
- if (str[cc] != '+' && str[cc] != '-') {
- break;
- }
- cc ++;
- }
- FX_FLOAT value = 0;
- while (cc < len) {
- if (str[cc] == '.') {
- break;
- }
- value = value * 10 + str[cc] - '0';
- cc ++;
- }
- static const FX_FLOAT fraction_scales[] = {0.1f, 0.01f, 0.001f, 0.0001f, 0.00001f, 0.000001f,
- 0.0000001f, 0.00000001f, 0.000000001f, 0.0000000001f, 0.00000000001f
- };
- int scale = 0;
- if (cc < len && str[cc] == '.') {
- cc ++;
- while (cc < len) {
- value += fraction_scales[scale] * (str[cc] - '0');
- scale ++;
- if (scale == sizeof fraction_scales / sizeof(FX_FLOAT)) {
- break;
- }
- cc ++;
- }
- }
- return bNegative ? -value : value;
-}
-static FX_BOOL FX_IsDigit(FX_BYTE ch)
-{
- return (ch >= '0' && ch <= '9') ? TRUE : FALSE;
-}
-static FX_BOOL FX_IsXDigit(FX_BYTE ch)
-{
- return (FX_IsDigit(ch) || (ch >= 'A' && ch <= 'F') || (ch >= 'a' && ch <= 'f')) ? TRUE : FALSE;
-}
-static FX_BYTE FX_MakeUpper(FX_BYTE ch)
-{
- if (ch < 'a' || ch > 'z') {
- return ch;
- }
- return ch - 32;
-}
-static int FX_HexToI(FX_BYTE ch)
-{
- ch = FX_MakeUpper(ch);
- return FX_IsDigit(ch) ? (ch - '0') : (ch - 55);
-}
-static const unsigned char url_encodeTable[128] = {
- 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 0, 1, 1, 0, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 1, 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, 1, 1, 1, 1, 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, 1, 1, 1, 1, 1,
-};
-CFX_ByteString FX_UrlEncode(const CFX_WideString& wsUrl)
-{
- const char arDigits[] = "0123456789ABCDEF";
- CFX_ByteString rUrl;
- int nLength = wsUrl.GetLength();
- for (int i = 0; i < nLength; i++) {
- FX_DWORD word = wsUrl.GetAt(i);
- if (word > 0x7F || url_encodeTable[word] == 1) {
- CFX_ByteString bsUri = CFX_ByteString::FromUnicode((FX_WORD)word);
- int nByte = bsUri.GetLength();
- for (int j = 0; j < nByte; j++) {
- rUrl += '%';
- FX_BYTE code = bsUri.GetAt(j);
- rUrl += arDigits[code >> 4];
- rUrl += arDigits[code & 0x0F];
- }
- } else {
- rUrl += CFX_ByteString::FromUnicode((FX_WORD)word);
- }
- }
- return rUrl;
-}
-CFX_WideString FX_UrlDecode(const CFX_ByteString& bsUrl)
-{
- CFX_ByteString rUrl;
- int nLength = bsUrl.GetLength();
- for (int i = 0; i < nLength; i++) {
- if (i < nLength - 2 && bsUrl[i] == '%' && FX_IsXDigit(bsUrl[i + 1]) && FX_IsXDigit(bsUrl[i + 2])) {
- rUrl += (FX_HexToI(bsUrl[i + 1]) << 4 | FX_HexToI(bsUrl[i + 2]));
- i += 2;
- } else {
- rUrl += bsUrl[i];
- }
- }
- return CFX_WideString::FromLocal(rUrl);
-}
-CFX_ByteString FX_EncodeURI(const CFX_WideString& wsURI)
-{
- const char arDigits[] = "0123456789ABCDEF";
- CFX_ByteString rURI;
- CFX_ByteString bsUri = wsURI.UTF8Encode();
- int nLength = bsUri.GetLength();
- for (int i = 0; i < nLength; i++) {
- FX_BYTE code = bsUri.GetAt(i);
- if (code > 0x7F || url_encodeTable[code] == 1) {
- rURI += '%';
- rURI += arDigits[code >> 4];
- rURI += arDigits[code & 0x0F];
- } else {
- rURI += code;
- }
- }
- return rURI;
-}
-CFX_WideString FX_DecodeURI(const CFX_ByteString& bsURI)
-{
- CFX_ByteString rURI;
- int nLength = bsURI.GetLength();
- for (int i = 0; i < nLength; i++) {
- if (i < nLength - 2 && bsURI[i] == '%' && FX_IsXDigit(bsURI[i + 1]) && FX_IsXDigit(bsURI[i + 2])) {
- rURI += (FX_HexToI(bsURI[i + 1]) << 4 | FX_HexToI(bsURI[i + 2]));
- i += 2;
- } else {
- rURI += bsURI[i];
- }
- }
- return CFX_WideString::FromUTF8(rURI);
-}
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
-class CFindFileData : public CFX_Object
-{
-public:
- virtual ~CFindFileData() {}
- HANDLE m_Handle;
- FX_BOOL m_bEnd;
-};
-class CFindFileDataA : public CFindFileData
-{
-public:
- virtual ~CFindFileDataA() {}
- WIN32_FIND_DATAA m_FindData;
-};
-class CFindFileDataW : public CFindFileData
-{
-public:
- virtual ~CFindFileDataW() {}
- WIN32_FIND_DATAW m_FindData;
-};
-#endif
-void* FX_OpenFolder(FX_LPCSTR path)
-{
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
-#ifndef _WIN32_WCE
- CFindFileDataA* pData = FX_NEW CFindFileDataA;
- if (!pData) {
- return NULL;
- }
-#ifdef _FX_WINAPI_PARTITION_DESKTOP_
- pData->m_Handle = FindFirstFileA(CFX_ByteString(path) + "/*.*", &pData->m_FindData);
-#else
- pData->m_Handle = FindFirstFileExA(CFX_ByteString(path) + "/*.*", FindExInfoStandard, &pData->m_FindData, FindExSearchNameMatch, NULL, 0);
-#endif
-#else
- CFindFileDataW* pData = FX_NEW CFindFileDataW;
- if (!pData) {
- return NULL;
- }
- pData->m_Handle = FindFirstFileW(CFX_WideString::FromLocal(path) + L"/*.*", &pData->m_FindData);
-#endif
- if (pData->m_Handle == INVALID_HANDLE_VALUE) {
- delete pData;
- return NULL;
- }
- pData->m_bEnd = FALSE;
- return pData;
-#else
- DIR* dir = opendir(path);
- return dir;
-#endif
-}
-void* FX_OpenFolder(FX_LPCWSTR path)
-{
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
- CFindFileDataW* pData = FX_NEW CFindFileDataW;
- if (!pData) {
- return NULL;
- }
-#ifdef _FX_WINAPI_PARTITION_DESKTOP_
- pData->m_Handle = FindFirstFileW(CFX_WideString(path) + L"/*.*", &pData->m_FindData);
-#else
- pData->m_Handle = FindFirstFileExW(CFX_WideString(path) + L"/*.*", FindExInfoStandard, &pData->m_FindData, FindExSearchNameMatch, NULL, 0);
-#endif
- if (pData->m_Handle == INVALID_HANDLE_VALUE) {
- delete pData;
- return NULL;
- }
- pData->m_bEnd = FALSE;
- return pData;
-#else
- DIR* dir = opendir(CFX_ByteString::FromUnicode(path));
- return dir;
-#endif
-}
-FX_BOOL FX_GetNextFile(void* handle, CFX_ByteString& filename, FX_BOOL& bFolder)
-{
- if (handle == NULL) {
- return FALSE;
- }
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
-#ifndef _WIN32_WCE
- CFindFileDataA* pData = (CFindFileDataA*)handle;
- if (pData->m_bEnd) {
- return FALSE;
- }
- filename = pData->m_FindData.cFileName;
- bFolder = pData->m_FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY;
- if (!FindNextFileA(pData->m_Handle, &pData->m_FindData)) {
- pData->m_bEnd = TRUE;
- }
- return TRUE;
-#else
- CFindFileDataW* pData = (CFindFileDataW*)handle;
- if (pData->m_bEnd) {
- return FALSE;
- }
- filename = CFX_ByteString::FromUnicode(pData->m_FindData.cFileName);
- bFolder = pData->m_FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY;
- if (!FindNextFileW(pData->m_Handle, &pData->m_FindData)) {
- pData->m_bEnd = TRUE;
- }
- return TRUE;
-#endif
-#elif defined(__native_client__)
- abort();
- return FALSE;
-#else
- struct dirent *de = readdir((DIR*)handle);
- if (de == NULL) {
- return FALSE;
- }
- filename = de->d_name;
- bFolder = de->d_type == DT_DIR;
- return TRUE;
-#endif
-}
-FX_BOOL FX_GetNextFile(void* handle, CFX_WideString& filename, FX_BOOL& bFolder)
-{
- if (handle == NULL) {
- return FALSE;
- }
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
- CFindFileDataW* pData = (CFindFileDataW*)handle;
- if (pData->m_bEnd) {
- return FALSE;
- }
- filename = pData->m_FindData.cFileName;
- bFolder = pData->m_FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY;
- if (!FindNextFileW(pData->m_Handle, &pData->m_FindData)) {
- pData->m_bEnd = TRUE;
- }
- return TRUE;
-#elif defined(__native_client__)
- abort();
- return FALSE;
-#else
- struct dirent *de = readdir((DIR*)handle);
- if (de == NULL) {
- return FALSE;
- }
- filename = CFX_WideString::FromLocal(de->d_name);
- bFolder = de->d_type == DT_DIR;
- return TRUE;
-#endif
-}
-void FX_CloseFolder(void* handle)
-{
- if (handle == NULL) {
- return;
- }
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
- CFindFileData* pData = (CFindFileData*)handle;
- FindClose(pData->m_Handle);
- delete pData;
-#else
- closedir((DIR*)handle);
-#endif
-}
-FX_WCHAR FX_GetFolderSeparator()
-{
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
- return '\\';
-#else
- return '/';
-#endif
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fxcrt/fx_basic.h"
+#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
+#include <sys/types.h>
+#include <dirent.h>
+#else
+#include <direct.h>
+#endif
+CFX_PrivateData::~CFX_PrivateData()
+{
+ ClearAll();
+}
+void FX_PRIVATEDATA::FreeData()
+{
+ if (m_pData == NULL) {
+ return;
+ }
+ if (m_bSelfDestruct) {
+ delete (CFX_DestructObject*)m_pData;
+ } else if (m_pCallback) {
+ m_pCallback(m_pData);
+ }
+}
+void CFX_PrivateData::AddData(FX_LPVOID pModuleId, FX_LPVOID pData, PD_CALLBACK_FREEDATA callback, FX_BOOL bSelfDestruct)
+{
+ if (pModuleId == NULL) {
+ return;
+ }
+ FX_PRIVATEDATA* pList = m_DataList.GetData();
+ int count = m_DataList.GetSize();
+ for (int i = 0; i < count; i ++) {
+ if (pList[i].m_pModuleId == pModuleId) {
+ pList[i].FreeData();
+ pList[i].m_pData = pData;
+ pList[i].m_pCallback = callback;
+ return;
+ }
+ }
+ FX_PRIVATEDATA data = {pModuleId, pData, callback, bSelfDestruct};
+ m_DataList.Add(data);
+}
+void CFX_PrivateData::SetPrivateData(FX_LPVOID pModuleId, FX_LPVOID pData, PD_CALLBACK_FREEDATA callback)
+{
+ AddData(pModuleId, pData, callback, FALSE);
+}
+void CFX_PrivateData::SetPrivateObj(FX_LPVOID pModuleId, CFX_DestructObject* pObj)
+{
+ AddData(pModuleId, pObj, NULL, TRUE);
+}
+FX_BOOL CFX_PrivateData::RemovePrivateData(FX_LPVOID pModuleId)
+{
+ if (pModuleId == NULL) {
+ return FALSE;
+ }
+ FX_PRIVATEDATA* pList = m_DataList.GetData();
+ int count = m_DataList.GetSize();
+ for (int i = 0; i < count; i ++) {
+ if (pList[i].m_pModuleId == pModuleId) {
+ m_DataList.RemoveAt(i);
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+FX_LPVOID CFX_PrivateData::GetPrivateData(FX_LPVOID pModuleId)
+{
+ if (pModuleId == NULL) {
+ return NULL;
+ }
+ FX_PRIVATEDATA* pList = m_DataList.GetData();
+ int count = m_DataList.GetSize();
+ for (int i = 0; i < count; i ++) {
+ if (pList[i].m_pModuleId == pModuleId) {
+ return pList[i].m_pData;
+ }
+ }
+ return NULL;
+}
+void CFX_PrivateData::ClearAll()
+{
+ FX_PRIVATEDATA* pList = m_DataList.GetData();
+ int count = m_DataList.GetSize();
+ for (int i = 0; i < count; i ++) {
+ pList[i].FreeData();
+ }
+ m_DataList.RemoveAll();
+}
+void FX_atonum(FX_BSTR strc, FX_BOOL& bInteger, void* pData)
+{
+ if (FXSYS_memchr(strc.GetPtr(), '.', strc.GetLength()) == NULL) {
+ bInteger = TRUE;
+ int cc = 0, integer = 0;
+ FX_LPCSTR str = strc.GetCStr();
+ int len = strc.GetLength();
+ FX_BOOL bNegative = FALSE;
+ if (str[0] == '+') {
+ cc++;
+ } else if (str[0] == '-') {
+ bNegative = TRUE;
+ cc++;
+ }
+ while (cc < len) {
+ if (str[cc] < '0' || str[cc] > '9') {
+ break;
+ }
+ integer = integer * 10 + str[cc] - '0';
+ if (integer < 0) {
+ break;
+ }
+ cc ++;
+ }
+ if (bNegative) {
+ integer = -integer;
+ }
+ *(int*)pData = integer;
+ } else {
+ bInteger = FALSE;
+ *(FX_FLOAT*)pData = FX_atof(strc);
+ }
+}
+FX_FLOAT FX_atof(FX_BSTR strc)
+{
+ if (strc.GetLength() == 0) {
+ return 0.0;
+ }
+ int cc = 0;
+ FX_BOOL bNegative = FALSE;
+ FX_LPCSTR str = strc.GetCStr();
+ int len = strc.GetLength();
+ if (str[0] == '+') {
+ cc++;
+ } else if (str[0] == '-') {
+ bNegative = TRUE;
+ cc++;
+ }
+ while (cc < len) {
+ if (str[cc] != '+' && str[cc] != '-') {
+ break;
+ }
+ cc ++;
+ }
+ FX_FLOAT value = 0;
+ while (cc < len) {
+ if (str[cc] == '.') {
+ break;
+ }
+ value = value * 10 + str[cc] - '0';
+ cc ++;
+ }
+ static const FX_FLOAT fraction_scales[] = {0.1f, 0.01f, 0.001f, 0.0001f, 0.00001f, 0.000001f,
+ 0.0000001f, 0.00000001f, 0.000000001f, 0.0000000001f, 0.00000000001f
+ };
+ int scale = 0;
+ if (cc < len && str[cc] == '.') {
+ cc ++;
+ while (cc < len) {
+ value += fraction_scales[scale] * (str[cc] - '0');
+ scale ++;
+ if (scale == sizeof fraction_scales / sizeof(FX_FLOAT)) {
+ break;
+ }
+ cc ++;
+ }
+ }
+ return bNegative ? -value : value;
+}
+static FX_BOOL FX_IsDigit(FX_BYTE ch)
+{
+ return (ch >= '0' && ch <= '9') ? TRUE : FALSE;
+}
+static FX_BOOL FX_IsXDigit(FX_BYTE ch)
+{
+ return (FX_IsDigit(ch) || (ch >= 'A' && ch <= 'F') || (ch >= 'a' && ch <= 'f')) ? TRUE : FALSE;
+}
+static FX_BYTE FX_MakeUpper(FX_BYTE ch)
+{
+ if (ch < 'a' || ch > 'z') {
+ return ch;
+ }
+ return ch - 32;
+}
+static int FX_HexToI(FX_BYTE ch)
+{
+ ch = FX_MakeUpper(ch);
+ return FX_IsDigit(ch) ? (ch - '0') : (ch - 55);
+}
+static const unsigned char url_encodeTable[128] = {
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 0, 1, 1, 0, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 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, 1, 1, 1, 1, 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, 1, 1, 1, 1, 1,
+};
+CFX_ByteString FX_UrlEncode(const CFX_WideString& wsUrl)
+{
+ const char arDigits[] = "0123456789ABCDEF";
+ CFX_ByteString rUrl;
+ int nLength = wsUrl.GetLength();
+ for (int i = 0; i < nLength; i++) {
+ FX_DWORD word = wsUrl.GetAt(i);
+ if (word > 0x7F || url_encodeTable[word] == 1) {
+ CFX_ByteString bsUri = CFX_ByteString::FromUnicode((FX_WORD)word);
+ int nByte = bsUri.GetLength();
+ for (int j = 0; j < nByte; j++) {
+ rUrl += '%';
+ FX_BYTE code = bsUri.GetAt(j);
+ rUrl += arDigits[code >> 4];
+ rUrl += arDigits[code & 0x0F];
+ }
+ } else {
+ rUrl += CFX_ByteString::FromUnicode((FX_WORD)word);
+ }
+ }
+ return rUrl;
+}
+CFX_WideString FX_UrlDecode(const CFX_ByteString& bsUrl)
+{
+ CFX_ByteString rUrl;
+ int nLength = bsUrl.GetLength();
+ for (int i = 0; i < nLength; i++) {
+ if (i < nLength - 2 && bsUrl[i] == '%' && FX_IsXDigit(bsUrl[i + 1]) && FX_IsXDigit(bsUrl[i + 2])) {
+ rUrl += (FX_HexToI(bsUrl[i + 1]) << 4 | FX_HexToI(bsUrl[i + 2]));
+ i += 2;
+ } else {
+ rUrl += bsUrl[i];
+ }
+ }
+ return CFX_WideString::FromLocal(rUrl);
+}
+CFX_ByteString FX_EncodeURI(const CFX_WideString& wsURI)
+{
+ const char arDigits[] = "0123456789ABCDEF";
+ CFX_ByteString rURI;
+ CFX_ByteString bsUri = wsURI.UTF8Encode();
+ int nLength = bsUri.GetLength();
+ for (int i = 0; i < nLength; i++) {
+ FX_BYTE code = bsUri.GetAt(i);
+ if (code > 0x7F || url_encodeTable[code] == 1) {
+ rURI += '%';
+ rURI += arDigits[code >> 4];
+ rURI += arDigits[code & 0x0F];
+ } else {
+ rURI += code;
+ }
+ }
+ return rURI;
+}
+CFX_WideString FX_DecodeURI(const CFX_ByteString& bsURI)
+{
+ CFX_ByteString rURI;
+ int nLength = bsURI.GetLength();
+ for (int i = 0; i < nLength; i++) {
+ if (i < nLength - 2 && bsURI[i] == '%' && FX_IsXDigit(bsURI[i + 1]) && FX_IsXDigit(bsURI[i + 2])) {
+ rURI += (FX_HexToI(bsURI[i + 1]) << 4 | FX_HexToI(bsURI[i + 2]));
+ i += 2;
+ } else {
+ rURI += bsURI[i];
+ }
+ }
+ return CFX_WideString::FromUTF8(rURI);
+}
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+class CFindFileData : public CFX_Object
+{
+public:
+ virtual ~CFindFileData() {}
+ HANDLE m_Handle;
+ FX_BOOL m_bEnd;
+};
+class CFindFileDataA : public CFindFileData
+{
+public:
+ virtual ~CFindFileDataA() {}
+ WIN32_FIND_DATAA m_FindData;
+};
+class CFindFileDataW : public CFindFileData
+{
+public:
+ virtual ~CFindFileDataW() {}
+ WIN32_FIND_DATAW m_FindData;
+};
+#endif
+void* FX_OpenFolder(FX_LPCSTR path)
+{
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+#ifndef _WIN32_WCE
+ CFindFileDataA* pData = FX_NEW CFindFileDataA;
+ if (!pData) {
+ return NULL;
+ }
+#ifdef _FX_WINAPI_PARTITION_DESKTOP_
+ pData->m_Handle = FindFirstFileA(CFX_ByteString(path) + "/*.*", &pData->m_FindData);
+#else
+ pData->m_Handle = FindFirstFileExA(CFX_ByteString(path) + "/*.*", FindExInfoStandard, &pData->m_FindData, FindExSearchNameMatch, NULL, 0);
+#endif
+#else
+ CFindFileDataW* pData = FX_NEW CFindFileDataW;
+ if (!pData) {
+ return NULL;
+ }
+ pData->m_Handle = FindFirstFileW(CFX_WideString::FromLocal(path) + L"/*.*", &pData->m_FindData);
+#endif
+ if (pData->m_Handle == INVALID_HANDLE_VALUE) {
+ delete pData;
+ return NULL;
+ }
+ pData->m_bEnd = FALSE;
+ return pData;
+#else
+ DIR* dir = opendir(path);
+ return dir;
+#endif
+}
+void* FX_OpenFolder(FX_LPCWSTR path)
+{
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+ CFindFileDataW* pData = FX_NEW CFindFileDataW;
+ if (!pData) {
+ return NULL;
+ }
+#ifdef _FX_WINAPI_PARTITION_DESKTOP_
+ pData->m_Handle = FindFirstFileW(CFX_WideString(path) + L"/*.*", &pData->m_FindData);
+#else
+ pData->m_Handle = FindFirstFileExW(CFX_WideString(path) + L"/*.*", FindExInfoStandard, &pData->m_FindData, FindExSearchNameMatch, NULL, 0);
+#endif
+ if (pData->m_Handle == INVALID_HANDLE_VALUE) {
+ delete pData;
+ return NULL;
+ }
+ pData->m_bEnd = FALSE;
+ return pData;
+#else
+ DIR* dir = opendir(CFX_ByteString::FromUnicode(path));
+ return dir;
+#endif
+}
+FX_BOOL FX_GetNextFile(void* handle, CFX_ByteString& filename, FX_BOOL& bFolder)
+{
+ if (handle == NULL) {
+ return FALSE;
+ }
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+#ifndef _WIN32_WCE
+ CFindFileDataA* pData = (CFindFileDataA*)handle;
+ if (pData->m_bEnd) {
+ return FALSE;
+ }
+ filename = pData->m_FindData.cFileName;
+ bFolder = pData->m_FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY;
+ if (!FindNextFileA(pData->m_Handle, &pData->m_FindData)) {
+ pData->m_bEnd = TRUE;
+ }
+ return TRUE;
+#else
+ CFindFileDataW* pData = (CFindFileDataW*)handle;
+ if (pData->m_bEnd) {
+ return FALSE;
+ }
+ filename = CFX_ByteString::FromUnicode(pData->m_FindData.cFileName);
+ bFolder = pData->m_FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY;
+ if (!FindNextFileW(pData->m_Handle, &pData->m_FindData)) {
+ pData->m_bEnd = TRUE;
+ }
+ return TRUE;
+#endif
+#elif defined(__native_client__)
+ abort();
+ return FALSE;
+#else
+ struct dirent *de = readdir((DIR*)handle);
+ if (de == NULL) {
+ return FALSE;
+ }
+ filename = de->d_name;
+ bFolder = de->d_type == DT_DIR;
+ return TRUE;
+#endif
+}
+FX_BOOL FX_GetNextFile(void* handle, CFX_WideString& filename, FX_BOOL& bFolder)
+{
+ if (handle == NULL) {
+ return FALSE;
+ }
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+ CFindFileDataW* pData = (CFindFileDataW*)handle;
+ if (pData->m_bEnd) {
+ return FALSE;
+ }
+ filename = pData->m_FindData.cFileName;
+ bFolder = pData->m_FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY;
+ if (!FindNextFileW(pData->m_Handle, &pData->m_FindData)) {
+ pData->m_bEnd = TRUE;
+ }
+ return TRUE;
+#elif defined(__native_client__)
+ abort();
+ return FALSE;
+#else
+ struct dirent *de = readdir((DIR*)handle);
+ if (de == NULL) {
+ return FALSE;
+ }
+ filename = CFX_WideString::FromLocal(de->d_name);
+ bFolder = de->d_type == DT_DIR;
+ return TRUE;
+#endif
+}
+void FX_CloseFolder(void* handle)
+{
+ if (handle == NULL) {
+ return;
+ }
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+ CFindFileData* pData = (CFindFileData*)handle;
+ FindClose(pData->m_Handle);
+ delete pData;
+#else
+ closedir((DIR*)handle);
+#endif
+}
+FX_WCHAR FX_GetFolderSeparator()
+{
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+ return '\\';
+#else
+ return '/';
+#endif
+}
diff --git a/core/src/fxcrt/fx_basic_wstring.cpp b/core/src/fxcrt/fx_basic_wstring.cpp
index 900f05846a..7af3303ca2 100644
--- a/core/src/fxcrt/fx_basic_wstring.cpp
+++ b/core/src/fxcrt/fx_basic_wstring.cpp
@@ -1,1168 +1,1168 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../include/fxcrt/fx_basic.h"
-static CFX_StringDataW* FX_AllocStringW(int nLen)
-{
- if (nLen == 0) {
- return NULL;
- }
- CFX_StringDataW* pData = (CFX_StringDataW*)FX_Alloc(FX_BYTE, sizeof(long) * 3 + (nLen + 1) * sizeof(FX_WCHAR));
- if (!pData) {
- return NULL;
- }
- pData->m_nAllocLength = nLen;
- pData->m_nDataLength = nLen;
- pData->m_nRefs = 1;
- pData->m_String[nLen] = 0;
- return pData;
-}
-static void FX_ReleaseStringW(CFX_StringDataW* pData)
-{
- if (pData == NULL) {
- return;
- }
- pData->m_nRefs --;
- if (pData->m_nRefs <= 0) {
- FX_Free(pData);
- }
-}
-CFX_WideString::~CFX_WideString()
-{
- if (m_pData == NULL) {
- return;
- }
- m_pData->m_nRefs --;
- if (m_pData->m_nRefs < 1) {
- FX_Free(m_pData);
- }
-}
-void CFX_WideString::InitStr(FX_LPCWSTR lpsz, FX_STRSIZE nLen)
-{
- if (nLen < 0) {
- nLen = lpsz ? (FX_STRSIZE)FXSYS_wcslen(lpsz) : 0;
- }
- if (nLen) {
- m_pData = FX_AllocStringW(nLen);
- if (!m_pData) {
- return;
- }
- FXSYS_memcpy32(m_pData->m_String, lpsz, nLen * sizeof(FX_WCHAR));
- } else {
- m_pData = NULL;
- }
-}
-CFX_WideString::CFX_WideString(const CFX_WideString& stringSrc)
-{
- if (stringSrc.m_pData == NULL) {
- m_pData = NULL;
- return;
- }
- if (stringSrc.m_pData->m_nRefs >= 0) {
- m_pData = stringSrc.m_pData;
- m_pData->m_nRefs ++;
- } else {
- m_pData = NULL;
- *this = stringSrc;
- }
-}
-CFX_WideString::CFX_WideString(FX_WCHAR ch)
-{
- m_pData = FX_AllocStringW(1);
- if (m_pData) {
- m_pData->m_String[0] = ch;
- }
-}
-CFX_WideString::CFX_WideString(const CFX_WideStringC& str)
-{
- if (str.IsEmpty()) {
- m_pData = NULL;
- return;
- }
- m_pData = FX_AllocStringW(str.GetLength());
- if (m_pData) {
- FXSYS_memcpy32(m_pData->m_String, str.GetPtr(), str.GetLength()*sizeof(FX_WCHAR));
- }
-}
-CFX_WideString::CFX_WideString(const CFX_WideStringC& str1, const CFX_WideStringC& str2)
-{
- m_pData = NULL;
- int nNewLen = str1.GetLength() + str2.GetLength();
- if (nNewLen == 0) {
- return;
- }
- m_pData = FX_AllocStringW(nNewLen);
- if (m_pData) {
- FXSYS_memcpy32(m_pData->m_String, str1.GetPtr(), str1.GetLength()*sizeof(FX_WCHAR));
- FXSYS_memcpy32(m_pData->m_String + str1.GetLength(), str2.GetPtr(), str2.GetLength()*sizeof(FX_WCHAR));
- }
-}
-void CFX_WideString::ReleaseBuffer(FX_STRSIZE nNewLength)
-{
- if (m_pData == NULL) {
- return;
- }
- CopyBeforeWrite();
- if (nNewLength == -1) {
- nNewLength = m_pData ? (FX_STRSIZE)FXSYS_wcslen(m_pData->m_String) : 0;
- }
- if (nNewLength == 0) {
- Empty();
- return;
- }
- FXSYS_assert(nNewLength <= m_pData->m_nAllocLength);
- m_pData->m_nDataLength = nNewLength;
- m_pData->m_String[nNewLength] = 0;
-}
-const CFX_WideString& CFX_WideString::operator=(FX_LPCWSTR lpsz)
-{
- if (lpsz == NULL || lpsz[0] == 0) {
- Empty();
- } else {
- AssignCopy((FX_STRSIZE)FXSYS_wcslen(lpsz), lpsz);
- }
- return *this;
-}
-const CFX_WideString& CFX_WideString::operator=(const CFX_WideStringC& stringSrc)
-{
- if (stringSrc.IsEmpty()) {
- Empty();
- } else {
- AssignCopy(stringSrc.GetLength(), stringSrc.GetPtr());
- }
- return *this;
-}
-const CFX_WideString& CFX_WideString::operator=(const CFX_WideString& stringSrc)
-{
- if (m_pData == stringSrc.m_pData) {
- return *this;
- }
- if (stringSrc.IsEmpty()) {
- Empty();
- } else if ((m_pData && m_pData->m_nRefs < 0) ||
- (stringSrc.m_pData && stringSrc.m_pData->m_nRefs < 0)) {
- AssignCopy(stringSrc.m_pData->m_nDataLength, stringSrc.m_pData->m_String);
- } else {
- Empty();
- m_pData = stringSrc.m_pData;
- if (m_pData) {
- m_pData->m_nRefs ++;
- }
- }
- return *this;
-}
-const CFX_WideString& CFX_WideString::operator+=(FX_WCHAR ch)
-{
- ConcatInPlace(1, &ch);
- return *this;
-}
-const CFX_WideString& CFX_WideString::operator+=(FX_LPCWSTR lpsz)
-{
- if (lpsz) {
- ConcatInPlace((FX_STRSIZE)FXSYS_wcslen(lpsz), lpsz);
- }
- return *this;
-}
-const CFX_WideString& CFX_WideString::operator+=(const CFX_WideString& string)
-{
- if (string.m_pData == NULL) {
- return *this;
- }
- ConcatInPlace(string.m_pData->m_nDataLength, string.m_pData->m_String);
- return *this;
-}
-const CFX_WideString& CFX_WideString::operator+=(const CFX_WideStringC& string)
-{
- if (string.IsEmpty()) {
- return *this;
- }
- ConcatInPlace(string.GetLength(), string.GetPtr());
- return *this;
-}
-bool operator==(const CFX_WideString& s1, FX_LPCWSTR s2)
-{
- return s1.Equal(s2);
-}
-bool operator==(FX_LPCWSTR s1, const CFX_WideString& s2)
-{
- return s2.Equal(s1);
-}
-bool operator==(const CFX_WideString& s1, const CFX_WideString& s2)
-{
- return s1.Equal(s2);
-}
-bool operator==(const CFX_WideString& s1, const CFX_WideStringC& s2)
-{
- return s1.Equal(s2);
-}
-bool operator==(const CFX_WideStringC& s1, const CFX_WideString& s2)
-{
- return s2.Equal(s1);
-}
-bool operator != (const CFX_WideString& s1, FX_LPCWSTR s2)
-{
- return !s1.Equal(s2);
-}
-bool operator!=(const CFX_WideString& s1, const CFX_WideString& s2)
-{
- return !s1.Equal(s2);
-}
-bool operator!=(const CFX_WideString& s1, const CFX_WideStringC& s2)
-{
- return !s1.Equal(s2);
-}
-bool operator!=(const CFX_WideStringC& s1, const CFX_WideString& s2)
-{
- return !s2.Equal(s1);
-}
-bool CFX_WideString::Equal(const CFX_WideStringC& str) const
-{
- if (m_pData == NULL) {
- return str.IsEmpty();
- }
- return str.GetLength() == m_pData->m_nDataLength &&
- FXSYS_memcmp32(str.GetPtr(), m_pData->m_String, m_pData->m_nDataLength * sizeof(FX_WCHAR)) == 0;
-}
-void CFX_WideString::Empty()
-{
- if (m_pData == NULL) {
- return;
- }
- if (m_pData->m_nRefs > 1) {
- m_pData->m_nRefs --;
- } else {
- FX_Free(m_pData);
- }
- m_pData = NULL;
-}
-void CFX_WideString::ConcatInPlace(FX_STRSIZE nSrcLen, FX_LPCWSTR lpszSrcData)
-{
- if (nSrcLen == 0 || lpszSrcData == NULL) {
- return;
- }
- if (m_pData == NULL) {
- m_pData = FX_AllocStringW(nSrcLen);
- if (m_pData) {
- FXSYS_memcpy32(m_pData->m_String, lpszSrcData, nSrcLen * sizeof(FX_WCHAR));
- }
- return;
- }
- if (m_pData->m_nRefs > 1 || m_pData->m_nDataLength + nSrcLen > m_pData->m_nAllocLength) {
- CFX_StringDataW* pOldData = m_pData;
- ConcatCopy(m_pData->m_nDataLength, m_pData->m_String, nSrcLen, lpszSrcData);
- FX_ReleaseStringW(pOldData);
- } else {
- FXSYS_memcpy32(m_pData->m_String + m_pData->m_nDataLength, lpszSrcData, nSrcLen * sizeof(FX_WCHAR));
- m_pData->m_nDataLength += nSrcLen;
- m_pData->m_String[m_pData->m_nDataLength] = 0;
- }
-}
-void CFX_WideString::ConcatCopy(FX_STRSIZE nSrc1Len, FX_LPCWSTR lpszSrc1Data,
- FX_STRSIZE nSrc2Len, FX_LPCWSTR lpszSrc2Data)
-{
- FX_STRSIZE nNewLen = nSrc1Len + nSrc2Len;
- if (nNewLen == 0) {
- return;
- }
- m_pData = FX_AllocStringW(nNewLen);
- if (m_pData) {
- FXSYS_memcpy32(m_pData->m_String, lpszSrc1Data, nSrc1Len * sizeof(FX_WCHAR));
- FXSYS_memcpy32(m_pData->m_String + nSrc1Len, lpszSrc2Data, nSrc2Len * sizeof(FX_WCHAR));
- }
-}
-void CFX_WideString::CopyBeforeWrite()
-{
- if (m_pData == NULL || m_pData->m_nRefs <= 1) {
- return;
- }
- CFX_StringDataW* pData = m_pData;
- m_pData->m_nRefs --;
- FX_STRSIZE nDataLength = pData->m_nDataLength;
- m_pData = FX_AllocStringW(nDataLength);
- if (m_pData != NULL) {
- FXSYS_memcpy32(m_pData->m_String, pData->m_String, (nDataLength + 1) * sizeof(FX_WCHAR));
- }
-}
-void CFX_WideString::AllocBeforeWrite(FX_STRSIZE nLen)
-{
- if (m_pData && m_pData->m_nRefs <= 1 && m_pData->m_nAllocLength >= nLen) {
- return;
- }
- Empty();
- m_pData = FX_AllocStringW(nLen);
-}
-void CFX_WideString::AssignCopy(FX_STRSIZE nSrcLen, FX_LPCWSTR lpszSrcData)
-{
- AllocBeforeWrite(nSrcLen);
- FXSYS_memcpy32(m_pData->m_String, lpszSrcData, nSrcLen * sizeof(FX_WCHAR));
- m_pData->m_nDataLength = nSrcLen;
- m_pData->m_String[nSrcLen] = 0;
-}
-int CFX_WideString::Compare(FX_LPCWSTR lpsz) const
-{
- if (m_pData == NULL) {
- return (lpsz == NULL || lpsz[0] == 0) ? 0 : -1;
- }
- return FXSYS_wcscmp(m_pData->m_String, lpsz);
-}
-CFX_ByteString CFX_WideString::UTF8Encode() const
-{
- return FX_UTF8Encode(*this);
-}
-CFX_ByteString CFX_WideString::UTF16LE_Encode(FX_BOOL bTerminate) const
-{
- if (m_pData == NULL) {
- return bTerminate ? CFX_ByteString(FX_BSTRC("\0\0")) : CFX_ByteString();
- }
- int len = m_pData->m_nDataLength;
- CFX_ByteString result;
- FX_LPSTR buffer = result.GetBuffer(len * 2 + (bTerminate ? 2 : 0));
- for (int i = 0; i < len; i ++) {
- buffer[i * 2] = m_pData->m_String[i] & 0xff;
- buffer[i * 2 + 1] = m_pData->m_String[i] >> 8;
- }
- if (bTerminate) {
- buffer[len * 2] = 0;
- buffer[len * 2 + 1] = 0;
- result.ReleaseBuffer(len * 2 + 2);
- } else {
- result.ReleaseBuffer(len * 2);
- }
- return result;
-}
-void CFX_WideString::ConvertFrom(const CFX_ByteString& str, CFX_CharMap* pCharMap)
-{
- if (pCharMap == NULL) {
- pCharMap = CFX_CharMap::GetDefaultMapper();
- }
- *this = pCharMap->m_GetWideString(pCharMap, str);
-}
-void CFX_WideString::Reserve(FX_STRSIZE len)
-{
- GetBuffer(len);
- ReleaseBuffer(GetLength());
-}
-FX_LPWSTR CFX_WideString::GetBuffer(FX_STRSIZE nMinBufLength)
-{
- if (m_pData == NULL && nMinBufLength == 0) {
- return NULL;
- }
- if (m_pData && m_pData->m_nRefs <= 1 && m_pData->m_nAllocLength >= nMinBufLength) {
- return m_pData->m_String;
- }
- if (m_pData == NULL) {
- m_pData = FX_AllocStringW(nMinBufLength);
- if (!m_pData) {
- return NULL;
- }
- m_pData->m_nDataLength = 0;
- m_pData->m_String[0] = 0;
- return m_pData->m_String;
- }
- CFX_StringDataW* pOldData = m_pData;
- FX_STRSIZE nOldLen = pOldData->m_nDataLength;
- if (nMinBufLength < nOldLen) {
- nMinBufLength = nOldLen;
- }
- m_pData = FX_AllocStringW(nMinBufLength);
- if (!m_pData) {
- return NULL;
- }
- FXSYS_memcpy32(m_pData->m_String, pOldData->m_String, (nOldLen + 1)*sizeof(FX_WCHAR));
- m_pData->m_nDataLength = nOldLen;
- pOldData->m_nRefs --;
- if (pOldData->m_nRefs <= 0) {
- FX_Free(pOldData);
- }
- return m_pData->m_String;
-}
-CFX_WideString CFX_WideString::FromLocal(const char* str, FX_STRSIZE len)
-{
- CFX_WideString result;
- result.ConvertFrom(CFX_ByteString(str, len));
- return result;
-}
-CFX_WideString CFX_WideString::FromUTF8(const char* str, FX_STRSIZE len)
-{
- if (!str) {
- return CFX_WideString();
- }
- if (len < 0) {
- len = 0;
- while (str[len]) {
- len ++;
- }
- }
- CFX_UTF8Decoder decoder;
- for (FX_STRSIZE i = 0; i < len; i ++) {
- decoder.Input(str[i]);
- }
- return decoder.GetResult();
-}
-CFX_WideString CFX_WideString::FromUTF16LE(const unsigned short* wstr, FX_STRSIZE wlen)
-{
- if (!wstr || !wlen) {
- return CFX_WideString();
- }
- if (wlen < 0) {
- wlen = 0;
- while (wstr[wlen]) {
- wlen ++;
- }
- }
- CFX_WideString result;
- FX_WCHAR* buf = result.GetBuffer(wlen);
- for (int i = 0; i < wlen; i ++) {
- buf[i] = wstr[i];
- }
- result.ReleaseBuffer(wlen);
- return result;
-}
-void CFX_WideString::AllocCopy(CFX_WideString& dest, FX_STRSIZE nCopyLen, FX_STRSIZE nCopyIndex,
- FX_STRSIZE nExtraLen) const
-{
- FX_STRSIZE nNewLen = nCopyLen + nExtraLen;
- if (nNewLen == 0) {
- return;
- }
- ASSERT(dest.m_pData == NULL);
- dest.m_pData = FX_AllocStringW(nNewLen);
- if (dest.m_pData) {
- FXSYS_memcpy32(dest.m_pData->m_String, m_pData->m_String + nCopyIndex, nCopyLen * sizeof(FX_WCHAR));
- }
-}
-CFX_WideString CFX_WideString::Left(FX_STRSIZE nCount) const
-{
- if (m_pData == NULL) {
- return CFX_WideString();
- }
- if (nCount < 0) {
- nCount = 0;
- }
- if (nCount >= m_pData->m_nDataLength) {
- return *this;
- }
- CFX_WideString dest;
- AllocCopy(dest, nCount, 0, 0);
- return dest;
-}
-CFX_WideString CFX_WideString::Mid(FX_STRSIZE nFirst) const
-{
- return Mid(nFirst, m_pData->m_nDataLength - nFirst);
-}
-CFX_WideString CFX_WideString::Mid(FX_STRSIZE nFirst, FX_STRSIZE nCount) const
-{
- if (m_pData == NULL) {
- return CFX_WideString();
- }
- if (nFirst < 0) {
- nFirst = 0;
- }
- if (nCount < 0) {
- nCount = 0;
- }
- if (nFirst + nCount > m_pData->m_nDataLength) {
- nCount = m_pData->m_nDataLength - nFirst;
- }
- if (nFirst > m_pData->m_nDataLength) {
- nCount = 0;
- }
- if (nFirst == 0 && nFirst + nCount == m_pData->m_nDataLength) {
- return *this;
- }
- CFX_WideString dest;
- AllocCopy(dest, nCount, nFirst, 0);
- return dest;
-}
-CFX_WideString CFX_WideString::Right(FX_STRSIZE nCount) const
-{
- if (m_pData == NULL) {
- return CFX_WideString();
- }
- if (nCount < 0) {
- nCount = 0;
- }
- if (nCount >= m_pData->m_nDataLength) {
- return *this;
- }
- CFX_WideString dest;
- AllocCopy(dest, nCount, m_pData->m_nDataLength - nCount, 0);
- return dest;
-}
-int CFX_WideString::CompareNoCase(FX_LPCWSTR lpsz) const
-{
- if (m_pData == NULL) {
- return (lpsz == NULL || lpsz[0] == 0) ? 0 : -1;
- }
- return FXSYS_wcsicmp(m_pData->m_String, lpsz);
-}
-int CFX_WideString::Compare(const CFX_WideString& str) const
-{
- if (m_pData == NULL) {
- if (str.m_pData == NULL) {
- return 0;
- }
- return -1;
- } else if (str.m_pData == NULL) {
- return 1;
- }
- int this_len = m_pData->m_nDataLength;
- int that_len = str.m_pData->m_nDataLength;
- int min_len = this_len < that_len ? this_len : that_len;
- for (int i = 0; i < min_len; i ++) {
- if (m_pData->m_String[i] < str.m_pData->m_String[i]) {
- return -1;
- } else if (m_pData->m_String[i] > str.m_pData->m_String[i]) {
- return 1;
- }
- }
- if (this_len < that_len) {
- return -1;
- } else if (this_len > that_len) {
- return 1;
- }
- return 0;
-}
-FX_LPWSTR CFX_WideString::LockBuffer()
-{
- if (m_pData == NULL) {
- return NULL;
- }
- FX_LPWSTR lpsz = GetBuffer(0);
- m_pData->m_nRefs = -1;
- return lpsz;
-}
-void CFX_WideString::SetAt(FX_STRSIZE nIndex, FX_WCHAR ch)
-{
- if (m_pData == NULL) {
- return;
- }
- ASSERT(nIndex >= 0);
- ASSERT(nIndex < m_pData->m_nDataLength);
- CopyBeforeWrite();
- m_pData->m_String[nIndex] = ch;
-}
-void CFX_WideString::MakeLower()
-{
- if (m_pData == NULL) {
- return;
- }
- CopyBeforeWrite();
- if (GetLength() < 1) {
- return;
- }
- FXSYS_wcslwr(m_pData->m_String);
-}
-void CFX_WideString::MakeUpper()
-{
- if (m_pData == NULL) {
- return;
- }
- CopyBeforeWrite();
- if (GetLength() < 1) {
- return;
- }
- FXSYS_wcsupr(m_pData->m_String);
-}
-FX_STRSIZE CFX_WideString::Find(FX_LPCWSTR lpszSub, FX_STRSIZE nStart) const
-{
- FX_STRSIZE nLength = GetLength();
- if (nLength < 1 || nStart > nLength) {
- return -1;
- }
- FX_LPCWSTR lpsz = (FX_LPCWSTR)FXSYS_wcsstr(m_pData->m_String + nStart, lpszSub);
- return (lpsz == NULL) ? -1 : (int)(lpsz - m_pData->m_String);
-}
-FX_STRSIZE CFX_WideString::Find(FX_WCHAR ch, FX_STRSIZE nStart) const
-{
- if (m_pData == NULL) {
- return -1;
- }
- FX_STRSIZE nLength = m_pData->m_nDataLength;
- if (nStart >= nLength) {
- return -1;
- }
- FX_LPCWSTR lpsz = (FX_LPCWSTR)FXSYS_wcschr(m_pData->m_String + nStart, ch);
- return (lpsz == NULL) ? -1 : (int)(lpsz - m_pData->m_String);
-}
-void CFX_WideString::TrimRight(FX_LPCWSTR lpszTargetList)
-{
- FXSYS_assert(lpszTargetList != NULL);
- if (m_pData == NULL || *lpszTargetList == 0) {
- return;
- }
- CopyBeforeWrite();
- FX_STRSIZE len = GetLength();
- if (len < 1) {
- return;
- }
- FX_STRSIZE pos = len;
- while (pos) {
- if (FXSYS_wcschr(lpszTargetList, m_pData->m_String[pos - 1]) == NULL) {
- break;
- }
- pos --;
- }
- if (pos < len) {
- m_pData->m_String[pos] = 0;
- m_pData->m_nDataLength = pos;
- }
-}
-void CFX_WideString::TrimRight(FX_WCHAR chTarget)
-{
- FX_WCHAR str[2] = {chTarget, 0};
- TrimRight(str);
-}
-void CFX_WideString::TrimRight()
-{
- TrimRight(L"\x09\x0a\x0b\x0c\x0d\x20");
-}
-void CFX_WideString::TrimLeft(FX_LPCWSTR lpszTargets)
-{
- FXSYS_assert(lpszTargets != NULL);
- if (m_pData == NULL || *lpszTargets == 0) {
- return;
- }
- CopyBeforeWrite();
- if (GetLength() < 1) {
- return;
- }
- FX_LPCWSTR lpsz = m_pData->m_String;
- while (*lpsz != 0) {
- if (FXSYS_wcschr(lpszTargets, *lpsz) == NULL) {
- break;
- }
- lpsz ++;
- }
- if (lpsz != m_pData->m_String) {
- int nDataLength = m_pData->m_nDataLength - (FX_STRSIZE)(lpsz - m_pData->m_String);
- FXSYS_memmove32(m_pData->m_String, lpsz, (nDataLength + 1)*sizeof(FX_WCHAR));
- m_pData->m_nDataLength = nDataLength;
- }
-}
-void CFX_WideString::TrimLeft(FX_WCHAR chTarget)
-{
- FX_WCHAR str[2] = {chTarget, 0};
- TrimLeft(str);
-}
-void CFX_WideString::TrimLeft()
-{
- TrimLeft(L"\x09\x0a\x0b\x0c\x0d\x20");
-}
-FX_STRSIZE CFX_WideString::Replace(FX_LPCWSTR lpszOld, FX_LPCWSTR lpszNew)
-{
- if (GetLength() < 1) {
- return 0;
- }
- if (lpszOld == NULL) {
- return 0;
- }
- FX_STRSIZE nSourceLen = (FX_STRSIZE)FXSYS_wcslen(lpszOld);
- if (nSourceLen == 0) {
- return 0;
- }
- FX_STRSIZE nReplacementLen = lpszNew ? (FX_STRSIZE)FXSYS_wcslen(lpszNew) : 0;
- FX_STRSIZE nCount = 0;
- FX_LPWSTR lpszStart = m_pData->m_String;
- FX_LPWSTR lpszEnd = m_pData->m_String + m_pData->m_nDataLength;
- FX_LPWSTR lpszTarget;
- {
- while ((lpszTarget = (FX_LPWSTR)FXSYS_wcsstr(lpszStart, lpszOld)) != NULL && lpszStart < lpszEnd) {
- nCount++;
- lpszStart = lpszTarget + nSourceLen;
- }
- }
- if (nCount > 0) {
- CopyBeforeWrite();
- FX_STRSIZE nOldLength = m_pData->m_nDataLength;
- FX_STRSIZE nNewLength = nOldLength + (nReplacementLen - nSourceLen) * nCount;
- if (m_pData->m_nAllocLength < nNewLength || m_pData->m_nRefs > 1) {
- CFX_StringDataW* pOldData = m_pData;
- FX_LPCWSTR pstr = m_pData->m_String;
- m_pData = FX_AllocStringW(nNewLength);
- if (!m_pData) {
- return 0;
- }
- FXSYS_memcpy32(m_pData->m_String, pstr, pOldData->m_nDataLength * sizeof(FX_WCHAR));
- FX_ReleaseStringW(pOldData);
- }
- lpszStart = m_pData->m_String;
- lpszEnd = m_pData->m_String + FX_MAX(m_pData->m_nDataLength, nNewLength);
- {
- while ((lpszTarget = (FX_LPWSTR)FXSYS_wcsstr(lpszStart, lpszOld)) != NULL && lpszStart < lpszEnd) {
- FX_STRSIZE nBalance = nOldLength - (FX_STRSIZE)(lpszTarget - m_pData->m_String + nSourceLen);
- FXSYS_memmove32(lpszTarget + nReplacementLen, lpszTarget + nSourceLen, nBalance * sizeof(FX_WCHAR));
- FXSYS_memcpy32(lpszTarget, lpszNew, nReplacementLen * sizeof(FX_WCHAR));
- lpszStart = lpszTarget + nReplacementLen;
- lpszStart[nBalance] = 0;
- nOldLength += (nReplacementLen - nSourceLen);
- }
- }
- ASSERT(m_pData->m_String[nNewLength] == 0);
- m_pData->m_nDataLength = nNewLength;
- }
- return nCount;
-}
-FX_STRSIZE CFX_WideString::Insert(FX_STRSIZE nIndex, FX_WCHAR ch)
-{
- CopyBeforeWrite();
- if (nIndex < 0) {
- nIndex = 0;
- }
- FX_STRSIZE nNewLength = GetLength();
- if (nIndex > nNewLength) {
- nIndex = nNewLength;
- }
- nNewLength++;
- if (m_pData == NULL || m_pData->m_nAllocLength < nNewLength) {
- CFX_StringDataW* pOldData = m_pData;
- FX_LPCWSTR pstr = m_pData->m_String;
- m_pData = FX_AllocStringW(nNewLength);
- if (!m_pData) {
- return 0;
- }
- if(pOldData != NULL) {
- FXSYS_memmove32(m_pData->m_String, pstr, (pOldData->m_nDataLength + 1)*sizeof(FX_WCHAR));
- FX_ReleaseStringW(pOldData);
- } else {
- m_pData->m_String[0] = 0;
- }
- }
- FXSYS_memmove32(m_pData->m_String + nIndex + 1,
- m_pData->m_String + nIndex, (nNewLength - nIndex)*sizeof(FX_WCHAR));
- m_pData->m_String[nIndex] = ch;
- m_pData->m_nDataLength = nNewLength;
- return nNewLength;
-}
-FX_STRSIZE CFX_WideString::Delete(FX_STRSIZE nIndex, FX_STRSIZE nCount)
-{
- if (GetLength() < 1) {
- return 0;
- }
- if (nIndex < 0) {
- nIndex = 0;
- }
- FX_STRSIZE nOldLength = m_pData->m_nDataLength;
- if (nCount > 0 && nIndex < nOldLength) {
- CopyBeforeWrite();
- int nBytesToCopy = nOldLength - (nIndex + nCount) + 1;
- FXSYS_memmove32(m_pData->m_String + nIndex,
- m_pData->m_String + nIndex + nCount, nBytesToCopy * sizeof(FX_WCHAR));
- m_pData->m_nDataLength = nOldLength - nCount;
- }
- return m_pData->m_nDataLength;
-}
-FX_STRSIZE CFX_WideString::Remove(FX_WCHAR chRemove)
-{
- if (m_pData == NULL) {
- return 0;
- }
- CopyBeforeWrite();
- if (GetLength() < 1) {
- return 0;
- }
- FX_LPWSTR pstrSource = m_pData->m_String;
- FX_LPWSTR pstrDest = m_pData->m_String;
- FX_LPWSTR pstrEnd = m_pData->m_String + m_pData->m_nDataLength;
- while (pstrSource < pstrEnd) {
- if (*pstrSource != chRemove) {
- *pstrDest = *pstrSource;
- pstrDest ++;
- }
- pstrSource ++;
- }
- *pstrDest = 0;
- FX_STRSIZE nCount = (FX_STRSIZE)(pstrSource - pstrDest);
- m_pData->m_nDataLength -= nCount;
- return nCount;
-}
-#define FORCE_ANSI 0x10000
-#define FORCE_UNICODE 0x20000
-#define FORCE_INT64 0x40000
-void CFX_WideString::FormatV(FX_LPCWSTR lpszFormat, va_list argList)
-{
- va_list argListSave;
-#if defined(__ARMCC_VERSION) || (!defined(_MSC_VER) && (_FX_CPU_ == _FX_X64_ || _FX_CPU_ == _FX_IA64_ || _FX_CPU_ == _FX_ARM64_)) || defined(__native_client__)
- va_copy(argListSave, argList);
-#else
- argListSave = argList;
-#endif
- int nMaxLen = 0;
- for (FX_LPCWSTR lpsz = lpszFormat; *lpsz != 0; lpsz ++) {
- if (*lpsz != '%' || *(lpsz = lpsz + 1) == '%') {
- nMaxLen += (FX_STRSIZE)FXSYS_wcslen(lpsz);
- continue;
- }
- int nItemLen = 0;
- int nWidth = 0;
- for (; *lpsz != 0; lpsz ++) {
- if (*lpsz == '#') {
- nMaxLen += 2;
- } else if (*lpsz == '*') {
- nWidth = va_arg(argList, int);
- } else if (*lpsz == '-' || *lpsz == '+' || *lpsz == '0' ||
- *lpsz == ' ')
- ;
- else {
- break;
- }
- }
- if (nWidth == 0) {
- nWidth = FXSYS_wtoi(lpsz);
- for (; *lpsz != 0 && (*lpsz) <= '9' && (*lpsz) >= '0'; lpsz ++)
- ;
- }
- if (nWidth < 0 || nWidth > 128 * 1024) {
- lpszFormat = (FX_LPCWSTR)L"Bad width";
- nMaxLen = 10;
- break;
- }
- int nPrecision = 0;
- if (*lpsz == '.') {
- lpsz ++;
- if (*lpsz == '*') {
- nPrecision = va_arg(argList, int);
- lpsz ++;
- } else {
- nPrecision = FXSYS_wtoi(lpsz);
- for (; *lpsz != 0 && (*lpsz) >= '0' && (*lpsz) <= '9'; lpsz ++)
- ;
- }
- }
- if (nPrecision < 0 || nPrecision > 128 * 1024) {
- lpszFormat = (FX_LPCWSTR)L"Bad precision";
- nMaxLen = 14;
- break;
- }
- int nModifier = 0;
- if (*lpsz == L'I' && *(lpsz + 1) == L'6' && *(lpsz + 2) == L'4') {
- lpsz += 3;
- nModifier = FORCE_INT64;
- } else {
- switch (*lpsz) {
- case 'h':
- nModifier = FORCE_ANSI;
- lpsz ++;
- break;
- case 'l':
- nModifier = FORCE_UNICODE;
- lpsz ++;
- break;
- case 'F':
- case 'N':
- case 'L':
- lpsz ++;
- break;
- }
- }
- switch (*lpsz | nModifier) {
- case 'c':
- case 'C':
- nItemLen = 2;
- va_arg(argList, int);
- break;
- case 'c'|FORCE_ANSI:
- case 'C'|FORCE_ANSI:
- nItemLen = 2;
- va_arg(argList, int);
- break;
- case 'c'|FORCE_UNICODE:
- case 'C'|FORCE_UNICODE:
- nItemLen = 2;
- va_arg(argList, int);
- break;
- case 's': {
- FX_LPCWSTR pstrNextArg = va_arg(argList, FX_LPCWSTR);
- if (pstrNextArg == NULL) {
- nItemLen = 6;
- } else {
- nItemLen = (FX_STRSIZE)FXSYS_wcslen(pstrNextArg);
- if (nItemLen < 1) {
- nItemLen = 1;
- }
- }
- }
- break;
- case 'S': {
- FX_LPCSTR pstrNextArg = va_arg(argList, FX_LPCSTR);
- if (pstrNextArg == NULL) {
- nItemLen = 6;
- } else {
- nItemLen = (FX_STRSIZE)FXSYS_strlen(pstrNextArg);
- if (nItemLen < 1) {
- nItemLen = 1;
- }
- }
- }
- break;
- case 's'|FORCE_ANSI:
- case 'S'|FORCE_ANSI: {
- FX_LPCSTR pstrNextArg = va_arg(argList, FX_LPCSTR);
- if (pstrNextArg == NULL) {
- nItemLen = 6;
- } else {
- nItemLen = (FX_STRSIZE)FXSYS_strlen(pstrNextArg);
- if (nItemLen < 1) {
- nItemLen = 1;
- }
- }
- }
- break;
- case 's'|FORCE_UNICODE:
- case 'S'|FORCE_UNICODE: {
- FX_LPWSTR pstrNextArg = va_arg(argList, FX_LPWSTR);
- if (pstrNextArg == NULL) {
- nItemLen = 6;
- } else {
- nItemLen = (FX_STRSIZE)FXSYS_wcslen(pstrNextArg);
- if (nItemLen < 1) {
- nItemLen = 1;
- }
- }
- }
- break;
- }
- if (nItemLen != 0) {
- if (nPrecision != 0 && nItemLen > nPrecision) {
- nItemLen = nPrecision;
- }
- if (nItemLen < nWidth) {
- nItemLen = nWidth;
- }
- } else {
- switch (*lpsz) {
- case 'd':
- case 'i':
- case 'u':
- case 'x':
- case 'X':
- case 'o':
- if (nModifier & FORCE_INT64) {
- va_arg(argList, FX_INT64);
- } else {
- va_arg(argList, int);
- }
- nItemLen = 32;
- if (nItemLen < nWidth + nPrecision) {
- nItemLen = nWidth + nPrecision;
- }
- break;
- case 'a':
- case 'A':
- case 'e':
- case 'E':
- case 'g':
- case 'G':
- va_arg(argList, double);
- nItemLen = 128;
- if (nItemLen < nWidth + nPrecision) {
- nItemLen = nWidth + nPrecision;
- }
- break;
- case 'f':
- if (nWidth + nPrecision > 100) {
- nItemLen = nPrecision + nWidth + 128;
- } else {
- double f;
- char pszTemp[256];
- f = va_arg(argList, double);
- FXSYS_snprintf(pszTemp, sizeof(pszTemp), "%*.*f", nWidth, nPrecision + 6, f );
- nItemLen = (FX_STRSIZE)FXSYS_strlen(pszTemp);
- }
- break;
- case 'p':
- va_arg(argList, void*);
- nItemLen = 32;
- if (nItemLen < nWidth + nPrecision) {
- nItemLen = nWidth + nPrecision;
- }
- break;
- case 'n':
- va_arg(argList, int*);
- break;
- }
- }
- nMaxLen += nItemLen;
- }
- GetBuffer(nMaxLen);
- if (m_pData) {
- FXSYS_vswprintf((wchar_t*)m_pData->m_String, nMaxLen + 1, (const wchar_t*)lpszFormat, argListSave);
- ReleaseBuffer();
- }
- va_end(argListSave);
-}
-void CFX_WideString::Format(FX_LPCWSTR lpszFormat, ...)
-{
- va_list argList;
- va_start(argList, lpszFormat);
- FormatV(lpszFormat, argList);
- va_end(argList);
-}
-FX_FLOAT FX_wtof(FX_LPCWSTR str, int len)
-{
- if (len == 0) {
- return 0.0;
- }
- int cc = 0;
- FX_BOOL bNegative = FALSE;
- if (str[0] == '+') {
- cc++;
- } else if (str[0] == '-') {
- bNegative = TRUE;
- cc++;
- }
- int integer = 0;
- while (cc < len) {
- if (str[cc] == '.') {
- break;
- }
- integer = integer * 10 + str[cc] - '0';
- cc ++;
- }
- FX_FLOAT fraction = 0;
- if (str[cc] == '.') {
- cc ++;
- FX_FLOAT scale = 0.1f;
- while (cc < len) {
- fraction += scale * (str[cc] - '0');
- scale *= 0.1f;
- cc ++;
- }
- }
- fraction += (FX_FLOAT)integer;
- return bNegative ? -fraction : fraction;
-}
-int CFX_WideString::GetInteger() const
-{
- if (m_pData == NULL) {
- return 0;
- }
- return FXSYS_wtoi(m_pData->m_String);
-}
-FX_FLOAT CFX_WideString::GetFloat() const
-{
- if (m_pData == NULL) {
- return 0.0;
- }
- return FX_wtof(m_pData->m_String, m_pData->m_nDataLength);
-}
-void CFX_WideStringL::Empty(IFX_Allocator* pAllocator)
-{
- if (m_Ptr) {
- FX_Allocator_Free(pAllocator, (FX_LPVOID)m_Ptr);
- }
- m_Ptr = NULL, m_Length = 0;
-}
-void CFX_WideStringL::Set(FX_WSTR src, IFX_Allocator* pAllocator)
-{
- Empty(pAllocator);
- if (src.GetPtr() != NULL && src.GetLength() > 0) {
- FX_LPWSTR str = FX_Allocator_Alloc(pAllocator, FX_WCHAR, src.GetLength() + 1);
- if (!str) {
- return;
- }
- FXSYS_memcpy32(str, src.GetPtr(), src.GetLength()*sizeof(FX_WCHAR));
- str[src.GetLength()] = '\0';
- *(FX_LPWSTR*)(&m_Ptr) = str;
- m_Length = src.GetLength();
- }
-}
-int CFX_WideStringL::GetInteger() const
-{
- if (!m_Ptr) {
- return 0;
- }
- return FXSYS_wtoi(m_Ptr);
-}
-FX_FLOAT CFX_WideStringL::GetFloat() const
-{
- if (!m_Ptr) {
- return 0.0f;
- }
- return FX_wtof(m_Ptr, m_Length);
-}
-void CFX_WideStringL::TrimRight(FX_LPCWSTR lpszTargets)
-{
- if (!lpszTargets || *lpszTargets == 0 || !m_Ptr || m_Length < 1) {
- return;
- }
- FX_STRSIZE pos = m_Length;
- while (pos) {
- if (FXSYS_wcschr(lpszTargets, m_Ptr[pos - 1]) == NULL) {
- break;
- }
- pos --;
- }
- if (pos < m_Length) {
- (*(FX_LPWSTR*)(&m_Ptr))[pos] = 0;
- m_Length = pos;
- }
-}
-static CFX_ByteString _DefMap_GetByteString(CFX_CharMap* pCharMap, const CFX_WideString& widestr)
-{
- int src_len = widestr.GetLength();
- int codepage = pCharMap->m_GetCodePage ? pCharMap->m_GetCodePage() : 0;
- int dest_len = FXSYS_WideCharToMultiByte(codepage, 0, widestr, src_len, NULL, 0, NULL, NULL);
- if (dest_len == 0) {
- return CFX_ByteString();
- }
- CFX_ByteString bytestr;
- FX_LPSTR dest_buf = bytestr.GetBuffer(dest_len);
- FXSYS_WideCharToMultiByte(codepage, 0, widestr, src_len, dest_buf, dest_len, NULL, NULL);
- bytestr.ReleaseBuffer(dest_len);
- return bytestr;
-}
-static CFX_WideString _DefMap_GetWideString(CFX_CharMap* pCharMap, const CFX_ByteString& bytestr)
-{
- int src_len = bytestr.GetLength();
- int codepage = pCharMap->m_GetCodePage ? pCharMap->m_GetCodePage() : 0;
- int dest_len = FXSYS_MultiByteToWideChar(codepage, 0, bytestr, src_len, NULL, 0);
- if (dest_len == 0) {
- return CFX_WideString();
- }
- CFX_WideString widestr;
- FX_LPWSTR dest_buf = widestr.GetBuffer(dest_len);
- FXSYS_MultiByteToWideChar(codepage, 0, bytestr, src_len, dest_buf, dest_len);
- widestr.ReleaseBuffer(dest_len);
- return widestr;
-}
-static int _DefMap_GetGBKCodePage()
-{
- return 936;
-}
-static int _DefMap_GetUHCCodePage()
-{
- return 949;
-}
-static int _DefMap_GetJISCodePage()
-{
- return 932;
-}
-static int _DefMap_GetBig5CodePage()
-{
- return 950;
-}
-static const CFX_CharMap g_DefaultMapper = {&_DefMap_GetWideString, &_DefMap_GetByteString, NULL};
-static const CFX_CharMap g_DefaultGBKMapper = {&_DefMap_GetWideString, &_DefMap_GetByteString, &_DefMap_GetGBKCodePage};
-static const CFX_CharMap g_DefaultJISMapper = {&_DefMap_GetWideString, &_DefMap_GetByteString, &_DefMap_GetJISCodePage};
-static const CFX_CharMap g_DefaultUHCMapper = {&_DefMap_GetWideString, &_DefMap_GetByteString, &_DefMap_GetUHCCodePage};
-static const CFX_CharMap g_DefaultBig5Mapper = {&_DefMap_GetWideString, &_DefMap_GetByteString, &_DefMap_GetBig5CodePage};
-CFX_CharMap* CFX_CharMap::GetDefaultMapper(FX_INT32 codepage)
-{
- switch (codepage) {
- case 0:
- return (CFX_CharMap*)&g_DefaultMapper;
- case 932:
- return (CFX_CharMap*)&g_DefaultJISMapper;
- case 936:
- return (CFX_CharMap*)&g_DefaultGBKMapper;
- case 949:
- return (CFX_CharMap*)&g_DefaultUHCMapper;
- case 950:
- return (CFX_CharMap*)&g_DefaultBig5Mapper;
- }
- return NULL;
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fxcrt/fx_basic.h"
+static CFX_StringDataW* FX_AllocStringW(int nLen)
+{
+ if (nLen == 0) {
+ return NULL;
+ }
+ CFX_StringDataW* pData = (CFX_StringDataW*)FX_Alloc(FX_BYTE, sizeof(long) * 3 + (nLen + 1) * sizeof(FX_WCHAR));
+ if (!pData) {
+ return NULL;
+ }
+ pData->m_nAllocLength = nLen;
+ pData->m_nDataLength = nLen;
+ pData->m_nRefs = 1;
+ pData->m_String[nLen] = 0;
+ return pData;
+}
+static void FX_ReleaseStringW(CFX_StringDataW* pData)
+{
+ if (pData == NULL) {
+ return;
+ }
+ pData->m_nRefs --;
+ if (pData->m_nRefs <= 0) {
+ FX_Free(pData);
+ }
+}
+CFX_WideString::~CFX_WideString()
+{
+ if (m_pData == NULL) {
+ return;
+ }
+ m_pData->m_nRefs --;
+ if (m_pData->m_nRefs < 1) {
+ FX_Free(m_pData);
+ }
+}
+void CFX_WideString::InitStr(FX_LPCWSTR lpsz, FX_STRSIZE nLen)
+{
+ if (nLen < 0) {
+ nLen = lpsz ? (FX_STRSIZE)FXSYS_wcslen(lpsz) : 0;
+ }
+ if (nLen) {
+ m_pData = FX_AllocStringW(nLen);
+ if (!m_pData) {
+ return;
+ }
+ FXSYS_memcpy32(m_pData->m_String, lpsz, nLen * sizeof(FX_WCHAR));
+ } else {
+ m_pData = NULL;
+ }
+}
+CFX_WideString::CFX_WideString(const CFX_WideString& stringSrc)
+{
+ if (stringSrc.m_pData == NULL) {
+ m_pData = NULL;
+ return;
+ }
+ if (stringSrc.m_pData->m_nRefs >= 0) {
+ m_pData = stringSrc.m_pData;
+ m_pData->m_nRefs ++;
+ } else {
+ m_pData = NULL;
+ *this = stringSrc;
+ }
+}
+CFX_WideString::CFX_WideString(FX_WCHAR ch)
+{
+ m_pData = FX_AllocStringW(1);
+ if (m_pData) {
+ m_pData->m_String[0] = ch;
+ }
+}
+CFX_WideString::CFX_WideString(const CFX_WideStringC& str)
+{
+ if (str.IsEmpty()) {
+ m_pData = NULL;
+ return;
+ }
+ m_pData = FX_AllocStringW(str.GetLength());
+ if (m_pData) {
+ FXSYS_memcpy32(m_pData->m_String, str.GetPtr(), str.GetLength()*sizeof(FX_WCHAR));
+ }
+}
+CFX_WideString::CFX_WideString(const CFX_WideStringC& str1, const CFX_WideStringC& str2)
+{
+ m_pData = NULL;
+ int nNewLen = str1.GetLength() + str2.GetLength();
+ if (nNewLen == 0) {
+ return;
+ }
+ m_pData = FX_AllocStringW(nNewLen);
+ if (m_pData) {
+ FXSYS_memcpy32(m_pData->m_String, str1.GetPtr(), str1.GetLength()*sizeof(FX_WCHAR));
+ FXSYS_memcpy32(m_pData->m_String + str1.GetLength(), str2.GetPtr(), str2.GetLength()*sizeof(FX_WCHAR));
+ }
+}
+void CFX_WideString::ReleaseBuffer(FX_STRSIZE nNewLength)
+{
+ if (m_pData == NULL) {
+ return;
+ }
+ CopyBeforeWrite();
+ if (nNewLength == -1) {
+ nNewLength = m_pData ? (FX_STRSIZE)FXSYS_wcslen(m_pData->m_String) : 0;
+ }
+ if (nNewLength == 0) {
+ Empty();
+ return;
+ }
+ FXSYS_assert(nNewLength <= m_pData->m_nAllocLength);
+ m_pData->m_nDataLength = nNewLength;
+ m_pData->m_String[nNewLength] = 0;
+}
+const CFX_WideString& CFX_WideString::operator=(FX_LPCWSTR lpsz)
+{
+ if (lpsz == NULL || lpsz[0] == 0) {
+ Empty();
+ } else {
+ AssignCopy((FX_STRSIZE)FXSYS_wcslen(lpsz), lpsz);
+ }
+ return *this;
+}
+const CFX_WideString& CFX_WideString::operator=(const CFX_WideStringC& stringSrc)
+{
+ if (stringSrc.IsEmpty()) {
+ Empty();
+ } else {
+ AssignCopy(stringSrc.GetLength(), stringSrc.GetPtr());
+ }
+ return *this;
+}
+const CFX_WideString& CFX_WideString::operator=(const CFX_WideString& stringSrc)
+{
+ if (m_pData == stringSrc.m_pData) {
+ return *this;
+ }
+ if (stringSrc.IsEmpty()) {
+ Empty();
+ } else if ((m_pData && m_pData->m_nRefs < 0) ||
+ (stringSrc.m_pData && stringSrc.m_pData->m_nRefs < 0)) {
+ AssignCopy(stringSrc.m_pData->m_nDataLength, stringSrc.m_pData->m_String);
+ } else {
+ Empty();
+ m_pData = stringSrc.m_pData;
+ if (m_pData) {
+ m_pData->m_nRefs ++;
+ }
+ }
+ return *this;
+}
+const CFX_WideString& CFX_WideString::operator+=(FX_WCHAR ch)
+{
+ ConcatInPlace(1, &ch);
+ return *this;
+}
+const CFX_WideString& CFX_WideString::operator+=(FX_LPCWSTR lpsz)
+{
+ if (lpsz) {
+ ConcatInPlace((FX_STRSIZE)FXSYS_wcslen(lpsz), lpsz);
+ }
+ return *this;
+}
+const CFX_WideString& CFX_WideString::operator+=(const CFX_WideString& string)
+{
+ if (string.m_pData == NULL) {
+ return *this;
+ }
+ ConcatInPlace(string.m_pData->m_nDataLength, string.m_pData->m_String);
+ return *this;
+}
+const CFX_WideString& CFX_WideString::operator+=(const CFX_WideStringC& string)
+{
+ if (string.IsEmpty()) {
+ return *this;
+ }
+ ConcatInPlace(string.GetLength(), string.GetPtr());
+ return *this;
+}
+bool operator==(const CFX_WideString& s1, FX_LPCWSTR s2)
+{
+ return s1.Equal(s2);
+}
+bool operator==(FX_LPCWSTR s1, const CFX_WideString& s2)
+{
+ return s2.Equal(s1);
+}
+bool operator==(const CFX_WideString& s1, const CFX_WideString& s2)
+{
+ return s1.Equal(s2);
+}
+bool operator==(const CFX_WideString& s1, const CFX_WideStringC& s2)
+{
+ return s1.Equal(s2);
+}
+bool operator==(const CFX_WideStringC& s1, const CFX_WideString& s2)
+{
+ return s2.Equal(s1);
+}
+bool operator != (const CFX_WideString& s1, FX_LPCWSTR s2)
+{
+ return !s1.Equal(s2);
+}
+bool operator!=(const CFX_WideString& s1, const CFX_WideString& s2)
+{
+ return !s1.Equal(s2);
+}
+bool operator!=(const CFX_WideString& s1, const CFX_WideStringC& s2)
+{
+ return !s1.Equal(s2);
+}
+bool operator!=(const CFX_WideStringC& s1, const CFX_WideString& s2)
+{
+ return !s2.Equal(s1);
+}
+bool CFX_WideString::Equal(const CFX_WideStringC& str) const
+{
+ if (m_pData == NULL) {
+ return str.IsEmpty();
+ }
+ return str.GetLength() == m_pData->m_nDataLength &&
+ FXSYS_memcmp32(str.GetPtr(), m_pData->m_String, m_pData->m_nDataLength * sizeof(FX_WCHAR)) == 0;
+}
+void CFX_WideString::Empty()
+{
+ if (m_pData == NULL) {
+ return;
+ }
+ if (m_pData->m_nRefs > 1) {
+ m_pData->m_nRefs --;
+ } else {
+ FX_Free(m_pData);
+ }
+ m_pData = NULL;
+}
+void CFX_WideString::ConcatInPlace(FX_STRSIZE nSrcLen, FX_LPCWSTR lpszSrcData)
+{
+ if (nSrcLen == 0 || lpszSrcData == NULL) {
+ return;
+ }
+ if (m_pData == NULL) {
+ m_pData = FX_AllocStringW(nSrcLen);
+ if (m_pData) {
+ FXSYS_memcpy32(m_pData->m_String, lpszSrcData, nSrcLen * sizeof(FX_WCHAR));
+ }
+ return;
+ }
+ if (m_pData->m_nRefs > 1 || m_pData->m_nDataLength + nSrcLen > m_pData->m_nAllocLength) {
+ CFX_StringDataW* pOldData = m_pData;
+ ConcatCopy(m_pData->m_nDataLength, m_pData->m_String, nSrcLen, lpszSrcData);
+ FX_ReleaseStringW(pOldData);
+ } else {
+ FXSYS_memcpy32(m_pData->m_String + m_pData->m_nDataLength, lpszSrcData, nSrcLen * sizeof(FX_WCHAR));
+ m_pData->m_nDataLength += nSrcLen;
+ m_pData->m_String[m_pData->m_nDataLength] = 0;
+ }
+}
+void CFX_WideString::ConcatCopy(FX_STRSIZE nSrc1Len, FX_LPCWSTR lpszSrc1Data,
+ FX_STRSIZE nSrc2Len, FX_LPCWSTR lpszSrc2Data)
+{
+ FX_STRSIZE nNewLen = nSrc1Len + nSrc2Len;
+ if (nNewLen == 0) {
+ return;
+ }
+ m_pData = FX_AllocStringW(nNewLen);
+ if (m_pData) {
+ FXSYS_memcpy32(m_pData->m_String, lpszSrc1Data, nSrc1Len * sizeof(FX_WCHAR));
+ FXSYS_memcpy32(m_pData->m_String + nSrc1Len, lpszSrc2Data, nSrc2Len * sizeof(FX_WCHAR));
+ }
+}
+void CFX_WideString::CopyBeforeWrite()
+{
+ if (m_pData == NULL || m_pData->m_nRefs <= 1) {
+ return;
+ }
+ CFX_StringDataW* pData = m_pData;
+ m_pData->m_nRefs --;
+ FX_STRSIZE nDataLength = pData->m_nDataLength;
+ m_pData = FX_AllocStringW(nDataLength);
+ if (m_pData != NULL) {
+ FXSYS_memcpy32(m_pData->m_String, pData->m_String, (nDataLength + 1) * sizeof(FX_WCHAR));
+ }
+}
+void CFX_WideString::AllocBeforeWrite(FX_STRSIZE nLen)
+{
+ if (m_pData && m_pData->m_nRefs <= 1 && m_pData->m_nAllocLength >= nLen) {
+ return;
+ }
+ Empty();
+ m_pData = FX_AllocStringW(nLen);
+}
+void CFX_WideString::AssignCopy(FX_STRSIZE nSrcLen, FX_LPCWSTR lpszSrcData)
+{
+ AllocBeforeWrite(nSrcLen);
+ FXSYS_memcpy32(m_pData->m_String, lpszSrcData, nSrcLen * sizeof(FX_WCHAR));
+ m_pData->m_nDataLength = nSrcLen;
+ m_pData->m_String[nSrcLen] = 0;
+}
+int CFX_WideString::Compare(FX_LPCWSTR lpsz) const
+{
+ if (m_pData == NULL) {
+ return (lpsz == NULL || lpsz[0] == 0) ? 0 : -1;
+ }
+ return FXSYS_wcscmp(m_pData->m_String, lpsz);
+}
+CFX_ByteString CFX_WideString::UTF8Encode() const
+{
+ return FX_UTF8Encode(*this);
+}
+CFX_ByteString CFX_WideString::UTF16LE_Encode(FX_BOOL bTerminate) const
+{
+ if (m_pData == NULL) {
+ return bTerminate ? CFX_ByteString(FX_BSTRC("\0\0")) : CFX_ByteString();
+ }
+ int len = m_pData->m_nDataLength;
+ CFX_ByteString result;
+ FX_LPSTR buffer = result.GetBuffer(len * 2 + (bTerminate ? 2 : 0));
+ for (int i = 0; i < len; i ++) {
+ buffer[i * 2] = m_pData->m_String[i] & 0xff;
+ buffer[i * 2 + 1] = m_pData->m_String[i] >> 8;
+ }
+ if (bTerminate) {
+ buffer[len * 2] = 0;
+ buffer[len * 2 + 1] = 0;
+ result.ReleaseBuffer(len * 2 + 2);
+ } else {
+ result.ReleaseBuffer(len * 2);
+ }
+ return result;
+}
+void CFX_WideString::ConvertFrom(const CFX_ByteString& str, CFX_CharMap* pCharMap)
+{
+ if (pCharMap == NULL) {
+ pCharMap = CFX_CharMap::GetDefaultMapper();
+ }
+ *this = pCharMap->m_GetWideString(pCharMap, str);
+}
+void CFX_WideString::Reserve(FX_STRSIZE len)
+{
+ GetBuffer(len);
+ ReleaseBuffer(GetLength());
+}
+FX_LPWSTR CFX_WideString::GetBuffer(FX_STRSIZE nMinBufLength)
+{
+ if (m_pData == NULL && nMinBufLength == 0) {
+ return NULL;
+ }
+ if (m_pData && m_pData->m_nRefs <= 1 && m_pData->m_nAllocLength >= nMinBufLength) {
+ return m_pData->m_String;
+ }
+ if (m_pData == NULL) {
+ m_pData = FX_AllocStringW(nMinBufLength);
+ if (!m_pData) {
+ return NULL;
+ }
+ m_pData->m_nDataLength = 0;
+ m_pData->m_String[0] = 0;
+ return m_pData->m_String;
+ }
+ CFX_StringDataW* pOldData = m_pData;
+ FX_STRSIZE nOldLen = pOldData->m_nDataLength;
+ if (nMinBufLength < nOldLen) {
+ nMinBufLength = nOldLen;
+ }
+ m_pData = FX_AllocStringW(nMinBufLength);
+ if (!m_pData) {
+ return NULL;
+ }
+ FXSYS_memcpy32(m_pData->m_String, pOldData->m_String, (nOldLen + 1)*sizeof(FX_WCHAR));
+ m_pData->m_nDataLength = nOldLen;
+ pOldData->m_nRefs --;
+ if (pOldData->m_nRefs <= 0) {
+ FX_Free(pOldData);
+ }
+ return m_pData->m_String;
+}
+CFX_WideString CFX_WideString::FromLocal(const char* str, FX_STRSIZE len)
+{
+ CFX_WideString result;
+ result.ConvertFrom(CFX_ByteString(str, len));
+ return result;
+}
+CFX_WideString CFX_WideString::FromUTF8(const char* str, FX_STRSIZE len)
+{
+ if (!str) {
+ return CFX_WideString();
+ }
+ if (len < 0) {
+ len = 0;
+ while (str[len]) {
+ len ++;
+ }
+ }
+ CFX_UTF8Decoder decoder;
+ for (FX_STRSIZE i = 0; i < len; i ++) {
+ decoder.Input(str[i]);
+ }
+ return decoder.GetResult();
+}
+CFX_WideString CFX_WideString::FromUTF16LE(const unsigned short* wstr, FX_STRSIZE wlen)
+{
+ if (!wstr || !wlen) {
+ return CFX_WideString();
+ }
+ if (wlen < 0) {
+ wlen = 0;
+ while (wstr[wlen]) {
+ wlen ++;
+ }
+ }
+ CFX_WideString result;
+ FX_WCHAR* buf = result.GetBuffer(wlen);
+ for (int i = 0; i < wlen; i ++) {
+ buf[i] = wstr[i];
+ }
+ result.ReleaseBuffer(wlen);
+ return result;
+}
+void CFX_WideString::AllocCopy(CFX_WideString& dest, FX_STRSIZE nCopyLen, FX_STRSIZE nCopyIndex,
+ FX_STRSIZE nExtraLen) const
+{
+ FX_STRSIZE nNewLen = nCopyLen + nExtraLen;
+ if (nNewLen == 0) {
+ return;
+ }
+ ASSERT(dest.m_pData == NULL);
+ dest.m_pData = FX_AllocStringW(nNewLen);
+ if (dest.m_pData) {
+ FXSYS_memcpy32(dest.m_pData->m_String, m_pData->m_String + nCopyIndex, nCopyLen * sizeof(FX_WCHAR));
+ }
+}
+CFX_WideString CFX_WideString::Left(FX_STRSIZE nCount) const
+{
+ if (m_pData == NULL) {
+ return CFX_WideString();
+ }
+ if (nCount < 0) {
+ nCount = 0;
+ }
+ if (nCount >= m_pData->m_nDataLength) {
+ return *this;
+ }
+ CFX_WideString dest;
+ AllocCopy(dest, nCount, 0, 0);
+ return dest;
+}
+CFX_WideString CFX_WideString::Mid(FX_STRSIZE nFirst) const
+{
+ return Mid(nFirst, m_pData->m_nDataLength - nFirst);
+}
+CFX_WideString CFX_WideString::Mid(FX_STRSIZE nFirst, FX_STRSIZE nCount) const
+{
+ if (m_pData == NULL) {
+ return CFX_WideString();
+ }
+ if (nFirst < 0) {
+ nFirst = 0;
+ }
+ if (nCount < 0) {
+ nCount = 0;
+ }
+ if (nFirst + nCount > m_pData->m_nDataLength) {
+ nCount = m_pData->m_nDataLength - nFirst;
+ }
+ if (nFirst > m_pData->m_nDataLength) {
+ nCount = 0;
+ }
+ if (nFirst == 0 && nFirst + nCount == m_pData->m_nDataLength) {
+ return *this;
+ }
+ CFX_WideString dest;
+ AllocCopy(dest, nCount, nFirst, 0);
+ return dest;
+}
+CFX_WideString CFX_WideString::Right(FX_STRSIZE nCount) const
+{
+ if (m_pData == NULL) {
+ return CFX_WideString();
+ }
+ if (nCount < 0) {
+ nCount = 0;
+ }
+ if (nCount >= m_pData->m_nDataLength) {
+ return *this;
+ }
+ CFX_WideString dest;
+ AllocCopy(dest, nCount, m_pData->m_nDataLength - nCount, 0);
+ return dest;
+}
+int CFX_WideString::CompareNoCase(FX_LPCWSTR lpsz) const
+{
+ if (m_pData == NULL) {
+ return (lpsz == NULL || lpsz[0] == 0) ? 0 : -1;
+ }
+ return FXSYS_wcsicmp(m_pData->m_String, lpsz);
+}
+int CFX_WideString::Compare(const CFX_WideString& str) const
+{
+ if (m_pData == NULL) {
+ if (str.m_pData == NULL) {
+ return 0;
+ }
+ return -1;
+ } else if (str.m_pData == NULL) {
+ return 1;
+ }
+ int this_len = m_pData->m_nDataLength;
+ int that_len = str.m_pData->m_nDataLength;
+ int min_len = this_len < that_len ? this_len : that_len;
+ for (int i = 0; i < min_len; i ++) {
+ if (m_pData->m_String[i] < str.m_pData->m_String[i]) {
+ return -1;
+ } else if (m_pData->m_String[i] > str.m_pData->m_String[i]) {
+ return 1;
+ }
+ }
+ if (this_len < that_len) {
+ return -1;
+ } else if (this_len > that_len) {
+ return 1;
+ }
+ return 0;
+}
+FX_LPWSTR CFX_WideString::LockBuffer()
+{
+ if (m_pData == NULL) {
+ return NULL;
+ }
+ FX_LPWSTR lpsz = GetBuffer(0);
+ m_pData->m_nRefs = -1;
+ return lpsz;
+}
+void CFX_WideString::SetAt(FX_STRSIZE nIndex, FX_WCHAR ch)
+{
+ if (m_pData == NULL) {
+ return;
+ }
+ ASSERT(nIndex >= 0);
+ ASSERT(nIndex < m_pData->m_nDataLength);
+ CopyBeforeWrite();
+ m_pData->m_String[nIndex] = ch;
+}
+void CFX_WideString::MakeLower()
+{
+ if (m_pData == NULL) {
+ return;
+ }
+ CopyBeforeWrite();
+ if (GetLength() < 1) {
+ return;
+ }
+ FXSYS_wcslwr(m_pData->m_String);
+}
+void CFX_WideString::MakeUpper()
+{
+ if (m_pData == NULL) {
+ return;
+ }
+ CopyBeforeWrite();
+ if (GetLength() < 1) {
+ return;
+ }
+ FXSYS_wcsupr(m_pData->m_String);
+}
+FX_STRSIZE CFX_WideString::Find(FX_LPCWSTR lpszSub, FX_STRSIZE nStart) const
+{
+ FX_STRSIZE nLength = GetLength();
+ if (nLength < 1 || nStart > nLength) {
+ return -1;
+ }
+ FX_LPCWSTR lpsz = (FX_LPCWSTR)FXSYS_wcsstr(m_pData->m_String + nStart, lpszSub);
+ return (lpsz == NULL) ? -1 : (int)(lpsz - m_pData->m_String);
+}
+FX_STRSIZE CFX_WideString::Find(FX_WCHAR ch, FX_STRSIZE nStart) const
+{
+ if (m_pData == NULL) {
+ return -1;
+ }
+ FX_STRSIZE nLength = m_pData->m_nDataLength;
+ if (nStart >= nLength) {
+ return -1;
+ }
+ FX_LPCWSTR lpsz = (FX_LPCWSTR)FXSYS_wcschr(m_pData->m_String + nStart, ch);
+ return (lpsz == NULL) ? -1 : (int)(lpsz - m_pData->m_String);
+}
+void CFX_WideString::TrimRight(FX_LPCWSTR lpszTargetList)
+{
+ FXSYS_assert(lpszTargetList != NULL);
+ if (m_pData == NULL || *lpszTargetList == 0) {
+ return;
+ }
+ CopyBeforeWrite();
+ FX_STRSIZE len = GetLength();
+ if (len < 1) {
+ return;
+ }
+ FX_STRSIZE pos = len;
+ while (pos) {
+ if (FXSYS_wcschr(lpszTargetList, m_pData->m_String[pos - 1]) == NULL) {
+ break;
+ }
+ pos --;
+ }
+ if (pos < len) {
+ m_pData->m_String[pos] = 0;
+ m_pData->m_nDataLength = pos;
+ }
+}
+void CFX_WideString::TrimRight(FX_WCHAR chTarget)
+{
+ FX_WCHAR str[2] = {chTarget, 0};
+ TrimRight(str);
+}
+void CFX_WideString::TrimRight()
+{
+ TrimRight(L"\x09\x0a\x0b\x0c\x0d\x20");
+}
+void CFX_WideString::TrimLeft(FX_LPCWSTR lpszTargets)
+{
+ FXSYS_assert(lpszTargets != NULL);
+ if (m_pData == NULL || *lpszTargets == 0) {
+ return;
+ }
+ CopyBeforeWrite();
+ if (GetLength() < 1) {
+ return;
+ }
+ FX_LPCWSTR lpsz = m_pData->m_String;
+ while (*lpsz != 0) {
+ if (FXSYS_wcschr(lpszTargets, *lpsz) == NULL) {
+ break;
+ }
+ lpsz ++;
+ }
+ if (lpsz != m_pData->m_String) {
+ int nDataLength = m_pData->m_nDataLength - (FX_STRSIZE)(lpsz - m_pData->m_String);
+ FXSYS_memmove32(m_pData->m_String, lpsz, (nDataLength + 1)*sizeof(FX_WCHAR));
+ m_pData->m_nDataLength = nDataLength;
+ }
+}
+void CFX_WideString::TrimLeft(FX_WCHAR chTarget)
+{
+ FX_WCHAR str[2] = {chTarget, 0};
+ TrimLeft(str);
+}
+void CFX_WideString::TrimLeft()
+{
+ TrimLeft(L"\x09\x0a\x0b\x0c\x0d\x20");
+}
+FX_STRSIZE CFX_WideString::Replace(FX_LPCWSTR lpszOld, FX_LPCWSTR lpszNew)
+{
+ if (GetLength() < 1) {
+ return 0;
+ }
+ if (lpszOld == NULL) {
+ return 0;
+ }
+ FX_STRSIZE nSourceLen = (FX_STRSIZE)FXSYS_wcslen(lpszOld);
+ if (nSourceLen == 0) {
+ return 0;
+ }
+ FX_STRSIZE nReplacementLen = lpszNew ? (FX_STRSIZE)FXSYS_wcslen(lpszNew) : 0;
+ FX_STRSIZE nCount = 0;
+ FX_LPWSTR lpszStart = m_pData->m_String;
+ FX_LPWSTR lpszEnd = m_pData->m_String + m_pData->m_nDataLength;
+ FX_LPWSTR lpszTarget;
+ {
+ while ((lpszTarget = (FX_LPWSTR)FXSYS_wcsstr(lpszStart, lpszOld)) != NULL && lpszStart < lpszEnd) {
+ nCount++;
+ lpszStart = lpszTarget + nSourceLen;
+ }
+ }
+ if (nCount > 0) {
+ CopyBeforeWrite();
+ FX_STRSIZE nOldLength = m_pData->m_nDataLength;
+ FX_STRSIZE nNewLength = nOldLength + (nReplacementLen - nSourceLen) * nCount;
+ if (m_pData->m_nAllocLength < nNewLength || m_pData->m_nRefs > 1) {
+ CFX_StringDataW* pOldData = m_pData;
+ FX_LPCWSTR pstr = m_pData->m_String;
+ m_pData = FX_AllocStringW(nNewLength);
+ if (!m_pData) {
+ return 0;
+ }
+ FXSYS_memcpy32(m_pData->m_String, pstr, pOldData->m_nDataLength * sizeof(FX_WCHAR));
+ FX_ReleaseStringW(pOldData);
+ }
+ lpszStart = m_pData->m_String;
+ lpszEnd = m_pData->m_String + FX_MAX(m_pData->m_nDataLength, nNewLength);
+ {
+ while ((lpszTarget = (FX_LPWSTR)FXSYS_wcsstr(lpszStart, lpszOld)) != NULL && lpszStart < lpszEnd) {
+ FX_STRSIZE nBalance = nOldLength - (FX_STRSIZE)(lpszTarget - m_pData->m_String + nSourceLen);
+ FXSYS_memmove32(lpszTarget + nReplacementLen, lpszTarget + nSourceLen, nBalance * sizeof(FX_WCHAR));
+ FXSYS_memcpy32(lpszTarget, lpszNew, nReplacementLen * sizeof(FX_WCHAR));
+ lpszStart = lpszTarget + nReplacementLen;
+ lpszStart[nBalance] = 0;
+ nOldLength += (nReplacementLen - nSourceLen);
+ }
+ }
+ ASSERT(m_pData->m_String[nNewLength] == 0);
+ m_pData->m_nDataLength = nNewLength;
+ }
+ return nCount;
+}
+FX_STRSIZE CFX_WideString::Insert(FX_STRSIZE nIndex, FX_WCHAR ch)
+{
+ CopyBeforeWrite();
+ if (nIndex < 0) {
+ nIndex = 0;
+ }
+ FX_STRSIZE nNewLength = GetLength();
+ if (nIndex > nNewLength) {
+ nIndex = nNewLength;
+ }
+ nNewLength++;
+ if (m_pData == NULL || m_pData->m_nAllocLength < nNewLength) {
+ CFX_StringDataW* pOldData = m_pData;
+ FX_LPCWSTR pstr = m_pData->m_String;
+ m_pData = FX_AllocStringW(nNewLength);
+ if (!m_pData) {
+ return 0;
+ }
+ if(pOldData != NULL) {
+ FXSYS_memmove32(m_pData->m_String, pstr, (pOldData->m_nDataLength + 1)*sizeof(FX_WCHAR));
+ FX_ReleaseStringW(pOldData);
+ } else {
+ m_pData->m_String[0] = 0;
+ }
+ }
+ FXSYS_memmove32(m_pData->m_String + nIndex + 1,
+ m_pData->m_String + nIndex, (nNewLength - nIndex)*sizeof(FX_WCHAR));
+ m_pData->m_String[nIndex] = ch;
+ m_pData->m_nDataLength = nNewLength;
+ return nNewLength;
+}
+FX_STRSIZE CFX_WideString::Delete(FX_STRSIZE nIndex, FX_STRSIZE nCount)
+{
+ if (GetLength() < 1) {
+ return 0;
+ }
+ if (nIndex < 0) {
+ nIndex = 0;
+ }
+ FX_STRSIZE nOldLength = m_pData->m_nDataLength;
+ if (nCount > 0 && nIndex < nOldLength) {
+ CopyBeforeWrite();
+ int nBytesToCopy = nOldLength - (nIndex + nCount) + 1;
+ FXSYS_memmove32(m_pData->m_String + nIndex,
+ m_pData->m_String + nIndex + nCount, nBytesToCopy * sizeof(FX_WCHAR));
+ m_pData->m_nDataLength = nOldLength - nCount;
+ }
+ return m_pData->m_nDataLength;
+}
+FX_STRSIZE CFX_WideString::Remove(FX_WCHAR chRemove)
+{
+ if (m_pData == NULL) {
+ return 0;
+ }
+ CopyBeforeWrite();
+ if (GetLength() < 1) {
+ return 0;
+ }
+ FX_LPWSTR pstrSource = m_pData->m_String;
+ FX_LPWSTR pstrDest = m_pData->m_String;
+ FX_LPWSTR pstrEnd = m_pData->m_String + m_pData->m_nDataLength;
+ while (pstrSource < pstrEnd) {
+ if (*pstrSource != chRemove) {
+ *pstrDest = *pstrSource;
+ pstrDest ++;
+ }
+ pstrSource ++;
+ }
+ *pstrDest = 0;
+ FX_STRSIZE nCount = (FX_STRSIZE)(pstrSource - pstrDest);
+ m_pData->m_nDataLength -= nCount;
+ return nCount;
+}
+#define FORCE_ANSI 0x10000
+#define FORCE_UNICODE 0x20000
+#define FORCE_INT64 0x40000
+void CFX_WideString::FormatV(FX_LPCWSTR lpszFormat, va_list argList)
+{
+ va_list argListSave;
+#if defined(__ARMCC_VERSION) || (!defined(_MSC_VER) && (_FX_CPU_ == _FX_X64_ || _FX_CPU_ == _FX_IA64_ || _FX_CPU_ == _FX_ARM64_)) || defined(__native_client__)
+ va_copy(argListSave, argList);
+#else
+ argListSave = argList;
+#endif
+ int nMaxLen = 0;
+ for (FX_LPCWSTR lpsz = lpszFormat; *lpsz != 0; lpsz ++) {
+ if (*lpsz != '%' || *(lpsz = lpsz + 1) == '%') {
+ nMaxLen += (FX_STRSIZE)FXSYS_wcslen(lpsz);
+ continue;
+ }
+ int nItemLen = 0;
+ int nWidth = 0;
+ for (; *lpsz != 0; lpsz ++) {
+ if (*lpsz == '#') {
+ nMaxLen += 2;
+ } else if (*lpsz == '*') {
+ nWidth = va_arg(argList, int);
+ } else if (*lpsz == '-' || *lpsz == '+' || *lpsz == '0' ||
+ *lpsz == ' ')
+ ;
+ else {
+ break;
+ }
+ }
+ if (nWidth == 0) {
+ nWidth = FXSYS_wtoi(lpsz);
+ for (; *lpsz != 0 && (*lpsz) <= '9' && (*lpsz) >= '0'; lpsz ++)
+ ;
+ }
+ if (nWidth < 0 || nWidth > 128 * 1024) {
+ lpszFormat = (FX_LPCWSTR)L"Bad width";
+ nMaxLen = 10;
+ break;
+ }
+ int nPrecision = 0;
+ if (*lpsz == '.') {
+ lpsz ++;
+ if (*lpsz == '*') {
+ nPrecision = va_arg(argList, int);
+ lpsz ++;
+ } else {
+ nPrecision = FXSYS_wtoi(lpsz);
+ for (; *lpsz != 0 && (*lpsz) >= '0' && (*lpsz) <= '9'; lpsz ++)
+ ;
+ }
+ }
+ if (nPrecision < 0 || nPrecision > 128 * 1024) {
+ lpszFormat = (FX_LPCWSTR)L"Bad precision";
+ nMaxLen = 14;
+ break;
+ }
+ int nModifier = 0;
+ if (*lpsz == L'I' && *(lpsz + 1) == L'6' && *(lpsz + 2) == L'4') {
+ lpsz += 3;
+ nModifier = FORCE_INT64;
+ } else {
+ switch (*lpsz) {
+ case 'h':
+ nModifier = FORCE_ANSI;
+ lpsz ++;
+ break;
+ case 'l':
+ nModifier = FORCE_UNICODE;
+ lpsz ++;
+ break;
+ case 'F':
+ case 'N':
+ case 'L':
+ lpsz ++;
+ break;
+ }
+ }
+ switch (*lpsz | nModifier) {
+ case 'c':
+ case 'C':
+ nItemLen = 2;
+ va_arg(argList, int);
+ break;
+ case 'c'|FORCE_ANSI:
+ case 'C'|FORCE_ANSI:
+ nItemLen = 2;
+ va_arg(argList, int);
+ break;
+ case 'c'|FORCE_UNICODE:
+ case 'C'|FORCE_UNICODE:
+ nItemLen = 2;
+ va_arg(argList, int);
+ break;
+ case 's': {
+ FX_LPCWSTR pstrNextArg = va_arg(argList, FX_LPCWSTR);
+ if (pstrNextArg == NULL) {
+ nItemLen = 6;
+ } else {
+ nItemLen = (FX_STRSIZE)FXSYS_wcslen(pstrNextArg);
+ if (nItemLen < 1) {
+ nItemLen = 1;
+ }
+ }
+ }
+ break;
+ case 'S': {
+ FX_LPCSTR pstrNextArg = va_arg(argList, FX_LPCSTR);
+ if (pstrNextArg == NULL) {
+ nItemLen = 6;
+ } else {
+ nItemLen = (FX_STRSIZE)FXSYS_strlen(pstrNextArg);
+ if (nItemLen < 1) {
+ nItemLen = 1;
+ }
+ }
+ }
+ break;
+ case 's'|FORCE_ANSI:
+ case 'S'|FORCE_ANSI: {
+ FX_LPCSTR pstrNextArg = va_arg(argList, FX_LPCSTR);
+ if (pstrNextArg == NULL) {
+ nItemLen = 6;
+ } else {
+ nItemLen = (FX_STRSIZE)FXSYS_strlen(pstrNextArg);
+ if (nItemLen < 1) {
+ nItemLen = 1;
+ }
+ }
+ }
+ break;
+ case 's'|FORCE_UNICODE:
+ case 'S'|FORCE_UNICODE: {
+ FX_LPWSTR pstrNextArg = va_arg(argList, FX_LPWSTR);
+ if (pstrNextArg == NULL) {
+ nItemLen = 6;
+ } else {
+ nItemLen = (FX_STRSIZE)FXSYS_wcslen(pstrNextArg);
+ if (nItemLen < 1) {
+ nItemLen = 1;
+ }
+ }
+ }
+ break;
+ }
+ if (nItemLen != 0) {
+ if (nPrecision != 0 && nItemLen > nPrecision) {
+ nItemLen = nPrecision;
+ }
+ if (nItemLen < nWidth) {
+ nItemLen = nWidth;
+ }
+ } else {
+ switch (*lpsz) {
+ case 'd':
+ case 'i':
+ case 'u':
+ case 'x':
+ case 'X':
+ case 'o':
+ if (nModifier & FORCE_INT64) {
+ va_arg(argList, FX_INT64);
+ } else {
+ va_arg(argList, int);
+ }
+ nItemLen = 32;
+ if (nItemLen < nWidth + nPrecision) {
+ nItemLen = nWidth + nPrecision;
+ }
+ break;
+ case 'a':
+ case 'A':
+ case 'e':
+ case 'E':
+ case 'g':
+ case 'G':
+ va_arg(argList, double);
+ nItemLen = 128;
+ if (nItemLen < nWidth + nPrecision) {
+ nItemLen = nWidth + nPrecision;
+ }
+ break;
+ case 'f':
+ if (nWidth + nPrecision > 100) {
+ nItemLen = nPrecision + nWidth + 128;
+ } else {
+ double f;
+ char pszTemp[256];
+ f = va_arg(argList, double);
+ FXSYS_snprintf(pszTemp, sizeof(pszTemp), "%*.*f", nWidth, nPrecision + 6, f );
+ nItemLen = (FX_STRSIZE)FXSYS_strlen(pszTemp);
+ }
+ break;
+ case 'p':
+ va_arg(argList, void*);
+ nItemLen = 32;
+ if (nItemLen < nWidth + nPrecision) {
+ nItemLen = nWidth + nPrecision;
+ }
+ break;
+ case 'n':
+ va_arg(argList, int*);
+ break;
+ }
+ }
+ nMaxLen += nItemLen;
+ }
+ GetBuffer(nMaxLen);
+ if (m_pData) {
+ FXSYS_vswprintf((wchar_t*)m_pData->m_String, nMaxLen + 1, (const wchar_t*)lpszFormat, argListSave);
+ ReleaseBuffer();
+ }
+ va_end(argListSave);
+}
+void CFX_WideString::Format(FX_LPCWSTR lpszFormat, ...)
+{
+ va_list argList;
+ va_start(argList, lpszFormat);
+ FormatV(lpszFormat, argList);
+ va_end(argList);
+}
+FX_FLOAT FX_wtof(FX_LPCWSTR str, int len)
+{
+ if (len == 0) {
+ return 0.0;
+ }
+ int cc = 0;
+ FX_BOOL bNegative = FALSE;
+ if (str[0] == '+') {
+ cc++;
+ } else if (str[0] == '-') {
+ bNegative = TRUE;
+ cc++;
+ }
+ int integer = 0;
+ while (cc < len) {
+ if (str[cc] == '.') {
+ break;
+ }
+ integer = integer * 10 + str[cc] - '0';
+ cc ++;
+ }
+ FX_FLOAT fraction = 0;
+ if (str[cc] == '.') {
+ cc ++;
+ FX_FLOAT scale = 0.1f;
+ while (cc < len) {
+ fraction += scale * (str[cc] - '0');
+ scale *= 0.1f;
+ cc ++;
+ }
+ }
+ fraction += (FX_FLOAT)integer;
+ return bNegative ? -fraction : fraction;
+}
+int CFX_WideString::GetInteger() const
+{
+ if (m_pData == NULL) {
+ return 0;
+ }
+ return FXSYS_wtoi(m_pData->m_String);
+}
+FX_FLOAT CFX_WideString::GetFloat() const
+{
+ if (m_pData == NULL) {
+ return 0.0;
+ }
+ return FX_wtof(m_pData->m_String, m_pData->m_nDataLength);
+}
+void CFX_WideStringL::Empty(IFX_Allocator* pAllocator)
+{
+ if (m_Ptr) {
+ FX_Allocator_Free(pAllocator, (FX_LPVOID)m_Ptr);
+ }
+ m_Ptr = NULL, m_Length = 0;
+}
+void CFX_WideStringL::Set(FX_WSTR src, IFX_Allocator* pAllocator)
+{
+ Empty(pAllocator);
+ if (src.GetPtr() != NULL && src.GetLength() > 0) {
+ FX_LPWSTR str = FX_Allocator_Alloc(pAllocator, FX_WCHAR, src.GetLength() + 1);
+ if (!str) {
+ return;
+ }
+ FXSYS_memcpy32(str, src.GetPtr(), src.GetLength()*sizeof(FX_WCHAR));
+ str[src.GetLength()] = '\0';
+ *(FX_LPWSTR*)(&m_Ptr) = str;
+ m_Length = src.GetLength();
+ }
+}
+int CFX_WideStringL::GetInteger() const
+{
+ if (!m_Ptr) {
+ return 0;
+ }
+ return FXSYS_wtoi(m_Ptr);
+}
+FX_FLOAT CFX_WideStringL::GetFloat() const
+{
+ if (!m_Ptr) {
+ return 0.0f;
+ }
+ return FX_wtof(m_Ptr, m_Length);
+}
+void CFX_WideStringL::TrimRight(FX_LPCWSTR lpszTargets)
+{
+ if (!lpszTargets || *lpszTargets == 0 || !m_Ptr || m_Length < 1) {
+ return;
+ }
+ FX_STRSIZE pos = m_Length;
+ while (pos) {
+ if (FXSYS_wcschr(lpszTargets, m_Ptr[pos - 1]) == NULL) {
+ break;
+ }
+ pos --;
+ }
+ if (pos < m_Length) {
+ (*(FX_LPWSTR*)(&m_Ptr))[pos] = 0;
+ m_Length = pos;
+ }
+}
+static CFX_ByteString _DefMap_GetByteString(CFX_CharMap* pCharMap, const CFX_WideString& widestr)
+{
+ int src_len = widestr.GetLength();
+ int codepage = pCharMap->m_GetCodePage ? pCharMap->m_GetCodePage() : 0;
+ int dest_len = FXSYS_WideCharToMultiByte(codepage, 0, widestr, src_len, NULL, 0, NULL, NULL);
+ if (dest_len == 0) {
+ return CFX_ByteString();
+ }
+ CFX_ByteString bytestr;
+ FX_LPSTR dest_buf = bytestr.GetBuffer(dest_len);
+ FXSYS_WideCharToMultiByte(codepage, 0, widestr, src_len, dest_buf, dest_len, NULL, NULL);
+ bytestr.ReleaseBuffer(dest_len);
+ return bytestr;
+}
+static CFX_WideString _DefMap_GetWideString(CFX_CharMap* pCharMap, const CFX_ByteString& bytestr)
+{
+ int src_len = bytestr.GetLength();
+ int codepage = pCharMap->m_GetCodePage ? pCharMap->m_GetCodePage() : 0;
+ int dest_len = FXSYS_MultiByteToWideChar(codepage, 0, bytestr, src_len, NULL, 0);
+ if (dest_len == 0) {
+ return CFX_WideString();
+ }
+ CFX_WideString widestr;
+ FX_LPWSTR dest_buf = widestr.GetBuffer(dest_len);
+ FXSYS_MultiByteToWideChar(codepage, 0, bytestr, src_len, dest_buf, dest_len);
+ widestr.ReleaseBuffer(dest_len);
+ return widestr;
+}
+static int _DefMap_GetGBKCodePage()
+{
+ return 936;
+}
+static int _DefMap_GetUHCCodePage()
+{
+ return 949;
+}
+static int _DefMap_GetJISCodePage()
+{
+ return 932;
+}
+static int _DefMap_GetBig5CodePage()
+{
+ return 950;
+}
+static const CFX_CharMap g_DefaultMapper = {&_DefMap_GetWideString, &_DefMap_GetByteString, NULL};
+static const CFX_CharMap g_DefaultGBKMapper = {&_DefMap_GetWideString, &_DefMap_GetByteString, &_DefMap_GetGBKCodePage};
+static const CFX_CharMap g_DefaultJISMapper = {&_DefMap_GetWideString, &_DefMap_GetByteString, &_DefMap_GetJISCodePage};
+static const CFX_CharMap g_DefaultUHCMapper = {&_DefMap_GetWideString, &_DefMap_GetByteString, &_DefMap_GetUHCCodePage};
+static const CFX_CharMap g_DefaultBig5Mapper = {&_DefMap_GetWideString, &_DefMap_GetByteString, &_DefMap_GetBig5CodePage};
+CFX_CharMap* CFX_CharMap::GetDefaultMapper(FX_INT32 codepage)
+{
+ switch (codepage) {
+ case 0:
+ return (CFX_CharMap*)&g_DefaultMapper;
+ case 932:
+ return (CFX_CharMap*)&g_DefaultJISMapper;
+ case 936:
+ return (CFX_CharMap*)&g_DefaultGBKMapper;
+ case 949:
+ return (CFX_CharMap*)&g_DefaultUHCMapper;
+ case 950:
+ return (CFX_CharMap*)&g_DefaultBig5Mapper;
+ }
+ return NULL;
+}
diff --git a/core/src/fxcrt/fx_extension.cpp b/core/src/fxcrt/fx_extension.cpp
index 79d300668f..e7272cff0b 100644
--- a/core/src/fxcrt/fx_extension.cpp
+++ b/core/src/fxcrt/fx_extension.cpp
@@ -1,401 +1,401 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../include/fxcrt/fx_ext.h"
-#include "extension.h"
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
-#include <wincrypt.h>
-#else
-#include <ctime>
-#endif
-FX_HFILE FX_File_Open(FX_BSTR fileName, FX_DWORD dwMode, IFX_Allocator* pAllocator)
-{
- IFXCRT_FileAccess* pFA = FXCRT_FileAccess_Create(pAllocator);
- if (pFA && !pFA->Open(fileName, dwMode)) {
- pFA->Release(pAllocator);
- return NULL;
- }
- return (FX_HFILE)pFA;
-}
-FX_HFILE FX_File_Open(FX_WSTR fileName, FX_DWORD dwMode, IFX_Allocator* pAllocator)
-{
- IFXCRT_FileAccess* pFA = FXCRT_FileAccess_Create(pAllocator);
- if (pFA && !pFA->Open(fileName, dwMode)) {
- pFA->Release(pAllocator);
- return NULL;
- }
- return (FX_HFILE)pFA;
-}
-void FX_File_Close(FX_HFILE hFile, IFX_Allocator* pAllocator)
-{
- FXSYS_assert(hFile != NULL);
- ((IFXCRT_FileAccess*)hFile)->Close();
- ((IFXCRT_FileAccess*)hFile)->Release(pAllocator);
-}
-FX_FILESIZE FX_File_GetSize(FX_HFILE hFile)
-{
- FXSYS_assert(hFile != NULL);
- return ((IFXCRT_FileAccess*)hFile)->GetSize();
-}
-FX_FILESIZE FX_File_GetPosition(FX_HFILE hFile)
-{
- FXSYS_assert(hFile != NULL);
- return ((IFXCRT_FileAccess*)hFile)->GetPosition();
-}
-FX_FILESIZE FX_File_SetPosition(FX_HFILE hFile, FX_FILESIZE pos)
-{
- FXSYS_assert(hFile != NULL);
- return ((IFXCRT_FileAccess*)hFile)->SetPosition(pos);
-}
-size_t FX_File_Read(FX_HFILE hFile, void* pBuffer, size_t szBuffer)
-{
- FXSYS_assert(hFile != NULL);
- return ((IFXCRT_FileAccess*)hFile)->Read(pBuffer, szBuffer);
-}
-size_t FX_File_ReadPos(FX_HFILE hFile, void* pBuffer, size_t szBuffer, FX_FILESIZE pos)
-{
- FXSYS_assert(hFile != NULL);
- return ((IFXCRT_FileAccess*)hFile)->ReadPos(pBuffer, szBuffer, pos);
-}
-size_t FX_File_Write(FX_HFILE hFile, const void* pBuffer, size_t szBuffer)
-{
- FXSYS_assert(hFile != NULL);
- return ((IFXCRT_FileAccess*)hFile)->Write(pBuffer, szBuffer);
-}
-size_t FX_File_WritePos(FX_HFILE hFile, const void* pBuffer, size_t szBuffer, FX_FILESIZE pos)
-{
- FXSYS_assert(hFile != NULL);
- return ((IFXCRT_FileAccess*)hFile)->WritePos(pBuffer, szBuffer, pos);
-}
-FX_BOOL FX_File_Flush(FX_HFILE hFile)
-{
- FXSYS_assert(hFile != NULL);
- return ((IFXCRT_FileAccess*)hFile)->Flush();
-}
-FX_BOOL FX_File_Truncate(FX_HFILE hFile, FX_FILESIZE szFile)
-{
- FXSYS_assert(hFile != NULL);
- return ((IFXCRT_FileAccess*)hFile)->Truncate(szFile);
-}
-IFX_FileStream* FX_CreateFileStream(FX_LPCSTR filename, FX_DWORD dwModes, IFX_Allocator* pAllocator)
-{
- IFXCRT_FileAccess* pFA = FXCRT_FileAccess_Create(pAllocator);
- if (!pFA) {
- return NULL;
- }
- if (!pFA->Open(filename, dwModes)) {
- pFA->Release(pAllocator);
- return NULL;
- }
- if (pAllocator) {
- return FX_NewAtAllocator(pAllocator) CFX_CRTFileStream(pFA, pAllocator);
- } else {
- return FX_NEW CFX_CRTFileStream(pFA, pAllocator);
- }
-}
-IFX_FileStream* FX_CreateFileStream(FX_LPCWSTR filename, FX_DWORD dwModes, IFX_Allocator* pAllocator)
-{
- IFXCRT_FileAccess* pFA = FXCRT_FileAccess_Create(pAllocator);
- if (!pFA) {
- return NULL;
- }
- if (!pFA->Open(filename, dwModes)) {
- pFA->Release(pAllocator);
- return NULL;
- }
- if (pAllocator) {
- return FX_NewAtAllocator(pAllocator) CFX_CRTFileStream(pFA, pAllocator);
- } else {
- return FX_NEW CFX_CRTFileStream(pFA, pAllocator);
- }
-}
-IFX_FileWrite* FX_CreateFileWrite(FX_LPCSTR filename, IFX_Allocator* pAllocator)
-{
- return FX_CreateFileStream(filename, FX_FILEMODE_Truncate, pAllocator);
-}
-IFX_FileWrite* FX_CreateFileWrite(FX_LPCWSTR filename, IFX_Allocator* pAllocator)
-{
- return FX_CreateFileStream(filename, FX_FILEMODE_Truncate, pAllocator);
-}
-IFX_FileRead* FX_CreateFileRead(FX_LPCSTR filename, IFX_Allocator* pAllocator)
-{
- return FX_CreateFileStream(filename, FX_FILEMODE_ReadOnly, pAllocator);
-}
-IFX_FileRead* FX_CreateFileRead(FX_LPCWSTR filename, IFX_Allocator* pAllocator)
-{
- return FX_CreateFileStream(filename, FX_FILEMODE_ReadOnly, pAllocator);
-}
-IFX_MemoryStream* FX_CreateMemoryStream(FX_LPBYTE pBuffer, size_t dwSize, FX_BOOL bTakeOver, IFX_Allocator* pAllocator)
-{
- if (pAllocator) {
- return FX_NewAtAllocator(pAllocator)CFX_MemoryStream(pBuffer, dwSize, bTakeOver, pAllocator);
- } else {
- return FX_NEW CFX_MemoryStream(pBuffer, dwSize, bTakeOver, NULL);
- }
-}
-IFX_MemoryStream* FX_CreateMemoryStream(FX_BOOL bConsecutive, IFX_Allocator* pAllocator)
-{
- if (pAllocator) {
- return FX_NewAtAllocator(pAllocator)CFX_MemoryStream(bConsecutive, pAllocator);
- } else {
- return FX_NEW CFX_MemoryStream(bConsecutive, NULL);
- }
-}
-#ifdef __cplusplus
-extern "C" {
-#endif
-FX_FLOAT FXSYS_tan(FX_FLOAT a)
-{
- return (FX_FLOAT)tan(a);
-}
-FX_FLOAT FXSYS_logb(FX_FLOAT b, FX_FLOAT x)
-{
- return FXSYS_log(x) / FXSYS_log(b);
-}
-FX_FLOAT FXSYS_strtof(FX_LPCSTR pcsStr, FX_INT32 iLength, FX_INT32 *pUsedLen)
-{
- FXSYS_assert(pcsStr != NULL);
- if (iLength < 0) {
- iLength = (FX_INT32)FXSYS_strlen(pcsStr);
- }
- CFX_WideString ws = CFX_WideString::FromLocal(pcsStr, iLength);
- return FXSYS_wcstof((FX_LPCWSTR)ws, iLength, pUsedLen);
-}
-FX_FLOAT FXSYS_wcstof(FX_LPCWSTR pwsStr, FX_INT32 iLength, FX_INT32 *pUsedLen)
-{
- FXSYS_assert(pwsStr != NULL);
- if (iLength < 0) {
- iLength = (FX_INT32)FXSYS_wcslen(pwsStr);
- }
- if (iLength == 0) {
- return 0.0f;
- }
- FX_INT32 iUsedLen = 0;
- FX_BOOL bNegtive = FALSE;
- switch (pwsStr[iUsedLen]) {
- case '-':
- bNegtive = TRUE;
- case '+':
- iUsedLen++;
- break;
- }
- FX_FLOAT fValue = 0.0f;
- while (iUsedLen < iLength) {
- FX_WCHAR wch = pwsStr[iUsedLen];
- if (wch >= L'0' && wch <= L'9') {
- fValue = fValue * 10.0f + (wch - L'0');
- } else {
- break;
- }
- iUsedLen++;
- }
- if (iUsedLen < iLength && pwsStr[iUsedLen] == L'.') {
- FX_FLOAT fPrecise = 0.1f;
- while (++iUsedLen < iLength) {
- FX_WCHAR wch = pwsStr[iUsedLen];
- if (wch >= L'0' && wch <= L'9') {
- fValue += (wch - L'0') * fPrecise;
- fPrecise *= 0.1f;
- } else {
- break;
- }
- }
- }
- if (pUsedLen) {
- *pUsedLen = iUsedLen;
- }
- return bNegtive ? -fValue : fValue;
-}
-FX_LPWSTR FXSYS_wcsncpy(FX_LPWSTR dstStr, FX_LPCWSTR srcStr, size_t count)
-{
- FXSYS_assert(dstStr != NULL && srcStr != NULL && count > 0);
- for (size_t i = 0; i < count; ++i)
- if ((dstStr[i] = srcStr[i]) == L'\0') {
- break;
- }
- return dstStr;
-}
-FX_INT32 FXSYS_wcsnicmp(FX_LPCWSTR s1, FX_LPCWSTR s2, size_t count)
-{
- FXSYS_assert(s1 != NULL && s2 != NULL && count > 0);
- FX_WCHAR wch1 = 0, wch2 = 0;
- while (count-- > 0) {
- wch1 = (FX_WCHAR)FXSYS_tolower(*s1++);
- wch2 = (FX_WCHAR)FXSYS_tolower(*s2++);
- if (wch1 != wch2) {
- break;
- }
- }
- return wch1 - wch2;
-}
-FX_INT32 FXSYS_strnicmp(FX_LPCSTR s1, FX_LPCSTR s2, size_t count)
-{
- FXSYS_assert(s1 != NULL && s2 != NULL && count > 0);
- FX_CHAR ch1 = 0, ch2 = 0;
- while (count-- > 0) {
- ch1 = (FX_CHAR)FXSYS_tolower(*s1++);
- ch2 = (FX_CHAR)FXSYS_tolower(*s2++);
- if (ch1 != ch2) {
- break;
- }
- }
- return ch1 - ch2;
-}
-FX_DWORD FX_HashCode_String_GetA(FX_LPCSTR pStr, FX_INT32 iLength, FX_BOOL bIgnoreCase)
-{
- FXSYS_assert(pStr != NULL);
- if (iLength < 0) {
- iLength = (FX_INT32)FXSYS_strlen(pStr);
- }
- FX_LPCSTR pStrEnd = pStr + iLength;
- FX_DWORD dwHashCode = 0;
- if (bIgnoreCase) {
- while (pStr < pStrEnd) {
- dwHashCode = 31 * dwHashCode + FXSYS_tolower(*pStr++);
- }
- } else {
- while (pStr < pStrEnd) {
- dwHashCode = 31 * dwHashCode + *pStr ++;
- }
- }
- return dwHashCode;
-}
-FX_DWORD FX_HashCode_String_GetW(FX_LPCWSTR pStr, FX_INT32 iLength, FX_BOOL bIgnoreCase)
-{
- FXSYS_assert(pStr != NULL);
- if (iLength < 0) {
- iLength = (FX_INT32)FXSYS_wcslen(pStr);
- }
- FX_LPCWSTR pStrEnd = pStr + iLength;
- FX_DWORD dwHashCode = 0;
- if (bIgnoreCase) {
- while (pStr < pStrEnd) {
- dwHashCode = 1313 * dwHashCode + FXSYS_tolower(*pStr++);
- }
- } else {
- while (pStr < pStrEnd) {
- dwHashCode = 1313 * dwHashCode + *pStr ++;
- }
- }
- return dwHashCode;
-}
-#ifdef __cplusplus
-}
-#endif
-#ifdef __cplusplus
-extern "C" {
-#endif
-FX_LPVOID FX_Random_MT_Start(FX_DWORD dwSeed)
-{
- FX_LPMTRANDOMCONTEXT pContext = FX_Alloc(FX_MTRANDOMCONTEXT, 1);
- if (!pContext) {
- return NULL;
- }
- pContext->mt[0] = dwSeed;
- FX_DWORD &i = pContext->mti;
- FX_LPDWORD pBuf = pContext->mt;
- for (i = 1; i < MT_N; i ++) {
- pBuf[i] = (1812433253UL * (pBuf[i - 1] ^ (pBuf[i - 1] >> 30)) + i);
- }
- pContext->bHaveSeed = TRUE;
- return pContext;
-}
-FX_DWORD FX_Random_MT_Generate(FX_LPVOID pContext)
-{
- FXSYS_assert(pContext != NULL);
- FX_LPMTRANDOMCONTEXT pMTC = (FX_LPMTRANDOMCONTEXT)pContext;
- FX_DWORD v;
- static FX_DWORD mag[2] = {0, MT_Matrix_A};
- FX_DWORD &mti = pMTC->mti;
- FX_LPDWORD pBuf = pMTC->mt;
- if ((int)mti < 0 || mti >= MT_N) {
- if (mti > MT_N && !pMTC->bHaveSeed) {
- return 0;
- }
- FX_DWORD kk;
- for (kk = 0; kk < MT_N - MT_M; kk ++) {
- v = (pBuf[kk] & MT_Upper_Mask) | (pBuf[kk + 1] & MT_Lower_Mask);
- pBuf[kk] = pBuf[kk + MT_M] ^ (v >> 1) ^ mag[v & 1];
- }
- for (; kk < MT_N - 1; kk ++) {
- v = (pBuf[kk] & MT_Upper_Mask) | (pBuf[kk + 1] & MT_Lower_Mask);
- pBuf[kk] = pBuf[kk + (MT_M - MT_N)] ^ (v >> 1) ^ mag[v & 1];
- }
- v = (pBuf[MT_N - 1] & MT_Upper_Mask) | (pBuf[0] & MT_Lower_Mask);
- pBuf[MT_N - 1] = pBuf[MT_M - 1] ^ (v >> 1) ^ mag[v & 1];
- mti = 0;
- }
- v = pBuf[mti ++];
- v ^= (v >> 11);
- v ^= (v << 7) & 0x9d2c5680UL;
- v ^= (v << 15) & 0xefc60000UL;
- v ^= (v >> 18);
- return v;
-}
-void FX_Random_MT_Close(FX_LPVOID pContext)
-{
- FXSYS_assert(pContext != NULL);
- FX_Free(pContext);
-}
-void FX_Random_GenerateMT(FX_LPDWORD pBuffer, FX_INT32 iCount)
-{
- FX_DWORD dwSeed;
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
- if (!FX_GenerateCryptoRandom(&dwSeed, 1)) {
- FX_Random_GenerateBase(&dwSeed, 1);
- }
-#else
- FX_Random_GenerateBase(&dwSeed, 1);
-#endif
- FX_LPVOID pContext = FX_Random_MT_Start(dwSeed);
- while (iCount -- > 0) {
- *pBuffer ++ = FX_Random_MT_Generate(pContext);
- }
- FX_Random_MT_Close(pContext);
-}
-void FX_Random_GenerateBase(FX_LPDWORD pBuffer, FX_INT32 iCount)
-{
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
- SYSTEMTIME st1, st2;
- ::GetSystemTime(&st1);
- do {
- ::GetSystemTime(&st2);
- } while (FXSYS_memcmp32(&st1, &st2, sizeof(SYSTEMTIME)) == 0);
- FX_DWORD dwHash1 = FX_HashCode_String_GetA((FX_LPCSTR)&st1, sizeof(st1), TRUE);
- FX_DWORD dwHash2 = FX_HashCode_String_GetA((FX_LPCSTR)&st2, sizeof(st2), TRUE);
- ::srand((dwHash1 << 16) | (FX_DWORD)dwHash2);
-#else
- time_t tmLast = time(NULL), tmCur;
- while ((tmCur = time(NULL)) == tmLast);
- ::srand((tmCur << 16) | (tmLast & 0xFFFF));
-#endif
- while (iCount -- > 0) {
- *pBuffer ++ = (FX_DWORD)((::rand() << 16) | (::rand() & 0xFFFF));
- }
-}
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
-FX_BOOL FX_GenerateCryptoRandom(FX_LPDWORD pBuffer, FX_INT32 iCount)
-{
- HCRYPTPROV hCP = NULL;
- if (!::CryptAcquireContext(&hCP, NULL, NULL, PROV_RSA_FULL, 0) || hCP == NULL) {
- return FALSE;
- }
- ::CryptGenRandom(hCP, iCount * sizeof(FX_DWORD), (FX_LPBYTE)pBuffer);
- ::CryptReleaseContext(hCP, 0);
- return TRUE;
-}
-#endif
-void FX_Random_GenerateCrypto(FX_LPDWORD pBuffer, FX_INT32 iCount)
-{
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
- FX_GenerateCryptoRandom(pBuffer, iCount);
-#else
- FX_Random_GenerateBase(pBuffer, iCount);
-#endif
-}
-#ifdef __cplusplus
-}
-#endif
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fxcrt/fx_ext.h"
+#include "extension.h"
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+#include <wincrypt.h>
+#else
+#include <ctime>
+#endif
+FX_HFILE FX_File_Open(FX_BSTR fileName, FX_DWORD dwMode, IFX_Allocator* pAllocator)
+{
+ IFXCRT_FileAccess* pFA = FXCRT_FileAccess_Create(pAllocator);
+ if (pFA && !pFA->Open(fileName, dwMode)) {
+ pFA->Release(pAllocator);
+ return NULL;
+ }
+ return (FX_HFILE)pFA;
+}
+FX_HFILE FX_File_Open(FX_WSTR fileName, FX_DWORD dwMode, IFX_Allocator* pAllocator)
+{
+ IFXCRT_FileAccess* pFA = FXCRT_FileAccess_Create(pAllocator);
+ if (pFA && !pFA->Open(fileName, dwMode)) {
+ pFA->Release(pAllocator);
+ return NULL;
+ }
+ return (FX_HFILE)pFA;
+}
+void FX_File_Close(FX_HFILE hFile, IFX_Allocator* pAllocator)
+{
+ FXSYS_assert(hFile != NULL);
+ ((IFXCRT_FileAccess*)hFile)->Close();
+ ((IFXCRT_FileAccess*)hFile)->Release(pAllocator);
+}
+FX_FILESIZE FX_File_GetSize(FX_HFILE hFile)
+{
+ FXSYS_assert(hFile != NULL);
+ return ((IFXCRT_FileAccess*)hFile)->GetSize();
+}
+FX_FILESIZE FX_File_GetPosition(FX_HFILE hFile)
+{
+ FXSYS_assert(hFile != NULL);
+ return ((IFXCRT_FileAccess*)hFile)->GetPosition();
+}
+FX_FILESIZE FX_File_SetPosition(FX_HFILE hFile, FX_FILESIZE pos)
+{
+ FXSYS_assert(hFile != NULL);
+ return ((IFXCRT_FileAccess*)hFile)->SetPosition(pos);
+}
+size_t FX_File_Read(FX_HFILE hFile, void* pBuffer, size_t szBuffer)
+{
+ FXSYS_assert(hFile != NULL);
+ return ((IFXCRT_FileAccess*)hFile)->Read(pBuffer, szBuffer);
+}
+size_t FX_File_ReadPos(FX_HFILE hFile, void* pBuffer, size_t szBuffer, FX_FILESIZE pos)
+{
+ FXSYS_assert(hFile != NULL);
+ return ((IFXCRT_FileAccess*)hFile)->ReadPos(pBuffer, szBuffer, pos);
+}
+size_t FX_File_Write(FX_HFILE hFile, const void* pBuffer, size_t szBuffer)
+{
+ FXSYS_assert(hFile != NULL);
+ return ((IFXCRT_FileAccess*)hFile)->Write(pBuffer, szBuffer);
+}
+size_t FX_File_WritePos(FX_HFILE hFile, const void* pBuffer, size_t szBuffer, FX_FILESIZE pos)
+{
+ FXSYS_assert(hFile != NULL);
+ return ((IFXCRT_FileAccess*)hFile)->WritePos(pBuffer, szBuffer, pos);
+}
+FX_BOOL FX_File_Flush(FX_HFILE hFile)
+{
+ FXSYS_assert(hFile != NULL);
+ return ((IFXCRT_FileAccess*)hFile)->Flush();
+}
+FX_BOOL FX_File_Truncate(FX_HFILE hFile, FX_FILESIZE szFile)
+{
+ FXSYS_assert(hFile != NULL);
+ return ((IFXCRT_FileAccess*)hFile)->Truncate(szFile);
+}
+IFX_FileStream* FX_CreateFileStream(FX_LPCSTR filename, FX_DWORD dwModes, IFX_Allocator* pAllocator)
+{
+ IFXCRT_FileAccess* pFA = FXCRT_FileAccess_Create(pAllocator);
+ if (!pFA) {
+ return NULL;
+ }
+ if (!pFA->Open(filename, dwModes)) {
+ pFA->Release(pAllocator);
+ return NULL;
+ }
+ if (pAllocator) {
+ return FX_NewAtAllocator(pAllocator) CFX_CRTFileStream(pFA, pAllocator);
+ } else {
+ return FX_NEW CFX_CRTFileStream(pFA, pAllocator);
+ }
+}
+IFX_FileStream* FX_CreateFileStream(FX_LPCWSTR filename, FX_DWORD dwModes, IFX_Allocator* pAllocator)
+{
+ IFXCRT_FileAccess* pFA = FXCRT_FileAccess_Create(pAllocator);
+ if (!pFA) {
+ return NULL;
+ }
+ if (!pFA->Open(filename, dwModes)) {
+ pFA->Release(pAllocator);
+ return NULL;
+ }
+ if (pAllocator) {
+ return FX_NewAtAllocator(pAllocator) CFX_CRTFileStream(pFA, pAllocator);
+ } else {
+ return FX_NEW CFX_CRTFileStream(pFA, pAllocator);
+ }
+}
+IFX_FileWrite* FX_CreateFileWrite(FX_LPCSTR filename, IFX_Allocator* pAllocator)
+{
+ return FX_CreateFileStream(filename, FX_FILEMODE_Truncate, pAllocator);
+}
+IFX_FileWrite* FX_CreateFileWrite(FX_LPCWSTR filename, IFX_Allocator* pAllocator)
+{
+ return FX_CreateFileStream(filename, FX_FILEMODE_Truncate, pAllocator);
+}
+IFX_FileRead* FX_CreateFileRead(FX_LPCSTR filename, IFX_Allocator* pAllocator)
+{
+ return FX_CreateFileStream(filename, FX_FILEMODE_ReadOnly, pAllocator);
+}
+IFX_FileRead* FX_CreateFileRead(FX_LPCWSTR filename, IFX_Allocator* pAllocator)
+{
+ return FX_CreateFileStream(filename, FX_FILEMODE_ReadOnly, pAllocator);
+}
+IFX_MemoryStream* FX_CreateMemoryStream(FX_LPBYTE pBuffer, size_t dwSize, FX_BOOL bTakeOver, IFX_Allocator* pAllocator)
+{
+ if (pAllocator) {
+ return FX_NewAtAllocator(pAllocator)CFX_MemoryStream(pBuffer, dwSize, bTakeOver, pAllocator);
+ } else {
+ return FX_NEW CFX_MemoryStream(pBuffer, dwSize, bTakeOver, NULL);
+ }
+}
+IFX_MemoryStream* FX_CreateMemoryStream(FX_BOOL bConsecutive, IFX_Allocator* pAllocator)
+{
+ if (pAllocator) {
+ return FX_NewAtAllocator(pAllocator)CFX_MemoryStream(bConsecutive, pAllocator);
+ } else {
+ return FX_NEW CFX_MemoryStream(bConsecutive, NULL);
+ }
+}
+#ifdef __cplusplus
+extern "C" {
+#endif
+FX_FLOAT FXSYS_tan(FX_FLOAT a)
+{
+ return (FX_FLOAT)tan(a);
+}
+FX_FLOAT FXSYS_logb(FX_FLOAT b, FX_FLOAT x)
+{
+ return FXSYS_log(x) / FXSYS_log(b);
+}
+FX_FLOAT FXSYS_strtof(FX_LPCSTR pcsStr, FX_INT32 iLength, FX_INT32 *pUsedLen)
+{
+ FXSYS_assert(pcsStr != NULL);
+ if (iLength < 0) {
+ iLength = (FX_INT32)FXSYS_strlen(pcsStr);
+ }
+ CFX_WideString ws = CFX_WideString::FromLocal(pcsStr, iLength);
+ return FXSYS_wcstof((FX_LPCWSTR)ws, iLength, pUsedLen);
+}
+FX_FLOAT FXSYS_wcstof(FX_LPCWSTR pwsStr, FX_INT32 iLength, FX_INT32 *pUsedLen)
+{
+ FXSYS_assert(pwsStr != NULL);
+ if (iLength < 0) {
+ iLength = (FX_INT32)FXSYS_wcslen(pwsStr);
+ }
+ if (iLength == 0) {
+ return 0.0f;
+ }
+ FX_INT32 iUsedLen = 0;
+ FX_BOOL bNegtive = FALSE;
+ switch (pwsStr[iUsedLen]) {
+ case '-':
+ bNegtive = TRUE;
+ case '+':
+ iUsedLen++;
+ break;
+ }
+ FX_FLOAT fValue = 0.0f;
+ while (iUsedLen < iLength) {
+ FX_WCHAR wch = pwsStr[iUsedLen];
+ if (wch >= L'0' && wch <= L'9') {
+ fValue = fValue * 10.0f + (wch - L'0');
+ } else {
+ break;
+ }
+ iUsedLen++;
+ }
+ if (iUsedLen < iLength && pwsStr[iUsedLen] == L'.') {
+ FX_FLOAT fPrecise = 0.1f;
+ while (++iUsedLen < iLength) {
+ FX_WCHAR wch = pwsStr[iUsedLen];
+ if (wch >= L'0' && wch <= L'9') {
+ fValue += (wch - L'0') * fPrecise;
+ fPrecise *= 0.1f;
+ } else {
+ break;
+ }
+ }
+ }
+ if (pUsedLen) {
+ *pUsedLen = iUsedLen;
+ }
+ return bNegtive ? -fValue : fValue;
+}
+FX_LPWSTR FXSYS_wcsncpy(FX_LPWSTR dstStr, FX_LPCWSTR srcStr, size_t count)
+{
+ FXSYS_assert(dstStr != NULL && srcStr != NULL && count > 0);
+ for (size_t i = 0; i < count; ++i)
+ if ((dstStr[i] = srcStr[i]) == L'\0') {
+ break;
+ }
+ return dstStr;
+}
+FX_INT32 FXSYS_wcsnicmp(FX_LPCWSTR s1, FX_LPCWSTR s2, size_t count)
+{
+ FXSYS_assert(s1 != NULL && s2 != NULL && count > 0);
+ FX_WCHAR wch1 = 0, wch2 = 0;
+ while (count-- > 0) {
+ wch1 = (FX_WCHAR)FXSYS_tolower(*s1++);
+ wch2 = (FX_WCHAR)FXSYS_tolower(*s2++);
+ if (wch1 != wch2) {
+ break;
+ }
+ }
+ return wch1 - wch2;
+}
+FX_INT32 FXSYS_strnicmp(FX_LPCSTR s1, FX_LPCSTR s2, size_t count)
+{
+ FXSYS_assert(s1 != NULL && s2 != NULL && count > 0);
+ FX_CHAR ch1 = 0, ch2 = 0;
+ while (count-- > 0) {
+ ch1 = (FX_CHAR)FXSYS_tolower(*s1++);
+ ch2 = (FX_CHAR)FXSYS_tolower(*s2++);
+ if (ch1 != ch2) {
+ break;
+ }
+ }
+ return ch1 - ch2;
+}
+FX_DWORD FX_HashCode_String_GetA(FX_LPCSTR pStr, FX_INT32 iLength, FX_BOOL bIgnoreCase)
+{
+ FXSYS_assert(pStr != NULL);
+ if (iLength < 0) {
+ iLength = (FX_INT32)FXSYS_strlen(pStr);
+ }
+ FX_LPCSTR pStrEnd = pStr + iLength;
+ FX_DWORD dwHashCode = 0;
+ if (bIgnoreCase) {
+ while (pStr < pStrEnd) {
+ dwHashCode = 31 * dwHashCode + FXSYS_tolower(*pStr++);
+ }
+ } else {
+ while (pStr < pStrEnd) {
+ dwHashCode = 31 * dwHashCode + *pStr ++;
+ }
+ }
+ return dwHashCode;
+}
+FX_DWORD FX_HashCode_String_GetW(FX_LPCWSTR pStr, FX_INT32 iLength, FX_BOOL bIgnoreCase)
+{
+ FXSYS_assert(pStr != NULL);
+ if (iLength < 0) {
+ iLength = (FX_INT32)FXSYS_wcslen(pStr);
+ }
+ FX_LPCWSTR pStrEnd = pStr + iLength;
+ FX_DWORD dwHashCode = 0;
+ if (bIgnoreCase) {
+ while (pStr < pStrEnd) {
+ dwHashCode = 1313 * dwHashCode + FXSYS_tolower(*pStr++);
+ }
+ } else {
+ while (pStr < pStrEnd) {
+ dwHashCode = 1313 * dwHashCode + *pStr ++;
+ }
+ }
+ return dwHashCode;
+}
+#ifdef __cplusplus
+}
+#endif
+#ifdef __cplusplus
+extern "C" {
+#endif
+FX_LPVOID FX_Random_MT_Start(FX_DWORD dwSeed)
+{
+ FX_LPMTRANDOMCONTEXT pContext = FX_Alloc(FX_MTRANDOMCONTEXT, 1);
+ if (!pContext) {
+ return NULL;
+ }
+ pContext->mt[0] = dwSeed;
+ FX_DWORD &i = pContext->mti;
+ FX_LPDWORD pBuf = pContext->mt;
+ for (i = 1; i < MT_N; i ++) {
+ pBuf[i] = (1812433253UL * (pBuf[i - 1] ^ (pBuf[i - 1] >> 30)) + i);
+ }
+ pContext->bHaveSeed = TRUE;
+ return pContext;
+}
+FX_DWORD FX_Random_MT_Generate(FX_LPVOID pContext)
+{
+ FXSYS_assert(pContext != NULL);
+ FX_LPMTRANDOMCONTEXT pMTC = (FX_LPMTRANDOMCONTEXT)pContext;
+ FX_DWORD v;
+ static FX_DWORD mag[2] = {0, MT_Matrix_A};
+ FX_DWORD &mti = pMTC->mti;
+ FX_LPDWORD pBuf = pMTC->mt;
+ if ((int)mti < 0 || mti >= MT_N) {
+ if (mti > MT_N && !pMTC->bHaveSeed) {
+ return 0;
+ }
+ FX_DWORD kk;
+ for (kk = 0; kk < MT_N - MT_M; kk ++) {
+ v = (pBuf[kk] & MT_Upper_Mask) | (pBuf[kk + 1] & MT_Lower_Mask);
+ pBuf[kk] = pBuf[kk + MT_M] ^ (v >> 1) ^ mag[v & 1];
+ }
+ for (; kk < MT_N - 1; kk ++) {
+ v = (pBuf[kk] & MT_Upper_Mask) | (pBuf[kk + 1] & MT_Lower_Mask);
+ pBuf[kk] = pBuf[kk + (MT_M - MT_N)] ^ (v >> 1) ^ mag[v & 1];
+ }
+ v = (pBuf[MT_N - 1] & MT_Upper_Mask) | (pBuf[0] & MT_Lower_Mask);
+ pBuf[MT_N - 1] = pBuf[MT_M - 1] ^ (v >> 1) ^ mag[v & 1];
+ mti = 0;
+ }
+ v = pBuf[mti ++];
+ v ^= (v >> 11);
+ v ^= (v << 7) & 0x9d2c5680UL;
+ v ^= (v << 15) & 0xefc60000UL;
+ v ^= (v >> 18);
+ return v;
+}
+void FX_Random_MT_Close(FX_LPVOID pContext)
+{
+ FXSYS_assert(pContext != NULL);
+ FX_Free(pContext);
+}
+void FX_Random_GenerateMT(FX_LPDWORD pBuffer, FX_INT32 iCount)
+{
+ FX_DWORD dwSeed;
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+ if (!FX_GenerateCryptoRandom(&dwSeed, 1)) {
+ FX_Random_GenerateBase(&dwSeed, 1);
+ }
+#else
+ FX_Random_GenerateBase(&dwSeed, 1);
+#endif
+ FX_LPVOID pContext = FX_Random_MT_Start(dwSeed);
+ while (iCount -- > 0) {
+ *pBuffer ++ = FX_Random_MT_Generate(pContext);
+ }
+ FX_Random_MT_Close(pContext);
+}
+void FX_Random_GenerateBase(FX_LPDWORD pBuffer, FX_INT32 iCount)
+{
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+ SYSTEMTIME st1, st2;
+ ::GetSystemTime(&st1);
+ do {
+ ::GetSystemTime(&st2);
+ } while (FXSYS_memcmp32(&st1, &st2, sizeof(SYSTEMTIME)) == 0);
+ FX_DWORD dwHash1 = FX_HashCode_String_GetA((FX_LPCSTR)&st1, sizeof(st1), TRUE);
+ FX_DWORD dwHash2 = FX_HashCode_String_GetA((FX_LPCSTR)&st2, sizeof(st2), TRUE);
+ ::srand((dwHash1 << 16) | (FX_DWORD)dwHash2);
+#else
+ time_t tmLast = time(NULL), tmCur;
+ while ((tmCur = time(NULL)) == tmLast);
+ ::srand((tmCur << 16) | (tmLast & 0xFFFF));
+#endif
+ while (iCount -- > 0) {
+ *pBuffer ++ = (FX_DWORD)((::rand() << 16) | (::rand() & 0xFFFF));
+ }
+}
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+FX_BOOL FX_GenerateCryptoRandom(FX_LPDWORD pBuffer, FX_INT32 iCount)
+{
+ HCRYPTPROV hCP = NULL;
+ if (!::CryptAcquireContext(&hCP, NULL, NULL, PROV_RSA_FULL, 0) || hCP == NULL) {
+ return FALSE;
+ }
+ ::CryptGenRandom(hCP, iCount * sizeof(FX_DWORD), (FX_LPBYTE)pBuffer);
+ ::CryptReleaseContext(hCP, 0);
+ return TRUE;
+}
+#endif
+void FX_Random_GenerateCrypto(FX_LPDWORD pBuffer, FX_INT32 iCount)
+{
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+ FX_GenerateCryptoRandom(pBuffer, iCount);
+#else
+ FX_Random_GenerateBase(pBuffer, iCount);
+#endif
+}
+#ifdef __cplusplus
+}
+#endif
diff --git a/core/src/fxcrt/fx_xml_composer.cpp b/core/src/fxcrt/fx_xml_composer.cpp
index d68dd1ff27..1fce9009db 100644
--- a/core/src/fxcrt/fx_xml_composer.cpp
+++ b/core/src/fxcrt/fx_xml_composer.cpp
@@ -1,42 +1,42 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../include/fxcrt/fx_xml.h"
-#include "xml_int.h"
-void FX_XML_SplitQualifiedName(FX_BSTR bsFullName, CFX_ByteStringC &bsSpace, CFX_ByteStringC &bsName)
-{
- if (bsFullName.IsEmpty()) {
- return;
- }
- FX_INT32 iStart = 0;
- for (; iStart < bsFullName.GetLength(); iStart ++) {
- if (bsFullName.GetAt(iStart) == ':') {
- break;
- }
- }
- if (iStart >= bsFullName.GetLength()) {
- bsName = bsFullName;
- } else {
- bsSpace = CFX_ByteStringC(bsFullName.GetCStr(), iStart);
- iStart ++;
- bsName = CFX_ByteStringC(bsFullName.GetCStr() + iStart, bsFullName.GetLength() - iStart);
- }
-}
-void CXML_Element::SetTag(FX_BSTR qSpace, FX_BSTR tagname)
-{
- IFX_Allocator* pAllocator = m_Children.m_pAllocator;
- m_QSpaceName.Set(qSpace, pAllocator);
- m_TagName.Set(tagname, pAllocator);
-}
-void CXML_Element::SetTag(FX_BSTR qTagName)
-{
- ASSERT(!qTagName.IsEmpty());
- IFX_Allocator* pAllocator = m_Children.m_pAllocator;
- CFX_ByteStringC bsSpace, bsName;
- FX_XML_SplitQualifiedName(qTagName, bsSpace, bsName);
- m_QSpaceName.Set(bsSpace, pAllocator);
- m_TagName.Set(bsName, pAllocator);
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fxcrt/fx_xml.h"
+#include "xml_int.h"
+void FX_XML_SplitQualifiedName(FX_BSTR bsFullName, CFX_ByteStringC &bsSpace, CFX_ByteStringC &bsName)
+{
+ if (bsFullName.IsEmpty()) {
+ return;
+ }
+ FX_INT32 iStart = 0;
+ for (; iStart < bsFullName.GetLength(); iStart ++) {
+ if (bsFullName.GetAt(iStart) == ':') {
+ break;
+ }
+ }
+ if (iStart >= bsFullName.GetLength()) {
+ bsName = bsFullName;
+ } else {
+ bsSpace = CFX_ByteStringC(bsFullName.GetCStr(), iStart);
+ iStart ++;
+ bsName = CFX_ByteStringC(bsFullName.GetCStr() + iStart, bsFullName.GetLength() - iStart);
+ }
+}
+void CXML_Element::SetTag(FX_BSTR qSpace, FX_BSTR tagname)
+{
+ IFX_Allocator* pAllocator = m_Children.m_pAllocator;
+ m_QSpaceName.Set(qSpace, pAllocator);
+ m_TagName.Set(tagname, pAllocator);
+}
+void CXML_Element::SetTag(FX_BSTR qTagName)
+{
+ ASSERT(!qTagName.IsEmpty());
+ IFX_Allocator* pAllocator = m_Children.m_pAllocator;
+ CFX_ByteStringC bsSpace, bsName;
+ FX_XML_SplitQualifiedName(qTagName, bsSpace, bsName);
+ m_QSpaceName.Set(bsSpace, pAllocator);
+ m_TagName.Set(bsName, pAllocator);
+}
diff --git a/core/src/fxcrt/fx_xml_parser.cpp b/core/src/fxcrt/fx_xml_parser.cpp
index 85e9544342..c3d4b9c506 100644
--- a/core/src/fxcrt/fx_xml_parser.cpp
+++ b/core/src/fxcrt/fx_xml_parser.cpp
@@ -1,1017 +1,1017 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../include/fxcrt/fx_xml.h"
-#include "xml_int.h"
-CXML_Parser::~CXML_Parser()
-{
- if (m_bOwnedStream) {
- m_pDataAcc->Release();
- }
-}
-FX_BOOL CXML_Parser::Init(FX_LPBYTE pBuffer, size_t size)
-{
- if (m_pAllocator) {
- m_pDataAcc = FX_NewAtAllocator(m_pAllocator)CXML_DataBufAcc(pBuffer, size, m_pAllocator);
- } else {
- m_pDataAcc = FX_NEW CXML_DataBufAcc(pBuffer, size, NULL);
- }
- if (!m_pDataAcc) {
- return FALSE;
- }
- return Init(TRUE);
-}
-FX_BOOL CXML_Parser::Init(IFX_FileRead *pFileRead)
-{
- if (m_pAllocator) {
- m_pDataAcc = FX_NewAtAllocator(m_pAllocator)CXML_DataStmAcc(pFileRead, m_pAllocator);
- } else {
- m_pDataAcc = FX_NEW CXML_DataStmAcc(pFileRead, NULL);
- }
- if (!m_pDataAcc) {
- return FALSE;
- }
- return Init(TRUE);
-}
-FX_BOOL CXML_Parser::Init(IFX_BufferRead *pBuffer)
-{
- if (!pBuffer) {
- return FALSE;
- }
- m_pDataAcc = pBuffer;
- return Init(FALSE);
-}
-FX_BOOL CXML_Parser::Init(FX_BOOL bOwndedStream)
-{
- m_bOwnedStream = bOwndedStream;
- m_nOffset = 0;
- return ReadNextBlock();
-}
-FX_BOOL CXML_Parser::ReadNextBlock()
-{
- if (!m_pDataAcc->ReadNextBlock()) {
- return FALSE;
- }
- m_pBuffer = m_pDataAcc->GetBlockBuffer();
- m_dwBufferSize = m_pDataAcc->GetBlockSize();
- m_nBufferOffset = m_pDataAcc->GetBlockOffset();
- m_dwIndex = 0;
- return m_dwBufferSize > 0;
-}
-FX_BOOL CXML_Parser::IsEOF()
-{
- if (!m_pDataAcc->IsEOF()) {
- return FALSE;
- }
- return m_dwIndex >= m_dwBufferSize;
-}
-#define FXCRTM_XML_CHARTYPE_Normal 0x00
-#define FXCRTM_XML_CHARTYPE_SpaceChar 0x01
-#define FXCRTM_XML_CHARTYPE_Letter 0x02
-#define FXCRTM_XML_CHARTYPE_Digital 0x04
-#define FXCRTM_XML_CHARTYPE_NameIntro 0x08
-#define FXCRTM_XML_CHARTYPE_NameChar 0x10
-#define FXCRTM_XML_CHARTYPE_HexDigital 0x20
-#define FXCRTM_XML_CHARTYPE_HexLowerLetter 0x40
-#define FXCRTM_XML_CHARTYPE_HexUpperLetter 0x60
-#define FXCRTM_XML_CHARTYPE_HexChar 0x60
-FX_BYTE g_FXCRT_XML_ByteTypes[256] = {
- 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
- 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
- 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00,
- 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x7A, 0x7A, 0x7A, 0x7A, 0x7A, 0x7A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A,
- 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x18,
- 0x00, 0x5A, 0x5A, 0x5A, 0x5A, 0x5A, 0x5A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A,
- 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A,
- 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A,
- 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A,
- 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A,
- 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A,
- 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A,
- 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A,
- 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x01, 0x01,
-};
-FX_BOOL g_FXCRT_XML_IsWhiteSpace(FX_BYTE ch)
-{
- return (g_FXCRT_XML_ByteTypes[ch] & FXCRTM_XML_CHARTYPE_SpaceChar) != 0;
-}
-FX_BOOL g_FXCRT_XML_IsLetter(FX_BYTE ch)
-{
- return (g_FXCRT_XML_ByteTypes[ch] & FXCRTM_XML_CHARTYPE_Letter) != 0;
-}
-FX_BOOL g_FXCRT_XML_IsDigital(FX_BYTE ch)
-{
- return (g_FXCRT_XML_ByteTypes[ch] & FXCRTM_XML_CHARTYPE_Digital) != 0;
-}
-FX_BOOL g_FXCRT_XML_IsNameIntro(FX_BYTE ch)
-{
- return (g_FXCRT_XML_ByteTypes[ch] & FXCRTM_XML_CHARTYPE_NameIntro) != 0;
-}
-FX_BOOL g_FXCRT_XML_IsNameChar(FX_BYTE ch)
-{
- return (g_FXCRT_XML_ByteTypes[ch] & FXCRTM_XML_CHARTYPE_NameChar) != 0;
-}
-FX_BOOL g_FXCRT_XML_IsHexChar(FX_BYTE ch)
-{
- return (g_FXCRT_XML_ByteTypes[ch] & FXCRTM_XML_CHARTYPE_HexChar) != 0;
-}
-void CXML_Parser::SkipWhiteSpaces()
-{
- m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;
- if (IsEOF()) {
- return;
- }
- do {
- while (m_dwIndex < m_dwBufferSize && g_FXCRT_XML_IsWhiteSpace(m_pBuffer[m_dwIndex])) {
- m_dwIndex ++;
- }
- m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;
- if (m_dwIndex < m_dwBufferSize || IsEOF()) {
- break;
- }
- } while (ReadNextBlock());
-}
-void CXML_Parser::GetName(CFX_ByteStringL &space, CFX_ByteStringL &name)
-{
- m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;
- if (IsEOF()) {
- return;
- }
- CFX_ByteTextBuf buf(m_pAllocator);
- FX_BYTE ch;
- do {
- while (m_dwIndex < m_dwBufferSize) {
- ch = m_pBuffer[m_dwIndex];
- if (ch == ':') {
- buf.GetByteStringL(space);
- buf.Clear();
- } else if (g_FXCRT_XML_IsNameChar(ch)) {
- buf.AppendChar(ch);
- } else {
- break;
- }
- m_dwIndex ++;
- }
- m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;
- if (m_dwIndex < m_dwBufferSize || IsEOF()) {
- break;
- }
- } while (ReadNextBlock());
- buf.GetByteStringL(name);
-}
-void CXML_Parser::SkipLiterals(FX_BSTR str)
-{
- m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;
- if (IsEOF()) {
- return;
- }
- FX_INT32 i = 0, iLen = str.GetLength();
- do {
- while (m_dwIndex < m_dwBufferSize) {
- if (str.GetAt(i) != m_pBuffer[m_dwIndex ++]) {
- i = 0;
- } else {
- i ++;
- if (i == iLen) {
- break;
- }
- }
- }
- m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;
- if (i == iLen) {
- return;
- }
- if (m_dwIndex < m_dwBufferSize || IsEOF()) {
- break;
- }
- } while (ReadNextBlock());
- while (!m_pDataAcc->IsEOF()) {
- ReadNextBlock();
- m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwBufferSize;
- }
- m_dwIndex = m_dwBufferSize;
-}
-FX_DWORD CXML_Parser::GetCharRef()
-{
- m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;
- if (IsEOF()) {
- return 0;
- }
- FX_BYTE ch;
- FX_INT32 iState = 0;
- CFX_ByteTextBuf buf(m_pAllocator);
- FX_DWORD code = 0;
- do {
- while (m_dwIndex < m_dwBufferSize) {
- ch = m_pBuffer[m_dwIndex];
- switch (iState) {
- case 0:
- if (ch == '#') {
- m_dwIndex ++;
- iState = 2;
- break;
- }
- iState = 1;
- case 1:
- m_dwIndex ++;
- if (ch == ';') {
- CFX_ByteStringC ref = buf.GetByteString();
- if (ref == FX_BSTRC("gt")) {
- code = '>';
- } else if (ref == FX_BSTRC("lt")) {
- code = '<';
- } else if (ref == FX_BSTRC("amp")) {
- code = '&';
- } else if (ref == FX_BSTRC("apos")) {
- code = '\'';
- } else if (ref == FX_BSTRC("quot")) {
- code = '"';
- }
- iState = 10;
- break;
- }
- buf.AppendByte(ch);
- break;
- case 2:
- if (ch == 'x') {
- m_dwIndex ++;
- iState = 4;
- break;
- }
- iState = 3;
- case 3:
- m_dwIndex ++;
- if (ch == ';') {
- iState = 10;
- break;
- }
- if (g_FXCRT_XML_IsDigital(ch)) {
- code = code * 10 + ch - '0';
- }
- break;
- case 4:
- m_dwIndex ++;
- if (ch == ';') {
- iState = 10;
- break;
- }
- FX_BYTE nHex = g_FXCRT_XML_ByteTypes[ch] & FXCRTM_XML_CHARTYPE_HexChar;
- if (nHex) {
- if (nHex == FXCRTM_XML_CHARTYPE_HexDigital) {
- code = (code << 4) + ch - '0';
- } else if (nHex == FXCRTM_XML_CHARTYPE_HexLowerLetter) {
- code = (code << 4) + ch - 87;
- } else {
- code = (code << 4) + ch - 55;
- }
- }
- break;
- }
- if (iState == 10) {
- break;
- }
- }
- m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;
- if (iState == 10 || m_dwIndex < m_dwBufferSize || IsEOF()) {
- break;
- }
- } while (ReadNextBlock());
- return code;
-}
-void CXML_Parser::GetAttrValue(CFX_WideStringL &value)
-{
- m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;
- if (IsEOF()) {
- return;
- }
- CFX_UTF8Decoder decoder(m_pAllocator);
- FX_BYTE mark = 0, ch;
- do {
- while (m_dwIndex < m_dwBufferSize) {
- ch = m_pBuffer[m_dwIndex];
- if (mark == 0) {
- if (ch != '\'' && ch != '"') {
- return;
- }
- mark = ch;
- m_dwIndex ++;
- ch = 0;
- continue;
- }
- m_dwIndex ++;
- if (ch == mark) {
- break;
- }
- if (ch == '&') {
- decoder.AppendChar(GetCharRef());
- if (IsEOF()) {
- decoder.GetResult(value);
- return;
- }
- } else {
- decoder.Input(ch);
- }
- }
- m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;
- if (ch == mark || m_dwIndex < m_dwBufferSize || IsEOF()) {
- break;
- }
- } while (ReadNextBlock());
- decoder.GetResult(value);
-}
-void CXML_Parser::GetTagName(CFX_ByteStringL &space, CFX_ByteStringL &name, FX_BOOL &bEndTag, FX_BOOL bStartTag)
-{
- m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;
- if (IsEOF()) {
- return;
- }
- bEndTag = FALSE;
- FX_BYTE ch;
- FX_INT32 iState = bStartTag ? 1 : 0;
- do {
- while (m_dwIndex < m_dwBufferSize) {
- ch = m_pBuffer[m_dwIndex];
- switch (iState) {
- case 0:
- m_dwIndex ++;
- if (ch != '<') {
- break;
- }
- iState = 1;
- break;
- case 1:
- if (ch == '?') {
- m_dwIndex ++;
- SkipLiterals(FX_BSTRC("?>"));
- iState = 0;
- break;
- } else if (ch == '!') {
- m_dwIndex ++;
- SkipLiterals(FX_BSTRC("-->"));
- iState = 0;
- break;
- }
- if (ch == '/') {
- m_dwIndex ++;
- GetName(space, name);
- bEndTag = TRUE;
- } else {
- GetName(space, name);
- bEndTag = FALSE;
- }
- return;
- }
- }
- m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;
- if (m_dwIndex < m_dwBufferSize || IsEOF()) {
- break;
- }
- } while (ReadNextBlock());
-}
-CXML_Element* CXML_Parser::ParseElement(CXML_Element* pParent, FX_BOOL bStartTag)
-{
- m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;
- if (IsEOF()) {
- return NULL;
- }
- CFX_ByteStringL tag_name, tag_space;
- FX_BOOL bEndTag;
- GetTagName(tag_space, tag_name, bEndTag, bStartTag);
- if (tag_name.IsEmpty() || bEndTag) {
- tag_space.Empty(m_pAllocator);
- return NULL;
- }
- CXML_Element* pElement;
- if (m_pAllocator) {
- pElement = FX_NewAtAllocator(m_pAllocator)CXML_Element(m_pAllocator);
- } else {
- pElement = FX_NEW CXML_Element;
- }
- if (pElement) {
- pElement->m_pParent = pParent;
- pElement->SetTag(tag_space, tag_name);
- }
- tag_space.Empty(m_pAllocator);
- tag_name.Empty(m_pAllocator);
- if (!pElement) {
- return NULL;
- }
- do {
- CFX_ByteStringL attr_space, attr_name;
- while (m_dwIndex < m_dwBufferSize) {
- SkipWhiteSpaces();
- if (IsEOF()) {
- break;
- }
- if (!g_FXCRT_XML_IsNameIntro(m_pBuffer[m_dwIndex])) {
- break;
- }
- attr_space.Empty(m_pAllocator);
- attr_name.Empty(m_pAllocator);
- GetName(attr_space, attr_name);
- SkipWhiteSpaces();
- if (IsEOF()) {
- break;
- }
- if (m_pBuffer[m_dwIndex] != '=') {
- break;
- }
- m_dwIndex ++;
- SkipWhiteSpaces();
- if (IsEOF()) {
- break;
- }
- CFX_WideStringL attr_value;
- GetAttrValue(attr_value);
- pElement->m_AttrMap.SetAt(attr_space, attr_name, attr_value, m_pAllocator);
- attr_value.Empty(m_pAllocator);
- }
- attr_space.Empty(m_pAllocator);
- attr_name.Empty(m_pAllocator);
- m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;
- if (m_dwIndex < m_dwBufferSize || IsEOF()) {
- break;
- }
- } while (ReadNextBlock());
- SkipWhiteSpaces();
- if (IsEOF()) {
- return pElement;
- }
- FX_BYTE ch = m_pBuffer[m_dwIndex ++];
- if (ch == '/') {
- m_dwIndex ++;
- m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;
- return pElement;
- }
- if (ch != '>') {
- m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;
- if (m_pAllocator) {
- FX_DeleteAtAllocator(pElement, m_pAllocator, CXML_Element);
- } else {
- delete pElement;
- }
- return NULL;
- }
- SkipWhiteSpaces();
- if (IsEOF()) {
- return pElement;
- }
- CFX_UTF8Decoder decoder(m_pAllocator);
- CFX_WideTextBuf content(m_pAllocator);
- FX_BOOL bCDATA = FALSE;
- FX_INT32 iState = 0;
- do {
- while (m_dwIndex < m_dwBufferSize) {
- ch = m_pBuffer[m_dwIndex ++];
- switch (iState) {
- case 0:
- if (ch == '<') {
- iState = 1;
- } else if (ch == '&') {
- decoder.ClearStatus();
- decoder.AppendChar(GetCharRef());
- } else {
- decoder.Input(ch);
- }
- break;
- case 1:
- if (ch == '!') {
- iState = 2;
- } else if (ch == '?') {
- SkipLiterals(FX_BSTRC("?>"));
- SkipWhiteSpaces();
- iState = 0;
- } else if (ch == '/') {
- CFX_ByteStringL space, name;
- GetName(space, name);
- space.Empty(m_pAllocator);
- name.Empty(m_pAllocator);
- SkipWhiteSpaces();
- m_dwIndex ++;
- iState = 10;
- } else {
- content << decoder.GetResult();
- CFX_WideStringL dataStr;
- content.GetWideStringL(dataStr);
- if (!bCDATA && !m_bSaveSpaceChars) {
- dataStr.TrimRight((FX_LPCWSTR)L" \t\r\n");
- }
- InsertContentSegment(bCDATA, dataStr, pElement);
- dataStr.Empty(m_pAllocator);
- content.Clear();
- decoder.Clear();
- bCDATA = FALSE;
- iState = 0;
- m_dwIndex --;
- CXML_Element* pSubElement = ParseElement(pElement, TRUE);
- if (pSubElement == NULL) {
- break;
- }
- pSubElement->m_pParent = pElement;
- pElement->m_Children.Add((FX_LPVOID)CXML_Element::Element);
- pElement->m_Children.Add(pSubElement);
- SkipWhiteSpaces();
- }
- break;
- case 2:
- if (ch == '[') {
- SkipLiterals(FX_BSTRC("]]>"));
- } else if (ch == '-') {
- m_dwIndex ++;
- SkipLiterals(FX_BSTRC("-->"));
- } else {
- SkipLiterals(FX_BSTRC(">"));
- }
- decoder.Clear();
- SkipWhiteSpaces();
- iState = 0;
- break;
- }
- if (iState == 10) {
- break;
- }
- }
- m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;
- if (iState == 10 || m_dwIndex < m_dwBufferSize || IsEOF()) {
- break;
- }
- } while (ReadNextBlock());
- content << decoder.GetResult();
- CFX_WideStringL dataStr;
- content.GetWideStringL(dataStr);
- if (!m_bSaveSpaceChars) {
- dataStr.TrimRight((FX_LPCWSTR)L" \t\r\n");
- }
- InsertContentSegment(bCDATA, dataStr, pElement);
- dataStr.Empty(m_pAllocator);
- content.Clear();
- decoder.Clear();
- bCDATA = FALSE;
- return pElement;
-}
-void CXML_Parser::InsertContentSegment(FX_BOOL bCDATA, FX_WSTR content, CXML_Element* pElement)
-{
- if (content.IsEmpty()) {
- return;
- }
- CXML_Content* pContent;
- if (m_pAllocator) {
- pContent = FX_NewAtAllocator(m_pAllocator)CXML_Content;
- } else {
- pContent = FX_NEW CXML_Content;
- }
- if (!pContent) {
- return;
- }
- pContent->Set(bCDATA, content, m_pAllocator);
- pElement->m_Children.Add((FX_LPVOID)CXML_Element::Content);
- pElement->m_Children.Add(pContent);
-}
-static CXML_Element* XML_ContinueParse(CXML_Parser &parser, FX_BOOL bSaveSpaceChars, FX_FILESIZE* pParsedSize)
-{
- parser.m_bSaveSpaceChars = bSaveSpaceChars;
- CXML_Element* pElement = parser.ParseElement(NULL, FALSE);
- if (pParsedSize) {
- *pParsedSize = parser.m_nOffset;
- }
- return pElement;
-}
-CXML_Element* CXML_Element::Parse(const void* pBuffer, size_t size, FX_BOOL bSaveSpaceChars, FX_FILESIZE* pParsedSize, IFX_Allocator* pAllocator)
-{
- CXML_Parser parser(pAllocator);
- if (!parser.Init((FX_LPBYTE)pBuffer, size)) {
- return NULL;
- }
- return XML_ContinueParse(parser, bSaveSpaceChars, pParsedSize);
-}
-CXML_Element* CXML_Element::Parse(IFX_FileRead *pFile, FX_BOOL bSaveSpaceChars, FX_FILESIZE* pParsedSize, IFX_Allocator* pAllocator)
-{
- CXML_Parser parser(pAllocator);
- if (!parser.Init(pFile)) {
- return NULL;
- }
- return XML_ContinueParse(parser, bSaveSpaceChars, pParsedSize);
-}
-CXML_Element* CXML_Element::Parse(IFX_BufferRead *pBuffer, FX_BOOL bSaveSpaceChars, FX_FILESIZE* pParsedSize, IFX_Allocator* pAllocator)
-{
- CXML_Parser parser(pAllocator);
- if (!parser.Init(pBuffer)) {
- return NULL;
- }
- return XML_ContinueParse(parser, bSaveSpaceChars, pParsedSize);
-}
-CXML_Element::CXML_Element(IFX_Allocator* pAllocator)
- : m_pParent(NULL)
- , m_QSpaceName()
- , m_TagName()
- , m_AttrMap()
- , m_Children(pAllocator)
-{
-}
-CXML_Element::CXML_Element(FX_BSTR qSpace, FX_BSTR tagName, IFX_Allocator* pAllocator)
- : m_pParent(NULL)
- , m_QSpaceName()
- , m_TagName()
- , m_AttrMap()
- , m_Children(pAllocator)
-{
- m_QSpaceName.Set(qSpace, pAllocator);
- m_TagName.Set(tagName, pAllocator);
-}
-CXML_Element::CXML_Element(FX_BSTR qTagName, IFX_Allocator* pAllocator)
- : m_pParent(NULL)
- , m_QSpaceName()
- , m_TagName()
- , m_AttrMap()
- , m_Children(pAllocator)
-{
- SetTag(qTagName);
-}
-CXML_Element::~CXML_Element()
-{
- Empty();
-}
-void CXML_Element::Empty()
-{
- IFX_Allocator* pAllocator = m_Children.m_pAllocator;
- m_QSpaceName.Empty(pAllocator);
- m_TagName.Empty(pAllocator);
- m_AttrMap.RemoveAll(pAllocator);
- RemoveChildren();
-}
-void CXML_Element::RemoveChildren()
-{
- IFX_Allocator* pAllocator = m_Children.m_pAllocator;
- for (int i = 0; i < m_Children.GetSize(); i += 2) {
- ChildType type = (ChildType)(FX_UINTPTR)m_Children.GetAt(i);
- if (type == Content) {
- CXML_Content* content = (CXML_Content*)m_Children.GetAt(i + 1);
- if (pAllocator) {
- FX_DeleteAtAllocator(content, pAllocator, CXML_Content);
- } else {
- delete content;
- }
- } else if (type == Element) {
- CXML_Element* child = (CXML_Element*)m_Children.GetAt(i + 1);
- child->RemoveChildren();
- if (pAllocator) {
- FX_DeleteAtAllocator(child, pAllocator, CXML_Element);
- } else {
- delete child;
- }
- }
- }
- m_Children.RemoveAll();
-}
-CFX_ByteString CXML_Element::GetTagName(FX_BOOL bQualified) const
-{
- if (!bQualified || m_QSpaceName.IsEmpty()) {
- return m_TagName;
- }
- CFX_ByteString bsTag = m_QSpaceName;
- bsTag += ":";
- bsTag += m_TagName;
- return bsTag;
-}
-void CXML_Element::GetTagName(CFX_ByteStringL &tagName, FX_BOOL bQualified) const
-{
- IFX_Allocator* pAllocator = m_Children.m_pAllocator;
- if (!bQualified || m_QSpaceName.IsEmpty()) {
- tagName.Set(m_TagName, pAllocator);
- return;
- }
- FX_LPSTR str = tagName.AllocBuffer(m_QSpaceName.GetLength() + m_TagName.GetLength() + 2, pAllocator);
- if (!str) {
- return;
- }
- FXSYS_memcpy32(str, m_QSpaceName.GetCStr(), m_QSpaceName.GetLength());
- str += m_QSpaceName.GetLength();
- *str = ':';
- str ++;
- FXSYS_memcpy32(str, m_TagName.GetCStr(), m_TagName.GetLength());
- str += m_TagName.GetLength();
- *str = '\0';
-}
-CFX_ByteString CXML_Element::GetNamespace(FX_BOOL bQualified) const
-{
- if (bQualified) {
- return m_QSpaceName;
- }
- return GetNamespaceURI(m_QSpaceName);
-}
-void CXML_Element::GetNamespace(CFX_ByteStringL &nameSpace, FX_BOOL bQualified) const
-{
- IFX_Allocator* pAllocator = m_Children.m_pAllocator;
- if (bQualified) {
- nameSpace.Set(m_QSpaceName, pAllocator);
- return;
- }
- GetNamespaceURI(m_QSpaceName, nameSpace);
-}
-CFX_ByteString CXML_Element::GetNamespaceURI(FX_BSTR qName) const
-{
- const CFX_WideStringL* pwsSpace;
- const CXML_Element *pElement = this;
- do {
- if (qName.IsEmpty()) {
- pwsSpace = pElement->m_AttrMap.Lookup(FX_BSTRC(""), FX_BSTRC("xmlns"));
- } else {
- pwsSpace = pElement->m_AttrMap.Lookup(FX_BSTRC("xmlns"), qName);
- }
- if (pwsSpace) {
- break;
- }
- pElement = pElement->GetParent();
- } while(pElement);
- return pwsSpace ? FX_UTF8Encode(*pwsSpace) : CFX_ByteString();
-}
-void CXML_Element::GetNamespaceURI(FX_BSTR qName, CFX_ByteStringL &uri) const
-{
- IFX_Allocator* pAllocator = m_Children.m_pAllocator;
- const CFX_WideStringL* pwsSpace;
- const CXML_Element *pElement = this;
- do {
- if (qName.IsEmpty()) {
- pwsSpace = pElement->m_AttrMap.Lookup(FX_BSTRC(""), FX_BSTRC("xmlns"));
- } else {
- pwsSpace = pElement->m_AttrMap.Lookup(FX_BSTRC("xmlns"), qName);
- }
- if (pwsSpace) {
- break;
- }
- pElement = pElement->GetParent();
- } while(pElement);
- if (pwsSpace) {
- FX_UTF8Encode(pwsSpace->GetPtr(), pwsSpace->GetLength(), uri, pAllocator);
- }
-}
-void CXML_Element::GetAttrByIndex(int index, CFX_ByteString& space, CFX_ByteString& name, CFX_WideString& value) const
-{
- if (index < 0 || index >= m_AttrMap.GetSize()) {
- return;
- }
- CXML_AttrItem& item = m_AttrMap.GetAt(index);
- space = item.m_QSpaceName;
- name = item.m_AttrName;
- value = item.m_Value;
-}
-void CXML_Element::GetAttrByIndex(int index, CFX_ByteStringL &space, CFX_ByteStringL &name, CFX_WideStringL &value) const
-{
- if (index < 0 || index >= m_AttrMap.GetSize()) {
- return;
- }
- IFX_Allocator* pAllocator = m_Children.m_pAllocator;
- CXML_AttrItem& item = m_AttrMap.GetAt(index);
- space.Set(item.m_QSpaceName, pAllocator);
- name.Set(item.m_AttrName, pAllocator);
- value.Set(item.m_Value, pAllocator);
-}
-FX_BOOL CXML_Element::HasAttr(FX_BSTR name) const
-{
- CFX_ByteStringC bsSpace, bsName;
- FX_XML_SplitQualifiedName(name, bsSpace, bsName);
- return m_AttrMap.Lookup(bsSpace, bsName) != NULL;
-}
-FX_BOOL CXML_Element::GetAttrValue(FX_BSTR name, CFX_WideString& attribute) const
-{
- CFX_ByteStringC bsSpace, bsName;
- FX_XML_SplitQualifiedName(name, bsSpace, bsName);
- const CFX_WideStringL* pValue = m_AttrMap.Lookup(bsSpace, bsName);
- if (pValue) {
- attribute = CFX_WideString(pValue->GetPtr(), pValue->GetLength());
- return TRUE;
- }
- return FALSE;
-}
-const CFX_WideStringL* CXML_Element::GetAttrValuePtr(FX_BSTR name) const
-{
- CFX_ByteStringC bsSpace, bsName;
- FX_XML_SplitQualifiedName(name, bsSpace, bsName);
- return m_AttrMap.Lookup(bsSpace, bsName);
-}
-FX_BOOL CXML_Element::GetAttrValue(FX_BSTR space, FX_BSTR name, CFX_WideString& attribute) const
-{
- const CFX_WideStringL* pValue = m_AttrMap.Lookup(space, name);
- if (pValue) {
- attribute = CFX_WideString(pValue->GetPtr(), pValue->GetLength());
- return TRUE;
- }
- return FALSE;
-}
-const CFX_WideStringL* CXML_Element::GetAttrValuePtr(FX_BSTR space, FX_BSTR name) const
-{
- return m_AttrMap.Lookup(space, name);
-}
-FX_BOOL CXML_Element::GetAttrInteger(FX_BSTR name, int& attribute) const
-{
- CFX_ByteStringC bsSpace, bsName;
- FX_XML_SplitQualifiedName(name, bsSpace, bsName);
- const CFX_WideStringL* pwsValue = m_AttrMap.Lookup(bsSpace, bsName);
- if (pwsValue) {
- attribute = pwsValue->GetInteger();
- return TRUE;
- }
- return FALSE;
-}
-FX_BOOL CXML_Element::GetAttrInteger(FX_BSTR space, FX_BSTR name, int& attribute) const
-{
- const CFX_WideStringL* pwsValue = m_AttrMap.Lookup(space, name);
- if (pwsValue) {
- attribute = pwsValue->GetInteger();
- return TRUE;
- }
- return FALSE;
-}
-FX_BOOL CXML_Element::GetAttrFloat(FX_BSTR name, FX_FLOAT& attribute) const
-{
- CFX_ByteStringC bsSpace, bsName;
- FX_XML_SplitQualifiedName(name, bsSpace, bsName);
- return GetAttrFloat(bsSpace, bsName, attribute);
-}
-FX_BOOL CXML_Element::GetAttrFloat(FX_BSTR space, FX_BSTR name, FX_FLOAT& attribute) const
-{
- CFX_WideString value;
- const CFX_WideStringL* pValue = m_AttrMap.Lookup(space, name);
- if (pValue) {
- attribute = pValue->GetFloat();
- return TRUE;
- }
- return FALSE;
-}
-FX_DWORD CXML_Element::CountChildren() const
-{
- return m_Children.GetSize() / 2;
-}
-CXML_Element::ChildType CXML_Element::GetChildType(FX_DWORD index) const
-{
- index <<= 1;
- if (index >= (FX_DWORD)m_Children.GetSize()) {
- return Invalid;
- }
- return (ChildType)(FX_UINTPTR)m_Children.GetAt(index);
-}
-CFX_WideString CXML_Element::GetContent(FX_DWORD index) const
-{
- index <<= 1;
- if (index >= (FX_DWORD)m_Children.GetSize() ||
- (ChildType)(FX_UINTPTR)m_Children.GetAt(index) != Content) {
- return CFX_WideString();
- }
- CXML_Content* pContent = (CXML_Content*)m_Children.GetAt(index + 1);
- if (pContent) {
- return pContent->m_Content;
- }
- return CFX_WideString();
-}
-const CFX_WideStringL* CXML_Element::GetContentPtr(FX_DWORD index) const
-{
- index <<= 1;
- if (index >= (FX_DWORD)m_Children.GetSize() ||
- (ChildType)(FX_UINTPTR)m_Children.GetAt(index) != Content) {
- return NULL;
- }
- CXML_Content* pContent = (CXML_Content*)m_Children.GetAt(index + 1);
- if (pContent) {
- return &pContent->m_Content;
- }
- return NULL;
-}
-CXML_Element* CXML_Element::GetElement(FX_DWORD index) const
-{
- index <<= 1;
- if (index >= (FX_DWORD)m_Children.GetSize() ||
- (ChildType)(FX_UINTPTR)m_Children.GetAt(index) != Element) {
- return NULL;
- }
- return (CXML_Element*)m_Children.GetAt(index + 1);
-}
-FX_DWORD CXML_Element::CountElements(FX_BSTR space, FX_BSTR tag) const
-{
- int count = 0;
- for (int i = 0; i < m_Children.GetSize(); i += 2) {
- ChildType type = (ChildType)(FX_UINTPTR)m_Children.GetAt(i);
- if (type != Element) {
- continue;
- }
- CXML_Element* pKid = (CXML_Element*)m_Children.GetAt(i + 1);
- if ((space.IsEmpty() || pKid->m_QSpaceName == space) && pKid->m_TagName == tag) {
- count ++;
- }
- }
- return count;
-}
-CXML_Element* CXML_Element::GetElement(FX_BSTR space, FX_BSTR tag, int index) const
-{
- if (index < 0) {
- return NULL;
- }
- for (int i = 0; i < m_Children.GetSize(); i += 2) {
- ChildType type = (ChildType)(FX_UINTPTR)m_Children.GetAt(i);
- if (type != Element) {
- continue;
- }
- CXML_Element* pKid = (CXML_Element*)m_Children.GetAt(i + 1);
- if ((!space.IsEmpty() && pKid->m_QSpaceName != space) || pKid->m_TagName != tag) {
- continue;
- }
- if (index -- == 0) {
- return pKid;
- }
- }
- return NULL;
-}
-FX_DWORD CXML_Element::FindElement(CXML_Element *pChild) const
-{
- for (int i = 0; i < m_Children.GetSize(); i += 2) {
- if ((ChildType)(FX_UINTPTR)m_Children.GetAt(i) == Element &&
- (CXML_Element*)m_Children.GetAt(i + 1) == pChild) {
- return (FX_DWORD)(i >> 1);
- }
- }
- return (FX_DWORD) - 1;
-}
-const CFX_WideStringL* CXML_AttrMap::Lookup(FX_BSTR space, FX_BSTR name) const
-{
- if (m_pMap == NULL) {
- return NULL;
- }
- for (int i = 0; i < m_pMap->GetSize(); i ++) {
- CXML_AttrItem& item = GetAt(i);
- if ((space.IsEmpty() || item.m_QSpaceName == space) && item.m_AttrName == name) {
- return &item.m_Value;
- }
- }
- return NULL;
-}
-void CXML_AttrMap::SetAt(FX_BSTR space, FX_BSTR name, FX_WSTR value, IFX_Allocator* pAllocator)
-{
- for (int i = 0; i < GetSize(); i ++) {
- CXML_AttrItem& item = GetAt(i);
- if ((space.IsEmpty() || item.m_QSpaceName == space) && item.m_AttrName == name) {
- item.m_Value.Set(value, pAllocator);
- return;
- }
- }
- if (!m_pMap) {
- if (pAllocator) {
- m_pMap = FX_NewAtAllocator(pAllocator)CFX_ObjectArray<CXML_AttrItem>(pAllocator);
- } else {
- m_pMap = FX_NEW CFX_ObjectArray<CXML_AttrItem>;
- }
- }
- if (!m_pMap) {
- return;
- }
- CXML_AttrItem* pItem = (CXML_AttrItem*)m_pMap->AddSpace();
- if (!pItem) {
- return;
- }
- pItem->m_QSpaceName.Set(space, pAllocator);
- pItem->m_AttrName.Set(name, pAllocator);
- pItem->m_Value.Set(value, pAllocator);
-}
-void CXML_AttrMap::RemoveAt(FX_BSTR space, FX_BSTR name, IFX_Allocator* pAllocator)
-{
- if (m_pMap == NULL) {
- return;
- }
- for (int i = 0; i < m_pMap->GetSize(); i ++) {
- CXML_AttrItem& item = GetAt(i);
- if ((space.IsEmpty() || item.m_QSpaceName == space) && item.m_AttrName == name) {
- item.Empty(pAllocator);
- m_pMap->RemoveAt(i);
- return;
- }
- }
-}
-int CXML_AttrMap::GetSize() const
-{
- return m_pMap == NULL ? 0 : m_pMap->GetSize();
-}
-CXML_AttrItem& CXML_AttrMap::GetAt(int index) const
-{
- ASSERT(m_pMap != NULL);
- return (*m_pMap)[index];
-}
-void CXML_AttrMap::RemoveAll(IFX_Allocator* pAllocator)
-{
- if (!m_pMap) {
- return;
- }
- for (int i = 0; i < m_pMap->GetSize(); i ++) {
- CXML_AttrItem& item = (*m_pMap)[i];
- item.Empty(pAllocator);
- }
- m_pMap->RemoveAll();
- if (pAllocator) {
- FX_DeleteAtAllocator(m_pMap, pAllocator, CFX_ObjectArray<CXML_AttrItem>);
- } else {
- delete m_pMap;
- }
- m_pMap = NULL;
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fxcrt/fx_xml.h"
+#include "xml_int.h"
+CXML_Parser::~CXML_Parser()
+{
+ if (m_bOwnedStream) {
+ m_pDataAcc->Release();
+ }
+}
+FX_BOOL CXML_Parser::Init(FX_LPBYTE pBuffer, size_t size)
+{
+ if (m_pAllocator) {
+ m_pDataAcc = FX_NewAtAllocator(m_pAllocator)CXML_DataBufAcc(pBuffer, size, m_pAllocator);
+ } else {
+ m_pDataAcc = FX_NEW CXML_DataBufAcc(pBuffer, size, NULL);
+ }
+ if (!m_pDataAcc) {
+ return FALSE;
+ }
+ return Init(TRUE);
+}
+FX_BOOL CXML_Parser::Init(IFX_FileRead *pFileRead)
+{
+ if (m_pAllocator) {
+ m_pDataAcc = FX_NewAtAllocator(m_pAllocator)CXML_DataStmAcc(pFileRead, m_pAllocator);
+ } else {
+ m_pDataAcc = FX_NEW CXML_DataStmAcc(pFileRead, NULL);
+ }
+ if (!m_pDataAcc) {
+ return FALSE;
+ }
+ return Init(TRUE);
+}
+FX_BOOL CXML_Parser::Init(IFX_BufferRead *pBuffer)
+{
+ if (!pBuffer) {
+ return FALSE;
+ }
+ m_pDataAcc = pBuffer;
+ return Init(FALSE);
+}
+FX_BOOL CXML_Parser::Init(FX_BOOL bOwndedStream)
+{
+ m_bOwnedStream = bOwndedStream;
+ m_nOffset = 0;
+ return ReadNextBlock();
+}
+FX_BOOL CXML_Parser::ReadNextBlock()
+{
+ if (!m_pDataAcc->ReadNextBlock()) {
+ return FALSE;
+ }
+ m_pBuffer = m_pDataAcc->GetBlockBuffer();
+ m_dwBufferSize = m_pDataAcc->GetBlockSize();
+ m_nBufferOffset = m_pDataAcc->GetBlockOffset();
+ m_dwIndex = 0;
+ return m_dwBufferSize > 0;
+}
+FX_BOOL CXML_Parser::IsEOF()
+{
+ if (!m_pDataAcc->IsEOF()) {
+ return FALSE;
+ }
+ return m_dwIndex >= m_dwBufferSize;
+}
+#define FXCRTM_XML_CHARTYPE_Normal 0x00
+#define FXCRTM_XML_CHARTYPE_SpaceChar 0x01
+#define FXCRTM_XML_CHARTYPE_Letter 0x02
+#define FXCRTM_XML_CHARTYPE_Digital 0x04
+#define FXCRTM_XML_CHARTYPE_NameIntro 0x08
+#define FXCRTM_XML_CHARTYPE_NameChar 0x10
+#define FXCRTM_XML_CHARTYPE_HexDigital 0x20
+#define FXCRTM_XML_CHARTYPE_HexLowerLetter 0x40
+#define FXCRTM_XML_CHARTYPE_HexUpperLetter 0x60
+#define FXCRTM_XML_CHARTYPE_HexChar 0x60
+FX_BYTE g_FXCRT_XML_ByteTypes[256] = {
+ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00,
+ 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x7A, 0x7A, 0x7A, 0x7A, 0x7A, 0x7A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A,
+ 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x18,
+ 0x00, 0x5A, 0x5A, 0x5A, 0x5A, 0x5A, 0x5A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A,
+ 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A,
+ 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A,
+ 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A,
+ 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A,
+ 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A,
+ 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A,
+ 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A,
+ 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x01, 0x01,
+};
+FX_BOOL g_FXCRT_XML_IsWhiteSpace(FX_BYTE ch)
+{
+ return (g_FXCRT_XML_ByteTypes[ch] & FXCRTM_XML_CHARTYPE_SpaceChar) != 0;
+}
+FX_BOOL g_FXCRT_XML_IsLetter(FX_BYTE ch)
+{
+ return (g_FXCRT_XML_ByteTypes[ch] & FXCRTM_XML_CHARTYPE_Letter) != 0;
+}
+FX_BOOL g_FXCRT_XML_IsDigital(FX_BYTE ch)
+{
+ return (g_FXCRT_XML_ByteTypes[ch] & FXCRTM_XML_CHARTYPE_Digital) != 0;
+}
+FX_BOOL g_FXCRT_XML_IsNameIntro(FX_BYTE ch)
+{
+ return (g_FXCRT_XML_ByteTypes[ch] & FXCRTM_XML_CHARTYPE_NameIntro) != 0;
+}
+FX_BOOL g_FXCRT_XML_IsNameChar(FX_BYTE ch)
+{
+ return (g_FXCRT_XML_ByteTypes[ch] & FXCRTM_XML_CHARTYPE_NameChar) != 0;
+}
+FX_BOOL g_FXCRT_XML_IsHexChar(FX_BYTE ch)
+{
+ return (g_FXCRT_XML_ByteTypes[ch] & FXCRTM_XML_CHARTYPE_HexChar) != 0;
+}
+void CXML_Parser::SkipWhiteSpaces()
+{
+ m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;
+ if (IsEOF()) {
+ return;
+ }
+ do {
+ while (m_dwIndex < m_dwBufferSize && g_FXCRT_XML_IsWhiteSpace(m_pBuffer[m_dwIndex])) {
+ m_dwIndex ++;
+ }
+ m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;
+ if (m_dwIndex < m_dwBufferSize || IsEOF()) {
+ break;
+ }
+ } while (ReadNextBlock());
+}
+void CXML_Parser::GetName(CFX_ByteStringL &space, CFX_ByteStringL &name)
+{
+ m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;
+ if (IsEOF()) {
+ return;
+ }
+ CFX_ByteTextBuf buf(m_pAllocator);
+ FX_BYTE ch;
+ do {
+ while (m_dwIndex < m_dwBufferSize) {
+ ch = m_pBuffer[m_dwIndex];
+ if (ch == ':') {
+ buf.GetByteStringL(space);
+ buf.Clear();
+ } else if (g_FXCRT_XML_IsNameChar(ch)) {
+ buf.AppendChar(ch);
+ } else {
+ break;
+ }
+ m_dwIndex ++;
+ }
+ m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;
+ if (m_dwIndex < m_dwBufferSize || IsEOF()) {
+ break;
+ }
+ } while (ReadNextBlock());
+ buf.GetByteStringL(name);
+}
+void CXML_Parser::SkipLiterals(FX_BSTR str)
+{
+ m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;
+ if (IsEOF()) {
+ return;
+ }
+ FX_INT32 i = 0, iLen = str.GetLength();
+ do {
+ while (m_dwIndex < m_dwBufferSize) {
+ if (str.GetAt(i) != m_pBuffer[m_dwIndex ++]) {
+ i = 0;
+ } else {
+ i ++;
+ if (i == iLen) {
+ break;
+ }
+ }
+ }
+ m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;
+ if (i == iLen) {
+ return;
+ }
+ if (m_dwIndex < m_dwBufferSize || IsEOF()) {
+ break;
+ }
+ } while (ReadNextBlock());
+ while (!m_pDataAcc->IsEOF()) {
+ ReadNextBlock();
+ m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwBufferSize;
+ }
+ m_dwIndex = m_dwBufferSize;
+}
+FX_DWORD CXML_Parser::GetCharRef()
+{
+ m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;
+ if (IsEOF()) {
+ return 0;
+ }
+ FX_BYTE ch;
+ FX_INT32 iState = 0;
+ CFX_ByteTextBuf buf(m_pAllocator);
+ FX_DWORD code = 0;
+ do {
+ while (m_dwIndex < m_dwBufferSize) {
+ ch = m_pBuffer[m_dwIndex];
+ switch (iState) {
+ case 0:
+ if (ch == '#') {
+ m_dwIndex ++;
+ iState = 2;
+ break;
+ }
+ iState = 1;
+ case 1:
+ m_dwIndex ++;
+ if (ch == ';') {
+ CFX_ByteStringC ref = buf.GetByteString();
+ if (ref == FX_BSTRC("gt")) {
+ code = '>';
+ } else if (ref == FX_BSTRC("lt")) {
+ code = '<';
+ } else if (ref == FX_BSTRC("amp")) {
+ code = '&';
+ } else if (ref == FX_BSTRC("apos")) {
+ code = '\'';
+ } else if (ref == FX_BSTRC("quot")) {
+ code = '"';
+ }
+ iState = 10;
+ break;
+ }
+ buf.AppendByte(ch);
+ break;
+ case 2:
+ if (ch == 'x') {
+ m_dwIndex ++;
+ iState = 4;
+ break;
+ }
+ iState = 3;
+ case 3:
+ m_dwIndex ++;
+ if (ch == ';') {
+ iState = 10;
+ break;
+ }
+ if (g_FXCRT_XML_IsDigital(ch)) {
+ code = code * 10 + ch - '0';
+ }
+ break;
+ case 4:
+ m_dwIndex ++;
+ if (ch == ';') {
+ iState = 10;
+ break;
+ }
+ FX_BYTE nHex = g_FXCRT_XML_ByteTypes[ch] & FXCRTM_XML_CHARTYPE_HexChar;
+ if (nHex) {
+ if (nHex == FXCRTM_XML_CHARTYPE_HexDigital) {
+ code = (code << 4) + ch - '0';
+ } else if (nHex == FXCRTM_XML_CHARTYPE_HexLowerLetter) {
+ code = (code << 4) + ch - 87;
+ } else {
+ code = (code << 4) + ch - 55;
+ }
+ }
+ break;
+ }
+ if (iState == 10) {
+ break;
+ }
+ }
+ m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;
+ if (iState == 10 || m_dwIndex < m_dwBufferSize || IsEOF()) {
+ break;
+ }
+ } while (ReadNextBlock());
+ return code;
+}
+void CXML_Parser::GetAttrValue(CFX_WideStringL &value)
+{
+ m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;
+ if (IsEOF()) {
+ return;
+ }
+ CFX_UTF8Decoder decoder(m_pAllocator);
+ FX_BYTE mark = 0, ch;
+ do {
+ while (m_dwIndex < m_dwBufferSize) {
+ ch = m_pBuffer[m_dwIndex];
+ if (mark == 0) {
+ if (ch != '\'' && ch != '"') {
+ return;
+ }
+ mark = ch;
+ m_dwIndex ++;
+ ch = 0;
+ continue;
+ }
+ m_dwIndex ++;
+ if (ch == mark) {
+ break;
+ }
+ if (ch == '&') {
+ decoder.AppendChar(GetCharRef());
+ if (IsEOF()) {
+ decoder.GetResult(value);
+ return;
+ }
+ } else {
+ decoder.Input(ch);
+ }
+ }
+ m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;
+ if (ch == mark || m_dwIndex < m_dwBufferSize || IsEOF()) {
+ break;
+ }
+ } while (ReadNextBlock());
+ decoder.GetResult(value);
+}
+void CXML_Parser::GetTagName(CFX_ByteStringL &space, CFX_ByteStringL &name, FX_BOOL &bEndTag, FX_BOOL bStartTag)
+{
+ m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;
+ if (IsEOF()) {
+ return;
+ }
+ bEndTag = FALSE;
+ FX_BYTE ch;
+ FX_INT32 iState = bStartTag ? 1 : 0;
+ do {
+ while (m_dwIndex < m_dwBufferSize) {
+ ch = m_pBuffer[m_dwIndex];
+ switch (iState) {
+ case 0:
+ m_dwIndex ++;
+ if (ch != '<') {
+ break;
+ }
+ iState = 1;
+ break;
+ case 1:
+ if (ch == '?') {
+ m_dwIndex ++;
+ SkipLiterals(FX_BSTRC("?>"));
+ iState = 0;
+ break;
+ } else if (ch == '!') {
+ m_dwIndex ++;
+ SkipLiterals(FX_BSTRC("-->"));
+ iState = 0;
+ break;
+ }
+ if (ch == '/') {
+ m_dwIndex ++;
+ GetName(space, name);
+ bEndTag = TRUE;
+ } else {
+ GetName(space, name);
+ bEndTag = FALSE;
+ }
+ return;
+ }
+ }
+ m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;
+ if (m_dwIndex < m_dwBufferSize || IsEOF()) {
+ break;
+ }
+ } while (ReadNextBlock());
+}
+CXML_Element* CXML_Parser::ParseElement(CXML_Element* pParent, FX_BOOL bStartTag)
+{
+ m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;
+ if (IsEOF()) {
+ return NULL;
+ }
+ CFX_ByteStringL tag_name, tag_space;
+ FX_BOOL bEndTag;
+ GetTagName(tag_space, tag_name, bEndTag, bStartTag);
+ if (tag_name.IsEmpty() || bEndTag) {
+ tag_space.Empty(m_pAllocator);
+ return NULL;
+ }
+ CXML_Element* pElement;
+ if (m_pAllocator) {
+ pElement = FX_NewAtAllocator(m_pAllocator)CXML_Element(m_pAllocator);
+ } else {
+ pElement = FX_NEW CXML_Element;
+ }
+ if (pElement) {
+ pElement->m_pParent = pParent;
+ pElement->SetTag(tag_space, tag_name);
+ }
+ tag_space.Empty(m_pAllocator);
+ tag_name.Empty(m_pAllocator);
+ if (!pElement) {
+ return NULL;
+ }
+ do {
+ CFX_ByteStringL attr_space, attr_name;
+ while (m_dwIndex < m_dwBufferSize) {
+ SkipWhiteSpaces();
+ if (IsEOF()) {
+ break;
+ }
+ if (!g_FXCRT_XML_IsNameIntro(m_pBuffer[m_dwIndex])) {
+ break;
+ }
+ attr_space.Empty(m_pAllocator);
+ attr_name.Empty(m_pAllocator);
+ GetName(attr_space, attr_name);
+ SkipWhiteSpaces();
+ if (IsEOF()) {
+ break;
+ }
+ if (m_pBuffer[m_dwIndex] != '=') {
+ break;
+ }
+ m_dwIndex ++;
+ SkipWhiteSpaces();
+ if (IsEOF()) {
+ break;
+ }
+ CFX_WideStringL attr_value;
+ GetAttrValue(attr_value);
+ pElement->m_AttrMap.SetAt(attr_space, attr_name, attr_value, m_pAllocator);
+ attr_value.Empty(m_pAllocator);
+ }
+ attr_space.Empty(m_pAllocator);
+ attr_name.Empty(m_pAllocator);
+ m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;
+ if (m_dwIndex < m_dwBufferSize || IsEOF()) {
+ break;
+ }
+ } while (ReadNextBlock());
+ SkipWhiteSpaces();
+ if (IsEOF()) {
+ return pElement;
+ }
+ FX_BYTE ch = m_pBuffer[m_dwIndex ++];
+ if (ch == '/') {
+ m_dwIndex ++;
+ m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;
+ return pElement;
+ }
+ if (ch != '>') {
+ m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;
+ if (m_pAllocator) {
+ FX_DeleteAtAllocator(pElement, m_pAllocator, CXML_Element);
+ } else {
+ delete pElement;
+ }
+ return NULL;
+ }
+ SkipWhiteSpaces();
+ if (IsEOF()) {
+ return pElement;
+ }
+ CFX_UTF8Decoder decoder(m_pAllocator);
+ CFX_WideTextBuf content(m_pAllocator);
+ FX_BOOL bCDATA = FALSE;
+ FX_INT32 iState = 0;
+ do {
+ while (m_dwIndex < m_dwBufferSize) {
+ ch = m_pBuffer[m_dwIndex ++];
+ switch (iState) {
+ case 0:
+ if (ch == '<') {
+ iState = 1;
+ } else if (ch == '&') {
+ decoder.ClearStatus();
+ decoder.AppendChar(GetCharRef());
+ } else {
+ decoder.Input(ch);
+ }
+ break;
+ case 1:
+ if (ch == '!') {
+ iState = 2;
+ } else if (ch == '?') {
+ SkipLiterals(FX_BSTRC("?>"));
+ SkipWhiteSpaces();
+ iState = 0;
+ } else if (ch == '/') {
+ CFX_ByteStringL space, name;
+ GetName(space, name);
+ space.Empty(m_pAllocator);
+ name.Empty(m_pAllocator);
+ SkipWhiteSpaces();
+ m_dwIndex ++;
+ iState = 10;
+ } else {
+ content << decoder.GetResult();
+ CFX_WideStringL dataStr;
+ content.GetWideStringL(dataStr);
+ if (!bCDATA && !m_bSaveSpaceChars) {
+ dataStr.TrimRight((FX_LPCWSTR)L" \t\r\n");
+ }
+ InsertContentSegment(bCDATA, dataStr, pElement);
+ dataStr.Empty(m_pAllocator);
+ content.Clear();
+ decoder.Clear();
+ bCDATA = FALSE;
+ iState = 0;
+ m_dwIndex --;
+ CXML_Element* pSubElement = ParseElement(pElement, TRUE);
+ if (pSubElement == NULL) {
+ break;
+ }
+ pSubElement->m_pParent = pElement;
+ pElement->m_Children.Add((FX_LPVOID)CXML_Element::Element);
+ pElement->m_Children.Add(pSubElement);
+ SkipWhiteSpaces();
+ }
+ break;
+ case 2:
+ if (ch == '[') {
+ SkipLiterals(FX_BSTRC("]]>"));
+ } else if (ch == '-') {
+ m_dwIndex ++;
+ SkipLiterals(FX_BSTRC("-->"));
+ } else {
+ SkipLiterals(FX_BSTRC(">"));
+ }
+ decoder.Clear();
+ SkipWhiteSpaces();
+ iState = 0;
+ break;
+ }
+ if (iState == 10) {
+ break;
+ }
+ }
+ m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;
+ if (iState == 10 || m_dwIndex < m_dwBufferSize || IsEOF()) {
+ break;
+ }
+ } while (ReadNextBlock());
+ content << decoder.GetResult();
+ CFX_WideStringL dataStr;
+ content.GetWideStringL(dataStr);
+ if (!m_bSaveSpaceChars) {
+ dataStr.TrimRight((FX_LPCWSTR)L" \t\r\n");
+ }
+ InsertContentSegment(bCDATA, dataStr, pElement);
+ dataStr.Empty(m_pAllocator);
+ content.Clear();
+ decoder.Clear();
+ bCDATA = FALSE;
+ return pElement;
+}
+void CXML_Parser::InsertContentSegment(FX_BOOL bCDATA, FX_WSTR content, CXML_Element* pElement)
+{
+ if (content.IsEmpty()) {
+ return;
+ }
+ CXML_Content* pContent;
+ if (m_pAllocator) {
+ pContent = FX_NewAtAllocator(m_pAllocator)CXML_Content;
+ } else {
+ pContent = FX_NEW CXML_Content;
+ }
+ if (!pContent) {
+ return;
+ }
+ pContent->Set(bCDATA, content, m_pAllocator);
+ pElement->m_Children.Add((FX_LPVOID)CXML_Element::Content);
+ pElement->m_Children.Add(pContent);
+}
+static CXML_Element* XML_ContinueParse(CXML_Parser &parser, FX_BOOL bSaveSpaceChars, FX_FILESIZE* pParsedSize)
+{
+ parser.m_bSaveSpaceChars = bSaveSpaceChars;
+ CXML_Element* pElement = parser.ParseElement(NULL, FALSE);
+ if (pParsedSize) {
+ *pParsedSize = parser.m_nOffset;
+ }
+ return pElement;
+}
+CXML_Element* CXML_Element::Parse(const void* pBuffer, size_t size, FX_BOOL bSaveSpaceChars, FX_FILESIZE* pParsedSize, IFX_Allocator* pAllocator)
+{
+ CXML_Parser parser(pAllocator);
+ if (!parser.Init((FX_LPBYTE)pBuffer, size)) {
+ return NULL;
+ }
+ return XML_ContinueParse(parser, bSaveSpaceChars, pParsedSize);
+}
+CXML_Element* CXML_Element::Parse(IFX_FileRead *pFile, FX_BOOL bSaveSpaceChars, FX_FILESIZE* pParsedSize, IFX_Allocator* pAllocator)
+{
+ CXML_Parser parser(pAllocator);
+ if (!parser.Init(pFile)) {
+ return NULL;
+ }
+ return XML_ContinueParse(parser, bSaveSpaceChars, pParsedSize);
+}
+CXML_Element* CXML_Element::Parse(IFX_BufferRead *pBuffer, FX_BOOL bSaveSpaceChars, FX_FILESIZE* pParsedSize, IFX_Allocator* pAllocator)
+{
+ CXML_Parser parser(pAllocator);
+ if (!parser.Init(pBuffer)) {
+ return NULL;
+ }
+ return XML_ContinueParse(parser, bSaveSpaceChars, pParsedSize);
+}
+CXML_Element::CXML_Element(IFX_Allocator* pAllocator)
+ : m_pParent(NULL)
+ , m_QSpaceName()
+ , m_TagName()
+ , m_AttrMap()
+ , m_Children(pAllocator)
+{
+}
+CXML_Element::CXML_Element(FX_BSTR qSpace, FX_BSTR tagName, IFX_Allocator* pAllocator)
+ : m_pParent(NULL)
+ , m_QSpaceName()
+ , m_TagName()
+ , m_AttrMap()
+ , m_Children(pAllocator)
+{
+ m_QSpaceName.Set(qSpace, pAllocator);
+ m_TagName.Set(tagName, pAllocator);
+}
+CXML_Element::CXML_Element(FX_BSTR qTagName, IFX_Allocator* pAllocator)
+ : m_pParent(NULL)
+ , m_QSpaceName()
+ , m_TagName()
+ , m_AttrMap()
+ , m_Children(pAllocator)
+{
+ SetTag(qTagName);
+}
+CXML_Element::~CXML_Element()
+{
+ Empty();
+}
+void CXML_Element::Empty()
+{
+ IFX_Allocator* pAllocator = m_Children.m_pAllocator;
+ m_QSpaceName.Empty(pAllocator);
+ m_TagName.Empty(pAllocator);
+ m_AttrMap.RemoveAll(pAllocator);
+ RemoveChildren();
+}
+void CXML_Element::RemoveChildren()
+{
+ IFX_Allocator* pAllocator = m_Children.m_pAllocator;
+ for (int i = 0; i < m_Children.GetSize(); i += 2) {
+ ChildType type = (ChildType)(FX_UINTPTR)m_Children.GetAt(i);
+ if (type == Content) {
+ CXML_Content* content = (CXML_Content*)m_Children.GetAt(i + 1);
+ if (pAllocator) {
+ FX_DeleteAtAllocator(content, pAllocator, CXML_Content);
+ } else {
+ delete content;
+ }
+ } else if (type == Element) {
+ CXML_Element* child = (CXML_Element*)m_Children.GetAt(i + 1);
+ child->RemoveChildren();
+ if (pAllocator) {
+ FX_DeleteAtAllocator(child, pAllocator, CXML_Element);
+ } else {
+ delete child;
+ }
+ }
+ }
+ m_Children.RemoveAll();
+}
+CFX_ByteString CXML_Element::GetTagName(FX_BOOL bQualified) const
+{
+ if (!bQualified || m_QSpaceName.IsEmpty()) {
+ return m_TagName;
+ }
+ CFX_ByteString bsTag = m_QSpaceName;
+ bsTag += ":";
+ bsTag += m_TagName;
+ return bsTag;
+}
+void CXML_Element::GetTagName(CFX_ByteStringL &tagName, FX_BOOL bQualified) const
+{
+ IFX_Allocator* pAllocator = m_Children.m_pAllocator;
+ if (!bQualified || m_QSpaceName.IsEmpty()) {
+ tagName.Set(m_TagName, pAllocator);
+ return;
+ }
+ FX_LPSTR str = tagName.AllocBuffer(m_QSpaceName.GetLength() + m_TagName.GetLength() + 2, pAllocator);
+ if (!str) {
+ return;
+ }
+ FXSYS_memcpy32(str, m_QSpaceName.GetCStr(), m_QSpaceName.GetLength());
+ str += m_QSpaceName.GetLength();
+ *str = ':';
+ str ++;
+ FXSYS_memcpy32(str, m_TagName.GetCStr(), m_TagName.GetLength());
+ str += m_TagName.GetLength();
+ *str = '\0';
+}
+CFX_ByteString CXML_Element::GetNamespace(FX_BOOL bQualified) const
+{
+ if (bQualified) {
+ return m_QSpaceName;
+ }
+ return GetNamespaceURI(m_QSpaceName);
+}
+void CXML_Element::GetNamespace(CFX_ByteStringL &nameSpace, FX_BOOL bQualified) const
+{
+ IFX_Allocator* pAllocator = m_Children.m_pAllocator;
+ if (bQualified) {
+ nameSpace.Set(m_QSpaceName, pAllocator);
+ return;
+ }
+ GetNamespaceURI(m_QSpaceName, nameSpace);
+}
+CFX_ByteString CXML_Element::GetNamespaceURI(FX_BSTR qName) const
+{
+ const CFX_WideStringL* pwsSpace;
+ const CXML_Element *pElement = this;
+ do {
+ if (qName.IsEmpty()) {
+ pwsSpace = pElement->m_AttrMap.Lookup(FX_BSTRC(""), FX_BSTRC("xmlns"));
+ } else {
+ pwsSpace = pElement->m_AttrMap.Lookup(FX_BSTRC("xmlns"), qName);
+ }
+ if (pwsSpace) {
+ break;
+ }
+ pElement = pElement->GetParent();
+ } while(pElement);
+ return pwsSpace ? FX_UTF8Encode(*pwsSpace) : CFX_ByteString();
+}
+void CXML_Element::GetNamespaceURI(FX_BSTR qName, CFX_ByteStringL &uri) const
+{
+ IFX_Allocator* pAllocator = m_Children.m_pAllocator;
+ const CFX_WideStringL* pwsSpace;
+ const CXML_Element *pElement = this;
+ do {
+ if (qName.IsEmpty()) {
+ pwsSpace = pElement->m_AttrMap.Lookup(FX_BSTRC(""), FX_BSTRC("xmlns"));
+ } else {
+ pwsSpace = pElement->m_AttrMap.Lookup(FX_BSTRC("xmlns"), qName);
+ }
+ if (pwsSpace) {
+ break;
+ }
+ pElement = pElement->GetParent();
+ } while(pElement);
+ if (pwsSpace) {
+ FX_UTF8Encode(pwsSpace->GetPtr(), pwsSpace->GetLength(), uri, pAllocator);
+ }
+}
+void CXML_Element::GetAttrByIndex(int index, CFX_ByteString& space, CFX_ByteString& name, CFX_WideString& value) const
+{
+ if (index < 0 || index >= m_AttrMap.GetSize()) {
+ return;
+ }
+ CXML_AttrItem& item = m_AttrMap.GetAt(index);
+ space = item.m_QSpaceName;
+ name = item.m_AttrName;
+ value = item.m_Value;
+}
+void CXML_Element::GetAttrByIndex(int index, CFX_ByteStringL &space, CFX_ByteStringL &name, CFX_WideStringL &value) const
+{
+ if (index < 0 || index >= m_AttrMap.GetSize()) {
+ return;
+ }
+ IFX_Allocator* pAllocator = m_Children.m_pAllocator;
+ CXML_AttrItem& item = m_AttrMap.GetAt(index);
+ space.Set(item.m_QSpaceName, pAllocator);
+ name.Set(item.m_AttrName, pAllocator);
+ value.Set(item.m_Value, pAllocator);
+}
+FX_BOOL CXML_Element::HasAttr(FX_BSTR name) const
+{
+ CFX_ByteStringC bsSpace, bsName;
+ FX_XML_SplitQualifiedName(name, bsSpace, bsName);
+ return m_AttrMap.Lookup(bsSpace, bsName) != NULL;
+}
+FX_BOOL CXML_Element::GetAttrValue(FX_BSTR name, CFX_WideString& attribute) const
+{
+ CFX_ByteStringC bsSpace, bsName;
+ FX_XML_SplitQualifiedName(name, bsSpace, bsName);
+ const CFX_WideStringL* pValue = m_AttrMap.Lookup(bsSpace, bsName);
+ if (pValue) {
+ attribute = CFX_WideString(pValue->GetPtr(), pValue->GetLength());
+ return TRUE;
+ }
+ return FALSE;
+}
+const CFX_WideStringL* CXML_Element::GetAttrValuePtr(FX_BSTR name) const
+{
+ CFX_ByteStringC bsSpace, bsName;
+ FX_XML_SplitQualifiedName(name, bsSpace, bsName);
+ return m_AttrMap.Lookup(bsSpace, bsName);
+}
+FX_BOOL CXML_Element::GetAttrValue(FX_BSTR space, FX_BSTR name, CFX_WideString& attribute) const
+{
+ const CFX_WideStringL* pValue = m_AttrMap.Lookup(space, name);
+ if (pValue) {
+ attribute = CFX_WideString(pValue->GetPtr(), pValue->GetLength());
+ return TRUE;
+ }
+ return FALSE;
+}
+const CFX_WideStringL* CXML_Element::GetAttrValuePtr(FX_BSTR space, FX_BSTR name) const
+{
+ return m_AttrMap.Lookup(space, name);
+}
+FX_BOOL CXML_Element::GetAttrInteger(FX_BSTR name, int& attribute) const
+{
+ CFX_ByteStringC bsSpace, bsName;
+ FX_XML_SplitQualifiedName(name, bsSpace, bsName);
+ const CFX_WideStringL* pwsValue = m_AttrMap.Lookup(bsSpace, bsName);
+ if (pwsValue) {
+ attribute = pwsValue->GetInteger();
+ return TRUE;
+ }
+ return FALSE;
+}
+FX_BOOL CXML_Element::GetAttrInteger(FX_BSTR space, FX_BSTR name, int& attribute) const
+{
+ const CFX_WideStringL* pwsValue = m_AttrMap.Lookup(space, name);
+ if (pwsValue) {
+ attribute = pwsValue->GetInteger();
+ return TRUE;
+ }
+ return FALSE;
+}
+FX_BOOL CXML_Element::GetAttrFloat(FX_BSTR name, FX_FLOAT& attribute) const
+{
+ CFX_ByteStringC bsSpace, bsName;
+ FX_XML_SplitQualifiedName(name, bsSpace, bsName);
+ return GetAttrFloat(bsSpace, bsName, attribute);
+}
+FX_BOOL CXML_Element::GetAttrFloat(FX_BSTR space, FX_BSTR name, FX_FLOAT& attribute) const
+{
+ CFX_WideString value;
+ const CFX_WideStringL* pValue = m_AttrMap.Lookup(space, name);
+ if (pValue) {
+ attribute = pValue->GetFloat();
+ return TRUE;
+ }
+ return FALSE;
+}
+FX_DWORD CXML_Element::CountChildren() const
+{
+ return m_Children.GetSize() / 2;
+}
+CXML_Element::ChildType CXML_Element::GetChildType(FX_DWORD index) const
+{
+ index <<= 1;
+ if (index >= (FX_DWORD)m_Children.GetSize()) {
+ return Invalid;
+ }
+ return (ChildType)(FX_UINTPTR)m_Children.GetAt(index);
+}
+CFX_WideString CXML_Element::GetContent(FX_DWORD index) const
+{
+ index <<= 1;
+ if (index >= (FX_DWORD)m_Children.GetSize() ||
+ (ChildType)(FX_UINTPTR)m_Children.GetAt(index) != Content) {
+ return CFX_WideString();
+ }
+ CXML_Content* pContent = (CXML_Content*)m_Children.GetAt(index + 1);
+ if (pContent) {
+ return pContent->m_Content;
+ }
+ return CFX_WideString();
+}
+const CFX_WideStringL* CXML_Element::GetContentPtr(FX_DWORD index) const
+{
+ index <<= 1;
+ if (index >= (FX_DWORD)m_Children.GetSize() ||
+ (ChildType)(FX_UINTPTR)m_Children.GetAt(index) != Content) {
+ return NULL;
+ }
+ CXML_Content* pContent = (CXML_Content*)m_Children.GetAt(index + 1);
+ if (pContent) {
+ return &pContent->m_Content;
+ }
+ return NULL;
+}
+CXML_Element* CXML_Element::GetElement(FX_DWORD index) const
+{
+ index <<= 1;
+ if (index >= (FX_DWORD)m_Children.GetSize() ||
+ (ChildType)(FX_UINTPTR)m_Children.GetAt(index) != Element) {
+ return NULL;
+ }
+ return (CXML_Element*)m_Children.GetAt(index + 1);
+}
+FX_DWORD CXML_Element::CountElements(FX_BSTR space, FX_BSTR tag) const
+{
+ int count = 0;
+ for (int i = 0; i < m_Children.GetSize(); i += 2) {
+ ChildType type = (ChildType)(FX_UINTPTR)m_Children.GetAt(i);
+ if (type != Element) {
+ continue;
+ }
+ CXML_Element* pKid = (CXML_Element*)m_Children.GetAt(i + 1);
+ if ((space.IsEmpty() || pKid->m_QSpaceName == space) && pKid->m_TagName == tag) {
+ count ++;
+ }
+ }
+ return count;
+}
+CXML_Element* CXML_Element::GetElement(FX_BSTR space, FX_BSTR tag, int index) const
+{
+ if (index < 0) {
+ return NULL;
+ }
+ for (int i = 0; i < m_Children.GetSize(); i += 2) {
+ ChildType type = (ChildType)(FX_UINTPTR)m_Children.GetAt(i);
+ if (type != Element) {
+ continue;
+ }
+ CXML_Element* pKid = (CXML_Element*)m_Children.GetAt(i + 1);
+ if ((!space.IsEmpty() && pKid->m_QSpaceName != space) || pKid->m_TagName != tag) {
+ continue;
+ }
+ if (index -- == 0) {
+ return pKid;
+ }
+ }
+ return NULL;
+}
+FX_DWORD CXML_Element::FindElement(CXML_Element *pChild) const
+{
+ for (int i = 0; i < m_Children.GetSize(); i += 2) {
+ if ((ChildType)(FX_UINTPTR)m_Children.GetAt(i) == Element &&
+ (CXML_Element*)m_Children.GetAt(i + 1) == pChild) {
+ return (FX_DWORD)(i >> 1);
+ }
+ }
+ return (FX_DWORD) - 1;
+}
+const CFX_WideStringL* CXML_AttrMap::Lookup(FX_BSTR space, FX_BSTR name) const
+{
+ if (m_pMap == NULL) {
+ return NULL;
+ }
+ for (int i = 0; i < m_pMap->GetSize(); i ++) {
+ CXML_AttrItem& item = GetAt(i);
+ if ((space.IsEmpty() || item.m_QSpaceName == space) && item.m_AttrName == name) {
+ return &item.m_Value;
+ }
+ }
+ return NULL;
+}
+void CXML_AttrMap::SetAt(FX_BSTR space, FX_BSTR name, FX_WSTR value, IFX_Allocator* pAllocator)
+{
+ for (int i = 0; i < GetSize(); i ++) {
+ CXML_AttrItem& item = GetAt(i);
+ if ((space.IsEmpty() || item.m_QSpaceName == space) && item.m_AttrName == name) {
+ item.m_Value.Set(value, pAllocator);
+ return;
+ }
+ }
+ if (!m_pMap) {
+ if (pAllocator) {
+ m_pMap = FX_NewAtAllocator(pAllocator)CFX_ObjectArray<CXML_AttrItem>(pAllocator);
+ } else {
+ m_pMap = FX_NEW CFX_ObjectArray<CXML_AttrItem>;
+ }
+ }
+ if (!m_pMap) {
+ return;
+ }
+ CXML_AttrItem* pItem = (CXML_AttrItem*)m_pMap->AddSpace();
+ if (!pItem) {
+ return;
+ }
+ pItem->m_QSpaceName.Set(space, pAllocator);
+ pItem->m_AttrName.Set(name, pAllocator);
+ pItem->m_Value.Set(value, pAllocator);
+}
+void CXML_AttrMap::RemoveAt(FX_BSTR space, FX_BSTR name, IFX_Allocator* pAllocator)
+{
+ if (m_pMap == NULL) {
+ return;
+ }
+ for (int i = 0; i < m_pMap->GetSize(); i ++) {
+ CXML_AttrItem& item = GetAt(i);
+ if ((space.IsEmpty() || item.m_QSpaceName == space) && item.m_AttrName == name) {
+ item.Empty(pAllocator);
+ m_pMap->RemoveAt(i);
+ return;
+ }
+ }
+}
+int CXML_AttrMap::GetSize() const
+{
+ return m_pMap == NULL ? 0 : m_pMap->GetSize();
+}
+CXML_AttrItem& CXML_AttrMap::GetAt(int index) const
+{
+ ASSERT(m_pMap != NULL);
+ return (*m_pMap)[index];
+}
+void CXML_AttrMap::RemoveAll(IFX_Allocator* pAllocator)
+{
+ if (!m_pMap) {
+ return;
+ }
+ for (int i = 0; i < m_pMap->GetSize(); i ++) {
+ CXML_AttrItem& item = (*m_pMap)[i];
+ item.Empty(pAllocator);
+ }
+ m_pMap->RemoveAll();
+ if (pAllocator) {
+ FX_DeleteAtAllocator(m_pMap, pAllocator, CFX_ObjectArray<CXML_AttrItem>);
+ } else {
+ delete m_pMap;
+ }
+ m_pMap = NULL;
+}
diff --git a/core/src/fxcrt/fxcrt_platforms.cpp b/core/src/fxcrt/fxcrt_platforms.cpp
index 1479b7bcf0..7fb3adae40 100644
--- a/core/src/fxcrt/fxcrt_platforms.cpp
+++ b/core/src/fxcrt/fxcrt_platforms.cpp
@@ -1,203 +1,203 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../include/fxcrt/fx_ext.h"
-#include "fxcrt_platforms.h"
-#if (_FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ && _FXM_PLATFORM_ != _FXM_PLATFORM_LINUX_ && _FXM_PLATFORM_ != _FXM_PLATFORM_APPLE_ && _FXM_PLATFORM_ != _FXM_PLATFORM_ANDROID_)
-IFXCRT_FileAccess* FXCRT_FileAccess_Create(IFX_Allocator* pAllocator)
-{
- if (pAllocator) {
- return FX_NewAtAllocator(pAllocator) CFXCRT_FileAccess_CRT;
- } else {
- return FX_NEW CFXCRT_FileAccess_CRT;
- }
-}
-void FXCRT_GetFileModeString(FX_DWORD dwModes, CFX_ByteString &bsMode)
-{
- if (dwModes & FX_FILEMODE_ReadOnly) {
- bsMode = FX_BSTRC("rb");
- } else if (dwModes & FX_FILEMODE_Truncate) {
- bsMode = FX_BSTRC("w+b");
- } else {
- bsMode = FX_BSTRC("a+b");
- }
-}
-void FXCRT_GetFileModeString(FX_DWORD dwModes, CFX_WideString &wsMode)
-{
- if (dwModes & FX_FILEMODE_ReadOnly) {
- wsMode = FX_WSTRC(L"rb");
- } else if (dwModes & FX_FILEMODE_Truncate) {
- wsMode = FX_WSTRC(L"w+b");
- } else {
- wsMode = FX_WSTRC(L"a+b");
- }
-}
-CFXCRT_FileAccess_CRT::CFXCRT_FileAccess_CRT()
- : m_hFile(NULL)
-{
-}
-CFXCRT_FileAccess_CRT::~CFXCRT_FileAccess_CRT()
-{
- Close();
-}
-FX_BOOL CFXCRT_FileAccess_CRT::Open(FX_BSTR fileName, FX_DWORD dwMode)
-{
- if (m_hFile) {
- return FALSE;
- }
- CFX_ByteString strMode;
- FXCRT_GetFileModeString(dwMode, strMode);
- m_hFile = FXSYS_fopen(fileName.GetCStr(), (FX_LPCSTR)strMode);
- return m_hFile != NULL;
-}
-FX_BOOL CFXCRT_FileAccess_CRT::Open(FX_WSTR fileName, FX_DWORD dwMode)
-{
- if (m_hFile) {
- return FALSE;
- }
- CFX_WideString strMode;
- FXCRT_GetFileModeString(dwMode, strMode);
- m_hFile = FXSYS_wfopen(fileName.GetPtr(), (FX_LPCWSTR)strMode);
- return m_hFile != NULL;
-}
-void CFXCRT_FileAccess_CRT::Close()
-{
- if (!m_hFile) {
- return;
- }
- FXSYS_fclose(m_hFile);
- m_hFile = NULL;
-}
-void CFXCRT_FileAccess_CRT::Release(IFX_Allocator* pAllocator)
-{
- if (pAllocator) {
- FX_DeleteAtAllocator(this, pAllocator, CFXCRT_FileAccess_CRT);
- } else {
- delete this;
- }
-}
-FX_FILESIZE CFXCRT_FileAccess_CRT::GetSize() const
-{
- if (!m_hFile) {
- return 0;
- }
- FX_FILESIZE pos = (FX_FILESIZE)FXSYS_ftell(m_hFile);
- FXSYS_fseek(m_hFile, 0, FXSYS_SEEK_END);
- FX_FILESIZE size = (FX_FILESIZE)FXSYS_ftell(m_hFile);
- FXSYS_fseek(m_hFile, pos, FXSYS_SEEK_SET);
- return size;
-}
-FX_FILESIZE CFXCRT_FileAccess_CRT::GetPosition() const
-{
- if (!m_hFile) {
- return (FX_FILESIZE) - 1;
- }
- return (FX_FILESIZE)FXSYS_ftell(m_hFile);
-}
-FX_FILESIZE CFXCRT_FileAccess_CRT::SetPosition(FX_FILESIZE pos)
-{
- if (!m_hFile) {
- return (FX_FILESIZE) - 1;
- }
- FXSYS_fseek(m_hFile, pos, FXSYS_SEEK_SET);
- return (FX_FILESIZE)FXSYS_ftell(m_hFile);
-}
-size_t CFXCRT_FileAccess_CRT::Read(void* pBuffer, size_t szBuffer)
-{
- if (!m_hFile) {
- return 0;
- }
- return FXSYS_fread(pBuffer, 1, szBuffer, m_hFile);
-}
-size_t CFXCRT_FileAccess_CRT::Write(const void* pBuffer, size_t szBuffer)
-{
- if (!m_hFile) {
- return 0;
- }
- return FXSYS_fwrite(pBuffer, 1, szBuffer, m_hFile);
-}
-size_t CFXCRT_FileAccess_CRT::ReadPos(void* pBuffer, size_t szBuffer, FX_FILESIZE pos)
-{
- if (!m_hFile) {
- return (FX_FILESIZE) - 1;
- }
- FXSYS_fseek(m_hFile, pos, FXSYS_SEEK_SET);
- return FXSYS_fread(pBuffer, 1, szBuffer, m_hFile);
-}
-size_t CFXCRT_FileAccess_CRT::WritePos(const void* pBuffer, size_t szBuffer, FX_FILESIZE pos)
-{
- if (!m_hFile) {
- return (FX_FILESIZE) - 1;
- }
- FXSYS_fseek(m_hFile, pos, FXSYS_SEEK_SET);
- return FXSYS_fwrite(pBuffer, 1, szBuffer, m_hFile);
-}
-FX_BOOL CFXCRT_FileAccess_CRT::Flush()
-{
- if (!m_hFile) {
- return FALSE;
- }
- return !FXSYS_fflush(m_hFile);
-}
-FX_BOOL CFXCRT_FileAccess_CRT::Truncate(FX_FILESIZE szFile)
-{
- return FALSE;
-}
-FX_BOOL FX_File_Exist(FX_BSTR fileName)
-{
- return access(fileName.GetCStr(), F_OK) > -1;
-}
-FX_BOOL FX_File_Exist(FX_WSTR fileName)
-{
- return FX_File_Exist(FX_UTF8Encode(fileName));
-}
-FX_BOOL FX_File_Delete(FX_BSTR fileName)
-{
- return remove(fileName.GetCStr()) > -1;
-}
-FX_BOOL FX_File_Delete(FX_WSTR fileName)
-{
- return FX_File_Delete(FX_UTF8Encode(fileName));
-}
-FX_BOOL FX_File_Copy(FX_BSTR fileNameSrc, FX_BSTR fileNameDst)
-{
- CFXCRT_FileAccess_CRT src, dst;
- if (!src.Open(fileNameSrc, FX_FILEMODE_ReadOnly)) {
- return FALSE;
- }
- FX_FILESIZE size = src.GetSize();
- if (!size) {
- return FALSE;
- }
- if (!dst.Open(fileNameDst, FX_FILEMODE_Truncate)) {
- return FALSE;
- }
- FX_FILESIZE num = 0;
- FX_LPBYTE pBuffer = FX_Alloc(FX_BYTE, 32768);
- if (!pBuffer) {
- return FALSE;
- }
- while (num = src.Read(pBuffer, 32768)) {
- if (dst.Write(pBuffer, num) != num) {
- break;
- }
- }
- FX_Free(pBuffer);
- return TRUE;
-}
-FX_BOOL FX_File_Copy(FX_WSTR fileNameSrc, FX_WSTR fileNameDst)
-{
- return FX_File_Copy(FX_UTF8Encode(fileNameSrc), FX_UTF8Encode(fileNameDst));
-}
-FX_BOOL FX_File_Move(FX_BSTR fileNameSrc, FX_BSTR fileNameDst)
-{
- return rename(fileNameSrc.GetCStr(), fileNameDst.GetCStr());
-}
-FX_BOOL FX_File_Move(FX_WSTR fileNameSrc, FX_WSTR fileNameDst)
-{
- return FX_File_Move(FX_UTF8Encode(fileNameSrc), FX_UTF8Encode(fileNameDst));
-}
-#endif
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fxcrt/fx_ext.h"
+#include "fxcrt_platforms.h"
+#if (_FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ && _FXM_PLATFORM_ != _FXM_PLATFORM_LINUX_ && _FXM_PLATFORM_ != _FXM_PLATFORM_APPLE_ && _FXM_PLATFORM_ != _FXM_PLATFORM_ANDROID_)
+IFXCRT_FileAccess* FXCRT_FileAccess_Create(IFX_Allocator* pAllocator)
+{
+ if (pAllocator) {
+ return FX_NewAtAllocator(pAllocator) CFXCRT_FileAccess_CRT;
+ } else {
+ return FX_NEW CFXCRT_FileAccess_CRT;
+ }
+}
+void FXCRT_GetFileModeString(FX_DWORD dwModes, CFX_ByteString &bsMode)
+{
+ if (dwModes & FX_FILEMODE_ReadOnly) {
+ bsMode = FX_BSTRC("rb");
+ } else if (dwModes & FX_FILEMODE_Truncate) {
+ bsMode = FX_BSTRC("w+b");
+ } else {
+ bsMode = FX_BSTRC("a+b");
+ }
+}
+void FXCRT_GetFileModeString(FX_DWORD dwModes, CFX_WideString &wsMode)
+{
+ if (dwModes & FX_FILEMODE_ReadOnly) {
+ wsMode = FX_WSTRC(L"rb");
+ } else if (dwModes & FX_FILEMODE_Truncate) {
+ wsMode = FX_WSTRC(L"w+b");
+ } else {
+ wsMode = FX_WSTRC(L"a+b");
+ }
+}
+CFXCRT_FileAccess_CRT::CFXCRT_FileAccess_CRT()
+ : m_hFile(NULL)
+{
+}
+CFXCRT_FileAccess_CRT::~CFXCRT_FileAccess_CRT()
+{
+ Close();
+}
+FX_BOOL CFXCRT_FileAccess_CRT::Open(FX_BSTR fileName, FX_DWORD dwMode)
+{
+ if (m_hFile) {
+ return FALSE;
+ }
+ CFX_ByteString strMode;
+ FXCRT_GetFileModeString(dwMode, strMode);
+ m_hFile = FXSYS_fopen(fileName.GetCStr(), (FX_LPCSTR)strMode);
+ return m_hFile != NULL;
+}
+FX_BOOL CFXCRT_FileAccess_CRT::Open(FX_WSTR fileName, FX_DWORD dwMode)
+{
+ if (m_hFile) {
+ return FALSE;
+ }
+ CFX_WideString strMode;
+ FXCRT_GetFileModeString(dwMode, strMode);
+ m_hFile = FXSYS_wfopen(fileName.GetPtr(), (FX_LPCWSTR)strMode);
+ return m_hFile != NULL;
+}
+void CFXCRT_FileAccess_CRT::Close()
+{
+ if (!m_hFile) {
+ return;
+ }
+ FXSYS_fclose(m_hFile);
+ m_hFile = NULL;
+}
+void CFXCRT_FileAccess_CRT::Release(IFX_Allocator* pAllocator)
+{
+ if (pAllocator) {
+ FX_DeleteAtAllocator(this, pAllocator, CFXCRT_FileAccess_CRT);
+ } else {
+ delete this;
+ }
+}
+FX_FILESIZE CFXCRT_FileAccess_CRT::GetSize() const
+{
+ if (!m_hFile) {
+ return 0;
+ }
+ FX_FILESIZE pos = (FX_FILESIZE)FXSYS_ftell(m_hFile);
+ FXSYS_fseek(m_hFile, 0, FXSYS_SEEK_END);
+ FX_FILESIZE size = (FX_FILESIZE)FXSYS_ftell(m_hFile);
+ FXSYS_fseek(m_hFile, pos, FXSYS_SEEK_SET);
+ return size;
+}
+FX_FILESIZE CFXCRT_FileAccess_CRT::GetPosition() const
+{
+ if (!m_hFile) {
+ return (FX_FILESIZE) - 1;
+ }
+ return (FX_FILESIZE)FXSYS_ftell(m_hFile);
+}
+FX_FILESIZE CFXCRT_FileAccess_CRT::SetPosition(FX_FILESIZE pos)
+{
+ if (!m_hFile) {
+ return (FX_FILESIZE) - 1;
+ }
+ FXSYS_fseek(m_hFile, pos, FXSYS_SEEK_SET);
+ return (FX_FILESIZE)FXSYS_ftell(m_hFile);
+}
+size_t CFXCRT_FileAccess_CRT::Read(void* pBuffer, size_t szBuffer)
+{
+ if (!m_hFile) {
+ return 0;
+ }
+ return FXSYS_fread(pBuffer, 1, szBuffer, m_hFile);
+}
+size_t CFXCRT_FileAccess_CRT::Write(const void* pBuffer, size_t szBuffer)
+{
+ if (!m_hFile) {
+ return 0;
+ }
+ return FXSYS_fwrite(pBuffer, 1, szBuffer, m_hFile);
+}
+size_t CFXCRT_FileAccess_CRT::ReadPos(void* pBuffer, size_t szBuffer, FX_FILESIZE pos)
+{
+ if (!m_hFile) {
+ return (FX_FILESIZE) - 1;
+ }
+ FXSYS_fseek(m_hFile, pos, FXSYS_SEEK_SET);
+ return FXSYS_fread(pBuffer, 1, szBuffer, m_hFile);
+}
+size_t CFXCRT_FileAccess_CRT::WritePos(const void* pBuffer, size_t szBuffer, FX_FILESIZE pos)
+{
+ if (!m_hFile) {
+ return (FX_FILESIZE) - 1;
+ }
+ FXSYS_fseek(m_hFile, pos, FXSYS_SEEK_SET);
+ return FXSYS_fwrite(pBuffer, 1, szBuffer, m_hFile);
+}
+FX_BOOL CFXCRT_FileAccess_CRT::Flush()
+{
+ if (!m_hFile) {
+ return FALSE;
+ }
+ return !FXSYS_fflush(m_hFile);
+}
+FX_BOOL CFXCRT_FileAccess_CRT::Truncate(FX_FILESIZE szFile)
+{
+ return FALSE;
+}
+FX_BOOL FX_File_Exist(FX_BSTR fileName)
+{
+ return access(fileName.GetCStr(), F_OK) > -1;
+}
+FX_BOOL FX_File_Exist(FX_WSTR fileName)
+{
+ return FX_File_Exist(FX_UTF8Encode(fileName));
+}
+FX_BOOL FX_File_Delete(FX_BSTR fileName)
+{
+ return remove(fileName.GetCStr()) > -1;
+}
+FX_BOOL FX_File_Delete(FX_WSTR fileName)
+{
+ return FX_File_Delete(FX_UTF8Encode(fileName));
+}
+FX_BOOL FX_File_Copy(FX_BSTR fileNameSrc, FX_BSTR fileNameDst)
+{
+ CFXCRT_FileAccess_CRT src, dst;
+ if (!src.Open(fileNameSrc, FX_FILEMODE_ReadOnly)) {
+ return FALSE;
+ }
+ FX_FILESIZE size = src.GetSize();
+ if (!size) {
+ return FALSE;
+ }
+ if (!dst.Open(fileNameDst, FX_FILEMODE_Truncate)) {
+ return FALSE;
+ }
+ FX_FILESIZE num = 0;
+ FX_LPBYTE pBuffer = FX_Alloc(FX_BYTE, 32768);
+ if (!pBuffer) {
+ return FALSE;
+ }
+ while (num = src.Read(pBuffer, 32768)) {
+ if (dst.Write(pBuffer, num) != num) {
+ break;
+ }
+ }
+ FX_Free(pBuffer);
+ return TRUE;
+}
+FX_BOOL FX_File_Copy(FX_WSTR fileNameSrc, FX_WSTR fileNameDst)
+{
+ return FX_File_Copy(FX_UTF8Encode(fileNameSrc), FX_UTF8Encode(fileNameDst));
+}
+FX_BOOL FX_File_Move(FX_BSTR fileNameSrc, FX_BSTR fileNameDst)
+{
+ return rename(fileNameSrc.GetCStr(), fileNameDst.GetCStr());
+}
+FX_BOOL FX_File_Move(FX_WSTR fileNameSrc, FX_WSTR fileNameDst)
+{
+ return FX_File_Move(FX_UTF8Encode(fileNameSrc), FX_UTF8Encode(fileNameDst));
+}
+#endif
diff --git a/core/src/fxcrt/fxcrt_platforms.h b/core/src/fxcrt/fxcrt_platforms.h
index 633b888fe7..4cb839961d 100644
--- a/core/src/fxcrt/fxcrt_platforms.h
+++ b/core/src/fxcrt/fxcrt_platforms.h
@@ -1,35 +1,35 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef _FXCRT_PLATFORMS_
-#define _FXCRT_PLATFORMS_
-#include "extension.h"
-#if _FX_OS_ == _FX_ANDROID_
-void FXCRT_GetFileModeString(FX_DWORD dwModes, CFX_ByteString &bsMode);
-void FXCRT_GetFileModeString(FX_DWORD dwModes, CFX_WideString &wsMode);
-class CFXCRT_FileAccess_CRT : public IFXCRT_FileAccess, public CFX_Object
-{
-public:
- CFXCRT_FileAccess_CRT();
- virtual ~CFXCRT_FileAccess_CRT();
- virtual FX_BOOL Open(FX_BSTR fileName, FX_DWORD dwMode);
- virtual FX_BOOL Open(FX_WSTR fileName, FX_DWORD dwMode);
- virtual void Close();
- virtual void Release(IFX_Allocator* pAllocator = NULL);
- virtual FX_FILESIZE GetSize() const;
- virtual FX_FILESIZE GetPosition() const;
- virtual FX_FILESIZE SetPosition(FX_FILESIZE pos);
- virtual size_t Read(void* pBuffer, size_t szBuffer);
- virtual size_t Write(const void* pBuffer, size_t szBuffer);
- virtual size_t ReadPos(void* pBuffer, size_t szBuffer, FX_FILESIZE pos);
- virtual size_t WritePos(const void* pBuffer, size_t szBuffer, FX_FILESIZE pos);
- virtual FX_BOOL Flush();
- virtual FX_BOOL Truncate(FX_FILESIZE szFile);
-protected:
- FXSYS_FILE* m_hFile;
-};
-#endif
-#endif
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FXCRT_PLATFORMS_
+#define _FXCRT_PLATFORMS_
+#include "extension.h"
+#if _FX_OS_ == _FX_ANDROID_
+void FXCRT_GetFileModeString(FX_DWORD dwModes, CFX_ByteString &bsMode);
+void FXCRT_GetFileModeString(FX_DWORD dwModes, CFX_WideString &wsMode);
+class CFXCRT_FileAccess_CRT : public IFXCRT_FileAccess, public CFX_Object
+{
+public:
+ CFXCRT_FileAccess_CRT();
+ virtual ~CFXCRT_FileAccess_CRT();
+ virtual FX_BOOL Open(FX_BSTR fileName, FX_DWORD dwMode);
+ virtual FX_BOOL Open(FX_WSTR fileName, FX_DWORD dwMode);
+ virtual void Close();
+ virtual void Release(IFX_Allocator* pAllocator = NULL);
+ virtual FX_FILESIZE GetSize() const;
+ virtual FX_FILESIZE GetPosition() const;
+ virtual FX_FILESIZE SetPosition(FX_FILESIZE pos);
+ virtual size_t Read(void* pBuffer, size_t szBuffer);
+ virtual size_t Write(const void* pBuffer, size_t szBuffer);
+ virtual size_t ReadPos(void* pBuffer, size_t szBuffer, FX_FILESIZE pos);
+ virtual size_t WritePos(const void* pBuffer, size_t szBuffer, FX_FILESIZE pos);
+ virtual FX_BOOL Flush();
+ virtual FX_BOOL Truncate(FX_FILESIZE szFile);
+protected:
+ FXSYS_FILE* m_hFile;
+};
+#endif
+#endif
diff --git a/core/src/fxcrt/fxcrt_posix.cpp b/core/src/fxcrt/fxcrt_posix.cpp
index 6752e0a117..558f33466b 100644
--- a/core/src/fxcrt/fxcrt_posix.cpp
+++ b/core/src/fxcrt/fxcrt_posix.cpp
@@ -1,201 +1,201 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../include/fxcrt/fx_ext.h"
-#include "fxcrt_posix.h"
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_LINUX_ || _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ || _FXM_PLATFORM_ == _FXM_PLATFORM_ANDROID_
-IFXCRT_FileAccess* FXCRT_FileAccess_Create(IFX_Allocator* pAllocator)
-{
- if (pAllocator) {
- return FX_NewAtAllocator(pAllocator) CFXCRT_FileAccess_Posix();
- } else {
- return FX_NEW CFXCRT_FileAccess_Posix;
- }
-}
-void FXCRT_Posix_GetFileMode(FX_DWORD dwModes, FX_INT32 &nFlags, FX_INT32 &nMasks)
-{
- nFlags = O_BINARY | O_LARGEFILE;
- if (dwModes & FX_FILEMODE_ReadOnly) {
- nFlags |= O_RDONLY;
- nMasks = 0;
- } else {
- nFlags |= O_RDWR | O_CREAT;
- if (dwModes & FX_FILEMODE_Truncate) {
- nFlags |= O_TRUNC;
- }
- nMasks = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH;
- }
-}
-CFXCRT_FileAccess_Posix::CFXCRT_FileAccess_Posix()
- : m_nFD(-1)
-{
-}
-CFXCRT_FileAccess_Posix::~CFXCRT_FileAccess_Posix()
-{
- Close();
-}
-FX_BOOL CFXCRT_FileAccess_Posix::Open(FX_BSTR fileName, FX_DWORD dwMode)
-{
- if (m_nFD > -1) {
- return FALSE;
- }
- FX_INT32 nFlags, nMasks;
- FXCRT_Posix_GetFileMode(dwMode, nFlags, nMasks);
- m_nFD = open(fileName.GetCStr(), nFlags, nMasks);
- return m_nFD > -1;
-}
-FX_BOOL CFXCRT_FileAccess_Posix::Open(FX_WSTR fileName, FX_DWORD dwMode)
-{
- return Open(FX_UTF8Encode(fileName), dwMode);
-}
-void CFXCRT_FileAccess_Posix::Close()
-{
- if (m_nFD < 0) {
- return;
- }
- close(m_nFD);
- m_nFD = -1;
-}
-void CFXCRT_FileAccess_Posix::Release(IFX_Allocator* pAllocator)
-{
- if (pAllocator) {
- FX_DeleteAtAllocator(this, pAllocator, CFXCRT_FileAccess_Posix);
- } else {
- delete this;
- }
-}
-FX_FILESIZE CFXCRT_FileAccess_Posix::GetSize() const
-{
- if (m_nFD < 0) {
- return 0;
- }
- struct stat s;
- FXSYS_memset32(&s, 0, sizeof(s));
- fstat(m_nFD, &s);
- return s.st_size;
-}
-FX_FILESIZE CFXCRT_FileAccess_Posix::GetPosition() const
-{
- if (m_nFD < 0) {
- return (FX_FILESIZE) - 1;
- }
- return lseek(m_nFD, 0, SEEK_CUR);
-}
-FX_FILESIZE CFXCRT_FileAccess_Posix::SetPosition(FX_FILESIZE pos)
-{
- if (m_nFD < 0) {
- return (FX_FILESIZE) - 1;
- }
- return lseek(m_nFD, pos, SEEK_SET);
-}
-size_t CFXCRT_FileAccess_Posix::Read(void* pBuffer, size_t szBuffer)
-{
- if (m_nFD < 0) {
- return 0;
- }
- return read(m_nFD, pBuffer, szBuffer);
-}
-size_t CFXCRT_FileAccess_Posix::Write(const void* pBuffer, size_t szBuffer)
-{
- if (m_nFD < 0) {
- return 0;
- }
- return write(m_nFD, pBuffer, szBuffer);
-}
-size_t CFXCRT_FileAccess_Posix::ReadPos(void* pBuffer, size_t szBuffer, FX_FILESIZE pos)
-{
- if (m_nFD < 0) {
- return 0;
- }
- if (pos >= GetSize()) {
- return 0;
- }
- if (SetPosition(pos) == (FX_FILESIZE) - 1) {
- return 0;
- }
- return Read(pBuffer, szBuffer);
-}
-size_t CFXCRT_FileAccess_Posix::WritePos(const void* pBuffer, size_t szBuffer, FX_FILESIZE pos)
-{
- if (m_nFD < 0) {
- return 0;
- }
- if (SetPosition(pos) == (FX_FILESIZE) - 1) {
- return 0;
- }
- return Write(pBuffer, szBuffer);
-}
-FX_BOOL CFXCRT_FileAccess_Posix::Flush()
-{
- if (m_nFD < 0) {
- return FALSE;
- }
- return fsync(m_nFD) > -1;
-}
-FX_BOOL CFXCRT_FileAccess_Posix::Truncate(FX_FILESIZE szFile)
-{
- if (m_nFD < 0) {
- return FALSE;
- }
- return !ftruncate(m_nFD, szFile);
-}
-FX_BOOL FX_File_Exist(FX_BSTR fileName)
-{
- return access(fileName.GetCStr(), F_OK) > -1;
-}
-FX_BOOL FX_File_Exist(FX_WSTR fileName)
-{
- return FX_File_Exist(FX_UTF8Encode(fileName));
-}
-FX_BOOL FX_File_Delete(FX_BSTR fileName)
-{
- return remove(fileName.GetCStr()) > -1;
-}
-FX_BOOL FX_File_Delete(FX_WSTR fileName)
-{
- return FX_File_Delete(FX_UTF8Encode(fileName));
-}
-FX_BOOL FX_File_Copy(FX_BSTR fileNameSrc, FX_BSTR fileNameDst)
-{
- CFXCRT_FileAccess_Posix src, dst;
- if (!src.Open(fileNameSrc, FX_FILEMODE_ReadOnly)) {
- return FALSE;
- }
- FX_FILESIZE size = src.GetSize();
- if (!size) {
- return FALSE;
- }
- if (!dst.Open(fileNameDst, FX_FILEMODE_Truncate)) {
- return FALSE;
- }
- size_t num = 0;
- FX_LPBYTE pBuffer = FX_Alloc(FX_BYTE, 32768);
- if (!pBuffer) {
- return FALSE;
- }
- num = src.Read(pBuffer, 32768);
- while (num) {
- if (dst.Write(pBuffer, num) != num) {
- break;
- }
- num = src.Read(pBuffer, 32768);
- }
- FX_Free(pBuffer);
- return TRUE;
-}
-FX_BOOL FX_File_Copy(FX_WSTR fileNameSrc, FX_WSTR fileNameDst)
-{
- return FX_File_Copy(FX_UTF8Encode(fileNameSrc), FX_UTF8Encode(fileNameDst));
-}
-FX_BOOL FX_File_Move(FX_BSTR fileNameSrc, FX_BSTR fileNameDst)
-{
- return rename(fileNameSrc.GetCStr(), fileNameDst.GetCStr());
-}
-FX_BOOL FX_File_Move(FX_WSTR fileNameSrc, FX_WSTR fileNameDst)
-{
- return FX_File_Move(FX_UTF8Encode(fileNameSrc), FX_UTF8Encode(fileNameDst));
-}
-#endif
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fxcrt/fx_ext.h"
+#include "fxcrt_posix.h"
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_LINUX_ || _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ || _FXM_PLATFORM_ == _FXM_PLATFORM_ANDROID_
+IFXCRT_FileAccess* FXCRT_FileAccess_Create(IFX_Allocator* pAllocator)
+{
+ if (pAllocator) {
+ return FX_NewAtAllocator(pAllocator) CFXCRT_FileAccess_Posix();
+ } else {
+ return FX_NEW CFXCRT_FileAccess_Posix;
+ }
+}
+void FXCRT_Posix_GetFileMode(FX_DWORD dwModes, FX_INT32 &nFlags, FX_INT32 &nMasks)
+{
+ nFlags = O_BINARY | O_LARGEFILE;
+ if (dwModes & FX_FILEMODE_ReadOnly) {
+ nFlags |= O_RDONLY;
+ nMasks = 0;
+ } else {
+ nFlags |= O_RDWR | O_CREAT;
+ if (dwModes & FX_FILEMODE_Truncate) {
+ nFlags |= O_TRUNC;
+ }
+ nMasks = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH;
+ }
+}
+CFXCRT_FileAccess_Posix::CFXCRT_FileAccess_Posix()
+ : m_nFD(-1)
+{
+}
+CFXCRT_FileAccess_Posix::~CFXCRT_FileAccess_Posix()
+{
+ Close();
+}
+FX_BOOL CFXCRT_FileAccess_Posix::Open(FX_BSTR fileName, FX_DWORD dwMode)
+{
+ if (m_nFD > -1) {
+ return FALSE;
+ }
+ FX_INT32 nFlags, nMasks;
+ FXCRT_Posix_GetFileMode(dwMode, nFlags, nMasks);
+ m_nFD = open(fileName.GetCStr(), nFlags, nMasks);
+ return m_nFD > -1;
+}
+FX_BOOL CFXCRT_FileAccess_Posix::Open(FX_WSTR fileName, FX_DWORD dwMode)
+{
+ return Open(FX_UTF8Encode(fileName), dwMode);
+}
+void CFXCRT_FileAccess_Posix::Close()
+{
+ if (m_nFD < 0) {
+ return;
+ }
+ close(m_nFD);
+ m_nFD = -1;
+}
+void CFXCRT_FileAccess_Posix::Release(IFX_Allocator* pAllocator)
+{
+ if (pAllocator) {
+ FX_DeleteAtAllocator(this, pAllocator, CFXCRT_FileAccess_Posix);
+ } else {
+ delete this;
+ }
+}
+FX_FILESIZE CFXCRT_FileAccess_Posix::GetSize() const
+{
+ if (m_nFD < 0) {
+ return 0;
+ }
+ struct stat s;
+ FXSYS_memset32(&s, 0, sizeof(s));
+ fstat(m_nFD, &s);
+ return s.st_size;
+}
+FX_FILESIZE CFXCRT_FileAccess_Posix::GetPosition() const
+{
+ if (m_nFD < 0) {
+ return (FX_FILESIZE) - 1;
+ }
+ return lseek(m_nFD, 0, SEEK_CUR);
+}
+FX_FILESIZE CFXCRT_FileAccess_Posix::SetPosition(FX_FILESIZE pos)
+{
+ if (m_nFD < 0) {
+ return (FX_FILESIZE) - 1;
+ }
+ return lseek(m_nFD, pos, SEEK_SET);
+}
+size_t CFXCRT_FileAccess_Posix::Read(void* pBuffer, size_t szBuffer)
+{
+ if (m_nFD < 0) {
+ return 0;
+ }
+ return read(m_nFD, pBuffer, szBuffer);
+}
+size_t CFXCRT_FileAccess_Posix::Write(const void* pBuffer, size_t szBuffer)
+{
+ if (m_nFD < 0) {
+ return 0;
+ }
+ return write(m_nFD, pBuffer, szBuffer);
+}
+size_t CFXCRT_FileAccess_Posix::ReadPos(void* pBuffer, size_t szBuffer, FX_FILESIZE pos)
+{
+ if (m_nFD < 0) {
+ return 0;
+ }
+ if (pos >= GetSize()) {
+ return 0;
+ }
+ if (SetPosition(pos) == (FX_FILESIZE) - 1) {
+ return 0;
+ }
+ return Read(pBuffer, szBuffer);
+}
+size_t CFXCRT_FileAccess_Posix::WritePos(const void* pBuffer, size_t szBuffer, FX_FILESIZE pos)
+{
+ if (m_nFD < 0) {
+ return 0;
+ }
+ if (SetPosition(pos) == (FX_FILESIZE) - 1) {
+ return 0;
+ }
+ return Write(pBuffer, szBuffer);
+}
+FX_BOOL CFXCRT_FileAccess_Posix::Flush()
+{
+ if (m_nFD < 0) {
+ return FALSE;
+ }
+ return fsync(m_nFD) > -1;
+}
+FX_BOOL CFXCRT_FileAccess_Posix::Truncate(FX_FILESIZE szFile)
+{
+ if (m_nFD < 0) {
+ return FALSE;
+ }
+ return !ftruncate(m_nFD, szFile);
+}
+FX_BOOL FX_File_Exist(FX_BSTR fileName)
+{
+ return access(fileName.GetCStr(), F_OK) > -1;
+}
+FX_BOOL FX_File_Exist(FX_WSTR fileName)
+{
+ return FX_File_Exist(FX_UTF8Encode(fileName));
+}
+FX_BOOL FX_File_Delete(FX_BSTR fileName)
+{
+ return remove(fileName.GetCStr()) > -1;
+}
+FX_BOOL FX_File_Delete(FX_WSTR fileName)
+{
+ return FX_File_Delete(FX_UTF8Encode(fileName));
+}
+FX_BOOL FX_File_Copy(FX_BSTR fileNameSrc, FX_BSTR fileNameDst)
+{
+ CFXCRT_FileAccess_Posix src, dst;
+ if (!src.Open(fileNameSrc, FX_FILEMODE_ReadOnly)) {
+ return FALSE;
+ }
+ FX_FILESIZE size = src.GetSize();
+ if (!size) {
+ return FALSE;
+ }
+ if (!dst.Open(fileNameDst, FX_FILEMODE_Truncate)) {
+ return FALSE;
+ }
+ size_t num = 0;
+ FX_LPBYTE pBuffer = FX_Alloc(FX_BYTE, 32768);
+ if (!pBuffer) {
+ return FALSE;
+ }
+ num = src.Read(pBuffer, 32768);
+ while (num) {
+ if (dst.Write(pBuffer, num) != num) {
+ break;
+ }
+ num = src.Read(pBuffer, 32768);
+ }
+ FX_Free(pBuffer);
+ return TRUE;
+}
+FX_BOOL FX_File_Copy(FX_WSTR fileNameSrc, FX_WSTR fileNameDst)
+{
+ return FX_File_Copy(FX_UTF8Encode(fileNameSrc), FX_UTF8Encode(fileNameDst));
+}
+FX_BOOL FX_File_Move(FX_BSTR fileNameSrc, FX_BSTR fileNameDst)
+{
+ return rename(fileNameSrc.GetCStr(), fileNameDst.GetCStr());
+}
+FX_BOOL FX_File_Move(FX_WSTR fileNameSrc, FX_WSTR fileNameDst)
+{
+ return FX_File_Move(FX_UTF8Encode(fileNameSrc), FX_UTF8Encode(fileNameDst));
+}
+#endif
diff --git a/core/src/fxcrt/fxcrt_posix.h b/core/src/fxcrt/fxcrt_posix.h
index 29c84adb1f..f76e35cdd1 100644
--- a/core/src/fxcrt/fxcrt_posix.h
+++ b/core/src/fxcrt/fxcrt_posix.h
@@ -1,33 +1,33 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef _FXCRT_LINUX_
-#define _FXCRT_LINUX_
-#include "extension.h"
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_LINUX_ || _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ || _FXM_PLATFORM_ == _FXM_PLATFORM_ANDROID_
-class CFXCRT_FileAccess_Posix : public IFXCRT_FileAccess, public CFX_Object
-{
-public:
- CFXCRT_FileAccess_Posix();
- virtual ~CFXCRT_FileAccess_Posix();
- virtual FX_BOOL Open(FX_BSTR fileName, FX_DWORD dwMode);
- virtual FX_BOOL Open(FX_WSTR fileName, FX_DWORD dwMode);
- virtual void Close();
- virtual void Release(IFX_Allocator* pAllocator = NULL);
- virtual FX_FILESIZE GetSize() const;
- virtual FX_FILESIZE GetPosition() const;
- virtual FX_FILESIZE SetPosition(FX_FILESIZE pos);
- virtual size_t Read(void* pBuffer, size_t szBuffer);
- virtual size_t Write(const void* pBuffer, size_t szBuffer);
- virtual size_t ReadPos(void* pBuffer, size_t szBuffer, FX_FILESIZE pos);
- virtual size_t WritePos(const void* pBuffer, size_t szBuffer, FX_FILESIZE pos);
- virtual FX_BOOL Flush();
- virtual FX_BOOL Truncate(FX_FILESIZE szFile);
-protected:
- FX_INT32 m_nFD;
-};
-#endif
-#endif
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FXCRT_LINUX_
+#define _FXCRT_LINUX_
+#include "extension.h"
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_LINUX_ || _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ || _FXM_PLATFORM_ == _FXM_PLATFORM_ANDROID_
+class CFXCRT_FileAccess_Posix : public IFXCRT_FileAccess, public CFX_Object
+{
+public:
+ CFXCRT_FileAccess_Posix();
+ virtual ~CFXCRT_FileAccess_Posix();
+ virtual FX_BOOL Open(FX_BSTR fileName, FX_DWORD dwMode);
+ virtual FX_BOOL Open(FX_WSTR fileName, FX_DWORD dwMode);
+ virtual void Close();
+ virtual void Release(IFX_Allocator* pAllocator = NULL);
+ virtual FX_FILESIZE GetSize() const;
+ virtual FX_FILESIZE GetPosition() const;
+ virtual FX_FILESIZE SetPosition(FX_FILESIZE pos);
+ virtual size_t Read(void* pBuffer, size_t szBuffer);
+ virtual size_t Write(const void* pBuffer, size_t szBuffer);
+ virtual size_t ReadPos(void* pBuffer, size_t szBuffer, FX_FILESIZE pos);
+ virtual size_t WritePos(const void* pBuffer, size_t szBuffer, FX_FILESIZE pos);
+ virtual FX_BOOL Flush();
+ virtual FX_BOOL Truncate(FX_FILESIZE szFile);
+protected:
+ FX_INT32 m_nFD;
+};
+#endif
+#endif
diff --git a/core/src/fxcrt/fxcrt_windows.cpp b/core/src/fxcrt/fxcrt_windows.cpp
index e03bfda354..9b77b33ca2 100644
--- a/core/src/fxcrt/fxcrt_windows.cpp
+++ b/core/src/fxcrt/fxcrt_windows.cpp
@@ -1,222 +1,222 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../include/fxcrt/fx_ext.h"
-#include "fxcrt_windows.h"
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
-FX_BOOL FX_File_Exist(FX_BSTR fileName)
-{
- FX_DWORD dwAttri = ::GetFileAttributesA(fileName.GetCStr());
- if (dwAttri == -1) {
- return FALSE;
- }
- return (dwAttri & FILE_ATTRIBUTE_DIRECTORY) == 0;
-}
-FX_BOOL FX_File_Exist(FX_WSTR fileName)
-{
- FX_DWORD dwAttri = ::GetFileAttributesW((LPCWSTR)fileName.GetPtr());
- if (dwAttri == -1) {
- return FALSE;
- }
- return (dwAttri & FILE_ATTRIBUTE_DIRECTORY) == 0;
-}
-IFXCRT_FileAccess* FXCRT_FileAccess_Create(IFX_Allocator* pAllocator)
-{
- if (pAllocator) {
- return FX_NewAtAllocator(pAllocator) CFXCRT_FileAccess_Win64;
- } else {
- return FX_NEW CFXCRT_FileAccess_Win64;
- }
-}
-void FXCRT_Windows_GetFileMode(FX_DWORD dwMode, FX_DWORD &dwAccess, FX_DWORD &dwShare, FX_DWORD &dwCreation)
-{
- dwAccess = GENERIC_READ;
- dwShare = FILE_SHARE_READ | FILE_SHARE_WRITE;
- if (!(dwMode & FX_FILEMODE_ReadOnly)) {
- dwAccess |= GENERIC_WRITE;
- dwCreation = (dwMode & FX_FILEMODE_Truncate) ? CREATE_ALWAYS : OPEN_ALWAYS;
- } else {
- dwCreation = OPEN_EXISTING;
- }
-}
-#ifdef __cplusplus
-extern "C" {
-#endif
-WINBASEAPI BOOL WINAPI GetFileSizeEx(HANDLE hFile, PLARGE_INTEGER lpFileSize);
-WINBASEAPI BOOL WINAPI SetFilePointerEx(HANDLE hFile, LARGE_INTEGER liDistanceToMove, PLARGE_INTEGER lpNewFilePointer, DWORD dwMoveMethod);
-#ifdef __cplusplus
-}
-#endif
-CFXCRT_FileAccess_Win64::CFXCRT_FileAccess_Win64()
- : m_hFile(NULL)
-{
-}
-CFXCRT_FileAccess_Win64::~CFXCRT_FileAccess_Win64()
-{
- Close();
-}
-FX_BOOL CFXCRT_FileAccess_Win64::Open(FX_BSTR fileName, FX_DWORD dwMode)
-{
- if (m_hFile) {
- return FALSE;
- }
- FX_DWORD dwAccess, dwShare, dwCreation;
- FXCRT_Windows_GetFileMode(dwMode, dwAccess, dwShare, dwCreation);
- m_hFile = ::CreateFileA(fileName.GetCStr(), dwAccess, dwShare, NULL, dwCreation, FILE_ATTRIBUTE_NORMAL, NULL);
- if (m_hFile == INVALID_HANDLE_VALUE) {
- m_hFile = NULL;
- }
- return m_hFile != NULL;
-}
-FX_BOOL CFXCRT_FileAccess_Win64::Open(FX_WSTR fileName, FX_DWORD dwMode)
-{
- if (m_hFile) {
- return FALSE;
- }
- FX_DWORD dwAccess, dwShare, dwCreation;
- FXCRT_Windows_GetFileMode(dwMode, dwAccess, dwShare, dwCreation);
- m_hFile = ::CreateFileW((LPCWSTR)fileName.GetPtr(), dwAccess, dwShare, NULL, dwCreation, FILE_ATTRIBUTE_NORMAL, NULL);
- if (m_hFile == INVALID_HANDLE_VALUE) {
- m_hFile = NULL;
- }
- return m_hFile != NULL;
-}
-void CFXCRT_FileAccess_Win64::Close()
-{
- if (!m_hFile) {
- return;
- }
- ::CloseHandle(m_hFile);
- m_hFile = NULL;
-}
-void CFXCRT_FileAccess_Win64::Release(IFX_Allocator* pAllocator)
-{
- if (pAllocator) {
- FX_DeleteAtAllocator(this, pAllocator, CFXCRT_FileAccess_Win64);
- } else {
- delete this;
- }
-}
-FX_FILESIZE CFXCRT_FileAccess_Win64::GetSize() const
-{
- if (!m_hFile) {
- return 0;
- }
- LARGE_INTEGER size = {0, 0};
- if (!::GetFileSizeEx(m_hFile, &size)) {
- return 0;
- }
- return (FX_FILESIZE)size.QuadPart;
-}
-FX_FILESIZE CFXCRT_FileAccess_Win64::GetPosition() const
-{
- if (!m_hFile) {
- return (FX_FILESIZE) - 1;
- }
- LARGE_INTEGER dist = {0, 0};
- LARGE_INTEGER newPos = {0, 0};
- if (!::SetFilePointerEx(m_hFile, dist, &newPos, FILE_CURRENT)) {
- return (FX_FILESIZE) - 1;
- }
- return (FX_FILESIZE)newPos.QuadPart;
-}
-FX_FILESIZE CFXCRT_FileAccess_Win64::SetPosition(FX_FILESIZE pos)
-{
- if (!m_hFile) {
- return (FX_FILESIZE) - 1;
- }
- LARGE_INTEGER dist;
- dist.QuadPart = pos;
- LARGE_INTEGER newPos = {0, 0};
- if (!::SetFilePointerEx(m_hFile, dist, &newPos, FILE_BEGIN)) {
- return (FX_FILESIZE) - 1;
- }
- return (FX_FILESIZE)newPos.QuadPart;
-}
-size_t CFXCRT_FileAccess_Win64::Read(void* pBuffer, size_t szBuffer)
-{
- if (!m_hFile) {
- return 0;
- }
- size_t szRead = 0;
- if (!::ReadFile(m_hFile, pBuffer, (DWORD)szBuffer, (LPDWORD)&szRead, NULL)) {
- return 0;
- }
- return szRead;
-}
-size_t CFXCRT_FileAccess_Win64::Write(const void* pBuffer, size_t szBuffer)
-{
- if (!m_hFile) {
- return 0;
- }
- size_t szWrite = 0;
- if (!::WriteFile(m_hFile, pBuffer, (DWORD)szBuffer, (LPDWORD)&szWrite, NULL)) {
- return 0;
- }
- return szWrite;
-}
-size_t CFXCRT_FileAccess_Win64::ReadPos(void* pBuffer, size_t szBuffer, FX_FILESIZE pos)
-{
- if (!m_hFile) {
- return 0;
- }
- if (pos >= GetSize()) {
- return 0;
- }
- if (SetPosition(pos) == (FX_FILESIZE) - 1) {
- return 0;
- }
- return Read(pBuffer, szBuffer);
-}
-size_t CFXCRT_FileAccess_Win64::WritePos(const void* pBuffer, size_t szBuffer, FX_FILESIZE pos)
-{
- if (!m_hFile) {
- return 0;
- }
- if (SetPosition(pos) == (FX_FILESIZE) - 1) {
- return 0;
- }
- return Write(pBuffer, szBuffer);
-}
-FX_BOOL CFXCRT_FileAccess_Win64::Flush()
-{
- if (!m_hFile) {
- return FALSE;
- }
- return ::FlushFileBuffers(m_hFile);
-}
-FX_BOOL CFXCRT_FileAccess_Win64::Truncate(FX_FILESIZE szFile)
-{
- if (SetPosition(szFile) == (FX_FILESIZE) - 1) {
- return FALSE;
- }
- return ::SetEndOfFile(m_hFile);
-}
-FX_BOOL FX_File_Delete(FX_BSTR fileName)
-{
- return ::DeleteFileA(fileName.GetCStr());
-}
-FX_BOOL FX_File_Delete(FX_WSTR fileName)
-{
- return ::DeleteFileW((LPCWSTR)fileName.GetPtr());
-}
-FX_BOOL FX_File_Copy(FX_BSTR fileNameSrc, FX_BSTR fileNameDst)
-{
- return ::CopyFileA(fileNameSrc.GetCStr(), fileNameDst.GetCStr(), FALSE);
-}
-FX_BOOL FX_File_Copy(FX_WSTR fileNameSrc, FX_WSTR fileNameDst)
-{
- return ::CopyFileW((LPCWSTR)fileNameSrc.GetPtr(), (LPCWSTR)fileNameDst.GetPtr(), FALSE);
-}
-FX_BOOL FX_File_Move(FX_BSTR fileNameSrc, FX_BSTR fileNameDst)
-{
- return ::MoveFileA(fileNameSrc.GetCStr(), fileNameDst.GetCStr());
-}
-FX_BOOL FX_File_Move(FX_WSTR fileNameSrc, FX_WSTR fileNameDst)
-{
- return ::MoveFileW((LPCWSTR)fileNameSrc.GetPtr(), (LPCWSTR)fileNameDst.GetPtr());
-}
-#endif
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fxcrt/fx_ext.h"
+#include "fxcrt_windows.h"
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+FX_BOOL FX_File_Exist(FX_BSTR fileName)
+{
+ FX_DWORD dwAttri = ::GetFileAttributesA(fileName.GetCStr());
+ if (dwAttri == -1) {
+ return FALSE;
+ }
+ return (dwAttri & FILE_ATTRIBUTE_DIRECTORY) == 0;
+}
+FX_BOOL FX_File_Exist(FX_WSTR fileName)
+{
+ FX_DWORD dwAttri = ::GetFileAttributesW((LPCWSTR)fileName.GetPtr());
+ if (dwAttri == -1) {
+ return FALSE;
+ }
+ return (dwAttri & FILE_ATTRIBUTE_DIRECTORY) == 0;
+}
+IFXCRT_FileAccess* FXCRT_FileAccess_Create(IFX_Allocator* pAllocator)
+{
+ if (pAllocator) {
+ return FX_NewAtAllocator(pAllocator) CFXCRT_FileAccess_Win64;
+ } else {
+ return FX_NEW CFXCRT_FileAccess_Win64;
+ }
+}
+void FXCRT_Windows_GetFileMode(FX_DWORD dwMode, FX_DWORD &dwAccess, FX_DWORD &dwShare, FX_DWORD &dwCreation)
+{
+ dwAccess = GENERIC_READ;
+ dwShare = FILE_SHARE_READ | FILE_SHARE_WRITE;
+ if (!(dwMode & FX_FILEMODE_ReadOnly)) {
+ dwAccess |= GENERIC_WRITE;
+ dwCreation = (dwMode & FX_FILEMODE_Truncate) ? CREATE_ALWAYS : OPEN_ALWAYS;
+ } else {
+ dwCreation = OPEN_EXISTING;
+ }
+}
+#ifdef __cplusplus
+extern "C" {
+#endif
+WINBASEAPI BOOL WINAPI GetFileSizeEx(HANDLE hFile, PLARGE_INTEGER lpFileSize);
+WINBASEAPI BOOL WINAPI SetFilePointerEx(HANDLE hFile, LARGE_INTEGER liDistanceToMove, PLARGE_INTEGER lpNewFilePointer, DWORD dwMoveMethod);
+#ifdef __cplusplus
+}
+#endif
+CFXCRT_FileAccess_Win64::CFXCRT_FileAccess_Win64()
+ : m_hFile(NULL)
+{
+}
+CFXCRT_FileAccess_Win64::~CFXCRT_FileAccess_Win64()
+{
+ Close();
+}
+FX_BOOL CFXCRT_FileAccess_Win64::Open(FX_BSTR fileName, FX_DWORD dwMode)
+{
+ if (m_hFile) {
+ return FALSE;
+ }
+ FX_DWORD dwAccess, dwShare, dwCreation;
+ FXCRT_Windows_GetFileMode(dwMode, dwAccess, dwShare, dwCreation);
+ m_hFile = ::CreateFileA(fileName.GetCStr(), dwAccess, dwShare, NULL, dwCreation, FILE_ATTRIBUTE_NORMAL, NULL);
+ if (m_hFile == INVALID_HANDLE_VALUE) {
+ m_hFile = NULL;
+ }
+ return m_hFile != NULL;
+}
+FX_BOOL CFXCRT_FileAccess_Win64::Open(FX_WSTR fileName, FX_DWORD dwMode)
+{
+ if (m_hFile) {
+ return FALSE;
+ }
+ FX_DWORD dwAccess, dwShare, dwCreation;
+ FXCRT_Windows_GetFileMode(dwMode, dwAccess, dwShare, dwCreation);
+ m_hFile = ::CreateFileW((LPCWSTR)fileName.GetPtr(), dwAccess, dwShare, NULL, dwCreation, FILE_ATTRIBUTE_NORMAL, NULL);
+ if (m_hFile == INVALID_HANDLE_VALUE) {
+ m_hFile = NULL;
+ }
+ return m_hFile != NULL;
+}
+void CFXCRT_FileAccess_Win64::Close()
+{
+ if (!m_hFile) {
+ return;
+ }
+ ::CloseHandle(m_hFile);
+ m_hFile = NULL;
+}
+void CFXCRT_FileAccess_Win64::Release(IFX_Allocator* pAllocator)
+{
+ if (pAllocator) {
+ FX_DeleteAtAllocator(this, pAllocator, CFXCRT_FileAccess_Win64);
+ } else {
+ delete this;
+ }
+}
+FX_FILESIZE CFXCRT_FileAccess_Win64::GetSize() const
+{
+ if (!m_hFile) {
+ return 0;
+ }
+ LARGE_INTEGER size = {0, 0};
+ if (!::GetFileSizeEx(m_hFile, &size)) {
+ return 0;
+ }
+ return (FX_FILESIZE)size.QuadPart;
+}
+FX_FILESIZE CFXCRT_FileAccess_Win64::GetPosition() const
+{
+ if (!m_hFile) {
+ return (FX_FILESIZE) - 1;
+ }
+ LARGE_INTEGER dist = {0, 0};
+ LARGE_INTEGER newPos = {0, 0};
+ if (!::SetFilePointerEx(m_hFile, dist, &newPos, FILE_CURRENT)) {
+ return (FX_FILESIZE) - 1;
+ }
+ return (FX_FILESIZE)newPos.QuadPart;
+}
+FX_FILESIZE CFXCRT_FileAccess_Win64::SetPosition(FX_FILESIZE pos)
+{
+ if (!m_hFile) {
+ return (FX_FILESIZE) - 1;
+ }
+ LARGE_INTEGER dist;
+ dist.QuadPart = pos;
+ LARGE_INTEGER newPos = {0, 0};
+ if (!::SetFilePointerEx(m_hFile, dist, &newPos, FILE_BEGIN)) {
+ return (FX_FILESIZE) - 1;
+ }
+ return (FX_FILESIZE)newPos.QuadPart;
+}
+size_t CFXCRT_FileAccess_Win64::Read(void* pBuffer, size_t szBuffer)
+{
+ if (!m_hFile) {
+ return 0;
+ }
+ size_t szRead = 0;
+ if (!::ReadFile(m_hFile, pBuffer, (DWORD)szBuffer, (LPDWORD)&szRead, NULL)) {
+ return 0;
+ }
+ return szRead;
+}
+size_t CFXCRT_FileAccess_Win64::Write(const void* pBuffer, size_t szBuffer)
+{
+ if (!m_hFile) {
+ return 0;
+ }
+ size_t szWrite = 0;
+ if (!::WriteFile(m_hFile, pBuffer, (DWORD)szBuffer, (LPDWORD)&szWrite, NULL)) {
+ return 0;
+ }
+ return szWrite;
+}
+size_t CFXCRT_FileAccess_Win64::ReadPos(void* pBuffer, size_t szBuffer, FX_FILESIZE pos)
+{
+ if (!m_hFile) {
+ return 0;
+ }
+ if (pos >= GetSize()) {
+ return 0;
+ }
+ if (SetPosition(pos) == (FX_FILESIZE) - 1) {
+ return 0;
+ }
+ return Read(pBuffer, szBuffer);
+}
+size_t CFXCRT_FileAccess_Win64::WritePos(const void* pBuffer, size_t szBuffer, FX_FILESIZE pos)
+{
+ if (!m_hFile) {
+ return 0;
+ }
+ if (SetPosition(pos) == (FX_FILESIZE) - 1) {
+ return 0;
+ }
+ return Write(pBuffer, szBuffer);
+}
+FX_BOOL CFXCRT_FileAccess_Win64::Flush()
+{
+ if (!m_hFile) {
+ return FALSE;
+ }
+ return ::FlushFileBuffers(m_hFile);
+}
+FX_BOOL CFXCRT_FileAccess_Win64::Truncate(FX_FILESIZE szFile)
+{
+ if (SetPosition(szFile) == (FX_FILESIZE) - 1) {
+ return FALSE;
+ }
+ return ::SetEndOfFile(m_hFile);
+}
+FX_BOOL FX_File_Delete(FX_BSTR fileName)
+{
+ return ::DeleteFileA(fileName.GetCStr());
+}
+FX_BOOL FX_File_Delete(FX_WSTR fileName)
+{
+ return ::DeleteFileW((LPCWSTR)fileName.GetPtr());
+}
+FX_BOOL FX_File_Copy(FX_BSTR fileNameSrc, FX_BSTR fileNameDst)
+{
+ return ::CopyFileA(fileNameSrc.GetCStr(), fileNameDst.GetCStr(), FALSE);
+}
+FX_BOOL FX_File_Copy(FX_WSTR fileNameSrc, FX_WSTR fileNameDst)
+{
+ return ::CopyFileW((LPCWSTR)fileNameSrc.GetPtr(), (LPCWSTR)fileNameDst.GetPtr(), FALSE);
+}
+FX_BOOL FX_File_Move(FX_BSTR fileNameSrc, FX_BSTR fileNameDst)
+{
+ return ::MoveFileA(fileNameSrc.GetCStr(), fileNameDst.GetCStr());
+}
+FX_BOOL FX_File_Move(FX_WSTR fileNameSrc, FX_WSTR fileNameDst)
+{
+ return ::MoveFileW((LPCWSTR)fileNameSrc.GetPtr(), (LPCWSTR)fileNameDst.GetPtr());
+}
+#endif
diff --git a/core/src/fxcrt/fxcrt_windows.h b/core/src/fxcrt/fxcrt_windows.h
index beb684d067..9c2e428782 100644
--- a/core/src/fxcrt/fxcrt_windows.h
+++ b/core/src/fxcrt/fxcrt_windows.h
@@ -1,33 +1,33 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef _FXCRT_WINDOWS_
-#define _FXCRT_WINDOWS_
-#include "extension.h"
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
-class CFXCRT_FileAccess_Win64 : public IFXCRT_FileAccess, public CFX_Object
-{
-public:
- CFXCRT_FileAccess_Win64();
- virtual ~CFXCRT_FileAccess_Win64();
- virtual FX_BOOL Open(FX_BSTR fileName, FX_DWORD dwMode);
- virtual FX_BOOL Open(FX_WSTR fileName, FX_DWORD dwMode);
- virtual void Close();
- virtual void Release(IFX_Allocator* pAllocator = NULL);
- virtual FX_FILESIZE GetSize() const;
- virtual FX_FILESIZE GetPosition() const;
- virtual FX_FILESIZE SetPosition(FX_FILESIZE pos);
- virtual size_t Read(void* pBuffer, size_t szBuffer);
- virtual size_t Write(const void* pBuffer, size_t szBuffer);
- virtual size_t ReadPos(void* pBuffer, size_t szBuffer, FX_FILESIZE pos);
- virtual size_t WritePos(const void* pBuffer, size_t szBuffer, FX_FILESIZE pos);
- virtual FX_BOOL Flush();
- virtual FX_BOOL Truncate(FX_FILESIZE szFile);
-protected:
- FX_LPVOID m_hFile;
-};
-#endif
-#endif
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FXCRT_WINDOWS_
+#define _FXCRT_WINDOWS_
+#include "extension.h"
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+class CFXCRT_FileAccess_Win64 : public IFXCRT_FileAccess, public CFX_Object
+{
+public:
+ CFXCRT_FileAccess_Win64();
+ virtual ~CFXCRT_FileAccess_Win64();
+ virtual FX_BOOL Open(FX_BSTR fileName, FX_DWORD dwMode);
+ virtual FX_BOOL Open(FX_WSTR fileName, FX_DWORD dwMode);
+ virtual void Close();
+ virtual void Release(IFX_Allocator* pAllocator = NULL);
+ virtual FX_FILESIZE GetSize() const;
+ virtual FX_FILESIZE GetPosition() const;
+ virtual FX_FILESIZE SetPosition(FX_FILESIZE pos);
+ virtual size_t Read(void* pBuffer, size_t szBuffer);
+ virtual size_t Write(const void* pBuffer, size_t szBuffer);
+ virtual size_t ReadPos(void* pBuffer, size_t szBuffer, FX_FILESIZE pos);
+ virtual size_t WritePos(const void* pBuffer, size_t szBuffer, FX_FILESIZE pos);
+ virtual FX_BOOL Flush();
+ virtual FX_BOOL Truncate(FX_FILESIZE szFile);
+protected:
+ FX_LPVOID m_hFile;
+};
+#endif
+#endif
diff --git a/core/src/fxcrt/mem_int.h b/core/src/fxcrt/mem_int.h
index da43023bb5..3e3d25a7ec 100644
--- a/core/src/fxcrt/mem_int.h
+++ b/core/src/fxcrt/mem_int.h
@@ -1,232 +1,232 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef _FXM_MEM_INT_H_
-#define _FXM_MEM_INT_H_
-struct FX_DefAllocator {
- IFX_Allocator m_Allocator;
- struct CFX_MemoryMgr* m_pFoxitMgr;
-};
-struct CFX_MemoryMgr {
-public:
- FXMEM_SystemMgr* m_pSystemMgr;
- FX_DefAllocator m_DefAllocator;
- FX_LPVOID m_pExternalMemory;
- FX_BOOL m_bReleaseMgr;
- void Init(FXMEM_SystemMgr* pSystemMgr);
- void* Alloc(size_t size, int flags);
- void* AllocDebug(size_t size, int flags, FX_LPCSTR file, int line);
- void* Realloc(void* p, size_t size, int flags);
- void* ReallocDebug(void* p, size_t size, int flags, FX_LPCSTR file, int line);
- void Free(void* p, int flags);
- void PurgeMgr();
-};
-extern CFX_MemoryMgr* g_pDefFoxitMgr;
-#define FIXEDMEM_PAGE_EXTRASPACE sizeof(size_t)
-#define FIXEDMEM_BLOCKNUM(bs) (8 * (FX_FIXEDMEM_PAGESIZE - FIXEDMEM_PAGE_EXTRASPACE) / (8 * bs + 1))
-#define FIXEDMEM_8BYTES_BLOCKNUM FIXEDMEM_BLOCKNUM(8)
-#define FIXEDMEM_16BYTES_BLOCKNUM FIXEDMEM_BLOCKNUM(16)
-#define FIXEDMEM_32BYTES_BLOCKNUM FIXEDMEM_BLOCKNUM(32)
-extern const FX_BYTE ZeroLeadPos[256];
-extern const FX_BYTE OneLeadPos[256];
-template <size_t blockNum, size_t blockSize>
-class CFXMEM_FixedPage
-{
-public:
- void Initialize()
- {
- m_nAvailCount = blockNum;
- FXSYS_memset32(m_BusyMap, 0, (blockNum + 7) / 8);
- }
- FX_BOOL HasFreeBlock() const
- {
- return (FX_BOOL)m_nAvailCount;
- }
- FX_LPVOID Alloc(size_t size)
- {
- FXSYS_assert(m_nAvailCount);
- FX_LPDWORD pFind = (FX_LPDWORD)m_BusyMap;
- size_t i = 0;
- while (i < (blockNum + 7) / 8 / 4 && pFind[i] == 0xFFFFFFFF) {
- i ++;
- }
- i *= 4;
- while (m_BusyMap[i] == 0xFF) {
- i ++;
- }
- size_t pos = ZeroLeadPos[m_BusyMap[i]];
- m_BusyMap[i] |= 1 << (7 - pos);
- m_nAvailCount --;
- return (FX_LPBYTE)(this + 1) + (i * 8 + pos) * blockSize;
- }
- void Free(FX_LPVOID p)
- {
- FXSYS_assert(p > (FX_LPVOID)this && p < (FX_LPVOID)((FX_LPBYTE)this + FX_FIXEDMEM_PAGESIZE));
- size_t pos = ((FX_LPBYTE)p - (FX_LPBYTE)(this + 1)) / blockSize;
- m_BusyMap[pos / 8] &= ~(1 << (7 - (pos % 8)));
- m_nAvailCount ++;
- }
- volatile size_t m_nAvailCount;
- FX_BYTE m_BusyMap[(blockNum + 7) / 8];
-};
-typedef CFXMEM_FixedPage<FIXEDMEM_8BYTES_BLOCKNUM, 8> CFXMEM_8BytesPage;
-typedef CFXMEM_FixedPage<FIXEDMEM_16BYTES_BLOCKNUM, 16> CFXMEM_16BytesPage;
-typedef CFXMEM_FixedPage<FIXEDMEM_32BYTES_BLOCKNUM, 32> CFXMEM_32BytesPage;
-template <size_t blockNum, size_t blockSize>
-class CFXMEM_FixedPages
-{
-public:
- typedef CFXMEM_FixedPage<blockNum, blockSize> T;
- FX_LPBYTE m_pStartPage;
- FX_LPBYTE m_pLimitPos;
- FX_LPBYTE m_pCurPage;
- volatile size_t m_nAvailBlocks;
- void Initialize(FX_LPBYTE pStart, size_t pages)
- {
- m_pStartPage = m_pCurPage = pStart;
- m_nAvailBlocks = pages * blockNum;
- for (size_t n = 0; n < pages; n ++) {
- ((T*)pStart)->Initialize();
- pStart += FX_FIXEDMEM_PAGESIZE;
- }
- m_pLimitPos = pStart;
- }
- FX_BOOL IsEmpty() const
- {
- return m_nAvailBlocks == (m_pLimitPos - m_pStartPage) / FX_FIXEDMEM_PAGESIZE * blockNum;
- }
- FX_BOOL HasFreeBlock() const
- {
- return (FX_BOOL)m_nAvailBlocks;
- }
- FX_LPVOID Alloc(size_t size)
- {
- FXSYS_assert(m_nAvailBlocks);
- do {
- if (((T*)m_pCurPage)->HasFreeBlock()) {
- m_nAvailBlocks --;
- return ((T*)m_pCurPage)->Alloc(size);
- }
- m_pCurPage += FX_FIXEDMEM_PAGESIZE;
- if (m_pCurPage == m_pLimitPos) {
- m_pCurPage = m_pStartPage;
- }
- } while (TRUE);
- return NULL;
- }
- void Free(FX_LPVOID p)
- {
- FXSYS_assert(p > (FX_LPVOID)m_pStartPage && p < (FX_LPVOID)m_pLimitPos);
- ((T*)(m_pStartPage + ((FX_LPBYTE)p - m_pStartPage) / FX_FIXEDMEM_PAGESIZE * FX_FIXEDMEM_PAGESIZE))->Free(p);
- m_nAvailBlocks ++;
- }
-};
-typedef CFXMEM_FixedPages<FIXEDMEM_8BYTES_BLOCKNUM, 8> CFXMEM_8BytesPages;
-typedef CFXMEM_FixedPages<FIXEDMEM_16BYTES_BLOCKNUM, 16> CFXMEM_16BytesPages;
-typedef CFXMEM_FixedPages<FIXEDMEM_32BYTES_BLOCKNUM, 32> CFXMEM_32BytesPages;
-class CFXMEM_Block
-{
-public:
- size_t m_nBlockSize;
- CFXMEM_Block* m_pNextBlock;
-};
-class CFXMEM_Page
-{
-public:
- size_t m_nAvailSize;
- CFXMEM_Block* m_pLimitPos;
- CFXMEM_Block m_AvailHead;
- void Initialize(size_t size);
- FX_BOOL IsEmpty() const
- {
- return m_AvailHead.m_pNextBlock && m_AvailHead.m_nBlockSize == m_AvailHead.m_pNextBlock->m_nBlockSize;
- }
- FX_LPVOID Alloc(size_t size);
- FX_LPVOID Realloc(FX_LPVOID p, size_t oldSize, size_t newSize);
- void Free(FX_LPVOID p);
-protected:
- FX_LPVOID Alloc(CFXMEM_Block* pPrevBlock, CFXMEM_Block* pNextBlock, size_t size, size_t oldsize);
-};
-class CFXMEM_Pages
-{
-public:
- CFXMEM_Page* m_pStartPage;
- CFXMEM_Page* m_pLimitPos;
- CFXMEM_Page* m_pCurPage;
- size_t m_nPageSize;
- void Initialize(FX_LPBYTE pStart, size_t pageSize, size_t pages);
- FX_BOOL IsEmpty() const;
- FX_LPVOID Alloc(size_t size);
- FX_LPVOID Realloc(FX_LPVOID p, size_t oldSize, size_t newSize);
- void Free(FX_LPVOID p);
-};
-class CFXMEM_Pool
-{
-public:
- CFXMEM_Pool* m_pPrevPool;
- CFXMEM_Pool* m_pNextPool;
- CFXMEM_8BytesPages m_8BytesPages;
- CFXMEM_16BytesPages m_16BytesPages;
- CFXMEM_32BytesPages m_32BytesPages;
- CFXMEM_Pages m_MidPages;
- FX_BOOL m_bAlone;
- FX_DWORD m_dwReserved[3];
- FX_LPVOID m_pLimitPos;
- CFXMEM_Page* m_pLargePage;
- void Initialize(const FX_MEMCONFIG* pMemConfig, size_t size, size_t pageNum8Bytes, size_t pageNum16Bytes, size_t pageNum32Bytes, size_t pageNumMid);
- FX_BOOL IsEmpty() const;
- size_t GetSize(FX_LPVOID p) const;
- FX_LPVOID Realloc(FX_LPVOID p, size_t oldSize, size_t newSize);
- void Free(FX_LPVOID p);
-};
-class CFXMEM_FixedMgr
-{
-public:
- void Initialize(size_t size);
- FX_LPVOID Alloc(size_t size);
- FX_LPVOID Realloc(FX_LPVOID p, size_t newSize);
- void Free(FX_LPVOID p);
- void FreeAll();
- void Purge();
- CFXMEM_Pool* GetFirstPool()
- {
- return &m_FirstPool;
- }
- size_t GetSize(FX_LPVOID p) const;
- FXMEM_SystemMgr m_SystemMgr;
- FXMEM_SystemMgr2* m_pExtender;
- FX_LPVOID m_pReserved;
- FX_MEMCONFIG m_MemConfig;
-protected:
- FX_LPVOID Alloc16(CFXMEM_Pool **pp32Pool = NULL, size_t size = 0);
- FX_LPVOID Alloc32(size_t size);
- FX_LPVOID AllocSmall(size_t size);
- FX_LPVOID AllocMid(size_t size);
- FX_LPVOID AllocLarge(size_t size);
- FX_LPVOID ReallocSmall(CFXMEM_Pool* pPool, FX_LPVOID p, size_t oldSize, size_t newSize);
- void FreePool(CFXMEM_Pool* pPool);
- CFXMEM_Pool m_FirstPool;
-};
-#define FIXEDMEM_PROXYSIZE_0 (1024 * 1024 * 8)
-#define FIXEDMEM_PROXYSIZE_1 (1024 * 1024 * 16)
-#define FIXEDMEM_PROXYSIZE_2 (1024 * 1024 * 32)
-#define FIXEDMEM_PROXYSIZE_3 (1024 * 1024 * 64)
-#define FIXEDMEM_PROXYSIZE_4 (1024 * 1024 * 128)
-#define FIXEDMEM_PROXYSIZE_5 (1024 * 1024 * 256)
-const FX_MEMCONFIG* FixedMgr_GetConfig(size_t nSize);
-class CFixedMgr_Proxy
-{
-public:
- FXMEM_FoxitMgr* Initialize(FX_LPVOID pBuffer, size_t nSize, FX_BOOL bExtensible);
- static FX_BOOL Common_More(FXMEM_SystemMgr2* pMgr, size_t alloc_size, void** new_memory, size_t* new_size);
- static void Common_Free(FXMEM_SystemMgr2* pMgr, void* memory);
- FXMEM_SystemMgr2 m_SystemMgr;
- CFXMEM_Page* m_pFixedPage;
- FX_LPVOID m_pBuffer;
- size_t m_nSize;
- FX_BOOL m_bExtensible;
-};
-#endif
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FXM_MEM_INT_H_
+#define _FXM_MEM_INT_H_
+struct FX_DefAllocator {
+ IFX_Allocator m_Allocator;
+ struct CFX_MemoryMgr* m_pFoxitMgr;
+};
+struct CFX_MemoryMgr {
+public:
+ FXMEM_SystemMgr* m_pSystemMgr;
+ FX_DefAllocator m_DefAllocator;
+ FX_LPVOID m_pExternalMemory;
+ FX_BOOL m_bReleaseMgr;
+ void Init(FXMEM_SystemMgr* pSystemMgr);
+ void* Alloc(size_t size, int flags);
+ void* AllocDebug(size_t size, int flags, FX_LPCSTR file, int line);
+ void* Realloc(void* p, size_t size, int flags);
+ void* ReallocDebug(void* p, size_t size, int flags, FX_LPCSTR file, int line);
+ void Free(void* p, int flags);
+ void PurgeMgr();
+};
+extern CFX_MemoryMgr* g_pDefFoxitMgr;
+#define FIXEDMEM_PAGE_EXTRASPACE sizeof(size_t)
+#define FIXEDMEM_BLOCKNUM(bs) (8 * (FX_FIXEDMEM_PAGESIZE - FIXEDMEM_PAGE_EXTRASPACE) / (8 * bs + 1))
+#define FIXEDMEM_8BYTES_BLOCKNUM FIXEDMEM_BLOCKNUM(8)
+#define FIXEDMEM_16BYTES_BLOCKNUM FIXEDMEM_BLOCKNUM(16)
+#define FIXEDMEM_32BYTES_BLOCKNUM FIXEDMEM_BLOCKNUM(32)
+extern const FX_BYTE ZeroLeadPos[256];
+extern const FX_BYTE OneLeadPos[256];
+template <size_t blockNum, size_t blockSize>
+class CFXMEM_FixedPage
+{
+public:
+ void Initialize()
+ {
+ m_nAvailCount = blockNum;
+ FXSYS_memset32(m_BusyMap, 0, (blockNum + 7) / 8);
+ }
+ FX_BOOL HasFreeBlock() const
+ {
+ return (FX_BOOL)m_nAvailCount;
+ }
+ FX_LPVOID Alloc(size_t size)
+ {
+ FXSYS_assert(m_nAvailCount);
+ FX_LPDWORD pFind = (FX_LPDWORD)m_BusyMap;
+ size_t i = 0;
+ while (i < (blockNum + 7) / 8 / 4 && pFind[i] == 0xFFFFFFFF) {
+ i ++;
+ }
+ i *= 4;
+ while (m_BusyMap[i] == 0xFF) {
+ i ++;
+ }
+ size_t pos = ZeroLeadPos[m_BusyMap[i]];
+ m_BusyMap[i] |= 1 << (7 - pos);
+ m_nAvailCount --;
+ return (FX_LPBYTE)(this + 1) + (i * 8 + pos) * blockSize;
+ }
+ void Free(FX_LPVOID p)
+ {
+ FXSYS_assert(p > (FX_LPVOID)this && p < (FX_LPVOID)((FX_LPBYTE)this + FX_FIXEDMEM_PAGESIZE));
+ size_t pos = ((FX_LPBYTE)p - (FX_LPBYTE)(this + 1)) / blockSize;
+ m_BusyMap[pos / 8] &= ~(1 << (7 - (pos % 8)));
+ m_nAvailCount ++;
+ }
+ volatile size_t m_nAvailCount;
+ FX_BYTE m_BusyMap[(blockNum + 7) / 8];
+};
+typedef CFXMEM_FixedPage<FIXEDMEM_8BYTES_BLOCKNUM, 8> CFXMEM_8BytesPage;
+typedef CFXMEM_FixedPage<FIXEDMEM_16BYTES_BLOCKNUM, 16> CFXMEM_16BytesPage;
+typedef CFXMEM_FixedPage<FIXEDMEM_32BYTES_BLOCKNUM, 32> CFXMEM_32BytesPage;
+template <size_t blockNum, size_t blockSize>
+class CFXMEM_FixedPages
+{
+public:
+ typedef CFXMEM_FixedPage<blockNum, blockSize> T;
+ FX_LPBYTE m_pStartPage;
+ FX_LPBYTE m_pLimitPos;
+ FX_LPBYTE m_pCurPage;
+ volatile size_t m_nAvailBlocks;
+ void Initialize(FX_LPBYTE pStart, size_t pages)
+ {
+ m_pStartPage = m_pCurPage = pStart;
+ m_nAvailBlocks = pages * blockNum;
+ for (size_t n = 0; n < pages; n ++) {
+ ((T*)pStart)->Initialize();
+ pStart += FX_FIXEDMEM_PAGESIZE;
+ }
+ m_pLimitPos = pStart;
+ }
+ FX_BOOL IsEmpty() const
+ {
+ return m_nAvailBlocks == (m_pLimitPos - m_pStartPage) / FX_FIXEDMEM_PAGESIZE * blockNum;
+ }
+ FX_BOOL HasFreeBlock() const
+ {
+ return (FX_BOOL)m_nAvailBlocks;
+ }
+ FX_LPVOID Alloc(size_t size)
+ {
+ FXSYS_assert(m_nAvailBlocks);
+ do {
+ if (((T*)m_pCurPage)->HasFreeBlock()) {
+ m_nAvailBlocks --;
+ return ((T*)m_pCurPage)->Alloc(size);
+ }
+ m_pCurPage += FX_FIXEDMEM_PAGESIZE;
+ if (m_pCurPage == m_pLimitPos) {
+ m_pCurPage = m_pStartPage;
+ }
+ } while (TRUE);
+ return NULL;
+ }
+ void Free(FX_LPVOID p)
+ {
+ FXSYS_assert(p > (FX_LPVOID)m_pStartPage && p < (FX_LPVOID)m_pLimitPos);
+ ((T*)(m_pStartPage + ((FX_LPBYTE)p - m_pStartPage) / FX_FIXEDMEM_PAGESIZE * FX_FIXEDMEM_PAGESIZE))->Free(p);
+ m_nAvailBlocks ++;
+ }
+};
+typedef CFXMEM_FixedPages<FIXEDMEM_8BYTES_BLOCKNUM, 8> CFXMEM_8BytesPages;
+typedef CFXMEM_FixedPages<FIXEDMEM_16BYTES_BLOCKNUM, 16> CFXMEM_16BytesPages;
+typedef CFXMEM_FixedPages<FIXEDMEM_32BYTES_BLOCKNUM, 32> CFXMEM_32BytesPages;
+class CFXMEM_Block
+{
+public:
+ size_t m_nBlockSize;
+ CFXMEM_Block* m_pNextBlock;
+};
+class CFXMEM_Page
+{
+public:
+ size_t m_nAvailSize;
+ CFXMEM_Block* m_pLimitPos;
+ CFXMEM_Block m_AvailHead;
+ void Initialize(size_t size);
+ FX_BOOL IsEmpty() const
+ {
+ return m_AvailHead.m_pNextBlock && m_AvailHead.m_nBlockSize == m_AvailHead.m_pNextBlock->m_nBlockSize;
+ }
+ FX_LPVOID Alloc(size_t size);
+ FX_LPVOID Realloc(FX_LPVOID p, size_t oldSize, size_t newSize);
+ void Free(FX_LPVOID p);
+protected:
+ FX_LPVOID Alloc(CFXMEM_Block* pPrevBlock, CFXMEM_Block* pNextBlock, size_t size, size_t oldsize);
+};
+class CFXMEM_Pages
+{
+public:
+ CFXMEM_Page* m_pStartPage;
+ CFXMEM_Page* m_pLimitPos;
+ CFXMEM_Page* m_pCurPage;
+ size_t m_nPageSize;
+ void Initialize(FX_LPBYTE pStart, size_t pageSize, size_t pages);
+ FX_BOOL IsEmpty() const;
+ FX_LPVOID Alloc(size_t size);
+ FX_LPVOID Realloc(FX_LPVOID p, size_t oldSize, size_t newSize);
+ void Free(FX_LPVOID p);
+};
+class CFXMEM_Pool
+{
+public:
+ CFXMEM_Pool* m_pPrevPool;
+ CFXMEM_Pool* m_pNextPool;
+ CFXMEM_8BytesPages m_8BytesPages;
+ CFXMEM_16BytesPages m_16BytesPages;
+ CFXMEM_32BytesPages m_32BytesPages;
+ CFXMEM_Pages m_MidPages;
+ FX_BOOL m_bAlone;
+ FX_DWORD m_dwReserved[3];
+ FX_LPVOID m_pLimitPos;
+ CFXMEM_Page* m_pLargePage;
+ void Initialize(const FX_MEMCONFIG* pMemConfig, size_t size, size_t pageNum8Bytes, size_t pageNum16Bytes, size_t pageNum32Bytes, size_t pageNumMid);
+ FX_BOOL IsEmpty() const;
+ size_t GetSize(FX_LPVOID p) const;
+ FX_LPVOID Realloc(FX_LPVOID p, size_t oldSize, size_t newSize);
+ void Free(FX_LPVOID p);
+};
+class CFXMEM_FixedMgr
+{
+public:
+ void Initialize(size_t size);
+ FX_LPVOID Alloc(size_t size);
+ FX_LPVOID Realloc(FX_LPVOID p, size_t newSize);
+ void Free(FX_LPVOID p);
+ void FreeAll();
+ void Purge();
+ CFXMEM_Pool* GetFirstPool()
+ {
+ return &m_FirstPool;
+ }
+ size_t GetSize(FX_LPVOID p) const;
+ FXMEM_SystemMgr m_SystemMgr;
+ FXMEM_SystemMgr2* m_pExtender;
+ FX_LPVOID m_pReserved;
+ FX_MEMCONFIG m_MemConfig;
+protected:
+ FX_LPVOID Alloc16(CFXMEM_Pool **pp32Pool = NULL, size_t size = 0);
+ FX_LPVOID Alloc32(size_t size);
+ FX_LPVOID AllocSmall(size_t size);
+ FX_LPVOID AllocMid(size_t size);
+ FX_LPVOID AllocLarge(size_t size);
+ FX_LPVOID ReallocSmall(CFXMEM_Pool* pPool, FX_LPVOID p, size_t oldSize, size_t newSize);
+ void FreePool(CFXMEM_Pool* pPool);
+ CFXMEM_Pool m_FirstPool;
+};
+#define FIXEDMEM_PROXYSIZE_0 (1024 * 1024 * 8)
+#define FIXEDMEM_PROXYSIZE_1 (1024 * 1024 * 16)
+#define FIXEDMEM_PROXYSIZE_2 (1024 * 1024 * 32)
+#define FIXEDMEM_PROXYSIZE_3 (1024 * 1024 * 64)
+#define FIXEDMEM_PROXYSIZE_4 (1024 * 1024 * 128)
+#define FIXEDMEM_PROXYSIZE_5 (1024 * 1024 * 256)
+const FX_MEMCONFIG* FixedMgr_GetConfig(size_t nSize);
+class CFixedMgr_Proxy
+{
+public:
+ FXMEM_FoxitMgr* Initialize(FX_LPVOID pBuffer, size_t nSize, FX_BOOL bExtensible);
+ static FX_BOOL Common_More(FXMEM_SystemMgr2* pMgr, size_t alloc_size, void** new_memory, size_t* new_size);
+ static void Common_Free(FXMEM_SystemMgr2* pMgr, void* memory);
+ FXMEM_SystemMgr2 m_SystemMgr;
+ CFXMEM_Page* m_pFixedPage;
+ FX_LPVOID m_pBuffer;
+ size_t m_nSize;
+ FX_BOOL m_bExtensible;
+};
+#endif
diff --git a/core/src/fxcrt/plex.h b/core/src/fxcrt/plex.h
index 32a27cbf1d..e982fd67a4 100644
--- a/core/src/fxcrt/plex.h
+++ b/core/src/fxcrt/plex.h
@@ -1,15 +1,15 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-struct CFX_Plex {
- CFX_Plex* pNext;
- void* data()
- {
- return this + 1;
- }
- static CFX_Plex* Create(IFX_Allocator* pAllocator, CFX_Plex*& head, FX_DWORD nMax, FX_DWORD cbElement);
- void FreeDataChain(IFX_Allocator* pAllocator);
-};
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+struct CFX_Plex {
+ CFX_Plex* pNext;
+ void* data()
+ {
+ return this + 1;
+ }
+ static CFX_Plex* Create(IFX_Allocator* pAllocator, CFX_Plex*& head, FX_DWORD nMax, FX_DWORD cbElement);
+ void FreeDataChain(IFX_Allocator* pAllocator);
+};
diff --git a/core/src/fxcrt/xml_int.h b/core/src/fxcrt/xml_int.h
index 8ad8ef4b88..09737893af 100644
--- a/core/src/fxcrt/xml_int.h
+++ b/core/src/fxcrt/xml_int.h
@@ -1,178 +1,178 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef _FXCRT_XML_INT_
-#define _FXCRT_XML_INT_
-class CXML_DataBufAcc : public IFX_BufferRead, public CFX_Object
-{
-public:
- CXML_DataBufAcc(FX_LPCBYTE pBuffer, size_t size, IFX_Allocator* pAllocator = NULL)
- : m_pAllocator(pAllocator)
- , m_pBuffer(pBuffer)
- , m_dwSize(size)
- , m_dwCurPos(0)
- {
- }
- virtual ~CXML_DataBufAcc() {}
- virtual void Release()
- {
- if (m_pAllocator) {
- FX_DeleteAtAllocator(this, m_pAllocator, CXML_DataBufAcc);
- } else {
- delete this;
- }
- }
- virtual FX_BOOL IsEOF()
- {
- return m_dwCurPos >= m_dwSize;
- }
- virtual FX_FILESIZE GetPosition()
- {
- return (FX_FILESIZE)m_dwCurPos;
- }
- virtual size_t ReadBlock(void* buffer, size_t size)
- {
- return 0;
- }
- virtual FX_BOOL ReadNextBlock(FX_BOOL bRestart = FALSE)
- {
- if (bRestart) {
- m_dwCurPos = 0;
- }
- if (m_dwCurPos < m_dwSize) {
- m_dwCurPos = m_dwSize;
- return TRUE;
- }
- return FALSE;
- }
- virtual FX_LPCBYTE GetBlockBuffer()
- {
- return m_pBuffer;
- }
- virtual size_t GetBlockSize()
- {
- return m_dwSize;
- }
- virtual FX_FILESIZE GetBlockOffset()
- {
- return 0;
- }
-protected:
- IFX_Allocator* m_pAllocator;
- FX_LPCBYTE m_pBuffer;
- size_t m_dwSize;
- size_t m_dwCurPos;
-};
-#define FX_XMLDATASTREAM_BufferSize (32 * 1024)
-class CXML_DataStmAcc : public IFX_BufferRead, public CFX_Object
-{
-public:
- CXML_DataStmAcc(IFX_FileRead *pFileRead, IFX_Allocator* pAllocator = NULL)
- : m_pAllocator(pAllocator)
- , m_pFileRead(pFileRead)
- , m_pBuffer(NULL)
- , m_nStart(0)
- , m_dwSize(0)
- {
- FXSYS_assert(m_pFileRead != NULL);
- }
- virtual ~CXML_DataStmAcc()
- {
- if (m_pBuffer) {
- FX_Allocator_Free(m_pAllocator, m_pBuffer);
- }
- }
- virtual void Release()
- {
- if (m_pAllocator) {
- FX_DeleteAtAllocator(this, m_pAllocator, CXML_DataStmAcc);
- } else {
- delete this;
- }
- }
- virtual FX_BOOL IsEOF()
- {
- return m_nStart + (FX_FILESIZE)m_dwSize >= m_pFileRead->GetSize();
- }
- virtual FX_FILESIZE GetPosition()
- {
- return m_nStart + (FX_FILESIZE)m_dwSize;
- }
- virtual size_t ReadBlock(void* buffer, size_t size)
- {
- return 0;
- }
- virtual FX_BOOL ReadNextBlock(FX_BOOL bRestart = FALSE)
- {
- if (bRestart) {
- m_nStart = 0;
- }
- FX_FILESIZE nLength = m_pFileRead->GetSize();
- m_nStart += (FX_FILESIZE)m_dwSize;
- if (m_nStart >= nLength) {
- return FALSE;
- }
- m_dwSize = (size_t)FX_MIN(FX_XMLDATASTREAM_BufferSize, nLength - m_nStart);
- if (!m_pBuffer) {
- m_pBuffer = FX_Allocator_Alloc(m_pAllocator, FX_BYTE, m_dwSize);
- if (!m_pBuffer) {
- return FALSE;
- }
- }
- return m_pFileRead->ReadBlock(m_pBuffer, m_nStart, m_dwSize);
- }
- virtual FX_LPCBYTE GetBlockBuffer()
- {
- return (FX_LPCBYTE)m_pBuffer;
- }
- virtual size_t GetBlockSize()
- {
- return m_dwSize;
- }
- virtual FX_FILESIZE GetBlockOffset()
- {
- return m_nStart;
- }
-protected:
- IFX_Allocator* m_pAllocator;
- IFX_FileRead *m_pFileRead;
- FX_LPBYTE m_pBuffer;
- FX_FILESIZE m_nStart;
- size_t m_dwSize;
-};
-class CXML_Parser
-{
-public:
- CXML_Parser(IFX_Allocator* pAllocator = NULL) : m_pAllocator(pAllocator) {}
- ~CXML_Parser();
- IFX_Allocator* m_pAllocator;
- IFX_BufferRead* m_pDataAcc;
- FX_BOOL m_bOwnedStream;
- FX_FILESIZE m_nOffset;
- FX_BOOL m_bSaveSpaceChars;
- FX_LPCBYTE m_pBuffer;
- size_t m_dwBufferSize;
- FX_FILESIZE m_nBufferOffset;
- size_t m_dwIndex;
- FX_BOOL Init(FX_LPBYTE pBuffer, size_t size);
- FX_BOOL Init(IFX_FileRead *pFileRead);
- FX_BOOL Init(IFX_BufferRead *pBuffer);
- FX_BOOL Init(FX_BOOL bOwndedStream);
- FX_BOOL ReadNextBlock();
- FX_BOOL IsEOF();
- FX_BOOL HaveAvailData();
- void SkipWhiteSpaces();
- void GetName(CFX_ByteStringL &space, CFX_ByteStringL &name);
- void GetAttrValue(CFX_WideStringL &value);
- FX_DWORD GetCharRef();
- void GetTagName(CFX_ByteStringL &space, CFX_ByteStringL &name, FX_BOOL &bEndTag, FX_BOOL bStartTag = FALSE);
- void SkipLiterals(FX_BSTR str);
- CXML_Element* ParseElement(CXML_Element* pParent, FX_BOOL bStartTag = FALSE);
- void InsertContentSegment(FX_BOOL bCDATA, FX_WSTR content, CXML_Element* pElement);
- void InsertCDATASegment(CFX_UTF8Decoder& decoder, CXML_Element* pElement);
-};
-void FX_XML_SplitQualifiedName(FX_BSTR bsFullName, CFX_ByteStringC &bsSpace, CFX_ByteStringC &bsName);
-#endif
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FXCRT_XML_INT_
+#define _FXCRT_XML_INT_
+class CXML_DataBufAcc : public IFX_BufferRead, public CFX_Object
+{
+public:
+ CXML_DataBufAcc(FX_LPCBYTE pBuffer, size_t size, IFX_Allocator* pAllocator = NULL)
+ : m_pAllocator(pAllocator)
+ , m_pBuffer(pBuffer)
+ , m_dwSize(size)
+ , m_dwCurPos(0)
+ {
+ }
+ virtual ~CXML_DataBufAcc() {}
+ virtual void Release()
+ {
+ if (m_pAllocator) {
+ FX_DeleteAtAllocator(this, m_pAllocator, CXML_DataBufAcc);
+ } else {
+ delete this;
+ }
+ }
+ virtual FX_BOOL IsEOF()
+ {
+ return m_dwCurPos >= m_dwSize;
+ }
+ virtual FX_FILESIZE GetPosition()
+ {
+ return (FX_FILESIZE)m_dwCurPos;
+ }
+ virtual size_t ReadBlock(void* buffer, size_t size)
+ {
+ return 0;
+ }
+ virtual FX_BOOL ReadNextBlock(FX_BOOL bRestart = FALSE)
+ {
+ if (bRestart) {
+ m_dwCurPos = 0;
+ }
+ if (m_dwCurPos < m_dwSize) {
+ m_dwCurPos = m_dwSize;
+ return TRUE;
+ }
+ return FALSE;
+ }
+ virtual FX_LPCBYTE GetBlockBuffer()
+ {
+ return m_pBuffer;
+ }
+ virtual size_t GetBlockSize()
+ {
+ return m_dwSize;
+ }
+ virtual FX_FILESIZE GetBlockOffset()
+ {
+ return 0;
+ }
+protected:
+ IFX_Allocator* m_pAllocator;
+ FX_LPCBYTE m_pBuffer;
+ size_t m_dwSize;
+ size_t m_dwCurPos;
+};
+#define FX_XMLDATASTREAM_BufferSize (32 * 1024)
+class CXML_DataStmAcc : public IFX_BufferRead, public CFX_Object
+{
+public:
+ CXML_DataStmAcc(IFX_FileRead *pFileRead, IFX_Allocator* pAllocator = NULL)
+ : m_pAllocator(pAllocator)
+ , m_pFileRead(pFileRead)
+ , m_pBuffer(NULL)
+ , m_nStart(0)
+ , m_dwSize(0)
+ {
+ FXSYS_assert(m_pFileRead != NULL);
+ }
+ virtual ~CXML_DataStmAcc()
+ {
+ if (m_pBuffer) {
+ FX_Allocator_Free(m_pAllocator, m_pBuffer);
+ }
+ }
+ virtual void Release()
+ {
+ if (m_pAllocator) {
+ FX_DeleteAtAllocator(this, m_pAllocator, CXML_DataStmAcc);
+ } else {
+ delete this;
+ }
+ }
+ virtual FX_BOOL IsEOF()
+ {
+ return m_nStart + (FX_FILESIZE)m_dwSize >= m_pFileRead->GetSize();
+ }
+ virtual FX_FILESIZE GetPosition()
+ {
+ return m_nStart + (FX_FILESIZE)m_dwSize;
+ }
+ virtual size_t ReadBlock(void* buffer, size_t size)
+ {
+ return 0;
+ }
+ virtual FX_BOOL ReadNextBlock(FX_BOOL bRestart = FALSE)
+ {
+ if (bRestart) {
+ m_nStart = 0;
+ }
+ FX_FILESIZE nLength = m_pFileRead->GetSize();
+ m_nStart += (FX_FILESIZE)m_dwSize;
+ if (m_nStart >= nLength) {
+ return FALSE;
+ }
+ m_dwSize = (size_t)FX_MIN(FX_XMLDATASTREAM_BufferSize, nLength - m_nStart);
+ if (!m_pBuffer) {
+ m_pBuffer = FX_Allocator_Alloc(m_pAllocator, FX_BYTE, m_dwSize);
+ if (!m_pBuffer) {
+ return FALSE;
+ }
+ }
+ return m_pFileRead->ReadBlock(m_pBuffer, m_nStart, m_dwSize);
+ }
+ virtual FX_LPCBYTE GetBlockBuffer()
+ {
+ return (FX_LPCBYTE)m_pBuffer;
+ }
+ virtual size_t GetBlockSize()
+ {
+ return m_dwSize;
+ }
+ virtual FX_FILESIZE GetBlockOffset()
+ {
+ return m_nStart;
+ }
+protected:
+ IFX_Allocator* m_pAllocator;
+ IFX_FileRead *m_pFileRead;
+ FX_LPBYTE m_pBuffer;
+ FX_FILESIZE m_nStart;
+ size_t m_dwSize;
+};
+class CXML_Parser
+{
+public:
+ CXML_Parser(IFX_Allocator* pAllocator = NULL) : m_pAllocator(pAllocator) {}
+ ~CXML_Parser();
+ IFX_Allocator* m_pAllocator;
+ IFX_BufferRead* m_pDataAcc;
+ FX_BOOL m_bOwnedStream;
+ FX_FILESIZE m_nOffset;
+ FX_BOOL m_bSaveSpaceChars;
+ FX_LPCBYTE m_pBuffer;
+ size_t m_dwBufferSize;
+ FX_FILESIZE m_nBufferOffset;
+ size_t m_dwIndex;
+ FX_BOOL Init(FX_LPBYTE pBuffer, size_t size);
+ FX_BOOL Init(IFX_FileRead *pFileRead);
+ FX_BOOL Init(IFX_BufferRead *pBuffer);
+ FX_BOOL Init(FX_BOOL bOwndedStream);
+ FX_BOOL ReadNextBlock();
+ FX_BOOL IsEOF();
+ FX_BOOL HaveAvailData();
+ void SkipWhiteSpaces();
+ void GetName(CFX_ByteStringL &space, CFX_ByteStringL &name);
+ void GetAttrValue(CFX_WideStringL &value);
+ FX_DWORD GetCharRef();
+ void GetTagName(CFX_ByteStringL &space, CFX_ByteStringL &name, FX_BOOL &bEndTag, FX_BOOL bStartTag = FALSE);
+ void SkipLiterals(FX_BSTR str);
+ CXML_Element* ParseElement(CXML_Element* pParent, FX_BOOL bStartTag = FALSE);
+ void InsertContentSegment(FX_BOOL bCDATA, FX_WSTR content, CXML_Element* pElement);
+ void InsertCDATASegment(CFX_UTF8Decoder& decoder, CXML_Element* pElement);
+};
+void FX_XML_SplitQualifiedName(FX_BSTR bsFullName, CFX_ByteStringC &bsSpace, CFX_ByteStringC &bsName);
+#endif
diff --git a/core/src/fxge/Microsoft SDK/include/DWrite.h b/core/src/fxge/Microsoft SDK/include/DWrite.h
index 70f998a437..0374694f74 100644
--- a/core/src/fxge/Microsoft SDK/include/DWrite.h
+++ b/core/src/fxge/Microsoft SDK/include/DWrite.h
@@ -1,5006 +1,5006 @@
-//+--------------------------------------------------------------------------
-//
-// Copyright (c) Microsoft Corporation. All rights reserved.
-//
-// Abstract:
-// DirectX Typography Services public API definitions.
-//
-//----------------------------------------------------------------------------
-
-#ifndef DWRITE_H_INCLUDED
-#define DWRITE_H_INCLUDED
-
-#if _MSC_VER > 1000
-#pragma once
-#endif
-
-#ifndef DWRITE_NO_WINDOWS_H
-
-#include "specstrings.h"
-#include "unknwn.h"
-
-#endif // DWRITE_NO_WINDOWS_H
-
-#include "dcommon.h"
-
-#if _FX_COMPILER_ == _FX_VC6_
-typedef signed char INT8, *PINT8;
-typedef signed short INT16, *PINT16;
-typedef signed int INT32, *PINT32;
-typedef signed __int64 INT64, *PINT64;
-typedef unsigned char UINT8, *PUINT8;
-typedef unsigned short UINT16, *PUINT16;
-typedef unsigned int UINT32, *PUINT32;
-typedef unsigned __int64 UINT64, *PUINT64;
-#endif
-
-#ifndef DWRITE_DECLARE_INTERFACE
-#define DWRITE_DECLARE_INTERFACE(iid) DECLSPEC_UUID(iid) DECLSPEC_NOVTABLE
-#endif
-
-#ifndef DWRITE_EXPORT
-#define DWRITE_EXPORT __declspec(dllimport) WINAPI
-#endif
-
-/// <summary>
-/// The type of a font represented by a single font file.
-/// Font formats that consist of multiple files, e.g. Type 1 .PFM and .PFB, have
-/// separate enum values for each of the file type.
-/// </summary>
-enum DWRITE_FONT_FILE_TYPE
-{
- /// <summary>
- /// Font type is not recognized by the DirectWrite font system.
- /// </summary>
- DWRITE_FONT_FILE_TYPE_UNKNOWN,
-
- /// <summary>
- /// OpenType font with CFF outlines.
- /// </summary>
- DWRITE_FONT_FILE_TYPE_CFF,
-
- /// <summary>
- /// OpenType font with TrueType outlines.
- /// </summary>
- DWRITE_FONT_FILE_TYPE_TRUETYPE,
-
- /// <summary>
- /// OpenType font that contains a TrueType collection.
- /// </summary>
- DWRITE_FONT_FILE_TYPE_TRUETYPE_COLLECTION,
-
- /// <summary>
- /// Type 1 PFM font.
- /// </summary>
- DWRITE_FONT_FILE_TYPE_TYPE1_PFM,
-
- /// <summary>
- /// Type 1 PFB font.
- /// </summary>
- DWRITE_FONT_FILE_TYPE_TYPE1_PFB,
-
- /// <summary>
- /// Vector .FON font.
- /// </summary>
- DWRITE_FONT_FILE_TYPE_VECTOR,
-
- /// <summary>
- /// Bitmap .FON font.
- /// </summary>
- DWRITE_FONT_FILE_TYPE_BITMAP
-};
-
-/// <summary>
-/// The file format of a complete font face.
-/// Font formats that consist of multiple files, e.g. Type 1 .PFM and .PFB, have
-/// a single enum entry.
-/// </summary>
-enum DWRITE_FONT_FACE_TYPE
-{
- /// <summary>
- /// OpenType font face with CFF outlines.
- /// </summary>
- DWRITE_FONT_FACE_TYPE_CFF,
-
- /// <summary>
- /// OpenType font face with TrueType outlines.
- /// </summary>
- DWRITE_FONT_FACE_TYPE_TRUETYPE,
-
- /// <summary>
- /// OpenType font face that is a part of a TrueType collection.
- /// </summary>
- DWRITE_FONT_FACE_TYPE_TRUETYPE_COLLECTION,
-
- /// <summary>
- /// A Type 1 font face.
- /// </summary>
- DWRITE_FONT_FACE_TYPE_TYPE1,
-
- /// <summary>
- /// A vector .FON format font face.
- /// </summary>
- DWRITE_FONT_FACE_TYPE_VECTOR,
-
- /// <summary>
- /// A bitmap .FON format font face.
- /// </summary>
- DWRITE_FONT_FACE_TYPE_BITMAP,
-
- /// <summary>
- /// Font face type is not recognized by the DirectWrite font system.
- /// </summary>
- DWRITE_FONT_FACE_TYPE_UNKNOWN
-};
-
-/// <summary>
-/// Specifies algorithmic style simulations to be applied to the font face.
-/// Bold and oblique simulations can be combined via bitwise OR operation.
-/// </summary>
-enum DWRITE_FONT_SIMULATIONS
-{
- /// <summary>
- /// No simulations are performed.
- /// </summary>
- DWRITE_FONT_SIMULATIONS_NONE = 0x0000,
-
- /// <summary>
- /// Algorithmic emboldening is performed.
- /// </summary>
- DWRITE_FONT_SIMULATIONS_BOLD = 0x0001,
-
- /// <summary>
- /// Algorithmic italicization is performed.
- /// </summary>
- DWRITE_FONT_SIMULATIONS_OBLIQUE = 0x0002
-};
-
-#ifdef DEFINE_ENUM_FLAG_OPERATORS
-DEFINE_ENUM_FLAG_OPERATORS(DWRITE_FONT_SIMULATIONS);
-#endif
-
-/// <summary>
-/// The font weight enumeration describes common values for degree of blackness or thickness of strokes of characters in a font.
-/// Font weight values less than 1 or greater than 999 are considered to be invalid, and they are rejected by font API functions.
-/// </summary>
-enum DWRITE_FONT_WEIGHT
-{
- /// <summary>
- /// Predefined font weight : Thin (100).
- /// </summary>
- DWRITE_FONT_WEIGHT_THIN = 100,
-
- /// <summary>
- /// Predefined font weight : Extra-light (200).
- /// </summary>
- DWRITE_FONT_WEIGHT_EXTRA_LIGHT = 200,
-
- /// <summary>
- /// Predefined font weight : Ultra-light (200).
- /// </summary>
- DWRITE_FONT_WEIGHT_ULTRA_LIGHT = 200,
-
- /// <summary>
- /// Predefined font weight : Light (300).
- /// </summary>
- DWRITE_FONT_WEIGHT_LIGHT = 300,
-
- /// <summary>
- /// Predefined font weight : Normal (400).
- /// </summary>
- DWRITE_FONT_WEIGHT_NORMAL = 400,
-
- /// <summary>
- /// Predefined font weight : Regular (400).
- /// </summary>
- DWRITE_FONT_WEIGHT_REGULAR = 400,
-
- /// <summary>
- /// Predefined font weight : Medium (500).
- /// </summary>
- DWRITE_FONT_WEIGHT_MEDIUM = 500,
-
- /// <summary>
- /// Predefined font weight : Demi-bold (600).
- /// </summary>
- DWRITE_FONT_WEIGHT_DEMI_BOLD = 600,
-
- /// <summary>
- /// Predefined font weight : Semi-bold (600).
- /// </summary>
- DWRITE_FONT_WEIGHT_SEMI_BOLD = 600,
-
- /// <summary>
- /// Predefined font weight : Bold (700).
- /// </summary>
- DWRITE_FONT_WEIGHT_BOLD = 700,
-
- /// <summary>
- /// Predefined font weight : Extra-bold (800).
- /// </summary>
- DWRITE_FONT_WEIGHT_EXTRA_BOLD = 800,
-
- /// <summary>
- /// Predefined font weight : Ultra-bold (800).
- /// </summary>
- DWRITE_FONT_WEIGHT_ULTRA_BOLD = 800,
-
- /// <summary>
- /// Predefined font weight : Black (900).
- /// </summary>
- DWRITE_FONT_WEIGHT_BLACK = 900,
-
- /// <summary>
- /// Predefined font weight : Heavy (900).
- /// </summary>
- DWRITE_FONT_WEIGHT_HEAVY = 900,
-
- /// <summary>
- /// Predefined font weight : Extra-black (950).
- /// </summary>
- DWRITE_FONT_WEIGHT_EXTRA_BLACK = 950,
-
- /// <summary>
- /// Predefined font weight : Ultra-black (950).
- /// </summary>
- DWRITE_FONT_WEIGHT_ULTRA_BLACK = 950
-};
-
-/// <summary>
-/// The font stretch enumeration describes relative change from the normal aspect ratio
-/// as specified by a font designer for the glyphs in a font.
-/// Values less than 1 or greater than 9 are considered to be invalid, and they are rejected by font API functions.
-/// </summary>
-enum DWRITE_FONT_STRETCH
-{
- /// <summary>
- /// Predefined font stretch : Not known (0).
- /// </summary>
- DWRITE_FONT_STRETCH_UNDEFINED = 0,
-
- /// <summary>
- /// Predefined font stretch : Ultra-condensed (1).
- /// </summary>
- DWRITE_FONT_STRETCH_ULTRA_CONDENSED = 1,
-
- /// <summary>
- /// Predefined font stretch : Extra-condensed (2).
- /// </summary>
- DWRITE_FONT_STRETCH_EXTRA_CONDENSED = 2,
-
- /// <summary>
- /// Predefined font stretch : Condensed (3).
- /// </summary>
- DWRITE_FONT_STRETCH_CONDENSED = 3,
-
- /// <summary>
- /// Predefined font stretch : Semi-condensed (4).
- /// </summary>
- DWRITE_FONT_STRETCH_SEMI_CONDENSED = 4,
-
- /// <summary>
- /// Predefined font stretch : Normal (5).
- /// </summary>
- DWRITE_FONT_STRETCH_NORMAL = 5,
-
- /// <summary>
- /// Predefined font stretch : Medium (5).
- /// </summary>
- DWRITE_FONT_STRETCH_MEDIUM = 5,
-
- /// <summary>
- /// Predefined font stretch : Semi-expanded (6).
- /// </summary>
- DWRITE_FONT_STRETCH_SEMI_EXPANDED = 6,
-
- /// <summary>
- /// Predefined font stretch : Expanded (7).
- /// </summary>
- DWRITE_FONT_STRETCH_EXPANDED = 7,
-
- /// <summary>
- /// Predefined font stretch : Extra-expanded (8).
- /// </summary>
- DWRITE_FONT_STRETCH_EXTRA_EXPANDED = 8,
-
- /// <summary>
- /// Predefined font stretch : Ultra-expanded (9).
- /// </summary>
- DWRITE_FONT_STRETCH_ULTRA_EXPANDED = 9
-};
-
-/// <summary>
-/// The font style enumeration describes the slope style of a font face, such as Normal, Italic or Oblique.
-/// Values other than the ones defined in the enumeration are considered to be invalid, and they are rejected by font API functions.
-/// </summary>
-enum DWRITE_FONT_STYLE
-{
- /// <summary>
- /// Font slope style : Normal.
- /// </summary>
- DWRITE_FONT_STYLE_NORMAL,
-
- /// <summary>
- /// Font slope style : Oblique.
- /// </summary>
- DWRITE_FONT_STYLE_OBLIQUE,
-
- /// <summary>
- /// Font slope style : Italic.
- /// </summary>
- DWRITE_FONT_STYLE_ITALIC
-
-};
-
-/// <summary>
-/// The informational string enumeration identifies a string in a font.
-/// </summary>
-enum DWRITE_INFORMATIONAL_STRING_ID
-{
- /// <summary>
- /// Unspecified name ID.
- /// </summary>
- DWRITE_INFORMATIONAL_STRING_NONE,
-
- /// <summary>
- /// Copyright notice provided by the font.
- /// </summary>
- DWRITE_INFORMATIONAL_STRING_COPYRIGHT_NOTICE,
-
- /// <summary>
- /// String containing a version number.
- /// </summary>
- DWRITE_INFORMATIONAL_STRING_VERSION_STRINGS,
-
- /// <summary>
- /// Trademark information provided by the font.
- /// </summary>
- DWRITE_INFORMATIONAL_STRING_TRADEMARK,
-
- /// <summary>
- /// Name of the font manufacturer.
- /// </summary>
- DWRITE_INFORMATIONAL_STRING_MANUFACTURER,
-
- /// <summary>
- /// Name of the font designer.
- /// </summary>
- DWRITE_INFORMATIONAL_STRING_DESIGNER,
-
- /// <summary>
- /// URL of font designer (with protocol, e.g., http://, ftp://).
- /// </summary>
- DWRITE_INFORMATIONAL_STRING_DESIGNER_URL,
-
- /// <summary>
- /// Description of the font. Can contain revision information, usage recommendations, history, features, etc.
- /// </summary>
- DWRITE_INFORMATIONAL_STRING_DESCRIPTION,
-
- /// <summary>
- /// URL of font vendor (with protocol, e.g., http://, ftp://). If a unique serial number is embedded in the URL, it can be used to register the font.
- /// </summary>
- DWRITE_INFORMATIONAL_STRING_FONT_VENDOR_URL,
-
- /// <summary>
- /// Description of how the font may be legally used, or different example scenarios for licensed use. This field should be written in plain language, not legalese.
- /// </summary>
- DWRITE_INFORMATIONAL_STRING_LICENSE_DESCRIPTION,
-
- /// <summary>
- /// URL where additional licensing information can be found.
- /// </summary>
- DWRITE_INFORMATIONAL_STRING_LICENSE_INFO_URL,
-
- /// <summary>
- /// GDI-compatible family name. Because GDI allows a maximum of four fonts per family, fonts in the same family may have different GDI-compatible family names
- /// (e.g., "Arial", "Arial Narrow", "Arial Black").
- /// </summary>
- DWRITE_INFORMATIONAL_STRING_WIN32_FAMILY_NAMES,
-
- /// <summary>
- /// GDI-compatible subfamily name.
- /// </summary>
- DWRITE_INFORMATIONAL_STRING_WIN32_SUBFAMILY_NAMES,
-
- /// <summary>
- /// Family name preferred by the designer. This enables font designers to group more than four fonts in a single family without losing compatibility with
- /// GDI. This name is typically only present if it differs from the GDI-compatible family name.
- /// </summary>
- DWRITE_INFORMATIONAL_STRING_PREFERRED_FAMILY_NAMES,
-
- /// <summary>
- /// Subfamily name preferred by the designer. This name is typically only present if it differs from the GDI-compatible subfamily name.
- /// </summary>
- DWRITE_INFORMATIONAL_STRING_PREFERRED_SUBFAMILY_NAMES,
-
- /// <summary>
- /// Sample text. This can be the font name or any other text that the designer thinks is the best example to display the font in.
- /// </summary>
- DWRITE_INFORMATIONAL_STRING_SAMPLE_TEXT
-};
-
-
-/// <summary>
-/// The DWRITE_FONT_METRICS structure specifies the metrics of a font face that
-/// are applicable to all glyphs within the font face.
-/// </summary>
-struct DWRITE_FONT_METRICS
-{
- /// <summary>
- /// The number of font design units per em unit.
- /// Font files use their own coordinate system of font design units.
- /// A font design unit is the smallest measurable unit in the em square,
- /// an imaginary square that is used to size and align glyphs.
- /// The concept of em square is used as a reference scale factor when defining font size and device transformation semantics.
- /// The size of one em square is also commonly used to compute the paragraph identation value.
- /// </summary>
- UINT16 designUnitsPerEm;
-
- /// <summary>
- /// Ascent value of the font face in font design units.
- /// Ascent is the distance from the top of font character alignment box to English baseline.
- /// </summary>
- UINT16 ascent;
-
- /// <summary>
- /// Descent value of the font face in font design units.
- /// Descent is the distance from the bottom of font character alignment box to English baseline.
- /// </summary>
- UINT16 descent;
-
- /// <summary>
- /// Line gap in font design units.
- /// Recommended additional white space to add between lines to improve legibility. The recommended line spacing
- /// (baseline-to-baseline distance) is thus the sum of ascent, descent, and lineGap. The line gap is usually
- /// positive or zero but can be negative, in which case the recommended line spacing is less than the height
- /// of the character alignment box.
- /// </summary>
- INT16 lineGap;
-
- /// <summary>
- /// Cap height value of the font face in font design units.
- /// Cap height is the distance from English baseline to the top of a typical English capital.
- /// Capital "H" is often used as a reference character for the purpose of calculating the cap height value.
- /// </summary>
- UINT16 capHeight;
-
- /// <summary>
- /// x-height value of the font face in font design units.
- /// x-height is the distance from English baseline to the top of lowercase letter "x", or a similar lowercase character.
- /// </summary>
- UINT16 xHeight;
-
- /// <summary>
- /// The underline position value of the font face in font design units.
- /// Underline position is the position of underline relative to the English baseline.
- /// The value is usually made negative in order to place the underline below the baseline.
- /// </summary>
- INT16 underlinePosition;
-
- /// <summary>
- /// The suggested underline thickness value of the font face in font design units.
- /// </summary>
- UINT16 underlineThickness;
-
- /// <summary>
- /// The strikethrough position value of the font face in font design units.
- /// Strikethrough position is the position of strikethrough relative to the English baseline.
- /// The value is usually made positive in order to place the strikethrough above the baseline.
- /// </summary>
- INT16 strikethroughPosition;
-
- /// <summary>
- /// The suggested strikethrough thickness value of the font face in font design units.
- /// </summary>
- UINT16 strikethroughThickness;
-};
-
-/// <summary>
-/// The DWRITE_GLYPH_METRICS structure specifies the metrics of an individual glyph.
-/// The units depend on how the metrics are obtained.
-/// </summary>
-struct DWRITE_GLYPH_METRICS
-{
- /// <summary>
- /// Specifies the X offset from the glyph origin to the left edge of the black box.
- /// The glyph origin is the current horizontal writing position.
- /// A negative value means the black box extends to the left of the origin (often true for lowercase italic 'f').
- /// </summary>
- INT32 leftSideBearing;
-
- /// <summary>
- /// Specifies the X offset from the origin of the current glyph to the origin of the next glyph when writing horizontally.
- /// </summary>
- UINT32 advanceWidth;
-
- /// <summary>
- /// Specifies the X offset from the right edge of the black box to the origin of the next glyph when writing horizontally.
- /// The value is negative when the right edge of the black box overhangs the layout box.
- /// </summary>
- INT32 rightSideBearing;
-
- /// <summary>
- /// Specifies the vertical offset from the vertical origin to the top of the black box.
- /// Thus, a positive value adds whitespace whereas a negative value means the glyph overhangs the top of the layout box.
- /// </summary>
- INT32 topSideBearing;
-
- /// <summary>
- /// Specifies the Y offset from the vertical origin of the current glyph to the vertical origin of the next glyph when writing vertically.
- /// (Note that the term "origin" by itself denotes the horizontal origin. The vertical origin is different.
- /// Its Y coordinate is specified by verticalOriginY value,
- /// and its X coordinate is half the advanceWidth to the right of the horizontal origin).
- /// </summary>
- UINT32 advanceHeight;
-
- /// <summary>
- /// Specifies the vertical distance from the black box's bottom edge to the advance height.
- /// Positive when the bottom edge of the black box is within the layout box.
- /// Negative when the bottom edge of black box overhangs the layout box.
- /// </summary>
- INT32 bottomSideBearing;
-
- /// <summary>
- /// Specifies the Y coordinate of a glyph's vertical origin, in the font's design coordinate system.
- /// The y coordinate of a glyph's vertical origin is the sum of the glyph's top side bearing
- /// and the top (i.e. yMax) of the glyph's bounding box.
- /// </summary>
- INT32 verticalOriginY;
-};
-
-/// <summary>
-/// Optional adjustment to a glyph's position. An glyph offset changes the position of a glyph without affecting
-/// the pen position. Offsets are in logical, pre-transform units.
-/// </summary>
-struct DWRITE_GLYPH_OFFSET
-{
- /// <summary>
- /// Offset in the advance direction of the run. A positive advance offset moves the glyph to the right
- /// (in pre-transform coordinates) if the run is left-to-right or to the left if the run is right-to-left.
- /// </summary>
- FLOAT advanceOffset;
-
- /// <summary>
- /// Offset in the ascent direction, i.e., the direction ascenders point. A positive ascender offset moves
- /// the glyph up (in pre-transform coordinates).
- /// </summary>
- FLOAT ascenderOffset;
-};
-
-/// <summary>
-/// Specifies the type of DirectWrite factory object.
-/// DirectWrite factory contains internal state such as font loader registration and cached font data.
-/// In most cases it is recommended to use the shared factory object, because it allows multiple components
-/// that use DirectWrite to share internal DirectWrite state and reduce memory usage.
-/// However, there are cases when it is desirable to reduce the impact of a component,
-/// such as a plug-in from an untrusted source, on the rest of the process by sandboxing and isolating it
-/// from the rest of the process components. In such cases, it is recommended to use an isolated factory for the sandboxed
-/// component.
-/// </summary>
-enum DWRITE_FACTORY_TYPE
-{
- /// <summary>
- /// Shared factory allow for re-use of cached font data across multiple in process components.
- /// Such factories also take advantage of cross process font caching components for better performance.
- /// </summary>
- DWRITE_FACTORY_TYPE_SHARED,
-
- /// <summary>
- /// Objects created from the isolated factory do not interact with internal DirectWrite state from other components.
- /// </summary>
- DWRITE_FACTORY_TYPE_ISOLATED
-};
-
-// Creates an OpenType tag as a 32bit integer such that
-// the first character in the tag is the lowest byte,
-// (least significant on little endian architectures)
-// which can be used to compare with tags in the font file.
-// This macro is compatible with DWRITE_FONT_FEATURE_TAG.
-//
-// Example: DWRITE_MAKE_OPENTYPE_TAG('c','c','m','p')
-// Dword: 0x706D6363
-//
-#define DWRITE_MAKE_OPENTYPE_TAG(a,b,c,d) ( \
- (static_cast<UINT32>(static_cast<UINT8>(d)) << 24) | \
- (static_cast<UINT32>(static_cast<UINT8>(c)) << 16) | \
- (static_cast<UINT32>(static_cast<UINT8>(b)) << 8) | \
- static_cast<UINT32>(static_cast<UINT8>(a)))
-
-interface IDWriteFontFileStream;
-
-/// <summary>
-/// Font file loader interface handles loading font file resources of a particular type from a key.
-/// The font file loader interface is recommended to be implemented by a singleton object.
-/// IMPORTANT: font file loader implementations must not register themselves with DirectWrite factory
-/// inside their constructors and must not unregister themselves in their destructors, because
-/// registration and unregistraton operations increment and decrement the object reference count respectively.
-/// Instead, registration and unregistration of font file loaders with DirectWrite factory should be performed
-/// outside of the font file loader implementation as a separate step.
-/// </summary>
-interface DWRITE_DECLARE_INTERFACE("727cad4e-d6af-4c9e-8a08-d695b11caa49") IDWriteFontFileLoader : public IUnknown
-{
- /// <summary>
- /// Creates a font file stream object that encapsulates an open file resource.
- /// The resource is closed when the last reference to fontFileStream is released.
- /// </summary>
- /// <param name="fontFileReferenceKey">Font file reference key that uniquely identifies the font file resource
- /// within the scope of the font loader being used.</param>
- /// <param name="fontFileReferenceKeySize">Size of font file reference key in bytes.</param>
- /// <param name="fontFileStream">Pointer to the newly created font file stream.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(CreateStreamFromKey)(
- __in_bcount(fontFileReferenceKeySize) void const* fontFileReferenceKey,
- UINT32 fontFileReferenceKeySize,
- __out IDWriteFontFileStream** fontFileStream
- ) PURE;
-};
-
-/// <summary>
-/// A built-in implementation of IDWriteFontFileLoader interface that operates on local font files
-/// and exposes local font file information from the font file reference key.
-/// Font file references created using CreateFontFileReference use this font file loader.
-/// </summary>
-interface DWRITE_DECLARE_INTERFACE("b2d9f3ec-c9fe-4a11-a2ec-d86208f7c0a2") IDWriteLocalFontFileLoader : public IDWriteFontFileLoader
-{
- /// <summary>
- /// Obtains the length of the absolute file path from the font file reference key.
- /// </summary>
- /// <param name="fontFileReferenceKey">Font file reference key that uniquely identifies the local font file
- /// within the scope of the font loader being used.</param>
- /// <param name="fontFileReferenceKeySize">Size of font file reference key in bytes.</param>
- /// <param name="filePathLength">Length of the file path string not including the terminated NULL character.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(GetFilePathLengthFromKey)(
- __in_bcount(fontFileReferenceKeySize) void const* fontFileReferenceKey,
- UINT32 fontFileReferenceKeySize,
- __out UINT32* filePathLength
- ) PURE;
-
- /// <summary>
- /// Obtains the absolute font file path from the font file reference key.
- /// </summary>
- /// <param name="fontFileReferenceKey">Font file reference key that uniquely identifies the local font file
- /// within the scope of the font loader being used.</param>
- /// <param name="fontFileReferenceKeySize">Size of font file reference key in bytes.</param>
- /// <param name="filePath">Character array that receives the local file path.</param>
- /// <param name="filePathSize">Size of the filePath array in character count including the terminated NULL character.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(GetFilePathFromKey)(
- __in_bcount(fontFileReferenceKeySize) void const* fontFileReferenceKey,
- UINT32 fontFileReferenceKeySize,
- __out_ecount_z(filePathSize) WCHAR* filePath,
- UINT32 filePathSize
- ) PURE;
-
- /// <summary>
- /// Obtains the last write time of the file from the font file reference key.
- /// </summary>
- /// <param name="fontFileReferenceKey">Font file reference key that uniquely identifies the local font file
- /// within the scope of the font loader being used.</param>
- /// <param name="fontFileReferenceKeySize">Size of font file reference key in bytes.</param>
- /// <param name="lastWriteTime">Last modified time of the font file.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(GetLastWriteTimeFromKey)(
- __in_bcount(fontFileReferenceKeySize) void const* fontFileReferenceKey,
- UINT32 fontFileReferenceKeySize,
- __out FILETIME* lastWriteTime
- ) PURE;
-};
-
-/// <summary>
-/// The interface for loading font file data.
-/// </summary>
-interface DWRITE_DECLARE_INTERFACE("6d4865fe-0ab8-4d91-8f62-5dd6be34a3e0") IDWriteFontFileStream : public IUnknown
-{
- /// <summary>
- /// Reads a fragment from a file.
- /// </summary>
- /// <param name="fragmentStart">Receives the pointer to the start of the font file fragment.</param>
- /// <param name="fileOffset">Offset of the fragment from the beginning of the font file.</param>
- /// <param name="fragmentSize">Size of the fragment in bytes.</param>
- /// <param name="fragmentContext">The client defined context to be passed to the ReleaseFileFragment.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- /// <remarks>
- /// IMPORTANT: ReadFileFragment() implementations must check whether the requested file fragment
- /// is within the file bounds. Otherwise, an error should be returned from ReadFileFragment.
- /// </remarks>
- STDMETHOD(ReadFileFragment)(
- __deref_out_bcount(fragmentSize) void const** fragmentStart,
- UINT64 fileOffset,
- UINT64 fragmentSize,
- __out void** fragmentContext
- ) PURE;
-
- /// <summary>
- /// Releases a fragment from a file.
- /// </summary>
- /// <param name="fragmentContext">The client defined context of a font fragment returned from ReadFileFragment.</param>
- STDMETHOD_(void, ReleaseFileFragment)(
- void* fragmentContext
- ) PURE;
-
- /// <summary>
- /// Obtains the total size of a file.
- /// </summary>
- /// <param name="fileSize">Receives the total size of the file.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- /// <remarks>
- /// Implementing GetFileSize() for asynchronously loaded font files may require
- /// downloading the complete file contents, therefore this method should only be used for operations that
- /// either require complete font file to be loaded (e.g., copying a font file) or need to make
- /// decisions based on the value of the file size (e.g., validation against a persisted file size).
- /// </remarks>
- STDMETHOD(GetFileSize)(
- __out UINT64* fileSize
- ) PURE;
-
- /// <summary>
- /// Obtains the last modified time of the file. The last modified time is used by DirectWrite font selection algorithms
- /// to determine whether one font resource is more up to date than another one.
- /// </summary>
- /// <param name="lastWriteTime">Receives the last modifed time of the file in the format that represents
- /// the number of 100-nanosecond intervals since January 1, 1601 (UTC).</param>
- /// <returns>
- /// Standard HRESULT error code. For resources that don't have a concept of the last modified time, the implementation of
- /// GetLastWriteTime should return E_NOTIMPL.
- /// </returns>
- STDMETHOD(GetLastWriteTime)(
- __out UINT64* lastWriteTime
- ) PURE;
-};
-
-/// <summary>
-/// The interface that represents a reference to a font file.
-/// </summary>
-interface DWRITE_DECLARE_INTERFACE("739d886a-cef5-47dc-8769-1a8b41bebbb0") IDWriteFontFile : public IUnknown
-{
- /// <summary>
- /// This method obtains the pointer to the reference key of a font file. The pointer is only valid until the object that refers to it is released.
- /// </summary>
- /// <param name="fontFileReferenceKey">Pointer to the font file reference key.
- /// IMPORTANT: The pointer value is valid until the font file reference object it is obtained from is released.</param>
- /// <param name="fontFileReferenceKeySize">Size of font file reference key in bytes.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(GetReferenceKey)(
- __deref_out_bcount(*fontFileReferenceKeySize) void const** fontFileReferenceKey,
- __out UINT32* fontFileReferenceKeySize
- ) PURE;
-
- /// <summary>
- /// Obtains the file loader associated with a font file object.
- /// </summary>
- /// <param name="fontFileLoader">The font file loader associated with the font file object.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(GetLoader)(
- __out IDWriteFontFileLoader** fontFileLoader
- ) PURE;
-
- /// <summary>
- /// Analyzes a file and returns whether it represents a font, and whether the font type is supported by the font system.
- /// </summary>
- /// <param name="isSupportedFontType">TRUE if the font type is supported by the font system, FALSE otherwise.</param>
- /// <param name="fontFileType">The type of the font file. Note that even if isSupportedFontType is FALSE,
- /// the fontFileType value may be different from DWRITE_FONT_FILE_TYPE_UNKNOWN.</param>
- /// <param name="fontFaceType">The type of the font face that can be constructed from the font file.
- /// Note that even if isSupportedFontType is FALSE, the fontFaceType value may be different from
- /// DWRITE_FONT_FACE_TYPE_UNKNOWN.</param>
- /// <param name="numberOfFaces">Number of font faces contained in the font file.</param>
- /// <returns>
- /// Standard HRESULT error code if there was a processing error during analysis.
- /// </returns>
- /// <remarks>
- /// IMPORTANT: certain font file types are recognized, but not supported by the font system.
- /// For example, the font system will recognize a file as a Type 1 font file,
- /// but will not be able to construct a font face object from it. In such situations, Analyze will set
- /// isSupportedFontType output parameter to FALSE.
- /// </remarks>
- STDMETHOD(Analyze)(
- __out BOOL* isSupportedFontType,
- __out DWRITE_FONT_FILE_TYPE* fontFileType,
- __out_opt DWRITE_FONT_FACE_TYPE* fontFaceType,
- __out UINT32* numberOfFaces
- ) PURE;
-};
-
-/// <summary>
-/// Represents the internal structure of a device pixel (i.e., the physical arrangement of red,
-/// green, and blue color components) that is assumed for purposes of rendering text.
-/// </summary>
-#ifndef DWRITE_PIXEL_GEOMETRY_DEFINED
-enum DWRITE_PIXEL_GEOMETRY
-{
- /// <summary>
- /// The red, green, and blue color components of each pixel are assumed to occupy the same point.
- /// </summary>
- DWRITE_PIXEL_GEOMETRY_FLAT,
-
- /// <summary>
- /// Each pixel comprises three vertical stripes, with red on the left, green in the center, and
- /// blue on the right. This is the most common pixel geometry for LCD monitors.
- /// </summary>
- DWRITE_PIXEL_GEOMETRY_RGB,
-
- /// <summary>
- /// Each pixel comprises three vertical stripes, with blue on the left, green in the center, and
- /// red on the right.
- /// </summary>
- DWRITE_PIXEL_GEOMETRY_BGR
-};
-#define DWRITE_PIXEL_GEOMETRY_DEFINED
-#endif
-
-/// <summary>
-/// Represents a method of rendering glyphs.
-/// </summary>
-enum DWRITE_RENDERING_MODE
-{
- /// <summary>
- /// Specifies that the rendering mode is determined automatically based on the font and size.
- /// </summary>
- DWRITE_RENDERING_MODE_DEFAULT,
-
- /// <summary>
- /// Specifies that no anti-aliasing is performed. Each pixel is either set to the foreground
- /// color of the text or retains the color of the background.
- /// </summary>
- DWRITE_RENDERING_MODE_ALIASED,
-
- /// <summary>
- /// Specifies ClearType rendering with the same metrics as aliased text. Glyphs can only
- /// be positioned on whole-pixel boundaries.
- /// </summary>
- DWRITE_RENDERING_MODE_CLEARTYPE_GDI_CLASSIC,
-
- /// <summary>
- /// Specifies ClearType rendering with the same metrics as text rendering using GDI using a font
- /// created with CLEARTYPE_NATURAL_QUALITY. Glyph metrics are closer to their ideal values than
- /// with aliased text, but glyphs are still positioned on whole-pixel boundaries.
- /// </summary>
- DWRITE_RENDERING_MODE_CLEARTYPE_GDI_NATURAL,
-
- /// <summary>
- /// Specifies ClearType rendering with anti-aliasing in the horizontal dimension only. This is
- /// typically used with small to medium font sizes (up to 16 ppem).
- /// </summary>
- DWRITE_RENDERING_MODE_CLEARTYPE_NATURAL,
-
- /// <summary>
- /// Specifies ClearType rendering with anti-aliasing in both horizontal and vertical dimensions.
- /// This is typically used at larger sizes to makes curves and diagonal lines look smoother, at
- /// the expense of some softness.
- /// </summary>
- DWRITE_RENDERING_MODE_CLEARTYPE_NATURAL_SYMMETRIC,
-
- /// <summary>
- /// Specifies that rendering should bypass the rasterizer and use the outlines directly. This is
- /// typically used at very large sizes.
- /// </summary>
- DWRITE_RENDERING_MODE_OUTLINE
-};
-
-/// <summary>
-/// The DWRITE_MATRIX structure specifies the graphics transform to be applied
-/// to rendered glyphs.
-/// </summary>
-struct DWRITE_MATRIX
-{
- /// <summary>
- /// Horizontal scaling / cosine of rotation
- /// </summary>
- FLOAT m11;
-
- /// <summary>
- /// Vertical shear / sine of rotation
- /// </summary>
- FLOAT m12;
-
- /// <summary>
- /// Horizontal shear / negative sine of rotation
- /// </summary>
- FLOAT m21;
-
- /// <summary>
- /// Vertical scaling / cosine of rotation
- /// </summary>
- FLOAT m22;
-
- /// <summary>
- /// Horizontal shift (always orthogonal regardless of rotation)
- /// </summary>
- FLOAT dx;
-
- /// <summary>
- /// Vertical shift (always orthogonal regardless of rotation)
- /// </summary>
- FLOAT dy;
-};
-
-/// <summary>
-/// The interface that represents text rendering settings for glyph rasterization and filtering.
-/// </summary>
-interface DWRITE_DECLARE_INTERFACE("2f0da53a-2add-47cd-82ee-d9ec34688e75") IDWriteRenderingParams : public IUnknown
-{
- /// <summary>
- /// Gets the gamma value used for gamma correction. Valid values must be
- /// greater than zero and cannot exceed 256.
- /// </summary>
- STDMETHOD_(FLOAT, GetGamma)() PURE;
-
- /// <summary>
- /// Gets the amount of contrast enhancement. Valid values are greater than
- /// or equal to zero.
- /// </summary>
- STDMETHOD_(FLOAT, GetEnhancedContrast)() PURE;
-
- /// <summary>
- /// Gets the ClearType level. Valid values range from 0.0f (no ClearType)
- /// to 1.0f (full ClearType).
- /// </summary>
- STDMETHOD_(FLOAT, GetClearTypeLevel)() PURE;
-
- /// <summary>
- /// Gets the pixel geometry.
- /// </summary>
- STDMETHOD_(DWRITE_PIXEL_GEOMETRY, GetPixelGeometry)() PURE;
-
- /// <summary>
- /// Gets the rendering mode.
- /// </summary>
- STDMETHOD_(DWRITE_RENDERING_MODE, GetRenderingMode)() PURE;
-};
-
-// Forward declarations of D2D types
-interface ID2D1SimplifiedGeometrySink;
-
-typedef ID2D1SimplifiedGeometrySink IDWriteGeometrySink;
-
-/// <summary>
-/// The interface that represents an absolute reference to a font face.
-/// It contains font face type, appropriate file references and face identification data.
-/// Various font data such as metrics, names and glyph outlines is obtained from IDWriteFontFace.
-/// </summary>
-interface DWRITE_DECLARE_INTERFACE("5f49804d-7024-4d43-bfa9-d25984f53849") IDWriteFontFace : public IUnknown
-{
- /// <summary>
- /// Obtains the file format type of a font face.
- /// </summary>
- STDMETHOD_(DWRITE_FONT_FACE_TYPE, GetType)() PURE;
-
- /// <summary>
- /// Obtains the font files representing a font face.
- /// </summary>
- /// <param name="numberOfFiles">The number of files representing the font face.</param>
- /// <param name="fontFiles">User provided array that stores pointers to font files representing the font face.
- /// This parameter can be NULL if the user is only interested in the number of files representing the font face.
- /// This API increments reference count of the font file pointers returned according to COM conventions, and the client
- /// should release them when finished.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(GetFiles)(
- __inout UINT32* numberOfFiles,
- __out_ecount_opt(*numberOfFiles) IDWriteFontFile** fontFiles
- ) PURE;
-
- /// <summary>
- /// Obtains the zero-based index of the font face in its font file or files. If the font files contain a single face,
- /// the return value is zero.
- /// </summary>
- STDMETHOD_(UINT32, GetIndex)() PURE;
-
- /// <summary>
- /// Obtains the algorithmic style simulation flags of a font face.
- /// </summary>
- STDMETHOD_(DWRITE_FONT_SIMULATIONS, GetSimulations)() PURE;
-
- /// <summary>
- /// Determines whether the font is a symbol font.
- /// </summary>
- STDMETHOD_(BOOL, IsSymbolFont)() PURE;
-
- /// <summary>
- /// Obtains design units and common metrics for the font face.
- /// These metrics are applicable to all the glyphs within a fontface and are used by applications for layout calculations.
- /// </summary>
- /// <param name="fontFaceMetrics">Points to a DWRITE_FONT_METRICS structure to fill in.
- /// The metrics returned by this function are in font design units.</param>
- STDMETHOD_(void, GetMetrics)(
- __out DWRITE_FONT_METRICS* fontFaceMetrics
- ) PURE;
-
- /// <summary>
- /// Obtains the number of glyphs in the font face.
- /// </summary>
- STDMETHOD_(UINT16, GetGlyphCount)() PURE;
-
- /// <summary>
- /// Obtains ideal glyph metrics in font design units. Design glyphs metrics are used for glyph positioning.
- /// </summary>
- /// <param name="glyphIndices">An array of glyph indices to compute the metrics for.</param>
- /// <param name="glyphCount">The number of elements in the glyphIndices array.</param>
- /// <param name="glyphMetrics">Array of DWRITE_GLYPH_METRICS structures filled by this function.
- /// The metrics returned by this function are in font design units.</param>
- /// <param name="isSideways">Indicates whether the font is being used in a sideways run.
- /// This can affect the glyph metrics if the font has oblique simulation
- /// because sideways oblique simulation differs from non-sideways oblique simulation.</param>
- /// <returns>
- /// Standard HRESULT error code. If any of the input glyph indices are outside of the valid glyph index range
- /// for the current font face, E_INVALIDARG will be returned.
- /// </returns>
- STDMETHOD(GetDesignGlyphMetrics)(
- __in_ecount(glyphCount) UINT16 const* glyphIndices,
- UINT32 glyphCount,
- __out_ecount(glyphCount) DWRITE_GLYPH_METRICS* glyphMetrics,
- BOOL isSideways = FALSE
- ) PURE;
-
- /// <summary>
- /// Returns the nominal mapping of UCS4 Unicode code points to glyph indices as defined by the font 'CMAP' table.
- /// Note that this mapping is primarily provided for line layout engines built on top of the physical font API.
- /// Because of OpenType glyph substitution and line layout character substitution, the nominal conversion does not always correspond
- /// to how a Unicode string will map to glyph indices when rendering using a particular font face.
- /// Also, note that Unicode Variant Selectors provide for alternate mappings for character to glyph.
- /// This call will always return the default variant.
- /// </summary>
- /// <param name="codePoints">An array of USC4 code points to obtain nominal glyph indices from.</param>
- /// <param name="codePointCount">The number of elements in the codePoints array.</param>
- /// <param name="glyphIndices">Array of nominal glyph indices filled by this function.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(GetGlyphIndices)(
- __in_ecount(codePointCount) UINT32 const* codePoints,
- UINT32 codePointCount,
- __out_ecount(codePointCount) UINT16* glyphIndices
- ) PURE;
-
- /// <summary>
- /// Finds the specified OpenType font table if it exists and returns a pointer to it.
- /// The function accesses the underling font data via the IDWriteFontStream interface
- /// implemented by the font file loader.
- /// </summary>
- /// <param name="openTypeTableTag">Four character tag of table to find.
- /// Use the DWRITE_MAKE_OPENTYPE_TAG() macro to create it.
- /// Unlike GDI, it does not support the special TTCF and null tags to access the whole font.</param>
- /// <param name="tableData">
- /// Pointer to base of table in memory.
- /// The pointer is only valid so long as the FontFace used to get the font table still exists
- /// (not any other FontFace, even if it actually refers to the same physical font).
- /// </param>
- /// <param name="tableSize">Byte size of table.</param>
- /// <param name="tableContext">
- /// Opaque context which must be freed by calling ReleaseFontTable.
- /// The context actually comes from the lower level IDWriteFontFileStream,
- /// which may be implemented by the application or DWrite itself.
- /// It is possible for a NULL tableContext to be returned, especially if
- /// the implementation directly memory maps the whole file.
- /// Nevertheless, always release it later, and do not use it as a test for function success.
- /// The same table can be queried multiple times,
- /// but each returned context can be different, so release each separately.
- /// </param>
- /// <param name="exists">True if table exists.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// If a table can not be found, the function will not return an error, but the size will be 0, table NULL, and exists = FALSE.
- /// The context does not need to be freed if the table was not found.
- /// </returns>
- /// <remarks>
- /// The context for the same tag may be different for each call,
- /// so each one must be held and released separately.
- /// </remarks>
- STDMETHOD(TryGetFontTable)(
- __in UINT32 openTypeTableTag,
- __deref_out_bcount(*tableSize) const void** tableData,
- __out UINT32* tableSize,
- __out void** tableContext,
- __out BOOL* exists
- ) PURE;
-
- /// <summary>
- /// Releases the table obtained earlier from TryGetFontTable.
- /// </summary>
- /// <param name="tableContext">Opaque context from TryGetFontTable.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD_(void, ReleaseFontTable)(
- __in void* tableContext
- ) PURE;
-
- /// <summary>
- /// Computes the outline of a run of glyphs by calling back to the outline sink interface.
- /// </summary>
- /// <param name="emSize">Logical size of the font in DIP units. A DIP ("device-independent pixel") equals 1/96 inch.</param>
- /// <param name="glyphIndices">Array of glyph indices.</param>
- /// <param name="glyphAdvances">Optional array of glyph advances in DIPs.</param>
- /// <param name="glyphOffsets">Optional array of glyph offsets.</param>
- /// <param name="glyphCount">Number of glyphs.</param>
- /// <param name="isSideways">If true, specifies that glyphs are rotated 90 degrees to the left and vertical metrics are used.
- /// A client can render a vertical run by specifying isSideways = true and rotating the resulting geometry 90 degrees to the
- /// right using a transform. The isSideways and isRightToLeft parameters cannot both be true.</param>
- /// <param name="isRightToLeft">If true, specifies that the advance direction is right to left. By default, the advance direction
- /// is left to right.</param>
- /// <param name="geometrySink">Interface the function calls back to draw each element of the geometry.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(GetGlyphRunOutline)(
- FLOAT emSize,
- __in_ecount(glyphCount) UINT16 const* glyphIndices,
- __in_ecount_opt(glyphCount) FLOAT const* glyphAdvances,
- __in_ecount_opt(glyphCount) DWRITE_GLYPH_OFFSET const* glyphOffsets,
- UINT32 glyphCount,
- BOOL isSideways,
- BOOL isRightToLeft,
- IDWriteGeometrySink* geometrySink
- ) PURE;
-
- /// <summary>
- /// Determines the recommended rendering mode for the font given the specified size and rendering parameters.
- /// </summary>
- /// <param name="emSize">Logical size of the font in DIP units. A DIP ("device-independent pixel") equals 1/96 inch.</param>
- /// <param name="pixelsPerDip">Number of physical pixels per DIP. For example, if the DPI of the rendering surface is 96 this
- /// value is 1.0f. If the DPI is 120, this value is 120.0f/96.</param>
- /// <param name="measuringMode">Specifies measuring method that will be used for glyphs in the font.
- /// Renderer implementations may choose different rendering modes for given measuring methods, but
- /// best results are seen when the corresponding modes match:
- /// DWRITE_RENDERING_MODE_CLEARTYPE_NATURAL for DWRITE_MEASURING_MODE_NATURAL
- /// DWRITE_RENDERING_MODE_CLEARTYPE_GDI_CLASSIC for DWRITE_MEASURING_MODE_GDI_CLASSIC
- /// DWRITE_RENDERING_MODE_CLEARTYPE_GDI_NATURAL for DWRITE_MEASURING_MODE_GDI_NATURAL
- /// </param>
- /// <param name="renderingParams">Rendering parameters object. This parameter is necessary in case the rendering parameters
- /// object overrides the rendering mode.</param>
- /// <param name="renderingMode">Receives the recommended rendering mode to use.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(GetRecommendedRenderingMode)(
- FLOAT emSize,
- FLOAT pixelsPerDip,
- DWRITE_MEASURING_MODE measuringMode,
- IDWriteRenderingParams* renderingParams,
- __out DWRITE_RENDERING_MODE* renderingMode
- ) PURE;
-
- /// <summary>
- /// Obtains design units and common metrics for the font face.
- /// These metrics are applicable to all the glyphs within a fontface and are used by applications for layout calculations.
- /// </summary>
- /// <param name="emSize">Logical size of the font in DIP units. A DIP ("device-independent pixel") equals 1/96 inch.</param>
- /// <param name="pixelsPerDip">Number of physical pixels per DIP. For example, if the DPI of the rendering surface is 96 this
- /// value is 1.0f. If the DPI is 120, this value is 120.0f/96.</param>
- /// <param name="transform">Optional transform applied to the glyphs and their positions. This transform is applied after the
- /// scaling specified by the font size and pixelsPerDip.</param>
- /// <param name="fontFaceMetrics">Points to a DWRITE_FONT_METRICS structure to fill in.
- /// The metrics returned by this function are in font design units.</param>
- STDMETHOD(GetGdiCompatibleMetrics)(
- FLOAT emSize,
- FLOAT pixelsPerDip,
- __in_opt DWRITE_MATRIX const* transform,
- __out DWRITE_FONT_METRICS* fontFaceMetrics
- ) PURE;
-
-
- /// <summary>
- /// Obtains glyph metrics in font design units with the return values compatible with what GDI would produce.
- /// Glyphs metrics are used for positioning of individual glyphs.
- /// </summary>
- /// <param name="emSize">Logical size of the font in DIP units. A DIP ("device-independent pixel") equals 1/96 inch.</param>
- /// <param name="pixelsPerDip">Number of physical pixels per DIP. For example, if the DPI of the rendering surface is 96 this
- /// value is 1.0f. If the DPI is 120, this value is 120.0f/96.</param>
- /// <param name="transform">Optional transform applied to the glyphs and their positions. This transform is applied after the
- /// scaling specified by the font size and pixelsPerDip.</param>
- /// <param name="useGdiNatural">
- /// When set to FALSE, the metrics are the same as the metrics of GDI aliased text.
- /// When set to TRUE, the metrics are the same as the metrics of text measured by GDI using a font
- /// created with CLEARTYPE_NATURAL_QUALITY.
- /// </param>
- /// <param name="glyphIndices">An array of glyph indices to compute the metrics for.</param>
- /// <param name="glyphCount">The number of elements in the glyphIndices array.</param>
- /// <param name="glyphMetrics">Array of DWRITE_GLYPH_METRICS structures filled by this function.
- /// The metrics returned by this function are in font design units.</param>
- /// <param name="isSideways">Indicates whether the font is being used in a sideways run.
- /// This can affect the glyph metrics if the font has oblique simulation
- /// because sideways oblique simulation differs from non-sideways oblique simulation.</param>
- /// <returns>
- /// Standard HRESULT error code. If any of the input glyph indices are outside of the valid glyph index range
- /// for the current font face, E_INVALIDARG will be returned.
- /// </returns>
- STDMETHOD(GetGdiCompatibleGlyphMetrics)(
- FLOAT emSize,
- FLOAT pixelsPerDip,
- __in_opt DWRITE_MATRIX const* transform,
- BOOL useGdiNatural,
- __in_ecount(glyphCount) UINT16 const* glyphIndices,
- UINT32 glyphCount,
- __out_ecount(glyphCount) DWRITE_GLYPH_METRICS* glyphMetrics,
- BOOL isSideways = FALSE
- ) PURE;
-};
-
-interface IDWriteFactory;
-interface IDWriteFontFileEnumerator;
-
-/// <summary>
-/// The font collection loader interface is used to construct a collection of fonts given a particular type of key.
-/// The font collection loader interface is recommended to be implemented by a singleton object.
-/// IMPORTANT: font collection loader implementations must not register themselves with a DirectWrite factory
-/// inside their constructors and must not unregister themselves in their destructors, because
-/// registration and unregistraton operations increment and decrement the object reference count respectively.
-/// Instead, registration and unregistration of font file loaders with DirectWrite factory should be performed
-/// outside of the font file loader implementation as a separate step.
-/// </summary>
-interface DWRITE_DECLARE_INTERFACE("cca920e4-52f0-492b-bfa8-29c72ee0a468") IDWriteFontCollectionLoader : public IUnknown
-{
- /// <summary>
- /// Creates a font file enumerator object that encapsulates a collection of font files.
- /// The font system calls back to this interface to create a font collection.
- /// </summary>
- /// <param name="factory">Factory associated with the loader.</param>
- /// <param name="collectionKey">Font collection key that uniquely identifies the collection of font files within
- /// the scope of the font collection loader being used.</param>
- /// <param name="collectionKeySize">Size of the font collection key in bytes.</param>
- /// <param name="fontFileEnumerator">Pointer to the newly created font file enumerator.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(CreateEnumeratorFromKey)(
- IDWriteFactory* factory,
- __in_bcount(collectionKeySize) void const* collectionKey,
- UINT32 collectionKeySize,
- __out IDWriteFontFileEnumerator** fontFileEnumerator
- ) PURE;
-};
-
-/// <summary>
-/// The font file enumerator interface encapsulates a collection of font files. The font system uses this interface
-/// to enumerate font files when building a font collection.
-/// </summary>
-interface DWRITE_DECLARE_INTERFACE("72755049-5ff7-435d-8348-4be97cfa6c7c") IDWriteFontFileEnumerator : public IUnknown
-{
- /// <summary>
- /// Advances to the next font file in the collection. When it is first created, the enumerator is positioned
- /// before the first element of the collection and the first call to MoveNext advances to the first file.
- /// </summary>
- /// <param name="hasCurrentFile">Receives the value TRUE if the enumerator advances to a file, or FALSE if
- /// the enumerator advanced past the last file in the collection.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(MoveNext)(
- __out BOOL* hasCurrentFile
- ) PURE;
-
- /// <summary>
- /// Gets a reference to the current font file.
- /// </summary>
- /// <param name="fontFile">Pointer to the newly created font file object.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(GetCurrentFontFile)(
- __out IDWriteFontFile** fontFile
- ) PURE;
-};
-
-/// <summary>
-/// Represents a collection of strings indexed by locale name.
-/// </summary>
-interface DWRITE_DECLARE_INTERFACE("08256209-099a-4b34-b86d-c22b110e7771") IDWriteLocalizedStrings : public IUnknown
-{
- /// <summary>
- /// Gets the number of language/string pairs.
- /// </summary>
- STDMETHOD_(UINT32, GetCount)() PURE;
-
- /// <summary>
- /// Gets the index of the item with the specified locale name.
- /// </summary>
- /// <param name="localeName">Locale name to look for.</param>
- /// <param name="index">Receives the zero-based index of the locale name/string pair.</param>
- /// <param name="exists">Receives TRUE if the locale name exists or FALSE if not.</param>
- /// <returns>
- /// Standard HRESULT error code. If the specified locale name does not exist, the return value is S_OK,
- /// but *index is UINT_MAX and *exists is FALSE.
- /// </returns>
- STDMETHOD(FindLocaleName)(
- __in_z WCHAR const* localeName,
- __out UINT32* index,
- __out BOOL* exists
- ) PURE;
-
- /// <summary>
- /// Gets the length in characters (not including the null terminator) of the locale name with the specified index.
- /// </summary>
- /// <param name="index">Zero-based index of the locale name.</param>
- /// <param name="length">Receives the length in characters, not including the null terminator.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(GetLocaleNameLength)(
- UINT32 index,
- __out UINT32* length
- ) PURE;
-
- /// <summary>
- /// Copies the locale name with the specified index to the specified array.
- /// </summary>
- /// <param name="index">Zero-based index of the locale name.</param>
- /// <param name="localeName">Character array that receives the locale name.</param>
- /// <param name="size">Size of the array in characters. The size must include space for the terminating
- /// null character.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(GetLocaleName)(
- UINT32 index,
- __out_ecount_z(size) WCHAR* localeName,
- UINT32 size
- ) PURE;
-
- /// <summary>
- /// Gets the length in characters (not including the null terminator) of the string with the specified index.
- /// </summary>
- /// <param name="index">Zero-based index of the string.</param>
- /// <param name="length">Receives the length in characters, not including the null terminator.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(GetStringLength)(
- UINT32 index,
- __out UINT32* length
- ) PURE;
-
- /// <summary>
- /// Copies the string with the specified index to the specified array.
- /// </summary>
- /// <param name="index">Zero-based index of the string.</param>
- /// <param name="stringBuffer">Character array that receives the string.</param>
- /// <param name="size">Size of the array in characters. The size must include space for the terminating
- /// null character.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(GetString)(
- UINT32 index,
- __out_ecount_z(size) WCHAR* stringBuffer,
- UINT32 size
- ) PURE;
-};
-
-interface IDWriteFontFamily;
-interface IDWriteFont;
-
-/// <summary>
-/// The IDWriteFontCollection encapsulates a collection of fonts.
-/// </summary>
-interface DWRITE_DECLARE_INTERFACE("a84cee02-3eea-4eee-a827-87c1a02a0fcc") IDWriteFontCollection : public IUnknown
-{
- /// <summary>
- /// Gets the number of font families in the collection.
- /// </summary>
- STDMETHOD_(UINT32, GetFontFamilyCount)() PURE;
-
- /// <summary>
- /// Creates a font family object given a zero-based font family index.
- /// </summary>
- /// <param name="index">Zero-based index of the font family.</param>
- /// <param name="fontFamily">Receives a pointer the newly created font family object.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(GetFontFamily)(
- UINT32 index,
- __out IDWriteFontFamily** fontFamily
- ) PURE;
-
- /// <summary>
- /// Finds the font family with the specified family name.
- /// </summary>
- /// <param name="familyName">Name of the font family. The name is not case-sensitive but must otherwise exactly match a family name in the collection.</param>
- /// <param name="index">Receives the zero-based index of the matching font family if the family name was found or UINT_MAX otherwise.</param>
- /// <param name="exists">Receives TRUE if the family name exists or FALSE otherwise.</param>
- /// <returns>
- /// Standard HRESULT error code. If the specified family name does not exist, the return value is S_OK, but *index is UINT_MAX and *exists is FALSE.
- /// </returns>
- STDMETHOD(FindFamilyName)(
- __in_z WCHAR const* familyName,
- __out UINT32* index,
- __out BOOL* exists
- ) PURE;
-
- /// <summary>
- /// Gets the font object that corresponds to the same physical font as the specified font face object. The specified physical font must belong
- /// to the font collection.
- /// </summary>
- /// <param name="fontFace">Font face object that specifies the physical font.</param>
- /// <param name="font">Receives a pointer to the newly created font object if successful or NULL otherwise.</param>
- /// <returns>
- /// Standard HRESULT error code. If the specified physical font is not part of the font collection the return value is DWRITE_E_NOFONT.
- /// </returns>
- STDMETHOD(GetFontFromFontFace)(
- IDWriteFontFace* fontFace,
- __out IDWriteFont** font
- ) PURE;
-};
-
-/// <summary>
-/// The IDWriteFontList interface represents a list of fonts.
-/// </summary>
-interface DWRITE_DECLARE_INTERFACE("1a0d8438-1d97-4ec1-aef9-a2fb86ed6acb") IDWriteFontList : public IUnknown
-{
- /// <summary>
- /// Gets the font collection that contains the fonts.
- /// </summary>
- /// <param name="fontCollection">Receives a pointer to the font collection object.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(GetFontCollection)(
- __out IDWriteFontCollection** fontCollection
- ) PURE;
-
- /// <summary>
- /// Gets the number of fonts in the font list.
- /// </summary>
- STDMETHOD_(UINT32, GetFontCount)() PURE;
-
- /// <summary>
- /// Gets a font given its zero-based index.
- /// </summary>
- /// <param name="index">Zero-based index of the font in the font list.</param>
- /// <param name="font">Receives a pointer to the newly created font object.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(GetFont)(
- UINT32 index,
- __out IDWriteFont** font
- ) PURE;
-};
-
-/// <summary>
-/// The IDWriteFontFamily interface represents a set of fonts that share the same design but are differentiated
-/// by weight, stretch, and style.
-/// </summary>
-interface DWRITE_DECLARE_INTERFACE("da20d8ef-812a-4c43-9802-62ec4abd7add") IDWriteFontFamily : public IDWriteFontList
-{
- /// <summary>
- /// Creates an localized strings object that contains the family names for the font family, indexed by locale name.
- /// </summary>
- /// <param name="names">Receives a pointer to the newly created localized strings object.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(GetFamilyNames)(
- __out IDWriteLocalizedStrings** names
- ) PURE;
-
- /// <summary>
- /// Gets the font that best matches the specified properties.
- /// </summary>
- /// <param name="weight">Requested font weight.</param>
- /// <param name="stretch">Requested font stretch.</param>
- /// <param name="style">Requested font style.</param>
- /// <param name="matchingFont">Receives a pointer to the newly created font object.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(GetFirstMatchingFont)(
- DWRITE_FONT_WEIGHT weight,
- DWRITE_FONT_STRETCH stretch,
- DWRITE_FONT_STYLE style,
- __out IDWriteFont** matchingFont
- ) PURE;
-
- /// <summary>
- /// Gets a list of fonts in the font family ranked in order of how well they match the specified properties.
- /// </summary>
- /// <param name="weight">Requested font weight.</param>
- /// <param name="stretch">Requested font stretch.</param>
- /// <param name="style">Requested font style.</param>
- /// <param name="matchingFonts">Receives a pointer to the newly created font list object.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(GetMatchingFonts)(
- DWRITE_FONT_WEIGHT weight,
- DWRITE_FONT_STRETCH stretch,
- DWRITE_FONT_STYLE style,
- __out IDWriteFontList** matchingFonts
- ) PURE;
-};
-
-/// <summary>
-/// The IDWriteFont interface represents a physical font in a font collection.
-/// </summary>
-interface DWRITE_DECLARE_INTERFACE("acd16696-8c14-4f5d-877e-fe3fc1d32737") IDWriteFont : public IUnknown
-{
- /// <summary>
- /// Gets the font family to which the specified font belongs.
- /// </summary>
- /// <param name="fontFamily">Receives a pointer to the font family object.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(GetFontFamily)(
- __out IDWriteFontFamily** fontFamily
- ) PURE;
-
- /// <summary>
- /// Gets the weight of the specified font.
- /// </summary>
- STDMETHOD_(DWRITE_FONT_WEIGHT, GetWeight)() PURE;
-
- /// <summary>
- /// Gets the stretch (aka. width) of the specified font.
- /// </summary>
- STDMETHOD_(DWRITE_FONT_STRETCH, GetStretch)() PURE;
-
- /// <summary>
- /// Gets the style (aka. slope) of the specified font.
- /// </summary>
- STDMETHOD_(DWRITE_FONT_STYLE, GetStyle)() PURE;
-
- /// <summary>
- /// Returns TRUE if the font is a symbol font or FALSE if not.
- /// </summary>
- STDMETHOD_(BOOL, IsSymbolFont)() PURE;
-
- /// <summary>
- /// Gets a localized strings collection containing the face names for the font (e.g., Regular or Bold), indexed by locale name.
- /// </summary>
- /// <param name="names">Receives a pointer to the newly created localized strings object.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(GetFaceNames)(
- __out IDWriteLocalizedStrings** names
- ) PURE;
-
- /// <summary>
- /// Gets a localized strings collection containing the specified informational strings, indexed by locale name.
- /// </summary>
- /// <param name="informationalStringID">Identifies the string to get.</param>
- /// <param name="informationalStrings">Receives a pointer to the newly created localized strings object.</param>
- /// <param name="exists">Receives the value TRUE if the font contains the specified string ID or FALSE if not.</param>
- /// <returns>
- /// Standard HRESULT error code. If the font does not contain the specified string, the return value is S_OK but
- /// informationalStrings receives a NULL pointer and exists receives the value FALSE.
- /// </returns>
- STDMETHOD(GetInformationalStrings)(
- DWRITE_INFORMATIONAL_STRING_ID informationalStringID,
- __out IDWriteLocalizedStrings** informationalStrings,
- __out BOOL* exists
- ) PURE;
-
- /// <summary>
- /// Gets a value that indicates what simulation are applied to the specified font.
- /// </summary>
- STDMETHOD_(DWRITE_FONT_SIMULATIONS, GetSimulations)() PURE;
-
- /// <summary>
- /// Gets the metrics for the font.
- /// </summary>
- /// <param name="fontMetrics">Receives the font metrics.</param>
- STDMETHOD_(void, GetMetrics)(
- __out DWRITE_FONT_METRICS* fontMetrics
- ) PURE;
-
- /// <summary>
- /// Determines whether the font supports the specified character.
- /// </summary>
- /// <param name="unicodeValue">Unicode (UCS-4) character value.</param>
- /// <param name="exists">Receives the value TRUE if the font supports the specified character or FALSE if not.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(HasCharacter)(
- UINT32 unicodeValue,
- __out BOOL* exists
- ) PURE;
-
- /// <summary>
- /// Creates a font face object for the font.
- /// </summary>
- /// <param name="fontFace">Receives a pointer to the newly created font face object.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(CreateFontFace)(
- __out IDWriteFontFace** fontFace
- ) PURE;
-};
-
-/// <summary>
-/// Direction for how reading progresses.
-/// </summary>
-enum DWRITE_READING_DIRECTION
-{
- /// <summary>
- /// Reading progresses from left to right.
- /// </summary>
- DWRITE_READING_DIRECTION_LEFT_TO_RIGHT,
-
- /// <summary>
- /// Reading progresses from right to left.
- /// </summary>
- DWRITE_READING_DIRECTION_RIGHT_TO_LEFT
-};
-
-/// <summary>
-/// Direction for how lines of text are placed relative to one another.
-/// </summary>
-enum DWRITE_FLOW_DIRECTION
-{
- /// <summary>
- /// Text lines are placed from top to bottom.
- /// </summary>
- DWRITE_FLOW_DIRECTION_TOP_TO_BOTTOM
-};
-
-/// <summary>
-/// Alignment of paragraph text along the reading direction axis relative to
-/// the leading and trailing edge of the layout box.
-/// </summary>
-enum DWRITE_TEXT_ALIGNMENT
-{
- /// <summary>
- /// The leading edge of the paragraph text is aligned to the layout box's leading edge.
- /// </summary>
- DWRITE_TEXT_ALIGNMENT_LEADING,
-
- /// <summary>
- /// The trailing edge of the paragraph text is aligned to the layout box's trailing edge.
- /// </summary>
- DWRITE_TEXT_ALIGNMENT_TRAILING,
-
- /// <summary>
- /// The center of the paragraph text is aligned to the center of the layout box.
- /// </summary>
- DWRITE_TEXT_ALIGNMENT_CENTER
-};
-
-/// <summary>
-/// Alignment of paragraph text along the flow direction axis relative to the
-/// flow's beginning and ending edge of the layout box.
-/// </summary>
-enum DWRITE_PARAGRAPH_ALIGNMENT
-{
- /// <summary>
- /// The first line of paragraph is aligned to the flow's beginning edge of the layout box.
- /// </summary>
- DWRITE_PARAGRAPH_ALIGNMENT_NEAR,
-
- /// <summary>
- /// The last line of paragraph is aligned to the flow's ending edge of the layout box.
- /// </summary>
- DWRITE_PARAGRAPH_ALIGNMENT_FAR,
-
- /// <summary>
- /// The center of the paragraph is aligned to the center of the flow of the layout box.
- /// </summary>
- DWRITE_PARAGRAPH_ALIGNMENT_CENTER
-};
-
-/// <summary>
-/// Word wrapping in multiline paragraph.
-/// </summary>
-enum DWRITE_WORD_WRAPPING
-{
- /// <summary>
- /// Words are broken across lines to avoid text overflowing the layout box.
- /// </summary>
- DWRITE_WORD_WRAPPING_WRAP,
-
- /// <summary>
- /// Words are kept within the same line even when it overflows the layout box.
- /// This option is often used with scrolling to reveal overflow text.
- /// </summary>
- DWRITE_WORD_WRAPPING_NO_WRAP
-};
-
-/// <summary>
-/// The method used for line spacing in layout.
-/// </summary>
-enum DWRITE_LINE_SPACING_METHOD
-{
- /// <summary>
- /// Line spacing depends solely on the content, growing to accomodate the size of fonts and inline objects.
- /// </summary>
- DWRITE_LINE_SPACING_METHOD_DEFAULT,
-
- /// <summary>
- /// Lines are explicitly set to uniform spacing, regardless of contained font sizes.
- /// This can be useful to avoid the uneven appearance that can occur from font fallback.
- /// </summary>
- DWRITE_LINE_SPACING_METHOD_UNIFORM
-};
-
-/// <summary>
-/// Text granularity used to trim text overflowing the layout box.
-/// </summary>
-enum DWRITE_TRIMMING_GRANULARITY
-{
- /// <summary>
- /// No trimming occurs. Text flows beyond the layout width.
- /// </summary>
- DWRITE_TRIMMING_GRANULARITY_NONE,
-
- /// <summary>
- /// Trimming occurs at character cluster boundary.
- /// </summary>
- DWRITE_TRIMMING_GRANULARITY_CHARACTER,
-
- /// <summary>
- /// Trimming occurs at word boundary.
- /// </summary>
- DWRITE_TRIMMING_GRANULARITY_WORD
-};
-
-/// <summary>
-/// Typographic feature of text supplied by the font.
-/// </summary>
-enum DWRITE_FONT_FEATURE_TAG
-{
- DWRITE_FONT_FEATURE_TAG_ALTERNATIVE_FRACTIONS = 0x63726661, // 'afrc'
- DWRITE_FONT_FEATURE_TAG_PETITE_CAPITALS_FROM_CAPITALS = 0x63703263, // 'c2pc'
- DWRITE_FONT_FEATURE_TAG_SMALL_CAPITALS_FROM_CAPITALS = 0x63733263, // 'c2sc'
- DWRITE_FONT_FEATURE_TAG_CONTEXTUAL_ALTERNATES = 0x746c6163, // 'calt'
- DWRITE_FONT_FEATURE_TAG_CASE_SENSITIVE_FORMS = 0x65736163, // 'case'
- DWRITE_FONT_FEATURE_TAG_GLYPH_COMPOSITION_DECOMPOSITION = 0x706d6363, // 'ccmp'
- DWRITE_FONT_FEATURE_TAG_CONTEXTUAL_LIGATURES = 0x67696c63, // 'clig'
- DWRITE_FONT_FEATURE_TAG_CAPITAL_SPACING = 0x70737063, // 'cpsp'
- DWRITE_FONT_FEATURE_TAG_CONTEXTUAL_SWASH = 0x68777363, // 'cswh'
- DWRITE_FONT_FEATURE_TAG_CURSIVE_POSITIONING = 0x73727563, // 'curs'
- DWRITE_FONT_FEATURE_TAG_DEFAULT = 0x746c6664, // 'dflt'
- DWRITE_FONT_FEATURE_TAG_DISCRETIONARY_LIGATURES = 0x67696c64, // 'dlig'
- DWRITE_FONT_FEATURE_TAG_EXPERT_FORMS = 0x74707865, // 'expt'
- DWRITE_FONT_FEATURE_TAG_FRACTIONS = 0x63617266, // 'frac'
- DWRITE_FONT_FEATURE_TAG_FULL_WIDTH = 0x64697766, // 'fwid'
- DWRITE_FONT_FEATURE_TAG_HALF_FORMS = 0x666c6168, // 'half'
- DWRITE_FONT_FEATURE_TAG_HALANT_FORMS = 0x6e6c6168, // 'haln'
- DWRITE_FONT_FEATURE_TAG_ALTERNATE_HALF_WIDTH = 0x746c6168, // 'halt'
- DWRITE_FONT_FEATURE_TAG_HISTORICAL_FORMS = 0x74736968, // 'hist'
- DWRITE_FONT_FEATURE_TAG_HORIZONTAL_KANA_ALTERNATES = 0x616e6b68, // 'hkna'
- DWRITE_FONT_FEATURE_TAG_HISTORICAL_LIGATURES = 0x67696c68, // 'hlig'
- DWRITE_FONT_FEATURE_TAG_HALF_WIDTH = 0x64697768, // 'hwid'
- DWRITE_FONT_FEATURE_TAG_HOJO_KANJI_FORMS = 0x6f6a6f68, // 'hojo'
- DWRITE_FONT_FEATURE_TAG_JIS04_FORMS = 0x3430706a, // 'jp04'
- DWRITE_FONT_FEATURE_TAG_JIS78_FORMS = 0x3837706a, // 'jp78'
- DWRITE_FONT_FEATURE_TAG_JIS83_FORMS = 0x3338706a, // 'jp83'
- DWRITE_FONT_FEATURE_TAG_JIS90_FORMS = 0x3039706a, // 'jp90'
- DWRITE_FONT_FEATURE_TAG_KERNING = 0x6e72656b, // 'kern'
- DWRITE_FONT_FEATURE_TAG_STANDARD_LIGATURES = 0x6167696c, // 'liga'
- DWRITE_FONT_FEATURE_TAG_LINING_FIGURES = 0x6d756e6c, // 'lnum'
- DWRITE_FONT_FEATURE_TAG_LOCALIZED_FORMS = 0x6c636f6c, // 'locl'
- DWRITE_FONT_FEATURE_TAG_MARK_POSITIONING = 0x6b72616d, // 'mark'
- DWRITE_FONT_FEATURE_TAG_MATHEMATICAL_GREEK = 0x6b72676d, // 'mgrk'
- DWRITE_FONT_FEATURE_TAG_MARK_TO_MARK_POSITIONING = 0x6b6d6b6d, // 'mkmk'
- DWRITE_FONT_FEATURE_TAG_ALTERNATE_ANNOTATION_FORMS = 0x746c616e, // 'nalt'
- DWRITE_FONT_FEATURE_TAG_NLC_KANJI_FORMS = 0x6b636c6e, // 'nlck'
- DWRITE_FONT_FEATURE_TAG_OLD_STYLE_FIGURES = 0x6d756e6f, // 'onum'
- DWRITE_FONT_FEATURE_TAG_ORDINALS = 0x6e64726f, // 'ordn'
- DWRITE_FONT_FEATURE_TAG_PROPORTIONAL_ALTERNATE_WIDTH = 0x746c6170, // 'palt'
- DWRITE_FONT_FEATURE_TAG_PETITE_CAPITALS = 0x70616370, // 'pcap'
- DWRITE_FONT_FEATURE_TAG_PROPORTIONAL_FIGURES = 0x6d756e70, // 'pnum'
- DWRITE_FONT_FEATURE_TAG_PROPORTIONAL_WIDTHS = 0x64697770, // 'pwid'
- DWRITE_FONT_FEATURE_TAG_QUARTER_WIDTHS = 0x64697771, // 'qwid'
- DWRITE_FONT_FEATURE_TAG_REQUIRED_LIGATURES = 0x67696c72, // 'rlig'
- DWRITE_FONT_FEATURE_TAG_RUBY_NOTATION_FORMS = 0x79627572, // 'ruby'
- DWRITE_FONT_FEATURE_TAG_STYLISTIC_ALTERNATES = 0x746c6173, // 'salt'
- DWRITE_FONT_FEATURE_TAG_SCIENTIFIC_INFERIORS = 0x666e6973, // 'sinf'
- DWRITE_FONT_FEATURE_TAG_SMALL_CAPITALS = 0x70636d73, // 'smcp'
- DWRITE_FONT_FEATURE_TAG_SIMPLIFIED_FORMS = 0x6c706d73, // 'smpl'
- DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_1 = 0x31307373, // 'ss01'
- DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_2 = 0x32307373, // 'ss02'
- DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_3 = 0x33307373, // 'ss03'
- DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_4 = 0x34307373, // 'ss04'
- DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_5 = 0x35307373, // 'ss05'
- DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_6 = 0x36307373, // 'ss06'
- DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_7 = 0x37307373, // 'ss07'
- DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_8 = 0x38307373, // 'ss08'
- DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_9 = 0x39307373, // 'ss09'
- DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_10 = 0x30317373, // 'ss10'
- DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_11 = 0x31317373, // 'ss11'
- DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_12 = 0x32317373, // 'ss12'
- DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_13 = 0x33317373, // 'ss13'
- DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_14 = 0x34317373, // 'ss14'
- DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_15 = 0x35317373, // 'ss15'
- DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_16 = 0x36317373, // 'ss16'
- DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_17 = 0x37317373, // 'ss17'
- DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_18 = 0x38317373, // 'ss18'
- DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_19 = 0x39317373, // 'ss19'
- DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_20 = 0x30327373, // 'ss20'
- DWRITE_FONT_FEATURE_TAG_SUBSCRIPT = 0x73627573, // 'subs'
- DWRITE_FONT_FEATURE_TAG_SUPERSCRIPT = 0x73707573, // 'sups'
- DWRITE_FONT_FEATURE_TAG_SWASH = 0x68737773, // 'swsh'
- DWRITE_FONT_FEATURE_TAG_TITLING = 0x6c746974, // 'titl'
- DWRITE_FONT_FEATURE_TAG_TRADITIONAL_NAME_FORMS = 0x6d616e74, // 'tnam'
- DWRITE_FONT_FEATURE_TAG_TABULAR_FIGURES = 0x6d756e74, // 'tnum'
- DWRITE_FONT_FEATURE_TAG_TRADITIONAL_FORMS = 0x64617274, // 'trad'
- DWRITE_FONT_FEATURE_TAG_THIRD_WIDTHS = 0x64697774, // 'twid'
- DWRITE_FONT_FEATURE_TAG_UNICASE = 0x63696e75, // 'unic'
- DWRITE_FONT_FEATURE_TAG_SLASHED_ZERO = 0x6f72657a, // 'zero'
-};
-
-/// <summary>
-/// The DWRITE_TEXT_RANGE structure specifies a range of text positions where format is applied.
-/// </summary>
-struct DWRITE_TEXT_RANGE
-{
- /// <summary>
- /// The start text position of the range.
- /// </summary>
- UINT32 startPosition;
-
- /// <summary>
- /// The number of text positions in the range.
- /// </summary>
- UINT32 length;
-};
-
-/// <summary>
-/// The DWRITE_FONT_FEATURE structure specifies properties used to identify and execute typographic feature in the font.
-/// </summary>
-struct DWRITE_FONT_FEATURE
-{
- /// <summary>
- /// The feature OpenType name identifier.
- /// </summary>
- DWRITE_FONT_FEATURE_TAG nameTag;
-
- /// <summary>
- /// Execution parameter of the feature.
- /// </summary>
- /// <remarks>
- /// The parameter should be non-zero to enable the feature. Once enabled, a feature can't be disabled again within
- /// the same range. Features requiring a selector use this value to indicate the selector index.
- /// </remarks>
- UINT32 parameter;
-};
-
-/// <summary>
-/// Defines a set of typographic features to be applied during shaping.
-/// Notice the character range which this feature list spans is specified
-/// as a separate parameter to GetGlyphs.
-/// </summary>
-struct DWRITE_TYPOGRAPHIC_FEATURES
-{
- /// <summary>
- /// Array of font features.
- /// </summary>
- __field_ecount(featureCount) DWRITE_FONT_FEATURE* features;
-
- /// <summary>
- /// The number of features.
- /// </summary>
- UINT32 featureCount;
-};
-
-/// <summary>
-/// The DWRITE_TRIMMING structure specifies the trimming option for text overflowing the layout box.
-/// </summary>
-struct DWRITE_TRIMMING
-{
- /// <summary>
- /// Text granularity of which trimming applies.
- /// </summary>
- DWRITE_TRIMMING_GRANULARITY granularity;
-
- /// <summary>
- /// Character code used as the delimiter signaling the beginning of the portion of text to be preserved,
- /// most useful for path ellipsis, where the delimeter would be a slash.
- /// </summary>
- UINT32 delimiter;
-
- /// <summary>
- /// How many occurences of the delimiter to step back.
- /// </summary>
- UINT32 delimiterCount;
-};
-
-
-interface IDWriteTypography;
-interface IDWriteInlineObject;
-
-/// <summary>
-/// The format of text used for text layout purpose.
-/// </summary>
-/// <remarks>
-/// This object may not be thread-safe and it may carry the state of text format change.
-/// </remarks>
-interface DWRITE_DECLARE_INTERFACE("9c906818-31d7-4fd3-a151-7c5e225db55a") IDWriteTextFormat : public IUnknown
-{
- /// <summary>
- /// Set alignment option of text relative to layout box's leading and trailing edge.
- /// </summary>
- /// <param name="textAlignment">Text alignment option</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(SetTextAlignment)(
- DWRITE_TEXT_ALIGNMENT textAlignment
- ) PURE;
-
- /// <summary>
- /// Set alignment option of paragraph relative to layout box's top and bottom edge.
- /// </summary>
- /// <param name="paragraphAlignment">Paragraph alignment option</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(SetParagraphAlignment)(
- DWRITE_PARAGRAPH_ALIGNMENT paragraphAlignment
- ) PURE;
-
- /// <summary>
- /// Set word wrapping option.
- /// </summary>
- /// <param name="wordWrapping">Word wrapping option</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(SetWordWrapping)(
- DWRITE_WORD_WRAPPING wordWrapping
- ) PURE;
-
- /// <summary>
- /// Set paragraph reading direction.
- /// </summary>
- /// <param name="readingDirection">Text reading direction</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(SetReadingDirection)(
- DWRITE_READING_DIRECTION readingDirection
- ) PURE;
-
- /// <summary>
- /// Set paragraph flow direction.
- /// </summary>
- /// <param name="flowDirection">Paragraph flow direction</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(SetFlowDirection)(
- DWRITE_FLOW_DIRECTION flowDirection
- ) PURE;
-
- /// <summary>
- /// Set incremental tab stop position.
- /// </summary>
- /// <param name="incrementalTabStop">The incremental tab stop value</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(SetIncrementalTabStop)(
- FLOAT incrementalTabStop
- ) PURE;
-
- /// <summary>
- /// Set trimming options for any trailing text exceeding the layout width
- /// or for any far text exceeding the layout height.
- /// </summary>
- /// <param name="trimmingOptions">Text trimming options.</param>
- /// <param name="trimmingSign">Application-defined omission sign. This parameter may be NULL if no trimming sign is desired.</param>
- /// <remarks>
- /// Any inline object can be used for the trimming sign, but CreateEllipsisTrimmingSign
- /// provides a typical ellipsis symbol. Trimming is also useful vertically for hiding
- /// partial lines.
- /// </remarks>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(SetTrimming)(
- __in DWRITE_TRIMMING const* trimmingOptions,
- IDWriteInlineObject* trimmingSign
- ) PURE;
-
- /// <summary>
- /// Set line spacing.
- /// </summary>
- /// <param name="lineSpacingMethod">How to determine line height.</param>
- /// <param name="lineSpacing">The line height, or rather distance between one baseline to another.</param>
- /// <param name="baseline">Distance from top of line to baseline. A reasonable ratio to lineSpacing is 80%.</param>
- /// <remarks>
- /// For the default method, spacing depends solely on the content.
- /// For uniform spacing, the given line height will override the content.
- /// </remarks>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(SetLineSpacing)(
- DWRITE_LINE_SPACING_METHOD lineSpacingMethod,
- FLOAT lineSpacing,
- FLOAT baseline
- ) PURE;
-
- /// <summary>
- /// Get alignment option of text relative to layout box's leading and trailing edge.
- /// </summary>
- STDMETHOD_(DWRITE_TEXT_ALIGNMENT, GetTextAlignment)() PURE;
-
- /// <summary>
- /// Get alignment option of paragraph relative to layout box's top and bottom edge.
- /// </summary>
- STDMETHOD_(DWRITE_PARAGRAPH_ALIGNMENT, GetParagraphAlignment)() PURE;
-
- /// <summary>
- /// Get word wrapping option.
- /// </summary>
- STDMETHOD_(DWRITE_WORD_WRAPPING, GetWordWrapping)() PURE;
-
- /// <summary>
- /// Get paragraph reading direction.
- /// </summary>
- STDMETHOD_(DWRITE_READING_DIRECTION, GetReadingDirection)() PURE;
-
- /// <summary>
- /// Get paragraph flow direction.
- /// </summary>
- STDMETHOD_(DWRITE_FLOW_DIRECTION, GetFlowDirection)() PURE;
-
- /// <summary>
- /// Get incremental tab stop position.
- /// </summary>
- STDMETHOD_(FLOAT, GetIncrementalTabStop)() PURE;
-
- /// <summary>
- /// Get trimming options for text overflowing the layout width.
- /// </summary>
- /// <param name="trimmingOptions">Text trimming options.</param>
- /// <param name="trimmingSign">Trimming omission sign. This parameter may be NULL.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(GetTrimming)(
- __out DWRITE_TRIMMING* trimmingOptions,
- __out IDWriteInlineObject** trimmingSign
- ) PURE;
-
- /// <summary>
- /// Get line spacing.
- /// </summary>
- /// <param name="lineSpacingMethod">How line height is determined.</param>
- /// <param name="lineSpacing">The line height, or rather distance between one baseline to another.</param>
- /// <param name="baseline">Distance from top of line to baseline.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(GetLineSpacing)(
- __out DWRITE_LINE_SPACING_METHOD* lineSpacingMethod,
- __out FLOAT* lineSpacing,
- __out FLOAT* baseline
- ) PURE;
-
- /// <summary>
- /// Get the font collection.
- /// </summary>
- /// <param name="fontCollection">The current font collection.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(GetFontCollection)(
- __out IDWriteFontCollection** fontCollection
- ) PURE;
-
- /// <summary>
- /// Get the length of the font family name, in characters, not including the terminating NULL character.
- /// </summary>
- STDMETHOD_(UINT32, GetFontFamilyNameLength)() PURE;
-
- /// <summary>
- /// Get a copy of the font family name.
- /// </summary>
- /// <param name="fontFamilyName">Character array that receives the current font family name</param>
- /// <param name="nameSize">Size of the character array in character count including the terminated NULL character.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(GetFontFamilyName)(
- __out_ecount_z(nameSize) WCHAR* fontFamilyName,
- UINT32 nameSize
- ) PURE;
-
- /// <summary>
- /// Get the font weight.
- /// </summary>
- STDMETHOD_(DWRITE_FONT_WEIGHT, GetFontWeight)() PURE;
-
- /// <summary>
- /// Get the font style.
- /// </summary>
- STDMETHOD_(DWRITE_FONT_STYLE, GetFontStyle)() PURE;
-
- /// <summary>
- /// Get the font stretch.
- /// </summary>
- STDMETHOD_(DWRITE_FONT_STRETCH, GetFontStretch)() PURE;
-
- /// <summary>
- /// Get the font em height.
- /// </summary>
- STDMETHOD_(FLOAT, GetFontSize)() PURE;
-
- /// <summary>
- /// Get the length of the locale name, in characters, not including the terminating NULL character.
- /// </summary>
- STDMETHOD_(UINT32, GetLocaleNameLength)() PURE;
-
- /// <summary>
- /// Get a copy of the locale name.
- /// </summary>
- /// <param name="localeName">Character array that receives the current locale name</param>
- /// <param name="nameSize">Size of the character array in character count including the terminated NULL character.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(GetLocaleName)(
- __out_ecount_z(nameSize) WCHAR* localeName,
- UINT32 nameSize
- ) PURE;
-};
-
-
-/// <summary>
-/// Font typography setting.
-/// </summary>
-interface DWRITE_DECLARE_INTERFACE("55f1112b-1dc2-4b3c-9541-f46894ed85b6") IDWriteTypography : public IUnknown
-{
- /// <summary>
- /// Add font feature.
- /// </summary>
- /// <param name="fontFeature">The font feature to add.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(AddFontFeature)(
- DWRITE_FONT_FEATURE fontFeature
- ) PURE;
-
- /// <summary>
- /// Get the number of font features.
- /// </summary>
- STDMETHOD_(UINT32, GetFontFeatureCount)() PURE;
-
- /// <summary>
- /// Get the font feature at the specified index.
- /// </summary>
- /// <param name="fontFeatureIndex">The zero-based index of the font feature to get.</param>
- /// <param name="fontFeature">The font feature.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(GetFontFeature)(
- UINT32 fontFeatureIndex,
- __out DWRITE_FONT_FEATURE* fontFeature
- ) PURE;
-};
-
-enum DWRITE_SCRIPT_SHAPES
-{
- /// <summary>
- /// No additional shaping requirement. Text is shaped with the writing system default behavior.
- /// </summary>
- DWRITE_SCRIPT_SHAPES_DEFAULT = 0,
-
- /// <summary>
- /// Text should leave no visual on display i.e. control or format control characters.
- /// </summary>
- DWRITE_SCRIPT_SHAPES_NO_VISUAL = 1
-};
-
-#ifdef DEFINE_ENUM_FLAG_OPERATORS
-DEFINE_ENUM_FLAG_OPERATORS(DWRITE_SCRIPT_SHAPES);
-#endif
-
-/// <summary>
-/// Association of text and its writing system script as well as some display attributes.
-/// </summary>
-struct DWRITE_SCRIPT_ANALYSIS
-{
- /// <summary>
- /// Zero-based index representation of writing system script.
- /// </summary>
- UINT16 script;
-
- /// <summary>
- /// Additional shaping requirement of text.
- /// </summary>
- DWRITE_SCRIPT_SHAPES shapes;
-};
-
-/// <summary>
-/// Condition at the edges of inline object or text used to determine
-/// line-breaking behavior.
-/// </summary>
-enum DWRITE_BREAK_CONDITION
-{
- /// <summary>
- /// Whether a break is allowed is determined by the condition of the
- /// neighboring text span or inline object.
- /// </summary>
- DWRITE_BREAK_CONDITION_NEUTRAL,
-
- /// <summary>
- /// A break is allowed, unless overruled by the condition of the
- /// neighboring text span or inline object, either prohibited by a
- /// May Not or forced by a Must.
- /// </summary>
- DWRITE_BREAK_CONDITION_CAN_BREAK,
-
- /// <summary>
- /// There should be no break, unless overruled by a Must condition from
- /// the neighboring text span or inline object.
- /// </summary>
- DWRITE_BREAK_CONDITION_MAY_NOT_BREAK,
-
- /// <summary>
- /// The break must happen, regardless of the condition of the adjacent
- /// text span or inline object.
- /// </summary>
- DWRITE_BREAK_CONDITION_MUST_BREAK
-};
-
-/// <summary>
-/// Line breakpoint characteristics of a character.
-/// </summary>
-struct DWRITE_LINE_BREAKPOINT
-{
- /// <summary>
- /// Breaking condition before the character.
- /// </summary>
- UINT8 breakConditionBefore : 2;
-
- /// <summary>
- /// Breaking condition after the character.
- /// </summary>
- UINT8 breakConditionAfter : 2;
-
- /// <summary>
- /// The character is some form of whitespace, which may be meaningful
- /// for justification.
- /// </summary>
- UINT8 isWhitespace : 1;
-
- /// <summary>
- /// The character is a soft hyphen, often used to indicate hyphenation
- /// points inside words.
- /// </summary>
- UINT8 isSoftHyphen : 1;
-
- UINT8 padding : 2;
-};
-
-/// <summary>
-/// How to apply number substitution on digits and related punctuation.
-/// </summary>
-enum DWRITE_NUMBER_SUBSTITUTION_METHOD
-{
- /// <summary>
- /// Specifies that the substitution method should be determined based
- /// on LOCALE_IDIGITSUBSTITUTION value of the specified text culture.
- /// </summary>
- DWRITE_NUMBER_SUBSTITUTION_METHOD_FROM_CULTURE,
-
- /// <summary>
- /// If the culture is Arabic or Farsi, specifies that the number shape
- /// depend on the context. Either traditional or nominal number shape
- /// are used depending on the nearest preceding strong character or (if
- /// there is none) the reading direction of the paragraph.
- /// </summary>
- DWRITE_NUMBER_SUBSTITUTION_METHOD_CONTEXTUAL,
-
- /// <summary>
- /// Specifies that code points 0x30-0x39 are always rendered as nominal numeral
- /// shapes (ones of the European number), i.e., no substitution is performed.
- /// </summary>
- DWRITE_NUMBER_SUBSTITUTION_METHOD_NONE,
-
- /// <summary>
- /// Specifies that number are rendered using the national number shape
- /// as specified by the LOCALE_SNATIVEDIGITS value of the specified text culture.
- /// </summary>
- DWRITE_NUMBER_SUBSTITUTION_METHOD_NATIONAL,
-
- /// <summary>
- /// Specifies that number are rendered using the traditional shape
- /// for the specified culture. For most cultures, this is the same as
- /// NativeNational. However, NativeNational results in Latin number
- /// for some Arabic cultures, whereas this value results in Arabic
- /// number for all Arabic cultures.
- /// </summary>
- DWRITE_NUMBER_SUBSTITUTION_METHOD_TRADITIONAL
-};
-
-/// <summary>
-/// Holds the appropriate digits and numeric punctuation for a given locale.
-/// </summary>
-interface DECLSPEC_UUID("14885CC9-BAB0-4f90-B6ED-5C366A2CD03D") DECLSPEC_NOVTABLE IDWriteNumberSubstitution : public IUnknown
-{
-};
-
-/// <summary>
-/// Shaping output properties per input character.
-/// </summary>
-struct DWRITE_SHAPING_TEXT_PROPERTIES
-{
- /// <summary>
- /// This character can be shaped independently from the others
- /// (usually set for the space character).
- /// </summary>
- UINT16 isShapedAlone : 1;
-
- /// <summary>
- /// Reserved for use by shaping engine.
- /// </summary>
- UINT16 reserved : 15;
-};
-
-/// <summary>
-/// Shaping output properties per output glyph.
-/// </summary>
-struct DWRITE_SHAPING_GLYPH_PROPERTIES
-{
- /// <summary>
- /// Justification class, whether to use spacing, kashidas, or
- /// another method. This exists for backwards compatibility
- /// with Uniscribe's SCRIPT_JUSTIFY enum.
- /// </summary>
- UINT16 justification : 4;
-
- /// <summary>
- /// Indicates glyph is the first of a cluster.
- /// </summary>
- UINT16 isClusterStart : 1;
-
- /// <summary>
- /// Glyph is a diacritic.
- /// </summary>
- UINT16 isDiacritic : 1;
-
- /// <summary>
- /// Glyph has no width, blank, ZWJ, ZWNJ etc.
- /// </summary>
- UINT16 isZeroWidthSpace : 1;
-
- /// <summary>
- /// Reserved for use by shaping engine.
- /// </summary>
- UINT16 reserved : 9;
-};
-
-/// <summary>
-/// The interface implemented by the text analyzer's client to provide text to
-/// the analyzer. It allows the separation between the logical view of text as
-/// a continuous stream of characters identifiable by unique text positions,
-/// and the actual memory layout of potentially discrete blocks of text in the
-/// client's backing store.
-///
-/// If any of these callbacks returns an error, the analysis functions will
-/// stop prematurely and return a callback error. Rather than return E_NOTIMPL,
-/// an application should stub the method and return a constant/null and S_OK.
-/// </summary>
-interface DECLSPEC_UUID("688e1a58-5094-47c8-adc8-fbcea60ae92b") DECLSPEC_NOVTABLE IDWriteTextAnalysisSource : public IUnknown
-{
- /// <summary>
- /// Get a block of text starting at the specified text position.
- /// Returning NULL indicates the end of text - the position is after
- /// the last character. This function is called iteratively for
- /// each consecutive block, tying together several fragmented blocks
- /// in the backing store into a virtual contiguous string.
- /// </summary>
- /// <param name="textPosition">First position of the piece to obtain. All
- /// positions are in UTF16 code-units, not whole characters, which
- /// matters when supplementary characters are used.</param>
- /// <param name="textString">Address that receives a pointer to the text block
- /// at the specified position.</param>
- /// <param name="textLength">Number of UTF16 units of the retrieved chunk.
- /// The returned length is not the length of the block, but the length
- /// remaining in the block, from the given position until its end.
- /// So querying for a position that is 75 positions into a 100
- /// postition block would return 25.</param>
- /// <returns>Pointer to the first character at the given text position.
- /// NULL indicates no chunk available at the specified position, either
- /// because textPosition >= the entire text content length or because the
- /// queried position is not mapped into the app's backing store.</returns>
- /// <remarks>
- /// Although apps can implement sparse textual content that only maps part of
- /// the backing store, the app must map any text that is in the range passed
- /// to any analysis functions.
- /// </remarks>
- STDMETHOD(GetTextAtPosition)(
- UINT32 textPosition,
- __out WCHAR const** textString,
- __out UINT32* textLength
- ) PURE;
-
- /// <summary>
- /// Get a block of text immediately preceding the specified position.
- /// </summary>
- /// <param name="textPosition">Position immediately after the last position of the chunk to obtain.</param>
- /// <param name="textString">Address that receives a pointer to the text block
- /// at the specified position.</param>
- /// <param name="textLength">Number of UTF16 units of the retrieved block.
- /// The length returned is from the given position to the front of
- /// the block.</param>
- /// <returns>Pointer to the first character at (textPosition - textLength).
- /// NULL indicates no chunk available at the specified position, either
- /// because textPosition == 0,the textPosition > the entire text content
- /// length, or the queried position is not mapped into the app's backing
- /// store.</returns>
- /// <remarks>
- /// Although apps can implement sparse textual content that only maps part of
- /// the backing store, the app must map any text that is in the range passed
- /// to any analysis functions.
- /// </remarks>
- STDMETHOD(GetTextBeforePosition)(
- UINT32 textPosition,
- __out WCHAR const** textString,
- __out UINT32* textLength
- ) PURE;
-
- /// <summary>
- /// Get paragraph reading direction.
- /// </summary>
- STDMETHOD_(DWRITE_READING_DIRECTION, GetParagraphReadingDirection)() PURE;
-
- /// <summary>
- /// Get locale name on the range affected by it.
- /// </summary>
- /// <param name="textPosition">Position to get the locale name of.</param>
- /// <param name="textLength">Receives the length from the given position up to the
- /// next differing locale.</param>
- /// <param name="localeName">Address that receives a pointer to the locale
- /// at the specified position.</param>
- /// <remarks>
- /// The localeName pointer must remain valid until the next call or until
- /// the analysis returns.
- /// </remarks>
- STDMETHOD(GetLocaleName)(
- UINT32 textPosition,
- __out UINT32* textLength,
- __out_z WCHAR const** localeName
- ) PURE;
-
- /// <summary>
- /// Get number substitution on the range affected by it.
- /// </summary>
- /// <param name="textPosition">Position to get the number substitution of.</param>
- /// <param name="textLength">Receives the length from the given position up to the
- /// next differing number substitution.</param>
- /// <param name="numberSubstitution">Address that receives a pointer to the number substitution
- /// at the specified position.</param>
- /// <remarks>
- /// Any implementation should return the number substitution with an
- /// incremented ref count, and the analysis will release when finished
- /// with it (either before the next call or before it returns). However,
- /// the sink callback may hold onto it after that.
- /// </remarks>
- STDMETHOD(GetNumberSubstitution)(
- UINT32 textPosition,
- __out UINT32* textLength,
- __out IDWriteNumberSubstitution** numberSubstitution
- ) PURE;
-};
-
-/// <summary>
-/// The interface implemented by the text analyzer's client to receive the
-/// output of a given text analysis. The Text analyzer disregards any current
-/// state of the analysis sink, therefore a Set method call on a range
-/// overwrites the previously set analysis result of the same range.
-/// </summary>
-interface DECLSPEC_UUID("5810cd44-0ca0-4701-b3fa-bec5182ae4f6") DECLSPEC_NOVTABLE IDWriteTextAnalysisSink : public IUnknown
-{
- /// <summary>
- /// Report script analysis for the text range.
- /// </summary>
- /// <param name="textPosition">Starting position to report from.</param>
- /// <param name="textLength">Number of UTF16 units of the reported range.</param>
- /// <param name="scriptAnalysis">Script analysis of characters in range.</param>
- /// <returns>
- /// A successful code or error code to abort analysis.
- /// </returns>
- STDMETHOD(SetScriptAnalysis)(
- UINT32 textPosition,
- UINT32 textLength,
- __in DWRITE_SCRIPT_ANALYSIS const* scriptAnalysis
- ) PURE;
-
- /// <summary>
- /// Repport line-break opportunities for each character, starting from
- /// the specified position.
- /// </summary>
- /// <param name="textPosition">Starting position to report from.</param>
- /// <param name="textLength">Number of UTF16 units of the reported range.</param>
- /// <param name="lineBreakpoints">Breaking conditions for each character.</param>
- /// <returns>
- /// A successful code or error code to abort analysis.
- /// </returns>
- STDMETHOD(SetLineBreakpoints)(
- UINT32 textPosition,
- UINT32 textLength,
- __in_ecount(textLength) DWRITE_LINE_BREAKPOINT const* lineBreakpoints
- ) PURE;
-
- /// <summary>
- /// Set bidirectional level on the range, called once per each
- /// level run change (either explicit or resolved implicit).
- /// </summary>
- /// <param name="textPosition">Starting position to report from.</param>
- /// <param name="textLength">Number of UTF16 units of the reported range.</param>
- /// <param name="explicitLevel">Explicit level from embedded control codes
- /// RLE/RLO/LRE/LRO/PDF, determined before any additional rules.</param>
- /// <param name="resolvedLevel">Final implicit level considering the
- /// explicit level and characters' natural directionality, after all
- /// Bidi rules have been applied.</param>
- /// <returns>
- /// A successful code or error code to abort analysis.
- /// </returns>
- STDMETHOD(SetBidiLevel)(
- UINT32 textPosition,
- UINT32 textLength,
- UINT8 explicitLevel,
- UINT8 resolvedLevel
- ) PURE;
-
- /// <summary>
- /// Set number substitution on the range.
- /// </summary>
- /// <param name="textPosition">Starting position to report from.</param>
- /// <param name="textLength">Number of UTF16 units of the reported range.</param>
- /// <param name="numberSubstitution">The number substitution applicable to
- /// the returned range of text. The sink callback may hold onto it by
- /// incrementing its ref count.</param>
- /// <returns>
- /// A successful code or error code to abort analysis.
- /// </returns>
- /// <remark>
- /// Unlike script and bidi analysis, where every character passed to the
- /// analyzer has a result, this will only be called for those ranges where
- /// substitution is applicable. For any other range, you will simply not
- /// be called.
- /// </remark>
- STDMETHOD(SetNumberSubstitution)(
- UINT32 textPosition,
- UINT32 textLength,
- __notnull IDWriteNumberSubstitution* numberSubstitution
- ) PURE;
-};
-
-/// <summary>
-/// Analyzes various text properties for complex script processing.
-/// </summary>
-interface DWRITE_DECLARE_INTERFACE("b7e6163e-7f46-43b4-84b3-e4e6249c365d") IDWriteTextAnalyzer : public IUnknown
-{
- /// <summary>
- /// Analyzes a text range for script boundaries, reading text attributes
- /// from the source and reporting the Unicode script ID to the sink
- /// callback SetScript.
- /// </summary>
- /// <param name="analysisSource">Source object to analyze.</param>
- /// <param name="textPosition">Starting position within the source object.</param>
- /// <param name="textLength">Length to analyze.</param>
- /// <param name="analysisSink">Callback object.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(AnalyzeScript)(
- IDWriteTextAnalysisSource* analysisSource,
- UINT32 textPosition,
- UINT32 textLength,
- IDWriteTextAnalysisSink* analysisSink
- ) PURE;
-
- /// <summary>
- /// Analyzes a text range for script directionality, reading attributes
- /// from the source and reporting levels to the sink callback SetBidiLevel.
- /// </summary>
- /// <param name="analysisSource">Source object to analyze.</param>
- /// <param name="textPosition">Starting position within the source object.</param>
- /// <param name="textLength">Length to analyze.</param>
- /// <param name="analysisSink">Callback object.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- /// <remarks>
- /// While the function can handle multiple paragraphs, the text range
- /// should not arbitrarily split the middle of paragraphs. Otherwise the
- /// returned levels may be wrong, since the Bidi algorithm is meant to
- /// apply to the paragraph as a whole.
- /// </remarks>
- /// <remarks>
- /// Embedded control codes (LRE/LRO/RLE/RLO/PDF) are taken into account.
- /// </remarks>
- STDMETHOD(AnalyzeBidi)(
- IDWriteTextAnalysisSource* analysisSource,
- UINT32 textPosition,
- UINT32 textLength,
- IDWriteTextAnalysisSink* analysisSink
- ) PURE;
-
- /// <summary>
- /// Analyzes a text range for spans where number substitution is applicable,
- /// reading attributes from the source and reporting substitutable ranges
- /// to the sink callback SetNumberSubstitution.
- /// </summary>
- /// <param name="analysisSource">Source object to analyze.</param>
- /// <param name="textPosition">Starting position within the source object.</param>
- /// <param name="textLength">Length to analyze.</param>
- /// <param name="analysisSink">Callback object.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- /// <remarks>
- /// While the function can handle multiple ranges of differing number
- /// substitutions, the text ranges should not arbitrarily split the
- /// middle of numbers. Otherwise it will treat the numbers separately
- /// and will not translate any intervening punctuation.
- /// </remarks>
- /// <remarks>
- /// Embedded control codes (LRE/LRO/RLE/RLO/PDF) are taken into account.
- /// </remarks>
- STDMETHOD(AnalyzeNumberSubstitution)(
- IDWriteTextAnalysisSource* analysisSource,
- UINT32 textPosition,
- UINT32 textLength,
- IDWriteTextAnalysisSink* analysisSink
- ) PURE;
-
- /// <summary>
- /// Analyzes a text range for potential breakpoint opportunities, reading
- /// attributes from the source and reporting breakpoint opportunities to
- /// the sink callback SetLineBreakpoints.
- /// </summary>
- /// <param name="analysisSource">Source object to analyze.</param>
- /// <param name="textPosition">Starting position within the source object.</param>
- /// <param name="textLength">Length to analyze.</param>
- /// <param name="analysisSink">Callback object.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- /// <remarks>
- /// While the function can handle multiple paragraphs, the text range
- /// should not arbitrarily split the middle of paragraphs, unless the
- /// given text span is considered a whole unit. Otherwise the
- /// returned properties for the first and last characters will
- /// inappropriately allow breaks.
- /// </remarks>
- /// <remarks>
- /// Special cases include the first, last, and surrogate characters. Any
- /// text span is treated as if adjacent to inline objects on either side.
- /// So the rules with contingent-break opportunities are used, where the
- /// edge between text and inline objects is always treated as a potential
- /// break opportunity, dependent on any overriding rules of the adjacent
- /// objects to prohibit or force the break (see Unicode TR #14).
- /// Surrogate pairs never break between.
- /// </remarks>
- STDMETHOD(AnalyzeLineBreakpoints)(
- IDWriteTextAnalysisSource* analysisSource,
- UINT32 textPosition,
- UINT32 textLength,
- IDWriteTextAnalysisSink* analysisSink
- ) PURE;
-
- /// <summary>
- /// Parses the input text string and maps it to the set of glyphs and associated glyph data
- /// according to the font and the writing system's rendering rules.
- /// </summary>
- /// <param name="textString">The string to convert to glyphs.</param>
- /// <param name="textLength">The length of textString.</param>
- /// <param name="fontFace">The font face to get glyphs from.</param>
- /// <param name="isSideways">Set to true if the text is intended to be
- /// drawn vertically.</param>
- /// <param name="isRightToLeft">Set to TRUE for right-to-left text.</param>
- /// <param name="scriptAnalysis">Script analysis result from AnalyzeScript.</param>
- /// <param name="localeName">The locale to use when selecting glyphs.
- /// e.g. the same character may map to different glyphs for ja-jp vs zh-chs.
- /// If this is NULL then the default mapping based on the script is used.</param>
- /// <param name="numberSubstitution">Optional number substitution which
- /// selects the appropriate glyphs for digits and related numeric characters,
- /// depending on the results obtained from AnalyzeNumberSubstitution. Passing
- /// null indicates that no substitution is needed and that the digits should
- /// receive nominal glyphs.</param>
- /// <param name="features">An array of pointers to the sets of typographic
- /// features to use in each feature range.</param>
- /// <param name="featureRangeLengths">The length of each feature range, in characters.
- /// The sum of all lengths should be equal to textLength.</param>
- /// <param name="featureRanges">The number of feature ranges.</param>
- /// <param name="maxGlyphCount">The maximum number of glyphs that can be
- /// returned.</param>
- /// <param name="clusterMap">The mapping from character ranges to glyph
- /// ranges.</param>
- /// <param name="textProps">Per-character output properties.</param>
- /// <param name="glyphIndices">Output glyph indices.</param>
- /// <param name="glyphProps">Per-glyph output properties.</param>
- /// <param name="actualGlyphCount">The actual number of glyphs returned if
- /// the call succeeds.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- /// <remarks>
- /// Note that the mapping from characters to glyphs is, in general, many-
- /// to-many. The recommended estimate for the per-glyph output buffers is
- /// (3 * textLength / 2 + 16). This is not guaranteed to be sufficient.
- ///
- /// The value of the actualGlyphCount parameter is only valid if the call
- /// succeeds. In the event that maxGlyphCount is not big enough
- /// E_NOT_SUFFICIENT_BUFFER, which is equivalent to HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER),
- /// will be returned. The application should allocate a larger buffer and try again.
- /// </remarks>
- STDMETHOD(GetGlyphs)(
- __in_ecount(textLength) WCHAR const* textString,
- UINT32 textLength,
- IDWriteFontFace* fontFace,
- BOOL isSideways,
- BOOL isRightToLeft,
- __in DWRITE_SCRIPT_ANALYSIS const* scriptAnalysis,
- __in_z_opt WCHAR const* localeName,
- __maybenull IDWriteNumberSubstitution* numberSubstitution,
- __in_ecount_opt(featureRanges) DWRITE_TYPOGRAPHIC_FEATURES const** features,
- __in_ecount_opt(featureRanges) UINT32 const* featureRangeLengths,
- UINT32 featureRanges,
- UINT32 maxGlyphCount,
- __out_ecount(textLength) UINT16* clusterMap,
- __out_ecount(textLength) DWRITE_SHAPING_TEXT_PROPERTIES* textProps,
- __out_ecount(maxGlyphCount) UINT16* glyphIndices,
- __out_ecount(maxGlyphCount) DWRITE_SHAPING_GLYPH_PROPERTIES* glyphProps,
- __out UINT32* actualGlyphCount
- ) PURE;
-
- /// <summary>
- /// Place glyphs output from the GetGlyphs method according to the font
- /// and the writing system's rendering rules.
- /// </summary>
- /// <param name="textString">The original string the glyphs came from.</param>
- /// <param name="clusterMap">The mapping from character ranges to glyph
- /// ranges. Returned by GetGlyphs.</param>
- /// <param name="textProps">Per-character properties. Returned by
- /// GetGlyphs.</param>
- /// <param name="textLength">The length of textString.</param>
- /// <param name="glyphIndices">Glyph indices. See GetGlyphs</param>
- /// <param name="glyphProps">Per-glyph properties. See GetGlyphs</param>
- /// <param name="glyphCount">The number of glyphs.</param>
- /// <param name="fontFace">The font face the glyphs came from.</param>
- /// <param name="fontEmSize">Logical font size in DIP's.</param>
- /// <param name="isSideways">Set to true if the text is intended to be
- /// drawn vertically.</param>
- /// <param name="isRightToLeft">Set to TRUE for right-to-left text.</param>
- /// <param name="scriptAnalysis">Script analysis result from AnalyzeScript.</param>
- /// <param name="localeName">The locale to use when selecting glyphs.
- /// e.g. the same character may map to different glyphs for ja-jp vs zh-chs.
- /// If this is NULL then the default mapping based on the script is used.</param>
- /// <param name="features">An array of pointers to the sets of typographic
- /// features to use in each feature range.</param>
- /// <param name="featureRangeLengths">The length of each feature range, in characters.
- /// The sum of all lengths should be equal to textLength.</param>
- /// <param name="featureRanges">The number of feature ranges.</param>
- /// <param name="glyphAdvances">The advance width of each glyph.</param>
- /// <param name="glyphOffsets">The offset of the origin of each glyph.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(GetGlyphPlacements)(
- __in_ecount(textLength) WCHAR const* textString,
- __in_ecount(textLength) UINT16 const* clusterMap,
- __in_ecount(textLength) DWRITE_SHAPING_TEXT_PROPERTIES* textProps,
- UINT32 textLength,
- __in_ecount(glyphCount) UINT16 const* glyphIndices,
- __in_ecount(glyphCount) DWRITE_SHAPING_GLYPH_PROPERTIES const* glyphProps,
- UINT32 glyphCount,
- IDWriteFontFace * fontFace,
- FLOAT fontEmSize,
- BOOL isSideways,
- BOOL isRightToLeft,
- __in DWRITE_SCRIPT_ANALYSIS const* scriptAnalysis,
- __in_z_opt WCHAR const* localeName,
- __in_ecount_opt(featureRanges) DWRITE_TYPOGRAPHIC_FEATURES const** features,
- __in_ecount_opt(featureRanges) UINT32 const* featureRangeLengths,
- UINT32 featureRanges,
- __out_ecount(glyphCount) FLOAT* glyphAdvances,
- __out_ecount(glyphCount) DWRITE_GLYPH_OFFSET* glyphOffsets
- ) PURE;
-
- /// <summary>
- /// Place glyphs output from the GetGlyphs method according to the font
- /// and the writing system's rendering rules.
- /// </summary>
- /// <param name="textString">The original string the glyphs came from.</param>
- /// <param name="clusterMap">The mapping from character ranges to glyph
- /// ranges. Returned by GetGlyphs.</param>
- /// <param name="textProps">Per-character properties. Returned by
- /// GetGlyphs.</param>
- /// <param name="textLength">The length of textString.</param>
- /// <param name="glyphIndices">Glyph indices. See GetGlyphs</param>
- /// <param name="glyphProps">Per-glyph properties. See GetGlyphs</param>
- /// <param name="glyphCount">The number of glyphs.</param>
- /// <param name="fontFace">The font face the glyphs came from.</param>
- /// <param name="fontEmSize">Logical font size in DIP's.</param>
- /// <param name="pixelsPerDip">Number of physical pixels per DIP. For example, if the DPI of the rendering surface is 96 this
- /// value is 1.0f. If the DPI is 120, this value is 120.0f/96.</param>
- /// <param name="transform">Optional transform applied to the glyphs and their positions. This transform is applied after the
- /// scaling specified by the font size and pixelsPerDip.</param>
- /// <param name="useGdiNatural">
- /// When set to FALSE, the metrics are the same as the metrics of GDI aliased text.
- /// When set to TRUE, the metrics are the same as the metrics of text measured by GDI using a font
- /// created with CLEARTYPE_NATURAL_QUALITY.
- /// </param>
- /// <param name="isSideways">Set to true if the text is intended to be
- /// drawn vertically.</param>
- /// <param name="isRightToLeft">Set to TRUE for right-to-left text.</param>
- /// <param name="scriptAnalysis">Script analysis result from AnalyzeScript.</param>
- /// <param name="localeName">The locale to use when selecting glyphs.
- /// e.g. the same character may map to different glyphs for ja-jp vs zh-chs.
- /// If this is NULL then the default mapping based on the script is used.</param>
- /// <param name="features">An array of pointers to the sets of typographic
- /// features to use in each feature range.</param>
- /// <param name="featureRangeLengths">The length of each feature range, in characters.
- /// The sum of all lengths should be equal to textLength.</param>
- /// <param name="featureRanges">The number of feature ranges.</param>
- /// <param name="glyphAdvances">The advance width of each glyph.</param>
- /// <param name="glyphOffsets">The offset of the origin of each glyph.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(GetGdiCompatibleGlyphPlacements)(
- __in_ecount(textLength) WCHAR const* textString,
- __in_ecount(textLength) UINT16 const* clusterMap,
- __in_ecount(textLength) DWRITE_SHAPING_TEXT_PROPERTIES* textProps,
- UINT32 textLength,
- __in_ecount(glyphCount) UINT16 const* glyphIndices,
- __in_ecount(glyphCount) DWRITE_SHAPING_GLYPH_PROPERTIES const* glyphProps,
- UINT32 glyphCount,
- IDWriteFontFace * fontFace,
- FLOAT fontEmSize,
- FLOAT pixelsPerDip,
- __in_opt DWRITE_MATRIX const* transform,
- BOOL useGdiNatural,
- BOOL isSideways,
- BOOL isRightToLeft,
- __in DWRITE_SCRIPT_ANALYSIS const* scriptAnalysis,
- __in_z_opt WCHAR const* localeName,
- __in_ecount_opt(featureRanges) DWRITE_TYPOGRAPHIC_FEATURES const** features,
- __in_ecount_opt(featureRanges) UINT32 const* featureRangeLengths,
- UINT32 featureRanges,
- __out_ecount(glyphCount) FLOAT* glyphAdvances,
- __out_ecount(glyphCount) DWRITE_GLYPH_OFFSET* glyphOffsets
- ) PURE;
-};
-
-/// <summary>
-/// The DWRITE_GLYPH_RUN structure contains the information needed by renderers
-/// to draw glyph runs. All coordinates are in device independent pixels (DIPs).
-/// </summary>
-struct DWRITE_GLYPH_RUN
-{
- /// <summary>
- /// The physical font face to draw with.
- /// </summary>
- __notnull IDWriteFontFace* fontFace;
-
- /// <summary>
- /// Logical size of the font in DIPs, not points (equals 1/96 inch).
- /// </summary>
- FLOAT fontEmSize;
-
- /// <summary>
- /// The number of glyphs.
- /// </summary>
- UINT32 glyphCount;
-
- /// <summary>
- /// The indices to render.
- /// </summary>
- __field_ecount(glyphCount) UINT16 const* glyphIndices;
-
- /// <summary>
- /// Glyph advance widths.
- /// </summary>
- __field_ecount_opt(glyphCount) FLOAT const* glyphAdvances;
-
- /// <summary>
- /// Glyph offsets.
- /// </summary>
- __field_ecount_opt(glyphCount) DWRITE_GLYPH_OFFSET const* glyphOffsets;
-
- /// <summary>
- /// If true, specifies that glyphs are rotated 90 degrees to the left and
- /// vertical metrics are used. Vertical writing is achieved by specifying
- /// isSideways = true and rotating the entire run 90 degrees to the right
- /// via a rotate transform.
- /// </summary>
- BOOL isSideways;
-
- /// <summary>
- /// The implicit resolved bidi level of the run. Odd levels indicate
- /// right-to-left languages like Hebrew and Arabic, while even levels
- /// indicate left-to-right languages like English and Japanese (when
- /// written horizontally). For right-to-left languages, the text origin
- /// is on the right, and text should be drawn to the left.
- /// </summary>
- UINT32 bidiLevel;
-};
-
-/// <summary>
-/// The DWRITE_GLYPH_RUN_DESCRIPTION structure contains additional properties
-/// related to those in DWRITE_GLYPH_RUN.
-/// </summary>
-struct DWRITE_GLYPH_RUN_DESCRIPTION
-{
- /// <summary>
- /// The locale name associated with this run.
- /// </summary>
- __nullterminated WCHAR const* localeName;
-
- /// <summary>
- /// The text associated with the glyphs.
- /// </summary>
- __field_ecount(stringLength) WCHAR const* string;
-
- /// <summary>
- /// The number of characters (UTF16 code-units).
- /// Note that this may be different than the number of glyphs.
- /// </summary>
- UINT32 stringLength;
-
- /// <summary>
- /// An array of indices to the glyph indices array, of the first glyphs of
- /// all the glyph clusters of the glyphs to render.
- /// </summary>
- __field_ecount(stringLength) UINT16 const* clusterMap;
-
- /// <summary>
- /// Corresponding text position in the original string
- /// this glyph run came from.
- /// </summary>
- UINT32 textPosition;
-};
-
-/// <summary>
-/// The DWRITE_UNDERLINE structure contains about the size and placement of
-/// underlines. All coordinates are in device independent pixels (DIPs).
-/// </summary>
-struct DWRITE_UNDERLINE
-{
- /// <summary>
- /// Width of the underline, measured parallel to the baseline.
- /// </summary>
- FLOAT width;
-
- /// <summary>
- /// Thickness of the underline, measured perpendicular to the
- /// baseline.
- /// </summary>
- FLOAT thickness;
-
- /// <summary>
- /// Offset of the underline from the baseline.
- /// A positive offset represents a position below the baseline and
- /// a negative offset is above.
- /// </summary>
- FLOAT offset;
-
- /// <summary>
- /// Height of the tallest run where the underline applies.
- /// </summary>
- FLOAT runHeight;
-
- /// <summary>
- /// Reading direction of the text associated with the underline. This
- /// value is used to interpret whether the width value runs horizontally
- /// or vertically.
- /// </summary>
- DWRITE_READING_DIRECTION readingDirection;
-
- /// <summary>
- /// Flow direction of the text associated with the underline. This value
- /// is used to interpret whether the thickness value advances top to
- /// bottom, left to right, or right to left.
- /// </summary>
- DWRITE_FLOW_DIRECTION flowDirection;
-
- /// <summary>
- /// Locale of the text the underline is being drawn under. Can be
- /// pertinent where the locale affects how the underline is drawn.
- /// For example, in vertical text, the underline belongs on the
- /// left for Chinese but on the right for Japanese.
- /// This choice is completely left up to higher levels.
- /// </summary>
- __nullterminated WCHAR const* localeName;
-
- /// <summary>
- /// The measuring mode can be useful to the renderer to determine how
- /// underlines are rendered, e.g. rounding the thickness to a whole pixel
- /// in GDI-compatible modes.
- /// </summary>
- DWRITE_MEASURING_MODE measuringMode;
-};
-
-/// <summary>
-/// The DWRITE_STRIKETHROUGH structure contains about the size and placement of
-/// strickthroughs. All coordinates are in device independent pixels (DIPs).
-/// </summary>
-struct DWRITE_STRIKETHROUGH
-{
- /// <summary>
- /// Width of the strikethrough, measured parallel to the baseline.
- /// </summary>
- FLOAT width;
-
- /// <summary>
- /// Thickness of the strikethrough, measured perpendicular to the
- /// baseline.
- /// </summary>
- FLOAT thickness;
-
- /// <summary>
- /// Offset of the stikethrough from the baseline.
- /// A positive offset represents a position below the baseline and
- /// a negative offset is above.
- /// </summary>
- FLOAT offset;
-
- /// <summary>
- /// Reading direction of the text associated with the strikethrough. This
- /// value is used to interpret whether the width value runs horizontally
- /// or vertically.
- /// </summary>
- DWRITE_READING_DIRECTION readingDirection;
-
- /// <summary>
- /// Flow direction of the text associated with the strikethrough. This
- /// value is used to interpret whether the thickness value advances top to
- /// bottom, left to right, or right to left.
- /// </summary>
- DWRITE_FLOW_DIRECTION flowDirection;
-
- /// <summary>
- /// Locale of the range. Can be pertinent where the locale affects the style.
- /// </summary>
- __nullterminated WCHAR const* localeName;
-
- /// <summary>
- /// The measuring mode can be useful to the renderer to determine how
- /// underlines are rendered, e.g. rounding the thickness to a whole pixel
- /// in GDI-compatible modes.
- /// </summary>
- DWRITE_MEASURING_MODE measuringMode;
-};
-
-/// <summary>
-/// The DWRITE_LINE_METRICS structure contains information about a formatted
-/// line of text.
-/// </summary>
-struct DWRITE_LINE_METRICS
-{
- /// <summary>
- /// The number of total text positions in the line.
- /// This includes any trailing whitespace and newline characters.
- /// </summary>
- UINT32 length;
-
- /// <summary>
- /// The number of whitespace positions at the end of the line. Newline
- /// sequences are considered whitespace.
- /// </summary>
- UINT32 trailingWhitespaceLength;
-
- /// <summary>
- /// The number of characters in the newline sequence at the end of the line.
- /// If the count is zero, then the line was either wrapped or it is the
- /// end of the text.
- /// </summary>
- UINT32 newlineLength;
-
- /// <summary>
- /// Height of the line as measured from top to bottom.
- /// </summary>
- FLOAT height;
-
- /// <summary>
- /// Distance from the top of the line to its baseline.
- /// </summary>
- FLOAT baseline;
-
- /// <summary>
- /// The line is trimmed.
- /// </summary>
- BOOL isTrimmed;
-};
-
-
-/// <summary>
-/// The DWRITE_CLUSTER_METRICS structure contains information about a glyph cluster.
-/// </summary>
-struct DWRITE_CLUSTER_METRICS
-{
- /// <summary>
- /// The total advance width of all glyphs in the cluster.
- /// </summary>
- FLOAT width;
-
- /// <summary>
- /// The number of text positions in the cluster.
- /// </summary>
- UINT16 length;
-
- /// <summary>
- /// Indicate whether line can be broken right after the cluster.
- /// </summary>
- UINT16 canWrapLineAfter : 1;
-
- /// <summary>
- /// Indicate whether the cluster corresponds to whitespace character.
- /// </summary>
- UINT16 isWhitespace : 1;
-
- /// <summary>
- /// Indicate whether the cluster corresponds to a newline character.
- /// </summary>
- UINT16 isNewline : 1;
-
- /// <summary>
- /// Indicate whether the cluster corresponds to soft hyphen character.
- /// </summary>
- UINT16 isSoftHyphen : 1;
-
- /// <summary>
- /// Indicate whether the cluster is read from right to left.
- /// </summary>
- UINT16 isRightToLeft : 1;
-
- UINT16 padding : 11;
-};
-
-
-/// <summary>
-/// Overall metrics associated with text after layout.
-/// All coordinates are in device independent pixels (DIPs).
-/// </summary>
-struct DWRITE_TEXT_METRICS
-{
- /// <summary>
- /// Left-most point of formatted text relative to layout box
- /// (excluding any glyph overhang).
- /// </summary>
- FLOAT left;
-
- /// <summary>
- /// Top-most point of formatted text relative to layout box
- /// (excluding any glyph overhang).
- /// </summary>
- FLOAT top;
-
- /// <summary>
- /// The width of the formatted text ignoring trailing whitespace
- /// at the end of each line.
- /// </summary>
- FLOAT width;
-
- /// <summary>
- /// The width of the formatted text taking into account the
- /// trailing whitespace at the end of each line.
- /// </summary>
- FLOAT widthIncludingTrailingWhitespace;
-
- /// <summary>
- /// The height of the formatted text. The height of an empty string
- /// is determined by the size of the default font's line height.
- /// </summary>
- FLOAT height;
-
- /// <summary>
- /// Initial width given to the layout. Depending on whether the text
- /// was wrapped or not, it can be either larger or smaller than the
- /// text content width.
- /// </summary>
- FLOAT layoutWidth;
-
- /// <summary>
- /// Initial height given to the layout. Depending on the length of the
- /// text, it may be larger or smaller than the text content height.
- /// </summary>
- FLOAT layoutHeight;
-
- /// <summary>
- /// The maximum reordering count of any line of text, used
- /// to calculate the most number of hit-testing boxes needed.
- /// If the layout has no bidirectional text or no text at all,
- /// the minimum level is 1.
- /// </summary>
- UINT32 maxBidiReorderingDepth;
-
- /// <summary>
- /// Total number of lines.
- /// </summary>
- UINT32 lineCount;
-};
-
-
-/// <summary>
-/// Properties describing the geometric measurement of an
-/// application-defined inline object.
-/// </summary>
-struct DWRITE_INLINE_OBJECT_METRICS
-{
- /// <summary>
- /// Width of the inline object.
- /// </summary>
- FLOAT width;
-
- /// <summary>
- /// Height of the inline object as measured from top to bottom.
- /// </summary>
- FLOAT height;
-
- /// <summary>
- /// Distance from the top of the object to the baseline where it is lined up with the adjacent text.
- /// If the baseline is at the bottom, baseline simply equals height.
- /// </summary>
- FLOAT baseline;
-
- /// <summary>
- /// Flag indicating whether the object is to be placed upright or alongside the text baseline
- /// for vertical text.
- /// </summary>
- BOOL supportsSideways;
-};
-
-
-/// <summary>
-/// The DWRITE_OVERHANG_METRICS structure holds how much any visible pixels
-/// (in DIPs) overshoot each side of the layout or inline objects.
-/// </summary>
-/// <remarks>
-/// Positive overhangs indicate that the visible area extends outside the layout
-/// box or inline object, while negative values mean there is whitespace inside.
-/// The returned values are unaffected by rendering transforms or pixel snapping.
-/// Additionally, they may not exactly match final target's pixel bounds after
-/// applying grid fitting and hinting.
-/// </remarks>
-struct DWRITE_OVERHANG_METRICS
-{
- /// <summary>
- /// The distance from the left-most visible DIP to its left alignment edge.
- /// </summary>
- FLOAT left;
-
- /// <summary>
- /// The distance from the top-most visible DIP to its top alignment edge.
- /// </summary>
- FLOAT top;
-
- /// <summary>
- /// The distance from the right-most visible DIP to its right alignment edge.
- /// </summary>
- FLOAT right;
-
- /// <summary>
- /// The distance from the bottom-most visible DIP to its bottom alignment edge.
- /// </summary>
- FLOAT bottom;
-};
-
-
-/// <summary>
-/// Geometry enclosing of text positions.
-/// </summary>
-struct DWRITE_HIT_TEST_METRICS
-{
- /// <summary>
- /// First text position within the geometry.
- /// </summary>
- UINT32 textPosition;
-
- /// <summary>
- /// Number of text positions within the geometry.
- /// </summary>
- UINT32 length;
-
- /// <summary>
- /// Left position of the top-left coordinate of the geometry.
- /// </summary>
- FLOAT left;
-
- /// <summary>
- /// Top position of the top-left coordinate of the geometry.
- /// </summary>
- FLOAT top;
-
- /// <summary>
- /// Geometry's width.
- /// </summary>
- FLOAT width;
-
- /// <summary>
- /// Geometry's height.
- /// </summary>
- FLOAT height;
-
- /// <summary>
- /// Bidi level of text positions enclosed within the geometry.
- /// </summary>
- UINT32 bidiLevel;
-
- /// <summary>
- /// Geometry encloses text?
- /// </summary>
- BOOL isText;
-
- /// <summary>
- /// Range is trimmed.
- /// </summary>
- BOOL isTrimmed;
-};
-
-
-interface IDWriteTextRenderer;
-
-
-/// <summary>
-/// The IDWriteInlineObject interface wraps an application defined inline graphic,
-/// allowing DWrite to query metrics as if it was a glyph inline with the text.
-/// </summary>
-interface DWRITE_DECLARE_INTERFACE("8339FDE3-106F-47ab-8373-1C6295EB10B3") IDWriteInlineObject : public IUnknown
-{
- /// <summary>
- /// The application implemented rendering callback (IDWriteTextRenderer::DrawInlineObject)
- /// can use this to draw the inline object without needing to cast or query the object
- /// type. The text layout does not call this method directly.
- /// </summary>
- /// <param name="clientDrawingContext">The context passed to IDWriteTextLayout::Draw.</param>
- /// <param name="renderer">The renderer passed to IDWriteTextLayout::Draw as the object's containing parent.</param>
- /// <param name="originX">X-coordinate at the top-left corner of the inline object.</param>
- /// <param name="originY">Y-coordinate at the top-left corner of the inline object.</param>
- /// <param name="isSideways">The object should be drawn on its side.</param>
- /// <param name="isRightToLeft">The object is in an right-to-left context and should be drawn flipped.</param>
- /// <param name="clientDrawingEffect">The drawing effect set in IDWriteTextLayout::SetDrawingEffect.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(Draw)(
- __maybenull void* clientDrawingContext,
- IDWriteTextRenderer* renderer,
- FLOAT originX,
- FLOAT originY,
- BOOL isSideways,
- BOOL isRightToLeft,
- __maybenull IUnknown* clientDrawingEffect
- ) PURE;
-
- /// <summary>
- /// TextLayout calls this callback function to get the measurement of the inline object.
- /// </summary>
- /// <param name="metrics">Returned metrics</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(GetMetrics)(
- __out DWRITE_INLINE_OBJECT_METRICS* metrics
- ) PURE;
-
- /// <summary>
- /// TextLayout calls this callback function to get the visible extents (in DIPs) of the inline object.
- /// In the case of a simple bitmap, with no padding and no overhang, all the overhangs will
- /// simply be zeroes.
- /// </summary>
- /// <param name="overhangs">Overshoot of visible extents (in DIPs) outside the object.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- /// <remarks>
- /// The overhangs should be returned relative to the reported size of the object
- /// (DWRITE_INLINE_OBJECT_METRICS::width/height), and should not be baseline
- /// adjusted. If you have an image that is actually 100x100 DIPs, but you want it
- /// slightly inset (perhaps it has a glow) by 20 DIPs on each side, you would
- /// return a width/height of 60x60 and four overhangs of 20 DIPs.
- /// </remarks>
- STDMETHOD(GetOverhangMetrics)(
- __out DWRITE_OVERHANG_METRICS* overhangs
- ) PURE;
-
- /// <summary>
- /// Layout uses this to determine the line breaking behavior of the inline object
- /// amidst the text.
- /// </summary>
- /// <param name="breakConditionBefore">Line-breaking condition between the object and the content immediately preceding it.</param>
- /// <param name="breakConditionAfter" >Line-breaking condition between the object and the content immediately following it.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(GetBreakConditions)(
- __out DWRITE_BREAK_CONDITION* breakConditionBefore,
- __out DWRITE_BREAK_CONDITION* breakConditionAfter
- ) PURE;
-};
-
-/// <summary>
-/// The IDWritePixelSnapping interface defines the pixel snapping properties of a text renderer.
-/// </summary>
-interface DWRITE_DECLARE_INTERFACE("eaf3a2da-ecf4-4d24-b644-b34f6842024b") IDWritePixelSnapping : public IUnknown
-{
- /// <summary>
- /// Determines whether pixel snapping is disabled. The recommended default is FALSE,
- /// unless doing animation that requires subpixel vertical placement.
- /// </summary>
- /// <param name="clientDrawingContext">The context passed to IDWriteTextLayout::Draw.</param>
- /// <param name="isDisabled">Receives TRUE if pixel snapping is disabled or FALSE if it not.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(IsPixelSnappingDisabled)(
- __maybenull void* clientDrawingContext,
- __out BOOL* isDisabled
- ) PURE;
-
- /// <summary>
- /// Gets the current transform that maps abstract coordinates to DIPs,
- /// which may disable pixel snapping upon any rotation or shear.
- /// </summary>
- /// <param name="clientDrawingContext">The context passed to IDWriteTextLayout::Draw.</param>
- /// <param name="transform">Receives the transform.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(GetCurrentTransform)(
- __maybenull void* clientDrawingContext,
- __out DWRITE_MATRIX* transform
- ) PURE;
-
- /// <summary>
- /// Gets the number of physical pixels per DIP. A DIP (device-independent pixel) is 1/96 inch,
- /// so the pixelsPerDip value is the number of logical pixels per inch divided by 96 (yielding
- /// a value of 1 for 96 DPI and 1.25 for 120).
- /// </summary>
- /// <param name="clientDrawingContext">The context passed to IDWriteTextLayout::Draw.</param>
- /// <param name="pixelsPerDip">Receives the number of physical pixels per DIP.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(GetPixelsPerDip)(
- __maybenull void* clientDrawingContext,
- __out FLOAT* pixelsPerDip
- ) PURE;
-};
-
-/// <summary>
-/// The IDWriteTextLayout interface represents a set of application-defined
-/// callbacks that perform rendering of text, inline objects, and decorations
-/// such as underlines.
-/// </summary>
-interface DWRITE_DECLARE_INTERFACE("ef8a8135-5cc6-45fe-8825-c5a0724eb819") IDWriteTextRenderer : public IDWritePixelSnapping
-{
- /// <summary>
- /// IDWriteTextLayout::Draw calls this function to instruct the client to
- /// render a run of glyphs.
- /// </summary>
- /// <param name="clientDrawingContext">The context passed to
- /// IDWriteTextLayout::Draw.</param>
- /// <param name="baselineOriginX">X-coordinate of the baseline.</param>
- /// <param name="baselineOriginY">Y-coordinate of the baseline.</param>
- /// <param name="measuringMode">Specifies measuring method for glyphs in the run.
- /// Renderer implementations may choose different rendering modes for given measuring methods,
- /// but best results are seen when the rendering mode matches the corresponding measuring mode:
- /// DWRITE_RENDERING_MODE_CLEARTYPE_NATURAL for DWRITE_MEASURING_MODE_NATURAL
- /// DWRITE_RENDERING_MODE_CLEARTYPE_GDI_CLASSIC for DWRITE_MEASURING_MODE_GDI_CLASSIC
- /// DWRITE_RENDERING_MODE_CLEARTYPE_GDI_NATURAL for DWRITE_MEASURING_MODE_GDI_NATURAL
- /// </param>
- /// <param name="glyphRun">The glyph run to draw.</param>
- /// <param name="glyphRunDescription">Properties of the characters
- /// associated with this run.</param>
- /// <param name="clientDrawingEffect">The drawing effect set in
- /// IDWriteTextLayout::SetDrawingEffect.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(DrawGlyphRun)(
- __maybenull void* clientDrawingContext,
- FLOAT baselineOriginX,
- FLOAT baselineOriginY,
- DWRITE_MEASURING_MODE measuringMode,
- __in DWRITE_GLYPH_RUN const* glyphRun,
- __in DWRITE_GLYPH_RUN_DESCRIPTION const* glyphRunDescription,
- __maybenull IUnknown* clientDrawingEffect
- ) PURE;
-
- /// <summary>
- /// IDWriteTextLayout::Draw calls this function to instruct the client to draw
- /// an underline.
- /// </summary>
- /// <param name="clientDrawingContext">The context passed to
- /// IDWriteTextLayout::Draw.</param>
- /// <param name="baselineOriginX">X-coordinate of the baseline.</param>
- /// <param name="baselineOriginY">Y-coordinate of the baseline.</param>
- /// <param name="underline">Underline logical information.</param>
- /// <param name="clientDrawingEffect">The drawing effect set in
- /// IDWriteTextLayout::SetDrawingEffect.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- /// <remarks>
- /// A single underline can be broken into multiple calls, depending on
- /// how the formatting changes attributes. If font sizes/styles change
- /// within an underline, the thickness and offset will be averaged
- /// weighted according to characters.
- /// To get the correct top coordinate of the underline rect, add underline::offset
- /// to the baseline's Y. Otherwise the underline will be immediately under the text.
- /// The x coordinate will always be passed as the left side, regardless
- /// of text directionality. This simplifies drawing and reduces the
- /// problem of round-off that could potentially cause gaps or a double
- /// stamped alpha blend. To avoid alpha overlap, round the end points
- /// to the nearest device pixel.
- /// </remarks>
- STDMETHOD(DrawUnderline)(
- __maybenull void* clientDrawingContext,
- FLOAT baselineOriginX,
- FLOAT baselineOriginY,
- __in DWRITE_UNDERLINE const* underline,
- __maybenull IUnknown* clientDrawingEffect
- ) PURE;
-
- /// <summary>
- /// IDWriteTextLayout::Draw calls this function to instruct the client to draw
- /// a strikethrough.
- /// </summary>
- /// <param name="clientDrawingContext">The context passed to
- /// IDWriteTextLayout::Draw.</param>
- /// <param name="baselineOriginX">X-coordinate of the baseline.</param>
- /// <param name="baselineOriginY">Y-coordinate of the baseline.</param>
- /// <param name="strikethrough">Strikethrough logical information.</param>
- /// <param name="clientDrawingEffect">The drawing effect set in
- /// IDWriteTextLayout::SetDrawingEffect.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- /// <remarks>
- /// A single strikethrough can be broken into multiple calls, depending on
- /// how the formatting changes attributes. Strikethrough is not averaged
- /// across font sizes/styles changes.
- /// To get the correct top coordinate of the strikethrough rect,
- /// add strikethrough::offset to the baseline's Y.
- /// Like underlines, the x coordinate will always be passed as the left side,
- /// regardless of text directionality.
- /// </remarks>
- STDMETHOD(DrawStrikethrough)(
- __maybenull void* clientDrawingContext,
- FLOAT baselineOriginX,
- FLOAT baselineOriginY,
- __in DWRITE_STRIKETHROUGH const* strikethrough,
- __maybenull IUnknown* clientDrawingEffect
- ) PURE;
-
- /// <summary>
- /// IDWriteTextLayout::Draw calls this application callback when it needs to
- /// draw an inline object.
- /// </summary>
- /// <param name="clientDrawingContext">The context passed to IDWriteTextLayout::Draw.</param>
- /// <param name="originX">X-coordinate at the top-left corner of the inline object.</param>
- /// <param name="originY">Y-coordinate at the top-left corner of the inline object.</param>
- /// <param name="inlineObject">The object set using IDWriteTextLayout::SetInlineObject.</param>
- /// <param name="isSideways">The object should be drawn on its side.</param>
- /// <param name="isRightToLeft">The object is in an right-to-left context and should be drawn flipped.</param>
- /// <param name="clientDrawingEffect">The drawing effect set in
- /// IDWriteTextLayout::SetDrawingEffect.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- /// <remarks>
- /// The right-to-left flag is a hint for those cases where it would look
- /// strange for the image to be shown normally (like an arrow pointing to
- /// right to indicate a submenu).
- /// </remarks>
- STDMETHOD(DrawInlineObject)(
- __maybenull void* clientDrawingContext,
- FLOAT originX,
- FLOAT originY,
- IDWriteInlineObject* inlineObject,
- BOOL isSideways,
- BOOL isRightToLeft,
- __maybenull IUnknown* clientDrawingEffect
- ) PURE;
-};
-
-/// <summary>
-/// The IDWriteTextLayout interface represents a block of text after it has
-/// been fully analyzed and formatted.
-///
-/// All coordinates are in device independent pixels (DIPs).
-/// </summary>
-interface DWRITE_DECLARE_INTERFACE("53737037-6d14-410b-9bfe-0b182bb70961") IDWriteTextLayout : public IDWriteTextFormat
-{
- /// <summary>
- /// Set layout maximum width
- /// </summary>
- /// <param name="maxWidth">Layout maximum width</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(SetMaxWidth)(
- FLOAT maxWidth
- ) PURE;
-
- /// <summary>
- /// Set layout maximum height
- /// </summary>
- /// <param name="maxHeight">Layout maximum height</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(SetMaxHeight)(
- FLOAT maxHeight
- ) PURE;
-
- /// <summary>
- /// Set the font collection.
- /// </summary>
- /// <param name="fontCollection">The font collection to set</param>
- /// <param name="textRange">Text range to which this change applies.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(SetFontCollection)(
- IDWriteFontCollection* fontCollection,
- DWRITE_TEXT_RANGE textRange
- ) PURE;
-
- /// <summary>
- /// Set null-terminated font family name.
- /// </summary>
- /// <param name="fontFamilyName">Font family name</param>
- /// <param name="textRange">Text range to which this change applies.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(SetFontFamilyName)(
- __in_z WCHAR const* fontFamilyName,
- DWRITE_TEXT_RANGE textRange
- ) PURE;
-
- /// <summary>
- /// Set font weight.
- /// </summary>
- /// <param name="fontWeight">Font weight</param>
- /// <param name="textRange">Text range to which this change applies.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(SetFontWeight)(
- DWRITE_FONT_WEIGHT fontWeight,
- DWRITE_TEXT_RANGE textRange
- ) PURE;
-
- /// <summary>
- /// Set font style.
- /// </summary>
- /// <param name="fontStyle">Font style</param>
- /// <param name="textRange">Text range to which this change applies.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(SetFontStyle)(
- DWRITE_FONT_STYLE fontStyle,
- DWRITE_TEXT_RANGE textRange
- ) PURE;
-
- /// <summary>
- /// Set font stretch.
- /// </summary>
- /// <param name="fontStretch">font stretch</param>
- /// <param name="textRange">Text range to which this change applies.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(SetFontStretch)(
- DWRITE_FONT_STRETCH fontStretch,
- DWRITE_TEXT_RANGE textRange
- ) PURE;
-
- /// <summary>
- /// Set font em height.
- /// </summary>
- /// <param name="fontSize">Font em height</param>
- /// <param name="textRange">Text range to which this change applies.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(SetFontSize)(
- FLOAT fontSize,
- DWRITE_TEXT_RANGE textRange
- ) PURE;
-
- /// <summary>
- /// Set underline.
- /// </summary>
- /// <param name="hasUnderline">The Boolean flag indicates whether underline takes place</param>
- /// <param name="textRange">Text range to which this change applies.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(SetUnderline)(
- BOOL hasUnderline,
- DWRITE_TEXT_RANGE textRange
- ) PURE;
-
- /// <summary>
- /// Set strikethrough.
- /// </summary>
- /// <param name="hasStrikethrough">The Boolean flag indicates whether strikethrough takes place</param>
- /// <param name="textRange">Text range to which this change applies.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(SetStrikethrough)(
- BOOL hasStrikethrough,
- DWRITE_TEXT_RANGE textRange
- ) PURE;
-
- /// <summary>
- /// Set application-defined drawing effect.
- /// </summary>
- /// <param name="drawingEffect">Pointer to an application-defined drawing effect.</param>
- /// <param name="textRange">Text range to which this change applies.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- /// <remarks>
- /// This drawing effect is associated with the specified range and will be passed back
- /// to the application via the callback when the range is drawn at drawing time.
- /// </remarks>
- STDMETHOD(SetDrawingEffect)(
- IUnknown* drawingEffect,
- DWRITE_TEXT_RANGE textRange
- ) PURE;
-
- /// <summary>
- /// Set inline object.
- /// </summary>
- /// <param name="inlineObject">Pointer to an application-implemented inline object.</param>
- /// <param name="textRange">Text range to which this change applies.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- /// <remarks>
- /// This inline object applies to the specified range and will be passed back
- /// to the application via the DrawInlineObject callback when the range is drawn.
- /// Any text in that range will be suppressed.
- /// </remarks>
- STDMETHOD(SetInlineObject)(
- IDWriteInlineObject* inlineObject,
- DWRITE_TEXT_RANGE textRange
- ) PURE;
-
- /// <summary>
- /// Set font typography features.
- /// </summary>
- /// <param name="typography">Pointer to font typography setting.</param>
- /// <param name="textRange">Text range to which this change applies.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(SetTypography)(
- IDWriteTypography* typography,
- DWRITE_TEXT_RANGE textRange
- ) PURE;
-
- /// <summary>
- /// Set locale name.
- /// </summary>
- /// <param name="localeName">Locale name</param>
- /// <param name="textRange">Text range to which this change applies.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(SetLocaleName)(
- __in_z WCHAR const* localeName,
- DWRITE_TEXT_RANGE textRange
- ) PURE;
-
- /// <summary>
- /// Get layout maximum width
- /// </summary>
- STDMETHOD_(FLOAT, GetMaxWidth)() PURE;
-
- /// <summary>
- /// Get layout maximum height
- /// </summary>
- STDMETHOD_(FLOAT, GetMaxHeight)() PURE;
-
- /// <summary>
- /// Get the font collection where the current position is at.
- /// </summary>
- /// <param name="currentPosition">The current text position.</param>
- /// <param name="fontCollection">The current font collection</param>
- /// <param name="textRange">Text range to which this change applies.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(GetFontCollection)(
- UINT32 currentPosition,
- __out IDWriteFontCollection** fontCollection,
- __out_opt DWRITE_TEXT_RANGE* textRange = NULL
- ) PURE;
-
- /// <summary>
- /// Get the length of the font family name where the current position is at.
- /// </summary>
- /// <param name="currentPosition">The current text position.</param>
- /// <param name="nameLength">Size of the character array in character count not including the terminated NULL character.</param>
- /// <param name="textRange">The position range of the current format.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(GetFontFamilyNameLength)(
- UINT32 currentPosition,
- __out UINT32* nameLength,
- __out_opt DWRITE_TEXT_RANGE* textRange = NULL
- ) PURE;
-
- /// <summary>
- /// Copy the font family name where the current position is at.
- /// </summary>
- /// <param name="currentPosition">The current text position.</param>
- /// <param name="fontFamilyName">Character array that receives the current font family name</param>
- /// <param name="nameSize">Size of the character array in character count including the terminated NULL character.</param>
- /// <param name="textRange">The position range of the current format.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(GetFontFamilyName)(
- UINT32 currentPosition,
- __out_ecount_z(nameSize) WCHAR* fontFamilyName,
- UINT32 nameSize,
- __out_opt DWRITE_TEXT_RANGE* textRange = NULL
- ) PURE;
-
- /// <summary>
- /// Get the font weight where the current position is at.
- /// </summary>
- /// <param name="currentPosition">The current text position.</param>
- /// <param name="fontWeight">The current font weight</param>
- /// <param name="textRange">The position range of the current format.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(GetFontWeight)(
- UINT32 currentPosition,
- __out DWRITE_FONT_WEIGHT* fontWeight,
- __out_opt DWRITE_TEXT_RANGE* textRange = NULL
- ) PURE;
-
- /// <summary>
- /// Get the font style where the current position is at.
- /// </summary>
- /// <param name="currentPosition">The current text position.</param>
- /// <param name="fontStyle">The current font style</param>
- /// <param name="textRange">The position range of the current format.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(GetFontStyle)(
- UINT32 currentPosition,
- __out DWRITE_FONT_STYLE* fontStyle,
- __out_opt DWRITE_TEXT_RANGE* textRange = NULL
- ) PURE;
-
- /// <summary>
- /// Get the font stretch where the current position is at.
- /// </summary>
- /// <param name="currentPosition">The current text position.</param>
- /// <param name="fontStretch">The current font stretch</param>
- /// <param name="textRange">The position range of the current format.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(GetFontStretch)(
- UINT32 currentPosition,
- __out DWRITE_FONT_STRETCH* fontStretch,
- __out_opt DWRITE_TEXT_RANGE* textRange = NULL
- ) PURE;
-
- /// <summary>
- /// Get the font em height where the current position is at.
- /// </summary>
- /// <param name="currentPosition">The current text position.</param>
- /// <param name="fontSize">The current font em height</param>
- /// <param name="textRange">The position range of the current format.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(GetFontSize)(
- UINT32 currentPosition,
- __out FLOAT* fontSize,
- __out_opt DWRITE_TEXT_RANGE* textRange = NULL
- ) PURE;
-
- /// <summary>
- /// Get the underline presence where the current position is at.
- /// </summary>
- /// <param name="currentPosition">The current text position.</param>
- /// <param name="hasUnderline">The Boolean flag indicates whether text is underlined.</param>
- /// <param name="textRange">The position range of the current format.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(GetUnderline)(
- UINT32 currentPosition,
- __out BOOL* hasUnderline,
- __out_opt DWRITE_TEXT_RANGE* textRange = NULL
- ) PURE;
-
- /// <summary>
- /// Get the strikethrough presence where the current position is at.
- /// </summary>
- /// <param name="currentPosition">The current text position.</param>
- /// <param name="hasStrikethrough">The Boolean flag indicates whether text has strikethrough.</param>
- /// <param name="textRange">The position range of the current format.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(GetStrikethrough)(
- UINT32 currentPosition,
- __out BOOL* hasStrikethrough,
- __out_opt DWRITE_TEXT_RANGE* textRange = NULL
- ) PURE;
-
- /// <summary>
- /// Get the application-defined drawing effect where the current position is at.
- /// </summary>
- /// <param name="currentPosition">The current text position.</param>
- /// <param name="drawingEffect">The current application-defined drawing effect.</param>
- /// <param name="textRange">The position range of the current format.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(GetDrawingEffect)(
- UINT32 currentPosition,
- __out IUnknown** drawingEffect,
- __out_opt DWRITE_TEXT_RANGE* textRange = NULL
- ) PURE;
-
- /// <summary>
- /// Get the inline object at the given position.
- /// </summary>
- /// <param name="currentPosition">The given text position.</param>
- /// <param name="inlineObject">The inline object.</param>
- /// <param name="textRange">The position range of the current format.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(GetInlineObject)(
- UINT32 currentPosition,
- __out IDWriteInlineObject** inlineObject,
- __out_opt DWRITE_TEXT_RANGE* textRange = NULL
- ) PURE;
-
- /// <summary>
- /// Get the typography setting where the current position is at.
- /// </summary>
- /// <param name="currentPosition">The current text position.</param>
- /// <param name="typography">The current typography setting.</param>
- /// <param name="textRange">The position range of the current format.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(GetTypography)(
- UINT32 currentPosition,
- __out IDWriteTypography** typography,
- __out_opt DWRITE_TEXT_RANGE* textRange = NULL
- ) PURE;
-
- /// <summary>
- /// Get the length of the locale name where the current position is at.
- /// </summary>
- /// <param name="currentPosition">The current text position.</param>
- /// <param name="nameLength">Size of the character array in character count not including the terminated NULL character.</param>
- /// <param name="textRange">The position range of the current format.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(GetLocaleNameLength)(
- UINT32 currentPosition,
- __out UINT32* nameLength,
- __out_opt DWRITE_TEXT_RANGE* textRange = NULL
- ) PURE;
-
- /// <summary>
- /// Get the locale name where the current position is at.
- /// </summary>
- /// <param name="currentPosition">The current text position.</param>
- /// <param name="localeName">Character array that receives the current locale name</param>
- /// <param name="nameSize">Size of the character array in character count including the terminated NULL character.</param>
- /// <param name="textRange">The position range of the current format.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(GetLocaleName)(
- UINT32 currentPosition,
- __out_ecount_z(nameSize) WCHAR* localeName,
- UINT32 nameSize,
- __out_opt DWRITE_TEXT_RANGE* textRange = NULL
- ) PURE;
-
- /// <summary>
- /// Initiate drawing of the text.
- /// </summary>
- /// <param name="clientDrawingContext">An application defined value
- /// included in rendering callbacks.</param>
- /// <param name="renderer">The set of application-defined callbacks that do
- /// the actual rendering.</param>
- /// <param name="originX">X-coordinate of the layout's left side.</param>
- /// <param name="originY">Y-coordinate of the layout's top side.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(Draw)(
- __maybenull void* clientDrawingContext,
- IDWriteTextRenderer* renderer,
- FLOAT originX,
- FLOAT originY
- ) PURE;
-
- /// <summary>
- /// GetLineMetrics returns properties of each line.
- /// </summary>
- /// <param name="lineMetrics">The array to fill with line information.</param>
- /// <param name="maxLineCount">The maximum size of the lineMetrics array.</param>
- /// <param name="actualLineCount">The actual size of the lineMetrics
- /// array that is needed.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- /// <remarks>
- /// If maxLineCount is not large enough E_NOT_SUFFICIENT_BUFFER,
- /// which is equivalent to HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER),
- /// is returned and *actualLineCount is set to the number of lines
- /// needed.
- /// </remarks>
- STDMETHOD(GetLineMetrics)(
- __out_ecount_opt(maxLineCount) DWRITE_LINE_METRICS* lineMetrics,
- UINT32 maxLineCount,
- __out UINT32* actualLineCount
- ) PURE;
-
- /// <summary>
- /// GetMetrics retrieves overall metrics for the formatted string.
- /// </summary>
- /// <param name="textMetrics">The returned metrics.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- /// <remarks>
- /// Drawing effects like underline and strikethrough do not contribute
- /// to the text size, which is essentially the sum of advance widths and
- /// line heights. Additionally, visible swashes and other graphic
- /// adornments may extend outside the returned width and height.
- /// </remarks>
- STDMETHOD(GetMetrics)(
- __out DWRITE_TEXT_METRICS* textMetrics
- ) PURE;
-
- /// <summary>
- /// GetOverhangMetrics returns the overhangs (in DIPs) of the layout and all
- /// objects contained in it, including text glyphs and inline objects.
- /// </summary>
- /// <param name="overhangs">Overshoots of visible extents (in DIPs) outside the layout.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- /// <remarks>
- /// Any underline and strikethrough do not contribute to the black box
- /// determination, since these are actually drawn by the renderer, which
- /// is allowed to draw them in any variety of styles.
- /// </remarks>
- STDMETHOD(GetOverhangMetrics)(
- __out DWRITE_OVERHANG_METRICS* overhangs
- ) PURE;
-
- /// <summary>
- /// Retrieve logical properties and measurement of each cluster.
- /// </summary>
- /// <param name="clusterMetrics">The array to fill with cluster information.</param>
- /// <param name="maxClusterCount">The maximum size of the clusterMetrics array.</param>
- /// <param name="actualClusterCount">The actual size of the clusterMetrics array that is needed.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- /// <remarks>
- /// If maxClusterCount is not large enough E_NOT_SUFFICIENT_BUFFER,
- /// which is equivalent to HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER),
- /// is returned and *actualClusterCount is set to the number of clusters
- /// needed.
- /// </remarks>
- STDMETHOD(GetClusterMetrics)(
- __out_ecount_opt(maxClusterCount) DWRITE_CLUSTER_METRICS* clusterMetrics,
- UINT32 maxClusterCount,
- __out UINT32* actualClusterCount
- ) PURE;
-
- /// <summary>
- /// Determines the minimum possible width the layout can be set to without
- /// emergency breaking between the characters of whole words.
- /// </summary>
- /// <param name="minWidth">Minimum width.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(DetermineMinWidth)(
- __out FLOAT* minWidth
- ) PURE;
-
- /// <summary>
- /// Given a coordinate (in DIPs) relative to the top-left of the layout box,
- /// this returns the corresponding hit-test metrics of the text string where
- /// the hit-test has occurred. This is useful for mapping mouse clicks to caret
- /// positions. When the given coordinate is outside the text string, the function
- /// sets the output value *isInside to false but returns the nearest character
- /// position.
- /// </summary>
- /// <param name="pointX">X coordinate to hit-test, relative to the top-left location of the layout box.</param>
- /// <param name="pointY">Y coordinate to hit-test, relative to the top-left location of the layout box.</param>
- /// <param name="isTrailingHit">Output flag indicating whether the hit-test location is at the leading or the trailing
- /// side of the character. When the output *isInside value is set to false, this value is set according to the output
- /// *position value to represent the edge closest to the hit-test location. </param>
- /// <param name="isInside">Output flag indicating whether the hit-test location is inside the text string.
- /// When false, the position nearest the text's edge is returned.</param>
- /// <param name="hitTestMetrics">Output geometry fully enclosing the hit-test location. When the output *isInside value
- /// is set to false, this structure represents the geometry enclosing the edge closest to the hit-test location.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(HitTestPoint)(
- FLOAT pointX,
- FLOAT pointY,
- __out BOOL* isTrailingHit,
- __out BOOL* isInside,
- __out DWRITE_HIT_TEST_METRICS* hitTestMetrics
- ) PURE;
-
- /// <summary>
- /// Given a text position and whether the caret is on the leading or trailing
- /// edge of that position, this returns the corresponding coordinate (in DIPs)
- /// relative to the top-left of the layout box. This is most useful for drawing
- /// the caret's current position, but it could also be used to anchor an IME to the
- /// typed text or attach a floating menu near the point of interest. It may also be
- /// used to programmatically obtain the geometry of a particular text position
- /// for UI automation.
- /// </summary>
- /// <param name="textPosition">Text position to get the coordinate of.</param>
- /// <param name="isTrailingHit">Flag indicating whether the location is of the leading or the trailing side of the specified text position. </param>
- /// <param name="pointX">Output caret X, relative to the top-left of the layout box.</param>
- /// <param name="pointY">Output caret Y, relative to the top-left of the layout box.</param>
- /// <param name="hitTestMetrics">Output geometry fully enclosing the specified text position.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- /// <remarks>
- /// When drawing a caret at the returned X,Y, it should should be centered on X
- /// and drawn from the Y coordinate down. The height will be the size of the
- /// hit-tested text (which can vary in size within a line).
- /// Reading direction also affects which side of the character the caret is drawn.
- /// However, the returned X coordinate will be correct for either case.
- /// You can get a text length back that is larger than a single character.
- /// This happens for complex scripts when multiple characters form a single cluster,
- /// when diacritics join their base character, or when you test a surrogate pair.
- /// </remarks>
- STDMETHOD(HitTestTextPosition)(
- UINT32 textPosition,
- BOOL isTrailingHit,
- __out FLOAT* pointX,
- __out FLOAT* pointY,
- __out DWRITE_HIT_TEST_METRICS* hitTestMetrics
- ) PURE;
-
- /// <summary>
- /// The application calls this function to get a set of hit-test metrics
- /// corresponding to a range of text positions. The main usage for this
- /// is to draw highlighted selection of the text string.
- ///
- /// The function returns E_NOT_SUFFICIENT_BUFFER, which is equivalent to
- /// HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER), when the buffer size of
- /// hitTestMetrics is too small to hold all the regions calculated by the
- /// function. In such situation, the function sets the output value
- /// *actualHitTestMetricsCount to the number of geometries calculated.
- /// The application is responsible to allocate a new buffer of greater
- /// size and call the function again.
- ///
- /// A good value to use as an initial value for maxHitTestMetricsCount may
- /// be calculated from the following equation:
- /// maxHitTestMetricsCount = lineCount * maxBidiReorderingDepth
- ///
- /// where lineCount is obtained from the value of the output argument
- /// *actualLineCount from the function IDWriteTextLayout::GetLineMetrics,
- /// and the maxBidiReorderingDepth value from the DWRITE_TEXT_METRICS
- /// structure of the output argument *textMetrics from the function
- /// IDWriteFactory::CreateTextLayout.
- /// </summary>
- /// <param name="textPosition">First text position of the specified range.</param>
- /// <param name="textLength">Number of positions of the specified range.</param>
- /// <param name="originX">Offset of the X origin (left of the layout box) which is added to each of the hit-test metrics returned.</param>
- /// <param name="originY">Offset of the Y origin (top of the layout box) which is added to each of the hit-test metrics returned.</param>
- /// <param name="hitTestMetrics">Pointer to a buffer of the output geometry fully enclosing the specified position range.</param>
- /// <param name="maxHitTestMetricsCount">Maximum number of distinct metrics it could hold in its buffer memory.</param>
- /// <param name="actualHitTestMetricsCount">Actual number of metrics returned or needed.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- /// <remarks>
- /// There are no gaps in the returned metrics. While there could be visual gaps,
- /// depending on bidi ordering, each range is contiguous and reports all the text,
- /// including any hidden characters and trimmed text.
- /// The height of each returned range will be the same within each line, regardless
- /// of how the font sizes vary.
- /// </remarks>
- STDMETHOD(HitTestTextRange)(
- UINT32 textPosition,
- UINT32 textLength,
- FLOAT originX,
- FLOAT originY,
- __out_ecount_opt(maxHitTestMetricsCount) DWRITE_HIT_TEST_METRICS* hitTestMetrics,
- UINT32 maxHitTestMetricsCount,
- __out UINT32* actualHitTestMetricsCount
- ) PURE;
-};
-
-/// <summary>
-/// Encapsulates a 32-bit device independent bitmap and device context, which can be used for rendering glyphs.
-/// </summary>
-interface DWRITE_DECLARE_INTERFACE("5e5a32a3-8dff-4773-9ff6-0696eab77267") IDWriteBitmapRenderTarget : public IUnknown
-{
- /// <summary>
- /// Draws a run of glyphs to the bitmap.
- /// </summary>
- /// <param name="baselineOriginX">Horizontal position of the baseline origin, in DIPs, relative to the upper-left corner of the DIB.</param>
- /// <param name="baselineOriginY">Vertical position of the baseline origin, in DIPs, relative to the upper-left corner of the DIB.</param>
- /// <param name="measuringMode">Specifies measuring method for glyphs in the run.
- /// Renderer implementations may choose different rendering modes for different measuring methods, for example
- /// DWRITE_RENDERING_MODE_CLEARTYPE_NATURAL for DWRITE_MEASURING_MODE_NATURAL,
- /// DWRITE_RENDERING_MODE_CLEARTYPE_GDI_CLASSIC for DWRITE_MEASURING_MODE_GDI_CLASSIC, and
- /// DWRITE_RENDERING_MODE_CLEARTYPE_GDI_NATURAL for DWRITE_MEASURING_MODE_GDI_NATURAL.
- /// </param>
- /// <param name="glyphRun">Structure containing the properties of the glyph run.</param>
- /// <param name="renderingParams">Object that controls rendering behavior.</param>
- /// <param name="textColor">Specifies the foreground color of the text.</param>
- /// <param name="blackBoxRect">Optional rectangle that receives the bounding box (in pixels not DIPs) of all the pixels affected by
- /// drawing the glyph run. The black box rectangle may extend beyond the dimensions of the bitmap.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(DrawGlyphRun)(
- FLOAT baselineOriginX,
- FLOAT baselineOriginY,
- DWRITE_MEASURING_MODE measuringMode,
- __in DWRITE_GLYPH_RUN const* glyphRun,
- IDWriteRenderingParams* renderingParams,
- COLORREF textColor,
- __out_opt RECT* blackBoxRect = NULL
- ) PURE;
-
- /// <summary>
- /// Gets a handle to the memory device context.
- /// </summary>
- /// <returns>
- /// Returns the device context handle.
- /// </returns>
- /// <remarks>
- /// An application can use the device context to draw using GDI functions. An application can obtain the bitmap handle
- /// (HBITMAP) by calling GetCurrentObject. An application that wants information about the underlying bitmap, including
- /// a pointer to the pixel data, can call GetObject to fill in a DIBSECTION structure. The bitmap is always a 32-bit
- /// top-down DIB.
- /// </remarks>
- STDMETHOD_(HDC, GetMemoryDC)() PURE;
-
- /// <summary>
- /// Gets the number of bitmap pixels per DIP. A DIP (device-independent pixel) is 1/96 inch so this value is the number
- /// if pixels per inch divided by 96.
- /// </summary>
- /// <returns>
- /// Returns the number of bitmap pixels per DIP.
- /// </returns>
- STDMETHOD_(FLOAT, GetPixelsPerDip)() PURE;
-
- /// <summary>
- /// Sets the number of bitmap pixels per DIP. A DIP (device-independent pixel) is 1/96 inch so this value is the number
- /// if pixels per inch divided by 96.
- /// </summary>
- /// <param name="pixelsPerDip">Specifies the number of pixels per DIP.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(SetPixelsPerDip)(
- FLOAT pixelsPerDip
- ) PURE;
-
- /// <summary>
- /// Gets the transform that maps abstract coordinate to DIPs. By default this is the identity
- /// transform. Note that this is unrelated to the world transform of the underlying device
- /// context.
- /// </summary>
- /// <param name="transform">Receives the transform.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(GetCurrentTransform)(
- __out DWRITE_MATRIX* transform
- ) PURE;
-
- /// <summary>
- /// Sets the transform that maps abstract coordinate to DIPs. This does not affect the world
- /// transform of the underlying device context.
- /// </summary>
- /// <param name="transform">Specifies the new transform. This parameter can be NULL, in which
- /// case the identity transform is implied.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(SetCurrentTransform)(
- __in_opt DWRITE_MATRIX const* transform
- ) PURE;
-
- /// <summary>
- /// Gets the dimensions of the bitmap.
- /// </summary>
- /// <param name="size">Receives the size of the bitmap in pixels.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(GetSize)(
- __out SIZE* size
- ) PURE;
-
- /// <summary>
- /// Resizes the bitmap.
- /// </summary>
- /// <param name="width">New bitmap width, in pixels.</param>
- /// <param name="height">New bitmap height, in pixels.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(Resize)(
- UINT32 width,
- UINT32 height
- ) PURE;
-};
-
-/// <summary>
-/// The GDI interop interface provides interoperability with GDI.
-/// </summary>
-interface DWRITE_DECLARE_INTERFACE("1edd9491-9853-4299-898f-6432983b6f3a") IDWriteGdiInterop : public IUnknown
-{
- /// <summary>
- /// Creates a font object that matches the properties specified by the LOGFONT structure.
- /// </summary>
- /// <param name="logFont">Structure containing a GDI-compatible font description.</param>
- /// <param name="font">Receives a newly created font object if successful, or NULL in case of error.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(CreateFontFromLOGFONT)(
- __in LOGFONTW const* logFont,
- __out IDWriteFont** font
- ) PURE;
-
- /// <summary>
- /// Initializes a LOGFONT structure based on the GDI-compatible properties of the specified font.
- /// </summary>
- /// <param name="font">Specifies a font in the system font collection.</param>
- /// <param name="logFont">Structure that receives a GDI-compatible font description.</param>
- /// <param name="isSystemFont">Contains TRUE if the specified font object is part of the system font collection
- /// or FALSE otherwise.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(ConvertFontToLOGFONT)(
- IDWriteFont* font,
- __out LOGFONTW* logFont,
- __out BOOL* isSystemFont
- ) PURE;
-
- /// <summary>
- /// Initializes a LOGFONT structure based on the GDI-compatible properties of the specified font.
- /// </summary>
- /// <param name="font">Specifies a font face.</param>
- /// <param name="logFont">Structure that receives a GDI-compatible font description.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(ConvertFontFaceToLOGFONT)(
- IDWriteFontFace* font,
- __out LOGFONTW* logFont
- ) PURE;
-
- /// <summary>
- /// Creates a font face object that corresponds to the currently selected HFONT.
- /// </summary>
- /// <param name="hdc">Handle to a device context into which a font has been selected. It is assumed that the client
- /// has already performed font mapping and that the font selected into the DC is the actual font that would be used
- /// for rendering glyphs.</param>
- /// <param name="fontFace">Contains the newly created font face object, or NULL in case of failure.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(CreateFontFaceFromHdc)(
- HDC hdc,
- __out IDWriteFontFace** fontFace
- ) PURE;
-
- /// <summary>
- /// Creates an object that encapsulates a bitmap and memory DC which can be used for rendering glyphs.
- /// </summary>
- /// <param name="hdc">Optional device context used to create a compatible memory DC.</param>
- /// <param name="width">Width of the bitmap.</param>
- /// <param name="height">Height of the bitmap.</param>
- /// <param name="renderTarget">Receives a pointer to the newly created render target.</param>
- STDMETHOD(CreateBitmapRenderTarget)(
- __in_opt HDC hdc,
- UINT32 width,
- UINT32 height,
- __out IDWriteBitmapRenderTarget** renderTarget
- ) PURE;
-};
-
-/// <summary>
-/// The DWRITE_TEXTURE_TYPE enumeration identifies a type of alpha texture. An alpha texture is a bitmap of alpha values, each
-/// representing the darkness (i.e., opacity) of a pixel or subpixel.
-/// </summary>
-enum DWRITE_TEXTURE_TYPE
-{
- /// <summary>
- /// Specifies an alpha texture for aliased text rendering (i.e., bi-level, where each pixel is either fully opaque or fully transparent),
- /// with one byte per pixel.
- /// </summary>
- DWRITE_TEXTURE_ALIASED_1x1,
-
- /// <summary>
- /// Specifies an alpha texture for ClearType text rendering, with three bytes per pixel in the horizontal dimension and
- /// one byte per pixel in the vertical dimension.
- /// </summary>
- DWRITE_TEXTURE_CLEARTYPE_3x1
-};
-
-/// <summary>
-/// Maximum alpha value in a texture returned by IDWriteGlyphRunAnalysis::CreateAlphaTexture.
-/// </summary>
-#define DWRITE_ALPHA_MAX 255
-
-/// <summary>
-/// Interface that encapsulates information used to render a glyph run.
-/// </summary>
-interface DWRITE_DECLARE_INTERFACE("7d97dbf7-e085-42d4-81e3-6a883bded118") IDWriteGlyphRunAnalysis : public IUnknown
-{
- /// <summary>
- /// Gets the bounding rectangle of the physical pixels affected by the glyph run.
- /// </summary>
- /// <param name="textureType">Specifies the type of texture requested. If a bi-level texture is requested, the
- /// bounding rectangle includes only bi-level glyphs. Otherwise, the bounding rectangle includes only anti-aliased
- /// glyphs.</param>
- /// <param name="textureBounds">Receives the bounding rectangle, or an empty rectangle if there are no glyphs
- /// if the specified type.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(GetAlphaTextureBounds)(
- DWRITE_TEXTURE_TYPE textureType,
- __out RECT* textureBounds
- ) PURE;
-
- /// <summary>
- /// Creates an alpha texture of the specified type.
- /// </summary>
- /// <param name="textureType">Specifies the type of texture requested. If a bi-level texture is requested, the
- /// texture contains only bi-level glyphs. Otherwise, the texture contains only anti-aliased glyphs.</param>
- /// <param name="textureBounds">Specifies the bounding rectangle of the texture, which can be different than
- /// the bounding rectangle returned by GetAlphaTextureBounds.</param>
- /// <param name="alphaValues">Receives the array of alpha values.</param>
- /// <param name="bufferSize">Size of the alphaValues array. The minimum size depends on the dimensions of the
- /// rectangle and the type of texture requested.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(CreateAlphaTexture)(
- DWRITE_TEXTURE_TYPE textureType,
- __in RECT const* textureBounds,
- __out_bcount(bufferSize) BYTE* alphaValues,
- UINT32 bufferSize
- ) PURE;
-
- /// <summary>
- /// Gets properties required for ClearType blending.
- /// </summary>
- /// <param name="renderingParams">Rendering parameters object. In most cases, the values returned in the output
- /// parameters are based on the properties of this object. The exception is if a GDI-compatible rendering mode
- /// is specified.</param>
- /// <param name="blendGamma">Receives the gamma value to use for gamma correction.</param>
- /// <param name="blendEnhancedContrast">Receives the enhanced contrast value.</param>
- /// <param name="blendClearTypeLevel">Receives the ClearType level.</param>
- STDMETHOD(GetAlphaBlendParams)(
- IDWriteRenderingParams* renderingParams,
- __out FLOAT* blendGamma,
- __out FLOAT* blendEnhancedContrast,
- __out FLOAT* blendClearTypeLevel
- ) PURE;
-};
-
-/// <summary>
-/// The root factory interface for all DWrite objects.
-/// </summary>
-interface DWRITE_DECLARE_INTERFACE("b859ee5a-d838-4b5b-a2e8-1adc7d93db48") IDWriteFactory : public IUnknown
-{
- /// <summary>
- /// Gets a font collection representing the set of installed fonts.
- /// </summary>
- /// <param name="fontCollection">Receives a pointer to the system font collection object, or NULL in case of failure.</param>
- /// <param name="checkForUpdates">If this parameter is nonzero, the function performs an immediate check for changes to the set of
- /// installed fonts. If this parameter is FALSE, the function will still detect changes if the font cache service is running, but
- /// there may be some latency. For example, an application might specify TRUE if it has itself just installed a font and wants to
- /// be sure the font collection contains that font.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(GetSystemFontCollection)(
- __out IDWriteFontCollection** fontCollection,
- BOOL checkForUpdates = FALSE
- ) PURE;
-
- /// <summary>
- /// Creates a font collection using a custom font collection loader.
- /// </summary>
- /// <param name="collectionLoader">Application-defined font collection loader, which must have been previously
- /// registered using RegisterFontCollectionLoader.</param>
- /// <param name="collectionKey">Key used by the loader to identify a collection of font files.</param>
- /// <param name="collectionKeySize">Size in bytes of the collection key.</param>
- /// <param name="fontCollection">Receives a pointer to the system font collection object, or NULL in case of failure.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(CreateCustomFontCollection)(
- IDWriteFontCollectionLoader* collectionLoader,
- __in_bcount(collectionKeySize) void const* collectionKey,
- UINT32 collectionKeySize,
- __out IDWriteFontCollection** fontCollection
- ) PURE;
-
- /// <summary>
- /// Registers a custom font collection loader with the factory object.
- /// </summary>
- /// <param name="fontCollectionLoader">Application-defined font collection loader.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(RegisterFontCollectionLoader)(
- IDWriteFontCollectionLoader* fontCollectionLoader
- ) PURE;
-
- /// <summary>
- /// Unregisters a custom font collection loader that was previously registered using RegisterFontCollectionLoader.
- /// </summary>
- /// <param name="fontCollectionLoader">Application-defined font collection loader.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(UnregisterFontCollectionLoader)(
- IDWriteFontCollectionLoader* fontCollectionLoader
- ) PURE;
-
- /// <summary>
- /// CreateFontFileReference creates a font file reference object from a local font file.
- /// </summary>
- /// <param name="filePath">Absolute file path. Subsequent operations on the constructed object may fail
- /// if the user provided filePath doesn't correspond to a valid file on the disk.</param>
- /// <param name="lastWriteTime">Last modified time of the input file path. If the parameter is omitted,
- /// the function will access the font file to obtain its last write time, so the clients are encouraged to specify this value
- /// to avoid extra disk access. Subsequent operations on the constructed object may fail
- /// if the user provided lastWriteTime doesn't match the file on the disk.</param>
- /// <param name="fontFile">Contains newly created font file reference object, or NULL in case of failure.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(CreateFontFileReference)(
- __in_z WCHAR const* filePath,
- __in_opt FILETIME const* lastWriteTime,
- __out IDWriteFontFile** fontFile
- ) PURE;
-
- /// <summary>
- /// CreateCustomFontFileReference creates a reference to an application specific font file resource.
- /// This function enables an application or a document to use a font without having to install it on the system.
- /// The fontFileReferenceKey has to be unique only in the scope of the fontFileLoader used in this call.
- /// </summary>
- /// <param name="fontFileReferenceKey">Font file reference key that uniquely identifies the font file resource
- /// during the lifetime of fontFileLoader.</param>
- /// <param name="fontFileReferenceKeySize">Size of font file reference key in bytes.</param>
- /// <param name="fontFileLoader">Font file loader that will be used by the font system to load data from the file identified by
- /// fontFileReferenceKey.</param>
- /// <param name="fontFile">Contains the newly created font file object, or NULL in case of failure.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- /// <remarks>
- /// This function is provided for cases when an application or a document needs to use a font
- /// without having to install it on the system. fontFileReferenceKey has to be unique only in the scope
- /// of the fontFileLoader used in this call.
- /// </remarks>
- STDMETHOD(CreateCustomFontFileReference)(
- __in_bcount(fontFileReferenceKeySize) void const* fontFileReferenceKey,
- UINT32 fontFileReferenceKeySize,
- IDWriteFontFileLoader* fontFileLoader,
- __out IDWriteFontFile** fontFile
- ) PURE;
-
- /// <summary>
- /// Creates a font face object.
- /// </summary>
- /// <param name="fontFaceType">The file format of the font face.</param>
- /// <param name="numberOfFiles">The number of font files require to represent the font face.</param>
- /// <param name="fontFiles">Font files representing the font face. Since IDWriteFontFace maintains its own references
- /// to the input font file objects, it's OK to release them after this call.</param>
- /// <param name="faceIndex">The zero based index of a font face in cases when the font files contain a collection of font faces.
- /// If the font files contain a single face, this value should be zero.</param>
- /// <param name="fontFaceSimulationFlags">Font face simulation flags for algorithmic emboldening and italicization.</param>
- /// <param name="fontFace">Contains the newly created font face object, or NULL in case of failure.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(CreateFontFace)(
- DWRITE_FONT_FACE_TYPE fontFaceType,
- UINT32 numberOfFiles,
- __in_ecount(numberOfFiles) IDWriteFontFile* const* fontFiles,
- UINT32 faceIndex,
- DWRITE_FONT_SIMULATIONS fontFaceSimulationFlags,
- __out IDWriteFontFace** fontFace
- ) PURE;
-
- /// <summary>
- /// Creates a rendering parameters object with default settings for the primary monitor.
- /// </summary>
- /// <param name="renderingParams">Holds the newly created rendering parameters object, or NULL in case of failure.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(CreateRenderingParams)(
- __out IDWriteRenderingParams** renderingParams
- ) PURE;
-
- /// <summary>
- /// Creates a rendering parameters object with default settings for the specified monitor.
- /// </summary>
- /// <param name="monitor">The monitor to read the default values from.</param>
- /// <param name="renderingParams">Holds the newly created rendering parameters object, or NULL in case of failure.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(CreateMonitorRenderingParams)(
- HMONITOR monitor,
- __out IDWriteRenderingParams** renderingParams
- ) PURE;
-
- /// <summary>
- /// Creates a rendering parameters object with the specified properties.
- /// </summary>
- /// <param name="gamma">The gamma value used for gamma correction, which must be greater than zero and cannot exceed 256.</param>
- /// <param name="enhancedContrast">The amount of contrast enhancement, zero or greater.</param>
- /// <param name="clearTypeLevel">The degree of ClearType level, from 0.0f (no ClearType) to 1.0f (full ClearType).</param>
- /// <param name="pixelGeometry">The geometry of a device pixel.</param>
- /// <param name="renderingMode">Method of rendering glyphs. In most cases, this should be DWRITE_RENDERING_MODE_DEFAULT to automatically use an appropriate mode.</param>
- /// <param name="renderingParams">Holds the newly created rendering parameters object, or NULL in case of failure.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(CreateCustomRenderingParams)(
- FLOAT gamma,
- FLOAT enhancedContrast,
- FLOAT clearTypeLevel,
- DWRITE_PIXEL_GEOMETRY pixelGeometry,
- DWRITE_RENDERING_MODE renderingMode,
- __out IDWriteRenderingParams** renderingParams
- ) PURE;
-
- /// <summary>
- /// Registers a font file loader with DirectWrite.
- /// </summary>
- /// <param name="fontFileLoader">Pointer to the implementation of the IDWriteFontFileLoader for a particular file resource type.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- /// <remarks>
- /// This function registers a font file loader with DirectWrite.
- /// Font file loader interface handles loading font file resources of a particular type from a key.
- /// The font file loader interface is recommended to be implemented by a singleton object.
- /// A given instance can only be registered once.
- /// Succeeding attempts will return an error that it has already been registered.
- /// IMPORTANT: font file loader implementations must not register themselves with DirectWrite
- /// inside their constructors and must not unregister themselves in their destructors, because
- /// registration and unregistraton operations increment and decrement the object reference count respectively.
- /// Instead, registration and unregistration of font file loaders with DirectWrite should be performed
- /// outside of the font file loader implementation as a separate step.
- /// </remarks>
- STDMETHOD(RegisterFontFileLoader)(
- IDWriteFontFileLoader* fontFileLoader
- ) PURE;
-
- /// <summary>
- /// Unregisters a font file loader that was previously registered with the DirectWrite font system using RegisterFontFileLoader.
- /// </summary>
- /// <param name="fontFileLoader">Pointer to the file loader that was previously registered with the DirectWrite font system using RegisterFontFileLoader.</param>
- /// <returns>
- /// This function will succeed if the user loader is requested to be removed.
- /// It will fail if the pointer to the file loader identifies a standard DirectWrite loader,
- /// or a loader that is never registered or has already been unregistered.
- /// </returns>
- /// <remarks>
- /// This function unregisters font file loader callbacks with the DirectWrite font system.
- /// The font file loader interface is recommended to be implemented by a singleton object.
- /// IMPORTANT: font file loader implementations must not register themselves with DirectWrite
- /// inside their constructors and must not unregister themselves in their destructors, because
- /// registration and unregistraton operations increment and decrement the object reference count respectively.
- /// Instead, registration and unregistration of font file loaders with DirectWrite should be performed
- /// outside of the font file loader implementation as a separate step.
- /// </remarks>
- STDMETHOD(UnregisterFontFileLoader)(
- IDWriteFontFileLoader* fontFileLoader
- ) PURE;
-
- /// <summary>
- /// Create a text format object used for text layout.
- /// </summary>
- /// <param name="fontFamilyName">Name of the font family</param>
- /// <param name="fontCollection">Font collection. NULL indicates the system font collection.</param>
- /// <param name="fontWeight">Font weight</param>
- /// <param name="fontStyle">Font style</param>
- /// <param name="fontStretch">Font stretch</param>
- /// <param name="fontSize">Logical size of the font in DIP units. A DIP ("device-independent pixel") equals 1/96 inch.</param>
- /// <param name="localeName">Locale name</param>
- /// <param name="textFormat">Contains newly created text format object, or NULL in case of failure.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(CreateTextFormat)(
- __in_z WCHAR const* fontFamilyName,
- __maybenull IDWriteFontCollection* fontCollection,
- DWRITE_FONT_WEIGHT fontWeight,
- DWRITE_FONT_STYLE fontStyle,
- DWRITE_FONT_STRETCH fontStretch,
- FLOAT fontSize,
- __in_z WCHAR const* localeName,
- __out IDWriteTextFormat** textFormat
- ) PURE;
-
- /// <summary>
- /// Create a typography object used in conjunction with text format for text layout.
- /// </summary>
- /// <param name="typography">Contains newly created typography object, or NULL in case of failure.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(CreateTypography)(
- __out IDWriteTypography** typography
- ) PURE;
-
- /// <summary>
- /// Create an object used for interoperability with GDI.
- /// </summary>
- /// <param name="gdiInterop">Receives the GDI interop object if successful, or NULL in case of failure.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(GetGdiInterop)(
- __out IDWriteGdiInterop** gdiInterop
- ) PURE;
-
- /// <summary>
- /// CreateTextLayout takes a string, format, and associated constraints
- /// and produces and object representing the fully analyzed
- /// and formatted result.
- /// </summary>
- /// <param name="string">The string to layout.</param>
- /// <param name="stringLength">The length of the string.</param>
- /// <param name="textFormat">The format to apply to the string.</param>
- /// <param name="maxWidth">Width of the layout box.</param>
- /// <param name="maxHeight">Height of the layout box.</param>
- /// <param name="textLayout">The resultant object.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(CreateTextLayout)(
- __in_ecount(stringLength) WCHAR const* string,
- UINT32 stringLength,
- IDWriteTextFormat* textFormat,
- FLOAT maxWidth,
- FLOAT maxHeight,
- __out IDWriteTextLayout** textLayout
- ) PURE;
-
- /// <summary>
- /// CreateGdiCompatibleTextLayout takes a string, format, and associated constraints
- /// and produces and object representing the result formatted for a particular display resolution
- /// and measuring method. The resulting text layout should only be used for the intended resolution,
- /// and for cases where text scalability is desired, CreateTextLayout should be used instead.
- /// </summary>
- /// <param name="string">The string to layout.</param>
- /// <param name="stringLength">The length of the string.</param>
- /// <param name="textFormat">The format to apply to the string.</param>
- /// <param name="layoutWidth">Width of the layout box.</param>
- /// <param name="layoutHeight">Height of the layout box.</param>
- /// <param name="pixelsPerDip">Number of physical pixels per DIP. For example, if rendering onto a 96 DPI device then pixelsPerDip
- /// is 1. If rendering onto a 120 DPI device then pixelsPerDip is 120/96.</param>
- /// <param name="transform">Optional transform applied to the glyphs and their positions. This transform is applied after the
- /// scaling specified the font size and pixelsPerDip.</param>
- /// <param name="useGdiNatural">
- /// When set to FALSE, instructs the text layout to use the same metrics as GDI aliased text.
- /// When set to TRUE, instructs the text layout to use the same metrics as text measured by GDI using a font
- /// created with CLEARTYPE_NATURAL_QUALITY.
- /// </param>
- /// <param name="textLayout">The resultant object.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(CreateGdiCompatibleTextLayout)(
- __in_ecount(stringLength) WCHAR const* string,
- UINT32 stringLength,
- IDWriteTextFormat* textFormat,
- FLOAT layoutWidth,
- FLOAT layoutHeight,
- FLOAT pixelsPerDip,
- __in_opt DWRITE_MATRIX const* transform,
- BOOL useGdiNatural,
- __out IDWriteTextLayout** textLayout
- ) PURE;
-
- /// <summary>
- /// The application may call this function to create an inline object for trimming, using an ellipsis as the omission sign.
- /// The ellipsis will be created using the current settings of the format, including base font, style, and any effects.
- /// Alternate omission signs can be created by the application by implementing IDWriteInlineObject.
- /// </summary>
- /// <param name="textFormat">Text format used as a template for the omission sign.</param>
- /// <param name="trimmingSign">Created omission sign.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(CreateEllipsisTrimmingSign)(
- IDWriteTextFormat* textFormat,
- __out IDWriteInlineObject** trimmingSign
- ) PURE;
-
- /// <summary>
- /// Return an interface to perform text analysis with.
- /// </summary>
- /// <param name="textAnalyzer">The resultant object.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(CreateTextAnalyzer)(
- __out IDWriteTextAnalyzer** textAnalyzer
- ) PURE;
-
- /// <summary>
- /// Creates a number substitution object using a locale name,
- /// substitution method, and whether to ignore user overrides (uses NLS
- /// defaults for the given culture instead).
- /// </summary>
- /// <param name="substitutionMethod">Method of number substitution to use.</param>
- /// <param name="localeName">Which locale to obtain the digits from.</param>
- /// <param name="ignoreUserOverride">Ignore the user's settings and use the locale defaults</param>
- /// <param name="numberSubstitution">Receives a pointer to the newly created object.</param>
- STDMETHOD(CreateNumberSubstitution)(
- __in DWRITE_NUMBER_SUBSTITUTION_METHOD substitutionMethod,
- __in_z WCHAR const* localeName,
- __in BOOL ignoreUserOverride,
- __out IDWriteNumberSubstitution** numberSubstitution
- ) PURE;
-
- /// <summary>
- /// Creates a glyph run analysis object, which encapsulates information
- /// used to render a glyph run.
- /// </summary>
- /// <param name="glyphRun">Structure specifying the properties of the glyph run.</param>
- /// <param name="pixelsPerDip">Number of physical pixels per DIP. For example, if rendering onto a 96 DPI bitmap then pixelsPerDip
- /// is 1. If rendering onto a 120 DPI bitmap then pixelsPerDip is 120/96.</param>
- /// <param name="transform">Optional transform applied to the glyphs and their positions. This transform is applied after the
- /// scaling specified the emSize and pixelsPerDip.</param>
- /// <param name="renderingMode">Specifies the rendering mode, which must be one of the raster rendering modes (i.e., not default
- /// and not outline).</param>
- /// <param name="measuringMode">Specifies the method to measure glyphs.</param>
- /// <param name="baselineOriginX">Horizontal position of the baseline origin, in DIPs.</param>
- /// <param name="baselineOriginY">Vertical position of the baseline origin, in DIPs.</param>
- /// <param name="glyphRunAnalysis">Receives a pointer to the newly created object.</param>
- /// <returns>
- /// Standard HRESULT error code.
- /// </returns>
- STDMETHOD(CreateGlyphRunAnalysis)(
- __in DWRITE_GLYPH_RUN const* glyphRun,
- FLOAT pixelsPerDip,
- __in_opt DWRITE_MATRIX const* transform,
- DWRITE_RENDERING_MODE renderingMode,
- DWRITE_MEASURING_MODE measuringMode,
- FLOAT baselineOriginX,
- FLOAT baselineOriginY,
- __out IDWriteGlyphRunAnalysis** glyphRunAnalysis
- ) PURE;
-
-}; // interface IDWriteFactory
-
-/// <summary>
-/// Creates a DirectWrite factory object that is used for subsequent creation of individual DirectWrite objects.
-/// </summary>
-/// <param name="factoryType">Identifies whether the factory object will be shared or isolated.</param>
-/// <param name="iid">Identifies the DirectWrite factory interface, such as __uuidof(IDWriteFactory).</param>
-/// <param name="factory">Receives the DirectWrite factory object.</param>
-/// <returns>
-/// Standard HRESULT error code.
-/// </returns>
-/// <remarks>
-/// Obtains DirectWrite factory object that is used for subsequent creation of individual DirectWrite classes.
-/// DirectWrite factory contains internal state such as font loader registration and cached font data.
-/// In most cases it is recommended to use the shared factory object, because it allows multiple components
-/// that use DirectWrite to share internal DirectWrite state and reduce memory usage.
-/// However, there are cases when it is desirable to reduce the impact of a component,
-/// such as a plug-in from an untrusted source, on the rest of the process by sandboxing and isolating it
-/// from the rest of the process components. In such cases, it is recommended to use an isolated factory for the sandboxed
-/// component.
-/// </remarks>
-EXTERN_C HRESULT DWRITE_EXPORT DWriteCreateFactory(
- __in DWRITE_FACTORY_TYPE factoryType,
- __in REFIID iid,
- __out IUnknown **factory
- );
-
-// Macros used to define DirectWrite error codes.
-#define FACILITY_DWRITE 0x898
-#define DWRITE_ERR_BASE 0x5000
-#define MAKE_DWRITE_HR(severity, code) MAKE_HRESULT(severity, FACILITY_DWRITE, (DWRITE_ERR_BASE + code))
-#define MAKE_DWRITE_HR_ERR(code) MAKE_DWRITE_HR(SEVERITY_ERROR, code)
-
-/// <summary>
-/// Indicates an error in an input file such as a font file.
-/// </summary>
-#define DWRITE_E_FILEFORMAT MAKE_DWRITE_HR_ERR(0x000)
-
-/// <summary>
-/// Indicates an error originating in DirectWrite code, which is not expected to occur but is safe to recover from.
-/// </summary>
-#define DWRITE_E_UNEXPECTED MAKE_DWRITE_HR_ERR(0x001)
-
-/// <summary>
-/// Indicates the specified font does not exist.
-/// </summary>
-#define DWRITE_E_NOFONT MAKE_DWRITE_HR_ERR(0x002)
-
-/// <summary>
-/// A font file could not be opened because the file, directory, network location, drive, or other storage
-/// location does not exist or is unavailable.
-/// </summary>
-#define DWRITE_E_FILENOTFOUND MAKE_DWRITE_HR_ERR(0x003)
-
-/// <summary>
-/// A font file exists but could not be opened due to access denied, sharing violation, or similar error.
-/// </summary>
-#define DWRITE_E_FILEACCESS MAKE_DWRITE_HR_ERR(0x004)
-
-/// <summary>
-/// A font collection is obsolete due to changes in the system.
-/// </summary>
-#define DWRITE_E_FONTCOLLECTIONOBSOLETE MAKE_DWRITE_HR_ERR(0x005)
-
-/// <summary>
-/// The given interface is already registered.
-/// </summary>
-#define DWRITE_E_ALREADYREGISTERED MAKE_DWRITE_HR_ERR(0x006)
-
-#endif /* DWRITE_H_INCLUDED */
+//+--------------------------------------------------------------------------
+//
+// Copyright (c) Microsoft Corporation. All rights reserved.
+//
+// Abstract:
+// DirectX Typography Services public API definitions.
+//
+//----------------------------------------------------------------------------
+
+#ifndef DWRITE_H_INCLUDED
+#define DWRITE_H_INCLUDED
+
+#if _MSC_VER > 1000
+#pragma once
+#endif
+
+#ifndef DWRITE_NO_WINDOWS_H
+
+#include "specstrings.h"
+#include "unknwn.h"
+
+#endif // DWRITE_NO_WINDOWS_H
+
+#include "dcommon.h"
+
+#if _FX_COMPILER_ == _FX_VC6_
+typedef signed char INT8, *PINT8;
+typedef signed short INT16, *PINT16;
+typedef signed int INT32, *PINT32;
+typedef signed __int64 INT64, *PINT64;
+typedef unsigned char UINT8, *PUINT8;
+typedef unsigned short UINT16, *PUINT16;
+typedef unsigned int UINT32, *PUINT32;
+typedef unsigned __int64 UINT64, *PUINT64;
+#endif
+
+#ifndef DWRITE_DECLARE_INTERFACE
+#define DWRITE_DECLARE_INTERFACE(iid) DECLSPEC_UUID(iid) DECLSPEC_NOVTABLE
+#endif
+
+#ifndef DWRITE_EXPORT
+#define DWRITE_EXPORT __declspec(dllimport) WINAPI
+#endif
+
+/// <summary>
+/// The type of a font represented by a single font file.
+/// Font formats that consist of multiple files, e.g. Type 1 .PFM and .PFB, have
+/// separate enum values for each of the file type.
+/// </summary>
+enum DWRITE_FONT_FILE_TYPE
+{
+ /// <summary>
+ /// Font type is not recognized by the DirectWrite font system.
+ /// </summary>
+ DWRITE_FONT_FILE_TYPE_UNKNOWN,
+
+ /// <summary>
+ /// OpenType font with CFF outlines.
+ /// </summary>
+ DWRITE_FONT_FILE_TYPE_CFF,
+
+ /// <summary>
+ /// OpenType font with TrueType outlines.
+ /// </summary>
+ DWRITE_FONT_FILE_TYPE_TRUETYPE,
+
+ /// <summary>
+ /// OpenType font that contains a TrueType collection.
+ /// </summary>
+ DWRITE_FONT_FILE_TYPE_TRUETYPE_COLLECTION,
+
+ /// <summary>
+ /// Type 1 PFM font.
+ /// </summary>
+ DWRITE_FONT_FILE_TYPE_TYPE1_PFM,
+
+ /// <summary>
+ /// Type 1 PFB font.
+ /// </summary>
+ DWRITE_FONT_FILE_TYPE_TYPE1_PFB,
+
+ /// <summary>
+ /// Vector .FON font.
+ /// </summary>
+ DWRITE_FONT_FILE_TYPE_VECTOR,
+
+ /// <summary>
+ /// Bitmap .FON font.
+ /// </summary>
+ DWRITE_FONT_FILE_TYPE_BITMAP
+};
+
+/// <summary>
+/// The file format of a complete font face.
+/// Font formats that consist of multiple files, e.g. Type 1 .PFM and .PFB, have
+/// a single enum entry.
+/// </summary>
+enum DWRITE_FONT_FACE_TYPE
+{
+ /// <summary>
+ /// OpenType font face with CFF outlines.
+ /// </summary>
+ DWRITE_FONT_FACE_TYPE_CFF,
+
+ /// <summary>
+ /// OpenType font face with TrueType outlines.
+ /// </summary>
+ DWRITE_FONT_FACE_TYPE_TRUETYPE,
+
+ /// <summary>
+ /// OpenType font face that is a part of a TrueType collection.
+ /// </summary>
+ DWRITE_FONT_FACE_TYPE_TRUETYPE_COLLECTION,
+
+ /// <summary>
+ /// A Type 1 font face.
+ /// </summary>
+ DWRITE_FONT_FACE_TYPE_TYPE1,
+
+ /// <summary>
+ /// A vector .FON format font face.
+ /// </summary>
+ DWRITE_FONT_FACE_TYPE_VECTOR,
+
+ /// <summary>
+ /// A bitmap .FON format font face.
+ /// </summary>
+ DWRITE_FONT_FACE_TYPE_BITMAP,
+
+ /// <summary>
+ /// Font face type is not recognized by the DirectWrite font system.
+ /// </summary>
+ DWRITE_FONT_FACE_TYPE_UNKNOWN
+};
+
+/// <summary>
+/// Specifies algorithmic style simulations to be applied to the font face.
+/// Bold and oblique simulations can be combined via bitwise OR operation.
+/// </summary>
+enum DWRITE_FONT_SIMULATIONS
+{
+ /// <summary>
+ /// No simulations are performed.
+ /// </summary>
+ DWRITE_FONT_SIMULATIONS_NONE = 0x0000,
+
+ /// <summary>
+ /// Algorithmic emboldening is performed.
+ /// </summary>
+ DWRITE_FONT_SIMULATIONS_BOLD = 0x0001,
+
+ /// <summary>
+ /// Algorithmic italicization is performed.
+ /// </summary>
+ DWRITE_FONT_SIMULATIONS_OBLIQUE = 0x0002
+};
+
+#ifdef DEFINE_ENUM_FLAG_OPERATORS
+DEFINE_ENUM_FLAG_OPERATORS(DWRITE_FONT_SIMULATIONS);
+#endif
+
+/// <summary>
+/// The font weight enumeration describes common values for degree of blackness or thickness of strokes of characters in a font.
+/// Font weight values less than 1 or greater than 999 are considered to be invalid, and they are rejected by font API functions.
+/// </summary>
+enum DWRITE_FONT_WEIGHT
+{
+ /// <summary>
+ /// Predefined font weight : Thin (100).
+ /// </summary>
+ DWRITE_FONT_WEIGHT_THIN = 100,
+
+ /// <summary>
+ /// Predefined font weight : Extra-light (200).
+ /// </summary>
+ DWRITE_FONT_WEIGHT_EXTRA_LIGHT = 200,
+
+ /// <summary>
+ /// Predefined font weight : Ultra-light (200).
+ /// </summary>
+ DWRITE_FONT_WEIGHT_ULTRA_LIGHT = 200,
+
+ /// <summary>
+ /// Predefined font weight : Light (300).
+ /// </summary>
+ DWRITE_FONT_WEIGHT_LIGHT = 300,
+
+ /// <summary>
+ /// Predefined font weight : Normal (400).
+ /// </summary>
+ DWRITE_FONT_WEIGHT_NORMAL = 400,
+
+ /// <summary>
+ /// Predefined font weight : Regular (400).
+ /// </summary>
+ DWRITE_FONT_WEIGHT_REGULAR = 400,
+
+ /// <summary>
+ /// Predefined font weight : Medium (500).
+ /// </summary>
+ DWRITE_FONT_WEIGHT_MEDIUM = 500,
+
+ /// <summary>
+ /// Predefined font weight : Demi-bold (600).
+ /// </summary>
+ DWRITE_FONT_WEIGHT_DEMI_BOLD = 600,
+
+ /// <summary>
+ /// Predefined font weight : Semi-bold (600).
+ /// </summary>
+ DWRITE_FONT_WEIGHT_SEMI_BOLD = 600,
+
+ /// <summary>
+ /// Predefined font weight : Bold (700).
+ /// </summary>
+ DWRITE_FONT_WEIGHT_BOLD = 700,
+
+ /// <summary>
+ /// Predefined font weight : Extra-bold (800).
+ /// </summary>
+ DWRITE_FONT_WEIGHT_EXTRA_BOLD = 800,
+
+ /// <summary>
+ /// Predefined font weight : Ultra-bold (800).
+ /// </summary>
+ DWRITE_FONT_WEIGHT_ULTRA_BOLD = 800,
+
+ /// <summary>
+ /// Predefined font weight : Black (900).
+ /// </summary>
+ DWRITE_FONT_WEIGHT_BLACK = 900,
+
+ /// <summary>
+ /// Predefined font weight : Heavy (900).
+ /// </summary>
+ DWRITE_FONT_WEIGHT_HEAVY = 900,
+
+ /// <summary>
+ /// Predefined font weight : Extra-black (950).
+ /// </summary>
+ DWRITE_FONT_WEIGHT_EXTRA_BLACK = 950,
+
+ /// <summary>
+ /// Predefined font weight : Ultra-black (950).
+ /// </summary>
+ DWRITE_FONT_WEIGHT_ULTRA_BLACK = 950
+};
+
+/// <summary>
+/// The font stretch enumeration describes relative change from the normal aspect ratio
+/// as specified by a font designer for the glyphs in a font.
+/// Values less than 1 or greater than 9 are considered to be invalid, and they are rejected by font API functions.
+/// </summary>
+enum DWRITE_FONT_STRETCH
+{
+ /// <summary>
+ /// Predefined font stretch : Not known (0).
+ /// </summary>
+ DWRITE_FONT_STRETCH_UNDEFINED = 0,
+
+ /// <summary>
+ /// Predefined font stretch : Ultra-condensed (1).
+ /// </summary>
+ DWRITE_FONT_STRETCH_ULTRA_CONDENSED = 1,
+
+ /// <summary>
+ /// Predefined font stretch : Extra-condensed (2).
+ /// </summary>
+ DWRITE_FONT_STRETCH_EXTRA_CONDENSED = 2,
+
+ /// <summary>
+ /// Predefined font stretch : Condensed (3).
+ /// </summary>
+ DWRITE_FONT_STRETCH_CONDENSED = 3,
+
+ /// <summary>
+ /// Predefined font stretch : Semi-condensed (4).
+ /// </summary>
+ DWRITE_FONT_STRETCH_SEMI_CONDENSED = 4,
+
+ /// <summary>
+ /// Predefined font stretch : Normal (5).
+ /// </summary>
+ DWRITE_FONT_STRETCH_NORMAL = 5,
+
+ /// <summary>
+ /// Predefined font stretch : Medium (5).
+ /// </summary>
+ DWRITE_FONT_STRETCH_MEDIUM = 5,
+
+ /// <summary>
+ /// Predefined font stretch : Semi-expanded (6).
+ /// </summary>
+ DWRITE_FONT_STRETCH_SEMI_EXPANDED = 6,
+
+ /// <summary>
+ /// Predefined font stretch : Expanded (7).
+ /// </summary>
+ DWRITE_FONT_STRETCH_EXPANDED = 7,
+
+ /// <summary>
+ /// Predefined font stretch : Extra-expanded (8).
+ /// </summary>
+ DWRITE_FONT_STRETCH_EXTRA_EXPANDED = 8,
+
+ /// <summary>
+ /// Predefined font stretch : Ultra-expanded (9).
+ /// </summary>
+ DWRITE_FONT_STRETCH_ULTRA_EXPANDED = 9
+};
+
+/// <summary>
+/// The font style enumeration describes the slope style of a font face, such as Normal, Italic or Oblique.
+/// Values other than the ones defined in the enumeration are considered to be invalid, and they are rejected by font API functions.
+/// </summary>
+enum DWRITE_FONT_STYLE
+{
+ /// <summary>
+ /// Font slope style : Normal.
+ /// </summary>
+ DWRITE_FONT_STYLE_NORMAL,
+
+ /// <summary>
+ /// Font slope style : Oblique.
+ /// </summary>
+ DWRITE_FONT_STYLE_OBLIQUE,
+
+ /// <summary>
+ /// Font slope style : Italic.
+ /// </summary>
+ DWRITE_FONT_STYLE_ITALIC
+
+};
+
+/// <summary>
+/// The informational string enumeration identifies a string in a font.
+/// </summary>
+enum DWRITE_INFORMATIONAL_STRING_ID
+{
+ /// <summary>
+ /// Unspecified name ID.
+ /// </summary>
+ DWRITE_INFORMATIONAL_STRING_NONE,
+
+ /// <summary>
+ /// Copyright notice provided by the font.
+ /// </summary>
+ DWRITE_INFORMATIONAL_STRING_COPYRIGHT_NOTICE,
+
+ /// <summary>
+ /// String containing a version number.
+ /// </summary>
+ DWRITE_INFORMATIONAL_STRING_VERSION_STRINGS,
+
+ /// <summary>
+ /// Trademark information provided by the font.
+ /// </summary>
+ DWRITE_INFORMATIONAL_STRING_TRADEMARK,
+
+ /// <summary>
+ /// Name of the font manufacturer.
+ /// </summary>
+ DWRITE_INFORMATIONAL_STRING_MANUFACTURER,
+
+ /// <summary>
+ /// Name of the font designer.
+ /// </summary>
+ DWRITE_INFORMATIONAL_STRING_DESIGNER,
+
+ /// <summary>
+ /// URL of font designer (with protocol, e.g., http://, ftp://).
+ /// </summary>
+ DWRITE_INFORMATIONAL_STRING_DESIGNER_URL,
+
+ /// <summary>
+ /// Description of the font. Can contain revision information, usage recommendations, history, features, etc.
+ /// </summary>
+ DWRITE_INFORMATIONAL_STRING_DESCRIPTION,
+
+ /// <summary>
+ /// URL of font vendor (with protocol, e.g., http://, ftp://). If a unique serial number is embedded in the URL, it can be used to register the font.
+ /// </summary>
+ DWRITE_INFORMATIONAL_STRING_FONT_VENDOR_URL,
+
+ /// <summary>
+ /// Description of how the font may be legally used, or different example scenarios for licensed use. This field should be written in plain language, not legalese.
+ /// </summary>
+ DWRITE_INFORMATIONAL_STRING_LICENSE_DESCRIPTION,
+
+ /// <summary>
+ /// URL where additional licensing information can be found.
+ /// </summary>
+ DWRITE_INFORMATIONAL_STRING_LICENSE_INFO_URL,
+
+ /// <summary>
+ /// GDI-compatible family name. Because GDI allows a maximum of four fonts per family, fonts in the same family may have different GDI-compatible family names
+ /// (e.g., "Arial", "Arial Narrow", "Arial Black").
+ /// </summary>
+ DWRITE_INFORMATIONAL_STRING_WIN32_FAMILY_NAMES,
+
+ /// <summary>
+ /// GDI-compatible subfamily name.
+ /// </summary>
+ DWRITE_INFORMATIONAL_STRING_WIN32_SUBFAMILY_NAMES,
+
+ /// <summary>
+ /// Family name preferred by the designer. This enables font designers to group more than four fonts in a single family without losing compatibility with
+ /// GDI. This name is typically only present if it differs from the GDI-compatible family name.
+ /// </summary>
+ DWRITE_INFORMATIONAL_STRING_PREFERRED_FAMILY_NAMES,
+
+ /// <summary>
+ /// Subfamily name preferred by the designer. This name is typically only present if it differs from the GDI-compatible subfamily name.
+ /// </summary>
+ DWRITE_INFORMATIONAL_STRING_PREFERRED_SUBFAMILY_NAMES,
+
+ /// <summary>
+ /// Sample text. This can be the font name or any other text that the designer thinks is the best example to display the font in.
+ /// </summary>
+ DWRITE_INFORMATIONAL_STRING_SAMPLE_TEXT
+};
+
+
+/// <summary>
+/// The DWRITE_FONT_METRICS structure specifies the metrics of a font face that
+/// are applicable to all glyphs within the font face.
+/// </summary>
+struct DWRITE_FONT_METRICS
+{
+ /// <summary>
+ /// The number of font design units per em unit.
+ /// Font files use their own coordinate system of font design units.
+ /// A font design unit is the smallest measurable unit in the em square,
+ /// an imaginary square that is used to size and align glyphs.
+ /// The concept of em square is used as a reference scale factor when defining font size and device transformation semantics.
+ /// The size of one em square is also commonly used to compute the paragraph identation value.
+ /// </summary>
+ UINT16 designUnitsPerEm;
+
+ /// <summary>
+ /// Ascent value of the font face in font design units.
+ /// Ascent is the distance from the top of font character alignment box to English baseline.
+ /// </summary>
+ UINT16 ascent;
+
+ /// <summary>
+ /// Descent value of the font face in font design units.
+ /// Descent is the distance from the bottom of font character alignment box to English baseline.
+ /// </summary>
+ UINT16 descent;
+
+ /// <summary>
+ /// Line gap in font design units.
+ /// Recommended additional white space to add between lines to improve legibility. The recommended line spacing
+ /// (baseline-to-baseline distance) is thus the sum of ascent, descent, and lineGap. The line gap is usually
+ /// positive or zero but can be negative, in which case the recommended line spacing is less than the height
+ /// of the character alignment box.
+ /// </summary>
+ INT16 lineGap;
+
+ /// <summary>
+ /// Cap height value of the font face in font design units.
+ /// Cap height is the distance from English baseline to the top of a typical English capital.
+ /// Capital "H" is often used as a reference character for the purpose of calculating the cap height value.
+ /// </summary>
+ UINT16 capHeight;
+
+ /// <summary>
+ /// x-height value of the font face in font design units.
+ /// x-height is the distance from English baseline to the top of lowercase letter "x", or a similar lowercase character.
+ /// </summary>
+ UINT16 xHeight;
+
+ /// <summary>
+ /// The underline position value of the font face in font design units.
+ /// Underline position is the position of underline relative to the English baseline.
+ /// The value is usually made negative in order to place the underline below the baseline.
+ /// </summary>
+ INT16 underlinePosition;
+
+ /// <summary>
+ /// The suggested underline thickness value of the font face in font design units.
+ /// </summary>
+ UINT16 underlineThickness;
+
+ /// <summary>
+ /// The strikethrough position value of the font face in font design units.
+ /// Strikethrough position is the position of strikethrough relative to the English baseline.
+ /// The value is usually made positive in order to place the strikethrough above the baseline.
+ /// </summary>
+ INT16 strikethroughPosition;
+
+ /// <summary>
+ /// The suggested strikethrough thickness value of the font face in font design units.
+ /// </summary>
+ UINT16 strikethroughThickness;
+};
+
+/// <summary>
+/// The DWRITE_GLYPH_METRICS structure specifies the metrics of an individual glyph.
+/// The units depend on how the metrics are obtained.
+/// </summary>
+struct DWRITE_GLYPH_METRICS
+{
+ /// <summary>
+ /// Specifies the X offset from the glyph origin to the left edge of the black box.
+ /// The glyph origin is the current horizontal writing position.
+ /// A negative value means the black box extends to the left of the origin (often true for lowercase italic 'f').
+ /// </summary>
+ INT32 leftSideBearing;
+
+ /// <summary>
+ /// Specifies the X offset from the origin of the current glyph to the origin of the next glyph when writing horizontally.
+ /// </summary>
+ UINT32 advanceWidth;
+
+ /// <summary>
+ /// Specifies the X offset from the right edge of the black box to the origin of the next glyph when writing horizontally.
+ /// The value is negative when the right edge of the black box overhangs the layout box.
+ /// </summary>
+ INT32 rightSideBearing;
+
+ /// <summary>
+ /// Specifies the vertical offset from the vertical origin to the top of the black box.
+ /// Thus, a positive value adds whitespace whereas a negative value means the glyph overhangs the top of the layout box.
+ /// </summary>
+ INT32 topSideBearing;
+
+ /// <summary>
+ /// Specifies the Y offset from the vertical origin of the current glyph to the vertical origin of the next glyph when writing vertically.
+ /// (Note that the term "origin" by itself denotes the horizontal origin. The vertical origin is different.
+ /// Its Y coordinate is specified by verticalOriginY value,
+ /// and its X coordinate is half the advanceWidth to the right of the horizontal origin).
+ /// </summary>
+ UINT32 advanceHeight;
+
+ /// <summary>
+ /// Specifies the vertical distance from the black box's bottom edge to the advance height.
+ /// Positive when the bottom edge of the black box is within the layout box.
+ /// Negative when the bottom edge of black box overhangs the layout box.
+ /// </summary>
+ INT32 bottomSideBearing;
+
+ /// <summary>
+ /// Specifies the Y coordinate of a glyph's vertical origin, in the font's design coordinate system.
+ /// The y coordinate of a glyph's vertical origin is the sum of the glyph's top side bearing
+ /// and the top (i.e. yMax) of the glyph's bounding box.
+ /// </summary>
+ INT32 verticalOriginY;
+};
+
+/// <summary>
+/// Optional adjustment to a glyph's position. An glyph offset changes the position of a glyph without affecting
+/// the pen position. Offsets are in logical, pre-transform units.
+/// </summary>
+struct DWRITE_GLYPH_OFFSET
+{
+ /// <summary>
+ /// Offset in the advance direction of the run. A positive advance offset moves the glyph to the right
+ /// (in pre-transform coordinates) if the run is left-to-right or to the left if the run is right-to-left.
+ /// </summary>
+ FLOAT advanceOffset;
+
+ /// <summary>
+ /// Offset in the ascent direction, i.e., the direction ascenders point. A positive ascender offset moves
+ /// the glyph up (in pre-transform coordinates).
+ /// </summary>
+ FLOAT ascenderOffset;
+};
+
+/// <summary>
+/// Specifies the type of DirectWrite factory object.
+/// DirectWrite factory contains internal state such as font loader registration and cached font data.
+/// In most cases it is recommended to use the shared factory object, because it allows multiple components
+/// that use DirectWrite to share internal DirectWrite state and reduce memory usage.
+/// However, there are cases when it is desirable to reduce the impact of a component,
+/// such as a plug-in from an untrusted source, on the rest of the process by sandboxing and isolating it
+/// from the rest of the process components. In such cases, it is recommended to use an isolated factory for the sandboxed
+/// component.
+/// </summary>
+enum DWRITE_FACTORY_TYPE
+{
+ /// <summary>
+ /// Shared factory allow for re-use of cached font data across multiple in process components.
+ /// Such factories also take advantage of cross process font caching components for better performance.
+ /// </summary>
+ DWRITE_FACTORY_TYPE_SHARED,
+
+ /// <summary>
+ /// Objects created from the isolated factory do not interact with internal DirectWrite state from other components.
+ /// </summary>
+ DWRITE_FACTORY_TYPE_ISOLATED
+};
+
+// Creates an OpenType tag as a 32bit integer such that
+// the first character in the tag is the lowest byte,
+// (least significant on little endian architectures)
+// which can be used to compare with tags in the font file.
+// This macro is compatible with DWRITE_FONT_FEATURE_TAG.
+//
+// Example: DWRITE_MAKE_OPENTYPE_TAG('c','c','m','p')
+// Dword: 0x706D6363
+//
+#define DWRITE_MAKE_OPENTYPE_TAG(a,b,c,d) ( \
+ (static_cast<UINT32>(static_cast<UINT8>(d)) << 24) | \
+ (static_cast<UINT32>(static_cast<UINT8>(c)) << 16) | \
+ (static_cast<UINT32>(static_cast<UINT8>(b)) << 8) | \
+ static_cast<UINT32>(static_cast<UINT8>(a)))
+
+interface IDWriteFontFileStream;
+
+/// <summary>
+/// Font file loader interface handles loading font file resources of a particular type from a key.
+/// The font file loader interface is recommended to be implemented by a singleton object.
+/// IMPORTANT: font file loader implementations must not register themselves with DirectWrite factory
+/// inside their constructors and must not unregister themselves in their destructors, because
+/// registration and unregistraton operations increment and decrement the object reference count respectively.
+/// Instead, registration and unregistration of font file loaders with DirectWrite factory should be performed
+/// outside of the font file loader implementation as a separate step.
+/// </summary>
+interface DWRITE_DECLARE_INTERFACE("727cad4e-d6af-4c9e-8a08-d695b11caa49") IDWriteFontFileLoader : public IUnknown
+{
+ /// <summary>
+ /// Creates a font file stream object that encapsulates an open file resource.
+ /// The resource is closed when the last reference to fontFileStream is released.
+ /// </summary>
+ /// <param name="fontFileReferenceKey">Font file reference key that uniquely identifies the font file resource
+ /// within the scope of the font loader being used.</param>
+ /// <param name="fontFileReferenceKeySize">Size of font file reference key in bytes.</param>
+ /// <param name="fontFileStream">Pointer to the newly created font file stream.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(CreateStreamFromKey)(
+ __in_bcount(fontFileReferenceKeySize) void const* fontFileReferenceKey,
+ UINT32 fontFileReferenceKeySize,
+ __out IDWriteFontFileStream** fontFileStream
+ ) PURE;
+};
+
+/// <summary>
+/// A built-in implementation of IDWriteFontFileLoader interface that operates on local font files
+/// and exposes local font file information from the font file reference key.
+/// Font file references created using CreateFontFileReference use this font file loader.
+/// </summary>
+interface DWRITE_DECLARE_INTERFACE("b2d9f3ec-c9fe-4a11-a2ec-d86208f7c0a2") IDWriteLocalFontFileLoader : public IDWriteFontFileLoader
+{
+ /// <summary>
+ /// Obtains the length of the absolute file path from the font file reference key.
+ /// </summary>
+ /// <param name="fontFileReferenceKey">Font file reference key that uniquely identifies the local font file
+ /// within the scope of the font loader being used.</param>
+ /// <param name="fontFileReferenceKeySize">Size of font file reference key in bytes.</param>
+ /// <param name="filePathLength">Length of the file path string not including the terminated NULL character.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetFilePathLengthFromKey)(
+ __in_bcount(fontFileReferenceKeySize) void const* fontFileReferenceKey,
+ UINT32 fontFileReferenceKeySize,
+ __out UINT32* filePathLength
+ ) PURE;
+
+ /// <summary>
+ /// Obtains the absolute font file path from the font file reference key.
+ /// </summary>
+ /// <param name="fontFileReferenceKey">Font file reference key that uniquely identifies the local font file
+ /// within the scope of the font loader being used.</param>
+ /// <param name="fontFileReferenceKeySize">Size of font file reference key in bytes.</param>
+ /// <param name="filePath">Character array that receives the local file path.</param>
+ /// <param name="filePathSize">Size of the filePath array in character count including the terminated NULL character.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetFilePathFromKey)(
+ __in_bcount(fontFileReferenceKeySize) void const* fontFileReferenceKey,
+ UINT32 fontFileReferenceKeySize,
+ __out_ecount_z(filePathSize) WCHAR* filePath,
+ UINT32 filePathSize
+ ) PURE;
+
+ /// <summary>
+ /// Obtains the last write time of the file from the font file reference key.
+ /// </summary>
+ /// <param name="fontFileReferenceKey">Font file reference key that uniquely identifies the local font file
+ /// within the scope of the font loader being used.</param>
+ /// <param name="fontFileReferenceKeySize">Size of font file reference key in bytes.</param>
+ /// <param name="lastWriteTime">Last modified time of the font file.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetLastWriteTimeFromKey)(
+ __in_bcount(fontFileReferenceKeySize) void const* fontFileReferenceKey,
+ UINT32 fontFileReferenceKeySize,
+ __out FILETIME* lastWriteTime
+ ) PURE;
+};
+
+/// <summary>
+/// The interface for loading font file data.
+/// </summary>
+interface DWRITE_DECLARE_INTERFACE("6d4865fe-0ab8-4d91-8f62-5dd6be34a3e0") IDWriteFontFileStream : public IUnknown
+{
+ /// <summary>
+ /// Reads a fragment from a file.
+ /// </summary>
+ /// <param name="fragmentStart">Receives the pointer to the start of the font file fragment.</param>
+ /// <param name="fileOffset">Offset of the fragment from the beginning of the font file.</param>
+ /// <param name="fragmentSize">Size of the fragment in bytes.</param>
+ /// <param name="fragmentContext">The client defined context to be passed to the ReleaseFileFragment.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ /// <remarks>
+ /// IMPORTANT: ReadFileFragment() implementations must check whether the requested file fragment
+ /// is within the file bounds. Otherwise, an error should be returned from ReadFileFragment.
+ /// </remarks>
+ STDMETHOD(ReadFileFragment)(
+ __deref_out_bcount(fragmentSize) void const** fragmentStart,
+ UINT64 fileOffset,
+ UINT64 fragmentSize,
+ __out void** fragmentContext
+ ) PURE;
+
+ /// <summary>
+ /// Releases a fragment from a file.
+ /// </summary>
+ /// <param name="fragmentContext">The client defined context of a font fragment returned from ReadFileFragment.</param>
+ STDMETHOD_(void, ReleaseFileFragment)(
+ void* fragmentContext
+ ) PURE;
+
+ /// <summary>
+ /// Obtains the total size of a file.
+ /// </summary>
+ /// <param name="fileSize">Receives the total size of the file.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ /// <remarks>
+ /// Implementing GetFileSize() for asynchronously loaded font files may require
+ /// downloading the complete file contents, therefore this method should only be used for operations that
+ /// either require complete font file to be loaded (e.g., copying a font file) or need to make
+ /// decisions based on the value of the file size (e.g., validation against a persisted file size).
+ /// </remarks>
+ STDMETHOD(GetFileSize)(
+ __out UINT64* fileSize
+ ) PURE;
+
+ /// <summary>
+ /// Obtains the last modified time of the file. The last modified time is used by DirectWrite font selection algorithms
+ /// to determine whether one font resource is more up to date than another one.
+ /// </summary>
+ /// <param name="lastWriteTime">Receives the last modifed time of the file in the format that represents
+ /// the number of 100-nanosecond intervals since January 1, 1601 (UTC).</param>
+ /// <returns>
+ /// Standard HRESULT error code. For resources that don't have a concept of the last modified time, the implementation of
+ /// GetLastWriteTime should return E_NOTIMPL.
+ /// </returns>
+ STDMETHOD(GetLastWriteTime)(
+ __out UINT64* lastWriteTime
+ ) PURE;
+};
+
+/// <summary>
+/// The interface that represents a reference to a font file.
+/// </summary>
+interface DWRITE_DECLARE_INTERFACE("739d886a-cef5-47dc-8769-1a8b41bebbb0") IDWriteFontFile : public IUnknown
+{
+ /// <summary>
+ /// This method obtains the pointer to the reference key of a font file. The pointer is only valid until the object that refers to it is released.
+ /// </summary>
+ /// <param name="fontFileReferenceKey">Pointer to the font file reference key.
+ /// IMPORTANT: The pointer value is valid until the font file reference object it is obtained from is released.</param>
+ /// <param name="fontFileReferenceKeySize">Size of font file reference key in bytes.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetReferenceKey)(
+ __deref_out_bcount(*fontFileReferenceKeySize) void const** fontFileReferenceKey,
+ __out UINT32* fontFileReferenceKeySize
+ ) PURE;
+
+ /// <summary>
+ /// Obtains the file loader associated with a font file object.
+ /// </summary>
+ /// <param name="fontFileLoader">The font file loader associated with the font file object.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetLoader)(
+ __out IDWriteFontFileLoader** fontFileLoader
+ ) PURE;
+
+ /// <summary>
+ /// Analyzes a file and returns whether it represents a font, and whether the font type is supported by the font system.
+ /// </summary>
+ /// <param name="isSupportedFontType">TRUE if the font type is supported by the font system, FALSE otherwise.</param>
+ /// <param name="fontFileType">The type of the font file. Note that even if isSupportedFontType is FALSE,
+ /// the fontFileType value may be different from DWRITE_FONT_FILE_TYPE_UNKNOWN.</param>
+ /// <param name="fontFaceType">The type of the font face that can be constructed from the font file.
+ /// Note that even if isSupportedFontType is FALSE, the fontFaceType value may be different from
+ /// DWRITE_FONT_FACE_TYPE_UNKNOWN.</param>
+ /// <param name="numberOfFaces">Number of font faces contained in the font file.</param>
+ /// <returns>
+ /// Standard HRESULT error code if there was a processing error during analysis.
+ /// </returns>
+ /// <remarks>
+ /// IMPORTANT: certain font file types are recognized, but not supported by the font system.
+ /// For example, the font system will recognize a file as a Type 1 font file,
+ /// but will not be able to construct a font face object from it. In such situations, Analyze will set
+ /// isSupportedFontType output parameter to FALSE.
+ /// </remarks>
+ STDMETHOD(Analyze)(
+ __out BOOL* isSupportedFontType,
+ __out DWRITE_FONT_FILE_TYPE* fontFileType,
+ __out_opt DWRITE_FONT_FACE_TYPE* fontFaceType,
+ __out UINT32* numberOfFaces
+ ) PURE;
+};
+
+/// <summary>
+/// Represents the internal structure of a device pixel (i.e., the physical arrangement of red,
+/// green, and blue color components) that is assumed for purposes of rendering text.
+/// </summary>
+#ifndef DWRITE_PIXEL_GEOMETRY_DEFINED
+enum DWRITE_PIXEL_GEOMETRY
+{
+ /// <summary>
+ /// The red, green, and blue color components of each pixel are assumed to occupy the same point.
+ /// </summary>
+ DWRITE_PIXEL_GEOMETRY_FLAT,
+
+ /// <summary>
+ /// Each pixel comprises three vertical stripes, with red on the left, green in the center, and
+ /// blue on the right. This is the most common pixel geometry for LCD monitors.
+ /// </summary>
+ DWRITE_PIXEL_GEOMETRY_RGB,
+
+ /// <summary>
+ /// Each pixel comprises three vertical stripes, with blue on the left, green in the center, and
+ /// red on the right.
+ /// </summary>
+ DWRITE_PIXEL_GEOMETRY_BGR
+};
+#define DWRITE_PIXEL_GEOMETRY_DEFINED
+#endif
+
+/// <summary>
+/// Represents a method of rendering glyphs.
+/// </summary>
+enum DWRITE_RENDERING_MODE
+{
+ /// <summary>
+ /// Specifies that the rendering mode is determined automatically based on the font and size.
+ /// </summary>
+ DWRITE_RENDERING_MODE_DEFAULT,
+
+ /// <summary>
+ /// Specifies that no anti-aliasing is performed. Each pixel is either set to the foreground
+ /// color of the text or retains the color of the background.
+ /// </summary>
+ DWRITE_RENDERING_MODE_ALIASED,
+
+ /// <summary>
+ /// Specifies ClearType rendering with the same metrics as aliased text. Glyphs can only
+ /// be positioned on whole-pixel boundaries.
+ /// </summary>
+ DWRITE_RENDERING_MODE_CLEARTYPE_GDI_CLASSIC,
+
+ /// <summary>
+ /// Specifies ClearType rendering with the same metrics as text rendering using GDI using a font
+ /// created with CLEARTYPE_NATURAL_QUALITY. Glyph metrics are closer to their ideal values than
+ /// with aliased text, but glyphs are still positioned on whole-pixel boundaries.
+ /// </summary>
+ DWRITE_RENDERING_MODE_CLEARTYPE_GDI_NATURAL,
+
+ /// <summary>
+ /// Specifies ClearType rendering with anti-aliasing in the horizontal dimension only. This is
+ /// typically used with small to medium font sizes (up to 16 ppem).
+ /// </summary>
+ DWRITE_RENDERING_MODE_CLEARTYPE_NATURAL,
+
+ /// <summary>
+ /// Specifies ClearType rendering with anti-aliasing in both horizontal and vertical dimensions.
+ /// This is typically used at larger sizes to makes curves and diagonal lines look smoother, at
+ /// the expense of some softness.
+ /// </summary>
+ DWRITE_RENDERING_MODE_CLEARTYPE_NATURAL_SYMMETRIC,
+
+ /// <summary>
+ /// Specifies that rendering should bypass the rasterizer and use the outlines directly. This is
+ /// typically used at very large sizes.
+ /// </summary>
+ DWRITE_RENDERING_MODE_OUTLINE
+};
+
+/// <summary>
+/// The DWRITE_MATRIX structure specifies the graphics transform to be applied
+/// to rendered glyphs.
+/// </summary>
+struct DWRITE_MATRIX
+{
+ /// <summary>
+ /// Horizontal scaling / cosine of rotation
+ /// </summary>
+ FLOAT m11;
+
+ /// <summary>
+ /// Vertical shear / sine of rotation
+ /// </summary>
+ FLOAT m12;
+
+ /// <summary>
+ /// Horizontal shear / negative sine of rotation
+ /// </summary>
+ FLOAT m21;
+
+ /// <summary>
+ /// Vertical scaling / cosine of rotation
+ /// </summary>
+ FLOAT m22;
+
+ /// <summary>
+ /// Horizontal shift (always orthogonal regardless of rotation)
+ /// </summary>
+ FLOAT dx;
+
+ /// <summary>
+ /// Vertical shift (always orthogonal regardless of rotation)
+ /// </summary>
+ FLOAT dy;
+};
+
+/// <summary>
+/// The interface that represents text rendering settings for glyph rasterization and filtering.
+/// </summary>
+interface DWRITE_DECLARE_INTERFACE("2f0da53a-2add-47cd-82ee-d9ec34688e75") IDWriteRenderingParams : public IUnknown
+{
+ /// <summary>
+ /// Gets the gamma value used for gamma correction. Valid values must be
+ /// greater than zero and cannot exceed 256.
+ /// </summary>
+ STDMETHOD_(FLOAT, GetGamma)() PURE;
+
+ /// <summary>
+ /// Gets the amount of contrast enhancement. Valid values are greater than
+ /// or equal to zero.
+ /// </summary>
+ STDMETHOD_(FLOAT, GetEnhancedContrast)() PURE;
+
+ /// <summary>
+ /// Gets the ClearType level. Valid values range from 0.0f (no ClearType)
+ /// to 1.0f (full ClearType).
+ /// </summary>
+ STDMETHOD_(FLOAT, GetClearTypeLevel)() PURE;
+
+ /// <summary>
+ /// Gets the pixel geometry.
+ /// </summary>
+ STDMETHOD_(DWRITE_PIXEL_GEOMETRY, GetPixelGeometry)() PURE;
+
+ /// <summary>
+ /// Gets the rendering mode.
+ /// </summary>
+ STDMETHOD_(DWRITE_RENDERING_MODE, GetRenderingMode)() PURE;
+};
+
+// Forward declarations of D2D types
+interface ID2D1SimplifiedGeometrySink;
+
+typedef ID2D1SimplifiedGeometrySink IDWriteGeometrySink;
+
+/// <summary>
+/// The interface that represents an absolute reference to a font face.
+/// It contains font face type, appropriate file references and face identification data.
+/// Various font data such as metrics, names and glyph outlines is obtained from IDWriteFontFace.
+/// </summary>
+interface DWRITE_DECLARE_INTERFACE("5f49804d-7024-4d43-bfa9-d25984f53849") IDWriteFontFace : public IUnknown
+{
+ /// <summary>
+ /// Obtains the file format type of a font face.
+ /// </summary>
+ STDMETHOD_(DWRITE_FONT_FACE_TYPE, GetType)() PURE;
+
+ /// <summary>
+ /// Obtains the font files representing a font face.
+ /// </summary>
+ /// <param name="numberOfFiles">The number of files representing the font face.</param>
+ /// <param name="fontFiles">User provided array that stores pointers to font files representing the font face.
+ /// This parameter can be NULL if the user is only interested in the number of files representing the font face.
+ /// This API increments reference count of the font file pointers returned according to COM conventions, and the client
+ /// should release them when finished.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetFiles)(
+ __inout UINT32* numberOfFiles,
+ __out_ecount_opt(*numberOfFiles) IDWriteFontFile** fontFiles
+ ) PURE;
+
+ /// <summary>
+ /// Obtains the zero-based index of the font face in its font file or files. If the font files contain a single face,
+ /// the return value is zero.
+ /// </summary>
+ STDMETHOD_(UINT32, GetIndex)() PURE;
+
+ /// <summary>
+ /// Obtains the algorithmic style simulation flags of a font face.
+ /// </summary>
+ STDMETHOD_(DWRITE_FONT_SIMULATIONS, GetSimulations)() PURE;
+
+ /// <summary>
+ /// Determines whether the font is a symbol font.
+ /// </summary>
+ STDMETHOD_(BOOL, IsSymbolFont)() PURE;
+
+ /// <summary>
+ /// Obtains design units and common metrics for the font face.
+ /// These metrics are applicable to all the glyphs within a fontface and are used by applications for layout calculations.
+ /// </summary>
+ /// <param name="fontFaceMetrics">Points to a DWRITE_FONT_METRICS structure to fill in.
+ /// The metrics returned by this function are in font design units.</param>
+ STDMETHOD_(void, GetMetrics)(
+ __out DWRITE_FONT_METRICS* fontFaceMetrics
+ ) PURE;
+
+ /// <summary>
+ /// Obtains the number of glyphs in the font face.
+ /// </summary>
+ STDMETHOD_(UINT16, GetGlyphCount)() PURE;
+
+ /// <summary>
+ /// Obtains ideal glyph metrics in font design units. Design glyphs metrics are used for glyph positioning.
+ /// </summary>
+ /// <param name="glyphIndices">An array of glyph indices to compute the metrics for.</param>
+ /// <param name="glyphCount">The number of elements in the glyphIndices array.</param>
+ /// <param name="glyphMetrics">Array of DWRITE_GLYPH_METRICS structures filled by this function.
+ /// The metrics returned by this function are in font design units.</param>
+ /// <param name="isSideways">Indicates whether the font is being used in a sideways run.
+ /// This can affect the glyph metrics if the font has oblique simulation
+ /// because sideways oblique simulation differs from non-sideways oblique simulation.</param>
+ /// <returns>
+ /// Standard HRESULT error code. If any of the input glyph indices are outside of the valid glyph index range
+ /// for the current font face, E_INVALIDARG will be returned.
+ /// </returns>
+ STDMETHOD(GetDesignGlyphMetrics)(
+ __in_ecount(glyphCount) UINT16 const* glyphIndices,
+ UINT32 glyphCount,
+ __out_ecount(glyphCount) DWRITE_GLYPH_METRICS* glyphMetrics,
+ BOOL isSideways = FALSE
+ ) PURE;
+
+ /// <summary>
+ /// Returns the nominal mapping of UCS4 Unicode code points to glyph indices as defined by the font 'CMAP' table.
+ /// Note that this mapping is primarily provided for line layout engines built on top of the physical font API.
+ /// Because of OpenType glyph substitution and line layout character substitution, the nominal conversion does not always correspond
+ /// to how a Unicode string will map to glyph indices when rendering using a particular font face.
+ /// Also, note that Unicode Variant Selectors provide for alternate mappings for character to glyph.
+ /// This call will always return the default variant.
+ /// </summary>
+ /// <param name="codePoints">An array of USC4 code points to obtain nominal glyph indices from.</param>
+ /// <param name="codePointCount">The number of elements in the codePoints array.</param>
+ /// <param name="glyphIndices">Array of nominal glyph indices filled by this function.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetGlyphIndices)(
+ __in_ecount(codePointCount) UINT32 const* codePoints,
+ UINT32 codePointCount,
+ __out_ecount(codePointCount) UINT16* glyphIndices
+ ) PURE;
+
+ /// <summary>
+ /// Finds the specified OpenType font table if it exists and returns a pointer to it.
+ /// The function accesses the underling font data via the IDWriteFontStream interface
+ /// implemented by the font file loader.
+ /// </summary>
+ /// <param name="openTypeTableTag">Four character tag of table to find.
+ /// Use the DWRITE_MAKE_OPENTYPE_TAG() macro to create it.
+ /// Unlike GDI, it does not support the special TTCF and null tags to access the whole font.</param>
+ /// <param name="tableData">
+ /// Pointer to base of table in memory.
+ /// The pointer is only valid so long as the FontFace used to get the font table still exists
+ /// (not any other FontFace, even if it actually refers to the same physical font).
+ /// </param>
+ /// <param name="tableSize">Byte size of table.</param>
+ /// <param name="tableContext">
+ /// Opaque context which must be freed by calling ReleaseFontTable.
+ /// The context actually comes from the lower level IDWriteFontFileStream,
+ /// which may be implemented by the application or DWrite itself.
+ /// It is possible for a NULL tableContext to be returned, especially if
+ /// the implementation directly memory maps the whole file.
+ /// Nevertheless, always release it later, and do not use it as a test for function success.
+ /// The same table can be queried multiple times,
+ /// but each returned context can be different, so release each separately.
+ /// </param>
+ /// <param name="exists">True if table exists.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// If a table can not be found, the function will not return an error, but the size will be 0, table NULL, and exists = FALSE.
+ /// The context does not need to be freed if the table was not found.
+ /// </returns>
+ /// <remarks>
+ /// The context for the same tag may be different for each call,
+ /// so each one must be held and released separately.
+ /// </remarks>
+ STDMETHOD(TryGetFontTable)(
+ __in UINT32 openTypeTableTag,
+ __deref_out_bcount(*tableSize) const void** tableData,
+ __out UINT32* tableSize,
+ __out void** tableContext,
+ __out BOOL* exists
+ ) PURE;
+
+ /// <summary>
+ /// Releases the table obtained earlier from TryGetFontTable.
+ /// </summary>
+ /// <param name="tableContext">Opaque context from TryGetFontTable.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD_(void, ReleaseFontTable)(
+ __in void* tableContext
+ ) PURE;
+
+ /// <summary>
+ /// Computes the outline of a run of glyphs by calling back to the outline sink interface.
+ /// </summary>
+ /// <param name="emSize">Logical size of the font in DIP units. A DIP ("device-independent pixel") equals 1/96 inch.</param>
+ /// <param name="glyphIndices">Array of glyph indices.</param>
+ /// <param name="glyphAdvances">Optional array of glyph advances in DIPs.</param>
+ /// <param name="glyphOffsets">Optional array of glyph offsets.</param>
+ /// <param name="glyphCount">Number of glyphs.</param>
+ /// <param name="isSideways">If true, specifies that glyphs are rotated 90 degrees to the left and vertical metrics are used.
+ /// A client can render a vertical run by specifying isSideways = true and rotating the resulting geometry 90 degrees to the
+ /// right using a transform. The isSideways and isRightToLeft parameters cannot both be true.</param>
+ /// <param name="isRightToLeft">If true, specifies that the advance direction is right to left. By default, the advance direction
+ /// is left to right.</param>
+ /// <param name="geometrySink">Interface the function calls back to draw each element of the geometry.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetGlyphRunOutline)(
+ FLOAT emSize,
+ __in_ecount(glyphCount) UINT16 const* glyphIndices,
+ __in_ecount_opt(glyphCount) FLOAT const* glyphAdvances,
+ __in_ecount_opt(glyphCount) DWRITE_GLYPH_OFFSET const* glyphOffsets,
+ UINT32 glyphCount,
+ BOOL isSideways,
+ BOOL isRightToLeft,
+ IDWriteGeometrySink* geometrySink
+ ) PURE;
+
+ /// <summary>
+ /// Determines the recommended rendering mode for the font given the specified size and rendering parameters.
+ /// </summary>
+ /// <param name="emSize">Logical size of the font in DIP units. A DIP ("device-independent pixel") equals 1/96 inch.</param>
+ /// <param name="pixelsPerDip">Number of physical pixels per DIP. For example, if the DPI of the rendering surface is 96 this
+ /// value is 1.0f. If the DPI is 120, this value is 120.0f/96.</param>
+ /// <param name="measuringMode">Specifies measuring method that will be used for glyphs in the font.
+ /// Renderer implementations may choose different rendering modes for given measuring methods, but
+ /// best results are seen when the corresponding modes match:
+ /// DWRITE_RENDERING_MODE_CLEARTYPE_NATURAL for DWRITE_MEASURING_MODE_NATURAL
+ /// DWRITE_RENDERING_MODE_CLEARTYPE_GDI_CLASSIC for DWRITE_MEASURING_MODE_GDI_CLASSIC
+ /// DWRITE_RENDERING_MODE_CLEARTYPE_GDI_NATURAL for DWRITE_MEASURING_MODE_GDI_NATURAL
+ /// </param>
+ /// <param name="renderingParams">Rendering parameters object. This parameter is necessary in case the rendering parameters
+ /// object overrides the rendering mode.</param>
+ /// <param name="renderingMode">Receives the recommended rendering mode to use.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetRecommendedRenderingMode)(
+ FLOAT emSize,
+ FLOAT pixelsPerDip,
+ DWRITE_MEASURING_MODE measuringMode,
+ IDWriteRenderingParams* renderingParams,
+ __out DWRITE_RENDERING_MODE* renderingMode
+ ) PURE;
+
+ /// <summary>
+ /// Obtains design units and common metrics for the font face.
+ /// These metrics are applicable to all the glyphs within a fontface and are used by applications for layout calculations.
+ /// </summary>
+ /// <param name="emSize">Logical size of the font in DIP units. A DIP ("device-independent pixel") equals 1/96 inch.</param>
+ /// <param name="pixelsPerDip">Number of physical pixels per DIP. For example, if the DPI of the rendering surface is 96 this
+ /// value is 1.0f. If the DPI is 120, this value is 120.0f/96.</param>
+ /// <param name="transform">Optional transform applied to the glyphs and their positions. This transform is applied after the
+ /// scaling specified by the font size and pixelsPerDip.</param>
+ /// <param name="fontFaceMetrics">Points to a DWRITE_FONT_METRICS structure to fill in.
+ /// The metrics returned by this function are in font design units.</param>
+ STDMETHOD(GetGdiCompatibleMetrics)(
+ FLOAT emSize,
+ FLOAT pixelsPerDip,
+ __in_opt DWRITE_MATRIX const* transform,
+ __out DWRITE_FONT_METRICS* fontFaceMetrics
+ ) PURE;
+
+
+ /// <summary>
+ /// Obtains glyph metrics in font design units with the return values compatible with what GDI would produce.
+ /// Glyphs metrics are used for positioning of individual glyphs.
+ /// </summary>
+ /// <param name="emSize">Logical size of the font in DIP units. A DIP ("device-independent pixel") equals 1/96 inch.</param>
+ /// <param name="pixelsPerDip">Number of physical pixels per DIP. For example, if the DPI of the rendering surface is 96 this
+ /// value is 1.0f. If the DPI is 120, this value is 120.0f/96.</param>
+ /// <param name="transform">Optional transform applied to the glyphs and their positions. This transform is applied after the
+ /// scaling specified by the font size and pixelsPerDip.</param>
+ /// <param name="useGdiNatural">
+ /// When set to FALSE, the metrics are the same as the metrics of GDI aliased text.
+ /// When set to TRUE, the metrics are the same as the metrics of text measured by GDI using a font
+ /// created with CLEARTYPE_NATURAL_QUALITY.
+ /// </param>
+ /// <param name="glyphIndices">An array of glyph indices to compute the metrics for.</param>
+ /// <param name="glyphCount">The number of elements in the glyphIndices array.</param>
+ /// <param name="glyphMetrics">Array of DWRITE_GLYPH_METRICS structures filled by this function.
+ /// The metrics returned by this function are in font design units.</param>
+ /// <param name="isSideways">Indicates whether the font is being used in a sideways run.
+ /// This can affect the glyph metrics if the font has oblique simulation
+ /// because sideways oblique simulation differs from non-sideways oblique simulation.</param>
+ /// <returns>
+ /// Standard HRESULT error code. If any of the input glyph indices are outside of the valid glyph index range
+ /// for the current font face, E_INVALIDARG will be returned.
+ /// </returns>
+ STDMETHOD(GetGdiCompatibleGlyphMetrics)(
+ FLOAT emSize,
+ FLOAT pixelsPerDip,
+ __in_opt DWRITE_MATRIX const* transform,
+ BOOL useGdiNatural,
+ __in_ecount(glyphCount) UINT16 const* glyphIndices,
+ UINT32 glyphCount,
+ __out_ecount(glyphCount) DWRITE_GLYPH_METRICS* glyphMetrics,
+ BOOL isSideways = FALSE
+ ) PURE;
+};
+
+interface IDWriteFactory;
+interface IDWriteFontFileEnumerator;
+
+/// <summary>
+/// The font collection loader interface is used to construct a collection of fonts given a particular type of key.
+/// The font collection loader interface is recommended to be implemented by a singleton object.
+/// IMPORTANT: font collection loader implementations must not register themselves with a DirectWrite factory
+/// inside their constructors and must not unregister themselves in their destructors, because
+/// registration and unregistraton operations increment and decrement the object reference count respectively.
+/// Instead, registration and unregistration of font file loaders with DirectWrite factory should be performed
+/// outside of the font file loader implementation as a separate step.
+/// </summary>
+interface DWRITE_DECLARE_INTERFACE("cca920e4-52f0-492b-bfa8-29c72ee0a468") IDWriteFontCollectionLoader : public IUnknown
+{
+ /// <summary>
+ /// Creates a font file enumerator object that encapsulates a collection of font files.
+ /// The font system calls back to this interface to create a font collection.
+ /// </summary>
+ /// <param name="factory">Factory associated with the loader.</param>
+ /// <param name="collectionKey">Font collection key that uniquely identifies the collection of font files within
+ /// the scope of the font collection loader being used.</param>
+ /// <param name="collectionKeySize">Size of the font collection key in bytes.</param>
+ /// <param name="fontFileEnumerator">Pointer to the newly created font file enumerator.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(CreateEnumeratorFromKey)(
+ IDWriteFactory* factory,
+ __in_bcount(collectionKeySize) void const* collectionKey,
+ UINT32 collectionKeySize,
+ __out IDWriteFontFileEnumerator** fontFileEnumerator
+ ) PURE;
+};
+
+/// <summary>
+/// The font file enumerator interface encapsulates a collection of font files. The font system uses this interface
+/// to enumerate font files when building a font collection.
+/// </summary>
+interface DWRITE_DECLARE_INTERFACE("72755049-5ff7-435d-8348-4be97cfa6c7c") IDWriteFontFileEnumerator : public IUnknown
+{
+ /// <summary>
+ /// Advances to the next font file in the collection. When it is first created, the enumerator is positioned
+ /// before the first element of the collection and the first call to MoveNext advances to the first file.
+ /// </summary>
+ /// <param name="hasCurrentFile">Receives the value TRUE if the enumerator advances to a file, or FALSE if
+ /// the enumerator advanced past the last file in the collection.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(MoveNext)(
+ __out BOOL* hasCurrentFile
+ ) PURE;
+
+ /// <summary>
+ /// Gets a reference to the current font file.
+ /// </summary>
+ /// <param name="fontFile">Pointer to the newly created font file object.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetCurrentFontFile)(
+ __out IDWriteFontFile** fontFile
+ ) PURE;
+};
+
+/// <summary>
+/// Represents a collection of strings indexed by locale name.
+/// </summary>
+interface DWRITE_DECLARE_INTERFACE("08256209-099a-4b34-b86d-c22b110e7771") IDWriteLocalizedStrings : public IUnknown
+{
+ /// <summary>
+ /// Gets the number of language/string pairs.
+ /// </summary>
+ STDMETHOD_(UINT32, GetCount)() PURE;
+
+ /// <summary>
+ /// Gets the index of the item with the specified locale name.
+ /// </summary>
+ /// <param name="localeName">Locale name to look for.</param>
+ /// <param name="index">Receives the zero-based index of the locale name/string pair.</param>
+ /// <param name="exists">Receives TRUE if the locale name exists or FALSE if not.</param>
+ /// <returns>
+ /// Standard HRESULT error code. If the specified locale name does not exist, the return value is S_OK,
+ /// but *index is UINT_MAX and *exists is FALSE.
+ /// </returns>
+ STDMETHOD(FindLocaleName)(
+ __in_z WCHAR const* localeName,
+ __out UINT32* index,
+ __out BOOL* exists
+ ) PURE;
+
+ /// <summary>
+ /// Gets the length in characters (not including the null terminator) of the locale name with the specified index.
+ /// </summary>
+ /// <param name="index">Zero-based index of the locale name.</param>
+ /// <param name="length">Receives the length in characters, not including the null terminator.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetLocaleNameLength)(
+ UINT32 index,
+ __out UINT32* length
+ ) PURE;
+
+ /// <summary>
+ /// Copies the locale name with the specified index to the specified array.
+ /// </summary>
+ /// <param name="index">Zero-based index of the locale name.</param>
+ /// <param name="localeName">Character array that receives the locale name.</param>
+ /// <param name="size">Size of the array in characters. The size must include space for the terminating
+ /// null character.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetLocaleName)(
+ UINT32 index,
+ __out_ecount_z(size) WCHAR* localeName,
+ UINT32 size
+ ) PURE;
+
+ /// <summary>
+ /// Gets the length in characters (not including the null terminator) of the string with the specified index.
+ /// </summary>
+ /// <param name="index">Zero-based index of the string.</param>
+ /// <param name="length">Receives the length in characters, not including the null terminator.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetStringLength)(
+ UINT32 index,
+ __out UINT32* length
+ ) PURE;
+
+ /// <summary>
+ /// Copies the string with the specified index to the specified array.
+ /// </summary>
+ /// <param name="index">Zero-based index of the string.</param>
+ /// <param name="stringBuffer">Character array that receives the string.</param>
+ /// <param name="size">Size of the array in characters. The size must include space for the terminating
+ /// null character.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetString)(
+ UINT32 index,
+ __out_ecount_z(size) WCHAR* stringBuffer,
+ UINT32 size
+ ) PURE;
+};
+
+interface IDWriteFontFamily;
+interface IDWriteFont;
+
+/// <summary>
+/// The IDWriteFontCollection encapsulates a collection of fonts.
+/// </summary>
+interface DWRITE_DECLARE_INTERFACE("a84cee02-3eea-4eee-a827-87c1a02a0fcc") IDWriteFontCollection : public IUnknown
+{
+ /// <summary>
+ /// Gets the number of font families in the collection.
+ /// </summary>
+ STDMETHOD_(UINT32, GetFontFamilyCount)() PURE;
+
+ /// <summary>
+ /// Creates a font family object given a zero-based font family index.
+ /// </summary>
+ /// <param name="index">Zero-based index of the font family.</param>
+ /// <param name="fontFamily">Receives a pointer the newly created font family object.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetFontFamily)(
+ UINT32 index,
+ __out IDWriteFontFamily** fontFamily
+ ) PURE;
+
+ /// <summary>
+ /// Finds the font family with the specified family name.
+ /// </summary>
+ /// <param name="familyName">Name of the font family. The name is not case-sensitive but must otherwise exactly match a family name in the collection.</param>
+ /// <param name="index">Receives the zero-based index of the matching font family if the family name was found or UINT_MAX otherwise.</param>
+ /// <param name="exists">Receives TRUE if the family name exists or FALSE otherwise.</param>
+ /// <returns>
+ /// Standard HRESULT error code. If the specified family name does not exist, the return value is S_OK, but *index is UINT_MAX and *exists is FALSE.
+ /// </returns>
+ STDMETHOD(FindFamilyName)(
+ __in_z WCHAR const* familyName,
+ __out UINT32* index,
+ __out BOOL* exists
+ ) PURE;
+
+ /// <summary>
+ /// Gets the font object that corresponds to the same physical font as the specified font face object. The specified physical font must belong
+ /// to the font collection.
+ /// </summary>
+ /// <param name="fontFace">Font face object that specifies the physical font.</param>
+ /// <param name="font">Receives a pointer to the newly created font object if successful or NULL otherwise.</param>
+ /// <returns>
+ /// Standard HRESULT error code. If the specified physical font is not part of the font collection the return value is DWRITE_E_NOFONT.
+ /// </returns>
+ STDMETHOD(GetFontFromFontFace)(
+ IDWriteFontFace* fontFace,
+ __out IDWriteFont** font
+ ) PURE;
+};
+
+/// <summary>
+/// The IDWriteFontList interface represents a list of fonts.
+/// </summary>
+interface DWRITE_DECLARE_INTERFACE("1a0d8438-1d97-4ec1-aef9-a2fb86ed6acb") IDWriteFontList : public IUnknown
+{
+ /// <summary>
+ /// Gets the font collection that contains the fonts.
+ /// </summary>
+ /// <param name="fontCollection">Receives a pointer to the font collection object.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetFontCollection)(
+ __out IDWriteFontCollection** fontCollection
+ ) PURE;
+
+ /// <summary>
+ /// Gets the number of fonts in the font list.
+ /// </summary>
+ STDMETHOD_(UINT32, GetFontCount)() PURE;
+
+ /// <summary>
+ /// Gets a font given its zero-based index.
+ /// </summary>
+ /// <param name="index">Zero-based index of the font in the font list.</param>
+ /// <param name="font">Receives a pointer to the newly created font object.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetFont)(
+ UINT32 index,
+ __out IDWriteFont** font
+ ) PURE;
+};
+
+/// <summary>
+/// The IDWriteFontFamily interface represents a set of fonts that share the same design but are differentiated
+/// by weight, stretch, and style.
+/// </summary>
+interface DWRITE_DECLARE_INTERFACE("da20d8ef-812a-4c43-9802-62ec4abd7add") IDWriteFontFamily : public IDWriteFontList
+{
+ /// <summary>
+ /// Creates an localized strings object that contains the family names for the font family, indexed by locale name.
+ /// </summary>
+ /// <param name="names">Receives a pointer to the newly created localized strings object.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetFamilyNames)(
+ __out IDWriteLocalizedStrings** names
+ ) PURE;
+
+ /// <summary>
+ /// Gets the font that best matches the specified properties.
+ /// </summary>
+ /// <param name="weight">Requested font weight.</param>
+ /// <param name="stretch">Requested font stretch.</param>
+ /// <param name="style">Requested font style.</param>
+ /// <param name="matchingFont">Receives a pointer to the newly created font object.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetFirstMatchingFont)(
+ DWRITE_FONT_WEIGHT weight,
+ DWRITE_FONT_STRETCH stretch,
+ DWRITE_FONT_STYLE style,
+ __out IDWriteFont** matchingFont
+ ) PURE;
+
+ /// <summary>
+ /// Gets a list of fonts in the font family ranked in order of how well they match the specified properties.
+ /// </summary>
+ /// <param name="weight">Requested font weight.</param>
+ /// <param name="stretch">Requested font stretch.</param>
+ /// <param name="style">Requested font style.</param>
+ /// <param name="matchingFonts">Receives a pointer to the newly created font list object.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetMatchingFonts)(
+ DWRITE_FONT_WEIGHT weight,
+ DWRITE_FONT_STRETCH stretch,
+ DWRITE_FONT_STYLE style,
+ __out IDWriteFontList** matchingFonts
+ ) PURE;
+};
+
+/// <summary>
+/// The IDWriteFont interface represents a physical font in a font collection.
+/// </summary>
+interface DWRITE_DECLARE_INTERFACE("acd16696-8c14-4f5d-877e-fe3fc1d32737") IDWriteFont : public IUnknown
+{
+ /// <summary>
+ /// Gets the font family to which the specified font belongs.
+ /// </summary>
+ /// <param name="fontFamily">Receives a pointer to the font family object.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetFontFamily)(
+ __out IDWriteFontFamily** fontFamily
+ ) PURE;
+
+ /// <summary>
+ /// Gets the weight of the specified font.
+ /// </summary>
+ STDMETHOD_(DWRITE_FONT_WEIGHT, GetWeight)() PURE;
+
+ /// <summary>
+ /// Gets the stretch (aka. width) of the specified font.
+ /// </summary>
+ STDMETHOD_(DWRITE_FONT_STRETCH, GetStretch)() PURE;
+
+ /// <summary>
+ /// Gets the style (aka. slope) of the specified font.
+ /// </summary>
+ STDMETHOD_(DWRITE_FONT_STYLE, GetStyle)() PURE;
+
+ /// <summary>
+ /// Returns TRUE if the font is a symbol font or FALSE if not.
+ /// </summary>
+ STDMETHOD_(BOOL, IsSymbolFont)() PURE;
+
+ /// <summary>
+ /// Gets a localized strings collection containing the face names for the font (e.g., Regular or Bold), indexed by locale name.
+ /// </summary>
+ /// <param name="names">Receives a pointer to the newly created localized strings object.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetFaceNames)(
+ __out IDWriteLocalizedStrings** names
+ ) PURE;
+
+ /// <summary>
+ /// Gets a localized strings collection containing the specified informational strings, indexed by locale name.
+ /// </summary>
+ /// <param name="informationalStringID">Identifies the string to get.</param>
+ /// <param name="informationalStrings">Receives a pointer to the newly created localized strings object.</param>
+ /// <param name="exists">Receives the value TRUE if the font contains the specified string ID or FALSE if not.</param>
+ /// <returns>
+ /// Standard HRESULT error code. If the font does not contain the specified string, the return value is S_OK but
+ /// informationalStrings receives a NULL pointer and exists receives the value FALSE.
+ /// </returns>
+ STDMETHOD(GetInformationalStrings)(
+ DWRITE_INFORMATIONAL_STRING_ID informationalStringID,
+ __out IDWriteLocalizedStrings** informationalStrings,
+ __out BOOL* exists
+ ) PURE;
+
+ /// <summary>
+ /// Gets a value that indicates what simulation are applied to the specified font.
+ /// </summary>
+ STDMETHOD_(DWRITE_FONT_SIMULATIONS, GetSimulations)() PURE;
+
+ /// <summary>
+ /// Gets the metrics for the font.
+ /// </summary>
+ /// <param name="fontMetrics">Receives the font metrics.</param>
+ STDMETHOD_(void, GetMetrics)(
+ __out DWRITE_FONT_METRICS* fontMetrics
+ ) PURE;
+
+ /// <summary>
+ /// Determines whether the font supports the specified character.
+ /// </summary>
+ /// <param name="unicodeValue">Unicode (UCS-4) character value.</param>
+ /// <param name="exists">Receives the value TRUE if the font supports the specified character or FALSE if not.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(HasCharacter)(
+ UINT32 unicodeValue,
+ __out BOOL* exists
+ ) PURE;
+
+ /// <summary>
+ /// Creates a font face object for the font.
+ /// </summary>
+ /// <param name="fontFace">Receives a pointer to the newly created font face object.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(CreateFontFace)(
+ __out IDWriteFontFace** fontFace
+ ) PURE;
+};
+
+/// <summary>
+/// Direction for how reading progresses.
+/// </summary>
+enum DWRITE_READING_DIRECTION
+{
+ /// <summary>
+ /// Reading progresses from left to right.
+ /// </summary>
+ DWRITE_READING_DIRECTION_LEFT_TO_RIGHT,
+
+ /// <summary>
+ /// Reading progresses from right to left.
+ /// </summary>
+ DWRITE_READING_DIRECTION_RIGHT_TO_LEFT
+};
+
+/// <summary>
+/// Direction for how lines of text are placed relative to one another.
+/// </summary>
+enum DWRITE_FLOW_DIRECTION
+{
+ /// <summary>
+ /// Text lines are placed from top to bottom.
+ /// </summary>
+ DWRITE_FLOW_DIRECTION_TOP_TO_BOTTOM
+};
+
+/// <summary>
+/// Alignment of paragraph text along the reading direction axis relative to
+/// the leading and trailing edge of the layout box.
+/// </summary>
+enum DWRITE_TEXT_ALIGNMENT
+{
+ /// <summary>
+ /// The leading edge of the paragraph text is aligned to the layout box's leading edge.
+ /// </summary>
+ DWRITE_TEXT_ALIGNMENT_LEADING,
+
+ /// <summary>
+ /// The trailing edge of the paragraph text is aligned to the layout box's trailing edge.
+ /// </summary>
+ DWRITE_TEXT_ALIGNMENT_TRAILING,
+
+ /// <summary>
+ /// The center of the paragraph text is aligned to the center of the layout box.
+ /// </summary>
+ DWRITE_TEXT_ALIGNMENT_CENTER
+};
+
+/// <summary>
+/// Alignment of paragraph text along the flow direction axis relative to the
+/// flow's beginning and ending edge of the layout box.
+/// </summary>
+enum DWRITE_PARAGRAPH_ALIGNMENT
+{
+ /// <summary>
+ /// The first line of paragraph is aligned to the flow's beginning edge of the layout box.
+ /// </summary>
+ DWRITE_PARAGRAPH_ALIGNMENT_NEAR,
+
+ /// <summary>
+ /// The last line of paragraph is aligned to the flow's ending edge of the layout box.
+ /// </summary>
+ DWRITE_PARAGRAPH_ALIGNMENT_FAR,
+
+ /// <summary>
+ /// The center of the paragraph is aligned to the center of the flow of the layout box.
+ /// </summary>
+ DWRITE_PARAGRAPH_ALIGNMENT_CENTER
+};
+
+/// <summary>
+/// Word wrapping in multiline paragraph.
+/// </summary>
+enum DWRITE_WORD_WRAPPING
+{
+ /// <summary>
+ /// Words are broken across lines to avoid text overflowing the layout box.
+ /// </summary>
+ DWRITE_WORD_WRAPPING_WRAP,
+
+ /// <summary>
+ /// Words are kept within the same line even when it overflows the layout box.
+ /// This option is often used with scrolling to reveal overflow text.
+ /// </summary>
+ DWRITE_WORD_WRAPPING_NO_WRAP
+};
+
+/// <summary>
+/// The method used for line spacing in layout.
+/// </summary>
+enum DWRITE_LINE_SPACING_METHOD
+{
+ /// <summary>
+ /// Line spacing depends solely on the content, growing to accomodate the size of fonts and inline objects.
+ /// </summary>
+ DWRITE_LINE_SPACING_METHOD_DEFAULT,
+
+ /// <summary>
+ /// Lines are explicitly set to uniform spacing, regardless of contained font sizes.
+ /// This can be useful to avoid the uneven appearance that can occur from font fallback.
+ /// </summary>
+ DWRITE_LINE_SPACING_METHOD_UNIFORM
+};
+
+/// <summary>
+/// Text granularity used to trim text overflowing the layout box.
+/// </summary>
+enum DWRITE_TRIMMING_GRANULARITY
+{
+ /// <summary>
+ /// No trimming occurs. Text flows beyond the layout width.
+ /// </summary>
+ DWRITE_TRIMMING_GRANULARITY_NONE,
+
+ /// <summary>
+ /// Trimming occurs at character cluster boundary.
+ /// </summary>
+ DWRITE_TRIMMING_GRANULARITY_CHARACTER,
+
+ /// <summary>
+ /// Trimming occurs at word boundary.
+ /// </summary>
+ DWRITE_TRIMMING_GRANULARITY_WORD
+};
+
+/// <summary>
+/// Typographic feature of text supplied by the font.
+/// </summary>
+enum DWRITE_FONT_FEATURE_TAG
+{
+ DWRITE_FONT_FEATURE_TAG_ALTERNATIVE_FRACTIONS = 0x63726661, // 'afrc'
+ DWRITE_FONT_FEATURE_TAG_PETITE_CAPITALS_FROM_CAPITALS = 0x63703263, // 'c2pc'
+ DWRITE_FONT_FEATURE_TAG_SMALL_CAPITALS_FROM_CAPITALS = 0x63733263, // 'c2sc'
+ DWRITE_FONT_FEATURE_TAG_CONTEXTUAL_ALTERNATES = 0x746c6163, // 'calt'
+ DWRITE_FONT_FEATURE_TAG_CASE_SENSITIVE_FORMS = 0x65736163, // 'case'
+ DWRITE_FONT_FEATURE_TAG_GLYPH_COMPOSITION_DECOMPOSITION = 0x706d6363, // 'ccmp'
+ DWRITE_FONT_FEATURE_TAG_CONTEXTUAL_LIGATURES = 0x67696c63, // 'clig'
+ DWRITE_FONT_FEATURE_TAG_CAPITAL_SPACING = 0x70737063, // 'cpsp'
+ DWRITE_FONT_FEATURE_TAG_CONTEXTUAL_SWASH = 0x68777363, // 'cswh'
+ DWRITE_FONT_FEATURE_TAG_CURSIVE_POSITIONING = 0x73727563, // 'curs'
+ DWRITE_FONT_FEATURE_TAG_DEFAULT = 0x746c6664, // 'dflt'
+ DWRITE_FONT_FEATURE_TAG_DISCRETIONARY_LIGATURES = 0x67696c64, // 'dlig'
+ DWRITE_FONT_FEATURE_TAG_EXPERT_FORMS = 0x74707865, // 'expt'
+ DWRITE_FONT_FEATURE_TAG_FRACTIONS = 0x63617266, // 'frac'
+ DWRITE_FONT_FEATURE_TAG_FULL_WIDTH = 0x64697766, // 'fwid'
+ DWRITE_FONT_FEATURE_TAG_HALF_FORMS = 0x666c6168, // 'half'
+ DWRITE_FONT_FEATURE_TAG_HALANT_FORMS = 0x6e6c6168, // 'haln'
+ DWRITE_FONT_FEATURE_TAG_ALTERNATE_HALF_WIDTH = 0x746c6168, // 'halt'
+ DWRITE_FONT_FEATURE_TAG_HISTORICAL_FORMS = 0x74736968, // 'hist'
+ DWRITE_FONT_FEATURE_TAG_HORIZONTAL_KANA_ALTERNATES = 0x616e6b68, // 'hkna'
+ DWRITE_FONT_FEATURE_TAG_HISTORICAL_LIGATURES = 0x67696c68, // 'hlig'
+ DWRITE_FONT_FEATURE_TAG_HALF_WIDTH = 0x64697768, // 'hwid'
+ DWRITE_FONT_FEATURE_TAG_HOJO_KANJI_FORMS = 0x6f6a6f68, // 'hojo'
+ DWRITE_FONT_FEATURE_TAG_JIS04_FORMS = 0x3430706a, // 'jp04'
+ DWRITE_FONT_FEATURE_TAG_JIS78_FORMS = 0x3837706a, // 'jp78'
+ DWRITE_FONT_FEATURE_TAG_JIS83_FORMS = 0x3338706a, // 'jp83'
+ DWRITE_FONT_FEATURE_TAG_JIS90_FORMS = 0x3039706a, // 'jp90'
+ DWRITE_FONT_FEATURE_TAG_KERNING = 0x6e72656b, // 'kern'
+ DWRITE_FONT_FEATURE_TAG_STANDARD_LIGATURES = 0x6167696c, // 'liga'
+ DWRITE_FONT_FEATURE_TAG_LINING_FIGURES = 0x6d756e6c, // 'lnum'
+ DWRITE_FONT_FEATURE_TAG_LOCALIZED_FORMS = 0x6c636f6c, // 'locl'
+ DWRITE_FONT_FEATURE_TAG_MARK_POSITIONING = 0x6b72616d, // 'mark'
+ DWRITE_FONT_FEATURE_TAG_MATHEMATICAL_GREEK = 0x6b72676d, // 'mgrk'
+ DWRITE_FONT_FEATURE_TAG_MARK_TO_MARK_POSITIONING = 0x6b6d6b6d, // 'mkmk'
+ DWRITE_FONT_FEATURE_TAG_ALTERNATE_ANNOTATION_FORMS = 0x746c616e, // 'nalt'
+ DWRITE_FONT_FEATURE_TAG_NLC_KANJI_FORMS = 0x6b636c6e, // 'nlck'
+ DWRITE_FONT_FEATURE_TAG_OLD_STYLE_FIGURES = 0x6d756e6f, // 'onum'
+ DWRITE_FONT_FEATURE_TAG_ORDINALS = 0x6e64726f, // 'ordn'
+ DWRITE_FONT_FEATURE_TAG_PROPORTIONAL_ALTERNATE_WIDTH = 0x746c6170, // 'palt'
+ DWRITE_FONT_FEATURE_TAG_PETITE_CAPITALS = 0x70616370, // 'pcap'
+ DWRITE_FONT_FEATURE_TAG_PROPORTIONAL_FIGURES = 0x6d756e70, // 'pnum'
+ DWRITE_FONT_FEATURE_TAG_PROPORTIONAL_WIDTHS = 0x64697770, // 'pwid'
+ DWRITE_FONT_FEATURE_TAG_QUARTER_WIDTHS = 0x64697771, // 'qwid'
+ DWRITE_FONT_FEATURE_TAG_REQUIRED_LIGATURES = 0x67696c72, // 'rlig'
+ DWRITE_FONT_FEATURE_TAG_RUBY_NOTATION_FORMS = 0x79627572, // 'ruby'
+ DWRITE_FONT_FEATURE_TAG_STYLISTIC_ALTERNATES = 0x746c6173, // 'salt'
+ DWRITE_FONT_FEATURE_TAG_SCIENTIFIC_INFERIORS = 0x666e6973, // 'sinf'
+ DWRITE_FONT_FEATURE_TAG_SMALL_CAPITALS = 0x70636d73, // 'smcp'
+ DWRITE_FONT_FEATURE_TAG_SIMPLIFIED_FORMS = 0x6c706d73, // 'smpl'
+ DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_1 = 0x31307373, // 'ss01'
+ DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_2 = 0x32307373, // 'ss02'
+ DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_3 = 0x33307373, // 'ss03'
+ DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_4 = 0x34307373, // 'ss04'
+ DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_5 = 0x35307373, // 'ss05'
+ DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_6 = 0x36307373, // 'ss06'
+ DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_7 = 0x37307373, // 'ss07'
+ DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_8 = 0x38307373, // 'ss08'
+ DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_9 = 0x39307373, // 'ss09'
+ DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_10 = 0x30317373, // 'ss10'
+ DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_11 = 0x31317373, // 'ss11'
+ DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_12 = 0x32317373, // 'ss12'
+ DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_13 = 0x33317373, // 'ss13'
+ DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_14 = 0x34317373, // 'ss14'
+ DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_15 = 0x35317373, // 'ss15'
+ DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_16 = 0x36317373, // 'ss16'
+ DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_17 = 0x37317373, // 'ss17'
+ DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_18 = 0x38317373, // 'ss18'
+ DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_19 = 0x39317373, // 'ss19'
+ DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_20 = 0x30327373, // 'ss20'
+ DWRITE_FONT_FEATURE_TAG_SUBSCRIPT = 0x73627573, // 'subs'
+ DWRITE_FONT_FEATURE_TAG_SUPERSCRIPT = 0x73707573, // 'sups'
+ DWRITE_FONT_FEATURE_TAG_SWASH = 0x68737773, // 'swsh'
+ DWRITE_FONT_FEATURE_TAG_TITLING = 0x6c746974, // 'titl'
+ DWRITE_FONT_FEATURE_TAG_TRADITIONAL_NAME_FORMS = 0x6d616e74, // 'tnam'
+ DWRITE_FONT_FEATURE_TAG_TABULAR_FIGURES = 0x6d756e74, // 'tnum'
+ DWRITE_FONT_FEATURE_TAG_TRADITIONAL_FORMS = 0x64617274, // 'trad'
+ DWRITE_FONT_FEATURE_TAG_THIRD_WIDTHS = 0x64697774, // 'twid'
+ DWRITE_FONT_FEATURE_TAG_UNICASE = 0x63696e75, // 'unic'
+ DWRITE_FONT_FEATURE_TAG_SLASHED_ZERO = 0x6f72657a, // 'zero'
+};
+
+/// <summary>
+/// The DWRITE_TEXT_RANGE structure specifies a range of text positions where format is applied.
+/// </summary>
+struct DWRITE_TEXT_RANGE
+{
+ /// <summary>
+ /// The start text position of the range.
+ /// </summary>
+ UINT32 startPosition;
+
+ /// <summary>
+ /// The number of text positions in the range.
+ /// </summary>
+ UINT32 length;
+};
+
+/// <summary>
+/// The DWRITE_FONT_FEATURE structure specifies properties used to identify and execute typographic feature in the font.
+/// </summary>
+struct DWRITE_FONT_FEATURE
+{
+ /// <summary>
+ /// The feature OpenType name identifier.
+ /// </summary>
+ DWRITE_FONT_FEATURE_TAG nameTag;
+
+ /// <summary>
+ /// Execution parameter of the feature.
+ /// </summary>
+ /// <remarks>
+ /// The parameter should be non-zero to enable the feature. Once enabled, a feature can't be disabled again within
+ /// the same range. Features requiring a selector use this value to indicate the selector index.
+ /// </remarks>
+ UINT32 parameter;
+};
+
+/// <summary>
+/// Defines a set of typographic features to be applied during shaping.
+/// Notice the character range which this feature list spans is specified
+/// as a separate parameter to GetGlyphs.
+/// </summary>
+struct DWRITE_TYPOGRAPHIC_FEATURES
+{
+ /// <summary>
+ /// Array of font features.
+ /// </summary>
+ __field_ecount(featureCount) DWRITE_FONT_FEATURE* features;
+
+ /// <summary>
+ /// The number of features.
+ /// </summary>
+ UINT32 featureCount;
+};
+
+/// <summary>
+/// The DWRITE_TRIMMING structure specifies the trimming option for text overflowing the layout box.
+/// </summary>
+struct DWRITE_TRIMMING
+{
+ /// <summary>
+ /// Text granularity of which trimming applies.
+ /// </summary>
+ DWRITE_TRIMMING_GRANULARITY granularity;
+
+ /// <summary>
+ /// Character code used as the delimiter signaling the beginning of the portion of text to be preserved,
+ /// most useful for path ellipsis, where the delimeter would be a slash.
+ /// </summary>
+ UINT32 delimiter;
+
+ /// <summary>
+ /// How many occurences of the delimiter to step back.
+ /// </summary>
+ UINT32 delimiterCount;
+};
+
+
+interface IDWriteTypography;
+interface IDWriteInlineObject;
+
+/// <summary>
+/// The format of text used for text layout purpose.
+/// </summary>
+/// <remarks>
+/// This object may not be thread-safe and it may carry the state of text format change.
+/// </remarks>
+interface DWRITE_DECLARE_INTERFACE("9c906818-31d7-4fd3-a151-7c5e225db55a") IDWriteTextFormat : public IUnknown
+{
+ /// <summary>
+ /// Set alignment option of text relative to layout box's leading and trailing edge.
+ /// </summary>
+ /// <param name="textAlignment">Text alignment option</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(SetTextAlignment)(
+ DWRITE_TEXT_ALIGNMENT textAlignment
+ ) PURE;
+
+ /// <summary>
+ /// Set alignment option of paragraph relative to layout box's top and bottom edge.
+ /// </summary>
+ /// <param name="paragraphAlignment">Paragraph alignment option</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(SetParagraphAlignment)(
+ DWRITE_PARAGRAPH_ALIGNMENT paragraphAlignment
+ ) PURE;
+
+ /// <summary>
+ /// Set word wrapping option.
+ /// </summary>
+ /// <param name="wordWrapping">Word wrapping option</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(SetWordWrapping)(
+ DWRITE_WORD_WRAPPING wordWrapping
+ ) PURE;
+
+ /// <summary>
+ /// Set paragraph reading direction.
+ /// </summary>
+ /// <param name="readingDirection">Text reading direction</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(SetReadingDirection)(
+ DWRITE_READING_DIRECTION readingDirection
+ ) PURE;
+
+ /// <summary>
+ /// Set paragraph flow direction.
+ /// </summary>
+ /// <param name="flowDirection">Paragraph flow direction</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(SetFlowDirection)(
+ DWRITE_FLOW_DIRECTION flowDirection
+ ) PURE;
+
+ /// <summary>
+ /// Set incremental tab stop position.
+ /// </summary>
+ /// <param name="incrementalTabStop">The incremental tab stop value</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(SetIncrementalTabStop)(
+ FLOAT incrementalTabStop
+ ) PURE;
+
+ /// <summary>
+ /// Set trimming options for any trailing text exceeding the layout width
+ /// or for any far text exceeding the layout height.
+ /// </summary>
+ /// <param name="trimmingOptions">Text trimming options.</param>
+ /// <param name="trimmingSign">Application-defined omission sign. This parameter may be NULL if no trimming sign is desired.</param>
+ /// <remarks>
+ /// Any inline object can be used for the trimming sign, but CreateEllipsisTrimmingSign
+ /// provides a typical ellipsis symbol. Trimming is also useful vertically for hiding
+ /// partial lines.
+ /// </remarks>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(SetTrimming)(
+ __in DWRITE_TRIMMING const* trimmingOptions,
+ IDWriteInlineObject* trimmingSign
+ ) PURE;
+
+ /// <summary>
+ /// Set line spacing.
+ /// </summary>
+ /// <param name="lineSpacingMethod">How to determine line height.</param>
+ /// <param name="lineSpacing">The line height, or rather distance between one baseline to another.</param>
+ /// <param name="baseline">Distance from top of line to baseline. A reasonable ratio to lineSpacing is 80%.</param>
+ /// <remarks>
+ /// For the default method, spacing depends solely on the content.
+ /// For uniform spacing, the given line height will override the content.
+ /// </remarks>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(SetLineSpacing)(
+ DWRITE_LINE_SPACING_METHOD lineSpacingMethod,
+ FLOAT lineSpacing,
+ FLOAT baseline
+ ) PURE;
+
+ /// <summary>
+ /// Get alignment option of text relative to layout box's leading and trailing edge.
+ /// </summary>
+ STDMETHOD_(DWRITE_TEXT_ALIGNMENT, GetTextAlignment)() PURE;
+
+ /// <summary>
+ /// Get alignment option of paragraph relative to layout box's top and bottom edge.
+ /// </summary>
+ STDMETHOD_(DWRITE_PARAGRAPH_ALIGNMENT, GetParagraphAlignment)() PURE;
+
+ /// <summary>
+ /// Get word wrapping option.
+ /// </summary>
+ STDMETHOD_(DWRITE_WORD_WRAPPING, GetWordWrapping)() PURE;
+
+ /// <summary>
+ /// Get paragraph reading direction.
+ /// </summary>
+ STDMETHOD_(DWRITE_READING_DIRECTION, GetReadingDirection)() PURE;
+
+ /// <summary>
+ /// Get paragraph flow direction.
+ /// </summary>
+ STDMETHOD_(DWRITE_FLOW_DIRECTION, GetFlowDirection)() PURE;
+
+ /// <summary>
+ /// Get incremental tab stop position.
+ /// </summary>
+ STDMETHOD_(FLOAT, GetIncrementalTabStop)() PURE;
+
+ /// <summary>
+ /// Get trimming options for text overflowing the layout width.
+ /// </summary>
+ /// <param name="trimmingOptions">Text trimming options.</param>
+ /// <param name="trimmingSign">Trimming omission sign. This parameter may be NULL.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetTrimming)(
+ __out DWRITE_TRIMMING* trimmingOptions,
+ __out IDWriteInlineObject** trimmingSign
+ ) PURE;
+
+ /// <summary>
+ /// Get line spacing.
+ /// </summary>
+ /// <param name="lineSpacingMethod">How line height is determined.</param>
+ /// <param name="lineSpacing">The line height, or rather distance between one baseline to another.</param>
+ /// <param name="baseline">Distance from top of line to baseline.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetLineSpacing)(
+ __out DWRITE_LINE_SPACING_METHOD* lineSpacingMethod,
+ __out FLOAT* lineSpacing,
+ __out FLOAT* baseline
+ ) PURE;
+
+ /// <summary>
+ /// Get the font collection.
+ /// </summary>
+ /// <param name="fontCollection">The current font collection.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetFontCollection)(
+ __out IDWriteFontCollection** fontCollection
+ ) PURE;
+
+ /// <summary>
+ /// Get the length of the font family name, in characters, not including the terminating NULL character.
+ /// </summary>
+ STDMETHOD_(UINT32, GetFontFamilyNameLength)() PURE;
+
+ /// <summary>
+ /// Get a copy of the font family name.
+ /// </summary>
+ /// <param name="fontFamilyName">Character array that receives the current font family name</param>
+ /// <param name="nameSize">Size of the character array in character count including the terminated NULL character.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetFontFamilyName)(
+ __out_ecount_z(nameSize) WCHAR* fontFamilyName,
+ UINT32 nameSize
+ ) PURE;
+
+ /// <summary>
+ /// Get the font weight.
+ /// </summary>
+ STDMETHOD_(DWRITE_FONT_WEIGHT, GetFontWeight)() PURE;
+
+ /// <summary>
+ /// Get the font style.
+ /// </summary>
+ STDMETHOD_(DWRITE_FONT_STYLE, GetFontStyle)() PURE;
+
+ /// <summary>
+ /// Get the font stretch.
+ /// </summary>
+ STDMETHOD_(DWRITE_FONT_STRETCH, GetFontStretch)() PURE;
+
+ /// <summary>
+ /// Get the font em height.
+ /// </summary>
+ STDMETHOD_(FLOAT, GetFontSize)() PURE;
+
+ /// <summary>
+ /// Get the length of the locale name, in characters, not including the terminating NULL character.
+ /// </summary>
+ STDMETHOD_(UINT32, GetLocaleNameLength)() PURE;
+
+ /// <summary>
+ /// Get a copy of the locale name.
+ /// </summary>
+ /// <param name="localeName">Character array that receives the current locale name</param>
+ /// <param name="nameSize">Size of the character array in character count including the terminated NULL character.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetLocaleName)(
+ __out_ecount_z(nameSize) WCHAR* localeName,
+ UINT32 nameSize
+ ) PURE;
+};
+
+
+/// <summary>
+/// Font typography setting.
+/// </summary>
+interface DWRITE_DECLARE_INTERFACE("55f1112b-1dc2-4b3c-9541-f46894ed85b6") IDWriteTypography : public IUnknown
+{
+ /// <summary>
+ /// Add font feature.
+ /// </summary>
+ /// <param name="fontFeature">The font feature to add.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(AddFontFeature)(
+ DWRITE_FONT_FEATURE fontFeature
+ ) PURE;
+
+ /// <summary>
+ /// Get the number of font features.
+ /// </summary>
+ STDMETHOD_(UINT32, GetFontFeatureCount)() PURE;
+
+ /// <summary>
+ /// Get the font feature at the specified index.
+ /// </summary>
+ /// <param name="fontFeatureIndex">The zero-based index of the font feature to get.</param>
+ /// <param name="fontFeature">The font feature.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetFontFeature)(
+ UINT32 fontFeatureIndex,
+ __out DWRITE_FONT_FEATURE* fontFeature
+ ) PURE;
+};
+
+enum DWRITE_SCRIPT_SHAPES
+{
+ /// <summary>
+ /// No additional shaping requirement. Text is shaped with the writing system default behavior.
+ /// </summary>
+ DWRITE_SCRIPT_SHAPES_DEFAULT = 0,
+
+ /// <summary>
+ /// Text should leave no visual on display i.e. control or format control characters.
+ /// </summary>
+ DWRITE_SCRIPT_SHAPES_NO_VISUAL = 1
+};
+
+#ifdef DEFINE_ENUM_FLAG_OPERATORS
+DEFINE_ENUM_FLAG_OPERATORS(DWRITE_SCRIPT_SHAPES);
+#endif
+
+/// <summary>
+/// Association of text and its writing system script as well as some display attributes.
+/// </summary>
+struct DWRITE_SCRIPT_ANALYSIS
+{
+ /// <summary>
+ /// Zero-based index representation of writing system script.
+ /// </summary>
+ UINT16 script;
+
+ /// <summary>
+ /// Additional shaping requirement of text.
+ /// </summary>
+ DWRITE_SCRIPT_SHAPES shapes;
+};
+
+/// <summary>
+/// Condition at the edges of inline object or text used to determine
+/// line-breaking behavior.
+/// </summary>
+enum DWRITE_BREAK_CONDITION
+{
+ /// <summary>
+ /// Whether a break is allowed is determined by the condition of the
+ /// neighboring text span or inline object.
+ /// </summary>
+ DWRITE_BREAK_CONDITION_NEUTRAL,
+
+ /// <summary>
+ /// A break is allowed, unless overruled by the condition of the
+ /// neighboring text span or inline object, either prohibited by a
+ /// May Not or forced by a Must.
+ /// </summary>
+ DWRITE_BREAK_CONDITION_CAN_BREAK,
+
+ /// <summary>
+ /// There should be no break, unless overruled by a Must condition from
+ /// the neighboring text span or inline object.
+ /// </summary>
+ DWRITE_BREAK_CONDITION_MAY_NOT_BREAK,
+
+ /// <summary>
+ /// The break must happen, regardless of the condition of the adjacent
+ /// text span or inline object.
+ /// </summary>
+ DWRITE_BREAK_CONDITION_MUST_BREAK
+};
+
+/// <summary>
+/// Line breakpoint characteristics of a character.
+/// </summary>
+struct DWRITE_LINE_BREAKPOINT
+{
+ /// <summary>
+ /// Breaking condition before the character.
+ /// </summary>
+ UINT8 breakConditionBefore : 2;
+
+ /// <summary>
+ /// Breaking condition after the character.
+ /// </summary>
+ UINT8 breakConditionAfter : 2;
+
+ /// <summary>
+ /// The character is some form of whitespace, which may be meaningful
+ /// for justification.
+ /// </summary>
+ UINT8 isWhitespace : 1;
+
+ /// <summary>
+ /// The character is a soft hyphen, often used to indicate hyphenation
+ /// points inside words.
+ /// </summary>
+ UINT8 isSoftHyphen : 1;
+
+ UINT8 padding : 2;
+};
+
+/// <summary>
+/// How to apply number substitution on digits and related punctuation.
+/// </summary>
+enum DWRITE_NUMBER_SUBSTITUTION_METHOD
+{
+ /// <summary>
+ /// Specifies that the substitution method should be determined based
+ /// on LOCALE_IDIGITSUBSTITUTION value of the specified text culture.
+ /// </summary>
+ DWRITE_NUMBER_SUBSTITUTION_METHOD_FROM_CULTURE,
+
+ /// <summary>
+ /// If the culture is Arabic or Farsi, specifies that the number shape
+ /// depend on the context. Either traditional or nominal number shape
+ /// are used depending on the nearest preceding strong character or (if
+ /// there is none) the reading direction of the paragraph.
+ /// </summary>
+ DWRITE_NUMBER_SUBSTITUTION_METHOD_CONTEXTUAL,
+
+ /// <summary>
+ /// Specifies that code points 0x30-0x39 are always rendered as nominal numeral
+ /// shapes (ones of the European number), i.e., no substitution is performed.
+ /// </summary>
+ DWRITE_NUMBER_SUBSTITUTION_METHOD_NONE,
+
+ /// <summary>
+ /// Specifies that number are rendered using the national number shape
+ /// as specified by the LOCALE_SNATIVEDIGITS value of the specified text culture.
+ /// </summary>
+ DWRITE_NUMBER_SUBSTITUTION_METHOD_NATIONAL,
+
+ /// <summary>
+ /// Specifies that number are rendered using the traditional shape
+ /// for the specified culture. For most cultures, this is the same as
+ /// NativeNational. However, NativeNational results in Latin number
+ /// for some Arabic cultures, whereas this value results in Arabic
+ /// number for all Arabic cultures.
+ /// </summary>
+ DWRITE_NUMBER_SUBSTITUTION_METHOD_TRADITIONAL
+};
+
+/// <summary>
+/// Holds the appropriate digits and numeric punctuation for a given locale.
+/// </summary>
+interface DECLSPEC_UUID("14885CC9-BAB0-4f90-B6ED-5C366A2CD03D") DECLSPEC_NOVTABLE IDWriteNumberSubstitution : public IUnknown
+{
+};
+
+/// <summary>
+/// Shaping output properties per input character.
+/// </summary>
+struct DWRITE_SHAPING_TEXT_PROPERTIES
+{
+ /// <summary>
+ /// This character can be shaped independently from the others
+ /// (usually set for the space character).
+ /// </summary>
+ UINT16 isShapedAlone : 1;
+
+ /// <summary>
+ /// Reserved for use by shaping engine.
+ /// </summary>
+ UINT16 reserved : 15;
+};
+
+/// <summary>
+/// Shaping output properties per output glyph.
+/// </summary>
+struct DWRITE_SHAPING_GLYPH_PROPERTIES
+{
+ /// <summary>
+ /// Justification class, whether to use spacing, kashidas, or
+ /// another method. This exists for backwards compatibility
+ /// with Uniscribe's SCRIPT_JUSTIFY enum.
+ /// </summary>
+ UINT16 justification : 4;
+
+ /// <summary>
+ /// Indicates glyph is the first of a cluster.
+ /// </summary>
+ UINT16 isClusterStart : 1;
+
+ /// <summary>
+ /// Glyph is a diacritic.
+ /// </summary>
+ UINT16 isDiacritic : 1;
+
+ /// <summary>
+ /// Glyph has no width, blank, ZWJ, ZWNJ etc.
+ /// </summary>
+ UINT16 isZeroWidthSpace : 1;
+
+ /// <summary>
+ /// Reserved for use by shaping engine.
+ /// </summary>
+ UINT16 reserved : 9;
+};
+
+/// <summary>
+/// The interface implemented by the text analyzer's client to provide text to
+/// the analyzer. It allows the separation between the logical view of text as
+/// a continuous stream of characters identifiable by unique text positions,
+/// and the actual memory layout of potentially discrete blocks of text in the
+/// client's backing store.
+///
+/// If any of these callbacks returns an error, the analysis functions will
+/// stop prematurely and return a callback error. Rather than return E_NOTIMPL,
+/// an application should stub the method and return a constant/null and S_OK.
+/// </summary>
+interface DECLSPEC_UUID("688e1a58-5094-47c8-adc8-fbcea60ae92b") DECLSPEC_NOVTABLE IDWriteTextAnalysisSource : public IUnknown
+{
+ /// <summary>
+ /// Get a block of text starting at the specified text position.
+ /// Returning NULL indicates the end of text - the position is after
+ /// the last character. This function is called iteratively for
+ /// each consecutive block, tying together several fragmented blocks
+ /// in the backing store into a virtual contiguous string.
+ /// </summary>
+ /// <param name="textPosition">First position of the piece to obtain. All
+ /// positions are in UTF16 code-units, not whole characters, which
+ /// matters when supplementary characters are used.</param>
+ /// <param name="textString">Address that receives a pointer to the text block
+ /// at the specified position.</param>
+ /// <param name="textLength">Number of UTF16 units of the retrieved chunk.
+ /// The returned length is not the length of the block, but the length
+ /// remaining in the block, from the given position until its end.
+ /// So querying for a position that is 75 positions into a 100
+ /// postition block would return 25.</param>
+ /// <returns>Pointer to the first character at the given text position.
+ /// NULL indicates no chunk available at the specified position, either
+ /// because textPosition >= the entire text content length or because the
+ /// queried position is not mapped into the app's backing store.</returns>
+ /// <remarks>
+ /// Although apps can implement sparse textual content that only maps part of
+ /// the backing store, the app must map any text that is in the range passed
+ /// to any analysis functions.
+ /// </remarks>
+ STDMETHOD(GetTextAtPosition)(
+ UINT32 textPosition,
+ __out WCHAR const** textString,
+ __out UINT32* textLength
+ ) PURE;
+
+ /// <summary>
+ /// Get a block of text immediately preceding the specified position.
+ /// </summary>
+ /// <param name="textPosition">Position immediately after the last position of the chunk to obtain.</param>
+ /// <param name="textString">Address that receives a pointer to the text block
+ /// at the specified position.</param>
+ /// <param name="textLength">Number of UTF16 units of the retrieved block.
+ /// The length returned is from the given position to the front of
+ /// the block.</param>
+ /// <returns>Pointer to the first character at (textPosition - textLength).
+ /// NULL indicates no chunk available at the specified position, either
+ /// because textPosition == 0,the textPosition > the entire text content
+ /// length, or the queried position is not mapped into the app's backing
+ /// store.</returns>
+ /// <remarks>
+ /// Although apps can implement sparse textual content that only maps part of
+ /// the backing store, the app must map any text that is in the range passed
+ /// to any analysis functions.
+ /// </remarks>
+ STDMETHOD(GetTextBeforePosition)(
+ UINT32 textPosition,
+ __out WCHAR const** textString,
+ __out UINT32* textLength
+ ) PURE;
+
+ /// <summary>
+ /// Get paragraph reading direction.
+ /// </summary>
+ STDMETHOD_(DWRITE_READING_DIRECTION, GetParagraphReadingDirection)() PURE;
+
+ /// <summary>
+ /// Get locale name on the range affected by it.
+ /// </summary>
+ /// <param name="textPosition">Position to get the locale name of.</param>
+ /// <param name="textLength">Receives the length from the given position up to the
+ /// next differing locale.</param>
+ /// <param name="localeName">Address that receives a pointer to the locale
+ /// at the specified position.</param>
+ /// <remarks>
+ /// The localeName pointer must remain valid until the next call or until
+ /// the analysis returns.
+ /// </remarks>
+ STDMETHOD(GetLocaleName)(
+ UINT32 textPosition,
+ __out UINT32* textLength,
+ __out_z WCHAR const** localeName
+ ) PURE;
+
+ /// <summary>
+ /// Get number substitution on the range affected by it.
+ /// </summary>
+ /// <param name="textPosition">Position to get the number substitution of.</param>
+ /// <param name="textLength">Receives the length from the given position up to the
+ /// next differing number substitution.</param>
+ /// <param name="numberSubstitution">Address that receives a pointer to the number substitution
+ /// at the specified position.</param>
+ /// <remarks>
+ /// Any implementation should return the number substitution with an
+ /// incremented ref count, and the analysis will release when finished
+ /// with it (either before the next call or before it returns). However,
+ /// the sink callback may hold onto it after that.
+ /// </remarks>
+ STDMETHOD(GetNumberSubstitution)(
+ UINT32 textPosition,
+ __out UINT32* textLength,
+ __out IDWriteNumberSubstitution** numberSubstitution
+ ) PURE;
+};
+
+/// <summary>
+/// The interface implemented by the text analyzer's client to receive the
+/// output of a given text analysis. The Text analyzer disregards any current
+/// state of the analysis sink, therefore a Set method call on a range
+/// overwrites the previously set analysis result of the same range.
+/// </summary>
+interface DECLSPEC_UUID("5810cd44-0ca0-4701-b3fa-bec5182ae4f6") DECLSPEC_NOVTABLE IDWriteTextAnalysisSink : public IUnknown
+{
+ /// <summary>
+ /// Report script analysis for the text range.
+ /// </summary>
+ /// <param name="textPosition">Starting position to report from.</param>
+ /// <param name="textLength">Number of UTF16 units of the reported range.</param>
+ /// <param name="scriptAnalysis">Script analysis of characters in range.</param>
+ /// <returns>
+ /// A successful code or error code to abort analysis.
+ /// </returns>
+ STDMETHOD(SetScriptAnalysis)(
+ UINT32 textPosition,
+ UINT32 textLength,
+ __in DWRITE_SCRIPT_ANALYSIS const* scriptAnalysis
+ ) PURE;
+
+ /// <summary>
+ /// Repport line-break opportunities for each character, starting from
+ /// the specified position.
+ /// </summary>
+ /// <param name="textPosition">Starting position to report from.</param>
+ /// <param name="textLength">Number of UTF16 units of the reported range.</param>
+ /// <param name="lineBreakpoints">Breaking conditions for each character.</param>
+ /// <returns>
+ /// A successful code or error code to abort analysis.
+ /// </returns>
+ STDMETHOD(SetLineBreakpoints)(
+ UINT32 textPosition,
+ UINT32 textLength,
+ __in_ecount(textLength) DWRITE_LINE_BREAKPOINT const* lineBreakpoints
+ ) PURE;
+
+ /// <summary>
+ /// Set bidirectional level on the range, called once per each
+ /// level run change (either explicit or resolved implicit).
+ /// </summary>
+ /// <param name="textPosition">Starting position to report from.</param>
+ /// <param name="textLength">Number of UTF16 units of the reported range.</param>
+ /// <param name="explicitLevel">Explicit level from embedded control codes
+ /// RLE/RLO/LRE/LRO/PDF, determined before any additional rules.</param>
+ /// <param name="resolvedLevel">Final implicit level considering the
+ /// explicit level and characters' natural directionality, after all
+ /// Bidi rules have been applied.</param>
+ /// <returns>
+ /// A successful code or error code to abort analysis.
+ /// </returns>
+ STDMETHOD(SetBidiLevel)(
+ UINT32 textPosition,
+ UINT32 textLength,
+ UINT8 explicitLevel,
+ UINT8 resolvedLevel
+ ) PURE;
+
+ /// <summary>
+ /// Set number substitution on the range.
+ /// </summary>
+ /// <param name="textPosition">Starting position to report from.</param>
+ /// <param name="textLength">Number of UTF16 units of the reported range.</param>
+ /// <param name="numberSubstitution">The number substitution applicable to
+ /// the returned range of text. The sink callback may hold onto it by
+ /// incrementing its ref count.</param>
+ /// <returns>
+ /// A successful code or error code to abort analysis.
+ /// </returns>
+ /// <remark>
+ /// Unlike script and bidi analysis, where every character passed to the
+ /// analyzer has a result, this will only be called for those ranges where
+ /// substitution is applicable. For any other range, you will simply not
+ /// be called.
+ /// </remark>
+ STDMETHOD(SetNumberSubstitution)(
+ UINT32 textPosition,
+ UINT32 textLength,
+ __notnull IDWriteNumberSubstitution* numberSubstitution
+ ) PURE;
+};
+
+/// <summary>
+/// Analyzes various text properties for complex script processing.
+/// </summary>
+interface DWRITE_DECLARE_INTERFACE("b7e6163e-7f46-43b4-84b3-e4e6249c365d") IDWriteTextAnalyzer : public IUnknown
+{
+ /// <summary>
+ /// Analyzes a text range for script boundaries, reading text attributes
+ /// from the source and reporting the Unicode script ID to the sink
+ /// callback SetScript.
+ /// </summary>
+ /// <param name="analysisSource">Source object to analyze.</param>
+ /// <param name="textPosition">Starting position within the source object.</param>
+ /// <param name="textLength">Length to analyze.</param>
+ /// <param name="analysisSink">Callback object.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(AnalyzeScript)(
+ IDWriteTextAnalysisSource* analysisSource,
+ UINT32 textPosition,
+ UINT32 textLength,
+ IDWriteTextAnalysisSink* analysisSink
+ ) PURE;
+
+ /// <summary>
+ /// Analyzes a text range for script directionality, reading attributes
+ /// from the source and reporting levels to the sink callback SetBidiLevel.
+ /// </summary>
+ /// <param name="analysisSource">Source object to analyze.</param>
+ /// <param name="textPosition">Starting position within the source object.</param>
+ /// <param name="textLength">Length to analyze.</param>
+ /// <param name="analysisSink">Callback object.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ /// <remarks>
+ /// While the function can handle multiple paragraphs, the text range
+ /// should not arbitrarily split the middle of paragraphs. Otherwise the
+ /// returned levels may be wrong, since the Bidi algorithm is meant to
+ /// apply to the paragraph as a whole.
+ /// </remarks>
+ /// <remarks>
+ /// Embedded control codes (LRE/LRO/RLE/RLO/PDF) are taken into account.
+ /// </remarks>
+ STDMETHOD(AnalyzeBidi)(
+ IDWriteTextAnalysisSource* analysisSource,
+ UINT32 textPosition,
+ UINT32 textLength,
+ IDWriteTextAnalysisSink* analysisSink
+ ) PURE;
+
+ /// <summary>
+ /// Analyzes a text range for spans where number substitution is applicable,
+ /// reading attributes from the source and reporting substitutable ranges
+ /// to the sink callback SetNumberSubstitution.
+ /// </summary>
+ /// <param name="analysisSource">Source object to analyze.</param>
+ /// <param name="textPosition">Starting position within the source object.</param>
+ /// <param name="textLength">Length to analyze.</param>
+ /// <param name="analysisSink">Callback object.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ /// <remarks>
+ /// While the function can handle multiple ranges of differing number
+ /// substitutions, the text ranges should not arbitrarily split the
+ /// middle of numbers. Otherwise it will treat the numbers separately
+ /// and will not translate any intervening punctuation.
+ /// </remarks>
+ /// <remarks>
+ /// Embedded control codes (LRE/LRO/RLE/RLO/PDF) are taken into account.
+ /// </remarks>
+ STDMETHOD(AnalyzeNumberSubstitution)(
+ IDWriteTextAnalysisSource* analysisSource,
+ UINT32 textPosition,
+ UINT32 textLength,
+ IDWriteTextAnalysisSink* analysisSink
+ ) PURE;
+
+ /// <summary>
+ /// Analyzes a text range for potential breakpoint opportunities, reading
+ /// attributes from the source and reporting breakpoint opportunities to
+ /// the sink callback SetLineBreakpoints.
+ /// </summary>
+ /// <param name="analysisSource">Source object to analyze.</param>
+ /// <param name="textPosition">Starting position within the source object.</param>
+ /// <param name="textLength">Length to analyze.</param>
+ /// <param name="analysisSink">Callback object.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ /// <remarks>
+ /// While the function can handle multiple paragraphs, the text range
+ /// should not arbitrarily split the middle of paragraphs, unless the
+ /// given text span is considered a whole unit. Otherwise the
+ /// returned properties for the first and last characters will
+ /// inappropriately allow breaks.
+ /// </remarks>
+ /// <remarks>
+ /// Special cases include the first, last, and surrogate characters. Any
+ /// text span is treated as if adjacent to inline objects on either side.
+ /// So the rules with contingent-break opportunities are used, where the
+ /// edge between text and inline objects is always treated as a potential
+ /// break opportunity, dependent on any overriding rules of the adjacent
+ /// objects to prohibit or force the break (see Unicode TR #14).
+ /// Surrogate pairs never break between.
+ /// </remarks>
+ STDMETHOD(AnalyzeLineBreakpoints)(
+ IDWriteTextAnalysisSource* analysisSource,
+ UINT32 textPosition,
+ UINT32 textLength,
+ IDWriteTextAnalysisSink* analysisSink
+ ) PURE;
+
+ /// <summary>
+ /// Parses the input text string and maps it to the set of glyphs and associated glyph data
+ /// according to the font and the writing system's rendering rules.
+ /// </summary>
+ /// <param name="textString">The string to convert to glyphs.</param>
+ /// <param name="textLength">The length of textString.</param>
+ /// <param name="fontFace">The font face to get glyphs from.</param>
+ /// <param name="isSideways">Set to true if the text is intended to be
+ /// drawn vertically.</param>
+ /// <param name="isRightToLeft">Set to TRUE for right-to-left text.</param>
+ /// <param name="scriptAnalysis">Script analysis result from AnalyzeScript.</param>
+ /// <param name="localeName">The locale to use when selecting glyphs.
+ /// e.g. the same character may map to different glyphs for ja-jp vs zh-chs.
+ /// If this is NULL then the default mapping based on the script is used.</param>
+ /// <param name="numberSubstitution">Optional number substitution which
+ /// selects the appropriate glyphs for digits and related numeric characters,
+ /// depending on the results obtained from AnalyzeNumberSubstitution. Passing
+ /// null indicates that no substitution is needed and that the digits should
+ /// receive nominal glyphs.</param>
+ /// <param name="features">An array of pointers to the sets of typographic
+ /// features to use in each feature range.</param>
+ /// <param name="featureRangeLengths">The length of each feature range, in characters.
+ /// The sum of all lengths should be equal to textLength.</param>
+ /// <param name="featureRanges">The number of feature ranges.</param>
+ /// <param name="maxGlyphCount">The maximum number of glyphs that can be
+ /// returned.</param>
+ /// <param name="clusterMap">The mapping from character ranges to glyph
+ /// ranges.</param>
+ /// <param name="textProps">Per-character output properties.</param>
+ /// <param name="glyphIndices">Output glyph indices.</param>
+ /// <param name="glyphProps">Per-glyph output properties.</param>
+ /// <param name="actualGlyphCount">The actual number of glyphs returned if
+ /// the call succeeds.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ /// <remarks>
+ /// Note that the mapping from characters to glyphs is, in general, many-
+ /// to-many. The recommended estimate for the per-glyph output buffers is
+ /// (3 * textLength / 2 + 16). This is not guaranteed to be sufficient.
+ ///
+ /// The value of the actualGlyphCount parameter is only valid if the call
+ /// succeeds. In the event that maxGlyphCount is not big enough
+ /// E_NOT_SUFFICIENT_BUFFER, which is equivalent to HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER),
+ /// will be returned. The application should allocate a larger buffer and try again.
+ /// </remarks>
+ STDMETHOD(GetGlyphs)(
+ __in_ecount(textLength) WCHAR const* textString,
+ UINT32 textLength,
+ IDWriteFontFace* fontFace,
+ BOOL isSideways,
+ BOOL isRightToLeft,
+ __in DWRITE_SCRIPT_ANALYSIS const* scriptAnalysis,
+ __in_z_opt WCHAR const* localeName,
+ __maybenull IDWriteNumberSubstitution* numberSubstitution,
+ __in_ecount_opt(featureRanges) DWRITE_TYPOGRAPHIC_FEATURES const** features,
+ __in_ecount_opt(featureRanges) UINT32 const* featureRangeLengths,
+ UINT32 featureRanges,
+ UINT32 maxGlyphCount,
+ __out_ecount(textLength) UINT16* clusterMap,
+ __out_ecount(textLength) DWRITE_SHAPING_TEXT_PROPERTIES* textProps,
+ __out_ecount(maxGlyphCount) UINT16* glyphIndices,
+ __out_ecount(maxGlyphCount) DWRITE_SHAPING_GLYPH_PROPERTIES* glyphProps,
+ __out UINT32* actualGlyphCount
+ ) PURE;
+
+ /// <summary>
+ /// Place glyphs output from the GetGlyphs method according to the font
+ /// and the writing system's rendering rules.
+ /// </summary>
+ /// <param name="textString">The original string the glyphs came from.</param>
+ /// <param name="clusterMap">The mapping from character ranges to glyph
+ /// ranges. Returned by GetGlyphs.</param>
+ /// <param name="textProps">Per-character properties. Returned by
+ /// GetGlyphs.</param>
+ /// <param name="textLength">The length of textString.</param>
+ /// <param name="glyphIndices">Glyph indices. See GetGlyphs</param>
+ /// <param name="glyphProps">Per-glyph properties. See GetGlyphs</param>
+ /// <param name="glyphCount">The number of glyphs.</param>
+ /// <param name="fontFace">The font face the glyphs came from.</param>
+ /// <param name="fontEmSize">Logical font size in DIP's.</param>
+ /// <param name="isSideways">Set to true if the text is intended to be
+ /// drawn vertically.</param>
+ /// <param name="isRightToLeft">Set to TRUE for right-to-left text.</param>
+ /// <param name="scriptAnalysis">Script analysis result from AnalyzeScript.</param>
+ /// <param name="localeName">The locale to use when selecting glyphs.
+ /// e.g. the same character may map to different glyphs for ja-jp vs zh-chs.
+ /// If this is NULL then the default mapping based on the script is used.</param>
+ /// <param name="features">An array of pointers to the sets of typographic
+ /// features to use in each feature range.</param>
+ /// <param name="featureRangeLengths">The length of each feature range, in characters.
+ /// The sum of all lengths should be equal to textLength.</param>
+ /// <param name="featureRanges">The number of feature ranges.</param>
+ /// <param name="glyphAdvances">The advance width of each glyph.</param>
+ /// <param name="glyphOffsets">The offset of the origin of each glyph.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetGlyphPlacements)(
+ __in_ecount(textLength) WCHAR const* textString,
+ __in_ecount(textLength) UINT16 const* clusterMap,
+ __in_ecount(textLength) DWRITE_SHAPING_TEXT_PROPERTIES* textProps,
+ UINT32 textLength,
+ __in_ecount(glyphCount) UINT16 const* glyphIndices,
+ __in_ecount(glyphCount) DWRITE_SHAPING_GLYPH_PROPERTIES const* glyphProps,
+ UINT32 glyphCount,
+ IDWriteFontFace * fontFace,
+ FLOAT fontEmSize,
+ BOOL isSideways,
+ BOOL isRightToLeft,
+ __in DWRITE_SCRIPT_ANALYSIS const* scriptAnalysis,
+ __in_z_opt WCHAR const* localeName,
+ __in_ecount_opt(featureRanges) DWRITE_TYPOGRAPHIC_FEATURES const** features,
+ __in_ecount_opt(featureRanges) UINT32 const* featureRangeLengths,
+ UINT32 featureRanges,
+ __out_ecount(glyphCount) FLOAT* glyphAdvances,
+ __out_ecount(glyphCount) DWRITE_GLYPH_OFFSET* glyphOffsets
+ ) PURE;
+
+ /// <summary>
+ /// Place glyphs output from the GetGlyphs method according to the font
+ /// and the writing system's rendering rules.
+ /// </summary>
+ /// <param name="textString">The original string the glyphs came from.</param>
+ /// <param name="clusterMap">The mapping from character ranges to glyph
+ /// ranges. Returned by GetGlyphs.</param>
+ /// <param name="textProps">Per-character properties. Returned by
+ /// GetGlyphs.</param>
+ /// <param name="textLength">The length of textString.</param>
+ /// <param name="glyphIndices">Glyph indices. See GetGlyphs</param>
+ /// <param name="glyphProps">Per-glyph properties. See GetGlyphs</param>
+ /// <param name="glyphCount">The number of glyphs.</param>
+ /// <param name="fontFace">The font face the glyphs came from.</param>
+ /// <param name="fontEmSize">Logical font size in DIP's.</param>
+ /// <param name="pixelsPerDip">Number of physical pixels per DIP. For example, if the DPI of the rendering surface is 96 this
+ /// value is 1.0f. If the DPI is 120, this value is 120.0f/96.</param>
+ /// <param name="transform">Optional transform applied to the glyphs and their positions. This transform is applied after the
+ /// scaling specified by the font size and pixelsPerDip.</param>
+ /// <param name="useGdiNatural">
+ /// When set to FALSE, the metrics are the same as the metrics of GDI aliased text.
+ /// When set to TRUE, the metrics are the same as the metrics of text measured by GDI using a font
+ /// created with CLEARTYPE_NATURAL_QUALITY.
+ /// </param>
+ /// <param name="isSideways">Set to true if the text is intended to be
+ /// drawn vertically.</param>
+ /// <param name="isRightToLeft">Set to TRUE for right-to-left text.</param>
+ /// <param name="scriptAnalysis">Script analysis result from AnalyzeScript.</param>
+ /// <param name="localeName">The locale to use when selecting glyphs.
+ /// e.g. the same character may map to different glyphs for ja-jp vs zh-chs.
+ /// If this is NULL then the default mapping based on the script is used.</param>
+ /// <param name="features">An array of pointers to the sets of typographic
+ /// features to use in each feature range.</param>
+ /// <param name="featureRangeLengths">The length of each feature range, in characters.
+ /// The sum of all lengths should be equal to textLength.</param>
+ /// <param name="featureRanges">The number of feature ranges.</param>
+ /// <param name="glyphAdvances">The advance width of each glyph.</param>
+ /// <param name="glyphOffsets">The offset of the origin of each glyph.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetGdiCompatibleGlyphPlacements)(
+ __in_ecount(textLength) WCHAR const* textString,
+ __in_ecount(textLength) UINT16 const* clusterMap,
+ __in_ecount(textLength) DWRITE_SHAPING_TEXT_PROPERTIES* textProps,
+ UINT32 textLength,
+ __in_ecount(glyphCount) UINT16 const* glyphIndices,
+ __in_ecount(glyphCount) DWRITE_SHAPING_GLYPH_PROPERTIES const* glyphProps,
+ UINT32 glyphCount,
+ IDWriteFontFace * fontFace,
+ FLOAT fontEmSize,
+ FLOAT pixelsPerDip,
+ __in_opt DWRITE_MATRIX const* transform,
+ BOOL useGdiNatural,
+ BOOL isSideways,
+ BOOL isRightToLeft,
+ __in DWRITE_SCRIPT_ANALYSIS const* scriptAnalysis,
+ __in_z_opt WCHAR const* localeName,
+ __in_ecount_opt(featureRanges) DWRITE_TYPOGRAPHIC_FEATURES const** features,
+ __in_ecount_opt(featureRanges) UINT32 const* featureRangeLengths,
+ UINT32 featureRanges,
+ __out_ecount(glyphCount) FLOAT* glyphAdvances,
+ __out_ecount(glyphCount) DWRITE_GLYPH_OFFSET* glyphOffsets
+ ) PURE;
+};
+
+/// <summary>
+/// The DWRITE_GLYPH_RUN structure contains the information needed by renderers
+/// to draw glyph runs. All coordinates are in device independent pixels (DIPs).
+/// </summary>
+struct DWRITE_GLYPH_RUN
+{
+ /// <summary>
+ /// The physical font face to draw with.
+ /// </summary>
+ __notnull IDWriteFontFace* fontFace;
+
+ /// <summary>
+ /// Logical size of the font in DIPs, not points (equals 1/96 inch).
+ /// </summary>
+ FLOAT fontEmSize;
+
+ /// <summary>
+ /// The number of glyphs.
+ /// </summary>
+ UINT32 glyphCount;
+
+ /// <summary>
+ /// The indices to render.
+ /// </summary>
+ __field_ecount(glyphCount) UINT16 const* glyphIndices;
+
+ /// <summary>
+ /// Glyph advance widths.
+ /// </summary>
+ __field_ecount_opt(glyphCount) FLOAT const* glyphAdvances;
+
+ /// <summary>
+ /// Glyph offsets.
+ /// </summary>
+ __field_ecount_opt(glyphCount) DWRITE_GLYPH_OFFSET const* glyphOffsets;
+
+ /// <summary>
+ /// If true, specifies that glyphs are rotated 90 degrees to the left and
+ /// vertical metrics are used. Vertical writing is achieved by specifying
+ /// isSideways = true and rotating the entire run 90 degrees to the right
+ /// via a rotate transform.
+ /// </summary>
+ BOOL isSideways;
+
+ /// <summary>
+ /// The implicit resolved bidi level of the run. Odd levels indicate
+ /// right-to-left languages like Hebrew and Arabic, while even levels
+ /// indicate left-to-right languages like English and Japanese (when
+ /// written horizontally). For right-to-left languages, the text origin
+ /// is on the right, and text should be drawn to the left.
+ /// </summary>
+ UINT32 bidiLevel;
+};
+
+/// <summary>
+/// The DWRITE_GLYPH_RUN_DESCRIPTION structure contains additional properties
+/// related to those in DWRITE_GLYPH_RUN.
+/// </summary>
+struct DWRITE_GLYPH_RUN_DESCRIPTION
+{
+ /// <summary>
+ /// The locale name associated with this run.
+ /// </summary>
+ __nullterminated WCHAR const* localeName;
+
+ /// <summary>
+ /// The text associated with the glyphs.
+ /// </summary>
+ __field_ecount(stringLength) WCHAR const* string;
+
+ /// <summary>
+ /// The number of characters (UTF16 code-units).
+ /// Note that this may be different than the number of glyphs.
+ /// </summary>
+ UINT32 stringLength;
+
+ /// <summary>
+ /// An array of indices to the glyph indices array, of the first glyphs of
+ /// all the glyph clusters of the glyphs to render.
+ /// </summary>
+ __field_ecount(stringLength) UINT16 const* clusterMap;
+
+ /// <summary>
+ /// Corresponding text position in the original string
+ /// this glyph run came from.
+ /// </summary>
+ UINT32 textPosition;
+};
+
+/// <summary>
+/// The DWRITE_UNDERLINE structure contains about the size and placement of
+/// underlines. All coordinates are in device independent pixels (DIPs).
+/// </summary>
+struct DWRITE_UNDERLINE
+{
+ /// <summary>
+ /// Width of the underline, measured parallel to the baseline.
+ /// </summary>
+ FLOAT width;
+
+ /// <summary>
+ /// Thickness of the underline, measured perpendicular to the
+ /// baseline.
+ /// </summary>
+ FLOAT thickness;
+
+ /// <summary>
+ /// Offset of the underline from the baseline.
+ /// A positive offset represents a position below the baseline and
+ /// a negative offset is above.
+ /// </summary>
+ FLOAT offset;
+
+ /// <summary>
+ /// Height of the tallest run where the underline applies.
+ /// </summary>
+ FLOAT runHeight;
+
+ /// <summary>
+ /// Reading direction of the text associated with the underline. This
+ /// value is used to interpret whether the width value runs horizontally
+ /// or vertically.
+ /// </summary>
+ DWRITE_READING_DIRECTION readingDirection;
+
+ /// <summary>
+ /// Flow direction of the text associated with the underline. This value
+ /// is used to interpret whether the thickness value advances top to
+ /// bottom, left to right, or right to left.
+ /// </summary>
+ DWRITE_FLOW_DIRECTION flowDirection;
+
+ /// <summary>
+ /// Locale of the text the underline is being drawn under. Can be
+ /// pertinent where the locale affects how the underline is drawn.
+ /// For example, in vertical text, the underline belongs on the
+ /// left for Chinese but on the right for Japanese.
+ /// This choice is completely left up to higher levels.
+ /// </summary>
+ __nullterminated WCHAR const* localeName;
+
+ /// <summary>
+ /// The measuring mode can be useful to the renderer to determine how
+ /// underlines are rendered, e.g. rounding the thickness to a whole pixel
+ /// in GDI-compatible modes.
+ /// </summary>
+ DWRITE_MEASURING_MODE measuringMode;
+};
+
+/// <summary>
+/// The DWRITE_STRIKETHROUGH structure contains about the size and placement of
+/// strickthroughs. All coordinates are in device independent pixels (DIPs).
+/// </summary>
+struct DWRITE_STRIKETHROUGH
+{
+ /// <summary>
+ /// Width of the strikethrough, measured parallel to the baseline.
+ /// </summary>
+ FLOAT width;
+
+ /// <summary>
+ /// Thickness of the strikethrough, measured perpendicular to the
+ /// baseline.
+ /// </summary>
+ FLOAT thickness;
+
+ /// <summary>
+ /// Offset of the stikethrough from the baseline.
+ /// A positive offset represents a position below the baseline and
+ /// a negative offset is above.
+ /// </summary>
+ FLOAT offset;
+
+ /// <summary>
+ /// Reading direction of the text associated with the strikethrough. This
+ /// value is used to interpret whether the width value runs horizontally
+ /// or vertically.
+ /// </summary>
+ DWRITE_READING_DIRECTION readingDirection;
+
+ /// <summary>
+ /// Flow direction of the text associated with the strikethrough. This
+ /// value is used to interpret whether the thickness value advances top to
+ /// bottom, left to right, or right to left.
+ /// </summary>
+ DWRITE_FLOW_DIRECTION flowDirection;
+
+ /// <summary>
+ /// Locale of the range. Can be pertinent where the locale affects the style.
+ /// </summary>
+ __nullterminated WCHAR const* localeName;
+
+ /// <summary>
+ /// The measuring mode can be useful to the renderer to determine how
+ /// underlines are rendered, e.g. rounding the thickness to a whole pixel
+ /// in GDI-compatible modes.
+ /// </summary>
+ DWRITE_MEASURING_MODE measuringMode;
+};
+
+/// <summary>
+/// The DWRITE_LINE_METRICS structure contains information about a formatted
+/// line of text.
+/// </summary>
+struct DWRITE_LINE_METRICS
+{
+ /// <summary>
+ /// The number of total text positions in the line.
+ /// This includes any trailing whitespace and newline characters.
+ /// </summary>
+ UINT32 length;
+
+ /// <summary>
+ /// The number of whitespace positions at the end of the line. Newline
+ /// sequences are considered whitespace.
+ /// </summary>
+ UINT32 trailingWhitespaceLength;
+
+ /// <summary>
+ /// The number of characters in the newline sequence at the end of the line.
+ /// If the count is zero, then the line was either wrapped or it is the
+ /// end of the text.
+ /// </summary>
+ UINT32 newlineLength;
+
+ /// <summary>
+ /// Height of the line as measured from top to bottom.
+ /// </summary>
+ FLOAT height;
+
+ /// <summary>
+ /// Distance from the top of the line to its baseline.
+ /// </summary>
+ FLOAT baseline;
+
+ /// <summary>
+ /// The line is trimmed.
+ /// </summary>
+ BOOL isTrimmed;
+};
+
+
+/// <summary>
+/// The DWRITE_CLUSTER_METRICS structure contains information about a glyph cluster.
+/// </summary>
+struct DWRITE_CLUSTER_METRICS
+{
+ /// <summary>
+ /// The total advance width of all glyphs in the cluster.
+ /// </summary>
+ FLOAT width;
+
+ /// <summary>
+ /// The number of text positions in the cluster.
+ /// </summary>
+ UINT16 length;
+
+ /// <summary>
+ /// Indicate whether line can be broken right after the cluster.
+ /// </summary>
+ UINT16 canWrapLineAfter : 1;
+
+ /// <summary>
+ /// Indicate whether the cluster corresponds to whitespace character.
+ /// </summary>
+ UINT16 isWhitespace : 1;
+
+ /// <summary>
+ /// Indicate whether the cluster corresponds to a newline character.
+ /// </summary>
+ UINT16 isNewline : 1;
+
+ /// <summary>
+ /// Indicate whether the cluster corresponds to soft hyphen character.
+ /// </summary>
+ UINT16 isSoftHyphen : 1;
+
+ /// <summary>
+ /// Indicate whether the cluster is read from right to left.
+ /// </summary>
+ UINT16 isRightToLeft : 1;
+
+ UINT16 padding : 11;
+};
+
+
+/// <summary>
+/// Overall metrics associated with text after layout.
+/// All coordinates are in device independent pixels (DIPs).
+/// </summary>
+struct DWRITE_TEXT_METRICS
+{
+ /// <summary>
+ /// Left-most point of formatted text relative to layout box
+ /// (excluding any glyph overhang).
+ /// </summary>
+ FLOAT left;
+
+ /// <summary>
+ /// Top-most point of formatted text relative to layout box
+ /// (excluding any glyph overhang).
+ /// </summary>
+ FLOAT top;
+
+ /// <summary>
+ /// The width of the formatted text ignoring trailing whitespace
+ /// at the end of each line.
+ /// </summary>
+ FLOAT width;
+
+ /// <summary>
+ /// The width of the formatted text taking into account the
+ /// trailing whitespace at the end of each line.
+ /// </summary>
+ FLOAT widthIncludingTrailingWhitespace;
+
+ /// <summary>
+ /// The height of the formatted text. The height of an empty string
+ /// is determined by the size of the default font's line height.
+ /// </summary>
+ FLOAT height;
+
+ /// <summary>
+ /// Initial width given to the layout. Depending on whether the text
+ /// was wrapped or not, it can be either larger or smaller than the
+ /// text content width.
+ /// </summary>
+ FLOAT layoutWidth;
+
+ /// <summary>
+ /// Initial height given to the layout. Depending on the length of the
+ /// text, it may be larger or smaller than the text content height.
+ /// </summary>
+ FLOAT layoutHeight;
+
+ /// <summary>
+ /// The maximum reordering count of any line of text, used
+ /// to calculate the most number of hit-testing boxes needed.
+ /// If the layout has no bidirectional text or no text at all,
+ /// the minimum level is 1.
+ /// </summary>
+ UINT32 maxBidiReorderingDepth;
+
+ /// <summary>
+ /// Total number of lines.
+ /// </summary>
+ UINT32 lineCount;
+};
+
+
+/// <summary>
+/// Properties describing the geometric measurement of an
+/// application-defined inline object.
+/// </summary>
+struct DWRITE_INLINE_OBJECT_METRICS
+{
+ /// <summary>
+ /// Width of the inline object.
+ /// </summary>
+ FLOAT width;
+
+ /// <summary>
+ /// Height of the inline object as measured from top to bottom.
+ /// </summary>
+ FLOAT height;
+
+ /// <summary>
+ /// Distance from the top of the object to the baseline where it is lined up with the adjacent text.
+ /// If the baseline is at the bottom, baseline simply equals height.
+ /// </summary>
+ FLOAT baseline;
+
+ /// <summary>
+ /// Flag indicating whether the object is to be placed upright or alongside the text baseline
+ /// for vertical text.
+ /// </summary>
+ BOOL supportsSideways;
+};
+
+
+/// <summary>
+/// The DWRITE_OVERHANG_METRICS structure holds how much any visible pixels
+/// (in DIPs) overshoot each side of the layout or inline objects.
+/// </summary>
+/// <remarks>
+/// Positive overhangs indicate that the visible area extends outside the layout
+/// box or inline object, while negative values mean there is whitespace inside.
+/// The returned values are unaffected by rendering transforms or pixel snapping.
+/// Additionally, they may not exactly match final target's pixel bounds after
+/// applying grid fitting and hinting.
+/// </remarks>
+struct DWRITE_OVERHANG_METRICS
+{
+ /// <summary>
+ /// The distance from the left-most visible DIP to its left alignment edge.
+ /// </summary>
+ FLOAT left;
+
+ /// <summary>
+ /// The distance from the top-most visible DIP to its top alignment edge.
+ /// </summary>
+ FLOAT top;
+
+ /// <summary>
+ /// The distance from the right-most visible DIP to its right alignment edge.
+ /// </summary>
+ FLOAT right;
+
+ /// <summary>
+ /// The distance from the bottom-most visible DIP to its bottom alignment edge.
+ /// </summary>
+ FLOAT bottom;
+};
+
+
+/// <summary>
+/// Geometry enclosing of text positions.
+/// </summary>
+struct DWRITE_HIT_TEST_METRICS
+{
+ /// <summary>
+ /// First text position within the geometry.
+ /// </summary>
+ UINT32 textPosition;
+
+ /// <summary>
+ /// Number of text positions within the geometry.
+ /// </summary>
+ UINT32 length;
+
+ /// <summary>
+ /// Left position of the top-left coordinate of the geometry.
+ /// </summary>
+ FLOAT left;
+
+ /// <summary>
+ /// Top position of the top-left coordinate of the geometry.
+ /// </summary>
+ FLOAT top;
+
+ /// <summary>
+ /// Geometry's width.
+ /// </summary>
+ FLOAT width;
+
+ /// <summary>
+ /// Geometry's height.
+ /// </summary>
+ FLOAT height;
+
+ /// <summary>
+ /// Bidi level of text positions enclosed within the geometry.
+ /// </summary>
+ UINT32 bidiLevel;
+
+ /// <summary>
+ /// Geometry encloses text?
+ /// </summary>
+ BOOL isText;
+
+ /// <summary>
+ /// Range is trimmed.
+ /// </summary>
+ BOOL isTrimmed;
+};
+
+
+interface IDWriteTextRenderer;
+
+
+/// <summary>
+/// The IDWriteInlineObject interface wraps an application defined inline graphic,
+/// allowing DWrite to query metrics as if it was a glyph inline with the text.
+/// </summary>
+interface DWRITE_DECLARE_INTERFACE("8339FDE3-106F-47ab-8373-1C6295EB10B3") IDWriteInlineObject : public IUnknown
+{
+ /// <summary>
+ /// The application implemented rendering callback (IDWriteTextRenderer::DrawInlineObject)
+ /// can use this to draw the inline object without needing to cast or query the object
+ /// type. The text layout does not call this method directly.
+ /// </summary>
+ /// <param name="clientDrawingContext">The context passed to IDWriteTextLayout::Draw.</param>
+ /// <param name="renderer">The renderer passed to IDWriteTextLayout::Draw as the object's containing parent.</param>
+ /// <param name="originX">X-coordinate at the top-left corner of the inline object.</param>
+ /// <param name="originY">Y-coordinate at the top-left corner of the inline object.</param>
+ /// <param name="isSideways">The object should be drawn on its side.</param>
+ /// <param name="isRightToLeft">The object is in an right-to-left context and should be drawn flipped.</param>
+ /// <param name="clientDrawingEffect">The drawing effect set in IDWriteTextLayout::SetDrawingEffect.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(Draw)(
+ __maybenull void* clientDrawingContext,
+ IDWriteTextRenderer* renderer,
+ FLOAT originX,
+ FLOAT originY,
+ BOOL isSideways,
+ BOOL isRightToLeft,
+ __maybenull IUnknown* clientDrawingEffect
+ ) PURE;
+
+ /// <summary>
+ /// TextLayout calls this callback function to get the measurement of the inline object.
+ /// </summary>
+ /// <param name="metrics">Returned metrics</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetMetrics)(
+ __out DWRITE_INLINE_OBJECT_METRICS* metrics
+ ) PURE;
+
+ /// <summary>
+ /// TextLayout calls this callback function to get the visible extents (in DIPs) of the inline object.
+ /// In the case of a simple bitmap, with no padding and no overhang, all the overhangs will
+ /// simply be zeroes.
+ /// </summary>
+ /// <param name="overhangs">Overshoot of visible extents (in DIPs) outside the object.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ /// <remarks>
+ /// The overhangs should be returned relative to the reported size of the object
+ /// (DWRITE_INLINE_OBJECT_METRICS::width/height), and should not be baseline
+ /// adjusted. If you have an image that is actually 100x100 DIPs, but you want it
+ /// slightly inset (perhaps it has a glow) by 20 DIPs on each side, you would
+ /// return a width/height of 60x60 and four overhangs of 20 DIPs.
+ /// </remarks>
+ STDMETHOD(GetOverhangMetrics)(
+ __out DWRITE_OVERHANG_METRICS* overhangs
+ ) PURE;
+
+ /// <summary>
+ /// Layout uses this to determine the line breaking behavior of the inline object
+ /// amidst the text.
+ /// </summary>
+ /// <param name="breakConditionBefore">Line-breaking condition between the object and the content immediately preceding it.</param>
+ /// <param name="breakConditionAfter" >Line-breaking condition between the object and the content immediately following it.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetBreakConditions)(
+ __out DWRITE_BREAK_CONDITION* breakConditionBefore,
+ __out DWRITE_BREAK_CONDITION* breakConditionAfter
+ ) PURE;
+};
+
+/// <summary>
+/// The IDWritePixelSnapping interface defines the pixel snapping properties of a text renderer.
+/// </summary>
+interface DWRITE_DECLARE_INTERFACE("eaf3a2da-ecf4-4d24-b644-b34f6842024b") IDWritePixelSnapping : public IUnknown
+{
+ /// <summary>
+ /// Determines whether pixel snapping is disabled. The recommended default is FALSE,
+ /// unless doing animation that requires subpixel vertical placement.
+ /// </summary>
+ /// <param name="clientDrawingContext">The context passed to IDWriteTextLayout::Draw.</param>
+ /// <param name="isDisabled">Receives TRUE if pixel snapping is disabled or FALSE if it not.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(IsPixelSnappingDisabled)(
+ __maybenull void* clientDrawingContext,
+ __out BOOL* isDisabled
+ ) PURE;
+
+ /// <summary>
+ /// Gets the current transform that maps abstract coordinates to DIPs,
+ /// which may disable pixel snapping upon any rotation or shear.
+ /// </summary>
+ /// <param name="clientDrawingContext">The context passed to IDWriteTextLayout::Draw.</param>
+ /// <param name="transform">Receives the transform.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetCurrentTransform)(
+ __maybenull void* clientDrawingContext,
+ __out DWRITE_MATRIX* transform
+ ) PURE;
+
+ /// <summary>
+ /// Gets the number of physical pixels per DIP. A DIP (device-independent pixel) is 1/96 inch,
+ /// so the pixelsPerDip value is the number of logical pixels per inch divided by 96 (yielding
+ /// a value of 1 for 96 DPI and 1.25 for 120).
+ /// </summary>
+ /// <param name="clientDrawingContext">The context passed to IDWriteTextLayout::Draw.</param>
+ /// <param name="pixelsPerDip">Receives the number of physical pixels per DIP.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetPixelsPerDip)(
+ __maybenull void* clientDrawingContext,
+ __out FLOAT* pixelsPerDip
+ ) PURE;
+};
+
+/// <summary>
+/// The IDWriteTextLayout interface represents a set of application-defined
+/// callbacks that perform rendering of text, inline objects, and decorations
+/// such as underlines.
+/// </summary>
+interface DWRITE_DECLARE_INTERFACE("ef8a8135-5cc6-45fe-8825-c5a0724eb819") IDWriteTextRenderer : public IDWritePixelSnapping
+{
+ /// <summary>
+ /// IDWriteTextLayout::Draw calls this function to instruct the client to
+ /// render a run of glyphs.
+ /// </summary>
+ /// <param name="clientDrawingContext">The context passed to
+ /// IDWriteTextLayout::Draw.</param>
+ /// <param name="baselineOriginX">X-coordinate of the baseline.</param>
+ /// <param name="baselineOriginY">Y-coordinate of the baseline.</param>
+ /// <param name="measuringMode">Specifies measuring method for glyphs in the run.
+ /// Renderer implementations may choose different rendering modes for given measuring methods,
+ /// but best results are seen when the rendering mode matches the corresponding measuring mode:
+ /// DWRITE_RENDERING_MODE_CLEARTYPE_NATURAL for DWRITE_MEASURING_MODE_NATURAL
+ /// DWRITE_RENDERING_MODE_CLEARTYPE_GDI_CLASSIC for DWRITE_MEASURING_MODE_GDI_CLASSIC
+ /// DWRITE_RENDERING_MODE_CLEARTYPE_GDI_NATURAL for DWRITE_MEASURING_MODE_GDI_NATURAL
+ /// </param>
+ /// <param name="glyphRun">The glyph run to draw.</param>
+ /// <param name="glyphRunDescription">Properties of the characters
+ /// associated with this run.</param>
+ /// <param name="clientDrawingEffect">The drawing effect set in
+ /// IDWriteTextLayout::SetDrawingEffect.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(DrawGlyphRun)(
+ __maybenull void* clientDrawingContext,
+ FLOAT baselineOriginX,
+ FLOAT baselineOriginY,
+ DWRITE_MEASURING_MODE measuringMode,
+ __in DWRITE_GLYPH_RUN const* glyphRun,
+ __in DWRITE_GLYPH_RUN_DESCRIPTION const* glyphRunDescription,
+ __maybenull IUnknown* clientDrawingEffect
+ ) PURE;
+
+ /// <summary>
+ /// IDWriteTextLayout::Draw calls this function to instruct the client to draw
+ /// an underline.
+ /// </summary>
+ /// <param name="clientDrawingContext">The context passed to
+ /// IDWriteTextLayout::Draw.</param>
+ /// <param name="baselineOriginX">X-coordinate of the baseline.</param>
+ /// <param name="baselineOriginY">Y-coordinate of the baseline.</param>
+ /// <param name="underline">Underline logical information.</param>
+ /// <param name="clientDrawingEffect">The drawing effect set in
+ /// IDWriteTextLayout::SetDrawingEffect.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ /// <remarks>
+ /// A single underline can be broken into multiple calls, depending on
+ /// how the formatting changes attributes. If font sizes/styles change
+ /// within an underline, the thickness and offset will be averaged
+ /// weighted according to characters.
+ /// To get the correct top coordinate of the underline rect, add underline::offset
+ /// to the baseline's Y. Otherwise the underline will be immediately under the text.
+ /// The x coordinate will always be passed as the left side, regardless
+ /// of text directionality. This simplifies drawing and reduces the
+ /// problem of round-off that could potentially cause gaps or a double
+ /// stamped alpha blend. To avoid alpha overlap, round the end points
+ /// to the nearest device pixel.
+ /// </remarks>
+ STDMETHOD(DrawUnderline)(
+ __maybenull void* clientDrawingContext,
+ FLOAT baselineOriginX,
+ FLOAT baselineOriginY,
+ __in DWRITE_UNDERLINE const* underline,
+ __maybenull IUnknown* clientDrawingEffect
+ ) PURE;
+
+ /// <summary>
+ /// IDWriteTextLayout::Draw calls this function to instruct the client to draw
+ /// a strikethrough.
+ /// </summary>
+ /// <param name="clientDrawingContext">The context passed to
+ /// IDWriteTextLayout::Draw.</param>
+ /// <param name="baselineOriginX">X-coordinate of the baseline.</param>
+ /// <param name="baselineOriginY">Y-coordinate of the baseline.</param>
+ /// <param name="strikethrough">Strikethrough logical information.</param>
+ /// <param name="clientDrawingEffect">The drawing effect set in
+ /// IDWriteTextLayout::SetDrawingEffect.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ /// <remarks>
+ /// A single strikethrough can be broken into multiple calls, depending on
+ /// how the formatting changes attributes. Strikethrough is not averaged
+ /// across font sizes/styles changes.
+ /// To get the correct top coordinate of the strikethrough rect,
+ /// add strikethrough::offset to the baseline's Y.
+ /// Like underlines, the x coordinate will always be passed as the left side,
+ /// regardless of text directionality.
+ /// </remarks>
+ STDMETHOD(DrawStrikethrough)(
+ __maybenull void* clientDrawingContext,
+ FLOAT baselineOriginX,
+ FLOAT baselineOriginY,
+ __in DWRITE_STRIKETHROUGH const* strikethrough,
+ __maybenull IUnknown* clientDrawingEffect
+ ) PURE;
+
+ /// <summary>
+ /// IDWriteTextLayout::Draw calls this application callback when it needs to
+ /// draw an inline object.
+ /// </summary>
+ /// <param name="clientDrawingContext">The context passed to IDWriteTextLayout::Draw.</param>
+ /// <param name="originX">X-coordinate at the top-left corner of the inline object.</param>
+ /// <param name="originY">Y-coordinate at the top-left corner of the inline object.</param>
+ /// <param name="inlineObject">The object set using IDWriteTextLayout::SetInlineObject.</param>
+ /// <param name="isSideways">The object should be drawn on its side.</param>
+ /// <param name="isRightToLeft">The object is in an right-to-left context and should be drawn flipped.</param>
+ /// <param name="clientDrawingEffect">The drawing effect set in
+ /// IDWriteTextLayout::SetDrawingEffect.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ /// <remarks>
+ /// The right-to-left flag is a hint for those cases where it would look
+ /// strange for the image to be shown normally (like an arrow pointing to
+ /// right to indicate a submenu).
+ /// </remarks>
+ STDMETHOD(DrawInlineObject)(
+ __maybenull void* clientDrawingContext,
+ FLOAT originX,
+ FLOAT originY,
+ IDWriteInlineObject* inlineObject,
+ BOOL isSideways,
+ BOOL isRightToLeft,
+ __maybenull IUnknown* clientDrawingEffect
+ ) PURE;
+};
+
+/// <summary>
+/// The IDWriteTextLayout interface represents a block of text after it has
+/// been fully analyzed and formatted.
+///
+/// All coordinates are in device independent pixels (DIPs).
+/// </summary>
+interface DWRITE_DECLARE_INTERFACE("53737037-6d14-410b-9bfe-0b182bb70961") IDWriteTextLayout : public IDWriteTextFormat
+{
+ /// <summary>
+ /// Set layout maximum width
+ /// </summary>
+ /// <param name="maxWidth">Layout maximum width</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(SetMaxWidth)(
+ FLOAT maxWidth
+ ) PURE;
+
+ /// <summary>
+ /// Set layout maximum height
+ /// </summary>
+ /// <param name="maxHeight">Layout maximum height</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(SetMaxHeight)(
+ FLOAT maxHeight
+ ) PURE;
+
+ /// <summary>
+ /// Set the font collection.
+ /// </summary>
+ /// <param name="fontCollection">The font collection to set</param>
+ /// <param name="textRange">Text range to which this change applies.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(SetFontCollection)(
+ IDWriteFontCollection* fontCollection,
+ DWRITE_TEXT_RANGE textRange
+ ) PURE;
+
+ /// <summary>
+ /// Set null-terminated font family name.
+ /// </summary>
+ /// <param name="fontFamilyName">Font family name</param>
+ /// <param name="textRange">Text range to which this change applies.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(SetFontFamilyName)(
+ __in_z WCHAR const* fontFamilyName,
+ DWRITE_TEXT_RANGE textRange
+ ) PURE;
+
+ /// <summary>
+ /// Set font weight.
+ /// </summary>
+ /// <param name="fontWeight">Font weight</param>
+ /// <param name="textRange">Text range to which this change applies.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(SetFontWeight)(
+ DWRITE_FONT_WEIGHT fontWeight,
+ DWRITE_TEXT_RANGE textRange
+ ) PURE;
+
+ /// <summary>
+ /// Set font style.
+ /// </summary>
+ /// <param name="fontStyle">Font style</param>
+ /// <param name="textRange">Text range to which this change applies.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(SetFontStyle)(
+ DWRITE_FONT_STYLE fontStyle,
+ DWRITE_TEXT_RANGE textRange
+ ) PURE;
+
+ /// <summary>
+ /// Set font stretch.
+ /// </summary>
+ /// <param name="fontStretch">font stretch</param>
+ /// <param name="textRange">Text range to which this change applies.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(SetFontStretch)(
+ DWRITE_FONT_STRETCH fontStretch,
+ DWRITE_TEXT_RANGE textRange
+ ) PURE;
+
+ /// <summary>
+ /// Set font em height.
+ /// </summary>
+ /// <param name="fontSize">Font em height</param>
+ /// <param name="textRange">Text range to which this change applies.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(SetFontSize)(
+ FLOAT fontSize,
+ DWRITE_TEXT_RANGE textRange
+ ) PURE;
+
+ /// <summary>
+ /// Set underline.
+ /// </summary>
+ /// <param name="hasUnderline">The Boolean flag indicates whether underline takes place</param>
+ /// <param name="textRange">Text range to which this change applies.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(SetUnderline)(
+ BOOL hasUnderline,
+ DWRITE_TEXT_RANGE textRange
+ ) PURE;
+
+ /// <summary>
+ /// Set strikethrough.
+ /// </summary>
+ /// <param name="hasStrikethrough">The Boolean flag indicates whether strikethrough takes place</param>
+ /// <param name="textRange">Text range to which this change applies.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(SetStrikethrough)(
+ BOOL hasStrikethrough,
+ DWRITE_TEXT_RANGE textRange
+ ) PURE;
+
+ /// <summary>
+ /// Set application-defined drawing effect.
+ /// </summary>
+ /// <param name="drawingEffect">Pointer to an application-defined drawing effect.</param>
+ /// <param name="textRange">Text range to which this change applies.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ /// <remarks>
+ /// This drawing effect is associated with the specified range and will be passed back
+ /// to the application via the callback when the range is drawn at drawing time.
+ /// </remarks>
+ STDMETHOD(SetDrawingEffect)(
+ IUnknown* drawingEffect,
+ DWRITE_TEXT_RANGE textRange
+ ) PURE;
+
+ /// <summary>
+ /// Set inline object.
+ /// </summary>
+ /// <param name="inlineObject">Pointer to an application-implemented inline object.</param>
+ /// <param name="textRange">Text range to which this change applies.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ /// <remarks>
+ /// This inline object applies to the specified range and will be passed back
+ /// to the application via the DrawInlineObject callback when the range is drawn.
+ /// Any text in that range will be suppressed.
+ /// </remarks>
+ STDMETHOD(SetInlineObject)(
+ IDWriteInlineObject* inlineObject,
+ DWRITE_TEXT_RANGE textRange
+ ) PURE;
+
+ /// <summary>
+ /// Set font typography features.
+ /// </summary>
+ /// <param name="typography">Pointer to font typography setting.</param>
+ /// <param name="textRange">Text range to which this change applies.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(SetTypography)(
+ IDWriteTypography* typography,
+ DWRITE_TEXT_RANGE textRange
+ ) PURE;
+
+ /// <summary>
+ /// Set locale name.
+ /// </summary>
+ /// <param name="localeName">Locale name</param>
+ /// <param name="textRange">Text range to which this change applies.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(SetLocaleName)(
+ __in_z WCHAR const* localeName,
+ DWRITE_TEXT_RANGE textRange
+ ) PURE;
+
+ /// <summary>
+ /// Get layout maximum width
+ /// </summary>
+ STDMETHOD_(FLOAT, GetMaxWidth)() PURE;
+
+ /// <summary>
+ /// Get layout maximum height
+ /// </summary>
+ STDMETHOD_(FLOAT, GetMaxHeight)() PURE;
+
+ /// <summary>
+ /// Get the font collection where the current position is at.
+ /// </summary>
+ /// <param name="currentPosition">The current text position.</param>
+ /// <param name="fontCollection">The current font collection</param>
+ /// <param name="textRange">Text range to which this change applies.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetFontCollection)(
+ UINT32 currentPosition,
+ __out IDWriteFontCollection** fontCollection,
+ __out_opt DWRITE_TEXT_RANGE* textRange = NULL
+ ) PURE;
+
+ /// <summary>
+ /// Get the length of the font family name where the current position is at.
+ /// </summary>
+ /// <param name="currentPosition">The current text position.</param>
+ /// <param name="nameLength">Size of the character array in character count not including the terminated NULL character.</param>
+ /// <param name="textRange">The position range of the current format.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetFontFamilyNameLength)(
+ UINT32 currentPosition,
+ __out UINT32* nameLength,
+ __out_opt DWRITE_TEXT_RANGE* textRange = NULL
+ ) PURE;
+
+ /// <summary>
+ /// Copy the font family name where the current position is at.
+ /// </summary>
+ /// <param name="currentPosition">The current text position.</param>
+ /// <param name="fontFamilyName">Character array that receives the current font family name</param>
+ /// <param name="nameSize">Size of the character array in character count including the terminated NULL character.</param>
+ /// <param name="textRange">The position range of the current format.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetFontFamilyName)(
+ UINT32 currentPosition,
+ __out_ecount_z(nameSize) WCHAR* fontFamilyName,
+ UINT32 nameSize,
+ __out_opt DWRITE_TEXT_RANGE* textRange = NULL
+ ) PURE;
+
+ /// <summary>
+ /// Get the font weight where the current position is at.
+ /// </summary>
+ /// <param name="currentPosition">The current text position.</param>
+ /// <param name="fontWeight">The current font weight</param>
+ /// <param name="textRange">The position range of the current format.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetFontWeight)(
+ UINT32 currentPosition,
+ __out DWRITE_FONT_WEIGHT* fontWeight,
+ __out_opt DWRITE_TEXT_RANGE* textRange = NULL
+ ) PURE;
+
+ /// <summary>
+ /// Get the font style where the current position is at.
+ /// </summary>
+ /// <param name="currentPosition">The current text position.</param>
+ /// <param name="fontStyle">The current font style</param>
+ /// <param name="textRange">The position range of the current format.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetFontStyle)(
+ UINT32 currentPosition,
+ __out DWRITE_FONT_STYLE* fontStyle,
+ __out_opt DWRITE_TEXT_RANGE* textRange = NULL
+ ) PURE;
+
+ /// <summary>
+ /// Get the font stretch where the current position is at.
+ /// </summary>
+ /// <param name="currentPosition">The current text position.</param>
+ /// <param name="fontStretch">The current font stretch</param>
+ /// <param name="textRange">The position range of the current format.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetFontStretch)(
+ UINT32 currentPosition,
+ __out DWRITE_FONT_STRETCH* fontStretch,
+ __out_opt DWRITE_TEXT_RANGE* textRange = NULL
+ ) PURE;
+
+ /// <summary>
+ /// Get the font em height where the current position is at.
+ /// </summary>
+ /// <param name="currentPosition">The current text position.</param>
+ /// <param name="fontSize">The current font em height</param>
+ /// <param name="textRange">The position range of the current format.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetFontSize)(
+ UINT32 currentPosition,
+ __out FLOAT* fontSize,
+ __out_opt DWRITE_TEXT_RANGE* textRange = NULL
+ ) PURE;
+
+ /// <summary>
+ /// Get the underline presence where the current position is at.
+ /// </summary>
+ /// <param name="currentPosition">The current text position.</param>
+ /// <param name="hasUnderline">The Boolean flag indicates whether text is underlined.</param>
+ /// <param name="textRange">The position range of the current format.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetUnderline)(
+ UINT32 currentPosition,
+ __out BOOL* hasUnderline,
+ __out_opt DWRITE_TEXT_RANGE* textRange = NULL
+ ) PURE;
+
+ /// <summary>
+ /// Get the strikethrough presence where the current position is at.
+ /// </summary>
+ /// <param name="currentPosition">The current text position.</param>
+ /// <param name="hasStrikethrough">The Boolean flag indicates whether text has strikethrough.</param>
+ /// <param name="textRange">The position range of the current format.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetStrikethrough)(
+ UINT32 currentPosition,
+ __out BOOL* hasStrikethrough,
+ __out_opt DWRITE_TEXT_RANGE* textRange = NULL
+ ) PURE;
+
+ /// <summary>
+ /// Get the application-defined drawing effect where the current position is at.
+ /// </summary>
+ /// <param name="currentPosition">The current text position.</param>
+ /// <param name="drawingEffect">The current application-defined drawing effect.</param>
+ /// <param name="textRange">The position range of the current format.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetDrawingEffect)(
+ UINT32 currentPosition,
+ __out IUnknown** drawingEffect,
+ __out_opt DWRITE_TEXT_RANGE* textRange = NULL
+ ) PURE;
+
+ /// <summary>
+ /// Get the inline object at the given position.
+ /// </summary>
+ /// <param name="currentPosition">The given text position.</param>
+ /// <param name="inlineObject">The inline object.</param>
+ /// <param name="textRange">The position range of the current format.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetInlineObject)(
+ UINT32 currentPosition,
+ __out IDWriteInlineObject** inlineObject,
+ __out_opt DWRITE_TEXT_RANGE* textRange = NULL
+ ) PURE;
+
+ /// <summary>
+ /// Get the typography setting where the current position is at.
+ /// </summary>
+ /// <param name="currentPosition">The current text position.</param>
+ /// <param name="typography">The current typography setting.</param>
+ /// <param name="textRange">The position range of the current format.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetTypography)(
+ UINT32 currentPosition,
+ __out IDWriteTypography** typography,
+ __out_opt DWRITE_TEXT_RANGE* textRange = NULL
+ ) PURE;
+
+ /// <summary>
+ /// Get the length of the locale name where the current position is at.
+ /// </summary>
+ /// <param name="currentPosition">The current text position.</param>
+ /// <param name="nameLength">Size of the character array in character count not including the terminated NULL character.</param>
+ /// <param name="textRange">The position range of the current format.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetLocaleNameLength)(
+ UINT32 currentPosition,
+ __out UINT32* nameLength,
+ __out_opt DWRITE_TEXT_RANGE* textRange = NULL
+ ) PURE;
+
+ /// <summary>
+ /// Get the locale name where the current position is at.
+ /// </summary>
+ /// <param name="currentPosition">The current text position.</param>
+ /// <param name="localeName">Character array that receives the current locale name</param>
+ /// <param name="nameSize">Size of the character array in character count including the terminated NULL character.</param>
+ /// <param name="textRange">The position range of the current format.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetLocaleName)(
+ UINT32 currentPosition,
+ __out_ecount_z(nameSize) WCHAR* localeName,
+ UINT32 nameSize,
+ __out_opt DWRITE_TEXT_RANGE* textRange = NULL
+ ) PURE;
+
+ /// <summary>
+ /// Initiate drawing of the text.
+ /// </summary>
+ /// <param name="clientDrawingContext">An application defined value
+ /// included in rendering callbacks.</param>
+ /// <param name="renderer">The set of application-defined callbacks that do
+ /// the actual rendering.</param>
+ /// <param name="originX">X-coordinate of the layout's left side.</param>
+ /// <param name="originY">Y-coordinate of the layout's top side.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(Draw)(
+ __maybenull void* clientDrawingContext,
+ IDWriteTextRenderer* renderer,
+ FLOAT originX,
+ FLOAT originY
+ ) PURE;
+
+ /// <summary>
+ /// GetLineMetrics returns properties of each line.
+ /// </summary>
+ /// <param name="lineMetrics">The array to fill with line information.</param>
+ /// <param name="maxLineCount">The maximum size of the lineMetrics array.</param>
+ /// <param name="actualLineCount">The actual size of the lineMetrics
+ /// array that is needed.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ /// <remarks>
+ /// If maxLineCount is not large enough E_NOT_SUFFICIENT_BUFFER,
+ /// which is equivalent to HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER),
+ /// is returned and *actualLineCount is set to the number of lines
+ /// needed.
+ /// </remarks>
+ STDMETHOD(GetLineMetrics)(
+ __out_ecount_opt(maxLineCount) DWRITE_LINE_METRICS* lineMetrics,
+ UINT32 maxLineCount,
+ __out UINT32* actualLineCount
+ ) PURE;
+
+ /// <summary>
+ /// GetMetrics retrieves overall metrics for the formatted string.
+ /// </summary>
+ /// <param name="textMetrics">The returned metrics.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ /// <remarks>
+ /// Drawing effects like underline and strikethrough do not contribute
+ /// to the text size, which is essentially the sum of advance widths and
+ /// line heights. Additionally, visible swashes and other graphic
+ /// adornments may extend outside the returned width and height.
+ /// </remarks>
+ STDMETHOD(GetMetrics)(
+ __out DWRITE_TEXT_METRICS* textMetrics
+ ) PURE;
+
+ /// <summary>
+ /// GetOverhangMetrics returns the overhangs (in DIPs) of the layout and all
+ /// objects contained in it, including text glyphs and inline objects.
+ /// </summary>
+ /// <param name="overhangs">Overshoots of visible extents (in DIPs) outside the layout.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ /// <remarks>
+ /// Any underline and strikethrough do not contribute to the black box
+ /// determination, since these are actually drawn by the renderer, which
+ /// is allowed to draw them in any variety of styles.
+ /// </remarks>
+ STDMETHOD(GetOverhangMetrics)(
+ __out DWRITE_OVERHANG_METRICS* overhangs
+ ) PURE;
+
+ /// <summary>
+ /// Retrieve logical properties and measurement of each cluster.
+ /// </summary>
+ /// <param name="clusterMetrics">The array to fill with cluster information.</param>
+ /// <param name="maxClusterCount">The maximum size of the clusterMetrics array.</param>
+ /// <param name="actualClusterCount">The actual size of the clusterMetrics array that is needed.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ /// <remarks>
+ /// If maxClusterCount is not large enough E_NOT_SUFFICIENT_BUFFER,
+ /// which is equivalent to HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER),
+ /// is returned and *actualClusterCount is set to the number of clusters
+ /// needed.
+ /// </remarks>
+ STDMETHOD(GetClusterMetrics)(
+ __out_ecount_opt(maxClusterCount) DWRITE_CLUSTER_METRICS* clusterMetrics,
+ UINT32 maxClusterCount,
+ __out UINT32* actualClusterCount
+ ) PURE;
+
+ /// <summary>
+ /// Determines the minimum possible width the layout can be set to without
+ /// emergency breaking between the characters of whole words.
+ /// </summary>
+ /// <param name="minWidth">Minimum width.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(DetermineMinWidth)(
+ __out FLOAT* minWidth
+ ) PURE;
+
+ /// <summary>
+ /// Given a coordinate (in DIPs) relative to the top-left of the layout box,
+ /// this returns the corresponding hit-test metrics of the text string where
+ /// the hit-test has occurred. This is useful for mapping mouse clicks to caret
+ /// positions. When the given coordinate is outside the text string, the function
+ /// sets the output value *isInside to false but returns the nearest character
+ /// position.
+ /// </summary>
+ /// <param name="pointX">X coordinate to hit-test, relative to the top-left location of the layout box.</param>
+ /// <param name="pointY">Y coordinate to hit-test, relative to the top-left location of the layout box.</param>
+ /// <param name="isTrailingHit">Output flag indicating whether the hit-test location is at the leading or the trailing
+ /// side of the character. When the output *isInside value is set to false, this value is set according to the output
+ /// *position value to represent the edge closest to the hit-test location. </param>
+ /// <param name="isInside">Output flag indicating whether the hit-test location is inside the text string.
+ /// When false, the position nearest the text's edge is returned.</param>
+ /// <param name="hitTestMetrics">Output geometry fully enclosing the hit-test location. When the output *isInside value
+ /// is set to false, this structure represents the geometry enclosing the edge closest to the hit-test location.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(HitTestPoint)(
+ FLOAT pointX,
+ FLOAT pointY,
+ __out BOOL* isTrailingHit,
+ __out BOOL* isInside,
+ __out DWRITE_HIT_TEST_METRICS* hitTestMetrics
+ ) PURE;
+
+ /// <summary>
+ /// Given a text position and whether the caret is on the leading or trailing
+ /// edge of that position, this returns the corresponding coordinate (in DIPs)
+ /// relative to the top-left of the layout box. This is most useful for drawing
+ /// the caret's current position, but it could also be used to anchor an IME to the
+ /// typed text or attach a floating menu near the point of interest. It may also be
+ /// used to programmatically obtain the geometry of a particular text position
+ /// for UI automation.
+ /// </summary>
+ /// <param name="textPosition">Text position to get the coordinate of.</param>
+ /// <param name="isTrailingHit">Flag indicating whether the location is of the leading or the trailing side of the specified text position. </param>
+ /// <param name="pointX">Output caret X, relative to the top-left of the layout box.</param>
+ /// <param name="pointY">Output caret Y, relative to the top-left of the layout box.</param>
+ /// <param name="hitTestMetrics">Output geometry fully enclosing the specified text position.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ /// <remarks>
+ /// When drawing a caret at the returned X,Y, it should should be centered on X
+ /// and drawn from the Y coordinate down. The height will be the size of the
+ /// hit-tested text (which can vary in size within a line).
+ /// Reading direction also affects which side of the character the caret is drawn.
+ /// However, the returned X coordinate will be correct for either case.
+ /// You can get a text length back that is larger than a single character.
+ /// This happens for complex scripts when multiple characters form a single cluster,
+ /// when diacritics join their base character, or when you test a surrogate pair.
+ /// </remarks>
+ STDMETHOD(HitTestTextPosition)(
+ UINT32 textPosition,
+ BOOL isTrailingHit,
+ __out FLOAT* pointX,
+ __out FLOAT* pointY,
+ __out DWRITE_HIT_TEST_METRICS* hitTestMetrics
+ ) PURE;
+
+ /// <summary>
+ /// The application calls this function to get a set of hit-test metrics
+ /// corresponding to a range of text positions. The main usage for this
+ /// is to draw highlighted selection of the text string.
+ ///
+ /// The function returns E_NOT_SUFFICIENT_BUFFER, which is equivalent to
+ /// HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER), when the buffer size of
+ /// hitTestMetrics is too small to hold all the regions calculated by the
+ /// function. In such situation, the function sets the output value
+ /// *actualHitTestMetricsCount to the number of geometries calculated.
+ /// The application is responsible to allocate a new buffer of greater
+ /// size and call the function again.
+ ///
+ /// A good value to use as an initial value for maxHitTestMetricsCount may
+ /// be calculated from the following equation:
+ /// maxHitTestMetricsCount = lineCount * maxBidiReorderingDepth
+ ///
+ /// where lineCount is obtained from the value of the output argument
+ /// *actualLineCount from the function IDWriteTextLayout::GetLineMetrics,
+ /// and the maxBidiReorderingDepth value from the DWRITE_TEXT_METRICS
+ /// structure of the output argument *textMetrics from the function
+ /// IDWriteFactory::CreateTextLayout.
+ /// </summary>
+ /// <param name="textPosition">First text position of the specified range.</param>
+ /// <param name="textLength">Number of positions of the specified range.</param>
+ /// <param name="originX">Offset of the X origin (left of the layout box) which is added to each of the hit-test metrics returned.</param>
+ /// <param name="originY">Offset of the Y origin (top of the layout box) which is added to each of the hit-test metrics returned.</param>
+ /// <param name="hitTestMetrics">Pointer to a buffer of the output geometry fully enclosing the specified position range.</param>
+ /// <param name="maxHitTestMetricsCount">Maximum number of distinct metrics it could hold in its buffer memory.</param>
+ /// <param name="actualHitTestMetricsCount">Actual number of metrics returned or needed.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ /// <remarks>
+ /// There are no gaps in the returned metrics. While there could be visual gaps,
+ /// depending on bidi ordering, each range is contiguous and reports all the text,
+ /// including any hidden characters and trimmed text.
+ /// The height of each returned range will be the same within each line, regardless
+ /// of how the font sizes vary.
+ /// </remarks>
+ STDMETHOD(HitTestTextRange)(
+ UINT32 textPosition,
+ UINT32 textLength,
+ FLOAT originX,
+ FLOAT originY,
+ __out_ecount_opt(maxHitTestMetricsCount) DWRITE_HIT_TEST_METRICS* hitTestMetrics,
+ UINT32 maxHitTestMetricsCount,
+ __out UINT32* actualHitTestMetricsCount
+ ) PURE;
+};
+
+/// <summary>
+/// Encapsulates a 32-bit device independent bitmap and device context, which can be used for rendering glyphs.
+/// </summary>
+interface DWRITE_DECLARE_INTERFACE("5e5a32a3-8dff-4773-9ff6-0696eab77267") IDWriteBitmapRenderTarget : public IUnknown
+{
+ /// <summary>
+ /// Draws a run of glyphs to the bitmap.
+ /// </summary>
+ /// <param name="baselineOriginX">Horizontal position of the baseline origin, in DIPs, relative to the upper-left corner of the DIB.</param>
+ /// <param name="baselineOriginY">Vertical position of the baseline origin, in DIPs, relative to the upper-left corner of the DIB.</param>
+ /// <param name="measuringMode">Specifies measuring method for glyphs in the run.
+ /// Renderer implementations may choose different rendering modes for different measuring methods, for example
+ /// DWRITE_RENDERING_MODE_CLEARTYPE_NATURAL for DWRITE_MEASURING_MODE_NATURAL,
+ /// DWRITE_RENDERING_MODE_CLEARTYPE_GDI_CLASSIC for DWRITE_MEASURING_MODE_GDI_CLASSIC, and
+ /// DWRITE_RENDERING_MODE_CLEARTYPE_GDI_NATURAL for DWRITE_MEASURING_MODE_GDI_NATURAL.
+ /// </param>
+ /// <param name="glyphRun">Structure containing the properties of the glyph run.</param>
+ /// <param name="renderingParams">Object that controls rendering behavior.</param>
+ /// <param name="textColor">Specifies the foreground color of the text.</param>
+ /// <param name="blackBoxRect">Optional rectangle that receives the bounding box (in pixels not DIPs) of all the pixels affected by
+ /// drawing the glyph run. The black box rectangle may extend beyond the dimensions of the bitmap.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(DrawGlyphRun)(
+ FLOAT baselineOriginX,
+ FLOAT baselineOriginY,
+ DWRITE_MEASURING_MODE measuringMode,
+ __in DWRITE_GLYPH_RUN const* glyphRun,
+ IDWriteRenderingParams* renderingParams,
+ COLORREF textColor,
+ __out_opt RECT* blackBoxRect = NULL
+ ) PURE;
+
+ /// <summary>
+ /// Gets a handle to the memory device context.
+ /// </summary>
+ /// <returns>
+ /// Returns the device context handle.
+ /// </returns>
+ /// <remarks>
+ /// An application can use the device context to draw using GDI functions. An application can obtain the bitmap handle
+ /// (HBITMAP) by calling GetCurrentObject. An application that wants information about the underlying bitmap, including
+ /// a pointer to the pixel data, can call GetObject to fill in a DIBSECTION structure. The bitmap is always a 32-bit
+ /// top-down DIB.
+ /// </remarks>
+ STDMETHOD_(HDC, GetMemoryDC)() PURE;
+
+ /// <summary>
+ /// Gets the number of bitmap pixels per DIP. A DIP (device-independent pixel) is 1/96 inch so this value is the number
+ /// if pixels per inch divided by 96.
+ /// </summary>
+ /// <returns>
+ /// Returns the number of bitmap pixels per DIP.
+ /// </returns>
+ STDMETHOD_(FLOAT, GetPixelsPerDip)() PURE;
+
+ /// <summary>
+ /// Sets the number of bitmap pixels per DIP. A DIP (device-independent pixel) is 1/96 inch so this value is the number
+ /// if pixels per inch divided by 96.
+ /// </summary>
+ /// <param name="pixelsPerDip">Specifies the number of pixels per DIP.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(SetPixelsPerDip)(
+ FLOAT pixelsPerDip
+ ) PURE;
+
+ /// <summary>
+ /// Gets the transform that maps abstract coordinate to DIPs. By default this is the identity
+ /// transform. Note that this is unrelated to the world transform of the underlying device
+ /// context.
+ /// </summary>
+ /// <param name="transform">Receives the transform.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetCurrentTransform)(
+ __out DWRITE_MATRIX* transform
+ ) PURE;
+
+ /// <summary>
+ /// Sets the transform that maps abstract coordinate to DIPs. This does not affect the world
+ /// transform of the underlying device context.
+ /// </summary>
+ /// <param name="transform">Specifies the new transform. This parameter can be NULL, in which
+ /// case the identity transform is implied.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(SetCurrentTransform)(
+ __in_opt DWRITE_MATRIX const* transform
+ ) PURE;
+
+ /// <summary>
+ /// Gets the dimensions of the bitmap.
+ /// </summary>
+ /// <param name="size">Receives the size of the bitmap in pixels.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetSize)(
+ __out SIZE* size
+ ) PURE;
+
+ /// <summary>
+ /// Resizes the bitmap.
+ /// </summary>
+ /// <param name="width">New bitmap width, in pixels.</param>
+ /// <param name="height">New bitmap height, in pixels.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(Resize)(
+ UINT32 width,
+ UINT32 height
+ ) PURE;
+};
+
+/// <summary>
+/// The GDI interop interface provides interoperability with GDI.
+/// </summary>
+interface DWRITE_DECLARE_INTERFACE("1edd9491-9853-4299-898f-6432983b6f3a") IDWriteGdiInterop : public IUnknown
+{
+ /// <summary>
+ /// Creates a font object that matches the properties specified by the LOGFONT structure.
+ /// </summary>
+ /// <param name="logFont">Structure containing a GDI-compatible font description.</param>
+ /// <param name="font">Receives a newly created font object if successful, or NULL in case of error.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(CreateFontFromLOGFONT)(
+ __in LOGFONTW const* logFont,
+ __out IDWriteFont** font
+ ) PURE;
+
+ /// <summary>
+ /// Initializes a LOGFONT structure based on the GDI-compatible properties of the specified font.
+ /// </summary>
+ /// <param name="font">Specifies a font in the system font collection.</param>
+ /// <param name="logFont">Structure that receives a GDI-compatible font description.</param>
+ /// <param name="isSystemFont">Contains TRUE if the specified font object is part of the system font collection
+ /// or FALSE otherwise.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(ConvertFontToLOGFONT)(
+ IDWriteFont* font,
+ __out LOGFONTW* logFont,
+ __out BOOL* isSystemFont
+ ) PURE;
+
+ /// <summary>
+ /// Initializes a LOGFONT structure based on the GDI-compatible properties of the specified font.
+ /// </summary>
+ /// <param name="font">Specifies a font face.</param>
+ /// <param name="logFont">Structure that receives a GDI-compatible font description.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(ConvertFontFaceToLOGFONT)(
+ IDWriteFontFace* font,
+ __out LOGFONTW* logFont
+ ) PURE;
+
+ /// <summary>
+ /// Creates a font face object that corresponds to the currently selected HFONT.
+ /// </summary>
+ /// <param name="hdc">Handle to a device context into which a font has been selected. It is assumed that the client
+ /// has already performed font mapping and that the font selected into the DC is the actual font that would be used
+ /// for rendering glyphs.</param>
+ /// <param name="fontFace">Contains the newly created font face object, or NULL in case of failure.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(CreateFontFaceFromHdc)(
+ HDC hdc,
+ __out IDWriteFontFace** fontFace
+ ) PURE;
+
+ /// <summary>
+ /// Creates an object that encapsulates a bitmap and memory DC which can be used for rendering glyphs.
+ /// </summary>
+ /// <param name="hdc">Optional device context used to create a compatible memory DC.</param>
+ /// <param name="width">Width of the bitmap.</param>
+ /// <param name="height">Height of the bitmap.</param>
+ /// <param name="renderTarget">Receives a pointer to the newly created render target.</param>
+ STDMETHOD(CreateBitmapRenderTarget)(
+ __in_opt HDC hdc,
+ UINT32 width,
+ UINT32 height,
+ __out IDWriteBitmapRenderTarget** renderTarget
+ ) PURE;
+};
+
+/// <summary>
+/// The DWRITE_TEXTURE_TYPE enumeration identifies a type of alpha texture. An alpha texture is a bitmap of alpha values, each
+/// representing the darkness (i.e., opacity) of a pixel or subpixel.
+/// </summary>
+enum DWRITE_TEXTURE_TYPE
+{
+ /// <summary>
+ /// Specifies an alpha texture for aliased text rendering (i.e., bi-level, where each pixel is either fully opaque or fully transparent),
+ /// with one byte per pixel.
+ /// </summary>
+ DWRITE_TEXTURE_ALIASED_1x1,
+
+ /// <summary>
+ /// Specifies an alpha texture for ClearType text rendering, with three bytes per pixel in the horizontal dimension and
+ /// one byte per pixel in the vertical dimension.
+ /// </summary>
+ DWRITE_TEXTURE_CLEARTYPE_3x1
+};
+
+/// <summary>
+/// Maximum alpha value in a texture returned by IDWriteGlyphRunAnalysis::CreateAlphaTexture.
+/// </summary>
+#define DWRITE_ALPHA_MAX 255
+
+/// <summary>
+/// Interface that encapsulates information used to render a glyph run.
+/// </summary>
+interface DWRITE_DECLARE_INTERFACE("7d97dbf7-e085-42d4-81e3-6a883bded118") IDWriteGlyphRunAnalysis : public IUnknown
+{
+ /// <summary>
+ /// Gets the bounding rectangle of the physical pixels affected by the glyph run.
+ /// </summary>
+ /// <param name="textureType">Specifies the type of texture requested. If a bi-level texture is requested, the
+ /// bounding rectangle includes only bi-level glyphs. Otherwise, the bounding rectangle includes only anti-aliased
+ /// glyphs.</param>
+ /// <param name="textureBounds">Receives the bounding rectangle, or an empty rectangle if there are no glyphs
+ /// if the specified type.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetAlphaTextureBounds)(
+ DWRITE_TEXTURE_TYPE textureType,
+ __out RECT* textureBounds
+ ) PURE;
+
+ /// <summary>
+ /// Creates an alpha texture of the specified type.
+ /// </summary>
+ /// <param name="textureType">Specifies the type of texture requested. If a bi-level texture is requested, the
+ /// texture contains only bi-level glyphs. Otherwise, the texture contains only anti-aliased glyphs.</param>
+ /// <param name="textureBounds">Specifies the bounding rectangle of the texture, which can be different than
+ /// the bounding rectangle returned by GetAlphaTextureBounds.</param>
+ /// <param name="alphaValues">Receives the array of alpha values.</param>
+ /// <param name="bufferSize">Size of the alphaValues array. The minimum size depends on the dimensions of the
+ /// rectangle and the type of texture requested.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(CreateAlphaTexture)(
+ DWRITE_TEXTURE_TYPE textureType,
+ __in RECT const* textureBounds,
+ __out_bcount(bufferSize) BYTE* alphaValues,
+ UINT32 bufferSize
+ ) PURE;
+
+ /// <summary>
+ /// Gets properties required for ClearType blending.
+ /// </summary>
+ /// <param name="renderingParams">Rendering parameters object. In most cases, the values returned in the output
+ /// parameters are based on the properties of this object. The exception is if a GDI-compatible rendering mode
+ /// is specified.</param>
+ /// <param name="blendGamma">Receives the gamma value to use for gamma correction.</param>
+ /// <param name="blendEnhancedContrast">Receives the enhanced contrast value.</param>
+ /// <param name="blendClearTypeLevel">Receives the ClearType level.</param>
+ STDMETHOD(GetAlphaBlendParams)(
+ IDWriteRenderingParams* renderingParams,
+ __out FLOAT* blendGamma,
+ __out FLOAT* blendEnhancedContrast,
+ __out FLOAT* blendClearTypeLevel
+ ) PURE;
+};
+
+/// <summary>
+/// The root factory interface for all DWrite objects.
+/// </summary>
+interface DWRITE_DECLARE_INTERFACE("b859ee5a-d838-4b5b-a2e8-1adc7d93db48") IDWriteFactory : public IUnknown
+{
+ /// <summary>
+ /// Gets a font collection representing the set of installed fonts.
+ /// </summary>
+ /// <param name="fontCollection">Receives a pointer to the system font collection object, or NULL in case of failure.</param>
+ /// <param name="checkForUpdates">If this parameter is nonzero, the function performs an immediate check for changes to the set of
+ /// installed fonts. If this parameter is FALSE, the function will still detect changes if the font cache service is running, but
+ /// there may be some latency. For example, an application might specify TRUE if it has itself just installed a font and wants to
+ /// be sure the font collection contains that font.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetSystemFontCollection)(
+ __out IDWriteFontCollection** fontCollection,
+ BOOL checkForUpdates = FALSE
+ ) PURE;
+
+ /// <summary>
+ /// Creates a font collection using a custom font collection loader.
+ /// </summary>
+ /// <param name="collectionLoader">Application-defined font collection loader, which must have been previously
+ /// registered using RegisterFontCollectionLoader.</param>
+ /// <param name="collectionKey">Key used by the loader to identify a collection of font files.</param>
+ /// <param name="collectionKeySize">Size in bytes of the collection key.</param>
+ /// <param name="fontCollection">Receives a pointer to the system font collection object, or NULL in case of failure.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(CreateCustomFontCollection)(
+ IDWriteFontCollectionLoader* collectionLoader,
+ __in_bcount(collectionKeySize) void const* collectionKey,
+ UINT32 collectionKeySize,
+ __out IDWriteFontCollection** fontCollection
+ ) PURE;
+
+ /// <summary>
+ /// Registers a custom font collection loader with the factory object.
+ /// </summary>
+ /// <param name="fontCollectionLoader">Application-defined font collection loader.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(RegisterFontCollectionLoader)(
+ IDWriteFontCollectionLoader* fontCollectionLoader
+ ) PURE;
+
+ /// <summary>
+ /// Unregisters a custom font collection loader that was previously registered using RegisterFontCollectionLoader.
+ /// </summary>
+ /// <param name="fontCollectionLoader">Application-defined font collection loader.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(UnregisterFontCollectionLoader)(
+ IDWriteFontCollectionLoader* fontCollectionLoader
+ ) PURE;
+
+ /// <summary>
+ /// CreateFontFileReference creates a font file reference object from a local font file.
+ /// </summary>
+ /// <param name="filePath">Absolute file path. Subsequent operations on the constructed object may fail
+ /// if the user provided filePath doesn't correspond to a valid file on the disk.</param>
+ /// <param name="lastWriteTime">Last modified time of the input file path. If the parameter is omitted,
+ /// the function will access the font file to obtain its last write time, so the clients are encouraged to specify this value
+ /// to avoid extra disk access. Subsequent operations on the constructed object may fail
+ /// if the user provided lastWriteTime doesn't match the file on the disk.</param>
+ /// <param name="fontFile">Contains newly created font file reference object, or NULL in case of failure.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(CreateFontFileReference)(
+ __in_z WCHAR const* filePath,
+ __in_opt FILETIME const* lastWriteTime,
+ __out IDWriteFontFile** fontFile
+ ) PURE;
+
+ /// <summary>
+ /// CreateCustomFontFileReference creates a reference to an application specific font file resource.
+ /// This function enables an application or a document to use a font without having to install it on the system.
+ /// The fontFileReferenceKey has to be unique only in the scope of the fontFileLoader used in this call.
+ /// </summary>
+ /// <param name="fontFileReferenceKey">Font file reference key that uniquely identifies the font file resource
+ /// during the lifetime of fontFileLoader.</param>
+ /// <param name="fontFileReferenceKeySize">Size of font file reference key in bytes.</param>
+ /// <param name="fontFileLoader">Font file loader that will be used by the font system to load data from the file identified by
+ /// fontFileReferenceKey.</param>
+ /// <param name="fontFile">Contains the newly created font file object, or NULL in case of failure.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ /// <remarks>
+ /// This function is provided for cases when an application or a document needs to use a font
+ /// without having to install it on the system. fontFileReferenceKey has to be unique only in the scope
+ /// of the fontFileLoader used in this call.
+ /// </remarks>
+ STDMETHOD(CreateCustomFontFileReference)(
+ __in_bcount(fontFileReferenceKeySize) void const* fontFileReferenceKey,
+ UINT32 fontFileReferenceKeySize,
+ IDWriteFontFileLoader* fontFileLoader,
+ __out IDWriteFontFile** fontFile
+ ) PURE;
+
+ /// <summary>
+ /// Creates a font face object.
+ /// </summary>
+ /// <param name="fontFaceType">The file format of the font face.</param>
+ /// <param name="numberOfFiles">The number of font files require to represent the font face.</param>
+ /// <param name="fontFiles">Font files representing the font face. Since IDWriteFontFace maintains its own references
+ /// to the input font file objects, it's OK to release them after this call.</param>
+ /// <param name="faceIndex">The zero based index of a font face in cases when the font files contain a collection of font faces.
+ /// If the font files contain a single face, this value should be zero.</param>
+ /// <param name="fontFaceSimulationFlags">Font face simulation flags for algorithmic emboldening and italicization.</param>
+ /// <param name="fontFace">Contains the newly created font face object, or NULL in case of failure.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(CreateFontFace)(
+ DWRITE_FONT_FACE_TYPE fontFaceType,
+ UINT32 numberOfFiles,
+ __in_ecount(numberOfFiles) IDWriteFontFile* const* fontFiles,
+ UINT32 faceIndex,
+ DWRITE_FONT_SIMULATIONS fontFaceSimulationFlags,
+ __out IDWriteFontFace** fontFace
+ ) PURE;
+
+ /// <summary>
+ /// Creates a rendering parameters object with default settings for the primary monitor.
+ /// </summary>
+ /// <param name="renderingParams">Holds the newly created rendering parameters object, or NULL in case of failure.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(CreateRenderingParams)(
+ __out IDWriteRenderingParams** renderingParams
+ ) PURE;
+
+ /// <summary>
+ /// Creates a rendering parameters object with default settings for the specified monitor.
+ /// </summary>
+ /// <param name="monitor">The monitor to read the default values from.</param>
+ /// <param name="renderingParams">Holds the newly created rendering parameters object, or NULL in case of failure.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(CreateMonitorRenderingParams)(
+ HMONITOR monitor,
+ __out IDWriteRenderingParams** renderingParams
+ ) PURE;
+
+ /// <summary>
+ /// Creates a rendering parameters object with the specified properties.
+ /// </summary>
+ /// <param name="gamma">The gamma value used for gamma correction, which must be greater than zero and cannot exceed 256.</param>
+ /// <param name="enhancedContrast">The amount of contrast enhancement, zero or greater.</param>
+ /// <param name="clearTypeLevel">The degree of ClearType level, from 0.0f (no ClearType) to 1.0f (full ClearType).</param>
+ /// <param name="pixelGeometry">The geometry of a device pixel.</param>
+ /// <param name="renderingMode">Method of rendering glyphs. In most cases, this should be DWRITE_RENDERING_MODE_DEFAULT to automatically use an appropriate mode.</param>
+ /// <param name="renderingParams">Holds the newly created rendering parameters object, or NULL in case of failure.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(CreateCustomRenderingParams)(
+ FLOAT gamma,
+ FLOAT enhancedContrast,
+ FLOAT clearTypeLevel,
+ DWRITE_PIXEL_GEOMETRY pixelGeometry,
+ DWRITE_RENDERING_MODE renderingMode,
+ __out IDWriteRenderingParams** renderingParams
+ ) PURE;
+
+ /// <summary>
+ /// Registers a font file loader with DirectWrite.
+ /// </summary>
+ /// <param name="fontFileLoader">Pointer to the implementation of the IDWriteFontFileLoader for a particular file resource type.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ /// <remarks>
+ /// This function registers a font file loader with DirectWrite.
+ /// Font file loader interface handles loading font file resources of a particular type from a key.
+ /// The font file loader interface is recommended to be implemented by a singleton object.
+ /// A given instance can only be registered once.
+ /// Succeeding attempts will return an error that it has already been registered.
+ /// IMPORTANT: font file loader implementations must not register themselves with DirectWrite
+ /// inside their constructors and must not unregister themselves in their destructors, because
+ /// registration and unregistraton operations increment and decrement the object reference count respectively.
+ /// Instead, registration and unregistration of font file loaders with DirectWrite should be performed
+ /// outside of the font file loader implementation as a separate step.
+ /// </remarks>
+ STDMETHOD(RegisterFontFileLoader)(
+ IDWriteFontFileLoader* fontFileLoader
+ ) PURE;
+
+ /// <summary>
+ /// Unregisters a font file loader that was previously registered with the DirectWrite font system using RegisterFontFileLoader.
+ /// </summary>
+ /// <param name="fontFileLoader">Pointer to the file loader that was previously registered with the DirectWrite font system using RegisterFontFileLoader.</param>
+ /// <returns>
+ /// This function will succeed if the user loader is requested to be removed.
+ /// It will fail if the pointer to the file loader identifies a standard DirectWrite loader,
+ /// or a loader that is never registered or has already been unregistered.
+ /// </returns>
+ /// <remarks>
+ /// This function unregisters font file loader callbacks with the DirectWrite font system.
+ /// The font file loader interface is recommended to be implemented by a singleton object.
+ /// IMPORTANT: font file loader implementations must not register themselves with DirectWrite
+ /// inside their constructors and must not unregister themselves in their destructors, because
+ /// registration and unregistraton operations increment and decrement the object reference count respectively.
+ /// Instead, registration and unregistration of font file loaders with DirectWrite should be performed
+ /// outside of the font file loader implementation as a separate step.
+ /// </remarks>
+ STDMETHOD(UnregisterFontFileLoader)(
+ IDWriteFontFileLoader* fontFileLoader
+ ) PURE;
+
+ /// <summary>
+ /// Create a text format object used for text layout.
+ /// </summary>
+ /// <param name="fontFamilyName">Name of the font family</param>
+ /// <param name="fontCollection">Font collection. NULL indicates the system font collection.</param>
+ /// <param name="fontWeight">Font weight</param>
+ /// <param name="fontStyle">Font style</param>
+ /// <param name="fontStretch">Font stretch</param>
+ /// <param name="fontSize">Logical size of the font in DIP units. A DIP ("device-independent pixel") equals 1/96 inch.</param>
+ /// <param name="localeName">Locale name</param>
+ /// <param name="textFormat">Contains newly created text format object, or NULL in case of failure.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(CreateTextFormat)(
+ __in_z WCHAR const* fontFamilyName,
+ __maybenull IDWriteFontCollection* fontCollection,
+ DWRITE_FONT_WEIGHT fontWeight,
+ DWRITE_FONT_STYLE fontStyle,
+ DWRITE_FONT_STRETCH fontStretch,
+ FLOAT fontSize,
+ __in_z WCHAR const* localeName,
+ __out IDWriteTextFormat** textFormat
+ ) PURE;
+
+ /// <summary>
+ /// Create a typography object used in conjunction with text format for text layout.
+ /// </summary>
+ /// <param name="typography">Contains newly created typography object, or NULL in case of failure.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(CreateTypography)(
+ __out IDWriteTypography** typography
+ ) PURE;
+
+ /// <summary>
+ /// Create an object used for interoperability with GDI.
+ /// </summary>
+ /// <param name="gdiInterop">Receives the GDI interop object if successful, or NULL in case of failure.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetGdiInterop)(
+ __out IDWriteGdiInterop** gdiInterop
+ ) PURE;
+
+ /// <summary>
+ /// CreateTextLayout takes a string, format, and associated constraints
+ /// and produces and object representing the fully analyzed
+ /// and formatted result.
+ /// </summary>
+ /// <param name="string">The string to layout.</param>
+ /// <param name="stringLength">The length of the string.</param>
+ /// <param name="textFormat">The format to apply to the string.</param>
+ /// <param name="maxWidth">Width of the layout box.</param>
+ /// <param name="maxHeight">Height of the layout box.</param>
+ /// <param name="textLayout">The resultant object.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(CreateTextLayout)(
+ __in_ecount(stringLength) WCHAR const* string,
+ UINT32 stringLength,
+ IDWriteTextFormat* textFormat,
+ FLOAT maxWidth,
+ FLOAT maxHeight,
+ __out IDWriteTextLayout** textLayout
+ ) PURE;
+
+ /// <summary>
+ /// CreateGdiCompatibleTextLayout takes a string, format, and associated constraints
+ /// and produces and object representing the result formatted for a particular display resolution
+ /// and measuring method. The resulting text layout should only be used for the intended resolution,
+ /// and for cases where text scalability is desired, CreateTextLayout should be used instead.
+ /// </summary>
+ /// <param name="string">The string to layout.</param>
+ /// <param name="stringLength">The length of the string.</param>
+ /// <param name="textFormat">The format to apply to the string.</param>
+ /// <param name="layoutWidth">Width of the layout box.</param>
+ /// <param name="layoutHeight">Height of the layout box.</param>
+ /// <param name="pixelsPerDip">Number of physical pixels per DIP. For example, if rendering onto a 96 DPI device then pixelsPerDip
+ /// is 1. If rendering onto a 120 DPI device then pixelsPerDip is 120/96.</param>
+ /// <param name="transform">Optional transform applied to the glyphs and their positions. This transform is applied after the
+ /// scaling specified the font size and pixelsPerDip.</param>
+ /// <param name="useGdiNatural">
+ /// When set to FALSE, instructs the text layout to use the same metrics as GDI aliased text.
+ /// When set to TRUE, instructs the text layout to use the same metrics as text measured by GDI using a font
+ /// created with CLEARTYPE_NATURAL_QUALITY.
+ /// </param>
+ /// <param name="textLayout">The resultant object.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(CreateGdiCompatibleTextLayout)(
+ __in_ecount(stringLength) WCHAR const* string,
+ UINT32 stringLength,
+ IDWriteTextFormat* textFormat,
+ FLOAT layoutWidth,
+ FLOAT layoutHeight,
+ FLOAT pixelsPerDip,
+ __in_opt DWRITE_MATRIX const* transform,
+ BOOL useGdiNatural,
+ __out IDWriteTextLayout** textLayout
+ ) PURE;
+
+ /// <summary>
+ /// The application may call this function to create an inline object for trimming, using an ellipsis as the omission sign.
+ /// The ellipsis will be created using the current settings of the format, including base font, style, and any effects.
+ /// Alternate omission signs can be created by the application by implementing IDWriteInlineObject.
+ /// </summary>
+ /// <param name="textFormat">Text format used as a template for the omission sign.</param>
+ /// <param name="trimmingSign">Created omission sign.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(CreateEllipsisTrimmingSign)(
+ IDWriteTextFormat* textFormat,
+ __out IDWriteInlineObject** trimmingSign
+ ) PURE;
+
+ /// <summary>
+ /// Return an interface to perform text analysis with.
+ /// </summary>
+ /// <param name="textAnalyzer">The resultant object.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(CreateTextAnalyzer)(
+ __out IDWriteTextAnalyzer** textAnalyzer
+ ) PURE;
+
+ /// <summary>
+ /// Creates a number substitution object using a locale name,
+ /// substitution method, and whether to ignore user overrides (uses NLS
+ /// defaults for the given culture instead).
+ /// </summary>
+ /// <param name="substitutionMethod">Method of number substitution to use.</param>
+ /// <param name="localeName">Which locale to obtain the digits from.</param>
+ /// <param name="ignoreUserOverride">Ignore the user's settings and use the locale defaults</param>
+ /// <param name="numberSubstitution">Receives a pointer to the newly created object.</param>
+ STDMETHOD(CreateNumberSubstitution)(
+ __in DWRITE_NUMBER_SUBSTITUTION_METHOD substitutionMethod,
+ __in_z WCHAR const* localeName,
+ __in BOOL ignoreUserOverride,
+ __out IDWriteNumberSubstitution** numberSubstitution
+ ) PURE;
+
+ /// <summary>
+ /// Creates a glyph run analysis object, which encapsulates information
+ /// used to render a glyph run.
+ /// </summary>
+ /// <param name="glyphRun">Structure specifying the properties of the glyph run.</param>
+ /// <param name="pixelsPerDip">Number of physical pixels per DIP. For example, if rendering onto a 96 DPI bitmap then pixelsPerDip
+ /// is 1. If rendering onto a 120 DPI bitmap then pixelsPerDip is 120/96.</param>
+ /// <param name="transform">Optional transform applied to the glyphs and their positions. This transform is applied after the
+ /// scaling specified the emSize and pixelsPerDip.</param>
+ /// <param name="renderingMode">Specifies the rendering mode, which must be one of the raster rendering modes (i.e., not default
+ /// and not outline).</param>
+ /// <param name="measuringMode">Specifies the method to measure glyphs.</param>
+ /// <param name="baselineOriginX">Horizontal position of the baseline origin, in DIPs.</param>
+ /// <param name="baselineOriginY">Vertical position of the baseline origin, in DIPs.</param>
+ /// <param name="glyphRunAnalysis">Receives a pointer to the newly created object.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(CreateGlyphRunAnalysis)(
+ __in DWRITE_GLYPH_RUN const* glyphRun,
+ FLOAT pixelsPerDip,
+ __in_opt DWRITE_MATRIX const* transform,
+ DWRITE_RENDERING_MODE renderingMode,
+ DWRITE_MEASURING_MODE measuringMode,
+ FLOAT baselineOriginX,
+ FLOAT baselineOriginY,
+ __out IDWriteGlyphRunAnalysis** glyphRunAnalysis
+ ) PURE;
+
+}; // interface IDWriteFactory
+
+/// <summary>
+/// Creates a DirectWrite factory object that is used for subsequent creation of individual DirectWrite objects.
+/// </summary>
+/// <param name="factoryType">Identifies whether the factory object will be shared or isolated.</param>
+/// <param name="iid">Identifies the DirectWrite factory interface, such as __uuidof(IDWriteFactory).</param>
+/// <param name="factory">Receives the DirectWrite factory object.</param>
+/// <returns>
+/// Standard HRESULT error code.
+/// </returns>
+/// <remarks>
+/// Obtains DirectWrite factory object that is used for subsequent creation of individual DirectWrite classes.
+/// DirectWrite factory contains internal state such as font loader registration and cached font data.
+/// In most cases it is recommended to use the shared factory object, because it allows multiple components
+/// that use DirectWrite to share internal DirectWrite state and reduce memory usage.
+/// However, there are cases when it is desirable to reduce the impact of a component,
+/// such as a plug-in from an untrusted source, on the rest of the process by sandboxing and isolating it
+/// from the rest of the process components. In such cases, it is recommended to use an isolated factory for the sandboxed
+/// component.
+/// </remarks>
+EXTERN_C HRESULT DWRITE_EXPORT DWriteCreateFactory(
+ __in DWRITE_FACTORY_TYPE factoryType,
+ __in REFIID iid,
+ __out IUnknown **factory
+ );
+
+// Macros used to define DirectWrite error codes.
+#define FACILITY_DWRITE 0x898
+#define DWRITE_ERR_BASE 0x5000
+#define MAKE_DWRITE_HR(severity, code) MAKE_HRESULT(severity, FACILITY_DWRITE, (DWRITE_ERR_BASE + code))
+#define MAKE_DWRITE_HR_ERR(code) MAKE_DWRITE_HR(SEVERITY_ERROR, code)
+
+/// <summary>
+/// Indicates an error in an input file such as a font file.
+/// </summary>
+#define DWRITE_E_FILEFORMAT MAKE_DWRITE_HR_ERR(0x000)
+
+/// <summary>
+/// Indicates an error originating in DirectWrite code, which is not expected to occur but is safe to recover from.
+/// </summary>
+#define DWRITE_E_UNEXPECTED MAKE_DWRITE_HR_ERR(0x001)
+
+/// <summary>
+/// Indicates the specified font does not exist.
+/// </summary>
+#define DWRITE_E_NOFONT MAKE_DWRITE_HR_ERR(0x002)
+
+/// <summary>
+/// A font file could not be opened because the file, directory, network location, drive, or other storage
+/// location does not exist or is unavailable.
+/// </summary>
+#define DWRITE_E_FILENOTFOUND MAKE_DWRITE_HR_ERR(0x003)
+
+/// <summary>
+/// A font file exists but could not be opened due to access denied, sharing violation, or similar error.
+/// </summary>
+#define DWRITE_E_FILEACCESS MAKE_DWRITE_HR_ERR(0x004)
+
+/// <summary>
+/// A font collection is obsolete due to changes in the system.
+/// </summary>
+#define DWRITE_E_FONTCOLLECTIONOBSOLETE MAKE_DWRITE_HR_ERR(0x005)
+
+/// <summary>
+/// The given interface is already registered.
+/// </summary>
+#define DWRITE_E_ALREADYREGISTERED MAKE_DWRITE_HR_ERR(0x006)
+
+#endif /* DWRITE_H_INCLUDED */
diff --git a/core/src/fxge/Microsoft SDK/include/Dcommon.h b/core/src/fxge/Microsoft SDK/include/Dcommon.h
index a6c901aeac..4ecc5c174b 100644
--- a/core/src/fxge/Microsoft SDK/include/Dcommon.h
+++ b/core/src/fxge/Microsoft SDK/include/Dcommon.h
@@ -1,65 +1,65 @@
-//+--------------------------------------------------------------------------
-//
-// Copyright (c) Microsoft Corporation. All rights reserved.
-//
-// Abstract:
-// Public API definitions for DWrite and D2D
-//
-//----------------------------------------------------------------------------
-
-#ifndef DCOMMON_H_INCLUDED
-#define DCOMMON_H_INCLUDED
-
-//
-//These macros are defined in the Windows 7 SDK, however to enable development using the technical preview,
-//they are included here temporarily.
-//
-#ifndef DEFINE_ENUM_FLAG_OPERATORS
-#define DEFINE_ENUM_FLAG_OPERATORS(ENUMTYPE) \
-extern "C++" { \
-inline ENUMTYPE operator | (ENUMTYPE a, ENUMTYPE b) { return ENUMTYPE(((int)a) | ((int)b)); } \
-inline ENUMTYPE &operator |= (ENUMTYPE &a, ENUMTYPE b) { return (ENUMTYPE &)(((int &)a) |= ((int)b)); } \
-inline ENUMTYPE operator & (ENUMTYPE a, ENUMTYPE b) { return ENUMTYPE(((int)a) & ((int)b)); } \
-inline ENUMTYPE &operator &= (ENUMTYPE &a, ENUMTYPE b) { return (ENUMTYPE &)(((int &)a) &= ((int)b)); } \
-inline ENUMTYPE operator ~ (ENUMTYPE a) { return ENUMTYPE(~((int)a)); } \
-inline ENUMTYPE operator ^ (ENUMTYPE a, ENUMTYPE b) { return ENUMTYPE(((int)a) ^ ((int)b)); } \
-inline ENUMTYPE &operator ^= (ENUMTYPE &a, ENUMTYPE b) { return (ENUMTYPE &)(((int &)a) ^= ((int)b)); } \
-}
-#endif
-
-#ifndef __field_ecount_opt
-#define __field_ecount_opt(x)
-#endif
-
-#ifndef __range
-#define __range(x,y)
-#endif
-
-#ifndef __field_ecount
-#define __field_ecount(x)
-#endif
-
-/// <summary>
-/// The measuring method used for text layout.
-/// </summary>
-typedef enum DWRITE_MEASURING_MODE
-{
- /// <summary>
- /// Text is measured using glyph ideal metrics whose values are independent to the current display resolution.
- /// </summary>
- DWRITE_MEASURING_MODE_NATURAL,
-
- /// <summary>
- /// Text is measured using glyph display compatible metrics whose values tuned for the current display resolution.
- /// </summary>
- DWRITE_MEASURING_MODE_GDI_CLASSIC,
-
- /// <summary>
- /// Text is measured using the same glyph display metrics as text measured by GDI using a font
- /// created with CLEARTYPE_NATURAL_QUALITY.
- /// </summary>
- DWRITE_MEASURING_MODE_GDI_NATURAL
-
-} DWRITE_MEASURING_MODE;
-
-#endif /* DCOMMON_H_INCLUDED */
+//+--------------------------------------------------------------------------
+//
+// Copyright (c) Microsoft Corporation. All rights reserved.
+//
+// Abstract:
+// Public API definitions for DWrite and D2D
+//
+//----------------------------------------------------------------------------
+
+#ifndef DCOMMON_H_INCLUDED
+#define DCOMMON_H_INCLUDED
+
+//
+//These macros are defined in the Windows 7 SDK, however to enable development using the technical preview,
+//they are included here temporarily.
+//
+#ifndef DEFINE_ENUM_FLAG_OPERATORS
+#define DEFINE_ENUM_FLAG_OPERATORS(ENUMTYPE) \
+extern "C++" { \
+inline ENUMTYPE operator | (ENUMTYPE a, ENUMTYPE b) { return ENUMTYPE(((int)a) | ((int)b)); } \
+inline ENUMTYPE &operator |= (ENUMTYPE &a, ENUMTYPE b) { return (ENUMTYPE &)(((int &)a) |= ((int)b)); } \
+inline ENUMTYPE operator & (ENUMTYPE a, ENUMTYPE b) { return ENUMTYPE(((int)a) & ((int)b)); } \
+inline ENUMTYPE &operator &= (ENUMTYPE &a, ENUMTYPE b) { return (ENUMTYPE &)(((int &)a) &= ((int)b)); } \
+inline ENUMTYPE operator ~ (ENUMTYPE a) { return ENUMTYPE(~((int)a)); } \
+inline ENUMTYPE operator ^ (ENUMTYPE a, ENUMTYPE b) { return ENUMTYPE(((int)a) ^ ((int)b)); } \
+inline ENUMTYPE &operator ^= (ENUMTYPE &a, ENUMTYPE b) { return (ENUMTYPE &)(((int &)a) ^= ((int)b)); } \
+}
+#endif
+
+#ifndef __field_ecount_opt
+#define __field_ecount_opt(x)
+#endif
+
+#ifndef __range
+#define __range(x,y)
+#endif
+
+#ifndef __field_ecount
+#define __field_ecount(x)
+#endif
+
+/// <summary>
+/// The measuring method used for text layout.
+/// </summary>
+typedef enum DWRITE_MEASURING_MODE
+{
+ /// <summary>
+ /// Text is measured using glyph ideal metrics whose values are independent to the current display resolution.
+ /// </summary>
+ DWRITE_MEASURING_MODE_NATURAL,
+
+ /// <summary>
+ /// Text is measured using glyph display compatible metrics whose values tuned for the current display resolution.
+ /// </summary>
+ DWRITE_MEASURING_MODE_GDI_CLASSIC,
+
+ /// <summary>
+ /// Text is measured using the same glyph display metrics as text measured by GDI using a font
+ /// created with CLEARTYPE_NATURAL_QUALITY.
+ /// </summary>
+ DWRITE_MEASURING_MODE_GDI_NATURAL
+
+} DWRITE_MEASURING_MODE;
+
+#endif /* DCOMMON_H_INCLUDED */
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlus.h b/core/src/fxge/Microsoft SDK/include/GdiPlus.h
index 82393e7050..75eb509469 100644
--- a/core/src/fxge/Microsoft SDK/include/GdiPlus.h
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlus.h
@@ -1,156 +1,156 @@
-/**************************************************************************\
-*
-* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
-*
-* Module Name:
-*
-* Gdiplus.h
-*
-* Abstract:
-*
-* GDI+ Native C++ public header file
-*
-\**************************************************************************/
-
-#ifndef _GDIPLUS_H
-#define _GDIPLUS_H
-
-struct IDirectDrawSurface7;
-
-typedef signed short INT16;
-typedef unsigned short UINT16;
-
-#ifndef DCR_REMOVE_INTERNAL
-
-#ifndef DCR_USE_NEW_105760
- #define DCR_USE_NEW_105760
-#endif
-#ifndef DCR_USE_NEW_127084
- #define DCR_USE_NEW_127084
-#endif
-#ifndef DCR_USE_NEW_135429
- #define DCR_USE_NEW_135429
-#endif
-#ifndef DCR_USE_NEW_140782
- #define DCR_USE_NEW_140782
-#endif
-#ifndef DCR_USE_NEW_140855
- #define DCR_USE_NEW_140855
-#endif
-#ifndef DCR_USE_NEW_140857
- #define DCR_USE_NEW_140857
-#endif
-#ifndef DCR_USE_NEW_140861
- #define DCR_USE_NEW_140861
-#endif
-#ifndef DCR_USE_NEW_145135
- #define DCR_USE_NEW_145135
-#endif
-#ifndef DCR_USE_NEW_145138
- #define DCR_USE_NEW_145138
-#endif
-#ifndef DCR_USE_NEW_145139
- #define DCR_USE_NEW_145139
-#endif
-#ifndef DCR_USE_NEW_145804
- #define DCR_USE_NEW_145804
-#endif
-#ifndef DCR_USE_NEW_146933
- #define DCR_USE_NEW_146933
-#endif
-#ifndef DCR_USE_NEW_152154
- #define DCR_USE_NEW_152154
-#endif
-#ifndef DCR_USE_NEW_175866
- #define DCR_USE_NEW_175866
-#endif
-
-#ifndef DCR_USE_NEW_188922
- #define DCR_USE_NEW_188922
-#endif
-#ifndef DCR_USE_NEW_137252
- #define DCR_USE_NEW_137252
-#endif
-#ifndef DCR_USE_NEW_202903
- #define DCR_USE_NEW_202903
-#endif
-#ifndef DCR_USE_NEW_197819
- #define DCR_USE_NEW_197819
-#endif
-#ifndef DCR_USE_NEW_186091
- #define DCR_USE_NEW_186091
-#endif
-#ifndef DCR_USE_NEW_125467
- #define DCR_USE_NEW_125467
-#endif
-#ifndef DCR_USE_NEW_168772
- #define DCR_USE_NEW_168772
-#endif
-#ifndef DCR_USE_NEW_186764
- #define DCR_USE_NEW_186764
-#endif
-#ifndef DCR_USE_NEW_174340
- #define DCR_USE_NEW_174340
-#endif
-#ifndef DCR_USE_NEW_186151
- #define DCR_USE_NEW_186151
-#endif
-
-#ifndef DCR_USE_NEW_235072
- #define DCR_USE_NEW_235072
-#endif
-
-#endif // DCR_REMOVE_INTERNAL
-
-namespace Gdiplus
-{
- namespace DllExports
- {
- #include "GdiplusMem.h"
- };
-
- #include "GdiplusBase.h"
-
- // The following headers are used internally as well
- #include "GdiplusEnums.h"
- #include "GdiplusTypes.h"
- #include "GdiplusInit.h"
- #include "GdiplusPixelFormats.h"
- #include "GdiplusColor.h"
- #include "GdiplusMetaHeader.h"
- #include "GdiplusImaging.h"
- #include "GdiplusColorMatrix.h"
-
- // The rest of these are used only by the application
-
- #include "GdiplusGpStubs.h"
- #include "GdiplusHeaders.h"
-
- namespace DllExports
- {
- #include "GdiplusFlat.h"
- };
-
-
- #include "GdiplusImageAttributes.h"
- #include "GdiplusMatrix.h"
- #include "GdiplusBrush.h"
- #include "GdiplusPen.h"
- #include "GdiplusStringFormat.h"
- #include "GdiplusPath.h"
- #include "GdiplusLineCaps.h"
- #include "GdiplusMetafile.h"
- #include "GdiplusGraphics.h"
- #include "GdiplusCachedBitmap.h"
- #include "GdiplusRegion.h"
- #include "GdiplusFontCollection.h"
- #include "GdiplusFontFamily.h"
- #include "GdiplusFont.h"
- #include "GdiplusBitmap.h"
- #include "GdiplusImageCodec.h"
-
-}; // namespace Gdiplus
-
-
-
-#endif // !_GDIPLUS_HPP
+/**************************************************************************\
+*
+* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
+*
+* Module Name:
+*
+* Gdiplus.h
+*
+* Abstract:
+*
+* GDI+ Native C++ public header file
+*
+\**************************************************************************/
+
+#ifndef _GDIPLUS_H
+#define _GDIPLUS_H
+
+struct IDirectDrawSurface7;
+
+typedef signed short INT16;
+typedef unsigned short UINT16;
+
+#ifndef DCR_REMOVE_INTERNAL
+
+#ifndef DCR_USE_NEW_105760
+ #define DCR_USE_NEW_105760
+#endif
+#ifndef DCR_USE_NEW_127084
+ #define DCR_USE_NEW_127084
+#endif
+#ifndef DCR_USE_NEW_135429
+ #define DCR_USE_NEW_135429
+#endif
+#ifndef DCR_USE_NEW_140782
+ #define DCR_USE_NEW_140782
+#endif
+#ifndef DCR_USE_NEW_140855
+ #define DCR_USE_NEW_140855
+#endif
+#ifndef DCR_USE_NEW_140857
+ #define DCR_USE_NEW_140857
+#endif
+#ifndef DCR_USE_NEW_140861
+ #define DCR_USE_NEW_140861
+#endif
+#ifndef DCR_USE_NEW_145135
+ #define DCR_USE_NEW_145135
+#endif
+#ifndef DCR_USE_NEW_145138
+ #define DCR_USE_NEW_145138
+#endif
+#ifndef DCR_USE_NEW_145139
+ #define DCR_USE_NEW_145139
+#endif
+#ifndef DCR_USE_NEW_145804
+ #define DCR_USE_NEW_145804
+#endif
+#ifndef DCR_USE_NEW_146933
+ #define DCR_USE_NEW_146933
+#endif
+#ifndef DCR_USE_NEW_152154
+ #define DCR_USE_NEW_152154
+#endif
+#ifndef DCR_USE_NEW_175866
+ #define DCR_USE_NEW_175866
+#endif
+
+#ifndef DCR_USE_NEW_188922
+ #define DCR_USE_NEW_188922
+#endif
+#ifndef DCR_USE_NEW_137252
+ #define DCR_USE_NEW_137252
+#endif
+#ifndef DCR_USE_NEW_202903
+ #define DCR_USE_NEW_202903
+#endif
+#ifndef DCR_USE_NEW_197819
+ #define DCR_USE_NEW_197819
+#endif
+#ifndef DCR_USE_NEW_186091
+ #define DCR_USE_NEW_186091
+#endif
+#ifndef DCR_USE_NEW_125467
+ #define DCR_USE_NEW_125467
+#endif
+#ifndef DCR_USE_NEW_168772
+ #define DCR_USE_NEW_168772
+#endif
+#ifndef DCR_USE_NEW_186764
+ #define DCR_USE_NEW_186764
+#endif
+#ifndef DCR_USE_NEW_174340
+ #define DCR_USE_NEW_174340
+#endif
+#ifndef DCR_USE_NEW_186151
+ #define DCR_USE_NEW_186151
+#endif
+
+#ifndef DCR_USE_NEW_235072
+ #define DCR_USE_NEW_235072
+#endif
+
+#endif // DCR_REMOVE_INTERNAL
+
+namespace Gdiplus
+{
+ namespace DllExports
+ {
+ #include "GdiplusMem.h"
+ };
+
+ #include "GdiplusBase.h"
+
+ // The following headers are used internally as well
+ #include "GdiplusEnums.h"
+ #include "GdiplusTypes.h"
+ #include "GdiplusInit.h"
+ #include "GdiplusPixelFormats.h"
+ #include "GdiplusColor.h"
+ #include "GdiplusMetaHeader.h"
+ #include "GdiplusImaging.h"
+ #include "GdiplusColorMatrix.h"
+
+ // The rest of these are used only by the application
+
+ #include "GdiplusGpStubs.h"
+ #include "GdiplusHeaders.h"
+
+ namespace DllExports
+ {
+ #include "GdiplusFlat.h"
+ };
+
+
+ #include "GdiplusImageAttributes.h"
+ #include "GdiplusMatrix.h"
+ #include "GdiplusBrush.h"
+ #include "GdiplusPen.h"
+ #include "GdiplusStringFormat.h"
+ #include "GdiplusPath.h"
+ #include "GdiplusLineCaps.h"
+ #include "GdiplusMetafile.h"
+ #include "GdiplusGraphics.h"
+ #include "GdiplusCachedBitmap.h"
+ #include "GdiplusRegion.h"
+ #include "GdiplusFontCollection.h"
+ #include "GdiplusFontFamily.h"
+ #include "GdiplusFont.h"
+ #include "GdiplusBitmap.h"
+ #include "GdiplusImageCodec.h"
+
+}; // namespace Gdiplus
+
+
+
+#endif // !_GDIPLUS_HPP
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusBase.h b/core/src/fxge/Microsoft SDK/include/GdiPlusBase.h
index 40a977d1b1..59f7cc2fee 100644
--- a/core/src/fxge/Microsoft SDK/include/GdiPlusBase.h
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusBase.h
@@ -1,40 +1,40 @@
-/**************************************************************************\
-*
-* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
-*
-* Module Name:
-*
-* GdiplusBase.h
-*
-* Abstract:
-*
-* Represents the base class for GDIPlus memory allocation.
-*
-\**************************************************************************/
-
-#ifndef _GDIPLUSBASE_H
-#define _GDIPLUSBASE_H
-
-class GdiplusBase
-{
-public:
- void (operator delete)(void* in_pVoid)
- {
- DllExports::GdipFree(in_pVoid);
- }
- void* (operator new)(size_t in_size)
- {
- return DllExports::GdipAlloc(in_size);
- }
- void (operator delete[])(void* in_pVoid)
- {
- DllExports::GdipFree(in_pVoid);
- }
- void* (operator new[])(size_t in_size)
- {
- return DllExports::GdipAlloc(in_size);
- }
-};
-
-#endif
-
+/**************************************************************************\
+*
+* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
+*
+* Module Name:
+*
+* GdiplusBase.h
+*
+* Abstract:
+*
+* Represents the base class for GDIPlus memory allocation.
+*
+\**************************************************************************/
+
+#ifndef _GDIPLUSBASE_H
+#define _GDIPLUSBASE_H
+
+class GdiplusBase
+{
+public:
+ void (operator delete)(void* in_pVoid)
+ {
+ DllExports::GdipFree(in_pVoid);
+ }
+ void* (operator new)(size_t in_size)
+ {
+ return DllExports::GdipAlloc(in_size);
+ }
+ void (operator delete[])(void* in_pVoid)
+ {
+ DllExports::GdipFree(in_pVoid);
+ }
+ void* (operator new[])(size_t in_size)
+ {
+ return DllExports::GdipAlloc(in_size);
+ }
+};
+
+#endif
+
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusBitmap.h b/core/src/fxge/Microsoft SDK/include/GdiPlusBitmap.h
index fbe0061d41..16d66bdaeb 100644
--- a/core/src/fxge/Microsoft SDK/include/GdiPlusBitmap.h
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusBitmap.h
@@ -1,1004 +1,1004 @@
-/**************************************************************************\
-*
-* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
-*
-* Module Name:
-*
-* GdiplusBitmap.h
-*
-* Abstract:
-*
-* Bitmap related declarations
-*
-\**************************************************************************/
-
-#ifndef _GDIPLUSBITMAP_H
-#define _GDIPLUSBITMAP_H
-
-// NOTE:
-// Our current choice for the public API is to use constructors
-// instead of static load functions to create image objects.
-//
-// I've kept the static load functions here for now so that
-// existing test programs are not broken. But they should
-// eventually be taken out.
-
-#ifndef DCR_USE_NEW_140782
-
-inline
-Image::Image(
- IN const WCHAR* filename
- )
-{
- nativeImage = NULL;
- lastResult = DllExports::GdipLoadImageFromFile(filename, &nativeImage);
-}
-
-inline
-Image::Image(
- IN IStream* stream
- )
-{
- nativeImage = NULL;
- lastResult = DllExports::GdipLoadImageFromStream(stream, &nativeImage);
-}
-
-inline Image*
-Image::FromFile(
- IN const WCHAR* filename
- )
-{
- return new Image(filename);
-}
-
-inline Image*
-Image::FromStream(
- IN IStream* stream
- )
-{
- return new Image(stream);
-}
-
-#else
-
-inline
-Image::Image(
- IN const WCHAR* filename,
- IN BOOL useEmbeddedColorManagement
- )
-{
- nativeImage = NULL;
- if(useEmbeddedColorManagement)
- {
- lastResult = DllExports::GdipLoadImageFromFileICM(
- filename,
- &nativeImage
- );
- }
- else
- {
- lastResult = DllExports::GdipLoadImageFromFile(
- filename,
- &nativeImage
- );
- }
-}
-
-inline
-Image::Image(
- IN IStream* stream,
- IN BOOL useEmbeddedColorManagement
- )
-{
- nativeImage = NULL;
- if(useEmbeddedColorManagement)
- {
- lastResult = DllExports::GdipLoadImageFromStreamICM(
- stream,
- &nativeImage
- );
- }
- else
- {
- lastResult = DllExports::GdipLoadImageFromStream(
- stream,
- &nativeImage
- );
- }
-}
-
-inline Image*
-Image::FromFile(
- IN const WCHAR* filename,
- IN BOOL useEmbeddedColorManagement
- )
-{
- return new Image(
- filename,
- useEmbeddedColorManagement
- );
-}
-
-inline Image*
-Image::FromStream(
- IN IStream* stream,
- IN BOOL useEmbeddedColorManagement
- )
-{
- return new Image(
- stream,
- useEmbeddedColorManagement
- );
-}
-
-#endif
-
-inline
-Image::~Image()
-{
- DllExports::GdipDisposeImage(nativeImage);
-}
-
-inline Image*
-Image::Clone()
-{
- GpImage *cloneimage = NULL;
-
- SetStatus(DllExports::GdipCloneImage(nativeImage, &cloneimage));
-
- return new Image(cloneimage, lastResult);
-}
-
-// Encorder Parameter
-
-inline UINT
-Image::GetEncoderParameterListSize(
- IN const CLSID* clsidEncoder
- )
-{
- UINT size = 0;
-
- SetStatus(DllExports::GdipGetEncoderParameterListSize(nativeImage,
- clsidEncoder,
- &size));
- return size;
-}
-
-inline Status
-Image::GetEncoderParameterList(
- IN const CLSID* clsidEncoder,
- IN UINT size,
- OUT EncoderParameters* buffer
- )
-{
- return SetStatus(DllExports::GdipGetEncoderParameterList(nativeImage,
- clsidEncoder,
- size,
- buffer));
-}
-
-// Save images
-
-inline Status
-Image::Save(
- IN const WCHAR* filename,
- IN const CLSID* clsidEncoder,
- IN const EncoderParameters *encoderParams
- )
-{
- return SetStatus(DllExports::GdipSaveImageToFile(nativeImage,
- filename,
- clsidEncoder,
- encoderParams));
-}
-
-inline Status
-Image::Save(
- IN IStream* stream,
- IN const CLSID* clsidEncoder,
- IN const EncoderParameters *encoderParams
- )
-{
- return SetStatus(DllExports::GdipSaveImageToStream(nativeImage,
- stream,
- clsidEncoder,
- encoderParams));
-}
-
-inline Status
-Image::SaveAdd(
- IN const EncoderParameters *encoderParams
- )
-{
- return SetStatus(DllExports::GdipSaveAdd(nativeImage,
- encoderParams));
-}
-
-inline Status
-Image::SaveAdd(
- IN Image* newImage,
- IN const EncoderParameters *encoderParams
- )
-{
- if ( newImage == NULL )
- {
- return SetStatus(InvalidParameter);
- }
-
- return SetStatus(DllExports::GdipSaveAddImage(nativeImage,
- newImage->nativeImage,
- encoderParams));
-}
-
-// Get size and type information
-inline ImageType
-Image::GetType() const
-{
- ImageType type = ImageTypeUnknown;
-
- SetStatus(DllExports::GdipGetImageType(nativeImage, &type));
-
- return type;
-}
-
-inline Status
-Image::GetPhysicalDimension(
- OUT SizeF* size
- )
-{
- if (size == NULL)
- {
- return SetStatus(InvalidParameter);
- }
-
- REAL width, height;
- Status status;
-
- status = SetStatus(DllExports::GdipGetImageDimension(nativeImage,
- &width, &height));
-
- size->Width = width;
- size->Height = height;
-
- return status;
-}
-
-inline Status
-Image::GetBounds(
- OUT RectF *srcRect,
- OUT Unit *srcUnit
- )
-{
- return SetStatus(DllExports::GdipGetImageBounds(nativeImage,
- srcRect, srcUnit));
-}
-
-inline UINT
-Image::GetWidth()
-{
- UINT width = 0;
-
- SetStatus(DllExports::GdipGetImageWidth(nativeImage, &width));
-
- return width;
-}
-
-inline UINT
-Image::GetHeight()
-{
- UINT height = 0;
-
- SetStatus(DllExports::GdipGetImageHeight(nativeImage, &height));
-
- return height;
-}
-
-inline REAL
-Image::GetHorizontalResolution()
-{
- REAL resolution = 0.0f;
-
- SetStatus(DllExports::GdipGetImageHorizontalResolution(nativeImage, &resolution));
-
- return resolution;
-}
-
-inline REAL
-Image::GetVerticalResolution()
-{
- REAL resolution = 0.0f;
-
- SetStatus(DllExports::GdipGetImageVerticalResolution(nativeImage, &resolution));
-
- return resolution;
-}
-
-inline UINT
-Image::GetFlags()
-{
- UINT flags = 0;
-
- SetStatus(DllExports::GdipGetImageFlags(nativeImage, &flags));
-
- return flags;
-}
-
-inline Status
-Image::GetRawFormat(OUT GUID *format)
-{
- return SetStatus(DllExports::GdipGetImageRawFormat(nativeImage, format));
-}
-
-inline PixelFormat
-Image::GetPixelFormat()
-{
- PixelFormat format;
-
- SetStatus(DllExports::GdipGetImagePixelFormat(nativeImage, &format));
-
- return format;
-}
-
-inline INT
-Image::GetPaletteSize()
-{
- INT size = 0;
-
- SetStatus(DllExports::GdipGetImagePaletteSize(nativeImage, &size));
-
- return size;
-}
-
-inline Status
-Image::GetPalette(
- OUT ColorPalette *palette,
- IN INT size
-)
-{
- return SetStatus(DllExports::GdipGetImagePalette(nativeImage, palette, size));
-}
-
-inline Status
-Image::SetPalette(
- IN const ColorPalette *palette
- )
-{
- return SetStatus(DllExports::GdipSetImagePalette(nativeImage, palette));
-}
-
-// Thumbnail support
-
-inline Image*
-Image::GetThumbnailImage(
- IN UINT thumbWidth,
- IN UINT thumbHeight,
- IN GetThumbnailImageAbort callback,
- IN VOID* callbackData
- )
-{
- GpImage *thumbimage = NULL;
-
- SetStatus(DllExports::GdipGetImageThumbnail(nativeImage,
- thumbWidth, thumbHeight,
- &thumbimage,
- callback, callbackData));
-
- Image *newImage = new Image(thumbimage, lastResult);
-
- if (newImage == NULL)
- {
- DllExports::GdipDisposeImage(thumbimage);
- }
-
- return newImage;
-}
-
-// Multi-frame support
-inline UINT
-Image::GetFrameDimensionsCount()
-{
- UINT count = 0;
-
- SetStatus(DllExports::GdipImageGetFrameDimensionsCount(nativeImage,
- &count));
-
- return count;
-}
-
-inline Status
-Image::GetFrameDimensionsList(
- OUT GUID* dimensionIDs,
- IN UINT count
- )
-{
- return SetStatus(DllExports::GdipImageGetFrameDimensionsList(nativeImage,
- dimensionIDs,
- count));
-}
-
-inline UINT
-Image::GetFrameCount(
- IN const GUID* dimensionID
- )
-{
- UINT count = 0;
-
- SetStatus(DllExports::GdipImageGetFrameCount(nativeImage,
- dimensionID,
- &count));
- return count;
-}
-
-inline Status
-Image::SelectActiveFrame(
- IN const GUID *dimensionID,
- IN UINT frameIndex
- )
-{
- return SetStatus(DllExports::GdipImageSelectActiveFrame(nativeImage,
- dimensionID,
- frameIndex));
-}
-
-inline Status
-Image::RotateFlip(
- IN RotateFlipType rotateFlipType
- )
-{
- return SetStatus(DllExports::GdipImageRotateFlip(nativeImage,
- rotateFlipType));
-}
-
-// Image property related functions
-
-inline UINT
-Image::GetPropertyCount()
-{
- UINT numProperty = 0;
-
- SetStatus(DllExports::GdipGetPropertyCount(nativeImage,
- &numProperty));
-
- return numProperty;
-}
-
-inline Status
-Image::GetPropertyIdList(
- IN UINT numOfProperty,
- OUT PROPID* list
- )
-{
- return SetStatus(DllExports::GdipGetPropertyIdList(nativeImage,
- numOfProperty, list));
-}
-
-inline UINT
-Image::GetPropertyItemSize(
- IN PROPID propId
- )
-{
- UINT size = 0;
-
- SetStatus(DllExports::GdipGetPropertyItemSize(nativeImage,
- propId,
- &size));
-
- return size;
-}
-
-inline Status
-Image::GetPropertyItem(
- IN PROPID propId,
- IN UINT propSize,
- OUT PropertyItem* buffer
- )
-{
- return SetStatus(DllExports::GdipGetPropertyItem(nativeImage,
- propId, propSize, buffer));
-}
-
-inline Status
-Image::GetPropertySize(
- OUT UINT* totalBufferSize,
- OUT UINT* numProperties
- )
-{
- return SetStatus(DllExports::GdipGetPropertySize(nativeImage,
- totalBufferSize,
- numProperties));
-}
-
-inline Status
-Image::GetAllPropertyItems(
- IN UINT totalBufferSize,
- IN UINT numProperties,
- OUT PropertyItem* allItems
- )
-{
- if (allItems == NULL)
- {
- return SetStatus(InvalidParameter);
- }
- return SetStatus(DllExports::GdipGetAllPropertyItems(nativeImage,
- totalBufferSize,
- numProperties,
- allItems));
-}
-
-inline Status
-Image::RemovePropertyItem(
- IN PROPID propId
- )
-{
- return SetStatus(DllExports::GdipRemovePropertyItem(nativeImage, propId));
-}
-
-inline Status
-Image::SetPropertyItem(
- IN const PropertyItem* item
- )
-{
- return SetStatus(DllExports::GdipSetPropertyItem(nativeImage, item));
-}
-
-// Get/SetLayout
-// Support for Middle East localization (right-to-left mirroring)
-
-inline ImageLayout
-Image::GetLayout() const
-{
- ImageLayout layout;
-
- SetStatus(DllExports::GdipGetImageLayout(nativeImage, &layout));
-
- return layout;
-}
-
-inline Status
-Image::SetLayout(IN const ImageLayout layout)
-{
- return SetStatus(
- DllExports::GdipSetImageLayout(nativeImage, layout)
- );
-}
-
-inline Status
-Image::GetLastStatus() const
-{
- Status lastStatus = lastResult;
- lastResult = Ok;
-
- return lastStatus;
-}
-
-inline
-Image::Image(GpImage *nativeImage, Status status)
-{
- SetNativeImage(nativeImage);
- lastResult = status;
-}
-
-inline VOID
-Image::SetNativeImage(GpImage *nativeImage)
-{
- this->nativeImage = nativeImage;
-}
-
-inline
-Bitmap::Bitmap(
- IN const WCHAR *filename,
- IN BOOL useEmbeddedColorManagement
- )
-{
- GpBitmap *bitmap = NULL;
-
- if(useEmbeddedColorManagement)
- {
- lastResult = DllExports::GdipCreateBitmapFromFileICM(filename, &bitmap);
- }
- else
- {
- lastResult = DllExports::GdipCreateBitmapFromFile(filename, &bitmap);
- }
-
- SetNativeImage(bitmap);
-}
-
-inline
-Bitmap::Bitmap(
- IN IStream *stream,
- IN BOOL useEmbeddedColorManagement
- )
-{
- GpBitmap *bitmap = NULL;
-
- if(useEmbeddedColorManagement)
- {
- lastResult = DllExports::GdipCreateBitmapFromStreamICM(stream, &bitmap);
- }
- else
- {
- lastResult = DllExports::GdipCreateBitmapFromStream(stream, &bitmap);
- }
-
- SetNativeImage(bitmap);
-}
-
-inline
-Bitmap::Bitmap(
- IN INT width,
- IN INT height,
- IN INT stride,
- IN PixelFormat format,
- IN BYTE *scan0
- )
-{
- GpBitmap *bitmap = NULL;
-
- lastResult = DllExports::GdipCreateBitmapFromScan0(width,
- height,
- stride,
- format,
- scan0,
- &bitmap);
-
- SetNativeImage(bitmap);
-}
-
-inline
-Bitmap::Bitmap(
- IN INT width,
- IN INT height,
- IN PixelFormat format
- )
-{
- GpBitmap *bitmap = NULL;
-
- lastResult = DllExports::GdipCreateBitmapFromScan0(width,
- height,
- 0,
- format,
- NULL,
- &bitmap);
-
- SetNativeImage(bitmap);
-}
-
-inline
-Bitmap::Bitmap(
- IN INT width,
- IN INT height,
- IN Graphics* target)
-{
- GpBitmap *bitmap = NULL;
-
- lastResult = DllExports::GdipCreateBitmapFromGraphics(width,
- height,
- target->nativeGraphics,
- &bitmap);
-
- SetNativeImage(bitmap);
-}
-
-inline
-Bitmap::Bitmap(
- IN IDirectDrawSurface7 * surface
- )
-{
- GpBitmap *bitmap = NULL;
-
- lastResult = DllExports::GdipCreateBitmapFromDirectDrawSurface(surface,
- &bitmap);
-
- SetNativeImage(bitmap);
-}
-
-inline
-Bitmap::Bitmap(
- IN const BITMAPINFO* gdiBitmapInfo,
- IN VOID* gdiBitmapData
- )
-{
- GpBitmap *bitmap = NULL;
-
- lastResult = DllExports::GdipCreateBitmapFromGdiDib(gdiBitmapInfo,
- gdiBitmapData,
- &bitmap);
-
- SetNativeImage(bitmap);
-}
-
-inline
-Bitmap::Bitmap(
- IN HBITMAP hbm,
- IN HPALETTE hpal
- )
-{
- GpBitmap *bitmap = NULL;
-
- lastResult = DllExports::GdipCreateBitmapFromHBITMAP(hbm, hpal, &bitmap);
-
- SetNativeImage(bitmap);
-}
-
-inline
-Bitmap::Bitmap(
- IN HICON hicon
- )
-{
- GpBitmap *bitmap = NULL;
-
- lastResult = DllExports::GdipCreateBitmapFromHICON(hicon, &bitmap);
-
- SetNativeImage(bitmap);
-}
-
-inline
-Bitmap::Bitmap(
- IN HINSTANCE hInstance,
- IN const WCHAR *bitmapName
- )
-{
- GpBitmap *bitmap = NULL;
-
- lastResult = DllExports::GdipCreateBitmapFromResource(hInstance,
- bitmapName,
- &bitmap);
-
- SetNativeImage(bitmap);
-}
-
-
-inline Bitmap*
-Bitmap::FromFile(
- IN const WCHAR *filename,
- IN BOOL useEmbeddedColorManagement
- )
-{
- return new Bitmap(
- filename,
- useEmbeddedColorManagement
- );
-}
-
-inline Bitmap*
-Bitmap::FromStream(
- IN IStream *stream,
- IN BOOL useEmbeddedColorManagement
- )
-{
- return new Bitmap(
- stream,
- useEmbeddedColorManagement
- );
-}
-
-inline Bitmap*
-Bitmap::FromDirectDrawSurface7(
- IN IDirectDrawSurface7* surface
- )
-{
- return new Bitmap(surface);
-}
-
-inline Bitmap*
-Bitmap::FromBITMAPINFO(
- IN const BITMAPINFO* gdiBitmapInfo,
- IN VOID* gdiBitmapData)
-{
- return new Bitmap(gdiBitmapInfo, gdiBitmapData);
-}
-
-inline Bitmap*
-Bitmap::FromHBITMAP(
- IN HBITMAP hbm,
- IN HPALETTE hpal
- )
-{
- return new Bitmap(hbm, hpal);
-}
-
-inline Bitmap*
-Bitmap::FromHICON(
- IN HICON hicon
- )
-{
- return new Bitmap(hicon);
-}
-
-inline Bitmap*
-Bitmap::FromResource(
- IN HINSTANCE hInstance,
- IN const WCHAR *bitmapName)
-{
- return new Bitmap(hInstance, bitmapName);
-}
-
-inline Status
-Bitmap::GetHBITMAP(
- IN const Color& colorBackground,
- OUT HBITMAP* hbmReturn
- )
-{
- return SetStatus(DllExports::GdipCreateHBITMAPFromBitmap(
- static_cast<GpBitmap*>(nativeImage),
- hbmReturn,
- colorBackground.GetValue()));
-}
-
-inline Status
-Bitmap::GetHICON(
- OUT HICON* hiconReturn
- )
-{
- return SetStatus(DllExports::GdipCreateHICONFromBitmap(
- static_cast<GpBitmap*>(nativeImage),
- hiconReturn));
-}
-
-inline Bitmap*
-Bitmap::Clone(
- IN const Rect& rect,
- IN PixelFormat format
- )
-{
- return Clone(rect.X, rect.Y, rect.Width, rect.Height, format);
-}
-
-inline Bitmap*
-Bitmap::Clone(
- IN INT x,
- IN INT y,
- IN INT width,
- IN INT height,
- IN PixelFormat format
- )
-{
- GpBitmap* gpdstBitmap = NULL;
- Bitmap* bitmap;
-
- lastResult = DllExports::GdipCloneBitmapAreaI(
- x,
- y,
- width,
- height,
- format,
- (GpBitmap *)nativeImage,
- &gpdstBitmap);
-
- if (lastResult == Ok)
- {
- bitmap = new Bitmap(gpdstBitmap);
-
- if (bitmap == NULL)
- {
- DllExports::GdipDisposeImage(gpdstBitmap);
- }
-
- return bitmap;
- }
- else
- return NULL;
-}
-
-inline Bitmap*
-Bitmap::Clone(
- IN const RectF& rect,
- IN PixelFormat format
- )
-{
- return Clone(rect.X, rect.Y, rect.Width, rect.Height, format);
-}
-
-inline Bitmap*
-Bitmap::Clone(
- IN REAL x,
- IN REAL y,
- IN REAL width,
- IN REAL height,
- IN PixelFormat format
- )
-{
- GpBitmap* gpdstBitmap = NULL;
- Bitmap* bitmap;
-
- SetStatus(DllExports::GdipCloneBitmapArea(
- x,
- y,
- width,
- height,
- format,
- (GpBitmap *)nativeImage,
- &gpdstBitmap));
-
- if (lastResult == Ok)
- {
- bitmap = new Bitmap(gpdstBitmap);
-
- if (bitmap == NULL)
- {
- DllExports::GdipDisposeImage(gpdstBitmap);
- }
-
- return bitmap;
- }
- else
- return NULL;
-}
-
-inline Bitmap::Bitmap(GpBitmap *nativeBitmap)
-{
- lastResult = Ok;
-
- SetNativeImage(nativeBitmap);
-}
-
-inline Status
-Bitmap::LockBits(
- IN const Rect& rect,
- IN UINT flags,
- IN PixelFormat format,
- OUT BitmapData* lockedBitmapData
-)
-{
- return SetStatus(DllExports::GdipBitmapLockBits(
- static_cast<GpBitmap*>(nativeImage),
- &rect,
- flags,
- format,
- lockedBitmapData));
-}
-
-inline Status
-Bitmap::UnlockBits(
- IN BitmapData* lockedBitmapData
- )
-{
- return SetStatus(DllExports::GdipBitmapUnlockBits(
- static_cast<GpBitmap*>(nativeImage),
- lockedBitmapData));
-}
-
-inline Status
-Bitmap::GetPixel(
- IN INT x,
- IN INT y,
- OUT Color *color)
-{
- ARGB argb;
-
- Status status = SetStatus(DllExports::GdipBitmapGetPixel(
- static_cast<GpBitmap *>(nativeImage),
- x, y,
- &argb));
-
- if (status == Ok)
- {
- color->SetValue(argb);
- }
-
- return status;
-}
-
-inline Status
-Bitmap::SetPixel(
- IN INT x,
- IN INT y,
- IN const Color& color)
-{
- return SetStatus(DllExports::GdipBitmapSetPixel(
- static_cast<GpBitmap *>(nativeImage),
- x, y,
- color.GetValue()));
-}
-
-inline Status
-Bitmap::SetResolution(
- IN REAL xdpi,
- IN REAL ydpi)
-{
- return SetStatus(DllExports::GdipBitmapSetResolution(
- static_cast<GpBitmap *>(nativeImage),
- xdpi, ydpi));
-}
-#endif
+/**************************************************************************\
+*
+* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
+*
+* Module Name:
+*
+* GdiplusBitmap.h
+*
+* Abstract:
+*
+* Bitmap related declarations
+*
+\**************************************************************************/
+
+#ifndef _GDIPLUSBITMAP_H
+#define _GDIPLUSBITMAP_H
+
+// NOTE:
+// Our current choice for the public API is to use constructors
+// instead of static load functions to create image objects.
+//
+// I've kept the static load functions here for now so that
+// existing test programs are not broken. But they should
+// eventually be taken out.
+
+#ifndef DCR_USE_NEW_140782
+
+inline
+Image::Image(
+ IN const WCHAR* filename
+ )
+{
+ nativeImage = NULL;
+ lastResult = DllExports::GdipLoadImageFromFile(filename, &nativeImage);
+}
+
+inline
+Image::Image(
+ IN IStream* stream
+ )
+{
+ nativeImage = NULL;
+ lastResult = DllExports::GdipLoadImageFromStream(stream, &nativeImage);
+}
+
+inline Image*
+Image::FromFile(
+ IN const WCHAR* filename
+ )
+{
+ return new Image(filename);
+}
+
+inline Image*
+Image::FromStream(
+ IN IStream* stream
+ )
+{
+ return new Image(stream);
+}
+
+#else
+
+inline
+Image::Image(
+ IN const WCHAR* filename,
+ IN BOOL useEmbeddedColorManagement
+ )
+{
+ nativeImage = NULL;
+ if(useEmbeddedColorManagement)
+ {
+ lastResult = DllExports::GdipLoadImageFromFileICM(
+ filename,
+ &nativeImage
+ );
+ }
+ else
+ {
+ lastResult = DllExports::GdipLoadImageFromFile(
+ filename,
+ &nativeImage
+ );
+ }
+}
+
+inline
+Image::Image(
+ IN IStream* stream,
+ IN BOOL useEmbeddedColorManagement
+ )
+{
+ nativeImage = NULL;
+ if(useEmbeddedColorManagement)
+ {
+ lastResult = DllExports::GdipLoadImageFromStreamICM(
+ stream,
+ &nativeImage
+ );
+ }
+ else
+ {
+ lastResult = DllExports::GdipLoadImageFromStream(
+ stream,
+ &nativeImage
+ );
+ }
+}
+
+inline Image*
+Image::FromFile(
+ IN const WCHAR* filename,
+ IN BOOL useEmbeddedColorManagement
+ )
+{
+ return new Image(
+ filename,
+ useEmbeddedColorManagement
+ );
+}
+
+inline Image*
+Image::FromStream(
+ IN IStream* stream,
+ IN BOOL useEmbeddedColorManagement
+ )
+{
+ return new Image(
+ stream,
+ useEmbeddedColorManagement
+ );
+}
+
+#endif
+
+inline
+Image::~Image()
+{
+ DllExports::GdipDisposeImage(nativeImage);
+}
+
+inline Image*
+Image::Clone()
+{
+ GpImage *cloneimage = NULL;
+
+ SetStatus(DllExports::GdipCloneImage(nativeImage, &cloneimage));
+
+ return new Image(cloneimage, lastResult);
+}
+
+// Encorder Parameter
+
+inline UINT
+Image::GetEncoderParameterListSize(
+ IN const CLSID* clsidEncoder
+ )
+{
+ UINT size = 0;
+
+ SetStatus(DllExports::GdipGetEncoderParameterListSize(nativeImage,
+ clsidEncoder,
+ &size));
+ return size;
+}
+
+inline Status
+Image::GetEncoderParameterList(
+ IN const CLSID* clsidEncoder,
+ IN UINT size,
+ OUT EncoderParameters* buffer
+ )
+{
+ return SetStatus(DllExports::GdipGetEncoderParameterList(nativeImage,
+ clsidEncoder,
+ size,
+ buffer));
+}
+
+// Save images
+
+inline Status
+Image::Save(
+ IN const WCHAR* filename,
+ IN const CLSID* clsidEncoder,
+ IN const EncoderParameters *encoderParams
+ )
+{
+ return SetStatus(DllExports::GdipSaveImageToFile(nativeImage,
+ filename,
+ clsidEncoder,
+ encoderParams));
+}
+
+inline Status
+Image::Save(
+ IN IStream* stream,
+ IN const CLSID* clsidEncoder,
+ IN const EncoderParameters *encoderParams
+ )
+{
+ return SetStatus(DllExports::GdipSaveImageToStream(nativeImage,
+ stream,
+ clsidEncoder,
+ encoderParams));
+}
+
+inline Status
+Image::SaveAdd(
+ IN const EncoderParameters *encoderParams
+ )
+{
+ return SetStatus(DllExports::GdipSaveAdd(nativeImage,
+ encoderParams));
+}
+
+inline Status
+Image::SaveAdd(
+ IN Image* newImage,
+ IN const EncoderParameters *encoderParams
+ )
+{
+ if ( newImage == NULL )
+ {
+ return SetStatus(InvalidParameter);
+ }
+
+ return SetStatus(DllExports::GdipSaveAddImage(nativeImage,
+ newImage->nativeImage,
+ encoderParams));
+}
+
+// Get size and type information
+inline ImageType
+Image::GetType() const
+{
+ ImageType type = ImageTypeUnknown;
+
+ SetStatus(DllExports::GdipGetImageType(nativeImage, &type));
+
+ return type;
+}
+
+inline Status
+Image::GetPhysicalDimension(
+ OUT SizeF* size
+ )
+{
+ if (size == NULL)
+ {
+ return SetStatus(InvalidParameter);
+ }
+
+ REAL width, height;
+ Status status;
+
+ status = SetStatus(DllExports::GdipGetImageDimension(nativeImage,
+ &width, &height));
+
+ size->Width = width;
+ size->Height = height;
+
+ return status;
+}
+
+inline Status
+Image::GetBounds(
+ OUT RectF *srcRect,
+ OUT Unit *srcUnit
+ )
+{
+ return SetStatus(DllExports::GdipGetImageBounds(nativeImage,
+ srcRect, srcUnit));
+}
+
+inline UINT
+Image::GetWidth()
+{
+ UINT width = 0;
+
+ SetStatus(DllExports::GdipGetImageWidth(nativeImage, &width));
+
+ return width;
+}
+
+inline UINT
+Image::GetHeight()
+{
+ UINT height = 0;
+
+ SetStatus(DllExports::GdipGetImageHeight(nativeImage, &height));
+
+ return height;
+}
+
+inline REAL
+Image::GetHorizontalResolution()
+{
+ REAL resolution = 0.0f;
+
+ SetStatus(DllExports::GdipGetImageHorizontalResolution(nativeImage, &resolution));
+
+ return resolution;
+}
+
+inline REAL
+Image::GetVerticalResolution()
+{
+ REAL resolution = 0.0f;
+
+ SetStatus(DllExports::GdipGetImageVerticalResolution(nativeImage, &resolution));
+
+ return resolution;
+}
+
+inline UINT
+Image::GetFlags()
+{
+ UINT flags = 0;
+
+ SetStatus(DllExports::GdipGetImageFlags(nativeImage, &flags));
+
+ return flags;
+}
+
+inline Status
+Image::GetRawFormat(OUT GUID *format)
+{
+ return SetStatus(DllExports::GdipGetImageRawFormat(nativeImage, format));
+}
+
+inline PixelFormat
+Image::GetPixelFormat()
+{
+ PixelFormat format;
+
+ SetStatus(DllExports::GdipGetImagePixelFormat(nativeImage, &format));
+
+ return format;
+}
+
+inline INT
+Image::GetPaletteSize()
+{
+ INT size = 0;
+
+ SetStatus(DllExports::GdipGetImagePaletteSize(nativeImage, &size));
+
+ return size;
+}
+
+inline Status
+Image::GetPalette(
+ OUT ColorPalette *palette,
+ IN INT size
+)
+{
+ return SetStatus(DllExports::GdipGetImagePalette(nativeImage, palette, size));
+}
+
+inline Status
+Image::SetPalette(
+ IN const ColorPalette *palette
+ )
+{
+ return SetStatus(DllExports::GdipSetImagePalette(nativeImage, palette));
+}
+
+// Thumbnail support
+
+inline Image*
+Image::GetThumbnailImage(
+ IN UINT thumbWidth,
+ IN UINT thumbHeight,
+ IN GetThumbnailImageAbort callback,
+ IN VOID* callbackData
+ )
+{
+ GpImage *thumbimage = NULL;
+
+ SetStatus(DllExports::GdipGetImageThumbnail(nativeImage,
+ thumbWidth, thumbHeight,
+ &thumbimage,
+ callback, callbackData));
+
+ Image *newImage = new Image(thumbimage, lastResult);
+
+ if (newImage == NULL)
+ {
+ DllExports::GdipDisposeImage(thumbimage);
+ }
+
+ return newImage;
+}
+
+// Multi-frame support
+inline UINT
+Image::GetFrameDimensionsCount()
+{
+ UINT count = 0;
+
+ SetStatus(DllExports::GdipImageGetFrameDimensionsCount(nativeImage,
+ &count));
+
+ return count;
+}
+
+inline Status
+Image::GetFrameDimensionsList(
+ OUT GUID* dimensionIDs,
+ IN UINT count
+ )
+{
+ return SetStatus(DllExports::GdipImageGetFrameDimensionsList(nativeImage,
+ dimensionIDs,
+ count));
+}
+
+inline UINT
+Image::GetFrameCount(
+ IN const GUID* dimensionID
+ )
+{
+ UINT count = 0;
+
+ SetStatus(DllExports::GdipImageGetFrameCount(nativeImage,
+ dimensionID,
+ &count));
+ return count;
+}
+
+inline Status
+Image::SelectActiveFrame(
+ IN const GUID *dimensionID,
+ IN UINT frameIndex
+ )
+{
+ return SetStatus(DllExports::GdipImageSelectActiveFrame(nativeImage,
+ dimensionID,
+ frameIndex));
+}
+
+inline Status
+Image::RotateFlip(
+ IN RotateFlipType rotateFlipType
+ )
+{
+ return SetStatus(DllExports::GdipImageRotateFlip(nativeImage,
+ rotateFlipType));
+}
+
+// Image property related functions
+
+inline UINT
+Image::GetPropertyCount()
+{
+ UINT numProperty = 0;
+
+ SetStatus(DllExports::GdipGetPropertyCount(nativeImage,
+ &numProperty));
+
+ return numProperty;
+}
+
+inline Status
+Image::GetPropertyIdList(
+ IN UINT numOfProperty,
+ OUT PROPID* list
+ )
+{
+ return SetStatus(DllExports::GdipGetPropertyIdList(nativeImage,
+ numOfProperty, list));
+}
+
+inline UINT
+Image::GetPropertyItemSize(
+ IN PROPID propId
+ )
+{
+ UINT size = 0;
+
+ SetStatus(DllExports::GdipGetPropertyItemSize(nativeImage,
+ propId,
+ &size));
+
+ return size;
+}
+
+inline Status
+Image::GetPropertyItem(
+ IN PROPID propId,
+ IN UINT propSize,
+ OUT PropertyItem* buffer
+ )
+{
+ return SetStatus(DllExports::GdipGetPropertyItem(nativeImage,
+ propId, propSize, buffer));
+}
+
+inline Status
+Image::GetPropertySize(
+ OUT UINT* totalBufferSize,
+ OUT UINT* numProperties
+ )
+{
+ return SetStatus(DllExports::GdipGetPropertySize(nativeImage,
+ totalBufferSize,
+ numProperties));
+}
+
+inline Status
+Image::GetAllPropertyItems(
+ IN UINT totalBufferSize,
+ IN UINT numProperties,
+ OUT PropertyItem* allItems
+ )
+{
+ if (allItems == NULL)
+ {
+ return SetStatus(InvalidParameter);
+ }
+ return SetStatus(DllExports::GdipGetAllPropertyItems(nativeImage,
+ totalBufferSize,
+ numProperties,
+ allItems));
+}
+
+inline Status
+Image::RemovePropertyItem(
+ IN PROPID propId
+ )
+{
+ return SetStatus(DllExports::GdipRemovePropertyItem(nativeImage, propId));
+}
+
+inline Status
+Image::SetPropertyItem(
+ IN const PropertyItem* item
+ )
+{
+ return SetStatus(DllExports::GdipSetPropertyItem(nativeImage, item));
+}
+
+// Get/SetLayout
+// Support for Middle East localization (right-to-left mirroring)
+
+inline ImageLayout
+Image::GetLayout() const
+{
+ ImageLayout layout;
+
+ SetStatus(DllExports::GdipGetImageLayout(nativeImage, &layout));
+
+ return layout;
+}
+
+inline Status
+Image::SetLayout(IN const ImageLayout layout)
+{
+ return SetStatus(
+ DllExports::GdipSetImageLayout(nativeImage, layout)
+ );
+}
+
+inline Status
+Image::GetLastStatus() const
+{
+ Status lastStatus = lastResult;
+ lastResult = Ok;
+
+ return lastStatus;
+}
+
+inline
+Image::Image(GpImage *nativeImage, Status status)
+{
+ SetNativeImage(nativeImage);
+ lastResult = status;
+}
+
+inline VOID
+Image::SetNativeImage(GpImage *nativeImage)
+{
+ this->nativeImage = nativeImage;
+}
+
+inline
+Bitmap::Bitmap(
+ IN const WCHAR *filename,
+ IN BOOL useEmbeddedColorManagement
+ )
+{
+ GpBitmap *bitmap = NULL;
+
+ if(useEmbeddedColorManagement)
+ {
+ lastResult = DllExports::GdipCreateBitmapFromFileICM(filename, &bitmap);
+ }
+ else
+ {
+ lastResult = DllExports::GdipCreateBitmapFromFile(filename, &bitmap);
+ }
+
+ SetNativeImage(bitmap);
+}
+
+inline
+Bitmap::Bitmap(
+ IN IStream *stream,
+ IN BOOL useEmbeddedColorManagement
+ )
+{
+ GpBitmap *bitmap = NULL;
+
+ if(useEmbeddedColorManagement)
+ {
+ lastResult = DllExports::GdipCreateBitmapFromStreamICM(stream, &bitmap);
+ }
+ else
+ {
+ lastResult = DllExports::GdipCreateBitmapFromStream(stream, &bitmap);
+ }
+
+ SetNativeImage(bitmap);
+}
+
+inline
+Bitmap::Bitmap(
+ IN INT width,
+ IN INT height,
+ IN INT stride,
+ IN PixelFormat format,
+ IN BYTE *scan0
+ )
+{
+ GpBitmap *bitmap = NULL;
+
+ lastResult = DllExports::GdipCreateBitmapFromScan0(width,
+ height,
+ stride,
+ format,
+ scan0,
+ &bitmap);
+
+ SetNativeImage(bitmap);
+}
+
+inline
+Bitmap::Bitmap(
+ IN INT width,
+ IN INT height,
+ IN PixelFormat format
+ )
+{
+ GpBitmap *bitmap = NULL;
+
+ lastResult = DllExports::GdipCreateBitmapFromScan0(width,
+ height,
+ 0,
+ format,
+ NULL,
+ &bitmap);
+
+ SetNativeImage(bitmap);
+}
+
+inline
+Bitmap::Bitmap(
+ IN INT width,
+ IN INT height,
+ IN Graphics* target)
+{
+ GpBitmap *bitmap = NULL;
+
+ lastResult = DllExports::GdipCreateBitmapFromGraphics(width,
+ height,
+ target->nativeGraphics,
+ &bitmap);
+
+ SetNativeImage(bitmap);
+}
+
+inline
+Bitmap::Bitmap(
+ IN IDirectDrawSurface7 * surface
+ )
+{
+ GpBitmap *bitmap = NULL;
+
+ lastResult = DllExports::GdipCreateBitmapFromDirectDrawSurface(surface,
+ &bitmap);
+
+ SetNativeImage(bitmap);
+}
+
+inline
+Bitmap::Bitmap(
+ IN const BITMAPINFO* gdiBitmapInfo,
+ IN VOID* gdiBitmapData
+ )
+{
+ GpBitmap *bitmap = NULL;
+
+ lastResult = DllExports::GdipCreateBitmapFromGdiDib(gdiBitmapInfo,
+ gdiBitmapData,
+ &bitmap);
+
+ SetNativeImage(bitmap);
+}
+
+inline
+Bitmap::Bitmap(
+ IN HBITMAP hbm,
+ IN HPALETTE hpal
+ )
+{
+ GpBitmap *bitmap = NULL;
+
+ lastResult = DllExports::GdipCreateBitmapFromHBITMAP(hbm, hpal, &bitmap);
+
+ SetNativeImage(bitmap);
+}
+
+inline
+Bitmap::Bitmap(
+ IN HICON hicon
+ )
+{
+ GpBitmap *bitmap = NULL;
+
+ lastResult = DllExports::GdipCreateBitmapFromHICON(hicon, &bitmap);
+
+ SetNativeImage(bitmap);
+}
+
+inline
+Bitmap::Bitmap(
+ IN HINSTANCE hInstance,
+ IN const WCHAR *bitmapName
+ )
+{
+ GpBitmap *bitmap = NULL;
+
+ lastResult = DllExports::GdipCreateBitmapFromResource(hInstance,
+ bitmapName,
+ &bitmap);
+
+ SetNativeImage(bitmap);
+}
+
+
+inline Bitmap*
+Bitmap::FromFile(
+ IN const WCHAR *filename,
+ IN BOOL useEmbeddedColorManagement
+ )
+{
+ return new Bitmap(
+ filename,
+ useEmbeddedColorManagement
+ );
+}
+
+inline Bitmap*
+Bitmap::FromStream(
+ IN IStream *stream,
+ IN BOOL useEmbeddedColorManagement
+ )
+{
+ return new Bitmap(
+ stream,
+ useEmbeddedColorManagement
+ );
+}
+
+inline Bitmap*
+Bitmap::FromDirectDrawSurface7(
+ IN IDirectDrawSurface7* surface
+ )
+{
+ return new Bitmap(surface);
+}
+
+inline Bitmap*
+Bitmap::FromBITMAPINFO(
+ IN const BITMAPINFO* gdiBitmapInfo,
+ IN VOID* gdiBitmapData)
+{
+ return new Bitmap(gdiBitmapInfo, gdiBitmapData);
+}
+
+inline Bitmap*
+Bitmap::FromHBITMAP(
+ IN HBITMAP hbm,
+ IN HPALETTE hpal
+ )
+{
+ return new Bitmap(hbm, hpal);
+}
+
+inline Bitmap*
+Bitmap::FromHICON(
+ IN HICON hicon
+ )
+{
+ return new Bitmap(hicon);
+}
+
+inline Bitmap*
+Bitmap::FromResource(
+ IN HINSTANCE hInstance,
+ IN const WCHAR *bitmapName)
+{
+ return new Bitmap(hInstance, bitmapName);
+}
+
+inline Status
+Bitmap::GetHBITMAP(
+ IN const Color& colorBackground,
+ OUT HBITMAP* hbmReturn
+ )
+{
+ return SetStatus(DllExports::GdipCreateHBITMAPFromBitmap(
+ static_cast<GpBitmap*>(nativeImage),
+ hbmReturn,
+ colorBackground.GetValue()));
+}
+
+inline Status
+Bitmap::GetHICON(
+ OUT HICON* hiconReturn
+ )
+{
+ return SetStatus(DllExports::GdipCreateHICONFromBitmap(
+ static_cast<GpBitmap*>(nativeImage),
+ hiconReturn));
+}
+
+inline Bitmap*
+Bitmap::Clone(
+ IN const Rect& rect,
+ IN PixelFormat format
+ )
+{
+ return Clone(rect.X, rect.Y, rect.Width, rect.Height, format);
+}
+
+inline Bitmap*
+Bitmap::Clone(
+ IN INT x,
+ IN INT y,
+ IN INT width,
+ IN INT height,
+ IN PixelFormat format
+ )
+{
+ GpBitmap* gpdstBitmap = NULL;
+ Bitmap* bitmap;
+
+ lastResult = DllExports::GdipCloneBitmapAreaI(
+ x,
+ y,
+ width,
+ height,
+ format,
+ (GpBitmap *)nativeImage,
+ &gpdstBitmap);
+
+ if (lastResult == Ok)
+ {
+ bitmap = new Bitmap(gpdstBitmap);
+
+ if (bitmap == NULL)
+ {
+ DllExports::GdipDisposeImage(gpdstBitmap);
+ }
+
+ return bitmap;
+ }
+ else
+ return NULL;
+}
+
+inline Bitmap*
+Bitmap::Clone(
+ IN const RectF& rect,
+ IN PixelFormat format
+ )
+{
+ return Clone(rect.X, rect.Y, rect.Width, rect.Height, format);
+}
+
+inline Bitmap*
+Bitmap::Clone(
+ IN REAL x,
+ IN REAL y,
+ IN REAL width,
+ IN REAL height,
+ IN PixelFormat format
+ )
+{
+ GpBitmap* gpdstBitmap = NULL;
+ Bitmap* bitmap;
+
+ SetStatus(DllExports::GdipCloneBitmapArea(
+ x,
+ y,
+ width,
+ height,
+ format,
+ (GpBitmap *)nativeImage,
+ &gpdstBitmap));
+
+ if (lastResult == Ok)
+ {
+ bitmap = new Bitmap(gpdstBitmap);
+
+ if (bitmap == NULL)
+ {
+ DllExports::GdipDisposeImage(gpdstBitmap);
+ }
+
+ return bitmap;
+ }
+ else
+ return NULL;
+}
+
+inline Bitmap::Bitmap(GpBitmap *nativeBitmap)
+{
+ lastResult = Ok;
+
+ SetNativeImage(nativeBitmap);
+}
+
+inline Status
+Bitmap::LockBits(
+ IN const Rect& rect,
+ IN UINT flags,
+ IN PixelFormat format,
+ OUT BitmapData* lockedBitmapData
+)
+{
+ return SetStatus(DllExports::GdipBitmapLockBits(
+ static_cast<GpBitmap*>(nativeImage),
+ &rect,
+ flags,
+ format,
+ lockedBitmapData));
+}
+
+inline Status
+Bitmap::UnlockBits(
+ IN BitmapData* lockedBitmapData
+ )
+{
+ return SetStatus(DllExports::GdipBitmapUnlockBits(
+ static_cast<GpBitmap*>(nativeImage),
+ lockedBitmapData));
+}
+
+inline Status
+Bitmap::GetPixel(
+ IN INT x,
+ IN INT y,
+ OUT Color *color)
+{
+ ARGB argb;
+
+ Status status = SetStatus(DllExports::GdipBitmapGetPixel(
+ static_cast<GpBitmap *>(nativeImage),
+ x, y,
+ &argb));
+
+ if (status == Ok)
+ {
+ color->SetValue(argb);
+ }
+
+ return status;
+}
+
+inline Status
+Bitmap::SetPixel(
+ IN INT x,
+ IN INT y,
+ IN const Color& color)
+{
+ return SetStatus(DllExports::GdipBitmapSetPixel(
+ static_cast<GpBitmap *>(nativeImage),
+ x, y,
+ color.GetValue()));
+}
+
+inline Status
+Bitmap::SetResolution(
+ IN REAL xdpi,
+ IN REAL ydpi)
+{
+ return SetStatus(DllExports::GdipBitmapSetResolution(
+ static_cast<GpBitmap *>(nativeImage),
+ xdpi, ydpi));
+}
+#endif
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusBrush.h b/core/src/fxge/Microsoft SDK/include/GdiPlusBrush.h
index a506f87982..c25e34ae01 100644
--- a/core/src/fxge/Microsoft SDK/include/GdiPlusBrush.h
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusBrush.h
@@ -1,951 +1,951 @@
-/**************************************************************************\
-*
-* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
-*
-* Module Name:
-*
-* GdiplusBrush.h
-*
-* Abstract:
-*
-* Brush API related declarations
-*
-\**************************************************************************/
-
-#ifndef _GDIPLUSBRUSH_H
-#define _GDIPLUSBRUSH_H
-
-//--------------------------------------------------------------------------
-// Abstract base class for various brush types
-//--------------------------------------------------------------------------
-
-class GraphicsPath;
-
-class Brush : public GdiplusBase
-{
-public:
- friend class Pen;
- friend class Graphics;
-
- virtual ~Brush()
- {
- DllExports::GdipDeleteBrush(nativeBrush);
- }
-
- virtual Brush* Clone() const
- {
- GpBrush *brush = NULL;
-
- SetStatus(DllExports::GdipCloneBrush(nativeBrush, &brush));
-
- Brush *newBrush = new Brush(brush, lastResult);
-
- if (newBrush == NULL)
- {
- DllExports::GdipDeleteBrush(brush);
- }
-
- return newBrush;
- }
-
- BrushType GetType() const
- {
- BrushType type = static_cast<BrushType>(-1);
-
- SetStatus(DllExports::GdipGetBrushType(nativeBrush, &type));
-
- return type;
- }
-
- Status GetLastStatus() const
- {
- Status lastStatus = lastResult;
- lastResult = Ok;
-
- return lastStatus;
- }
-
-protected:
-
- Brush()
- {
- SetStatus(NotImplemented);
- }
-
-#ifdef DCR_USE_NEW_250932
-
-private:
- Brush(const Brush& brush);
- Brush& operator=(const Brush& brush);
-protected:
-
-#else
-
- Brush(const Brush& brush)
- {
- brush;
- SetStatus(NotImplemented);
- }
-
- Brush& operator=(const Brush& brush)
- {
- brush;
- SetStatus(NotImplemented);
- return *this;
- }
-
-#endif
-
- Brush(GpBrush* nativeBrush, Status status)
- {
- lastResult = status;
- SetNativeBrush(nativeBrush);
- }
-
- VOID SetNativeBrush(GpBrush* nativeBrush)
- {
- this->nativeBrush = nativeBrush;
- }
-
- Status SetStatus(Status status) const
- {
- if (status != Ok)
- return (lastResult = status);
- else
- return status;
- }
-
- GpBrush* nativeBrush;
- mutable Status lastResult;
-};
-
-//--------------------------------------------------------------------------
-// Represent solid fill brush object
-//--------------------------------------------------------------------------
-
-class SolidBrush : public Brush
-{
-public:
- friend class Pen;
-
- SolidBrush(IN const Color& color)
- {
- GpSolidFill *brush = NULL;
-
- lastResult = DllExports::GdipCreateSolidFill(color.GetValue(), &brush);
-
- SetNativeBrush(brush);
- }
-
- Status GetColor(OUT Color* color) const
- {
- ARGB argb;
-
- if (color == NULL)
- {
- return SetStatus(InvalidParameter);
- }
-
- SetStatus(DllExports::GdipGetSolidFillColor((GpSolidFill*)nativeBrush,
- &argb));
-
- *color = Color(argb);
-
- return lastResult;
- }
-
- Status SetColor(IN const Color& color)
- {
- return SetStatus(DllExports::GdipSetSolidFillColor((GpSolidFill*)nativeBrush,
- color.GetValue()));
- }
-
-#ifdef DCR_USE_NEW_250932
-
-private:
- SolidBrush(const SolidBrush &);
- SolidBrush& operator=(const SolidBrush &);
-
-#endif
-
-protected:
-
- SolidBrush()
- {
- }
-};
-
-class TextureBrush : public Brush
-{
-public:
- friend class Pen;
-
- TextureBrush(IN Image* image,
- IN WrapMode wrapMode = WrapModeTile)
- {
- GpTexture *texture = NULL;
-
- lastResult = DllExports::GdipCreateTexture(
- image->nativeImage,
- wrapMode, &texture);
-
- SetNativeBrush(texture);
- }
-
- // When creating a texture brush from a metafile image, the dstRect
- // is used to specify the size that the metafile image should be
- // rendered at in the device units of the destination graphics.
- // It is NOT used to crop the metafile image, so only the width
- // and height values matter for metafiles.
- TextureBrush(IN Image* image,
- IN WrapMode wrapMode,
- IN const RectF &dstRect)
- {
- GpTexture *texture = NULL;
-
- lastResult = DllExports::GdipCreateTexture2(
- image->nativeImage,
- wrapMode,
- dstRect.X,
- dstRect.Y,
- dstRect.Width,
- dstRect.Height,
- &texture);
-
- SetNativeBrush(texture);
- }
-
- // When creating a texture brush from a metafile image, the dstRect
- // is used to specify the size that the metafile image should be
- // rendered at in the device units of the destination graphics.
- // It is NOT used to crop the metafile image, so only the width
- // and height values matter for metafiles.
-
- TextureBrush(IN Image *image,
- IN const RectF &dstRect,
- IN const ImageAttributes *imageAttributes = NULL)
- {
- GpTexture *texture = NULL;
-
- lastResult = DllExports::GdipCreateTextureIA(
- image->nativeImage,
- (imageAttributes)?imageAttributes->nativeImageAttr:NULL,
- dstRect.X,
- dstRect.Y,
- dstRect.Width,
- dstRect.Height,
- &texture
- );
-
- SetNativeBrush(texture);
- }
-
- #ifdef DCR_USE_NEW_145138
- TextureBrush(IN Image *image,
- IN const Rect &dstRect,
- IN const ImageAttributes *imageAttributes = NULL)
- {
- GpTexture *texture = NULL;
-
- lastResult = DllExports::GdipCreateTextureIAI(
- image->nativeImage,
- (imageAttributes)?imageAttributes->nativeImageAttr:NULL,
- dstRect.X,
- dstRect.Y,
- dstRect.Width,
- dstRect.Height,
- &texture
- );
-
- SetNativeBrush(texture);
- }
- #endif
-
- // When creating a texture brush from a metafile image, the dstRect
- // is used to specify the size that the metafile image should be
- // rendered at in the device units of the destination graphics.
- // It is NOT used to crop the metafile image, so only the width
- // and height values matter for metafiles.
-
- TextureBrush(
- IN Image* image,
- IN WrapMode wrapMode,
-
- #ifdef DCR_USE_NEW_145138
- const IN Rect &dstRect
- #else
- IN Rect &dstRect
- #endif
- )
- {
- GpTexture *texture = NULL;
-
- lastResult = DllExports::GdipCreateTexture2I(
- image->nativeImage,
- wrapMode,
- dstRect.X,
- dstRect.Y,
- dstRect.Width,
- dstRect.Height,
- &texture);
-
- SetNativeBrush(texture);
- }
-
- // When creating a texture brush from a metafile image, the dstRect
- // is used to specify the size that the metafile image should be
- // rendered at in the device units of the destination graphics.
- // It is NOT used to crop the metafile image, so only the width
- // and height values matter for metafiles.
- TextureBrush(IN Image* image,
- IN WrapMode wrapMode,
- IN REAL dstX,
- IN REAL dstY,
- IN REAL dstWidth,
- IN REAL dstHeight)
- {
- GpTexture *texture = NULL;
-
- lastResult = DllExports::GdipCreateTexture2(
- image->nativeImage,
- wrapMode,
- dstX,
- dstY,
- dstWidth,
- dstHeight,
- &texture);
-
- SetNativeBrush(texture);
- }
-
- // When creating a texture brush from a metafile image, the dstRect
- // is used to specify the size that the metafile image should be
- // rendered at in the device units of the destination graphics.
- // It is NOT used to crop the metafile image, so only the width
- // and height values matter for metafiles.
- TextureBrush(IN Image* image,
- IN WrapMode wrapMode,
- IN INT dstX,
- IN INT dstY,
- IN INT dstWidth,
- IN INT dstHeight)
- {
- GpTexture *texture = NULL;
-
- lastResult = DllExports::GdipCreateTexture2I(
- image->nativeImage,
- wrapMode,
- dstX,
- dstY,
- dstWidth,
- dstHeight,
- &texture);
-
- SetNativeBrush(texture);
- }
-
- /**
- * Set/get brush transform
- */
- Status SetTransform(IN const Matrix* matrix)
- {
- return SetStatus(DllExports::GdipSetTextureTransform((GpTexture*)nativeBrush,
- matrix->nativeMatrix));
- }
-
- Status GetTransform(OUT Matrix* matrix) const
- {
- return SetStatus(DllExports::GdipGetTextureTransform((GpTexture*)nativeBrush,
- matrix->nativeMatrix));
- }
-
- Status ResetTransform()
- {
- return SetStatus(DllExports::GdipResetTextureTransform((GpTexture*)nativeBrush));
- }
-
- Status MultiplyTransform(IN const Matrix* matrix,
- IN MatrixOrder order = MatrixOrderPrepend)
- {
- return SetStatus(DllExports::GdipMultiplyTextureTransform((GpTexture*)nativeBrush,
- matrix->nativeMatrix,
- order));
- }
-
- Status TranslateTransform(IN REAL dx,
- IN REAL dy,
- IN MatrixOrder order = MatrixOrderPrepend)
- {
- return SetStatus(DllExports::GdipTranslateTextureTransform((GpTexture*)nativeBrush,
- dx, dy, order));
- }
-
- Status ScaleTransform(IN REAL sx,
- IN REAL sy,
- IN MatrixOrder order = MatrixOrderPrepend)
- {
- return SetStatus(DllExports::GdipScaleTextureTransform((GpTexture*)nativeBrush,
- sx, sy, order));
- }
-
- Status RotateTransform(IN REAL angle,
- IN MatrixOrder order = MatrixOrderPrepend)
- {
- return SetStatus(DllExports::GdipRotateTextureTransform((GpTexture*)nativeBrush,
- angle, order));
- }
-
- /**
- * Set/get brush wrapping mode
- */
- Status SetWrapMode(IN WrapMode wrapMode)
- {
- return SetStatus(DllExports::GdipSetTextureWrapMode((GpTexture*)nativeBrush,
- wrapMode));
- }
-
- WrapMode GetWrapMode() const
- {
- WrapMode wrapMode;
-
- SetStatus(DllExports::GdipGetTextureWrapMode((GpTexture*)nativeBrush,
- &wrapMode));
- return wrapMode;
- }
-
- // Get texture brush attributes
-
- Image *GetImage() const
- {
- GpImage *image;
-
- SetStatus(DllExports::GdipGetTextureImage((GpTexture *)nativeBrush,
- &image));
-
- Image *retimage = new Image(image, lastResult);
-
- if (retimage == NULL)
- {
- DllExports::GdipDisposeImage(image);
- }
-
- return retimage;
- }
-
-#ifdef DCR_USE_NEW_250932
-
-private:
- TextureBrush(const TextureBrush &);
- TextureBrush& operator=(const TextureBrush &);
-
-#endif
-
-protected:
-
- TextureBrush()
- {
- }
-};
-
-//--------------------------------------------------------------------------
-// Represent line gradient brush object
-//--------------------------------------------------------------------------
-
-class LinearGradientBrush : public Brush
-{
-public:
- friend class Pen;
-
- LinearGradientBrush(IN const PointF& point1,
- IN const PointF& point2,
- IN const Color& color1,
- IN const Color& color2)
- {
- GpLineGradient *brush = NULL;
-
- lastResult = DllExports::GdipCreateLineBrush(&point1,
- &point2,
- color1.GetValue(),
- color2.GetValue(),
- WrapModeTile,
- &brush);
-
- SetNativeBrush(brush);
- }
-
- LinearGradientBrush(IN const Point& point1,
- IN const Point& point2,
- IN const Color& color1,
- IN const Color& color2)
- {
- GpLineGradient *brush = NULL;
-
- lastResult = DllExports::GdipCreateLineBrushI(&point1,
- &point2,
- color1.GetValue(),
- color2.GetValue(),
- WrapModeTile,
- &brush);
-
- SetNativeBrush(brush);
- }
-
- LinearGradientBrush(IN const RectF& rect,
- IN const Color& color1,
- IN const Color& color2,
- IN LinearGradientMode mode)
- {
- GpLineGradient *brush = NULL;
-
- lastResult = DllExports::GdipCreateLineBrushFromRect(&rect,
- color1.GetValue(),
- color2.GetValue(),
- mode,
- WrapModeTile,
- &brush);
-
- SetNativeBrush(brush);
- }
-
- LinearGradientBrush(IN const Rect& rect,
- IN const Color& color1,
- IN const Color& color2,
- IN LinearGradientMode mode)
- {
- GpLineGradient *brush = NULL;
-
- lastResult = DllExports::GdipCreateLineBrushFromRectI(&rect,
- color1.GetValue(),
- color2.GetValue(),
- mode,
- WrapModeTile,
- &brush);
-
- SetNativeBrush(brush);
- }
-
- LinearGradientBrush(IN const RectF& rect,
- IN const Color& color1,
- IN const Color& color2,
- IN REAL angle,
- IN BOOL isAngleScalable = FALSE)
- {
- GpLineGradient *brush = NULL;
-
- lastResult = DllExports::GdipCreateLineBrushFromRectWithAngle(&rect,
- color1.GetValue(),
- color2.GetValue(),
- angle,
- isAngleScalable,
- WrapModeTile,
- &brush);
-
- SetNativeBrush(brush);
- }
-
- LinearGradientBrush(IN const Rect& rect,
- IN const Color& color1,
- IN const Color& color2,
- IN REAL angle,
- IN BOOL isAngleScalable = FALSE)
- {
- GpLineGradient *brush = NULL;
-
- lastResult = DllExports::GdipCreateLineBrushFromRectWithAngleI(&rect,
- color1.GetValue(),
- color2.GetValue(),
- angle,
- isAngleScalable,
- WrapModeTile,
- &brush);
-
- SetNativeBrush(brush);
- }
-
- // Get/set point attributes
-
- Status SetLinearPoints(IN const PointF& point1,
- IN const PointF& point2)
- {
- return SetStatus(DllExports::GdipSetLinePoints((GpLineGradient*)nativeBrush,
- &point1, &point2));
- }
-
- Status GetLinearPoints(OUT PointF* points) const
- {
- return SetStatus(DllExports::GdipGetLinePoints((GpLineGradient*) nativeBrush,
- points));
- }
-
- Status SetLinearPoints(IN const Point& point1,
- IN const Point& point2)
- {
- return SetStatus(DllExports::GdipSetLinePointsI((GpLineGradient*)nativeBrush,
- &point1, &point2));
- }
-
- Status GetLinearPoints(OUT Point* points) const
- {
- return SetStatus(DllExports::GdipGetLinePointsI((GpLineGradient*) nativeBrush,
- points));
- }
- // Get/set color attributes
-
- Status SetLinearColors(IN const Color& color1,
- IN const Color& color2)
- {
- return SetStatus(DllExports::GdipSetLineColors((GpLineGradient*)nativeBrush,
- color1.GetValue(),
- color2.GetValue()));
- }
-
- Status GetLinearColors(OUT Color* colors) const
- {
- ARGB argb[2];
-
- if (colors == NULL)
- {
- return SetStatus(InvalidParameter);
- }
-
- SetStatus(DllExports::GdipGetLineColors((GpLineGradient*) nativeBrush, argb));
-
- if (lastResult == Ok)
- {
- // use bitwise copy operator for Color copy
- colors[0] = Color(argb[0]);
- colors[1] = Color(argb[1]);
- }
-
- return lastResult;
- }
-
- Status GetRectangle(OUT RectF* rect) const
- {
- return SetStatus(DllExports::GdipGetLineRect((GpLineGradient*)nativeBrush, rect));
- }
-
- // integer version
- Status GetRectangle(OUT Rect* rect) const
- {
- return SetStatus(DllExports::GdipGetLineRectI((GpLineGradient*)nativeBrush, rect));
- }
-
- // Gamma correction in interporlation.
-
- Status SetGammaCorrection(IN BOOL useGammaCorrection)
- {
- return SetStatus(DllExports::GdipSetLineGammaCorrection((GpLineGradient*)nativeBrush,
- useGammaCorrection));
- }
-
- BOOL GetGammaCorrection() const
- {
- BOOL useGammaCorrection;
-
- SetStatus(DllExports::GdipGetLineGammaCorrection((GpLineGradient*)nativeBrush,
- &useGammaCorrection));
-
- return useGammaCorrection;
- }
-
- INT GetBlendCount() const
- {
- INT count = 0;
-
- SetStatus(DllExports::GdipGetLineBlendCount((GpLineGradient*)
- nativeBrush,
- &count));
-
- return count;
- }
-
- Status SetBlend(IN const REAL* blendFactors,
- IN const REAL* blendPositions,
- IN INT count)
- {
- return SetStatus(DllExports::GdipSetLineBlend((GpLineGradient*)
- nativeBrush,
- blendFactors,
- blendPositions,
- count));
- }
-
- Status GetBlend(OUT REAL* blendFactors,
- OUT REAL* blendPositions,
- IN INT count) const
- {
- return SetStatus(DllExports::GdipGetLineBlend((GpLineGradient*)nativeBrush,
- blendFactors,
- blendPositions,
- count));
- }
-
- INT GetInterpolationColorCount() const
- {
- INT count = 0;
-
- SetStatus(DllExports::GdipGetLinePresetBlendCount((GpLineGradient*)
- nativeBrush,
- &count));
-
- return count;
- }
-
- Status SetInterpolationColors(IN const Color* presetColors,
- IN const REAL* blendPositions,
- IN INT count)
- {
- if ((count <= 0) || !presetColors)
- return SetStatus(InvalidParameter);
-
- ARGB *argbs = (ARGB*) new BYTE[count*sizeof(ARGB)];
-
- if (argbs)
- {
- for (INT i = 0; i < count; i++)
- {
- argbs[i] = presetColors[i].GetValue();
- }
-
- Status status = SetStatus(DllExports::GdipSetLinePresetBlend(
- (GpLineGradient*) nativeBrush,
- argbs,
- blendPositions,
- count));
- delete [] argbs;
- return status;
- }
- else
- {
- return SetStatus(OutOfMemory);
- }
- }
-
- Status GetInterpolationColors(OUT Color* presetColors,
- OUT REAL* blendPositions,
- IN INT count) const
- {
- if ((count <= 0) || !presetColors)
- return SetStatus(InvalidParameter);
-
- ARGB* argbs = (ARGB*) new BYTE[count*sizeof(ARGB)];
-
- if (!argbs)
- {
- return SetStatus(OutOfMemory);
- }
-
- Status status = SetStatus(DllExports::GdipGetLinePresetBlend((GpLineGradient*)nativeBrush,
- argbs,
- blendPositions,
- count));
- if (status == Ok)
- {
- for (INT i = 0; i < count; i++)
- {
- presetColors[i] = Color(argbs[i]);
- }
- }
-
- delete [] argbs;
-
- return status;
- }
-
- Status SetBlendBellShape(IN REAL focus,
- IN REAL scale = 1.0)
- {
- return SetStatus(DllExports::GdipSetLineSigmaBlend((GpLineGradient*)nativeBrush, focus, scale));
- }
-
- #ifdef DCR_USE_NEW_145135
- Status SetBlendTriangularShape(
- IN REAL focus,
- IN REAL scale = 1.0
- )
- #else
- Status SetBlendTrianglarShape(IN REAL focus,
- IN REAL scale = 1.0)
- #endif
- {
- return SetStatus(DllExports::GdipSetLineLinearBlend((GpLineGradient*)nativeBrush, focus, scale));
- }
-
- /**
- * Set/get brush transform
- */
- Status SetTransform(IN const Matrix* matrix)
- {
- return SetStatus(DllExports::GdipSetLineTransform((GpLineGradient*)nativeBrush,
- matrix->nativeMatrix));
- }
-
- Status GetTransform(OUT Matrix *matrix) const
- {
- return SetStatus(DllExports::GdipGetLineTransform((GpLineGradient*)nativeBrush,
- matrix->nativeMatrix));
- }
-
- Status ResetTransform()
- {
- return SetStatus(DllExports::GdipResetLineTransform((GpLineGradient*)nativeBrush));
- }
-
- Status MultiplyTransform(IN const Matrix* matrix,
- IN MatrixOrder order = MatrixOrderPrepend)
- {
- return SetStatus(DllExports::GdipMultiplyLineTransform((GpLineGradient*)nativeBrush,
- matrix->nativeMatrix,
- order));
- }
-
- Status TranslateTransform(IN REAL dx,
- IN REAL dy,
- IN MatrixOrder order = MatrixOrderPrepend)
- {
- return SetStatus(DllExports::GdipTranslateLineTransform((GpLineGradient*)nativeBrush,
- dx, dy, order));
- }
-
- Status ScaleTransform(IN REAL sx,
- IN REAL sy,
- IN MatrixOrder order = MatrixOrderPrepend)
- {
- return SetStatus(DllExports::GdipScaleLineTransform((GpLineGradient*)nativeBrush,
- sx, sy, order));
- }
-
- Status RotateTransform(IN REAL angle,
- IN MatrixOrder order = MatrixOrderPrepend)
- {
- return SetStatus(DllExports::GdipRotateLineTransform((GpLineGradient*)nativeBrush,
- angle, order));
- }
-
- /**
- * Set/get brush wrapping mode
- */
- Status SetWrapMode(IN WrapMode wrapMode)
- {
- return SetStatus(DllExports::GdipSetLineWrapMode((GpLineGradient*)nativeBrush,
- wrapMode));
- }
-
- WrapMode GetWrapMode() const
- {
- WrapMode wrapMode;
-
- SetStatus(DllExports::GdipGetLineWrapMode((GpLineGradient*)
- nativeBrush,
- &wrapMode));
-
- return wrapMode;
- }
-
-#ifdef DCR_USE_NEW_250932
-
-private:
- LinearGradientBrush(const LinearGradientBrush &);
- LinearGradientBrush& operator=(const LinearGradientBrush &);
-
-#endif
-
-protected:
-
- LinearGradientBrush()
- {
- }
-};
-
-//--------------------------------------------------------------------------
-// PathGradientBrush object is defined
-// in gdipluspath.h.
-//--------------------------------------------------------------------------
-
-//--------------------------------------------------------------------------
-// Represent hatch brush object
-//--------------------------------------------------------------------------
-
-class HatchBrush : public Brush
-{
-public:
- friend class Pen;
-
- // Constructors
-
- HatchBrush(IN HatchStyle hatchStyle,
- IN const Color& foreColor,
- IN const Color& backColor = Color())
- {
- GpHatch *brush = NULL;
-
- lastResult = DllExports::GdipCreateHatchBrush(hatchStyle,
- foreColor.GetValue(),
- backColor.GetValue(),
- &brush);
- SetNativeBrush(brush);
- }
-
- HatchStyle GetHatchStyle() const
- {
- HatchStyle hatchStyle;
-
- SetStatus(DllExports::GdipGetHatchStyle((GpHatch*)nativeBrush,
- &hatchStyle));
-
- return hatchStyle;
- }
-
- Status GetForegroundColor(OUT Color* color) const
- {
- ARGB argb;
-
- if (color == NULL)
- {
- return SetStatus(InvalidParameter);
- }
-
- Status status = SetStatus(DllExports::GdipGetHatchForegroundColor(
- (GpHatch*)nativeBrush,
- &argb));
-
- color->SetValue(argb);
-
- return status;
- }
-
- Status GetBackgroundColor(OUT Color *color) const
- {
- ARGB argb;
-
- if (color == NULL)
- {
- return SetStatus(InvalidParameter);
- }
-
- Status status = SetStatus(DllExports::GdipGetHatchBackgroundColor(
- (GpHatch*)nativeBrush,
- &argb));
-
- color->SetValue(argb);
-
- return status;
- }
-
-#ifdef DCR_USE_NEW_250932
-
-private:
- HatchBrush(const HatchBrush &);
- HatchBrush& operator=(const HatchBrush &);
-
-#endif
-
-protected:
-
- HatchBrush()
- {
- }
-};
-
-#endif
+/**************************************************************************\
+*
+* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
+*
+* Module Name:
+*
+* GdiplusBrush.h
+*
+* Abstract:
+*
+* Brush API related declarations
+*
+\**************************************************************************/
+
+#ifndef _GDIPLUSBRUSH_H
+#define _GDIPLUSBRUSH_H
+
+//--------------------------------------------------------------------------
+// Abstract base class for various brush types
+//--------------------------------------------------------------------------
+
+class GraphicsPath;
+
+class Brush : public GdiplusBase
+{
+public:
+ friend class Pen;
+ friend class Graphics;
+
+ virtual ~Brush()
+ {
+ DllExports::GdipDeleteBrush(nativeBrush);
+ }
+
+ virtual Brush* Clone() const
+ {
+ GpBrush *brush = NULL;
+
+ SetStatus(DllExports::GdipCloneBrush(nativeBrush, &brush));
+
+ Brush *newBrush = new Brush(brush, lastResult);
+
+ if (newBrush == NULL)
+ {
+ DllExports::GdipDeleteBrush(brush);
+ }
+
+ return newBrush;
+ }
+
+ BrushType GetType() const
+ {
+ BrushType type = static_cast<BrushType>(-1);
+
+ SetStatus(DllExports::GdipGetBrushType(nativeBrush, &type));
+
+ return type;
+ }
+
+ Status GetLastStatus() const
+ {
+ Status lastStatus = lastResult;
+ lastResult = Ok;
+
+ return lastStatus;
+ }
+
+protected:
+
+ Brush()
+ {
+ SetStatus(NotImplemented);
+ }
+
+#ifdef DCR_USE_NEW_250932
+
+private:
+ Brush(const Brush& brush);
+ Brush& operator=(const Brush& brush);
+protected:
+
+#else
+
+ Brush(const Brush& brush)
+ {
+ brush;
+ SetStatus(NotImplemented);
+ }
+
+ Brush& operator=(const Brush& brush)
+ {
+ brush;
+ SetStatus(NotImplemented);
+ return *this;
+ }
+
+#endif
+
+ Brush(GpBrush* nativeBrush, Status status)
+ {
+ lastResult = status;
+ SetNativeBrush(nativeBrush);
+ }
+
+ VOID SetNativeBrush(GpBrush* nativeBrush)
+ {
+ this->nativeBrush = nativeBrush;
+ }
+
+ Status SetStatus(Status status) const
+ {
+ if (status != Ok)
+ return (lastResult = status);
+ else
+ return status;
+ }
+
+ GpBrush* nativeBrush;
+ mutable Status lastResult;
+};
+
+//--------------------------------------------------------------------------
+// Represent solid fill brush object
+//--------------------------------------------------------------------------
+
+class SolidBrush : public Brush
+{
+public:
+ friend class Pen;
+
+ SolidBrush(IN const Color& color)
+ {
+ GpSolidFill *brush = NULL;
+
+ lastResult = DllExports::GdipCreateSolidFill(color.GetValue(), &brush);
+
+ SetNativeBrush(brush);
+ }
+
+ Status GetColor(OUT Color* color) const
+ {
+ ARGB argb;
+
+ if (color == NULL)
+ {
+ return SetStatus(InvalidParameter);
+ }
+
+ SetStatus(DllExports::GdipGetSolidFillColor((GpSolidFill*)nativeBrush,
+ &argb));
+
+ *color = Color(argb);
+
+ return lastResult;
+ }
+
+ Status SetColor(IN const Color& color)
+ {
+ return SetStatus(DllExports::GdipSetSolidFillColor((GpSolidFill*)nativeBrush,
+ color.GetValue()));
+ }
+
+#ifdef DCR_USE_NEW_250932
+
+private:
+ SolidBrush(const SolidBrush &);
+ SolidBrush& operator=(const SolidBrush &);
+
+#endif
+
+protected:
+
+ SolidBrush()
+ {
+ }
+};
+
+class TextureBrush : public Brush
+{
+public:
+ friend class Pen;
+
+ TextureBrush(IN Image* image,
+ IN WrapMode wrapMode = WrapModeTile)
+ {
+ GpTexture *texture = NULL;
+
+ lastResult = DllExports::GdipCreateTexture(
+ image->nativeImage,
+ wrapMode, &texture);
+
+ SetNativeBrush(texture);
+ }
+
+ // When creating a texture brush from a metafile image, the dstRect
+ // is used to specify the size that the metafile image should be
+ // rendered at in the device units of the destination graphics.
+ // It is NOT used to crop the metafile image, so only the width
+ // and height values matter for metafiles.
+ TextureBrush(IN Image* image,
+ IN WrapMode wrapMode,
+ IN const RectF &dstRect)
+ {
+ GpTexture *texture = NULL;
+
+ lastResult = DllExports::GdipCreateTexture2(
+ image->nativeImage,
+ wrapMode,
+ dstRect.X,
+ dstRect.Y,
+ dstRect.Width,
+ dstRect.Height,
+ &texture);
+
+ SetNativeBrush(texture);
+ }
+
+ // When creating a texture brush from a metafile image, the dstRect
+ // is used to specify the size that the metafile image should be
+ // rendered at in the device units of the destination graphics.
+ // It is NOT used to crop the metafile image, so only the width
+ // and height values matter for metafiles.
+
+ TextureBrush(IN Image *image,
+ IN const RectF &dstRect,
+ IN const ImageAttributes *imageAttributes = NULL)
+ {
+ GpTexture *texture = NULL;
+
+ lastResult = DllExports::GdipCreateTextureIA(
+ image->nativeImage,
+ (imageAttributes)?imageAttributes->nativeImageAttr:NULL,
+ dstRect.X,
+ dstRect.Y,
+ dstRect.Width,
+ dstRect.Height,
+ &texture
+ );
+
+ SetNativeBrush(texture);
+ }
+
+ #ifdef DCR_USE_NEW_145138
+ TextureBrush(IN Image *image,
+ IN const Rect &dstRect,
+ IN const ImageAttributes *imageAttributes = NULL)
+ {
+ GpTexture *texture = NULL;
+
+ lastResult = DllExports::GdipCreateTextureIAI(
+ image->nativeImage,
+ (imageAttributes)?imageAttributes->nativeImageAttr:NULL,
+ dstRect.X,
+ dstRect.Y,
+ dstRect.Width,
+ dstRect.Height,
+ &texture
+ );
+
+ SetNativeBrush(texture);
+ }
+ #endif
+
+ // When creating a texture brush from a metafile image, the dstRect
+ // is used to specify the size that the metafile image should be
+ // rendered at in the device units of the destination graphics.
+ // It is NOT used to crop the metafile image, so only the width
+ // and height values matter for metafiles.
+
+ TextureBrush(
+ IN Image* image,
+ IN WrapMode wrapMode,
+
+ #ifdef DCR_USE_NEW_145138
+ const IN Rect &dstRect
+ #else
+ IN Rect &dstRect
+ #endif
+ )
+ {
+ GpTexture *texture = NULL;
+
+ lastResult = DllExports::GdipCreateTexture2I(
+ image->nativeImage,
+ wrapMode,
+ dstRect.X,
+ dstRect.Y,
+ dstRect.Width,
+ dstRect.Height,
+ &texture);
+
+ SetNativeBrush(texture);
+ }
+
+ // When creating a texture brush from a metafile image, the dstRect
+ // is used to specify the size that the metafile image should be
+ // rendered at in the device units of the destination graphics.
+ // It is NOT used to crop the metafile image, so only the width
+ // and height values matter for metafiles.
+ TextureBrush(IN Image* image,
+ IN WrapMode wrapMode,
+ IN REAL dstX,
+ IN REAL dstY,
+ IN REAL dstWidth,
+ IN REAL dstHeight)
+ {
+ GpTexture *texture = NULL;
+
+ lastResult = DllExports::GdipCreateTexture2(
+ image->nativeImage,
+ wrapMode,
+ dstX,
+ dstY,
+ dstWidth,
+ dstHeight,
+ &texture);
+
+ SetNativeBrush(texture);
+ }
+
+ // When creating a texture brush from a metafile image, the dstRect
+ // is used to specify the size that the metafile image should be
+ // rendered at in the device units of the destination graphics.
+ // It is NOT used to crop the metafile image, so only the width
+ // and height values matter for metafiles.
+ TextureBrush(IN Image* image,
+ IN WrapMode wrapMode,
+ IN INT dstX,
+ IN INT dstY,
+ IN INT dstWidth,
+ IN INT dstHeight)
+ {
+ GpTexture *texture = NULL;
+
+ lastResult = DllExports::GdipCreateTexture2I(
+ image->nativeImage,
+ wrapMode,
+ dstX,
+ dstY,
+ dstWidth,
+ dstHeight,
+ &texture);
+
+ SetNativeBrush(texture);
+ }
+
+ /**
+ * Set/get brush transform
+ */
+ Status SetTransform(IN const Matrix* matrix)
+ {
+ return SetStatus(DllExports::GdipSetTextureTransform((GpTexture*)nativeBrush,
+ matrix->nativeMatrix));
+ }
+
+ Status GetTransform(OUT Matrix* matrix) const
+ {
+ return SetStatus(DllExports::GdipGetTextureTransform((GpTexture*)nativeBrush,
+ matrix->nativeMatrix));
+ }
+
+ Status ResetTransform()
+ {
+ return SetStatus(DllExports::GdipResetTextureTransform((GpTexture*)nativeBrush));
+ }
+
+ Status MultiplyTransform(IN const Matrix* matrix,
+ IN MatrixOrder order = MatrixOrderPrepend)
+ {
+ return SetStatus(DllExports::GdipMultiplyTextureTransform((GpTexture*)nativeBrush,
+ matrix->nativeMatrix,
+ order));
+ }
+
+ Status TranslateTransform(IN REAL dx,
+ IN REAL dy,
+ IN MatrixOrder order = MatrixOrderPrepend)
+ {
+ return SetStatus(DllExports::GdipTranslateTextureTransform((GpTexture*)nativeBrush,
+ dx, dy, order));
+ }
+
+ Status ScaleTransform(IN REAL sx,
+ IN REAL sy,
+ IN MatrixOrder order = MatrixOrderPrepend)
+ {
+ return SetStatus(DllExports::GdipScaleTextureTransform((GpTexture*)nativeBrush,
+ sx, sy, order));
+ }
+
+ Status RotateTransform(IN REAL angle,
+ IN MatrixOrder order = MatrixOrderPrepend)
+ {
+ return SetStatus(DllExports::GdipRotateTextureTransform((GpTexture*)nativeBrush,
+ angle, order));
+ }
+
+ /**
+ * Set/get brush wrapping mode
+ */
+ Status SetWrapMode(IN WrapMode wrapMode)
+ {
+ return SetStatus(DllExports::GdipSetTextureWrapMode((GpTexture*)nativeBrush,
+ wrapMode));
+ }
+
+ WrapMode GetWrapMode() const
+ {
+ WrapMode wrapMode;
+
+ SetStatus(DllExports::GdipGetTextureWrapMode((GpTexture*)nativeBrush,
+ &wrapMode));
+ return wrapMode;
+ }
+
+ // Get texture brush attributes
+
+ Image *GetImage() const
+ {
+ GpImage *image;
+
+ SetStatus(DllExports::GdipGetTextureImage((GpTexture *)nativeBrush,
+ &image));
+
+ Image *retimage = new Image(image, lastResult);
+
+ if (retimage == NULL)
+ {
+ DllExports::GdipDisposeImage(image);
+ }
+
+ return retimage;
+ }
+
+#ifdef DCR_USE_NEW_250932
+
+private:
+ TextureBrush(const TextureBrush &);
+ TextureBrush& operator=(const TextureBrush &);
+
+#endif
+
+protected:
+
+ TextureBrush()
+ {
+ }
+};
+
+//--------------------------------------------------------------------------
+// Represent line gradient brush object
+//--------------------------------------------------------------------------
+
+class LinearGradientBrush : public Brush
+{
+public:
+ friend class Pen;
+
+ LinearGradientBrush(IN const PointF& point1,
+ IN const PointF& point2,
+ IN const Color& color1,
+ IN const Color& color2)
+ {
+ GpLineGradient *brush = NULL;
+
+ lastResult = DllExports::GdipCreateLineBrush(&point1,
+ &point2,
+ color1.GetValue(),
+ color2.GetValue(),
+ WrapModeTile,
+ &brush);
+
+ SetNativeBrush(brush);
+ }
+
+ LinearGradientBrush(IN const Point& point1,
+ IN const Point& point2,
+ IN const Color& color1,
+ IN const Color& color2)
+ {
+ GpLineGradient *brush = NULL;
+
+ lastResult = DllExports::GdipCreateLineBrushI(&point1,
+ &point2,
+ color1.GetValue(),
+ color2.GetValue(),
+ WrapModeTile,
+ &brush);
+
+ SetNativeBrush(brush);
+ }
+
+ LinearGradientBrush(IN const RectF& rect,
+ IN const Color& color1,
+ IN const Color& color2,
+ IN LinearGradientMode mode)
+ {
+ GpLineGradient *brush = NULL;
+
+ lastResult = DllExports::GdipCreateLineBrushFromRect(&rect,
+ color1.GetValue(),
+ color2.GetValue(),
+ mode,
+ WrapModeTile,
+ &brush);
+
+ SetNativeBrush(brush);
+ }
+
+ LinearGradientBrush(IN const Rect& rect,
+ IN const Color& color1,
+ IN const Color& color2,
+ IN LinearGradientMode mode)
+ {
+ GpLineGradient *brush = NULL;
+
+ lastResult = DllExports::GdipCreateLineBrushFromRectI(&rect,
+ color1.GetValue(),
+ color2.GetValue(),
+ mode,
+ WrapModeTile,
+ &brush);
+
+ SetNativeBrush(brush);
+ }
+
+ LinearGradientBrush(IN const RectF& rect,
+ IN const Color& color1,
+ IN const Color& color2,
+ IN REAL angle,
+ IN BOOL isAngleScalable = FALSE)
+ {
+ GpLineGradient *brush = NULL;
+
+ lastResult = DllExports::GdipCreateLineBrushFromRectWithAngle(&rect,
+ color1.GetValue(),
+ color2.GetValue(),
+ angle,
+ isAngleScalable,
+ WrapModeTile,
+ &brush);
+
+ SetNativeBrush(brush);
+ }
+
+ LinearGradientBrush(IN const Rect& rect,
+ IN const Color& color1,
+ IN const Color& color2,
+ IN REAL angle,
+ IN BOOL isAngleScalable = FALSE)
+ {
+ GpLineGradient *brush = NULL;
+
+ lastResult = DllExports::GdipCreateLineBrushFromRectWithAngleI(&rect,
+ color1.GetValue(),
+ color2.GetValue(),
+ angle,
+ isAngleScalable,
+ WrapModeTile,
+ &brush);
+
+ SetNativeBrush(brush);
+ }
+
+ // Get/set point attributes
+
+ Status SetLinearPoints(IN const PointF& point1,
+ IN const PointF& point2)
+ {
+ return SetStatus(DllExports::GdipSetLinePoints((GpLineGradient*)nativeBrush,
+ &point1, &point2));
+ }
+
+ Status GetLinearPoints(OUT PointF* points) const
+ {
+ return SetStatus(DllExports::GdipGetLinePoints((GpLineGradient*) nativeBrush,
+ points));
+ }
+
+ Status SetLinearPoints(IN const Point& point1,
+ IN const Point& point2)
+ {
+ return SetStatus(DllExports::GdipSetLinePointsI((GpLineGradient*)nativeBrush,
+ &point1, &point2));
+ }
+
+ Status GetLinearPoints(OUT Point* points) const
+ {
+ return SetStatus(DllExports::GdipGetLinePointsI((GpLineGradient*) nativeBrush,
+ points));
+ }
+ // Get/set color attributes
+
+ Status SetLinearColors(IN const Color& color1,
+ IN const Color& color2)
+ {
+ return SetStatus(DllExports::GdipSetLineColors((GpLineGradient*)nativeBrush,
+ color1.GetValue(),
+ color2.GetValue()));
+ }
+
+ Status GetLinearColors(OUT Color* colors) const
+ {
+ ARGB argb[2];
+
+ if (colors == NULL)
+ {
+ return SetStatus(InvalidParameter);
+ }
+
+ SetStatus(DllExports::GdipGetLineColors((GpLineGradient*) nativeBrush, argb));
+
+ if (lastResult == Ok)
+ {
+ // use bitwise copy operator for Color copy
+ colors[0] = Color(argb[0]);
+ colors[1] = Color(argb[1]);
+ }
+
+ return lastResult;
+ }
+
+ Status GetRectangle(OUT RectF* rect) const
+ {
+ return SetStatus(DllExports::GdipGetLineRect((GpLineGradient*)nativeBrush, rect));
+ }
+
+ // integer version
+ Status GetRectangle(OUT Rect* rect) const
+ {
+ return SetStatus(DllExports::GdipGetLineRectI((GpLineGradient*)nativeBrush, rect));
+ }
+
+ // Gamma correction in interporlation.
+
+ Status SetGammaCorrection(IN BOOL useGammaCorrection)
+ {
+ return SetStatus(DllExports::GdipSetLineGammaCorrection((GpLineGradient*)nativeBrush,
+ useGammaCorrection));
+ }
+
+ BOOL GetGammaCorrection() const
+ {
+ BOOL useGammaCorrection;
+
+ SetStatus(DllExports::GdipGetLineGammaCorrection((GpLineGradient*)nativeBrush,
+ &useGammaCorrection));
+
+ return useGammaCorrection;
+ }
+
+ INT GetBlendCount() const
+ {
+ INT count = 0;
+
+ SetStatus(DllExports::GdipGetLineBlendCount((GpLineGradient*)
+ nativeBrush,
+ &count));
+
+ return count;
+ }
+
+ Status SetBlend(IN const REAL* blendFactors,
+ IN const REAL* blendPositions,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipSetLineBlend((GpLineGradient*)
+ nativeBrush,
+ blendFactors,
+ blendPositions,
+ count));
+ }
+
+ Status GetBlend(OUT REAL* blendFactors,
+ OUT REAL* blendPositions,
+ IN INT count) const
+ {
+ return SetStatus(DllExports::GdipGetLineBlend((GpLineGradient*)nativeBrush,
+ blendFactors,
+ blendPositions,
+ count));
+ }
+
+ INT GetInterpolationColorCount() const
+ {
+ INT count = 0;
+
+ SetStatus(DllExports::GdipGetLinePresetBlendCount((GpLineGradient*)
+ nativeBrush,
+ &count));
+
+ return count;
+ }
+
+ Status SetInterpolationColors(IN const Color* presetColors,
+ IN const REAL* blendPositions,
+ IN INT count)
+ {
+ if ((count <= 0) || !presetColors)
+ return SetStatus(InvalidParameter);
+
+ ARGB *argbs = (ARGB*) new BYTE[count*sizeof(ARGB)];
+
+ if (argbs)
+ {
+ for (INT i = 0; i < count; i++)
+ {
+ argbs[i] = presetColors[i].GetValue();
+ }
+
+ Status status = SetStatus(DllExports::GdipSetLinePresetBlend(
+ (GpLineGradient*) nativeBrush,
+ argbs,
+ blendPositions,
+ count));
+ delete [] argbs;
+ return status;
+ }
+ else
+ {
+ return SetStatus(OutOfMemory);
+ }
+ }
+
+ Status GetInterpolationColors(OUT Color* presetColors,
+ OUT REAL* blendPositions,
+ IN INT count) const
+ {
+ if ((count <= 0) || !presetColors)
+ return SetStatus(InvalidParameter);
+
+ ARGB* argbs = (ARGB*) new BYTE[count*sizeof(ARGB)];
+
+ if (!argbs)
+ {
+ return SetStatus(OutOfMemory);
+ }
+
+ Status status = SetStatus(DllExports::GdipGetLinePresetBlend((GpLineGradient*)nativeBrush,
+ argbs,
+ blendPositions,
+ count));
+ if (status == Ok)
+ {
+ for (INT i = 0; i < count; i++)
+ {
+ presetColors[i] = Color(argbs[i]);
+ }
+ }
+
+ delete [] argbs;
+
+ return status;
+ }
+
+ Status SetBlendBellShape(IN REAL focus,
+ IN REAL scale = 1.0)
+ {
+ return SetStatus(DllExports::GdipSetLineSigmaBlend((GpLineGradient*)nativeBrush, focus, scale));
+ }
+
+ #ifdef DCR_USE_NEW_145135
+ Status SetBlendTriangularShape(
+ IN REAL focus,
+ IN REAL scale = 1.0
+ )
+ #else
+ Status SetBlendTrianglarShape(IN REAL focus,
+ IN REAL scale = 1.0)
+ #endif
+ {
+ return SetStatus(DllExports::GdipSetLineLinearBlend((GpLineGradient*)nativeBrush, focus, scale));
+ }
+
+ /**
+ * Set/get brush transform
+ */
+ Status SetTransform(IN const Matrix* matrix)
+ {
+ return SetStatus(DllExports::GdipSetLineTransform((GpLineGradient*)nativeBrush,
+ matrix->nativeMatrix));
+ }
+
+ Status GetTransform(OUT Matrix *matrix) const
+ {
+ return SetStatus(DllExports::GdipGetLineTransform((GpLineGradient*)nativeBrush,
+ matrix->nativeMatrix));
+ }
+
+ Status ResetTransform()
+ {
+ return SetStatus(DllExports::GdipResetLineTransform((GpLineGradient*)nativeBrush));
+ }
+
+ Status MultiplyTransform(IN const Matrix* matrix,
+ IN MatrixOrder order = MatrixOrderPrepend)
+ {
+ return SetStatus(DllExports::GdipMultiplyLineTransform((GpLineGradient*)nativeBrush,
+ matrix->nativeMatrix,
+ order));
+ }
+
+ Status TranslateTransform(IN REAL dx,
+ IN REAL dy,
+ IN MatrixOrder order = MatrixOrderPrepend)
+ {
+ return SetStatus(DllExports::GdipTranslateLineTransform((GpLineGradient*)nativeBrush,
+ dx, dy, order));
+ }
+
+ Status ScaleTransform(IN REAL sx,
+ IN REAL sy,
+ IN MatrixOrder order = MatrixOrderPrepend)
+ {
+ return SetStatus(DllExports::GdipScaleLineTransform((GpLineGradient*)nativeBrush,
+ sx, sy, order));
+ }
+
+ Status RotateTransform(IN REAL angle,
+ IN MatrixOrder order = MatrixOrderPrepend)
+ {
+ return SetStatus(DllExports::GdipRotateLineTransform((GpLineGradient*)nativeBrush,
+ angle, order));
+ }
+
+ /**
+ * Set/get brush wrapping mode
+ */
+ Status SetWrapMode(IN WrapMode wrapMode)
+ {
+ return SetStatus(DllExports::GdipSetLineWrapMode((GpLineGradient*)nativeBrush,
+ wrapMode));
+ }
+
+ WrapMode GetWrapMode() const
+ {
+ WrapMode wrapMode;
+
+ SetStatus(DllExports::GdipGetLineWrapMode((GpLineGradient*)
+ nativeBrush,
+ &wrapMode));
+
+ return wrapMode;
+ }
+
+#ifdef DCR_USE_NEW_250932
+
+private:
+ LinearGradientBrush(const LinearGradientBrush &);
+ LinearGradientBrush& operator=(const LinearGradientBrush &);
+
+#endif
+
+protected:
+
+ LinearGradientBrush()
+ {
+ }
+};
+
+//--------------------------------------------------------------------------
+// PathGradientBrush object is defined
+// in gdipluspath.h.
+//--------------------------------------------------------------------------
+
+//--------------------------------------------------------------------------
+// Represent hatch brush object
+//--------------------------------------------------------------------------
+
+class HatchBrush : public Brush
+{
+public:
+ friend class Pen;
+
+ // Constructors
+
+ HatchBrush(IN HatchStyle hatchStyle,
+ IN const Color& foreColor,
+ IN const Color& backColor = Color())
+ {
+ GpHatch *brush = NULL;
+
+ lastResult = DllExports::GdipCreateHatchBrush(hatchStyle,
+ foreColor.GetValue(),
+ backColor.GetValue(),
+ &brush);
+ SetNativeBrush(brush);
+ }
+
+ HatchStyle GetHatchStyle() const
+ {
+ HatchStyle hatchStyle;
+
+ SetStatus(DllExports::GdipGetHatchStyle((GpHatch*)nativeBrush,
+ &hatchStyle));
+
+ return hatchStyle;
+ }
+
+ Status GetForegroundColor(OUT Color* color) const
+ {
+ ARGB argb;
+
+ if (color == NULL)
+ {
+ return SetStatus(InvalidParameter);
+ }
+
+ Status status = SetStatus(DllExports::GdipGetHatchForegroundColor(
+ (GpHatch*)nativeBrush,
+ &argb));
+
+ color->SetValue(argb);
+
+ return status;
+ }
+
+ Status GetBackgroundColor(OUT Color *color) const
+ {
+ ARGB argb;
+
+ if (color == NULL)
+ {
+ return SetStatus(InvalidParameter);
+ }
+
+ Status status = SetStatus(DllExports::GdipGetHatchBackgroundColor(
+ (GpHatch*)nativeBrush,
+ &argb));
+
+ color->SetValue(argb);
+
+ return status;
+ }
+
+#ifdef DCR_USE_NEW_250932
+
+private:
+ HatchBrush(const HatchBrush &);
+ HatchBrush& operator=(const HatchBrush &);
+
+#endif
+
+protected:
+
+ HatchBrush()
+ {
+ }
+};
+
+#endif
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusCachedBitmap.h b/core/src/fxge/Microsoft SDK/include/GdiPlusCachedBitmap.h
index 28fd8caea6..3bafebeb40 100644
--- a/core/src/fxge/Microsoft SDK/include/GdiPlusCachedBitmap.h
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusCachedBitmap.h
@@ -1,71 +1,71 @@
-/**************************************************************************
-*
-* Copyright (c) 2000 Microsoft Corporation
-*
-* Module Name:
-*
-* CachedBitmap class definition
-*
-* Abstract:
-*
-* CachedBitmap is a representation of an accelerated drawing
-* that has restrictions on what operations are allowed in order
-* to accelerate the drawing to the destination.
-*
-**************************************************************************/
-
-#ifndef _GDIPLUSCACHEDBITMAP_H
-#define _GDIPLUSCACHEDBITMAP_H
-
-/**************************************************************************
-*
-* Class Name:
-*
-* CachedBitmap
-*
-* Abstract:
-*
-* An object to store a bitmap prepared for rendering on a particular
-* Graphics object. The memory storage for the CachedBitmap is opaque
-* to the other Engine code, so the only operations supported are
-* initializing the data (with a bitmap) and using the graphics to
-* draw it on the screen with an integer offset.
-*
-* Look for the class definition in GdiplusHeaders.h
-*
-* Created:
-*
-* 04/23/2000 asecchia
-* Created it.
-*
-**************************************************************************/
-inline
-CachedBitmap::CachedBitmap(
- IN Bitmap *bitmap,
- IN Graphics *graphics)
-{
- nativeCachedBitmap = NULL;
-
- lastResult = DllExports::GdipCreateCachedBitmap(
- (GpBitmap *)bitmap->nativeImage,
- graphics->nativeGraphics,
- &nativeCachedBitmap
- );
-}
-
-inline
-CachedBitmap::~CachedBitmap()
-{
- DllExports::GdipDeleteCachedBitmap(nativeCachedBitmap);
-}
-
-inline Status
-CachedBitmap::GetLastStatus() const
-{
- Status lastStatus = lastResult;
- lastResult = Ok;
- return (lastStatus);
-}
-
-#endif
-
+/**************************************************************************
+*
+* Copyright (c) 2000 Microsoft Corporation
+*
+* Module Name:
+*
+* CachedBitmap class definition
+*
+* Abstract:
+*
+* CachedBitmap is a representation of an accelerated drawing
+* that has restrictions on what operations are allowed in order
+* to accelerate the drawing to the destination.
+*
+**************************************************************************/
+
+#ifndef _GDIPLUSCACHEDBITMAP_H
+#define _GDIPLUSCACHEDBITMAP_H
+
+/**************************************************************************
+*
+* Class Name:
+*
+* CachedBitmap
+*
+* Abstract:
+*
+* An object to store a bitmap prepared for rendering on a particular
+* Graphics object. The memory storage for the CachedBitmap is opaque
+* to the other Engine code, so the only operations supported are
+* initializing the data (with a bitmap) and using the graphics to
+* draw it on the screen with an integer offset.
+*
+* Look for the class definition in GdiplusHeaders.h
+*
+* Created:
+*
+* 04/23/2000 asecchia
+* Created it.
+*
+**************************************************************************/
+inline
+CachedBitmap::CachedBitmap(
+ IN Bitmap *bitmap,
+ IN Graphics *graphics)
+{
+ nativeCachedBitmap = NULL;
+
+ lastResult = DllExports::GdipCreateCachedBitmap(
+ (GpBitmap *)bitmap->nativeImage,
+ graphics->nativeGraphics,
+ &nativeCachedBitmap
+ );
+}
+
+inline
+CachedBitmap::~CachedBitmap()
+{
+ DllExports::GdipDeleteCachedBitmap(nativeCachedBitmap);
+}
+
+inline Status
+CachedBitmap::GetLastStatus() const
+{
+ Status lastStatus = lastResult;
+ lastResult = Ok;
+ return (lastStatus);
+}
+
+#endif
+
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusColor.h b/core/src/fxge/Microsoft SDK/include/GdiPlusColor.h
index 72c21c295f..7ec10f8434 100644
--- a/core/src/fxge/Microsoft SDK/include/GdiPlusColor.h
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusColor.h
@@ -1,209 +1,209 @@
-/**************************************************************************\
-*
-* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
-*
-* Module Name:
-*
-* GdiplusColor.h
-*
-* Abstract:
-*
-* Represents a GDI+ color.
-*
-\**************************************************************************/
-
-#ifndef _GDIPLUSCOLOR_H
-#define _GDIPLUSCOLOR_H
-
-//----------------------------------------------------------------------------
-// Color mode
-//----------------------------------------------------------------------------
-
-enum ColorMode
-{
- ColorModeARGB32 = 0,
- ColorModeARGB64 = 1
-};
-
-//----------------------------------------------------------------------------
-// Color Channel flags
-//----------------------------------------------------------------------------
-
-enum ColorChannelFlags
-{
- ColorChannelFlagsC = 0,
- ColorChannelFlagsM,
- ColorChannelFlagsY,
- ColorChannelFlagsK,
- ColorChannelFlagsLast
-};
-
-//----------------------------------------------------------------------------
-// Color
-//----------------------------------------------------------------------------
-
-class Color
-{
-public:
-
- Color()
- {
- Argb = (ARGB)Color::Black;
- }
-
- // Construct an opaque Color object with
- // the specified R, G, B values.
-
- Color(IN BYTE r,
- IN BYTE g,
- IN BYTE b)
- {
- Argb = MakeARGB(255, r, g, b);
- }
-
- // Construct a Color object with
- // the specified A, R, G, B values.
- //
- // NOTE: R, G, B color values are not premultiplied.
-
- Color(IN BYTE a,
- IN BYTE r,
- IN BYTE g,
- IN BYTE b)
- {
- Argb = MakeARGB(a, r, g, b);
- }
-
- // Construct a Color object with
- // the specified ARGB values.
- //
- // NOTE: R, G, B color components are not premultiplied.
-
- Color(IN ARGB argb)
- {
- Argb = argb;
- }
-
- // Extract A, R, G, B components
-
- BYTE GetAlpha() const
- {
- return (BYTE) (Argb >> AlphaShift);
- }
-
- BYTE GetA() const
- {
- return GetAlpha();
- }
-
- BYTE GetRed() const
- {
- return (BYTE) (Argb >> RedShift);
- }
-
- BYTE GetR() const
- {
- return GetRed();
- }
-
- BYTE GetGreen() const
- {
- return (BYTE) (Argb >> GreenShift);
- }
-
- BYTE GetG() const
- {
- return GetGreen();
- }
-
- BYTE GetBlue() const
- {
- return (BYTE) (Argb >> BlueShift);
- }
-
- BYTE GetB() const
- {
- return GetBlue();
- }
-
- // Retrieve ARGB values
-
- ARGB GetValue() const
- {
- return Argb;
- }
-
- VOID SetValue(IN ARGB argb)
- {
- Argb = argb;
- }
-
- VOID SetFromCOLORREF(IN COLORREF rgb)
- {
- Argb = MakeARGB(255, GetRValue(rgb), GetGValue(rgb), GetBValue(rgb));
- }
-
- COLORREF ToCOLORREF() const
- {
- return RGB(GetRed(), GetGreen(), GetBlue());
- }
-
-public:
-
- // Standard color constants
- enum
- {
- Black = 0xff000000,
- Silver = 0xffc0c0c0,
- Gray = 0xff808080,
- White = 0xffffffff,
- Maroon = 0xff800000,
- Red = 0xffff0000,
- Purple = 0xff800080,
- Fuchsia = 0xffff00ff,
- Green = 0xff008000,
- Lime = 0xff00ff00,
- Olive = 0xff808000,
- Yellow = 0xffffff00,
- Navy = 0xff000080,
- Blue = 0xff0000ff,
- Teal = 0xff008080,
- Aqua = 0xff00ffff
- };
-
- // Shift count and bit mask for A, R, G, B components
- enum
- {
- AlphaShift = 24,
- RedShift = 16,
- GreenShift = 8,
- BlueShift = 0
- };
-
- enum
- {
- AlphaMask = 0xff000000,
- RedMask = 0x00ff0000,
- GreenMask = 0x0000ff00,
- BlueMask = 0x000000ff
- };
-
- // Assemble A, R, G, B values into a 32-bit integer
- static ARGB MakeARGB(IN BYTE a,
- IN BYTE r,
- IN BYTE g,
- IN BYTE b)
- {
- return (((ARGB) (b) << BlueShift) |
- ((ARGB) (g) << GreenShift) |
- ((ARGB) (r) << RedShift) |
- ((ARGB) (a) << AlphaShift));
- }
-
-protected:
-
- ARGB Argb;
-};
-
-#endif
-
+/**************************************************************************\
+*
+* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
+*
+* Module Name:
+*
+* GdiplusColor.h
+*
+* Abstract:
+*
+* Represents a GDI+ color.
+*
+\**************************************************************************/
+
+#ifndef _GDIPLUSCOLOR_H
+#define _GDIPLUSCOLOR_H
+
+//----------------------------------------------------------------------------
+// Color mode
+//----------------------------------------------------------------------------
+
+enum ColorMode
+{
+ ColorModeARGB32 = 0,
+ ColorModeARGB64 = 1
+};
+
+//----------------------------------------------------------------------------
+// Color Channel flags
+//----------------------------------------------------------------------------
+
+enum ColorChannelFlags
+{
+ ColorChannelFlagsC = 0,
+ ColorChannelFlagsM,
+ ColorChannelFlagsY,
+ ColorChannelFlagsK,
+ ColorChannelFlagsLast
+};
+
+//----------------------------------------------------------------------------
+// Color
+//----------------------------------------------------------------------------
+
+class Color
+{
+public:
+
+ Color()
+ {
+ Argb = (ARGB)Color::Black;
+ }
+
+ // Construct an opaque Color object with
+ // the specified R, G, B values.
+
+ Color(IN BYTE r,
+ IN BYTE g,
+ IN BYTE b)
+ {
+ Argb = MakeARGB(255, r, g, b);
+ }
+
+ // Construct a Color object with
+ // the specified A, R, G, B values.
+ //
+ // NOTE: R, G, B color values are not premultiplied.
+
+ Color(IN BYTE a,
+ IN BYTE r,
+ IN BYTE g,
+ IN BYTE b)
+ {
+ Argb = MakeARGB(a, r, g, b);
+ }
+
+ // Construct a Color object with
+ // the specified ARGB values.
+ //
+ // NOTE: R, G, B color components are not premultiplied.
+
+ Color(IN ARGB argb)
+ {
+ Argb = argb;
+ }
+
+ // Extract A, R, G, B components
+
+ BYTE GetAlpha() const
+ {
+ return (BYTE) (Argb >> AlphaShift);
+ }
+
+ BYTE GetA() const
+ {
+ return GetAlpha();
+ }
+
+ BYTE GetRed() const
+ {
+ return (BYTE) (Argb >> RedShift);
+ }
+
+ BYTE GetR() const
+ {
+ return GetRed();
+ }
+
+ BYTE GetGreen() const
+ {
+ return (BYTE) (Argb >> GreenShift);
+ }
+
+ BYTE GetG() const
+ {
+ return GetGreen();
+ }
+
+ BYTE GetBlue() const
+ {
+ return (BYTE) (Argb >> BlueShift);
+ }
+
+ BYTE GetB() const
+ {
+ return GetBlue();
+ }
+
+ // Retrieve ARGB values
+
+ ARGB GetValue() const
+ {
+ return Argb;
+ }
+
+ VOID SetValue(IN ARGB argb)
+ {
+ Argb = argb;
+ }
+
+ VOID SetFromCOLORREF(IN COLORREF rgb)
+ {
+ Argb = MakeARGB(255, GetRValue(rgb), GetGValue(rgb), GetBValue(rgb));
+ }
+
+ COLORREF ToCOLORREF() const
+ {
+ return RGB(GetRed(), GetGreen(), GetBlue());
+ }
+
+public:
+
+ // Standard color constants
+ enum
+ {
+ Black = 0xff000000,
+ Silver = 0xffc0c0c0,
+ Gray = 0xff808080,
+ White = 0xffffffff,
+ Maroon = 0xff800000,
+ Red = 0xffff0000,
+ Purple = 0xff800080,
+ Fuchsia = 0xffff00ff,
+ Green = 0xff008000,
+ Lime = 0xff00ff00,
+ Olive = 0xff808000,
+ Yellow = 0xffffff00,
+ Navy = 0xff000080,
+ Blue = 0xff0000ff,
+ Teal = 0xff008080,
+ Aqua = 0xff00ffff
+ };
+
+ // Shift count and bit mask for A, R, G, B components
+ enum
+ {
+ AlphaShift = 24,
+ RedShift = 16,
+ GreenShift = 8,
+ BlueShift = 0
+ };
+
+ enum
+ {
+ AlphaMask = 0xff000000,
+ RedMask = 0x00ff0000,
+ GreenMask = 0x0000ff00,
+ BlueMask = 0x000000ff
+ };
+
+ // Assemble A, R, G, B values into a 32-bit integer
+ static ARGB MakeARGB(IN BYTE a,
+ IN BYTE r,
+ IN BYTE g,
+ IN BYTE b)
+ {
+ return (((ARGB) (b) << BlueShift) |
+ ((ARGB) (g) << GreenShift) |
+ ((ARGB) (r) << RedShift) |
+ ((ARGB) (a) << AlphaShift));
+ }
+
+protected:
+
+ ARGB Argb;
+};
+
+#endif
+
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusColorMatrix.h b/core/src/fxge/Microsoft SDK/include/GdiPlusColorMatrix.h
index d1d9ebc534..ec4d14b191 100644
--- a/core/src/fxge/Microsoft SDK/include/GdiPlusColorMatrix.h
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusColorMatrix.h
@@ -1,63 +1,63 @@
-/**************************************************************************\
-*
-* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
-*
-* Module Name:
-*
-* GdiplusColorMatrix.h
-*
-* Abstract:
-*
-* Class for color adjustment object passed to Graphics.DrawImage
-*
-\**************************************************************************/
-
-#ifndef _GDIPLUSCOLORMATRIX_H
-#define _GDIPLUSCOLORMATRIX_H
-
-//----------------------------------------------------------------------------
-// Color matrix
-//----------------------------------------------------------------------------
-
-struct ColorMatrix
-{
- REAL m[5][5];
-};
-
-//----------------------------------------------------------------------------
-// Color Matrix flags
-//----------------------------------------------------------------------------
-
-enum ColorMatrixFlags
-{
- ColorMatrixFlagsDefault = 0,
- ColorMatrixFlagsSkipGrays = 1,
- ColorMatrixFlagsAltGray = 2
-};
-
-//----------------------------------------------------------------------------
-// Color Adjust Type
-//----------------------------------------------------------------------------
-
-enum ColorAdjustType
-{
- ColorAdjustTypeDefault,
- ColorAdjustTypeBitmap,
- ColorAdjustTypeBrush,
- ColorAdjustTypePen,
- ColorAdjustTypeText,
- ColorAdjustTypeCount, // must be immediately after all the individual ones
- ColorAdjustTypeAny // internal use: for querying if any type has recoloring
-};
-
-//----------------------------------------------------------------------------
-// Color Map
-//----------------------------------------------------------------------------
-
-struct ColorMap
-{
- Color oldColor;
- Color newColor;
-};
-
-#endif
+/**************************************************************************\
+*
+* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
+*
+* Module Name:
+*
+* GdiplusColorMatrix.h
+*
+* Abstract:
+*
+* Class for color adjustment object passed to Graphics.DrawImage
+*
+\**************************************************************************/
+
+#ifndef _GDIPLUSCOLORMATRIX_H
+#define _GDIPLUSCOLORMATRIX_H
+
+//----------------------------------------------------------------------------
+// Color matrix
+//----------------------------------------------------------------------------
+
+struct ColorMatrix
+{
+ REAL m[5][5];
+};
+
+//----------------------------------------------------------------------------
+// Color Matrix flags
+//----------------------------------------------------------------------------
+
+enum ColorMatrixFlags
+{
+ ColorMatrixFlagsDefault = 0,
+ ColorMatrixFlagsSkipGrays = 1,
+ ColorMatrixFlagsAltGray = 2
+};
+
+//----------------------------------------------------------------------------
+// Color Adjust Type
+//----------------------------------------------------------------------------
+
+enum ColorAdjustType
+{
+ ColorAdjustTypeDefault,
+ ColorAdjustTypeBitmap,
+ ColorAdjustTypeBrush,
+ ColorAdjustTypePen,
+ ColorAdjustTypeText,
+ ColorAdjustTypeCount, // must be immediately after all the individual ones
+ ColorAdjustTypeAny // internal use: for querying if any type has recoloring
+};
+
+//----------------------------------------------------------------------------
+// Color Map
+//----------------------------------------------------------------------------
+
+struct ColorMap
+{
+ Color oldColor;
+ Color newColor;
+};
+
+#endif
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusEnums.h b/core/src/fxge/Microsoft SDK/include/GdiPlusEnums.h
index 92a29c7463..9962ff586a 100644
--- a/core/src/fxge/Microsoft SDK/include/GdiPlusEnums.h
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusEnums.h
@@ -1,1252 +1,1252 @@
-/**************************************************************************\
-*
-* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
-*
-* Module Name:
-*
-* GdiplusEnums.h
-*
-* Abstract:
-*
-* Various enumeration types
-*
-\**************************************************************************/
-
-#ifndef _GDIPLUSENUMS_H
-#define _GDIPLUSENUMS_H
-
-
-//--------------------------------------------------------------------------
-// Default bezier flattening tolerance in device pixels.
-//--------------------------------------------------------------------------
-
-const float FlatnessDefault = 1.0f/4.0f;
-
-//--------------------------------------------------------------------------
-// Graphics and Container State cookies
-//--------------------------------------------------------------------------
-
-typedef UINT GraphicsState;
-typedef UINT GraphicsContainer;
-
-//--------------------------------------------------------------------------
-// Fill mode constants
-//--------------------------------------------------------------------------
-
-enum FillMode
-{
- FillModeAlternate, // 0
- FillModeWinding // 1
-};
-
-//--------------------------------------------------------------------------
-// Quality mode constants
-//--------------------------------------------------------------------------
-
-enum QualityMode
-{
- QualityModeInvalid = -1,
- QualityModeDefault = 0,
- QualityModeLow = 1, // for apps that need the best performance
- QualityModeHigh = 2 // for apps that need the best rendering quality
-};
-
-//--------------------------------------------------------------------------
-// Alpha compositing mode constants
-//--------------------------------------------------------------------------
-
-enum CompositingMode
-{
- CompositingModeSourceOver, // 0
- CompositingModeSourceCopy // 1
-};
-
-//--------------------------------------------------------------------------
-// Alpha compositing quality constants
-//--------------------------------------------------------------------------
-
-enum CompositingQuality
-{
- CompositingQualityInvalid = QualityModeInvalid,
- CompositingQualityDefault = QualityModeDefault,
- CompositingQualityHighSpeed = QualityModeLow,
- CompositingQualityHighQuality = QualityModeHigh,
- CompositingQualityGammaCorrected,
- CompositingQualityAssumeLinear
-};
-
-//--------------------------------------------------------------------------
-// Unit constants
-//--------------------------------------------------------------------------
-
-enum Unit
-{
- UnitWorld, // 0 -- World coordinate (non-physical unit)
- UnitDisplay, // 1 -- Variable -- for PageTransform only
- UnitPixel, // 2 -- Each unit is one device pixel.
- UnitPoint, // 3 -- Each unit is a printer's point, or 1/72 inch.
- UnitInch, // 4 -- Each unit is 1 inch.
- UnitDocument, // 5 -- Each unit is 1/300 inch.
- UnitMillimeter // 6 -- Each unit is 1 millimeter.
-};
-
-//--------------------------------------------------------------------------
-// MetafileFrameUnit
-//
-// The frameRect for creating a metafile can be specified in any of these
-// units. There is an extra frame unit value (MetafileFrameUnitGdi) so
-// that units can be supplied in the same units that GDI expects for
-// frame rects -- these units are in .01 (1/100ths) millimeter units
-// as defined by GDI.
-//--------------------------------------------------------------------------
-enum MetafileFrameUnit
-{
- MetafileFrameUnitPixel = UnitPixel,
- MetafileFrameUnitPoint = UnitPoint,
- MetafileFrameUnitInch = UnitInch,
- MetafileFrameUnitDocument = UnitDocument,
- MetafileFrameUnitMillimeter = UnitMillimeter,
- MetafileFrameUnitGdi // GDI compatible .01 MM units
-};
-
-//--------------------------------------------------------------------------
-// Coordinate space identifiers
-//--------------------------------------------------------------------------
-
-enum CoordinateSpace
-{
- CoordinateSpaceWorld, // 0
- CoordinateSpacePage, // 1
- CoordinateSpaceDevice // 2
-};
-
-//--------------------------------------------------------------------------
-// Various wrap modes for brushes
-//--------------------------------------------------------------------------
-
-enum WrapMode
-{
- WrapModeTile, // 0
- WrapModeTileFlipX, // 1
- WrapModeTileFlipY, // 2
- WrapModeTileFlipXY, // 3
- WrapModeClamp // 4
-};
-
-//--------------------------------------------------------------------------
-// Various hatch styles
-//--------------------------------------------------------------------------
-
-enum HatchStyle
-{
- HatchStyleHorizontal, // 0
- HatchStyleVertical, // 1
- HatchStyleForwardDiagonal, // 2
- HatchStyleBackwardDiagonal, // 3
- HatchStyleCross, // 4
- HatchStyleDiagonalCross, // 5
- HatchStyle05Percent, // 6
- HatchStyle10Percent, // 7
- HatchStyle20Percent, // 8
- HatchStyle25Percent, // 9
- HatchStyle30Percent, // 10
- HatchStyle40Percent, // 11
- HatchStyle50Percent, // 12
- HatchStyle60Percent, // 13
- HatchStyle70Percent, // 14
- HatchStyle75Percent, // 15
- HatchStyle80Percent, // 16
- HatchStyle90Percent, // 17
- HatchStyleLightDownwardDiagonal, // 18
- HatchStyleLightUpwardDiagonal, // 19
- HatchStyleDarkDownwardDiagonal, // 20
- HatchStyleDarkUpwardDiagonal, // 21
- HatchStyleWideDownwardDiagonal, // 22
- HatchStyleWideUpwardDiagonal, // 23
- HatchStyleLightVertical, // 24
- HatchStyleLightHorizontal, // 25
- HatchStyleNarrowVertical, // 26
- HatchStyleNarrowHorizontal, // 27
- HatchStyleDarkVertical, // 28
- HatchStyleDarkHorizontal, // 29
- HatchStyleDashedDownwardDiagonal, // 30
- HatchStyleDashedUpwardDiagonal, // 31
- HatchStyleDashedHorizontal, // 32
- HatchStyleDashedVertical, // 33
- HatchStyleSmallConfetti, // 34
- HatchStyleLargeConfetti, // 35
- HatchStyleZigZag, // 36
- HatchStyleWave, // 37
- HatchStyleDiagonalBrick, // 38
- HatchStyleHorizontalBrick, // 39
- HatchStyleWeave, // 40
- HatchStylePlaid, // 41
- HatchStyleDivot, // 42
- HatchStyleDottedGrid, // 43
- HatchStyleDottedDiamond, // 44
- HatchStyleShingle, // 45
- HatchStyleTrellis, // 46
- HatchStyleSphere, // 47
- HatchStyleSmallGrid, // 48
- HatchStyleSmallCheckerBoard, // 49
- HatchStyleLargeCheckerBoard, // 50
- HatchStyleOutlinedDiamond, // 51
- HatchStyleSolidDiamond, // 52
-
- HatchStyleTotal, // must be after all unique hatch styles
-
- HatchStyleLargeGrid = HatchStyleCross, // 4 an alias for the cross style
-
- HatchStyleMin = HatchStyleHorizontal,
- HatchStyleMax = HatchStyleTotal - 1,
-};
-
-//--------------------------------------------------------------------------
-// Dash style constants
-//--------------------------------------------------------------------------
-
-enum DashStyle
-{
- DashStyleSolid, // 0
- DashStyleDash, // 1
- DashStyleDot, // 2
- DashStyleDashDot, // 3
- DashStyleDashDotDot, // 4
- DashStyleCustom // 5
-};
-
-//--------------------------------------------------------------------------
-// Dash cap constants
-//--------------------------------------------------------------------------
-
-enum DashCap
-{
- DashCapFlat = 0,
- DashCapRound = 2,
- DashCapTriangle = 3
-};
-
-//--------------------------------------------------------------------------
-// Line cap constants (only the lowest 8 bits are used).
-//--------------------------------------------------------------------------
-
-enum LineCap
-{
- LineCapFlat = 0,
- LineCapSquare = 1,
- LineCapRound = 2,
- LineCapTriangle = 3,
-
- LineCapNoAnchor = 0x10, // corresponds to flat cap
- LineCapSquareAnchor = 0x11, // corresponds to square cap
- LineCapRoundAnchor = 0x12, // corresponds to round cap
- LineCapDiamondAnchor = 0x13, // corresponds to triangle cap
- LineCapArrowAnchor = 0x14, // no correspondence
-
- LineCapCustom = 0xff, // custom cap
-
- LineCapAnchorMask = 0xf0 // mask to check for anchor or not.
-};
-
-//--------------------------------------------------------------------------
-// Custom Line cap type constants
-//--------------------------------------------------------------------------
-
-enum CustomLineCapType
-{
- CustomLineCapTypeDefault = 0,
- CustomLineCapTypeAdjustableArrow = 1
-};
-
-//--------------------------------------------------------------------------
-// Line join constants
-//--------------------------------------------------------------------------
-
-enum LineJoin
-{
- LineJoinMiter = 0,
- LineJoinBevel = 1,
- LineJoinRound = 2,
- LineJoinMiterClipped = 3
-};
-
-//--------------------------------------------------------------------------
-// Path point types (only the lowest 8 bits are used.)
-// The lowest 3 bits are interpreted as point type
-// The higher 5 bits are reserved for flags.
-//--------------------------------------------------------------------------
-
-enum PathPointType
-{
- PathPointTypeStart = 0, // move
- PathPointTypeLine = 1, // line
- PathPointTypeBezier = 3, // default Beizer (= cubic Bezier)
- PathPointTypePathTypeMask = 0x07, // type mask (lowest 3 bits).
- PathPointTypeDashMode = 0x10, // currently in dash mode.
- PathPointTypePathMarker = 0x20, // a marker for the path.
- PathPointTypeCloseSubpath = 0x80, // closed flag
-
- // Path types used for advanced path.
-
- PathPointTypeBezier2 = 2, // quadratic Beizer
- PathPointTypeBezier3 = 3, // cubic Bezier
- PathPointTypeBezier4 = 4, // quartic (4th order) Beizer
- PathPointTypeBezier5 = 5, // quintic (5th order) Bezier
- PathPointTypeBezier6 = 6 // hexaic (6th order) Bezier
-};
-
-
-//--------------------------------------------------------------------------
-// WarpMode constants
-//--------------------------------------------------------------------------
-
-enum WarpMode
-{
- WarpModePerspective, // 0
- WarpModeBilinear // 1
-};
-
-//--------------------------------------------------------------------------
-// LineGradient Mode
-//--------------------------------------------------------------------------
-
-enum LinearGradientMode
-{
- LinearGradientModeHorizontal, // 0
- LinearGradientModeVertical, // 1
- LinearGradientModeForwardDiagonal, // 2
- LinearGradientModeBackwardDiagonal // 3
-};
-
-//--------------------------------------------------------------------------
-// Region Comine Modes
-//--------------------------------------------------------------------------
-
-enum CombineMode
-{
- CombineModeReplace, // 0
- CombineModeIntersect, // 1
- CombineModeUnion, // 2
- CombineModeXor, // 3
- CombineModeExclude, // 4
- CombineModeComplement // 5 (does exclude from)
-};
-
-//--------------------------------------------------------------------------
- // Image types
-//--------------------------------------------------------------------------
-
-enum ImageType
-{
- ImageTypeUnknown, // 0
- ImageTypeBitmap, // 1
- ImageTypeMetafile // 2
-};
-
-//--------------------------------------------------------------------------
-// Interpolation modes
-//--------------------------------------------------------------------------
-
-enum InterpolationMode
-{
- InterpolationModeInvalid = QualityModeInvalid,
- InterpolationModeDefault = QualityModeDefault,
- InterpolationModeLowQuality = QualityModeLow,
- InterpolationModeHighQuality = QualityModeHigh,
- InterpolationModeBilinear,
- InterpolationModeBicubic,
- InterpolationModeNearestNeighbor,
- InterpolationModeHighQualityBilinear,
- InterpolationModeHighQualityBicubic
-};
-
-//--------------------------------------------------------------------------
-// Pen types
-//--------------------------------------------------------------------------
-enum PenAlignment
-{
- PenAlignmentCenter = 0,
- PenAlignmentInset = 1,
- PenAlignmentOutset = 2,
- PenAlignmentLeft = 3,
- PenAlignmentRight = 4
-};
-
-//--------------------------------------------------------------------------
-// Brush types
-//--------------------------------------------------------------------------
-
-enum BrushType
-{
- BrushTypeSolidColor = 0,
- BrushTypeHatchFill = 1,
- BrushTypeTextureFill = 2,
- BrushTypePathGradient = 3,
- BrushTypeLinearGradient = 4
-};
-
-//--------------------------------------------------------------------------
-// Pen's Fill types
-//--------------------------------------------------------------------------
-
-enum PenType
-{
- PenTypeSolidColor = BrushTypeSolidColor,
- PenTypeHatchFill = BrushTypeHatchFill,
- PenTypeTextureFill = BrushTypeTextureFill,
- PenTypePathGradient = BrushTypePathGradient,
- PenTypeLinearGradient = BrushTypeLinearGradient,
- PenTypeUnknown = -1
-};
-
-//--------------------------------------------------------------------------
-// Matrix Order
-//--------------------------------------------------------------------------
-
-enum MatrixOrder
-{
- MatrixOrderPrepend = 0,
- MatrixOrderAppend = 1
-};
-
-//--------------------------------------------------------------------------
-// Generic font families
-//--------------------------------------------------------------------------
-
-enum GenericFontFamily
-{
- GenericFontFamilySerif,
- GenericFontFamilySansSerif,
- GenericFontFamilyMonospace
-
-};
-
-//--------------------------------------------------------------------------
-// FontStyle: face types and common styles
-//--------------------------------------------------------------------------
-
-// These should probably be flags
-
-// Must have:
-// Regular = 0
-// Bold = 1
-// Italic = 2
-// BoldItalic = 3
-
-enum FontStyle
-{
- FontStyleRegular = 0,
- FontStyleBold = 1,
- FontStyleItalic = 2,
- FontStyleBoldItalic = 3,
- FontStyleUnderline = 4,
- FontStyleStrikeout = 8
-};
-
-//---------------------------------------------------------------------------
-// Smoothing Mode
-//---------------------------------------------------------------------------
-
-enum SmoothingMode
-{
- SmoothingModeInvalid = QualityModeInvalid,
- SmoothingModeDefault = QualityModeDefault,
- SmoothingModeHighSpeed = QualityModeLow,
- SmoothingModeHighQuality = QualityModeHigh,
- SmoothingModeNone,
- SmoothingModeAntiAlias
-};
-
-//---------------------------------------------------------------------------
-// Pixel Format Mode
-//---------------------------------------------------------------------------
-
-enum PixelOffsetMode
-{
- PixelOffsetModeInvalid = QualityModeInvalid,
- PixelOffsetModeDefault = QualityModeDefault,
- PixelOffsetModeHighSpeed = QualityModeLow,
- PixelOffsetModeHighQuality = QualityModeHigh,
- PixelOffsetModeNone, // no pixel offset
- PixelOffsetModeHalf // offset by -0.5, -0.5 for fast anti-alias perf
-};
-
-//---------------------------------------------------------------------------
-// Text Rendering Hint
-//---------------------------------------------------------------------------
-
-enum TextRenderingHint
-{
-#ifdef DCR_USE_NEW_186764
- TextRenderingHintSystemDefault = 0, // Glyph with system default rendering hint
- TextRenderingHintSingleBitPerPixelGridFit, // Glyph bitmap with hinting
-#else
- TextRenderingHintSingleBitPerPixelGridFit = 0, // Glyph bitmap with hinting
-#endif // DCR_USE_NEW_186764
- TextRenderingHintSingleBitPerPixel, // Glyph bitmap without hinting
- TextRenderingHintAntiAliasGridFit, // Glyph anti-alias bitmap with hinting
- TextRenderingHintAntiAlias, // Glyph anti-alias bitmap without hinting
- TextRenderingHintClearTypeGridFit // Glyph CT bitmap with hinting
-};
-
-//---------------------------------------------------------------------------
-// Metafile Types
-//---------------------------------------------------------------------------
-enum MetafileType
-{
- MetafileTypeInvalid, // Invalid metafile
- MetafileTypeWmf, // Standard WMF
- MetafileTypeWmfAldus, // Aldus Placeable Metafile format
- MetafileTypeEmf, // EMF (not EMF+)
- MetafileTypeEmfPlusOnly, // EMF+ without dual, down-level records
- MetafileTypeEmfPlusDual // EMF+ with dual, down-level records
-};
-
-// Specifies the type of EMF to record
-enum EmfType
-{
- EmfTypeEmfOnly = MetafileTypeEmf, // no EMF+, only EMF
- EmfTypeEmfPlusOnly = MetafileTypeEmfPlusOnly, // no EMF, only EMF+
- EmfTypeEmfPlusDual = MetafileTypeEmfPlusDual // both EMF+ and EMF
-};
-
-// All persistent objects must have a type listed here
-enum ObjectType
-{
- ObjectTypeInvalid,
- ObjectTypeBrush,
- ObjectTypePen,
- ObjectTypePath,
- ObjectTypeRegion,
- ObjectTypeImage,
- ObjectTypeFont,
- ObjectTypeStringFormat,
- ObjectTypeImageAttributes,
- ObjectTypeCustomLineCap,
-
- ObjectTypeMax = ObjectTypeCustomLineCap,
- ObjectTypeMin = ObjectTypeBrush
-};
-
-inline BOOL
-ObjectTypeIsValid(
- ObjectType type
- )
-{
- return ((type >= ObjectTypeMin) && (type <= ObjectTypeMax));
-}
-
-//---------------------------------------------------------------------------
-// EMF+ Records
-//---------------------------------------------------------------------------
-
-// We have to change the WMF record numbers so that they don't conflict with
-// the EMF and EMF+ record numbers.
-enum EmfPlusRecordType;
-#define GDIP_EMFPLUS_RECORD_BASE 0x00004000
-#define GDIP_WMF_RECORD_BASE 0x00010000
-#define GDIP_WMF_RECORD_TO_EMFPLUS(n) ((EmfPlusRecordType)((n) | GDIP_WMF_RECORD_BASE))
-#define GDIP_EMFPLUS_RECORD_TO_WMF(n) ((n) & (~GDIP_WMF_RECORD_BASE))
-#define GDIP_IS_WMF_RECORDTYPE(n) (((n) & GDIP_WMF_RECORD_BASE) != 0)
-
-enum EmfPlusRecordType
-{
- // Since we have to enumerate GDI records right along with GDI+ records,
- // we list all the GDI records here so that they can be part of the
- // same enumeration type which is used in the enumeration callback.
-
- WmfRecordTypeSetBkColor = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETBKCOLOR),
- WmfRecordTypeSetBkMode = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETBKMODE),
- WmfRecordTypeSetMapMode = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETMAPMODE),
- WmfRecordTypeSetROP2 = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETROP2),
- WmfRecordTypeSetRelAbs = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETRELABS),
- WmfRecordTypeSetPolyFillMode = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETPOLYFILLMODE),
- WmfRecordTypeSetStretchBltMode = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETSTRETCHBLTMODE),
- WmfRecordTypeSetTextCharExtra = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETTEXTCHAREXTRA),
- WmfRecordTypeSetTextColor = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETTEXTCOLOR),
- WmfRecordTypeSetTextJustification = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETTEXTJUSTIFICATION),
- WmfRecordTypeSetWindowOrg = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETWINDOWORG),
- WmfRecordTypeSetWindowExt = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETWINDOWEXT),
- WmfRecordTypeSetViewportOrg = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETVIEWPORTORG),
- WmfRecordTypeSetViewportExt = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETVIEWPORTEXT),
- WmfRecordTypeOffsetWindowOrg = GDIP_WMF_RECORD_TO_EMFPLUS(META_OFFSETWINDOWORG),
- WmfRecordTypeScaleWindowExt = GDIP_WMF_RECORD_TO_EMFPLUS(META_SCALEWINDOWEXT),
- WmfRecordTypeOffsetViewportOrg = GDIP_WMF_RECORD_TO_EMFPLUS(META_OFFSETVIEWPORTORG),
- WmfRecordTypeScaleViewportExt = GDIP_WMF_RECORD_TO_EMFPLUS(META_SCALEVIEWPORTEXT),
- WmfRecordTypeLineTo = GDIP_WMF_RECORD_TO_EMFPLUS(META_LINETO),
- WmfRecordTypeMoveTo = GDIP_WMF_RECORD_TO_EMFPLUS(META_MOVETO),
- WmfRecordTypeExcludeClipRect = GDIP_WMF_RECORD_TO_EMFPLUS(META_EXCLUDECLIPRECT),
- WmfRecordTypeIntersectClipRect = GDIP_WMF_RECORD_TO_EMFPLUS(META_INTERSECTCLIPRECT),
- WmfRecordTypeArc = GDIP_WMF_RECORD_TO_EMFPLUS(META_ARC),
- WmfRecordTypeEllipse = GDIP_WMF_RECORD_TO_EMFPLUS(META_ELLIPSE),
- WmfRecordTypeFloodFill = GDIP_WMF_RECORD_TO_EMFPLUS(META_FLOODFILL),
- WmfRecordTypePie = GDIP_WMF_RECORD_TO_EMFPLUS(META_PIE),
- WmfRecordTypeRectangle = GDIP_WMF_RECORD_TO_EMFPLUS(META_RECTANGLE),
- WmfRecordTypeRoundRect = GDIP_WMF_RECORD_TO_EMFPLUS(META_ROUNDRECT),
- WmfRecordTypePatBlt = GDIP_WMF_RECORD_TO_EMFPLUS(META_PATBLT),
- WmfRecordTypeSaveDC = GDIP_WMF_RECORD_TO_EMFPLUS(META_SAVEDC),
- WmfRecordTypeSetPixel = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETPIXEL),
- WmfRecordTypeOffsetClipRgn = GDIP_WMF_RECORD_TO_EMFPLUS(META_OFFSETCLIPRGN),
- WmfRecordTypeTextOut = GDIP_WMF_RECORD_TO_EMFPLUS(META_TEXTOUT),
- WmfRecordTypeBitBlt = GDIP_WMF_RECORD_TO_EMFPLUS(META_BITBLT),
- WmfRecordTypeStretchBlt = GDIP_WMF_RECORD_TO_EMFPLUS(META_STRETCHBLT),
- WmfRecordTypePolygon = GDIP_WMF_RECORD_TO_EMFPLUS(META_POLYGON),
- WmfRecordTypePolyline = GDIP_WMF_RECORD_TO_EMFPLUS(META_POLYLINE),
- WmfRecordTypeEscape = GDIP_WMF_RECORD_TO_EMFPLUS(META_ESCAPE),
- WmfRecordTypeRestoreDC = GDIP_WMF_RECORD_TO_EMFPLUS(META_RESTOREDC),
- WmfRecordTypeFillRegion = GDIP_WMF_RECORD_TO_EMFPLUS(META_FILLREGION),
- WmfRecordTypeFrameRegion = GDIP_WMF_RECORD_TO_EMFPLUS(META_FRAMEREGION),
- WmfRecordTypeInvertRegion = GDIP_WMF_RECORD_TO_EMFPLUS(META_INVERTREGION),
- WmfRecordTypePaintRegion = GDIP_WMF_RECORD_TO_EMFPLUS(META_PAINTREGION),
- WmfRecordTypeSelectClipRegion = GDIP_WMF_RECORD_TO_EMFPLUS(META_SELECTCLIPREGION),
- WmfRecordTypeSelectObject = GDIP_WMF_RECORD_TO_EMFPLUS(META_SELECTOBJECT),
- WmfRecordTypeSetTextAlign = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETTEXTALIGN),
- WmfRecordTypeDrawText = GDIP_WMF_RECORD_TO_EMFPLUS(0x062F), // META_DRAWTEXT
- WmfRecordTypeChord = GDIP_WMF_RECORD_TO_EMFPLUS(META_CHORD),
- WmfRecordTypeSetMapperFlags = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETMAPPERFLAGS),
- WmfRecordTypeExtTextOut = GDIP_WMF_RECORD_TO_EMFPLUS(META_EXTTEXTOUT),
- WmfRecordTypeSetDIBToDev = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETDIBTODEV),
- WmfRecordTypeSelectPalette = GDIP_WMF_RECORD_TO_EMFPLUS(META_SELECTPALETTE),
- WmfRecordTypeRealizePalette = GDIP_WMF_RECORD_TO_EMFPLUS(META_REALIZEPALETTE),
- WmfRecordTypeAnimatePalette = GDIP_WMF_RECORD_TO_EMFPLUS(META_ANIMATEPALETTE),
- WmfRecordTypeSetPalEntries = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETPALENTRIES),
- WmfRecordTypePolyPolygon = GDIP_WMF_RECORD_TO_EMFPLUS(META_POLYPOLYGON),
- WmfRecordTypeResizePalette = GDIP_WMF_RECORD_TO_EMFPLUS(META_RESIZEPALETTE),
- WmfRecordTypeDIBBitBlt = GDIP_WMF_RECORD_TO_EMFPLUS(META_DIBBITBLT),
- WmfRecordTypeDIBStretchBlt = GDIP_WMF_RECORD_TO_EMFPLUS(META_DIBSTRETCHBLT),
- WmfRecordTypeDIBCreatePatternBrush = GDIP_WMF_RECORD_TO_EMFPLUS(META_DIBCREATEPATTERNBRUSH),
- WmfRecordTypeStretchDIB = GDIP_WMF_RECORD_TO_EMFPLUS(META_STRETCHDIB),
- WmfRecordTypeExtFloodFill = GDIP_WMF_RECORD_TO_EMFPLUS(META_EXTFLOODFILL),
- WmfRecordTypeSetLayout = GDIP_WMF_RECORD_TO_EMFPLUS(0x0149), // META_SETLAYOUT
- WmfRecordTypeResetDC = GDIP_WMF_RECORD_TO_EMFPLUS(0x014C), // META_RESETDC
- WmfRecordTypeStartDoc = GDIP_WMF_RECORD_TO_EMFPLUS(0x014D), // META_STARTDOC
- WmfRecordTypeStartPage = GDIP_WMF_RECORD_TO_EMFPLUS(0x004F), // META_STARTPAGE
- WmfRecordTypeEndPage = GDIP_WMF_RECORD_TO_EMFPLUS(0x0050), // META_ENDPAGE
- WmfRecordTypeAbortDoc = GDIP_WMF_RECORD_TO_EMFPLUS(0x0052), // META_ABORTDOC
- WmfRecordTypeEndDoc = GDIP_WMF_RECORD_TO_EMFPLUS(0x005E), // META_ENDDOC
- WmfRecordTypeDeleteObject = GDIP_WMF_RECORD_TO_EMFPLUS(META_DELETEOBJECT),
- WmfRecordTypeCreatePalette = GDIP_WMF_RECORD_TO_EMFPLUS(META_CREATEPALETTE),
- WmfRecordTypeCreateBrush = GDIP_WMF_RECORD_TO_EMFPLUS(0x00F8), // META_CREATEBRUSH
- WmfRecordTypeCreatePatternBrush = GDIP_WMF_RECORD_TO_EMFPLUS(META_CREATEPATTERNBRUSH),
- WmfRecordTypeCreatePenIndirect = GDIP_WMF_RECORD_TO_EMFPLUS(META_CREATEPENINDIRECT),
- WmfRecordTypeCreateFontIndirect = GDIP_WMF_RECORD_TO_EMFPLUS(META_CREATEFONTINDIRECT),
- WmfRecordTypeCreateBrushIndirect = GDIP_WMF_RECORD_TO_EMFPLUS(META_CREATEBRUSHINDIRECT),
- WmfRecordTypeCreateBitmapIndirect = GDIP_WMF_RECORD_TO_EMFPLUS(0x02FD), // META_CREATEBITMAPINDIRECT
- WmfRecordTypeCreateBitmap = GDIP_WMF_RECORD_TO_EMFPLUS(0x06FE), // META_CREATEBITMAP
- WmfRecordTypeCreateRegion = GDIP_WMF_RECORD_TO_EMFPLUS(META_CREATEREGION),
-
- EmfRecordTypeHeader = EMR_HEADER,
- EmfRecordTypePolyBezier = EMR_POLYBEZIER,
- EmfRecordTypePolygon = EMR_POLYGON,
- EmfRecordTypePolyline = EMR_POLYLINE,
- EmfRecordTypePolyBezierTo = EMR_POLYBEZIERTO,
- EmfRecordTypePolyLineTo = EMR_POLYLINETO,
- EmfRecordTypePolyPolyline = EMR_POLYPOLYLINE,
- EmfRecordTypePolyPolygon = EMR_POLYPOLYGON,
- EmfRecordTypeSetWindowExtEx = EMR_SETWINDOWEXTEX,
- EmfRecordTypeSetWindowOrgEx = EMR_SETWINDOWORGEX,
- EmfRecordTypeSetViewportExtEx = EMR_SETVIEWPORTEXTEX,
- EmfRecordTypeSetViewportOrgEx = EMR_SETVIEWPORTORGEX,
- EmfRecordTypeSetBrushOrgEx = EMR_SETBRUSHORGEX,
- EmfRecordTypeEOF = EMR_EOF,
- EmfRecordTypeSetPixelV = EMR_SETPIXELV,
- EmfRecordTypeSetMapperFlags = EMR_SETMAPPERFLAGS,
- EmfRecordTypeSetMapMode = EMR_SETMAPMODE,
- EmfRecordTypeSetBkMode = EMR_SETBKMODE,
- EmfRecordTypeSetPolyFillMode = EMR_SETPOLYFILLMODE,
- EmfRecordTypeSetROP2 = EMR_SETROP2,
- EmfRecordTypeSetStretchBltMode = EMR_SETSTRETCHBLTMODE,
- EmfRecordTypeSetTextAlign = EMR_SETTEXTALIGN,
- EmfRecordTypeSetColorAdjustment = EMR_SETCOLORADJUSTMENT,
- EmfRecordTypeSetTextColor = EMR_SETTEXTCOLOR,
- EmfRecordTypeSetBkColor = EMR_SETBKCOLOR,
- EmfRecordTypeOffsetClipRgn = EMR_OFFSETCLIPRGN,
- EmfRecordTypeMoveToEx = EMR_MOVETOEX,
- EmfRecordTypeSetMetaRgn = EMR_SETMETARGN,
- EmfRecordTypeExcludeClipRect = EMR_EXCLUDECLIPRECT,
- EmfRecordTypeIntersectClipRect = EMR_INTERSECTCLIPRECT,
- EmfRecordTypeScaleViewportExtEx = EMR_SCALEVIEWPORTEXTEX,
- EmfRecordTypeScaleWindowExtEx = EMR_SCALEWINDOWEXTEX,
- EmfRecordTypeSaveDC = EMR_SAVEDC,
- EmfRecordTypeRestoreDC = EMR_RESTOREDC,
- EmfRecordTypeSetWorldTransform = EMR_SETWORLDTRANSFORM,
- EmfRecordTypeModifyWorldTransform = EMR_MODIFYWORLDTRANSFORM,
- EmfRecordTypeSelectObject = EMR_SELECTOBJECT,
- EmfRecordTypeCreatePen = EMR_CREATEPEN,
- EmfRecordTypeCreateBrushIndirect = EMR_CREATEBRUSHINDIRECT,
- EmfRecordTypeDeleteObject = EMR_DELETEOBJECT,
- EmfRecordTypeAngleArc = EMR_ANGLEARC,
- EmfRecordTypeEllipse = EMR_ELLIPSE,
- EmfRecordTypeRectangle = EMR_RECTANGLE,
- EmfRecordTypeRoundRect = EMR_ROUNDRECT,
- EmfRecordTypeArc = EMR_ARC,
- EmfRecordTypeChord = EMR_CHORD,
- EmfRecordTypePie = EMR_PIE,
- EmfRecordTypeSelectPalette = EMR_SELECTPALETTE,
- EmfRecordTypeCreatePalette = EMR_CREATEPALETTE,
- EmfRecordTypeSetPaletteEntries = EMR_SETPALETTEENTRIES,
- EmfRecordTypeResizePalette = EMR_RESIZEPALETTE,
- EmfRecordTypeRealizePalette = EMR_REALIZEPALETTE,
- EmfRecordTypeExtFloodFill = EMR_EXTFLOODFILL,
- EmfRecordTypeLineTo = EMR_LINETO,
- EmfRecordTypeArcTo = EMR_ARCTO,
- EmfRecordTypePolyDraw = EMR_POLYDRAW,
- EmfRecordTypeSetArcDirection = EMR_SETARCDIRECTION,
- EmfRecordTypeSetMiterLimit = EMR_SETMITERLIMIT,
- EmfRecordTypeBeginPath = EMR_BEGINPATH,
- EmfRecordTypeEndPath = EMR_ENDPATH,
- EmfRecordTypeCloseFigure = EMR_CLOSEFIGURE,
- EmfRecordTypeFillPath = EMR_FILLPATH,
- EmfRecordTypeStrokeAndFillPath = EMR_STROKEANDFILLPATH,
- EmfRecordTypeStrokePath = EMR_STROKEPATH,
- EmfRecordTypeFlattenPath = EMR_FLATTENPATH,
- EmfRecordTypeWidenPath = EMR_WIDENPATH,
- EmfRecordTypeSelectClipPath = EMR_SELECTCLIPPATH,
- EmfRecordTypeAbortPath = EMR_ABORTPATH,
- EmfRecordTypeReserved_069 = 69, // Not Used
- EmfRecordTypeGdiComment = EMR_GDICOMMENT,
- EmfRecordTypeFillRgn = EMR_FILLRGN,
- EmfRecordTypeFrameRgn = EMR_FRAMERGN,
- EmfRecordTypeInvertRgn = EMR_INVERTRGN,
- EmfRecordTypePaintRgn = EMR_PAINTRGN,
- EmfRecordTypeExtSelectClipRgn = EMR_EXTSELECTCLIPRGN,
- EmfRecordTypeBitBlt = EMR_BITBLT,
- EmfRecordTypeStretchBlt = EMR_STRETCHBLT,
- EmfRecordTypeMaskBlt = EMR_MASKBLT,
- EmfRecordTypePlgBlt = EMR_PLGBLT,
- EmfRecordTypeSetDIBitsToDevice = EMR_SETDIBITSTODEVICE,
- EmfRecordTypeStretchDIBits = EMR_STRETCHDIBITS,
- EmfRecordTypeExtCreateFontIndirect = EMR_EXTCREATEFONTINDIRECTW,
- EmfRecordTypeExtTextOutA = EMR_EXTTEXTOUTA,
- EmfRecordTypeExtTextOutW = EMR_EXTTEXTOUTW,
- EmfRecordTypePolyBezier16 = EMR_POLYBEZIER16,
- EmfRecordTypePolygon16 = EMR_POLYGON16,
- EmfRecordTypePolyline16 = EMR_POLYLINE16,
- EmfRecordTypePolyBezierTo16 = EMR_POLYBEZIERTO16,
- EmfRecordTypePolylineTo16 = EMR_POLYLINETO16,
- EmfRecordTypePolyPolyline16 = EMR_POLYPOLYLINE16,
- EmfRecordTypePolyPolygon16 = EMR_POLYPOLYGON16,
- EmfRecordTypePolyDraw16 = EMR_POLYDRAW16,
- EmfRecordTypeCreateMonoBrush = EMR_CREATEMONOBRUSH,
- EmfRecordTypeCreateDIBPatternBrushPt = EMR_CREATEDIBPATTERNBRUSHPT,
- EmfRecordTypeExtCreatePen = EMR_EXTCREATEPEN,
- EmfRecordTypePolyTextOutA = EMR_POLYTEXTOUTA,
- EmfRecordTypePolyTextOutW = EMR_POLYTEXTOUTW,
- EmfRecordTypeSetICMMode = 98, // EMR_SETICMMODE,
- EmfRecordTypeCreateColorSpace = 99, // EMR_CREATECOLORSPACE,
- EmfRecordTypeSetColorSpace = 100, // EMR_SETCOLORSPACE,
- EmfRecordTypeDeleteColorSpace = 101, // EMR_DELETECOLORSPACE,
- EmfRecordTypeGLSRecord = 102, // EMR_GLSRECORD,
- EmfRecordTypeGLSBoundedRecord = 103, // EMR_GLSBOUNDEDRECORD,
- EmfRecordTypePixelFormat = 104, // EMR_PIXELFORMAT,
- EmfRecordTypeDrawEscape = 105, // EMR_RESERVED_105,
- EmfRecordTypeExtEscape = 106, // EMR_RESERVED_106,
- EmfRecordTypeStartDoc = 107, // EMR_RESERVED_107,
- EmfRecordTypeSmallTextOut = 108, // EMR_RESERVED_108,
- EmfRecordTypeForceUFIMapping = 109, // EMR_RESERVED_109,
- EmfRecordTypeNamedEscape = 110, // EMR_RESERVED_110,
- EmfRecordTypeColorCorrectPalette = 111, // EMR_COLORCORRECTPALETTE,
- EmfRecordTypeSetICMProfileA = 112, // EMR_SETICMPROFILEA,
- EmfRecordTypeSetICMProfileW = 113, // EMR_SETICMPROFILEW,
- EmfRecordTypeAlphaBlend = 114, // EMR_ALPHABLEND,
- EmfRecordTypeSetLayout = 115, // EMR_SETLAYOUT,
- EmfRecordTypeTransparentBlt = 116, // EMR_TRANSPARENTBLT,
- EmfRecordTypeReserved_117 = 117, // Not Used
- EmfRecordTypeGradientFill = 118, // EMR_GRADIENTFILL,
- EmfRecordTypeSetLinkedUFIs = 119, // EMR_RESERVED_119,
- EmfRecordTypeSetTextJustification = 120, // EMR_RESERVED_120,
- EmfRecordTypeColorMatchToTargetW = 121, // EMR_COLORMATCHTOTARGETW,
- EmfRecordTypeCreateColorSpaceW = 122, // EMR_CREATECOLORSPACEW,
- EmfRecordTypeMax = 122,
- EmfRecordTypeMin = 1,
-
- // That is the END of the GDI EMF records.
-
- // Now we start the list of EMF+ records. We leave quite
- // a bit of room here for the addition of any new GDI
- // records that may be added later.
-
- EmfPlusRecordTypeInvalid = GDIP_EMFPLUS_RECORD_BASE,
- EmfPlusRecordTypeHeader,
- EmfPlusRecordTypeEndOfFile,
-
- EmfPlusRecordTypeComment,
-
- EmfPlusRecordTypeGetDC, // the application grabbed the metafile dc
-
- EmfPlusRecordTypeMultiFormatStart,
- EmfPlusRecordTypeMultiFormatSection,
- EmfPlusRecordTypeMultiFormatEnd,
-
- // For all persistent objects
- EmfPlusRecordTypeObject, // brush,pen,path,region,image,font,string-format
-
- // Drawing Records
- EmfPlusRecordTypeClear,
- EmfPlusRecordTypeFillRects,
- EmfPlusRecordTypeDrawRects,
- EmfPlusRecordTypeFillPolygon,
- EmfPlusRecordTypeDrawLines,
- EmfPlusRecordTypeFillEllipse,
- EmfPlusRecordTypeDrawEllipse,
- EmfPlusRecordTypeFillPie,
- EmfPlusRecordTypeDrawPie,
- EmfPlusRecordTypeDrawArc,
- EmfPlusRecordTypeFillRegion,
- EmfPlusRecordTypeFillPath,
- EmfPlusRecordTypeDrawPath,
- EmfPlusRecordTypeFillClosedCurve,
- EmfPlusRecordTypeDrawClosedCurve,
- EmfPlusRecordTypeDrawCurve,
- EmfPlusRecordTypeDrawBeziers,
- EmfPlusRecordTypeDrawImage,
- EmfPlusRecordTypeDrawImagePoints,
- EmfPlusRecordTypeDrawString,
-
- // Graphics State Records
- EmfPlusRecordTypeSetRenderingOrigin,
- EmfPlusRecordTypeSetAntiAliasMode,
- EmfPlusRecordTypeSetTextRenderingHint,
-#ifdef DCR_USE_NEW_188922
- EmfPlusRecordTypeSetTextContrast,
-#else
- EmfPlusRecordTypeSetGammaValue,
-#endif // DCR_USE_NEW_188922
- EmfPlusRecordTypeSetInterpolationMode,
- EmfPlusRecordTypeSetPixelOffsetMode,
- EmfPlusRecordTypeSetCompositingMode,
- EmfPlusRecordTypeSetCompositingQuality,
- EmfPlusRecordTypeSave,
- EmfPlusRecordTypeRestore,
- EmfPlusRecordTypeBeginContainer,
- EmfPlusRecordTypeBeginContainerNoParams,
- EmfPlusRecordTypeEndContainer,
- EmfPlusRecordTypeSetWorldTransform,
- EmfPlusRecordTypeResetWorldTransform,
- EmfPlusRecordTypeMultiplyWorldTransform,
- EmfPlusRecordTypeTranslateWorldTransform,
- EmfPlusRecordTypeScaleWorldTransform,
- EmfPlusRecordTypeRotateWorldTransform,
- EmfPlusRecordTypeSetPageTransform,
- EmfPlusRecordTypeResetClip,
- EmfPlusRecordTypeSetClipRect,
- EmfPlusRecordTypeSetClipPath,
- EmfPlusRecordTypeSetClipRegion,
- EmfPlusRecordTypeOffsetClip,
-
- // New record types must be added here (at the end) -- do not add above,
- // since that will invalidate previous metafiles!
- EmfPlusRecordTypeDrawDriverString,
-
- // Have this here so you don't need to keep changing the value of
- // EmfPlusRecordTypeMax every time you add a new record.
-
- EmfPlusRecordTotal,
-
- EmfPlusRecordTypeMax = EmfPlusRecordTotal-1,
- EmfPlusRecordTypeMin = EmfPlusRecordTypeHeader,
-};
-
-//---------------------------------------------------------------------------
-// StringFormatFlags
-//---------------------------------------------------------------------------
-
-//---------------------------------------------------------------------------
-// String format flags
-//
-// DirectionRightToLeft - For horizontal text, the reading order is
-// right to left. This value is called
-// the base embedding level by the Unicode
-// bidirectional engine.
-// For vertical text, columns are read from
-// right to left.
-// By default, horizontal or vertical text is
-// read from left to right.
-//
-// DirectionVertical - Individual lines of text are vertical. In
-// each line, characters progress from top to
-// bottom.
-// By default, lines of text are horizontal,
-// each new line below the previous line.
-//
-// NoFitBlackBox - Allows parts of glyphs to overhang the
-// bounding rectangle.
-// By default glyphs are first aligned
-// inside the margines, then any glyphs which
-// still overhang the bounding box are
-// repositioned to avoid any overhang.
-// For example when an italic
-// lower case letter f in a font such as
-// Garamond is aligned at the far left of a
-// rectangle, the lower part of the f will
-// reach slightly further left than the left
-// edge of the rectangle. Setting this flag
-// will ensure the character aligns visually
-// with the lines above and below, but may
-// cause some pixels outside the formatting
-// rectangle to be clipped or painted.
-//
-#ifndef DCR_USE_NEW_137252
-// NumberContextArabic - Causes any initial numeric in the string to
-// be analysed for bidirection layout as if
-// it was preceeded by Arabic text.
-//
-// DisableKashidaJustification - Arabic text will not be justified by the
-// insertion of kashidas (i.e. extending the
-// joining line between characters). Instead
-// Arabic script will be justified by the
-// widening of the whitespace between words.
-//
-#endif
-// DisplayFormatControl - Causes control characters such as the
-// left-to-right mark to be shown in the
-// output with a representative glyph.
-//
-#ifndef DCR_USE_NEW_137252
-// DisableKerning - Disables Truetype and OpenType kerning.
-//
-// DisableLigatures - Disables Truetype and OpenType ligatures.
-//
-// LayoutLegacyBidi - Causes the bidirection algorithm to use
-// slightly different classifications for
-// '+', '-' and '/' that make their layout
-// much closer to that expected by files
-// generated in Windows or by Windows
-// applications.
-//
-// NoChanges - A text imager created with this flag set
-// does not support those APIs that change
-// it's contents or formatting, but for most
-// simple text will be significantly faster in
-// performing measurement and drawing
-// functions.
-//
-#endif
-// NoFontFallback - Disables fallback to alternate fonts for
-// characters not supported in the requested
-// font. Any missing characters will be
-// be displayed with the fonts missing glyph,
-// usually an open square.
-//
-// NoWrap - Disables wrapping of text between lines
-// when formatting within a rectangle.
-// NoWrap is implied when a point is passed
-// instead of a rectangle, or when the
-// specified rectangle has a zero line length.
-//
-// NoClip - By default text is clipped to the
-// formatting rectangle. Setting NoClip
-// allows overhanging pixels to affect the
-// device outside the formatting rectangle.
-// Pixels at the end of the line may be
-// affected if the glyphs overhang their
-// cells, and either the NoFitBlackBox flag
-// has been set, or the glyph extends to far
-// to be fitted.
-// Pixels above/before the first line or
-// below/after the last line may be affected
-// if the glyphs extend beyond their cell
-// ascent / descent. This can occur rarely
-// with unusual diacritic mark combinations.
-
-//---------------------------------------------------------------------------
-
-enum StringFormatFlags
-{
- StringFormatFlagsDirectionRightToLeft = 0x00000001,
- StringFormatFlagsDirectionVertical = 0x00000002,
- StringFormatFlagsNoFitBlackBox = 0x00000004,
-#ifndef DCR_USE_NEW_137252
- StringFormatFlagsNumberContextArabic = 0x00000008,
- StringFormatFlagsDisableKashidaJustification = 0x00000010,
-#endif
- StringFormatFlagsDisplayFormatControl = 0x00000020,
-#ifndef DCR_USE_NEW_137252
- StringFormatFlagsDisableKerning = 0x00000040,
- StringFormatFlagsDisableLigatures = 0x00000080,
- StringFormatFlagsLayoutLegacyBidi = 0x00000100,
- StringFormatFlagsNoChanges = 0x00000200,
-#endif
- StringFormatFlagsNoFontFallback = 0x00000400,
- StringFormatFlagsMeasureTrailingSpaces = 0x00000800,
- StringFormatFlagsNoWrap = 0x00001000,
- StringFormatFlagsLineLimit = 0x00002000,
-
- StringFormatFlagsNoClip = 0x00004000
-};
-
-//---------------------------------------------------------------------------
-// StringTrimming
-//---------------------------------------------------------------------------
-
-enum StringTrimming {
- StringTrimmingNone = 0,
- StringTrimmingCharacter = 1,
- StringTrimmingWord = 2,
- StringTrimmingEllipsisCharacter = 3,
- StringTrimmingEllipsisWord = 4,
- StringTrimmingEllipsisPath = 5
-};
-
-#ifndef DCR_USE_NEW_137252
-//---------------------------------------------------------------------------
-// String units
-//
-// String units are like length units in CSS, they may be absolute, or
-// they may be relative to a font size.
-//
-//---------------------------------------------------------------------------
-
-enum StringUnit {
- StringUnitWorld = UnitWorld,
- StringUnitDisplay = UnitDisplay,
- StringUnitPixel = UnitPixel,
- StringUnitPoint = UnitPoint,
- StringUnitInch = UnitInch,
- StringUnitDocument = UnitDocument,
- StringUnitMillimeter = UnitMillimeter,
- StringUnitEm = 32
-};
-#endif
-
-#ifndef DCR_USE_NEW_152154
-//---------------------------------------------------------------------------
-// Line spacing flags
-//---------------------------------------------------------------------------
-
-enum LineSpacing {
- LineSpacingWorld = UnitWorld,
- LineSpacingDisplay = UnitDisplay,
- LineSpacingPixel = UnitPixel,
- LineSpacingPoint = UnitPoint,
- LineSpacingInch = UnitInch,
- LineSpacingDocument = UnitDocument,
- LineSpacingMillimeter = UnitMillimeter,
-
- LineSpacingRecommended = 32,
- LineSpacingAtLeast = 33,
- LineSpacingAtLeastMultiple = 34,
- LineSpacingCell = 35,
- LineSpacingCellAtLeast = 36,
- LineSpacingCellAtLeastMultiple = 37
-};
-
-/// The following methods of linespacing are relative to the font size
-//
-// =========== Method =========== =============== Relative to ===============
-//
-// LineSpacingRecommended recommended line spacing specified by font
-// LineSpacingAtLeast max(recommended, tallest glyph cell)
-// LineSpacingAtLeastMultiple smallest multiple of recommended big enough
-// for all glyph cells on the line
-// LineSpacingCell cell height
-// LineSpacingCellAtLeast max(font cell height, tallest glyph cell)
-// LineSpacingCellAtLeastMultiple smallest multiple of cell height big enough
-// for all glyph cells on the line
-#endif
-
-
-//---------------------------------------------------------------------------
-// National language digit substitution
-//---------------------------------------------------------------------------
-
-enum StringDigitSubstitute
-{
- StringDigitSubstituteUser = 0, // As NLS setting
- StringDigitSubstituteNone = 1,
- StringDigitSubstituteNational = 2,
- StringDigitSubstituteTraditional = 3
-};
-
-//---------------------------------------------------------------------------
-// Hotkey prefix interpretation
-//---------------------------------------------------------------------------
-
-enum HotkeyPrefix
-{
- HotkeyPrefixNone = 0,
- HotkeyPrefixShow = 1,
- HotkeyPrefixHide = 2
-};
-
-//---------------------------------------------------------------------------
-// Text alignment flags
-//---------------------------------------------------------------------------
-
-enum StringAlignment
-{
- // Left edge for left-to-right text,
- // right for right-to-left text,
- // and top for vertical
- StringAlignmentNear = 0,
- StringAlignmentCenter = 1,
- StringAlignmentFar = 2
-};
-
-//---------------------------------------------------------------------------
-// DriverStringOptions
-//---------------------------------------------------------------------------
-
-enum DriverStringOptions
-{
- DriverStringOptionsCmapLookup = 1,
- DriverStringOptionsVertical = 2,
- DriverStringOptionsRealizedAdvance = 4,
-#ifndef DCR_USE_NEW_137252
- DriverStringOptionsCompensateResolution = 8
-#endif
-};
-
-//---------------------------------------------------------------------------
-// Flush Intention flags
-//---------------------------------------------------------------------------
-
-enum FlushIntention
-{
- FlushIntentionFlush = 0, // Flush all batched rendering operations
- FlushIntentionSync = 1 // Flush all batched rendering operations
- // and wait for them to complete
-};
-
-#ifndef DCR_USE_NEW_175866
-
-//---------------------------------------------------------------------------
-// Window Change Notification types
-//---------------------------------------------------------------------------
-
-enum WindowNotifyEnum
-{
- WindowNotifyEnumEnable = 0,
- WindowNotifyEnumDisable,
- WindowNotifyEnumPalette,
- WindowNotifyEnumDisplay,
- WindowNotifyEnumSysColor
-};
-
-#endif
-
-//---------------------------------------------------------------------------
-// Image encoder parameter related types
-//---------------------------------------------------------------------------
-
-#ifdef DCR_USE_NEW_145804
-enum EncoderParameterValueType
-{
- EncoderParameterValueTypeByte = 1, // 8-bit unsigned int
- EncoderParameterValueTypeASCII = 2, // 8-bit byte containing one 7-bit ASCII
- // code. NULL terminated.
- EncoderParameterValueTypeShort = 3, // 16-bit unsigned int
- EncoderParameterValueTypeLong = 4, // 32-bit unsigned int
- EncoderParameterValueTypeRational = 5, // Two Longs. The first Long is the
- // numerator, the second Long expresses the
- // denomintor.
- EncoderParameterValueTypeLongRange = 6, // Two longs which specify a range of
- // integer values. The first Long specifies
- // the lower end and the second one
- // specifies the higher end. All values
- // are inclusive at both ends
- EncoderParameterValueTypeUndefined = 7, // 8-bit byte that can take any value
- // depending on field definition
- EncoderParameterValueTypeRationalRange = 8 // Two Rationals. The first Rational
- // specifies the lower end and the second
- // specifies the higher end. All values
- // are inclusive at both ends
-};
-#else
-enum ValueType
-{
- ValueTypeByte = 1, // 8-bit unsigned int
- ValueTypeASCII = 2, // 8-bit byte containing one 7-bit ASCII
- // code. NULL terminated.
- ValueTypeShort = 3, // 16-bit unsigned int
- ValueTypeLong = 4, // 32-bit unsigned int
- ValueTypeRational = 5, // Two Longs. The first Long is the
- // numerator, the second Long expresses the
- // denomintor.
- ValueTypeLongRange = 6, // Two longs which specify a range of
- // integer values. The first Long specifies
- // the lower end and the second one
- // specifies the higher end. All values
- // are inclusive at both ends
- ValueTypeUndefined = 7, // 8-bit byte that can take any value
- // depending on field definition
- ValueTypeRationalRange = 8 // Two Rationals. The first Rational
- // specifies the lower end and the second
- // specifies the higher end. All values
- // are inclusive at both ends
-};
-#endif
-
-//---------------------------------------------------------------------------
-// Image encoder value types
-//---------------------------------------------------------------------------
-
-enum EncoderValue
-{
- EncoderValueColorTypeCMYK,
- EncoderValueColorTypeYCCK,
- EncoderValueCompressionLZW,
- EncoderValueCompressionCCITT3,
- EncoderValueCompressionCCITT4,
- EncoderValueCompressionRle,
- EncoderValueCompressionNone,
- EncoderValueScanMethodInterlaced,
- EncoderValueScanMethodNonInterlaced,
- EncoderValueVersionGif87,
- EncoderValueVersionGif89,
- EncoderValueRenderProgressive,
- EncoderValueRenderNonProgressive,
- EncoderValueTransformRotate90,
- EncoderValueTransformRotate180,
- EncoderValueTransformRotate270,
- EncoderValueTransformFlipHorizontal,
- EncoderValueTransformFlipVertical,
- #ifdef DCR_USE_NEW_140861
- EncoderValueMultiFrame,
- #else
- EncodeValueMultiFrame,
- #endif
- EncoderValueLastFrame,
- EncoderValueFlush,
- #ifdef DCR_USE_NEW_140861
- EncoderValueFrameDimensionTime,
- EncoderValueFrameDimensionResolution,
- EncoderValueFrameDimensionPage
- #else
- EncodeValueFrameDimensionTime,
- EncodeValueFrameDimensionResolution,
- EncodeValueFrameDimensionPage
- #endif
-};
-
-//---------------------------------------------------------------------------
-// Graphics layout values (support for Middle East localization)
-//---------------------------------------------------------------------------
-
-enum GraphicsLayout
-{
- GraphicsLayoutNormal,
- GraphicsLayoutMirrored,
- GraphicsLayoutMirroredIgnoreImages,
- GraphicsLayoutMirroredForceImages
-};
-
-//---------------------------------------------------------------------------
-// Image layout values (support for Middle East localization)
-//---------------------------------------------------------------------------
-
-enum ImageLayout
-{
- ImageLayoutNormal,
- ImageLayoutIgnoreMirrored
-};
-
-enum EmfToWmfBitsFlags
-{
- EmfToWmfBitsFlagsDefault = 0x00000000,
- EmfToWmfBitsFlagsEmbedEmf = 0x00000001,
- EmfToWmfBitsFlagsIncludeAPM = 0x00000002,
- EmfToWmfBitsFlagsNoXORClip = 0x00000004
-};
-
-#endif // !_GDIPLUSENUMS_H
+/**************************************************************************\
+*
+* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
+*
+* Module Name:
+*
+* GdiplusEnums.h
+*
+* Abstract:
+*
+* Various enumeration types
+*
+\**************************************************************************/
+
+#ifndef _GDIPLUSENUMS_H
+#define _GDIPLUSENUMS_H
+
+
+//--------------------------------------------------------------------------
+// Default bezier flattening tolerance in device pixels.
+//--------------------------------------------------------------------------
+
+const float FlatnessDefault = 1.0f/4.0f;
+
+//--------------------------------------------------------------------------
+// Graphics and Container State cookies
+//--------------------------------------------------------------------------
+
+typedef UINT GraphicsState;
+typedef UINT GraphicsContainer;
+
+//--------------------------------------------------------------------------
+// Fill mode constants
+//--------------------------------------------------------------------------
+
+enum FillMode
+{
+ FillModeAlternate, // 0
+ FillModeWinding // 1
+};
+
+//--------------------------------------------------------------------------
+// Quality mode constants
+//--------------------------------------------------------------------------
+
+enum QualityMode
+{
+ QualityModeInvalid = -1,
+ QualityModeDefault = 0,
+ QualityModeLow = 1, // for apps that need the best performance
+ QualityModeHigh = 2 // for apps that need the best rendering quality
+};
+
+//--------------------------------------------------------------------------
+// Alpha compositing mode constants
+//--------------------------------------------------------------------------
+
+enum CompositingMode
+{
+ CompositingModeSourceOver, // 0
+ CompositingModeSourceCopy // 1
+};
+
+//--------------------------------------------------------------------------
+// Alpha compositing quality constants
+//--------------------------------------------------------------------------
+
+enum CompositingQuality
+{
+ CompositingQualityInvalid = QualityModeInvalid,
+ CompositingQualityDefault = QualityModeDefault,
+ CompositingQualityHighSpeed = QualityModeLow,
+ CompositingQualityHighQuality = QualityModeHigh,
+ CompositingQualityGammaCorrected,
+ CompositingQualityAssumeLinear
+};
+
+//--------------------------------------------------------------------------
+// Unit constants
+//--------------------------------------------------------------------------
+
+enum Unit
+{
+ UnitWorld, // 0 -- World coordinate (non-physical unit)
+ UnitDisplay, // 1 -- Variable -- for PageTransform only
+ UnitPixel, // 2 -- Each unit is one device pixel.
+ UnitPoint, // 3 -- Each unit is a printer's point, or 1/72 inch.
+ UnitInch, // 4 -- Each unit is 1 inch.
+ UnitDocument, // 5 -- Each unit is 1/300 inch.
+ UnitMillimeter // 6 -- Each unit is 1 millimeter.
+};
+
+//--------------------------------------------------------------------------
+// MetafileFrameUnit
+//
+// The frameRect for creating a metafile can be specified in any of these
+// units. There is an extra frame unit value (MetafileFrameUnitGdi) so
+// that units can be supplied in the same units that GDI expects for
+// frame rects -- these units are in .01 (1/100ths) millimeter units
+// as defined by GDI.
+//--------------------------------------------------------------------------
+enum MetafileFrameUnit
+{
+ MetafileFrameUnitPixel = UnitPixel,
+ MetafileFrameUnitPoint = UnitPoint,
+ MetafileFrameUnitInch = UnitInch,
+ MetafileFrameUnitDocument = UnitDocument,
+ MetafileFrameUnitMillimeter = UnitMillimeter,
+ MetafileFrameUnitGdi // GDI compatible .01 MM units
+};
+
+//--------------------------------------------------------------------------
+// Coordinate space identifiers
+//--------------------------------------------------------------------------
+
+enum CoordinateSpace
+{
+ CoordinateSpaceWorld, // 0
+ CoordinateSpacePage, // 1
+ CoordinateSpaceDevice // 2
+};
+
+//--------------------------------------------------------------------------
+// Various wrap modes for brushes
+//--------------------------------------------------------------------------
+
+enum WrapMode
+{
+ WrapModeTile, // 0
+ WrapModeTileFlipX, // 1
+ WrapModeTileFlipY, // 2
+ WrapModeTileFlipXY, // 3
+ WrapModeClamp // 4
+};
+
+//--------------------------------------------------------------------------
+// Various hatch styles
+//--------------------------------------------------------------------------
+
+enum HatchStyle
+{
+ HatchStyleHorizontal, // 0
+ HatchStyleVertical, // 1
+ HatchStyleForwardDiagonal, // 2
+ HatchStyleBackwardDiagonal, // 3
+ HatchStyleCross, // 4
+ HatchStyleDiagonalCross, // 5
+ HatchStyle05Percent, // 6
+ HatchStyle10Percent, // 7
+ HatchStyle20Percent, // 8
+ HatchStyle25Percent, // 9
+ HatchStyle30Percent, // 10
+ HatchStyle40Percent, // 11
+ HatchStyle50Percent, // 12
+ HatchStyle60Percent, // 13
+ HatchStyle70Percent, // 14
+ HatchStyle75Percent, // 15
+ HatchStyle80Percent, // 16
+ HatchStyle90Percent, // 17
+ HatchStyleLightDownwardDiagonal, // 18
+ HatchStyleLightUpwardDiagonal, // 19
+ HatchStyleDarkDownwardDiagonal, // 20
+ HatchStyleDarkUpwardDiagonal, // 21
+ HatchStyleWideDownwardDiagonal, // 22
+ HatchStyleWideUpwardDiagonal, // 23
+ HatchStyleLightVertical, // 24
+ HatchStyleLightHorizontal, // 25
+ HatchStyleNarrowVertical, // 26
+ HatchStyleNarrowHorizontal, // 27
+ HatchStyleDarkVertical, // 28
+ HatchStyleDarkHorizontal, // 29
+ HatchStyleDashedDownwardDiagonal, // 30
+ HatchStyleDashedUpwardDiagonal, // 31
+ HatchStyleDashedHorizontal, // 32
+ HatchStyleDashedVertical, // 33
+ HatchStyleSmallConfetti, // 34
+ HatchStyleLargeConfetti, // 35
+ HatchStyleZigZag, // 36
+ HatchStyleWave, // 37
+ HatchStyleDiagonalBrick, // 38
+ HatchStyleHorizontalBrick, // 39
+ HatchStyleWeave, // 40
+ HatchStylePlaid, // 41
+ HatchStyleDivot, // 42
+ HatchStyleDottedGrid, // 43
+ HatchStyleDottedDiamond, // 44
+ HatchStyleShingle, // 45
+ HatchStyleTrellis, // 46
+ HatchStyleSphere, // 47
+ HatchStyleSmallGrid, // 48
+ HatchStyleSmallCheckerBoard, // 49
+ HatchStyleLargeCheckerBoard, // 50
+ HatchStyleOutlinedDiamond, // 51
+ HatchStyleSolidDiamond, // 52
+
+ HatchStyleTotal, // must be after all unique hatch styles
+
+ HatchStyleLargeGrid = HatchStyleCross, // 4 an alias for the cross style
+
+ HatchStyleMin = HatchStyleHorizontal,
+ HatchStyleMax = HatchStyleTotal - 1,
+};
+
+//--------------------------------------------------------------------------
+// Dash style constants
+//--------------------------------------------------------------------------
+
+enum DashStyle
+{
+ DashStyleSolid, // 0
+ DashStyleDash, // 1
+ DashStyleDot, // 2
+ DashStyleDashDot, // 3
+ DashStyleDashDotDot, // 4
+ DashStyleCustom // 5
+};
+
+//--------------------------------------------------------------------------
+// Dash cap constants
+//--------------------------------------------------------------------------
+
+enum DashCap
+{
+ DashCapFlat = 0,
+ DashCapRound = 2,
+ DashCapTriangle = 3
+};
+
+//--------------------------------------------------------------------------
+// Line cap constants (only the lowest 8 bits are used).
+//--------------------------------------------------------------------------
+
+enum LineCap
+{
+ LineCapFlat = 0,
+ LineCapSquare = 1,
+ LineCapRound = 2,
+ LineCapTriangle = 3,
+
+ LineCapNoAnchor = 0x10, // corresponds to flat cap
+ LineCapSquareAnchor = 0x11, // corresponds to square cap
+ LineCapRoundAnchor = 0x12, // corresponds to round cap
+ LineCapDiamondAnchor = 0x13, // corresponds to triangle cap
+ LineCapArrowAnchor = 0x14, // no correspondence
+
+ LineCapCustom = 0xff, // custom cap
+
+ LineCapAnchorMask = 0xf0 // mask to check for anchor or not.
+};
+
+//--------------------------------------------------------------------------
+// Custom Line cap type constants
+//--------------------------------------------------------------------------
+
+enum CustomLineCapType
+{
+ CustomLineCapTypeDefault = 0,
+ CustomLineCapTypeAdjustableArrow = 1
+};
+
+//--------------------------------------------------------------------------
+// Line join constants
+//--------------------------------------------------------------------------
+
+enum LineJoin
+{
+ LineJoinMiter = 0,
+ LineJoinBevel = 1,
+ LineJoinRound = 2,
+ LineJoinMiterClipped = 3
+};
+
+//--------------------------------------------------------------------------
+// Path point types (only the lowest 8 bits are used.)
+// The lowest 3 bits are interpreted as point type
+// The higher 5 bits are reserved for flags.
+//--------------------------------------------------------------------------
+
+enum PathPointType
+{
+ PathPointTypeStart = 0, // move
+ PathPointTypeLine = 1, // line
+ PathPointTypeBezier = 3, // default Beizer (= cubic Bezier)
+ PathPointTypePathTypeMask = 0x07, // type mask (lowest 3 bits).
+ PathPointTypeDashMode = 0x10, // currently in dash mode.
+ PathPointTypePathMarker = 0x20, // a marker for the path.
+ PathPointTypeCloseSubpath = 0x80, // closed flag
+
+ // Path types used for advanced path.
+
+ PathPointTypeBezier2 = 2, // quadratic Beizer
+ PathPointTypeBezier3 = 3, // cubic Bezier
+ PathPointTypeBezier4 = 4, // quartic (4th order) Beizer
+ PathPointTypeBezier5 = 5, // quintic (5th order) Bezier
+ PathPointTypeBezier6 = 6 // hexaic (6th order) Bezier
+};
+
+
+//--------------------------------------------------------------------------
+// WarpMode constants
+//--------------------------------------------------------------------------
+
+enum WarpMode
+{
+ WarpModePerspective, // 0
+ WarpModeBilinear // 1
+};
+
+//--------------------------------------------------------------------------
+// LineGradient Mode
+//--------------------------------------------------------------------------
+
+enum LinearGradientMode
+{
+ LinearGradientModeHorizontal, // 0
+ LinearGradientModeVertical, // 1
+ LinearGradientModeForwardDiagonal, // 2
+ LinearGradientModeBackwardDiagonal // 3
+};
+
+//--------------------------------------------------------------------------
+// Region Comine Modes
+//--------------------------------------------------------------------------
+
+enum CombineMode
+{
+ CombineModeReplace, // 0
+ CombineModeIntersect, // 1
+ CombineModeUnion, // 2
+ CombineModeXor, // 3
+ CombineModeExclude, // 4
+ CombineModeComplement // 5 (does exclude from)
+};
+
+//--------------------------------------------------------------------------
+ // Image types
+//--------------------------------------------------------------------------
+
+enum ImageType
+{
+ ImageTypeUnknown, // 0
+ ImageTypeBitmap, // 1
+ ImageTypeMetafile // 2
+};
+
+//--------------------------------------------------------------------------
+// Interpolation modes
+//--------------------------------------------------------------------------
+
+enum InterpolationMode
+{
+ InterpolationModeInvalid = QualityModeInvalid,
+ InterpolationModeDefault = QualityModeDefault,
+ InterpolationModeLowQuality = QualityModeLow,
+ InterpolationModeHighQuality = QualityModeHigh,
+ InterpolationModeBilinear,
+ InterpolationModeBicubic,
+ InterpolationModeNearestNeighbor,
+ InterpolationModeHighQualityBilinear,
+ InterpolationModeHighQualityBicubic
+};
+
+//--------------------------------------------------------------------------
+// Pen types
+//--------------------------------------------------------------------------
+enum PenAlignment
+{
+ PenAlignmentCenter = 0,
+ PenAlignmentInset = 1,
+ PenAlignmentOutset = 2,
+ PenAlignmentLeft = 3,
+ PenAlignmentRight = 4
+};
+
+//--------------------------------------------------------------------------
+// Brush types
+//--------------------------------------------------------------------------
+
+enum BrushType
+{
+ BrushTypeSolidColor = 0,
+ BrushTypeHatchFill = 1,
+ BrushTypeTextureFill = 2,
+ BrushTypePathGradient = 3,
+ BrushTypeLinearGradient = 4
+};
+
+//--------------------------------------------------------------------------
+// Pen's Fill types
+//--------------------------------------------------------------------------
+
+enum PenType
+{
+ PenTypeSolidColor = BrushTypeSolidColor,
+ PenTypeHatchFill = BrushTypeHatchFill,
+ PenTypeTextureFill = BrushTypeTextureFill,
+ PenTypePathGradient = BrushTypePathGradient,
+ PenTypeLinearGradient = BrushTypeLinearGradient,
+ PenTypeUnknown = -1
+};
+
+//--------------------------------------------------------------------------
+// Matrix Order
+//--------------------------------------------------------------------------
+
+enum MatrixOrder
+{
+ MatrixOrderPrepend = 0,
+ MatrixOrderAppend = 1
+};
+
+//--------------------------------------------------------------------------
+// Generic font families
+//--------------------------------------------------------------------------
+
+enum GenericFontFamily
+{
+ GenericFontFamilySerif,
+ GenericFontFamilySansSerif,
+ GenericFontFamilyMonospace
+
+};
+
+//--------------------------------------------------------------------------
+// FontStyle: face types and common styles
+//--------------------------------------------------------------------------
+
+// These should probably be flags
+
+// Must have:
+// Regular = 0
+// Bold = 1
+// Italic = 2
+// BoldItalic = 3
+
+enum FontStyle
+{
+ FontStyleRegular = 0,
+ FontStyleBold = 1,
+ FontStyleItalic = 2,
+ FontStyleBoldItalic = 3,
+ FontStyleUnderline = 4,
+ FontStyleStrikeout = 8
+};
+
+//---------------------------------------------------------------------------
+// Smoothing Mode
+//---------------------------------------------------------------------------
+
+enum SmoothingMode
+{
+ SmoothingModeInvalid = QualityModeInvalid,
+ SmoothingModeDefault = QualityModeDefault,
+ SmoothingModeHighSpeed = QualityModeLow,
+ SmoothingModeHighQuality = QualityModeHigh,
+ SmoothingModeNone,
+ SmoothingModeAntiAlias
+};
+
+//---------------------------------------------------------------------------
+// Pixel Format Mode
+//---------------------------------------------------------------------------
+
+enum PixelOffsetMode
+{
+ PixelOffsetModeInvalid = QualityModeInvalid,
+ PixelOffsetModeDefault = QualityModeDefault,
+ PixelOffsetModeHighSpeed = QualityModeLow,
+ PixelOffsetModeHighQuality = QualityModeHigh,
+ PixelOffsetModeNone, // no pixel offset
+ PixelOffsetModeHalf // offset by -0.5, -0.5 for fast anti-alias perf
+};
+
+//---------------------------------------------------------------------------
+// Text Rendering Hint
+//---------------------------------------------------------------------------
+
+enum TextRenderingHint
+{
+#ifdef DCR_USE_NEW_186764
+ TextRenderingHintSystemDefault = 0, // Glyph with system default rendering hint
+ TextRenderingHintSingleBitPerPixelGridFit, // Glyph bitmap with hinting
+#else
+ TextRenderingHintSingleBitPerPixelGridFit = 0, // Glyph bitmap with hinting
+#endif // DCR_USE_NEW_186764
+ TextRenderingHintSingleBitPerPixel, // Glyph bitmap without hinting
+ TextRenderingHintAntiAliasGridFit, // Glyph anti-alias bitmap with hinting
+ TextRenderingHintAntiAlias, // Glyph anti-alias bitmap without hinting
+ TextRenderingHintClearTypeGridFit // Glyph CT bitmap with hinting
+};
+
+//---------------------------------------------------------------------------
+// Metafile Types
+//---------------------------------------------------------------------------
+enum MetafileType
+{
+ MetafileTypeInvalid, // Invalid metafile
+ MetafileTypeWmf, // Standard WMF
+ MetafileTypeWmfAldus, // Aldus Placeable Metafile format
+ MetafileTypeEmf, // EMF (not EMF+)
+ MetafileTypeEmfPlusOnly, // EMF+ without dual, down-level records
+ MetafileTypeEmfPlusDual // EMF+ with dual, down-level records
+};
+
+// Specifies the type of EMF to record
+enum EmfType
+{
+ EmfTypeEmfOnly = MetafileTypeEmf, // no EMF+, only EMF
+ EmfTypeEmfPlusOnly = MetafileTypeEmfPlusOnly, // no EMF, only EMF+
+ EmfTypeEmfPlusDual = MetafileTypeEmfPlusDual // both EMF+ and EMF
+};
+
+// All persistent objects must have a type listed here
+enum ObjectType
+{
+ ObjectTypeInvalid,
+ ObjectTypeBrush,
+ ObjectTypePen,
+ ObjectTypePath,
+ ObjectTypeRegion,
+ ObjectTypeImage,
+ ObjectTypeFont,
+ ObjectTypeStringFormat,
+ ObjectTypeImageAttributes,
+ ObjectTypeCustomLineCap,
+
+ ObjectTypeMax = ObjectTypeCustomLineCap,
+ ObjectTypeMin = ObjectTypeBrush
+};
+
+inline BOOL
+ObjectTypeIsValid(
+ ObjectType type
+ )
+{
+ return ((type >= ObjectTypeMin) && (type <= ObjectTypeMax));
+}
+
+//---------------------------------------------------------------------------
+// EMF+ Records
+//---------------------------------------------------------------------------
+
+// We have to change the WMF record numbers so that they don't conflict with
+// the EMF and EMF+ record numbers.
+enum EmfPlusRecordType;
+#define GDIP_EMFPLUS_RECORD_BASE 0x00004000
+#define GDIP_WMF_RECORD_BASE 0x00010000
+#define GDIP_WMF_RECORD_TO_EMFPLUS(n) ((EmfPlusRecordType)((n) | GDIP_WMF_RECORD_BASE))
+#define GDIP_EMFPLUS_RECORD_TO_WMF(n) ((n) & (~GDIP_WMF_RECORD_BASE))
+#define GDIP_IS_WMF_RECORDTYPE(n) (((n) & GDIP_WMF_RECORD_BASE) != 0)
+
+enum EmfPlusRecordType
+{
+ // Since we have to enumerate GDI records right along with GDI+ records,
+ // we list all the GDI records here so that they can be part of the
+ // same enumeration type which is used in the enumeration callback.
+
+ WmfRecordTypeSetBkColor = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETBKCOLOR),
+ WmfRecordTypeSetBkMode = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETBKMODE),
+ WmfRecordTypeSetMapMode = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETMAPMODE),
+ WmfRecordTypeSetROP2 = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETROP2),
+ WmfRecordTypeSetRelAbs = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETRELABS),
+ WmfRecordTypeSetPolyFillMode = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETPOLYFILLMODE),
+ WmfRecordTypeSetStretchBltMode = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETSTRETCHBLTMODE),
+ WmfRecordTypeSetTextCharExtra = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETTEXTCHAREXTRA),
+ WmfRecordTypeSetTextColor = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETTEXTCOLOR),
+ WmfRecordTypeSetTextJustification = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETTEXTJUSTIFICATION),
+ WmfRecordTypeSetWindowOrg = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETWINDOWORG),
+ WmfRecordTypeSetWindowExt = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETWINDOWEXT),
+ WmfRecordTypeSetViewportOrg = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETVIEWPORTORG),
+ WmfRecordTypeSetViewportExt = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETVIEWPORTEXT),
+ WmfRecordTypeOffsetWindowOrg = GDIP_WMF_RECORD_TO_EMFPLUS(META_OFFSETWINDOWORG),
+ WmfRecordTypeScaleWindowExt = GDIP_WMF_RECORD_TO_EMFPLUS(META_SCALEWINDOWEXT),
+ WmfRecordTypeOffsetViewportOrg = GDIP_WMF_RECORD_TO_EMFPLUS(META_OFFSETVIEWPORTORG),
+ WmfRecordTypeScaleViewportExt = GDIP_WMF_RECORD_TO_EMFPLUS(META_SCALEVIEWPORTEXT),
+ WmfRecordTypeLineTo = GDIP_WMF_RECORD_TO_EMFPLUS(META_LINETO),
+ WmfRecordTypeMoveTo = GDIP_WMF_RECORD_TO_EMFPLUS(META_MOVETO),
+ WmfRecordTypeExcludeClipRect = GDIP_WMF_RECORD_TO_EMFPLUS(META_EXCLUDECLIPRECT),
+ WmfRecordTypeIntersectClipRect = GDIP_WMF_RECORD_TO_EMFPLUS(META_INTERSECTCLIPRECT),
+ WmfRecordTypeArc = GDIP_WMF_RECORD_TO_EMFPLUS(META_ARC),
+ WmfRecordTypeEllipse = GDIP_WMF_RECORD_TO_EMFPLUS(META_ELLIPSE),
+ WmfRecordTypeFloodFill = GDIP_WMF_RECORD_TO_EMFPLUS(META_FLOODFILL),
+ WmfRecordTypePie = GDIP_WMF_RECORD_TO_EMFPLUS(META_PIE),
+ WmfRecordTypeRectangle = GDIP_WMF_RECORD_TO_EMFPLUS(META_RECTANGLE),
+ WmfRecordTypeRoundRect = GDIP_WMF_RECORD_TO_EMFPLUS(META_ROUNDRECT),
+ WmfRecordTypePatBlt = GDIP_WMF_RECORD_TO_EMFPLUS(META_PATBLT),
+ WmfRecordTypeSaveDC = GDIP_WMF_RECORD_TO_EMFPLUS(META_SAVEDC),
+ WmfRecordTypeSetPixel = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETPIXEL),
+ WmfRecordTypeOffsetClipRgn = GDIP_WMF_RECORD_TO_EMFPLUS(META_OFFSETCLIPRGN),
+ WmfRecordTypeTextOut = GDIP_WMF_RECORD_TO_EMFPLUS(META_TEXTOUT),
+ WmfRecordTypeBitBlt = GDIP_WMF_RECORD_TO_EMFPLUS(META_BITBLT),
+ WmfRecordTypeStretchBlt = GDIP_WMF_RECORD_TO_EMFPLUS(META_STRETCHBLT),
+ WmfRecordTypePolygon = GDIP_WMF_RECORD_TO_EMFPLUS(META_POLYGON),
+ WmfRecordTypePolyline = GDIP_WMF_RECORD_TO_EMFPLUS(META_POLYLINE),
+ WmfRecordTypeEscape = GDIP_WMF_RECORD_TO_EMFPLUS(META_ESCAPE),
+ WmfRecordTypeRestoreDC = GDIP_WMF_RECORD_TO_EMFPLUS(META_RESTOREDC),
+ WmfRecordTypeFillRegion = GDIP_WMF_RECORD_TO_EMFPLUS(META_FILLREGION),
+ WmfRecordTypeFrameRegion = GDIP_WMF_RECORD_TO_EMFPLUS(META_FRAMEREGION),
+ WmfRecordTypeInvertRegion = GDIP_WMF_RECORD_TO_EMFPLUS(META_INVERTREGION),
+ WmfRecordTypePaintRegion = GDIP_WMF_RECORD_TO_EMFPLUS(META_PAINTREGION),
+ WmfRecordTypeSelectClipRegion = GDIP_WMF_RECORD_TO_EMFPLUS(META_SELECTCLIPREGION),
+ WmfRecordTypeSelectObject = GDIP_WMF_RECORD_TO_EMFPLUS(META_SELECTOBJECT),
+ WmfRecordTypeSetTextAlign = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETTEXTALIGN),
+ WmfRecordTypeDrawText = GDIP_WMF_RECORD_TO_EMFPLUS(0x062F), // META_DRAWTEXT
+ WmfRecordTypeChord = GDIP_WMF_RECORD_TO_EMFPLUS(META_CHORD),
+ WmfRecordTypeSetMapperFlags = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETMAPPERFLAGS),
+ WmfRecordTypeExtTextOut = GDIP_WMF_RECORD_TO_EMFPLUS(META_EXTTEXTOUT),
+ WmfRecordTypeSetDIBToDev = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETDIBTODEV),
+ WmfRecordTypeSelectPalette = GDIP_WMF_RECORD_TO_EMFPLUS(META_SELECTPALETTE),
+ WmfRecordTypeRealizePalette = GDIP_WMF_RECORD_TO_EMFPLUS(META_REALIZEPALETTE),
+ WmfRecordTypeAnimatePalette = GDIP_WMF_RECORD_TO_EMFPLUS(META_ANIMATEPALETTE),
+ WmfRecordTypeSetPalEntries = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETPALENTRIES),
+ WmfRecordTypePolyPolygon = GDIP_WMF_RECORD_TO_EMFPLUS(META_POLYPOLYGON),
+ WmfRecordTypeResizePalette = GDIP_WMF_RECORD_TO_EMFPLUS(META_RESIZEPALETTE),
+ WmfRecordTypeDIBBitBlt = GDIP_WMF_RECORD_TO_EMFPLUS(META_DIBBITBLT),
+ WmfRecordTypeDIBStretchBlt = GDIP_WMF_RECORD_TO_EMFPLUS(META_DIBSTRETCHBLT),
+ WmfRecordTypeDIBCreatePatternBrush = GDIP_WMF_RECORD_TO_EMFPLUS(META_DIBCREATEPATTERNBRUSH),
+ WmfRecordTypeStretchDIB = GDIP_WMF_RECORD_TO_EMFPLUS(META_STRETCHDIB),
+ WmfRecordTypeExtFloodFill = GDIP_WMF_RECORD_TO_EMFPLUS(META_EXTFLOODFILL),
+ WmfRecordTypeSetLayout = GDIP_WMF_RECORD_TO_EMFPLUS(0x0149), // META_SETLAYOUT
+ WmfRecordTypeResetDC = GDIP_WMF_RECORD_TO_EMFPLUS(0x014C), // META_RESETDC
+ WmfRecordTypeStartDoc = GDIP_WMF_RECORD_TO_EMFPLUS(0x014D), // META_STARTDOC
+ WmfRecordTypeStartPage = GDIP_WMF_RECORD_TO_EMFPLUS(0x004F), // META_STARTPAGE
+ WmfRecordTypeEndPage = GDIP_WMF_RECORD_TO_EMFPLUS(0x0050), // META_ENDPAGE
+ WmfRecordTypeAbortDoc = GDIP_WMF_RECORD_TO_EMFPLUS(0x0052), // META_ABORTDOC
+ WmfRecordTypeEndDoc = GDIP_WMF_RECORD_TO_EMFPLUS(0x005E), // META_ENDDOC
+ WmfRecordTypeDeleteObject = GDIP_WMF_RECORD_TO_EMFPLUS(META_DELETEOBJECT),
+ WmfRecordTypeCreatePalette = GDIP_WMF_RECORD_TO_EMFPLUS(META_CREATEPALETTE),
+ WmfRecordTypeCreateBrush = GDIP_WMF_RECORD_TO_EMFPLUS(0x00F8), // META_CREATEBRUSH
+ WmfRecordTypeCreatePatternBrush = GDIP_WMF_RECORD_TO_EMFPLUS(META_CREATEPATTERNBRUSH),
+ WmfRecordTypeCreatePenIndirect = GDIP_WMF_RECORD_TO_EMFPLUS(META_CREATEPENINDIRECT),
+ WmfRecordTypeCreateFontIndirect = GDIP_WMF_RECORD_TO_EMFPLUS(META_CREATEFONTINDIRECT),
+ WmfRecordTypeCreateBrushIndirect = GDIP_WMF_RECORD_TO_EMFPLUS(META_CREATEBRUSHINDIRECT),
+ WmfRecordTypeCreateBitmapIndirect = GDIP_WMF_RECORD_TO_EMFPLUS(0x02FD), // META_CREATEBITMAPINDIRECT
+ WmfRecordTypeCreateBitmap = GDIP_WMF_RECORD_TO_EMFPLUS(0x06FE), // META_CREATEBITMAP
+ WmfRecordTypeCreateRegion = GDIP_WMF_RECORD_TO_EMFPLUS(META_CREATEREGION),
+
+ EmfRecordTypeHeader = EMR_HEADER,
+ EmfRecordTypePolyBezier = EMR_POLYBEZIER,
+ EmfRecordTypePolygon = EMR_POLYGON,
+ EmfRecordTypePolyline = EMR_POLYLINE,
+ EmfRecordTypePolyBezierTo = EMR_POLYBEZIERTO,
+ EmfRecordTypePolyLineTo = EMR_POLYLINETO,
+ EmfRecordTypePolyPolyline = EMR_POLYPOLYLINE,
+ EmfRecordTypePolyPolygon = EMR_POLYPOLYGON,
+ EmfRecordTypeSetWindowExtEx = EMR_SETWINDOWEXTEX,
+ EmfRecordTypeSetWindowOrgEx = EMR_SETWINDOWORGEX,
+ EmfRecordTypeSetViewportExtEx = EMR_SETVIEWPORTEXTEX,
+ EmfRecordTypeSetViewportOrgEx = EMR_SETVIEWPORTORGEX,
+ EmfRecordTypeSetBrushOrgEx = EMR_SETBRUSHORGEX,
+ EmfRecordTypeEOF = EMR_EOF,
+ EmfRecordTypeSetPixelV = EMR_SETPIXELV,
+ EmfRecordTypeSetMapperFlags = EMR_SETMAPPERFLAGS,
+ EmfRecordTypeSetMapMode = EMR_SETMAPMODE,
+ EmfRecordTypeSetBkMode = EMR_SETBKMODE,
+ EmfRecordTypeSetPolyFillMode = EMR_SETPOLYFILLMODE,
+ EmfRecordTypeSetROP2 = EMR_SETROP2,
+ EmfRecordTypeSetStretchBltMode = EMR_SETSTRETCHBLTMODE,
+ EmfRecordTypeSetTextAlign = EMR_SETTEXTALIGN,
+ EmfRecordTypeSetColorAdjustment = EMR_SETCOLORADJUSTMENT,
+ EmfRecordTypeSetTextColor = EMR_SETTEXTCOLOR,
+ EmfRecordTypeSetBkColor = EMR_SETBKCOLOR,
+ EmfRecordTypeOffsetClipRgn = EMR_OFFSETCLIPRGN,
+ EmfRecordTypeMoveToEx = EMR_MOVETOEX,
+ EmfRecordTypeSetMetaRgn = EMR_SETMETARGN,
+ EmfRecordTypeExcludeClipRect = EMR_EXCLUDECLIPRECT,
+ EmfRecordTypeIntersectClipRect = EMR_INTERSECTCLIPRECT,
+ EmfRecordTypeScaleViewportExtEx = EMR_SCALEVIEWPORTEXTEX,
+ EmfRecordTypeScaleWindowExtEx = EMR_SCALEWINDOWEXTEX,
+ EmfRecordTypeSaveDC = EMR_SAVEDC,
+ EmfRecordTypeRestoreDC = EMR_RESTOREDC,
+ EmfRecordTypeSetWorldTransform = EMR_SETWORLDTRANSFORM,
+ EmfRecordTypeModifyWorldTransform = EMR_MODIFYWORLDTRANSFORM,
+ EmfRecordTypeSelectObject = EMR_SELECTOBJECT,
+ EmfRecordTypeCreatePen = EMR_CREATEPEN,
+ EmfRecordTypeCreateBrushIndirect = EMR_CREATEBRUSHINDIRECT,
+ EmfRecordTypeDeleteObject = EMR_DELETEOBJECT,
+ EmfRecordTypeAngleArc = EMR_ANGLEARC,
+ EmfRecordTypeEllipse = EMR_ELLIPSE,
+ EmfRecordTypeRectangle = EMR_RECTANGLE,
+ EmfRecordTypeRoundRect = EMR_ROUNDRECT,
+ EmfRecordTypeArc = EMR_ARC,
+ EmfRecordTypeChord = EMR_CHORD,
+ EmfRecordTypePie = EMR_PIE,
+ EmfRecordTypeSelectPalette = EMR_SELECTPALETTE,
+ EmfRecordTypeCreatePalette = EMR_CREATEPALETTE,
+ EmfRecordTypeSetPaletteEntries = EMR_SETPALETTEENTRIES,
+ EmfRecordTypeResizePalette = EMR_RESIZEPALETTE,
+ EmfRecordTypeRealizePalette = EMR_REALIZEPALETTE,
+ EmfRecordTypeExtFloodFill = EMR_EXTFLOODFILL,
+ EmfRecordTypeLineTo = EMR_LINETO,
+ EmfRecordTypeArcTo = EMR_ARCTO,
+ EmfRecordTypePolyDraw = EMR_POLYDRAW,
+ EmfRecordTypeSetArcDirection = EMR_SETARCDIRECTION,
+ EmfRecordTypeSetMiterLimit = EMR_SETMITERLIMIT,
+ EmfRecordTypeBeginPath = EMR_BEGINPATH,
+ EmfRecordTypeEndPath = EMR_ENDPATH,
+ EmfRecordTypeCloseFigure = EMR_CLOSEFIGURE,
+ EmfRecordTypeFillPath = EMR_FILLPATH,
+ EmfRecordTypeStrokeAndFillPath = EMR_STROKEANDFILLPATH,
+ EmfRecordTypeStrokePath = EMR_STROKEPATH,
+ EmfRecordTypeFlattenPath = EMR_FLATTENPATH,
+ EmfRecordTypeWidenPath = EMR_WIDENPATH,
+ EmfRecordTypeSelectClipPath = EMR_SELECTCLIPPATH,
+ EmfRecordTypeAbortPath = EMR_ABORTPATH,
+ EmfRecordTypeReserved_069 = 69, // Not Used
+ EmfRecordTypeGdiComment = EMR_GDICOMMENT,
+ EmfRecordTypeFillRgn = EMR_FILLRGN,
+ EmfRecordTypeFrameRgn = EMR_FRAMERGN,
+ EmfRecordTypeInvertRgn = EMR_INVERTRGN,
+ EmfRecordTypePaintRgn = EMR_PAINTRGN,
+ EmfRecordTypeExtSelectClipRgn = EMR_EXTSELECTCLIPRGN,
+ EmfRecordTypeBitBlt = EMR_BITBLT,
+ EmfRecordTypeStretchBlt = EMR_STRETCHBLT,
+ EmfRecordTypeMaskBlt = EMR_MASKBLT,
+ EmfRecordTypePlgBlt = EMR_PLGBLT,
+ EmfRecordTypeSetDIBitsToDevice = EMR_SETDIBITSTODEVICE,
+ EmfRecordTypeStretchDIBits = EMR_STRETCHDIBITS,
+ EmfRecordTypeExtCreateFontIndirect = EMR_EXTCREATEFONTINDIRECTW,
+ EmfRecordTypeExtTextOutA = EMR_EXTTEXTOUTA,
+ EmfRecordTypeExtTextOutW = EMR_EXTTEXTOUTW,
+ EmfRecordTypePolyBezier16 = EMR_POLYBEZIER16,
+ EmfRecordTypePolygon16 = EMR_POLYGON16,
+ EmfRecordTypePolyline16 = EMR_POLYLINE16,
+ EmfRecordTypePolyBezierTo16 = EMR_POLYBEZIERTO16,
+ EmfRecordTypePolylineTo16 = EMR_POLYLINETO16,
+ EmfRecordTypePolyPolyline16 = EMR_POLYPOLYLINE16,
+ EmfRecordTypePolyPolygon16 = EMR_POLYPOLYGON16,
+ EmfRecordTypePolyDraw16 = EMR_POLYDRAW16,
+ EmfRecordTypeCreateMonoBrush = EMR_CREATEMONOBRUSH,
+ EmfRecordTypeCreateDIBPatternBrushPt = EMR_CREATEDIBPATTERNBRUSHPT,
+ EmfRecordTypeExtCreatePen = EMR_EXTCREATEPEN,
+ EmfRecordTypePolyTextOutA = EMR_POLYTEXTOUTA,
+ EmfRecordTypePolyTextOutW = EMR_POLYTEXTOUTW,
+ EmfRecordTypeSetICMMode = 98, // EMR_SETICMMODE,
+ EmfRecordTypeCreateColorSpace = 99, // EMR_CREATECOLORSPACE,
+ EmfRecordTypeSetColorSpace = 100, // EMR_SETCOLORSPACE,
+ EmfRecordTypeDeleteColorSpace = 101, // EMR_DELETECOLORSPACE,
+ EmfRecordTypeGLSRecord = 102, // EMR_GLSRECORD,
+ EmfRecordTypeGLSBoundedRecord = 103, // EMR_GLSBOUNDEDRECORD,
+ EmfRecordTypePixelFormat = 104, // EMR_PIXELFORMAT,
+ EmfRecordTypeDrawEscape = 105, // EMR_RESERVED_105,
+ EmfRecordTypeExtEscape = 106, // EMR_RESERVED_106,
+ EmfRecordTypeStartDoc = 107, // EMR_RESERVED_107,
+ EmfRecordTypeSmallTextOut = 108, // EMR_RESERVED_108,
+ EmfRecordTypeForceUFIMapping = 109, // EMR_RESERVED_109,
+ EmfRecordTypeNamedEscape = 110, // EMR_RESERVED_110,
+ EmfRecordTypeColorCorrectPalette = 111, // EMR_COLORCORRECTPALETTE,
+ EmfRecordTypeSetICMProfileA = 112, // EMR_SETICMPROFILEA,
+ EmfRecordTypeSetICMProfileW = 113, // EMR_SETICMPROFILEW,
+ EmfRecordTypeAlphaBlend = 114, // EMR_ALPHABLEND,
+ EmfRecordTypeSetLayout = 115, // EMR_SETLAYOUT,
+ EmfRecordTypeTransparentBlt = 116, // EMR_TRANSPARENTBLT,
+ EmfRecordTypeReserved_117 = 117, // Not Used
+ EmfRecordTypeGradientFill = 118, // EMR_GRADIENTFILL,
+ EmfRecordTypeSetLinkedUFIs = 119, // EMR_RESERVED_119,
+ EmfRecordTypeSetTextJustification = 120, // EMR_RESERVED_120,
+ EmfRecordTypeColorMatchToTargetW = 121, // EMR_COLORMATCHTOTARGETW,
+ EmfRecordTypeCreateColorSpaceW = 122, // EMR_CREATECOLORSPACEW,
+ EmfRecordTypeMax = 122,
+ EmfRecordTypeMin = 1,
+
+ // That is the END of the GDI EMF records.
+
+ // Now we start the list of EMF+ records. We leave quite
+ // a bit of room here for the addition of any new GDI
+ // records that may be added later.
+
+ EmfPlusRecordTypeInvalid = GDIP_EMFPLUS_RECORD_BASE,
+ EmfPlusRecordTypeHeader,
+ EmfPlusRecordTypeEndOfFile,
+
+ EmfPlusRecordTypeComment,
+
+ EmfPlusRecordTypeGetDC, // the application grabbed the metafile dc
+
+ EmfPlusRecordTypeMultiFormatStart,
+ EmfPlusRecordTypeMultiFormatSection,
+ EmfPlusRecordTypeMultiFormatEnd,
+
+ // For all persistent objects
+ EmfPlusRecordTypeObject, // brush,pen,path,region,image,font,string-format
+
+ // Drawing Records
+ EmfPlusRecordTypeClear,
+ EmfPlusRecordTypeFillRects,
+ EmfPlusRecordTypeDrawRects,
+ EmfPlusRecordTypeFillPolygon,
+ EmfPlusRecordTypeDrawLines,
+ EmfPlusRecordTypeFillEllipse,
+ EmfPlusRecordTypeDrawEllipse,
+ EmfPlusRecordTypeFillPie,
+ EmfPlusRecordTypeDrawPie,
+ EmfPlusRecordTypeDrawArc,
+ EmfPlusRecordTypeFillRegion,
+ EmfPlusRecordTypeFillPath,
+ EmfPlusRecordTypeDrawPath,
+ EmfPlusRecordTypeFillClosedCurve,
+ EmfPlusRecordTypeDrawClosedCurve,
+ EmfPlusRecordTypeDrawCurve,
+ EmfPlusRecordTypeDrawBeziers,
+ EmfPlusRecordTypeDrawImage,
+ EmfPlusRecordTypeDrawImagePoints,
+ EmfPlusRecordTypeDrawString,
+
+ // Graphics State Records
+ EmfPlusRecordTypeSetRenderingOrigin,
+ EmfPlusRecordTypeSetAntiAliasMode,
+ EmfPlusRecordTypeSetTextRenderingHint,
+#ifdef DCR_USE_NEW_188922
+ EmfPlusRecordTypeSetTextContrast,
+#else
+ EmfPlusRecordTypeSetGammaValue,
+#endif // DCR_USE_NEW_188922
+ EmfPlusRecordTypeSetInterpolationMode,
+ EmfPlusRecordTypeSetPixelOffsetMode,
+ EmfPlusRecordTypeSetCompositingMode,
+ EmfPlusRecordTypeSetCompositingQuality,
+ EmfPlusRecordTypeSave,
+ EmfPlusRecordTypeRestore,
+ EmfPlusRecordTypeBeginContainer,
+ EmfPlusRecordTypeBeginContainerNoParams,
+ EmfPlusRecordTypeEndContainer,
+ EmfPlusRecordTypeSetWorldTransform,
+ EmfPlusRecordTypeResetWorldTransform,
+ EmfPlusRecordTypeMultiplyWorldTransform,
+ EmfPlusRecordTypeTranslateWorldTransform,
+ EmfPlusRecordTypeScaleWorldTransform,
+ EmfPlusRecordTypeRotateWorldTransform,
+ EmfPlusRecordTypeSetPageTransform,
+ EmfPlusRecordTypeResetClip,
+ EmfPlusRecordTypeSetClipRect,
+ EmfPlusRecordTypeSetClipPath,
+ EmfPlusRecordTypeSetClipRegion,
+ EmfPlusRecordTypeOffsetClip,
+
+ // New record types must be added here (at the end) -- do not add above,
+ // since that will invalidate previous metafiles!
+ EmfPlusRecordTypeDrawDriverString,
+
+ // Have this here so you don't need to keep changing the value of
+ // EmfPlusRecordTypeMax every time you add a new record.
+
+ EmfPlusRecordTotal,
+
+ EmfPlusRecordTypeMax = EmfPlusRecordTotal-1,
+ EmfPlusRecordTypeMin = EmfPlusRecordTypeHeader,
+};
+
+//---------------------------------------------------------------------------
+// StringFormatFlags
+//---------------------------------------------------------------------------
+
+//---------------------------------------------------------------------------
+// String format flags
+//
+// DirectionRightToLeft - For horizontal text, the reading order is
+// right to left. This value is called
+// the base embedding level by the Unicode
+// bidirectional engine.
+// For vertical text, columns are read from
+// right to left.
+// By default, horizontal or vertical text is
+// read from left to right.
+//
+// DirectionVertical - Individual lines of text are vertical. In
+// each line, characters progress from top to
+// bottom.
+// By default, lines of text are horizontal,
+// each new line below the previous line.
+//
+// NoFitBlackBox - Allows parts of glyphs to overhang the
+// bounding rectangle.
+// By default glyphs are first aligned
+// inside the margines, then any glyphs which
+// still overhang the bounding box are
+// repositioned to avoid any overhang.
+// For example when an italic
+// lower case letter f in a font such as
+// Garamond is aligned at the far left of a
+// rectangle, the lower part of the f will
+// reach slightly further left than the left
+// edge of the rectangle. Setting this flag
+// will ensure the character aligns visually
+// with the lines above and below, but may
+// cause some pixels outside the formatting
+// rectangle to be clipped or painted.
+//
+#ifndef DCR_USE_NEW_137252
+// NumberContextArabic - Causes any initial numeric in the string to
+// be analysed for bidirection layout as if
+// it was preceeded by Arabic text.
+//
+// DisableKashidaJustification - Arabic text will not be justified by the
+// insertion of kashidas (i.e. extending the
+// joining line between characters). Instead
+// Arabic script will be justified by the
+// widening of the whitespace between words.
+//
+#endif
+// DisplayFormatControl - Causes control characters such as the
+// left-to-right mark to be shown in the
+// output with a representative glyph.
+//
+#ifndef DCR_USE_NEW_137252
+// DisableKerning - Disables Truetype and OpenType kerning.
+//
+// DisableLigatures - Disables Truetype and OpenType ligatures.
+//
+// LayoutLegacyBidi - Causes the bidirection algorithm to use
+// slightly different classifications for
+// '+', '-' and '/' that make their layout
+// much closer to that expected by files
+// generated in Windows or by Windows
+// applications.
+//
+// NoChanges - A text imager created with this flag set
+// does not support those APIs that change
+// it's contents or formatting, but for most
+// simple text will be significantly faster in
+// performing measurement and drawing
+// functions.
+//
+#endif
+// NoFontFallback - Disables fallback to alternate fonts for
+// characters not supported in the requested
+// font. Any missing characters will be
+// be displayed with the fonts missing glyph,
+// usually an open square.
+//
+// NoWrap - Disables wrapping of text between lines
+// when formatting within a rectangle.
+// NoWrap is implied when a point is passed
+// instead of a rectangle, or when the
+// specified rectangle has a zero line length.
+//
+// NoClip - By default text is clipped to the
+// formatting rectangle. Setting NoClip
+// allows overhanging pixels to affect the
+// device outside the formatting rectangle.
+// Pixels at the end of the line may be
+// affected if the glyphs overhang their
+// cells, and either the NoFitBlackBox flag
+// has been set, or the glyph extends to far
+// to be fitted.
+// Pixels above/before the first line or
+// below/after the last line may be affected
+// if the glyphs extend beyond their cell
+// ascent / descent. This can occur rarely
+// with unusual diacritic mark combinations.
+
+//---------------------------------------------------------------------------
+
+enum StringFormatFlags
+{
+ StringFormatFlagsDirectionRightToLeft = 0x00000001,
+ StringFormatFlagsDirectionVertical = 0x00000002,
+ StringFormatFlagsNoFitBlackBox = 0x00000004,
+#ifndef DCR_USE_NEW_137252
+ StringFormatFlagsNumberContextArabic = 0x00000008,
+ StringFormatFlagsDisableKashidaJustification = 0x00000010,
+#endif
+ StringFormatFlagsDisplayFormatControl = 0x00000020,
+#ifndef DCR_USE_NEW_137252
+ StringFormatFlagsDisableKerning = 0x00000040,
+ StringFormatFlagsDisableLigatures = 0x00000080,
+ StringFormatFlagsLayoutLegacyBidi = 0x00000100,
+ StringFormatFlagsNoChanges = 0x00000200,
+#endif
+ StringFormatFlagsNoFontFallback = 0x00000400,
+ StringFormatFlagsMeasureTrailingSpaces = 0x00000800,
+ StringFormatFlagsNoWrap = 0x00001000,
+ StringFormatFlagsLineLimit = 0x00002000,
+
+ StringFormatFlagsNoClip = 0x00004000
+};
+
+//---------------------------------------------------------------------------
+// StringTrimming
+//---------------------------------------------------------------------------
+
+enum StringTrimming {
+ StringTrimmingNone = 0,
+ StringTrimmingCharacter = 1,
+ StringTrimmingWord = 2,
+ StringTrimmingEllipsisCharacter = 3,
+ StringTrimmingEllipsisWord = 4,
+ StringTrimmingEllipsisPath = 5
+};
+
+#ifndef DCR_USE_NEW_137252
+//---------------------------------------------------------------------------
+// String units
+//
+// String units are like length units in CSS, they may be absolute, or
+// they may be relative to a font size.
+//
+//---------------------------------------------------------------------------
+
+enum StringUnit {
+ StringUnitWorld = UnitWorld,
+ StringUnitDisplay = UnitDisplay,
+ StringUnitPixel = UnitPixel,
+ StringUnitPoint = UnitPoint,
+ StringUnitInch = UnitInch,
+ StringUnitDocument = UnitDocument,
+ StringUnitMillimeter = UnitMillimeter,
+ StringUnitEm = 32
+};
+#endif
+
+#ifndef DCR_USE_NEW_152154
+//---------------------------------------------------------------------------
+// Line spacing flags
+//---------------------------------------------------------------------------
+
+enum LineSpacing {
+ LineSpacingWorld = UnitWorld,
+ LineSpacingDisplay = UnitDisplay,
+ LineSpacingPixel = UnitPixel,
+ LineSpacingPoint = UnitPoint,
+ LineSpacingInch = UnitInch,
+ LineSpacingDocument = UnitDocument,
+ LineSpacingMillimeter = UnitMillimeter,
+
+ LineSpacingRecommended = 32,
+ LineSpacingAtLeast = 33,
+ LineSpacingAtLeastMultiple = 34,
+ LineSpacingCell = 35,
+ LineSpacingCellAtLeast = 36,
+ LineSpacingCellAtLeastMultiple = 37
+};
+
+/// The following methods of linespacing are relative to the font size
+//
+// =========== Method =========== =============== Relative to ===============
+//
+// LineSpacingRecommended recommended line spacing specified by font
+// LineSpacingAtLeast max(recommended, tallest glyph cell)
+// LineSpacingAtLeastMultiple smallest multiple of recommended big enough
+// for all glyph cells on the line
+// LineSpacingCell cell height
+// LineSpacingCellAtLeast max(font cell height, tallest glyph cell)
+// LineSpacingCellAtLeastMultiple smallest multiple of cell height big enough
+// for all glyph cells on the line
+#endif
+
+
+//---------------------------------------------------------------------------
+// National language digit substitution
+//---------------------------------------------------------------------------
+
+enum StringDigitSubstitute
+{
+ StringDigitSubstituteUser = 0, // As NLS setting
+ StringDigitSubstituteNone = 1,
+ StringDigitSubstituteNational = 2,
+ StringDigitSubstituteTraditional = 3
+};
+
+//---------------------------------------------------------------------------
+// Hotkey prefix interpretation
+//---------------------------------------------------------------------------
+
+enum HotkeyPrefix
+{
+ HotkeyPrefixNone = 0,
+ HotkeyPrefixShow = 1,
+ HotkeyPrefixHide = 2
+};
+
+//---------------------------------------------------------------------------
+// Text alignment flags
+//---------------------------------------------------------------------------
+
+enum StringAlignment
+{
+ // Left edge for left-to-right text,
+ // right for right-to-left text,
+ // and top for vertical
+ StringAlignmentNear = 0,
+ StringAlignmentCenter = 1,
+ StringAlignmentFar = 2
+};
+
+//---------------------------------------------------------------------------
+// DriverStringOptions
+//---------------------------------------------------------------------------
+
+enum DriverStringOptions
+{
+ DriverStringOptionsCmapLookup = 1,
+ DriverStringOptionsVertical = 2,
+ DriverStringOptionsRealizedAdvance = 4,
+#ifndef DCR_USE_NEW_137252
+ DriverStringOptionsCompensateResolution = 8
+#endif
+};
+
+//---------------------------------------------------------------------------
+// Flush Intention flags
+//---------------------------------------------------------------------------
+
+enum FlushIntention
+{
+ FlushIntentionFlush = 0, // Flush all batched rendering operations
+ FlushIntentionSync = 1 // Flush all batched rendering operations
+ // and wait for them to complete
+};
+
+#ifndef DCR_USE_NEW_175866
+
+//---------------------------------------------------------------------------
+// Window Change Notification types
+//---------------------------------------------------------------------------
+
+enum WindowNotifyEnum
+{
+ WindowNotifyEnumEnable = 0,
+ WindowNotifyEnumDisable,
+ WindowNotifyEnumPalette,
+ WindowNotifyEnumDisplay,
+ WindowNotifyEnumSysColor
+};
+
+#endif
+
+//---------------------------------------------------------------------------
+// Image encoder parameter related types
+//---------------------------------------------------------------------------
+
+#ifdef DCR_USE_NEW_145804
+enum EncoderParameterValueType
+{
+ EncoderParameterValueTypeByte = 1, // 8-bit unsigned int
+ EncoderParameterValueTypeASCII = 2, // 8-bit byte containing one 7-bit ASCII
+ // code. NULL terminated.
+ EncoderParameterValueTypeShort = 3, // 16-bit unsigned int
+ EncoderParameterValueTypeLong = 4, // 32-bit unsigned int
+ EncoderParameterValueTypeRational = 5, // Two Longs. The first Long is the
+ // numerator, the second Long expresses the
+ // denomintor.
+ EncoderParameterValueTypeLongRange = 6, // Two longs which specify a range of
+ // integer values. The first Long specifies
+ // the lower end and the second one
+ // specifies the higher end. All values
+ // are inclusive at both ends
+ EncoderParameterValueTypeUndefined = 7, // 8-bit byte that can take any value
+ // depending on field definition
+ EncoderParameterValueTypeRationalRange = 8 // Two Rationals. The first Rational
+ // specifies the lower end and the second
+ // specifies the higher end. All values
+ // are inclusive at both ends
+};
+#else
+enum ValueType
+{
+ ValueTypeByte = 1, // 8-bit unsigned int
+ ValueTypeASCII = 2, // 8-bit byte containing one 7-bit ASCII
+ // code. NULL terminated.
+ ValueTypeShort = 3, // 16-bit unsigned int
+ ValueTypeLong = 4, // 32-bit unsigned int
+ ValueTypeRational = 5, // Two Longs. The first Long is the
+ // numerator, the second Long expresses the
+ // denomintor.
+ ValueTypeLongRange = 6, // Two longs which specify a range of
+ // integer values. The first Long specifies
+ // the lower end and the second one
+ // specifies the higher end. All values
+ // are inclusive at both ends
+ ValueTypeUndefined = 7, // 8-bit byte that can take any value
+ // depending on field definition
+ ValueTypeRationalRange = 8 // Two Rationals. The first Rational
+ // specifies the lower end and the second
+ // specifies the higher end. All values
+ // are inclusive at both ends
+};
+#endif
+
+//---------------------------------------------------------------------------
+// Image encoder value types
+//---------------------------------------------------------------------------
+
+enum EncoderValue
+{
+ EncoderValueColorTypeCMYK,
+ EncoderValueColorTypeYCCK,
+ EncoderValueCompressionLZW,
+ EncoderValueCompressionCCITT3,
+ EncoderValueCompressionCCITT4,
+ EncoderValueCompressionRle,
+ EncoderValueCompressionNone,
+ EncoderValueScanMethodInterlaced,
+ EncoderValueScanMethodNonInterlaced,
+ EncoderValueVersionGif87,
+ EncoderValueVersionGif89,
+ EncoderValueRenderProgressive,
+ EncoderValueRenderNonProgressive,
+ EncoderValueTransformRotate90,
+ EncoderValueTransformRotate180,
+ EncoderValueTransformRotate270,
+ EncoderValueTransformFlipHorizontal,
+ EncoderValueTransformFlipVertical,
+ #ifdef DCR_USE_NEW_140861
+ EncoderValueMultiFrame,
+ #else
+ EncodeValueMultiFrame,
+ #endif
+ EncoderValueLastFrame,
+ EncoderValueFlush,
+ #ifdef DCR_USE_NEW_140861
+ EncoderValueFrameDimensionTime,
+ EncoderValueFrameDimensionResolution,
+ EncoderValueFrameDimensionPage
+ #else
+ EncodeValueFrameDimensionTime,
+ EncodeValueFrameDimensionResolution,
+ EncodeValueFrameDimensionPage
+ #endif
+};
+
+//---------------------------------------------------------------------------
+// Graphics layout values (support for Middle East localization)
+//---------------------------------------------------------------------------
+
+enum GraphicsLayout
+{
+ GraphicsLayoutNormal,
+ GraphicsLayoutMirrored,
+ GraphicsLayoutMirroredIgnoreImages,
+ GraphicsLayoutMirroredForceImages
+};
+
+//---------------------------------------------------------------------------
+// Image layout values (support for Middle East localization)
+//---------------------------------------------------------------------------
+
+enum ImageLayout
+{
+ ImageLayoutNormal,
+ ImageLayoutIgnoreMirrored
+};
+
+enum EmfToWmfBitsFlags
+{
+ EmfToWmfBitsFlagsDefault = 0x00000000,
+ EmfToWmfBitsFlagsEmbedEmf = 0x00000001,
+ EmfToWmfBitsFlagsIncludeAPM = 0x00000002,
+ EmfToWmfBitsFlagsNoXORClip = 0x00000004
+};
+
+#endif // !_GDIPLUSENUMS_H
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusFlat.h b/core/src/fxge/Microsoft SDK/include/GdiPlusFlat.h
index 8b5369e793..1dd8d466e9 100644
--- a/core/src/fxge/Microsoft SDK/include/GdiPlusFlat.h
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusFlat.h
@@ -1,2740 +1,2740 @@
-/**************************************************************************\
-*
-* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
-*
-* Module Name:
-*
-* GdiplusFlat.h
-*
-* Abstract:
-*
-* Flat GDI+ API wrappers - header file
-*
-\**************************************************************************/
-
-// TODO: this file style needs to be made internally consistent with the way
-// it handles breaking the long argument lists across multiple lines
-
-#ifndef _FLATAPI_H
-#define _FLATAPI_H
-
-#define WINGDIPAPI __stdcall
-
-// currently, only C++ wrapper API's force const.
-
-#define GDIPCONST const
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#ifndef DCR_USE_NEW_175866
-
-VOID
-WINGDIPAPI
-GdipDisplayPaletteWindowNotify(WindowNotifyEnum notify);
-
-#endif
-
-//----------------------------------------------------------------------------
-// GraphicsPath methods
-//----------------------------------------------------------------------------
-
-GpStatus WINGDIPAPI
-GdipCreatePath(GpFillMode brushMode, GpPath **path);
-
-GpStatus WINGDIPAPI
-GdipCreatePath2(GDIPCONST GpPointF*, GDIPCONST BYTE*, INT, GpFillMode,
- GpPath **path);
-
-GpStatus WINGDIPAPI
-GdipCreatePath2I(GDIPCONST GpPoint*, GDIPCONST BYTE*, INT, GpFillMode,
- GpPath **path);
-
-GpStatus WINGDIPAPI
-GdipClonePath(GpPath* path, GpPath **clonePath);
-
-GpStatus WINGDIPAPI
-GdipDeletePath(GpPath* path);
-
-GpStatus WINGDIPAPI
-GdipResetPath(GpPath* path);
-
-GpStatus WINGDIPAPI
-GdipGetPointCount(GpPath* path, INT* count);
-
-GpStatus WINGDIPAPI
-GdipGetPathTypes(GpPath* path, BYTE* types, INT count);
-
-GpStatus WINGDIPAPI
-GdipGetPathPoints(GpPath*, GpPointF* points, INT count);
-
-GpStatus WINGDIPAPI
-GdipGetPathPointsI(GpPath*, GpPoint* points, INT count);
-
-GpStatus WINGDIPAPI
-GdipGetPathFillMode(GpPath *path, GpFillMode *fillmode);
-
-GpStatus WINGDIPAPI
-GdipSetPathFillMode(GpPath *path, GpFillMode fillmode);
-
-GpStatus WINGDIPAPI
-GdipGetPathData(GpPath *path, GpPathData* pathData);
-
-GpStatus WINGDIPAPI
-GdipStartPathFigure(GpPath *path);
-
-GpStatus WINGDIPAPI
-GdipClosePathFigure(GpPath *path);
-
-GpStatus WINGDIPAPI
-GdipClosePathFigures(GpPath *path);
-
-GpStatus WINGDIPAPI
-GdipSetPathMarker(GpPath* path);
-
-GpStatus WINGDIPAPI
-GdipClearPathMarkers(GpPath* path);
-
-GpStatus WINGDIPAPI
-GdipReversePath(GpPath* path);
-
-GpStatus WINGDIPAPI
-GdipGetPathLastPoint(GpPath* path, GpPointF* lastPoint);
-
-GpStatus WINGDIPAPI
-GdipAddPathLine(GpPath *path, REAL x1, REAL y1, REAL x2, REAL y2);
-
-GpStatus WINGDIPAPI
-GdipAddPathLine2(GpPath *path, GDIPCONST GpPointF *points, INT count);
-
-GpStatus WINGDIPAPI
-GdipAddPathArc(GpPath *path, REAL x, REAL y, REAL width, REAL height,
- REAL startAngle, REAL sweepAngle);
-
-GpStatus WINGDIPAPI
-GdipAddPathBezier(GpPath *path, REAL x1, REAL y1, REAL x2, REAL y2,
- REAL x3, REAL y3, REAL x4, REAL y4);
-
-GpStatus WINGDIPAPI
-GdipAddPathBeziers(GpPath *path, GDIPCONST GpPointF *points, INT count);
-
-GpStatus WINGDIPAPI
-GdipAddPathCurve(GpPath *path, GDIPCONST GpPointF *points, INT count);
-
-GpStatus WINGDIPAPI
-GdipAddPathCurve2(GpPath *path, GDIPCONST GpPointF *points, INT count,
- REAL tension);
-
-GpStatus WINGDIPAPI
-GdipAddPathCurve3(GpPath *path, GDIPCONST GpPointF *points, INT count,
- INT offset, INT numberOfSegments, REAL tension);
-
-GpStatus WINGDIPAPI
-GdipAddPathClosedCurve(GpPath *path, GDIPCONST GpPointF *points, INT count);
-
-GpStatus WINGDIPAPI
-GdipAddPathClosedCurve2(GpPath *path, GDIPCONST GpPointF *points, INT count,
- REAL tension);
-
-GpStatus WINGDIPAPI
-GdipAddPathRectangle(GpPath *path, REAL x, REAL y, REAL width, REAL height);
-
-GpStatus WINGDIPAPI
-GdipAddPathRectangles(GpPath *path, GDIPCONST GpRectF *rects, INT count);
-
-GpStatus WINGDIPAPI
-GdipAddPathEllipse(GpPath *path, REAL x, REAL y, REAL width,
- REAL height);
-
-GpStatus WINGDIPAPI
-GdipAddPathPie(GpPath *path, REAL x, REAL y, REAL width, REAL height,
- REAL startAngle, REAL sweepAngle);
-
-GpStatus WINGDIPAPI
-GdipAddPathPolygon(GpPath *path, GDIPCONST GpPointF *points, INT count);
-
-GpStatus WINGDIPAPI
-GdipAddPathPath(GpPath *path, GDIPCONST GpPath* addingPath, BOOL connect);
-
-GpStatus WINGDIPAPI
-GdipAddPathString(GpPath *path, GDIPCONST WCHAR *string,
- INT length, GDIPCONST GpFontFamily *family, INT style,
- REAL emSize, GDIPCONST RectF *layoutRect,
- GDIPCONST GpStringFormat *format);
-
-GpStatus WINGDIPAPI
-GdipAddPathStringI(GpPath *path, GDIPCONST WCHAR *string,
- INT length, GDIPCONST GpFontFamily *family, INT style,
- REAL emSize, GDIPCONST Rect *layoutRect,
- GDIPCONST GpStringFormat *format);
-
-GpStatus WINGDIPAPI
-GdipAddPathLineI(GpPath *path, INT x1, INT y1, INT x2, INT y2);
-
-GpStatus WINGDIPAPI
-GdipAddPathLine2I(GpPath *path, GDIPCONST GpPoint *points, INT count);
-
-GpStatus WINGDIPAPI
-GdipAddPathArcI(GpPath *path, INT x, INT y, INT width, INT height,
- REAL startAngle, REAL sweepAngle);
-
-GpStatus WINGDIPAPI
-GdipAddPathBezierI(GpPath *path, INT x1, INT y1, INT x2, INT y2,
- INT x3, INT y3, INT x4, INT y4);
-
-GpStatus WINGDIPAPI
-GdipAddPathBeziersI(GpPath *path, GDIPCONST GpPoint *points, INT count);
-
-GpStatus WINGDIPAPI
-GdipAddPathCurveI(GpPath *path, GDIPCONST GpPoint *points, INT count);
-
-GpStatus WINGDIPAPI
-GdipAddPathCurve2I(GpPath *path, GDIPCONST GpPoint *points, INT count,
- REAL tension);
-
-GpStatus WINGDIPAPI
-GdipAddPathCurve3I(GpPath *path, GDIPCONST GpPoint *points, INT count,
- INT offset, INT numberOfSegments, REAL tension);
-
-GpStatus WINGDIPAPI
-GdipAddPathClosedCurveI(GpPath *path, GDIPCONST GpPoint *points, INT count);
-
-GpStatus WINGDIPAPI
-GdipAddPathClosedCurve2I(GpPath *path, GDIPCONST GpPoint *points, INT count,
- REAL tension);
-
-GpStatus WINGDIPAPI
-GdipAddPathRectangleI(GpPath *path, INT x, INT y, INT width, INT height);
-
-GpStatus WINGDIPAPI
-GdipAddPathRectanglesI(GpPath *path, GDIPCONST GpRect *rects, INT count);
-
-GpStatus WINGDIPAPI
-GdipAddPathEllipseI(GpPath *path, INT x, INT y, INT width, INT height);
-
-GpStatus WINGDIPAPI
-GdipAddPathPieI(GpPath *path, INT x, INT y, INT width, INT height,
- REAL startAngle, REAL sweepAngle);
-
-GpStatus WINGDIPAPI
-GdipAddPathPolygonI(GpPath *path, GDIPCONST GpPoint *points, INT count);
-
-GpStatus WINGDIPAPI
-GdipFlattenPath(GpPath *path, GpMatrix* matrix, REAL flatness);
-
-GpStatus WINGDIPAPI
-GdipWindingModeOutline(
- GpPath *path,
- GpMatrix *matrix,
- REAL flatness
-);
-
-
-#ifdef DCR_USE_NEW_202903
-
-GpStatus WINGDIPAPI
-GdipWidenPath(
- GpPath *nativePath,
- GpPen *pen,
- GpMatrix *matrix,
- REAL flatness
-);
-
-#else
-
-GpStatus WINGDIPAPI
-GdipWidenPathWithMinimumResolutions(GpPath *path, GpPen *pen, REAL minXres,
- REAL minYres, GpMatrix *matrix, BOOL removeSelftIntersects);
-
-#endif
-
-GpStatus WINGDIPAPI
-GdipWarpPath(GpPath *path, GpMatrix* matrix,
- GDIPCONST GpPointF *points, INT count,
- REAL srcx, REAL srcy, REAL srcwidth, REAL srcheight,
- WarpMode warpMode, REAL flatness);
-
-GpStatus WINGDIPAPI
-GdipTransformPath(GpPath* path, GpMatrix* matrix);
-
-GpStatus WINGDIPAPI
-GdipGetPathWorldBounds(GpPath* path, GpRectF* bounds, GDIPCONST GpMatrix *matrix,
- GDIPCONST GpPen *pen);
-
-GpStatus WINGDIPAPI
-GdipGetPathWorldBoundsI(GpPath* path, GpRect* bounds, GDIPCONST GpMatrix *matrix,
- GDIPCONST GpPen *pen);
-
-GpStatus WINGDIPAPI
-GdipIsVisiblePathPoint(GpPath* path, REAL x, REAL y,
- GpGraphics *graphics, BOOL *result);
-
-GpStatus WINGDIPAPI
-GdipIsVisiblePathPointI(GpPath* path, INT x, INT y,
- GpGraphics *graphics, BOOL *result);
-
-GpStatus WINGDIPAPI
-GdipIsOutlineVisiblePathPoint(GpPath* path, REAL x, REAL y, GpPen *pen,
- GpGraphics *graphics, BOOL *result);
-
-GpStatus WINGDIPAPI
-GdipIsOutlineVisiblePathPointI(GpPath* path, INT x, INT y, GpPen *pen,
- GpGraphics *graphics, BOOL *result);
-
-
-//----------------------------------------------------------------------------
-// Path Enumeration methods
-//----------------------------------------------------------------------------
-
-GpStatus WINGDIPAPI
-GdipCreatePathIter(GpPathIterator **iterator, GpPath* path);
-
-GpStatus WINGDIPAPI
-GdipDeletePathIter(GpPathIterator *iterator);
-
-GpStatus WINGDIPAPI
-GdipPathIterNextSubpath(GpPathIterator* iterator, INT *resultCount,
- INT* startIndex, INT* endIndex, BOOL* isClosed);
-
-GpStatus WINGDIPAPI
-GdipPathIterNextSubpathPath(GpPathIterator* iterator, INT* resultCount,
- GpPath* path, BOOL* isClosed);
-
-GpStatus WINGDIPAPI
-GdipPathIterNextPathType(GpPathIterator* iterator, INT* resultCount,
- BYTE* pathType, INT* startIndex, INT* endIndex);
-
-GpStatus WINGDIPAPI
-GdipPathIterNextMarker(GpPathIterator* iterator, INT *resultCount,
- INT* startIndex, INT* endIndex);
-
-GpStatus WINGDIPAPI
-GdipPathIterNextMarkerPath(GpPathIterator* iterator, INT* resultCount,
- GpPath* path);
-
-GpStatus WINGDIPAPI
-GdipPathIterGetCount(GpPathIterator* iterator, INT* count);
-
-GpStatus WINGDIPAPI
-GdipPathIterGetSubpathCount(GpPathIterator* iterator, INT* count);
-
-GpStatus WINGDIPAPI
-GdipPathIterIsValid(GpPathIterator* iterator, BOOL* valid);
-
-GpStatus WINGDIPAPI
-GdipPathIterHasCurve(GpPathIterator* iterator, BOOL* hasCurve);
-
-GpStatus WINGDIPAPI
-GdipPathIterRewind(GpPathIterator* iterator);
-
-GpStatus WINGDIPAPI
-GdipPathIterEnumerate(GpPathIterator* iterator, INT* resultCount,
- GpPointF *points, BYTE *types, INT count);
-
-GpStatus WINGDIPAPI
-GdipPathIterCopyData(GpPathIterator* iterator, INT* resultCount,
- GpPointF* points, BYTE* types, INT startIndex, INT endIndex);
-
-//----------------------------------------------------------------------------
-// Matrix methods
-//----------------------------------------------------------------------------
-
-GpStatus WINGDIPAPI
-GdipCreateMatrix(GpMatrix **matrix);
-
-GpStatus WINGDIPAPI
-GdipCreateMatrix2(REAL m11, REAL m12, REAL m21, REAL m22, REAL dx,
- REAL dy, GpMatrix **matrix);
-
-GpStatus WINGDIPAPI
-GdipCreateMatrix3(GDIPCONST GpRectF *rect, GDIPCONST GpPointF *dstplg,
- GpMatrix **matrix);
-
-GpStatus WINGDIPAPI
-GdipCreateMatrix3I(GDIPCONST GpRect *rect, GDIPCONST GpPoint *dstplg,
- GpMatrix **matrix);
-
-GpStatus WINGDIPAPI
-GdipCloneMatrix(GpMatrix *matrix, GpMatrix **cloneMatrix);
-
-GpStatus WINGDIPAPI
-GdipDeleteMatrix(GpMatrix *matrix);
-
-GpStatus WINGDIPAPI
-GdipSetMatrixElements(GpMatrix *matrix, REAL m11, REAL m12, REAL m21, REAL m22,
- REAL dx, REAL dy);
-
-GpStatus WINGDIPAPI
-GdipMultiplyMatrix(GpMatrix *matrix, GpMatrix* matrix2,
- GpMatrixOrder order);
-
-GpStatus WINGDIPAPI
-GdipTranslateMatrix(GpMatrix *matrix, REAL offsetX, REAL offsetY,
- GpMatrixOrder order);
-
-GpStatus WINGDIPAPI
-GdipScaleMatrix(GpMatrix *matrix, REAL scaleX, REAL scaleY,
- GpMatrixOrder order);
-
-GpStatus WINGDIPAPI
-GdipRotateMatrix(GpMatrix *matrix, REAL angle, GpMatrixOrder order);
-
-GpStatus WINGDIPAPI
-GdipShearMatrix(GpMatrix *matrix, REAL shearX, REAL shearY,
- GpMatrixOrder order);
-
-GpStatus WINGDIPAPI
-GdipInvertMatrix(GpMatrix *matrix);
-
-GpStatus WINGDIPAPI
-GdipTransformMatrixPoints(GpMatrix *matrix, GpPointF *pts, INT count);
-
-GpStatus WINGDIPAPI
-GdipTransformMatrixPointsI(GpMatrix *matrix, GpPoint *pts, INT count);
-
-GpStatus WINGDIPAPI
-GdipVectorTransformMatrixPoints(GpMatrix *matrix, GpPointF *pts,
- INT count);
-
-GpStatus WINGDIPAPI
-GdipVectorTransformMatrixPointsI(GpMatrix *matrix, GpPoint *pts,
- INT count);
-
-GpStatus WINGDIPAPI
-GdipGetMatrixElements(GDIPCONST GpMatrix *matrix, REAL *matrixOut);
-
-GpStatus WINGDIPAPI
-GdipIsMatrixInvertible(GDIPCONST GpMatrix *matrix, BOOL *result);
-
-GpStatus WINGDIPAPI
-GdipIsMatrixIdentity(GDIPCONST GpMatrix *matrix, BOOL *result);
-
-GpStatus WINGDIPAPI
-GdipIsMatrixEqual(GDIPCONST GpMatrix *matrix, GDIPCONST GpMatrix *matrix2, BOOL *result);
-
-//----------------------------------------------------------------------------
-// Region methods
-//----------------------------------------------------------------------------
-
-GpStatus WINGDIPAPI
-GdipCreateRegion(GpRegion **region);
-
-GpStatus WINGDIPAPI
-GdipCreateRegionRect(GDIPCONST GpRectF *rect, GpRegion **region);
-
-GpStatus WINGDIPAPI
-GdipCreateRegionRectI(GDIPCONST GpRect *rect, GpRegion **region);
-
-GpStatus WINGDIPAPI
-GdipCreateRegionPath(GpPath *path, GpRegion **region);
-
-GpStatus WINGDIPAPI
-GdipCreateRegionRgnData(GDIPCONST BYTE *regionData, INT size, GpRegion **region);
-
-GpStatus WINGDIPAPI
-GdipCreateRegionHrgn(HRGN hRgn, GpRegion **region);
-
-GpStatus WINGDIPAPI
-GdipCloneRegion(GpRegion *region, GpRegion **cloneRegion);
-
-GpStatus WINGDIPAPI
-GdipDeleteRegion(GpRegion *region);
-
-GpStatus WINGDIPAPI
-GdipSetInfinite(GpRegion *region);
-
-GpStatus WINGDIPAPI
-GdipSetEmpty(GpRegion *region);
-
-GpStatus WINGDIPAPI
-GdipCombineRegionRect(GpRegion *region, GDIPCONST GpRectF *rect,
- CombineMode combineMode);
-
-GpStatus WINGDIPAPI
-GdipCombineRegionRectI(GpRegion *region, GDIPCONST GpRect *rect,
- CombineMode combineMode);
-
-GpStatus WINGDIPAPI
-GdipCombineRegionPath(GpRegion *region, GpPath *path, CombineMode combineMode);
-
-GpStatus WINGDIPAPI
-GdipCombineRegionRegion(GpRegion *region, GpRegion *region2,
- CombineMode combineMode);
-
-GpStatus WINGDIPAPI
-GdipTranslateRegion(GpRegion *region, REAL dx, REAL dy);
-
-GpStatus WINGDIPAPI
-GdipTranslateRegionI(GpRegion *region, INT dx, INT dy);
-
-GpStatus WINGDIPAPI
-GdipTransformRegion(GpRegion *region, GpMatrix *matrix);
-
-GpStatus WINGDIPAPI
-GdipGetRegionBounds(GpRegion *region, GpGraphics *graphics,
- GpRectF *rect);
-
-GpStatus WINGDIPAPI
-GdipGetRegionBoundsI(GpRegion *region, GpGraphics *graphics,
- GpRect *rect);
-
-GpStatus WINGDIPAPI
-GdipGetRegionHRgn(GpRegion *region, GpGraphics *graphics, HRGN *hRgn);
-
-GpStatus WINGDIPAPI
-GdipIsEmptyRegion(GpRegion *region, GpGraphics *graphics,
- BOOL *result);
-
-GpStatus WINGDIPAPI
-GdipIsInfiniteRegion(GpRegion *region, GpGraphics *graphics,
- BOOL *result);
-
-GpStatus WINGDIPAPI
-GdipIsEqualRegion(GpRegion *region, GpRegion *region2,
- GpGraphics *graphics, BOOL *result);
-
-GpStatus WINGDIPAPI
-GdipGetRegionDataSize(GpRegion *region, UINT * bufferSize);
-
-GpStatus WINGDIPAPI
-GdipGetRegionData(GpRegion *region, BYTE * buffer, UINT bufferSize, UINT * sizeFilled);
-
-GpStatus WINGDIPAPI
-GdipIsVisibleRegionPoint(GpRegion *region, REAL x, REAL y,
- GpGraphics *graphics, BOOL *result);
-
-GpStatus WINGDIPAPI
-GdipIsVisibleRegionPointI(GpRegion *region, INT x, INT y,
- GpGraphics *graphics, BOOL *result);
-
-GpStatus WINGDIPAPI
-GdipIsVisibleRegionRect(GpRegion *region, REAL x, REAL y, REAL width,
- REAL height, GpGraphics *graphics, BOOL *result);
-
-GpStatus WINGDIPAPI
-GdipIsVisibleRegionRectI(GpRegion *region, INT x, INT y, INT width,
- INT height, GpGraphics *graphics, BOOL *result);
-
-GpStatus WINGDIPAPI
-GdipGetRegionScansCount(GpRegion *region, UINT* count, GpMatrix* matrix);
-
-GpStatus WINGDIPAPI
-GdipGetRegionScans(GpRegion *region, GpRectF* rects, INT* count, GpMatrix* matrix);
-
-GpStatus WINGDIPAPI
-GdipGetRegionScansI(GpRegion *region, GpRect* rects, INT* count, GpMatrix* matrix);
-
-//----------------------------------------------------------------------------
-// Brush methods
-//----------------------------------------------------------------------------
-
-GpStatus WINGDIPAPI
-GdipCloneBrush(GpBrush *brush, GpBrush **cloneBrush);
-
-GpStatus WINGDIPAPI
-GdipDeleteBrush(GpBrush *brush);
-
-GpStatus WINGDIPAPI
-GdipGetBrushType(GpBrush *brush, GpBrushType *type);
-
-//----------------------------------------------------------------------------
-// Hatch Brush methods
-//----------------------------------------------------------------------------
-
-GpStatus WINGDIPAPI
-GdipCreateHatchBrush(GpHatchStyle hatchstyle, ARGB forecol,
- ARGB backcol, GpHatch **brush);
-
-GpStatus WINGDIPAPI
-GdipGetHatchStyle(GpHatch *brush, GpHatchStyle *hatchstyle);
-
-GpStatus WINGDIPAPI
-GdipGetHatchForegroundColor(GpHatch *brush, ARGB* forecol);
-
-GpStatus WINGDIPAPI
-GdipGetHatchBackgroundColor(GpHatch *brush, ARGB* backcol);
-
-//----------------------------------------------------------------------------
-// Texture Brush methods
-//----------------------------------------------------------------------------
-
-GpStatus WINGDIPAPI
-GdipCreateTexture(GpImage *image, GpWrapMode wrapmode,
- GpTexture **texture);
-
-GpStatus WINGDIPAPI
-GdipCreateTexture2(GpImage *image, GpWrapMode wrapmode, REAL x,
- REAL y, REAL width, REAL height, GpTexture **texture);
-
-GpStatus WINGDIPAPI
-GdipCreateTextureIA(GpImage *image, GDIPCONST GpImageAttributes *imageAttributes,
- REAL x, REAL y, REAL width, REAL height,
- GpTexture **texture);
-
-GpStatus WINGDIPAPI
-GdipCreateTexture2I(GpImage *image, GpWrapMode wrapmode, INT x,
- INT y, INT width, INT height, GpTexture **texture);
-
-GpStatus WINGDIPAPI
-GdipCreateTextureIAI(GpImage *image, GDIPCONST GpImageAttributes *imageAttributes,
- INT x, INT y, INT width, INT height,
- GpTexture **texture);
-
-
-GpStatus WINGDIPAPI
-GdipGetTextureTransform(GpTexture *brush, GpMatrix *matrix);
-
-GpStatus WINGDIPAPI
-GdipSetTextureTransform(GpTexture *brush, GDIPCONST GpMatrix *matrix);
-
-GpStatus WINGDIPAPI
-GdipResetTextureTransform(GpTexture* brush);
-
-GpStatus WINGDIPAPI
-GdipMultiplyTextureTransform(GpTexture* brush, GDIPCONST GpMatrix *matrix,
- GpMatrixOrder order);
-
-GpStatus WINGDIPAPI
-GdipTranslateTextureTransform(GpTexture* brush, REAL dx, REAL dy,
- GpMatrixOrder order);
-
-GpStatus WINGDIPAPI
-GdipScaleTextureTransform(GpTexture* brush, REAL sx, REAL sy,
- GpMatrixOrder order);
-
-GpStatus WINGDIPAPI
-GdipRotateTextureTransform(GpTexture* brush, REAL angle, GpMatrixOrder order);
-
-GpStatus WINGDIPAPI
-GdipSetTextureWrapMode(GpTexture *brush, GpWrapMode wrapmode);
-
-GpStatus WINGDIPAPI
-GdipGetTextureWrapMode(GpTexture *brush, GpWrapMode *wrapmode);
-
-GpStatus WINGDIPAPI
-GdipGetTextureImage(GpTexture *brush, GpImage **image);
-
-//----------------------------------------------------------------------------
-// Solid Brush methods
-//----------------------------------------------------------------------------
-
-GpStatus WINGDIPAPI
-GdipCreateSolidFill(ARGB color, GpSolidFill **brush);
-
-GpStatus WINGDIPAPI
-GdipSetSolidFillColor(GpSolidFill *brush, ARGB color);
-
-GpStatus WINGDIPAPI
-GdipGetSolidFillColor(GpSolidFill *brush, ARGB *color);
-
-//----------------------------------------------------------------------------
-// LineBrush methods
-//----------------------------------------------------------------------------
-
-GpStatus WINGDIPAPI
-GdipCreateLineBrush(GDIPCONST GpPointF* point1,
- GDIPCONST GpPointF* point2,
- ARGB color1, ARGB color2,
- GpWrapMode wrapMode,
- GpLineGradient **lineGradient);
-
-GpStatus WINGDIPAPI
-GdipCreateLineBrushI(GDIPCONST GpPoint* point1,
- GDIPCONST GpPoint* point2,
- ARGB color1, ARGB color2,
- GpWrapMode wrapMode,
- GpLineGradient **lineGradient);
-
-GpStatus WINGDIPAPI
-GdipCreateLineBrushFromRect(GDIPCONST GpRectF* rect,
- ARGB color1, ARGB color2,
- LinearGradientMode mode,
- GpWrapMode wrapMode,
- GpLineGradient **lineGradient);
-
-GpStatus WINGDIPAPI
-GdipCreateLineBrushFromRectI(GDIPCONST GpRect* rect,
- ARGB color1, ARGB color2,
- LinearGradientMode mode,
- GpWrapMode wrapMode,
- GpLineGradient **lineGradient);
-
-GpStatus WINGDIPAPI
-GdipCreateLineBrushFromRectWithAngle(GDIPCONST GpRectF* rect,
- ARGB color1, ARGB color2,
- REAL angle,
- BOOL isAngleScalable,
- GpWrapMode wrapMode,
- GpLineGradient **lineGradient);
-
-GpStatus WINGDIPAPI
-GdipCreateLineBrushFromRectWithAngleI(GDIPCONST GpRect* rect,
- ARGB color1, ARGB color2,
- REAL angle,
- BOOL isAngleScalable,
- GpWrapMode wrapMode,
- GpLineGradient **lineGradient);
-
-GpStatus WINGDIPAPI
-GdipSetLinePoints(GpLineGradient *brush,
- GDIPCONST GpPointF* point1,
- GDIPCONST GpPointF* point2);
-
-GpStatus WINGDIPAPI
-GdipSetLinePointsI(GpLineGradient *brush,
- GDIPCONST GpPoint* point1,
- GDIPCONST GpPoint* point2);
-
-GpStatus WINGDIPAPI
-GdipGetLinePoints(GpLineGradient *brush, GpPointF* points);
-
-GpStatus WINGDIPAPI
-GdipGetLinePointsI(GpLineGradient *brush, GpPoint* points);
-
-GpStatus WINGDIPAPI
-GdipSetLineColors(GpLineGradient *brush, ARGB color1, ARGB color2);
-
-GpStatus WINGDIPAPI
-GdipGetLineColors(GpLineGradient *brush, ARGB* colors);
-
-GpStatus WINGDIPAPI
-GdipGetLineRect(GpLineGradient *brush, GpRectF *rect);
-
-GpStatus WINGDIPAPI
-GdipGetLineRectI(GpLineGradient *brush, GpRect *rect);
-
-GpStatus WINGDIPAPI
-GdipSetLineGammaCorrection(GpLineGradient *brush, BOOL useGammaCorrection);
-
-GpStatus WINGDIPAPI
-GdipGetLineGammaCorrection(GpLineGradient *brush, BOOL *useGammaCorrection);
-
-GpStatus WINGDIPAPI
-GdipGetLineBlendCount(GpLineGradient *brush, INT *count);
-
-GpStatus WINGDIPAPI
-GdipGetLineBlend(GpLineGradient *brush, REAL *blend, REAL* positions,
- INT count);
-
-GpStatus WINGDIPAPI
-GdipSetLineBlend(GpLineGradient *brush, GDIPCONST REAL *blend,
- GDIPCONST REAL* positions, INT count);
-
-GpStatus WINGDIPAPI
-GdipGetLinePresetBlendCount(GpLineGradient *brush, INT *count);
-
-GpStatus WINGDIPAPI
-GdipGetLinePresetBlend(GpLineGradient *brush, ARGB *blend,
- REAL* positions, INT count);
-
-GpStatus WINGDIPAPI
-GdipSetLinePresetBlend(GpLineGradient *brush, GDIPCONST ARGB *blend,
- GDIPCONST REAL* positions, INT count);
-
-GpStatus WINGDIPAPI
-GdipSetLineSigmaBlend(GpLineGradient *brush, REAL focus, REAL scale);
-
-GpStatus WINGDIPAPI
-GdipSetLineLinearBlend(GpLineGradient *brush, REAL focus, REAL scale);
-
-GpStatus WINGDIPAPI
-GdipSetLineWrapMode(GpLineGradient *brush, GpWrapMode wrapmode);
-
-GpStatus WINGDIPAPI
-GdipGetLineWrapMode(GpLineGradient *brush, GpWrapMode *wrapmode);
-
-GpStatus WINGDIPAPI
-GdipGetLineTransform(GpLineGradient *brush, GpMatrix *matrix);
-
-GpStatus WINGDIPAPI
-GdipSetLineTransform(GpLineGradient *brush, GDIPCONST GpMatrix *matrix);
-
-GpStatus WINGDIPAPI
-GdipResetLineTransform(GpLineGradient* brush);
-
-GpStatus WINGDIPAPI
-GdipMultiplyLineTransform(GpLineGradient* brush, GDIPCONST GpMatrix *matrix,
- GpMatrixOrder order);
-
-GpStatus WINGDIPAPI
-GdipTranslateLineTransform(GpLineGradient* brush, REAL dx, REAL dy,
- GpMatrixOrder order);
-
-GpStatus WINGDIPAPI
-GdipScaleLineTransform(GpLineGradient* brush, REAL sx, REAL sy,
- GpMatrixOrder order);
-
-GpStatus WINGDIPAPI
-GdipRotateLineTransform(GpLineGradient* brush, REAL angle, GpMatrixOrder order);
-
-//----------------------------------------------------------------------------
-// PathGradient Brush
-//----------------------------------------------------------------------------
-
-GpStatus WINGDIPAPI
-GdipCreatePathGradient(GDIPCONST GpPointF* points,
- INT count,
- GpWrapMode wrapMode,
- GpPathGradient **polyGradient);
-
-GpStatus WINGDIPAPI
-GdipCreatePathGradientI(GDIPCONST GpPoint* points,
- INT count,
- GpWrapMode wrapMode,
- GpPathGradient **polyGradient);
-
-GpStatus WINGDIPAPI
-GdipCreatePathGradientFromPath(GDIPCONST GpPath* path,
- GpPathGradient **polyGradient);
-
-GpStatus WINGDIPAPI
-GdipGetPathGradientCenterColor(
- GpPathGradient *brush, ARGB* colors);
-
-GpStatus WINGDIPAPI
-GdipSetPathGradientCenterColor(
- GpPathGradient *brush, ARGB colors);
-
-GpStatus WINGDIPAPI
-GdipGetPathGradientSurroundColorsWithCount(
- GpPathGradient *brush, ARGB* color, INT* count);
-
-GpStatus WINGDIPAPI
-GdipSetPathGradientSurroundColorsWithCount(
- GpPathGradient *brush,
- GDIPCONST ARGB* color, INT* count);
-
-GpStatus WINGDIPAPI
-GdipGetPathGradientPath(GpPathGradient *brush, GpPath *path);
-
-GpStatus WINGDIPAPI
-GdipSetPathGradientPath(GpPathGradient *brush, GDIPCONST GpPath *path);
-
-GpStatus WINGDIPAPI
-GdipGetPathGradientCenterPoint(
- GpPathGradient *brush, GpPointF* points);
-
-GpStatus WINGDIPAPI
-GdipGetPathGradientCenterPointI(
- GpPathGradient *brush, GpPoint* points);
-
-GpStatus WINGDIPAPI
-GdipSetPathGradientCenterPoint(
- GpPathGradient *brush, GDIPCONST GpPointF* points);
-
-GpStatus WINGDIPAPI
-GdipSetPathGradientCenterPointI(
- GpPathGradient *brush, GDIPCONST GpPoint* points);
-
-GpStatus WINGDIPAPI
-GdipGetPathGradientRect(GpPathGradient *brush, GpRectF *rect);
-
-GpStatus WINGDIPAPI
-GdipGetPathGradientRectI(GpPathGradient *brush, GpRect *rect);
-
-GpStatus WINGDIPAPI
-GdipGetPathGradientPointCount(GpPathGradient *brush, INT* count);
-
-GpStatus WINGDIPAPI
-GdipGetPathGradientSurroundColorCount(GpPathGradient *brush, INT* count);
-
-GpStatus WINGDIPAPI
-GdipSetPathGradientGammaCorrection(GpPathGradient *brush, BOOL useGammaCorrection);
-
-GpStatus WINGDIPAPI
-GdipGetPathGradientGammaCorrection(GpPathGradient *brush, BOOL *useGammaCorrection);
-
-GpStatus WINGDIPAPI
-GdipGetPathGradientBlendCount(GpPathGradient *brush,
- INT *count);
-
-GpStatus WINGDIPAPI
-GdipGetPathGradientBlend(GpPathGradient *brush,
- REAL *blend, REAL *positions, INT count);
-
-GpStatus WINGDIPAPI
-GdipSetPathGradientBlend(GpPathGradient *brush,
- GDIPCONST REAL *blend, GDIPCONST REAL *positions, INT count);
-
-GpStatus WINGDIPAPI
-GdipGetPathGradientPresetBlendCount(GpPathGradient *brush, INT *count);
-
-GpStatus WINGDIPAPI
-GdipGetPathGradientPresetBlend(GpPathGradient *brush, ARGB *blend,
- REAL* positions, INT count);
-
-GpStatus WINGDIPAPI
-GdipSetPathGradientPresetBlend(GpPathGradient *brush, GDIPCONST ARGB *blend,
- GDIPCONST REAL* positions, INT count);
-
-GpStatus WINGDIPAPI
-GdipSetPathGradientSigmaBlend(GpPathGradient *brush, REAL focus, REAL scale);
-
-GpStatus WINGDIPAPI
-GdipSetPathGradientLinearBlend(GpPathGradient *brush, REAL focus, REAL scale);
-
-GpStatus WINGDIPAPI
-GdipGetPathGradientWrapMode(GpPathGradient *brush,
- GpWrapMode *wrapmode);
-
-GpStatus WINGDIPAPI
-GdipSetPathGradientWrapMode(GpPathGradient *brush,
- GpWrapMode wrapmode);
-
-GpStatus WINGDIPAPI
-GdipGetPathGradientTransform(GpPathGradient *brush,
- GpMatrix *matrix);
-
-GpStatus WINGDIPAPI
-GdipSetPathGradientTransform(GpPathGradient *brush,
- GpMatrix *matrix);
-
-GpStatus WINGDIPAPI
-GdipResetPathGradientTransform(GpPathGradient* brush);
-
-GpStatus WINGDIPAPI
-GdipMultiplyPathGradientTransform(GpPathGradient* brush, GDIPCONST GpMatrix *matrix,
- GpMatrixOrder order);
-
-GpStatus WINGDIPAPI
-GdipTranslatePathGradientTransform(GpPathGradient* brush, REAL dx, REAL dy,
- GpMatrixOrder order);
-
-GpStatus WINGDIPAPI
-GdipScalePathGradientTransform(GpPathGradient* brush, REAL sx, REAL sy,
- GpMatrixOrder order);
-
-GpStatus WINGDIPAPI
-GdipRotatePathGradientTransform(GpPathGradient* brush, REAL angle,
- GpMatrixOrder order);
-
-GpStatus WINGDIPAPI
-GdipGetPathGradientFocusScales(GpPathGradient *brush, REAL* xScale, REAL* yScale);
-
-GpStatus WINGDIPAPI
-GdipSetPathGradientFocusScales(GpPathGradient *brush, REAL xScale, REAL yScale);
-
-//----------------------------------------------------------------------------
-// Pen methods
-//----------------------------------------------------------------------------
-
-GpStatus WINGDIPAPI
-GdipCreatePen1(ARGB color, REAL width, GpUnit unit, GpPen **pen);
-
-GpStatus WINGDIPAPI
-GdipCreatePen2(GpBrush *brush, REAL width, GpUnit unit,
- GpPen **pen);
-
-GpStatus WINGDIPAPI
-GdipClonePen(GpPen *pen, GpPen **clonepen);
-
-GpStatus WINGDIPAPI
-GdipDeletePen(GpPen *pen);
-
-GpStatus WINGDIPAPI
-GdipSetPenWidth(GpPen *pen, REAL width);
-
-GpStatus WINGDIPAPI
-GdipGetPenWidth(GpPen *pen, REAL *width);
-
-GpStatus WINGDIPAPI
-GdipSetPenUnit(GpPen *pen, GpUnit unit);
-
-GpStatus WINGDIPAPI
-GdipGetPenUnit(GpPen *pen, GpUnit *unit);
-
-#ifdef DCR_USE_NEW_197819
-GpStatus WINGDIPAPI
-GdipSetPenLineCap197819(GpPen *pen, GpLineCap startCap, GpLineCap endCap,
- GpDashCap dashCap);
-#else
-GpStatus WINGDIPAPI
-GdipSetPenLineCap(GpPen *pen, GpLineCap startCap, GpLineCap endCap,
- GpLineCap dashCap);
-#endif // DCR_USE_NEW_197819
-
-
-GpStatus WINGDIPAPI
-GdipSetPenStartCap(GpPen *pen, GpLineCap startCap);
-
-GpStatus WINGDIPAPI
-GdipSetPenEndCap(GpPen *pen, GpLineCap endCap);
-
-#ifdef DCR_USE_NEW_197819
-GpStatus WINGDIPAPI
-GdipSetPenDashCap197819(GpPen *pen, GpDashCap dashCap);
-#else
-GpStatus WINGDIPAPI
-GdipSetPenDashCap(GpPen *pen, GpLineCap dashCap);
-#endif // DCR_USE_NEW_197819
-
-GpStatus WINGDIPAPI
-GdipGetPenStartCap(GpPen *pen, GpLineCap *startCap);
-
-GpStatus WINGDIPAPI
-GdipGetPenEndCap(GpPen *pen, GpLineCap *endCap);
-
-#ifdef DCR_USE_NEW_197819
-GpStatus WINGDIPAPI
-GdipGetPenDashCap197819(GpPen *pen, GpDashCap *dashCap);
-#else
-GpStatus WINGDIPAPI
-GdipGetPenDashCap(GpPen *pen, GpLineCap *dashCap);
-#endif // DCR_USE_NEW_197819
-
-GpStatus WINGDIPAPI
-GdipSetPenLineJoin(GpPen *pen, GpLineJoin lineJoin);
-
-GpStatus WINGDIPAPI
-GdipGetPenLineJoin(GpPen *pen, GpLineJoin *lineJoin);
-
-GpStatus WINGDIPAPI
-GdipSetPenCustomStartCap(GpPen *pen, GpCustomLineCap* customCap);
-
-GpStatus WINGDIPAPI
-GdipGetPenCustomStartCap(GpPen *pen, GpCustomLineCap** customCap);
-
-GpStatus WINGDIPAPI
-GdipSetPenCustomEndCap(GpPen *pen, GpCustomLineCap* customCap);
-
-GpStatus WINGDIPAPI
-GdipGetPenCustomEndCap(GpPen *pen, GpCustomLineCap** customCap);
-
-GpStatus WINGDIPAPI
-GdipSetPenMiterLimit(GpPen *pen, REAL miterLimit);
-
-GpStatus WINGDIPAPI
-GdipGetPenMiterLimit(GpPen *pen, REAL *miterLimit);
-
-GpStatus WINGDIPAPI
-GdipSetPenMode(GpPen *pen, GpPenAlignment penMode);
-
-GpStatus WINGDIPAPI
-GdipGetPenMode(GpPen *pen, GpPenAlignment *penMode);
-
-GpStatus WINGDIPAPI
-GdipSetPenTransform(GpPen *pen, GpMatrix *matrix);
-
-GpStatus WINGDIPAPI
-GdipGetPenTransform(GpPen *pen, GpMatrix *matrix);
-
-GpStatus WINGDIPAPI
-GdipResetPenTransform(GpPen *pen);
-
-GpStatus WINGDIPAPI
-GdipMultiplyPenTransform(GpPen *pen, GDIPCONST GpMatrix *matrix,
- GpMatrixOrder order);
-
-GpStatus WINGDIPAPI
-GdipTranslatePenTransform(GpPen *pen, REAL dx, REAL dy,
- GpMatrixOrder order);
-
-GpStatus WINGDIPAPI
-GdipScalePenTransform(GpPen *pen, REAL sx, REAL sy,
- GpMatrixOrder order);
-
-GpStatus WINGDIPAPI
-GdipRotatePenTransform(GpPen *pen, REAL angle, GpMatrixOrder order);
-
-GpStatus WINGDIPAPI
-GdipSetPenColor(GpPen *pen, ARGB argb);
-
-GpStatus WINGDIPAPI
-GdipGetPenColor(GpPen *pen, ARGB *argb);
-
-GpStatus WINGDIPAPI
-GdipSetPenBrushFill(GpPen *pen, GpBrush *brush);
-
-GpStatus WINGDIPAPI
-GdipGetPenBrushFill(GpPen *pen, GpBrush **brush);
-
-GpStatus WINGDIPAPI
-GdipGetPenFillType(GpPen *pen, GpPenType* type);
-
-GpStatus WINGDIPAPI
-GdipGetPenDashStyle(GpPen *pen, GpDashStyle *dashstyle);
-
-GpStatus WINGDIPAPI
-GdipSetPenDashStyle(GpPen *pen, GpDashStyle dashstyle);
-
-GpStatus WINGDIPAPI
-GdipGetPenDashOffset(GpPen *pen, REAL *offset);
-
-GpStatus WINGDIPAPI
-GdipSetPenDashOffset(GpPen *pen, REAL offset);
-
-GpStatus WINGDIPAPI
-GdipGetPenDashCount(GpPen *pen, INT *count);
-
-GpStatus WINGDIPAPI
-GdipSetPenDashArray(GpPen *pen, GDIPCONST REAL *dash, INT count);
-
-GpStatus WINGDIPAPI
-GdipGetPenDashArray(GpPen *pen, REAL *dash, INT count);
-
-GpStatus WINGDIPAPI
-GdipGetPenCompoundCount(GpPen *pen, INT *count);
-
-GpStatus WINGDIPAPI
-GdipSetPenCompoundArray(GpPen *pen, GDIPCONST REAL *dash, INT count);
-
-GpStatus WINGDIPAPI
-GdipGetPenCompoundArray(GpPen *pen, REAL *dash, INT count);
-
-//----------------------------------------------------------------------------
-// CustomLineCap methods
-//----------------------------------------------------------------------------
-
-GpStatus WINGDIPAPI
-GdipCreateCustomLineCap(GpPath* fillPath, GpPath* strokePath,
- GpLineCap baseCap, REAL baseInset, GpCustomLineCap **customCap);
-
-GpStatus WINGDIPAPI
-GdipDeleteCustomLineCap(GpCustomLineCap* customCap);
-
-GpStatus WINGDIPAPI
-GdipCloneCustomLineCap(GpCustomLineCap* customCap,
- GpCustomLineCap** clonedCap);
-
-GpStatus WINGDIPAPI
-GdipGetCustomLineCapType(GpCustomLineCap* customCap,
- CustomLineCapType* capType);
-
-GpStatus WINGDIPAPI
-GdipSetCustomLineCapStrokeCaps(GpCustomLineCap* customCap,
- GpLineCap startCap, GpLineCap endCap);
-
-GpStatus WINGDIPAPI
-GdipGetCustomLineCapStrokeCaps(GpCustomLineCap* customCap,
- GpLineCap* startCap, GpLineCap* endCap);
-
-GpStatus WINGDIPAPI
-GdipSetCustomLineCapStrokeJoin(GpCustomLineCap* customCap, GpLineJoin lineJoin);
-
-GpStatus WINGDIPAPI
-GdipGetCustomLineCapStrokeJoin(GpCustomLineCap* customCap, GpLineJoin* lineJoin);
-
-GpStatus WINGDIPAPI
-GdipSetCustomLineCapBaseCap(GpCustomLineCap* customCap, GpLineCap baseCap);
-
-GpStatus WINGDIPAPI
-GdipGetCustomLineCapBaseCap(GpCustomLineCap* customCap, GpLineCap* baseCap);
-
-GpStatus WINGDIPAPI
-GdipSetCustomLineCapBaseInset(GpCustomLineCap* customCap, REAL inset);
-
-GpStatus WINGDIPAPI
-GdipGetCustomLineCapBaseInset(GpCustomLineCap* customCap, REAL* inset);
-
-GpStatus WINGDIPAPI
-GdipSetCustomLineCapWidthScale(GpCustomLineCap* customCap, REAL widthScale);
-
-GpStatus WINGDIPAPI
-GdipGetCustomLineCapWidthScale(GpCustomLineCap* customCap, REAL* widthScale);
-
-//----------------------------------------------------------------------------
-// AdjustableArrowCap methods
-//----------------------------------------------------------------------------
-
-GpStatus WINGDIPAPI
-GdipCreateAdjustableArrowCap(REAL height, REAL width, BOOL isFilled,
- GpAdjustableArrowCap **cap);
-
-GpStatus WINGDIPAPI
-GdipSetAdjustableArrowCapHeight(GpAdjustableArrowCap* cap, REAL height);
-
-GpStatus WINGDIPAPI
-GdipGetAdjustableArrowCapHeight(GpAdjustableArrowCap* cap, REAL* height);
-
-GpStatus WINGDIPAPI
-GdipSetAdjustableArrowCapWidth(GpAdjustableArrowCap* cap, REAL width);
-
-GpStatus WINGDIPAPI
-GdipGetAdjustableArrowCapWidth(GpAdjustableArrowCap* cap, REAL* width);
-
-GpStatus WINGDIPAPI
-GdipSetAdjustableArrowCapMiddleInset(GpAdjustableArrowCap* cap, REAL middleInset);
-
-GpStatus WINGDIPAPI
-GdipGetAdjustableArrowCapMiddleInset(GpAdjustableArrowCap* cap, REAL* middleInset);
-
-GpStatus WINGDIPAPI
-GdipSetAdjustableArrowCapFillState(GpAdjustableArrowCap* cap, BOOL fillState);
-
-GpStatus WINGDIPAPI
-GdipGetAdjustableArrowCapFillState(GpAdjustableArrowCap* cap, BOOL* fillState);
-
-//----------------------------------------------------------------------------
-// Image methods
-//----------------------------------------------------------------------------
-
-GpStatus WINGDIPAPI
-GdipLoadImageFromStream(IStream* stream, GpImage **image);
-
-GpStatus WINGDIPAPI
-GdipLoadImageFromFile(GDIPCONST WCHAR* filename, GpImage **image);
-
-GpStatus WINGDIPAPI
-GdipLoadImageFromStreamICM(IStream* stream, GpImage **image);
-
-GpStatus WINGDIPAPI
-GdipLoadImageFromFileICM(GDIPCONST WCHAR* filename, GpImage **image);
-
-GpStatus WINGDIPAPI
-GdipCloneImage(GpImage *image, GpImage **cloneImage);
-
-GpStatus WINGDIPAPI
-GdipDisposeImage(GpImage *image);
-
-GpStatus WINGDIPAPI
-GdipSaveImageToFile(GpImage *image, GDIPCONST WCHAR* filename,
- GDIPCONST CLSID* clsidEncoder, GDIPCONST EncoderParameters* encoderParams);
-
-GpStatus WINGDIPAPI
-GdipSaveImageToStream(GpImage *image, IStream* stream,
- GDIPCONST CLSID* clsidEncoder, GDIPCONST EncoderParameters* encoderParams);
-
-GpStatus WINGDIPAPI
-GdipSaveAdd(GpImage *image, GDIPCONST EncoderParameters* encoderParams);
-
-GpStatus WINGDIPAPI
-GdipSaveAddImage(GpImage *image, GpImage* newImage,
- GDIPCONST EncoderParameters* encoderParams);
-
-GpStatus WINGDIPAPI
-GdipGetImageGraphicsContext(GpImage *image, GpGraphics **graphics);
-
-GpStatus WINGDIPAPI
-GdipGetImageBounds(GpImage *image, GpRectF *srcRect, GpUnit *srcUnit);
-
-GpStatus WINGDIPAPI
-GdipGetImageDimension(GpImage *image, REAL *width, REAL *height);
-
-GpStatus WINGDIPAPI
-GdipGetImageType(GpImage *image, ImageType *type);
-
-GpStatus WINGDIPAPI
-GdipGetImageWidth(GpImage *image, UINT *width);
-
-GpStatus WINGDIPAPI
-GdipGetImageHeight(GpImage *image, UINT *height);
-
-GpStatus WINGDIPAPI
-GdipGetImageHorizontalResolution(GpImage *image, REAL *resolution);
-
-GpStatus WINGDIPAPI
-GdipGetImageVerticalResolution(GpImage *image, REAL *resolution);
-
-GpStatus WINGDIPAPI
-GdipGetImageFlags(GpImage *image, UINT *flags);
-
-GpStatus WINGDIPAPI
-GdipGetImageRawFormat(GpImage *image, GUID *format);
-
-GpStatus WINGDIPAPI
-GdipGetImagePixelFormat(GpImage *image, PixelFormat *format);
-
-GpStatus WINGDIPAPI
-GdipGetImageThumbnail(GpImage *image, UINT thumbWidth, UINT thumbHeight,
- GpImage **thumbImage,
- GetThumbnailImageAbort callback, VOID * callbackData);
-
-GpStatus WINGDIPAPI
-GdipGetEncoderParameterListSize(GpImage *image, GDIPCONST CLSID* clsidEncoder,
- UINT* size);
-
-GpStatus WINGDIPAPI
-GdipGetEncoderParameterList(GpImage *image, GDIPCONST CLSID* clsidEncoder,
- UINT size, EncoderParameters* buffer);
-
-GpStatus WINGDIPAPI
-GdipImageGetFrameDimensionsCount(GpImage* image, UINT* count);
-
-GpStatus WINGDIPAPI
-GdipImageGetFrameDimensionsList(GpImage* image, GUID* dimensionIDs, UINT count);
-
-GpStatus WINGDIPAPI
-GdipImageGetFrameCount(GpImage *image, GDIPCONST GUID* dimensionID, UINT* count);
-
-GpStatus WINGDIPAPI
-GdipImageSelectActiveFrame(GpImage *image, GDIPCONST GUID* dimensionID,
- UINT frameIndex);
-
-GpStatus WINGDIPAPI
-GdipImageRotateFlip(GpImage *image, RotateFlipType rfType);
-
-GpStatus WINGDIPAPI
-GdipGetImagePalette(GpImage *image, ColorPalette *palette, INT size);
-
-GpStatus WINGDIPAPI
-GdipSetImagePalette(GpImage *image, GDIPCONST ColorPalette *palette);
-
-GpStatus WINGDIPAPI
-GdipGetImagePaletteSize(GpImage *image, INT *size);
-
-GpStatus WINGDIPAPI
-GdipGetPropertyCount(GpImage *image, UINT* numOfProperty);
-
-GpStatus WINGDIPAPI
-GdipGetPropertyIdList(GpImage *image, UINT numOfProperty, PROPID* list);
-
-GpStatus WINGDIPAPI
-GdipGetPropertyItemSize(GpImage *image, PROPID propId, UINT* size);
-
-GpStatus WINGDIPAPI
-GdipGetPropertyItem(GpImage *image, PROPID propId,UINT propSize,
- PropertyItem* buffer);
-
-GpStatus WINGDIPAPI
-GdipGetPropertySize(GpImage *image, UINT* totalBufferSize, UINT* numProperties);
-
-GpStatus WINGDIPAPI
-GdipGetAllPropertyItems(GpImage *image, UINT totalBufferSize,
- UINT numProperties, PropertyItem* allItems);
-
-GpStatus WINGDIPAPI
-GdipRemovePropertyItem(GpImage *image, PROPID propId);
-
-GpStatus WINGDIPAPI
-GdipSetPropertyItem(GpImage *image, GDIPCONST PropertyItem* item);
-
-GpStatus WINGDIPAPI
-GdipImageForceValidation(GpImage *image);
-
-GpStatus WINGDIPAPI
-GdipGetImageLayout(GpImage *image, ImageLayout* layout);
-
-GpStatus WINGDIPAPI
-GdipSetImageLayout(GpImage *image, GDIPCONST ImageLayout layout);
-
-//----------------------------------------------------------------------------
-// Bitmap methods
-//----------------------------------------------------------------------------
-
-GpStatus WINGDIPAPI
-GdipCreateBitmapFromStream(IStream* stream, GpBitmap **bitmap);
-
-GpStatus WINGDIPAPI
-GdipCreateBitmapFromFile(GDIPCONST WCHAR* filename, GpBitmap **bitmap);
-
-GpStatus WINGDIPAPI
-GdipCreateBitmapFromStreamICM(IStream* stream, GpBitmap **bitmap);
-
-GpStatus WINGDIPAPI
-GdipCreateBitmapFromFileICM(GDIPCONST WCHAR* filename, GpBitmap **bitmap);
-
-GpStatus WINGDIPAPI
-GdipCreateBitmapFromScan0(INT width,
- INT height,
- INT stride,
- PixelFormat format,
- BYTE* scan0,
- GpBitmap** bitmap);
-
-GpStatus WINGDIPAPI
-GdipCreateBitmapFromGraphics(INT width,
- INT height,
- GpGraphics* target,
- GpBitmap** bitmap);
-
-GpStatus WINGDIPAPI
-GdipCreateBitmapFromDirectDrawSurface(IDirectDrawSurface7* surface,
- GpBitmap** bitmap);
-
-GpStatus WINGDIPAPI
-GdipCreateBitmapFromGdiDib(GDIPCONST BITMAPINFO* gdiBitmapInfo,
- VOID* gdiBitmapData,
- GpBitmap** bitmap);
-
-GpStatus WINGDIPAPI
-GdipCreateBitmapFromHBITMAP(HBITMAP hbm,
- HPALETTE hpal,
- GpBitmap** bitmap);
-
-GpStatus WINGDIPAPI
-GdipCreateHBITMAPFromBitmap(GpBitmap* bitmap,
- HBITMAP* hbmReturn,
- ARGB background);
-
-GpStatus WINGDIPAPI
-GdipCreateBitmapFromHICON(HICON hicon,
- GpBitmap** bitmap);
-
-GpStatus WINGDIPAPI
-GdipCreateHICONFromBitmap(GpBitmap* bitmap,
- HICON* hbmReturn);
-
-GpStatus WINGDIPAPI
-GdipCreateBitmapFromResource(HINSTANCE hInstance,
- GDIPCONST WCHAR* lpBitmapName,
- GpBitmap** bitmap);
-
-GpStatus WINGDIPAPI
-GdipCloneBitmapArea(REAL x, REAL y, REAL width, REAL height,
- PixelFormat format,
- GpBitmap *srcBitmap,
- GpBitmap **dstBitmap);
-
-GpStatus WINGDIPAPI
-GdipCloneBitmapAreaI(INT x,
- INT y,
- INT width,
- INT height,
- PixelFormat format,
- GpBitmap *srcBitmap,
- GpBitmap **dstBitmap);
-
-GpStatus WINGDIPAPI
-GdipBitmapLockBits(GpBitmap* bitmap,
- GDIPCONST GpRect* rect,
- UINT flags,
- PixelFormat format,
- BitmapData* lockedBitmapData);
-
-GpStatus WINGDIPAPI
-GdipBitmapUnlockBits(GpBitmap* bitmap,
- BitmapData* lockedBitmapData);
-
-GpStatus WINGDIPAPI
-GdipBitmapGetPixel(GpBitmap* bitmap, INT x, INT y, ARGB *color);
-
-GpStatus WINGDIPAPI
-GdipBitmapSetPixel(GpBitmap* bitmap, INT x, INT y, ARGB color);
-
-GpStatus WINGDIPAPI
-GdipBitmapSetResolution(GpBitmap* bitmap, REAL xdpi, REAL ydpi);
-
-//----------------------------------------------------------------------------
-// ImageAttributes methods
-//----------------------------------------------------------------------------
-
-GpStatus WINGDIPAPI
-GdipCreateImageAttributes(GpImageAttributes **imageattr);
-
-GpStatus WINGDIPAPI
-GdipCloneImageAttributes(GDIPCONST GpImageAttributes *imageattr,
- GpImageAttributes **cloneImageattr);
-
-GpStatus WINGDIPAPI
-GdipDisposeImageAttributes(GpImageAttributes *imageattr);
-
-GpStatus WINGDIPAPI
-GdipSetImageAttributesToIdentity(GpImageAttributes *imageattr,
- ColorAdjustType type);
-GpStatus WINGDIPAPI
-GdipResetImageAttributes(GpImageAttributes *imageattr,
- ColorAdjustType type);
-
-GpStatus WINGDIPAPI
-GdipSetImageAttributesColorMatrix(GpImageAttributes *imageattr,
- ColorAdjustType type,
- BOOL enableFlag,
- GDIPCONST ColorMatrix* colorMatrix,
- GDIPCONST ColorMatrix* grayMatrix,
- ColorMatrixFlags flags);
-
-GpStatus WINGDIPAPI
-GdipSetImageAttributesThreshold(GpImageAttributes *imageattr,
- ColorAdjustType type,
- BOOL enableFlag,
- REAL threshold);
-
-GpStatus WINGDIPAPI
-GdipSetImageAttributesGamma(GpImageAttributes *imageattr,
- ColorAdjustType type,
- BOOL enableFlag,
- REAL gamma);
-
-GpStatus WINGDIPAPI
-GdipSetImageAttributesNoOp(GpImageAttributes *imageattr,
- ColorAdjustType type,
- BOOL enableFlag);
-
-GpStatus WINGDIPAPI
-GdipSetImageAttributesColorKeys(GpImageAttributes *imageattr,
- ColorAdjustType type,
- BOOL enableFlag,
- ARGB colorLow,
- ARGB colorHigh);
-
-GpStatus WINGDIPAPI
-GdipSetImageAttributesOutputChannel(GpImageAttributes *imageattr,
- ColorAdjustType type,
- BOOL enableFlag,
- ColorChannelFlags channelFlags);
-
-GpStatus WINGDIPAPI
-GdipSetImageAttributesOutputChannelColorProfile(GpImageAttributes *imageattr,
- ColorAdjustType type,
- BOOL enableFlag,
- GDIPCONST WCHAR *colorProfileFilename);
-
-GpStatus WINGDIPAPI
-GdipSetImageAttributesRemapTable(GpImageAttributes *imageattr,
- ColorAdjustType type,
- BOOL enableFlag,
- UINT mapSize,
- GDIPCONST ColorMap *map);
-GpStatus WINGDIPAPI
-GdipSetImageAttributesWrapMode(
- GpImageAttributes *imageAttr,
- WrapMode wrap,
- ARGB argb,
- BOOL clamp
-);
-
-GpStatus WINGDIPAPI
-GdipSetImageAttributesICMMode(
- GpImageAttributes *imageAttr,
- BOOL on
-);
-
-GpStatus WINGDIPAPI
-GdipGetImageAttributesAdjustedPalette(
- GpImageAttributes *imageAttr,
- ColorPalette * colorPalette,
- ColorAdjustType colorAdjustType
-);
-
-//----------------------------------------------------------------------------
-// Graphics methods
-//----------------------------------------------------------------------------
-
-GpStatus WINGDIPAPI
-GdipFlush(GpGraphics *graphics, GpFlushIntention intention);
-
-GpStatus WINGDIPAPI
-GdipCreateFromHDC(HDC hdc, GpGraphics **graphics);
-
-GpStatus WINGDIPAPI
-GdipCreateFromHDC2(HDC hdc, HANDLE hDevice, GpGraphics **graphics);
-
-GpStatus WINGDIPAPI
-GdipCreateFromHWND(HWND hwnd, GpGraphics **graphics);
-
-GpStatus WINGDIPAPI
-GdipCreateFromHWNDICM(HWND hwnd, GpGraphics **graphics);
-
-GpStatus WINGDIPAPI
-GdipDeleteGraphics(GpGraphics *graphics);
-
-GpStatus WINGDIPAPI
-GdipGetDC(GpGraphics* graphics, HDC * hdc);
-
-GpStatus WINGDIPAPI
-GdipReleaseDC(GpGraphics* graphics, HDC hdc);
-
-GpStatus WINGDIPAPI
-GdipSetCompositingMode(GpGraphics *graphics, CompositingMode compositingMode);
-
-GpStatus WINGDIPAPI
-GdipGetCompositingMode(GpGraphics *graphics, CompositingMode *compositingMode);
-
-GpStatus WINGDIPAPI
-GdipSetRenderingOrigin(GpGraphics *graphics, INT x, INT y);
-
-GpStatus WINGDIPAPI
-GdipGetRenderingOrigin(GpGraphics *graphics, INT *x, INT *y);
-
-GpStatus WINGDIPAPI
-GdipSetCompositingQuality(GpGraphics *graphics, CompositingQuality compositingQuality);
-
-GpStatus WINGDIPAPI
-GdipGetCompositingQuality(GpGraphics *graphics, CompositingQuality *compositingQuality);
-
-GpStatus WINGDIPAPI
-GdipSetSmoothingMode(GpGraphics *graphics, SmoothingMode smoothingMode);
-
-GpStatus WINGDIPAPI
-GdipGetSmoothingMode(GpGraphics *graphics, SmoothingMode *smoothingMode);
-
-GpStatus WINGDIPAPI
-GdipSetPixelOffsetMode(GpGraphics* graphics, PixelOffsetMode pixelOffsetMode);
-
-GpStatus WINGDIPAPI
-GdipGetPixelOffsetMode(GpGraphics *graphics, PixelOffsetMode *pixelOffsetMode);
-
-GpStatus WINGDIPAPI
-GdipSetTextRenderingHint(GpGraphics *graphics, TextRenderingHint mode);
-
-GpStatus WINGDIPAPI
-GdipGetTextRenderingHint(GpGraphics *graphics, TextRenderingHint *mode);
-
-#ifdef DCR_USE_NEW_188922
-GpStatus WINGDIPAPI
-GdipSetTextContrast(GpGraphics *graphics, UINT contrast);
-
-GpStatus WINGDIPAPI
-GdipGetTextContrast(GpGraphics *graphics, UINT * contrast);
-#else
-GpStatus WINGDIPAPI
-GdipSetTextGammaValue(GpGraphics *graphics, UINT gammaValue);
-
-GpStatus WINGDIPAPI
-GdipGetTextGammaValue(GpGraphics *graphics, UINT * gammaValue);
-#endif // DCR_USE_NEW_188922
-
-
-GpStatus WINGDIPAPI
-GdipSetInterpolationMode(GpGraphics *graphics, InterpolationMode interpolationMode);
-
-GpStatus WINGDIPAPI
-GdipGetInterpolationMode(GpGraphics *graphics, InterpolationMode *interpolationMode);
-
-GpStatus WINGDIPAPI
-GdipSetWorldTransform(GpGraphics *graphics, GpMatrix *matrix);
-
-GpStatus WINGDIPAPI
-GdipResetWorldTransform(GpGraphics *graphics);
-
-GpStatus WINGDIPAPI
-GdipMultiplyWorldTransform(GpGraphics *graphics, GDIPCONST GpMatrix *matrix,
- GpMatrixOrder order);
-
-GpStatus WINGDIPAPI
-GdipTranslateWorldTransform(GpGraphics *graphics, REAL dx, REAL dy,
- GpMatrixOrder order);
-
-GpStatus WINGDIPAPI
-GdipScaleWorldTransform(GpGraphics *graphics, REAL sx, REAL sy,
- GpMatrixOrder order);
-
-GpStatus WINGDIPAPI
-GdipRotateWorldTransform(GpGraphics *graphics, REAL angle, GpMatrixOrder order);
-
-GpStatus WINGDIPAPI
-GdipGetWorldTransform(GpGraphics *graphics, GpMatrix *matrix);
-
-GpStatus WINGDIPAPI
-GdipResetPageTransform(GpGraphics *graphics);
-
-GpStatus WINGDIPAPI
-GdipGetPageUnit(GpGraphics *graphics, GpUnit *unit);
-
-GpStatus WINGDIPAPI
-GdipGetPageScale(GpGraphics *graphics, REAL *scale);
-
-GpStatus WINGDIPAPI
-GdipSetPageUnit(GpGraphics *graphics, GpUnit unit);
-
-GpStatus WINGDIPAPI
-GdipSetPageScale(GpGraphics *graphics, REAL scale);
-
-GpStatus WINGDIPAPI
-GdipGetDpiX(GpGraphics *graphics, REAL* dpi);
-
-GpStatus WINGDIPAPI
-GdipGetDpiY(GpGraphics *graphics, REAL* dpi);
-
-GpStatus WINGDIPAPI
-GdipTransformPoints(GpGraphics *graphics, GpCoordinateSpace destSpace,
- GpCoordinateSpace srcSpace, GpPointF *points,
- INT count);
-
-GpStatus WINGDIPAPI
-GdipTransformPointsI(GpGraphics *graphics, GpCoordinateSpace destSpace,
- GpCoordinateSpace srcSpace, GpPoint *points,
- INT count);
-
-GpStatus WINGDIPAPI
-GdipGetNearestColor(GpGraphics *graphics, ARGB* argb);
-
-// Create the Win9x Halftone Palette (even on NT) with correct Desktop colors
-HPALETTE WINGDIPAPI
-GdipCreateHalftonePalette();
-
-GpStatus WINGDIPAPI
-GdipDrawLine(GpGraphics *graphics, GpPen *pen, REAL x1, REAL y1,
- REAL x2, REAL y2);
-
-GpStatus WINGDIPAPI
-GdipDrawLineI(GpGraphics *graphics, GpPen *pen, INT x1, INT y1,
- INT x2, INT y2);
-
-GpStatus WINGDIPAPI
-GdipDrawLines(GpGraphics *graphics, GpPen *pen, GDIPCONST GpPointF *points,
- INT count);
-
-GpStatus WINGDIPAPI
-GdipDrawLinesI(GpGraphics *graphics, GpPen *pen, GDIPCONST GpPoint *points,
- INT count);
-
-GpStatus WINGDIPAPI
-GdipDrawArc(GpGraphics *graphics, GpPen *pen, REAL x, REAL y,
- REAL width, REAL height, REAL startAngle, REAL sweepAngle);
-
-GpStatus WINGDIPAPI
-GdipDrawArcI(GpGraphics *graphics, GpPen *pen, INT x, INT y,
- INT width, INT height, REAL startAngle, REAL sweepAngle);
-
-GpStatus WINGDIPAPI
-GdipDrawBezier(GpGraphics *graphics, GpPen *pen, REAL x1, REAL y1,
- REAL x2, REAL y2, REAL x3, REAL y3, REAL x4, REAL y4);
-
-GpStatus WINGDIPAPI
-GdipDrawBezierI(GpGraphics *graphics, GpPen *pen, INT x1, INT y1,
- INT x2, INT y2, INT x3, INT y3, INT x4, INT y4);
-
-GpStatus WINGDIPAPI
-GdipDrawBeziers(GpGraphics *graphics, GpPen *pen, GDIPCONST GpPointF *points,
- INT count);
-
-GpStatus WINGDIPAPI
-GdipDrawBeziersI(GpGraphics *graphics, GpPen *pen, GDIPCONST GpPoint *points,
- INT count);
-
-GpStatus WINGDIPAPI
-GdipDrawRectangle(GpGraphics *graphics, GpPen *pen, REAL x, REAL y,
- REAL width, REAL height);
-
-GpStatus WINGDIPAPI
-GdipDrawRectangleI(GpGraphics *graphics, GpPen *pen, INT x, INT y,
- INT width, INT height);
-
-GpStatus WINGDIPAPI
-GdipDrawRectangles(GpGraphics *graphics, GpPen *pen, GDIPCONST GpRectF *rects,
- INT count);
-
-GpStatus WINGDIPAPI
-GdipDrawRectanglesI(GpGraphics *graphics, GpPen *pen, GDIPCONST GpRect *rects,
- INT count);
-
-GpStatus WINGDIPAPI
-GdipDrawEllipse(GpGraphics *graphics, GpPen *pen, REAL x, REAL y,
- REAL width, REAL height);
-
-GpStatus WINGDIPAPI
-GdipDrawEllipseI(GpGraphics *graphics, GpPen *pen, INT x, INT y,
- INT width, INT height);
-
-GpStatus WINGDIPAPI
-GdipDrawPie(GpGraphics *graphics, GpPen *pen, REAL x, REAL y,
- REAL width, REAL height, REAL startAngle, REAL sweepAngle);
-
-GpStatus WINGDIPAPI
-GdipDrawPieI(GpGraphics *graphics, GpPen *pen, INT x, INT y,
- INT width, INT height, REAL startAngle, REAL sweepAngle);
-
-GpStatus WINGDIPAPI
-GdipDrawPolygon(GpGraphics *graphics, GpPen *pen, GDIPCONST GpPointF *points,
- INT count);
-
-GpStatus WINGDIPAPI
-GdipDrawPolygonI(GpGraphics *graphics, GpPen *pen, GDIPCONST GpPoint *points,
- INT count);
-
-GpStatus WINGDIPAPI
-GdipDrawPath(GpGraphics *graphics, GpPen *pen, GpPath *path);
-
-GpStatus WINGDIPAPI
-GdipDrawCurve(GpGraphics *graphics, GpPen *pen, GDIPCONST GpPointF *points,
- INT count);
-
-GpStatus WINGDIPAPI
-GdipDrawCurveI(GpGraphics *graphics, GpPen *pen, GDIPCONST GpPoint *points,
- INT count);
-
-GpStatus WINGDIPAPI
-GdipDrawCurve2(GpGraphics *graphics, GpPen *pen, GDIPCONST GpPointF *points,
- INT count, REAL tension);
-
-GpStatus WINGDIPAPI
-GdipDrawCurve2I(GpGraphics *graphics, GpPen *pen, GDIPCONST GpPoint *points,
- INT count, REAL tension);
-
-GpStatus WINGDIPAPI
-GdipDrawCurve3(GpGraphics *graphics, GpPen *pen, GDIPCONST GpPointF *points,
- INT count, INT offset, INT numberOfSegments, REAL tension);
-
-GpStatus WINGDIPAPI
-GdipDrawCurve3I(GpGraphics *graphics, GpPen *pen, GDIPCONST GpPoint *points,
- INT count, INT offset, INT numberOfSegments, REAL tension);
-
-GpStatus WINGDIPAPI
-GdipDrawClosedCurve(GpGraphics *graphics, GpPen *pen,
- GDIPCONST GpPointF *points, INT count);
-
-GpStatus WINGDIPAPI
-GdipDrawClosedCurveI(GpGraphics *graphics, GpPen *pen,
- GDIPCONST GpPoint *points, INT count);
-
-GpStatus WINGDIPAPI
-GdipDrawClosedCurve2(GpGraphics *graphics, GpPen *pen,
- GDIPCONST GpPointF *points, INT count, REAL tension);
-
-GpStatus WINGDIPAPI
-GdipDrawClosedCurve2I(GpGraphics *graphics, GpPen *pen,
- GDIPCONST GpPoint *points, INT count, REAL tension);
-
-GpStatus WINGDIPAPI
-GdipGraphicsClear(GpGraphics *graphics, ARGB color);
-
-GpStatus WINGDIPAPI
-GdipFillRectangle(GpGraphics *graphics, GpBrush *brush, REAL x, REAL y,
- REAL width, REAL height);
-
-GpStatus WINGDIPAPI
-GdipFillRectangleI(GpGraphics *graphics, GpBrush *brush, INT x, INT y,
- INT width, INT height);
-
-GpStatus WINGDIPAPI
-GdipFillRectangles(GpGraphics *graphics, GpBrush *brush,
- GDIPCONST GpRectF *rects, INT count);
-
-GpStatus WINGDIPAPI
-GdipFillRectanglesI(GpGraphics *graphics, GpBrush *brush,
- GDIPCONST GpRect *rects, INT count);
-
-GpStatus WINGDIPAPI
-GdipFillPolygon(GpGraphics *graphics, GpBrush *brush,
- GDIPCONST GpPointF *points, INT count, GpFillMode fillMode);
-
-GpStatus WINGDIPAPI
-GdipFillPolygonI(GpGraphics *graphics, GpBrush *brush,
- GDIPCONST GpPoint *points, INT count, GpFillMode fillMode);
-
-GpStatus WINGDIPAPI
-GdipFillPolygon2(GpGraphics *graphics, GpBrush *brush,
- GDIPCONST GpPointF *points, INT count);
-
-GpStatus WINGDIPAPI
-GdipFillPolygon2I(GpGraphics *graphics, GpBrush *brush,
- GDIPCONST GpPoint *points, INT count);
-
-GpStatus WINGDIPAPI
-GdipFillEllipse(GpGraphics *graphics, GpBrush *brush, REAL x, REAL y,
- REAL width, REAL height);
-
-GpStatus WINGDIPAPI
-GdipFillEllipseI(GpGraphics *graphics, GpBrush *brush, INT x, INT y,
- INT width, INT height);
-
-GpStatus WINGDIPAPI
-GdipFillPie(GpGraphics *graphics, GpBrush *brush, REAL x, REAL y,
- REAL width, REAL height, REAL startAngle, REAL sweepAngle);
-
-GpStatus WINGDIPAPI
-GdipFillPieI(GpGraphics *graphics, GpBrush *brush, INT x, INT y,
- INT width, INT height, REAL startAngle, REAL sweepAngle);
-
-GpStatus WINGDIPAPI
-GdipFillPath(GpGraphics *graphics, GpBrush *brush, GpPath *path);
-
-GpStatus WINGDIPAPI
-GdipFillClosedCurve(GpGraphics *graphics, GpBrush *brush,
- GDIPCONST GpPointF *points, INT count);
-
-GpStatus WINGDIPAPI
-GdipFillClosedCurveI(GpGraphics *graphics, GpBrush *brush,
- GDIPCONST GpPoint *points, INT count);
-
-GpStatus WINGDIPAPI
-GdipFillClosedCurve2(GpGraphics *graphics, GpBrush *brush,
- GDIPCONST GpPointF *points, INT count,
- REAL tension, GpFillMode fillMode);
-
-GpStatus WINGDIPAPI
-GdipFillClosedCurve2I(GpGraphics *graphics, GpBrush *brush,
- GDIPCONST GpPoint *points, INT count,
- REAL tension, GpFillMode fillMode);
-
-GpStatus WINGDIPAPI
-GdipFillRegion(GpGraphics *graphics, GpBrush *brush,
- GpRegion *region);
-
-GpStatus WINGDIPAPI
-GdipDrawImage(GpGraphics *graphics, GpImage *image, REAL x, REAL y);
-
-GpStatus WINGDIPAPI
-GdipDrawImageI(GpGraphics *graphics, GpImage *image, INT x, INT y);
-
-GpStatus WINGDIPAPI
-GdipDrawImageRect(GpGraphics *graphics, GpImage *image, REAL x, REAL y,
- REAL width, REAL height);
-
-GpStatus WINGDIPAPI
-GdipDrawImageRectI(GpGraphics *graphics, GpImage *image, INT x, INT y,
- INT width, INT height);
-
-GpStatus WINGDIPAPI
-GdipDrawImagePoints(GpGraphics *graphics, GpImage *image,
- GDIPCONST GpPointF *dstpoints, INT count);
-
-GpStatus WINGDIPAPI
-GdipDrawImagePointsI(GpGraphics *graphics, GpImage *image,
- GDIPCONST GpPoint *dstpoints, INT count);
-
-GpStatus WINGDIPAPI
-GdipDrawImagePointRect(GpGraphics *graphics, GpImage *image, REAL x,
- REAL y, REAL srcx, REAL srcy, REAL srcwidth,
- REAL srcheight, GpUnit srcUnit);
-
-GpStatus WINGDIPAPI
-GdipDrawImagePointRectI(GpGraphics *graphics, GpImage *image, INT x,
- INT y, INT srcx, INT srcy, INT srcwidth,
- INT srcheight, GpUnit srcUnit);
-
-GpStatus WINGDIPAPI
-GdipDrawImageRectRect(GpGraphics *graphics, GpImage *image, REAL dstx,
- REAL dsty, REAL dstwidth, REAL dstheight,
- REAL srcx, REAL srcy, REAL srcwidth, REAL srcheight,
- GpUnit srcUnit,
- GDIPCONST GpImageAttributes* imageAttributes,
- DrawImageAbort callback, VOID * callbackData);
-
-GpStatus WINGDIPAPI
-GdipDrawImageRectRectI(GpGraphics *graphics, GpImage *image, INT dstx,
- INT dsty, INT dstwidth, INT dstheight,
- INT srcx, INT srcy, INT srcwidth, INT srcheight,
- GpUnit srcUnit,
- GDIPCONST GpImageAttributes* imageAttributes,
- DrawImageAbort callback, VOID * callbackData);
-
-GpStatus WINGDIPAPI
-GdipDrawImagePointsRect(GpGraphics *graphics, GpImage *image,
- GDIPCONST GpPointF *points, INT count, REAL srcx,
- REAL srcy, REAL srcwidth, REAL srcheight,
- GpUnit srcUnit,
- GDIPCONST GpImageAttributes* imageAttributes,
- DrawImageAbort callback, VOID * callbackData);
-
-GpStatus WINGDIPAPI
-GdipDrawImagePointsRectI(GpGraphics *graphics, GpImage *image,
- GDIPCONST GpPoint *points, INT count, INT srcx,
- INT srcy, INT srcwidth, INT srcheight,
- GpUnit srcUnit,
- GDIPCONST GpImageAttributes* imageAttributes,
- DrawImageAbort callback, VOID * callbackData);
-
-GpStatus WINGDIPAPI
-GdipEnumerateMetafileDestPoint(
- GpGraphics * graphics,
- GDIPCONST GpMetafile * metafile,
- GDIPCONST PointF & destPoint,
- EnumerateMetafileProc callback,
- VOID * callbackData,
- GDIPCONST GpImageAttributes * imageAttributes
- );
-
-GpStatus WINGDIPAPI
-GdipEnumerateMetafileDestPointI(
- GpGraphics * graphics,
- GDIPCONST GpMetafile * metafile,
- GDIPCONST Point & destPoint,
- EnumerateMetafileProc callback,
- VOID * callbackData,
- GDIPCONST GpImageAttributes * imageAttributes
- );
-
-GpStatus WINGDIPAPI
-GdipEnumerateMetafileDestRect(
- GpGraphics * graphics,
- GDIPCONST GpMetafile * metafile,
- GDIPCONST RectF & destRect,
- EnumerateMetafileProc callback,
- VOID * callbackData,
- GDIPCONST GpImageAttributes * imageAttributes
- );
-
-GpStatus WINGDIPAPI
-GdipEnumerateMetafileDestRectI(
- GpGraphics * graphics,
- GDIPCONST GpMetafile * metafile,
- GDIPCONST Rect & destRect,
- EnumerateMetafileProc callback,
- VOID * callbackData,
- GDIPCONST GpImageAttributes * imageAttributes
- );
-
-GpStatus WINGDIPAPI
-GdipEnumerateMetafileDestPoints(
- GpGraphics * graphics,
- GDIPCONST GpMetafile * metafile,
- GDIPCONST PointF * destPoints,
- INT count,
- EnumerateMetafileProc callback,
- VOID * callbackData,
- GDIPCONST GpImageAttributes * imageAttributes
- );
-
-GpStatus WINGDIPAPI
-GdipEnumerateMetafileDestPointsI(
- GpGraphics * graphics,
- GDIPCONST GpMetafile * metafile,
- GDIPCONST Point * destPoints,
- INT count,
- EnumerateMetafileProc callback,
- VOID * callbackData,
- GDIPCONST GpImageAttributes * imageAttributes
- );
-
-GpStatus WINGDIPAPI
-GdipEnumerateMetafileSrcRectDestPoint(
- GpGraphics * graphics,
- GDIPCONST GpMetafile * metafile,
- GDIPCONST PointF & destPoint,
- GDIPCONST RectF & srcRect,
- Unit srcUnit,
- EnumerateMetafileProc callback,
- VOID * callbackData,
- GDIPCONST GpImageAttributes * imageAttributes
- );
-
-GpStatus WINGDIPAPI
-GdipEnumerateMetafileSrcRectDestPointI(
- GpGraphics * graphics,
- GDIPCONST GpMetafile * metafile,
- GDIPCONST Point & destPoint,
- GDIPCONST Rect & srcRect,
- Unit srcUnit,
- EnumerateMetafileProc callback,
- VOID * callbackData,
- GDIPCONST GpImageAttributes * imageAttributes
- );
-
-GpStatus WINGDIPAPI
-GdipEnumerateMetafileSrcRectDestRect(
- GpGraphics * graphics,
- GDIPCONST GpMetafile * metafile,
- GDIPCONST RectF & destRect,
- GDIPCONST RectF & srcRect,
- Unit srcUnit,
- EnumerateMetafileProc callback,
- VOID * callbackData,
- GDIPCONST GpImageAttributes * imageAttributes
- );
-
-GpStatus WINGDIPAPI
-GdipEnumerateMetafileSrcRectDestRectI(
- GpGraphics * graphics,
- GDIPCONST GpMetafile * metafile,
- GDIPCONST Rect & destRect,
- GDIPCONST Rect & srcRect,
- Unit srcUnit,
- EnumerateMetafileProc callback,
- VOID * callbackData,
- GDIPCONST GpImageAttributes * imageAttributes
- );
-
-GpStatus WINGDIPAPI
-GdipEnumerateMetafileSrcRectDestPoints(
- GpGraphics * graphics,
- GDIPCONST GpMetafile * metafile,
- GDIPCONST PointF * destPoints,
- INT count,
- GDIPCONST RectF & srcRect,
- Unit srcUnit,
- EnumerateMetafileProc callback,
- VOID * callbackData,
- GDIPCONST GpImageAttributes * imageAttributes
- );
-
-GpStatus WINGDIPAPI
-GdipEnumerateMetafileSrcRectDestPointsI(
- GpGraphics * graphics,
- GDIPCONST GpMetafile * metafile,
- GDIPCONST Point * destPoints,
- INT count,
- GDIPCONST Rect & srcRect,
- Unit srcUnit,
- EnumerateMetafileProc callback,
- VOID * callbackData,
- GDIPCONST GpImageAttributes * imageAttributes
- );
-
-GpStatus WINGDIPAPI
-GdipPlayMetafileRecord(
- GDIPCONST GpMetafile * metafile,
- EmfPlusRecordType recordType,
- UINT flags,
- UINT dataSize,
- GDIPCONST BYTE * data
- );
-
-GpStatus WINGDIPAPI
-GdipSetClipGraphics(GpGraphics *graphics, GpGraphics *srcgraphics,
- CombineMode combineMode);
-
-GpStatus WINGDIPAPI
-GdipSetClipRect(GpGraphics *graphics, REAL x, REAL y,
- REAL width, REAL height, CombineMode combineMode);
-
-GpStatus WINGDIPAPI
-GdipSetClipRectI(GpGraphics *graphics, INT x, INT y,
- INT width, INT height, CombineMode combineMode);
-
-GpStatus WINGDIPAPI
-GdipSetClipPath(GpGraphics *graphics, GpPath *path, CombineMode combineMode);
-
-GpStatus WINGDIPAPI
-GdipSetClipRegion(GpGraphics *graphics, GpRegion *region,
- CombineMode combineMode);
-
-GpStatus WINGDIPAPI
-GdipSetClipHrgn(GpGraphics *graphics, HRGN hRgn, CombineMode combineMode);
-
-GpStatus WINGDIPAPI
-GdipResetClip(GpGraphics *graphics);
-
-GpStatus WINGDIPAPI
-GdipTranslateClip(GpGraphics *graphics, REAL dx, REAL dy);
-
-GpStatus WINGDIPAPI
-GdipTranslateClipI(GpGraphics *graphics, INT dx, INT dy);
-
-GpStatus WINGDIPAPI
-GdipGetClip(GpGraphics *graphics, GpRegion *region);
-
-GpStatus WINGDIPAPI
-GdipGetClipBounds(GpGraphics *graphics, GpRectF *rect);
-
-GpStatus WINGDIPAPI
-GdipGetClipBoundsI(GpGraphics *graphics, GpRect *rect);
-
-GpStatus WINGDIPAPI
-GdipIsClipEmpty(GpGraphics *graphics, BOOL *result);
-
-GpStatus WINGDIPAPI
-GdipGetVisibleClipBounds(GpGraphics *graphics, GpRectF *rect);
-
-GpStatus WINGDIPAPI
-GdipGetVisibleClipBoundsI(GpGraphics *graphics, GpRect *rect);
-
-GpStatus WINGDIPAPI
-GdipIsVisibleClipEmpty(GpGraphics *graphics, BOOL *result);
-
-GpStatus WINGDIPAPI
-GdipIsVisiblePoint(GpGraphics *graphics, REAL x, REAL y,
- BOOL *result);
-
-GpStatus WINGDIPAPI
-GdipIsVisiblePointI(GpGraphics *graphics, INT x, INT y,
- BOOL *result);
-
-GpStatus WINGDIPAPI
-GdipIsVisibleRect(GpGraphics *graphics, REAL x, REAL y,
- REAL width, REAL height, BOOL *result);
-
-GpStatus WINGDIPAPI
-GdipIsVisibleRectI(GpGraphics *graphics, INT x, INT y,
- INT width, INT height, BOOL *result);
-
-GpStatus WINGDIPAPI
-GdipSaveGraphics(GpGraphics *graphics, GraphicsState *state);
-
-GpStatus WINGDIPAPI
-GdipRestoreGraphics(GpGraphics *graphics, GraphicsState state);
-
-GpStatus WINGDIPAPI
-GdipBeginContainer(GpGraphics *graphics, GDIPCONST GpRectF* dstrect,
- GDIPCONST GpRectF *srcrect, GpUnit unit, GraphicsContainer *state);
-
-GpStatus WINGDIPAPI
-GdipBeginContainerI(GpGraphics *graphics, GDIPCONST GpRect* dstrect,
- GDIPCONST GpRect *srcrect, GpUnit unit, GraphicsContainer *state);
-
-GpStatus WINGDIPAPI
-GdipBeginContainer2(GpGraphics *graphics, GraphicsContainer* state);
-
-GpStatus WINGDIPAPI
-GdipEndContainer(GpGraphics *graphics, GraphicsContainer state);
-
-GpStatus
-GdipGetMetafileHeaderFromWmf(
- HMETAFILE hWmf,
- GDIPCONST APMFileHeader * apmFileHeader,
- MetafileHeader * header
- );
-
-GpStatus
-WINGDIPAPI
-GdipGetMetafileHeaderFromEmf(
- HENHMETAFILE hEmf,
- MetafileHeader * header
- );
-
-GpStatus
-WINGDIPAPI
-GdipGetMetafileHeaderFromFile(
- GDIPCONST WCHAR* filename,
- MetafileHeader * header
- );
-
-GpStatus
-WINGDIPAPI
-GdipGetMetafileHeaderFromStream(
- IStream * stream,
- MetafileHeader * header
- );
-
-GpStatus
-WINGDIPAPI
-GdipGetMetafileHeaderFromMetafile(
- GpMetafile * metafile,
- MetafileHeader * header
- );
-
-GpStatus
-WINGDIPAPI
-GdipGetHemfFromMetafile(
- GpMetafile * metafile,
- HENHMETAFILE * hEmf
- );
-
-GpStatus WINGDIPAPI
-GdipCreateStreamOnFile(GDIPCONST WCHAR * filename, UINT access, IStream **stream);
-
-GpStatus WINGDIPAPI
-GdipCreateMetafileFromWmf(HMETAFILE hWmf, BOOL deleteWmf,
- GDIPCONST APMFileHeader * apmFileHeader, GpMetafile **metafile);
-
-GpStatus WINGDIPAPI
-GdipCreateMetafileFromEmf(HENHMETAFILE hEmf, BOOL deleteEmf,
- GpMetafile **metafile);
-
-GpStatus WINGDIPAPI
-GdipCreateMetafileFromFile(GDIPCONST WCHAR* file, GpMetafile **metafile);
-
-GpStatus WINGDIPAPI
-GdipCreateMetafileFromWmfFile(GDIPCONST WCHAR* file, GDIPCONST APMFileHeader * apmFileHeader, GpMetafile **metafile);
-
-GpStatus WINGDIPAPI
-GdipCreateMetafileFromStream(IStream * stream, GpMetafile **metafile);
-
-GpStatus WINGDIPAPI
-GdipRecordMetafile(
- HDC referenceHdc,
- EmfType type,
- GDIPCONST GpRectF * frameRect,
- MetafileFrameUnit frameUnit,
- GDIPCONST WCHAR * description,
- GpMetafile ** metafile
- );
-
-GpStatus WINGDIPAPI
-GdipRecordMetafileI(
- HDC referenceHdc,
- EmfType type,
- GDIPCONST GpRect * frameRect,
- MetafileFrameUnit frameUnit,
- GDIPCONST WCHAR * description,
- GpMetafile ** metafile
- );
-
-GpStatus WINGDIPAPI
-GdipRecordMetafileFileName(
- GDIPCONST WCHAR* fileName,
- HDC referenceHdc,
- EmfType type,
- GDIPCONST GpRectF * frameRect,
- MetafileFrameUnit frameUnit,
- GDIPCONST WCHAR * description,
- GpMetafile ** metafile
- );
-
-GpStatus WINGDIPAPI
-GdipRecordMetafileFileNameI(
- GDIPCONST WCHAR* fileName,
- HDC referenceHdc,
- EmfType type,
- GDIPCONST GpRect * frameRect,
- MetafileFrameUnit frameUnit,
- GDIPCONST WCHAR * description,
- GpMetafile ** metafile
- );
-
-GpStatus WINGDIPAPI
-GdipRecordMetafileStream(
- IStream * stream,
- HDC referenceHdc,
- EmfType type,
- GDIPCONST GpRectF * frameRect,
- MetafileFrameUnit frameUnit,
- GDIPCONST WCHAR * description,
- GpMetafile ** metafile
- );
-
-GpStatus WINGDIPAPI
-GdipRecordMetafileStreamI(
- IStream * stream,
- HDC referenceHdc,
- EmfType type,
- GDIPCONST GpRect * frameRect,
- MetafileFrameUnit frameUnit,
- GDIPCONST WCHAR * description,
- GpMetafile ** metafile
- );
-
-GpStatus WINGDIPAPI
-GdipSetMetafileDownLevelRasterizationLimit(
- GpMetafile * metafile,
- UINT metafileRasterizationLimitDpi
- );
-
-GpStatus WINGDIPAPI
-GdipGetMetafileDownLevelRasterizationLimit(
- GDIPCONST GpMetafile * metafile,
- UINT * metafileRasterizationLimitDpi
- );
-
-GpStatus WINGDIPAPI
-GdipGetImageDecodersSize(UINT *numDecoders, UINT *size);
-
-GpStatus WINGDIPAPI
-GdipGetImageDecoders(UINT numDecoders,
- UINT size,
- ImageCodecInfo *decoders);
-
-GpStatus WINGDIPAPI
-GdipGetImageEncodersSize(UINT *numEncoders, UINT *size);
-
-GpStatus WINGDIPAPI
-GdipGetImageEncoders(UINT numEncoders,
- UINT size,
- ImageCodecInfo *encoders);
-
-GpStatus WINGDIPAPI
-GdipAddImageCodec(GDIPCONST ImageCodecInfo *codec);
-
-GpStatus WINGDIPAPI
-GdipRemoveImageCodec(GDIPCONST ImageCodecInfo *codec);
-
-#ifndef DCR_USE_NEW_186091
-GpStatus WINGDIPAPI
-GdipGetGraphicsPixel(GpGraphics* graphics, REAL x, REAL y, ARGB* argb);
-#endif
-
-GpStatus WINGDIPAPI
-GdipComment(GpGraphics* graphics, UINT sizeData, GDIPCONST BYTE * data);
-
-GpStatus WINGDIPAPI
-GdipGetGraphicsLayout(GpGraphics* graphics, GraphicsLayout* layout);
-
-GpStatus WINGDIPAPI
-GdipSetGraphicsLayout(GpGraphics* graphics, GDIPCONST GraphicsLayout layout);
-
-//----------------------------------------------------------------------------
-// FontFamily
-//----------------------------------------------------------------------------
-
-GpStatus WINGDIPAPI
-GdipCreateFontFamilyFromName(GDIPCONST WCHAR *name,
- GpFontCollection *fontCollection,
- GpFontFamily **FontFamily);
-
-GpStatus WINGDIPAPI
-GdipDeleteFontFamily(GpFontFamily *FontFamily);
-
-GpStatus WINGDIPAPI
-GdipCloneFontFamily(GpFontFamily *FontFamily, GpFontFamily **clonedFontFamily);
-
-GpStatus WINGDIPAPI
-GdipGetGenericFontFamilySansSerif(GpFontFamily **nativeFamily);
-
-GpStatus WINGDIPAPI
-GdipGetGenericFontFamilySerif(GpFontFamily **nativeFamily);
-
-GpStatus WINGDIPAPI
-GdipGetGenericFontFamilyMonospace(GpFontFamily **nativeFamily);
-
-
-GpStatus WINGDIPAPI
-GdipGetFamilyName(
- GDIPCONST GpFontFamily *family,
- WCHAR name[LF_FACESIZE],
- LANGID language
-);
-
-GpStatus WINGDIPAPI
-GdipIsStyleAvailable(GDIPCONST GpFontFamily *family, INT style, BOOL * IsStyleAvailable);
-
-GpStatus WINGDIPAPI
-GdipFontCollectionEnumerable(
- GpFontCollection* fontCollection,
- GpGraphics* graphics,
- INT * numFound
-);
-
-GpStatus WINGDIPAPI GdipFontCollectionEnumerate(
- GpFontCollection* fontCollection,
- INT numSought,
- GpFontFamily* gpfamilies[],
- INT* numFound,
- GpGraphics* graphics
-);
-
-//-----------------------------------
-// New API
-//-----------------------------------
-
-GpStatus WINGDIPAPI
-GdipGetEmHeight(GDIPCONST GpFontFamily *family, INT style, UINT16 * EmHeight);
-
-GpStatus WINGDIPAPI
-GdipGetCellAscent(GDIPCONST GpFontFamily *family, INT style, UINT16 * CellAscent);
-
-GpStatus WINGDIPAPI
-GdipGetCellDescent(GDIPCONST GpFontFamily *family, INT style, UINT16 * CellDescent);
-
-GpStatus WINGDIPAPI
-GdipGetLineSpacing(GDIPCONST GpFontFamily *family, INT style, UINT16 * LineSpacing);
-
-
-//----------------------------------------------------------------------------
-// Font
-//----------------------------------------------------------------------------
-
-GpStatus WINGDIPAPI
-GdipCreateFontFromDC(
- HDC hdc,
- GpFont **font
-);
-
-GpStatus WINGDIPAPI
-GdipCreateFontFromLogfontA(
- HDC hdc,
- GDIPCONST LOGFONTA *logfont,
- GpFont **font
-);
-
-GpStatus WINGDIPAPI
-GdipCreateFontFromLogfontW(
- HDC hdc,
- GDIPCONST LOGFONTW *logfont,
- GpFont **font
-);
-
-GpStatus WINGDIPAPI
-GdipCreateFont(
- GDIPCONST GpFontFamily *fontFamily,
- REAL emSize,
- INT style,
- Unit unit,
- GpFont **font
-);
-
-GpStatus WINGDIPAPI
-GdipCloneFont(GpFont* font, GpFont** cloneFont);
-
-GpStatus WINGDIPAPI
-GdipDeleteFont(GpFont* font);
-
-GpStatus WINGDIPAPI
-GdipGetFamily(GpFont *font, GpFontFamily **family);
-
-GpStatus WINGDIPAPI
-GdipGetFontStyle(GpFont *font, INT *style);
-
-GpStatus WINGDIPAPI
-GdipGetFontSize(GpFont *font, REAL *size);
-
-GpStatus WINGDIPAPI
-GdipGetFontUnit(GpFont *font, Unit *unit);
-
-GpStatus WINGDIPAPI
-GdipGetFontHeight(GDIPCONST GpFont *font, GDIPCONST GpGraphics *graphics, REAL *height);
-
-#ifdef DCR_USE_NEW_125467
-GpStatus WINGDIPAPI
-GdipGetFontHeightGivenDPI(GDIPCONST GpFont *font, REAL dpi, REAL *height);
-#endif
-
-GpStatus WINGDIPAPI
-GdipGetLogFontA(GpFont * font, GpGraphics *graphics, LOGFONTA * logfontA);
-
-GpStatus WINGDIPAPI
-GdipGetLogFontW(GpFont * font, GpGraphics *graphics, LOGFONTW * logfontW);
-
-// FontCollection
-
-GpStatus WINGDIPAPI
-GdipNewInstalledFontCollection(GpFontCollection** fontCollection);
-
-GpStatus WINGDIPAPI
-GdipNewPrivateFontCollection(GpFontCollection** fontCollection);
-
-GpStatus WINGDIPAPI
-GdipDeletePrivateFontCollection(GpFontCollection** fontCollection);
-
-GpStatus WINGDIPAPI
-GdipGetFontCollectionFamilyCount(
- GpFontCollection* fontCollection,
- INT * numFound
-);
-
-GpStatus WINGDIPAPI
-GdipGetFontCollectionFamilyList(
- GpFontCollection* fontCollection,
- INT numSought,
- GpFontFamily* gpfamilies[],
- INT* numFound
-);
-
-#ifndef DCR_USE_NEW_235072
-GpStatus WINGDIPAPI
-GdipInstallFontFile(
- GpFontCollection* fontCollection,
- GDIPCONST WCHAR* filename
-);
-
-GpStatus WINGDIPAPI
-GdipUninstallFontFile(
- GpFontCollection* fontCollection,
- GDIPCONST WCHAR* filename
-);
-#endif
-
-GpStatus WINGDIPAPI
-GdipPrivateAddFontFile(
- GpFontCollection* fontCollection,
- GDIPCONST WCHAR* filename
-);
-
-GpStatus WINGDIPAPI
-GdipPrivateAddMemoryFont(
- GpFontCollection* fontCollection,
- GDIPCONST void* memory,
- INT length
-);
-
-//----------------------------------------------------------------------------
-// Text
-//----------------------------------------------------------------------------
-
-GpStatus WINGDIPAPI
-GdipDrawString(
- GpGraphics *graphics,
- GDIPCONST WCHAR *string,
- INT length,
- GDIPCONST GpFont *font,
- GDIPCONST RectF *layoutRect,
- GDIPCONST GpStringFormat *stringFormat,
- GDIPCONST GpBrush *brush
-);
-
-GpStatus WINGDIPAPI
-GdipMeasureString(
- GpGraphics *graphics,
- GDIPCONST WCHAR *string,
- INT length,
- GDIPCONST GpFont *font,
- GDIPCONST RectF *layoutRect,
- GDIPCONST GpStringFormat *stringFormat,
- RectF *boundingBox,
- INT *codepointsFitted,
- INT *linesFilled
-);
-
-#ifndef DCR_USE_NEW_174340
-GpStatus WINGDIPAPI
-GdipMeasureStringRegion(
- GpGraphics *graphics,
- GDIPCONST WCHAR *string,
- INT length,
- GDIPCONST GpFont *font,
- GDIPCONST RectF &layoutRect,
- GDIPCONST GpStringFormat *stringFormat,
- INT firstCharacterIndex,
- INT characterCount,
- GpRegion *region
-);
-#endif
-
-#ifdef DCR_USE_NEW_174340
-GpStatus
-WINGDIPAPI
-GdipMeasureCharacterRanges(
- GpGraphics *graphics,
- GDIPCONST WCHAR *string,
- INT length,
- GDIPCONST GpFont *font,
- GDIPCONST RectF &layoutRect,
- GDIPCONST GpStringFormat *stringFormat,
- INT regionCount,
- GpRegion **regions
-);
-#endif
-
-GpStatus WINGDIPAPI
-GdipDrawDriverString(
- GpGraphics *graphics,
- GDIPCONST UINT16 *text,
- INT length,
- GDIPCONST GpFont *font,
- GDIPCONST GpBrush *brush,
- GDIPCONST PointF *positions,
- INT flags,
- GDIPCONST GpMatrix *matrix
-);
-
-GpStatus WINGDIPAPI
-GdipMeasureDriverString(
- GpGraphics *graphics,
- GDIPCONST UINT16 *text,
- INT length,
- GDIPCONST GpFont *font,
- GDIPCONST PointF *positions,
- INT flags,
- GDIPCONST GpMatrix *matrix,
- RectF *boundingBox
-);
-
-#ifndef DCR_USE_NEW_168772
-GpStatus WINGDIPAPI
-GdipDriverStringPointToCodepoint(
- GpGraphics *graphics,
- GDIPCONST UINT16 *text,
- INT length,
- GDIPCONST GpFont *font,
- GDIPCONST PointF *positions,
- INT flags,
- GpMatrix *matrix,
- GDIPCONST PointF *hit,
- INT *index,
- BOOL *rightEdge,
- REAL *distance
-);
-#endif
-
-//----------------------------------------------------------------------------
-// String format APIs
-//----------------------------------------------------------------------------
-
-GpStatus WINGDIPAPI
-GdipCreateStringFormat(
- INT formatAttributes,
- LANGID language,
- GpStringFormat **format
-);
-
-GpStatus WINGDIPAPI
-GdipStringFormatGetGenericDefault(GpStringFormat **format);
-
-GpStatus WINGDIPAPI
-GdipStringFormatGetGenericTypographic(GpStringFormat **format);
-
-GpStatus WINGDIPAPI
-GdipDeleteStringFormat(GpStringFormat *format);
-
-GpStatus WINGDIPAPI
-GdipCloneStringFormat(GDIPCONST GpStringFormat *format, GpStringFormat **newFormat);
-
-GpStatus WINGDIPAPI
-GdipSetStringFormatFlags(GpStringFormat *format, INT flags);
-
-GpStatus WINGDIPAPI GdipGetStringFormatFlags(GDIPCONST GpStringFormat *format, INT *flags);
-
-#ifndef DCR_USE_NEW_152154
-GpStatus WINGDIPAPI
-GdipSetStringFormatLineSpacing(GpStringFormat *format, REAL amount,
- LineSpacing method);
-
-GpStatus WINGDIPAPI
-GdipGetStringFormatLineSpacingAmount(GDIPCONST GpStringFormat *format, REAL *amount);
-GpStatus WINGDIPAPI
-GdipGetStringFormatLineSpacingMethod(GDIPCONST GpStringFormat *format, LineSpacing *method);
-#endif
-
-GpStatus WINGDIPAPI
-GdipSetStringFormatAlign(GpStringFormat *format, StringAlignment align);
-
-GpStatus WINGDIPAPI
-GdipGetStringFormatAlign(GDIPCONST GpStringFormat *format, StringAlignment *align);
-
-GpStatus WINGDIPAPI
-GdipSetStringFormatLineAlign(GpStringFormat *format,
- StringAlignment align);
-
-GpStatus WINGDIPAPI
-GdipGetStringFormatLineAlign(GDIPCONST GpStringFormat *format,
- StringAlignment *align);
-
-GpStatus WINGDIPAPI
-GdipSetStringFormatTrimming(
- GpStringFormat *format,
- StringTrimming trimming
-);
-
-GpStatus WINGDIPAPI
-GdipGetStringFormatTrimming(
- GDIPCONST GpStringFormat *format,
- StringTrimming *trimming
-);
-
-GpStatus WINGDIPAPI
-GdipSetStringFormatHotkeyPrefix(GpStringFormat *format, INT hotkeyPrefix);
-
-GpStatus WINGDIPAPI
-GdipGetStringFormatHotkeyPrefix(GDIPCONST GpStringFormat *format, INT *hotkeyPrefix);
-
-GpStatus WINGDIPAPI
-GdipSetStringFormatTabStops(GpStringFormat *format, REAL firstTabOffset, INT count, GDIPCONST REAL *tabStops);
-
-GpStatus WINGDIPAPI
-GdipGetStringFormatTabStops(GDIPCONST GpStringFormat *format, INT count, REAL *firstTabOffset, REAL *tabStops);
-
-GpStatus WINGDIPAPI
-GdipGetStringFormatTabStopCount(GDIPCONST GpStringFormat *format, INT * count);
-
-#ifdef DCR_USE_NEW_146933
-GpStatus WINGDIPAPI
-GdipSetStringFormatDigitSubstitution(GpStringFormat *format, LANGID language,
- StringDigitSubstitute substitute);
-
-GpStatus WINGDIPAPI
-GdipGetStringFormatDigitSubstitution(GDIPCONST GpStringFormat *format, LANGID *language,
- StringDigitSubstitute *substitute);
-#endif // DCR_USE_NEW_146933
-
-#ifdef DCR_USE_NEW_174340
-GpStatus WINGDIPAPI
-GdipGetStringFormatMeasurableCharacterRangeCount(
- GDIPCONST GpStringFormat *format,
- INT *count
-);
-
-GpStatus WINGDIPAPI
-GdipSetStringFormatMeasurableCharacterRanges(
- GpStringFormat *format,
- INT rangeCount,
- GDIPCONST CharacterRange *ranges
-);
-#endif
-
-//----------------------------------------------------------------------------
-// Cached Bitmap APIs
-//----------------------------------------------------------------------------
-
-GpStatus WINGDIPAPI
-GdipCreateCachedBitmap(
- GpBitmap *bitmap,
- GpGraphics *graphics,
- GpCachedBitmap **cachedBitmap
-);
-
-GpStatus WINGDIPAPI
-GdipDeleteCachedBitmap(GpCachedBitmap *cachedBitmap);
-
-GpStatus WINGDIPAPI
-GdipDrawCachedBitmap(
- GpGraphics *graphics,
- GpCachedBitmap *cachedBitmap,
- INT x,
- INT y
-);
-
-UINT WINGDIPAPI
-GdipEmfToWmfBits(
- HENHMETAFILE hemf,
- UINT cbData16,
- LPBYTE pData16,
- INT iMapMode,
- INT eFlags
-);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // !_FLATAPI_H
+/**************************************************************************\
+*
+* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
+*
+* Module Name:
+*
+* GdiplusFlat.h
+*
+* Abstract:
+*
+* Flat GDI+ API wrappers - header file
+*
+\**************************************************************************/
+
+// TODO: this file style needs to be made internally consistent with the way
+// it handles breaking the long argument lists across multiple lines
+
+#ifndef _FLATAPI_H
+#define _FLATAPI_H
+
+#define WINGDIPAPI __stdcall
+
+// currently, only C++ wrapper API's force const.
+
+#define GDIPCONST const
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef DCR_USE_NEW_175866
+
+VOID
+WINGDIPAPI
+GdipDisplayPaletteWindowNotify(WindowNotifyEnum notify);
+
+#endif
+
+//----------------------------------------------------------------------------
+// GraphicsPath methods
+//----------------------------------------------------------------------------
+
+GpStatus WINGDIPAPI
+GdipCreatePath(GpFillMode brushMode, GpPath **path);
+
+GpStatus WINGDIPAPI
+GdipCreatePath2(GDIPCONST GpPointF*, GDIPCONST BYTE*, INT, GpFillMode,
+ GpPath **path);
+
+GpStatus WINGDIPAPI
+GdipCreatePath2I(GDIPCONST GpPoint*, GDIPCONST BYTE*, INT, GpFillMode,
+ GpPath **path);
+
+GpStatus WINGDIPAPI
+GdipClonePath(GpPath* path, GpPath **clonePath);
+
+GpStatus WINGDIPAPI
+GdipDeletePath(GpPath* path);
+
+GpStatus WINGDIPAPI
+GdipResetPath(GpPath* path);
+
+GpStatus WINGDIPAPI
+GdipGetPointCount(GpPath* path, INT* count);
+
+GpStatus WINGDIPAPI
+GdipGetPathTypes(GpPath* path, BYTE* types, INT count);
+
+GpStatus WINGDIPAPI
+GdipGetPathPoints(GpPath*, GpPointF* points, INT count);
+
+GpStatus WINGDIPAPI
+GdipGetPathPointsI(GpPath*, GpPoint* points, INT count);
+
+GpStatus WINGDIPAPI
+GdipGetPathFillMode(GpPath *path, GpFillMode *fillmode);
+
+GpStatus WINGDIPAPI
+GdipSetPathFillMode(GpPath *path, GpFillMode fillmode);
+
+GpStatus WINGDIPAPI
+GdipGetPathData(GpPath *path, GpPathData* pathData);
+
+GpStatus WINGDIPAPI
+GdipStartPathFigure(GpPath *path);
+
+GpStatus WINGDIPAPI
+GdipClosePathFigure(GpPath *path);
+
+GpStatus WINGDIPAPI
+GdipClosePathFigures(GpPath *path);
+
+GpStatus WINGDIPAPI
+GdipSetPathMarker(GpPath* path);
+
+GpStatus WINGDIPAPI
+GdipClearPathMarkers(GpPath* path);
+
+GpStatus WINGDIPAPI
+GdipReversePath(GpPath* path);
+
+GpStatus WINGDIPAPI
+GdipGetPathLastPoint(GpPath* path, GpPointF* lastPoint);
+
+GpStatus WINGDIPAPI
+GdipAddPathLine(GpPath *path, REAL x1, REAL y1, REAL x2, REAL y2);
+
+GpStatus WINGDIPAPI
+GdipAddPathLine2(GpPath *path, GDIPCONST GpPointF *points, INT count);
+
+GpStatus WINGDIPAPI
+GdipAddPathArc(GpPath *path, REAL x, REAL y, REAL width, REAL height,
+ REAL startAngle, REAL sweepAngle);
+
+GpStatus WINGDIPAPI
+GdipAddPathBezier(GpPath *path, REAL x1, REAL y1, REAL x2, REAL y2,
+ REAL x3, REAL y3, REAL x4, REAL y4);
+
+GpStatus WINGDIPAPI
+GdipAddPathBeziers(GpPath *path, GDIPCONST GpPointF *points, INT count);
+
+GpStatus WINGDIPAPI
+GdipAddPathCurve(GpPath *path, GDIPCONST GpPointF *points, INT count);
+
+GpStatus WINGDIPAPI
+GdipAddPathCurve2(GpPath *path, GDIPCONST GpPointF *points, INT count,
+ REAL tension);
+
+GpStatus WINGDIPAPI
+GdipAddPathCurve3(GpPath *path, GDIPCONST GpPointF *points, INT count,
+ INT offset, INT numberOfSegments, REAL tension);
+
+GpStatus WINGDIPAPI
+GdipAddPathClosedCurve(GpPath *path, GDIPCONST GpPointF *points, INT count);
+
+GpStatus WINGDIPAPI
+GdipAddPathClosedCurve2(GpPath *path, GDIPCONST GpPointF *points, INT count,
+ REAL tension);
+
+GpStatus WINGDIPAPI
+GdipAddPathRectangle(GpPath *path, REAL x, REAL y, REAL width, REAL height);
+
+GpStatus WINGDIPAPI
+GdipAddPathRectangles(GpPath *path, GDIPCONST GpRectF *rects, INT count);
+
+GpStatus WINGDIPAPI
+GdipAddPathEllipse(GpPath *path, REAL x, REAL y, REAL width,
+ REAL height);
+
+GpStatus WINGDIPAPI
+GdipAddPathPie(GpPath *path, REAL x, REAL y, REAL width, REAL height,
+ REAL startAngle, REAL sweepAngle);
+
+GpStatus WINGDIPAPI
+GdipAddPathPolygon(GpPath *path, GDIPCONST GpPointF *points, INT count);
+
+GpStatus WINGDIPAPI
+GdipAddPathPath(GpPath *path, GDIPCONST GpPath* addingPath, BOOL connect);
+
+GpStatus WINGDIPAPI
+GdipAddPathString(GpPath *path, GDIPCONST WCHAR *string,
+ INT length, GDIPCONST GpFontFamily *family, INT style,
+ REAL emSize, GDIPCONST RectF *layoutRect,
+ GDIPCONST GpStringFormat *format);
+
+GpStatus WINGDIPAPI
+GdipAddPathStringI(GpPath *path, GDIPCONST WCHAR *string,
+ INT length, GDIPCONST GpFontFamily *family, INT style,
+ REAL emSize, GDIPCONST Rect *layoutRect,
+ GDIPCONST GpStringFormat *format);
+
+GpStatus WINGDIPAPI
+GdipAddPathLineI(GpPath *path, INT x1, INT y1, INT x2, INT y2);
+
+GpStatus WINGDIPAPI
+GdipAddPathLine2I(GpPath *path, GDIPCONST GpPoint *points, INT count);
+
+GpStatus WINGDIPAPI
+GdipAddPathArcI(GpPath *path, INT x, INT y, INT width, INT height,
+ REAL startAngle, REAL sweepAngle);
+
+GpStatus WINGDIPAPI
+GdipAddPathBezierI(GpPath *path, INT x1, INT y1, INT x2, INT y2,
+ INT x3, INT y3, INT x4, INT y4);
+
+GpStatus WINGDIPAPI
+GdipAddPathBeziersI(GpPath *path, GDIPCONST GpPoint *points, INT count);
+
+GpStatus WINGDIPAPI
+GdipAddPathCurveI(GpPath *path, GDIPCONST GpPoint *points, INT count);
+
+GpStatus WINGDIPAPI
+GdipAddPathCurve2I(GpPath *path, GDIPCONST GpPoint *points, INT count,
+ REAL tension);
+
+GpStatus WINGDIPAPI
+GdipAddPathCurve3I(GpPath *path, GDIPCONST GpPoint *points, INT count,
+ INT offset, INT numberOfSegments, REAL tension);
+
+GpStatus WINGDIPAPI
+GdipAddPathClosedCurveI(GpPath *path, GDIPCONST GpPoint *points, INT count);
+
+GpStatus WINGDIPAPI
+GdipAddPathClosedCurve2I(GpPath *path, GDIPCONST GpPoint *points, INT count,
+ REAL tension);
+
+GpStatus WINGDIPAPI
+GdipAddPathRectangleI(GpPath *path, INT x, INT y, INT width, INT height);
+
+GpStatus WINGDIPAPI
+GdipAddPathRectanglesI(GpPath *path, GDIPCONST GpRect *rects, INT count);
+
+GpStatus WINGDIPAPI
+GdipAddPathEllipseI(GpPath *path, INT x, INT y, INT width, INT height);
+
+GpStatus WINGDIPAPI
+GdipAddPathPieI(GpPath *path, INT x, INT y, INT width, INT height,
+ REAL startAngle, REAL sweepAngle);
+
+GpStatus WINGDIPAPI
+GdipAddPathPolygonI(GpPath *path, GDIPCONST GpPoint *points, INT count);
+
+GpStatus WINGDIPAPI
+GdipFlattenPath(GpPath *path, GpMatrix* matrix, REAL flatness);
+
+GpStatus WINGDIPAPI
+GdipWindingModeOutline(
+ GpPath *path,
+ GpMatrix *matrix,
+ REAL flatness
+);
+
+
+#ifdef DCR_USE_NEW_202903
+
+GpStatus WINGDIPAPI
+GdipWidenPath(
+ GpPath *nativePath,
+ GpPen *pen,
+ GpMatrix *matrix,
+ REAL flatness
+);
+
+#else
+
+GpStatus WINGDIPAPI
+GdipWidenPathWithMinimumResolutions(GpPath *path, GpPen *pen, REAL minXres,
+ REAL minYres, GpMatrix *matrix, BOOL removeSelftIntersects);
+
+#endif
+
+GpStatus WINGDIPAPI
+GdipWarpPath(GpPath *path, GpMatrix* matrix,
+ GDIPCONST GpPointF *points, INT count,
+ REAL srcx, REAL srcy, REAL srcwidth, REAL srcheight,
+ WarpMode warpMode, REAL flatness);
+
+GpStatus WINGDIPAPI
+GdipTransformPath(GpPath* path, GpMatrix* matrix);
+
+GpStatus WINGDIPAPI
+GdipGetPathWorldBounds(GpPath* path, GpRectF* bounds, GDIPCONST GpMatrix *matrix,
+ GDIPCONST GpPen *pen);
+
+GpStatus WINGDIPAPI
+GdipGetPathWorldBoundsI(GpPath* path, GpRect* bounds, GDIPCONST GpMatrix *matrix,
+ GDIPCONST GpPen *pen);
+
+GpStatus WINGDIPAPI
+GdipIsVisiblePathPoint(GpPath* path, REAL x, REAL y,
+ GpGraphics *graphics, BOOL *result);
+
+GpStatus WINGDIPAPI
+GdipIsVisiblePathPointI(GpPath* path, INT x, INT y,
+ GpGraphics *graphics, BOOL *result);
+
+GpStatus WINGDIPAPI
+GdipIsOutlineVisiblePathPoint(GpPath* path, REAL x, REAL y, GpPen *pen,
+ GpGraphics *graphics, BOOL *result);
+
+GpStatus WINGDIPAPI
+GdipIsOutlineVisiblePathPointI(GpPath* path, INT x, INT y, GpPen *pen,
+ GpGraphics *graphics, BOOL *result);
+
+
+//----------------------------------------------------------------------------
+// Path Enumeration methods
+//----------------------------------------------------------------------------
+
+GpStatus WINGDIPAPI
+GdipCreatePathIter(GpPathIterator **iterator, GpPath* path);
+
+GpStatus WINGDIPAPI
+GdipDeletePathIter(GpPathIterator *iterator);
+
+GpStatus WINGDIPAPI
+GdipPathIterNextSubpath(GpPathIterator* iterator, INT *resultCount,
+ INT* startIndex, INT* endIndex, BOOL* isClosed);
+
+GpStatus WINGDIPAPI
+GdipPathIterNextSubpathPath(GpPathIterator* iterator, INT* resultCount,
+ GpPath* path, BOOL* isClosed);
+
+GpStatus WINGDIPAPI
+GdipPathIterNextPathType(GpPathIterator* iterator, INT* resultCount,
+ BYTE* pathType, INT* startIndex, INT* endIndex);
+
+GpStatus WINGDIPAPI
+GdipPathIterNextMarker(GpPathIterator* iterator, INT *resultCount,
+ INT* startIndex, INT* endIndex);
+
+GpStatus WINGDIPAPI
+GdipPathIterNextMarkerPath(GpPathIterator* iterator, INT* resultCount,
+ GpPath* path);
+
+GpStatus WINGDIPAPI
+GdipPathIterGetCount(GpPathIterator* iterator, INT* count);
+
+GpStatus WINGDIPAPI
+GdipPathIterGetSubpathCount(GpPathIterator* iterator, INT* count);
+
+GpStatus WINGDIPAPI
+GdipPathIterIsValid(GpPathIterator* iterator, BOOL* valid);
+
+GpStatus WINGDIPAPI
+GdipPathIterHasCurve(GpPathIterator* iterator, BOOL* hasCurve);
+
+GpStatus WINGDIPAPI
+GdipPathIterRewind(GpPathIterator* iterator);
+
+GpStatus WINGDIPAPI
+GdipPathIterEnumerate(GpPathIterator* iterator, INT* resultCount,
+ GpPointF *points, BYTE *types, INT count);
+
+GpStatus WINGDIPAPI
+GdipPathIterCopyData(GpPathIterator* iterator, INT* resultCount,
+ GpPointF* points, BYTE* types, INT startIndex, INT endIndex);
+
+//----------------------------------------------------------------------------
+// Matrix methods
+//----------------------------------------------------------------------------
+
+GpStatus WINGDIPAPI
+GdipCreateMatrix(GpMatrix **matrix);
+
+GpStatus WINGDIPAPI
+GdipCreateMatrix2(REAL m11, REAL m12, REAL m21, REAL m22, REAL dx,
+ REAL dy, GpMatrix **matrix);
+
+GpStatus WINGDIPAPI
+GdipCreateMatrix3(GDIPCONST GpRectF *rect, GDIPCONST GpPointF *dstplg,
+ GpMatrix **matrix);
+
+GpStatus WINGDIPAPI
+GdipCreateMatrix3I(GDIPCONST GpRect *rect, GDIPCONST GpPoint *dstplg,
+ GpMatrix **matrix);
+
+GpStatus WINGDIPAPI
+GdipCloneMatrix(GpMatrix *matrix, GpMatrix **cloneMatrix);
+
+GpStatus WINGDIPAPI
+GdipDeleteMatrix(GpMatrix *matrix);
+
+GpStatus WINGDIPAPI
+GdipSetMatrixElements(GpMatrix *matrix, REAL m11, REAL m12, REAL m21, REAL m22,
+ REAL dx, REAL dy);
+
+GpStatus WINGDIPAPI
+GdipMultiplyMatrix(GpMatrix *matrix, GpMatrix* matrix2,
+ GpMatrixOrder order);
+
+GpStatus WINGDIPAPI
+GdipTranslateMatrix(GpMatrix *matrix, REAL offsetX, REAL offsetY,
+ GpMatrixOrder order);
+
+GpStatus WINGDIPAPI
+GdipScaleMatrix(GpMatrix *matrix, REAL scaleX, REAL scaleY,
+ GpMatrixOrder order);
+
+GpStatus WINGDIPAPI
+GdipRotateMatrix(GpMatrix *matrix, REAL angle, GpMatrixOrder order);
+
+GpStatus WINGDIPAPI
+GdipShearMatrix(GpMatrix *matrix, REAL shearX, REAL shearY,
+ GpMatrixOrder order);
+
+GpStatus WINGDIPAPI
+GdipInvertMatrix(GpMatrix *matrix);
+
+GpStatus WINGDIPAPI
+GdipTransformMatrixPoints(GpMatrix *matrix, GpPointF *pts, INT count);
+
+GpStatus WINGDIPAPI
+GdipTransformMatrixPointsI(GpMatrix *matrix, GpPoint *pts, INT count);
+
+GpStatus WINGDIPAPI
+GdipVectorTransformMatrixPoints(GpMatrix *matrix, GpPointF *pts,
+ INT count);
+
+GpStatus WINGDIPAPI
+GdipVectorTransformMatrixPointsI(GpMatrix *matrix, GpPoint *pts,
+ INT count);
+
+GpStatus WINGDIPAPI
+GdipGetMatrixElements(GDIPCONST GpMatrix *matrix, REAL *matrixOut);
+
+GpStatus WINGDIPAPI
+GdipIsMatrixInvertible(GDIPCONST GpMatrix *matrix, BOOL *result);
+
+GpStatus WINGDIPAPI
+GdipIsMatrixIdentity(GDIPCONST GpMatrix *matrix, BOOL *result);
+
+GpStatus WINGDIPAPI
+GdipIsMatrixEqual(GDIPCONST GpMatrix *matrix, GDIPCONST GpMatrix *matrix2, BOOL *result);
+
+//----------------------------------------------------------------------------
+// Region methods
+//----------------------------------------------------------------------------
+
+GpStatus WINGDIPAPI
+GdipCreateRegion(GpRegion **region);
+
+GpStatus WINGDIPAPI
+GdipCreateRegionRect(GDIPCONST GpRectF *rect, GpRegion **region);
+
+GpStatus WINGDIPAPI
+GdipCreateRegionRectI(GDIPCONST GpRect *rect, GpRegion **region);
+
+GpStatus WINGDIPAPI
+GdipCreateRegionPath(GpPath *path, GpRegion **region);
+
+GpStatus WINGDIPAPI
+GdipCreateRegionRgnData(GDIPCONST BYTE *regionData, INT size, GpRegion **region);
+
+GpStatus WINGDIPAPI
+GdipCreateRegionHrgn(HRGN hRgn, GpRegion **region);
+
+GpStatus WINGDIPAPI
+GdipCloneRegion(GpRegion *region, GpRegion **cloneRegion);
+
+GpStatus WINGDIPAPI
+GdipDeleteRegion(GpRegion *region);
+
+GpStatus WINGDIPAPI
+GdipSetInfinite(GpRegion *region);
+
+GpStatus WINGDIPAPI
+GdipSetEmpty(GpRegion *region);
+
+GpStatus WINGDIPAPI
+GdipCombineRegionRect(GpRegion *region, GDIPCONST GpRectF *rect,
+ CombineMode combineMode);
+
+GpStatus WINGDIPAPI
+GdipCombineRegionRectI(GpRegion *region, GDIPCONST GpRect *rect,
+ CombineMode combineMode);
+
+GpStatus WINGDIPAPI
+GdipCombineRegionPath(GpRegion *region, GpPath *path, CombineMode combineMode);
+
+GpStatus WINGDIPAPI
+GdipCombineRegionRegion(GpRegion *region, GpRegion *region2,
+ CombineMode combineMode);
+
+GpStatus WINGDIPAPI
+GdipTranslateRegion(GpRegion *region, REAL dx, REAL dy);
+
+GpStatus WINGDIPAPI
+GdipTranslateRegionI(GpRegion *region, INT dx, INT dy);
+
+GpStatus WINGDIPAPI
+GdipTransformRegion(GpRegion *region, GpMatrix *matrix);
+
+GpStatus WINGDIPAPI
+GdipGetRegionBounds(GpRegion *region, GpGraphics *graphics,
+ GpRectF *rect);
+
+GpStatus WINGDIPAPI
+GdipGetRegionBoundsI(GpRegion *region, GpGraphics *graphics,
+ GpRect *rect);
+
+GpStatus WINGDIPAPI
+GdipGetRegionHRgn(GpRegion *region, GpGraphics *graphics, HRGN *hRgn);
+
+GpStatus WINGDIPAPI
+GdipIsEmptyRegion(GpRegion *region, GpGraphics *graphics,
+ BOOL *result);
+
+GpStatus WINGDIPAPI
+GdipIsInfiniteRegion(GpRegion *region, GpGraphics *graphics,
+ BOOL *result);
+
+GpStatus WINGDIPAPI
+GdipIsEqualRegion(GpRegion *region, GpRegion *region2,
+ GpGraphics *graphics, BOOL *result);
+
+GpStatus WINGDIPAPI
+GdipGetRegionDataSize(GpRegion *region, UINT * bufferSize);
+
+GpStatus WINGDIPAPI
+GdipGetRegionData(GpRegion *region, BYTE * buffer, UINT bufferSize, UINT * sizeFilled);
+
+GpStatus WINGDIPAPI
+GdipIsVisibleRegionPoint(GpRegion *region, REAL x, REAL y,
+ GpGraphics *graphics, BOOL *result);
+
+GpStatus WINGDIPAPI
+GdipIsVisibleRegionPointI(GpRegion *region, INT x, INT y,
+ GpGraphics *graphics, BOOL *result);
+
+GpStatus WINGDIPAPI
+GdipIsVisibleRegionRect(GpRegion *region, REAL x, REAL y, REAL width,
+ REAL height, GpGraphics *graphics, BOOL *result);
+
+GpStatus WINGDIPAPI
+GdipIsVisibleRegionRectI(GpRegion *region, INT x, INT y, INT width,
+ INT height, GpGraphics *graphics, BOOL *result);
+
+GpStatus WINGDIPAPI
+GdipGetRegionScansCount(GpRegion *region, UINT* count, GpMatrix* matrix);
+
+GpStatus WINGDIPAPI
+GdipGetRegionScans(GpRegion *region, GpRectF* rects, INT* count, GpMatrix* matrix);
+
+GpStatus WINGDIPAPI
+GdipGetRegionScansI(GpRegion *region, GpRect* rects, INT* count, GpMatrix* matrix);
+
+//----------------------------------------------------------------------------
+// Brush methods
+//----------------------------------------------------------------------------
+
+GpStatus WINGDIPAPI
+GdipCloneBrush(GpBrush *brush, GpBrush **cloneBrush);
+
+GpStatus WINGDIPAPI
+GdipDeleteBrush(GpBrush *brush);
+
+GpStatus WINGDIPAPI
+GdipGetBrushType(GpBrush *brush, GpBrushType *type);
+
+//----------------------------------------------------------------------------
+// Hatch Brush methods
+//----------------------------------------------------------------------------
+
+GpStatus WINGDIPAPI
+GdipCreateHatchBrush(GpHatchStyle hatchstyle, ARGB forecol,
+ ARGB backcol, GpHatch **brush);
+
+GpStatus WINGDIPAPI
+GdipGetHatchStyle(GpHatch *brush, GpHatchStyle *hatchstyle);
+
+GpStatus WINGDIPAPI
+GdipGetHatchForegroundColor(GpHatch *brush, ARGB* forecol);
+
+GpStatus WINGDIPAPI
+GdipGetHatchBackgroundColor(GpHatch *brush, ARGB* backcol);
+
+//----------------------------------------------------------------------------
+// Texture Brush methods
+//----------------------------------------------------------------------------
+
+GpStatus WINGDIPAPI
+GdipCreateTexture(GpImage *image, GpWrapMode wrapmode,
+ GpTexture **texture);
+
+GpStatus WINGDIPAPI
+GdipCreateTexture2(GpImage *image, GpWrapMode wrapmode, REAL x,
+ REAL y, REAL width, REAL height, GpTexture **texture);
+
+GpStatus WINGDIPAPI
+GdipCreateTextureIA(GpImage *image, GDIPCONST GpImageAttributes *imageAttributes,
+ REAL x, REAL y, REAL width, REAL height,
+ GpTexture **texture);
+
+GpStatus WINGDIPAPI
+GdipCreateTexture2I(GpImage *image, GpWrapMode wrapmode, INT x,
+ INT y, INT width, INT height, GpTexture **texture);
+
+GpStatus WINGDIPAPI
+GdipCreateTextureIAI(GpImage *image, GDIPCONST GpImageAttributes *imageAttributes,
+ INT x, INT y, INT width, INT height,
+ GpTexture **texture);
+
+
+GpStatus WINGDIPAPI
+GdipGetTextureTransform(GpTexture *brush, GpMatrix *matrix);
+
+GpStatus WINGDIPAPI
+GdipSetTextureTransform(GpTexture *brush, GDIPCONST GpMatrix *matrix);
+
+GpStatus WINGDIPAPI
+GdipResetTextureTransform(GpTexture* brush);
+
+GpStatus WINGDIPAPI
+GdipMultiplyTextureTransform(GpTexture* brush, GDIPCONST GpMatrix *matrix,
+ GpMatrixOrder order);
+
+GpStatus WINGDIPAPI
+GdipTranslateTextureTransform(GpTexture* brush, REAL dx, REAL dy,
+ GpMatrixOrder order);
+
+GpStatus WINGDIPAPI
+GdipScaleTextureTransform(GpTexture* brush, REAL sx, REAL sy,
+ GpMatrixOrder order);
+
+GpStatus WINGDIPAPI
+GdipRotateTextureTransform(GpTexture* brush, REAL angle, GpMatrixOrder order);
+
+GpStatus WINGDIPAPI
+GdipSetTextureWrapMode(GpTexture *brush, GpWrapMode wrapmode);
+
+GpStatus WINGDIPAPI
+GdipGetTextureWrapMode(GpTexture *brush, GpWrapMode *wrapmode);
+
+GpStatus WINGDIPAPI
+GdipGetTextureImage(GpTexture *brush, GpImage **image);
+
+//----------------------------------------------------------------------------
+// Solid Brush methods
+//----------------------------------------------------------------------------
+
+GpStatus WINGDIPAPI
+GdipCreateSolidFill(ARGB color, GpSolidFill **brush);
+
+GpStatus WINGDIPAPI
+GdipSetSolidFillColor(GpSolidFill *brush, ARGB color);
+
+GpStatus WINGDIPAPI
+GdipGetSolidFillColor(GpSolidFill *brush, ARGB *color);
+
+//----------------------------------------------------------------------------
+// LineBrush methods
+//----------------------------------------------------------------------------
+
+GpStatus WINGDIPAPI
+GdipCreateLineBrush(GDIPCONST GpPointF* point1,
+ GDIPCONST GpPointF* point2,
+ ARGB color1, ARGB color2,
+ GpWrapMode wrapMode,
+ GpLineGradient **lineGradient);
+
+GpStatus WINGDIPAPI
+GdipCreateLineBrushI(GDIPCONST GpPoint* point1,
+ GDIPCONST GpPoint* point2,
+ ARGB color1, ARGB color2,
+ GpWrapMode wrapMode,
+ GpLineGradient **lineGradient);
+
+GpStatus WINGDIPAPI
+GdipCreateLineBrushFromRect(GDIPCONST GpRectF* rect,
+ ARGB color1, ARGB color2,
+ LinearGradientMode mode,
+ GpWrapMode wrapMode,
+ GpLineGradient **lineGradient);
+
+GpStatus WINGDIPAPI
+GdipCreateLineBrushFromRectI(GDIPCONST GpRect* rect,
+ ARGB color1, ARGB color2,
+ LinearGradientMode mode,
+ GpWrapMode wrapMode,
+ GpLineGradient **lineGradient);
+
+GpStatus WINGDIPAPI
+GdipCreateLineBrushFromRectWithAngle(GDIPCONST GpRectF* rect,
+ ARGB color1, ARGB color2,
+ REAL angle,
+ BOOL isAngleScalable,
+ GpWrapMode wrapMode,
+ GpLineGradient **lineGradient);
+
+GpStatus WINGDIPAPI
+GdipCreateLineBrushFromRectWithAngleI(GDIPCONST GpRect* rect,
+ ARGB color1, ARGB color2,
+ REAL angle,
+ BOOL isAngleScalable,
+ GpWrapMode wrapMode,
+ GpLineGradient **lineGradient);
+
+GpStatus WINGDIPAPI
+GdipSetLinePoints(GpLineGradient *brush,
+ GDIPCONST GpPointF* point1,
+ GDIPCONST GpPointF* point2);
+
+GpStatus WINGDIPAPI
+GdipSetLinePointsI(GpLineGradient *brush,
+ GDIPCONST GpPoint* point1,
+ GDIPCONST GpPoint* point2);
+
+GpStatus WINGDIPAPI
+GdipGetLinePoints(GpLineGradient *brush, GpPointF* points);
+
+GpStatus WINGDIPAPI
+GdipGetLinePointsI(GpLineGradient *brush, GpPoint* points);
+
+GpStatus WINGDIPAPI
+GdipSetLineColors(GpLineGradient *brush, ARGB color1, ARGB color2);
+
+GpStatus WINGDIPAPI
+GdipGetLineColors(GpLineGradient *brush, ARGB* colors);
+
+GpStatus WINGDIPAPI
+GdipGetLineRect(GpLineGradient *brush, GpRectF *rect);
+
+GpStatus WINGDIPAPI
+GdipGetLineRectI(GpLineGradient *brush, GpRect *rect);
+
+GpStatus WINGDIPAPI
+GdipSetLineGammaCorrection(GpLineGradient *brush, BOOL useGammaCorrection);
+
+GpStatus WINGDIPAPI
+GdipGetLineGammaCorrection(GpLineGradient *brush, BOOL *useGammaCorrection);
+
+GpStatus WINGDIPAPI
+GdipGetLineBlendCount(GpLineGradient *brush, INT *count);
+
+GpStatus WINGDIPAPI
+GdipGetLineBlend(GpLineGradient *brush, REAL *blend, REAL* positions,
+ INT count);
+
+GpStatus WINGDIPAPI
+GdipSetLineBlend(GpLineGradient *brush, GDIPCONST REAL *blend,
+ GDIPCONST REAL* positions, INT count);
+
+GpStatus WINGDIPAPI
+GdipGetLinePresetBlendCount(GpLineGradient *brush, INT *count);
+
+GpStatus WINGDIPAPI
+GdipGetLinePresetBlend(GpLineGradient *brush, ARGB *blend,
+ REAL* positions, INT count);
+
+GpStatus WINGDIPAPI
+GdipSetLinePresetBlend(GpLineGradient *brush, GDIPCONST ARGB *blend,
+ GDIPCONST REAL* positions, INT count);
+
+GpStatus WINGDIPAPI
+GdipSetLineSigmaBlend(GpLineGradient *brush, REAL focus, REAL scale);
+
+GpStatus WINGDIPAPI
+GdipSetLineLinearBlend(GpLineGradient *brush, REAL focus, REAL scale);
+
+GpStatus WINGDIPAPI
+GdipSetLineWrapMode(GpLineGradient *brush, GpWrapMode wrapmode);
+
+GpStatus WINGDIPAPI
+GdipGetLineWrapMode(GpLineGradient *brush, GpWrapMode *wrapmode);
+
+GpStatus WINGDIPAPI
+GdipGetLineTransform(GpLineGradient *brush, GpMatrix *matrix);
+
+GpStatus WINGDIPAPI
+GdipSetLineTransform(GpLineGradient *brush, GDIPCONST GpMatrix *matrix);
+
+GpStatus WINGDIPAPI
+GdipResetLineTransform(GpLineGradient* brush);
+
+GpStatus WINGDIPAPI
+GdipMultiplyLineTransform(GpLineGradient* brush, GDIPCONST GpMatrix *matrix,
+ GpMatrixOrder order);
+
+GpStatus WINGDIPAPI
+GdipTranslateLineTransform(GpLineGradient* brush, REAL dx, REAL dy,
+ GpMatrixOrder order);
+
+GpStatus WINGDIPAPI
+GdipScaleLineTransform(GpLineGradient* brush, REAL sx, REAL sy,
+ GpMatrixOrder order);
+
+GpStatus WINGDIPAPI
+GdipRotateLineTransform(GpLineGradient* brush, REAL angle, GpMatrixOrder order);
+
+//----------------------------------------------------------------------------
+// PathGradient Brush
+//----------------------------------------------------------------------------
+
+GpStatus WINGDIPAPI
+GdipCreatePathGradient(GDIPCONST GpPointF* points,
+ INT count,
+ GpWrapMode wrapMode,
+ GpPathGradient **polyGradient);
+
+GpStatus WINGDIPAPI
+GdipCreatePathGradientI(GDIPCONST GpPoint* points,
+ INT count,
+ GpWrapMode wrapMode,
+ GpPathGradient **polyGradient);
+
+GpStatus WINGDIPAPI
+GdipCreatePathGradientFromPath(GDIPCONST GpPath* path,
+ GpPathGradient **polyGradient);
+
+GpStatus WINGDIPAPI
+GdipGetPathGradientCenterColor(
+ GpPathGradient *brush, ARGB* colors);
+
+GpStatus WINGDIPAPI
+GdipSetPathGradientCenterColor(
+ GpPathGradient *brush, ARGB colors);
+
+GpStatus WINGDIPAPI
+GdipGetPathGradientSurroundColorsWithCount(
+ GpPathGradient *brush, ARGB* color, INT* count);
+
+GpStatus WINGDIPAPI
+GdipSetPathGradientSurroundColorsWithCount(
+ GpPathGradient *brush,
+ GDIPCONST ARGB* color, INT* count);
+
+GpStatus WINGDIPAPI
+GdipGetPathGradientPath(GpPathGradient *brush, GpPath *path);
+
+GpStatus WINGDIPAPI
+GdipSetPathGradientPath(GpPathGradient *brush, GDIPCONST GpPath *path);
+
+GpStatus WINGDIPAPI
+GdipGetPathGradientCenterPoint(
+ GpPathGradient *brush, GpPointF* points);
+
+GpStatus WINGDIPAPI
+GdipGetPathGradientCenterPointI(
+ GpPathGradient *brush, GpPoint* points);
+
+GpStatus WINGDIPAPI
+GdipSetPathGradientCenterPoint(
+ GpPathGradient *brush, GDIPCONST GpPointF* points);
+
+GpStatus WINGDIPAPI
+GdipSetPathGradientCenterPointI(
+ GpPathGradient *brush, GDIPCONST GpPoint* points);
+
+GpStatus WINGDIPAPI
+GdipGetPathGradientRect(GpPathGradient *brush, GpRectF *rect);
+
+GpStatus WINGDIPAPI
+GdipGetPathGradientRectI(GpPathGradient *brush, GpRect *rect);
+
+GpStatus WINGDIPAPI
+GdipGetPathGradientPointCount(GpPathGradient *brush, INT* count);
+
+GpStatus WINGDIPAPI
+GdipGetPathGradientSurroundColorCount(GpPathGradient *brush, INT* count);
+
+GpStatus WINGDIPAPI
+GdipSetPathGradientGammaCorrection(GpPathGradient *brush, BOOL useGammaCorrection);
+
+GpStatus WINGDIPAPI
+GdipGetPathGradientGammaCorrection(GpPathGradient *brush, BOOL *useGammaCorrection);
+
+GpStatus WINGDIPAPI
+GdipGetPathGradientBlendCount(GpPathGradient *brush,
+ INT *count);
+
+GpStatus WINGDIPAPI
+GdipGetPathGradientBlend(GpPathGradient *brush,
+ REAL *blend, REAL *positions, INT count);
+
+GpStatus WINGDIPAPI
+GdipSetPathGradientBlend(GpPathGradient *brush,
+ GDIPCONST REAL *blend, GDIPCONST REAL *positions, INT count);
+
+GpStatus WINGDIPAPI
+GdipGetPathGradientPresetBlendCount(GpPathGradient *brush, INT *count);
+
+GpStatus WINGDIPAPI
+GdipGetPathGradientPresetBlend(GpPathGradient *brush, ARGB *blend,
+ REAL* positions, INT count);
+
+GpStatus WINGDIPAPI
+GdipSetPathGradientPresetBlend(GpPathGradient *brush, GDIPCONST ARGB *blend,
+ GDIPCONST REAL* positions, INT count);
+
+GpStatus WINGDIPAPI
+GdipSetPathGradientSigmaBlend(GpPathGradient *brush, REAL focus, REAL scale);
+
+GpStatus WINGDIPAPI
+GdipSetPathGradientLinearBlend(GpPathGradient *brush, REAL focus, REAL scale);
+
+GpStatus WINGDIPAPI
+GdipGetPathGradientWrapMode(GpPathGradient *brush,
+ GpWrapMode *wrapmode);
+
+GpStatus WINGDIPAPI
+GdipSetPathGradientWrapMode(GpPathGradient *brush,
+ GpWrapMode wrapmode);
+
+GpStatus WINGDIPAPI
+GdipGetPathGradientTransform(GpPathGradient *brush,
+ GpMatrix *matrix);
+
+GpStatus WINGDIPAPI
+GdipSetPathGradientTransform(GpPathGradient *brush,
+ GpMatrix *matrix);
+
+GpStatus WINGDIPAPI
+GdipResetPathGradientTransform(GpPathGradient* brush);
+
+GpStatus WINGDIPAPI
+GdipMultiplyPathGradientTransform(GpPathGradient* brush, GDIPCONST GpMatrix *matrix,
+ GpMatrixOrder order);
+
+GpStatus WINGDIPAPI
+GdipTranslatePathGradientTransform(GpPathGradient* brush, REAL dx, REAL dy,
+ GpMatrixOrder order);
+
+GpStatus WINGDIPAPI
+GdipScalePathGradientTransform(GpPathGradient* brush, REAL sx, REAL sy,
+ GpMatrixOrder order);
+
+GpStatus WINGDIPAPI
+GdipRotatePathGradientTransform(GpPathGradient* brush, REAL angle,
+ GpMatrixOrder order);
+
+GpStatus WINGDIPAPI
+GdipGetPathGradientFocusScales(GpPathGradient *brush, REAL* xScale, REAL* yScale);
+
+GpStatus WINGDIPAPI
+GdipSetPathGradientFocusScales(GpPathGradient *brush, REAL xScale, REAL yScale);
+
+//----------------------------------------------------------------------------
+// Pen methods
+//----------------------------------------------------------------------------
+
+GpStatus WINGDIPAPI
+GdipCreatePen1(ARGB color, REAL width, GpUnit unit, GpPen **pen);
+
+GpStatus WINGDIPAPI
+GdipCreatePen2(GpBrush *brush, REAL width, GpUnit unit,
+ GpPen **pen);
+
+GpStatus WINGDIPAPI
+GdipClonePen(GpPen *pen, GpPen **clonepen);
+
+GpStatus WINGDIPAPI
+GdipDeletePen(GpPen *pen);
+
+GpStatus WINGDIPAPI
+GdipSetPenWidth(GpPen *pen, REAL width);
+
+GpStatus WINGDIPAPI
+GdipGetPenWidth(GpPen *pen, REAL *width);
+
+GpStatus WINGDIPAPI
+GdipSetPenUnit(GpPen *pen, GpUnit unit);
+
+GpStatus WINGDIPAPI
+GdipGetPenUnit(GpPen *pen, GpUnit *unit);
+
+#ifdef DCR_USE_NEW_197819
+GpStatus WINGDIPAPI
+GdipSetPenLineCap197819(GpPen *pen, GpLineCap startCap, GpLineCap endCap,
+ GpDashCap dashCap);
+#else
+GpStatus WINGDIPAPI
+GdipSetPenLineCap(GpPen *pen, GpLineCap startCap, GpLineCap endCap,
+ GpLineCap dashCap);
+#endif // DCR_USE_NEW_197819
+
+
+GpStatus WINGDIPAPI
+GdipSetPenStartCap(GpPen *pen, GpLineCap startCap);
+
+GpStatus WINGDIPAPI
+GdipSetPenEndCap(GpPen *pen, GpLineCap endCap);
+
+#ifdef DCR_USE_NEW_197819
+GpStatus WINGDIPAPI
+GdipSetPenDashCap197819(GpPen *pen, GpDashCap dashCap);
+#else
+GpStatus WINGDIPAPI
+GdipSetPenDashCap(GpPen *pen, GpLineCap dashCap);
+#endif // DCR_USE_NEW_197819
+
+GpStatus WINGDIPAPI
+GdipGetPenStartCap(GpPen *pen, GpLineCap *startCap);
+
+GpStatus WINGDIPAPI
+GdipGetPenEndCap(GpPen *pen, GpLineCap *endCap);
+
+#ifdef DCR_USE_NEW_197819
+GpStatus WINGDIPAPI
+GdipGetPenDashCap197819(GpPen *pen, GpDashCap *dashCap);
+#else
+GpStatus WINGDIPAPI
+GdipGetPenDashCap(GpPen *pen, GpLineCap *dashCap);
+#endif // DCR_USE_NEW_197819
+
+GpStatus WINGDIPAPI
+GdipSetPenLineJoin(GpPen *pen, GpLineJoin lineJoin);
+
+GpStatus WINGDIPAPI
+GdipGetPenLineJoin(GpPen *pen, GpLineJoin *lineJoin);
+
+GpStatus WINGDIPAPI
+GdipSetPenCustomStartCap(GpPen *pen, GpCustomLineCap* customCap);
+
+GpStatus WINGDIPAPI
+GdipGetPenCustomStartCap(GpPen *pen, GpCustomLineCap** customCap);
+
+GpStatus WINGDIPAPI
+GdipSetPenCustomEndCap(GpPen *pen, GpCustomLineCap* customCap);
+
+GpStatus WINGDIPAPI
+GdipGetPenCustomEndCap(GpPen *pen, GpCustomLineCap** customCap);
+
+GpStatus WINGDIPAPI
+GdipSetPenMiterLimit(GpPen *pen, REAL miterLimit);
+
+GpStatus WINGDIPAPI
+GdipGetPenMiterLimit(GpPen *pen, REAL *miterLimit);
+
+GpStatus WINGDIPAPI
+GdipSetPenMode(GpPen *pen, GpPenAlignment penMode);
+
+GpStatus WINGDIPAPI
+GdipGetPenMode(GpPen *pen, GpPenAlignment *penMode);
+
+GpStatus WINGDIPAPI
+GdipSetPenTransform(GpPen *pen, GpMatrix *matrix);
+
+GpStatus WINGDIPAPI
+GdipGetPenTransform(GpPen *pen, GpMatrix *matrix);
+
+GpStatus WINGDIPAPI
+GdipResetPenTransform(GpPen *pen);
+
+GpStatus WINGDIPAPI
+GdipMultiplyPenTransform(GpPen *pen, GDIPCONST GpMatrix *matrix,
+ GpMatrixOrder order);
+
+GpStatus WINGDIPAPI
+GdipTranslatePenTransform(GpPen *pen, REAL dx, REAL dy,
+ GpMatrixOrder order);
+
+GpStatus WINGDIPAPI
+GdipScalePenTransform(GpPen *pen, REAL sx, REAL sy,
+ GpMatrixOrder order);
+
+GpStatus WINGDIPAPI
+GdipRotatePenTransform(GpPen *pen, REAL angle, GpMatrixOrder order);
+
+GpStatus WINGDIPAPI
+GdipSetPenColor(GpPen *pen, ARGB argb);
+
+GpStatus WINGDIPAPI
+GdipGetPenColor(GpPen *pen, ARGB *argb);
+
+GpStatus WINGDIPAPI
+GdipSetPenBrushFill(GpPen *pen, GpBrush *brush);
+
+GpStatus WINGDIPAPI
+GdipGetPenBrushFill(GpPen *pen, GpBrush **brush);
+
+GpStatus WINGDIPAPI
+GdipGetPenFillType(GpPen *pen, GpPenType* type);
+
+GpStatus WINGDIPAPI
+GdipGetPenDashStyle(GpPen *pen, GpDashStyle *dashstyle);
+
+GpStatus WINGDIPAPI
+GdipSetPenDashStyle(GpPen *pen, GpDashStyle dashstyle);
+
+GpStatus WINGDIPAPI
+GdipGetPenDashOffset(GpPen *pen, REAL *offset);
+
+GpStatus WINGDIPAPI
+GdipSetPenDashOffset(GpPen *pen, REAL offset);
+
+GpStatus WINGDIPAPI
+GdipGetPenDashCount(GpPen *pen, INT *count);
+
+GpStatus WINGDIPAPI
+GdipSetPenDashArray(GpPen *pen, GDIPCONST REAL *dash, INT count);
+
+GpStatus WINGDIPAPI
+GdipGetPenDashArray(GpPen *pen, REAL *dash, INT count);
+
+GpStatus WINGDIPAPI
+GdipGetPenCompoundCount(GpPen *pen, INT *count);
+
+GpStatus WINGDIPAPI
+GdipSetPenCompoundArray(GpPen *pen, GDIPCONST REAL *dash, INT count);
+
+GpStatus WINGDIPAPI
+GdipGetPenCompoundArray(GpPen *pen, REAL *dash, INT count);
+
+//----------------------------------------------------------------------------
+// CustomLineCap methods
+//----------------------------------------------------------------------------
+
+GpStatus WINGDIPAPI
+GdipCreateCustomLineCap(GpPath* fillPath, GpPath* strokePath,
+ GpLineCap baseCap, REAL baseInset, GpCustomLineCap **customCap);
+
+GpStatus WINGDIPAPI
+GdipDeleteCustomLineCap(GpCustomLineCap* customCap);
+
+GpStatus WINGDIPAPI
+GdipCloneCustomLineCap(GpCustomLineCap* customCap,
+ GpCustomLineCap** clonedCap);
+
+GpStatus WINGDIPAPI
+GdipGetCustomLineCapType(GpCustomLineCap* customCap,
+ CustomLineCapType* capType);
+
+GpStatus WINGDIPAPI
+GdipSetCustomLineCapStrokeCaps(GpCustomLineCap* customCap,
+ GpLineCap startCap, GpLineCap endCap);
+
+GpStatus WINGDIPAPI
+GdipGetCustomLineCapStrokeCaps(GpCustomLineCap* customCap,
+ GpLineCap* startCap, GpLineCap* endCap);
+
+GpStatus WINGDIPAPI
+GdipSetCustomLineCapStrokeJoin(GpCustomLineCap* customCap, GpLineJoin lineJoin);
+
+GpStatus WINGDIPAPI
+GdipGetCustomLineCapStrokeJoin(GpCustomLineCap* customCap, GpLineJoin* lineJoin);
+
+GpStatus WINGDIPAPI
+GdipSetCustomLineCapBaseCap(GpCustomLineCap* customCap, GpLineCap baseCap);
+
+GpStatus WINGDIPAPI
+GdipGetCustomLineCapBaseCap(GpCustomLineCap* customCap, GpLineCap* baseCap);
+
+GpStatus WINGDIPAPI
+GdipSetCustomLineCapBaseInset(GpCustomLineCap* customCap, REAL inset);
+
+GpStatus WINGDIPAPI
+GdipGetCustomLineCapBaseInset(GpCustomLineCap* customCap, REAL* inset);
+
+GpStatus WINGDIPAPI
+GdipSetCustomLineCapWidthScale(GpCustomLineCap* customCap, REAL widthScale);
+
+GpStatus WINGDIPAPI
+GdipGetCustomLineCapWidthScale(GpCustomLineCap* customCap, REAL* widthScale);
+
+//----------------------------------------------------------------------------
+// AdjustableArrowCap methods
+//----------------------------------------------------------------------------
+
+GpStatus WINGDIPAPI
+GdipCreateAdjustableArrowCap(REAL height, REAL width, BOOL isFilled,
+ GpAdjustableArrowCap **cap);
+
+GpStatus WINGDIPAPI
+GdipSetAdjustableArrowCapHeight(GpAdjustableArrowCap* cap, REAL height);
+
+GpStatus WINGDIPAPI
+GdipGetAdjustableArrowCapHeight(GpAdjustableArrowCap* cap, REAL* height);
+
+GpStatus WINGDIPAPI
+GdipSetAdjustableArrowCapWidth(GpAdjustableArrowCap* cap, REAL width);
+
+GpStatus WINGDIPAPI
+GdipGetAdjustableArrowCapWidth(GpAdjustableArrowCap* cap, REAL* width);
+
+GpStatus WINGDIPAPI
+GdipSetAdjustableArrowCapMiddleInset(GpAdjustableArrowCap* cap, REAL middleInset);
+
+GpStatus WINGDIPAPI
+GdipGetAdjustableArrowCapMiddleInset(GpAdjustableArrowCap* cap, REAL* middleInset);
+
+GpStatus WINGDIPAPI
+GdipSetAdjustableArrowCapFillState(GpAdjustableArrowCap* cap, BOOL fillState);
+
+GpStatus WINGDIPAPI
+GdipGetAdjustableArrowCapFillState(GpAdjustableArrowCap* cap, BOOL* fillState);
+
+//----------------------------------------------------------------------------
+// Image methods
+//----------------------------------------------------------------------------
+
+GpStatus WINGDIPAPI
+GdipLoadImageFromStream(IStream* stream, GpImage **image);
+
+GpStatus WINGDIPAPI
+GdipLoadImageFromFile(GDIPCONST WCHAR* filename, GpImage **image);
+
+GpStatus WINGDIPAPI
+GdipLoadImageFromStreamICM(IStream* stream, GpImage **image);
+
+GpStatus WINGDIPAPI
+GdipLoadImageFromFileICM(GDIPCONST WCHAR* filename, GpImage **image);
+
+GpStatus WINGDIPAPI
+GdipCloneImage(GpImage *image, GpImage **cloneImage);
+
+GpStatus WINGDIPAPI
+GdipDisposeImage(GpImage *image);
+
+GpStatus WINGDIPAPI
+GdipSaveImageToFile(GpImage *image, GDIPCONST WCHAR* filename,
+ GDIPCONST CLSID* clsidEncoder, GDIPCONST EncoderParameters* encoderParams);
+
+GpStatus WINGDIPAPI
+GdipSaveImageToStream(GpImage *image, IStream* stream,
+ GDIPCONST CLSID* clsidEncoder, GDIPCONST EncoderParameters* encoderParams);
+
+GpStatus WINGDIPAPI
+GdipSaveAdd(GpImage *image, GDIPCONST EncoderParameters* encoderParams);
+
+GpStatus WINGDIPAPI
+GdipSaveAddImage(GpImage *image, GpImage* newImage,
+ GDIPCONST EncoderParameters* encoderParams);
+
+GpStatus WINGDIPAPI
+GdipGetImageGraphicsContext(GpImage *image, GpGraphics **graphics);
+
+GpStatus WINGDIPAPI
+GdipGetImageBounds(GpImage *image, GpRectF *srcRect, GpUnit *srcUnit);
+
+GpStatus WINGDIPAPI
+GdipGetImageDimension(GpImage *image, REAL *width, REAL *height);
+
+GpStatus WINGDIPAPI
+GdipGetImageType(GpImage *image, ImageType *type);
+
+GpStatus WINGDIPAPI
+GdipGetImageWidth(GpImage *image, UINT *width);
+
+GpStatus WINGDIPAPI
+GdipGetImageHeight(GpImage *image, UINT *height);
+
+GpStatus WINGDIPAPI
+GdipGetImageHorizontalResolution(GpImage *image, REAL *resolution);
+
+GpStatus WINGDIPAPI
+GdipGetImageVerticalResolution(GpImage *image, REAL *resolution);
+
+GpStatus WINGDIPAPI
+GdipGetImageFlags(GpImage *image, UINT *flags);
+
+GpStatus WINGDIPAPI
+GdipGetImageRawFormat(GpImage *image, GUID *format);
+
+GpStatus WINGDIPAPI
+GdipGetImagePixelFormat(GpImage *image, PixelFormat *format);
+
+GpStatus WINGDIPAPI
+GdipGetImageThumbnail(GpImage *image, UINT thumbWidth, UINT thumbHeight,
+ GpImage **thumbImage,
+ GetThumbnailImageAbort callback, VOID * callbackData);
+
+GpStatus WINGDIPAPI
+GdipGetEncoderParameterListSize(GpImage *image, GDIPCONST CLSID* clsidEncoder,
+ UINT* size);
+
+GpStatus WINGDIPAPI
+GdipGetEncoderParameterList(GpImage *image, GDIPCONST CLSID* clsidEncoder,
+ UINT size, EncoderParameters* buffer);
+
+GpStatus WINGDIPAPI
+GdipImageGetFrameDimensionsCount(GpImage* image, UINT* count);
+
+GpStatus WINGDIPAPI
+GdipImageGetFrameDimensionsList(GpImage* image, GUID* dimensionIDs, UINT count);
+
+GpStatus WINGDIPAPI
+GdipImageGetFrameCount(GpImage *image, GDIPCONST GUID* dimensionID, UINT* count);
+
+GpStatus WINGDIPAPI
+GdipImageSelectActiveFrame(GpImage *image, GDIPCONST GUID* dimensionID,
+ UINT frameIndex);
+
+GpStatus WINGDIPAPI
+GdipImageRotateFlip(GpImage *image, RotateFlipType rfType);
+
+GpStatus WINGDIPAPI
+GdipGetImagePalette(GpImage *image, ColorPalette *palette, INT size);
+
+GpStatus WINGDIPAPI
+GdipSetImagePalette(GpImage *image, GDIPCONST ColorPalette *palette);
+
+GpStatus WINGDIPAPI
+GdipGetImagePaletteSize(GpImage *image, INT *size);
+
+GpStatus WINGDIPAPI
+GdipGetPropertyCount(GpImage *image, UINT* numOfProperty);
+
+GpStatus WINGDIPAPI
+GdipGetPropertyIdList(GpImage *image, UINT numOfProperty, PROPID* list);
+
+GpStatus WINGDIPAPI
+GdipGetPropertyItemSize(GpImage *image, PROPID propId, UINT* size);
+
+GpStatus WINGDIPAPI
+GdipGetPropertyItem(GpImage *image, PROPID propId,UINT propSize,
+ PropertyItem* buffer);
+
+GpStatus WINGDIPAPI
+GdipGetPropertySize(GpImage *image, UINT* totalBufferSize, UINT* numProperties);
+
+GpStatus WINGDIPAPI
+GdipGetAllPropertyItems(GpImage *image, UINT totalBufferSize,
+ UINT numProperties, PropertyItem* allItems);
+
+GpStatus WINGDIPAPI
+GdipRemovePropertyItem(GpImage *image, PROPID propId);
+
+GpStatus WINGDIPAPI
+GdipSetPropertyItem(GpImage *image, GDIPCONST PropertyItem* item);
+
+GpStatus WINGDIPAPI
+GdipImageForceValidation(GpImage *image);
+
+GpStatus WINGDIPAPI
+GdipGetImageLayout(GpImage *image, ImageLayout* layout);
+
+GpStatus WINGDIPAPI
+GdipSetImageLayout(GpImage *image, GDIPCONST ImageLayout layout);
+
+//----------------------------------------------------------------------------
+// Bitmap methods
+//----------------------------------------------------------------------------
+
+GpStatus WINGDIPAPI
+GdipCreateBitmapFromStream(IStream* stream, GpBitmap **bitmap);
+
+GpStatus WINGDIPAPI
+GdipCreateBitmapFromFile(GDIPCONST WCHAR* filename, GpBitmap **bitmap);
+
+GpStatus WINGDIPAPI
+GdipCreateBitmapFromStreamICM(IStream* stream, GpBitmap **bitmap);
+
+GpStatus WINGDIPAPI
+GdipCreateBitmapFromFileICM(GDIPCONST WCHAR* filename, GpBitmap **bitmap);
+
+GpStatus WINGDIPAPI
+GdipCreateBitmapFromScan0(INT width,
+ INT height,
+ INT stride,
+ PixelFormat format,
+ BYTE* scan0,
+ GpBitmap** bitmap);
+
+GpStatus WINGDIPAPI
+GdipCreateBitmapFromGraphics(INT width,
+ INT height,
+ GpGraphics* target,
+ GpBitmap** bitmap);
+
+GpStatus WINGDIPAPI
+GdipCreateBitmapFromDirectDrawSurface(IDirectDrawSurface7* surface,
+ GpBitmap** bitmap);
+
+GpStatus WINGDIPAPI
+GdipCreateBitmapFromGdiDib(GDIPCONST BITMAPINFO* gdiBitmapInfo,
+ VOID* gdiBitmapData,
+ GpBitmap** bitmap);
+
+GpStatus WINGDIPAPI
+GdipCreateBitmapFromHBITMAP(HBITMAP hbm,
+ HPALETTE hpal,
+ GpBitmap** bitmap);
+
+GpStatus WINGDIPAPI
+GdipCreateHBITMAPFromBitmap(GpBitmap* bitmap,
+ HBITMAP* hbmReturn,
+ ARGB background);
+
+GpStatus WINGDIPAPI
+GdipCreateBitmapFromHICON(HICON hicon,
+ GpBitmap** bitmap);
+
+GpStatus WINGDIPAPI
+GdipCreateHICONFromBitmap(GpBitmap* bitmap,
+ HICON* hbmReturn);
+
+GpStatus WINGDIPAPI
+GdipCreateBitmapFromResource(HINSTANCE hInstance,
+ GDIPCONST WCHAR* lpBitmapName,
+ GpBitmap** bitmap);
+
+GpStatus WINGDIPAPI
+GdipCloneBitmapArea(REAL x, REAL y, REAL width, REAL height,
+ PixelFormat format,
+ GpBitmap *srcBitmap,
+ GpBitmap **dstBitmap);
+
+GpStatus WINGDIPAPI
+GdipCloneBitmapAreaI(INT x,
+ INT y,
+ INT width,
+ INT height,
+ PixelFormat format,
+ GpBitmap *srcBitmap,
+ GpBitmap **dstBitmap);
+
+GpStatus WINGDIPAPI
+GdipBitmapLockBits(GpBitmap* bitmap,
+ GDIPCONST GpRect* rect,
+ UINT flags,
+ PixelFormat format,
+ BitmapData* lockedBitmapData);
+
+GpStatus WINGDIPAPI
+GdipBitmapUnlockBits(GpBitmap* bitmap,
+ BitmapData* lockedBitmapData);
+
+GpStatus WINGDIPAPI
+GdipBitmapGetPixel(GpBitmap* bitmap, INT x, INT y, ARGB *color);
+
+GpStatus WINGDIPAPI
+GdipBitmapSetPixel(GpBitmap* bitmap, INT x, INT y, ARGB color);
+
+GpStatus WINGDIPAPI
+GdipBitmapSetResolution(GpBitmap* bitmap, REAL xdpi, REAL ydpi);
+
+//----------------------------------------------------------------------------
+// ImageAttributes methods
+//----------------------------------------------------------------------------
+
+GpStatus WINGDIPAPI
+GdipCreateImageAttributes(GpImageAttributes **imageattr);
+
+GpStatus WINGDIPAPI
+GdipCloneImageAttributes(GDIPCONST GpImageAttributes *imageattr,
+ GpImageAttributes **cloneImageattr);
+
+GpStatus WINGDIPAPI
+GdipDisposeImageAttributes(GpImageAttributes *imageattr);
+
+GpStatus WINGDIPAPI
+GdipSetImageAttributesToIdentity(GpImageAttributes *imageattr,
+ ColorAdjustType type);
+GpStatus WINGDIPAPI
+GdipResetImageAttributes(GpImageAttributes *imageattr,
+ ColorAdjustType type);
+
+GpStatus WINGDIPAPI
+GdipSetImageAttributesColorMatrix(GpImageAttributes *imageattr,
+ ColorAdjustType type,
+ BOOL enableFlag,
+ GDIPCONST ColorMatrix* colorMatrix,
+ GDIPCONST ColorMatrix* grayMatrix,
+ ColorMatrixFlags flags);
+
+GpStatus WINGDIPAPI
+GdipSetImageAttributesThreshold(GpImageAttributes *imageattr,
+ ColorAdjustType type,
+ BOOL enableFlag,
+ REAL threshold);
+
+GpStatus WINGDIPAPI
+GdipSetImageAttributesGamma(GpImageAttributes *imageattr,
+ ColorAdjustType type,
+ BOOL enableFlag,
+ REAL gamma);
+
+GpStatus WINGDIPAPI
+GdipSetImageAttributesNoOp(GpImageAttributes *imageattr,
+ ColorAdjustType type,
+ BOOL enableFlag);
+
+GpStatus WINGDIPAPI
+GdipSetImageAttributesColorKeys(GpImageAttributes *imageattr,
+ ColorAdjustType type,
+ BOOL enableFlag,
+ ARGB colorLow,
+ ARGB colorHigh);
+
+GpStatus WINGDIPAPI
+GdipSetImageAttributesOutputChannel(GpImageAttributes *imageattr,
+ ColorAdjustType type,
+ BOOL enableFlag,
+ ColorChannelFlags channelFlags);
+
+GpStatus WINGDIPAPI
+GdipSetImageAttributesOutputChannelColorProfile(GpImageAttributes *imageattr,
+ ColorAdjustType type,
+ BOOL enableFlag,
+ GDIPCONST WCHAR *colorProfileFilename);
+
+GpStatus WINGDIPAPI
+GdipSetImageAttributesRemapTable(GpImageAttributes *imageattr,
+ ColorAdjustType type,
+ BOOL enableFlag,
+ UINT mapSize,
+ GDIPCONST ColorMap *map);
+GpStatus WINGDIPAPI
+GdipSetImageAttributesWrapMode(
+ GpImageAttributes *imageAttr,
+ WrapMode wrap,
+ ARGB argb,
+ BOOL clamp
+);
+
+GpStatus WINGDIPAPI
+GdipSetImageAttributesICMMode(
+ GpImageAttributes *imageAttr,
+ BOOL on
+);
+
+GpStatus WINGDIPAPI
+GdipGetImageAttributesAdjustedPalette(
+ GpImageAttributes *imageAttr,
+ ColorPalette * colorPalette,
+ ColorAdjustType colorAdjustType
+);
+
+//----------------------------------------------------------------------------
+// Graphics methods
+//----------------------------------------------------------------------------
+
+GpStatus WINGDIPAPI
+GdipFlush(GpGraphics *graphics, GpFlushIntention intention);
+
+GpStatus WINGDIPAPI
+GdipCreateFromHDC(HDC hdc, GpGraphics **graphics);
+
+GpStatus WINGDIPAPI
+GdipCreateFromHDC2(HDC hdc, HANDLE hDevice, GpGraphics **graphics);
+
+GpStatus WINGDIPAPI
+GdipCreateFromHWND(HWND hwnd, GpGraphics **graphics);
+
+GpStatus WINGDIPAPI
+GdipCreateFromHWNDICM(HWND hwnd, GpGraphics **graphics);
+
+GpStatus WINGDIPAPI
+GdipDeleteGraphics(GpGraphics *graphics);
+
+GpStatus WINGDIPAPI
+GdipGetDC(GpGraphics* graphics, HDC * hdc);
+
+GpStatus WINGDIPAPI
+GdipReleaseDC(GpGraphics* graphics, HDC hdc);
+
+GpStatus WINGDIPAPI
+GdipSetCompositingMode(GpGraphics *graphics, CompositingMode compositingMode);
+
+GpStatus WINGDIPAPI
+GdipGetCompositingMode(GpGraphics *graphics, CompositingMode *compositingMode);
+
+GpStatus WINGDIPAPI
+GdipSetRenderingOrigin(GpGraphics *graphics, INT x, INT y);
+
+GpStatus WINGDIPAPI
+GdipGetRenderingOrigin(GpGraphics *graphics, INT *x, INT *y);
+
+GpStatus WINGDIPAPI
+GdipSetCompositingQuality(GpGraphics *graphics, CompositingQuality compositingQuality);
+
+GpStatus WINGDIPAPI
+GdipGetCompositingQuality(GpGraphics *graphics, CompositingQuality *compositingQuality);
+
+GpStatus WINGDIPAPI
+GdipSetSmoothingMode(GpGraphics *graphics, SmoothingMode smoothingMode);
+
+GpStatus WINGDIPAPI
+GdipGetSmoothingMode(GpGraphics *graphics, SmoothingMode *smoothingMode);
+
+GpStatus WINGDIPAPI
+GdipSetPixelOffsetMode(GpGraphics* graphics, PixelOffsetMode pixelOffsetMode);
+
+GpStatus WINGDIPAPI
+GdipGetPixelOffsetMode(GpGraphics *graphics, PixelOffsetMode *pixelOffsetMode);
+
+GpStatus WINGDIPAPI
+GdipSetTextRenderingHint(GpGraphics *graphics, TextRenderingHint mode);
+
+GpStatus WINGDIPAPI
+GdipGetTextRenderingHint(GpGraphics *graphics, TextRenderingHint *mode);
+
+#ifdef DCR_USE_NEW_188922
+GpStatus WINGDIPAPI
+GdipSetTextContrast(GpGraphics *graphics, UINT contrast);
+
+GpStatus WINGDIPAPI
+GdipGetTextContrast(GpGraphics *graphics, UINT * contrast);
+#else
+GpStatus WINGDIPAPI
+GdipSetTextGammaValue(GpGraphics *graphics, UINT gammaValue);
+
+GpStatus WINGDIPAPI
+GdipGetTextGammaValue(GpGraphics *graphics, UINT * gammaValue);
+#endif // DCR_USE_NEW_188922
+
+
+GpStatus WINGDIPAPI
+GdipSetInterpolationMode(GpGraphics *graphics, InterpolationMode interpolationMode);
+
+GpStatus WINGDIPAPI
+GdipGetInterpolationMode(GpGraphics *graphics, InterpolationMode *interpolationMode);
+
+GpStatus WINGDIPAPI
+GdipSetWorldTransform(GpGraphics *graphics, GpMatrix *matrix);
+
+GpStatus WINGDIPAPI
+GdipResetWorldTransform(GpGraphics *graphics);
+
+GpStatus WINGDIPAPI
+GdipMultiplyWorldTransform(GpGraphics *graphics, GDIPCONST GpMatrix *matrix,
+ GpMatrixOrder order);
+
+GpStatus WINGDIPAPI
+GdipTranslateWorldTransform(GpGraphics *graphics, REAL dx, REAL dy,
+ GpMatrixOrder order);
+
+GpStatus WINGDIPAPI
+GdipScaleWorldTransform(GpGraphics *graphics, REAL sx, REAL sy,
+ GpMatrixOrder order);
+
+GpStatus WINGDIPAPI
+GdipRotateWorldTransform(GpGraphics *graphics, REAL angle, GpMatrixOrder order);
+
+GpStatus WINGDIPAPI
+GdipGetWorldTransform(GpGraphics *graphics, GpMatrix *matrix);
+
+GpStatus WINGDIPAPI
+GdipResetPageTransform(GpGraphics *graphics);
+
+GpStatus WINGDIPAPI
+GdipGetPageUnit(GpGraphics *graphics, GpUnit *unit);
+
+GpStatus WINGDIPAPI
+GdipGetPageScale(GpGraphics *graphics, REAL *scale);
+
+GpStatus WINGDIPAPI
+GdipSetPageUnit(GpGraphics *graphics, GpUnit unit);
+
+GpStatus WINGDIPAPI
+GdipSetPageScale(GpGraphics *graphics, REAL scale);
+
+GpStatus WINGDIPAPI
+GdipGetDpiX(GpGraphics *graphics, REAL* dpi);
+
+GpStatus WINGDIPAPI
+GdipGetDpiY(GpGraphics *graphics, REAL* dpi);
+
+GpStatus WINGDIPAPI
+GdipTransformPoints(GpGraphics *graphics, GpCoordinateSpace destSpace,
+ GpCoordinateSpace srcSpace, GpPointF *points,
+ INT count);
+
+GpStatus WINGDIPAPI
+GdipTransformPointsI(GpGraphics *graphics, GpCoordinateSpace destSpace,
+ GpCoordinateSpace srcSpace, GpPoint *points,
+ INT count);
+
+GpStatus WINGDIPAPI
+GdipGetNearestColor(GpGraphics *graphics, ARGB* argb);
+
+// Create the Win9x Halftone Palette (even on NT) with correct Desktop colors
+HPALETTE WINGDIPAPI
+GdipCreateHalftonePalette();
+
+GpStatus WINGDIPAPI
+GdipDrawLine(GpGraphics *graphics, GpPen *pen, REAL x1, REAL y1,
+ REAL x2, REAL y2);
+
+GpStatus WINGDIPAPI
+GdipDrawLineI(GpGraphics *graphics, GpPen *pen, INT x1, INT y1,
+ INT x2, INT y2);
+
+GpStatus WINGDIPAPI
+GdipDrawLines(GpGraphics *graphics, GpPen *pen, GDIPCONST GpPointF *points,
+ INT count);
+
+GpStatus WINGDIPAPI
+GdipDrawLinesI(GpGraphics *graphics, GpPen *pen, GDIPCONST GpPoint *points,
+ INT count);
+
+GpStatus WINGDIPAPI
+GdipDrawArc(GpGraphics *graphics, GpPen *pen, REAL x, REAL y,
+ REAL width, REAL height, REAL startAngle, REAL sweepAngle);
+
+GpStatus WINGDIPAPI
+GdipDrawArcI(GpGraphics *graphics, GpPen *pen, INT x, INT y,
+ INT width, INT height, REAL startAngle, REAL sweepAngle);
+
+GpStatus WINGDIPAPI
+GdipDrawBezier(GpGraphics *graphics, GpPen *pen, REAL x1, REAL y1,
+ REAL x2, REAL y2, REAL x3, REAL y3, REAL x4, REAL y4);
+
+GpStatus WINGDIPAPI
+GdipDrawBezierI(GpGraphics *graphics, GpPen *pen, INT x1, INT y1,
+ INT x2, INT y2, INT x3, INT y3, INT x4, INT y4);
+
+GpStatus WINGDIPAPI
+GdipDrawBeziers(GpGraphics *graphics, GpPen *pen, GDIPCONST GpPointF *points,
+ INT count);
+
+GpStatus WINGDIPAPI
+GdipDrawBeziersI(GpGraphics *graphics, GpPen *pen, GDIPCONST GpPoint *points,
+ INT count);
+
+GpStatus WINGDIPAPI
+GdipDrawRectangle(GpGraphics *graphics, GpPen *pen, REAL x, REAL y,
+ REAL width, REAL height);
+
+GpStatus WINGDIPAPI
+GdipDrawRectangleI(GpGraphics *graphics, GpPen *pen, INT x, INT y,
+ INT width, INT height);
+
+GpStatus WINGDIPAPI
+GdipDrawRectangles(GpGraphics *graphics, GpPen *pen, GDIPCONST GpRectF *rects,
+ INT count);
+
+GpStatus WINGDIPAPI
+GdipDrawRectanglesI(GpGraphics *graphics, GpPen *pen, GDIPCONST GpRect *rects,
+ INT count);
+
+GpStatus WINGDIPAPI
+GdipDrawEllipse(GpGraphics *graphics, GpPen *pen, REAL x, REAL y,
+ REAL width, REAL height);
+
+GpStatus WINGDIPAPI
+GdipDrawEllipseI(GpGraphics *graphics, GpPen *pen, INT x, INT y,
+ INT width, INT height);
+
+GpStatus WINGDIPAPI
+GdipDrawPie(GpGraphics *graphics, GpPen *pen, REAL x, REAL y,
+ REAL width, REAL height, REAL startAngle, REAL sweepAngle);
+
+GpStatus WINGDIPAPI
+GdipDrawPieI(GpGraphics *graphics, GpPen *pen, INT x, INT y,
+ INT width, INT height, REAL startAngle, REAL sweepAngle);
+
+GpStatus WINGDIPAPI
+GdipDrawPolygon(GpGraphics *graphics, GpPen *pen, GDIPCONST GpPointF *points,
+ INT count);
+
+GpStatus WINGDIPAPI
+GdipDrawPolygonI(GpGraphics *graphics, GpPen *pen, GDIPCONST GpPoint *points,
+ INT count);
+
+GpStatus WINGDIPAPI
+GdipDrawPath(GpGraphics *graphics, GpPen *pen, GpPath *path);
+
+GpStatus WINGDIPAPI
+GdipDrawCurve(GpGraphics *graphics, GpPen *pen, GDIPCONST GpPointF *points,
+ INT count);
+
+GpStatus WINGDIPAPI
+GdipDrawCurveI(GpGraphics *graphics, GpPen *pen, GDIPCONST GpPoint *points,
+ INT count);
+
+GpStatus WINGDIPAPI
+GdipDrawCurve2(GpGraphics *graphics, GpPen *pen, GDIPCONST GpPointF *points,
+ INT count, REAL tension);
+
+GpStatus WINGDIPAPI
+GdipDrawCurve2I(GpGraphics *graphics, GpPen *pen, GDIPCONST GpPoint *points,
+ INT count, REAL tension);
+
+GpStatus WINGDIPAPI
+GdipDrawCurve3(GpGraphics *graphics, GpPen *pen, GDIPCONST GpPointF *points,
+ INT count, INT offset, INT numberOfSegments, REAL tension);
+
+GpStatus WINGDIPAPI
+GdipDrawCurve3I(GpGraphics *graphics, GpPen *pen, GDIPCONST GpPoint *points,
+ INT count, INT offset, INT numberOfSegments, REAL tension);
+
+GpStatus WINGDIPAPI
+GdipDrawClosedCurve(GpGraphics *graphics, GpPen *pen,
+ GDIPCONST GpPointF *points, INT count);
+
+GpStatus WINGDIPAPI
+GdipDrawClosedCurveI(GpGraphics *graphics, GpPen *pen,
+ GDIPCONST GpPoint *points, INT count);
+
+GpStatus WINGDIPAPI
+GdipDrawClosedCurve2(GpGraphics *graphics, GpPen *pen,
+ GDIPCONST GpPointF *points, INT count, REAL tension);
+
+GpStatus WINGDIPAPI
+GdipDrawClosedCurve2I(GpGraphics *graphics, GpPen *pen,
+ GDIPCONST GpPoint *points, INT count, REAL tension);
+
+GpStatus WINGDIPAPI
+GdipGraphicsClear(GpGraphics *graphics, ARGB color);
+
+GpStatus WINGDIPAPI
+GdipFillRectangle(GpGraphics *graphics, GpBrush *brush, REAL x, REAL y,
+ REAL width, REAL height);
+
+GpStatus WINGDIPAPI
+GdipFillRectangleI(GpGraphics *graphics, GpBrush *brush, INT x, INT y,
+ INT width, INT height);
+
+GpStatus WINGDIPAPI
+GdipFillRectangles(GpGraphics *graphics, GpBrush *brush,
+ GDIPCONST GpRectF *rects, INT count);
+
+GpStatus WINGDIPAPI
+GdipFillRectanglesI(GpGraphics *graphics, GpBrush *brush,
+ GDIPCONST GpRect *rects, INT count);
+
+GpStatus WINGDIPAPI
+GdipFillPolygon(GpGraphics *graphics, GpBrush *brush,
+ GDIPCONST GpPointF *points, INT count, GpFillMode fillMode);
+
+GpStatus WINGDIPAPI
+GdipFillPolygonI(GpGraphics *graphics, GpBrush *brush,
+ GDIPCONST GpPoint *points, INT count, GpFillMode fillMode);
+
+GpStatus WINGDIPAPI
+GdipFillPolygon2(GpGraphics *graphics, GpBrush *brush,
+ GDIPCONST GpPointF *points, INT count);
+
+GpStatus WINGDIPAPI
+GdipFillPolygon2I(GpGraphics *graphics, GpBrush *brush,
+ GDIPCONST GpPoint *points, INT count);
+
+GpStatus WINGDIPAPI
+GdipFillEllipse(GpGraphics *graphics, GpBrush *brush, REAL x, REAL y,
+ REAL width, REAL height);
+
+GpStatus WINGDIPAPI
+GdipFillEllipseI(GpGraphics *graphics, GpBrush *brush, INT x, INT y,
+ INT width, INT height);
+
+GpStatus WINGDIPAPI
+GdipFillPie(GpGraphics *graphics, GpBrush *brush, REAL x, REAL y,
+ REAL width, REAL height, REAL startAngle, REAL sweepAngle);
+
+GpStatus WINGDIPAPI
+GdipFillPieI(GpGraphics *graphics, GpBrush *brush, INT x, INT y,
+ INT width, INT height, REAL startAngle, REAL sweepAngle);
+
+GpStatus WINGDIPAPI
+GdipFillPath(GpGraphics *graphics, GpBrush *brush, GpPath *path);
+
+GpStatus WINGDIPAPI
+GdipFillClosedCurve(GpGraphics *graphics, GpBrush *brush,
+ GDIPCONST GpPointF *points, INT count);
+
+GpStatus WINGDIPAPI
+GdipFillClosedCurveI(GpGraphics *graphics, GpBrush *brush,
+ GDIPCONST GpPoint *points, INT count);
+
+GpStatus WINGDIPAPI
+GdipFillClosedCurve2(GpGraphics *graphics, GpBrush *brush,
+ GDIPCONST GpPointF *points, INT count,
+ REAL tension, GpFillMode fillMode);
+
+GpStatus WINGDIPAPI
+GdipFillClosedCurve2I(GpGraphics *graphics, GpBrush *brush,
+ GDIPCONST GpPoint *points, INT count,
+ REAL tension, GpFillMode fillMode);
+
+GpStatus WINGDIPAPI
+GdipFillRegion(GpGraphics *graphics, GpBrush *brush,
+ GpRegion *region);
+
+GpStatus WINGDIPAPI
+GdipDrawImage(GpGraphics *graphics, GpImage *image, REAL x, REAL y);
+
+GpStatus WINGDIPAPI
+GdipDrawImageI(GpGraphics *graphics, GpImage *image, INT x, INT y);
+
+GpStatus WINGDIPAPI
+GdipDrawImageRect(GpGraphics *graphics, GpImage *image, REAL x, REAL y,
+ REAL width, REAL height);
+
+GpStatus WINGDIPAPI
+GdipDrawImageRectI(GpGraphics *graphics, GpImage *image, INT x, INT y,
+ INT width, INT height);
+
+GpStatus WINGDIPAPI
+GdipDrawImagePoints(GpGraphics *graphics, GpImage *image,
+ GDIPCONST GpPointF *dstpoints, INT count);
+
+GpStatus WINGDIPAPI
+GdipDrawImagePointsI(GpGraphics *graphics, GpImage *image,
+ GDIPCONST GpPoint *dstpoints, INT count);
+
+GpStatus WINGDIPAPI
+GdipDrawImagePointRect(GpGraphics *graphics, GpImage *image, REAL x,
+ REAL y, REAL srcx, REAL srcy, REAL srcwidth,
+ REAL srcheight, GpUnit srcUnit);
+
+GpStatus WINGDIPAPI
+GdipDrawImagePointRectI(GpGraphics *graphics, GpImage *image, INT x,
+ INT y, INT srcx, INT srcy, INT srcwidth,
+ INT srcheight, GpUnit srcUnit);
+
+GpStatus WINGDIPAPI
+GdipDrawImageRectRect(GpGraphics *graphics, GpImage *image, REAL dstx,
+ REAL dsty, REAL dstwidth, REAL dstheight,
+ REAL srcx, REAL srcy, REAL srcwidth, REAL srcheight,
+ GpUnit srcUnit,
+ GDIPCONST GpImageAttributes* imageAttributes,
+ DrawImageAbort callback, VOID * callbackData);
+
+GpStatus WINGDIPAPI
+GdipDrawImageRectRectI(GpGraphics *graphics, GpImage *image, INT dstx,
+ INT dsty, INT dstwidth, INT dstheight,
+ INT srcx, INT srcy, INT srcwidth, INT srcheight,
+ GpUnit srcUnit,
+ GDIPCONST GpImageAttributes* imageAttributes,
+ DrawImageAbort callback, VOID * callbackData);
+
+GpStatus WINGDIPAPI
+GdipDrawImagePointsRect(GpGraphics *graphics, GpImage *image,
+ GDIPCONST GpPointF *points, INT count, REAL srcx,
+ REAL srcy, REAL srcwidth, REAL srcheight,
+ GpUnit srcUnit,
+ GDIPCONST GpImageAttributes* imageAttributes,
+ DrawImageAbort callback, VOID * callbackData);
+
+GpStatus WINGDIPAPI
+GdipDrawImagePointsRectI(GpGraphics *graphics, GpImage *image,
+ GDIPCONST GpPoint *points, INT count, INT srcx,
+ INT srcy, INT srcwidth, INT srcheight,
+ GpUnit srcUnit,
+ GDIPCONST GpImageAttributes* imageAttributes,
+ DrawImageAbort callback, VOID * callbackData);
+
+GpStatus WINGDIPAPI
+GdipEnumerateMetafileDestPoint(
+ GpGraphics * graphics,
+ GDIPCONST GpMetafile * metafile,
+ GDIPCONST PointF & destPoint,
+ EnumerateMetafileProc callback,
+ VOID * callbackData,
+ GDIPCONST GpImageAttributes * imageAttributes
+ );
+
+GpStatus WINGDIPAPI
+GdipEnumerateMetafileDestPointI(
+ GpGraphics * graphics,
+ GDIPCONST GpMetafile * metafile,
+ GDIPCONST Point & destPoint,
+ EnumerateMetafileProc callback,
+ VOID * callbackData,
+ GDIPCONST GpImageAttributes * imageAttributes
+ );
+
+GpStatus WINGDIPAPI
+GdipEnumerateMetafileDestRect(
+ GpGraphics * graphics,
+ GDIPCONST GpMetafile * metafile,
+ GDIPCONST RectF & destRect,
+ EnumerateMetafileProc callback,
+ VOID * callbackData,
+ GDIPCONST GpImageAttributes * imageAttributes
+ );
+
+GpStatus WINGDIPAPI
+GdipEnumerateMetafileDestRectI(
+ GpGraphics * graphics,
+ GDIPCONST GpMetafile * metafile,
+ GDIPCONST Rect & destRect,
+ EnumerateMetafileProc callback,
+ VOID * callbackData,
+ GDIPCONST GpImageAttributes * imageAttributes
+ );
+
+GpStatus WINGDIPAPI
+GdipEnumerateMetafileDestPoints(
+ GpGraphics * graphics,
+ GDIPCONST GpMetafile * metafile,
+ GDIPCONST PointF * destPoints,
+ INT count,
+ EnumerateMetafileProc callback,
+ VOID * callbackData,
+ GDIPCONST GpImageAttributes * imageAttributes
+ );
+
+GpStatus WINGDIPAPI
+GdipEnumerateMetafileDestPointsI(
+ GpGraphics * graphics,
+ GDIPCONST GpMetafile * metafile,
+ GDIPCONST Point * destPoints,
+ INT count,
+ EnumerateMetafileProc callback,
+ VOID * callbackData,
+ GDIPCONST GpImageAttributes * imageAttributes
+ );
+
+GpStatus WINGDIPAPI
+GdipEnumerateMetafileSrcRectDestPoint(
+ GpGraphics * graphics,
+ GDIPCONST GpMetafile * metafile,
+ GDIPCONST PointF & destPoint,
+ GDIPCONST RectF & srcRect,
+ Unit srcUnit,
+ EnumerateMetafileProc callback,
+ VOID * callbackData,
+ GDIPCONST GpImageAttributes * imageAttributes
+ );
+
+GpStatus WINGDIPAPI
+GdipEnumerateMetafileSrcRectDestPointI(
+ GpGraphics * graphics,
+ GDIPCONST GpMetafile * metafile,
+ GDIPCONST Point & destPoint,
+ GDIPCONST Rect & srcRect,
+ Unit srcUnit,
+ EnumerateMetafileProc callback,
+ VOID * callbackData,
+ GDIPCONST GpImageAttributes * imageAttributes
+ );
+
+GpStatus WINGDIPAPI
+GdipEnumerateMetafileSrcRectDestRect(
+ GpGraphics * graphics,
+ GDIPCONST GpMetafile * metafile,
+ GDIPCONST RectF & destRect,
+ GDIPCONST RectF & srcRect,
+ Unit srcUnit,
+ EnumerateMetafileProc callback,
+ VOID * callbackData,
+ GDIPCONST GpImageAttributes * imageAttributes
+ );
+
+GpStatus WINGDIPAPI
+GdipEnumerateMetafileSrcRectDestRectI(
+ GpGraphics * graphics,
+ GDIPCONST GpMetafile * metafile,
+ GDIPCONST Rect & destRect,
+ GDIPCONST Rect & srcRect,
+ Unit srcUnit,
+ EnumerateMetafileProc callback,
+ VOID * callbackData,
+ GDIPCONST GpImageAttributes * imageAttributes
+ );
+
+GpStatus WINGDIPAPI
+GdipEnumerateMetafileSrcRectDestPoints(
+ GpGraphics * graphics,
+ GDIPCONST GpMetafile * metafile,
+ GDIPCONST PointF * destPoints,
+ INT count,
+ GDIPCONST RectF & srcRect,
+ Unit srcUnit,
+ EnumerateMetafileProc callback,
+ VOID * callbackData,
+ GDIPCONST GpImageAttributes * imageAttributes
+ );
+
+GpStatus WINGDIPAPI
+GdipEnumerateMetafileSrcRectDestPointsI(
+ GpGraphics * graphics,
+ GDIPCONST GpMetafile * metafile,
+ GDIPCONST Point * destPoints,
+ INT count,
+ GDIPCONST Rect & srcRect,
+ Unit srcUnit,
+ EnumerateMetafileProc callback,
+ VOID * callbackData,
+ GDIPCONST GpImageAttributes * imageAttributes
+ );
+
+GpStatus WINGDIPAPI
+GdipPlayMetafileRecord(
+ GDIPCONST GpMetafile * metafile,
+ EmfPlusRecordType recordType,
+ UINT flags,
+ UINT dataSize,
+ GDIPCONST BYTE * data
+ );
+
+GpStatus WINGDIPAPI
+GdipSetClipGraphics(GpGraphics *graphics, GpGraphics *srcgraphics,
+ CombineMode combineMode);
+
+GpStatus WINGDIPAPI
+GdipSetClipRect(GpGraphics *graphics, REAL x, REAL y,
+ REAL width, REAL height, CombineMode combineMode);
+
+GpStatus WINGDIPAPI
+GdipSetClipRectI(GpGraphics *graphics, INT x, INT y,
+ INT width, INT height, CombineMode combineMode);
+
+GpStatus WINGDIPAPI
+GdipSetClipPath(GpGraphics *graphics, GpPath *path, CombineMode combineMode);
+
+GpStatus WINGDIPAPI
+GdipSetClipRegion(GpGraphics *graphics, GpRegion *region,
+ CombineMode combineMode);
+
+GpStatus WINGDIPAPI
+GdipSetClipHrgn(GpGraphics *graphics, HRGN hRgn, CombineMode combineMode);
+
+GpStatus WINGDIPAPI
+GdipResetClip(GpGraphics *graphics);
+
+GpStatus WINGDIPAPI
+GdipTranslateClip(GpGraphics *graphics, REAL dx, REAL dy);
+
+GpStatus WINGDIPAPI
+GdipTranslateClipI(GpGraphics *graphics, INT dx, INT dy);
+
+GpStatus WINGDIPAPI
+GdipGetClip(GpGraphics *graphics, GpRegion *region);
+
+GpStatus WINGDIPAPI
+GdipGetClipBounds(GpGraphics *graphics, GpRectF *rect);
+
+GpStatus WINGDIPAPI
+GdipGetClipBoundsI(GpGraphics *graphics, GpRect *rect);
+
+GpStatus WINGDIPAPI
+GdipIsClipEmpty(GpGraphics *graphics, BOOL *result);
+
+GpStatus WINGDIPAPI
+GdipGetVisibleClipBounds(GpGraphics *graphics, GpRectF *rect);
+
+GpStatus WINGDIPAPI
+GdipGetVisibleClipBoundsI(GpGraphics *graphics, GpRect *rect);
+
+GpStatus WINGDIPAPI
+GdipIsVisibleClipEmpty(GpGraphics *graphics, BOOL *result);
+
+GpStatus WINGDIPAPI
+GdipIsVisiblePoint(GpGraphics *graphics, REAL x, REAL y,
+ BOOL *result);
+
+GpStatus WINGDIPAPI
+GdipIsVisiblePointI(GpGraphics *graphics, INT x, INT y,
+ BOOL *result);
+
+GpStatus WINGDIPAPI
+GdipIsVisibleRect(GpGraphics *graphics, REAL x, REAL y,
+ REAL width, REAL height, BOOL *result);
+
+GpStatus WINGDIPAPI
+GdipIsVisibleRectI(GpGraphics *graphics, INT x, INT y,
+ INT width, INT height, BOOL *result);
+
+GpStatus WINGDIPAPI
+GdipSaveGraphics(GpGraphics *graphics, GraphicsState *state);
+
+GpStatus WINGDIPAPI
+GdipRestoreGraphics(GpGraphics *graphics, GraphicsState state);
+
+GpStatus WINGDIPAPI
+GdipBeginContainer(GpGraphics *graphics, GDIPCONST GpRectF* dstrect,
+ GDIPCONST GpRectF *srcrect, GpUnit unit, GraphicsContainer *state);
+
+GpStatus WINGDIPAPI
+GdipBeginContainerI(GpGraphics *graphics, GDIPCONST GpRect* dstrect,
+ GDIPCONST GpRect *srcrect, GpUnit unit, GraphicsContainer *state);
+
+GpStatus WINGDIPAPI
+GdipBeginContainer2(GpGraphics *graphics, GraphicsContainer* state);
+
+GpStatus WINGDIPAPI
+GdipEndContainer(GpGraphics *graphics, GraphicsContainer state);
+
+GpStatus
+GdipGetMetafileHeaderFromWmf(
+ HMETAFILE hWmf,
+ GDIPCONST APMFileHeader * apmFileHeader,
+ MetafileHeader * header
+ );
+
+GpStatus
+WINGDIPAPI
+GdipGetMetafileHeaderFromEmf(
+ HENHMETAFILE hEmf,
+ MetafileHeader * header
+ );
+
+GpStatus
+WINGDIPAPI
+GdipGetMetafileHeaderFromFile(
+ GDIPCONST WCHAR* filename,
+ MetafileHeader * header
+ );
+
+GpStatus
+WINGDIPAPI
+GdipGetMetafileHeaderFromStream(
+ IStream * stream,
+ MetafileHeader * header
+ );
+
+GpStatus
+WINGDIPAPI
+GdipGetMetafileHeaderFromMetafile(
+ GpMetafile * metafile,
+ MetafileHeader * header
+ );
+
+GpStatus
+WINGDIPAPI
+GdipGetHemfFromMetafile(
+ GpMetafile * metafile,
+ HENHMETAFILE * hEmf
+ );
+
+GpStatus WINGDIPAPI
+GdipCreateStreamOnFile(GDIPCONST WCHAR * filename, UINT access, IStream **stream);
+
+GpStatus WINGDIPAPI
+GdipCreateMetafileFromWmf(HMETAFILE hWmf, BOOL deleteWmf,
+ GDIPCONST APMFileHeader * apmFileHeader, GpMetafile **metafile);
+
+GpStatus WINGDIPAPI
+GdipCreateMetafileFromEmf(HENHMETAFILE hEmf, BOOL deleteEmf,
+ GpMetafile **metafile);
+
+GpStatus WINGDIPAPI
+GdipCreateMetafileFromFile(GDIPCONST WCHAR* file, GpMetafile **metafile);
+
+GpStatus WINGDIPAPI
+GdipCreateMetafileFromWmfFile(GDIPCONST WCHAR* file, GDIPCONST APMFileHeader * apmFileHeader, GpMetafile **metafile);
+
+GpStatus WINGDIPAPI
+GdipCreateMetafileFromStream(IStream * stream, GpMetafile **metafile);
+
+GpStatus WINGDIPAPI
+GdipRecordMetafile(
+ HDC referenceHdc,
+ EmfType type,
+ GDIPCONST GpRectF * frameRect,
+ MetafileFrameUnit frameUnit,
+ GDIPCONST WCHAR * description,
+ GpMetafile ** metafile
+ );
+
+GpStatus WINGDIPAPI
+GdipRecordMetafileI(
+ HDC referenceHdc,
+ EmfType type,
+ GDIPCONST GpRect * frameRect,
+ MetafileFrameUnit frameUnit,
+ GDIPCONST WCHAR * description,
+ GpMetafile ** metafile
+ );
+
+GpStatus WINGDIPAPI
+GdipRecordMetafileFileName(
+ GDIPCONST WCHAR* fileName,
+ HDC referenceHdc,
+ EmfType type,
+ GDIPCONST GpRectF * frameRect,
+ MetafileFrameUnit frameUnit,
+ GDIPCONST WCHAR * description,
+ GpMetafile ** metafile
+ );
+
+GpStatus WINGDIPAPI
+GdipRecordMetafileFileNameI(
+ GDIPCONST WCHAR* fileName,
+ HDC referenceHdc,
+ EmfType type,
+ GDIPCONST GpRect * frameRect,
+ MetafileFrameUnit frameUnit,
+ GDIPCONST WCHAR * description,
+ GpMetafile ** metafile
+ );
+
+GpStatus WINGDIPAPI
+GdipRecordMetafileStream(
+ IStream * stream,
+ HDC referenceHdc,
+ EmfType type,
+ GDIPCONST GpRectF * frameRect,
+ MetafileFrameUnit frameUnit,
+ GDIPCONST WCHAR * description,
+ GpMetafile ** metafile
+ );
+
+GpStatus WINGDIPAPI
+GdipRecordMetafileStreamI(
+ IStream * stream,
+ HDC referenceHdc,
+ EmfType type,
+ GDIPCONST GpRect * frameRect,
+ MetafileFrameUnit frameUnit,
+ GDIPCONST WCHAR * description,
+ GpMetafile ** metafile
+ );
+
+GpStatus WINGDIPAPI
+GdipSetMetafileDownLevelRasterizationLimit(
+ GpMetafile * metafile,
+ UINT metafileRasterizationLimitDpi
+ );
+
+GpStatus WINGDIPAPI
+GdipGetMetafileDownLevelRasterizationLimit(
+ GDIPCONST GpMetafile * metafile,
+ UINT * metafileRasterizationLimitDpi
+ );
+
+GpStatus WINGDIPAPI
+GdipGetImageDecodersSize(UINT *numDecoders, UINT *size);
+
+GpStatus WINGDIPAPI
+GdipGetImageDecoders(UINT numDecoders,
+ UINT size,
+ ImageCodecInfo *decoders);
+
+GpStatus WINGDIPAPI
+GdipGetImageEncodersSize(UINT *numEncoders, UINT *size);
+
+GpStatus WINGDIPAPI
+GdipGetImageEncoders(UINT numEncoders,
+ UINT size,
+ ImageCodecInfo *encoders);
+
+GpStatus WINGDIPAPI
+GdipAddImageCodec(GDIPCONST ImageCodecInfo *codec);
+
+GpStatus WINGDIPAPI
+GdipRemoveImageCodec(GDIPCONST ImageCodecInfo *codec);
+
+#ifndef DCR_USE_NEW_186091
+GpStatus WINGDIPAPI
+GdipGetGraphicsPixel(GpGraphics* graphics, REAL x, REAL y, ARGB* argb);
+#endif
+
+GpStatus WINGDIPAPI
+GdipComment(GpGraphics* graphics, UINT sizeData, GDIPCONST BYTE * data);
+
+GpStatus WINGDIPAPI
+GdipGetGraphicsLayout(GpGraphics* graphics, GraphicsLayout* layout);
+
+GpStatus WINGDIPAPI
+GdipSetGraphicsLayout(GpGraphics* graphics, GDIPCONST GraphicsLayout layout);
+
+//----------------------------------------------------------------------------
+// FontFamily
+//----------------------------------------------------------------------------
+
+GpStatus WINGDIPAPI
+GdipCreateFontFamilyFromName(GDIPCONST WCHAR *name,
+ GpFontCollection *fontCollection,
+ GpFontFamily **FontFamily);
+
+GpStatus WINGDIPAPI
+GdipDeleteFontFamily(GpFontFamily *FontFamily);
+
+GpStatus WINGDIPAPI
+GdipCloneFontFamily(GpFontFamily *FontFamily, GpFontFamily **clonedFontFamily);
+
+GpStatus WINGDIPAPI
+GdipGetGenericFontFamilySansSerif(GpFontFamily **nativeFamily);
+
+GpStatus WINGDIPAPI
+GdipGetGenericFontFamilySerif(GpFontFamily **nativeFamily);
+
+GpStatus WINGDIPAPI
+GdipGetGenericFontFamilyMonospace(GpFontFamily **nativeFamily);
+
+
+GpStatus WINGDIPAPI
+GdipGetFamilyName(
+ GDIPCONST GpFontFamily *family,
+ WCHAR name[LF_FACESIZE],
+ LANGID language
+);
+
+GpStatus WINGDIPAPI
+GdipIsStyleAvailable(GDIPCONST GpFontFamily *family, INT style, BOOL * IsStyleAvailable);
+
+GpStatus WINGDIPAPI
+GdipFontCollectionEnumerable(
+ GpFontCollection* fontCollection,
+ GpGraphics* graphics,
+ INT * numFound
+);
+
+GpStatus WINGDIPAPI GdipFontCollectionEnumerate(
+ GpFontCollection* fontCollection,
+ INT numSought,
+ GpFontFamily* gpfamilies[],
+ INT* numFound,
+ GpGraphics* graphics
+);
+
+//-----------------------------------
+// New API
+//-----------------------------------
+
+GpStatus WINGDIPAPI
+GdipGetEmHeight(GDIPCONST GpFontFamily *family, INT style, UINT16 * EmHeight);
+
+GpStatus WINGDIPAPI
+GdipGetCellAscent(GDIPCONST GpFontFamily *family, INT style, UINT16 * CellAscent);
+
+GpStatus WINGDIPAPI
+GdipGetCellDescent(GDIPCONST GpFontFamily *family, INT style, UINT16 * CellDescent);
+
+GpStatus WINGDIPAPI
+GdipGetLineSpacing(GDIPCONST GpFontFamily *family, INT style, UINT16 * LineSpacing);
+
+
+//----------------------------------------------------------------------------
+// Font
+//----------------------------------------------------------------------------
+
+GpStatus WINGDIPAPI
+GdipCreateFontFromDC(
+ HDC hdc,
+ GpFont **font
+);
+
+GpStatus WINGDIPAPI
+GdipCreateFontFromLogfontA(
+ HDC hdc,
+ GDIPCONST LOGFONTA *logfont,
+ GpFont **font
+);
+
+GpStatus WINGDIPAPI
+GdipCreateFontFromLogfontW(
+ HDC hdc,
+ GDIPCONST LOGFONTW *logfont,
+ GpFont **font
+);
+
+GpStatus WINGDIPAPI
+GdipCreateFont(
+ GDIPCONST GpFontFamily *fontFamily,
+ REAL emSize,
+ INT style,
+ Unit unit,
+ GpFont **font
+);
+
+GpStatus WINGDIPAPI
+GdipCloneFont(GpFont* font, GpFont** cloneFont);
+
+GpStatus WINGDIPAPI
+GdipDeleteFont(GpFont* font);
+
+GpStatus WINGDIPAPI
+GdipGetFamily(GpFont *font, GpFontFamily **family);
+
+GpStatus WINGDIPAPI
+GdipGetFontStyle(GpFont *font, INT *style);
+
+GpStatus WINGDIPAPI
+GdipGetFontSize(GpFont *font, REAL *size);
+
+GpStatus WINGDIPAPI
+GdipGetFontUnit(GpFont *font, Unit *unit);
+
+GpStatus WINGDIPAPI
+GdipGetFontHeight(GDIPCONST GpFont *font, GDIPCONST GpGraphics *graphics, REAL *height);
+
+#ifdef DCR_USE_NEW_125467
+GpStatus WINGDIPAPI
+GdipGetFontHeightGivenDPI(GDIPCONST GpFont *font, REAL dpi, REAL *height);
+#endif
+
+GpStatus WINGDIPAPI
+GdipGetLogFontA(GpFont * font, GpGraphics *graphics, LOGFONTA * logfontA);
+
+GpStatus WINGDIPAPI
+GdipGetLogFontW(GpFont * font, GpGraphics *graphics, LOGFONTW * logfontW);
+
+// FontCollection
+
+GpStatus WINGDIPAPI
+GdipNewInstalledFontCollection(GpFontCollection** fontCollection);
+
+GpStatus WINGDIPAPI
+GdipNewPrivateFontCollection(GpFontCollection** fontCollection);
+
+GpStatus WINGDIPAPI
+GdipDeletePrivateFontCollection(GpFontCollection** fontCollection);
+
+GpStatus WINGDIPAPI
+GdipGetFontCollectionFamilyCount(
+ GpFontCollection* fontCollection,
+ INT * numFound
+);
+
+GpStatus WINGDIPAPI
+GdipGetFontCollectionFamilyList(
+ GpFontCollection* fontCollection,
+ INT numSought,
+ GpFontFamily* gpfamilies[],
+ INT* numFound
+);
+
+#ifndef DCR_USE_NEW_235072
+GpStatus WINGDIPAPI
+GdipInstallFontFile(
+ GpFontCollection* fontCollection,
+ GDIPCONST WCHAR* filename
+);
+
+GpStatus WINGDIPAPI
+GdipUninstallFontFile(
+ GpFontCollection* fontCollection,
+ GDIPCONST WCHAR* filename
+);
+#endif
+
+GpStatus WINGDIPAPI
+GdipPrivateAddFontFile(
+ GpFontCollection* fontCollection,
+ GDIPCONST WCHAR* filename
+);
+
+GpStatus WINGDIPAPI
+GdipPrivateAddMemoryFont(
+ GpFontCollection* fontCollection,
+ GDIPCONST void* memory,
+ INT length
+);
+
+//----------------------------------------------------------------------------
+// Text
+//----------------------------------------------------------------------------
+
+GpStatus WINGDIPAPI
+GdipDrawString(
+ GpGraphics *graphics,
+ GDIPCONST WCHAR *string,
+ INT length,
+ GDIPCONST GpFont *font,
+ GDIPCONST RectF *layoutRect,
+ GDIPCONST GpStringFormat *stringFormat,
+ GDIPCONST GpBrush *brush
+);
+
+GpStatus WINGDIPAPI
+GdipMeasureString(
+ GpGraphics *graphics,
+ GDIPCONST WCHAR *string,
+ INT length,
+ GDIPCONST GpFont *font,
+ GDIPCONST RectF *layoutRect,
+ GDIPCONST GpStringFormat *stringFormat,
+ RectF *boundingBox,
+ INT *codepointsFitted,
+ INT *linesFilled
+);
+
+#ifndef DCR_USE_NEW_174340
+GpStatus WINGDIPAPI
+GdipMeasureStringRegion(
+ GpGraphics *graphics,
+ GDIPCONST WCHAR *string,
+ INT length,
+ GDIPCONST GpFont *font,
+ GDIPCONST RectF &layoutRect,
+ GDIPCONST GpStringFormat *stringFormat,
+ INT firstCharacterIndex,
+ INT characterCount,
+ GpRegion *region
+);
+#endif
+
+#ifdef DCR_USE_NEW_174340
+GpStatus
+WINGDIPAPI
+GdipMeasureCharacterRanges(
+ GpGraphics *graphics,
+ GDIPCONST WCHAR *string,
+ INT length,
+ GDIPCONST GpFont *font,
+ GDIPCONST RectF &layoutRect,
+ GDIPCONST GpStringFormat *stringFormat,
+ INT regionCount,
+ GpRegion **regions
+);
+#endif
+
+GpStatus WINGDIPAPI
+GdipDrawDriverString(
+ GpGraphics *graphics,
+ GDIPCONST UINT16 *text,
+ INT length,
+ GDIPCONST GpFont *font,
+ GDIPCONST GpBrush *brush,
+ GDIPCONST PointF *positions,
+ INT flags,
+ GDIPCONST GpMatrix *matrix
+);
+
+GpStatus WINGDIPAPI
+GdipMeasureDriverString(
+ GpGraphics *graphics,
+ GDIPCONST UINT16 *text,
+ INT length,
+ GDIPCONST GpFont *font,
+ GDIPCONST PointF *positions,
+ INT flags,
+ GDIPCONST GpMatrix *matrix,
+ RectF *boundingBox
+);
+
+#ifndef DCR_USE_NEW_168772
+GpStatus WINGDIPAPI
+GdipDriverStringPointToCodepoint(
+ GpGraphics *graphics,
+ GDIPCONST UINT16 *text,
+ INT length,
+ GDIPCONST GpFont *font,
+ GDIPCONST PointF *positions,
+ INT flags,
+ GpMatrix *matrix,
+ GDIPCONST PointF *hit,
+ INT *index,
+ BOOL *rightEdge,
+ REAL *distance
+);
+#endif
+
+//----------------------------------------------------------------------------
+// String format APIs
+//----------------------------------------------------------------------------
+
+GpStatus WINGDIPAPI
+GdipCreateStringFormat(
+ INT formatAttributes,
+ LANGID language,
+ GpStringFormat **format
+);
+
+GpStatus WINGDIPAPI
+GdipStringFormatGetGenericDefault(GpStringFormat **format);
+
+GpStatus WINGDIPAPI
+GdipStringFormatGetGenericTypographic(GpStringFormat **format);
+
+GpStatus WINGDIPAPI
+GdipDeleteStringFormat(GpStringFormat *format);
+
+GpStatus WINGDIPAPI
+GdipCloneStringFormat(GDIPCONST GpStringFormat *format, GpStringFormat **newFormat);
+
+GpStatus WINGDIPAPI
+GdipSetStringFormatFlags(GpStringFormat *format, INT flags);
+
+GpStatus WINGDIPAPI GdipGetStringFormatFlags(GDIPCONST GpStringFormat *format, INT *flags);
+
+#ifndef DCR_USE_NEW_152154
+GpStatus WINGDIPAPI
+GdipSetStringFormatLineSpacing(GpStringFormat *format, REAL amount,
+ LineSpacing method);
+
+GpStatus WINGDIPAPI
+GdipGetStringFormatLineSpacingAmount(GDIPCONST GpStringFormat *format, REAL *amount);
+GpStatus WINGDIPAPI
+GdipGetStringFormatLineSpacingMethod(GDIPCONST GpStringFormat *format, LineSpacing *method);
+#endif
+
+GpStatus WINGDIPAPI
+GdipSetStringFormatAlign(GpStringFormat *format, StringAlignment align);
+
+GpStatus WINGDIPAPI
+GdipGetStringFormatAlign(GDIPCONST GpStringFormat *format, StringAlignment *align);
+
+GpStatus WINGDIPAPI
+GdipSetStringFormatLineAlign(GpStringFormat *format,
+ StringAlignment align);
+
+GpStatus WINGDIPAPI
+GdipGetStringFormatLineAlign(GDIPCONST GpStringFormat *format,
+ StringAlignment *align);
+
+GpStatus WINGDIPAPI
+GdipSetStringFormatTrimming(
+ GpStringFormat *format,
+ StringTrimming trimming
+);
+
+GpStatus WINGDIPAPI
+GdipGetStringFormatTrimming(
+ GDIPCONST GpStringFormat *format,
+ StringTrimming *trimming
+);
+
+GpStatus WINGDIPAPI
+GdipSetStringFormatHotkeyPrefix(GpStringFormat *format, INT hotkeyPrefix);
+
+GpStatus WINGDIPAPI
+GdipGetStringFormatHotkeyPrefix(GDIPCONST GpStringFormat *format, INT *hotkeyPrefix);
+
+GpStatus WINGDIPAPI
+GdipSetStringFormatTabStops(GpStringFormat *format, REAL firstTabOffset, INT count, GDIPCONST REAL *tabStops);
+
+GpStatus WINGDIPAPI
+GdipGetStringFormatTabStops(GDIPCONST GpStringFormat *format, INT count, REAL *firstTabOffset, REAL *tabStops);
+
+GpStatus WINGDIPAPI
+GdipGetStringFormatTabStopCount(GDIPCONST GpStringFormat *format, INT * count);
+
+#ifdef DCR_USE_NEW_146933
+GpStatus WINGDIPAPI
+GdipSetStringFormatDigitSubstitution(GpStringFormat *format, LANGID language,
+ StringDigitSubstitute substitute);
+
+GpStatus WINGDIPAPI
+GdipGetStringFormatDigitSubstitution(GDIPCONST GpStringFormat *format, LANGID *language,
+ StringDigitSubstitute *substitute);
+#endif // DCR_USE_NEW_146933
+
+#ifdef DCR_USE_NEW_174340
+GpStatus WINGDIPAPI
+GdipGetStringFormatMeasurableCharacterRangeCount(
+ GDIPCONST GpStringFormat *format,
+ INT *count
+);
+
+GpStatus WINGDIPAPI
+GdipSetStringFormatMeasurableCharacterRanges(
+ GpStringFormat *format,
+ INT rangeCount,
+ GDIPCONST CharacterRange *ranges
+);
+#endif
+
+//----------------------------------------------------------------------------
+// Cached Bitmap APIs
+//----------------------------------------------------------------------------
+
+GpStatus WINGDIPAPI
+GdipCreateCachedBitmap(
+ GpBitmap *bitmap,
+ GpGraphics *graphics,
+ GpCachedBitmap **cachedBitmap
+);
+
+GpStatus WINGDIPAPI
+GdipDeleteCachedBitmap(GpCachedBitmap *cachedBitmap);
+
+GpStatus WINGDIPAPI
+GdipDrawCachedBitmap(
+ GpGraphics *graphics,
+ GpCachedBitmap *cachedBitmap,
+ INT x,
+ INT y
+);
+
+UINT WINGDIPAPI
+GdipEmfToWmfBits(
+ HENHMETAFILE hemf,
+ UINT cbData16,
+ LPBYTE pData16,
+ INT iMapMode,
+ INT eFlags
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // !_FLATAPI_H
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusFont.h b/core/src/fxge/Microsoft SDK/include/GdiPlusFont.h
index c9ff050561..4c9e01f589 100644
--- a/core/src/fxge/Microsoft SDK/include/GdiPlusFont.h
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusFont.h
@@ -1,299 +1,299 @@
-/**************************************************************************\
-*
-* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
-*
-* Module Name:
-*
-* GdiplusFont.h
-*
-* Abstract:
-*
-* Font related declarations
-*
-\**************************************************************************/
-
-#ifndef _GDIPLUSFONT_H
-#define _GDIPLUSFONT_H
-
-inline
-Font::Font(IN HDC hdc)
-{
- GpFont *font = NULL;
- lastResult = DllExports::GdipCreateFontFromDC(hdc, &font);
-
-#ifndef DCR_USE_NEW_135429
- if ((INT) lastResult >= 10)
- lastResult = NotFound;
-#endif
-
- SetNativeFont(font);
-}
-
-#ifdef DCR_USE_NEW_127084
-inline
-Font::Font(IN HDC hdc,
- IN const HFONT hfont)
-{
- GpFont *font = NULL;
-
- if (hfont)
- {
- LOGFONTA lf;
-
- if(GetObjectA(hfont, sizeof(LOGFONTA), &lf))
- lastResult = DllExports::GdipCreateFontFromLogfontA(hdc, &lf, &font);
- else
- lastResult = DllExports::GdipCreateFontFromDC(hdc, &font);
- }
- else
- {
- lastResult = DllExports::GdipCreateFontFromDC(hdc, &font);
- }
-
-#ifndef DCR_USE_NEW_135429
- if ((INT) lastResult >= 10)
- lastResult = NotFound;
-#endif
-
- SetNativeFont(font);
-}
-#endif
-
-inline
-Font::Font(IN HDC hdc,
- IN const LOGFONTW* logfont)
-{
- GpFont *font = NULL;
- if (logfont)
- {
- lastResult = DllExports::GdipCreateFontFromLogfontW(hdc, logfont, &font);
- }
- else
- {
- lastResult = DllExports::GdipCreateFontFromDC(hdc, &font);
- }
-
-#ifndef DCR_USE_NEW_135429
- if ((INT) lastResult >= 10)
- lastResult = NotFound;
-#endif
-
- SetNativeFont(font);
-}
-
-inline
-Font::Font(IN HDC hdc,
- IN const LOGFONTA* logfont)
-{
- GpFont *font = NULL;
-
- if (logfont)
- {
- lastResult = DllExports::GdipCreateFontFromLogfontA(hdc, logfont, &font);
- }
- else
- {
- lastResult = DllExports::GdipCreateFontFromDC(hdc, &font);
- }
-
-#ifndef DCR_USE_NEW_135429
- if ((INT) lastResult >= 10)
- lastResult = NotFound;
-#endif
-
- SetNativeFont(font);
-}
-
-inline
-Font::Font(
- IN const FontFamily * family,
- IN REAL emSize,
- IN INT style,
- IN Unit unit
-)
-{
- GpFont *font = NULL;
-
- lastResult = DllExports::GdipCreateFont(family ? family->nativeFamily : NULL,
- emSize,
- style,
- unit,
- &font);
-
-#ifndef DCR_USE_NEW_135429
- if ((INT) lastResult >= 10)
- lastResult = NotFound;
-#endif
-
- SetNativeFont(font);
-}
-
-inline
-Font::Font(
- IN const WCHAR * familyName,
- IN REAL emSize,
- IN INT style,
- IN Unit unit,
- IN const FontCollection * fontCollection
-)
-{
- FontFamily family(familyName, fontCollection);
-
- GpFont * font = NULL;
-
- lastResult = family.GetLastStatus();
-
- if (lastResult == Ok)
- {
- lastResult = DllExports::GdipCreateFont(family.nativeFamily,
- emSize,
- style,
- unit,
- &font);
- }
-
-#ifndef DCR_USE_NEW_135429
- if ((INT) lastResult >= 10)
- lastResult = NotFound;
-#endif
-
- SetNativeFont(font);
-}
-
-inline Status
-Font::GetLogFontA(IN const Graphics *g,
- OUT LOGFONTA *logfontA) const
-{
- return SetStatus(DllExports::GdipGetLogFontA(nativeFont, g ? g->nativeGraphics : NULL, logfontA));
-
-}
-
-inline Status
-Font::GetLogFontW(IN const Graphics *g,
- OUT LOGFONTW *logfontW) const
-{
- return SetStatus(DllExports::GdipGetLogFontW(nativeFont, g ? g->nativeGraphics : NULL, logfontW));
-}
-
-
-inline Font*
-Font::Clone() const
-{
- GpFont *cloneFont = NULL;
-
- SetStatus(DllExports::GdipCloneFont(nativeFont, &cloneFont));
-
- return new Font(cloneFont, lastResult);
-}
-
-inline
-Font::~Font()
-{
- DllExports::GdipDeleteFont(nativeFont);
-}
-
-// Operations
-
-inline BOOL
-Font::IsAvailable() const
-{
- return (nativeFont ? TRUE : FALSE);
-}
-
-inline Status
-Font::GetFamily(OUT FontFamily *family) const
-{
- if (family == NULL)
- {
- return SetStatus(InvalidParameter);
- }
-
- Status status = DllExports::GdipGetFamily(nativeFont, &(family->nativeFamily));
- family->SetStatus(status);
-
- return SetStatus(status);
-}
-
-inline INT
-Font::GetStyle() const
-{
- INT style;
-
- SetStatus(DllExports::GdipGetFontStyle(nativeFont, &style));
-
- return style;
-}
-
-inline REAL
-Font::GetSize() const
-{
- REAL size;
- SetStatus(DllExports::GdipGetFontSize(nativeFont, &size));
- return size;
-}
-
-inline Unit
-Font::GetUnit() const
-{
- Unit unit;
- SetStatus(DllExports::GdipGetFontUnit(nativeFont, &unit));
- return unit;
-}
-
-inline REAL
-Font::GetHeight(IN const Graphics *graphics) const
-{
- REAL height;
- SetStatus(DllExports::GdipGetFontHeight(
- nativeFont,
- graphics ? graphics->nativeGraphics : NULL,
- &height
- ));
- return height;
-}
-
-
-#ifdef DCR_USE_NEW_125467
-inline REAL
-Font::GetHeight(IN REAL dpi = 0) const
-{
- REAL height;
- SetStatus(DllExports::GdipGetFontHeightGivenDPI(nativeFont, dpi, &height));
- return height;
-}
-#endif
-
-
-// protected method
-inline
-Font::Font(IN GpFont* font,
- IN Status status)
-{
- lastResult = status;
- SetNativeFont(font);
-}
-
-// protected method
-inline VOID
-Font::SetNativeFont(GpFont *Font)
-{
- nativeFont = Font;
-}
-
-inline Status
-Font::GetLastStatus(void) const
-{
- return lastResult;
-}
-
-// protected method
-inline Status
-Font::SetStatus(IN Status status) const
-{
- if (status != Ok)
- return (lastResult = status);
- else
- return status;
-}
-
-#endif
+/**************************************************************************\
+*
+* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
+*
+* Module Name:
+*
+* GdiplusFont.h
+*
+* Abstract:
+*
+* Font related declarations
+*
+\**************************************************************************/
+
+#ifndef _GDIPLUSFONT_H
+#define _GDIPLUSFONT_H
+
+inline
+Font::Font(IN HDC hdc)
+{
+ GpFont *font = NULL;
+ lastResult = DllExports::GdipCreateFontFromDC(hdc, &font);
+
+#ifndef DCR_USE_NEW_135429
+ if ((INT) lastResult >= 10)
+ lastResult = NotFound;
+#endif
+
+ SetNativeFont(font);
+}
+
+#ifdef DCR_USE_NEW_127084
+inline
+Font::Font(IN HDC hdc,
+ IN const HFONT hfont)
+{
+ GpFont *font = NULL;
+
+ if (hfont)
+ {
+ LOGFONTA lf;
+
+ if(GetObjectA(hfont, sizeof(LOGFONTA), &lf))
+ lastResult = DllExports::GdipCreateFontFromLogfontA(hdc, &lf, &font);
+ else
+ lastResult = DllExports::GdipCreateFontFromDC(hdc, &font);
+ }
+ else
+ {
+ lastResult = DllExports::GdipCreateFontFromDC(hdc, &font);
+ }
+
+#ifndef DCR_USE_NEW_135429
+ if ((INT) lastResult >= 10)
+ lastResult = NotFound;
+#endif
+
+ SetNativeFont(font);
+}
+#endif
+
+inline
+Font::Font(IN HDC hdc,
+ IN const LOGFONTW* logfont)
+{
+ GpFont *font = NULL;
+ if (logfont)
+ {
+ lastResult = DllExports::GdipCreateFontFromLogfontW(hdc, logfont, &font);
+ }
+ else
+ {
+ lastResult = DllExports::GdipCreateFontFromDC(hdc, &font);
+ }
+
+#ifndef DCR_USE_NEW_135429
+ if ((INT) lastResult >= 10)
+ lastResult = NotFound;
+#endif
+
+ SetNativeFont(font);
+}
+
+inline
+Font::Font(IN HDC hdc,
+ IN const LOGFONTA* logfont)
+{
+ GpFont *font = NULL;
+
+ if (logfont)
+ {
+ lastResult = DllExports::GdipCreateFontFromLogfontA(hdc, logfont, &font);
+ }
+ else
+ {
+ lastResult = DllExports::GdipCreateFontFromDC(hdc, &font);
+ }
+
+#ifndef DCR_USE_NEW_135429
+ if ((INT) lastResult >= 10)
+ lastResult = NotFound;
+#endif
+
+ SetNativeFont(font);
+}
+
+inline
+Font::Font(
+ IN const FontFamily * family,
+ IN REAL emSize,
+ IN INT style,
+ IN Unit unit
+)
+{
+ GpFont *font = NULL;
+
+ lastResult = DllExports::GdipCreateFont(family ? family->nativeFamily : NULL,
+ emSize,
+ style,
+ unit,
+ &font);
+
+#ifndef DCR_USE_NEW_135429
+ if ((INT) lastResult >= 10)
+ lastResult = NotFound;
+#endif
+
+ SetNativeFont(font);
+}
+
+inline
+Font::Font(
+ IN const WCHAR * familyName,
+ IN REAL emSize,
+ IN INT style,
+ IN Unit unit,
+ IN const FontCollection * fontCollection
+)
+{
+ FontFamily family(familyName, fontCollection);
+
+ GpFont * font = NULL;
+
+ lastResult = family.GetLastStatus();
+
+ if (lastResult == Ok)
+ {
+ lastResult = DllExports::GdipCreateFont(family.nativeFamily,
+ emSize,
+ style,
+ unit,
+ &font);
+ }
+
+#ifndef DCR_USE_NEW_135429
+ if ((INT) lastResult >= 10)
+ lastResult = NotFound;
+#endif
+
+ SetNativeFont(font);
+}
+
+inline Status
+Font::GetLogFontA(IN const Graphics *g,
+ OUT LOGFONTA *logfontA) const
+{
+ return SetStatus(DllExports::GdipGetLogFontA(nativeFont, g ? g->nativeGraphics : NULL, logfontA));
+
+}
+
+inline Status
+Font::GetLogFontW(IN const Graphics *g,
+ OUT LOGFONTW *logfontW) const
+{
+ return SetStatus(DllExports::GdipGetLogFontW(nativeFont, g ? g->nativeGraphics : NULL, logfontW));
+}
+
+
+inline Font*
+Font::Clone() const
+{
+ GpFont *cloneFont = NULL;
+
+ SetStatus(DllExports::GdipCloneFont(nativeFont, &cloneFont));
+
+ return new Font(cloneFont, lastResult);
+}
+
+inline
+Font::~Font()
+{
+ DllExports::GdipDeleteFont(nativeFont);
+}
+
+// Operations
+
+inline BOOL
+Font::IsAvailable() const
+{
+ return (nativeFont ? TRUE : FALSE);
+}
+
+inline Status
+Font::GetFamily(OUT FontFamily *family) const
+{
+ if (family == NULL)
+ {
+ return SetStatus(InvalidParameter);
+ }
+
+ Status status = DllExports::GdipGetFamily(nativeFont, &(family->nativeFamily));
+ family->SetStatus(status);
+
+ return SetStatus(status);
+}
+
+inline INT
+Font::GetStyle() const
+{
+ INT style;
+
+ SetStatus(DllExports::GdipGetFontStyle(nativeFont, &style));
+
+ return style;
+}
+
+inline REAL
+Font::GetSize() const
+{
+ REAL size;
+ SetStatus(DllExports::GdipGetFontSize(nativeFont, &size));
+ return size;
+}
+
+inline Unit
+Font::GetUnit() const
+{
+ Unit unit;
+ SetStatus(DllExports::GdipGetFontUnit(nativeFont, &unit));
+ return unit;
+}
+
+inline REAL
+Font::GetHeight(IN const Graphics *graphics) const
+{
+ REAL height;
+ SetStatus(DllExports::GdipGetFontHeight(
+ nativeFont,
+ graphics ? graphics->nativeGraphics : NULL,
+ &height
+ ));
+ return height;
+}
+
+
+#ifdef DCR_USE_NEW_125467
+inline REAL
+Font::GetHeight(IN REAL dpi = 0) const
+{
+ REAL height;
+ SetStatus(DllExports::GdipGetFontHeightGivenDPI(nativeFont, dpi, &height));
+ return height;
+}
+#endif
+
+
+// protected method
+inline
+Font::Font(IN GpFont* font,
+ IN Status status)
+{
+ lastResult = status;
+ SetNativeFont(font);
+}
+
+// protected method
+inline VOID
+Font::SetNativeFont(GpFont *Font)
+{
+ nativeFont = Font;
+}
+
+inline Status
+Font::GetLastStatus(void) const
+{
+ return lastResult;
+}
+
+// protected method
+inline Status
+Font::SetStatus(IN Status status) const
+{
+ if (status != Ok)
+ return (lastResult = status);
+ else
+ return status;
+}
+
+#endif
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusFontCollection.h b/core/src/fxge/Microsoft SDK/include/GdiPlusFontCollection.h
index d2257ba456..2f3351c95b 100644
--- a/core/src/fxge/Microsoft SDK/include/GdiPlusFontCollection.h
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusFontCollection.h
@@ -1,149 +1,149 @@
-/**************************************************************************\
-*
-* Copyright (c) 2000, Microsoft Corp. All Rights Reserved.
-*
-* Module Name:
-*
-* GdiplusFontCollection.h
-*
-* Abstract:
-*
-* Font collections (Installed and Private)
-*
-\**************************************************************************/
-
-#ifndef _GDIPLUSFONTCOLL_H
-#define _GDIPLUSFONTCOLL_H
-
-inline
-FontCollection::FontCollection()
-{
- nativeFontCollection = NULL;
-}
-
-inline
-FontCollection::~FontCollection()
-{
-}
-
-inline INT
-FontCollection::GetFamilyCount() const
-{
- INT numFound = 0;
-
- lastResult = DllExports::GdipGetFontCollectionFamilyCount(
- nativeFontCollection, &numFound);
-
-
-
- return numFound;
-}
-
-inline Status
-FontCollection::GetFamilies(
- IN INT numSought,
- OUT FontFamily * gpfamilies,
- OUT INT * numFound
-) const
-{
- if (numSought <= 0 || gpfamilies == NULL || numFound == NULL)
- {
- return SetStatus(InvalidParameter);
- }
- *numFound = 0;
- GpFontFamily **nativeFamilyList = new GpFontFamily*[numSought];
-
- if (nativeFamilyList == NULL)
- {
- return SetStatus(OutOfMemory);
- }
-
- Status status = SetStatus(DllExports::GdipGetFontCollectionFamilyList(
- nativeFontCollection,
- numSought,
- nativeFamilyList,
- numFound
- ));
- if (status == Ok)
- {
- for (INT i = 0; i < *numFound; i++)
- {
- DllExports::GdipCloneFontFamily(nativeFamilyList[i],
- &gpfamilies[i].nativeFamily);
- }
- }
-
- delete [] nativeFamilyList;
-
- return status;
-}
-
-inline Status FontCollection::GetLastStatus () const
-{
- return lastResult;
-}
-
-// protected method
-inline Status
-FontCollection::SetStatus(IN Status status) const
-{
- lastResult = status;
- return lastResult;
-}
-
-inline
-InstalledFontCollection::InstalledFontCollection()
-{
- nativeFontCollection = NULL;
- lastResult = DllExports::GdipNewInstalledFontCollection(&nativeFontCollection);
-}
-
-inline
-InstalledFontCollection::~InstalledFontCollection()
-{
-}
-
-#ifndef DCR_USE_NEW_235072
-inline Status
-InstalledFontCollection::InstallFontFile(IN const WCHAR* filename)
-{
- return SetStatus(DllExports::GdipInstallFontFile(nativeFontCollection, filename));
-}
-
-inline Status
-InstalledFontCollection::UninstallFontFile(IN const WCHAR* filename)
-{
- return SetStatus(DllExports::GdipUninstallFontFile(nativeFontCollection, filename));
-}
-#endif
-
-inline
-PrivateFontCollection::PrivateFontCollection()
-{
- nativeFontCollection = NULL;
- lastResult = DllExports::GdipNewPrivateFontCollection(&nativeFontCollection);
-}
-
-inline
-PrivateFontCollection::~PrivateFontCollection()
-{
- DllExports::GdipDeletePrivateFontCollection(&nativeFontCollection);
-}
-
-inline Status
-PrivateFontCollection::AddFontFile(IN const WCHAR* filename)
-{
- return SetStatus(DllExports::GdipPrivateAddFontFile(nativeFontCollection, filename));
-}
-
-inline Status
-PrivateFontCollection::AddMemoryFont(IN const void* memory,
- IN INT length)
-{
- return SetStatus(DllExports::GdipPrivateAddMemoryFont(
- nativeFontCollection,
- memory,
- length));
-}
-
-#endif // _GDIPLUSFONTCOLL_H
+/**************************************************************************\
+*
+* Copyright (c) 2000, Microsoft Corp. All Rights Reserved.
+*
+* Module Name:
+*
+* GdiplusFontCollection.h
+*
+* Abstract:
+*
+* Font collections (Installed and Private)
+*
+\**************************************************************************/
+
+#ifndef _GDIPLUSFONTCOLL_H
+#define _GDIPLUSFONTCOLL_H
+
+inline
+FontCollection::FontCollection()
+{
+ nativeFontCollection = NULL;
+}
+
+inline
+FontCollection::~FontCollection()
+{
+}
+
+inline INT
+FontCollection::GetFamilyCount() const
+{
+ INT numFound = 0;
+
+ lastResult = DllExports::GdipGetFontCollectionFamilyCount(
+ nativeFontCollection, &numFound);
+
+
+
+ return numFound;
+}
+
+inline Status
+FontCollection::GetFamilies(
+ IN INT numSought,
+ OUT FontFamily * gpfamilies,
+ OUT INT * numFound
+) const
+{
+ if (numSought <= 0 || gpfamilies == NULL || numFound == NULL)
+ {
+ return SetStatus(InvalidParameter);
+ }
+ *numFound = 0;
+ GpFontFamily **nativeFamilyList = new GpFontFamily*[numSought];
+
+ if (nativeFamilyList == NULL)
+ {
+ return SetStatus(OutOfMemory);
+ }
+
+ Status status = SetStatus(DllExports::GdipGetFontCollectionFamilyList(
+ nativeFontCollection,
+ numSought,
+ nativeFamilyList,
+ numFound
+ ));
+ if (status == Ok)
+ {
+ for (INT i = 0; i < *numFound; i++)
+ {
+ DllExports::GdipCloneFontFamily(nativeFamilyList[i],
+ &gpfamilies[i].nativeFamily);
+ }
+ }
+
+ delete [] nativeFamilyList;
+
+ return status;
+}
+
+inline Status FontCollection::GetLastStatus () const
+{
+ return lastResult;
+}
+
+// protected method
+inline Status
+FontCollection::SetStatus(IN Status status) const
+{
+ lastResult = status;
+ return lastResult;
+}
+
+inline
+InstalledFontCollection::InstalledFontCollection()
+{
+ nativeFontCollection = NULL;
+ lastResult = DllExports::GdipNewInstalledFontCollection(&nativeFontCollection);
+}
+
+inline
+InstalledFontCollection::~InstalledFontCollection()
+{
+}
+
+#ifndef DCR_USE_NEW_235072
+inline Status
+InstalledFontCollection::InstallFontFile(IN const WCHAR* filename)
+{
+ return SetStatus(DllExports::GdipInstallFontFile(nativeFontCollection, filename));
+}
+
+inline Status
+InstalledFontCollection::UninstallFontFile(IN const WCHAR* filename)
+{
+ return SetStatus(DllExports::GdipUninstallFontFile(nativeFontCollection, filename));
+}
+#endif
+
+inline
+PrivateFontCollection::PrivateFontCollection()
+{
+ nativeFontCollection = NULL;
+ lastResult = DllExports::GdipNewPrivateFontCollection(&nativeFontCollection);
+}
+
+inline
+PrivateFontCollection::~PrivateFontCollection()
+{
+ DllExports::GdipDeletePrivateFontCollection(&nativeFontCollection);
+}
+
+inline Status
+PrivateFontCollection::AddFontFile(IN const WCHAR* filename)
+{
+ return SetStatus(DllExports::GdipPrivateAddFontFile(nativeFontCollection, filename));
+}
+
+inline Status
+PrivateFontCollection::AddMemoryFont(IN const void* memory,
+ IN INT length)
+{
+ return SetStatus(DllExports::GdipPrivateAddMemoryFont(
+ nativeFontCollection,
+ memory,
+ length));
+}
+
+#endif // _GDIPLUSFONTCOLL_H
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusFontFamily.h b/core/src/fxge/Microsoft SDK/include/GdiPlusFontFamily.h
index ef2f3dde9b..076e1572ac 100644
--- a/core/src/fxge/Microsoft SDK/include/GdiPlusFontFamily.h
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusFontFamily.h
@@ -1,271 +1,271 @@
-/**************************************************************************\
-*
-* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
-*
-* Module Name:
-*
-* GdiplusFontFamily.h
-*
-* Abstract:
-*
-* Font family API related declarations
-*
-\**************************************************************************/
-
-#ifndef _GDIPLUS_FONT_FAMILY_H
-#define _GDIPLUS_FONT_FAMILY_H
-
-inline
-FontFamily::FontFamily() :
- nativeFamily (NULL),
- lastResult (Ok)
-{
-}
-
-inline
-FontFamily::FontFamily(
- IN const WCHAR* name,
- IN const FontCollection* fontCollection
-)
-{
- nativeFamily = NULL;
- lastResult = DllExports::GdipCreateFontFamilyFromName(
- name,
- fontCollection ? fontCollection->nativeFontCollection : NULL,
- &nativeFamily
- );
-
-#ifndef DCR_USE_NEW_135429
- if ((INT) lastResult >= 10)
- lastResult = NotFound;
-#endif
-}
-
-// private method
-inline
-FontFamily::FontFamily(
- IN GpFontFamily *nativeOrig,
- IN Status status
-)
-{
- lastResult = status;
- nativeFamily = nativeOrig;
-}
-
-// Generic font family access
-
-inline const FontFamily *
-FontFamily::GenericSansSerif()
-{
- if (GenericSansSerifFontFamily != NULL)
- {
- return GenericSansSerifFontFamily;
- }
-
- GenericSansSerifFontFamily =
- (FontFamily*) GenericSansSerifFontFamilyBuffer;
-
- GenericSansSerifFontFamily->lastResult =
- DllExports::GdipGetGenericFontFamilySansSerif(
- &(GenericSansSerifFontFamily->nativeFamily)
- );
-
-#ifndef DCR_USE_NEW_135429
- if ((INT) GenericSansSerifFontFamily->lastResult >= 10)
- GenericSansSerifFontFamily->lastResult = NotFound;
-#endif
-
- return GenericSansSerifFontFamily;
-}
-
-inline const FontFamily *
-FontFamily::GenericSerif()
-{
- if (GenericSerifFontFamily != NULL)
- {
- return GenericSerifFontFamily;
- }
-
- GenericSerifFontFamily =
- (FontFamily*) GenericSerifFontFamilyBuffer;
-
- GenericSerifFontFamily->lastResult =
- DllExports::GdipGetGenericFontFamilySerif(
- &(GenericSerifFontFamily->nativeFamily)
- );
-
-#ifndef DCR_USE_NEW_135429
- if ((INT) GenericSerifFontFamily->lastResult >= 10)
- GenericSerifFontFamily->lastResult = NotFound;
-#endif
-
- return GenericSerifFontFamily;
-}
-
-inline const FontFamily *
-FontFamily::GenericMonospace()
-{
- if (GenericMonospaceFontFamily != NULL)
- {
- return GenericMonospaceFontFamily;
- }
-
- GenericMonospaceFontFamily =
- (FontFamily*) GenericMonospaceFontFamilyBuffer;
-
- GenericMonospaceFontFamily->lastResult =
- DllExports::GdipGetGenericFontFamilyMonospace(
- &(GenericMonospaceFontFamily->nativeFamily)
- );
-
-#ifndef DCR_USE_NEW_135429
- if ((INT) GenericMonospaceFontFamily->lastResult >= 10)
- GenericMonospaceFontFamily->lastResult = NotFound;
-#endif
-
- return GenericMonospaceFontFamily;
-}
-
-inline FontFamily::~FontFamily()
-{
- DllExports::GdipDeleteFontFamily (nativeFamily);
-}
-
-inline FontFamily *
-FontFamily::Clone() const
-{
- GpFontFamily * clonedFamily = NULL;
-
- SetStatus(DllExports::GdipCloneFontFamily (nativeFamily, &clonedFamily));
-
- return new FontFamily(clonedFamily, lastResult);
-}
-
-inline Status
-FontFamily::GetFamilyName(
- IN WCHAR name[LF_FACESIZE],
- IN LANGID language
-) const
-{
- return SetStatus(DllExports::GdipGetFamilyName(nativeFamily,
- name,
- language));
-}
-
-inline BOOL
-FontFamily::IsStyleAvailable(IN INT style) const
-{
- BOOL StyleAvailable;
- Status status;
-
- status = SetStatus(DllExports::GdipIsStyleAvailable(nativeFamily, style, &StyleAvailable));
-
- if (status != Ok)
- StyleAvailable = FALSE;
-
- return StyleAvailable;
-}
-
-
-inline UINT16
-FontFamily::GetEmHeight(IN INT style) const
-{
- UINT16 EmHeight;
-
- SetStatus(DllExports::GdipGetEmHeight(nativeFamily, style, &EmHeight));
-
- return EmHeight;
-}
-
-inline UINT16
-FontFamily::GetCellAscent(IN INT style) const
-{
- UINT16 CellAscent;
-
- SetStatus(DllExports::GdipGetCellAscent(nativeFamily, style, &CellAscent));
-
- return CellAscent;
-}
-
-inline UINT16
-FontFamily::GetCellDescent(IN INT style) const
-{
- UINT16 CellDescent;
-
- SetStatus(DllExports::GdipGetCellDescent(nativeFamily, style, &CellDescent));
-
- return CellDescent;
-}
-
-
-inline UINT16
-FontFamily::GetLineSpacing(IN INT style) const
-{
- UINT16 LineSpacing;
-
- SetStatus(DllExports::GdipGetLineSpacing(nativeFamily, style, &LineSpacing));
-
- return LineSpacing;
-
-}
-
-#ifdef TEXTV2
-
-// The following APIs return data from the font OS/2 table
-
-inline INT16
-FontFamily::GetTypographicAscent(IN INT style) const
-{
- INT16 TypographicAscent;
-
- SetStatus(DllExports::GdipGetTypographicAscent(nativeFamily, style, &TypographicAscent));
-
- return TypographicAscent;
-}
-
-inline INT16
-FontFamily::GetTypographicDescent(IN INT style) const
-{
- INT16 TypographicDescent;
-
- SetStatus(DllExports::GdipGetTypographicDescent(nativeFamily, style, &TypographicDescent));
-
- return TypographicDescent;
-}
-
-inline INT16
-FontFamily::GetTypographicLineGap(IN INT style) const
-{
- INT16 TypographicLineGap;
-
- SetStatus(DllExports::GdipGetTypographicLineGap(nativeFamily, style, &TypographicLineGap));
-
- return TypographicLineGap;
-}
-
-#endif
-
-///////////////////////////////////////////////////////////
-
-// GetLastStatus - return last error code and clear error code
-
-inline Status
-FontFamily::GetLastStatus() const
-{
- Status lastStatus = lastResult;
- lastResult = Ok;
-
- return lastStatus;
-}
-
-// protected method
-inline Status
-FontFamily::SetStatus(Status status) const
-{
- if (status != Ok)
- return (lastResult = status);
- else
- return status;
-}
-
-#endif
+/**************************************************************************\
+*
+* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
+*
+* Module Name:
+*
+* GdiplusFontFamily.h
+*
+* Abstract:
+*
+* Font family API related declarations
+*
+\**************************************************************************/
+
+#ifndef _GDIPLUS_FONT_FAMILY_H
+#define _GDIPLUS_FONT_FAMILY_H
+
+inline
+FontFamily::FontFamily() :
+ nativeFamily (NULL),
+ lastResult (Ok)
+{
+}
+
+inline
+FontFamily::FontFamily(
+ IN const WCHAR* name,
+ IN const FontCollection* fontCollection
+)
+{
+ nativeFamily = NULL;
+ lastResult = DllExports::GdipCreateFontFamilyFromName(
+ name,
+ fontCollection ? fontCollection->nativeFontCollection : NULL,
+ &nativeFamily
+ );
+
+#ifndef DCR_USE_NEW_135429
+ if ((INT) lastResult >= 10)
+ lastResult = NotFound;
+#endif
+}
+
+// private method
+inline
+FontFamily::FontFamily(
+ IN GpFontFamily *nativeOrig,
+ IN Status status
+)
+{
+ lastResult = status;
+ nativeFamily = nativeOrig;
+}
+
+// Generic font family access
+
+inline const FontFamily *
+FontFamily::GenericSansSerif()
+{
+ if (GenericSansSerifFontFamily != NULL)
+ {
+ return GenericSansSerifFontFamily;
+ }
+
+ GenericSansSerifFontFamily =
+ (FontFamily*) GenericSansSerifFontFamilyBuffer;
+
+ GenericSansSerifFontFamily->lastResult =
+ DllExports::GdipGetGenericFontFamilySansSerif(
+ &(GenericSansSerifFontFamily->nativeFamily)
+ );
+
+#ifndef DCR_USE_NEW_135429
+ if ((INT) GenericSansSerifFontFamily->lastResult >= 10)
+ GenericSansSerifFontFamily->lastResult = NotFound;
+#endif
+
+ return GenericSansSerifFontFamily;
+}
+
+inline const FontFamily *
+FontFamily::GenericSerif()
+{
+ if (GenericSerifFontFamily != NULL)
+ {
+ return GenericSerifFontFamily;
+ }
+
+ GenericSerifFontFamily =
+ (FontFamily*) GenericSerifFontFamilyBuffer;
+
+ GenericSerifFontFamily->lastResult =
+ DllExports::GdipGetGenericFontFamilySerif(
+ &(GenericSerifFontFamily->nativeFamily)
+ );
+
+#ifndef DCR_USE_NEW_135429
+ if ((INT) GenericSerifFontFamily->lastResult >= 10)
+ GenericSerifFontFamily->lastResult = NotFound;
+#endif
+
+ return GenericSerifFontFamily;
+}
+
+inline const FontFamily *
+FontFamily::GenericMonospace()
+{
+ if (GenericMonospaceFontFamily != NULL)
+ {
+ return GenericMonospaceFontFamily;
+ }
+
+ GenericMonospaceFontFamily =
+ (FontFamily*) GenericMonospaceFontFamilyBuffer;
+
+ GenericMonospaceFontFamily->lastResult =
+ DllExports::GdipGetGenericFontFamilyMonospace(
+ &(GenericMonospaceFontFamily->nativeFamily)
+ );
+
+#ifndef DCR_USE_NEW_135429
+ if ((INT) GenericMonospaceFontFamily->lastResult >= 10)
+ GenericMonospaceFontFamily->lastResult = NotFound;
+#endif
+
+ return GenericMonospaceFontFamily;
+}
+
+inline FontFamily::~FontFamily()
+{
+ DllExports::GdipDeleteFontFamily (nativeFamily);
+}
+
+inline FontFamily *
+FontFamily::Clone() const
+{
+ GpFontFamily * clonedFamily = NULL;
+
+ SetStatus(DllExports::GdipCloneFontFamily (nativeFamily, &clonedFamily));
+
+ return new FontFamily(clonedFamily, lastResult);
+}
+
+inline Status
+FontFamily::GetFamilyName(
+ IN WCHAR name[LF_FACESIZE],
+ IN LANGID language
+) const
+{
+ return SetStatus(DllExports::GdipGetFamilyName(nativeFamily,
+ name,
+ language));
+}
+
+inline BOOL
+FontFamily::IsStyleAvailable(IN INT style) const
+{
+ BOOL StyleAvailable;
+ Status status;
+
+ status = SetStatus(DllExports::GdipIsStyleAvailable(nativeFamily, style, &StyleAvailable));
+
+ if (status != Ok)
+ StyleAvailable = FALSE;
+
+ return StyleAvailable;
+}
+
+
+inline UINT16
+FontFamily::GetEmHeight(IN INT style) const
+{
+ UINT16 EmHeight;
+
+ SetStatus(DllExports::GdipGetEmHeight(nativeFamily, style, &EmHeight));
+
+ return EmHeight;
+}
+
+inline UINT16
+FontFamily::GetCellAscent(IN INT style) const
+{
+ UINT16 CellAscent;
+
+ SetStatus(DllExports::GdipGetCellAscent(nativeFamily, style, &CellAscent));
+
+ return CellAscent;
+}
+
+inline UINT16
+FontFamily::GetCellDescent(IN INT style) const
+{
+ UINT16 CellDescent;
+
+ SetStatus(DllExports::GdipGetCellDescent(nativeFamily, style, &CellDescent));
+
+ return CellDescent;
+}
+
+
+inline UINT16
+FontFamily::GetLineSpacing(IN INT style) const
+{
+ UINT16 LineSpacing;
+
+ SetStatus(DllExports::GdipGetLineSpacing(nativeFamily, style, &LineSpacing));
+
+ return LineSpacing;
+
+}
+
+#ifdef TEXTV2
+
+// The following APIs return data from the font OS/2 table
+
+inline INT16
+FontFamily::GetTypographicAscent(IN INT style) const
+{
+ INT16 TypographicAscent;
+
+ SetStatus(DllExports::GdipGetTypographicAscent(nativeFamily, style, &TypographicAscent));
+
+ return TypographicAscent;
+}
+
+inline INT16
+FontFamily::GetTypographicDescent(IN INT style) const
+{
+ INT16 TypographicDescent;
+
+ SetStatus(DllExports::GdipGetTypographicDescent(nativeFamily, style, &TypographicDescent));
+
+ return TypographicDescent;
+}
+
+inline INT16
+FontFamily::GetTypographicLineGap(IN INT style) const
+{
+ INT16 TypographicLineGap;
+
+ SetStatus(DllExports::GdipGetTypographicLineGap(nativeFamily, style, &TypographicLineGap));
+
+ return TypographicLineGap;
+}
+
+#endif
+
+///////////////////////////////////////////////////////////
+
+// GetLastStatus - return last error code and clear error code
+
+inline Status
+FontFamily::GetLastStatus() const
+{
+ Status lastStatus = lastResult;
+ lastResult = Ok;
+
+ return lastStatus;
+}
+
+// protected method
+inline Status
+FontFamily::SetStatus(Status status) const
+{
+ if (status != Ok)
+ return (lastResult = status);
+ else
+ return status;
+}
+
+#endif
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusGpStubs.h b/core/src/fxge/Microsoft SDK/include/GdiPlusGpStubs.h
index 121288de57..4f6066ccef 100644
--- a/core/src/fxge/Microsoft SDK/include/GdiPlusGpStubs.h
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusGpStubs.h
@@ -1,107 +1,107 @@
-/**************************************************************************\
-*
-* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
-*
-* Module Name:
-*
-* GdiplusGpStubs.h
-*
-* Abstract:
-*
-* GDI+ Native C++ public header file
-*
-\**************************************************************************/
-
-#ifndef _GDIPLUSGPSTUBS_H
-#define _GDIPLUSGPSTUBS_H
-
-//---------------------------------------------------------------------------
-// GDI+ classes for forward reference
-//---------------------------------------------------------------------------
-
-class Graphics;
-class Pen;
-class Brush;
-class Matrix;
-class Bitmap;
-class Metafile;
-class GraphicsPath;
-class PathIterator;
-class Region;
-class Image;
-class TextureBrush;
-class HatchBrush;
-class SolidBrush;
-class LinearGradientBrush;
-class PathGradientBrush;
-class Font;
-class FontFamily;
-class FontCollection;
-class InstalledFontCollection;
-class PrivateFontCollection;
-class ImageAttributes;
-class CachedBitmap;
-
-//---------------------------------------------------------------------------
-// Internal GDI+ classes for internal type checking
-//---------------------------------------------------------------------------
-class GpGraphics {};
-
-class GpBrush {};
-class GpTexture : public GpBrush {};
-class GpSolidFill : public GpBrush {};
-class GpLineGradient : public GpBrush {};
-class GpPathGradient : public GpBrush {};
-class GpHatch : public GpBrush {};
-
-class GpPen {};
-class GpCustomLineCap {};
-class GpAdjustableArrowCap : public GpCustomLineCap {};
-
-class GpImage {};
-class GpBitmap : public GpImage {};
-class GpMetafile : public GpImage {};
-class GpImageAttributes {};
-
-class GpPath {};
-class GpRegion {};
-class GpPathIterator {};
-
-class GpFontFamily {};
-class GpFont {};
-class GpStringFormat {};
-class GpFontCollection {};
-class GpInstalledFontCollection : public GpFontCollection {};
-class GpPrivateFontCollection : public GpFontCollection {};
-
-class GpCachedBitmap;
-
-typedef Status GpStatus;
-typedef FillMode GpFillMode;
-typedef WrapMode GpWrapMode;
-typedef Unit GpUnit;
-typedef CoordinateSpace GpCoordinateSpace;
-typedef PointF GpPointF;
-typedef Point GpPoint;
-typedef RectF GpRectF;
-typedef Rect GpRect;
-typedef SizeF GpSizeF;
-typedef HatchStyle GpHatchStyle;
-typedef DashStyle GpDashStyle;
-typedef LineCap GpLineCap;
-typedef DashCap GpDashCap;
-
-
-typedef PenAlignment GpPenAlignment;
-
-typedef LineJoin GpLineJoin;
-typedef PenType GpPenType;
-
-typedef Matrix GpMatrix;
-typedef BrushType GpBrushType;
-typedef MatrixOrder GpMatrixOrder;
-typedef FlushIntention GpFlushIntention;
-typedef PathData GpPathData;
-
-#endif // !_GDIPLUSGPSTUBS.HPP
-
+/**************************************************************************\
+*
+* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
+*
+* Module Name:
+*
+* GdiplusGpStubs.h
+*
+* Abstract:
+*
+* GDI+ Native C++ public header file
+*
+\**************************************************************************/
+
+#ifndef _GDIPLUSGPSTUBS_H
+#define _GDIPLUSGPSTUBS_H
+
+//---------------------------------------------------------------------------
+// GDI+ classes for forward reference
+//---------------------------------------------------------------------------
+
+class Graphics;
+class Pen;
+class Brush;
+class Matrix;
+class Bitmap;
+class Metafile;
+class GraphicsPath;
+class PathIterator;
+class Region;
+class Image;
+class TextureBrush;
+class HatchBrush;
+class SolidBrush;
+class LinearGradientBrush;
+class PathGradientBrush;
+class Font;
+class FontFamily;
+class FontCollection;
+class InstalledFontCollection;
+class PrivateFontCollection;
+class ImageAttributes;
+class CachedBitmap;
+
+//---------------------------------------------------------------------------
+// Internal GDI+ classes for internal type checking
+//---------------------------------------------------------------------------
+class GpGraphics {};
+
+class GpBrush {};
+class GpTexture : public GpBrush {};
+class GpSolidFill : public GpBrush {};
+class GpLineGradient : public GpBrush {};
+class GpPathGradient : public GpBrush {};
+class GpHatch : public GpBrush {};
+
+class GpPen {};
+class GpCustomLineCap {};
+class GpAdjustableArrowCap : public GpCustomLineCap {};
+
+class GpImage {};
+class GpBitmap : public GpImage {};
+class GpMetafile : public GpImage {};
+class GpImageAttributes {};
+
+class GpPath {};
+class GpRegion {};
+class GpPathIterator {};
+
+class GpFontFamily {};
+class GpFont {};
+class GpStringFormat {};
+class GpFontCollection {};
+class GpInstalledFontCollection : public GpFontCollection {};
+class GpPrivateFontCollection : public GpFontCollection {};
+
+class GpCachedBitmap;
+
+typedef Status GpStatus;
+typedef FillMode GpFillMode;
+typedef WrapMode GpWrapMode;
+typedef Unit GpUnit;
+typedef CoordinateSpace GpCoordinateSpace;
+typedef PointF GpPointF;
+typedef Point GpPoint;
+typedef RectF GpRectF;
+typedef Rect GpRect;
+typedef SizeF GpSizeF;
+typedef HatchStyle GpHatchStyle;
+typedef DashStyle GpDashStyle;
+typedef LineCap GpLineCap;
+typedef DashCap GpDashCap;
+
+
+typedef PenAlignment GpPenAlignment;
+
+typedef LineJoin GpLineJoin;
+typedef PenType GpPenType;
+
+typedef Matrix GpMatrix;
+typedef BrushType GpBrushType;
+typedef MatrixOrder GpMatrixOrder;
+typedef FlushIntention GpFlushIntention;
+typedef PathData GpPathData;
+
+#endif // !_GDIPLUSGPSTUBS.HPP
+
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusGraphics.h b/core/src/fxge/Microsoft SDK/include/GdiPlusGraphics.h
index 7b39a6ea71..4e4e3dae12 100644
--- a/core/src/fxge/Microsoft SDK/include/GdiPlusGraphics.h
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusGraphics.h
@@ -1,2726 +1,2726 @@
-/**************************************************************************\
-*
-* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
-*
-* Module Name:
-*
-* GdiplusGraphics.h
-*
-* Abstract:
-*
-* Declarations for Graphics class
-*
-\**************************************************************************/
-
-#ifndef _GDIPLUSGRAPHICS_H
-#define _GDIPLUSGRAPHICS_H
-
-/**
- * Represent a graphics context
- */
-class Graphics : public GdiplusBase
-{
-public:
- friend class Region;
- friend class GraphicsPath;
- friend class Image;
- friend class Bitmap;
- friend class Metafile;
- friend class Font;
- friend class FontFamily;
- friend class FontCollection;
- friend class CachedBitmap;
-
- // Get a graphics context from an existing Win32 HDC or HWND
- static Graphics* FromHDC(IN HDC hdc)
- {
- return new Graphics(hdc);
- }
-
- static Graphics* FromHDC(IN HDC hdc,
- IN HANDLE hdevice)
- {
- return new Graphics(hdc, hdevice);
- }
-
- static Graphics* FromHWND(IN HWND hwnd,
- IN BOOL icm = FALSE)
- {
- return new Graphics(hwnd, icm);
- }
-
- static Graphics* FromImage(IN Image *image)
- {
- return new Graphics(image);
- }
-
- Graphics(IN HDC hdc)
- {
- GpGraphics *graphics = NULL;
-
- lastResult = DllExports::GdipCreateFromHDC(hdc, &graphics);
-
- SetNativeGraphics(graphics);
- }
-
- Graphics(IN HDC hdc,
- IN HANDLE hdevice)
- {
- GpGraphics *graphics = NULL;
-
- lastResult = DllExports::GdipCreateFromHDC2(hdc, hdevice, &graphics);
-
- SetNativeGraphics(graphics);
- }
-
- Graphics(IN HWND hwnd,
- IN BOOL icm = FALSE)
- {
- GpGraphics *graphics = NULL;
-
- if (icm)
- {
- lastResult = DllExports::GdipCreateFromHWNDICM(hwnd, &graphics);
- }
- else
- {
- lastResult = DllExports::GdipCreateFromHWND(hwnd, &graphics);
- }
-
- SetNativeGraphics(graphics);
- }
-
- Graphics(IN Image* image)
- {
- GpGraphics *graphics = NULL;
-
- if (image != NULL)
- {
- lastResult = DllExports::GdipGetImageGraphicsContext(
- image->nativeImage, &graphics);
- }
- SetNativeGraphics(graphics);
- }
-
- ~Graphics()
- {
- DllExports::GdipDeleteGraphics(nativeGraphics);
- }
-
- VOID Flush(IN FlushIntention intention = FlushIntentionFlush)
- {
- DllExports::GdipFlush(nativeGraphics, intention);
- }
-
- //------------------------------------------------------------------------
- // Interop methods
- //------------------------------------------------------------------------
-
- // Locks the graphics until ReleaseDC is called
- HDC GetHDC()
- {
- HDC hdc = NULL;
-
- SetStatus(DllExports::GdipGetDC(nativeGraphics, &hdc));
-
- return hdc;
- }
-
- VOID ReleaseHDC(IN HDC hdc)
- {
- SetStatus(DllExports::GdipReleaseDC(nativeGraphics, hdc));
- }
-
- //------------------------------------------------------------------------
- // Rendering modes
- //------------------------------------------------------------------------
-
- Status SetRenderingOrigin(IN INT x, IN INT y)
- {
- return SetStatus(
- DllExports::GdipSetRenderingOrigin(
- nativeGraphics, x, y
- )
- );
- }
-
- Status GetRenderingOrigin(OUT INT *x, OUT INT *y) const
- {
- return SetStatus(
- DllExports::GdipGetRenderingOrigin(
- nativeGraphics, x, y
- )
- );
- }
-
- Status SetCompositingMode(IN CompositingMode compositingMode)
- {
- return SetStatus(DllExports::GdipSetCompositingMode(nativeGraphics,
- compositingMode));
- }
-
- CompositingMode GetCompositingMode() const
- {
- CompositingMode mode;
-
- SetStatus(DllExports::GdipGetCompositingMode(nativeGraphics,
- &mode));
-
- return mode;
- }
-
- Status SetCompositingQuality(IN CompositingQuality compositingQuality)
- {
- return SetStatus(DllExports::GdipSetCompositingQuality(
- nativeGraphics,
- compositingQuality));
- }
-
- CompositingQuality GetCompositingQuality() const
- {
- CompositingQuality quality;
-
- SetStatus(DllExports::GdipGetCompositingQuality(
- nativeGraphics,
- &quality));
-
- return quality;
- }
-
- Status SetTextRenderingHint(IN TextRenderingHint newMode)
- {
-#ifndef DCR_USE_NEW_186764
- /* temporarly set the high bit to warn that we are using the new definition for the flag */
- newMode = (TextRenderingHint) (newMode | 0x0f000);
-#endif // DCR_USE_NEW_186764
- return SetStatus(DllExports::GdipSetTextRenderingHint(nativeGraphics,
- newMode));
- }
-
- TextRenderingHint GetTextRenderingHint() const
- {
- TextRenderingHint hint;
-
- SetStatus(DllExports::GdipGetTextRenderingHint(nativeGraphics,
- &hint));
-
- return hint;
- }
-
-#ifdef DCR_USE_NEW_188922
- Status SetTextContrast(IN UINT contrast)
- {
- return SetStatus(DllExports::GdipSetTextContrast(nativeGraphics,
- contrast));
- }
-
- UINT GetTextContrast() const
- {
- UINT contrast;
-
- SetStatus(DllExports::GdipGetTextContrast(nativeGraphics,
- &contrast));
-
- return contrast;
- }
-#else
- Status SetTextGammaValue(IN UINT gammaValue)
- {
- return SetStatus(DllExports::GdipSetTextGammaValue(nativeGraphics,
- gammaValue));
- }
-
- UINT GetTextGammaValue() const
- {
- UINT gammaValue;
-
- SetStatus(DllExports::GdipGetTextGammaValue(nativeGraphics,
- &gammaValue));
-
- return gammaValue;
- }
-
-#endif // DCR_USE_NEW_188922
-
-
- InterpolationMode GetInterpolationMode() const
- {
- InterpolationMode mode = InterpolationModeInvalid;
-
- SetStatus(DllExports::GdipGetInterpolationMode(nativeGraphics,
- &mode));
-
- return mode;
- }
-
- Status SetInterpolationMode(IN InterpolationMode interpolationMode)
- {
- return SetStatus(DllExports::GdipSetInterpolationMode(nativeGraphics,
- interpolationMode));
- }
-
- SmoothingMode GetSmoothingMode() const
- {
- SmoothingMode smoothingMode = SmoothingModeInvalid;
-
- SetStatus(DllExports::GdipGetSmoothingMode(nativeGraphics,
- &smoothingMode));
-
- return smoothingMode;
- }
-
- Status SetSmoothingMode(IN SmoothingMode smoothingMode)
- {
- return SetStatus(DllExports::GdipSetSmoothingMode(nativeGraphics,
- smoothingMode));
- }
-
- PixelOffsetMode GetPixelOffsetMode() const
- {
- PixelOffsetMode pixelOffsetMode = PixelOffsetModeInvalid;
-
- SetStatus(DllExports::GdipGetPixelOffsetMode(nativeGraphics,
- &pixelOffsetMode));
-
- return pixelOffsetMode;
- }
-
- Status SetPixelOffsetMode(IN PixelOffsetMode pixelOffsetMode)
- {
- return SetStatus(DllExports::GdipSetPixelOffsetMode(nativeGraphics,
- pixelOffsetMode));
- }
-
- //------------------------------------------------------------------------
- // Manipulate the current world transform
- //------------------------------------------------------------------------
-
- Status SetTransform(IN const Matrix* matrix)
- {
- return SetStatus(DllExports::GdipSetWorldTransform(nativeGraphics,
- matrix->nativeMatrix));
- }
- Status ResetTransform()
- {
- return SetStatus(DllExports::GdipResetWorldTransform(nativeGraphics));
- }
-
- Status MultiplyTransform(IN const Matrix* matrix,
- IN MatrixOrder order = MatrixOrderPrepend)
- {
- return SetStatus(DllExports::GdipMultiplyWorldTransform(nativeGraphics,
- matrix->nativeMatrix,
- order));
- }
-
- Status TranslateTransform(IN REAL dx,
- IN REAL dy,
- IN MatrixOrder order = MatrixOrderPrepend)
- {
- return SetStatus(DllExports::GdipTranslateWorldTransform(nativeGraphics,
- dx, dy, order));
- }
-
- Status ScaleTransform(IN REAL sx,
- IN REAL sy,
- IN MatrixOrder order = MatrixOrderPrepend)
- {
- return SetStatus(DllExports::GdipScaleWorldTransform(nativeGraphics,
- sx, sy, order));
- }
-
- Status RotateTransform(IN REAL angle,
- IN MatrixOrder order = MatrixOrderPrepend)
- {
- return SetStatus(DllExports::GdipRotateWorldTransform(nativeGraphics,
- angle, order));
- }
-
- /**
- * Return the current world transform
- */
-
- Status GetTransform(OUT Matrix* matrix) const
- {
- return SetStatus(DllExports::GdipGetWorldTransform(nativeGraphics,
- matrix->nativeMatrix));
- }
-
- /**
- * Manipulate the current page transform
- */
-
- Status SetPageUnit(IN Unit unit)
- {
- return SetStatus(DllExports::GdipSetPageUnit(nativeGraphics,
- unit));
- }
-
- Status SetPageScale(IN REAL scale)
- {
- return SetStatus(DllExports::GdipSetPageScale(nativeGraphics,
- scale));
- }
-
- /**
- * Retrieve the current page transform information
- * notes @ these are atomic
- */
- Unit GetPageUnit() const
- {
- Unit unit;
-
- SetStatus(DllExports::GdipGetPageUnit(nativeGraphics, &unit));
-
- return unit;
- }
-
- REAL GetPageScale() const
- {
- REAL scale;
-
- SetStatus(DllExports::GdipGetPageScale(nativeGraphics, &scale));
-
- return scale;
- }
-
- REAL GetDpiX() const
- {
- REAL dpi;
-
- SetStatus(DllExports::GdipGetDpiX(nativeGraphics, &dpi));
-
- return dpi;
- }
-
- REAL GetDpiY() const
- {
- REAL dpi;
-
- SetStatus(DllExports::GdipGetDpiY(nativeGraphics, &dpi));
-
- return dpi;
- }
-
- /**
- * Transform points in the current graphics context
- */
- // float version
- Status TransformPoints(IN CoordinateSpace destSpace,
- IN CoordinateSpace srcSpace,
- IN OUT PointF* pts,
- IN INT count) const
- {
- return SetStatus(DllExports::GdipTransformPoints(nativeGraphics,
- destSpace,
- srcSpace,
- pts,
- count));
- }
-
- // integer version
- Status TransformPoints(IN CoordinateSpace destSpace,
- IN CoordinateSpace srcSpace,
- IN OUT Point* pts,
- IN INT count) const
- {
-
- return SetStatus(DllExports::GdipTransformPointsI(nativeGraphics,
- destSpace,
- srcSpace,
- pts,
- count));
- }
-
- //------------------------------------------------------------------------
- // GetNearestColor (for <= 8bpp surfaces)
- // Note: alpha is ignored
- //------------------------------------------------------------------------
- Status GetNearestColor(IN OUT Color* color) const
- {
- if (color == NULL)
- {
- return SetStatus(InvalidParameter);
- }
-
- ARGB argb = color->GetValue();
-
- Status status = SetStatus(DllExports::GdipGetNearestColor(nativeGraphics, &argb));
-
- color->SetValue(argb);
-
- return status;
- }
-
- /**
- * Vector drawing methods
- *
- * @notes Do we need a set of methods that take
- * integer coordinate parameters?
- */
-
- // float version
- Status DrawLine(IN const Pen* pen,
- IN REAL x1,
- IN REAL y1,
- IN REAL x2,
- IN REAL y2)
- {
- return SetStatus(DllExports::GdipDrawLine(nativeGraphics,
- pen->nativePen, x1, y1, x2,
- y2));
- }
-
- Status DrawLine(IN const Pen* pen,
- IN const PointF& pt1,
- IN const PointF& pt2)
- {
- return DrawLine(pen, pt1.X, pt1.Y, pt2.X, pt2.Y);
- }
-
- Status DrawLines(IN const Pen* pen,
- IN const PointF* points,
- IN INT count)
- {
- return SetStatus(DllExports::GdipDrawLines(nativeGraphics,
- pen->nativePen,
- points, count));
- }
-
- // int version
- Status DrawLine(IN const Pen* pen,
- IN INT x1,
- IN INT y1,
- IN INT x2,
- IN INT y2)
- {
- return SetStatus(DllExports::GdipDrawLineI(nativeGraphics,
- pen->nativePen,
- x1,
- y1,
- x2,
- y2));
- }
-
- Status DrawLine(IN const Pen* pen,
- IN const Point& pt1,
- IN const Point& pt2)
- {
- return DrawLine(pen,
- pt1.X,
- pt1.Y,
- pt2.X,
- pt2.Y);
- }
-
- Status DrawLines(IN const Pen* pen,
- IN const Point* points,
- IN INT count)
- {
- return SetStatus(DllExports::GdipDrawLinesI(nativeGraphics,
- pen->nativePen,
- points,
- count));
- }
-
- // float version
- Status DrawArc(IN const Pen* pen,
- IN REAL x,
- IN REAL y,
- IN REAL width,
- IN REAL height,
- IN REAL startAngle,
- IN REAL sweepAngle)
- {
- return SetStatus(DllExports::GdipDrawArc(nativeGraphics,
- pen->nativePen,
- x,
- y,
- width,
- height,
- startAngle,
- sweepAngle));
- }
-
- Status DrawArc(IN const Pen* pen,
- IN const RectF& rect,
- IN REAL startAngle,
- IN REAL sweepAngle)
- {
- return DrawArc(pen, rect.X, rect.Y, rect.Width, rect.Height,
- startAngle, sweepAngle);
- }
-
- // int version
- Status DrawArc(IN const Pen* pen,
- IN INT x,
- IN INT y,
- IN INT width,
- IN INT height,
- IN REAL startAngle,
- IN REAL sweepAngle)
- {
- return SetStatus(DllExports::GdipDrawArcI(nativeGraphics,
- pen->nativePen,
- x,
- y,
- width,
- height,
- startAngle,
- sweepAngle));
- }
-
-
- Status DrawArc(IN const Pen* pen,
- IN const Rect& rect,
- IN REAL startAngle,
- IN REAL sweepAngle)
- {
- return DrawArc(pen,
- rect.X,
- rect.Y,
- rect.Width,
- rect.Height,
- startAngle,
- sweepAngle);
- }
-
- // float version
- Status DrawBezier(IN const Pen* pen,
- IN REAL x1,
- IN REAL y1,
- IN REAL x2,
- IN REAL y2,
- IN REAL x3,
- IN REAL y3,
- IN REAL x4,
- IN REAL y4)
- {
- return SetStatus(DllExports::GdipDrawBezier(nativeGraphics,
- pen->nativePen, x1, y1,
- x2, y2, x3, y3, x4, y4));
- }
-
- Status DrawBezier(IN const Pen* pen,
- IN const PointF& pt1,
- IN const PointF& pt2,
- IN const PointF& pt3,
- IN const PointF& pt4)
- {
- return DrawBezier(pen,
- pt1.X,
- pt1.Y,
- pt2.X,
- pt2.Y,
- pt3.X,
- pt3.Y,
- pt4.X,
- pt4.Y);
- }
-
- Status DrawBeziers(IN const Pen* pen,
- IN const PointF* points,
- IN INT count)
- {
- return SetStatus(DllExports::GdipDrawBeziers(nativeGraphics,
- pen->nativePen,
- points,
- count));
- }
-
- // int version
- Status DrawBezier(IN const Pen* pen,
- IN INT x1,
- IN INT y1,
- IN INT x2,
- IN INT y2,
- IN INT x3,
- IN INT y3,
- IN INT x4,
- IN INT y4)
- {
- return SetStatus(DllExports::GdipDrawBezierI(nativeGraphics,
- pen->nativePen,
- x1,
- y1,
- x2,
- y2,
- x3,
- y3,
- x4,
- y4));
- }
-
- Status DrawBezier(IN const Pen* pen,
- IN const Point& pt1,
- IN const Point& pt2,
- IN const Point& pt3,
- IN const Point& pt4)
- {
- return DrawBezier(pen,
- pt1.X,
- pt1.Y,
- pt2.X,
- pt2.Y,
- pt3.X,
- pt3.Y,
- pt4.X,
- pt4.Y);
- }
-
- Status DrawBeziers(IN const Pen* pen,
- IN const Point* points,
- IN INT count)
- {
- return SetStatus(DllExports::GdipDrawBeziersI(nativeGraphics,
- pen->nativePen,
- points,
- count));
- }
-
- // float version
- Status DrawRectangle(IN const Pen* pen,
- IN const RectF& rect)
- {
- return DrawRectangle(pen, rect.X, rect.Y, rect.Width, rect.Height);
- }
-
- Status DrawRectangle(IN const Pen* pen,
- IN REAL x,
- IN REAL y,
- IN REAL width,
- IN REAL height)
- {
- return SetStatus(DllExports::GdipDrawRectangle(nativeGraphics,
- pen->nativePen, x, y,
- width, height));
- }
-
- Status DrawRectangles(IN const Pen* pen,
- IN const RectF* rects,
- IN INT count)
- {
- return SetStatus(DllExports::GdipDrawRectangles(nativeGraphics,
- pen->nativePen,
- rects, count));
- }
-
- // integer version
- Status DrawRectangle(IN const Pen* pen,
- IN const Rect& rect)
- {
- return DrawRectangle(pen,
- rect.X,
- rect.Y,
- rect.Width,
- rect.Height);
- }
-
- Status DrawRectangle(IN const Pen* pen,
- IN INT x,
- IN INT y,
- IN INT width,
- IN INT height)
- {
- return SetStatus(DllExports::GdipDrawRectangleI(nativeGraphics,
- pen->nativePen,
- x,
- y,
- width,
- height));
- }
-
- Status DrawRectangles(IN const Pen* pen,
- IN const Rect* rects,
- IN INT count)
- {
- return SetStatus(DllExports::GdipDrawRectanglesI(nativeGraphics,
- pen->nativePen,
- rects,
- count));
- }
-
- // float version
- Status DrawEllipse(IN const Pen* pen,
- IN const RectF& rect)
- {
- return DrawEllipse(pen, rect.X, rect.Y, rect.Width, rect.Height);
- }
-
- Status DrawEllipse(IN const Pen* pen,
- IN REAL x,
- IN REAL y,
- IN REAL width,
- IN REAL height)
- {
- return SetStatus(DllExports::GdipDrawEllipse(nativeGraphics,
- pen->nativePen,
- x,
- y,
- width,
- height));
- }
-
- // integer version
- Status DrawEllipse(IN const Pen* pen,
- IN const Rect& rect)
- {
- return DrawEllipse(pen,
- rect.X,
- rect.Y,
- rect.Width,
- rect.Height);
- }
-
- Status DrawEllipse(IN const Pen* pen,
- IN INT x,
- IN INT y,
- IN INT width,
- IN INT height)
- {
- return SetStatus(DllExports::GdipDrawEllipseI(nativeGraphics,
- pen->nativePen,
- x,
- y,
- width,
- height));
- }
-
- // floating point version
- Status DrawPie(IN const Pen* pen,
- IN const RectF& rect,
- IN REAL startAngle,
- IN REAL sweepAngle)
- {
- return DrawPie(pen,
- rect.X,
- rect.Y,
- rect.Width,
- rect.Height,
- startAngle,
- sweepAngle);
- }
-
- Status DrawPie(IN const Pen* pen,
- IN REAL x,
- IN REAL y,
- IN REAL width,
- IN REAL height,
- IN REAL startAngle,
- IN REAL sweepAngle)
- {
- return SetStatus(DllExports::GdipDrawPie(nativeGraphics,
- pen->nativePen,
- x,
- y,
- width,
- height,
- startAngle,
- sweepAngle));
- }
-
- // integer point version
- Status DrawPie(IN const Pen* pen,
- IN const Rect& rect,
- IN REAL startAngle,
- IN REAL sweepAngle)
- {
- return DrawPie(pen,
- rect.X,
- rect.Y,
- rect.Width,
- rect.Height,
- startAngle,
- sweepAngle);
- }
-
- Status DrawPie(IN const Pen* pen,
- IN INT x,
- IN INT y,
- IN INT width,
- IN INT height,
- IN REAL startAngle,
- IN REAL sweepAngle)
- {
- return SetStatus(DllExports::GdipDrawPieI(nativeGraphics,
- pen->nativePen,
- x,
- y,
- width,
- height,
- startAngle,
- sweepAngle));
- }
-
- // float version
- Status DrawPolygon(IN const Pen* pen,
- IN const PointF* points,
- IN INT count)
- {
- return SetStatus(DllExports::GdipDrawPolygon(nativeGraphics,
- pen->nativePen,
- points,
- count));
- }
-
- // integer version
- Status DrawPolygon(IN const Pen* pen,
- IN const Point* points,
- IN INT count)
- {
- return SetStatus(DllExports::GdipDrawPolygonI(nativeGraphics,
- pen->nativePen,
- points,
- count));
- }
-
- // float version
- Status DrawPath(IN const Pen* pen,
- IN const GraphicsPath* path)
- {
- return SetStatus(DllExports::GdipDrawPath(nativeGraphics,
- pen ? pen->nativePen : NULL,
- path ? path->nativePath : NULL));
- }
-
- // float version
- Status DrawCurve(IN const Pen* pen,
- IN const PointF* points,
- IN INT count)
- {
- return SetStatus(DllExports::GdipDrawCurve(nativeGraphics,
- pen->nativePen, points,
- count));
- }
-
- Status DrawCurve(IN const Pen* pen,
- IN const PointF* points,
- IN INT count,
- IN REAL tension)
- {
- return SetStatus(DllExports::GdipDrawCurve2(nativeGraphics,
- pen->nativePen, points,
- count, tension));
- }
-
- Status DrawCurve(IN const Pen* pen,
- IN const PointF* points,
- IN INT count,
- IN INT offset,
- IN INT numberOfSegments,
- IN REAL tension = 0.5f)
- {
- return SetStatus(DllExports::GdipDrawCurve3(nativeGraphics,
- pen->nativePen, points,
- count, offset,
- numberOfSegments, tension));
- }
-
- // integer version
- Status DrawCurve(IN const Pen* pen,
- IN const Point* points,
- IN INT count)
- {
- return SetStatus(DllExports::GdipDrawCurveI(nativeGraphics,
- pen->nativePen,
- points,
- count));
- }
-
- Status DrawCurve(IN const Pen* pen,
- IN const Point* points,
- IN INT count,
- IN REAL tension)
- {
- return SetStatus(DllExports::GdipDrawCurve2I(nativeGraphics,
- pen->nativePen,
- points,
- count,
- tension));
- }
-
- Status DrawCurve(IN const Pen* pen,
- IN const Point* points,
- IN INT count,
- IN INT offset,
- IN INT numberOfSegments,
- IN REAL tension = 0.5f)
- {
- return SetStatus(DllExports::GdipDrawCurve3I(nativeGraphics,
- pen->nativePen,
- points,
- count,
- offset,
- numberOfSegments,
- tension));
- }
-
- // float version
- Status DrawClosedCurve(IN const Pen* pen,
- IN const PointF* points,
- IN INT count)
- {
- return SetStatus(DllExports::GdipDrawClosedCurve(nativeGraphics,
- pen->nativePen,
- points, count));
- }
-
- Status DrawClosedCurve(IN const Pen *pen,
- IN const PointF* points,
- IN INT count,
- IN REAL tension)
- {
- return SetStatus(DllExports::GdipDrawClosedCurve2(nativeGraphics,
- pen->nativePen,
- points, count,
- tension));
- }
-
- // integer version
- Status DrawClosedCurve(IN const Pen* pen,
- IN const Point* points,
- IN INT count)
- {
- return SetStatus(DllExports::GdipDrawClosedCurveI(nativeGraphics,
- pen->nativePen,
- points,
- count));
- }
-
- Status DrawClosedCurve(IN const Pen *pen,
- IN const Point* points,
- IN INT count,
- IN REAL tension)
- {
- return SetStatus(DllExports::GdipDrawClosedCurve2I(nativeGraphics,
- pen->nativePen,
- points,
- count,
- tension));
- }
-
- Status Clear(IN const Color &color)
- {
- return SetStatus(DllExports::GdipGraphicsClear(
- nativeGraphics,
- color.GetValue()));
- }
-
- // float version
- Status FillRectangle(IN const Brush* brush,
- IN const RectF& rect)
- {
- return FillRectangle(brush, rect.X, rect.Y, rect.Width, rect.Height);
- }
-
- Status FillRectangle(IN const Brush* brush,
- IN REAL x,
- IN REAL y,
- IN REAL width,
- IN REAL height)
- {
- return SetStatus(DllExports::GdipFillRectangle(nativeGraphics,
- brush->nativeBrush, x, y,
- width, height));
- }
-
- Status FillRectangles(IN const Brush* brush,
- IN const RectF* rects,
- IN INT count)
- {
- return SetStatus(DllExports::GdipFillRectangles(nativeGraphics,
- brush->nativeBrush,
- rects, count));
- }
-
- // integer version
- Status FillRectangle(IN const Brush* brush,
- IN const Rect& rect)
- {
- return FillRectangle(brush,
- rect.X,
- rect.Y,
- rect.Width,
- rect.Height);
- }
-
- Status FillRectangle(IN const Brush* brush,
- IN INT x,
- IN INT y,
- IN INT width,
- IN INT height)
- {
- return SetStatus(DllExports::GdipFillRectangleI(nativeGraphics,
- brush->nativeBrush,
- x,
- y,
- width,
- height));
- }
-
- Status FillRectangles(IN const Brush* brush,
- IN const Rect* rects,
- IN INT count)
- {
- return SetStatus(DllExports::GdipFillRectanglesI(nativeGraphics,
- brush->nativeBrush,
- rects,
- count));
- }
-
- // float version
- Status FillPolygon(IN const Brush* brush,
- IN const PointF* points,
- IN INT count)
- {
- return FillPolygon(brush, points, count, FillModeAlternate);
- }
-
- Status FillPolygon(IN const Brush* brush,
- IN const PointF* points,
- IN INT count,
- IN FillMode fillMode)
- {
- return SetStatus(DllExports::GdipFillPolygon(nativeGraphics,
- brush->nativeBrush,
- points, count, fillMode));
- }
-
- // integer version
- Status FillPolygon(IN const Brush* brush,
- IN const Point* points,
- IN INT count)
- {
- return FillPolygon(brush, points, count, FillModeAlternate);
- }
-
- Status FillPolygon(IN const Brush* brush,
- IN const Point* points,
- IN INT count,
- IN FillMode fillMode)
- {
- return SetStatus(DllExports::GdipFillPolygonI(nativeGraphics,
- brush->nativeBrush,
- points, count,
- fillMode));
- }
-
- // float version
- Status FillEllipse(IN const Brush* brush,
- IN const RectF& rect)
- {
- return FillEllipse(brush, rect.X, rect.Y, rect.Width, rect.Height);
- }
-
- Status FillEllipse(IN const Brush* brush,
- IN REAL x,
- IN REAL y,
- IN REAL width,
- IN REAL height)
- {
- return SetStatus(DllExports::GdipFillEllipse(nativeGraphics,
- brush->nativeBrush, x, y,
- width, height));
- }
-
- // integer version
- Status FillEllipse(IN const Brush* brush,
- IN const Rect& rect)
- {
- return FillEllipse(brush, rect.X, rect.Y, rect.Width, rect.Height);
- }
-
- Status FillEllipse(IN const Brush* brush,
- IN INT x,
- IN INT y,
- IN INT width,
- IN INT height)
- {
- return SetStatus(DllExports::GdipFillEllipseI(nativeGraphics,
- brush->nativeBrush,
- x,
- y,
- width,
- height));
- }
-
- // float version
- Status FillPie(IN const Brush* brush,
- IN const RectF& rect,
- IN REAL startAngle,
- IN REAL sweepAngle)
- {
- return FillPie(brush, rect.X, rect.Y, rect.Width, rect.Height,
- startAngle, sweepAngle);
- }
-
- Status FillPie(IN const Brush* brush,
- IN REAL x,
- IN REAL y,
- IN REAL width,
- IN REAL height,
- IN REAL startAngle,
- IN REAL sweepAngle)
- {
- return SetStatus(DllExports::GdipFillPie(nativeGraphics,
- brush->nativeBrush, x, y,
- width, height, startAngle,
- sweepAngle));
- }
-
- // integer version
- Status FillPie(IN const Brush* brush,
- IN const Rect& rect,
- IN REAL startAngle,
- IN REAL sweepAngle)
- {
- return FillPie(brush, rect.X, rect.Y, rect.Width, rect.Height,
- startAngle, sweepAngle);
- }
-
- Status FillPie(IN const Brush* brush,
- IN INT x,
- IN INT y,
- IN INT width,
- IN INT height,
- IN REAL startAngle,
- IN REAL sweepAngle)
- {
- return SetStatus(DllExports::GdipFillPieI(nativeGraphics,
- brush->nativeBrush,
- x,
- y,
- width,
- height,
- startAngle,
- sweepAngle));
- }
-
- Status FillPath(IN const Brush* brush,
- IN const GraphicsPath* path)
- {
- return SetStatus(DllExports::GdipFillPath(nativeGraphics,
- brush->nativeBrush,
- path->nativePath));
- }
-
- // float version
- Status FillClosedCurve(IN const Brush* brush,
- IN const PointF* points,
- IN INT count)
- {
- return SetStatus(DllExports::GdipFillClosedCurve(nativeGraphics,
- brush->nativeBrush,
- points, count));
-
- }
-
- Status FillClosedCurve(IN const Brush* brush,
- IN const PointF* points,
- IN INT count,
- IN FillMode fillMode,
- IN REAL tension = 0.5f)
- {
- return SetStatus(DllExports::GdipFillClosedCurve2(nativeGraphics,
- brush->nativeBrush,
- points, count,
- tension, fillMode));
- }
-
- // integer version
- Status FillClosedCurve(IN const Brush* brush,
- IN const Point* points,
- IN INT count)
- {
- return SetStatus(DllExports::GdipFillClosedCurveI(nativeGraphics,
- brush->nativeBrush,
- points,
- count));
- }
-
- Status FillClosedCurve(IN const Brush* brush,
- IN const Point* points,
- IN INT count,
- IN FillMode fillMode,
- IN REAL tension = 0.5f)
- {
- return SetStatus(DllExports::GdipFillClosedCurve2I(nativeGraphics,
- brush->nativeBrush,
- points, count,
- tension, fillMode));
- }
-
- // float version
- Status FillRegion(IN const Brush* brush,
- IN const Region* region)
- {
- return SetStatus(DllExports::GdipFillRegion(nativeGraphics,
- brush->nativeBrush,
- region->nativeRegion));
- }
-
- // DrawString and MeasureString
- Status
- DrawString(
- IN const WCHAR *string,
- IN INT length,
- IN const Font *font,
- IN const RectF &layoutRect,
- IN const StringFormat *stringFormat,
- IN const Brush *brush
- )
- {
- return SetStatus(DllExports::GdipDrawString(
- nativeGraphics,
- string,
- length,
- font ? font->nativeFont : NULL,
- &layoutRect,
- stringFormat ? stringFormat->nativeFormat : NULL,
- brush ? brush->nativeBrush : NULL
- ));
- }
-
- Status
- DrawString(
- const WCHAR *string,
- INT length,
- const Font *font,
- const PointF &origin,
- const Brush *brush
- )
- {
- RectF rect(origin.X, origin.Y, 0.0f, 0.0f);
-
- return SetStatus(DllExports::GdipDrawString(
- nativeGraphics,
- string,
- length,
- font ? font->nativeFont : NULL,
- &rect,
- NULL,
- brush ? brush->nativeBrush : NULL
- ));
- }
-
- Status
- DrawString(
- const WCHAR *string,
- INT length,
- const Font *font,
- const PointF &origin,
- const StringFormat *stringFormat,
- const Brush *brush
- )
- {
- RectF rect(origin.X, origin.Y, 0.0f, 0.0f);
-
- return SetStatus(DllExports::GdipDrawString(
- nativeGraphics,
- string,
- length,
- font ? font->nativeFont : NULL,
- &rect,
- stringFormat ? stringFormat->nativeFormat : NULL,
- brush ? brush->nativeBrush : NULL
- ));
- }
-
- Status
- MeasureString(
- IN const WCHAR *string,
- IN INT length,
- IN const Font *font,
- IN const RectF &layoutRect,
- IN const StringFormat *stringFormat,
- OUT RectF *boundingBox,
- OUT INT *codepointsFitted = 0,
- OUT INT *linesFilled = 0
- ) const
- {
- return SetStatus(DllExports::GdipMeasureString(
- nativeGraphics,
- string,
- length,
- font ? font->nativeFont : NULL,
- &layoutRect,
- stringFormat ? stringFormat->nativeFormat : NULL,
- boundingBox,
- codepointsFitted,
- linesFilled
- ));
- }
-
- Status
- MeasureString(
- IN const WCHAR *string,
- IN INT length,
- IN const Font *font,
- IN const SizeF &layoutRectSize,
- IN const StringFormat *stringFormat,
- OUT SizeF *size,
- OUT INT *codepointsFitted = 0,
- OUT INT *linesFilled = 0
- ) const
- {
- RectF layoutRect(0, 0, layoutRectSize.Width, layoutRectSize.Height);
- RectF boundingBox;
- Status status;
-
- if (size == NULL)
- {
- return SetStatus(InvalidParameter);
- }
-
- status = SetStatus(DllExports::GdipMeasureString(
- nativeGraphics,
- string,
- length,
- font ? font->nativeFont : NULL,
- &layoutRect,
- stringFormat ? stringFormat->nativeFormat : NULL,
- size ? &boundingBox : NULL,
- codepointsFitted,
- linesFilled
- ));
-
- if (size && status == Ok)
- {
- size->Width = boundingBox.Width;
- size->Height = boundingBox.Height;
- }
-
- return status;
- }
-
- Status
- MeasureString(
- IN const WCHAR *string,
- IN INT length,
- IN const Font *font,
- IN const PointF &origin,
- IN const StringFormat *stringFormat,
- OUT RectF *boundingBox
- ) const
- {
- RectF rect(origin.X, origin.Y, 0.0f, 0.0f);
-
- return SetStatus(DllExports::GdipMeasureString(
- nativeGraphics,
- string,
- length,
- font ? font->nativeFont : NULL,
- &rect,
- stringFormat ? stringFormat->nativeFormat : NULL,
- boundingBox,
- NULL,
- NULL
- ));
- }
-
-
- Status
- MeasureString(
- IN const WCHAR *string,
- IN INT length,
- IN const Font *font,
- IN const RectF &layoutRect,
- OUT RectF *boundingBox
- ) const
- {
- return SetStatus(DllExports::GdipMeasureString(
- nativeGraphics,
- string,
- length,
- font ? font->nativeFont : NULL,
- &layoutRect,
- NULL,
- boundingBox,
- NULL,
- NULL
- ));
- }
-
- Status
- MeasureString(
- IN const WCHAR *string,
- IN INT length,
- IN const Font *font,
- IN const PointF &origin,
- OUT RectF *boundingBox
- ) const
- {
- RectF rect(origin.X, origin.Y, 0.0f, 0.0f);
-
- return SetStatus(DllExports::GdipMeasureString(
- nativeGraphics,
- string,
- length,
- font ? font->nativeFont : NULL,
- &rect,
- NULL,
- boundingBox,
- NULL,
- NULL
- ));
- }
-
-
-#ifdef DCR_USE_NEW_174340
- Status
- MeasureCharacterRanges(
- IN const WCHAR *string,
- IN INT length,
- IN const Font *font,
- IN const RectF &layoutRect,
- IN const StringFormat *stringFormat,
- IN INT regionCount,
- OUT Region *regions
- ) const
- {
- if (!regions || regionCount <= 0)
- {
- return InvalidParameter;
- }
-
- GpRegion **nativeRegions = new GpRegion* [regionCount];
-
- if (!nativeRegions)
- {
- return OutOfMemory;
- }
-
- for (INT i = 0; i < regionCount; i++)
- {
- nativeRegions[i] = regions[i].nativeRegion;
- }
-
- Status status = SetStatus(DllExports::GdipMeasureCharacterRanges(
- nativeGraphics,
- string,
- length,
- font ? font->nativeFont : NULL,
- layoutRect,
- stringFormat ? stringFormat->nativeFormat : NULL,
- regionCount,
- nativeRegions
- ));
-
- delete [] nativeRegions;
-
- return status;
- }
-#endif
-
-
-#ifndef DCR_USE_NEW_174340
- Status
- MeasureStringRegion(
- IN const WCHAR *string,
- IN INT length,
- IN const Font *font,
- IN const RectF &layoutRect,
- IN const StringFormat *stringFormat,
- IN INT firstCharacterIndex,
- IN INT characterCount,
- OUT Region *region
- ) const
- {
- if (region == NULL)
- {
- return SetStatus(InvalidParameter);
- }
-
- return (SetStatus(DllExports::GdipMeasureStringRegion(
- nativeGraphics,
- string,
- length,
- font ? font->nativeFont : NULL,
- layoutRect,
- stringFormat ? stringFormat->nativeFormat : NULL,
- firstCharacterIndex,
- characterCount,
- region->nativeRegion)));
- }
-#endif
-
- Status DrawDriverString(
- IN const UINT16 *text,
- IN INT length,
- IN const Font *font,
- IN const Brush *brush,
- IN const PointF *positions,
- IN INT flags,
- IN const Matrix *matrix
- )
- {
- return SetStatus(DllExports::GdipDrawDriverString(
- nativeGraphics,
- text,
- length,
- font ? font->nativeFont : NULL,
- brush ? brush->nativeBrush : NULL,
- positions,
- flags,
- matrix ? matrix->nativeMatrix : NULL
- ));
- }
-
- Status MeasureDriverString(
- IN const UINT16 *text,
- IN INT length,
- IN const Font *font,
- IN const PointF *positions,
- IN INT flags,
- IN const Matrix *matrix,
- OUT RectF *boundingBox
- ) const
- {
- return SetStatus(DllExports::GdipMeasureDriverString(
- nativeGraphics,
- text,
- length,
- font ? font->nativeFont : NULL,
- positions,
- flags,
- matrix ? matrix->nativeMatrix : NULL,
- boundingBox
- ));
- }
-
-#ifndef DCR_USE_NEW_168772
- Status DriverStringPointToCodepoint(
- IN const UINT16 *text,
- IN INT length,
- IN const Font *font,
- IN const PointF *positions,
- IN INT flags,
- IN const Matrix *matrix,
- IN const PointF &hit,
- OUT INT *index,
- OUT BOOL *rightEdge,
- OUT REAL *distance
- )
- {
- return SetStatus(DllExports::GdipDriverStringPointToCodepoint(
- nativeGraphics,
- text,
- length,
- font ? font->nativeFont : NULL,
- positions,
- flags,
- matrix ? matrix->nativeMatrix : NULL,
- &hit,
- index,
- rightEdge,
- distance
- ));
- }
-#endif
-
- // Draw a cached bitmap on this graphics destination offset by
- // x, y. Note this will fail with WrongState if the CachedBitmap
- // native format differs from this Graphics.
-
- Status DrawCachedBitmap(IN CachedBitmap *cb,
- IN INT x,
- IN INT y)
- {
- return SetStatus(DllExports::GdipDrawCachedBitmap(
- nativeGraphics,
- cb->nativeCachedBitmap,
- x, y
- ));
- }
-
- /**
- * Draw images (both bitmap and vector)
- */
- // float version
- Status DrawImage(IN Image* image,
- IN const PointF& point)
- {
- return DrawImage(image, point.X, point.Y);
- }
-
- Status DrawImage(IN Image* image,
- IN REAL x,
- IN REAL y)
- {
- return SetStatus(DllExports::GdipDrawImage(nativeGraphics,
- image ? image->nativeImage
- : NULL,
- x,
- y));
- }
-
- Status DrawImage(IN Image* image,
- IN const RectF& rect)
- {
- return DrawImage(image, rect.X, rect.Y, rect.Width, rect.Height);
- }
-
- Status DrawImage(IN Image* image,
- IN REAL x,
- IN REAL y,
- IN REAL width,
- IN REAL height)
- {
- return SetStatus(DllExports::GdipDrawImageRect(nativeGraphics,
- image ? image->nativeImage
- : NULL,
- x,
- y,
- width,
- height));
- }
-
- // integer version
- Status DrawImage(IN Image* image,
- IN const Point& point)
- {
- return DrawImage(image, point.X, point.Y);
- }
-
- Status DrawImage(IN Image* image,
- IN INT x,
- IN INT y)
- {
- return SetStatus(DllExports::GdipDrawImageI(nativeGraphics,
- image ? image->nativeImage
- : NULL,
- x,
- y));
- }
-
- Status DrawImage(IN Image* image,
- IN const Rect& rect)
- {
- return DrawImage(image,
- rect.X,
- rect.Y,
- rect.Width,
- rect.Height);
- }
-
- Status DrawImage(IN Image* image,
- IN INT x,
- IN INT y,
- IN INT width,
- IN INT height) {
- return SetStatus(DllExports::GdipDrawImageRectI(nativeGraphics,
- image ? image->nativeImage
- : NULL,
- x,
- y,
- width,
- height));
- }
-
- /**
- * Affine or perspective blt
- * destPoints.length = 3: rect => parallelogram
- * destPoints[0] <=> top-left corner of the source rectangle
- * destPoints[1] <=> top-right corner
- * destPoints[2] <=> bottom-left corner
- * destPoints.length = 4: rect => quad
- * destPoints[3] <=> bottom-right corner
- *
- * @notes Perspective blt only works for bitmap images.
- */
- Status DrawImage(IN Image* image,
- IN const PointF* destPoints,
- IN INT count)
- {
- if (count != 3 && count != 4)
- return SetStatus(InvalidParameter);
-
- return SetStatus(DllExports::GdipDrawImagePoints(nativeGraphics,
- image ? image->nativeImage
- : NULL,
- destPoints, count));
- }
-
- Status DrawImage(IN Image* image,
- IN const Point* destPoints,
- IN INT count)
- {
- if (count != 3 && count != 4)
- return SetStatus(InvalidParameter);
-
- return SetStatus(DllExports::GdipDrawImagePointsI(nativeGraphics,
- image ? image->nativeImage
- : NULL,
- destPoints,
- count));
- }
-
- /**
- * We need another set of methods similar to the ones above
- * that take an additional Rect parameter to specify the
- * portion of the source image to be drawn.
- */
- // float version
- Status DrawImage(IN Image* image,
- IN REAL x,
- IN REAL y,
- IN REAL srcx,
- IN REAL srcy,
- IN REAL srcwidth,
- IN REAL srcheight,
- IN Unit srcUnit)
- {
- return SetStatus(DllExports::GdipDrawImagePointRect(nativeGraphics,
- image ? image->nativeImage
- : NULL,
- x, y,
- srcx, srcy,
- srcwidth, srcheight, srcUnit));
- }
-
- Status DrawImage(IN Image* image,
- IN const RectF& destRect,
- IN REAL srcx,
- IN REAL srcy,
- IN REAL srcwidth,
- IN REAL srcheight,
- IN Unit srcUnit,
- IN const ImageAttributes* imageAttributes = NULL,
- IN DrawImageAbort callback = NULL,
- IN VOID* callbackData = NULL)
- {
- return SetStatus(DllExports::GdipDrawImageRectRect(nativeGraphics,
- image ? image->nativeImage
- : NULL,
- destRect.X,
- destRect.Y,
- destRect.Width,
- destRect.Height,
- srcx, srcy,
- srcwidth, srcheight,
- srcUnit,
- imageAttributes
- ? imageAttributes->nativeImageAttr
- : NULL,
- callback,
- callbackData));
- }
-
- Status DrawImage(IN Image* image,
- IN const PointF* destPoints,
- IN INT count,
- IN REAL srcx,
- IN REAL srcy,
- IN REAL srcwidth,
- IN REAL srcheight,
- IN Unit srcUnit,
- IN const ImageAttributes* imageAttributes = NULL,
- IN DrawImageAbort callback = NULL,
- IN VOID* callbackData = NULL)
- {
- return SetStatus(DllExports::GdipDrawImagePointsRect(nativeGraphics,
- image ? image->nativeImage
- : NULL,
- destPoints, count,
- srcx, srcy,
- srcwidth,
- srcheight,
- srcUnit,
- imageAttributes
- ? imageAttributes->nativeImageAttr
- : NULL,
- callback,
- callbackData));
- }
-
- // integer version
- Status DrawImage(IN Image* image,
- IN INT x,
- IN INT y,
- IN INT srcx,
- IN INT srcy,
- IN INT srcwidth,
- IN INT srcheight,
- IN Unit srcUnit)
- {
- return SetStatus(DllExports::GdipDrawImagePointRectI(nativeGraphics,
- image ? image->nativeImage
- : NULL,
- x,
- y,
- srcx,
- srcy,
- srcwidth,
- srcheight,
- srcUnit));
- }
-
- Status DrawImage(IN Image* image,
- IN const Rect& destRect,
- IN INT srcx,
- IN INT srcy,
- IN INT srcwidth,
- IN INT srcheight,
- IN Unit srcUnit,
- IN const ImageAttributes* imageAttributes = NULL,
- IN DrawImageAbort callback = NULL,
- IN VOID* callbackData = NULL)
- {
- return SetStatus(DllExports::GdipDrawImageRectRectI(nativeGraphics,
- image ? image->nativeImage
- : NULL,
- destRect.X,
- destRect.Y,
- destRect.Width,
- destRect.Height,
- srcx,
- srcy,
- srcwidth,
- srcheight,
- srcUnit,
- imageAttributes
- ? imageAttributes->nativeImageAttr
- : NULL,
- callback,
- callbackData));
- }
-
- Status DrawImage(IN Image* image,
- IN const Point* destPoints,
- IN INT count,
- IN INT srcx,
- IN INT srcy,
- IN INT srcwidth,
- IN INT srcheight,
- IN Unit srcUnit,
- IN const ImageAttributes* imageAttributes = NULL,
- IN DrawImageAbort callback = NULL,
- IN VOID* callbackData = NULL)
- {
- return SetStatus(DllExports::GdipDrawImagePointsRectI(nativeGraphics,
- image ? image->nativeImage
- : NULL,
- destPoints,
- count,
- srcx,
- srcy,
- srcwidth,
- srcheight,
- srcUnit,
- imageAttributes
- ? imageAttributes->nativeImageAttr
- : NULL,
- callback,
- callbackData));
- }
-
- // The following methods are for playing an EMF+ to a graphics
- // via the enumeration interface. Each record of the EMF+ is
- // sent to the callback (along with the callbackData). Then
- // the callback can invoke the Metafile::PlayRecord method
- // to play the particular record.
-
- Status
- EnumerateMetafile(
- IN const Metafile * metafile,
- IN const PointF & destPoint,
- IN EnumerateMetafileProc callback,
- IN VOID * callbackData = NULL,
- IN const ImageAttributes * imageAttributes = NULL
- )
- {
- return SetStatus(DllExports::GdipEnumerateMetafileDestPoint(
- nativeGraphics,
- (const GpMetafile *)(metafile ? metafile->nativeImage:NULL),
- destPoint,
- callback,
- callbackData,
- imageAttributes ? imageAttributes->nativeImageAttr : NULL));
- }
-
- Status
- EnumerateMetafile(
- IN const Metafile * metafile,
- IN const Point & destPoint,
- IN EnumerateMetafileProc callback,
- IN VOID * callbackData = NULL,
- IN const ImageAttributes * imageAttributes = NULL
- )
- {
- return SetStatus(DllExports::GdipEnumerateMetafileDestPointI(
- nativeGraphics,
- (const GpMetafile *)(metafile ? metafile->nativeImage:NULL),
- destPoint,
- callback,
- callbackData,
- imageAttributes ? imageAttributes->nativeImageAttr : NULL));
- }
-
- Status
- EnumerateMetafile(
- IN const Metafile * metafile,
- IN const RectF & destRect,
- IN EnumerateMetafileProc callback,
- IN VOID * callbackData = NULL,
- IN const ImageAttributes * imageAttributes = NULL
- )
- {
- return SetStatus(DllExports::GdipEnumerateMetafileDestRect(
- nativeGraphics,
- (const GpMetafile *)(metafile ? metafile->nativeImage:NULL),
- destRect,
- callback,
- callbackData,
- imageAttributes ? imageAttributes->nativeImageAttr : NULL));
- }
-
- Status
- EnumerateMetafile(
- IN const Metafile * metafile,
- IN const Rect & destRect,
- IN EnumerateMetafileProc callback,
- IN VOID * callbackData = NULL,
- IN const ImageAttributes * imageAttributes = NULL
- )
- {
- return SetStatus(DllExports::GdipEnumerateMetafileDestRectI(
- nativeGraphics,
- (const GpMetafile *)(metafile ? metafile->nativeImage:NULL),
- destRect,
- callback,
- callbackData,
- imageAttributes ? imageAttributes->nativeImageAttr : NULL));
- }
-
- Status
- EnumerateMetafile(
- IN const Metafile * metafile,
- IN const PointF * destPoints,
- IN INT count,
- IN EnumerateMetafileProc callback,
- IN VOID * callbackData = NULL,
- IN const ImageAttributes * imageAttributes = NULL
- )
- {
- return SetStatus(DllExports::GdipEnumerateMetafileDestPoints(
- nativeGraphics,
- (const GpMetafile *)(metafile ? metafile->nativeImage:NULL),
- destPoints,
- count,
- callback,
- callbackData,
- imageAttributes ? imageAttributes->nativeImageAttr : NULL));
- }
-
- Status
- EnumerateMetafile(
- IN const Metafile * metafile,
- IN const Point * destPoints,
- IN INT count,
- IN EnumerateMetafileProc callback,
- IN VOID * callbackData = NULL,
- IN const ImageAttributes * imageAttributes = NULL
- )
- {
- return SetStatus(DllExports::GdipEnumerateMetafileDestPointsI(
- nativeGraphics,
- (const GpMetafile *)(metafile ? metafile->nativeImage:NULL),
- destPoints,
- count,
- callback,
- callbackData,
- imageAttributes ? imageAttributes->nativeImageAttr : NULL));
- }
-
- Status
- EnumerateMetafile(
- IN const Metafile * metafile,
- IN const PointF & destPoint,
- IN const RectF & srcRect,
- IN Unit srcUnit,
- IN EnumerateMetafileProc callback,
- IN VOID * callbackData = NULL,
- IN const ImageAttributes * imageAttributes = NULL
- )
- {
- return SetStatus(DllExports::GdipEnumerateMetafileSrcRectDestPoint(
- nativeGraphics,
- (const GpMetafile *)(metafile ? metafile->nativeImage:NULL),
- destPoint,
- srcRect,
- srcUnit,
- callback,
- callbackData,
- imageAttributes ? imageAttributes->nativeImageAttr : NULL));
- }
-
- Status
- EnumerateMetafile(
- IN const Metafile * metafile,
- IN const Point & destPoint,
- IN const Rect & srcRect,
- IN Unit srcUnit,
- IN EnumerateMetafileProc callback,
- IN VOID * callbackData = NULL,
- IN const ImageAttributes * imageAttributes = NULL
- )
- {
- return SetStatus(DllExports::GdipEnumerateMetafileSrcRectDestPointI(
- nativeGraphics,
- (const GpMetafile *)(metafile ? metafile->nativeImage:NULL),
- destPoint,
- srcRect,
- srcUnit,
- callback,
- callbackData,
- imageAttributes ? imageAttributes->nativeImageAttr : NULL));
- }
-
- Status
- EnumerateMetafile(
- IN const Metafile * metafile,
- IN const RectF & destRect,
- IN const RectF & srcRect,
- IN Unit srcUnit,
- IN EnumerateMetafileProc callback,
- IN VOID * callbackData = NULL,
- IN const ImageAttributes * imageAttributes = NULL
- )
- {
- return SetStatus(DllExports::GdipEnumerateMetafileSrcRectDestRect(
- nativeGraphics,
- (const GpMetafile *)(metafile ? metafile->nativeImage:NULL),
- destRect,
- srcRect,
- srcUnit,
- callback,
- callbackData,
- imageAttributes ? imageAttributes->nativeImageAttr : NULL));
- }
-
- Status
- EnumerateMetafile(
- IN const Metafile * metafile,
- IN const Rect & destRect,
- IN const Rect & srcRect,
- IN Unit srcUnit,
- IN EnumerateMetafileProc callback,
- IN VOID * callbackData = NULL,
- IN const ImageAttributes * imageAttributes = NULL
- )
- {
- return SetStatus(DllExports::GdipEnumerateMetafileSrcRectDestRectI(
- nativeGraphics,
- (const GpMetafile *)(metafile ? metafile->nativeImage:NULL),
- destRect,
- srcRect,
- srcUnit,
- callback,
- callbackData,
- imageAttributes ? imageAttributes->nativeImageAttr : NULL));
- }
-
- Status
- EnumerateMetafile(
- IN const Metafile * metafile,
- IN const PointF * destPoints,
- IN INT count,
- IN const RectF & srcRect,
- IN Unit srcUnit,
- IN EnumerateMetafileProc callback,
- IN VOID * callbackData = NULL,
- IN const ImageAttributes * imageAttributes = NULL
- )
- {
- return SetStatus(DllExports::GdipEnumerateMetafileSrcRectDestPoints(
- nativeGraphics,
- (const GpMetafile *)(metafile ? metafile->nativeImage:NULL),
- destPoints,
- count,
- srcRect,
- srcUnit,
- callback,
- callbackData,
- imageAttributes ? imageAttributes->nativeImageAttr : NULL));
- }
-
- Status
- EnumerateMetafile(
- IN const Metafile * metafile,
- IN const Point * destPoints,
- IN INT count,
- IN const Rect & srcRect,
- IN Unit srcUnit,
- IN EnumerateMetafileProc callback,
- IN VOID * callbackData = NULL,
- IN const ImageAttributes * imageAttributes = NULL
- )
- {
- return SetStatus(DllExports::GdipEnumerateMetafileSrcRectDestPointsI(
- nativeGraphics,
- (const GpMetafile *)(metafile ? metafile->nativeImage:NULL),
- destPoints,
- count,
- srcRect,
- srcUnit,
- callback,
- callbackData,
- imageAttributes ? imageAttributes->nativeImageAttr : NULL));
- }
-
- /**
- * Clipping region operations
- *
- * @notes Simply incredible redundancy here.
- */
- Status SetClip(IN const Graphics* g,
- IN CombineMode combineMode = CombineModeReplace)
- {
- return SetStatus(DllExports::GdipSetClipGraphics(nativeGraphics,
- g->nativeGraphics,
- combineMode));
- }
-
- Status SetClip(IN const RectF& rect,
- IN CombineMode combineMode = CombineModeReplace)
- {
- return SetStatus(DllExports::GdipSetClipRect(nativeGraphics,
- rect.X, rect.Y,
- rect.Width, rect.Height,
- combineMode));
- }
-
- Status SetClip(IN const Rect& rect,
- IN CombineMode combineMode = CombineModeReplace)
- {
- return SetStatus(DllExports::GdipSetClipRectI(nativeGraphics,
- rect.X, rect.Y,
- rect.Width, rect.Height,
- combineMode));
- }
-
- Status SetClip(IN const GraphicsPath* path,
- IN CombineMode combineMode = CombineModeReplace)
- {
- return SetStatus(DllExports::GdipSetClipPath(nativeGraphics,
- path->nativePath,
- combineMode));
- }
-
- Status SetClip(IN const Region* region,
- IN CombineMode combineMode = CombineModeReplace)
- {
- return SetStatus(DllExports::GdipSetClipRegion(nativeGraphics,
- region->nativeRegion,
- combineMode));
- }
-
- // This is different than the other SetClip methods because it assumes
- // that the HRGN is already in device units, so it doesn't transform
- // the coordinates in the HRGN.
- Status SetClip(IN HRGN hRgn,
- IN CombineMode combineMode = CombineModeReplace)
- {
- return SetStatus(DllExports::GdipSetClipHrgn(nativeGraphics, hRgn,
- combineMode));
- }
-
- Status IntersectClip(IN const RectF& rect)
- {
- return SetStatus(DllExports::GdipSetClipRect(nativeGraphics,
- rect.X, rect.Y,
- rect.Width, rect.Height,
- CombineModeIntersect));
- }
-
- Status IntersectClip(IN const Rect& rect)
- {
- return SetStatus(DllExports::GdipSetClipRectI(nativeGraphics,
- rect.X, rect.Y,
- rect.Width, rect.Height,
- CombineModeIntersect));
- }
-
- Status IntersectClip(IN const Region* region)
- {
- return SetStatus(DllExports::GdipSetClipRegion(nativeGraphics,
- region->nativeRegion,
- CombineModeIntersect));
- }
-
- Status ExcludeClip(IN const RectF& rect)
- {
- return SetStatus(DllExports::GdipSetClipRect(nativeGraphics,
- rect.X, rect.Y,
- rect.Width, rect.Height,
- CombineModeExclude));
- }
-
- Status ExcludeClip(IN const Rect& rect)
- {
- return SetStatus(DllExports::GdipSetClipRectI(nativeGraphics,
- rect.X, rect.Y,
- rect.Width, rect.Height,
- CombineModeExclude));
- }
-
- Status ExcludeClip(IN const Region* region)
- {
- return SetStatus(DllExports::GdipSetClipRegion(nativeGraphics,
- region->nativeRegion,
- CombineModeExclude));
- }
-
- Status ResetClip()
- {
- return SetStatus(DllExports::GdipResetClip(nativeGraphics));
- }
-
- Status TranslateClip(IN REAL dx,
- IN REAL dy)
- {
- return SetStatus(DllExports::GdipTranslateClip(nativeGraphics, dx, dy));
- }
-
- Status TranslateClip(IN INT dx,
- IN INT dy)
- {
- return SetStatus(DllExports::GdipTranslateClipI(nativeGraphics,
- dx, dy));
- }
-
- /**
- * GetClip region from graphics context
- */
- Status GetClip(OUT Region* region) const
- {
- return SetStatus(DllExports::GdipGetClip(nativeGraphics,
- region->nativeRegion));
- }
-
- /**
- * Hit testing operations
- */
- Status GetClipBounds(OUT RectF* rect) const
- {
- return SetStatus(DllExports::GdipGetClipBounds(nativeGraphics, rect));
- }
-
- Status GetClipBounds(OUT Rect* rect) const
- {
- return SetStatus(DllExports::GdipGetClipBoundsI(nativeGraphics, rect));
- }
-
- BOOL IsClipEmpty() const
- {
- BOOL booln = FALSE;
-
- SetStatus(DllExports::GdipIsClipEmpty(nativeGraphics, &booln));
-
- return booln;
- }
-
- Status GetVisibleClipBounds(OUT RectF *rect) const
- {
-
- return SetStatus(DllExports::GdipGetVisibleClipBounds(nativeGraphics,
- rect));
- }
-
- Status GetVisibleClipBounds(OUT Rect *rect) const
- {
- return SetStatus(DllExports::GdipGetVisibleClipBoundsI(nativeGraphics,
- rect));
- }
-
- BOOL IsVisibleClipEmpty() const
- {
- BOOL booln = FALSE;
-
- SetStatus(DllExports::GdipIsVisibleClipEmpty(nativeGraphics, &booln));
-
- return booln;
- }
-
- BOOL IsVisible(IN INT x,
- IN INT y) const
- {
- return IsVisible(Point(x,y));
- }
-
- BOOL IsVisible(IN const Point& point) const
- {
- BOOL booln = FALSE;
-
- SetStatus(DllExports::GdipIsVisiblePointI(nativeGraphics,
- point.X,
- point.Y,
- &booln));
-
- return booln;
- }
-
- BOOL IsVisible(IN INT x,
- IN INT y,
- IN INT width,
- IN INT height) const
- {
- return IsVisible(Rect(x, y, width, height));
- }
-
- BOOL IsVisible(IN const Rect& rect) const
- {
-
- BOOL booln = TRUE;
-
- SetStatus(DllExports::GdipIsVisibleRectI(nativeGraphics,
- rect.X,
- rect.Y,
- rect.Width,
- rect.Height,
- &booln));
- return booln;
- }
-
- BOOL IsVisible(IN REAL x,
- IN REAL y) const
- {
- return IsVisible(PointF(x, y));
- }
-
- BOOL IsVisible(IN const PointF& point) const
- {
- BOOL booln = FALSE;
-
- SetStatus(DllExports::GdipIsVisiblePoint(nativeGraphics,
- point.X,
- point.Y,
- &booln));
-
- return booln;
- }
-
- BOOL IsVisible(IN REAL x,
- IN REAL y,
- IN REAL width,
- IN REAL height) const
- {
- return IsVisible(RectF(x, y, width, height));
- }
-
- BOOL IsVisible(IN const RectF& rect) const
- {
- BOOL booln = TRUE;
-
- SetStatus(DllExports::GdipIsVisibleRect(nativeGraphics,
- rect.X,
- rect.Y,
- rect.Width,
- rect.Height,
- &booln));
- return booln;
- }
-
- /**
- * Save/restore graphics state
- */
- GraphicsState Save() const
- {
- GraphicsState gstate;
-
- SetStatus(DllExports::GdipSaveGraphics(nativeGraphics, &gstate));
-
- return gstate;
- }
-
- Status Restore(IN GraphicsState gstate)
- {
- return SetStatus(DllExports::GdipRestoreGraphics(nativeGraphics,
- gstate));
- }
-
- /**
- * Begin and end container drawing
- */
- GraphicsContainer BeginContainer(IN const RectF &dstrect,
- IN const RectF &srcrect,
- IN Unit unit)
- {
- GraphicsContainer state;
-
- SetStatus(DllExports::GdipBeginContainer(nativeGraphics, &dstrect,
- &srcrect, unit, &state));
-
- return state;
- }
-
- /**
- * Begin and end container drawing
- */
- GraphicsContainer BeginContainer(IN const Rect &dstrect,
- IN const Rect &srcrect,
- IN Unit unit)
- {
- GraphicsContainer state;
-
- SetStatus(DllExports::GdipBeginContainerI(nativeGraphics, &dstrect,
- &srcrect, unit, &state));
-
- return state;
- }
-
- GraphicsContainer BeginContainer()
- {
- GraphicsContainer state;
-
- SetStatus(DllExports::GdipBeginContainer2(nativeGraphics, &state));
-
- return state;
- }
-
- Status EndContainer(IN GraphicsContainer state)
- {
- return SetStatus(DllExports::GdipEndContainer(nativeGraphics, state));
- }
-
- // only valid when recording metafiles
- Status AddMetafileComment(IN const BYTE * data,
- IN UINT sizeData)
- {
- return SetStatus(DllExports::GdipComment(nativeGraphics, sizeData, data));
- }
-
- /**
- * Get/SetLayout
- * Support for Middle East localization (right-to-left mirroring)
- */
- GraphicsLayout GetLayout() const
- {
- GraphicsLayout layout;
-
- SetStatus(DllExports::GdipGetGraphicsLayout(nativeGraphics, &layout));
-
- return layout;
- }
-
- Status SetLayout(IN const GraphicsLayout layout)
- {
- return SetStatus(
- DllExports::GdipSetGraphicsLayout(nativeGraphics, layout)
- );
- }
-
- static HPALETTE GetHalftonePalette()
- {
- return DllExports::GdipCreateHalftonePalette();
- }
-
- Status GetLastStatus() const
- {
- Status lastStatus = lastResult;
- lastResult = Ok;
-
- return lastStatus;
- }
-
-protected:
-
-#ifdef DCR_USE_NEW_250932
-
-private:
- Graphics(const Graphics &);
- Graphics& operator=(const Graphics &);
-protected:
-
-#else
-
- Graphics(const Graphics& graphics)
- {
- graphics;
- SetStatus(NotImplemented);
- }
-
- Graphics& operator=(const Graphics& graphics)
- {
- graphics;
- SetStatus(NotImplemented);
- return *this;
- }
-
-#endif
-
- Graphics(GpGraphics* graphics)
- {
- lastResult = Ok;
- SetNativeGraphics(graphics);
- }
-
- VOID SetNativeGraphics(GpGraphics *graphics)
- {
- this->nativeGraphics = graphics;
- }
-
- Status SetStatus(Status status) const
- {
- if (status != Ok)
- return (lastResult = status);
- else
- return status;
- }
-
- // Methods necessary to subclass Graphics for extension test.
-
- GpGraphics* GetNativeGraphics() const
- {
- return this->nativeGraphics;
- }
-
- GpPen* GetNativePen(const Pen* pen)
- {
- return pen->nativePen;
- }
-
-protected:
- GpGraphics* nativeGraphics;
- mutable Status lastResult;
-
-};
-
-//----------------------------------------------------------------------------
-// Extra implementation of GraphicsPath methods that use Graphics
-//----------------------------------------------------------------------------
-
-/**
- * Get the bounds of the path object with the given transform.
- * This is not always the tightest bounds.
- */
-
-inline Status
-GraphicsPath::GetBounds(
- OUT RectF* bounds,
- IN const Matrix* matrix,
- IN const Pen* pen) const
-{
- GpMatrix* nativeMatrix = NULL;
- GpPen* nativePen = NULL;
-
- if (matrix)
- nativeMatrix = matrix->nativeMatrix;
-
- if (pen)
- nativePen = pen->nativePen;
-
- return SetStatus(DllExports::GdipGetPathWorldBounds(nativePath, bounds,
- nativeMatrix, nativePen));
-}
-
-// integer version
-inline Status
-GraphicsPath::GetBounds(
- OUT Rect* bounds,
- IN const Matrix* matrix,
- IN const Pen* pen
-) const
-{
- GpMatrix* nativeMatrix = NULL;
- GpPen* nativePen = NULL;
-
- if (matrix)
- nativeMatrix = matrix->nativeMatrix;
-
- if (pen)
- nativePen = pen->nativePen;
-
- return SetStatus(DllExports::GdipGetPathWorldBoundsI(nativePath, bounds,
- nativeMatrix, nativePen));
-}
-
-//----------------------------------------------------------------------------
-// Hit testing operations
-//----------------------------------------------------------------------------
-
-inline BOOL
-GraphicsPath::IsVisible(
- IN REAL x,
- IN REAL y,
- IN const Graphics* g) const
-{
- BOOL booln = FALSE;
-
- GpGraphics* nativeGraphics = NULL;
-
- if (g)
- nativeGraphics = g->nativeGraphics;
-
- SetStatus(DllExports::GdipIsVisiblePathPoint(nativePath,
- x, y, nativeGraphics,
- &booln));
- return booln;
-}
-
-inline BOOL
-GraphicsPath::IsVisible(
- IN INT x,
- IN INT y,
- IN const Graphics* g) const
-{
- BOOL booln = FALSE;
-
- GpGraphics* nativeGraphics = NULL;
-
- if (g)
- nativeGraphics = g->nativeGraphics;
-
- SetStatus(DllExports::GdipIsVisiblePathPointI(nativePath,
- x, y, nativeGraphics,
- &booln));
- return booln;
-}
-
-inline BOOL
-GraphicsPath::IsOutlineVisible(
- IN REAL x,
- IN REAL y,
- IN const Pen* pen,
- IN const Graphics* g) const
-{
- BOOL booln = FALSE;
-
- GpGraphics* nativeGraphics = NULL;
- GpPen* nativePen = NULL;
-
- if(g)
- nativeGraphics = g->nativeGraphics;
- if(pen)
- nativePen = pen->nativePen;
-
- SetStatus(DllExports::GdipIsOutlineVisiblePathPoint(nativePath,
- x, y, nativePen, nativeGraphics,
- &booln));
- return booln;
-}
-
-inline BOOL
-GraphicsPath::IsOutlineVisible(
- IN INT x,
- IN INT y,
- IN const Pen* pen,
- IN const Graphics* g) const
-{
- BOOL booln = FALSE;
-
- GpGraphics* nativeGraphics = NULL;
- GpPen* nativePen = NULL;
-
- if(g)
- nativeGraphics = g->nativeGraphics;
- if(pen)
- nativePen = pen->nativePen;
-
- SetStatus(DllExports::GdipIsOutlineVisiblePathPointI(nativePath,
- x, y, nativePen, nativeGraphics,
- &booln));
- return booln;
-}
-
-#endif
+/**************************************************************************\
+*
+* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
+*
+* Module Name:
+*
+* GdiplusGraphics.h
+*
+* Abstract:
+*
+* Declarations for Graphics class
+*
+\**************************************************************************/
+
+#ifndef _GDIPLUSGRAPHICS_H
+#define _GDIPLUSGRAPHICS_H
+
+/**
+ * Represent a graphics context
+ */
+class Graphics : public GdiplusBase
+{
+public:
+ friend class Region;
+ friend class GraphicsPath;
+ friend class Image;
+ friend class Bitmap;
+ friend class Metafile;
+ friend class Font;
+ friend class FontFamily;
+ friend class FontCollection;
+ friend class CachedBitmap;
+
+ // Get a graphics context from an existing Win32 HDC or HWND
+ static Graphics* FromHDC(IN HDC hdc)
+ {
+ return new Graphics(hdc);
+ }
+
+ static Graphics* FromHDC(IN HDC hdc,
+ IN HANDLE hdevice)
+ {
+ return new Graphics(hdc, hdevice);
+ }
+
+ static Graphics* FromHWND(IN HWND hwnd,
+ IN BOOL icm = FALSE)
+ {
+ return new Graphics(hwnd, icm);
+ }
+
+ static Graphics* FromImage(IN Image *image)
+ {
+ return new Graphics(image);
+ }
+
+ Graphics(IN HDC hdc)
+ {
+ GpGraphics *graphics = NULL;
+
+ lastResult = DllExports::GdipCreateFromHDC(hdc, &graphics);
+
+ SetNativeGraphics(graphics);
+ }
+
+ Graphics(IN HDC hdc,
+ IN HANDLE hdevice)
+ {
+ GpGraphics *graphics = NULL;
+
+ lastResult = DllExports::GdipCreateFromHDC2(hdc, hdevice, &graphics);
+
+ SetNativeGraphics(graphics);
+ }
+
+ Graphics(IN HWND hwnd,
+ IN BOOL icm = FALSE)
+ {
+ GpGraphics *graphics = NULL;
+
+ if (icm)
+ {
+ lastResult = DllExports::GdipCreateFromHWNDICM(hwnd, &graphics);
+ }
+ else
+ {
+ lastResult = DllExports::GdipCreateFromHWND(hwnd, &graphics);
+ }
+
+ SetNativeGraphics(graphics);
+ }
+
+ Graphics(IN Image* image)
+ {
+ GpGraphics *graphics = NULL;
+
+ if (image != NULL)
+ {
+ lastResult = DllExports::GdipGetImageGraphicsContext(
+ image->nativeImage, &graphics);
+ }
+ SetNativeGraphics(graphics);
+ }
+
+ ~Graphics()
+ {
+ DllExports::GdipDeleteGraphics(nativeGraphics);
+ }
+
+ VOID Flush(IN FlushIntention intention = FlushIntentionFlush)
+ {
+ DllExports::GdipFlush(nativeGraphics, intention);
+ }
+
+ //------------------------------------------------------------------------
+ // Interop methods
+ //------------------------------------------------------------------------
+
+ // Locks the graphics until ReleaseDC is called
+ HDC GetHDC()
+ {
+ HDC hdc = NULL;
+
+ SetStatus(DllExports::GdipGetDC(nativeGraphics, &hdc));
+
+ return hdc;
+ }
+
+ VOID ReleaseHDC(IN HDC hdc)
+ {
+ SetStatus(DllExports::GdipReleaseDC(nativeGraphics, hdc));
+ }
+
+ //------------------------------------------------------------------------
+ // Rendering modes
+ //------------------------------------------------------------------------
+
+ Status SetRenderingOrigin(IN INT x, IN INT y)
+ {
+ return SetStatus(
+ DllExports::GdipSetRenderingOrigin(
+ nativeGraphics, x, y
+ )
+ );
+ }
+
+ Status GetRenderingOrigin(OUT INT *x, OUT INT *y) const
+ {
+ return SetStatus(
+ DllExports::GdipGetRenderingOrigin(
+ nativeGraphics, x, y
+ )
+ );
+ }
+
+ Status SetCompositingMode(IN CompositingMode compositingMode)
+ {
+ return SetStatus(DllExports::GdipSetCompositingMode(nativeGraphics,
+ compositingMode));
+ }
+
+ CompositingMode GetCompositingMode() const
+ {
+ CompositingMode mode;
+
+ SetStatus(DllExports::GdipGetCompositingMode(nativeGraphics,
+ &mode));
+
+ return mode;
+ }
+
+ Status SetCompositingQuality(IN CompositingQuality compositingQuality)
+ {
+ return SetStatus(DllExports::GdipSetCompositingQuality(
+ nativeGraphics,
+ compositingQuality));
+ }
+
+ CompositingQuality GetCompositingQuality() const
+ {
+ CompositingQuality quality;
+
+ SetStatus(DllExports::GdipGetCompositingQuality(
+ nativeGraphics,
+ &quality));
+
+ return quality;
+ }
+
+ Status SetTextRenderingHint(IN TextRenderingHint newMode)
+ {
+#ifndef DCR_USE_NEW_186764
+ /* temporarly set the high bit to warn that we are using the new definition for the flag */
+ newMode = (TextRenderingHint) (newMode | 0x0f000);
+#endif // DCR_USE_NEW_186764
+ return SetStatus(DllExports::GdipSetTextRenderingHint(nativeGraphics,
+ newMode));
+ }
+
+ TextRenderingHint GetTextRenderingHint() const
+ {
+ TextRenderingHint hint;
+
+ SetStatus(DllExports::GdipGetTextRenderingHint(nativeGraphics,
+ &hint));
+
+ return hint;
+ }
+
+#ifdef DCR_USE_NEW_188922
+ Status SetTextContrast(IN UINT contrast)
+ {
+ return SetStatus(DllExports::GdipSetTextContrast(nativeGraphics,
+ contrast));
+ }
+
+ UINT GetTextContrast() const
+ {
+ UINT contrast;
+
+ SetStatus(DllExports::GdipGetTextContrast(nativeGraphics,
+ &contrast));
+
+ return contrast;
+ }
+#else
+ Status SetTextGammaValue(IN UINT gammaValue)
+ {
+ return SetStatus(DllExports::GdipSetTextGammaValue(nativeGraphics,
+ gammaValue));
+ }
+
+ UINT GetTextGammaValue() const
+ {
+ UINT gammaValue;
+
+ SetStatus(DllExports::GdipGetTextGammaValue(nativeGraphics,
+ &gammaValue));
+
+ return gammaValue;
+ }
+
+#endif // DCR_USE_NEW_188922
+
+
+ InterpolationMode GetInterpolationMode() const
+ {
+ InterpolationMode mode = InterpolationModeInvalid;
+
+ SetStatus(DllExports::GdipGetInterpolationMode(nativeGraphics,
+ &mode));
+
+ return mode;
+ }
+
+ Status SetInterpolationMode(IN InterpolationMode interpolationMode)
+ {
+ return SetStatus(DllExports::GdipSetInterpolationMode(nativeGraphics,
+ interpolationMode));
+ }
+
+ SmoothingMode GetSmoothingMode() const
+ {
+ SmoothingMode smoothingMode = SmoothingModeInvalid;
+
+ SetStatus(DllExports::GdipGetSmoothingMode(nativeGraphics,
+ &smoothingMode));
+
+ return smoothingMode;
+ }
+
+ Status SetSmoothingMode(IN SmoothingMode smoothingMode)
+ {
+ return SetStatus(DllExports::GdipSetSmoothingMode(nativeGraphics,
+ smoothingMode));
+ }
+
+ PixelOffsetMode GetPixelOffsetMode() const
+ {
+ PixelOffsetMode pixelOffsetMode = PixelOffsetModeInvalid;
+
+ SetStatus(DllExports::GdipGetPixelOffsetMode(nativeGraphics,
+ &pixelOffsetMode));
+
+ return pixelOffsetMode;
+ }
+
+ Status SetPixelOffsetMode(IN PixelOffsetMode pixelOffsetMode)
+ {
+ return SetStatus(DllExports::GdipSetPixelOffsetMode(nativeGraphics,
+ pixelOffsetMode));
+ }
+
+ //------------------------------------------------------------------------
+ // Manipulate the current world transform
+ //------------------------------------------------------------------------
+
+ Status SetTransform(IN const Matrix* matrix)
+ {
+ return SetStatus(DllExports::GdipSetWorldTransform(nativeGraphics,
+ matrix->nativeMatrix));
+ }
+ Status ResetTransform()
+ {
+ return SetStatus(DllExports::GdipResetWorldTransform(nativeGraphics));
+ }
+
+ Status MultiplyTransform(IN const Matrix* matrix,
+ IN MatrixOrder order = MatrixOrderPrepend)
+ {
+ return SetStatus(DllExports::GdipMultiplyWorldTransform(nativeGraphics,
+ matrix->nativeMatrix,
+ order));
+ }
+
+ Status TranslateTransform(IN REAL dx,
+ IN REAL dy,
+ IN MatrixOrder order = MatrixOrderPrepend)
+ {
+ return SetStatus(DllExports::GdipTranslateWorldTransform(nativeGraphics,
+ dx, dy, order));
+ }
+
+ Status ScaleTransform(IN REAL sx,
+ IN REAL sy,
+ IN MatrixOrder order = MatrixOrderPrepend)
+ {
+ return SetStatus(DllExports::GdipScaleWorldTransform(nativeGraphics,
+ sx, sy, order));
+ }
+
+ Status RotateTransform(IN REAL angle,
+ IN MatrixOrder order = MatrixOrderPrepend)
+ {
+ return SetStatus(DllExports::GdipRotateWorldTransform(nativeGraphics,
+ angle, order));
+ }
+
+ /**
+ * Return the current world transform
+ */
+
+ Status GetTransform(OUT Matrix* matrix) const
+ {
+ return SetStatus(DllExports::GdipGetWorldTransform(nativeGraphics,
+ matrix->nativeMatrix));
+ }
+
+ /**
+ * Manipulate the current page transform
+ */
+
+ Status SetPageUnit(IN Unit unit)
+ {
+ return SetStatus(DllExports::GdipSetPageUnit(nativeGraphics,
+ unit));
+ }
+
+ Status SetPageScale(IN REAL scale)
+ {
+ return SetStatus(DllExports::GdipSetPageScale(nativeGraphics,
+ scale));
+ }
+
+ /**
+ * Retrieve the current page transform information
+ * notes @ these are atomic
+ */
+ Unit GetPageUnit() const
+ {
+ Unit unit;
+
+ SetStatus(DllExports::GdipGetPageUnit(nativeGraphics, &unit));
+
+ return unit;
+ }
+
+ REAL GetPageScale() const
+ {
+ REAL scale;
+
+ SetStatus(DllExports::GdipGetPageScale(nativeGraphics, &scale));
+
+ return scale;
+ }
+
+ REAL GetDpiX() const
+ {
+ REAL dpi;
+
+ SetStatus(DllExports::GdipGetDpiX(nativeGraphics, &dpi));
+
+ return dpi;
+ }
+
+ REAL GetDpiY() const
+ {
+ REAL dpi;
+
+ SetStatus(DllExports::GdipGetDpiY(nativeGraphics, &dpi));
+
+ return dpi;
+ }
+
+ /**
+ * Transform points in the current graphics context
+ */
+ // float version
+ Status TransformPoints(IN CoordinateSpace destSpace,
+ IN CoordinateSpace srcSpace,
+ IN OUT PointF* pts,
+ IN INT count) const
+ {
+ return SetStatus(DllExports::GdipTransformPoints(nativeGraphics,
+ destSpace,
+ srcSpace,
+ pts,
+ count));
+ }
+
+ // integer version
+ Status TransformPoints(IN CoordinateSpace destSpace,
+ IN CoordinateSpace srcSpace,
+ IN OUT Point* pts,
+ IN INT count) const
+ {
+
+ return SetStatus(DllExports::GdipTransformPointsI(nativeGraphics,
+ destSpace,
+ srcSpace,
+ pts,
+ count));
+ }
+
+ //------------------------------------------------------------------------
+ // GetNearestColor (for <= 8bpp surfaces)
+ // Note: alpha is ignored
+ //------------------------------------------------------------------------
+ Status GetNearestColor(IN OUT Color* color) const
+ {
+ if (color == NULL)
+ {
+ return SetStatus(InvalidParameter);
+ }
+
+ ARGB argb = color->GetValue();
+
+ Status status = SetStatus(DllExports::GdipGetNearestColor(nativeGraphics, &argb));
+
+ color->SetValue(argb);
+
+ return status;
+ }
+
+ /**
+ * Vector drawing methods
+ *
+ * @notes Do we need a set of methods that take
+ * integer coordinate parameters?
+ */
+
+ // float version
+ Status DrawLine(IN const Pen* pen,
+ IN REAL x1,
+ IN REAL y1,
+ IN REAL x2,
+ IN REAL y2)
+ {
+ return SetStatus(DllExports::GdipDrawLine(nativeGraphics,
+ pen->nativePen, x1, y1, x2,
+ y2));
+ }
+
+ Status DrawLine(IN const Pen* pen,
+ IN const PointF& pt1,
+ IN const PointF& pt2)
+ {
+ return DrawLine(pen, pt1.X, pt1.Y, pt2.X, pt2.Y);
+ }
+
+ Status DrawLines(IN const Pen* pen,
+ IN const PointF* points,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipDrawLines(nativeGraphics,
+ pen->nativePen,
+ points, count));
+ }
+
+ // int version
+ Status DrawLine(IN const Pen* pen,
+ IN INT x1,
+ IN INT y1,
+ IN INT x2,
+ IN INT y2)
+ {
+ return SetStatus(DllExports::GdipDrawLineI(nativeGraphics,
+ pen->nativePen,
+ x1,
+ y1,
+ x2,
+ y2));
+ }
+
+ Status DrawLine(IN const Pen* pen,
+ IN const Point& pt1,
+ IN const Point& pt2)
+ {
+ return DrawLine(pen,
+ pt1.X,
+ pt1.Y,
+ pt2.X,
+ pt2.Y);
+ }
+
+ Status DrawLines(IN const Pen* pen,
+ IN const Point* points,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipDrawLinesI(nativeGraphics,
+ pen->nativePen,
+ points,
+ count));
+ }
+
+ // float version
+ Status DrawArc(IN const Pen* pen,
+ IN REAL x,
+ IN REAL y,
+ IN REAL width,
+ IN REAL height,
+ IN REAL startAngle,
+ IN REAL sweepAngle)
+ {
+ return SetStatus(DllExports::GdipDrawArc(nativeGraphics,
+ pen->nativePen,
+ x,
+ y,
+ width,
+ height,
+ startAngle,
+ sweepAngle));
+ }
+
+ Status DrawArc(IN const Pen* pen,
+ IN const RectF& rect,
+ IN REAL startAngle,
+ IN REAL sweepAngle)
+ {
+ return DrawArc(pen, rect.X, rect.Y, rect.Width, rect.Height,
+ startAngle, sweepAngle);
+ }
+
+ // int version
+ Status DrawArc(IN const Pen* pen,
+ IN INT x,
+ IN INT y,
+ IN INT width,
+ IN INT height,
+ IN REAL startAngle,
+ IN REAL sweepAngle)
+ {
+ return SetStatus(DllExports::GdipDrawArcI(nativeGraphics,
+ pen->nativePen,
+ x,
+ y,
+ width,
+ height,
+ startAngle,
+ sweepAngle));
+ }
+
+
+ Status DrawArc(IN const Pen* pen,
+ IN const Rect& rect,
+ IN REAL startAngle,
+ IN REAL sweepAngle)
+ {
+ return DrawArc(pen,
+ rect.X,
+ rect.Y,
+ rect.Width,
+ rect.Height,
+ startAngle,
+ sweepAngle);
+ }
+
+ // float version
+ Status DrawBezier(IN const Pen* pen,
+ IN REAL x1,
+ IN REAL y1,
+ IN REAL x2,
+ IN REAL y2,
+ IN REAL x3,
+ IN REAL y3,
+ IN REAL x4,
+ IN REAL y4)
+ {
+ return SetStatus(DllExports::GdipDrawBezier(nativeGraphics,
+ pen->nativePen, x1, y1,
+ x2, y2, x3, y3, x4, y4));
+ }
+
+ Status DrawBezier(IN const Pen* pen,
+ IN const PointF& pt1,
+ IN const PointF& pt2,
+ IN const PointF& pt3,
+ IN const PointF& pt4)
+ {
+ return DrawBezier(pen,
+ pt1.X,
+ pt1.Y,
+ pt2.X,
+ pt2.Y,
+ pt3.X,
+ pt3.Y,
+ pt4.X,
+ pt4.Y);
+ }
+
+ Status DrawBeziers(IN const Pen* pen,
+ IN const PointF* points,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipDrawBeziers(nativeGraphics,
+ pen->nativePen,
+ points,
+ count));
+ }
+
+ // int version
+ Status DrawBezier(IN const Pen* pen,
+ IN INT x1,
+ IN INT y1,
+ IN INT x2,
+ IN INT y2,
+ IN INT x3,
+ IN INT y3,
+ IN INT x4,
+ IN INT y4)
+ {
+ return SetStatus(DllExports::GdipDrawBezierI(nativeGraphics,
+ pen->nativePen,
+ x1,
+ y1,
+ x2,
+ y2,
+ x3,
+ y3,
+ x4,
+ y4));
+ }
+
+ Status DrawBezier(IN const Pen* pen,
+ IN const Point& pt1,
+ IN const Point& pt2,
+ IN const Point& pt3,
+ IN const Point& pt4)
+ {
+ return DrawBezier(pen,
+ pt1.X,
+ pt1.Y,
+ pt2.X,
+ pt2.Y,
+ pt3.X,
+ pt3.Y,
+ pt4.X,
+ pt4.Y);
+ }
+
+ Status DrawBeziers(IN const Pen* pen,
+ IN const Point* points,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipDrawBeziersI(nativeGraphics,
+ pen->nativePen,
+ points,
+ count));
+ }
+
+ // float version
+ Status DrawRectangle(IN const Pen* pen,
+ IN const RectF& rect)
+ {
+ return DrawRectangle(pen, rect.X, rect.Y, rect.Width, rect.Height);
+ }
+
+ Status DrawRectangle(IN const Pen* pen,
+ IN REAL x,
+ IN REAL y,
+ IN REAL width,
+ IN REAL height)
+ {
+ return SetStatus(DllExports::GdipDrawRectangle(nativeGraphics,
+ pen->nativePen, x, y,
+ width, height));
+ }
+
+ Status DrawRectangles(IN const Pen* pen,
+ IN const RectF* rects,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipDrawRectangles(nativeGraphics,
+ pen->nativePen,
+ rects, count));
+ }
+
+ // integer version
+ Status DrawRectangle(IN const Pen* pen,
+ IN const Rect& rect)
+ {
+ return DrawRectangle(pen,
+ rect.X,
+ rect.Y,
+ rect.Width,
+ rect.Height);
+ }
+
+ Status DrawRectangle(IN const Pen* pen,
+ IN INT x,
+ IN INT y,
+ IN INT width,
+ IN INT height)
+ {
+ return SetStatus(DllExports::GdipDrawRectangleI(nativeGraphics,
+ pen->nativePen,
+ x,
+ y,
+ width,
+ height));
+ }
+
+ Status DrawRectangles(IN const Pen* pen,
+ IN const Rect* rects,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipDrawRectanglesI(nativeGraphics,
+ pen->nativePen,
+ rects,
+ count));
+ }
+
+ // float version
+ Status DrawEllipse(IN const Pen* pen,
+ IN const RectF& rect)
+ {
+ return DrawEllipse(pen, rect.X, rect.Y, rect.Width, rect.Height);
+ }
+
+ Status DrawEllipse(IN const Pen* pen,
+ IN REAL x,
+ IN REAL y,
+ IN REAL width,
+ IN REAL height)
+ {
+ return SetStatus(DllExports::GdipDrawEllipse(nativeGraphics,
+ pen->nativePen,
+ x,
+ y,
+ width,
+ height));
+ }
+
+ // integer version
+ Status DrawEllipse(IN const Pen* pen,
+ IN const Rect& rect)
+ {
+ return DrawEllipse(pen,
+ rect.X,
+ rect.Y,
+ rect.Width,
+ rect.Height);
+ }
+
+ Status DrawEllipse(IN const Pen* pen,
+ IN INT x,
+ IN INT y,
+ IN INT width,
+ IN INT height)
+ {
+ return SetStatus(DllExports::GdipDrawEllipseI(nativeGraphics,
+ pen->nativePen,
+ x,
+ y,
+ width,
+ height));
+ }
+
+ // floating point version
+ Status DrawPie(IN const Pen* pen,
+ IN const RectF& rect,
+ IN REAL startAngle,
+ IN REAL sweepAngle)
+ {
+ return DrawPie(pen,
+ rect.X,
+ rect.Y,
+ rect.Width,
+ rect.Height,
+ startAngle,
+ sweepAngle);
+ }
+
+ Status DrawPie(IN const Pen* pen,
+ IN REAL x,
+ IN REAL y,
+ IN REAL width,
+ IN REAL height,
+ IN REAL startAngle,
+ IN REAL sweepAngle)
+ {
+ return SetStatus(DllExports::GdipDrawPie(nativeGraphics,
+ pen->nativePen,
+ x,
+ y,
+ width,
+ height,
+ startAngle,
+ sweepAngle));
+ }
+
+ // integer point version
+ Status DrawPie(IN const Pen* pen,
+ IN const Rect& rect,
+ IN REAL startAngle,
+ IN REAL sweepAngle)
+ {
+ return DrawPie(pen,
+ rect.X,
+ rect.Y,
+ rect.Width,
+ rect.Height,
+ startAngle,
+ sweepAngle);
+ }
+
+ Status DrawPie(IN const Pen* pen,
+ IN INT x,
+ IN INT y,
+ IN INT width,
+ IN INT height,
+ IN REAL startAngle,
+ IN REAL sweepAngle)
+ {
+ return SetStatus(DllExports::GdipDrawPieI(nativeGraphics,
+ pen->nativePen,
+ x,
+ y,
+ width,
+ height,
+ startAngle,
+ sweepAngle));
+ }
+
+ // float version
+ Status DrawPolygon(IN const Pen* pen,
+ IN const PointF* points,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipDrawPolygon(nativeGraphics,
+ pen->nativePen,
+ points,
+ count));
+ }
+
+ // integer version
+ Status DrawPolygon(IN const Pen* pen,
+ IN const Point* points,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipDrawPolygonI(nativeGraphics,
+ pen->nativePen,
+ points,
+ count));
+ }
+
+ // float version
+ Status DrawPath(IN const Pen* pen,
+ IN const GraphicsPath* path)
+ {
+ return SetStatus(DllExports::GdipDrawPath(nativeGraphics,
+ pen ? pen->nativePen : NULL,
+ path ? path->nativePath : NULL));
+ }
+
+ // float version
+ Status DrawCurve(IN const Pen* pen,
+ IN const PointF* points,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipDrawCurve(nativeGraphics,
+ pen->nativePen, points,
+ count));
+ }
+
+ Status DrawCurve(IN const Pen* pen,
+ IN const PointF* points,
+ IN INT count,
+ IN REAL tension)
+ {
+ return SetStatus(DllExports::GdipDrawCurve2(nativeGraphics,
+ pen->nativePen, points,
+ count, tension));
+ }
+
+ Status DrawCurve(IN const Pen* pen,
+ IN const PointF* points,
+ IN INT count,
+ IN INT offset,
+ IN INT numberOfSegments,
+ IN REAL tension = 0.5f)
+ {
+ return SetStatus(DllExports::GdipDrawCurve3(nativeGraphics,
+ pen->nativePen, points,
+ count, offset,
+ numberOfSegments, tension));
+ }
+
+ // integer version
+ Status DrawCurve(IN const Pen* pen,
+ IN const Point* points,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipDrawCurveI(nativeGraphics,
+ pen->nativePen,
+ points,
+ count));
+ }
+
+ Status DrawCurve(IN const Pen* pen,
+ IN const Point* points,
+ IN INT count,
+ IN REAL tension)
+ {
+ return SetStatus(DllExports::GdipDrawCurve2I(nativeGraphics,
+ pen->nativePen,
+ points,
+ count,
+ tension));
+ }
+
+ Status DrawCurve(IN const Pen* pen,
+ IN const Point* points,
+ IN INT count,
+ IN INT offset,
+ IN INT numberOfSegments,
+ IN REAL tension = 0.5f)
+ {
+ return SetStatus(DllExports::GdipDrawCurve3I(nativeGraphics,
+ pen->nativePen,
+ points,
+ count,
+ offset,
+ numberOfSegments,
+ tension));
+ }
+
+ // float version
+ Status DrawClosedCurve(IN const Pen* pen,
+ IN const PointF* points,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipDrawClosedCurve(nativeGraphics,
+ pen->nativePen,
+ points, count));
+ }
+
+ Status DrawClosedCurve(IN const Pen *pen,
+ IN const PointF* points,
+ IN INT count,
+ IN REAL tension)
+ {
+ return SetStatus(DllExports::GdipDrawClosedCurve2(nativeGraphics,
+ pen->nativePen,
+ points, count,
+ tension));
+ }
+
+ // integer version
+ Status DrawClosedCurve(IN const Pen* pen,
+ IN const Point* points,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipDrawClosedCurveI(nativeGraphics,
+ pen->nativePen,
+ points,
+ count));
+ }
+
+ Status DrawClosedCurve(IN const Pen *pen,
+ IN const Point* points,
+ IN INT count,
+ IN REAL tension)
+ {
+ return SetStatus(DllExports::GdipDrawClosedCurve2I(nativeGraphics,
+ pen->nativePen,
+ points,
+ count,
+ tension));
+ }
+
+ Status Clear(IN const Color &color)
+ {
+ return SetStatus(DllExports::GdipGraphicsClear(
+ nativeGraphics,
+ color.GetValue()));
+ }
+
+ // float version
+ Status FillRectangle(IN const Brush* brush,
+ IN const RectF& rect)
+ {
+ return FillRectangle(brush, rect.X, rect.Y, rect.Width, rect.Height);
+ }
+
+ Status FillRectangle(IN const Brush* brush,
+ IN REAL x,
+ IN REAL y,
+ IN REAL width,
+ IN REAL height)
+ {
+ return SetStatus(DllExports::GdipFillRectangle(nativeGraphics,
+ brush->nativeBrush, x, y,
+ width, height));
+ }
+
+ Status FillRectangles(IN const Brush* brush,
+ IN const RectF* rects,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipFillRectangles(nativeGraphics,
+ brush->nativeBrush,
+ rects, count));
+ }
+
+ // integer version
+ Status FillRectangle(IN const Brush* brush,
+ IN const Rect& rect)
+ {
+ return FillRectangle(brush,
+ rect.X,
+ rect.Y,
+ rect.Width,
+ rect.Height);
+ }
+
+ Status FillRectangle(IN const Brush* brush,
+ IN INT x,
+ IN INT y,
+ IN INT width,
+ IN INT height)
+ {
+ return SetStatus(DllExports::GdipFillRectangleI(nativeGraphics,
+ brush->nativeBrush,
+ x,
+ y,
+ width,
+ height));
+ }
+
+ Status FillRectangles(IN const Brush* brush,
+ IN const Rect* rects,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipFillRectanglesI(nativeGraphics,
+ brush->nativeBrush,
+ rects,
+ count));
+ }
+
+ // float version
+ Status FillPolygon(IN const Brush* brush,
+ IN const PointF* points,
+ IN INT count)
+ {
+ return FillPolygon(brush, points, count, FillModeAlternate);
+ }
+
+ Status FillPolygon(IN const Brush* brush,
+ IN const PointF* points,
+ IN INT count,
+ IN FillMode fillMode)
+ {
+ return SetStatus(DllExports::GdipFillPolygon(nativeGraphics,
+ brush->nativeBrush,
+ points, count, fillMode));
+ }
+
+ // integer version
+ Status FillPolygon(IN const Brush* brush,
+ IN const Point* points,
+ IN INT count)
+ {
+ return FillPolygon(brush, points, count, FillModeAlternate);
+ }
+
+ Status FillPolygon(IN const Brush* brush,
+ IN const Point* points,
+ IN INT count,
+ IN FillMode fillMode)
+ {
+ return SetStatus(DllExports::GdipFillPolygonI(nativeGraphics,
+ brush->nativeBrush,
+ points, count,
+ fillMode));
+ }
+
+ // float version
+ Status FillEllipse(IN const Brush* brush,
+ IN const RectF& rect)
+ {
+ return FillEllipse(brush, rect.X, rect.Y, rect.Width, rect.Height);
+ }
+
+ Status FillEllipse(IN const Brush* brush,
+ IN REAL x,
+ IN REAL y,
+ IN REAL width,
+ IN REAL height)
+ {
+ return SetStatus(DllExports::GdipFillEllipse(nativeGraphics,
+ brush->nativeBrush, x, y,
+ width, height));
+ }
+
+ // integer version
+ Status FillEllipse(IN const Brush* brush,
+ IN const Rect& rect)
+ {
+ return FillEllipse(brush, rect.X, rect.Y, rect.Width, rect.Height);
+ }
+
+ Status FillEllipse(IN const Brush* brush,
+ IN INT x,
+ IN INT y,
+ IN INT width,
+ IN INT height)
+ {
+ return SetStatus(DllExports::GdipFillEllipseI(nativeGraphics,
+ brush->nativeBrush,
+ x,
+ y,
+ width,
+ height));
+ }
+
+ // float version
+ Status FillPie(IN const Brush* brush,
+ IN const RectF& rect,
+ IN REAL startAngle,
+ IN REAL sweepAngle)
+ {
+ return FillPie(brush, rect.X, rect.Y, rect.Width, rect.Height,
+ startAngle, sweepAngle);
+ }
+
+ Status FillPie(IN const Brush* brush,
+ IN REAL x,
+ IN REAL y,
+ IN REAL width,
+ IN REAL height,
+ IN REAL startAngle,
+ IN REAL sweepAngle)
+ {
+ return SetStatus(DllExports::GdipFillPie(nativeGraphics,
+ brush->nativeBrush, x, y,
+ width, height, startAngle,
+ sweepAngle));
+ }
+
+ // integer version
+ Status FillPie(IN const Brush* brush,
+ IN const Rect& rect,
+ IN REAL startAngle,
+ IN REAL sweepAngle)
+ {
+ return FillPie(brush, rect.X, rect.Y, rect.Width, rect.Height,
+ startAngle, sweepAngle);
+ }
+
+ Status FillPie(IN const Brush* brush,
+ IN INT x,
+ IN INT y,
+ IN INT width,
+ IN INT height,
+ IN REAL startAngle,
+ IN REAL sweepAngle)
+ {
+ return SetStatus(DllExports::GdipFillPieI(nativeGraphics,
+ brush->nativeBrush,
+ x,
+ y,
+ width,
+ height,
+ startAngle,
+ sweepAngle));
+ }
+
+ Status FillPath(IN const Brush* brush,
+ IN const GraphicsPath* path)
+ {
+ return SetStatus(DllExports::GdipFillPath(nativeGraphics,
+ brush->nativeBrush,
+ path->nativePath));
+ }
+
+ // float version
+ Status FillClosedCurve(IN const Brush* brush,
+ IN const PointF* points,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipFillClosedCurve(nativeGraphics,
+ brush->nativeBrush,
+ points, count));
+
+ }
+
+ Status FillClosedCurve(IN const Brush* brush,
+ IN const PointF* points,
+ IN INT count,
+ IN FillMode fillMode,
+ IN REAL tension = 0.5f)
+ {
+ return SetStatus(DllExports::GdipFillClosedCurve2(nativeGraphics,
+ brush->nativeBrush,
+ points, count,
+ tension, fillMode));
+ }
+
+ // integer version
+ Status FillClosedCurve(IN const Brush* brush,
+ IN const Point* points,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipFillClosedCurveI(nativeGraphics,
+ brush->nativeBrush,
+ points,
+ count));
+ }
+
+ Status FillClosedCurve(IN const Brush* brush,
+ IN const Point* points,
+ IN INT count,
+ IN FillMode fillMode,
+ IN REAL tension = 0.5f)
+ {
+ return SetStatus(DllExports::GdipFillClosedCurve2I(nativeGraphics,
+ brush->nativeBrush,
+ points, count,
+ tension, fillMode));
+ }
+
+ // float version
+ Status FillRegion(IN const Brush* brush,
+ IN const Region* region)
+ {
+ return SetStatus(DllExports::GdipFillRegion(nativeGraphics,
+ brush->nativeBrush,
+ region->nativeRegion));
+ }
+
+ // DrawString and MeasureString
+ Status
+ DrawString(
+ IN const WCHAR *string,
+ IN INT length,
+ IN const Font *font,
+ IN const RectF &layoutRect,
+ IN const StringFormat *stringFormat,
+ IN const Brush *brush
+ )
+ {
+ return SetStatus(DllExports::GdipDrawString(
+ nativeGraphics,
+ string,
+ length,
+ font ? font->nativeFont : NULL,
+ &layoutRect,
+ stringFormat ? stringFormat->nativeFormat : NULL,
+ brush ? brush->nativeBrush : NULL
+ ));
+ }
+
+ Status
+ DrawString(
+ const WCHAR *string,
+ INT length,
+ const Font *font,
+ const PointF &origin,
+ const Brush *brush
+ )
+ {
+ RectF rect(origin.X, origin.Y, 0.0f, 0.0f);
+
+ return SetStatus(DllExports::GdipDrawString(
+ nativeGraphics,
+ string,
+ length,
+ font ? font->nativeFont : NULL,
+ &rect,
+ NULL,
+ brush ? brush->nativeBrush : NULL
+ ));
+ }
+
+ Status
+ DrawString(
+ const WCHAR *string,
+ INT length,
+ const Font *font,
+ const PointF &origin,
+ const StringFormat *stringFormat,
+ const Brush *brush
+ )
+ {
+ RectF rect(origin.X, origin.Y, 0.0f, 0.0f);
+
+ return SetStatus(DllExports::GdipDrawString(
+ nativeGraphics,
+ string,
+ length,
+ font ? font->nativeFont : NULL,
+ &rect,
+ stringFormat ? stringFormat->nativeFormat : NULL,
+ brush ? brush->nativeBrush : NULL
+ ));
+ }
+
+ Status
+ MeasureString(
+ IN const WCHAR *string,
+ IN INT length,
+ IN const Font *font,
+ IN const RectF &layoutRect,
+ IN const StringFormat *stringFormat,
+ OUT RectF *boundingBox,
+ OUT INT *codepointsFitted = 0,
+ OUT INT *linesFilled = 0
+ ) const
+ {
+ return SetStatus(DllExports::GdipMeasureString(
+ nativeGraphics,
+ string,
+ length,
+ font ? font->nativeFont : NULL,
+ &layoutRect,
+ stringFormat ? stringFormat->nativeFormat : NULL,
+ boundingBox,
+ codepointsFitted,
+ linesFilled
+ ));
+ }
+
+ Status
+ MeasureString(
+ IN const WCHAR *string,
+ IN INT length,
+ IN const Font *font,
+ IN const SizeF &layoutRectSize,
+ IN const StringFormat *stringFormat,
+ OUT SizeF *size,
+ OUT INT *codepointsFitted = 0,
+ OUT INT *linesFilled = 0
+ ) const
+ {
+ RectF layoutRect(0, 0, layoutRectSize.Width, layoutRectSize.Height);
+ RectF boundingBox;
+ Status status;
+
+ if (size == NULL)
+ {
+ return SetStatus(InvalidParameter);
+ }
+
+ status = SetStatus(DllExports::GdipMeasureString(
+ nativeGraphics,
+ string,
+ length,
+ font ? font->nativeFont : NULL,
+ &layoutRect,
+ stringFormat ? stringFormat->nativeFormat : NULL,
+ size ? &boundingBox : NULL,
+ codepointsFitted,
+ linesFilled
+ ));
+
+ if (size && status == Ok)
+ {
+ size->Width = boundingBox.Width;
+ size->Height = boundingBox.Height;
+ }
+
+ return status;
+ }
+
+ Status
+ MeasureString(
+ IN const WCHAR *string,
+ IN INT length,
+ IN const Font *font,
+ IN const PointF &origin,
+ IN const StringFormat *stringFormat,
+ OUT RectF *boundingBox
+ ) const
+ {
+ RectF rect(origin.X, origin.Y, 0.0f, 0.0f);
+
+ return SetStatus(DllExports::GdipMeasureString(
+ nativeGraphics,
+ string,
+ length,
+ font ? font->nativeFont : NULL,
+ &rect,
+ stringFormat ? stringFormat->nativeFormat : NULL,
+ boundingBox,
+ NULL,
+ NULL
+ ));
+ }
+
+
+ Status
+ MeasureString(
+ IN const WCHAR *string,
+ IN INT length,
+ IN const Font *font,
+ IN const RectF &layoutRect,
+ OUT RectF *boundingBox
+ ) const
+ {
+ return SetStatus(DllExports::GdipMeasureString(
+ nativeGraphics,
+ string,
+ length,
+ font ? font->nativeFont : NULL,
+ &layoutRect,
+ NULL,
+ boundingBox,
+ NULL,
+ NULL
+ ));
+ }
+
+ Status
+ MeasureString(
+ IN const WCHAR *string,
+ IN INT length,
+ IN const Font *font,
+ IN const PointF &origin,
+ OUT RectF *boundingBox
+ ) const
+ {
+ RectF rect(origin.X, origin.Y, 0.0f, 0.0f);
+
+ return SetStatus(DllExports::GdipMeasureString(
+ nativeGraphics,
+ string,
+ length,
+ font ? font->nativeFont : NULL,
+ &rect,
+ NULL,
+ boundingBox,
+ NULL,
+ NULL
+ ));
+ }
+
+
+#ifdef DCR_USE_NEW_174340
+ Status
+ MeasureCharacterRanges(
+ IN const WCHAR *string,
+ IN INT length,
+ IN const Font *font,
+ IN const RectF &layoutRect,
+ IN const StringFormat *stringFormat,
+ IN INT regionCount,
+ OUT Region *regions
+ ) const
+ {
+ if (!regions || regionCount <= 0)
+ {
+ return InvalidParameter;
+ }
+
+ GpRegion **nativeRegions = new GpRegion* [regionCount];
+
+ if (!nativeRegions)
+ {
+ return OutOfMemory;
+ }
+
+ for (INT i = 0; i < regionCount; i++)
+ {
+ nativeRegions[i] = regions[i].nativeRegion;
+ }
+
+ Status status = SetStatus(DllExports::GdipMeasureCharacterRanges(
+ nativeGraphics,
+ string,
+ length,
+ font ? font->nativeFont : NULL,
+ layoutRect,
+ stringFormat ? stringFormat->nativeFormat : NULL,
+ regionCount,
+ nativeRegions
+ ));
+
+ delete [] nativeRegions;
+
+ return status;
+ }
+#endif
+
+
+#ifndef DCR_USE_NEW_174340
+ Status
+ MeasureStringRegion(
+ IN const WCHAR *string,
+ IN INT length,
+ IN const Font *font,
+ IN const RectF &layoutRect,
+ IN const StringFormat *stringFormat,
+ IN INT firstCharacterIndex,
+ IN INT characterCount,
+ OUT Region *region
+ ) const
+ {
+ if (region == NULL)
+ {
+ return SetStatus(InvalidParameter);
+ }
+
+ return (SetStatus(DllExports::GdipMeasureStringRegion(
+ nativeGraphics,
+ string,
+ length,
+ font ? font->nativeFont : NULL,
+ layoutRect,
+ stringFormat ? stringFormat->nativeFormat : NULL,
+ firstCharacterIndex,
+ characterCount,
+ region->nativeRegion)));
+ }
+#endif
+
+ Status DrawDriverString(
+ IN const UINT16 *text,
+ IN INT length,
+ IN const Font *font,
+ IN const Brush *brush,
+ IN const PointF *positions,
+ IN INT flags,
+ IN const Matrix *matrix
+ )
+ {
+ return SetStatus(DllExports::GdipDrawDriverString(
+ nativeGraphics,
+ text,
+ length,
+ font ? font->nativeFont : NULL,
+ brush ? brush->nativeBrush : NULL,
+ positions,
+ flags,
+ matrix ? matrix->nativeMatrix : NULL
+ ));
+ }
+
+ Status MeasureDriverString(
+ IN const UINT16 *text,
+ IN INT length,
+ IN const Font *font,
+ IN const PointF *positions,
+ IN INT flags,
+ IN const Matrix *matrix,
+ OUT RectF *boundingBox
+ ) const
+ {
+ return SetStatus(DllExports::GdipMeasureDriverString(
+ nativeGraphics,
+ text,
+ length,
+ font ? font->nativeFont : NULL,
+ positions,
+ flags,
+ matrix ? matrix->nativeMatrix : NULL,
+ boundingBox
+ ));
+ }
+
+#ifndef DCR_USE_NEW_168772
+ Status DriverStringPointToCodepoint(
+ IN const UINT16 *text,
+ IN INT length,
+ IN const Font *font,
+ IN const PointF *positions,
+ IN INT flags,
+ IN const Matrix *matrix,
+ IN const PointF &hit,
+ OUT INT *index,
+ OUT BOOL *rightEdge,
+ OUT REAL *distance
+ )
+ {
+ return SetStatus(DllExports::GdipDriverStringPointToCodepoint(
+ nativeGraphics,
+ text,
+ length,
+ font ? font->nativeFont : NULL,
+ positions,
+ flags,
+ matrix ? matrix->nativeMatrix : NULL,
+ &hit,
+ index,
+ rightEdge,
+ distance
+ ));
+ }
+#endif
+
+ // Draw a cached bitmap on this graphics destination offset by
+ // x, y. Note this will fail with WrongState if the CachedBitmap
+ // native format differs from this Graphics.
+
+ Status DrawCachedBitmap(IN CachedBitmap *cb,
+ IN INT x,
+ IN INT y)
+ {
+ return SetStatus(DllExports::GdipDrawCachedBitmap(
+ nativeGraphics,
+ cb->nativeCachedBitmap,
+ x, y
+ ));
+ }
+
+ /**
+ * Draw images (both bitmap and vector)
+ */
+ // float version
+ Status DrawImage(IN Image* image,
+ IN const PointF& point)
+ {
+ return DrawImage(image, point.X, point.Y);
+ }
+
+ Status DrawImage(IN Image* image,
+ IN REAL x,
+ IN REAL y)
+ {
+ return SetStatus(DllExports::GdipDrawImage(nativeGraphics,
+ image ? image->nativeImage
+ : NULL,
+ x,
+ y));
+ }
+
+ Status DrawImage(IN Image* image,
+ IN const RectF& rect)
+ {
+ return DrawImage(image, rect.X, rect.Y, rect.Width, rect.Height);
+ }
+
+ Status DrawImage(IN Image* image,
+ IN REAL x,
+ IN REAL y,
+ IN REAL width,
+ IN REAL height)
+ {
+ return SetStatus(DllExports::GdipDrawImageRect(nativeGraphics,
+ image ? image->nativeImage
+ : NULL,
+ x,
+ y,
+ width,
+ height));
+ }
+
+ // integer version
+ Status DrawImage(IN Image* image,
+ IN const Point& point)
+ {
+ return DrawImage(image, point.X, point.Y);
+ }
+
+ Status DrawImage(IN Image* image,
+ IN INT x,
+ IN INT y)
+ {
+ return SetStatus(DllExports::GdipDrawImageI(nativeGraphics,
+ image ? image->nativeImage
+ : NULL,
+ x,
+ y));
+ }
+
+ Status DrawImage(IN Image* image,
+ IN const Rect& rect)
+ {
+ return DrawImage(image,
+ rect.X,
+ rect.Y,
+ rect.Width,
+ rect.Height);
+ }
+
+ Status DrawImage(IN Image* image,
+ IN INT x,
+ IN INT y,
+ IN INT width,
+ IN INT height) {
+ return SetStatus(DllExports::GdipDrawImageRectI(nativeGraphics,
+ image ? image->nativeImage
+ : NULL,
+ x,
+ y,
+ width,
+ height));
+ }
+
+ /**
+ * Affine or perspective blt
+ * destPoints.length = 3: rect => parallelogram
+ * destPoints[0] <=> top-left corner of the source rectangle
+ * destPoints[1] <=> top-right corner
+ * destPoints[2] <=> bottom-left corner
+ * destPoints.length = 4: rect => quad
+ * destPoints[3] <=> bottom-right corner
+ *
+ * @notes Perspective blt only works for bitmap images.
+ */
+ Status DrawImage(IN Image* image,
+ IN const PointF* destPoints,
+ IN INT count)
+ {
+ if (count != 3 && count != 4)
+ return SetStatus(InvalidParameter);
+
+ return SetStatus(DllExports::GdipDrawImagePoints(nativeGraphics,
+ image ? image->nativeImage
+ : NULL,
+ destPoints, count));
+ }
+
+ Status DrawImage(IN Image* image,
+ IN const Point* destPoints,
+ IN INT count)
+ {
+ if (count != 3 && count != 4)
+ return SetStatus(InvalidParameter);
+
+ return SetStatus(DllExports::GdipDrawImagePointsI(nativeGraphics,
+ image ? image->nativeImage
+ : NULL,
+ destPoints,
+ count));
+ }
+
+ /**
+ * We need another set of methods similar to the ones above
+ * that take an additional Rect parameter to specify the
+ * portion of the source image to be drawn.
+ */
+ // float version
+ Status DrawImage(IN Image* image,
+ IN REAL x,
+ IN REAL y,
+ IN REAL srcx,
+ IN REAL srcy,
+ IN REAL srcwidth,
+ IN REAL srcheight,
+ IN Unit srcUnit)
+ {
+ return SetStatus(DllExports::GdipDrawImagePointRect(nativeGraphics,
+ image ? image->nativeImage
+ : NULL,
+ x, y,
+ srcx, srcy,
+ srcwidth, srcheight, srcUnit));
+ }
+
+ Status DrawImage(IN Image* image,
+ IN const RectF& destRect,
+ IN REAL srcx,
+ IN REAL srcy,
+ IN REAL srcwidth,
+ IN REAL srcheight,
+ IN Unit srcUnit,
+ IN const ImageAttributes* imageAttributes = NULL,
+ IN DrawImageAbort callback = NULL,
+ IN VOID* callbackData = NULL)
+ {
+ return SetStatus(DllExports::GdipDrawImageRectRect(nativeGraphics,
+ image ? image->nativeImage
+ : NULL,
+ destRect.X,
+ destRect.Y,
+ destRect.Width,
+ destRect.Height,
+ srcx, srcy,
+ srcwidth, srcheight,
+ srcUnit,
+ imageAttributes
+ ? imageAttributes->nativeImageAttr
+ : NULL,
+ callback,
+ callbackData));
+ }
+
+ Status DrawImage(IN Image* image,
+ IN const PointF* destPoints,
+ IN INT count,
+ IN REAL srcx,
+ IN REAL srcy,
+ IN REAL srcwidth,
+ IN REAL srcheight,
+ IN Unit srcUnit,
+ IN const ImageAttributes* imageAttributes = NULL,
+ IN DrawImageAbort callback = NULL,
+ IN VOID* callbackData = NULL)
+ {
+ return SetStatus(DllExports::GdipDrawImagePointsRect(nativeGraphics,
+ image ? image->nativeImage
+ : NULL,
+ destPoints, count,
+ srcx, srcy,
+ srcwidth,
+ srcheight,
+ srcUnit,
+ imageAttributes
+ ? imageAttributes->nativeImageAttr
+ : NULL,
+ callback,
+ callbackData));
+ }
+
+ // integer version
+ Status DrawImage(IN Image* image,
+ IN INT x,
+ IN INT y,
+ IN INT srcx,
+ IN INT srcy,
+ IN INT srcwidth,
+ IN INT srcheight,
+ IN Unit srcUnit)
+ {
+ return SetStatus(DllExports::GdipDrawImagePointRectI(nativeGraphics,
+ image ? image->nativeImage
+ : NULL,
+ x,
+ y,
+ srcx,
+ srcy,
+ srcwidth,
+ srcheight,
+ srcUnit));
+ }
+
+ Status DrawImage(IN Image* image,
+ IN const Rect& destRect,
+ IN INT srcx,
+ IN INT srcy,
+ IN INT srcwidth,
+ IN INT srcheight,
+ IN Unit srcUnit,
+ IN const ImageAttributes* imageAttributes = NULL,
+ IN DrawImageAbort callback = NULL,
+ IN VOID* callbackData = NULL)
+ {
+ return SetStatus(DllExports::GdipDrawImageRectRectI(nativeGraphics,
+ image ? image->nativeImage
+ : NULL,
+ destRect.X,
+ destRect.Y,
+ destRect.Width,
+ destRect.Height,
+ srcx,
+ srcy,
+ srcwidth,
+ srcheight,
+ srcUnit,
+ imageAttributes
+ ? imageAttributes->nativeImageAttr
+ : NULL,
+ callback,
+ callbackData));
+ }
+
+ Status DrawImage(IN Image* image,
+ IN const Point* destPoints,
+ IN INT count,
+ IN INT srcx,
+ IN INT srcy,
+ IN INT srcwidth,
+ IN INT srcheight,
+ IN Unit srcUnit,
+ IN const ImageAttributes* imageAttributes = NULL,
+ IN DrawImageAbort callback = NULL,
+ IN VOID* callbackData = NULL)
+ {
+ return SetStatus(DllExports::GdipDrawImagePointsRectI(nativeGraphics,
+ image ? image->nativeImage
+ : NULL,
+ destPoints,
+ count,
+ srcx,
+ srcy,
+ srcwidth,
+ srcheight,
+ srcUnit,
+ imageAttributes
+ ? imageAttributes->nativeImageAttr
+ : NULL,
+ callback,
+ callbackData));
+ }
+
+ // The following methods are for playing an EMF+ to a graphics
+ // via the enumeration interface. Each record of the EMF+ is
+ // sent to the callback (along with the callbackData). Then
+ // the callback can invoke the Metafile::PlayRecord method
+ // to play the particular record.
+
+ Status
+ EnumerateMetafile(
+ IN const Metafile * metafile,
+ IN const PointF & destPoint,
+ IN EnumerateMetafileProc callback,
+ IN VOID * callbackData = NULL,
+ IN const ImageAttributes * imageAttributes = NULL
+ )
+ {
+ return SetStatus(DllExports::GdipEnumerateMetafileDestPoint(
+ nativeGraphics,
+ (const GpMetafile *)(metafile ? metafile->nativeImage:NULL),
+ destPoint,
+ callback,
+ callbackData,
+ imageAttributes ? imageAttributes->nativeImageAttr : NULL));
+ }
+
+ Status
+ EnumerateMetafile(
+ IN const Metafile * metafile,
+ IN const Point & destPoint,
+ IN EnumerateMetafileProc callback,
+ IN VOID * callbackData = NULL,
+ IN const ImageAttributes * imageAttributes = NULL
+ )
+ {
+ return SetStatus(DllExports::GdipEnumerateMetafileDestPointI(
+ nativeGraphics,
+ (const GpMetafile *)(metafile ? metafile->nativeImage:NULL),
+ destPoint,
+ callback,
+ callbackData,
+ imageAttributes ? imageAttributes->nativeImageAttr : NULL));
+ }
+
+ Status
+ EnumerateMetafile(
+ IN const Metafile * metafile,
+ IN const RectF & destRect,
+ IN EnumerateMetafileProc callback,
+ IN VOID * callbackData = NULL,
+ IN const ImageAttributes * imageAttributes = NULL
+ )
+ {
+ return SetStatus(DllExports::GdipEnumerateMetafileDestRect(
+ nativeGraphics,
+ (const GpMetafile *)(metafile ? metafile->nativeImage:NULL),
+ destRect,
+ callback,
+ callbackData,
+ imageAttributes ? imageAttributes->nativeImageAttr : NULL));
+ }
+
+ Status
+ EnumerateMetafile(
+ IN const Metafile * metafile,
+ IN const Rect & destRect,
+ IN EnumerateMetafileProc callback,
+ IN VOID * callbackData = NULL,
+ IN const ImageAttributes * imageAttributes = NULL
+ )
+ {
+ return SetStatus(DllExports::GdipEnumerateMetafileDestRectI(
+ nativeGraphics,
+ (const GpMetafile *)(metafile ? metafile->nativeImage:NULL),
+ destRect,
+ callback,
+ callbackData,
+ imageAttributes ? imageAttributes->nativeImageAttr : NULL));
+ }
+
+ Status
+ EnumerateMetafile(
+ IN const Metafile * metafile,
+ IN const PointF * destPoints,
+ IN INT count,
+ IN EnumerateMetafileProc callback,
+ IN VOID * callbackData = NULL,
+ IN const ImageAttributes * imageAttributes = NULL
+ )
+ {
+ return SetStatus(DllExports::GdipEnumerateMetafileDestPoints(
+ nativeGraphics,
+ (const GpMetafile *)(metafile ? metafile->nativeImage:NULL),
+ destPoints,
+ count,
+ callback,
+ callbackData,
+ imageAttributes ? imageAttributes->nativeImageAttr : NULL));
+ }
+
+ Status
+ EnumerateMetafile(
+ IN const Metafile * metafile,
+ IN const Point * destPoints,
+ IN INT count,
+ IN EnumerateMetafileProc callback,
+ IN VOID * callbackData = NULL,
+ IN const ImageAttributes * imageAttributes = NULL
+ )
+ {
+ return SetStatus(DllExports::GdipEnumerateMetafileDestPointsI(
+ nativeGraphics,
+ (const GpMetafile *)(metafile ? metafile->nativeImage:NULL),
+ destPoints,
+ count,
+ callback,
+ callbackData,
+ imageAttributes ? imageAttributes->nativeImageAttr : NULL));
+ }
+
+ Status
+ EnumerateMetafile(
+ IN const Metafile * metafile,
+ IN const PointF & destPoint,
+ IN const RectF & srcRect,
+ IN Unit srcUnit,
+ IN EnumerateMetafileProc callback,
+ IN VOID * callbackData = NULL,
+ IN const ImageAttributes * imageAttributes = NULL
+ )
+ {
+ return SetStatus(DllExports::GdipEnumerateMetafileSrcRectDestPoint(
+ nativeGraphics,
+ (const GpMetafile *)(metafile ? metafile->nativeImage:NULL),
+ destPoint,
+ srcRect,
+ srcUnit,
+ callback,
+ callbackData,
+ imageAttributes ? imageAttributes->nativeImageAttr : NULL));
+ }
+
+ Status
+ EnumerateMetafile(
+ IN const Metafile * metafile,
+ IN const Point & destPoint,
+ IN const Rect & srcRect,
+ IN Unit srcUnit,
+ IN EnumerateMetafileProc callback,
+ IN VOID * callbackData = NULL,
+ IN const ImageAttributes * imageAttributes = NULL
+ )
+ {
+ return SetStatus(DllExports::GdipEnumerateMetafileSrcRectDestPointI(
+ nativeGraphics,
+ (const GpMetafile *)(metafile ? metafile->nativeImage:NULL),
+ destPoint,
+ srcRect,
+ srcUnit,
+ callback,
+ callbackData,
+ imageAttributes ? imageAttributes->nativeImageAttr : NULL));
+ }
+
+ Status
+ EnumerateMetafile(
+ IN const Metafile * metafile,
+ IN const RectF & destRect,
+ IN const RectF & srcRect,
+ IN Unit srcUnit,
+ IN EnumerateMetafileProc callback,
+ IN VOID * callbackData = NULL,
+ IN const ImageAttributes * imageAttributes = NULL
+ )
+ {
+ return SetStatus(DllExports::GdipEnumerateMetafileSrcRectDestRect(
+ nativeGraphics,
+ (const GpMetafile *)(metafile ? metafile->nativeImage:NULL),
+ destRect,
+ srcRect,
+ srcUnit,
+ callback,
+ callbackData,
+ imageAttributes ? imageAttributes->nativeImageAttr : NULL));
+ }
+
+ Status
+ EnumerateMetafile(
+ IN const Metafile * metafile,
+ IN const Rect & destRect,
+ IN const Rect & srcRect,
+ IN Unit srcUnit,
+ IN EnumerateMetafileProc callback,
+ IN VOID * callbackData = NULL,
+ IN const ImageAttributes * imageAttributes = NULL
+ )
+ {
+ return SetStatus(DllExports::GdipEnumerateMetafileSrcRectDestRectI(
+ nativeGraphics,
+ (const GpMetafile *)(metafile ? metafile->nativeImage:NULL),
+ destRect,
+ srcRect,
+ srcUnit,
+ callback,
+ callbackData,
+ imageAttributes ? imageAttributes->nativeImageAttr : NULL));
+ }
+
+ Status
+ EnumerateMetafile(
+ IN const Metafile * metafile,
+ IN const PointF * destPoints,
+ IN INT count,
+ IN const RectF & srcRect,
+ IN Unit srcUnit,
+ IN EnumerateMetafileProc callback,
+ IN VOID * callbackData = NULL,
+ IN const ImageAttributes * imageAttributes = NULL
+ )
+ {
+ return SetStatus(DllExports::GdipEnumerateMetafileSrcRectDestPoints(
+ nativeGraphics,
+ (const GpMetafile *)(metafile ? metafile->nativeImage:NULL),
+ destPoints,
+ count,
+ srcRect,
+ srcUnit,
+ callback,
+ callbackData,
+ imageAttributes ? imageAttributes->nativeImageAttr : NULL));
+ }
+
+ Status
+ EnumerateMetafile(
+ IN const Metafile * metafile,
+ IN const Point * destPoints,
+ IN INT count,
+ IN const Rect & srcRect,
+ IN Unit srcUnit,
+ IN EnumerateMetafileProc callback,
+ IN VOID * callbackData = NULL,
+ IN const ImageAttributes * imageAttributes = NULL
+ )
+ {
+ return SetStatus(DllExports::GdipEnumerateMetafileSrcRectDestPointsI(
+ nativeGraphics,
+ (const GpMetafile *)(metafile ? metafile->nativeImage:NULL),
+ destPoints,
+ count,
+ srcRect,
+ srcUnit,
+ callback,
+ callbackData,
+ imageAttributes ? imageAttributes->nativeImageAttr : NULL));
+ }
+
+ /**
+ * Clipping region operations
+ *
+ * @notes Simply incredible redundancy here.
+ */
+ Status SetClip(IN const Graphics* g,
+ IN CombineMode combineMode = CombineModeReplace)
+ {
+ return SetStatus(DllExports::GdipSetClipGraphics(nativeGraphics,
+ g->nativeGraphics,
+ combineMode));
+ }
+
+ Status SetClip(IN const RectF& rect,
+ IN CombineMode combineMode = CombineModeReplace)
+ {
+ return SetStatus(DllExports::GdipSetClipRect(nativeGraphics,
+ rect.X, rect.Y,
+ rect.Width, rect.Height,
+ combineMode));
+ }
+
+ Status SetClip(IN const Rect& rect,
+ IN CombineMode combineMode = CombineModeReplace)
+ {
+ return SetStatus(DllExports::GdipSetClipRectI(nativeGraphics,
+ rect.X, rect.Y,
+ rect.Width, rect.Height,
+ combineMode));
+ }
+
+ Status SetClip(IN const GraphicsPath* path,
+ IN CombineMode combineMode = CombineModeReplace)
+ {
+ return SetStatus(DllExports::GdipSetClipPath(nativeGraphics,
+ path->nativePath,
+ combineMode));
+ }
+
+ Status SetClip(IN const Region* region,
+ IN CombineMode combineMode = CombineModeReplace)
+ {
+ return SetStatus(DllExports::GdipSetClipRegion(nativeGraphics,
+ region->nativeRegion,
+ combineMode));
+ }
+
+ // This is different than the other SetClip methods because it assumes
+ // that the HRGN is already in device units, so it doesn't transform
+ // the coordinates in the HRGN.
+ Status SetClip(IN HRGN hRgn,
+ IN CombineMode combineMode = CombineModeReplace)
+ {
+ return SetStatus(DllExports::GdipSetClipHrgn(nativeGraphics, hRgn,
+ combineMode));
+ }
+
+ Status IntersectClip(IN const RectF& rect)
+ {
+ return SetStatus(DllExports::GdipSetClipRect(nativeGraphics,
+ rect.X, rect.Y,
+ rect.Width, rect.Height,
+ CombineModeIntersect));
+ }
+
+ Status IntersectClip(IN const Rect& rect)
+ {
+ return SetStatus(DllExports::GdipSetClipRectI(nativeGraphics,
+ rect.X, rect.Y,
+ rect.Width, rect.Height,
+ CombineModeIntersect));
+ }
+
+ Status IntersectClip(IN const Region* region)
+ {
+ return SetStatus(DllExports::GdipSetClipRegion(nativeGraphics,
+ region->nativeRegion,
+ CombineModeIntersect));
+ }
+
+ Status ExcludeClip(IN const RectF& rect)
+ {
+ return SetStatus(DllExports::GdipSetClipRect(nativeGraphics,
+ rect.X, rect.Y,
+ rect.Width, rect.Height,
+ CombineModeExclude));
+ }
+
+ Status ExcludeClip(IN const Rect& rect)
+ {
+ return SetStatus(DllExports::GdipSetClipRectI(nativeGraphics,
+ rect.X, rect.Y,
+ rect.Width, rect.Height,
+ CombineModeExclude));
+ }
+
+ Status ExcludeClip(IN const Region* region)
+ {
+ return SetStatus(DllExports::GdipSetClipRegion(nativeGraphics,
+ region->nativeRegion,
+ CombineModeExclude));
+ }
+
+ Status ResetClip()
+ {
+ return SetStatus(DllExports::GdipResetClip(nativeGraphics));
+ }
+
+ Status TranslateClip(IN REAL dx,
+ IN REAL dy)
+ {
+ return SetStatus(DllExports::GdipTranslateClip(nativeGraphics, dx, dy));
+ }
+
+ Status TranslateClip(IN INT dx,
+ IN INT dy)
+ {
+ return SetStatus(DllExports::GdipTranslateClipI(nativeGraphics,
+ dx, dy));
+ }
+
+ /**
+ * GetClip region from graphics context
+ */
+ Status GetClip(OUT Region* region) const
+ {
+ return SetStatus(DllExports::GdipGetClip(nativeGraphics,
+ region->nativeRegion));
+ }
+
+ /**
+ * Hit testing operations
+ */
+ Status GetClipBounds(OUT RectF* rect) const
+ {
+ return SetStatus(DllExports::GdipGetClipBounds(nativeGraphics, rect));
+ }
+
+ Status GetClipBounds(OUT Rect* rect) const
+ {
+ return SetStatus(DllExports::GdipGetClipBoundsI(nativeGraphics, rect));
+ }
+
+ BOOL IsClipEmpty() const
+ {
+ BOOL booln = FALSE;
+
+ SetStatus(DllExports::GdipIsClipEmpty(nativeGraphics, &booln));
+
+ return booln;
+ }
+
+ Status GetVisibleClipBounds(OUT RectF *rect) const
+ {
+
+ return SetStatus(DllExports::GdipGetVisibleClipBounds(nativeGraphics,
+ rect));
+ }
+
+ Status GetVisibleClipBounds(OUT Rect *rect) const
+ {
+ return SetStatus(DllExports::GdipGetVisibleClipBoundsI(nativeGraphics,
+ rect));
+ }
+
+ BOOL IsVisibleClipEmpty() const
+ {
+ BOOL booln = FALSE;
+
+ SetStatus(DllExports::GdipIsVisibleClipEmpty(nativeGraphics, &booln));
+
+ return booln;
+ }
+
+ BOOL IsVisible(IN INT x,
+ IN INT y) const
+ {
+ return IsVisible(Point(x,y));
+ }
+
+ BOOL IsVisible(IN const Point& point) const
+ {
+ BOOL booln = FALSE;
+
+ SetStatus(DllExports::GdipIsVisiblePointI(nativeGraphics,
+ point.X,
+ point.Y,
+ &booln));
+
+ return booln;
+ }
+
+ BOOL IsVisible(IN INT x,
+ IN INT y,
+ IN INT width,
+ IN INT height) const
+ {
+ return IsVisible(Rect(x, y, width, height));
+ }
+
+ BOOL IsVisible(IN const Rect& rect) const
+ {
+
+ BOOL booln = TRUE;
+
+ SetStatus(DllExports::GdipIsVisibleRectI(nativeGraphics,
+ rect.X,
+ rect.Y,
+ rect.Width,
+ rect.Height,
+ &booln));
+ return booln;
+ }
+
+ BOOL IsVisible(IN REAL x,
+ IN REAL y) const
+ {
+ return IsVisible(PointF(x, y));
+ }
+
+ BOOL IsVisible(IN const PointF& point) const
+ {
+ BOOL booln = FALSE;
+
+ SetStatus(DllExports::GdipIsVisiblePoint(nativeGraphics,
+ point.X,
+ point.Y,
+ &booln));
+
+ return booln;
+ }
+
+ BOOL IsVisible(IN REAL x,
+ IN REAL y,
+ IN REAL width,
+ IN REAL height) const
+ {
+ return IsVisible(RectF(x, y, width, height));
+ }
+
+ BOOL IsVisible(IN const RectF& rect) const
+ {
+ BOOL booln = TRUE;
+
+ SetStatus(DllExports::GdipIsVisibleRect(nativeGraphics,
+ rect.X,
+ rect.Y,
+ rect.Width,
+ rect.Height,
+ &booln));
+ return booln;
+ }
+
+ /**
+ * Save/restore graphics state
+ */
+ GraphicsState Save() const
+ {
+ GraphicsState gstate;
+
+ SetStatus(DllExports::GdipSaveGraphics(nativeGraphics, &gstate));
+
+ return gstate;
+ }
+
+ Status Restore(IN GraphicsState gstate)
+ {
+ return SetStatus(DllExports::GdipRestoreGraphics(nativeGraphics,
+ gstate));
+ }
+
+ /**
+ * Begin and end container drawing
+ */
+ GraphicsContainer BeginContainer(IN const RectF &dstrect,
+ IN const RectF &srcrect,
+ IN Unit unit)
+ {
+ GraphicsContainer state;
+
+ SetStatus(DllExports::GdipBeginContainer(nativeGraphics, &dstrect,
+ &srcrect, unit, &state));
+
+ return state;
+ }
+
+ /**
+ * Begin and end container drawing
+ */
+ GraphicsContainer BeginContainer(IN const Rect &dstrect,
+ IN const Rect &srcrect,
+ IN Unit unit)
+ {
+ GraphicsContainer state;
+
+ SetStatus(DllExports::GdipBeginContainerI(nativeGraphics, &dstrect,
+ &srcrect, unit, &state));
+
+ return state;
+ }
+
+ GraphicsContainer BeginContainer()
+ {
+ GraphicsContainer state;
+
+ SetStatus(DllExports::GdipBeginContainer2(nativeGraphics, &state));
+
+ return state;
+ }
+
+ Status EndContainer(IN GraphicsContainer state)
+ {
+ return SetStatus(DllExports::GdipEndContainer(nativeGraphics, state));
+ }
+
+ // only valid when recording metafiles
+ Status AddMetafileComment(IN const BYTE * data,
+ IN UINT sizeData)
+ {
+ return SetStatus(DllExports::GdipComment(nativeGraphics, sizeData, data));
+ }
+
+ /**
+ * Get/SetLayout
+ * Support for Middle East localization (right-to-left mirroring)
+ */
+ GraphicsLayout GetLayout() const
+ {
+ GraphicsLayout layout;
+
+ SetStatus(DllExports::GdipGetGraphicsLayout(nativeGraphics, &layout));
+
+ return layout;
+ }
+
+ Status SetLayout(IN const GraphicsLayout layout)
+ {
+ return SetStatus(
+ DllExports::GdipSetGraphicsLayout(nativeGraphics, layout)
+ );
+ }
+
+ static HPALETTE GetHalftonePalette()
+ {
+ return DllExports::GdipCreateHalftonePalette();
+ }
+
+ Status GetLastStatus() const
+ {
+ Status lastStatus = lastResult;
+ lastResult = Ok;
+
+ return lastStatus;
+ }
+
+protected:
+
+#ifdef DCR_USE_NEW_250932
+
+private:
+ Graphics(const Graphics &);
+ Graphics& operator=(const Graphics &);
+protected:
+
+#else
+
+ Graphics(const Graphics& graphics)
+ {
+ graphics;
+ SetStatus(NotImplemented);
+ }
+
+ Graphics& operator=(const Graphics& graphics)
+ {
+ graphics;
+ SetStatus(NotImplemented);
+ return *this;
+ }
+
+#endif
+
+ Graphics(GpGraphics* graphics)
+ {
+ lastResult = Ok;
+ SetNativeGraphics(graphics);
+ }
+
+ VOID SetNativeGraphics(GpGraphics *graphics)
+ {
+ this->nativeGraphics = graphics;
+ }
+
+ Status SetStatus(Status status) const
+ {
+ if (status != Ok)
+ return (lastResult = status);
+ else
+ return status;
+ }
+
+ // Methods necessary to subclass Graphics for extension test.
+
+ GpGraphics* GetNativeGraphics() const
+ {
+ return this->nativeGraphics;
+ }
+
+ GpPen* GetNativePen(const Pen* pen)
+ {
+ return pen->nativePen;
+ }
+
+protected:
+ GpGraphics* nativeGraphics;
+ mutable Status lastResult;
+
+};
+
+//----------------------------------------------------------------------------
+// Extra implementation of GraphicsPath methods that use Graphics
+//----------------------------------------------------------------------------
+
+/**
+ * Get the bounds of the path object with the given transform.
+ * This is not always the tightest bounds.
+ */
+
+inline Status
+GraphicsPath::GetBounds(
+ OUT RectF* bounds,
+ IN const Matrix* matrix,
+ IN const Pen* pen) const
+{
+ GpMatrix* nativeMatrix = NULL;
+ GpPen* nativePen = NULL;
+
+ if (matrix)
+ nativeMatrix = matrix->nativeMatrix;
+
+ if (pen)
+ nativePen = pen->nativePen;
+
+ return SetStatus(DllExports::GdipGetPathWorldBounds(nativePath, bounds,
+ nativeMatrix, nativePen));
+}
+
+// integer version
+inline Status
+GraphicsPath::GetBounds(
+ OUT Rect* bounds,
+ IN const Matrix* matrix,
+ IN const Pen* pen
+) const
+{
+ GpMatrix* nativeMatrix = NULL;
+ GpPen* nativePen = NULL;
+
+ if (matrix)
+ nativeMatrix = matrix->nativeMatrix;
+
+ if (pen)
+ nativePen = pen->nativePen;
+
+ return SetStatus(DllExports::GdipGetPathWorldBoundsI(nativePath, bounds,
+ nativeMatrix, nativePen));
+}
+
+//----------------------------------------------------------------------------
+// Hit testing operations
+//----------------------------------------------------------------------------
+
+inline BOOL
+GraphicsPath::IsVisible(
+ IN REAL x,
+ IN REAL y,
+ IN const Graphics* g) const
+{
+ BOOL booln = FALSE;
+
+ GpGraphics* nativeGraphics = NULL;
+
+ if (g)
+ nativeGraphics = g->nativeGraphics;
+
+ SetStatus(DllExports::GdipIsVisiblePathPoint(nativePath,
+ x, y, nativeGraphics,
+ &booln));
+ return booln;
+}
+
+inline BOOL
+GraphicsPath::IsVisible(
+ IN INT x,
+ IN INT y,
+ IN const Graphics* g) const
+{
+ BOOL booln = FALSE;
+
+ GpGraphics* nativeGraphics = NULL;
+
+ if (g)
+ nativeGraphics = g->nativeGraphics;
+
+ SetStatus(DllExports::GdipIsVisiblePathPointI(nativePath,
+ x, y, nativeGraphics,
+ &booln));
+ return booln;
+}
+
+inline BOOL
+GraphicsPath::IsOutlineVisible(
+ IN REAL x,
+ IN REAL y,
+ IN const Pen* pen,
+ IN const Graphics* g) const
+{
+ BOOL booln = FALSE;
+
+ GpGraphics* nativeGraphics = NULL;
+ GpPen* nativePen = NULL;
+
+ if(g)
+ nativeGraphics = g->nativeGraphics;
+ if(pen)
+ nativePen = pen->nativePen;
+
+ SetStatus(DllExports::GdipIsOutlineVisiblePathPoint(nativePath,
+ x, y, nativePen, nativeGraphics,
+ &booln));
+ return booln;
+}
+
+inline BOOL
+GraphicsPath::IsOutlineVisible(
+ IN INT x,
+ IN INT y,
+ IN const Pen* pen,
+ IN const Graphics* g) const
+{
+ BOOL booln = FALSE;
+
+ GpGraphics* nativeGraphics = NULL;
+ GpPen* nativePen = NULL;
+
+ if(g)
+ nativeGraphics = g->nativeGraphics;
+ if(pen)
+ nativePen = pen->nativePen;
+
+ SetStatus(DllExports::GdipIsOutlineVisiblePathPointI(nativePath,
+ x, y, nativePen, nativeGraphics,
+ &booln));
+ return booln;
+}
+
+#endif
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusHeaders.h b/core/src/fxge/Microsoft SDK/include/GdiPlusHeaders.h
index 215c4d09ea..9efcd89da2 100644
--- a/core/src/fxge/Microsoft SDK/include/GdiPlusHeaders.h
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusHeaders.h
@@ -1,793 +1,793 @@
-/**************************************************************************\
-*
-* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
-*
-* Module Name:
-*
-* GdiplusHeaders.h
-*
-* Abstract:
-*
-* GDI+ Native C++ public header file
-*
-\**************************************************************************/
-
-#ifndef _GDIPLUSHEADERS_H
-#define _GDIPLUSHEADERS_H
-
-//--------------------------------------------------------------------------
-// Abstract base class for regions
-//--------------------------------------------------------------------------
-
-// Include the class declarations here and have inline class implementation
-// in separate file to avoid circular references.
-
-class Region : public GdiplusBase
-{
-public:
- friend class Graphics;
-
- Region();
- Region(IN const RectF& rect);
- Region(IN const Rect& rect);
- Region(IN const GraphicsPath* path);
- Region(IN const BYTE* regionData, IN INT size);
- Region(IN HRGN hRgn);
- static Region* FromHRGN(IN HRGN hRgn);
-
- ~Region();
- Region* Clone() const;
-
- Status MakeInfinite();
- Status MakeEmpty();
-
- // Get the size of the buffer needed for the GetData method
- UINT GetDataSize() const;
-
- // buffer - where to put the data
- // bufferSize - how big the buffer is (should be at least as big as GetDataSize())
- // sizeFilled - if not NULL, this is an OUT param that says how many bytes
- // of data were written to the buffer.
- Status GetData(OUT BYTE* buffer,
- IN UINT bufferSize,
- OUT UINT* sizeFilled = NULL) const;
-
- Status Intersect(IN const Rect& rect);
- Status Intersect(IN const RectF& rect);
- Status Intersect(IN const GraphicsPath* path);
- Status Intersect(IN const Region* region);
- Status Union(IN const Rect& rect);
- Status Union(IN const RectF& rect);
- Status Union(IN const GraphicsPath* path);
- Status Union(IN const Region* region);
- Status Xor(IN const Rect& rect);
- Status Xor(IN const RectF& rect);
- Status Xor(IN const GraphicsPath* path);
- Status Xor(IN const Region* region);
- Status Exclude(IN const Rect& rect);
- Status Exclude(IN const RectF& rect);
- Status Exclude(IN const GraphicsPath* path);
- Status Exclude(IN const Region* region);
- Status Complement(IN const Rect& rect);
- Status Complement(IN const RectF& rect);
- Status Complement(IN const GraphicsPath* path);
- Status Complement(IN const Region* region);
- Status Translate(IN REAL dx,
- IN REAL dy);
- Status Translate(IN INT dx,
- IN INT dy);
- Status Transform(IN const Matrix* matrix);
-
- Status GetBounds(OUT Rect* rect,
- IN const Graphics* g) const;
-
- Status GetBounds(OUT RectF* rect,
- IN const Graphics* g) const;
-
- HRGN GetHRGN (IN const Graphics * g) const;
-
- BOOL IsEmpty(IN const Graphics *g) const;
- BOOL IsInfinite(IN const Graphics *g) const;
-
- BOOL IsVisible(IN INT x,
- IN INT y,
- IN const Graphics* g = NULL) const
- {
- return IsVisible(Point(x, y), g);
- }
-
- BOOL IsVisible(IN const Point& point,
- IN const Graphics* g = NULL) const;
-
- BOOL IsVisible(IN REAL x,
- IN REAL y,
- IN const Graphics* g = NULL) const
- {
- return IsVisible(PointF(x, y), g);
- }
-
- BOOL IsVisible(IN const PointF& point,
- IN const Graphics* g = NULL) const;
-
- BOOL IsVisible(IN INT x,
- IN INT y,
- IN INT width,
- IN INT height,
- IN const Graphics* g) const
- {
- return IsVisible(Rect(x, y, width, height), g);
- }
-
- BOOL IsVisible(IN const Rect& rect,
- IN const Graphics* g = NULL) const;
-
- BOOL IsVisible(IN REAL x,
- IN REAL y,
- IN REAL width,
- IN REAL height,
- IN const Graphics* g = NULL) const
- {
- return IsVisible(RectF(x, y, width, height), g);
- }
-
- BOOL IsVisible(IN const RectF& rect,
- IN const Graphics* g = NULL) const;
-
- BOOL Equals(IN const Region* region,
- IN const Graphics* g) const;
-
- UINT GetRegionScansCount(IN const Matrix* matrix) const;
- Status GetRegionScans(IN const Matrix* matrix,
- OUT RectF* rects,
- OUT INT* count) const;
- Status GetRegionScans(IN const Matrix* matrix,
- OUT Rect* rects,
- OUT INT* count) const;
- Status GetLastStatus() const;
-
-protected:
-
-#ifdef DCR_USE_NEW_250932
-
-private:
- Region(const Region &region);
- Region& operator=(const Region &region);
-protected:
-
-#else
- Region(const Region &region)
- {
- region; // reference parameter
- SetStatus(NotImplemented);
- }
-
- Region& operator=(const Region &region)
- {
- region; // reference parameter
- SetStatus(NotImplemented);
- return *this;
- }
-#endif
-
- Status SetStatus(Status status) const
- {
- if (status != Ok)
- return (lastResult = status);
- else
- return status;
- }
-
- Region(GpRegion* nativeRegion);
-
- VOID SetNativeRegion(GpRegion* nativeRegion);
-
-protected:
- GpRegion* nativeRegion;
- mutable Status lastResult;
-};
-
-
-//--------------------------------------------------------------------------
-// Abstract base class for FontFamily
-//--------------------------------------------------------------------------
-
-class FontFamily : public GdiplusBase
-{
-public:
- friend class Font;
- friend class Graphics;
- friend class GraphicsPath;
- friend class FontCollection;
-
- FontFamily();
-
- FontFamily(
- IN const WCHAR *name,
- IN const FontCollection *fontCollection = NULL
- );
-
- ~FontFamily();
-
- static const FontFamily *GenericSansSerif();
- static const FontFamily *GenericSerif();
- static const FontFamily *GenericMonospace();
-
- Status GetFamilyName(
- OUT WCHAR name[LF_FACESIZE],
- IN LANGID language = 0
- ) const;
-
-// Copy operator
- FontFamily * Clone() const;
-
- BOOL IsAvailable() const
- {
- return (nativeFamily != NULL);
- };
-
- BOOL IsStyleAvailable(IN INT style) const;
-
- UINT16 GetEmHeight (IN INT style) const;
- UINT16 GetCellAscent (IN INT style) const;
- UINT16 GetCellDescent (IN INT style) const;
- UINT16 GetLineSpacing (IN INT style) const;
-
- ///////////////////////////////////////////////////////////
-
- Status GetLastStatus() const;
-
-#ifdef DCR_USE_NEW_250932
-
-private:
- FontFamily(const FontFamily &);
- FontFamily& operator=(const FontFamily &);
-
-#endif
-
-protected:
- Status SetStatus(Status status) const;
-
- // private constructor for copy
- FontFamily(GpFontFamily * nativeFamily, Status status);
-
-///////////////////////////////////////
-// Data members
-protected:
-
- GpFontFamily *nativeFamily;
- mutable Status lastResult;
-};
-
-static FontFamily *GenericSansSerifFontFamily = NULL;
-static FontFamily *GenericSerifFontFamily = NULL;
-static FontFamily *GenericMonospaceFontFamily = NULL;
-
-static BYTE GenericSansSerifFontFamilyBuffer[sizeof(FontFamily)] = {0};
-static BYTE GenericSerifFontFamilyBuffer [sizeof(FontFamily)] = {0};
-static BYTE GenericMonospaceFontFamilyBuffer[sizeof(FontFamily)] = {0};
-
-
-//--------------------------------------------------------------------------
-// Abstract base class for fonts
-//--------------------------------------------------------------------------
-
-class Font : public GdiplusBase
-{
-public:
- friend class Graphics;
-
- Font(IN HDC hdc);
- Font(IN HDC hdc,
- IN const LOGFONTA* logfont);
- Font(IN HDC hdc,
- IN const LOGFONTW* logfont);
-#ifdef DCR_USE_NEW_127084
- Font(IN HDC hdc,
- IN const HFONT hfont);
-#endif
- Font(
- IN const FontFamily * family,
- IN REAL emSize,
- IN INT style = FontStyleRegular,
- IN Unit unit = UnitPoint
- );
-
- Font(
- IN const WCHAR * familyName,
- IN REAL emSize,
- IN INT style = FontStyleRegular,
- IN Unit unit = UnitPoint,
- IN const FontCollection * fontCollection = NULL
- );
-
- Status GetLogFontA(IN const Graphics* g,
- OUT LOGFONTA * logfontA) const;
- Status GetLogFontW(IN const Graphics* g,
- OUT LOGFONTW * logfontW) const;
-
- Font* Clone() const;
- ~Font();
- BOOL IsAvailable() const;
- INT GetStyle() const;
- REAL GetSize() const;
- Unit GetUnit() const;
- Status GetLastStatus() const;
- REAL GetHeight(IN const Graphics *graphics = NULL) const;
-#ifdef DCR_USE_NEW_125467
- REAL GetHeight(IN REAL dpi) const;
-#endif
-
- Status GetFamily(OUT FontFamily *family) const;
-
-#ifdef DCR_USE_NEW_250932
-
-private:
- Font(const Font &);
- Font& operator=(const Font &);
-
-#endif
-
-protected:
- Font(GpFont* font, Status status);
- VOID SetNativeFont(GpFont *Font);
- Status SetStatus(Status status) const;
-
-protected:
- /*
- * handle to native line texture object
- */
-
- GpFont* nativeFont;
- mutable Status lastResult;
-};
-
-//--------------------------------------------------------------------------
-// Abstract base classes for font collections
-//--------------------------------------------------------------------------
-
-class FontCollection : public GdiplusBase
-{
-public:
- friend class FontFamily;
-
- FontCollection();
- virtual ~FontCollection();
-
- INT GetFamilyCount() const; // number of enumerable families in the collection
-
- Status GetFamilies( // enumerate the fonts in a collection
- IN INT numSought,
- OUT FontFamily * gpfamilies,
- OUT INT * numFound
- ) const;
-
- Status GetLastStatus() const;
-
-#ifdef DCR_USE_NEW_250932
-
-private:
- FontCollection(const FontCollection &);
- FontCollection& operator=(const FontCollection &);
-
-#endif
-
-protected:
- Status SetStatus(Status status) const ;
-
- GpFontCollection *nativeFontCollection;
- mutable Status lastResult;
-};
-
-
-class InstalledFontCollection : public FontCollection
-{
-public:
- InstalledFontCollection();
- ~InstalledFontCollection();
-
-#ifdef DCR_USE_NEW_250932
-
-private:
- InstalledFontCollection(const InstalledFontCollection &);
- InstalledFontCollection& operator=(const InstalledFontCollection &);
-
-#endif
-
-protected:
-#ifndef DCR_USE_NEW_235072
- Status InstallFontFile(IN const WCHAR* filename);
- Status UninstallFontFile(IN const WCHAR* filename);
-#endif
- Status SetStatus(Status status) const ;
-};
-
-
-class PrivateFontCollection : public FontCollection
-{
-public:
- PrivateFontCollection();
- ~PrivateFontCollection();
-
- Status AddFontFile(IN const WCHAR* filename);
- Status AddMemoryFont(IN const VOID* memory,
- IN INT length);
-
-#ifdef DCR_USE_NEW_250932
-
-private:
- PrivateFontCollection(const PrivateFontCollection &);
- PrivateFontCollection& operator=(const PrivateFontCollection &);
-
-#endif
-};
-
-
-//--------------------------------------------------------------------------
-// Abstract base class for bitmap image and metafile
-//--------------------------------------------------------------------------
-
-// !!! Note:
-// Include the class declarations here and have the inline class
-// implementation in a separate file. This is done to resolve a
-// circular dependency since one of the Bitmap methods needs to
-// access the private member nativeGraphics of the Graphics object.
-
-class Image : public GdiplusBase
-{
-public:
- friend class Brush;
- friend class TextureBrush;
- friend class Graphics;
-
-#ifndef DCR_USE_NEW_140782
- Image(
- IN const WCHAR* filename
- );
-
- Image(
- IN IStream* stream
- );
-
- static Image* FromFile(
- IN const WCHAR* filename
- );
-
- static Image* FromStream(
- IN IStream* stream
- );
-#else
- Image(
- IN const WCHAR* filename,
- IN BOOL useEmbeddedColorManagement = FALSE
- );
-
- Image(
- IN IStream* stream,
- IN BOOL useEmbeddedColorManagement = FALSE
- );
-
- static Image* FromFile(
- IN const WCHAR* filename,
- IN BOOL useEmbeddedColorManagement = FALSE
- );
-
- static Image* FromStream(
- IN IStream* stream,
- IN BOOL useEmbeddedColorManagement = FALSE
- );
-#endif
-
- virtual ~Image();
- virtual Image* Clone();
-
- Status Save(IN const WCHAR* filename,
- IN const CLSID* clsidEncoder,
- IN const EncoderParameters *encoderParams = NULL);
- Status Save(IN IStream* stream,
- IN const CLSID* clsidEncoder,
- IN const EncoderParameters *encoderParams = NULL);
- Status SaveAdd(IN const EncoderParameters* encoderParams);
- Status SaveAdd(IN Image* newImage,
- IN const EncoderParameters* encoderParams);
-
- ImageType GetType() const;
- Status GetPhysicalDimension(OUT SizeF* size);
- Status GetBounds(OUT RectF* srcRect,
- OUT Unit* srcUnit);
-
- UINT GetWidth();
- UINT GetHeight();
- REAL GetHorizontalResolution();
- REAL GetVerticalResolution();
- UINT GetFlags();
- Status GetRawFormat(OUT GUID *format);
- PixelFormat GetPixelFormat();
-
- INT GetPaletteSize();
- Status GetPalette(OUT ColorPalette* palette,
- IN INT size);
- Status SetPalette(IN const ColorPalette* palette);
-
- Image* GetThumbnailImage(IN UINT thumbWidth,
- IN UINT thumbHeight,
- IN GetThumbnailImageAbort callback = NULL,
- IN VOID* callbackData = NULL);
- UINT GetFrameDimensionsCount();
- Status GetFrameDimensionsList(OUT GUID* dimensionIDs,
- IN UINT count);
- UINT GetFrameCount(IN const GUID* dimensionID);
- Status SelectActiveFrame(IN const GUID* dimensionID,
- IN UINT frameIndex);
- Status RotateFlip(IN RotateFlipType rotateFlipType);
- UINT GetPropertyCount();
- Status GetPropertyIdList(IN UINT numOfProperty,
- OUT PROPID* list);
- UINT GetPropertyItemSize(IN PROPID propId);
- Status GetPropertyItem(IN PROPID propId,
- IN UINT propSize,
- OUT PropertyItem* buffer);
- Status GetPropertySize(OUT UINT* totalBufferSize,
- OUT UINT* numProperties);
- Status GetAllPropertyItems(IN UINT totalBufferSize,
- IN UINT numProperties,
- OUT PropertyItem* allItems);
- Status RemovePropertyItem(IN PROPID propId);
- Status SetPropertyItem(IN const PropertyItem* item);
-
- UINT GetEncoderParameterListSize(IN const CLSID* clsidEncoder);
- Status GetEncoderParameterList(IN const CLSID* clsidEncoder,
- IN UINT size,
- OUT EncoderParameters* buffer);
-
- // Support for Middle East localization (right-to-left mirroring)
- ImageLayout GetLayout() const;
- Status SetLayout(IN const ImageLayout layout);
-
- Status GetLastStatus() const;
-
-protected:
-
- Image() {}
-
- Image(GpImage *nativeImage, Status status);
-
- VOID SetNativeImage(GpImage* nativeImage);
-
- Status SetStatus(Status status) const
- {
- if (status != Ok)
- return (lastResult = status);
- else
- return status;
- }
-
- GpImage* nativeImage;
- mutable Status lastResult;
- mutable Status loadStatus;
-
-#ifdef DCR_USE_NEW_250932
-
-private:
-
-#else
-
-protected:
-
-#endif
-
- // Disable copy constructor and assignment operator
-
- Image(IN const Image& C);
- Image& operator=(IN const Image& C);
-};
-
-class Bitmap : public Image
-{
-public:
- friend class Image;
- friend class CachedBitmap;
-
- Bitmap(
- IN const WCHAR *filename,
- IN BOOL useEmbeddedColorManagement = FALSE
- );
-
- Bitmap(
- IN IStream *stream,
- IN BOOL useEmbeddedColorManagement = FALSE
- );
-
- static Bitmap* FromFile(
- IN const WCHAR *filename,
- IN BOOL useEmbeddedColorManagement = FALSE
- );
-
- static Bitmap* FromStream(
- IN IStream *stream,
- IN BOOL useEmbeddedColorManagement = FALSE
- );
-
- Bitmap(IN INT width,
- IN INT height,
- IN INT stride, PixelFormat format,
- IN BYTE* scan0);
- Bitmap(IN INT width,
- IN INT height,
- IN PixelFormat format = PixelFormat32bppARGB);
- Bitmap(IN INT width,
- IN INT height,
- IN Graphics* target);
-
- Bitmap* Clone(IN const Rect& rect,
- IN PixelFormat format);
- Bitmap* Clone(IN INT x,
- IN INT y,
- IN INT width,
- IN INT height,
- IN PixelFormat format);
- Bitmap* Clone(IN const RectF& rect,
- IN PixelFormat format);
- Bitmap* Clone(IN REAL x,
- IN REAL y,
- IN REAL width,
- IN REAL height,
- IN PixelFormat format);
-
- Status LockBits(IN const Rect& rect,
- IN UINT flags,
- IN PixelFormat format,
- OUT BitmapData* lockedBitmapData);
- Status UnlockBits(IN BitmapData* lockedBitmapData);
- Status GetPixel(IN INT x,
- IN INT y,
- OUT Color *color);
- Status SetPixel(IN INT x,
- IN INT y,
- IN const Color &color);
- Status SetResolution(IN REAL xdpi,
- IN REAL ydpi);
-
- // GDI interop:
-
- Bitmap(IN IDirectDrawSurface7* surface);
- Bitmap(IN const BITMAPINFO* gdiBitmapInfo,
- IN VOID* gdiBitmapData);
- Bitmap(IN HBITMAP hbm,
- IN HPALETTE hpal);
- Bitmap(IN HICON hicon);
- Bitmap(IN HINSTANCE hInstance,
- IN const WCHAR * bitmapName);
- static Bitmap* FromDirectDrawSurface7(IN IDirectDrawSurface7* surface);
- static Bitmap* FromBITMAPINFO(IN const BITMAPINFO* gdiBitmapInfo,
- IN VOID* gdiBitmapData);
- static Bitmap* FromHBITMAP(IN HBITMAP hbm,
- IN HPALETTE hpal);
- static Bitmap* FromHICON(IN HICON hicon);
- static Bitmap* FromResource(IN HINSTANCE hInstance,
- IN const WCHAR * bitmapName);
-
- Status GetHBITMAP(IN const Color& colorBackground,
- OUT HBITMAP *hbmReturn);
- Status GetHICON(HICON *hicon);
-
-#ifdef DCR_USE_NEW_250932
-private:
- Bitmap(const Bitmap &);
- Bitmap& operator=(const Bitmap &);
-#endif
-
-protected:
- Bitmap(GpBitmap *nativeBitmap);
-};
-
-class CustomLineCap : public GdiplusBase
-{
-public:
- friend class Pen;
-
- CustomLineCap(
- IN const GraphicsPath* fillPath,
- IN const GraphicsPath* strokePath,
- IN LineCap baseCap = LineCapFlat,
- IN REAL baseInset = 0
- );
- virtual ~CustomLineCap();
-
- CustomLineCap* Clone() const;
-
- Status SetStrokeCap(IN LineCap strokeCap)
- {
- // This changes both start and and caps.
-
- return SetStrokeCaps(strokeCap, strokeCap);
- }
-
- Status SetStrokeCaps(IN LineCap startCap,
- IN LineCap endCap);
- Status GetStrokeCaps(OUT LineCap* startCap,
- OUT LineCap* endCap) const;
- Status SetStrokeJoin(IN LineJoin lineJoin);
- LineJoin GetStrokeJoin() const;
- Status SetBaseCap(IN LineCap baseCap);
- LineCap GetBaseCap() const;
- Status SetBaseInset(IN REAL inset);
- REAL GetBaseInset() const;
- Status SetWidthScale(IN REAL widthScale);
- REAL GetWidthScale() const;
-
-protected:
- CustomLineCap();
-
-#ifdef DCR_USE_NEW_250932
-
-private:
- CustomLineCap(const CustomLineCap &);
- CustomLineCap& operator=(const CustomLineCap &);
-protected:
-
-#else
-
- CustomLineCap(const CustomLineCap& customLineCap)
- {
- customLineCap;
- SetStatus(NotImplemented);
- }
-
- CustomLineCap& operator=(const CustomLineCap& customLineCap)
- {
- customLineCap;
- SetStatus(NotImplemented);
- return *this;
- }
-
-#endif
-
- CustomLineCap(GpCustomLineCap* nativeCap, Status status)
- {
- lastResult = status;
- SetNativeCap(nativeCap);
- }
-
- VOID SetNativeCap(GpCustomLineCap* nativeCap)
- {
- this->nativeCap = nativeCap;
- }
-
- Status SetStatus(Status status) const
- {
- if (status != Ok)
- return (lastResult = status);
- else
- return status;
- }
-
-protected:
- GpCustomLineCap* nativeCap;
- mutable Status lastResult;
-};
-
-class CachedBitmap : public GdiplusBase
-{
- friend Graphics;
-
-public:
- CachedBitmap(IN Bitmap *bitmap,
- IN Graphics *graphics);
- virtual ~CachedBitmap();
-
- Status GetLastStatus() const;
-
-#ifdef DCR_USE_NEW_250932
-
-private:
- CachedBitmap(const CachedBitmap &);
- CachedBitmap& operator=(const CachedBitmap &);
-
-#endif
-
-protected:
- GpCachedBitmap *nativeCachedBitmap;
- mutable Status lastResult;
-};
-
-#endif // !_GDIPLUSHEADERS.HPP
+/**************************************************************************\
+*
+* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
+*
+* Module Name:
+*
+* GdiplusHeaders.h
+*
+* Abstract:
+*
+* GDI+ Native C++ public header file
+*
+\**************************************************************************/
+
+#ifndef _GDIPLUSHEADERS_H
+#define _GDIPLUSHEADERS_H
+
+//--------------------------------------------------------------------------
+// Abstract base class for regions
+//--------------------------------------------------------------------------
+
+// Include the class declarations here and have inline class implementation
+// in separate file to avoid circular references.
+
+class Region : public GdiplusBase
+{
+public:
+ friend class Graphics;
+
+ Region();
+ Region(IN const RectF& rect);
+ Region(IN const Rect& rect);
+ Region(IN const GraphicsPath* path);
+ Region(IN const BYTE* regionData, IN INT size);
+ Region(IN HRGN hRgn);
+ static Region* FromHRGN(IN HRGN hRgn);
+
+ ~Region();
+ Region* Clone() const;
+
+ Status MakeInfinite();
+ Status MakeEmpty();
+
+ // Get the size of the buffer needed for the GetData method
+ UINT GetDataSize() const;
+
+ // buffer - where to put the data
+ // bufferSize - how big the buffer is (should be at least as big as GetDataSize())
+ // sizeFilled - if not NULL, this is an OUT param that says how many bytes
+ // of data were written to the buffer.
+ Status GetData(OUT BYTE* buffer,
+ IN UINT bufferSize,
+ OUT UINT* sizeFilled = NULL) const;
+
+ Status Intersect(IN const Rect& rect);
+ Status Intersect(IN const RectF& rect);
+ Status Intersect(IN const GraphicsPath* path);
+ Status Intersect(IN const Region* region);
+ Status Union(IN const Rect& rect);
+ Status Union(IN const RectF& rect);
+ Status Union(IN const GraphicsPath* path);
+ Status Union(IN const Region* region);
+ Status Xor(IN const Rect& rect);
+ Status Xor(IN const RectF& rect);
+ Status Xor(IN const GraphicsPath* path);
+ Status Xor(IN const Region* region);
+ Status Exclude(IN const Rect& rect);
+ Status Exclude(IN const RectF& rect);
+ Status Exclude(IN const GraphicsPath* path);
+ Status Exclude(IN const Region* region);
+ Status Complement(IN const Rect& rect);
+ Status Complement(IN const RectF& rect);
+ Status Complement(IN const GraphicsPath* path);
+ Status Complement(IN const Region* region);
+ Status Translate(IN REAL dx,
+ IN REAL dy);
+ Status Translate(IN INT dx,
+ IN INT dy);
+ Status Transform(IN const Matrix* matrix);
+
+ Status GetBounds(OUT Rect* rect,
+ IN const Graphics* g) const;
+
+ Status GetBounds(OUT RectF* rect,
+ IN const Graphics* g) const;
+
+ HRGN GetHRGN (IN const Graphics * g) const;
+
+ BOOL IsEmpty(IN const Graphics *g) const;
+ BOOL IsInfinite(IN const Graphics *g) const;
+
+ BOOL IsVisible(IN INT x,
+ IN INT y,
+ IN const Graphics* g = NULL) const
+ {
+ return IsVisible(Point(x, y), g);
+ }
+
+ BOOL IsVisible(IN const Point& point,
+ IN const Graphics* g = NULL) const;
+
+ BOOL IsVisible(IN REAL x,
+ IN REAL y,
+ IN const Graphics* g = NULL) const
+ {
+ return IsVisible(PointF(x, y), g);
+ }
+
+ BOOL IsVisible(IN const PointF& point,
+ IN const Graphics* g = NULL) const;
+
+ BOOL IsVisible(IN INT x,
+ IN INT y,
+ IN INT width,
+ IN INT height,
+ IN const Graphics* g) const
+ {
+ return IsVisible(Rect(x, y, width, height), g);
+ }
+
+ BOOL IsVisible(IN const Rect& rect,
+ IN const Graphics* g = NULL) const;
+
+ BOOL IsVisible(IN REAL x,
+ IN REAL y,
+ IN REAL width,
+ IN REAL height,
+ IN const Graphics* g = NULL) const
+ {
+ return IsVisible(RectF(x, y, width, height), g);
+ }
+
+ BOOL IsVisible(IN const RectF& rect,
+ IN const Graphics* g = NULL) const;
+
+ BOOL Equals(IN const Region* region,
+ IN const Graphics* g) const;
+
+ UINT GetRegionScansCount(IN const Matrix* matrix) const;
+ Status GetRegionScans(IN const Matrix* matrix,
+ OUT RectF* rects,
+ OUT INT* count) const;
+ Status GetRegionScans(IN const Matrix* matrix,
+ OUT Rect* rects,
+ OUT INT* count) const;
+ Status GetLastStatus() const;
+
+protected:
+
+#ifdef DCR_USE_NEW_250932
+
+private:
+ Region(const Region &region);
+ Region& operator=(const Region &region);
+protected:
+
+#else
+ Region(const Region &region)
+ {
+ region; // reference parameter
+ SetStatus(NotImplemented);
+ }
+
+ Region& operator=(const Region &region)
+ {
+ region; // reference parameter
+ SetStatus(NotImplemented);
+ return *this;
+ }
+#endif
+
+ Status SetStatus(Status status) const
+ {
+ if (status != Ok)
+ return (lastResult = status);
+ else
+ return status;
+ }
+
+ Region(GpRegion* nativeRegion);
+
+ VOID SetNativeRegion(GpRegion* nativeRegion);
+
+protected:
+ GpRegion* nativeRegion;
+ mutable Status lastResult;
+};
+
+
+//--------------------------------------------------------------------------
+// Abstract base class for FontFamily
+//--------------------------------------------------------------------------
+
+class FontFamily : public GdiplusBase
+{
+public:
+ friend class Font;
+ friend class Graphics;
+ friend class GraphicsPath;
+ friend class FontCollection;
+
+ FontFamily();
+
+ FontFamily(
+ IN const WCHAR *name,
+ IN const FontCollection *fontCollection = NULL
+ );
+
+ ~FontFamily();
+
+ static const FontFamily *GenericSansSerif();
+ static const FontFamily *GenericSerif();
+ static const FontFamily *GenericMonospace();
+
+ Status GetFamilyName(
+ OUT WCHAR name[LF_FACESIZE],
+ IN LANGID language = 0
+ ) const;
+
+// Copy operator
+ FontFamily * Clone() const;
+
+ BOOL IsAvailable() const
+ {
+ return (nativeFamily != NULL);
+ };
+
+ BOOL IsStyleAvailable(IN INT style) const;
+
+ UINT16 GetEmHeight (IN INT style) const;
+ UINT16 GetCellAscent (IN INT style) const;
+ UINT16 GetCellDescent (IN INT style) const;
+ UINT16 GetLineSpacing (IN INT style) const;
+
+ ///////////////////////////////////////////////////////////
+
+ Status GetLastStatus() const;
+
+#ifdef DCR_USE_NEW_250932
+
+private:
+ FontFamily(const FontFamily &);
+ FontFamily& operator=(const FontFamily &);
+
+#endif
+
+protected:
+ Status SetStatus(Status status) const;
+
+ // private constructor for copy
+ FontFamily(GpFontFamily * nativeFamily, Status status);
+
+///////////////////////////////////////
+// Data members
+protected:
+
+ GpFontFamily *nativeFamily;
+ mutable Status lastResult;
+};
+
+static FontFamily *GenericSansSerifFontFamily = NULL;
+static FontFamily *GenericSerifFontFamily = NULL;
+static FontFamily *GenericMonospaceFontFamily = NULL;
+
+static BYTE GenericSansSerifFontFamilyBuffer[sizeof(FontFamily)] = {0};
+static BYTE GenericSerifFontFamilyBuffer [sizeof(FontFamily)] = {0};
+static BYTE GenericMonospaceFontFamilyBuffer[sizeof(FontFamily)] = {0};
+
+
+//--------------------------------------------------------------------------
+// Abstract base class for fonts
+//--------------------------------------------------------------------------
+
+class Font : public GdiplusBase
+{
+public:
+ friend class Graphics;
+
+ Font(IN HDC hdc);
+ Font(IN HDC hdc,
+ IN const LOGFONTA* logfont);
+ Font(IN HDC hdc,
+ IN const LOGFONTW* logfont);
+#ifdef DCR_USE_NEW_127084
+ Font(IN HDC hdc,
+ IN const HFONT hfont);
+#endif
+ Font(
+ IN const FontFamily * family,
+ IN REAL emSize,
+ IN INT style = FontStyleRegular,
+ IN Unit unit = UnitPoint
+ );
+
+ Font(
+ IN const WCHAR * familyName,
+ IN REAL emSize,
+ IN INT style = FontStyleRegular,
+ IN Unit unit = UnitPoint,
+ IN const FontCollection * fontCollection = NULL
+ );
+
+ Status GetLogFontA(IN const Graphics* g,
+ OUT LOGFONTA * logfontA) const;
+ Status GetLogFontW(IN const Graphics* g,
+ OUT LOGFONTW * logfontW) const;
+
+ Font* Clone() const;
+ ~Font();
+ BOOL IsAvailable() const;
+ INT GetStyle() const;
+ REAL GetSize() const;
+ Unit GetUnit() const;
+ Status GetLastStatus() const;
+ REAL GetHeight(IN const Graphics *graphics = NULL) const;
+#ifdef DCR_USE_NEW_125467
+ REAL GetHeight(IN REAL dpi) const;
+#endif
+
+ Status GetFamily(OUT FontFamily *family) const;
+
+#ifdef DCR_USE_NEW_250932
+
+private:
+ Font(const Font &);
+ Font& operator=(const Font &);
+
+#endif
+
+protected:
+ Font(GpFont* font, Status status);
+ VOID SetNativeFont(GpFont *Font);
+ Status SetStatus(Status status) const;
+
+protected:
+ /*
+ * handle to native line texture object
+ */
+
+ GpFont* nativeFont;
+ mutable Status lastResult;
+};
+
+//--------------------------------------------------------------------------
+// Abstract base classes for font collections
+//--------------------------------------------------------------------------
+
+class FontCollection : public GdiplusBase
+{
+public:
+ friend class FontFamily;
+
+ FontCollection();
+ virtual ~FontCollection();
+
+ INT GetFamilyCount() const; // number of enumerable families in the collection
+
+ Status GetFamilies( // enumerate the fonts in a collection
+ IN INT numSought,
+ OUT FontFamily * gpfamilies,
+ OUT INT * numFound
+ ) const;
+
+ Status GetLastStatus() const;
+
+#ifdef DCR_USE_NEW_250932
+
+private:
+ FontCollection(const FontCollection &);
+ FontCollection& operator=(const FontCollection &);
+
+#endif
+
+protected:
+ Status SetStatus(Status status) const ;
+
+ GpFontCollection *nativeFontCollection;
+ mutable Status lastResult;
+};
+
+
+class InstalledFontCollection : public FontCollection
+{
+public:
+ InstalledFontCollection();
+ ~InstalledFontCollection();
+
+#ifdef DCR_USE_NEW_250932
+
+private:
+ InstalledFontCollection(const InstalledFontCollection &);
+ InstalledFontCollection& operator=(const InstalledFontCollection &);
+
+#endif
+
+protected:
+#ifndef DCR_USE_NEW_235072
+ Status InstallFontFile(IN const WCHAR* filename);
+ Status UninstallFontFile(IN const WCHAR* filename);
+#endif
+ Status SetStatus(Status status) const ;
+};
+
+
+class PrivateFontCollection : public FontCollection
+{
+public:
+ PrivateFontCollection();
+ ~PrivateFontCollection();
+
+ Status AddFontFile(IN const WCHAR* filename);
+ Status AddMemoryFont(IN const VOID* memory,
+ IN INT length);
+
+#ifdef DCR_USE_NEW_250932
+
+private:
+ PrivateFontCollection(const PrivateFontCollection &);
+ PrivateFontCollection& operator=(const PrivateFontCollection &);
+
+#endif
+};
+
+
+//--------------------------------------------------------------------------
+// Abstract base class for bitmap image and metafile
+//--------------------------------------------------------------------------
+
+// !!! Note:
+// Include the class declarations here and have the inline class
+// implementation in a separate file. This is done to resolve a
+// circular dependency since one of the Bitmap methods needs to
+// access the private member nativeGraphics of the Graphics object.
+
+class Image : public GdiplusBase
+{
+public:
+ friend class Brush;
+ friend class TextureBrush;
+ friend class Graphics;
+
+#ifndef DCR_USE_NEW_140782
+ Image(
+ IN const WCHAR* filename
+ );
+
+ Image(
+ IN IStream* stream
+ );
+
+ static Image* FromFile(
+ IN const WCHAR* filename
+ );
+
+ static Image* FromStream(
+ IN IStream* stream
+ );
+#else
+ Image(
+ IN const WCHAR* filename,
+ IN BOOL useEmbeddedColorManagement = FALSE
+ );
+
+ Image(
+ IN IStream* stream,
+ IN BOOL useEmbeddedColorManagement = FALSE
+ );
+
+ static Image* FromFile(
+ IN const WCHAR* filename,
+ IN BOOL useEmbeddedColorManagement = FALSE
+ );
+
+ static Image* FromStream(
+ IN IStream* stream,
+ IN BOOL useEmbeddedColorManagement = FALSE
+ );
+#endif
+
+ virtual ~Image();
+ virtual Image* Clone();
+
+ Status Save(IN const WCHAR* filename,
+ IN const CLSID* clsidEncoder,
+ IN const EncoderParameters *encoderParams = NULL);
+ Status Save(IN IStream* stream,
+ IN const CLSID* clsidEncoder,
+ IN const EncoderParameters *encoderParams = NULL);
+ Status SaveAdd(IN const EncoderParameters* encoderParams);
+ Status SaveAdd(IN Image* newImage,
+ IN const EncoderParameters* encoderParams);
+
+ ImageType GetType() const;
+ Status GetPhysicalDimension(OUT SizeF* size);
+ Status GetBounds(OUT RectF* srcRect,
+ OUT Unit* srcUnit);
+
+ UINT GetWidth();
+ UINT GetHeight();
+ REAL GetHorizontalResolution();
+ REAL GetVerticalResolution();
+ UINT GetFlags();
+ Status GetRawFormat(OUT GUID *format);
+ PixelFormat GetPixelFormat();
+
+ INT GetPaletteSize();
+ Status GetPalette(OUT ColorPalette* palette,
+ IN INT size);
+ Status SetPalette(IN const ColorPalette* palette);
+
+ Image* GetThumbnailImage(IN UINT thumbWidth,
+ IN UINT thumbHeight,
+ IN GetThumbnailImageAbort callback = NULL,
+ IN VOID* callbackData = NULL);
+ UINT GetFrameDimensionsCount();
+ Status GetFrameDimensionsList(OUT GUID* dimensionIDs,
+ IN UINT count);
+ UINT GetFrameCount(IN const GUID* dimensionID);
+ Status SelectActiveFrame(IN const GUID* dimensionID,
+ IN UINT frameIndex);
+ Status RotateFlip(IN RotateFlipType rotateFlipType);
+ UINT GetPropertyCount();
+ Status GetPropertyIdList(IN UINT numOfProperty,
+ OUT PROPID* list);
+ UINT GetPropertyItemSize(IN PROPID propId);
+ Status GetPropertyItem(IN PROPID propId,
+ IN UINT propSize,
+ OUT PropertyItem* buffer);
+ Status GetPropertySize(OUT UINT* totalBufferSize,
+ OUT UINT* numProperties);
+ Status GetAllPropertyItems(IN UINT totalBufferSize,
+ IN UINT numProperties,
+ OUT PropertyItem* allItems);
+ Status RemovePropertyItem(IN PROPID propId);
+ Status SetPropertyItem(IN const PropertyItem* item);
+
+ UINT GetEncoderParameterListSize(IN const CLSID* clsidEncoder);
+ Status GetEncoderParameterList(IN const CLSID* clsidEncoder,
+ IN UINT size,
+ OUT EncoderParameters* buffer);
+
+ // Support for Middle East localization (right-to-left mirroring)
+ ImageLayout GetLayout() const;
+ Status SetLayout(IN const ImageLayout layout);
+
+ Status GetLastStatus() const;
+
+protected:
+
+ Image() {}
+
+ Image(GpImage *nativeImage, Status status);
+
+ VOID SetNativeImage(GpImage* nativeImage);
+
+ Status SetStatus(Status status) const
+ {
+ if (status != Ok)
+ return (lastResult = status);
+ else
+ return status;
+ }
+
+ GpImage* nativeImage;
+ mutable Status lastResult;
+ mutable Status loadStatus;
+
+#ifdef DCR_USE_NEW_250932
+
+private:
+
+#else
+
+protected:
+
+#endif
+
+ // Disable copy constructor and assignment operator
+
+ Image(IN const Image& C);
+ Image& operator=(IN const Image& C);
+};
+
+class Bitmap : public Image
+{
+public:
+ friend class Image;
+ friend class CachedBitmap;
+
+ Bitmap(
+ IN const WCHAR *filename,
+ IN BOOL useEmbeddedColorManagement = FALSE
+ );
+
+ Bitmap(
+ IN IStream *stream,
+ IN BOOL useEmbeddedColorManagement = FALSE
+ );
+
+ static Bitmap* FromFile(
+ IN const WCHAR *filename,
+ IN BOOL useEmbeddedColorManagement = FALSE
+ );
+
+ static Bitmap* FromStream(
+ IN IStream *stream,
+ IN BOOL useEmbeddedColorManagement = FALSE
+ );
+
+ Bitmap(IN INT width,
+ IN INT height,
+ IN INT stride, PixelFormat format,
+ IN BYTE* scan0);
+ Bitmap(IN INT width,
+ IN INT height,
+ IN PixelFormat format = PixelFormat32bppARGB);
+ Bitmap(IN INT width,
+ IN INT height,
+ IN Graphics* target);
+
+ Bitmap* Clone(IN const Rect& rect,
+ IN PixelFormat format);
+ Bitmap* Clone(IN INT x,
+ IN INT y,
+ IN INT width,
+ IN INT height,
+ IN PixelFormat format);
+ Bitmap* Clone(IN const RectF& rect,
+ IN PixelFormat format);
+ Bitmap* Clone(IN REAL x,
+ IN REAL y,
+ IN REAL width,
+ IN REAL height,
+ IN PixelFormat format);
+
+ Status LockBits(IN const Rect& rect,
+ IN UINT flags,
+ IN PixelFormat format,
+ OUT BitmapData* lockedBitmapData);
+ Status UnlockBits(IN BitmapData* lockedBitmapData);
+ Status GetPixel(IN INT x,
+ IN INT y,
+ OUT Color *color);
+ Status SetPixel(IN INT x,
+ IN INT y,
+ IN const Color &color);
+ Status SetResolution(IN REAL xdpi,
+ IN REAL ydpi);
+
+ // GDI interop:
+
+ Bitmap(IN IDirectDrawSurface7* surface);
+ Bitmap(IN const BITMAPINFO* gdiBitmapInfo,
+ IN VOID* gdiBitmapData);
+ Bitmap(IN HBITMAP hbm,
+ IN HPALETTE hpal);
+ Bitmap(IN HICON hicon);
+ Bitmap(IN HINSTANCE hInstance,
+ IN const WCHAR * bitmapName);
+ static Bitmap* FromDirectDrawSurface7(IN IDirectDrawSurface7* surface);
+ static Bitmap* FromBITMAPINFO(IN const BITMAPINFO* gdiBitmapInfo,
+ IN VOID* gdiBitmapData);
+ static Bitmap* FromHBITMAP(IN HBITMAP hbm,
+ IN HPALETTE hpal);
+ static Bitmap* FromHICON(IN HICON hicon);
+ static Bitmap* FromResource(IN HINSTANCE hInstance,
+ IN const WCHAR * bitmapName);
+
+ Status GetHBITMAP(IN const Color& colorBackground,
+ OUT HBITMAP *hbmReturn);
+ Status GetHICON(HICON *hicon);
+
+#ifdef DCR_USE_NEW_250932
+private:
+ Bitmap(const Bitmap &);
+ Bitmap& operator=(const Bitmap &);
+#endif
+
+protected:
+ Bitmap(GpBitmap *nativeBitmap);
+};
+
+class CustomLineCap : public GdiplusBase
+{
+public:
+ friend class Pen;
+
+ CustomLineCap(
+ IN const GraphicsPath* fillPath,
+ IN const GraphicsPath* strokePath,
+ IN LineCap baseCap = LineCapFlat,
+ IN REAL baseInset = 0
+ );
+ virtual ~CustomLineCap();
+
+ CustomLineCap* Clone() const;
+
+ Status SetStrokeCap(IN LineCap strokeCap)
+ {
+ // This changes both start and and caps.
+
+ return SetStrokeCaps(strokeCap, strokeCap);
+ }
+
+ Status SetStrokeCaps(IN LineCap startCap,
+ IN LineCap endCap);
+ Status GetStrokeCaps(OUT LineCap* startCap,
+ OUT LineCap* endCap) const;
+ Status SetStrokeJoin(IN LineJoin lineJoin);
+ LineJoin GetStrokeJoin() const;
+ Status SetBaseCap(IN LineCap baseCap);
+ LineCap GetBaseCap() const;
+ Status SetBaseInset(IN REAL inset);
+ REAL GetBaseInset() const;
+ Status SetWidthScale(IN REAL widthScale);
+ REAL GetWidthScale() const;
+
+protected:
+ CustomLineCap();
+
+#ifdef DCR_USE_NEW_250932
+
+private:
+ CustomLineCap(const CustomLineCap &);
+ CustomLineCap& operator=(const CustomLineCap &);
+protected:
+
+#else
+
+ CustomLineCap(const CustomLineCap& customLineCap)
+ {
+ customLineCap;
+ SetStatus(NotImplemented);
+ }
+
+ CustomLineCap& operator=(const CustomLineCap& customLineCap)
+ {
+ customLineCap;
+ SetStatus(NotImplemented);
+ return *this;
+ }
+
+#endif
+
+ CustomLineCap(GpCustomLineCap* nativeCap, Status status)
+ {
+ lastResult = status;
+ SetNativeCap(nativeCap);
+ }
+
+ VOID SetNativeCap(GpCustomLineCap* nativeCap)
+ {
+ this->nativeCap = nativeCap;
+ }
+
+ Status SetStatus(Status status) const
+ {
+ if (status != Ok)
+ return (lastResult = status);
+ else
+ return status;
+ }
+
+protected:
+ GpCustomLineCap* nativeCap;
+ mutable Status lastResult;
+};
+
+class CachedBitmap : public GdiplusBase
+{
+ friend Graphics;
+
+public:
+ CachedBitmap(IN Bitmap *bitmap,
+ IN Graphics *graphics);
+ virtual ~CachedBitmap();
+
+ Status GetLastStatus() const;
+
+#ifdef DCR_USE_NEW_250932
+
+private:
+ CachedBitmap(const CachedBitmap &);
+ CachedBitmap& operator=(const CachedBitmap &);
+
+#endif
+
+protected:
+ GpCachedBitmap *nativeCachedBitmap;
+ mutable Status lastResult;
+};
+
+#endif // !_GDIPLUSHEADERS.HPP
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusImageCodec.h b/core/src/fxge/Microsoft SDK/include/GdiPlusImageCodec.h
index e9c02deb7e..d9ea0386b2 100644
--- a/core/src/fxge/Microsoft SDK/include/GdiPlusImageCodec.h
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusImageCodec.h
@@ -1,73 +1,73 @@
-/**************************************************************************\
-*
-* Copyright (c) 2000, Microsoft Corp. All Rights Reserved.
-*
-* Module Name:
-*
-* GdiplusImageCodec.h
-*
-* Abstract:
-*
-* APIs for imaging codecs.
-*
-\**************************************************************************/
-
-#ifndef _GDIPLUSIMAGECODEC_H
-#define _GDIPLUSIMAGECODEC_H
-
-//--------------------------------------------------------------------------
-// Codec Management APIs
-//--------------------------------------------------------------------------
-
-inline Status
-GetImageDecodersSize(
- OUT UINT *numDecoders,
- OUT UINT *size)
-{
- return DllExports::GdipGetImageDecodersSize(numDecoders, size);
-}
-
-
-inline Status
-GetImageDecoders(
- IN UINT numDecoders,
- IN UINT size,
- OUT ImageCodecInfo *decoders)
-{
- return DllExports::GdipGetImageDecoders(numDecoders, size, decoders);
-}
-
-
-inline Status
-GetImageEncodersSize(
- OUT UINT *numEncoders,
- OUT UINT *size)
-{
- return DllExports::GdipGetImageEncodersSize(numEncoders, size);
-}
-
-
-inline Status
-GetImageEncoders(
- IN UINT numEncoders,
- IN UINT size,
- OUT ImageCodecInfo *encoders)
-{
- return DllExports::GdipGetImageEncoders(numEncoders, size, encoders);
-}
-
-inline Status
-AddImageCodec(
- IN const ImageCodecInfo* codec)
-{
- return DllExports::GdipAddImageCodec(codec);
-}
-
-inline Status
-RemoveImageCodec(
- IN const ImageCodecInfo* codec)
-{
- return DllExports::GdipRemoveImageCodec(codec);
-}
-
-#endif // _GDIPLUSIMAGECODEC_H
+/**************************************************************************\
+*
+* Copyright (c) 2000, Microsoft Corp. All Rights Reserved.
+*
+* Module Name:
+*
+* GdiplusImageCodec.h
+*
+* Abstract:
+*
+* APIs for imaging codecs.
+*
+\**************************************************************************/
+
+#ifndef _GDIPLUSIMAGECODEC_H
+#define _GDIPLUSIMAGECODEC_H
+
+//--------------------------------------------------------------------------
+// Codec Management APIs
+//--------------------------------------------------------------------------
+
+inline Status
+GetImageDecodersSize(
+ OUT UINT *numDecoders,
+ OUT UINT *size)
+{
+ return DllExports::GdipGetImageDecodersSize(numDecoders, size);
+}
+
+
+inline Status
+GetImageDecoders(
+ IN UINT numDecoders,
+ IN UINT size,
+ OUT ImageCodecInfo *decoders)
+{
+ return DllExports::GdipGetImageDecoders(numDecoders, size, decoders);
+}
+
+
+inline Status
+GetImageEncodersSize(
+ OUT UINT *numEncoders,
+ OUT UINT *size)
+{
+ return DllExports::GdipGetImageEncodersSize(numEncoders, size);
+}
+
+
+inline Status
+GetImageEncoders(
+ IN UINT numEncoders,
+ IN UINT size,
+ OUT ImageCodecInfo *encoders)
+{
+ return DllExports::GdipGetImageEncoders(numEncoders, size, encoders);
+}
+
+inline Status
+AddImageCodec(
+ IN const ImageCodecInfo* codec)
+{
+ return DllExports::GdipAddImageCodec(codec);
+}
+
+inline Status
+RemoveImageCodec(
+ IN const ImageCodecInfo* codec)
+{
+ return DllExports::GdipRemoveImageCodec(codec);
+}
+
+#endif // _GDIPLUSIMAGECODEC_H
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusImaging.h b/core/src/fxge/Microsoft SDK/include/GdiPlusImaging.h
index 35dd4d0634..d6bd4f0d18 100644
--- a/core/src/fxge/Microsoft SDK/include/GdiPlusImaging.h
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusImaging.h
@@ -1,540 +1,540 @@
-/**************************************************************************\
-*
-* Copyright (c) 1999-2000 Microsoft Corporation
-*
-* Module Name:
-*
-* GdiplusImaging.h
-*
-* Abstract:
-*
-* GUIDs defined and used by the imaging library
-*
-\**************************************************************************/
-#ifndef _GDIPLUSIMAGING_H
-#define _GDIPLUSIMAGING_H
-
-//---------------------------------------------------------------------------
-// Image file format identifiers
-//---------------------------------------------------------------------------
-
-DEFINE_GUID(ImageFormatUndefined, 0xb96b3ca9,0x0728,0x11d3,0x9d,0x7b,0x00,0x00,0xf8,0x1e,0xf3,0x2e);
-DEFINE_GUID(ImageFormatMemoryBMP, 0xb96b3caa,0x0728,0x11d3,0x9d,0x7b,0x00,0x00,0xf8,0x1e,0xf3,0x2e);
-DEFINE_GUID(ImageFormatBMP, 0xb96b3cab,0x0728,0x11d3,0x9d,0x7b,0x00,0x00,0xf8,0x1e,0xf3,0x2e);
-DEFINE_GUID(ImageFormatEMF, 0xb96b3cac,0x0728,0x11d3,0x9d,0x7b,0x00,0x00,0xf8,0x1e,0xf3,0x2e);
-DEFINE_GUID(ImageFormatWMF, 0xb96b3cad,0x0728,0x11d3,0x9d,0x7b,0x00,0x00,0xf8,0x1e,0xf3,0x2e);
-DEFINE_GUID(ImageFormatJPEG, 0xb96b3cae,0x0728,0x11d3,0x9d,0x7b,0x00,0x00,0xf8,0x1e,0xf3,0x2e);
-DEFINE_GUID(ImageFormatPNG, 0xb96b3caf,0x0728,0x11d3,0x9d,0x7b,0x00,0x00,0xf8,0x1e,0xf3,0x2e);
-DEFINE_GUID(ImageFormatGIF, 0xb96b3cb0,0x0728,0x11d3,0x9d,0x7b,0x00,0x00,0xf8,0x1e,0xf3,0x2e);
-DEFINE_GUID(ImageFormatTIFF, 0xb96b3cb1,0x0728,0x11d3,0x9d,0x7b,0x00,0x00,0xf8,0x1e,0xf3,0x2e);
-DEFINE_GUID(ImageFormatEXIF, 0xb96b3cb2,0x0728,0x11d3,0x9d,0x7b,0x00,0x00,0xf8,0x1e,0xf3,0x2e);
-#ifndef DCR_USE_NEW_140855
-DEFINE_GUID(ImageFormatPhotoCD, 0xb96b3cb3,0x0728,0x11d3,0x9d,0x7b,0x00,0x00,0xf8,0x1e,0xf3,0x2e);
-DEFINE_GUID(ImageFormatFlashPIX, 0xb96b3cb4,0x0728,0x11d3,0x9d,0x7b,0x00,0x00,0xf8,0x1e,0xf3,0x2e);
-#endif
-DEFINE_GUID(ImageFormatIcon, 0xb96b3cb5,0x0728,0x11d3,0x9d,0x7b,0x00,0x00,0xf8,0x1e,0xf3,0x2e);
-
-//---------------------------------------------------------------------------
-// Predefined multi-frame dimension IDs
-//---------------------------------------------------------------------------
-
-DEFINE_GUID(FrameDimensionTime, 0x6aedbd6d,0x3fb5,0x418a,0x83,0xa6,0x7f,0x45,0x22,0x9d,0xc8,0x72);
-DEFINE_GUID(FrameDimensionResolution, 0x84236f7b,0x3bd3,0x428f,0x8d,0xab,0x4e,0xa1,0x43,0x9c,0xa3,0x15);
-DEFINE_GUID(FrameDimensionPage, 0x7462dc86,0x6180,0x4c7e,0x8e,0x3f,0xee,0x73,0x33,0xa7,0xa4,0x83);
-
-//---------------------------------------------------------------------------
-// Property sets
-//---------------------------------------------------------------------------
-
-DEFINE_GUID(FormatIDImageInformation, 0xe5836cbe,0x5eef,0x4f1d,0xac,0xde,0xae,0x4c,0x43,0xb6,0x08,0xce);
-DEFINE_GUID(FormatIDJpegAppHeaders, 0x1c4afdcd,0x6177,0x43cf,0xab,0xc7,0x5f,0x51,0xaf,0x39,0xee,0x85);
-
-#ifndef DCR_USE_NEW_140855
-//---------------------------------------------------------------------------
-// Decoder parameter sets
-//---------------------------------------------------------------------------
-DEFINE_GUID(DecoderTransColor, 0xb7a98c8f,0xdce7,0x457d,0xbf,0xa5,0xce,0xa7,0x1b,0xd1,0x4d,0xd6);
-DEFINE_GUID(DecoderTransRange, 0xabeed189,0xd988,0x4d03,0xb4,0x25,0x57,0x10,0x55,0xc7,0x6a,0xd1);
-DEFINE_GUID(DecoderOutputChannel, 0x2ff8f51e,0x724d,0x45fe,0x86,0xce,0x17,0x77,0xa0,0x56,0xda,0x60);
-DEFINE_GUID(DecoderIconRes, 0x5c656eec,0xe94f,0x45ba,0xa6,0xf6,0x10,0x62,0xe8,0x5f,0x4a,0x7f);
-#endif
-
-//---------------------------------------------------------------------------
-// Encoder parameter sets
-//---------------------------------------------------------------------------
-
-DEFINE_GUID(EncoderCompression, 0xe09d739d,0xccd4,0x44ee,0x8e,0xba,0x3f,0xbf,0x8b,0xe4,0xfc,0x58);
-DEFINE_GUID(EncoderColorDepth, 0x66087055,0xad66,0x4c7c,0x9a,0x18,0x38,0xa2,0x31,0x0b,0x83,0x37);
-DEFINE_GUID(EncoderScanMethod, 0x3a4e2661,0x3109,0x4e56,0x85,0x36,0x42,0xc1,0x56,0xe7,0xdc,0xfa);
-DEFINE_GUID(EncoderVersion, 0x24d18c76,0x814a,0x41a4,0xbf,0x53,0x1c,0x21,0x9c,0xcc,0xf7,0x97);
-DEFINE_GUID(EncoderRenderMethod, 0x6d42c53a,0x229a,0x4825,0x8b,0xb7,0x5c,0x99,0xe2,0xb9,0xa8,0xb8);
-DEFINE_GUID(EncoderQuality, 0x1d5be4b5,0xfa4a,0x452d,0x9c,0xdd,0x5d,0xb3,0x51,0x05,0xe7,0xeb);
-DEFINE_GUID(EncoderTransformation,0x8d0eb2d1,0xa58e,0x4ea8,0xaa,0x14,0x10,0x80,0x74,0xb7,0xb6,0xf9);
-DEFINE_GUID(EncoderLuminanceTable,0xedb33bce,0x0266,0x4a77,0xb9,0x04,0x27,0x21,0x60,0x99,0xe7,0x17);
-DEFINE_GUID(EncoderChrominanceTable,0xf2e455dc,0x09b3,0x4316,0x82,0x60,0x67,0x6a,0xda,0x32,0x48,0x1c);
-DEFINE_GUID(EncoderSaveFlag,0x292266fc,0xac40,0x47bf,0x8c, 0xfc, 0xa8, 0x5b, 0x89, 0xa6, 0x55, 0xde);
-
-DEFINE_GUID(CodecIImageBytes,0x025d1823,0x6c7d,0x447b,0xbb, 0xdb, 0xa3, 0xcb, 0xc3, 0xdf, 0xa2, 0xfc);
-
-MIDL_INTERFACE("025D1823-6C7D-447B-BBDB-A3CBC3DFA2FC")
-IImageBytes : public IUnknown
-{
-public:
- // Return total number of bytes in the IStream
-
- STDMETHOD(CountBytes)(
- OUT UINT *pcb
- ) = 0;
-
- // Locks "cb" bytes, starting from "ulOffset" in the stream, and returns the
- // pointer to the beginning of the locked memory chunk in "ppvBytes"
-
- STDMETHOD(LockBytes)(
- IN UINT cb,
- IN ULONG ulOffset,
- OUT const VOID ** ppvBytes
- ) = 0;
-
- // Unlocks "cb" bytes, pointed by "pvBytes", starting from "ulOffset" in the
- // stream
-
- STDMETHOD(UnlockBytes)(
- IN const VOID *pvBytes,
- IN UINT cb,
- IN ULONG ulOffset
- ) = 0;
-};
-
-//--------------------------------------------------------------------------
-// ImageCodecInfo structure
-//--------------------------------------------------------------------------
-
-class ImageCodecInfo
-{
-public:
- CLSID Clsid;
- GUID FormatID;
- const WCHAR* CodecName;
- const WCHAR* DllName;
- const WCHAR* FormatDescription;
- const WCHAR* FilenameExtension;
- const WCHAR* MimeType;
- DWORD Flags;
- DWORD Version;
- DWORD SigCount;
- DWORD SigSize;
- const BYTE* SigPattern;
- const BYTE* SigMask;
-};
-
-//--------------------------------------------------------------------------
-// Information flags about image codecs
-//--------------------------------------------------------------------------
-
-enum ImageCodecFlags
-{
- ImageCodecFlagsEncoder = 0x00000001,
- ImageCodecFlagsDecoder = 0x00000002,
- ImageCodecFlagsSupportBitmap = 0x00000004,
- ImageCodecFlagsSupportVector = 0x00000008,
- ImageCodecFlagsSeekableEncode = 0x00000010,
- ImageCodecFlagsBlockingDecode = 0x00000020,
-
- ImageCodecFlagsBuiltin = 0x00010000,
- ImageCodecFlagsSystem = 0x00020000,
- ImageCodecFlagsUser = 0x00040000
-};
-
-//---------------------------------------------------------------------------
-// Access modes used when calling Image::LockBits
-//---------------------------------------------------------------------------
-
-enum ImageLockMode
-{
- ImageLockModeRead = 0x0001,
- ImageLockModeWrite = 0x0002,
- ImageLockModeUserInputBuf= 0x0004
-};
-
-//---------------------------------------------------------------------------
-// Information about image pixel data
-//---------------------------------------------------------------------------
-
-class BitmapData
-{
-public:
- UINT Width;
- UINT Height;
- INT Stride;
- PixelFormat PixelFormat;
- VOID* Scan0;
- UINT_PTR Reserved;
-};
-
-//---------------------------------------------------------------------------
-// Image flags
-//---------------------------------------------------------------------------
-
-enum ImageFlags
-{
- ImageFlagsNone = 0,
-
- // Low-word: shared with SINKFLAG_x
-
- ImageFlagsScalable = 0x0001,
- ImageFlagsHasAlpha = 0x0002,
- ImageFlagsHasTranslucent = 0x0004,
- ImageFlagsPartiallyScalable = 0x0008,
-
- // Low-word: color space definition
-
- ImageFlagsColorSpaceRGB = 0x0010,
- ImageFlagsColorSpaceCMYK = 0x0020,
- ImageFlagsColorSpaceGRAY = 0x0040,
- ImageFlagsColorSpaceYCBCR = 0x0080,
- ImageFlagsColorSpaceYCCK = 0x0100,
-
- // Low-word: image size info
-
- ImageFlagsHasRealDPI = 0x1000,
- ImageFlagsHasRealPixelSize = 0x2000,
-
- // High-word
-
- ImageFlagsReadOnly = 0x00010000,
- ImageFlagsCaching = 0x00020000
-};
-
-enum RotateFlipType
-{
- RotateNoneFlipNone = 0,
- Rotate90FlipNone = 1,
- Rotate180FlipNone = 2,
- Rotate270FlipNone = 3,
-
- RotateNoneFlipX = 4,
- Rotate90FlipX = 5,
- Rotate180FlipX = 6,
- Rotate270FlipX = 7,
-
- RotateNoneFlipY = Rotate180FlipX,
- Rotate90FlipY = Rotate270FlipX,
- Rotate180FlipY = RotateNoneFlipX,
- Rotate270FlipY = Rotate90FlipX,
-
- RotateNoneFlipXY = Rotate180FlipNone,
- Rotate90FlipXY = Rotate270FlipNone,
- Rotate180FlipXY = RotateNoneFlipNone,
- Rotate270FlipXY = Rotate90FlipNone
-};
-
-//---------------------------------------------------------------------------
-// Encoder Parameter structure
-//---------------------------------------------------------------------------
-class EncoderParameter
-{
-public:
- GUID Guid; // GUID of the parameter
- ULONG NumberOfValues; // Number of the parameter values
- ULONG Type; // Value type, like ValueTypeLONG etc.
- VOID* Value; // A pointer to the parameter values
-};
-
-//---------------------------------------------------------------------------
-// Encoder Parameters structure
-//---------------------------------------------------------------------------
-class EncoderParameters
-{
-public:
- UINT Count; // Number of parameters in this structure
- EncoderParameter Parameter[1]; // Parameter values
-};
-
-//---------------------------------------------------------------------------
-// Property Item
-//---------------------------------------------------------------------------
-class PropertyItem
-{
-public:
- PROPID id; // ID of this property
- ULONG length; // Length of the property value, in bytes
- WORD type; // Type of the value, as one of TAG_TYPE_XXX
- // defined above
- VOID* value; // property value
-};
-
-#ifdef DCR_USE_NEW_140857
-//---------------------------------------------------------------------------
-// Image property types
-//---------------------------------------------------------------------------
-#define PropertyTagTypeByte 1
-#define PropertyTagTypeASCII 2
-#define PropertyTagTypeShort 3
-#define PropertyTagTypeLong 4
-#define PropertyTagTypeRational 5
-#define PropertyTagTypeUndefined 7
-#define PropertyTagTypeSLONG 9
-#define PropertyTagTypeSRational 10
-#endif
-
-//---------------------------------------------------------------------------
-// Image property ID tags
-//---------------------------------------------------------------------------
-
-#define PropertyTagExifIFD 0x8769
-#define PropertyTagGpsIFD 0x8825
-
-#define PropertyTagNewSubfileType 0x00FE
-#define PropertyTagSubfileType 0x00FF
-#define PropertyTagImageWidth 0x0100
-#define PropertyTagImageHeight 0x0101
-#define PropertyTagBitsPerSample 0x0102
-#define PropertyTagCompression 0x0103
-#define PropertyTagPhotometricInterp 0x0106
-#define PropertyTagThreshHolding 0x0107
-#define PropertyTagCellWidth 0x0108
-#define PropertyTagCellHeight 0x0109
-#define PropertyTagFillOrder 0x010A
-#define PropertyTagDocumentName 0x010D
-#define PropertyTagImageDescription 0x010E
-#define PropertyTagEquipMake 0x010F
-#define PropertyTagEquipModel 0x0110
-#define PropertyTagStripOffsets 0x0111
-#define PropertyTagOrientation 0x0112
-#define PropertyTagSamplesPerPixel 0x0115
-#define PropertyTagRowsPerStrip 0x0116
-#define PropertyTagStripBytesCount 0x0117
-#define PropertyTagMinSampleValue 0x0118
-#define PropertyTagMaxSampleValue 0x0119
-#define PropertyTagXResolution 0x011A // Image resolution in width direction
-#define PropertyTagYResolution 0x011B // Image resolution in height direction
-#define PropertyTagPlanarConfig 0x011C // Image data arrangement
-#define PropertyTagPageName 0x011D
-#define PropertyTagXPosition 0x011E
-#define PropertyTagYPosition 0x011F
-#define PropertyTagFreeOffset 0x0120
-#define PropertyTagFreeByteCounts 0x0121
-#define PropertyTagGrayResponseUnit 0x0122
-#define PropertyTagGrayResponseCurve 0x0123
-#define PropertyTagT4Option 0x0124
-#define PropertyTagT6Option 0x0125
-#define PropertyTagResolutionUnit 0x0128 // Unit of X and Y resolution
-#define PropertyTagPageNumber 0x0129
-#define PropertyTagTransferFuncition 0x012D
-#define PropertyTagSoftwareUsed 0x0131
-#define PropertyTagDateTime 0x0132
-#define PropertyTagArtist 0x013B
-#define PropertyTagHostComputer 0x013C
-#define PropertyTagPredictor 0x013D
-#define PropertyTagWhitePoint 0x013E
-#define PropertyTagPrimaryChromaticities 0x013F
-#define PropertyTagColorMap 0x0140
-#define PropertyTagHalftoneHints 0x0141
-#define PropertyTagTileWidth 0x0142
-#define PropertyTagTileLength 0x0143
-#define PropertyTagTileOffset 0x0144
-#define PropertyTagTileByteCounts 0x0145
-#define PropertyTagInkSet 0x014C
-#define PropertyTagInkNames 0x014D
-#define PropertyTagNumberOfInks 0x014E
-#define PropertyTagDotRange 0x0150
-#define PropertyTagTargetPrinter 0x0151
-#define PropertyTagExtraSamples 0x0152
-#define PropertyTagSampleFormat 0x0153
-#define PropertyTagSMinSampleValue 0x0154
-#define PropertyTagSMaxSampleValue 0x0155
-#define PropertyTagTransferRange 0x0156
-
-#define PropertyTagJPEGProc 0x0200
-#define PropertyTagJPEGInterFormat 0x0201
-#define PropertyTagJPEGInterLength 0x0202
-#define PropertyTagJPEGRestartInterval 0x0203
-#define PropertyTagJPEGLosslessPredictors 0x0205
-#define PropertyTagJPEGPointTransforms 0x0206
-#define PropertyTagJPEGQTables 0x0207
-#define PropertyTagJPEGDCTables 0x0208
-#define PropertyTagJPEGACTables 0x0209
-
-#define PropertyTagYCbCrCoefficients 0x0211
-#define PropertyTagYCbCrSubsampling 0x0212
-#define PropertyTagYCbCrPositioning 0x0213
-#define PropertyTagREFBlackWhite 0x0214
-
-#define PropertyTagICCProfile 0x8773 // This TAG is defined by ICC
- // for embedded ICC in TIFF
-#define PropertyTagGamma 0x0301
-#define PropertyTagICCProfileDescriptor 0x0302
-#define PropertyTagSRGBRenderingIntent 0x0303
-
-#define PropertyTagImageTitle 0x0320
-#define PropertyTagCopyright 0x8298
-
-// Extra TAGs (Like Adobe Image Information tags etc.)
-
-#define PropertyTagResolutionXUnit 0x5001
-#define PropertyTagResolutionYUnit 0x5002
-#define PropertyTagResolutionXLengthUnit 0x5003
-#define PropertyTagResolutionYLengthUnit 0x5004
-#define PropertyTagPrintFlags 0x5005
-#define PropertyTagPrintFlagsVersion 0x5006
-#define PropertyTagPrintFlagsCrop 0x5007
-#define PropertyTagPrintFlagsBleedWidth 0x5008
-#define PropertyTagPrintFlagsBleedWidthScale 0x5009
-#define PropertyTagHalftoneLPI 0x500A
-#define PropertyTagHalftoneLPIUnit 0x500B
-#define PropertyTagHalftoneDegree 0x500C
-#define PropertyTagHalftoneShape 0x500D
-#define PropertyTagHalftoneMisc 0x500E
-#define PropertyTagHalftoneScreen 0x500F
-#define PropertyTagJPEGQuality 0x5010
-#define PropertyTagGridSize 0x5011
-#define PropertyTagThumbnailFormat 0x5012 // 1 = JPEG, 0 = RAW RGB
-#define PropertyTagThumbnailWidth 0x5013
-#define PropertyTagThumbnailHeight 0x5014
-#define PropertyTagThumbnailColorDepth 0x5015
-#define PropertyTagThumbnailPlanes 0x5016
-#define PropertyTagThumbnailRawBytes 0x5017
-#define PropertyTagThumbnailSize 0x5018
-#define PropertyTagThumbnailCompressedSize 0x5019
-#define PropertyTagColorTransferFunction 0x501A
-#define PropertyTagThumbnailData 0x501B// RAW thumbnail bits in
- // JPEG format or RGB format
- // depends on
- // PropertyTagThumbnailFormat
-
-// Thumbnail related TAGs
-
-#define PropertyTagThumbnailImageWidth 0x5020 // Thumbnail width
-#define PropertyTagThumbnailImageHeight 0x5021 // Thumbnail height
-#define PropertyTagThumbnailBitsPerSample 0x5022 // Number of bits per
- // component
-#define PropertyTagThumbnailCompression 0x5023 // Compression Scheme
-#define PropertyTagThumbnailPhotometricInterp 0x5024 // Pixel composition
-#define PropertyTagThumbnailImageDescription 0x5025 // Image Tile
-#define PropertyTagThumbnailEquipMake 0x5026 // Manufacturer of Image
- // Input equipment
-#define PropertyTagThumbnailEquipModel 0x5027 // Model of Image input
- // equipment
-#define PropertyTagThumbnailStripOffsets 0x5028 // Image data location
-#define PropertyTagThumbnailOrientation 0x5029 // Orientation of image
-#define PropertyTagThumbnailSamplesPerPixel 0x502A // Number of components
-#define PropertyTagThumbnailRowsPerStrip 0x502B // Number of rows per strip
-#define PropertyTagThumbnailStripBytesCount 0x502C // Bytes per compressed
- // strip
-#define PropertyTagThumbnailResolutionX 0x502D // Resolution in width
- // direction
-#define PropertyTagThumbnailResolutionY 0x502E // Resolution in height
- // direction
-#define PropertyTagThumbnailPlanarConfig 0x502F // Image data arrangement
-#define PropertyTagThumbnailResolutionUnit 0x5030 // Unit of X and Y
- // Resolution
-#define PropertyTagThumbnailTransferFunction 0x5031 // Transfer function
-#define PropertyTagThumbnailSoftwareUsed 0x5032 // Software used
-#define PropertyTagThumbnailDateTime 0x5033 // File change date and
- // time
-#define PropertyTagThumbnailArtist 0x5034 // Person who created the
- // image
-#define PropertyTagThumbnailWhitePoint 0x5035 // White point chromaticity
-#define PropertyTagThumbnailPrimaryChromaticities 0x5036
- // Chromaticities of
- // primaries
-#define PropertyTagThumbnailYCbCrCoefficients 0x5037 // Color space transforma-
- // tion coefficients
-#define PropertyTagThumbnailYCbCrSubsampling 0x5038 // Subsampling ratio of Y
- // to C
-#define PropertyTagThumbnailYCbCrPositioning 0x5039 // Y and C position
-#define PropertyTagThumbnailRefBlackWhite 0x503A // Pair of black and white
- // reference values
-#define PropertyTagThumbnailCopyRight 0x503B // CopyRight holder
-
-#define PropertyTagLuminanceTable 0x5090
-#define PropertyTagChrominanceTable 0x5091
-
-#define PropertyTagFrameDelay 0x5100
-#define PropertyTagLoopCount 0x5101
-
-#define PropertyTagPixelUnit 0x5110 // Unit specifier for pixel/unit
-#define PropertyTagPixelPerUnitX 0x5111 // Pixels per unit in X
-#define PropertyTagPixelPerUnitY 0x5112 // Pixels per unit in Y
-#define PropertyTagPaletteHistogram 0x5113 // Palette histogram
-
-// EXIF specific tag
-
-#define PropertyTagExifExposureTime 0x829A
-#define PropertyTagExifFNumber 0x829D
-
-#define PropertyTagExifExposureProg 0x8822
-#define PropertyTagExifSpectralSense 0x8824
-#define PropertyTagExifISOSpeed 0x8827
-#define PropertyTagExifOECF 0x8828
-
-#define PropertyTagExifVer 0x9000
-#define PropertyTagExifDTOrig 0x9003 // Date & time of original
-#define PropertyTagExifDTDigitized 0x9004 // Date & time of digital data generation
-
-#define PropertyTagExifCompConfig 0x9101
-#define PropertyTagExifCompBPP 0x9102
-
-#define PropertyTagExifShutterSpeed 0x9201
-#define PropertyTagExifAperture 0x9202
-#define PropertyTagExifBrightness 0x9203
-#define PropertyTagExifExposureBias 0x9204
-#define PropertyTagExifMaxAperture 0x9205
-#define PropertyTagExifSubjectDist 0x9206
-#define PropertyTagExifMeteringMode 0x9207
-#define PropertyTagExifLightSource 0x9208
-#define PropertyTagExifFlash 0x9209
-#define PropertyTagExifFocalLength 0x920A
-#define PropertyTagExifMakerNote 0x927C
-#define PropertyTagExifUserComment 0x9286
-#define PropertyTagExifDTSubsec 0x9290 // Date & Time subseconds
-#define PropertyTagExifDTOrigSS 0x9291 // Date & Time original subseconds
-#define PropertyTagExifDTDigSS 0x9292 // Date & TIme digitized subseconds
-
-#define PropertyTagExifFPXVer 0xA000
-#define PropertyTagExifColorSpace 0xA001
-#define PropertyTagExifPixXDim 0xA002
-#define PropertyTagExifPixYDim 0xA003
-#define PropertyTagExifRelatedWav 0xA004 // related sound file
-#define PropertyTagExifInterop 0xA005
-#define PropertyTagExifFlashEnergy 0xA20B
-#define PropertyTagExifSpatialFR 0xA20C // Spatial Frequency Response
-#define PropertyTagExifFocalXRes 0xA20E // Focal Plane X Resolution
-#define PropertyTagExifFocalYRes 0xA20F // Focal Plane Y Resolution
-#define PropertyTagExifFocalResUnit 0xA210 // Focal Plane Resolution Unit
-#define PropertyTagExifSubjectLoc 0xA214
-#define PropertyTagExifExposureIndex 0xA215
-#define PropertyTagExifSensingMethod 0xA217
-#define PropertyTagExifFileSource 0xA300
-#define PropertyTagExifSceneType 0xA301
-#define PropertyTagExifCfaPattern 0xA302
-
-#define PropertyTagGpsVer 0x0000
-#define PropertyTagGpsLatitudeRef 0x0001
-#define PropertyTagGpsLatitude 0x0002
-#define PropertyTagGpsLongitudeRef 0x0003
-#define PropertyTagGpsLongitude 0x0004
-#define PropertyTagGpsAltitudeRef 0x0005
-#define PropertyTagGpsAltitude 0x0006
-#define PropertyTagGpsGpsTime 0x0007
-#define PropertyTagGpsGpsSatellites 0x0008
-#define PropertyTagGpsGpsStatus 0x0009
-#define PropertyTagGpsGpsMeasureMode 0x00A
-#define PropertyTagGpsGpsDop 0x000B // Measurement precision
-#define PropertyTagGpsSpeedRef 0x000C
-#define PropertyTagGpsSpeed 0x000D
-#define PropertyTagGpsTrackRef 0x000E
-#define PropertyTagGpsTrack 0x000F
-#define PropertyTagGpsImgDirRef 0x0010
-#define PropertyTagGpsImgDir 0x0011
-#define PropertyTagGpsMapDatum 0x0012
-#define PropertyTagGpsDestLatRef 0x0013
-#define PropertyTagGpsDestLat 0x0014
-#define PropertyTagGpsDestLongRef 0x0015
-#define PropertyTagGpsDestLong 0x0016
-#define PropertyTagGpsDestBearRef 0x0017
-#define PropertyTagGpsDestBear 0x0018
-#define PropertyTagGpsDestDistRef 0x0019
-#define PropertyTagGpsDestDist 0x001A
-
-#endif
+/**************************************************************************\
+*
+* Copyright (c) 1999-2000 Microsoft Corporation
+*
+* Module Name:
+*
+* GdiplusImaging.h
+*
+* Abstract:
+*
+* GUIDs defined and used by the imaging library
+*
+\**************************************************************************/
+#ifndef _GDIPLUSIMAGING_H
+#define _GDIPLUSIMAGING_H
+
+//---------------------------------------------------------------------------
+// Image file format identifiers
+//---------------------------------------------------------------------------
+
+DEFINE_GUID(ImageFormatUndefined, 0xb96b3ca9,0x0728,0x11d3,0x9d,0x7b,0x00,0x00,0xf8,0x1e,0xf3,0x2e);
+DEFINE_GUID(ImageFormatMemoryBMP, 0xb96b3caa,0x0728,0x11d3,0x9d,0x7b,0x00,0x00,0xf8,0x1e,0xf3,0x2e);
+DEFINE_GUID(ImageFormatBMP, 0xb96b3cab,0x0728,0x11d3,0x9d,0x7b,0x00,0x00,0xf8,0x1e,0xf3,0x2e);
+DEFINE_GUID(ImageFormatEMF, 0xb96b3cac,0x0728,0x11d3,0x9d,0x7b,0x00,0x00,0xf8,0x1e,0xf3,0x2e);
+DEFINE_GUID(ImageFormatWMF, 0xb96b3cad,0x0728,0x11d3,0x9d,0x7b,0x00,0x00,0xf8,0x1e,0xf3,0x2e);
+DEFINE_GUID(ImageFormatJPEG, 0xb96b3cae,0x0728,0x11d3,0x9d,0x7b,0x00,0x00,0xf8,0x1e,0xf3,0x2e);
+DEFINE_GUID(ImageFormatPNG, 0xb96b3caf,0x0728,0x11d3,0x9d,0x7b,0x00,0x00,0xf8,0x1e,0xf3,0x2e);
+DEFINE_GUID(ImageFormatGIF, 0xb96b3cb0,0x0728,0x11d3,0x9d,0x7b,0x00,0x00,0xf8,0x1e,0xf3,0x2e);
+DEFINE_GUID(ImageFormatTIFF, 0xb96b3cb1,0x0728,0x11d3,0x9d,0x7b,0x00,0x00,0xf8,0x1e,0xf3,0x2e);
+DEFINE_GUID(ImageFormatEXIF, 0xb96b3cb2,0x0728,0x11d3,0x9d,0x7b,0x00,0x00,0xf8,0x1e,0xf3,0x2e);
+#ifndef DCR_USE_NEW_140855
+DEFINE_GUID(ImageFormatPhotoCD, 0xb96b3cb3,0x0728,0x11d3,0x9d,0x7b,0x00,0x00,0xf8,0x1e,0xf3,0x2e);
+DEFINE_GUID(ImageFormatFlashPIX, 0xb96b3cb4,0x0728,0x11d3,0x9d,0x7b,0x00,0x00,0xf8,0x1e,0xf3,0x2e);
+#endif
+DEFINE_GUID(ImageFormatIcon, 0xb96b3cb5,0x0728,0x11d3,0x9d,0x7b,0x00,0x00,0xf8,0x1e,0xf3,0x2e);
+
+//---------------------------------------------------------------------------
+// Predefined multi-frame dimension IDs
+//---------------------------------------------------------------------------
+
+DEFINE_GUID(FrameDimensionTime, 0x6aedbd6d,0x3fb5,0x418a,0x83,0xa6,0x7f,0x45,0x22,0x9d,0xc8,0x72);
+DEFINE_GUID(FrameDimensionResolution, 0x84236f7b,0x3bd3,0x428f,0x8d,0xab,0x4e,0xa1,0x43,0x9c,0xa3,0x15);
+DEFINE_GUID(FrameDimensionPage, 0x7462dc86,0x6180,0x4c7e,0x8e,0x3f,0xee,0x73,0x33,0xa7,0xa4,0x83);
+
+//---------------------------------------------------------------------------
+// Property sets
+//---------------------------------------------------------------------------
+
+DEFINE_GUID(FormatIDImageInformation, 0xe5836cbe,0x5eef,0x4f1d,0xac,0xde,0xae,0x4c,0x43,0xb6,0x08,0xce);
+DEFINE_GUID(FormatIDJpegAppHeaders, 0x1c4afdcd,0x6177,0x43cf,0xab,0xc7,0x5f,0x51,0xaf,0x39,0xee,0x85);
+
+#ifndef DCR_USE_NEW_140855
+//---------------------------------------------------------------------------
+// Decoder parameter sets
+//---------------------------------------------------------------------------
+DEFINE_GUID(DecoderTransColor, 0xb7a98c8f,0xdce7,0x457d,0xbf,0xa5,0xce,0xa7,0x1b,0xd1,0x4d,0xd6);
+DEFINE_GUID(DecoderTransRange, 0xabeed189,0xd988,0x4d03,0xb4,0x25,0x57,0x10,0x55,0xc7,0x6a,0xd1);
+DEFINE_GUID(DecoderOutputChannel, 0x2ff8f51e,0x724d,0x45fe,0x86,0xce,0x17,0x77,0xa0,0x56,0xda,0x60);
+DEFINE_GUID(DecoderIconRes, 0x5c656eec,0xe94f,0x45ba,0xa6,0xf6,0x10,0x62,0xe8,0x5f,0x4a,0x7f);
+#endif
+
+//---------------------------------------------------------------------------
+// Encoder parameter sets
+//---------------------------------------------------------------------------
+
+DEFINE_GUID(EncoderCompression, 0xe09d739d,0xccd4,0x44ee,0x8e,0xba,0x3f,0xbf,0x8b,0xe4,0xfc,0x58);
+DEFINE_GUID(EncoderColorDepth, 0x66087055,0xad66,0x4c7c,0x9a,0x18,0x38,0xa2,0x31,0x0b,0x83,0x37);
+DEFINE_GUID(EncoderScanMethod, 0x3a4e2661,0x3109,0x4e56,0x85,0x36,0x42,0xc1,0x56,0xe7,0xdc,0xfa);
+DEFINE_GUID(EncoderVersion, 0x24d18c76,0x814a,0x41a4,0xbf,0x53,0x1c,0x21,0x9c,0xcc,0xf7,0x97);
+DEFINE_GUID(EncoderRenderMethod, 0x6d42c53a,0x229a,0x4825,0x8b,0xb7,0x5c,0x99,0xe2,0xb9,0xa8,0xb8);
+DEFINE_GUID(EncoderQuality, 0x1d5be4b5,0xfa4a,0x452d,0x9c,0xdd,0x5d,0xb3,0x51,0x05,0xe7,0xeb);
+DEFINE_GUID(EncoderTransformation,0x8d0eb2d1,0xa58e,0x4ea8,0xaa,0x14,0x10,0x80,0x74,0xb7,0xb6,0xf9);
+DEFINE_GUID(EncoderLuminanceTable,0xedb33bce,0x0266,0x4a77,0xb9,0x04,0x27,0x21,0x60,0x99,0xe7,0x17);
+DEFINE_GUID(EncoderChrominanceTable,0xf2e455dc,0x09b3,0x4316,0x82,0x60,0x67,0x6a,0xda,0x32,0x48,0x1c);
+DEFINE_GUID(EncoderSaveFlag,0x292266fc,0xac40,0x47bf,0x8c, 0xfc, 0xa8, 0x5b, 0x89, 0xa6, 0x55, 0xde);
+
+DEFINE_GUID(CodecIImageBytes,0x025d1823,0x6c7d,0x447b,0xbb, 0xdb, 0xa3, 0xcb, 0xc3, 0xdf, 0xa2, 0xfc);
+
+MIDL_INTERFACE("025D1823-6C7D-447B-BBDB-A3CBC3DFA2FC")
+IImageBytes : public IUnknown
+{
+public:
+ // Return total number of bytes in the IStream
+
+ STDMETHOD(CountBytes)(
+ OUT UINT *pcb
+ ) = 0;
+
+ // Locks "cb" bytes, starting from "ulOffset" in the stream, and returns the
+ // pointer to the beginning of the locked memory chunk in "ppvBytes"
+
+ STDMETHOD(LockBytes)(
+ IN UINT cb,
+ IN ULONG ulOffset,
+ OUT const VOID ** ppvBytes
+ ) = 0;
+
+ // Unlocks "cb" bytes, pointed by "pvBytes", starting from "ulOffset" in the
+ // stream
+
+ STDMETHOD(UnlockBytes)(
+ IN const VOID *pvBytes,
+ IN UINT cb,
+ IN ULONG ulOffset
+ ) = 0;
+};
+
+//--------------------------------------------------------------------------
+// ImageCodecInfo structure
+//--------------------------------------------------------------------------
+
+class ImageCodecInfo
+{
+public:
+ CLSID Clsid;
+ GUID FormatID;
+ const WCHAR* CodecName;
+ const WCHAR* DllName;
+ const WCHAR* FormatDescription;
+ const WCHAR* FilenameExtension;
+ const WCHAR* MimeType;
+ DWORD Flags;
+ DWORD Version;
+ DWORD SigCount;
+ DWORD SigSize;
+ const BYTE* SigPattern;
+ const BYTE* SigMask;
+};
+
+//--------------------------------------------------------------------------
+// Information flags about image codecs
+//--------------------------------------------------------------------------
+
+enum ImageCodecFlags
+{
+ ImageCodecFlagsEncoder = 0x00000001,
+ ImageCodecFlagsDecoder = 0x00000002,
+ ImageCodecFlagsSupportBitmap = 0x00000004,
+ ImageCodecFlagsSupportVector = 0x00000008,
+ ImageCodecFlagsSeekableEncode = 0x00000010,
+ ImageCodecFlagsBlockingDecode = 0x00000020,
+
+ ImageCodecFlagsBuiltin = 0x00010000,
+ ImageCodecFlagsSystem = 0x00020000,
+ ImageCodecFlagsUser = 0x00040000
+};
+
+//---------------------------------------------------------------------------
+// Access modes used when calling Image::LockBits
+//---------------------------------------------------------------------------
+
+enum ImageLockMode
+{
+ ImageLockModeRead = 0x0001,
+ ImageLockModeWrite = 0x0002,
+ ImageLockModeUserInputBuf= 0x0004
+};
+
+//---------------------------------------------------------------------------
+// Information about image pixel data
+//---------------------------------------------------------------------------
+
+class BitmapData
+{
+public:
+ UINT Width;
+ UINT Height;
+ INT Stride;
+ PixelFormat PixelFormat;
+ VOID* Scan0;
+ UINT_PTR Reserved;
+};
+
+//---------------------------------------------------------------------------
+// Image flags
+//---------------------------------------------------------------------------
+
+enum ImageFlags
+{
+ ImageFlagsNone = 0,
+
+ // Low-word: shared with SINKFLAG_x
+
+ ImageFlagsScalable = 0x0001,
+ ImageFlagsHasAlpha = 0x0002,
+ ImageFlagsHasTranslucent = 0x0004,
+ ImageFlagsPartiallyScalable = 0x0008,
+
+ // Low-word: color space definition
+
+ ImageFlagsColorSpaceRGB = 0x0010,
+ ImageFlagsColorSpaceCMYK = 0x0020,
+ ImageFlagsColorSpaceGRAY = 0x0040,
+ ImageFlagsColorSpaceYCBCR = 0x0080,
+ ImageFlagsColorSpaceYCCK = 0x0100,
+
+ // Low-word: image size info
+
+ ImageFlagsHasRealDPI = 0x1000,
+ ImageFlagsHasRealPixelSize = 0x2000,
+
+ // High-word
+
+ ImageFlagsReadOnly = 0x00010000,
+ ImageFlagsCaching = 0x00020000
+};
+
+enum RotateFlipType
+{
+ RotateNoneFlipNone = 0,
+ Rotate90FlipNone = 1,
+ Rotate180FlipNone = 2,
+ Rotate270FlipNone = 3,
+
+ RotateNoneFlipX = 4,
+ Rotate90FlipX = 5,
+ Rotate180FlipX = 6,
+ Rotate270FlipX = 7,
+
+ RotateNoneFlipY = Rotate180FlipX,
+ Rotate90FlipY = Rotate270FlipX,
+ Rotate180FlipY = RotateNoneFlipX,
+ Rotate270FlipY = Rotate90FlipX,
+
+ RotateNoneFlipXY = Rotate180FlipNone,
+ Rotate90FlipXY = Rotate270FlipNone,
+ Rotate180FlipXY = RotateNoneFlipNone,
+ Rotate270FlipXY = Rotate90FlipNone
+};
+
+//---------------------------------------------------------------------------
+// Encoder Parameter structure
+//---------------------------------------------------------------------------
+class EncoderParameter
+{
+public:
+ GUID Guid; // GUID of the parameter
+ ULONG NumberOfValues; // Number of the parameter values
+ ULONG Type; // Value type, like ValueTypeLONG etc.
+ VOID* Value; // A pointer to the parameter values
+};
+
+//---------------------------------------------------------------------------
+// Encoder Parameters structure
+//---------------------------------------------------------------------------
+class EncoderParameters
+{
+public:
+ UINT Count; // Number of parameters in this structure
+ EncoderParameter Parameter[1]; // Parameter values
+};
+
+//---------------------------------------------------------------------------
+// Property Item
+//---------------------------------------------------------------------------
+class PropertyItem
+{
+public:
+ PROPID id; // ID of this property
+ ULONG length; // Length of the property value, in bytes
+ WORD type; // Type of the value, as one of TAG_TYPE_XXX
+ // defined above
+ VOID* value; // property value
+};
+
+#ifdef DCR_USE_NEW_140857
+//---------------------------------------------------------------------------
+// Image property types
+//---------------------------------------------------------------------------
+#define PropertyTagTypeByte 1
+#define PropertyTagTypeASCII 2
+#define PropertyTagTypeShort 3
+#define PropertyTagTypeLong 4
+#define PropertyTagTypeRational 5
+#define PropertyTagTypeUndefined 7
+#define PropertyTagTypeSLONG 9
+#define PropertyTagTypeSRational 10
+#endif
+
+//---------------------------------------------------------------------------
+// Image property ID tags
+//---------------------------------------------------------------------------
+
+#define PropertyTagExifIFD 0x8769
+#define PropertyTagGpsIFD 0x8825
+
+#define PropertyTagNewSubfileType 0x00FE
+#define PropertyTagSubfileType 0x00FF
+#define PropertyTagImageWidth 0x0100
+#define PropertyTagImageHeight 0x0101
+#define PropertyTagBitsPerSample 0x0102
+#define PropertyTagCompression 0x0103
+#define PropertyTagPhotometricInterp 0x0106
+#define PropertyTagThreshHolding 0x0107
+#define PropertyTagCellWidth 0x0108
+#define PropertyTagCellHeight 0x0109
+#define PropertyTagFillOrder 0x010A
+#define PropertyTagDocumentName 0x010D
+#define PropertyTagImageDescription 0x010E
+#define PropertyTagEquipMake 0x010F
+#define PropertyTagEquipModel 0x0110
+#define PropertyTagStripOffsets 0x0111
+#define PropertyTagOrientation 0x0112
+#define PropertyTagSamplesPerPixel 0x0115
+#define PropertyTagRowsPerStrip 0x0116
+#define PropertyTagStripBytesCount 0x0117
+#define PropertyTagMinSampleValue 0x0118
+#define PropertyTagMaxSampleValue 0x0119
+#define PropertyTagXResolution 0x011A // Image resolution in width direction
+#define PropertyTagYResolution 0x011B // Image resolution in height direction
+#define PropertyTagPlanarConfig 0x011C // Image data arrangement
+#define PropertyTagPageName 0x011D
+#define PropertyTagXPosition 0x011E
+#define PropertyTagYPosition 0x011F
+#define PropertyTagFreeOffset 0x0120
+#define PropertyTagFreeByteCounts 0x0121
+#define PropertyTagGrayResponseUnit 0x0122
+#define PropertyTagGrayResponseCurve 0x0123
+#define PropertyTagT4Option 0x0124
+#define PropertyTagT6Option 0x0125
+#define PropertyTagResolutionUnit 0x0128 // Unit of X and Y resolution
+#define PropertyTagPageNumber 0x0129
+#define PropertyTagTransferFuncition 0x012D
+#define PropertyTagSoftwareUsed 0x0131
+#define PropertyTagDateTime 0x0132
+#define PropertyTagArtist 0x013B
+#define PropertyTagHostComputer 0x013C
+#define PropertyTagPredictor 0x013D
+#define PropertyTagWhitePoint 0x013E
+#define PropertyTagPrimaryChromaticities 0x013F
+#define PropertyTagColorMap 0x0140
+#define PropertyTagHalftoneHints 0x0141
+#define PropertyTagTileWidth 0x0142
+#define PropertyTagTileLength 0x0143
+#define PropertyTagTileOffset 0x0144
+#define PropertyTagTileByteCounts 0x0145
+#define PropertyTagInkSet 0x014C
+#define PropertyTagInkNames 0x014D
+#define PropertyTagNumberOfInks 0x014E
+#define PropertyTagDotRange 0x0150
+#define PropertyTagTargetPrinter 0x0151
+#define PropertyTagExtraSamples 0x0152
+#define PropertyTagSampleFormat 0x0153
+#define PropertyTagSMinSampleValue 0x0154
+#define PropertyTagSMaxSampleValue 0x0155
+#define PropertyTagTransferRange 0x0156
+
+#define PropertyTagJPEGProc 0x0200
+#define PropertyTagJPEGInterFormat 0x0201
+#define PropertyTagJPEGInterLength 0x0202
+#define PropertyTagJPEGRestartInterval 0x0203
+#define PropertyTagJPEGLosslessPredictors 0x0205
+#define PropertyTagJPEGPointTransforms 0x0206
+#define PropertyTagJPEGQTables 0x0207
+#define PropertyTagJPEGDCTables 0x0208
+#define PropertyTagJPEGACTables 0x0209
+
+#define PropertyTagYCbCrCoefficients 0x0211
+#define PropertyTagYCbCrSubsampling 0x0212
+#define PropertyTagYCbCrPositioning 0x0213
+#define PropertyTagREFBlackWhite 0x0214
+
+#define PropertyTagICCProfile 0x8773 // This TAG is defined by ICC
+ // for embedded ICC in TIFF
+#define PropertyTagGamma 0x0301
+#define PropertyTagICCProfileDescriptor 0x0302
+#define PropertyTagSRGBRenderingIntent 0x0303
+
+#define PropertyTagImageTitle 0x0320
+#define PropertyTagCopyright 0x8298
+
+// Extra TAGs (Like Adobe Image Information tags etc.)
+
+#define PropertyTagResolutionXUnit 0x5001
+#define PropertyTagResolutionYUnit 0x5002
+#define PropertyTagResolutionXLengthUnit 0x5003
+#define PropertyTagResolutionYLengthUnit 0x5004
+#define PropertyTagPrintFlags 0x5005
+#define PropertyTagPrintFlagsVersion 0x5006
+#define PropertyTagPrintFlagsCrop 0x5007
+#define PropertyTagPrintFlagsBleedWidth 0x5008
+#define PropertyTagPrintFlagsBleedWidthScale 0x5009
+#define PropertyTagHalftoneLPI 0x500A
+#define PropertyTagHalftoneLPIUnit 0x500B
+#define PropertyTagHalftoneDegree 0x500C
+#define PropertyTagHalftoneShape 0x500D
+#define PropertyTagHalftoneMisc 0x500E
+#define PropertyTagHalftoneScreen 0x500F
+#define PropertyTagJPEGQuality 0x5010
+#define PropertyTagGridSize 0x5011
+#define PropertyTagThumbnailFormat 0x5012 // 1 = JPEG, 0 = RAW RGB
+#define PropertyTagThumbnailWidth 0x5013
+#define PropertyTagThumbnailHeight 0x5014
+#define PropertyTagThumbnailColorDepth 0x5015
+#define PropertyTagThumbnailPlanes 0x5016
+#define PropertyTagThumbnailRawBytes 0x5017
+#define PropertyTagThumbnailSize 0x5018
+#define PropertyTagThumbnailCompressedSize 0x5019
+#define PropertyTagColorTransferFunction 0x501A
+#define PropertyTagThumbnailData 0x501B// RAW thumbnail bits in
+ // JPEG format or RGB format
+ // depends on
+ // PropertyTagThumbnailFormat
+
+// Thumbnail related TAGs
+
+#define PropertyTagThumbnailImageWidth 0x5020 // Thumbnail width
+#define PropertyTagThumbnailImageHeight 0x5021 // Thumbnail height
+#define PropertyTagThumbnailBitsPerSample 0x5022 // Number of bits per
+ // component
+#define PropertyTagThumbnailCompression 0x5023 // Compression Scheme
+#define PropertyTagThumbnailPhotometricInterp 0x5024 // Pixel composition
+#define PropertyTagThumbnailImageDescription 0x5025 // Image Tile
+#define PropertyTagThumbnailEquipMake 0x5026 // Manufacturer of Image
+ // Input equipment
+#define PropertyTagThumbnailEquipModel 0x5027 // Model of Image input
+ // equipment
+#define PropertyTagThumbnailStripOffsets 0x5028 // Image data location
+#define PropertyTagThumbnailOrientation 0x5029 // Orientation of image
+#define PropertyTagThumbnailSamplesPerPixel 0x502A // Number of components
+#define PropertyTagThumbnailRowsPerStrip 0x502B // Number of rows per strip
+#define PropertyTagThumbnailStripBytesCount 0x502C // Bytes per compressed
+ // strip
+#define PropertyTagThumbnailResolutionX 0x502D // Resolution in width
+ // direction
+#define PropertyTagThumbnailResolutionY 0x502E // Resolution in height
+ // direction
+#define PropertyTagThumbnailPlanarConfig 0x502F // Image data arrangement
+#define PropertyTagThumbnailResolutionUnit 0x5030 // Unit of X and Y
+ // Resolution
+#define PropertyTagThumbnailTransferFunction 0x5031 // Transfer function
+#define PropertyTagThumbnailSoftwareUsed 0x5032 // Software used
+#define PropertyTagThumbnailDateTime 0x5033 // File change date and
+ // time
+#define PropertyTagThumbnailArtist 0x5034 // Person who created the
+ // image
+#define PropertyTagThumbnailWhitePoint 0x5035 // White point chromaticity
+#define PropertyTagThumbnailPrimaryChromaticities 0x5036
+ // Chromaticities of
+ // primaries
+#define PropertyTagThumbnailYCbCrCoefficients 0x5037 // Color space transforma-
+ // tion coefficients
+#define PropertyTagThumbnailYCbCrSubsampling 0x5038 // Subsampling ratio of Y
+ // to C
+#define PropertyTagThumbnailYCbCrPositioning 0x5039 // Y and C position
+#define PropertyTagThumbnailRefBlackWhite 0x503A // Pair of black and white
+ // reference values
+#define PropertyTagThumbnailCopyRight 0x503B // CopyRight holder
+
+#define PropertyTagLuminanceTable 0x5090
+#define PropertyTagChrominanceTable 0x5091
+
+#define PropertyTagFrameDelay 0x5100
+#define PropertyTagLoopCount 0x5101
+
+#define PropertyTagPixelUnit 0x5110 // Unit specifier for pixel/unit
+#define PropertyTagPixelPerUnitX 0x5111 // Pixels per unit in X
+#define PropertyTagPixelPerUnitY 0x5112 // Pixels per unit in Y
+#define PropertyTagPaletteHistogram 0x5113 // Palette histogram
+
+// EXIF specific tag
+
+#define PropertyTagExifExposureTime 0x829A
+#define PropertyTagExifFNumber 0x829D
+
+#define PropertyTagExifExposureProg 0x8822
+#define PropertyTagExifSpectralSense 0x8824
+#define PropertyTagExifISOSpeed 0x8827
+#define PropertyTagExifOECF 0x8828
+
+#define PropertyTagExifVer 0x9000
+#define PropertyTagExifDTOrig 0x9003 // Date & time of original
+#define PropertyTagExifDTDigitized 0x9004 // Date & time of digital data generation
+
+#define PropertyTagExifCompConfig 0x9101
+#define PropertyTagExifCompBPP 0x9102
+
+#define PropertyTagExifShutterSpeed 0x9201
+#define PropertyTagExifAperture 0x9202
+#define PropertyTagExifBrightness 0x9203
+#define PropertyTagExifExposureBias 0x9204
+#define PropertyTagExifMaxAperture 0x9205
+#define PropertyTagExifSubjectDist 0x9206
+#define PropertyTagExifMeteringMode 0x9207
+#define PropertyTagExifLightSource 0x9208
+#define PropertyTagExifFlash 0x9209
+#define PropertyTagExifFocalLength 0x920A
+#define PropertyTagExifMakerNote 0x927C
+#define PropertyTagExifUserComment 0x9286
+#define PropertyTagExifDTSubsec 0x9290 // Date & Time subseconds
+#define PropertyTagExifDTOrigSS 0x9291 // Date & Time original subseconds
+#define PropertyTagExifDTDigSS 0x9292 // Date & TIme digitized subseconds
+
+#define PropertyTagExifFPXVer 0xA000
+#define PropertyTagExifColorSpace 0xA001
+#define PropertyTagExifPixXDim 0xA002
+#define PropertyTagExifPixYDim 0xA003
+#define PropertyTagExifRelatedWav 0xA004 // related sound file
+#define PropertyTagExifInterop 0xA005
+#define PropertyTagExifFlashEnergy 0xA20B
+#define PropertyTagExifSpatialFR 0xA20C // Spatial Frequency Response
+#define PropertyTagExifFocalXRes 0xA20E // Focal Plane X Resolution
+#define PropertyTagExifFocalYRes 0xA20F // Focal Plane Y Resolution
+#define PropertyTagExifFocalResUnit 0xA210 // Focal Plane Resolution Unit
+#define PropertyTagExifSubjectLoc 0xA214
+#define PropertyTagExifExposureIndex 0xA215
+#define PropertyTagExifSensingMethod 0xA217
+#define PropertyTagExifFileSource 0xA300
+#define PropertyTagExifSceneType 0xA301
+#define PropertyTagExifCfaPattern 0xA302
+
+#define PropertyTagGpsVer 0x0000
+#define PropertyTagGpsLatitudeRef 0x0001
+#define PropertyTagGpsLatitude 0x0002
+#define PropertyTagGpsLongitudeRef 0x0003
+#define PropertyTagGpsLongitude 0x0004
+#define PropertyTagGpsAltitudeRef 0x0005
+#define PropertyTagGpsAltitude 0x0006
+#define PropertyTagGpsGpsTime 0x0007
+#define PropertyTagGpsGpsSatellites 0x0008
+#define PropertyTagGpsGpsStatus 0x0009
+#define PropertyTagGpsGpsMeasureMode 0x00A
+#define PropertyTagGpsGpsDop 0x000B // Measurement precision
+#define PropertyTagGpsSpeedRef 0x000C
+#define PropertyTagGpsSpeed 0x000D
+#define PropertyTagGpsTrackRef 0x000E
+#define PropertyTagGpsTrack 0x000F
+#define PropertyTagGpsImgDirRef 0x0010
+#define PropertyTagGpsImgDir 0x0011
+#define PropertyTagGpsMapDatum 0x0012
+#define PropertyTagGpsDestLatRef 0x0013
+#define PropertyTagGpsDestLat 0x0014
+#define PropertyTagGpsDestLongRef 0x0015
+#define PropertyTagGpsDestLong 0x0016
+#define PropertyTagGpsDestBearRef 0x0017
+#define PropertyTagGpsDestBear 0x0018
+#define PropertyTagGpsDestDistRef 0x0019
+#define PropertyTagGpsDestDist 0x001A
+
+#endif
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusLineCaps.h b/core/src/fxge/Microsoft SDK/include/GdiPlusLineCaps.h
index e8a2951f43..5ac880f59a 100644
--- a/core/src/fxge/Microsoft SDK/include/GdiPlusLineCaps.h
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusLineCaps.h
@@ -1,253 +1,253 @@
-/**************************************************************************\
-*
-* Copyright (c) 2000, Microsoft Corp. All Rights Reserved.
-*
-* Module Name:
-*
-* GdiplusLineCaps.h
-*
-* Abstract:
-*
-* APIs for Custom Line Caps
-*
-\**************************************************************************/
-
-#ifndef _GDIPLUSLINECAPS_H
-#define _GDIPLUSLINECAPS_H
-
-inline
-CustomLineCap::CustomLineCap(
- IN const GraphicsPath* fillPath,
- IN const GraphicsPath* strokePath,
- IN LineCap baseCap,
- IN REAL baseInset
- )
-{
- nativeCap = NULL;
- GpPath* nativeFillPath = NULL;
- GpPath* nativeStrokePath = NULL;
-
- if(fillPath)
- nativeFillPath = fillPath->nativePath;
- if(strokePath)
- nativeStrokePath = strokePath->nativePath;
-
- lastResult = DllExports::GdipCreateCustomLineCap(
- nativeFillPath, nativeStrokePath,
- baseCap, baseInset, &nativeCap);
-}
-
-inline
-CustomLineCap::CustomLineCap()
-{
- // This is used for default constructor for subclasses.
- // So don't create a nativeCap.
-
- nativeCap = NULL;
- lastResult = Ok;
-}
-
-inline
-CustomLineCap::~CustomLineCap()
-{
- DllExports::GdipDeleteCustomLineCap(nativeCap);
-}
-
-inline Status
-CustomLineCap::SetStrokeCaps(
- IN LineCap startCap,
- IN LineCap endCap)
-{
- return SetStatus(DllExports::GdipSetCustomLineCapStrokeCaps(nativeCap,
- startCap, endCap));
-}
-
-inline Status
-CustomLineCap::GetStrokeCaps(
- OUT LineCap* startCap,
- OUT LineCap* endCap) const
-{
- return SetStatus(DllExports::GdipGetCustomLineCapStrokeCaps(nativeCap,
- startCap, endCap));
-}
-
-inline Status
-CustomLineCap::SetStrokeJoin(
- IN LineJoin lineJoin)
-{
- return SetStatus(DllExports::GdipSetCustomLineCapStrokeJoin(nativeCap, lineJoin));
-}
-
-inline LineJoin
-CustomLineCap::GetStrokeJoin() const
-{
- LineJoin lineJoin;
-
- SetStatus(DllExports::GdipGetCustomLineCapStrokeJoin(nativeCap, &lineJoin));
-
- return lineJoin;
-}
-
-inline Status
-CustomLineCap::SetBaseCap(IN LineCap baseCap)
-{
- return SetStatus(DllExports::GdipSetCustomLineCapBaseCap(nativeCap, baseCap));
-}
-
-inline LineCap
-CustomLineCap::GetBaseCap() const
-{
- LineCap baseCap;
- SetStatus(DllExports::GdipGetCustomLineCapBaseCap(nativeCap, &baseCap));
-
- return baseCap;
-}
-
-inline Status
-CustomLineCap::SetBaseInset(IN REAL inset)
-{
- return SetStatus(DllExports::GdipSetCustomLineCapBaseInset(nativeCap, inset));
-}
-
-inline REAL
-CustomLineCap::GetBaseInset() const
-{
- REAL inset;
- SetStatus(DllExports::GdipGetCustomLineCapBaseInset(nativeCap, &inset));
-
- return inset;
-}
-
-
-inline Status
-CustomLineCap::SetWidthScale(IN REAL widthScale)
-{
- return SetStatus(DllExports::GdipSetCustomLineCapWidthScale(nativeCap, widthScale));
-}
-
-inline REAL
-CustomLineCap::GetWidthScale() const
-{
- REAL widthScale;
- SetStatus(DllExports::GdipGetCustomLineCapWidthScale(nativeCap, &widthScale));
-
- return widthScale;
-}
-
-inline CustomLineCap*
-CustomLineCap::Clone() const
-{
- GpCustomLineCap *newNativeLineCap = NULL;
-
- SetStatus(DllExports::GdipCloneCustomLineCap(nativeCap, &newNativeLineCap));
-
- if (lastResult == Ok)
- {
- CustomLineCap *newLineCap = new CustomLineCap(newNativeLineCap, lastResult);
- if (newLineCap == NULL)
- {
- SetStatus(DllExports::GdipDeleteCustomLineCap(newNativeLineCap));
- }
-
- return newLineCap;
- }
-
- return NULL;
-}
-
-class AdjustableArrowCap : public CustomLineCap
-{
-public:
-
- AdjustableArrowCap(
- IN REAL height,
- IN REAL width,
- IN BOOL isFilled = TRUE
- )
- {
- GpAdjustableArrowCap* cap = NULL;
-
- lastResult = DllExports::GdipCreateAdjustableArrowCap(
- height, width, isFilled, &cap);
- SetNativeCap(cap);
- }
-
- Status SetHeight(IN REAL height)
- {
- GpAdjustableArrowCap* cap = (GpAdjustableArrowCap*) nativeCap;
- return SetStatus(DllExports::GdipSetAdjustableArrowCapHeight(
- cap, height));
- }
-
- REAL GetHeight() const
- {
- GpAdjustableArrowCap* cap = (GpAdjustableArrowCap*) nativeCap;
- REAL height;
- SetStatus(DllExports::GdipGetAdjustableArrowCapHeight(
- cap, &height));
-
- return height;
- }
-
- Status SetWidth(IN REAL width)
- {
- GpAdjustableArrowCap* cap = (GpAdjustableArrowCap*) nativeCap;
- return SetStatus(DllExports::GdipSetAdjustableArrowCapWidth(
- cap, width));
- }
-
- REAL GetWidth() const
- {
- GpAdjustableArrowCap* cap = (GpAdjustableArrowCap*) nativeCap;
- REAL width;
- SetStatus(DllExports::GdipGetAdjustableArrowCapWidth(
- cap, &width));
-
- return width;
- }
-
- Status SetMiddleInset(IN REAL middleInset)
- {
- GpAdjustableArrowCap* cap = (GpAdjustableArrowCap*) nativeCap;
- return SetStatus(DllExports::GdipSetAdjustableArrowCapMiddleInset(
- cap, middleInset));
- }
-
- REAL GetMiddleInset() const
- {
- GpAdjustableArrowCap* cap = (GpAdjustableArrowCap*) nativeCap;
- REAL middleInset;
- SetStatus(DllExports::GdipGetAdjustableArrowCapMiddleInset(
- cap, &middleInset));
-
- return middleInset;
- }
-
- Status SetFillState(IN BOOL isFilled)
- {
- GpAdjustableArrowCap* cap = (GpAdjustableArrowCap*) nativeCap;
- return SetStatus(DllExports::GdipSetAdjustableArrowCapFillState(
- cap, isFilled));
- }
-
- BOOL IsFilled() const
- {
- GpAdjustableArrowCap* cap = (GpAdjustableArrowCap*) nativeCap;
- BOOL isFilled;
- SetStatus(DllExports::GdipGetAdjustableArrowCapFillState(
- cap, &isFilled));
-
- return isFilled;
- }
-
-#ifdef DCR_USE_NEW_250932
-
-private:
- AdjustableArrowCap(const AdjustableArrowCap &);
- AdjustableArrowCap& operator=(const AdjustableArrowCap &);
-
-#endif
-
-};
-
-#endif
+/**************************************************************************\
+*
+* Copyright (c) 2000, Microsoft Corp. All Rights Reserved.
+*
+* Module Name:
+*
+* GdiplusLineCaps.h
+*
+* Abstract:
+*
+* APIs for Custom Line Caps
+*
+\**************************************************************************/
+
+#ifndef _GDIPLUSLINECAPS_H
+#define _GDIPLUSLINECAPS_H
+
+inline
+CustomLineCap::CustomLineCap(
+ IN const GraphicsPath* fillPath,
+ IN const GraphicsPath* strokePath,
+ IN LineCap baseCap,
+ IN REAL baseInset
+ )
+{
+ nativeCap = NULL;
+ GpPath* nativeFillPath = NULL;
+ GpPath* nativeStrokePath = NULL;
+
+ if(fillPath)
+ nativeFillPath = fillPath->nativePath;
+ if(strokePath)
+ nativeStrokePath = strokePath->nativePath;
+
+ lastResult = DllExports::GdipCreateCustomLineCap(
+ nativeFillPath, nativeStrokePath,
+ baseCap, baseInset, &nativeCap);
+}
+
+inline
+CustomLineCap::CustomLineCap()
+{
+ // This is used for default constructor for subclasses.
+ // So don't create a nativeCap.
+
+ nativeCap = NULL;
+ lastResult = Ok;
+}
+
+inline
+CustomLineCap::~CustomLineCap()
+{
+ DllExports::GdipDeleteCustomLineCap(nativeCap);
+}
+
+inline Status
+CustomLineCap::SetStrokeCaps(
+ IN LineCap startCap,
+ IN LineCap endCap)
+{
+ return SetStatus(DllExports::GdipSetCustomLineCapStrokeCaps(nativeCap,
+ startCap, endCap));
+}
+
+inline Status
+CustomLineCap::GetStrokeCaps(
+ OUT LineCap* startCap,
+ OUT LineCap* endCap) const
+{
+ return SetStatus(DllExports::GdipGetCustomLineCapStrokeCaps(nativeCap,
+ startCap, endCap));
+}
+
+inline Status
+CustomLineCap::SetStrokeJoin(
+ IN LineJoin lineJoin)
+{
+ return SetStatus(DllExports::GdipSetCustomLineCapStrokeJoin(nativeCap, lineJoin));
+}
+
+inline LineJoin
+CustomLineCap::GetStrokeJoin() const
+{
+ LineJoin lineJoin;
+
+ SetStatus(DllExports::GdipGetCustomLineCapStrokeJoin(nativeCap, &lineJoin));
+
+ return lineJoin;
+}
+
+inline Status
+CustomLineCap::SetBaseCap(IN LineCap baseCap)
+{
+ return SetStatus(DllExports::GdipSetCustomLineCapBaseCap(nativeCap, baseCap));
+}
+
+inline LineCap
+CustomLineCap::GetBaseCap() const
+{
+ LineCap baseCap;
+ SetStatus(DllExports::GdipGetCustomLineCapBaseCap(nativeCap, &baseCap));
+
+ return baseCap;
+}
+
+inline Status
+CustomLineCap::SetBaseInset(IN REAL inset)
+{
+ return SetStatus(DllExports::GdipSetCustomLineCapBaseInset(nativeCap, inset));
+}
+
+inline REAL
+CustomLineCap::GetBaseInset() const
+{
+ REAL inset;
+ SetStatus(DllExports::GdipGetCustomLineCapBaseInset(nativeCap, &inset));
+
+ return inset;
+}
+
+
+inline Status
+CustomLineCap::SetWidthScale(IN REAL widthScale)
+{
+ return SetStatus(DllExports::GdipSetCustomLineCapWidthScale(nativeCap, widthScale));
+}
+
+inline REAL
+CustomLineCap::GetWidthScale() const
+{
+ REAL widthScale;
+ SetStatus(DllExports::GdipGetCustomLineCapWidthScale(nativeCap, &widthScale));
+
+ return widthScale;
+}
+
+inline CustomLineCap*
+CustomLineCap::Clone() const
+{
+ GpCustomLineCap *newNativeLineCap = NULL;
+
+ SetStatus(DllExports::GdipCloneCustomLineCap(nativeCap, &newNativeLineCap));
+
+ if (lastResult == Ok)
+ {
+ CustomLineCap *newLineCap = new CustomLineCap(newNativeLineCap, lastResult);
+ if (newLineCap == NULL)
+ {
+ SetStatus(DllExports::GdipDeleteCustomLineCap(newNativeLineCap));
+ }
+
+ return newLineCap;
+ }
+
+ return NULL;
+}
+
+class AdjustableArrowCap : public CustomLineCap
+{
+public:
+
+ AdjustableArrowCap(
+ IN REAL height,
+ IN REAL width,
+ IN BOOL isFilled = TRUE
+ )
+ {
+ GpAdjustableArrowCap* cap = NULL;
+
+ lastResult = DllExports::GdipCreateAdjustableArrowCap(
+ height, width, isFilled, &cap);
+ SetNativeCap(cap);
+ }
+
+ Status SetHeight(IN REAL height)
+ {
+ GpAdjustableArrowCap* cap = (GpAdjustableArrowCap*) nativeCap;
+ return SetStatus(DllExports::GdipSetAdjustableArrowCapHeight(
+ cap, height));
+ }
+
+ REAL GetHeight() const
+ {
+ GpAdjustableArrowCap* cap = (GpAdjustableArrowCap*) nativeCap;
+ REAL height;
+ SetStatus(DllExports::GdipGetAdjustableArrowCapHeight(
+ cap, &height));
+
+ return height;
+ }
+
+ Status SetWidth(IN REAL width)
+ {
+ GpAdjustableArrowCap* cap = (GpAdjustableArrowCap*) nativeCap;
+ return SetStatus(DllExports::GdipSetAdjustableArrowCapWidth(
+ cap, width));
+ }
+
+ REAL GetWidth() const
+ {
+ GpAdjustableArrowCap* cap = (GpAdjustableArrowCap*) nativeCap;
+ REAL width;
+ SetStatus(DllExports::GdipGetAdjustableArrowCapWidth(
+ cap, &width));
+
+ return width;
+ }
+
+ Status SetMiddleInset(IN REAL middleInset)
+ {
+ GpAdjustableArrowCap* cap = (GpAdjustableArrowCap*) nativeCap;
+ return SetStatus(DllExports::GdipSetAdjustableArrowCapMiddleInset(
+ cap, middleInset));
+ }
+
+ REAL GetMiddleInset() const
+ {
+ GpAdjustableArrowCap* cap = (GpAdjustableArrowCap*) nativeCap;
+ REAL middleInset;
+ SetStatus(DllExports::GdipGetAdjustableArrowCapMiddleInset(
+ cap, &middleInset));
+
+ return middleInset;
+ }
+
+ Status SetFillState(IN BOOL isFilled)
+ {
+ GpAdjustableArrowCap* cap = (GpAdjustableArrowCap*) nativeCap;
+ return SetStatus(DllExports::GdipSetAdjustableArrowCapFillState(
+ cap, isFilled));
+ }
+
+ BOOL IsFilled() const
+ {
+ GpAdjustableArrowCap* cap = (GpAdjustableArrowCap*) nativeCap;
+ BOOL isFilled;
+ SetStatus(DllExports::GdipGetAdjustableArrowCapFillState(
+ cap, &isFilled));
+
+ return isFilled;
+ }
+
+#ifdef DCR_USE_NEW_250932
+
+private:
+ AdjustableArrowCap(const AdjustableArrowCap &);
+ AdjustableArrowCap& operator=(const AdjustableArrowCap &);
+
+#endif
+
+};
+
+#endif
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusMatrix.h b/core/src/fxge/Microsoft SDK/include/GdiPlusMatrix.h
index 7fa3df8cd1..1338d8c1ac 100644
--- a/core/src/fxge/Microsoft SDK/include/GdiPlusMatrix.h
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusMatrix.h
@@ -1,309 +1,309 @@
-/**************************************************************************\
-*
-* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
-*
-* Module Name:
-*
-* GdiplusMatrix.h
-*
-* Abstract:
-*
-* GDI+ Matrix class
-*
-\**************************************************************************/
-
-class Matrix : public GdiplusBase
-{
-public:
- friend class Graphics;
- friend class GraphicsPath;
- friend class TextureBrush;
- friend class LinearGradientBrush;
- friend class PathGradientBrush;
- friend class Pen;
- friend class Region;
-
- // Default constructor - set to identity matrix
-
- Matrix()
- {
- GpMatrix *matrix = NULL;
-
- lastResult = DllExports::GdipCreateMatrix(&matrix);
-
- SetNativeMatrix(matrix);
- }
-
- Matrix(IN REAL m11,
- IN REAL m12,
- IN REAL m21,
- IN REAL m22,
- IN REAL dx,
- IN REAL dy)
- {
- GpMatrix *matrix = NULL;
-
- lastResult = DllExports::GdipCreateMatrix2(m11, m12, m21, m22,
- dx, dy, &matrix);
-
- SetNativeMatrix(matrix);
- }
-
- Matrix(IN const RectF& rect,
- IN const PointF* dstplg)
- {
- GpMatrix *matrix = NULL;
-
- lastResult = DllExports::GdipCreateMatrix3(&rect,
- dstplg,
- &matrix);
-
- SetNativeMatrix(matrix);
- }
-
- Matrix(IN const Rect& rect,
- IN const Point* dstplg)
- {
- GpMatrix *matrix = NULL;
-
- lastResult = DllExports::GdipCreateMatrix3I(&rect,
- dstplg,
- &matrix);
-
- SetNativeMatrix(matrix);
- }
-
- ~Matrix()
- {
- DllExports::GdipDeleteMatrix(nativeMatrix);
- }
-
- Matrix *Clone() const
- {
- GpMatrix *cloneMatrix = NULL;
-
- SetStatus(DllExports::GdipCloneMatrix(nativeMatrix,
- &cloneMatrix));
-
- if (lastResult != Ok)
- return NULL;
-
- return new Matrix(cloneMatrix);
- }
-
- Status GetElements(OUT REAL *m) const
- {
- return SetStatus(DllExports::GdipGetMatrixElements(nativeMatrix, m));
- }
-
- Status SetElements(IN REAL m11,
- IN REAL m12,
- IN REAL m21,
- IN REAL m22,
- IN REAL dx,
- IN REAL dy)
- {
- return SetStatus(DllExports::GdipSetMatrixElements(nativeMatrix,
- m11, m12, m21, m22, dx, dy));
- }
-
- REAL OffsetX() const
- {
- REAL elements[6];
-
- if (GetElements(&elements[0]) == Ok)
- return elements[4];
- else
- return 0.0f;
- }
-
- REAL OffsetY() const
- {
- REAL elements[6];
-
- if (GetElements(&elements[0]) == Ok)
- return elements[5];
- else
- return 0.0f;
- }
-
- Status Reset()
- {
- // set identity matrix elements
- return SetStatus(DllExports::GdipSetMatrixElements(nativeMatrix,
- 1.0, 0.0, 0.0, 1.0, 0.0, 0.0));
- }
-
- Status Multiply(IN const Matrix *matrix,
- IN MatrixOrder order = MatrixOrderPrepend)
- {
- return SetStatus(DllExports::GdipMultiplyMatrix(nativeMatrix,
- matrix->nativeMatrix,
- order));
- }
-
- Status Translate(IN REAL offsetX,
- IN REAL offsetY,
- IN MatrixOrder order = MatrixOrderPrepend)
- {
- return SetStatus(DllExports::GdipTranslateMatrix(nativeMatrix, offsetX, offsetY, order));
- }
-
- Status Scale(IN REAL scaleX,
- IN REAL scaleY,
- IN MatrixOrder order = MatrixOrderPrepend)
- {
- return SetStatus(DllExports::GdipScaleMatrix(nativeMatrix, scaleX, scaleY, order));
- }
-
- Status Rotate(IN REAL angle,
- IN MatrixOrder order = MatrixOrderPrepend)
- {
- return SetStatus(DllExports::GdipRotateMatrix(nativeMatrix, angle, order));
- }
-
- Status RotateAt(IN REAL angle,
- IN const PointF& center,
- IN MatrixOrder order = MatrixOrderPrepend)
- {
- if(order == MatrixOrderPrepend)
- {
- SetStatus(DllExports::GdipTranslateMatrix(nativeMatrix, center.X, center.Y, order));
- SetStatus(DllExports::GdipRotateMatrix(nativeMatrix, angle, order));
- return SetStatus(DllExports::GdipTranslateMatrix(nativeMatrix, - center.X, - center.Y, order));
- }
- else
- {
- SetStatus(DllExports::GdipTranslateMatrix(nativeMatrix, - center.X, - center.Y, order));
- SetStatus(DllExports::GdipRotateMatrix(nativeMatrix, angle, order));
- return SetStatus(DllExports::GdipTranslateMatrix(nativeMatrix, center.X, center.Y, order));
- }
- }
-
- Status Shear(IN REAL shearX,
- IN REAL shearY,
- IN MatrixOrder order = MatrixOrderPrepend)
- {
- return SetStatus(DllExports::GdipShearMatrix(nativeMatrix, shearX, shearY, order));
- }
-
- Status Invert()
- {
- return SetStatus(DllExports::GdipInvertMatrix(nativeMatrix));
- }
-
- // float version
- Status TransformPoints(IN OUT PointF* pts,
- IN INT count = 1) const
- {
- return SetStatus(DllExports::GdipTransformMatrixPoints(nativeMatrix, pts, count));
- }
-
- Status TransformPoints(IN OUT Point* pts,
- IN INT count = 1) const
- {
- return SetStatus(DllExports::GdipTransformMatrixPointsI(nativeMatrix,
- pts,
- count));
- }
-
- Status TransformVectors(IN OUT PointF* pts,
- IN INT count = 1) const
- {
- return SetStatus(DllExports::GdipVectorTransformMatrixPoints(nativeMatrix, pts, count));
- }
-
- Status TransformVectors(IN OUT Point* pts,
- IN INT count = 1) const
- {
- return SetStatus(DllExports::GdipVectorTransformMatrixPointsI(nativeMatrix,
- pts,
- count));
- }
-
- BOOL IsInvertible() const
- {
- BOOL result = FALSE;
-
- SetStatus(DllExports::GdipIsMatrixInvertible(nativeMatrix, &result));
-
- return result;
- }
-
- BOOL IsIdentity() const
- {
- BOOL result = FALSE;
-
- SetStatus(DllExports::GdipIsMatrixIdentity(nativeMatrix, &result));
-
- return result;
- }
-
- BOOL Equals(IN const Matrix *matrix) const
- {
- BOOL result = FALSE;
-
- SetStatus(DllExports::GdipIsMatrixEqual(nativeMatrix,
- matrix->nativeMatrix, &result));
-
- return result;
- }
-
- Status GetLastStatus() const
- {
- Status lastStatus = lastResult;
- lastResult = Ok;
-
- return lastStatus;
- }
-
-protected:
-
-#ifdef DCR_USE_NEW_250932
-
-private:
- Matrix(const Matrix &);
- Matrix& operator=(const Matrix &);
-protected:
-
-#else
-
- Matrix(const Matrix& matrix)
- {
- matrix;
- SetStatus(NotImplemented);
- SetNativeMatrix(NULL);
- }
-
- Matrix& operator=(const Matrix& matrix)
- {
- matrix;
- SetStatus(NotImplemented);
- return *this;
- }
-
-#endif
-
- Matrix(GpMatrix *nativeMatrix)
- {
- lastResult = Ok;
- SetNativeMatrix(nativeMatrix);
- }
-
- VOID SetNativeMatrix(GpMatrix *nativeMatrix)
- {
- this->nativeMatrix = nativeMatrix;
- }
-
- Status SetStatus(Status status) const
- {
- if (status != Ok)
- return (lastResult = status);
- else
- return status;
- }
-
-protected:
- GpMatrix *nativeMatrix;
- mutable Status lastResult;
-};
+/**************************************************************************\
+*
+* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
+*
+* Module Name:
+*
+* GdiplusMatrix.h
+*
+* Abstract:
+*
+* GDI+ Matrix class
+*
+\**************************************************************************/
+
+class Matrix : public GdiplusBase
+{
+public:
+ friend class Graphics;
+ friend class GraphicsPath;
+ friend class TextureBrush;
+ friend class LinearGradientBrush;
+ friend class PathGradientBrush;
+ friend class Pen;
+ friend class Region;
+
+ // Default constructor - set to identity matrix
+
+ Matrix()
+ {
+ GpMatrix *matrix = NULL;
+
+ lastResult = DllExports::GdipCreateMatrix(&matrix);
+
+ SetNativeMatrix(matrix);
+ }
+
+ Matrix(IN REAL m11,
+ IN REAL m12,
+ IN REAL m21,
+ IN REAL m22,
+ IN REAL dx,
+ IN REAL dy)
+ {
+ GpMatrix *matrix = NULL;
+
+ lastResult = DllExports::GdipCreateMatrix2(m11, m12, m21, m22,
+ dx, dy, &matrix);
+
+ SetNativeMatrix(matrix);
+ }
+
+ Matrix(IN const RectF& rect,
+ IN const PointF* dstplg)
+ {
+ GpMatrix *matrix = NULL;
+
+ lastResult = DllExports::GdipCreateMatrix3(&rect,
+ dstplg,
+ &matrix);
+
+ SetNativeMatrix(matrix);
+ }
+
+ Matrix(IN const Rect& rect,
+ IN const Point* dstplg)
+ {
+ GpMatrix *matrix = NULL;
+
+ lastResult = DllExports::GdipCreateMatrix3I(&rect,
+ dstplg,
+ &matrix);
+
+ SetNativeMatrix(matrix);
+ }
+
+ ~Matrix()
+ {
+ DllExports::GdipDeleteMatrix(nativeMatrix);
+ }
+
+ Matrix *Clone() const
+ {
+ GpMatrix *cloneMatrix = NULL;
+
+ SetStatus(DllExports::GdipCloneMatrix(nativeMatrix,
+ &cloneMatrix));
+
+ if (lastResult != Ok)
+ return NULL;
+
+ return new Matrix(cloneMatrix);
+ }
+
+ Status GetElements(OUT REAL *m) const
+ {
+ return SetStatus(DllExports::GdipGetMatrixElements(nativeMatrix, m));
+ }
+
+ Status SetElements(IN REAL m11,
+ IN REAL m12,
+ IN REAL m21,
+ IN REAL m22,
+ IN REAL dx,
+ IN REAL dy)
+ {
+ return SetStatus(DllExports::GdipSetMatrixElements(nativeMatrix,
+ m11, m12, m21, m22, dx, dy));
+ }
+
+ REAL OffsetX() const
+ {
+ REAL elements[6];
+
+ if (GetElements(&elements[0]) == Ok)
+ return elements[4];
+ else
+ return 0.0f;
+ }
+
+ REAL OffsetY() const
+ {
+ REAL elements[6];
+
+ if (GetElements(&elements[0]) == Ok)
+ return elements[5];
+ else
+ return 0.0f;
+ }
+
+ Status Reset()
+ {
+ // set identity matrix elements
+ return SetStatus(DllExports::GdipSetMatrixElements(nativeMatrix,
+ 1.0, 0.0, 0.0, 1.0, 0.0, 0.0));
+ }
+
+ Status Multiply(IN const Matrix *matrix,
+ IN MatrixOrder order = MatrixOrderPrepend)
+ {
+ return SetStatus(DllExports::GdipMultiplyMatrix(nativeMatrix,
+ matrix->nativeMatrix,
+ order));
+ }
+
+ Status Translate(IN REAL offsetX,
+ IN REAL offsetY,
+ IN MatrixOrder order = MatrixOrderPrepend)
+ {
+ return SetStatus(DllExports::GdipTranslateMatrix(nativeMatrix, offsetX, offsetY, order));
+ }
+
+ Status Scale(IN REAL scaleX,
+ IN REAL scaleY,
+ IN MatrixOrder order = MatrixOrderPrepend)
+ {
+ return SetStatus(DllExports::GdipScaleMatrix(nativeMatrix, scaleX, scaleY, order));
+ }
+
+ Status Rotate(IN REAL angle,
+ IN MatrixOrder order = MatrixOrderPrepend)
+ {
+ return SetStatus(DllExports::GdipRotateMatrix(nativeMatrix, angle, order));
+ }
+
+ Status RotateAt(IN REAL angle,
+ IN const PointF& center,
+ IN MatrixOrder order = MatrixOrderPrepend)
+ {
+ if(order == MatrixOrderPrepend)
+ {
+ SetStatus(DllExports::GdipTranslateMatrix(nativeMatrix, center.X, center.Y, order));
+ SetStatus(DllExports::GdipRotateMatrix(nativeMatrix, angle, order));
+ return SetStatus(DllExports::GdipTranslateMatrix(nativeMatrix, - center.X, - center.Y, order));
+ }
+ else
+ {
+ SetStatus(DllExports::GdipTranslateMatrix(nativeMatrix, - center.X, - center.Y, order));
+ SetStatus(DllExports::GdipRotateMatrix(nativeMatrix, angle, order));
+ return SetStatus(DllExports::GdipTranslateMatrix(nativeMatrix, center.X, center.Y, order));
+ }
+ }
+
+ Status Shear(IN REAL shearX,
+ IN REAL shearY,
+ IN MatrixOrder order = MatrixOrderPrepend)
+ {
+ return SetStatus(DllExports::GdipShearMatrix(nativeMatrix, shearX, shearY, order));
+ }
+
+ Status Invert()
+ {
+ return SetStatus(DllExports::GdipInvertMatrix(nativeMatrix));
+ }
+
+ // float version
+ Status TransformPoints(IN OUT PointF* pts,
+ IN INT count = 1) const
+ {
+ return SetStatus(DllExports::GdipTransformMatrixPoints(nativeMatrix, pts, count));
+ }
+
+ Status TransformPoints(IN OUT Point* pts,
+ IN INT count = 1) const
+ {
+ return SetStatus(DllExports::GdipTransformMatrixPointsI(nativeMatrix,
+ pts,
+ count));
+ }
+
+ Status TransformVectors(IN OUT PointF* pts,
+ IN INT count = 1) const
+ {
+ return SetStatus(DllExports::GdipVectorTransformMatrixPoints(nativeMatrix, pts, count));
+ }
+
+ Status TransformVectors(IN OUT Point* pts,
+ IN INT count = 1) const
+ {
+ return SetStatus(DllExports::GdipVectorTransformMatrixPointsI(nativeMatrix,
+ pts,
+ count));
+ }
+
+ BOOL IsInvertible() const
+ {
+ BOOL result = FALSE;
+
+ SetStatus(DllExports::GdipIsMatrixInvertible(nativeMatrix, &result));
+
+ return result;
+ }
+
+ BOOL IsIdentity() const
+ {
+ BOOL result = FALSE;
+
+ SetStatus(DllExports::GdipIsMatrixIdentity(nativeMatrix, &result));
+
+ return result;
+ }
+
+ BOOL Equals(IN const Matrix *matrix) const
+ {
+ BOOL result = FALSE;
+
+ SetStatus(DllExports::GdipIsMatrixEqual(nativeMatrix,
+ matrix->nativeMatrix, &result));
+
+ return result;
+ }
+
+ Status GetLastStatus() const
+ {
+ Status lastStatus = lastResult;
+ lastResult = Ok;
+
+ return lastStatus;
+ }
+
+protected:
+
+#ifdef DCR_USE_NEW_250932
+
+private:
+ Matrix(const Matrix &);
+ Matrix& operator=(const Matrix &);
+protected:
+
+#else
+
+ Matrix(const Matrix& matrix)
+ {
+ matrix;
+ SetStatus(NotImplemented);
+ SetNativeMatrix(NULL);
+ }
+
+ Matrix& operator=(const Matrix& matrix)
+ {
+ matrix;
+ SetStatus(NotImplemented);
+ return *this;
+ }
+
+#endif
+
+ Matrix(GpMatrix *nativeMatrix)
+ {
+ lastResult = Ok;
+ SetNativeMatrix(nativeMatrix);
+ }
+
+ VOID SetNativeMatrix(GpMatrix *nativeMatrix)
+ {
+ this->nativeMatrix = nativeMatrix;
+ }
+
+ Status SetStatus(Status status) const
+ {
+ if (status != Ok)
+ return (lastResult = status);
+ else
+ return status;
+ }
+
+protected:
+ GpMatrix *nativeMatrix;
+ mutable Status lastResult;
+};
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusMem.h b/core/src/fxge/Microsoft SDK/include/GdiPlusMem.h
index 5f92c1e141..a0e0e44f37 100644
--- a/core/src/fxge/Microsoft SDK/include/GdiPlusMem.h
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusMem.h
@@ -1,49 +1,49 @@
-/**************************************************************************\
-*
-* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
-*
-* Module Name:
-*
-* GdiplusMem.h
-*
-* Abstract:
-*
-* Flat GDI+ Memory Allocators - header file
-*
-\**************************************************************************/
-
-// TODO: this file style needs to be made internally consistent with the way
-// it handles breaking the long argument lists across multiple lines
-
-#ifndef _GDIPLUSMEM_H
-#define _GDIPLUSMEM_H
-
-#define WINGDIPAPI __stdcall
-
-// currently, only C++ wrapper API's force const.
-
-#ifdef _GDIPLUS_H
-#define GDIPCONST const
-#else
-#define GDIPCONST
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-//----------------------------------------------------------------------------
-// Memory Allocation APIs
-//----------------------------------------------------------------------------
-
-void* WINGDIPAPI
-GdipAlloc(size_t size);
-
-void WINGDIPAPI
-GdipFree(void* ptr);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // !_GDIPLUSMEM_H
+/**************************************************************************\
+*
+* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
+*
+* Module Name:
+*
+* GdiplusMem.h
+*
+* Abstract:
+*
+* Flat GDI+ Memory Allocators - header file
+*
+\**************************************************************************/
+
+// TODO: this file style needs to be made internally consistent with the way
+// it handles breaking the long argument lists across multiple lines
+
+#ifndef _GDIPLUSMEM_H
+#define _GDIPLUSMEM_H
+
+#define WINGDIPAPI __stdcall
+
+// currently, only C++ wrapper API's force const.
+
+#ifdef _GDIPLUS_H
+#define GDIPCONST const
+#else
+#define GDIPCONST
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+//----------------------------------------------------------------------------
+// Memory Allocation APIs
+//----------------------------------------------------------------------------
+
+void* WINGDIPAPI
+GdipAlloc(size_t size);
+
+void WINGDIPAPI
+GdipFree(void* ptr);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // !_GDIPLUSMEM_H
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusMetaFile.h b/core/src/fxge/Microsoft SDK/include/GdiPlusMetaFile.h
index 3d07dd64d3..f7e0d91aaa 100644
--- a/core/src/fxge/Microsoft SDK/include/GdiPlusMetaFile.h
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusMetaFile.h
@@ -1,374 +1,374 @@
-/**************************************************************************\
-*
-* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
-*
-* Module Name:
-*
-* GdiplusMetafile.h
-*
-* Abstract:
-*
-* Metafile related declarations
-*
-\**************************************************************************/
-
-#ifndef _GDIPLUSMETAFILE_H
-#define _GDIPLUSMETAFILE_H
-
-class Metafile : public Image
-{
-public:
- friend class Image;
-
- // Read a metafile
- Metafile()
- {
- SetNativeImage(NULL);
- lastResult = Ok;
- }
-
- // Playback a metafile from a HMETAFILE
- // If deleteWmf is TRUE, then when the metafile is deleted,
- // the hWmf will also be deleted. Otherwise, it won't be.
- Metafile(IN HMETAFILE hWmf,
- IN const APMFileHeader * apmFileHeader,
- IN BOOL deleteWmf = FALSE)
- {
- GpMetafile * metafile = NULL;
-
- lastResult = DllExports::GdipCreateMetafileFromWmf(hWmf, deleteWmf, apmFileHeader, &metafile);
-
- SetNativeImage(metafile);
- }
-
- // Playback a metafile from a HENHMETAFILE
- // If deleteEmf is TRUE, then when the metafile is deleted,
- // the hEmf will also be deleted. Otherwise, it won't be.
- Metafile(IN HENHMETAFILE hEmf,
- IN BOOL deleteEmf = FALSE)
- {
- GpMetafile * metafile = NULL;
-
- lastResult = DllExports::GdipCreateMetafileFromEmf(hEmf, deleteEmf, &metafile);
-
- SetNativeImage(metafile);
- }
-
- // Playback a metafile from a file
- Metafile(IN const WCHAR* filename)
- {
- GpMetafile * metafile = NULL;
-
- lastResult = DllExports::GdipCreateMetafileFromFile(filename, &metafile);
-
- SetNativeImage(metafile);
- }
-
- // Playback a WMF metafile from a file
- Metafile(IN const WCHAR* filename,
- IN const APMFileHeader * apmFileHeader
- )
- {
- GpMetafile * metafile = NULL;
-
- lastResult = DllExports::GdipCreateMetafileFromWmfFile(filename, apmFileHeader, &metafile);
-
- SetNativeImage(metafile);
- }
-
- // Playback a metafile from a stream
- Metafile(IN IStream* stream)
- {
- GpMetafile * metafile = NULL;
-
- lastResult = DllExports::GdipCreateMetafileFromStream(stream, &metafile);
-
- SetNativeImage(metafile);
- }
-
- // Record a metafile to memory
- Metafile(
- IN HDC referenceHdc,
- IN EmfType type = EmfTypeEmfPlusDual,
- IN const WCHAR * description = NULL
- )
- {
- GpMetafile * metafile = NULL;
-
- lastResult = DllExports::GdipRecordMetafile(
- referenceHdc, type, NULL, MetafileFrameUnitGdi,
- description, &metafile);
-
- SetNativeImage(metafile);
- }
-
- // Record a metafile to memory
- Metafile(
- IN HDC referenceHdc,
- IN const RectF & frameRect,
- IN MetafileFrameUnit frameUnit = MetafileFrameUnitGdi,
- IN EmfType type = EmfTypeEmfPlusDual,
- IN const WCHAR * description = NULL
- )
- {
- GpMetafile * metafile = NULL;
-
- lastResult = DllExports::GdipRecordMetafile(
- referenceHdc, type, &frameRect, frameUnit,
- description, &metafile);
-
- SetNativeImage(metafile);
- }
-
- // Record a metafile to memory
- Metafile(
- IN HDC referenceHdc,
- IN const Rect & frameRect,
- IN MetafileFrameUnit frameUnit = MetafileFrameUnitGdi,
- IN EmfType type = EmfTypeEmfPlusDual,
- IN const WCHAR * description = NULL
- )
- {
- GpMetafile * metafile = NULL;
-
- lastResult = DllExports::GdipRecordMetafileI(
- referenceHdc, type, &frameRect, frameUnit,
- description, &metafile);
-
- SetNativeImage(metafile);
- }
-
- // Record a metafile to a file
- Metafile(
- IN const WCHAR* fileName,
- IN HDC referenceHdc,
- IN EmfType type = EmfTypeEmfPlusDual,
- IN const WCHAR * description = NULL
- )
- {
- GpMetafile * metafile = NULL;
-
- lastResult = DllExports::GdipRecordMetafileFileName(fileName,
- referenceHdc, type, NULL, MetafileFrameUnitGdi,
- description, &metafile);
-
- SetNativeImage(metafile);
- }
-
- // Record a metafile to a file
- Metafile(
- IN const WCHAR* fileName,
- IN HDC referenceHdc,
- IN const RectF & frameRect,
- IN MetafileFrameUnit frameUnit = MetafileFrameUnitGdi,
- IN EmfType type = EmfTypeEmfPlusDual,
- IN const WCHAR * description = NULL
- )
- {
- GpMetafile * metafile = NULL;
-
- lastResult = DllExports::GdipRecordMetafileFileName(fileName,
- referenceHdc, type, &frameRect, frameUnit,
- description, &metafile);
-
- SetNativeImage(metafile);
- }
-
- // Record a metafile to a file
- Metafile(
- IN const WCHAR* fileName,
- IN HDC referenceHdc,
- IN const Rect & frameRect,
- IN MetafileFrameUnit frameUnit = MetafileFrameUnitGdi,
- IN EmfType type = EmfTypeEmfPlusDual,
- IN const WCHAR * description = NULL
- )
- {
- GpMetafile * metafile = NULL;
-
- lastResult = DllExports::GdipRecordMetafileFileNameI(fileName,
- referenceHdc, type, &frameRect, frameUnit,
- description, &metafile);
-
- SetNativeImage(metafile);
- }
-
- // Record a metafile to a stream
- Metafile(
- IN IStream * stream,
- IN HDC referenceHdc,
- IN EmfType type = EmfTypeEmfPlusDual,
- IN const WCHAR * description = NULL
- )
- {
- GpMetafile * metafile = NULL;
-
- lastResult = DllExports::GdipRecordMetafileStream(stream,
- referenceHdc, type, NULL, MetafileFrameUnitGdi,
- description, &metafile);
-
- SetNativeImage(metafile);
- }
-
- // Record a metafile to a stream
- Metafile(
- IN IStream * stream,
- IN HDC referenceHdc,
- IN const RectF & frameRect,
- IN MetafileFrameUnit frameUnit = MetafileFrameUnitGdi,
- IN EmfType type = EmfTypeEmfPlusDual,
- IN const WCHAR * description = NULL
- )
- {
- GpMetafile * metafile = NULL;
-
- lastResult = DllExports::GdipRecordMetafileStream(stream,
- referenceHdc, type, &frameRect, frameUnit,
- description, &metafile);
-
- SetNativeImage(metafile);
- }
-
- // Write a metafile to a stream with down-level GDI records
- Metafile(
- IN IStream * stream,
- IN HDC referenceHdc,
- IN const Rect & frameRect,
- IN MetafileFrameUnit frameUnit = MetafileFrameUnitGdi,
- IN EmfType type = EmfTypeEmfPlusDual,
- IN const WCHAR * description = NULL
- )
- {
- GpMetafile * metafile = NULL;
-
- lastResult = DllExports::GdipRecordMetafileStreamI(stream,
- referenceHdc, type, &frameRect, frameUnit,
- description, &metafile);
-
- SetNativeImage(metafile);
- }
-
- static Status GetMetafileHeader(
- IN HMETAFILE hWmf,
- IN const APMFileHeader * apmFileHeader,
- OUT MetafileHeader * header
- )
- {
- return DllExports::GdipGetMetafileHeaderFromWmf(hWmf, apmFileHeader, header);
- }
-
- static Status GetMetafileHeader(
- IN HENHMETAFILE hEmf,
- OUT MetafileHeader * header
- )
- {
- return DllExports::GdipGetMetafileHeaderFromEmf(hEmf, header);
- }
-
- static Status GetMetafileHeader(
- IN const WCHAR* filename,
- OUT MetafileHeader * header
- )
- {
- return DllExports::GdipGetMetafileHeaderFromFile(filename, header);
- }
-
- static Status GetMetafileHeader(
- IN IStream * stream,
- OUT MetafileHeader * header
- )
- {
- return DllExports::GdipGetMetafileHeaderFromStream(stream, header);
- }
-
- Status GetMetafileHeader(
- OUT MetafileHeader * header
- ) const
- {
- return SetStatus(DllExports::GdipGetMetafileHeaderFromMetafile(
- (GpMetafile *)nativeImage,
- header));
- }
-
- // Once this method is called, the Metafile object is in an invalid state
- // and can no longer be used. It is the responsiblity of the caller to
- // invoke DeleteEnhMetaFile to delete this hEmf.
-
- HENHMETAFILE GetHENHMETAFILE()
- {
- HENHMETAFILE hEmf;
-
- SetStatus(DllExports::GdipGetHemfFromMetafile((GpMetafile *)nativeImage, &hEmf));
-
- return hEmf;
- }
-
- // Used in conjuction with Graphics::EnumerateMetafile to play an EMF+
- // The data must be DWORD aligned if it's an EMF or EMF+. It must be
- // WORD aligned if it's a WMF.
- Status
- PlayRecord(
- IN EmfPlusRecordType recordType,
- IN UINT flags,
- IN UINT dataSize,
- IN const BYTE * data
- ) const
- {
- return SetStatus(DllExports::GdipPlayMetafileRecord(
- (GpMetafile *)nativeImage,
- recordType,
- flags,
- dataSize,
- data));
- }
-
- // If you're using a printer HDC for the metafile, but you want the
- // metafile rasterized at screen resolution, then use this API to set
- // the rasterization dpi of the metafile to the screen resolution,
- // e.g. 96 dpi or 120 dpi.
- Status SetDownLevelRasterizationLimit(
- IN UINT metafileRasterizationLimitDpi
- )
- {
- return SetStatus(DllExports::GdipSetMetafileDownLevelRasterizationLimit(
- (GpMetafile *)nativeImage,
- metafileRasterizationLimitDpi));
- }
-
- UINT GetDownLevelRasterizationLimit() const
- {
- UINT metafileRasterizationLimitDpi = 0;
-
- SetStatus(DllExports::GdipGetMetafileDownLevelRasterizationLimit(
- (GpMetafile *)nativeImage,
- &metafileRasterizationLimitDpi));
-
- return metafileRasterizationLimitDpi;
- }
-
- static UINT Metafile::EmfToWmfBits(
- IN HENHMETAFILE hemf,
- IN UINT cbData16,
- IN LPBYTE pData16,
- IN INT iMapMode = MM_ANISOTROPIC,
- IN EmfToWmfBitsFlags eFlags = EmfToWmfBitsFlagsDefault
- )
- {
- return DllExports::GdipEmfToWmfBits(
- hemf,
- cbData16,
- pData16,
- iMapMode,
- eFlags);
- }
-
-#ifdef DCR_USE_NEW_250932
-
-private:
- Metafile(const Metafile &);
- Metafile& operator=(const Metafile &);
-
-#endif
-};
-
-#endif // !_METAFILE_H
+/**************************************************************************\
+*
+* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
+*
+* Module Name:
+*
+* GdiplusMetafile.h
+*
+* Abstract:
+*
+* Metafile related declarations
+*
+\**************************************************************************/
+
+#ifndef _GDIPLUSMETAFILE_H
+#define _GDIPLUSMETAFILE_H
+
+class Metafile : public Image
+{
+public:
+ friend class Image;
+
+ // Read a metafile
+ Metafile()
+ {
+ SetNativeImage(NULL);
+ lastResult = Ok;
+ }
+
+ // Playback a metafile from a HMETAFILE
+ // If deleteWmf is TRUE, then when the metafile is deleted,
+ // the hWmf will also be deleted. Otherwise, it won't be.
+ Metafile(IN HMETAFILE hWmf,
+ IN const APMFileHeader * apmFileHeader,
+ IN BOOL deleteWmf = FALSE)
+ {
+ GpMetafile * metafile = NULL;
+
+ lastResult = DllExports::GdipCreateMetafileFromWmf(hWmf, deleteWmf, apmFileHeader, &metafile);
+
+ SetNativeImage(metafile);
+ }
+
+ // Playback a metafile from a HENHMETAFILE
+ // If deleteEmf is TRUE, then when the metafile is deleted,
+ // the hEmf will also be deleted. Otherwise, it won't be.
+ Metafile(IN HENHMETAFILE hEmf,
+ IN BOOL deleteEmf = FALSE)
+ {
+ GpMetafile * metafile = NULL;
+
+ lastResult = DllExports::GdipCreateMetafileFromEmf(hEmf, deleteEmf, &metafile);
+
+ SetNativeImage(metafile);
+ }
+
+ // Playback a metafile from a file
+ Metafile(IN const WCHAR* filename)
+ {
+ GpMetafile * metafile = NULL;
+
+ lastResult = DllExports::GdipCreateMetafileFromFile(filename, &metafile);
+
+ SetNativeImage(metafile);
+ }
+
+ // Playback a WMF metafile from a file
+ Metafile(IN const WCHAR* filename,
+ IN const APMFileHeader * apmFileHeader
+ )
+ {
+ GpMetafile * metafile = NULL;
+
+ lastResult = DllExports::GdipCreateMetafileFromWmfFile(filename, apmFileHeader, &metafile);
+
+ SetNativeImage(metafile);
+ }
+
+ // Playback a metafile from a stream
+ Metafile(IN IStream* stream)
+ {
+ GpMetafile * metafile = NULL;
+
+ lastResult = DllExports::GdipCreateMetafileFromStream(stream, &metafile);
+
+ SetNativeImage(metafile);
+ }
+
+ // Record a metafile to memory
+ Metafile(
+ IN HDC referenceHdc,
+ IN EmfType type = EmfTypeEmfPlusDual,
+ IN const WCHAR * description = NULL
+ )
+ {
+ GpMetafile * metafile = NULL;
+
+ lastResult = DllExports::GdipRecordMetafile(
+ referenceHdc, type, NULL, MetafileFrameUnitGdi,
+ description, &metafile);
+
+ SetNativeImage(metafile);
+ }
+
+ // Record a metafile to memory
+ Metafile(
+ IN HDC referenceHdc,
+ IN const RectF & frameRect,
+ IN MetafileFrameUnit frameUnit = MetafileFrameUnitGdi,
+ IN EmfType type = EmfTypeEmfPlusDual,
+ IN const WCHAR * description = NULL
+ )
+ {
+ GpMetafile * metafile = NULL;
+
+ lastResult = DllExports::GdipRecordMetafile(
+ referenceHdc, type, &frameRect, frameUnit,
+ description, &metafile);
+
+ SetNativeImage(metafile);
+ }
+
+ // Record a metafile to memory
+ Metafile(
+ IN HDC referenceHdc,
+ IN const Rect & frameRect,
+ IN MetafileFrameUnit frameUnit = MetafileFrameUnitGdi,
+ IN EmfType type = EmfTypeEmfPlusDual,
+ IN const WCHAR * description = NULL
+ )
+ {
+ GpMetafile * metafile = NULL;
+
+ lastResult = DllExports::GdipRecordMetafileI(
+ referenceHdc, type, &frameRect, frameUnit,
+ description, &metafile);
+
+ SetNativeImage(metafile);
+ }
+
+ // Record a metafile to a file
+ Metafile(
+ IN const WCHAR* fileName,
+ IN HDC referenceHdc,
+ IN EmfType type = EmfTypeEmfPlusDual,
+ IN const WCHAR * description = NULL
+ )
+ {
+ GpMetafile * metafile = NULL;
+
+ lastResult = DllExports::GdipRecordMetafileFileName(fileName,
+ referenceHdc, type, NULL, MetafileFrameUnitGdi,
+ description, &metafile);
+
+ SetNativeImage(metafile);
+ }
+
+ // Record a metafile to a file
+ Metafile(
+ IN const WCHAR* fileName,
+ IN HDC referenceHdc,
+ IN const RectF & frameRect,
+ IN MetafileFrameUnit frameUnit = MetafileFrameUnitGdi,
+ IN EmfType type = EmfTypeEmfPlusDual,
+ IN const WCHAR * description = NULL
+ )
+ {
+ GpMetafile * metafile = NULL;
+
+ lastResult = DllExports::GdipRecordMetafileFileName(fileName,
+ referenceHdc, type, &frameRect, frameUnit,
+ description, &metafile);
+
+ SetNativeImage(metafile);
+ }
+
+ // Record a metafile to a file
+ Metafile(
+ IN const WCHAR* fileName,
+ IN HDC referenceHdc,
+ IN const Rect & frameRect,
+ IN MetafileFrameUnit frameUnit = MetafileFrameUnitGdi,
+ IN EmfType type = EmfTypeEmfPlusDual,
+ IN const WCHAR * description = NULL
+ )
+ {
+ GpMetafile * metafile = NULL;
+
+ lastResult = DllExports::GdipRecordMetafileFileNameI(fileName,
+ referenceHdc, type, &frameRect, frameUnit,
+ description, &metafile);
+
+ SetNativeImage(metafile);
+ }
+
+ // Record a metafile to a stream
+ Metafile(
+ IN IStream * stream,
+ IN HDC referenceHdc,
+ IN EmfType type = EmfTypeEmfPlusDual,
+ IN const WCHAR * description = NULL
+ )
+ {
+ GpMetafile * metafile = NULL;
+
+ lastResult = DllExports::GdipRecordMetafileStream(stream,
+ referenceHdc, type, NULL, MetafileFrameUnitGdi,
+ description, &metafile);
+
+ SetNativeImage(metafile);
+ }
+
+ // Record a metafile to a stream
+ Metafile(
+ IN IStream * stream,
+ IN HDC referenceHdc,
+ IN const RectF & frameRect,
+ IN MetafileFrameUnit frameUnit = MetafileFrameUnitGdi,
+ IN EmfType type = EmfTypeEmfPlusDual,
+ IN const WCHAR * description = NULL
+ )
+ {
+ GpMetafile * metafile = NULL;
+
+ lastResult = DllExports::GdipRecordMetafileStream(stream,
+ referenceHdc, type, &frameRect, frameUnit,
+ description, &metafile);
+
+ SetNativeImage(metafile);
+ }
+
+ // Write a metafile to a stream with down-level GDI records
+ Metafile(
+ IN IStream * stream,
+ IN HDC referenceHdc,
+ IN const Rect & frameRect,
+ IN MetafileFrameUnit frameUnit = MetafileFrameUnitGdi,
+ IN EmfType type = EmfTypeEmfPlusDual,
+ IN const WCHAR * description = NULL
+ )
+ {
+ GpMetafile * metafile = NULL;
+
+ lastResult = DllExports::GdipRecordMetafileStreamI(stream,
+ referenceHdc, type, &frameRect, frameUnit,
+ description, &metafile);
+
+ SetNativeImage(metafile);
+ }
+
+ static Status GetMetafileHeader(
+ IN HMETAFILE hWmf,
+ IN const APMFileHeader * apmFileHeader,
+ OUT MetafileHeader * header
+ )
+ {
+ return DllExports::GdipGetMetafileHeaderFromWmf(hWmf, apmFileHeader, header);
+ }
+
+ static Status GetMetafileHeader(
+ IN HENHMETAFILE hEmf,
+ OUT MetafileHeader * header
+ )
+ {
+ return DllExports::GdipGetMetafileHeaderFromEmf(hEmf, header);
+ }
+
+ static Status GetMetafileHeader(
+ IN const WCHAR* filename,
+ OUT MetafileHeader * header
+ )
+ {
+ return DllExports::GdipGetMetafileHeaderFromFile(filename, header);
+ }
+
+ static Status GetMetafileHeader(
+ IN IStream * stream,
+ OUT MetafileHeader * header
+ )
+ {
+ return DllExports::GdipGetMetafileHeaderFromStream(stream, header);
+ }
+
+ Status GetMetafileHeader(
+ OUT MetafileHeader * header
+ ) const
+ {
+ return SetStatus(DllExports::GdipGetMetafileHeaderFromMetafile(
+ (GpMetafile *)nativeImage,
+ header));
+ }
+
+ // Once this method is called, the Metafile object is in an invalid state
+ // and can no longer be used. It is the responsiblity of the caller to
+ // invoke DeleteEnhMetaFile to delete this hEmf.
+
+ HENHMETAFILE GetHENHMETAFILE()
+ {
+ HENHMETAFILE hEmf;
+
+ SetStatus(DllExports::GdipGetHemfFromMetafile((GpMetafile *)nativeImage, &hEmf));
+
+ return hEmf;
+ }
+
+ // Used in conjuction with Graphics::EnumerateMetafile to play an EMF+
+ // The data must be DWORD aligned if it's an EMF or EMF+. It must be
+ // WORD aligned if it's a WMF.
+ Status
+ PlayRecord(
+ IN EmfPlusRecordType recordType,
+ IN UINT flags,
+ IN UINT dataSize,
+ IN const BYTE * data
+ ) const
+ {
+ return SetStatus(DllExports::GdipPlayMetafileRecord(
+ (GpMetafile *)nativeImage,
+ recordType,
+ flags,
+ dataSize,
+ data));
+ }
+
+ // If you're using a printer HDC for the metafile, but you want the
+ // metafile rasterized at screen resolution, then use this API to set
+ // the rasterization dpi of the metafile to the screen resolution,
+ // e.g. 96 dpi or 120 dpi.
+ Status SetDownLevelRasterizationLimit(
+ IN UINT metafileRasterizationLimitDpi
+ )
+ {
+ return SetStatus(DllExports::GdipSetMetafileDownLevelRasterizationLimit(
+ (GpMetafile *)nativeImage,
+ metafileRasterizationLimitDpi));
+ }
+
+ UINT GetDownLevelRasterizationLimit() const
+ {
+ UINT metafileRasterizationLimitDpi = 0;
+
+ SetStatus(DllExports::GdipGetMetafileDownLevelRasterizationLimit(
+ (GpMetafile *)nativeImage,
+ &metafileRasterizationLimitDpi));
+
+ return metafileRasterizationLimitDpi;
+ }
+
+ static UINT Metafile::EmfToWmfBits(
+ IN HENHMETAFILE hemf,
+ IN UINT cbData16,
+ IN LPBYTE pData16,
+ IN INT iMapMode = MM_ANISOTROPIC,
+ IN EmfToWmfBitsFlags eFlags = EmfToWmfBitsFlagsDefault
+ )
+ {
+ return DllExports::GdipEmfToWmfBits(
+ hemf,
+ cbData16,
+ pData16,
+ iMapMode,
+ eFlags);
+ }
+
+#ifdef DCR_USE_NEW_250932
+
+private:
+ Metafile(const Metafile &);
+ Metafile& operator=(const Metafile &);
+
+#endif
+};
+
+#endif // !_METAFILE_H
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusMetaHeader.h b/core/src/fxge/Microsoft SDK/include/GdiPlusMetaHeader.h
index 79b5bc9533..95ee190f04 100644
--- a/core/src/fxge/Microsoft SDK/include/GdiPlusMetaHeader.h
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusMetaHeader.h
@@ -1,213 +1,213 @@
-/**************************************************************************\
-*
-* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
-*
-* Module Name:
-*
-* Metafile headers
-*
-* Abstract:
-*
-* Declarations for various metafile header structures.
-*
-\**************************************************************************/
-
-#ifndef _GDIPLUSMETAHEADER_H
-#define _GDIPLUSMETAHEADER_H
-
-typedef struct
-{
- DWORD iType; // Record type EMR_HEADER
- DWORD nSize; // Record size in bytes. This may be greater
- // than the sizeof(ENHMETAHEADER).
- RECTL rclBounds; // Inclusive-inclusive bounds in device units
- RECTL rclFrame; // Inclusive-inclusive Picture Frame of metafile in .01 mm units
- DWORD dSignature; // Signature. Must be ENHMETA_SIGNATURE.
- DWORD nVersion; // Version number
- DWORD nBytes; // Size of the metafile in bytes
- DWORD nRecords; // Number of records in the metafile
- WORD nHandles; // Number of handles in the handle table
- // Handle index zero is reserved.
- WORD sReserved; // Reserved. Must be zero.
- DWORD nDescription; // Number of chars in the unicode description string
- // This is 0 if there is no description string
- DWORD offDescription; // Offset to the metafile description record.
- // This is 0 if there is no description string
- DWORD nPalEntries; // Number of entries in the metafile palette.
- SIZEL szlDevice; // Size of the reference device in pels
- SIZEL szlMillimeters; // Size of the reference device in millimeters
-} ENHMETAHEADER3;
-
-// Aldus Placeable Metafiles
-
-// Placeable Metafiles were created by Aldus Corporation as a non-standard
-// way of specifying how a metafile is mapped and scaled on an output device.
-// Placeable metafiles are quite wide-spread, but not directly supported by
-// the Windows API. To playback a placeable metafile using the Windows API,
-// you will first need to strip the placeable metafile header from the file.
-// This is typically performed by copying the metafile to a temporary file
-// starting at file offset 22 (0x16). The contents of the temporary file may
-// then be used as input to the Windows GetMetaFile(), PlayMetaFile(),
-// CopyMetaFile(), etc. GDI functions.
-
-// Each placeable metafile begins with a 22-byte header,
-// followed by a standard metafile:
-
-#include <pshpack2.h> // set structure packing to 2
-
-typedef struct
-{
- INT16 Left;
- INT16 Top;
- INT16 Right;
- INT16 Bottom;
-} APMRect16;
-
-typedef struct
-{
- UINT32 Key; // GDIP_WMF_ALDUSKEY
- INT16 Hmf; // Metafile HANDLE number (always 0)
- APMRect16 BoundingBox; // Coordinates in metafile units
- INT16 Inch; // Number of metafile units per inch
- UINT32 Reserved; // Reserved (always 0)
- INT16 Checksum; // Checksum value for previous 10 WORDs
-} APMFileHeader;
-
-#include <poppack.h>
-
-// Key contains a special identification value that indicates the presence
-// of a placeable metafile header and is always 0x9AC6CDD7.
-
-// Handle is used to stored the handle of the metafile in memory. When written
-// to disk, this field is not used and will always contains the value 0.
-
-// Left, Top, Right, and Bottom contain the coordinates of the upper-left
-// and lower-right corners of the image on the output device. These are
-// measured in twips.
-
-// A twip (meaning "twentieth of a point") is the logical unit of measurement
-// used in Windows Metafiles. A twip is equal to 1/1440 of an inch. Thus 720
-// twips equal 1/2 inch, while 32,768 twips is 22.75 inches.
-
-// Inch contains the number of twips per inch used to represent the image.
-// Normally, there are 1440 twips per inch; however, this number may be
-// changed to scale the image. A value of 720 indicates that the image is
-// double its normal size, or scaled to a factor of 2:1. A value of 360
-// indicates a scale of 4:1, while a value of 2880 indicates that the image
-// is scaled down in size by a factor of two. A value of 1440 indicates
-// a 1:1 scale ratio.
-
-// Reserved is not used and is always set to 0.
-
-// Checksum contains a checksum value for the previous 10 WORDs in the header.
-// This value can be used in an attempt to detect if the metafile has become
-// corrupted. The checksum is calculated by XORing each WORD value to an
-// initial value of 0.
-
-// If the metafile was recorded with a reference Hdc that was a display.
-#define GDIP_EMFPLUSFLAGS_DISPLAY 0x00000001
-
-class MetafileHeader
-{
-public:
- MetafileType Type;
- UINT Size; // Size of the metafile (in bytes)
- UINT Version; // EMF+, EMF, or WMF version
- UINT EmfPlusFlags;
- REAL DpiX;
- REAL DpiY;
- INT X; // Bounds in device units
- INT Y;
- INT Width;
- INT Height;
- union
- {
- METAHEADER WmfHeader;
- ENHMETAHEADER3 EmfHeader;
- };
- INT EmfPlusHeaderSize; // size of the EMF+ header in file
- INT LogicalDpiX; // Logical Dpi of reference Hdc
- INT LogicalDpiY; // usually valid only for EMF+ files
-
-public:
- // Get the metafile type
- MetafileType GetType() const { return Type; }
-
- // Get the size of the metafile in BYTEs
- UINT GetMetafileSize() const { return Size; }
-
- // If IsEmfPlus, this is the EMF+ version; else it is the WMF or EMF version
- UINT GetVersion() const { return Version; }
-
- // Get the EMF+ flags associated with the metafile
- UINT GetEmfPlusFlags() const { return EmfPlusFlags; }
-
- // Get the X Dpi of the metafile
- REAL GetDpiX() const { return DpiX; }
-
- // Get the Y Dpi of the metafile
- REAL GetDpiY() const { return DpiY; }
-
- // Get the bounds of the metafile in device units
- VOID GetBounds (OUT Rect *rect) const
- {
- rect->X = X;
- rect->Y = Y;
- rect->Width = Width;
- rect->Height = Height;
- }
-
- // Is it any type of WMF (standard or Aldus Placeable Metafile)?
- BOOL IsWmf() const
- {
- return ((Type == MetafileTypeWmf) || (Type == MetafileTypeWmfAldus));
- }
-
- // Is this an Aldus Placeable Metafile?
- BOOL IsWmfAldus() const { return (Type == MetafileTypeWmf); }
-
- // Is this an EMF (not an EMF+)?
- BOOL IsEmf() const { return (Type == MetafileTypeEmf); }
-
- // Is this an EMF or EMF+ file?
- BOOL IsEmfOrEmfPlus() const { return (Type >= MetafileTypeEmf); }
-
- // Is this an EMF+ file?
- BOOL IsEmfPlus() const { return (Type >= MetafileTypeEmfPlusOnly); }
-
- // Is this an EMF+ dual (has dual, down-level records) file?
- BOOL IsEmfPlusDual() const { return (Type == MetafileTypeEmfPlusDual); }
-
- // Is this an EMF+ only (no dual records) file?
- BOOL IsEmfPlusOnly() const { return (Type == MetafileTypeEmfPlusOnly); }
-
- // If it's an EMF+ file, was it recorded against a display Hdc?
- BOOL IsDisplay() const
- {
- return (IsEmfPlus() &&
- ((EmfPlusFlags & GDIP_EMFPLUSFLAGS_DISPLAY) != 0));
- }
-
- // Get the WMF header of the metafile (if it is a WMF)
- const METAHEADER * GetWmfHeader() const
- {
- if (IsWmf())
- {
- return &WmfHeader;
- }
- return NULL;
- }
-
- // Get the EMF header of the metafile (if it is an EMF)
- const ENHMETAHEADER3 * GetEmfHeader() const
- {
- if (IsEmfOrEmfPlus())
- {
- return &EmfHeader;
- }
- return NULL;
- }
-};
-
-#endif
-
+/**************************************************************************\
+*
+* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
+*
+* Module Name:
+*
+* Metafile headers
+*
+* Abstract:
+*
+* Declarations for various metafile header structures.
+*
+\**************************************************************************/
+
+#ifndef _GDIPLUSMETAHEADER_H
+#define _GDIPLUSMETAHEADER_H
+
+typedef struct
+{
+ DWORD iType; // Record type EMR_HEADER
+ DWORD nSize; // Record size in bytes. This may be greater
+ // than the sizeof(ENHMETAHEADER).
+ RECTL rclBounds; // Inclusive-inclusive bounds in device units
+ RECTL rclFrame; // Inclusive-inclusive Picture Frame of metafile in .01 mm units
+ DWORD dSignature; // Signature. Must be ENHMETA_SIGNATURE.
+ DWORD nVersion; // Version number
+ DWORD nBytes; // Size of the metafile in bytes
+ DWORD nRecords; // Number of records in the metafile
+ WORD nHandles; // Number of handles in the handle table
+ // Handle index zero is reserved.
+ WORD sReserved; // Reserved. Must be zero.
+ DWORD nDescription; // Number of chars in the unicode description string
+ // This is 0 if there is no description string
+ DWORD offDescription; // Offset to the metafile description record.
+ // This is 0 if there is no description string
+ DWORD nPalEntries; // Number of entries in the metafile palette.
+ SIZEL szlDevice; // Size of the reference device in pels
+ SIZEL szlMillimeters; // Size of the reference device in millimeters
+} ENHMETAHEADER3;
+
+// Aldus Placeable Metafiles
+
+// Placeable Metafiles were created by Aldus Corporation as a non-standard
+// way of specifying how a metafile is mapped and scaled on an output device.
+// Placeable metafiles are quite wide-spread, but not directly supported by
+// the Windows API. To playback a placeable metafile using the Windows API,
+// you will first need to strip the placeable metafile header from the file.
+// This is typically performed by copying the metafile to a temporary file
+// starting at file offset 22 (0x16). The contents of the temporary file may
+// then be used as input to the Windows GetMetaFile(), PlayMetaFile(),
+// CopyMetaFile(), etc. GDI functions.
+
+// Each placeable metafile begins with a 22-byte header,
+// followed by a standard metafile:
+
+#include <pshpack2.h> // set structure packing to 2
+
+typedef struct
+{
+ INT16 Left;
+ INT16 Top;
+ INT16 Right;
+ INT16 Bottom;
+} APMRect16;
+
+typedef struct
+{
+ UINT32 Key; // GDIP_WMF_ALDUSKEY
+ INT16 Hmf; // Metafile HANDLE number (always 0)
+ APMRect16 BoundingBox; // Coordinates in metafile units
+ INT16 Inch; // Number of metafile units per inch
+ UINT32 Reserved; // Reserved (always 0)
+ INT16 Checksum; // Checksum value for previous 10 WORDs
+} APMFileHeader;
+
+#include <poppack.h>
+
+// Key contains a special identification value that indicates the presence
+// of a placeable metafile header and is always 0x9AC6CDD7.
+
+// Handle is used to stored the handle of the metafile in memory. When written
+// to disk, this field is not used and will always contains the value 0.
+
+// Left, Top, Right, and Bottom contain the coordinates of the upper-left
+// and lower-right corners of the image on the output device. These are
+// measured in twips.
+
+// A twip (meaning "twentieth of a point") is the logical unit of measurement
+// used in Windows Metafiles. A twip is equal to 1/1440 of an inch. Thus 720
+// twips equal 1/2 inch, while 32,768 twips is 22.75 inches.
+
+// Inch contains the number of twips per inch used to represent the image.
+// Normally, there are 1440 twips per inch; however, this number may be
+// changed to scale the image. A value of 720 indicates that the image is
+// double its normal size, or scaled to a factor of 2:1. A value of 360
+// indicates a scale of 4:1, while a value of 2880 indicates that the image
+// is scaled down in size by a factor of two. A value of 1440 indicates
+// a 1:1 scale ratio.
+
+// Reserved is not used and is always set to 0.
+
+// Checksum contains a checksum value for the previous 10 WORDs in the header.
+// This value can be used in an attempt to detect if the metafile has become
+// corrupted. The checksum is calculated by XORing each WORD value to an
+// initial value of 0.
+
+// If the metafile was recorded with a reference Hdc that was a display.
+#define GDIP_EMFPLUSFLAGS_DISPLAY 0x00000001
+
+class MetafileHeader
+{
+public:
+ MetafileType Type;
+ UINT Size; // Size of the metafile (in bytes)
+ UINT Version; // EMF+, EMF, or WMF version
+ UINT EmfPlusFlags;
+ REAL DpiX;
+ REAL DpiY;
+ INT X; // Bounds in device units
+ INT Y;
+ INT Width;
+ INT Height;
+ union
+ {
+ METAHEADER WmfHeader;
+ ENHMETAHEADER3 EmfHeader;
+ };
+ INT EmfPlusHeaderSize; // size of the EMF+ header in file
+ INT LogicalDpiX; // Logical Dpi of reference Hdc
+ INT LogicalDpiY; // usually valid only for EMF+ files
+
+public:
+ // Get the metafile type
+ MetafileType GetType() const { return Type; }
+
+ // Get the size of the metafile in BYTEs
+ UINT GetMetafileSize() const { return Size; }
+
+ // If IsEmfPlus, this is the EMF+ version; else it is the WMF or EMF version
+ UINT GetVersion() const { return Version; }
+
+ // Get the EMF+ flags associated with the metafile
+ UINT GetEmfPlusFlags() const { return EmfPlusFlags; }
+
+ // Get the X Dpi of the metafile
+ REAL GetDpiX() const { return DpiX; }
+
+ // Get the Y Dpi of the metafile
+ REAL GetDpiY() const { return DpiY; }
+
+ // Get the bounds of the metafile in device units
+ VOID GetBounds (OUT Rect *rect) const
+ {
+ rect->X = X;
+ rect->Y = Y;
+ rect->Width = Width;
+ rect->Height = Height;
+ }
+
+ // Is it any type of WMF (standard or Aldus Placeable Metafile)?
+ BOOL IsWmf() const
+ {
+ return ((Type == MetafileTypeWmf) || (Type == MetafileTypeWmfAldus));
+ }
+
+ // Is this an Aldus Placeable Metafile?
+ BOOL IsWmfAldus() const { return (Type == MetafileTypeWmf); }
+
+ // Is this an EMF (not an EMF+)?
+ BOOL IsEmf() const { return (Type == MetafileTypeEmf); }
+
+ // Is this an EMF or EMF+ file?
+ BOOL IsEmfOrEmfPlus() const { return (Type >= MetafileTypeEmf); }
+
+ // Is this an EMF+ file?
+ BOOL IsEmfPlus() const { return (Type >= MetafileTypeEmfPlusOnly); }
+
+ // Is this an EMF+ dual (has dual, down-level records) file?
+ BOOL IsEmfPlusDual() const { return (Type == MetafileTypeEmfPlusDual); }
+
+ // Is this an EMF+ only (no dual records) file?
+ BOOL IsEmfPlusOnly() const { return (Type == MetafileTypeEmfPlusOnly); }
+
+ // If it's an EMF+ file, was it recorded against a display Hdc?
+ BOOL IsDisplay() const
+ {
+ return (IsEmfPlus() &&
+ ((EmfPlusFlags & GDIP_EMFPLUSFLAGS_DISPLAY) != 0));
+ }
+
+ // Get the WMF header of the metafile (if it is a WMF)
+ const METAHEADER * GetWmfHeader() const
+ {
+ if (IsWmf())
+ {
+ return &WmfHeader;
+ }
+ return NULL;
+ }
+
+ // Get the EMF header of the metafile (if it is an EMF)
+ const ENHMETAHEADER3 * GetEmfHeader() const
+ {
+ if (IsEmfOrEmfPlus())
+ {
+ return &EmfHeader;
+ }
+ return NULL;
+ }
+};
+
+#endif
+
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusPath.h b/core/src/fxge/Microsoft SDK/include/GdiPlusPath.h
index cff0e1d9ce..99f8afdda8 100644
--- a/core/src/fxge/Microsoft SDK/include/GdiPlusPath.h
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusPath.h
@@ -1,1686 +1,1686 @@
-/**************************************************************************\
-*
-* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
-*
-* Module Name:
-*
-* GdiplusPath.h
-*
-* Abstract:
-*
-* Path related declarations
-*
-\**************************************************************************/
-
-#ifndef _GDIPLUSPATH_H
-#define _GDIPLUSPATH_H
-
-class GraphicsPath : public GdiplusBase
-{
-public:
- friend class Graphics;
- friend class Region;
- friend class PathGradientBrush;
- friend class GraphicsPathIterator;
- friend class CustomLineCap;
-
- // Path constructors
-
- GraphicsPath(IN FillMode fillMode = FillModeAlternate)
- {
- nativePath = NULL;
- lastResult = DllExports::GdipCreatePath(fillMode, &nativePath);
- }
-
- GraphicsPath(IN const PointF* points,
- IN const BYTE* types,
- IN INT count,
- IN FillMode fillMode = FillModeAlternate)
- {
- nativePath = NULL;
- lastResult = DllExports::GdipCreatePath2(points,
- types,
- count,
- fillMode,
- &nativePath);
- }
-
- GraphicsPath(IN const Point* points,
- IN const BYTE* types,
- IN INT count,
- IN FillMode fillMode = FillModeAlternate)
- {
- nativePath = NULL;
- lastResult = DllExports::GdipCreatePath2I(points,
- types,
- count,
- fillMode,
- &nativePath);
- }
-
- ~GraphicsPath()
- {
- DllExports::GdipDeletePath(nativePath);
- }
-
- /**
- * Make a copy of the current path object
- */
- GraphicsPath* Clone() const
- {
- GpPath *clonepath = NULL;
-
- SetStatus(DllExports::GdipClonePath(nativePath, &clonepath));
-
- return new GraphicsPath(clonepath);
- }
-
- /**
- * Reset the path object to empty (and fill mode to FillModeAlternate)
- */
- Status Reset()
- {
- return SetStatus(DllExports::GdipResetPath(nativePath));
- }
-
- /**
- * Get path fill mode information
- */
- FillMode GetFillMode() const
- {
- FillMode fillmode = FillModeAlternate;
-
- SetStatus(DllExports::GdipGetPathFillMode(nativePath, &fillmode));
-
- return fillmode;
- }
-
- /**
- * Set path fill mode information
- */
- Status SetFillMode(IN FillMode fillmode)
- {
- return SetStatus(DllExports::GdipSetPathFillMode(nativePath, fillmode));
- }
-
- /**
- * Set/get path data
- */
- Status GetPathData(OUT PathData* pathData) const
- {
- if (pathData == NULL)
- {
- return SetStatus(InvalidParameter);
- }
-
- INT count = GetPointCount();
-
- if ((count <= 0) || (pathData->Count>0 && pathData->Count<count))
- {
- pathData->Count = 0;
- if (pathData->Points)
- {
- delete pathData->Points;
- pathData->Points = NULL;
- }
-
- if (pathData->Types)
- {
- delete pathData->Types;
- pathData->Types = NULL;
- }
-
- if (count <= 0)
- {
- return lastResult;
- }
- }
-
- if (pathData->Count == 0)
- {
- pathData->Points = new PointF[count];
- if (pathData->Points == NULL)
- {
- return SetStatus(OutOfMemory);
-
- }
- pathData->Types = new byte[count];
- if (pathData->Types == NULL)
- {
- delete pathData->Points;
- pathData->Points = NULL;
-
- return SetStatus(OutOfMemory);
- }
- pathData->Count = count;
- }
-
- return SetStatus(DllExports::GdipGetPathData(nativePath, pathData));
- }
-
- /**
- * Start/end a subpath
- */
- Status StartFigure()
- {
- return SetStatus(DllExports::GdipStartPathFigure(nativePath));
- }
-
- Status CloseFigure()
- {
- return SetStatus(DllExports::GdipClosePathFigure(nativePath));
- }
-
- Status CloseAllFigures()
- {
- return SetStatus(DllExports::GdipClosePathFigures(nativePath));
- }
-
- Status SetMarker()
- {
- return SetStatus(DllExports::GdipSetPathMarker(nativePath));
- }
-
- Status ClearMarkers()
- {
- return SetStatus(DllExports::GdipClearPathMarkers(nativePath));
- }
-
- Status Reverse()
- {
- return SetStatus(DllExports::GdipReversePath(nativePath));
- }
-
- Status GetLastPoint(OUT PointF* lastPoint) const
- {
- return SetStatus(DllExports::GdipGetPathLastPoint(nativePath, lastPoint));
- }
-
- /**
- * Add lines to the path object
- */
- // float version
- Status AddLine(IN const PointF& pt1,
- IN const PointF& pt2)
- {
- return AddLine(pt1.X, pt1.Y, pt2.X, pt2.Y);
- }
-
- Status AddLine(IN REAL x1,
- IN REAL y1,
- IN REAL x2,
- IN REAL y2)
- {
- return SetStatus(DllExports::GdipAddPathLine(nativePath, x1, y1, x2, y2));
- }
-
- Status AddLines(IN const PointF* points,
- IN INT count)
- {
- return SetStatus(DllExports::GdipAddPathLine2(nativePath, points, count));
- }
-
- // integer version
- Status AddLine(IN const Point& pt1,
- IN const Point& pt2)
- {
- return AddLine(pt1.X,
- pt1.Y,
- pt2.X,
- pt2.Y);
- }
-
- Status AddLine(IN INT x1,
- IN INT y1,
- IN INT x2,
- IN INT y2)
- {
- return SetStatus(DllExports::GdipAddPathLineI(nativePath,
- x1,
- y1,
- x2,
- y2));
- }
-
- Status AddLines(IN const Point* points,
- IN INT count)
- {
- return SetStatus(DllExports::GdipAddPathLine2I(nativePath,
- points,
- count));
- }
-
- /**
- * Add an arc to the path object
- */
- // float version
- Status AddArc(IN const RectF& rect,
- IN REAL startAngle,
- IN REAL sweepAngle)
- {
- return AddArc(rect.X, rect.Y, rect.Width, rect.Height,
- startAngle, sweepAngle);
- }
-
- Status AddArc(IN REAL x,
- IN REAL y,
- IN REAL width,
- IN REAL height,
- IN REAL startAngle,
- IN REAL sweepAngle)
- {
- return SetStatus(DllExports::GdipAddPathArc(nativePath, x, y, width, height,
- startAngle, sweepAngle));
- }
-
- // integer version
- Status AddArc(IN const Rect& rect,
- IN REAL startAngle,
- IN REAL sweepAngle)
- {
- return AddArc(rect.X, rect.Y, rect.Width, rect.Height,
- startAngle, sweepAngle);
- }
-
- Status AddArc(IN INT x,
- IN INT y,
- IN INT width,
- IN INT height,
- IN REAL startAngle,
- IN REAL sweepAngle)
- {
- return SetStatus(DllExports::GdipAddPathArcI(nativePath,
- x,
- y,
- width,
- height,
- startAngle,
- sweepAngle));
- }
-
- /**
- * Add Bezier curves to the path object
- */
- // float version
- Status AddBezier(IN const PointF& pt1,
- IN const PointF& pt2,
- IN const PointF& pt3,
- IN const PointF& pt4)
- {
- return AddBezier(pt1.X, pt1.Y, pt2.X, pt2.Y, pt3.X, pt3.Y, pt4.X,
- pt4.Y);
- }
-
- Status AddBezier(IN REAL x1,
- IN REAL y1,
- IN REAL x2,
- IN REAL y2,
- IN REAL x3,
- IN REAL y3,
- IN REAL x4,
- IN REAL y4)
- {
- return SetStatus(DllExports::GdipAddPathBezier(nativePath, x1, y1, x2, y2,
- x3, y3, x4, y4));
- }
-
- Status AddBeziers(IN const PointF* points,
- IN INT count)
- {
- return SetStatus(DllExports::GdipAddPathBeziers(nativePath, points, count));
- }
-
- // integer version
- Status AddBezier(IN const Point& pt1,
- IN const Point& pt2,
- IN const Point& pt3,
- IN const Point& pt4)
- {
- return AddBezier(pt1.X, pt1.Y, pt2.X, pt2.Y, pt3.X, pt3.Y, pt4.X,
- pt4.Y);
- }
-
- Status AddBezier(IN INT x1,
- IN INT y1,
- IN INT x2,
- IN INT y2,
- IN INT x3,
- IN INT y3,
- IN INT x4,
- IN INT y4)
- {
- return SetStatus(DllExports::GdipAddPathBezierI(nativePath,
- x1,
- y1,
- x2,
- y2,
- x3,
- y3,
- x4,
- y4));
- }
-
- Status AddBeziers(IN const Point* points,
- IN INT count)
- {
- return SetStatus(DllExports::GdipAddPathBeziersI(nativePath,
- points,
- count));
- }
-
- // float version
- Status AddCurve(IN const PointF* points,
- IN INT count)
- {
- return SetStatus(DllExports::GdipAddPathCurve(nativePath,
- points,
- count));
- }
-
- Status AddCurve(IN const PointF* points,
- IN INT count,
- IN REAL tension)
- {
- return SetStatus(DllExports::GdipAddPathCurve2(nativePath,
- points,
- count,
- tension));
- }
-
- Status AddCurve(IN const PointF* points,
- IN INT count,
- IN INT offset,
- IN INT numberOfSegments,
- IN REAL tension)
- {
- return SetStatus(DllExports::GdipAddPathCurve3(nativePath,
- points,
- count,
- offset,
- numberOfSegments,
- tension));
- }
-
- // integer version
- Status AddCurve(IN const Point* points,
- IN INT count)
- {
- return SetStatus(DllExports::GdipAddPathCurveI(nativePath,
- points,
- count));
- }
-
- Status AddCurve(IN const Point* points,
- IN INT count,
- IN REAL tension)
- {
- return SetStatus(DllExports::GdipAddPathCurve2I(nativePath,
- points,
- count,
- tension));
- }
-
- Status AddCurve(IN const Point* points,
- IN INT count,
- IN INT offset,
- IN INT numberOfSegments,
- IN REAL tension)
- {
- return SetStatus(DllExports::GdipAddPathCurve3I(nativePath,
- points,
- count,
- offset,
- numberOfSegments,
- tension));
- }
-
- // float version
- Status AddClosedCurve(IN const PointF* points,
- IN INT count)
- {
- return SetStatus(DllExports::GdipAddPathClosedCurve(nativePath,
- points,
- count));
- }
-
- Status AddClosedCurve(IN const PointF* points,
- IN INT count,
- IN REAL tension)
- {
- return SetStatus(DllExports::GdipAddPathClosedCurve2(nativePath,
- points,
- count,
- tension));
- }
-
- // integer version
- Status AddClosedCurve(IN const Point* points,
- IN INT count)
- {
- return SetStatus(DllExports::GdipAddPathClosedCurveI(nativePath,
- points,
- count));
- }
-
-
- Status AddClosedCurve(IN const Point* points,
- IN INT count,
- IN REAL tension)
- {
- return SetStatus(DllExports::GdipAddPathClosedCurve2I(nativePath,
- points,
- count,
- tension));
- }
-
-
- /**
- * Add closed shapes to the path object
- */
-
- // float version
- Status AddRectangle(IN const RectF& rect)
- {
- return SetStatus(DllExports::GdipAddPathRectangle(nativePath,
- rect.X,
- rect.Y,
- rect.Width,
- rect.Height));
- }
-
- Status AddRectangles(IN const RectF* rects,
- IN INT count)
- {
- return SetStatus(DllExports::GdipAddPathRectangles(nativePath,
- rects,
- count));
- }
-
- // integer version
- Status AddRectangle(IN const Rect& rect)
- {
- return SetStatus(DllExports::GdipAddPathRectangleI(nativePath,
- rect.X,
- rect.Y,
- rect.Width,
- rect.Height));
- }
-
- Status AddRectangles(IN const Rect* rects, INT count)
- {
- return SetStatus(DllExports::GdipAddPathRectanglesI(nativePath,
- rects,
- count));
- }
-
- // float version
- Status AddEllipse(IN const RectF& rect)
- {
- return AddEllipse(rect.X, rect.Y, rect.Width, rect.Height);
- }
-
- Status AddEllipse(IN REAL x,
- IN REAL y,
- IN REAL width,
- IN REAL height)
- {
- return SetStatus(DllExports::GdipAddPathEllipse(nativePath,
- x,
- y,
- width,
- height));
- }
-
- // integer version
- Status AddEllipse(IN const Rect& rect)
- {
- return AddEllipse(rect.X, rect.Y, rect.Width, rect.Height);
- }
-
- Status AddEllipse(IN INT x,
- IN INT y,
- IN INT width,
- IN INT height)
- {
- return SetStatus(DllExports::GdipAddPathEllipseI(nativePath,
- x,
- y,
- width,
- height));
- }
-
- // float version
- Status AddPie(IN const RectF& rect,
- IN REAL startAngle,
- IN REAL sweepAngle)
- {
- return AddPie(rect.X, rect.Y, rect.Width, rect.Height, startAngle,
- sweepAngle);
- }
-
- Status AddPie(IN REAL x,
- IN REAL y,
- IN REAL width,
- IN REAL height,
- IN REAL startAngle,
- IN REAL sweepAngle)
- {
- return SetStatus(DllExports::GdipAddPathPie(nativePath, x, y, width, height,
- startAngle, sweepAngle));
- }
-
- // integer version
- Status AddPie(IN const Rect& rect,
- IN REAL startAngle,
- IN REAL sweepAngle)
- {
- return AddPie(rect.X,
- rect.Y,
- rect.Width,
- rect.Height,
- startAngle,
- sweepAngle);
- }
-
- Status AddPie(IN INT x,
- IN INT y,
- IN INT width,
- IN INT height,
- IN REAL startAngle,
- IN REAL sweepAngle)
- {
- return SetStatus(DllExports::GdipAddPathPieI(nativePath,
- x,
- y,
- width,
- height,
- startAngle,
- sweepAngle));
- }
-
- // float version
- Status AddPolygon(IN const PointF* points,
- IN INT count)
- {
- return SetStatus(DllExports::GdipAddPathPolygon(nativePath, points, count));
- }
-
- // integer version
- Status AddPolygon(IN const Point* points,
- IN INT count)
- {
- return SetStatus(DllExports::GdipAddPathPolygonI(nativePath, points, count));
- }
-
- Status AddPath(IN const GraphicsPath* addingPath,
- IN BOOL connect)
- {
- GpPath* nativePath2 = NULL;
- if(addingPath)
- nativePath2 = addingPath->nativePath;
-
- return SetStatus(DllExports::GdipAddPathPath(nativePath, nativePath2, connect));
- }
-
- // AddString point version
-
- Status AddString(
- IN const WCHAR *string,
- IN INT length,
- IN const FontFamily *family,
- IN INT style,
- IN REAL emSize, // In world units
- IN const PointF &origin,
- IN const StringFormat *format
- )
- {
- RectF rect(origin.X, origin.Y, 0.0f, 0.0f);
-
- return SetStatus(DllExports::GdipAddPathString(
- nativePath,
- string,
- length,
- family ? family->nativeFamily : NULL,
- style,
- emSize,
- &rect,
- format ? format->nativeFormat : NULL
- ));
- }
-
- // AddString rectangle version
-
- Status AddString(
- IN const WCHAR *string,
- IN INT length,
- IN const FontFamily *family,
- IN INT style,
- IN REAL emSize, // In world units
- IN const RectF &layoutRect,
- IN const StringFormat *format
- )
- {
- return SetStatus(DllExports::GdipAddPathString(
- nativePath,
- string,
- length,
- family ? family->nativeFamily : NULL,
- style,
- emSize,
- &layoutRect,
- format ? format->nativeFormat : NULL
- ));
- }
-
- Status AddString(
- IN const WCHAR *string,
- IN INT length,
- IN const FontFamily *family,
- IN INT style,
- IN REAL emSize, // In world units
- IN const Point &origin,
- IN const StringFormat *format
- )
- {
- Rect rect(origin.X, origin.Y, 0, 0);
-
- return SetStatus(DllExports::GdipAddPathStringI(
- nativePath,
- string,
- length,
- family ? family->nativeFamily : NULL,
- style,
- emSize,
- &rect,
- format ? format->nativeFormat : NULL
- ));
- }
-
- // AddString rectangle version
-
- Status AddString(
- IN const WCHAR *string,
- IN INT length,
- IN const FontFamily *family,
- IN INT style,
- IN REAL emSize, // In world units
- IN const Rect &layoutRect,
- IN const StringFormat *format
- )
- {
- return SetStatus(DllExports::GdipAddPathStringI(
- nativePath,
- string,
- length,
- family ? family->nativeFamily : NULL,
- style,
- emSize,
- &layoutRect,
- format ? format->nativeFormat : NULL
- ));
- }
-
- /**
- * Transforms the path object
- */
- Status Transform(IN const Matrix* matrix)
- {
- if(matrix)
- return SetStatus(DllExports::GdipTransformPath(nativePath, matrix->nativeMatrix));
- else
- return Ok; // No need to transform.
- }
-
- /**
- * Get the bounds of the path object with the given transform.
- * This is not always the tightest bounds.
- *
- * Defined in GdiplusGraphics.h.
- */
- Status GetBounds(OUT RectF* bounds,
- IN const Matrix* matrix = NULL,
- IN const Pen* pen = NULL) const;
-
- // integer version (defined in GdiplusGraphics.h)
- Status GetBounds(OUT Rect* bounds,
- IN const Matrix* matrix = NULL,
- IN const Pen* pen = NULL) const;
-
- /**
- * Flatten the path object
- * Once this is called, the resultant path is made of line segments and
- * the original path information is lost.
- * When matrix = NULL, the identity matrix is assumed.
- */
- Status Flatten(IN const Matrix* matrix = NULL,
- IN REAL flatness = FlatnessDefault)
- {
- GpMatrix* nativeMatrix = NULL;
- if(matrix)
- {
- nativeMatrix = matrix->nativeMatrix;
- }
-
- return SetStatus(DllExports::GdipFlattenPath(
- nativePath,
- nativeMatrix,
- flatness
- ));
- }
-
-#ifdef DCR_USE_NEW_202903
-
- Status Widen(
- IN const Pen* pen,
- IN const Matrix* matrix = NULL,
- IN REAL flatness = FlatnessDefault
- )
- {
- GpMatrix* nativeMatrix = NULL;
- if(matrix)
- nativeMatrix = matrix->nativeMatrix;
-
- return SetStatus(DllExports::GdipWidenPath(
- nativePath,
- pen->nativePen,
- nativeMatrix,
- flatness
- ));
- }
-
-#else
-
- /**
- * Widen the path object
- * When removeSelfIntersects is TRUE, this returns the widened path
- * without self intersections.
- * When it is FALSE, it returns the widened path with selfintersections.
- * The latter is faster and is usually safficient for filling.
- */
- Status Widen(IN const Pen* pen,
- IN const Matrix* matrix = NULL,
- IN BOOL removeSelfIntersects = TRUE)
- {
- GpMatrix* nativeMatrix = NULL;
- if(matrix)
- nativeMatrix = matrix->nativeMatrix;
-
- return SetStatus(DllExports::GdipWidenPathWithMinimumResolutions(nativePath, pen->nativePen,
- 0, 0, nativeMatrix, removeSelfIntersects));
- }
-
- /**
- * Widen the path object
- * This is equivalent to Widen() method except that
- * The widths of the widened path are larger than the given
- * minimum resolutions in x and y coordinates after the transform.
- * This is usefull when widening a path with the limited device resolutions.
- */
-
- Status Widen(IN const Pen* pen,
- IN REAL minXres,
- IN REAL minYres,
- IN const Matrix* matrix = NULL,
- IN BOOL removeSelfIntersects = TRUE)
- {
- GpMatrix* nativeMatrix = NULL;
- if(matrix)
- nativeMatrix = matrix->nativeMatrix;
-
- return SetStatus(DllExports::GdipWidenPathWithMinimumResolutions(nativePath, pen->nativePen,
- minXres, minYres, nativeMatrix, removeSelfIntersects));
- }
-
-#endif // DCR_USE_NEW_202903
-
- Status Outline(
- IN const Matrix *matrix = NULL,
- IN REAL flatness = FlatnessDefault
- )
- {
- GpMatrix* nativeMatrix = NULL;
- if(matrix)
- {
- nativeMatrix = matrix->nativeMatrix;
- }
-
- return SetStatus(DllExports::GdipWindingModeOutline(
- nativePath, nativeMatrix, flatness
- ));
- }
-
- /**
- * Warp the path object
- * Once this is called, the resultant path is made of line segments and
- * the original path information is lost.
- * When matrix = NULL, the identity matrix is assumed.
- */
- Status Warp(IN const PointF* destPoints,
- IN INT count,
- IN const RectF& srcRect,
- IN const Matrix* matrix = NULL,
- IN WarpMode warpMode = WarpModePerspective,
- IN REAL flatness = FlatnessDefault)
- {
- GpMatrix* nativeMatrix = NULL;
- if(matrix)
- nativeMatrix = matrix->nativeMatrix;
-
- return SetStatus(DllExports::GdipWarpPath(
- nativePath,
- nativeMatrix,
- destPoints,
- count,
- srcRect.X,
- srcRect.Y,
- srcRect.Width,
- srcRect.Height,
- warpMode,
- flatness));
- }
-
- /**
- * Return the number of points in the current path
- */
- INT GetPointCount() const
- {
- INT count = 0;
-
- SetStatus(DllExports::GdipGetPointCount(nativePath, &count));
-
- return count;
- }
-
- /**
- * Return the path point type information
- */
- Status GetPathTypes(OUT BYTE* types,
- IN INT count) const
- {
- return SetStatus(DllExports::GdipGetPathTypes(nativePath, types, count));
- }
-
- /**
- * Return the path point coordinate information
- * @notes Should there be PathData that contains types[] and points[]
- * for get & set purposes.
- */
- Status GetPathPoints(OUT PointF* points,
- IN INT count) const
- {
- return SetStatus(DllExports::GdipGetPathPoints(nativePath, points, count));
- }
-
- // integer version
- Status GetPathPoints(OUT Point* points,
- IN INT count) const
- {
- return SetStatus(DllExports::GdipGetPathPointsI(nativePath, points, count));
- }
-
- Status GetLastStatus() const
- {
- Status lastStatus = lastResult;
- lastResult = Ok;
-
- return lastStatus;
- }
-
- /**
- * Hit testing operations
- *
- * inline implementation is in gdiplusgraphics.h.
- */
-
- BOOL IsVisible(IN const PointF& point,
- IN const Graphics* g = NULL) const
- {
- return IsVisible(point.X, point.Y, g);
- }
-
- BOOL IsVisible(IN REAL x,
- IN REAL y,
- IN const Graphics* g = NULL) const;
-
- BOOL IsVisible(IN const Point& point,
- IN const Graphics* g = NULL) const
- {
- return IsVisible(point.X, point.Y, g);
- }
-
- BOOL IsVisible(IN INT x,
- IN INT y,
- IN const Graphics* g = NULL) const;
-
- BOOL IsOutlineVisible(IN const PointF& point,
- IN const Pen* pen,
- IN const Graphics* g = NULL) const
- {
- return IsOutlineVisible(point.X, point.Y, pen, g);
- }
-
- BOOL IsOutlineVisible(IN REAL x,
- IN REAL y,
- IN const Pen* pen,
- IN const Graphics* g = NULL) const;
-
- BOOL IsOutlineVisible(IN const Point& point,
- IN const Pen* pen,
- IN const Graphics* g = NULL) const
- {
- return IsOutlineVisible(point.X, point.Y, pen, g);
- }
-
- BOOL IsOutlineVisible(IN INT x,
- IN INT y,
- IN const Pen* pen,
- IN const Graphics* g = NULL) const;
-
-protected:
-
- GraphicsPath(const GraphicsPath& path)
- {
- GpPath *clonepath = NULL;
- SetStatus(DllExports::GdipClonePath(path.nativePath, &clonepath));
- SetNativePath(clonepath);
- }
-
-#ifdef DCR_USE_NEW_250932
-
-private:
- GraphicsPath& operator=(const GraphicsPath &);
-protected:
-
-#else
-
- GraphicsPath& operator=(const GraphicsPath& path)
- {
- path;
- SetStatus(NotImplemented);
- return *this;
- }
-
-#endif
-
- GraphicsPath(GpPath* nativePath)
- {
- lastResult = Ok;
- SetNativePath(nativePath);
- }
-
- VOID SetNativePath(GpPath *nativePath)
- {
- this->nativePath = nativePath;
- }
-
- Status SetStatus(Status status) const
- {
- if (status != Ok)
- return (lastResult = status);
- else
- return status;
- }
-
-protected:
- GpPath* nativePath;
- mutable Status lastResult;
-};
-
-
-//--------------------------------------------------------------------------
-// GraphisPathIterator class
-//--------------------------------------------------------------------------
-
-class GraphicsPathIterator : public GdiplusBase
-{
-public:
-
- GraphicsPathIterator(IN const GraphicsPath* path)
- {
- GpPath* nativePath = NULL;
- if(path)
- nativePath = path->nativePath;
-
- GpPathIterator *iter = NULL;
- lastResult = DllExports::GdipCreatePathIter(&iter, nativePath);
- SetNativeIterator(iter);
- }
-
- ~GraphicsPathIterator()
- {
- DllExports::GdipDeletePathIter(nativeIterator);
- }
-
-
- INT NextSubpath(OUT INT* startIndex,
- OUT INT* endIndex,
- OUT BOOL* isClosed)
- {
- INT resultCount;
-
- SetStatus(DllExports::GdipPathIterNextSubpath(nativeIterator,
- &resultCount, startIndex, endIndex, isClosed));
-
- return resultCount;
- }
-
-
- INT NextSubpath(IN const GraphicsPath* path,
- OUT BOOL* isClosed)
- {
- GpPath* nativePath = NULL;
-
- INT resultCount;
-
- if(path)
- nativePath= path->nativePath;
-
- SetStatus(DllExports::GdipPathIterNextSubpathPath(nativeIterator,
- &resultCount, nativePath, isClosed));
-
- return resultCount;
- }
-
- INT NextPathType(OUT BYTE* pathType,
- OUT INT* startIndex,
- OUT INT* endIndex)
- {
- INT resultCount;
-
- SetStatus(DllExports::GdipPathIterNextPathType(nativeIterator,
- &resultCount, pathType, startIndex, endIndex));
-
- return resultCount;
- }
-
- INT NextMarker(OUT INT* startIndex,
- OUT INT* endIndex)
- {
- INT resultCount;
-
- SetStatus(DllExports::GdipPathIterNextMarker(nativeIterator,
- &resultCount, startIndex, endIndex));
-
- return resultCount;
- }
-
-
- INT NextMarker(IN const GraphicsPath* path)
- {
- GpPath* nativePath = NULL;
-
- INT resultCount;
-
- if(path)
- nativePath= path->nativePath;
-
- SetStatus(DllExports::GdipPathIterNextMarkerPath(nativeIterator,
- &resultCount, nativePath));
-
- return resultCount;
- }
-
- INT GetCount() const
- {
- INT resultCount;
-
- SetStatus(DllExports::GdipPathIterGetCount(nativeIterator, &resultCount));
-
- return resultCount;
- }
-
- INT GetSubpathCount() const
- {
- INT resultCount;
-
- SetStatus(DllExports::GdipPathIterGetSubpathCount(nativeIterator, &resultCount));
-
- return resultCount;
- }
-
- BOOL HasCurve() const
- {
- BOOL hasCurve;
-
- SetStatus(DllExports::GdipPathIterHasCurve(nativeIterator, &hasCurve));
-
- return hasCurve;
- }
-
- VOID Rewind()
- {
- SetStatus(DllExports::GdipPathIterRewind(nativeIterator));
- }
-
- INT Enumerate(OUT PointF *points,
- OUT BYTE *types,
- IN INT count)
- {
- INT resultCount;
-
- SetStatus(DllExports::GdipPathIterEnumerate(nativeIterator,
- &resultCount, points, types, count));
-
- return resultCount;
- }
-
- INT CopyData(OUT PointF* points,
- OUT BYTE* types,
- IN INT startIndex,
- IN INT endIndex)
- {
- INT resultCount;
-
- SetStatus(DllExports::GdipPathIterCopyData(nativeIterator,
- &resultCount, points, types, startIndex, endIndex));
-
- return resultCount;
- }
-
- Status GetLastStatus() const
- {
- Status lastStatus = lastResult;
- lastResult = Ok;
-
- return lastStatus;
- }
-
-#ifdef DCR_USE_NEW_250932
-
-private:
- GraphicsPathIterator(const GraphicsPathIterator &);
- GraphicsPathIterator& operator=(const GraphicsPathIterator &);
-
-#endif
-
-protected:
- VOID SetNativeIterator(GpPathIterator *nativeIterator)
- {
- this->nativeIterator = nativeIterator;
- }
-
- Status SetStatus(Status status) const
- {
- if (status != Ok)
- return (lastResult = status);
- else
- return status;
- }
-
-protected:
- GpPathIterator* nativeIterator;
- mutable Status lastResult;
-};
-
-
-//--------------------------------------------------------------------------
-// Represent polygon gradient brush object
-//--------------------------------------------------------------------------
-
-class PathGradientBrush : public Brush
-{
-public:
- friend class Pen;
-
- PathGradientBrush(
- IN const PointF* points,
- IN INT count,
- IN WrapMode wrapMode = WrapModeClamp)
- {
- GpPathGradient *brush = NULL;
-
- lastResult = DllExports::GdipCreatePathGradient(
- points, count,
- wrapMode, &brush);
- SetNativeBrush(brush);
- }
-
- PathGradientBrush(
- IN const Point* points,
- IN INT count,
- IN WrapMode wrapMode = WrapModeClamp)
- {
- GpPathGradient *brush = NULL;
-
- lastResult = DllExports::GdipCreatePathGradientI(
- points, count,
- wrapMode, &brush);
-
- SetNativeBrush(brush);
- }
-
- PathGradientBrush(
- IN const GraphicsPath* path
- )
- {
- GpPathGradient *brush = NULL;
-
- lastResult = DllExports::GdipCreatePathGradientFromPath(
- path->nativePath, &brush);
- SetNativeBrush(brush);
- }
-
- // Get/set colors
-
- Status GetCenterColor(OUT Color* color) const
- {
- ARGB argb;
-
- if (color == NULL)
- {
- return SetStatus(InvalidParameter);
- }
-
- SetStatus(DllExports::GdipGetPathGradientCenterColor(
- (GpPathGradient*) nativeBrush, &argb));
-
- color->SetValue(argb);
-
- return lastResult;
- }
-
- Status SetCenterColor(IN const Color& color)
- {
- SetStatus(DllExports::GdipSetPathGradientCenterColor(
- (GpPathGradient*) nativeBrush,
- color.GetValue()));
-
- return lastResult;
- }
-
- INT GetPointCount() const
- {
- INT count;
-
- SetStatus(DllExports::GdipGetPathGradientPointCount(
- (GpPathGradient*) nativeBrush, &count));
-
- return count;
- }
-
- INT GetSurroundColorCount() const
- {
- INT count;
-
- SetStatus(DllExports::GdipGetPathGradientSurroundColorCount(
- (GpPathGradient*) nativeBrush, &count));
-
- return count;
- }
-
- Status GetSurroundColors(OUT Color* colors,
- IN OUT INT* count) const
- {
- if(colors == NULL || count == NULL)
- {
- return SetStatus(InvalidParameter);
- }
-
- INT count1;
-
- SetStatus(DllExports::GdipGetPathGradientSurroundColorCount(
- (GpPathGradient*) nativeBrush, &count1));
-
- if(lastResult != Ok)
- return lastResult;
-
- if((*count < count1) || (count1 <= 0))
- return SetStatus(InsufficientBuffer);
-
- ARGB* argbs = (ARGB*) new ARGB[count1];
- if(argbs == NULL)
- return SetStatus(OutOfMemory);
-
- SetStatus(DllExports::GdipGetPathGradientSurroundColorsWithCount(
- (GpPathGradient*)nativeBrush, argbs, &count1));
-
- if(lastResult == Ok)
- {
- for(INT i = 0; i < count1; i++)
- {
- colors[i].SetValue(argbs[i]);
- }
- *count = count1;
- }
-
- delete [] argbs;
- return lastResult;
- }
-
- Status SetSurroundColors(IN const Color* colors,
- IN OUT INT* count)
- {
- if(colors == NULL || count == NULL)
- {
- return SetStatus(InvalidParameter);
- }
-
- INT count1 = GetPointCount();
-
- if((*count > count1) || (count1 <= 0))
- return SetStatus(InvalidParameter);
-
- count1 = *count;
-
- ARGB* argbs = (ARGB*) new ARGB[count1];
- if(argbs == NULL)
- return SetStatus(OutOfMemory);
-
- for(INT i = 0; i < count1; i++)
- {
- argbs[i] = colors[i].GetValue();
- }
-
- SetStatus(DllExports::GdipSetPathGradientSurroundColorsWithCount(
- (GpPathGradient*)nativeBrush, argbs, &count1));
-
- if(lastResult == Ok)
- *count = count1;
-
- delete [] argbs;
-
- return lastResult;
- }
-
- Status GetGraphicsPath(OUT GraphicsPath* path) const
- {
- if(path == NULL)
- return SetStatus(InvalidParameter);
-
- return SetStatus(DllExports::GdipGetPathGradientPath(
- (GpPathGradient*)nativeBrush, path->nativePath));
- }
-
- Status SetGraphicsPath(IN const GraphicsPath* path)
- {
- if(path == NULL)
- return SetStatus(InvalidParameter);
-
- return SetStatus(DllExports::GdipSetPathGradientPath(
- (GpPathGradient*)nativeBrush, path->nativePath));
- }
-
- Status GetCenterPoint(OUT PointF* point) const
- {
- return SetStatus(DllExports::GdipGetPathGradientCenterPoint(
- (GpPathGradient*)nativeBrush,
- point));
- }
-
-
- Status GetCenterPoint(OUT Point* point) const
- {
- return SetStatus(DllExports::GdipGetPathGradientCenterPointI(
- (GpPathGradient*)nativeBrush,
- point));
- }
-
- Status SetCenterPoint(IN const PointF& point)
- {
- return SetStatus(DllExports::GdipSetPathGradientCenterPoint(
- (GpPathGradient*)nativeBrush,
- &point));
- }
-
- Status SetCenterPoint(IN const Point& point)
- {
- return SetStatus(DllExports::GdipSetPathGradientCenterPointI(
- (GpPathGradient*)nativeBrush,
- &point));
- }
-
- Status GetRectangle(OUT RectF* rect) const
- {
- return SetStatus(DllExports::GdipGetPathGradientRect(
- (GpPathGradient*)nativeBrush, rect));
- }
-
- Status GetRectangle(OUT Rect* rect) const
- {
- return SetStatus(DllExports::GdipGetPathGradientRectI(
- (GpPathGradient*)nativeBrush, rect));
- }
-
- // Gamma correction.
-
- Status SetGammaCorrection(IN BOOL useGammaCorrection)
- {
- return SetStatus(DllExports::GdipSetPathGradientGammaCorrection(
- (GpPathGradient*)nativeBrush, useGammaCorrection));
- }
-
- BOOL GetGammaCorrection() const
- {
- BOOL useGammaCorrection;
-
- SetStatus(DllExports::GdipGetPathGradientGammaCorrection(
- (GpPathGradient*)nativeBrush, &useGammaCorrection));
-
- return useGammaCorrection;
- }
-
- INT GetBlendCount() const
- {
- INT count = 0;
-
- SetStatus(DllExports::GdipGetPathGradientBlendCount(
- (GpPathGradient*) nativeBrush, &count));
-
- return count;
- }
-
- Status GetBlend(OUT REAL* blendFactors,
- OUT REAL* blendPositions,
- IN INT count) const
- {
- return SetStatus(DllExports::GdipGetPathGradientBlend(
- (GpPathGradient*)nativeBrush,
- blendFactors, blendPositions, count));
- }
-
- Status SetBlend(IN const REAL* blendFactors,
- IN const REAL* blendPositions,
- IN INT count)
- {
- return SetStatus(DllExports::GdipSetPathGradientBlend(
- (GpPathGradient*)nativeBrush,
- blendFactors, blendPositions, count));
- }
-
- INT GetInterpolationColorCount() const
- {
- INT count = 0;
-
- SetStatus(DllExports::GdipGetPathGradientPresetBlendCount(
- (GpPathGradient*) nativeBrush, &count));
-
- return count;
- }
-
- Status SetInterpolationColors(IN const Color* presetColors,
- IN const REAL* blendPositions,
- IN INT count)
- {
- if ((count <= 0) || !presetColors)
- {
- return SetStatus(InvalidParameter);
- }
-
- ARGB* argbs = (ARGB*) new ARGB[count];
- if(argbs)
- {
- for(INT i = 0; i < count; i++)
- {
- argbs[i] = presetColors[i].GetValue();
- }
-
- Status status = SetStatus(DllExports::GdipSetPathGradientPresetBlend(
- (GpPathGradient*) nativeBrush,
- argbs,
- blendPositions,
- count));
- delete[] argbs;
- return status;
- }
- else
- {
- return SetStatus(OutOfMemory);
- }
- }
-
- Status GetInterpolationColors(OUT Color* presetColors,
- OUT REAL* blendPositions,
- IN INT count) const
- {
- if ((count <= 0) || !presetColors)
- {
- return SetStatus(InvalidParameter);
- }
-
- ARGB* argbs = (ARGB*) new ARGB[count];
-
- if (!argbs)
- {
- return SetStatus(OutOfMemory);
- }
-
- GpStatus status = SetStatus(DllExports::GdipGetPathGradientPresetBlend(
- (GpPathGradient*)nativeBrush,
- argbs,
- blendPositions,
- count));
-
- for(INT i = 0; i < count; i++)
- {
- presetColors[i] = Color(argbs[i]);
- }
- delete [] argbs;
-
- return status;
- }
-
- Status SetBlendBellShape(IN REAL focus,
- IN REAL scale = 1.0)
- {
- return SetStatus(DllExports::GdipSetPathGradientSigmaBlend(
- (GpPathGradient*)nativeBrush, focus, scale));
- }
-
- #ifdef DCR_USE_NEW_145135
- Status SetBlendTriangularShape(
- IN REAL focus,
- IN REAL scale = 1.0
- )
- #else
- Status SetBlendTrianglarShape(IN REAL focus,
- IN REAL scale = 1.0)
- #endif
- {
- return SetStatus(DllExports::GdipSetPathGradientLinearBlend(
- (GpPathGradient*)nativeBrush, focus, scale));
- }
-
- /**
- * Get/set brush transform
- */
- Status GetTransform(OUT Matrix *matrix) const
- {
- return SetStatus(DllExports::GdipGetPathGradientTransform(
- (GpPathGradient*) nativeBrush, matrix->nativeMatrix));
- }
-
- Status SetTransform(IN const Matrix* matrix)
- {
- return SetStatus(DllExports::GdipSetPathGradientTransform(
- (GpPathGradient*) nativeBrush, matrix->nativeMatrix));
- }
-
- Status ResetTransform()
- {
- return SetStatus(DllExports::GdipResetPathGradientTransform((GpPathGradient*)nativeBrush));
- }
-
- Status MultiplyTransform(IN const Matrix* matrix,
- IN MatrixOrder order = MatrixOrderPrepend)
- {
- return SetStatus(DllExports::GdipMultiplyPathGradientTransform((GpPathGradient*)nativeBrush,
- matrix->nativeMatrix,
- order));
- }
-
- Status TranslateTransform(IN REAL dx,
- IN REAL dy,
- IN MatrixOrder order = MatrixOrderPrepend)
- {
- return SetStatus(DllExports::GdipTranslatePathGradientTransform((GpPathGradient*)nativeBrush,
- dx, dy, order));
- }
-
- Status ScaleTransform(IN REAL sx,
- IN REAL sy,
- IN MatrixOrder order = MatrixOrderPrepend)
- {
- return SetStatus(DllExports::GdipScalePathGradientTransform((GpPathGradient*)nativeBrush,
- sx, sy, order));
- }
-
- Status RotateTransform(IN REAL angle,
- IN MatrixOrder order = MatrixOrderPrepend)
- {
- return SetStatus(DllExports::GdipRotatePathGradientTransform((GpPathGradient*)nativeBrush,
- angle, order));
- }
-
- /**
- * Get/set brush focus scales
- */
- Status GetFocusScales(OUT REAL* xScale,
- OUT REAL* yScale) const
- {
- return SetStatus(DllExports::GdipGetPathGradientFocusScales(
- (GpPathGradient*) nativeBrush, xScale, yScale));
- }
-
- Status SetFocusScales(IN REAL xScale,
- IN REAL yScale)
- {
- return SetStatus(DllExports::GdipSetPathGradientFocusScales(
- (GpPathGradient*) nativeBrush, xScale, yScale));
- }
-
- /**
- * Get/set brush wrapping mode
- */
- WrapMode GetWrapMode() const
- {
- WrapMode wrapMode;
-
- SetStatus(DllExports::GdipGetPathGradientWrapMode(
- (GpPathGradient*) nativeBrush, &wrapMode));
-
- return wrapMode;
- }
-
- Status SetWrapMode(IN WrapMode wrapMode)
- {
- return SetStatus(DllExports::GdipSetPathGradientWrapMode(
- (GpPathGradient*) nativeBrush, wrapMode));
- }
-
-#ifdef DCR_USE_NEW_250932
-
-private:
- PathGradientBrush(const PathGradientBrush &);
- PathGradientBrush& operator=(const PathGradientBrush &);
-
-#endif
-
-protected:
-
- PathGradientBrush()
- {
- }
-};
-
-
-#endif // !_GRAPHICSPATH_HPP
+/**************************************************************************\
+*
+* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
+*
+* Module Name:
+*
+* GdiplusPath.h
+*
+* Abstract:
+*
+* Path related declarations
+*
+\**************************************************************************/
+
+#ifndef _GDIPLUSPATH_H
+#define _GDIPLUSPATH_H
+
+class GraphicsPath : public GdiplusBase
+{
+public:
+ friend class Graphics;
+ friend class Region;
+ friend class PathGradientBrush;
+ friend class GraphicsPathIterator;
+ friend class CustomLineCap;
+
+ // Path constructors
+
+ GraphicsPath(IN FillMode fillMode = FillModeAlternate)
+ {
+ nativePath = NULL;
+ lastResult = DllExports::GdipCreatePath(fillMode, &nativePath);
+ }
+
+ GraphicsPath(IN const PointF* points,
+ IN const BYTE* types,
+ IN INT count,
+ IN FillMode fillMode = FillModeAlternate)
+ {
+ nativePath = NULL;
+ lastResult = DllExports::GdipCreatePath2(points,
+ types,
+ count,
+ fillMode,
+ &nativePath);
+ }
+
+ GraphicsPath(IN const Point* points,
+ IN const BYTE* types,
+ IN INT count,
+ IN FillMode fillMode = FillModeAlternate)
+ {
+ nativePath = NULL;
+ lastResult = DllExports::GdipCreatePath2I(points,
+ types,
+ count,
+ fillMode,
+ &nativePath);
+ }
+
+ ~GraphicsPath()
+ {
+ DllExports::GdipDeletePath(nativePath);
+ }
+
+ /**
+ * Make a copy of the current path object
+ */
+ GraphicsPath* Clone() const
+ {
+ GpPath *clonepath = NULL;
+
+ SetStatus(DllExports::GdipClonePath(nativePath, &clonepath));
+
+ return new GraphicsPath(clonepath);
+ }
+
+ /**
+ * Reset the path object to empty (and fill mode to FillModeAlternate)
+ */
+ Status Reset()
+ {
+ return SetStatus(DllExports::GdipResetPath(nativePath));
+ }
+
+ /**
+ * Get path fill mode information
+ */
+ FillMode GetFillMode() const
+ {
+ FillMode fillmode = FillModeAlternate;
+
+ SetStatus(DllExports::GdipGetPathFillMode(nativePath, &fillmode));
+
+ return fillmode;
+ }
+
+ /**
+ * Set path fill mode information
+ */
+ Status SetFillMode(IN FillMode fillmode)
+ {
+ return SetStatus(DllExports::GdipSetPathFillMode(nativePath, fillmode));
+ }
+
+ /**
+ * Set/get path data
+ */
+ Status GetPathData(OUT PathData* pathData) const
+ {
+ if (pathData == NULL)
+ {
+ return SetStatus(InvalidParameter);
+ }
+
+ INT count = GetPointCount();
+
+ if ((count <= 0) || (pathData->Count>0 && pathData->Count<count))
+ {
+ pathData->Count = 0;
+ if (pathData->Points)
+ {
+ delete pathData->Points;
+ pathData->Points = NULL;
+ }
+
+ if (pathData->Types)
+ {
+ delete pathData->Types;
+ pathData->Types = NULL;
+ }
+
+ if (count <= 0)
+ {
+ return lastResult;
+ }
+ }
+
+ if (pathData->Count == 0)
+ {
+ pathData->Points = new PointF[count];
+ if (pathData->Points == NULL)
+ {
+ return SetStatus(OutOfMemory);
+
+ }
+ pathData->Types = new byte[count];
+ if (pathData->Types == NULL)
+ {
+ delete pathData->Points;
+ pathData->Points = NULL;
+
+ return SetStatus(OutOfMemory);
+ }
+ pathData->Count = count;
+ }
+
+ return SetStatus(DllExports::GdipGetPathData(nativePath, pathData));
+ }
+
+ /**
+ * Start/end a subpath
+ */
+ Status StartFigure()
+ {
+ return SetStatus(DllExports::GdipStartPathFigure(nativePath));
+ }
+
+ Status CloseFigure()
+ {
+ return SetStatus(DllExports::GdipClosePathFigure(nativePath));
+ }
+
+ Status CloseAllFigures()
+ {
+ return SetStatus(DllExports::GdipClosePathFigures(nativePath));
+ }
+
+ Status SetMarker()
+ {
+ return SetStatus(DllExports::GdipSetPathMarker(nativePath));
+ }
+
+ Status ClearMarkers()
+ {
+ return SetStatus(DllExports::GdipClearPathMarkers(nativePath));
+ }
+
+ Status Reverse()
+ {
+ return SetStatus(DllExports::GdipReversePath(nativePath));
+ }
+
+ Status GetLastPoint(OUT PointF* lastPoint) const
+ {
+ return SetStatus(DllExports::GdipGetPathLastPoint(nativePath, lastPoint));
+ }
+
+ /**
+ * Add lines to the path object
+ */
+ // float version
+ Status AddLine(IN const PointF& pt1,
+ IN const PointF& pt2)
+ {
+ return AddLine(pt1.X, pt1.Y, pt2.X, pt2.Y);
+ }
+
+ Status AddLine(IN REAL x1,
+ IN REAL y1,
+ IN REAL x2,
+ IN REAL y2)
+ {
+ return SetStatus(DllExports::GdipAddPathLine(nativePath, x1, y1, x2, y2));
+ }
+
+ Status AddLines(IN const PointF* points,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipAddPathLine2(nativePath, points, count));
+ }
+
+ // integer version
+ Status AddLine(IN const Point& pt1,
+ IN const Point& pt2)
+ {
+ return AddLine(pt1.X,
+ pt1.Y,
+ pt2.X,
+ pt2.Y);
+ }
+
+ Status AddLine(IN INT x1,
+ IN INT y1,
+ IN INT x2,
+ IN INT y2)
+ {
+ return SetStatus(DllExports::GdipAddPathLineI(nativePath,
+ x1,
+ y1,
+ x2,
+ y2));
+ }
+
+ Status AddLines(IN const Point* points,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipAddPathLine2I(nativePath,
+ points,
+ count));
+ }
+
+ /**
+ * Add an arc to the path object
+ */
+ // float version
+ Status AddArc(IN const RectF& rect,
+ IN REAL startAngle,
+ IN REAL sweepAngle)
+ {
+ return AddArc(rect.X, rect.Y, rect.Width, rect.Height,
+ startAngle, sweepAngle);
+ }
+
+ Status AddArc(IN REAL x,
+ IN REAL y,
+ IN REAL width,
+ IN REAL height,
+ IN REAL startAngle,
+ IN REAL sweepAngle)
+ {
+ return SetStatus(DllExports::GdipAddPathArc(nativePath, x, y, width, height,
+ startAngle, sweepAngle));
+ }
+
+ // integer version
+ Status AddArc(IN const Rect& rect,
+ IN REAL startAngle,
+ IN REAL sweepAngle)
+ {
+ return AddArc(rect.X, rect.Y, rect.Width, rect.Height,
+ startAngle, sweepAngle);
+ }
+
+ Status AddArc(IN INT x,
+ IN INT y,
+ IN INT width,
+ IN INT height,
+ IN REAL startAngle,
+ IN REAL sweepAngle)
+ {
+ return SetStatus(DllExports::GdipAddPathArcI(nativePath,
+ x,
+ y,
+ width,
+ height,
+ startAngle,
+ sweepAngle));
+ }
+
+ /**
+ * Add Bezier curves to the path object
+ */
+ // float version
+ Status AddBezier(IN const PointF& pt1,
+ IN const PointF& pt2,
+ IN const PointF& pt3,
+ IN const PointF& pt4)
+ {
+ return AddBezier(pt1.X, pt1.Y, pt2.X, pt2.Y, pt3.X, pt3.Y, pt4.X,
+ pt4.Y);
+ }
+
+ Status AddBezier(IN REAL x1,
+ IN REAL y1,
+ IN REAL x2,
+ IN REAL y2,
+ IN REAL x3,
+ IN REAL y3,
+ IN REAL x4,
+ IN REAL y4)
+ {
+ return SetStatus(DllExports::GdipAddPathBezier(nativePath, x1, y1, x2, y2,
+ x3, y3, x4, y4));
+ }
+
+ Status AddBeziers(IN const PointF* points,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipAddPathBeziers(nativePath, points, count));
+ }
+
+ // integer version
+ Status AddBezier(IN const Point& pt1,
+ IN const Point& pt2,
+ IN const Point& pt3,
+ IN const Point& pt4)
+ {
+ return AddBezier(pt1.X, pt1.Y, pt2.X, pt2.Y, pt3.X, pt3.Y, pt4.X,
+ pt4.Y);
+ }
+
+ Status AddBezier(IN INT x1,
+ IN INT y1,
+ IN INT x2,
+ IN INT y2,
+ IN INT x3,
+ IN INT y3,
+ IN INT x4,
+ IN INT y4)
+ {
+ return SetStatus(DllExports::GdipAddPathBezierI(nativePath,
+ x1,
+ y1,
+ x2,
+ y2,
+ x3,
+ y3,
+ x4,
+ y4));
+ }
+
+ Status AddBeziers(IN const Point* points,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipAddPathBeziersI(nativePath,
+ points,
+ count));
+ }
+
+ // float version
+ Status AddCurve(IN const PointF* points,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipAddPathCurve(nativePath,
+ points,
+ count));
+ }
+
+ Status AddCurve(IN const PointF* points,
+ IN INT count,
+ IN REAL tension)
+ {
+ return SetStatus(DllExports::GdipAddPathCurve2(nativePath,
+ points,
+ count,
+ tension));
+ }
+
+ Status AddCurve(IN const PointF* points,
+ IN INT count,
+ IN INT offset,
+ IN INT numberOfSegments,
+ IN REAL tension)
+ {
+ return SetStatus(DllExports::GdipAddPathCurve3(nativePath,
+ points,
+ count,
+ offset,
+ numberOfSegments,
+ tension));
+ }
+
+ // integer version
+ Status AddCurve(IN const Point* points,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipAddPathCurveI(nativePath,
+ points,
+ count));
+ }
+
+ Status AddCurve(IN const Point* points,
+ IN INT count,
+ IN REAL tension)
+ {
+ return SetStatus(DllExports::GdipAddPathCurve2I(nativePath,
+ points,
+ count,
+ tension));
+ }
+
+ Status AddCurve(IN const Point* points,
+ IN INT count,
+ IN INT offset,
+ IN INT numberOfSegments,
+ IN REAL tension)
+ {
+ return SetStatus(DllExports::GdipAddPathCurve3I(nativePath,
+ points,
+ count,
+ offset,
+ numberOfSegments,
+ tension));
+ }
+
+ // float version
+ Status AddClosedCurve(IN const PointF* points,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipAddPathClosedCurve(nativePath,
+ points,
+ count));
+ }
+
+ Status AddClosedCurve(IN const PointF* points,
+ IN INT count,
+ IN REAL tension)
+ {
+ return SetStatus(DllExports::GdipAddPathClosedCurve2(nativePath,
+ points,
+ count,
+ tension));
+ }
+
+ // integer version
+ Status AddClosedCurve(IN const Point* points,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipAddPathClosedCurveI(nativePath,
+ points,
+ count));
+ }
+
+
+ Status AddClosedCurve(IN const Point* points,
+ IN INT count,
+ IN REAL tension)
+ {
+ return SetStatus(DllExports::GdipAddPathClosedCurve2I(nativePath,
+ points,
+ count,
+ tension));
+ }
+
+
+ /**
+ * Add closed shapes to the path object
+ */
+
+ // float version
+ Status AddRectangle(IN const RectF& rect)
+ {
+ return SetStatus(DllExports::GdipAddPathRectangle(nativePath,
+ rect.X,
+ rect.Y,
+ rect.Width,
+ rect.Height));
+ }
+
+ Status AddRectangles(IN const RectF* rects,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipAddPathRectangles(nativePath,
+ rects,
+ count));
+ }
+
+ // integer version
+ Status AddRectangle(IN const Rect& rect)
+ {
+ return SetStatus(DllExports::GdipAddPathRectangleI(nativePath,
+ rect.X,
+ rect.Y,
+ rect.Width,
+ rect.Height));
+ }
+
+ Status AddRectangles(IN const Rect* rects, INT count)
+ {
+ return SetStatus(DllExports::GdipAddPathRectanglesI(nativePath,
+ rects,
+ count));
+ }
+
+ // float version
+ Status AddEllipse(IN const RectF& rect)
+ {
+ return AddEllipse(rect.X, rect.Y, rect.Width, rect.Height);
+ }
+
+ Status AddEllipse(IN REAL x,
+ IN REAL y,
+ IN REAL width,
+ IN REAL height)
+ {
+ return SetStatus(DllExports::GdipAddPathEllipse(nativePath,
+ x,
+ y,
+ width,
+ height));
+ }
+
+ // integer version
+ Status AddEllipse(IN const Rect& rect)
+ {
+ return AddEllipse(rect.X, rect.Y, rect.Width, rect.Height);
+ }
+
+ Status AddEllipse(IN INT x,
+ IN INT y,
+ IN INT width,
+ IN INT height)
+ {
+ return SetStatus(DllExports::GdipAddPathEllipseI(nativePath,
+ x,
+ y,
+ width,
+ height));
+ }
+
+ // float version
+ Status AddPie(IN const RectF& rect,
+ IN REAL startAngle,
+ IN REAL sweepAngle)
+ {
+ return AddPie(rect.X, rect.Y, rect.Width, rect.Height, startAngle,
+ sweepAngle);
+ }
+
+ Status AddPie(IN REAL x,
+ IN REAL y,
+ IN REAL width,
+ IN REAL height,
+ IN REAL startAngle,
+ IN REAL sweepAngle)
+ {
+ return SetStatus(DllExports::GdipAddPathPie(nativePath, x, y, width, height,
+ startAngle, sweepAngle));
+ }
+
+ // integer version
+ Status AddPie(IN const Rect& rect,
+ IN REAL startAngle,
+ IN REAL sweepAngle)
+ {
+ return AddPie(rect.X,
+ rect.Y,
+ rect.Width,
+ rect.Height,
+ startAngle,
+ sweepAngle);
+ }
+
+ Status AddPie(IN INT x,
+ IN INT y,
+ IN INT width,
+ IN INT height,
+ IN REAL startAngle,
+ IN REAL sweepAngle)
+ {
+ return SetStatus(DllExports::GdipAddPathPieI(nativePath,
+ x,
+ y,
+ width,
+ height,
+ startAngle,
+ sweepAngle));
+ }
+
+ // float version
+ Status AddPolygon(IN const PointF* points,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipAddPathPolygon(nativePath, points, count));
+ }
+
+ // integer version
+ Status AddPolygon(IN const Point* points,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipAddPathPolygonI(nativePath, points, count));
+ }
+
+ Status AddPath(IN const GraphicsPath* addingPath,
+ IN BOOL connect)
+ {
+ GpPath* nativePath2 = NULL;
+ if(addingPath)
+ nativePath2 = addingPath->nativePath;
+
+ return SetStatus(DllExports::GdipAddPathPath(nativePath, nativePath2, connect));
+ }
+
+ // AddString point version
+
+ Status AddString(
+ IN const WCHAR *string,
+ IN INT length,
+ IN const FontFamily *family,
+ IN INT style,
+ IN REAL emSize, // In world units
+ IN const PointF &origin,
+ IN const StringFormat *format
+ )
+ {
+ RectF rect(origin.X, origin.Y, 0.0f, 0.0f);
+
+ return SetStatus(DllExports::GdipAddPathString(
+ nativePath,
+ string,
+ length,
+ family ? family->nativeFamily : NULL,
+ style,
+ emSize,
+ &rect,
+ format ? format->nativeFormat : NULL
+ ));
+ }
+
+ // AddString rectangle version
+
+ Status AddString(
+ IN const WCHAR *string,
+ IN INT length,
+ IN const FontFamily *family,
+ IN INT style,
+ IN REAL emSize, // In world units
+ IN const RectF &layoutRect,
+ IN const StringFormat *format
+ )
+ {
+ return SetStatus(DllExports::GdipAddPathString(
+ nativePath,
+ string,
+ length,
+ family ? family->nativeFamily : NULL,
+ style,
+ emSize,
+ &layoutRect,
+ format ? format->nativeFormat : NULL
+ ));
+ }
+
+ Status AddString(
+ IN const WCHAR *string,
+ IN INT length,
+ IN const FontFamily *family,
+ IN INT style,
+ IN REAL emSize, // In world units
+ IN const Point &origin,
+ IN const StringFormat *format
+ )
+ {
+ Rect rect(origin.X, origin.Y, 0, 0);
+
+ return SetStatus(DllExports::GdipAddPathStringI(
+ nativePath,
+ string,
+ length,
+ family ? family->nativeFamily : NULL,
+ style,
+ emSize,
+ &rect,
+ format ? format->nativeFormat : NULL
+ ));
+ }
+
+ // AddString rectangle version
+
+ Status AddString(
+ IN const WCHAR *string,
+ IN INT length,
+ IN const FontFamily *family,
+ IN INT style,
+ IN REAL emSize, // In world units
+ IN const Rect &layoutRect,
+ IN const StringFormat *format
+ )
+ {
+ return SetStatus(DllExports::GdipAddPathStringI(
+ nativePath,
+ string,
+ length,
+ family ? family->nativeFamily : NULL,
+ style,
+ emSize,
+ &layoutRect,
+ format ? format->nativeFormat : NULL
+ ));
+ }
+
+ /**
+ * Transforms the path object
+ */
+ Status Transform(IN const Matrix* matrix)
+ {
+ if(matrix)
+ return SetStatus(DllExports::GdipTransformPath(nativePath, matrix->nativeMatrix));
+ else
+ return Ok; // No need to transform.
+ }
+
+ /**
+ * Get the bounds of the path object with the given transform.
+ * This is not always the tightest bounds.
+ *
+ * Defined in GdiplusGraphics.h.
+ */
+ Status GetBounds(OUT RectF* bounds,
+ IN const Matrix* matrix = NULL,
+ IN const Pen* pen = NULL) const;
+
+ // integer version (defined in GdiplusGraphics.h)
+ Status GetBounds(OUT Rect* bounds,
+ IN const Matrix* matrix = NULL,
+ IN const Pen* pen = NULL) const;
+
+ /**
+ * Flatten the path object
+ * Once this is called, the resultant path is made of line segments and
+ * the original path information is lost.
+ * When matrix = NULL, the identity matrix is assumed.
+ */
+ Status Flatten(IN const Matrix* matrix = NULL,
+ IN REAL flatness = FlatnessDefault)
+ {
+ GpMatrix* nativeMatrix = NULL;
+ if(matrix)
+ {
+ nativeMatrix = matrix->nativeMatrix;
+ }
+
+ return SetStatus(DllExports::GdipFlattenPath(
+ nativePath,
+ nativeMatrix,
+ flatness
+ ));
+ }
+
+#ifdef DCR_USE_NEW_202903
+
+ Status Widen(
+ IN const Pen* pen,
+ IN const Matrix* matrix = NULL,
+ IN REAL flatness = FlatnessDefault
+ )
+ {
+ GpMatrix* nativeMatrix = NULL;
+ if(matrix)
+ nativeMatrix = matrix->nativeMatrix;
+
+ return SetStatus(DllExports::GdipWidenPath(
+ nativePath,
+ pen->nativePen,
+ nativeMatrix,
+ flatness
+ ));
+ }
+
+#else
+
+ /**
+ * Widen the path object
+ * When removeSelfIntersects is TRUE, this returns the widened path
+ * without self intersections.
+ * When it is FALSE, it returns the widened path with selfintersections.
+ * The latter is faster and is usually safficient for filling.
+ */
+ Status Widen(IN const Pen* pen,
+ IN const Matrix* matrix = NULL,
+ IN BOOL removeSelfIntersects = TRUE)
+ {
+ GpMatrix* nativeMatrix = NULL;
+ if(matrix)
+ nativeMatrix = matrix->nativeMatrix;
+
+ return SetStatus(DllExports::GdipWidenPathWithMinimumResolutions(nativePath, pen->nativePen,
+ 0, 0, nativeMatrix, removeSelfIntersects));
+ }
+
+ /**
+ * Widen the path object
+ * This is equivalent to Widen() method except that
+ * The widths of the widened path are larger than the given
+ * minimum resolutions in x and y coordinates after the transform.
+ * This is usefull when widening a path with the limited device resolutions.
+ */
+
+ Status Widen(IN const Pen* pen,
+ IN REAL minXres,
+ IN REAL minYres,
+ IN const Matrix* matrix = NULL,
+ IN BOOL removeSelfIntersects = TRUE)
+ {
+ GpMatrix* nativeMatrix = NULL;
+ if(matrix)
+ nativeMatrix = matrix->nativeMatrix;
+
+ return SetStatus(DllExports::GdipWidenPathWithMinimumResolutions(nativePath, pen->nativePen,
+ minXres, minYres, nativeMatrix, removeSelfIntersects));
+ }
+
+#endif // DCR_USE_NEW_202903
+
+ Status Outline(
+ IN const Matrix *matrix = NULL,
+ IN REAL flatness = FlatnessDefault
+ )
+ {
+ GpMatrix* nativeMatrix = NULL;
+ if(matrix)
+ {
+ nativeMatrix = matrix->nativeMatrix;
+ }
+
+ return SetStatus(DllExports::GdipWindingModeOutline(
+ nativePath, nativeMatrix, flatness
+ ));
+ }
+
+ /**
+ * Warp the path object
+ * Once this is called, the resultant path is made of line segments and
+ * the original path information is lost.
+ * When matrix = NULL, the identity matrix is assumed.
+ */
+ Status Warp(IN const PointF* destPoints,
+ IN INT count,
+ IN const RectF& srcRect,
+ IN const Matrix* matrix = NULL,
+ IN WarpMode warpMode = WarpModePerspective,
+ IN REAL flatness = FlatnessDefault)
+ {
+ GpMatrix* nativeMatrix = NULL;
+ if(matrix)
+ nativeMatrix = matrix->nativeMatrix;
+
+ return SetStatus(DllExports::GdipWarpPath(
+ nativePath,
+ nativeMatrix,
+ destPoints,
+ count,
+ srcRect.X,
+ srcRect.Y,
+ srcRect.Width,
+ srcRect.Height,
+ warpMode,
+ flatness));
+ }
+
+ /**
+ * Return the number of points in the current path
+ */
+ INT GetPointCount() const
+ {
+ INT count = 0;
+
+ SetStatus(DllExports::GdipGetPointCount(nativePath, &count));
+
+ return count;
+ }
+
+ /**
+ * Return the path point type information
+ */
+ Status GetPathTypes(OUT BYTE* types,
+ IN INT count) const
+ {
+ return SetStatus(DllExports::GdipGetPathTypes(nativePath, types, count));
+ }
+
+ /**
+ * Return the path point coordinate information
+ * @notes Should there be PathData that contains types[] and points[]
+ * for get & set purposes.
+ */
+ Status GetPathPoints(OUT PointF* points,
+ IN INT count) const
+ {
+ return SetStatus(DllExports::GdipGetPathPoints(nativePath, points, count));
+ }
+
+ // integer version
+ Status GetPathPoints(OUT Point* points,
+ IN INT count) const
+ {
+ return SetStatus(DllExports::GdipGetPathPointsI(nativePath, points, count));
+ }
+
+ Status GetLastStatus() const
+ {
+ Status lastStatus = lastResult;
+ lastResult = Ok;
+
+ return lastStatus;
+ }
+
+ /**
+ * Hit testing operations
+ *
+ * inline implementation is in gdiplusgraphics.h.
+ */
+
+ BOOL IsVisible(IN const PointF& point,
+ IN const Graphics* g = NULL) const
+ {
+ return IsVisible(point.X, point.Y, g);
+ }
+
+ BOOL IsVisible(IN REAL x,
+ IN REAL y,
+ IN const Graphics* g = NULL) const;
+
+ BOOL IsVisible(IN const Point& point,
+ IN const Graphics* g = NULL) const
+ {
+ return IsVisible(point.X, point.Y, g);
+ }
+
+ BOOL IsVisible(IN INT x,
+ IN INT y,
+ IN const Graphics* g = NULL) const;
+
+ BOOL IsOutlineVisible(IN const PointF& point,
+ IN const Pen* pen,
+ IN const Graphics* g = NULL) const
+ {
+ return IsOutlineVisible(point.X, point.Y, pen, g);
+ }
+
+ BOOL IsOutlineVisible(IN REAL x,
+ IN REAL y,
+ IN const Pen* pen,
+ IN const Graphics* g = NULL) const;
+
+ BOOL IsOutlineVisible(IN const Point& point,
+ IN const Pen* pen,
+ IN const Graphics* g = NULL) const
+ {
+ return IsOutlineVisible(point.X, point.Y, pen, g);
+ }
+
+ BOOL IsOutlineVisible(IN INT x,
+ IN INT y,
+ IN const Pen* pen,
+ IN const Graphics* g = NULL) const;
+
+protected:
+
+ GraphicsPath(const GraphicsPath& path)
+ {
+ GpPath *clonepath = NULL;
+ SetStatus(DllExports::GdipClonePath(path.nativePath, &clonepath));
+ SetNativePath(clonepath);
+ }
+
+#ifdef DCR_USE_NEW_250932
+
+private:
+ GraphicsPath& operator=(const GraphicsPath &);
+protected:
+
+#else
+
+ GraphicsPath& operator=(const GraphicsPath& path)
+ {
+ path;
+ SetStatus(NotImplemented);
+ return *this;
+ }
+
+#endif
+
+ GraphicsPath(GpPath* nativePath)
+ {
+ lastResult = Ok;
+ SetNativePath(nativePath);
+ }
+
+ VOID SetNativePath(GpPath *nativePath)
+ {
+ this->nativePath = nativePath;
+ }
+
+ Status SetStatus(Status status) const
+ {
+ if (status != Ok)
+ return (lastResult = status);
+ else
+ return status;
+ }
+
+protected:
+ GpPath* nativePath;
+ mutable Status lastResult;
+};
+
+
+//--------------------------------------------------------------------------
+// GraphisPathIterator class
+//--------------------------------------------------------------------------
+
+class GraphicsPathIterator : public GdiplusBase
+{
+public:
+
+ GraphicsPathIterator(IN const GraphicsPath* path)
+ {
+ GpPath* nativePath = NULL;
+ if(path)
+ nativePath = path->nativePath;
+
+ GpPathIterator *iter = NULL;
+ lastResult = DllExports::GdipCreatePathIter(&iter, nativePath);
+ SetNativeIterator(iter);
+ }
+
+ ~GraphicsPathIterator()
+ {
+ DllExports::GdipDeletePathIter(nativeIterator);
+ }
+
+
+ INT NextSubpath(OUT INT* startIndex,
+ OUT INT* endIndex,
+ OUT BOOL* isClosed)
+ {
+ INT resultCount;
+
+ SetStatus(DllExports::GdipPathIterNextSubpath(nativeIterator,
+ &resultCount, startIndex, endIndex, isClosed));
+
+ return resultCount;
+ }
+
+
+ INT NextSubpath(IN const GraphicsPath* path,
+ OUT BOOL* isClosed)
+ {
+ GpPath* nativePath = NULL;
+
+ INT resultCount;
+
+ if(path)
+ nativePath= path->nativePath;
+
+ SetStatus(DllExports::GdipPathIterNextSubpathPath(nativeIterator,
+ &resultCount, nativePath, isClosed));
+
+ return resultCount;
+ }
+
+ INT NextPathType(OUT BYTE* pathType,
+ OUT INT* startIndex,
+ OUT INT* endIndex)
+ {
+ INT resultCount;
+
+ SetStatus(DllExports::GdipPathIterNextPathType(nativeIterator,
+ &resultCount, pathType, startIndex, endIndex));
+
+ return resultCount;
+ }
+
+ INT NextMarker(OUT INT* startIndex,
+ OUT INT* endIndex)
+ {
+ INT resultCount;
+
+ SetStatus(DllExports::GdipPathIterNextMarker(nativeIterator,
+ &resultCount, startIndex, endIndex));
+
+ return resultCount;
+ }
+
+
+ INT NextMarker(IN const GraphicsPath* path)
+ {
+ GpPath* nativePath = NULL;
+
+ INT resultCount;
+
+ if(path)
+ nativePath= path->nativePath;
+
+ SetStatus(DllExports::GdipPathIterNextMarkerPath(nativeIterator,
+ &resultCount, nativePath));
+
+ return resultCount;
+ }
+
+ INT GetCount() const
+ {
+ INT resultCount;
+
+ SetStatus(DllExports::GdipPathIterGetCount(nativeIterator, &resultCount));
+
+ return resultCount;
+ }
+
+ INT GetSubpathCount() const
+ {
+ INT resultCount;
+
+ SetStatus(DllExports::GdipPathIterGetSubpathCount(nativeIterator, &resultCount));
+
+ return resultCount;
+ }
+
+ BOOL HasCurve() const
+ {
+ BOOL hasCurve;
+
+ SetStatus(DllExports::GdipPathIterHasCurve(nativeIterator, &hasCurve));
+
+ return hasCurve;
+ }
+
+ VOID Rewind()
+ {
+ SetStatus(DllExports::GdipPathIterRewind(nativeIterator));
+ }
+
+ INT Enumerate(OUT PointF *points,
+ OUT BYTE *types,
+ IN INT count)
+ {
+ INT resultCount;
+
+ SetStatus(DllExports::GdipPathIterEnumerate(nativeIterator,
+ &resultCount, points, types, count));
+
+ return resultCount;
+ }
+
+ INT CopyData(OUT PointF* points,
+ OUT BYTE* types,
+ IN INT startIndex,
+ IN INT endIndex)
+ {
+ INT resultCount;
+
+ SetStatus(DllExports::GdipPathIterCopyData(nativeIterator,
+ &resultCount, points, types, startIndex, endIndex));
+
+ return resultCount;
+ }
+
+ Status GetLastStatus() const
+ {
+ Status lastStatus = lastResult;
+ lastResult = Ok;
+
+ return lastStatus;
+ }
+
+#ifdef DCR_USE_NEW_250932
+
+private:
+ GraphicsPathIterator(const GraphicsPathIterator &);
+ GraphicsPathIterator& operator=(const GraphicsPathIterator &);
+
+#endif
+
+protected:
+ VOID SetNativeIterator(GpPathIterator *nativeIterator)
+ {
+ this->nativeIterator = nativeIterator;
+ }
+
+ Status SetStatus(Status status) const
+ {
+ if (status != Ok)
+ return (lastResult = status);
+ else
+ return status;
+ }
+
+protected:
+ GpPathIterator* nativeIterator;
+ mutable Status lastResult;
+};
+
+
+//--------------------------------------------------------------------------
+// Represent polygon gradient brush object
+//--------------------------------------------------------------------------
+
+class PathGradientBrush : public Brush
+{
+public:
+ friend class Pen;
+
+ PathGradientBrush(
+ IN const PointF* points,
+ IN INT count,
+ IN WrapMode wrapMode = WrapModeClamp)
+ {
+ GpPathGradient *brush = NULL;
+
+ lastResult = DllExports::GdipCreatePathGradient(
+ points, count,
+ wrapMode, &brush);
+ SetNativeBrush(brush);
+ }
+
+ PathGradientBrush(
+ IN const Point* points,
+ IN INT count,
+ IN WrapMode wrapMode = WrapModeClamp)
+ {
+ GpPathGradient *brush = NULL;
+
+ lastResult = DllExports::GdipCreatePathGradientI(
+ points, count,
+ wrapMode, &brush);
+
+ SetNativeBrush(brush);
+ }
+
+ PathGradientBrush(
+ IN const GraphicsPath* path
+ )
+ {
+ GpPathGradient *brush = NULL;
+
+ lastResult = DllExports::GdipCreatePathGradientFromPath(
+ path->nativePath, &brush);
+ SetNativeBrush(brush);
+ }
+
+ // Get/set colors
+
+ Status GetCenterColor(OUT Color* color) const
+ {
+ ARGB argb;
+
+ if (color == NULL)
+ {
+ return SetStatus(InvalidParameter);
+ }
+
+ SetStatus(DllExports::GdipGetPathGradientCenterColor(
+ (GpPathGradient*) nativeBrush, &argb));
+
+ color->SetValue(argb);
+
+ return lastResult;
+ }
+
+ Status SetCenterColor(IN const Color& color)
+ {
+ SetStatus(DllExports::GdipSetPathGradientCenterColor(
+ (GpPathGradient*) nativeBrush,
+ color.GetValue()));
+
+ return lastResult;
+ }
+
+ INT GetPointCount() const
+ {
+ INT count;
+
+ SetStatus(DllExports::GdipGetPathGradientPointCount(
+ (GpPathGradient*) nativeBrush, &count));
+
+ return count;
+ }
+
+ INT GetSurroundColorCount() const
+ {
+ INT count;
+
+ SetStatus(DllExports::GdipGetPathGradientSurroundColorCount(
+ (GpPathGradient*) nativeBrush, &count));
+
+ return count;
+ }
+
+ Status GetSurroundColors(OUT Color* colors,
+ IN OUT INT* count) const
+ {
+ if(colors == NULL || count == NULL)
+ {
+ return SetStatus(InvalidParameter);
+ }
+
+ INT count1;
+
+ SetStatus(DllExports::GdipGetPathGradientSurroundColorCount(
+ (GpPathGradient*) nativeBrush, &count1));
+
+ if(lastResult != Ok)
+ return lastResult;
+
+ if((*count < count1) || (count1 <= 0))
+ return SetStatus(InsufficientBuffer);
+
+ ARGB* argbs = (ARGB*) new ARGB[count1];
+ if(argbs == NULL)
+ return SetStatus(OutOfMemory);
+
+ SetStatus(DllExports::GdipGetPathGradientSurroundColorsWithCount(
+ (GpPathGradient*)nativeBrush, argbs, &count1));
+
+ if(lastResult == Ok)
+ {
+ for(INT i = 0; i < count1; i++)
+ {
+ colors[i].SetValue(argbs[i]);
+ }
+ *count = count1;
+ }
+
+ delete [] argbs;
+ return lastResult;
+ }
+
+ Status SetSurroundColors(IN const Color* colors,
+ IN OUT INT* count)
+ {
+ if(colors == NULL || count == NULL)
+ {
+ return SetStatus(InvalidParameter);
+ }
+
+ INT count1 = GetPointCount();
+
+ if((*count > count1) || (count1 <= 0))
+ return SetStatus(InvalidParameter);
+
+ count1 = *count;
+
+ ARGB* argbs = (ARGB*) new ARGB[count1];
+ if(argbs == NULL)
+ return SetStatus(OutOfMemory);
+
+ for(INT i = 0; i < count1; i++)
+ {
+ argbs[i] = colors[i].GetValue();
+ }
+
+ SetStatus(DllExports::GdipSetPathGradientSurroundColorsWithCount(
+ (GpPathGradient*)nativeBrush, argbs, &count1));
+
+ if(lastResult == Ok)
+ *count = count1;
+
+ delete [] argbs;
+
+ return lastResult;
+ }
+
+ Status GetGraphicsPath(OUT GraphicsPath* path) const
+ {
+ if(path == NULL)
+ return SetStatus(InvalidParameter);
+
+ return SetStatus(DllExports::GdipGetPathGradientPath(
+ (GpPathGradient*)nativeBrush, path->nativePath));
+ }
+
+ Status SetGraphicsPath(IN const GraphicsPath* path)
+ {
+ if(path == NULL)
+ return SetStatus(InvalidParameter);
+
+ return SetStatus(DllExports::GdipSetPathGradientPath(
+ (GpPathGradient*)nativeBrush, path->nativePath));
+ }
+
+ Status GetCenterPoint(OUT PointF* point) const
+ {
+ return SetStatus(DllExports::GdipGetPathGradientCenterPoint(
+ (GpPathGradient*)nativeBrush,
+ point));
+ }
+
+
+ Status GetCenterPoint(OUT Point* point) const
+ {
+ return SetStatus(DllExports::GdipGetPathGradientCenterPointI(
+ (GpPathGradient*)nativeBrush,
+ point));
+ }
+
+ Status SetCenterPoint(IN const PointF& point)
+ {
+ return SetStatus(DllExports::GdipSetPathGradientCenterPoint(
+ (GpPathGradient*)nativeBrush,
+ &point));
+ }
+
+ Status SetCenterPoint(IN const Point& point)
+ {
+ return SetStatus(DllExports::GdipSetPathGradientCenterPointI(
+ (GpPathGradient*)nativeBrush,
+ &point));
+ }
+
+ Status GetRectangle(OUT RectF* rect) const
+ {
+ return SetStatus(DllExports::GdipGetPathGradientRect(
+ (GpPathGradient*)nativeBrush, rect));
+ }
+
+ Status GetRectangle(OUT Rect* rect) const
+ {
+ return SetStatus(DllExports::GdipGetPathGradientRectI(
+ (GpPathGradient*)nativeBrush, rect));
+ }
+
+ // Gamma correction.
+
+ Status SetGammaCorrection(IN BOOL useGammaCorrection)
+ {
+ return SetStatus(DllExports::GdipSetPathGradientGammaCorrection(
+ (GpPathGradient*)nativeBrush, useGammaCorrection));
+ }
+
+ BOOL GetGammaCorrection() const
+ {
+ BOOL useGammaCorrection;
+
+ SetStatus(DllExports::GdipGetPathGradientGammaCorrection(
+ (GpPathGradient*)nativeBrush, &useGammaCorrection));
+
+ return useGammaCorrection;
+ }
+
+ INT GetBlendCount() const
+ {
+ INT count = 0;
+
+ SetStatus(DllExports::GdipGetPathGradientBlendCount(
+ (GpPathGradient*) nativeBrush, &count));
+
+ return count;
+ }
+
+ Status GetBlend(OUT REAL* blendFactors,
+ OUT REAL* blendPositions,
+ IN INT count) const
+ {
+ return SetStatus(DllExports::GdipGetPathGradientBlend(
+ (GpPathGradient*)nativeBrush,
+ blendFactors, blendPositions, count));
+ }
+
+ Status SetBlend(IN const REAL* blendFactors,
+ IN const REAL* blendPositions,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipSetPathGradientBlend(
+ (GpPathGradient*)nativeBrush,
+ blendFactors, blendPositions, count));
+ }
+
+ INT GetInterpolationColorCount() const
+ {
+ INT count = 0;
+
+ SetStatus(DllExports::GdipGetPathGradientPresetBlendCount(
+ (GpPathGradient*) nativeBrush, &count));
+
+ return count;
+ }
+
+ Status SetInterpolationColors(IN const Color* presetColors,
+ IN const REAL* blendPositions,
+ IN INT count)
+ {
+ if ((count <= 0) || !presetColors)
+ {
+ return SetStatus(InvalidParameter);
+ }
+
+ ARGB* argbs = (ARGB*) new ARGB[count];
+ if(argbs)
+ {
+ for(INT i = 0; i < count; i++)
+ {
+ argbs[i] = presetColors[i].GetValue();
+ }
+
+ Status status = SetStatus(DllExports::GdipSetPathGradientPresetBlend(
+ (GpPathGradient*) nativeBrush,
+ argbs,
+ blendPositions,
+ count));
+ delete[] argbs;
+ return status;
+ }
+ else
+ {
+ return SetStatus(OutOfMemory);
+ }
+ }
+
+ Status GetInterpolationColors(OUT Color* presetColors,
+ OUT REAL* blendPositions,
+ IN INT count) const
+ {
+ if ((count <= 0) || !presetColors)
+ {
+ return SetStatus(InvalidParameter);
+ }
+
+ ARGB* argbs = (ARGB*) new ARGB[count];
+
+ if (!argbs)
+ {
+ return SetStatus(OutOfMemory);
+ }
+
+ GpStatus status = SetStatus(DllExports::GdipGetPathGradientPresetBlend(
+ (GpPathGradient*)nativeBrush,
+ argbs,
+ blendPositions,
+ count));
+
+ for(INT i = 0; i < count; i++)
+ {
+ presetColors[i] = Color(argbs[i]);
+ }
+ delete [] argbs;
+
+ return status;
+ }
+
+ Status SetBlendBellShape(IN REAL focus,
+ IN REAL scale = 1.0)
+ {
+ return SetStatus(DllExports::GdipSetPathGradientSigmaBlend(
+ (GpPathGradient*)nativeBrush, focus, scale));
+ }
+
+ #ifdef DCR_USE_NEW_145135
+ Status SetBlendTriangularShape(
+ IN REAL focus,
+ IN REAL scale = 1.0
+ )
+ #else
+ Status SetBlendTrianglarShape(IN REAL focus,
+ IN REAL scale = 1.0)
+ #endif
+ {
+ return SetStatus(DllExports::GdipSetPathGradientLinearBlend(
+ (GpPathGradient*)nativeBrush, focus, scale));
+ }
+
+ /**
+ * Get/set brush transform
+ */
+ Status GetTransform(OUT Matrix *matrix) const
+ {
+ return SetStatus(DllExports::GdipGetPathGradientTransform(
+ (GpPathGradient*) nativeBrush, matrix->nativeMatrix));
+ }
+
+ Status SetTransform(IN const Matrix* matrix)
+ {
+ return SetStatus(DllExports::GdipSetPathGradientTransform(
+ (GpPathGradient*) nativeBrush, matrix->nativeMatrix));
+ }
+
+ Status ResetTransform()
+ {
+ return SetStatus(DllExports::GdipResetPathGradientTransform((GpPathGradient*)nativeBrush));
+ }
+
+ Status MultiplyTransform(IN const Matrix* matrix,
+ IN MatrixOrder order = MatrixOrderPrepend)
+ {
+ return SetStatus(DllExports::GdipMultiplyPathGradientTransform((GpPathGradient*)nativeBrush,
+ matrix->nativeMatrix,
+ order));
+ }
+
+ Status TranslateTransform(IN REAL dx,
+ IN REAL dy,
+ IN MatrixOrder order = MatrixOrderPrepend)
+ {
+ return SetStatus(DllExports::GdipTranslatePathGradientTransform((GpPathGradient*)nativeBrush,
+ dx, dy, order));
+ }
+
+ Status ScaleTransform(IN REAL sx,
+ IN REAL sy,
+ IN MatrixOrder order = MatrixOrderPrepend)
+ {
+ return SetStatus(DllExports::GdipScalePathGradientTransform((GpPathGradient*)nativeBrush,
+ sx, sy, order));
+ }
+
+ Status RotateTransform(IN REAL angle,
+ IN MatrixOrder order = MatrixOrderPrepend)
+ {
+ return SetStatus(DllExports::GdipRotatePathGradientTransform((GpPathGradient*)nativeBrush,
+ angle, order));
+ }
+
+ /**
+ * Get/set brush focus scales
+ */
+ Status GetFocusScales(OUT REAL* xScale,
+ OUT REAL* yScale) const
+ {
+ return SetStatus(DllExports::GdipGetPathGradientFocusScales(
+ (GpPathGradient*) nativeBrush, xScale, yScale));
+ }
+
+ Status SetFocusScales(IN REAL xScale,
+ IN REAL yScale)
+ {
+ return SetStatus(DllExports::GdipSetPathGradientFocusScales(
+ (GpPathGradient*) nativeBrush, xScale, yScale));
+ }
+
+ /**
+ * Get/set brush wrapping mode
+ */
+ WrapMode GetWrapMode() const
+ {
+ WrapMode wrapMode;
+
+ SetStatus(DllExports::GdipGetPathGradientWrapMode(
+ (GpPathGradient*) nativeBrush, &wrapMode));
+
+ return wrapMode;
+ }
+
+ Status SetWrapMode(IN WrapMode wrapMode)
+ {
+ return SetStatus(DllExports::GdipSetPathGradientWrapMode(
+ (GpPathGradient*) nativeBrush, wrapMode));
+ }
+
+#ifdef DCR_USE_NEW_250932
+
+private:
+ PathGradientBrush(const PathGradientBrush &);
+ PathGradientBrush& operator=(const PathGradientBrush &);
+
+#endif
+
+protected:
+
+ PathGradientBrush()
+ {
+ }
+};
+
+
+#endif // !_GRAPHICSPATH_HPP
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusPen.h b/core/src/fxge/Microsoft SDK/include/GdiPlusPen.h
index 20653db36e..c5776ab639 100644
--- a/core/src/fxge/Microsoft SDK/include/GdiPlusPen.h
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusPen.h
@@ -1,519 +1,519 @@
-/**************************************************************************\
-*
-* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
-*
-* Module Name:
-*
-* GdiplusPen.h
-*
-* Abstract:
-*
-* Pen API related declarations
-*
-\**************************************************************************/
-#ifndef _GDIPLUSPEN_H
-#define _GDIPLUSPEN_H
-
-//--------------------------------------------------------------------------
-// class for various pen types
-//--------------------------------------------------------------------------
-
-class Pen : public GdiplusBase
-{
-public:
- friend class GraphicsPath;
- friend class Graphics;
-
- // abstract Clone() can't be implemented here because it can't
- // new an object with pure virtual functions
-
- // Constructors
-
- Pen(IN const Color& color,
- IN REAL width = 1.0f)
- {
- Unit unit = UnitWorld;
- nativePen = NULL;
- lastResult = DllExports::GdipCreatePen1(color.GetValue(),
- width, unit, &nativePen);
- }
-
- Pen(IN const Brush* brush,
- IN REAL width = 1.0f)
- {
- Unit unit = UnitWorld;
- nativePen = NULL;
- lastResult = DllExports::GdipCreatePen2(brush->nativeBrush,
- width, unit, &nativePen);
- }
-
- ~Pen()
- {
- DllExports::GdipDeletePen(nativePen);
- }
-
- Pen* Clone() const
- {
- GpPen *clonePen = NULL;
-
- lastResult = DllExports::GdipClonePen(nativePen, &clonePen);
-
- return new Pen(clonePen, lastResult);
- }
-
- Status SetWidth(IN REAL width)
- {
- return SetStatus(DllExports::GdipSetPenWidth(nativePen, width));
- }
-
- REAL GetWidth() const
- {
- REAL width;
-
- SetStatus(DllExports::GdipGetPenWidth(nativePen, &width));
-
- return width;
- }
-
- // Set/get line caps: start, end, and dash
-
- // Line cap and join APIs by using LineCap and LineJoin enums.
-
- #ifdef DCR_USE_NEW_197819
- Status SetLineCap(IN LineCap startCap,
- IN LineCap endCap,
- IN DashCap dashCap)
- {
- return SetStatus(DllExports::GdipSetPenLineCap197819(nativePen,
- startCap, endCap, dashCap));
- }
- #else
- Status SetLineCap(IN LineCap startCap,
- IN LineCap endCap,
- IN LineCap dashCap)
- {
- return SetStatus(DllExports::GdipSetPenLineCap(nativePen,
- startCap, endCap, dashCap));
- }
- #endif // DCR_USE_NEW_197819
-
- Status SetStartCap(IN LineCap startCap)
- {
- return SetStatus(DllExports::GdipSetPenStartCap(nativePen, startCap));
- }
-
- Status SetEndCap(IN LineCap endCap)
- {
- return SetStatus(DllExports::GdipSetPenEndCap(nativePen, endCap));
- }
-
- #ifdef DCR_USE_NEW_197819
- Status SetDashCap(IN DashCap dashCap)
- {
- return SetStatus(DllExports::GdipSetPenDashCap197819(nativePen,
- dashCap));
- }
- #else
- Status SetDashCap(IN LineCap dashCap)
- {
- return SetStatus(DllExports::GdipSetPenDashCap(nativePen, dashCap));
- }
- #endif // DCR_USE_NEW_197819
-
- LineCap GetStartCap() const
- {
- LineCap startCap;
-
- SetStatus(DllExports::GdipGetPenStartCap(nativePen, &startCap));
-
- return startCap;
- }
-
- LineCap GetEndCap() const
- {
- LineCap endCap;
-
- SetStatus(DllExports::GdipGetPenEndCap(nativePen, &endCap));
-
- return endCap;
- }
-
- #ifdef DCR_USE_NEW_197819
- DashCap GetDashCap() const
- {
- DashCap dashCap;
-
- SetStatus(DllExports::GdipGetPenDashCap197819(nativePen,
- &dashCap));
-
- return dashCap;
- }
- #else
- LineCap GetDashCap() const
- {
- LineCap dashCap;
-
- SetStatus(DllExports::GdipGetPenDashCap(nativePen, &dashCap));
-
- return dashCap;
- }
- #endif // DCR_USE_NEW_197819
-
-
- // Set/get line join
-
- Status SetLineJoin(IN LineJoin lineJoin)
- {
- return SetStatus(DllExports::GdipSetPenLineJoin(nativePen, lineJoin));
- }
-
- LineJoin GetLineJoin() const
- {
- LineJoin lineJoin;
-
- SetStatus(DllExports::GdipGetPenLineJoin(nativePen, &lineJoin));
-
- return lineJoin;
- }
-
- Status SetCustomStartCap(IN const CustomLineCap* customCap)
- {
- GpCustomLineCap* nativeCap = NULL;
- if(customCap)
- nativeCap = customCap->nativeCap;
-
- return SetStatus(DllExports::GdipSetPenCustomStartCap(nativePen, nativeCap));
- }
-
- Status GetCustomStartCap(OUT CustomLineCap* customCap) const
- {
- if(!customCap)
- return SetStatus(InvalidParameter);
-
- return SetStatus(DllExports::GdipGetPenCustomStartCap(nativePen, &(customCap->nativeCap)));
- }
-
- Status SetCustomEndCap(IN const CustomLineCap* customCap)
- {
- GpCustomLineCap* nativeCap = NULL;
- if(customCap)
- nativeCap = customCap->nativeCap;
-
- return SetStatus(DllExports::GdipSetPenCustomEndCap(nativePen, nativeCap));
- }
-
- Status GetCustomEndCap(OUT CustomLineCap* customCap) const
- {
- if(!customCap)
- return SetStatus(InvalidParameter);
-
- return SetStatus(DllExports::GdipGetPenCustomEndCap(nativePen, &(customCap->nativeCap)));
- }
-
- Status SetMiterLimit(IN REAL miterLimit)
- {
- return SetStatus(DllExports::GdipSetPenMiterLimit(nativePen, miterLimit));
- }
-
- REAL GetMiterLimit() const
- {
- REAL miterLimit;
-
- SetStatus(DllExports::GdipGetPenMiterLimit(nativePen, &miterLimit));
-
- return miterLimit;
- }
-
- // Set/get pen mode
- Status SetAlignment(IN PenAlignment penAlignment)
- {
- return SetStatus(DllExports::GdipSetPenMode(nativePen, penAlignment));
- }
-
- PenAlignment GetAlignment() const
- {
- PenAlignment penAlignment;
-
- SetStatus(DllExports::GdipGetPenMode(nativePen, &penAlignment));
-
- return penAlignment;
- }
-
- // Set/get pen transform
- Status SetTransform(IN const Matrix* matrix)
- {
- return SetStatus(DllExports::GdipSetPenTransform(nativePen,
- matrix->nativeMatrix));
- }
-
- Status GetTransform(OUT Matrix* matrix) const
- {
- return SetStatus(DllExports::GdipGetPenTransform(nativePen, matrix->nativeMatrix));
- }
-
- Status ResetTransform()
- {
- return SetStatus(DllExports::GdipResetPenTransform(nativePen));
- }
-
- Status MultiplyTransform(IN const Matrix* matrix,
- IN MatrixOrder order = MatrixOrderPrepend)
- {
- return SetStatus(DllExports::GdipMultiplyPenTransform(nativePen,
- matrix->nativeMatrix,
- order));
- }
-
- Status TranslateTransform(IN REAL dx,
- IN REAL dy,
- IN MatrixOrder order = MatrixOrderPrepend)
- {
- return SetStatus(DllExports::GdipTranslatePenTransform(nativePen,
- dx, dy, order));
- }
-
- Status ScaleTransform(IN REAL sx,
- IN REAL sy,
- IN MatrixOrder order = MatrixOrderPrepend)
- {
- return SetStatus(DllExports::GdipScalePenTransform(nativePen,
- sx, sy, order));
- }
-
- Status RotateTransform(IN REAL angle,
- IN MatrixOrder order = MatrixOrderPrepend)
- {
- return SetStatus(DllExports::GdipRotatePenTransform(nativePen,
- angle, order));
- }
-
- PenType GetPenType() const
- {
- PenType type;
- SetStatus(DllExports::GdipGetPenFillType(nativePen, &type));
-
- return type;
- }
-
- Status SetColor(IN const Color& color)
- {
- return SetStatus(DllExports::GdipSetPenColor(nativePen,
- color.GetValue()));
- }
-
- Status SetBrush(IN const Brush* brush)
- {
- return SetStatus(DllExports::GdipSetPenBrushFill(nativePen,
- brush->nativeBrush));
- }
-
- Status GetColor(OUT Color* color) const
- {
- if (color == NULL)
- {
- return SetStatus(InvalidParameter);
- }
-
- PenType type = GetPenType();
-
- if (type != PenTypeSolidColor)
- {
- return WrongState;
- }
-
- ARGB argb;
-
- SetStatus(DllExports::GdipGetPenColor(nativePen,
- &argb));
- if (lastResult == Ok)
- {
- color->SetValue(argb);
- }
-
- return lastResult;
- }
-
- Brush* GetBrush() const
- {
- PenType type = GetPenType();
-
- Brush* brush = NULL;
-
- switch(type)
- {
- case PenTypeSolidColor:
- brush = new SolidBrush();
- break;
-
- case PenTypeHatchFill:
- brush = new HatchBrush();
- break;
-
- case PenTypeTextureFill:
- brush = new TextureBrush();
- break;
-
- case PenTypePathGradient:
- brush = new Brush();
- break;
-
- case PenTypeLinearGradient:
- brush = new LinearGradientBrush();
- break;
-
- default:
- break;
- }
-
- if(brush)
- {
- GpBrush* nativeBrush;
-
- SetStatus(DllExports::GdipGetPenBrushFill(nativePen, &nativeBrush));
- brush->SetNativeBrush(nativeBrush);
- }
-
- return brush;
- }
-
- DashStyle GetDashStyle() const
- {
- DashStyle dashStyle;
-
- SetStatus(DllExports::GdipGetPenDashStyle(nativePen, &dashStyle));
-
- return dashStyle;
- }
-
- Status SetDashStyle(IN DashStyle dashStyle)
- {
- return SetStatus(DllExports::GdipSetPenDashStyle(nativePen, dashStyle));
- }
-
- REAL GetDashOffset() const
- {
- REAL dashOffset;
-
- SetStatus(DllExports::GdipGetPenDashOffset(nativePen, &dashOffset));
-
- return dashOffset;
- }
-
- Status SetDashOffset(IN REAL dashOffset)
- {
- return SetStatus(DllExports::GdipSetPenDashOffset(nativePen, dashOffset));
- }
-
- Status SetDashPattern(IN const REAL* dashArray, IN INT count)
- {
- return SetStatus(DllExports::GdipSetPenDashArray(nativePen, dashArray,
- count));
- }
-
- INT GetDashPatternCount() const
- {
- INT count = 0;
-
- SetStatus(DllExports::GdipGetPenDashCount(nativePen, &count));
-
- return count;
- }
-
- Status GetDashPattern(OUT REAL* dashArray,
- IN INT count) const
- {
- if (dashArray == NULL || count <= 0)
- return SetStatus(InvalidParameter);
-
- return SetStatus(DllExports::GdipGetPenDashArray(nativePen,
- dashArray,
- count));
- }
-
- Status SetCompoundArray(IN const REAL* compoundArray,
- IN INT count)
- {
- return SetStatus(DllExports::GdipSetPenCompoundArray(nativePen, compoundArray,
- count));
- }
-
- INT GetCompoundArrayCount() const
- {
- INT count = 0;
-
- SetStatus(DllExports::GdipGetPenCompoundCount(nativePen, &count));
-
- return count;
- }
-
- Status GetCompoundArray(OUT REAL* compoundArray,
- IN INT count) const
- {
- if (compoundArray == NULL || count <= 0)
- return SetStatus(InvalidParameter);
-
- return SetStatus(DllExports::GdipGetPenCompoundArray(nativePen,
- compoundArray,
- count));
- }
-
- Status GetLastStatus() const
- {
- Status lastStatus = lastResult;
- lastResult = Ok;
-
- return lastStatus;
- }
-
-protected:
-
-#ifdef DCR_USE_NEW_250932
-
-private:
- Pen(const Pen &);
- Pen& operator=(const Pen &);
-protected:
-
-#else
-
- Pen(const Pen& pen)
- {
- pen;
- SetStatus(NotImplemented);
- SetNativePen(NULL);
- }
-
- Pen& operator=(const Pen& pen)
- {
- pen;
- SetStatus(NotImplemented);
- return *this;
- }
-
-#endif
-
- Pen(GpPen* nativePen, Status status)
- {
- lastResult = status;
- SetNativePen(nativePen);
- }
-
- VOID SetNativePen(GpPen* nativePen)
- {
- this->nativePen = nativePen;
- }
-
- Status SetStatus(Status status) const
- {
- if (status != Ok)
- return (lastResult = status);
- else
- return status;
- }
-
-protected:
- GpPen* nativePen;
- mutable Status lastResult;
-};
-
-#endif
+/**************************************************************************\
+*
+* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
+*
+* Module Name:
+*
+* GdiplusPen.h
+*
+* Abstract:
+*
+* Pen API related declarations
+*
+\**************************************************************************/
+#ifndef _GDIPLUSPEN_H
+#define _GDIPLUSPEN_H
+
+//--------------------------------------------------------------------------
+// class for various pen types
+//--------------------------------------------------------------------------
+
+class Pen : public GdiplusBase
+{
+public:
+ friend class GraphicsPath;
+ friend class Graphics;
+
+ // abstract Clone() can't be implemented here because it can't
+ // new an object with pure virtual functions
+
+ // Constructors
+
+ Pen(IN const Color& color,
+ IN REAL width = 1.0f)
+ {
+ Unit unit = UnitWorld;
+ nativePen = NULL;
+ lastResult = DllExports::GdipCreatePen1(color.GetValue(),
+ width, unit, &nativePen);
+ }
+
+ Pen(IN const Brush* brush,
+ IN REAL width = 1.0f)
+ {
+ Unit unit = UnitWorld;
+ nativePen = NULL;
+ lastResult = DllExports::GdipCreatePen2(brush->nativeBrush,
+ width, unit, &nativePen);
+ }
+
+ ~Pen()
+ {
+ DllExports::GdipDeletePen(nativePen);
+ }
+
+ Pen* Clone() const
+ {
+ GpPen *clonePen = NULL;
+
+ lastResult = DllExports::GdipClonePen(nativePen, &clonePen);
+
+ return new Pen(clonePen, lastResult);
+ }
+
+ Status SetWidth(IN REAL width)
+ {
+ return SetStatus(DllExports::GdipSetPenWidth(nativePen, width));
+ }
+
+ REAL GetWidth() const
+ {
+ REAL width;
+
+ SetStatus(DllExports::GdipGetPenWidth(nativePen, &width));
+
+ return width;
+ }
+
+ // Set/get line caps: start, end, and dash
+
+ // Line cap and join APIs by using LineCap and LineJoin enums.
+
+ #ifdef DCR_USE_NEW_197819
+ Status SetLineCap(IN LineCap startCap,
+ IN LineCap endCap,
+ IN DashCap dashCap)
+ {
+ return SetStatus(DllExports::GdipSetPenLineCap197819(nativePen,
+ startCap, endCap, dashCap));
+ }
+ #else
+ Status SetLineCap(IN LineCap startCap,
+ IN LineCap endCap,
+ IN LineCap dashCap)
+ {
+ return SetStatus(DllExports::GdipSetPenLineCap(nativePen,
+ startCap, endCap, dashCap));
+ }
+ #endif // DCR_USE_NEW_197819
+
+ Status SetStartCap(IN LineCap startCap)
+ {
+ return SetStatus(DllExports::GdipSetPenStartCap(nativePen, startCap));
+ }
+
+ Status SetEndCap(IN LineCap endCap)
+ {
+ return SetStatus(DllExports::GdipSetPenEndCap(nativePen, endCap));
+ }
+
+ #ifdef DCR_USE_NEW_197819
+ Status SetDashCap(IN DashCap dashCap)
+ {
+ return SetStatus(DllExports::GdipSetPenDashCap197819(nativePen,
+ dashCap));
+ }
+ #else
+ Status SetDashCap(IN LineCap dashCap)
+ {
+ return SetStatus(DllExports::GdipSetPenDashCap(nativePen, dashCap));
+ }
+ #endif // DCR_USE_NEW_197819
+
+ LineCap GetStartCap() const
+ {
+ LineCap startCap;
+
+ SetStatus(DllExports::GdipGetPenStartCap(nativePen, &startCap));
+
+ return startCap;
+ }
+
+ LineCap GetEndCap() const
+ {
+ LineCap endCap;
+
+ SetStatus(DllExports::GdipGetPenEndCap(nativePen, &endCap));
+
+ return endCap;
+ }
+
+ #ifdef DCR_USE_NEW_197819
+ DashCap GetDashCap() const
+ {
+ DashCap dashCap;
+
+ SetStatus(DllExports::GdipGetPenDashCap197819(nativePen,
+ &dashCap));
+
+ return dashCap;
+ }
+ #else
+ LineCap GetDashCap() const
+ {
+ LineCap dashCap;
+
+ SetStatus(DllExports::GdipGetPenDashCap(nativePen, &dashCap));
+
+ return dashCap;
+ }
+ #endif // DCR_USE_NEW_197819
+
+
+ // Set/get line join
+
+ Status SetLineJoin(IN LineJoin lineJoin)
+ {
+ return SetStatus(DllExports::GdipSetPenLineJoin(nativePen, lineJoin));
+ }
+
+ LineJoin GetLineJoin() const
+ {
+ LineJoin lineJoin;
+
+ SetStatus(DllExports::GdipGetPenLineJoin(nativePen, &lineJoin));
+
+ return lineJoin;
+ }
+
+ Status SetCustomStartCap(IN const CustomLineCap* customCap)
+ {
+ GpCustomLineCap* nativeCap = NULL;
+ if(customCap)
+ nativeCap = customCap->nativeCap;
+
+ return SetStatus(DllExports::GdipSetPenCustomStartCap(nativePen, nativeCap));
+ }
+
+ Status GetCustomStartCap(OUT CustomLineCap* customCap) const
+ {
+ if(!customCap)
+ return SetStatus(InvalidParameter);
+
+ return SetStatus(DllExports::GdipGetPenCustomStartCap(nativePen, &(customCap->nativeCap)));
+ }
+
+ Status SetCustomEndCap(IN const CustomLineCap* customCap)
+ {
+ GpCustomLineCap* nativeCap = NULL;
+ if(customCap)
+ nativeCap = customCap->nativeCap;
+
+ return SetStatus(DllExports::GdipSetPenCustomEndCap(nativePen, nativeCap));
+ }
+
+ Status GetCustomEndCap(OUT CustomLineCap* customCap) const
+ {
+ if(!customCap)
+ return SetStatus(InvalidParameter);
+
+ return SetStatus(DllExports::GdipGetPenCustomEndCap(nativePen, &(customCap->nativeCap)));
+ }
+
+ Status SetMiterLimit(IN REAL miterLimit)
+ {
+ return SetStatus(DllExports::GdipSetPenMiterLimit(nativePen, miterLimit));
+ }
+
+ REAL GetMiterLimit() const
+ {
+ REAL miterLimit;
+
+ SetStatus(DllExports::GdipGetPenMiterLimit(nativePen, &miterLimit));
+
+ return miterLimit;
+ }
+
+ // Set/get pen mode
+ Status SetAlignment(IN PenAlignment penAlignment)
+ {
+ return SetStatus(DllExports::GdipSetPenMode(nativePen, penAlignment));
+ }
+
+ PenAlignment GetAlignment() const
+ {
+ PenAlignment penAlignment;
+
+ SetStatus(DllExports::GdipGetPenMode(nativePen, &penAlignment));
+
+ return penAlignment;
+ }
+
+ // Set/get pen transform
+ Status SetTransform(IN const Matrix* matrix)
+ {
+ return SetStatus(DllExports::GdipSetPenTransform(nativePen,
+ matrix->nativeMatrix));
+ }
+
+ Status GetTransform(OUT Matrix* matrix) const
+ {
+ return SetStatus(DllExports::GdipGetPenTransform(nativePen, matrix->nativeMatrix));
+ }
+
+ Status ResetTransform()
+ {
+ return SetStatus(DllExports::GdipResetPenTransform(nativePen));
+ }
+
+ Status MultiplyTransform(IN const Matrix* matrix,
+ IN MatrixOrder order = MatrixOrderPrepend)
+ {
+ return SetStatus(DllExports::GdipMultiplyPenTransform(nativePen,
+ matrix->nativeMatrix,
+ order));
+ }
+
+ Status TranslateTransform(IN REAL dx,
+ IN REAL dy,
+ IN MatrixOrder order = MatrixOrderPrepend)
+ {
+ return SetStatus(DllExports::GdipTranslatePenTransform(nativePen,
+ dx, dy, order));
+ }
+
+ Status ScaleTransform(IN REAL sx,
+ IN REAL sy,
+ IN MatrixOrder order = MatrixOrderPrepend)
+ {
+ return SetStatus(DllExports::GdipScalePenTransform(nativePen,
+ sx, sy, order));
+ }
+
+ Status RotateTransform(IN REAL angle,
+ IN MatrixOrder order = MatrixOrderPrepend)
+ {
+ return SetStatus(DllExports::GdipRotatePenTransform(nativePen,
+ angle, order));
+ }
+
+ PenType GetPenType() const
+ {
+ PenType type;
+ SetStatus(DllExports::GdipGetPenFillType(nativePen, &type));
+
+ return type;
+ }
+
+ Status SetColor(IN const Color& color)
+ {
+ return SetStatus(DllExports::GdipSetPenColor(nativePen,
+ color.GetValue()));
+ }
+
+ Status SetBrush(IN const Brush* brush)
+ {
+ return SetStatus(DllExports::GdipSetPenBrushFill(nativePen,
+ brush->nativeBrush));
+ }
+
+ Status GetColor(OUT Color* color) const
+ {
+ if (color == NULL)
+ {
+ return SetStatus(InvalidParameter);
+ }
+
+ PenType type = GetPenType();
+
+ if (type != PenTypeSolidColor)
+ {
+ return WrongState;
+ }
+
+ ARGB argb;
+
+ SetStatus(DllExports::GdipGetPenColor(nativePen,
+ &argb));
+ if (lastResult == Ok)
+ {
+ color->SetValue(argb);
+ }
+
+ return lastResult;
+ }
+
+ Brush* GetBrush() const
+ {
+ PenType type = GetPenType();
+
+ Brush* brush = NULL;
+
+ switch(type)
+ {
+ case PenTypeSolidColor:
+ brush = new SolidBrush();
+ break;
+
+ case PenTypeHatchFill:
+ brush = new HatchBrush();
+ break;
+
+ case PenTypeTextureFill:
+ brush = new TextureBrush();
+ break;
+
+ case PenTypePathGradient:
+ brush = new Brush();
+ break;
+
+ case PenTypeLinearGradient:
+ brush = new LinearGradientBrush();
+ break;
+
+ default:
+ break;
+ }
+
+ if(brush)
+ {
+ GpBrush* nativeBrush;
+
+ SetStatus(DllExports::GdipGetPenBrushFill(nativePen, &nativeBrush));
+ brush->SetNativeBrush(nativeBrush);
+ }
+
+ return brush;
+ }
+
+ DashStyle GetDashStyle() const
+ {
+ DashStyle dashStyle;
+
+ SetStatus(DllExports::GdipGetPenDashStyle(nativePen, &dashStyle));
+
+ return dashStyle;
+ }
+
+ Status SetDashStyle(IN DashStyle dashStyle)
+ {
+ return SetStatus(DllExports::GdipSetPenDashStyle(nativePen, dashStyle));
+ }
+
+ REAL GetDashOffset() const
+ {
+ REAL dashOffset;
+
+ SetStatus(DllExports::GdipGetPenDashOffset(nativePen, &dashOffset));
+
+ return dashOffset;
+ }
+
+ Status SetDashOffset(IN REAL dashOffset)
+ {
+ return SetStatus(DllExports::GdipSetPenDashOffset(nativePen, dashOffset));
+ }
+
+ Status SetDashPattern(IN const REAL* dashArray, IN INT count)
+ {
+ return SetStatus(DllExports::GdipSetPenDashArray(nativePen, dashArray,
+ count));
+ }
+
+ INT GetDashPatternCount() const
+ {
+ INT count = 0;
+
+ SetStatus(DllExports::GdipGetPenDashCount(nativePen, &count));
+
+ return count;
+ }
+
+ Status GetDashPattern(OUT REAL* dashArray,
+ IN INT count) const
+ {
+ if (dashArray == NULL || count <= 0)
+ return SetStatus(InvalidParameter);
+
+ return SetStatus(DllExports::GdipGetPenDashArray(nativePen,
+ dashArray,
+ count));
+ }
+
+ Status SetCompoundArray(IN const REAL* compoundArray,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipSetPenCompoundArray(nativePen, compoundArray,
+ count));
+ }
+
+ INT GetCompoundArrayCount() const
+ {
+ INT count = 0;
+
+ SetStatus(DllExports::GdipGetPenCompoundCount(nativePen, &count));
+
+ return count;
+ }
+
+ Status GetCompoundArray(OUT REAL* compoundArray,
+ IN INT count) const
+ {
+ if (compoundArray == NULL || count <= 0)
+ return SetStatus(InvalidParameter);
+
+ return SetStatus(DllExports::GdipGetPenCompoundArray(nativePen,
+ compoundArray,
+ count));
+ }
+
+ Status GetLastStatus() const
+ {
+ Status lastStatus = lastResult;
+ lastResult = Ok;
+
+ return lastStatus;
+ }
+
+protected:
+
+#ifdef DCR_USE_NEW_250932
+
+private:
+ Pen(const Pen &);
+ Pen& operator=(const Pen &);
+protected:
+
+#else
+
+ Pen(const Pen& pen)
+ {
+ pen;
+ SetStatus(NotImplemented);
+ SetNativePen(NULL);
+ }
+
+ Pen& operator=(const Pen& pen)
+ {
+ pen;
+ SetStatus(NotImplemented);
+ return *this;
+ }
+
+#endif
+
+ Pen(GpPen* nativePen, Status status)
+ {
+ lastResult = status;
+ SetNativePen(nativePen);
+ }
+
+ VOID SetNativePen(GpPen* nativePen)
+ {
+ this->nativePen = nativePen;
+ }
+
+ Status SetStatus(Status status) const
+ {
+ if (status != Ok)
+ return (lastResult = status);
+ else
+ return status;
+ }
+
+protected:
+ GpPen* nativePen;
+ mutable Status lastResult;
+};
+
+#endif
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusPixelFormats.h b/core/src/fxge/Microsoft SDK/include/GdiPlusPixelFormats.h
index f9dc5991d4..68b7084074 100644
--- a/core/src/fxge/Microsoft SDK/include/GdiPlusPixelFormats.h
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusPixelFormats.h
@@ -1,201 +1,201 @@
-/**************************************************************************\
-*
-* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
-*
-* Module Name:
-*
-* Gdiplus pixel formats
-*
-* Abstract:
-*
-* Definitions for color types, palettes, pixel format IDs.
-*
-\**************************************************************************/
-
-#ifndef _GDIPLUSPIXELFORMATS_H
-#define _GDIPLUSPIXELFORMATS_H
-
-/*
- * 32-bit and 64-bit ARGB pixel value
- */
-
-typedef DWORD ARGB;
-typedef DWORDLONG ARGB64;
-
-#define ALPHA_SHIFT 24
-#define RED_SHIFT 16
-#define GREEN_SHIFT 8
-#define BLUE_SHIFT 0
-#define ALPHA_MASK ((ARGB) 0xff << ALPHA_SHIFT)
-
-/*
- * In-memory pixel data formats:
- * bits 0-7 = format index
- * bits 8-15 = pixel size (in bits)
- * bits 16-23 = flags
- * bits 24-31 = reserved
- */
-
-#ifndef DCR_USE_NEW_105760
-
-enum PixelFormat
-{
- PixelFormatIndexed = 0x00010000, // Indexes into a palette
- PixelFormatGDI = 0x00020000, // Is a GDI-supported format
- PixelFormatAlpha = 0x00040000, // Has an alpha component
- PixelFormatPAlpha = 0x00080000, // Uses pre-multiplied alpha
- PixelFormatExtended = 0x00100000, // Uses extended color (16 bits per channel)
- PixelFormatCanonical = 0x00200000, // ?
-
- PixelFormatUndefined = 0,
- PixelFormatDontCare = 0,
-
- PixelFormat1bppIndexed = 1 | ( 1 << 8) | PixelFormatIndexed
- | PixelFormatGDI,
- PixelFormat4bppIndexed = 2 | ( 4 << 8) | PixelFormatIndexed
- | PixelFormatGDI,
- PixelFormat8bppIndexed = 3 | ( 8 << 8) | PixelFormatIndexed
- | PixelFormatGDI,
- PixelFormat16bppGrayScale = 4 | (16 << 8) | PixelFormatExtended,
- PixelFormat16bppRGB555 = 5 | (16 << 8) | PixelFormatGDI,
- PixelFormat16bppRGB565 = 6 | (16 << 8) | PixelFormatGDI,
- PixelFormat16bppARGB1555 = 7 | (16 << 8) | PixelFormatAlpha
- | PixelFormatGDI,
- PixelFormat24bppRGB = 8 | (24 << 8) | PixelFormatGDI,
- PixelFormat32bppRGB = 9 | (32 << 8) | PixelFormatGDI,
- PixelFormat32bppARGB = 10 | (32 << 8) | PixelFormatAlpha
- | PixelFormatGDI
- | PixelFormatCanonical,
- PixelFormat32bppPARGB = 11 | (32 << 8) | PixelFormatAlpha
- | PixelFormatPAlpha
- | PixelFormatGDI,
- PixelFormat48bppRGB = 12 | (48 << 8) | PixelFormatExtended,
- PixelFormat64bppARGB = 13 | (64 << 8) | PixelFormatAlpha
- | PixelFormatCanonical
- | PixelFormatExtended,
- PixelFormat64bppPARGB = 14 | (64 << 8) | PixelFormatAlpha
- | PixelFormatPAlpha
- | PixelFormatExtended,
- PixelFormat24bppBGR = 15 | (24 << 8) | PixelFormatGDI,
- PixelFormatMax = 16
-};
-
-#else
-
-typedef INT PixelFormat;
-
-#define PixelFormatIndexed 0x00010000 // Indexes into a palette
-#define PixelFormatGDI 0x00020000 // Is a GDI-supported format
-#define PixelFormatAlpha 0x00040000 // Has an alpha component
-#define PixelFormatPAlpha 0x00080000 // Uses pre-multiplied alpha
-#define PixelFormatExtended 0x00100000 // Uses extended color (16 bits per channel)
-#define PixelFormatCanonical 0x00200000 // ?
-
-#define PixelFormatUndefined 0
-#define PixelFormatDontCare 0
-
-#define PixelFormat1bppIndexed (1 | ( 1 << 8) | PixelFormatIndexed | PixelFormatGDI)
-#define PixelFormat4bppIndexed (2 | ( 4 << 8) | PixelFormatIndexed | PixelFormatGDI)
-#define PixelFormat8bppIndexed (3 | ( 8 << 8) | PixelFormatIndexed | PixelFormatGDI)
-#define PixelFormat16bppGrayScale (4 | (16 << 8) | PixelFormatExtended)
-#define PixelFormat16bppRGB555 (5 | (16 << 8) | PixelFormatGDI)
-#define PixelFormat16bppRGB565 (6 | (16 << 8) | PixelFormatGDI)
-#define PixelFormat16bppARGB1555 (7 | (16 << 8) | PixelFormatAlpha | PixelFormatGDI)
-#define PixelFormat24bppRGB (8 | (24 << 8) | PixelFormatGDI)
-#define PixelFormat32bppRGB (9 | (32 << 8) | PixelFormatGDI)
-#define PixelFormat32bppARGB (10 | (32 << 8) | PixelFormatAlpha | PixelFormatGDI | PixelFormatCanonical)
-#define PixelFormat32bppPARGB (11 | (32 << 8) | PixelFormatAlpha | PixelFormatPAlpha | PixelFormatGDI)
-#define PixelFormat48bppRGB (12 | (48 << 8) | PixelFormatExtended)
-#define PixelFormat64bppARGB (13 | (64 << 8) | PixelFormatAlpha | PixelFormatCanonical | PixelFormatExtended)
-#define PixelFormat64bppPARGB (14 | (64 << 8) | PixelFormatAlpha | PixelFormatPAlpha | PixelFormatExtended)
-#define PixelFormatMax 15
-
-#endif
-
-
-/*
- * Return the pixel size for the specified format (in bits)
- */
-
-inline UINT
-GetPixelFormatSize(
- PixelFormat pixfmt
- )
-{
- return (pixfmt >> 8) & 0xff;
-}
-
-/*
- * Determine if the specified pixel format is an indexed color format
- */
-
-inline BOOL
-IsIndexedPixelFormat(
- PixelFormat pixfmt
- )
-{
- return (pixfmt & PixelFormatIndexed) != 0;
-}
-
-/*
- * Determine if the pixel format can have alpha channel
- */
-
-inline BOOL
-IsAlphaPixelFormat(
- PixelFormat pixfmt
-)
-{
- return (pixfmt & PixelFormatAlpha) != 0;
-}
-
-/*
- * Determine if the pixel format is an extended format,
- * i.e. supports 16-bit per channel
- */
-
-inline BOOL
-IsExtendedPixelFormat(
- PixelFormat pixfmt
- )
-{
- return (pixfmt & PixelFormatExtended) != 0;
-}
-
-/*
- * Determine if the pixel format is canonical format:
- * PixelFormat32bppARGB
- * PixelFormat32bppPARGB
- * PixelFormat64bppARGB
- * PixelFormat64bppPARGB
- */
-
-inline BOOL
-IsCanonicalPixelFormat(
- PixelFormat pixfmt
- )
-{
- return (pixfmt & PixelFormatCanonical) != 0;
-}
-
-/*
- * Color palette
- * palette entries are limited to 32bpp ARGB pixel format
- */
-
-enum PaletteFlags
-{
- PaletteFlagsHasAlpha = 0x0001,
- PaletteFlagsGrayScale = 0x0002,
- PaletteFlagsHalftone = 0x0004
-};
-
-struct ColorPalette
-{
-public:
- UINT Flags; // palette flags
- UINT Count; // number of color entries
- ARGB Entries[1]; // palette color entries
-};
-
-#endif
+/**************************************************************************\
+*
+* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
+*
+* Module Name:
+*
+* Gdiplus pixel formats
+*
+* Abstract:
+*
+* Definitions for color types, palettes, pixel format IDs.
+*
+\**************************************************************************/
+
+#ifndef _GDIPLUSPIXELFORMATS_H
+#define _GDIPLUSPIXELFORMATS_H
+
+/*
+ * 32-bit and 64-bit ARGB pixel value
+ */
+
+typedef DWORD ARGB;
+typedef DWORDLONG ARGB64;
+
+#define ALPHA_SHIFT 24
+#define RED_SHIFT 16
+#define GREEN_SHIFT 8
+#define BLUE_SHIFT 0
+#define ALPHA_MASK ((ARGB) 0xff << ALPHA_SHIFT)
+
+/*
+ * In-memory pixel data formats:
+ * bits 0-7 = format index
+ * bits 8-15 = pixel size (in bits)
+ * bits 16-23 = flags
+ * bits 24-31 = reserved
+ */
+
+#ifndef DCR_USE_NEW_105760
+
+enum PixelFormat
+{
+ PixelFormatIndexed = 0x00010000, // Indexes into a palette
+ PixelFormatGDI = 0x00020000, // Is a GDI-supported format
+ PixelFormatAlpha = 0x00040000, // Has an alpha component
+ PixelFormatPAlpha = 0x00080000, // Uses pre-multiplied alpha
+ PixelFormatExtended = 0x00100000, // Uses extended color (16 bits per channel)
+ PixelFormatCanonical = 0x00200000, // ?
+
+ PixelFormatUndefined = 0,
+ PixelFormatDontCare = 0,
+
+ PixelFormat1bppIndexed = 1 | ( 1 << 8) | PixelFormatIndexed
+ | PixelFormatGDI,
+ PixelFormat4bppIndexed = 2 | ( 4 << 8) | PixelFormatIndexed
+ | PixelFormatGDI,
+ PixelFormat8bppIndexed = 3 | ( 8 << 8) | PixelFormatIndexed
+ | PixelFormatGDI,
+ PixelFormat16bppGrayScale = 4 | (16 << 8) | PixelFormatExtended,
+ PixelFormat16bppRGB555 = 5 | (16 << 8) | PixelFormatGDI,
+ PixelFormat16bppRGB565 = 6 | (16 << 8) | PixelFormatGDI,
+ PixelFormat16bppARGB1555 = 7 | (16 << 8) | PixelFormatAlpha
+ | PixelFormatGDI,
+ PixelFormat24bppRGB = 8 | (24 << 8) | PixelFormatGDI,
+ PixelFormat32bppRGB = 9 | (32 << 8) | PixelFormatGDI,
+ PixelFormat32bppARGB = 10 | (32 << 8) | PixelFormatAlpha
+ | PixelFormatGDI
+ | PixelFormatCanonical,
+ PixelFormat32bppPARGB = 11 | (32 << 8) | PixelFormatAlpha
+ | PixelFormatPAlpha
+ | PixelFormatGDI,
+ PixelFormat48bppRGB = 12 | (48 << 8) | PixelFormatExtended,
+ PixelFormat64bppARGB = 13 | (64 << 8) | PixelFormatAlpha
+ | PixelFormatCanonical
+ | PixelFormatExtended,
+ PixelFormat64bppPARGB = 14 | (64 << 8) | PixelFormatAlpha
+ | PixelFormatPAlpha
+ | PixelFormatExtended,
+ PixelFormat24bppBGR = 15 | (24 << 8) | PixelFormatGDI,
+ PixelFormatMax = 16
+};
+
+#else
+
+typedef INT PixelFormat;
+
+#define PixelFormatIndexed 0x00010000 // Indexes into a palette
+#define PixelFormatGDI 0x00020000 // Is a GDI-supported format
+#define PixelFormatAlpha 0x00040000 // Has an alpha component
+#define PixelFormatPAlpha 0x00080000 // Uses pre-multiplied alpha
+#define PixelFormatExtended 0x00100000 // Uses extended color (16 bits per channel)
+#define PixelFormatCanonical 0x00200000 // ?
+
+#define PixelFormatUndefined 0
+#define PixelFormatDontCare 0
+
+#define PixelFormat1bppIndexed (1 | ( 1 << 8) | PixelFormatIndexed | PixelFormatGDI)
+#define PixelFormat4bppIndexed (2 | ( 4 << 8) | PixelFormatIndexed | PixelFormatGDI)
+#define PixelFormat8bppIndexed (3 | ( 8 << 8) | PixelFormatIndexed | PixelFormatGDI)
+#define PixelFormat16bppGrayScale (4 | (16 << 8) | PixelFormatExtended)
+#define PixelFormat16bppRGB555 (5 | (16 << 8) | PixelFormatGDI)
+#define PixelFormat16bppRGB565 (6 | (16 << 8) | PixelFormatGDI)
+#define PixelFormat16bppARGB1555 (7 | (16 << 8) | PixelFormatAlpha | PixelFormatGDI)
+#define PixelFormat24bppRGB (8 | (24 << 8) | PixelFormatGDI)
+#define PixelFormat32bppRGB (9 | (32 << 8) | PixelFormatGDI)
+#define PixelFormat32bppARGB (10 | (32 << 8) | PixelFormatAlpha | PixelFormatGDI | PixelFormatCanonical)
+#define PixelFormat32bppPARGB (11 | (32 << 8) | PixelFormatAlpha | PixelFormatPAlpha | PixelFormatGDI)
+#define PixelFormat48bppRGB (12 | (48 << 8) | PixelFormatExtended)
+#define PixelFormat64bppARGB (13 | (64 << 8) | PixelFormatAlpha | PixelFormatCanonical | PixelFormatExtended)
+#define PixelFormat64bppPARGB (14 | (64 << 8) | PixelFormatAlpha | PixelFormatPAlpha | PixelFormatExtended)
+#define PixelFormatMax 15
+
+#endif
+
+
+/*
+ * Return the pixel size for the specified format (in bits)
+ */
+
+inline UINT
+GetPixelFormatSize(
+ PixelFormat pixfmt
+ )
+{
+ return (pixfmt >> 8) & 0xff;
+}
+
+/*
+ * Determine if the specified pixel format is an indexed color format
+ */
+
+inline BOOL
+IsIndexedPixelFormat(
+ PixelFormat pixfmt
+ )
+{
+ return (pixfmt & PixelFormatIndexed) != 0;
+}
+
+/*
+ * Determine if the pixel format can have alpha channel
+ */
+
+inline BOOL
+IsAlphaPixelFormat(
+ PixelFormat pixfmt
+)
+{
+ return (pixfmt & PixelFormatAlpha) != 0;
+}
+
+/*
+ * Determine if the pixel format is an extended format,
+ * i.e. supports 16-bit per channel
+ */
+
+inline BOOL
+IsExtendedPixelFormat(
+ PixelFormat pixfmt
+ )
+{
+ return (pixfmt & PixelFormatExtended) != 0;
+}
+
+/*
+ * Determine if the pixel format is canonical format:
+ * PixelFormat32bppARGB
+ * PixelFormat32bppPARGB
+ * PixelFormat64bppARGB
+ * PixelFormat64bppPARGB
+ */
+
+inline BOOL
+IsCanonicalPixelFormat(
+ PixelFormat pixfmt
+ )
+{
+ return (pixfmt & PixelFormatCanonical) != 0;
+}
+
+/*
+ * Color palette
+ * palette entries are limited to 32bpp ARGB pixel format
+ */
+
+enum PaletteFlags
+{
+ PaletteFlagsHasAlpha = 0x0001,
+ PaletteFlagsGrayScale = 0x0002,
+ PaletteFlagsHalftone = 0x0004
+};
+
+struct ColorPalette
+{
+public:
+ UINT Flags; // palette flags
+ UINT Count; // number of color entries
+ ARGB Entries[1]; // palette color entries
+};
+
+#endif
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusRegion.h b/core/src/fxge/Microsoft SDK/include/GdiPlusRegion.h
index dd1d20e273..cfb40a17dc 100644
--- a/core/src/fxge/Microsoft SDK/include/GdiPlusRegion.h
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusRegion.h
@@ -1,498 +1,498 @@
-/**************************************************************************\
-*
-* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
-*
-* Module Name:
-*
-* GdiplusRegion.h
-*
-* Abstract:
-*
-* Region API related declarations
-*
-\**************************************************************************/
-
-#ifndef _GDIPLUSREGION_H
-#define _GDIPLUSREGION_H
-
-/**
- * Construct a new region object
- */
-
-inline
-Region::Region()
-{
- GpRegion *region = NULL;
-
- lastResult = DllExports::GdipCreateRegion(&region);
-
- SetNativeRegion(region);
-}
-
-inline
-Region::Region(IN const RectF& rect)
-{
- GpRegion *region = NULL;
-
- lastResult = DllExports::GdipCreateRegionRect(&rect, &region);
-
- SetNativeRegion(region);
-}
-
-inline
-Region::Region(IN const Rect& rect)
-{
- GpRegion *region = NULL;
-
- lastResult = DllExports::GdipCreateRegionRectI(&rect, &region);
-
- SetNativeRegion(region);
-}
-
-inline
-Region::Region(IN const GraphicsPath* path)
-{
- GpRegion *region = NULL;
-
- lastResult = DllExports::GdipCreateRegionPath(path->nativePath, &region);
-
- SetNativeRegion(region);
-}
-
-inline
-Region::Region(IN const BYTE* regionData, IN INT size)
-{
- GpRegion *region = NULL;
-
- lastResult = DllExports::GdipCreateRegionRgnData(regionData, size, &region);
-
- SetNativeRegion(region);
-}
-
-inline
-Region::Region(IN HRGN hRgn)
-{
- GpRegion *region = NULL;
-
- lastResult = DllExports::GdipCreateRegionHrgn(hRgn, &region);
-
- SetNativeRegion(region);
-}
-
-inline
-Region* Region::FromHRGN(IN HRGN hRgn)
-{
- GpRegion *region = NULL;
-
- if (DllExports::GdipCreateRegionHrgn(hRgn, &region) == Ok)
- {
- Region* newRegion = new Region(region);
-
- if (newRegion == NULL)
- {
- DllExports::GdipDeleteRegion(region);
- }
-
- return newRegion;
- }
- else
- return NULL;
-}
-
-inline
-Region::~Region()
-{
- DllExports::GdipDeleteRegion(nativeRegion);
-}
-
-/**
- * Make a copy of the region object
- */
-inline Region*
-Region::Clone() const
-{
- GpRegion *region = NULL;
-
- SetStatus(DllExports::GdipCloneRegion(nativeRegion, &region));
-
- return new Region(region);
-}
-
-inline Status
-Region::MakeInfinite()
-{
- return SetStatus(DllExports::GdipSetInfinite(nativeRegion));
-}
-
-inline Status
-Region::MakeEmpty()
-{
- return SetStatus(DllExports::GdipSetEmpty(nativeRegion));
-}
-
-/**
- * Region operations
- */
-inline Status
-Region::Intersect(IN const RectF& rect)
-{
- return SetStatus(DllExports::GdipCombineRegionRect(nativeRegion, &rect, CombineModeIntersect));
-}
-
-inline Status
-Region::Intersect(IN const Rect& rect)
-{
- return SetStatus(DllExports::GdipCombineRegionRectI(nativeRegion, &rect, CombineModeIntersect));
-}
-
-inline Status
-Region::Intersect(IN const GraphicsPath* path)
-{
- return SetStatus(DllExports::GdipCombineRegionPath(nativeRegion, path->nativePath, CombineModeIntersect));
-}
-
-inline Status
-Region::Intersect(IN const Region* region)
-{
- return SetStatus(DllExports::GdipCombineRegionRegion(nativeRegion, region->nativeRegion, CombineModeIntersect));
-}
-
-inline Status
-Region::Union(IN const RectF& rect)
-{
- return SetStatus(DllExports::GdipCombineRegionRect(nativeRegion, &rect, CombineModeUnion));
-}
-
-inline Status
-Region::Union(IN const Rect& rect)
-{
- return SetStatus(DllExports::GdipCombineRegionRectI(nativeRegion, &rect, CombineModeUnion));
-}
-
-inline Status
-Region::Union(IN const GraphicsPath* path)
-{
- return SetStatus(DllExports::GdipCombineRegionPath(nativeRegion, path->nativePath, CombineModeUnion));
-}
-
-inline Status
-Region::Union(IN const Region* region)
-{
- return SetStatus(DllExports::GdipCombineRegionRegion(nativeRegion, region->nativeRegion, CombineModeUnion));
-}
-
-inline Status
-Region::Xor(IN const RectF& rect)
-{
- return SetStatus(DllExports::GdipCombineRegionRect(nativeRegion, &rect, CombineModeXor));
-}
-
-inline Status
-Region::Xor(IN const Rect& rect)
-{
- return SetStatus(DllExports::GdipCombineRegionRectI(nativeRegion, &rect, CombineModeXor));
-}
-
-inline Status
-Region::Xor(IN const GraphicsPath* path)
-{
- return SetStatus(DllExports::GdipCombineRegionPath(nativeRegion, path->nativePath, CombineModeXor));
-}
-
-inline Status
-Region::Xor(IN const Region* region)
-{
- return SetStatus(DllExports::GdipCombineRegionRegion(nativeRegion, region->nativeRegion, CombineModeXor));
-}
-
-inline Status
-Region::Exclude(IN const RectF& rect)
-{
- return SetStatus(DllExports::GdipCombineRegionRect(nativeRegion, &rect, CombineModeExclude));
-}
-
-inline Status
-Region::Exclude(IN const Rect& rect)
-{
- return SetStatus(DllExports::GdipCombineRegionRectI(nativeRegion, &rect, CombineModeExclude));
-}
-
-inline Status
-Region::Exclude(IN const GraphicsPath* path)
-{
- return SetStatus(DllExports::GdipCombineRegionPath(nativeRegion, path->nativePath, CombineModeExclude));
-}
-
-inline Status
-Region::Exclude(IN const Region* region)
-{
- return SetStatus(DllExports::GdipCombineRegionRegion(nativeRegion,
- region->nativeRegion, CombineModeExclude));
-}
-
-inline Status
-Region::Complement(IN const RectF& rect)
-{
- return SetStatus(DllExports::GdipCombineRegionRect(nativeRegion, &rect, CombineModeComplement));
-}
-
-inline Status
-Region::Complement(IN const Rect& rect)
-{
- return SetStatus(DllExports::GdipCombineRegionRectI(nativeRegion, &rect, CombineModeComplement));
-}
-
-inline Status
-Region::Complement(IN const GraphicsPath* path)
-{
- return SetStatus(DllExports::GdipCombineRegionPath(nativeRegion,
- path->nativePath, CombineModeComplement));
-}
-
-inline Status
-Region::Complement(IN const Region* region)
-{
- return SetStatus(DllExports::GdipCombineRegionRegion(nativeRegion,
- region->nativeRegion, CombineModeComplement));
-}
-
-/**
- * Transform operations
- */
-inline Status
-Region::Translate(IN REAL dx,
- IN REAL dy)
-{
- return SetStatus(DllExports::GdipTranslateRegion(nativeRegion, dx, dy));
-}
-
-inline Status
-Region::Translate(IN INT dx,
- IN INT dy)
-{
- return SetStatus(DllExports::GdipTranslateRegionI(nativeRegion, dx, dy));
-}
-
-inline Status
-Region::Transform(IN const Matrix* matrix)
-{
- return SetStatus(DllExports::GdipTransformRegion(nativeRegion, matrix->nativeMatrix));
-}
-
-/**
- * Get region attributes
- */
-inline Status
-Region::GetBounds(OUT RectF* rect,
- IN const Graphics* g) const
-{
- return SetStatus(DllExports::GdipGetRegionBounds(nativeRegion,
- g->nativeGraphics,
- rect));
-}
-
-inline Status
-Region::GetBounds(OUT Rect* rect,
- IN const Graphics* g) const
-{
- return SetStatus(DllExports::GdipGetRegionBoundsI(nativeRegion,
- g->nativeGraphics,
- rect));
-}
-
-inline HRGN
-Region::GetHRGN(IN const Graphics* g) const
-{
- HRGN hrgn;
-
- SetStatus(DllExports::GdipGetRegionHRgn(nativeRegion,
- g->nativeGraphics,
- &hrgn));
-
- return hrgn;
-}
-
-inline BOOL
-Region::IsEmpty(IN const Graphics *g) const
-{
- BOOL booln = FALSE;
-
- SetStatus(DllExports::GdipIsEmptyRegion(nativeRegion,
- g->nativeGraphics,
- &booln));
-
- return booln;
-}
-
-inline BOOL
-Region::IsInfinite(IN const Graphics *g) const
-{
- BOOL booln = FALSE;
-
- SetStatus(DllExports::GdipIsInfiniteRegion(nativeRegion,
- g->nativeGraphics,
- &booln));
-
- return booln;
-}
-
-inline BOOL
-Region::Equals(IN const Region* region,
- IN const Graphics* g) const
-{
- BOOL booln = FALSE;
-
- SetStatus(DllExports::GdipIsEqualRegion(nativeRegion,
- region->nativeRegion,
- g->nativeGraphics,
- &booln));
- return booln;
-}
-
-// Get the size of the buffer needed for the GetData method
-inline UINT
-Region::GetDataSize() const
-{
- UINT bufferSize = 0;
-
- SetStatus(DllExports::GdipGetRegionDataSize(nativeRegion, &bufferSize));
-
- return bufferSize;
-}
-
-// buffer - where to put the data
-// bufferSize - how big the buffer is (should be at least as big as GetDataSize())
-// sizeFilled - if not NULL, this is an OUT param that says how many bytes
-// of data were written to the buffer.
-inline Status
-Region::GetData(OUT BYTE* buffer,
- IN UINT bufferSize,
- OUT UINT* sizeFilled) const
-{
- return SetStatus(DllExports::GdipGetRegionData(nativeRegion, buffer, bufferSize, sizeFilled));
-}
-
-/**
- * Hit testing operations
- */
-inline BOOL
-Region::IsVisible(IN const PointF& point,
- IN const Graphics* g) const
-{
- BOOL booln = FALSE;
-
- SetStatus(DllExports::GdipIsVisibleRegionPoint(nativeRegion,
- point.X, point.Y,
- (g == NULL) ? NULL : g->nativeGraphics,
- &booln));
- return booln;
-}
-
-inline BOOL
-Region::IsVisible(IN const RectF& rect,
- IN const Graphics* g) const
-{
- BOOL booln = FALSE;
-
- SetStatus(DllExports::GdipIsVisibleRegionRect(nativeRegion, rect.X,
- rect.Y, rect.Width,
- rect.Height,
- (g == NULL) ? NULL : g->nativeGraphics,
- &booln));
- return booln;
-}
-
-inline BOOL
-Region::IsVisible(IN const Point& point,
- IN const Graphics* g) const
-{
- BOOL booln = FALSE;
-
-
- SetStatus(DllExports::GdipIsVisibleRegionPointI(nativeRegion,
- point.X,
- point.Y,
- (g == NULL) ? NULL : g->nativeGraphics,
- &booln));
- return booln;
-}
-
-inline BOOL
-Region::IsVisible(IN const Rect& rect,
- IN const Graphics* g) const
-{
- BOOL booln = FALSE;
-
- SetStatus(DllExports::GdipIsVisibleRegionRectI(nativeRegion,
- rect.X,
- rect.Y,
- rect.Width,
- rect.Height,
- (g == NULL) ? NULL : g->nativeGraphics,
- &booln));
- return booln;
-}
-
-inline UINT
-Region::GetRegionScansCount(IN const Matrix* matrix) const
-{
- UINT count = 0;
-
- SetStatus(DllExports::GdipGetRegionScansCount(nativeRegion,
- &count,
- matrix->nativeMatrix));
- return count;
-}
-
-inline Status
-Region::GetRegionScans(
- IN const Matrix* matrix,
- OUT RectF* rects,
- IN OUT INT* count) const
-{
- return SetStatus(DllExports::GdipGetRegionScans(nativeRegion,
- rects,
- count,
- matrix->nativeMatrix));
-}
-
-// If rects is NULL, return the count of rects in the region.
-// Otherwise, assume rects is big enough to hold all the region rects
-// and fill them in and return the number of rects filled in.
-// The rects are returned in the units specified by the matrix
-// (which is typically a world-to-device transform).
-// Note that the number of rects returned can vary, depending on the
-// matrix that is used.
-inline Status
-Region::GetRegionScans(
- IN const Matrix* matrix,
- OUT Rect* rects, // NULL to just get the count
- IN OUT INT* count) const
-{
- return SetStatus(DllExports::GdipGetRegionScansI(nativeRegion,
- rects,
- count,
- matrix->nativeMatrix));
-}
-
-// protected method
-inline Region::Region(GpRegion* nativeRegion)
-{
- SetNativeRegion(nativeRegion);
-}
-
-// protected method
-inline VOID Region::SetNativeRegion(GpRegion* nativeRegion)
-{
- this->nativeRegion = nativeRegion;
-}
-
-inline Status Region::GetLastStatus() const
-{
- Status lastStatus = lastResult;
- lastResult = Ok;
-
- return lastStatus;
-}
-
-#endif // !_GDIPLUSREGION_H
+/**************************************************************************\
+*
+* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
+*
+* Module Name:
+*
+* GdiplusRegion.h
+*
+* Abstract:
+*
+* Region API related declarations
+*
+\**************************************************************************/
+
+#ifndef _GDIPLUSREGION_H
+#define _GDIPLUSREGION_H
+
+/**
+ * Construct a new region object
+ */
+
+inline
+Region::Region()
+{
+ GpRegion *region = NULL;
+
+ lastResult = DllExports::GdipCreateRegion(&region);
+
+ SetNativeRegion(region);
+}
+
+inline
+Region::Region(IN const RectF& rect)
+{
+ GpRegion *region = NULL;
+
+ lastResult = DllExports::GdipCreateRegionRect(&rect, &region);
+
+ SetNativeRegion(region);
+}
+
+inline
+Region::Region(IN const Rect& rect)
+{
+ GpRegion *region = NULL;
+
+ lastResult = DllExports::GdipCreateRegionRectI(&rect, &region);
+
+ SetNativeRegion(region);
+}
+
+inline
+Region::Region(IN const GraphicsPath* path)
+{
+ GpRegion *region = NULL;
+
+ lastResult = DllExports::GdipCreateRegionPath(path->nativePath, &region);
+
+ SetNativeRegion(region);
+}
+
+inline
+Region::Region(IN const BYTE* regionData, IN INT size)
+{
+ GpRegion *region = NULL;
+
+ lastResult = DllExports::GdipCreateRegionRgnData(regionData, size, &region);
+
+ SetNativeRegion(region);
+}
+
+inline
+Region::Region(IN HRGN hRgn)
+{
+ GpRegion *region = NULL;
+
+ lastResult = DllExports::GdipCreateRegionHrgn(hRgn, &region);
+
+ SetNativeRegion(region);
+}
+
+inline
+Region* Region::FromHRGN(IN HRGN hRgn)
+{
+ GpRegion *region = NULL;
+
+ if (DllExports::GdipCreateRegionHrgn(hRgn, &region) == Ok)
+ {
+ Region* newRegion = new Region(region);
+
+ if (newRegion == NULL)
+ {
+ DllExports::GdipDeleteRegion(region);
+ }
+
+ return newRegion;
+ }
+ else
+ return NULL;
+}
+
+inline
+Region::~Region()
+{
+ DllExports::GdipDeleteRegion(nativeRegion);
+}
+
+/**
+ * Make a copy of the region object
+ */
+inline Region*
+Region::Clone() const
+{
+ GpRegion *region = NULL;
+
+ SetStatus(DllExports::GdipCloneRegion(nativeRegion, &region));
+
+ return new Region(region);
+}
+
+inline Status
+Region::MakeInfinite()
+{
+ return SetStatus(DllExports::GdipSetInfinite(nativeRegion));
+}
+
+inline Status
+Region::MakeEmpty()
+{
+ return SetStatus(DllExports::GdipSetEmpty(nativeRegion));
+}
+
+/**
+ * Region operations
+ */
+inline Status
+Region::Intersect(IN const RectF& rect)
+{
+ return SetStatus(DllExports::GdipCombineRegionRect(nativeRegion, &rect, CombineModeIntersect));
+}
+
+inline Status
+Region::Intersect(IN const Rect& rect)
+{
+ return SetStatus(DllExports::GdipCombineRegionRectI(nativeRegion, &rect, CombineModeIntersect));
+}
+
+inline Status
+Region::Intersect(IN const GraphicsPath* path)
+{
+ return SetStatus(DllExports::GdipCombineRegionPath(nativeRegion, path->nativePath, CombineModeIntersect));
+}
+
+inline Status
+Region::Intersect(IN const Region* region)
+{
+ return SetStatus(DllExports::GdipCombineRegionRegion(nativeRegion, region->nativeRegion, CombineModeIntersect));
+}
+
+inline Status
+Region::Union(IN const RectF& rect)
+{
+ return SetStatus(DllExports::GdipCombineRegionRect(nativeRegion, &rect, CombineModeUnion));
+}
+
+inline Status
+Region::Union(IN const Rect& rect)
+{
+ return SetStatus(DllExports::GdipCombineRegionRectI(nativeRegion, &rect, CombineModeUnion));
+}
+
+inline Status
+Region::Union(IN const GraphicsPath* path)
+{
+ return SetStatus(DllExports::GdipCombineRegionPath(nativeRegion, path->nativePath, CombineModeUnion));
+}
+
+inline Status
+Region::Union(IN const Region* region)
+{
+ return SetStatus(DllExports::GdipCombineRegionRegion(nativeRegion, region->nativeRegion, CombineModeUnion));
+}
+
+inline Status
+Region::Xor(IN const RectF& rect)
+{
+ return SetStatus(DllExports::GdipCombineRegionRect(nativeRegion, &rect, CombineModeXor));
+}
+
+inline Status
+Region::Xor(IN const Rect& rect)
+{
+ return SetStatus(DllExports::GdipCombineRegionRectI(nativeRegion, &rect, CombineModeXor));
+}
+
+inline Status
+Region::Xor(IN const GraphicsPath* path)
+{
+ return SetStatus(DllExports::GdipCombineRegionPath(nativeRegion, path->nativePath, CombineModeXor));
+}
+
+inline Status
+Region::Xor(IN const Region* region)
+{
+ return SetStatus(DllExports::GdipCombineRegionRegion(nativeRegion, region->nativeRegion, CombineModeXor));
+}
+
+inline Status
+Region::Exclude(IN const RectF& rect)
+{
+ return SetStatus(DllExports::GdipCombineRegionRect(nativeRegion, &rect, CombineModeExclude));
+}
+
+inline Status
+Region::Exclude(IN const Rect& rect)
+{
+ return SetStatus(DllExports::GdipCombineRegionRectI(nativeRegion, &rect, CombineModeExclude));
+}
+
+inline Status
+Region::Exclude(IN const GraphicsPath* path)
+{
+ return SetStatus(DllExports::GdipCombineRegionPath(nativeRegion, path->nativePath, CombineModeExclude));
+}
+
+inline Status
+Region::Exclude(IN const Region* region)
+{
+ return SetStatus(DllExports::GdipCombineRegionRegion(nativeRegion,
+ region->nativeRegion, CombineModeExclude));
+}
+
+inline Status
+Region::Complement(IN const RectF& rect)
+{
+ return SetStatus(DllExports::GdipCombineRegionRect(nativeRegion, &rect, CombineModeComplement));
+}
+
+inline Status
+Region::Complement(IN const Rect& rect)
+{
+ return SetStatus(DllExports::GdipCombineRegionRectI(nativeRegion, &rect, CombineModeComplement));
+}
+
+inline Status
+Region::Complement(IN const GraphicsPath* path)
+{
+ return SetStatus(DllExports::GdipCombineRegionPath(nativeRegion,
+ path->nativePath, CombineModeComplement));
+}
+
+inline Status
+Region::Complement(IN const Region* region)
+{
+ return SetStatus(DllExports::GdipCombineRegionRegion(nativeRegion,
+ region->nativeRegion, CombineModeComplement));
+}
+
+/**
+ * Transform operations
+ */
+inline Status
+Region::Translate(IN REAL dx,
+ IN REAL dy)
+{
+ return SetStatus(DllExports::GdipTranslateRegion(nativeRegion, dx, dy));
+}
+
+inline Status
+Region::Translate(IN INT dx,
+ IN INT dy)
+{
+ return SetStatus(DllExports::GdipTranslateRegionI(nativeRegion, dx, dy));
+}
+
+inline Status
+Region::Transform(IN const Matrix* matrix)
+{
+ return SetStatus(DllExports::GdipTransformRegion(nativeRegion, matrix->nativeMatrix));
+}
+
+/**
+ * Get region attributes
+ */
+inline Status
+Region::GetBounds(OUT RectF* rect,
+ IN const Graphics* g) const
+{
+ return SetStatus(DllExports::GdipGetRegionBounds(nativeRegion,
+ g->nativeGraphics,
+ rect));
+}
+
+inline Status
+Region::GetBounds(OUT Rect* rect,
+ IN const Graphics* g) const
+{
+ return SetStatus(DllExports::GdipGetRegionBoundsI(nativeRegion,
+ g->nativeGraphics,
+ rect));
+}
+
+inline HRGN
+Region::GetHRGN(IN const Graphics* g) const
+{
+ HRGN hrgn;
+
+ SetStatus(DllExports::GdipGetRegionHRgn(nativeRegion,
+ g->nativeGraphics,
+ &hrgn));
+
+ return hrgn;
+}
+
+inline BOOL
+Region::IsEmpty(IN const Graphics *g) const
+{
+ BOOL booln = FALSE;
+
+ SetStatus(DllExports::GdipIsEmptyRegion(nativeRegion,
+ g->nativeGraphics,
+ &booln));
+
+ return booln;
+}
+
+inline BOOL
+Region::IsInfinite(IN const Graphics *g) const
+{
+ BOOL booln = FALSE;
+
+ SetStatus(DllExports::GdipIsInfiniteRegion(nativeRegion,
+ g->nativeGraphics,
+ &booln));
+
+ return booln;
+}
+
+inline BOOL
+Region::Equals(IN const Region* region,
+ IN const Graphics* g) const
+{
+ BOOL booln = FALSE;
+
+ SetStatus(DllExports::GdipIsEqualRegion(nativeRegion,
+ region->nativeRegion,
+ g->nativeGraphics,
+ &booln));
+ return booln;
+}
+
+// Get the size of the buffer needed for the GetData method
+inline UINT
+Region::GetDataSize() const
+{
+ UINT bufferSize = 0;
+
+ SetStatus(DllExports::GdipGetRegionDataSize(nativeRegion, &bufferSize));
+
+ return bufferSize;
+}
+
+// buffer - where to put the data
+// bufferSize - how big the buffer is (should be at least as big as GetDataSize())
+// sizeFilled - if not NULL, this is an OUT param that says how many bytes
+// of data were written to the buffer.
+inline Status
+Region::GetData(OUT BYTE* buffer,
+ IN UINT bufferSize,
+ OUT UINT* sizeFilled) const
+{
+ return SetStatus(DllExports::GdipGetRegionData(nativeRegion, buffer, bufferSize, sizeFilled));
+}
+
+/**
+ * Hit testing operations
+ */
+inline BOOL
+Region::IsVisible(IN const PointF& point,
+ IN const Graphics* g) const
+{
+ BOOL booln = FALSE;
+
+ SetStatus(DllExports::GdipIsVisibleRegionPoint(nativeRegion,
+ point.X, point.Y,
+ (g == NULL) ? NULL : g->nativeGraphics,
+ &booln));
+ return booln;
+}
+
+inline BOOL
+Region::IsVisible(IN const RectF& rect,
+ IN const Graphics* g) const
+{
+ BOOL booln = FALSE;
+
+ SetStatus(DllExports::GdipIsVisibleRegionRect(nativeRegion, rect.X,
+ rect.Y, rect.Width,
+ rect.Height,
+ (g == NULL) ? NULL : g->nativeGraphics,
+ &booln));
+ return booln;
+}
+
+inline BOOL
+Region::IsVisible(IN const Point& point,
+ IN const Graphics* g) const
+{
+ BOOL booln = FALSE;
+
+
+ SetStatus(DllExports::GdipIsVisibleRegionPointI(nativeRegion,
+ point.X,
+ point.Y,
+ (g == NULL) ? NULL : g->nativeGraphics,
+ &booln));
+ return booln;
+}
+
+inline BOOL
+Region::IsVisible(IN const Rect& rect,
+ IN const Graphics* g) const
+{
+ BOOL booln = FALSE;
+
+ SetStatus(DllExports::GdipIsVisibleRegionRectI(nativeRegion,
+ rect.X,
+ rect.Y,
+ rect.Width,
+ rect.Height,
+ (g == NULL) ? NULL : g->nativeGraphics,
+ &booln));
+ return booln;
+}
+
+inline UINT
+Region::GetRegionScansCount(IN const Matrix* matrix) const
+{
+ UINT count = 0;
+
+ SetStatus(DllExports::GdipGetRegionScansCount(nativeRegion,
+ &count,
+ matrix->nativeMatrix));
+ return count;
+}
+
+inline Status
+Region::GetRegionScans(
+ IN const Matrix* matrix,
+ OUT RectF* rects,
+ IN OUT INT* count) const
+{
+ return SetStatus(DllExports::GdipGetRegionScans(nativeRegion,
+ rects,
+ count,
+ matrix->nativeMatrix));
+}
+
+// If rects is NULL, return the count of rects in the region.
+// Otherwise, assume rects is big enough to hold all the region rects
+// and fill them in and return the number of rects filled in.
+// The rects are returned in the units specified by the matrix
+// (which is typically a world-to-device transform).
+// Note that the number of rects returned can vary, depending on the
+// matrix that is used.
+inline Status
+Region::GetRegionScans(
+ IN const Matrix* matrix,
+ OUT Rect* rects, // NULL to just get the count
+ IN OUT INT* count) const
+{
+ return SetStatus(DllExports::GdipGetRegionScansI(nativeRegion,
+ rects,
+ count,
+ matrix->nativeMatrix));
+}
+
+// protected method
+inline Region::Region(GpRegion* nativeRegion)
+{
+ SetNativeRegion(nativeRegion);
+}
+
+// protected method
+inline VOID Region::SetNativeRegion(GpRegion* nativeRegion)
+{
+ this->nativeRegion = nativeRegion;
+}
+
+inline Status Region::GetLastStatus() const
+{
+ Status lastStatus = lastResult;
+ lastResult = Ok;
+
+ return lastStatus;
+}
+
+#endif // !_GDIPLUSREGION_H
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusStringFormat.h b/core/src/fxge/Microsoft SDK/include/GdiPlusStringFormat.h
index 1c9ddb50ec..b4ed431a06 100644
--- a/core/src/fxge/Microsoft SDK/include/GdiPlusStringFormat.h
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusStringFormat.h
@@ -1,381 +1,381 @@
-/**************************************************************************\
-*
-* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
-*
-* Module Name:
-*
-* GdiplusStringFormat.h
-*
-* Abstract:
-*
-* String format specification for DrawString and text APIs
-*
-\**************************************************************************/
-
-#ifndef _GDIPLUSSTRINGFORMAT_H
-#define _GDIPLUSSTRINGFORMAT_H
-
-
-class StringFormat : public GdiplusBase
-{
-public:
- friend class Graphics;
- friend class GraphicsPath;
-
-
- StringFormat(
- IN INT formatFlags = 0,
- IN LANGID language = LANG_NEUTRAL
- )
- {
- nativeFormat = NULL;
- lastError = DllExports::GdipCreateStringFormat(
- formatFlags,
- language,
- &nativeFormat
- );
- }
-
- static const StringFormat *GenericDefault();
- static const StringFormat *GenericTypographic();
-
- // Constructor based on existing string format
-
- StringFormat(
- IN const StringFormat *format
- )
- {
- nativeFormat = NULL;
- lastError = DllExports::GdipCloneStringFormat(
- format ? format->nativeFormat : NULL,
- &nativeFormat
- );
- }
-
- StringFormat *Clone() const
- {
- GpStringFormat *clonedStringFormat = NULL;
-
- lastError = DllExports::GdipCloneStringFormat(
- nativeFormat,
- &clonedStringFormat
- );
-
- if (lastError == Ok)
- return new StringFormat(clonedStringFormat, lastError);
- else
- return NULL;
- }
-
- ~StringFormat()
- {
- DllExports::GdipDeleteStringFormat(nativeFormat);
- }
-
- Status SetFormatFlags(IN INT flags)
- {
- return SetStatus(DllExports::GdipSetStringFormatFlags(
- nativeFormat,
- flags
- ));
- }
-
- INT GetFormatFlags() const
- {
- INT flags;
- SetStatus(DllExports::GdipGetStringFormatFlags(nativeFormat, &flags));
- return flags;
- }
-
-#ifndef DCR_USE_NEW_152154
- Status SetLineSpacing(
- IN REAL amount = 1.0f,
- IN LineSpacing method = LineSpacingRecommended
- )
- {
- return SetStatus(DllExports::GdipSetStringFormatLineSpacing(
- nativeFormat,
- amount,
- method
- ));
- }
-#endif
-
- Status SetAlignment(IN StringAlignment align)
- {
- return SetStatus(DllExports::GdipSetStringFormatAlign(
- nativeFormat,
- align
- ));
- }
-
- StringAlignment GetAlignment() const
- {
- StringAlignment alignment;
- SetStatus(DllExports::GdipGetStringFormatAlign(
- nativeFormat,
- &alignment
- ));
- return alignment;
- }
-
- Status SetLineAlignment(IN StringAlignment align)
- {
- return SetStatus(DllExports::GdipSetStringFormatLineAlign(
- nativeFormat,
- align
- ));
- }
-
- StringAlignment GetLineAlignment() const
- {
- StringAlignment alignment;
- SetStatus(DllExports::GdipGetStringFormatLineAlign(
- nativeFormat,
- &alignment
- ));
- return alignment;
- }
-
- Status SetHotkeyPrefix(IN HotkeyPrefix hotkeyPrefix)
- {
- return SetStatus(DllExports::GdipSetStringFormatHotkeyPrefix(
- nativeFormat,
- (INT)hotkeyPrefix
- ));
- }
-
- HotkeyPrefix GetHotkeyPrefix() const
- {
- HotkeyPrefix hotkeyPrefix;
- SetStatus(DllExports::GdipGetStringFormatHotkeyPrefix(
- nativeFormat,
- (INT*)&hotkeyPrefix
- ));
- return hotkeyPrefix;
- }
-
- Status SetTabStops(
- IN REAL firstTabOffset,
- IN INT count,
- IN const REAL *tabStops
- )
- {
- return SetStatus(DllExports::GdipSetStringFormatTabStops(
- nativeFormat,
- firstTabOffset,
- count,
- tabStops
- ));
- }
-
- INT GetTabStopCount() const
- {
- INT count;
- SetStatus(DllExports::GdipGetStringFormatTabStopCount(nativeFormat, &count));
- return count;
- }
-
- Status GetTabStops(
- IN INT count,
- OUT REAL *firstTabOffset,
- OUT REAL *tabStops
- ) const
- {
- return SetStatus(DllExports::GdipGetStringFormatTabStops(
- nativeFormat,
- count,
- firstTabOffset,
- tabStops
- ));
- }
-
-#ifdef DCR_USE_NEW_146933
- Status SetDigitSubstitution(
- IN LANGID language,
- IN StringDigitSubstitute substitute
- )
- {
- return SetStatus(DllExports::GdipSetStringFormatDigitSubstitution(
- nativeFormat,
- language,
- substitute
- ));
- }
-
- LANGID GetDigitSubstitutionLanguage(
- ) const
- {
- LANGID language;
- SetStatus(DllExports::GdipGetStringFormatDigitSubstitution(
- nativeFormat,
- &language,
- NULL
- ));
- return language;
- }
-
- StringDigitSubstitute GetDigitSubstitutionMethod(
- ) const
- {
- StringDigitSubstitute substitute;
- SetStatus(DllExports::GdipGetStringFormatDigitSubstitution(
- nativeFormat,
- NULL,
- &substitute
- ));
- return substitute;
- }
-#endif // DCR_USE_NEW_146933
-
- // String trimming. How to handle more text than can be displayed
- // in the limits available.
-
- Status SetTrimming(IN StringTrimming trimming)
- {
- return SetStatus(DllExports::GdipSetStringFormatTrimming(
- nativeFormat,
- trimming
- ));
- }
-
- StringTrimming StringFormat::GetTrimming() const
- {
- StringTrimming trimming;
- SetStatus(DllExports::GdipGetStringFormatTrimming(
- nativeFormat,
- &trimming
- ));
- return trimming;
- }
-
-#ifdef DCR_USE_NEW_174340
- Status SetMeasurableCharacterRanges(
- IN INT rangeCount,
- IN const CharacterRange *ranges
- )
- {
- return SetStatus(DllExports::GdipSetStringFormatMeasurableCharacterRanges(
- nativeFormat,
- rangeCount,
- ranges
- ));
- }
-
- INT GetMeasurableCharacterRangeCount()
- {
- INT count;
- SetStatus(DllExports::GdipGetStringFormatMeasurableCharacterRangeCount(
- nativeFormat,
- &count
- ));
- return count;
- }
-#endif
-
- // GetLastStatus - return last error code and clear error code
-
- Status GetLastStatus() const
- {
- Status lastStatus = lastError;
- lastError = Ok;
-
- return lastStatus;
- }
-
-protected:
-
- Status SetStatus(GpStatus newStatus) const
- {
- if (newStatus == Ok)
- {
- return Ok;
- }
- else
- {
- return lastError = newStatus;
- }
- }
-
-
-// Not allowed and move to private
- StringFormat(const StringFormat &source)
- {
- nativeFormat = NULL;
- lastError = DllExports::GdipCloneStringFormat(
- source.nativeFormat,
- &nativeFormat
- );
- }
-
- StringFormat& operator=(const StringFormat &source)
- {
- DllExports::GdipDeleteStringFormat(nativeFormat);
- lastError = DllExports::GdipCloneStringFormat(
- source.nativeFormat,
- &nativeFormat
- );
- return *this;
- }
-
-
- // private constructor for copy
- StringFormat(GpStringFormat * clonedStringFormat, Status status)
- {
- lastError = status;
- nativeFormat = clonedStringFormat;
-
- }
-
- GpStringFormat *nativeFormat;
- mutable Status lastError;
-};
-
-// Generic constant string formats.
-
-static BYTE GenericTypographicStringFormatBuffer[sizeof(StringFormat)] = {0};
-static BYTE GenericDefaultStringFormatBuffer[sizeof(StringFormat)] = {0};
-
-static StringFormat *GenericTypographicStringFormat = NULL;
-static StringFormat *GenericDefaultStringFormat = NULL;
-
-// Define the generic string formats
-
-
-inline const StringFormat *StringFormat::GenericDefault()
-{
- if (GenericDefaultStringFormat != NULL)
- {
- return GenericDefaultStringFormat;
- }
-
- GenericDefaultStringFormat =
- (StringFormat*)GenericDefaultStringFormatBuffer;
-
- GenericDefaultStringFormat->lastError =
- DllExports::GdipStringFormatGetGenericDefault(
- &(GenericDefaultStringFormat->nativeFormat)
- );
-
- return GenericDefaultStringFormat;
-}
-
-inline const StringFormat *StringFormat::GenericTypographic()
-{
- if (GenericTypographicStringFormat != NULL)
- {
- return GenericTypographicStringFormat;
- }
-
- GenericTypographicStringFormat =
- (StringFormat*)GenericTypographicStringFormatBuffer;
-
- GenericTypographicStringFormat->lastError =
- DllExports::GdipStringFormatGetGenericTypographic(
- &GenericTypographicStringFormat->nativeFormat
- );
-
- return GenericTypographicStringFormat;
-}
-
-#endif // !_GDIPLUSSTRINGFORMAT_H
+/**************************************************************************\
+*
+* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
+*
+* Module Name:
+*
+* GdiplusStringFormat.h
+*
+* Abstract:
+*
+* String format specification for DrawString and text APIs
+*
+\**************************************************************************/
+
+#ifndef _GDIPLUSSTRINGFORMAT_H
+#define _GDIPLUSSTRINGFORMAT_H
+
+
+class StringFormat : public GdiplusBase
+{
+public:
+ friend class Graphics;
+ friend class GraphicsPath;
+
+
+ StringFormat(
+ IN INT formatFlags = 0,
+ IN LANGID language = LANG_NEUTRAL
+ )
+ {
+ nativeFormat = NULL;
+ lastError = DllExports::GdipCreateStringFormat(
+ formatFlags,
+ language,
+ &nativeFormat
+ );
+ }
+
+ static const StringFormat *GenericDefault();
+ static const StringFormat *GenericTypographic();
+
+ // Constructor based on existing string format
+
+ StringFormat(
+ IN const StringFormat *format
+ )
+ {
+ nativeFormat = NULL;
+ lastError = DllExports::GdipCloneStringFormat(
+ format ? format->nativeFormat : NULL,
+ &nativeFormat
+ );
+ }
+
+ StringFormat *Clone() const
+ {
+ GpStringFormat *clonedStringFormat = NULL;
+
+ lastError = DllExports::GdipCloneStringFormat(
+ nativeFormat,
+ &clonedStringFormat
+ );
+
+ if (lastError == Ok)
+ return new StringFormat(clonedStringFormat, lastError);
+ else
+ return NULL;
+ }
+
+ ~StringFormat()
+ {
+ DllExports::GdipDeleteStringFormat(nativeFormat);
+ }
+
+ Status SetFormatFlags(IN INT flags)
+ {
+ return SetStatus(DllExports::GdipSetStringFormatFlags(
+ nativeFormat,
+ flags
+ ));
+ }
+
+ INT GetFormatFlags() const
+ {
+ INT flags;
+ SetStatus(DllExports::GdipGetStringFormatFlags(nativeFormat, &flags));
+ return flags;
+ }
+
+#ifndef DCR_USE_NEW_152154
+ Status SetLineSpacing(
+ IN REAL amount = 1.0f,
+ IN LineSpacing method = LineSpacingRecommended
+ )
+ {
+ return SetStatus(DllExports::GdipSetStringFormatLineSpacing(
+ nativeFormat,
+ amount,
+ method
+ ));
+ }
+#endif
+
+ Status SetAlignment(IN StringAlignment align)
+ {
+ return SetStatus(DllExports::GdipSetStringFormatAlign(
+ nativeFormat,
+ align
+ ));
+ }
+
+ StringAlignment GetAlignment() const
+ {
+ StringAlignment alignment;
+ SetStatus(DllExports::GdipGetStringFormatAlign(
+ nativeFormat,
+ &alignment
+ ));
+ return alignment;
+ }
+
+ Status SetLineAlignment(IN StringAlignment align)
+ {
+ return SetStatus(DllExports::GdipSetStringFormatLineAlign(
+ nativeFormat,
+ align
+ ));
+ }
+
+ StringAlignment GetLineAlignment() const
+ {
+ StringAlignment alignment;
+ SetStatus(DllExports::GdipGetStringFormatLineAlign(
+ nativeFormat,
+ &alignment
+ ));
+ return alignment;
+ }
+
+ Status SetHotkeyPrefix(IN HotkeyPrefix hotkeyPrefix)
+ {
+ return SetStatus(DllExports::GdipSetStringFormatHotkeyPrefix(
+ nativeFormat,
+ (INT)hotkeyPrefix
+ ));
+ }
+
+ HotkeyPrefix GetHotkeyPrefix() const
+ {
+ HotkeyPrefix hotkeyPrefix;
+ SetStatus(DllExports::GdipGetStringFormatHotkeyPrefix(
+ nativeFormat,
+ (INT*)&hotkeyPrefix
+ ));
+ return hotkeyPrefix;
+ }
+
+ Status SetTabStops(
+ IN REAL firstTabOffset,
+ IN INT count,
+ IN const REAL *tabStops
+ )
+ {
+ return SetStatus(DllExports::GdipSetStringFormatTabStops(
+ nativeFormat,
+ firstTabOffset,
+ count,
+ tabStops
+ ));
+ }
+
+ INT GetTabStopCount() const
+ {
+ INT count;
+ SetStatus(DllExports::GdipGetStringFormatTabStopCount(nativeFormat, &count));
+ return count;
+ }
+
+ Status GetTabStops(
+ IN INT count,
+ OUT REAL *firstTabOffset,
+ OUT REAL *tabStops
+ ) const
+ {
+ return SetStatus(DllExports::GdipGetStringFormatTabStops(
+ nativeFormat,
+ count,
+ firstTabOffset,
+ tabStops
+ ));
+ }
+
+#ifdef DCR_USE_NEW_146933
+ Status SetDigitSubstitution(
+ IN LANGID language,
+ IN StringDigitSubstitute substitute
+ )
+ {
+ return SetStatus(DllExports::GdipSetStringFormatDigitSubstitution(
+ nativeFormat,
+ language,
+ substitute
+ ));
+ }
+
+ LANGID GetDigitSubstitutionLanguage(
+ ) const
+ {
+ LANGID language;
+ SetStatus(DllExports::GdipGetStringFormatDigitSubstitution(
+ nativeFormat,
+ &language,
+ NULL
+ ));
+ return language;
+ }
+
+ StringDigitSubstitute GetDigitSubstitutionMethod(
+ ) const
+ {
+ StringDigitSubstitute substitute;
+ SetStatus(DllExports::GdipGetStringFormatDigitSubstitution(
+ nativeFormat,
+ NULL,
+ &substitute
+ ));
+ return substitute;
+ }
+#endif // DCR_USE_NEW_146933
+
+ // String trimming. How to handle more text than can be displayed
+ // in the limits available.
+
+ Status SetTrimming(IN StringTrimming trimming)
+ {
+ return SetStatus(DllExports::GdipSetStringFormatTrimming(
+ nativeFormat,
+ trimming
+ ));
+ }
+
+ StringTrimming StringFormat::GetTrimming() const
+ {
+ StringTrimming trimming;
+ SetStatus(DllExports::GdipGetStringFormatTrimming(
+ nativeFormat,
+ &trimming
+ ));
+ return trimming;
+ }
+
+#ifdef DCR_USE_NEW_174340
+ Status SetMeasurableCharacterRanges(
+ IN INT rangeCount,
+ IN const CharacterRange *ranges
+ )
+ {
+ return SetStatus(DllExports::GdipSetStringFormatMeasurableCharacterRanges(
+ nativeFormat,
+ rangeCount,
+ ranges
+ ));
+ }
+
+ INT GetMeasurableCharacterRangeCount()
+ {
+ INT count;
+ SetStatus(DllExports::GdipGetStringFormatMeasurableCharacterRangeCount(
+ nativeFormat,
+ &count
+ ));
+ return count;
+ }
+#endif
+
+ // GetLastStatus - return last error code and clear error code
+
+ Status GetLastStatus() const
+ {
+ Status lastStatus = lastError;
+ lastError = Ok;
+
+ return lastStatus;
+ }
+
+protected:
+
+ Status SetStatus(GpStatus newStatus) const
+ {
+ if (newStatus == Ok)
+ {
+ return Ok;
+ }
+ else
+ {
+ return lastError = newStatus;
+ }
+ }
+
+
+// Not allowed and move to private
+ StringFormat(const StringFormat &source)
+ {
+ nativeFormat = NULL;
+ lastError = DllExports::GdipCloneStringFormat(
+ source.nativeFormat,
+ &nativeFormat
+ );
+ }
+
+ StringFormat& operator=(const StringFormat &source)
+ {
+ DllExports::GdipDeleteStringFormat(nativeFormat);
+ lastError = DllExports::GdipCloneStringFormat(
+ source.nativeFormat,
+ &nativeFormat
+ );
+ return *this;
+ }
+
+
+ // private constructor for copy
+ StringFormat(GpStringFormat * clonedStringFormat, Status status)
+ {
+ lastError = status;
+ nativeFormat = clonedStringFormat;
+
+ }
+
+ GpStringFormat *nativeFormat;
+ mutable Status lastError;
+};
+
+// Generic constant string formats.
+
+static BYTE GenericTypographicStringFormatBuffer[sizeof(StringFormat)] = {0};
+static BYTE GenericDefaultStringFormatBuffer[sizeof(StringFormat)] = {0};
+
+static StringFormat *GenericTypographicStringFormat = NULL;
+static StringFormat *GenericDefaultStringFormat = NULL;
+
+// Define the generic string formats
+
+
+inline const StringFormat *StringFormat::GenericDefault()
+{
+ if (GenericDefaultStringFormat != NULL)
+ {
+ return GenericDefaultStringFormat;
+ }
+
+ GenericDefaultStringFormat =
+ (StringFormat*)GenericDefaultStringFormatBuffer;
+
+ GenericDefaultStringFormat->lastError =
+ DllExports::GdipStringFormatGetGenericDefault(
+ &(GenericDefaultStringFormat->nativeFormat)
+ );
+
+ return GenericDefaultStringFormat;
+}
+
+inline const StringFormat *StringFormat::GenericTypographic()
+{
+ if (GenericTypographicStringFormat != NULL)
+ {
+ return GenericTypographicStringFormat;
+ }
+
+ GenericTypographicStringFormat =
+ (StringFormat*)GenericTypographicStringFormatBuffer;
+
+ GenericTypographicStringFormat->lastError =
+ DllExports::GdipStringFormatGetGenericTypographic(
+ &GenericTypographicStringFormat->nativeFormat
+ );
+
+ return GenericTypographicStringFormat;
+}
+
+#endif // !_GDIPLUSSTRINGFORMAT_H
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusTypes.h b/core/src/fxge/Microsoft SDK/include/GdiPlusTypes.h
index 58c584dc1d..d5c03a265e 100644
--- a/core/src/fxge/Microsoft SDK/include/GdiPlusTypes.h
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusTypes.h
@@ -1,826 +1,826 @@
-/**************************************************************************\
-*
-* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
-*
-* Module Name:
-*
-* GdiplusTypes.h
-*
-* Abstract:
-*
-* Basic types used by GDI+
-*
-\**************************************************************************/
-
-#ifndef _GDIPLUSTYPES_H
-#define _GDIPLUSTYPES_H
-
-#ifndef DCR_USE_NEW_175866
-
-//--------------------------------------------------------------------------
-// LIB version initialization functions
-//--------------------------------------------------------------------------
-
-typedef VOID (__cdecl *DEBUGEVENTFUNCTION)(INT level, CHAR *message);
-
-extern "C" BOOL __stdcall InitializeGdiplus(DEBUGEVENTFUNCTION);
-extern "C" VOID __stdcall UninitializeGdiplus();
-
-#endif
-
-//--------------------------------------------------------------------------
-// Callback functions
-//--------------------------------------------------------------------------
-
-extern "C" {
-typedef BOOL (CALLBACK * ImageAbort)(VOID *);
-typedef ImageAbort DrawImageAbort;
-typedef ImageAbort GetThumbnailImageAbort;
-}
-
-// Callback for EnumerateMetafile methods. The parameters are:
-
-// recordType WMF, EMF, or EMF+ record type
-// flags (always 0 for WMF/EMF records)
-// dataSize size of the record data (in bytes), or 0 if no data
-// data pointer to the record data, or NULL if no data
-// callbackData pointer to callbackData, if any
-
-// This method can then call Metafile::PlayRecord to play the
-// record that was just enumerated. If this method returns
-// FALSE, the enumeration process is aborted. Otherwise, it continues.
-
-extern "C" {
-typedef BOOL (CALLBACK * EnumerateMetafileProc)(EmfPlusRecordType,UINT,UINT,const BYTE*,VOID*);
-}
-
-//--------------------------------------------------------------------------
-// Primitive data types
-//
-// NOTE:
-// Types already defined in standard header files:
-// INT8
-// UINT8
-// INT16
-// UINT16
-// INT32
-// UINT32
-// INT64
-// UINT64
-//
-// Avoid using the following types:
-// LONG - use INT
-// ULONG - use UINT
-// DWORD - use UINT32
-//--------------------------------------------------------------------------
-
-typedef float REAL;
-
-#define REAL_MAX FLT_MAX
-#define REAL_MIN FLT_MIN
-#define REAL_TOLERANCE (FLT_MIN * 100)
-#define REAL_EPSILON 1.192092896e-07F /* FLT_EPSILON */
-
-//--------------------------------------------------------------------------
-// Forward declarations of various internal classes
-//--------------------------------------------------------------------------
-
-class Size;
-class SizeF;
-class Point;
-class PointF;
-class Rect;
-class RectF;
-class CharacterRange;
-
-//--------------------------------------------------------------------------
-// Return values from any GDI+ API
-//--------------------------------------------------------------------------
-
-enum Status
-{
- Ok = 0,
- GenericError = 1,
- InvalidParameter = 2,
- OutOfMemory = 3,
- ObjectBusy = 4,
- InsufficientBuffer = 5,
- NotImplemented = 6,
- Win32Error = 7,
- WrongState = 8,
- Aborted = 9,
-#ifdef DCR_USE_NEW_135429
- FileNotFound = 10,
- ValueOverflow = 11,
- AccessDenied = 12,
- UnknownImageFormat = 13,
- FontFamilyNotFound = 14,
- FontStyleNotFound = 15,
- NotTrueTypeFont = 16,
-#else
- NotFound = 10,
- ValueOverflow = 11,
-#endif
- UnsupportedGdiplusVersion = 17,
- GdiplusNotInitialized
-
-};
-
-//--------------------------------------------------------------------------
-// Represents a dimension in a 2D coordinate system
-// (floating-point coordinates)
-//--------------------------------------------------------------------------
-
-class SizeF
-{
-public:
-
- // Default constructor
- SizeF()
- {
- Width = Height = 0.0f;
- }
-
- SizeF(IN const SizeF& size)
- {
- Width = size.Width;
- Height = size.Height;
- }
-
- SizeF(IN REAL width,
- IN REAL height)
- {
- Width = width;
- Height = height;
- }
-
- SizeF operator+(IN const SizeF& sz) const
- {
- return SizeF(Width + sz.Width,
- Height + sz.Height);
- }
-
- SizeF operator-(IN const SizeF& sz) const
- {
- return SizeF(Width - sz.Width,
- Height - sz.Height);
- }
-
- BOOL Equals(IN const SizeF& sz) const
- {
- return (Width == sz.Width) && (Height == sz.Height);
- }
-
- BOOL Empty() const
- {
- return (Width == 0.0f && Height == 0.0f);
- }
-
-public:
-
- REAL Width;
- REAL Height;
-};
-
-//--------------------------------------------------------------------------
-// Represents a dimension in a 2D coordinate system
-// (integer coordinates)
-//--------------------------------------------------------------------------
-
-class Size
-{
-public:
-
- // Default constructor
- Size()
- {
- Width = Height = 0;
- }
-
- Size(IN const Size& size)
- {
- Width = size.Width;
- Height = size.Height;
- }
-
- Size(IN INT width,
- IN INT height)
- {
- Width = width;
- Height = height;
- }
-
- Size operator+(IN const Size& sz) const
- {
- return Size(Width + sz.Width,
- Height + sz.Height);
- }
-
- Size operator-(IN const Size& sz) const
- {
- return Size(Width - sz.Width,
- Height - sz.Height);
- }
-
- BOOL Equals(IN const Size& sz) const
- {
- return (Width == sz.Width) && (Height == sz.Height);
- }
-
- BOOL Empty() const
- {
- return (Width == 0 && Height == 0);
- }
-
-public:
-
- INT Width;
- INT Height;
-};
-
-//--------------------------------------------------------------------------
-// Represents a location in a 2D coordinate system
-// (floating-point coordinates)
-//--------------------------------------------------------------------------
-
-class PointF
-{
-public:
- PointF()
- {
- X = Y = 0.0f;
- }
-
- PointF(IN const PointF &point)
- {
- X = point.X;
- Y = point.Y;
- }
-
- PointF(IN const SizeF &size)
- {
- X = size.Width;
- Y = size.Height;
- }
-
- PointF(IN REAL x,
- IN REAL y)
- {
- X = x;
- Y = y;
- }
-
- PointF operator+(IN const PointF& point) const
- {
- return PointF(X + point.X,
- Y + point.Y);
- }
-
- PointF operator-(IN const PointF& point) const
- {
- return PointF(X - point.X,
- Y - point.Y);
- }
-
- BOOL Equals(IN const PointF& point)
- {
- return (X == point.X) && (Y == point.Y);
- }
-
-public:
-
- REAL X;
- REAL Y;
-};
-
-//--------------------------------------------------------------------------
-// Represents a location in a 2D coordinate system
-// (integer coordinates)
-//--------------------------------------------------------------------------
-
-class Point
-{
-public:
- Point()
- {
- X = Y = 0;
- }
-
- Point(IN const Point &point)
- {
- X = point.X;
- Y = point.Y;
- }
-
- Point(IN const Size &size)
- {
- X = size.Width;
- Y = size.Height;
- }
-
- Point(IN INT x,
- IN INT y)
- {
- X = x;
- Y = y;
- }
-
- Point operator+(IN const Point& point) const
- {
- return Point(X + point.X,
- Y + point.Y);
- }
-
- Point operator-(IN const Point& point) const
- {
- return Point(X - point.X,
- Y - point.Y);
- }
-
- BOOL Equals(IN const Point& point)
- {
- return (X == point.X) && (Y == point.Y);
- }
-
-public:
-
- INT X;
- INT Y;
-};
-
-//--------------------------------------------------------------------------
-// Represents a rectangle in a 2D coordinate system
-// (floating-point coordinates)
-//--------------------------------------------------------------------------
-
-class RectF
-{
-public:
-
- // Default constructor
-
- RectF()
- {
- X = Y = Width = Height = 0.0f;
- }
-
- RectF(IN REAL x,
- IN REAL y,
- IN REAL width,
- IN REAL height)
- {
- X = x;
- Y = y;
- Width = width;
- Height = height;
- }
-
- RectF(IN const PointF& location,
- IN const SizeF& size)
- {
- X = location.X;
- Y = location.Y;
- Width = size.Width;
- Height = size.Height;
- }
-
- RectF* Clone() const
- {
- return new RectF(X, Y, Width, Height);
- }
-
- VOID GetLocation(OUT PointF* point) const
- {
- point->X = X;
- point->Y = Y;
- }
-
- VOID GetSize(OUT SizeF* size) const
- {
- size->Width = Width;
- size->Height = Height;
- }
-
- VOID GetBounds(OUT RectF* rect) const
- {
- rect->X = X;
- rect->Y = Y;
- rect->Width = Width;
- rect->Height = Height;
- }
-
- // Return the left, top, right, and bottom
- // coordinates of the rectangle
-
- REAL GetLeft() const
- {
- return X;
- }
-
- REAL GetTop() const
- {
- return Y;
- }
-
- REAL GetRight() const
- {
- return X+Width;
- }
-
- REAL GetBottom() const
- {
- return Y+Height;
- }
-
- // Determine if the rectangle is empty
- BOOL IsEmptyArea() const
- {
- return (Width <= REAL_EPSILON) || (Height <= REAL_EPSILON);
- }
-
- BOOL Equals(IN const RectF & rect) const
- {
- return X == rect.X &&
- Y == rect.Y &&
- Width == rect.Width &&
- Height == rect.Height;
- }
-
- BOOL Contains(IN REAL x,
- IN REAL y) const
- {
- return x >= X && x < X+Width &&
- y >= Y && y < Y+Height;
- }
-
- BOOL Contains(IN const PointF& pt) const
- {
- return Contains(pt.X, pt.Y);
- }
-
- BOOL Contains(IN const RectF& rect) const
- {
- return (X <= rect.X) && (rect.GetRight() <= GetRight()) &&
- (Y <= rect.Y) && (rect.GetBottom() <= GetBottom());
- }
-
- VOID Inflate(IN REAL dx,
- IN REAL dy)
- {
- X -= dx;
- Y -= dy;
- Width += 2*dx;
- Height += 2*dy;
- }
-
- VOID Inflate(IN const PointF& point)
- {
- Inflate(point.X, point.Y);
- }
-
- // Intersect the current rect with the specified object
-
- BOOL Intersect(IN const RectF& rect)
- {
- return Intersect(*this, *this, rect);
- }
-
- // Intersect rect a and b and save the result into c
- // Notice that c may be the same object as a or b.
-
- static BOOL Intersect(OUT RectF& c,
- IN const RectF& a,
- IN const RectF& b)
- {
- REAL right = min(a.GetRight(), b.GetRight());
- REAL bottom = min(a.GetBottom(), b.GetBottom());
- REAL left = max(a.GetLeft(), b.GetLeft());
- REAL top = max(a.GetTop(), b.GetTop());
-
- c.X = left;
- c.Y = top;
- c.Width = right - left;
- c.Height = bottom - top;
- return !c.IsEmptyArea();
- }
-
- // Determine if the specified rect intersects with the
- // current rect object.
-
- BOOL IntersectsWith(IN const RectF& rect) const
- {
- return (GetLeft() < rect.GetRight() &&
- GetTop() < rect.GetTop() &&
- GetRight() > rect.GetLeft() &&
- GetBottom() > rect.GetTop());
- }
-
- static BOOL Union(OUT RectF& c,
- IN const RectF& a,
- IN const RectF& b)
- {
- REAL right = max(a.GetRight(), b.GetRight());
- REAL bottom = max(a.GetBottom(), b.GetBottom());
- REAL left = min(a.GetLeft(), b.GetLeft());
- REAL top = min(a.GetTop(), b.GetTop());
-
- c.X = left;
- c.Y = top;
- c.Width = right - left;
- c.Height = bottom - top;
- return !c.IsEmptyArea();
- }
-
- VOID Offset(IN const PointF& point)
- {
- Offset(point.X, point.Y);
- }
-
- VOID Offset(IN REAL dx,
- IN REAL dy)
- {
- X += dx;
- Y += dy;
- }
-
-public:
-
- REAL X;
- REAL Y;
- REAL Width;
- REAL Height;
-};
-
-//--------------------------------------------------------------------------
-// Represents a rectangle in a 2D coordinate system
-// (integer coordinates)
-//--------------------------------------------------------------------------
-
-class Rect
-{
-public:
-
- // Default constructor
-
- Rect()
- {
- X = Y = Width = Height = 0;
- }
-
- Rect(IN INT x,
- IN INT y,
- IN INT width,
- IN INT height)
- {
- X = x;
- Y = y;
- Width = width;
- Height = height;
- }
-
- Rect(IN const Point& location,
- IN const Size& size)
- {
- X = location.X;
- Y = location.Y;
- Width = size.Width;
- Height = size.Height;
- }
-
- Rect* Clone() const
- {
- return new Rect(X, Y, Width, Height);
- }
-
- VOID GetLocation(OUT Point* point) const
- {
- point->X = X;
- point->Y = Y;
- }
-
- VOID GetSize(OUT Size* size) const
- {
- size->Width = Width;
- size->Height = Height;
- }
-
- VOID GetBounds(OUT Rect* rect) const
- {
- rect->X = X;
- rect->Y = Y;
- rect->Width = Width;
- rect->Height = Height;
- }
-
- // Return the left, top, right, and bottom
- // coordinates of the rectangle
-
- INT GetLeft() const
- {
- return X;
- }
-
- INT GetTop() const
- {
- return Y;
- }
-
- INT GetRight() const
- {
- return X+Width;
- }
-
- INT GetBottom() const
- {
- return Y+Height;
- }
-
- // Determine if the rectangle is empty
- BOOL IsEmptyArea() const
- {
- return (Width <= 0) || (Height <= 0);
- }
-
- BOOL Equals(IN const Rect & rect) const
- {
- return X == rect.X &&
- Y == rect.Y &&
- Width == rect.Width &&
- Height == rect.Height;
- }
-
- BOOL Contains(IN INT x,
- IN INT y) const
- {
- return x >= X && x < X+Width &&
- y >= Y && y < Y+Height;
- }
-
- BOOL Contains(IN const Point& pt) const
- {
- return Contains(pt.X, pt.Y);
- }
-
- BOOL Contains(IN Rect& rect) const
- {
- return (X <= rect.X) && (rect.GetRight() <= GetRight()) &&
- (Y <= rect.Y) && (rect.GetBottom() <= GetBottom());
- }
-
- VOID Inflate(IN INT dx,
- IN INT dy)
- {
- X -= dx;
- Y -= dy;
- Width += 2*dx;
- Height += 2*dy;
- }
-
- VOID Inflate(IN const Point& point)
- {
- Inflate(point.X, point.Y);
- }
-
- // Intersect the current rect with the specified object
-
- BOOL Intersect(IN const Rect& rect)
- {
- return Intersect(*this, *this, rect);
- }
-
- // Intersect rect a and b and save the result into c
- // Notice that c may be the same object as a or b.
-
- static BOOL Intersect(OUT Rect& c,
- IN const Rect& a,
- IN const Rect& b)
- {
- INT right = min(a.GetRight(), b.GetRight());
- INT bottom = min(a.GetBottom(), b.GetBottom());
- INT left = max(a.GetLeft(), b.GetLeft());
- INT top = max(a.GetTop(), b.GetTop());
-
- c.X = left;
- c.Y = top;
- c.Width = right - left;
- c.Height = bottom - top;
- return !c.IsEmptyArea();
- }
-
- // Determine if the specified rect intersects with the
- // current rect object.
-
- BOOL IntersectsWith(IN const Rect& rect) const
- {
- return (GetLeft() < rect.GetRight() &&
- GetTop() < rect.GetTop() &&
- GetRight() > rect.GetLeft() &&
- GetBottom() > rect.GetTop());
- }
-
- static BOOL Union(OUT Rect& c,
- IN const Rect& a,
- IN const Rect& b)
- {
- INT right = max(a.GetRight(), b.GetRight());
- INT bottom = max(a.GetBottom(), b.GetBottom());
- INT left = min(a.GetLeft(), b.GetLeft());
- INT top = min(a.GetTop(), b.GetTop());
-
- c.X = left;
- c.Y = top;
- c.Width = right - left;
- c.Height = bottom - top;
- return !c.IsEmptyArea();
- }
-
- VOID Offset(IN const Point& point)
- {
- Offset(point.X, point.Y);
- }
-
- VOID Offset(IN INT dx,
- IN INT dy)
- {
- X += dx;
- Y += dy;
- }
-
-public:
-
- INT X;
- INT Y;
- INT Width;
- INT Height;
-};
-
-// A user must mange memory for PathData.
-
-class PathData
-{
-public:
- PathData()
- {
- Count = 0;
- Points = NULL;
- Types = NULL;
- }
-
- ~PathData()
- {
- if (Points != NULL)
- {
- delete Points;
- }
-
- if (Types != NULL)
- {
- delete Types;
- }
- }
-
-#ifdef DCR_USE_NEW_250932
-
-private:
- PathData(const PathData &);
- PathData& operator=(const PathData &);
-
-#endif
-
-public:
- INT Count;
- PointF* Points;
- BYTE* Types;
-};
-
-
-//-----------------------------
-// text character range
-//-----------------------------
-
-class CharacterRange
-{
-public:
- CharacterRange(
- INT first,
- INT length
- ) :
- First (first),
- Length (length)
- {}
-
- CharacterRange() : First(0), Length(0)
- {}
-
- CharacterRange & operator = (const CharacterRange &rhs)
- {
- First = rhs.First;
- Length = rhs.Length;
- return *this;
- }
-
- INT First;
- INT Length;
-};
-
-#endif // !_GDIPLUSTYPES_HPP
+/**************************************************************************\
+*
+* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
+*
+* Module Name:
+*
+* GdiplusTypes.h
+*
+* Abstract:
+*
+* Basic types used by GDI+
+*
+\**************************************************************************/
+
+#ifndef _GDIPLUSTYPES_H
+#define _GDIPLUSTYPES_H
+
+#ifndef DCR_USE_NEW_175866
+
+//--------------------------------------------------------------------------
+// LIB version initialization functions
+//--------------------------------------------------------------------------
+
+typedef VOID (__cdecl *DEBUGEVENTFUNCTION)(INT level, CHAR *message);
+
+extern "C" BOOL __stdcall InitializeGdiplus(DEBUGEVENTFUNCTION);
+extern "C" VOID __stdcall UninitializeGdiplus();
+
+#endif
+
+//--------------------------------------------------------------------------
+// Callback functions
+//--------------------------------------------------------------------------
+
+extern "C" {
+typedef BOOL (CALLBACK * ImageAbort)(VOID *);
+typedef ImageAbort DrawImageAbort;
+typedef ImageAbort GetThumbnailImageAbort;
+}
+
+// Callback for EnumerateMetafile methods. The parameters are:
+
+// recordType WMF, EMF, or EMF+ record type
+// flags (always 0 for WMF/EMF records)
+// dataSize size of the record data (in bytes), or 0 if no data
+// data pointer to the record data, or NULL if no data
+// callbackData pointer to callbackData, if any
+
+// This method can then call Metafile::PlayRecord to play the
+// record that was just enumerated. If this method returns
+// FALSE, the enumeration process is aborted. Otherwise, it continues.
+
+extern "C" {
+typedef BOOL (CALLBACK * EnumerateMetafileProc)(EmfPlusRecordType,UINT,UINT,const BYTE*,VOID*);
+}
+
+//--------------------------------------------------------------------------
+// Primitive data types
+//
+// NOTE:
+// Types already defined in standard header files:
+// INT8
+// UINT8
+// INT16
+// UINT16
+// INT32
+// UINT32
+// INT64
+// UINT64
+//
+// Avoid using the following types:
+// LONG - use INT
+// ULONG - use UINT
+// DWORD - use UINT32
+//--------------------------------------------------------------------------
+
+typedef float REAL;
+
+#define REAL_MAX FLT_MAX
+#define REAL_MIN FLT_MIN
+#define REAL_TOLERANCE (FLT_MIN * 100)
+#define REAL_EPSILON 1.192092896e-07F /* FLT_EPSILON */
+
+//--------------------------------------------------------------------------
+// Forward declarations of various internal classes
+//--------------------------------------------------------------------------
+
+class Size;
+class SizeF;
+class Point;
+class PointF;
+class Rect;
+class RectF;
+class CharacterRange;
+
+//--------------------------------------------------------------------------
+// Return values from any GDI+ API
+//--------------------------------------------------------------------------
+
+enum Status
+{
+ Ok = 0,
+ GenericError = 1,
+ InvalidParameter = 2,
+ OutOfMemory = 3,
+ ObjectBusy = 4,
+ InsufficientBuffer = 5,
+ NotImplemented = 6,
+ Win32Error = 7,
+ WrongState = 8,
+ Aborted = 9,
+#ifdef DCR_USE_NEW_135429
+ FileNotFound = 10,
+ ValueOverflow = 11,
+ AccessDenied = 12,
+ UnknownImageFormat = 13,
+ FontFamilyNotFound = 14,
+ FontStyleNotFound = 15,
+ NotTrueTypeFont = 16,
+#else
+ NotFound = 10,
+ ValueOverflow = 11,
+#endif
+ UnsupportedGdiplusVersion = 17,
+ GdiplusNotInitialized
+
+};
+
+//--------------------------------------------------------------------------
+// Represents a dimension in a 2D coordinate system
+// (floating-point coordinates)
+//--------------------------------------------------------------------------
+
+class SizeF
+{
+public:
+
+ // Default constructor
+ SizeF()
+ {
+ Width = Height = 0.0f;
+ }
+
+ SizeF(IN const SizeF& size)
+ {
+ Width = size.Width;
+ Height = size.Height;
+ }
+
+ SizeF(IN REAL width,
+ IN REAL height)
+ {
+ Width = width;
+ Height = height;
+ }
+
+ SizeF operator+(IN const SizeF& sz) const
+ {
+ return SizeF(Width + sz.Width,
+ Height + sz.Height);
+ }
+
+ SizeF operator-(IN const SizeF& sz) const
+ {
+ return SizeF(Width - sz.Width,
+ Height - sz.Height);
+ }
+
+ BOOL Equals(IN const SizeF& sz) const
+ {
+ return (Width == sz.Width) && (Height == sz.Height);
+ }
+
+ BOOL Empty() const
+ {
+ return (Width == 0.0f && Height == 0.0f);
+ }
+
+public:
+
+ REAL Width;
+ REAL Height;
+};
+
+//--------------------------------------------------------------------------
+// Represents a dimension in a 2D coordinate system
+// (integer coordinates)
+//--------------------------------------------------------------------------
+
+class Size
+{
+public:
+
+ // Default constructor
+ Size()
+ {
+ Width = Height = 0;
+ }
+
+ Size(IN const Size& size)
+ {
+ Width = size.Width;
+ Height = size.Height;
+ }
+
+ Size(IN INT width,
+ IN INT height)
+ {
+ Width = width;
+ Height = height;
+ }
+
+ Size operator+(IN const Size& sz) const
+ {
+ return Size(Width + sz.Width,
+ Height + sz.Height);
+ }
+
+ Size operator-(IN const Size& sz) const
+ {
+ return Size(Width - sz.Width,
+ Height - sz.Height);
+ }
+
+ BOOL Equals(IN const Size& sz) const
+ {
+ return (Width == sz.Width) && (Height == sz.Height);
+ }
+
+ BOOL Empty() const
+ {
+ return (Width == 0 && Height == 0);
+ }
+
+public:
+
+ INT Width;
+ INT Height;
+};
+
+//--------------------------------------------------------------------------
+// Represents a location in a 2D coordinate system
+// (floating-point coordinates)
+//--------------------------------------------------------------------------
+
+class PointF
+{
+public:
+ PointF()
+ {
+ X = Y = 0.0f;
+ }
+
+ PointF(IN const PointF &point)
+ {
+ X = point.X;
+ Y = point.Y;
+ }
+
+ PointF(IN const SizeF &size)
+ {
+ X = size.Width;
+ Y = size.Height;
+ }
+
+ PointF(IN REAL x,
+ IN REAL y)
+ {
+ X = x;
+ Y = y;
+ }
+
+ PointF operator+(IN const PointF& point) const
+ {
+ return PointF(X + point.X,
+ Y + point.Y);
+ }
+
+ PointF operator-(IN const PointF& point) const
+ {
+ return PointF(X - point.X,
+ Y - point.Y);
+ }
+
+ BOOL Equals(IN const PointF& point)
+ {
+ return (X == point.X) && (Y == point.Y);
+ }
+
+public:
+
+ REAL X;
+ REAL Y;
+};
+
+//--------------------------------------------------------------------------
+// Represents a location in a 2D coordinate system
+// (integer coordinates)
+//--------------------------------------------------------------------------
+
+class Point
+{
+public:
+ Point()
+ {
+ X = Y = 0;
+ }
+
+ Point(IN const Point &point)
+ {
+ X = point.X;
+ Y = point.Y;
+ }
+
+ Point(IN const Size &size)
+ {
+ X = size.Width;
+ Y = size.Height;
+ }
+
+ Point(IN INT x,
+ IN INT y)
+ {
+ X = x;
+ Y = y;
+ }
+
+ Point operator+(IN const Point& point) const
+ {
+ return Point(X + point.X,
+ Y + point.Y);
+ }
+
+ Point operator-(IN const Point& point) const
+ {
+ return Point(X - point.X,
+ Y - point.Y);
+ }
+
+ BOOL Equals(IN const Point& point)
+ {
+ return (X == point.X) && (Y == point.Y);
+ }
+
+public:
+
+ INT X;
+ INT Y;
+};
+
+//--------------------------------------------------------------------------
+// Represents a rectangle in a 2D coordinate system
+// (floating-point coordinates)
+//--------------------------------------------------------------------------
+
+class RectF
+{
+public:
+
+ // Default constructor
+
+ RectF()
+ {
+ X = Y = Width = Height = 0.0f;
+ }
+
+ RectF(IN REAL x,
+ IN REAL y,
+ IN REAL width,
+ IN REAL height)
+ {
+ X = x;
+ Y = y;
+ Width = width;
+ Height = height;
+ }
+
+ RectF(IN const PointF& location,
+ IN const SizeF& size)
+ {
+ X = location.X;
+ Y = location.Y;
+ Width = size.Width;
+ Height = size.Height;
+ }
+
+ RectF* Clone() const
+ {
+ return new RectF(X, Y, Width, Height);
+ }
+
+ VOID GetLocation(OUT PointF* point) const
+ {
+ point->X = X;
+ point->Y = Y;
+ }
+
+ VOID GetSize(OUT SizeF* size) const
+ {
+ size->Width = Width;
+ size->Height = Height;
+ }
+
+ VOID GetBounds(OUT RectF* rect) const
+ {
+ rect->X = X;
+ rect->Y = Y;
+ rect->Width = Width;
+ rect->Height = Height;
+ }
+
+ // Return the left, top, right, and bottom
+ // coordinates of the rectangle
+
+ REAL GetLeft() const
+ {
+ return X;
+ }
+
+ REAL GetTop() const
+ {
+ return Y;
+ }
+
+ REAL GetRight() const
+ {
+ return X+Width;
+ }
+
+ REAL GetBottom() const
+ {
+ return Y+Height;
+ }
+
+ // Determine if the rectangle is empty
+ BOOL IsEmptyArea() const
+ {
+ return (Width <= REAL_EPSILON) || (Height <= REAL_EPSILON);
+ }
+
+ BOOL Equals(IN const RectF & rect) const
+ {
+ return X == rect.X &&
+ Y == rect.Y &&
+ Width == rect.Width &&
+ Height == rect.Height;
+ }
+
+ BOOL Contains(IN REAL x,
+ IN REAL y) const
+ {
+ return x >= X && x < X+Width &&
+ y >= Y && y < Y+Height;
+ }
+
+ BOOL Contains(IN const PointF& pt) const
+ {
+ return Contains(pt.X, pt.Y);
+ }
+
+ BOOL Contains(IN const RectF& rect) const
+ {
+ return (X <= rect.X) && (rect.GetRight() <= GetRight()) &&
+ (Y <= rect.Y) && (rect.GetBottom() <= GetBottom());
+ }
+
+ VOID Inflate(IN REAL dx,
+ IN REAL dy)
+ {
+ X -= dx;
+ Y -= dy;
+ Width += 2*dx;
+ Height += 2*dy;
+ }
+
+ VOID Inflate(IN const PointF& point)
+ {
+ Inflate(point.X, point.Y);
+ }
+
+ // Intersect the current rect with the specified object
+
+ BOOL Intersect(IN const RectF& rect)
+ {
+ return Intersect(*this, *this, rect);
+ }
+
+ // Intersect rect a and b and save the result into c
+ // Notice that c may be the same object as a or b.
+
+ static BOOL Intersect(OUT RectF& c,
+ IN const RectF& a,
+ IN const RectF& b)
+ {
+ REAL right = min(a.GetRight(), b.GetRight());
+ REAL bottom = min(a.GetBottom(), b.GetBottom());
+ REAL left = max(a.GetLeft(), b.GetLeft());
+ REAL top = max(a.GetTop(), b.GetTop());
+
+ c.X = left;
+ c.Y = top;
+ c.Width = right - left;
+ c.Height = bottom - top;
+ return !c.IsEmptyArea();
+ }
+
+ // Determine if the specified rect intersects with the
+ // current rect object.
+
+ BOOL IntersectsWith(IN const RectF& rect) const
+ {
+ return (GetLeft() < rect.GetRight() &&
+ GetTop() < rect.GetTop() &&
+ GetRight() > rect.GetLeft() &&
+ GetBottom() > rect.GetTop());
+ }
+
+ static BOOL Union(OUT RectF& c,
+ IN const RectF& a,
+ IN const RectF& b)
+ {
+ REAL right = max(a.GetRight(), b.GetRight());
+ REAL bottom = max(a.GetBottom(), b.GetBottom());
+ REAL left = min(a.GetLeft(), b.GetLeft());
+ REAL top = min(a.GetTop(), b.GetTop());
+
+ c.X = left;
+ c.Y = top;
+ c.Width = right - left;
+ c.Height = bottom - top;
+ return !c.IsEmptyArea();
+ }
+
+ VOID Offset(IN const PointF& point)
+ {
+ Offset(point.X, point.Y);
+ }
+
+ VOID Offset(IN REAL dx,
+ IN REAL dy)
+ {
+ X += dx;
+ Y += dy;
+ }
+
+public:
+
+ REAL X;
+ REAL Y;
+ REAL Width;
+ REAL Height;
+};
+
+//--------------------------------------------------------------------------
+// Represents a rectangle in a 2D coordinate system
+// (integer coordinates)
+//--------------------------------------------------------------------------
+
+class Rect
+{
+public:
+
+ // Default constructor
+
+ Rect()
+ {
+ X = Y = Width = Height = 0;
+ }
+
+ Rect(IN INT x,
+ IN INT y,
+ IN INT width,
+ IN INT height)
+ {
+ X = x;
+ Y = y;
+ Width = width;
+ Height = height;
+ }
+
+ Rect(IN const Point& location,
+ IN const Size& size)
+ {
+ X = location.X;
+ Y = location.Y;
+ Width = size.Width;
+ Height = size.Height;
+ }
+
+ Rect* Clone() const
+ {
+ return new Rect(X, Y, Width, Height);
+ }
+
+ VOID GetLocation(OUT Point* point) const
+ {
+ point->X = X;
+ point->Y = Y;
+ }
+
+ VOID GetSize(OUT Size* size) const
+ {
+ size->Width = Width;
+ size->Height = Height;
+ }
+
+ VOID GetBounds(OUT Rect* rect) const
+ {
+ rect->X = X;
+ rect->Y = Y;
+ rect->Width = Width;
+ rect->Height = Height;
+ }
+
+ // Return the left, top, right, and bottom
+ // coordinates of the rectangle
+
+ INT GetLeft() const
+ {
+ return X;
+ }
+
+ INT GetTop() const
+ {
+ return Y;
+ }
+
+ INT GetRight() const
+ {
+ return X+Width;
+ }
+
+ INT GetBottom() const
+ {
+ return Y+Height;
+ }
+
+ // Determine if the rectangle is empty
+ BOOL IsEmptyArea() const
+ {
+ return (Width <= 0) || (Height <= 0);
+ }
+
+ BOOL Equals(IN const Rect & rect) const
+ {
+ return X == rect.X &&
+ Y == rect.Y &&
+ Width == rect.Width &&
+ Height == rect.Height;
+ }
+
+ BOOL Contains(IN INT x,
+ IN INT y) const
+ {
+ return x >= X && x < X+Width &&
+ y >= Y && y < Y+Height;
+ }
+
+ BOOL Contains(IN const Point& pt) const
+ {
+ return Contains(pt.X, pt.Y);
+ }
+
+ BOOL Contains(IN Rect& rect) const
+ {
+ return (X <= rect.X) && (rect.GetRight() <= GetRight()) &&
+ (Y <= rect.Y) && (rect.GetBottom() <= GetBottom());
+ }
+
+ VOID Inflate(IN INT dx,
+ IN INT dy)
+ {
+ X -= dx;
+ Y -= dy;
+ Width += 2*dx;
+ Height += 2*dy;
+ }
+
+ VOID Inflate(IN const Point& point)
+ {
+ Inflate(point.X, point.Y);
+ }
+
+ // Intersect the current rect with the specified object
+
+ BOOL Intersect(IN const Rect& rect)
+ {
+ return Intersect(*this, *this, rect);
+ }
+
+ // Intersect rect a and b and save the result into c
+ // Notice that c may be the same object as a or b.
+
+ static BOOL Intersect(OUT Rect& c,
+ IN const Rect& a,
+ IN const Rect& b)
+ {
+ INT right = min(a.GetRight(), b.GetRight());
+ INT bottom = min(a.GetBottom(), b.GetBottom());
+ INT left = max(a.GetLeft(), b.GetLeft());
+ INT top = max(a.GetTop(), b.GetTop());
+
+ c.X = left;
+ c.Y = top;
+ c.Width = right - left;
+ c.Height = bottom - top;
+ return !c.IsEmptyArea();
+ }
+
+ // Determine if the specified rect intersects with the
+ // current rect object.
+
+ BOOL IntersectsWith(IN const Rect& rect) const
+ {
+ return (GetLeft() < rect.GetRight() &&
+ GetTop() < rect.GetTop() &&
+ GetRight() > rect.GetLeft() &&
+ GetBottom() > rect.GetTop());
+ }
+
+ static BOOL Union(OUT Rect& c,
+ IN const Rect& a,
+ IN const Rect& b)
+ {
+ INT right = max(a.GetRight(), b.GetRight());
+ INT bottom = max(a.GetBottom(), b.GetBottom());
+ INT left = min(a.GetLeft(), b.GetLeft());
+ INT top = min(a.GetTop(), b.GetTop());
+
+ c.X = left;
+ c.Y = top;
+ c.Width = right - left;
+ c.Height = bottom - top;
+ return !c.IsEmptyArea();
+ }
+
+ VOID Offset(IN const Point& point)
+ {
+ Offset(point.X, point.Y);
+ }
+
+ VOID Offset(IN INT dx,
+ IN INT dy)
+ {
+ X += dx;
+ Y += dy;
+ }
+
+public:
+
+ INT X;
+ INT Y;
+ INT Width;
+ INT Height;
+};
+
+// A user must mange memory for PathData.
+
+class PathData
+{
+public:
+ PathData()
+ {
+ Count = 0;
+ Points = NULL;
+ Types = NULL;
+ }
+
+ ~PathData()
+ {
+ if (Points != NULL)
+ {
+ delete Points;
+ }
+
+ if (Types != NULL)
+ {
+ delete Types;
+ }
+ }
+
+#ifdef DCR_USE_NEW_250932
+
+private:
+ PathData(const PathData &);
+ PathData& operator=(const PathData &);
+
+#endif
+
+public:
+ INT Count;
+ PointF* Points;
+ BYTE* Types;
+};
+
+
+//-----------------------------
+// text character range
+//-----------------------------
+
+class CharacterRange
+{
+public:
+ CharacterRange(
+ INT first,
+ INT length
+ ) :
+ First (first),
+ Length (length)
+ {}
+
+ CharacterRange() : First(0), Length(0)
+ {}
+
+ CharacterRange & operator = (const CharacterRange &rhs)
+ {
+ First = rhs.First;
+ Length = rhs.Length;
+ return *this;
+ }
+
+ INT First;
+ INT Length;
+};
+
+#endif // !_GDIPLUSTYPES_HPP
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusimageAttributes.h b/core/src/fxge/Microsoft SDK/include/GdiPlusimageAttributes.h
index 0a514772bc..26da28c756 100644
--- a/core/src/fxge/Microsoft SDK/include/GdiPlusimageAttributes.h
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusimageAttributes.h
@@ -1,397 +1,397 @@
-/**************************************************************************\
-*
-* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
-*
-* Module Name:
-*
-* Image Attributes
-*
-* Abstract:
-*
-* Class for color adjustment object passed to Graphics.DrawImage
-*
-\**************************************************************************/
-
-#ifndef _GDIPLUSIMAGEATTRIBUTES_H
-#define _GDIPLUSIMAGEATTRIBUTES_H
-
-class GpImageAttributes;
-
-// There are 5 possible sets of color adjustments:
-// ColorAdjustDefault,
-// ColorAdjustBitmap,
-// ColorAdjustBrush,
-// ColorAdjustPen,
-// ColorAdjustText,
-
-// Bitmaps, Brushes, Pens, and Text will all use any color adjustments
-// that have been set into the default ImageAttributes until their own
-// color adjustments have been set. So as soon as any "Set" method is
-// called for Bitmaps, Brushes, Pens, or Text, then they start from
-// scratch with only the color adjustments that have been set for them.
-// Calling Reset removes any individual color adjustments for a type
-// and makes it revert back to using all the default color adjustments
-// (if any). The SetToIdentity method is a way to force a type to
-// have no color adjustments at all, regardless of what previous adjustments
-// have been set for the defaults or for that type.
-
-class ImageAttributes : public GdiplusBase
-{
- friend class Graphics;
- friend class TextureBrush;
-
-public:
-
- ImageAttributes()
- {
- nativeImageAttr = NULL;
- lastResult = DllExports::GdipCreateImageAttributes(&nativeImageAttr);
- }
-
- ~ImageAttributes()
- {
- DllExports::GdipDisposeImageAttributes(nativeImageAttr);
- }
-
- ImageAttributes* Clone() const
- {
- GpImageAttributes* clone;
-
- SetStatus(DllExports::GdipCloneImageAttributes(
- nativeImageAttr,
- &clone));
-
- return new ImageAttributes(clone, lastResult);
- }
-
- // Set to identity, regardless of what the default color adjustment is.
- Status
- SetToIdentity(
- IN ColorAdjustType type = ColorAdjustTypeDefault
- )
- {
- return SetStatus(DllExports::GdipSetImageAttributesToIdentity(
- nativeImageAttr,
- type));
- }
-
- // Remove any individual color adjustments, and go back to using the default
- Status
- Reset(
- IN ColorAdjustType type = ColorAdjustTypeDefault
- )
- {
- return SetStatus(DllExports::GdipResetImageAttributes(
- nativeImageAttr,
- type));
- }
-
- Status
- SetColorMatrix(
- IN const ColorMatrix *colorMatrix,
- IN ColorMatrixFlags mode = ColorMatrixFlagsDefault,
- IN ColorAdjustType type = ColorAdjustTypeDefault
- )
- {
- return SetStatus(DllExports::GdipSetImageAttributesColorMatrix(
- nativeImageAttr,
- type,
- TRUE,
- colorMatrix,
- NULL,
- mode));
- }
-
- Status ClearColorMatrix(
- IN ColorAdjustType type = ColorAdjustTypeDefault
- )
- {
- return SetStatus(DllExports::GdipSetImageAttributesColorMatrix(
- nativeImageAttr,
- type,
- FALSE,
- NULL,
- NULL,
- ColorMatrixFlagsDefault));
- }
-
- Status
- SetColorMatrices(
- IN const ColorMatrix *colorMatrix,
- IN const ColorMatrix *grayMatrix,
- IN ColorMatrixFlags mode = ColorMatrixFlagsDefault,
- IN ColorAdjustType type = ColorAdjustTypeDefault
- )
- {
- return SetStatus(DllExports::GdipSetImageAttributesColorMatrix(
- nativeImageAttr,
- type,
- TRUE,
- colorMatrix,
- grayMatrix,
- mode));
- }
-
- Status ClearColorMatrices(
- IN ColorAdjustType type = ColorAdjustTypeDefault
- )
- {
- return SetStatus(DllExports::GdipSetImageAttributesColorMatrix(
- nativeImageAttr,
- type,
- FALSE,
- NULL,
- NULL,
- ColorMatrixFlagsDefault));
- }
-
- Status SetThreshold(
- IN REAL threshold,
- IN ColorAdjustType type = ColorAdjustTypeDefault
- )
- {
- return SetStatus(DllExports::GdipSetImageAttributesThreshold(
- nativeImageAttr,
- type,
- TRUE,
- threshold));
- }
-
- Status ClearThreshold(
- IN ColorAdjustType type = ColorAdjustTypeDefault
- )
- {
- return SetStatus(DllExports::GdipSetImageAttributesThreshold(
- nativeImageAttr,
- type,
- FALSE,
- 0.0));
- }
-
- Status SetGamma(
- IN REAL gamma,
- IN ColorAdjustType type = ColorAdjustTypeDefault
- )
- {
- return SetStatus(DllExports::GdipSetImageAttributesGamma(
- nativeImageAttr,
- type,
- TRUE,
- gamma));
- }
-
- Status ClearGamma(
- IN ColorAdjustType type = ColorAdjustTypeDefault
- )
- {
- return SetStatus(DllExports::GdipSetImageAttributesGamma(
- nativeImageAttr,
- type,
- FALSE,
- 0.0));
- }
-
- Status SetNoOp(
- IN ColorAdjustType type = ColorAdjustTypeDefault
- )
- {
- return SetStatus(DllExports::GdipSetImageAttributesNoOp(
- nativeImageAttr,
- type,
- TRUE));
- }
-
- Status ClearNoOp(
- IN ColorAdjustType type = ColorAdjustTypeDefault
- )
- {
- return SetStatus(DllExports::GdipSetImageAttributesNoOp(
- nativeImageAttr,
- type,
- FALSE));
- }
-
- Status SetColorKey(
- IN const Color& colorLow,
- IN const Color& colorHigh,
- IN ColorAdjustType type = ColorAdjustTypeDefault
- )
- {
- return SetStatus(DllExports::GdipSetImageAttributesColorKeys(
- nativeImageAttr,
- type,
- TRUE,
- colorLow.GetValue(),
- colorHigh.GetValue()));
- }
-
- Status ClearColorKey(
- IN ColorAdjustType type = ColorAdjustTypeDefault
- )
- {
- return SetStatus(DllExports::GdipSetImageAttributesColorKeys(
- nativeImageAttr,
- type,
- FALSE,
- NULL,
- NULL));
- }
-
- Status SetOutputChannel(
- IN ColorChannelFlags channelFlags,
- IN ColorAdjustType type = ColorAdjustTypeDefault
- )
- {
- return SetStatus(DllExports::GdipSetImageAttributesOutputChannel(
- nativeImageAttr,
- type,
- TRUE,
- channelFlags));
- }
-
- Status ClearOutputChannel(
- IN ColorAdjustType type = ColorAdjustTypeDefault
- )
- {
- return SetStatus(DllExports::GdipSetImageAttributesOutputChannel(
- nativeImageAttr,
- type,
- FALSE,
- ColorChannelFlagsLast));
- }
-
- Status SetOutputChannelColorProfile(
- IN const WCHAR *colorProfileFilename,
- IN ColorAdjustType type = ColorAdjustTypeDefault
- )
- {
- return SetStatus(DllExports::GdipSetImageAttributesOutputChannelColorProfile(
- nativeImageAttr,
- type,
- TRUE,
- colorProfileFilename));
- }
-
- Status ClearOutputChannelColorProfile(
- IN ColorAdjustType type = ColorAdjustTypeDefault
- )
- {
- return SetStatus(DllExports::GdipSetImageAttributesOutputChannelColorProfile(
- nativeImageAttr,
- type,
- FALSE,
- NULL));
- }
-
- Status SetRemapTable(
- IN UINT mapSize,
- IN const ColorMap *map,
- IN ColorAdjustType type = ColorAdjustTypeDefault
- )
- {
- return SetStatus(DllExports::GdipSetImageAttributesRemapTable(
- nativeImageAttr,
- type,
- TRUE,
- mapSize,
- map));
- }
-
- Status ClearRemapTable(
- IN ColorAdjustType type = ColorAdjustTypeDefault
- )
- {
- return SetStatus(DllExports::GdipSetImageAttributesRemapTable(
- nativeImageAttr,
- type,
- FALSE,
- 0,
- NULL));
- }
-
- Status SetBrushRemapTable(IN UINT mapSize,
- IN const ColorMap *map)
- {
- return this->SetRemapTable(mapSize, map, ColorAdjustTypeBrush);
- }
-
- Status ClearBrushRemapTable()
- {
- return this->ClearRemapTable(ColorAdjustTypeBrush);
- }
-
- Status SetWrapMode(IN WrapMode wrap,
- IN const Color& color = Color(),
- IN BOOL clamp = FALSE)
- {
- ARGB argb = color.GetValue();
-
- return SetStatus(DllExports::GdipSetImageAttributesWrapMode(
- nativeImageAttr, wrap, argb, clamp));
- }
-
- #ifndef DCR_USE_NEW_145139
- Status SetICMMode(IN BOOL on)
- {
- on;
- // This is not implemented.
- // The supported method for doing ICM conversion from the embedded
- // ICC profile is to use the Bitmap constructor from a file or stream
- // and specify TRUE for the useIcm parameter. This will cause the
- // image to be ICM converted when it's loaded from the file/stream
- // if the profile exists.
- return SetStatus(NotImplemented);
-// DllExports::GdipSetImageAttributesICMMode(nativeImageAttr, on)
- }
- #endif
-
- // The flags of the palette are ignored.
- Status GetAdjustedPalette(IN OUT ColorPalette* colorPalette,
- IN ColorAdjustType colorAdjustType) const
- {
- return SetStatus(DllExports::GdipGetImageAttributesAdjustedPalette(
- nativeImageAttr, colorPalette, colorAdjustType));
- }
-
- Status GetLastStatus() const
- {
- Status lastStatus = lastResult;
- lastResult = Ok;
-
- return lastStatus;
- }
-
-#ifdef DCR_USE_NEW_250932
-
-private:
- ImageAttributes(const ImageAttributes &);
- ImageAttributes& operator=(const ImageAttributes &);
-
-#endif
-
-protected:
- ImageAttributes(GpImageAttributes* imageAttr, Status status)
- {
- SetNativeImageAttr(imageAttr);
- lastResult = status;
- }
-
- VOID SetNativeImageAttr(GpImageAttributes* nativeImageAttr)
- {
- this->nativeImageAttr = nativeImageAttr;
- }
-
- Status SetStatus(Status status) const
- {
- if (status != Ok)
- return (lastResult = status);
- else
- return status;
- }
-
-protected:
- GpImageAttributes* nativeImageAttr;
- mutable Status lastResult;
-};
-
-#endif
+/**************************************************************************\
+*
+* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
+*
+* Module Name:
+*
+* Image Attributes
+*
+* Abstract:
+*
+* Class for color adjustment object passed to Graphics.DrawImage
+*
+\**************************************************************************/
+
+#ifndef _GDIPLUSIMAGEATTRIBUTES_H
+#define _GDIPLUSIMAGEATTRIBUTES_H
+
+class GpImageAttributes;
+
+// There are 5 possible sets of color adjustments:
+// ColorAdjustDefault,
+// ColorAdjustBitmap,
+// ColorAdjustBrush,
+// ColorAdjustPen,
+// ColorAdjustText,
+
+// Bitmaps, Brushes, Pens, and Text will all use any color adjustments
+// that have been set into the default ImageAttributes until their own
+// color adjustments have been set. So as soon as any "Set" method is
+// called for Bitmaps, Brushes, Pens, or Text, then they start from
+// scratch with only the color adjustments that have been set for them.
+// Calling Reset removes any individual color adjustments for a type
+// and makes it revert back to using all the default color adjustments
+// (if any). The SetToIdentity method is a way to force a type to
+// have no color adjustments at all, regardless of what previous adjustments
+// have been set for the defaults or for that type.
+
+class ImageAttributes : public GdiplusBase
+{
+ friend class Graphics;
+ friend class TextureBrush;
+
+public:
+
+ ImageAttributes()
+ {
+ nativeImageAttr = NULL;
+ lastResult = DllExports::GdipCreateImageAttributes(&nativeImageAttr);
+ }
+
+ ~ImageAttributes()
+ {
+ DllExports::GdipDisposeImageAttributes(nativeImageAttr);
+ }
+
+ ImageAttributes* Clone() const
+ {
+ GpImageAttributes* clone;
+
+ SetStatus(DllExports::GdipCloneImageAttributes(
+ nativeImageAttr,
+ &clone));
+
+ return new ImageAttributes(clone, lastResult);
+ }
+
+ // Set to identity, regardless of what the default color adjustment is.
+ Status
+ SetToIdentity(
+ IN ColorAdjustType type = ColorAdjustTypeDefault
+ )
+ {
+ return SetStatus(DllExports::GdipSetImageAttributesToIdentity(
+ nativeImageAttr,
+ type));
+ }
+
+ // Remove any individual color adjustments, and go back to using the default
+ Status
+ Reset(
+ IN ColorAdjustType type = ColorAdjustTypeDefault
+ )
+ {
+ return SetStatus(DllExports::GdipResetImageAttributes(
+ nativeImageAttr,
+ type));
+ }
+
+ Status
+ SetColorMatrix(
+ IN const ColorMatrix *colorMatrix,
+ IN ColorMatrixFlags mode = ColorMatrixFlagsDefault,
+ IN ColorAdjustType type = ColorAdjustTypeDefault
+ )
+ {
+ return SetStatus(DllExports::GdipSetImageAttributesColorMatrix(
+ nativeImageAttr,
+ type,
+ TRUE,
+ colorMatrix,
+ NULL,
+ mode));
+ }
+
+ Status ClearColorMatrix(
+ IN ColorAdjustType type = ColorAdjustTypeDefault
+ )
+ {
+ return SetStatus(DllExports::GdipSetImageAttributesColorMatrix(
+ nativeImageAttr,
+ type,
+ FALSE,
+ NULL,
+ NULL,
+ ColorMatrixFlagsDefault));
+ }
+
+ Status
+ SetColorMatrices(
+ IN const ColorMatrix *colorMatrix,
+ IN const ColorMatrix *grayMatrix,
+ IN ColorMatrixFlags mode = ColorMatrixFlagsDefault,
+ IN ColorAdjustType type = ColorAdjustTypeDefault
+ )
+ {
+ return SetStatus(DllExports::GdipSetImageAttributesColorMatrix(
+ nativeImageAttr,
+ type,
+ TRUE,
+ colorMatrix,
+ grayMatrix,
+ mode));
+ }
+
+ Status ClearColorMatrices(
+ IN ColorAdjustType type = ColorAdjustTypeDefault
+ )
+ {
+ return SetStatus(DllExports::GdipSetImageAttributesColorMatrix(
+ nativeImageAttr,
+ type,
+ FALSE,
+ NULL,
+ NULL,
+ ColorMatrixFlagsDefault));
+ }
+
+ Status SetThreshold(
+ IN REAL threshold,
+ IN ColorAdjustType type = ColorAdjustTypeDefault
+ )
+ {
+ return SetStatus(DllExports::GdipSetImageAttributesThreshold(
+ nativeImageAttr,
+ type,
+ TRUE,
+ threshold));
+ }
+
+ Status ClearThreshold(
+ IN ColorAdjustType type = ColorAdjustTypeDefault
+ )
+ {
+ return SetStatus(DllExports::GdipSetImageAttributesThreshold(
+ nativeImageAttr,
+ type,
+ FALSE,
+ 0.0));
+ }
+
+ Status SetGamma(
+ IN REAL gamma,
+ IN ColorAdjustType type = ColorAdjustTypeDefault
+ )
+ {
+ return SetStatus(DllExports::GdipSetImageAttributesGamma(
+ nativeImageAttr,
+ type,
+ TRUE,
+ gamma));
+ }
+
+ Status ClearGamma(
+ IN ColorAdjustType type = ColorAdjustTypeDefault
+ )
+ {
+ return SetStatus(DllExports::GdipSetImageAttributesGamma(
+ nativeImageAttr,
+ type,
+ FALSE,
+ 0.0));
+ }
+
+ Status SetNoOp(
+ IN ColorAdjustType type = ColorAdjustTypeDefault
+ )
+ {
+ return SetStatus(DllExports::GdipSetImageAttributesNoOp(
+ nativeImageAttr,
+ type,
+ TRUE));
+ }
+
+ Status ClearNoOp(
+ IN ColorAdjustType type = ColorAdjustTypeDefault
+ )
+ {
+ return SetStatus(DllExports::GdipSetImageAttributesNoOp(
+ nativeImageAttr,
+ type,
+ FALSE));
+ }
+
+ Status SetColorKey(
+ IN const Color& colorLow,
+ IN const Color& colorHigh,
+ IN ColorAdjustType type = ColorAdjustTypeDefault
+ )
+ {
+ return SetStatus(DllExports::GdipSetImageAttributesColorKeys(
+ nativeImageAttr,
+ type,
+ TRUE,
+ colorLow.GetValue(),
+ colorHigh.GetValue()));
+ }
+
+ Status ClearColorKey(
+ IN ColorAdjustType type = ColorAdjustTypeDefault
+ )
+ {
+ return SetStatus(DllExports::GdipSetImageAttributesColorKeys(
+ nativeImageAttr,
+ type,
+ FALSE,
+ NULL,
+ NULL));
+ }
+
+ Status SetOutputChannel(
+ IN ColorChannelFlags channelFlags,
+ IN ColorAdjustType type = ColorAdjustTypeDefault
+ )
+ {
+ return SetStatus(DllExports::GdipSetImageAttributesOutputChannel(
+ nativeImageAttr,
+ type,
+ TRUE,
+ channelFlags));
+ }
+
+ Status ClearOutputChannel(
+ IN ColorAdjustType type = ColorAdjustTypeDefault
+ )
+ {
+ return SetStatus(DllExports::GdipSetImageAttributesOutputChannel(
+ nativeImageAttr,
+ type,
+ FALSE,
+ ColorChannelFlagsLast));
+ }
+
+ Status SetOutputChannelColorProfile(
+ IN const WCHAR *colorProfileFilename,
+ IN ColorAdjustType type = ColorAdjustTypeDefault
+ )
+ {
+ return SetStatus(DllExports::GdipSetImageAttributesOutputChannelColorProfile(
+ nativeImageAttr,
+ type,
+ TRUE,
+ colorProfileFilename));
+ }
+
+ Status ClearOutputChannelColorProfile(
+ IN ColorAdjustType type = ColorAdjustTypeDefault
+ )
+ {
+ return SetStatus(DllExports::GdipSetImageAttributesOutputChannelColorProfile(
+ nativeImageAttr,
+ type,
+ FALSE,
+ NULL));
+ }
+
+ Status SetRemapTable(
+ IN UINT mapSize,
+ IN const ColorMap *map,
+ IN ColorAdjustType type = ColorAdjustTypeDefault
+ )
+ {
+ return SetStatus(DllExports::GdipSetImageAttributesRemapTable(
+ nativeImageAttr,
+ type,
+ TRUE,
+ mapSize,
+ map));
+ }
+
+ Status ClearRemapTable(
+ IN ColorAdjustType type = ColorAdjustTypeDefault
+ )
+ {
+ return SetStatus(DllExports::GdipSetImageAttributesRemapTable(
+ nativeImageAttr,
+ type,
+ FALSE,
+ 0,
+ NULL));
+ }
+
+ Status SetBrushRemapTable(IN UINT mapSize,
+ IN const ColorMap *map)
+ {
+ return this->SetRemapTable(mapSize, map, ColorAdjustTypeBrush);
+ }
+
+ Status ClearBrushRemapTable()
+ {
+ return this->ClearRemapTable(ColorAdjustTypeBrush);
+ }
+
+ Status SetWrapMode(IN WrapMode wrap,
+ IN const Color& color = Color(),
+ IN BOOL clamp = FALSE)
+ {
+ ARGB argb = color.GetValue();
+
+ return SetStatus(DllExports::GdipSetImageAttributesWrapMode(
+ nativeImageAttr, wrap, argb, clamp));
+ }
+
+ #ifndef DCR_USE_NEW_145139
+ Status SetICMMode(IN BOOL on)
+ {
+ on;
+ // This is not implemented.
+ // The supported method for doing ICM conversion from the embedded
+ // ICC profile is to use the Bitmap constructor from a file or stream
+ // and specify TRUE for the useIcm parameter. This will cause the
+ // image to be ICM converted when it's loaded from the file/stream
+ // if the profile exists.
+ return SetStatus(NotImplemented);
+// DllExports::GdipSetImageAttributesICMMode(nativeImageAttr, on)
+ }
+ #endif
+
+ // The flags of the palette are ignored.
+ Status GetAdjustedPalette(IN OUT ColorPalette* colorPalette,
+ IN ColorAdjustType colorAdjustType) const
+ {
+ return SetStatus(DllExports::GdipGetImageAttributesAdjustedPalette(
+ nativeImageAttr, colorPalette, colorAdjustType));
+ }
+
+ Status GetLastStatus() const
+ {
+ Status lastStatus = lastResult;
+ lastResult = Ok;
+
+ return lastStatus;
+ }
+
+#ifdef DCR_USE_NEW_250932
+
+private:
+ ImageAttributes(const ImageAttributes &);
+ ImageAttributes& operator=(const ImageAttributes &);
+
+#endif
+
+protected:
+ ImageAttributes(GpImageAttributes* imageAttr, Status status)
+ {
+ SetNativeImageAttr(imageAttr);
+ lastResult = status;
+ }
+
+ VOID SetNativeImageAttr(GpImageAttributes* nativeImageAttr)
+ {
+ this->nativeImageAttr = nativeImageAttr;
+ }
+
+ Status SetStatus(Status status) const
+ {
+ if (status != Ok)
+ return (lastResult = status);
+ else
+ return status;
+ }
+
+protected:
+ GpImageAttributes* nativeImageAttr;
+ mutable Status lastResult;
+};
+
+#endif
diff --git a/core/src/fxge/Microsoft SDK/include/GdiplusInit.h b/core/src/fxge/Microsoft SDK/include/GdiplusInit.h
index 3320fa4b7e..48516d63d5 100644
--- a/core/src/fxge/Microsoft SDK/include/GdiplusInit.h
+++ b/core/src/fxge/Microsoft SDK/include/GdiplusInit.h
@@ -1,104 +1,104 @@
-/**************************************************************************
-*
-* Copyright (c) 2000 Microsoft Corporation
-*
-* Module Name:
-*
-* Gdiplus init
-*
-* Abstract:
-*
-* GDI+ startup/shutdown API's
-*
-* Created:
-*
-* 09/02/2000 agodfrey
-* Created it.
-*
-**************************************************************************/
-
-#ifndef _GDIPLUSINIT_H
-#define _GDIPLUSINIT_H
-//************************************************************************
-#if _FX_COMPILER_ == _FX_VC6_
-typedef unsigned long ULONG_PTR, *PULONG_PTR; //johnson add here.
-#endif
-//************************************************************************
-
-// Used for debug event notification (debug builds only)
-
-enum DebugEventLevel
-{
- DebugEventLevelFatal,
- DebugEventLevelWarning
-};
-
-// Callback function that GDI+ can call, on debug builds, for assertions
-// and warnings.
-
-typedef VOID (WINAPI *DebugEventProc)(DebugEventLevel level, CHAR *message);
-
-// Notification functions which the user must call appropriately if
-// "SuppressBackgroundThread" (below) is set.
-
-typedef Status (WINAPI *NotificationHookProc)(OUT ULONG_PTR *token);
-typedef VOID (WINAPI *NotificationUnhookProc)(ULONG_PTR token);
-
-// Input structure for GdiplusStartup()
-
-struct GdiplusStartupInput
-{
- UINT32 GdiplusVersion; // Must be 1
- DebugEventProc DebugEventCallback; // Ignored on free builds
- BOOL SuppressBackgroundThread; // FALSE unless you're prepared to call
- // the hook/unhook functions properly
- BOOL SuppressExternalCodecs; // FALSE unless you want GDI+ only to use
- // its internal image codecs.
-
- GdiplusStartupInput(
- DebugEventProc debugEventCallback = NULL,
- BOOL suppressBackgroundThread = FALSE,
- BOOL suppressExternalCodecs = FALSE)
- {
- GdiplusVersion = 1;
- DebugEventCallback = debugEventCallback;
- SuppressBackgroundThread = suppressBackgroundThread;
- SuppressExternalCodecs = suppressExternalCodecs;
- }
-};
-
-// Output structure for GdiplusStartup()
-
-struct GdiplusStartupOutput
-{
- // The following 2 fields are NULL if SuppressBackgroundThread is FALSE.
- // Otherwise, they are functions which must be called appropriately to
- // replace the background thread.
- //
- // These should be called on the application's main message loop - i.e.
- // a message loop which is active for the lifetime of GDI+.
- // "NotificationHook" should be called before starting the loop,
- // and "NotificationUnhook" should be called after the loop ends.
-
- NotificationHookProc NotificationHook;
- NotificationUnhookProc NotificationUnhook;
-};
-
-// GDI+ initialization. Must be called before GDI+ API's are used.
-//
-// token - may not be NULL - accepts a token to be passed in the corresponding
-// GdiplusShutdown call.
-// input - may not be NULL
-// output - may be NULL only if input->SuppressBackgroundThread is FALSE.
-
-extern "C" Status WINAPI GdiplusStartup(
- OUT ULONG_PTR *token,
- const GdiplusStartupInput *input,
- OUT GdiplusStartupOutput *output);
-
-// GDI+ termination. Must be called before GDI+ is unloaded. GDI+ API's may not
-// be called after this.
-
-extern "C" VOID WINAPI GdiplusShutdown(ULONG_PTR token);
-
-#endif
+/**************************************************************************
+*
+* Copyright (c) 2000 Microsoft Corporation
+*
+* Module Name:
+*
+* Gdiplus init
+*
+* Abstract:
+*
+* GDI+ startup/shutdown API's
+*
+* Created:
+*
+* 09/02/2000 agodfrey
+* Created it.
+*
+**************************************************************************/
+
+#ifndef _GDIPLUSINIT_H
+#define _GDIPLUSINIT_H
+//************************************************************************
+#if _FX_COMPILER_ == _FX_VC6_
+typedef unsigned long ULONG_PTR, *PULONG_PTR; //johnson add here.
+#endif
+//************************************************************************
+
+// Used for debug event notification (debug builds only)
+
+enum DebugEventLevel
+{
+ DebugEventLevelFatal,
+ DebugEventLevelWarning
+};
+
+// Callback function that GDI+ can call, on debug builds, for assertions
+// and warnings.
+
+typedef VOID (WINAPI *DebugEventProc)(DebugEventLevel level, CHAR *message);
+
+// Notification functions which the user must call appropriately if
+// "SuppressBackgroundThread" (below) is set.
+
+typedef Status (WINAPI *NotificationHookProc)(OUT ULONG_PTR *token);
+typedef VOID (WINAPI *NotificationUnhookProc)(ULONG_PTR token);
+
+// Input structure for GdiplusStartup()
+
+struct GdiplusStartupInput
+{
+ UINT32 GdiplusVersion; // Must be 1
+ DebugEventProc DebugEventCallback; // Ignored on free builds
+ BOOL SuppressBackgroundThread; // FALSE unless you're prepared to call
+ // the hook/unhook functions properly
+ BOOL SuppressExternalCodecs; // FALSE unless you want GDI+ only to use
+ // its internal image codecs.
+
+ GdiplusStartupInput(
+ DebugEventProc debugEventCallback = NULL,
+ BOOL suppressBackgroundThread = FALSE,
+ BOOL suppressExternalCodecs = FALSE)
+ {
+ GdiplusVersion = 1;
+ DebugEventCallback = debugEventCallback;
+ SuppressBackgroundThread = suppressBackgroundThread;
+ SuppressExternalCodecs = suppressExternalCodecs;
+ }
+};
+
+// Output structure for GdiplusStartup()
+
+struct GdiplusStartupOutput
+{
+ // The following 2 fields are NULL if SuppressBackgroundThread is FALSE.
+ // Otherwise, they are functions which must be called appropriately to
+ // replace the background thread.
+ //
+ // These should be called on the application's main message loop - i.e.
+ // a message loop which is active for the lifetime of GDI+.
+ // "NotificationHook" should be called before starting the loop,
+ // and "NotificationUnhook" should be called after the loop ends.
+
+ NotificationHookProc NotificationHook;
+ NotificationUnhookProc NotificationUnhook;
+};
+
+// GDI+ initialization. Must be called before GDI+ API's are used.
+//
+// token - may not be NULL - accepts a token to be passed in the corresponding
+// GdiplusShutdown call.
+// input - may not be NULL
+// output - may be NULL only if input->SuppressBackgroundThread is FALSE.
+
+extern "C" Status WINAPI GdiplusStartup(
+ OUT ULONG_PTR *token,
+ const GdiplusStartupInput *input,
+ OUT GdiplusStartupOutput *output);
+
+// GDI+ termination. Must be called before GDI+ is unloaded. GDI+ API's may not
+// be called after this.
+
+extern "C" VOID WINAPI GdiplusShutdown(ULONG_PTR token);
+
+#endif
diff --git a/core/src/fxge/Microsoft SDK/include/sal.h b/core/src/fxge/Microsoft SDK/include/sal.h
index 136996974a..07234950cd 100644
--- a/core/src/fxge/Microsoft SDK/include/sal.h
+++ b/core/src/fxge/Microsoft SDK/include/sal.h
@@ -1,729 +1,729 @@
-/***
-*sal.h - markers for documenting the semantics of APIs
-*
-* Copyright (c) Microsoft Corporation. All rights reserved.
-*
-*Purpose:
-* sal.h provides a set of annotations to describe how a function uses its
-* parameters - the assumptions it makes about them, and the guarantees it makes
-* upon finishing.
-*
-* [Public]
-*
-****/
-
-/*
- -------------------------------------------------------------------------------
- Introduction
-
- sal.h provides a set of annotations to describe how a function uses its
- parameters - the assumptions it makes about them, and the guarantees it makes
- upon finishing.
-
- Annotations may be placed before either a function parameter's type or its return
- type, and describe the function's behavior regarding the parameter or return value.
- There are two classes of annotations: buffer annotations and advanced annotations.
- Buffer annotations describe how functions use their pointer parameters, and
- advanced annotations either describe complex/unusual buffer behavior, or provide
- additional information about a parameter that is not otherwise expressible.
-
- -------------------------------------------------------------------------------
- Buffer Annotations
-
- The most important annotations in sal.h provide a consistent way to annotate
- buffer parameters or return values for a function. Each of these annotations describes
- a single buffer (which could be a string, a fixed-length or variable-length array,
- or just a pointer) that the function interacts with: where it is, how large it is,
- how much is initialized, and what the function does with it.
-
- The appropriate macro for a given buffer can be constructed using the table below.
- Just pick the appropriate values from each category, and combine them together
- with a leading underscore. Some combinations of values do not make sense as buffer
- annotations. Only meaningful annotations can be added to your code; for a list of
- these, see the buffer annotation definitions section.
-
- Only a single buffer annotation should be used for each parameter.
-
- |------------|------------|---------|--------|----------|----------|---------------|
- | Level | Usage | Size | Output | NullTerm | Optional | Parameters |
- |------------|------------|---------|--------|----------|----------|---------------|
- | <> | <> | <> | <> | _z | <> | <> |
- | _deref | _in | _ecount | _full | _nz | _opt | (size) |
- | _deref_opt | _out | _bcount | _part | | | (size,length) |
- | | _inout | | | | | |
- | | | | | | | |
- |------------|------------|---------|--------|----------|----------|---------------|
-
- Level: Describes the buffer pointer's level of indirection from the parameter or
- return value 'p'.
-
- <> : p is the buffer pointer.
- _deref : *p is the buffer pointer. p must not be NULL.
- _deref_opt : *p may be the buffer pointer. p may be NULL, in which case the rest of
- the annotation is ignored.
-
- Usage: Describes how the function uses the buffer.
-
- <> : The buffer is not accessed. If used on the return value or with _deref, the
- function will provide the buffer, and it will be uninitialized at exit.
- Otherwise, the caller must provide the buffer. This should only be used
- for alloc and free functions.
- _in : The function will only read from the buffer. The caller must provide the
- buffer and initialize it. Cannot be used with _deref.
- _out : The function will only write to the buffer. If used on the return value or
- with _deref, the function will provide the buffer and initialize it.
- Otherwise, the caller must provide the buffer, and the function will
- initialize it.
- _inout : The function may freely read from and write to the buffer. The caller must
- provide the buffer and initialize it. If used with _deref, the buffer may
- be reallocated by the function.
-
- Size: Describes the total size of the buffer. This may be less than the space actually
- allocated for the buffer, in which case it describes the accessible amount.
-
- <> : No buffer size is given. If the type specifies the buffer size (such as
- with LPSTR and LPWSTR), that amount is used. Otherwise, the buffer is one
- element long. Must be used with _in, _out, or _inout.
- _ecount : The buffer size is an explicit element count.
- _bcount : The buffer size is an explicit byte count.
-
- Output: Describes how much of the buffer will be initialized by the function. For
- _inout buffers, this also describes how much is initialized at entry. Omit this
- category for _in buffers; they must be fully initialized by the caller.
-
- <> : The type specifies how much is initialized. For instance, a function initializing
- an LPWSTR must NULL-terminate the string.
- _full : The function initializes the entire buffer.
- _part : The function initializes part of the buffer, and explicitly indicates how much.
-
- NullTerm: States if the present of a '\0' marks the end of valid elements in the buffer.
- _z : A '\0' indicated the end of the buffer
- _nz : The buffer may not be null terminated and a '\0' does not indicate the end of the
- buffer.
- Optional: Describes if the buffer itself is optional.
-
- <> : The pointer to the buffer must not be NULL.
- _opt : The pointer to the buffer might be NULL. It will be checked before being dereferenced.
-
- Parameters: Gives explicit counts for the size and length of the buffer.
-
- <> : There is no explicit count. Use when neither _ecount nor _bcount is used.
- (size) : Only the buffer's total size is given. Use with _ecount or _bcount but not _part.
- (size,length) : The buffer's total size and initialized length are given. Use with _ecount_part
- and _bcount_part.
-
- -------------------------------------------------------------------------------
- Buffer Annotation Examples
-
- LWSTDAPI_(BOOL) StrToIntExA(
- LPCSTR pszString, -- No annotation required, const implies __in.
- DWORD dwFlags,
- __out int *piRet -- A pointer whose dereference will be filled in.
- );
-
- void MyPaintingFunction(
- __in HWND hwndControl, -- An initialized read-only parameter.
- __in_opt HDC hdcOptional, -- An initialized read-only parameter that might be NULL.
- __inout IPropertyStore *ppsStore -- An initialized parameter that may be freely used
- -- and modified.
- );
-
- LWSTDAPI_(BOOL) PathCompactPathExA(
- __out_ecount(cchMax) LPSTR pszOut, -- A string buffer with cch elements that will
- -- be NULL terminated on exit.
- LPCSTR pszSrc, -- No annotation required, const implies __in.
- UINT cchMax,
- DWORD dwFlags
- );
-
- HRESULT SHLocalAllocBytes(
- size_t cb,
- __deref_bcount(cb) T **ppv -- A pointer whose dereference will be set to an
- -- uninitialized buffer with cb bytes.
- );
-
- __inout_bcount_full(cb) : A buffer with cb elements that is fully initialized at
- entry and exit, and may be written to by this function.
-
- __out_ecount_part(count, *countOut) : A buffer with count elements that will be
- partially initialized by this function. The function indicates how much it
- initialized by setting *countOut.
-
- -------------------------------------------------------------------------------
- Advanced Annotations
-
- Advanced annotations describe behavior that is not expressible with the regular
- buffer macros. These may be used either to annotate buffer parameters that involve
- complex or conditional behavior, or to enrich existing annotations with additional
- information.
-
- __success(expr) f :
- <expr> indicates whether function f succeeded or not. If <expr> is true at exit,
- all the function's guarantees (as given by other annotations) must hold. If <expr>
- is false at exit, the caller should not expect any of the function's guarantees
- to hold. If not used, the function must always satisfy its guarantees. Added
- automatically to functions that indicate success in standard ways, such as by
- returning an HRESULT.
-
- __nullterminated p :
- Pointer p is a buffer that may be read or written up to and including the first
- NULL character or pointer. May be used on typedefs, which marks valid (properly
- initialized) instances of that type as being NULL-terminated.
-
- __nullnullterminated p :
- Pointer p is a buffer that may be read or written up to and including the first
- sequence of two NULL characters or pointers. May be used on typedefs, which marks
- valid instances of that type as being double-NULL terminated.
-
- __reserved v :
- Value v must be 0/NULL, reserved for future use.
-
- __checkReturn v :
- Return value v must not be ignored by callers of this function.
-
- __typefix(ctype) v :
- Value v should be treated as an instance of ctype, rather than its declared type.
-
- __override f :
- Specify C#-style 'override' behaviour for overriding virtual methods.
-
- __callback f :
- Function f can be used as a function pointer.
-
- __format_string p :
- Pointer p is a string that contains % markers in the style of printf.
-
- __blocksOn(resource) f :
- Function f blocks on the resource 'resource'.
-
- __fallthrough :
- Annotates switch statement labels where fall-through is desired, to distinguish
- from forgotten break statements.
-
- -------------------------------------------------------------------------------
- Advanced Annotation Examples
-
- __success(return == TRUE) LWSTDAPI_(BOOL)
- PathCanonicalizeA(__out_ecount(MAX_PATH) LPSTR pszBuf, LPCSTR pszPath) :
- pszBuf is only guaranteed to be NULL-terminated when TRUE is returned.
-
- typedef __nullterminated WCHAR* LPWSTR : Initialized LPWSTRs are NULL-terminated strings.
-
- __out_ecount(cch) __typefix(LPWSTR) void *psz : psz is a buffer parameter which will be
- a NULL-terminated WCHAR string at exit, and which initially contains cch WCHARs.
-
- -------------------------------------------------------------------------------
-*/
-
-#pragma once
-
-#define __specstrings
-
-#ifdef __cplusplus
-#ifndef __nothrow
-# define __nothrow __declspec(nothrow)
-#endif
-extern "C" {
-#else
-#ifndef __nothrow
-# define __nothrow
-#endif
-#endif /* #ifdef __cplusplus */
-
-/*
- -------------------------------------------------------------------------------
- Helper Macro Definitions
-
- These express behavior common to many of the high-level annotations.
- DO NOT USE THESE IN YOUR CODE.
- -------------------------------------------------------------------------------
-*/
-
-/*
-The helper annotations are only understood by the compiler version used by various
-defect detection tools. When the regular compiler is running, they are defined into
-nothing, and do not affect the compiled code.
-*/
-
-#if !defined(__midl) && defined(_PREFAST_)
-
- /*
- In the primitive __declspec("SAL_*") annotations "SAL" stands for Standard
- Annotation Language. These __declspec("SAL_*") annotations are the
- primitives the compiler understands and all high-level SpecString MACROs
- will decompose into these primivates.
- */
-
- #define SPECSTRINGIZE( x ) #x
-
- /*
- __null p
- __notnull p
- __maybenull p
-
- Annotates a pointer p. States that pointer p is null. Commonly used
- in the negated form __notnull or the possibly null form __maybenull.
- */
-
- #define __null __declspec("SAL_null")
- #define __notnull __declspec("SAL_notnull")
- #define __maybenull __declspec("SAL_maybenull")
-
- /*
- __readonly l
- __notreadonly l
- __mabyereadonly l
-
- Annotates a location l. States that location l is not modified after
- this point. If the annotation is placed on the precondition state of
- a function, the restriction only applies until the postcondition state
- of the function. __maybereadonly states that the annotated location
- may be modified, whereas __notreadonly states that a location must be
- modified.
- */
-
- #define __readonly __declspec("SAL_readonly")
- #define __notreadonly __declspec("SAL_notreadonly")
- #define __maybereadonly __declspec("SAL_maybereadonly")
-
- /*
- __valid v
- __notvalid v
- __maybevalid v
-
- Annotates any value v. States that the value satisfies all properties of
- valid values of its type. For example, for a string buffer, valid means
- that the buffer pointer is either NULL or points to a NULL-terminated string.
- */
-
- #define __valid __declspec("SAL_valid")
- #define __notvalid __declspec("SAL_notvalid")
- #define __maybevalid __declspec("SAL_maybevalid")
-
- /*
- __readableTo(extent) p
-
- Annotates a buffer pointer p. If the buffer can be read, extent describes
- how much of the buffer is readable. For a reader of the buffer, this is
- an explicit permission to read up to that amount, rather than a restriction to
- read only up to it.
- */
-
- #define __readableTo(extent) __declspec("SAL_readableTo("SPECSTRINGIZE(extent)")")
-
- /*
-
- __elem_readableTo(size)
-
- Annotates a buffer pointer p as being readable to size elements.
- */
-
- #define __elem_readableTo(size) __declspec("SAL_readableTo(elementCount("SPECSTRINGIZE(size)"))")
-
- /*
- __byte_readableTo(size)
-
- Annotates a buffer pointer p as being readable to size bytes.
- */
- #define __byte_readableTo(size) __declspec("SAL_readableTo(byteCount("SPECSTRINGIZE(size)"))")
-
- /*
- __writableTo(extent) p
-
- Annotates a buffer pointer p. If the buffer can be modified, extent
- describes how much of the buffer is writable (usually the allocation
- size). For a writer of the buffer, this is an explicit permission to
- write up to that amount, rather than a restriction to write only up to it.
- */
- #define __writableTo(size) __declspec("SAL_writableTo("SPECSTRINGIZE(size)")")
-
- /*
- __elem_writableTo(size)
-
- Annotates a buffer pointer p as being writable to size elements.
- */
- #define __elem_writableTo(size) __declspec("SAL_writableTo(elementCount("SPECSTRINGIZE(size)"))")
-
- /*
- __byte_writableTo(size)
-
- Annotates a buffer pointer p as being writable to size bytes.
- */
- #define __byte_writableTo(size) __declspec("SAL_writableTo(byteCount("SPECSTRINGIZE(size)"))")
-
- /*
- __deref p
-
- Annotates a pointer p. The next annotation applies one dereference down
- in the type. If readableTo(p, size) then the next annotation applies to
- all elements *(p+i) for which i satisfies the size. If p is a pointer
- to a struct, the next annotation applies to all fields of the struct.
- */
- #define __deref __declspec("SAL_deref")
-
- /*
- __pre __next_annotation
-
- The next annotation applies in the precondition state
- */
- #define __pre __declspec("SAL_pre")
-
- /*
- __post __next_annotation
-
- The next annotation applies in the postcondition state
- */
- #define __post __declspec("SAL_post")
-
- /*
- __precond(<expr>)
-
- When <expr> is true, the next annotation applies in the precondition state
- (currently not enabled)
- */
- #define __precond(expr) __pre
-
- /*
- __postcond(<expr>)
-
- When <expr> is true, the next annotation applies in the postcondition state
- (currently not enabled)
- */
- #define __postcond(expr) __post
-
- /*
- __exceptthat
-
- Given a set of annotations Q containing __exceptthat maybeP, the effect of
- the except clause is to erase any P or notP annotations (explicit or
- implied) within Q at the same level of dereferencing that the except
- clause appears, and to replace it with maybeP.
-
- Example 1: __valid __exceptthat __maybenull on a pointer p means that the
- pointer may be null, and is otherwise valid, thus overriding
- the implicit notnull annotation implied by __valid on
- pointers.
-
- Example 2: __valid __deref __exceptthat __maybenull on an int **p means
- that p is not null (implied by valid), but the elements
- pointed to by p could be null, and are otherwise valid.
- */
- #define __exceptthat __declspec("SAL_except")
- #define __execeptthat __exceptthat
-
- /*
- _refparam
-
- Added to all out parameter macros to indicate that they are all reference
- parameters.
- */
- #define __refparam __deref __notreadonly
-
- /*
- __inner_*
-
- Helper macros that directly correspond to certain high-level annotations.
-
- */
-
- /*
- Macros to classify the entrypoints and indicate their category.
-
- Pre-defined control point categories include: RPC, LPC, DeviceDriver, UserToKernel, ISAPI, COM.
-
- */
- #define __inner_control_entrypoint(category) __declspec("SAL_entrypoint(controlEntry, "SPECSTRINGIZE(category)")")
-
- /*
- Pre-defined data entry point categories include: Registry, File, Network.
- */
- #define __inner_data_entrypoint(category) __declspec("SAL_entrypoint(dataEntry, "SPECSTRINGIZE(category)")")
-
- #define __inner_success(expr) __declspec("SAL_success("SPECSTRINGIZE(expr)")")
- #define __inner_checkReturn __declspec("SAL_checkReturn")
- #define __inner_typefix(ctype) __declspec("SAL_typefix("SPECSTRINGIZE(ctype)")")
- #define __inner_override __declspec("__override")
- #define __inner_callback __declspec("__callback")
- #define __inner_blocksOn(resource) __declspec("SAL_blocksOn("SPECSTRINGIZE(resource)")")
- #define __inner_fallthrough_dec __inline __nothrow void __FallThrough() {}
- #define __inner_fallthrough __FallThrough();
-
-#else
- #define __null
- #define __notnull
- #define __maybenull
- #define __readonly
- #define __notreadonly
- #define __maybereadonly
- #define __valid
- #define __notvalid
- #define __maybevalid
- #define __readableTo(extent)
- #define __elem_readableTo(size)
- #define __byte_readableTo(size)
- #define __writableTo(size)
- #define __elem_writableTo(size)
- #define __byte_writableTo(size)
- #define __deref
- #define __pre
- #define __post
- #define __precond(expr)
- #define __postcond(expr)
- #define __exceptthat
- #define __execeptthat
- #define __inner_success(expr)
- #define __inner_checkReturn
- #define __inner_typefix(ctype)
- #define __inner_override
- #define __inner_callback
- #define __inner_blocksOn(resource)
- #define __inner_fallthrough_dec
- #define __inner_fallthrough
- #define __refparam
- #define __inner_control_entrypoint(category)
- #define __inner_data_entrypoint(category)
-#endif /* #if !defined(__midl) && defined(_PREFAST_) */
-
-/*
--------------------------------------------------------------------------------
-Buffer Annotation Definitions
-
-Any of these may be used to directly annotate functions, but only one should
-be used for each parameter. To determine which annotation to use for a given
-buffer, use the table in the buffer annotations section.
--------------------------------------------------------------------------------
-*/
-
-#define __ecount(size) __notnull __elem_writableTo(size)
-#define __bcount(size) __notnull __byte_writableTo(size)
-#define __in __pre __valid __pre __deref __readonly
-#define __in_ecount(size) __in __pre __elem_readableTo(size)
-#define __in_bcount(size) __in __pre __byte_readableTo(size)
-#define __in_z __in __pre __nullterminated
-#define __in_ecount_z(size) __in_ecount(size) __pre __nullterminated
-#define __in_bcount_z(size) __in_bcount(size) __pre __nullterminated
-#define __in_nz __in
-#define __in_ecount_nz(size) __in_ecount(size)
-#define __in_bcount_nz(size) __in_bcount(size)
-#define __out __ecount(1) __post __valid __refparam
-#define __out_ecount(size) __ecount(size) __post __valid __refparam
-#define __out_bcount(size) __bcount(size) __post __valid __refparam
-#define __out_ecount_part(size,length) __out_ecount(size) __post __elem_readableTo(length)
-#define __out_bcount_part(size,length) __out_bcount(size) __post __byte_readableTo(length)
-#define __out_ecount_full(size) __out_ecount_part(size,size)
-#define __out_bcount_full(size) __out_bcount_part(size,size)
-#define __out_z __post __valid __refparam __post __nullterminated
-#define __out_z_opt __post __valid __refparam __post __nullterminated __exceptthat __maybenull
-#define __out_ecount_z(size) __ecount(size) __post __valid __refparam __post __nullterminated
-#define __out_bcount_z(size) __bcount(size) __post __valid __refparam __post __nullterminated
-#define __out_ecount_part_z(size,length) __out_ecount_part(size,length) __post __nullterminated
-#define __out_bcount_part_z(size,length) __out_bcount_part(size,length) __post __nullterminated
-#define __out_ecount_full_z(size) __out_ecount_full(size) __post __nullterminated
-#define __out_bcount_full_z(size) __out_bcount_full(size) __post __nullterminated
-#define __out_nz __post __valid __refparam __post
-#define __out_nz_opt __post __valid __refparam __post __exceptthat __maybenull
-#define __out_ecount_nz(size) __ecount(size) __post __valid __refparam
-#define __out_bcount_nz(size) __bcount(size) __post __valid __refparam
-#define __inout __pre __valid __post __valid __refparam
-#define __inout_ecount(size) __out_ecount(size) __pre __valid
-#define __inout_bcount(size) __out_bcount(size) __pre __valid
-#define __inout_ecount_part(size,length) __out_ecount_part(size,length) __pre __valid __pre __elem_readableTo(length)
-#define __inout_bcount_part(size,length) __out_bcount_part(size,length) __pre __valid __pre __byte_readableTo(length)
-#define __inout_ecount_full(size) __inout_ecount_part(size,size)
-#define __inout_bcount_full(size) __inout_bcount_part(size,size)
-#define __inout_z __inout __pre __nullterminated __post __nullterminated
-#define __inout_ecount_z(size) __inout_ecount(size) __pre __nullterminated __post __nullterminated
-#define __inout_bcount_z(size) __inout_bcount(size) __pre __nullterminated __post __nullterminated
-#define __inout_nz __inout
-#define __inout_ecount_nz(size) __inout_ecount(size)
-#define __inout_bcount_nz(size) __inout_bcount(size)
-#define __ecount_opt(size) __ecount(size) __exceptthat __maybenull
-#define __bcount_opt(size) __bcount(size) __exceptthat __maybenull
-#define __in_opt __in __exceptthat __maybenull
-#define __in_ecount_opt(size) __in_ecount(size) __exceptthat __maybenull
-#define __in_bcount_opt(size) __in_bcount(size) __exceptthat __maybenull
-#define __in_z_opt __in_opt __pre __nullterminated
-#define __in_ecount_z_opt(size) __in_ecount_opt(size) __pre __nullterminated
-#define __in_bcount_z_opt(size) __in_bcount_opt(size) __pre __nullterminated
-#define __in_nz_opt __in_opt
-#define __in_ecount_nz_opt(size) __in_ecount_opt(size)
-#define __in_bcount_nz_opt(size) __in_bcount_opt(size)
-#define __out_opt __out __exceptthat __maybenull
-#define __out_ecount_opt(size) __out_ecount(size) __exceptthat __maybenull
-#define __out_bcount_opt(size) __out_bcount(size) __exceptthat __maybenull
-#define __out_ecount_part_opt(size,length) __out_ecount_part(size,length) __exceptthat __maybenull
-#define __out_bcount_part_opt(size,length) __out_bcount_part(size,length) __exceptthat __maybenull
-#define __out_ecount_full_opt(size) __out_ecount_full(size) __exceptthat __maybenull
-#define __out_bcount_full_opt(size) __out_bcount_full(size) __exceptthat __maybenull
-#define __out_ecount_z_opt(size) __out_ecount_opt(size) __post __nullterminated
-#define __out_bcount_z_opt(size) __out_bcount_opt(size) __post __nullterminated
-#define __out_ecount_part_z_opt(size,length) __out_ecount_part_opt(size,length) __post __nullterminated
-#define __out_bcount_part_z_opt(size,length) __out_bcount_part_opt(size,length) __post __nullterminated
-#define __out_ecount_full_z_opt(size) __out_ecount_full_opt(size) __post __nullterminated
-#define __out_bcount_full_z_opt(size) __out_bcount_full_opt(size) __post __nullterminated
-#define __out_ecount_nz_opt(size) __out_ecount_opt(size) __post __nullterminated
-#define __out_bcount_nz_opt(size) __out_bcount_opt(size) __post __nullterminated
-#define __inout_opt __inout __exceptthat __maybenull
-#define __inout_ecount_opt(size) __inout_ecount(size) __exceptthat __maybenull
-#define __inout_bcount_opt(size) __inout_bcount(size) __exceptthat __maybenull
-#define __inout_ecount_part_opt(size,length) __inout_ecount_part(size,length) __exceptthat __maybenull
-#define __inout_bcount_part_opt(size,length) __inout_bcount_part(size,length) __exceptthat __maybenull
-#define __inout_ecount_full_opt(size) __inout_ecount_full(size) __exceptthat __maybenull
-#define __inout_bcount_full_opt(size) __inout_bcount_full(size) __exceptthat __maybenull
-#define __inout_z_opt __inout_opt __pre __nullterminated __post __nullterminated
-#define __inout_ecount_z_opt(size) __inout_ecount_opt(size) __pre __nullterminated __post __nullterminated
-#define __inout_ecount_z_opt(size) __inout_ecount_opt(size) __pre __nullterminated __post __nullterminated
-#define __inout_bcount_z_opt(size) __inout_bcount_opt(size)
-#define __inout_nz_opt __inout_opt
-#define __inout_ecount_nz_opt(size) __inout_ecount_opt(size)
-#define __inout_bcount_nz_opt(size) __inout_bcount_opt(size)
-#define __deref_ecount(size) __ecount(1) __post __elem_readableTo(1) __post __deref __notnull __post __deref __elem_writableTo(size)
-#define __deref_bcount(size) __ecount(1) __post __elem_readableTo(1) __post __deref __notnull __post __deref __byte_writableTo(size)
-#define __deref_out __deref_ecount(1) __post __deref __valid __refparam
-#define __deref_out_ecount(size) __deref_ecount(size) __post __deref __valid __refparam
-#define __deref_out_bcount(size) __deref_bcount(size) __post __deref __valid __refparam
-#define __deref_out_ecount_part(size,length) __deref_out_ecount(size) __post __deref __elem_readableTo(length)
-#define __deref_out_bcount_part(size,length) __deref_out_bcount(size) __post __deref __byte_readableTo(length)
-#define __deref_out_ecount_full(size) __deref_out_ecount_part(size,size)
-#define __deref_out_bcount_full(size) __deref_out_bcount_part(size,size)
-#define __deref_out_z __post __deref __valid __refparam __post __deref __nullterminated
-#define __deref_out_ecount_z(size) __deref_out_ecount(size) __post __deref __nullterminated
-#define __deref_out_bcount_z(size) __deref_out_ecount(size) __post __deref __nullterminated
-#define __deref_out_nz __deref_out
-#define __deref_out_ecount_nz(size) __deref_out_ecount(size)
-#define __deref_out_bcount_nz(size) __deref_out_ecount(size)
-#define __deref_inout __notnull __elem_readableTo(1) __pre __deref __valid __post __deref __valid __refparam
-#define __deref_inout_z __deref_inout __pre __deref __nullterminated __post __deref __nullterminated
-#define __deref_inout_ecount(size) __deref_inout __pre __deref __elem_writableTo(size) __post __deref __elem_writableTo(size)
-#define __deref_inout_bcount(size) __deref_inout __pre __deref __byte_writableTo(size) __post __deref __byte_writableTo(size)
-#define __deref_inout_ecount_part(size,length) __deref_inout_ecount(size) __pre __deref __elem_readableTo(length) __post __deref __elem_readableTo(length)
-#define __deref_inout_bcount_part(size,length) __deref_inout_bcount(size) __pre __deref __byte_readableTo(length) __post __deref __byte_readableTo(length)
-#define __deref_inout_ecount_full(size) __deref_inout_ecount_part(size,size)
-#define __deref_inout_bcount_full(size) __deref_inout_bcount_part(size,size)
-#define __deref_inout_z __deref_inout __pre __deref __nullterminated __post __deref __nullterminated
-#define __deref_inout_ecount_z(size) __deref_inout_ecount(size) __pre __deref __nullterminated __post __deref __nullterminated
-#define __deref_inout_bcount_z(size) __deref_inout_ecount(size) __pre __deref __nullterminated __post __deref __nullterminated
-#define __deref_inout_nz __deref_inout
-#define __deref_inout_ecount_nz(size) __deref_inout_ecount(size)
-#define __deref_inout_bcount_nz(size) __deref_inout_ecount(size)
-#define __deref_ecount_opt(size) __deref_ecount(size) __post __deref __exceptthat __maybenull
-#define __deref_bcount_opt(size) __deref_bcount(size) __post __deref __exceptthat __maybenull
-#define __deref_out_opt __deref_out __post __deref __exceptthat __maybenull
-#define __deref_out_ecount_opt(size) __deref_out_ecount(size) __post __deref __exceptthat __maybenull
-#define __deref_out_bcount_opt(size) __deref_out_bcount(size) __post __deref __exceptthat __maybenull
-#define __deref_out_ecount_part_opt(size,length) __deref_out_ecount_part(size,length) __post __deref __exceptthat __maybenull
-#define __deref_out_bcount_part_opt(size,length) __deref_out_bcount_part(size,length) __post __deref __exceptthat __maybenull
-#define __deref_out_ecount_full_opt(size) __deref_out_ecount_full(size) __post __deref __exceptthat __maybenull
-#define __deref_out_bcount_full_opt(size) __deref_out_bcount_full(size) __post __deref __exceptthat __maybenull
-#define __deref_out_z_opt __post __deref __valid __refparam __execeptthat __maybenull __post __deref __nullterminated
-#define __deref_out_ecount_z_opt(size) __deref_out_ecount_opt(size) __post __deref __nullterminated
-#define __deref_out_bcount_z_opt(size) __deref_out_bcount_opt(size) __post __deref __nullterminated
-#define __deref_out_nz_opt __deref_out_opt
-#define __deref_out_ecount_nz_opt(size) __deref_out_ecount_opt(size)
-#define __deref_out_bcount_nz_opt(size) __deref_out_bcount_opt(size)
-#define __deref_inout_opt __deref_inout __pre __deref __exceptthat __maybenull __post __deref __exceptthat __maybenull
-#define __deref_inout_ecount_opt(size) __deref_inout_ecount(size) __pre __deref __exceptthat __maybenull __post __deref __exceptthat __maybenull
-#define __deref_inout_bcount_opt(size) __deref_inout_bcount(size) __pre __deref __exceptthat __maybenull __post __deref __exceptthat __maybenull
-#define __deref_inout_ecount_part_opt(size,length) __deref_inout_ecount_part(size,length) __pre __deref __exceptthat __maybenull __post __deref __exceptthat __maybenull
-#define __deref_inout_bcount_part_opt(size,length) __deref_inout_bcount_part(size,length) __pre __deref __exceptthat __maybenull __post __deref __exceptthat __maybenull
-#define __deref_inout_ecount_full_opt(size) __deref_inout_ecount_full(size) __pre __deref __exceptthat __maybenull __post __deref __exceptthat __maybenull
-#define __deref_inout_bcount_full_opt(size) __deref_inout_bcount_full(size) __pre __deref __exceptthat __maybenull __post __deref __exceptthat __maybenull
-#define __deref_inout_z_opt __deref_inout_opt __pre __deref __nullterminated __post __deref __nullterminated
-#define __deref_inout_ecount_z_opt(size) __deref_inout_ecount_opt(size) __pre __deref __nullterminated __post __deref __nullterminated
-#define __deref_inout_bcount_z_opt(size) __deref_inout_bcount_opt(size) __pre __deref __nullterminated __post __deref __nullterminated
-#define __deref_inout_nz_opt __deref_inout_opt
-#define __deref_inout_ecount_nz_opt(size) __deref_inout_ecount_opt(size)
-#define __deref_inout_bcount_nz_opt(size) __deref_inout_bcount_opt(size)
-#define __deref_opt_ecount(size) __deref_ecount(size) __exceptthat __maybenull
-#define __deref_opt_bcount(size) __deref_bcount(size) __exceptthat __maybenull
-#define __deref_opt_out __deref_out __exceptthat __maybenull
-#define __deref_opt_out_z __deref_opt_out __post __deref __nullterminated
-#define __deref_opt_out_ecount(size) __deref_out_ecount(size) __exceptthat __maybenull
-#define __deref_opt_out_bcount(size) __deref_out_bcount(size) __exceptthat __maybenull
-#define __deref_opt_out_ecount_part(size,length) __deref_out_ecount_part(size,length) __exceptthat __maybenull
-#define __deref_opt_out_bcount_part(size,length) __deref_out_bcount_part(size,length) __exceptthat __maybenull
-#define __deref_opt_out_ecount_full(size) __deref_out_ecount_full(size) __exceptthat __maybenull
-#define __deref_opt_out_bcount_full(size) __deref_out_bcount_full(size) __exceptthat __maybenull
-#define __deref_opt_inout __deref_inout __exceptthat __maybenull
-#define __deref_opt_inout_ecount(size) __deref_inout_ecount(size) __exceptthat __maybenull
-#define __deref_opt_inout_bcount(size) __deref_inout_bcount(size) __exceptthat __maybenull
-#define __deref_opt_inout_ecount_part(size,length) __deref_inout_ecount_part(size,length) __exceptthat __maybenull
-#define __deref_opt_inout_bcount_part(size,length) __deref_inout_bcount_part(size,length) __exceptthat __maybenull
-#define __deref_opt_inout_ecount_full(size) __deref_inout_ecount_full(size) __exceptthat __maybenull
-#define __deref_opt_inout_bcount_full(size) __deref_inout_bcount_full(size) __exceptthat __maybenull
-#define __deref_opt_inout_z __deref_opt_inout __pre __deref __nullterminated __post __deref __nullterminated
-#define __deref_opt_inout_ecount_z(size) __deref_opt_inout_ecount(size) __pre __deref __nullterminated __post __deref __nullterminated
-#define __deref_opt_inout_bcount_z(size) __deref_opt_inout_bcount(size) __pre __deref __nullterminated __post __deref __nullterminated
-#define __deref_opt_inout_nz __deref_opt_inout
-#define __deref_opt_inout_ecount_nz(size) __deref_opt_inout_ecount(size)
-#define __deref_opt_inout_bcount_nz(size) __deref_opt_inout_bcount(size)
-#define __deref_opt_ecount_opt(size) __deref_ecount_opt(size) __exceptthat __maybenull
-#define __deref_opt_bcount_opt(size) __deref_bcount_opt(size) __exceptthat __maybenull
-#define __deref_opt_out_opt __deref_out_opt __exceptthat __maybenull
-#define __deref_opt_out_ecount_opt(size) __deref_out_ecount_opt(size) __exceptthat __maybenull
-#define __deref_opt_out_bcount_opt(size) __deref_out_bcount_opt(size) __exceptthat __maybenull
-#define __deref_opt_out_ecount_part_opt(size,length) __deref_out_ecount_part_opt(size,length) __exceptthat __maybenull
-#define __deref_opt_out_bcount_part_opt(size,length) __deref_out_bcount_part_opt(size,length) __exceptthat __maybenull
-#define __deref_opt_out_ecount_full_opt(size) __deref_out_ecount_full_opt(size) __exceptthat __maybenull
-#define __deref_opt_out_bcount_full_opt(size) __deref_out_bcount_full_opt(size) __exceptthat __maybenull
-#define __deref_opt_out_z_opt __post __deref __valid __refparam __exceptthat __maybenull __pre __deref __exceptthat __maybenull __post __deref __exceptthat __maybenull __post __deref __nullterminated
-#define __deref_opt_out_ecount_z_opt(size) __deref_opt_out_ecount_opt(size) __post __deref __nullterminated
-#define __deref_opt_out_bcount_z_opt(size) __deref_opt_out_bcount_opt(size) __post __deref __nullterminated
-#define __deref_opt_out_nz_opt __deref_opt_out_opt
-#define __deref_opt_out_ecount_nz_opt(size) __deref_opt_out_ecount_opt(size)
-#define __deref_opt_out_bcount_nz_opt(size) __deref_opt_out_bcount_opt(size)
-#define __deref_opt_inout_opt __deref_inout_opt __exceptthat __maybenull
-#define __deref_opt_inout_ecount_opt(size) __deref_inout_ecount_opt(size) __exceptthat __maybenull
-#define __deref_opt_inout_bcount_opt(size) __deref_inout_bcount_opt(size) __exceptthat __maybenull
-#define __deref_opt_inout_ecount_part_opt(size,length) __deref_inout_ecount_part_opt(size,length) __exceptthat __maybenull
-#define __deref_opt_inout_bcount_part_opt(size,length) __deref_inout_bcount_part_opt(size,length) __exceptthat __maybenull
-#define __deref_opt_inout_ecount_full_opt(size) __deref_inout_ecount_full_opt(size) __exceptthat __maybenull
-#define __deref_opt_inout_bcount_full_opt(size) __deref_inout_bcount_full_opt(size) __exceptthat __maybenull
-#define __deref_opt_inout_z_opt __deref_opt_inout_opt __pre __deref __nullterminated __post __deref __nullterminated
-#define __deref_opt_inout_ecount_z_opt(size) __deref_opt_inout_ecount_opt(size) __pre __deref __nullterminated __post __deref __nullterminated
-#define __deref_opt_inout_bcount_z_opt(size) __deref_opt_inout_bcount_opt(size) __pre __deref __nullterminated __post __deref __nullterminated
-#define __deref_opt_inout_nz_opt __deref_opt_inout_opt
-#define __deref_opt_inout_ecount_nz_opt(size) __deref_opt_inout_ecount_opt(size)
-#define __deref_opt_inout_bcount_nz_opt(size) __deref_opt_inout_bcount_opt(size)
-
-/*
--------------------------------------------------------------------------------
-Advanced Annotation Definitions
-
-Any of these may be used to directly annotate functions, and may be used in
-combination with each other or with regular buffer macros. For an explanation
-of each annotation, see the advanced annotations section.
--------------------------------------------------------------------------------
-*/
-
-#define __success(expr) __inner_success(expr)
-#define __nullterminated __readableTo(sentinel(0))
-#define __nullnullterminated
-#define __reserved __pre __null
-#define __checkReturn __inner_checkReturn
-#define __typefix(ctype) __inner_typefix(ctype)
-#define __override __inner_override
-#define __callback __inner_callback
-#define __format_string
-#define __blocksOn(resource) __inner_blocksOn(resource)
-#define __control_entrypoint(category) __inner_control_entrypoint(category)
-#define __data_entrypoint(category) __inner_data_entrypoint(category)
-
-#ifndef __fallthrough
- __inner_fallthrough_dec
- #define __fallthrough __inner_fallthrough
-#endif
-
-#ifndef __analysis_assume
-#ifdef _PREFAST_
-#define __analysis_assume(expr) __assume(expr)
-#else
-#define __analysis_assume(expr)
-#endif
-#endif
-
-#ifdef __cplusplus
-}
-#endif
-
-
+/***
+*sal.h - markers for documenting the semantics of APIs
+*
+* Copyright (c) Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* sal.h provides a set of annotations to describe how a function uses its
+* parameters - the assumptions it makes about them, and the guarantees it makes
+* upon finishing.
+*
+* [Public]
+*
+****/
+
+/*
+ -------------------------------------------------------------------------------
+ Introduction
+
+ sal.h provides a set of annotations to describe how a function uses its
+ parameters - the assumptions it makes about them, and the guarantees it makes
+ upon finishing.
+
+ Annotations may be placed before either a function parameter's type or its return
+ type, and describe the function's behavior regarding the parameter or return value.
+ There are two classes of annotations: buffer annotations and advanced annotations.
+ Buffer annotations describe how functions use their pointer parameters, and
+ advanced annotations either describe complex/unusual buffer behavior, or provide
+ additional information about a parameter that is not otherwise expressible.
+
+ -------------------------------------------------------------------------------
+ Buffer Annotations
+
+ The most important annotations in sal.h provide a consistent way to annotate
+ buffer parameters or return values for a function. Each of these annotations describes
+ a single buffer (which could be a string, a fixed-length or variable-length array,
+ or just a pointer) that the function interacts with: where it is, how large it is,
+ how much is initialized, and what the function does with it.
+
+ The appropriate macro for a given buffer can be constructed using the table below.
+ Just pick the appropriate values from each category, and combine them together
+ with a leading underscore. Some combinations of values do not make sense as buffer
+ annotations. Only meaningful annotations can be added to your code; for a list of
+ these, see the buffer annotation definitions section.
+
+ Only a single buffer annotation should be used for each parameter.
+
+ |------------|------------|---------|--------|----------|----------|---------------|
+ | Level | Usage | Size | Output | NullTerm | Optional | Parameters |
+ |------------|------------|---------|--------|----------|----------|---------------|
+ | <> | <> | <> | <> | _z | <> | <> |
+ | _deref | _in | _ecount | _full | _nz | _opt | (size) |
+ | _deref_opt | _out | _bcount | _part | | | (size,length) |
+ | | _inout | | | | | |
+ | | | | | | | |
+ |------------|------------|---------|--------|----------|----------|---------------|
+
+ Level: Describes the buffer pointer's level of indirection from the parameter or
+ return value 'p'.
+
+ <> : p is the buffer pointer.
+ _deref : *p is the buffer pointer. p must not be NULL.
+ _deref_opt : *p may be the buffer pointer. p may be NULL, in which case the rest of
+ the annotation is ignored.
+
+ Usage: Describes how the function uses the buffer.
+
+ <> : The buffer is not accessed. If used on the return value or with _deref, the
+ function will provide the buffer, and it will be uninitialized at exit.
+ Otherwise, the caller must provide the buffer. This should only be used
+ for alloc and free functions.
+ _in : The function will only read from the buffer. The caller must provide the
+ buffer and initialize it. Cannot be used with _deref.
+ _out : The function will only write to the buffer. If used on the return value or
+ with _deref, the function will provide the buffer and initialize it.
+ Otherwise, the caller must provide the buffer, and the function will
+ initialize it.
+ _inout : The function may freely read from and write to the buffer. The caller must
+ provide the buffer and initialize it. If used with _deref, the buffer may
+ be reallocated by the function.
+
+ Size: Describes the total size of the buffer. This may be less than the space actually
+ allocated for the buffer, in which case it describes the accessible amount.
+
+ <> : No buffer size is given. If the type specifies the buffer size (such as
+ with LPSTR and LPWSTR), that amount is used. Otherwise, the buffer is one
+ element long. Must be used with _in, _out, or _inout.
+ _ecount : The buffer size is an explicit element count.
+ _bcount : The buffer size is an explicit byte count.
+
+ Output: Describes how much of the buffer will be initialized by the function. For
+ _inout buffers, this also describes how much is initialized at entry. Omit this
+ category for _in buffers; they must be fully initialized by the caller.
+
+ <> : The type specifies how much is initialized. For instance, a function initializing
+ an LPWSTR must NULL-terminate the string.
+ _full : The function initializes the entire buffer.
+ _part : The function initializes part of the buffer, and explicitly indicates how much.
+
+ NullTerm: States if the present of a '\0' marks the end of valid elements in the buffer.
+ _z : A '\0' indicated the end of the buffer
+ _nz : The buffer may not be null terminated and a '\0' does not indicate the end of the
+ buffer.
+ Optional: Describes if the buffer itself is optional.
+
+ <> : The pointer to the buffer must not be NULL.
+ _opt : The pointer to the buffer might be NULL. It will be checked before being dereferenced.
+
+ Parameters: Gives explicit counts for the size and length of the buffer.
+
+ <> : There is no explicit count. Use when neither _ecount nor _bcount is used.
+ (size) : Only the buffer's total size is given. Use with _ecount or _bcount but not _part.
+ (size,length) : The buffer's total size and initialized length are given. Use with _ecount_part
+ and _bcount_part.
+
+ -------------------------------------------------------------------------------
+ Buffer Annotation Examples
+
+ LWSTDAPI_(BOOL) StrToIntExA(
+ LPCSTR pszString, -- No annotation required, const implies __in.
+ DWORD dwFlags,
+ __out int *piRet -- A pointer whose dereference will be filled in.
+ );
+
+ void MyPaintingFunction(
+ __in HWND hwndControl, -- An initialized read-only parameter.
+ __in_opt HDC hdcOptional, -- An initialized read-only parameter that might be NULL.
+ __inout IPropertyStore *ppsStore -- An initialized parameter that may be freely used
+ -- and modified.
+ );
+
+ LWSTDAPI_(BOOL) PathCompactPathExA(
+ __out_ecount(cchMax) LPSTR pszOut, -- A string buffer with cch elements that will
+ -- be NULL terminated on exit.
+ LPCSTR pszSrc, -- No annotation required, const implies __in.
+ UINT cchMax,
+ DWORD dwFlags
+ );
+
+ HRESULT SHLocalAllocBytes(
+ size_t cb,
+ __deref_bcount(cb) T **ppv -- A pointer whose dereference will be set to an
+ -- uninitialized buffer with cb bytes.
+ );
+
+ __inout_bcount_full(cb) : A buffer with cb elements that is fully initialized at
+ entry and exit, and may be written to by this function.
+
+ __out_ecount_part(count, *countOut) : A buffer with count elements that will be
+ partially initialized by this function. The function indicates how much it
+ initialized by setting *countOut.
+
+ -------------------------------------------------------------------------------
+ Advanced Annotations
+
+ Advanced annotations describe behavior that is not expressible with the regular
+ buffer macros. These may be used either to annotate buffer parameters that involve
+ complex or conditional behavior, or to enrich existing annotations with additional
+ information.
+
+ __success(expr) f :
+ <expr> indicates whether function f succeeded or not. If <expr> is true at exit,
+ all the function's guarantees (as given by other annotations) must hold. If <expr>
+ is false at exit, the caller should not expect any of the function's guarantees
+ to hold. If not used, the function must always satisfy its guarantees. Added
+ automatically to functions that indicate success in standard ways, such as by
+ returning an HRESULT.
+
+ __nullterminated p :
+ Pointer p is a buffer that may be read or written up to and including the first
+ NULL character or pointer. May be used on typedefs, which marks valid (properly
+ initialized) instances of that type as being NULL-terminated.
+
+ __nullnullterminated p :
+ Pointer p is a buffer that may be read or written up to and including the first
+ sequence of two NULL characters or pointers. May be used on typedefs, which marks
+ valid instances of that type as being double-NULL terminated.
+
+ __reserved v :
+ Value v must be 0/NULL, reserved for future use.
+
+ __checkReturn v :
+ Return value v must not be ignored by callers of this function.
+
+ __typefix(ctype) v :
+ Value v should be treated as an instance of ctype, rather than its declared type.
+
+ __override f :
+ Specify C#-style 'override' behaviour for overriding virtual methods.
+
+ __callback f :
+ Function f can be used as a function pointer.
+
+ __format_string p :
+ Pointer p is a string that contains % markers in the style of printf.
+
+ __blocksOn(resource) f :
+ Function f blocks on the resource 'resource'.
+
+ __fallthrough :
+ Annotates switch statement labels where fall-through is desired, to distinguish
+ from forgotten break statements.
+
+ -------------------------------------------------------------------------------
+ Advanced Annotation Examples
+
+ __success(return == TRUE) LWSTDAPI_(BOOL)
+ PathCanonicalizeA(__out_ecount(MAX_PATH) LPSTR pszBuf, LPCSTR pszPath) :
+ pszBuf is only guaranteed to be NULL-terminated when TRUE is returned.
+
+ typedef __nullterminated WCHAR* LPWSTR : Initialized LPWSTRs are NULL-terminated strings.
+
+ __out_ecount(cch) __typefix(LPWSTR) void *psz : psz is a buffer parameter which will be
+ a NULL-terminated WCHAR string at exit, and which initially contains cch WCHARs.
+
+ -------------------------------------------------------------------------------
+*/
+
+#pragma once
+
+#define __specstrings
+
+#ifdef __cplusplus
+#ifndef __nothrow
+# define __nothrow __declspec(nothrow)
+#endif
+extern "C" {
+#else
+#ifndef __nothrow
+# define __nothrow
+#endif
+#endif /* #ifdef __cplusplus */
+
+/*
+ -------------------------------------------------------------------------------
+ Helper Macro Definitions
+
+ These express behavior common to many of the high-level annotations.
+ DO NOT USE THESE IN YOUR CODE.
+ -------------------------------------------------------------------------------
+*/
+
+/*
+The helper annotations are only understood by the compiler version used by various
+defect detection tools. When the regular compiler is running, they are defined into
+nothing, and do not affect the compiled code.
+*/
+
+#if !defined(__midl) && defined(_PREFAST_)
+
+ /*
+ In the primitive __declspec("SAL_*") annotations "SAL" stands for Standard
+ Annotation Language. These __declspec("SAL_*") annotations are the
+ primitives the compiler understands and all high-level SpecString MACROs
+ will decompose into these primivates.
+ */
+
+ #define SPECSTRINGIZE( x ) #x
+
+ /*
+ __null p
+ __notnull p
+ __maybenull p
+
+ Annotates a pointer p. States that pointer p is null. Commonly used
+ in the negated form __notnull or the possibly null form __maybenull.
+ */
+
+ #define __null __declspec("SAL_null")
+ #define __notnull __declspec("SAL_notnull")
+ #define __maybenull __declspec("SAL_maybenull")
+
+ /*
+ __readonly l
+ __notreadonly l
+ __mabyereadonly l
+
+ Annotates a location l. States that location l is not modified after
+ this point. If the annotation is placed on the precondition state of
+ a function, the restriction only applies until the postcondition state
+ of the function. __maybereadonly states that the annotated location
+ may be modified, whereas __notreadonly states that a location must be
+ modified.
+ */
+
+ #define __readonly __declspec("SAL_readonly")
+ #define __notreadonly __declspec("SAL_notreadonly")
+ #define __maybereadonly __declspec("SAL_maybereadonly")
+
+ /*
+ __valid v
+ __notvalid v
+ __maybevalid v
+
+ Annotates any value v. States that the value satisfies all properties of
+ valid values of its type. For example, for a string buffer, valid means
+ that the buffer pointer is either NULL or points to a NULL-terminated string.
+ */
+
+ #define __valid __declspec("SAL_valid")
+ #define __notvalid __declspec("SAL_notvalid")
+ #define __maybevalid __declspec("SAL_maybevalid")
+
+ /*
+ __readableTo(extent) p
+
+ Annotates a buffer pointer p. If the buffer can be read, extent describes
+ how much of the buffer is readable. For a reader of the buffer, this is
+ an explicit permission to read up to that amount, rather than a restriction to
+ read only up to it.
+ */
+
+ #define __readableTo(extent) __declspec("SAL_readableTo("SPECSTRINGIZE(extent)")")
+
+ /*
+
+ __elem_readableTo(size)
+
+ Annotates a buffer pointer p as being readable to size elements.
+ */
+
+ #define __elem_readableTo(size) __declspec("SAL_readableTo(elementCount("SPECSTRINGIZE(size)"))")
+
+ /*
+ __byte_readableTo(size)
+
+ Annotates a buffer pointer p as being readable to size bytes.
+ */
+ #define __byte_readableTo(size) __declspec("SAL_readableTo(byteCount("SPECSTRINGIZE(size)"))")
+
+ /*
+ __writableTo(extent) p
+
+ Annotates a buffer pointer p. If the buffer can be modified, extent
+ describes how much of the buffer is writable (usually the allocation
+ size). For a writer of the buffer, this is an explicit permission to
+ write up to that amount, rather than a restriction to write only up to it.
+ */
+ #define __writableTo(size) __declspec("SAL_writableTo("SPECSTRINGIZE(size)")")
+
+ /*
+ __elem_writableTo(size)
+
+ Annotates a buffer pointer p as being writable to size elements.
+ */
+ #define __elem_writableTo(size) __declspec("SAL_writableTo(elementCount("SPECSTRINGIZE(size)"))")
+
+ /*
+ __byte_writableTo(size)
+
+ Annotates a buffer pointer p as being writable to size bytes.
+ */
+ #define __byte_writableTo(size) __declspec("SAL_writableTo(byteCount("SPECSTRINGIZE(size)"))")
+
+ /*
+ __deref p
+
+ Annotates a pointer p. The next annotation applies one dereference down
+ in the type. If readableTo(p, size) then the next annotation applies to
+ all elements *(p+i) for which i satisfies the size. If p is a pointer
+ to a struct, the next annotation applies to all fields of the struct.
+ */
+ #define __deref __declspec("SAL_deref")
+
+ /*
+ __pre __next_annotation
+
+ The next annotation applies in the precondition state
+ */
+ #define __pre __declspec("SAL_pre")
+
+ /*
+ __post __next_annotation
+
+ The next annotation applies in the postcondition state
+ */
+ #define __post __declspec("SAL_post")
+
+ /*
+ __precond(<expr>)
+
+ When <expr> is true, the next annotation applies in the precondition state
+ (currently not enabled)
+ */
+ #define __precond(expr) __pre
+
+ /*
+ __postcond(<expr>)
+
+ When <expr> is true, the next annotation applies in the postcondition state
+ (currently not enabled)
+ */
+ #define __postcond(expr) __post
+
+ /*
+ __exceptthat
+
+ Given a set of annotations Q containing __exceptthat maybeP, the effect of
+ the except clause is to erase any P or notP annotations (explicit or
+ implied) within Q at the same level of dereferencing that the except
+ clause appears, and to replace it with maybeP.
+
+ Example 1: __valid __exceptthat __maybenull on a pointer p means that the
+ pointer may be null, and is otherwise valid, thus overriding
+ the implicit notnull annotation implied by __valid on
+ pointers.
+
+ Example 2: __valid __deref __exceptthat __maybenull on an int **p means
+ that p is not null (implied by valid), but the elements
+ pointed to by p could be null, and are otherwise valid.
+ */
+ #define __exceptthat __declspec("SAL_except")
+ #define __execeptthat __exceptthat
+
+ /*
+ _refparam
+
+ Added to all out parameter macros to indicate that they are all reference
+ parameters.
+ */
+ #define __refparam __deref __notreadonly
+
+ /*
+ __inner_*
+
+ Helper macros that directly correspond to certain high-level annotations.
+
+ */
+
+ /*
+ Macros to classify the entrypoints and indicate their category.
+
+ Pre-defined control point categories include: RPC, LPC, DeviceDriver, UserToKernel, ISAPI, COM.
+
+ */
+ #define __inner_control_entrypoint(category) __declspec("SAL_entrypoint(controlEntry, "SPECSTRINGIZE(category)")")
+
+ /*
+ Pre-defined data entry point categories include: Registry, File, Network.
+ */
+ #define __inner_data_entrypoint(category) __declspec("SAL_entrypoint(dataEntry, "SPECSTRINGIZE(category)")")
+
+ #define __inner_success(expr) __declspec("SAL_success("SPECSTRINGIZE(expr)")")
+ #define __inner_checkReturn __declspec("SAL_checkReturn")
+ #define __inner_typefix(ctype) __declspec("SAL_typefix("SPECSTRINGIZE(ctype)")")
+ #define __inner_override __declspec("__override")
+ #define __inner_callback __declspec("__callback")
+ #define __inner_blocksOn(resource) __declspec("SAL_blocksOn("SPECSTRINGIZE(resource)")")
+ #define __inner_fallthrough_dec __inline __nothrow void __FallThrough() {}
+ #define __inner_fallthrough __FallThrough();
+
+#else
+ #define __null
+ #define __notnull
+ #define __maybenull
+ #define __readonly
+ #define __notreadonly
+ #define __maybereadonly
+ #define __valid
+ #define __notvalid
+ #define __maybevalid
+ #define __readableTo(extent)
+ #define __elem_readableTo(size)
+ #define __byte_readableTo(size)
+ #define __writableTo(size)
+ #define __elem_writableTo(size)
+ #define __byte_writableTo(size)
+ #define __deref
+ #define __pre
+ #define __post
+ #define __precond(expr)
+ #define __postcond(expr)
+ #define __exceptthat
+ #define __execeptthat
+ #define __inner_success(expr)
+ #define __inner_checkReturn
+ #define __inner_typefix(ctype)
+ #define __inner_override
+ #define __inner_callback
+ #define __inner_blocksOn(resource)
+ #define __inner_fallthrough_dec
+ #define __inner_fallthrough
+ #define __refparam
+ #define __inner_control_entrypoint(category)
+ #define __inner_data_entrypoint(category)
+#endif /* #if !defined(__midl) && defined(_PREFAST_) */
+
+/*
+-------------------------------------------------------------------------------
+Buffer Annotation Definitions
+
+Any of these may be used to directly annotate functions, but only one should
+be used for each parameter. To determine which annotation to use for a given
+buffer, use the table in the buffer annotations section.
+-------------------------------------------------------------------------------
+*/
+
+#define __ecount(size) __notnull __elem_writableTo(size)
+#define __bcount(size) __notnull __byte_writableTo(size)
+#define __in __pre __valid __pre __deref __readonly
+#define __in_ecount(size) __in __pre __elem_readableTo(size)
+#define __in_bcount(size) __in __pre __byte_readableTo(size)
+#define __in_z __in __pre __nullterminated
+#define __in_ecount_z(size) __in_ecount(size) __pre __nullterminated
+#define __in_bcount_z(size) __in_bcount(size) __pre __nullterminated
+#define __in_nz __in
+#define __in_ecount_nz(size) __in_ecount(size)
+#define __in_bcount_nz(size) __in_bcount(size)
+#define __out __ecount(1) __post __valid __refparam
+#define __out_ecount(size) __ecount(size) __post __valid __refparam
+#define __out_bcount(size) __bcount(size) __post __valid __refparam
+#define __out_ecount_part(size,length) __out_ecount(size) __post __elem_readableTo(length)
+#define __out_bcount_part(size,length) __out_bcount(size) __post __byte_readableTo(length)
+#define __out_ecount_full(size) __out_ecount_part(size,size)
+#define __out_bcount_full(size) __out_bcount_part(size,size)
+#define __out_z __post __valid __refparam __post __nullterminated
+#define __out_z_opt __post __valid __refparam __post __nullterminated __exceptthat __maybenull
+#define __out_ecount_z(size) __ecount(size) __post __valid __refparam __post __nullterminated
+#define __out_bcount_z(size) __bcount(size) __post __valid __refparam __post __nullterminated
+#define __out_ecount_part_z(size,length) __out_ecount_part(size,length) __post __nullterminated
+#define __out_bcount_part_z(size,length) __out_bcount_part(size,length) __post __nullterminated
+#define __out_ecount_full_z(size) __out_ecount_full(size) __post __nullterminated
+#define __out_bcount_full_z(size) __out_bcount_full(size) __post __nullterminated
+#define __out_nz __post __valid __refparam __post
+#define __out_nz_opt __post __valid __refparam __post __exceptthat __maybenull
+#define __out_ecount_nz(size) __ecount(size) __post __valid __refparam
+#define __out_bcount_nz(size) __bcount(size) __post __valid __refparam
+#define __inout __pre __valid __post __valid __refparam
+#define __inout_ecount(size) __out_ecount(size) __pre __valid
+#define __inout_bcount(size) __out_bcount(size) __pre __valid
+#define __inout_ecount_part(size,length) __out_ecount_part(size,length) __pre __valid __pre __elem_readableTo(length)
+#define __inout_bcount_part(size,length) __out_bcount_part(size,length) __pre __valid __pre __byte_readableTo(length)
+#define __inout_ecount_full(size) __inout_ecount_part(size,size)
+#define __inout_bcount_full(size) __inout_bcount_part(size,size)
+#define __inout_z __inout __pre __nullterminated __post __nullterminated
+#define __inout_ecount_z(size) __inout_ecount(size) __pre __nullterminated __post __nullterminated
+#define __inout_bcount_z(size) __inout_bcount(size) __pre __nullterminated __post __nullterminated
+#define __inout_nz __inout
+#define __inout_ecount_nz(size) __inout_ecount(size)
+#define __inout_bcount_nz(size) __inout_bcount(size)
+#define __ecount_opt(size) __ecount(size) __exceptthat __maybenull
+#define __bcount_opt(size) __bcount(size) __exceptthat __maybenull
+#define __in_opt __in __exceptthat __maybenull
+#define __in_ecount_opt(size) __in_ecount(size) __exceptthat __maybenull
+#define __in_bcount_opt(size) __in_bcount(size) __exceptthat __maybenull
+#define __in_z_opt __in_opt __pre __nullterminated
+#define __in_ecount_z_opt(size) __in_ecount_opt(size) __pre __nullterminated
+#define __in_bcount_z_opt(size) __in_bcount_opt(size) __pre __nullterminated
+#define __in_nz_opt __in_opt
+#define __in_ecount_nz_opt(size) __in_ecount_opt(size)
+#define __in_bcount_nz_opt(size) __in_bcount_opt(size)
+#define __out_opt __out __exceptthat __maybenull
+#define __out_ecount_opt(size) __out_ecount(size) __exceptthat __maybenull
+#define __out_bcount_opt(size) __out_bcount(size) __exceptthat __maybenull
+#define __out_ecount_part_opt(size,length) __out_ecount_part(size,length) __exceptthat __maybenull
+#define __out_bcount_part_opt(size,length) __out_bcount_part(size,length) __exceptthat __maybenull
+#define __out_ecount_full_opt(size) __out_ecount_full(size) __exceptthat __maybenull
+#define __out_bcount_full_opt(size) __out_bcount_full(size) __exceptthat __maybenull
+#define __out_ecount_z_opt(size) __out_ecount_opt(size) __post __nullterminated
+#define __out_bcount_z_opt(size) __out_bcount_opt(size) __post __nullterminated
+#define __out_ecount_part_z_opt(size,length) __out_ecount_part_opt(size,length) __post __nullterminated
+#define __out_bcount_part_z_opt(size,length) __out_bcount_part_opt(size,length) __post __nullterminated
+#define __out_ecount_full_z_opt(size) __out_ecount_full_opt(size) __post __nullterminated
+#define __out_bcount_full_z_opt(size) __out_bcount_full_opt(size) __post __nullterminated
+#define __out_ecount_nz_opt(size) __out_ecount_opt(size) __post __nullterminated
+#define __out_bcount_nz_opt(size) __out_bcount_opt(size) __post __nullterminated
+#define __inout_opt __inout __exceptthat __maybenull
+#define __inout_ecount_opt(size) __inout_ecount(size) __exceptthat __maybenull
+#define __inout_bcount_opt(size) __inout_bcount(size) __exceptthat __maybenull
+#define __inout_ecount_part_opt(size,length) __inout_ecount_part(size,length) __exceptthat __maybenull
+#define __inout_bcount_part_opt(size,length) __inout_bcount_part(size,length) __exceptthat __maybenull
+#define __inout_ecount_full_opt(size) __inout_ecount_full(size) __exceptthat __maybenull
+#define __inout_bcount_full_opt(size) __inout_bcount_full(size) __exceptthat __maybenull
+#define __inout_z_opt __inout_opt __pre __nullterminated __post __nullterminated
+#define __inout_ecount_z_opt(size) __inout_ecount_opt(size) __pre __nullterminated __post __nullterminated
+#define __inout_ecount_z_opt(size) __inout_ecount_opt(size) __pre __nullterminated __post __nullterminated
+#define __inout_bcount_z_opt(size) __inout_bcount_opt(size)
+#define __inout_nz_opt __inout_opt
+#define __inout_ecount_nz_opt(size) __inout_ecount_opt(size)
+#define __inout_bcount_nz_opt(size) __inout_bcount_opt(size)
+#define __deref_ecount(size) __ecount(1) __post __elem_readableTo(1) __post __deref __notnull __post __deref __elem_writableTo(size)
+#define __deref_bcount(size) __ecount(1) __post __elem_readableTo(1) __post __deref __notnull __post __deref __byte_writableTo(size)
+#define __deref_out __deref_ecount(1) __post __deref __valid __refparam
+#define __deref_out_ecount(size) __deref_ecount(size) __post __deref __valid __refparam
+#define __deref_out_bcount(size) __deref_bcount(size) __post __deref __valid __refparam
+#define __deref_out_ecount_part(size,length) __deref_out_ecount(size) __post __deref __elem_readableTo(length)
+#define __deref_out_bcount_part(size,length) __deref_out_bcount(size) __post __deref __byte_readableTo(length)
+#define __deref_out_ecount_full(size) __deref_out_ecount_part(size,size)
+#define __deref_out_bcount_full(size) __deref_out_bcount_part(size,size)
+#define __deref_out_z __post __deref __valid __refparam __post __deref __nullterminated
+#define __deref_out_ecount_z(size) __deref_out_ecount(size) __post __deref __nullterminated
+#define __deref_out_bcount_z(size) __deref_out_ecount(size) __post __deref __nullterminated
+#define __deref_out_nz __deref_out
+#define __deref_out_ecount_nz(size) __deref_out_ecount(size)
+#define __deref_out_bcount_nz(size) __deref_out_ecount(size)
+#define __deref_inout __notnull __elem_readableTo(1) __pre __deref __valid __post __deref __valid __refparam
+#define __deref_inout_z __deref_inout __pre __deref __nullterminated __post __deref __nullterminated
+#define __deref_inout_ecount(size) __deref_inout __pre __deref __elem_writableTo(size) __post __deref __elem_writableTo(size)
+#define __deref_inout_bcount(size) __deref_inout __pre __deref __byte_writableTo(size) __post __deref __byte_writableTo(size)
+#define __deref_inout_ecount_part(size,length) __deref_inout_ecount(size) __pre __deref __elem_readableTo(length) __post __deref __elem_readableTo(length)
+#define __deref_inout_bcount_part(size,length) __deref_inout_bcount(size) __pre __deref __byte_readableTo(length) __post __deref __byte_readableTo(length)
+#define __deref_inout_ecount_full(size) __deref_inout_ecount_part(size,size)
+#define __deref_inout_bcount_full(size) __deref_inout_bcount_part(size,size)
+#define __deref_inout_z __deref_inout __pre __deref __nullterminated __post __deref __nullterminated
+#define __deref_inout_ecount_z(size) __deref_inout_ecount(size) __pre __deref __nullterminated __post __deref __nullterminated
+#define __deref_inout_bcount_z(size) __deref_inout_ecount(size) __pre __deref __nullterminated __post __deref __nullterminated
+#define __deref_inout_nz __deref_inout
+#define __deref_inout_ecount_nz(size) __deref_inout_ecount(size)
+#define __deref_inout_bcount_nz(size) __deref_inout_ecount(size)
+#define __deref_ecount_opt(size) __deref_ecount(size) __post __deref __exceptthat __maybenull
+#define __deref_bcount_opt(size) __deref_bcount(size) __post __deref __exceptthat __maybenull
+#define __deref_out_opt __deref_out __post __deref __exceptthat __maybenull
+#define __deref_out_ecount_opt(size) __deref_out_ecount(size) __post __deref __exceptthat __maybenull
+#define __deref_out_bcount_opt(size) __deref_out_bcount(size) __post __deref __exceptthat __maybenull
+#define __deref_out_ecount_part_opt(size,length) __deref_out_ecount_part(size,length) __post __deref __exceptthat __maybenull
+#define __deref_out_bcount_part_opt(size,length) __deref_out_bcount_part(size,length) __post __deref __exceptthat __maybenull
+#define __deref_out_ecount_full_opt(size) __deref_out_ecount_full(size) __post __deref __exceptthat __maybenull
+#define __deref_out_bcount_full_opt(size) __deref_out_bcount_full(size) __post __deref __exceptthat __maybenull
+#define __deref_out_z_opt __post __deref __valid __refparam __execeptthat __maybenull __post __deref __nullterminated
+#define __deref_out_ecount_z_opt(size) __deref_out_ecount_opt(size) __post __deref __nullterminated
+#define __deref_out_bcount_z_opt(size) __deref_out_bcount_opt(size) __post __deref __nullterminated
+#define __deref_out_nz_opt __deref_out_opt
+#define __deref_out_ecount_nz_opt(size) __deref_out_ecount_opt(size)
+#define __deref_out_bcount_nz_opt(size) __deref_out_bcount_opt(size)
+#define __deref_inout_opt __deref_inout __pre __deref __exceptthat __maybenull __post __deref __exceptthat __maybenull
+#define __deref_inout_ecount_opt(size) __deref_inout_ecount(size) __pre __deref __exceptthat __maybenull __post __deref __exceptthat __maybenull
+#define __deref_inout_bcount_opt(size) __deref_inout_bcount(size) __pre __deref __exceptthat __maybenull __post __deref __exceptthat __maybenull
+#define __deref_inout_ecount_part_opt(size,length) __deref_inout_ecount_part(size,length) __pre __deref __exceptthat __maybenull __post __deref __exceptthat __maybenull
+#define __deref_inout_bcount_part_opt(size,length) __deref_inout_bcount_part(size,length) __pre __deref __exceptthat __maybenull __post __deref __exceptthat __maybenull
+#define __deref_inout_ecount_full_opt(size) __deref_inout_ecount_full(size) __pre __deref __exceptthat __maybenull __post __deref __exceptthat __maybenull
+#define __deref_inout_bcount_full_opt(size) __deref_inout_bcount_full(size) __pre __deref __exceptthat __maybenull __post __deref __exceptthat __maybenull
+#define __deref_inout_z_opt __deref_inout_opt __pre __deref __nullterminated __post __deref __nullterminated
+#define __deref_inout_ecount_z_opt(size) __deref_inout_ecount_opt(size) __pre __deref __nullterminated __post __deref __nullterminated
+#define __deref_inout_bcount_z_opt(size) __deref_inout_bcount_opt(size) __pre __deref __nullterminated __post __deref __nullterminated
+#define __deref_inout_nz_opt __deref_inout_opt
+#define __deref_inout_ecount_nz_opt(size) __deref_inout_ecount_opt(size)
+#define __deref_inout_bcount_nz_opt(size) __deref_inout_bcount_opt(size)
+#define __deref_opt_ecount(size) __deref_ecount(size) __exceptthat __maybenull
+#define __deref_opt_bcount(size) __deref_bcount(size) __exceptthat __maybenull
+#define __deref_opt_out __deref_out __exceptthat __maybenull
+#define __deref_opt_out_z __deref_opt_out __post __deref __nullterminated
+#define __deref_opt_out_ecount(size) __deref_out_ecount(size) __exceptthat __maybenull
+#define __deref_opt_out_bcount(size) __deref_out_bcount(size) __exceptthat __maybenull
+#define __deref_opt_out_ecount_part(size,length) __deref_out_ecount_part(size,length) __exceptthat __maybenull
+#define __deref_opt_out_bcount_part(size,length) __deref_out_bcount_part(size,length) __exceptthat __maybenull
+#define __deref_opt_out_ecount_full(size) __deref_out_ecount_full(size) __exceptthat __maybenull
+#define __deref_opt_out_bcount_full(size) __deref_out_bcount_full(size) __exceptthat __maybenull
+#define __deref_opt_inout __deref_inout __exceptthat __maybenull
+#define __deref_opt_inout_ecount(size) __deref_inout_ecount(size) __exceptthat __maybenull
+#define __deref_opt_inout_bcount(size) __deref_inout_bcount(size) __exceptthat __maybenull
+#define __deref_opt_inout_ecount_part(size,length) __deref_inout_ecount_part(size,length) __exceptthat __maybenull
+#define __deref_opt_inout_bcount_part(size,length) __deref_inout_bcount_part(size,length) __exceptthat __maybenull
+#define __deref_opt_inout_ecount_full(size) __deref_inout_ecount_full(size) __exceptthat __maybenull
+#define __deref_opt_inout_bcount_full(size) __deref_inout_bcount_full(size) __exceptthat __maybenull
+#define __deref_opt_inout_z __deref_opt_inout __pre __deref __nullterminated __post __deref __nullterminated
+#define __deref_opt_inout_ecount_z(size) __deref_opt_inout_ecount(size) __pre __deref __nullterminated __post __deref __nullterminated
+#define __deref_opt_inout_bcount_z(size) __deref_opt_inout_bcount(size) __pre __deref __nullterminated __post __deref __nullterminated
+#define __deref_opt_inout_nz __deref_opt_inout
+#define __deref_opt_inout_ecount_nz(size) __deref_opt_inout_ecount(size)
+#define __deref_opt_inout_bcount_nz(size) __deref_opt_inout_bcount(size)
+#define __deref_opt_ecount_opt(size) __deref_ecount_opt(size) __exceptthat __maybenull
+#define __deref_opt_bcount_opt(size) __deref_bcount_opt(size) __exceptthat __maybenull
+#define __deref_opt_out_opt __deref_out_opt __exceptthat __maybenull
+#define __deref_opt_out_ecount_opt(size) __deref_out_ecount_opt(size) __exceptthat __maybenull
+#define __deref_opt_out_bcount_opt(size) __deref_out_bcount_opt(size) __exceptthat __maybenull
+#define __deref_opt_out_ecount_part_opt(size,length) __deref_out_ecount_part_opt(size,length) __exceptthat __maybenull
+#define __deref_opt_out_bcount_part_opt(size,length) __deref_out_bcount_part_opt(size,length) __exceptthat __maybenull
+#define __deref_opt_out_ecount_full_opt(size) __deref_out_ecount_full_opt(size) __exceptthat __maybenull
+#define __deref_opt_out_bcount_full_opt(size) __deref_out_bcount_full_opt(size) __exceptthat __maybenull
+#define __deref_opt_out_z_opt __post __deref __valid __refparam __exceptthat __maybenull __pre __deref __exceptthat __maybenull __post __deref __exceptthat __maybenull __post __deref __nullterminated
+#define __deref_opt_out_ecount_z_opt(size) __deref_opt_out_ecount_opt(size) __post __deref __nullterminated
+#define __deref_opt_out_bcount_z_opt(size) __deref_opt_out_bcount_opt(size) __post __deref __nullterminated
+#define __deref_opt_out_nz_opt __deref_opt_out_opt
+#define __deref_opt_out_ecount_nz_opt(size) __deref_opt_out_ecount_opt(size)
+#define __deref_opt_out_bcount_nz_opt(size) __deref_opt_out_bcount_opt(size)
+#define __deref_opt_inout_opt __deref_inout_opt __exceptthat __maybenull
+#define __deref_opt_inout_ecount_opt(size) __deref_inout_ecount_opt(size) __exceptthat __maybenull
+#define __deref_opt_inout_bcount_opt(size) __deref_inout_bcount_opt(size) __exceptthat __maybenull
+#define __deref_opt_inout_ecount_part_opt(size,length) __deref_inout_ecount_part_opt(size,length) __exceptthat __maybenull
+#define __deref_opt_inout_bcount_part_opt(size,length) __deref_inout_bcount_part_opt(size,length) __exceptthat __maybenull
+#define __deref_opt_inout_ecount_full_opt(size) __deref_inout_ecount_full_opt(size) __exceptthat __maybenull
+#define __deref_opt_inout_bcount_full_opt(size) __deref_inout_bcount_full_opt(size) __exceptthat __maybenull
+#define __deref_opt_inout_z_opt __deref_opt_inout_opt __pre __deref __nullterminated __post __deref __nullterminated
+#define __deref_opt_inout_ecount_z_opt(size) __deref_opt_inout_ecount_opt(size) __pre __deref __nullterminated __post __deref __nullterminated
+#define __deref_opt_inout_bcount_z_opt(size) __deref_opt_inout_bcount_opt(size) __pre __deref __nullterminated __post __deref __nullterminated
+#define __deref_opt_inout_nz_opt __deref_opt_inout_opt
+#define __deref_opt_inout_ecount_nz_opt(size) __deref_opt_inout_ecount_opt(size)
+#define __deref_opt_inout_bcount_nz_opt(size) __deref_opt_inout_bcount_opt(size)
+
+/*
+-------------------------------------------------------------------------------
+Advanced Annotation Definitions
+
+Any of these may be used to directly annotate functions, and may be used in
+combination with each other or with regular buffer macros. For an explanation
+of each annotation, see the advanced annotations section.
+-------------------------------------------------------------------------------
+*/
+
+#define __success(expr) __inner_success(expr)
+#define __nullterminated __readableTo(sentinel(0))
+#define __nullnullterminated
+#define __reserved __pre __null
+#define __checkReturn __inner_checkReturn
+#define __typefix(ctype) __inner_typefix(ctype)
+#define __override __inner_override
+#define __callback __inner_callback
+#define __format_string
+#define __blocksOn(resource) __inner_blocksOn(resource)
+#define __control_entrypoint(category) __inner_control_entrypoint(category)
+#define __data_entrypoint(category) __inner_data_entrypoint(category)
+
+#ifndef __fallthrough
+ __inner_fallthrough_dec
+ #define __fallthrough __inner_fallthrough
+#endif
+
+#ifndef __analysis_assume
+#ifdef _PREFAST_
+#define __analysis_assume(expr) __assume(expr)
+#else
+#define __analysis_assume(expr)
+#endif
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+
diff --git a/core/src/fxge/Microsoft SDK/include/specstrings.h b/core/src/fxge/Microsoft SDK/include/specstrings.h
index 00cdd332ec..27a589a985 100644
--- a/core/src/fxge/Microsoft SDK/include/specstrings.h
+++ b/core/src/fxge/Microsoft SDK/include/specstrings.h
@@ -1,978 +1,978 @@
-/***************************************************************\
-* *
-* SpecStrings.h - markers for documenting the semantics of APIs *
-* *
-* Version 1.0 *
-* *
-* Copyright (c) Microsoft Corporation. All rights reserved. *
-* *
-\***************************************************************/
-
-// @@BEGIN_DDKSPLIT
-
-// -------------------------------------------------------------------------------
-// Introduction
-//
-// SpecStrings.h provides a set of annotations to describe how a function uses its
-// parameters - the assumptions it makes about them, and the guarantees it makes
-// upon finishing.
-//
-// Annotations may be placed before either a function parameter's type or its return
-// type, and describe the function's behavior regarding the parameter or return value.
-// There are two classes of annotations: buffer annotations and advanced annotations.
-// Buffer annotations describe how functions use their pointer parameters, and
-// advanced annotations either describe complex/unusual buffer behavior, or provide
-// additional information about a parameter that is not otherwise expressible.
-//
-// -------------------------------------------------------------------------------
-// Buffer Annotations
-//
-// The most important annotations in SpecStrings.h provide a consistent way to annotate
-// buffer parameters or return values for a function. Each of these annotations describes
-// a single buffer (which could be a string, a fixed-length or variable-length array,
-// or just a pointer) that the function interacts with: where it is, how large it is,
-// how much is initialized, and what the function does with it.
-//
-// The appropriate macro for a given buffer can be constructed using the table below.
-// Just pick the appropriate values from each category, and combine them together
-// with a leading underscore. Some combinations of values do not make sense as buffer
-// annotations. Only meaningful annotations can be added to your code; for a list of
-// these, see the buffer annotation definitions section.
-//
-// Only a single buffer annotation should be used for each parameter.
-//
-// |------------|------------|---------|--------|----------|---------------|
-// | Level | Usage | Size | Output | Optional | Parameters |
-// |------------|------------|---------|--------|----------|---------------|
-// | <> | <> | <> | <> | <> | <> |
-// | _deref | _in | _ecount | _full | _opt | (size) |
-// | _deref_opt | _out | _bcount | _part | | (size,length) |
-// | | _inout | | | | |
-// | | | | | | |
-// |------------|------------|---------|--------|----------|---------------|
-//
-// Level: Describes the buffer pointer's level of indirection from the parameter or
-// return value 'p'.
-//
-// <> : p is the buffer pointer.
-// _deref : *p is the buffer pointer. p must not be NULL.
-// _deref_opt : *p may be the buffer pointer. p may be NULL, in which case the rest of
-// the annotation is ignored.
-//
-// Usage: Describes how the function uses the buffer.
-//
-// <> : The buffer is not accessed. If used on the return value or with _deref, the
-// function will provide the buffer, and it will be uninitialized at exit.
-// Otherwise, the caller must provide the buffer. This should only be used
-// for alloc and free functions.
-// _in : The function will only read from the buffer. The caller must provide the
-// buffer and initialize it.
-// _out : The function will only write to the buffer. If used on the return value or
-// with _deref, the function will provide the buffer and initialize it.
-// Otherwise, the caller must provide the buffer, and the function will
-// initialize it.
-// _inout : The function may freely read from and write to the buffer. The caller must
-// provide the buffer and initialize it. If used with _deref, the buffer may
-// be reallocated by the function.
-//
-// Size: Describes the total size of the buffer. This may be less than the space actually
-// allocated for the buffer, in which case it describes the accessible amount.
-//
-// <> : No buffer size is given. If the type specifies the buffer size (such as
-// with LPSTR and LPWSTR), that amount is used. Otherwise, the buffer is one
-// element long. Must be used with _in, _out, or _inout.
-// _ecount : The buffer size is an explicit element count.
-// _bcount : The buffer size is an explicit byte count.
-//
-// Output: Describes how much of the buffer will be initialized by the function. For
-// _inout buffers, this also describes how much is initialized at entry. Omit this
-// category for _in buffers; they must be fully initialized by the caller.
-//
-// <> : The type specifies how much is initialized. For instance, a function initializing
-// an LPWSTR must NULL-terminate the string.
-// _full : The function initializes the entire buffer.
-// _part : The function initializes part of the buffer, and explicitly indicates how much.
-//
-// Optional: Describes if the buffer itself is optional.
-//
-// <> : The pointer to the buffer must not be NULL.
-// _opt : The pointer to the buffer might be NULL. It will be checked before being dereferenced.
-//
-// Parameters: Gives explicit counts for the size and length of the buffer.
-//
-// <> : There is no explicit count. Use when neither _ecount nor _bcount is used.
-// (size) : Only the buffer's total size is given. Use with _ecount or _bcount but not _part.
-// (size,length) : The buffer's total size and initialized length are given. Use with _ecount_part
-// and _bcount_part.
-//
-// -------------------------------------------------------------------------------
-// Buffer Annotation Examples
-//
-// LWSTDAPI_(BOOL) StrToIntExA(
-// LPCSTR pszString, // No annotation required, const implies __in.
-// DWORD dwFlags,
-// __out int *piRet // A pointer whose dereference will be filled in.
-// );
-//
-// void MyPaintingFunction(
-// __in HWND hwndControl, // An initialized read-only parameter.
-// __in_opt HDC hdcOptional, // An initialized read-only parameter that might be NULL.
-// __inout IPropertyStore *ppsStore // An initialized parameter that may be freely used
-// // and modified.
-// );
-//
-// LWSTDAPI_(BOOL) PathCompactPathExA(
-// __out_ecount(cchMax) LPSTR pszOut, // A string buffer with cch elements that will
-// // be NULL terminated on exit.
-// LPCSTR pszSrc, // No annotation required, const implies __in.
-// UINT cchMax,
-// DWORD dwFlags
-// );
-//
-// HRESULT SHLocalAllocBytes(
-// size_t cb,
-// __deref_bcount(cb) T **ppv // A pointer whose dereference will be set to an
-// // uninitialized buffer with cb bytes.
-// );
-//
-// __inout_bcount_full(cb) : A buffer with cb elements that is fully initialized at
-// entry and exit, and may be written to by this function.
-//
-// __out_ecount_part(count, *countOut) : A buffer with count elements that will be
-// partially initialized by this function. The function indicates how much it
-// initialized by setting *countOut.
-//
-// -------------------------------------------------------------------------------
-// Advanced Annotations
-//
-// Advanced annotations describe behavior that is not expressible with the regular
-// buffer macros. These may be used either to annotate buffer parameters that involve
-// complex or conditional behavior, or to enrich existing annotations with additional
-// information.
-//
-// __success(expr) f :
-// <expr> indicates whether function f succeeded or not. If <expr> is true at exit,
-// all the function's guarantees (as given by other annotations) must hold. If <expr>
-// is false at exit, the caller should not expect any of the function's guarantees
-// to hold. If not used, the function must always satisfy its guarantees. Added
-// automatically to functions that indicate success in standard ways, such as by
-// returning an HRESULT.
-//
-// __out_awcount(expr, size) p :
-// Pointer p is a buffer whose size may be given in either bytes or elements. If
-// <expr> is true, this acts like __out_bcount. If <expr> is false, this acts
-// like __out_ecount. This should only be used to annotate old APIs.
-//
-// __in_awcount(expr, size) p :
-// Pointer p is a buffer whose size may be given in either bytes or elements. If
-// <expr> is true, this acts like __in_bcount. If <expr> is false, this acts
-// like __in_ecount. This should only be used to annotate old APIs.
-//
-// __nullterminated p :
-// Pointer p is a buffer that may be read or written up to and including the first
-// NULL character or pointer. May be used on typedefs, which marks valid (properly
-// initialized) instances of that type as being NULL-terminated.
-//
-// __nullnullterminated p :
-// Pointer p is a buffer that may be read or written up to and including the first
-// sequence of two NULL characters or pointers. May be used on typedefs, which marks
-// valid instances of that type as being double-NULL terminated.
-//
-// __reserved v :
-// Value v must be 0/NULL, reserved for future use.
-//
-// __checkReturn v :
-// Return value v must not be ignored by callers of this function.
-//
-// __typefix(ctype) v :
-// Value v should be treated as an instance of ctype, rather than its declared type.
-//
-// __override f :
-// Specify C#-style 'override' behaviour for overriding virtual methods.
-//
-// __callback f :
-// Function f can be used as a function pointer.
-//
-// __format_string p :
-// Pointer p is a string that contains % markers in the style of printf.
-//
-// __blocksOn(resource) f :
-// Function f blocks on the resource 'resource'.
-//
-// __fallthrough :
-// Annotates switch statement labels where fall-through is desired, to distinguish
-// from forgotten break statements.
-//
-// -------------------------------------------------------------------------------
-// Advanced Annotation Examples
-//
-// __success(return == TRUE) LWSTDAPI_(BOOL)
-// PathCanonicalizeA(__out_ecount(MAX_PATH) LPSTR pszBuf, LPCSTR pszPath) :
-// pszBuf is only guaranteed to be NULL-terminated when TRUE is returned.
-//
-// typedef __nullterminated WCHAR* LPWSTR : Initialized LPWSTRs are NULL-terminated strings.
-//
-// __out_ecount(cch) __typefix(LPWSTR) void *psz : psz is a buffer parameter which will be
-// a NULL-terminated WCHAR string at exit, and which initially contains cch WCHARs.
-//
-// -------------------------------------------------------------------------------
-
-// @@END_DDKSPLIT
-
-#if _MSC_VER > 1000
-#pragma once
-#endif // #if _MSC_VER > 1000
-
-#define __specstrings
-
-#ifdef __cplusplus
-#ifndef __nothrow
-# define __nothrow __declspec(nothrow)
-#endif
-extern "C" {
-#else
-#ifndef __nothrow
-# define __nothrow
-#endif
-#endif // #ifdef __cplusplus
-
-// @@BEGIN_DDKSPLIT
-
-// -------------------------------------------------------------------------------
-// Helper Macro Definitions
-//
-// These express behavior common to many of the high-level annotations.
-// DO NOT USE THESE IN YOUR CODE.
-// -------------------------------------------------------------------------------
-
-// The helper annotations are only understood by the compiler version used by various
-// defect detection tools. When the regular compiler is running, they are defined into
-// nothing, and do not affect the compiled code.
-#if (_MSC_VER >= 1000) && !defined(MIDL_PASS) && defined(_PREFAST_)
-
- // In the primitive __declspec("SAL_*") annotations "SAL" stands for Standard
- // Annotation Language. These __declspec("SAL_*") annotations are the
- // primitives the compiler understands and all high-level SpecString MACROs
- // will decompose into these primivates.
-
- #define SPECSTRINGIZE( x ) #x
-
- //
- // __null p
- // __notnull p
- // __maybenull p
- //
- // Annotates a pointer p. States that pointer p is null. Commonly used
- // in the negated form __notnull or the possibly null form __maybenull.
- //
- #define __null __declspec("SAL_null")
- #define __notnull __declspec("SAL_notnull")
- #define __maybenull __declspec("SAL_maybenull")
-
- //
- // __readonly l
- // __notreadonly l
- // __mabyereadonly l
- //
- // Annotates a location l. States that location l is not modified after
- // this point. If the annotation is placed on the precondition state of
- // a function, the restriction only applies until the postcondition state
- // of the function. __maybereadonly states that the annotated location
- // may be modified, whereas __notreadonly states that a location must be
- // modified.
- //
- #define __readonly __declspec("SAL_readonly")
- #define __notreadonly __declspec("SAL_notreadonly")
- #define __maybereadonly __declspec("SAL_maybereadonly")
-
- //
- // __valid v
- // __notvalid v
- // __maybevalid v
- //
- // Annotates any value v. States that the value satisfies all properties of
- // valid values of its type. For example, for a string buffer, valid means
- // that the buffer pointer is either NULL or points to a NULL-terminated string.
- //
- #define __valid __declspec("SAL_valid")
- #define __notvalid __declspec("SAL_notvalid")
- #define __maybevalid __declspec("SAL_maybevalid")
-
- //
- // __readableTo(extent) p
- //
- // Annotates a buffer pointer p. If the buffer can be read, extent describes
- // how much of the buffer is readable. For a reader of the buffer, this is
- // an explicit permission to read up to that amount, rather than a restriction to
- // read only up to it.
- //
- #define __readableTo(extent) __declspec("SAL_readableTo("SPECSTRINGIZE(extent)")")
-
- //
- // __elem_readableTo(size)
- //
- // Annotates a buffer pointer p as being readable to size elements.
- //
- #define __elem_readableTo(size) __declspec("SAL_readableTo(elementCount("SPECSTRINGIZE(size)"))")
-
- //
- // __byte_readableTo(size)
- //
- // Annotates a buffer pointer p as being readable to size bytes.
- //
- #define __byte_readableTo(size) __declspec("SAL_readableTo(byteCount("SPECSTRINGIZE(size)"))")
-
- //
- // __writableTo(extent) p
- //
- // Annotates a buffer pointer p. If the buffer can be modified, extent
- // describes how much of the buffer is writable (usually the allocation
- // size). For a writer of the buffer, this is an explicit permission to
- // write up to that amount, rather than a restriction to write only up to it.
- //
- #define __writableTo(size) __declspec("SAL_writableTo("SPECSTRINGIZE(size)")")
-
- //
- // __elem_writableTo(size)
- //
- // Annotates a buffer pointer p as being writable to size elements.
- //
- #define __elem_writableTo(size) __declspec("SAL_writableTo(elementCount("SPECSTRINGIZE(size)"))")
-
- //
- // __byte_writableTo(size)
- //
- // Annotates a buffer pointer p as being writable to size bytes.
- //
- #define __byte_writableTo(size) __declspec("SAL_writableTo(byteCount("SPECSTRINGIZE(size)"))")
-
- //
- // __deref p
- //
- // Annotates a pointer p. The next annotation applies one dereference down
- // in the type. If readableTo(p, size) then the next annotation applies to
- // all elements *(p+i) for which i satisfies the size. If p is a pointer
- // to a struct, the next annotation applies to all fields of the struct.
- //
- #define __deref __declspec("SAL_deref")
-
- //
- // __pre __next_annotation
- //
- // The next annotation applies in the precondition state
- //
- #define __pre __declspec("SAL_pre")
-
- //
- // __post __next_annotation
- //
- // The next annotation applies in the postcondition state
- //
- #define __post __declspec("SAL_post")
-
- //
- // __precond(<expr>)
- //
- // When <expr> is true, the next annotation applies in the precondition state
- // (currently not enabled)
- //
- #define __precond(expr) __pre
-
- //
- // __postcond(<expr>)
- //
- // When <expr> is true, the next annotation applies in the postcondition state
- // (currently not enabled)
- //
- #define __postcond(expr) __post
-
- //
- // __exceptthat
- //
- // Given a set of annotations Q containing __exceptthat maybeP, the effect of
- // the except clause is to erase any P or notP annotations (explicit or
- // implied) within Q at the same level of dereferencing that the except
- // clause appears, and to replace it with maybeP.
- //
- // Example 1: __valid __exceptthat __maybenull on a pointer p means that the
- // pointer may be null, and is otherwise valid, thus overriding
- // the implicit notnull annotation implied by __valid on
- // pointers.
- //
- // Example 2: __valid __deref __exceptthat __maybenull on an int **p means
- // that p is not null (implied by valid), but the elements
- // pointed to by p could be null, and are otherwise valid.
- //
- #define __exceptthat __declspec("SAL_except")
-
- //
- // _refparam
- //
- // Added to all out parameter macros to indicate that they are all reference
- // parameters.
- //
- #define __refparam __deref __notreadonly
-
- //
- // __inner_*
- //
- // Helper macros that directly correspond to certain high-level annotations.
- //
- //
-
- // Macros to classify the entrypoints and indicate their category.
- //
- //
- // Pre-defined control point categories include: RPC, LPC, DeviceDriver, UserToKernel, ISAPI, COM.
- //
- #define __inner_control_entrypoint(category) __declspec("SAL_entrypoint(controlEntry, "SPECSTRINGIZE(category)")")
-
- //
- // Pre-defined data entry point categories include: Registry, File, Network.
- //
- #define __inner_data_entrypoint(category) __declspec("SAL_entrypoint(dataEntry, "SPECSTRINGIZE(category)")")
-
- #define __inner_success(expr) __declspec("SAL_success("SPECSTRINGIZE(expr)")")
- #define __inner_checkReturn __declspec("SAL_checkReturn")
- #define __inner_typefix(ctype) __declspec("SAL_typefix("SPECSTRINGIZE(ctype)")")
- #define __inner_override __declspec("__override")
- #define __inner_callback __declspec("__callback")
- #define __inner_blocksOn(resource) __declspec("SAL_blocksOn("SPECSTRINGIZE(resource)")")
- #define __inner_fallthrough_dec __inline __nothrow void __FallThrough() {}
- #define __inner_fallthrough __FallThrough();
-
-#else
-
-// @@END_DDKSPLIT
-
-#ifndef __null
- #define __null
-#endif
-#ifndef __notnull
- #define __notnull
-#endif
-#ifndef __maybenull
- #define __maybenull
-#endif
-#ifndef __readonly
- #define __readonly
-#endif
-#ifndef __notreadonly
- #define __notreadonly
-#endif
-#ifndef __maybereadonly
- #define __maybereadonly
-#endif
-#ifndef __valid
- #define __valid
-#endif
-#ifndef __notvalid
- #define __notvalid
-#endif
-#ifndef __maybevalid
- #define __maybevalid
-#endif
-#ifndef __readableTo
- #define __readableTo(extent)
-#endif
-#ifndef __elem_readableTo
- #define __elem_readableTo(size)
-#endif
-#ifndef __byte_readableTo
- #define __byte_readableTo(size)
-#endif
-#ifndef __writableTo
- #define __writableTo(size)
-#endif
-#ifndef __elem_writableTo
- #define __elem_writableTo(size)
-#endif
-#ifndef __byte_writableTo
- #define __byte_writableTo(size)
-#endif
-#ifndef __deref
- #define __deref
-#endif
-#ifndef __pre
- #define __pre
-#endif
-#ifndef __post
- #define __post
-#endif
-#ifndef __precond
- #define __precond(expr)
-#endif
-#ifndef __postcond
- #define __postcond(expr)
-#endif
-#ifndef __exceptthat
- #define __exceptthat
-#endif
-#ifndef __inner_success
- #define __inner_success(expr)
-#endif
-#ifndef __inner_checkReturn
- #define __inner_checkReturn
-#endif
-#ifndef __inner_typefix
- #define __inner_typefix(ctype)
-#endif
-#ifndef __inner_override
- #define __inner_override
-#endif
-#ifndef __inner_callback
- #define __inner_callback
-#endif
-#ifndef __inner_blocksOn
- #define __inner_blocksOn(resource)
-#endif
-#ifndef __inner_fallthrough_dec
- #define __inner_fallthrough_dec
-#endif
-#ifndef __inner_fallthrough
- #define __inner_fallthrough
-#endif
-#ifndef __refparam
- #define __refparam
-#endif
-#ifndef __inner_control_entrypoint
- #define __inner_control_entrypoint(category)
-#endif
-#ifndef __inner_data_entrypoint
- #define __inner_data_entrypoint(category)
-#endif
-// @@BEGIN_DDKSPLIT
-#endif // #if (_MSC_VER >= 1000) && !defined(MIDL_PASS) && defined(_PREFAST_)
-// -------------------------------------------------------------------------------
-// Buffer Annotation Definitions
-//
-// Any of these may be used to directly annotate functions, but only one should
-// be used for each parameter. To determine which annotation to use for a given
-// buffer, use the table in the buffer annotations section.
-// -------------------------------------------------------------------------------
-// @@END_DDKSPLIT
-
-#ifndef __ecount
-#define __ecount(size) __notnull __elem_writableTo(size)
-#endif
-#ifndef __bcount
-#define __bcount(size) __notnull __byte_writableTo(size)
-#endif
-#ifndef __in
-#define __in __pre __valid __pre __deref __readonly
-#endif
-#ifndef __in_ecount
-#define __in_ecount(size) __in __pre __elem_readableTo(size)
-#endif
-#ifndef __in_bcount
-#define __in_bcount(size) __in __pre __byte_readableTo(size)
-#endif
-#ifndef __out
-#define __out __ecount(1) __post __valid __refparam
-#endif
-#ifndef __out_ecount
-#define __out_ecount(size) __ecount(size) __post __valid __refparam
-#endif
-#ifndef __out_bcount
-#define __out_bcount(size) __bcount(size) __post __valid __refparam
-#endif
-#ifndef __out_ecount_part
-#define __out_ecount_part(size,length) __out_ecount(size) __post __elem_readableTo(length)
-#endif
-#ifndef __out_bcount_part
-#define __out_bcount_part(size,length) __out_bcount(size) __post __byte_readableTo(length)
-#endif
-#ifndef __out_ecount_full
-#define __out_ecount_full(size) __out_ecount_part(size,size)
-#endif
-#ifndef __out_bcount_full
-#define __out_bcount_full(size) __out_bcount_part(size,size)
-#endif
-#ifndef __inout
-#define __inout __pre __valid __post __valid __refparam
-#endif
-#ifndef __inout_ecount
-#define __inout_ecount(size) __out_ecount(size) __pre __valid
-#endif
-#ifndef __inout_bcount
-#define __inout_bcount(size) __out_bcount(size) __pre __valid
-#endif
-#ifndef __inout_ecount_part
-#define __inout_ecount_part(size,length) __out_ecount_part(size,length) __pre __valid __pre __elem_readableTo(length)
-#endif
-#ifndef __inout_bcount_part
-#define __inout_bcount_part(size,length) __out_bcount_part(size,length) __pre __valid __pre __byte_readableTo(length)
-#endif
-#ifndef __inout_ecount_full
-#define __inout_ecount_full(size) __inout_ecount_part(size,size)
-#endif
-#ifndef __inout_bcount_full
-#define __inout_bcount_full(size) __inout_bcount_part(size,size)
-#endif
-
-#ifndef __ecount_opt
-#define __ecount_opt(size) __ecount(size) __exceptthat __maybenull
-#endif
-#ifndef __bcount_opt
-#define __bcount_opt(size) __bcount(size) __exceptthat __maybenull
-#endif
-#ifndef __in_opt
-#define __in_opt __in __exceptthat __maybenull
-#endif
-#ifndef __in_ecount_opt
-#define __in_ecount_opt(size) __in_ecount(size) __exceptthat __maybenull
-#endif
-#ifndef __in_bcount_opt
-#define __in_bcount_opt(size) __in_bcount(size) __exceptthat __maybenull
-#endif
-#ifndef __out_opt
-#define __out_opt __out __exceptthat __maybenull
-#endif
-#ifndef __out_ecount_opt
-#define __out_ecount_opt(size) __out_ecount(size) __exceptthat __maybenull
-#endif
-#ifndef __out_bcount_opt
-#define __out_bcount_opt(size) __out_bcount(size) __exceptthat __maybenull
-#endif
-#ifndef __out_ecount_part_opt
-#define __out_ecount_part_opt(size,length) __out_ecount_part(size,length) __exceptthat __maybenull
-#endif
-#ifndef __out_bcount_part_opt
-#define __out_bcount_part_opt(size,length) __out_bcount_part(size,length) __exceptthat __maybenull
-#endif
-#ifndef __out_ecount_full_opt
-#define __out_ecount_full_opt(size) __out_ecount_full(size) __exceptthat __maybenull
-#endif
-#ifndef __out_bcount_full_opt
-#define __out_bcount_full_opt(size) __out_bcount_full(size) __exceptthat __maybenull
-#endif
-#ifndef __inout_opt
-#define __inout_opt __inout __exceptthat __maybenull
-#endif
-#ifndef __inout_ecount_opt
-#define __inout_ecount_opt(size) __inout_ecount(size) __exceptthat __maybenull
-#endif
-#ifndef __inout_bcount_opt
-#define __inout_bcount_opt(size) __inout_bcount(size) __exceptthat __maybenull
-#endif
-#ifndef __inout_ecount_part_opt
-#define __inout_ecount_part_opt(size,length) __inout_ecount_part(size,length) __exceptthat __maybenull
-#endif
-#ifndef __inout_bcount_part_opt
-#define __inout_bcount_part_opt(size,length) __inout_bcount_part(size,length) __exceptthat __maybenull
-#endif
-#ifndef __inout_ecount_full_opt
-#define __inout_ecount_full_opt(size) __inout_ecount_full(size) __exceptthat __maybenull
-#endif
-#ifndef __inout_bcount_full_opt
-#define __inout_bcount_full_opt(size) __inout_bcount_full(size) __exceptthat __maybenull
-#endif
-
-#ifndef __deref_ecount
-#define __deref_ecount(size) __ecount(1) __post __elem_readableTo(1) __post __deref __notnull __post __deref __elem_writableTo(size)
-#endif
-#ifndef __deref_bcount
-#define __deref_bcount(size) __ecount(1) __post __elem_readableTo(1) __post __deref __notnull __post __deref __byte_writableTo(size)
-#endif
-#ifndef __deref_in
-#define __deref_in __in __pre __deref __deref __readonly
-#endif
-#ifndef __deref_in_ecount
-#define __deref_in_ecount(size) __deref_in __pre __deref __elem_readableTo(size)
-#endif
-#ifndef __deref_in_bcount
-#define __deref_in_bcount(size) __deref_in __pre __deref __byte_readableTo(size)
-#endif
-#ifndef __deref_out
-#define __deref_out __deref_ecount(1) __post __deref __valid __refparam
-#endif
-#ifndef __deref_out_ecount
-#define __deref_out_ecount(size) __deref_ecount(size) __post __deref __valid __refparam
-#endif
-#ifndef __deref_out_bcount
-#define __deref_out_bcount(size) __deref_bcount(size) __post __deref __valid __refparam
-#endif
-#ifndef __deref_out_ecount_part
-#define __deref_out_ecount_part(size,length) __deref_out_ecount(size) __post __deref __elem_readableTo(length)
-#endif
-#ifndef __deref_out_bcount_part
-#define __deref_out_bcount_part(size,length) __deref_out_bcount(size) __post __deref __byte_readableTo(length)
-#endif
-#ifndef __deref_out_ecount_full
-#define __deref_out_ecount_full(size) __deref_out_ecount_part(size,size)
-#endif
-#ifndef __deref_out_bcount_full
-#define __deref_out_bcount_full(size) __deref_out_bcount_part(size,size)
-#endif
-#ifndef __deref_inout
-#define __deref_inout __notnull __elem_readableTo(1) __pre __deref __valid __post __deref __valid __refparam
-#endif
-#ifndef __deref_inout_ecount
-#define __deref_inout_ecount(size) __deref_inout __pre __deref __elem_writableTo(size) __post __deref __elem_writableTo(size)
-#endif
-#ifndef __deref_inout_bcount
-#define __deref_inout_bcount(size) __deref_inout __pre __deref __byte_writableTo(size) __post __deref __byte_writableTo(size)
-#endif
-#ifndef __deref_inout_ecount_part
-#define __deref_inout_ecount_part(size,length) __deref_inout_ecount(size) __pre __deref __elem_readableTo(length) __post __deref __elem_readableTo(length)
-#endif
-#ifndef __deref_inout_bcount_part
-#define __deref_inout_bcount_part(size,length) __deref_inout_bcount(size) __pre __deref __byte_readableTo(length) __post __deref __byte_readableTo(length)
-#endif
-#ifndef __deref_inout_ecount_full
-#define __deref_inout_ecount_full(size) __deref_inout_ecount_part(size,size)
-#endif
-#ifndef __deref_inout_bcount_full
-#define __deref_inout_bcount_full(size) __deref_inout_bcount_part(size,size)
-#endif
-
-#ifndef __deref_ecount_opt
-#define __deref_ecount_opt(size) __deref_ecount(size) __post __deref __exceptthat __maybenull
-#endif
-#ifndef __deref_bcount_opt
-#define __deref_bcount_opt(size) __deref_bcount(size) __post __deref __exceptthat __maybenull
-#endif
-#ifndef __deref_in_opt
-#define __deref_in_opt __deref_in __pre __deref __exceptthat __maybenull
-#endif
-#ifndef __deref_in_ecount_opt
-#define __deref_in_ecount_opt(size) __deref_in_ecount(size) __pre __deref __exceptthat __maybenull
-#endif
-#ifndef __deref_in_bcount_opt
-#define __deref_in_bcount_opt(size) __deref_in_bcount(size) __pre __deref __exceptthat __maybenull
-#endif
-#ifndef __deref_out_opt
-#define __deref_out_opt __deref_out __post __deref __exceptthat __maybenull
-#endif
-#ifndef __deref_out_ecount_opt
-#define __deref_out_ecount_opt(size) __deref_out_ecount(size) __post __deref __exceptthat __maybenull
-#endif
-#ifndef __deref_out_bcount_opt
-#define __deref_out_bcount_opt(size) __deref_out_bcount(size) __post __deref __exceptthat __maybenull
-#endif
-#ifndef __deref_out_ecount_part_opt
-#define __deref_out_ecount_part_opt(size,length) __deref_out_ecount_part(size,length) __post __deref __exceptthat __maybenull
-#endif
-#ifndef __deref_out_bcount_part_opt
-#define __deref_out_bcount_part_opt(size,length) __deref_out_bcount_part(size,length) __post __deref __exceptthat __maybenull
-#endif
-#ifndef __deref_out_ecount_full_opt
-#define __deref_out_ecount_full_opt(size) __deref_out_ecount_full(size) __post __deref __exceptthat __maybenull
-#endif
-#ifndef __deref_out_bcount_full_opt
-#define __deref_out_bcount_full_opt(size) __deref_out_bcount_full(size) __post __deref __exceptthat __maybenull
-#endif
-#ifndef __deref_inout_opt
-#define __deref_inout_opt __deref_inout __pre __deref __exceptthat __maybenull __post __deref __exceptthat __maybenull
-#endif
-#ifndef __deref_inout_ecount_opt
-#define __deref_inout_ecount_opt(size) __deref_inout_ecount(size) __pre __deref __exceptthat __maybenull __post __deref __exceptthat __maybenull
-#endif
-#ifndef __deref_inout_bcount_opt
-#define __deref_inout_bcount_opt(size) __deref_inout_bcount(size) __pre __deref __exceptthat __maybenull __post __deref __exceptthat __maybenull
-#endif
-#ifndef __deref_inout_ecount_part_opt
-#define __deref_inout_ecount_part_opt(size,length) __deref_inout_ecount_part(size,length) __pre __deref __exceptthat __maybenull __post __deref __exceptthat __maybenull
-#endif
-#ifndef __deref_inout_bcount_part_opt
-#define __deref_inout_bcount_part_opt(size,length) __deref_inout_bcount_part(size,length) __pre __deref __exceptthat __maybenull __post __deref __exceptthat __maybenull
-#endif
-#ifndef __deref_inout_ecount_full_opt
-#define __deref_inout_ecount_full_opt(size) __deref_inout_ecount_full(size) __pre __deref __exceptthat __maybenull __post __deref __exceptthat __maybenull
-#endif
-#ifndef __deref_inout_bcount_full_opt
-#define __deref_inout_bcount_full_opt(size) __deref_inout_bcount_full(size) __pre __deref __exceptthat __maybenull __post __deref __exceptthat __maybenull
-#endif
-
-#ifndef __deref_opt_ecount
-#define __deref_opt_ecount(size) __deref_ecount(size) __exceptthat __maybenull
-#endif
-#ifndef __deref_opt_bcount
-#define __deref_opt_bcount(size) __deref_bcount(size) __exceptthat __maybenull
-#endif
-#ifndef __deref_opt_in
-#define __deref_opt_in __deref_in __exceptthat __maybenull
-#endif
-#ifndef __deref_opt_in_ecount
-#define __deref_opt_in_ecount(size) __deref_in_ecount(size) __exceptthat __maybenull
-#endif
-#ifndef __deref_opt_in_bcount
-#define __deref_opt_in_bcount(size) __deref_in_bcount(size) __exceptthat __maybenull
-#endif
-#ifndef __deref_opt_out
-#define __deref_opt_out __deref_out __exceptthat __maybenull
-#endif
-#ifndef __deref_opt_out_ecount
-#define __deref_opt_out_ecount(size) __deref_out_ecount(size) __exceptthat __maybenull
-#endif
-#ifndef __deref_opt_out_bcount
-#define __deref_opt_out_bcount(size) __deref_out_bcount(size) __exceptthat __maybenull
-#endif
-#ifndef __deref_opt_out_ecount_part
-#define __deref_opt_out_ecount_part(size,length) __deref_out_ecount_part(size,length) __exceptthat __maybenull
-#endif
-#ifndef __deref_opt_out_bcount_part
-#define __deref_opt_out_bcount_part(size,length) __deref_out_bcount_part(size,length) __exceptthat __maybenull
-#endif
-#ifndef __deref_opt_out_ecount_full
-#define __deref_opt_out_ecount_full(size) __deref_out_ecount_full(size) __exceptthat __maybenull
-#endif
-#ifndef __deref_opt_out_bcount_full
-#define __deref_opt_out_bcount_full(size) __deref_out_bcount_full(size) __exceptthat __maybenull
-#endif
-#ifndef __deref_opt_inout
-#define __deref_opt_inout __deref_inout __exceptthat __maybenull
-#endif
-#ifndef __deref_opt_inout_ecount
-#define __deref_opt_inout_ecount(size) __deref_inout_ecount(size) __exceptthat __maybenull
-#endif
-#ifndef __deref_opt_inout_bcount
-#define __deref_opt_inout_bcount(size) __deref_inout_bcount(size) __exceptthat __maybenull
-#endif
-#ifndef __deref_opt_inout_ecount_part
-#define __deref_opt_inout_ecount_part(size,length) __deref_inout_ecount_part(size,length) __exceptthat __maybenull
-#endif
-#ifndef __deref_opt_inout_bcount_part
-#define __deref_opt_inout_bcount_part(size,length) __deref_inout_bcount_part(size,length) __exceptthat __maybenull
-#endif
-#ifndef __deref_opt_inout_ecount_full
-#define __deref_opt_inout_ecount_full(size) __deref_inout_ecount_full(size) __exceptthat __maybenull
-#endif
-#ifndef __deref_opt_inout_bcount_full
-#define __deref_opt_inout_bcount_full(size) __deref_inout_bcount_full(size) __exceptthat __maybenull
-#endif
-
-#ifndef __deref_opt_ecount_opt
-#define __deref_opt_ecount_opt(size) __deref_ecount_opt(size) __exceptthat __maybenull
-#endif
-#ifndef __deref_opt_bcount_opt
-#define __deref_opt_bcount_opt(size) __deref_bcount_opt(size) __exceptthat __maybenull
-#endif
-#ifndef __deref_opt_in_opt
-#define __deref_opt_in_opt __deref_in_opt __exceptthat __maybenull
-#endif
-#ifndef __deref_opt_in_ecount_opt
-#define __deref_opt_in_ecount_opt(size) __deref_in_ecount_opt(size) __exceptthat __maybenull
-#endif
-#ifndef __deref_opt_in_bcount_opt
-#define __deref_opt_in_bcount_opt(size) __deref_in_bcount_opt(size) __exceptthat __maybenull
-#endif
-#ifndef __deref_opt_out_opt
-#define __deref_opt_out_opt __deref_out_opt __exceptthat __maybenull
-#endif
-#ifndef __deref_opt_out_ecount_opt
-#define __deref_opt_out_ecount_opt(size) __deref_out_ecount_opt(size) __exceptthat __maybenull
-#endif
-#ifndef __deref_opt_out_bcount_opt
-#define __deref_opt_out_bcount_opt(size) __deref_out_bcount_opt(size) __exceptthat __maybenull
-#endif
-#ifndef __deref_opt_out_ecount_part_opt
-#define __deref_opt_out_ecount_part_opt(size,length) __deref_out_ecount_part_opt(size,length) __exceptthat __maybenull
-#endif
-#ifndef __deref_opt_out_bcount_part_opt
-#define __deref_opt_out_bcount_part_opt(size,length) __deref_out_bcount_part_opt(size,length) __exceptthat __maybenull
-#endif
-#ifndef __deref_opt_out_ecount_full_opt
-#define __deref_opt_out_ecount_full_opt(size) __deref_out_ecount_full_opt(size) __exceptthat __maybenull
-#endif
-#ifndef __deref_opt_out_bcount_full_opt
-#define __deref_opt_out_bcount_full_opt(size) __deref_out_bcount_full_opt(size) __exceptthat __maybenull
-#endif
-#ifndef __deref_opt_inout_opt
-#define __deref_opt_inout_opt __deref_inout_opt __exceptthat __maybenull
-#endif
-#ifndef __deref_opt_inout_ecount_opt
-#define __deref_opt_inout_ecount_opt(size) __deref_inout_ecount_opt(size) __exceptthat __maybenull
-#endif
-#ifndef __deref_opt_inout_bcount_opt
-#define __deref_opt_inout_bcount_opt(size) __deref_inout_bcount_opt(size) __exceptthat __maybenull
-#endif
-#ifndef __deref_opt_inout_ecount_part_opt
-#define __deref_opt_inout_ecount_part_opt(size,length) __deref_inout_ecount_part_opt(size,length) __exceptthat __maybenull
-#endif
-#ifndef __deref_opt_inout_bcount_part_opt
-#define __deref_opt_inout_bcount_part_opt(size,length) __deref_inout_bcount_part_opt(size,length) __exceptthat __maybenull
-#endif
-#ifndef __deref_opt_inout_ecount_full_opt
-#define __deref_opt_inout_ecount_full_opt(size) __deref_inout_ecount_full_opt(size) __exceptthat __maybenull
-#endif
-#ifndef __deref_opt_inout_bcount_full_opt
-#define __deref_opt_inout_bcount_full_opt(size) __deref_inout_bcount_full_opt(size) __exceptthat __maybenull
-#endif
-
-// @@BEGIN_DDKSPLIT
-// -------------------------------------------------------------------------------
-// Advanced Annotation Definitions
-//
-// Any of these may be used to directly annotate functions, and may be used in
-// combination with each other or with regular buffer macros. For an explanation
-// of each annotation, see the advanced annotations section.
-// -------------------------------------------------------------------------------
-// @@END_DDKSPLIT
-
-#ifndef __out_awcount
-#define __out_awcount(expr,size) __pre __notnull \
- __precond(expr) __byte_writableTo(size) \
- __precond(!(expr)) __byte_writableTo((size)*2) \
- __post __valid __refparam
-#endif
-#ifndef __in_awcount
-#define __in_awcount(expr,size) __pre __valid \
- __pre __deref __readonly \
- __precond(expr) __byte_readableTo(size) \
- __precond(!(expr)) __elem_readableTo(size)
-#endif
-#ifndef __success
-#define __success(expr) __inner_success(expr)
-#endif
-#ifndef __nullterminated
-#define __nullterminated __readableTo(sentinel(0))
-#endif
-#ifndef __nullnullterminated
-#define __nullnullterminated
-#endif
-#ifndef __reserved
-#define __reserved __pre __null
-#endif
-#ifndef __checkReturn
-#define __checkReturn __inner_checkReturn
-#endif
-#ifndef __typefix
-#define __typefix(ctype) __inner_typefix(ctype)
-#endif
-#ifndef __override
-#define __override __inner_override
-#endif
-#ifndef __callback
-#define __callback __inner_callback
-#endif
-#ifndef __format_string
-#define __format_string
-#endif
-#ifndef __blocksOn
-#define __blocksOn(resource) __inner_blocksOn(resource)
-#endif
-#ifndef __control_entrypoint
-#define __control_entrypoint(category) __inner_control_entrypoint(category)
-#endif
-#ifndef __data_entrypoint
-#define __data_entrypoint(category) __inner_data_entrypoint(category)
-#endif
-
-#ifndef __fallthrough
- __inner_fallthrough_dec
- #define __fallthrough __inner_fallthrough
-#endif
-
-// -------------------------------------------------------------------------------
-// Deprecated Annotation Definitions
-//
-// These should be removed from existing code.
-// -------------------------------------------------------------------------------
-
-// #define __opt __exceptthat __maybenull
-
-#ifdef __cplusplus
-}
-#endif
-
+/***************************************************************\
+* *
+* SpecStrings.h - markers for documenting the semantics of APIs *
+* *
+* Version 1.0 *
+* *
+* Copyright (c) Microsoft Corporation. All rights reserved. *
+* *
+\***************************************************************/
+
+// @@BEGIN_DDKSPLIT
+
+// -------------------------------------------------------------------------------
+// Introduction
+//
+// SpecStrings.h provides a set of annotations to describe how a function uses its
+// parameters - the assumptions it makes about them, and the guarantees it makes
+// upon finishing.
+//
+// Annotations may be placed before either a function parameter's type or its return
+// type, and describe the function's behavior regarding the parameter or return value.
+// There are two classes of annotations: buffer annotations and advanced annotations.
+// Buffer annotations describe how functions use their pointer parameters, and
+// advanced annotations either describe complex/unusual buffer behavior, or provide
+// additional information about a parameter that is not otherwise expressible.
+//
+// -------------------------------------------------------------------------------
+// Buffer Annotations
+//
+// The most important annotations in SpecStrings.h provide a consistent way to annotate
+// buffer parameters or return values for a function. Each of these annotations describes
+// a single buffer (which could be a string, a fixed-length or variable-length array,
+// or just a pointer) that the function interacts with: where it is, how large it is,
+// how much is initialized, and what the function does with it.
+//
+// The appropriate macro for a given buffer can be constructed using the table below.
+// Just pick the appropriate values from each category, and combine them together
+// with a leading underscore. Some combinations of values do not make sense as buffer
+// annotations. Only meaningful annotations can be added to your code; for a list of
+// these, see the buffer annotation definitions section.
+//
+// Only a single buffer annotation should be used for each parameter.
+//
+// |------------|------------|---------|--------|----------|---------------|
+// | Level | Usage | Size | Output | Optional | Parameters |
+// |------------|------------|---------|--------|----------|---------------|
+// | <> | <> | <> | <> | <> | <> |
+// | _deref | _in | _ecount | _full | _opt | (size) |
+// | _deref_opt | _out | _bcount | _part | | (size,length) |
+// | | _inout | | | | |
+// | | | | | | |
+// |------------|------------|---------|--------|----------|---------------|
+//
+// Level: Describes the buffer pointer's level of indirection from the parameter or
+// return value 'p'.
+//
+// <> : p is the buffer pointer.
+// _deref : *p is the buffer pointer. p must not be NULL.
+// _deref_opt : *p may be the buffer pointer. p may be NULL, in which case the rest of
+// the annotation is ignored.
+//
+// Usage: Describes how the function uses the buffer.
+//
+// <> : The buffer is not accessed. If used on the return value or with _deref, the
+// function will provide the buffer, and it will be uninitialized at exit.
+// Otherwise, the caller must provide the buffer. This should only be used
+// for alloc and free functions.
+// _in : The function will only read from the buffer. The caller must provide the
+// buffer and initialize it.
+// _out : The function will only write to the buffer. If used on the return value or
+// with _deref, the function will provide the buffer and initialize it.
+// Otherwise, the caller must provide the buffer, and the function will
+// initialize it.
+// _inout : The function may freely read from and write to the buffer. The caller must
+// provide the buffer and initialize it. If used with _deref, the buffer may
+// be reallocated by the function.
+//
+// Size: Describes the total size of the buffer. This may be less than the space actually
+// allocated for the buffer, in which case it describes the accessible amount.
+//
+// <> : No buffer size is given. If the type specifies the buffer size (such as
+// with LPSTR and LPWSTR), that amount is used. Otherwise, the buffer is one
+// element long. Must be used with _in, _out, or _inout.
+// _ecount : The buffer size is an explicit element count.
+// _bcount : The buffer size is an explicit byte count.
+//
+// Output: Describes how much of the buffer will be initialized by the function. For
+// _inout buffers, this also describes how much is initialized at entry. Omit this
+// category for _in buffers; they must be fully initialized by the caller.
+//
+// <> : The type specifies how much is initialized. For instance, a function initializing
+// an LPWSTR must NULL-terminate the string.
+// _full : The function initializes the entire buffer.
+// _part : The function initializes part of the buffer, and explicitly indicates how much.
+//
+// Optional: Describes if the buffer itself is optional.
+//
+// <> : The pointer to the buffer must not be NULL.
+// _opt : The pointer to the buffer might be NULL. It will be checked before being dereferenced.
+//
+// Parameters: Gives explicit counts for the size and length of the buffer.
+//
+// <> : There is no explicit count. Use when neither _ecount nor _bcount is used.
+// (size) : Only the buffer's total size is given. Use with _ecount or _bcount but not _part.
+// (size,length) : The buffer's total size and initialized length are given. Use with _ecount_part
+// and _bcount_part.
+//
+// -------------------------------------------------------------------------------
+// Buffer Annotation Examples
+//
+// LWSTDAPI_(BOOL) StrToIntExA(
+// LPCSTR pszString, // No annotation required, const implies __in.
+// DWORD dwFlags,
+// __out int *piRet // A pointer whose dereference will be filled in.
+// );
+//
+// void MyPaintingFunction(
+// __in HWND hwndControl, // An initialized read-only parameter.
+// __in_opt HDC hdcOptional, // An initialized read-only parameter that might be NULL.
+// __inout IPropertyStore *ppsStore // An initialized parameter that may be freely used
+// // and modified.
+// );
+//
+// LWSTDAPI_(BOOL) PathCompactPathExA(
+// __out_ecount(cchMax) LPSTR pszOut, // A string buffer with cch elements that will
+// // be NULL terminated on exit.
+// LPCSTR pszSrc, // No annotation required, const implies __in.
+// UINT cchMax,
+// DWORD dwFlags
+// );
+//
+// HRESULT SHLocalAllocBytes(
+// size_t cb,
+// __deref_bcount(cb) T **ppv // A pointer whose dereference will be set to an
+// // uninitialized buffer with cb bytes.
+// );
+//
+// __inout_bcount_full(cb) : A buffer with cb elements that is fully initialized at
+// entry and exit, and may be written to by this function.
+//
+// __out_ecount_part(count, *countOut) : A buffer with count elements that will be
+// partially initialized by this function. The function indicates how much it
+// initialized by setting *countOut.
+//
+// -------------------------------------------------------------------------------
+// Advanced Annotations
+//
+// Advanced annotations describe behavior that is not expressible with the regular
+// buffer macros. These may be used either to annotate buffer parameters that involve
+// complex or conditional behavior, or to enrich existing annotations with additional
+// information.
+//
+// __success(expr) f :
+// <expr> indicates whether function f succeeded or not. If <expr> is true at exit,
+// all the function's guarantees (as given by other annotations) must hold. If <expr>
+// is false at exit, the caller should not expect any of the function's guarantees
+// to hold. If not used, the function must always satisfy its guarantees. Added
+// automatically to functions that indicate success in standard ways, such as by
+// returning an HRESULT.
+//
+// __out_awcount(expr, size) p :
+// Pointer p is a buffer whose size may be given in either bytes or elements. If
+// <expr> is true, this acts like __out_bcount. If <expr> is false, this acts
+// like __out_ecount. This should only be used to annotate old APIs.
+//
+// __in_awcount(expr, size) p :
+// Pointer p is a buffer whose size may be given in either bytes or elements. If
+// <expr> is true, this acts like __in_bcount. If <expr> is false, this acts
+// like __in_ecount. This should only be used to annotate old APIs.
+//
+// __nullterminated p :
+// Pointer p is a buffer that may be read or written up to and including the first
+// NULL character or pointer. May be used on typedefs, which marks valid (properly
+// initialized) instances of that type as being NULL-terminated.
+//
+// __nullnullterminated p :
+// Pointer p is a buffer that may be read or written up to and including the first
+// sequence of two NULL characters or pointers. May be used on typedefs, which marks
+// valid instances of that type as being double-NULL terminated.
+//
+// __reserved v :
+// Value v must be 0/NULL, reserved for future use.
+//
+// __checkReturn v :
+// Return value v must not be ignored by callers of this function.
+//
+// __typefix(ctype) v :
+// Value v should be treated as an instance of ctype, rather than its declared type.
+//
+// __override f :
+// Specify C#-style 'override' behaviour for overriding virtual methods.
+//
+// __callback f :
+// Function f can be used as a function pointer.
+//
+// __format_string p :
+// Pointer p is a string that contains % markers in the style of printf.
+//
+// __blocksOn(resource) f :
+// Function f blocks on the resource 'resource'.
+//
+// __fallthrough :
+// Annotates switch statement labels where fall-through is desired, to distinguish
+// from forgotten break statements.
+//
+// -------------------------------------------------------------------------------
+// Advanced Annotation Examples
+//
+// __success(return == TRUE) LWSTDAPI_(BOOL)
+// PathCanonicalizeA(__out_ecount(MAX_PATH) LPSTR pszBuf, LPCSTR pszPath) :
+// pszBuf is only guaranteed to be NULL-terminated when TRUE is returned.
+//
+// typedef __nullterminated WCHAR* LPWSTR : Initialized LPWSTRs are NULL-terminated strings.
+//
+// __out_ecount(cch) __typefix(LPWSTR) void *psz : psz is a buffer parameter which will be
+// a NULL-terminated WCHAR string at exit, and which initially contains cch WCHARs.
+//
+// -------------------------------------------------------------------------------
+
+// @@END_DDKSPLIT
+
+#if _MSC_VER > 1000
+#pragma once
+#endif // #if _MSC_VER > 1000
+
+#define __specstrings
+
+#ifdef __cplusplus
+#ifndef __nothrow
+# define __nothrow __declspec(nothrow)
+#endif
+extern "C" {
+#else
+#ifndef __nothrow
+# define __nothrow
+#endif
+#endif // #ifdef __cplusplus
+
+// @@BEGIN_DDKSPLIT
+
+// -------------------------------------------------------------------------------
+// Helper Macro Definitions
+//
+// These express behavior common to many of the high-level annotations.
+// DO NOT USE THESE IN YOUR CODE.
+// -------------------------------------------------------------------------------
+
+// The helper annotations are only understood by the compiler version used by various
+// defect detection tools. When the regular compiler is running, they are defined into
+// nothing, and do not affect the compiled code.
+#if (_MSC_VER >= 1000) && !defined(MIDL_PASS) && defined(_PREFAST_)
+
+ // In the primitive __declspec("SAL_*") annotations "SAL" stands for Standard
+ // Annotation Language. These __declspec("SAL_*") annotations are the
+ // primitives the compiler understands and all high-level SpecString MACROs
+ // will decompose into these primivates.
+
+ #define SPECSTRINGIZE( x ) #x
+
+ //
+ // __null p
+ // __notnull p
+ // __maybenull p
+ //
+ // Annotates a pointer p. States that pointer p is null. Commonly used
+ // in the negated form __notnull or the possibly null form __maybenull.
+ //
+ #define __null __declspec("SAL_null")
+ #define __notnull __declspec("SAL_notnull")
+ #define __maybenull __declspec("SAL_maybenull")
+
+ //
+ // __readonly l
+ // __notreadonly l
+ // __mabyereadonly l
+ //
+ // Annotates a location l. States that location l is not modified after
+ // this point. If the annotation is placed on the precondition state of
+ // a function, the restriction only applies until the postcondition state
+ // of the function. __maybereadonly states that the annotated location
+ // may be modified, whereas __notreadonly states that a location must be
+ // modified.
+ //
+ #define __readonly __declspec("SAL_readonly")
+ #define __notreadonly __declspec("SAL_notreadonly")
+ #define __maybereadonly __declspec("SAL_maybereadonly")
+
+ //
+ // __valid v
+ // __notvalid v
+ // __maybevalid v
+ //
+ // Annotates any value v. States that the value satisfies all properties of
+ // valid values of its type. For example, for a string buffer, valid means
+ // that the buffer pointer is either NULL or points to a NULL-terminated string.
+ //
+ #define __valid __declspec("SAL_valid")
+ #define __notvalid __declspec("SAL_notvalid")
+ #define __maybevalid __declspec("SAL_maybevalid")
+
+ //
+ // __readableTo(extent) p
+ //
+ // Annotates a buffer pointer p. If the buffer can be read, extent describes
+ // how much of the buffer is readable. For a reader of the buffer, this is
+ // an explicit permission to read up to that amount, rather than a restriction to
+ // read only up to it.
+ //
+ #define __readableTo(extent) __declspec("SAL_readableTo("SPECSTRINGIZE(extent)")")
+
+ //
+ // __elem_readableTo(size)
+ //
+ // Annotates a buffer pointer p as being readable to size elements.
+ //
+ #define __elem_readableTo(size) __declspec("SAL_readableTo(elementCount("SPECSTRINGIZE(size)"))")
+
+ //
+ // __byte_readableTo(size)
+ //
+ // Annotates a buffer pointer p as being readable to size bytes.
+ //
+ #define __byte_readableTo(size) __declspec("SAL_readableTo(byteCount("SPECSTRINGIZE(size)"))")
+
+ //
+ // __writableTo(extent) p
+ //
+ // Annotates a buffer pointer p. If the buffer can be modified, extent
+ // describes how much of the buffer is writable (usually the allocation
+ // size). For a writer of the buffer, this is an explicit permission to
+ // write up to that amount, rather than a restriction to write only up to it.
+ //
+ #define __writableTo(size) __declspec("SAL_writableTo("SPECSTRINGIZE(size)")")
+
+ //
+ // __elem_writableTo(size)
+ //
+ // Annotates a buffer pointer p as being writable to size elements.
+ //
+ #define __elem_writableTo(size) __declspec("SAL_writableTo(elementCount("SPECSTRINGIZE(size)"))")
+
+ //
+ // __byte_writableTo(size)
+ //
+ // Annotates a buffer pointer p as being writable to size bytes.
+ //
+ #define __byte_writableTo(size) __declspec("SAL_writableTo(byteCount("SPECSTRINGIZE(size)"))")
+
+ //
+ // __deref p
+ //
+ // Annotates a pointer p. The next annotation applies one dereference down
+ // in the type. If readableTo(p, size) then the next annotation applies to
+ // all elements *(p+i) for which i satisfies the size. If p is a pointer
+ // to a struct, the next annotation applies to all fields of the struct.
+ //
+ #define __deref __declspec("SAL_deref")
+
+ //
+ // __pre __next_annotation
+ //
+ // The next annotation applies in the precondition state
+ //
+ #define __pre __declspec("SAL_pre")
+
+ //
+ // __post __next_annotation
+ //
+ // The next annotation applies in the postcondition state
+ //
+ #define __post __declspec("SAL_post")
+
+ //
+ // __precond(<expr>)
+ //
+ // When <expr> is true, the next annotation applies in the precondition state
+ // (currently not enabled)
+ //
+ #define __precond(expr) __pre
+
+ //
+ // __postcond(<expr>)
+ //
+ // When <expr> is true, the next annotation applies in the postcondition state
+ // (currently not enabled)
+ //
+ #define __postcond(expr) __post
+
+ //
+ // __exceptthat
+ //
+ // Given a set of annotations Q containing __exceptthat maybeP, the effect of
+ // the except clause is to erase any P or notP annotations (explicit or
+ // implied) within Q at the same level of dereferencing that the except
+ // clause appears, and to replace it with maybeP.
+ //
+ // Example 1: __valid __exceptthat __maybenull on a pointer p means that the
+ // pointer may be null, and is otherwise valid, thus overriding
+ // the implicit notnull annotation implied by __valid on
+ // pointers.
+ //
+ // Example 2: __valid __deref __exceptthat __maybenull on an int **p means
+ // that p is not null (implied by valid), but the elements
+ // pointed to by p could be null, and are otherwise valid.
+ //
+ #define __exceptthat __declspec("SAL_except")
+
+ //
+ // _refparam
+ //
+ // Added to all out parameter macros to indicate that they are all reference
+ // parameters.
+ //
+ #define __refparam __deref __notreadonly
+
+ //
+ // __inner_*
+ //
+ // Helper macros that directly correspond to certain high-level annotations.
+ //
+ //
+
+ // Macros to classify the entrypoints and indicate their category.
+ //
+ //
+ // Pre-defined control point categories include: RPC, LPC, DeviceDriver, UserToKernel, ISAPI, COM.
+ //
+ #define __inner_control_entrypoint(category) __declspec("SAL_entrypoint(controlEntry, "SPECSTRINGIZE(category)")")
+
+ //
+ // Pre-defined data entry point categories include: Registry, File, Network.
+ //
+ #define __inner_data_entrypoint(category) __declspec("SAL_entrypoint(dataEntry, "SPECSTRINGIZE(category)")")
+
+ #define __inner_success(expr) __declspec("SAL_success("SPECSTRINGIZE(expr)")")
+ #define __inner_checkReturn __declspec("SAL_checkReturn")
+ #define __inner_typefix(ctype) __declspec("SAL_typefix("SPECSTRINGIZE(ctype)")")
+ #define __inner_override __declspec("__override")
+ #define __inner_callback __declspec("__callback")
+ #define __inner_blocksOn(resource) __declspec("SAL_blocksOn("SPECSTRINGIZE(resource)")")
+ #define __inner_fallthrough_dec __inline __nothrow void __FallThrough() {}
+ #define __inner_fallthrough __FallThrough();
+
+#else
+
+// @@END_DDKSPLIT
+
+#ifndef __null
+ #define __null
+#endif
+#ifndef __notnull
+ #define __notnull
+#endif
+#ifndef __maybenull
+ #define __maybenull
+#endif
+#ifndef __readonly
+ #define __readonly
+#endif
+#ifndef __notreadonly
+ #define __notreadonly
+#endif
+#ifndef __maybereadonly
+ #define __maybereadonly
+#endif
+#ifndef __valid
+ #define __valid
+#endif
+#ifndef __notvalid
+ #define __notvalid
+#endif
+#ifndef __maybevalid
+ #define __maybevalid
+#endif
+#ifndef __readableTo
+ #define __readableTo(extent)
+#endif
+#ifndef __elem_readableTo
+ #define __elem_readableTo(size)
+#endif
+#ifndef __byte_readableTo
+ #define __byte_readableTo(size)
+#endif
+#ifndef __writableTo
+ #define __writableTo(size)
+#endif
+#ifndef __elem_writableTo
+ #define __elem_writableTo(size)
+#endif
+#ifndef __byte_writableTo
+ #define __byte_writableTo(size)
+#endif
+#ifndef __deref
+ #define __deref
+#endif
+#ifndef __pre
+ #define __pre
+#endif
+#ifndef __post
+ #define __post
+#endif
+#ifndef __precond
+ #define __precond(expr)
+#endif
+#ifndef __postcond
+ #define __postcond(expr)
+#endif
+#ifndef __exceptthat
+ #define __exceptthat
+#endif
+#ifndef __inner_success
+ #define __inner_success(expr)
+#endif
+#ifndef __inner_checkReturn
+ #define __inner_checkReturn
+#endif
+#ifndef __inner_typefix
+ #define __inner_typefix(ctype)
+#endif
+#ifndef __inner_override
+ #define __inner_override
+#endif
+#ifndef __inner_callback
+ #define __inner_callback
+#endif
+#ifndef __inner_blocksOn
+ #define __inner_blocksOn(resource)
+#endif
+#ifndef __inner_fallthrough_dec
+ #define __inner_fallthrough_dec
+#endif
+#ifndef __inner_fallthrough
+ #define __inner_fallthrough
+#endif
+#ifndef __refparam
+ #define __refparam
+#endif
+#ifndef __inner_control_entrypoint
+ #define __inner_control_entrypoint(category)
+#endif
+#ifndef __inner_data_entrypoint
+ #define __inner_data_entrypoint(category)
+#endif
+// @@BEGIN_DDKSPLIT
+#endif // #if (_MSC_VER >= 1000) && !defined(MIDL_PASS) && defined(_PREFAST_)
+// -------------------------------------------------------------------------------
+// Buffer Annotation Definitions
+//
+// Any of these may be used to directly annotate functions, but only one should
+// be used for each parameter. To determine which annotation to use for a given
+// buffer, use the table in the buffer annotations section.
+// -------------------------------------------------------------------------------
+// @@END_DDKSPLIT
+
+#ifndef __ecount
+#define __ecount(size) __notnull __elem_writableTo(size)
+#endif
+#ifndef __bcount
+#define __bcount(size) __notnull __byte_writableTo(size)
+#endif
+#ifndef __in
+#define __in __pre __valid __pre __deref __readonly
+#endif
+#ifndef __in_ecount
+#define __in_ecount(size) __in __pre __elem_readableTo(size)
+#endif
+#ifndef __in_bcount
+#define __in_bcount(size) __in __pre __byte_readableTo(size)
+#endif
+#ifndef __out
+#define __out __ecount(1) __post __valid __refparam
+#endif
+#ifndef __out_ecount
+#define __out_ecount(size) __ecount(size) __post __valid __refparam
+#endif
+#ifndef __out_bcount
+#define __out_bcount(size) __bcount(size) __post __valid __refparam
+#endif
+#ifndef __out_ecount_part
+#define __out_ecount_part(size,length) __out_ecount(size) __post __elem_readableTo(length)
+#endif
+#ifndef __out_bcount_part
+#define __out_bcount_part(size,length) __out_bcount(size) __post __byte_readableTo(length)
+#endif
+#ifndef __out_ecount_full
+#define __out_ecount_full(size) __out_ecount_part(size,size)
+#endif
+#ifndef __out_bcount_full
+#define __out_bcount_full(size) __out_bcount_part(size,size)
+#endif
+#ifndef __inout
+#define __inout __pre __valid __post __valid __refparam
+#endif
+#ifndef __inout_ecount
+#define __inout_ecount(size) __out_ecount(size) __pre __valid
+#endif
+#ifndef __inout_bcount
+#define __inout_bcount(size) __out_bcount(size) __pre __valid
+#endif
+#ifndef __inout_ecount_part
+#define __inout_ecount_part(size,length) __out_ecount_part(size,length) __pre __valid __pre __elem_readableTo(length)
+#endif
+#ifndef __inout_bcount_part
+#define __inout_bcount_part(size,length) __out_bcount_part(size,length) __pre __valid __pre __byte_readableTo(length)
+#endif
+#ifndef __inout_ecount_full
+#define __inout_ecount_full(size) __inout_ecount_part(size,size)
+#endif
+#ifndef __inout_bcount_full
+#define __inout_bcount_full(size) __inout_bcount_part(size,size)
+#endif
+
+#ifndef __ecount_opt
+#define __ecount_opt(size) __ecount(size) __exceptthat __maybenull
+#endif
+#ifndef __bcount_opt
+#define __bcount_opt(size) __bcount(size) __exceptthat __maybenull
+#endif
+#ifndef __in_opt
+#define __in_opt __in __exceptthat __maybenull
+#endif
+#ifndef __in_ecount_opt
+#define __in_ecount_opt(size) __in_ecount(size) __exceptthat __maybenull
+#endif
+#ifndef __in_bcount_opt
+#define __in_bcount_opt(size) __in_bcount(size) __exceptthat __maybenull
+#endif
+#ifndef __out_opt
+#define __out_opt __out __exceptthat __maybenull
+#endif
+#ifndef __out_ecount_opt
+#define __out_ecount_opt(size) __out_ecount(size) __exceptthat __maybenull
+#endif
+#ifndef __out_bcount_opt
+#define __out_bcount_opt(size) __out_bcount(size) __exceptthat __maybenull
+#endif
+#ifndef __out_ecount_part_opt
+#define __out_ecount_part_opt(size,length) __out_ecount_part(size,length) __exceptthat __maybenull
+#endif
+#ifndef __out_bcount_part_opt
+#define __out_bcount_part_opt(size,length) __out_bcount_part(size,length) __exceptthat __maybenull
+#endif
+#ifndef __out_ecount_full_opt
+#define __out_ecount_full_opt(size) __out_ecount_full(size) __exceptthat __maybenull
+#endif
+#ifndef __out_bcount_full_opt
+#define __out_bcount_full_opt(size) __out_bcount_full(size) __exceptthat __maybenull
+#endif
+#ifndef __inout_opt
+#define __inout_opt __inout __exceptthat __maybenull
+#endif
+#ifndef __inout_ecount_opt
+#define __inout_ecount_opt(size) __inout_ecount(size) __exceptthat __maybenull
+#endif
+#ifndef __inout_bcount_opt
+#define __inout_bcount_opt(size) __inout_bcount(size) __exceptthat __maybenull
+#endif
+#ifndef __inout_ecount_part_opt
+#define __inout_ecount_part_opt(size,length) __inout_ecount_part(size,length) __exceptthat __maybenull
+#endif
+#ifndef __inout_bcount_part_opt
+#define __inout_bcount_part_opt(size,length) __inout_bcount_part(size,length) __exceptthat __maybenull
+#endif
+#ifndef __inout_ecount_full_opt
+#define __inout_ecount_full_opt(size) __inout_ecount_full(size) __exceptthat __maybenull
+#endif
+#ifndef __inout_bcount_full_opt
+#define __inout_bcount_full_opt(size) __inout_bcount_full(size) __exceptthat __maybenull
+#endif
+
+#ifndef __deref_ecount
+#define __deref_ecount(size) __ecount(1) __post __elem_readableTo(1) __post __deref __notnull __post __deref __elem_writableTo(size)
+#endif
+#ifndef __deref_bcount
+#define __deref_bcount(size) __ecount(1) __post __elem_readableTo(1) __post __deref __notnull __post __deref __byte_writableTo(size)
+#endif
+#ifndef __deref_in
+#define __deref_in __in __pre __deref __deref __readonly
+#endif
+#ifndef __deref_in_ecount
+#define __deref_in_ecount(size) __deref_in __pre __deref __elem_readableTo(size)
+#endif
+#ifndef __deref_in_bcount
+#define __deref_in_bcount(size) __deref_in __pre __deref __byte_readableTo(size)
+#endif
+#ifndef __deref_out
+#define __deref_out __deref_ecount(1) __post __deref __valid __refparam
+#endif
+#ifndef __deref_out_ecount
+#define __deref_out_ecount(size) __deref_ecount(size) __post __deref __valid __refparam
+#endif
+#ifndef __deref_out_bcount
+#define __deref_out_bcount(size) __deref_bcount(size) __post __deref __valid __refparam
+#endif
+#ifndef __deref_out_ecount_part
+#define __deref_out_ecount_part(size,length) __deref_out_ecount(size) __post __deref __elem_readableTo(length)
+#endif
+#ifndef __deref_out_bcount_part
+#define __deref_out_bcount_part(size,length) __deref_out_bcount(size) __post __deref __byte_readableTo(length)
+#endif
+#ifndef __deref_out_ecount_full
+#define __deref_out_ecount_full(size) __deref_out_ecount_part(size,size)
+#endif
+#ifndef __deref_out_bcount_full
+#define __deref_out_bcount_full(size) __deref_out_bcount_part(size,size)
+#endif
+#ifndef __deref_inout
+#define __deref_inout __notnull __elem_readableTo(1) __pre __deref __valid __post __deref __valid __refparam
+#endif
+#ifndef __deref_inout_ecount
+#define __deref_inout_ecount(size) __deref_inout __pre __deref __elem_writableTo(size) __post __deref __elem_writableTo(size)
+#endif
+#ifndef __deref_inout_bcount
+#define __deref_inout_bcount(size) __deref_inout __pre __deref __byte_writableTo(size) __post __deref __byte_writableTo(size)
+#endif
+#ifndef __deref_inout_ecount_part
+#define __deref_inout_ecount_part(size,length) __deref_inout_ecount(size) __pre __deref __elem_readableTo(length) __post __deref __elem_readableTo(length)
+#endif
+#ifndef __deref_inout_bcount_part
+#define __deref_inout_bcount_part(size,length) __deref_inout_bcount(size) __pre __deref __byte_readableTo(length) __post __deref __byte_readableTo(length)
+#endif
+#ifndef __deref_inout_ecount_full
+#define __deref_inout_ecount_full(size) __deref_inout_ecount_part(size,size)
+#endif
+#ifndef __deref_inout_bcount_full
+#define __deref_inout_bcount_full(size) __deref_inout_bcount_part(size,size)
+#endif
+
+#ifndef __deref_ecount_opt
+#define __deref_ecount_opt(size) __deref_ecount(size) __post __deref __exceptthat __maybenull
+#endif
+#ifndef __deref_bcount_opt
+#define __deref_bcount_opt(size) __deref_bcount(size) __post __deref __exceptthat __maybenull
+#endif
+#ifndef __deref_in_opt
+#define __deref_in_opt __deref_in __pre __deref __exceptthat __maybenull
+#endif
+#ifndef __deref_in_ecount_opt
+#define __deref_in_ecount_opt(size) __deref_in_ecount(size) __pre __deref __exceptthat __maybenull
+#endif
+#ifndef __deref_in_bcount_opt
+#define __deref_in_bcount_opt(size) __deref_in_bcount(size) __pre __deref __exceptthat __maybenull
+#endif
+#ifndef __deref_out_opt
+#define __deref_out_opt __deref_out __post __deref __exceptthat __maybenull
+#endif
+#ifndef __deref_out_ecount_opt
+#define __deref_out_ecount_opt(size) __deref_out_ecount(size) __post __deref __exceptthat __maybenull
+#endif
+#ifndef __deref_out_bcount_opt
+#define __deref_out_bcount_opt(size) __deref_out_bcount(size) __post __deref __exceptthat __maybenull
+#endif
+#ifndef __deref_out_ecount_part_opt
+#define __deref_out_ecount_part_opt(size,length) __deref_out_ecount_part(size,length) __post __deref __exceptthat __maybenull
+#endif
+#ifndef __deref_out_bcount_part_opt
+#define __deref_out_bcount_part_opt(size,length) __deref_out_bcount_part(size,length) __post __deref __exceptthat __maybenull
+#endif
+#ifndef __deref_out_ecount_full_opt
+#define __deref_out_ecount_full_opt(size) __deref_out_ecount_full(size) __post __deref __exceptthat __maybenull
+#endif
+#ifndef __deref_out_bcount_full_opt
+#define __deref_out_bcount_full_opt(size) __deref_out_bcount_full(size) __post __deref __exceptthat __maybenull
+#endif
+#ifndef __deref_inout_opt
+#define __deref_inout_opt __deref_inout __pre __deref __exceptthat __maybenull __post __deref __exceptthat __maybenull
+#endif
+#ifndef __deref_inout_ecount_opt
+#define __deref_inout_ecount_opt(size) __deref_inout_ecount(size) __pre __deref __exceptthat __maybenull __post __deref __exceptthat __maybenull
+#endif
+#ifndef __deref_inout_bcount_opt
+#define __deref_inout_bcount_opt(size) __deref_inout_bcount(size) __pre __deref __exceptthat __maybenull __post __deref __exceptthat __maybenull
+#endif
+#ifndef __deref_inout_ecount_part_opt
+#define __deref_inout_ecount_part_opt(size,length) __deref_inout_ecount_part(size,length) __pre __deref __exceptthat __maybenull __post __deref __exceptthat __maybenull
+#endif
+#ifndef __deref_inout_bcount_part_opt
+#define __deref_inout_bcount_part_opt(size,length) __deref_inout_bcount_part(size,length) __pre __deref __exceptthat __maybenull __post __deref __exceptthat __maybenull
+#endif
+#ifndef __deref_inout_ecount_full_opt
+#define __deref_inout_ecount_full_opt(size) __deref_inout_ecount_full(size) __pre __deref __exceptthat __maybenull __post __deref __exceptthat __maybenull
+#endif
+#ifndef __deref_inout_bcount_full_opt
+#define __deref_inout_bcount_full_opt(size) __deref_inout_bcount_full(size) __pre __deref __exceptthat __maybenull __post __deref __exceptthat __maybenull
+#endif
+
+#ifndef __deref_opt_ecount
+#define __deref_opt_ecount(size) __deref_ecount(size) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_bcount
+#define __deref_opt_bcount(size) __deref_bcount(size) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_in
+#define __deref_opt_in __deref_in __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_in_ecount
+#define __deref_opt_in_ecount(size) __deref_in_ecount(size) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_in_bcount
+#define __deref_opt_in_bcount(size) __deref_in_bcount(size) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_out
+#define __deref_opt_out __deref_out __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_out_ecount
+#define __deref_opt_out_ecount(size) __deref_out_ecount(size) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_out_bcount
+#define __deref_opt_out_bcount(size) __deref_out_bcount(size) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_out_ecount_part
+#define __deref_opt_out_ecount_part(size,length) __deref_out_ecount_part(size,length) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_out_bcount_part
+#define __deref_opt_out_bcount_part(size,length) __deref_out_bcount_part(size,length) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_out_ecount_full
+#define __deref_opt_out_ecount_full(size) __deref_out_ecount_full(size) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_out_bcount_full
+#define __deref_opt_out_bcount_full(size) __deref_out_bcount_full(size) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_inout
+#define __deref_opt_inout __deref_inout __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_inout_ecount
+#define __deref_opt_inout_ecount(size) __deref_inout_ecount(size) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_inout_bcount
+#define __deref_opt_inout_bcount(size) __deref_inout_bcount(size) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_inout_ecount_part
+#define __deref_opt_inout_ecount_part(size,length) __deref_inout_ecount_part(size,length) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_inout_bcount_part
+#define __deref_opt_inout_bcount_part(size,length) __deref_inout_bcount_part(size,length) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_inout_ecount_full
+#define __deref_opt_inout_ecount_full(size) __deref_inout_ecount_full(size) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_inout_bcount_full
+#define __deref_opt_inout_bcount_full(size) __deref_inout_bcount_full(size) __exceptthat __maybenull
+#endif
+
+#ifndef __deref_opt_ecount_opt
+#define __deref_opt_ecount_opt(size) __deref_ecount_opt(size) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_bcount_opt
+#define __deref_opt_bcount_opt(size) __deref_bcount_opt(size) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_in_opt
+#define __deref_opt_in_opt __deref_in_opt __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_in_ecount_opt
+#define __deref_opt_in_ecount_opt(size) __deref_in_ecount_opt(size) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_in_bcount_opt
+#define __deref_opt_in_bcount_opt(size) __deref_in_bcount_opt(size) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_out_opt
+#define __deref_opt_out_opt __deref_out_opt __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_out_ecount_opt
+#define __deref_opt_out_ecount_opt(size) __deref_out_ecount_opt(size) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_out_bcount_opt
+#define __deref_opt_out_bcount_opt(size) __deref_out_bcount_opt(size) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_out_ecount_part_opt
+#define __deref_opt_out_ecount_part_opt(size,length) __deref_out_ecount_part_opt(size,length) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_out_bcount_part_opt
+#define __deref_opt_out_bcount_part_opt(size,length) __deref_out_bcount_part_opt(size,length) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_out_ecount_full_opt
+#define __deref_opt_out_ecount_full_opt(size) __deref_out_ecount_full_opt(size) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_out_bcount_full_opt
+#define __deref_opt_out_bcount_full_opt(size) __deref_out_bcount_full_opt(size) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_inout_opt
+#define __deref_opt_inout_opt __deref_inout_opt __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_inout_ecount_opt
+#define __deref_opt_inout_ecount_opt(size) __deref_inout_ecount_opt(size) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_inout_bcount_opt
+#define __deref_opt_inout_bcount_opt(size) __deref_inout_bcount_opt(size) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_inout_ecount_part_opt
+#define __deref_opt_inout_ecount_part_opt(size,length) __deref_inout_ecount_part_opt(size,length) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_inout_bcount_part_opt
+#define __deref_opt_inout_bcount_part_opt(size,length) __deref_inout_bcount_part_opt(size,length) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_inout_ecount_full_opt
+#define __deref_opt_inout_ecount_full_opt(size) __deref_inout_ecount_full_opt(size) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_inout_bcount_full_opt
+#define __deref_opt_inout_bcount_full_opt(size) __deref_inout_bcount_full_opt(size) __exceptthat __maybenull
+#endif
+
+// @@BEGIN_DDKSPLIT
+// -------------------------------------------------------------------------------
+// Advanced Annotation Definitions
+//
+// Any of these may be used to directly annotate functions, and may be used in
+// combination with each other or with regular buffer macros. For an explanation
+// of each annotation, see the advanced annotations section.
+// -------------------------------------------------------------------------------
+// @@END_DDKSPLIT
+
+#ifndef __out_awcount
+#define __out_awcount(expr,size) __pre __notnull \
+ __precond(expr) __byte_writableTo(size) \
+ __precond(!(expr)) __byte_writableTo((size)*2) \
+ __post __valid __refparam
+#endif
+#ifndef __in_awcount
+#define __in_awcount(expr,size) __pre __valid \
+ __pre __deref __readonly \
+ __precond(expr) __byte_readableTo(size) \
+ __precond(!(expr)) __elem_readableTo(size)
+#endif
+#ifndef __success
+#define __success(expr) __inner_success(expr)
+#endif
+#ifndef __nullterminated
+#define __nullterminated __readableTo(sentinel(0))
+#endif
+#ifndef __nullnullterminated
+#define __nullnullterminated
+#endif
+#ifndef __reserved
+#define __reserved __pre __null
+#endif
+#ifndef __checkReturn
+#define __checkReturn __inner_checkReturn
+#endif
+#ifndef __typefix
+#define __typefix(ctype) __inner_typefix(ctype)
+#endif
+#ifndef __override
+#define __override __inner_override
+#endif
+#ifndef __callback
+#define __callback __inner_callback
+#endif
+#ifndef __format_string
+#define __format_string
+#endif
+#ifndef __blocksOn
+#define __blocksOn(resource) __inner_blocksOn(resource)
+#endif
+#ifndef __control_entrypoint
+#define __control_entrypoint(category) __inner_control_entrypoint(category)
+#endif
+#ifndef __data_entrypoint
+#define __data_entrypoint(category) __inner_data_entrypoint(category)
+#endif
+
+#ifndef __fallthrough
+ __inner_fallthrough_dec
+ #define __fallthrough __inner_fallthrough
+#endif
+
+// -------------------------------------------------------------------------------
+// Deprecated Annotation Definitions
+//
+// These should be removed from existing code.
+// -------------------------------------------------------------------------------
+
+// #define __opt __exceptthat __maybenull
+
+#ifdef __cplusplus
+}
+#endif
+
diff --git a/core/src/fxge/apple/apple_int.h b/core/src/fxge/apple/apple_int.h
index 5c42f1b1fb..42d63628f2 100644
--- a/core/src/fxge/apple/apple_int.h
+++ b/core/src/fxge/apple/apple_int.h
@@ -1,246 +1,246 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef _APPLE_INT_H_
-#define _APPLE_INT_H_
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
-#if _FX_OS_ == _FX_MACOSX_
-#include <Carbon/Carbon.h>
-#endif
-typedef enum eFXIOSFONTCHARSET {
- eFXFontCharsetDEFAULT = 0,
- eFXFontCharsetANSI = 1,
- eFXFontCharsetSYMBOL = 1 << 1,
- eFXFontCharsetSHIFTJIS = 1 << 2,
- eFXFontCharsetHANGEUL = 1 << 3,
- eFXFontCharsetGB2312 = 1 << 4,
- eFXFontCharsetCHINESEBIG5 = 1 << 5,
- eFXFontCharsetTHAI = 1 << 6,
- eFXFontCharsetEASTEUROPE = 1 << 7,
- eFXFontCharsetRUSSIAN = 1 << 8,
- eFXFontCharsetGREEK = 1 << 9,
- eFXFontCharsetTURKISH = 1 << 10,
- eFXFontCharsetHEBREW = 1 << 11,
- eFXFontCharsetARABIC = 1 << 12,
- eFXFontCharsetBALTIC = 1 << 13,
-} FX_IOSCHARSET;
-FX_IOSCHARSET FX_GetiOSCharset(int charset);
-typedef enum eFXIOSFONTFLAG {
- eFXFontFlagBold = 1,
- eFXFontFlagItalic = 1 << 1,
- eFXFontFlagFixedPitch = 1 << 2,
- eFXFontFlagSerif = 1 << 3,
- eFXFontFlagScript = 1 << 4,
-} FX_IOSFONTFLAG;
-typedef struct _IOS_FONTDATA {
- FX_DWORD nHashCode;
- const char* psName;
- FX_DWORD charsets;
- FX_DWORD styles;
-} IOS_FONTDATA;
-class CQuartz2D
-{
-public:
- void* createGraphics(CFX_DIBitmap* bitmap);
- void destroyGraphics(void* graphics);
-
- void* CreateFont(FX_LPCBYTE pFontData, FX_DWORD dwFontSize);
- void DestroyFont(void* pFont);
- void setGraphicsTextMatrix(void* graphics, CFX_AffineMatrix* matrix);
- FX_BOOL drawGraphicsString(void* graphics,
- void* font,
- FX_FLOAT fontSize,
- FX_WORD* glyphIndices,
- CGPoint* glyphPositions,
- FX_INT32 chars,
- FX_ARGB argb,
- CFX_AffineMatrix* matrix = NULL);
- void saveGraphicsState(void* graphics);
- void restoreGraphicsState(void* graphics);
-};
-class CApplePlatform : public CFX_Object
-{
-public:
- CApplePlatform()
- {
- m_pFontMapper = NULL;
- }
- ~CApplePlatform()
- {
- if (m_pFontMapper) {
- delete m_pFontMapper;
- }
- }
- CQuartz2D _quartz2d;
- IFX_FontMapper* m_pFontMapper;
-};
-class CFX_QuartzDeviceDriver : public IFX_RenderDeviceDriver
-{
-public:
- CFX_QuartzDeviceDriver(CGContextRef context, FX_INT32 deviceClass);
- virtual ~CFX_QuartzDeviceDriver();
-
- virtual int GetDeviceCaps(int caps_id);
- virtual CFX_Matrix GetCTM() const;
- virtual CFX_DIBitmap* GetBackDrop()
- {
- return NULL;
- }
- virtual void* GetPlatformSurface()
- {
- return NULL;
- }
- virtual FX_BOOL IsPSPrintDriver()
- {
- return FALSE;
- }
- virtual FX_BOOL StartRendering()
- {
- return TRUE;
- }
- virtual void EndRendering() {}
- virtual void SaveState();
- virtual void RestoreState(FX_BOOL bKeepSaved);
- virtual FX_BOOL SetClip_PathFill(const CFX_PathData* pPathData,
- const CFX_AffineMatrix* pObject2Device,
- int fill_mode
- );
- virtual FX_BOOL SetClip_PathStroke(const CFX_PathData* pPathData,
- const CFX_AffineMatrix* pObject2Device,
- const CFX_GraphStateData* pGraphState
- );
- virtual FX_BOOL DrawPath(const CFX_PathData* pPathData,
- const CFX_AffineMatrix* pObject2Device,
- const CFX_GraphStateData* pGraphState,
- FX_DWORD fill_color,
- FX_DWORD stroke_color,
- int fill_mode,
- int alpha_flag = 0,
- void* pIccTransform = NULL,
- int blend_type = FXDIB_BLEND_NORMAL
- );
- virtual FX_BOOL SetPixel(int x, int y, FX_DWORD color,
- int alpha_flag = 0, void* pIccTransform = NULL)
- {
- return FALSE;
- }
- virtual FX_BOOL FillRect(const FX_RECT* pRect, FX_DWORD fill_color,
- int alpha_flag = 0, void* pIccTransform = NULL, int blend_type = FXDIB_BLEND_NORMAL);
- virtual FX_BOOL DrawCosmeticLine(FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2, FX_DWORD color,
- int alpha_flag = 0, void* pIccTransform = NULL, int blend_type = FXDIB_BLEND_NORMAL);
- virtual FX_BOOL GetClipBox(FX_RECT* pRect);
- virtual FX_BOOL GetDIBits(CFX_DIBitmap* pBitmap, int left, int top, void* pIccTransform = NULL, FX_BOOL bDEdge = FALSE);
- virtual FX_BOOL SetDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, const FX_RECT* pSrcRect,
- int dest_left, int dest_top, int blend_type,
- int alpha_flag = 0, void* pIccTransform = NULL);
- virtual FX_BOOL StretchDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, int dest_left, int dest_top,
- int dest_width, int dest_height, const FX_RECT* pClipRect, FX_DWORD flags,
- int alpha_flag = 0, void* pIccTransform = NULL, int blend_type = FXDIB_BLEND_NORMAL);
- virtual FX_BOOL StartDIBits(const CFX_DIBSource* pBitmap, int bitmap_alpha, FX_DWORD color,
- const CFX_AffineMatrix* pMatrix, FX_DWORD flags, FX_LPVOID& handle,
- int alpha_flag = 0, void* pIccTransform = NULL,
- int blend_type = FXDIB_BLEND_NORMAL)
- {
- return FALSE;
- }
- virtual FX_BOOL ContinueDIBits(FX_LPVOID handle, IFX_Pause* pPause)
- {
- return FALSE;
- }
- virtual void CancelDIBits(FX_LPVOID handle) {}
- virtual FX_BOOL DrawDeviceText(int nChars, const FXTEXT_CHARPOS* pCharPos, CFX_Font* pFont,
- CFX_FontCache* pCache, const CFX_AffineMatrix* pObject2Device, FX_FLOAT font_size, FX_DWORD color,
- int alpha_flag = 0, void* pIccTransform = NULL);
- virtual void ClearDriver();
-protected:
- void setStrokeInfo(const CFX_GraphStateData * graphState, FX_ARGB argb, FX_FLOAT lineWidth);
- void setFillInfo(FX_ARGB argb);
- void setPathToContext(const CFX_PathData * pathData);
- FX_FLOAT getLineWidth(const CFX_GraphStateData * graphState, CGAffineTransform ctm);
- FX_BOOL CG_DrawGlypRun(int nChars,
- const FXTEXT_CHARPOS* pCharPos,
- CFX_Font* pFont,
- CFX_FontCache* pCache,
- const CFX_AffineMatrix* pGlyphMatrix,
- const CFX_AffineMatrix* pObject2Device,
- FX_FLOAT font_size,
- FX_DWORD argb,
- int alpha_flag,
- void* pIccTransform);
- void CG_SetImageTransform(int dest_left, int dest_top, int dest_width, int dest_height, CGRect* rect = NULL);
-protected:
- CGContextRef _context;
- CGAffineTransform _foxitDevice2User;
- CGAffineTransform _user2FoxitDevice;
- FX_INT32 m_saveCount;
-
- FX_INT32 _width;
- FX_INT32 _height;
- FX_INT32 _bitsPerPixel;
- FX_INT32 _deviceClass;
- FX_INT32 _renderCaps;
- FX_INT32 _horzSize;
- FX_INT32 _vertSize;
-};
-class CFX_FontProvider : public IFX_FileRead
-{
-public:
- virtual void Release()
- {
- delete this;
- }
- virtual FX_FILESIZE GetSize()
- {
- return (FX_FILESIZE)_totalSize;
- }
- virtual FX_BOOL ReadBlock(void* buffer, FX_FILESIZE offset, size_t size);
-
- virtual FX_BOOL IsEOF()
- {
- return _offSet == _totalSize;
- }
- virtual FX_FILESIZE GetPosition()
- {
- return (FX_FILESIZE)_offSet;
- }
- virtual size_t ReadBlock(void* buffer, size_t size);
-public:
- CFX_FontProvider(CGFontRef cgFont);
- ~CFX_FontProvider();
- void InitTableOffset();
- unsigned long Read(unsigned long offset, unsigned char *buffer, unsigned long count);
-protected:
- uint32_t CalcTableCheckSum(const uint32_t *table, uint32_t numberOfBytesInTable);
- uint32_t CalcTableDataRefCheckSum(CFDataRef dataRef);
-private:
- CGFontRef m_cgFont;
- UInt32 m_iTableSize;
- size_t _offSet;
- typedef struct FontHeader {
- int32_t fVersion;
- uint16_t fNumTables;
- uint16_t fSearchRange;
- uint16_t fEntrySelector;
- uint16_t fRangeShift;
- } FontHeader;
- typedef struct TableEntry {
- uint32_t fTag;
- uint32_t fCheckSum;
- uint32_t fOffset;
- uint32_t fLength;
- } TableEntry;
- FontHeader _fontHeader;
- unsigned char * _tableEntries;
- size_t * _tableOffsets;
- int _tableCount;
- int _totalSize;
-};
-FX_UINT32 FX_GetHashCode( FX_LPCSTR pStr);
-FX_DWORD FX_IOSGetMatchFamilyNameHashcode(FX_LPCSTR pFontName);
-FX_UINT32 FX_IOSGetFamilyNamesCount();
-FX_LPCSTR FX_IOSGetFamilyName( FX_UINT32 uIndex);
-#endif
-#endif
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _APPLE_INT_H_
+#define _APPLE_INT_H_
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+#if _FX_OS_ == _FX_MACOSX_
+#include <Carbon/Carbon.h>
+#endif
+typedef enum eFXIOSFONTCHARSET {
+ eFXFontCharsetDEFAULT = 0,
+ eFXFontCharsetANSI = 1,
+ eFXFontCharsetSYMBOL = 1 << 1,
+ eFXFontCharsetSHIFTJIS = 1 << 2,
+ eFXFontCharsetHANGEUL = 1 << 3,
+ eFXFontCharsetGB2312 = 1 << 4,
+ eFXFontCharsetCHINESEBIG5 = 1 << 5,
+ eFXFontCharsetTHAI = 1 << 6,
+ eFXFontCharsetEASTEUROPE = 1 << 7,
+ eFXFontCharsetRUSSIAN = 1 << 8,
+ eFXFontCharsetGREEK = 1 << 9,
+ eFXFontCharsetTURKISH = 1 << 10,
+ eFXFontCharsetHEBREW = 1 << 11,
+ eFXFontCharsetARABIC = 1 << 12,
+ eFXFontCharsetBALTIC = 1 << 13,
+} FX_IOSCHARSET;
+FX_IOSCHARSET FX_GetiOSCharset(int charset);
+typedef enum eFXIOSFONTFLAG {
+ eFXFontFlagBold = 1,
+ eFXFontFlagItalic = 1 << 1,
+ eFXFontFlagFixedPitch = 1 << 2,
+ eFXFontFlagSerif = 1 << 3,
+ eFXFontFlagScript = 1 << 4,
+} FX_IOSFONTFLAG;
+typedef struct _IOS_FONTDATA {
+ FX_DWORD nHashCode;
+ const char* psName;
+ FX_DWORD charsets;
+ FX_DWORD styles;
+} IOS_FONTDATA;
+class CQuartz2D
+{
+public:
+ void* createGraphics(CFX_DIBitmap* bitmap);
+ void destroyGraphics(void* graphics);
+
+ void* CreateFont(FX_LPCBYTE pFontData, FX_DWORD dwFontSize);
+ void DestroyFont(void* pFont);
+ void setGraphicsTextMatrix(void* graphics, CFX_AffineMatrix* matrix);
+ FX_BOOL drawGraphicsString(void* graphics,
+ void* font,
+ FX_FLOAT fontSize,
+ FX_WORD* glyphIndices,
+ CGPoint* glyphPositions,
+ FX_INT32 chars,
+ FX_ARGB argb,
+ CFX_AffineMatrix* matrix = NULL);
+ void saveGraphicsState(void* graphics);
+ void restoreGraphicsState(void* graphics);
+};
+class CApplePlatform : public CFX_Object
+{
+public:
+ CApplePlatform()
+ {
+ m_pFontMapper = NULL;
+ }
+ ~CApplePlatform()
+ {
+ if (m_pFontMapper) {
+ delete m_pFontMapper;
+ }
+ }
+ CQuartz2D _quartz2d;
+ IFX_FontMapper* m_pFontMapper;
+};
+class CFX_QuartzDeviceDriver : public IFX_RenderDeviceDriver
+{
+public:
+ CFX_QuartzDeviceDriver(CGContextRef context, FX_INT32 deviceClass);
+ virtual ~CFX_QuartzDeviceDriver();
+
+ virtual int GetDeviceCaps(int caps_id);
+ virtual CFX_Matrix GetCTM() const;
+ virtual CFX_DIBitmap* GetBackDrop()
+ {
+ return NULL;
+ }
+ virtual void* GetPlatformSurface()
+ {
+ return NULL;
+ }
+ virtual FX_BOOL IsPSPrintDriver()
+ {
+ return FALSE;
+ }
+ virtual FX_BOOL StartRendering()
+ {
+ return TRUE;
+ }
+ virtual void EndRendering() {}
+ virtual void SaveState();
+ virtual void RestoreState(FX_BOOL bKeepSaved);
+ virtual FX_BOOL SetClip_PathFill(const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pObject2Device,
+ int fill_mode
+ );
+ virtual FX_BOOL SetClip_PathStroke(const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pObject2Device,
+ const CFX_GraphStateData* pGraphState
+ );
+ virtual FX_BOOL DrawPath(const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pObject2Device,
+ const CFX_GraphStateData* pGraphState,
+ FX_DWORD fill_color,
+ FX_DWORD stroke_color,
+ int fill_mode,
+ int alpha_flag = 0,
+ void* pIccTransform = NULL,
+ int blend_type = FXDIB_BLEND_NORMAL
+ );
+ virtual FX_BOOL SetPixel(int x, int y, FX_DWORD color,
+ int alpha_flag = 0, void* pIccTransform = NULL)
+ {
+ return FALSE;
+ }
+ virtual FX_BOOL FillRect(const FX_RECT* pRect, FX_DWORD fill_color,
+ int alpha_flag = 0, void* pIccTransform = NULL, int blend_type = FXDIB_BLEND_NORMAL);
+ virtual FX_BOOL DrawCosmeticLine(FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2, FX_DWORD color,
+ int alpha_flag = 0, void* pIccTransform = NULL, int blend_type = FXDIB_BLEND_NORMAL);
+ virtual FX_BOOL GetClipBox(FX_RECT* pRect);
+ virtual FX_BOOL GetDIBits(CFX_DIBitmap* pBitmap, int left, int top, void* pIccTransform = NULL, FX_BOOL bDEdge = FALSE);
+ virtual FX_BOOL SetDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, const FX_RECT* pSrcRect,
+ int dest_left, int dest_top, int blend_type,
+ int alpha_flag = 0, void* pIccTransform = NULL);
+ virtual FX_BOOL StretchDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, int dest_left, int dest_top,
+ int dest_width, int dest_height, const FX_RECT* pClipRect, FX_DWORD flags,
+ int alpha_flag = 0, void* pIccTransform = NULL, int blend_type = FXDIB_BLEND_NORMAL);
+ virtual FX_BOOL StartDIBits(const CFX_DIBSource* pBitmap, int bitmap_alpha, FX_DWORD color,
+ const CFX_AffineMatrix* pMatrix, FX_DWORD flags, FX_LPVOID& handle,
+ int alpha_flag = 0, void* pIccTransform = NULL,
+ int blend_type = FXDIB_BLEND_NORMAL)
+ {
+ return FALSE;
+ }
+ virtual FX_BOOL ContinueDIBits(FX_LPVOID handle, IFX_Pause* pPause)
+ {
+ return FALSE;
+ }
+ virtual void CancelDIBits(FX_LPVOID handle) {}
+ virtual FX_BOOL DrawDeviceText(int nChars, const FXTEXT_CHARPOS* pCharPos, CFX_Font* pFont,
+ CFX_FontCache* pCache, const CFX_AffineMatrix* pObject2Device, FX_FLOAT font_size, FX_DWORD color,
+ int alpha_flag = 0, void* pIccTransform = NULL);
+ virtual void ClearDriver();
+protected:
+ void setStrokeInfo(const CFX_GraphStateData * graphState, FX_ARGB argb, FX_FLOAT lineWidth);
+ void setFillInfo(FX_ARGB argb);
+ void setPathToContext(const CFX_PathData * pathData);
+ FX_FLOAT getLineWidth(const CFX_GraphStateData * graphState, CGAffineTransform ctm);
+ FX_BOOL CG_DrawGlypRun(int nChars,
+ const FXTEXT_CHARPOS* pCharPos,
+ CFX_Font* pFont,
+ CFX_FontCache* pCache,
+ const CFX_AffineMatrix* pGlyphMatrix,
+ const CFX_AffineMatrix* pObject2Device,
+ FX_FLOAT font_size,
+ FX_DWORD argb,
+ int alpha_flag,
+ void* pIccTransform);
+ void CG_SetImageTransform(int dest_left, int dest_top, int dest_width, int dest_height, CGRect* rect = NULL);
+protected:
+ CGContextRef _context;
+ CGAffineTransform _foxitDevice2User;
+ CGAffineTransform _user2FoxitDevice;
+ FX_INT32 m_saveCount;
+
+ FX_INT32 _width;
+ FX_INT32 _height;
+ FX_INT32 _bitsPerPixel;
+ FX_INT32 _deviceClass;
+ FX_INT32 _renderCaps;
+ FX_INT32 _horzSize;
+ FX_INT32 _vertSize;
+};
+class CFX_FontProvider : public IFX_FileRead
+{
+public:
+ virtual void Release()
+ {
+ delete this;
+ }
+ virtual FX_FILESIZE GetSize()
+ {
+ return (FX_FILESIZE)_totalSize;
+ }
+ virtual FX_BOOL ReadBlock(void* buffer, FX_FILESIZE offset, size_t size);
+
+ virtual FX_BOOL IsEOF()
+ {
+ return _offSet == _totalSize;
+ }
+ virtual FX_FILESIZE GetPosition()
+ {
+ return (FX_FILESIZE)_offSet;
+ }
+ virtual size_t ReadBlock(void* buffer, size_t size);
+public:
+ CFX_FontProvider(CGFontRef cgFont);
+ ~CFX_FontProvider();
+ void InitTableOffset();
+ unsigned long Read(unsigned long offset, unsigned char *buffer, unsigned long count);
+protected:
+ uint32_t CalcTableCheckSum(const uint32_t *table, uint32_t numberOfBytesInTable);
+ uint32_t CalcTableDataRefCheckSum(CFDataRef dataRef);
+private:
+ CGFontRef m_cgFont;
+ UInt32 m_iTableSize;
+ size_t _offSet;
+ typedef struct FontHeader {
+ int32_t fVersion;
+ uint16_t fNumTables;
+ uint16_t fSearchRange;
+ uint16_t fEntrySelector;
+ uint16_t fRangeShift;
+ } FontHeader;
+ typedef struct TableEntry {
+ uint32_t fTag;
+ uint32_t fCheckSum;
+ uint32_t fOffset;
+ uint32_t fLength;
+ } TableEntry;
+ FontHeader _fontHeader;
+ unsigned char * _tableEntries;
+ size_t * _tableOffsets;
+ int _tableCount;
+ int _totalSize;
+};
+FX_UINT32 FX_GetHashCode( FX_LPCSTR pStr);
+FX_DWORD FX_IOSGetMatchFamilyNameHashcode(FX_LPCSTR pFontName);
+FX_UINT32 FX_IOSGetFamilyNamesCount();
+FX_LPCSTR FX_IOSGetFamilyName( FX_UINT32 uIndex);
+#endif
+#endif
diff --git a/core/src/fxge/apple/fx_apple_platform.cpp b/core/src/fxge/apple/fx_apple_platform.cpp
index 229d1785da..7bc1232900 100644
--- a/core/src/fxge/apple/fx_apple_platform.cpp
+++ b/core/src/fxge/apple/fx_apple_platform.cpp
@@ -1,173 +1,173 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../../include/fxcrt/fx_ext.h"
-#include "../../../include/fxge/fx_ge.h"
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
-#include "apple_int.h"
-#include "../../../include/fxge/fx_ge_apple.h"
-#include "../agg/include/fxfx_agg_clip_liang_barsky.h"
-#include "../ge/text_int.h"
-#include "../dib/dib_int.h"
-#include "../agg/include/fx_agg_driver.h"
-#include "../../../include/fxge/fx_freetype.h"
-#if (_FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ && (!defined(_FPDFAPI_MINI_)))
-void CFX_AggDeviceDriver::InitPlatform()
-{
- CQuartz2D & quartz2d = ((CApplePlatform *) CFX_GEModule::Get()->GetPlatformData())->_quartz2d;
- m_pPlatformGraphics = quartz2d.createGraphics(m_pBitmap);
-}
-void CFX_AggDeviceDriver::DestroyPlatform()
-{
- CQuartz2D & quartz2d = ((CApplePlatform *) CFX_GEModule::Get()->GetPlatformData())->_quartz2d;
- if (m_pPlatformGraphics) {
- quartz2d.destroyGraphics(m_pPlatformGraphics);
- m_pPlatformGraphics = NULL;
- }
-}
-void CFX_FaceCache::InitPlatform() {}
-void CFX_FaceCache::DestroyPlatform() {}
-CFX_GlyphBitmap* CFX_FaceCache::RenderGlyph_Nativetext(CFX_Font * pFont,
- FX_DWORD glyph_index,
- const CFX_AffineMatrix * pMatrix,
- int dest_width,
- int anti_alias)
-{
- return NULL;
-}
-static FX_BOOL _CGDrawGlyphRun(CGContextRef pContext,
- int nChars,
- const FXTEXT_CHARPOS* pCharPos,
- CFX_Font* pFont,
- CFX_FontCache* pCache,
- const CFX_AffineMatrix* pObject2Device,
- FX_FLOAT font_size,
- FX_DWORD argb,
- int alpha_flag,
- void* pIccTransform)
-{
- if (nChars == 0) {
- return TRUE;
- }
- CFX_AffineMatrix new_matrix;
- FX_BOOL bNegSize = font_size < 0;
- if (bNegSize) {
- font_size = -font_size;
- }
- FX_FLOAT ori_x = pCharPos[0].m_OriginX, ori_y = pCharPos[0].m_OriginY;
- new_matrix.Transform(ori_x, ori_y);
- if (pObject2Device) {
- new_matrix.Concat(*pObject2Device);
- }
- CQuartz2D& quartz2d = ((CApplePlatform *) CFX_GEModule::Get()->GetPlatformData())->_quartz2d;
- if (!pFont->m_pPlatformFont) {
- if (pFont->GetPsName() == CFX_WideString::FromLocal("DFHeiStd-W5")) {
- return FALSE;
- }
- pFont->m_pPlatformFont = quartz2d.CreateFont(pFont->m_pFontData, pFont->m_dwSize);
- if (NULL == pFont->m_pPlatformFont) {
- return FALSE;
- }
- }
- CFX_FixedBufGrow<FX_WORD, 32> glyph_indices(nChars);
- CFX_FixedBufGrow<CGPoint, 32> glyph_positions(nChars);
- for (int i = 0; i < nChars; i++ ) {
- glyph_indices[i] = pCharPos[i].m_ExtGID;
- if (bNegSize) {
- glyph_positions[i].x = -pCharPos[i].m_OriginX;
- } else {
- glyph_positions[i].x = pCharPos[i].m_OriginX;
- }
- glyph_positions[i].y = pCharPos[i].m_OriginY;
- }
- if (bNegSize) {
- new_matrix.a = -new_matrix.a;
- } else {
- new_matrix.b = -new_matrix.b;
- new_matrix.d = -new_matrix.d;
- }
- quartz2d.setGraphicsTextMatrix(pContext, &new_matrix);
- return quartz2d.drawGraphicsString(pContext,
- pFont->m_pPlatformFont,
- font_size,
- glyph_indices,
- glyph_positions,
- nChars,
- argb,
- NULL);
-}
-static void _DoNothing(void *info, const void *data, size_t size) {}
-FX_BOOL CFX_AggDeviceDriver::DrawDeviceText(int nChars,
- const FXTEXT_CHARPOS * pCharPos,
- CFX_Font * pFont,
- CFX_FontCache * pCache,
- const CFX_AffineMatrix * pObject2Device,
- FX_FLOAT font_size,
- FX_DWORD argb,
- int alpha_flag, void* pIccTransform)
-{
- if (!pFont) {
- return FALSE;
- }
- FX_BOOL bBold = pFont->IsBold();
- if (!bBold && pFont->GetSubstFont() &&
- pFont->GetSubstFont()->m_Weight >= 500 &&
- pFont->GetSubstFont()->m_Weight <= 600) {
- return FALSE;
- }
- for (int i = 0; i < nChars; i ++) {
- if (pCharPos[i].m_bGlyphAdjust) {
- return FALSE;
- }
- }
- CGContextRef ctx = CGContextRef(m_pPlatformGraphics);
- if (NULL == ctx) {
- return FALSE;
- }
- CGContextSaveGState(ctx);
- CGContextSetTextDrawingMode(ctx, kCGTextFillClip);
- CGRect rect_cg;
- CGImageRef pImageCG = NULL;
- if (m_pClipRgn) {
- rect_cg = CGRectMake(m_pClipRgn->GetBox().left, m_pClipRgn->GetBox().top, m_pClipRgn->GetBox().Width(), m_pClipRgn->GetBox().Height());
- const CFX_DIBitmap* pClipMask = m_pClipRgn->GetMask();
- if (pClipMask) {
- CGDataProviderRef pClipMaskDataProvider = CGDataProviderCreateWithData(NULL,
- pClipMask->GetBuffer(),
- pClipMask->GetPitch() * pClipMask->GetHeight(),
- _DoNothing);
- CGFloat decode_f[2] = {255.f, 0.f};
- pImageCG = CGImageMaskCreate(pClipMask->GetWidth(), pClipMask->GetHeight(),
- 8, 8, pClipMask->GetPitch(), pClipMaskDataProvider,
- decode_f, FALSE);
- CGDataProviderRelease(pClipMaskDataProvider);
- }
- } else {
- rect_cg = CGRectMake(0, 0, m_pBitmap->GetWidth(), m_pBitmap->GetHeight());
- }
- rect_cg = CGContextConvertRectToDeviceSpace(ctx, rect_cg);
- if (pImageCG) {
- CGContextClipToMask(ctx, rect_cg, pImageCG);
- } else {
- CGContextClipToRect(ctx, rect_cg);
- }
- FX_BOOL ret = _CGDrawGlyphRun(ctx, nChars, pCharPos, pFont, pCache, pObject2Device, font_size, argb, alpha_flag, pIccTransform);
- if (pImageCG) {
- CGImageRelease(pImageCG);
- }
- CGContextRestoreGState(ctx);
- return ret;
-}
-void CFX_Font::ReleasePlatformResource()
-{
- if (m_pPlatformFont) {
- CQuartz2D & quartz2d = ((CApplePlatform *) CFX_GEModule::Get()->GetPlatformData())->_quartz2d;
- quartz2d.DestroyFont(m_pPlatformFont);
- m_pPlatformFont = NULL;
- }
-}
-#endif
-#endif
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxcrt/fx_ext.h"
+#include "../../../include/fxge/fx_ge.h"
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+#include "apple_int.h"
+#include "../../../include/fxge/fx_ge_apple.h"
+#include "../agg/include/fxfx_agg_clip_liang_barsky.h"
+#include "../ge/text_int.h"
+#include "../dib/dib_int.h"
+#include "../agg/include/fx_agg_driver.h"
+#include "../../../include/fxge/fx_freetype.h"
+#if (_FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ && (!defined(_FPDFAPI_MINI_)))
+void CFX_AggDeviceDriver::InitPlatform()
+{
+ CQuartz2D & quartz2d = ((CApplePlatform *) CFX_GEModule::Get()->GetPlatformData())->_quartz2d;
+ m_pPlatformGraphics = quartz2d.createGraphics(m_pBitmap);
+}
+void CFX_AggDeviceDriver::DestroyPlatform()
+{
+ CQuartz2D & quartz2d = ((CApplePlatform *) CFX_GEModule::Get()->GetPlatformData())->_quartz2d;
+ if (m_pPlatformGraphics) {
+ quartz2d.destroyGraphics(m_pPlatformGraphics);
+ m_pPlatformGraphics = NULL;
+ }
+}
+void CFX_FaceCache::InitPlatform() {}
+void CFX_FaceCache::DestroyPlatform() {}
+CFX_GlyphBitmap* CFX_FaceCache::RenderGlyph_Nativetext(CFX_Font * pFont,
+ FX_DWORD glyph_index,
+ const CFX_AffineMatrix * pMatrix,
+ int dest_width,
+ int anti_alias)
+{
+ return NULL;
+}
+static FX_BOOL _CGDrawGlyphRun(CGContextRef pContext,
+ int nChars,
+ const FXTEXT_CHARPOS* pCharPos,
+ CFX_Font* pFont,
+ CFX_FontCache* pCache,
+ const CFX_AffineMatrix* pObject2Device,
+ FX_FLOAT font_size,
+ FX_DWORD argb,
+ int alpha_flag,
+ void* pIccTransform)
+{
+ if (nChars == 0) {
+ return TRUE;
+ }
+ CFX_AffineMatrix new_matrix;
+ FX_BOOL bNegSize = font_size < 0;
+ if (bNegSize) {
+ font_size = -font_size;
+ }
+ FX_FLOAT ori_x = pCharPos[0].m_OriginX, ori_y = pCharPos[0].m_OriginY;
+ new_matrix.Transform(ori_x, ori_y);
+ if (pObject2Device) {
+ new_matrix.Concat(*pObject2Device);
+ }
+ CQuartz2D& quartz2d = ((CApplePlatform *) CFX_GEModule::Get()->GetPlatformData())->_quartz2d;
+ if (!pFont->m_pPlatformFont) {
+ if (pFont->GetPsName() == CFX_WideString::FromLocal("DFHeiStd-W5")) {
+ return FALSE;
+ }
+ pFont->m_pPlatformFont = quartz2d.CreateFont(pFont->m_pFontData, pFont->m_dwSize);
+ if (NULL == pFont->m_pPlatformFont) {
+ return FALSE;
+ }
+ }
+ CFX_FixedBufGrow<FX_WORD, 32> glyph_indices(nChars);
+ CFX_FixedBufGrow<CGPoint, 32> glyph_positions(nChars);
+ for (int i = 0; i < nChars; i++ ) {
+ glyph_indices[i] = pCharPos[i].m_ExtGID;
+ if (bNegSize) {
+ glyph_positions[i].x = -pCharPos[i].m_OriginX;
+ } else {
+ glyph_positions[i].x = pCharPos[i].m_OriginX;
+ }
+ glyph_positions[i].y = pCharPos[i].m_OriginY;
+ }
+ if (bNegSize) {
+ new_matrix.a = -new_matrix.a;
+ } else {
+ new_matrix.b = -new_matrix.b;
+ new_matrix.d = -new_matrix.d;
+ }
+ quartz2d.setGraphicsTextMatrix(pContext, &new_matrix);
+ return quartz2d.drawGraphicsString(pContext,
+ pFont->m_pPlatformFont,
+ font_size,
+ glyph_indices,
+ glyph_positions,
+ nChars,
+ argb,
+ NULL);
+}
+static void _DoNothing(void *info, const void *data, size_t size) {}
+FX_BOOL CFX_AggDeviceDriver::DrawDeviceText(int nChars,
+ const FXTEXT_CHARPOS * pCharPos,
+ CFX_Font * pFont,
+ CFX_FontCache * pCache,
+ const CFX_AffineMatrix * pObject2Device,
+ FX_FLOAT font_size,
+ FX_DWORD argb,
+ int alpha_flag, void* pIccTransform)
+{
+ if (!pFont) {
+ return FALSE;
+ }
+ FX_BOOL bBold = pFont->IsBold();
+ if (!bBold && pFont->GetSubstFont() &&
+ pFont->GetSubstFont()->m_Weight >= 500 &&
+ pFont->GetSubstFont()->m_Weight <= 600) {
+ return FALSE;
+ }
+ for (int i = 0; i < nChars; i ++) {
+ if (pCharPos[i].m_bGlyphAdjust) {
+ return FALSE;
+ }
+ }
+ CGContextRef ctx = CGContextRef(m_pPlatformGraphics);
+ if (NULL == ctx) {
+ return FALSE;
+ }
+ CGContextSaveGState(ctx);
+ CGContextSetTextDrawingMode(ctx, kCGTextFillClip);
+ CGRect rect_cg;
+ CGImageRef pImageCG = NULL;
+ if (m_pClipRgn) {
+ rect_cg = CGRectMake(m_pClipRgn->GetBox().left, m_pClipRgn->GetBox().top, m_pClipRgn->GetBox().Width(), m_pClipRgn->GetBox().Height());
+ const CFX_DIBitmap* pClipMask = m_pClipRgn->GetMask();
+ if (pClipMask) {
+ CGDataProviderRef pClipMaskDataProvider = CGDataProviderCreateWithData(NULL,
+ pClipMask->GetBuffer(),
+ pClipMask->GetPitch() * pClipMask->GetHeight(),
+ _DoNothing);
+ CGFloat decode_f[2] = {255.f, 0.f};
+ pImageCG = CGImageMaskCreate(pClipMask->GetWidth(), pClipMask->GetHeight(),
+ 8, 8, pClipMask->GetPitch(), pClipMaskDataProvider,
+ decode_f, FALSE);
+ CGDataProviderRelease(pClipMaskDataProvider);
+ }
+ } else {
+ rect_cg = CGRectMake(0, 0, m_pBitmap->GetWidth(), m_pBitmap->GetHeight());
+ }
+ rect_cg = CGContextConvertRectToDeviceSpace(ctx, rect_cg);
+ if (pImageCG) {
+ CGContextClipToMask(ctx, rect_cg, pImageCG);
+ } else {
+ CGContextClipToRect(ctx, rect_cg);
+ }
+ FX_BOOL ret = _CGDrawGlyphRun(ctx, nChars, pCharPos, pFont, pCache, pObject2Device, font_size, argb, alpha_flag, pIccTransform);
+ if (pImageCG) {
+ CGImageRelease(pImageCG);
+ }
+ CGContextRestoreGState(ctx);
+ return ret;
+}
+void CFX_Font::ReleasePlatformResource()
+{
+ if (m_pPlatformFont) {
+ CQuartz2D & quartz2d = ((CApplePlatform *) CFX_GEModule::Get()->GetPlatformData())->_quartz2d;
+ quartz2d.DestroyFont(m_pPlatformFont);
+ m_pPlatformFont = NULL;
+ }
+}
+#endif
+#endif
diff --git a/core/src/fxge/apple/fx_mac_imp.cpp b/core/src/fxge/apple/fx_mac_imp.cpp
index 9a1218bf0b..a21aa5ded5 100644
--- a/core/src/fxge/apple/fx_mac_imp.cpp
+++ b/core/src/fxge/apple/fx_mac_imp.cpp
@@ -1,117 +1,117 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../../include/fxge/fx_ge.h"
-#include "apple_int.h"
-#if _FX_OS_ == _FX_MACOSX_
-static const struct {
- FX_LPCSTR m_pName;
- FX_LPCSTR m_pSubstName;
-}
-Base14Substs[] = {
- {"Courier", "Courier New"},
- {"Courier-Bold", "Courier New Bold"},
- {"Courier-BoldOblique", "Courier New Bold Italic"},
- {"Courier-Oblique", "Courier New Italic"},
- {"Helvetica", "Arial"},
- {"Helvetica-Bold", "Arial Bold"},
- {"Helvetica-BoldOblique", "Arial Bold Italic"},
- {"Helvetica-Oblique", "Arial Italic"},
- {"Times-Roman", "Times New Roman"},
- {"Times-Bold", "Times New Roman Bold"},
- {"Times-BoldItalic", "Times New Roman Bold Italic"},
- {"Times-Italic", "Times New Roman Italic"},
-};
-#if !defined(_FPDFAPI_MINI_)
-class CFX_MacFontInfo : public CFX_FolderFontInfo
-{
-public:
- virtual void* MapFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR family, FX_BOOL& bExact);
-};
-#define JAPAN_GOTHIC "Hiragino Kaku Gothic Pro W6"
-#define JAPAN_MINCHO "Hiragino Mincho Pro W6"
-static void GetJapanesePreference(CFX_ByteString& face, int weight, int picth_family)
-{
- if (face.Find("Gothic") >= 0) {
- face = JAPAN_GOTHIC;
- return;
- }
- if (!(picth_family & FXFONT_FF_ROMAN) && weight > 400) {
- face = JAPAN_GOTHIC;
- } else {
- face = JAPAN_MINCHO;
- }
-}
-void* CFX_MacFontInfo::MapFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR cstr_face, FX_BOOL& bExact)
-{
- CFX_ByteString face = cstr_face;
- int iBaseFont;
- for (iBaseFont = 0; iBaseFont < 12; iBaseFont ++)
- if (face == CFX_ByteStringC(Base14Substs[iBaseFont].m_pName)) {
- face = Base14Substs[iBaseFont].m_pSubstName;
- bExact = TRUE;
- break;
- }
- if (iBaseFont < 12) {
- return GetFont(face);
- }
- FX_LPVOID p;
- if (m_FontList.Lookup(face, p)) {
- return p;
- }
- if (charset == FXFONT_ANSI_CHARSET && (pitch_family & FXFONT_FF_FIXEDPITCH)) {
- return GetFont("Courier New");
- }
- if (charset == FXFONT_ANSI_CHARSET || charset == FXFONT_SYMBOL_CHARSET) {
- return NULL;
- }
- switch (charset) {
- case FXFONT_SHIFTJIS_CHARSET:
- GetJapanesePreference(face, weight, pitch_family);
- break;
- case FXFONT_GB2312_CHARSET:
- face = "STSong";
- break;
- case FXFONT_HANGEUL_CHARSET:
- face = "AppleMyungjo";
- break;
- case FXFONT_CHINESEBIG5_CHARSET:
- face = "LiSong Pro Light";
- }
- if (m_FontList.Lookup(face, p)) {
- return p;
- }
- return NULL;
-}
-#endif
-IFX_SystemFontInfo* IFX_SystemFontInfo::CreateDefault()
-{
-#if !defined(_FPDFAPI_MINI_)
- CFX_MacFontInfo* pInfo = FX_NEW CFX_MacFontInfo;
- if (!pInfo) {
- return NULL;
- }
- pInfo->AddPath("~/Library/Fonts");
- pInfo->AddPath("/Library/Fonts");
- pInfo->AddPath("/System/Library/Fonts");
- return pInfo;
-#else
- return NULL;
-#endif
-}
-void CFX_GEModule::InitPlatform()
-{
- m_pPlatformData = FX_NEW CApplePlatform;
- m_pFontMgr->SetSystemFontInfo(IFX_SystemFontInfo::CreateDefault());
-}
-void CFX_GEModule::DestroyPlatform()
-{
- if (m_pPlatformData) {
- delete (CApplePlatform *) m_pPlatformData;
- }
- m_pPlatformData = NULL;
-}
-#endif
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxge/fx_ge.h"
+#include "apple_int.h"
+#if _FX_OS_ == _FX_MACOSX_
+static const struct {
+ FX_LPCSTR m_pName;
+ FX_LPCSTR m_pSubstName;
+}
+Base14Substs[] = {
+ {"Courier", "Courier New"},
+ {"Courier-Bold", "Courier New Bold"},
+ {"Courier-BoldOblique", "Courier New Bold Italic"},
+ {"Courier-Oblique", "Courier New Italic"},
+ {"Helvetica", "Arial"},
+ {"Helvetica-Bold", "Arial Bold"},
+ {"Helvetica-BoldOblique", "Arial Bold Italic"},
+ {"Helvetica-Oblique", "Arial Italic"},
+ {"Times-Roman", "Times New Roman"},
+ {"Times-Bold", "Times New Roman Bold"},
+ {"Times-BoldItalic", "Times New Roman Bold Italic"},
+ {"Times-Italic", "Times New Roman Italic"},
+};
+#if !defined(_FPDFAPI_MINI_)
+class CFX_MacFontInfo : public CFX_FolderFontInfo
+{
+public:
+ virtual void* MapFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR family, FX_BOOL& bExact);
+};
+#define JAPAN_GOTHIC "Hiragino Kaku Gothic Pro W6"
+#define JAPAN_MINCHO "Hiragino Mincho Pro W6"
+static void GetJapanesePreference(CFX_ByteString& face, int weight, int picth_family)
+{
+ if (face.Find("Gothic") >= 0) {
+ face = JAPAN_GOTHIC;
+ return;
+ }
+ if (!(picth_family & FXFONT_FF_ROMAN) && weight > 400) {
+ face = JAPAN_GOTHIC;
+ } else {
+ face = JAPAN_MINCHO;
+ }
+}
+void* CFX_MacFontInfo::MapFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR cstr_face, FX_BOOL& bExact)
+{
+ CFX_ByteString face = cstr_face;
+ int iBaseFont;
+ for (iBaseFont = 0; iBaseFont < 12; iBaseFont ++)
+ if (face == CFX_ByteStringC(Base14Substs[iBaseFont].m_pName)) {
+ face = Base14Substs[iBaseFont].m_pSubstName;
+ bExact = TRUE;
+ break;
+ }
+ if (iBaseFont < 12) {
+ return GetFont(face);
+ }
+ FX_LPVOID p;
+ if (m_FontList.Lookup(face, p)) {
+ return p;
+ }
+ if (charset == FXFONT_ANSI_CHARSET && (pitch_family & FXFONT_FF_FIXEDPITCH)) {
+ return GetFont("Courier New");
+ }
+ if (charset == FXFONT_ANSI_CHARSET || charset == FXFONT_SYMBOL_CHARSET) {
+ return NULL;
+ }
+ switch (charset) {
+ case FXFONT_SHIFTJIS_CHARSET:
+ GetJapanesePreference(face, weight, pitch_family);
+ break;
+ case FXFONT_GB2312_CHARSET:
+ face = "STSong";
+ break;
+ case FXFONT_HANGEUL_CHARSET:
+ face = "AppleMyungjo";
+ break;
+ case FXFONT_CHINESEBIG5_CHARSET:
+ face = "LiSong Pro Light";
+ }
+ if (m_FontList.Lookup(face, p)) {
+ return p;
+ }
+ return NULL;
+}
+#endif
+IFX_SystemFontInfo* IFX_SystemFontInfo::CreateDefault()
+{
+#if !defined(_FPDFAPI_MINI_)
+ CFX_MacFontInfo* pInfo = FX_NEW CFX_MacFontInfo;
+ if (!pInfo) {
+ return NULL;
+ }
+ pInfo->AddPath("~/Library/Fonts");
+ pInfo->AddPath("/Library/Fonts");
+ pInfo->AddPath("/System/Library/Fonts");
+ return pInfo;
+#else
+ return NULL;
+#endif
+}
+void CFX_GEModule::InitPlatform()
+{
+ m_pPlatformData = FX_NEW CApplePlatform;
+ m_pFontMgr->SetSystemFontInfo(IFX_SystemFontInfo::CreateDefault());
+}
+void CFX_GEModule::DestroyPlatform()
+{
+ if (m_pPlatformData) {
+ delete (CApplePlatform *) m_pPlatformData;
+ }
+ m_pPlatformData = NULL;
+}
+#endif
diff --git a/core/src/fxge/apple/fx_quartz_device.cpp b/core/src/fxge/apple/fx_quartz_device.cpp
index bef45163f7..7cb94f1093 100644
--- a/core/src/fxge/apple/fx_quartz_device.cpp
+++ b/core/src/fxge/apple/fx_quartz_device.cpp
@@ -1,1138 +1,1138 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../../include/fxcrt/fx_ext.h"
-#include "../../../include/fxge/fx_ge.h"
-#include "../agg/include/fxfx_agg_clip_liang_barsky.h"
-#include "../ge/text_int.h"
-#include "../dib/dib_int.h"
-#include "../agg/include/fx_agg_driver.h"
-#include "../../../include/fxge/fx_freetype.h"
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
-#include "apple_int.h"
-#include "../../../include/fxge/fx_ge_apple.h"
-#ifndef CGFLOAT_IS_DOUBLE
-#error Expected CGFLOAT_IS_DOUBLE to be defined by CoreGraphics headers
-#endif
-void* CQuartz2D::createGraphics(CFX_DIBitmap* pBitmap)
-{
- if (!pBitmap) {
- return NULL;
- }
- CGBitmapInfo bmpInfo = kCGBitmapByteOrder32Little;
- switch (pBitmap->GetFormat()) {
- case FXDIB_Rgb32:
- bmpInfo |= kCGImageAlphaNoneSkipFirst;
- break;
- case FXDIB_Argb:
- default:
- return NULL;
- }
- CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
- CGContextRef context = CGBitmapContextCreate(pBitmap->GetBuffer(),
- pBitmap->GetWidth(),
- pBitmap->GetHeight(),
- 8,
- pBitmap->GetPitch(),
- colorSpace,
- bmpInfo);
- CGColorSpaceRelease(colorSpace);
- return context;
-}
-void CQuartz2D::destroyGraphics(void* graphics)
-{
- if (graphics) {
- CGContextRelease((CGContextRef) graphics);
- }
-}
-void* CQuartz2D::CreateFont(FX_LPCBYTE pFontData, FX_DWORD dwFontSize)
-{
- CGDataProviderRef pDataProvider = CGDataProviderCreateWithData(NULL, pFontData, (size_t)dwFontSize, NULL);
- if (NULL == pDataProvider) {
- return NULL;
- }
- CGFontRef pCGFont = CGFontCreateWithDataProvider(pDataProvider);
- CGDataProviderRelease(pDataProvider);
- return pCGFont;
-}
-void CQuartz2D::DestroyFont(void* pFont)
-{
- CGFontRelease((CGFontRef)pFont);
-}
-void CQuartz2D::setGraphicsTextMatrix(void* graphics, CFX_AffineMatrix* matrix)
-{
- if (!graphics || !matrix) {
- return;
- }
- CGContextRef context = (CGContextRef) graphics;
- CGFloat ty = CGBitmapContextGetHeight(context) - matrix->f;
- CGContextSetTextMatrix(context, CGAffineTransformMake(matrix->a,
- matrix->b,
- matrix->c,
- matrix->d,
- matrix->e,
- ty));
-}
-FX_BOOL CQuartz2D::drawGraphicsString(void* graphics,
- void* font,
- FX_FLOAT fontSize,
- FX_WORD* glyphIndices,
- CGPoint* glyphPositions,
- FX_INT32 charsCount,
- FX_ARGB argb,
- CFX_AffineMatrix* matrix )
-{
- if (!graphics) {
- return FALSE;
- }
- CGContextRef context = (CGContextRef) graphics;
- CGContextSetFont(context, (CGFontRef)font);
- CGContextSetFontSize(context, fontSize);
- if (matrix) {
- CGAffineTransform m = CGContextGetTextMatrix(context);
- m = CGAffineTransformConcat(m,
- CGAffineTransformMake(matrix->a,
- matrix->b,
- matrix->c,
- matrix->d,
- matrix->e,
- matrix->f));
- CGContextSetTextMatrix(context, m);
- }
- FX_INT32 a, r, g, b;
- ArgbDecode(argb, a, r, g, b);
- CGContextSetRGBFillColor(context,
- r / 255.f,
- g / 255.f,
- b / 255.f,
- a / 255.f);
- CGContextSaveGState(context);
-#if CGFLOAT_IS_DOUBLE
- CGPoint* glyphPositionsCG = new CGPoint[charsCount];
- if (!glyphPositionsCG) {
- return FALSE;
- }
- for (int index = 0; index < charsCount; ++index) {
- glyphPositionsCG[index].x = glyphPositions[index].x;
- glyphPositionsCG[index].y = glyphPositions[index].y;
- }
-#else
- CGPoint* glyphPositionsCG = (CGPoint*)glyphPositions;
-#endif
- CGContextShowGlyphsAtPositions(context,
- (CGGlyph *) glyphIndices,
- glyphPositionsCG,
- charsCount);
-#if CGFLOAT_IS_DOUBLE
- delete[] glyphPositionsCG;
-#endif
- CGContextRestoreGState(context);
- return TRUE;
-}
-void CQuartz2D::saveGraphicsState(void * graphics)
-{
- if (graphics) {
- CGContextSaveGState((CGContextRef) graphics);
- }
-}
-void CQuartz2D::restoreGraphicsState(void * graphics)
-{
- if (graphics) {
- CGContextRestoreGState((CGContextRef) graphics);
- }
-}
-static CGContextRef createContextWithBitmap(CFX_DIBitmap* pBitmap)
-{
- if (!pBitmap || pBitmap->IsCmykImage() || pBitmap->GetBPP() < 32) {
- return NULL;
- }
- CGBitmapInfo bitmapInfo = kCGBitmapByteOrder32Little;
- if (pBitmap->HasAlpha()) {
- bitmapInfo |= kCGImageAlphaPremultipliedFirst;
- } else {
- bitmapInfo |= kCGImageAlphaNoneSkipFirst;
- }
- CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
- CGContextRef context = CGBitmapContextCreate(pBitmap->GetBuffer(),
- pBitmap->GetWidth(),
- pBitmap->GetHeight(),
- 8,
- pBitmap->GetPitch(),
- colorSpace,
- bitmapInfo);
- CGColorSpaceRelease(colorSpace);
- return context;
-}
-CFX_QuartzDeviceDriver::CFX_QuartzDeviceDriver(CGContextRef context, FX_INT32 deviceClass)
-{
- m_saveCount = 0;
- _context = context;
- _deviceClass = deviceClass;
- CGContextRetain(_context);
- CGRect r = CGContextGetClipBoundingBox(context);
- _width = FXSYS_round(r.size.width);
- _height = FXSYS_round(r.size.height);
- _renderCaps = FXRC_SOFT_CLIP | FXRC_BLEND_MODE |
- FXRC_ALPHA_PATH | FXRC_ALPHA_IMAGE |
- FXRC_BIT_MASK | FXRC_ALPHA_MASK;
- if (_deviceClass != FXDC_DISPLAY) {
- } else {
- CGImageRef image = CGBitmapContextCreateImage(_context);
- if (image) {
- _renderCaps |= FXRC_GET_BITS;
- _width = CGImageGetWidth(image);
- _height = CGImageGetHeight(image);
- CGImageAlphaInfo alphaInfo = CGImageGetAlphaInfo(image);
- if (kCGImageAlphaPremultipliedFirst == alphaInfo ||
- kCGImageAlphaPremultipliedLast == alphaInfo ||
- kCGImageAlphaOnly == alphaInfo) {
- _renderCaps |= FXRC_ALPHA_OUTPUT;
- }
- }
- CGImageRelease(image);
- }
- CGAffineTransform ctm = CGContextGetCTM(_context);
- CGContextSaveGState(_context);
- m_saveCount++;
- if (ctm.d >= 0) {
- CGFloat offset_x, offset_y;
- offset_x = ctm.tx;
- offset_y = ctm.ty;
- CGContextTranslateCTM(_context, -offset_x, -offset_y);
- CGContextConcatCTM(_context, CGAffineTransformMake(1, 0, 0, -1, offset_x, _height + offset_y));
- }
- _foxitDevice2User = CGAffineTransformIdentity;
- _user2FoxitDevice = CGAffineTransformInvert(_foxitDevice2User);
-}
-CFX_QuartzDeviceDriver::~CFX_QuartzDeviceDriver()
-{
- CGContextRestoreGState(_context);
- m_saveCount--;
- for (int i = 0; i < m_saveCount; ++i) {
- CGContextRestoreGState(_context);
- }
- if (_context) {
- CGContextRelease(_context);
- }
-}
-int CFX_QuartzDeviceDriver::GetDeviceCaps(int capsID)
-{
- switch (capsID) {
- case FXDC_DEVICE_CLASS: {
- return _deviceClass;
- }
- case FXDC_PIXEL_WIDTH: {
- return _width;
- }
- case FXDC_PIXEL_HEIGHT: {
- return _height;
- }
- case FXDC_BITS_PIXEL: {
- return 32;
- }
- case FXDC_RENDER_CAPS: {
- return _renderCaps;
- }
- default: {
- return 0;
- }
- }
-}
-CFX_Matrix CFX_QuartzDeviceDriver::GetCTM() const
-{
- CGAffineTransform ctm = CGContextGetCTM(_context);
- return CFX_Matrix(ctm.a, ctm.b, ctm.c, ctm.d, ctm.tx, ctm.ty);
-}
-void CFX_QuartzDeviceDriver::SaveState()
-{
- CGContextSaveGState(_context);
- m_saveCount++;
-}
-void CFX_QuartzDeviceDriver::RestoreState(FX_BOOL isKeepSaved )
-{
- CGContextRestoreGState(_context);
- if (isKeepSaved) {
- CGContextSaveGState(_context);
- } else {
- m_saveCount--;
- }
-}
-FX_BOOL CFX_QuartzDeviceDriver::SetClip_PathFill(const CFX_PathData* pathData,
- const CFX_AffineMatrix* matrix,
- int fillMode )
-{
- SaveState();
- CGAffineTransform m = CGAffineTransformIdentity;
- if (matrix) {
- m = CGAffineTransformMake(matrix->GetA(), matrix->GetB(), matrix->GetC(), matrix->GetD(), matrix->GetE(), matrix->GetF());
- }
- m = CGAffineTransformConcat(m, _foxitDevice2User);
- CGContextConcatCTM(_context, m);
- setPathToContext(pathData);
- RestoreState(FALSE);
- if ((fillMode & 3) == FXFILL_WINDING) {
- CGContextClip(_context);
- } else {
- CGContextEOClip(_context);
- }
- return TRUE;
-}
-FX_FLOAT CFX_QuartzDeviceDriver::getLineWidth(const CFX_GraphStateData * graphState, CGAffineTransform ctm)
-{
- FX_FLOAT lineWidth = graphState->m_LineWidth;
- if (graphState->m_LineWidth <= 0.f) {
- CGSize size;
- size.width = 1;
- size.height = 1;
- CGSize temp = CGSizeApplyAffineTransform(size, ctm);
- CGFloat x = 1 / temp.width;
- CGFloat y = 1 / temp.height;
- lineWidth = x > y ? x : y;
- }
- return lineWidth;
-}
-FX_BOOL CFX_QuartzDeviceDriver::SetClip_PathStroke(const CFX_PathData* pathData,
- const CFX_AffineMatrix* matrix,
- const CFX_GraphStateData* graphState )
-{
- SaveState();
- CGAffineTransform m = CGAffineTransformIdentity;
- if (matrix) {
- m = CGAffineTransformMake(matrix->GetA(), matrix->GetB(), matrix->GetC(), matrix->GetD(), matrix->GetE(), matrix->GetF());
- }
- m = CGAffineTransformConcat(m, _foxitDevice2User);
- CGContextConcatCTM(_context, m);
- FX_FLOAT lineWidth = getLineWidth(graphState, m);
- setStrokeInfo(graphState, 0xFF000000, lineWidth);
- setPathToContext(pathData);
- CGContextReplacePathWithStrokedPath(_context);
- RestoreState(FALSE);
- CGContextClip(_context);
- return TRUE;
-}
-static CGBlendMode GetCGBlendMode(int blend_type)
-{
- CGBlendMode mode = kCGBlendModeNormal;
- switch (blend_type) {
- case FXDIB_BLEND_NORMAL:
- mode = kCGBlendModeNormal;
- break;
- case FXDIB_BLEND_MULTIPLY:
- mode = kCGBlendModeMultiply;
- break;
- case FXDIB_BLEND_SCREEN:
- mode = kCGBlendModeScreen;
- break;
- case FXDIB_BLEND_OVERLAY:
- mode = kCGBlendModeOverlay;
- break;
- case FXDIB_BLEND_DARKEN:
- mode = kCGBlendModeDarken;
- break;
- case FXDIB_BLEND_LIGHTEN:
- mode = kCGBlendModeLighten;
- break;
- case FXDIB_BLEND_COLORDODGE:
- mode = kCGBlendModeColorDodge;
- break;
- case FXDIB_BLEND_COLORBURN:
- mode = kCGBlendModeColorBurn;
- break;
- case FXDIB_BLEND_HARDLIGHT:
- mode = kCGBlendModeHardLight;
- break;
- case FXDIB_BLEND_SOFTLIGHT:
- mode = kCGBlendModeSoftLight;
- break;
- case FXDIB_BLEND_DIFFERENCE:
- mode = kCGBlendModeDifference;
- break;
- case FXDIB_BLEND_EXCLUSION:
- mode = kCGBlendModeExclusion;
- break;
- case FXDIB_BLEND_HUE:
- mode = kCGBlendModeHue;
- break;
- case FXDIB_BLEND_SATURATION:
- mode = kCGBlendModeSaturation;
- break;
- case FXDIB_BLEND_COLOR:
- mode = kCGBlendModeColor;
- break;
- case FXDIB_BLEND_LUMINOSITY:
- mode = kCGBlendModeLuminosity;
- break;
- default:
- mode = kCGBlendModeNormal;
- break;
- }
- return mode;
-}
-FX_BOOL CFX_QuartzDeviceDriver::DrawPath(const CFX_PathData* pathData,
- const CFX_AffineMatrix* matrix,
- const CFX_GraphStateData* graphState,
- FX_DWORD fillArgb,
- FX_DWORD strokeArgb,
- int fillMode,
- int alpha_flag,
- void* pIccTransform,
- int blend_type
- )
-{
- SaveState();
- CGBlendMode mode = GetCGBlendMode(blend_type);
- if (mode != kCGBlendModeNormal) {
- CGContextSetBlendMode(_context, mode);
- }
- CGAffineTransform m = CGAffineTransformIdentity;
- if (matrix) {
- m = CGAffineTransformMake(matrix->GetA(), matrix->GetB(), matrix->GetC(), matrix->GetD(), matrix->GetE(), matrix->GetF());
- }
- m = CGAffineTransformConcat(m, _foxitDevice2User);
- CGContextConcatCTM(_context, m);
- int pathMode = 0;
- if (graphState && strokeArgb) {
- CGContextSetMiterLimit(_context, graphState->m_MiterLimit);
- FX_FLOAT lineWidth = getLineWidth(graphState, m);
- setStrokeInfo(graphState, strokeArgb, lineWidth);
- pathMode |= 4;
- }
- if (fillMode && fillArgb) {
- setFillInfo(fillArgb);
- if ((fillMode & 3) == FXFILL_WINDING) {
- pathMode |= 1;
- } else if ((fillMode & 3) == FXFILL_ALTERNATE) {
- pathMode |= 2;
- }
- }
- setPathToContext(pathData);
- if (fillMode & FXFILL_FULLCOVER) {
- CGContextSetShouldAntialias(_context, false);
- }
- if (pathMode == 4) {
- CGContextStrokePath(_context);
- } else if (pathMode == 1) {
- CGContextFillPath(_context);
- } else if (pathMode == 2) {
- CGContextEOFillPath(_context);
- } else if (pathMode == 5) {
- CGContextDrawPath(_context, kCGPathFillStroke);
- } else if (pathMode == 6) {
- CGContextDrawPath(_context, kCGPathEOFillStroke);
- }
- RestoreState(FALSE);
- return TRUE;
-}
-FX_BOOL CFX_QuartzDeviceDriver::FillRect(const FX_RECT* rect,
- FX_ARGB fillArgb,
- int alphaFlag ,
- void* iccTransform ,
- int blend_type )
-{
- CGBlendMode mode = GetCGBlendMode(blend_type);
- if (mode != kCGBlendModeNormal) {
- CGContextSetBlendMode(_context, mode);
- }
- CGRect rect_fx = CGRectMake(rect->left, rect->top, rect->Width(), rect->Height());
- CGRect rect_usr = CGRectApplyAffineTransform(rect_fx, _foxitDevice2User);
- FX_INT32 a, r, g, b;
- ArgbDecode(fillArgb, a, r, g, b);
- CGContextSetRGBFillColor(_context,
- r / 255.f,
- g / 255.f,
- b / 255.f,
- a / 255.f);
- CGContextFillRect(_context, rect_usr);
- if (mode != kCGBlendModeNormal) {
- CGContextSetBlendMode(_context, kCGBlendModeNormal);
- }
- return TRUE;
-}
-FX_BOOL CFX_QuartzDeviceDriver::DrawCosmeticLine(FX_FLOAT x1,
- FX_FLOAT y1,
- FX_FLOAT x2,
- FX_FLOAT y2,
- FX_DWORD argb,
- int alphaFlag ,
- void* iccTransform ,
- int blend_type )
-{
- CGBlendMode mode = GetCGBlendMode(blend_type);
- if (mode != kCGBlendModeNormal) {
- CGContextSetBlendMode(_context, mode);
- }
- CGPoint pt = CGPointApplyAffineTransform(CGPointMake(x1, y1), _foxitDevice2User);
- x1 = pt.x;
- y1 = pt.y;
- pt = CGPointApplyAffineTransform(CGPointMake(x2, y2), _foxitDevice2User);
- x2 = pt.x;
- y2 = pt.y;
- FX_INT32 a, r, g, b;
- ArgbDecode(argb, a, r, g, b);
- CGContextSetRGBStrokeColor(_context,
- r / 255.f,
- g / 255.f,
- b / 255.f,
- a / 255.f);
- CGContextMoveToPoint(_context, x1, y1);
- CGContextAddLineToPoint(_context, x2, y2);
- CGContextStrokePath(_context);
- if (mode != kCGBlendModeNormal) {
- CGContextSetBlendMode(_context, kCGBlendModeNormal);
- }
- return TRUE;
-}
-FX_BOOL CFX_QuartzDeviceDriver::GetClipBox(FX_RECT* rect)
-{
- CGRect r = CGContextGetClipBoundingBox(_context);
- r = CGRectApplyAffineTransform(r, _user2FoxitDevice);
- rect->left = FXSYS_floor(r.origin.x);
- rect->top = FXSYS_floor(r.origin.y);
- rect->right = FXSYS_ceil(r.origin.x + r.size.width);
- rect->bottom = FXSYS_ceil(r.origin.y + r.size.height);
- return TRUE;
-}
-FX_BOOL CFX_QuartzDeviceDriver::GetDIBits(CFX_DIBitmap* bitmap,
- FX_INT32 left,
- FX_INT32 top,
- void* pIccTransform,
- FX_BOOL bDEdge)
-{
- if (FXDC_PRINTER == _deviceClass) {
- return FALSE;
- }
- if (bitmap->GetBPP() < 32) {
- return FALSE;
- }
- if (!(_renderCaps | FXRC_GET_BITS)) {
- return FALSE;
- }
- CGPoint pt = CGPointMake(left, top);
- pt = CGPointApplyAffineTransform(pt, _foxitDevice2User);
- CGAffineTransform ctm = CGContextGetCTM(_context);
- pt.x *= FXSYS_fabs(ctm.a);
- pt.y *= FXSYS_fabs(ctm.d);
- CGImageRef image = CGBitmapContextCreateImage(_context);
- if (NULL == image) {
- return FALSE;
- }
- CGFloat width = (CGFloat) bitmap->GetWidth();
- CGFloat height = (CGFloat) bitmap->GetHeight();
- if (width + pt.x > _width) {
- width -= (width + pt.x - _width);
- }
- if (height + pt.y > _height) {
- height -= (height + pt.y - _height);
- }
- CGImageRef subImage = CGImageCreateWithImageInRect(image,
- CGRectMake(pt.x,
- pt.y,
- width,
- height));
- CGContextRef context = createContextWithBitmap(bitmap);
- CGRect rect = CGContextGetClipBoundingBox(context);
- CGContextClearRect(context, rect);
- CGContextDrawImage(context, rect, subImage);
- CGContextRelease(context);
- CGImageRelease(subImage);
- CGImageRelease(image);
- if (bitmap->HasAlpha()) {
- for (int row = 0; row < bitmap->GetHeight(); row ++) {
- FX_LPBYTE pScanline = (FX_LPBYTE)bitmap->GetScanline(row);
- for (int col = 0; col < bitmap->GetWidth(); col ++) {
- if (pScanline[3] > 0) {
- pScanline[0] = (pScanline[0] * 255.f / pScanline[3] + .5f);
- pScanline[1] = (pScanline[1] * 255.f / pScanline[3] + .5f);
- pScanline[2] = (pScanline[2] * 255.f / pScanline[3] + .5f);
- }
- pScanline += 4;
- }
- }
- }
- return TRUE;
-}
-FX_BOOL CFX_QuartzDeviceDriver::SetDIBits(const CFX_DIBSource* pBitmap,
- FX_ARGB argb,
- const FX_RECT* srcRect,
- int dest_left,
- int dest_top,
- int blendType,
- int alphaFlag ,
- void* iccTransform )
-{
- SaveState();
- CGFloat src_left, src_top, src_width, src_height;
- if (srcRect) {
- src_left = srcRect->left;
- src_top = srcRect->top;
- src_width = srcRect->Width();
- src_height = srcRect->Height();
- } else {
- src_left = src_top = 0;
- src_width = pBitmap->GetWidth();
- src_height = pBitmap->GetHeight();
- }
- CGAffineTransform ctm = CGContextGetCTM(_context);
- CGFloat scale_x = FXSYS_fabs(ctm.a);
- CGFloat scale_y = FXSYS_fabs(ctm.d);
- src_left /= scale_x;
- src_top /= scale_y;
- src_width /= scale_x;
- src_height /= scale_y;
- CGRect rect_fx = CGRectMake(dest_left, dest_top, src_width, src_height);
- CGRect rect_usr = CGRectApplyAffineTransform(rect_fx, _foxitDevice2User);
- CGContextBeginPath(_context);
- CGContextAddRect(_context, rect_usr);
- CGContextClip(_context);
- rect_usr.size = CGSizeMake(pBitmap->GetWidth() / scale_x, pBitmap->GetHeight() / scale_y);
- rect_usr = CGRectOffset(rect_usr, -src_left, -src_top);
- CG_SetImageTransform(dest_left, dest_top, src_width, src_height, &rect_usr);
- CFX_DIBitmap* pBitmap1 = NULL;
- if (pBitmap->IsAlphaMask()) {
- if (pBitmap->GetBuffer()) {
- pBitmap1 = (CFX_DIBitmap*)pBitmap;
- } else {
- pBitmap1 = pBitmap->Clone();
- }
- if (NULL == pBitmap1) {
- RestoreState(FALSE);
- return FALSE;
- }
- CGDataProviderRef pBitmapProvider = CGDataProviderCreateWithData(NULL,
- pBitmap1->GetBuffer(),
- pBitmap1->GetPitch() * pBitmap1->GetHeight(),
- NULL);
- CGColorSpaceRef pColorSpace = CGColorSpaceCreateDeviceGray();
- CGBitmapInfo bitmapInfo = kCGImageAlphaNone | kCGBitmapByteOrderDefault;
- CGImageRef pImage = CGImageCreate(pBitmap1->GetWidth(),
- pBitmap1->GetHeight(),
- pBitmap1->GetBPP(),
- pBitmap1->GetBPP(),
- pBitmap1->GetPitch(),
- pColorSpace,
- bitmapInfo,
- pBitmapProvider, NULL, true,
- kCGRenderingIntentDefault);
- CGContextClipToMask(_context, rect_usr, pImage);
- CGContextSetRGBFillColor(_context,
- FXARGB_R(argb) / 255.f,
- FXARGB_G(argb) / 255.f,
- FXARGB_B(argb) / 255.f,
- FXARGB_A(argb) / 255.f);
- CGContextFillRect(_context, rect_usr);
- CGImageRelease(pImage);
- CGColorSpaceRelease(pColorSpace);
- CGDataProviderRelease(pBitmapProvider);
- if (pBitmap1 != pBitmap) {
- delete pBitmap1;
- }
- RestoreState(FALSE);
- return TRUE;
- }
- if (pBitmap->GetBPP() < 32) {
- pBitmap1 = pBitmap->CloneConvert(FXDIB_Rgb32);
- } else {
- if (pBitmap->GetBuffer()) {
- pBitmap1 = (CFX_DIBitmap*)pBitmap;
- } else {
- pBitmap1 = pBitmap->Clone();
- }
- }
- if (NULL == pBitmap1) {
- RestoreState(FALSE);
- return FALSE;
- }
- if (pBitmap1->HasAlpha()) {
- if (pBitmap1 == pBitmap) {
- pBitmap1 = pBitmap->Clone();
- if (!pBitmap1) {
- RestoreState(FALSE);
- return FALSE;
- }
- }
- for (int row = 0; row < pBitmap1->GetHeight(); row ++) {
- FX_LPBYTE pScanline = (FX_LPBYTE)pBitmap1->GetScanline(row);
- for (int col = 0; col < pBitmap1->GetWidth(); col ++) {
- pScanline[0] = (FX_BYTE)(pScanline[0] * pScanline[3] / 255.f + .5f);
- pScanline[1] = (FX_BYTE)(pScanline[1] * pScanline[3] / 255.f + .5f);
- pScanline[2] = (FX_BYTE)(pScanline[2] * pScanline[3] / 255.f + .5f);
- pScanline += 4;
- }
- }
- }
- CGContextRef ctx = createContextWithBitmap(pBitmap1);
- CGImageRef image = CGBitmapContextCreateImage(ctx);
- int blend_mode = blendType;
- if (FXDIB_BLEND_HARDLIGHT == blendType) {
- blend_mode = kCGBlendModeSoftLight;
- } else if (FXDIB_BLEND_SOFTLIGHT == blendType) {
- blend_mode = kCGBlendModeHardLight;
- } else if (blendType >= FXDIB_BLEND_NONSEPARABLE && blendType <= FXDIB_BLEND_LUMINOSITY) {
- blend_mode = blendType - 9;
- } else if (blendType > FXDIB_BLEND_LUMINOSITY || blendType < 0) {
- blend_mode = kCGBlendModeNormal;
- }
- CGContextSetBlendMode(_context, (CGBlendMode)blend_mode);
- CGContextDrawImage(_context, rect_usr, image);
- CGImageRelease(image);
- CGContextRelease(ctx);
- if (pBitmap1 != pBitmap) {
- delete pBitmap1;
- }
- RestoreState(FALSE);
- return TRUE;
-}
-FX_BOOL CFX_QuartzDeviceDriver::StretchDIBits(const CFX_DIBSource* pBitmap,
- FX_ARGB argb,
- int dest_left,
- int dest_top,
- int dest_width,
- int dest_height,
- const FX_RECT* clipRect,
- FX_DWORD flags,
- int alphaFlag ,
- void* iccTransform ,
- int blend_type)
-{
- SaveState();
- if (clipRect) {
- CGContextBeginPath(_context);
- CGRect rect_clip = CGRectMake(clipRect->left, clipRect->top, clipRect->Width(), clipRect->Height());
- rect_clip = CGRectApplyAffineTransform(rect_clip, _foxitDevice2User);
- CGContextAddRect(_context, rect_clip);
- CGContextClip(_context);
- }
- CGRect rect = CGRectMake(dest_left, dest_top, dest_width, dest_height);
- rect = CGRectApplyAffineTransform(rect, _foxitDevice2User);
- if (FXDIB_BICUBIC_INTERPOL == flags) {
- CGContextSetInterpolationQuality(_context, kCGInterpolationHigh);
- } else if (FXDIB_DOWNSAMPLE == flags) {
- CGContextSetInterpolationQuality(_context, kCGInterpolationNone);
- } else {
- CGContextSetInterpolationQuality(_context, kCGInterpolationMedium);
- }
- CG_SetImageTransform(dest_left, dest_top, dest_width, dest_height);
- CFX_DIBitmap* pBitmap1 = NULL;
- if (pBitmap->IsAlphaMask()) {
- if (pBitmap->GetBuffer()) {
- pBitmap1 = (CFX_DIBitmap*)pBitmap;
- } else {
- pBitmap1 = pBitmap->Clone();
- }
- if (NULL == pBitmap1) {
- RestoreState(FALSE);
- return FALSE;
- }
- CGDataProviderRef pBitmapProvider = CGDataProviderCreateWithData(NULL,
- pBitmap1->GetBuffer(),
- pBitmap1->GetPitch() * pBitmap1->GetHeight(),
- NULL);
- CGColorSpaceRef pColorSpace = CGColorSpaceCreateDeviceGray();
- CGBitmapInfo bitmapInfo = kCGImageAlphaNone | kCGBitmapByteOrderDefault;
- CGImageRef pImage = CGImageCreate(pBitmap1->GetWidth(),
- pBitmap1->GetHeight(),
- pBitmap1->GetBPP(),
- pBitmap1->GetBPP(),
- pBitmap1->GetPitch(),
- pColorSpace,
- bitmapInfo,
- pBitmapProvider, NULL, true,
- kCGRenderingIntentDefault);
- CGContextClipToMask(_context, rect, pImage);
- CGContextSetRGBFillColor(_context,
- FXARGB_R(argb) / 255.f,
- FXARGB_G(argb) / 255.f,
- FXARGB_B(argb) / 255.f,
- FXARGB_A(argb) / 255.f);
- CGContextFillRect(_context, rect);
- CGImageRelease(pImage);
- CGColorSpaceRelease(pColorSpace);
- CGDataProviderRelease(pBitmapProvider);
- if (pBitmap1 != pBitmap) {
- delete pBitmap1;
- }
- RestoreState(FALSE);
- return TRUE;
- }
- if (pBitmap->GetBPP() < 32) {
- pBitmap1 = pBitmap->CloneConvert(FXDIB_Rgb32);
- } else {
- if (pBitmap->GetBuffer()) {
- pBitmap1 = (CFX_DIBitmap*)pBitmap;
- } else {
- pBitmap1 = pBitmap->Clone();
- }
- }
- if (NULL == pBitmap1) {
- RestoreState(FALSE);
- return FALSE;
- }
- if (pBitmap1->HasAlpha()) {
- if (pBitmap1 == pBitmap) {
- pBitmap1 = pBitmap->Clone();
- if (!pBitmap1) {
- RestoreState(FALSE);
- return FALSE;
- }
- }
- for (int row = 0; row < pBitmap1->GetHeight(); row ++) {
- FX_LPBYTE pScanline = (FX_LPBYTE)pBitmap1->GetScanline(row);
- for (int col = 0; col < pBitmap1->GetWidth(); col ++) {
- pScanline[0] = (FX_BYTE)(pScanline[0] * pScanline[3] / 255.f + .5f);
- pScanline[1] = (FX_BYTE)(pScanline[1] * pScanline[3] / 255.f + .5f);
- pScanline[2] = (FX_BYTE)(pScanline[2] * pScanline[3] / 255.f + .5f);
- pScanline += 4;
- }
- }
- }
- CGContextRef ctx = createContextWithBitmap(pBitmap1);
- CGImageRef image = CGBitmapContextCreateImage(ctx);
- CGContextDrawImage(_context, rect, image);
- CGImageRelease(image);
- CGContextRelease(ctx);
- if (pBitmap1 != pBitmap) {
- delete pBitmap1;
- }
- RestoreState(FALSE);
- return TRUE;
-}
-FX_BOOL CFX_QuartzDeviceDriver::CG_DrawGlypRun(int nChars,
- const FXTEXT_CHARPOS* pCharPos,
- CFX_Font* pFont,
- CFX_FontCache* pCache,
- const CFX_AffineMatrix* pGlyphMatrix,
- const CFX_AffineMatrix* pObject2Device,
- FX_FLOAT font_size,
- FX_DWORD argb,
- int alpha_flag,
- void* pIccTransform)
-{
- if (nChars == 0) {
- return TRUE;
- }
- CQuartz2D& quartz2d = ((CApplePlatform *) CFX_GEModule::Get()->GetPlatformData())->_quartz2d;
- if (!pFont->m_pPlatformFont) {
- if (pFont->GetPsName() == CFX_WideString::FromLocal("DFHeiStd-W5")) {
- return FALSE;
- }
- pFont->m_pPlatformFont = quartz2d.CreateFont(pFont->m_pFontData, pFont->m_dwSize);
- if (NULL == pFont->m_pPlatformFont) {
- return FALSE;
- }
- }
- CFX_FixedBufGrow<FX_WORD, 32> glyph_indices(nChars);
- CFX_FixedBufGrow<CGPoint, 32> glyph_positions(nChars);
- for (int i = 0; i < nChars; i++ ) {
- glyph_indices[i] = pCharPos[i].m_ExtGID;
- glyph_positions[i].x = pCharPos[i].m_OriginX;
- glyph_positions[i].y = pCharPos[i].m_OriginY;
- }
- CFX_AffineMatrix text_matrix;
- if (pObject2Device) {
- text_matrix.Concat(*pObject2Device);
- }
- CGAffineTransform matrix_cg = CGAffineTransformMake(text_matrix.a,
- text_matrix.b,
- text_matrix.c,
- text_matrix.d,
- text_matrix.e,
- text_matrix.f);
- matrix_cg = CGAffineTransformConcat(matrix_cg, _foxitDevice2User);
- CGContextSetTextMatrix(_context, matrix_cg);
- CGContextSetFont(_context, (CGFontRef)pFont->m_pPlatformFont);
- CGContextSetFontSize(_context, FXSYS_fabs(font_size));
- FX_INT32 a, r, g, b;
- ArgbDecode(argb, a, r, g, b);
- CGContextSetRGBFillColor(_context,
- r / 255.f,
- g / 255.f,
- b / 255.f,
- a / 255.f);
- SaveState();
- if (pGlyphMatrix) {
- CGAffineTransform ctm = CGContextGetCTM(_context);
- CGPoint origin = CGPointMake( glyph_positions[0].x, glyph_positions[0].y);
- origin = CGPointApplyAffineTransform(origin, matrix_cg);
- CGContextTranslateCTM(_context, origin.x, origin.y);
- CGAffineTransform glyph_matrix = CGAffineTransformMake(pGlyphMatrix->a,
- pGlyphMatrix->b,
- pGlyphMatrix->c,
- pGlyphMatrix->d,
- pGlyphMatrix->e,
- pGlyphMatrix->f);
- if (_foxitDevice2User.d < 0) {
- glyph_matrix = CGAffineTransformInvert(glyph_matrix);
- }
- CGContextConcatCTM(_context, glyph_matrix);
- CGContextTranslateCTM(_context, -origin.x, -origin.y);
- }
- CGContextShowGlyphsAtPositions(_context,
- (CGGlyph*)glyph_indices,
- glyph_positions,
- nChars);
- RestoreState(FALSE);
- return TRUE;
-}
-FX_BOOL CFX_QuartzDeviceDriver::DrawDeviceText(int nChars,
- const FXTEXT_CHARPOS* pCharPos,
- CFX_Font* pFont,
- CFX_FontCache* pCache,
- const CFX_AffineMatrix* pObject2Device,
- FX_FLOAT font_size,
- FX_DWORD color,
- int alpha_flag ,
- void* pIccTransform)
-{
- if (NULL == pFont || NULL == _context) {
- return FALSE;
- }
- FX_BOOL bBold = pFont->IsBold();
- if (!bBold && pFont->GetSubstFont() &&
- pFont->GetSubstFont()->m_Weight >= 500 &&
- pFont->GetSubstFont()->m_Weight <= 600) {
- return FALSE;
- }
- SaveState();
- CGContextSetTextDrawingMode(_context, kCGTextFillClip);
- FX_BOOL ret = FALSE;
- FX_INT32 i = 0;
- while (i < nChars) {
- if (pCharPos[i].m_bGlyphAdjust || font_size < 0) {
- if (i > 0) {
- ret = CG_DrawGlypRun(i, pCharPos, pFont, pCache, NULL, pObject2Device, font_size, color, alpha_flag, pIccTransform);
- if (!ret) {
- RestoreState(FALSE);
- return ret;
- }
- }
- const FXTEXT_CHARPOS* char_pos = pCharPos + i;
- CFX_AffineMatrix glphy_matrix;
- if (font_size < 0) {
- glphy_matrix.Concat(-1, 0, 0, -1, 0, 0);
- }
- if (char_pos->m_bGlyphAdjust) {
- glphy_matrix.Concat(char_pos->m_AdjustMatrix[0],
- char_pos->m_AdjustMatrix[1],
- char_pos->m_AdjustMatrix[2],
- char_pos->m_AdjustMatrix[3], 0, 0);
- }
- ret = CG_DrawGlypRun(1, char_pos, pFont, pCache, &glphy_matrix, pObject2Device, font_size, color, alpha_flag, pIccTransform);
- if (!ret) {
- RestoreState(FALSE);
- return ret;
- }
- i ++;
- pCharPos += i;
- nChars -= i;
- i = 0;
- } else {
- i ++;
- }
- }
- if (i > 0) {
- ret = CG_DrawGlypRun(i, pCharPos, pFont, pCache, NULL, pObject2Device, font_size, color, alpha_flag, pIccTransform);
- }
- RestoreState(FALSE);
- return ret;
-}
-void CFX_QuartzDeviceDriver::setStrokeInfo(const CFX_GraphStateData* graphState, FX_ARGB argb, FX_FLOAT lineWidth)
-{
- if (NULL == graphState) {
- return;
- }
- CGContextSetLineWidth(_context, lineWidth);
- CGLineCap cap;
- switch (graphState->m_LineCap) {
- case CFX_GraphStateData::LineCapRound: {
- cap = kCGLineCapRound;
- break;
- }
- case CFX_GraphStateData::LineCapSquare: {
- cap = kCGLineCapSquare;
- break;
- }
- case CFX_GraphStateData::LineCapButt:
- default: {
- cap = kCGLineCapButt;
- }
- }
- CGContextSetLineCap(_context, cap);
- CGLineJoin join;
- switch (graphState->m_LineJoin) {
- case CFX_GraphStateData::LineJoinRound: {
- join = kCGLineJoinRound;
- break;
- }
- case CFX_GraphStateData::LineJoinBevel: {
- join = kCGLineJoinBevel;
- break;
- }
- case CFX_GraphStateData::LineJoinMiter:
- default: {
- join = kCGLineJoinMiter;
- }
- }
- CGContextSetLineJoin(_context, join);
- if (graphState->m_DashCount) {
-#if CGFLOAT_IS_DOUBLE
- CGFloat* dashArray = new CGFloat[graphState->m_DashCount];
- if (!dashArray) {
- return;
- }
- for (int index = 0; index < graphState->m_DashCount; ++index) {
- dashArray[index] = graphState->m_DashArray[index];
- }
-#else
- CGFloat* dashArray = (CGFloat*)graphState->m_DashArray;
-#endif
- CGContextSetLineDash(_context, graphState->m_DashPhase, dashArray, graphState->m_DashCount);
-#if CGFLOAT_IS_DOUBLE
- delete[] dashArray;
-#endif
- }
- FX_INT32 a, r, g, b;
- ArgbDecode(argb, a, r, g, b);
- CGContextSetRGBStrokeColor(_context,
- r / 255.f,
- g / 255.f,
- b / 255.f,
- a / 255.f);
-}
-void CFX_QuartzDeviceDriver::setFillInfo(FX_ARGB argb)
-{
- FX_INT32 a, r, g, b;
- ArgbDecode(argb, a, r, g, b);
- CGContextSetRGBFillColor(_context,
- r / 255.f,
- g / 255.f,
- b / 255.f,
- a / 255.f);
-}
-void CFX_QuartzDeviceDriver::setPathToContext(const CFX_PathData* pathData)
-{
- FX_INT32 count = pathData->GetPointCount();
- FX_PATHPOINT* points = pathData->GetPoints();
- CGContextBeginPath(_context);
- for (FX_INT32 i = 0; i < count; i ++) {
- switch (points[i].m_Flag & FXPT_TYPE) {
- case FXPT_MOVETO:
- CGContextMoveToPoint(_context, points[i].m_PointX, points[i].m_PointY);
- break;
- case FXPT_LINETO:
- CGContextAddLineToPoint(_context, points[i].m_PointX, points[i].m_PointY);
- break;
- case FXPT_BEZIERTO: {
- CGContextAddCurveToPoint(_context,
- points[i].m_PointX, points[i].m_PointY,
- points[i + 1].m_PointX, points[i + 1].m_PointY,
- points[i + 2].m_PointX, points[i + 2].m_PointY);
- i += 2;
- }
- }
- if (points[i].m_Flag & FXPT_CLOSEFIGURE) {
- CGContextClosePath(_context);
- }
- }
-}
-void CFX_QuartzDeviceDriver::CG_SetImageTransform(int dest_left, int dest_top, int dest_width, int dest_height,
- CGRect* rect )
-{
- int flip_y = _foxitDevice2User.d * dest_height < 0 ? 1 : -1;
- int flip_x = _foxitDevice2User.a * dest_width > 0 ? 1 : -1;
- if (flip_y < 0 || flip_x < 0) {
- if (dest_height < 0) {
- dest_height = -dest_height;
- dest_top -= dest_height;
- }
- CGRect rt = CGRectApplyAffineTransform(CGRectMake(dest_left, dest_top, dest_width, dest_height), _foxitDevice2User);
- CGFloat offset_x = (rt.origin.x) + rt.size.width / 2.f,
- offset_y = (rt.origin.y) + rt.size.height / 2.f;
- CGAffineTransform transform = CGAffineTransformIdentity;
- transform = CGAffineTransformConcat(transform, CGAffineTransformMake(1, 0, 0, 1, -offset_x, -offset_y));
- transform = CGAffineTransformConcat(transform, CGAffineTransformMake(flip_x, 0, 0, flip_y, 0, 0));
- transform = CGAffineTransformConcat(transform, CGAffineTransformMake(1, 0, 0, 1, offset_x, offset_y));
- CGContextConcatCTM(_context, transform);
- if (rect) {
- *rect = CGRectApplyAffineTransform(*rect, transform);
- }
- }
-}
-void CFX_QuartzDeviceDriver::ClearDriver()
-{
- if (NULL == _context) {
- return;
- }
- for (int i = 0; i < m_saveCount; ++i) {
- CGContextRestoreGState(_context);
- }
- m_saveCount = 0;
- if (_context) {
- CGContextRelease(_context);
- }
-}
-CFX_QuartzDevice::CFX_QuartzDevice()
-{
- m_bOwnedBitmap = FALSE;
- m_pContext = NULL;
-}
-CFX_QuartzDevice::~CFX_QuartzDevice()
-{
- if (m_pContext) {
- CGContextRelease(m_pContext);
- }
- if (GetBitmap() && m_bOwnedBitmap) {
- delete GetBitmap();
- }
-}
-CGContextRef CFX_QuartzDevice::GetContext()
-{
- return m_pContext;
-}
-FX_BOOL CFX_QuartzDevice::Attach(CGContextRef context, FX_INT32 nDeviceClass)
-{
- if (m_pContext) {
- CGContextRelease(m_pContext);
- }
- m_pContext = context;
- CGContextRetain(m_pContext);
- IFX_RenderDeviceDriver* pDriver = FX_NEW CFX_QuartzDeviceDriver(m_pContext, nDeviceClass);
- if (!pDriver) {
- return FALSE;
- }
- SetDeviceDriver(pDriver);
- return TRUE;
-}
-FX_BOOL CFX_QuartzDevice::Attach(CFX_DIBitmap* pBitmap)
-{
- SetBitmap(pBitmap);
- m_pContext = createContextWithBitmap(pBitmap);
- if (NULL == m_pContext) {
- return FALSE;
- }
- IFX_RenderDeviceDriver* pDriver = FX_NEW CFX_QuartzDeviceDriver(m_pContext, FXDC_DISPLAY);
- if (!pDriver) {
- return FALSE;
- }
- SetDeviceDriver(pDriver);
- return TRUE;
-}
-FX_BOOL CFX_QuartzDevice::Create(FX_INT32 width, FX_INT32 height, FXDIB_Format format)
-{
- if ((FX_BYTE)format < 32) {
- return FALSE;
- }
- CFX_DIBitmap* pBitmap = FX_NEW CFX_DIBitmap;
- if (!pBitmap) {
- return FALSE;
- }
- if (!pBitmap->Create(width, height, format)) {
- delete pBitmap;
- return FALSE;
- }
- m_bOwnedBitmap = TRUE;
- return Attach(pBitmap);
-}
-#endif
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxcrt/fx_ext.h"
+#include "../../../include/fxge/fx_ge.h"
+#include "../agg/include/fxfx_agg_clip_liang_barsky.h"
+#include "../ge/text_int.h"
+#include "../dib/dib_int.h"
+#include "../agg/include/fx_agg_driver.h"
+#include "../../../include/fxge/fx_freetype.h"
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+#include "apple_int.h"
+#include "../../../include/fxge/fx_ge_apple.h"
+#ifndef CGFLOAT_IS_DOUBLE
+#error Expected CGFLOAT_IS_DOUBLE to be defined by CoreGraphics headers
+#endif
+void* CQuartz2D::createGraphics(CFX_DIBitmap* pBitmap)
+{
+ if (!pBitmap) {
+ return NULL;
+ }
+ CGBitmapInfo bmpInfo = kCGBitmapByteOrder32Little;
+ switch (pBitmap->GetFormat()) {
+ case FXDIB_Rgb32:
+ bmpInfo |= kCGImageAlphaNoneSkipFirst;
+ break;
+ case FXDIB_Argb:
+ default:
+ return NULL;
+ }
+ CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
+ CGContextRef context = CGBitmapContextCreate(pBitmap->GetBuffer(),
+ pBitmap->GetWidth(),
+ pBitmap->GetHeight(),
+ 8,
+ pBitmap->GetPitch(),
+ colorSpace,
+ bmpInfo);
+ CGColorSpaceRelease(colorSpace);
+ return context;
+}
+void CQuartz2D::destroyGraphics(void* graphics)
+{
+ if (graphics) {
+ CGContextRelease((CGContextRef) graphics);
+ }
+}
+void* CQuartz2D::CreateFont(FX_LPCBYTE pFontData, FX_DWORD dwFontSize)
+{
+ CGDataProviderRef pDataProvider = CGDataProviderCreateWithData(NULL, pFontData, (size_t)dwFontSize, NULL);
+ if (NULL == pDataProvider) {
+ return NULL;
+ }
+ CGFontRef pCGFont = CGFontCreateWithDataProvider(pDataProvider);
+ CGDataProviderRelease(pDataProvider);
+ return pCGFont;
+}
+void CQuartz2D::DestroyFont(void* pFont)
+{
+ CGFontRelease((CGFontRef)pFont);
+}
+void CQuartz2D::setGraphicsTextMatrix(void* graphics, CFX_AffineMatrix* matrix)
+{
+ if (!graphics || !matrix) {
+ return;
+ }
+ CGContextRef context = (CGContextRef) graphics;
+ CGFloat ty = CGBitmapContextGetHeight(context) - matrix->f;
+ CGContextSetTextMatrix(context, CGAffineTransformMake(matrix->a,
+ matrix->b,
+ matrix->c,
+ matrix->d,
+ matrix->e,
+ ty));
+}
+FX_BOOL CQuartz2D::drawGraphicsString(void* graphics,
+ void* font,
+ FX_FLOAT fontSize,
+ FX_WORD* glyphIndices,
+ CGPoint* glyphPositions,
+ FX_INT32 charsCount,
+ FX_ARGB argb,
+ CFX_AffineMatrix* matrix )
+{
+ if (!graphics) {
+ return FALSE;
+ }
+ CGContextRef context = (CGContextRef) graphics;
+ CGContextSetFont(context, (CGFontRef)font);
+ CGContextSetFontSize(context, fontSize);
+ if (matrix) {
+ CGAffineTransform m = CGContextGetTextMatrix(context);
+ m = CGAffineTransformConcat(m,
+ CGAffineTransformMake(matrix->a,
+ matrix->b,
+ matrix->c,
+ matrix->d,
+ matrix->e,
+ matrix->f));
+ CGContextSetTextMatrix(context, m);
+ }
+ FX_INT32 a, r, g, b;
+ ArgbDecode(argb, a, r, g, b);
+ CGContextSetRGBFillColor(context,
+ r / 255.f,
+ g / 255.f,
+ b / 255.f,
+ a / 255.f);
+ CGContextSaveGState(context);
+#if CGFLOAT_IS_DOUBLE
+ CGPoint* glyphPositionsCG = new CGPoint[charsCount];
+ if (!glyphPositionsCG) {
+ return FALSE;
+ }
+ for (int index = 0; index < charsCount; ++index) {
+ glyphPositionsCG[index].x = glyphPositions[index].x;
+ glyphPositionsCG[index].y = glyphPositions[index].y;
+ }
+#else
+ CGPoint* glyphPositionsCG = (CGPoint*)glyphPositions;
+#endif
+ CGContextShowGlyphsAtPositions(context,
+ (CGGlyph *) glyphIndices,
+ glyphPositionsCG,
+ charsCount);
+#if CGFLOAT_IS_DOUBLE
+ delete[] glyphPositionsCG;
+#endif
+ CGContextRestoreGState(context);
+ return TRUE;
+}
+void CQuartz2D::saveGraphicsState(void * graphics)
+{
+ if (graphics) {
+ CGContextSaveGState((CGContextRef) graphics);
+ }
+}
+void CQuartz2D::restoreGraphicsState(void * graphics)
+{
+ if (graphics) {
+ CGContextRestoreGState((CGContextRef) graphics);
+ }
+}
+static CGContextRef createContextWithBitmap(CFX_DIBitmap* pBitmap)
+{
+ if (!pBitmap || pBitmap->IsCmykImage() || pBitmap->GetBPP() < 32) {
+ return NULL;
+ }
+ CGBitmapInfo bitmapInfo = kCGBitmapByteOrder32Little;
+ if (pBitmap->HasAlpha()) {
+ bitmapInfo |= kCGImageAlphaPremultipliedFirst;
+ } else {
+ bitmapInfo |= kCGImageAlphaNoneSkipFirst;
+ }
+ CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
+ CGContextRef context = CGBitmapContextCreate(pBitmap->GetBuffer(),
+ pBitmap->GetWidth(),
+ pBitmap->GetHeight(),
+ 8,
+ pBitmap->GetPitch(),
+ colorSpace,
+ bitmapInfo);
+ CGColorSpaceRelease(colorSpace);
+ return context;
+}
+CFX_QuartzDeviceDriver::CFX_QuartzDeviceDriver(CGContextRef context, FX_INT32 deviceClass)
+{
+ m_saveCount = 0;
+ _context = context;
+ _deviceClass = deviceClass;
+ CGContextRetain(_context);
+ CGRect r = CGContextGetClipBoundingBox(context);
+ _width = FXSYS_round(r.size.width);
+ _height = FXSYS_round(r.size.height);
+ _renderCaps = FXRC_SOFT_CLIP | FXRC_BLEND_MODE |
+ FXRC_ALPHA_PATH | FXRC_ALPHA_IMAGE |
+ FXRC_BIT_MASK | FXRC_ALPHA_MASK;
+ if (_deviceClass != FXDC_DISPLAY) {
+ } else {
+ CGImageRef image = CGBitmapContextCreateImage(_context);
+ if (image) {
+ _renderCaps |= FXRC_GET_BITS;
+ _width = CGImageGetWidth(image);
+ _height = CGImageGetHeight(image);
+ CGImageAlphaInfo alphaInfo = CGImageGetAlphaInfo(image);
+ if (kCGImageAlphaPremultipliedFirst == alphaInfo ||
+ kCGImageAlphaPremultipliedLast == alphaInfo ||
+ kCGImageAlphaOnly == alphaInfo) {
+ _renderCaps |= FXRC_ALPHA_OUTPUT;
+ }
+ }
+ CGImageRelease(image);
+ }
+ CGAffineTransform ctm = CGContextGetCTM(_context);
+ CGContextSaveGState(_context);
+ m_saveCount++;
+ if (ctm.d >= 0) {
+ CGFloat offset_x, offset_y;
+ offset_x = ctm.tx;
+ offset_y = ctm.ty;
+ CGContextTranslateCTM(_context, -offset_x, -offset_y);
+ CGContextConcatCTM(_context, CGAffineTransformMake(1, 0, 0, -1, offset_x, _height + offset_y));
+ }
+ _foxitDevice2User = CGAffineTransformIdentity;
+ _user2FoxitDevice = CGAffineTransformInvert(_foxitDevice2User);
+}
+CFX_QuartzDeviceDriver::~CFX_QuartzDeviceDriver()
+{
+ CGContextRestoreGState(_context);
+ m_saveCount--;
+ for (int i = 0; i < m_saveCount; ++i) {
+ CGContextRestoreGState(_context);
+ }
+ if (_context) {
+ CGContextRelease(_context);
+ }
+}
+int CFX_QuartzDeviceDriver::GetDeviceCaps(int capsID)
+{
+ switch (capsID) {
+ case FXDC_DEVICE_CLASS: {
+ return _deviceClass;
+ }
+ case FXDC_PIXEL_WIDTH: {
+ return _width;
+ }
+ case FXDC_PIXEL_HEIGHT: {
+ return _height;
+ }
+ case FXDC_BITS_PIXEL: {
+ return 32;
+ }
+ case FXDC_RENDER_CAPS: {
+ return _renderCaps;
+ }
+ default: {
+ return 0;
+ }
+ }
+}
+CFX_Matrix CFX_QuartzDeviceDriver::GetCTM() const
+{
+ CGAffineTransform ctm = CGContextGetCTM(_context);
+ return CFX_Matrix(ctm.a, ctm.b, ctm.c, ctm.d, ctm.tx, ctm.ty);
+}
+void CFX_QuartzDeviceDriver::SaveState()
+{
+ CGContextSaveGState(_context);
+ m_saveCount++;
+}
+void CFX_QuartzDeviceDriver::RestoreState(FX_BOOL isKeepSaved )
+{
+ CGContextRestoreGState(_context);
+ if (isKeepSaved) {
+ CGContextSaveGState(_context);
+ } else {
+ m_saveCount--;
+ }
+}
+FX_BOOL CFX_QuartzDeviceDriver::SetClip_PathFill(const CFX_PathData* pathData,
+ const CFX_AffineMatrix* matrix,
+ int fillMode )
+{
+ SaveState();
+ CGAffineTransform m = CGAffineTransformIdentity;
+ if (matrix) {
+ m = CGAffineTransformMake(matrix->GetA(), matrix->GetB(), matrix->GetC(), matrix->GetD(), matrix->GetE(), matrix->GetF());
+ }
+ m = CGAffineTransformConcat(m, _foxitDevice2User);
+ CGContextConcatCTM(_context, m);
+ setPathToContext(pathData);
+ RestoreState(FALSE);
+ if ((fillMode & 3) == FXFILL_WINDING) {
+ CGContextClip(_context);
+ } else {
+ CGContextEOClip(_context);
+ }
+ return TRUE;
+}
+FX_FLOAT CFX_QuartzDeviceDriver::getLineWidth(const CFX_GraphStateData * graphState, CGAffineTransform ctm)
+{
+ FX_FLOAT lineWidth = graphState->m_LineWidth;
+ if (graphState->m_LineWidth <= 0.f) {
+ CGSize size;
+ size.width = 1;
+ size.height = 1;
+ CGSize temp = CGSizeApplyAffineTransform(size, ctm);
+ CGFloat x = 1 / temp.width;
+ CGFloat y = 1 / temp.height;
+ lineWidth = x > y ? x : y;
+ }
+ return lineWidth;
+}
+FX_BOOL CFX_QuartzDeviceDriver::SetClip_PathStroke(const CFX_PathData* pathData,
+ const CFX_AffineMatrix* matrix,
+ const CFX_GraphStateData* graphState )
+{
+ SaveState();
+ CGAffineTransform m = CGAffineTransformIdentity;
+ if (matrix) {
+ m = CGAffineTransformMake(matrix->GetA(), matrix->GetB(), matrix->GetC(), matrix->GetD(), matrix->GetE(), matrix->GetF());
+ }
+ m = CGAffineTransformConcat(m, _foxitDevice2User);
+ CGContextConcatCTM(_context, m);
+ FX_FLOAT lineWidth = getLineWidth(graphState, m);
+ setStrokeInfo(graphState, 0xFF000000, lineWidth);
+ setPathToContext(pathData);
+ CGContextReplacePathWithStrokedPath(_context);
+ RestoreState(FALSE);
+ CGContextClip(_context);
+ return TRUE;
+}
+static CGBlendMode GetCGBlendMode(int blend_type)
+{
+ CGBlendMode mode = kCGBlendModeNormal;
+ switch (blend_type) {
+ case FXDIB_BLEND_NORMAL:
+ mode = kCGBlendModeNormal;
+ break;
+ case FXDIB_BLEND_MULTIPLY:
+ mode = kCGBlendModeMultiply;
+ break;
+ case FXDIB_BLEND_SCREEN:
+ mode = kCGBlendModeScreen;
+ break;
+ case FXDIB_BLEND_OVERLAY:
+ mode = kCGBlendModeOverlay;
+ break;
+ case FXDIB_BLEND_DARKEN:
+ mode = kCGBlendModeDarken;
+ break;
+ case FXDIB_BLEND_LIGHTEN:
+ mode = kCGBlendModeLighten;
+ break;
+ case FXDIB_BLEND_COLORDODGE:
+ mode = kCGBlendModeColorDodge;
+ break;
+ case FXDIB_BLEND_COLORBURN:
+ mode = kCGBlendModeColorBurn;
+ break;
+ case FXDIB_BLEND_HARDLIGHT:
+ mode = kCGBlendModeHardLight;
+ break;
+ case FXDIB_BLEND_SOFTLIGHT:
+ mode = kCGBlendModeSoftLight;
+ break;
+ case FXDIB_BLEND_DIFFERENCE:
+ mode = kCGBlendModeDifference;
+ break;
+ case FXDIB_BLEND_EXCLUSION:
+ mode = kCGBlendModeExclusion;
+ break;
+ case FXDIB_BLEND_HUE:
+ mode = kCGBlendModeHue;
+ break;
+ case FXDIB_BLEND_SATURATION:
+ mode = kCGBlendModeSaturation;
+ break;
+ case FXDIB_BLEND_COLOR:
+ mode = kCGBlendModeColor;
+ break;
+ case FXDIB_BLEND_LUMINOSITY:
+ mode = kCGBlendModeLuminosity;
+ break;
+ default:
+ mode = kCGBlendModeNormal;
+ break;
+ }
+ return mode;
+}
+FX_BOOL CFX_QuartzDeviceDriver::DrawPath(const CFX_PathData* pathData,
+ const CFX_AffineMatrix* matrix,
+ const CFX_GraphStateData* graphState,
+ FX_DWORD fillArgb,
+ FX_DWORD strokeArgb,
+ int fillMode,
+ int alpha_flag,
+ void* pIccTransform,
+ int blend_type
+ )
+{
+ SaveState();
+ CGBlendMode mode = GetCGBlendMode(blend_type);
+ if (mode != kCGBlendModeNormal) {
+ CGContextSetBlendMode(_context, mode);
+ }
+ CGAffineTransform m = CGAffineTransformIdentity;
+ if (matrix) {
+ m = CGAffineTransformMake(matrix->GetA(), matrix->GetB(), matrix->GetC(), matrix->GetD(), matrix->GetE(), matrix->GetF());
+ }
+ m = CGAffineTransformConcat(m, _foxitDevice2User);
+ CGContextConcatCTM(_context, m);
+ int pathMode = 0;
+ if (graphState && strokeArgb) {
+ CGContextSetMiterLimit(_context, graphState->m_MiterLimit);
+ FX_FLOAT lineWidth = getLineWidth(graphState, m);
+ setStrokeInfo(graphState, strokeArgb, lineWidth);
+ pathMode |= 4;
+ }
+ if (fillMode && fillArgb) {
+ setFillInfo(fillArgb);
+ if ((fillMode & 3) == FXFILL_WINDING) {
+ pathMode |= 1;
+ } else if ((fillMode & 3) == FXFILL_ALTERNATE) {
+ pathMode |= 2;
+ }
+ }
+ setPathToContext(pathData);
+ if (fillMode & FXFILL_FULLCOVER) {
+ CGContextSetShouldAntialias(_context, false);
+ }
+ if (pathMode == 4) {
+ CGContextStrokePath(_context);
+ } else if (pathMode == 1) {
+ CGContextFillPath(_context);
+ } else if (pathMode == 2) {
+ CGContextEOFillPath(_context);
+ } else if (pathMode == 5) {
+ CGContextDrawPath(_context, kCGPathFillStroke);
+ } else if (pathMode == 6) {
+ CGContextDrawPath(_context, kCGPathEOFillStroke);
+ }
+ RestoreState(FALSE);
+ return TRUE;
+}
+FX_BOOL CFX_QuartzDeviceDriver::FillRect(const FX_RECT* rect,
+ FX_ARGB fillArgb,
+ int alphaFlag ,
+ void* iccTransform ,
+ int blend_type )
+{
+ CGBlendMode mode = GetCGBlendMode(blend_type);
+ if (mode != kCGBlendModeNormal) {
+ CGContextSetBlendMode(_context, mode);
+ }
+ CGRect rect_fx = CGRectMake(rect->left, rect->top, rect->Width(), rect->Height());
+ CGRect rect_usr = CGRectApplyAffineTransform(rect_fx, _foxitDevice2User);
+ FX_INT32 a, r, g, b;
+ ArgbDecode(fillArgb, a, r, g, b);
+ CGContextSetRGBFillColor(_context,
+ r / 255.f,
+ g / 255.f,
+ b / 255.f,
+ a / 255.f);
+ CGContextFillRect(_context, rect_usr);
+ if (mode != kCGBlendModeNormal) {
+ CGContextSetBlendMode(_context, kCGBlendModeNormal);
+ }
+ return TRUE;
+}
+FX_BOOL CFX_QuartzDeviceDriver::DrawCosmeticLine(FX_FLOAT x1,
+ FX_FLOAT y1,
+ FX_FLOAT x2,
+ FX_FLOAT y2,
+ FX_DWORD argb,
+ int alphaFlag ,
+ void* iccTransform ,
+ int blend_type )
+{
+ CGBlendMode mode = GetCGBlendMode(blend_type);
+ if (mode != kCGBlendModeNormal) {
+ CGContextSetBlendMode(_context, mode);
+ }
+ CGPoint pt = CGPointApplyAffineTransform(CGPointMake(x1, y1), _foxitDevice2User);
+ x1 = pt.x;
+ y1 = pt.y;
+ pt = CGPointApplyAffineTransform(CGPointMake(x2, y2), _foxitDevice2User);
+ x2 = pt.x;
+ y2 = pt.y;
+ FX_INT32 a, r, g, b;
+ ArgbDecode(argb, a, r, g, b);
+ CGContextSetRGBStrokeColor(_context,
+ r / 255.f,
+ g / 255.f,
+ b / 255.f,
+ a / 255.f);
+ CGContextMoveToPoint(_context, x1, y1);
+ CGContextAddLineToPoint(_context, x2, y2);
+ CGContextStrokePath(_context);
+ if (mode != kCGBlendModeNormal) {
+ CGContextSetBlendMode(_context, kCGBlendModeNormal);
+ }
+ return TRUE;
+}
+FX_BOOL CFX_QuartzDeviceDriver::GetClipBox(FX_RECT* rect)
+{
+ CGRect r = CGContextGetClipBoundingBox(_context);
+ r = CGRectApplyAffineTransform(r, _user2FoxitDevice);
+ rect->left = FXSYS_floor(r.origin.x);
+ rect->top = FXSYS_floor(r.origin.y);
+ rect->right = FXSYS_ceil(r.origin.x + r.size.width);
+ rect->bottom = FXSYS_ceil(r.origin.y + r.size.height);
+ return TRUE;
+}
+FX_BOOL CFX_QuartzDeviceDriver::GetDIBits(CFX_DIBitmap* bitmap,
+ FX_INT32 left,
+ FX_INT32 top,
+ void* pIccTransform,
+ FX_BOOL bDEdge)
+{
+ if (FXDC_PRINTER == _deviceClass) {
+ return FALSE;
+ }
+ if (bitmap->GetBPP() < 32) {
+ return FALSE;
+ }
+ if (!(_renderCaps | FXRC_GET_BITS)) {
+ return FALSE;
+ }
+ CGPoint pt = CGPointMake(left, top);
+ pt = CGPointApplyAffineTransform(pt, _foxitDevice2User);
+ CGAffineTransform ctm = CGContextGetCTM(_context);
+ pt.x *= FXSYS_fabs(ctm.a);
+ pt.y *= FXSYS_fabs(ctm.d);
+ CGImageRef image = CGBitmapContextCreateImage(_context);
+ if (NULL == image) {
+ return FALSE;
+ }
+ CGFloat width = (CGFloat) bitmap->GetWidth();
+ CGFloat height = (CGFloat) bitmap->GetHeight();
+ if (width + pt.x > _width) {
+ width -= (width + pt.x - _width);
+ }
+ if (height + pt.y > _height) {
+ height -= (height + pt.y - _height);
+ }
+ CGImageRef subImage = CGImageCreateWithImageInRect(image,
+ CGRectMake(pt.x,
+ pt.y,
+ width,
+ height));
+ CGContextRef context = createContextWithBitmap(bitmap);
+ CGRect rect = CGContextGetClipBoundingBox(context);
+ CGContextClearRect(context, rect);
+ CGContextDrawImage(context, rect, subImage);
+ CGContextRelease(context);
+ CGImageRelease(subImage);
+ CGImageRelease(image);
+ if (bitmap->HasAlpha()) {
+ for (int row = 0; row < bitmap->GetHeight(); row ++) {
+ FX_LPBYTE pScanline = (FX_LPBYTE)bitmap->GetScanline(row);
+ for (int col = 0; col < bitmap->GetWidth(); col ++) {
+ if (pScanline[3] > 0) {
+ pScanline[0] = (pScanline[0] * 255.f / pScanline[3] + .5f);
+ pScanline[1] = (pScanline[1] * 255.f / pScanline[3] + .5f);
+ pScanline[2] = (pScanline[2] * 255.f / pScanline[3] + .5f);
+ }
+ pScanline += 4;
+ }
+ }
+ }
+ return TRUE;
+}
+FX_BOOL CFX_QuartzDeviceDriver::SetDIBits(const CFX_DIBSource* pBitmap,
+ FX_ARGB argb,
+ const FX_RECT* srcRect,
+ int dest_left,
+ int dest_top,
+ int blendType,
+ int alphaFlag ,
+ void* iccTransform )
+{
+ SaveState();
+ CGFloat src_left, src_top, src_width, src_height;
+ if (srcRect) {
+ src_left = srcRect->left;
+ src_top = srcRect->top;
+ src_width = srcRect->Width();
+ src_height = srcRect->Height();
+ } else {
+ src_left = src_top = 0;
+ src_width = pBitmap->GetWidth();
+ src_height = pBitmap->GetHeight();
+ }
+ CGAffineTransform ctm = CGContextGetCTM(_context);
+ CGFloat scale_x = FXSYS_fabs(ctm.a);
+ CGFloat scale_y = FXSYS_fabs(ctm.d);
+ src_left /= scale_x;
+ src_top /= scale_y;
+ src_width /= scale_x;
+ src_height /= scale_y;
+ CGRect rect_fx = CGRectMake(dest_left, dest_top, src_width, src_height);
+ CGRect rect_usr = CGRectApplyAffineTransform(rect_fx, _foxitDevice2User);
+ CGContextBeginPath(_context);
+ CGContextAddRect(_context, rect_usr);
+ CGContextClip(_context);
+ rect_usr.size = CGSizeMake(pBitmap->GetWidth() / scale_x, pBitmap->GetHeight() / scale_y);
+ rect_usr = CGRectOffset(rect_usr, -src_left, -src_top);
+ CG_SetImageTransform(dest_left, dest_top, src_width, src_height, &rect_usr);
+ CFX_DIBitmap* pBitmap1 = NULL;
+ if (pBitmap->IsAlphaMask()) {
+ if (pBitmap->GetBuffer()) {
+ pBitmap1 = (CFX_DIBitmap*)pBitmap;
+ } else {
+ pBitmap1 = pBitmap->Clone();
+ }
+ if (NULL == pBitmap1) {
+ RestoreState(FALSE);
+ return FALSE;
+ }
+ CGDataProviderRef pBitmapProvider = CGDataProviderCreateWithData(NULL,
+ pBitmap1->GetBuffer(),
+ pBitmap1->GetPitch() * pBitmap1->GetHeight(),
+ NULL);
+ CGColorSpaceRef pColorSpace = CGColorSpaceCreateDeviceGray();
+ CGBitmapInfo bitmapInfo = kCGImageAlphaNone | kCGBitmapByteOrderDefault;
+ CGImageRef pImage = CGImageCreate(pBitmap1->GetWidth(),
+ pBitmap1->GetHeight(),
+ pBitmap1->GetBPP(),
+ pBitmap1->GetBPP(),
+ pBitmap1->GetPitch(),
+ pColorSpace,
+ bitmapInfo,
+ pBitmapProvider, NULL, true,
+ kCGRenderingIntentDefault);
+ CGContextClipToMask(_context, rect_usr, pImage);
+ CGContextSetRGBFillColor(_context,
+ FXARGB_R(argb) / 255.f,
+ FXARGB_G(argb) / 255.f,
+ FXARGB_B(argb) / 255.f,
+ FXARGB_A(argb) / 255.f);
+ CGContextFillRect(_context, rect_usr);
+ CGImageRelease(pImage);
+ CGColorSpaceRelease(pColorSpace);
+ CGDataProviderRelease(pBitmapProvider);
+ if (pBitmap1 != pBitmap) {
+ delete pBitmap1;
+ }
+ RestoreState(FALSE);
+ return TRUE;
+ }
+ if (pBitmap->GetBPP() < 32) {
+ pBitmap1 = pBitmap->CloneConvert(FXDIB_Rgb32);
+ } else {
+ if (pBitmap->GetBuffer()) {
+ pBitmap1 = (CFX_DIBitmap*)pBitmap;
+ } else {
+ pBitmap1 = pBitmap->Clone();
+ }
+ }
+ if (NULL == pBitmap1) {
+ RestoreState(FALSE);
+ return FALSE;
+ }
+ if (pBitmap1->HasAlpha()) {
+ if (pBitmap1 == pBitmap) {
+ pBitmap1 = pBitmap->Clone();
+ if (!pBitmap1) {
+ RestoreState(FALSE);
+ return FALSE;
+ }
+ }
+ for (int row = 0; row < pBitmap1->GetHeight(); row ++) {
+ FX_LPBYTE pScanline = (FX_LPBYTE)pBitmap1->GetScanline(row);
+ for (int col = 0; col < pBitmap1->GetWidth(); col ++) {
+ pScanline[0] = (FX_BYTE)(pScanline[0] * pScanline[3] / 255.f + .5f);
+ pScanline[1] = (FX_BYTE)(pScanline[1] * pScanline[3] / 255.f + .5f);
+ pScanline[2] = (FX_BYTE)(pScanline[2] * pScanline[3] / 255.f + .5f);
+ pScanline += 4;
+ }
+ }
+ }
+ CGContextRef ctx = createContextWithBitmap(pBitmap1);
+ CGImageRef image = CGBitmapContextCreateImage(ctx);
+ int blend_mode = blendType;
+ if (FXDIB_BLEND_HARDLIGHT == blendType) {
+ blend_mode = kCGBlendModeSoftLight;
+ } else if (FXDIB_BLEND_SOFTLIGHT == blendType) {
+ blend_mode = kCGBlendModeHardLight;
+ } else if (blendType >= FXDIB_BLEND_NONSEPARABLE && blendType <= FXDIB_BLEND_LUMINOSITY) {
+ blend_mode = blendType - 9;
+ } else if (blendType > FXDIB_BLEND_LUMINOSITY || blendType < 0) {
+ blend_mode = kCGBlendModeNormal;
+ }
+ CGContextSetBlendMode(_context, (CGBlendMode)blend_mode);
+ CGContextDrawImage(_context, rect_usr, image);
+ CGImageRelease(image);
+ CGContextRelease(ctx);
+ if (pBitmap1 != pBitmap) {
+ delete pBitmap1;
+ }
+ RestoreState(FALSE);
+ return TRUE;
+}
+FX_BOOL CFX_QuartzDeviceDriver::StretchDIBits(const CFX_DIBSource* pBitmap,
+ FX_ARGB argb,
+ int dest_left,
+ int dest_top,
+ int dest_width,
+ int dest_height,
+ const FX_RECT* clipRect,
+ FX_DWORD flags,
+ int alphaFlag ,
+ void* iccTransform ,
+ int blend_type)
+{
+ SaveState();
+ if (clipRect) {
+ CGContextBeginPath(_context);
+ CGRect rect_clip = CGRectMake(clipRect->left, clipRect->top, clipRect->Width(), clipRect->Height());
+ rect_clip = CGRectApplyAffineTransform(rect_clip, _foxitDevice2User);
+ CGContextAddRect(_context, rect_clip);
+ CGContextClip(_context);
+ }
+ CGRect rect = CGRectMake(dest_left, dest_top, dest_width, dest_height);
+ rect = CGRectApplyAffineTransform(rect, _foxitDevice2User);
+ if (FXDIB_BICUBIC_INTERPOL == flags) {
+ CGContextSetInterpolationQuality(_context, kCGInterpolationHigh);
+ } else if (FXDIB_DOWNSAMPLE == flags) {
+ CGContextSetInterpolationQuality(_context, kCGInterpolationNone);
+ } else {
+ CGContextSetInterpolationQuality(_context, kCGInterpolationMedium);
+ }
+ CG_SetImageTransform(dest_left, dest_top, dest_width, dest_height);
+ CFX_DIBitmap* pBitmap1 = NULL;
+ if (pBitmap->IsAlphaMask()) {
+ if (pBitmap->GetBuffer()) {
+ pBitmap1 = (CFX_DIBitmap*)pBitmap;
+ } else {
+ pBitmap1 = pBitmap->Clone();
+ }
+ if (NULL == pBitmap1) {
+ RestoreState(FALSE);
+ return FALSE;
+ }
+ CGDataProviderRef pBitmapProvider = CGDataProviderCreateWithData(NULL,
+ pBitmap1->GetBuffer(),
+ pBitmap1->GetPitch() * pBitmap1->GetHeight(),
+ NULL);
+ CGColorSpaceRef pColorSpace = CGColorSpaceCreateDeviceGray();
+ CGBitmapInfo bitmapInfo = kCGImageAlphaNone | kCGBitmapByteOrderDefault;
+ CGImageRef pImage = CGImageCreate(pBitmap1->GetWidth(),
+ pBitmap1->GetHeight(),
+ pBitmap1->GetBPP(),
+ pBitmap1->GetBPP(),
+ pBitmap1->GetPitch(),
+ pColorSpace,
+ bitmapInfo,
+ pBitmapProvider, NULL, true,
+ kCGRenderingIntentDefault);
+ CGContextClipToMask(_context, rect, pImage);
+ CGContextSetRGBFillColor(_context,
+ FXARGB_R(argb) / 255.f,
+ FXARGB_G(argb) / 255.f,
+ FXARGB_B(argb) / 255.f,
+ FXARGB_A(argb) / 255.f);
+ CGContextFillRect(_context, rect);
+ CGImageRelease(pImage);
+ CGColorSpaceRelease(pColorSpace);
+ CGDataProviderRelease(pBitmapProvider);
+ if (pBitmap1 != pBitmap) {
+ delete pBitmap1;
+ }
+ RestoreState(FALSE);
+ return TRUE;
+ }
+ if (pBitmap->GetBPP() < 32) {
+ pBitmap1 = pBitmap->CloneConvert(FXDIB_Rgb32);
+ } else {
+ if (pBitmap->GetBuffer()) {
+ pBitmap1 = (CFX_DIBitmap*)pBitmap;
+ } else {
+ pBitmap1 = pBitmap->Clone();
+ }
+ }
+ if (NULL == pBitmap1) {
+ RestoreState(FALSE);
+ return FALSE;
+ }
+ if (pBitmap1->HasAlpha()) {
+ if (pBitmap1 == pBitmap) {
+ pBitmap1 = pBitmap->Clone();
+ if (!pBitmap1) {
+ RestoreState(FALSE);
+ return FALSE;
+ }
+ }
+ for (int row = 0; row < pBitmap1->GetHeight(); row ++) {
+ FX_LPBYTE pScanline = (FX_LPBYTE)pBitmap1->GetScanline(row);
+ for (int col = 0; col < pBitmap1->GetWidth(); col ++) {
+ pScanline[0] = (FX_BYTE)(pScanline[0] * pScanline[3] / 255.f + .5f);
+ pScanline[1] = (FX_BYTE)(pScanline[1] * pScanline[3] / 255.f + .5f);
+ pScanline[2] = (FX_BYTE)(pScanline[2] * pScanline[3] / 255.f + .5f);
+ pScanline += 4;
+ }
+ }
+ }
+ CGContextRef ctx = createContextWithBitmap(pBitmap1);
+ CGImageRef image = CGBitmapContextCreateImage(ctx);
+ CGContextDrawImage(_context, rect, image);
+ CGImageRelease(image);
+ CGContextRelease(ctx);
+ if (pBitmap1 != pBitmap) {
+ delete pBitmap1;
+ }
+ RestoreState(FALSE);
+ return TRUE;
+}
+FX_BOOL CFX_QuartzDeviceDriver::CG_DrawGlypRun(int nChars,
+ const FXTEXT_CHARPOS* pCharPos,
+ CFX_Font* pFont,
+ CFX_FontCache* pCache,
+ const CFX_AffineMatrix* pGlyphMatrix,
+ const CFX_AffineMatrix* pObject2Device,
+ FX_FLOAT font_size,
+ FX_DWORD argb,
+ int alpha_flag,
+ void* pIccTransform)
+{
+ if (nChars == 0) {
+ return TRUE;
+ }
+ CQuartz2D& quartz2d = ((CApplePlatform *) CFX_GEModule::Get()->GetPlatformData())->_quartz2d;
+ if (!pFont->m_pPlatformFont) {
+ if (pFont->GetPsName() == CFX_WideString::FromLocal("DFHeiStd-W5")) {
+ return FALSE;
+ }
+ pFont->m_pPlatformFont = quartz2d.CreateFont(pFont->m_pFontData, pFont->m_dwSize);
+ if (NULL == pFont->m_pPlatformFont) {
+ return FALSE;
+ }
+ }
+ CFX_FixedBufGrow<FX_WORD, 32> glyph_indices(nChars);
+ CFX_FixedBufGrow<CGPoint, 32> glyph_positions(nChars);
+ for (int i = 0; i < nChars; i++ ) {
+ glyph_indices[i] = pCharPos[i].m_ExtGID;
+ glyph_positions[i].x = pCharPos[i].m_OriginX;
+ glyph_positions[i].y = pCharPos[i].m_OriginY;
+ }
+ CFX_AffineMatrix text_matrix;
+ if (pObject2Device) {
+ text_matrix.Concat(*pObject2Device);
+ }
+ CGAffineTransform matrix_cg = CGAffineTransformMake(text_matrix.a,
+ text_matrix.b,
+ text_matrix.c,
+ text_matrix.d,
+ text_matrix.e,
+ text_matrix.f);
+ matrix_cg = CGAffineTransformConcat(matrix_cg, _foxitDevice2User);
+ CGContextSetTextMatrix(_context, matrix_cg);
+ CGContextSetFont(_context, (CGFontRef)pFont->m_pPlatformFont);
+ CGContextSetFontSize(_context, FXSYS_fabs(font_size));
+ FX_INT32 a, r, g, b;
+ ArgbDecode(argb, a, r, g, b);
+ CGContextSetRGBFillColor(_context,
+ r / 255.f,
+ g / 255.f,
+ b / 255.f,
+ a / 255.f);
+ SaveState();
+ if (pGlyphMatrix) {
+ CGAffineTransform ctm = CGContextGetCTM(_context);
+ CGPoint origin = CGPointMake( glyph_positions[0].x, glyph_positions[0].y);
+ origin = CGPointApplyAffineTransform(origin, matrix_cg);
+ CGContextTranslateCTM(_context, origin.x, origin.y);
+ CGAffineTransform glyph_matrix = CGAffineTransformMake(pGlyphMatrix->a,
+ pGlyphMatrix->b,
+ pGlyphMatrix->c,
+ pGlyphMatrix->d,
+ pGlyphMatrix->e,
+ pGlyphMatrix->f);
+ if (_foxitDevice2User.d < 0) {
+ glyph_matrix = CGAffineTransformInvert(glyph_matrix);
+ }
+ CGContextConcatCTM(_context, glyph_matrix);
+ CGContextTranslateCTM(_context, -origin.x, -origin.y);
+ }
+ CGContextShowGlyphsAtPositions(_context,
+ (CGGlyph*)glyph_indices,
+ glyph_positions,
+ nChars);
+ RestoreState(FALSE);
+ return TRUE;
+}
+FX_BOOL CFX_QuartzDeviceDriver::DrawDeviceText(int nChars,
+ const FXTEXT_CHARPOS* pCharPos,
+ CFX_Font* pFont,
+ CFX_FontCache* pCache,
+ const CFX_AffineMatrix* pObject2Device,
+ FX_FLOAT font_size,
+ FX_DWORD color,
+ int alpha_flag ,
+ void* pIccTransform)
+{
+ if (NULL == pFont || NULL == _context) {
+ return FALSE;
+ }
+ FX_BOOL bBold = pFont->IsBold();
+ if (!bBold && pFont->GetSubstFont() &&
+ pFont->GetSubstFont()->m_Weight >= 500 &&
+ pFont->GetSubstFont()->m_Weight <= 600) {
+ return FALSE;
+ }
+ SaveState();
+ CGContextSetTextDrawingMode(_context, kCGTextFillClip);
+ FX_BOOL ret = FALSE;
+ FX_INT32 i = 0;
+ while (i < nChars) {
+ if (pCharPos[i].m_bGlyphAdjust || font_size < 0) {
+ if (i > 0) {
+ ret = CG_DrawGlypRun(i, pCharPos, pFont, pCache, NULL, pObject2Device, font_size, color, alpha_flag, pIccTransform);
+ if (!ret) {
+ RestoreState(FALSE);
+ return ret;
+ }
+ }
+ const FXTEXT_CHARPOS* char_pos = pCharPos + i;
+ CFX_AffineMatrix glphy_matrix;
+ if (font_size < 0) {
+ glphy_matrix.Concat(-1, 0, 0, -1, 0, 0);
+ }
+ if (char_pos->m_bGlyphAdjust) {
+ glphy_matrix.Concat(char_pos->m_AdjustMatrix[0],
+ char_pos->m_AdjustMatrix[1],
+ char_pos->m_AdjustMatrix[2],
+ char_pos->m_AdjustMatrix[3], 0, 0);
+ }
+ ret = CG_DrawGlypRun(1, char_pos, pFont, pCache, &glphy_matrix, pObject2Device, font_size, color, alpha_flag, pIccTransform);
+ if (!ret) {
+ RestoreState(FALSE);
+ return ret;
+ }
+ i ++;
+ pCharPos += i;
+ nChars -= i;
+ i = 0;
+ } else {
+ i ++;
+ }
+ }
+ if (i > 0) {
+ ret = CG_DrawGlypRun(i, pCharPos, pFont, pCache, NULL, pObject2Device, font_size, color, alpha_flag, pIccTransform);
+ }
+ RestoreState(FALSE);
+ return ret;
+}
+void CFX_QuartzDeviceDriver::setStrokeInfo(const CFX_GraphStateData* graphState, FX_ARGB argb, FX_FLOAT lineWidth)
+{
+ if (NULL == graphState) {
+ return;
+ }
+ CGContextSetLineWidth(_context, lineWidth);
+ CGLineCap cap;
+ switch (graphState->m_LineCap) {
+ case CFX_GraphStateData::LineCapRound: {
+ cap = kCGLineCapRound;
+ break;
+ }
+ case CFX_GraphStateData::LineCapSquare: {
+ cap = kCGLineCapSquare;
+ break;
+ }
+ case CFX_GraphStateData::LineCapButt:
+ default: {
+ cap = kCGLineCapButt;
+ }
+ }
+ CGContextSetLineCap(_context, cap);
+ CGLineJoin join;
+ switch (graphState->m_LineJoin) {
+ case CFX_GraphStateData::LineJoinRound: {
+ join = kCGLineJoinRound;
+ break;
+ }
+ case CFX_GraphStateData::LineJoinBevel: {
+ join = kCGLineJoinBevel;
+ break;
+ }
+ case CFX_GraphStateData::LineJoinMiter:
+ default: {
+ join = kCGLineJoinMiter;
+ }
+ }
+ CGContextSetLineJoin(_context, join);
+ if (graphState->m_DashCount) {
+#if CGFLOAT_IS_DOUBLE
+ CGFloat* dashArray = new CGFloat[graphState->m_DashCount];
+ if (!dashArray) {
+ return;
+ }
+ for (int index = 0; index < graphState->m_DashCount; ++index) {
+ dashArray[index] = graphState->m_DashArray[index];
+ }
+#else
+ CGFloat* dashArray = (CGFloat*)graphState->m_DashArray;
+#endif
+ CGContextSetLineDash(_context, graphState->m_DashPhase, dashArray, graphState->m_DashCount);
+#if CGFLOAT_IS_DOUBLE
+ delete[] dashArray;
+#endif
+ }
+ FX_INT32 a, r, g, b;
+ ArgbDecode(argb, a, r, g, b);
+ CGContextSetRGBStrokeColor(_context,
+ r / 255.f,
+ g / 255.f,
+ b / 255.f,
+ a / 255.f);
+}
+void CFX_QuartzDeviceDriver::setFillInfo(FX_ARGB argb)
+{
+ FX_INT32 a, r, g, b;
+ ArgbDecode(argb, a, r, g, b);
+ CGContextSetRGBFillColor(_context,
+ r / 255.f,
+ g / 255.f,
+ b / 255.f,
+ a / 255.f);
+}
+void CFX_QuartzDeviceDriver::setPathToContext(const CFX_PathData* pathData)
+{
+ FX_INT32 count = pathData->GetPointCount();
+ FX_PATHPOINT* points = pathData->GetPoints();
+ CGContextBeginPath(_context);
+ for (FX_INT32 i = 0; i < count; i ++) {
+ switch (points[i].m_Flag & FXPT_TYPE) {
+ case FXPT_MOVETO:
+ CGContextMoveToPoint(_context, points[i].m_PointX, points[i].m_PointY);
+ break;
+ case FXPT_LINETO:
+ CGContextAddLineToPoint(_context, points[i].m_PointX, points[i].m_PointY);
+ break;
+ case FXPT_BEZIERTO: {
+ CGContextAddCurveToPoint(_context,
+ points[i].m_PointX, points[i].m_PointY,
+ points[i + 1].m_PointX, points[i + 1].m_PointY,
+ points[i + 2].m_PointX, points[i + 2].m_PointY);
+ i += 2;
+ }
+ }
+ if (points[i].m_Flag & FXPT_CLOSEFIGURE) {
+ CGContextClosePath(_context);
+ }
+ }
+}
+void CFX_QuartzDeviceDriver::CG_SetImageTransform(int dest_left, int dest_top, int dest_width, int dest_height,
+ CGRect* rect )
+{
+ int flip_y = _foxitDevice2User.d * dest_height < 0 ? 1 : -1;
+ int flip_x = _foxitDevice2User.a * dest_width > 0 ? 1 : -1;
+ if (flip_y < 0 || flip_x < 0) {
+ if (dest_height < 0) {
+ dest_height = -dest_height;
+ dest_top -= dest_height;
+ }
+ CGRect rt = CGRectApplyAffineTransform(CGRectMake(dest_left, dest_top, dest_width, dest_height), _foxitDevice2User);
+ CGFloat offset_x = (rt.origin.x) + rt.size.width / 2.f,
+ offset_y = (rt.origin.y) + rt.size.height / 2.f;
+ CGAffineTransform transform = CGAffineTransformIdentity;
+ transform = CGAffineTransformConcat(transform, CGAffineTransformMake(1, 0, 0, 1, -offset_x, -offset_y));
+ transform = CGAffineTransformConcat(transform, CGAffineTransformMake(flip_x, 0, 0, flip_y, 0, 0));
+ transform = CGAffineTransformConcat(transform, CGAffineTransformMake(1, 0, 0, 1, offset_x, offset_y));
+ CGContextConcatCTM(_context, transform);
+ if (rect) {
+ *rect = CGRectApplyAffineTransform(*rect, transform);
+ }
+ }
+}
+void CFX_QuartzDeviceDriver::ClearDriver()
+{
+ if (NULL == _context) {
+ return;
+ }
+ for (int i = 0; i < m_saveCount; ++i) {
+ CGContextRestoreGState(_context);
+ }
+ m_saveCount = 0;
+ if (_context) {
+ CGContextRelease(_context);
+ }
+}
+CFX_QuartzDevice::CFX_QuartzDevice()
+{
+ m_bOwnedBitmap = FALSE;
+ m_pContext = NULL;
+}
+CFX_QuartzDevice::~CFX_QuartzDevice()
+{
+ if (m_pContext) {
+ CGContextRelease(m_pContext);
+ }
+ if (GetBitmap() && m_bOwnedBitmap) {
+ delete GetBitmap();
+ }
+}
+CGContextRef CFX_QuartzDevice::GetContext()
+{
+ return m_pContext;
+}
+FX_BOOL CFX_QuartzDevice::Attach(CGContextRef context, FX_INT32 nDeviceClass)
+{
+ if (m_pContext) {
+ CGContextRelease(m_pContext);
+ }
+ m_pContext = context;
+ CGContextRetain(m_pContext);
+ IFX_RenderDeviceDriver* pDriver = FX_NEW CFX_QuartzDeviceDriver(m_pContext, nDeviceClass);
+ if (!pDriver) {
+ return FALSE;
+ }
+ SetDeviceDriver(pDriver);
+ return TRUE;
+}
+FX_BOOL CFX_QuartzDevice::Attach(CFX_DIBitmap* pBitmap)
+{
+ SetBitmap(pBitmap);
+ m_pContext = createContextWithBitmap(pBitmap);
+ if (NULL == m_pContext) {
+ return FALSE;
+ }
+ IFX_RenderDeviceDriver* pDriver = FX_NEW CFX_QuartzDeviceDriver(m_pContext, FXDC_DISPLAY);
+ if (!pDriver) {
+ return FALSE;
+ }
+ SetDeviceDriver(pDriver);
+ return TRUE;
+}
+FX_BOOL CFX_QuartzDevice::Create(FX_INT32 width, FX_INT32 height, FXDIB_Format format)
+{
+ if ((FX_BYTE)format < 32) {
+ return FALSE;
+ }
+ CFX_DIBitmap* pBitmap = FX_NEW CFX_DIBitmap;
+ if (!pBitmap) {
+ return FALSE;
+ }
+ if (!pBitmap->Create(width, height, format)) {
+ delete pBitmap;
+ return FALSE;
+ }
+ m_bOwnedBitmap = TRUE;
+ return Attach(pBitmap);
+}
+#endif
diff --git a/core/src/fxge/dib/dib_int.h b/core/src/fxge/dib/dib_int.h
index a9d0b027c5..1e6d82ea86 100644
--- a/core/src/fxge/dib/dib_int.h
+++ b/core/src/fxge/dib/dib_int.h
@@ -1,88 +1,88 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-class CPDF_FixedMatrix : public CFX_Object
-{
-public:
- CPDF_FixedMatrix(const CFX_AffineMatrix& src, int bits)
- {
- base = 1 << bits;
- a = FXSYS_round(src.a * base);
- b = FXSYS_round(src.b * base);
- c = FXSYS_round(src.c * base);
- d = FXSYS_round(src.d * base);
- e = FXSYS_round(src.e * base);
- f = FXSYS_round(src.f * base);
- }
- inline void Transform(int x, int y, int& x1, int& y1)
- {
- x1 = (a * x + c * y + e + base / 2) / base;
- y1 = (b * x + d * y + f + base / 2) / base;
- }
- int a, b, c, d, e, f;
- int base;
-};
-#define FPDF_HUGE_IMAGE_SIZE 60000000
-struct PixelWeight {
- int m_SrcStart;
- int m_SrcEnd;
- int m_Weights[1];
-};
-class CWeightTable : public CFX_Object
-{
-public:
- CWeightTable()
- {
- m_pWeightTables = NULL;
- }
- ~CWeightTable()
- {
- if(m_pWeightTables) {
- FX_Free(m_pWeightTables);
- }
- m_pWeightTables = NULL;
- }
- void Calc(int dest_len, int dest_min, int dest_max, int src_len, int src_min, int src_max, int flags);
- PixelWeight* GetPixelWeight(int pixel)
- {
- return (PixelWeight*)(m_pWeightTables + (pixel - m_DestMin) * m_ItemSize);
- }
- int m_DestMin, m_ItemSize;
- FX_LPBYTE m_pWeightTables;
-};
-class CStretchEngine : public CFX_Object
-{
-public:
- CStretchEngine(IFX_ScanlineComposer* pDestBitmap, FXDIB_Format dest_format,
- int dest_width, int dest_height, const FX_RECT& clip_rect,
- const CFX_DIBSource* pSrcBitmap, int flags);
- ~CStretchEngine();
- FX_BOOL Continue(IFX_Pause* pPause);
-public:
- FXDIB_Format m_DestFormat;
- int m_DestBpp, m_SrcBpp, m_bHasAlpha;
- IFX_ScanlineComposer* m_pDestBitmap;
- int m_DestWidth, m_DestHeight;
- FX_RECT m_DestClip;
- FX_LPBYTE m_pDestScanline;
- FX_LPBYTE m_pDestMaskScanline;
- FX_RECT m_SrcClip;
- const CFX_DIBSource* m_pSource;
- FX_DWORD* m_pSrcPalette;
- int m_SrcWidth, m_SrcHeight;
- int m_SrcPitch, m_InterPitch;
- int m_ExtraMaskPitch;
- unsigned char* m_pInterBuf;
- unsigned char* m_pExtraAlphaBuf;
- int m_TransMethod;
- int m_Flags;
- CWeightTable m_WeightTable;
- int m_CurRow;
- FX_BOOL StartStretchHorz();
- FX_BOOL ContinueStretchHorz(IFX_Pause* pPause);
- void StretchVert();
- int m_State;
-};
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+class CPDF_FixedMatrix : public CFX_Object
+{
+public:
+ CPDF_FixedMatrix(const CFX_AffineMatrix& src, int bits)
+ {
+ base = 1 << bits;
+ a = FXSYS_round(src.a * base);
+ b = FXSYS_round(src.b * base);
+ c = FXSYS_round(src.c * base);
+ d = FXSYS_round(src.d * base);
+ e = FXSYS_round(src.e * base);
+ f = FXSYS_round(src.f * base);
+ }
+ inline void Transform(int x, int y, int& x1, int& y1)
+ {
+ x1 = (a * x + c * y + e + base / 2) / base;
+ y1 = (b * x + d * y + f + base / 2) / base;
+ }
+ int a, b, c, d, e, f;
+ int base;
+};
+#define FPDF_HUGE_IMAGE_SIZE 60000000
+struct PixelWeight {
+ int m_SrcStart;
+ int m_SrcEnd;
+ int m_Weights[1];
+};
+class CWeightTable : public CFX_Object
+{
+public:
+ CWeightTable()
+ {
+ m_pWeightTables = NULL;
+ }
+ ~CWeightTable()
+ {
+ if(m_pWeightTables) {
+ FX_Free(m_pWeightTables);
+ }
+ m_pWeightTables = NULL;
+ }
+ void Calc(int dest_len, int dest_min, int dest_max, int src_len, int src_min, int src_max, int flags);
+ PixelWeight* GetPixelWeight(int pixel)
+ {
+ return (PixelWeight*)(m_pWeightTables + (pixel - m_DestMin) * m_ItemSize);
+ }
+ int m_DestMin, m_ItemSize;
+ FX_LPBYTE m_pWeightTables;
+};
+class CStretchEngine : public CFX_Object
+{
+public:
+ CStretchEngine(IFX_ScanlineComposer* pDestBitmap, FXDIB_Format dest_format,
+ int dest_width, int dest_height, const FX_RECT& clip_rect,
+ const CFX_DIBSource* pSrcBitmap, int flags);
+ ~CStretchEngine();
+ FX_BOOL Continue(IFX_Pause* pPause);
+public:
+ FXDIB_Format m_DestFormat;
+ int m_DestBpp, m_SrcBpp, m_bHasAlpha;
+ IFX_ScanlineComposer* m_pDestBitmap;
+ int m_DestWidth, m_DestHeight;
+ FX_RECT m_DestClip;
+ FX_LPBYTE m_pDestScanline;
+ FX_LPBYTE m_pDestMaskScanline;
+ FX_RECT m_SrcClip;
+ const CFX_DIBSource* m_pSource;
+ FX_DWORD* m_pSrcPalette;
+ int m_SrcWidth, m_SrcHeight;
+ int m_SrcPitch, m_InterPitch;
+ int m_ExtraMaskPitch;
+ unsigned char* m_pInterBuf;
+ unsigned char* m_pExtraAlphaBuf;
+ int m_TransMethod;
+ int m_Flags;
+ CWeightTable m_WeightTable;
+ int m_CurRow;
+ FX_BOOL StartStretchHorz();
+ FX_BOOL ContinueStretchHorz(IFX_Pause* pPause);
+ void StretchVert();
+ int m_State;
+};
diff --git a/core/src/fxge/dib/fx_dib_composite.cpp b/core/src/fxge/dib/fx_dib_composite.cpp
index 8e9b4912a8..1bbe07725b 100644
--- a/core/src/fxge/dib/fx_dib_composite.cpp
+++ b/core/src/fxge/dib/fx_dib_composite.cpp
@@ -1,4602 +1,4602 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../../include/fxge/fx_ge.h"
-#include "../../../include/fxcodec/fx_codec.h"
-#include "dib_int.h"
-const FX_BYTE g_GammaRamp[256] = {
- 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3,
- 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7,
- 8, 8, 8, 8, 9, 9, 9, 10, 10, 10, 11, 11, 12, 12, 12, 13,
- 13, 13, 14, 14, 15, 15, 16, 16, 17, 17, 17, 18, 18, 19, 19, 20,
- 20, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 27, 27, 28, 29, 29,
- 30, 30, 31, 32, 32, 33, 34, 35, 35, 36, 37, 37, 38, 39, 40, 41,
- 41, 42, 43, 44, 45, 45, 46, 47, 48, 49, 50, 51, 51, 52, 53, 54,
- 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70,
- 71, 72, 73, 74, 76, 77, 78, 79, 80, 81, 82, 84, 85, 86, 87, 88,
- 90, 91, 92, 93, 95, 96, 97, 99, 100, 101, 103, 104, 105, 107, 108, 109,
- 111, 112, 114, 115, 116, 118, 119, 121, 122, 124, 125, 127, 128, 130, 131, 133,
- 134, 136, 138, 139, 141, 142, 144, 146, 147, 149, 151, 152, 154, 156, 157, 159,
- 161, 163, 164, 166, 168, 170, 171, 173, 175, 177, 179, 181, 183, 184, 186, 188,
- 190, 192, 194, 196, 198, 200, 202, 204, 206, 208, 210, 212, 214, 216, 218, 220,
- 222, 224, 226, 229, 231, 233, 235, 237, 239, 242, 244, 246, 248, 250, 253, 255,
-};
-const FX_BYTE g_GammaInverse[256] = {
- 0, 13, 22, 28, 34, 38, 42, 46, 50, 53, 56, 59, 61, 64, 66, 69,
- 71, 73, 75, 77, 79, 81, 83, 85, 86, 88, 90, 92, 93, 95, 96, 98,
- 99, 101, 102, 104, 105, 106, 108, 109, 110, 112, 113, 114, 115, 117, 118, 119,
- 120, 121, 122, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136,
- 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 148, 149, 150, 151,
- 152, 153, 154, 155, 155, 156, 157, 158, 159, 159, 160, 161, 162, 163, 163, 164,
- 165, 166, 167, 167, 168, 169, 170, 170, 171, 172, 173, 173, 174, 175, 175, 176,
- 177, 178, 178, 179, 180, 180, 181, 182, 182, 183, 184, 185, 185, 186, 187, 187,
- 188, 189, 189, 190, 190, 191, 192, 192, 193, 194, 194, 195, 196, 196, 197, 197,
- 198, 199, 199, 200, 200, 201, 202, 202, 203, 203, 204, 205, 205, 206, 206, 207,
- 208, 208, 209, 209, 210, 210, 211, 212, 212, 213, 213, 214, 214, 215, 215, 216,
- 216, 217, 218, 218, 219, 219, 220, 220, 221, 221, 222, 222, 223, 223, 224, 224,
- 225, 226, 226, 227, 227, 228, 228, 229, 229, 230, 230, 231, 231, 232, 232, 233,
- 233, 234, 234, 235, 235, 236, 236, 237, 237, 238, 238, 238, 239, 239, 240, 240,
- 241, 241, 242, 242, 243, 243, 244, 244, 245, 245, 246, 246, 246, 247, 247, 248,
- 248, 249, 249, 250, 250, 251, 251, 251, 252, 252, 253, 253, 254, 254, 255, 255,
-};
-const FX_BYTE _color_sqrt[256] = {
- 0x00, 0x03, 0x07, 0x0B, 0x0F, 0x12, 0x16, 0x19, 0x1D, 0x20, 0x23, 0x26, 0x29, 0x2C, 0x2F, 0x32,
- 0x35, 0x37, 0x3A, 0x3C, 0x3F, 0x41, 0x43, 0x46, 0x48, 0x4A, 0x4C, 0x4E, 0x50, 0x52, 0x54, 0x56,
- 0x57, 0x59, 0x5B, 0x5C, 0x5E, 0x60, 0x61, 0x63, 0x64, 0x65, 0x67, 0x68, 0x69, 0x6B, 0x6C, 0x6D,
- 0x6E, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E,
- 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E,
- 0x8F, 0x90, 0x91, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C,
- 0x9C, 0x9D, 0x9E, 0x9F, 0xA0, 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA4, 0xA5, 0xA6, 0xA7, 0xA7, 0xA8,
- 0xA9, 0xAA, 0xAA, 0xAB, 0xAC, 0xAD, 0xAD, 0xAE, 0xAF, 0xB0, 0xB0, 0xB1, 0xB2, 0xB3, 0xB3, 0xB4,
- 0xB5, 0xB5, 0xB6, 0xB7, 0xB7, 0xB8, 0xB9, 0xBA, 0xBA, 0xBB, 0xBC, 0xBC, 0xBD, 0xBE, 0xBE, 0xBF,
- 0xC0, 0xC0, 0xC1, 0xC2, 0xC2, 0xC3, 0xC4, 0xC4, 0xC5, 0xC6, 0xC6, 0xC7, 0xC7, 0xC8, 0xC9, 0xC9,
- 0xCA, 0xCB, 0xCB, 0xCC, 0xCC, 0xCD, 0xCE, 0xCE, 0xCF, 0xD0, 0xD0, 0xD1, 0xD1, 0xD2, 0xD3, 0xD3,
- 0xD4, 0xD4, 0xD5, 0xD6, 0xD6, 0xD7, 0xD7, 0xD8, 0xD9, 0xD9, 0xDA, 0xDA, 0xDB, 0xDC, 0xDC, 0xDD,
- 0xDD, 0xDE, 0xDE, 0xDF, 0xE0, 0xE0, 0xE1, 0xE1, 0xE2, 0xE2, 0xE3, 0xE4, 0xE4, 0xE5, 0xE5, 0xE6,
- 0xE6, 0xE7, 0xE7, 0xE8, 0xE9, 0xE9, 0xEA, 0xEA, 0xEB, 0xEB, 0xEC, 0xEC, 0xED, 0xED, 0xEE, 0xEE,
- 0xEF, 0xF0, 0xF0, 0xF1, 0xF1, 0xF2, 0xF2, 0xF3, 0xF3, 0xF4, 0xF4, 0xF5, 0xF5, 0xF6, 0xF6, 0xF7,
- 0xF7, 0xF8, 0xF8, 0xF9, 0xF9, 0xFA, 0xFA, 0xFB, 0xFB, 0xFC, 0xFC, 0xFD, 0xFD, 0xFE, 0xFE, 0xFF
-};
-int _BLEND(int blend_mode, int back_color, int src_color)
-{
- switch (blend_mode) {
- case FXDIB_BLEND_NORMAL:
- return src_color;
- case FXDIB_BLEND_MULTIPLY:
- return src_color * back_color / 255;
- case FXDIB_BLEND_SCREEN:
- return src_color + back_color - src_color * back_color / 255;
- case FXDIB_BLEND_OVERLAY:
- return _BLEND(FXDIB_BLEND_HARDLIGHT, src_color, back_color);
- case FXDIB_BLEND_DARKEN:
- return src_color < back_color ? src_color : back_color;
- case FXDIB_BLEND_LIGHTEN:
- return src_color > back_color ? src_color : back_color;
- case FXDIB_BLEND_COLORDODGE: {
- if (src_color == 255) {
- return src_color;
- }
- int result = back_color * 255 / (255 - src_color);
- if (result > 255) {
- return 255;
- }
- return result;
- }
- case FXDIB_BLEND_COLORBURN: {
- if (src_color == 0) {
- return src_color;
- }
- int result = (255 - back_color) * 255 / src_color;
- if (result > 255) {
- result = 255;
- }
- return 255 - result;
- }
- case FXDIB_BLEND_HARDLIGHT:
- if (src_color < 128) {
- return (src_color * back_color * 2) / 255;
- }
- return _BLEND(FXDIB_BLEND_SCREEN, back_color, 2 * src_color - 255);
- case FXDIB_BLEND_SOFTLIGHT: {
- if (src_color < 128) {
- return back_color - (255 - 2 * src_color) * back_color * (255 - back_color) / 255 / 255;
- }
- return back_color + (2 * src_color - 255) * (_color_sqrt[back_color] - back_color) / 255;
- }
- case FXDIB_BLEND_DIFFERENCE:
- return back_color < src_color ? src_color - back_color : back_color - src_color;
- case FXDIB_BLEND_EXCLUSION:
- return back_color + src_color - 2 * back_color * src_color / 255;
- }
- return src_color;
-}
-struct _RGB {
- int red;
- int green;
- int blue;
-};
-static inline int _Lum(_RGB color)
-{
- return (color.red * 30 + color.green * 59 + color.blue * 11) / 100;
-}
-static _RGB _ClipColor(_RGB color)
-{
- int l = _Lum(color);
- int n = color.red;
- if (color.green < n) {
- n = color.green;
- }
- if (color.blue < n) {
- n = color.blue;
- }
- int x = color.red;
- if (color.green > x) {
- x = color.green;
- }
- if (color.blue > x) {
- x = color.blue;
- }
- if (n < 0) {
- color.red = l + ((color.red - l) * l / (l - n));
- color.green = l + ((color.green - l) * l / (l - n));
- color.blue = l + ((color.blue - l) * l / (l - n));
- }
- if (x > 255) {
- color.red = l + ((color.red - l) * (255 - l) / (x - l));
- color.green = l + ((color.green - l) * (255 - l) / (x - l));
- color.blue = l + ((color.blue - l) * (255 - l) / (x - l));
- }
- return color;
-}
-static _RGB _SetLum(_RGB color, int l)
-{
- int d = l - _Lum(color);
- color.red += d;
- color.green += d;
- color.blue += d;
- return _ClipColor(color);
-}
-static int _Sat(_RGB color)
-{
- int n = color.red;
- if (color.green < n) {
- n = color.green;
- }
- if (color.blue < n) {
- n = color.blue;
- }
- int x = color.red;
- if (color.green > x) {
- x = color.green;
- }
- if (color.blue > x) {
- x = color.blue;
- }
- return x - n;
-}
-static _RGB _SetSat(_RGB color, int s)
-{
- int* max = &color.red;
- int* mid = &color.red;
- int* min = &color.red;
- if (color.green > *max) {
- max = &color.green;
- }
- if (color.blue > *max) {
- max = &color.blue;
- }
- if (color.green < *min) {
- min = &color.green;
- }
- if (color.blue < *min) {
- min = &color.blue;
- }
- if (*max == *min) {
- color.red = 0;
- color.green = 0;
- color.blue = 0;
- return color;
- }
- if (max == &color.red) {
- if (min == &color.green) {
- mid = &color.blue;
- } else {
- mid = &color.green;
- }
- } else if (max == &color.green) {
- if (min == &color.red) {
- mid = &color.blue;
- } else {
- mid = &color.red;
- }
- } else {
- if (min == &color.green) {
- mid = &color.red;
- } else {
- mid = &color.green;
- }
- }
- if (*max > *min) {
- *mid = (*mid - *min) * s / (*max - *min);
- *max = s;
- *min = 0;
- }
- return color;
-}
-void _RGB_Blend(int blend_mode, FX_LPCBYTE src_scan, FX_BYTE* dest_scan, int results[3])
-{
- _RGB src, back, result;
- src.red = src_scan[2];
- src.green = src_scan[1];
- src.blue = src_scan[0];
- back.red = dest_scan[2];
- back.green = dest_scan[1];
- back.blue = dest_scan[0];
- switch (blend_mode) {
- case FXDIB_BLEND_HUE:
- result = _SetLum(_SetSat(src, _Sat(back)), _Lum(back));
- break;
- case FXDIB_BLEND_SATURATION:
- result = _SetLum(_SetSat(back, _Sat(src)), _Lum(back));
- break;
- case FXDIB_BLEND_COLOR:
- result = _SetLum(src, _Lum(back));
- break;
- case FXDIB_BLEND_LUMINOSITY:
- result = _SetLum(back, _Lum(src));
- break;
- }
- results[0] = result.blue;
- results[1] = result.green;
- results[2] = result.red;
-}
-inline void _CompositeRow_Argb2Mask(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int pixel_count, FX_LPCBYTE clip_scan)
-{
- src_scan += 3;
- for (int col = 0; col < pixel_count; col ++) {
- int src_alpha = *src_scan;
- if (clip_scan) {
- src_alpha = clip_scan[col] * src_alpha / 255;
- }
- FX_BYTE back_alpha = *dest_scan;
- if (!back_alpha) {
- *dest_scan = src_alpha;
- } else if (src_alpha) {
- *dest_scan = back_alpha + src_alpha - back_alpha * src_alpha / 255;
- }
- dest_scan ++;
- src_scan += 4;
- }
-}
-void _CompositeRow_Rgba2Mask(FX_LPBYTE dest_scan, FX_LPCBYTE src_alpha_scan, int pixel_count, FX_LPCBYTE clip_scan)
-{
- for (int col = 0; col < pixel_count; col ++) {
- int src_alpha = *src_alpha_scan++;
- if (clip_scan) {
- src_alpha = clip_scan[col] * src_alpha / 255;
- }
- FX_BYTE back_alpha = *dest_scan;
- if (!back_alpha) {
- *dest_scan = src_alpha;
- } else if (src_alpha) {
- *dest_scan = back_alpha + src_alpha - back_alpha * src_alpha / 255;
- }
- dest_scan ++;
- }
-}
-void _CompositeRow_Rgb2Mask(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, FX_LPCBYTE clip_scan)
-{
- if (clip_scan) {
- for (int i = 0; i < width; i ++) {
- *dest_scan = FXDIB_ALPHA_UNION(*dest_scan, *clip_scan);
- dest_scan ++;
- clip_scan ++;
- }
- } else {
- FXSYS_memset8(dest_scan, 0xff, width);
- }
-}
-void _CompositeRow_Argb2Graya(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int pixel_count, int blend_type, FX_LPCBYTE clip_scan,
- FX_LPCBYTE src_alpha_scan, FX_LPBYTE dst_alpha_scan, void* pIccTransform)
-{
- ICodec_IccModule* pIccModule = NULL;
- if (pIccTransform) {
- pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
- }
- if (blend_type) {
- FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
- int blended_color;
- if (src_alpha_scan) {
- for (int col = 0; col < pixel_count; col ++) {
- FX_BYTE back_alpha = *dst_alpha_scan;
- if (back_alpha == 0) {
- int src_alpha = *src_alpha_scan++;
- if (clip_scan) {
- src_alpha = clip_scan[col] * src_alpha / 255;
- }
- if (src_alpha) {
- if (pIccTransform) {
- pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, 1);
- } else {
- *dest_scan = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
- }
- *dst_alpha_scan = src_alpha;
- }
- dest_scan ++;
- dst_alpha_scan ++;
- src_scan += 3;
- continue;
- }
- FX_BYTE src_alpha = *src_alpha_scan++;
- if (clip_scan) {
- src_alpha = clip_scan[col] * src_alpha / 255;
- }
- if (src_alpha == 0) {
- dest_scan ++;
- dst_alpha_scan ++;
- src_scan += 3;
- continue;
- }
- *dst_alpha_scan = FXDIB_ALPHA_UNION(back_alpha, src_alpha);
- int alpha_ratio = src_alpha * 255 / (*dst_alpha_scan);
- FX_BYTE gray;
- if (pIccTransform) {
- pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);
- } else {
- gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
- }
- if (bNonseparableBlend) {
- blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
- }
- gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, *dest_scan, gray);
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
- dest_scan ++;
- dst_alpha_scan++;
- src_scan += 3;
- }
- } else
- for (int col = 0; col < pixel_count; col ++) {
- FX_BYTE back_alpha = *dst_alpha_scan;
- if (back_alpha == 0) {
- int src_alpha = src_scan[3];
- if (clip_scan) {
- src_alpha = clip_scan[col] * src_alpha / 255;
- }
- if (src_alpha) {
- if (pIccTransform) {
- pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, 1);
- } else {
- *dest_scan = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
- }
- *dst_alpha_scan = src_alpha;
- }
- dest_scan ++;
- dst_alpha_scan ++;
- src_scan += 4;
- continue;
- }
- FX_BYTE src_alpha = src_scan[3];
- if (clip_scan) {
- src_alpha = clip_scan[col] * src_alpha / 255;
- }
- if (src_alpha == 0) {
- dest_scan ++;
- dst_alpha_scan ++;
- src_scan += 4;
- continue;
- }
- *dst_alpha_scan = FXDIB_ALPHA_UNION(back_alpha, src_alpha);
- int alpha_ratio = src_alpha * 255 / (*dst_alpha_scan);
- FX_BYTE gray;
- if (pIccTransform) {
- pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);
- } else {
- gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
- }
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
- dest_scan ++;
- dst_alpha_scan++;
- src_scan += 4;
- }
- return;
- }
- if (src_alpha_scan) {
- for (int col = 0; col < pixel_count; col ++) {
- FX_BYTE back_alpha = *dst_alpha_scan;
- if (back_alpha == 0) {
- int src_alpha = *src_alpha_scan++;
- if (clip_scan) {
- src_alpha = clip_scan[col] * src_alpha / 255;
- }
- if (src_alpha) {
- if (pIccTransform) {
- pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, 1);
- } else {
- *dest_scan = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
- }
- *dst_alpha_scan = src_alpha;
- }
- dest_scan ++;
- dst_alpha_scan ++;
- src_scan += 3;
- continue;
- }
- FX_BYTE src_alpha = *src_alpha_scan++;
- if (clip_scan) {
- src_alpha = clip_scan[col] * src_alpha / 255;
- }
- if (src_alpha == 0) {
- dest_scan ++;
- dst_alpha_scan ++;
- src_scan += 3;
- continue;
- }
- *dst_alpha_scan = FXDIB_ALPHA_UNION(back_alpha, src_alpha);
- int alpha_ratio = src_alpha * 255 / (*dst_alpha_scan);
- FX_BYTE gray;
- if (pIccTransform) {
- pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);
- } else {
- gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
- }
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
- dest_scan ++;
- dst_alpha_scan++;
- src_scan += 3;
- }
- } else
- for (int col = 0; col < pixel_count; col ++) {
- FX_BYTE back_alpha = *dst_alpha_scan;
- if (back_alpha == 0) {
- int src_alpha = src_scan[3];
- if (clip_scan) {
- src_alpha = clip_scan[col] * src_alpha / 255;
- }
- if (src_alpha) {
- if (pIccTransform) {
- pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, 1);
- } else {
- *dest_scan = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
- }
- *dst_alpha_scan = src_alpha;
- }
- dest_scan ++;
- dst_alpha_scan ++;
- src_scan += 4;
- continue;
- }
- FX_BYTE src_alpha = src_scan[3];
- if (clip_scan) {
- src_alpha = clip_scan[col] * src_alpha / 255;
- }
- if (src_alpha == 0) {
- dest_scan ++;
- dst_alpha_scan ++;
- src_scan += 4;
- continue;
- }
- *dst_alpha_scan = FXDIB_ALPHA_UNION(back_alpha, src_alpha);
- int alpha_ratio = src_alpha * 255 / (*dst_alpha_scan);
- FX_BYTE gray;
- if (pIccTransform) {
- pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);
- } else {
- gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
- }
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
- dest_scan ++;
- dst_alpha_scan++;
- src_scan += 4;
- }
-}
-inline void _CompositeRow_Argb2Gray(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int pixel_count,
- int blend_type, FX_LPCBYTE clip_scan,
- FX_LPCBYTE src_alpha_scan, void* pIccTransform)
-{
- ICodec_IccModule* pIccModule = NULL;
- FX_BYTE gray;
- if (pIccTransform) {
- pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
- }
- if (blend_type) {
- FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
- int blended_color;
- if (src_alpha_scan) {
- for (int col = 0; col < pixel_count; col ++) {
- int src_alpha = *src_alpha_scan++;
- if (clip_scan) {
- src_alpha = clip_scan[col] * src_alpha / 255;
- }
- if (src_alpha) {
- if (pIccTransform) {
- pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);
- } else {
- gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
- }
- if (bNonseparableBlend) {
- blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
- }
- gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, *dest_scan, gray);
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, src_alpha);
- }
- dest_scan ++;
- src_scan += 3;
- }
- } else
- for (int col = 0; col < pixel_count; col ++) {
- int src_alpha = src_scan[3];
- if (clip_scan) {
- src_alpha = clip_scan[col] * src_alpha / 255;
- }
- if (src_alpha) {
- if (pIccTransform) {
- pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);
- } else {
- gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
- }
- if (bNonseparableBlend) {
- blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
- }
- gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, *dest_scan, gray);
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, src_alpha);
- }
- dest_scan ++;
- src_scan += 4;
- }
- return;
- }
- if (src_alpha_scan) {
- for (int col = 0; col < pixel_count; col ++) {
- int src_alpha = *src_alpha_scan++;
- if (clip_scan) {
- src_alpha = clip_scan[col] * src_alpha / 255;
- }
- if (src_alpha) {
- if (pIccTransform) {
- pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);
- } else {
- gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
- }
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, src_alpha);
- }
- dest_scan ++;
- src_scan += 3;
- }
- } else
- for (int col = 0; col < pixel_count; col ++) {
- int src_alpha = src_scan[3];
- if (clip_scan) {
- src_alpha = clip_scan[col] * src_alpha / 255;
- }
- if (src_alpha) {
- if (pIccTransform) {
- pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);
- } else {
- gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
- }
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, src_alpha);
- }
- dest_scan ++;
- src_scan += 4;
- }
-}
-inline void _CompositeRow_Rgb2Gray(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_Bpp, int pixel_count,
- int blend_type, FX_LPCBYTE clip_scan,
- void* pIccTransform)
-{
- ICodec_IccModule* pIccModule = NULL;
- FX_BYTE gray;
- if (pIccTransform) {
- pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
- }
- if (blend_type) {
- FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
- int blended_color;
- for (int col = 0; col < pixel_count; col ++) {
- if (pIccTransform) {
- pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);
- } else {
- gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
- }
- if (bNonseparableBlend) {
- blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
- }
- gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, *dest_scan, gray);
- if (clip_scan && clip_scan[col] < 255) {
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, clip_scan[col]);
- } else {
- *dest_scan = gray;
- }
- dest_scan ++;
- src_scan += src_Bpp;
- }
- return;
- }
- for (int col = 0; col < pixel_count; col ++) {
- if (pIccTransform) {
- pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);
- } else {
- gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
- }
- if (clip_scan && clip_scan[col] < 255) {
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, clip_scan[col]);
- } else {
- *dest_scan = gray;
- }
- dest_scan ++;
- src_scan += src_Bpp;
- }
-}
-void _CompositeRow_Rgb2Graya(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_Bpp, int pixel_count,
- int blend_type, FX_LPCBYTE clip_scan,
- FX_LPBYTE dest_alpha_scan, void* pIccTransform)
-{
- ICodec_IccModule* pIccModule = NULL;
- if (pIccTransform) {
- pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
- }
- if (blend_type) {
- int blended_color;
- FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
- for (int col = 0; col < pixel_count; col ++) {
- int back_alpha = *dest_alpha_scan;
- if (back_alpha == 0) {
- if (pIccTransform) {
- pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, 1);
- } else {
- *dest_scan = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
- }
- dest_scan ++;
- dest_alpha_scan++;
- src_scan += src_Bpp;
- continue;
- }
- int src_alpha = 255;
- if (clip_scan) {
- src_alpha = clip_scan[col];
- }
- if (src_alpha == 0) {
- dest_scan ++;
- dest_alpha_scan ++;
- src_scan += src_Bpp;
- continue;
- }
- FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
- *dest_alpha_scan++ = dest_alpha;
- int alpha_ratio = src_alpha * 255 / dest_alpha;
- FX_BYTE gray;
- if (pIccTransform) {
- pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);
- } else {
- gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
- }
- if (bNonseparableBlend) {
- blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
- }
- gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, *dest_scan, gray);
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
- dest_scan ++;
- src_scan += src_Bpp;
- }
- return;
- }
- for (int col = 0; col < pixel_count; col ++) {
- int src_alpha = 255;
- if (clip_scan) {
- src_alpha = clip_scan[col];
- }
- if (src_alpha == 255) {
- if (pIccTransform) {
- pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, 1);
- } else {
- *dest_scan = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
- }
- dest_scan ++;
- *dest_alpha_scan++ = 255;
- src_scan += src_Bpp;
- continue;
- }
- if (src_alpha == 0) {
- dest_scan ++;
- dest_alpha_scan ++;
- src_scan += src_Bpp;
- continue;
- }
- int back_alpha = *dest_alpha_scan;
- FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
- *dest_alpha_scan++ = dest_alpha;
- int alpha_ratio = src_alpha * 255 / dest_alpha;
- FX_BYTE gray;
- if (pIccTransform) {
- pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);
- } else {
- gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
- }
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
- dest_scan ++;
- src_scan += src_Bpp;
- }
-}
-void _CompositeRow_Argb2Argb(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int pixel_count, int blend_type, FX_LPCBYTE clip_scan,
- FX_LPBYTE dest_alpha_scan, FX_LPCBYTE src_alpha_scan)
-{
- int blended_colors[3];
- FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
- if (dest_alpha_scan == NULL) {
- if (src_alpha_scan == NULL) {
- FX_BYTE back_alpha = 0;
- for (int col = 0; col < pixel_count; col ++) {
- back_alpha = dest_scan[3];
- if (back_alpha == 0) {
- if (clip_scan) {
- int src_alpha = clip_scan[col] * src_scan[3] / 255;
- FXARGB_SETDIB(dest_scan, (FXARGB_GETDIB(src_scan) & 0xffffff) | (src_alpha << 24));
- } else {
- FXARGB_COPY(dest_scan, src_scan);
- }
- dest_scan += 4;
- src_scan += 4;
- continue;
- }
- FX_BYTE src_alpha;
- if (clip_scan == NULL) {
- src_alpha = src_scan[3];
- } else {
- src_alpha = clip_scan[col] * src_scan[3] / 255;
- }
- if (src_alpha == 0) {
- dest_scan += 4;
- src_scan += 4;
- continue;
- }
- FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
- dest_scan[3] = dest_alpha;
- int alpha_ratio = src_alpha * 255 / dest_alpha;
- if (bNonseparableBlend) {
- _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
- }
- for (int color = 0; color < 3; color ++) {
- if (blend_type) {
- int blended = bNonseparableBlend ? blended_colors[color] :
- _BLEND(blend_type, *dest_scan, *src_scan);
- blended = FXDIB_ALPHA_MERGE(*src_scan, blended, back_alpha);
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
- } else {
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, alpha_ratio);
- }
- dest_scan ++;
- src_scan ++;
- }
- dest_scan ++;
- src_scan ++;
- }
- } else {
- for (int col = 0; col < pixel_count; col ++) {
- FX_BYTE back_alpha = dest_scan[3];
- if (back_alpha == 0) {
- if (clip_scan) {
- int src_alpha = clip_scan[col] * (*src_alpha_scan) / 255;
- FXARGB_SETDIB(dest_scan, FXARGB_MAKE((src_alpha << 24), src_scan[2], src_scan[1], *src_scan));
- } else {
- FXARGB_SETDIB(dest_scan, FXARGB_MAKE((*src_alpha_scan << 24), src_scan[2], src_scan[1], *src_scan));
- }
- dest_scan += 4;
- src_scan += 3;
- src_alpha_scan ++;
- continue;
- }
- FX_BYTE src_alpha;
- if (clip_scan == NULL) {
- src_alpha = *src_alpha_scan ++;
- } else {
- src_alpha = clip_scan[col] * (*src_alpha_scan ++) / 255;
- }
- if (src_alpha == 0) {
- dest_scan += 4;
- src_scan += 3;
- continue;
- }
- FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
- dest_scan[3] = dest_alpha;
- int alpha_ratio = src_alpha * 255 / dest_alpha;
- if (bNonseparableBlend) {
- _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
- }
- for (int color = 0; color < 3; color ++) {
- if (blend_type) {
- int blended = bNonseparableBlend ? blended_colors[color] :
- _BLEND(blend_type, *dest_scan, *src_scan);
- blended = FXDIB_ALPHA_MERGE(*src_scan, blended, back_alpha);
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
- } else {
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, alpha_ratio);
- }
- dest_scan ++;
- src_scan ++;
- }
- dest_scan ++;
- }
- }
- } else {
- if (src_alpha_scan) {
- for (int col = 0; col < pixel_count; col ++) {
- FX_BYTE back_alpha = *dest_alpha_scan;
- if (back_alpha == 0) {
- if (clip_scan) {
- int src_alpha = clip_scan[col] * (*src_alpha_scan) / 255;
- *dest_alpha_scan = src_alpha;
- *dest_scan++ = *src_scan++;
- *dest_scan++ = *src_scan++;
- *dest_scan++ = *src_scan++;
- } else {
- *dest_alpha_scan = *src_alpha_scan;
- *dest_scan++ = *src_scan++;
- *dest_scan++ = *src_scan++;
- *dest_scan++ = *src_scan++;
- }
- dest_alpha_scan ++;
- src_alpha_scan ++;
- continue;
- }
- FX_BYTE src_alpha;
- if (clip_scan == NULL) {
- src_alpha = *src_alpha_scan ++;
- } else {
- src_alpha = clip_scan[col] * (*src_alpha_scan ++) / 255;
- }
- if (src_alpha == 0) {
- dest_scan += 3;
- src_scan += 3;
- dest_alpha_scan ++;
- continue;
- }
- FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
- *dest_alpha_scan ++ = dest_alpha;
- int alpha_ratio = src_alpha * 255 / dest_alpha;
- if (bNonseparableBlend) {
- _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
- }
- for (int color = 0; color < 3; color ++) {
- if (blend_type) {
- int blended = bNonseparableBlend ? blended_colors[color] :
- _BLEND(blend_type, *dest_scan, *src_scan);
- blended = FXDIB_ALPHA_MERGE(*src_scan, blended, back_alpha);
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
- } else {
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, alpha_ratio);
- }
- dest_scan ++;
- src_scan ++;
- }
- }
- } else {
- for (int col = 0; col < pixel_count; col ++) {
- FX_BYTE back_alpha = *dest_alpha_scan;
- if (back_alpha == 0) {
- if (clip_scan) {
- int src_alpha = clip_scan[col] * src_scan[3] / 255;
- *dest_alpha_scan = src_alpha;
- *dest_scan++ = *src_scan++;
- *dest_scan++ = *src_scan++;
- *dest_scan++ = *src_scan++;
- } else {
- *dest_alpha_scan = src_scan[3];
- *dest_scan++ = *src_scan++;
- *dest_scan++ = *src_scan++;
- *dest_scan++ = *src_scan++;
- }
- dest_alpha_scan ++;
- src_scan ++;
- continue;
- }
- FX_BYTE src_alpha;
- if (clip_scan == NULL) {
- src_alpha = src_scan[3];
- } else {
- src_alpha = clip_scan[col] * src_scan[3] / 255;
- }
- if (src_alpha == 0) {
- dest_scan += 3;
- src_scan += 4;
- dest_alpha_scan ++;
- continue;
- }
- FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
- *dest_alpha_scan++ = dest_alpha;
- int alpha_ratio = src_alpha * 255 / dest_alpha;
- if (bNonseparableBlend) {
- _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
- }
- for (int color = 0; color < 3; color ++) {
- if (blend_type) {
- int blended = bNonseparableBlend ? blended_colors[color] :
- _BLEND(blend_type, *dest_scan, *src_scan);
- blended = FXDIB_ALPHA_MERGE(*src_scan, blended, back_alpha);
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
- } else {
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, alpha_ratio);
- }
- dest_scan ++;
- src_scan ++;
- }
- src_scan ++;
- }
- }
- }
-}
-void _CompositeRow_Rgb2Argb_Blend_NoClip(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int src_Bpp,
- FX_LPBYTE dest_alpha_scan)
-{
- int blended_colors[3];
- FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
- int src_gap = src_Bpp - 3;
- if (dest_alpha_scan == NULL) {
- for (int col = 0; col < width; col ++) {
- FX_BYTE back_alpha = dest_scan[3];
- if (back_alpha == 0) {
- if (src_Bpp == 4) {
- FXARGB_SETDIB(dest_scan, 0xff000000 | FXARGB_GETDIB(src_scan));
- } else {
- FXARGB_SETDIB(dest_scan, FXARGB_MAKE(0xff, src_scan[2], src_scan[1], src_scan[0]));
- }
- dest_scan += 4;
- src_scan += src_Bpp;
- continue;
- }
- dest_scan[3] = 0xff;
- if (bNonseparableBlend) {
- _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
- }
- for (int color = 0; color < 3; color ++) {
- int src_color = *src_scan;
- int blended = bNonseparableBlend ? blended_colors[color] :
- _BLEND(blend_type, *dest_scan, src_color);
- *dest_scan = FXDIB_ALPHA_MERGE(src_color, blended, back_alpha);
- dest_scan ++;
- src_scan ++;
- }
- dest_scan ++;
- src_scan += src_gap;
- }
- } else {
- for (int col = 0; col < width; col ++) {
- FX_BYTE back_alpha = *dest_alpha_scan;
- if (back_alpha == 0) {
- *dest_scan++ = *src_scan++;
- *dest_scan++ = *src_scan++;
- *dest_scan++ = *src_scan++;
- *dest_alpha_scan++ = 0xff;
- src_scan += src_gap;
- continue;
- }
- *dest_alpha_scan++ = 0xff;
- if (bNonseparableBlend) {
- _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
- }
- for (int color = 0; color < 3; color ++) {
- int src_color = *src_scan;
- int blended = bNonseparableBlend ? blended_colors[color] :
- _BLEND(blend_type, *dest_scan, src_color);
- *dest_scan = FXDIB_ALPHA_MERGE(src_color, blended, back_alpha);
- dest_scan ++;
- src_scan ++;
- }
- src_scan += src_gap;
- }
- }
-}
-inline void _CompositeRow_Rgb2Argb_Blend_Clip(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int src_Bpp, FX_LPCBYTE clip_scan,
- FX_LPBYTE dest_alpha_scan)
-{
- int blended_colors[3];
- FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
- int src_gap = src_Bpp - 3;
- if (dest_alpha_scan == NULL) {
- for (int col = 0; col < width; col ++) {
- int src_alpha = *clip_scan ++;
- FX_BYTE back_alpha = dest_scan[3];
- if (back_alpha == 0) {
- *dest_scan++ = *src_scan++;
- *dest_scan++ = *src_scan++;
- *dest_scan++ = *src_scan++;
- src_scan += src_gap;
- dest_scan ++;
- continue;
- }
- if (src_alpha == 0) {
- dest_scan += 4;
- src_scan += src_Bpp;
- continue;
- }
- FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
- dest_scan[3] = dest_alpha;
- int alpha_ratio = src_alpha * 255 / dest_alpha;
- if (bNonseparableBlend) {
- _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
- }
- for (int color = 0; color < 3; color ++) {
- int src_color = *src_scan;
- int blended = bNonseparableBlend ? blended_colors[color] :
- _BLEND(blend_type, *dest_scan, src_color);
- blended = FXDIB_ALPHA_MERGE(src_color, blended, back_alpha);
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
- dest_scan ++;
- src_scan ++;
- }
- dest_scan ++;
- src_scan += src_gap;
- }
- } else {
- for (int col = 0; col < width; col ++) {
- int src_alpha = *clip_scan ++;
- FX_BYTE back_alpha = *dest_alpha_scan;
- if (back_alpha == 0) {
- *dest_scan++ = *src_scan++;
- *dest_scan++ = *src_scan++;
- *dest_scan++ = *src_scan++;
- src_scan += src_gap;
- dest_alpha_scan++;
- continue;
- }
- if (src_alpha == 0) {
- dest_scan += 3;
- dest_alpha_scan++;
- src_scan += src_Bpp;
- continue;
- }
- FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
- *dest_alpha_scan++ = dest_alpha;
- int alpha_ratio = src_alpha * 255 / dest_alpha;
- if (bNonseparableBlend) {
- _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
- }
- for (int color = 0; color < 3; color ++) {
- int src_color = *src_scan;
- int blended = bNonseparableBlend ? blended_colors[color] :
- _BLEND(blend_type, *dest_scan, src_color);
- blended = FXDIB_ALPHA_MERGE(src_color, blended, back_alpha);
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
- dest_scan ++;
- src_scan ++;
- }
- src_scan += src_gap;
- }
- }
-}
-inline void _CompositeRow_Rgb2Argb_NoBlend_Clip(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int src_Bpp, FX_LPCBYTE clip_scan,
- FX_LPBYTE dest_alpha_scan)
-{
- int src_gap = src_Bpp - 3;
- if (dest_alpha_scan == NULL) {
- for (int col = 0; col < width; col ++) {
- int src_alpha = clip_scan[col];
- if (src_alpha == 255) {
- *dest_scan++ = *src_scan++;
- *dest_scan++ = *src_scan++;
- *dest_scan++ = *src_scan++;
- *dest_scan++ = 255;
- src_scan += src_gap;
- continue;
- }
- if (src_alpha == 0) {
- dest_scan += 4;
- src_scan += src_Bpp;
- continue;
- }
- int back_alpha = dest_scan[3];
- FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
- dest_scan[3] = dest_alpha;
- int alpha_ratio = src_alpha * 255 / dest_alpha;
- for (int color = 0; color < 3; color ++) {
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, alpha_ratio);
- dest_scan ++;
- src_scan ++;
- }
- dest_scan ++;
- src_scan += src_gap;
- }
- } else {
- for (int col = 0; col < width; col ++) {
- int src_alpha = clip_scan[col];
- if (src_alpha == 255) {
- *dest_scan++ = *src_scan++;
- *dest_scan++ = *src_scan++;
- *dest_scan++ = *src_scan++;
- *dest_alpha_scan++ = 255;
- src_scan += src_gap;
- continue;
- }
- if (src_alpha == 0) {
- dest_scan += 3;
- dest_alpha_scan ++;
- src_scan += src_Bpp;
- continue;
- }
- int back_alpha = *dest_alpha_scan;
- FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
- *dest_alpha_scan ++ = dest_alpha;
- int alpha_ratio = src_alpha * 255 / dest_alpha;
- for (int color = 0; color < 3; color ++) {
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, alpha_ratio);
- dest_scan ++;
- src_scan ++;
- }
- src_scan += src_gap;
- }
- }
-}
-inline void _CompositeRow_Rgb2Argb_NoBlend_NoClip(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int src_Bpp,
- FX_LPBYTE dest_alpha_scan)
-{
- if (dest_alpha_scan == NULL) {
- for (int col = 0; col < width; col ++) {
- if (src_Bpp == 4) {
- FXARGB_SETDIB(dest_scan, 0xff000000 | FXARGB_GETDIB(src_scan));
- } else {
- FXARGB_SETDIB(dest_scan, FXARGB_MAKE(0xff, src_scan[2], src_scan[1], src_scan[0]));
- }
- dest_scan += 4;
- src_scan += src_Bpp;
- }
- } else {
- int src_gap = src_Bpp - 3;
- for (int col = 0; col < width; col ++) {
- *dest_scan++ = *src_scan++;
- *dest_scan++ = *src_scan++;
- *dest_scan++ = *src_scan++;
- *dest_alpha_scan++ = 0xff;
- src_scan += src_gap;
- }
- }
-}
-inline void _CompositeRow_Argb2Rgb_Blend(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int dest_Bpp, FX_LPCBYTE clip_scan,
- FX_LPCBYTE src_alpha_scan)
-{
- int blended_colors[3];
- FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
- int dest_gap = dest_Bpp - 3;
- if (src_alpha_scan == NULL) {
- for (int col = 0; col < width; col ++) {
- FX_BYTE src_alpha;
- if (clip_scan) {
- src_alpha = src_scan[3] * (*clip_scan++) / 255;
- } else {
- src_alpha = src_scan[3];
- }
- if (src_alpha == 0) {
- dest_scan += dest_Bpp;
- src_scan += 4;
- continue;
- }
- if (bNonseparableBlend) {
- _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
- }
- for (int color = 0; color < 3; color ++) {
- int back_color = *dest_scan;
- int blended = bNonseparableBlend ? blended_colors[color] :
- _BLEND(blend_type, back_color, *src_scan);
- *dest_scan = FXDIB_ALPHA_MERGE(back_color, blended, src_alpha);
- dest_scan ++;
- src_scan ++;
- }
- dest_scan += dest_gap;
- src_scan ++;
- }
- } else {
- for (int col = 0; col < width; col ++) {
- FX_BYTE src_alpha;
- if (clip_scan) {
- src_alpha = (*src_alpha_scan++) * (*clip_scan++) / 255;
- } else {
- src_alpha = *src_alpha_scan++;
- }
- if (src_alpha == 0) {
- dest_scan += dest_Bpp;
- src_scan += 3;
- continue;
- }
- if (bNonseparableBlend) {
- _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
- }
- for (int color = 0; color < 3; color ++) {
- int back_color = *dest_scan;
- int blended = bNonseparableBlend ? blended_colors[color] :
- _BLEND(blend_type, back_color, *src_scan);
- *dest_scan = FXDIB_ALPHA_MERGE(back_color, blended, src_alpha);
- dest_scan ++;
- src_scan ++;
- }
- dest_scan += dest_gap;
- }
- }
-}
-inline void _CompositeRow_Argb2Rgb_NoBlend(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int dest_Bpp, FX_LPCBYTE clip_scan,
- FX_LPCBYTE src_alpha_scan)
-{
- int dest_gap = dest_Bpp - 3;
- if (src_alpha_scan == NULL) {
- for (int col = 0; col < width; col ++) {
- FX_BYTE src_alpha;
- if (clip_scan) {
- src_alpha = src_scan[3] * (*clip_scan++) / 255;
- } else {
- src_alpha = src_scan[3];
- }
- if (src_alpha == 255) {
- *dest_scan++ = *src_scan++;
- *dest_scan++ = *src_scan++;
- *dest_scan++ = *src_scan++;
- dest_scan += dest_gap;
- src_scan ++;
- continue;
- }
- if (src_alpha == 0) {
- dest_scan += dest_Bpp;
- src_scan += 4;
- continue;
- }
- for (int color = 0; color < 3; color ++) {
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, src_alpha);
- dest_scan ++;
- src_scan ++;
- }
- dest_scan += dest_gap;
- src_scan ++;
- }
- } else {
- for (int col = 0; col < width; col ++) {
- FX_BYTE src_alpha;
- if (clip_scan) {
- src_alpha = (*src_alpha_scan++) * (*clip_scan++) / 255;
- } else {
- src_alpha = *src_alpha_scan++;
- }
- if (src_alpha == 255) {
- *dest_scan++ = *src_scan++;
- *dest_scan++ = *src_scan++;
- *dest_scan++ = *src_scan++;
- dest_scan += dest_gap;
- continue;
- }
- if (src_alpha == 0) {
- dest_scan += dest_Bpp;
- src_scan += 3;
- continue;
- }
- for (int color = 0; color < 3; color ++) {
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, src_alpha);
- dest_scan ++;
- src_scan ++;
- }
- dest_scan += dest_gap;
- }
- }
-}
-inline void _CompositeRow_Rgb2Rgb_Blend_NoClip(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int dest_Bpp, int src_Bpp)
-{
- int blended_colors[3];
- FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
- int dest_gap = dest_Bpp - 3;
- int src_gap = src_Bpp - 3;
- for (int col = 0; col < width; col ++) {
- if (bNonseparableBlend) {
- _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
- }
- for (int color = 0; color < 3; color ++) {
- int back_color = *dest_scan;
- int src_color = *src_scan;
- int blended = bNonseparableBlend ? blended_colors[color] :
- _BLEND(blend_type, back_color, src_color);
- *dest_scan = blended;
- dest_scan ++;
- src_scan ++;
- }
- dest_scan += dest_gap;
- src_scan += src_gap;
- }
-}
-inline void _CompositeRow_Rgb2Rgb_Blend_Clip(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int dest_Bpp, int src_Bpp, FX_LPCBYTE clip_scan)
-{
- int blended_colors[3];
- FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
- int dest_gap = dest_Bpp - 3;
- int src_gap = src_Bpp - 3;
- for (int col = 0; col < width; col ++) {
- FX_BYTE src_alpha = *clip_scan ++;
- if (src_alpha == 0) {
- dest_scan += dest_Bpp;
- src_scan += src_Bpp;
- continue;
- }
- if (bNonseparableBlend) {
- _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
- }
- for (int color = 0; color < 3; color ++) {
- int src_color = *src_scan;
- int back_color = *dest_scan;
- int blended = bNonseparableBlend ? blended_colors[color] :
- _BLEND(blend_type, back_color, src_color);
- *dest_scan = FXDIB_ALPHA_MERGE(back_color, blended, src_alpha);
- dest_scan ++;
- src_scan ++;
- }
- dest_scan += dest_gap;
- src_scan += src_gap;
- }
-}
-inline void _CompositeRow_Rgb2Rgb_NoBlend_NoClip(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int dest_Bpp, int src_Bpp)
-{
- if (dest_Bpp == src_Bpp) {
- FXSYS_memcpy32(dest_scan, src_scan, width * dest_Bpp);
- return;
- }
- for (int col = 0; col < width; col ++) {
- dest_scan[0] = src_scan[0];
- dest_scan[1] = src_scan[1];
- dest_scan[2] = src_scan[2];
- dest_scan += dest_Bpp;
- src_scan += src_Bpp;
- }
-}
-inline void _CompositeRow_Rgb2Rgb_NoBlend_Clip(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int dest_Bpp, int src_Bpp, FX_LPCBYTE clip_scan)
-{
- for (int col = 0; col < width; col ++) {
- int src_alpha = clip_scan[col];
- if (src_alpha == 255) {
- dest_scan[0] = src_scan[0];
- dest_scan[1] = src_scan[1];
- dest_scan[2] = src_scan[2];
- } else if (src_alpha) {
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, src_alpha);
- dest_scan ++;
- src_scan ++;
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, src_alpha);
- dest_scan ++;
- src_scan ++;
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, src_alpha);
- dest_scan += dest_Bpp - 2;
- src_scan += src_Bpp - 2;
- continue;
- }
- dest_scan += dest_Bpp;
- src_scan += src_Bpp;
- }
-}
-void _CompositeRow_Argb2Argb_Transform(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int pixel_count, int blend_type, FX_LPCBYTE clip_scan,
- FX_LPBYTE dest_alpha_scan, FX_LPCBYTE src_alpha_scan, FX_LPBYTE src_cache_scan, void* pIccTransform)
-{
- FX_LPBYTE dp = src_cache_scan;
- ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
- if (src_alpha_scan) {
- if (dest_alpha_scan == NULL) {
- for (int col = 0; col < pixel_count; col ++) {
- pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);
- dp[3] = *src_alpha_scan++;
- src_scan += 3;
- dp += 4;
- }
- src_alpha_scan = NULL;
- } else {
- pIccModule->TranslateScanline(pIccTransform, dp, src_scan, pixel_count);
- }
- } else {
- if (dest_alpha_scan == NULL) {
- for (int col = 0; col < pixel_count; col ++) {
- pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);
- dp[3] = src_scan[3];
- src_scan += 4;
- dp += 4;
- }
- } else {
- int blended_colors[3];
- FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
- for (int col = 0; col < pixel_count; col ++) {
- pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, 1);
- FX_BYTE back_alpha = *dest_alpha_scan;
- if (back_alpha == 0) {
- if (clip_scan) {
- int src_alpha = clip_scan[col] * src_scan[3] / 255;
- *dest_alpha_scan = src_alpha;
- *dest_scan++ = *src_cache_scan++;
- *dest_scan++ = *src_cache_scan++;
- *dest_scan++ = *src_cache_scan++;
- } else {
- *dest_alpha_scan = src_scan[3];
- *dest_scan++ = *src_cache_scan++;
- *dest_scan++ = *src_cache_scan++;
- *dest_scan++ = *src_cache_scan++;
- }
- dest_alpha_scan ++;
- src_scan += 4;
- continue;
- }
- FX_BYTE src_alpha;
- if (clip_scan == NULL) {
- src_alpha = src_scan[3];
- } else {
- src_alpha = clip_scan[col] * src_scan[3] / 255;
- }
- src_scan += 4;
- if (src_alpha == 0) {
- dest_scan += 3;
- src_cache_scan += 3;
- dest_alpha_scan ++;
- continue;
- }
- FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
- *dest_alpha_scan ++ = dest_alpha;
- int alpha_ratio = src_alpha * 255 / dest_alpha;
- if (bNonseparableBlend) {
- _RGB_Blend(blend_type, src_cache_scan, dest_scan, blended_colors);
- }
- for (int color = 0; color < 3; color ++) {
- if (blend_type) {
- int blended = bNonseparableBlend ? blended_colors[color] :
- _BLEND(blend_type, *dest_scan, *src_cache_scan);
- blended = FXDIB_ALPHA_MERGE(*src_cache_scan, blended, back_alpha);
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
- } else {
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_cache_scan, alpha_ratio);
- }
- dest_scan ++;
- src_cache_scan ++;
- }
- }
- return;
- }
- }
- _CompositeRow_Argb2Argb(dest_scan, src_cache_scan, pixel_count, blend_type, clip_scan, dest_alpha_scan, src_alpha_scan);
-}
-void _CompositeRow_Rgb2Argb_Blend_NoClip_Transform(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int src_Bpp,
- FX_LPBYTE dest_alpha_scan, FX_LPBYTE src_cache_scan, void* pIccTransform)
-{
- ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
- if (src_Bpp == 3) {
- pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, width);
- } else {
- FX_LPBYTE dp = src_cache_scan;
- for (int col = 0; col < width; col ++) {
- pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);
- src_scan += 4;
- dp += 3;
- }
- }
- _CompositeRow_Rgb2Argb_Blend_NoClip(dest_scan, src_cache_scan, width, blend_type, 3, dest_alpha_scan);
-}
-inline void _CompositeRow_Rgb2Argb_Blend_Clip_Transform(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int src_Bpp, FX_LPCBYTE clip_scan,
- FX_LPBYTE dest_alpha_scan, FX_LPBYTE src_cache_scan, void* pIccTransform)
-{
- ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
- if (src_Bpp == 3) {
- pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, width);
- } else {
- FX_LPBYTE dp = src_cache_scan;
- for (int col = 0; col < width; col ++) {
- pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);
- src_scan += 4;
- dp += 3;
- }
- }
- _CompositeRow_Rgb2Argb_Blend_Clip(dest_scan, src_cache_scan, width, blend_type, 3, clip_scan, dest_alpha_scan);
-}
-inline void _CompositeRow_Rgb2Argb_NoBlend_Clip_Transform(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int src_Bpp, FX_LPCBYTE clip_scan,
- FX_LPBYTE dest_alpha_scan, FX_LPBYTE src_cache_scan, void* pIccTransform)
-{
- ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
- if (src_Bpp == 3) {
- pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, width);
- } else {
- FX_LPBYTE dp = src_cache_scan;
- for (int col = 0; col < width; col ++) {
- pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);
- src_scan += 4;
- dp += 3;
- }
- }
- _CompositeRow_Rgb2Argb_NoBlend_Clip(dest_scan, src_cache_scan, width, 3, clip_scan, dest_alpha_scan);
-}
-inline void _CompositeRow_Rgb2Argb_NoBlend_NoClip_Transform(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int src_Bpp,
- FX_LPBYTE dest_alpha_scan, FX_LPBYTE src_cache_scan, void* pIccTransform)
-{
- ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
- if (src_Bpp == 3) {
- pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, width);
- } else {
- FX_LPBYTE dp = src_cache_scan;
- for (int col = 0; col < width; col ++) {
- pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);
- src_scan += 4;
- dp += 3;
- }
- }
- _CompositeRow_Rgb2Argb_NoBlend_NoClip(dest_scan, src_cache_scan, width, 3, dest_alpha_scan);
-}
-inline void _CompositeRow_Argb2Rgb_Blend_Transform(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int dest_Bpp, FX_LPCBYTE clip_scan,
- FX_LPCBYTE src_alpha_scan, FX_LPBYTE src_cache_scan, void* pIccTransform)
-{
- ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
- if (src_alpha_scan) {
- pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, width);
- } else {
- int blended_colors[3];
- FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
- int dest_gap = dest_Bpp - 3;
- for (int col = 0; col < width; col ++) {
- pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, 1);
- FX_BYTE src_alpha;
- if (clip_scan) {
- src_alpha = src_scan[3] * (*clip_scan++) / 255;
- } else {
- src_alpha = src_scan[3];
- }
- src_scan += 4;
- if (src_alpha == 0) {
- dest_scan += dest_Bpp;
- src_cache_scan += 3;
- continue;
- }
- if (bNonseparableBlend) {
- _RGB_Blend(blend_type, src_cache_scan, dest_scan, blended_colors);
- }
- for (int color = 0; color < 3; color ++) {
- int back_color = *dest_scan;
- int blended = bNonseparableBlend ? blended_colors[color] :
- _BLEND(blend_type, back_color, *src_cache_scan);
- *dest_scan = FXDIB_ALPHA_MERGE(back_color, blended, src_alpha);
- dest_scan ++;
- src_cache_scan ++;
- }
- dest_scan += dest_gap;
- }
- return;
- }
- _CompositeRow_Argb2Rgb_Blend(dest_scan, src_cache_scan, width, blend_type, dest_Bpp, clip_scan, src_alpha_scan);
-}
-inline void _CompositeRow_Argb2Rgb_NoBlend_Transform(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int dest_Bpp, FX_LPCBYTE clip_scan,
- FX_LPCBYTE src_alpha_scan, FX_LPBYTE src_cache_scan, void* pIccTransform)
-{
- ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
- if (src_alpha_scan) {
- pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, width);
- } else {
- int dest_gap = dest_Bpp - 3;
- for (int col = 0; col < width; col ++) {
- pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, 1);
- FX_BYTE src_alpha;
- if (clip_scan) {
- src_alpha = src_scan[3] * (*clip_scan++) / 255;
- } else {
- src_alpha = src_scan[3];
- }
- src_scan += 4;
- if (src_alpha == 255) {
- *dest_scan++ = *src_cache_scan++;
- *dest_scan++ = *src_cache_scan++;
- *dest_scan++ = *src_cache_scan++;
- dest_scan += dest_gap;
- continue;
- }
- if (src_alpha == 0) {
- dest_scan += dest_Bpp;
- src_cache_scan += 3;
- continue;
- }
- for (int color = 0; color < 3; color ++) {
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_cache_scan, src_alpha);
- dest_scan ++;
- src_cache_scan ++;
- }
- dest_scan += dest_gap;
- }
- return;
- }
- _CompositeRow_Argb2Rgb_NoBlend(dest_scan, src_cache_scan, width, dest_Bpp, clip_scan, src_alpha_scan);
-}
-inline void _CompositeRow_Rgb2Rgb_Blend_NoClip_Transform(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int dest_Bpp, int src_Bpp,
- FX_LPBYTE src_cache_scan, void* pIccTransform)
-{
- ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
- if (src_Bpp == 3) {
- pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, width);
- } else {
- FX_LPBYTE dp = src_cache_scan;
- for (int col = 0; col < width; col ++) {
- pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);
- src_scan += 4;
- dp += 3;
- }
- }
- _CompositeRow_Rgb2Rgb_Blend_NoClip(dest_scan, src_cache_scan, width, blend_type, dest_Bpp, 3);
-}
-inline void _CompositeRow_Rgb2Rgb_Blend_Clip_Transform(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int dest_Bpp, int src_Bpp, FX_LPCBYTE clip_scan,
- FX_LPBYTE src_cache_scan, void* pIccTransform)
-{
- ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
- if (src_Bpp == 3) {
- pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, width);
- } else {
- FX_LPBYTE dp = src_cache_scan;
- for (int col = 0; col < width; col ++) {
- pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);
- src_scan += 4;
- dp += 3;
- }
- }
- _CompositeRow_Rgb2Rgb_Blend_Clip(dest_scan, src_cache_scan, width, blend_type, dest_Bpp, 3, clip_scan);
-}
-inline void _CompositeRow_Rgb2Rgb_NoBlend_NoClip_Transform(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int dest_Bpp, int src_Bpp,
- FX_LPBYTE src_cache_scan, void* pIccTransform)
-{
- ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
- if (src_Bpp == 3) {
- pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, width);
- } else {
- FX_LPBYTE dp = src_cache_scan;
- for (int col = 0; col < width; col ++) {
- pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);
- src_scan += 4;
- dp += 3;
- }
- }
- _CompositeRow_Rgb2Rgb_NoBlend_NoClip(dest_scan, src_cache_scan, width, dest_Bpp, 3);
-}
-inline void _CompositeRow_Rgb2Rgb_NoBlend_Clip_Transform(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int dest_Bpp, int src_Bpp, FX_LPCBYTE clip_scan,
- FX_LPBYTE src_cache_scan, void* pIccTransform)
-{
- ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
- if (src_Bpp == 3) {
- pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, width);
- } else {
- FX_LPBYTE dp = src_cache_scan;
- for (int col = 0; col < width; col ++) {
- pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);
- src_scan += 4;
- dp += 3;
- }
- }
- _CompositeRow_Rgb2Rgb_NoBlend_Clip(dest_scan, src_cache_scan, width, dest_Bpp, 3, clip_scan);
-}
-inline void _CompositeRow_8bppPal2Gray(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, FX_LPCBYTE pPalette, int pixel_count,
- int blend_type, FX_LPCBYTE clip_scan,
- FX_LPCBYTE src_alpha_scan)
-{
- if (src_alpha_scan) {
- if (blend_type) {
- FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
- int blended_color;
- for (int col = 0; col < pixel_count; col ++) {
- FX_BYTE gray = pPalette[*src_scan];
- int src_alpha = *src_alpha_scan++;
- if (clip_scan) {
- src_alpha = clip_scan[col] * src_alpha / 255;
- }
- if (bNonseparableBlend) {
- blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
- }
- gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, *dest_scan, gray);
- if (src_alpha) {
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, src_alpha);
- } else {
- *dest_scan = gray;
- }
- dest_scan ++;
- src_scan ++;
- }
- return;
- }
- for (int col = 0; col < pixel_count; col ++) {
- FX_BYTE gray = pPalette[*src_scan];
- int src_alpha = *src_alpha_scan++;
- if (clip_scan) {
- src_alpha = clip_scan[col] * src_alpha / 255;
- }
- if (src_alpha) {
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, src_alpha);
- } else {
- *dest_scan = gray;
- }
- dest_scan ++;
- src_scan ++;
- }
- } else {
- if (blend_type) {
- FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
- int blended_color;
- for (int col = 0; col < pixel_count; col ++) {
- FX_BYTE gray = pPalette[*src_scan];
- if (bNonseparableBlend) {
- blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
- }
- gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, *dest_scan, gray);
- if (clip_scan && clip_scan[col] < 255) {
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, clip_scan[col]);
- } else {
- *dest_scan = gray;
- }
- dest_scan ++;
- src_scan ++;
- }
- return;
- }
- for (int col = 0; col < pixel_count; col ++) {
- FX_BYTE gray = pPalette[*src_scan];
- if (clip_scan && clip_scan[col] < 255) {
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, clip_scan[col]);
- } else {
- *dest_scan = gray;
- }
- dest_scan ++;
- src_scan ++;
- }
- }
-}
-inline void _CompositeRow_8bppPal2Graya(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, FX_LPCBYTE pPalette, int pixel_count,
- int blend_type, FX_LPCBYTE clip_scan,
- FX_LPBYTE dest_alpha_scan, FX_LPCBYTE src_alpha_scan)
-{
- if (src_alpha_scan) {
- if (blend_type) {
- FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
- int blended_color;
- for (int col = 0; col < pixel_count; col ++) {
- FX_BYTE gray = pPalette[*src_scan];
- src_scan ++;
- FX_BYTE back_alpha = *dest_alpha_scan;
- if (back_alpha == 0) {
- int src_alpha = *src_alpha_scan ++;
- if (clip_scan) {
- src_alpha = clip_scan[col] * src_alpha / 255;
- }
- if (src_alpha) {
- *dest_scan = gray;
- *dest_alpha_scan = src_alpha;
- }
- dest_scan ++;
- dest_alpha_scan ++;
- continue;
- }
- FX_BYTE src_alpha = *src_alpha_scan++;
- if (clip_scan) {
- src_alpha = clip_scan[col] * src_alpha / 255;
- }
- if (src_alpha == 0) {
- dest_scan ++;
- dest_alpha_scan ++;
- continue;
- }
- *dest_alpha_scan = back_alpha + src_alpha - back_alpha * src_alpha / 255;
- int alpha_ratio = src_alpha * 255 / (*dest_alpha_scan);
- if (bNonseparableBlend) {
- blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
- }
- gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, *dest_scan, gray);
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
- dest_alpha_scan ++;
- dest_scan ++;
- }
- return;
- }
- for (int col = 0; col < pixel_count; col ++) {
- FX_BYTE gray = pPalette[*src_scan];
- src_scan ++;
- FX_BYTE back_alpha = *dest_alpha_scan;
- if (back_alpha == 0) {
- int src_alpha = *src_alpha_scan ++;
- if (clip_scan) {
- src_alpha = clip_scan[col] * src_alpha / 255;
- }
- if (src_alpha) {
- *dest_scan = gray;
- *dest_alpha_scan = src_alpha;
- }
- dest_scan ++;
- dest_alpha_scan ++;
- continue;
- }
- FX_BYTE src_alpha = *src_alpha_scan++;
- if (clip_scan) {
- src_alpha = clip_scan[col] * src_alpha / 255;
- }
- if (src_alpha == 0) {
- dest_scan ++;
- dest_alpha_scan ++;
- continue;
- }
- *dest_alpha_scan = back_alpha + src_alpha - back_alpha * src_alpha / 255;
- int alpha_ratio = src_alpha * 255 / (*dest_alpha_scan);
- dest_alpha_scan ++;
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
- dest_scan ++;
- }
- } else {
- if (blend_type) {
- FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
- int blended_color;
- for (int col = 0; col < pixel_count; col ++) {
- FX_BYTE gray = pPalette[*src_scan];
- src_scan ++;
- if (clip_scan == NULL || clip_scan[col] == 255) {
- *dest_scan++ = gray;
- *dest_alpha_scan++ = 255;
- continue;
- }
- int src_alpha = clip_scan[col];
- if (src_alpha == 0) {
- dest_scan ++;
- dest_alpha_scan ++;
- continue;
- }
- int back_alpha = *dest_alpha_scan;
- FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
- *dest_alpha_scan ++ = dest_alpha;
- int alpha_ratio = src_alpha * 255 / dest_alpha;
- if (bNonseparableBlend) {
- blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
- }
- gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, *dest_scan, gray);
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
- dest_scan ++;
- }
- return;
- }
- for (int col = 0; col < pixel_count; col ++) {
- FX_BYTE gray = pPalette[*src_scan];
- src_scan ++;
- if (clip_scan == NULL || clip_scan[col] == 255) {
- *dest_scan++ = gray;
- *dest_alpha_scan++ = 255;
- continue;
- }
- int src_alpha = clip_scan[col];
- if (src_alpha == 0) {
- dest_scan ++;
- dest_alpha_scan ++;
- continue;
- }
- int back_alpha = *dest_alpha_scan;
- FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
- *dest_alpha_scan ++ = dest_alpha;
- int alpha_ratio = src_alpha * 255 / dest_alpha;
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
- dest_scan ++;
- }
- }
-}
-inline void _CompositeRow_1bppPal2Gray(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_left,
- FX_LPCBYTE pPalette, int pixel_count, int blend_type, FX_LPCBYTE clip_scan)
-{
- int reset_gray = pPalette[0];
- int set_gray = pPalette[1];
- if (blend_type) {
- FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
- int blended_color;
- for (int col = 0; col < pixel_count; col ++) {
- FX_BYTE gray = (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) ? set_gray : reset_gray;
- if (bNonseparableBlend) {
- blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
- }
- gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, *dest_scan, gray);
- if (clip_scan && clip_scan[col] < 255) {
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, clip_scan[col]);
- } else {
- *dest_scan = gray;
- }
- dest_scan ++;
- }
- return;
- }
- for (int col = 0; col < pixel_count; col ++) {
- FX_BYTE gray = (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) ? set_gray : reset_gray;
- if (clip_scan && clip_scan[col] < 255) {
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, clip_scan[col]);
- } else {
- *dest_scan = gray;
- }
- dest_scan ++;
- }
-}
-inline void _CompositeRow_1bppPal2Graya(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_left,
- FX_LPCBYTE pPalette, int pixel_count, int blend_type, FX_LPCBYTE clip_scan,
- FX_LPBYTE dest_alpha_scan)
-{
- int reset_gray = pPalette[0];
- int set_gray = pPalette[1];
- if (blend_type) {
- FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
- int blended_color;
- for (int col = 0; col < pixel_count; col ++) {
- FX_BYTE gray = (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) ? set_gray : reset_gray;
- if (clip_scan == NULL || clip_scan[col] == 255) {
- *dest_scan++ = gray;
- *dest_alpha_scan ++ = 255;
- continue;
- }
- int src_alpha = clip_scan[col];
- if (src_alpha == 0) {
- dest_scan ++;
- dest_alpha_scan ++;
- continue;
- }
- int back_alpha = *dest_alpha_scan;
- FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
- *dest_alpha_scan ++ = dest_alpha;
- int alpha_ratio = src_alpha * 255 / dest_alpha;
- if (bNonseparableBlend) {
- blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
- }
- gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, *dest_scan, gray);
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
- dest_scan ++;
- }
- return;
- }
- for (int col = 0; col < pixel_count; col ++) {
- FX_BYTE gray = (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) ? set_gray : reset_gray;
- if (clip_scan == NULL || clip_scan[col] == 255) {
- *dest_scan++ = gray;
- *dest_alpha_scan ++ = 255;
- continue;
- }
- int src_alpha = clip_scan[col];
- if (src_alpha == 0) {
- dest_scan ++;
- dest_alpha_scan ++;
- continue;
- }
- int back_alpha = *dest_alpha_scan;
- FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
- *dest_alpha_scan ++ = dest_alpha;
- int alpha_ratio = src_alpha * 255 / dest_alpha;
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
- dest_scan ++;
- }
-}
-inline void _CompositeRow_8bppRgb2Rgb_NoBlend(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, FX_DWORD* pPalette, int pixel_count,
- int DestBpp, FX_LPCBYTE clip_scan,
- FX_LPCBYTE src_alpha_scan)
-{
- if (src_alpha_scan) {
- int dest_gap = DestBpp - 3;
- FX_ARGB argb = 0;
- for (int col = 0; col < pixel_count; col ++) {
- argb = pPalette[*src_scan];
- int src_r = FXARGB_R(argb);
- int src_g = FXARGB_G(argb);
- int src_b = FXARGB_B(argb);
- src_scan ++;
- FX_BYTE src_alpha = 0;
- if (clip_scan) {
- src_alpha = (*src_alpha_scan++) * (*clip_scan++) / 255;
- } else {
- src_alpha = *src_alpha_scan++;
- }
- if (src_alpha == 255) {
- *dest_scan++ = src_b;
- *dest_scan++ = src_g;
- *dest_scan++ = src_r;
- dest_scan += dest_gap;
- continue;
- }
- if (src_alpha == 0) {
- dest_scan += DestBpp;
- continue;
- }
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, src_alpha);
- dest_scan ++;
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, src_alpha);
- dest_scan ++;
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, src_alpha);
- dest_scan ++;
- dest_scan += dest_gap;
- }
- } else {
- FX_ARGB argb = 0;
- for (int col = 0; col < pixel_count; col ++) {
- argb = pPalette[*src_scan];
- int src_r = FXARGB_R(argb);
- int src_g = FXARGB_G(argb);
- int src_b = FXARGB_B(argb);
- if (clip_scan && clip_scan[col] < 255) {
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, clip_scan[col]);
- dest_scan ++;
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, clip_scan[col]);
- dest_scan ++;
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, clip_scan[col]);
- dest_scan ++;
- } else {
- *dest_scan++ = src_b;
- *dest_scan++ = src_g;
- *dest_scan++ = src_r;
- }
- if (DestBpp == 4) {
- dest_scan++;
- }
- src_scan ++;
- }
- }
-}
-inline void _CompositeRow_1bppRgb2Rgb_NoBlend(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_left,
- FX_DWORD* pPalette, int pixel_count, int DestBpp, FX_LPCBYTE clip_scan)
-{
- int reset_r, reset_g, reset_b;
- int set_r, set_g, set_b;
- reset_r = FXARGB_R(pPalette[0]);
- reset_g = FXARGB_G(pPalette[0]);
- reset_b = FXARGB_B(pPalette[0]);
- set_r = FXARGB_R(pPalette[1]);
- set_g = FXARGB_G(pPalette[1]);
- set_b = FXARGB_B(pPalette[1]);
- for (int col = 0; col < pixel_count; col ++) {
- int src_r, src_g, src_b;
- if (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) {
- src_r = set_r;
- src_g = set_g;
- src_b = set_b;
- } else {
- src_r = reset_r;
- src_g = reset_g;
- src_b = reset_b;
- }
- if (clip_scan && clip_scan[col] < 255) {
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, clip_scan[col]);
- dest_scan ++;
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, clip_scan[col]);
- dest_scan ++;
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, clip_scan[col]);
- dest_scan ++;
- } else {
- *dest_scan++ = src_b;
- *dest_scan++ = src_g;
- *dest_scan++ = src_r;
- }
- if (DestBpp == 4) {
- dest_scan++;
- }
- }
-}
-inline void _CompositeRow_8bppRgb2Argb_NoBlend(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width,
- FX_DWORD* pPalette, FX_LPCBYTE clip_scan,
- FX_LPCBYTE src_alpha_scan)
-{
- if (src_alpha_scan) {
- for (int col = 0; col < width; col ++) {
- FX_ARGB argb = pPalette[*src_scan];
- src_scan ++;
- int src_r = FXARGB_R(argb);
- int src_g = FXARGB_G(argb);
- int src_b = FXARGB_B(argb);
- FX_BYTE back_alpha = dest_scan[3];
- if (back_alpha == 0) {
- if (clip_scan) {
- int src_alpha = clip_scan[col] * (*src_alpha_scan) / 255;
- FXARGB_SETDIB(dest_scan, FXARGB_MAKE(src_alpha, src_r, src_g, src_b));
- } else {
- FXARGB_SETDIB(dest_scan, FXARGB_MAKE(*src_alpha_scan, src_r, src_g, src_b));
- }
- dest_scan += 4;
- src_alpha_scan ++;
- continue;
- }
- FX_BYTE src_alpha;
- if (clip_scan == NULL) {
- src_alpha = *src_alpha_scan ++;
- } else {
- src_alpha = clip_scan[col] * (*src_alpha_scan++) / 255;
- }
- if (src_alpha == 0) {
- dest_scan += 4;
- continue;
- }
- FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
- dest_scan[3] = dest_alpha;
- int alpha_ratio = src_alpha * 255 / dest_alpha;
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);
- dest_scan ++;
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);
- dest_scan ++;
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);
- dest_scan ++;
- dest_scan ++;
- }
- } else
- for (int col = 0; col < width; col ++) {
- FX_ARGB argb = pPalette[*src_scan];
- int src_r = FXARGB_R(argb);
- int src_g = FXARGB_G(argb);
- int src_b = FXARGB_B(argb);
- if (clip_scan == NULL || clip_scan[col] == 255) {
- *dest_scan++ = src_b;
- *dest_scan++ = src_g;
- *dest_scan++ = src_r;
- *dest_scan++ = 255;
- src_scan ++;
- continue;
- }
- int src_alpha = clip_scan[col];
- if (src_alpha == 0) {
- dest_scan += 4;
- src_scan ++;
- continue;
- }
- int back_alpha = dest_scan[3];
- FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
- dest_scan[3] = dest_alpha;
- int alpha_ratio = src_alpha * 255 / dest_alpha;
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);
- dest_scan ++;
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);
- dest_scan ++;
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);
- dest_scan ++;
- dest_scan ++;
- src_scan ++;
- }
-}
-void _CompositeRow_8bppRgb2Rgba_NoBlend(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width,
- FX_DWORD* pPalette, FX_LPCBYTE clip_scan,
- FX_LPBYTE dest_alpha_scan, FX_LPCBYTE src_alpha_scan)
-{
- if (src_alpha_scan) {
- for (int col = 0; col < width; col ++) {
- FX_ARGB argb = pPalette[*src_scan];
- src_scan ++;
- int src_r = FXARGB_R(argb);
- int src_g = FXARGB_G(argb);
- int src_b = FXARGB_B(argb);
- FX_BYTE back_alpha = *dest_alpha_scan;
- if (back_alpha == 0) {
- if (clip_scan) {
- int src_alpha = clip_scan[col] * (*src_alpha_scan) / 255;
- *dest_alpha_scan ++ = src_alpha;
- } else {
- *dest_alpha_scan ++ = *src_alpha_scan;
- }
- *dest_scan ++ = src_b;
- *dest_scan ++ = src_g;
- *dest_scan ++ = src_r;
- src_alpha_scan ++;
- continue;
- }
- FX_BYTE src_alpha;
- if (clip_scan == NULL) {
- src_alpha = *src_alpha_scan++;
- } else {
- src_alpha = clip_scan[col] * (*src_alpha_scan++) / 255;
- }
- if (src_alpha == 0) {
- dest_scan += 3;
- dest_alpha_scan ++;
- continue;
- }
- FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
- *dest_alpha_scan ++ = dest_alpha;
- int alpha_ratio = src_alpha * 255 / dest_alpha;
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);
- dest_scan ++;
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);
- dest_scan ++;
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);
- dest_scan ++;
- }
- } else
- for (int col = 0; col < width; col ++) {
- FX_ARGB argb = pPalette[*src_scan];
- int src_r = FXARGB_R(argb);
- int src_g = FXARGB_G(argb);
- int src_b = FXARGB_B(argb);
- if (clip_scan == NULL || clip_scan[col] == 255) {
- *dest_scan++ = src_b;
- *dest_scan++ = src_g;
- *dest_scan++ = src_r;
- *dest_alpha_scan++ = 255;
- src_scan ++;
- continue;
- }
- int src_alpha = clip_scan[col];
- if (src_alpha == 0) {
- dest_scan += 3;
- dest_alpha_scan ++;
- src_scan ++;
- continue;
- }
- int back_alpha = *dest_alpha_scan;
- FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
- *dest_alpha_scan ++ = dest_alpha;
- int alpha_ratio = src_alpha * 255 / dest_alpha;
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);
- dest_scan ++;
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);
- dest_scan ++;
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);
- dest_scan ++;
- src_scan ++;
- }
-}
-inline void _CompositeRow_1bppRgb2Argb_NoBlend(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_left, int width,
- FX_DWORD* pPalette, FX_LPCBYTE clip_scan)
-{
- int reset_r, reset_g, reset_b;
- int set_r, set_g, set_b;
- reset_r = FXARGB_R(pPalette[0]);
- reset_g = FXARGB_G(pPalette[0]);
- reset_b = FXARGB_B(pPalette[0]);
- set_r = FXARGB_R(pPalette[1]);
- set_g = FXARGB_G(pPalette[1]);
- set_b = FXARGB_B(pPalette[1]);
- for (int col = 0; col < width; col ++) {
- int src_r, src_g, src_b;
- if (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) {
- src_r = set_r;
- src_g = set_g;
- src_b = set_b;
- } else {
- src_r = reset_r;
- src_g = reset_g;
- src_b = reset_b;
- }
- if (clip_scan == NULL || clip_scan[col] == 255) {
- *dest_scan++ = src_b;
- *dest_scan++ = src_g;
- *dest_scan++ = src_r;
- *dest_scan++ = 255;
- continue;
- }
- int src_alpha = clip_scan[col];
- if (src_alpha == 0) {
- dest_scan += 4;
- continue;
- }
- int back_alpha = dest_scan[3];
- FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
- dest_scan[3] = dest_alpha;
- int alpha_ratio = src_alpha * 255 / dest_alpha;
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);
- dest_scan ++;
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);
- dest_scan ++;
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);
- dest_scan ++;
- dest_scan ++;
- }
-}
-void _CompositeRow_1bppRgb2Rgba_NoBlend(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_left, int width,
- FX_DWORD* pPalette, FX_LPCBYTE clip_scan,
- FX_LPBYTE dest_alpha_scan)
-{
- int reset_r, reset_g, reset_b;
- int set_r, set_g, set_b;
- reset_r = FXARGB_R(pPalette[0]);
- reset_g = FXARGB_G(pPalette[0]);
- reset_b = FXARGB_B(pPalette[0]);
- set_r = FXARGB_R(pPalette[1]);
- set_g = FXARGB_G(pPalette[1]);
- set_b = FXARGB_B(pPalette[1]);
- for (int col = 0; col < width; col ++) {
- int src_r, src_g, src_b;
- if (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) {
- src_r = set_r;
- src_g = set_g;
- src_b = set_b;
- } else {
- src_r = reset_r;
- src_g = reset_g;
- src_b = reset_b;
- }
- if (clip_scan == NULL || clip_scan[col] == 255) {
- *dest_scan++ = src_b;
- *dest_scan++ = src_g;
- *dest_scan++ = src_r;
- *dest_alpha_scan++ = 255;
- continue;
- }
- int src_alpha = clip_scan[col];
- if (src_alpha == 0) {
- dest_scan += 3;
- dest_alpha_scan ++;
- continue;
- }
- int back_alpha = *dest_alpha_scan;
- FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
- *dest_alpha_scan ++ = dest_alpha;
- int alpha_ratio = src_alpha * 255 / dest_alpha;
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);
- dest_scan ++;
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);
- dest_scan ++;
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);
- dest_scan ++;
- }
-}
-void _CompositeRow_ByteMask2Argb(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_r, int src_g, int src_b, int pixel_count,
- int blend_type, FX_LPCBYTE clip_scan)
-{
- for (int col = 0; col < pixel_count; col ++) {
- int src_alpha;
- if (clip_scan) {
- src_alpha = mask_alpha * clip_scan[col] * src_scan[col] / 255 / 255;
- } else {
- src_alpha = mask_alpha * src_scan[col] / 255;
- }
- FX_BYTE back_alpha = dest_scan[3];
- if (back_alpha == 0) {
- FXARGB_SETDIB(dest_scan, FXARGB_MAKE(src_alpha, src_r, src_g, src_b));
- dest_scan += 4;
- continue;
- }
- if (src_alpha == 0) {
- dest_scan += 4;
- continue;
- }
- FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
- dest_scan[3] = dest_alpha;
- int alpha_ratio = src_alpha * 255 / dest_alpha;
- if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {
- int blended_colors[3];
- FX_BYTE src_scan[3];
- src_scan[0] = src_b;
- src_scan[1] = src_g;
- src_scan[2] = src_r;
- _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[0], alpha_ratio);
- dest_scan ++;
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[1], alpha_ratio);
- dest_scan ++;
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[2], alpha_ratio);
- } else if (blend_type) {
- int blended = _BLEND(blend_type, *dest_scan, src_b);
- blended = FXDIB_ALPHA_MERGE(src_b, blended, back_alpha);
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
- dest_scan ++;
- blended = _BLEND(blend_type, *dest_scan, src_g);
- blended = FXDIB_ALPHA_MERGE(src_g, blended, back_alpha);
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
- dest_scan ++;
- blended = _BLEND(blend_type, *dest_scan, src_r);
- blended = FXDIB_ALPHA_MERGE(src_r, blended, back_alpha);
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
- } else {
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);
- dest_scan ++;
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);
- dest_scan ++;
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);
- }
- dest_scan += 2;
- }
-}
-void _CompositeRow_ByteMask2Rgba(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_r, int src_g, int src_b, int pixel_count,
- int blend_type, FX_LPCBYTE clip_scan,
- FX_LPBYTE dest_alpha_scan)
-{
- for (int col = 0; col < pixel_count; col ++) {
- int src_alpha;
- if (clip_scan) {
- src_alpha = mask_alpha * clip_scan[col] * src_scan[col] / 255 / 255;
- } else {
- src_alpha = mask_alpha * src_scan[col] / 255;
- }
- FX_BYTE back_alpha = *dest_alpha_scan;
- if (back_alpha == 0) {
- *dest_scan ++ = src_b;
- *dest_scan ++ = src_g;
- *dest_scan ++ = src_r;
- *dest_alpha_scan ++ = src_alpha;
- continue;
- }
- if (src_alpha == 0) {
- dest_scan += 3;
- dest_alpha_scan ++;
- continue;
- }
- FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
- *dest_alpha_scan ++ = dest_alpha;
- int alpha_ratio = src_alpha * 255 / dest_alpha;
- if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {
- int blended_colors[3];
- FX_BYTE src_scan[3];
- src_scan[0] = src_b;
- src_scan[1] = src_g;
- src_scan[2] = src_r;
- _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[0], alpha_ratio);
- dest_scan ++;
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[1], alpha_ratio);
- dest_scan ++;
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[2], alpha_ratio);
- dest_scan ++;
- } else if (blend_type) {
- int blended = _BLEND(blend_type, *dest_scan, src_b);
- blended = FXDIB_ALPHA_MERGE(src_b, blended, back_alpha);
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
- dest_scan ++;
- blended = _BLEND(blend_type, *dest_scan, src_g);
- blended = FXDIB_ALPHA_MERGE(src_g, blended, back_alpha);
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
- dest_scan ++;
- blended = _BLEND(blend_type, *dest_scan, src_r);
- blended = FXDIB_ALPHA_MERGE(src_r, blended, back_alpha);
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
- dest_scan ++;
- } else {
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);
- dest_scan ++;
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);
- dest_scan ++;
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);
- dest_scan ++;
- }
- }
-}
-void _CompositeRow_ByteMask2Rgb(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_r, int src_g, int src_b, int pixel_count,
- int blend_type, int Bpp, FX_LPCBYTE clip_scan)
-{
- for (int col = 0; col < pixel_count; col ++) {
- int src_alpha;
- if (clip_scan) {
- src_alpha = mask_alpha * clip_scan[col] * src_scan[col] / 255 / 255;
- } else {
- src_alpha = mask_alpha * src_scan[col] / 255;
- }
- if (src_alpha == 0) {
- dest_scan += Bpp;
- continue;
- }
- if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {
- int blended_colors[3];
- FX_BYTE src_scan[3];
- src_scan[0] = src_b;
- src_scan[1] = src_g;
- src_scan[2] = src_r;
- _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[0], src_alpha);
- dest_scan ++;
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[1], src_alpha);
- dest_scan ++;
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[2], src_alpha);
- } else if (blend_type) {
- int blended = _BLEND(blend_type, *dest_scan, src_b);
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, src_alpha);
- dest_scan ++;
- blended = _BLEND(blend_type, *dest_scan, src_g);
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, src_alpha);
- dest_scan ++;
- blended = _BLEND(blend_type, *dest_scan, src_r);
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, src_alpha);
- } else {
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, src_alpha);
- dest_scan ++;
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, src_alpha);
- dest_scan ++;
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, src_alpha);
- }
- dest_scan += Bpp - 2;
- }
-}
-void _CompositeRow_ByteMask2Mask(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int pixel_count,
- FX_LPCBYTE clip_scan)
-{
- for (int col = 0; col < pixel_count; col ++) {
- int src_alpha;
- if (clip_scan) {
- src_alpha = mask_alpha * clip_scan[col] * src_scan[col] / 255 / 255;
- } else {
- src_alpha = mask_alpha * src_scan[col] / 255;
- }
- FX_BYTE back_alpha = *dest_scan;
- if (!back_alpha) {
- *dest_scan = src_alpha;
- } else if (src_alpha) {
- *dest_scan = back_alpha + src_alpha - back_alpha * src_alpha / 255;
- }
- dest_scan ++;
- }
-}
-void _CompositeRow_ByteMask2Gray(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_gray,
- int pixel_count, FX_LPCBYTE clip_scan)
-{
- for (int col = 0; col < pixel_count; col ++) {
- int src_alpha;
- if (clip_scan) {
- src_alpha = mask_alpha * clip_scan[col] * src_scan[col] / 255 / 255;
- } else {
- src_alpha = mask_alpha * src_scan[col] / 255;
- }
- if (src_alpha) {
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_gray, src_alpha);
- }
- dest_scan ++;
- }
-}
-void _CompositeRow_ByteMask2Graya(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_gray,
- int pixel_count, FX_LPCBYTE clip_scan,
- FX_LPBYTE dest_alpha_scan)
-{
- for (int col = 0; col < pixel_count; col ++) {
- int src_alpha;
- if (clip_scan) {
- src_alpha = mask_alpha * clip_scan[col] * src_scan[col] / 255 / 255;
- } else {
- src_alpha = mask_alpha * src_scan[col] / 255;
- }
- FX_BYTE back_alpha = *dest_alpha_scan;
- if (back_alpha == 0) {
- *dest_scan ++ = src_gray;
- *dest_alpha_scan ++ = src_alpha;
- continue;
- }
- if (src_alpha == 0) {
- dest_scan ++;
- dest_alpha_scan ++;
- continue;
- }
- FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
- *dest_alpha_scan++ = dest_alpha;
- int alpha_ratio = src_alpha * 255 / dest_alpha;
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_gray, alpha_ratio);
- dest_scan ++;
- }
-}
-void _CompositeRow_BitMask2Argb(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_r, int src_g, int src_b,
- int src_left, int pixel_count, int blend_type, FX_LPCBYTE clip_scan)
-{
- if (blend_type == FXDIB_BLEND_NORMAL && clip_scan == NULL && mask_alpha == 255) {
- FX_ARGB argb = FXARGB_MAKE(0xff, src_r, src_g, src_b);
- for (int col = 0; col < pixel_count; col ++) {
- if (src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8))) {
- FXARGB_SETDIB(dest_scan, argb);
- }
- dest_scan += 4;
- }
- return;
- }
- for (int col = 0; col < pixel_count; col ++) {
- if (!(src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8)))) {
- dest_scan += 4;
- continue;
- }
- int src_alpha;
- if (clip_scan) {
- src_alpha = mask_alpha * clip_scan[col] / 255;
- } else {
- src_alpha = mask_alpha;
- }
- FX_BYTE back_alpha = dest_scan[3];
- if (back_alpha == 0) {
- FXARGB_SETDIB(dest_scan, FXARGB_MAKE(src_alpha, src_r, src_g, src_b));
- dest_scan += 4;
- continue;
- }
- FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
- dest_scan[3] = dest_alpha;
- int alpha_ratio = src_alpha * 255 / dest_alpha;
- if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {
- int blended_colors[3];
- FX_BYTE src_scan[3];
- src_scan[0] = src_b;
- src_scan[1] = src_g;
- src_scan[2] = src_r;
- _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[0], alpha_ratio);
- dest_scan ++;
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[1], alpha_ratio);
- dest_scan ++;
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[2], alpha_ratio);
- } else if (blend_type) {
- int blended = _BLEND(blend_type, *dest_scan, src_b);
- blended = FXDIB_ALPHA_MERGE(src_b, blended, back_alpha);
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
- dest_scan ++;
- blended = _BLEND(blend_type, *dest_scan, src_g);
- blended = FXDIB_ALPHA_MERGE(src_g, blended, back_alpha);
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
- dest_scan ++;
- blended = _BLEND(blend_type, *dest_scan, src_r);
- blended = FXDIB_ALPHA_MERGE(src_r, blended, back_alpha);
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
- } else {
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);
- dest_scan ++;
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);
- dest_scan ++;
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);
- }
- dest_scan += 2;
- }
-}
-void _CompositeRow_BitMask2Rgba(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_r, int src_g, int src_b,
- int src_left, int pixel_count, int blend_type, FX_LPCBYTE clip_scan,
- FX_LPBYTE dest_alpha_scan)
-{
- if (blend_type == FXDIB_BLEND_NORMAL && clip_scan == NULL && mask_alpha == 255) {
- for (int col = 0; col < pixel_count; col ++) {
- if (src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8))) {
- dest_scan[0] = src_b;
- dest_scan[1] = src_g;
- dest_scan[2] = src_r;
- *dest_alpha_scan = mask_alpha;
- }
- dest_scan += 3;
- dest_alpha_scan ++;
- }
- return;
- }
- for (int col = 0; col < pixel_count; col ++) {
- if (!(src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8)))) {
- dest_scan += 3;
- dest_alpha_scan ++;
- continue;
- }
- int src_alpha;
- if (clip_scan) {
- src_alpha = mask_alpha * clip_scan[col] / 255;
- } else {
- src_alpha = mask_alpha;
- }
- FX_BYTE back_alpha = dest_scan[3];
- if (back_alpha == 0) {
- *dest_scan ++ = src_b;
- *dest_scan ++ = src_g;
- *dest_scan ++ = src_r;
- *dest_alpha_scan ++ = mask_alpha;
- continue;
- }
- FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
- *dest_alpha_scan ++ = dest_alpha;
- int alpha_ratio = src_alpha * 255 / dest_alpha;
- if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {
- int blended_colors[3];
- FX_BYTE src_scan[3];
- src_scan[0] = src_b;
- src_scan[1] = src_g;
- src_scan[2] = src_r;
- _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[0], alpha_ratio);
- dest_scan ++;
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[1], alpha_ratio);
- dest_scan ++;
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[2], alpha_ratio);
- dest_scan ++;
- } else if (blend_type) {
- int blended = _BLEND(blend_type, *dest_scan, src_b);
- blended = FXDIB_ALPHA_MERGE(src_b, blended, back_alpha);
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
- dest_scan ++;
- blended = _BLEND(blend_type, *dest_scan, src_g);
- blended = FXDIB_ALPHA_MERGE(src_g, blended, back_alpha);
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
- dest_scan ++;
- blended = _BLEND(blend_type, *dest_scan, src_r);
- blended = FXDIB_ALPHA_MERGE(src_r, blended, back_alpha);
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
- dest_scan ++;
- } else {
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);
- dest_scan ++;
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);
- dest_scan ++;
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);
- dest_scan ++;
- }
- }
-}
-void _CompositeRow_BitMask2Rgb(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_r, int src_g, int src_b,
- int src_left, int pixel_count, int blend_type, int Bpp, FX_LPCBYTE clip_scan)
-{
- if (blend_type == FXDIB_BLEND_NORMAL && clip_scan == NULL && mask_alpha == 255) {
- for (int col = 0; col < pixel_count; col ++) {
- if (src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8))) {
- dest_scan[2] = src_r;
- dest_scan[1] = src_g;
- dest_scan[0] = src_b;
- }
- dest_scan += Bpp;
- }
- return;
- }
- for (int col = 0; col < pixel_count; col ++) {
- if (!(src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8)))) {
- dest_scan += Bpp;
- continue;
- }
- int src_alpha;
- if (clip_scan) {
- src_alpha = mask_alpha * clip_scan[col] / 255;
- } else {
- src_alpha = mask_alpha;
- }
- if (src_alpha == 0) {
- dest_scan += Bpp;
- continue;
- }
- if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {
- int blended_colors[3];
- FX_BYTE src_scan[3];
- src_scan[0] = src_b;
- src_scan[1] = src_g;
- src_scan[2] = src_r;
- _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[0], src_alpha);
- dest_scan ++;
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[1], src_alpha);
- dest_scan ++;
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[2], src_alpha);
- } else if (blend_type) {
- int blended = _BLEND(blend_type, *dest_scan, src_b);
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, src_alpha);
- dest_scan++;
- blended = _BLEND(blend_type, *dest_scan, src_g);
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, src_alpha);
- dest_scan++;
- blended = _BLEND(blend_type, *dest_scan, src_r);
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, src_alpha);
- } else {
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, src_alpha);
- dest_scan ++;
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, src_alpha);
- dest_scan ++;
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, src_alpha);
- }
- dest_scan += Bpp - 2;
- }
-}
-void _CompositeRow_BitMask2Mask(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_left,
- int pixel_count, FX_LPCBYTE clip_scan)
-{
- for (int col = 0; col < pixel_count; col ++) {
- if (!(src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8)))) {
- dest_scan ++;
- continue;
- }
- int src_alpha;
- if (clip_scan) {
- src_alpha = mask_alpha * clip_scan[col] / 255;
- } else {
- src_alpha = mask_alpha;
- }
- FX_BYTE back_alpha = *dest_scan;
- if (!back_alpha) {
- *dest_scan = src_alpha;
- } else if (src_alpha) {
- *dest_scan = back_alpha + src_alpha - back_alpha * src_alpha / 255;
- }
- dest_scan ++;
- }
-}
-void _CompositeRow_BitMask2Gray(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_gray,
- int src_left, int pixel_count, FX_LPCBYTE clip_scan)
-{
- for (int col = 0; col < pixel_count; col ++) {
- if (!(src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8)))) {
- dest_scan ++;
- continue;
- }
- int src_alpha;
- if (clip_scan) {
- src_alpha = mask_alpha * clip_scan[col] / 255;
- } else {
- src_alpha = mask_alpha;
- }
- if (src_alpha) {
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_gray, src_alpha);
- }
- dest_scan ++;
- }
-}
-void _CompositeRow_BitMask2Graya(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_gray,
- int src_left, int pixel_count, FX_LPCBYTE clip_scan,
- FX_LPBYTE dest_alpha_scan)
-{
- for (int col = 0; col < pixel_count; col ++) {
- if (!(src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8)))) {
- dest_scan ++;
- dest_alpha_scan ++;
- continue;
- }
- int src_alpha;
- if (clip_scan) {
- src_alpha = mask_alpha * clip_scan[col] / 255;
- } else {
- src_alpha = mask_alpha;
- }
- FX_BYTE back_alpha = *dest_alpha_scan;
- if (back_alpha == 0) {
- *dest_scan ++ = src_gray;
- *dest_alpha_scan ++ = src_alpha;
- continue;
- }
- if (src_alpha == 0) {
- dest_scan ++;
- dest_alpha_scan ++;
- continue;
- }
- FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
- *dest_alpha_scan++ = dest_alpha;
- int alpha_ratio = src_alpha * 255 / dest_alpha;
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_gray, alpha_ratio);
- dest_scan ++;
- }
-}
-void _CompositeRow_Argb2Argb_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int pixel_count, int blend_type, FX_LPCBYTE clip_scan)
-{
- int blended_colors[3];
- FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
- for (int col = 0; col < pixel_count; col ++) {
- FX_BYTE back_alpha = dest_scan[3];
- if (back_alpha == 0) {
- if (clip_scan) {
- int src_alpha = clip_scan[col] * src_scan[3] / 255;
- dest_scan[3] = src_alpha;
- dest_scan[0] = src_scan[2];
- dest_scan[1] = src_scan[1];
- dest_scan[2] = src_scan[0];
- } else {
- FXARGB_RGBORDERCOPY(dest_scan, src_scan);
- }
- dest_scan += 4;
- src_scan += 4;
- continue;
- }
- FX_BYTE src_alpha;
- if (clip_scan == NULL) {
- src_alpha = src_scan[3];
- } else {
- src_alpha = clip_scan[col] * src_scan[3] / 255;
- }
- if (src_alpha == 0) {
- dest_scan += 4;
- src_scan += 4;
- continue;
- }
- FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
- dest_scan[3] = dest_alpha;
- int alpha_ratio = src_alpha * 255 / dest_alpha;
- if (bNonseparableBlend) {
- FX_BYTE dest_scan_o[3];
- dest_scan_o[0] = dest_scan[2];
- dest_scan_o[1] = dest_scan[1];
- dest_scan_o[2] = dest_scan[0];
- _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);
- }
- for (int color = 0; color < 3; color ++) {
- int index = 2 - color;
- if (blend_type) {
- int blended = bNonseparableBlend ? blended_colors[color] :
- _BLEND(blend_type, dest_scan[index], *src_scan);
- blended = FXDIB_ALPHA_MERGE(*src_scan, blended, back_alpha);
- dest_scan[index] = FXDIB_ALPHA_MERGE(dest_scan[index], blended, alpha_ratio);
- } else {
- dest_scan[index] = FXDIB_ALPHA_MERGE(dest_scan[index], *src_scan, alpha_ratio);
- }
- src_scan ++;
- }
- dest_scan += 4;
- src_scan++;
- }
-}
-void _CompositeRow_Rgb2Argb_Blend_NoClip_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int src_Bpp)
-{
- int blended_colors[3];
- FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
- int src_gap = src_Bpp - 3;
- for (int col = 0; col < width; col ++) {
- FX_BYTE back_alpha = dest_scan[3];
- if (back_alpha == 0) {
- if (src_Bpp == 4) {
- FXARGB_SETRGBORDERDIB(dest_scan, 0xff000000 | FXARGB_GETDIB(src_scan));
- } else {
- FXARGB_SETRGBORDERDIB(dest_scan, FXARGB_MAKE(0xff, src_scan[2], src_scan[1], src_scan[0]));
- }
- dest_scan += 4;
- src_scan += src_Bpp;
- continue;
- }
- dest_scan[3] = 0xff;
- if (bNonseparableBlend) {
- FX_BYTE dest_scan_o[3];
- dest_scan_o[0] = dest_scan[2];
- dest_scan_o[1] = dest_scan[1];
- dest_scan_o[2] = dest_scan[0];
- _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);
- }
- for (int color = 0; color < 3; color ++) {
- int index = 2 - color;
- int src_color = FX_GAMMA(*src_scan);
- int blended = bNonseparableBlend ? blended_colors[color] :
- _BLEND(blend_type, dest_scan[index], src_color);
- dest_scan[index] = FXDIB_ALPHA_MERGE(src_color, blended, back_alpha);
- src_scan ++;
- }
- dest_scan += 4;
- src_scan += src_gap;
- }
-}
-inline void _CompositeRow_Argb2Rgb_Blend_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int dest_Bpp, FX_LPCBYTE clip_scan)
-{
- int blended_colors[3];
- FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
- for (int col = 0; col < width; col ++) {
- FX_BYTE src_alpha;
- if (clip_scan) {
- src_alpha = src_scan[3] * (*clip_scan++) / 255;
- } else {
- src_alpha = src_scan[3];
- }
- if (src_alpha == 0) {
- dest_scan += dest_Bpp;
- src_scan += 4;
- continue;
- }
- if (bNonseparableBlend) {
- FX_BYTE dest_scan_o[3];
- dest_scan_o[0] = dest_scan[2];
- dest_scan_o[1] = dest_scan[1];
- dest_scan_o[2] = dest_scan[0];
- _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);
- }
- for (int color = 0; color < 3; color ++) {
- int index = 2 - color;
- int back_color = FX_GAMMA(dest_scan[index]);
- int blended = bNonseparableBlend ? blended_colors[color] :
- _BLEND(blend_type, back_color, *src_scan);
- dest_scan[index] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(back_color, blended, src_alpha));
- src_scan ++;
- }
- dest_scan += dest_Bpp;
- src_scan ++;
- }
-}
-inline void _CompositeRow_Rgb2Argb_NoBlend_NoClip_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int src_Bpp)
-{
- int src_gap = src_Bpp - 3;
- for (int col = 0; col < width; col ++) {
- if (src_Bpp == 4) {
- FXARGB_SETRGBORDERDIB(dest_scan, 0xff000000 | FXARGB_GETDIB(src_scan));
- } else {
- FXARGB_SETRGBORDERDIB(dest_scan, FXARGB_MAKE(0xff, src_scan[2], src_scan[1], src_scan[0]));
- }
- dest_scan += 4;
- src_scan += src_Bpp;
- }
-}
-inline void _CompositeRow_Rgb2Rgb_Blend_NoClip_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int dest_Bpp, int src_Bpp)
-{
- int blended_colors[3];
- FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
- int src_gap = src_Bpp - 3;
- for (int col = 0; col < width; col ++) {
- if (bNonseparableBlend) {
- FX_BYTE dest_scan_o[3];
- dest_scan_o[0] = dest_scan[2];
- dest_scan_o[1] = dest_scan[1];
- dest_scan_o[2] = dest_scan[0];
- _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);
- }
- for (int color = 0; color < 3; color ++) {
- int index = 2 - color;
- int back_color = FX_GAMMA(dest_scan[index]);
- int src_color = FX_GAMMA(*src_scan);
- int blended = bNonseparableBlend ? blended_colors[color] :
- _BLEND(blend_type, back_color, src_color);
- dest_scan[index] = FX_GAMMA_INVERSE(blended);
- src_scan ++;
- }
- dest_scan += dest_Bpp;
- src_scan += src_gap;
- }
-}
-inline void _CompositeRow_Argb2Rgb_NoBlend_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int dest_Bpp, FX_LPCBYTE clip_scan)
-{
- for (int col = 0; col < width; col ++) {
- FX_BYTE src_alpha;
- if (clip_scan) {
- src_alpha = src_scan[3] * (*clip_scan++) / 255;
- } else {
- src_alpha = src_scan[3];
- }
- if (src_alpha == 255) {
- dest_scan[2] = FX_GAMMA_INVERSE(*src_scan++);
- dest_scan[1] = FX_GAMMA_INVERSE(*src_scan++);
- dest_scan[0] = FX_GAMMA_INVERSE(*src_scan++);
- dest_scan += dest_Bpp;
- src_scan ++;
- continue;
- }
- if (src_alpha == 0) {
- dest_scan += dest_Bpp;
- src_scan += 4;
- continue;
- }
- for (int color = 0; color < 3; color ++) {
- int index = 2 - color;
- dest_scan[index] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[index]), *src_scan, src_alpha));
- src_scan ++;
- }
- dest_scan += dest_Bpp;
- src_scan ++;
- }
-}
-inline void _CompositeRow_Rgb2Rgb_NoBlend_NoClip_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int dest_Bpp, int src_Bpp)
-{
- for (int col = 0; col < width; col ++) {
- dest_scan[2] = src_scan[0];
- dest_scan[1] = src_scan[1];
- dest_scan[0] = src_scan[2];
- dest_scan += dest_Bpp;
- src_scan += src_Bpp;
- }
-}
-inline void _CompositeRow_Rgb2Argb_Blend_Clip_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int src_Bpp, FX_LPCBYTE clip_scan)
-{
- int blended_colors[3];
- FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
- int src_gap = src_Bpp - 3;
- for (int col = 0; col < width; col ++) {
- int src_alpha = *clip_scan ++;
- FX_BYTE back_alpha = dest_scan[3];
- if (back_alpha == 0) {
- dest_scan[2] = FX_GAMMA(*src_scan++);
- dest_scan[1] = FX_GAMMA(*src_scan++);
- dest_scan[0] = FX_GAMMA(*src_scan++);
- src_scan += src_gap;
- dest_scan += 4;
- continue;
- }
- if (src_alpha == 0) {
- dest_scan += 4;
- src_scan += src_Bpp;
- continue;
- }
- FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
- dest_scan[3] = dest_alpha;
- int alpha_ratio = src_alpha * 255 / dest_alpha;
- if (bNonseparableBlend) {
- FX_BYTE dest_scan_o[3];
- dest_scan_o[0] = dest_scan[2];
- dest_scan_o[1] = dest_scan[1];
- dest_scan_o[2] = dest_scan[0];
- _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);
- }
- for (int color = 0; color < 3; color ++) {
- int index = 2 - color;
- int src_color = FX_GAMMA(*src_scan);
- int blended = bNonseparableBlend ? blended_colors[color] :
- _BLEND(blend_type, dest_scan[index], src_color);
- blended = FXDIB_ALPHA_MERGE(src_color, blended, back_alpha);
- dest_scan[index] = FXDIB_ALPHA_MERGE(dest_scan[index], blended, alpha_ratio);
- src_scan ++;
- }
- dest_scan += 4;
- src_scan += src_gap;
- }
-}
-inline void _CompositeRow_Rgb2Rgb_Blend_Clip_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int dest_Bpp, int src_Bpp, FX_LPCBYTE clip_scan)
-{
- int blended_colors[3];
- FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
- int src_gap = src_Bpp - 3;
- for (int col = 0; col < width; col ++) {
- FX_BYTE src_alpha = *clip_scan ++;
- if (src_alpha == 0) {
- dest_scan += dest_Bpp;
- src_scan += src_Bpp;
- continue;
- }
- if (bNonseparableBlend) {
- FX_BYTE dest_scan_o[3];
- dest_scan_o[0] = dest_scan[2];
- dest_scan_o[1] = dest_scan[1];
- dest_scan_o[2] = dest_scan[0];
- _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);
- }
- for (int color = 0; color < 3; color ++) {
- int index = 2 - color;
- int src_color = FX_GAMMA(*src_scan);
- int back_color = FX_GAMMA(dest_scan[index]);
- int blended = bNonseparableBlend ? blended_colors[color] :
- _BLEND(blend_type, back_color, src_color);
- dest_scan[index] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(back_color, blended, src_alpha));
- src_scan ++;
- }
- dest_scan += dest_Bpp;
- src_scan += src_gap;
- }
-}
-inline void _CompositeRow_Rgb2Argb_NoBlend_Clip_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int src_Bpp, FX_LPCBYTE clip_scan)
-{
- int src_gap = src_Bpp - 3;
- for (int col = 0; col < width; col ++) {
- int src_alpha = clip_scan[col];
- if (src_alpha == 255) {
- dest_scan[2] = FX_GAMMA(*src_scan++);
- dest_scan[1] = FX_GAMMA(*src_scan++);
- dest_scan[0] = FX_GAMMA(*src_scan++);
- dest_scan[3] = 255;
- dest_scan += 4;
- src_scan += src_gap;
- continue;
- }
- if (src_alpha == 0) {
- dest_scan += 4;
- src_scan += src_Bpp;
- continue;
- }
- int back_alpha = dest_scan[3];
- FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
- dest_scan[3] = dest_alpha;
- int alpha_ratio = src_alpha * 255 / dest_alpha;
- for (int color = 0; color < 3; color ++) {
- int index = 2 - color;
- dest_scan[index] = FXDIB_ALPHA_MERGE(dest_scan[index], FX_GAMMA(*src_scan), alpha_ratio);
- src_scan ++;
- }
- dest_scan += 4;
- src_scan += src_gap;
- }
-}
-inline void _CompositeRow_Rgb2Rgb_NoBlend_Clip_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int dest_Bpp, int src_Bpp, FX_LPCBYTE clip_scan)
-{
- for (int col = 0; col < width; col ++) {
- int src_alpha = clip_scan[col];
- if (src_alpha == 255) {
- dest_scan[2] = src_scan[0];
- dest_scan[1] = src_scan[1];
- dest_scan[0] = src_scan[2];
- } else if (src_alpha) {
- dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), FX_GAMMA(*src_scan), src_alpha));
- src_scan ++;
- dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), FX_GAMMA(*src_scan), src_alpha));
- src_scan ++;
- dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), FX_GAMMA(*src_scan), src_alpha));
- dest_scan += dest_Bpp;
- src_scan += src_Bpp - 2;
- continue;
- }
- dest_scan += dest_Bpp;
- src_scan += src_Bpp;
- }
-}
-inline void _CompositeRow_8bppRgb2Rgb_NoBlend_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, FX_ARGB* pPalette, int pixel_count,
- int DestBpp, FX_LPCBYTE clip_scan)
-{
- for (int col = 0; col < pixel_count; col ++) {
- FX_ARGB argb = pPalette ? pPalette[*src_scan] : (*src_scan) * 0x010101;
- int src_r = FXARGB_R(argb);
- int src_g = FXARGB_G(argb);
- int src_b = FXARGB_B(argb);
- if (clip_scan && clip_scan[col] < 255) {
- dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], src_b, clip_scan[col]);
- dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], src_g, clip_scan[col]);
- dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], src_r, clip_scan[col]);
- } else {
- dest_scan[2] = src_b;
- dest_scan[1] = src_g;
- dest_scan[0] = src_r;
- }
- dest_scan += DestBpp;
- src_scan ++;
- }
-}
-inline void _CompositeRow_1bppRgb2Rgb_NoBlend_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_left,
- FX_ARGB* pPalette, int pixel_count, int DestBpp, FX_LPCBYTE clip_scan)
-{
- int reset_r, reset_g, reset_b;
- int set_r, set_g, set_b;
- if (pPalette) {
- reset_r = FXARGB_R(pPalette[0]);
- reset_g = FXARGB_G(pPalette[0]);
- reset_b = FXARGB_B(pPalette[0]);
- set_r = FXARGB_R(pPalette[1]);
- set_g = FXARGB_G(pPalette[1]);
- set_b = FXARGB_B(pPalette[1]);
- } else {
- reset_r = reset_g = reset_b = 0;
- set_r = set_g = set_b = 255;
- }
- for (int col = 0; col < pixel_count; col ++) {
- int src_r, src_g, src_b;
- if (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) {
- src_r = set_r;
- src_g = set_g;
- src_b = set_b;
- } else {
- src_r = reset_r;
- src_g = reset_g;
- src_b = reset_b;
- }
- if (clip_scan && clip_scan[col] < 255) {
- dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], src_b, clip_scan[col]);
- dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], src_g, clip_scan[col]);
- dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], src_r, clip_scan[col]);
- } else {
- dest_scan[2] = src_b;
- dest_scan[1] = src_g;
- dest_scan[0] = src_r;
- }
- dest_scan += DestBpp;
- }
-}
-inline void _CompositeRow_8bppRgb2Argb_NoBlend_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width,
- FX_ARGB* pPalette, FX_LPCBYTE clip_scan)
-{
- for (int col = 0; col < width; col ++) {
- int src_r, src_g, src_b;
- if (pPalette) {
- FX_ARGB argb = pPalette[*src_scan];
- src_r = FXARGB_R(argb);
- src_g = FXARGB_G(argb);
- src_b = FXARGB_B(argb);
- } else {
- src_r = src_g = src_b = *src_scan;
- }
- if (clip_scan == NULL || clip_scan[col] == 255) {
- dest_scan[2] = FX_GAMMA(src_b);
- dest_scan[1] = FX_GAMMA(src_g);
- dest_scan[0] = FX_GAMMA(src_r);
- dest_scan[3] = 255;
- src_scan ++;
- dest_scan += 4;
- continue;
- }
- int src_alpha = clip_scan[col];
- if (src_alpha == 0) {
- dest_scan += 4;
- src_scan ++;
- continue;
- }
- int back_alpha = dest_scan[3];
- FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
- dest_scan[3] = dest_alpha;
- int alpha_ratio = src_alpha * 255 / dest_alpha;
- dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], FX_GAMMA(src_b), alpha_ratio);
- dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], FX_GAMMA(src_g), alpha_ratio);
- dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], FX_GAMMA(src_r), alpha_ratio);
- dest_scan += 4;
- src_scan ++;
- }
-}
-inline void _CompositeRow_1bppRgb2Argb_NoBlend_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_left, int width,
- FX_ARGB* pPalette, FX_LPCBYTE clip_scan)
-{
- int reset_r, reset_g, reset_b;
- int set_r, set_g, set_b;
- if (pPalette) {
- reset_r = FXARGB_R(pPalette[0]);
- reset_g = FXARGB_G(pPalette[0]);
- reset_b = FXARGB_B(pPalette[0]);
- set_r = FXARGB_R(pPalette[1]);
- set_g = FXARGB_G(pPalette[1]);
- set_b = FXARGB_B(pPalette[1]);
- } else {
- reset_r = reset_g = reset_b = 0;
- set_r = set_g = set_b = 255;
- }
- for (int col = 0; col < width; col ++) {
- int src_r, src_g, src_b;
- if (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) {
- src_r = set_r;
- src_g = set_g;
- src_b = set_b;
- } else {
- src_r = reset_r;
- src_g = reset_g;
- src_b = reset_b;
- }
- if (clip_scan == NULL || clip_scan[col] == 255) {
- dest_scan[2] = FX_GAMMA(src_b);
- dest_scan[1] = FX_GAMMA(src_g);
- dest_scan[0] = FX_GAMMA(src_r);
- dest_scan[3] = 255;
- dest_scan += 4;
- continue;
- }
- int src_alpha = clip_scan[col];
- if (src_alpha == 0) {
- dest_scan += 4;
- continue;
- }
- int back_alpha = dest_scan[3];
- FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
- dest_scan[3] = dest_alpha;
- int alpha_ratio = src_alpha * 255 / dest_alpha;
- dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], FX_GAMMA(src_b), alpha_ratio);
- dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], FX_GAMMA(src_g), alpha_ratio);
- dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], FX_GAMMA(src_r), alpha_ratio);
- dest_scan += 4;
- }
-}
-void _CompositeRow_ByteMask2Argb_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_r, int src_g, int src_b, int pixel_count,
- int blend_type, FX_LPCBYTE clip_scan)
-{
- for (int col = 0; col < pixel_count; col ++) {
- int src_alpha;
- if (clip_scan) {
- src_alpha = mask_alpha * clip_scan[col] * src_scan[col] / 255 / 255;
- } else {
- src_alpha = mask_alpha * src_scan[col] / 255;
- }
- FX_BYTE back_alpha = dest_scan[3];
- if (back_alpha == 0) {
- FXARGB_SETRGBORDERDIB(dest_scan, FXARGB_MAKE(src_alpha, src_r, src_g, src_b));
- dest_scan += 4;
- continue;
- }
- if (src_alpha == 0) {
- dest_scan += 4;
- continue;
- }
- FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
- dest_scan[3] = dest_alpha;
- int alpha_ratio = src_alpha * 255 / dest_alpha;
- if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {
- int blended_colors[3];
- FX_BYTE src_scan[3];
- FX_BYTE dest_scan_o[3];
- src_scan[0] = src_b;
- src_scan[1] = src_g;
- src_scan[2] = src_r;
- dest_scan_o[0] = dest_scan[2];
- dest_scan_o[1] = dest_scan[1];
- dest_scan_o[2] = dest_scan[0];
- _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);
- dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], blended_colors[0], alpha_ratio);
- dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], blended_colors[1], alpha_ratio);
- dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], blended_colors[2], alpha_ratio);
- } else if (blend_type) {
- int blended = _BLEND(blend_type, dest_scan[2], src_b);
- blended = FXDIB_ALPHA_MERGE(src_b, blended, back_alpha);
- dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], blended, alpha_ratio);
- blended = _BLEND(blend_type, dest_scan[1], src_g);
- blended = FXDIB_ALPHA_MERGE(src_g, blended, back_alpha);
- dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], blended, alpha_ratio);
- blended = _BLEND(blend_type, dest_scan[0], src_r);
- blended = FXDIB_ALPHA_MERGE(src_r, blended, back_alpha);
- dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], blended, alpha_ratio);
- } else {
- dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], src_b, alpha_ratio);
- dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], src_g, alpha_ratio);
- dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], src_r, alpha_ratio);
- }
- dest_scan += 4;
- }
-}
-void _CompositeRow_ByteMask2Rgb_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_r, int src_g, int src_b, int pixel_count,
- int blend_type, int Bpp, FX_LPCBYTE clip_scan)
-{
- for (int col = 0; col < pixel_count; col ++) {
- int src_alpha;
- if (clip_scan) {
- src_alpha = mask_alpha * clip_scan[col] * src_scan[col] / 255 / 255;
- } else {
- src_alpha = mask_alpha * src_scan[col] / 255;
- }
- if (src_alpha == 0) {
- dest_scan += Bpp;
- continue;
- }
- if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {
- int blended_colors[3];
- FX_BYTE src_scan[3];
- FX_BYTE dest_scan_o[3];
- src_scan[0] = src_b;
- src_scan[1] = src_g;
- src_scan[2] = src_r;
- dest_scan_o[0] = dest_scan[2];
- dest_scan_o[1] = dest_scan[1];
- dest_scan_o[2] = dest_scan[0];
- _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);
- dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], blended_colors[0], src_alpha);
- dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], blended_colors[1], src_alpha);
- dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], blended_colors[2], src_alpha);
- } else if (blend_type) {
- int blended = _BLEND(blend_type, dest_scan[2], src_b);
- dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], blended, src_alpha);
- blended = _BLEND(blend_type, dest_scan[1], src_g);
- dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], blended, src_alpha);
- blended = _BLEND(blend_type, dest_scan[0], src_r);
- dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], blended, src_alpha);
- } else {
- dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], src_b, src_alpha);
- dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], src_g, src_alpha);
- dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], src_r, src_alpha);
- }
- dest_scan += Bpp;
- }
-}
-void _CompositeRow_BitMask2Argb_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_r, int src_g, int src_b,
- int src_left, int pixel_count, int blend_type, FX_LPCBYTE clip_scan)
-{
- if (blend_type == FXDIB_BLEND_NORMAL && clip_scan == NULL && mask_alpha == 255) {
- FX_ARGB argb = FXARGB_MAKE(0xff, src_r, src_g, src_b);
- for (int col = 0; col < pixel_count; col ++) {
- if (src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8))) {
- FXARGB_SETRGBORDERDIB(dest_scan, argb);
- }
- dest_scan += 4;
- }
- return;
- }
- for (int col = 0; col < pixel_count; col ++) {
- if (!(src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8)))) {
- dest_scan += 4;
- continue;
- }
- int src_alpha;
- if (clip_scan) {
- src_alpha = mask_alpha * clip_scan[col] / 255;
- } else {
- src_alpha = mask_alpha;
- }
- FX_BYTE back_alpha = dest_scan[3];
- if (back_alpha == 0) {
- FXARGB_SETRGBORDERDIB(dest_scan, FXARGB_MAKE(src_alpha, src_r, src_g, src_b));
- dest_scan += 4;
- continue;
- }
- FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
- dest_scan[3] = dest_alpha;
- int alpha_ratio = src_alpha * 255 / dest_alpha;
- if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {
- int blended_colors[3];
- FX_BYTE src_scan[3];
- FX_BYTE dest_scan_o[3];
- src_scan[0] = src_b;
- src_scan[1] = src_g;
- src_scan[2] = src_r;
- dest_scan_o[0] = dest_scan[2];
- dest_scan_o[1] = dest_scan[1];
- dest_scan_o[2] = dest_scan[0];
- _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);
- dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], blended_colors[0], alpha_ratio);
- dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], blended_colors[1], alpha_ratio);
- dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], blended_colors[2], alpha_ratio);
- } else if (blend_type) {
- int blended = _BLEND(blend_type, dest_scan[2], src_b);
- blended = FXDIB_ALPHA_MERGE(src_b, blended, back_alpha);
- dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], blended, alpha_ratio);
- blended = _BLEND(blend_type, dest_scan[1], src_g);
- blended = FXDIB_ALPHA_MERGE(src_g, blended, back_alpha);
- dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], blended, alpha_ratio);
- blended = _BLEND(blend_type, dest_scan[0], src_r);
- blended = FXDIB_ALPHA_MERGE(src_r, blended, back_alpha);
- dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], blended, alpha_ratio);
- } else {
- dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], src_b, alpha_ratio);
- dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], src_g, alpha_ratio);
- dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], src_r, alpha_ratio);
- }
- dest_scan += 4;
- }
-}
-void _CompositeRow_BitMask2Rgb_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_r, int src_g, int src_b,
- int src_left, int pixel_count, int blend_type, int Bpp, FX_LPCBYTE clip_scan)
-{
- if (blend_type == FXDIB_BLEND_NORMAL && clip_scan == NULL && mask_alpha == 255) {
- for (int col = 0; col < pixel_count; col ++) {
- if (src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8))) {
- dest_scan[2] = src_b;
- dest_scan[1] = src_g;
- dest_scan[0] = src_r;
- }
- dest_scan += Bpp;
- }
- return;
- }
- for (int col = 0; col < pixel_count; col ++) {
- if (!(src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8)))) {
- dest_scan += Bpp;
- continue;
- }
- int src_alpha;
- if (clip_scan) {
- src_alpha = mask_alpha * clip_scan[col] / 255;
- } else {
- src_alpha = mask_alpha;
- }
- if (src_alpha == 0) {
- dest_scan += Bpp;
- continue;
- }
- if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {
- int blended_colors[3];
- FX_BYTE src_scan[3];
- FX_BYTE dest_scan_o[3];
- src_scan[0] = src_b;
- src_scan[1] = src_g;
- src_scan[2] = src_r;
- dest_scan_o[0] = dest_scan[2];
- dest_scan_o[1] = dest_scan[1];
- dest_scan_o[2] = dest_scan[0];
- _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);
- dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], blended_colors[0], src_alpha);
- dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], blended_colors[1], src_alpha);
- dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], blended_colors[2], src_alpha);
- } else if (blend_type) {
- int back_color = FX_GAMMA(dest_scan[2]);
- int blended = _BLEND(blend_type, back_color, src_b);
- dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(back_color, blended, src_alpha));
- back_color = FX_GAMMA(dest_scan[1]);
- blended = _BLEND(blend_type, back_color, src_g);
- dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(back_color, blended, src_alpha));
- back_color = FX_GAMMA(dest_scan[0]);
- blended = _BLEND(blend_type, back_color, src_r);
- dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(back_color, blended, src_alpha));
- } else {
- dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), src_b, src_alpha));
- dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), src_g, src_alpha));
- dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), src_r, src_alpha));
- }
- dest_scan += Bpp;
- }
-}
-inline FX_BOOL _ScanlineCompositor_InitSourceMask(FXDIB_Format dest_format, int alpha_flag, FX_DWORD mask_color, int& mask_alpha,
- int& mask_red, int& mask_green, int& mask_blue, int& mask_black,
- void* icc_module, void* pIccTransform)
-{
- ICodec_IccModule* pIccModule = (ICodec_IccModule*)icc_module;
- if (alpha_flag >> 8) {
- mask_alpha = alpha_flag & 0xff;
- mask_red = FXSYS_GetCValue(mask_color);
- mask_green = FXSYS_GetMValue(mask_color);
- mask_blue = FXSYS_GetYValue(mask_color);
- mask_black = FXSYS_GetKValue(mask_color);
- } else {
- mask_alpha = FXARGB_A(mask_color);
- mask_red = FXARGB_R(mask_color);
- mask_green = FXARGB_G(mask_color);
- mask_blue = FXARGB_B(mask_color);
- }
- if (dest_format == FXDIB_8bppMask) {
- return TRUE;
- }
- if ((dest_format & 0xff) == 8) {
- if (pIccTransform) {
- mask_color = (alpha_flag >> 8) ? FXCMYK_TODIB(mask_color) : FXARGB_TODIB(mask_color);
- FX_LPBYTE gray_p = (FX_LPBYTE)&mask_color;
- pIccModule->TranslateScanline(pIccTransform, gray_p, gray_p, 1);
- mask_red = dest_format & 0x0400 ? FX_CCOLOR(gray_p[0]) : gray_p[0];
- } else {
- if (alpha_flag >> 8) {
- FX_BYTE r, g, b;
- AdobeCMYK_to_sRGB1(mask_red, mask_green, mask_blue, mask_black,
- r, g, b);
- mask_red = FXRGB2GRAY(r, g, b);
- } else {
- mask_red = FXRGB2GRAY(mask_red, mask_green, mask_blue);
- }
- if (dest_format & 0x0400) {
- mask_red = FX_CCOLOR(mask_red);
- }
- }
- } else {
- FX_LPBYTE mask_color_p = (FX_LPBYTE)&mask_color;
- mask_color = (alpha_flag >> 8) ? FXCMYK_TODIB(mask_color) : FXARGB_TODIB(mask_color);
- if (pIccTransform) {
- pIccModule->TranslateScanline(pIccTransform, mask_color_p, mask_color_p, 1);
- mask_red = mask_color_p[2];
- mask_green = mask_color_p[1];
- mask_blue = mask_color_p[0];
- } else if (alpha_flag >> 8) {
- AdobeCMYK_to_sRGB1(mask_color_p[0], mask_color_p[1], mask_color_p[2], mask_color_p[3],
- mask_color_p[2], mask_color_p[1], mask_color_p[0]);
- mask_red = mask_color_p[2];
- mask_green = mask_color_p[1];
- mask_blue = mask_color_p[0];
- }
- }
- return TRUE;
-}
-inline void _ScanlineCompositor_InitSourcePalette(FXDIB_Format src_format, FXDIB_Format dest_format,
- FX_DWORD*& pDestPalette, FX_DWORD* pSrcPalette,
- void* icc_module, void* pIccTransform)
-{
- ICodec_IccModule* pIccModule = (ICodec_IccModule*)icc_module;
- FX_BOOL isSrcCmyk = src_format & 0x0400 ? TRUE : FALSE;
- FX_BOOL isDstCmyk = dest_format & 0x0400 ? TRUE : FALSE;
- pDestPalette = NULL;
- if (pIccTransform) {
- if (pSrcPalette) {
- if ((dest_format & 0xff) == 8) {
- int pal_count = 1 << (src_format & 0xff);
- FX_LPBYTE gray_pal = FX_Alloc(FX_BYTE, pal_count);
- if (!gray_pal) {
- return;
- }
- pDestPalette = (FX_DWORD*)gray_pal;
- for (int i = 0; i < pal_count; i ++) {
- FX_DWORD color = isSrcCmyk ? FXCMYK_TODIB(pSrcPalette[i]) : FXARGB_TODIB(pSrcPalette[i]);
- pIccModule->TranslateScanline(pIccTransform, gray_pal, (FX_LPCBYTE)&color, 1);
- gray_pal ++;
- }
- } else {
- int palsize = 1 << (src_format & 0xff);
- pDestPalette = FX_Alloc(FX_DWORD, palsize);
- if (!pDestPalette) {
- return;
- }
- for (int i = 0; i < palsize; i ++) {
- FX_DWORD color = isSrcCmyk ? FXCMYK_TODIB(pSrcPalette[i]) : FXARGB_TODIB(pSrcPalette[i]);
- pIccModule->TranslateScanline(pIccTransform, (FX_LPBYTE)&color, (FX_LPCBYTE)&color, 1);
- pDestPalette[i] = isDstCmyk ? FXCMYK_TODIB(color) : FXARGB_TODIB(color);
- }
- }
- } else {
- int pal_count = 1 << (src_format & 0xff);
- FX_LPBYTE gray_pal = FX_Alloc(FX_BYTE, pal_count);
- if (!gray_pal) {
- return;
- }
- if (pal_count == 2) {
- gray_pal[0] = 0;
- gray_pal[1] = 255;
- } else {
- for (int i = 0; i < pal_count; i++) {
- gray_pal[i] = i;
- }
- }
- if ((dest_format & 0xff) == 8) {
- pIccModule->TranslateScanline(pIccTransform, gray_pal, gray_pal, pal_count);
- pDestPalette = (FX_DWORD*)gray_pal;
- } else {
- pDestPalette = FX_Alloc(FX_DWORD, pal_count);
- if (!pDestPalette) {
- FX_Free(gray_pal);
- return;
- }
- for (int i = 0; i < pal_count; i ++) {
- pIccModule->TranslateScanline(pIccTransform, (FX_LPBYTE)&pDestPalette[i], &gray_pal[i], 1);
- pDestPalette[i] = isDstCmyk ? FXCMYK_TODIB(pDestPalette[i]) : FXARGB_TODIB(pDestPalette[i]);
- }
- FX_Free(gray_pal);
- }
- }
- } else {
- if (pSrcPalette) {
- if ((dest_format & 0xff) == 8) {
- int pal_count = 1 << (src_format & 0xff);
- FX_LPBYTE gray_pal = FX_Alloc(FX_BYTE, pal_count);
- if (!gray_pal) {
- return;
- }
- pDestPalette = (FX_DWORD*)gray_pal;
- if (isSrcCmyk) {
- for (int i = 0; i < pal_count; i ++) {
- FX_CMYK cmyk = pSrcPalette[i];
- FX_BYTE r, g, b;
- AdobeCMYK_to_sRGB1(FXSYS_GetCValue(cmyk), FXSYS_GetMValue(cmyk), FXSYS_GetYValue(cmyk), FXSYS_GetKValue(cmyk),
- r, g, b);
- *gray_pal ++ = FXRGB2GRAY(r, g, b);
- }
- } else
- for (int i = 0; i < pal_count; i ++) {
- FX_ARGB argb = pSrcPalette[i];
- *gray_pal ++ = FXRGB2GRAY(FXARGB_R(argb), FXARGB_G(argb), FXARGB_B(argb));
- }
- } else {
- int palsize = 1 << (src_format & 0xff);
- pDestPalette = FX_Alloc(FX_DWORD, palsize);
- if (!pDestPalette) {
- return;
- }
- if (isDstCmyk == isSrcCmyk) {
- FXSYS_memcpy32(pDestPalette, pSrcPalette, palsize * sizeof(FX_DWORD));
- } else {
- for (int i = 0; i < palsize; i ++) {
- FX_CMYK cmyk = pSrcPalette[i];
- FX_BYTE r, g, b;
- AdobeCMYK_to_sRGB1(FXSYS_GetCValue(cmyk), FXSYS_GetMValue(cmyk), FXSYS_GetYValue(cmyk), FXSYS_GetKValue(cmyk),
- r, g, b);
- pDestPalette[i] = FXARGB_MAKE(0xff, r, g, b);
- }
- }
- }
- } else {
- if ((dest_format & 0xff) == 8) {
- int pal_count = 1 << (src_format & 0xff);
- FX_LPBYTE gray_pal = FX_Alloc(FX_BYTE, pal_count);
- if (!gray_pal) {
- return;
- }
- if (pal_count == 2) {
- gray_pal[0] = 0;
- gray_pal[1] = 255;
- } else {
- for (int i = 0; i < pal_count; i++) {
- gray_pal[i] = i;
- }
- }
- pDestPalette = (FX_DWORD*)gray_pal;
- } else {
- int palsize = 1 << (src_format & 0xff);
- pDestPalette = FX_Alloc(FX_DWORD, palsize);
- if (!pDestPalette) {
- return;
- }
- if (palsize == 2) {
- pDestPalette[0] = isSrcCmyk ? 255 : 0xff000000;
- pDestPalette[1] = isSrcCmyk ? 0 : 0xffffffff;
- } else {
- for (int i = 0; i < palsize; i++) {
- pDestPalette[i] = isSrcCmyk ? FX_CCOLOR(i) : (i * 0x10101);
- }
- }
- if (isSrcCmyk != isDstCmyk) {
- for (int i = 0; i < palsize; i ++) {
- FX_CMYK cmyk = pDestPalette[i];
- FX_BYTE r, g, b;
- AdobeCMYK_to_sRGB1(FXSYS_GetCValue(cmyk), FXSYS_GetMValue(cmyk), FXSYS_GetYValue(cmyk), FXSYS_GetKValue(cmyk),
- r, g, b);
- pDestPalette[i] = FXARGB_MAKE(0xff, r, g, b);
- }
- }
- }
- }
- }
-}
-CFX_ScanlineCompositor::CFX_ScanlineCompositor()
-{
- m_pSrcPalette = NULL;
- m_pCacheScanline = NULL;
- m_CacheSize = 0;
- m_bRgbByteOrder = FALSE;
- m_BlendType = FXDIB_BLEND_NORMAL;
-}
-CFX_ScanlineCompositor::~CFX_ScanlineCompositor()
-{
- if (m_pSrcPalette) {
- FX_Free(m_pSrcPalette);
- }
- if (m_pCacheScanline) {
- FX_Free(m_pCacheScanline);
- }
-}
-FX_BOOL CFX_ScanlineCompositor::Init(FXDIB_Format dest_format, FXDIB_Format src_format, FX_INT32 width, FX_DWORD* pSrcPalette,
- FX_DWORD mask_color, int blend_type, FX_BOOL bClip, FX_BOOL bRgbByteOrder, int alpha_flag, void* pIccTransform)
-{
- m_SrcFormat = src_format;
- m_DestFormat = dest_format;
- m_BlendType = blend_type;
- m_bRgbByteOrder = bRgbByteOrder;
- ICodec_IccModule* pIccModule = NULL;
- if (CFX_GEModule::Get()->GetCodecModule()) {
- pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
- }
- if (pIccModule == NULL) {
- pIccTransform = NULL;
- }
- m_pIccTransform = pIccTransform;
- if ((dest_format & 0xff) == 1) {
- return FALSE;
- }
- if (m_SrcFormat == FXDIB_1bppMask || m_SrcFormat == FXDIB_8bppMask) {
- return _ScanlineCompositor_InitSourceMask(dest_format, alpha_flag, mask_color,
- m_MaskAlpha, m_MaskRed, m_MaskGreen, m_MaskBlue, m_MaskBlack,
- pIccModule, pIccTransform);
- }
- if (pIccTransform == NULL && (~src_format & 0x0400) && (dest_format & 0x0400)) {
- return FALSE;
- }
- if ((m_SrcFormat & 0xff) <= 8) {
- if (dest_format == FXDIB_8bppMask) {
- return TRUE;
- }
- _ScanlineCompositor_InitSourcePalette(src_format, dest_format, m_pSrcPalette, pSrcPalette,
- pIccModule, pIccTransform);
- m_Transparency = (dest_format == FXDIB_Argb ? 1 : 0)
- + (dest_format & 0x0200 ? 2 : 0)
- + (dest_format & 0x0400 ? 4 : 0)
- + ((src_format & 0xff) == 1 ? 8 : 0);
- return TRUE;
- }
- m_Transparency = (src_format & 0x0200 ? 0 : 1)
- + (dest_format & 0x0200 ? 0 : 2)
- + (blend_type == FXDIB_BLEND_NORMAL ? 4 : 0)
- + (bClip ? 8 : 0)
- + (src_format & 0x0400 ? 16 : 0)
- + (dest_format & 0x0400 ? 32 : 0)
- + (pIccTransform ? 64 : 0);
- return TRUE;
-}
-void CFX_ScanlineCompositor::CompositeRgbBitmapLine(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, FX_LPCBYTE clip_scan,
- FX_LPCBYTE src_extra_alpha, FX_LPBYTE dst_extra_alpha)
-{
- int src_Bpp = (m_SrcFormat & 0xff) >> 3;
- int dest_Bpp = (m_DestFormat & 0xff) >> 3;
- int dest_Size = width * dest_Bpp + 4;
- if (m_bRgbByteOrder) {
- switch (m_Transparency) {
- case 0:
- case 4:
- case 8:
- case 12:
- _CompositeRow_Argb2Argb_RgbByteOrder(dest_scan, src_scan, width, m_BlendType, clip_scan);
- break;
- case 1:
- _CompositeRow_Rgb2Argb_Blend_NoClip_RgbByteOrder(dest_scan, src_scan, width, m_BlendType, src_Bpp);
- break;
- case 2:
- case 10:
- _CompositeRow_Argb2Rgb_Blend_RgbByteOrder(dest_scan, src_scan, width, m_BlendType, dest_Bpp, clip_scan);
- break;
- case 3:
- _CompositeRow_Rgb2Rgb_Blend_NoClip_RgbByteOrder(dest_scan, src_scan, width, m_BlendType, dest_Bpp, src_Bpp);
- break;
- case 5:
- _CompositeRow_Rgb2Argb_NoBlend_NoClip_RgbByteOrder(dest_scan, src_scan, width, src_Bpp);
- break;
- case 6:
- case 14:
- _CompositeRow_Argb2Rgb_NoBlend_RgbByteOrder(dest_scan, src_scan, width, dest_Bpp, clip_scan);
- break;
- case 7:
- _CompositeRow_Rgb2Rgb_NoBlend_NoClip_RgbByteOrder(dest_scan, src_scan, width, dest_Bpp, src_Bpp);
- break;
- case 9:
- _CompositeRow_Rgb2Argb_Blend_Clip_RgbByteOrder(dest_scan, src_scan, width, m_BlendType, src_Bpp, clip_scan);
- break;
- case 11:
- _CompositeRow_Rgb2Rgb_Blend_Clip_RgbByteOrder(dest_scan, src_scan, width, m_BlendType, dest_Bpp, src_Bpp, clip_scan);
- break;
- case 13:
- _CompositeRow_Rgb2Argb_NoBlend_Clip_RgbByteOrder(dest_scan, src_scan, width, src_Bpp, clip_scan);
- break;
- case 15:
- _CompositeRow_Rgb2Rgb_NoBlend_Clip_RgbByteOrder(dest_scan, src_scan, width, dest_Bpp, src_Bpp, clip_scan);
- break;
- }
- return;
- }
- if (m_DestFormat == FXDIB_8bppMask) {
- if (m_SrcFormat & 0x0200) {
- if (m_SrcFormat == FXDIB_Argb) {
- _CompositeRow_Argb2Mask(dest_scan, src_scan, width, clip_scan);
- } else {
- _CompositeRow_Rgba2Mask(dest_scan, src_extra_alpha, width, clip_scan);
- }
- } else {
- _CompositeRow_Rgb2Mask(dest_scan, src_scan, width, clip_scan);
- }
- } else if ((m_DestFormat & 0xff) == 8) {
- if (m_DestFormat & 0x0400) {
- for (int i = 0; i < width; i ++) {
- *dest_scan = ~*dest_scan;
- dest_scan++;
- }
- }
- if (m_SrcFormat & 0x0200) {
- if (m_DestFormat & 0x0200) {
- _CompositeRow_Argb2Graya(dest_scan, src_scan, width, m_BlendType, clip_scan, src_extra_alpha, dst_extra_alpha, m_pIccTransform);
- } else {
- _CompositeRow_Argb2Gray(dest_scan, src_scan, width, m_BlendType, clip_scan, src_extra_alpha, m_pIccTransform);
- }
- } else {
- if (m_DestFormat & 0x0200) {
- _CompositeRow_Rgb2Graya(dest_scan, src_scan, src_Bpp, width, m_BlendType, clip_scan, dst_extra_alpha, m_pIccTransform);
- } else {
- _CompositeRow_Rgb2Gray(dest_scan, src_scan, src_Bpp, width, m_BlendType, clip_scan, m_pIccTransform);
- }
- }
- if (m_DestFormat & 0x0400) {
- for (int i = 0; i < width; i ++) {
- *dest_scan = ~*dest_scan;
- dest_scan++;
- }
- }
- } else {
- if (dest_Size > m_CacheSize) {
- m_pCacheScanline = FX_Realloc(FX_BYTE, m_pCacheScanline, dest_Size);
- if (!m_pCacheScanline) {
- return;
- }
- m_CacheSize = dest_Size;
- }
- switch (m_Transparency) {
- case 0:
- case 4:
- case 8:
- case 4+8: {
- _CompositeRow_Argb2Argb(dest_scan, src_scan, width, m_BlendType, clip_scan,
- dst_extra_alpha, src_extra_alpha);
- }
- break;
- case 64:
- case 4+64:
- case 8+64:
- case 4+8+64: {
- _CompositeRow_Argb2Argb_Transform(dest_scan, src_scan, width, m_BlendType, clip_scan,
- dst_extra_alpha, src_extra_alpha, m_pCacheScanline, m_pIccTransform);
- }
- break;
- case 1:
- _CompositeRow_Rgb2Argb_Blend_NoClip(dest_scan, src_scan, width, m_BlendType, src_Bpp,
- dst_extra_alpha);
- break;
- case 1+64:
- _CompositeRow_Rgb2Argb_Blend_NoClip_Transform(dest_scan, src_scan, width, m_BlendType, src_Bpp,
- dst_extra_alpha, m_pCacheScanline, m_pIccTransform);
- break;
- case 1+8:
- _CompositeRow_Rgb2Argb_Blend_Clip(dest_scan, src_scan, width, m_BlendType, src_Bpp, clip_scan,
- dst_extra_alpha);
- break;
- case 1+8+64:
- _CompositeRow_Rgb2Argb_Blend_Clip_Transform(dest_scan, src_scan, width, m_BlendType, src_Bpp, clip_scan,
- dst_extra_alpha, m_pCacheScanline, m_pIccTransform);
- break;
- case 1+4:
- _CompositeRow_Rgb2Argb_NoBlend_NoClip(dest_scan, src_scan, width, src_Bpp,
- dst_extra_alpha);
- break;
- case 1+4+64:
- _CompositeRow_Rgb2Argb_NoBlend_NoClip_Transform(dest_scan, src_scan, width, src_Bpp,
- dst_extra_alpha, m_pCacheScanline, m_pIccTransform);
- break;
- case 1+4+8:
- _CompositeRow_Rgb2Argb_NoBlend_Clip(dest_scan, src_scan, width, src_Bpp, clip_scan,
- dst_extra_alpha);
- break;
- case 1+4+8+64:
- _CompositeRow_Rgb2Argb_NoBlend_Clip_Transform(dest_scan, src_scan, width, src_Bpp, clip_scan,
- dst_extra_alpha, m_pCacheScanline, m_pIccTransform);
- break;
- case 2:
- case 2+8:
- _CompositeRow_Argb2Rgb_Blend(dest_scan, src_scan, width, m_BlendType, dest_Bpp, clip_scan,
- src_extra_alpha);
- break;
- case 2+64:
- case 2+8+64:
- _CompositeRow_Argb2Rgb_Blend_Transform(dest_scan, src_scan, width, m_BlendType, dest_Bpp, clip_scan,
- src_extra_alpha, m_pCacheScanline, m_pIccTransform);
- break;
- case 2+4:
- case 2+4+8:
- _CompositeRow_Argb2Rgb_NoBlend(dest_scan, src_scan, width, dest_Bpp, clip_scan,
- src_extra_alpha);
- break;
- case 2+4+64:
- case 2+4+8+64:
- _CompositeRow_Argb2Rgb_NoBlend_Transform(dest_scan, src_scan, width, dest_Bpp, clip_scan,
- src_extra_alpha, m_pCacheScanline, m_pIccTransform);
- break;
- case 1+2:
- _CompositeRow_Rgb2Rgb_Blend_NoClip(dest_scan, src_scan, width, m_BlendType, dest_Bpp, src_Bpp);
- break;
- case 1+2+64:
- _CompositeRow_Rgb2Rgb_Blend_NoClip_Transform(dest_scan, src_scan, width, m_BlendType, dest_Bpp, src_Bpp,
- m_pCacheScanline, m_pIccTransform);
- break;
- case 1+2+8:
- _CompositeRow_Rgb2Rgb_Blend_Clip(dest_scan, src_scan, width, m_BlendType, dest_Bpp, src_Bpp, clip_scan);
- break;
- case 1+2+8+64:
- _CompositeRow_Rgb2Rgb_Blend_Clip_Transform(dest_scan, src_scan, width, m_BlendType, dest_Bpp, src_Bpp, clip_scan,
- m_pCacheScanline, m_pIccTransform);
- break;
- case 1+2+4:
- _CompositeRow_Rgb2Rgb_NoBlend_NoClip(dest_scan, src_scan, width, dest_Bpp, src_Bpp);
- break;
- case 1+2+4+64:
- _CompositeRow_Rgb2Rgb_NoBlend_NoClip_Transform(dest_scan, src_scan, width, dest_Bpp, src_Bpp,
- m_pCacheScanline, m_pIccTransform);
- break;
- case 1+2+4+8:
- _CompositeRow_Rgb2Rgb_NoBlend_Clip(dest_scan, src_scan, width, dest_Bpp, src_Bpp, clip_scan);
- break;
- case 1+2+4+8+64:
- _CompositeRow_Rgb2Rgb_NoBlend_Clip_Transform(dest_scan, src_scan, width, dest_Bpp, src_Bpp, clip_scan,
- m_pCacheScanline, m_pIccTransform);
- break;
- }
- }
-}
-void CFX_ScanlineCompositor::CompositePalBitmapLine(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_left, int width, FX_LPCBYTE clip_scan,
- FX_LPCBYTE src_extra_alpha, FX_LPBYTE dst_extra_alpha)
-{
- if (m_bRgbByteOrder) {
- if (m_SrcFormat == FXDIB_1bppRgb) {
- if (m_DestFormat == FXDIB_8bppRgb) {
- return;
- } else if(m_DestFormat == FXDIB_Argb) {
- _CompositeRow_1bppRgb2Argb_NoBlend_RgbByteOrder(dest_scan, src_scan, src_left, width, m_pSrcPalette, clip_scan);
- } else {
- _CompositeRow_1bppRgb2Rgb_NoBlend_RgbByteOrder(dest_scan, src_scan, src_left, m_pSrcPalette, width, (m_DestFormat & 0xff) >> 3, clip_scan);
- }
- } else {
- if (m_DestFormat == FXDIB_8bppRgb) {
- return;
- } else if (m_DestFormat == FXDIB_Argb) {
- _CompositeRow_8bppRgb2Argb_NoBlend_RgbByteOrder(dest_scan, src_scan, width, m_pSrcPalette, clip_scan);
- } else {
- _CompositeRow_8bppRgb2Rgb_NoBlend_RgbByteOrder(dest_scan, src_scan, m_pSrcPalette, width, (m_DestFormat & 0xff) >> 3, clip_scan);
- }
- }
- return;
- }
- if (m_DestFormat == FXDIB_8bppMask) {
- _CompositeRow_Rgb2Mask(dest_scan, src_scan, width, clip_scan);
- return;
- } else if ((m_DestFormat & 0xff) == 8) {
- if (m_Transparency & 8) {
- if (m_DestFormat & 0x0200) {
- _CompositeRow_1bppPal2Graya(dest_scan, src_scan, src_left, (FX_LPCBYTE)m_pSrcPalette, width, m_BlendType, clip_scan, dst_extra_alpha);
- } else {
- _CompositeRow_1bppPal2Gray(dest_scan, src_scan, src_left, (FX_LPCBYTE)m_pSrcPalette, width, m_BlendType, clip_scan);
- }
- } else {
- if (m_DestFormat & 0x0200)
- _CompositeRow_8bppPal2Graya(dest_scan, src_scan, (FX_LPCBYTE)m_pSrcPalette, width, m_BlendType, clip_scan,
- dst_extra_alpha, src_extra_alpha);
- else
- _CompositeRow_8bppPal2Gray(dest_scan, src_scan, (FX_LPCBYTE)m_pSrcPalette, width, m_BlendType, clip_scan,
- src_extra_alpha);
- }
- } else {
- switch (m_Transparency) {
- case 1+2:
- _CompositeRow_8bppRgb2Argb_NoBlend(dest_scan, src_scan, width, m_pSrcPalette, clip_scan,
- src_extra_alpha);
- break;
- case 1+2+8:
- _CompositeRow_1bppRgb2Argb_NoBlend(dest_scan, src_scan, src_left, width, m_pSrcPalette, clip_scan);
- break;
- case 0:
- _CompositeRow_8bppRgb2Rgb_NoBlend(dest_scan, src_scan, m_pSrcPalette, width, (m_DestFormat & 0xff) >> 3, clip_scan,
- src_extra_alpha);
- break;
- case 0+8:
- _CompositeRow_1bppRgb2Rgb_NoBlend(dest_scan, src_scan, src_left, m_pSrcPalette, width, (m_DestFormat & 0xff) >> 3, clip_scan);
- break;
- case 0+2:
- _CompositeRow_8bppRgb2Rgb_NoBlend(dest_scan, src_scan, m_pSrcPalette, width, (m_DestFormat & 0xff) >> 3, clip_scan,
- src_extra_alpha);
- break;
- case 0+2+8:
- _CompositeRow_1bppRgb2Rgba_NoBlend(dest_scan, src_scan, src_left, width, m_pSrcPalette, clip_scan,
- dst_extra_alpha);
- break;
- break;
- }
- }
-}
-void CFX_ScanlineCompositor::CompositeByteMaskLine(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, FX_LPCBYTE clip_scan,
- FX_LPBYTE dst_extra_alpha)
-{
- if (m_DestFormat == FXDIB_8bppMask) {
- _CompositeRow_ByteMask2Mask(dest_scan, src_scan, m_MaskAlpha, width, clip_scan);
- } else if ((m_DestFormat & 0xff) == 8) {
- if (m_DestFormat & 0x0200) {
- _CompositeRow_ByteMask2Graya(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, width, clip_scan, dst_extra_alpha);
- } else {
- _CompositeRow_ByteMask2Gray(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, width, clip_scan);
- }
- } else if (m_bRgbByteOrder) {
- if (m_DestFormat == FXDIB_Argb)
- _CompositeRow_ByteMask2Argb_RgbByteOrder(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, m_MaskGreen, m_MaskBlue,
- width, m_BlendType, clip_scan);
- else
- _CompositeRow_ByteMask2Rgb_RgbByteOrder(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, m_MaskGreen, m_MaskBlue,
- width, m_BlendType, (m_DestFormat & 0xff) >> 3, clip_scan);
- return;
- } else if (m_DestFormat == FXDIB_Argb)
- _CompositeRow_ByteMask2Argb(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, m_MaskGreen, m_MaskBlue,
- width, m_BlendType, clip_scan);
- else if (m_DestFormat == FXDIB_Rgb || m_DestFormat == FXDIB_Rgb32)
- _CompositeRow_ByteMask2Rgb(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, m_MaskGreen, m_MaskBlue,
- width, m_BlendType, (m_DestFormat & 0xff) >> 3, clip_scan);
- else if (m_DestFormat == FXDIB_Rgba)
- _CompositeRow_ByteMask2Rgba(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, m_MaskGreen, m_MaskBlue,
- width, m_BlendType, clip_scan, dst_extra_alpha);
-}
-void CFX_ScanlineCompositor::CompositeBitMaskLine(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_left, int width, FX_LPCBYTE clip_scan,
- FX_LPBYTE dst_extra_alpha)
-{
- if (m_DestFormat == FXDIB_8bppMask) {
- _CompositeRow_BitMask2Mask(dest_scan, src_scan, m_MaskAlpha, src_left, width, clip_scan);
- } else if ((m_DestFormat & 0xff) == 8) {
- if (m_DestFormat & 0x0200)
- _CompositeRow_BitMask2Graya(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, src_left, width, clip_scan,
- dst_extra_alpha);
- else {
- _CompositeRow_BitMask2Gray(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, src_left, width, clip_scan);
- }
- } else if (m_bRgbByteOrder) {
- if (m_DestFormat == FXDIB_Argb)
- _CompositeRow_BitMask2Argb_RgbByteOrder(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, m_MaskGreen, m_MaskBlue,
- src_left, width, m_BlendType, clip_scan);
- else
- _CompositeRow_BitMask2Rgb_RgbByteOrder(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, m_MaskGreen, m_MaskBlue,
- src_left, width, m_BlendType, (m_DestFormat & 0xff) >> 3, clip_scan);
- return;
- } else if (m_DestFormat == FXDIB_Argb)
- _CompositeRow_BitMask2Argb(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, m_MaskGreen, m_MaskBlue,
- src_left, width, m_BlendType, clip_scan);
- else if (m_DestFormat == FXDIB_Rgb || m_DestFormat == FXDIB_Rgb32)
- _CompositeRow_BitMask2Rgb(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, m_MaskGreen, m_MaskBlue,
- src_left, width, m_BlendType, (m_DestFormat & 0xff) >> 3, clip_scan);
-}
-FX_BOOL CFX_DIBitmap::CompositeBitmap(int dest_left, int dest_top, int width, int height,
- const CFX_DIBSource* pSrcBitmap, int src_left, int src_top,
- int blend_type, const CFX_ClipRgn* pClipRgn, FX_BOOL bRgbByteOrder, void* pIccTransform)
-{
- if (m_pBuffer == NULL) {
- return FALSE;
- }
- ASSERT(!pSrcBitmap->IsAlphaMask());
- ASSERT(m_bpp >= 8);
- if (pSrcBitmap->IsAlphaMask() || m_bpp < 8) {
- return FALSE;
- }
- GetOverlapRect(dest_left, dest_top, width, height, pSrcBitmap->GetWidth(), pSrcBitmap->GetHeight(),
- src_left, src_top, pClipRgn);
- if (width == 0 || height == 0) {
- return TRUE;
- }
- const CFX_DIBitmap* pClipMask = NULL;
- FX_RECT clip_box;
- if (pClipRgn && pClipRgn->GetType() != CFX_ClipRgn::RectI) {
- ASSERT(pClipRgn->GetType() == CFX_ClipRgn::MaskF);
- pClipMask = pClipRgn->GetMask();
- clip_box = pClipRgn->GetBox();
- }
- CFX_ScanlineCompositor compositor;
- if (!compositor.Init(GetFormat(), pSrcBitmap->GetFormat(), width, pSrcBitmap->GetPalette(), 0, blend_type,
- pClipMask != NULL, bRgbByteOrder, 0, pIccTransform)) {
- return FALSE;
- }
- int dest_Bpp = m_bpp / 8;
- int src_Bpp = pSrcBitmap->GetBPP() / 8;
- FX_BOOL bRgb = FALSE;
- FX_BOOL bCmyk = FALSE;
- if (src_Bpp > 1) {
- if (pSrcBitmap->IsCmykImage()) {
- bCmyk = TRUE;
- } else {
- bRgb = TRUE;
- }
- }
- CFX_DIBitmap* pSrcAlphaMask = pSrcBitmap->m_pAlphaMask;
- for (int row = 0; row < height; row ++) {
- FX_LPBYTE dest_scan = m_pBuffer + (dest_top + row) * m_Pitch + dest_left * dest_Bpp;
- FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * src_Bpp;
- FX_LPCBYTE src_scan_extra_alpha = pSrcAlphaMask ? pSrcAlphaMask->GetScanline(src_top + row) + src_left : NULL;
- FX_LPBYTE dst_scan_extra_alpha = m_pAlphaMask ? (FX_LPBYTE)m_pAlphaMask->GetScanline(dest_top + row) + dest_left : NULL;
- FX_LPCBYTE clip_scan = NULL;
- if (pClipMask) {
- clip_scan = pClipMask->m_pBuffer + (dest_top + row - clip_box.top) * pClipMask->m_Pitch + (dest_left - clip_box.left);
- }
- if (bRgb) {
- compositor.CompositeRgbBitmapLine(dest_scan, src_scan, width, clip_scan, src_scan_extra_alpha, dst_scan_extra_alpha);
- } else {
- compositor.CompositePalBitmapLine(dest_scan, src_scan, src_left, width, clip_scan, src_scan_extra_alpha, dst_scan_extra_alpha);
- }
- }
- return TRUE;
-}
-FX_BOOL CFX_DIBitmap::CompositeMask(int dest_left, int dest_top, int width, int height,
- const CFX_DIBSource* pMask, FX_DWORD color, int src_left, int src_top,
- int blend_type, const CFX_ClipRgn* pClipRgn, FX_BOOL bRgbByteOrder, int alpha_flag, void* pIccTransform)
-{
- if (m_pBuffer == NULL) {
- return FALSE;
- }
- ASSERT(pMask->IsAlphaMask());
- ASSERT(m_bpp >= 8);
- if (!pMask->IsAlphaMask() || m_bpp < 8) {
- return FALSE;
- }
- GetOverlapRect(dest_left, dest_top, width, height, pMask->GetWidth(), pMask->GetHeight(), src_left, src_top, pClipRgn);
- if (width == 0 || height == 0) {
- return TRUE;
- }
- int src_alpha = (FX_BYTE)(alpha_flag >> 8) ? (alpha_flag & 0xff) : FXARGB_A(color);
- if (src_alpha == 0) {
- return TRUE;
- }
- const CFX_DIBitmap* pClipMask = NULL;
- FX_RECT clip_box;
- if (pClipRgn && pClipRgn->GetType() != CFX_ClipRgn::RectI) {
- ASSERT(pClipRgn->GetType() == CFX_ClipRgn::MaskF);
- pClipMask = pClipRgn->GetMask();
- clip_box = pClipRgn->GetBox();
- }
- int src_bpp = pMask->GetBPP();
- int Bpp = GetBPP() / 8;
- CFX_ScanlineCompositor compositor;
- if (!compositor.Init(GetFormat(), pMask->GetFormat(), width, NULL, color, blend_type, pClipMask != NULL, bRgbByteOrder, alpha_flag, pIccTransform)) {
- return FALSE;
- }
- for (int row = 0; row < height; row ++) {
- FX_LPBYTE dest_scan = m_pBuffer + (dest_top + row) * m_Pitch + dest_left * Bpp;
- FX_LPCBYTE src_scan = pMask->GetScanline(src_top + row);
- FX_LPBYTE dst_scan_extra_alpha = m_pAlphaMask ? (FX_LPBYTE)m_pAlphaMask->GetScanline(dest_top + row) + dest_left : NULL;
- FX_LPCBYTE clip_scan = NULL;
- if (pClipMask) {
- clip_scan = pClipMask->m_pBuffer + (dest_top + row - clip_box.top) * pClipMask->m_Pitch + (dest_left - clip_box.left);
- }
- if (src_bpp == 1) {
- compositor.CompositeBitMaskLine(dest_scan, src_scan, src_left, width, clip_scan, dst_scan_extra_alpha);
- } else {
- compositor.CompositeByteMaskLine(dest_scan, src_scan + src_left, width, clip_scan, dst_scan_extra_alpha);
- }
- }
- return TRUE;
-}
-FX_BOOL CFX_DIBitmap::CompositeRect(int left, int top, int width, int height, FX_DWORD color, int alpha_flag, void* pIccTransform)
-{
- if (m_pBuffer == NULL) {
- return FALSE;
- }
- int src_alpha = (alpha_flag >> 8) ? (alpha_flag & 0xff) : FXARGB_A(color);
- if (src_alpha == 0) {
- return TRUE;
- }
- FX_RECT rect(left, top, left + width, top + height);
- rect.Intersect(0, 0, m_Width, m_Height);
- if (rect.IsEmpty()) {
- return TRUE;
- }
- width = rect.Width();
- FX_DWORD dst_color;
- if (alpha_flag >> 8) {
- dst_color = FXCMYK_TODIB(color);
- } else {
- dst_color = FXARGB_TODIB(color);
- }
- FX_LPBYTE color_p = (FX_LPBYTE)&dst_color;
- if (m_bpp == 8) {
- FX_BYTE gray = 255;
- if (!IsAlphaMask()) {
- if (pIccTransform && CFX_GEModule::Get()->GetCodecModule() && CFX_GEModule::Get()->GetCodecModule()->GetIccModule()) {
- ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
- pIccModule->TranslateScanline(pIccTransform, &gray, color_p, 1);
- } else {
- if (alpha_flag >> 8) {
- FX_BYTE r, g, b;
- AdobeCMYK_to_sRGB1(color_p[0], color_p[1], color_p[2], color_p[3],
- r, g, b);
- gray = FXRGB2GRAY(r, g, b);
- } else {
- gray = (FX_BYTE)FXRGB2GRAY((int)color_p[2], color_p[1], color_p[0]);
- }
- }
- if (IsCmykImage()) {
- gray = ~gray;
- }
- }
- for (int row = rect.top; row < rect.bottom; row ++) {
- FX_LPBYTE dest_scan = m_pBuffer + row * m_Pitch + rect.left;
- if (src_alpha == 255) {
- FXSYS_memset8(dest_scan, gray, width);
- } else
- for (int col = 0; col < width; col ++) {
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, src_alpha);
- dest_scan ++;
- }
- }
- return TRUE;
- } else if (m_bpp == 1) {
- ASSERT(!IsCmykImage() && (FX_BYTE)(alpha_flag >> 8) == 0);
- int left_shift = rect.left % 8;
- int right_shift = rect.right % 8;
- int width = rect.right / 8 - rect.left / 8;
- int index = 0;
- if (m_pPalette == NULL) {
- index = ((FX_BYTE)color == 0xff) ? 1 : 0;
- } else {
- for (int i = 0; i < 2; i ++)
- if (m_pPalette[i] == color) {
- index = i;
- }
- }
- for (int row = rect.top; row < rect.bottom; row ++) {
- FX_BYTE* dest_scan_top = (FX_BYTE*)GetScanline(row) + rect.left / 8;
- FX_BYTE* dest_scan_top_r = (FX_BYTE*)GetScanline(row) + rect.right / 8;
- FX_BYTE left_flag = *dest_scan_top & (255 << (8 - left_shift));
- FX_BYTE right_flag = *dest_scan_top_r & (255 >> right_shift);
- if (width) {
- FXSYS_memset8(dest_scan_top + 1, index ? 255 : 0, width - 1);
- if (!index) {
- *dest_scan_top &= left_flag;
- *dest_scan_top_r &= right_flag;
- } else {
- *dest_scan_top |= ~left_flag;
- *dest_scan_top_r |= ~right_flag;
- }
- } else {
- if (!index) {
- *dest_scan_top &= left_flag | right_flag;
- } else {
- *dest_scan_top |= ~(left_flag | right_flag);
- }
- }
- }
- return TRUE;
- }
- ASSERT(m_bpp >= 24);
- if (m_bpp < 24) {
- return FALSE;
- }
- if (pIccTransform && CFX_GEModule::Get()->GetCodecModule()) {
- ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
- pIccModule->TranslateScanline(pIccTransform, color_p, color_p, 1);
- } else {
- if (alpha_flag >> 8 && !IsCmykImage())
- AdobeCMYK_to_sRGB1(FXSYS_GetCValue(color), FXSYS_GetMValue(color), FXSYS_GetYValue(color), FXSYS_GetKValue(color),
- color_p[2], color_p[1], color_p[0]);
- else if (!(alpha_flag >> 8) && IsCmykImage()) {
- return FALSE;
- }
- }
- if(!IsCmykImage()) {
- color_p[3] = (FX_BYTE)src_alpha;
- }
- int Bpp = m_bpp / 8;
- FX_BOOL bAlpha = HasAlpha();
- FX_BOOL bArgb = GetFormat() == FXDIB_Argb ? TRUE : FALSE;
- if (src_alpha == 255) {
- for (int row = rect.top; row < rect.bottom; row ++) {
- FX_LPBYTE dest_scan = m_pBuffer + row * m_Pitch + rect.left * Bpp;
- FX_LPBYTE dest_scan_alpha = m_pAlphaMask ? (FX_LPBYTE)m_pAlphaMask->GetScanline(row) + rect.left : NULL;
- if (dest_scan_alpha) {
- FXSYS_memset8(dest_scan_alpha, 0xff, width);
- }
- if (Bpp == 4) {
- FX_DWORD* scan = (FX_DWORD*)dest_scan;
- for (int col = 0; col < width; col ++) {
- *scan ++ = dst_color;
- }
- } else {
- for (int col = 0; col < width; col ++) {
- *dest_scan ++ = color_p[0];
- *dest_scan ++ = color_p[1];
- *dest_scan ++ = color_p[2];
- }
- }
- }
- return TRUE;
- }
- for (int row = rect.top; row < rect.bottom; row ++) {
- FX_LPBYTE dest_scan = m_pBuffer + row * m_Pitch + rect.left * Bpp;
- if (bAlpha) {
- if (bArgb) {
- for (int col = 0; col < width; col ++) {
- FX_BYTE back_alpha = dest_scan[3];
- if (back_alpha == 0) {
- FXARGB_SETDIB(dest_scan, FXARGB_MAKE(src_alpha, color_p[2], color_p[1], color_p[0]));
- dest_scan += 4;
- continue;
- }
- FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
- int alpha_ratio = src_alpha * 255 / dest_alpha;
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, color_p[0], alpha_ratio);
- dest_scan ++;
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, color_p[1], alpha_ratio);
- dest_scan ++;
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, color_p[2], alpha_ratio);
- dest_scan ++;
- *dest_scan++ = dest_alpha;
- }
- } else {
- FX_LPBYTE dest_scan_alpha = (FX_LPBYTE)m_pAlphaMask->GetScanline(row) + rect.left;
- for (int col = 0; col < width; col ++) {
- FX_BYTE back_alpha = *dest_scan_alpha;
- if (back_alpha == 0) {
- *dest_scan_alpha++ = src_alpha;
- FXSYS_memcpy32(dest_scan, color_p, Bpp);
- dest_scan += Bpp;
- continue;
- }
- FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
- *dest_scan_alpha ++ = dest_alpha;
- int alpha_ratio = src_alpha * 255 / dest_alpha;
- for(int comps = 0; comps < Bpp; comps ++) {
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, color_p[comps], alpha_ratio);
- dest_scan ++;
- }
- }
- }
- } else {
- for (int col = 0; col < width; col ++) {
- for(int comps = 0; comps < Bpp; comps ++) {
- if (comps == 3) {
- *dest_scan ++ = 255;
- continue;
- }
- *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, color_p[comps], src_alpha);
- dest_scan ++;
- }
- }
- }
- }
- return TRUE;
-}
-CFX_BitmapComposer::CFX_BitmapComposer()
-{
- m_pScanlineV = NULL;
- m_pScanlineAlphaV = NULL;
- m_pClipScanV = NULL;
- m_pAddClipScan = NULL;
- m_bRgbByteOrder = FALSE;
- m_BlendType = FXDIB_BLEND_NORMAL;
-}
-CFX_BitmapComposer::~CFX_BitmapComposer()
-{
- if (m_pScanlineV) {
- FX_Free(m_pScanlineV);
- }
- if (m_pScanlineAlphaV) {
- FX_Free(m_pScanlineAlphaV);
- }
- if (m_pClipScanV) {
- FX_Free(m_pClipScanV);
- }
- if (m_pAddClipScan) {
- FX_Free(m_pAddClipScan);
- }
-}
-void CFX_BitmapComposer::Compose(CFX_DIBitmap* pDest, const CFX_ClipRgn* pClipRgn, int bitmap_alpha,
- FX_DWORD mask_color, FX_RECT& dest_rect, FX_BOOL bVertical,
- FX_BOOL bFlipX, FX_BOOL bFlipY, FX_BOOL bRgbByteOrder,
- int alpha_flag, void* pIccTransform, int blend_type)
-{
- m_pBitmap = pDest;
- m_pClipRgn = pClipRgn;
- m_DestLeft = dest_rect.left;
- m_DestTop = dest_rect.top;
- m_DestWidth = dest_rect.Width();
- m_DestHeight = dest_rect.Height();
- m_BitmapAlpha = bitmap_alpha;
- m_MaskColor = mask_color;
- m_pClipMask = NULL;
- if (pClipRgn && pClipRgn->GetType() != CFX_ClipRgn::RectI) {
- m_pClipMask = pClipRgn->GetMask();
- }
- m_bVertical = bVertical;
- m_bFlipX = bFlipX;
- m_bFlipY = bFlipY;
- m_AlphaFlag = alpha_flag;
- m_pIccTransform = pIccTransform;
- m_bRgbByteOrder = bRgbByteOrder;
- m_BlendType = blend_type;
-}
-FX_BOOL CFX_BitmapComposer::SetInfo(int width, int height, FXDIB_Format src_format, FX_DWORD* pSrcPalette)
-{
- m_SrcFormat = src_format;
- if (!m_Compositor.Init(m_pBitmap->GetFormat(), src_format, width, pSrcPalette, m_MaskColor, FXDIB_BLEND_NORMAL,
- m_pClipMask != NULL || (m_BitmapAlpha < 255), m_bRgbByteOrder, m_AlphaFlag, m_pIccTransform)) {
- return FALSE;
- }
- if (m_bVertical) {
- m_pScanlineV = FX_Alloc(FX_BYTE, m_pBitmap->GetBPP() / 8 * width + 4);
- if (!m_pScanlineV) {
- return FALSE;
- }
- m_pClipScanV = FX_Alloc(FX_BYTE, m_pBitmap->GetHeight());
- if (!m_pClipScanV) {
- return FALSE;
- }
- if (m_pBitmap->m_pAlphaMask) {
- m_pScanlineAlphaV = FX_Alloc(FX_BYTE, width + 4);
- if (!m_pScanlineAlphaV) {
- return FALSE;
- }
- }
- }
- if (m_BitmapAlpha < 255) {
- m_pAddClipScan = FX_Alloc(FX_BYTE, m_bVertical ? m_pBitmap->GetHeight() : m_pBitmap->GetWidth());
- if (!m_pAddClipScan) {
- return FALSE;
- }
- }
- return TRUE;
-}
-void CFX_BitmapComposer::DoCompose(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int dest_width, FX_LPCBYTE clip_scan,
- FX_LPCBYTE src_extra_alpha, FX_LPBYTE dst_extra_alpha)
-{
- if (m_BitmapAlpha < 255) {
- if (clip_scan) {
- for (int i = 0; i < dest_width; i ++) {
- m_pAddClipScan[i] = clip_scan[i] * m_BitmapAlpha / 255;
- }
- } else {
- FXSYS_memset8(m_pAddClipScan, m_BitmapAlpha, dest_width);
- }
- clip_scan = m_pAddClipScan;
- }
- if (m_SrcFormat == FXDIB_8bppMask) {
- m_Compositor.CompositeByteMaskLine(dest_scan, src_scan, dest_width, clip_scan, dst_extra_alpha);
- } else if ((m_SrcFormat & 0xff) == 8) {
- m_Compositor.CompositePalBitmapLine(dest_scan, src_scan, 0, dest_width, clip_scan, src_extra_alpha, dst_extra_alpha);
- } else {
- m_Compositor.CompositeRgbBitmapLine(dest_scan, src_scan, dest_width, clip_scan, src_extra_alpha, dst_extra_alpha);
- }
-}
-void CFX_BitmapComposer::ComposeScanline(int line, FX_LPCBYTE scanline, FX_LPCBYTE scan_extra_alpha)
-{
- if (m_bVertical) {
- ComposeScanlineV(line, scanline, scan_extra_alpha);
- return;
- }
- FX_LPCBYTE clip_scan = NULL;
- if (m_pClipMask)
- clip_scan = m_pClipMask->GetBuffer() + (m_DestTop + line - m_pClipRgn->GetBox().top) *
- m_pClipMask->GetPitch() + (m_DestLeft - m_pClipRgn->GetBox().left);
- FX_LPBYTE dest_scan = (FX_LPBYTE)m_pBitmap->GetScanline(line + m_DestTop) +
- m_DestLeft * m_pBitmap->GetBPP() / 8;
- FX_LPBYTE dest_alpha_scan = m_pBitmap->m_pAlphaMask ?
- (FX_LPBYTE)m_pBitmap->m_pAlphaMask->GetScanline(line + m_DestTop) + m_DestLeft : NULL;
- DoCompose(dest_scan, scanline, m_DestWidth, clip_scan, scan_extra_alpha, dest_alpha_scan);
-}
-void CFX_BitmapComposer::ComposeScanlineV(int line, FX_LPCBYTE scanline, FX_LPCBYTE scan_extra_alpha)
-{
- int i;
- int Bpp = m_pBitmap->GetBPP() / 8;
- int dest_pitch = m_pBitmap->GetPitch();
- int dest_alpha_pitch = m_pBitmap->m_pAlphaMask ? m_pBitmap->m_pAlphaMask->GetPitch() : 0;
- int dest_x = m_DestLeft + (m_bFlipX ? (m_DestWidth - line - 1) : line);
- FX_LPBYTE dest_buf = m_pBitmap->GetBuffer() + dest_x * Bpp + m_DestTop * dest_pitch;
- FX_LPBYTE dest_alpha_buf = m_pBitmap->m_pAlphaMask ?
- m_pBitmap->m_pAlphaMask->GetBuffer() + dest_x + m_DestTop * dest_alpha_pitch : NULL;
- if (m_bFlipY) {
- dest_buf += dest_pitch * (m_DestHeight - 1);
- dest_alpha_buf += dest_alpha_pitch * (m_DestHeight - 1);
- }
- int y_step = dest_pitch;
- int y_alpha_step = dest_alpha_pitch;
- if (m_bFlipY) {
- y_step = -y_step;
- y_alpha_step = -y_alpha_step;
- }
- FX_LPBYTE src_scan = m_pScanlineV;
- FX_LPBYTE dest_scan = dest_buf;
- for (i = 0; i < m_DestHeight; i ++) {
- for (int j = 0; j < Bpp; j ++) {
- *src_scan++ = dest_scan[j];
- }
- dest_scan += y_step;
- }
- FX_LPBYTE src_alpha_scan = m_pScanlineAlphaV;
- FX_LPBYTE dest_alpha_scan = dest_alpha_buf;
- if (dest_alpha_scan) {
- for (i = 0; i < m_DestHeight; i ++) {
- *src_alpha_scan++ = *dest_alpha_scan;
- dest_alpha_scan += y_alpha_step;
- }
- }
- FX_LPBYTE clip_scan = NULL;
- if (m_pClipMask) {
- clip_scan = m_pClipScanV;
- int clip_pitch = m_pClipMask->GetPitch();
- FX_LPCBYTE src_clip = m_pClipMask->GetBuffer() + (m_DestTop - m_pClipRgn->GetBox().top) *
- clip_pitch + (dest_x - m_pClipRgn->GetBox().left);
- if (m_bFlipY) {
- src_clip += clip_pitch * (m_DestHeight - 1);
- clip_pitch = -clip_pitch;
- }
- for (i = 0; i < m_DestHeight; i ++) {
- clip_scan[i] = *src_clip;
- src_clip += clip_pitch;
- }
- }
- DoCompose(m_pScanlineV, scanline, m_DestHeight, clip_scan, scan_extra_alpha, m_pScanlineAlphaV);
- src_scan = m_pScanlineV;
- dest_scan = dest_buf;
- for (i = 0; i < m_DestHeight; i ++) {
- for (int j = 0; j < Bpp; j ++) {
- dest_scan[j] = *src_scan++;
- }
- dest_scan += y_step;
- }
- src_alpha_scan = m_pScanlineAlphaV;
- dest_alpha_scan = dest_alpha_buf;
- if (dest_alpha_scan) {
- for (i = 0; i < m_DestHeight; i ++) {
- *dest_alpha_scan = *src_alpha_scan++;
- dest_alpha_scan += y_alpha_step;
- }
- }
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxge/fx_ge.h"
+#include "../../../include/fxcodec/fx_codec.h"
+#include "dib_int.h"
+const FX_BYTE g_GammaRamp[256] = {
+ 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3,
+ 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7,
+ 8, 8, 8, 8, 9, 9, 9, 10, 10, 10, 11, 11, 12, 12, 12, 13,
+ 13, 13, 14, 14, 15, 15, 16, 16, 17, 17, 17, 18, 18, 19, 19, 20,
+ 20, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 27, 27, 28, 29, 29,
+ 30, 30, 31, 32, 32, 33, 34, 35, 35, 36, 37, 37, 38, 39, 40, 41,
+ 41, 42, 43, 44, 45, 45, 46, 47, 48, 49, 50, 51, 51, 52, 53, 54,
+ 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70,
+ 71, 72, 73, 74, 76, 77, 78, 79, 80, 81, 82, 84, 85, 86, 87, 88,
+ 90, 91, 92, 93, 95, 96, 97, 99, 100, 101, 103, 104, 105, 107, 108, 109,
+ 111, 112, 114, 115, 116, 118, 119, 121, 122, 124, 125, 127, 128, 130, 131, 133,
+ 134, 136, 138, 139, 141, 142, 144, 146, 147, 149, 151, 152, 154, 156, 157, 159,
+ 161, 163, 164, 166, 168, 170, 171, 173, 175, 177, 179, 181, 183, 184, 186, 188,
+ 190, 192, 194, 196, 198, 200, 202, 204, 206, 208, 210, 212, 214, 216, 218, 220,
+ 222, 224, 226, 229, 231, 233, 235, 237, 239, 242, 244, 246, 248, 250, 253, 255,
+};
+const FX_BYTE g_GammaInverse[256] = {
+ 0, 13, 22, 28, 34, 38, 42, 46, 50, 53, 56, 59, 61, 64, 66, 69,
+ 71, 73, 75, 77, 79, 81, 83, 85, 86, 88, 90, 92, 93, 95, 96, 98,
+ 99, 101, 102, 104, 105, 106, 108, 109, 110, 112, 113, 114, 115, 117, 118, 119,
+ 120, 121, 122, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136,
+ 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 148, 149, 150, 151,
+ 152, 153, 154, 155, 155, 156, 157, 158, 159, 159, 160, 161, 162, 163, 163, 164,
+ 165, 166, 167, 167, 168, 169, 170, 170, 171, 172, 173, 173, 174, 175, 175, 176,
+ 177, 178, 178, 179, 180, 180, 181, 182, 182, 183, 184, 185, 185, 186, 187, 187,
+ 188, 189, 189, 190, 190, 191, 192, 192, 193, 194, 194, 195, 196, 196, 197, 197,
+ 198, 199, 199, 200, 200, 201, 202, 202, 203, 203, 204, 205, 205, 206, 206, 207,
+ 208, 208, 209, 209, 210, 210, 211, 212, 212, 213, 213, 214, 214, 215, 215, 216,
+ 216, 217, 218, 218, 219, 219, 220, 220, 221, 221, 222, 222, 223, 223, 224, 224,
+ 225, 226, 226, 227, 227, 228, 228, 229, 229, 230, 230, 231, 231, 232, 232, 233,
+ 233, 234, 234, 235, 235, 236, 236, 237, 237, 238, 238, 238, 239, 239, 240, 240,
+ 241, 241, 242, 242, 243, 243, 244, 244, 245, 245, 246, 246, 246, 247, 247, 248,
+ 248, 249, 249, 250, 250, 251, 251, 251, 252, 252, 253, 253, 254, 254, 255, 255,
+};
+const FX_BYTE _color_sqrt[256] = {
+ 0x00, 0x03, 0x07, 0x0B, 0x0F, 0x12, 0x16, 0x19, 0x1D, 0x20, 0x23, 0x26, 0x29, 0x2C, 0x2F, 0x32,
+ 0x35, 0x37, 0x3A, 0x3C, 0x3F, 0x41, 0x43, 0x46, 0x48, 0x4A, 0x4C, 0x4E, 0x50, 0x52, 0x54, 0x56,
+ 0x57, 0x59, 0x5B, 0x5C, 0x5E, 0x60, 0x61, 0x63, 0x64, 0x65, 0x67, 0x68, 0x69, 0x6B, 0x6C, 0x6D,
+ 0x6E, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E,
+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E,
+ 0x8F, 0x90, 0x91, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C,
+ 0x9C, 0x9D, 0x9E, 0x9F, 0xA0, 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA4, 0xA5, 0xA6, 0xA7, 0xA7, 0xA8,
+ 0xA9, 0xAA, 0xAA, 0xAB, 0xAC, 0xAD, 0xAD, 0xAE, 0xAF, 0xB0, 0xB0, 0xB1, 0xB2, 0xB3, 0xB3, 0xB4,
+ 0xB5, 0xB5, 0xB6, 0xB7, 0xB7, 0xB8, 0xB9, 0xBA, 0xBA, 0xBB, 0xBC, 0xBC, 0xBD, 0xBE, 0xBE, 0xBF,
+ 0xC0, 0xC0, 0xC1, 0xC2, 0xC2, 0xC3, 0xC4, 0xC4, 0xC5, 0xC6, 0xC6, 0xC7, 0xC7, 0xC8, 0xC9, 0xC9,
+ 0xCA, 0xCB, 0xCB, 0xCC, 0xCC, 0xCD, 0xCE, 0xCE, 0xCF, 0xD0, 0xD0, 0xD1, 0xD1, 0xD2, 0xD3, 0xD3,
+ 0xD4, 0xD4, 0xD5, 0xD6, 0xD6, 0xD7, 0xD7, 0xD8, 0xD9, 0xD9, 0xDA, 0xDA, 0xDB, 0xDC, 0xDC, 0xDD,
+ 0xDD, 0xDE, 0xDE, 0xDF, 0xE0, 0xE0, 0xE1, 0xE1, 0xE2, 0xE2, 0xE3, 0xE4, 0xE4, 0xE5, 0xE5, 0xE6,
+ 0xE6, 0xE7, 0xE7, 0xE8, 0xE9, 0xE9, 0xEA, 0xEA, 0xEB, 0xEB, 0xEC, 0xEC, 0xED, 0xED, 0xEE, 0xEE,
+ 0xEF, 0xF0, 0xF0, 0xF1, 0xF1, 0xF2, 0xF2, 0xF3, 0xF3, 0xF4, 0xF4, 0xF5, 0xF5, 0xF6, 0xF6, 0xF7,
+ 0xF7, 0xF8, 0xF8, 0xF9, 0xF9, 0xFA, 0xFA, 0xFB, 0xFB, 0xFC, 0xFC, 0xFD, 0xFD, 0xFE, 0xFE, 0xFF
+};
+int _BLEND(int blend_mode, int back_color, int src_color)
+{
+ switch (blend_mode) {
+ case FXDIB_BLEND_NORMAL:
+ return src_color;
+ case FXDIB_BLEND_MULTIPLY:
+ return src_color * back_color / 255;
+ case FXDIB_BLEND_SCREEN:
+ return src_color + back_color - src_color * back_color / 255;
+ case FXDIB_BLEND_OVERLAY:
+ return _BLEND(FXDIB_BLEND_HARDLIGHT, src_color, back_color);
+ case FXDIB_BLEND_DARKEN:
+ return src_color < back_color ? src_color : back_color;
+ case FXDIB_BLEND_LIGHTEN:
+ return src_color > back_color ? src_color : back_color;
+ case FXDIB_BLEND_COLORDODGE: {
+ if (src_color == 255) {
+ return src_color;
+ }
+ int result = back_color * 255 / (255 - src_color);
+ if (result > 255) {
+ return 255;
+ }
+ return result;
+ }
+ case FXDIB_BLEND_COLORBURN: {
+ if (src_color == 0) {
+ return src_color;
+ }
+ int result = (255 - back_color) * 255 / src_color;
+ if (result > 255) {
+ result = 255;
+ }
+ return 255 - result;
+ }
+ case FXDIB_BLEND_HARDLIGHT:
+ if (src_color < 128) {
+ return (src_color * back_color * 2) / 255;
+ }
+ return _BLEND(FXDIB_BLEND_SCREEN, back_color, 2 * src_color - 255);
+ case FXDIB_BLEND_SOFTLIGHT: {
+ if (src_color < 128) {
+ return back_color - (255 - 2 * src_color) * back_color * (255 - back_color) / 255 / 255;
+ }
+ return back_color + (2 * src_color - 255) * (_color_sqrt[back_color] - back_color) / 255;
+ }
+ case FXDIB_BLEND_DIFFERENCE:
+ return back_color < src_color ? src_color - back_color : back_color - src_color;
+ case FXDIB_BLEND_EXCLUSION:
+ return back_color + src_color - 2 * back_color * src_color / 255;
+ }
+ return src_color;
+}
+struct _RGB {
+ int red;
+ int green;
+ int blue;
+};
+static inline int _Lum(_RGB color)
+{
+ return (color.red * 30 + color.green * 59 + color.blue * 11) / 100;
+}
+static _RGB _ClipColor(_RGB color)
+{
+ int l = _Lum(color);
+ int n = color.red;
+ if (color.green < n) {
+ n = color.green;
+ }
+ if (color.blue < n) {
+ n = color.blue;
+ }
+ int x = color.red;
+ if (color.green > x) {
+ x = color.green;
+ }
+ if (color.blue > x) {
+ x = color.blue;
+ }
+ if (n < 0) {
+ color.red = l + ((color.red - l) * l / (l - n));
+ color.green = l + ((color.green - l) * l / (l - n));
+ color.blue = l + ((color.blue - l) * l / (l - n));
+ }
+ if (x > 255) {
+ color.red = l + ((color.red - l) * (255 - l) / (x - l));
+ color.green = l + ((color.green - l) * (255 - l) / (x - l));
+ color.blue = l + ((color.blue - l) * (255 - l) / (x - l));
+ }
+ return color;
+}
+static _RGB _SetLum(_RGB color, int l)
+{
+ int d = l - _Lum(color);
+ color.red += d;
+ color.green += d;
+ color.blue += d;
+ return _ClipColor(color);
+}
+static int _Sat(_RGB color)
+{
+ int n = color.red;
+ if (color.green < n) {
+ n = color.green;
+ }
+ if (color.blue < n) {
+ n = color.blue;
+ }
+ int x = color.red;
+ if (color.green > x) {
+ x = color.green;
+ }
+ if (color.blue > x) {
+ x = color.blue;
+ }
+ return x - n;
+}
+static _RGB _SetSat(_RGB color, int s)
+{
+ int* max = &color.red;
+ int* mid = &color.red;
+ int* min = &color.red;
+ if (color.green > *max) {
+ max = &color.green;
+ }
+ if (color.blue > *max) {
+ max = &color.blue;
+ }
+ if (color.green < *min) {
+ min = &color.green;
+ }
+ if (color.blue < *min) {
+ min = &color.blue;
+ }
+ if (*max == *min) {
+ color.red = 0;
+ color.green = 0;
+ color.blue = 0;
+ return color;
+ }
+ if (max == &color.red) {
+ if (min == &color.green) {
+ mid = &color.blue;
+ } else {
+ mid = &color.green;
+ }
+ } else if (max == &color.green) {
+ if (min == &color.red) {
+ mid = &color.blue;
+ } else {
+ mid = &color.red;
+ }
+ } else {
+ if (min == &color.green) {
+ mid = &color.red;
+ } else {
+ mid = &color.green;
+ }
+ }
+ if (*max > *min) {
+ *mid = (*mid - *min) * s / (*max - *min);
+ *max = s;
+ *min = 0;
+ }
+ return color;
+}
+void _RGB_Blend(int blend_mode, FX_LPCBYTE src_scan, FX_BYTE* dest_scan, int results[3])
+{
+ _RGB src, back, result;
+ src.red = src_scan[2];
+ src.green = src_scan[1];
+ src.blue = src_scan[0];
+ back.red = dest_scan[2];
+ back.green = dest_scan[1];
+ back.blue = dest_scan[0];
+ switch (blend_mode) {
+ case FXDIB_BLEND_HUE:
+ result = _SetLum(_SetSat(src, _Sat(back)), _Lum(back));
+ break;
+ case FXDIB_BLEND_SATURATION:
+ result = _SetLum(_SetSat(back, _Sat(src)), _Lum(back));
+ break;
+ case FXDIB_BLEND_COLOR:
+ result = _SetLum(src, _Lum(back));
+ break;
+ case FXDIB_BLEND_LUMINOSITY:
+ result = _SetLum(back, _Lum(src));
+ break;
+ }
+ results[0] = result.blue;
+ results[1] = result.green;
+ results[2] = result.red;
+}
+inline void _CompositeRow_Argb2Mask(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int pixel_count, FX_LPCBYTE clip_scan)
+{
+ src_scan += 3;
+ for (int col = 0; col < pixel_count; col ++) {
+ int src_alpha = *src_scan;
+ if (clip_scan) {
+ src_alpha = clip_scan[col] * src_alpha / 255;
+ }
+ FX_BYTE back_alpha = *dest_scan;
+ if (!back_alpha) {
+ *dest_scan = src_alpha;
+ } else if (src_alpha) {
+ *dest_scan = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ }
+ dest_scan ++;
+ src_scan += 4;
+ }
+}
+void _CompositeRow_Rgba2Mask(FX_LPBYTE dest_scan, FX_LPCBYTE src_alpha_scan, int pixel_count, FX_LPCBYTE clip_scan)
+{
+ for (int col = 0; col < pixel_count; col ++) {
+ int src_alpha = *src_alpha_scan++;
+ if (clip_scan) {
+ src_alpha = clip_scan[col] * src_alpha / 255;
+ }
+ FX_BYTE back_alpha = *dest_scan;
+ if (!back_alpha) {
+ *dest_scan = src_alpha;
+ } else if (src_alpha) {
+ *dest_scan = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ }
+ dest_scan ++;
+ }
+}
+void _CompositeRow_Rgb2Mask(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, FX_LPCBYTE clip_scan)
+{
+ if (clip_scan) {
+ for (int i = 0; i < width; i ++) {
+ *dest_scan = FXDIB_ALPHA_UNION(*dest_scan, *clip_scan);
+ dest_scan ++;
+ clip_scan ++;
+ }
+ } else {
+ FXSYS_memset8(dest_scan, 0xff, width);
+ }
+}
+void _CompositeRow_Argb2Graya(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int pixel_count, int blend_type, FX_LPCBYTE clip_scan,
+ FX_LPCBYTE src_alpha_scan, FX_LPBYTE dst_alpha_scan, void* pIccTransform)
+{
+ ICodec_IccModule* pIccModule = NULL;
+ if (pIccTransform) {
+ pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ }
+ if (blend_type) {
+ FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
+ int blended_color;
+ if (src_alpha_scan) {
+ for (int col = 0; col < pixel_count; col ++) {
+ FX_BYTE back_alpha = *dst_alpha_scan;
+ if (back_alpha == 0) {
+ int src_alpha = *src_alpha_scan++;
+ if (clip_scan) {
+ src_alpha = clip_scan[col] * src_alpha / 255;
+ }
+ if (src_alpha) {
+ if (pIccTransform) {
+ pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, 1);
+ } else {
+ *dest_scan = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
+ }
+ *dst_alpha_scan = src_alpha;
+ }
+ dest_scan ++;
+ dst_alpha_scan ++;
+ src_scan += 3;
+ continue;
+ }
+ FX_BYTE src_alpha = *src_alpha_scan++;
+ if (clip_scan) {
+ src_alpha = clip_scan[col] * src_alpha / 255;
+ }
+ if (src_alpha == 0) {
+ dest_scan ++;
+ dst_alpha_scan ++;
+ src_scan += 3;
+ continue;
+ }
+ *dst_alpha_scan = FXDIB_ALPHA_UNION(back_alpha, src_alpha);
+ int alpha_ratio = src_alpha * 255 / (*dst_alpha_scan);
+ FX_BYTE gray;
+ if (pIccTransform) {
+ pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);
+ } else {
+ gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
+ }
+ if (bNonseparableBlend) {
+ blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
+ }
+ gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, *dest_scan, gray);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
+ dest_scan ++;
+ dst_alpha_scan++;
+ src_scan += 3;
+ }
+ } else
+ for (int col = 0; col < pixel_count; col ++) {
+ FX_BYTE back_alpha = *dst_alpha_scan;
+ if (back_alpha == 0) {
+ int src_alpha = src_scan[3];
+ if (clip_scan) {
+ src_alpha = clip_scan[col] * src_alpha / 255;
+ }
+ if (src_alpha) {
+ if (pIccTransform) {
+ pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, 1);
+ } else {
+ *dest_scan = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
+ }
+ *dst_alpha_scan = src_alpha;
+ }
+ dest_scan ++;
+ dst_alpha_scan ++;
+ src_scan += 4;
+ continue;
+ }
+ FX_BYTE src_alpha = src_scan[3];
+ if (clip_scan) {
+ src_alpha = clip_scan[col] * src_alpha / 255;
+ }
+ if (src_alpha == 0) {
+ dest_scan ++;
+ dst_alpha_scan ++;
+ src_scan += 4;
+ continue;
+ }
+ *dst_alpha_scan = FXDIB_ALPHA_UNION(back_alpha, src_alpha);
+ int alpha_ratio = src_alpha * 255 / (*dst_alpha_scan);
+ FX_BYTE gray;
+ if (pIccTransform) {
+ pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);
+ } else {
+ gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
+ }
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
+ dest_scan ++;
+ dst_alpha_scan++;
+ src_scan += 4;
+ }
+ return;
+ }
+ if (src_alpha_scan) {
+ for (int col = 0; col < pixel_count; col ++) {
+ FX_BYTE back_alpha = *dst_alpha_scan;
+ if (back_alpha == 0) {
+ int src_alpha = *src_alpha_scan++;
+ if (clip_scan) {
+ src_alpha = clip_scan[col] * src_alpha / 255;
+ }
+ if (src_alpha) {
+ if (pIccTransform) {
+ pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, 1);
+ } else {
+ *dest_scan = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
+ }
+ *dst_alpha_scan = src_alpha;
+ }
+ dest_scan ++;
+ dst_alpha_scan ++;
+ src_scan += 3;
+ continue;
+ }
+ FX_BYTE src_alpha = *src_alpha_scan++;
+ if (clip_scan) {
+ src_alpha = clip_scan[col] * src_alpha / 255;
+ }
+ if (src_alpha == 0) {
+ dest_scan ++;
+ dst_alpha_scan ++;
+ src_scan += 3;
+ continue;
+ }
+ *dst_alpha_scan = FXDIB_ALPHA_UNION(back_alpha, src_alpha);
+ int alpha_ratio = src_alpha * 255 / (*dst_alpha_scan);
+ FX_BYTE gray;
+ if (pIccTransform) {
+ pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);
+ } else {
+ gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
+ }
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
+ dest_scan ++;
+ dst_alpha_scan++;
+ src_scan += 3;
+ }
+ } else
+ for (int col = 0; col < pixel_count; col ++) {
+ FX_BYTE back_alpha = *dst_alpha_scan;
+ if (back_alpha == 0) {
+ int src_alpha = src_scan[3];
+ if (clip_scan) {
+ src_alpha = clip_scan[col] * src_alpha / 255;
+ }
+ if (src_alpha) {
+ if (pIccTransform) {
+ pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, 1);
+ } else {
+ *dest_scan = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
+ }
+ *dst_alpha_scan = src_alpha;
+ }
+ dest_scan ++;
+ dst_alpha_scan ++;
+ src_scan += 4;
+ continue;
+ }
+ FX_BYTE src_alpha = src_scan[3];
+ if (clip_scan) {
+ src_alpha = clip_scan[col] * src_alpha / 255;
+ }
+ if (src_alpha == 0) {
+ dest_scan ++;
+ dst_alpha_scan ++;
+ src_scan += 4;
+ continue;
+ }
+ *dst_alpha_scan = FXDIB_ALPHA_UNION(back_alpha, src_alpha);
+ int alpha_ratio = src_alpha * 255 / (*dst_alpha_scan);
+ FX_BYTE gray;
+ if (pIccTransform) {
+ pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);
+ } else {
+ gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
+ }
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
+ dest_scan ++;
+ dst_alpha_scan++;
+ src_scan += 4;
+ }
+}
+inline void _CompositeRow_Argb2Gray(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int pixel_count,
+ int blend_type, FX_LPCBYTE clip_scan,
+ FX_LPCBYTE src_alpha_scan, void* pIccTransform)
+{
+ ICodec_IccModule* pIccModule = NULL;
+ FX_BYTE gray;
+ if (pIccTransform) {
+ pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ }
+ if (blend_type) {
+ FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
+ int blended_color;
+ if (src_alpha_scan) {
+ for (int col = 0; col < pixel_count; col ++) {
+ int src_alpha = *src_alpha_scan++;
+ if (clip_scan) {
+ src_alpha = clip_scan[col] * src_alpha / 255;
+ }
+ if (src_alpha) {
+ if (pIccTransform) {
+ pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);
+ } else {
+ gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
+ }
+ if (bNonseparableBlend) {
+ blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
+ }
+ gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, *dest_scan, gray);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, src_alpha);
+ }
+ dest_scan ++;
+ src_scan += 3;
+ }
+ } else
+ for (int col = 0; col < pixel_count; col ++) {
+ int src_alpha = src_scan[3];
+ if (clip_scan) {
+ src_alpha = clip_scan[col] * src_alpha / 255;
+ }
+ if (src_alpha) {
+ if (pIccTransform) {
+ pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);
+ } else {
+ gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
+ }
+ if (bNonseparableBlend) {
+ blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
+ }
+ gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, *dest_scan, gray);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, src_alpha);
+ }
+ dest_scan ++;
+ src_scan += 4;
+ }
+ return;
+ }
+ if (src_alpha_scan) {
+ for (int col = 0; col < pixel_count; col ++) {
+ int src_alpha = *src_alpha_scan++;
+ if (clip_scan) {
+ src_alpha = clip_scan[col] * src_alpha / 255;
+ }
+ if (src_alpha) {
+ if (pIccTransform) {
+ pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);
+ } else {
+ gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
+ }
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, src_alpha);
+ }
+ dest_scan ++;
+ src_scan += 3;
+ }
+ } else
+ for (int col = 0; col < pixel_count; col ++) {
+ int src_alpha = src_scan[3];
+ if (clip_scan) {
+ src_alpha = clip_scan[col] * src_alpha / 255;
+ }
+ if (src_alpha) {
+ if (pIccTransform) {
+ pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);
+ } else {
+ gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
+ }
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, src_alpha);
+ }
+ dest_scan ++;
+ src_scan += 4;
+ }
+}
+inline void _CompositeRow_Rgb2Gray(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_Bpp, int pixel_count,
+ int blend_type, FX_LPCBYTE clip_scan,
+ void* pIccTransform)
+{
+ ICodec_IccModule* pIccModule = NULL;
+ FX_BYTE gray;
+ if (pIccTransform) {
+ pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ }
+ if (blend_type) {
+ FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
+ int blended_color;
+ for (int col = 0; col < pixel_count; col ++) {
+ if (pIccTransform) {
+ pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);
+ } else {
+ gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
+ }
+ if (bNonseparableBlend) {
+ blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
+ }
+ gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, *dest_scan, gray);
+ if (clip_scan && clip_scan[col] < 255) {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, clip_scan[col]);
+ } else {
+ *dest_scan = gray;
+ }
+ dest_scan ++;
+ src_scan += src_Bpp;
+ }
+ return;
+ }
+ for (int col = 0; col < pixel_count; col ++) {
+ if (pIccTransform) {
+ pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);
+ } else {
+ gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
+ }
+ if (clip_scan && clip_scan[col] < 255) {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, clip_scan[col]);
+ } else {
+ *dest_scan = gray;
+ }
+ dest_scan ++;
+ src_scan += src_Bpp;
+ }
+}
+void _CompositeRow_Rgb2Graya(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_Bpp, int pixel_count,
+ int blend_type, FX_LPCBYTE clip_scan,
+ FX_LPBYTE dest_alpha_scan, void* pIccTransform)
+{
+ ICodec_IccModule* pIccModule = NULL;
+ if (pIccTransform) {
+ pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ }
+ if (blend_type) {
+ int blended_color;
+ FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
+ for (int col = 0; col < pixel_count; col ++) {
+ int back_alpha = *dest_alpha_scan;
+ if (back_alpha == 0) {
+ if (pIccTransform) {
+ pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, 1);
+ } else {
+ *dest_scan = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
+ }
+ dest_scan ++;
+ dest_alpha_scan++;
+ src_scan += src_Bpp;
+ continue;
+ }
+ int src_alpha = 255;
+ if (clip_scan) {
+ src_alpha = clip_scan[col];
+ }
+ if (src_alpha == 0) {
+ dest_scan ++;
+ dest_alpha_scan ++;
+ src_scan += src_Bpp;
+ continue;
+ }
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ *dest_alpha_scan++ = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ FX_BYTE gray;
+ if (pIccTransform) {
+ pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);
+ } else {
+ gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
+ }
+ if (bNonseparableBlend) {
+ blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
+ }
+ gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, *dest_scan, gray);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
+ dest_scan ++;
+ src_scan += src_Bpp;
+ }
+ return;
+ }
+ for (int col = 0; col < pixel_count; col ++) {
+ int src_alpha = 255;
+ if (clip_scan) {
+ src_alpha = clip_scan[col];
+ }
+ if (src_alpha == 255) {
+ if (pIccTransform) {
+ pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, 1);
+ } else {
+ *dest_scan = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
+ }
+ dest_scan ++;
+ *dest_alpha_scan++ = 255;
+ src_scan += src_Bpp;
+ continue;
+ }
+ if (src_alpha == 0) {
+ dest_scan ++;
+ dest_alpha_scan ++;
+ src_scan += src_Bpp;
+ continue;
+ }
+ int back_alpha = *dest_alpha_scan;
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ *dest_alpha_scan++ = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ FX_BYTE gray;
+ if (pIccTransform) {
+ pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);
+ } else {
+ gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
+ }
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
+ dest_scan ++;
+ src_scan += src_Bpp;
+ }
+}
+void _CompositeRow_Argb2Argb(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int pixel_count, int blend_type, FX_LPCBYTE clip_scan,
+ FX_LPBYTE dest_alpha_scan, FX_LPCBYTE src_alpha_scan)
+{
+ int blended_colors[3];
+ FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
+ if (dest_alpha_scan == NULL) {
+ if (src_alpha_scan == NULL) {
+ FX_BYTE back_alpha = 0;
+ for (int col = 0; col < pixel_count; col ++) {
+ back_alpha = dest_scan[3];
+ if (back_alpha == 0) {
+ if (clip_scan) {
+ int src_alpha = clip_scan[col] * src_scan[3] / 255;
+ FXARGB_SETDIB(dest_scan, (FXARGB_GETDIB(src_scan) & 0xffffff) | (src_alpha << 24));
+ } else {
+ FXARGB_COPY(dest_scan, src_scan);
+ }
+ dest_scan += 4;
+ src_scan += 4;
+ continue;
+ }
+ FX_BYTE src_alpha;
+ if (clip_scan == NULL) {
+ src_alpha = src_scan[3];
+ } else {
+ src_alpha = clip_scan[col] * src_scan[3] / 255;
+ }
+ if (src_alpha == 0) {
+ dest_scan += 4;
+ src_scan += 4;
+ continue;
+ }
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ dest_scan[3] = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ if (bNonseparableBlend) {
+ _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
+ }
+ for (int color = 0; color < 3; color ++) {
+ if (blend_type) {
+ int blended = bNonseparableBlend ? blended_colors[color] :
+ _BLEND(blend_type, *dest_scan, *src_scan);
+ blended = FXDIB_ALPHA_MERGE(*src_scan, blended, back_alpha);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
+ } else {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, alpha_ratio);
+ }
+ dest_scan ++;
+ src_scan ++;
+ }
+ dest_scan ++;
+ src_scan ++;
+ }
+ } else {
+ for (int col = 0; col < pixel_count; col ++) {
+ FX_BYTE back_alpha = dest_scan[3];
+ if (back_alpha == 0) {
+ if (clip_scan) {
+ int src_alpha = clip_scan[col] * (*src_alpha_scan) / 255;
+ FXARGB_SETDIB(dest_scan, FXARGB_MAKE((src_alpha << 24), src_scan[2], src_scan[1], *src_scan));
+ } else {
+ FXARGB_SETDIB(dest_scan, FXARGB_MAKE((*src_alpha_scan << 24), src_scan[2], src_scan[1], *src_scan));
+ }
+ dest_scan += 4;
+ src_scan += 3;
+ src_alpha_scan ++;
+ continue;
+ }
+ FX_BYTE src_alpha;
+ if (clip_scan == NULL) {
+ src_alpha = *src_alpha_scan ++;
+ } else {
+ src_alpha = clip_scan[col] * (*src_alpha_scan ++) / 255;
+ }
+ if (src_alpha == 0) {
+ dest_scan += 4;
+ src_scan += 3;
+ continue;
+ }
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ dest_scan[3] = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ if (bNonseparableBlend) {
+ _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
+ }
+ for (int color = 0; color < 3; color ++) {
+ if (blend_type) {
+ int blended = bNonseparableBlend ? blended_colors[color] :
+ _BLEND(blend_type, *dest_scan, *src_scan);
+ blended = FXDIB_ALPHA_MERGE(*src_scan, blended, back_alpha);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
+ } else {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, alpha_ratio);
+ }
+ dest_scan ++;
+ src_scan ++;
+ }
+ dest_scan ++;
+ }
+ }
+ } else {
+ if (src_alpha_scan) {
+ for (int col = 0; col < pixel_count; col ++) {
+ FX_BYTE back_alpha = *dest_alpha_scan;
+ if (back_alpha == 0) {
+ if (clip_scan) {
+ int src_alpha = clip_scan[col] * (*src_alpha_scan) / 255;
+ *dest_alpha_scan = src_alpha;
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ } else {
+ *dest_alpha_scan = *src_alpha_scan;
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ }
+ dest_alpha_scan ++;
+ src_alpha_scan ++;
+ continue;
+ }
+ FX_BYTE src_alpha;
+ if (clip_scan == NULL) {
+ src_alpha = *src_alpha_scan ++;
+ } else {
+ src_alpha = clip_scan[col] * (*src_alpha_scan ++) / 255;
+ }
+ if (src_alpha == 0) {
+ dest_scan += 3;
+ src_scan += 3;
+ dest_alpha_scan ++;
+ continue;
+ }
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ *dest_alpha_scan ++ = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ if (bNonseparableBlend) {
+ _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
+ }
+ for (int color = 0; color < 3; color ++) {
+ if (blend_type) {
+ int blended = bNonseparableBlend ? blended_colors[color] :
+ _BLEND(blend_type, *dest_scan, *src_scan);
+ blended = FXDIB_ALPHA_MERGE(*src_scan, blended, back_alpha);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
+ } else {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, alpha_ratio);
+ }
+ dest_scan ++;
+ src_scan ++;
+ }
+ }
+ } else {
+ for (int col = 0; col < pixel_count; col ++) {
+ FX_BYTE back_alpha = *dest_alpha_scan;
+ if (back_alpha == 0) {
+ if (clip_scan) {
+ int src_alpha = clip_scan[col] * src_scan[3] / 255;
+ *dest_alpha_scan = src_alpha;
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ } else {
+ *dest_alpha_scan = src_scan[3];
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ }
+ dest_alpha_scan ++;
+ src_scan ++;
+ continue;
+ }
+ FX_BYTE src_alpha;
+ if (clip_scan == NULL) {
+ src_alpha = src_scan[3];
+ } else {
+ src_alpha = clip_scan[col] * src_scan[3] / 255;
+ }
+ if (src_alpha == 0) {
+ dest_scan += 3;
+ src_scan += 4;
+ dest_alpha_scan ++;
+ continue;
+ }
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ *dest_alpha_scan++ = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ if (bNonseparableBlend) {
+ _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
+ }
+ for (int color = 0; color < 3; color ++) {
+ if (blend_type) {
+ int blended = bNonseparableBlend ? blended_colors[color] :
+ _BLEND(blend_type, *dest_scan, *src_scan);
+ blended = FXDIB_ALPHA_MERGE(*src_scan, blended, back_alpha);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
+ } else {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, alpha_ratio);
+ }
+ dest_scan ++;
+ src_scan ++;
+ }
+ src_scan ++;
+ }
+ }
+ }
+}
+void _CompositeRow_Rgb2Argb_Blend_NoClip(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int src_Bpp,
+ FX_LPBYTE dest_alpha_scan)
+{
+ int blended_colors[3];
+ FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
+ int src_gap = src_Bpp - 3;
+ if (dest_alpha_scan == NULL) {
+ for (int col = 0; col < width; col ++) {
+ FX_BYTE back_alpha = dest_scan[3];
+ if (back_alpha == 0) {
+ if (src_Bpp == 4) {
+ FXARGB_SETDIB(dest_scan, 0xff000000 | FXARGB_GETDIB(src_scan));
+ } else {
+ FXARGB_SETDIB(dest_scan, FXARGB_MAKE(0xff, src_scan[2], src_scan[1], src_scan[0]));
+ }
+ dest_scan += 4;
+ src_scan += src_Bpp;
+ continue;
+ }
+ dest_scan[3] = 0xff;
+ if (bNonseparableBlend) {
+ _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
+ }
+ for (int color = 0; color < 3; color ++) {
+ int src_color = *src_scan;
+ int blended = bNonseparableBlend ? blended_colors[color] :
+ _BLEND(blend_type, *dest_scan, src_color);
+ *dest_scan = FXDIB_ALPHA_MERGE(src_color, blended, back_alpha);
+ dest_scan ++;
+ src_scan ++;
+ }
+ dest_scan ++;
+ src_scan += src_gap;
+ }
+ } else {
+ for (int col = 0; col < width; col ++) {
+ FX_BYTE back_alpha = *dest_alpha_scan;
+ if (back_alpha == 0) {
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ *dest_alpha_scan++ = 0xff;
+ src_scan += src_gap;
+ continue;
+ }
+ *dest_alpha_scan++ = 0xff;
+ if (bNonseparableBlend) {
+ _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
+ }
+ for (int color = 0; color < 3; color ++) {
+ int src_color = *src_scan;
+ int blended = bNonseparableBlend ? blended_colors[color] :
+ _BLEND(blend_type, *dest_scan, src_color);
+ *dest_scan = FXDIB_ALPHA_MERGE(src_color, blended, back_alpha);
+ dest_scan ++;
+ src_scan ++;
+ }
+ src_scan += src_gap;
+ }
+ }
+}
+inline void _CompositeRow_Rgb2Argb_Blend_Clip(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int src_Bpp, FX_LPCBYTE clip_scan,
+ FX_LPBYTE dest_alpha_scan)
+{
+ int blended_colors[3];
+ FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
+ int src_gap = src_Bpp - 3;
+ if (dest_alpha_scan == NULL) {
+ for (int col = 0; col < width; col ++) {
+ int src_alpha = *clip_scan ++;
+ FX_BYTE back_alpha = dest_scan[3];
+ if (back_alpha == 0) {
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ src_scan += src_gap;
+ dest_scan ++;
+ continue;
+ }
+ if (src_alpha == 0) {
+ dest_scan += 4;
+ src_scan += src_Bpp;
+ continue;
+ }
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ dest_scan[3] = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ if (bNonseparableBlend) {
+ _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
+ }
+ for (int color = 0; color < 3; color ++) {
+ int src_color = *src_scan;
+ int blended = bNonseparableBlend ? blended_colors[color] :
+ _BLEND(blend_type, *dest_scan, src_color);
+ blended = FXDIB_ALPHA_MERGE(src_color, blended, back_alpha);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
+ dest_scan ++;
+ src_scan ++;
+ }
+ dest_scan ++;
+ src_scan += src_gap;
+ }
+ } else {
+ for (int col = 0; col < width; col ++) {
+ int src_alpha = *clip_scan ++;
+ FX_BYTE back_alpha = *dest_alpha_scan;
+ if (back_alpha == 0) {
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ src_scan += src_gap;
+ dest_alpha_scan++;
+ continue;
+ }
+ if (src_alpha == 0) {
+ dest_scan += 3;
+ dest_alpha_scan++;
+ src_scan += src_Bpp;
+ continue;
+ }
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ *dest_alpha_scan++ = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ if (bNonseparableBlend) {
+ _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
+ }
+ for (int color = 0; color < 3; color ++) {
+ int src_color = *src_scan;
+ int blended = bNonseparableBlend ? blended_colors[color] :
+ _BLEND(blend_type, *dest_scan, src_color);
+ blended = FXDIB_ALPHA_MERGE(src_color, blended, back_alpha);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
+ dest_scan ++;
+ src_scan ++;
+ }
+ src_scan += src_gap;
+ }
+ }
+}
+inline void _CompositeRow_Rgb2Argb_NoBlend_Clip(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int src_Bpp, FX_LPCBYTE clip_scan,
+ FX_LPBYTE dest_alpha_scan)
+{
+ int src_gap = src_Bpp - 3;
+ if (dest_alpha_scan == NULL) {
+ for (int col = 0; col < width; col ++) {
+ int src_alpha = clip_scan[col];
+ if (src_alpha == 255) {
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = 255;
+ src_scan += src_gap;
+ continue;
+ }
+ if (src_alpha == 0) {
+ dest_scan += 4;
+ src_scan += src_Bpp;
+ continue;
+ }
+ int back_alpha = dest_scan[3];
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ dest_scan[3] = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ for (int color = 0; color < 3; color ++) {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, alpha_ratio);
+ dest_scan ++;
+ src_scan ++;
+ }
+ dest_scan ++;
+ src_scan += src_gap;
+ }
+ } else {
+ for (int col = 0; col < width; col ++) {
+ int src_alpha = clip_scan[col];
+ if (src_alpha == 255) {
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ *dest_alpha_scan++ = 255;
+ src_scan += src_gap;
+ continue;
+ }
+ if (src_alpha == 0) {
+ dest_scan += 3;
+ dest_alpha_scan ++;
+ src_scan += src_Bpp;
+ continue;
+ }
+ int back_alpha = *dest_alpha_scan;
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ *dest_alpha_scan ++ = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ for (int color = 0; color < 3; color ++) {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, alpha_ratio);
+ dest_scan ++;
+ src_scan ++;
+ }
+ src_scan += src_gap;
+ }
+ }
+}
+inline void _CompositeRow_Rgb2Argb_NoBlend_NoClip(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int src_Bpp,
+ FX_LPBYTE dest_alpha_scan)
+{
+ if (dest_alpha_scan == NULL) {
+ for (int col = 0; col < width; col ++) {
+ if (src_Bpp == 4) {
+ FXARGB_SETDIB(dest_scan, 0xff000000 | FXARGB_GETDIB(src_scan));
+ } else {
+ FXARGB_SETDIB(dest_scan, FXARGB_MAKE(0xff, src_scan[2], src_scan[1], src_scan[0]));
+ }
+ dest_scan += 4;
+ src_scan += src_Bpp;
+ }
+ } else {
+ int src_gap = src_Bpp - 3;
+ for (int col = 0; col < width; col ++) {
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ *dest_alpha_scan++ = 0xff;
+ src_scan += src_gap;
+ }
+ }
+}
+inline void _CompositeRow_Argb2Rgb_Blend(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int dest_Bpp, FX_LPCBYTE clip_scan,
+ FX_LPCBYTE src_alpha_scan)
+{
+ int blended_colors[3];
+ FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
+ int dest_gap = dest_Bpp - 3;
+ if (src_alpha_scan == NULL) {
+ for (int col = 0; col < width; col ++) {
+ FX_BYTE src_alpha;
+ if (clip_scan) {
+ src_alpha = src_scan[3] * (*clip_scan++) / 255;
+ } else {
+ src_alpha = src_scan[3];
+ }
+ if (src_alpha == 0) {
+ dest_scan += dest_Bpp;
+ src_scan += 4;
+ continue;
+ }
+ if (bNonseparableBlend) {
+ _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
+ }
+ for (int color = 0; color < 3; color ++) {
+ int back_color = *dest_scan;
+ int blended = bNonseparableBlend ? blended_colors[color] :
+ _BLEND(blend_type, back_color, *src_scan);
+ *dest_scan = FXDIB_ALPHA_MERGE(back_color, blended, src_alpha);
+ dest_scan ++;
+ src_scan ++;
+ }
+ dest_scan += dest_gap;
+ src_scan ++;
+ }
+ } else {
+ for (int col = 0; col < width; col ++) {
+ FX_BYTE src_alpha;
+ if (clip_scan) {
+ src_alpha = (*src_alpha_scan++) * (*clip_scan++) / 255;
+ } else {
+ src_alpha = *src_alpha_scan++;
+ }
+ if (src_alpha == 0) {
+ dest_scan += dest_Bpp;
+ src_scan += 3;
+ continue;
+ }
+ if (bNonseparableBlend) {
+ _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
+ }
+ for (int color = 0; color < 3; color ++) {
+ int back_color = *dest_scan;
+ int blended = bNonseparableBlend ? blended_colors[color] :
+ _BLEND(blend_type, back_color, *src_scan);
+ *dest_scan = FXDIB_ALPHA_MERGE(back_color, blended, src_alpha);
+ dest_scan ++;
+ src_scan ++;
+ }
+ dest_scan += dest_gap;
+ }
+ }
+}
+inline void _CompositeRow_Argb2Rgb_NoBlend(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int dest_Bpp, FX_LPCBYTE clip_scan,
+ FX_LPCBYTE src_alpha_scan)
+{
+ int dest_gap = dest_Bpp - 3;
+ if (src_alpha_scan == NULL) {
+ for (int col = 0; col < width; col ++) {
+ FX_BYTE src_alpha;
+ if (clip_scan) {
+ src_alpha = src_scan[3] * (*clip_scan++) / 255;
+ } else {
+ src_alpha = src_scan[3];
+ }
+ if (src_alpha == 255) {
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ dest_scan += dest_gap;
+ src_scan ++;
+ continue;
+ }
+ if (src_alpha == 0) {
+ dest_scan += dest_Bpp;
+ src_scan += 4;
+ continue;
+ }
+ for (int color = 0; color < 3; color ++) {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, src_alpha);
+ dest_scan ++;
+ src_scan ++;
+ }
+ dest_scan += dest_gap;
+ src_scan ++;
+ }
+ } else {
+ for (int col = 0; col < width; col ++) {
+ FX_BYTE src_alpha;
+ if (clip_scan) {
+ src_alpha = (*src_alpha_scan++) * (*clip_scan++) / 255;
+ } else {
+ src_alpha = *src_alpha_scan++;
+ }
+ if (src_alpha == 255) {
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ dest_scan += dest_gap;
+ continue;
+ }
+ if (src_alpha == 0) {
+ dest_scan += dest_Bpp;
+ src_scan += 3;
+ continue;
+ }
+ for (int color = 0; color < 3; color ++) {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, src_alpha);
+ dest_scan ++;
+ src_scan ++;
+ }
+ dest_scan += dest_gap;
+ }
+ }
+}
+inline void _CompositeRow_Rgb2Rgb_Blend_NoClip(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int dest_Bpp, int src_Bpp)
+{
+ int blended_colors[3];
+ FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
+ int dest_gap = dest_Bpp - 3;
+ int src_gap = src_Bpp - 3;
+ for (int col = 0; col < width; col ++) {
+ if (bNonseparableBlend) {
+ _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
+ }
+ for (int color = 0; color < 3; color ++) {
+ int back_color = *dest_scan;
+ int src_color = *src_scan;
+ int blended = bNonseparableBlend ? blended_colors[color] :
+ _BLEND(blend_type, back_color, src_color);
+ *dest_scan = blended;
+ dest_scan ++;
+ src_scan ++;
+ }
+ dest_scan += dest_gap;
+ src_scan += src_gap;
+ }
+}
+inline void _CompositeRow_Rgb2Rgb_Blend_Clip(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int dest_Bpp, int src_Bpp, FX_LPCBYTE clip_scan)
+{
+ int blended_colors[3];
+ FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
+ int dest_gap = dest_Bpp - 3;
+ int src_gap = src_Bpp - 3;
+ for (int col = 0; col < width; col ++) {
+ FX_BYTE src_alpha = *clip_scan ++;
+ if (src_alpha == 0) {
+ dest_scan += dest_Bpp;
+ src_scan += src_Bpp;
+ continue;
+ }
+ if (bNonseparableBlend) {
+ _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
+ }
+ for (int color = 0; color < 3; color ++) {
+ int src_color = *src_scan;
+ int back_color = *dest_scan;
+ int blended = bNonseparableBlend ? blended_colors[color] :
+ _BLEND(blend_type, back_color, src_color);
+ *dest_scan = FXDIB_ALPHA_MERGE(back_color, blended, src_alpha);
+ dest_scan ++;
+ src_scan ++;
+ }
+ dest_scan += dest_gap;
+ src_scan += src_gap;
+ }
+}
+inline void _CompositeRow_Rgb2Rgb_NoBlend_NoClip(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int dest_Bpp, int src_Bpp)
+{
+ if (dest_Bpp == src_Bpp) {
+ FXSYS_memcpy32(dest_scan, src_scan, width * dest_Bpp);
+ return;
+ }
+ for (int col = 0; col < width; col ++) {
+ dest_scan[0] = src_scan[0];
+ dest_scan[1] = src_scan[1];
+ dest_scan[2] = src_scan[2];
+ dest_scan += dest_Bpp;
+ src_scan += src_Bpp;
+ }
+}
+inline void _CompositeRow_Rgb2Rgb_NoBlend_Clip(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int dest_Bpp, int src_Bpp, FX_LPCBYTE clip_scan)
+{
+ for (int col = 0; col < width; col ++) {
+ int src_alpha = clip_scan[col];
+ if (src_alpha == 255) {
+ dest_scan[0] = src_scan[0];
+ dest_scan[1] = src_scan[1];
+ dest_scan[2] = src_scan[2];
+ } else if (src_alpha) {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, src_alpha);
+ dest_scan ++;
+ src_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, src_alpha);
+ dest_scan ++;
+ src_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, src_alpha);
+ dest_scan += dest_Bpp - 2;
+ src_scan += src_Bpp - 2;
+ continue;
+ }
+ dest_scan += dest_Bpp;
+ src_scan += src_Bpp;
+ }
+}
+void _CompositeRow_Argb2Argb_Transform(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int pixel_count, int blend_type, FX_LPCBYTE clip_scan,
+ FX_LPBYTE dest_alpha_scan, FX_LPCBYTE src_alpha_scan, FX_LPBYTE src_cache_scan, void* pIccTransform)
+{
+ FX_LPBYTE dp = src_cache_scan;
+ ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ if (src_alpha_scan) {
+ if (dest_alpha_scan == NULL) {
+ for (int col = 0; col < pixel_count; col ++) {
+ pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);
+ dp[3] = *src_alpha_scan++;
+ src_scan += 3;
+ dp += 4;
+ }
+ src_alpha_scan = NULL;
+ } else {
+ pIccModule->TranslateScanline(pIccTransform, dp, src_scan, pixel_count);
+ }
+ } else {
+ if (dest_alpha_scan == NULL) {
+ for (int col = 0; col < pixel_count; col ++) {
+ pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);
+ dp[3] = src_scan[3];
+ src_scan += 4;
+ dp += 4;
+ }
+ } else {
+ int blended_colors[3];
+ FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
+ for (int col = 0; col < pixel_count; col ++) {
+ pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, 1);
+ FX_BYTE back_alpha = *dest_alpha_scan;
+ if (back_alpha == 0) {
+ if (clip_scan) {
+ int src_alpha = clip_scan[col] * src_scan[3] / 255;
+ *dest_alpha_scan = src_alpha;
+ *dest_scan++ = *src_cache_scan++;
+ *dest_scan++ = *src_cache_scan++;
+ *dest_scan++ = *src_cache_scan++;
+ } else {
+ *dest_alpha_scan = src_scan[3];
+ *dest_scan++ = *src_cache_scan++;
+ *dest_scan++ = *src_cache_scan++;
+ *dest_scan++ = *src_cache_scan++;
+ }
+ dest_alpha_scan ++;
+ src_scan += 4;
+ continue;
+ }
+ FX_BYTE src_alpha;
+ if (clip_scan == NULL) {
+ src_alpha = src_scan[3];
+ } else {
+ src_alpha = clip_scan[col] * src_scan[3] / 255;
+ }
+ src_scan += 4;
+ if (src_alpha == 0) {
+ dest_scan += 3;
+ src_cache_scan += 3;
+ dest_alpha_scan ++;
+ continue;
+ }
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ *dest_alpha_scan ++ = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ if (bNonseparableBlend) {
+ _RGB_Blend(blend_type, src_cache_scan, dest_scan, blended_colors);
+ }
+ for (int color = 0; color < 3; color ++) {
+ if (blend_type) {
+ int blended = bNonseparableBlend ? blended_colors[color] :
+ _BLEND(blend_type, *dest_scan, *src_cache_scan);
+ blended = FXDIB_ALPHA_MERGE(*src_cache_scan, blended, back_alpha);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
+ } else {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_cache_scan, alpha_ratio);
+ }
+ dest_scan ++;
+ src_cache_scan ++;
+ }
+ }
+ return;
+ }
+ }
+ _CompositeRow_Argb2Argb(dest_scan, src_cache_scan, pixel_count, blend_type, clip_scan, dest_alpha_scan, src_alpha_scan);
+}
+void _CompositeRow_Rgb2Argb_Blend_NoClip_Transform(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int src_Bpp,
+ FX_LPBYTE dest_alpha_scan, FX_LPBYTE src_cache_scan, void* pIccTransform)
+{
+ ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ if (src_Bpp == 3) {
+ pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, width);
+ } else {
+ FX_LPBYTE dp = src_cache_scan;
+ for (int col = 0; col < width; col ++) {
+ pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);
+ src_scan += 4;
+ dp += 3;
+ }
+ }
+ _CompositeRow_Rgb2Argb_Blend_NoClip(dest_scan, src_cache_scan, width, blend_type, 3, dest_alpha_scan);
+}
+inline void _CompositeRow_Rgb2Argb_Blend_Clip_Transform(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int src_Bpp, FX_LPCBYTE clip_scan,
+ FX_LPBYTE dest_alpha_scan, FX_LPBYTE src_cache_scan, void* pIccTransform)
+{
+ ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ if (src_Bpp == 3) {
+ pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, width);
+ } else {
+ FX_LPBYTE dp = src_cache_scan;
+ for (int col = 0; col < width; col ++) {
+ pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);
+ src_scan += 4;
+ dp += 3;
+ }
+ }
+ _CompositeRow_Rgb2Argb_Blend_Clip(dest_scan, src_cache_scan, width, blend_type, 3, clip_scan, dest_alpha_scan);
+}
+inline void _CompositeRow_Rgb2Argb_NoBlend_Clip_Transform(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int src_Bpp, FX_LPCBYTE clip_scan,
+ FX_LPBYTE dest_alpha_scan, FX_LPBYTE src_cache_scan, void* pIccTransform)
+{
+ ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ if (src_Bpp == 3) {
+ pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, width);
+ } else {
+ FX_LPBYTE dp = src_cache_scan;
+ for (int col = 0; col < width; col ++) {
+ pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);
+ src_scan += 4;
+ dp += 3;
+ }
+ }
+ _CompositeRow_Rgb2Argb_NoBlend_Clip(dest_scan, src_cache_scan, width, 3, clip_scan, dest_alpha_scan);
+}
+inline void _CompositeRow_Rgb2Argb_NoBlend_NoClip_Transform(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int src_Bpp,
+ FX_LPBYTE dest_alpha_scan, FX_LPBYTE src_cache_scan, void* pIccTransform)
+{
+ ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ if (src_Bpp == 3) {
+ pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, width);
+ } else {
+ FX_LPBYTE dp = src_cache_scan;
+ for (int col = 0; col < width; col ++) {
+ pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);
+ src_scan += 4;
+ dp += 3;
+ }
+ }
+ _CompositeRow_Rgb2Argb_NoBlend_NoClip(dest_scan, src_cache_scan, width, 3, dest_alpha_scan);
+}
+inline void _CompositeRow_Argb2Rgb_Blend_Transform(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int dest_Bpp, FX_LPCBYTE clip_scan,
+ FX_LPCBYTE src_alpha_scan, FX_LPBYTE src_cache_scan, void* pIccTransform)
+{
+ ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ if (src_alpha_scan) {
+ pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, width);
+ } else {
+ int blended_colors[3];
+ FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
+ int dest_gap = dest_Bpp - 3;
+ for (int col = 0; col < width; col ++) {
+ pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, 1);
+ FX_BYTE src_alpha;
+ if (clip_scan) {
+ src_alpha = src_scan[3] * (*clip_scan++) / 255;
+ } else {
+ src_alpha = src_scan[3];
+ }
+ src_scan += 4;
+ if (src_alpha == 0) {
+ dest_scan += dest_Bpp;
+ src_cache_scan += 3;
+ continue;
+ }
+ if (bNonseparableBlend) {
+ _RGB_Blend(blend_type, src_cache_scan, dest_scan, blended_colors);
+ }
+ for (int color = 0; color < 3; color ++) {
+ int back_color = *dest_scan;
+ int blended = bNonseparableBlend ? blended_colors[color] :
+ _BLEND(blend_type, back_color, *src_cache_scan);
+ *dest_scan = FXDIB_ALPHA_MERGE(back_color, blended, src_alpha);
+ dest_scan ++;
+ src_cache_scan ++;
+ }
+ dest_scan += dest_gap;
+ }
+ return;
+ }
+ _CompositeRow_Argb2Rgb_Blend(dest_scan, src_cache_scan, width, blend_type, dest_Bpp, clip_scan, src_alpha_scan);
+}
+inline void _CompositeRow_Argb2Rgb_NoBlend_Transform(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int dest_Bpp, FX_LPCBYTE clip_scan,
+ FX_LPCBYTE src_alpha_scan, FX_LPBYTE src_cache_scan, void* pIccTransform)
+{
+ ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ if (src_alpha_scan) {
+ pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, width);
+ } else {
+ int dest_gap = dest_Bpp - 3;
+ for (int col = 0; col < width; col ++) {
+ pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, 1);
+ FX_BYTE src_alpha;
+ if (clip_scan) {
+ src_alpha = src_scan[3] * (*clip_scan++) / 255;
+ } else {
+ src_alpha = src_scan[3];
+ }
+ src_scan += 4;
+ if (src_alpha == 255) {
+ *dest_scan++ = *src_cache_scan++;
+ *dest_scan++ = *src_cache_scan++;
+ *dest_scan++ = *src_cache_scan++;
+ dest_scan += dest_gap;
+ continue;
+ }
+ if (src_alpha == 0) {
+ dest_scan += dest_Bpp;
+ src_cache_scan += 3;
+ continue;
+ }
+ for (int color = 0; color < 3; color ++) {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_cache_scan, src_alpha);
+ dest_scan ++;
+ src_cache_scan ++;
+ }
+ dest_scan += dest_gap;
+ }
+ return;
+ }
+ _CompositeRow_Argb2Rgb_NoBlend(dest_scan, src_cache_scan, width, dest_Bpp, clip_scan, src_alpha_scan);
+}
+inline void _CompositeRow_Rgb2Rgb_Blend_NoClip_Transform(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int dest_Bpp, int src_Bpp,
+ FX_LPBYTE src_cache_scan, void* pIccTransform)
+{
+ ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ if (src_Bpp == 3) {
+ pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, width);
+ } else {
+ FX_LPBYTE dp = src_cache_scan;
+ for (int col = 0; col < width; col ++) {
+ pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);
+ src_scan += 4;
+ dp += 3;
+ }
+ }
+ _CompositeRow_Rgb2Rgb_Blend_NoClip(dest_scan, src_cache_scan, width, blend_type, dest_Bpp, 3);
+}
+inline void _CompositeRow_Rgb2Rgb_Blend_Clip_Transform(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int dest_Bpp, int src_Bpp, FX_LPCBYTE clip_scan,
+ FX_LPBYTE src_cache_scan, void* pIccTransform)
+{
+ ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ if (src_Bpp == 3) {
+ pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, width);
+ } else {
+ FX_LPBYTE dp = src_cache_scan;
+ for (int col = 0; col < width; col ++) {
+ pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);
+ src_scan += 4;
+ dp += 3;
+ }
+ }
+ _CompositeRow_Rgb2Rgb_Blend_Clip(dest_scan, src_cache_scan, width, blend_type, dest_Bpp, 3, clip_scan);
+}
+inline void _CompositeRow_Rgb2Rgb_NoBlend_NoClip_Transform(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int dest_Bpp, int src_Bpp,
+ FX_LPBYTE src_cache_scan, void* pIccTransform)
+{
+ ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ if (src_Bpp == 3) {
+ pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, width);
+ } else {
+ FX_LPBYTE dp = src_cache_scan;
+ for (int col = 0; col < width; col ++) {
+ pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);
+ src_scan += 4;
+ dp += 3;
+ }
+ }
+ _CompositeRow_Rgb2Rgb_NoBlend_NoClip(dest_scan, src_cache_scan, width, dest_Bpp, 3);
+}
+inline void _CompositeRow_Rgb2Rgb_NoBlend_Clip_Transform(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int dest_Bpp, int src_Bpp, FX_LPCBYTE clip_scan,
+ FX_LPBYTE src_cache_scan, void* pIccTransform)
+{
+ ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ if (src_Bpp == 3) {
+ pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, width);
+ } else {
+ FX_LPBYTE dp = src_cache_scan;
+ for (int col = 0; col < width; col ++) {
+ pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);
+ src_scan += 4;
+ dp += 3;
+ }
+ }
+ _CompositeRow_Rgb2Rgb_NoBlend_Clip(dest_scan, src_cache_scan, width, dest_Bpp, 3, clip_scan);
+}
+inline void _CompositeRow_8bppPal2Gray(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, FX_LPCBYTE pPalette, int pixel_count,
+ int blend_type, FX_LPCBYTE clip_scan,
+ FX_LPCBYTE src_alpha_scan)
+{
+ if (src_alpha_scan) {
+ if (blend_type) {
+ FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
+ int blended_color;
+ for (int col = 0; col < pixel_count; col ++) {
+ FX_BYTE gray = pPalette[*src_scan];
+ int src_alpha = *src_alpha_scan++;
+ if (clip_scan) {
+ src_alpha = clip_scan[col] * src_alpha / 255;
+ }
+ if (bNonseparableBlend) {
+ blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
+ }
+ gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, *dest_scan, gray);
+ if (src_alpha) {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, src_alpha);
+ } else {
+ *dest_scan = gray;
+ }
+ dest_scan ++;
+ src_scan ++;
+ }
+ return;
+ }
+ for (int col = 0; col < pixel_count; col ++) {
+ FX_BYTE gray = pPalette[*src_scan];
+ int src_alpha = *src_alpha_scan++;
+ if (clip_scan) {
+ src_alpha = clip_scan[col] * src_alpha / 255;
+ }
+ if (src_alpha) {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, src_alpha);
+ } else {
+ *dest_scan = gray;
+ }
+ dest_scan ++;
+ src_scan ++;
+ }
+ } else {
+ if (blend_type) {
+ FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
+ int blended_color;
+ for (int col = 0; col < pixel_count; col ++) {
+ FX_BYTE gray = pPalette[*src_scan];
+ if (bNonseparableBlend) {
+ blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
+ }
+ gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, *dest_scan, gray);
+ if (clip_scan && clip_scan[col] < 255) {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, clip_scan[col]);
+ } else {
+ *dest_scan = gray;
+ }
+ dest_scan ++;
+ src_scan ++;
+ }
+ return;
+ }
+ for (int col = 0; col < pixel_count; col ++) {
+ FX_BYTE gray = pPalette[*src_scan];
+ if (clip_scan && clip_scan[col] < 255) {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, clip_scan[col]);
+ } else {
+ *dest_scan = gray;
+ }
+ dest_scan ++;
+ src_scan ++;
+ }
+ }
+}
+inline void _CompositeRow_8bppPal2Graya(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, FX_LPCBYTE pPalette, int pixel_count,
+ int blend_type, FX_LPCBYTE clip_scan,
+ FX_LPBYTE dest_alpha_scan, FX_LPCBYTE src_alpha_scan)
+{
+ if (src_alpha_scan) {
+ if (blend_type) {
+ FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
+ int blended_color;
+ for (int col = 0; col < pixel_count; col ++) {
+ FX_BYTE gray = pPalette[*src_scan];
+ src_scan ++;
+ FX_BYTE back_alpha = *dest_alpha_scan;
+ if (back_alpha == 0) {
+ int src_alpha = *src_alpha_scan ++;
+ if (clip_scan) {
+ src_alpha = clip_scan[col] * src_alpha / 255;
+ }
+ if (src_alpha) {
+ *dest_scan = gray;
+ *dest_alpha_scan = src_alpha;
+ }
+ dest_scan ++;
+ dest_alpha_scan ++;
+ continue;
+ }
+ FX_BYTE src_alpha = *src_alpha_scan++;
+ if (clip_scan) {
+ src_alpha = clip_scan[col] * src_alpha / 255;
+ }
+ if (src_alpha == 0) {
+ dest_scan ++;
+ dest_alpha_scan ++;
+ continue;
+ }
+ *dest_alpha_scan = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ int alpha_ratio = src_alpha * 255 / (*dest_alpha_scan);
+ if (bNonseparableBlend) {
+ blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
+ }
+ gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, *dest_scan, gray);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
+ dest_alpha_scan ++;
+ dest_scan ++;
+ }
+ return;
+ }
+ for (int col = 0; col < pixel_count; col ++) {
+ FX_BYTE gray = pPalette[*src_scan];
+ src_scan ++;
+ FX_BYTE back_alpha = *dest_alpha_scan;
+ if (back_alpha == 0) {
+ int src_alpha = *src_alpha_scan ++;
+ if (clip_scan) {
+ src_alpha = clip_scan[col] * src_alpha / 255;
+ }
+ if (src_alpha) {
+ *dest_scan = gray;
+ *dest_alpha_scan = src_alpha;
+ }
+ dest_scan ++;
+ dest_alpha_scan ++;
+ continue;
+ }
+ FX_BYTE src_alpha = *src_alpha_scan++;
+ if (clip_scan) {
+ src_alpha = clip_scan[col] * src_alpha / 255;
+ }
+ if (src_alpha == 0) {
+ dest_scan ++;
+ dest_alpha_scan ++;
+ continue;
+ }
+ *dest_alpha_scan = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ int alpha_ratio = src_alpha * 255 / (*dest_alpha_scan);
+ dest_alpha_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
+ dest_scan ++;
+ }
+ } else {
+ if (blend_type) {
+ FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
+ int blended_color;
+ for (int col = 0; col < pixel_count; col ++) {
+ FX_BYTE gray = pPalette[*src_scan];
+ src_scan ++;
+ if (clip_scan == NULL || clip_scan[col] == 255) {
+ *dest_scan++ = gray;
+ *dest_alpha_scan++ = 255;
+ continue;
+ }
+ int src_alpha = clip_scan[col];
+ if (src_alpha == 0) {
+ dest_scan ++;
+ dest_alpha_scan ++;
+ continue;
+ }
+ int back_alpha = *dest_alpha_scan;
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ *dest_alpha_scan ++ = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ if (bNonseparableBlend) {
+ blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
+ }
+ gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, *dest_scan, gray);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
+ dest_scan ++;
+ }
+ return;
+ }
+ for (int col = 0; col < pixel_count; col ++) {
+ FX_BYTE gray = pPalette[*src_scan];
+ src_scan ++;
+ if (clip_scan == NULL || clip_scan[col] == 255) {
+ *dest_scan++ = gray;
+ *dest_alpha_scan++ = 255;
+ continue;
+ }
+ int src_alpha = clip_scan[col];
+ if (src_alpha == 0) {
+ dest_scan ++;
+ dest_alpha_scan ++;
+ continue;
+ }
+ int back_alpha = *dest_alpha_scan;
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ *dest_alpha_scan ++ = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
+ dest_scan ++;
+ }
+ }
+}
+inline void _CompositeRow_1bppPal2Gray(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_left,
+ FX_LPCBYTE pPalette, int pixel_count, int blend_type, FX_LPCBYTE clip_scan)
+{
+ int reset_gray = pPalette[0];
+ int set_gray = pPalette[1];
+ if (blend_type) {
+ FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
+ int blended_color;
+ for (int col = 0; col < pixel_count; col ++) {
+ FX_BYTE gray = (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) ? set_gray : reset_gray;
+ if (bNonseparableBlend) {
+ blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
+ }
+ gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, *dest_scan, gray);
+ if (clip_scan && clip_scan[col] < 255) {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, clip_scan[col]);
+ } else {
+ *dest_scan = gray;
+ }
+ dest_scan ++;
+ }
+ return;
+ }
+ for (int col = 0; col < pixel_count; col ++) {
+ FX_BYTE gray = (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) ? set_gray : reset_gray;
+ if (clip_scan && clip_scan[col] < 255) {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, clip_scan[col]);
+ } else {
+ *dest_scan = gray;
+ }
+ dest_scan ++;
+ }
+}
+inline void _CompositeRow_1bppPal2Graya(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_left,
+ FX_LPCBYTE pPalette, int pixel_count, int blend_type, FX_LPCBYTE clip_scan,
+ FX_LPBYTE dest_alpha_scan)
+{
+ int reset_gray = pPalette[0];
+ int set_gray = pPalette[1];
+ if (blend_type) {
+ FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
+ int blended_color;
+ for (int col = 0; col < pixel_count; col ++) {
+ FX_BYTE gray = (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) ? set_gray : reset_gray;
+ if (clip_scan == NULL || clip_scan[col] == 255) {
+ *dest_scan++ = gray;
+ *dest_alpha_scan ++ = 255;
+ continue;
+ }
+ int src_alpha = clip_scan[col];
+ if (src_alpha == 0) {
+ dest_scan ++;
+ dest_alpha_scan ++;
+ continue;
+ }
+ int back_alpha = *dest_alpha_scan;
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ *dest_alpha_scan ++ = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ if (bNonseparableBlend) {
+ blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
+ }
+ gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, *dest_scan, gray);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
+ dest_scan ++;
+ }
+ return;
+ }
+ for (int col = 0; col < pixel_count; col ++) {
+ FX_BYTE gray = (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) ? set_gray : reset_gray;
+ if (clip_scan == NULL || clip_scan[col] == 255) {
+ *dest_scan++ = gray;
+ *dest_alpha_scan ++ = 255;
+ continue;
+ }
+ int src_alpha = clip_scan[col];
+ if (src_alpha == 0) {
+ dest_scan ++;
+ dest_alpha_scan ++;
+ continue;
+ }
+ int back_alpha = *dest_alpha_scan;
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ *dest_alpha_scan ++ = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
+ dest_scan ++;
+ }
+}
+inline void _CompositeRow_8bppRgb2Rgb_NoBlend(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, FX_DWORD* pPalette, int pixel_count,
+ int DestBpp, FX_LPCBYTE clip_scan,
+ FX_LPCBYTE src_alpha_scan)
+{
+ if (src_alpha_scan) {
+ int dest_gap = DestBpp - 3;
+ FX_ARGB argb = 0;
+ for (int col = 0; col < pixel_count; col ++) {
+ argb = pPalette[*src_scan];
+ int src_r = FXARGB_R(argb);
+ int src_g = FXARGB_G(argb);
+ int src_b = FXARGB_B(argb);
+ src_scan ++;
+ FX_BYTE src_alpha = 0;
+ if (clip_scan) {
+ src_alpha = (*src_alpha_scan++) * (*clip_scan++) / 255;
+ } else {
+ src_alpha = *src_alpha_scan++;
+ }
+ if (src_alpha == 255) {
+ *dest_scan++ = src_b;
+ *dest_scan++ = src_g;
+ *dest_scan++ = src_r;
+ dest_scan += dest_gap;
+ continue;
+ }
+ if (src_alpha == 0) {
+ dest_scan += DestBpp;
+ continue;
+ }
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, src_alpha);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, src_alpha);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, src_alpha);
+ dest_scan ++;
+ dest_scan += dest_gap;
+ }
+ } else {
+ FX_ARGB argb = 0;
+ for (int col = 0; col < pixel_count; col ++) {
+ argb = pPalette[*src_scan];
+ int src_r = FXARGB_R(argb);
+ int src_g = FXARGB_G(argb);
+ int src_b = FXARGB_B(argb);
+ if (clip_scan && clip_scan[col] < 255) {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, clip_scan[col]);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, clip_scan[col]);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, clip_scan[col]);
+ dest_scan ++;
+ } else {
+ *dest_scan++ = src_b;
+ *dest_scan++ = src_g;
+ *dest_scan++ = src_r;
+ }
+ if (DestBpp == 4) {
+ dest_scan++;
+ }
+ src_scan ++;
+ }
+ }
+}
+inline void _CompositeRow_1bppRgb2Rgb_NoBlend(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_left,
+ FX_DWORD* pPalette, int pixel_count, int DestBpp, FX_LPCBYTE clip_scan)
+{
+ int reset_r, reset_g, reset_b;
+ int set_r, set_g, set_b;
+ reset_r = FXARGB_R(pPalette[0]);
+ reset_g = FXARGB_G(pPalette[0]);
+ reset_b = FXARGB_B(pPalette[0]);
+ set_r = FXARGB_R(pPalette[1]);
+ set_g = FXARGB_G(pPalette[1]);
+ set_b = FXARGB_B(pPalette[1]);
+ for (int col = 0; col < pixel_count; col ++) {
+ int src_r, src_g, src_b;
+ if (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) {
+ src_r = set_r;
+ src_g = set_g;
+ src_b = set_b;
+ } else {
+ src_r = reset_r;
+ src_g = reset_g;
+ src_b = reset_b;
+ }
+ if (clip_scan && clip_scan[col] < 255) {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, clip_scan[col]);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, clip_scan[col]);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, clip_scan[col]);
+ dest_scan ++;
+ } else {
+ *dest_scan++ = src_b;
+ *dest_scan++ = src_g;
+ *dest_scan++ = src_r;
+ }
+ if (DestBpp == 4) {
+ dest_scan++;
+ }
+ }
+}
+inline void _CompositeRow_8bppRgb2Argb_NoBlend(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width,
+ FX_DWORD* pPalette, FX_LPCBYTE clip_scan,
+ FX_LPCBYTE src_alpha_scan)
+{
+ if (src_alpha_scan) {
+ for (int col = 0; col < width; col ++) {
+ FX_ARGB argb = pPalette[*src_scan];
+ src_scan ++;
+ int src_r = FXARGB_R(argb);
+ int src_g = FXARGB_G(argb);
+ int src_b = FXARGB_B(argb);
+ FX_BYTE back_alpha = dest_scan[3];
+ if (back_alpha == 0) {
+ if (clip_scan) {
+ int src_alpha = clip_scan[col] * (*src_alpha_scan) / 255;
+ FXARGB_SETDIB(dest_scan, FXARGB_MAKE(src_alpha, src_r, src_g, src_b));
+ } else {
+ FXARGB_SETDIB(dest_scan, FXARGB_MAKE(*src_alpha_scan, src_r, src_g, src_b));
+ }
+ dest_scan += 4;
+ src_alpha_scan ++;
+ continue;
+ }
+ FX_BYTE src_alpha;
+ if (clip_scan == NULL) {
+ src_alpha = *src_alpha_scan ++;
+ } else {
+ src_alpha = clip_scan[col] * (*src_alpha_scan++) / 255;
+ }
+ if (src_alpha == 0) {
+ dest_scan += 4;
+ continue;
+ }
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ dest_scan[3] = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);
+ dest_scan ++;
+ dest_scan ++;
+ }
+ } else
+ for (int col = 0; col < width; col ++) {
+ FX_ARGB argb = pPalette[*src_scan];
+ int src_r = FXARGB_R(argb);
+ int src_g = FXARGB_G(argb);
+ int src_b = FXARGB_B(argb);
+ if (clip_scan == NULL || clip_scan[col] == 255) {
+ *dest_scan++ = src_b;
+ *dest_scan++ = src_g;
+ *dest_scan++ = src_r;
+ *dest_scan++ = 255;
+ src_scan ++;
+ continue;
+ }
+ int src_alpha = clip_scan[col];
+ if (src_alpha == 0) {
+ dest_scan += 4;
+ src_scan ++;
+ continue;
+ }
+ int back_alpha = dest_scan[3];
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ dest_scan[3] = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);
+ dest_scan ++;
+ dest_scan ++;
+ src_scan ++;
+ }
+}
+void _CompositeRow_8bppRgb2Rgba_NoBlend(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width,
+ FX_DWORD* pPalette, FX_LPCBYTE clip_scan,
+ FX_LPBYTE dest_alpha_scan, FX_LPCBYTE src_alpha_scan)
+{
+ if (src_alpha_scan) {
+ for (int col = 0; col < width; col ++) {
+ FX_ARGB argb = pPalette[*src_scan];
+ src_scan ++;
+ int src_r = FXARGB_R(argb);
+ int src_g = FXARGB_G(argb);
+ int src_b = FXARGB_B(argb);
+ FX_BYTE back_alpha = *dest_alpha_scan;
+ if (back_alpha == 0) {
+ if (clip_scan) {
+ int src_alpha = clip_scan[col] * (*src_alpha_scan) / 255;
+ *dest_alpha_scan ++ = src_alpha;
+ } else {
+ *dest_alpha_scan ++ = *src_alpha_scan;
+ }
+ *dest_scan ++ = src_b;
+ *dest_scan ++ = src_g;
+ *dest_scan ++ = src_r;
+ src_alpha_scan ++;
+ continue;
+ }
+ FX_BYTE src_alpha;
+ if (clip_scan == NULL) {
+ src_alpha = *src_alpha_scan++;
+ } else {
+ src_alpha = clip_scan[col] * (*src_alpha_scan++) / 255;
+ }
+ if (src_alpha == 0) {
+ dest_scan += 3;
+ dest_alpha_scan ++;
+ continue;
+ }
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ *dest_alpha_scan ++ = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);
+ dest_scan ++;
+ }
+ } else
+ for (int col = 0; col < width; col ++) {
+ FX_ARGB argb = pPalette[*src_scan];
+ int src_r = FXARGB_R(argb);
+ int src_g = FXARGB_G(argb);
+ int src_b = FXARGB_B(argb);
+ if (clip_scan == NULL || clip_scan[col] == 255) {
+ *dest_scan++ = src_b;
+ *dest_scan++ = src_g;
+ *dest_scan++ = src_r;
+ *dest_alpha_scan++ = 255;
+ src_scan ++;
+ continue;
+ }
+ int src_alpha = clip_scan[col];
+ if (src_alpha == 0) {
+ dest_scan += 3;
+ dest_alpha_scan ++;
+ src_scan ++;
+ continue;
+ }
+ int back_alpha = *dest_alpha_scan;
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ *dest_alpha_scan ++ = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);
+ dest_scan ++;
+ src_scan ++;
+ }
+}
+inline void _CompositeRow_1bppRgb2Argb_NoBlend(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_left, int width,
+ FX_DWORD* pPalette, FX_LPCBYTE clip_scan)
+{
+ int reset_r, reset_g, reset_b;
+ int set_r, set_g, set_b;
+ reset_r = FXARGB_R(pPalette[0]);
+ reset_g = FXARGB_G(pPalette[0]);
+ reset_b = FXARGB_B(pPalette[0]);
+ set_r = FXARGB_R(pPalette[1]);
+ set_g = FXARGB_G(pPalette[1]);
+ set_b = FXARGB_B(pPalette[1]);
+ for (int col = 0; col < width; col ++) {
+ int src_r, src_g, src_b;
+ if (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) {
+ src_r = set_r;
+ src_g = set_g;
+ src_b = set_b;
+ } else {
+ src_r = reset_r;
+ src_g = reset_g;
+ src_b = reset_b;
+ }
+ if (clip_scan == NULL || clip_scan[col] == 255) {
+ *dest_scan++ = src_b;
+ *dest_scan++ = src_g;
+ *dest_scan++ = src_r;
+ *dest_scan++ = 255;
+ continue;
+ }
+ int src_alpha = clip_scan[col];
+ if (src_alpha == 0) {
+ dest_scan += 4;
+ continue;
+ }
+ int back_alpha = dest_scan[3];
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ dest_scan[3] = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);
+ dest_scan ++;
+ dest_scan ++;
+ }
+}
+void _CompositeRow_1bppRgb2Rgba_NoBlend(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_left, int width,
+ FX_DWORD* pPalette, FX_LPCBYTE clip_scan,
+ FX_LPBYTE dest_alpha_scan)
+{
+ int reset_r, reset_g, reset_b;
+ int set_r, set_g, set_b;
+ reset_r = FXARGB_R(pPalette[0]);
+ reset_g = FXARGB_G(pPalette[0]);
+ reset_b = FXARGB_B(pPalette[0]);
+ set_r = FXARGB_R(pPalette[1]);
+ set_g = FXARGB_G(pPalette[1]);
+ set_b = FXARGB_B(pPalette[1]);
+ for (int col = 0; col < width; col ++) {
+ int src_r, src_g, src_b;
+ if (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) {
+ src_r = set_r;
+ src_g = set_g;
+ src_b = set_b;
+ } else {
+ src_r = reset_r;
+ src_g = reset_g;
+ src_b = reset_b;
+ }
+ if (clip_scan == NULL || clip_scan[col] == 255) {
+ *dest_scan++ = src_b;
+ *dest_scan++ = src_g;
+ *dest_scan++ = src_r;
+ *dest_alpha_scan++ = 255;
+ continue;
+ }
+ int src_alpha = clip_scan[col];
+ if (src_alpha == 0) {
+ dest_scan += 3;
+ dest_alpha_scan ++;
+ continue;
+ }
+ int back_alpha = *dest_alpha_scan;
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ *dest_alpha_scan ++ = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);
+ dest_scan ++;
+ }
+}
+void _CompositeRow_ByteMask2Argb(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_r, int src_g, int src_b, int pixel_count,
+ int blend_type, FX_LPCBYTE clip_scan)
+{
+ for (int col = 0; col < pixel_count; col ++) {
+ int src_alpha;
+ if (clip_scan) {
+ src_alpha = mask_alpha * clip_scan[col] * src_scan[col] / 255 / 255;
+ } else {
+ src_alpha = mask_alpha * src_scan[col] / 255;
+ }
+ FX_BYTE back_alpha = dest_scan[3];
+ if (back_alpha == 0) {
+ FXARGB_SETDIB(dest_scan, FXARGB_MAKE(src_alpha, src_r, src_g, src_b));
+ dest_scan += 4;
+ continue;
+ }
+ if (src_alpha == 0) {
+ dest_scan += 4;
+ continue;
+ }
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ dest_scan[3] = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {
+ int blended_colors[3];
+ FX_BYTE src_scan[3];
+ src_scan[0] = src_b;
+ src_scan[1] = src_g;
+ src_scan[2] = src_r;
+ _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[0], alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[1], alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[2], alpha_ratio);
+ } else if (blend_type) {
+ int blended = _BLEND(blend_type, *dest_scan, src_b);
+ blended = FXDIB_ALPHA_MERGE(src_b, blended, back_alpha);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
+ dest_scan ++;
+ blended = _BLEND(blend_type, *dest_scan, src_g);
+ blended = FXDIB_ALPHA_MERGE(src_g, blended, back_alpha);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
+ dest_scan ++;
+ blended = _BLEND(blend_type, *dest_scan, src_r);
+ blended = FXDIB_ALPHA_MERGE(src_r, blended, back_alpha);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
+ } else {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);
+ }
+ dest_scan += 2;
+ }
+}
+void _CompositeRow_ByteMask2Rgba(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_r, int src_g, int src_b, int pixel_count,
+ int blend_type, FX_LPCBYTE clip_scan,
+ FX_LPBYTE dest_alpha_scan)
+{
+ for (int col = 0; col < pixel_count; col ++) {
+ int src_alpha;
+ if (clip_scan) {
+ src_alpha = mask_alpha * clip_scan[col] * src_scan[col] / 255 / 255;
+ } else {
+ src_alpha = mask_alpha * src_scan[col] / 255;
+ }
+ FX_BYTE back_alpha = *dest_alpha_scan;
+ if (back_alpha == 0) {
+ *dest_scan ++ = src_b;
+ *dest_scan ++ = src_g;
+ *dest_scan ++ = src_r;
+ *dest_alpha_scan ++ = src_alpha;
+ continue;
+ }
+ if (src_alpha == 0) {
+ dest_scan += 3;
+ dest_alpha_scan ++;
+ continue;
+ }
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ *dest_alpha_scan ++ = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {
+ int blended_colors[3];
+ FX_BYTE src_scan[3];
+ src_scan[0] = src_b;
+ src_scan[1] = src_g;
+ src_scan[2] = src_r;
+ _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[0], alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[1], alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[2], alpha_ratio);
+ dest_scan ++;
+ } else if (blend_type) {
+ int blended = _BLEND(blend_type, *dest_scan, src_b);
+ blended = FXDIB_ALPHA_MERGE(src_b, blended, back_alpha);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
+ dest_scan ++;
+ blended = _BLEND(blend_type, *dest_scan, src_g);
+ blended = FXDIB_ALPHA_MERGE(src_g, blended, back_alpha);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
+ dest_scan ++;
+ blended = _BLEND(blend_type, *dest_scan, src_r);
+ blended = FXDIB_ALPHA_MERGE(src_r, blended, back_alpha);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
+ dest_scan ++;
+ } else {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);
+ dest_scan ++;
+ }
+ }
+}
+void _CompositeRow_ByteMask2Rgb(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_r, int src_g, int src_b, int pixel_count,
+ int blend_type, int Bpp, FX_LPCBYTE clip_scan)
+{
+ for (int col = 0; col < pixel_count; col ++) {
+ int src_alpha;
+ if (clip_scan) {
+ src_alpha = mask_alpha * clip_scan[col] * src_scan[col] / 255 / 255;
+ } else {
+ src_alpha = mask_alpha * src_scan[col] / 255;
+ }
+ if (src_alpha == 0) {
+ dest_scan += Bpp;
+ continue;
+ }
+ if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {
+ int blended_colors[3];
+ FX_BYTE src_scan[3];
+ src_scan[0] = src_b;
+ src_scan[1] = src_g;
+ src_scan[2] = src_r;
+ _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[0], src_alpha);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[1], src_alpha);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[2], src_alpha);
+ } else if (blend_type) {
+ int blended = _BLEND(blend_type, *dest_scan, src_b);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, src_alpha);
+ dest_scan ++;
+ blended = _BLEND(blend_type, *dest_scan, src_g);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, src_alpha);
+ dest_scan ++;
+ blended = _BLEND(blend_type, *dest_scan, src_r);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, src_alpha);
+ } else {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, src_alpha);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, src_alpha);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, src_alpha);
+ }
+ dest_scan += Bpp - 2;
+ }
+}
+void _CompositeRow_ByteMask2Mask(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int pixel_count,
+ FX_LPCBYTE clip_scan)
+{
+ for (int col = 0; col < pixel_count; col ++) {
+ int src_alpha;
+ if (clip_scan) {
+ src_alpha = mask_alpha * clip_scan[col] * src_scan[col] / 255 / 255;
+ } else {
+ src_alpha = mask_alpha * src_scan[col] / 255;
+ }
+ FX_BYTE back_alpha = *dest_scan;
+ if (!back_alpha) {
+ *dest_scan = src_alpha;
+ } else if (src_alpha) {
+ *dest_scan = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ }
+ dest_scan ++;
+ }
+}
+void _CompositeRow_ByteMask2Gray(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_gray,
+ int pixel_count, FX_LPCBYTE clip_scan)
+{
+ for (int col = 0; col < pixel_count; col ++) {
+ int src_alpha;
+ if (clip_scan) {
+ src_alpha = mask_alpha * clip_scan[col] * src_scan[col] / 255 / 255;
+ } else {
+ src_alpha = mask_alpha * src_scan[col] / 255;
+ }
+ if (src_alpha) {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_gray, src_alpha);
+ }
+ dest_scan ++;
+ }
+}
+void _CompositeRow_ByteMask2Graya(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_gray,
+ int pixel_count, FX_LPCBYTE clip_scan,
+ FX_LPBYTE dest_alpha_scan)
+{
+ for (int col = 0; col < pixel_count; col ++) {
+ int src_alpha;
+ if (clip_scan) {
+ src_alpha = mask_alpha * clip_scan[col] * src_scan[col] / 255 / 255;
+ } else {
+ src_alpha = mask_alpha * src_scan[col] / 255;
+ }
+ FX_BYTE back_alpha = *dest_alpha_scan;
+ if (back_alpha == 0) {
+ *dest_scan ++ = src_gray;
+ *dest_alpha_scan ++ = src_alpha;
+ continue;
+ }
+ if (src_alpha == 0) {
+ dest_scan ++;
+ dest_alpha_scan ++;
+ continue;
+ }
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ *dest_alpha_scan++ = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_gray, alpha_ratio);
+ dest_scan ++;
+ }
+}
+void _CompositeRow_BitMask2Argb(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_r, int src_g, int src_b,
+ int src_left, int pixel_count, int blend_type, FX_LPCBYTE clip_scan)
+{
+ if (blend_type == FXDIB_BLEND_NORMAL && clip_scan == NULL && mask_alpha == 255) {
+ FX_ARGB argb = FXARGB_MAKE(0xff, src_r, src_g, src_b);
+ for (int col = 0; col < pixel_count; col ++) {
+ if (src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8))) {
+ FXARGB_SETDIB(dest_scan, argb);
+ }
+ dest_scan += 4;
+ }
+ return;
+ }
+ for (int col = 0; col < pixel_count; col ++) {
+ if (!(src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8)))) {
+ dest_scan += 4;
+ continue;
+ }
+ int src_alpha;
+ if (clip_scan) {
+ src_alpha = mask_alpha * clip_scan[col] / 255;
+ } else {
+ src_alpha = mask_alpha;
+ }
+ FX_BYTE back_alpha = dest_scan[3];
+ if (back_alpha == 0) {
+ FXARGB_SETDIB(dest_scan, FXARGB_MAKE(src_alpha, src_r, src_g, src_b));
+ dest_scan += 4;
+ continue;
+ }
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ dest_scan[3] = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {
+ int blended_colors[3];
+ FX_BYTE src_scan[3];
+ src_scan[0] = src_b;
+ src_scan[1] = src_g;
+ src_scan[2] = src_r;
+ _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[0], alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[1], alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[2], alpha_ratio);
+ } else if (blend_type) {
+ int blended = _BLEND(blend_type, *dest_scan, src_b);
+ blended = FXDIB_ALPHA_MERGE(src_b, blended, back_alpha);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
+ dest_scan ++;
+ blended = _BLEND(blend_type, *dest_scan, src_g);
+ blended = FXDIB_ALPHA_MERGE(src_g, blended, back_alpha);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
+ dest_scan ++;
+ blended = _BLEND(blend_type, *dest_scan, src_r);
+ blended = FXDIB_ALPHA_MERGE(src_r, blended, back_alpha);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
+ } else {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);
+ }
+ dest_scan += 2;
+ }
+}
+void _CompositeRow_BitMask2Rgba(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_r, int src_g, int src_b,
+ int src_left, int pixel_count, int blend_type, FX_LPCBYTE clip_scan,
+ FX_LPBYTE dest_alpha_scan)
+{
+ if (blend_type == FXDIB_BLEND_NORMAL && clip_scan == NULL && mask_alpha == 255) {
+ for (int col = 0; col < pixel_count; col ++) {
+ if (src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8))) {
+ dest_scan[0] = src_b;
+ dest_scan[1] = src_g;
+ dest_scan[2] = src_r;
+ *dest_alpha_scan = mask_alpha;
+ }
+ dest_scan += 3;
+ dest_alpha_scan ++;
+ }
+ return;
+ }
+ for (int col = 0; col < pixel_count; col ++) {
+ if (!(src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8)))) {
+ dest_scan += 3;
+ dest_alpha_scan ++;
+ continue;
+ }
+ int src_alpha;
+ if (clip_scan) {
+ src_alpha = mask_alpha * clip_scan[col] / 255;
+ } else {
+ src_alpha = mask_alpha;
+ }
+ FX_BYTE back_alpha = dest_scan[3];
+ if (back_alpha == 0) {
+ *dest_scan ++ = src_b;
+ *dest_scan ++ = src_g;
+ *dest_scan ++ = src_r;
+ *dest_alpha_scan ++ = mask_alpha;
+ continue;
+ }
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ *dest_alpha_scan ++ = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {
+ int blended_colors[3];
+ FX_BYTE src_scan[3];
+ src_scan[0] = src_b;
+ src_scan[1] = src_g;
+ src_scan[2] = src_r;
+ _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[0], alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[1], alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[2], alpha_ratio);
+ dest_scan ++;
+ } else if (blend_type) {
+ int blended = _BLEND(blend_type, *dest_scan, src_b);
+ blended = FXDIB_ALPHA_MERGE(src_b, blended, back_alpha);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
+ dest_scan ++;
+ blended = _BLEND(blend_type, *dest_scan, src_g);
+ blended = FXDIB_ALPHA_MERGE(src_g, blended, back_alpha);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
+ dest_scan ++;
+ blended = _BLEND(blend_type, *dest_scan, src_r);
+ blended = FXDIB_ALPHA_MERGE(src_r, blended, back_alpha);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
+ dest_scan ++;
+ } else {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);
+ dest_scan ++;
+ }
+ }
+}
+void _CompositeRow_BitMask2Rgb(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_r, int src_g, int src_b,
+ int src_left, int pixel_count, int blend_type, int Bpp, FX_LPCBYTE clip_scan)
+{
+ if (blend_type == FXDIB_BLEND_NORMAL && clip_scan == NULL && mask_alpha == 255) {
+ for (int col = 0; col < pixel_count; col ++) {
+ if (src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8))) {
+ dest_scan[2] = src_r;
+ dest_scan[1] = src_g;
+ dest_scan[0] = src_b;
+ }
+ dest_scan += Bpp;
+ }
+ return;
+ }
+ for (int col = 0; col < pixel_count; col ++) {
+ if (!(src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8)))) {
+ dest_scan += Bpp;
+ continue;
+ }
+ int src_alpha;
+ if (clip_scan) {
+ src_alpha = mask_alpha * clip_scan[col] / 255;
+ } else {
+ src_alpha = mask_alpha;
+ }
+ if (src_alpha == 0) {
+ dest_scan += Bpp;
+ continue;
+ }
+ if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {
+ int blended_colors[3];
+ FX_BYTE src_scan[3];
+ src_scan[0] = src_b;
+ src_scan[1] = src_g;
+ src_scan[2] = src_r;
+ _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[0], src_alpha);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[1], src_alpha);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[2], src_alpha);
+ } else if (blend_type) {
+ int blended = _BLEND(blend_type, *dest_scan, src_b);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, src_alpha);
+ dest_scan++;
+ blended = _BLEND(blend_type, *dest_scan, src_g);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, src_alpha);
+ dest_scan++;
+ blended = _BLEND(blend_type, *dest_scan, src_r);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, src_alpha);
+ } else {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, src_alpha);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, src_alpha);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, src_alpha);
+ }
+ dest_scan += Bpp - 2;
+ }
+}
+void _CompositeRow_BitMask2Mask(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_left,
+ int pixel_count, FX_LPCBYTE clip_scan)
+{
+ for (int col = 0; col < pixel_count; col ++) {
+ if (!(src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8)))) {
+ dest_scan ++;
+ continue;
+ }
+ int src_alpha;
+ if (clip_scan) {
+ src_alpha = mask_alpha * clip_scan[col] / 255;
+ } else {
+ src_alpha = mask_alpha;
+ }
+ FX_BYTE back_alpha = *dest_scan;
+ if (!back_alpha) {
+ *dest_scan = src_alpha;
+ } else if (src_alpha) {
+ *dest_scan = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ }
+ dest_scan ++;
+ }
+}
+void _CompositeRow_BitMask2Gray(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_gray,
+ int src_left, int pixel_count, FX_LPCBYTE clip_scan)
+{
+ for (int col = 0; col < pixel_count; col ++) {
+ if (!(src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8)))) {
+ dest_scan ++;
+ continue;
+ }
+ int src_alpha;
+ if (clip_scan) {
+ src_alpha = mask_alpha * clip_scan[col] / 255;
+ } else {
+ src_alpha = mask_alpha;
+ }
+ if (src_alpha) {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_gray, src_alpha);
+ }
+ dest_scan ++;
+ }
+}
+void _CompositeRow_BitMask2Graya(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_gray,
+ int src_left, int pixel_count, FX_LPCBYTE clip_scan,
+ FX_LPBYTE dest_alpha_scan)
+{
+ for (int col = 0; col < pixel_count; col ++) {
+ if (!(src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8)))) {
+ dest_scan ++;
+ dest_alpha_scan ++;
+ continue;
+ }
+ int src_alpha;
+ if (clip_scan) {
+ src_alpha = mask_alpha * clip_scan[col] / 255;
+ } else {
+ src_alpha = mask_alpha;
+ }
+ FX_BYTE back_alpha = *dest_alpha_scan;
+ if (back_alpha == 0) {
+ *dest_scan ++ = src_gray;
+ *dest_alpha_scan ++ = src_alpha;
+ continue;
+ }
+ if (src_alpha == 0) {
+ dest_scan ++;
+ dest_alpha_scan ++;
+ continue;
+ }
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ *dest_alpha_scan++ = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_gray, alpha_ratio);
+ dest_scan ++;
+ }
+}
+void _CompositeRow_Argb2Argb_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int pixel_count, int blend_type, FX_LPCBYTE clip_scan)
+{
+ int blended_colors[3];
+ FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
+ for (int col = 0; col < pixel_count; col ++) {
+ FX_BYTE back_alpha = dest_scan[3];
+ if (back_alpha == 0) {
+ if (clip_scan) {
+ int src_alpha = clip_scan[col] * src_scan[3] / 255;
+ dest_scan[3] = src_alpha;
+ dest_scan[0] = src_scan[2];
+ dest_scan[1] = src_scan[1];
+ dest_scan[2] = src_scan[0];
+ } else {
+ FXARGB_RGBORDERCOPY(dest_scan, src_scan);
+ }
+ dest_scan += 4;
+ src_scan += 4;
+ continue;
+ }
+ FX_BYTE src_alpha;
+ if (clip_scan == NULL) {
+ src_alpha = src_scan[3];
+ } else {
+ src_alpha = clip_scan[col] * src_scan[3] / 255;
+ }
+ if (src_alpha == 0) {
+ dest_scan += 4;
+ src_scan += 4;
+ continue;
+ }
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ dest_scan[3] = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ if (bNonseparableBlend) {
+ FX_BYTE dest_scan_o[3];
+ dest_scan_o[0] = dest_scan[2];
+ dest_scan_o[1] = dest_scan[1];
+ dest_scan_o[2] = dest_scan[0];
+ _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);
+ }
+ for (int color = 0; color < 3; color ++) {
+ int index = 2 - color;
+ if (blend_type) {
+ int blended = bNonseparableBlend ? blended_colors[color] :
+ _BLEND(blend_type, dest_scan[index], *src_scan);
+ blended = FXDIB_ALPHA_MERGE(*src_scan, blended, back_alpha);
+ dest_scan[index] = FXDIB_ALPHA_MERGE(dest_scan[index], blended, alpha_ratio);
+ } else {
+ dest_scan[index] = FXDIB_ALPHA_MERGE(dest_scan[index], *src_scan, alpha_ratio);
+ }
+ src_scan ++;
+ }
+ dest_scan += 4;
+ src_scan++;
+ }
+}
+void _CompositeRow_Rgb2Argb_Blend_NoClip_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int src_Bpp)
+{
+ int blended_colors[3];
+ FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
+ int src_gap = src_Bpp - 3;
+ for (int col = 0; col < width; col ++) {
+ FX_BYTE back_alpha = dest_scan[3];
+ if (back_alpha == 0) {
+ if (src_Bpp == 4) {
+ FXARGB_SETRGBORDERDIB(dest_scan, 0xff000000 | FXARGB_GETDIB(src_scan));
+ } else {
+ FXARGB_SETRGBORDERDIB(dest_scan, FXARGB_MAKE(0xff, src_scan[2], src_scan[1], src_scan[0]));
+ }
+ dest_scan += 4;
+ src_scan += src_Bpp;
+ continue;
+ }
+ dest_scan[3] = 0xff;
+ if (bNonseparableBlend) {
+ FX_BYTE dest_scan_o[3];
+ dest_scan_o[0] = dest_scan[2];
+ dest_scan_o[1] = dest_scan[1];
+ dest_scan_o[2] = dest_scan[0];
+ _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);
+ }
+ for (int color = 0; color < 3; color ++) {
+ int index = 2 - color;
+ int src_color = FX_GAMMA(*src_scan);
+ int blended = bNonseparableBlend ? blended_colors[color] :
+ _BLEND(blend_type, dest_scan[index], src_color);
+ dest_scan[index] = FXDIB_ALPHA_MERGE(src_color, blended, back_alpha);
+ src_scan ++;
+ }
+ dest_scan += 4;
+ src_scan += src_gap;
+ }
+}
+inline void _CompositeRow_Argb2Rgb_Blend_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int dest_Bpp, FX_LPCBYTE clip_scan)
+{
+ int blended_colors[3];
+ FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
+ for (int col = 0; col < width; col ++) {
+ FX_BYTE src_alpha;
+ if (clip_scan) {
+ src_alpha = src_scan[3] * (*clip_scan++) / 255;
+ } else {
+ src_alpha = src_scan[3];
+ }
+ if (src_alpha == 0) {
+ dest_scan += dest_Bpp;
+ src_scan += 4;
+ continue;
+ }
+ if (bNonseparableBlend) {
+ FX_BYTE dest_scan_o[3];
+ dest_scan_o[0] = dest_scan[2];
+ dest_scan_o[1] = dest_scan[1];
+ dest_scan_o[2] = dest_scan[0];
+ _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);
+ }
+ for (int color = 0; color < 3; color ++) {
+ int index = 2 - color;
+ int back_color = FX_GAMMA(dest_scan[index]);
+ int blended = bNonseparableBlend ? blended_colors[color] :
+ _BLEND(blend_type, back_color, *src_scan);
+ dest_scan[index] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(back_color, blended, src_alpha));
+ src_scan ++;
+ }
+ dest_scan += dest_Bpp;
+ src_scan ++;
+ }
+}
+inline void _CompositeRow_Rgb2Argb_NoBlend_NoClip_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int src_Bpp)
+{
+ int src_gap = src_Bpp - 3;
+ for (int col = 0; col < width; col ++) {
+ if (src_Bpp == 4) {
+ FXARGB_SETRGBORDERDIB(dest_scan, 0xff000000 | FXARGB_GETDIB(src_scan));
+ } else {
+ FXARGB_SETRGBORDERDIB(dest_scan, FXARGB_MAKE(0xff, src_scan[2], src_scan[1], src_scan[0]));
+ }
+ dest_scan += 4;
+ src_scan += src_Bpp;
+ }
+}
+inline void _CompositeRow_Rgb2Rgb_Blend_NoClip_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int dest_Bpp, int src_Bpp)
+{
+ int blended_colors[3];
+ FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
+ int src_gap = src_Bpp - 3;
+ for (int col = 0; col < width; col ++) {
+ if (bNonseparableBlend) {
+ FX_BYTE dest_scan_o[3];
+ dest_scan_o[0] = dest_scan[2];
+ dest_scan_o[1] = dest_scan[1];
+ dest_scan_o[2] = dest_scan[0];
+ _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);
+ }
+ for (int color = 0; color < 3; color ++) {
+ int index = 2 - color;
+ int back_color = FX_GAMMA(dest_scan[index]);
+ int src_color = FX_GAMMA(*src_scan);
+ int blended = bNonseparableBlend ? blended_colors[color] :
+ _BLEND(blend_type, back_color, src_color);
+ dest_scan[index] = FX_GAMMA_INVERSE(blended);
+ src_scan ++;
+ }
+ dest_scan += dest_Bpp;
+ src_scan += src_gap;
+ }
+}
+inline void _CompositeRow_Argb2Rgb_NoBlend_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int dest_Bpp, FX_LPCBYTE clip_scan)
+{
+ for (int col = 0; col < width; col ++) {
+ FX_BYTE src_alpha;
+ if (clip_scan) {
+ src_alpha = src_scan[3] * (*clip_scan++) / 255;
+ } else {
+ src_alpha = src_scan[3];
+ }
+ if (src_alpha == 255) {
+ dest_scan[2] = FX_GAMMA_INVERSE(*src_scan++);
+ dest_scan[1] = FX_GAMMA_INVERSE(*src_scan++);
+ dest_scan[0] = FX_GAMMA_INVERSE(*src_scan++);
+ dest_scan += dest_Bpp;
+ src_scan ++;
+ continue;
+ }
+ if (src_alpha == 0) {
+ dest_scan += dest_Bpp;
+ src_scan += 4;
+ continue;
+ }
+ for (int color = 0; color < 3; color ++) {
+ int index = 2 - color;
+ dest_scan[index] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[index]), *src_scan, src_alpha));
+ src_scan ++;
+ }
+ dest_scan += dest_Bpp;
+ src_scan ++;
+ }
+}
+inline void _CompositeRow_Rgb2Rgb_NoBlend_NoClip_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int dest_Bpp, int src_Bpp)
+{
+ for (int col = 0; col < width; col ++) {
+ dest_scan[2] = src_scan[0];
+ dest_scan[1] = src_scan[1];
+ dest_scan[0] = src_scan[2];
+ dest_scan += dest_Bpp;
+ src_scan += src_Bpp;
+ }
+}
+inline void _CompositeRow_Rgb2Argb_Blend_Clip_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int src_Bpp, FX_LPCBYTE clip_scan)
+{
+ int blended_colors[3];
+ FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
+ int src_gap = src_Bpp - 3;
+ for (int col = 0; col < width; col ++) {
+ int src_alpha = *clip_scan ++;
+ FX_BYTE back_alpha = dest_scan[3];
+ if (back_alpha == 0) {
+ dest_scan[2] = FX_GAMMA(*src_scan++);
+ dest_scan[1] = FX_GAMMA(*src_scan++);
+ dest_scan[0] = FX_GAMMA(*src_scan++);
+ src_scan += src_gap;
+ dest_scan += 4;
+ continue;
+ }
+ if (src_alpha == 0) {
+ dest_scan += 4;
+ src_scan += src_Bpp;
+ continue;
+ }
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ dest_scan[3] = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ if (bNonseparableBlend) {
+ FX_BYTE dest_scan_o[3];
+ dest_scan_o[0] = dest_scan[2];
+ dest_scan_o[1] = dest_scan[1];
+ dest_scan_o[2] = dest_scan[0];
+ _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);
+ }
+ for (int color = 0; color < 3; color ++) {
+ int index = 2 - color;
+ int src_color = FX_GAMMA(*src_scan);
+ int blended = bNonseparableBlend ? blended_colors[color] :
+ _BLEND(blend_type, dest_scan[index], src_color);
+ blended = FXDIB_ALPHA_MERGE(src_color, blended, back_alpha);
+ dest_scan[index] = FXDIB_ALPHA_MERGE(dest_scan[index], blended, alpha_ratio);
+ src_scan ++;
+ }
+ dest_scan += 4;
+ src_scan += src_gap;
+ }
+}
+inline void _CompositeRow_Rgb2Rgb_Blend_Clip_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int dest_Bpp, int src_Bpp, FX_LPCBYTE clip_scan)
+{
+ int blended_colors[3];
+ FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
+ int src_gap = src_Bpp - 3;
+ for (int col = 0; col < width; col ++) {
+ FX_BYTE src_alpha = *clip_scan ++;
+ if (src_alpha == 0) {
+ dest_scan += dest_Bpp;
+ src_scan += src_Bpp;
+ continue;
+ }
+ if (bNonseparableBlend) {
+ FX_BYTE dest_scan_o[3];
+ dest_scan_o[0] = dest_scan[2];
+ dest_scan_o[1] = dest_scan[1];
+ dest_scan_o[2] = dest_scan[0];
+ _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);
+ }
+ for (int color = 0; color < 3; color ++) {
+ int index = 2 - color;
+ int src_color = FX_GAMMA(*src_scan);
+ int back_color = FX_GAMMA(dest_scan[index]);
+ int blended = bNonseparableBlend ? blended_colors[color] :
+ _BLEND(blend_type, back_color, src_color);
+ dest_scan[index] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(back_color, blended, src_alpha));
+ src_scan ++;
+ }
+ dest_scan += dest_Bpp;
+ src_scan += src_gap;
+ }
+}
+inline void _CompositeRow_Rgb2Argb_NoBlend_Clip_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int src_Bpp, FX_LPCBYTE clip_scan)
+{
+ int src_gap = src_Bpp - 3;
+ for (int col = 0; col < width; col ++) {
+ int src_alpha = clip_scan[col];
+ if (src_alpha == 255) {
+ dest_scan[2] = FX_GAMMA(*src_scan++);
+ dest_scan[1] = FX_GAMMA(*src_scan++);
+ dest_scan[0] = FX_GAMMA(*src_scan++);
+ dest_scan[3] = 255;
+ dest_scan += 4;
+ src_scan += src_gap;
+ continue;
+ }
+ if (src_alpha == 0) {
+ dest_scan += 4;
+ src_scan += src_Bpp;
+ continue;
+ }
+ int back_alpha = dest_scan[3];
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ dest_scan[3] = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ for (int color = 0; color < 3; color ++) {
+ int index = 2 - color;
+ dest_scan[index] = FXDIB_ALPHA_MERGE(dest_scan[index], FX_GAMMA(*src_scan), alpha_ratio);
+ src_scan ++;
+ }
+ dest_scan += 4;
+ src_scan += src_gap;
+ }
+}
+inline void _CompositeRow_Rgb2Rgb_NoBlend_Clip_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int dest_Bpp, int src_Bpp, FX_LPCBYTE clip_scan)
+{
+ for (int col = 0; col < width; col ++) {
+ int src_alpha = clip_scan[col];
+ if (src_alpha == 255) {
+ dest_scan[2] = src_scan[0];
+ dest_scan[1] = src_scan[1];
+ dest_scan[0] = src_scan[2];
+ } else if (src_alpha) {
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), FX_GAMMA(*src_scan), src_alpha));
+ src_scan ++;
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), FX_GAMMA(*src_scan), src_alpha));
+ src_scan ++;
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), FX_GAMMA(*src_scan), src_alpha));
+ dest_scan += dest_Bpp;
+ src_scan += src_Bpp - 2;
+ continue;
+ }
+ dest_scan += dest_Bpp;
+ src_scan += src_Bpp;
+ }
+}
+inline void _CompositeRow_8bppRgb2Rgb_NoBlend_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, FX_ARGB* pPalette, int pixel_count,
+ int DestBpp, FX_LPCBYTE clip_scan)
+{
+ for (int col = 0; col < pixel_count; col ++) {
+ FX_ARGB argb = pPalette ? pPalette[*src_scan] : (*src_scan) * 0x010101;
+ int src_r = FXARGB_R(argb);
+ int src_g = FXARGB_G(argb);
+ int src_b = FXARGB_B(argb);
+ if (clip_scan && clip_scan[col] < 255) {
+ dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], src_b, clip_scan[col]);
+ dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], src_g, clip_scan[col]);
+ dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], src_r, clip_scan[col]);
+ } else {
+ dest_scan[2] = src_b;
+ dest_scan[1] = src_g;
+ dest_scan[0] = src_r;
+ }
+ dest_scan += DestBpp;
+ src_scan ++;
+ }
+}
+inline void _CompositeRow_1bppRgb2Rgb_NoBlend_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_left,
+ FX_ARGB* pPalette, int pixel_count, int DestBpp, FX_LPCBYTE clip_scan)
+{
+ int reset_r, reset_g, reset_b;
+ int set_r, set_g, set_b;
+ if (pPalette) {
+ reset_r = FXARGB_R(pPalette[0]);
+ reset_g = FXARGB_G(pPalette[0]);
+ reset_b = FXARGB_B(pPalette[0]);
+ set_r = FXARGB_R(pPalette[1]);
+ set_g = FXARGB_G(pPalette[1]);
+ set_b = FXARGB_B(pPalette[1]);
+ } else {
+ reset_r = reset_g = reset_b = 0;
+ set_r = set_g = set_b = 255;
+ }
+ for (int col = 0; col < pixel_count; col ++) {
+ int src_r, src_g, src_b;
+ if (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) {
+ src_r = set_r;
+ src_g = set_g;
+ src_b = set_b;
+ } else {
+ src_r = reset_r;
+ src_g = reset_g;
+ src_b = reset_b;
+ }
+ if (clip_scan && clip_scan[col] < 255) {
+ dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], src_b, clip_scan[col]);
+ dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], src_g, clip_scan[col]);
+ dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], src_r, clip_scan[col]);
+ } else {
+ dest_scan[2] = src_b;
+ dest_scan[1] = src_g;
+ dest_scan[0] = src_r;
+ }
+ dest_scan += DestBpp;
+ }
+}
+inline void _CompositeRow_8bppRgb2Argb_NoBlend_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width,
+ FX_ARGB* pPalette, FX_LPCBYTE clip_scan)
+{
+ for (int col = 0; col < width; col ++) {
+ int src_r, src_g, src_b;
+ if (pPalette) {
+ FX_ARGB argb = pPalette[*src_scan];
+ src_r = FXARGB_R(argb);
+ src_g = FXARGB_G(argb);
+ src_b = FXARGB_B(argb);
+ } else {
+ src_r = src_g = src_b = *src_scan;
+ }
+ if (clip_scan == NULL || clip_scan[col] == 255) {
+ dest_scan[2] = FX_GAMMA(src_b);
+ dest_scan[1] = FX_GAMMA(src_g);
+ dest_scan[0] = FX_GAMMA(src_r);
+ dest_scan[3] = 255;
+ src_scan ++;
+ dest_scan += 4;
+ continue;
+ }
+ int src_alpha = clip_scan[col];
+ if (src_alpha == 0) {
+ dest_scan += 4;
+ src_scan ++;
+ continue;
+ }
+ int back_alpha = dest_scan[3];
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ dest_scan[3] = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], FX_GAMMA(src_b), alpha_ratio);
+ dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], FX_GAMMA(src_g), alpha_ratio);
+ dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], FX_GAMMA(src_r), alpha_ratio);
+ dest_scan += 4;
+ src_scan ++;
+ }
+}
+inline void _CompositeRow_1bppRgb2Argb_NoBlend_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_left, int width,
+ FX_ARGB* pPalette, FX_LPCBYTE clip_scan)
+{
+ int reset_r, reset_g, reset_b;
+ int set_r, set_g, set_b;
+ if (pPalette) {
+ reset_r = FXARGB_R(pPalette[0]);
+ reset_g = FXARGB_G(pPalette[0]);
+ reset_b = FXARGB_B(pPalette[0]);
+ set_r = FXARGB_R(pPalette[1]);
+ set_g = FXARGB_G(pPalette[1]);
+ set_b = FXARGB_B(pPalette[1]);
+ } else {
+ reset_r = reset_g = reset_b = 0;
+ set_r = set_g = set_b = 255;
+ }
+ for (int col = 0; col < width; col ++) {
+ int src_r, src_g, src_b;
+ if (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) {
+ src_r = set_r;
+ src_g = set_g;
+ src_b = set_b;
+ } else {
+ src_r = reset_r;
+ src_g = reset_g;
+ src_b = reset_b;
+ }
+ if (clip_scan == NULL || clip_scan[col] == 255) {
+ dest_scan[2] = FX_GAMMA(src_b);
+ dest_scan[1] = FX_GAMMA(src_g);
+ dest_scan[0] = FX_GAMMA(src_r);
+ dest_scan[3] = 255;
+ dest_scan += 4;
+ continue;
+ }
+ int src_alpha = clip_scan[col];
+ if (src_alpha == 0) {
+ dest_scan += 4;
+ continue;
+ }
+ int back_alpha = dest_scan[3];
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ dest_scan[3] = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], FX_GAMMA(src_b), alpha_ratio);
+ dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], FX_GAMMA(src_g), alpha_ratio);
+ dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], FX_GAMMA(src_r), alpha_ratio);
+ dest_scan += 4;
+ }
+}
+void _CompositeRow_ByteMask2Argb_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_r, int src_g, int src_b, int pixel_count,
+ int blend_type, FX_LPCBYTE clip_scan)
+{
+ for (int col = 0; col < pixel_count; col ++) {
+ int src_alpha;
+ if (clip_scan) {
+ src_alpha = mask_alpha * clip_scan[col] * src_scan[col] / 255 / 255;
+ } else {
+ src_alpha = mask_alpha * src_scan[col] / 255;
+ }
+ FX_BYTE back_alpha = dest_scan[3];
+ if (back_alpha == 0) {
+ FXARGB_SETRGBORDERDIB(dest_scan, FXARGB_MAKE(src_alpha, src_r, src_g, src_b));
+ dest_scan += 4;
+ continue;
+ }
+ if (src_alpha == 0) {
+ dest_scan += 4;
+ continue;
+ }
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ dest_scan[3] = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {
+ int blended_colors[3];
+ FX_BYTE src_scan[3];
+ FX_BYTE dest_scan_o[3];
+ src_scan[0] = src_b;
+ src_scan[1] = src_g;
+ src_scan[2] = src_r;
+ dest_scan_o[0] = dest_scan[2];
+ dest_scan_o[1] = dest_scan[1];
+ dest_scan_o[2] = dest_scan[0];
+ _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);
+ dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], blended_colors[0], alpha_ratio);
+ dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], blended_colors[1], alpha_ratio);
+ dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], blended_colors[2], alpha_ratio);
+ } else if (blend_type) {
+ int blended = _BLEND(blend_type, dest_scan[2], src_b);
+ blended = FXDIB_ALPHA_MERGE(src_b, blended, back_alpha);
+ dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], blended, alpha_ratio);
+ blended = _BLEND(blend_type, dest_scan[1], src_g);
+ blended = FXDIB_ALPHA_MERGE(src_g, blended, back_alpha);
+ dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], blended, alpha_ratio);
+ blended = _BLEND(blend_type, dest_scan[0], src_r);
+ blended = FXDIB_ALPHA_MERGE(src_r, blended, back_alpha);
+ dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], blended, alpha_ratio);
+ } else {
+ dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], src_b, alpha_ratio);
+ dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], src_g, alpha_ratio);
+ dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], src_r, alpha_ratio);
+ }
+ dest_scan += 4;
+ }
+}
+void _CompositeRow_ByteMask2Rgb_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_r, int src_g, int src_b, int pixel_count,
+ int blend_type, int Bpp, FX_LPCBYTE clip_scan)
+{
+ for (int col = 0; col < pixel_count; col ++) {
+ int src_alpha;
+ if (clip_scan) {
+ src_alpha = mask_alpha * clip_scan[col] * src_scan[col] / 255 / 255;
+ } else {
+ src_alpha = mask_alpha * src_scan[col] / 255;
+ }
+ if (src_alpha == 0) {
+ dest_scan += Bpp;
+ continue;
+ }
+ if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {
+ int blended_colors[3];
+ FX_BYTE src_scan[3];
+ FX_BYTE dest_scan_o[3];
+ src_scan[0] = src_b;
+ src_scan[1] = src_g;
+ src_scan[2] = src_r;
+ dest_scan_o[0] = dest_scan[2];
+ dest_scan_o[1] = dest_scan[1];
+ dest_scan_o[2] = dest_scan[0];
+ _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);
+ dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], blended_colors[0], src_alpha);
+ dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], blended_colors[1], src_alpha);
+ dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], blended_colors[2], src_alpha);
+ } else if (blend_type) {
+ int blended = _BLEND(blend_type, dest_scan[2], src_b);
+ dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], blended, src_alpha);
+ blended = _BLEND(blend_type, dest_scan[1], src_g);
+ dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], blended, src_alpha);
+ blended = _BLEND(blend_type, dest_scan[0], src_r);
+ dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], blended, src_alpha);
+ } else {
+ dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], src_b, src_alpha);
+ dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], src_g, src_alpha);
+ dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], src_r, src_alpha);
+ }
+ dest_scan += Bpp;
+ }
+}
+void _CompositeRow_BitMask2Argb_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_r, int src_g, int src_b,
+ int src_left, int pixel_count, int blend_type, FX_LPCBYTE clip_scan)
+{
+ if (blend_type == FXDIB_BLEND_NORMAL && clip_scan == NULL && mask_alpha == 255) {
+ FX_ARGB argb = FXARGB_MAKE(0xff, src_r, src_g, src_b);
+ for (int col = 0; col < pixel_count; col ++) {
+ if (src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8))) {
+ FXARGB_SETRGBORDERDIB(dest_scan, argb);
+ }
+ dest_scan += 4;
+ }
+ return;
+ }
+ for (int col = 0; col < pixel_count; col ++) {
+ if (!(src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8)))) {
+ dest_scan += 4;
+ continue;
+ }
+ int src_alpha;
+ if (clip_scan) {
+ src_alpha = mask_alpha * clip_scan[col] / 255;
+ } else {
+ src_alpha = mask_alpha;
+ }
+ FX_BYTE back_alpha = dest_scan[3];
+ if (back_alpha == 0) {
+ FXARGB_SETRGBORDERDIB(dest_scan, FXARGB_MAKE(src_alpha, src_r, src_g, src_b));
+ dest_scan += 4;
+ continue;
+ }
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ dest_scan[3] = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {
+ int blended_colors[3];
+ FX_BYTE src_scan[3];
+ FX_BYTE dest_scan_o[3];
+ src_scan[0] = src_b;
+ src_scan[1] = src_g;
+ src_scan[2] = src_r;
+ dest_scan_o[0] = dest_scan[2];
+ dest_scan_o[1] = dest_scan[1];
+ dest_scan_o[2] = dest_scan[0];
+ _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);
+ dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], blended_colors[0], alpha_ratio);
+ dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], blended_colors[1], alpha_ratio);
+ dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], blended_colors[2], alpha_ratio);
+ } else if (blend_type) {
+ int blended = _BLEND(blend_type, dest_scan[2], src_b);
+ blended = FXDIB_ALPHA_MERGE(src_b, blended, back_alpha);
+ dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], blended, alpha_ratio);
+ blended = _BLEND(blend_type, dest_scan[1], src_g);
+ blended = FXDIB_ALPHA_MERGE(src_g, blended, back_alpha);
+ dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], blended, alpha_ratio);
+ blended = _BLEND(blend_type, dest_scan[0], src_r);
+ blended = FXDIB_ALPHA_MERGE(src_r, blended, back_alpha);
+ dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], blended, alpha_ratio);
+ } else {
+ dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], src_b, alpha_ratio);
+ dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], src_g, alpha_ratio);
+ dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], src_r, alpha_ratio);
+ }
+ dest_scan += 4;
+ }
+}
+void _CompositeRow_BitMask2Rgb_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_r, int src_g, int src_b,
+ int src_left, int pixel_count, int blend_type, int Bpp, FX_LPCBYTE clip_scan)
+{
+ if (blend_type == FXDIB_BLEND_NORMAL && clip_scan == NULL && mask_alpha == 255) {
+ for (int col = 0; col < pixel_count; col ++) {
+ if (src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8))) {
+ dest_scan[2] = src_b;
+ dest_scan[1] = src_g;
+ dest_scan[0] = src_r;
+ }
+ dest_scan += Bpp;
+ }
+ return;
+ }
+ for (int col = 0; col < pixel_count; col ++) {
+ if (!(src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8)))) {
+ dest_scan += Bpp;
+ continue;
+ }
+ int src_alpha;
+ if (clip_scan) {
+ src_alpha = mask_alpha * clip_scan[col] / 255;
+ } else {
+ src_alpha = mask_alpha;
+ }
+ if (src_alpha == 0) {
+ dest_scan += Bpp;
+ continue;
+ }
+ if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {
+ int blended_colors[3];
+ FX_BYTE src_scan[3];
+ FX_BYTE dest_scan_o[3];
+ src_scan[0] = src_b;
+ src_scan[1] = src_g;
+ src_scan[2] = src_r;
+ dest_scan_o[0] = dest_scan[2];
+ dest_scan_o[1] = dest_scan[1];
+ dest_scan_o[2] = dest_scan[0];
+ _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);
+ dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], blended_colors[0], src_alpha);
+ dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], blended_colors[1], src_alpha);
+ dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], blended_colors[2], src_alpha);
+ } else if (blend_type) {
+ int back_color = FX_GAMMA(dest_scan[2]);
+ int blended = _BLEND(blend_type, back_color, src_b);
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(back_color, blended, src_alpha));
+ back_color = FX_GAMMA(dest_scan[1]);
+ blended = _BLEND(blend_type, back_color, src_g);
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(back_color, blended, src_alpha));
+ back_color = FX_GAMMA(dest_scan[0]);
+ blended = _BLEND(blend_type, back_color, src_r);
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(back_color, blended, src_alpha));
+ } else {
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), src_b, src_alpha));
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), src_g, src_alpha));
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), src_r, src_alpha));
+ }
+ dest_scan += Bpp;
+ }
+}
+inline FX_BOOL _ScanlineCompositor_InitSourceMask(FXDIB_Format dest_format, int alpha_flag, FX_DWORD mask_color, int& mask_alpha,
+ int& mask_red, int& mask_green, int& mask_blue, int& mask_black,
+ void* icc_module, void* pIccTransform)
+{
+ ICodec_IccModule* pIccModule = (ICodec_IccModule*)icc_module;
+ if (alpha_flag >> 8) {
+ mask_alpha = alpha_flag & 0xff;
+ mask_red = FXSYS_GetCValue(mask_color);
+ mask_green = FXSYS_GetMValue(mask_color);
+ mask_blue = FXSYS_GetYValue(mask_color);
+ mask_black = FXSYS_GetKValue(mask_color);
+ } else {
+ mask_alpha = FXARGB_A(mask_color);
+ mask_red = FXARGB_R(mask_color);
+ mask_green = FXARGB_G(mask_color);
+ mask_blue = FXARGB_B(mask_color);
+ }
+ if (dest_format == FXDIB_8bppMask) {
+ return TRUE;
+ }
+ if ((dest_format & 0xff) == 8) {
+ if (pIccTransform) {
+ mask_color = (alpha_flag >> 8) ? FXCMYK_TODIB(mask_color) : FXARGB_TODIB(mask_color);
+ FX_LPBYTE gray_p = (FX_LPBYTE)&mask_color;
+ pIccModule->TranslateScanline(pIccTransform, gray_p, gray_p, 1);
+ mask_red = dest_format & 0x0400 ? FX_CCOLOR(gray_p[0]) : gray_p[0];
+ } else {
+ if (alpha_flag >> 8) {
+ FX_BYTE r, g, b;
+ AdobeCMYK_to_sRGB1(mask_red, mask_green, mask_blue, mask_black,
+ r, g, b);
+ mask_red = FXRGB2GRAY(r, g, b);
+ } else {
+ mask_red = FXRGB2GRAY(mask_red, mask_green, mask_blue);
+ }
+ if (dest_format & 0x0400) {
+ mask_red = FX_CCOLOR(mask_red);
+ }
+ }
+ } else {
+ FX_LPBYTE mask_color_p = (FX_LPBYTE)&mask_color;
+ mask_color = (alpha_flag >> 8) ? FXCMYK_TODIB(mask_color) : FXARGB_TODIB(mask_color);
+ if (pIccTransform) {
+ pIccModule->TranslateScanline(pIccTransform, mask_color_p, mask_color_p, 1);
+ mask_red = mask_color_p[2];
+ mask_green = mask_color_p[1];
+ mask_blue = mask_color_p[0];
+ } else if (alpha_flag >> 8) {
+ AdobeCMYK_to_sRGB1(mask_color_p[0], mask_color_p[1], mask_color_p[2], mask_color_p[3],
+ mask_color_p[2], mask_color_p[1], mask_color_p[0]);
+ mask_red = mask_color_p[2];
+ mask_green = mask_color_p[1];
+ mask_blue = mask_color_p[0];
+ }
+ }
+ return TRUE;
+}
+inline void _ScanlineCompositor_InitSourcePalette(FXDIB_Format src_format, FXDIB_Format dest_format,
+ FX_DWORD*& pDestPalette, FX_DWORD* pSrcPalette,
+ void* icc_module, void* pIccTransform)
+{
+ ICodec_IccModule* pIccModule = (ICodec_IccModule*)icc_module;
+ FX_BOOL isSrcCmyk = src_format & 0x0400 ? TRUE : FALSE;
+ FX_BOOL isDstCmyk = dest_format & 0x0400 ? TRUE : FALSE;
+ pDestPalette = NULL;
+ if (pIccTransform) {
+ if (pSrcPalette) {
+ if ((dest_format & 0xff) == 8) {
+ int pal_count = 1 << (src_format & 0xff);
+ FX_LPBYTE gray_pal = FX_Alloc(FX_BYTE, pal_count);
+ if (!gray_pal) {
+ return;
+ }
+ pDestPalette = (FX_DWORD*)gray_pal;
+ for (int i = 0; i < pal_count; i ++) {
+ FX_DWORD color = isSrcCmyk ? FXCMYK_TODIB(pSrcPalette[i]) : FXARGB_TODIB(pSrcPalette[i]);
+ pIccModule->TranslateScanline(pIccTransform, gray_pal, (FX_LPCBYTE)&color, 1);
+ gray_pal ++;
+ }
+ } else {
+ int palsize = 1 << (src_format & 0xff);
+ pDestPalette = FX_Alloc(FX_DWORD, palsize);
+ if (!pDestPalette) {
+ return;
+ }
+ for (int i = 0; i < palsize; i ++) {
+ FX_DWORD color = isSrcCmyk ? FXCMYK_TODIB(pSrcPalette[i]) : FXARGB_TODIB(pSrcPalette[i]);
+ pIccModule->TranslateScanline(pIccTransform, (FX_LPBYTE)&color, (FX_LPCBYTE)&color, 1);
+ pDestPalette[i] = isDstCmyk ? FXCMYK_TODIB(color) : FXARGB_TODIB(color);
+ }
+ }
+ } else {
+ int pal_count = 1 << (src_format & 0xff);
+ FX_LPBYTE gray_pal = FX_Alloc(FX_BYTE, pal_count);
+ if (!gray_pal) {
+ return;
+ }
+ if (pal_count == 2) {
+ gray_pal[0] = 0;
+ gray_pal[1] = 255;
+ } else {
+ for (int i = 0; i < pal_count; i++) {
+ gray_pal[i] = i;
+ }
+ }
+ if ((dest_format & 0xff) == 8) {
+ pIccModule->TranslateScanline(pIccTransform, gray_pal, gray_pal, pal_count);
+ pDestPalette = (FX_DWORD*)gray_pal;
+ } else {
+ pDestPalette = FX_Alloc(FX_DWORD, pal_count);
+ if (!pDestPalette) {
+ FX_Free(gray_pal);
+ return;
+ }
+ for (int i = 0; i < pal_count; i ++) {
+ pIccModule->TranslateScanline(pIccTransform, (FX_LPBYTE)&pDestPalette[i], &gray_pal[i], 1);
+ pDestPalette[i] = isDstCmyk ? FXCMYK_TODIB(pDestPalette[i]) : FXARGB_TODIB(pDestPalette[i]);
+ }
+ FX_Free(gray_pal);
+ }
+ }
+ } else {
+ if (pSrcPalette) {
+ if ((dest_format & 0xff) == 8) {
+ int pal_count = 1 << (src_format & 0xff);
+ FX_LPBYTE gray_pal = FX_Alloc(FX_BYTE, pal_count);
+ if (!gray_pal) {
+ return;
+ }
+ pDestPalette = (FX_DWORD*)gray_pal;
+ if (isSrcCmyk) {
+ for (int i = 0; i < pal_count; i ++) {
+ FX_CMYK cmyk = pSrcPalette[i];
+ FX_BYTE r, g, b;
+ AdobeCMYK_to_sRGB1(FXSYS_GetCValue(cmyk), FXSYS_GetMValue(cmyk), FXSYS_GetYValue(cmyk), FXSYS_GetKValue(cmyk),
+ r, g, b);
+ *gray_pal ++ = FXRGB2GRAY(r, g, b);
+ }
+ } else
+ for (int i = 0; i < pal_count; i ++) {
+ FX_ARGB argb = pSrcPalette[i];
+ *gray_pal ++ = FXRGB2GRAY(FXARGB_R(argb), FXARGB_G(argb), FXARGB_B(argb));
+ }
+ } else {
+ int palsize = 1 << (src_format & 0xff);
+ pDestPalette = FX_Alloc(FX_DWORD, palsize);
+ if (!pDestPalette) {
+ return;
+ }
+ if (isDstCmyk == isSrcCmyk) {
+ FXSYS_memcpy32(pDestPalette, pSrcPalette, palsize * sizeof(FX_DWORD));
+ } else {
+ for (int i = 0; i < palsize; i ++) {
+ FX_CMYK cmyk = pSrcPalette[i];
+ FX_BYTE r, g, b;
+ AdobeCMYK_to_sRGB1(FXSYS_GetCValue(cmyk), FXSYS_GetMValue(cmyk), FXSYS_GetYValue(cmyk), FXSYS_GetKValue(cmyk),
+ r, g, b);
+ pDestPalette[i] = FXARGB_MAKE(0xff, r, g, b);
+ }
+ }
+ }
+ } else {
+ if ((dest_format & 0xff) == 8) {
+ int pal_count = 1 << (src_format & 0xff);
+ FX_LPBYTE gray_pal = FX_Alloc(FX_BYTE, pal_count);
+ if (!gray_pal) {
+ return;
+ }
+ if (pal_count == 2) {
+ gray_pal[0] = 0;
+ gray_pal[1] = 255;
+ } else {
+ for (int i = 0; i < pal_count; i++) {
+ gray_pal[i] = i;
+ }
+ }
+ pDestPalette = (FX_DWORD*)gray_pal;
+ } else {
+ int palsize = 1 << (src_format & 0xff);
+ pDestPalette = FX_Alloc(FX_DWORD, palsize);
+ if (!pDestPalette) {
+ return;
+ }
+ if (palsize == 2) {
+ pDestPalette[0] = isSrcCmyk ? 255 : 0xff000000;
+ pDestPalette[1] = isSrcCmyk ? 0 : 0xffffffff;
+ } else {
+ for (int i = 0; i < palsize; i++) {
+ pDestPalette[i] = isSrcCmyk ? FX_CCOLOR(i) : (i * 0x10101);
+ }
+ }
+ if (isSrcCmyk != isDstCmyk) {
+ for (int i = 0; i < palsize; i ++) {
+ FX_CMYK cmyk = pDestPalette[i];
+ FX_BYTE r, g, b;
+ AdobeCMYK_to_sRGB1(FXSYS_GetCValue(cmyk), FXSYS_GetMValue(cmyk), FXSYS_GetYValue(cmyk), FXSYS_GetKValue(cmyk),
+ r, g, b);
+ pDestPalette[i] = FXARGB_MAKE(0xff, r, g, b);
+ }
+ }
+ }
+ }
+ }
+}
+CFX_ScanlineCompositor::CFX_ScanlineCompositor()
+{
+ m_pSrcPalette = NULL;
+ m_pCacheScanline = NULL;
+ m_CacheSize = 0;
+ m_bRgbByteOrder = FALSE;
+ m_BlendType = FXDIB_BLEND_NORMAL;
+}
+CFX_ScanlineCompositor::~CFX_ScanlineCompositor()
+{
+ if (m_pSrcPalette) {
+ FX_Free(m_pSrcPalette);
+ }
+ if (m_pCacheScanline) {
+ FX_Free(m_pCacheScanline);
+ }
+}
+FX_BOOL CFX_ScanlineCompositor::Init(FXDIB_Format dest_format, FXDIB_Format src_format, FX_INT32 width, FX_DWORD* pSrcPalette,
+ FX_DWORD mask_color, int blend_type, FX_BOOL bClip, FX_BOOL bRgbByteOrder, int alpha_flag, void* pIccTransform)
+{
+ m_SrcFormat = src_format;
+ m_DestFormat = dest_format;
+ m_BlendType = blend_type;
+ m_bRgbByteOrder = bRgbByteOrder;
+ ICodec_IccModule* pIccModule = NULL;
+ if (CFX_GEModule::Get()->GetCodecModule()) {
+ pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ }
+ if (pIccModule == NULL) {
+ pIccTransform = NULL;
+ }
+ m_pIccTransform = pIccTransform;
+ if ((dest_format & 0xff) == 1) {
+ return FALSE;
+ }
+ if (m_SrcFormat == FXDIB_1bppMask || m_SrcFormat == FXDIB_8bppMask) {
+ return _ScanlineCompositor_InitSourceMask(dest_format, alpha_flag, mask_color,
+ m_MaskAlpha, m_MaskRed, m_MaskGreen, m_MaskBlue, m_MaskBlack,
+ pIccModule, pIccTransform);
+ }
+ if (pIccTransform == NULL && (~src_format & 0x0400) && (dest_format & 0x0400)) {
+ return FALSE;
+ }
+ if ((m_SrcFormat & 0xff) <= 8) {
+ if (dest_format == FXDIB_8bppMask) {
+ return TRUE;
+ }
+ _ScanlineCompositor_InitSourcePalette(src_format, dest_format, m_pSrcPalette, pSrcPalette,
+ pIccModule, pIccTransform);
+ m_Transparency = (dest_format == FXDIB_Argb ? 1 : 0)
+ + (dest_format & 0x0200 ? 2 : 0)
+ + (dest_format & 0x0400 ? 4 : 0)
+ + ((src_format & 0xff) == 1 ? 8 : 0);
+ return TRUE;
+ }
+ m_Transparency = (src_format & 0x0200 ? 0 : 1)
+ + (dest_format & 0x0200 ? 0 : 2)
+ + (blend_type == FXDIB_BLEND_NORMAL ? 4 : 0)
+ + (bClip ? 8 : 0)
+ + (src_format & 0x0400 ? 16 : 0)
+ + (dest_format & 0x0400 ? 32 : 0)
+ + (pIccTransform ? 64 : 0);
+ return TRUE;
+}
+void CFX_ScanlineCompositor::CompositeRgbBitmapLine(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, FX_LPCBYTE clip_scan,
+ FX_LPCBYTE src_extra_alpha, FX_LPBYTE dst_extra_alpha)
+{
+ int src_Bpp = (m_SrcFormat & 0xff) >> 3;
+ int dest_Bpp = (m_DestFormat & 0xff) >> 3;
+ int dest_Size = width * dest_Bpp + 4;
+ if (m_bRgbByteOrder) {
+ switch (m_Transparency) {
+ case 0:
+ case 4:
+ case 8:
+ case 12:
+ _CompositeRow_Argb2Argb_RgbByteOrder(dest_scan, src_scan, width, m_BlendType, clip_scan);
+ break;
+ case 1:
+ _CompositeRow_Rgb2Argb_Blend_NoClip_RgbByteOrder(dest_scan, src_scan, width, m_BlendType, src_Bpp);
+ break;
+ case 2:
+ case 10:
+ _CompositeRow_Argb2Rgb_Blend_RgbByteOrder(dest_scan, src_scan, width, m_BlendType, dest_Bpp, clip_scan);
+ break;
+ case 3:
+ _CompositeRow_Rgb2Rgb_Blend_NoClip_RgbByteOrder(dest_scan, src_scan, width, m_BlendType, dest_Bpp, src_Bpp);
+ break;
+ case 5:
+ _CompositeRow_Rgb2Argb_NoBlend_NoClip_RgbByteOrder(dest_scan, src_scan, width, src_Bpp);
+ break;
+ case 6:
+ case 14:
+ _CompositeRow_Argb2Rgb_NoBlend_RgbByteOrder(dest_scan, src_scan, width, dest_Bpp, clip_scan);
+ break;
+ case 7:
+ _CompositeRow_Rgb2Rgb_NoBlend_NoClip_RgbByteOrder(dest_scan, src_scan, width, dest_Bpp, src_Bpp);
+ break;
+ case 9:
+ _CompositeRow_Rgb2Argb_Blend_Clip_RgbByteOrder(dest_scan, src_scan, width, m_BlendType, src_Bpp, clip_scan);
+ break;
+ case 11:
+ _CompositeRow_Rgb2Rgb_Blend_Clip_RgbByteOrder(dest_scan, src_scan, width, m_BlendType, dest_Bpp, src_Bpp, clip_scan);
+ break;
+ case 13:
+ _CompositeRow_Rgb2Argb_NoBlend_Clip_RgbByteOrder(dest_scan, src_scan, width, src_Bpp, clip_scan);
+ break;
+ case 15:
+ _CompositeRow_Rgb2Rgb_NoBlend_Clip_RgbByteOrder(dest_scan, src_scan, width, dest_Bpp, src_Bpp, clip_scan);
+ break;
+ }
+ return;
+ }
+ if (m_DestFormat == FXDIB_8bppMask) {
+ if (m_SrcFormat & 0x0200) {
+ if (m_SrcFormat == FXDIB_Argb) {
+ _CompositeRow_Argb2Mask(dest_scan, src_scan, width, clip_scan);
+ } else {
+ _CompositeRow_Rgba2Mask(dest_scan, src_extra_alpha, width, clip_scan);
+ }
+ } else {
+ _CompositeRow_Rgb2Mask(dest_scan, src_scan, width, clip_scan);
+ }
+ } else if ((m_DestFormat & 0xff) == 8) {
+ if (m_DestFormat & 0x0400) {
+ for (int i = 0; i < width; i ++) {
+ *dest_scan = ~*dest_scan;
+ dest_scan++;
+ }
+ }
+ if (m_SrcFormat & 0x0200) {
+ if (m_DestFormat & 0x0200) {
+ _CompositeRow_Argb2Graya(dest_scan, src_scan, width, m_BlendType, clip_scan, src_extra_alpha, dst_extra_alpha, m_pIccTransform);
+ } else {
+ _CompositeRow_Argb2Gray(dest_scan, src_scan, width, m_BlendType, clip_scan, src_extra_alpha, m_pIccTransform);
+ }
+ } else {
+ if (m_DestFormat & 0x0200) {
+ _CompositeRow_Rgb2Graya(dest_scan, src_scan, src_Bpp, width, m_BlendType, clip_scan, dst_extra_alpha, m_pIccTransform);
+ } else {
+ _CompositeRow_Rgb2Gray(dest_scan, src_scan, src_Bpp, width, m_BlendType, clip_scan, m_pIccTransform);
+ }
+ }
+ if (m_DestFormat & 0x0400) {
+ for (int i = 0; i < width; i ++) {
+ *dest_scan = ~*dest_scan;
+ dest_scan++;
+ }
+ }
+ } else {
+ if (dest_Size > m_CacheSize) {
+ m_pCacheScanline = FX_Realloc(FX_BYTE, m_pCacheScanline, dest_Size);
+ if (!m_pCacheScanline) {
+ return;
+ }
+ m_CacheSize = dest_Size;
+ }
+ switch (m_Transparency) {
+ case 0:
+ case 4:
+ case 8:
+ case 4+8: {
+ _CompositeRow_Argb2Argb(dest_scan, src_scan, width, m_BlendType, clip_scan,
+ dst_extra_alpha, src_extra_alpha);
+ }
+ break;
+ case 64:
+ case 4+64:
+ case 8+64:
+ case 4+8+64: {
+ _CompositeRow_Argb2Argb_Transform(dest_scan, src_scan, width, m_BlendType, clip_scan,
+ dst_extra_alpha, src_extra_alpha, m_pCacheScanline, m_pIccTransform);
+ }
+ break;
+ case 1:
+ _CompositeRow_Rgb2Argb_Blend_NoClip(dest_scan, src_scan, width, m_BlendType, src_Bpp,
+ dst_extra_alpha);
+ break;
+ case 1+64:
+ _CompositeRow_Rgb2Argb_Blend_NoClip_Transform(dest_scan, src_scan, width, m_BlendType, src_Bpp,
+ dst_extra_alpha, m_pCacheScanline, m_pIccTransform);
+ break;
+ case 1+8:
+ _CompositeRow_Rgb2Argb_Blend_Clip(dest_scan, src_scan, width, m_BlendType, src_Bpp, clip_scan,
+ dst_extra_alpha);
+ break;
+ case 1+8+64:
+ _CompositeRow_Rgb2Argb_Blend_Clip_Transform(dest_scan, src_scan, width, m_BlendType, src_Bpp, clip_scan,
+ dst_extra_alpha, m_pCacheScanline, m_pIccTransform);
+ break;
+ case 1+4:
+ _CompositeRow_Rgb2Argb_NoBlend_NoClip(dest_scan, src_scan, width, src_Bpp,
+ dst_extra_alpha);
+ break;
+ case 1+4+64:
+ _CompositeRow_Rgb2Argb_NoBlend_NoClip_Transform(dest_scan, src_scan, width, src_Bpp,
+ dst_extra_alpha, m_pCacheScanline, m_pIccTransform);
+ break;
+ case 1+4+8:
+ _CompositeRow_Rgb2Argb_NoBlend_Clip(dest_scan, src_scan, width, src_Bpp, clip_scan,
+ dst_extra_alpha);
+ break;
+ case 1+4+8+64:
+ _CompositeRow_Rgb2Argb_NoBlend_Clip_Transform(dest_scan, src_scan, width, src_Bpp, clip_scan,
+ dst_extra_alpha, m_pCacheScanline, m_pIccTransform);
+ break;
+ case 2:
+ case 2+8:
+ _CompositeRow_Argb2Rgb_Blend(dest_scan, src_scan, width, m_BlendType, dest_Bpp, clip_scan,
+ src_extra_alpha);
+ break;
+ case 2+64:
+ case 2+8+64:
+ _CompositeRow_Argb2Rgb_Blend_Transform(dest_scan, src_scan, width, m_BlendType, dest_Bpp, clip_scan,
+ src_extra_alpha, m_pCacheScanline, m_pIccTransform);
+ break;
+ case 2+4:
+ case 2+4+8:
+ _CompositeRow_Argb2Rgb_NoBlend(dest_scan, src_scan, width, dest_Bpp, clip_scan,
+ src_extra_alpha);
+ break;
+ case 2+4+64:
+ case 2+4+8+64:
+ _CompositeRow_Argb2Rgb_NoBlend_Transform(dest_scan, src_scan, width, dest_Bpp, clip_scan,
+ src_extra_alpha, m_pCacheScanline, m_pIccTransform);
+ break;
+ case 1+2:
+ _CompositeRow_Rgb2Rgb_Blend_NoClip(dest_scan, src_scan, width, m_BlendType, dest_Bpp, src_Bpp);
+ break;
+ case 1+2+64:
+ _CompositeRow_Rgb2Rgb_Blend_NoClip_Transform(dest_scan, src_scan, width, m_BlendType, dest_Bpp, src_Bpp,
+ m_pCacheScanline, m_pIccTransform);
+ break;
+ case 1+2+8:
+ _CompositeRow_Rgb2Rgb_Blend_Clip(dest_scan, src_scan, width, m_BlendType, dest_Bpp, src_Bpp, clip_scan);
+ break;
+ case 1+2+8+64:
+ _CompositeRow_Rgb2Rgb_Blend_Clip_Transform(dest_scan, src_scan, width, m_BlendType, dest_Bpp, src_Bpp, clip_scan,
+ m_pCacheScanline, m_pIccTransform);
+ break;
+ case 1+2+4:
+ _CompositeRow_Rgb2Rgb_NoBlend_NoClip(dest_scan, src_scan, width, dest_Bpp, src_Bpp);
+ break;
+ case 1+2+4+64:
+ _CompositeRow_Rgb2Rgb_NoBlend_NoClip_Transform(dest_scan, src_scan, width, dest_Bpp, src_Bpp,
+ m_pCacheScanline, m_pIccTransform);
+ break;
+ case 1+2+4+8:
+ _CompositeRow_Rgb2Rgb_NoBlend_Clip(dest_scan, src_scan, width, dest_Bpp, src_Bpp, clip_scan);
+ break;
+ case 1+2+4+8+64:
+ _CompositeRow_Rgb2Rgb_NoBlend_Clip_Transform(dest_scan, src_scan, width, dest_Bpp, src_Bpp, clip_scan,
+ m_pCacheScanline, m_pIccTransform);
+ break;
+ }
+ }
+}
+void CFX_ScanlineCompositor::CompositePalBitmapLine(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_left, int width, FX_LPCBYTE clip_scan,
+ FX_LPCBYTE src_extra_alpha, FX_LPBYTE dst_extra_alpha)
+{
+ if (m_bRgbByteOrder) {
+ if (m_SrcFormat == FXDIB_1bppRgb) {
+ if (m_DestFormat == FXDIB_8bppRgb) {
+ return;
+ } else if(m_DestFormat == FXDIB_Argb) {
+ _CompositeRow_1bppRgb2Argb_NoBlend_RgbByteOrder(dest_scan, src_scan, src_left, width, m_pSrcPalette, clip_scan);
+ } else {
+ _CompositeRow_1bppRgb2Rgb_NoBlend_RgbByteOrder(dest_scan, src_scan, src_left, m_pSrcPalette, width, (m_DestFormat & 0xff) >> 3, clip_scan);
+ }
+ } else {
+ if (m_DestFormat == FXDIB_8bppRgb) {
+ return;
+ } else if (m_DestFormat == FXDIB_Argb) {
+ _CompositeRow_8bppRgb2Argb_NoBlend_RgbByteOrder(dest_scan, src_scan, width, m_pSrcPalette, clip_scan);
+ } else {
+ _CompositeRow_8bppRgb2Rgb_NoBlend_RgbByteOrder(dest_scan, src_scan, m_pSrcPalette, width, (m_DestFormat & 0xff) >> 3, clip_scan);
+ }
+ }
+ return;
+ }
+ if (m_DestFormat == FXDIB_8bppMask) {
+ _CompositeRow_Rgb2Mask(dest_scan, src_scan, width, clip_scan);
+ return;
+ } else if ((m_DestFormat & 0xff) == 8) {
+ if (m_Transparency & 8) {
+ if (m_DestFormat & 0x0200) {
+ _CompositeRow_1bppPal2Graya(dest_scan, src_scan, src_left, (FX_LPCBYTE)m_pSrcPalette, width, m_BlendType, clip_scan, dst_extra_alpha);
+ } else {
+ _CompositeRow_1bppPal2Gray(dest_scan, src_scan, src_left, (FX_LPCBYTE)m_pSrcPalette, width, m_BlendType, clip_scan);
+ }
+ } else {
+ if (m_DestFormat & 0x0200)
+ _CompositeRow_8bppPal2Graya(dest_scan, src_scan, (FX_LPCBYTE)m_pSrcPalette, width, m_BlendType, clip_scan,
+ dst_extra_alpha, src_extra_alpha);
+ else
+ _CompositeRow_8bppPal2Gray(dest_scan, src_scan, (FX_LPCBYTE)m_pSrcPalette, width, m_BlendType, clip_scan,
+ src_extra_alpha);
+ }
+ } else {
+ switch (m_Transparency) {
+ case 1+2:
+ _CompositeRow_8bppRgb2Argb_NoBlend(dest_scan, src_scan, width, m_pSrcPalette, clip_scan,
+ src_extra_alpha);
+ break;
+ case 1+2+8:
+ _CompositeRow_1bppRgb2Argb_NoBlend(dest_scan, src_scan, src_left, width, m_pSrcPalette, clip_scan);
+ break;
+ case 0:
+ _CompositeRow_8bppRgb2Rgb_NoBlend(dest_scan, src_scan, m_pSrcPalette, width, (m_DestFormat & 0xff) >> 3, clip_scan,
+ src_extra_alpha);
+ break;
+ case 0+8:
+ _CompositeRow_1bppRgb2Rgb_NoBlend(dest_scan, src_scan, src_left, m_pSrcPalette, width, (m_DestFormat & 0xff) >> 3, clip_scan);
+ break;
+ case 0+2:
+ _CompositeRow_8bppRgb2Rgb_NoBlend(dest_scan, src_scan, m_pSrcPalette, width, (m_DestFormat & 0xff) >> 3, clip_scan,
+ src_extra_alpha);
+ break;
+ case 0+2+8:
+ _CompositeRow_1bppRgb2Rgba_NoBlend(dest_scan, src_scan, src_left, width, m_pSrcPalette, clip_scan,
+ dst_extra_alpha);
+ break;
+ break;
+ }
+ }
+}
+void CFX_ScanlineCompositor::CompositeByteMaskLine(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, FX_LPCBYTE clip_scan,
+ FX_LPBYTE dst_extra_alpha)
+{
+ if (m_DestFormat == FXDIB_8bppMask) {
+ _CompositeRow_ByteMask2Mask(dest_scan, src_scan, m_MaskAlpha, width, clip_scan);
+ } else if ((m_DestFormat & 0xff) == 8) {
+ if (m_DestFormat & 0x0200) {
+ _CompositeRow_ByteMask2Graya(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, width, clip_scan, dst_extra_alpha);
+ } else {
+ _CompositeRow_ByteMask2Gray(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, width, clip_scan);
+ }
+ } else if (m_bRgbByteOrder) {
+ if (m_DestFormat == FXDIB_Argb)
+ _CompositeRow_ByteMask2Argb_RgbByteOrder(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, m_MaskGreen, m_MaskBlue,
+ width, m_BlendType, clip_scan);
+ else
+ _CompositeRow_ByteMask2Rgb_RgbByteOrder(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, m_MaskGreen, m_MaskBlue,
+ width, m_BlendType, (m_DestFormat & 0xff) >> 3, clip_scan);
+ return;
+ } else if (m_DestFormat == FXDIB_Argb)
+ _CompositeRow_ByteMask2Argb(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, m_MaskGreen, m_MaskBlue,
+ width, m_BlendType, clip_scan);
+ else if (m_DestFormat == FXDIB_Rgb || m_DestFormat == FXDIB_Rgb32)
+ _CompositeRow_ByteMask2Rgb(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, m_MaskGreen, m_MaskBlue,
+ width, m_BlendType, (m_DestFormat & 0xff) >> 3, clip_scan);
+ else if (m_DestFormat == FXDIB_Rgba)
+ _CompositeRow_ByteMask2Rgba(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, m_MaskGreen, m_MaskBlue,
+ width, m_BlendType, clip_scan, dst_extra_alpha);
+}
+void CFX_ScanlineCompositor::CompositeBitMaskLine(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_left, int width, FX_LPCBYTE clip_scan,
+ FX_LPBYTE dst_extra_alpha)
+{
+ if (m_DestFormat == FXDIB_8bppMask) {
+ _CompositeRow_BitMask2Mask(dest_scan, src_scan, m_MaskAlpha, src_left, width, clip_scan);
+ } else if ((m_DestFormat & 0xff) == 8) {
+ if (m_DestFormat & 0x0200)
+ _CompositeRow_BitMask2Graya(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, src_left, width, clip_scan,
+ dst_extra_alpha);
+ else {
+ _CompositeRow_BitMask2Gray(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, src_left, width, clip_scan);
+ }
+ } else if (m_bRgbByteOrder) {
+ if (m_DestFormat == FXDIB_Argb)
+ _CompositeRow_BitMask2Argb_RgbByteOrder(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, m_MaskGreen, m_MaskBlue,
+ src_left, width, m_BlendType, clip_scan);
+ else
+ _CompositeRow_BitMask2Rgb_RgbByteOrder(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, m_MaskGreen, m_MaskBlue,
+ src_left, width, m_BlendType, (m_DestFormat & 0xff) >> 3, clip_scan);
+ return;
+ } else if (m_DestFormat == FXDIB_Argb)
+ _CompositeRow_BitMask2Argb(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, m_MaskGreen, m_MaskBlue,
+ src_left, width, m_BlendType, clip_scan);
+ else if (m_DestFormat == FXDIB_Rgb || m_DestFormat == FXDIB_Rgb32)
+ _CompositeRow_BitMask2Rgb(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, m_MaskGreen, m_MaskBlue,
+ src_left, width, m_BlendType, (m_DestFormat & 0xff) >> 3, clip_scan);
+}
+FX_BOOL CFX_DIBitmap::CompositeBitmap(int dest_left, int dest_top, int width, int height,
+ const CFX_DIBSource* pSrcBitmap, int src_left, int src_top,
+ int blend_type, const CFX_ClipRgn* pClipRgn, FX_BOOL bRgbByteOrder, void* pIccTransform)
+{
+ if (m_pBuffer == NULL) {
+ return FALSE;
+ }
+ ASSERT(!pSrcBitmap->IsAlphaMask());
+ ASSERT(m_bpp >= 8);
+ if (pSrcBitmap->IsAlphaMask() || m_bpp < 8) {
+ return FALSE;
+ }
+ GetOverlapRect(dest_left, dest_top, width, height, pSrcBitmap->GetWidth(), pSrcBitmap->GetHeight(),
+ src_left, src_top, pClipRgn);
+ if (width == 0 || height == 0) {
+ return TRUE;
+ }
+ const CFX_DIBitmap* pClipMask = NULL;
+ FX_RECT clip_box;
+ if (pClipRgn && pClipRgn->GetType() != CFX_ClipRgn::RectI) {
+ ASSERT(pClipRgn->GetType() == CFX_ClipRgn::MaskF);
+ pClipMask = pClipRgn->GetMask();
+ clip_box = pClipRgn->GetBox();
+ }
+ CFX_ScanlineCompositor compositor;
+ if (!compositor.Init(GetFormat(), pSrcBitmap->GetFormat(), width, pSrcBitmap->GetPalette(), 0, blend_type,
+ pClipMask != NULL, bRgbByteOrder, 0, pIccTransform)) {
+ return FALSE;
+ }
+ int dest_Bpp = m_bpp / 8;
+ int src_Bpp = pSrcBitmap->GetBPP() / 8;
+ FX_BOOL bRgb = FALSE;
+ FX_BOOL bCmyk = FALSE;
+ if (src_Bpp > 1) {
+ if (pSrcBitmap->IsCmykImage()) {
+ bCmyk = TRUE;
+ } else {
+ bRgb = TRUE;
+ }
+ }
+ CFX_DIBitmap* pSrcAlphaMask = pSrcBitmap->m_pAlphaMask;
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = m_pBuffer + (dest_top + row) * m_Pitch + dest_left * dest_Bpp;
+ FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * src_Bpp;
+ FX_LPCBYTE src_scan_extra_alpha = pSrcAlphaMask ? pSrcAlphaMask->GetScanline(src_top + row) + src_left : NULL;
+ FX_LPBYTE dst_scan_extra_alpha = m_pAlphaMask ? (FX_LPBYTE)m_pAlphaMask->GetScanline(dest_top + row) + dest_left : NULL;
+ FX_LPCBYTE clip_scan = NULL;
+ if (pClipMask) {
+ clip_scan = pClipMask->m_pBuffer + (dest_top + row - clip_box.top) * pClipMask->m_Pitch + (dest_left - clip_box.left);
+ }
+ if (bRgb) {
+ compositor.CompositeRgbBitmapLine(dest_scan, src_scan, width, clip_scan, src_scan_extra_alpha, dst_scan_extra_alpha);
+ } else {
+ compositor.CompositePalBitmapLine(dest_scan, src_scan, src_left, width, clip_scan, src_scan_extra_alpha, dst_scan_extra_alpha);
+ }
+ }
+ return TRUE;
+}
+FX_BOOL CFX_DIBitmap::CompositeMask(int dest_left, int dest_top, int width, int height,
+ const CFX_DIBSource* pMask, FX_DWORD color, int src_left, int src_top,
+ int blend_type, const CFX_ClipRgn* pClipRgn, FX_BOOL bRgbByteOrder, int alpha_flag, void* pIccTransform)
+{
+ if (m_pBuffer == NULL) {
+ return FALSE;
+ }
+ ASSERT(pMask->IsAlphaMask());
+ ASSERT(m_bpp >= 8);
+ if (!pMask->IsAlphaMask() || m_bpp < 8) {
+ return FALSE;
+ }
+ GetOverlapRect(dest_left, dest_top, width, height, pMask->GetWidth(), pMask->GetHeight(), src_left, src_top, pClipRgn);
+ if (width == 0 || height == 0) {
+ return TRUE;
+ }
+ int src_alpha = (FX_BYTE)(alpha_flag >> 8) ? (alpha_flag & 0xff) : FXARGB_A(color);
+ if (src_alpha == 0) {
+ return TRUE;
+ }
+ const CFX_DIBitmap* pClipMask = NULL;
+ FX_RECT clip_box;
+ if (pClipRgn && pClipRgn->GetType() != CFX_ClipRgn::RectI) {
+ ASSERT(pClipRgn->GetType() == CFX_ClipRgn::MaskF);
+ pClipMask = pClipRgn->GetMask();
+ clip_box = pClipRgn->GetBox();
+ }
+ int src_bpp = pMask->GetBPP();
+ int Bpp = GetBPP() / 8;
+ CFX_ScanlineCompositor compositor;
+ if (!compositor.Init(GetFormat(), pMask->GetFormat(), width, NULL, color, blend_type, pClipMask != NULL, bRgbByteOrder, alpha_flag, pIccTransform)) {
+ return FALSE;
+ }
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = m_pBuffer + (dest_top + row) * m_Pitch + dest_left * Bpp;
+ FX_LPCBYTE src_scan = pMask->GetScanline(src_top + row);
+ FX_LPBYTE dst_scan_extra_alpha = m_pAlphaMask ? (FX_LPBYTE)m_pAlphaMask->GetScanline(dest_top + row) + dest_left : NULL;
+ FX_LPCBYTE clip_scan = NULL;
+ if (pClipMask) {
+ clip_scan = pClipMask->m_pBuffer + (dest_top + row - clip_box.top) * pClipMask->m_Pitch + (dest_left - clip_box.left);
+ }
+ if (src_bpp == 1) {
+ compositor.CompositeBitMaskLine(dest_scan, src_scan, src_left, width, clip_scan, dst_scan_extra_alpha);
+ } else {
+ compositor.CompositeByteMaskLine(dest_scan, src_scan + src_left, width, clip_scan, dst_scan_extra_alpha);
+ }
+ }
+ return TRUE;
+}
+FX_BOOL CFX_DIBitmap::CompositeRect(int left, int top, int width, int height, FX_DWORD color, int alpha_flag, void* pIccTransform)
+{
+ if (m_pBuffer == NULL) {
+ return FALSE;
+ }
+ int src_alpha = (alpha_flag >> 8) ? (alpha_flag & 0xff) : FXARGB_A(color);
+ if (src_alpha == 0) {
+ return TRUE;
+ }
+ FX_RECT rect(left, top, left + width, top + height);
+ rect.Intersect(0, 0, m_Width, m_Height);
+ if (rect.IsEmpty()) {
+ return TRUE;
+ }
+ width = rect.Width();
+ FX_DWORD dst_color;
+ if (alpha_flag >> 8) {
+ dst_color = FXCMYK_TODIB(color);
+ } else {
+ dst_color = FXARGB_TODIB(color);
+ }
+ FX_LPBYTE color_p = (FX_LPBYTE)&dst_color;
+ if (m_bpp == 8) {
+ FX_BYTE gray = 255;
+ if (!IsAlphaMask()) {
+ if (pIccTransform && CFX_GEModule::Get()->GetCodecModule() && CFX_GEModule::Get()->GetCodecModule()->GetIccModule()) {
+ ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ pIccModule->TranslateScanline(pIccTransform, &gray, color_p, 1);
+ } else {
+ if (alpha_flag >> 8) {
+ FX_BYTE r, g, b;
+ AdobeCMYK_to_sRGB1(color_p[0], color_p[1], color_p[2], color_p[3],
+ r, g, b);
+ gray = FXRGB2GRAY(r, g, b);
+ } else {
+ gray = (FX_BYTE)FXRGB2GRAY((int)color_p[2], color_p[1], color_p[0]);
+ }
+ }
+ if (IsCmykImage()) {
+ gray = ~gray;
+ }
+ }
+ for (int row = rect.top; row < rect.bottom; row ++) {
+ FX_LPBYTE dest_scan = m_pBuffer + row * m_Pitch + rect.left;
+ if (src_alpha == 255) {
+ FXSYS_memset8(dest_scan, gray, width);
+ } else
+ for (int col = 0; col < width; col ++) {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, src_alpha);
+ dest_scan ++;
+ }
+ }
+ return TRUE;
+ } else if (m_bpp == 1) {
+ ASSERT(!IsCmykImage() && (FX_BYTE)(alpha_flag >> 8) == 0);
+ int left_shift = rect.left % 8;
+ int right_shift = rect.right % 8;
+ int width = rect.right / 8 - rect.left / 8;
+ int index = 0;
+ if (m_pPalette == NULL) {
+ index = ((FX_BYTE)color == 0xff) ? 1 : 0;
+ } else {
+ for (int i = 0; i < 2; i ++)
+ if (m_pPalette[i] == color) {
+ index = i;
+ }
+ }
+ for (int row = rect.top; row < rect.bottom; row ++) {
+ FX_BYTE* dest_scan_top = (FX_BYTE*)GetScanline(row) + rect.left / 8;
+ FX_BYTE* dest_scan_top_r = (FX_BYTE*)GetScanline(row) + rect.right / 8;
+ FX_BYTE left_flag = *dest_scan_top & (255 << (8 - left_shift));
+ FX_BYTE right_flag = *dest_scan_top_r & (255 >> right_shift);
+ if (width) {
+ FXSYS_memset8(dest_scan_top + 1, index ? 255 : 0, width - 1);
+ if (!index) {
+ *dest_scan_top &= left_flag;
+ *dest_scan_top_r &= right_flag;
+ } else {
+ *dest_scan_top |= ~left_flag;
+ *dest_scan_top_r |= ~right_flag;
+ }
+ } else {
+ if (!index) {
+ *dest_scan_top &= left_flag | right_flag;
+ } else {
+ *dest_scan_top |= ~(left_flag | right_flag);
+ }
+ }
+ }
+ return TRUE;
+ }
+ ASSERT(m_bpp >= 24);
+ if (m_bpp < 24) {
+ return FALSE;
+ }
+ if (pIccTransform && CFX_GEModule::Get()->GetCodecModule()) {
+ ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ pIccModule->TranslateScanline(pIccTransform, color_p, color_p, 1);
+ } else {
+ if (alpha_flag >> 8 && !IsCmykImage())
+ AdobeCMYK_to_sRGB1(FXSYS_GetCValue(color), FXSYS_GetMValue(color), FXSYS_GetYValue(color), FXSYS_GetKValue(color),
+ color_p[2], color_p[1], color_p[0]);
+ else if (!(alpha_flag >> 8) && IsCmykImage()) {
+ return FALSE;
+ }
+ }
+ if(!IsCmykImage()) {
+ color_p[3] = (FX_BYTE)src_alpha;
+ }
+ int Bpp = m_bpp / 8;
+ FX_BOOL bAlpha = HasAlpha();
+ FX_BOOL bArgb = GetFormat() == FXDIB_Argb ? TRUE : FALSE;
+ if (src_alpha == 255) {
+ for (int row = rect.top; row < rect.bottom; row ++) {
+ FX_LPBYTE dest_scan = m_pBuffer + row * m_Pitch + rect.left * Bpp;
+ FX_LPBYTE dest_scan_alpha = m_pAlphaMask ? (FX_LPBYTE)m_pAlphaMask->GetScanline(row) + rect.left : NULL;
+ if (dest_scan_alpha) {
+ FXSYS_memset8(dest_scan_alpha, 0xff, width);
+ }
+ if (Bpp == 4) {
+ FX_DWORD* scan = (FX_DWORD*)dest_scan;
+ for (int col = 0; col < width; col ++) {
+ *scan ++ = dst_color;
+ }
+ } else {
+ for (int col = 0; col < width; col ++) {
+ *dest_scan ++ = color_p[0];
+ *dest_scan ++ = color_p[1];
+ *dest_scan ++ = color_p[2];
+ }
+ }
+ }
+ return TRUE;
+ }
+ for (int row = rect.top; row < rect.bottom; row ++) {
+ FX_LPBYTE dest_scan = m_pBuffer + row * m_Pitch + rect.left * Bpp;
+ if (bAlpha) {
+ if (bArgb) {
+ for (int col = 0; col < width; col ++) {
+ FX_BYTE back_alpha = dest_scan[3];
+ if (back_alpha == 0) {
+ FXARGB_SETDIB(dest_scan, FXARGB_MAKE(src_alpha, color_p[2], color_p[1], color_p[0]));
+ dest_scan += 4;
+ continue;
+ }
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, color_p[0], alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, color_p[1], alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, color_p[2], alpha_ratio);
+ dest_scan ++;
+ *dest_scan++ = dest_alpha;
+ }
+ } else {
+ FX_LPBYTE dest_scan_alpha = (FX_LPBYTE)m_pAlphaMask->GetScanline(row) + rect.left;
+ for (int col = 0; col < width; col ++) {
+ FX_BYTE back_alpha = *dest_scan_alpha;
+ if (back_alpha == 0) {
+ *dest_scan_alpha++ = src_alpha;
+ FXSYS_memcpy32(dest_scan, color_p, Bpp);
+ dest_scan += Bpp;
+ continue;
+ }
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ *dest_scan_alpha ++ = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ for(int comps = 0; comps < Bpp; comps ++) {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, color_p[comps], alpha_ratio);
+ dest_scan ++;
+ }
+ }
+ }
+ } else {
+ for (int col = 0; col < width; col ++) {
+ for(int comps = 0; comps < Bpp; comps ++) {
+ if (comps == 3) {
+ *dest_scan ++ = 255;
+ continue;
+ }
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, color_p[comps], src_alpha);
+ dest_scan ++;
+ }
+ }
+ }
+ }
+ return TRUE;
+}
+CFX_BitmapComposer::CFX_BitmapComposer()
+{
+ m_pScanlineV = NULL;
+ m_pScanlineAlphaV = NULL;
+ m_pClipScanV = NULL;
+ m_pAddClipScan = NULL;
+ m_bRgbByteOrder = FALSE;
+ m_BlendType = FXDIB_BLEND_NORMAL;
+}
+CFX_BitmapComposer::~CFX_BitmapComposer()
+{
+ if (m_pScanlineV) {
+ FX_Free(m_pScanlineV);
+ }
+ if (m_pScanlineAlphaV) {
+ FX_Free(m_pScanlineAlphaV);
+ }
+ if (m_pClipScanV) {
+ FX_Free(m_pClipScanV);
+ }
+ if (m_pAddClipScan) {
+ FX_Free(m_pAddClipScan);
+ }
+}
+void CFX_BitmapComposer::Compose(CFX_DIBitmap* pDest, const CFX_ClipRgn* pClipRgn, int bitmap_alpha,
+ FX_DWORD mask_color, FX_RECT& dest_rect, FX_BOOL bVertical,
+ FX_BOOL bFlipX, FX_BOOL bFlipY, FX_BOOL bRgbByteOrder,
+ int alpha_flag, void* pIccTransform, int blend_type)
+{
+ m_pBitmap = pDest;
+ m_pClipRgn = pClipRgn;
+ m_DestLeft = dest_rect.left;
+ m_DestTop = dest_rect.top;
+ m_DestWidth = dest_rect.Width();
+ m_DestHeight = dest_rect.Height();
+ m_BitmapAlpha = bitmap_alpha;
+ m_MaskColor = mask_color;
+ m_pClipMask = NULL;
+ if (pClipRgn && pClipRgn->GetType() != CFX_ClipRgn::RectI) {
+ m_pClipMask = pClipRgn->GetMask();
+ }
+ m_bVertical = bVertical;
+ m_bFlipX = bFlipX;
+ m_bFlipY = bFlipY;
+ m_AlphaFlag = alpha_flag;
+ m_pIccTransform = pIccTransform;
+ m_bRgbByteOrder = bRgbByteOrder;
+ m_BlendType = blend_type;
+}
+FX_BOOL CFX_BitmapComposer::SetInfo(int width, int height, FXDIB_Format src_format, FX_DWORD* pSrcPalette)
+{
+ m_SrcFormat = src_format;
+ if (!m_Compositor.Init(m_pBitmap->GetFormat(), src_format, width, pSrcPalette, m_MaskColor, FXDIB_BLEND_NORMAL,
+ m_pClipMask != NULL || (m_BitmapAlpha < 255), m_bRgbByteOrder, m_AlphaFlag, m_pIccTransform)) {
+ return FALSE;
+ }
+ if (m_bVertical) {
+ m_pScanlineV = FX_Alloc(FX_BYTE, m_pBitmap->GetBPP() / 8 * width + 4);
+ if (!m_pScanlineV) {
+ return FALSE;
+ }
+ m_pClipScanV = FX_Alloc(FX_BYTE, m_pBitmap->GetHeight());
+ if (!m_pClipScanV) {
+ return FALSE;
+ }
+ if (m_pBitmap->m_pAlphaMask) {
+ m_pScanlineAlphaV = FX_Alloc(FX_BYTE, width + 4);
+ if (!m_pScanlineAlphaV) {
+ return FALSE;
+ }
+ }
+ }
+ if (m_BitmapAlpha < 255) {
+ m_pAddClipScan = FX_Alloc(FX_BYTE, m_bVertical ? m_pBitmap->GetHeight() : m_pBitmap->GetWidth());
+ if (!m_pAddClipScan) {
+ return FALSE;
+ }
+ }
+ return TRUE;
+}
+void CFX_BitmapComposer::DoCompose(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int dest_width, FX_LPCBYTE clip_scan,
+ FX_LPCBYTE src_extra_alpha, FX_LPBYTE dst_extra_alpha)
+{
+ if (m_BitmapAlpha < 255) {
+ if (clip_scan) {
+ for (int i = 0; i < dest_width; i ++) {
+ m_pAddClipScan[i] = clip_scan[i] * m_BitmapAlpha / 255;
+ }
+ } else {
+ FXSYS_memset8(m_pAddClipScan, m_BitmapAlpha, dest_width);
+ }
+ clip_scan = m_pAddClipScan;
+ }
+ if (m_SrcFormat == FXDIB_8bppMask) {
+ m_Compositor.CompositeByteMaskLine(dest_scan, src_scan, dest_width, clip_scan, dst_extra_alpha);
+ } else if ((m_SrcFormat & 0xff) == 8) {
+ m_Compositor.CompositePalBitmapLine(dest_scan, src_scan, 0, dest_width, clip_scan, src_extra_alpha, dst_extra_alpha);
+ } else {
+ m_Compositor.CompositeRgbBitmapLine(dest_scan, src_scan, dest_width, clip_scan, src_extra_alpha, dst_extra_alpha);
+ }
+}
+void CFX_BitmapComposer::ComposeScanline(int line, FX_LPCBYTE scanline, FX_LPCBYTE scan_extra_alpha)
+{
+ if (m_bVertical) {
+ ComposeScanlineV(line, scanline, scan_extra_alpha);
+ return;
+ }
+ FX_LPCBYTE clip_scan = NULL;
+ if (m_pClipMask)
+ clip_scan = m_pClipMask->GetBuffer() + (m_DestTop + line - m_pClipRgn->GetBox().top) *
+ m_pClipMask->GetPitch() + (m_DestLeft - m_pClipRgn->GetBox().left);
+ FX_LPBYTE dest_scan = (FX_LPBYTE)m_pBitmap->GetScanline(line + m_DestTop) +
+ m_DestLeft * m_pBitmap->GetBPP() / 8;
+ FX_LPBYTE dest_alpha_scan = m_pBitmap->m_pAlphaMask ?
+ (FX_LPBYTE)m_pBitmap->m_pAlphaMask->GetScanline(line + m_DestTop) + m_DestLeft : NULL;
+ DoCompose(dest_scan, scanline, m_DestWidth, clip_scan, scan_extra_alpha, dest_alpha_scan);
+}
+void CFX_BitmapComposer::ComposeScanlineV(int line, FX_LPCBYTE scanline, FX_LPCBYTE scan_extra_alpha)
+{
+ int i;
+ int Bpp = m_pBitmap->GetBPP() / 8;
+ int dest_pitch = m_pBitmap->GetPitch();
+ int dest_alpha_pitch = m_pBitmap->m_pAlphaMask ? m_pBitmap->m_pAlphaMask->GetPitch() : 0;
+ int dest_x = m_DestLeft + (m_bFlipX ? (m_DestWidth - line - 1) : line);
+ FX_LPBYTE dest_buf = m_pBitmap->GetBuffer() + dest_x * Bpp + m_DestTop * dest_pitch;
+ FX_LPBYTE dest_alpha_buf = m_pBitmap->m_pAlphaMask ?
+ m_pBitmap->m_pAlphaMask->GetBuffer() + dest_x + m_DestTop * dest_alpha_pitch : NULL;
+ if (m_bFlipY) {
+ dest_buf += dest_pitch * (m_DestHeight - 1);
+ dest_alpha_buf += dest_alpha_pitch * (m_DestHeight - 1);
+ }
+ int y_step = dest_pitch;
+ int y_alpha_step = dest_alpha_pitch;
+ if (m_bFlipY) {
+ y_step = -y_step;
+ y_alpha_step = -y_alpha_step;
+ }
+ FX_LPBYTE src_scan = m_pScanlineV;
+ FX_LPBYTE dest_scan = dest_buf;
+ for (i = 0; i < m_DestHeight; i ++) {
+ for (int j = 0; j < Bpp; j ++) {
+ *src_scan++ = dest_scan[j];
+ }
+ dest_scan += y_step;
+ }
+ FX_LPBYTE src_alpha_scan = m_pScanlineAlphaV;
+ FX_LPBYTE dest_alpha_scan = dest_alpha_buf;
+ if (dest_alpha_scan) {
+ for (i = 0; i < m_DestHeight; i ++) {
+ *src_alpha_scan++ = *dest_alpha_scan;
+ dest_alpha_scan += y_alpha_step;
+ }
+ }
+ FX_LPBYTE clip_scan = NULL;
+ if (m_pClipMask) {
+ clip_scan = m_pClipScanV;
+ int clip_pitch = m_pClipMask->GetPitch();
+ FX_LPCBYTE src_clip = m_pClipMask->GetBuffer() + (m_DestTop - m_pClipRgn->GetBox().top) *
+ clip_pitch + (dest_x - m_pClipRgn->GetBox().left);
+ if (m_bFlipY) {
+ src_clip += clip_pitch * (m_DestHeight - 1);
+ clip_pitch = -clip_pitch;
+ }
+ for (i = 0; i < m_DestHeight; i ++) {
+ clip_scan[i] = *src_clip;
+ src_clip += clip_pitch;
+ }
+ }
+ DoCompose(m_pScanlineV, scanline, m_DestHeight, clip_scan, scan_extra_alpha, m_pScanlineAlphaV);
+ src_scan = m_pScanlineV;
+ dest_scan = dest_buf;
+ for (i = 0; i < m_DestHeight; i ++) {
+ for (int j = 0; j < Bpp; j ++) {
+ dest_scan[j] = *src_scan++;
+ }
+ dest_scan += y_step;
+ }
+ src_alpha_scan = m_pScanlineAlphaV;
+ dest_alpha_scan = dest_alpha_buf;
+ if (dest_alpha_scan) {
+ for (i = 0; i < m_DestHeight; i ++) {
+ *dest_alpha_scan = *src_alpha_scan++;
+ dest_alpha_scan += y_alpha_step;
+ }
+ }
+}
diff --git a/core/src/fxge/dib/fx_dib_convert.cpp b/core/src/fxge/dib/fx_dib_convert.cpp
index fe4a7bfd9a..0120721e35 100644
--- a/core/src/fxge/dib/fx_dib_convert.cpp
+++ b/core/src/fxge/dib/fx_dib_convert.cpp
@@ -1,1090 +1,1090 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../../include/fxge/fx_dib.h"
-#include "../../../include/fxge/fx_ge.h"
-#include "../../../include/fxcodec/fx_codec.h"
-const FX_DWORD g_dwWinPalette[256] = {
- 0xff000000, 0xff800000, 0xff008000, 0xff808000, 0xff000080, 0xff800080,
- 0xff008080, 0xff808080, 0xffC0DCC0, 0xffA6CAF0, 0xff2A3FAA, 0xff2A3FFF,
- 0xff2A5F00, 0xff2A5F55, 0xff2A5FAA, 0xff2A5FFF, 0xff2A7F00, 0xff2A7F55,
- 0xff2A7FAA, 0xff2A7FFF, 0xff2A9F00, 0xff2A9F55, 0xff2A9FAA, 0xff2A9FFF,
- 0xff2ABF00, 0xff2ABF55, 0xff2ABFAA, 0xff2ABFFF, 0xff2ADF00, 0xff2ADF55,
- 0xff2ADFAA, 0xff2ADFFF, 0xff2AFF00, 0xff2AFF55, 0xff2AFFAA, 0xff2AFFFF,
- 0xff550000, 0xff550055, 0xff5500AA, 0xff5500FF, 0xff551F00, 0xff551F55,
- 0xff551FAA, 0xff551FFF, 0xff553F00, 0xff553F55, 0xff553FAA, 0xff553FFF,
- 0xff555F00, 0xff555F55, 0xff555FAA, 0xff555FFF, 0xff557F00, 0xff557F55,
- 0xff557FAA, 0xff557FFF, 0xff559F00, 0xff559F55, 0xff559FAA, 0xff559FFF,
- 0xff55BF00, 0xff55BF55, 0xff55BFAA, 0xff55BFFF, 0xff55DF00, 0xff55DF55,
- 0xff55DFAA, 0xff55DFFF, 0xff55FF00, 0xff55FF55, 0xff55FFAA, 0xff55FFFF,
- 0xff7F0000, 0xff7F0055, 0xff7F00AA, 0xff7F00FF, 0xff7F1F00, 0xff7F1F55,
- 0xff7F1FAA, 0xff7F1FFF, 0xff7F3F00, 0xff7F3F55, 0xff7F3FAA, 0xff7F3FFF,
- 0xff7F5F00, 0xff7F5F55, 0xff7F5FAA, 0xff7F5FFF, 0xff7F7F00, 0xff7F7F55,
- 0xff7F7FAA, 0xff7F7FFF, 0xff7F9F00, 0xff7F9F55, 0xff7F9FAA, 0xff7F9FFF,
- 0xff7FBF00, 0xff7FBF55, 0xff7FBFAA, 0xff7FBFFF, 0xff7FDF00, 0xff7FDF55,
- 0xff7FDFAA, 0xff7FDFFF, 0xff00FF7F, 0xff7FFF55, 0xff7FFFAA, 0xff7FFFFF,
- 0xffAA0000, 0xffAA0055, 0xffAA00AA, 0xffAA00FF, 0xffAA1F00, 0xffAA1F55,
- 0xffAA1FAA, 0xffAA1FFF, 0xffAA3F00, 0xffAA3F55, 0xffAA3FAA, 0xffAA3FFF,
- 0xffAA5F00, 0xffAA5F55, 0xffAA5FAA, 0xffAA5FFF, 0xffAA7F00, 0xffAA7F55,
- 0xffAA7FAA, 0xffAA7FFF, 0xffAA9F00, 0xffAA9F55, 0xffAA9FAA, 0xffAA9FFF,
- 0xffAABF00, 0xffAABF55, 0xffAABFAA, 0xffAABFFF, 0xffAADF00, 0xffAADF55,
- 0xffAADFAA, 0xffAADFFF, 0xffAAFF00, 0xffAAFF55, 0xffAAFFAA, 0xffAAFFFF,
- 0xffD40000, 0xffD40055, 0xffD400AA, 0xffD400FF, 0xffD41F00, 0xffD41F55,
- 0xffD41FAA, 0xffD41FFF, 0xffD43F00, 0xffD43F55, 0xffD43FAA, 0xffD43FFF,
- 0xffD45F00, 0xffD45F55, 0xffD45FAA, 0xffD45FFF, 0xffD47F00, 0xffD47F55,
- 0xffD47FAA, 0xffD4F7FF, 0xffD49F00, 0xffD49F55, 0xffD49FAA, 0xffD49FFF,
- 0xffD4BF00, 0xffD4BF55, 0xffD4BFAA, 0xffD4BFFF, 0xffD4DF00, 0xffD4DF55,
- 0xffD4DFAA, 0xffD4DFFF, 0xffD4FF00, 0xffD4FF55, 0xffD4FFAA, 0xffD4FFFF,
- 0xffFF0055, 0xffFF00AA, 0xffFF1F00, 0xffFF1F55, 0xffFF1FAA, 0xffFF1FFF,
- 0xffFF3F00, 0xffFF3F55, 0xffFF3FAA, 0xffFF3FFF, 0xffFF5F00, 0xffFF5F55,
- 0xffFF5FAA, 0xffFF5FFF, 0xffFF7F00, 0xffFF7F55, 0xffFF7FAA, 0xffFF7FFF,
- 0xffFF9F00, 0xffFF9F55, 0xffFF9FAA, 0xffFF9FFF, 0xffFFBF00, 0xffFFBF55,
- 0xffFFBFAA, 0xffFFBFFF, 0xffFFDF00, 0xffFFDF55, 0xffFFDFAA, 0xffFFDFFF,
- 0xffFFFF55, 0xffFFFFAA, 0xffCCCCFF, 0xffFFCCFF, 0xff33FFFF, 0xff66FFFF,
- 0xff99FFFF, 0xffCCFFFF, 0xff007F00, 0xff007F55, 0xff007FAA, 0xff007FFF,
- 0xff009F00, 0xff009F55, 0xff009FAA, 0xff009FFF, 0xff00BF00, 0xff00BF55,
- 0xff00BFAA, 0xff00BFFF, 0xff00DF00, 0xff00DF55, 0xff00DFAA, 0xff00DFFF,
- 0xff00FF55, 0xff00FFAA, 0xff2A0000, 0xff2A0055, 0xff2A00AA, 0xff2A00FF,
- 0xff2A1F00, 0xff2A1F55, 0xff2A1FAA, 0xff2A1FFF, 0xff2A3F00, 0xff2A3F55,
- 0xffFFFBF0, 0xffA0A0A4, 0xff808080, 0xffFF0000, 0xff00FF00, 0xffFF0000,
- 0xff0000FF, 0xffFF00FF, 0xff00FFFF, 0xffFFFFFF
-};
-const FX_DWORD g_dwMacPalette[256] = {
- 0xffFFFFFF, 0xffFFFFCC, 0xffFFFF99, 0xffFFFF66, 0xffFFFF33, 0xffFFFF00,
- 0xffFFCCFF, 0xffFFCCCC, 0xffFFCC99, 0xffFFCC66, 0xffFFCC33, 0xffFFCC00,
- 0xffFF99FF, 0xffFF99CC, 0xffFF9999, 0xffFF9966, 0xffFF9933, 0xffFF9900,
- 0xffFF66FF, 0xffFF66CC, 0xffFF6699, 0xffFF6666, 0xffFF6633, 0xffFF6600,
- 0xffFF33FF, 0xffFF33CC, 0xffFF3399, 0xffFF3366, 0xffFF3333, 0xffFF3300,
- 0xffFF00FF, 0xffFF00CC, 0xffFF0099, 0xffFF0066, 0xffFF0033, 0xffFF0000,
- 0xffCCFFFF, 0xffCCFFCC, 0xffCCFF99, 0xffCCFF66, 0xffCCFF33, 0xffCCFF00,
- 0xffCCCCFF, 0xffCCCCCC, 0xffCCCC99, 0xffCCCC66, 0xffCCCC33, 0xffCCCC00,
- 0xffCC99FF, 0xffCC99CC, 0xffCC9999, 0xffCC9966, 0xffCC9933, 0xffCC9900,
- 0xffCC66FF, 0xffCC66CC, 0xffCC6699, 0xffCC6666, 0xffCC6633, 0xffCC6600,
- 0xffCC33FF, 0xffCC33CC, 0xffCC3399, 0xffCC3366, 0xffCC3333, 0xffCC3300,
- 0xffCC00FF, 0xffCC00CC, 0xffCC0099, 0xffCC0066, 0xffCC0033, 0xffCC0000,
- 0xff99FFFF, 0xff99FFCC, 0xff99FF99, 0xff99FF66, 0xff99FF33, 0xff99FF00,
- 0xff99CCFF, 0xff99CCCC, 0xff99CC99, 0xff99CC66, 0xff99CC33, 0xff99CC00,
- 0xff9999FF, 0xff9999CC, 0xff999999, 0xff999966, 0xff999933, 0xff999900,
- 0xff9966FF, 0xff9966CC, 0xff996699, 0xff996666, 0xff996633, 0xff996600,
- 0xff9933FF, 0xff9933CC, 0xff993399, 0xff993366, 0xff993333, 0xff993300,
- 0xff9900FF, 0xff9900CC, 0xff990099, 0xff990066, 0xff990033, 0xff990000,
- 0xff66FFFF, 0xff66FFCC, 0xff66FF99, 0xff66FF66, 0xff66FF33, 0xff66FF00,
- 0xff66CCFF, 0xff66CCCC, 0xff66CC99, 0xff66CC66, 0xff66CC33, 0xff66CC00,
- 0xff6699FF, 0xff6699CC, 0xff669999, 0xff669966, 0xff669933, 0xff669900,
- 0xff6666FF, 0xff6666CC, 0xff666699, 0xff666666, 0xff666633, 0xff666600,
- 0xff6633FF, 0xff6633CC, 0xff663399, 0xff663366, 0xff663333, 0xff663300,
- 0xff6600FF, 0xff6600CC, 0xff660099, 0xff660066, 0xff660033, 0xff660000,
- 0xff33FFFF, 0xff33FFCC, 0xff33FF99, 0xff33FF66, 0xff33FF33, 0xff33FF00,
- 0xff33CCFF, 0xff33CCCC, 0xff33CC99, 0xff33CC66, 0xff33CC33, 0xff33CC00,
- 0xff3399FF, 0xff3399CC, 0xff339999, 0xff339966, 0xff339933, 0xff339900,
- 0xff3366FF, 0xff3366CC, 0xff336699, 0xff336666, 0xff336633, 0xff336600,
- 0xff3333FF, 0xff3333CC, 0xff333399, 0xff333366, 0xff333333, 0xff333300,
- 0xff3300FF, 0xff3300CC, 0xff330099, 0xff330066, 0xff330033, 0xff330000,
- 0xff00FFFF, 0xff00FFCC, 0xff00FF99, 0xff00FF66, 0xff00FF33, 0xff00FF00,
- 0xff00CCFF, 0xff00CCCC, 0xff00CC99, 0xff00CC66, 0xff00CC33, 0xff00CC00,
- 0xff0099FF, 0xff0099CC, 0xff009999, 0xff009966, 0xff009933, 0xff009900,
- 0xff0066FF, 0xff0066CC, 0xff006699, 0xff006666, 0xff006633, 0xff006600,
- 0xff0033FF, 0xff0033CC, 0xff003399, 0xff003366, 0xff003333, 0xff003300,
- 0xff0000FF, 0xff0000CC, 0xff000099, 0xff000066, 0xff000033,
- 0xffEE0000, 0xffDD0000, 0xffBB0000, 0xffAA0000, 0xff880000, 0xff770000,
- 0xff550000, 0xff440000, 0xff220000, 0xff110000, 0xff00EE00, 0xff00DD00,
- 0xff00BB00, 0xff00AA00, 0xff008800, 0xff007700, 0xff005500, 0xff004400,
- 0xff002200, 0xff001100, 0xff0000EE, 0xff0000DD, 0xff0000BB, 0xff0000AA,
- 0xff000088, 0xff000077, 0xff000055, 0xff000044, 0xff000022, 0xff000011,
- 0xffEEEEEE, 0xffDDDDDD, 0xffBBBBBB, 0xffAAAAAA, 0xff888888, 0xff777777,
- 0xff555555, 0xff444444, 0xff222222, 0xff111111, 0xff000000
-};
-class CFX_Palette : public CFX_Object
-{
-public:
- CFX_Palette();
- ~CFX_Palette();
-public:
- FX_BOOL BuildPalette(const CFX_DIBSource* pBitmap, int dwPaletteType);
- FX_DWORD* GetPalette() const
- {
- return m_pPalette;
- }
-
- FX_DWORD* GetColorLut()const
- {
- return m_cLut;
- }
- FX_DWORD* GetAmountLut()const
- {
- return m_aLut;
- }
- FX_INT32 Getlut()const
- {
- return m_lut;
- }
-protected:
- FX_DWORD* m_pPalette;
- FX_DWORD* m_cLut;
- FX_DWORD* m_aLut;
- int m_lut;
-};
-int _Partition(FX_DWORD* alut, FX_DWORD* clut, int l, int r)
-{
- FX_DWORD p_a = alut[l];
- FX_DWORD p_c = clut[l];
- while(l < r) {
- while(l < r && alut[r] >= p_a) {
- r--;
- }
- if (l < r) {
- alut[l] = alut[r];
- clut[l++] = clut[r];
- }
- while(l < r && alut[l] <= p_a) {
- l++;
- }
- if (l < r) {
- alut[r] = alut[l];
- clut[r--] = clut[l];
- }
- }
- alut[l] = p_a;
- clut[l] = p_c;
- return l;
-}
-void _Qsort(FX_DWORD* alut, FX_DWORD* clut, int l, int r)
-{
- if(l < r) {
- int pI = _Partition(alut, clut, l, r);
- _Qsort(alut, clut, l, pI - 1);
- _Qsort(alut, clut, pI + 1, r);
- }
-}
-void _ColorDecode(FX_DWORD pal_v, FX_BYTE& r, FX_BYTE& g, FX_BYTE& b)
-{
- r = (FX_BYTE)((pal_v & 0xf00) >> 4);
- g = (FX_BYTE)(pal_v & 0x0f0);
- b = (FX_BYTE)((pal_v & 0x00f) << 4);
-}
-void _Obtain_Pal(FX_DWORD* aLut, FX_DWORD*cLut, FX_DWORD* dest_pal, int pal_type, FX_DWORD* win_mac_pal, FX_DWORD lut)
-{
- int row, col;
- FX_DWORD lut_1 = lut - 1;
- if (pal_type == FXDIB_PALETTE_LOC) {
- for (row = 0; row < 256; row++) {
- int lut_offset = lut_1 - row;
- if (lut_offset < 0) {
- lut_offset += 256;
- }
- FX_DWORD color = cLut[lut_offset];
- FX_BYTE r, g, b;
- _ColorDecode(color, r, g, b);
- dest_pal[row] = ((FX_DWORD)r << 16) | ((FX_DWORD)g << 8) | b | 0xff000000;
- aLut[lut_offset] = row;
- }
- } else {
- for (row = 0; row < 256; row++) {
- int lut_offset = lut_1 - row;
- if (lut_offset < 0) {
- lut_offset += 256;
- }
- FX_BYTE r, g, b;
- _ColorDecode(cLut[lut_offset], r, g, b);
- int error, min_error = 1000000;
- int c_index = 0;
- for (col = 0; col < 256; col++) {
- FX_DWORD p_color = win_mac_pal[col];
- int d_r = r - (FX_BYTE)(p_color >> 16);
- int d_g = g - (FX_BYTE)(p_color >> 8);
- int d_b = b - (FX_BYTE)p_color;
- error = d_r * d_r + d_g * d_g + d_b * d_b;
- if (error < min_error) {
- min_error = error;
- c_index = col;
- }
- }
- dest_pal[row] = win_mac_pal[c_index];
- aLut[lut_offset] = row;
- }
- }
-}
-CFX_Palette::CFX_Palette()
-{
- m_pPalette = NULL;
- m_cLut = NULL;
- m_aLut = NULL;
- m_lut = 0;
-}
-CFX_Palette::~CFX_Palette()
-{
- if (m_pPalette) {
- FX_Free(m_pPalette);
- }
- if (m_cLut) {
- FX_Free(m_cLut);
- }
- if (m_aLut) {
- FX_Free(m_aLut);
- }
- m_lut = 0;
-}
-FX_BOOL CFX_Palette::BuildPalette(const CFX_DIBSource* pBitmap, int pal_type)
-{
- if (pBitmap == NULL) {
- return FALSE;
- }
- if (m_pPalette != NULL) {
- FX_Free(m_pPalette);
- }
- m_pPalette = FX_Alloc(FX_DWORD, 256);
- if (!m_pPalette) {
- return FALSE;
- }
- FXSYS_memset32(m_pPalette, 0, sizeof(FX_DWORD) * 256);
- int bpp = pBitmap->GetBPP() / 8;
- int width = pBitmap->GetWidth();
- int height = pBitmap->GetHeight();
- if (m_cLut) {
- FX_Free(m_cLut);
- m_cLut = NULL;
- }
- if (m_aLut) {
- FX_Free(m_aLut);
- m_aLut = NULL;
- }
- m_cLut = FX_Alloc(FX_DWORD, 4096);
- if (!m_cLut) {
- return FALSE;
- }
- m_aLut = FX_Alloc(FX_DWORD, 4096);
- if (!m_aLut) {
- return FALSE;
- }
- FXSYS_memset32(m_aLut, 0, sizeof(FX_DWORD) * 4096);
- FXSYS_memset32(m_cLut, 0, sizeof(FX_DWORD) * 4096);
- int row, col;
- m_lut = 0;
- for (row = 0; row < height; row++) {
- FX_BYTE* scan_line = (FX_BYTE*)pBitmap->GetScanline(row);
- for (col = 0; col < width; col++) {
- FX_BYTE* src_port = scan_line + col * bpp;
- FX_DWORD b = src_port[0] & 0xf0;
- FX_DWORD g = src_port[1] & 0xf0;
- FX_DWORD r = src_port[2] & 0xf0;
- FX_DWORD index = (r << 4) + g + (b >> 4);
- m_aLut[index]++;
- }
- }
- for (row = 0; row < 4096; row++) {
- if (m_aLut[row] != 0) {
- m_aLut[m_lut] = m_aLut[row];
- m_cLut[m_lut] = row;
- m_lut++;
- }
- }
- _Qsort(m_aLut, m_cLut, 0, m_lut - 1);
- FX_DWORD* win_mac_pal = NULL;
- if (pal_type == FXDIB_PALETTE_WIN) {
- win_mac_pal = (FX_DWORD*)g_dwWinPalette;
- } else if (pal_type == FXDIB_PALETTE_MAC) {
- win_mac_pal = (FX_DWORD*)g_dwMacPalette;
- }
- _Obtain_Pal(m_aLut, m_cLut, m_pPalette, pal_type, win_mac_pal, m_lut);
- return TRUE;
-}
-FX_BOOL _ConvertBuffer_1bppMask2Gray(FX_LPBYTE dest_buf, int dest_pitch, int width, int height,
- const CFX_DIBSource* pSrcBitmap, int src_left, int src_top)
-{
- FX_BYTE set_gray, reset_gray;
- set_gray = 0xff;
- reset_gray = 0x00;
- for (int row = 0; row < height; row ++) {
- FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
- FXSYS_memset8(dest_scan, reset_gray, width);
- FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row);
- for (int col = src_left; col < src_left + width; col ++) {
- if (src_scan[col / 8] & (1 << (7 - col % 8))) {
- *dest_scan = set_gray;
- }
- dest_scan ++;
- }
- }
- return TRUE;
-}
-FX_BOOL _ConvertBuffer_8bppMask2Gray(FX_LPBYTE dest_buf, int dest_pitch, int width, int height,
- const CFX_DIBSource* pSrcBitmap, int src_left, int src_top)
-{
- for (int row = 0; row < height; row ++) {
- FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
- FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left;
- FXSYS_memcpy32(dest_scan, src_scan, width);
- }
- return TRUE;
-}
-FX_BOOL _ConvertBuffer_1bppPlt2Gray(FX_LPBYTE dest_buf, int dest_pitch, int width, int height,
- const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, void* pIccTransform)
-{
- FX_DWORD* src_plt = pSrcBitmap->GetPalette();
- FX_BYTE gray[2];
- if (pIccTransform) {
- FX_DWORD plt[2];
- if (pSrcBitmap->IsCmykImage()) {
- plt[0] = FXCMYK_TODIB(src_plt[0]);
- plt[1] = FXCMYK_TODIB(src_plt[1]);
- } else {
- FX_LPBYTE bgr_ptr = (FX_LPBYTE)plt;
- bgr_ptr[0] = FXARGB_B(src_plt[0]);
- bgr_ptr[1] = FXARGB_G(src_plt[0]);
- bgr_ptr[2] = FXARGB_R(src_plt[0]);
- bgr_ptr[3] = FXARGB_B(src_plt[1]);
- bgr_ptr[4] = FXARGB_G(src_plt[1]);
- bgr_ptr[5] = FXARGB_R(src_plt[1]);
- }
- ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
- pIccModule->TranslateScanline(pIccTransform, gray, (FX_LPCBYTE)plt, 2);
- } else {
- FX_BYTE reset_r, reset_g, reset_b,
- set_r, set_g, set_b;
- if (pSrcBitmap->IsCmykImage()) {
- AdobeCMYK_to_sRGB1(FXSYS_GetCValue(src_plt[0]), FXSYS_GetMValue(src_plt[0]), FXSYS_GetYValue(src_plt[0]), FXSYS_GetKValue(src_plt[0]),
- reset_r, reset_g, reset_b);
- AdobeCMYK_to_sRGB1(FXSYS_GetCValue(src_plt[1]), FXSYS_GetMValue(src_plt[1]), FXSYS_GetYValue(src_plt[1]), FXSYS_GetKValue(src_plt[1]),
- set_r, set_g, set_b);
- } else {
- reset_r = FXARGB_R(src_plt[0]);
- reset_g = FXARGB_G(src_plt[0]);
- reset_b = FXARGB_B(src_plt[0]);
- set_r = FXARGB_R(src_plt[1]);
- set_g = FXARGB_G(src_plt[1]);
- set_b = FXARGB_B(src_plt[1]);
- }
- gray[0] = FXRGB2GRAY(reset_r, reset_g, reset_b);
- gray[1] = FXRGB2GRAY(set_r, set_g, set_b);
- }
- for (int row = 0; row < height; row ++) {
- FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
- FXSYS_memset8(dest_scan, gray[0], width);
- FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row);
- for (int col = src_left; col < src_left + width; col ++) {
- if (src_scan[col / 8] & (1 << (7 - col % 8))) {
- *dest_scan = gray[1];
- }
- dest_scan ++;
- }
- }
- return TRUE;
-}
-FX_BOOL _ConvertBuffer_8bppPlt2Gray(FX_LPBYTE dest_buf, int dest_pitch, int width, int height,
- const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, void* pIccTransform)
-{
- FX_DWORD* src_plt = pSrcBitmap->GetPalette();
- FX_BYTE gray[256];
- if (pIccTransform) {
- FX_DWORD plt[256];
- if (pSrcBitmap->IsCmykImage()) {
- for (int i = 0; i < 256; i ++) {
- plt[i] = FXCMYK_TODIB(src_plt[i]);
- }
- } else {
- FX_LPBYTE bgr_ptr = (FX_LPBYTE)plt;
- for (int i = 0; i < 256; i ++) {
- *bgr_ptr++ = FXARGB_B(src_plt[i]);
- *bgr_ptr++ = FXARGB_G(src_plt[i]);
- *bgr_ptr++ = FXARGB_R(src_plt[i]);
- }
- }
- ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
- pIccModule->TranslateScanline(pIccTransform, gray, (FX_LPCBYTE)plt, 256);
- } else {
- if (pSrcBitmap->IsCmykImage()) {
- FX_BYTE r, g, b;
- for (int i = 0; i < 256; i ++) {
- AdobeCMYK_to_sRGB1(FXSYS_GetCValue(src_plt[i]), FXSYS_GetMValue(src_plt[i]), FXSYS_GetYValue(src_plt[i]), FXSYS_GetKValue(src_plt[i]),
- r, g, b);
- gray[i] = FXRGB2GRAY(r, g, b);
- }
- } else
- for (int i = 0; i < 256; i ++) {
- gray[i] = FXRGB2GRAY(FXARGB_R(src_plt[i]), FXARGB_G(src_plt[i]), FXARGB_B(src_plt[i]));
- }
- }
- for (int row = 0; row < height; row ++) {
- FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
- FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left;
- for (int col = 0; col < width; col ++) {
- *dest_scan++ = gray[*src_scan++];
- }
- }
- return TRUE;
-}
-FX_BOOL _ConvertBuffer_RgbOrCmyk2Gray(FX_LPBYTE dest_buf, int dest_pitch, int width, int height,
- const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, void* pIccTransform)
-{
- int Bpp = pSrcBitmap->GetBPP() / 8;
- if (pIccTransform) {
- ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
- if (Bpp == 3 || pSrcBitmap->IsCmykImage()) {
- for (int row = 0; row < height; row ++) {
- FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
- FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * Bpp;
- pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, width);
- }
- } else {
- for (int row = 0; row < height; row ++) {
- FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
- FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * 4;
- for (int col = 0; col < width; col ++) {
- pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, 1);
- dest_scan++;
- src_scan += 4;
- }
- }
- }
- } else {
- if (pSrcBitmap->IsCmykImage()) {
- for (int row = 0; row < height; row ++) {
- FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
- FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * 4;
- for (int col = 0; col < width; col ++) {
- FX_BYTE r, g, b;
- AdobeCMYK_to_sRGB1(FXSYS_GetCValue((FX_DWORD)src_scan[0]), FXSYS_GetMValue((FX_DWORD)src_scan[1]), FXSYS_GetYValue((FX_DWORD)src_scan[2]), FXSYS_GetKValue((FX_DWORD)src_scan[3]),
- r, g, b);
- *dest_scan++ = FXRGB2GRAY(r, g, b);
- src_scan += 4;
- }
- }
- } else
- for (int row = 0; row < height; row ++) {
- FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
- FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * Bpp;
- for (int col = 0; col < width; col ++) {
- *dest_scan++ = FXRGB2GRAY(src_scan[2], src_scan[1], src_scan[0]);
- src_scan += Bpp;
- }
- }
- }
- return TRUE;
-}
-inline void _ConvertBuffer_IndexCopy(FX_LPBYTE dest_buf, int dest_pitch, int width, int height,
- const CFX_DIBSource* pSrcBitmap, int src_left, int src_top)
-{
- if (pSrcBitmap->GetBPP() == 1) {
- for (int row = 0; row < height; row ++) {
- FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
- FXSYS_memset32(dest_scan, 0, width);
- FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row);
- for (int col = src_left; col < src_left + width; col ++) {
- if (src_scan[col / 8] & (1 << (7 - col % 8))) {
- *dest_scan = 1;
- }
- dest_scan ++;
- }
- }
- } else {
- for (int row = 0; row < height; row ++) {
- FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
- FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left;
- FXSYS_memcpy32(dest_scan, src_scan, width);
- }
- }
-}
-FX_BOOL _ConvertBuffer_Plt2PltRgb8(FX_LPBYTE dest_buf, int dest_pitch, int width, int height,
- const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, FX_DWORD* dst_plt, void* pIccTransform)
-{
- _ConvertBuffer_IndexCopy(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top);
- FX_DWORD* src_plt = pSrcBitmap->GetPalette();
- int plt_size = pSrcBitmap->GetPaletteSize();
- if (pIccTransform) {
- FX_DWORD plt[256];
- FX_LPBYTE bgr_ptr = (FX_LPBYTE)plt;
- if (pSrcBitmap->IsCmykImage()) {
- for (int i = 0; i < plt_size; i ++) {
- plt[i] = FXCMYK_TODIB(src_plt[i]);
- }
- } else {
- for (int i = 0; i < plt_size; i ++) {
- *bgr_ptr++ = FXARGB_B(src_plt[i]);
- *bgr_ptr++ = FXARGB_G(src_plt[i]);
- *bgr_ptr++ = FXARGB_R(src_plt[i]);
- }
- bgr_ptr = (FX_LPBYTE)plt;
- }
- ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
- pIccModule->TranslateScanline(pIccTransform, (FX_LPBYTE)plt, (FX_LPCBYTE)plt, plt_size);
- for (int i = 0; i < plt_size; i ++) {
- dst_plt[i] = FXARGB_MAKE(0xff, bgr_ptr[2], bgr_ptr[1], bgr_ptr[0]);
- bgr_ptr += 3;
- }
- } else {
- if (pSrcBitmap->IsCmykImage()) {
- for (int i = 0; i < plt_size; i ++) {
- FX_BYTE r, g, b;
- AdobeCMYK_to_sRGB1(FXSYS_GetCValue(src_plt[i]), FXSYS_GetMValue(src_plt[i]), FXSYS_GetYValue(src_plt[i]), FXSYS_GetKValue(src_plt[i]),
- r, g, b);
- dst_plt[i] = FXARGB_MAKE(0xff, r, g, b);
- }
- } else {
- FXSYS_memcpy32(dst_plt, src_plt, plt_size * 4);
- }
- }
- return TRUE;
-}
-inline FX_BOOL _ConvertBuffer_Rgb2PltRgb8_NoTransform(FX_LPBYTE dest_buf, int dest_pitch, int width, int height,
- const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, FX_DWORD* dst_plt)
-{
- int bpp = pSrcBitmap->GetBPP() / 8;
- int row, col;
- CFX_Palette palette;
- palette.BuildPalette(pSrcBitmap, FXDIB_PALETTE_LOC);
- FX_DWORD* cLut = palette.GetColorLut();
- FX_DWORD* aLut = palette.GetAmountLut();
- if (cLut == NULL || aLut == NULL) {
- return FALSE;
- }
- int lut = palette.Getlut();
- FX_DWORD* pPalette = palette.GetPalette();
- if (lut > 256) {
- int err, min_err;
- int lut_256 = lut - 256;
- for (row = 0; row < lut_256; row++) {
- min_err = 1000000;
- FX_BYTE r, g, b;
- _ColorDecode(cLut[row], r, g, b);
- int clrindex = 0;
- for (int col = 0; col < 256; col++) {
- FX_DWORD p_color = *(pPalette + col);
- int d_r = r - (FX_BYTE)(p_color >> 16);
- int d_g = g - (FX_BYTE)(p_color >> 8);
- int d_b = b - (FX_BYTE)(p_color);
- err = d_r * d_r + d_g * d_g + d_b * d_b;
- if (err < min_err) {
- min_err = err;
- clrindex = col;
- }
- }
- aLut[row] = clrindex;
- }
- }
- FX_INT32 lut_1 = lut - 1;
- for (row = 0; row < height; row ++) {
- FX_BYTE* src_scan = (FX_BYTE*)pSrcBitmap->GetScanline(src_top + row) + src_left;
- FX_BYTE* dest_scan = dest_buf + row * dest_pitch;
- for (col = 0; col < width; col++) {
- FX_BYTE* src_port = src_scan + col * bpp;
- int r = src_port[2] & 0xf0;
- int g = src_port[1] & 0xf0;
- int b = src_port[0] & 0xf0;
- FX_DWORD clrindex = (r << 4) + g + (b >> 4);
- for (int i = lut_1; i >= 0; i--)
- if (clrindex == cLut[i]) {
- *(dest_scan + col) = (FX_BYTE)(aLut[i]);
- break;
- }
- }
- }
- FXSYS_memcpy32(dst_plt, pPalette, sizeof(FX_DWORD) * 256);
- return TRUE;
-}
-FX_BOOL _ConvertBuffer_Rgb2PltRgb8(FX_LPBYTE dest_buf, int dest_pitch, int width, int height,
- const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, FX_DWORD* dst_plt, void* pIccTransform)
-{
- ICodec_IccModule* pIccModule = NULL;
- if (pIccTransform) {
- pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
- }
- FX_BOOL ret = _ConvertBuffer_Rgb2PltRgb8_NoTransform(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, dst_plt);
- if (ret && pIccTransform) {
- ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
- for (int i = 0; i < 256; i++) {
- FX_ARGB* plt = dst_plt + i;
- FX_ARGB plt_entry = FXARGB_TODIB(*plt);
- pIccModule->TranslateScanline(pIccTransform, (FX_LPBYTE)&plt_entry, (FX_LPCBYTE)&plt_entry, 1);
- *plt = FXARGB_TODIB(plt_entry);
- }
- }
- return ret;
-}
-FX_BOOL _ConvertBuffer_1bppMask2Rgb(FXDIB_Format dst_format, FX_LPBYTE dest_buf, int dest_pitch, int width, int height,
- const CFX_DIBSource* pSrcBitmap, int src_left, int src_top)
-{
- int comps = (dst_format & 0xff) / 8;
- FX_BYTE set_gray, reset_gray;
- set_gray = 0xff;
- reset_gray = 0x00;
- for (int row = 0; row < height; row ++) {
- FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
- FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row);
- for (int col = src_left; col < src_left + width; col ++) {
- if (src_scan[col / 8] & (1 << (7 - col % 8))) {
- dest_scan[0] = set_gray;
- dest_scan[1] = set_gray;
- dest_scan[2] = set_gray;
- } else {
- dest_scan[0] = reset_gray;
- dest_scan[1] = reset_gray;
- dest_scan[2] = reset_gray;
- }
- dest_scan += comps;
- }
- }
- return TRUE;
-}
-FX_BOOL _ConvertBuffer_8bppMask2Rgb(FXDIB_Format dst_format, FX_LPBYTE dest_buf, int dest_pitch, int width, int height,
- const CFX_DIBSource* pSrcBitmap, int src_left, int src_top)
-{
- int comps = (dst_format & 0xff) / 8;
- for (int row = 0; row < height; row ++) {
- FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
- FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left;
- FX_BYTE src_pixel;
- for (int col = 0; col < width; col ++) {
- src_pixel = *src_scan++;
- *dest_scan++ = src_pixel;
- *dest_scan++ = src_pixel;
- *dest_scan = src_pixel;
- dest_scan += comps - 2;
- }
- }
- return TRUE;
-}
-FX_BOOL _ConvertBuffer_1bppPlt2Rgb(FXDIB_Format dst_format, FX_LPBYTE dest_buf, int dest_pitch, int width, int height,
- const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, void* pIccTransform)
-{
- int comps = (dst_format & 0xff) / 8;
- FX_DWORD* src_plt = pSrcBitmap->GetPalette();
- FX_DWORD plt[2];
- FX_LPBYTE bgr_ptr = (FX_LPBYTE)plt;
- if (pSrcBitmap->IsCmykImage()) {
- plt[0] = FXCMYK_TODIB(src_plt[0]);
- plt[1] = FXCMYK_TODIB(src_plt[1]);
- } else {
- bgr_ptr[0] = FXARGB_B(src_plt[0]);
- bgr_ptr[1] = FXARGB_G(src_plt[0]);
- bgr_ptr[2] = FXARGB_R(src_plt[0]);
- bgr_ptr[3] = FXARGB_B(src_plt[1]);
- bgr_ptr[4] = FXARGB_G(src_plt[1]);
- bgr_ptr[5] = FXARGB_R(src_plt[1]);
- }
- if (pIccTransform) {
- ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
- pIccModule->TranslateScanline(pIccTransform, (FX_LPBYTE)plt, (FX_LPCBYTE)plt, 2);
- } else {
- if (pSrcBitmap->IsCmykImage()) {
- AdobeCMYK_to_sRGB1(FXSYS_GetCValue(src_plt[0]), FXSYS_GetMValue(src_plt[0]), FXSYS_GetYValue(src_plt[0]), FXSYS_GetKValue(src_plt[0]),
- bgr_ptr[2], bgr_ptr[1], bgr_ptr[0]);
- AdobeCMYK_to_sRGB1(FXSYS_GetCValue(src_plt[1]), FXSYS_GetMValue(src_plt[1]), FXSYS_GetYValue(src_plt[1]), FXSYS_GetKValue(src_plt[1]),
- bgr_ptr[5], bgr_ptr[4], bgr_ptr[3]);
- }
- }
- for (int row = 0; row < height; row ++) {
- FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
- FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row);
- for (int col = src_left; col < src_left + width; col ++) {
- if (src_scan[col / 8] & (1 << (7 - col % 8))) {
- *dest_scan++ = bgr_ptr[3];
- *dest_scan++ = bgr_ptr[4];
- *dest_scan = bgr_ptr[5];
- } else {
- *dest_scan++ = bgr_ptr[0];
- *dest_scan++ = bgr_ptr[1];
- *dest_scan = bgr_ptr[2];
- }
- dest_scan += comps - 2;
- }
- }
- return TRUE;
-}
-FX_BOOL _ConvertBuffer_8bppPlt2Rgb(FXDIB_Format dst_format, FX_LPBYTE dest_buf, int dest_pitch, int width, int height,
- const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, void* pIccTransform)
-{
- int comps = (dst_format & 0xff) / 8;
- FX_DWORD* src_plt = pSrcBitmap->GetPalette();
- FX_DWORD plt[256];
- FX_LPBYTE bgr_ptr = (FX_LPBYTE)plt;
- if (!pSrcBitmap->IsCmykImage()) {
- for (int i = 0; i < 256; i++) {
- *bgr_ptr++ = FXARGB_B(src_plt[i]);
- *bgr_ptr++ = FXARGB_G(src_plt[i]);
- *bgr_ptr++ = FXARGB_R(src_plt[i]);
- }
- bgr_ptr = (FX_LPBYTE)plt;
- }
- if (pIccTransform) {
- if (pSrcBitmap->IsCmykImage()) {
- for (int i = 0; i < 256; i++) {
- plt[i] = FXCMYK_TODIB(src_plt[i]);
- }
- }
- ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
- pIccModule->TranslateScanline(pIccTransform, (FX_LPBYTE)plt, (FX_LPCBYTE)plt, 256);
- } else {
- if (pSrcBitmap->IsCmykImage()) {
- for (int i = 0; i < 256; i++) {
- AdobeCMYK_to_sRGB1(FXSYS_GetCValue(src_plt[i]), FXSYS_GetMValue(src_plt[i]), FXSYS_GetYValue(src_plt[i]), FXSYS_GetKValue(src_plt[i]),
- bgr_ptr[2], bgr_ptr[1], bgr_ptr[0]);
- bgr_ptr += 3;
- }
- bgr_ptr = (FX_LPBYTE)plt;
- }
- }
- for (int row = 0; row < height; row ++) {
- FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
- FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left;
- for (int col = 0; col < width; col ++) {
- FX_LPBYTE src_pixel = bgr_ptr + 3 * (*src_scan++);
- *dest_scan++ = *src_pixel++;
- *dest_scan++ = *src_pixel++;
- *dest_scan = *src_pixel++;
- dest_scan += comps - 2;
- }
- }
- return TRUE;
-}
-FX_BOOL _ConvertBuffer_24bppRgb2Rgb24(FX_LPBYTE dest_buf, int dest_pitch, int width, int height,
- const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, void* pIccTransform)
-{
- if (pIccTransform) {
- ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
- for (int row = 0; row < height; row ++) {
- FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
- FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * 3;
- pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, width);
- }
- } else {
- for (int row = 0; row < height; row ++) {
- FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
- FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * 3;
- FXSYS_memcpy32(dest_scan, src_scan, width * 3);
- }
- }
- return TRUE;
-}
-FX_BOOL _ConvertBuffer_32bppRgb2Rgb24(FX_LPBYTE dest_buf, int dest_pitch, int width, int height,
- const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, void* pIccTransform)
-{
- for (int row = 0; row < height; row ++) {
- FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
- FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * 4;
- for (int col = 0; col < width; col ++) {
- *dest_scan++ = *src_scan++;
- *dest_scan++ = *src_scan++;
- *dest_scan++ = *src_scan++;
- src_scan++;
- }
- }
- if (pIccTransform) {
- ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
- for (int row = 0; row < height; row ++) {
- FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
- pIccModule->TranslateScanline(pIccTransform, dest_scan, dest_scan, width);
- }
- }
- return TRUE;
-}
-FX_BOOL _ConvertBuffer_Rgb2Rgb32(FX_LPBYTE dest_buf, int dest_pitch, int width, int height,
- const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, void* pIccTransform)
-{
- int comps = pSrcBitmap->GetBPP() / 8;
- if (pIccTransform) {
- ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
- for (int row = 0; row < height; row ++) {
- FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
- FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * comps;
- for (int col = 0; col < width; col ++) {
- pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, 1);
- dest_scan += 4;
- src_scan += comps;
- }
- }
- } else {
- for (int row = 0; row < height; row ++) {
- FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
- FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * comps;
- for (int col = 0; col < width; col ++) {
- *dest_scan++ = *src_scan++;
- *dest_scan++ = *src_scan++;
- *dest_scan++ = *src_scan++;
- dest_scan++;
- src_scan += comps - 3;
- }
- }
- }
- return TRUE;
-}
-FX_BOOL _ConvertBuffer_32bppCmyk2Rgb32(FX_LPBYTE dest_buf, int dest_pitch, int width, int height,
- const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, void* pIccTransform)
-{
- if (pIccTransform) {
- ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
- for (int row = 0; row < height; row ++) {
- FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
- FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * 4;
- for (int col = 0; col < width; col ++) {
- pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, 1);
- dest_scan += 4;
- src_scan += 4;
- }
- }
- } else {
- for (int row = 0; row < height; row ++) {
- FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
- FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * 4;
- for (int col = 0; col < width; col ++) {
- AdobeCMYK_to_sRGB1(src_scan[0], src_scan[1], src_scan[2], src_scan[3],
- dest_scan[2], dest_scan[1], dest_scan[0]);
- dest_scan += 4;
- src_scan += 4;
- }
- }
- }
- return TRUE;
-}
-FX_BOOL ConvertBuffer(FXDIB_Format dest_format, FX_LPBYTE dest_buf, int dest_pitch, int width, int height,
- const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, FX_DWORD*& d_pal, void* pIccTransform)
-{
- FXDIB_Format src_format = pSrcBitmap->GetFormat();
- if (!CFX_GEModule::Get()->GetCodecModule() || !CFX_GEModule::Get()->GetCodecModule()->GetIccModule()) {
- pIccTransform = NULL;
- }
- switch (dest_format) {
- case FXDIB_Invalid:
- case FXDIB_1bppCmyk:
- case FXDIB_1bppMask:
- case FXDIB_1bppRgb:
- ASSERT(FALSE);
- return FALSE;
- case FXDIB_8bppMask: {
- if ((src_format & 0xff) == 1) {
- if (pSrcBitmap->GetPalette()) {
- return _ConvertBuffer_1bppPlt2Gray(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, pIccTransform);
- }
- return _ConvertBuffer_1bppMask2Gray(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top);
- } else if ((src_format & 0xff) == 8) {
- if (pSrcBitmap->GetPalette()) {
- return _ConvertBuffer_8bppPlt2Gray(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, pIccTransform);
- }
- return _ConvertBuffer_8bppMask2Gray(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top);
- } else if ((src_format & 0xff) >= 24) {
- return _ConvertBuffer_RgbOrCmyk2Gray(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, pIccTransform);
- }
- return FALSE;
- }
- case FXDIB_8bppRgb:
- case FXDIB_8bppRgba: {
- if ((src_format & 0xff) == 8 && pSrcBitmap->GetPalette() == NULL) {
- return ConvertBuffer(FXDIB_8bppMask, dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, d_pal, pIccTransform);
- }
- d_pal = FX_Alloc(FX_DWORD, 256);
- if (!d_pal) {
- return FALSE;
- }
- FXSYS_memset32(d_pal, 0, sizeof(FX_DWORD) * 256);
- if (((src_format & 0xff) == 1 || (src_format & 0xff) == 8) && pSrcBitmap->GetPalette()) {
- return _ConvertBuffer_Plt2PltRgb8(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, d_pal, pIccTransform);
- } else if ((src_format & 0xff) >= 24) {
- return _ConvertBuffer_Rgb2PltRgb8(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, d_pal, pIccTransform);
- }
- return FALSE;
- }
- case FXDIB_Rgb:
- case FXDIB_Rgba: {
- if ((src_format & 0xff) == 1) {
- if (pSrcBitmap->GetPalette()) {
- return _ConvertBuffer_1bppPlt2Rgb(dest_format, dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, pIccTransform);
- }
- return _ConvertBuffer_1bppMask2Rgb(dest_format, dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top);
- } else if ((src_format & 0xff) == 8) {
- if (pSrcBitmap->GetPalette()) {
- return _ConvertBuffer_8bppPlt2Rgb(dest_format, dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, pIccTransform);
- }
- return _ConvertBuffer_8bppMask2Rgb(dest_format, dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top);
- } else if ((src_format & 0xff) == 24) {
- return _ConvertBuffer_24bppRgb2Rgb24(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, pIccTransform);
- } else if ((src_format & 0xff) == 32) {
- return _ConvertBuffer_32bppRgb2Rgb24(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, pIccTransform);
- }
- return FALSE;
- }
- case FXDIB_Argb:
- case FXDIB_Rgb32: {
- if ((src_format & 0xff) == 1) {
- if (pSrcBitmap->GetPalette()) {
- return _ConvertBuffer_1bppPlt2Rgb(dest_format, dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, pIccTransform);
- }
- return _ConvertBuffer_1bppMask2Rgb(dest_format, dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top);
- } else if ((src_format & 0xff) == 8) {
- if (pSrcBitmap->GetPalette()) {
- return _ConvertBuffer_8bppPlt2Rgb(dest_format, dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, pIccTransform);
- }
- return _ConvertBuffer_8bppMask2Rgb(dest_format, dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top);
- } else if ((src_format & 0xff) >= 24) {
- if (src_format & 0x0400) {
- return _ConvertBuffer_32bppCmyk2Rgb32(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, pIccTransform);
- }
- return _ConvertBuffer_Rgb2Rgb32(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, pIccTransform);
- }
- return FALSE;
- }
- default:
- return FALSE;
- }
- return FALSE;
-}
-CFX_DIBitmap* CFX_DIBSource::CloneConvert(FXDIB_Format dest_format, const FX_RECT* pClip, void* pIccTransform) const
-{
- if(dest_format == GetFormat() && pIccTransform == NULL) {
- return Clone(pClip);
- }
- if (pClip) {
- CFX_DIBitmap* pClone = Clone(pClip);
- if (pClone == NULL) {
- return NULL;
- }
- if(!pClone->ConvertFormat(dest_format, pIccTransform)) {
- delete pClone;
- return NULL;
- }
- return pClone;
- }
- CFX_DIBitmap* pClone = FX_NEW CFX_DIBitmap;
- if (!pClone) {
- return NULL;
- }
- if(!pClone->Create(m_Width, m_Height, dest_format)) {
- delete pClone;
- return NULL;
- }
- FX_BOOL ret = TRUE;
- CFX_DIBitmap* pSrcAlpha = NULL;
- if (m_AlphaFlag & 2) {
- pSrcAlpha = (GetFormat() == FXDIB_Argb) ? GetAlphaMask() : m_pAlphaMask;
- if (pSrcAlpha == NULL) {
- delete pClone;
- return NULL;
- }
- }
- if (dest_format & 0x0200) {
- if (dest_format == FXDIB_Argb)
- ret = pSrcAlpha ?
- pClone->LoadChannel(FXDIB_Alpha, pSrcAlpha, FXDIB_Alpha) :
- pClone->LoadChannel(FXDIB_Alpha, 0xff);
- else {
- ret = pClone->CopyAlphaMask(pSrcAlpha);
- }
- }
- if (pSrcAlpha && pSrcAlpha != m_pAlphaMask) {
- delete pSrcAlpha;
- pSrcAlpha = NULL;
- }
- if (!ret) {
- delete pClone;
- return NULL;
- }
- FX_DWORD* pal_8bpp = NULL;
- ret = ConvertBuffer(dest_format, pClone->GetBuffer(), pClone->GetPitch(), m_Width, m_Height, this, 0, 0, pal_8bpp, pIccTransform);
- if (!ret) {
- if (pal_8bpp) {
- FX_Free(pal_8bpp);
- }
- delete pClone;
- return NULL;
- }
- if (pal_8bpp) {
- pClone->CopyPalette(pal_8bpp);
- FX_Free(pal_8bpp);
- pal_8bpp = NULL;
- }
- return pClone;
-}
-FX_BOOL CFX_DIBitmap::ConvertFormat(FXDIB_Format dest_format, void* pIccTransform)
-{
- FXDIB_Format src_format = GetFormat();
- if (dest_format == src_format && pIccTransform == NULL) {
- return TRUE;
- }
- if (dest_format == FXDIB_8bppMask && src_format == FXDIB_8bppRgb && m_pPalette == NULL) {
- m_AlphaFlag = 1;
- return TRUE;
- }
- if (dest_format == FXDIB_Argb && src_format == FXDIB_Rgb32 && pIccTransform == NULL) {
- m_AlphaFlag = 2;
- for (int row = 0; row < m_Height; row ++) {
- FX_LPBYTE scanline = m_pBuffer + row * m_Pitch + 3;
- for (int col = 0; col < m_Width; col ++) {
- *scanline = 0xff;
- scanline += 4;
- }
- }
- return TRUE;
- }
- int dest_bpp = dest_format & 0xff;
- int dest_pitch = (dest_bpp * m_Width + 31) / 32 * 4;
- FX_LPBYTE dest_buf = FX_AllocNL(FX_BYTE, dest_pitch * m_Height + 4);
- if (dest_buf == NULL) {
- return FALSE;
- }
- CFX_DIBitmap* pAlphaMask = NULL;
- if (dest_format == FXDIB_Argb) {
- FXSYS_memset8(dest_buf, 0xff, dest_pitch * m_Height + 4);
- if (m_pAlphaMask) {
- for (int row = 0; row < m_Height; row ++) {
- FX_LPBYTE pDstScanline = dest_buf + row * dest_pitch + 3;
- FX_LPCBYTE pSrcScanline = m_pAlphaMask->GetScanline(row);
- for (int col = 0; col < m_Width; col ++) {
- *pDstScanline = *pSrcScanline++;
- pDstScanline += 4;
- }
- }
- }
- } else if (dest_format & 0x0200) {
- if (src_format == FXDIB_Argb) {
- pAlphaMask = GetAlphaMask();
- if (pAlphaMask == NULL) {
- FX_Free(dest_buf);
- return FALSE;
- }
- } else {
- if (m_pAlphaMask == NULL) {
- if (!BuildAlphaMask()) {
- FX_Free(dest_buf);
- return FALSE;
- }
- pAlphaMask = m_pAlphaMask;
- m_pAlphaMask = NULL;
- } else {
- pAlphaMask = m_pAlphaMask;
- }
- }
- }
- FX_BOOL ret = FALSE;
- FX_DWORD* pal_8bpp = NULL;
- ret = ConvertBuffer(dest_format, dest_buf, dest_pitch, m_Width, m_Height, this, 0, 0, pal_8bpp, pIccTransform);
- if (!ret) {
- if (pal_8bpp) {
- FX_Free(pal_8bpp);
- }
- if (pAlphaMask != m_pAlphaMask) {
- delete pAlphaMask;
- }
- if (dest_buf) {
- FX_Free(dest_buf);
- }
- return FALSE;
- }
- if (m_pAlphaMask && pAlphaMask != m_pAlphaMask) {
- delete m_pAlphaMask;
- }
- m_pAlphaMask = pAlphaMask;
- if (m_pPalette) {
- FX_Free(m_pPalette);
- }
- m_pPalette = pal_8bpp;
- if (!m_bExtBuf) {
- FX_Free(m_pBuffer);
- }
- m_bExtBuf = FALSE;
- m_pBuffer = dest_buf;
- m_bpp = (FX_BYTE)dest_format;
- m_AlphaFlag = (FX_BYTE)(dest_format >> 8);
- m_Pitch = dest_pitch;
- return TRUE;
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxge/fx_dib.h"
+#include "../../../include/fxge/fx_ge.h"
+#include "../../../include/fxcodec/fx_codec.h"
+const FX_DWORD g_dwWinPalette[256] = {
+ 0xff000000, 0xff800000, 0xff008000, 0xff808000, 0xff000080, 0xff800080,
+ 0xff008080, 0xff808080, 0xffC0DCC0, 0xffA6CAF0, 0xff2A3FAA, 0xff2A3FFF,
+ 0xff2A5F00, 0xff2A5F55, 0xff2A5FAA, 0xff2A5FFF, 0xff2A7F00, 0xff2A7F55,
+ 0xff2A7FAA, 0xff2A7FFF, 0xff2A9F00, 0xff2A9F55, 0xff2A9FAA, 0xff2A9FFF,
+ 0xff2ABF00, 0xff2ABF55, 0xff2ABFAA, 0xff2ABFFF, 0xff2ADF00, 0xff2ADF55,
+ 0xff2ADFAA, 0xff2ADFFF, 0xff2AFF00, 0xff2AFF55, 0xff2AFFAA, 0xff2AFFFF,
+ 0xff550000, 0xff550055, 0xff5500AA, 0xff5500FF, 0xff551F00, 0xff551F55,
+ 0xff551FAA, 0xff551FFF, 0xff553F00, 0xff553F55, 0xff553FAA, 0xff553FFF,
+ 0xff555F00, 0xff555F55, 0xff555FAA, 0xff555FFF, 0xff557F00, 0xff557F55,
+ 0xff557FAA, 0xff557FFF, 0xff559F00, 0xff559F55, 0xff559FAA, 0xff559FFF,
+ 0xff55BF00, 0xff55BF55, 0xff55BFAA, 0xff55BFFF, 0xff55DF00, 0xff55DF55,
+ 0xff55DFAA, 0xff55DFFF, 0xff55FF00, 0xff55FF55, 0xff55FFAA, 0xff55FFFF,
+ 0xff7F0000, 0xff7F0055, 0xff7F00AA, 0xff7F00FF, 0xff7F1F00, 0xff7F1F55,
+ 0xff7F1FAA, 0xff7F1FFF, 0xff7F3F00, 0xff7F3F55, 0xff7F3FAA, 0xff7F3FFF,
+ 0xff7F5F00, 0xff7F5F55, 0xff7F5FAA, 0xff7F5FFF, 0xff7F7F00, 0xff7F7F55,
+ 0xff7F7FAA, 0xff7F7FFF, 0xff7F9F00, 0xff7F9F55, 0xff7F9FAA, 0xff7F9FFF,
+ 0xff7FBF00, 0xff7FBF55, 0xff7FBFAA, 0xff7FBFFF, 0xff7FDF00, 0xff7FDF55,
+ 0xff7FDFAA, 0xff7FDFFF, 0xff00FF7F, 0xff7FFF55, 0xff7FFFAA, 0xff7FFFFF,
+ 0xffAA0000, 0xffAA0055, 0xffAA00AA, 0xffAA00FF, 0xffAA1F00, 0xffAA1F55,
+ 0xffAA1FAA, 0xffAA1FFF, 0xffAA3F00, 0xffAA3F55, 0xffAA3FAA, 0xffAA3FFF,
+ 0xffAA5F00, 0xffAA5F55, 0xffAA5FAA, 0xffAA5FFF, 0xffAA7F00, 0xffAA7F55,
+ 0xffAA7FAA, 0xffAA7FFF, 0xffAA9F00, 0xffAA9F55, 0xffAA9FAA, 0xffAA9FFF,
+ 0xffAABF00, 0xffAABF55, 0xffAABFAA, 0xffAABFFF, 0xffAADF00, 0xffAADF55,
+ 0xffAADFAA, 0xffAADFFF, 0xffAAFF00, 0xffAAFF55, 0xffAAFFAA, 0xffAAFFFF,
+ 0xffD40000, 0xffD40055, 0xffD400AA, 0xffD400FF, 0xffD41F00, 0xffD41F55,
+ 0xffD41FAA, 0xffD41FFF, 0xffD43F00, 0xffD43F55, 0xffD43FAA, 0xffD43FFF,
+ 0xffD45F00, 0xffD45F55, 0xffD45FAA, 0xffD45FFF, 0xffD47F00, 0xffD47F55,
+ 0xffD47FAA, 0xffD4F7FF, 0xffD49F00, 0xffD49F55, 0xffD49FAA, 0xffD49FFF,
+ 0xffD4BF00, 0xffD4BF55, 0xffD4BFAA, 0xffD4BFFF, 0xffD4DF00, 0xffD4DF55,
+ 0xffD4DFAA, 0xffD4DFFF, 0xffD4FF00, 0xffD4FF55, 0xffD4FFAA, 0xffD4FFFF,
+ 0xffFF0055, 0xffFF00AA, 0xffFF1F00, 0xffFF1F55, 0xffFF1FAA, 0xffFF1FFF,
+ 0xffFF3F00, 0xffFF3F55, 0xffFF3FAA, 0xffFF3FFF, 0xffFF5F00, 0xffFF5F55,
+ 0xffFF5FAA, 0xffFF5FFF, 0xffFF7F00, 0xffFF7F55, 0xffFF7FAA, 0xffFF7FFF,
+ 0xffFF9F00, 0xffFF9F55, 0xffFF9FAA, 0xffFF9FFF, 0xffFFBF00, 0xffFFBF55,
+ 0xffFFBFAA, 0xffFFBFFF, 0xffFFDF00, 0xffFFDF55, 0xffFFDFAA, 0xffFFDFFF,
+ 0xffFFFF55, 0xffFFFFAA, 0xffCCCCFF, 0xffFFCCFF, 0xff33FFFF, 0xff66FFFF,
+ 0xff99FFFF, 0xffCCFFFF, 0xff007F00, 0xff007F55, 0xff007FAA, 0xff007FFF,
+ 0xff009F00, 0xff009F55, 0xff009FAA, 0xff009FFF, 0xff00BF00, 0xff00BF55,
+ 0xff00BFAA, 0xff00BFFF, 0xff00DF00, 0xff00DF55, 0xff00DFAA, 0xff00DFFF,
+ 0xff00FF55, 0xff00FFAA, 0xff2A0000, 0xff2A0055, 0xff2A00AA, 0xff2A00FF,
+ 0xff2A1F00, 0xff2A1F55, 0xff2A1FAA, 0xff2A1FFF, 0xff2A3F00, 0xff2A3F55,
+ 0xffFFFBF0, 0xffA0A0A4, 0xff808080, 0xffFF0000, 0xff00FF00, 0xffFF0000,
+ 0xff0000FF, 0xffFF00FF, 0xff00FFFF, 0xffFFFFFF
+};
+const FX_DWORD g_dwMacPalette[256] = {
+ 0xffFFFFFF, 0xffFFFFCC, 0xffFFFF99, 0xffFFFF66, 0xffFFFF33, 0xffFFFF00,
+ 0xffFFCCFF, 0xffFFCCCC, 0xffFFCC99, 0xffFFCC66, 0xffFFCC33, 0xffFFCC00,
+ 0xffFF99FF, 0xffFF99CC, 0xffFF9999, 0xffFF9966, 0xffFF9933, 0xffFF9900,
+ 0xffFF66FF, 0xffFF66CC, 0xffFF6699, 0xffFF6666, 0xffFF6633, 0xffFF6600,
+ 0xffFF33FF, 0xffFF33CC, 0xffFF3399, 0xffFF3366, 0xffFF3333, 0xffFF3300,
+ 0xffFF00FF, 0xffFF00CC, 0xffFF0099, 0xffFF0066, 0xffFF0033, 0xffFF0000,
+ 0xffCCFFFF, 0xffCCFFCC, 0xffCCFF99, 0xffCCFF66, 0xffCCFF33, 0xffCCFF00,
+ 0xffCCCCFF, 0xffCCCCCC, 0xffCCCC99, 0xffCCCC66, 0xffCCCC33, 0xffCCCC00,
+ 0xffCC99FF, 0xffCC99CC, 0xffCC9999, 0xffCC9966, 0xffCC9933, 0xffCC9900,
+ 0xffCC66FF, 0xffCC66CC, 0xffCC6699, 0xffCC6666, 0xffCC6633, 0xffCC6600,
+ 0xffCC33FF, 0xffCC33CC, 0xffCC3399, 0xffCC3366, 0xffCC3333, 0xffCC3300,
+ 0xffCC00FF, 0xffCC00CC, 0xffCC0099, 0xffCC0066, 0xffCC0033, 0xffCC0000,
+ 0xff99FFFF, 0xff99FFCC, 0xff99FF99, 0xff99FF66, 0xff99FF33, 0xff99FF00,
+ 0xff99CCFF, 0xff99CCCC, 0xff99CC99, 0xff99CC66, 0xff99CC33, 0xff99CC00,
+ 0xff9999FF, 0xff9999CC, 0xff999999, 0xff999966, 0xff999933, 0xff999900,
+ 0xff9966FF, 0xff9966CC, 0xff996699, 0xff996666, 0xff996633, 0xff996600,
+ 0xff9933FF, 0xff9933CC, 0xff993399, 0xff993366, 0xff993333, 0xff993300,
+ 0xff9900FF, 0xff9900CC, 0xff990099, 0xff990066, 0xff990033, 0xff990000,
+ 0xff66FFFF, 0xff66FFCC, 0xff66FF99, 0xff66FF66, 0xff66FF33, 0xff66FF00,
+ 0xff66CCFF, 0xff66CCCC, 0xff66CC99, 0xff66CC66, 0xff66CC33, 0xff66CC00,
+ 0xff6699FF, 0xff6699CC, 0xff669999, 0xff669966, 0xff669933, 0xff669900,
+ 0xff6666FF, 0xff6666CC, 0xff666699, 0xff666666, 0xff666633, 0xff666600,
+ 0xff6633FF, 0xff6633CC, 0xff663399, 0xff663366, 0xff663333, 0xff663300,
+ 0xff6600FF, 0xff6600CC, 0xff660099, 0xff660066, 0xff660033, 0xff660000,
+ 0xff33FFFF, 0xff33FFCC, 0xff33FF99, 0xff33FF66, 0xff33FF33, 0xff33FF00,
+ 0xff33CCFF, 0xff33CCCC, 0xff33CC99, 0xff33CC66, 0xff33CC33, 0xff33CC00,
+ 0xff3399FF, 0xff3399CC, 0xff339999, 0xff339966, 0xff339933, 0xff339900,
+ 0xff3366FF, 0xff3366CC, 0xff336699, 0xff336666, 0xff336633, 0xff336600,
+ 0xff3333FF, 0xff3333CC, 0xff333399, 0xff333366, 0xff333333, 0xff333300,
+ 0xff3300FF, 0xff3300CC, 0xff330099, 0xff330066, 0xff330033, 0xff330000,
+ 0xff00FFFF, 0xff00FFCC, 0xff00FF99, 0xff00FF66, 0xff00FF33, 0xff00FF00,
+ 0xff00CCFF, 0xff00CCCC, 0xff00CC99, 0xff00CC66, 0xff00CC33, 0xff00CC00,
+ 0xff0099FF, 0xff0099CC, 0xff009999, 0xff009966, 0xff009933, 0xff009900,
+ 0xff0066FF, 0xff0066CC, 0xff006699, 0xff006666, 0xff006633, 0xff006600,
+ 0xff0033FF, 0xff0033CC, 0xff003399, 0xff003366, 0xff003333, 0xff003300,
+ 0xff0000FF, 0xff0000CC, 0xff000099, 0xff000066, 0xff000033,
+ 0xffEE0000, 0xffDD0000, 0xffBB0000, 0xffAA0000, 0xff880000, 0xff770000,
+ 0xff550000, 0xff440000, 0xff220000, 0xff110000, 0xff00EE00, 0xff00DD00,
+ 0xff00BB00, 0xff00AA00, 0xff008800, 0xff007700, 0xff005500, 0xff004400,
+ 0xff002200, 0xff001100, 0xff0000EE, 0xff0000DD, 0xff0000BB, 0xff0000AA,
+ 0xff000088, 0xff000077, 0xff000055, 0xff000044, 0xff000022, 0xff000011,
+ 0xffEEEEEE, 0xffDDDDDD, 0xffBBBBBB, 0xffAAAAAA, 0xff888888, 0xff777777,
+ 0xff555555, 0xff444444, 0xff222222, 0xff111111, 0xff000000
+};
+class CFX_Palette : public CFX_Object
+{
+public:
+ CFX_Palette();
+ ~CFX_Palette();
+public:
+ FX_BOOL BuildPalette(const CFX_DIBSource* pBitmap, int dwPaletteType);
+ FX_DWORD* GetPalette() const
+ {
+ return m_pPalette;
+ }
+
+ FX_DWORD* GetColorLut()const
+ {
+ return m_cLut;
+ }
+ FX_DWORD* GetAmountLut()const
+ {
+ return m_aLut;
+ }
+ FX_INT32 Getlut()const
+ {
+ return m_lut;
+ }
+protected:
+ FX_DWORD* m_pPalette;
+ FX_DWORD* m_cLut;
+ FX_DWORD* m_aLut;
+ int m_lut;
+};
+int _Partition(FX_DWORD* alut, FX_DWORD* clut, int l, int r)
+{
+ FX_DWORD p_a = alut[l];
+ FX_DWORD p_c = clut[l];
+ while(l < r) {
+ while(l < r && alut[r] >= p_a) {
+ r--;
+ }
+ if (l < r) {
+ alut[l] = alut[r];
+ clut[l++] = clut[r];
+ }
+ while(l < r && alut[l] <= p_a) {
+ l++;
+ }
+ if (l < r) {
+ alut[r] = alut[l];
+ clut[r--] = clut[l];
+ }
+ }
+ alut[l] = p_a;
+ clut[l] = p_c;
+ return l;
+}
+void _Qsort(FX_DWORD* alut, FX_DWORD* clut, int l, int r)
+{
+ if(l < r) {
+ int pI = _Partition(alut, clut, l, r);
+ _Qsort(alut, clut, l, pI - 1);
+ _Qsort(alut, clut, pI + 1, r);
+ }
+}
+void _ColorDecode(FX_DWORD pal_v, FX_BYTE& r, FX_BYTE& g, FX_BYTE& b)
+{
+ r = (FX_BYTE)((pal_v & 0xf00) >> 4);
+ g = (FX_BYTE)(pal_v & 0x0f0);
+ b = (FX_BYTE)((pal_v & 0x00f) << 4);
+}
+void _Obtain_Pal(FX_DWORD* aLut, FX_DWORD*cLut, FX_DWORD* dest_pal, int pal_type, FX_DWORD* win_mac_pal, FX_DWORD lut)
+{
+ int row, col;
+ FX_DWORD lut_1 = lut - 1;
+ if (pal_type == FXDIB_PALETTE_LOC) {
+ for (row = 0; row < 256; row++) {
+ int lut_offset = lut_1 - row;
+ if (lut_offset < 0) {
+ lut_offset += 256;
+ }
+ FX_DWORD color = cLut[lut_offset];
+ FX_BYTE r, g, b;
+ _ColorDecode(color, r, g, b);
+ dest_pal[row] = ((FX_DWORD)r << 16) | ((FX_DWORD)g << 8) | b | 0xff000000;
+ aLut[lut_offset] = row;
+ }
+ } else {
+ for (row = 0; row < 256; row++) {
+ int lut_offset = lut_1 - row;
+ if (lut_offset < 0) {
+ lut_offset += 256;
+ }
+ FX_BYTE r, g, b;
+ _ColorDecode(cLut[lut_offset], r, g, b);
+ int error, min_error = 1000000;
+ int c_index = 0;
+ for (col = 0; col < 256; col++) {
+ FX_DWORD p_color = win_mac_pal[col];
+ int d_r = r - (FX_BYTE)(p_color >> 16);
+ int d_g = g - (FX_BYTE)(p_color >> 8);
+ int d_b = b - (FX_BYTE)p_color;
+ error = d_r * d_r + d_g * d_g + d_b * d_b;
+ if (error < min_error) {
+ min_error = error;
+ c_index = col;
+ }
+ }
+ dest_pal[row] = win_mac_pal[c_index];
+ aLut[lut_offset] = row;
+ }
+ }
+}
+CFX_Palette::CFX_Palette()
+{
+ m_pPalette = NULL;
+ m_cLut = NULL;
+ m_aLut = NULL;
+ m_lut = 0;
+}
+CFX_Palette::~CFX_Palette()
+{
+ if (m_pPalette) {
+ FX_Free(m_pPalette);
+ }
+ if (m_cLut) {
+ FX_Free(m_cLut);
+ }
+ if (m_aLut) {
+ FX_Free(m_aLut);
+ }
+ m_lut = 0;
+}
+FX_BOOL CFX_Palette::BuildPalette(const CFX_DIBSource* pBitmap, int pal_type)
+{
+ if (pBitmap == NULL) {
+ return FALSE;
+ }
+ if (m_pPalette != NULL) {
+ FX_Free(m_pPalette);
+ }
+ m_pPalette = FX_Alloc(FX_DWORD, 256);
+ if (!m_pPalette) {
+ return FALSE;
+ }
+ FXSYS_memset32(m_pPalette, 0, sizeof(FX_DWORD) * 256);
+ int bpp = pBitmap->GetBPP() / 8;
+ int width = pBitmap->GetWidth();
+ int height = pBitmap->GetHeight();
+ if (m_cLut) {
+ FX_Free(m_cLut);
+ m_cLut = NULL;
+ }
+ if (m_aLut) {
+ FX_Free(m_aLut);
+ m_aLut = NULL;
+ }
+ m_cLut = FX_Alloc(FX_DWORD, 4096);
+ if (!m_cLut) {
+ return FALSE;
+ }
+ m_aLut = FX_Alloc(FX_DWORD, 4096);
+ if (!m_aLut) {
+ return FALSE;
+ }
+ FXSYS_memset32(m_aLut, 0, sizeof(FX_DWORD) * 4096);
+ FXSYS_memset32(m_cLut, 0, sizeof(FX_DWORD) * 4096);
+ int row, col;
+ m_lut = 0;
+ for (row = 0; row < height; row++) {
+ FX_BYTE* scan_line = (FX_BYTE*)pBitmap->GetScanline(row);
+ for (col = 0; col < width; col++) {
+ FX_BYTE* src_port = scan_line + col * bpp;
+ FX_DWORD b = src_port[0] & 0xf0;
+ FX_DWORD g = src_port[1] & 0xf0;
+ FX_DWORD r = src_port[2] & 0xf0;
+ FX_DWORD index = (r << 4) + g + (b >> 4);
+ m_aLut[index]++;
+ }
+ }
+ for (row = 0; row < 4096; row++) {
+ if (m_aLut[row] != 0) {
+ m_aLut[m_lut] = m_aLut[row];
+ m_cLut[m_lut] = row;
+ m_lut++;
+ }
+ }
+ _Qsort(m_aLut, m_cLut, 0, m_lut - 1);
+ FX_DWORD* win_mac_pal = NULL;
+ if (pal_type == FXDIB_PALETTE_WIN) {
+ win_mac_pal = (FX_DWORD*)g_dwWinPalette;
+ } else if (pal_type == FXDIB_PALETTE_MAC) {
+ win_mac_pal = (FX_DWORD*)g_dwMacPalette;
+ }
+ _Obtain_Pal(m_aLut, m_cLut, m_pPalette, pal_type, win_mac_pal, m_lut);
+ return TRUE;
+}
+FX_BOOL _ConvertBuffer_1bppMask2Gray(FX_LPBYTE dest_buf, int dest_pitch, int width, int height,
+ const CFX_DIBSource* pSrcBitmap, int src_left, int src_top)
+{
+ FX_BYTE set_gray, reset_gray;
+ set_gray = 0xff;
+ reset_gray = 0x00;
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
+ FXSYS_memset8(dest_scan, reset_gray, width);
+ FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row);
+ for (int col = src_left; col < src_left + width; col ++) {
+ if (src_scan[col / 8] & (1 << (7 - col % 8))) {
+ *dest_scan = set_gray;
+ }
+ dest_scan ++;
+ }
+ }
+ return TRUE;
+}
+FX_BOOL _ConvertBuffer_8bppMask2Gray(FX_LPBYTE dest_buf, int dest_pitch, int width, int height,
+ const CFX_DIBSource* pSrcBitmap, int src_left, int src_top)
+{
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
+ FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left;
+ FXSYS_memcpy32(dest_scan, src_scan, width);
+ }
+ return TRUE;
+}
+FX_BOOL _ConvertBuffer_1bppPlt2Gray(FX_LPBYTE dest_buf, int dest_pitch, int width, int height,
+ const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, void* pIccTransform)
+{
+ FX_DWORD* src_plt = pSrcBitmap->GetPalette();
+ FX_BYTE gray[2];
+ if (pIccTransform) {
+ FX_DWORD plt[2];
+ if (pSrcBitmap->IsCmykImage()) {
+ plt[0] = FXCMYK_TODIB(src_plt[0]);
+ plt[1] = FXCMYK_TODIB(src_plt[1]);
+ } else {
+ FX_LPBYTE bgr_ptr = (FX_LPBYTE)plt;
+ bgr_ptr[0] = FXARGB_B(src_plt[0]);
+ bgr_ptr[1] = FXARGB_G(src_plt[0]);
+ bgr_ptr[2] = FXARGB_R(src_plt[0]);
+ bgr_ptr[3] = FXARGB_B(src_plt[1]);
+ bgr_ptr[4] = FXARGB_G(src_plt[1]);
+ bgr_ptr[5] = FXARGB_R(src_plt[1]);
+ }
+ ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ pIccModule->TranslateScanline(pIccTransform, gray, (FX_LPCBYTE)plt, 2);
+ } else {
+ FX_BYTE reset_r, reset_g, reset_b,
+ set_r, set_g, set_b;
+ if (pSrcBitmap->IsCmykImage()) {
+ AdobeCMYK_to_sRGB1(FXSYS_GetCValue(src_plt[0]), FXSYS_GetMValue(src_plt[0]), FXSYS_GetYValue(src_plt[0]), FXSYS_GetKValue(src_plt[0]),
+ reset_r, reset_g, reset_b);
+ AdobeCMYK_to_sRGB1(FXSYS_GetCValue(src_plt[1]), FXSYS_GetMValue(src_plt[1]), FXSYS_GetYValue(src_plt[1]), FXSYS_GetKValue(src_plt[1]),
+ set_r, set_g, set_b);
+ } else {
+ reset_r = FXARGB_R(src_plt[0]);
+ reset_g = FXARGB_G(src_plt[0]);
+ reset_b = FXARGB_B(src_plt[0]);
+ set_r = FXARGB_R(src_plt[1]);
+ set_g = FXARGB_G(src_plt[1]);
+ set_b = FXARGB_B(src_plt[1]);
+ }
+ gray[0] = FXRGB2GRAY(reset_r, reset_g, reset_b);
+ gray[1] = FXRGB2GRAY(set_r, set_g, set_b);
+ }
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
+ FXSYS_memset8(dest_scan, gray[0], width);
+ FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row);
+ for (int col = src_left; col < src_left + width; col ++) {
+ if (src_scan[col / 8] & (1 << (7 - col % 8))) {
+ *dest_scan = gray[1];
+ }
+ dest_scan ++;
+ }
+ }
+ return TRUE;
+}
+FX_BOOL _ConvertBuffer_8bppPlt2Gray(FX_LPBYTE dest_buf, int dest_pitch, int width, int height,
+ const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, void* pIccTransform)
+{
+ FX_DWORD* src_plt = pSrcBitmap->GetPalette();
+ FX_BYTE gray[256];
+ if (pIccTransform) {
+ FX_DWORD plt[256];
+ if (pSrcBitmap->IsCmykImage()) {
+ for (int i = 0; i < 256; i ++) {
+ plt[i] = FXCMYK_TODIB(src_plt[i]);
+ }
+ } else {
+ FX_LPBYTE bgr_ptr = (FX_LPBYTE)plt;
+ for (int i = 0; i < 256; i ++) {
+ *bgr_ptr++ = FXARGB_B(src_plt[i]);
+ *bgr_ptr++ = FXARGB_G(src_plt[i]);
+ *bgr_ptr++ = FXARGB_R(src_plt[i]);
+ }
+ }
+ ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ pIccModule->TranslateScanline(pIccTransform, gray, (FX_LPCBYTE)plt, 256);
+ } else {
+ if (pSrcBitmap->IsCmykImage()) {
+ FX_BYTE r, g, b;
+ for (int i = 0; i < 256; i ++) {
+ AdobeCMYK_to_sRGB1(FXSYS_GetCValue(src_plt[i]), FXSYS_GetMValue(src_plt[i]), FXSYS_GetYValue(src_plt[i]), FXSYS_GetKValue(src_plt[i]),
+ r, g, b);
+ gray[i] = FXRGB2GRAY(r, g, b);
+ }
+ } else
+ for (int i = 0; i < 256; i ++) {
+ gray[i] = FXRGB2GRAY(FXARGB_R(src_plt[i]), FXARGB_G(src_plt[i]), FXARGB_B(src_plt[i]));
+ }
+ }
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
+ FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left;
+ for (int col = 0; col < width; col ++) {
+ *dest_scan++ = gray[*src_scan++];
+ }
+ }
+ return TRUE;
+}
+FX_BOOL _ConvertBuffer_RgbOrCmyk2Gray(FX_LPBYTE dest_buf, int dest_pitch, int width, int height,
+ const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, void* pIccTransform)
+{
+ int Bpp = pSrcBitmap->GetBPP() / 8;
+ if (pIccTransform) {
+ ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ if (Bpp == 3 || pSrcBitmap->IsCmykImage()) {
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
+ FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * Bpp;
+ pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, width);
+ }
+ } else {
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
+ FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * 4;
+ for (int col = 0; col < width; col ++) {
+ pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, 1);
+ dest_scan++;
+ src_scan += 4;
+ }
+ }
+ }
+ } else {
+ if (pSrcBitmap->IsCmykImage()) {
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
+ FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * 4;
+ for (int col = 0; col < width; col ++) {
+ FX_BYTE r, g, b;
+ AdobeCMYK_to_sRGB1(FXSYS_GetCValue((FX_DWORD)src_scan[0]), FXSYS_GetMValue((FX_DWORD)src_scan[1]), FXSYS_GetYValue((FX_DWORD)src_scan[2]), FXSYS_GetKValue((FX_DWORD)src_scan[3]),
+ r, g, b);
+ *dest_scan++ = FXRGB2GRAY(r, g, b);
+ src_scan += 4;
+ }
+ }
+ } else
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
+ FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * Bpp;
+ for (int col = 0; col < width; col ++) {
+ *dest_scan++ = FXRGB2GRAY(src_scan[2], src_scan[1], src_scan[0]);
+ src_scan += Bpp;
+ }
+ }
+ }
+ return TRUE;
+}
+inline void _ConvertBuffer_IndexCopy(FX_LPBYTE dest_buf, int dest_pitch, int width, int height,
+ const CFX_DIBSource* pSrcBitmap, int src_left, int src_top)
+{
+ if (pSrcBitmap->GetBPP() == 1) {
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
+ FXSYS_memset32(dest_scan, 0, width);
+ FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row);
+ for (int col = src_left; col < src_left + width; col ++) {
+ if (src_scan[col / 8] & (1 << (7 - col % 8))) {
+ *dest_scan = 1;
+ }
+ dest_scan ++;
+ }
+ }
+ } else {
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
+ FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left;
+ FXSYS_memcpy32(dest_scan, src_scan, width);
+ }
+ }
+}
+FX_BOOL _ConvertBuffer_Plt2PltRgb8(FX_LPBYTE dest_buf, int dest_pitch, int width, int height,
+ const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, FX_DWORD* dst_plt, void* pIccTransform)
+{
+ _ConvertBuffer_IndexCopy(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top);
+ FX_DWORD* src_plt = pSrcBitmap->GetPalette();
+ int plt_size = pSrcBitmap->GetPaletteSize();
+ if (pIccTransform) {
+ FX_DWORD plt[256];
+ FX_LPBYTE bgr_ptr = (FX_LPBYTE)plt;
+ if (pSrcBitmap->IsCmykImage()) {
+ for (int i = 0; i < plt_size; i ++) {
+ plt[i] = FXCMYK_TODIB(src_plt[i]);
+ }
+ } else {
+ for (int i = 0; i < plt_size; i ++) {
+ *bgr_ptr++ = FXARGB_B(src_plt[i]);
+ *bgr_ptr++ = FXARGB_G(src_plt[i]);
+ *bgr_ptr++ = FXARGB_R(src_plt[i]);
+ }
+ bgr_ptr = (FX_LPBYTE)plt;
+ }
+ ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ pIccModule->TranslateScanline(pIccTransform, (FX_LPBYTE)plt, (FX_LPCBYTE)plt, plt_size);
+ for (int i = 0; i < plt_size; i ++) {
+ dst_plt[i] = FXARGB_MAKE(0xff, bgr_ptr[2], bgr_ptr[1], bgr_ptr[0]);
+ bgr_ptr += 3;
+ }
+ } else {
+ if (pSrcBitmap->IsCmykImage()) {
+ for (int i = 0; i < plt_size; i ++) {
+ FX_BYTE r, g, b;
+ AdobeCMYK_to_sRGB1(FXSYS_GetCValue(src_plt[i]), FXSYS_GetMValue(src_plt[i]), FXSYS_GetYValue(src_plt[i]), FXSYS_GetKValue(src_plt[i]),
+ r, g, b);
+ dst_plt[i] = FXARGB_MAKE(0xff, r, g, b);
+ }
+ } else {
+ FXSYS_memcpy32(dst_plt, src_plt, plt_size * 4);
+ }
+ }
+ return TRUE;
+}
+inline FX_BOOL _ConvertBuffer_Rgb2PltRgb8_NoTransform(FX_LPBYTE dest_buf, int dest_pitch, int width, int height,
+ const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, FX_DWORD* dst_plt)
+{
+ int bpp = pSrcBitmap->GetBPP() / 8;
+ int row, col;
+ CFX_Palette palette;
+ palette.BuildPalette(pSrcBitmap, FXDIB_PALETTE_LOC);
+ FX_DWORD* cLut = palette.GetColorLut();
+ FX_DWORD* aLut = palette.GetAmountLut();
+ if (cLut == NULL || aLut == NULL) {
+ return FALSE;
+ }
+ int lut = palette.Getlut();
+ FX_DWORD* pPalette = palette.GetPalette();
+ if (lut > 256) {
+ int err, min_err;
+ int lut_256 = lut - 256;
+ for (row = 0; row < lut_256; row++) {
+ min_err = 1000000;
+ FX_BYTE r, g, b;
+ _ColorDecode(cLut[row], r, g, b);
+ int clrindex = 0;
+ for (int col = 0; col < 256; col++) {
+ FX_DWORD p_color = *(pPalette + col);
+ int d_r = r - (FX_BYTE)(p_color >> 16);
+ int d_g = g - (FX_BYTE)(p_color >> 8);
+ int d_b = b - (FX_BYTE)(p_color);
+ err = d_r * d_r + d_g * d_g + d_b * d_b;
+ if (err < min_err) {
+ min_err = err;
+ clrindex = col;
+ }
+ }
+ aLut[row] = clrindex;
+ }
+ }
+ FX_INT32 lut_1 = lut - 1;
+ for (row = 0; row < height; row ++) {
+ FX_BYTE* src_scan = (FX_BYTE*)pSrcBitmap->GetScanline(src_top + row) + src_left;
+ FX_BYTE* dest_scan = dest_buf + row * dest_pitch;
+ for (col = 0; col < width; col++) {
+ FX_BYTE* src_port = src_scan + col * bpp;
+ int r = src_port[2] & 0xf0;
+ int g = src_port[1] & 0xf0;
+ int b = src_port[0] & 0xf0;
+ FX_DWORD clrindex = (r << 4) + g + (b >> 4);
+ for (int i = lut_1; i >= 0; i--)
+ if (clrindex == cLut[i]) {
+ *(dest_scan + col) = (FX_BYTE)(aLut[i]);
+ break;
+ }
+ }
+ }
+ FXSYS_memcpy32(dst_plt, pPalette, sizeof(FX_DWORD) * 256);
+ return TRUE;
+}
+FX_BOOL _ConvertBuffer_Rgb2PltRgb8(FX_LPBYTE dest_buf, int dest_pitch, int width, int height,
+ const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, FX_DWORD* dst_plt, void* pIccTransform)
+{
+ ICodec_IccModule* pIccModule = NULL;
+ if (pIccTransform) {
+ pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ }
+ FX_BOOL ret = _ConvertBuffer_Rgb2PltRgb8_NoTransform(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, dst_plt);
+ if (ret && pIccTransform) {
+ ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ for (int i = 0; i < 256; i++) {
+ FX_ARGB* plt = dst_plt + i;
+ FX_ARGB plt_entry = FXARGB_TODIB(*plt);
+ pIccModule->TranslateScanline(pIccTransform, (FX_LPBYTE)&plt_entry, (FX_LPCBYTE)&plt_entry, 1);
+ *plt = FXARGB_TODIB(plt_entry);
+ }
+ }
+ return ret;
+}
+FX_BOOL _ConvertBuffer_1bppMask2Rgb(FXDIB_Format dst_format, FX_LPBYTE dest_buf, int dest_pitch, int width, int height,
+ const CFX_DIBSource* pSrcBitmap, int src_left, int src_top)
+{
+ int comps = (dst_format & 0xff) / 8;
+ FX_BYTE set_gray, reset_gray;
+ set_gray = 0xff;
+ reset_gray = 0x00;
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
+ FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row);
+ for (int col = src_left; col < src_left + width; col ++) {
+ if (src_scan[col / 8] & (1 << (7 - col % 8))) {
+ dest_scan[0] = set_gray;
+ dest_scan[1] = set_gray;
+ dest_scan[2] = set_gray;
+ } else {
+ dest_scan[0] = reset_gray;
+ dest_scan[1] = reset_gray;
+ dest_scan[2] = reset_gray;
+ }
+ dest_scan += comps;
+ }
+ }
+ return TRUE;
+}
+FX_BOOL _ConvertBuffer_8bppMask2Rgb(FXDIB_Format dst_format, FX_LPBYTE dest_buf, int dest_pitch, int width, int height,
+ const CFX_DIBSource* pSrcBitmap, int src_left, int src_top)
+{
+ int comps = (dst_format & 0xff) / 8;
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
+ FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left;
+ FX_BYTE src_pixel;
+ for (int col = 0; col < width; col ++) {
+ src_pixel = *src_scan++;
+ *dest_scan++ = src_pixel;
+ *dest_scan++ = src_pixel;
+ *dest_scan = src_pixel;
+ dest_scan += comps - 2;
+ }
+ }
+ return TRUE;
+}
+FX_BOOL _ConvertBuffer_1bppPlt2Rgb(FXDIB_Format dst_format, FX_LPBYTE dest_buf, int dest_pitch, int width, int height,
+ const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, void* pIccTransform)
+{
+ int comps = (dst_format & 0xff) / 8;
+ FX_DWORD* src_plt = pSrcBitmap->GetPalette();
+ FX_DWORD plt[2];
+ FX_LPBYTE bgr_ptr = (FX_LPBYTE)plt;
+ if (pSrcBitmap->IsCmykImage()) {
+ plt[0] = FXCMYK_TODIB(src_plt[0]);
+ plt[1] = FXCMYK_TODIB(src_plt[1]);
+ } else {
+ bgr_ptr[0] = FXARGB_B(src_plt[0]);
+ bgr_ptr[1] = FXARGB_G(src_plt[0]);
+ bgr_ptr[2] = FXARGB_R(src_plt[0]);
+ bgr_ptr[3] = FXARGB_B(src_plt[1]);
+ bgr_ptr[4] = FXARGB_G(src_plt[1]);
+ bgr_ptr[5] = FXARGB_R(src_plt[1]);
+ }
+ if (pIccTransform) {
+ ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ pIccModule->TranslateScanline(pIccTransform, (FX_LPBYTE)plt, (FX_LPCBYTE)plt, 2);
+ } else {
+ if (pSrcBitmap->IsCmykImage()) {
+ AdobeCMYK_to_sRGB1(FXSYS_GetCValue(src_plt[0]), FXSYS_GetMValue(src_plt[0]), FXSYS_GetYValue(src_plt[0]), FXSYS_GetKValue(src_plt[0]),
+ bgr_ptr[2], bgr_ptr[1], bgr_ptr[0]);
+ AdobeCMYK_to_sRGB1(FXSYS_GetCValue(src_plt[1]), FXSYS_GetMValue(src_plt[1]), FXSYS_GetYValue(src_plt[1]), FXSYS_GetKValue(src_plt[1]),
+ bgr_ptr[5], bgr_ptr[4], bgr_ptr[3]);
+ }
+ }
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
+ FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row);
+ for (int col = src_left; col < src_left + width; col ++) {
+ if (src_scan[col / 8] & (1 << (7 - col % 8))) {
+ *dest_scan++ = bgr_ptr[3];
+ *dest_scan++ = bgr_ptr[4];
+ *dest_scan = bgr_ptr[5];
+ } else {
+ *dest_scan++ = bgr_ptr[0];
+ *dest_scan++ = bgr_ptr[1];
+ *dest_scan = bgr_ptr[2];
+ }
+ dest_scan += comps - 2;
+ }
+ }
+ return TRUE;
+}
+FX_BOOL _ConvertBuffer_8bppPlt2Rgb(FXDIB_Format dst_format, FX_LPBYTE dest_buf, int dest_pitch, int width, int height,
+ const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, void* pIccTransform)
+{
+ int comps = (dst_format & 0xff) / 8;
+ FX_DWORD* src_plt = pSrcBitmap->GetPalette();
+ FX_DWORD plt[256];
+ FX_LPBYTE bgr_ptr = (FX_LPBYTE)plt;
+ if (!pSrcBitmap->IsCmykImage()) {
+ for (int i = 0; i < 256; i++) {
+ *bgr_ptr++ = FXARGB_B(src_plt[i]);
+ *bgr_ptr++ = FXARGB_G(src_plt[i]);
+ *bgr_ptr++ = FXARGB_R(src_plt[i]);
+ }
+ bgr_ptr = (FX_LPBYTE)plt;
+ }
+ if (pIccTransform) {
+ if (pSrcBitmap->IsCmykImage()) {
+ for (int i = 0; i < 256; i++) {
+ plt[i] = FXCMYK_TODIB(src_plt[i]);
+ }
+ }
+ ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ pIccModule->TranslateScanline(pIccTransform, (FX_LPBYTE)plt, (FX_LPCBYTE)plt, 256);
+ } else {
+ if (pSrcBitmap->IsCmykImage()) {
+ for (int i = 0; i < 256; i++) {
+ AdobeCMYK_to_sRGB1(FXSYS_GetCValue(src_plt[i]), FXSYS_GetMValue(src_plt[i]), FXSYS_GetYValue(src_plt[i]), FXSYS_GetKValue(src_plt[i]),
+ bgr_ptr[2], bgr_ptr[1], bgr_ptr[0]);
+ bgr_ptr += 3;
+ }
+ bgr_ptr = (FX_LPBYTE)plt;
+ }
+ }
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
+ FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left;
+ for (int col = 0; col < width; col ++) {
+ FX_LPBYTE src_pixel = bgr_ptr + 3 * (*src_scan++);
+ *dest_scan++ = *src_pixel++;
+ *dest_scan++ = *src_pixel++;
+ *dest_scan = *src_pixel++;
+ dest_scan += comps - 2;
+ }
+ }
+ return TRUE;
+}
+FX_BOOL _ConvertBuffer_24bppRgb2Rgb24(FX_LPBYTE dest_buf, int dest_pitch, int width, int height,
+ const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, void* pIccTransform)
+{
+ if (pIccTransform) {
+ ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
+ FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * 3;
+ pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, width);
+ }
+ } else {
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
+ FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * 3;
+ FXSYS_memcpy32(dest_scan, src_scan, width * 3);
+ }
+ }
+ return TRUE;
+}
+FX_BOOL _ConvertBuffer_32bppRgb2Rgb24(FX_LPBYTE dest_buf, int dest_pitch, int width, int height,
+ const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, void* pIccTransform)
+{
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
+ FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * 4;
+ for (int col = 0; col < width; col ++) {
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ src_scan++;
+ }
+ }
+ if (pIccTransform) {
+ ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
+ pIccModule->TranslateScanline(pIccTransform, dest_scan, dest_scan, width);
+ }
+ }
+ return TRUE;
+}
+FX_BOOL _ConvertBuffer_Rgb2Rgb32(FX_LPBYTE dest_buf, int dest_pitch, int width, int height,
+ const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, void* pIccTransform)
+{
+ int comps = pSrcBitmap->GetBPP() / 8;
+ if (pIccTransform) {
+ ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
+ FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * comps;
+ for (int col = 0; col < width; col ++) {
+ pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, 1);
+ dest_scan += 4;
+ src_scan += comps;
+ }
+ }
+ } else {
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
+ FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * comps;
+ for (int col = 0; col < width; col ++) {
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ dest_scan++;
+ src_scan += comps - 3;
+ }
+ }
+ }
+ return TRUE;
+}
+FX_BOOL _ConvertBuffer_32bppCmyk2Rgb32(FX_LPBYTE dest_buf, int dest_pitch, int width, int height,
+ const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, void* pIccTransform)
+{
+ if (pIccTransform) {
+ ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
+ FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * 4;
+ for (int col = 0; col < width; col ++) {
+ pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, 1);
+ dest_scan += 4;
+ src_scan += 4;
+ }
+ }
+ } else {
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
+ FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * 4;
+ for (int col = 0; col < width; col ++) {
+ AdobeCMYK_to_sRGB1(src_scan[0], src_scan[1], src_scan[2], src_scan[3],
+ dest_scan[2], dest_scan[1], dest_scan[0]);
+ dest_scan += 4;
+ src_scan += 4;
+ }
+ }
+ }
+ return TRUE;
+}
+FX_BOOL ConvertBuffer(FXDIB_Format dest_format, FX_LPBYTE dest_buf, int dest_pitch, int width, int height,
+ const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, FX_DWORD*& d_pal, void* pIccTransform)
+{
+ FXDIB_Format src_format = pSrcBitmap->GetFormat();
+ if (!CFX_GEModule::Get()->GetCodecModule() || !CFX_GEModule::Get()->GetCodecModule()->GetIccModule()) {
+ pIccTransform = NULL;
+ }
+ switch (dest_format) {
+ case FXDIB_Invalid:
+ case FXDIB_1bppCmyk:
+ case FXDIB_1bppMask:
+ case FXDIB_1bppRgb:
+ ASSERT(FALSE);
+ return FALSE;
+ case FXDIB_8bppMask: {
+ if ((src_format & 0xff) == 1) {
+ if (pSrcBitmap->GetPalette()) {
+ return _ConvertBuffer_1bppPlt2Gray(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, pIccTransform);
+ }
+ return _ConvertBuffer_1bppMask2Gray(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top);
+ } else if ((src_format & 0xff) == 8) {
+ if (pSrcBitmap->GetPalette()) {
+ return _ConvertBuffer_8bppPlt2Gray(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, pIccTransform);
+ }
+ return _ConvertBuffer_8bppMask2Gray(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top);
+ } else if ((src_format & 0xff) >= 24) {
+ return _ConvertBuffer_RgbOrCmyk2Gray(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, pIccTransform);
+ }
+ return FALSE;
+ }
+ case FXDIB_8bppRgb:
+ case FXDIB_8bppRgba: {
+ if ((src_format & 0xff) == 8 && pSrcBitmap->GetPalette() == NULL) {
+ return ConvertBuffer(FXDIB_8bppMask, dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, d_pal, pIccTransform);
+ }
+ d_pal = FX_Alloc(FX_DWORD, 256);
+ if (!d_pal) {
+ return FALSE;
+ }
+ FXSYS_memset32(d_pal, 0, sizeof(FX_DWORD) * 256);
+ if (((src_format & 0xff) == 1 || (src_format & 0xff) == 8) && pSrcBitmap->GetPalette()) {
+ return _ConvertBuffer_Plt2PltRgb8(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, d_pal, pIccTransform);
+ } else if ((src_format & 0xff) >= 24) {
+ return _ConvertBuffer_Rgb2PltRgb8(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, d_pal, pIccTransform);
+ }
+ return FALSE;
+ }
+ case FXDIB_Rgb:
+ case FXDIB_Rgba: {
+ if ((src_format & 0xff) == 1) {
+ if (pSrcBitmap->GetPalette()) {
+ return _ConvertBuffer_1bppPlt2Rgb(dest_format, dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, pIccTransform);
+ }
+ return _ConvertBuffer_1bppMask2Rgb(dest_format, dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top);
+ } else if ((src_format & 0xff) == 8) {
+ if (pSrcBitmap->GetPalette()) {
+ return _ConvertBuffer_8bppPlt2Rgb(dest_format, dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, pIccTransform);
+ }
+ return _ConvertBuffer_8bppMask2Rgb(dest_format, dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top);
+ } else if ((src_format & 0xff) == 24) {
+ return _ConvertBuffer_24bppRgb2Rgb24(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, pIccTransform);
+ } else if ((src_format & 0xff) == 32) {
+ return _ConvertBuffer_32bppRgb2Rgb24(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, pIccTransform);
+ }
+ return FALSE;
+ }
+ case FXDIB_Argb:
+ case FXDIB_Rgb32: {
+ if ((src_format & 0xff) == 1) {
+ if (pSrcBitmap->GetPalette()) {
+ return _ConvertBuffer_1bppPlt2Rgb(dest_format, dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, pIccTransform);
+ }
+ return _ConvertBuffer_1bppMask2Rgb(dest_format, dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top);
+ } else if ((src_format & 0xff) == 8) {
+ if (pSrcBitmap->GetPalette()) {
+ return _ConvertBuffer_8bppPlt2Rgb(dest_format, dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, pIccTransform);
+ }
+ return _ConvertBuffer_8bppMask2Rgb(dest_format, dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top);
+ } else if ((src_format & 0xff) >= 24) {
+ if (src_format & 0x0400) {
+ return _ConvertBuffer_32bppCmyk2Rgb32(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, pIccTransform);
+ }
+ return _ConvertBuffer_Rgb2Rgb32(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, pIccTransform);
+ }
+ return FALSE;
+ }
+ default:
+ return FALSE;
+ }
+ return FALSE;
+}
+CFX_DIBitmap* CFX_DIBSource::CloneConvert(FXDIB_Format dest_format, const FX_RECT* pClip, void* pIccTransform) const
+{
+ if(dest_format == GetFormat() && pIccTransform == NULL) {
+ return Clone(pClip);
+ }
+ if (pClip) {
+ CFX_DIBitmap* pClone = Clone(pClip);
+ if (pClone == NULL) {
+ return NULL;
+ }
+ if(!pClone->ConvertFormat(dest_format, pIccTransform)) {
+ delete pClone;
+ return NULL;
+ }
+ return pClone;
+ }
+ CFX_DIBitmap* pClone = FX_NEW CFX_DIBitmap;
+ if (!pClone) {
+ return NULL;
+ }
+ if(!pClone->Create(m_Width, m_Height, dest_format)) {
+ delete pClone;
+ return NULL;
+ }
+ FX_BOOL ret = TRUE;
+ CFX_DIBitmap* pSrcAlpha = NULL;
+ if (m_AlphaFlag & 2) {
+ pSrcAlpha = (GetFormat() == FXDIB_Argb) ? GetAlphaMask() : m_pAlphaMask;
+ if (pSrcAlpha == NULL) {
+ delete pClone;
+ return NULL;
+ }
+ }
+ if (dest_format & 0x0200) {
+ if (dest_format == FXDIB_Argb)
+ ret = pSrcAlpha ?
+ pClone->LoadChannel(FXDIB_Alpha, pSrcAlpha, FXDIB_Alpha) :
+ pClone->LoadChannel(FXDIB_Alpha, 0xff);
+ else {
+ ret = pClone->CopyAlphaMask(pSrcAlpha);
+ }
+ }
+ if (pSrcAlpha && pSrcAlpha != m_pAlphaMask) {
+ delete pSrcAlpha;
+ pSrcAlpha = NULL;
+ }
+ if (!ret) {
+ delete pClone;
+ return NULL;
+ }
+ FX_DWORD* pal_8bpp = NULL;
+ ret = ConvertBuffer(dest_format, pClone->GetBuffer(), pClone->GetPitch(), m_Width, m_Height, this, 0, 0, pal_8bpp, pIccTransform);
+ if (!ret) {
+ if (pal_8bpp) {
+ FX_Free(pal_8bpp);
+ }
+ delete pClone;
+ return NULL;
+ }
+ if (pal_8bpp) {
+ pClone->CopyPalette(pal_8bpp);
+ FX_Free(pal_8bpp);
+ pal_8bpp = NULL;
+ }
+ return pClone;
+}
+FX_BOOL CFX_DIBitmap::ConvertFormat(FXDIB_Format dest_format, void* pIccTransform)
+{
+ FXDIB_Format src_format = GetFormat();
+ if (dest_format == src_format && pIccTransform == NULL) {
+ return TRUE;
+ }
+ if (dest_format == FXDIB_8bppMask && src_format == FXDIB_8bppRgb && m_pPalette == NULL) {
+ m_AlphaFlag = 1;
+ return TRUE;
+ }
+ if (dest_format == FXDIB_Argb && src_format == FXDIB_Rgb32 && pIccTransform == NULL) {
+ m_AlphaFlag = 2;
+ for (int row = 0; row < m_Height; row ++) {
+ FX_LPBYTE scanline = m_pBuffer + row * m_Pitch + 3;
+ for (int col = 0; col < m_Width; col ++) {
+ *scanline = 0xff;
+ scanline += 4;
+ }
+ }
+ return TRUE;
+ }
+ int dest_bpp = dest_format & 0xff;
+ int dest_pitch = (dest_bpp * m_Width + 31) / 32 * 4;
+ FX_LPBYTE dest_buf = FX_AllocNL(FX_BYTE, dest_pitch * m_Height + 4);
+ if (dest_buf == NULL) {
+ return FALSE;
+ }
+ CFX_DIBitmap* pAlphaMask = NULL;
+ if (dest_format == FXDIB_Argb) {
+ FXSYS_memset8(dest_buf, 0xff, dest_pitch * m_Height + 4);
+ if (m_pAlphaMask) {
+ for (int row = 0; row < m_Height; row ++) {
+ FX_LPBYTE pDstScanline = dest_buf + row * dest_pitch + 3;
+ FX_LPCBYTE pSrcScanline = m_pAlphaMask->GetScanline(row);
+ for (int col = 0; col < m_Width; col ++) {
+ *pDstScanline = *pSrcScanline++;
+ pDstScanline += 4;
+ }
+ }
+ }
+ } else if (dest_format & 0x0200) {
+ if (src_format == FXDIB_Argb) {
+ pAlphaMask = GetAlphaMask();
+ if (pAlphaMask == NULL) {
+ FX_Free(dest_buf);
+ return FALSE;
+ }
+ } else {
+ if (m_pAlphaMask == NULL) {
+ if (!BuildAlphaMask()) {
+ FX_Free(dest_buf);
+ return FALSE;
+ }
+ pAlphaMask = m_pAlphaMask;
+ m_pAlphaMask = NULL;
+ } else {
+ pAlphaMask = m_pAlphaMask;
+ }
+ }
+ }
+ FX_BOOL ret = FALSE;
+ FX_DWORD* pal_8bpp = NULL;
+ ret = ConvertBuffer(dest_format, dest_buf, dest_pitch, m_Width, m_Height, this, 0, 0, pal_8bpp, pIccTransform);
+ if (!ret) {
+ if (pal_8bpp) {
+ FX_Free(pal_8bpp);
+ }
+ if (pAlphaMask != m_pAlphaMask) {
+ delete pAlphaMask;
+ }
+ if (dest_buf) {
+ FX_Free(dest_buf);
+ }
+ return FALSE;
+ }
+ if (m_pAlphaMask && pAlphaMask != m_pAlphaMask) {
+ delete m_pAlphaMask;
+ }
+ m_pAlphaMask = pAlphaMask;
+ if (m_pPalette) {
+ FX_Free(m_pPalette);
+ }
+ m_pPalette = pal_8bpp;
+ if (!m_bExtBuf) {
+ FX_Free(m_pBuffer);
+ }
+ m_bExtBuf = FALSE;
+ m_pBuffer = dest_buf;
+ m_bpp = (FX_BYTE)dest_format;
+ m_AlphaFlag = (FX_BYTE)(dest_format >> 8);
+ m_Pitch = dest_pitch;
+ return TRUE;
+}
diff --git a/core/src/fxge/dib/fx_dib_engine.cpp b/core/src/fxge/dib/fx_dib_engine.cpp
index 3ddbff6409..a51038628e 100644
--- a/core/src/fxge/dib/fx_dib_engine.cpp
+++ b/core/src/fxge/dib/fx_dib_engine.cpp
@@ -1,867 +1,867 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../../include/fxge/fx_dib.h"
-#include "../../../include/fxge/fx_ge.h"
-#include "dib_int.h"
-#include <limits.h>
-extern int SDP_Table[513];
-void CWeightTable::Calc(int dest_len, int dest_min, int dest_max, int src_len, int src_min, int src_max, int flags)
-{
- if (m_pWeightTables) {
- FX_Free(m_pWeightTables);
- m_pWeightTables = NULL;
- }
- double scale, base;
- scale = FXSYS_Div((FX_FLOAT)(src_len), (FX_FLOAT)(dest_len));
- if (dest_len < 0) {
- base = (FX_FLOAT)(src_len);
- } else {
- base = 0;
- }
- int ext_size = flags & FXDIB_BICUBIC_INTERPOL ? 3 : 1;
- m_ItemSize = sizeof(int) * 2 + (int)(sizeof(int) * (FXSYS_ceil(FXSYS_fabs((FX_FLOAT)scale)) + ext_size));
- m_DestMin = dest_min;
- if ((dest_max - dest_min) > (int)((1U << 30) - 4) / m_ItemSize) {
- return;
- }
- m_pWeightTables = FX_AllocNL(FX_BYTE, (dest_max - dest_min) * m_ItemSize + 4);
- if (m_pWeightTables == NULL) {
- return;
- }
- FXSYS_memset32(m_pWeightTables, 0, sizeof(FX_BYTE) * ((dest_max - dest_min)*m_ItemSize + 4));
- if ((flags & FXDIB_NOSMOOTH) != 0 || FXSYS_fabs((FX_FLOAT)scale) < 1.0f) {
- for (int dest_pixel = dest_min; dest_pixel < dest_max; dest_pixel ++) {
- PixelWeight& pixel_weights = *GetPixelWeight(dest_pixel);
- double src_pos = dest_pixel * scale + scale / 2 + base;
- if (flags & FXDIB_INTERPOL) {
- pixel_weights.m_SrcStart = (int)FXSYS_floor((FX_FLOAT)src_pos - 1.0f / 2);
- pixel_weights.m_SrcEnd = (int)FXSYS_floor((FX_FLOAT)src_pos + 1.0f / 2);
- if (pixel_weights.m_SrcStart < src_min) {
- pixel_weights.m_SrcStart = src_min;
- }
- if (pixel_weights.m_SrcEnd >= src_max) {
- pixel_weights.m_SrcEnd = src_max - 1;
- }
- if (pixel_weights.m_SrcStart == pixel_weights.m_SrcEnd) {
- pixel_weights.m_Weights[0] = 65536;
- } else {
- pixel_weights.m_Weights[1] = FXSYS_round((FX_FLOAT)(src_pos - pixel_weights.m_SrcStart - 1.0f / 2) * 65536);
- pixel_weights.m_Weights[0] = 65536 - pixel_weights.m_Weights[1];
- }
- } else if (flags & FXDIB_BICUBIC_INTERPOL) {
- pixel_weights.m_SrcStart = (int)FXSYS_floor((FX_FLOAT)src_pos - 1.0f / 2);
- pixel_weights.m_SrcEnd = (int)FXSYS_floor((FX_FLOAT)src_pos + 1.0f / 2);
- int start = pixel_weights.m_SrcStart - 1;
- int end = pixel_weights.m_SrcEnd + 1;
- if (start < src_min) {
- start = src_min;
- }
- if (end >= src_max) {
- end = src_max - 1;
- }
- if (pixel_weights.m_SrcStart < src_min) {
- src_pos += src_min - pixel_weights.m_SrcStart;
- pixel_weights.m_SrcStart = src_min;
- }
- if (pixel_weights.m_SrcEnd >= src_max) {
- pixel_weights.m_SrcEnd = src_max - 1;
- }
- int weight;
- weight = FXSYS_round((FX_FLOAT)(src_pos - pixel_weights.m_SrcStart - 1.0f / 2) * 256);
- if (start == end) {
- pixel_weights.m_Weights[0] = (SDP_Table[256 + weight] + SDP_Table[weight] + SDP_Table[256 - weight] + SDP_Table[512 - weight]) << 8;
- } else if ((start == pixel_weights.m_SrcStart && (pixel_weights.m_SrcStart == pixel_weights.m_SrcEnd ||
- end == pixel_weights.m_SrcEnd) && start < end) || (start < pixel_weights.m_SrcStart && pixel_weights.m_SrcStart == pixel_weights.m_SrcEnd && end == pixel_weights.m_SrcEnd)) {
- if (start < pixel_weights.m_SrcStart) {
- pixel_weights.m_Weights[0] = SDP_Table[256 + weight] << 8;
- pixel_weights.m_Weights[1] = (SDP_Table[weight] + SDP_Table[256 - weight] + SDP_Table[512 - weight]) << 8;
- } else {
- if (pixel_weights.m_SrcStart == pixel_weights.m_SrcEnd) {
- pixel_weights.m_Weights[0] = (SDP_Table[256 + weight] + SDP_Table[weight] + SDP_Table[256 - weight]) << 8;
- pixel_weights.m_Weights[1] = SDP_Table[512 - weight] << 8;
- } else {
- pixel_weights.m_Weights[0] = (SDP_Table[256 + weight] + SDP_Table[weight]) << 8;
- pixel_weights.m_Weights[1] = (SDP_Table[256 - weight] + SDP_Table[512 - weight]) << 8;
- }
- }
- if (pixel_weights.m_SrcStart == pixel_weights.m_SrcEnd) {
- pixel_weights.m_SrcEnd = end;
- }
- if (start < pixel_weights.m_SrcStart) {
- pixel_weights.m_SrcStart = start;
- }
- } else if (start == pixel_weights.m_SrcStart &&
- start < pixel_weights.m_SrcEnd &&
- pixel_weights.m_SrcEnd < end) {
- pixel_weights.m_Weights[0] = (SDP_Table[256 + weight] + SDP_Table[weight]) << 8;
- pixel_weights.m_Weights[1] = SDP_Table[256 - weight] << 8;
- pixel_weights.m_Weights[2] = SDP_Table[512 - weight] << 8;
- pixel_weights.m_SrcEnd = end;
- } else if (start < pixel_weights.m_SrcStart &&
- pixel_weights.m_SrcStart < pixel_weights.m_SrcEnd &&
- pixel_weights.m_SrcEnd == end) {
- pixel_weights.m_Weights[0] = SDP_Table[256 + weight] << 8;
- pixel_weights.m_Weights[1] = SDP_Table[weight] << 8;
- pixel_weights.m_Weights[2] = (SDP_Table[256 - weight] + SDP_Table[512 - weight]) << 8;
- pixel_weights.m_SrcStart = start;
- } else {
- pixel_weights.m_Weights[0] = SDP_Table[256 + weight] << 8;
- pixel_weights.m_Weights[1] = SDP_Table[weight] << 8;
- pixel_weights.m_Weights[2] = SDP_Table[256 - weight] << 8;
- pixel_weights.m_Weights[3] = SDP_Table[512 - weight] << 8;
- pixel_weights.m_SrcStart = start;
- pixel_weights.m_SrcEnd = end;
- }
- } else {
- pixel_weights.m_SrcStart = pixel_weights.m_SrcEnd = (int)FXSYS_floor((FX_FLOAT)src_pos);
- if (pixel_weights.m_SrcStart < src_min) {
- pixel_weights.m_SrcStart = src_min;
- }
- if (pixel_weights.m_SrcEnd >= src_max) {
- pixel_weights.m_SrcEnd = src_max - 1;
- }
- pixel_weights.m_Weights[0] = 65536;
- }
- }
- return;
- }
- for (int dest_pixel = dest_min; dest_pixel < dest_max; dest_pixel ++) {
- PixelWeight& pixel_weights = *GetPixelWeight(dest_pixel);
- double src_start = dest_pixel * scale + base;
- double src_end = src_start + scale;
- int start_i, end_i;
- if (src_start < src_end) {
- start_i = (int)FXSYS_floor((FX_FLOAT)src_start);
- end_i = (int)FXSYS_ceil((FX_FLOAT)src_end);
- } else {
- start_i = (int)FXSYS_floor((FX_FLOAT)src_end);
- end_i = (int)FXSYS_ceil((FX_FLOAT)src_start);
- }
- if (start_i < src_min) {
- start_i = src_min;
- }
- if (end_i >= src_max) {
- end_i = src_max - 1;
- }
- if (start_i > end_i) {
- if (start_i >= src_max) {
- start_i = src_max - 1;
- }
- pixel_weights.m_SrcStart = start_i;
- pixel_weights.m_SrcEnd = start_i;
- continue;
- }
- pixel_weights.m_SrcStart = start_i;
- pixel_weights.m_SrcEnd = end_i;
- for (int j = start_i; j <= end_i; j ++) {
- double dest_start = FXSYS_Div((FX_FLOAT)(j) - base, scale);
- double dest_end = FXSYS_Div((FX_FLOAT)(j + 1) - base, scale);
- if (dest_start > dest_end) {
- double temp = dest_start;
- dest_start = dest_end;
- dest_end = temp;
- }
- double area_start = dest_start > (FX_FLOAT)(dest_pixel) ? dest_start : (FX_FLOAT)(dest_pixel);
- double area_end = dest_end > (FX_FLOAT)(dest_pixel + 1) ? (FX_FLOAT)(dest_pixel + 1) : dest_end;
- double weight = area_start >= area_end ? 0.0f : area_end - area_start;
- if (weight == 0 && j == end_i) {
- pixel_weights.m_SrcEnd --;
- break;
- }
- pixel_weights.m_Weights[j - start_i] = FXSYS_round((FX_FLOAT)(weight * 65536));
- }
- }
-}
-CStretchEngine::CStretchEngine(IFX_ScanlineComposer* pDestBitmap, FXDIB_Format dest_format,
- int dest_width, int dest_height, const FX_RECT& clip_rect,
- const CFX_DIBSource* pSrcBitmap, int flags)
-{
- m_State = 0;
- m_DestFormat = dest_format;
- m_DestBpp = dest_format & 0xff;
- m_SrcBpp = pSrcBitmap->GetFormat() & 0xff;
- m_bHasAlpha = pSrcBitmap->GetFormat() & 0x200;
- m_pSrcPalette = pSrcBitmap->GetPalette();
- m_pDestBitmap = pDestBitmap;
- m_DestWidth = dest_width;
- m_DestHeight = dest_height;
- m_pInterBuf = NULL;
- m_pExtraAlphaBuf = NULL;
- m_pDestMaskScanline = NULL;
- m_DestClip = clip_rect;
- FX_DWORD size = clip_rect.Width();
- if (size && m_DestBpp > (int)(INT_MAX / size)) {
- return;
- }
- size *= m_DestBpp;
- if (size > INT_MAX - 31) {
- return;
- }
- size += 31;
- size = size / 32 * 4;
- m_pDestScanline = FX_AllocNL(FX_BYTE, size);
- if (m_pDestScanline == NULL) {
- return;
- }
- FXSYS_memset32(m_pDestScanline, 0, sizeof(FX_BYTE) * size);
- if (dest_format == FXDIB_Rgb32) {
- FXSYS_memset8(m_pDestScanline, 255, size);
- }
- m_InterPitch = (m_DestClip.Width() * m_DestBpp + 31) / 32 * 4;
- m_ExtraMaskPitch = (m_DestClip.Width() * 8 + 31) / 32 * 4;
- m_pInterBuf = NULL;
- m_pSource = pSrcBitmap;
- m_SrcWidth = pSrcBitmap->GetWidth();
- m_SrcHeight = pSrcBitmap->GetHeight();
- m_SrcPitch = (m_SrcWidth * m_SrcBpp + 31) / 32 * 4;
- if ((flags & FXDIB_NOSMOOTH) == 0) {
- FX_BOOL bInterpol = flags & FXDIB_INTERPOL || flags & FXDIB_BICUBIC_INTERPOL;
- if (!bInterpol && FXSYS_abs(dest_width) != 0 && FXSYS_abs(dest_height) < m_SrcWidth * m_SrcHeight * 8 / FXSYS_abs(dest_width)) {
- flags = FXDIB_INTERPOL;
- }
- m_Flags = flags;
- } else {
- m_Flags = FXDIB_NOSMOOTH;
- if (flags & FXDIB_DOWNSAMPLE) {
- m_Flags |= FXDIB_DOWNSAMPLE;
- }
- }
- double scale_x = FXSYS_Div((FX_FLOAT)(m_SrcWidth), (FX_FLOAT)(m_DestWidth));
- double scale_y = FXSYS_Div((FX_FLOAT)(m_SrcHeight), (FX_FLOAT)(m_DestHeight));
- double base_x = m_DestWidth > 0 ? 0.0f : (FX_FLOAT)(m_DestWidth);
- double base_y = m_DestHeight > 0 ? 0.0f : (FX_FLOAT)(m_DestHeight);
- double src_left = FXSYS_Mul(scale_x, (FX_FLOAT)(clip_rect.left) + base_x);
- double src_right = FXSYS_Mul(scale_x, (FX_FLOAT)(clip_rect.right) + base_x);
- double src_top = FXSYS_Mul(scale_y, (FX_FLOAT)(clip_rect.top) + base_y);
- double src_bottom = FXSYS_Mul(scale_y, (FX_FLOAT)(clip_rect.bottom) + base_y);
- if (src_left > src_right) {
- double temp = src_left;
- src_left = src_right;
- src_right = temp;
- }
- if (src_top > src_bottom) {
- double temp = src_top;
- src_top = src_bottom;
- src_bottom = temp;
- }
- m_SrcClip.left = (int)FXSYS_floor((FX_FLOAT)src_left);
- m_SrcClip.right = (int)FXSYS_ceil((FX_FLOAT)src_right);
- m_SrcClip.top = (int)FXSYS_floor((FX_FLOAT)src_top);
- m_SrcClip.bottom = (int)FXSYS_ceil((FX_FLOAT)src_bottom);
- FX_RECT src_rect(0, 0, m_SrcWidth, m_SrcHeight);
- m_SrcClip.Intersect(src_rect);
- if (m_SrcBpp == 1) {
- if (m_DestBpp == 8) {
- m_TransMethod = 1;
- } else {
- m_TransMethod = 2;
- }
- } else if (m_SrcBpp == 8) {
- if (m_DestBpp == 8) {
- if (!m_bHasAlpha) {
- m_TransMethod = 3;
- } else {
- m_TransMethod = 4;
- }
- } else {
- if (!m_bHasAlpha) {
- m_TransMethod = 5;
- } else {
- m_TransMethod = 6;
- }
- }
- } else {
- if (!m_bHasAlpha) {
- m_TransMethod = 7;
- } else {
- m_TransMethod = 8;
- }
- }
-}
-FX_BOOL CStretchEngine::Continue(IFX_Pause* pPause)
-{
- while (m_State == 1) {
- if (ContinueStretchHorz(pPause)) {
- return TRUE;
- }
- m_State = 2;
- StretchVert();
- }
- return FALSE;
-}
-CStretchEngine::~CStretchEngine()
-{
- if (m_pDestScanline) {
- FX_Free(m_pDestScanline);
- }
- if (m_pInterBuf) {
- FX_Free(m_pInterBuf);
- }
- if (m_pExtraAlphaBuf) {
- FX_Free(m_pExtraAlphaBuf);
- }
- if (m_pDestMaskScanline) {
- FX_Free(m_pDestMaskScanline);
- }
-}
-FX_BOOL CStretchEngine::StartStretchHorz()
-{
- if (m_DestWidth == 0 || m_pDestScanline == NULL || m_SrcClip.Height() > (int)((1U << 29) / m_InterPitch) || m_SrcClip.Height() == 0) {
- return FALSE;
- }
-#ifndef _FPDFAPI_MINI_
- m_pInterBuf = FX_AllocNL(unsigned char, m_SrcClip.Height() * m_InterPitch);
-#else
- m_pInterBuf = FX_Alloc(unsigned char, m_SrcClip.Height() * m_InterPitch);
-#endif
- if (m_pInterBuf == NULL) {
- return FALSE;
- }
- if (m_pSource && m_bHasAlpha && m_pSource->m_pAlphaMask) {
- m_pExtraAlphaBuf = FX_Alloc(unsigned char, m_SrcClip.Height() * m_ExtraMaskPitch);
- if (!m_pExtraAlphaBuf) {
- return FALSE;
- }
- FX_DWORD size = (m_DestClip.Width() * 8 + 31) / 32 * 4;
- m_pDestMaskScanline = FX_AllocNL(unsigned char, size);
- if (!m_pDestMaskScanline) {
- return FALSE;
- }
- }
- m_WeightTable.Calc(m_DestWidth, m_DestClip.left, m_DestClip.right, m_SrcWidth, m_SrcClip.left, m_SrcClip.right, m_Flags);
- if (m_WeightTable.m_pWeightTables == NULL) {
- return FALSE;
- }
- m_CurRow = m_SrcClip.top;
- m_State = 1;
- return TRUE;
-}
-#define FX_STRECH_PAUSE_ROWS 10
-FX_BOOL CStretchEngine::ContinueStretchHorz(IFX_Pause* pPause)
-{
- if (!m_DestWidth) {
- return 0;
- }
- if (m_pSource->SkipToScanline(m_CurRow, pPause)) {
- return TRUE;
- }
- int Bpp = m_DestBpp / 8;
- int rows_to_go = FX_STRECH_PAUSE_ROWS;
- for (; m_CurRow < m_SrcClip.bottom; m_CurRow ++) {
- if (rows_to_go == 0) {
- if (pPause && pPause->NeedToPauseNow()) {
- return TRUE;
- } else {
- rows_to_go = FX_STRECH_PAUSE_ROWS;
- }
- }
- FX_LPCBYTE src_scan = m_pSource->GetScanline(m_CurRow);
- FX_LPBYTE dest_scan = m_pInterBuf + (m_CurRow - m_SrcClip.top) * m_InterPitch;
- FX_LPCBYTE src_scan_mask = NULL;
- FX_LPBYTE dest_scan_mask = NULL;
- if (m_pExtraAlphaBuf) {
- src_scan_mask = m_pSource->m_pAlphaMask->GetScanline(m_CurRow);
- dest_scan_mask = m_pExtraAlphaBuf + (m_CurRow - m_SrcClip.top) * m_ExtraMaskPitch;
- }
- switch (m_TransMethod) {
- case 1:
- case 2: {
- for (int col = m_DestClip.left; col < m_DestClip.right; col ++) {
- PixelWeight* pPixelWeights = m_WeightTable.GetPixelWeight(col);
- int dest_a = 0;
- for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; j ++) {
- int pixel_weight = pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart];
- if (src_scan[j / 8] & (1 << (7 - j % 8))) {
- dest_a += pixel_weight * 255;
- }
- }
- if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
- dest_a = dest_a < 0 ? 0 : dest_a > 16711680 ? 16711680 : dest_a;
- }
- *dest_scan++ = (FX_BYTE)(dest_a >> 16);
- }
- break;
- }
- case 3: {
- for (int col = m_DestClip.left; col < m_DestClip.right; col ++) {
- PixelWeight* pPixelWeights = m_WeightTable.GetPixelWeight(col);
- int dest_a = 0;
- for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; j ++) {
- int pixel_weight = pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart];
- dest_a += pixel_weight * src_scan[j];
- }
- if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
- dest_a = dest_a < 0 ? 0 : dest_a > 16711680 ? 16711680 : dest_a;
- }
- *dest_scan++ = (FX_BYTE)(dest_a >> 16);
- }
- break;
- }
- case 4: {
- for (int col = m_DestClip.left; col < m_DestClip.right; col ++) {
- PixelWeight* pPixelWeights = m_WeightTable.GetPixelWeight(col);
- int dest_a = 0, dest_r = 0;
- for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; j ++) {
- int pixel_weight = pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart];
- pixel_weight = pixel_weight * src_scan_mask[j] / 255;
- dest_r += pixel_weight * src_scan[j];
- dest_a += pixel_weight;
- }
- if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
- dest_r = dest_r < 0 ? 0 : dest_r > 16711680 ? 16711680 : dest_r;
- dest_a = dest_a < 0 ? 0 : dest_a > 65536 ? 65536 : dest_a;
- }
- *dest_scan++ = (FX_BYTE)(dest_r >> 16);
- *dest_scan_mask++ = (FX_BYTE)((dest_a * 255) >> 16);
- }
- break;
- }
- case 5: {
- for (int col = m_DestClip.left; col < m_DestClip.right; col ++) {
- PixelWeight* pPixelWeights = m_WeightTable.GetPixelWeight(col);
- int dest_r_y = 0, dest_g_m = 0, dest_b_c = 0, dest_k = 0;
- for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; j ++) {
- int pixel_weight = pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart];
- unsigned long argb_cmyk = m_pSrcPalette[src_scan[j]];
- if (m_DestFormat == FXDIB_Rgb) {
- dest_r_y += pixel_weight * (FX_BYTE)(argb_cmyk >> 16);
- dest_g_m += pixel_weight * (FX_BYTE)(argb_cmyk >> 8);
- dest_b_c += pixel_weight * (FX_BYTE)argb_cmyk;
- } else {
- dest_b_c += pixel_weight * (FX_BYTE)(argb_cmyk >> 24);
- dest_g_m += pixel_weight * (FX_BYTE)(argb_cmyk >> 16);
- dest_r_y += pixel_weight * (FX_BYTE)(argb_cmyk >> 8);
- }
- }
- if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
- dest_r_y = dest_r_y < 0 ? 0 : dest_r_y > 16711680 ? 16711680 : dest_r_y;
- dest_g_m = dest_g_m < 0 ? 0 : dest_g_m > 16711680 ? 16711680 : dest_g_m;
- dest_b_c = dest_b_c < 0 ? 0 : dest_b_c > 16711680 ? 16711680 : dest_b_c;
- }
- *dest_scan++ = (FX_BYTE)(dest_b_c >> 16);
- *dest_scan++ = (FX_BYTE)(dest_g_m >> 16);
- *dest_scan++ = (FX_BYTE)(dest_r_y >> 16);
- }
- break;
- }
- case 6: {
- for (int col = m_DestClip.left; col < m_DestClip.right; col ++) {
- PixelWeight* pPixelWeights = m_WeightTable.GetPixelWeight(col);
- int dest_a = 0, dest_r_y = 0, dest_g_m = 0, dest_b_c = 0, dest_k = 0;
- for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; j ++) {
- int pixel_weight = pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart];
- pixel_weight = pixel_weight * src_scan_mask[j] / 255;
- unsigned long argb_cmyk = m_pSrcPalette[src_scan[j]];
- if (m_DestFormat == FXDIB_Rgba) {
- dest_r_y += pixel_weight * (FX_BYTE)(argb_cmyk >> 16);
- dest_g_m += pixel_weight * (FX_BYTE)(argb_cmyk >> 8);
- dest_b_c += pixel_weight * (FX_BYTE)argb_cmyk;
- } else {
- dest_b_c += pixel_weight * (FX_BYTE)(argb_cmyk >> 24);
- dest_g_m += pixel_weight * (FX_BYTE)(argb_cmyk >> 16);
- dest_r_y += pixel_weight * (FX_BYTE)(argb_cmyk >> 8);
- }
- dest_a += pixel_weight;
- }
- if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
- dest_k = dest_k < 0 ? 0 : dest_k > 16711680 ? 16711680 : dest_k;
- dest_b_c = dest_b_c < 0 ? 0 : dest_b_c > 16711680 ? 16711680 : dest_b_c;
- dest_g_m = dest_g_m < 0 ? 0 : dest_g_m > 16711680 ? 16711680 : dest_g_m;
- dest_r_y = dest_r_y < 0 ? 0 : dest_r_y > 16711680 ? 16711680 : dest_r_y;
- dest_a = dest_a < 0 ? 0 : dest_a > 65536 ? 65536 : dest_a;
- }
- *dest_scan++ = (FX_BYTE)(dest_b_c >> 16);
- *dest_scan++ = (FX_BYTE)(dest_g_m >> 16);
- *dest_scan++ = (FX_BYTE)(dest_r_y >> 16);
- *dest_scan_mask++ = (FX_BYTE)((dest_a * 255) >> 16);
- }
- break;
- }
- case 7: {
- for (int col = m_DestClip.left; col < m_DestClip.right; col ++) {
- PixelWeight* pPixelWeights = m_WeightTable.GetPixelWeight(col);
- int dest_r_y = 0, dest_g_m = 0, dest_b_c = 0, dest_k = 0;
- for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; j ++) {
- int pixel_weight = pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart];
- FX_LPCBYTE src_pixel = src_scan + j * Bpp;
- dest_b_c += pixel_weight * (*src_pixel++);
- dest_g_m += pixel_weight * (*src_pixel++);
- dest_r_y += pixel_weight * (*src_pixel);
- }
- if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
- dest_b_c = dest_b_c < 0 ? 0 : dest_b_c > 16711680 ? 16711680 : dest_b_c;
- dest_g_m = dest_g_m < 0 ? 0 : dest_g_m > 16711680 ? 16711680 : dest_g_m;
- dest_r_y = dest_r_y < 0 ? 0 : dest_r_y > 16711680 ? 16711680 : dest_r_y;
- }
- *dest_scan++ = (FX_BYTE)((dest_b_c) >> 16);
- *dest_scan++ = (FX_BYTE)((dest_g_m) >> 16);
- *dest_scan++ = (FX_BYTE)((dest_r_y) >> 16);
- dest_scan += Bpp - 3;
- }
- break;
- }
- case 8: {
- for (int col = m_DestClip.left; col < m_DestClip.right; col ++) {
- PixelWeight* pPixelWeights = m_WeightTable.GetPixelWeight(col);
- int dest_a = 0, dest_r_y = 0, dest_g_m = 0, dest_b_c = 0, dest_k = 0;
- for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; j ++) {
- int pixel_weight = pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart];
- FX_LPCBYTE src_pixel = src_scan + j * Bpp;
- if (m_DestFormat == FXDIB_Argb) {
- pixel_weight = pixel_weight * src_pixel[3] / 255;
- } else {
- pixel_weight = pixel_weight * src_scan_mask[j] / 255;
- }
- dest_b_c += pixel_weight * (*src_pixel++);
- dest_g_m += pixel_weight * (*src_pixel++);
- dest_r_y += pixel_weight * (*src_pixel);
- dest_a += pixel_weight;
- }
- if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
- dest_r_y = dest_r_y < 0 ? 0 : dest_r_y > 16711680 ? 16711680 : dest_r_y;
- dest_g_m = dest_g_m < 0 ? 0 : dest_g_m > 16711680 ? 16711680 : dest_g_m;
- dest_b_c = dest_b_c < 0 ? 0 : dest_b_c > 16711680 ? 16711680 : dest_b_c;
- dest_a = dest_a < 0 ? 0 : dest_a > 65536 ? 65536 : dest_a;
- }
- *dest_scan++ = (FX_BYTE)((dest_b_c) >> 16);
- *dest_scan++ = (FX_BYTE)((dest_g_m) >> 16);
- *dest_scan++ = (FX_BYTE)((dest_r_y) >> 16);
- if (m_DestFormat == FXDIB_Argb) {
- *dest_scan = (FX_BYTE)((dest_a * 255) >> 16);
- }
- if (dest_scan_mask) {
- *dest_scan_mask++ = (FX_BYTE)((dest_a * 255) >> 16);
- }
- dest_scan += Bpp - 3;
- }
- break;
- }
- }
- rows_to_go --;
- }
- return FALSE;
-}
-void CStretchEngine::StretchVert()
-{
- if (m_DestHeight == 0) {
- return;
- }
- CWeightTable table;
- table.Calc(m_DestHeight, m_DestClip.top, m_DestClip.bottom, m_SrcHeight, m_SrcClip.top, m_SrcClip.bottom, m_Flags);
- if (table.m_pWeightTables == NULL) {
- return;
- }
- int DestBpp = m_DestBpp / 8;
- for (int row = m_DestClip.top; row < m_DestClip.bottom; row ++) {
- unsigned char* dest_scan = m_pDestScanline;
- unsigned char* dest_sacn_mask = m_pDestMaskScanline;
- PixelWeight* pPixelWeights = table.GetPixelWeight(row);
- switch(m_TransMethod) {
- case 1:
- case 2:
- case 3: {
- for (int col = m_DestClip.left; col < m_DestClip.right; col ++) {
- unsigned char* src_scan = m_pInterBuf + (col - m_DestClip.left) * DestBpp;
- int dest_a = 0;
- for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; j ++) {
- int pixel_weight = pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart];
- dest_a += pixel_weight * src_scan[(j - m_SrcClip.top) * m_InterPitch];
- }
- if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
- dest_a = dest_a < 0 ? 0 : dest_a > 16711680 ? 16711680 : dest_a;
- }
- *dest_scan = (FX_BYTE)(dest_a >> 16);
- dest_scan += DestBpp;
- }
- break;
- }
- case 4: {
- for (int col = m_DestClip.left; col < m_DestClip.right; col ++) {
- unsigned char* src_scan = m_pInterBuf + (col - m_DestClip.left) * DestBpp;
- unsigned char* src_scan_mask = m_pExtraAlphaBuf + (col - m_DestClip.left);
- int dest_a = 0, dest_k = 0;
- for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; j ++) {
- int pixel_weight = pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart];
- dest_k += pixel_weight * src_scan[(j - m_SrcClip.top) * m_InterPitch];
- dest_a += pixel_weight * src_scan_mask[(j - m_SrcClip.top) * m_ExtraMaskPitch];
- }
- if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
- dest_k = dest_k < 0 ? 0 : dest_k > 16711680 ? 16711680 : dest_k;
- dest_a = dest_a < 0 ? 0 : dest_a > 16711680 ? 16711680 : dest_a;
- }
- *dest_scan = (FX_BYTE)(dest_k >> 16);
- dest_scan += DestBpp;
- *dest_sacn_mask++ = (FX_BYTE)(dest_a >> 16);
- }
- break;
- }
- case 5:
- case 7: {
- for (int col = m_DestClip.left; col < m_DestClip.right; col ++) {
- unsigned char* src_scan = m_pInterBuf + (col - m_DestClip.left) * DestBpp;
- int dest_r_y = 0, dest_g_m = 0, dest_b_c = 0, dest_k = 0;
- for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; j ++) {
- int pixel_weight = pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart];
- FX_LPCBYTE src_pixel = src_scan + (j - m_SrcClip.top) * m_InterPitch;
- dest_b_c += pixel_weight * (*src_pixel++);
- dest_g_m += pixel_weight * (*src_pixel++);
- dest_r_y += pixel_weight * (*src_pixel);
- }
- if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
- dest_r_y = dest_r_y < 0 ? 0 : dest_r_y > 16711680 ? 16711680 : dest_r_y;
- dest_g_m = dest_g_m < 0 ? 0 : dest_g_m > 16711680 ? 16711680 : dest_g_m;
- dest_b_c = dest_b_c < 0 ? 0 : dest_b_c > 16711680 ? 16711680 : dest_b_c;
- }
- dest_scan[0] = (FX_BYTE)((dest_b_c) >> 16);
- dest_scan[1] = (FX_BYTE)((dest_g_m) >> 16);
- dest_scan[2] = (FX_BYTE)((dest_r_y) >> 16);
- dest_scan += DestBpp;
- }
- break;
- }
- case 6:
- case 8: {
- for (int col = m_DestClip.left; col < m_DestClip.right; col ++) {
- unsigned char* src_scan = m_pInterBuf + (col - m_DestClip.left) * DestBpp;
- unsigned char* src_scan_mask = NULL;
- if (m_DestFormat != FXDIB_Argb) {
- src_scan_mask = m_pExtraAlphaBuf + (col - m_DestClip.left);
- }
- int dest_a = 0, dest_k = 0, dest_r_y = 0, dest_g_m = 0, dest_b_c = 0;
- for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; j ++) {
- int pixel_weight = pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart];
- FX_LPCBYTE src_pixel = src_scan + (j - m_SrcClip.top) * m_InterPitch;
- int mask_v = 255;
- if (src_scan_mask) {
- mask_v = src_scan_mask[(j - m_SrcClip.top) * m_ExtraMaskPitch];
- }
- dest_b_c += pixel_weight * (*src_pixel++);
- dest_g_m += pixel_weight * (*src_pixel++);
- dest_r_y += pixel_weight * (*src_pixel);
- if (m_DestFormat == FXDIB_Argb) {
- dest_a += pixel_weight * (*(src_pixel + 1));
- } else {
- dest_a += pixel_weight * mask_v;
- }
- }
- if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
- dest_r_y = dest_r_y < 0 ? 0 : dest_r_y > 16711680 ? 16711680 : dest_r_y;
- dest_g_m = dest_g_m < 0 ? 0 : dest_g_m > 16711680 ? 16711680 : dest_g_m;
- dest_b_c = dest_b_c < 0 ? 0 : dest_b_c > 16711680 ? 16711680 : dest_b_c;
- dest_a = dest_a < 0 ? 0 : dest_a > 16711680 ? 16711680 : dest_a;
- }
- if (dest_a) {
- int r = ((FX_DWORD)dest_r_y) * 255 / dest_a;
- int g = ((FX_DWORD)dest_g_m) * 255 / dest_a;
- int b = ((FX_DWORD)dest_b_c) * 255 / dest_a;
- dest_scan[0] = b > 255 ? 255 : b < 0 ? 0 : b;
- dest_scan[1] = g > 255 ? 255 : g < 0 ? 0 : g;
- dest_scan[2] = r > 255 ? 255 : r < 0 ? 0 : r;
- }
- if (m_DestFormat == FXDIB_Argb) {
- dest_scan[3] = (FX_BYTE)((dest_a) >> 16);
- } else {
- *dest_sacn_mask = (FX_BYTE)((dest_a) >> 16);
- }
- dest_scan += DestBpp;
- if (dest_sacn_mask) {
- dest_sacn_mask++;
- }
- }
- break;
- }
- }
- m_pDestBitmap->ComposeScanline(row - m_DestClip.top, m_pDestScanline, m_pDestMaskScanline);
- }
-}
-CFX_ImageStretcher::CFX_ImageStretcher()
-{
- m_pScanline = NULL;
- m_pStretchEngine = NULL;
- m_pMaskScanline = NULL;
-}
-CFX_ImageStretcher::~CFX_ImageStretcher()
-{
- if (m_pScanline) {
- FX_Free(m_pScanline);
- }
- if (m_pStretchEngine) {
- delete m_pStretchEngine;
- }
- if (m_pMaskScanline) {
- FX_Free(m_pMaskScanline);
- }
-}
-FXDIB_Format _GetStretchedFormat(const CFX_DIBSource* pSrc)
-{
- FXDIB_Format format = pSrc->GetFormat();
- if (format == FXDIB_1bppMask) {
- format = FXDIB_8bppMask;
- } else if (format == FXDIB_1bppRgb) {
- format = FXDIB_8bppRgb;
- } else if (format == FXDIB_8bppRgb) {
- if (pSrc->GetPalette()) {
- format = FXDIB_Rgb;
- }
- }
- return format;
-}
-FX_BOOL CFX_ImageStretcher::Start(IFX_ScanlineComposer* pDest,
- const CFX_DIBSource* pSource, int dest_width, int dest_height,
- const FX_RECT& rect, FX_DWORD flags)
-{
- m_DestFormat = _GetStretchedFormat(pSource);
- m_DestBPP = m_DestFormat & 0xff;
- m_pDest = pDest;
- m_pSource = pSource;
- m_DestWidth = dest_width;
- m_DestHeight = dest_height;
- m_ClipRect = rect;
- m_Flags = flags;
- if (pSource->GetFormat() == FXDIB_1bppRgb && pSource->GetPalette()) {
- FX_ARGB pal[256];
- int a0, r0, g0, b0, a1, r1, g1, b1;
- ArgbDecode(pSource->GetPaletteEntry(0), a0, r0, g0, b0);
- ArgbDecode(pSource->GetPaletteEntry(1), a1, r1, g1, b1);
- for (int i = 0; i < 256; i ++) {
- int a = a0 + (a1 - a0) * i / 255;
- int r = r0 + (r1 - r0) * i / 255;
- int g = g0 + (g1 - g0) * i / 255;
- int b = b0 + (b1 - b0) * i / 255;
- pal[i] = ArgbEncode(a, r, g, b);
- }
- if (!pDest->SetInfo(rect.Width(), rect.Height(), m_DestFormat, pal)) {
- return FALSE;
- }
- } else if (pSource->GetFormat() == FXDIB_1bppCmyk && pSource->GetPalette()) {
- FX_CMYK pal[256];
- int c0, m0, y0, k0, c1, m1, y1, k1;
- CmykDecode(pSource->GetPaletteEntry(0), c0, m0, y0, k0);
- CmykDecode(pSource->GetPaletteEntry(1), c1, m1, y1, k1);
- for (int i = 0; i < 256; i ++) {
- int c = c0 + (c1 - c0) * i / 255;
- int m = m0 + (m1 - m0) * i / 255;
- int y = y0 + (y1 - y0) * i / 255;
- int k = k0 + (k1 - k0) * i / 255;
- pal[i] = CmykEncode(c, m, y, k);
- }
- if (!pDest->SetInfo(rect.Width(), rect.Height(), m_DestFormat, pal)) {
- return FALSE;
- }
- } else if (!pDest->SetInfo(rect.Width(), rect.Height(), m_DestFormat, NULL)) {
- return FALSE;
- }
- if (flags & FXDIB_DOWNSAMPLE) {
- return StartQuickStretch();
- } else {
- return StartStretch();
- }
-}
-FX_BOOL CFX_ImageStretcher::Continue(IFX_Pause* pPause)
-{
- if (m_Flags & FXDIB_DOWNSAMPLE) {
- return ContinueQuickStretch(pPause);
- } else {
- return ContinueStretch(pPause);
- }
-}
-#ifndef _FPDFAPI_MINI_
-#define MAX_PROGRESSIVE_STRETCH_PIXELS 1000000
-#else
-#define MAX_PROGRESSIVE_STRETCH_PIXELS 100000
-#endif
-FX_BOOL CFX_ImageStretcher::StartStretch()
-{
- m_pStretchEngine = FX_NEW CStretchEngine(m_pDest, m_DestFormat, m_DestWidth, m_DestHeight, m_ClipRect, m_pSource, m_Flags);
- if (!m_pStretchEngine) {
- return FALSE;
- }
- m_pStretchEngine->StartStretchHorz();
- if (m_pSource->GetWidth() * m_pSource->GetHeight() < MAX_PROGRESSIVE_STRETCH_PIXELS) {
- m_pStretchEngine->Continue(NULL);
- return FALSE;
- }
- return TRUE;
-}
-FX_BOOL CFX_ImageStretcher::ContinueStretch(IFX_Pause* pPause)
-{
- if (m_pStretchEngine == NULL) {
- return FALSE;
- }
- return m_pStretchEngine->Continue(pPause);
-}
-FX_BOOL CFX_ImageStretcher::StartQuickStretch()
-{
-#ifdef _FPDFAPI_MINI_
- m_pSource->SetDownSampleSize(m_DestWidth, m_DestHeight);
-#endif
- m_bFlipX = FALSE;
- m_bFlipY = FALSE;
- if (m_DestWidth < 0) {
- m_bFlipX = TRUE;
- m_DestWidth = -m_DestWidth;
- }
- if (m_DestHeight < 0) {
- m_bFlipY = TRUE;
- m_DestHeight = -m_DestHeight;
- }
- m_LineIndex = 0;
- FX_DWORD size = m_ClipRect.Width();
- if (size && m_DestBPP > (int)(INT_MAX / size)) {
- return FALSE;
- }
- size *= m_DestBPP;
- m_pScanline = FX_Alloc(FX_BYTE, (size / 8 + 3) / 4 * 4);
- if (!m_pScanline) {
- return FALSE;
- }
- if (m_pSource->m_pAlphaMask) {
- m_pMaskScanline = FX_Alloc(FX_BYTE, (m_ClipRect.Width() + 3) / 4 * 4);
- if (!m_pMaskScanline) {
- return FALSE;
- }
- }
- if (m_pSource->GetWidth() * m_pSource->GetHeight() < MAX_PROGRESSIVE_STRETCH_PIXELS) {
- ContinueQuickStretch(NULL);
- return FALSE;
- }
- return TRUE;
-}
-FX_BOOL CFX_ImageStretcher::ContinueQuickStretch(IFX_Pause* pPause)
-{
- if (m_pScanline == NULL) {
- return FALSE;
- }
- int result_width = m_ClipRect.Width(), result_height = m_ClipRect.Height();
- int src_width = m_pSource->GetWidth(), src_height = m_pSource->GetHeight();
- for (; m_LineIndex < result_height; m_LineIndex ++) {
- int dest_y, src_y;
- if (m_bFlipY) {
- dest_y = result_height - m_LineIndex - 1;
- src_y = (m_DestHeight - (dest_y + m_ClipRect.top) - 1) * src_height / m_DestHeight;
- } else {
- dest_y = m_LineIndex;
- src_y = (dest_y + m_ClipRect.top) * src_height / m_DestHeight;
- }
- if (src_y >= src_height) {
- src_y = src_height - 1;
- }
- if (src_y < 0) {
- src_y = 0;
- }
- if (m_pSource->SkipToScanline(src_y, pPause)) {
- return TRUE;
- }
- m_pSource->DownSampleScanline(src_y, m_pScanline, m_DestBPP, m_DestWidth, m_bFlipX, m_ClipRect.left, result_width);
- FX_LPBYTE scan_extra_alpha = NULL;
- if (m_pMaskScanline) {
- m_pSource->m_pAlphaMask->DownSampleScanline(src_y, m_pMaskScanline, 1, m_DestWidth, m_bFlipX, m_ClipRect.left, result_width);
- }
- m_pDest->ComposeScanline(dest_y, m_pScanline, m_pMaskScanline);
- }
- return FALSE;
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxge/fx_dib.h"
+#include "../../../include/fxge/fx_ge.h"
+#include "dib_int.h"
+#include <limits.h>
+extern int SDP_Table[513];
+void CWeightTable::Calc(int dest_len, int dest_min, int dest_max, int src_len, int src_min, int src_max, int flags)
+{
+ if (m_pWeightTables) {
+ FX_Free(m_pWeightTables);
+ m_pWeightTables = NULL;
+ }
+ double scale, base;
+ scale = FXSYS_Div((FX_FLOAT)(src_len), (FX_FLOAT)(dest_len));
+ if (dest_len < 0) {
+ base = (FX_FLOAT)(src_len);
+ } else {
+ base = 0;
+ }
+ int ext_size = flags & FXDIB_BICUBIC_INTERPOL ? 3 : 1;
+ m_ItemSize = sizeof(int) * 2 + (int)(sizeof(int) * (FXSYS_ceil(FXSYS_fabs((FX_FLOAT)scale)) + ext_size));
+ m_DestMin = dest_min;
+ if ((dest_max - dest_min) > (int)((1U << 30) - 4) / m_ItemSize) {
+ return;
+ }
+ m_pWeightTables = FX_AllocNL(FX_BYTE, (dest_max - dest_min) * m_ItemSize + 4);
+ if (m_pWeightTables == NULL) {
+ return;
+ }
+ FXSYS_memset32(m_pWeightTables, 0, sizeof(FX_BYTE) * ((dest_max - dest_min)*m_ItemSize + 4));
+ if ((flags & FXDIB_NOSMOOTH) != 0 || FXSYS_fabs((FX_FLOAT)scale) < 1.0f) {
+ for (int dest_pixel = dest_min; dest_pixel < dest_max; dest_pixel ++) {
+ PixelWeight& pixel_weights = *GetPixelWeight(dest_pixel);
+ double src_pos = dest_pixel * scale + scale / 2 + base;
+ if (flags & FXDIB_INTERPOL) {
+ pixel_weights.m_SrcStart = (int)FXSYS_floor((FX_FLOAT)src_pos - 1.0f / 2);
+ pixel_weights.m_SrcEnd = (int)FXSYS_floor((FX_FLOAT)src_pos + 1.0f / 2);
+ if (pixel_weights.m_SrcStart < src_min) {
+ pixel_weights.m_SrcStart = src_min;
+ }
+ if (pixel_weights.m_SrcEnd >= src_max) {
+ pixel_weights.m_SrcEnd = src_max - 1;
+ }
+ if (pixel_weights.m_SrcStart == pixel_weights.m_SrcEnd) {
+ pixel_weights.m_Weights[0] = 65536;
+ } else {
+ pixel_weights.m_Weights[1] = FXSYS_round((FX_FLOAT)(src_pos - pixel_weights.m_SrcStart - 1.0f / 2) * 65536);
+ pixel_weights.m_Weights[0] = 65536 - pixel_weights.m_Weights[1];
+ }
+ } else if (flags & FXDIB_BICUBIC_INTERPOL) {
+ pixel_weights.m_SrcStart = (int)FXSYS_floor((FX_FLOAT)src_pos - 1.0f / 2);
+ pixel_weights.m_SrcEnd = (int)FXSYS_floor((FX_FLOAT)src_pos + 1.0f / 2);
+ int start = pixel_weights.m_SrcStart - 1;
+ int end = pixel_weights.m_SrcEnd + 1;
+ if (start < src_min) {
+ start = src_min;
+ }
+ if (end >= src_max) {
+ end = src_max - 1;
+ }
+ if (pixel_weights.m_SrcStart < src_min) {
+ src_pos += src_min - pixel_weights.m_SrcStart;
+ pixel_weights.m_SrcStart = src_min;
+ }
+ if (pixel_weights.m_SrcEnd >= src_max) {
+ pixel_weights.m_SrcEnd = src_max - 1;
+ }
+ int weight;
+ weight = FXSYS_round((FX_FLOAT)(src_pos - pixel_weights.m_SrcStart - 1.0f / 2) * 256);
+ if (start == end) {
+ pixel_weights.m_Weights[0] = (SDP_Table[256 + weight] + SDP_Table[weight] + SDP_Table[256 - weight] + SDP_Table[512 - weight]) << 8;
+ } else if ((start == pixel_weights.m_SrcStart && (pixel_weights.m_SrcStart == pixel_weights.m_SrcEnd ||
+ end == pixel_weights.m_SrcEnd) && start < end) || (start < pixel_weights.m_SrcStart && pixel_weights.m_SrcStart == pixel_weights.m_SrcEnd && end == pixel_weights.m_SrcEnd)) {
+ if (start < pixel_weights.m_SrcStart) {
+ pixel_weights.m_Weights[0] = SDP_Table[256 + weight] << 8;
+ pixel_weights.m_Weights[1] = (SDP_Table[weight] + SDP_Table[256 - weight] + SDP_Table[512 - weight]) << 8;
+ } else {
+ if (pixel_weights.m_SrcStart == pixel_weights.m_SrcEnd) {
+ pixel_weights.m_Weights[0] = (SDP_Table[256 + weight] + SDP_Table[weight] + SDP_Table[256 - weight]) << 8;
+ pixel_weights.m_Weights[1] = SDP_Table[512 - weight] << 8;
+ } else {
+ pixel_weights.m_Weights[0] = (SDP_Table[256 + weight] + SDP_Table[weight]) << 8;
+ pixel_weights.m_Weights[1] = (SDP_Table[256 - weight] + SDP_Table[512 - weight]) << 8;
+ }
+ }
+ if (pixel_weights.m_SrcStart == pixel_weights.m_SrcEnd) {
+ pixel_weights.m_SrcEnd = end;
+ }
+ if (start < pixel_weights.m_SrcStart) {
+ pixel_weights.m_SrcStart = start;
+ }
+ } else if (start == pixel_weights.m_SrcStart &&
+ start < pixel_weights.m_SrcEnd &&
+ pixel_weights.m_SrcEnd < end) {
+ pixel_weights.m_Weights[0] = (SDP_Table[256 + weight] + SDP_Table[weight]) << 8;
+ pixel_weights.m_Weights[1] = SDP_Table[256 - weight] << 8;
+ pixel_weights.m_Weights[2] = SDP_Table[512 - weight] << 8;
+ pixel_weights.m_SrcEnd = end;
+ } else if (start < pixel_weights.m_SrcStart &&
+ pixel_weights.m_SrcStart < pixel_weights.m_SrcEnd &&
+ pixel_weights.m_SrcEnd == end) {
+ pixel_weights.m_Weights[0] = SDP_Table[256 + weight] << 8;
+ pixel_weights.m_Weights[1] = SDP_Table[weight] << 8;
+ pixel_weights.m_Weights[2] = (SDP_Table[256 - weight] + SDP_Table[512 - weight]) << 8;
+ pixel_weights.m_SrcStart = start;
+ } else {
+ pixel_weights.m_Weights[0] = SDP_Table[256 + weight] << 8;
+ pixel_weights.m_Weights[1] = SDP_Table[weight] << 8;
+ pixel_weights.m_Weights[2] = SDP_Table[256 - weight] << 8;
+ pixel_weights.m_Weights[3] = SDP_Table[512 - weight] << 8;
+ pixel_weights.m_SrcStart = start;
+ pixel_weights.m_SrcEnd = end;
+ }
+ } else {
+ pixel_weights.m_SrcStart = pixel_weights.m_SrcEnd = (int)FXSYS_floor((FX_FLOAT)src_pos);
+ if (pixel_weights.m_SrcStart < src_min) {
+ pixel_weights.m_SrcStart = src_min;
+ }
+ if (pixel_weights.m_SrcEnd >= src_max) {
+ pixel_weights.m_SrcEnd = src_max - 1;
+ }
+ pixel_weights.m_Weights[0] = 65536;
+ }
+ }
+ return;
+ }
+ for (int dest_pixel = dest_min; dest_pixel < dest_max; dest_pixel ++) {
+ PixelWeight& pixel_weights = *GetPixelWeight(dest_pixel);
+ double src_start = dest_pixel * scale + base;
+ double src_end = src_start + scale;
+ int start_i, end_i;
+ if (src_start < src_end) {
+ start_i = (int)FXSYS_floor((FX_FLOAT)src_start);
+ end_i = (int)FXSYS_ceil((FX_FLOAT)src_end);
+ } else {
+ start_i = (int)FXSYS_floor((FX_FLOAT)src_end);
+ end_i = (int)FXSYS_ceil((FX_FLOAT)src_start);
+ }
+ if (start_i < src_min) {
+ start_i = src_min;
+ }
+ if (end_i >= src_max) {
+ end_i = src_max - 1;
+ }
+ if (start_i > end_i) {
+ if (start_i >= src_max) {
+ start_i = src_max - 1;
+ }
+ pixel_weights.m_SrcStart = start_i;
+ pixel_weights.m_SrcEnd = start_i;
+ continue;
+ }
+ pixel_weights.m_SrcStart = start_i;
+ pixel_weights.m_SrcEnd = end_i;
+ for (int j = start_i; j <= end_i; j ++) {
+ double dest_start = FXSYS_Div((FX_FLOAT)(j) - base, scale);
+ double dest_end = FXSYS_Div((FX_FLOAT)(j + 1) - base, scale);
+ if (dest_start > dest_end) {
+ double temp = dest_start;
+ dest_start = dest_end;
+ dest_end = temp;
+ }
+ double area_start = dest_start > (FX_FLOAT)(dest_pixel) ? dest_start : (FX_FLOAT)(dest_pixel);
+ double area_end = dest_end > (FX_FLOAT)(dest_pixel + 1) ? (FX_FLOAT)(dest_pixel + 1) : dest_end;
+ double weight = area_start >= area_end ? 0.0f : area_end - area_start;
+ if (weight == 0 && j == end_i) {
+ pixel_weights.m_SrcEnd --;
+ break;
+ }
+ pixel_weights.m_Weights[j - start_i] = FXSYS_round((FX_FLOAT)(weight * 65536));
+ }
+ }
+}
+CStretchEngine::CStretchEngine(IFX_ScanlineComposer* pDestBitmap, FXDIB_Format dest_format,
+ int dest_width, int dest_height, const FX_RECT& clip_rect,
+ const CFX_DIBSource* pSrcBitmap, int flags)
+{
+ m_State = 0;
+ m_DestFormat = dest_format;
+ m_DestBpp = dest_format & 0xff;
+ m_SrcBpp = pSrcBitmap->GetFormat() & 0xff;
+ m_bHasAlpha = pSrcBitmap->GetFormat() & 0x200;
+ m_pSrcPalette = pSrcBitmap->GetPalette();
+ m_pDestBitmap = pDestBitmap;
+ m_DestWidth = dest_width;
+ m_DestHeight = dest_height;
+ m_pInterBuf = NULL;
+ m_pExtraAlphaBuf = NULL;
+ m_pDestMaskScanline = NULL;
+ m_DestClip = clip_rect;
+ FX_DWORD size = clip_rect.Width();
+ if (size && m_DestBpp > (int)(INT_MAX / size)) {
+ return;
+ }
+ size *= m_DestBpp;
+ if (size > INT_MAX - 31) {
+ return;
+ }
+ size += 31;
+ size = size / 32 * 4;
+ m_pDestScanline = FX_AllocNL(FX_BYTE, size);
+ if (m_pDestScanline == NULL) {
+ return;
+ }
+ FXSYS_memset32(m_pDestScanline, 0, sizeof(FX_BYTE) * size);
+ if (dest_format == FXDIB_Rgb32) {
+ FXSYS_memset8(m_pDestScanline, 255, size);
+ }
+ m_InterPitch = (m_DestClip.Width() * m_DestBpp + 31) / 32 * 4;
+ m_ExtraMaskPitch = (m_DestClip.Width() * 8 + 31) / 32 * 4;
+ m_pInterBuf = NULL;
+ m_pSource = pSrcBitmap;
+ m_SrcWidth = pSrcBitmap->GetWidth();
+ m_SrcHeight = pSrcBitmap->GetHeight();
+ m_SrcPitch = (m_SrcWidth * m_SrcBpp + 31) / 32 * 4;
+ if ((flags & FXDIB_NOSMOOTH) == 0) {
+ FX_BOOL bInterpol = flags & FXDIB_INTERPOL || flags & FXDIB_BICUBIC_INTERPOL;
+ if (!bInterpol && FXSYS_abs(dest_width) != 0 && FXSYS_abs(dest_height) < m_SrcWidth * m_SrcHeight * 8 / FXSYS_abs(dest_width)) {
+ flags = FXDIB_INTERPOL;
+ }
+ m_Flags = flags;
+ } else {
+ m_Flags = FXDIB_NOSMOOTH;
+ if (flags & FXDIB_DOWNSAMPLE) {
+ m_Flags |= FXDIB_DOWNSAMPLE;
+ }
+ }
+ double scale_x = FXSYS_Div((FX_FLOAT)(m_SrcWidth), (FX_FLOAT)(m_DestWidth));
+ double scale_y = FXSYS_Div((FX_FLOAT)(m_SrcHeight), (FX_FLOAT)(m_DestHeight));
+ double base_x = m_DestWidth > 0 ? 0.0f : (FX_FLOAT)(m_DestWidth);
+ double base_y = m_DestHeight > 0 ? 0.0f : (FX_FLOAT)(m_DestHeight);
+ double src_left = FXSYS_Mul(scale_x, (FX_FLOAT)(clip_rect.left) + base_x);
+ double src_right = FXSYS_Mul(scale_x, (FX_FLOAT)(clip_rect.right) + base_x);
+ double src_top = FXSYS_Mul(scale_y, (FX_FLOAT)(clip_rect.top) + base_y);
+ double src_bottom = FXSYS_Mul(scale_y, (FX_FLOAT)(clip_rect.bottom) + base_y);
+ if (src_left > src_right) {
+ double temp = src_left;
+ src_left = src_right;
+ src_right = temp;
+ }
+ if (src_top > src_bottom) {
+ double temp = src_top;
+ src_top = src_bottom;
+ src_bottom = temp;
+ }
+ m_SrcClip.left = (int)FXSYS_floor((FX_FLOAT)src_left);
+ m_SrcClip.right = (int)FXSYS_ceil((FX_FLOAT)src_right);
+ m_SrcClip.top = (int)FXSYS_floor((FX_FLOAT)src_top);
+ m_SrcClip.bottom = (int)FXSYS_ceil((FX_FLOAT)src_bottom);
+ FX_RECT src_rect(0, 0, m_SrcWidth, m_SrcHeight);
+ m_SrcClip.Intersect(src_rect);
+ if (m_SrcBpp == 1) {
+ if (m_DestBpp == 8) {
+ m_TransMethod = 1;
+ } else {
+ m_TransMethod = 2;
+ }
+ } else if (m_SrcBpp == 8) {
+ if (m_DestBpp == 8) {
+ if (!m_bHasAlpha) {
+ m_TransMethod = 3;
+ } else {
+ m_TransMethod = 4;
+ }
+ } else {
+ if (!m_bHasAlpha) {
+ m_TransMethod = 5;
+ } else {
+ m_TransMethod = 6;
+ }
+ }
+ } else {
+ if (!m_bHasAlpha) {
+ m_TransMethod = 7;
+ } else {
+ m_TransMethod = 8;
+ }
+ }
+}
+FX_BOOL CStretchEngine::Continue(IFX_Pause* pPause)
+{
+ while (m_State == 1) {
+ if (ContinueStretchHorz(pPause)) {
+ return TRUE;
+ }
+ m_State = 2;
+ StretchVert();
+ }
+ return FALSE;
+}
+CStretchEngine::~CStretchEngine()
+{
+ if (m_pDestScanline) {
+ FX_Free(m_pDestScanline);
+ }
+ if (m_pInterBuf) {
+ FX_Free(m_pInterBuf);
+ }
+ if (m_pExtraAlphaBuf) {
+ FX_Free(m_pExtraAlphaBuf);
+ }
+ if (m_pDestMaskScanline) {
+ FX_Free(m_pDestMaskScanline);
+ }
+}
+FX_BOOL CStretchEngine::StartStretchHorz()
+{
+ if (m_DestWidth == 0 || m_pDestScanline == NULL || m_SrcClip.Height() > (int)((1U << 29) / m_InterPitch) || m_SrcClip.Height() == 0) {
+ return FALSE;
+ }
+#ifndef _FPDFAPI_MINI_
+ m_pInterBuf = FX_AllocNL(unsigned char, m_SrcClip.Height() * m_InterPitch);
+#else
+ m_pInterBuf = FX_Alloc(unsigned char, m_SrcClip.Height() * m_InterPitch);
+#endif
+ if (m_pInterBuf == NULL) {
+ return FALSE;
+ }
+ if (m_pSource && m_bHasAlpha && m_pSource->m_pAlphaMask) {
+ m_pExtraAlphaBuf = FX_Alloc(unsigned char, m_SrcClip.Height() * m_ExtraMaskPitch);
+ if (!m_pExtraAlphaBuf) {
+ return FALSE;
+ }
+ FX_DWORD size = (m_DestClip.Width() * 8 + 31) / 32 * 4;
+ m_pDestMaskScanline = FX_AllocNL(unsigned char, size);
+ if (!m_pDestMaskScanline) {
+ return FALSE;
+ }
+ }
+ m_WeightTable.Calc(m_DestWidth, m_DestClip.left, m_DestClip.right, m_SrcWidth, m_SrcClip.left, m_SrcClip.right, m_Flags);
+ if (m_WeightTable.m_pWeightTables == NULL) {
+ return FALSE;
+ }
+ m_CurRow = m_SrcClip.top;
+ m_State = 1;
+ return TRUE;
+}
+#define FX_STRECH_PAUSE_ROWS 10
+FX_BOOL CStretchEngine::ContinueStretchHorz(IFX_Pause* pPause)
+{
+ if (!m_DestWidth) {
+ return 0;
+ }
+ if (m_pSource->SkipToScanline(m_CurRow, pPause)) {
+ return TRUE;
+ }
+ int Bpp = m_DestBpp / 8;
+ int rows_to_go = FX_STRECH_PAUSE_ROWS;
+ for (; m_CurRow < m_SrcClip.bottom; m_CurRow ++) {
+ if (rows_to_go == 0) {
+ if (pPause && pPause->NeedToPauseNow()) {
+ return TRUE;
+ } else {
+ rows_to_go = FX_STRECH_PAUSE_ROWS;
+ }
+ }
+ FX_LPCBYTE src_scan = m_pSource->GetScanline(m_CurRow);
+ FX_LPBYTE dest_scan = m_pInterBuf + (m_CurRow - m_SrcClip.top) * m_InterPitch;
+ FX_LPCBYTE src_scan_mask = NULL;
+ FX_LPBYTE dest_scan_mask = NULL;
+ if (m_pExtraAlphaBuf) {
+ src_scan_mask = m_pSource->m_pAlphaMask->GetScanline(m_CurRow);
+ dest_scan_mask = m_pExtraAlphaBuf + (m_CurRow - m_SrcClip.top) * m_ExtraMaskPitch;
+ }
+ switch (m_TransMethod) {
+ case 1:
+ case 2: {
+ for (int col = m_DestClip.left; col < m_DestClip.right; col ++) {
+ PixelWeight* pPixelWeights = m_WeightTable.GetPixelWeight(col);
+ int dest_a = 0;
+ for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; j ++) {
+ int pixel_weight = pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart];
+ if (src_scan[j / 8] & (1 << (7 - j % 8))) {
+ dest_a += pixel_weight * 255;
+ }
+ }
+ if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
+ dest_a = dest_a < 0 ? 0 : dest_a > 16711680 ? 16711680 : dest_a;
+ }
+ *dest_scan++ = (FX_BYTE)(dest_a >> 16);
+ }
+ break;
+ }
+ case 3: {
+ for (int col = m_DestClip.left; col < m_DestClip.right; col ++) {
+ PixelWeight* pPixelWeights = m_WeightTable.GetPixelWeight(col);
+ int dest_a = 0;
+ for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; j ++) {
+ int pixel_weight = pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart];
+ dest_a += pixel_weight * src_scan[j];
+ }
+ if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
+ dest_a = dest_a < 0 ? 0 : dest_a > 16711680 ? 16711680 : dest_a;
+ }
+ *dest_scan++ = (FX_BYTE)(dest_a >> 16);
+ }
+ break;
+ }
+ case 4: {
+ for (int col = m_DestClip.left; col < m_DestClip.right; col ++) {
+ PixelWeight* pPixelWeights = m_WeightTable.GetPixelWeight(col);
+ int dest_a = 0, dest_r = 0;
+ for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; j ++) {
+ int pixel_weight = pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart];
+ pixel_weight = pixel_weight * src_scan_mask[j] / 255;
+ dest_r += pixel_weight * src_scan[j];
+ dest_a += pixel_weight;
+ }
+ if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
+ dest_r = dest_r < 0 ? 0 : dest_r > 16711680 ? 16711680 : dest_r;
+ dest_a = dest_a < 0 ? 0 : dest_a > 65536 ? 65536 : dest_a;
+ }
+ *dest_scan++ = (FX_BYTE)(dest_r >> 16);
+ *dest_scan_mask++ = (FX_BYTE)((dest_a * 255) >> 16);
+ }
+ break;
+ }
+ case 5: {
+ for (int col = m_DestClip.left; col < m_DestClip.right; col ++) {
+ PixelWeight* pPixelWeights = m_WeightTable.GetPixelWeight(col);
+ int dest_r_y = 0, dest_g_m = 0, dest_b_c = 0, dest_k = 0;
+ for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; j ++) {
+ int pixel_weight = pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart];
+ unsigned long argb_cmyk = m_pSrcPalette[src_scan[j]];
+ if (m_DestFormat == FXDIB_Rgb) {
+ dest_r_y += pixel_weight * (FX_BYTE)(argb_cmyk >> 16);
+ dest_g_m += pixel_weight * (FX_BYTE)(argb_cmyk >> 8);
+ dest_b_c += pixel_weight * (FX_BYTE)argb_cmyk;
+ } else {
+ dest_b_c += pixel_weight * (FX_BYTE)(argb_cmyk >> 24);
+ dest_g_m += pixel_weight * (FX_BYTE)(argb_cmyk >> 16);
+ dest_r_y += pixel_weight * (FX_BYTE)(argb_cmyk >> 8);
+ }
+ }
+ if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
+ dest_r_y = dest_r_y < 0 ? 0 : dest_r_y > 16711680 ? 16711680 : dest_r_y;
+ dest_g_m = dest_g_m < 0 ? 0 : dest_g_m > 16711680 ? 16711680 : dest_g_m;
+ dest_b_c = dest_b_c < 0 ? 0 : dest_b_c > 16711680 ? 16711680 : dest_b_c;
+ }
+ *dest_scan++ = (FX_BYTE)(dest_b_c >> 16);
+ *dest_scan++ = (FX_BYTE)(dest_g_m >> 16);
+ *dest_scan++ = (FX_BYTE)(dest_r_y >> 16);
+ }
+ break;
+ }
+ case 6: {
+ for (int col = m_DestClip.left; col < m_DestClip.right; col ++) {
+ PixelWeight* pPixelWeights = m_WeightTable.GetPixelWeight(col);
+ int dest_a = 0, dest_r_y = 0, dest_g_m = 0, dest_b_c = 0, dest_k = 0;
+ for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; j ++) {
+ int pixel_weight = pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart];
+ pixel_weight = pixel_weight * src_scan_mask[j] / 255;
+ unsigned long argb_cmyk = m_pSrcPalette[src_scan[j]];
+ if (m_DestFormat == FXDIB_Rgba) {
+ dest_r_y += pixel_weight * (FX_BYTE)(argb_cmyk >> 16);
+ dest_g_m += pixel_weight * (FX_BYTE)(argb_cmyk >> 8);
+ dest_b_c += pixel_weight * (FX_BYTE)argb_cmyk;
+ } else {
+ dest_b_c += pixel_weight * (FX_BYTE)(argb_cmyk >> 24);
+ dest_g_m += pixel_weight * (FX_BYTE)(argb_cmyk >> 16);
+ dest_r_y += pixel_weight * (FX_BYTE)(argb_cmyk >> 8);
+ }
+ dest_a += pixel_weight;
+ }
+ if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
+ dest_k = dest_k < 0 ? 0 : dest_k > 16711680 ? 16711680 : dest_k;
+ dest_b_c = dest_b_c < 0 ? 0 : dest_b_c > 16711680 ? 16711680 : dest_b_c;
+ dest_g_m = dest_g_m < 0 ? 0 : dest_g_m > 16711680 ? 16711680 : dest_g_m;
+ dest_r_y = dest_r_y < 0 ? 0 : dest_r_y > 16711680 ? 16711680 : dest_r_y;
+ dest_a = dest_a < 0 ? 0 : dest_a > 65536 ? 65536 : dest_a;
+ }
+ *dest_scan++ = (FX_BYTE)(dest_b_c >> 16);
+ *dest_scan++ = (FX_BYTE)(dest_g_m >> 16);
+ *dest_scan++ = (FX_BYTE)(dest_r_y >> 16);
+ *dest_scan_mask++ = (FX_BYTE)((dest_a * 255) >> 16);
+ }
+ break;
+ }
+ case 7: {
+ for (int col = m_DestClip.left; col < m_DestClip.right; col ++) {
+ PixelWeight* pPixelWeights = m_WeightTable.GetPixelWeight(col);
+ int dest_r_y = 0, dest_g_m = 0, dest_b_c = 0, dest_k = 0;
+ for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; j ++) {
+ int pixel_weight = pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart];
+ FX_LPCBYTE src_pixel = src_scan + j * Bpp;
+ dest_b_c += pixel_weight * (*src_pixel++);
+ dest_g_m += pixel_weight * (*src_pixel++);
+ dest_r_y += pixel_weight * (*src_pixel);
+ }
+ if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
+ dest_b_c = dest_b_c < 0 ? 0 : dest_b_c > 16711680 ? 16711680 : dest_b_c;
+ dest_g_m = dest_g_m < 0 ? 0 : dest_g_m > 16711680 ? 16711680 : dest_g_m;
+ dest_r_y = dest_r_y < 0 ? 0 : dest_r_y > 16711680 ? 16711680 : dest_r_y;
+ }
+ *dest_scan++ = (FX_BYTE)((dest_b_c) >> 16);
+ *dest_scan++ = (FX_BYTE)((dest_g_m) >> 16);
+ *dest_scan++ = (FX_BYTE)((dest_r_y) >> 16);
+ dest_scan += Bpp - 3;
+ }
+ break;
+ }
+ case 8: {
+ for (int col = m_DestClip.left; col < m_DestClip.right; col ++) {
+ PixelWeight* pPixelWeights = m_WeightTable.GetPixelWeight(col);
+ int dest_a = 0, dest_r_y = 0, dest_g_m = 0, dest_b_c = 0, dest_k = 0;
+ for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; j ++) {
+ int pixel_weight = pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart];
+ FX_LPCBYTE src_pixel = src_scan + j * Bpp;
+ if (m_DestFormat == FXDIB_Argb) {
+ pixel_weight = pixel_weight * src_pixel[3] / 255;
+ } else {
+ pixel_weight = pixel_weight * src_scan_mask[j] / 255;
+ }
+ dest_b_c += pixel_weight * (*src_pixel++);
+ dest_g_m += pixel_weight * (*src_pixel++);
+ dest_r_y += pixel_weight * (*src_pixel);
+ dest_a += pixel_weight;
+ }
+ if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
+ dest_r_y = dest_r_y < 0 ? 0 : dest_r_y > 16711680 ? 16711680 : dest_r_y;
+ dest_g_m = dest_g_m < 0 ? 0 : dest_g_m > 16711680 ? 16711680 : dest_g_m;
+ dest_b_c = dest_b_c < 0 ? 0 : dest_b_c > 16711680 ? 16711680 : dest_b_c;
+ dest_a = dest_a < 0 ? 0 : dest_a > 65536 ? 65536 : dest_a;
+ }
+ *dest_scan++ = (FX_BYTE)((dest_b_c) >> 16);
+ *dest_scan++ = (FX_BYTE)((dest_g_m) >> 16);
+ *dest_scan++ = (FX_BYTE)((dest_r_y) >> 16);
+ if (m_DestFormat == FXDIB_Argb) {
+ *dest_scan = (FX_BYTE)((dest_a * 255) >> 16);
+ }
+ if (dest_scan_mask) {
+ *dest_scan_mask++ = (FX_BYTE)((dest_a * 255) >> 16);
+ }
+ dest_scan += Bpp - 3;
+ }
+ break;
+ }
+ }
+ rows_to_go --;
+ }
+ return FALSE;
+}
+void CStretchEngine::StretchVert()
+{
+ if (m_DestHeight == 0) {
+ return;
+ }
+ CWeightTable table;
+ table.Calc(m_DestHeight, m_DestClip.top, m_DestClip.bottom, m_SrcHeight, m_SrcClip.top, m_SrcClip.bottom, m_Flags);
+ if (table.m_pWeightTables == NULL) {
+ return;
+ }
+ int DestBpp = m_DestBpp / 8;
+ for (int row = m_DestClip.top; row < m_DestClip.bottom; row ++) {
+ unsigned char* dest_scan = m_pDestScanline;
+ unsigned char* dest_sacn_mask = m_pDestMaskScanline;
+ PixelWeight* pPixelWeights = table.GetPixelWeight(row);
+ switch(m_TransMethod) {
+ case 1:
+ case 2:
+ case 3: {
+ for (int col = m_DestClip.left; col < m_DestClip.right; col ++) {
+ unsigned char* src_scan = m_pInterBuf + (col - m_DestClip.left) * DestBpp;
+ int dest_a = 0;
+ for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; j ++) {
+ int pixel_weight = pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart];
+ dest_a += pixel_weight * src_scan[(j - m_SrcClip.top) * m_InterPitch];
+ }
+ if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
+ dest_a = dest_a < 0 ? 0 : dest_a > 16711680 ? 16711680 : dest_a;
+ }
+ *dest_scan = (FX_BYTE)(dest_a >> 16);
+ dest_scan += DestBpp;
+ }
+ break;
+ }
+ case 4: {
+ for (int col = m_DestClip.left; col < m_DestClip.right; col ++) {
+ unsigned char* src_scan = m_pInterBuf + (col - m_DestClip.left) * DestBpp;
+ unsigned char* src_scan_mask = m_pExtraAlphaBuf + (col - m_DestClip.left);
+ int dest_a = 0, dest_k = 0;
+ for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; j ++) {
+ int pixel_weight = pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart];
+ dest_k += pixel_weight * src_scan[(j - m_SrcClip.top) * m_InterPitch];
+ dest_a += pixel_weight * src_scan_mask[(j - m_SrcClip.top) * m_ExtraMaskPitch];
+ }
+ if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
+ dest_k = dest_k < 0 ? 0 : dest_k > 16711680 ? 16711680 : dest_k;
+ dest_a = dest_a < 0 ? 0 : dest_a > 16711680 ? 16711680 : dest_a;
+ }
+ *dest_scan = (FX_BYTE)(dest_k >> 16);
+ dest_scan += DestBpp;
+ *dest_sacn_mask++ = (FX_BYTE)(dest_a >> 16);
+ }
+ break;
+ }
+ case 5:
+ case 7: {
+ for (int col = m_DestClip.left; col < m_DestClip.right; col ++) {
+ unsigned char* src_scan = m_pInterBuf + (col - m_DestClip.left) * DestBpp;
+ int dest_r_y = 0, dest_g_m = 0, dest_b_c = 0, dest_k = 0;
+ for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; j ++) {
+ int pixel_weight = pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart];
+ FX_LPCBYTE src_pixel = src_scan + (j - m_SrcClip.top) * m_InterPitch;
+ dest_b_c += pixel_weight * (*src_pixel++);
+ dest_g_m += pixel_weight * (*src_pixel++);
+ dest_r_y += pixel_weight * (*src_pixel);
+ }
+ if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
+ dest_r_y = dest_r_y < 0 ? 0 : dest_r_y > 16711680 ? 16711680 : dest_r_y;
+ dest_g_m = dest_g_m < 0 ? 0 : dest_g_m > 16711680 ? 16711680 : dest_g_m;
+ dest_b_c = dest_b_c < 0 ? 0 : dest_b_c > 16711680 ? 16711680 : dest_b_c;
+ }
+ dest_scan[0] = (FX_BYTE)((dest_b_c) >> 16);
+ dest_scan[1] = (FX_BYTE)((dest_g_m) >> 16);
+ dest_scan[2] = (FX_BYTE)((dest_r_y) >> 16);
+ dest_scan += DestBpp;
+ }
+ break;
+ }
+ case 6:
+ case 8: {
+ for (int col = m_DestClip.left; col < m_DestClip.right; col ++) {
+ unsigned char* src_scan = m_pInterBuf + (col - m_DestClip.left) * DestBpp;
+ unsigned char* src_scan_mask = NULL;
+ if (m_DestFormat != FXDIB_Argb) {
+ src_scan_mask = m_pExtraAlphaBuf + (col - m_DestClip.left);
+ }
+ int dest_a = 0, dest_k = 0, dest_r_y = 0, dest_g_m = 0, dest_b_c = 0;
+ for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; j ++) {
+ int pixel_weight = pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart];
+ FX_LPCBYTE src_pixel = src_scan + (j - m_SrcClip.top) * m_InterPitch;
+ int mask_v = 255;
+ if (src_scan_mask) {
+ mask_v = src_scan_mask[(j - m_SrcClip.top) * m_ExtraMaskPitch];
+ }
+ dest_b_c += pixel_weight * (*src_pixel++);
+ dest_g_m += pixel_weight * (*src_pixel++);
+ dest_r_y += pixel_weight * (*src_pixel);
+ if (m_DestFormat == FXDIB_Argb) {
+ dest_a += pixel_weight * (*(src_pixel + 1));
+ } else {
+ dest_a += pixel_weight * mask_v;
+ }
+ }
+ if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
+ dest_r_y = dest_r_y < 0 ? 0 : dest_r_y > 16711680 ? 16711680 : dest_r_y;
+ dest_g_m = dest_g_m < 0 ? 0 : dest_g_m > 16711680 ? 16711680 : dest_g_m;
+ dest_b_c = dest_b_c < 0 ? 0 : dest_b_c > 16711680 ? 16711680 : dest_b_c;
+ dest_a = dest_a < 0 ? 0 : dest_a > 16711680 ? 16711680 : dest_a;
+ }
+ if (dest_a) {
+ int r = ((FX_DWORD)dest_r_y) * 255 / dest_a;
+ int g = ((FX_DWORD)dest_g_m) * 255 / dest_a;
+ int b = ((FX_DWORD)dest_b_c) * 255 / dest_a;
+ dest_scan[0] = b > 255 ? 255 : b < 0 ? 0 : b;
+ dest_scan[1] = g > 255 ? 255 : g < 0 ? 0 : g;
+ dest_scan[2] = r > 255 ? 255 : r < 0 ? 0 : r;
+ }
+ if (m_DestFormat == FXDIB_Argb) {
+ dest_scan[3] = (FX_BYTE)((dest_a) >> 16);
+ } else {
+ *dest_sacn_mask = (FX_BYTE)((dest_a) >> 16);
+ }
+ dest_scan += DestBpp;
+ if (dest_sacn_mask) {
+ dest_sacn_mask++;
+ }
+ }
+ break;
+ }
+ }
+ m_pDestBitmap->ComposeScanline(row - m_DestClip.top, m_pDestScanline, m_pDestMaskScanline);
+ }
+}
+CFX_ImageStretcher::CFX_ImageStretcher()
+{
+ m_pScanline = NULL;
+ m_pStretchEngine = NULL;
+ m_pMaskScanline = NULL;
+}
+CFX_ImageStretcher::~CFX_ImageStretcher()
+{
+ if (m_pScanline) {
+ FX_Free(m_pScanline);
+ }
+ if (m_pStretchEngine) {
+ delete m_pStretchEngine;
+ }
+ if (m_pMaskScanline) {
+ FX_Free(m_pMaskScanline);
+ }
+}
+FXDIB_Format _GetStretchedFormat(const CFX_DIBSource* pSrc)
+{
+ FXDIB_Format format = pSrc->GetFormat();
+ if (format == FXDIB_1bppMask) {
+ format = FXDIB_8bppMask;
+ } else if (format == FXDIB_1bppRgb) {
+ format = FXDIB_8bppRgb;
+ } else if (format == FXDIB_8bppRgb) {
+ if (pSrc->GetPalette()) {
+ format = FXDIB_Rgb;
+ }
+ }
+ return format;
+}
+FX_BOOL CFX_ImageStretcher::Start(IFX_ScanlineComposer* pDest,
+ const CFX_DIBSource* pSource, int dest_width, int dest_height,
+ const FX_RECT& rect, FX_DWORD flags)
+{
+ m_DestFormat = _GetStretchedFormat(pSource);
+ m_DestBPP = m_DestFormat & 0xff;
+ m_pDest = pDest;
+ m_pSource = pSource;
+ m_DestWidth = dest_width;
+ m_DestHeight = dest_height;
+ m_ClipRect = rect;
+ m_Flags = flags;
+ if (pSource->GetFormat() == FXDIB_1bppRgb && pSource->GetPalette()) {
+ FX_ARGB pal[256];
+ int a0, r0, g0, b0, a1, r1, g1, b1;
+ ArgbDecode(pSource->GetPaletteEntry(0), a0, r0, g0, b0);
+ ArgbDecode(pSource->GetPaletteEntry(1), a1, r1, g1, b1);
+ for (int i = 0; i < 256; i ++) {
+ int a = a0 + (a1 - a0) * i / 255;
+ int r = r0 + (r1 - r0) * i / 255;
+ int g = g0 + (g1 - g0) * i / 255;
+ int b = b0 + (b1 - b0) * i / 255;
+ pal[i] = ArgbEncode(a, r, g, b);
+ }
+ if (!pDest->SetInfo(rect.Width(), rect.Height(), m_DestFormat, pal)) {
+ return FALSE;
+ }
+ } else if (pSource->GetFormat() == FXDIB_1bppCmyk && pSource->GetPalette()) {
+ FX_CMYK pal[256];
+ int c0, m0, y0, k0, c1, m1, y1, k1;
+ CmykDecode(pSource->GetPaletteEntry(0), c0, m0, y0, k0);
+ CmykDecode(pSource->GetPaletteEntry(1), c1, m1, y1, k1);
+ for (int i = 0; i < 256; i ++) {
+ int c = c0 + (c1 - c0) * i / 255;
+ int m = m0 + (m1 - m0) * i / 255;
+ int y = y0 + (y1 - y0) * i / 255;
+ int k = k0 + (k1 - k0) * i / 255;
+ pal[i] = CmykEncode(c, m, y, k);
+ }
+ if (!pDest->SetInfo(rect.Width(), rect.Height(), m_DestFormat, pal)) {
+ return FALSE;
+ }
+ } else if (!pDest->SetInfo(rect.Width(), rect.Height(), m_DestFormat, NULL)) {
+ return FALSE;
+ }
+ if (flags & FXDIB_DOWNSAMPLE) {
+ return StartQuickStretch();
+ } else {
+ return StartStretch();
+ }
+}
+FX_BOOL CFX_ImageStretcher::Continue(IFX_Pause* pPause)
+{
+ if (m_Flags & FXDIB_DOWNSAMPLE) {
+ return ContinueQuickStretch(pPause);
+ } else {
+ return ContinueStretch(pPause);
+ }
+}
+#ifndef _FPDFAPI_MINI_
+#define MAX_PROGRESSIVE_STRETCH_PIXELS 1000000
+#else
+#define MAX_PROGRESSIVE_STRETCH_PIXELS 100000
+#endif
+FX_BOOL CFX_ImageStretcher::StartStretch()
+{
+ m_pStretchEngine = FX_NEW CStretchEngine(m_pDest, m_DestFormat, m_DestWidth, m_DestHeight, m_ClipRect, m_pSource, m_Flags);
+ if (!m_pStretchEngine) {
+ return FALSE;
+ }
+ m_pStretchEngine->StartStretchHorz();
+ if (m_pSource->GetWidth() * m_pSource->GetHeight() < MAX_PROGRESSIVE_STRETCH_PIXELS) {
+ m_pStretchEngine->Continue(NULL);
+ return FALSE;
+ }
+ return TRUE;
+}
+FX_BOOL CFX_ImageStretcher::ContinueStretch(IFX_Pause* pPause)
+{
+ if (m_pStretchEngine == NULL) {
+ return FALSE;
+ }
+ return m_pStretchEngine->Continue(pPause);
+}
+FX_BOOL CFX_ImageStretcher::StartQuickStretch()
+{
+#ifdef _FPDFAPI_MINI_
+ m_pSource->SetDownSampleSize(m_DestWidth, m_DestHeight);
+#endif
+ m_bFlipX = FALSE;
+ m_bFlipY = FALSE;
+ if (m_DestWidth < 0) {
+ m_bFlipX = TRUE;
+ m_DestWidth = -m_DestWidth;
+ }
+ if (m_DestHeight < 0) {
+ m_bFlipY = TRUE;
+ m_DestHeight = -m_DestHeight;
+ }
+ m_LineIndex = 0;
+ FX_DWORD size = m_ClipRect.Width();
+ if (size && m_DestBPP > (int)(INT_MAX / size)) {
+ return FALSE;
+ }
+ size *= m_DestBPP;
+ m_pScanline = FX_Alloc(FX_BYTE, (size / 8 + 3) / 4 * 4);
+ if (!m_pScanline) {
+ return FALSE;
+ }
+ if (m_pSource->m_pAlphaMask) {
+ m_pMaskScanline = FX_Alloc(FX_BYTE, (m_ClipRect.Width() + 3) / 4 * 4);
+ if (!m_pMaskScanline) {
+ return FALSE;
+ }
+ }
+ if (m_pSource->GetWidth() * m_pSource->GetHeight() < MAX_PROGRESSIVE_STRETCH_PIXELS) {
+ ContinueQuickStretch(NULL);
+ return FALSE;
+ }
+ return TRUE;
+}
+FX_BOOL CFX_ImageStretcher::ContinueQuickStretch(IFX_Pause* pPause)
+{
+ if (m_pScanline == NULL) {
+ return FALSE;
+ }
+ int result_width = m_ClipRect.Width(), result_height = m_ClipRect.Height();
+ int src_width = m_pSource->GetWidth(), src_height = m_pSource->GetHeight();
+ for (; m_LineIndex < result_height; m_LineIndex ++) {
+ int dest_y, src_y;
+ if (m_bFlipY) {
+ dest_y = result_height - m_LineIndex - 1;
+ src_y = (m_DestHeight - (dest_y + m_ClipRect.top) - 1) * src_height / m_DestHeight;
+ } else {
+ dest_y = m_LineIndex;
+ src_y = (dest_y + m_ClipRect.top) * src_height / m_DestHeight;
+ }
+ if (src_y >= src_height) {
+ src_y = src_height - 1;
+ }
+ if (src_y < 0) {
+ src_y = 0;
+ }
+ if (m_pSource->SkipToScanline(src_y, pPause)) {
+ return TRUE;
+ }
+ m_pSource->DownSampleScanline(src_y, m_pScanline, m_DestBPP, m_DestWidth, m_bFlipX, m_ClipRect.left, result_width);
+ FX_LPBYTE scan_extra_alpha = NULL;
+ if (m_pMaskScanline) {
+ m_pSource->m_pAlphaMask->DownSampleScanline(src_y, m_pMaskScanline, 1, m_DestWidth, m_bFlipX, m_ClipRect.left, result_width);
+ }
+ m_pDest->ComposeScanline(dest_y, m_pScanline, m_pMaskScanline);
+ }
+ return FALSE;
+}
diff --git a/core/src/fxge/dib/fx_dib_main.cpp b/core/src/fxge/dib/fx_dib_main.cpp
index 0953f2d2e5..9b27a13daf 100644
--- a/core/src/fxge/dib/fx_dib_main.cpp
+++ b/core/src/fxge/dib/fx_dib_main.cpp
@@ -1,1734 +1,1734 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../../include/fxge/fx_dib.h"
-#include "../../../include/fxge/fx_ge.h"
-#include "../../../include/fxcodec/fx_codec.h"
-#include "dib_int.h"
-#include <limits.h>
-FX_BOOL ConvertBuffer(FXDIB_Format dest_format, FX_LPBYTE dest_buf, int dest_pitch, int width, int height,
- const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, FX_DWORD*& pal, void* pIccTransform);
-void CmykDecode(FX_DWORD cmyk, int& c, int& m, int& y, int& k)
-{
- c = FXSYS_GetCValue(cmyk);
- m = FXSYS_GetMValue(cmyk);
- y = FXSYS_GetYValue(cmyk);
- k = FXSYS_GetKValue(cmyk);
-}
-void ArgbDecode(FX_DWORD argb, int& a, int& r, int& g, int& b)
-{
- a = FXARGB_A(argb);
- r = FXARGB_R(argb);
- g = FXARGB_G(argb);
- b = FXARGB_B(argb);
-}
-void ArgbDecode(FX_DWORD argb, int& a, FX_COLORREF& rgb)
-{
- a = FXARGB_A(argb);
- rgb = FXSYS_RGB(FXARGB_R(argb), FXARGB_G(argb), FXARGB_B(argb));
-}
-FX_DWORD ArgbEncode(int a, FX_COLORREF rgb)
-{
- return FXARGB_MAKE(a, FXSYS_GetRValue(rgb), FXSYS_GetGValue(rgb), FXSYS_GetBValue(rgb));
-}
-CFX_DIBSource::CFX_DIBSource()
-{
- m_bpp = 0;
- m_AlphaFlag = 0;
- m_Width = m_Height = 0;
- m_Pitch = 0;
- m_pPalette = NULL;
- m_pAlphaMask = NULL;
-}
-CFX_DIBSource::~CFX_DIBSource()
-{
- if (m_pPalette) {
- FX_Free(m_pPalette);
- }
- if (m_pAlphaMask) {
- delete m_pAlphaMask;
- }
-}
-CFX_DIBitmap::CFX_DIBitmap()
-{
- m_bExtBuf = FALSE;
- m_pBuffer = NULL;
- m_pPalette = NULL;
-}
-#define _MAX_OOM_LIMIT_ 12000000
-FX_BOOL CFX_DIBitmap::Create(int width, int height, FXDIB_Format format, FX_LPBYTE pBuffer, int pitch)
-{
- m_pBuffer = NULL;
- m_bpp = (FX_BYTE)format;
- m_AlphaFlag = (FX_BYTE)(format >> 8);
- m_Width = m_Height = m_Pitch = 0;
- if (width <= 0 || height <= 0 || pitch < 0) {
- return FALSE;
- }
- if ((INT_MAX - 31) / width < (format & 0xff)) {
- return FALSE;
- }
- if (!pitch) {
- pitch = (width * (format & 0xff) + 31) / 32 * 4;
- }
- if ((1 << 30) / pitch < height) {
- return FALSE;
- }
- if (pBuffer) {
- m_pBuffer = pBuffer;
- m_bExtBuf = TRUE;
- } else {
- int size = pitch * height + 4;
- int oomlimit = _MAX_OOM_LIMIT_;
- if (oomlimit >= 0 && size >= oomlimit) {
- m_pBuffer = FX_AllocNL(FX_BYTE, size);
- } else {
- m_pBuffer = FX_Alloc(FX_BYTE, size);
- }
- if (m_pBuffer == NULL) {
- return FALSE;
- }
- FXSYS_memset32(m_pBuffer, 0, sizeof (FX_BYTE) * size);
- }
- m_Width = width;
- m_Height = height;
- m_Pitch = pitch;
- if (HasAlpha() && format != FXDIB_Argb) {
- FX_BOOL ret = TRUE;
- ret = BuildAlphaMask();
- if (!ret) {
- if (!m_bExtBuf && m_pBuffer) {
- FX_Free(m_pBuffer);
- m_pBuffer = NULL;
- m_Width = m_Height = m_Pitch = 0;
- return FALSE;
- }
- }
- }
- return TRUE;
-}
-FX_BOOL CFX_DIBitmap::Copy(const CFX_DIBSource* pSrc)
-{
- if (m_pBuffer) {
- return FALSE;
- }
- if (!Create(pSrc->GetWidth(), pSrc->GetHeight(), pSrc->GetFormat())) {
- return FALSE;
- }
- CopyPalette(pSrc->GetPalette());
- CopyAlphaMask(pSrc->m_pAlphaMask);
- for (int row = 0; row < pSrc->GetHeight(); row ++) {
- FXSYS_memcpy32(m_pBuffer + row * m_Pitch, pSrc->GetScanline(row), m_Pitch);
- }
- return TRUE;
-}
-CFX_DIBitmap::~CFX_DIBitmap()
-{
- if (m_pBuffer && !m_bExtBuf) {
- FX_Free(m_pBuffer);
- }
- m_pBuffer = NULL;
-}
-void CFX_DIBitmap::TakeOver(CFX_DIBitmap* pSrcBitmap)
-{
- if (m_pBuffer && !m_bExtBuf) {
- FX_Free(m_pBuffer);
- }
- if (m_pPalette) {
- FX_Free(m_pPalette);
- }
- if (m_pAlphaMask) {
- delete m_pAlphaMask;
- }
- m_pBuffer = pSrcBitmap->m_pBuffer;
- m_pPalette = pSrcBitmap->m_pPalette;
- m_pAlphaMask = pSrcBitmap->m_pAlphaMask;
- pSrcBitmap->m_pBuffer = NULL;
- pSrcBitmap->m_pPalette = NULL;
- pSrcBitmap->m_pAlphaMask = NULL;
- m_bpp = pSrcBitmap->m_bpp;
- m_bExtBuf = pSrcBitmap->m_bExtBuf;
- m_AlphaFlag = pSrcBitmap->m_AlphaFlag;
- m_Width = pSrcBitmap->m_Width;
- m_Height = pSrcBitmap->m_Height;
- m_Pitch = pSrcBitmap->m_Pitch;
-}
-CFX_DIBitmap* CFX_DIBSource::Clone(const FX_RECT* pClip) const
-{
- FX_RECT rect(0, 0, m_Width, m_Height);
- if (pClip) {
- rect.Intersect(*pClip);
- if (rect.IsEmpty()) {
- return NULL;
- }
- }
- CFX_DIBitmap* pNewBitmap = FX_NEW CFX_DIBitmap;
- if (!pNewBitmap) {
- return NULL;
- }
- if (!pNewBitmap->Create(rect.Width(), rect.Height(), GetFormat())) {
- delete pNewBitmap;
- return NULL;
- }
- pNewBitmap->CopyPalette(m_pPalette);
- pNewBitmap->CopyAlphaMask(m_pAlphaMask, pClip);
- if (GetBPP() == 1 && rect.left % 8 != 0) {
- int left_shift = rect.left % 32;
- int right_shift = 32 - left_shift;
- int dword_count = pNewBitmap->m_Pitch / 4;
- for (int row = rect.top; row < rect.bottom; row ++) {
- FX_DWORD* src_scan = (FX_DWORD*)GetScanline(row) + rect.left / 32;
- FX_DWORD* dest_scan = (FX_DWORD*)pNewBitmap->GetScanline(row - rect.top);
- for (int i = 0; i < dword_count; i ++) {
- dest_scan[i] = (src_scan[i] << left_shift) | (src_scan[i + 1] >> right_shift);
- }
- }
- } else {
- int copy_len = (pNewBitmap->GetWidth() * pNewBitmap->GetBPP() + 7) / 8;
- if (m_Pitch < (FX_DWORD)copy_len) {
- copy_len = m_Pitch;
- }
- for (int row = rect.top; row < rect.bottom; row ++) {
- FX_LPCBYTE src_scan = GetScanline(row) + rect.left * m_bpp / 8;
- FX_LPBYTE dest_scan = (FX_LPBYTE)pNewBitmap->GetScanline(row - rect.top);
- FXSYS_memcpy32(dest_scan, src_scan, copy_len);
- }
- }
- return pNewBitmap;
-}
-void CFX_DIBSource::BuildPalette()
-{
- if (m_pPalette) {
- return;
- }
- if (GetBPP() == 1) {
- m_pPalette = FX_Alloc(FX_DWORD, 2);
- if (!m_pPalette) {
- return;
- }
- if(IsCmykImage()) {
- m_pPalette[0] = 0xff;
- m_pPalette[1] = 0;
- } else {
- m_pPalette[0] = 0xff000000;
- m_pPalette[1] = 0xffffffff;
- }
- } else if (GetBPP() == 8) {
- m_pPalette = FX_Alloc(FX_DWORD, 256);
- if (!m_pPalette) {
- return;
- }
- if(IsCmykImage()) {
- for (int i = 0; i < 256; i ++) {
- m_pPalette[i] = 0xff - i;
- }
- } else {
- for (int i = 0; i < 256; i ++) {
- m_pPalette[i] = 0xff000000 | (i * 0x10101);
- }
- }
- }
-}
-FX_BOOL CFX_DIBSource::BuildAlphaMask()
-{
- if (m_pAlphaMask) {
- return TRUE;
- }
- m_pAlphaMask = FX_NEW CFX_DIBitmap;
- if (!m_pAlphaMask) {
- return FALSE;
- }
- if (!m_pAlphaMask->Create(m_Width, m_Height, FXDIB_8bppMask)) {
- delete m_pAlphaMask;
- m_pAlphaMask = NULL;
- return FALSE;
- }
- FXSYS_memset8(m_pAlphaMask->GetBuffer(), 0xff, m_pAlphaMask->GetHeight()*m_pAlphaMask->GetPitch());
- return TRUE;
-}
-FX_DWORD CFX_DIBSource::GetPaletteEntry(int index) const
-{
- ASSERT((GetBPP() == 1 || GetBPP() == 8) && !IsAlphaMask());
- if (m_pPalette) {
- return m_pPalette[index];
- }
- if (IsCmykImage()) {
- if (GetBPP() == 1) {
- return index ? 0 : 0xff;
- }
- return 0xff - index;
- }
- if (GetBPP() == 1) {
- return index ? 0xffffffff : 0xff000000;
- }
- return index * 0x10101 | 0xff000000;
-}
-void CFX_DIBSource::SetPaletteEntry(int index, FX_DWORD color)
-{
- ASSERT((GetBPP() == 1 || GetBPP() == 8) && !IsAlphaMask());
- if (m_pPalette == NULL) {
- BuildPalette();
- }
- m_pPalette[index] = color;
-}
-int CFX_DIBSource::FindPalette(FX_DWORD color) const
-{
- ASSERT((GetBPP() == 1 || GetBPP() == 8) && !IsAlphaMask());
- if (m_pPalette == NULL) {
- if (IsCmykImage()) {
- if (GetBPP() == 1) {
- return ((FX_BYTE)color == 0xff) ? 0 : 1;
- }
- return 0xff - (FX_BYTE)color;
- }
- if (GetBPP() == 1) {
- return ((FX_BYTE)color == 0xff) ? 1 : 0;
- }
- return (FX_BYTE)color;
- }
- int palsize = (1 << GetBPP());
- for (int i = 0; i < palsize; i ++)
- if (m_pPalette[i] == color) {
- return i;
- }
- return -1;
-}
-void CFX_DIBitmap::Clear(FX_DWORD color)
-{
- if (m_pBuffer == NULL) {
- return;
- }
- switch (GetFormat()) {
- case FXDIB_1bppMask:
- FXSYS_memset8(m_pBuffer, (color & 0xff000000) ? 0xff : 0, m_Pitch * m_Height);
- break;
- case FXDIB_1bppRgb: {
- int index = FindPalette(color);
- FXSYS_memset8(m_pBuffer, index ? 0xff : 0, m_Pitch * m_Height);
- break;
- }
- case FXDIB_8bppMask:
- FXSYS_memset8(m_pBuffer, color >> 24, m_Pitch * m_Height);
- break;
- case FXDIB_8bppRgb: {
- int index = FindPalette(color);
- FXSYS_memset8(m_pBuffer, index, m_Pitch * m_Height);
- break;
- }
- case FXDIB_Rgb:
- case FXDIB_Rgba: {
- int a, r, g, b;
- ArgbDecode(color, a, r, g, b);
- if (r == g && g == b) {
- FXSYS_memset8(m_pBuffer, r, m_Pitch * m_Height);
- } else {
- int byte_pos = 0;
- for (int col = 0; col < m_Width; col ++) {
- m_pBuffer[byte_pos++] = b;
- m_pBuffer[byte_pos++] = g;
- m_pBuffer[byte_pos++] = r;
- }
- for (int row = 1; row < m_Height; row ++) {
- FXSYS_memcpy32(m_pBuffer + row * m_Pitch, m_pBuffer, m_Pitch);
- }
- }
- break;
- }
- case FXDIB_Rgb32:
- case FXDIB_Argb: {
- color = IsCmykImage() ? FXCMYK_TODIB(color) : FXARGB_TODIB(color);
- for (int i = 0; i < m_Width; i ++) {
- ((FX_DWORD*)m_pBuffer)[i] = color;
- }
- for (int row = 1; row < m_Height; row ++) {
- FXSYS_memcpy32(m_pBuffer + row * m_Pitch, m_pBuffer, m_Pitch);
- }
- break;
- }
- default:
- break;
- }
-}
-void CFX_DIBSource::GetOverlapRect(int& dest_left, int& dest_top, int& width, int& height,
- int src_width, int src_height, int& src_left, int& src_top,
- const CFX_ClipRgn* pClipRgn)
-{
- if (width == 0 || height == 0) {
- return;
- }
- ASSERT(width > 0 && height > 0);
- if (dest_left > m_Width || dest_top > m_Height) {
- width = 0;
- height = 0;
- return;
- }
- int x_offset = dest_left - src_left;
- int y_offset = dest_top - src_top;
- FX_RECT src_rect(src_left, src_top, src_left + width, src_top + height);
- FX_RECT src_bound(0, 0, src_width, src_height);
- src_rect.Intersect(src_bound);
- FX_RECT dest_rect(src_rect.left + x_offset, src_rect.top + y_offset,
- src_rect.right + x_offset, src_rect.bottom + y_offset);
- FX_RECT dest_bound(0, 0, m_Width, m_Height);
- dest_rect.Intersect(dest_bound);
- if (pClipRgn) {
- dest_rect.Intersect(pClipRgn->GetBox());
- }
- dest_left = dest_rect.left;
- dest_top = dest_rect.top;
- src_left = dest_left - x_offset;
- src_top = dest_top - y_offset;
- width = dest_rect.right - dest_rect.left;
- height = dest_rect.bottom - dest_rect.top;
-}
-FX_BOOL CFX_DIBitmap::TransferBitmap(int dest_left, int dest_top, int width, int height,
- const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, void* pIccTransform)
-{
- if (m_pBuffer == NULL) {
- return FALSE;
- }
- GetOverlapRect(dest_left, dest_top, width, height, pSrcBitmap->GetWidth(), pSrcBitmap->GetHeight(), src_left, src_top, NULL);
- if (width == 0 || height == 0) {
- return TRUE;
- }
- FXDIB_Format dest_format = GetFormat();
- FXDIB_Format src_format = pSrcBitmap->GetFormat();
- if (dest_format == src_format && pIccTransform == NULL) {
- if (GetBPP() == 1) {
- for (int row = 0; row < height; row ++) {
- FX_LPBYTE dest_scan = m_pBuffer + (dest_top + row) * m_Pitch;
- FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row);
- for (int col = 0; col < width; col ++) {
- if (src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8))) {
- dest_scan[(dest_left + col) / 8] |= 1 << (7 - (dest_left + col) % 8);
- } else {
- dest_scan[(dest_left + col) / 8] &= ~(1 << (7 - (dest_left + col) % 8));
- }
- }
- }
- } else {
- int Bpp = GetBPP() / 8;
- for (int row = 0; row < height; row ++) {
- FX_LPBYTE dest_scan = m_pBuffer + (dest_top + row) * m_Pitch + dest_left * Bpp;
- FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * Bpp;
- FXSYS_memcpy32(dest_scan, src_scan, width * Bpp);
- }
- }
- } else {
- if (m_pPalette) {
- return FALSE;
- }
- if (m_bpp == 8) {
- dest_format = FXDIB_8bppMask;
- }
- FX_LPBYTE dest_buf = m_pBuffer + dest_top * m_Pitch + dest_left * GetBPP() / 8;
- FX_DWORD* d_plt = NULL;
- if(!ConvertBuffer(dest_format, dest_buf, m_Pitch, width, height, pSrcBitmap, src_left, src_top, d_plt, pIccTransform)) {
- return FALSE;
- }
- }
- return TRUE;
-}
-#ifndef _FPDFAPI_MINI_
-FX_BOOL CFX_DIBitmap::TransferMask(int dest_left, int dest_top, int width, int height,
- const CFX_DIBSource* pMask, FX_DWORD color, int src_left, int src_top, int alpha_flag, void* pIccTransform)
-{
- if (m_pBuffer == NULL) {
- return FALSE;
- }
- ASSERT(HasAlpha() && (m_bpp >= 24));
- ASSERT(pMask->IsAlphaMask());
- if (!HasAlpha() || !pMask->IsAlphaMask() || m_bpp < 24) {
- return FALSE;
- }
- GetOverlapRect(dest_left, dest_top, width, height, pMask->GetWidth(), pMask->GetHeight(), src_left, src_top, NULL);
- if (width == 0 || height == 0) {
- return TRUE;
- }
- int src_pitch = pMask->GetPitch();
- int src_bpp = pMask->GetBPP();
- int alpha;
- FX_DWORD dst_color;
- if (alpha_flag >> 8) {
- alpha = alpha_flag & 0xff;
- dst_color = FXCMYK_TODIB(color);
- } else {
- alpha = FXARGB_A(color);
- dst_color = FXARGB_TODIB(color);
- }
- FX_LPBYTE color_p = (FX_LPBYTE)&dst_color;
- if (pIccTransform && CFX_GEModule::Get()->GetCodecModule() && CFX_GEModule::Get()->GetCodecModule()->GetIccModule()) {
- ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
- pIccModule->TranslateScanline(pIccTransform, color_p, color_p, 1);
- } else {
- if (alpha_flag >> 8 && !IsCmykImage())
- AdobeCMYK_to_sRGB1(FXSYS_GetCValue(color), FXSYS_GetMValue(color), FXSYS_GetYValue(color), FXSYS_GetKValue(color),
- color_p[2], color_p[1], color_p[0]);
- else if (!(alpha_flag >> 8) && IsCmykImage()) {
- return FALSE;
- }
- }
- if(!IsCmykImage()) {
- color_p[3] = (FX_BYTE)alpha;
- }
- if (GetFormat() == FXDIB_Argb) {
- for (int row = 0; row < height; row ++) {
- FX_DWORD* dest_pos = (FX_DWORD*)(m_pBuffer + (dest_top + row) * m_Pitch + dest_left * 4);
- FX_LPCBYTE src_scan = pMask->GetScanline(src_top + row);
- if (src_bpp == 1) {
- for (int col = 0; col < width; col ++) {
- int src_bitpos = src_left + col;
- if (src_scan[src_bitpos / 8] & (1 << (7 - src_bitpos % 8))) {
- *dest_pos = dst_color;
- } else {
- *dest_pos = 0;
- }
- dest_pos ++;
- }
- } else {
- src_scan += src_left;
- dst_color = FXARGB_TODIB(dst_color);
- dst_color &= 0xffffff;
- for (int col = 0; col < width; col ++) {
- FXARGB_SETDIB(dest_pos++, dst_color | ((alpha * (*src_scan++) / 255) << 24));
- }
- }
- }
- } else {
- int comps = m_bpp / 8;
- for (int row = 0; row < height; row ++) {
- FX_LPBYTE dest_color_pos = m_pBuffer + (dest_top + row) * m_Pitch + dest_left * comps;
- FX_LPBYTE dest_alpha_pos = (FX_LPBYTE)m_pAlphaMask->GetScanline(dest_top + row) + dest_left;
- FX_LPCBYTE src_scan = pMask->GetScanline(src_top + row);
- if (src_bpp == 1) {
- for (int col = 0; col < width; col ++) {
- int src_bitpos = src_left + col;
- if (src_scan[src_bitpos / 8] & (1 << (7 - src_bitpos % 8))) {
- FXSYS_memcpy32(dest_color_pos, color_p, comps);
- *dest_alpha_pos = 0xff;
- } else {
- FXSYS_memset32(dest_color_pos, 0, comps);
- *dest_alpha_pos = 0;
- }
- dest_color_pos += comps;
- dest_alpha_pos ++;
- }
- } else {
- src_scan += src_left;
- for (int col = 0; col < width; col ++) {
- FXSYS_memcpy32(dest_color_pos, color_p, comps);
- dest_color_pos += comps;
- *dest_alpha_pos++ = (alpha * (*src_scan++) / 255);
- }
- }
- }
- }
- return TRUE;
-}
-#endif
-void CFX_DIBSource::CopyPalette(const FX_DWORD* pSrc, FX_DWORD size)
-{
- if (pSrc == NULL || GetBPP() > 8) {
- if (m_pPalette) {
- FX_Free(m_pPalette);
- }
- m_pPalette = NULL;
- } else {
- FX_DWORD pal_size = 1 << GetBPP();
- if (m_pPalette == NULL) {
- m_pPalette = FX_Alloc(FX_DWORD, pal_size);
- }
- if (!m_pPalette) {
- return;
- }
- if (pal_size > size) {
- pal_size = size;
- }
- FXSYS_memcpy32(m_pPalette, pSrc, pal_size * sizeof(FX_DWORD));
- }
-}
-void CFX_DIBSource::GetPalette(FX_DWORD* pal, int alpha) const
-{
- ASSERT(GetBPP() <= 8 && !IsCmykImage());
- if (GetBPP() == 1) {
- pal[0] = ((m_pPalette ? m_pPalette[0] : 0xff000000) & 0xffffff) | (alpha << 24);
- pal[1] = ((m_pPalette ? m_pPalette[1] : 0xffffffff) & 0xffffff) | (alpha << 24);
- return;
- }
- if (m_pPalette) {
- for (int i = 0; i < 256; i ++) {
- pal[i] = (m_pPalette[i] & 0x00ffffff) | (alpha << 24);
- }
- } else {
- for (int i = 0; i < 256; i ++) {
- pal[i] = (i * 0x10101) | (alpha << 24);
- }
- }
-}
-CFX_DIBitmap* CFX_DIBSource::GetAlphaMask(const FX_RECT* pClip) const
-{
- ASSERT(GetFormat() == FXDIB_Argb);
- FX_RECT rect(0, 0, m_Width, m_Height);
- if (pClip) {
- rect.Intersect(*pClip);
- if (rect.IsEmpty()) {
- return NULL;
- }
- }
- CFX_DIBitmap* pMask = FX_NEW CFX_DIBitmap;
- if (!pMask) {
- return NULL;
- }
- if (!pMask->Create(rect.Width(), rect.Height(), FXDIB_8bppMask)) {
- delete pMask;
- return NULL;
- }
- for (int row = rect.top; row < rect.bottom; row ++) {
- FX_LPCBYTE src_scan = GetScanline(row) + rect.left * 4 + 3;
- FX_LPBYTE dest_scan = (FX_LPBYTE)pMask->GetScanline(row - rect.top);
- for (int col = rect.left; col < rect.right; col ++) {
- *dest_scan ++ = *src_scan;
- src_scan += 4;
- }
- }
- return pMask;
-}
-FX_BOOL CFX_DIBSource::CopyAlphaMask(const CFX_DIBSource* pAlphaMask, const FX_RECT* pClip)
-{
- if (!HasAlpha() || GetFormat() == FXDIB_Argb) {
- return FALSE;
- }
- if (pAlphaMask) {
- FX_RECT rect(0, 0, pAlphaMask->m_Width, pAlphaMask->m_Height);
- if (pClip) {
- rect.Intersect(*pClip);
- if (rect.IsEmpty() || rect.Width() != m_Width || rect.Height() != m_Height) {
- return FALSE;
- }
- } else {
- if (pAlphaMask->m_Width != m_Width || pAlphaMask->m_Height != m_Height) {
- return FALSE;
- }
- }
- for (int row = 0; row < m_Height; row ++)
- FXSYS_memcpy32((void*)m_pAlphaMask->GetScanline(row),
- pAlphaMask->GetScanline(row + rect.top) + rect.left, m_pAlphaMask->m_Pitch);
- } else {
- m_pAlphaMask->Clear(0xff000000);
- }
- return TRUE;
-}
-const int g_ChannelOffset[] = {0, 2, 1, 0, 0, 1, 2, 3, 3};
-FX_BOOL CFX_DIBitmap::LoadChannel(FXDIB_Channel destChannel, const CFX_DIBSource* pSrcBitmap, FXDIB_Channel srcChannel)
-{
- if (m_pBuffer == NULL) {
- return FALSE;
- }
- CFX_DIBSource* pSrcClone = (CFX_DIBSource*)pSrcBitmap;
- CFX_DIBitmap* pDst = this;
- int destOffset, srcOffset;
- if (srcChannel == FXDIB_Alpha) {
- if (!pSrcBitmap->HasAlpha() && !pSrcBitmap->IsAlphaMask()) {
- return FALSE;
- }
- if (pSrcBitmap->GetBPP() == 1) {
- pSrcClone = pSrcBitmap->CloneConvert(FXDIB_8bppMask);
- if (pSrcClone == NULL) {
- return FALSE;
- }
- }
- if(pSrcBitmap->GetFormat() == FXDIB_Argb) {
- srcOffset = 3;
- } else {
- srcOffset = 0;
- }
- } else {
- if (pSrcBitmap->IsAlphaMask()) {
- return FALSE;
- }
- if (pSrcBitmap->GetBPP() < 24) {
- if (pSrcBitmap->IsCmykImage()) {
- pSrcClone = pSrcBitmap->CloneConvert((FXDIB_Format)((pSrcBitmap->GetFormat() & 0xff00) | 0x20));
- } else {
- pSrcClone = pSrcBitmap->CloneConvert((FXDIB_Format)((pSrcBitmap->GetFormat() & 0xff00) | 0x18));
- }
- if (pSrcClone == NULL) {
- return FALSE;
- }
- }
- srcOffset = g_ChannelOffset[srcChannel];
- }
- if (destChannel == FXDIB_Alpha) {
- if (IsAlphaMask()) {
- if(!ConvertFormat(FXDIB_8bppMask)) {
- if (pSrcClone != pSrcBitmap) {
- delete pSrcClone;
- }
- return FALSE;
- }
- destOffset = 0;
- } else {
- destOffset = 0;
- if(!ConvertFormat(IsCmykImage() ? FXDIB_Cmyka : FXDIB_Argb)) {
- if (pSrcClone != pSrcBitmap) {
- delete pSrcClone;
- }
- return FALSE;
- }
- if (GetFormat() == FXDIB_Argb) {
- destOffset = 3;
- }
- }
- } else {
- if (IsAlphaMask()) {
- if (pSrcClone != pSrcBitmap) {
- delete pSrcClone;
- }
- return FALSE;
- }
- if (GetBPP() < 24) {
- if (HasAlpha()) {
- if (!ConvertFormat(IsCmykImage() ? FXDIB_Cmyka : FXDIB_Argb)) {
- if (pSrcClone != pSrcBitmap) {
- delete pSrcClone;
- }
- return FALSE;
- }
- } else
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
- if (!ConvertFormat(IsCmykImage() ? FXDIB_Cmyk : FXDIB_Rgb32)) {
-#else
- if (!ConvertFormat(IsCmykImage() ? FXDIB_Cmyk : FXDIB_Rgb)) {
-#endif
- if (pSrcClone != pSrcBitmap) {
- delete pSrcClone;
- }
- return FALSE;
- }
- }
- destOffset = g_ChannelOffset[destChannel];
- }
- if (srcChannel == FXDIB_Alpha && pSrcClone->m_pAlphaMask) {
- CFX_DIBitmap* pAlphaMask = pSrcClone->m_pAlphaMask;
- if (pSrcClone->GetWidth() != m_Width || pSrcClone->GetHeight() != m_Height) {
- if (pAlphaMask) {
- pAlphaMask = pAlphaMask->StretchTo(m_Width, m_Height);
- if (pAlphaMask == NULL) {
- if (pSrcClone != pSrcBitmap) {
- delete pSrcClone;
- }
- return FALSE;
- }
- }
- }
- if (pSrcClone != pSrcBitmap) {
- pSrcClone->m_pAlphaMask = NULL;
- delete pSrcClone;
- }
- pSrcClone = pAlphaMask;
- srcOffset = 0;
- } else if (pSrcClone->GetWidth() != m_Width || pSrcClone->GetHeight() != m_Height) {
- CFX_DIBitmap* pSrcMatched = pSrcClone->StretchTo(m_Width, m_Height);
- if (pSrcClone != pSrcBitmap) {
- delete pSrcClone;
- }
- if (pSrcMatched == NULL) {
- return FALSE;
- }
- pSrcClone = pSrcMatched;
- }
- if (destChannel == FXDIB_Alpha && m_pAlphaMask) {
- pDst = m_pAlphaMask;
- destOffset = 0;
- }
- int srcBytes = pSrcClone->GetBPP() / 8;
- int destBytes = pDst->GetBPP() / 8;
- for (int row = 0; row < m_Height; row ++) {
- FX_LPBYTE dest_pos = (FX_LPBYTE)pDst->GetScanline(row) + destOffset;
- FX_LPCBYTE src_pos = pSrcClone->GetScanline(row) + srcOffset;
- for (int col = 0; col < m_Width; col ++) {
- *dest_pos = *src_pos;
- dest_pos += destBytes;
- src_pos += srcBytes;
- }
- }
- if (pSrcClone != pSrcBitmap && pSrcClone != pSrcBitmap->m_pAlphaMask) {
- delete pSrcClone;
- }
- return TRUE;
-}
-FX_BOOL CFX_DIBitmap::LoadChannel(FXDIB_Channel destChannel, int value)
-{
- if (m_pBuffer == NULL) {
- return FALSE;
- }
- int destOffset;
- if (destChannel == FXDIB_Alpha) {
- if (IsAlphaMask()) {
- if(!ConvertFormat(FXDIB_8bppMask)) {
- return FALSE;
- }
- destOffset = 0;
- } else {
- destOffset = 0;
- if(!ConvertFormat(IsCmykImage() ? FXDIB_Cmyka : FXDIB_Argb)) {
- return FALSE;
- }
- if (GetFormat() == FXDIB_Argb) {
- destOffset = 3;
- }
- }
- } else {
- if (IsAlphaMask()) {
- return FALSE;
- }
- if (GetBPP() < 24) {
- if (HasAlpha()) {
- if (!ConvertFormat(IsCmykImage() ? FXDIB_Cmyka : FXDIB_Argb)) {
- return FALSE;
- }
- } else
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
- if (!ConvertFormat(IsCmykImage() ? FXDIB_Cmyk : FXDIB_Rgb)) {
- return FALSE;
- }
-#else
- if (!ConvertFormat(IsCmykImage() ? FXDIB_Cmyk : FXDIB_Rgb32)) {
- return FALSE;
- }
-#endif
- }
- destOffset = g_ChannelOffset[destChannel];
- }
- int Bpp = GetBPP() / 8;
- if (Bpp == 1) {
- FXSYS_memset8(m_pBuffer, value, m_Height * m_Pitch);
- return TRUE;
- }
- if (destChannel == FXDIB_Alpha && m_pAlphaMask) {
- FXSYS_memset8(m_pAlphaMask->GetBuffer(), value, m_pAlphaMask->GetHeight()*m_pAlphaMask->GetPitch());
- return TRUE;
- }
- for (int row = 0; row < m_Height; row ++) {
- FX_LPBYTE scan_line = m_pBuffer + row * m_Pitch + destOffset;
- for (int col = 0; col < m_Width; col ++) {
- *scan_line = value;
- scan_line += Bpp;
- }
- }
- return TRUE;
-}
-FX_BOOL CFX_DIBitmap::MultiplyAlpha(const CFX_DIBSource* pSrcBitmap)
-{
- if (m_pBuffer == NULL) {
- return FALSE;
- }
- ASSERT(pSrcBitmap->IsAlphaMask());
- if (!pSrcBitmap->IsAlphaMask()) {
- return FALSE;
- }
- if (!IsAlphaMask() && !HasAlpha()) {
- return LoadChannel(FXDIB_Alpha, pSrcBitmap, FXDIB_Alpha);
- }
- CFX_DIBitmap* pSrcClone = (CFX_DIBitmap*)pSrcBitmap;
- if (pSrcBitmap->GetWidth() != m_Width || pSrcBitmap->GetHeight() != m_Height) {
- pSrcClone = pSrcBitmap->StretchTo(m_Width, m_Height);
- ASSERT(pSrcClone != NULL);
- if (pSrcClone == NULL) {
- return FALSE;
- }
- }
- if (IsAlphaMask()) {
- if(!ConvertFormat(FXDIB_8bppMask)) {
- if (pSrcClone != pSrcBitmap) {
- delete pSrcClone;
- }
- return FALSE;
- }
- for (int row = 0; row < m_Height; row ++) {
- FX_LPBYTE dest_scan = m_pBuffer + m_Pitch * row;
- FX_LPBYTE src_scan = pSrcClone->m_pBuffer + pSrcClone->m_Pitch * row;
- if (pSrcClone->GetBPP() == 1) {
- for (int col = 0; col < m_Width; col ++) {
- if (!((1 << (7 - col % 8)) & src_scan[col / 8])) {
- dest_scan[col] = 0;
- }
- }
- } else {
- for (int col = 0; col < m_Width; col ++) {
- *dest_scan = (*dest_scan) * src_scan[col] / 255;
- dest_scan ++;
- }
- }
- }
- } else {
- if(GetFormat() == FXDIB_Argb) {
- if (pSrcClone->GetBPP() == 1) {
- if (pSrcClone != pSrcBitmap) {
- delete pSrcClone;
- }
- return FALSE;
- }
- for (int row = 0; row < m_Height; row ++) {
- FX_LPBYTE dest_scan = m_pBuffer + m_Pitch * row + 3;
- FX_LPBYTE src_scan = pSrcClone->m_pBuffer + pSrcClone->m_Pitch * row;
- for (int col = 0; col < m_Width; col ++) {
- *dest_scan = (*dest_scan) * src_scan[col] / 255;
- dest_scan += 4;
- }
- }
- } else {
- m_pAlphaMask->MultiplyAlpha(pSrcClone);
- }
- }
- if (pSrcClone != pSrcBitmap) {
- delete pSrcClone;
- }
- return TRUE;
-}
-FX_BOOL CFX_DIBitmap::GetGrayData(void* pIccTransform)
-{
- if (m_pBuffer == NULL) {
- return FALSE;
- }
- switch (GetFormat()) {
- case FXDIB_1bppRgb: {
- if (m_pPalette == NULL) {
- return FALSE;
- }
- FX_BYTE gray[2];
- for (int i = 0; i < 2; i ++) {
- int r = (FX_BYTE)(m_pPalette[i] >> 16);
- int g = (FX_BYTE)(m_pPalette[i] >> 8);
- int b = (FX_BYTE)m_pPalette[i];
- gray[i] = (FX_BYTE)FXRGB2GRAY(r, g, b);
- }
- CFX_DIBitmap* pMask = FX_NEW CFX_DIBitmap;
- if (!pMask) {
- return FALSE;
- }
- if (!pMask->Create(m_Width, m_Height, FXDIB_8bppMask)) {
- delete pMask;
- return FALSE;
- }
- FXSYS_memset8(pMask->GetBuffer(), gray[0], pMask->GetPitch() * m_Height);
- for (int row = 0; row < m_Height; row ++) {
- FX_LPBYTE src_pos = m_pBuffer + row * m_Pitch;
- FX_LPBYTE dest_pos = (FX_LPBYTE)pMask->GetScanline(row);
- for (int col = 0; col < m_Width; col ++) {
- if (src_pos[col / 8] & (1 << (7 - col % 8))) {
- *dest_pos = gray[1];
- }
- dest_pos ++;
- }
- }
- TakeOver(pMask);
- delete pMask;
- break;
- }
- case FXDIB_8bppRgb: {
- if (m_pPalette == NULL) {
- return FALSE;
- }
- FX_BYTE gray[256];
- for (int i = 0; i < 256; i ++) {
- int r = (FX_BYTE)(m_pPalette[i] >> 16);
- int g = (FX_BYTE)(m_pPalette[i] >> 8);
- int b = (FX_BYTE)m_pPalette[i];
- gray[i] = (FX_BYTE)FXRGB2GRAY(r, g, b);
- }
- CFX_DIBitmap* pMask = FX_NEW CFX_DIBitmap;
- if (!pMask) {
- return FALSE;
- }
- if (!pMask->Create(m_Width, m_Height, FXDIB_8bppMask)) {
- delete pMask;
- return FALSE;
- }
- for (int row = 0; row < m_Height; row ++) {
- FX_LPBYTE dest_pos = pMask->GetBuffer() + row * pMask->GetPitch();
- FX_LPBYTE src_pos = m_pBuffer + row * m_Pitch;
- for (int col = 0; col < m_Width; col ++) {
- *dest_pos ++ = gray[*src_pos ++];
- }
- }
- TakeOver(pMask);
- delete pMask;
- break;
- }
- case FXDIB_Rgb: {
- CFX_DIBitmap* pMask = FX_NEW CFX_DIBitmap;
- if (!pMask) {
- return FALSE;
- }
- if (!pMask->Create(m_Width, m_Height, FXDIB_8bppMask)) {
- delete pMask;
- return FALSE;
- }
- for (int row = 0; row < m_Height; row ++) {
- FX_LPBYTE src_pos = m_pBuffer + row * m_Pitch;
- FX_LPBYTE dest_pos = pMask->GetBuffer() + row * pMask->GetPitch();
- for (int col = 0; col < m_Width; col ++) {
- *dest_pos ++ = FXRGB2GRAY(src_pos[2], src_pos[1], *src_pos);
- src_pos += 3;
- }
- }
- TakeOver(pMask);
- delete pMask;
- break;
- }
- case FXDIB_Rgb32: {
- CFX_DIBitmap* pMask = FX_NEW CFX_DIBitmap;
- if (!pMask) {
- return FALSE;
- }
- if (!pMask->Create(m_Width, m_Height, FXDIB_8bppMask)) {
- delete pMask;
- return FALSE;
- }
- for (int row = 0; row < m_Height; row ++) {
- FX_LPBYTE src_pos = m_pBuffer + row * m_Pitch;
- FX_LPBYTE dest_pos = pMask->GetBuffer() + row * pMask->GetPitch();
- for (int col = 0; col < m_Width; col ++) {
- *dest_pos ++ = FXRGB2GRAY(src_pos[2], src_pos[1], *src_pos);
- src_pos += 4;
- }
- }
- TakeOver(pMask);
- delete pMask;
- break;
- }
- default:
- return FALSE;
- }
- return TRUE;
-}
-FX_BOOL CFX_DIBitmap::MultiplyAlpha(int alpha)
-{
- if (m_pBuffer == NULL) {
- return FALSE;
- }
- switch (GetFormat()) {
- case FXDIB_1bppMask:
- if (!ConvertFormat(FXDIB_8bppMask)) {
- return FALSE;
- }
- MultiplyAlpha(alpha);
- break;
- case FXDIB_8bppMask: {
- for (int row = 0; row < m_Height; row ++) {
- FX_LPBYTE scan_line = m_pBuffer + row * m_Pitch;
- for (int col = 0; col < m_Width; col ++) {
- scan_line[col] = scan_line[col] * alpha / 255;
- }
- }
- break;
- }
- case FXDIB_Argb: {
- for (int row = 0; row < m_Height; row ++) {
- FX_LPBYTE scan_line = m_pBuffer + row * m_Pitch + 3;
- for (int col = 0; col < m_Width; col ++) {
- *scan_line = (*scan_line) * alpha / 255;
- scan_line += 4;
- }
- }
- break;
- }
- default:
- if (HasAlpha()) {
- m_pAlphaMask->MultiplyAlpha(alpha);
- } else if (IsCmykImage()) {
- if (!ConvertFormat((FXDIB_Format)(GetFormat() | 0x0200))) {
- return FALSE;
- }
- m_pAlphaMask->MultiplyAlpha(alpha);
- } else {
- if (!ConvertFormat(FXDIB_Argb)) {
- return FALSE;
- }
- MultiplyAlpha(alpha);
- }
- break;
- }
- return TRUE;
-}
-#if !defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_)
-FX_DWORD CFX_DIBitmap::GetPixel(int x, int y) const
-{
- if (m_pBuffer == NULL) {
- return 0;
- }
- FX_LPBYTE pos = m_pBuffer + y * m_Pitch + x * GetBPP() / 8;
- switch (GetFormat()) {
- case FXDIB_1bppMask: {
- if ((*pos) & (1 << (7 - x % 8))) {
- return 0xff000000;
- }
- return 0;
- }
- case FXDIB_1bppRgb: {
- if ((*pos) & (1 << (7 - x % 8))) {
- return m_pPalette ? m_pPalette[1] : 0xffffffff;
- } else {
- return m_pPalette ? m_pPalette[0] : 0xff000000;
- }
- break;
- }
- case FXDIB_8bppMask:
- return (*pos) << 24;
- case FXDIB_8bppRgb:
- return m_pPalette ? m_pPalette[*pos] : (0xff000000 | ((*pos) * 0x10101));
- case FXDIB_Rgb:
- case FXDIB_Rgba:
- case FXDIB_Rgb32:
- return FXARGB_GETDIB(pos) | 0xff000000;
- case FXDIB_Argb:
- return FXARGB_GETDIB(pos);
- default:
- break;
- }
- return 0;
-}
-#endif
-void CFX_DIBitmap::SetPixel(int x, int y, FX_DWORD color)
-{
- if (m_pBuffer == NULL) {
- return;
- }
- if (x < 0 || x >= m_Width || y < 0 || y >= m_Height) {
- return;
- }
- FX_LPBYTE pos = m_pBuffer + y * m_Pitch + x * GetBPP() / 8;
- switch (GetFormat()) {
- case FXDIB_1bppMask:
- if (color >> 24) {
- *pos |= 1 << (7 - x % 8);
- } else {
- *pos &= ~(1 << (7 - x % 8));
- }
- break;
- case FXDIB_1bppRgb:
- if (m_pPalette) {
- if (color == m_pPalette[1]) {
- *pos |= 1 << (7 - x % 8);
- } else {
- *pos &= ~(1 << (7 - x % 8));
- }
- } else {
- if (color == 0xffffffff) {
- *pos |= 1 << (7 - x % 8);
- } else {
- *pos &= ~(1 << (7 - x % 8));
- }
- }
- break;
- case FXDIB_8bppMask:
- *pos = (FX_BYTE)(color >> 24);
- break;
- case FXDIB_8bppRgb: {
- if (m_pPalette) {
- for (int i = 0; i < 256; i ++) {
- if (m_pPalette[i] == color) {
- *pos = (FX_BYTE)i;
- return;
- }
- }
- *pos = 0;
- } else {
- *pos = FXRGB2GRAY(FXARGB_R(color), FXARGB_G(color), FXARGB_B(color));
- }
- break;
- }
- case FXDIB_Rgb:
- case FXDIB_Rgb32: {
- int alpha = FXARGB_A(color);
- pos[0] = (FXARGB_B(color) * alpha + pos[0] * (255 - alpha)) / 255;
- pos[1] = (FXARGB_G(color) * alpha + pos[1] * (255 - alpha)) / 255;
- pos[2] = (FXARGB_R(color) * alpha + pos[2] * (255 - alpha)) / 255;
- break;
- }
- case FXDIB_Rgba: {
- pos[0] = FXARGB_B(color);
- pos[1] = FXARGB_G(color);
- pos[2] = FXARGB_R(color);
- break;
- }
- case FXDIB_Argb:
- FXARGB_SETDIB(pos, color);
- break;
- default:
- break;
- }
-}
-void CFX_DIBitmap::DownSampleScanline(int line, FX_LPBYTE dest_scan, int dest_bpp,
- int dest_width, FX_BOOL bFlipX, int clip_left, int clip_width) const
-{
- if (m_pBuffer == NULL) {
- return;
- }
- int src_Bpp = m_bpp / 8;
- FX_LPBYTE scanline = m_pBuffer + line * m_Pitch;
- if (src_Bpp == 0) {
- for (int i = 0; i < clip_width; i ++) {
- FX_DWORD dest_x = clip_left + i;
- FX_DWORD src_x = dest_x * m_Width / dest_width;
- if (bFlipX) {
- src_x = m_Width - src_x - 1;
- }
-#ifdef FOXIT_CHROME_BUILD
- src_x %= m_Width;
-#endif
- dest_scan[i] = (scanline[src_x / 8] & (1 << (7 - src_x % 8))) ? 255 : 0;
- }
- } else if (src_Bpp == 1) {
- for (int i = 0; i < clip_width; i ++) {
- FX_DWORD dest_x = clip_left + i;
- FX_DWORD src_x = dest_x * m_Width / dest_width;
- if (bFlipX) {
- src_x = m_Width - src_x - 1;
- }
-#ifdef FOXIT_CHROME_BUILD
- src_x %= m_Width;
-#endif
- int dest_pos = i;
- if (m_pPalette) {
- if (!IsCmykImage()) {
- dest_pos *= 3;
- FX_ARGB argb = m_pPalette[scanline[src_x]];
- dest_scan[dest_pos] = FXARGB_B(argb);
- dest_scan[dest_pos + 1] = FXARGB_G(argb);
- dest_scan[dest_pos + 2] = FXARGB_R(argb);
- } else {
- dest_pos *= 4;
- FX_CMYK cmyk = m_pPalette[scanline[src_x]];
- dest_scan[dest_pos] = FXSYS_GetCValue(cmyk);
- dest_scan[dest_pos + 1] = FXSYS_GetMValue(cmyk);
- dest_scan[dest_pos + 2] = FXSYS_GetYValue(cmyk);
- dest_scan[dest_pos + 3] = FXSYS_GetKValue(cmyk);
- }
- } else {
- dest_scan[dest_pos] = scanline[src_x];
- }
- }
- } else {
- for (int i = 0; i < clip_width; i ++) {
- FX_DWORD dest_x = clip_left + i;
- FX_DWORD src_x = bFlipX ? (m_Width - dest_x * m_Width / dest_width - 1) * src_Bpp : (dest_x * m_Width / dest_width) * src_Bpp;
-#ifdef FOXIT_CHROME_BUILD
- src_x %= m_Width * src_Bpp;
-#endif
- int dest_pos = i * src_Bpp;
- for (int b = 0; b < src_Bpp; b ++) {
- dest_scan[dest_pos + b] = scanline[src_x + b];
- }
- }
- }
-}
-FX_BOOL CFX_DIBitmap::ConvertColorScale(FX_DWORD forecolor, FX_DWORD backcolor)
-{
- ASSERT(!IsAlphaMask());
- if (m_pBuffer == NULL || IsAlphaMask()) {
- return FALSE;
- }
- int fc, fm, fy, fk, bc, bm, by, bk;
- int fr, fg, fb, br, bg, bb;
- FX_BOOL isCmykImage = IsCmykImage();
- if (isCmykImage) {
- fc = FXSYS_GetCValue(forecolor);
- fm = FXSYS_GetMValue(forecolor);
- fy = FXSYS_GetYValue(forecolor);
- fk = FXSYS_GetKValue(forecolor);
- bc = FXSYS_GetCValue(backcolor);
- bm = FXSYS_GetMValue(backcolor);
- by = FXSYS_GetYValue(backcolor);
- bk = FXSYS_GetKValue(backcolor);
- } else {
- fr = FXSYS_GetRValue(forecolor);
- fg = FXSYS_GetGValue(forecolor);
- fb = FXSYS_GetBValue(forecolor);
- br = FXSYS_GetRValue(backcolor);
- bg = FXSYS_GetGValue(backcolor);
- bb = FXSYS_GetBValue(backcolor);
- }
- if (m_bpp <= 8) {
- if (isCmykImage) {
- if (forecolor == 0xff && backcolor == 0 && m_pPalette == NULL) {
- return TRUE;
- }
- } else if (forecolor == 0 && backcolor == 0xffffff && m_pPalette == NULL) {
- return TRUE;
- }
- if (m_pPalette == NULL) {
- BuildPalette();
- }
- int size = 1 << m_bpp;
- if (isCmykImage) {
- for (int i = 0; i < size; i ++) {
- FX_BYTE b, g, r;
- AdobeCMYK_to_sRGB1(FXSYS_GetCValue(m_pPalette[i]), FXSYS_GetMValue(m_pPalette[i]), FXSYS_GetYValue(m_pPalette[i]), FXSYS_GetKValue(m_pPalette[i]),
- r, g, b);
- int gray = 255 - FXRGB2GRAY(r, g, b);
- m_pPalette[i] = CmykEncode(bc + (fc - bc) * gray / 255, bm + (fm - bm) * gray / 255,
- by + (fy - by) * gray / 255, bk + (fk - bk) * gray / 255);
- }
- } else
- for (int i = 0; i < size; i ++) {
- int gray = FXRGB2GRAY(FXARGB_R(m_pPalette[i]), FXARGB_G(m_pPalette[i]), FXARGB_B(m_pPalette[i]));
- m_pPalette[i] = FXARGB_MAKE(0xff, br + (fr - br) * gray / 255, bg + (fg - bg) * gray / 255,
- bb + (fb - bb) * gray / 255);
- }
- return TRUE;
- }
- if (isCmykImage) {
- if (forecolor == 0xff && backcolor == 0x00) {
- for (int row = 0; row < m_Height; row ++) {
- FX_LPBYTE scanline = m_pBuffer + row * m_Pitch;
- for (int col = 0; col < m_Width; col ++) {
- FX_BYTE b, g, r;
- AdobeCMYK_to_sRGB1(scanline[0], scanline[1], scanline[2], scanline[3],
- r, g, b);
- *scanline ++ = 0;
- *scanline ++ = 0;
- *scanline ++ = 0;
- *scanline ++ = 255 - FXRGB2GRAY(r, g, b);
- }
- }
- return TRUE;
- }
- } else if (forecolor == 0 && backcolor == 0xffffff) {
- for (int row = 0; row < m_Height; row ++) {
- FX_LPBYTE scanline = m_pBuffer + row * m_Pitch;
- int gap = m_bpp / 8 - 2;
- for (int col = 0; col < m_Width; col ++) {
- int gray = FXRGB2GRAY(scanline[2], scanline[1], scanline[0]);
- *scanline ++ = gray;
- *scanline ++ = gray;
- *scanline = gray;
- scanline += gap;
- }
- }
- return TRUE;
- }
- if (isCmykImage) {
- for (int row = 0; row < m_Height; row ++) {
- FX_LPBYTE scanline = m_pBuffer + row * m_Pitch;
- for (int col = 0; col < m_Width; col ++) {
- FX_BYTE b, g, r;
- AdobeCMYK_to_sRGB1(scanline[0], scanline[1], scanline[2], scanline[3],
- r, g, b);
- int gray = 255 - FXRGB2GRAY(r, g, b);
- *scanline ++ = bc + (fc - bc) * gray / 255;
- *scanline ++ = bm + (fm - bm) * gray / 255;
- *scanline ++ = by + (fy - by) * gray / 255;
- *scanline ++ = bk + (fk - bk) * gray / 255;
- }
- }
- } else
- for (int row = 0; row < m_Height; row ++) {
- FX_LPBYTE scanline = m_pBuffer + row * m_Pitch;
- int gap = m_bpp / 8 - 2;
- for (int col = 0; col < m_Width; col ++) {
- int gray = FXRGB2GRAY(scanline[2], scanline[1], scanline[0]);
- *scanline ++ = bb + (fb - bb) * gray / 255;
- *scanline ++ = bg + (fg - bg) * gray / 255;
- *scanline = br + (fr - br) * gray / 255;
- scanline += gap;
- }
- }
- return TRUE;
-}
-FX_BOOL CFX_DIBitmap::DitherFS(const FX_DWORD* pPalette, int pal_size, const FX_RECT* pRect)
-{
- if (m_pBuffer == NULL) {
- return FALSE;
- }
- if (m_bpp != 8 && m_pPalette != NULL && m_AlphaFlag != 0) {
- return FALSE;
- }
- if (m_Width < 4 && m_Height < 4) {
- return FALSE;
- }
- FX_RECT rect(0, 0, m_Width, m_Height);
- if (pRect) {
- rect.Intersect(*pRect);
- }
- FX_BYTE translate[256];
- for (int i = 0; i < 256; i ++) {
- int err2 = 65536;
- for (int j = 0; j < pal_size; j ++) {
- FX_BYTE entry = (FX_BYTE)pPalette[j];
- int err = (int)entry - i;
- if (err * err < err2) {
- err2 = err * err;
- translate[i] = entry;
- }
- }
- }
- for (int row = rect.top; row < rect.bottom; row ++) {
- FX_LPBYTE scan = m_pBuffer + row * m_Pitch;
- FX_LPBYTE next_scan = m_pBuffer + (row + 1) * m_Pitch;
- for (int col = rect.left; col < rect.right; col ++) {
- int src_pixel = scan[col];
- int dest_pixel = translate[src_pixel];
- scan[col] = (FX_BYTE)dest_pixel;
- int error = -dest_pixel + src_pixel;
- if (col < rect.right - 1) {
- int src = scan[col + 1];
- src += error * 7 / 16;
- if (src > 255) {
- scan[col + 1] = 255;
- } else if (src < 0) {
- scan[col + 1] = 0;
- } else {
- scan[col + 1] = src;
- }
- }
- if (col < rect.right - 1 && row < rect.bottom - 1) {
- int src = next_scan[col + 1];
- src += error * 1 / 16;
- if (src > 255) {
- next_scan[col + 1] = 255;
- } else if (src < 0) {
- next_scan[col + 1] = 0;
- } else {
- next_scan[col + 1] = src;
- }
- }
- if (row < rect.bottom - 1) {
- int src = next_scan[col];
- src += error * 5 / 16;
- if (src > 255) {
- next_scan[col] = 255;
- } else if (src < 0) {
- next_scan[col] = 0;
- } else {
- next_scan[col] = src;
- }
- }
- if (col > rect.left && row < rect.bottom - 1) {
- int src = next_scan[col - 1];
- src += error * 3 / 16;
- if (src > 255) {
- next_scan[col - 1] = 255;
- } else if (src < 0) {
- next_scan[col - 1] = 0;
- } else {
- next_scan[col - 1] = src;
- }
- }
- }
- }
- return TRUE;
-}
-CFX_DIBitmap* CFX_DIBSource::FlipImage(FX_BOOL bXFlip, FX_BOOL bYFlip) const
-{
- CFX_DIBitmap* pFlipped = FX_NEW CFX_DIBitmap;
- if (!pFlipped) {
- return NULL;
- }
- if (!pFlipped->Create(m_Width, m_Height, GetFormat())) {
- delete pFlipped;
- return NULL;
- }
- pFlipped->CopyPalette(m_pPalette);
- FX_LPBYTE pDestBuffer = pFlipped->GetBuffer();
- int Bpp = m_bpp / 8;
- for (int row = 0; row < m_Height; row ++) {
- FX_LPCBYTE src_scan = GetScanline(row);
- FX_LPBYTE dest_scan = pDestBuffer + m_Pitch * (bYFlip ? (m_Height - row - 1) : row);
- if (!bXFlip) {
- FXSYS_memcpy32(dest_scan, src_scan, m_Pitch);
- continue;
- }
- if (m_bpp == 1) {
- FXSYS_memset32(dest_scan, 0, m_Pitch);
- for (int col = 0; col < m_Width; col ++)
- if (src_scan[col / 8] & (1 << (7 - col % 8))) {
- int dest_col = m_Width - col - 1;
- dest_scan[dest_col / 8] |= (1 << (7 - dest_col % 8));
- }
- } else {
- dest_scan += (m_Width - 1) * Bpp;
- if (Bpp == 1) {
- for (int col = 0; col < m_Width; col ++) {
- *dest_scan = *src_scan;
- dest_scan --;
- src_scan ++;
- }
- } else if (Bpp == 3) {
- for (int col = 0; col < m_Width; col ++) {
- dest_scan[0] = src_scan[0];
- dest_scan[1] = src_scan[1];
- dest_scan[2] = src_scan[2];
- dest_scan -= 3;
- src_scan += 3;
- }
- } else {
- ASSERT(Bpp == 4);
- for (int col = 0; col < m_Width; col ++) {
- *(FX_DWORD*)dest_scan = *(FX_DWORD*)src_scan;
- dest_scan -= 4;
- src_scan += 4;
- }
- }
- }
- }
- if (m_pAlphaMask) {
- pDestBuffer = pFlipped->m_pAlphaMask->GetBuffer();
- FX_DWORD dest_pitch = pFlipped->m_pAlphaMask->GetPitch();
- for (int row = 0; row < m_Height; row ++) {
- FX_LPCBYTE src_scan = m_pAlphaMask->GetScanline(row);
- FX_LPBYTE dest_scan = pDestBuffer + dest_pitch * (bYFlip ? (m_Height - row - 1) : row);
- if (!bXFlip) {
- FXSYS_memcpy32(dest_scan, src_scan, dest_pitch);
- continue;
- }
- dest_scan += (m_Width - 1);
- for (int col = 0; col < m_Width; col ++) {
- *dest_scan = *src_scan;
- dest_scan --;
- src_scan ++;
- }
- }
- }
- return pFlipped;
-}
-CFX_DIBExtractor::CFX_DIBExtractor(const CFX_DIBSource* pSrc)
-{
- m_pBitmap = NULL;
- if (pSrc->GetBuffer() == NULL) {
- m_pBitmap = pSrc->Clone();
- } else {
- m_pBitmap = FX_NEW CFX_DIBitmap;
- if (!m_pBitmap) {
- return;
- }
- if (!m_pBitmap->Create(pSrc->GetWidth(), pSrc->GetHeight(), pSrc->GetFormat(), pSrc->GetBuffer())) {
- delete m_pBitmap;
- m_pBitmap = NULL;
- return;
- }
- m_pBitmap->CopyPalette(pSrc->GetPalette());
- m_pBitmap->CopyAlphaMask(pSrc->m_pAlphaMask);
- }
-}
-CFX_DIBExtractor::~CFX_DIBExtractor()
-{
- if (m_pBitmap) {
- delete m_pBitmap;
- }
-}
-CFX_FilteredDIB::CFX_FilteredDIB()
-{
- m_pScanline = NULL;
- m_pSrc = NULL;
-}
-CFX_FilteredDIB::~CFX_FilteredDIB()
-{
- if (m_pSrc && m_bAutoDropSrc) {
- delete m_pSrc;
- }
- if (m_pScanline) {
- FX_Free(m_pScanline);
- }
-}
-void CFX_FilteredDIB::LoadSrc(const CFX_DIBSource* pSrc, FX_BOOL bAutoDropSrc)
-{
- m_pSrc = pSrc;
- m_bAutoDropSrc = bAutoDropSrc;
- m_Width = pSrc->GetWidth();
- m_Height = pSrc->GetHeight();
- FXDIB_Format format = GetDestFormat();
- m_bpp = (FX_BYTE)format;
- m_AlphaFlag = (FX_BYTE)(format >> 8);
- m_Pitch = (m_Width * (format & 0xff) + 31) / 32 * 4;
- m_pPalette = GetDestPalette();
- m_pScanline = FX_Alloc(FX_BYTE, m_Pitch);
-}
-FX_LPCBYTE CFX_FilteredDIB::GetScanline(int line) const
-{
- TranslateScanline(m_pScanline, m_pSrc->GetScanline(line));
- return m_pScanline;
-}
-void CFX_FilteredDIB::DownSampleScanline(int line, FX_LPBYTE dest_scan, int dest_bpp,
- int dest_width, FX_BOOL bFlipX, int clip_left, int clip_width) const
-{
- m_pSrc->DownSampleScanline(line, dest_scan, dest_bpp, dest_width, bFlipX, clip_left, clip_width);
- TranslateDownSamples(dest_scan, dest_scan, clip_width, dest_bpp);
-}
-CFX_ImageRenderer::CFX_ImageRenderer()
-{
- m_Status = 0;
- m_pTransformer = NULL;
- m_bRgbByteOrder = FALSE;
- m_BlendType = FXDIB_BLEND_NORMAL;
-}
-CFX_ImageRenderer::~CFX_ImageRenderer()
-{
- if (m_pTransformer) {
- delete m_pTransformer;
- }
-}
-extern FX_RECT _FXDIB_SwapClipBox(FX_RECT& clip, int width, int height, FX_BOOL bFlipX, FX_BOOL bFlipY);
-FX_BOOL CFX_ImageRenderer::Start(CFX_DIBitmap* pDevice, const CFX_ClipRgn* pClipRgn,
- const CFX_DIBSource* pSource, int bitmap_alpha,
- FX_DWORD mask_color, const CFX_AffineMatrix* pMatrix,
- FX_DWORD dib_flags, FX_BOOL bRgbByteOrder,
- int alpha_flag, void* pIccTransform, int blend_type)
-{
- m_Matrix = *pMatrix;
- CFX_FloatRect image_rect_f = m_Matrix.GetUnitRect();
- FX_RECT image_rect = image_rect_f.GetOutterRect();
- m_ClipBox = pClipRgn ? pClipRgn->GetBox() : FX_RECT(0, 0, pDevice->GetWidth(), pDevice->GetHeight());
- m_ClipBox.Intersect(image_rect);
- if (m_ClipBox.IsEmpty()) {
- return FALSE;
- }
- m_pDevice = pDevice;
- m_pClipRgn = pClipRgn;
- m_MaskColor = mask_color;
- m_BitmapAlpha = bitmap_alpha;
- m_Matrix = *pMatrix;
- m_Flags = dib_flags;
- m_AlphaFlag = alpha_flag;
- m_pIccTransform = pIccTransform;
- m_bRgbByteOrder = bRgbByteOrder;
- m_BlendType = blend_type;
- FX_BOOL ret = TRUE;
- if ((FXSYS_fabs(m_Matrix.b) >= 0.5f || m_Matrix.a == 0) ||
- (FXSYS_fabs(m_Matrix.c) >= 0.5f || m_Matrix.d == 0) ) {
- if (FXSYS_fabs(m_Matrix.a) < FXSYS_fabs(m_Matrix.b) / 20 && FXSYS_fabs(m_Matrix.d) < FXSYS_fabs(m_Matrix.c) / 20 &&
- FXSYS_fabs(m_Matrix.a) < 0.5f && FXSYS_fabs(m_Matrix.d) < 0.5f) {
- int dest_width = image_rect.Width();
- int dest_height = image_rect.Height();
- FX_RECT bitmap_clip = m_ClipBox;
- bitmap_clip.Offset(-image_rect.left, -image_rect.top);
- bitmap_clip = _FXDIB_SwapClipBox(bitmap_clip, dest_width, dest_height, m_Matrix.c > 0, m_Matrix.b < 0);
- m_Composer.Compose(pDevice, pClipRgn, bitmap_alpha, mask_color, m_ClipBox, TRUE,
- m_Matrix.c > 0, m_Matrix.b < 0, m_bRgbByteOrder, alpha_flag, pIccTransform, m_BlendType);
- if (!m_Stretcher.Start(&m_Composer, pSource, dest_height, dest_width, bitmap_clip, dib_flags)) {
- return FALSE;
- }
- m_Status = 1;
- return TRUE;
- }
- m_Status = 2;
- m_pTransformer = FX_NEW CFX_ImageTransformer;
- if (!m_pTransformer) {
- return FALSE;
- }
- m_pTransformer->Start(pSource, &m_Matrix, dib_flags, &m_ClipBox);
- return TRUE;
- }
- int dest_width = image_rect.Width();
- if (m_Matrix.a < 0) {
- dest_width = -dest_width;
- }
- int dest_height = image_rect.Height();
- if (m_Matrix.d > 0) {
- dest_height = -dest_height;
- }
- if (dest_width == 0 || dest_height == 0) {
- return FALSE;
- }
- FX_RECT bitmap_clip = m_ClipBox;
- bitmap_clip.Offset(-image_rect.left, -image_rect.top);
- m_Composer.Compose(pDevice, pClipRgn, bitmap_alpha, mask_color,
- m_ClipBox, FALSE, FALSE, FALSE, m_bRgbByteOrder, alpha_flag, pIccTransform, m_BlendType);
- m_Status = 1;
- ret = m_Stretcher.Start(&m_Composer, pSource, dest_width, dest_height, bitmap_clip, dib_flags);
- return ret;
-}
-FX_BOOL CFX_ImageRenderer::Continue(IFX_Pause* pPause)
-{
- if (m_Status == 1) {
- return m_Stretcher.Continue(pPause);
- } else if (m_Status == 2) {
- if (m_pTransformer->Continue(pPause)) {
- return TRUE;
- }
- CFX_DIBitmap* pBitmap = m_pTransformer->m_Storer.Detach();
- if (pBitmap == NULL) {
- return FALSE;
- }
- if (pBitmap->GetBuffer() == NULL) {
- delete pBitmap;
- return FALSE;
- }
- if (pBitmap->IsAlphaMask()) {
- if (m_BitmapAlpha != 255) {
- if (m_AlphaFlag >> 8) {
- m_AlphaFlag = (((FX_BYTE)((m_AlphaFlag & 0xff) * m_BitmapAlpha / 255)) | ((m_AlphaFlag >> 8) << 8));
- } else {
- m_MaskColor = FXARGB_MUL_ALPHA(m_MaskColor, m_BitmapAlpha);
- }
- }
- m_pDevice->CompositeMask(m_pTransformer->m_ResultLeft, m_pTransformer->m_ResultTop,
- pBitmap->GetWidth(), pBitmap->GetHeight(), pBitmap, m_MaskColor,
- 0, 0, m_BlendType, m_pClipRgn, m_bRgbByteOrder, m_AlphaFlag, m_pIccTransform);
- } else {
- if (m_BitmapAlpha != 255) {
- pBitmap->MultiplyAlpha(m_BitmapAlpha);
- }
- m_pDevice->CompositeBitmap(m_pTransformer->m_ResultLeft, m_pTransformer->m_ResultTop,
- pBitmap->GetWidth(), pBitmap->GetHeight(), pBitmap, 0, 0, m_BlendType, m_pClipRgn, m_bRgbByteOrder, m_pIccTransform);
- }
- delete pBitmap;
- return FALSE;
- }
- return FALSE;
-}
-CFX_BitmapStorer::CFX_BitmapStorer()
-{
- m_pBitmap = NULL;
-}
-CFX_BitmapStorer::~CFX_BitmapStorer()
-{
- if (m_pBitmap) {
- delete m_pBitmap;
- }
-}
-CFX_DIBitmap* CFX_BitmapStorer::Detach()
-{
- CFX_DIBitmap* pBitmap = m_pBitmap;
- m_pBitmap = NULL;
- return pBitmap;
-}
-void CFX_BitmapStorer::Replace(CFX_DIBitmap* pBitmap)
-{
- if (m_pBitmap) {
- delete m_pBitmap;
- }
- m_pBitmap = pBitmap;
-}
-void CFX_BitmapStorer::ComposeScanline(int line, FX_LPCBYTE scanline, FX_LPCBYTE scan_extra_alpha)
-{
- FX_LPBYTE dest_buf = (FX_LPBYTE)m_pBitmap->GetScanline(line);
- FX_LPBYTE dest_alpha_buf = m_pBitmap->m_pAlphaMask ?
- (FX_LPBYTE)m_pBitmap->m_pAlphaMask->GetScanline(line) : NULL;
- if (dest_buf) {
- FXSYS_memcpy32(dest_buf, scanline, m_pBitmap->GetPitch());
- }
- if (dest_alpha_buf) {
- FXSYS_memcpy32(dest_alpha_buf, scan_extra_alpha, m_pBitmap->m_pAlphaMask->GetPitch());
- }
-}
-FX_BOOL CFX_BitmapStorer::SetInfo(int width, int height, FXDIB_Format src_format, FX_DWORD* pSrcPalette)
-{
- m_pBitmap = FX_NEW CFX_DIBitmap;
- if (!m_pBitmap) {
- return FALSE;
- }
- if (!m_pBitmap->Create(width, height, src_format)) {
- delete m_pBitmap;
- m_pBitmap = NULL;
- return FALSE;
- }
- if (pSrcPalette) {
- m_pBitmap->CopyPalette(pSrcPalette);
- }
- return TRUE;
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxge/fx_dib.h"
+#include "../../../include/fxge/fx_ge.h"
+#include "../../../include/fxcodec/fx_codec.h"
+#include "dib_int.h"
+#include <limits.h>
+FX_BOOL ConvertBuffer(FXDIB_Format dest_format, FX_LPBYTE dest_buf, int dest_pitch, int width, int height,
+ const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, FX_DWORD*& pal, void* pIccTransform);
+void CmykDecode(FX_DWORD cmyk, int& c, int& m, int& y, int& k)
+{
+ c = FXSYS_GetCValue(cmyk);
+ m = FXSYS_GetMValue(cmyk);
+ y = FXSYS_GetYValue(cmyk);
+ k = FXSYS_GetKValue(cmyk);
+}
+void ArgbDecode(FX_DWORD argb, int& a, int& r, int& g, int& b)
+{
+ a = FXARGB_A(argb);
+ r = FXARGB_R(argb);
+ g = FXARGB_G(argb);
+ b = FXARGB_B(argb);
+}
+void ArgbDecode(FX_DWORD argb, int& a, FX_COLORREF& rgb)
+{
+ a = FXARGB_A(argb);
+ rgb = FXSYS_RGB(FXARGB_R(argb), FXARGB_G(argb), FXARGB_B(argb));
+}
+FX_DWORD ArgbEncode(int a, FX_COLORREF rgb)
+{
+ return FXARGB_MAKE(a, FXSYS_GetRValue(rgb), FXSYS_GetGValue(rgb), FXSYS_GetBValue(rgb));
+}
+CFX_DIBSource::CFX_DIBSource()
+{
+ m_bpp = 0;
+ m_AlphaFlag = 0;
+ m_Width = m_Height = 0;
+ m_Pitch = 0;
+ m_pPalette = NULL;
+ m_pAlphaMask = NULL;
+}
+CFX_DIBSource::~CFX_DIBSource()
+{
+ if (m_pPalette) {
+ FX_Free(m_pPalette);
+ }
+ if (m_pAlphaMask) {
+ delete m_pAlphaMask;
+ }
+}
+CFX_DIBitmap::CFX_DIBitmap()
+{
+ m_bExtBuf = FALSE;
+ m_pBuffer = NULL;
+ m_pPalette = NULL;
+}
+#define _MAX_OOM_LIMIT_ 12000000
+FX_BOOL CFX_DIBitmap::Create(int width, int height, FXDIB_Format format, FX_LPBYTE pBuffer, int pitch)
+{
+ m_pBuffer = NULL;
+ m_bpp = (FX_BYTE)format;
+ m_AlphaFlag = (FX_BYTE)(format >> 8);
+ m_Width = m_Height = m_Pitch = 0;
+ if (width <= 0 || height <= 0 || pitch < 0) {
+ return FALSE;
+ }
+ if ((INT_MAX - 31) / width < (format & 0xff)) {
+ return FALSE;
+ }
+ if (!pitch) {
+ pitch = (width * (format & 0xff) + 31) / 32 * 4;
+ }
+ if ((1 << 30) / pitch < height) {
+ return FALSE;
+ }
+ if (pBuffer) {
+ m_pBuffer = pBuffer;
+ m_bExtBuf = TRUE;
+ } else {
+ int size = pitch * height + 4;
+ int oomlimit = _MAX_OOM_LIMIT_;
+ if (oomlimit >= 0 && size >= oomlimit) {
+ m_pBuffer = FX_AllocNL(FX_BYTE, size);
+ } else {
+ m_pBuffer = FX_Alloc(FX_BYTE, size);
+ }
+ if (m_pBuffer == NULL) {
+ return FALSE;
+ }
+ FXSYS_memset32(m_pBuffer, 0, sizeof (FX_BYTE) * size);
+ }
+ m_Width = width;
+ m_Height = height;
+ m_Pitch = pitch;
+ if (HasAlpha() && format != FXDIB_Argb) {
+ FX_BOOL ret = TRUE;
+ ret = BuildAlphaMask();
+ if (!ret) {
+ if (!m_bExtBuf && m_pBuffer) {
+ FX_Free(m_pBuffer);
+ m_pBuffer = NULL;
+ m_Width = m_Height = m_Pitch = 0;
+ return FALSE;
+ }
+ }
+ }
+ return TRUE;
+}
+FX_BOOL CFX_DIBitmap::Copy(const CFX_DIBSource* pSrc)
+{
+ if (m_pBuffer) {
+ return FALSE;
+ }
+ if (!Create(pSrc->GetWidth(), pSrc->GetHeight(), pSrc->GetFormat())) {
+ return FALSE;
+ }
+ CopyPalette(pSrc->GetPalette());
+ CopyAlphaMask(pSrc->m_pAlphaMask);
+ for (int row = 0; row < pSrc->GetHeight(); row ++) {
+ FXSYS_memcpy32(m_pBuffer + row * m_Pitch, pSrc->GetScanline(row), m_Pitch);
+ }
+ return TRUE;
+}
+CFX_DIBitmap::~CFX_DIBitmap()
+{
+ if (m_pBuffer && !m_bExtBuf) {
+ FX_Free(m_pBuffer);
+ }
+ m_pBuffer = NULL;
+}
+void CFX_DIBitmap::TakeOver(CFX_DIBitmap* pSrcBitmap)
+{
+ if (m_pBuffer && !m_bExtBuf) {
+ FX_Free(m_pBuffer);
+ }
+ if (m_pPalette) {
+ FX_Free(m_pPalette);
+ }
+ if (m_pAlphaMask) {
+ delete m_pAlphaMask;
+ }
+ m_pBuffer = pSrcBitmap->m_pBuffer;
+ m_pPalette = pSrcBitmap->m_pPalette;
+ m_pAlphaMask = pSrcBitmap->m_pAlphaMask;
+ pSrcBitmap->m_pBuffer = NULL;
+ pSrcBitmap->m_pPalette = NULL;
+ pSrcBitmap->m_pAlphaMask = NULL;
+ m_bpp = pSrcBitmap->m_bpp;
+ m_bExtBuf = pSrcBitmap->m_bExtBuf;
+ m_AlphaFlag = pSrcBitmap->m_AlphaFlag;
+ m_Width = pSrcBitmap->m_Width;
+ m_Height = pSrcBitmap->m_Height;
+ m_Pitch = pSrcBitmap->m_Pitch;
+}
+CFX_DIBitmap* CFX_DIBSource::Clone(const FX_RECT* pClip) const
+{
+ FX_RECT rect(0, 0, m_Width, m_Height);
+ if (pClip) {
+ rect.Intersect(*pClip);
+ if (rect.IsEmpty()) {
+ return NULL;
+ }
+ }
+ CFX_DIBitmap* pNewBitmap = FX_NEW CFX_DIBitmap;
+ if (!pNewBitmap) {
+ return NULL;
+ }
+ if (!pNewBitmap->Create(rect.Width(), rect.Height(), GetFormat())) {
+ delete pNewBitmap;
+ return NULL;
+ }
+ pNewBitmap->CopyPalette(m_pPalette);
+ pNewBitmap->CopyAlphaMask(m_pAlphaMask, pClip);
+ if (GetBPP() == 1 && rect.left % 8 != 0) {
+ int left_shift = rect.left % 32;
+ int right_shift = 32 - left_shift;
+ int dword_count = pNewBitmap->m_Pitch / 4;
+ for (int row = rect.top; row < rect.bottom; row ++) {
+ FX_DWORD* src_scan = (FX_DWORD*)GetScanline(row) + rect.left / 32;
+ FX_DWORD* dest_scan = (FX_DWORD*)pNewBitmap->GetScanline(row - rect.top);
+ for (int i = 0; i < dword_count; i ++) {
+ dest_scan[i] = (src_scan[i] << left_shift) | (src_scan[i + 1] >> right_shift);
+ }
+ }
+ } else {
+ int copy_len = (pNewBitmap->GetWidth() * pNewBitmap->GetBPP() + 7) / 8;
+ if (m_Pitch < (FX_DWORD)copy_len) {
+ copy_len = m_Pitch;
+ }
+ for (int row = rect.top; row < rect.bottom; row ++) {
+ FX_LPCBYTE src_scan = GetScanline(row) + rect.left * m_bpp / 8;
+ FX_LPBYTE dest_scan = (FX_LPBYTE)pNewBitmap->GetScanline(row - rect.top);
+ FXSYS_memcpy32(dest_scan, src_scan, copy_len);
+ }
+ }
+ return pNewBitmap;
+}
+void CFX_DIBSource::BuildPalette()
+{
+ if (m_pPalette) {
+ return;
+ }
+ if (GetBPP() == 1) {
+ m_pPalette = FX_Alloc(FX_DWORD, 2);
+ if (!m_pPalette) {
+ return;
+ }
+ if(IsCmykImage()) {
+ m_pPalette[0] = 0xff;
+ m_pPalette[1] = 0;
+ } else {
+ m_pPalette[0] = 0xff000000;
+ m_pPalette[1] = 0xffffffff;
+ }
+ } else if (GetBPP() == 8) {
+ m_pPalette = FX_Alloc(FX_DWORD, 256);
+ if (!m_pPalette) {
+ return;
+ }
+ if(IsCmykImage()) {
+ for (int i = 0; i < 256; i ++) {
+ m_pPalette[i] = 0xff - i;
+ }
+ } else {
+ for (int i = 0; i < 256; i ++) {
+ m_pPalette[i] = 0xff000000 | (i * 0x10101);
+ }
+ }
+ }
+}
+FX_BOOL CFX_DIBSource::BuildAlphaMask()
+{
+ if (m_pAlphaMask) {
+ return TRUE;
+ }
+ m_pAlphaMask = FX_NEW CFX_DIBitmap;
+ if (!m_pAlphaMask) {
+ return FALSE;
+ }
+ if (!m_pAlphaMask->Create(m_Width, m_Height, FXDIB_8bppMask)) {
+ delete m_pAlphaMask;
+ m_pAlphaMask = NULL;
+ return FALSE;
+ }
+ FXSYS_memset8(m_pAlphaMask->GetBuffer(), 0xff, m_pAlphaMask->GetHeight()*m_pAlphaMask->GetPitch());
+ return TRUE;
+}
+FX_DWORD CFX_DIBSource::GetPaletteEntry(int index) const
+{
+ ASSERT((GetBPP() == 1 || GetBPP() == 8) && !IsAlphaMask());
+ if (m_pPalette) {
+ return m_pPalette[index];
+ }
+ if (IsCmykImage()) {
+ if (GetBPP() == 1) {
+ return index ? 0 : 0xff;
+ }
+ return 0xff - index;
+ }
+ if (GetBPP() == 1) {
+ return index ? 0xffffffff : 0xff000000;
+ }
+ return index * 0x10101 | 0xff000000;
+}
+void CFX_DIBSource::SetPaletteEntry(int index, FX_DWORD color)
+{
+ ASSERT((GetBPP() == 1 || GetBPP() == 8) && !IsAlphaMask());
+ if (m_pPalette == NULL) {
+ BuildPalette();
+ }
+ m_pPalette[index] = color;
+}
+int CFX_DIBSource::FindPalette(FX_DWORD color) const
+{
+ ASSERT((GetBPP() == 1 || GetBPP() == 8) && !IsAlphaMask());
+ if (m_pPalette == NULL) {
+ if (IsCmykImage()) {
+ if (GetBPP() == 1) {
+ return ((FX_BYTE)color == 0xff) ? 0 : 1;
+ }
+ return 0xff - (FX_BYTE)color;
+ }
+ if (GetBPP() == 1) {
+ return ((FX_BYTE)color == 0xff) ? 1 : 0;
+ }
+ return (FX_BYTE)color;
+ }
+ int palsize = (1 << GetBPP());
+ for (int i = 0; i < palsize; i ++)
+ if (m_pPalette[i] == color) {
+ return i;
+ }
+ return -1;
+}
+void CFX_DIBitmap::Clear(FX_DWORD color)
+{
+ if (m_pBuffer == NULL) {
+ return;
+ }
+ switch (GetFormat()) {
+ case FXDIB_1bppMask:
+ FXSYS_memset8(m_pBuffer, (color & 0xff000000) ? 0xff : 0, m_Pitch * m_Height);
+ break;
+ case FXDIB_1bppRgb: {
+ int index = FindPalette(color);
+ FXSYS_memset8(m_pBuffer, index ? 0xff : 0, m_Pitch * m_Height);
+ break;
+ }
+ case FXDIB_8bppMask:
+ FXSYS_memset8(m_pBuffer, color >> 24, m_Pitch * m_Height);
+ break;
+ case FXDIB_8bppRgb: {
+ int index = FindPalette(color);
+ FXSYS_memset8(m_pBuffer, index, m_Pitch * m_Height);
+ break;
+ }
+ case FXDIB_Rgb:
+ case FXDIB_Rgba: {
+ int a, r, g, b;
+ ArgbDecode(color, a, r, g, b);
+ if (r == g && g == b) {
+ FXSYS_memset8(m_pBuffer, r, m_Pitch * m_Height);
+ } else {
+ int byte_pos = 0;
+ for (int col = 0; col < m_Width; col ++) {
+ m_pBuffer[byte_pos++] = b;
+ m_pBuffer[byte_pos++] = g;
+ m_pBuffer[byte_pos++] = r;
+ }
+ for (int row = 1; row < m_Height; row ++) {
+ FXSYS_memcpy32(m_pBuffer + row * m_Pitch, m_pBuffer, m_Pitch);
+ }
+ }
+ break;
+ }
+ case FXDIB_Rgb32:
+ case FXDIB_Argb: {
+ color = IsCmykImage() ? FXCMYK_TODIB(color) : FXARGB_TODIB(color);
+ for (int i = 0; i < m_Width; i ++) {
+ ((FX_DWORD*)m_pBuffer)[i] = color;
+ }
+ for (int row = 1; row < m_Height; row ++) {
+ FXSYS_memcpy32(m_pBuffer + row * m_Pitch, m_pBuffer, m_Pitch);
+ }
+ break;
+ }
+ default:
+ break;
+ }
+}
+void CFX_DIBSource::GetOverlapRect(int& dest_left, int& dest_top, int& width, int& height,
+ int src_width, int src_height, int& src_left, int& src_top,
+ const CFX_ClipRgn* pClipRgn)
+{
+ if (width == 0 || height == 0) {
+ return;
+ }
+ ASSERT(width > 0 && height > 0);
+ if (dest_left > m_Width || dest_top > m_Height) {
+ width = 0;
+ height = 0;
+ return;
+ }
+ int x_offset = dest_left - src_left;
+ int y_offset = dest_top - src_top;
+ FX_RECT src_rect(src_left, src_top, src_left + width, src_top + height);
+ FX_RECT src_bound(0, 0, src_width, src_height);
+ src_rect.Intersect(src_bound);
+ FX_RECT dest_rect(src_rect.left + x_offset, src_rect.top + y_offset,
+ src_rect.right + x_offset, src_rect.bottom + y_offset);
+ FX_RECT dest_bound(0, 0, m_Width, m_Height);
+ dest_rect.Intersect(dest_bound);
+ if (pClipRgn) {
+ dest_rect.Intersect(pClipRgn->GetBox());
+ }
+ dest_left = dest_rect.left;
+ dest_top = dest_rect.top;
+ src_left = dest_left - x_offset;
+ src_top = dest_top - y_offset;
+ width = dest_rect.right - dest_rect.left;
+ height = dest_rect.bottom - dest_rect.top;
+}
+FX_BOOL CFX_DIBitmap::TransferBitmap(int dest_left, int dest_top, int width, int height,
+ const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, void* pIccTransform)
+{
+ if (m_pBuffer == NULL) {
+ return FALSE;
+ }
+ GetOverlapRect(dest_left, dest_top, width, height, pSrcBitmap->GetWidth(), pSrcBitmap->GetHeight(), src_left, src_top, NULL);
+ if (width == 0 || height == 0) {
+ return TRUE;
+ }
+ FXDIB_Format dest_format = GetFormat();
+ FXDIB_Format src_format = pSrcBitmap->GetFormat();
+ if (dest_format == src_format && pIccTransform == NULL) {
+ if (GetBPP() == 1) {
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = m_pBuffer + (dest_top + row) * m_Pitch;
+ FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row);
+ for (int col = 0; col < width; col ++) {
+ if (src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8))) {
+ dest_scan[(dest_left + col) / 8] |= 1 << (7 - (dest_left + col) % 8);
+ } else {
+ dest_scan[(dest_left + col) / 8] &= ~(1 << (7 - (dest_left + col) % 8));
+ }
+ }
+ }
+ } else {
+ int Bpp = GetBPP() / 8;
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = m_pBuffer + (dest_top + row) * m_Pitch + dest_left * Bpp;
+ FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * Bpp;
+ FXSYS_memcpy32(dest_scan, src_scan, width * Bpp);
+ }
+ }
+ } else {
+ if (m_pPalette) {
+ return FALSE;
+ }
+ if (m_bpp == 8) {
+ dest_format = FXDIB_8bppMask;
+ }
+ FX_LPBYTE dest_buf = m_pBuffer + dest_top * m_Pitch + dest_left * GetBPP() / 8;
+ FX_DWORD* d_plt = NULL;
+ if(!ConvertBuffer(dest_format, dest_buf, m_Pitch, width, height, pSrcBitmap, src_left, src_top, d_plt, pIccTransform)) {
+ return FALSE;
+ }
+ }
+ return TRUE;
+}
+#ifndef _FPDFAPI_MINI_
+FX_BOOL CFX_DIBitmap::TransferMask(int dest_left, int dest_top, int width, int height,
+ const CFX_DIBSource* pMask, FX_DWORD color, int src_left, int src_top, int alpha_flag, void* pIccTransform)
+{
+ if (m_pBuffer == NULL) {
+ return FALSE;
+ }
+ ASSERT(HasAlpha() && (m_bpp >= 24));
+ ASSERT(pMask->IsAlphaMask());
+ if (!HasAlpha() || !pMask->IsAlphaMask() || m_bpp < 24) {
+ return FALSE;
+ }
+ GetOverlapRect(dest_left, dest_top, width, height, pMask->GetWidth(), pMask->GetHeight(), src_left, src_top, NULL);
+ if (width == 0 || height == 0) {
+ return TRUE;
+ }
+ int src_pitch = pMask->GetPitch();
+ int src_bpp = pMask->GetBPP();
+ int alpha;
+ FX_DWORD dst_color;
+ if (alpha_flag >> 8) {
+ alpha = alpha_flag & 0xff;
+ dst_color = FXCMYK_TODIB(color);
+ } else {
+ alpha = FXARGB_A(color);
+ dst_color = FXARGB_TODIB(color);
+ }
+ FX_LPBYTE color_p = (FX_LPBYTE)&dst_color;
+ if (pIccTransform && CFX_GEModule::Get()->GetCodecModule() && CFX_GEModule::Get()->GetCodecModule()->GetIccModule()) {
+ ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ pIccModule->TranslateScanline(pIccTransform, color_p, color_p, 1);
+ } else {
+ if (alpha_flag >> 8 && !IsCmykImage())
+ AdobeCMYK_to_sRGB1(FXSYS_GetCValue(color), FXSYS_GetMValue(color), FXSYS_GetYValue(color), FXSYS_GetKValue(color),
+ color_p[2], color_p[1], color_p[0]);
+ else if (!(alpha_flag >> 8) && IsCmykImage()) {
+ return FALSE;
+ }
+ }
+ if(!IsCmykImage()) {
+ color_p[3] = (FX_BYTE)alpha;
+ }
+ if (GetFormat() == FXDIB_Argb) {
+ for (int row = 0; row < height; row ++) {
+ FX_DWORD* dest_pos = (FX_DWORD*)(m_pBuffer + (dest_top + row) * m_Pitch + dest_left * 4);
+ FX_LPCBYTE src_scan = pMask->GetScanline(src_top + row);
+ if (src_bpp == 1) {
+ for (int col = 0; col < width; col ++) {
+ int src_bitpos = src_left + col;
+ if (src_scan[src_bitpos / 8] & (1 << (7 - src_bitpos % 8))) {
+ *dest_pos = dst_color;
+ } else {
+ *dest_pos = 0;
+ }
+ dest_pos ++;
+ }
+ } else {
+ src_scan += src_left;
+ dst_color = FXARGB_TODIB(dst_color);
+ dst_color &= 0xffffff;
+ for (int col = 0; col < width; col ++) {
+ FXARGB_SETDIB(dest_pos++, dst_color | ((alpha * (*src_scan++) / 255) << 24));
+ }
+ }
+ }
+ } else {
+ int comps = m_bpp / 8;
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_color_pos = m_pBuffer + (dest_top + row) * m_Pitch + dest_left * comps;
+ FX_LPBYTE dest_alpha_pos = (FX_LPBYTE)m_pAlphaMask->GetScanline(dest_top + row) + dest_left;
+ FX_LPCBYTE src_scan = pMask->GetScanline(src_top + row);
+ if (src_bpp == 1) {
+ for (int col = 0; col < width; col ++) {
+ int src_bitpos = src_left + col;
+ if (src_scan[src_bitpos / 8] & (1 << (7 - src_bitpos % 8))) {
+ FXSYS_memcpy32(dest_color_pos, color_p, comps);
+ *dest_alpha_pos = 0xff;
+ } else {
+ FXSYS_memset32(dest_color_pos, 0, comps);
+ *dest_alpha_pos = 0;
+ }
+ dest_color_pos += comps;
+ dest_alpha_pos ++;
+ }
+ } else {
+ src_scan += src_left;
+ for (int col = 0; col < width; col ++) {
+ FXSYS_memcpy32(dest_color_pos, color_p, comps);
+ dest_color_pos += comps;
+ *dest_alpha_pos++ = (alpha * (*src_scan++) / 255);
+ }
+ }
+ }
+ }
+ return TRUE;
+}
+#endif
+void CFX_DIBSource::CopyPalette(const FX_DWORD* pSrc, FX_DWORD size)
+{
+ if (pSrc == NULL || GetBPP() > 8) {
+ if (m_pPalette) {
+ FX_Free(m_pPalette);
+ }
+ m_pPalette = NULL;
+ } else {
+ FX_DWORD pal_size = 1 << GetBPP();
+ if (m_pPalette == NULL) {
+ m_pPalette = FX_Alloc(FX_DWORD, pal_size);
+ }
+ if (!m_pPalette) {
+ return;
+ }
+ if (pal_size > size) {
+ pal_size = size;
+ }
+ FXSYS_memcpy32(m_pPalette, pSrc, pal_size * sizeof(FX_DWORD));
+ }
+}
+void CFX_DIBSource::GetPalette(FX_DWORD* pal, int alpha) const
+{
+ ASSERT(GetBPP() <= 8 && !IsCmykImage());
+ if (GetBPP() == 1) {
+ pal[0] = ((m_pPalette ? m_pPalette[0] : 0xff000000) & 0xffffff) | (alpha << 24);
+ pal[1] = ((m_pPalette ? m_pPalette[1] : 0xffffffff) & 0xffffff) | (alpha << 24);
+ return;
+ }
+ if (m_pPalette) {
+ for (int i = 0; i < 256; i ++) {
+ pal[i] = (m_pPalette[i] & 0x00ffffff) | (alpha << 24);
+ }
+ } else {
+ for (int i = 0; i < 256; i ++) {
+ pal[i] = (i * 0x10101) | (alpha << 24);
+ }
+ }
+}
+CFX_DIBitmap* CFX_DIBSource::GetAlphaMask(const FX_RECT* pClip) const
+{
+ ASSERT(GetFormat() == FXDIB_Argb);
+ FX_RECT rect(0, 0, m_Width, m_Height);
+ if (pClip) {
+ rect.Intersect(*pClip);
+ if (rect.IsEmpty()) {
+ return NULL;
+ }
+ }
+ CFX_DIBitmap* pMask = FX_NEW CFX_DIBitmap;
+ if (!pMask) {
+ return NULL;
+ }
+ if (!pMask->Create(rect.Width(), rect.Height(), FXDIB_8bppMask)) {
+ delete pMask;
+ return NULL;
+ }
+ for (int row = rect.top; row < rect.bottom; row ++) {
+ FX_LPCBYTE src_scan = GetScanline(row) + rect.left * 4 + 3;
+ FX_LPBYTE dest_scan = (FX_LPBYTE)pMask->GetScanline(row - rect.top);
+ for (int col = rect.left; col < rect.right; col ++) {
+ *dest_scan ++ = *src_scan;
+ src_scan += 4;
+ }
+ }
+ return pMask;
+}
+FX_BOOL CFX_DIBSource::CopyAlphaMask(const CFX_DIBSource* pAlphaMask, const FX_RECT* pClip)
+{
+ if (!HasAlpha() || GetFormat() == FXDIB_Argb) {
+ return FALSE;
+ }
+ if (pAlphaMask) {
+ FX_RECT rect(0, 0, pAlphaMask->m_Width, pAlphaMask->m_Height);
+ if (pClip) {
+ rect.Intersect(*pClip);
+ if (rect.IsEmpty() || rect.Width() != m_Width || rect.Height() != m_Height) {
+ return FALSE;
+ }
+ } else {
+ if (pAlphaMask->m_Width != m_Width || pAlphaMask->m_Height != m_Height) {
+ return FALSE;
+ }
+ }
+ for (int row = 0; row < m_Height; row ++)
+ FXSYS_memcpy32((void*)m_pAlphaMask->GetScanline(row),
+ pAlphaMask->GetScanline(row + rect.top) + rect.left, m_pAlphaMask->m_Pitch);
+ } else {
+ m_pAlphaMask->Clear(0xff000000);
+ }
+ return TRUE;
+}
+const int g_ChannelOffset[] = {0, 2, 1, 0, 0, 1, 2, 3, 3};
+FX_BOOL CFX_DIBitmap::LoadChannel(FXDIB_Channel destChannel, const CFX_DIBSource* pSrcBitmap, FXDIB_Channel srcChannel)
+{
+ if (m_pBuffer == NULL) {
+ return FALSE;
+ }
+ CFX_DIBSource* pSrcClone = (CFX_DIBSource*)pSrcBitmap;
+ CFX_DIBitmap* pDst = this;
+ int destOffset, srcOffset;
+ if (srcChannel == FXDIB_Alpha) {
+ if (!pSrcBitmap->HasAlpha() && !pSrcBitmap->IsAlphaMask()) {
+ return FALSE;
+ }
+ if (pSrcBitmap->GetBPP() == 1) {
+ pSrcClone = pSrcBitmap->CloneConvert(FXDIB_8bppMask);
+ if (pSrcClone == NULL) {
+ return FALSE;
+ }
+ }
+ if(pSrcBitmap->GetFormat() == FXDIB_Argb) {
+ srcOffset = 3;
+ } else {
+ srcOffset = 0;
+ }
+ } else {
+ if (pSrcBitmap->IsAlphaMask()) {
+ return FALSE;
+ }
+ if (pSrcBitmap->GetBPP() < 24) {
+ if (pSrcBitmap->IsCmykImage()) {
+ pSrcClone = pSrcBitmap->CloneConvert((FXDIB_Format)((pSrcBitmap->GetFormat() & 0xff00) | 0x20));
+ } else {
+ pSrcClone = pSrcBitmap->CloneConvert((FXDIB_Format)((pSrcBitmap->GetFormat() & 0xff00) | 0x18));
+ }
+ if (pSrcClone == NULL) {
+ return FALSE;
+ }
+ }
+ srcOffset = g_ChannelOffset[srcChannel];
+ }
+ if (destChannel == FXDIB_Alpha) {
+ if (IsAlphaMask()) {
+ if(!ConvertFormat(FXDIB_8bppMask)) {
+ if (pSrcClone != pSrcBitmap) {
+ delete pSrcClone;
+ }
+ return FALSE;
+ }
+ destOffset = 0;
+ } else {
+ destOffset = 0;
+ if(!ConvertFormat(IsCmykImage() ? FXDIB_Cmyka : FXDIB_Argb)) {
+ if (pSrcClone != pSrcBitmap) {
+ delete pSrcClone;
+ }
+ return FALSE;
+ }
+ if (GetFormat() == FXDIB_Argb) {
+ destOffset = 3;
+ }
+ }
+ } else {
+ if (IsAlphaMask()) {
+ if (pSrcClone != pSrcBitmap) {
+ delete pSrcClone;
+ }
+ return FALSE;
+ }
+ if (GetBPP() < 24) {
+ if (HasAlpha()) {
+ if (!ConvertFormat(IsCmykImage() ? FXDIB_Cmyka : FXDIB_Argb)) {
+ if (pSrcClone != pSrcBitmap) {
+ delete pSrcClone;
+ }
+ return FALSE;
+ }
+ } else
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+ if (!ConvertFormat(IsCmykImage() ? FXDIB_Cmyk : FXDIB_Rgb32)) {
+#else
+ if (!ConvertFormat(IsCmykImage() ? FXDIB_Cmyk : FXDIB_Rgb)) {
+#endif
+ if (pSrcClone != pSrcBitmap) {
+ delete pSrcClone;
+ }
+ return FALSE;
+ }
+ }
+ destOffset = g_ChannelOffset[destChannel];
+ }
+ if (srcChannel == FXDIB_Alpha && pSrcClone->m_pAlphaMask) {
+ CFX_DIBitmap* pAlphaMask = pSrcClone->m_pAlphaMask;
+ if (pSrcClone->GetWidth() != m_Width || pSrcClone->GetHeight() != m_Height) {
+ if (pAlphaMask) {
+ pAlphaMask = pAlphaMask->StretchTo(m_Width, m_Height);
+ if (pAlphaMask == NULL) {
+ if (pSrcClone != pSrcBitmap) {
+ delete pSrcClone;
+ }
+ return FALSE;
+ }
+ }
+ }
+ if (pSrcClone != pSrcBitmap) {
+ pSrcClone->m_pAlphaMask = NULL;
+ delete pSrcClone;
+ }
+ pSrcClone = pAlphaMask;
+ srcOffset = 0;
+ } else if (pSrcClone->GetWidth() != m_Width || pSrcClone->GetHeight() != m_Height) {
+ CFX_DIBitmap* pSrcMatched = pSrcClone->StretchTo(m_Width, m_Height);
+ if (pSrcClone != pSrcBitmap) {
+ delete pSrcClone;
+ }
+ if (pSrcMatched == NULL) {
+ return FALSE;
+ }
+ pSrcClone = pSrcMatched;
+ }
+ if (destChannel == FXDIB_Alpha && m_pAlphaMask) {
+ pDst = m_pAlphaMask;
+ destOffset = 0;
+ }
+ int srcBytes = pSrcClone->GetBPP() / 8;
+ int destBytes = pDst->GetBPP() / 8;
+ for (int row = 0; row < m_Height; row ++) {
+ FX_LPBYTE dest_pos = (FX_LPBYTE)pDst->GetScanline(row) + destOffset;
+ FX_LPCBYTE src_pos = pSrcClone->GetScanline(row) + srcOffset;
+ for (int col = 0; col < m_Width; col ++) {
+ *dest_pos = *src_pos;
+ dest_pos += destBytes;
+ src_pos += srcBytes;
+ }
+ }
+ if (pSrcClone != pSrcBitmap && pSrcClone != pSrcBitmap->m_pAlphaMask) {
+ delete pSrcClone;
+ }
+ return TRUE;
+}
+FX_BOOL CFX_DIBitmap::LoadChannel(FXDIB_Channel destChannel, int value)
+{
+ if (m_pBuffer == NULL) {
+ return FALSE;
+ }
+ int destOffset;
+ if (destChannel == FXDIB_Alpha) {
+ if (IsAlphaMask()) {
+ if(!ConvertFormat(FXDIB_8bppMask)) {
+ return FALSE;
+ }
+ destOffset = 0;
+ } else {
+ destOffset = 0;
+ if(!ConvertFormat(IsCmykImage() ? FXDIB_Cmyka : FXDIB_Argb)) {
+ return FALSE;
+ }
+ if (GetFormat() == FXDIB_Argb) {
+ destOffset = 3;
+ }
+ }
+ } else {
+ if (IsAlphaMask()) {
+ return FALSE;
+ }
+ if (GetBPP() < 24) {
+ if (HasAlpha()) {
+ if (!ConvertFormat(IsCmykImage() ? FXDIB_Cmyka : FXDIB_Argb)) {
+ return FALSE;
+ }
+ } else
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+ if (!ConvertFormat(IsCmykImage() ? FXDIB_Cmyk : FXDIB_Rgb)) {
+ return FALSE;
+ }
+#else
+ if (!ConvertFormat(IsCmykImage() ? FXDIB_Cmyk : FXDIB_Rgb32)) {
+ return FALSE;
+ }
+#endif
+ }
+ destOffset = g_ChannelOffset[destChannel];
+ }
+ int Bpp = GetBPP() / 8;
+ if (Bpp == 1) {
+ FXSYS_memset8(m_pBuffer, value, m_Height * m_Pitch);
+ return TRUE;
+ }
+ if (destChannel == FXDIB_Alpha && m_pAlphaMask) {
+ FXSYS_memset8(m_pAlphaMask->GetBuffer(), value, m_pAlphaMask->GetHeight()*m_pAlphaMask->GetPitch());
+ return TRUE;
+ }
+ for (int row = 0; row < m_Height; row ++) {
+ FX_LPBYTE scan_line = m_pBuffer + row * m_Pitch + destOffset;
+ for (int col = 0; col < m_Width; col ++) {
+ *scan_line = value;
+ scan_line += Bpp;
+ }
+ }
+ return TRUE;
+}
+FX_BOOL CFX_DIBitmap::MultiplyAlpha(const CFX_DIBSource* pSrcBitmap)
+{
+ if (m_pBuffer == NULL) {
+ return FALSE;
+ }
+ ASSERT(pSrcBitmap->IsAlphaMask());
+ if (!pSrcBitmap->IsAlphaMask()) {
+ return FALSE;
+ }
+ if (!IsAlphaMask() && !HasAlpha()) {
+ return LoadChannel(FXDIB_Alpha, pSrcBitmap, FXDIB_Alpha);
+ }
+ CFX_DIBitmap* pSrcClone = (CFX_DIBitmap*)pSrcBitmap;
+ if (pSrcBitmap->GetWidth() != m_Width || pSrcBitmap->GetHeight() != m_Height) {
+ pSrcClone = pSrcBitmap->StretchTo(m_Width, m_Height);
+ ASSERT(pSrcClone != NULL);
+ if (pSrcClone == NULL) {
+ return FALSE;
+ }
+ }
+ if (IsAlphaMask()) {
+ if(!ConvertFormat(FXDIB_8bppMask)) {
+ if (pSrcClone != pSrcBitmap) {
+ delete pSrcClone;
+ }
+ return FALSE;
+ }
+ for (int row = 0; row < m_Height; row ++) {
+ FX_LPBYTE dest_scan = m_pBuffer + m_Pitch * row;
+ FX_LPBYTE src_scan = pSrcClone->m_pBuffer + pSrcClone->m_Pitch * row;
+ if (pSrcClone->GetBPP() == 1) {
+ for (int col = 0; col < m_Width; col ++) {
+ if (!((1 << (7 - col % 8)) & src_scan[col / 8])) {
+ dest_scan[col] = 0;
+ }
+ }
+ } else {
+ for (int col = 0; col < m_Width; col ++) {
+ *dest_scan = (*dest_scan) * src_scan[col] / 255;
+ dest_scan ++;
+ }
+ }
+ }
+ } else {
+ if(GetFormat() == FXDIB_Argb) {
+ if (pSrcClone->GetBPP() == 1) {
+ if (pSrcClone != pSrcBitmap) {
+ delete pSrcClone;
+ }
+ return FALSE;
+ }
+ for (int row = 0; row < m_Height; row ++) {
+ FX_LPBYTE dest_scan = m_pBuffer + m_Pitch * row + 3;
+ FX_LPBYTE src_scan = pSrcClone->m_pBuffer + pSrcClone->m_Pitch * row;
+ for (int col = 0; col < m_Width; col ++) {
+ *dest_scan = (*dest_scan) * src_scan[col] / 255;
+ dest_scan += 4;
+ }
+ }
+ } else {
+ m_pAlphaMask->MultiplyAlpha(pSrcClone);
+ }
+ }
+ if (pSrcClone != pSrcBitmap) {
+ delete pSrcClone;
+ }
+ return TRUE;
+}
+FX_BOOL CFX_DIBitmap::GetGrayData(void* pIccTransform)
+{
+ if (m_pBuffer == NULL) {
+ return FALSE;
+ }
+ switch (GetFormat()) {
+ case FXDIB_1bppRgb: {
+ if (m_pPalette == NULL) {
+ return FALSE;
+ }
+ FX_BYTE gray[2];
+ for (int i = 0; i < 2; i ++) {
+ int r = (FX_BYTE)(m_pPalette[i] >> 16);
+ int g = (FX_BYTE)(m_pPalette[i] >> 8);
+ int b = (FX_BYTE)m_pPalette[i];
+ gray[i] = (FX_BYTE)FXRGB2GRAY(r, g, b);
+ }
+ CFX_DIBitmap* pMask = FX_NEW CFX_DIBitmap;
+ if (!pMask) {
+ return FALSE;
+ }
+ if (!pMask->Create(m_Width, m_Height, FXDIB_8bppMask)) {
+ delete pMask;
+ return FALSE;
+ }
+ FXSYS_memset8(pMask->GetBuffer(), gray[0], pMask->GetPitch() * m_Height);
+ for (int row = 0; row < m_Height; row ++) {
+ FX_LPBYTE src_pos = m_pBuffer + row * m_Pitch;
+ FX_LPBYTE dest_pos = (FX_LPBYTE)pMask->GetScanline(row);
+ for (int col = 0; col < m_Width; col ++) {
+ if (src_pos[col / 8] & (1 << (7 - col % 8))) {
+ *dest_pos = gray[1];
+ }
+ dest_pos ++;
+ }
+ }
+ TakeOver(pMask);
+ delete pMask;
+ break;
+ }
+ case FXDIB_8bppRgb: {
+ if (m_pPalette == NULL) {
+ return FALSE;
+ }
+ FX_BYTE gray[256];
+ for (int i = 0; i < 256; i ++) {
+ int r = (FX_BYTE)(m_pPalette[i] >> 16);
+ int g = (FX_BYTE)(m_pPalette[i] >> 8);
+ int b = (FX_BYTE)m_pPalette[i];
+ gray[i] = (FX_BYTE)FXRGB2GRAY(r, g, b);
+ }
+ CFX_DIBitmap* pMask = FX_NEW CFX_DIBitmap;
+ if (!pMask) {
+ return FALSE;
+ }
+ if (!pMask->Create(m_Width, m_Height, FXDIB_8bppMask)) {
+ delete pMask;
+ return FALSE;
+ }
+ for (int row = 0; row < m_Height; row ++) {
+ FX_LPBYTE dest_pos = pMask->GetBuffer() + row * pMask->GetPitch();
+ FX_LPBYTE src_pos = m_pBuffer + row * m_Pitch;
+ for (int col = 0; col < m_Width; col ++) {
+ *dest_pos ++ = gray[*src_pos ++];
+ }
+ }
+ TakeOver(pMask);
+ delete pMask;
+ break;
+ }
+ case FXDIB_Rgb: {
+ CFX_DIBitmap* pMask = FX_NEW CFX_DIBitmap;
+ if (!pMask) {
+ return FALSE;
+ }
+ if (!pMask->Create(m_Width, m_Height, FXDIB_8bppMask)) {
+ delete pMask;
+ return FALSE;
+ }
+ for (int row = 0; row < m_Height; row ++) {
+ FX_LPBYTE src_pos = m_pBuffer + row * m_Pitch;
+ FX_LPBYTE dest_pos = pMask->GetBuffer() + row * pMask->GetPitch();
+ for (int col = 0; col < m_Width; col ++) {
+ *dest_pos ++ = FXRGB2GRAY(src_pos[2], src_pos[1], *src_pos);
+ src_pos += 3;
+ }
+ }
+ TakeOver(pMask);
+ delete pMask;
+ break;
+ }
+ case FXDIB_Rgb32: {
+ CFX_DIBitmap* pMask = FX_NEW CFX_DIBitmap;
+ if (!pMask) {
+ return FALSE;
+ }
+ if (!pMask->Create(m_Width, m_Height, FXDIB_8bppMask)) {
+ delete pMask;
+ return FALSE;
+ }
+ for (int row = 0; row < m_Height; row ++) {
+ FX_LPBYTE src_pos = m_pBuffer + row * m_Pitch;
+ FX_LPBYTE dest_pos = pMask->GetBuffer() + row * pMask->GetPitch();
+ for (int col = 0; col < m_Width; col ++) {
+ *dest_pos ++ = FXRGB2GRAY(src_pos[2], src_pos[1], *src_pos);
+ src_pos += 4;
+ }
+ }
+ TakeOver(pMask);
+ delete pMask;
+ break;
+ }
+ default:
+ return FALSE;
+ }
+ return TRUE;
+}
+FX_BOOL CFX_DIBitmap::MultiplyAlpha(int alpha)
+{
+ if (m_pBuffer == NULL) {
+ return FALSE;
+ }
+ switch (GetFormat()) {
+ case FXDIB_1bppMask:
+ if (!ConvertFormat(FXDIB_8bppMask)) {
+ return FALSE;
+ }
+ MultiplyAlpha(alpha);
+ break;
+ case FXDIB_8bppMask: {
+ for (int row = 0; row < m_Height; row ++) {
+ FX_LPBYTE scan_line = m_pBuffer + row * m_Pitch;
+ for (int col = 0; col < m_Width; col ++) {
+ scan_line[col] = scan_line[col] * alpha / 255;
+ }
+ }
+ break;
+ }
+ case FXDIB_Argb: {
+ for (int row = 0; row < m_Height; row ++) {
+ FX_LPBYTE scan_line = m_pBuffer + row * m_Pitch + 3;
+ for (int col = 0; col < m_Width; col ++) {
+ *scan_line = (*scan_line) * alpha / 255;
+ scan_line += 4;
+ }
+ }
+ break;
+ }
+ default:
+ if (HasAlpha()) {
+ m_pAlphaMask->MultiplyAlpha(alpha);
+ } else if (IsCmykImage()) {
+ if (!ConvertFormat((FXDIB_Format)(GetFormat() | 0x0200))) {
+ return FALSE;
+ }
+ m_pAlphaMask->MultiplyAlpha(alpha);
+ } else {
+ if (!ConvertFormat(FXDIB_Argb)) {
+ return FALSE;
+ }
+ MultiplyAlpha(alpha);
+ }
+ break;
+ }
+ return TRUE;
+}
+#if !defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_)
+FX_DWORD CFX_DIBitmap::GetPixel(int x, int y) const
+{
+ if (m_pBuffer == NULL) {
+ return 0;
+ }
+ FX_LPBYTE pos = m_pBuffer + y * m_Pitch + x * GetBPP() / 8;
+ switch (GetFormat()) {
+ case FXDIB_1bppMask: {
+ if ((*pos) & (1 << (7 - x % 8))) {
+ return 0xff000000;
+ }
+ return 0;
+ }
+ case FXDIB_1bppRgb: {
+ if ((*pos) & (1 << (7 - x % 8))) {
+ return m_pPalette ? m_pPalette[1] : 0xffffffff;
+ } else {
+ return m_pPalette ? m_pPalette[0] : 0xff000000;
+ }
+ break;
+ }
+ case FXDIB_8bppMask:
+ return (*pos) << 24;
+ case FXDIB_8bppRgb:
+ return m_pPalette ? m_pPalette[*pos] : (0xff000000 | ((*pos) * 0x10101));
+ case FXDIB_Rgb:
+ case FXDIB_Rgba:
+ case FXDIB_Rgb32:
+ return FXARGB_GETDIB(pos) | 0xff000000;
+ case FXDIB_Argb:
+ return FXARGB_GETDIB(pos);
+ default:
+ break;
+ }
+ return 0;
+}
+#endif
+void CFX_DIBitmap::SetPixel(int x, int y, FX_DWORD color)
+{
+ if (m_pBuffer == NULL) {
+ return;
+ }
+ if (x < 0 || x >= m_Width || y < 0 || y >= m_Height) {
+ return;
+ }
+ FX_LPBYTE pos = m_pBuffer + y * m_Pitch + x * GetBPP() / 8;
+ switch (GetFormat()) {
+ case FXDIB_1bppMask:
+ if (color >> 24) {
+ *pos |= 1 << (7 - x % 8);
+ } else {
+ *pos &= ~(1 << (7 - x % 8));
+ }
+ break;
+ case FXDIB_1bppRgb:
+ if (m_pPalette) {
+ if (color == m_pPalette[1]) {
+ *pos |= 1 << (7 - x % 8);
+ } else {
+ *pos &= ~(1 << (7 - x % 8));
+ }
+ } else {
+ if (color == 0xffffffff) {
+ *pos |= 1 << (7 - x % 8);
+ } else {
+ *pos &= ~(1 << (7 - x % 8));
+ }
+ }
+ break;
+ case FXDIB_8bppMask:
+ *pos = (FX_BYTE)(color >> 24);
+ break;
+ case FXDIB_8bppRgb: {
+ if (m_pPalette) {
+ for (int i = 0; i < 256; i ++) {
+ if (m_pPalette[i] == color) {
+ *pos = (FX_BYTE)i;
+ return;
+ }
+ }
+ *pos = 0;
+ } else {
+ *pos = FXRGB2GRAY(FXARGB_R(color), FXARGB_G(color), FXARGB_B(color));
+ }
+ break;
+ }
+ case FXDIB_Rgb:
+ case FXDIB_Rgb32: {
+ int alpha = FXARGB_A(color);
+ pos[0] = (FXARGB_B(color) * alpha + pos[0] * (255 - alpha)) / 255;
+ pos[1] = (FXARGB_G(color) * alpha + pos[1] * (255 - alpha)) / 255;
+ pos[2] = (FXARGB_R(color) * alpha + pos[2] * (255 - alpha)) / 255;
+ break;
+ }
+ case FXDIB_Rgba: {
+ pos[0] = FXARGB_B(color);
+ pos[1] = FXARGB_G(color);
+ pos[2] = FXARGB_R(color);
+ break;
+ }
+ case FXDIB_Argb:
+ FXARGB_SETDIB(pos, color);
+ break;
+ default:
+ break;
+ }
+}
+void CFX_DIBitmap::DownSampleScanline(int line, FX_LPBYTE dest_scan, int dest_bpp,
+ int dest_width, FX_BOOL bFlipX, int clip_left, int clip_width) const
+{
+ if (m_pBuffer == NULL) {
+ return;
+ }
+ int src_Bpp = m_bpp / 8;
+ FX_LPBYTE scanline = m_pBuffer + line * m_Pitch;
+ if (src_Bpp == 0) {
+ for (int i = 0; i < clip_width; i ++) {
+ FX_DWORD dest_x = clip_left + i;
+ FX_DWORD src_x = dest_x * m_Width / dest_width;
+ if (bFlipX) {
+ src_x = m_Width - src_x - 1;
+ }
+#ifdef FOXIT_CHROME_BUILD
+ src_x %= m_Width;
+#endif
+ dest_scan[i] = (scanline[src_x / 8] & (1 << (7 - src_x % 8))) ? 255 : 0;
+ }
+ } else if (src_Bpp == 1) {
+ for (int i = 0; i < clip_width; i ++) {
+ FX_DWORD dest_x = clip_left + i;
+ FX_DWORD src_x = dest_x * m_Width / dest_width;
+ if (bFlipX) {
+ src_x = m_Width - src_x - 1;
+ }
+#ifdef FOXIT_CHROME_BUILD
+ src_x %= m_Width;
+#endif
+ int dest_pos = i;
+ if (m_pPalette) {
+ if (!IsCmykImage()) {
+ dest_pos *= 3;
+ FX_ARGB argb = m_pPalette[scanline[src_x]];
+ dest_scan[dest_pos] = FXARGB_B(argb);
+ dest_scan[dest_pos + 1] = FXARGB_G(argb);
+ dest_scan[dest_pos + 2] = FXARGB_R(argb);
+ } else {
+ dest_pos *= 4;
+ FX_CMYK cmyk = m_pPalette[scanline[src_x]];
+ dest_scan[dest_pos] = FXSYS_GetCValue(cmyk);
+ dest_scan[dest_pos + 1] = FXSYS_GetMValue(cmyk);
+ dest_scan[dest_pos + 2] = FXSYS_GetYValue(cmyk);
+ dest_scan[dest_pos + 3] = FXSYS_GetKValue(cmyk);
+ }
+ } else {
+ dest_scan[dest_pos] = scanline[src_x];
+ }
+ }
+ } else {
+ for (int i = 0; i < clip_width; i ++) {
+ FX_DWORD dest_x = clip_left + i;
+ FX_DWORD src_x = bFlipX ? (m_Width - dest_x * m_Width / dest_width - 1) * src_Bpp : (dest_x * m_Width / dest_width) * src_Bpp;
+#ifdef FOXIT_CHROME_BUILD
+ src_x %= m_Width * src_Bpp;
+#endif
+ int dest_pos = i * src_Bpp;
+ for (int b = 0; b < src_Bpp; b ++) {
+ dest_scan[dest_pos + b] = scanline[src_x + b];
+ }
+ }
+ }
+}
+FX_BOOL CFX_DIBitmap::ConvertColorScale(FX_DWORD forecolor, FX_DWORD backcolor)
+{
+ ASSERT(!IsAlphaMask());
+ if (m_pBuffer == NULL || IsAlphaMask()) {
+ return FALSE;
+ }
+ int fc, fm, fy, fk, bc, bm, by, bk;
+ int fr, fg, fb, br, bg, bb;
+ FX_BOOL isCmykImage = IsCmykImage();
+ if (isCmykImage) {
+ fc = FXSYS_GetCValue(forecolor);
+ fm = FXSYS_GetMValue(forecolor);
+ fy = FXSYS_GetYValue(forecolor);
+ fk = FXSYS_GetKValue(forecolor);
+ bc = FXSYS_GetCValue(backcolor);
+ bm = FXSYS_GetMValue(backcolor);
+ by = FXSYS_GetYValue(backcolor);
+ bk = FXSYS_GetKValue(backcolor);
+ } else {
+ fr = FXSYS_GetRValue(forecolor);
+ fg = FXSYS_GetGValue(forecolor);
+ fb = FXSYS_GetBValue(forecolor);
+ br = FXSYS_GetRValue(backcolor);
+ bg = FXSYS_GetGValue(backcolor);
+ bb = FXSYS_GetBValue(backcolor);
+ }
+ if (m_bpp <= 8) {
+ if (isCmykImage) {
+ if (forecolor == 0xff && backcolor == 0 && m_pPalette == NULL) {
+ return TRUE;
+ }
+ } else if (forecolor == 0 && backcolor == 0xffffff && m_pPalette == NULL) {
+ return TRUE;
+ }
+ if (m_pPalette == NULL) {
+ BuildPalette();
+ }
+ int size = 1 << m_bpp;
+ if (isCmykImage) {
+ for (int i = 0; i < size; i ++) {
+ FX_BYTE b, g, r;
+ AdobeCMYK_to_sRGB1(FXSYS_GetCValue(m_pPalette[i]), FXSYS_GetMValue(m_pPalette[i]), FXSYS_GetYValue(m_pPalette[i]), FXSYS_GetKValue(m_pPalette[i]),
+ r, g, b);
+ int gray = 255 - FXRGB2GRAY(r, g, b);
+ m_pPalette[i] = CmykEncode(bc + (fc - bc) * gray / 255, bm + (fm - bm) * gray / 255,
+ by + (fy - by) * gray / 255, bk + (fk - bk) * gray / 255);
+ }
+ } else
+ for (int i = 0; i < size; i ++) {
+ int gray = FXRGB2GRAY(FXARGB_R(m_pPalette[i]), FXARGB_G(m_pPalette[i]), FXARGB_B(m_pPalette[i]));
+ m_pPalette[i] = FXARGB_MAKE(0xff, br + (fr - br) * gray / 255, bg + (fg - bg) * gray / 255,
+ bb + (fb - bb) * gray / 255);
+ }
+ return TRUE;
+ }
+ if (isCmykImage) {
+ if (forecolor == 0xff && backcolor == 0x00) {
+ for (int row = 0; row < m_Height; row ++) {
+ FX_LPBYTE scanline = m_pBuffer + row * m_Pitch;
+ for (int col = 0; col < m_Width; col ++) {
+ FX_BYTE b, g, r;
+ AdobeCMYK_to_sRGB1(scanline[0], scanline[1], scanline[2], scanline[3],
+ r, g, b);
+ *scanline ++ = 0;
+ *scanline ++ = 0;
+ *scanline ++ = 0;
+ *scanline ++ = 255 - FXRGB2GRAY(r, g, b);
+ }
+ }
+ return TRUE;
+ }
+ } else if (forecolor == 0 && backcolor == 0xffffff) {
+ for (int row = 0; row < m_Height; row ++) {
+ FX_LPBYTE scanline = m_pBuffer + row * m_Pitch;
+ int gap = m_bpp / 8 - 2;
+ for (int col = 0; col < m_Width; col ++) {
+ int gray = FXRGB2GRAY(scanline[2], scanline[1], scanline[0]);
+ *scanline ++ = gray;
+ *scanline ++ = gray;
+ *scanline = gray;
+ scanline += gap;
+ }
+ }
+ return TRUE;
+ }
+ if (isCmykImage) {
+ for (int row = 0; row < m_Height; row ++) {
+ FX_LPBYTE scanline = m_pBuffer + row * m_Pitch;
+ for (int col = 0; col < m_Width; col ++) {
+ FX_BYTE b, g, r;
+ AdobeCMYK_to_sRGB1(scanline[0], scanline[1], scanline[2], scanline[3],
+ r, g, b);
+ int gray = 255 - FXRGB2GRAY(r, g, b);
+ *scanline ++ = bc + (fc - bc) * gray / 255;
+ *scanline ++ = bm + (fm - bm) * gray / 255;
+ *scanline ++ = by + (fy - by) * gray / 255;
+ *scanline ++ = bk + (fk - bk) * gray / 255;
+ }
+ }
+ } else
+ for (int row = 0; row < m_Height; row ++) {
+ FX_LPBYTE scanline = m_pBuffer + row * m_Pitch;
+ int gap = m_bpp / 8 - 2;
+ for (int col = 0; col < m_Width; col ++) {
+ int gray = FXRGB2GRAY(scanline[2], scanline[1], scanline[0]);
+ *scanline ++ = bb + (fb - bb) * gray / 255;
+ *scanline ++ = bg + (fg - bg) * gray / 255;
+ *scanline = br + (fr - br) * gray / 255;
+ scanline += gap;
+ }
+ }
+ return TRUE;
+}
+FX_BOOL CFX_DIBitmap::DitherFS(const FX_DWORD* pPalette, int pal_size, const FX_RECT* pRect)
+{
+ if (m_pBuffer == NULL) {
+ return FALSE;
+ }
+ if (m_bpp != 8 && m_pPalette != NULL && m_AlphaFlag != 0) {
+ return FALSE;
+ }
+ if (m_Width < 4 && m_Height < 4) {
+ return FALSE;
+ }
+ FX_RECT rect(0, 0, m_Width, m_Height);
+ if (pRect) {
+ rect.Intersect(*pRect);
+ }
+ FX_BYTE translate[256];
+ for (int i = 0; i < 256; i ++) {
+ int err2 = 65536;
+ for (int j = 0; j < pal_size; j ++) {
+ FX_BYTE entry = (FX_BYTE)pPalette[j];
+ int err = (int)entry - i;
+ if (err * err < err2) {
+ err2 = err * err;
+ translate[i] = entry;
+ }
+ }
+ }
+ for (int row = rect.top; row < rect.bottom; row ++) {
+ FX_LPBYTE scan = m_pBuffer + row * m_Pitch;
+ FX_LPBYTE next_scan = m_pBuffer + (row + 1) * m_Pitch;
+ for (int col = rect.left; col < rect.right; col ++) {
+ int src_pixel = scan[col];
+ int dest_pixel = translate[src_pixel];
+ scan[col] = (FX_BYTE)dest_pixel;
+ int error = -dest_pixel + src_pixel;
+ if (col < rect.right - 1) {
+ int src = scan[col + 1];
+ src += error * 7 / 16;
+ if (src > 255) {
+ scan[col + 1] = 255;
+ } else if (src < 0) {
+ scan[col + 1] = 0;
+ } else {
+ scan[col + 1] = src;
+ }
+ }
+ if (col < rect.right - 1 && row < rect.bottom - 1) {
+ int src = next_scan[col + 1];
+ src += error * 1 / 16;
+ if (src > 255) {
+ next_scan[col + 1] = 255;
+ } else if (src < 0) {
+ next_scan[col + 1] = 0;
+ } else {
+ next_scan[col + 1] = src;
+ }
+ }
+ if (row < rect.bottom - 1) {
+ int src = next_scan[col];
+ src += error * 5 / 16;
+ if (src > 255) {
+ next_scan[col] = 255;
+ } else if (src < 0) {
+ next_scan[col] = 0;
+ } else {
+ next_scan[col] = src;
+ }
+ }
+ if (col > rect.left && row < rect.bottom - 1) {
+ int src = next_scan[col - 1];
+ src += error * 3 / 16;
+ if (src > 255) {
+ next_scan[col - 1] = 255;
+ } else if (src < 0) {
+ next_scan[col - 1] = 0;
+ } else {
+ next_scan[col - 1] = src;
+ }
+ }
+ }
+ }
+ return TRUE;
+}
+CFX_DIBitmap* CFX_DIBSource::FlipImage(FX_BOOL bXFlip, FX_BOOL bYFlip) const
+{
+ CFX_DIBitmap* pFlipped = FX_NEW CFX_DIBitmap;
+ if (!pFlipped) {
+ return NULL;
+ }
+ if (!pFlipped->Create(m_Width, m_Height, GetFormat())) {
+ delete pFlipped;
+ return NULL;
+ }
+ pFlipped->CopyPalette(m_pPalette);
+ FX_LPBYTE pDestBuffer = pFlipped->GetBuffer();
+ int Bpp = m_bpp / 8;
+ for (int row = 0; row < m_Height; row ++) {
+ FX_LPCBYTE src_scan = GetScanline(row);
+ FX_LPBYTE dest_scan = pDestBuffer + m_Pitch * (bYFlip ? (m_Height - row - 1) : row);
+ if (!bXFlip) {
+ FXSYS_memcpy32(dest_scan, src_scan, m_Pitch);
+ continue;
+ }
+ if (m_bpp == 1) {
+ FXSYS_memset32(dest_scan, 0, m_Pitch);
+ for (int col = 0; col < m_Width; col ++)
+ if (src_scan[col / 8] & (1 << (7 - col % 8))) {
+ int dest_col = m_Width - col - 1;
+ dest_scan[dest_col / 8] |= (1 << (7 - dest_col % 8));
+ }
+ } else {
+ dest_scan += (m_Width - 1) * Bpp;
+ if (Bpp == 1) {
+ for (int col = 0; col < m_Width; col ++) {
+ *dest_scan = *src_scan;
+ dest_scan --;
+ src_scan ++;
+ }
+ } else if (Bpp == 3) {
+ for (int col = 0; col < m_Width; col ++) {
+ dest_scan[0] = src_scan[0];
+ dest_scan[1] = src_scan[1];
+ dest_scan[2] = src_scan[2];
+ dest_scan -= 3;
+ src_scan += 3;
+ }
+ } else {
+ ASSERT(Bpp == 4);
+ for (int col = 0; col < m_Width; col ++) {
+ *(FX_DWORD*)dest_scan = *(FX_DWORD*)src_scan;
+ dest_scan -= 4;
+ src_scan += 4;
+ }
+ }
+ }
+ }
+ if (m_pAlphaMask) {
+ pDestBuffer = pFlipped->m_pAlphaMask->GetBuffer();
+ FX_DWORD dest_pitch = pFlipped->m_pAlphaMask->GetPitch();
+ for (int row = 0; row < m_Height; row ++) {
+ FX_LPCBYTE src_scan = m_pAlphaMask->GetScanline(row);
+ FX_LPBYTE dest_scan = pDestBuffer + dest_pitch * (bYFlip ? (m_Height - row - 1) : row);
+ if (!bXFlip) {
+ FXSYS_memcpy32(dest_scan, src_scan, dest_pitch);
+ continue;
+ }
+ dest_scan += (m_Width - 1);
+ for (int col = 0; col < m_Width; col ++) {
+ *dest_scan = *src_scan;
+ dest_scan --;
+ src_scan ++;
+ }
+ }
+ }
+ return pFlipped;
+}
+CFX_DIBExtractor::CFX_DIBExtractor(const CFX_DIBSource* pSrc)
+{
+ m_pBitmap = NULL;
+ if (pSrc->GetBuffer() == NULL) {
+ m_pBitmap = pSrc->Clone();
+ } else {
+ m_pBitmap = FX_NEW CFX_DIBitmap;
+ if (!m_pBitmap) {
+ return;
+ }
+ if (!m_pBitmap->Create(pSrc->GetWidth(), pSrc->GetHeight(), pSrc->GetFormat(), pSrc->GetBuffer())) {
+ delete m_pBitmap;
+ m_pBitmap = NULL;
+ return;
+ }
+ m_pBitmap->CopyPalette(pSrc->GetPalette());
+ m_pBitmap->CopyAlphaMask(pSrc->m_pAlphaMask);
+ }
+}
+CFX_DIBExtractor::~CFX_DIBExtractor()
+{
+ if (m_pBitmap) {
+ delete m_pBitmap;
+ }
+}
+CFX_FilteredDIB::CFX_FilteredDIB()
+{
+ m_pScanline = NULL;
+ m_pSrc = NULL;
+}
+CFX_FilteredDIB::~CFX_FilteredDIB()
+{
+ if (m_pSrc && m_bAutoDropSrc) {
+ delete m_pSrc;
+ }
+ if (m_pScanline) {
+ FX_Free(m_pScanline);
+ }
+}
+void CFX_FilteredDIB::LoadSrc(const CFX_DIBSource* pSrc, FX_BOOL bAutoDropSrc)
+{
+ m_pSrc = pSrc;
+ m_bAutoDropSrc = bAutoDropSrc;
+ m_Width = pSrc->GetWidth();
+ m_Height = pSrc->GetHeight();
+ FXDIB_Format format = GetDestFormat();
+ m_bpp = (FX_BYTE)format;
+ m_AlphaFlag = (FX_BYTE)(format >> 8);
+ m_Pitch = (m_Width * (format & 0xff) + 31) / 32 * 4;
+ m_pPalette = GetDestPalette();
+ m_pScanline = FX_Alloc(FX_BYTE, m_Pitch);
+}
+FX_LPCBYTE CFX_FilteredDIB::GetScanline(int line) const
+{
+ TranslateScanline(m_pScanline, m_pSrc->GetScanline(line));
+ return m_pScanline;
+}
+void CFX_FilteredDIB::DownSampleScanline(int line, FX_LPBYTE dest_scan, int dest_bpp,
+ int dest_width, FX_BOOL bFlipX, int clip_left, int clip_width) const
+{
+ m_pSrc->DownSampleScanline(line, dest_scan, dest_bpp, dest_width, bFlipX, clip_left, clip_width);
+ TranslateDownSamples(dest_scan, dest_scan, clip_width, dest_bpp);
+}
+CFX_ImageRenderer::CFX_ImageRenderer()
+{
+ m_Status = 0;
+ m_pTransformer = NULL;
+ m_bRgbByteOrder = FALSE;
+ m_BlendType = FXDIB_BLEND_NORMAL;
+}
+CFX_ImageRenderer::~CFX_ImageRenderer()
+{
+ if (m_pTransformer) {
+ delete m_pTransformer;
+ }
+}
+extern FX_RECT _FXDIB_SwapClipBox(FX_RECT& clip, int width, int height, FX_BOOL bFlipX, FX_BOOL bFlipY);
+FX_BOOL CFX_ImageRenderer::Start(CFX_DIBitmap* pDevice, const CFX_ClipRgn* pClipRgn,
+ const CFX_DIBSource* pSource, int bitmap_alpha,
+ FX_DWORD mask_color, const CFX_AffineMatrix* pMatrix,
+ FX_DWORD dib_flags, FX_BOOL bRgbByteOrder,
+ int alpha_flag, void* pIccTransform, int blend_type)
+{
+ m_Matrix = *pMatrix;
+ CFX_FloatRect image_rect_f = m_Matrix.GetUnitRect();
+ FX_RECT image_rect = image_rect_f.GetOutterRect();
+ m_ClipBox = pClipRgn ? pClipRgn->GetBox() : FX_RECT(0, 0, pDevice->GetWidth(), pDevice->GetHeight());
+ m_ClipBox.Intersect(image_rect);
+ if (m_ClipBox.IsEmpty()) {
+ return FALSE;
+ }
+ m_pDevice = pDevice;
+ m_pClipRgn = pClipRgn;
+ m_MaskColor = mask_color;
+ m_BitmapAlpha = bitmap_alpha;
+ m_Matrix = *pMatrix;
+ m_Flags = dib_flags;
+ m_AlphaFlag = alpha_flag;
+ m_pIccTransform = pIccTransform;
+ m_bRgbByteOrder = bRgbByteOrder;
+ m_BlendType = blend_type;
+ FX_BOOL ret = TRUE;
+ if ((FXSYS_fabs(m_Matrix.b) >= 0.5f || m_Matrix.a == 0) ||
+ (FXSYS_fabs(m_Matrix.c) >= 0.5f || m_Matrix.d == 0) ) {
+ if (FXSYS_fabs(m_Matrix.a) < FXSYS_fabs(m_Matrix.b) / 20 && FXSYS_fabs(m_Matrix.d) < FXSYS_fabs(m_Matrix.c) / 20 &&
+ FXSYS_fabs(m_Matrix.a) < 0.5f && FXSYS_fabs(m_Matrix.d) < 0.5f) {
+ int dest_width = image_rect.Width();
+ int dest_height = image_rect.Height();
+ FX_RECT bitmap_clip = m_ClipBox;
+ bitmap_clip.Offset(-image_rect.left, -image_rect.top);
+ bitmap_clip = _FXDIB_SwapClipBox(bitmap_clip, dest_width, dest_height, m_Matrix.c > 0, m_Matrix.b < 0);
+ m_Composer.Compose(pDevice, pClipRgn, bitmap_alpha, mask_color, m_ClipBox, TRUE,
+ m_Matrix.c > 0, m_Matrix.b < 0, m_bRgbByteOrder, alpha_flag, pIccTransform, m_BlendType);
+ if (!m_Stretcher.Start(&m_Composer, pSource, dest_height, dest_width, bitmap_clip, dib_flags)) {
+ return FALSE;
+ }
+ m_Status = 1;
+ return TRUE;
+ }
+ m_Status = 2;
+ m_pTransformer = FX_NEW CFX_ImageTransformer;
+ if (!m_pTransformer) {
+ return FALSE;
+ }
+ m_pTransformer->Start(pSource, &m_Matrix, dib_flags, &m_ClipBox);
+ return TRUE;
+ }
+ int dest_width = image_rect.Width();
+ if (m_Matrix.a < 0) {
+ dest_width = -dest_width;
+ }
+ int dest_height = image_rect.Height();
+ if (m_Matrix.d > 0) {
+ dest_height = -dest_height;
+ }
+ if (dest_width == 0 || dest_height == 0) {
+ return FALSE;
+ }
+ FX_RECT bitmap_clip = m_ClipBox;
+ bitmap_clip.Offset(-image_rect.left, -image_rect.top);
+ m_Composer.Compose(pDevice, pClipRgn, bitmap_alpha, mask_color,
+ m_ClipBox, FALSE, FALSE, FALSE, m_bRgbByteOrder, alpha_flag, pIccTransform, m_BlendType);
+ m_Status = 1;
+ ret = m_Stretcher.Start(&m_Composer, pSource, dest_width, dest_height, bitmap_clip, dib_flags);
+ return ret;
+}
+FX_BOOL CFX_ImageRenderer::Continue(IFX_Pause* pPause)
+{
+ if (m_Status == 1) {
+ return m_Stretcher.Continue(pPause);
+ } else if (m_Status == 2) {
+ if (m_pTransformer->Continue(pPause)) {
+ return TRUE;
+ }
+ CFX_DIBitmap* pBitmap = m_pTransformer->m_Storer.Detach();
+ if (pBitmap == NULL) {
+ return FALSE;
+ }
+ if (pBitmap->GetBuffer() == NULL) {
+ delete pBitmap;
+ return FALSE;
+ }
+ if (pBitmap->IsAlphaMask()) {
+ if (m_BitmapAlpha != 255) {
+ if (m_AlphaFlag >> 8) {
+ m_AlphaFlag = (((FX_BYTE)((m_AlphaFlag & 0xff) * m_BitmapAlpha / 255)) | ((m_AlphaFlag >> 8) << 8));
+ } else {
+ m_MaskColor = FXARGB_MUL_ALPHA(m_MaskColor, m_BitmapAlpha);
+ }
+ }
+ m_pDevice->CompositeMask(m_pTransformer->m_ResultLeft, m_pTransformer->m_ResultTop,
+ pBitmap->GetWidth(), pBitmap->GetHeight(), pBitmap, m_MaskColor,
+ 0, 0, m_BlendType, m_pClipRgn, m_bRgbByteOrder, m_AlphaFlag, m_pIccTransform);
+ } else {
+ if (m_BitmapAlpha != 255) {
+ pBitmap->MultiplyAlpha(m_BitmapAlpha);
+ }
+ m_pDevice->CompositeBitmap(m_pTransformer->m_ResultLeft, m_pTransformer->m_ResultTop,
+ pBitmap->GetWidth(), pBitmap->GetHeight(), pBitmap, 0, 0, m_BlendType, m_pClipRgn, m_bRgbByteOrder, m_pIccTransform);
+ }
+ delete pBitmap;
+ return FALSE;
+ }
+ return FALSE;
+}
+CFX_BitmapStorer::CFX_BitmapStorer()
+{
+ m_pBitmap = NULL;
+}
+CFX_BitmapStorer::~CFX_BitmapStorer()
+{
+ if (m_pBitmap) {
+ delete m_pBitmap;
+ }
+}
+CFX_DIBitmap* CFX_BitmapStorer::Detach()
+{
+ CFX_DIBitmap* pBitmap = m_pBitmap;
+ m_pBitmap = NULL;
+ return pBitmap;
+}
+void CFX_BitmapStorer::Replace(CFX_DIBitmap* pBitmap)
+{
+ if (m_pBitmap) {
+ delete m_pBitmap;
+ }
+ m_pBitmap = pBitmap;
+}
+void CFX_BitmapStorer::ComposeScanline(int line, FX_LPCBYTE scanline, FX_LPCBYTE scan_extra_alpha)
+{
+ FX_LPBYTE dest_buf = (FX_LPBYTE)m_pBitmap->GetScanline(line);
+ FX_LPBYTE dest_alpha_buf = m_pBitmap->m_pAlphaMask ?
+ (FX_LPBYTE)m_pBitmap->m_pAlphaMask->GetScanline(line) : NULL;
+ if (dest_buf) {
+ FXSYS_memcpy32(dest_buf, scanline, m_pBitmap->GetPitch());
+ }
+ if (dest_alpha_buf) {
+ FXSYS_memcpy32(dest_alpha_buf, scan_extra_alpha, m_pBitmap->m_pAlphaMask->GetPitch());
+ }
+}
+FX_BOOL CFX_BitmapStorer::SetInfo(int width, int height, FXDIB_Format src_format, FX_DWORD* pSrcPalette)
+{
+ m_pBitmap = FX_NEW CFX_DIBitmap;
+ if (!m_pBitmap) {
+ return FALSE;
+ }
+ if (!m_pBitmap->Create(width, height, src_format)) {
+ delete m_pBitmap;
+ m_pBitmap = NULL;
+ return FALSE;
+ }
+ if (pSrcPalette) {
+ m_pBitmap->CopyPalette(pSrcPalette);
+ }
+ return TRUE;
+}
diff --git a/core/src/fxge/dib/fx_dib_transform.cpp b/core/src/fxge/dib/fx_dib_transform.cpp
index 4d83005161..80475cbb1f 100644
--- a/core/src/fxge/dib/fx_dib_transform.cpp
+++ b/core/src/fxge/dib/fx_dib_transform.cpp
@@ -1,797 +1,797 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../../include/fxge/fx_dib.h"
-#include "dib_int.h"
-int SDP_Table[513] = {
- 256, 256, 256, 256, 256, 256, 256, 256, 256, 255, 255, 255, 255, 255, 255, 254, 254, 254, 254,
- 253, 253, 253, 252, 252, 252, 251, 251, 251, 250, 250, 249, 249, 249, 248, 248, 247, 247, 246,
- 246, 245, 244, 244, 243, 243, 242, 242, 241, 240, 240, 239, 238, 238, 237, 236, 236, 235, 234,
- 233, 233, 232, 231, 230, 230, 229, 228, 227, 226, 226, 225, 224, 223, 222, 221, 220, 219, 218,
- 218, 217, 216, 215, 214, 213, 212, 211, 210, 209, 208, 207, 206, 205, 204, 203, 202, 201, 200,
- 199, 198, 196, 195, 194, 193, 192, 191, 190, 189, 188, 186, 185, 184, 183, 182, 181, 179, 178,
- 177, 176, 175, 173, 172, 171, 170, 169, 167, 166, 165, 164, 162, 161, 160, 159, 157, 156, 155,
- 154, 152, 151, 150, 149, 147, 146, 145, 143, 142, 141, 140, 138, 137, 136, 134, 133, 132, 130,
- 129, 128, 126, 125, 124, 122, 121, 120, 119, 117, 116, 115, 113, 112, 111, 109, 108, 107, 105,
- 104, 103, 101, 100, 99, 97, 96, 95, 93, 92, 91, 89, 88, 87, 85, 84, 83, 81, 80, 79, 77, 76, 75,
- 73, 72, 71, 69, 68, 67, 66, 64, 63, 62, 60, 59, 58, 57, 55, 54, 53, 52, 50, 49, 48, 47, 45, 44,
- 43, 42, 40, 39, 38, 37, 36, 34, 33, 32, 31, 30, 28, 27, 26, 25, 24, 23, 21, 20, 19, 18, 17, 16,
- 15, 14, 13, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0, -1, -2, -3, -4, -5, -6, -7, -7, -8, -9, -10,
- -11, -12, -12, -13, -14, -15, -15, -16, -17, -17, -18, -19, -19, -20, -21, -21, -22, -22, -23, -24,
- -24, -25, -25, -26, -26, -27, -27, -27, -28, -28, -29, -29, -30, -30, -30, -31, -31, -31, -32, -32,
- -32, -33, -33, -33, -33, -34, -34, -34, -34, -35, -35, -35, -35, -35, -36, -36, -36, -36, -36, -36,
- -36, -36, -36, -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, -37,
- -37, -37, -37, -37, -36, -36, -36, -36, -36, -36, -36, -36, -36, -35, -35, -35, -35, -35, -35, -34,
- -34, -34, -34, -34, -33, -33, -33, -33, -33, -32, -32, -32, -32, -31, -31, -31, -31, -30, -30, -30,
- -30, -29, -29, -29, -29, -28, -28, -28, -27, -27, -27, -27, -26, -26, -26, -25, -25, -25, -24, -24,
- -24, -23, -23, -23, -22, -22, -22, -22, -21, -21, -21, -20, -20, -20, -19, -19, -19, -18, -18, -18,
- -17, -17, -17, -16, -16, -16, -15, -15, -15, -14, -14, -14, -13, -13, -13, -12, -12, -12, -11, -11,
- -11, -10, -10, -10, -9, -9, -9, -9, -8, -8, -8, -7, -7, -7, -7, -6, -6, -6, -6, -5, -5, -5, -5, -4,
- -4, -4, -4, -3, -3, -3, -3, -3, -2, -2, -2, -2, -2, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-};
-class CFX_BilinearMatrix : public CPDF_FixedMatrix
-{
-public:
- CFX_BilinearMatrix(const CFX_AffineMatrix& src, int bits): CPDF_FixedMatrix(src, bits)
- {}
- inline void Transform(int x, int y, int& x1, int& y1, int&res_x, int&res_y)
- {
- x1 = a * x + c * y + e + base / 2;
- y1 = b * x + d * y + f + base / 2;
- res_x = x1 % base;
- res_y = y1 % base;
- if (res_x < 0 && res_x > -base) {
- res_x = base + res_x;
- }
- if (res_y < 0 && res_x > -base) {
- res_y = base + res_y;
- }
- x1 /= base;
- y1 /= base;
- }
-};
-CFX_DIBitmap* CFX_DIBSource::SwapXY(FX_BOOL bXFlip, FX_BOOL bYFlip, const FX_RECT* pDestClip) const
-{
- FX_RECT dest_clip(0, 0, m_Height, m_Width);
- if (pDestClip) {
- dest_clip.Intersect(*pDestClip);
- }
- if (dest_clip.IsEmpty()) {
- return NULL;
- }
- CFX_DIBitmap* pTransBitmap = FX_NEW CFX_DIBitmap;
- if (!pTransBitmap) {
- return NULL;
- }
- int result_height = dest_clip.Height(), result_width = dest_clip.Width();
- if (!pTransBitmap->Create(result_width, result_height, GetFormat())) {
- delete pTransBitmap;
- return NULL;
- }
- pTransBitmap->CopyPalette(m_pPalette);
- int src_pitch = m_Pitch;
- int dest_pitch = pTransBitmap->GetPitch();
- FX_LPBYTE dest_buf = pTransBitmap->GetBuffer();
- int row_start = bXFlip ? m_Height - dest_clip.right : dest_clip.left;
- int row_end = bXFlip ? m_Height - dest_clip.left : dest_clip.right;
- int col_start = bYFlip ? m_Width - dest_clip.bottom : dest_clip.top;
- int col_end = bYFlip ? m_Width - dest_clip.top : dest_clip.bottom;
- if (GetBPP() == 1) {
- FXSYS_memset8(dest_buf, 0xff, dest_pitch * result_height);
- for (int row = row_start; row < row_end; row ++) {
- FX_LPCBYTE src_scan = GetScanline(row);
- int dest_col = (bXFlip ? dest_clip.right - (row - row_start) - 1 : row) - dest_clip.left;
- FX_LPBYTE dest_scan = dest_buf;
- if (bYFlip) {
- dest_scan += (result_height - 1) * dest_pitch;
- }
- int dest_step = bYFlip ? -dest_pitch : dest_pitch;
- for (int col = col_start; col < col_end; col ++) {
- if (!(src_scan[col / 8] & (1 << (7 - col % 8)))) {
- dest_scan[dest_col / 8] &= ~(1 << (7 - dest_col % 8));
- }
- dest_scan += dest_step;
- }
- }
- } else {
- int nBytes = GetBPP() / 8;
- int dest_step = bYFlip ? -dest_pitch : dest_pitch;
- if (nBytes == 3) {
- dest_step -= 2;
- }
- for (int row = row_start; row < row_end; row ++) {
- int dest_col = (bXFlip ? dest_clip.right - (row - row_start) - 1 : row) - dest_clip.left;
- FX_LPBYTE dest_scan = dest_buf + dest_col * nBytes;
- if (bYFlip) {
- dest_scan += (result_height - 1) * dest_pitch;
- }
- if (nBytes == 4) {
- FX_DWORD* src_scan = (FX_DWORD*)GetScanline(row) + col_start;
- for (int col = col_start; col < col_end; col ++) {
- *(FX_DWORD*)dest_scan = *src_scan++;
- dest_scan += dest_step;
- }
- } else {
- FX_LPCBYTE src_scan = GetScanline(row) + col_start * nBytes;
- if (nBytes == 1)
- for (int col = col_start; col < col_end; col ++) {
- *dest_scan = *src_scan++;
- dest_scan += dest_step;
- }
- else
- for (int col = col_start; col < col_end; col ++) {
- *dest_scan++ = *src_scan++;
- *dest_scan++ = *src_scan++;
- *dest_scan = *src_scan++;
- dest_scan += dest_step;
- }
- }
- }
- }
- if (m_pAlphaMask) {
- src_pitch = m_pAlphaMask->m_Pitch;
- dest_pitch = pTransBitmap->m_pAlphaMask->GetPitch();
- dest_buf = pTransBitmap->m_pAlphaMask->GetBuffer();
- int dest_step = bYFlip ? -dest_pitch : dest_pitch;
- for (int row = row_start; row < row_end; row ++) {
- int dest_col = (bXFlip ? dest_clip.right - (row - row_start) - 1 : row) - dest_clip.left;
- FX_LPBYTE dest_scan = dest_buf + dest_col;
- if (bYFlip) {
- dest_scan += (result_height - 1) * dest_pitch;
- }
- FX_LPCBYTE src_scan = m_pAlphaMask->GetScanline(row) + col_start;
- for (int col = col_start; col < col_end; col ++) {
- *dest_scan = *src_scan++;
- dest_scan += dest_step;
- }
- }
- }
- return pTransBitmap;
-}
-#define FIX16_005 0.05f
-FX_RECT _FXDIB_SwapClipBox(FX_RECT& clip, int width, int height, FX_BOOL bFlipX, FX_BOOL bFlipY)
-{
- FX_RECT rect;
- if (bFlipY) {
- rect.left = height - clip.top;
- rect.right = height - clip.bottom;
- } else {
- rect.left = clip.top;
- rect.right = clip.bottom;
- }
- if (bFlipX) {
- rect.top = width - clip.left;
- rect.bottom = width - clip.right;
- } else {
- rect.top = clip.left;
- rect.bottom = clip.right;
- }
- rect.Normalize();
- return rect;
-}
-CFX_DIBitmap* CFX_DIBSource::TransformTo(const CFX_AffineMatrix* pDestMatrix, int& result_left, int& result_top,
- FX_DWORD flags, const FX_RECT* pDestClip) const
-{
- CFX_ImageTransformer transformer;
- transformer.Start(this, pDestMatrix, flags, pDestClip);
- transformer.Continue(NULL);
- result_left = transformer.m_ResultLeft;
- result_top = transformer.m_ResultTop;
- CFX_DIBitmap* pTransformed = transformer.m_Storer.Detach();
- return pTransformed;
-}
-CFX_DIBitmap* CFX_DIBSource::StretchTo(int dest_width, int dest_height, FX_DWORD flags, const FX_RECT* pClip) const
-{
- FX_RECT clip_rect(0, 0, FXSYS_abs(dest_width), FXSYS_abs(dest_height));
- if (pClip) {
- clip_rect.Intersect(*pClip);
- }
- if (clip_rect.IsEmpty()) {
- return NULL;
- }
- if (dest_width == m_Width && dest_height == m_Height) {
- return Clone(&clip_rect);
- }
- CFX_ImageStretcher stretcher;
- CFX_BitmapStorer storer;
- if (stretcher.Start(&storer, this, dest_width, dest_height, clip_rect, flags)) {
- stretcher.Continue(NULL);
- }
- return storer.Detach();
-}
-CFX_ImageTransformer::CFX_ImageTransformer()
-{
- m_Status = 0;
- m_pMatrix = NULL;
-}
-CFX_ImageTransformer::~CFX_ImageTransformer()
-{
-}
-FX_BOOL CFX_ImageTransformer::Start(const CFX_DIBSource* pSrc, const CFX_AffineMatrix* pDestMatrix, int flags, const FX_RECT* pDestClip)
-{
- m_pMatrix = (CFX_AffineMatrix*)pDestMatrix;
- CFX_FloatRect unit_rect = pDestMatrix->GetUnitRect();
- FX_RECT result_rect = unit_rect.GetClosestRect();
- FX_RECT result_clip = result_rect;
- if (pDestClip) {
- result_clip.Intersect(*pDestClip);
- }
- if (result_clip.IsEmpty()) {
- return FALSE;
- }
- m_ResultLeft = result_clip.left;
- m_ResultTop = result_clip.top;
- m_ResultWidth = result_clip.Width();
- m_ResultHeight = result_clip.Height();
- m_Flags = flags;
- if (FXSYS_fabs(pDestMatrix->a) < FXSYS_fabs(pDestMatrix->b) / 20 &&
- FXSYS_fabs(pDestMatrix->d) < FXSYS_fabs(pDestMatrix->c) / 20 &&
- FXSYS_fabs(pDestMatrix->a) < 0.5f && FXSYS_fabs(pDestMatrix->d) < 0.5f) {
- int dest_width = result_rect.Width();
- int dest_height = result_rect.Height();
- result_clip.Offset(-result_rect.left, -result_rect.top);
- result_clip = _FXDIB_SwapClipBox(result_clip, dest_width, dest_height, pDestMatrix->c > 0, pDestMatrix->b < 0);
- m_Stretcher.Start(&m_Storer, pSrc, dest_height, dest_width, result_clip, flags);
- m_Status = 1;
- return TRUE;
- }
- if (FXSYS_fabs(pDestMatrix->b) < FIX16_005 && FXSYS_fabs(pDestMatrix->c) < FIX16_005) {
- int dest_width = pDestMatrix->a > 0 ? (int)FXSYS_ceil(pDestMatrix->a) : (int)FXSYS_floor(pDestMatrix->a);
- int dest_height = pDestMatrix->d > 0 ? (int) - FXSYS_ceil(pDestMatrix->d) : (int) - FXSYS_floor(pDestMatrix->d);
- result_clip.Offset(-result_rect.left, -result_rect.top);
- m_Stretcher.Start(&m_Storer, pSrc, dest_width, dest_height, result_clip, flags);
- m_Status = 2;
- return TRUE;
- }
- int stretch_width = (int)FXSYS_ceil(FXSYS_sqrt2(pDestMatrix->a, pDestMatrix->b));
- int stretch_height = (int)FXSYS_ceil(FXSYS_sqrt2(pDestMatrix->c, pDestMatrix->d));
- CFX_AffineMatrix stretch2dest(1.0f, 0.0f, 0.0f, -1.0f, 0.0f, (FX_FLOAT)(stretch_height));
- stretch2dest.Concat(pDestMatrix->a / stretch_width, pDestMatrix->b / stretch_width,
- pDestMatrix->c / stretch_height, pDestMatrix->d / stretch_height, pDestMatrix->e, pDestMatrix->f);
- m_dest2stretch.SetReverse(stretch2dest);
- CFX_FloatRect clip_rect_f(result_clip);
- clip_rect_f.Transform(&m_dest2stretch);
- m_StretchClip = clip_rect_f.GetOutterRect();
- m_StretchClip.Intersect(0, 0, stretch_width, stretch_height);
- m_Stretcher.Start(&m_Storer, pSrc, stretch_width, stretch_height, m_StretchClip, flags);
- m_Status = 3;
- return TRUE;
-}
-FX_BYTE _bilinear_interpol(FX_LPCBYTE buf, int row_offset_l, int row_offset_r,
- int src_col_l, int src_col_r, int res_x, int res_y,
- int bpp, int c_offset)
-{
- int i_resx = 255 - res_x;
- int col_bpp_l = src_col_l * bpp;
- int col_bpp_r = src_col_r * bpp;
- FX_LPCBYTE buf_u = buf + row_offset_l + c_offset;
- FX_LPCBYTE buf_d = buf + row_offset_r + c_offset;
- FX_LPCBYTE src_pos0 = buf_u + col_bpp_l;
- FX_LPCBYTE src_pos1 = buf_u + col_bpp_r;
- FX_LPCBYTE src_pos2 = buf_d + col_bpp_l;
- FX_LPCBYTE src_pos3 = buf_d + col_bpp_r;
- FX_BYTE r_pos_0 = (*src_pos0 * i_resx + *src_pos1 * res_x) >> 8;
- FX_BYTE r_pos_1 = (*src_pos2 * i_resx + *src_pos3 * res_x) >> 8;
- return (r_pos_0 * (255 - res_y) + r_pos_1 * res_y) >> 8;
-}
-FX_BYTE _bicubic_interpol(FX_LPCBYTE buf, int pitch, int pos_pixel[], int u_w[], int v_w[], int res_x, int res_y,
- int bpp, int c_offset)
-{
- int s_result = 0;
- for (int i = 0; i < 4; i ++) {
- int a_result = 0;
- for (int j = 0; j < 4; j ++) {
- a_result += u_w[j] * (*(FX_BYTE*)(buf + pos_pixel[i + 4] * pitch + pos_pixel[j] * bpp + c_offset));
- }
- s_result += a_result * v_w[i];
- }
- s_result >>= 16;
- return (FX_BYTE)(s_result < 0 ? 0 : s_result > 255 ? 255 : s_result);
-}
-void _bicubic_get_pos_weight(int pos_pixel[], int u_w[], int v_w[], int src_col_l, int src_row_l,
- int res_x, int res_y, int stretch_width, int stretch_height)
-{
- pos_pixel[0] = src_col_l - 1;
- pos_pixel[1] = src_col_l;
- pos_pixel[2] = src_col_l + 1;
- pos_pixel[3] = src_col_l + 2;
- pos_pixel[4] = src_row_l - 1;
- pos_pixel[5] = src_row_l;
- pos_pixel[6] = src_row_l + 1;
- pos_pixel[7] = src_row_l + 2;
- for (int i = 0 ; i < 4; i ++) {
- if (pos_pixel[i] < 0) {
- pos_pixel[i] = 0;
- }
- if (pos_pixel[i] >= stretch_width) {
- pos_pixel[i] = stretch_width - 1;
- }
- if (pos_pixel[i + 4] < 0) {
- pos_pixel[i + 4] = 0;
- }
- if (pos_pixel[i + 4] >= stretch_height) {
- pos_pixel[i + 4] = stretch_height - 1;
- }
- }
- u_w[0] = SDP_Table[256 + res_x];
- u_w[1] = SDP_Table[res_x];
- u_w[2] = SDP_Table[256 - res_x];
- u_w[3] = SDP_Table[512 - res_x];
- v_w[0] = SDP_Table[256 + res_y];
- v_w[1] = SDP_Table[res_y];
- v_w[2] = SDP_Table[256 - res_y];
- v_w[3] = SDP_Table[512 - res_y];
-}
-FXDIB_Format _GetTransformedFormat(const CFX_DIBSource* pDrc)
-{
- FXDIB_Format format = pDrc->GetFormat();
- if (pDrc->IsAlphaMask()) {
- format = FXDIB_8bppMask;
- } else if (format >= 1025) {
- format = FXDIB_Cmyka;
- } else if (format <= 32 || format == FXDIB_Argb) {
- format = FXDIB_Argb;
- } else {
- format = FXDIB_Rgba;
- }
- return format;
-}
-FX_BOOL CFX_ImageTransformer::Continue(IFX_Pause* pPause)
-{
- if (m_Status == 1) {
- if (m_Stretcher.Continue(pPause)) {
- return TRUE;
- }
- if (m_Storer.GetBitmap()) {
- m_Storer.Replace(m_Storer.GetBitmap()->SwapXY(m_pMatrix->c > 0, m_pMatrix->b < 0));
- }
- return FALSE;
- } else if (m_Status == 2) {
- return m_Stretcher.Continue(pPause);
- } else if (m_Status != 3) {
- return FALSE;
- }
- if (m_Stretcher.Continue(pPause)) {
- return TRUE;
- }
- int stretch_width = m_StretchClip.Width();
- int stretch_height = m_StretchClip.Height();
- if (m_Storer.GetBitmap() == NULL) {
- return FALSE;
- }
- FX_LPCBYTE stretch_buf = m_Storer.GetBitmap()->GetBuffer();
- FX_LPCBYTE stretch_buf_mask = NULL;
- if (m_Storer.GetBitmap()->m_pAlphaMask) {
- stretch_buf_mask = m_Storer.GetBitmap()->m_pAlphaMask->GetBuffer();
- }
- int stretch_pitch = m_Storer.GetBitmap()->GetPitch();
- CFX_DIBitmap* pTransformed = FX_NEW CFX_DIBitmap;
- if (!pTransformed) {
- return FALSE;
- }
- FXDIB_Format transformF = _GetTransformedFormat(m_Stretcher.m_pSource);
- if (!pTransformed->Create(m_ResultWidth, m_ResultHeight, transformF)) {
- delete pTransformed;
- return FALSE;
- }
- pTransformed->Clear(0);
- if (pTransformed->m_pAlphaMask) {
- pTransformed->m_pAlphaMask->Clear(0);
- }
- CFX_AffineMatrix result2stretch(1.0f, 0.0f, 0.0f, 1.0f, (FX_FLOAT)(m_ResultLeft), (FX_FLOAT)(m_ResultTop));
- result2stretch.Concat(m_dest2stretch);
- result2stretch.TranslateI(-m_StretchClip.left, -m_StretchClip.top);
- if (stretch_buf_mask == NULL && pTransformed->m_pAlphaMask) {
- pTransformed->m_pAlphaMask->Clear(0xff000000);
- } else if (pTransformed->m_pAlphaMask) {
- int stretch_pitch_mask = m_Storer.GetBitmap()->m_pAlphaMask->GetPitch();
- if (!(m_Flags & FXDIB_DOWNSAMPLE) && !(m_Flags & FXDIB_BICUBIC_INTERPOL)) {
- CFX_BilinearMatrix result2stretch_fix(result2stretch, 8);
- for (int row = 0; row < m_ResultHeight; row ++) {
- FX_BYTE* dest_pos_mask = (FX_BYTE*)pTransformed->m_pAlphaMask->GetScanline(row);
- for (int col = 0; col < m_ResultWidth; col ++) {
- int src_col_l, src_row_l, res_x, res_y;
- result2stretch_fix.Transform(col, row, src_col_l, src_row_l, res_x, res_y);
- if (src_col_l >= 0 && src_col_l <= stretch_width && src_row_l >= 0 && src_row_l <= stretch_height) {
- if (src_col_l == stretch_width) {
- src_col_l--;
- }
- if (src_row_l == stretch_height) {
- src_row_l--;
- }
- int src_col_r = src_col_l + 1;
- int src_row_r = src_row_l + 1;
- if (src_col_r == stretch_width) {
- src_col_r--;
- }
- if (src_row_r == stretch_height) {
- src_row_r--;
- }
- int row_offset_l = src_row_l * stretch_pitch_mask;
- int row_offset_r = src_row_r * stretch_pitch_mask;
- *dest_pos_mask = _bilinear_interpol(stretch_buf_mask, row_offset_l, row_offset_r, src_col_l, src_col_r, res_x, res_y, 1, 0);
- }
- dest_pos_mask++;
- }
- }
- } else if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
- CFX_BilinearMatrix result2stretch_fix(result2stretch, 8);
- int pos_pixel[8];
- for (int row = 0; row < m_ResultHeight; row ++) {
- FX_BYTE* dest_pos_mask = (FX_BYTE*)pTransformed->m_pAlphaMask->GetScanline(row);
- for (int col = 0; col < m_ResultWidth; col ++) {
- int src_col_l, src_row_l, res_x, res_y;
- result2stretch_fix.Transform(col, row, src_col_l, src_row_l, res_x, res_y);
- if (src_col_l >= 0 && src_col_l <= stretch_width && src_row_l >= 0 && src_row_l <= stretch_height) {
- int u_w[4], v_w[4];
- if (src_col_l == stretch_width) {
- src_col_l--;
- }
- if (src_row_l == stretch_height) {
- src_row_l--;
- }
- _bicubic_get_pos_weight(pos_pixel, u_w, v_w, src_col_l, src_row_l, res_x, res_y, stretch_width, stretch_height);
- *dest_pos_mask = _bicubic_interpol(stretch_buf_mask, stretch_pitch_mask, pos_pixel, u_w, v_w, res_x, res_y, 1, 0);
- }
- dest_pos_mask++;
- }
- }
- } else {
- CPDF_FixedMatrix result2stretch_fix(result2stretch, 8);
- for (int row = 0; row < m_ResultHeight; row ++) {
- FX_BYTE* dest_pos_mask = (FX_BYTE*)pTransformed->m_pAlphaMask->GetScanline(row);
- for (int col = 0; col < m_ResultWidth; col ++) {
- int src_col, src_row;
- result2stretch_fix.Transform(col, row, src_col, src_row);
- if (src_col >= 0 && src_col <= stretch_width && src_row >= 0 && src_row <= stretch_height) {
- if (src_col == stretch_width) {
- src_col --;
- }
- if (src_row == stretch_height) {
- src_row --;
- }
- *dest_pos_mask = stretch_buf_mask[src_row * stretch_pitch_mask + src_col];
- }
- dest_pos_mask++;
- }
- }
- }
- }
- if (m_Storer.GetBitmap()->IsAlphaMask()) {
- if (!(m_Flags & FXDIB_DOWNSAMPLE) && !(m_Flags & FXDIB_BICUBIC_INTERPOL)) {
- CFX_BilinearMatrix result2stretch_fix(result2stretch, 8);
- for (int row = 0; row < m_ResultHeight; row ++) {
- FX_LPBYTE dest_scan = (FX_LPBYTE)pTransformed->GetScanline(row);
- for (int col = 0; col < m_ResultWidth; col ++) {
- int src_col_l, src_row_l, res_x, res_y;
- result2stretch_fix.Transform(col, row, src_col_l, src_row_l, res_x, res_y);
- if (src_col_l >= 0 && src_col_l <= stretch_width && src_row_l >= 0 && src_row_l <= stretch_height) {
- if (src_col_l == stretch_width) {
- src_col_l--;
- }
- if (src_row_l == stretch_height) {
- src_row_l--;
- }
- int src_col_r = src_col_l + 1;
- int src_row_r = src_row_l + 1;
- if (src_col_r == stretch_width) {
- src_col_r--;
- }
- if (src_row_r == stretch_height) {
- src_row_r--;
- }
- int row_offset_l = src_row_l * stretch_pitch;
- int row_offset_r = src_row_r * stretch_pitch;
- *dest_scan = _bilinear_interpol(stretch_buf, row_offset_l, row_offset_r, src_col_l, src_col_r, res_x, res_y, 1, 0);
- }
- dest_scan ++;
- }
- }
- } else if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
- CFX_BilinearMatrix result2stretch_fix(result2stretch, 8);
- int pos_pixel[8];
- for (int row = 0; row < m_ResultHeight; row ++) {
- FX_LPBYTE dest_scan = (FX_LPBYTE)pTransformed->GetScanline(row);
- for (int col = 0; col < m_ResultWidth; col ++) {
- int src_col_l, src_row_l, res_x, res_y;
- result2stretch_fix.Transform(col, row, src_col_l, src_row_l, res_x, res_y);
- if (src_col_l >= 0 && src_col_l <= stretch_width && src_row_l >= 0 && src_row_l <= stretch_height) {
- int u_w[4], v_w[4];
- if (src_col_l == stretch_width) {
- src_col_l--;
- }
- if (src_row_l == stretch_height) {
- src_row_l--;
- }
- _bicubic_get_pos_weight(pos_pixel, u_w, v_w, src_col_l, src_row_l, res_x, res_y, stretch_width, stretch_height);
- *dest_scan = _bicubic_interpol(stretch_buf, stretch_pitch, pos_pixel, u_w, v_w, res_x, res_y, 1, 0);
- }
- dest_scan ++;
- }
- }
- } else {
- CPDF_FixedMatrix result2stretch_fix(result2stretch, 8);
- for (int row = 0; row < m_ResultHeight; row ++) {
- FX_LPBYTE dest_scan = (FX_LPBYTE)pTransformed->GetScanline(row);
- for (int col = 0; col < m_ResultWidth; col ++) {
- int src_col, src_row;
- result2stretch_fix.Transform(col, row, src_col, src_row);
- if (src_col >= 0 && src_col <= stretch_width && src_row >= 0 && src_row <= stretch_height) {
- if (src_col == stretch_width) {
- src_col --;
- }
- if (src_row == stretch_height) {
- src_row --;
- }
- FX_LPCBYTE src_pixel = stretch_buf + stretch_pitch * src_row + src_col;
- *dest_scan = *src_pixel;
- }
- dest_scan ++;
- }
- }
- }
- } else {
- int Bpp = m_Storer.GetBitmap()->GetBPP() / 8;
- int destBpp = pTransformed->GetBPP() / 8;
- if (Bpp == 1) {
- FX_BOOL bHasAlpha = m_Storer.GetBitmap()->HasAlpha();
- FX_DWORD argb[256];
- FX_ARGB* pPal = m_Storer.GetBitmap()->GetPalette();
- if (pPal) {
- for (int i = 0; i < 256; i ++) {
- argb[i] = pPal[i];
- }
- } else {
- if (m_Storer.GetBitmap()->IsCmykImage())
- for (int i = 0; i < 256; i ++) {
- argb[i] = 255 - i;
- }
- else
- for (int i = 0; i < 256; i ++) {
- argb[i] = 0xff000000 | (i * 0x010101);
- }
- }
- if (!(m_Flags & FXDIB_DOWNSAMPLE) && !(m_Flags & FXDIB_BICUBIC_INTERPOL)) {
- CFX_BilinearMatrix result2stretch_fix(result2stretch, 8);
- for (int row = 0; row < m_ResultHeight; row ++) {
- FX_BYTE* dest_pos = (FX_BYTE*)pTransformed->GetScanline(row);
- for (int col = 0; col < m_ResultWidth; col ++) {
- int src_col_l, src_row_l, res_x, res_y;
- result2stretch_fix.Transform(col, row, src_col_l, src_row_l, res_x, res_y);
- if (src_col_l >= 0 && src_col_l <= stretch_width && src_row_l >= 0 && src_row_l <= stretch_height) {
- if (src_col_l == stretch_width) {
- src_col_l--;
- }
- if (src_row_l == stretch_height) {
- src_row_l--;
- }
- int src_col_r = src_col_l + 1;
- int src_row_r = src_row_l + 1;
- if (src_col_r == stretch_width) {
- src_col_r--;
- }
- if (src_row_r == stretch_height) {
- src_row_r--;
- }
- int row_offset_l = src_row_l * stretch_pitch;
- int row_offset_r = src_row_r * stretch_pitch;
- FX_DWORD r_bgra_cmyk = argb[_bilinear_interpol(stretch_buf, row_offset_l, row_offset_r, src_col_l, src_col_r, res_x, res_y, 1, 0)];
- if (transformF == FXDIB_Rgba) {
- dest_pos[0] = (FX_BYTE)(r_bgra_cmyk >> 24);
- dest_pos[1] = (FX_BYTE)(r_bgra_cmyk >> 16);
- dest_pos[2] = (FX_BYTE)(r_bgra_cmyk >> 8);
- } else {
- *(FX_DWORD*)dest_pos = r_bgra_cmyk;
- }
- }
- dest_pos += destBpp;
- }
- }
- } else if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
- CFX_BilinearMatrix result2stretch_fix(result2stretch, 8);
- int pos_pixel[8];
- for (int row = 0; row < m_ResultHeight; row ++) {
- FX_BYTE* dest_pos = (FX_BYTE*)pTransformed->GetScanline(row);
- for (int col = 0; col < m_ResultWidth; col ++) {
- int src_col_l, src_row_l, res_x, res_y;
- result2stretch_fix.Transform(col, row, src_col_l, src_row_l, res_x, res_y);
- if (src_col_l >= 0 && src_col_l <= stretch_width && src_row_l >= 0 && src_row_l <= stretch_height) {
- int u_w[4], v_w[4];
- if (src_col_l == stretch_width) {
- src_col_l--;
- }
- if (src_row_l == stretch_height) {
- src_row_l--;
- }
- _bicubic_get_pos_weight(pos_pixel, u_w, v_w, src_col_l, src_row_l, res_x, res_y, stretch_width, stretch_height);
- FX_DWORD r_bgra_cmyk = argb[_bicubic_interpol(stretch_buf, stretch_pitch, pos_pixel, u_w, v_w, res_x, res_y, 1, 0)];
- if (transformF == FXDIB_Rgba) {
- dest_pos[0] = (FX_BYTE)(r_bgra_cmyk >> 24);
- dest_pos[1] = (FX_BYTE)(r_bgra_cmyk >> 16);
- dest_pos[2] = (FX_BYTE)(r_bgra_cmyk >> 8);
- } else {
- *(FX_DWORD*)dest_pos = r_bgra_cmyk;
- }
- }
- dest_pos += destBpp;
- }
- }
- } else {
- CPDF_FixedMatrix result2stretch_fix(result2stretch, 8);
- for (int row = 0; row < m_ResultHeight; row ++) {
- FX_BYTE* dest_pos = (FX_BYTE*)pTransformed->GetScanline(row);
- for (int col = 0; col < m_ResultWidth; col ++) {
- int src_col, src_row;
- result2stretch_fix.Transform(col, row, src_col, src_row);
- if (src_col >= 0 && src_col <= stretch_width && src_row >= 0 && src_row <= stretch_height) {
- if (src_col == stretch_width) {
- src_col --;
- }
- if (src_row == stretch_height) {
- src_row --;
- }
- FX_DWORD r_bgra_cmyk = argb[stretch_buf[src_row * stretch_pitch + src_col]];
- if (transformF == FXDIB_Rgba) {
- dest_pos[0] = (FX_BYTE)(r_bgra_cmyk >> 24);
- dest_pos[1] = (FX_BYTE)(r_bgra_cmyk >> 16);
- dest_pos[2] = (FX_BYTE)(r_bgra_cmyk >> 8);
- } else {
- *(FX_DWORD*)dest_pos = r_bgra_cmyk;
- }
- }
- dest_pos += destBpp;
- }
- }
- }
- } else {
- FX_BOOL bHasAlpha = m_Storer.GetBitmap()->HasAlpha();
- int destBpp = pTransformed->GetBPP() / 8;
- if (!(m_Flags & FXDIB_DOWNSAMPLE) && !(m_Flags & FXDIB_BICUBIC_INTERPOL)) {
- CFX_BilinearMatrix result2stretch_fix(result2stretch, 8);
- for (int row = 0; row < m_ResultHeight; row ++) {
- FX_BYTE* dest_pos = (FX_BYTE*)pTransformed->GetScanline(row);
- for (int col = 0; col < m_ResultWidth; col ++) {
- int src_col_l, src_row_l, res_x, res_y, r_pos_k_r = 0;
- result2stretch_fix.Transform(col, row, src_col_l, src_row_l, res_x, res_y);
- if (src_col_l >= 0 && src_col_l <= stretch_width && src_row_l >= 0 && src_row_l <= stretch_height) {
- if (src_col_l == stretch_width) {
- src_col_l--;
- }
- if (src_row_l == stretch_height) {
- src_row_l--;
- }
- int src_col_r = src_col_l + 1;
- int src_row_r = src_row_l + 1;
- if (src_col_r == stretch_width) {
- src_col_r--;
- }
- if (src_row_r == stretch_height) {
- src_row_r--;
- }
- int row_offset_l = src_row_l * stretch_pitch;
- int row_offset_r = src_row_r * stretch_pitch;
- FX_BYTE r_pos_red_y_r = _bilinear_interpol(stretch_buf, row_offset_l, row_offset_r, src_col_l, src_col_r, res_x, res_y, Bpp, 2);
- FX_BYTE r_pos_green_m_r = _bilinear_interpol(stretch_buf, row_offset_l, row_offset_r, src_col_l, src_col_r, res_x, res_y, Bpp, 1);
- FX_BYTE r_pos_blue_c_r = _bilinear_interpol(stretch_buf, row_offset_l, row_offset_r, src_col_l, src_col_r, res_x, res_y, Bpp, 0);
- if (bHasAlpha) {
- if (transformF != FXDIB_Argb) {
- if (transformF == FXDIB_Rgba) {
- dest_pos[0] = r_pos_blue_c_r;
- dest_pos[1] = r_pos_green_m_r;
- dest_pos[2] = r_pos_red_y_r;
- } else {
- r_pos_k_r = _bilinear_interpol(stretch_buf, row_offset_l, row_offset_r, src_col_l, src_col_r, res_x, res_y, Bpp, 3);
- *(FX_DWORD*)dest_pos = FXCMYK_TODIB(CmykEncode(r_pos_blue_c_r, r_pos_green_m_r, r_pos_red_y_r, r_pos_k_r));
- }
- } else {
- FX_BYTE r_pos_a_r = _bilinear_interpol(stretch_buf, row_offset_l, row_offset_r, src_col_l, src_col_r, res_x, res_y, Bpp, 3);
- *(FX_DWORD*)dest_pos = FXARGB_TODIB(FXARGB_MAKE(r_pos_a_r, r_pos_red_y_r, r_pos_green_m_r, r_pos_blue_c_r));
- }
- } else {
- r_pos_k_r = 0xff;
- if (transformF == FXDIB_Cmyka) {
- r_pos_k_r = _bilinear_interpol(stretch_buf, row_offset_l, row_offset_r, src_col_l, src_col_r, res_x, res_y, Bpp, 3);
- *(FX_DWORD*)dest_pos = FXCMYK_TODIB(CmykEncode(r_pos_blue_c_r, r_pos_green_m_r, r_pos_red_y_r, r_pos_k_r));
- } else {
- *(FX_DWORD*)dest_pos = FXARGB_TODIB(FXARGB_MAKE(r_pos_k_r, r_pos_red_y_r, r_pos_green_m_r, r_pos_blue_c_r));
- }
- }
- }
- dest_pos += destBpp;
- }
- }
- } else if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
- CFX_BilinearMatrix result2stretch_fix(result2stretch, 8);
- int pos_pixel[8];
- for (int row = 0; row < m_ResultHeight; row ++) {
- FX_BYTE* dest_pos = (FX_BYTE*)pTransformed->GetScanline(row);
- for (int col = 0; col < m_ResultWidth; col ++) {
- int src_col_l, src_row_l, res_x, res_y, r_pos_k_r = 0;
- result2stretch_fix.Transform(col, row, src_col_l, src_row_l, res_x, res_y);
- if (src_col_l >= 0 && src_col_l <= stretch_width && src_row_l >= 0 && src_row_l <= stretch_height) {
- int u_w[4], v_w[4];
- if (src_col_l == stretch_width) {
- src_col_l--;
- }
- if (src_row_l == stretch_height) {
- src_row_l--;
- }
- _bicubic_get_pos_weight(pos_pixel, u_w, v_w, src_col_l, src_row_l, res_x, res_y, stretch_width, stretch_height);
- FX_BYTE r_pos_red_y_r = _bicubic_interpol(stretch_buf, stretch_pitch, pos_pixel, u_w, v_w, res_x, res_y, Bpp, 2);
- FX_BYTE r_pos_green_m_r = _bicubic_interpol(stretch_buf, stretch_pitch, pos_pixel, u_w, v_w, res_x, res_y, Bpp, 1);
- FX_BYTE r_pos_blue_c_r = _bicubic_interpol(stretch_buf, stretch_pitch, pos_pixel, u_w, v_w, res_x, res_y, Bpp, 0);
- if (bHasAlpha) {
- if (transformF != FXDIB_Argb) {
- if (transformF == FXDIB_Rgba) {
- dest_pos[0] = r_pos_blue_c_r;
- dest_pos[1] = r_pos_green_m_r;
- dest_pos[2] = r_pos_red_y_r;
- } else {
- r_pos_k_r = _bicubic_interpol(stretch_buf, stretch_pitch, pos_pixel, u_w, v_w, res_x, res_y, Bpp, 3);
- *(FX_DWORD*)dest_pos = FXCMYK_TODIB(CmykEncode(r_pos_blue_c_r, r_pos_green_m_r, r_pos_red_y_r, r_pos_k_r));
- }
- } else {
- FX_BYTE r_pos_a_r = _bicubic_interpol(stretch_buf, stretch_pitch, pos_pixel, u_w, v_w, res_x, res_y, Bpp, 3);
- *(FX_DWORD*)dest_pos = FXARGB_TODIB(FXARGB_MAKE(r_pos_a_r, r_pos_red_y_r, r_pos_green_m_r, r_pos_blue_c_r));
- }
- } else {
- r_pos_k_r = 0xff;
- if (transformF == FXDIB_Cmyka) {
- r_pos_k_r = _bicubic_interpol(stretch_buf, stretch_pitch, pos_pixel, u_w, v_w, res_x, res_y, Bpp, 3);
- *(FX_DWORD*)dest_pos = FXCMYK_TODIB(CmykEncode(r_pos_blue_c_r, r_pos_green_m_r, r_pos_red_y_r, r_pos_k_r));
- } else {
- *(FX_DWORD*)dest_pos = FXARGB_TODIB(FXARGB_MAKE(r_pos_k_r, r_pos_red_y_r, r_pos_green_m_r, r_pos_blue_c_r));
- }
- }
- }
- dest_pos += destBpp;
- }
- }
- } else {
- CPDF_FixedMatrix result2stretch_fix(result2stretch, 8);
- for (int row = 0; row < m_ResultHeight; row ++) {
- FX_BYTE* dest_pos = (FX_BYTE*)pTransformed->GetScanline(row);
- for (int col = 0; col < m_ResultWidth; col ++) {
- int src_col, src_row;
- result2stretch_fix.Transform(col, row, src_col, src_row);
- if (src_col >= 0 && src_col <= stretch_width && src_row >= 0 && src_row <= stretch_height) {
- if (src_col == stretch_width) {
- src_col --;
- }
- if (src_row == stretch_height) {
- src_row --;
- }
- FX_LPCBYTE src_pos = stretch_buf + src_row * stretch_pitch + src_col * Bpp;
- if (bHasAlpha) {
- if (transformF != FXDIB_Argb) {
- if (transformF == FXDIB_Rgba) {
- dest_pos[0] = src_pos[0];
- dest_pos[1] = src_pos[1];
- dest_pos[2] = src_pos[2];
- } else {
- *(FX_DWORD*)dest_pos = FXCMYK_TODIB(CmykEncode(src_pos[0], src_pos[1], src_pos[2], src_pos[3]));
- }
- } else {
- *(FX_DWORD*)dest_pos = FXARGB_TODIB(FXARGB_MAKE(src_pos[3], src_pos[2], src_pos[1], src_pos[0]));
- }
- } else {
- if (transformF == FXDIB_Cmyka) {
- *(FX_DWORD*)dest_pos = FXCMYK_TODIB(CmykEncode(src_pos[0], src_pos[1], src_pos[2], src_pos[3]));
- } else {
- *(FX_DWORD*)dest_pos = FXARGB_TODIB(FXARGB_MAKE(0xff, src_pos[2], src_pos[1], src_pos[0]));
- }
- }
- }
- dest_pos += destBpp;
- }
- }
- }
- }
- }
- m_Storer.Replace(pTransformed);
- return FALSE;
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxge/fx_dib.h"
+#include "dib_int.h"
+int SDP_Table[513] = {
+ 256, 256, 256, 256, 256, 256, 256, 256, 256, 255, 255, 255, 255, 255, 255, 254, 254, 254, 254,
+ 253, 253, 253, 252, 252, 252, 251, 251, 251, 250, 250, 249, 249, 249, 248, 248, 247, 247, 246,
+ 246, 245, 244, 244, 243, 243, 242, 242, 241, 240, 240, 239, 238, 238, 237, 236, 236, 235, 234,
+ 233, 233, 232, 231, 230, 230, 229, 228, 227, 226, 226, 225, 224, 223, 222, 221, 220, 219, 218,
+ 218, 217, 216, 215, 214, 213, 212, 211, 210, 209, 208, 207, 206, 205, 204, 203, 202, 201, 200,
+ 199, 198, 196, 195, 194, 193, 192, 191, 190, 189, 188, 186, 185, 184, 183, 182, 181, 179, 178,
+ 177, 176, 175, 173, 172, 171, 170, 169, 167, 166, 165, 164, 162, 161, 160, 159, 157, 156, 155,
+ 154, 152, 151, 150, 149, 147, 146, 145, 143, 142, 141, 140, 138, 137, 136, 134, 133, 132, 130,
+ 129, 128, 126, 125, 124, 122, 121, 120, 119, 117, 116, 115, 113, 112, 111, 109, 108, 107, 105,
+ 104, 103, 101, 100, 99, 97, 96, 95, 93, 92, 91, 89, 88, 87, 85, 84, 83, 81, 80, 79, 77, 76, 75,
+ 73, 72, 71, 69, 68, 67, 66, 64, 63, 62, 60, 59, 58, 57, 55, 54, 53, 52, 50, 49, 48, 47, 45, 44,
+ 43, 42, 40, 39, 38, 37, 36, 34, 33, 32, 31, 30, 28, 27, 26, 25, 24, 23, 21, 20, 19, 18, 17, 16,
+ 15, 14, 13, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0, -1, -2, -3, -4, -5, -6, -7, -7, -8, -9, -10,
+ -11, -12, -12, -13, -14, -15, -15, -16, -17, -17, -18, -19, -19, -20, -21, -21, -22, -22, -23, -24,
+ -24, -25, -25, -26, -26, -27, -27, -27, -28, -28, -29, -29, -30, -30, -30, -31, -31, -31, -32, -32,
+ -32, -33, -33, -33, -33, -34, -34, -34, -34, -35, -35, -35, -35, -35, -36, -36, -36, -36, -36, -36,
+ -36, -36, -36, -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, -37,
+ -37, -37, -37, -37, -36, -36, -36, -36, -36, -36, -36, -36, -36, -35, -35, -35, -35, -35, -35, -34,
+ -34, -34, -34, -34, -33, -33, -33, -33, -33, -32, -32, -32, -32, -31, -31, -31, -31, -30, -30, -30,
+ -30, -29, -29, -29, -29, -28, -28, -28, -27, -27, -27, -27, -26, -26, -26, -25, -25, -25, -24, -24,
+ -24, -23, -23, -23, -22, -22, -22, -22, -21, -21, -21, -20, -20, -20, -19, -19, -19, -18, -18, -18,
+ -17, -17, -17, -16, -16, -16, -15, -15, -15, -14, -14, -14, -13, -13, -13, -12, -12, -12, -11, -11,
+ -11, -10, -10, -10, -9, -9, -9, -9, -8, -8, -8, -7, -7, -7, -7, -6, -6, -6, -6, -5, -5, -5, -5, -4,
+ -4, -4, -4, -3, -3, -3, -3, -3, -2, -2, -2, -2, -2, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+};
+class CFX_BilinearMatrix : public CPDF_FixedMatrix
+{
+public:
+ CFX_BilinearMatrix(const CFX_AffineMatrix& src, int bits): CPDF_FixedMatrix(src, bits)
+ {}
+ inline void Transform(int x, int y, int& x1, int& y1, int&res_x, int&res_y)
+ {
+ x1 = a * x + c * y + e + base / 2;
+ y1 = b * x + d * y + f + base / 2;
+ res_x = x1 % base;
+ res_y = y1 % base;
+ if (res_x < 0 && res_x > -base) {
+ res_x = base + res_x;
+ }
+ if (res_y < 0 && res_x > -base) {
+ res_y = base + res_y;
+ }
+ x1 /= base;
+ y1 /= base;
+ }
+};
+CFX_DIBitmap* CFX_DIBSource::SwapXY(FX_BOOL bXFlip, FX_BOOL bYFlip, const FX_RECT* pDestClip) const
+{
+ FX_RECT dest_clip(0, 0, m_Height, m_Width);
+ if (pDestClip) {
+ dest_clip.Intersect(*pDestClip);
+ }
+ if (dest_clip.IsEmpty()) {
+ return NULL;
+ }
+ CFX_DIBitmap* pTransBitmap = FX_NEW CFX_DIBitmap;
+ if (!pTransBitmap) {
+ return NULL;
+ }
+ int result_height = dest_clip.Height(), result_width = dest_clip.Width();
+ if (!pTransBitmap->Create(result_width, result_height, GetFormat())) {
+ delete pTransBitmap;
+ return NULL;
+ }
+ pTransBitmap->CopyPalette(m_pPalette);
+ int src_pitch = m_Pitch;
+ int dest_pitch = pTransBitmap->GetPitch();
+ FX_LPBYTE dest_buf = pTransBitmap->GetBuffer();
+ int row_start = bXFlip ? m_Height - dest_clip.right : dest_clip.left;
+ int row_end = bXFlip ? m_Height - dest_clip.left : dest_clip.right;
+ int col_start = bYFlip ? m_Width - dest_clip.bottom : dest_clip.top;
+ int col_end = bYFlip ? m_Width - dest_clip.top : dest_clip.bottom;
+ if (GetBPP() == 1) {
+ FXSYS_memset8(dest_buf, 0xff, dest_pitch * result_height);
+ for (int row = row_start; row < row_end; row ++) {
+ FX_LPCBYTE src_scan = GetScanline(row);
+ int dest_col = (bXFlip ? dest_clip.right - (row - row_start) - 1 : row) - dest_clip.left;
+ FX_LPBYTE dest_scan = dest_buf;
+ if (bYFlip) {
+ dest_scan += (result_height - 1) * dest_pitch;
+ }
+ int dest_step = bYFlip ? -dest_pitch : dest_pitch;
+ for (int col = col_start; col < col_end; col ++) {
+ if (!(src_scan[col / 8] & (1 << (7 - col % 8)))) {
+ dest_scan[dest_col / 8] &= ~(1 << (7 - dest_col % 8));
+ }
+ dest_scan += dest_step;
+ }
+ }
+ } else {
+ int nBytes = GetBPP() / 8;
+ int dest_step = bYFlip ? -dest_pitch : dest_pitch;
+ if (nBytes == 3) {
+ dest_step -= 2;
+ }
+ for (int row = row_start; row < row_end; row ++) {
+ int dest_col = (bXFlip ? dest_clip.right - (row - row_start) - 1 : row) - dest_clip.left;
+ FX_LPBYTE dest_scan = dest_buf + dest_col * nBytes;
+ if (bYFlip) {
+ dest_scan += (result_height - 1) * dest_pitch;
+ }
+ if (nBytes == 4) {
+ FX_DWORD* src_scan = (FX_DWORD*)GetScanline(row) + col_start;
+ for (int col = col_start; col < col_end; col ++) {
+ *(FX_DWORD*)dest_scan = *src_scan++;
+ dest_scan += dest_step;
+ }
+ } else {
+ FX_LPCBYTE src_scan = GetScanline(row) + col_start * nBytes;
+ if (nBytes == 1)
+ for (int col = col_start; col < col_end; col ++) {
+ *dest_scan = *src_scan++;
+ dest_scan += dest_step;
+ }
+ else
+ for (int col = col_start; col < col_end; col ++) {
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ *dest_scan = *src_scan++;
+ dest_scan += dest_step;
+ }
+ }
+ }
+ }
+ if (m_pAlphaMask) {
+ src_pitch = m_pAlphaMask->m_Pitch;
+ dest_pitch = pTransBitmap->m_pAlphaMask->GetPitch();
+ dest_buf = pTransBitmap->m_pAlphaMask->GetBuffer();
+ int dest_step = bYFlip ? -dest_pitch : dest_pitch;
+ for (int row = row_start; row < row_end; row ++) {
+ int dest_col = (bXFlip ? dest_clip.right - (row - row_start) - 1 : row) - dest_clip.left;
+ FX_LPBYTE dest_scan = dest_buf + dest_col;
+ if (bYFlip) {
+ dest_scan += (result_height - 1) * dest_pitch;
+ }
+ FX_LPCBYTE src_scan = m_pAlphaMask->GetScanline(row) + col_start;
+ for (int col = col_start; col < col_end; col ++) {
+ *dest_scan = *src_scan++;
+ dest_scan += dest_step;
+ }
+ }
+ }
+ return pTransBitmap;
+}
+#define FIX16_005 0.05f
+FX_RECT _FXDIB_SwapClipBox(FX_RECT& clip, int width, int height, FX_BOOL bFlipX, FX_BOOL bFlipY)
+{
+ FX_RECT rect;
+ if (bFlipY) {
+ rect.left = height - clip.top;
+ rect.right = height - clip.bottom;
+ } else {
+ rect.left = clip.top;
+ rect.right = clip.bottom;
+ }
+ if (bFlipX) {
+ rect.top = width - clip.left;
+ rect.bottom = width - clip.right;
+ } else {
+ rect.top = clip.left;
+ rect.bottom = clip.right;
+ }
+ rect.Normalize();
+ return rect;
+}
+CFX_DIBitmap* CFX_DIBSource::TransformTo(const CFX_AffineMatrix* pDestMatrix, int& result_left, int& result_top,
+ FX_DWORD flags, const FX_RECT* pDestClip) const
+{
+ CFX_ImageTransformer transformer;
+ transformer.Start(this, pDestMatrix, flags, pDestClip);
+ transformer.Continue(NULL);
+ result_left = transformer.m_ResultLeft;
+ result_top = transformer.m_ResultTop;
+ CFX_DIBitmap* pTransformed = transformer.m_Storer.Detach();
+ return pTransformed;
+}
+CFX_DIBitmap* CFX_DIBSource::StretchTo(int dest_width, int dest_height, FX_DWORD flags, const FX_RECT* pClip) const
+{
+ FX_RECT clip_rect(0, 0, FXSYS_abs(dest_width), FXSYS_abs(dest_height));
+ if (pClip) {
+ clip_rect.Intersect(*pClip);
+ }
+ if (clip_rect.IsEmpty()) {
+ return NULL;
+ }
+ if (dest_width == m_Width && dest_height == m_Height) {
+ return Clone(&clip_rect);
+ }
+ CFX_ImageStretcher stretcher;
+ CFX_BitmapStorer storer;
+ if (stretcher.Start(&storer, this, dest_width, dest_height, clip_rect, flags)) {
+ stretcher.Continue(NULL);
+ }
+ return storer.Detach();
+}
+CFX_ImageTransformer::CFX_ImageTransformer()
+{
+ m_Status = 0;
+ m_pMatrix = NULL;
+}
+CFX_ImageTransformer::~CFX_ImageTransformer()
+{
+}
+FX_BOOL CFX_ImageTransformer::Start(const CFX_DIBSource* pSrc, const CFX_AffineMatrix* pDestMatrix, int flags, const FX_RECT* pDestClip)
+{
+ m_pMatrix = (CFX_AffineMatrix*)pDestMatrix;
+ CFX_FloatRect unit_rect = pDestMatrix->GetUnitRect();
+ FX_RECT result_rect = unit_rect.GetClosestRect();
+ FX_RECT result_clip = result_rect;
+ if (pDestClip) {
+ result_clip.Intersect(*pDestClip);
+ }
+ if (result_clip.IsEmpty()) {
+ return FALSE;
+ }
+ m_ResultLeft = result_clip.left;
+ m_ResultTop = result_clip.top;
+ m_ResultWidth = result_clip.Width();
+ m_ResultHeight = result_clip.Height();
+ m_Flags = flags;
+ if (FXSYS_fabs(pDestMatrix->a) < FXSYS_fabs(pDestMatrix->b) / 20 &&
+ FXSYS_fabs(pDestMatrix->d) < FXSYS_fabs(pDestMatrix->c) / 20 &&
+ FXSYS_fabs(pDestMatrix->a) < 0.5f && FXSYS_fabs(pDestMatrix->d) < 0.5f) {
+ int dest_width = result_rect.Width();
+ int dest_height = result_rect.Height();
+ result_clip.Offset(-result_rect.left, -result_rect.top);
+ result_clip = _FXDIB_SwapClipBox(result_clip, dest_width, dest_height, pDestMatrix->c > 0, pDestMatrix->b < 0);
+ m_Stretcher.Start(&m_Storer, pSrc, dest_height, dest_width, result_clip, flags);
+ m_Status = 1;
+ return TRUE;
+ }
+ if (FXSYS_fabs(pDestMatrix->b) < FIX16_005 && FXSYS_fabs(pDestMatrix->c) < FIX16_005) {
+ int dest_width = pDestMatrix->a > 0 ? (int)FXSYS_ceil(pDestMatrix->a) : (int)FXSYS_floor(pDestMatrix->a);
+ int dest_height = pDestMatrix->d > 0 ? (int) - FXSYS_ceil(pDestMatrix->d) : (int) - FXSYS_floor(pDestMatrix->d);
+ result_clip.Offset(-result_rect.left, -result_rect.top);
+ m_Stretcher.Start(&m_Storer, pSrc, dest_width, dest_height, result_clip, flags);
+ m_Status = 2;
+ return TRUE;
+ }
+ int stretch_width = (int)FXSYS_ceil(FXSYS_sqrt2(pDestMatrix->a, pDestMatrix->b));
+ int stretch_height = (int)FXSYS_ceil(FXSYS_sqrt2(pDestMatrix->c, pDestMatrix->d));
+ CFX_AffineMatrix stretch2dest(1.0f, 0.0f, 0.0f, -1.0f, 0.0f, (FX_FLOAT)(stretch_height));
+ stretch2dest.Concat(pDestMatrix->a / stretch_width, pDestMatrix->b / stretch_width,
+ pDestMatrix->c / stretch_height, pDestMatrix->d / stretch_height, pDestMatrix->e, pDestMatrix->f);
+ m_dest2stretch.SetReverse(stretch2dest);
+ CFX_FloatRect clip_rect_f(result_clip);
+ clip_rect_f.Transform(&m_dest2stretch);
+ m_StretchClip = clip_rect_f.GetOutterRect();
+ m_StretchClip.Intersect(0, 0, stretch_width, stretch_height);
+ m_Stretcher.Start(&m_Storer, pSrc, stretch_width, stretch_height, m_StretchClip, flags);
+ m_Status = 3;
+ return TRUE;
+}
+FX_BYTE _bilinear_interpol(FX_LPCBYTE buf, int row_offset_l, int row_offset_r,
+ int src_col_l, int src_col_r, int res_x, int res_y,
+ int bpp, int c_offset)
+{
+ int i_resx = 255 - res_x;
+ int col_bpp_l = src_col_l * bpp;
+ int col_bpp_r = src_col_r * bpp;
+ FX_LPCBYTE buf_u = buf + row_offset_l + c_offset;
+ FX_LPCBYTE buf_d = buf + row_offset_r + c_offset;
+ FX_LPCBYTE src_pos0 = buf_u + col_bpp_l;
+ FX_LPCBYTE src_pos1 = buf_u + col_bpp_r;
+ FX_LPCBYTE src_pos2 = buf_d + col_bpp_l;
+ FX_LPCBYTE src_pos3 = buf_d + col_bpp_r;
+ FX_BYTE r_pos_0 = (*src_pos0 * i_resx + *src_pos1 * res_x) >> 8;
+ FX_BYTE r_pos_1 = (*src_pos2 * i_resx + *src_pos3 * res_x) >> 8;
+ return (r_pos_0 * (255 - res_y) + r_pos_1 * res_y) >> 8;
+}
+FX_BYTE _bicubic_interpol(FX_LPCBYTE buf, int pitch, int pos_pixel[], int u_w[], int v_w[], int res_x, int res_y,
+ int bpp, int c_offset)
+{
+ int s_result = 0;
+ for (int i = 0; i < 4; i ++) {
+ int a_result = 0;
+ for (int j = 0; j < 4; j ++) {
+ a_result += u_w[j] * (*(FX_BYTE*)(buf + pos_pixel[i + 4] * pitch + pos_pixel[j] * bpp + c_offset));
+ }
+ s_result += a_result * v_w[i];
+ }
+ s_result >>= 16;
+ return (FX_BYTE)(s_result < 0 ? 0 : s_result > 255 ? 255 : s_result);
+}
+void _bicubic_get_pos_weight(int pos_pixel[], int u_w[], int v_w[], int src_col_l, int src_row_l,
+ int res_x, int res_y, int stretch_width, int stretch_height)
+{
+ pos_pixel[0] = src_col_l - 1;
+ pos_pixel[1] = src_col_l;
+ pos_pixel[2] = src_col_l + 1;
+ pos_pixel[3] = src_col_l + 2;
+ pos_pixel[4] = src_row_l - 1;
+ pos_pixel[5] = src_row_l;
+ pos_pixel[6] = src_row_l + 1;
+ pos_pixel[7] = src_row_l + 2;
+ for (int i = 0 ; i < 4; i ++) {
+ if (pos_pixel[i] < 0) {
+ pos_pixel[i] = 0;
+ }
+ if (pos_pixel[i] >= stretch_width) {
+ pos_pixel[i] = stretch_width - 1;
+ }
+ if (pos_pixel[i + 4] < 0) {
+ pos_pixel[i + 4] = 0;
+ }
+ if (pos_pixel[i + 4] >= stretch_height) {
+ pos_pixel[i + 4] = stretch_height - 1;
+ }
+ }
+ u_w[0] = SDP_Table[256 + res_x];
+ u_w[1] = SDP_Table[res_x];
+ u_w[2] = SDP_Table[256 - res_x];
+ u_w[3] = SDP_Table[512 - res_x];
+ v_w[0] = SDP_Table[256 + res_y];
+ v_w[1] = SDP_Table[res_y];
+ v_w[2] = SDP_Table[256 - res_y];
+ v_w[3] = SDP_Table[512 - res_y];
+}
+FXDIB_Format _GetTransformedFormat(const CFX_DIBSource* pDrc)
+{
+ FXDIB_Format format = pDrc->GetFormat();
+ if (pDrc->IsAlphaMask()) {
+ format = FXDIB_8bppMask;
+ } else if (format >= 1025) {
+ format = FXDIB_Cmyka;
+ } else if (format <= 32 || format == FXDIB_Argb) {
+ format = FXDIB_Argb;
+ } else {
+ format = FXDIB_Rgba;
+ }
+ return format;
+}
+FX_BOOL CFX_ImageTransformer::Continue(IFX_Pause* pPause)
+{
+ if (m_Status == 1) {
+ if (m_Stretcher.Continue(pPause)) {
+ return TRUE;
+ }
+ if (m_Storer.GetBitmap()) {
+ m_Storer.Replace(m_Storer.GetBitmap()->SwapXY(m_pMatrix->c > 0, m_pMatrix->b < 0));
+ }
+ return FALSE;
+ } else if (m_Status == 2) {
+ return m_Stretcher.Continue(pPause);
+ } else if (m_Status != 3) {
+ return FALSE;
+ }
+ if (m_Stretcher.Continue(pPause)) {
+ return TRUE;
+ }
+ int stretch_width = m_StretchClip.Width();
+ int stretch_height = m_StretchClip.Height();
+ if (m_Storer.GetBitmap() == NULL) {
+ return FALSE;
+ }
+ FX_LPCBYTE stretch_buf = m_Storer.GetBitmap()->GetBuffer();
+ FX_LPCBYTE stretch_buf_mask = NULL;
+ if (m_Storer.GetBitmap()->m_pAlphaMask) {
+ stretch_buf_mask = m_Storer.GetBitmap()->m_pAlphaMask->GetBuffer();
+ }
+ int stretch_pitch = m_Storer.GetBitmap()->GetPitch();
+ CFX_DIBitmap* pTransformed = FX_NEW CFX_DIBitmap;
+ if (!pTransformed) {
+ return FALSE;
+ }
+ FXDIB_Format transformF = _GetTransformedFormat(m_Stretcher.m_pSource);
+ if (!pTransformed->Create(m_ResultWidth, m_ResultHeight, transformF)) {
+ delete pTransformed;
+ return FALSE;
+ }
+ pTransformed->Clear(0);
+ if (pTransformed->m_pAlphaMask) {
+ pTransformed->m_pAlphaMask->Clear(0);
+ }
+ CFX_AffineMatrix result2stretch(1.0f, 0.0f, 0.0f, 1.0f, (FX_FLOAT)(m_ResultLeft), (FX_FLOAT)(m_ResultTop));
+ result2stretch.Concat(m_dest2stretch);
+ result2stretch.TranslateI(-m_StretchClip.left, -m_StretchClip.top);
+ if (stretch_buf_mask == NULL && pTransformed->m_pAlphaMask) {
+ pTransformed->m_pAlphaMask->Clear(0xff000000);
+ } else if (pTransformed->m_pAlphaMask) {
+ int stretch_pitch_mask = m_Storer.GetBitmap()->m_pAlphaMask->GetPitch();
+ if (!(m_Flags & FXDIB_DOWNSAMPLE) && !(m_Flags & FXDIB_BICUBIC_INTERPOL)) {
+ CFX_BilinearMatrix result2stretch_fix(result2stretch, 8);
+ for (int row = 0; row < m_ResultHeight; row ++) {
+ FX_BYTE* dest_pos_mask = (FX_BYTE*)pTransformed->m_pAlphaMask->GetScanline(row);
+ for (int col = 0; col < m_ResultWidth; col ++) {
+ int src_col_l, src_row_l, res_x, res_y;
+ result2stretch_fix.Transform(col, row, src_col_l, src_row_l, res_x, res_y);
+ if (src_col_l >= 0 && src_col_l <= stretch_width && src_row_l >= 0 && src_row_l <= stretch_height) {
+ if (src_col_l == stretch_width) {
+ src_col_l--;
+ }
+ if (src_row_l == stretch_height) {
+ src_row_l--;
+ }
+ int src_col_r = src_col_l + 1;
+ int src_row_r = src_row_l + 1;
+ if (src_col_r == stretch_width) {
+ src_col_r--;
+ }
+ if (src_row_r == stretch_height) {
+ src_row_r--;
+ }
+ int row_offset_l = src_row_l * stretch_pitch_mask;
+ int row_offset_r = src_row_r * stretch_pitch_mask;
+ *dest_pos_mask = _bilinear_interpol(stretch_buf_mask, row_offset_l, row_offset_r, src_col_l, src_col_r, res_x, res_y, 1, 0);
+ }
+ dest_pos_mask++;
+ }
+ }
+ } else if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
+ CFX_BilinearMatrix result2stretch_fix(result2stretch, 8);
+ int pos_pixel[8];
+ for (int row = 0; row < m_ResultHeight; row ++) {
+ FX_BYTE* dest_pos_mask = (FX_BYTE*)pTransformed->m_pAlphaMask->GetScanline(row);
+ for (int col = 0; col < m_ResultWidth; col ++) {
+ int src_col_l, src_row_l, res_x, res_y;
+ result2stretch_fix.Transform(col, row, src_col_l, src_row_l, res_x, res_y);
+ if (src_col_l >= 0 && src_col_l <= stretch_width && src_row_l >= 0 && src_row_l <= stretch_height) {
+ int u_w[4], v_w[4];
+ if (src_col_l == stretch_width) {
+ src_col_l--;
+ }
+ if (src_row_l == stretch_height) {
+ src_row_l--;
+ }
+ _bicubic_get_pos_weight(pos_pixel, u_w, v_w, src_col_l, src_row_l, res_x, res_y, stretch_width, stretch_height);
+ *dest_pos_mask = _bicubic_interpol(stretch_buf_mask, stretch_pitch_mask, pos_pixel, u_w, v_w, res_x, res_y, 1, 0);
+ }
+ dest_pos_mask++;
+ }
+ }
+ } else {
+ CPDF_FixedMatrix result2stretch_fix(result2stretch, 8);
+ for (int row = 0; row < m_ResultHeight; row ++) {
+ FX_BYTE* dest_pos_mask = (FX_BYTE*)pTransformed->m_pAlphaMask->GetScanline(row);
+ for (int col = 0; col < m_ResultWidth; col ++) {
+ int src_col, src_row;
+ result2stretch_fix.Transform(col, row, src_col, src_row);
+ if (src_col >= 0 && src_col <= stretch_width && src_row >= 0 && src_row <= stretch_height) {
+ if (src_col == stretch_width) {
+ src_col --;
+ }
+ if (src_row == stretch_height) {
+ src_row --;
+ }
+ *dest_pos_mask = stretch_buf_mask[src_row * stretch_pitch_mask + src_col];
+ }
+ dest_pos_mask++;
+ }
+ }
+ }
+ }
+ if (m_Storer.GetBitmap()->IsAlphaMask()) {
+ if (!(m_Flags & FXDIB_DOWNSAMPLE) && !(m_Flags & FXDIB_BICUBIC_INTERPOL)) {
+ CFX_BilinearMatrix result2stretch_fix(result2stretch, 8);
+ for (int row = 0; row < m_ResultHeight; row ++) {
+ FX_LPBYTE dest_scan = (FX_LPBYTE)pTransformed->GetScanline(row);
+ for (int col = 0; col < m_ResultWidth; col ++) {
+ int src_col_l, src_row_l, res_x, res_y;
+ result2stretch_fix.Transform(col, row, src_col_l, src_row_l, res_x, res_y);
+ if (src_col_l >= 0 && src_col_l <= stretch_width && src_row_l >= 0 && src_row_l <= stretch_height) {
+ if (src_col_l == stretch_width) {
+ src_col_l--;
+ }
+ if (src_row_l == stretch_height) {
+ src_row_l--;
+ }
+ int src_col_r = src_col_l + 1;
+ int src_row_r = src_row_l + 1;
+ if (src_col_r == stretch_width) {
+ src_col_r--;
+ }
+ if (src_row_r == stretch_height) {
+ src_row_r--;
+ }
+ int row_offset_l = src_row_l * stretch_pitch;
+ int row_offset_r = src_row_r * stretch_pitch;
+ *dest_scan = _bilinear_interpol(stretch_buf, row_offset_l, row_offset_r, src_col_l, src_col_r, res_x, res_y, 1, 0);
+ }
+ dest_scan ++;
+ }
+ }
+ } else if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
+ CFX_BilinearMatrix result2stretch_fix(result2stretch, 8);
+ int pos_pixel[8];
+ for (int row = 0; row < m_ResultHeight; row ++) {
+ FX_LPBYTE dest_scan = (FX_LPBYTE)pTransformed->GetScanline(row);
+ for (int col = 0; col < m_ResultWidth; col ++) {
+ int src_col_l, src_row_l, res_x, res_y;
+ result2stretch_fix.Transform(col, row, src_col_l, src_row_l, res_x, res_y);
+ if (src_col_l >= 0 && src_col_l <= stretch_width && src_row_l >= 0 && src_row_l <= stretch_height) {
+ int u_w[4], v_w[4];
+ if (src_col_l == stretch_width) {
+ src_col_l--;
+ }
+ if (src_row_l == stretch_height) {
+ src_row_l--;
+ }
+ _bicubic_get_pos_weight(pos_pixel, u_w, v_w, src_col_l, src_row_l, res_x, res_y, stretch_width, stretch_height);
+ *dest_scan = _bicubic_interpol(stretch_buf, stretch_pitch, pos_pixel, u_w, v_w, res_x, res_y, 1, 0);
+ }
+ dest_scan ++;
+ }
+ }
+ } else {
+ CPDF_FixedMatrix result2stretch_fix(result2stretch, 8);
+ for (int row = 0; row < m_ResultHeight; row ++) {
+ FX_LPBYTE dest_scan = (FX_LPBYTE)pTransformed->GetScanline(row);
+ for (int col = 0; col < m_ResultWidth; col ++) {
+ int src_col, src_row;
+ result2stretch_fix.Transform(col, row, src_col, src_row);
+ if (src_col >= 0 && src_col <= stretch_width && src_row >= 0 && src_row <= stretch_height) {
+ if (src_col == stretch_width) {
+ src_col --;
+ }
+ if (src_row == stretch_height) {
+ src_row --;
+ }
+ FX_LPCBYTE src_pixel = stretch_buf + stretch_pitch * src_row + src_col;
+ *dest_scan = *src_pixel;
+ }
+ dest_scan ++;
+ }
+ }
+ }
+ } else {
+ int Bpp = m_Storer.GetBitmap()->GetBPP() / 8;
+ int destBpp = pTransformed->GetBPP() / 8;
+ if (Bpp == 1) {
+ FX_BOOL bHasAlpha = m_Storer.GetBitmap()->HasAlpha();
+ FX_DWORD argb[256];
+ FX_ARGB* pPal = m_Storer.GetBitmap()->GetPalette();
+ if (pPal) {
+ for (int i = 0; i < 256; i ++) {
+ argb[i] = pPal[i];
+ }
+ } else {
+ if (m_Storer.GetBitmap()->IsCmykImage())
+ for (int i = 0; i < 256; i ++) {
+ argb[i] = 255 - i;
+ }
+ else
+ for (int i = 0; i < 256; i ++) {
+ argb[i] = 0xff000000 | (i * 0x010101);
+ }
+ }
+ if (!(m_Flags & FXDIB_DOWNSAMPLE) && !(m_Flags & FXDIB_BICUBIC_INTERPOL)) {
+ CFX_BilinearMatrix result2stretch_fix(result2stretch, 8);
+ for (int row = 0; row < m_ResultHeight; row ++) {
+ FX_BYTE* dest_pos = (FX_BYTE*)pTransformed->GetScanline(row);
+ for (int col = 0; col < m_ResultWidth; col ++) {
+ int src_col_l, src_row_l, res_x, res_y;
+ result2stretch_fix.Transform(col, row, src_col_l, src_row_l, res_x, res_y);
+ if (src_col_l >= 0 && src_col_l <= stretch_width && src_row_l >= 0 && src_row_l <= stretch_height) {
+ if (src_col_l == stretch_width) {
+ src_col_l--;
+ }
+ if (src_row_l == stretch_height) {
+ src_row_l--;
+ }
+ int src_col_r = src_col_l + 1;
+ int src_row_r = src_row_l + 1;
+ if (src_col_r == stretch_width) {
+ src_col_r--;
+ }
+ if (src_row_r == stretch_height) {
+ src_row_r--;
+ }
+ int row_offset_l = src_row_l * stretch_pitch;
+ int row_offset_r = src_row_r * stretch_pitch;
+ FX_DWORD r_bgra_cmyk = argb[_bilinear_interpol(stretch_buf, row_offset_l, row_offset_r, src_col_l, src_col_r, res_x, res_y, 1, 0)];
+ if (transformF == FXDIB_Rgba) {
+ dest_pos[0] = (FX_BYTE)(r_bgra_cmyk >> 24);
+ dest_pos[1] = (FX_BYTE)(r_bgra_cmyk >> 16);
+ dest_pos[2] = (FX_BYTE)(r_bgra_cmyk >> 8);
+ } else {
+ *(FX_DWORD*)dest_pos = r_bgra_cmyk;
+ }
+ }
+ dest_pos += destBpp;
+ }
+ }
+ } else if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
+ CFX_BilinearMatrix result2stretch_fix(result2stretch, 8);
+ int pos_pixel[8];
+ for (int row = 0; row < m_ResultHeight; row ++) {
+ FX_BYTE* dest_pos = (FX_BYTE*)pTransformed->GetScanline(row);
+ for (int col = 0; col < m_ResultWidth; col ++) {
+ int src_col_l, src_row_l, res_x, res_y;
+ result2stretch_fix.Transform(col, row, src_col_l, src_row_l, res_x, res_y);
+ if (src_col_l >= 0 && src_col_l <= stretch_width && src_row_l >= 0 && src_row_l <= stretch_height) {
+ int u_w[4], v_w[4];
+ if (src_col_l == stretch_width) {
+ src_col_l--;
+ }
+ if (src_row_l == stretch_height) {
+ src_row_l--;
+ }
+ _bicubic_get_pos_weight(pos_pixel, u_w, v_w, src_col_l, src_row_l, res_x, res_y, stretch_width, stretch_height);
+ FX_DWORD r_bgra_cmyk = argb[_bicubic_interpol(stretch_buf, stretch_pitch, pos_pixel, u_w, v_w, res_x, res_y, 1, 0)];
+ if (transformF == FXDIB_Rgba) {
+ dest_pos[0] = (FX_BYTE)(r_bgra_cmyk >> 24);
+ dest_pos[1] = (FX_BYTE)(r_bgra_cmyk >> 16);
+ dest_pos[2] = (FX_BYTE)(r_bgra_cmyk >> 8);
+ } else {
+ *(FX_DWORD*)dest_pos = r_bgra_cmyk;
+ }
+ }
+ dest_pos += destBpp;
+ }
+ }
+ } else {
+ CPDF_FixedMatrix result2stretch_fix(result2stretch, 8);
+ for (int row = 0; row < m_ResultHeight; row ++) {
+ FX_BYTE* dest_pos = (FX_BYTE*)pTransformed->GetScanline(row);
+ for (int col = 0; col < m_ResultWidth; col ++) {
+ int src_col, src_row;
+ result2stretch_fix.Transform(col, row, src_col, src_row);
+ if (src_col >= 0 && src_col <= stretch_width && src_row >= 0 && src_row <= stretch_height) {
+ if (src_col == stretch_width) {
+ src_col --;
+ }
+ if (src_row == stretch_height) {
+ src_row --;
+ }
+ FX_DWORD r_bgra_cmyk = argb[stretch_buf[src_row * stretch_pitch + src_col]];
+ if (transformF == FXDIB_Rgba) {
+ dest_pos[0] = (FX_BYTE)(r_bgra_cmyk >> 24);
+ dest_pos[1] = (FX_BYTE)(r_bgra_cmyk >> 16);
+ dest_pos[2] = (FX_BYTE)(r_bgra_cmyk >> 8);
+ } else {
+ *(FX_DWORD*)dest_pos = r_bgra_cmyk;
+ }
+ }
+ dest_pos += destBpp;
+ }
+ }
+ }
+ } else {
+ FX_BOOL bHasAlpha = m_Storer.GetBitmap()->HasAlpha();
+ int destBpp = pTransformed->GetBPP() / 8;
+ if (!(m_Flags & FXDIB_DOWNSAMPLE) && !(m_Flags & FXDIB_BICUBIC_INTERPOL)) {
+ CFX_BilinearMatrix result2stretch_fix(result2stretch, 8);
+ for (int row = 0; row < m_ResultHeight; row ++) {
+ FX_BYTE* dest_pos = (FX_BYTE*)pTransformed->GetScanline(row);
+ for (int col = 0; col < m_ResultWidth; col ++) {
+ int src_col_l, src_row_l, res_x, res_y, r_pos_k_r = 0;
+ result2stretch_fix.Transform(col, row, src_col_l, src_row_l, res_x, res_y);
+ if (src_col_l >= 0 && src_col_l <= stretch_width && src_row_l >= 0 && src_row_l <= stretch_height) {
+ if (src_col_l == stretch_width) {
+ src_col_l--;
+ }
+ if (src_row_l == stretch_height) {
+ src_row_l--;
+ }
+ int src_col_r = src_col_l + 1;
+ int src_row_r = src_row_l + 1;
+ if (src_col_r == stretch_width) {
+ src_col_r--;
+ }
+ if (src_row_r == stretch_height) {
+ src_row_r--;
+ }
+ int row_offset_l = src_row_l * stretch_pitch;
+ int row_offset_r = src_row_r * stretch_pitch;
+ FX_BYTE r_pos_red_y_r = _bilinear_interpol(stretch_buf, row_offset_l, row_offset_r, src_col_l, src_col_r, res_x, res_y, Bpp, 2);
+ FX_BYTE r_pos_green_m_r = _bilinear_interpol(stretch_buf, row_offset_l, row_offset_r, src_col_l, src_col_r, res_x, res_y, Bpp, 1);
+ FX_BYTE r_pos_blue_c_r = _bilinear_interpol(stretch_buf, row_offset_l, row_offset_r, src_col_l, src_col_r, res_x, res_y, Bpp, 0);
+ if (bHasAlpha) {
+ if (transformF != FXDIB_Argb) {
+ if (transformF == FXDIB_Rgba) {
+ dest_pos[0] = r_pos_blue_c_r;
+ dest_pos[1] = r_pos_green_m_r;
+ dest_pos[2] = r_pos_red_y_r;
+ } else {
+ r_pos_k_r = _bilinear_interpol(stretch_buf, row_offset_l, row_offset_r, src_col_l, src_col_r, res_x, res_y, Bpp, 3);
+ *(FX_DWORD*)dest_pos = FXCMYK_TODIB(CmykEncode(r_pos_blue_c_r, r_pos_green_m_r, r_pos_red_y_r, r_pos_k_r));
+ }
+ } else {
+ FX_BYTE r_pos_a_r = _bilinear_interpol(stretch_buf, row_offset_l, row_offset_r, src_col_l, src_col_r, res_x, res_y, Bpp, 3);
+ *(FX_DWORD*)dest_pos = FXARGB_TODIB(FXARGB_MAKE(r_pos_a_r, r_pos_red_y_r, r_pos_green_m_r, r_pos_blue_c_r));
+ }
+ } else {
+ r_pos_k_r = 0xff;
+ if (transformF == FXDIB_Cmyka) {
+ r_pos_k_r = _bilinear_interpol(stretch_buf, row_offset_l, row_offset_r, src_col_l, src_col_r, res_x, res_y, Bpp, 3);
+ *(FX_DWORD*)dest_pos = FXCMYK_TODIB(CmykEncode(r_pos_blue_c_r, r_pos_green_m_r, r_pos_red_y_r, r_pos_k_r));
+ } else {
+ *(FX_DWORD*)dest_pos = FXARGB_TODIB(FXARGB_MAKE(r_pos_k_r, r_pos_red_y_r, r_pos_green_m_r, r_pos_blue_c_r));
+ }
+ }
+ }
+ dest_pos += destBpp;
+ }
+ }
+ } else if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
+ CFX_BilinearMatrix result2stretch_fix(result2stretch, 8);
+ int pos_pixel[8];
+ for (int row = 0; row < m_ResultHeight; row ++) {
+ FX_BYTE* dest_pos = (FX_BYTE*)pTransformed->GetScanline(row);
+ for (int col = 0; col < m_ResultWidth; col ++) {
+ int src_col_l, src_row_l, res_x, res_y, r_pos_k_r = 0;
+ result2stretch_fix.Transform(col, row, src_col_l, src_row_l, res_x, res_y);
+ if (src_col_l >= 0 && src_col_l <= stretch_width && src_row_l >= 0 && src_row_l <= stretch_height) {
+ int u_w[4], v_w[4];
+ if (src_col_l == stretch_width) {
+ src_col_l--;
+ }
+ if (src_row_l == stretch_height) {
+ src_row_l--;
+ }
+ _bicubic_get_pos_weight(pos_pixel, u_w, v_w, src_col_l, src_row_l, res_x, res_y, stretch_width, stretch_height);
+ FX_BYTE r_pos_red_y_r = _bicubic_interpol(stretch_buf, stretch_pitch, pos_pixel, u_w, v_w, res_x, res_y, Bpp, 2);
+ FX_BYTE r_pos_green_m_r = _bicubic_interpol(stretch_buf, stretch_pitch, pos_pixel, u_w, v_w, res_x, res_y, Bpp, 1);
+ FX_BYTE r_pos_blue_c_r = _bicubic_interpol(stretch_buf, stretch_pitch, pos_pixel, u_w, v_w, res_x, res_y, Bpp, 0);
+ if (bHasAlpha) {
+ if (transformF != FXDIB_Argb) {
+ if (transformF == FXDIB_Rgba) {
+ dest_pos[0] = r_pos_blue_c_r;
+ dest_pos[1] = r_pos_green_m_r;
+ dest_pos[2] = r_pos_red_y_r;
+ } else {
+ r_pos_k_r = _bicubic_interpol(stretch_buf, stretch_pitch, pos_pixel, u_w, v_w, res_x, res_y, Bpp, 3);
+ *(FX_DWORD*)dest_pos = FXCMYK_TODIB(CmykEncode(r_pos_blue_c_r, r_pos_green_m_r, r_pos_red_y_r, r_pos_k_r));
+ }
+ } else {
+ FX_BYTE r_pos_a_r = _bicubic_interpol(stretch_buf, stretch_pitch, pos_pixel, u_w, v_w, res_x, res_y, Bpp, 3);
+ *(FX_DWORD*)dest_pos = FXARGB_TODIB(FXARGB_MAKE(r_pos_a_r, r_pos_red_y_r, r_pos_green_m_r, r_pos_blue_c_r));
+ }
+ } else {
+ r_pos_k_r = 0xff;
+ if (transformF == FXDIB_Cmyka) {
+ r_pos_k_r = _bicubic_interpol(stretch_buf, stretch_pitch, pos_pixel, u_w, v_w, res_x, res_y, Bpp, 3);
+ *(FX_DWORD*)dest_pos = FXCMYK_TODIB(CmykEncode(r_pos_blue_c_r, r_pos_green_m_r, r_pos_red_y_r, r_pos_k_r));
+ } else {
+ *(FX_DWORD*)dest_pos = FXARGB_TODIB(FXARGB_MAKE(r_pos_k_r, r_pos_red_y_r, r_pos_green_m_r, r_pos_blue_c_r));
+ }
+ }
+ }
+ dest_pos += destBpp;
+ }
+ }
+ } else {
+ CPDF_FixedMatrix result2stretch_fix(result2stretch, 8);
+ for (int row = 0; row < m_ResultHeight; row ++) {
+ FX_BYTE* dest_pos = (FX_BYTE*)pTransformed->GetScanline(row);
+ for (int col = 0; col < m_ResultWidth; col ++) {
+ int src_col, src_row;
+ result2stretch_fix.Transform(col, row, src_col, src_row);
+ if (src_col >= 0 && src_col <= stretch_width && src_row >= 0 && src_row <= stretch_height) {
+ if (src_col == stretch_width) {
+ src_col --;
+ }
+ if (src_row == stretch_height) {
+ src_row --;
+ }
+ FX_LPCBYTE src_pos = stretch_buf + src_row * stretch_pitch + src_col * Bpp;
+ if (bHasAlpha) {
+ if (transformF != FXDIB_Argb) {
+ if (transformF == FXDIB_Rgba) {
+ dest_pos[0] = src_pos[0];
+ dest_pos[1] = src_pos[1];
+ dest_pos[2] = src_pos[2];
+ } else {
+ *(FX_DWORD*)dest_pos = FXCMYK_TODIB(CmykEncode(src_pos[0], src_pos[1], src_pos[2], src_pos[3]));
+ }
+ } else {
+ *(FX_DWORD*)dest_pos = FXARGB_TODIB(FXARGB_MAKE(src_pos[3], src_pos[2], src_pos[1], src_pos[0]));
+ }
+ } else {
+ if (transformF == FXDIB_Cmyka) {
+ *(FX_DWORD*)dest_pos = FXCMYK_TODIB(CmykEncode(src_pos[0], src_pos[1], src_pos[2], src_pos[3]));
+ } else {
+ *(FX_DWORD*)dest_pos = FXARGB_TODIB(FXARGB_MAKE(0xff, src_pos[2], src_pos[1], src_pos[0]));
+ }
+ }
+ }
+ dest_pos += destBpp;
+ }
+ }
+ }
+ }
+ }
+ m_Storer.Replace(pTransformed);
+ return FALSE;
+}
diff --git a/core/src/fxge/ge/fx_ge.cpp b/core/src/fxge/ge/fx_ge.cpp
index df200d5b48..d044d721e6 100644
--- a/core/src/fxge/ge/fx_ge.cpp
+++ b/core/src/fxge/ge/fx_ge.cpp
@@ -1,79 +1,79 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../../include/fxge/fx_ge.h"
-#include "text_int.h"
-static CFX_GEModule* g_pGEModule = NULL;
-CFX_GEModule::CFX_GEModule()
-{
- m_pFontCache = NULL;
- m_pFontMgr = NULL;
- m_FTLibrary = NULL;
- m_pCodecModule = NULL;
- m_pPlatformData = NULL;
-}
-CFX_GEModule::~CFX_GEModule()
-{
- if (m_pFontCache) {
- delete m_pFontCache;
- }
- m_pFontCache = NULL;
- if (m_pFontMgr) {
- delete m_pFontMgr;
- }
- m_pFontMgr = NULL;
- DestroyPlatform();
-}
-CFX_GEModule* CFX_GEModule::Get()
-{
- return g_pGEModule;
-}
-void CFX_GEModule::Create()
-{
- g_pGEModule = FX_NEW CFX_GEModule;
- if (!g_pGEModule) {
- return;
- }
- g_pGEModule->m_pFontMgr = FX_NEW CFX_FontMgr;
- g_pGEModule->InitPlatform();
- g_pGEModule->SetTextGamma(2.2f);
-}
-void CFX_GEModule::Use(CFX_GEModule* pModule)
-{
- g_pGEModule = pModule;
-}
-void CFX_GEModule::Destroy()
-{
- if (g_pGEModule) {
- delete g_pGEModule;
- }
- g_pGEModule = NULL;
-}
-CFX_FontCache* CFX_GEModule::GetFontCache()
-{
- if (m_pFontCache == NULL) {
- m_pFontCache = FX_NEW CFX_FontCache();
- }
- return m_pFontCache;
-}
-void CFX_GEModule::SetTextGamma(FX_FLOAT gammaValue)
-{
- gammaValue /= 2.2f;
- int i = 0;
- while (i < 256) {
- m_GammaValue[i] = (FX_BYTE)(FXSYS_pow((FX_FLOAT)i / 255, gammaValue) * 255.0f + 0.5f);
- i++;
- }
-}
-FX_LPCBYTE CFX_GEModule::GetTextGammaTable()
-{
- return m_GammaValue;
-}
-void CFX_GEModule::SetExtFontMapper(IFX_FontMapper* pFontMapper)
-{
- GetFontMgr()->m_pExtMapper = pFontMapper;
- pFontMapper->m_pFontMgr = m_pFontMgr;
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxge/fx_ge.h"
+#include "text_int.h"
+static CFX_GEModule* g_pGEModule = NULL;
+CFX_GEModule::CFX_GEModule()
+{
+ m_pFontCache = NULL;
+ m_pFontMgr = NULL;
+ m_FTLibrary = NULL;
+ m_pCodecModule = NULL;
+ m_pPlatformData = NULL;
+}
+CFX_GEModule::~CFX_GEModule()
+{
+ if (m_pFontCache) {
+ delete m_pFontCache;
+ }
+ m_pFontCache = NULL;
+ if (m_pFontMgr) {
+ delete m_pFontMgr;
+ }
+ m_pFontMgr = NULL;
+ DestroyPlatform();
+}
+CFX_GEModule* CFX_GEModule::Get()
+{
+ return g_pGEModule;
+}
+void CFX_GEModule::Create()
+{
+ g_pGEModule = FX_NEW CFX_GEModule;
+ if (!g_pGEModule) {
+ return;
+ }
+ g_pGEModule->m_pFontMgr = FX_NEW CFX_FontMgr;
+ g_pGEModule->InitPlatform();
+ g_pGEModule->SetTextGamma(2.2f);
+}
+void CFX_GEModule::Use(CFX_GEModule* pModule)
+{
+ g_pGEModule = pModule;
+}
+void CFX_GEModule::Destroy()
+{
+ if (g_pGEModule) {
+ delete g_pGEModule;
+ }
+ g_pGEModule = NULL;
+}
+CFX_FontCache* CFX_GEModule::GetFontCache()
+{
+ if (m_pFontCache == NULL) {
+ m_pFontCache = FX_NEW CFX_FontCache();
+ }
+ return m_pFontCache;
+}
+void CFX_GEModule::SetTextGamma(FX_FLOAT gammaValue)
+{
+ gammaValue /= 2.2f;
+ int i = 0;
+ while (i < 256) {
+ m_GammaValue[i] = (FX_BYTE)(FXSYS_pow((FX_FLOAT)i / 255, gammaValue) * 255.0f + 0.5f);
+ i++;
+ }
+}
+FX_LPCBYTE CFX_GEModule::GetTextGammaTable()
+{
+ return m_GammaValue;
+}
+void CFX_GEModule::SetExtFontMapper(IFX_FontMapper* pFontMapper)
+{
+ GetFontMgr()->m_pExtMapper = pFontMapper;
+ pFontMapper->m_pFontMgr = m_pFontMgr;
+}
diff --git a/core/src/fxge/ge/fx_ge_device.cpp b/core/src/fxge/ge/fx_ge_device.cpp
index 8f7ccdb7d9..9c268b5606 100644
--- a/core/src/fxge/ge/fx_ge_device.cpp
+++ b/core/src/fxge/ge/fx_ge_device.cpp
@@ -1,405 +1,405 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../../include/fxge/fx_ge.h"
-CFX_RenderDevice::CFX_RenderDevice()
-{
- m_pDeviceDriver = NULL;
- m_pBitmap = NULL;
-}
-CFX_RenderDevice::~CFX_RenderDevice()
-{
- if (m_pDeviceDriver) {
- delete m_pDeviceDriver;
- }
-}
-void CFX_RenderDevice::SetDeviceDriver(IFX_RenderDeviceDriver* pDriver)
-{
- if (m_pDeviceDriver) {
- delete m_pDeviceDriver;
- }
- m_pDeviceDriver = pDriver;
- InitDeviceInfo();
-}
-void CFX_RenderDevice::InitDeviceInfo()
-{
- ASSERT(m_pDeviceDriver != NULL);
- m_Width = m_pDeviceDriver->GetDeviceCaps(FXDC_PIXEL_WIDTH);
- m_Height = m_pDeviceDriver->GetDeviceCaps(FXDC_PIXEL_HEIGHT);
- m_bpp = m_pDeviceDriver->GetDeviceCaps(FXDC_BITS_PIXEL);
- m_RenderCaps = m_pDeviceDriver->GetDeviceCaps(FXDC_RENDER_CAPS);
- m_DeviceClass = m_pDeviceDriver->GetDeviceCaps(FXDC_DEVICE_CLASS);
- if (!m_pDeviceDriver->GetClipBox(&m_ClipBox)) {
- m_ClipBox.left = 0;
- m_ClipBox.top = 0;
- m_ClipBox.right = m_Width;
- m_ClipBox.bottom = m_Height;
- }
-}
-FX_BOOL CFX_RenderDevice::StartRendering()
-{
- return m_pDeviceDriver->StartRendering();
-}
-void CFX_RenderDevice::EndRendering()
-{
- m_pDeviceDriver->EndRendering();
-}
-void CFX_RenderDevice::SaveState()
-{
- m_pDeviceDriver->SaveState();
-}
-void CFX_RenderDevice::RestoreState(FX_BOOL bKeepSaved)
-{
- m_pDeviceDriver->RestoreState(bKeepSaved);
- UpdateClipBox();
-}
-int CFX_RenderDevice::GetDeviceCaps(int caps_id) const
-{
- return m_pDeviceDriver->GetDeviceCaps(caps_id);
-}
-CFX_Matrix CFX_RenderDevice::GetCTM() const
-{
- return m_pDeviceDriver->GetCTM();
-}
-FX_BOOL CFX_RenderDevice::CreateCompatibleBitmap(CFX_DIBitmap* pDIB, int width, int height) const
-{
- if (m_RenderCaps & FXRC_CMYK_OUTPUT) {
- return pDIB->Create(width, height, m_RenderCaps & FXRC_ALPHA_OUTPUT ? FXDIB_Cmyka : FXDIB_Cmyk);
- } else if (m_RenderCaps & FXRC_BYTEMASK_OUTPUT) {
- return pDIB->Create(width, height, FXDIB_8bppMask);
- } else
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
- return pDIB->Create(width, height, m_RenderCaps & FXRC_ALPHA_OUTPUT ? FXDIB_Argb : FXDIB_Rgb32);
-#else
- return pDIB->Create(width, height, m_RenderCaps & FXRC_ALPHA_OUTPUT ? FXDIB_Argb : FXDIB_Rgb);
-#endif
-}
-FX_BOOL CFX_RenderDevice::SetClip_PathFill(const CFX_PathData* pPathData,
- const CFX_AffineMatrix* pObject2Device,
- int fill_mode
- )
-{
- if (!m_pDeviceDriver->SetClip_PathFill(pPathData, pObject2Device, fill_mode)) {
- return FALSE;
- }
- UpdateClipBox();
- return TRUE;
-}
-FX_BOOL CFX_RenderDevice::SetClip_PathStroke(const CFX_PathData* pPathData,
- const CFX_AffineMatrix* pObject2Device,
- const CFX_GraphStateData* pGraphState
- )
-{
- if (!m_pDeviceDriver->SetClip_PathStroke(pPathData, pObject2Device, pGraphState)) {
- return FALSE;
- }
- UpdateClipBox();
- return TRUE;
-}
-FX_BOOL CFX_RenderDevice::SetClip_Rect(const FX_RECT* pRect)
-{
- CFX_PathData path;
- path.AppendRect((FX_FLOAT)(pRect->left), (FX_FLOAT)(pRect->bottom), (FX_FLOAT)(pRect->right), (FX_FLOAT)(pRect->top));
- if (!SetClip_PathFill(&path, NULL, FXFILL_WINDING)) {
- return FALSE;
- }
- UpdateClipBox();
- return TRUE;
-}
-void CFX_RenderDevice::UpdateClipBox()
-{
- if (m_pDeviceDriver->GetClipBox(&m_ClipBox)) {
- return;
- }
- m_ClipBox.left = 0;
- m_ClipBox.top = 0;
- m_ClipBox.right = m_Width;
- m_ClipBox.bottom = m_Height;
-}
-FX_BOOL CFX_RenderDevice::DrawPath(const CFX_PathData* pPathData,
- const CFX_AffineMatrix* pObject2Device,
- const CFX_GraphStateData* pGraphState,
- FX_DWORD fill_color, FX_DWORD stroke_color, int fill_mode,
- int alpha_flag, void* pIccTransform, int blend_type)
-{
- FX_BYTE fill_alpha, stroke_alpha;
- if (FXGETFLAG_COLORTYPE(alpha_flag)) {
- fill_alpha = FXGETFLAG_ALPHA_FILL(alpha_flag);
- stroke_alpha = FXGETFLAG_ALPHA_STROKE(alpha_flag);
- } else {
- fill_alpha = FXARGB_A(fill_color);
- stroke_alpha = FXARGB_A(stroke_color);
- }
- if ((fill_mode & 3) == 0) {
- fill_alpha = 0;
- }
- if (pGraphState == NULL) {
- stroke_alpha = 0;
- }
- if (stroke_alpha == 0 && pPathData->GetPointCount() == 2) {
- FX_PATHPOINT* pPoints = pPathData->GetPoints();
- FX_FLOAT x1, x2, y1, y2;
- if (pObject2Device) {
- pObject2Device->Transform(pPoints[0].m_PointX, pPoints[0].m_PointY, x1, y1);
- pObject2Device->Transform(pPoints[1].m_PointX, pPoints[1].m_PointY, x2, y2);
- } else {
- x1 = pPoints[0].m_PointX;
- y1 = pPoints[0].m_PointY;
- x2 = pPoints[1].m_PointX;
- y2 = pPoints[1].m_PointY;
- }
- DrawCosmeticLine(x1, y1, x2, y2, fill_color, fill_mode, alpha_flag, pIccTransform, blend_type);
- return TRUE;
- }
- if ((pPathData->GetPointCount() == 5 || pPathData->GetPointCount() == 4) && stroke_alpha == 0) {
- CFX_FloatRect rect_f;
- if (!(fill_mode & FXFILL_RECT_AA) && pPathData->IsRect(pObject2Device, &rect_f)) {
- FX_RECT rect_i = rect_f.GetOutterRect();
- int width = (int)FXSYS_ceil(rect_f.right - rect_f.left);
- if (width < 1) {
- width = 1;
- if (rect_i.left == rect_i.right) {
- rect_i.right ++;
- }
- }
- int height = (int)FXSYS_ceil(rect_f.top - rect_f.bottom);
- if (height < 1) {
- height = 1;
- if (rect_i.bottom == rect_i.top) {
- rect_i.bottom ++;
- }
- }
- if (rect_i.Width() >= width + 1) {
- if (rect_f.left - (FX_FLOAT)(rect_i.left) > (FX_FLOAT)(rect_i.right) - rect_f.right) {
- rect_i.left ++;
- } else {
- rect_i.right --;
- }
- }
- if (rect_i.Height() >= height + 1) {
- if (rect_f.top - (FX_FLOAT)(rect_i.top) > (FX_FLOAT)(rect_i.bottom) - rect_f.bottom) {
- rect_i.top ++;
- } else {
- rect_i.bottom --;
- }
- }
- if (FillRect(&rect_i, fill_color, alpha_flag, pIccTransform, blend_type)) {
- return TRUE;
- }
- }
- }
- if((fill_mode & 3) && stroke_alpha == 0 && !(fill_mode & FX_FILL_STROKE) && !(fill_mode & FX_FILL_TEXT_MODE)) {
- CFX_PathData newPath;
- FX_BOOL bThin = FALSE;
- if (pPathData->GetZeroAreaPath(newPath, (CFX_Matrix*)pObject2Device, bThin, m_pDeviceDriver->GetDriverType())) {
- CFX_GraphStateData graphState;
- graphState.m_LineWidth = 0.0f;
- FX_DWORD strokecolor = fill_color;
- if (bThin) {
- if (FXGETFLAG_COLORTYPE(alpha_flag)) {
- FXSETFLAG_ALPHA_STROKE(alpha_flag, fill_alpha >> 2);
- } else {
- strokecolor = (((fill_alpha >> 2) << 24) | (strokecolor & 0x00ffffff));
- }
- }
- CFX_AffineMatrix* pMatrix = NULL;
- if (pObject2Device && !pObject2Device->IsIdentity()) {
- pMatrix = (CFX_AffineMatrix*)pObject2Device;
- }
- int smooth_path = FX_ZEROAREA_FILL;
- if (fill_mode & FXFILL_NOPATHSMOOTH) {
- smooth_path |= FXFILL_NOPATHSMOOTH;
- }
- m_pDeviceDriver->DrawPath(&newPath, pMatrix, &graphState, 0, strokecolor, smooth_path, alpha_flag, pIccTransform, blend_type);
- }
- }
- if ((fill_mode & 3) && fill_alpha && stroke_alpha < 0xff && (fill_mode & FX_FILL_STROKE)) {
- if (!(m_RenderCaps & FXRC_GET_BITS)) {
- return FALSE;
- }
- CFX_FloatRect bbox;
- if (pGraphState) {
- bbox = pPathData->GetBoundingBox(pGraphState->m_LineWidth, pGraphState->m_MiterLimit);
- } else {
- bbox = pPathData->GetBoundingBox();
- }
- if (pObject2Device) {
- bbox.Transform(pObject2Device);
- }
- CFX_Matrix ctm = GetCTM();
- FX_FLOAT fScaleX = FXSYS_fabs(ctm.a);
- FX_FLOAT fScaleY = FXSYS_fabs(ctm.d);
- FX_RECT rect = bbox.GetOutterRect();
- CFX_DIBitmap bitmap, Backdrop;
- if (!CreateCompatibleBitmap(&bitmap, FXSYS_round(rect.Width() * fScaleX), FXSYS_round(rect.Height() * fScaleY))) {
- return FALSE;
- }
- if (bitmap.HasAlpha()) {
- bitmap.Clear(0);
- Backdrop.Copy(&bitmap);
- } else {
- if (!m_pDeviceDriver->GetDIBits(&bitmap, rect.left, rect.top, NULL)) {
- return FALSE;
- }
- Backdrop.Copy(&bitmap);
- }
- CFX_FxgeDevice bitmap_device;
- bitmap_device.Attach(&bitmap, 0, FALSE, &Backdrop, TRUE);
- CFX_AffineMatrix matrix;
- if (pObject2Device) {
- matrix = *pObject2Device;
- }
- matrix.TranslateI(-rect.left, -rect.top);
- matrix.Concat(fScaleX, 0, 0, fScaleY, 0, 0);
- if (!bitmap_device.GetDeviceDriver()->DrawPath(pPathData, &matrix, pGraphState, fill_color, stroke_color, fill_mode, alpha_flag, pIccTransform, blend_type)) {
- return FALSE;
- }
- FX_RECT src_rect(0, 0, FXSYS_round(rect.Width() * fScaleX), FXSYS_round(rect.Height() * fScaleY));
- return m_pDeviceDriver->SetDIBits(&bitmap, 0, &src_rect, rect.left, rect.top, FXDIB_BLEND_NORMAL);
- }
- return m_pDeviceDriver->DrawPath(pPathData, pObject2Device, pGraphState, fill_color, stroke_color, fill_mode, alpha_flag, pIccTransform, blend_type);
-}
-FX_BOOL CFX_RenderDevice::SetPixel(int x, int y, FX_DWORD color, int alpha_flag, void* pIccTransform)
-{
- if (m_pDeviceDriver->SetPixel(x, y, color, alpha_flag, pIccTransform)) {
- return TRUE;
- }
- FX_RECT rect(x, y, x + 1, y + 1);
- return FillRect(&rect, color, alpha_flag, pIccTransform);
-}
-FX_BOOL CFX_RenderDevice::FillRect(const FX_RECT* pRect, FX_DWORD fill_color, int alpha_flag, void* pIccTransform, int blend_type)
-{
- if (m_pDeviceDriver->FillRect(pRect, fill_color, alpha_flag, pIccTransform, blend_type)) {
- return TRUE;
- }
- if (!(m_RenderCaps & FXRC_GET_BITS)) {
- return FALSE;
- }
- CFX_DIBitmap bitmap;
- if (!CreateCompatibleBitmap(&bitmap, pRect->Width(), pRect->Height())) {
- return FALSE;
- }
- if (!m_pDeviceDriver->GetDIBits(&bitmap, pRect->left, pRect->top)) {
- return FALSE;
- }
- if (!bitmap.CompositeRect(0, 0, pRect->Width(), pRect->Height(), fill_color, alpha_flag, pIccTransform)) {
- return FALSE;
- }
- FX_RECT src_rect(0, 0, pRect->Width(), pRect->Height());
- m_pDeviceDriver->SetDIBits(&bitmap, 0, &src_rect, pRect->left, pRect->top, FXDIB_BLEND_NORMAL);
- return TRUE;
-}
-FX_BOOL CFX_RenderDevice::DrawCosmeticLine(FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2, FX_DWORD color,
- int fill_mode, int alpha_flag, void* pIccTransform, int blend_type)
-{
- if (((m_RenderCaps & FXRC_ALPHA_PATH) &&
- (FXGETFLAG_COLORTYPE(alpha_flag) && FXGETFLAG_ALPHA_FILL(alpha_flag) == 0xff)) ||
- color >= 0xff000000)
- if (m_pDeviceDriver->DrawCosmeticLine(x1, y1, x2, y2, color, alpha_flag, pIccTransform, blend_type)) {
- return TRUE;
- }
- CFX_GraphStateData graph_state;
- CFX_PathData path;
- path.SetPointCount(2);
- path.SetPoint(0, x1, y1, FXPT_MOVETO);
- path.SetPoint(1, x2, y2, FXPT_LINETO);
- return m_pDeviceDriver->DrawPath(&path, NULL, &graph_state, 0, color, fill_mode, alpha_flag, pIccTransform, blend_type);
-}
-FX_BOOL CFX_RenderDevice::GetDIBits(CFX_DIBitmap* pBitmap, int left, int top, void* pIccTransform)
-{
- if (!(m_RenderCaps & FXRC_GET_BITS)) {
- return FALSE;
- }
- return m_pDeviceDriver->GetDIBits(pBitmap, left, top, pIccTransform);
-}
-CFX_DIBitmap* CFX_RenderDevice::GetBackDrop()
-{
- return m_pDeviceDriver->GetBackDrop();
-}
-FX_BOOL CFX_RenderDevice::SetDIBits(const CFX_DIBSource* pBitmap, int left, int top, int blend_mode,
- void* pIccTransform)
-{
- ASSERT(!pBitmap->IsAlphaMask());
- CFX_AffineMatrix ctm = GetCTM();
- FX_FLOAT fScaleX = FXSYS_fabs(ctm.a);
- FX_FLOAT fScaleY = FXSYS_fabs(ctm.d);
- FX_RECT dest_rect(left, top, FXSYS_round(left + pBitmap->GetWidth() / fScaleX), FXSYS_round(top + pBitmap->GetHeight() / fScaleY));
- dest_rect.Intersect(m_ClipBox);
- if (dest_rect.IsEmpty()) {
- return TRUE;
- }
- FX_RECT src_rect(dest_rect.left - left, dest_rect.top - top,
- dest_rect.left - left + dest_rect.Width(), dest_rect.top - top + dest_rect.Height());
- src_rect.left = FXSYS_round(src_rect.left * fScaleX);
- src_rect.top = FXSYS_round(src_rect.top * fScaleY);
- src_rect.right = FXSYS_round(src_rect.right * fScaleX);
- src_rect.bottom = FXSYS_round(src_rect.bottom * fScaleY);
- if ((blend_mode != FXDIB_BLEND_NORMAL && !(m_RenderCaps & FXRC_BLEND_MODE)) ||
- (pBitmap->HasAlpha() && !(m_RenderCaps & FXRC_ALPHA_IMAGE))) {
- if (!(m_RenderCaps & FXRC_GET_BITS)) {
- return FALSE;
- }
- int bg_pixel_width = FXSYS_round(dest_rect.Width() * fScaleX);
- int bg_pixel_height = FXSYS_round(dest_rect.Height() * fScaleY);
- CFX_DIBitmap background;
- if (!background.Create(bg_pixel_width, bg_pixel_height,
- (m_RenderCaps & FXRC_CMYK_OUTPUT) ? FXDIB_Cmyk : FXDIB_Rgb32)) {
- return FALSE;
- }
- if (!m_pDeviceDriver->GetDIBits(&background, dest_rect.left, dest_rect.top)) {
- return FALSE;
- }
- if (!background.CompositeBitmap(0, 0, bg_pixel_width, bg_pixel_height,
- pBitmap, src_rect.left, src_rect.top,
- blend_mode, NULL, FALSE, pIccTransform)) {
- return FALSE;
- }
- FX_RECT src_rect(0, 0, bg_pixel_width, bg_pixel_height);
- return m_pDeviceDriver->SetDIBits(&background, 0, &src_rect, dest_rect.left, dest_rect.top, FXDIB_BLEND_NORMAL);
- }
- return m_pDeviceDriver->SetDIBits(pBitmap, 0, &src_rect, dest_rect.left, dest_rect.top, blend_mode, 0, pIccTransform);
-}
-FX_BOOL CFX_RenderDevice::StretchDIBits(const CFX_DIBSource* pBitmap, int left, int top,
- int dest_width, int dest_height, FX_DWORD flags,
- void* pIccTransform, int blend_mode)
-{
- FX_RECT dest_rect(left, top, left + dest_width, top + dest_height);
- FX_RECT clip_box = m_ClipBox;
- clip_box.Intersect(dest_rect);
- if (clip_box.IsEmpty()) {
- return TRUE;
- }
- return m_pDeviceDriver->StretchDIBits(pBitmap, 0, left, top, dest_width, dest_height, &clip_box, flags, 0, pIccTransform, blend_mode);
-}
-FX_BOOL CFX_RenderDevice::SetBitMask(const CFX_DIBSource* pBitmap, int left, int top, FX_DWORD argb,
- int alpha_flag, void* pIccTransform)
-{
- FX_RECT src_rect(0, 0, pBitmap->GetWidth(), pBitmap->GetHeight());
- return m_pDeviceDriver->SetDIBits(pBitmap, argb, &src_rect, left, top, FXDIB_BLEND_NORMAL, alpha_flag, pIccTransform);
-}
-FX_BOOL CFX_RenderDevice::StretchBitMask(const CFX_DIBSource* pBitmap, int left, int top,
- int dest_width, int dest_height, FX_DWORD argb, FX_DWORD flags,
- int alpha_flag, void* pIccTransform)
-{
- FX_RECT dest_rect(left, top, left + dest_width, top + dest_height);
- FX_RECT clip_box = m_ClipBox;
- clip_box.Intersect(dest_rect);
- return m_pDeviceDriver->StretchDIBits(pBitmap, argb, left, top, dest_width, dest_height, &clip_box, flags, alpha_flag, pIccTransform);
-}
-FX_BOOL CFX_RenderDevice::StartDIBits(const CFX_DIBSource* pBitmap, int bitmap_alpha, FX_DWORD argb,
- const CFX_AffineMatrix* pMatrix, FX_DWORD flags, FX_LPVOID& handle,
- int alpha_flag, void* pIccTransform, int blend_mode)
-{
- return m_pDeviceDriver->StartDIBits(pBitmap, bitmap_alpha, argb, pMatrix, flags, handle, alpha_flag, pIccTransform, blend_mode);
-}
-FX_BOOL CFX_RenderDevice::ContinueDIBits(FX_LPVOID handle, IFX_Pause* pPause)
-{
- return m_pDeviceDriver->ContinueDIBits(handle, pPause);
-}
-void CFX_RenderDevice::CancelDIBits(FX_LPVOID handle)
-{
- m_pDeviceDriver->CancelDIBits(handle);
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxge/fx_ge.h"
+CFX_RenderDevice::CFX_RenderDevice()
+{
+ m_pDeviceDriver = NULL;
+ m_pBitmap = NULL;
+}
+CFX_RenderDevice::~CFX_RenderDevice()
+{
+ if (m_pDeviceDriver) {
+ delete m_pDeviceDriver;
+ }
+}
+void CFX_RenderDevice::SetDeviceDriver(IFX_RenderDeviceDriver* pDriver)
+{
+ if (m_pDeviceDriver) {
+ delete m_pDeviceDriver;
+ }
+ m_pDeviceDriver = pDriver;
+ InitDeviceInfo();
+}
+void CFX_RenderDevice::InitDeviceInfo()
+{
+ ASSERT(m_pDeviceDriver != NULL);
+ m_Width = m_pDeviceDriver->GetDeviceCaps(FXDC_PIXEL_WIDTH);
+ m_Height = m_pDeviceDriver->GetDeviceCaps(FXDC_PIXEL_HEIGHT);
+ m_bpp = m_pDeviceDriver->GetDeviceCaps(FXDC_BITS_PIXEL);
+ m_RenderCaps = m_pDeviceDriver->GetDeviceCaps(FXDC_RENDER_CAPS);
+ m_DeviceClass = m_pDeviceDriver->GetDeviceCaps(FXDC_DEVICE_CLASS);
+ if (!m_pDeviceDriver->GetClipBox(&m_ClipBox)) {
+ m_ClipBox.left = 0;
+ m_ClipBox.top = 0;
+ m_ClipBox.right = m_Width;
+ m_ClipBox.bottom = m_Height;
+ }
+}
+FX_BOOL CFX_RenderDevice::StartRendering()
+{
+ return m_pDeviceDriver->StartRendering();
+}
+void CFX_RenderDevice::EndRendering()
+{
+ m_pDeviceDriver->EndRendering();
+}
+void CFX_RenderDevice::SaveState()
+{
+ m_pDeviceDriver->SaveState();
+}
+void CFX_RenderDevice::RestoreState(FX_BOOL bKeepSaved)
+{
+ m_pDeviceDriver->RestoreState(bKeepSaved);
+ UpdateClipBox();
+}
+int CFX_RenderDevice::GetDeviceCaps(int caps_id) const
+{
+ return m_pDeviceDriver->GetDeviceCaps(caps_id);
+}
+CFX_Matrix CFX_RenderDevice::GetCTM() const
+{
+ return m_pDeviceDriver->GetCTM();
+}
+FX_BOOL CFX_RenderDevice::CreateCompatibleBitmap(CFX_DIBitmap* pDIB, int width, int height) const
+{
+ if (m_RenderCaps & FXRC_CMYK_OUTPUT) {
+ return pDIB->Create(width, height, m_RenderCaps & FXRC_ALPHA_OUTPUT ? FXDIB_Cmyka : FXDIB_Cmyk);
+ } else if (m_RenderCaps & FXRC_BYTEMASK_OUTPUT) {
+ return pDIB->Create(width, height, FXDIB_8bppMask);
+ } else
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+ return pDIB->Create(width, height, m_RenderCaps & FXRC_ALPHA_OUTPUT ? FXDIB_Argb : FXDIB_Rgb32);
+#else
+ return pDIB->Create(width, height, m_RenderCaps & FXRC_ALPHA_OUTPUT ? FXDIB_Argb : FXDIB_Rgb);
+#endif
+}
+FX_BOOL CFX_RenderDevice::SetClip_PathFill(const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pObject2Device,
+ int fill_mode
+ )
+{
+ if (!m_pDeviceDriver->SetClip_PathFill(pPathData, pObject2Device, fill_mode)) {
+ return FALSE;
+ }
+ UpdateClipBox();
+ return TRUE;
+}
+FX_BOOL CFX_RenderDevice::SetClip_PathStroke(const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pObject2Device,
+ const CFX_GraphStateData* pGraphState
+ )
+{
+ if (!m_pDeviceDriver->SetClip_PathStroke(pPathData, pObject2Device, pGraphState)) {
+ return FALSE;
+ }
+ UpdateClipBox();
+ return TRUE;
+}
+FX_BOOL CFX_RenderDevice::SetClip_Rect(const FX_RECT* pRect)
+{
+ CFX_PathData path;
+ path.AppendRect((FX_FLOAT)(pRect->left), (FX_FLOAT)(pRect->bottom), (FX_FLOAT)(pRect->right), (FX_FLOAT)(pRect->top));
+ if (!SetClip_PathFill(&path, NULL, FXFILL_WINDING)) {
+ return FALSE;
+ }
+ UpdateClipBox();
+ return TRUE;
+}
+void CFX_RenderDevice::UpdateClipBox()
+{
+ if (m_pDeviceDriver->GetClipBox(&m_ClipBox)) {
+ return;
+ }
+ m_ClipBox.left = 0;
+ m_ClipBox.top = 0;
+ m_ClipBox.right = m_Width;
+ m_ClipBox.bottom = m_Height;
+}
+FX_BOOL CFX_RenderDevice::DrawPath(const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pObject2Device,
+ const CFX_GraphStateData* pGraphState,
+ FX_DWORD fill_color, FX_DWORD stroke_color, int fill_mode,
+ int alpha_flag, void* pIccTransform, int blend_type)
+{
+ FX_BYTE fill_alpha, stroke_alpha;
+ if (FXGETFLAG_COLORTYPE(alpha_flag)) {
+ fill_alpha = FXGETFLAG_ALPHA_FILL(alpha_flag);
+ stroke_alpha = FXGETFLAG_ALPHA_STROKE(alpha_flag);
+ } else {
+ fill_alpha = FXARGB_A(fill_color);
+ stroke_alpha = FXARGB_A(stroke_color);
+ }
+ if ((fill_mode & 3) == 0) {
+ fill_alpha = 0;
+ }
+ if (pGraphState == NULL) {
+ stroke_alpha = 0;
+ }
+ if (stroke_alpha == 0 && pPathData->GetPointCount() == 2) {
+ FX_PATHPOINT* pPoints = pPathData->GetPoints();
+ FX_FLOAT x1, x2, y1, y2;
+ if (pObject2Device) {
+ pObject2Device->Transform(pPoints[0].m_PointX, pPoints[0].m_PointY, x1, y1);
+ pObject2Device->Transform(pPoints[1].m_PointX, pPoints[1].m_PointY, x2, y2);
+ } else {
+ x1 = pPoints[0].m_PointX;
+ y1 = pPoints[0].m_PointY;
+ x2 = pPoints[1].m_PointX;
+ y2 = pPoints[1].m_PointY;
+ }
+ DrawCosmeticLine(x1, y1, x2, y2, fill_color, fill_mode, alpha_flag, pIccTransform, blend_type);
+ return TRUE;
+ }
+ if ((pPathData->GetPointCount() == 5 || pPathData->GetPointCount() == 4) && stroke_alpha == 0) {
+ CFX_FloatRect rect_f;
+ if (!(fill_mode & FXFILL_RECT_AA) && pPathData->IsRect(pObject2Device, &rect_f)) {
+ FX_RECT rect_i = rect_f.GetOutterRect();
+ int width = (int)FXSYS_ceil(rect_f.right - rect_f.left);
+ if (width < 1) {
+ width = 1;
+ if (rect_i.left == rect_i.right) {
+ rect_i.right ++;
+ }
+ }
+ int height = (int)FXSYS_ceil(rect_f.top - rect_f.bottom);
+ if (height < 1) {
+ height = 1;
+ if (rect_i.bottom == rect_i.top) {
+ rect_i.bottom ++;
+ }
+ }
+ if (rect_i.Width() >= width + 1) {
+ if (rect_f.left - (FX_FLOAT)(rect_i.left) > (FX_FLOAT)(rect_i.right) - rect_f.right) {
+ rect_i.left ++;
+ } else {
+ rect_i.right --;
+ }
+ }
+ if (rect_i.Height() >= height + 1) {
+ if (rect_f.top - (FX_FLOAT)(rect_i.top) > (FX_FLOAT)(rect_i.bottom) - rect_f.bottom) {
+ rect_i.top ++;
+ } else {
+ rect_i.bottom --;
+ }
+ }
+ if (FillRect(&rect_i, fill_color, alpha_flag, pIccTransform, blend_type)) {
+ return TRUE;
+ }
+ }
+ }
+ if((fill_mode & 3) && stroke_alpha == 0 && !(fill_mode & FX_FILL_STROKE) && !(fill_mode & FX_FILL_TEXT_MODE)) {
+ CFX_PathData newPath;
+ FX_BOOL bThin = FALSE;
+ if (pPathData->GetZeroAreaPath(newPath, (CFX_Matrix*)pObject2Device, bThin, m_pDeviceDriver->GetDriverType())) {
+ CFX_GraphStateData graphState;
+ graphState.m_LineWidth = 0.0f;
+ FX_DWORD strokecolor = fill_color;
+ if (bThin) {
+ if (FXGETFLAG_COLORTYPE(alpha_flag)) {
+ FXSETFLAG_ALPHA_STROKE(alpha_flag, fill_alpha >> 2);
+ } else {
+ strokecolor = (((fill_alpha >> 2) << 24) | (strokecolor & 0x00ffffff));
+ }
+ }
+ CFX_AffineMatrix* pMatrix = NULL;
+ if (pObject2Device && !pObject2Device->IsIdentity()) {
+ pMatrix = (CFX_AffineMatrix*)pObject2Device;
+ }
+ int smooth_path = FX_ZEROAREA_FILL;
+ if (fill_mode & FXFILL_NOPATHSMOOTH) {
+ smooth_path |= FXFILL_NOPATHSMOOTH;
+ }
+ m_pDeviceDriver->DrawPath(&newPath, pMatrix, &graphState, 0, strokecolor, smooth_path, alpha_flag, pIccTransform, blend_type);
+ }
+ }
+ if ((fill_mode & 3) && fill_alpha && stroke_alpha < 0xff && (fill_mode & FX_FILL_STROKE)) {
+ if (!(m_RenderCaps & FXRC_GET_BITS)) {
+ return FALSE;
+ }
+ CFX_FloatRect bbox;
+ if (pGraphState) {
+ bbox = pPathData->GetBoundingBox(pGraphState->m_LineWidth, pGraphState->m_MiterLimit);
+ } else {
+ bbox = pPathData->GetBoundingBox();
+ }
+ if (pObject2Device) {
+ bbox.Transform(pObject2Device);
+ }
+ CFX_Matrix ctm = GetCTM();
+ FX_FLOAT fScaleX = FXSYS_fabs(ctm.a);
+ FX_FLOAT fScaleY = FXSYS_fabs(ctm.d);
+ FX_RECT rect = bbox.GetOutterRect();
+ CFX_DIBitmap bitmap, Backdrop;
+ if (!CreateCompatibleBitmap(&bitmap, FXSYS_round(rect.Width() * fScaleX), FXSYS_round(rect.Height() * fScaleY))) {
+ return FALSE;
+ }
+ if (bitmap.HasAlpha()) {
+ bitmap.Clear(0);
+ Backdrop.Copy(&bitmap);
+ } else {
+ if (!m_pDeviceDriver->GetDIBits(&bitmap, rect.left, rect.top, NULL)) {
+ return FALSE;
+ }
+ Backdrop.Copy(&bitmap);
+ }
+ CFX_FxgeDevice bitmap_device;
+ bitmap_device.Attach(&bitmap, 0, FALSE, &Backdrop, TRUE);
+ CFX_AffineMatrix matrix;
+ if (pObject2Device) {
+ matrix = *pObject2Device;
+ }
+ matrix.TranslateI(-rect.left, -rect.top);
+ matrix.Concat(fScaleX, 0, 0, fScaleY, 0, 0);
+ if (!bitmap_device.GetDeviceDriver()->DrawPath(pPathData, &matrix, pGraphState, fill_color, stroke_color, fill_mode, alpha_flag, pIccTransform, blend_type)) {
+ return FALSE;
+ }
+ FX_RECT src_rect(0, 0, FXSYS_round(rect.Width() * fScaleX), FXSYS_round(rect.Height() * fScaleY));
+ return m_pDeviceDriver->SetDIBits(&bitmap, 0, &src_rect, rect.left, rect.top, FXDIB_BLEND_NORMAL);
+ }
+ return m_pDeviceDriver->DrawPath(pPathData, pObject2Device, pGraphState, fill_color, stroke_color, fill_mode, alpha_flag, pIccTransform, blend_type);
+}
+FX_BOOL CFX_RenderDevice::SetPixel(int x, int y, FX_DWORD color, int alpha_flag, void* pIccTransform)
+{
+ if (m_pDeviceDriver->SetPixel(x, y, color, alpha_flag, pIccTransform)) {
+ return TRUE;
+ }
+ FX_RECT rect(x, y, x + 1, y + 1);
+ return FillRect(&rect, color, alpha_flag, pIccTransform);
+}
+FX_BOOL CFX_RenderDevice::FillRect(const FX_RECT* pRect, FX_DWORD fill_color, int alpha_flag, void* pIccTransform, int blend_type)
+{
+ if (m_pDeviceDriver->FillRect(pRect, fill_color, alpha_flag, pIccTransform, blend_type)) {
+ return TRUE;
+ }
+ if (!(m_RenderCaps & FXRC_GET_BITS)) {
+ return FALSE;
+ }
+ CFX_DIBitmap bitmap;
+ if (!CreateCompatibleBitmap(&bitmap, pRect->Width(), pRect->Height())) {
+ return FALSE;
+ }
+ if (!m_pDeviceDriver->GetDIBits(&bitmap, pRect->left, pRect->top)) {
+ return FALSE;
+ }
+ if (!bitmap.CompositeRect(0, 0, pRect->Width(), pRect->Height(), fill_color, alpha_flag, pIccTransform)) {
+ return FALSE;
+ }
+ FX_RECT src_rect(0, 0, pRect->Width(), pRect->Height());
+ m_pDeviceDriver->SetDIBits(&bitmap, 0, &src_rect, pRect->left, pRect->top, FXDIB_BLEND_NORMAL);
+ return TRUE;
+}
+FX_BOOL CFX_RenderDevice::DrawCosmeticLine(FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2, FX_DWORD color,
+ int fill_mode, int alpha_flag, void* pIccTransform, int blend_type)
+{
+ if (((m_RenderCaps & FXRC_ALPHA_PATH) &&
+ (FXGETFLAG_COLORTYPE(alpha_flag) && FXGETFLAG_ALPHA_FILL(alpha_flag) == 0xff)) ||
+ color >= 0xff000000)
+ if (m_pDeviceDriver->DrawCosmeticLine(x1, y1, x2, y2, color, alpha_flag, pIccTransform, blend_type)) {
+ return TRUE;
+ }
+ CFX_GraphStateData graph_state;
+ CFX_PathData path;
+ path.SetPointCount(2);
+ path.SetPoint(0, x1, y1, FXPT_MOVETO);
+ path.SetPoint(1, x2, y2, FXPT_LINETO);
+ return m_pDeviceDriver->DrawPath(&path, NULL, &graph_state, 0, color, fill_mode, alpha_flag, pIccTransform, blend_type);
+}
+FX_BOOL CFX_RenderDevice::GetDIBits(CFX_DIBitmap* pBitmap, int left, int top, void* pIccTransform)
+{
+ if (!(m_RenderCaps & FXRC_GET_BITS)) {
+ return FALSE;
+ }
+ return m_pDeviceDriver->GetDIBits(pBitmap, left, top, pIccTransform);
+}
+CFX_DIBitmap* CFX_RenderDevice::GetBackDrop()
+{
+ return m_pDeviceDriver->GetBackDrop();
+}
+FX_BOOL CFX_RenderDevice::SetDIBits(const CFX_DIBSource* pBitmap, int left, int top, int blend_mode,
+ void* pIccTransform)
+{
+ ASSERT(!pBitmap->IsAlphaMask());
+ CFX_AffineMatrix ctm = GetCTM();
+ FX_FLOAT fScaleX = FXSYS_fabs(ctm.a);
+ FX_FLOAT fScaleY = FXSYS_fabs(ctm.d);
+ FX_RECT dest_rect(left, top, FXSYS_round(left + pBitmap->GetWidth() / fScaleX), FXSYS_round(top + pBitmap->GetHeight() / fScaleY));
+ dest_rect.Intersect(m_ClipBox);
+ if (dest_rect.IsEmpty()) {
+ return TRUE;
+ }
+ FX_RECT src_rect(dest_rect.left - left, dest_rect.top - top,
+ dest_rect.left - left + dest_rect.Width(), dest_rect.top - top + dest_rect.Height());
+ src_rect.left = FXSYS_round(src_rect.left * fScaleX);
+ src_rect.top = FXSYS_round(src_rect.top * fScaleY);
+ src_rect.right = FXSYS_round(src_rect.right * fScaleX);
+ src_rect.bottom = FXSYS_round(src_rect.bottom * fScaleY);
+ if ((blend_mode != FXDIB_BLEND_NORMAL && !(m_RenderCaps & FXRC_BLEND_MODE)) ||
+ (pBitmap->HasAlpha() && !(m_RenderCaps & FXRC_ALPHA_IMAGE))) {
+ if (!(m_RenderCaps & FXRC_GET_BITS)) {
+ return FALSE;
+ }
+ int bg_pixel_width = FXSYS_round(dest_rect.Width() * fScaleX);
+ int bg_pixel_height = FXSYS_round(dest_rect.Height() * fScaleY);
+ CFX_DIBitmap background;
+ if (!background.Create(bg_pixel_width, bg_pixel_height,
+ (m_RenderCaps & FXRC_CMYK_OUTPUT) ? FXDIB_Cmyk : FXDIB_Rgb32)) {
+ return FALSE;
+ }
+ if (!m_pDeviceDriver->GetDIBits(&background, dest_rect.left, dest_rect.top)) {
+ return FALSE;
+ }
+ if (!background.CompositeBitmap(0, 0, bg_pixel_width, bg_pixel_height,
+ pBitmap, src_rect.left, src_rect.top,
+ blend_mode, NULL, FALSE, pIccTransform)) {
+ return FALSE;
+ }
+ FX_RECT src_rect(0, 0, bg_pixel_width, bg_pixel_height);
+ return m_pDeviceDriver->SetDIBits(&background, 0, &src_rect, dest_rect.left, dest_rect.top, FXDIB_BLEND_NORMAL);
+ }
+ return m_pDeviceDriver->SetDIBits(pBitmap, 0, &src_rect, dest_rect.left, dest_rect.top, blend_mode, 0, pIccTransform);
+}
+FX_BOOL CFX_RenderDevice::StretchDIBits(const CFX_DIBSource* pBitmap, int left, int top,
+ int dest_width, int dest_height, FX_DWORD flags,
+ void* pIccTransform, int blend_mode)
+{
+ FX_RECT dest_rect(left, top, left + dest_width, top + dest_height);
+ FX_RECT clip_box = m_ClipBox;
+ clip_box.Intersect(dest_rect);
+ if (clip_box.IsEmpty()) {
+ return TRUE;
+ }
+ return m_pDeviceDriver->StretchDIBits(pBitmap, 0, left, top, dest_width, dest_height, &clip_box, flags, 0, pIccTransform, blend_mode);
+}
+FX_BOOL CFX_RenderDevice::SetBitMask(const CFX_DIBSource* pBitmap, int left, int top, FX_DWORD argb,
+ int alpha_flag, void* pIccTransform)
+{
+ FX_RECT src_rect(0, 0, pBitmap->GetWidth(), pBitmap->GetHeight());
+ return m_pDeviceDriver->SetDIBits(pBitmap, argb, &src_rect, left, top, FXDIB_BLEND_NORMAL, alpha_flag, pIccTransform);
+}
+FX_BOOL CFX_RenderDevice::StretchBitMask(const CFX_DIBSource* pBitmap, int left, int top,
+ int dest_width, int dest_height, FX_DWORD argb, FX_DWORD flags,
+ int alpha_flag, void* pIccTransform)
+{
+ FX_RECT dest_rect(left, top, left + dest_width, top + dest_height);
+ FX_RECT clip_box = m_ClipBox;
+ clip_box.Intersect(dest_rect);
+ return m_pDeviceDriver->StretchDIBits(pBitmap, argb, left, top, dest_width, dest_height, &clip_box, flags, alpha_flag, pIccTransform);
+}
+FX_BOOL CFX_RenderDevice::StartDIBits(const CFX_DIBSource* pBitmap, int bitmap_alpha, FX_DWORD argb,
+ const CFX_AffineMatrix* pMatrix, FX_DWORD flags, FX_LPVOID& handle,
+ int alpha_flag, void* pIccTransform, int blend_mode)
+{
+ return m_pDeviceDriver->StartDIBits(pBitmap, bitmap_alpha, argb, pMatrix, flags, handle, alpha_flag, pIccTransform, blend_mode);
+}
+FX_BOOL CFX_RenderDevice::ContinueDIBits(FX_LPVOID handle, IFX_Pause* pPause)
+{
+ return m_pDeviceDriver->ContinueDIBits(handle, pPause);
+}
+void CFX_RenderDevice::CancelDIBits(FX_LPVOID handle)
+{
+ m_pDeviceDriver->CancelDIBits(handle);
+}
diff --git a/core/src/fxge/ge/fx_ge_font.cpp b/core/src/fxge/ge/fx_ge_font.cpp
index e047d2ecb0..f3254ea3de 100644
--- a/core/src/fxge/ge/fx_ge_font.cpp
+++ b/core/src/fxge/ge/fx_ge_font.cpp
@@ -1,458 +1,458 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../../include/fxge/fx_ge.h"
-#include "../../../include/fxge/fx_freetype.h"
-#include "text_int.h"
-#define EM_ADJUST(em, a) (em == 0?(a): (a)*1000/em)
-extern void _FPDFAPI_GetInternalFontData(int id1, FX_LPCBYTE& data, FX_DWORD& size);
-CFX_Font::CFX_Font()
-{
- m_pSubstFont = NULL;
- m_Face = NULL;
- m_bEmbedded = FALSE;
- m_bVertical = FALSE;
- m_pFontData = NULL;
- m_pFontDataAllocation = NULL;
- m_dwSize = 0;
- m_pOwnedStream = NULL;
- m_pGsubData = NULL;
- m_pPlatformFont = NULL;
- m_pPlatformFontCollection = NULL;
- m_pDwFont = NULL;
- m_hHandle = NULL;
- m_bDwLoaded = FALSE;
-}
-CFX_Font::~CFX_Font()
-{
- if (m_pSubstFont) {
- delete m_pSubstFont;
- m_pSubstFont = NULL;
- }
-#ifdef FOXIT_CHROME_BUILD
- if (m_pFontDataAllocation) {
- FX_Free(m_pFontDataAllocation);
- m_pFontDataAllocation = NULL;
- }
-#endif
- if (m_Face) {
-#ifdef FOXIT_CHROME_BUILD
- FXFT_Library library = FXFT_Get_Face_FreeType(m_Face);
- if (FXFT_Get_Face_External_Stream(m_Face)) {
- FXFT_Clear_Face_External_Stream(m_Face);
- }
-#endif
- if(m_bEmbedded) {
- DeleteFace();
- } else {
- CFX_GEModule::Get()->GetFontMgr()->ReleaseFace(m_Face);
- }
- }
- if (m_pOwnedStream) {
- FX_Free(m_pOwnedStream);
- m_pOwnedStream = NULL;
- }
- if (m_pGsubData) {
- FX_Free(m_pGsubData);
- m_pGsubData = NULL;
- }
-#if (_FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ && (!defined(_FPDFAPI_MINI_)))
- ReleasePlatformResource();
-#endif
-}
-void CFX_Font::DeleteFace()
-{
- FXFT_Done_Face(m_Face);
- m_Face = NULL;
-}
-FX_BOOL CFX_Font::LoadSubst(const CFX_ByteString& face_name, FX_BOOL bTrueType, FX_DWORD flags,
- int weight, int italic_angle, int CharsetCP, FX_BOOL bVertical)
-{
- m_bEmbedded = FALSE;
- m_bVertical = bVertical;
- m_pSubstFont = FX_NEW CFX_SubstFont;
- if (!m_pSubstFont) {
- return FALSE;
- }
- m_Face = CFX_GEModule::Get()->GetFontMgr()->FindSubstFont(face_name, bTrueType, flags, weight, italic_angle,
- CharsetCP, m_pSubstFont);
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
- if(m_pSubstFont->m_ExtHandle) {
- m_pPlatformFont = m_pSubstFont->m_ExtHandle;
- m_pSubstFont->m_ExtHandle = NULL;
- }
-#endif
- if (m_Face) {
- m_pFontData = FXFT_Get_Face_Stream_Base(m_Face);
- m_dwSize = FXFT_Get_Face_Stream_Size(m_Face);
- }
- return TRUE;
-}
-extern "C" {
- unsigned long _FTStreamRead(FXFT_Stream stream, unsigned long offset,
- unsigned char* buffer, unsigned long count)
- {
- if (count == 0) {
- return 0;
- }
- IFX_FileRead* pFile = (IFX_FileRead*)stream->descriptor.pointer;
- int res = pFile->ReadBlock(buffer, offset, count);
- if (res) {
- return count;
- }
- return 0;
- }
- void _FTStreamClose(FXFT_Stream stream)
- {
- }
-};
-FX_BOOL _LoadFile(FXFT_Library library, FXFT_Face* Face, IFX_FileRead* pFile, FXFT_Stream* stream)
-{
- FXFT_Stream stream1 = (FXFT_Stream)FX_Alloc(FX_BYTE, sizeof (FXFT_StreamRec));
- if (!stream1) {
- return FALSE;
- }
- stream1->base = NULL;
- stream1->size = (unsigned long)pFile->GetSize();
- stream1->pos = 0;
- stream1->descriptor.pointer = pFile;
- stream1->close = _FTStreamClose;
- stream1->read = _FTStreamRead;
- FXFT_Open_Args args;
- args.flags = FT_OPEN_STREAM;
- args.stream = stream1;
- if (FXFT_Open_Face(library, &args, 0, Face)) {
- FX_Free(stream1);
- return FALSE;
- }
- if (stream) {
- *stream = stream1;
- }
- return TRUE;
-}
-FX_BOOL CFX_Font::LoadFile(IFX_FileRead* pFile)
-{
- m_bEmbedded = FALSE;
- FXFT_Library library;
- if (CFX_GEModule::Get()->GetFontMgr()->m_FTLibrary == NULL) {
- FXFT_Init_FreeType(&CFX_GEModule::Get()->GetFontMgr()->m_FTLibrary);
- }
- library = CFX_GEModule::Get()->GetFontMgr()->m_FTLibrary;
- FXFT_Stream stream = NULL;
- if (!_LoadFile(library, &m_Face, pFile, &stream)) {
- return FALSE;
- }
- m_pOwnedStream = stream;
- FXFT_Set_Pixel_Sizes(m_Face, 0, 64);
- return TRUE;
-}
-int CFX_Font::GetGlyphWidth(FX_DWORD glyph_index)
-{
- if (!m_Face) {
- return 0;
- }
- if (m_pSubstFont && (m_pSubstFont->m_SubstFlags & FXFONT_SUBST_MM)) {
- AdjustMMParams(glyph_index, 0, 0);
- }
- int err = FXFT_Load_Glyph(m_Face, glyph_index, FXFT_LOAD_NO_SCALE | FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH);
- if (err) {
- return 0;
- }
- int width = EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Glyph_HoriAdvance(m_Face));
- return width;
-}
-static FXFT_Face FT_LoadFont(FX_LPBYTE pData, int size)
-{
- FXFT_Library library;
- if (CFX_GEModule::Get()->GetFontMgr()->m_FTLibrary == NULL) {
- FXFT_Init_FreeType(&CFX_GEModule::Get()->GetFontMgr()->m_FTLibrary);
- }
- library = CFX_GEModule::Get()->GetFontMgr()->m_FTLibrary;
- FXFT_Face face;
- int error = FXFT_New_Memory_Face(library, pData, size, 0, &face);
- if (error) {
- return NULL;
- }
- error = FXFT_Set_Pixel_Sizes(face, 64, 64);
- if (error) {
- return NULL;
- }
- return face;
-}
-FX_BOOL CFX_Font::LoadEmbedded(FX_LPCBYTE data, FX_DWORD size)
-{
-#ifdef FOXIT_CHROME_BUILD
- m_pFontDataAllocation = FX_Alloc(FX_BYTE, size);
- if (!m_pFontDataAllocation) {
- return FALSE;
- }
- FXSYS_memcpy32(m_pFontDataAllocation, data, size);
- m_Face = FT_LoadFont((FX_LPBYTE)m_pFontDataAllocation, size);
- m_pFontData = (FX_LPBYTE)m_pFontDataAllocation;
-#else
- m_Face = FT_LoadFont((FX_LPBYTE)data, size);
- m_pFontData = (FX_LPBYTE)data;
-#endif
- m_bEmbedded = TRUE;
- m_dwSize = size;
- return m_Face != NULL;
-}
-FX_BOOL CFX_Font::IsTTFont()
-{
- if (m_Face == NULL) {
- return FALSE;
- }
- return FXFT_Is_Face_TT_OT(m_Face) == FXFT_FACE_FLAG_SFNT;
-}
-int CFX_Font::GetAscent() const
-{
- if (m_Face == NULL) {
- return 0;
- }
- int ascent = EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Face_Ascender(m_Face));
- return ascent;
-}
-int CFX_Font::GetDescent() const
-{
- if (m_Face == NULL) {
- return 0;
- }
- int descent = EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Face_Descender(m_Face));
- return descent;
-}
-FX_BOOL CFX_Font::GetGlyphBBox(FX_DWORD glyph_index, FX_RECT &bbox)
-{
- if (m_Face == NULL) {
- return FALSE;
- }
- if (FXFT_Is_Face_Tricky(m_Face)) {
- int error = FXFT_Set_Char_Size(m_Face, 0, 1000 * 64, 72, 72);
- if (error) {
- return FALSE;
- }
- error = FXFT_Load_Glyph(m_Face, glyph_index, FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH);
- if (error) {
- return FALSE;
- }
- FXFT_BBox cbox;
- FT_Glyph glyph;
- error = FXFT_Get_Glyph(((FXFT_Face)m_Face)->glyph, &glyph);
- if (error) {
- return FALSE;
- }
- FXFT_Glyph_Get_CBox(glyph, FXFT_GLYPH_BBOX_PIXELS, &cbox);
- int pixel_size_x = ((FXFT_Face)m_Face)->size->metrics.x_ppem,
- pixel_size_y = ((FXFT_Face)m_Face)->size->metrics.y_ppem;
- if (pixel_size_x == 0 || pixel_size_y == 0) {
- bbox.left = cbox.xMin;
- bbox.right = cbox.xMax;
- bbox.top = cbox.yMax;
- bbox.bottom = cbox.yMin;
- } else {
- bbox.left = cbox.xMin * 1000 / pixel_size_x;
- bbox.right = cbox.xMax * 1000 / pixel_size_x;
- bbox.top = cbox.yMax * 1000 / pixel_size_y;
- bbox.bottom = cbox.yMin * 1000 / pixel_size_y;
- }
- if (bbox.top > FXFT_Get_Face_Ascender(m_Face)) {
- bbox.top = FXFT_Get_Face_Ascender(m_Face);
- }
- if (bbox.bottom < FXFT_Get_Face_Descender(m_Face)) {
- bbox.bottom = FXFT_Get_Face_Descender(m_Face);
- }
- FT_Done_Glyph(glyph);
- return FXFT_Set_Pixel_Sizes(m_Face, 0, 64) == 0;
- }
- if (FXFT_Load_Glyph(m_Face, glyph_index, FXFT_LOAD_NO_SCALE | FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH)) {
- return FALSE;
- }
- int em = FXFT_Get_Face_UnitsPerEM(m_Face);
- if (em == 0) {
- bbox.left = FXFT_Get_Glyph_HoriBearingX(m_Face);
- bbox.bottom = FXFT_Get_Glyph_HoriBearingY(m_Face);
- bbox.top = bbox.bottom - FXFT_Get_Glyph_Height(m_Face);
- bbox.right = bbox.left + FXFT_Get_Glyph_Width(m_Face);
- } else {
- bbox.left = FXFT_Get_Glyph_HoriBearingX(m_Face) * 1000 / em;
- bbox.top = (FXFT_Get_Glyph_HoriBearingY(m_Face) - FXFT_Get_Glyph_Height(m_Face)) * 1000 / em;
- bbox.right = (FXFT_Get_Glyph_HoriBearingX(m_Face) + FXFT_Get_Glyph_Width(m_Face)) * 1000 / em;
- bbox.bottom = (FXFT_Get_Glyph_HoriBearingY(m_Face)) * 1000 / em;
- }
- return TRUE;
-}
-FX_BOOL CFX_Font::IsItalic()
-{
- if (m_Face == NULL) {
- return FALSE;
- }
- FX_BOOL ret = FXFT_Is_Face_Italic(m_Face) == FXFT_STYLE_FLAG_ITALIC;
- if (!ret) {
- CFX_ByteString str(FXFT_Get_Face_Style_Name(m_Face));
- str.MakeLower();
- if (str.Find("italic") != -1) {
- ret = TRUE;
- }
- }
- return ret;
-}
-FX_BOOL CFX_Font::IsBold()
-{
- if (m_Face == NULL) {
- return FALSE;
- }
- return FXFT_Is_Face_Bold(m_Face) == FXFT_STYLE_FLAG_BOLD;
-}
-FX_BOOL CFX_Font::IsFixedWidth()
-{
- if (m_Face == NULL) {
- return FALSE;
- }
- return FXFT_Is_Face_fixedwidth(m_Face);
-}
-CFX_WideString CFX_Font::GetPsName() const
-{
- if (m_Face == NULL) {
- return CFX_WideString();
- }
- CFX_WideString psName = CFX_WideString::FromLocal(FXFT_Get_Postscript_Name(m_Face));
- if (psName.IsEmpty()) {
- psName = CFX_WideString::FromLocal("Untitled");
- }
- return psName;
-}
-CFX_ByteString CFX_Font::GetFamilyName() const
-{
- if (m_Face == NULL && m_pSubstFont == NULL) {
- return CFX_ByteString();
- }
- if (m_Face) {
- return CFX_ByteString(FXFT_Get_Face_Family_Name(m_Face));
- } else {
- return m_pSubstFont->m_Family;
- }
-}
-CFX_ByteString CFX_Font::GetFaceName() const
-{
- if (m_Face == NULL && m_pSubstFont == NULL) {
- return CFX_ByteString();
- }
- if (m_Face) {
- CFX_ByteString facename;
- CFX_ByteString style = CFX_ByteString(FXFT_Get_Face_Style_Name(m_Face));
- facename = GetFamilyName();
- if (facename.IsEmpty()) {
- facename = "Untitled";
- }
- if (!style.IsEmpty() && style != "Regular") {
- facename += " " + style;
- }
- return facename;
- } else {
- return m_pSubstFont->m_Family;
- }
-}
-FX_BOOL CFX_Font::GetBBox(FX_RECT &bbox)
-{
- if (m_Face == NULL) {
- return FALSE;
- }
- int em = FXFT_Get_Face_UnitsPerEM(m_Face);
- if (em == 0) {
- bbox.left = FXFT_Get_Face_xMin(m_Face);
- bbox.bottom = FXFT_Get_Face_yMax(m_Face);
- bbox.top = FXFT_Get_Face_yMin(m_Face);
- bbox.right = FXFT_Get_Face_xMax(m_Face);
- } else {
- bbox.left = FXFT_Get_Face_xMin(m_Face) * 1000 / em;
- bbox.top = FXFT_Get_Face_yMin(m_Face) * 1000 / em;
- bbox.right = FXFT_Get_Face_xMax(m_Face) * 1000 / em;
- bbox.bottom = FXFT_Get_Face_yMax(m_Face) * 1000 / em;
- }
- return TRUE;
-}
-int CFX_Font::GetHeight()
-{
- if (m_Face == NULL) {
- return 0;
- }
- int height = EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Face_Height(m_Face));
- return height;
-}
-int CFX_Font::GetMaxAdvanceWidth()
-{
- if (m_Face == NULL) {
- return 0;
- }
- int width = EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Face_MaxAdvanceWidth(m_Face));
- return width;
-}
-int CFX_Font::GetULPos()
-{
- if (m_Face == NULL) {
- return 0;
- }
- int pos = EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Face_UnderLinePosition(m_Face));
- return pos;
-}
-int CFX_Font::GetULthickness()
-{
- if (m_Face == NULL) {
- return 0;
- }
- int thickness = EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Face_UnderLineThickness(m_Face));
- return thickness;
-}
-CFX_UnicodeEncoding::CFX_UnicodeEncoding(CFX_Font* pFont)
-{
- m_pFont = pFont;
-}
-FX_DWORD CFX_UnicodeEncoding::GlyphFromCharCode(FX_DWORD charcode)
-{
- FXFT_Face face = m_pFont->GetFace();
- if (!face) {
- return charcode;
- }
- if (FXFT_Select_Charmap(face, FXFT_ENCODING_UNICODE) == 0) {
- return FXFT_Get_Char_Index(face, charcode);
- }
- if (m_pFont->m_pSubstFont && m_pFont->m_pSubstFont->m_Charset == 2) {
- FX_DWORD index = 0;
- if (FXFT_Select_Charmap(face, FXFT_ENCODING_MS_SYMBOL) == 0) {
- index = FXFT_Get_Char_Index(face, charcode);
- }
- if (!index && !FXFT_Select_Charmap(face, FXFT_ENCODING_APPLE_ROMAN)) {
- return FXFT_Get_Char_Index(face, charcode);
- }
- }
- return charcode;
-}
-FX_DWORD CFX_UnicodeEncoding::GlyphFromCharCodeEx(FX_DWORD charcode, int encoding)
-{
- FXFT_Face face = m_pFont->GetFace();
- if (!face) {
- return charcode;
- }
- if (encoding == ENCODING_UNICODE) {
- return GlyphFromCharCode(charcode);
- } else {
- int nmaps = FXFT_Get_Face_CharmapCount(m_pFont->m_Face);
- int i = 0;
- while (i < nmaps) {
- int encoding = FXFT_Get_Charmap_Encoding(FXFT_Get_Face_Charmaps(face)[i++]);
- if (encoding != FXFT_ENCODING_UNICODE) {
- FXFT_Select_Charmap(face, encoding);
- break;
- }
- }
- }
- return FXFT_Get_Char_Index(face, charcode);
-}
-IFX_FontEncoding* FXGE_CreateUnicodeEncoding(CFX_Font* pFont)
-{
- CFX_UnicodeEncoding* pEncoding = NULL;
- pEncoding = FX_NEW CFX_UnicodeEncoding(pFont);
- return pEncoding;
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxge/fx_ge.h"
+#include "../../../include/fxge/fx_freetype.h"
+#include "text_int.h"
+#define EM_ADJUST(em, a) (em == 0?(a): (a)*1000/em)
+extern void _FPDFAPI_GetInternalFontData(int id1, FX_LPCBYTE& data, FX_DWORD& size);
+CFX_Font::CFX_Font()
+{
+ m_pSubstFont = NULL;
+ m_Face = NULL;
+ m_bEmbedded = FALSE;
+ m_bVertical = FALSE;
+ m_pFontData = NULL;
+ m_pFontDataAllocation = NULL;
+ m_dwSize = 0;
+ m_pOwnedStream = NULL;
+ m_pGsubData = NULL;
+ m_pPlatformFont = NULL;
+ m_pPlatformFontCollection = NULL;
+ m_pDwFont = NULL;
+ m_hHandle = NULL;
+ m_bDwLoaded = FALSE;
+}
+CFX_Font::~CFX_Font()
+{
+ if (m_pSubstFont) {
+ delete m_pSubstFont;
+ m_pSubstFont = NULL;
+ }
+#ifdef FOXIT_CHROME_BUILD
+ if (m_pFontDataAllocation) {
+ FX_Free(m_pFontDataAllocation);
+ m_pFontDataAllocation = NULL;
+ }
+#endif
+ if (m_Face) {
+#ifdef FOXIT_CHROME_BUILD
+ FXFT_Library library = FXFT_Get_Face_FreeType(m_Face);
+ if (FXFT_Get_Face_External_Stream(m_Face)) {
+ FXFT_Clear_Face_External_Stream(m_Face);
+ }
+#endif
+ if(m_bEmbedded) {
+ DeleteFace();
+ } else {
+ CFX_GEModule::Get()->GetFontMgr()->ReleaseFace(m_Face);
+ }
+ }
+ if (m_pOwnedStream) {
+ FX_Free(m_pOwnedStream);
+ m_pOwnedStream = NULL;
+ }
+ if (m_pGsubData) {
+ FX_Free(m_pGsubData);
+ m_pGsubData = NULL;
+ }
+#if (_FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ && (!defined(_FPDFAPI_MINI_)))
+ ReleasePlatformResource();
+#endif
+}
+void CFX_Font::DeleteFace()
+{
+ FXFT_Done_Face(m_Face);
+ m_Face = NULL;
+}
+FX_BOOL CFX_Font::LoadSubst(const CFX_ByteString& face_name, FX_BOOL bTrueType, FX_DWORD flags,
+ int weight, int italic_angle, int CharsetCP, FX_BOOL bVertical)
+{
+ m_bEmbedded = FALSE;
+ m_bVertical = bVertical;
+ m_pSubstFont = FX_NEW CFX_SubstFont;
+ if (!m_pSubstFont) {
+ return FALSE;
+ }
+ m_Face = CFX_GEModule::Get()->GetFontMgr()->FindSubstFont(face_name, bTrueType, flags, weight, italic_angle,
+ CharsetCP, m_pSubstFont);
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+ if(m_pSubstFont->m_ExtHandle) {
+ m_pPlatformFont = m_pSubstFont->m_ExtHandle;
+ m_pSubstFont->m_ExtHandle = NULL;
+ }
+#endif
+ if (m_Face) {
+ m_pFontData = FXFT_Get_Face_Stream_Base(m_Face);
+ m_dwSize = FXFT_Get_Face_Stream_Size(m_Face);
+ }
+ return TRUE;
+}
+extern "C" {
+ unsigned long _FTStreamRead(FXFT_Stream stream, unsigned long offset,
+ unsigned char* buffer, unsigned long count)
+ {
+ if (count == 0) {
+ return 0;
+ }
+ IFX_FileRead* pFile = (IFX_FileRead*)stream->descriptor.pointer;
+ int res = pFile->ReadBlock(buffer, offset, count);
+ if (res) {
+ return count;
+ }
+ return 0;
+ }
+ void _FTStreamClose(FXFT_Stream stream)
+ {
+ }
+};
+FX_BOOL _LoadFile(FXFT_Library library, FXFT_Face* Face, IFX_FileRead* pFile, FXFT_Stream* stream)
+{
+ FXFT_Stream stream1 = (FXFT_Stream)FX_Alloc(FX_BYTE, sizeof (FXFT_StreamRec));
+ if (!stream1) {
+ return FALSE;
+ }
+ stream1->base = NULL;
+ stream1->size = (unsigned long)pFile->GetSize();
+ stream1->pos = 0;
+ stream1->descriptor.pointer = pFile;
+ stream1->close = _FTStreamClose;
+ stream1->read = _FTStreamRead;
+ FXFT_Open_Args args;
+ args.flags = FT_OPEN_STREAM;
+ args.stream = stream1;
+ if (FXFT_Open_Face(library, &args, 0, Face)) {
+ FX_Free(stream1);
+ return FALSE;
+ }
+ if (stream) {
+ *stream = stream1;
+ }
+ return TRUE;
+}
+FX_BOOL CFX_Font::LoadFile(IFX_FileRead* pFile)
+{
+ m_bEmbedded = FALSE;
+ FXFT_Library library;
+ if (CFX_GEModule::Get()->GetFontMgr()->m_FTLibrary == NULL) {
+ FXFT_Init_FreeType(&CFX_GEModule::Get()->GetFontMgr()->m_FTLibrary);
+ }
+ library = CFX_GEModule::Get()->GetFontMgr()->m_FTLibrary;
+ FXFT_Stream stream = NULL;
+ if (!_LoadFile(library, &m_Face, pFile, &stream)) {
+ return FALSE;
+ }
+ m_pOwnedStream = stream;
+ FXFT_Set_Pixel_Sizes(m_Face, 0, 64);
+ return TRUE;
+}
+int CFX_Font::GetGlyphWidth(FX_DWORD glyph_index)
+{
+ if (!m_Face) {
+ return 0;
+ }
+ if (m_pSubstFont && (m_pSubstFont->m_SubstFlags & FXFONT_SUBST_MM)) {
+ AdjustMMParams(glyph_index, 0, 0);
+ }
+ int err = FXFT_Load_Glyph(m_Face, glyph_index, FXFT_LOAD_NO_SCALE | FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH);
+ if (err) {
+ return 0;
+ }
+ int width = EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Glyph_HoriAdvance(m_Face));
+ return width;
+}
+static FXFT_Face FT_LoadFont(FX_LPBYTE pData, int size)
+{
+ FXFT_Library library;
+ if (CFX_GEModule::Get()->GetFontMgr()->m_FTLibrary == NULL) {
+ FXFT_Init_FreeType(&CFX_GEModule::Get()->GetFontMgr()->m_FTLibrary);
+ }
+ library = CFX_GEModule::Get()->GetFontMgr()->m_FTLibrary;
+ FXFT_Face face;
+ int error = FXFT_New_Memory_Face(library, pData, size, 0, &face);
+ if (error) {
+ return NULL;
+ }
+ error = FXFT_Set_Pixel_Sizes(face, 64, 64);
+ if (error) {
+ return NULL;
+ }
+ return face;
+}
+FX_BOOL CFX_Font::LoadEmbedded(FX_LPCBYTE data, FX_DWORD size)
+{
+#ifdef FOXIT_CHROME_BUILD
+ m_pFontDataAllocation = FX_Alloc(FX_BYTE, size);
+ if (!m_pFontDataAllocation) {
+ return FALSE;
+ }
+ FXSYS_memcpy32(m_pFontDataAllocation, data, size);
+ m_Face = FT_LoadFont((FX_LPBYTE)m_pFontDataAllocation, size);
+ m_pFontData = (FX_LPBYTE)m_pFontDataAllocation;
+#else
+ m_Face = FT_LoadFont((FX_LPBYTE)data, size);
+ m_pFontData = (FX_LPBYTE)data;
+#endif
+ m_bEmbedded = TRUE;
+ m_dwSize = size;
+ return m_Face != NULL;
+}
+FX_BOOL CFX_Font::IsTTFont()
+{
+ if (m_Face == NULL) {
+ return FALSE;
+ }
+ return FXFT_Is_Face_TT_OT(m_Face) == FXFT_FACE_FLAG_SFNT;
+}
+int CFX_Font::GetAscent() const
+{
+ if (m_Face == NULL) {
+ return 0;
+ }
+ int ascent = EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Face_Ascender(m_Face));
+ return ascent;
+}
+int CFX_Font::GetDescent() const
+{
+ if (m_Face == NULL) {
+ return 0;
+ }
+ int descent = EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Face_Descender(m_Face));
+ return descent;
+}
+FX_BOOL CFX_Font::GetGlyphBBox(FX_DWORD glyph_index, FX_RECT &bbox)
+{
+ if (m_Face == NULL) {
+ return FALSE;
+ }
+ if (FXFT_Is_Face_Tricky(m_Face)) {
+ int error = FXFT_Set_Char_Size(m_Face, 0, 1000 * 64, 72, 72);
+ if (error) {
+ return FALSE;
+ }
+ error = FXFT_Load_Glyph(m_Face, glyph_index, FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH);
+ if (error) {
+ return FALSE;
+ }
+ FXFT_BBox cbox;
+ FT_Glyph glyph;
+ error = FXFT_Get_Glyph(((FXFT_Face)m_Face)->glyph, &glyph);
+ if (error) {
+ return FALSE;
+ }
+ FXFT_Glyph_Get_CBox(glyph, FXFT_GLYPH_BBOX_PIXELS, &cbox);
+ int pixel_size_x = ((FXFT_Face)m_Face)->size->metrics.x_ppem,
+ pixel_size_y = ((FXFT_Face)m_Face)->size->metrics.y_ppem;
+ if (pixel_size_x == 0 || pixel_size_y == 0) {
+ bbox.left = cbox.xMin;
+ bbox.right = cbox.xMax;
+ bbox.top = cbox.yMax;
+ bbox.bottom = cbox.yMin;
+ } else {
+ bbox.left = cbox.xMin * 1000 / pixel_size_x;
+ bbox.right = cbox.xMax * 1000 / pixel_size_x;
+ bbox.top = cbox.yMax * 1000 / pixel_size_y;
+ bbox.bottom = cbox.yMin * 1000 / pixel_size_y;
+ }
+ if (bbox.top > FXFT_Get_Face_Ascender(m_Face)) {
+ bbox.top = FXFT_Get_Face_Ascender(m_Face);
+ }
+ if (bbox.bottom < FXFT_Get_Face_Descender(m_Face)) {
+ bbox.bottom = FXFT_Get_Face_Descender(m_Face);
+ }
+ FT_Done_Glyph(glyph);
+ return FXFT_Set_Pixel_Sizes(m_Face, 0, 64) == 0;
+ }
+ if (FXFT_Load_Glyph(m_Face, glyph_index, FXFT_LOAD_NO_SCALE | FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH)) {
+ return FALSE;
+ }
+ int em = FXFT_Get_Face_UnitsPerEM(m_Face);
+ if (em == 0) {
+ bbox.left = FXFT_Get_Glyph_HoriBearingX(m_Face);
+ bbox.bottom = FXFT_Get_Glyph_HoriBearingY(m_Face);
+ bbox.top = bbox.bottom - FXFT_Get_Glyph_Height(m_Face);
+ bbox.right = bbox.left + FXFT_Get_Glyph_Width(m_Face);
+ } else {
+ bbox.left = FXFT_Get_Glyph_HoriBearingX(m_Face) * 1000 / em;
+ bbox.top = (FXFT_Get_Glyph_HoriBearingY(m_Face) - FXFT_Get_Glyph_Height(m_Face)) * 1000 / em;
+ bbox.right = (FXFT_Get_Glyph_HoriBearingX(m_Face) + FXFT_Get_Glyph_Width(m_Face)) * 1000 / em;
+ bbox.bottom = (FXFT_Get_Glyph_HoriBearingY(m_Face)) * 1000 / em;
+ }
+ return TRUE;
+}
+FX_BOOL CFX_Font::IsItalic()
+{
+ if (m_Face == NULL) {
+ return FALSE;
+ }
+ FX_BOOL ret = FXFT_Is_Face_Italic(m_Face) == FXFT_STYLE_FLAG_ITALIC;
+ if (!ret) {
+ CFX_ByteString str(FXFT_Get_Face_Style_Name(m_Face));
+ str.MakeLower();
+ if (str.Find("italic") != -1) {
+ ret = TRUE;
+ }
+ }
+ return ret;
+}
+FX_BOOL CFX_Font::IsBold()
+{
+ if (m_Face == NULL) {
+ return FALSE;
+ }
+ return FXFT_Is_Face_Bold(m_Face) == FXFT_STYLE_FLAG_BOLD;
+}
+FX_BOOL CFX_Font::IsFixedWidth()
+{
+ if (m_Face == NULL) {
+ return FALSE;
+ }
+ return FXFT_Is_Face_fixedwidth(m_Face);
+}
+CFX_WideString CFX_Font::GetPsName() const
+{
+ if (m_Face == NULL) {
+ return CFX_WideString();
+ }
+ CFX_WideString psName = CFX_WideString::FromLocal(FXFT_Get_Postscript_Name(m_Face));
+ if (psName.IsEmpty()) {
+ psName = CFX_WideString::FromLocal("Untitled");
+ }
+ return psName;
+}
+CFX_ByteString CFX_Font::GetFamilyName() const
+{
+ if (m_Face == NULL && m_pSubstFont == NULL) {
+ return CFX_ByteString();
+ }
+ if (m_Face) {
+ return CFX_ByteString(FXFT_Get_Face_Family_Name(m_Face));
+ } else {
+ return m_pSubstFont->m_Family;
+ }
+}
+CFX_ByteString CFX_Font::GetFaceName() const
+{
+ if (m_Face == NULL && m_pSubstFont == NULL) {
+ return CFX_ByteString();
+ }
+ if (m_Face) {
+ CFX_ByteString facename;
+ CFX_ByteString style = CFX_ByteString(FXFT_Get_Face_Style_Name(m_Face));
+ facename = GetFamilyName();
+ if (facename.IsEmpty()) {
+ facename = "Untitled";
+ }
+ if (!style.IsEmpty() && style != "Regular") {
+ facename += " " + style;
+ }
+ return facename;
+ } else {
+ return m_pSubstFont->m_Family;
+ }
+}
+FX_BOOL CFX_Font::GetBBox(FX_RECT &bbox)
+{
+ if (m_Face == NULL) {
+ return FALSE;
+ }
+ int em = FXFT_Get_Face_UnitsPerEM(m_Face);
+ if (em == 0) {
+ bbox.left = FXFT_Get_Face_xMin(m_Face);
+ bbox.bottom = FXFT_Get_Face_yMax(m_Face);
+ bbox.top = FXFT_Get_Face_yMin(m_Face);
+ bbox.right = FXFT_Get_Face_xMax(m_Face);
+ } else {
+ bbox.left = FXFT_Get_Face_xMin(m_Face) * 1000 / em;
+ bbox.top = FXFT_Get_Face_yMin(m_Face) * 1000 / em;
+ bbox.right = FXFT_Get_Face_xMax(m_Face) * 1000 / em;
+ bbox.bottom = FXFT_Get_Face_yMax(m_Face) * 1000 / em;
+ }
+ return TRUE;
+}
+int CFX_Font::GetHeight()
+{
+ if (m_Face == NULL) {
+ return 0;
+ }
+ int height = EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Face_Height(m_Face));
+ return height;
+}
+int CFX_Font::GetMaxAdvanceWidth()
+{
+ if (m_Face == NULL) {
+ return 0;
+ }
+ int width = EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Face_MaxAdvanceWidth(m_Face));
+ return width;
+}
+int CFX_Font::GetULPos()
+{
+ if (m_Face == NULL) {
+ return 0;
+ }
+ int pos = EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Face_UnderLinePosition(m_Face));
+ return pos;
+}
+int CFX_Font::GetULthickness()
+{
+ if (m_Face == NULL) {
+ return 0;
+ }
+ int thickness = EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Face_UnderLineThickness(m_Face));
+ return thickness;
+}
+CFX_UnicodeEncoding::CFX_UnicodeEncoding(CFX_Font* pFont)
+{
+ m_pFont = pFont;
+}
+FX_DWORD CFX_UnicodeEncoding::GlyphFromCharCode(FX_DWORD charcode)
+{
+ FXFT_Face face = m_pFont->GetFace();
+ if (!face) {
+ return charcode;
+ }
+ if (FXFT_Select_Charmap(face, FXFT_ENCODING_UNICODE) == 0) {
+ return FXFT_Get_Char_Index(face, charcode);
+ }
+ if (m_pFont->m_pSubstFont && m_pFont->m_pSubstFont->m_Charset == 2) {
+ FX_DWORD index = 0;
+ if (FXFT_Select_Charmap(face, FXFT_ENCODING_MS_SYMBOL) == 0) {
+ index = FXFT_Get_Char_Index(face, charcode);
+ }
+ if (!index && !FXFT_Select_Charmap(face, FXFT_ENCODING_APPLE_ROMAN)) {
+ return FXFT_Get_Char_Index(face, charcode);
+ }
+ }
+ return charcode;
+}
+FX_DWORD CFX_UnicodeEncoding::GlyphFromCharCodeEx(FX_DWORD charcode, int encoding)
+{
+ FXFT_Face face = m_pFont->GetFace();
+ if (!face) {
+ return charcode;
+ }
+ if (encoding == ENCODING_UNICODE) {
+ return GlyphFromCharCode(charcode);
+ } else {
+ int nmaps = FXFT_Get_Face_CharmapCount(m_pFont->m_Face);
+ int i = 0;
+ while (i < nmaps) {
+ int encoding = FXFT_Get_Charmap_Encoding(FXFT_Get_Face_Charmaps(face)[i++]);
+ if (encoding != FXFT_ENCODING_UNICODE) {
+ FXFT_Select_Charmap(face, encoding);
+ break;
+ }
+ }
+ }
+ return FXFT_Get_Char_Index(face, charcode);
+}
+IFX_FontEncoding* FXGE_CreateUnicodeEncoding(CFX_Font* pFont)
+{
+ CFX_UnicodeEncoding* pEncoding = NULL;
+ pEncoding = FX_NEW CFX_UnicodeEncoding(pFont);
+ return pEncoding;
+}
diff --git a/core/src/fxge/ge/fx_ge_fontmap.cpp b/core/src/fxge/ge/fx_ge_fontmap.cpp
index 6549e8e531..8c2751d84a 100644
--- a/core/src/fxge/ge/fx_ge_fontmap.cpp
+++ b/core/src/fxge/ge/fx_ge_fontmap.cpp
@@ -1,1558 +1,1558 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../../include/fxge/fx_ge.h"
-#include "../../../include/fxge/fx_freetype.h"
-#include "text_int.h"
-#define GET_TT_SHORT(w) (FX_WORD)(((w)[0] << 8) | (w)[1])
-#define GET_TT_LONG(w) (FX_DWORD)(((w)[0] << 24) | ((w)[1] << 16) | ((w)[2] << 8) | (w)[3])
-CFX_SubstFont::CFX_SubstFont()
-{
- m_ExtHandle = NULL;
- m_Charset = 0;
- m_SubstFlags = 0;
- m_Weight = 0;
- m_ItalicAngle = 0;
- m_bSubstOfCJK = FALSE;
- m_WeightCJK = 0;
- m_bItlicCJK = FALSE;
-}
-CTTFontDesc::~CTTFontDesc()
-{
- if (m_Type == 1) {
- if (m_SingleFace.m_pFace) {
- FXFT_Done_Face(m_SingleFace.m_pFace);
- }
- } else if (m_Type == 2) {
- for (int i = 0; i < 16; i ++)
- if (m_TTCFace.m_pFaces[i]) {
- FXFT_Done_Face(m_TTCFace.m_pFaces[i]);
- }
- }
- if (m_pFontData) {
- FX_Free(m_pFontData);
- }
-}
-FX_BOOL CTTFontDesc::ReleaseFace(FXFT_Face face)
-{
- if (m_Type == 1) {
- if (m_SingleFace.m_pFace != face) {
- return FALSE;
- }
- } else if (m_Type == 2) {
- int i;
- for (i = 0; i < 16; i ++)
- if (m_TTCFace.m_pFaces[i] == face) {
- break;
- }
- if (i == 16) {
- return FALSE;
- }
- }
- m_RefCount --;
- if (m_RefCount) {
- return FALSE;
- }
- delete this;
- return TRUE;
-}
-CFX_FontMgr::CFX_FontMgr()
-{
- m_pBuiltinMapper = FX_NEW CFX_FontMapper;
- if (!m_pBuiltinMapper) {
- return;
- }
- m_pBuiltinMapper->m_pFontMgr = this;
- m_pExtMapper = NULL;
- m_FTLibrary = NULL;
- FXSYS_memset32(m_ExternalFonts, 0, sizeof m_ExternalFonts);
-}
-CFX_FontMgr::~CFX_FontMgr()
-{
- if (m_pBuiltinMapper) {
- delete m_pBuiltinMapper;
- }
- FreeCache();
- if (m_FTLibrary) {
- FXFT_Done_FreeType(m_FTLibrary);
- }
-}
-void CFX_FontMgr::InitFTLibrary()
-{
- if (m_FTLibrary == NULL) {
- FXFT_Init_FreeType(&m_FTLibrary);
- }
-}
-void CFX_FontMgr::FreeCache()
-{
- FX_POSITION pos = m_FaceMap.GetStartPosition();
- while(pos) {
- CFX_ByteString Key;
- CTTFontDesc* face;
- m_FaceMap.GetNextAssoc(pos, Key, (void*&)face);
- delete face;
- }
- m_FaceMap.RemoveAll();
-}
-void CFX_FontMgr::SetSystemFontInfo(IFX_SystemFontInfo* pFontInfo)
-{
- m_pBuiltinMapper->SetSystemFontInfo(pFontInfo);
-}
-FXFT_Face CFX_FontMgr::FindSubstFont(const CFX_ByteString& face_name, FX_BOOL bTrueType,
- FX_DWORD flags, int weight, int italic_angle, int CharsetCP, CFX_SubstFont* pSubstFont)
-{
- if (m_FTLibrary == NULL) {
- FXFT_Init_FreeType(&m_FTLibrary);
- }
- if (m_pExtMapper) {
- FXFT_Face face = m_pExtMapper->FindSubstFont(face_name, bTrueType, flags, weight, italic_angle,
- CharsetCP, pSubstFont);
- if (face) {
- return face;
- }
- }
- return m_pBuiltinMapper->FindSubstFont(face_name, bTrueType, flags, weight, italic_angle,
- CharsetCP, pSubstFont);
-}
-FXFT_Face CFX_FontMgr::GetCachedFace(const CFX_ByteString& face_name,
- int weight, FX_BOOL bItalic, FX_LPBYTE& pFontData)
-{
- CFX_ByteString key(face_name);
- key += ',';
- key += CFX_ByteString::FormatInteger(weight);
- key += bItalic ? 'I' : 'N';
- CTTFontDesc* pFontDesc = NULL;
- m_FaceMap.Lookup(key, (void*&)pFontDesc);
- if(pFontDesc) {
- pFontData = pFontDesc->m_pFontData;
- pFontDesc->m_RefCount ++;
- return pFontDesc->m_SingleFace.m_pFace;
- }
- return NULL;
-}
-FXFT_Face CFX_FontMgr::AddCachedFace(const CFX_ByteString& face_name,
- int weight, FX_BOOL bItalic, FX_LPBYTE pData, FX_DWORD size, int face_index)
-{
- CTTFontDesc* pFontDesc = FX_NEW CTTFontDesc;
- if (!pFontDesc) {
- return NULL;
- }
- pFontDesc->m_Type = 1;
- pFontDesc->m_SingleFace.m_pFace = NULL;
- pFontDesc->m_SingleFace.m_bBold = weight;
- pFontDesc->m_SingleFace.m_bItalic = bItalic;
- pFontDesc->m_pFontData = pData;
- pFontDesc->m_RefCount = 1;
- FXFT_Library library;
- if (m_FTLibrary == NULL) {
- FXFT_Init_FreeType(&m_FTLibrary);
- }
- library = m_FTLibrary;
- int ret = FXFT_New_Memory_Face(library, pData, size, face_index, &pFontDesc->m_SingleFace.m_pFace);
- if (ret) {
- delete pFontDesc;
- return NULL;
- }
- ret = FXFT_Set_Pixel_Sizes(pFontDesc->m_SingleFace.m_pFace, 64, 64);
- if (ret) {
- delete pFontDesc;
- return NULL;
- }
- CFX_ByteString key(face_name);
- key += ',';
- key += CFX_ByteString::FormatInteger(weight);
- key += bItalic ? 'I' : 'N';
- m_FaceMap.SetAt(key, pFontDesc);
- return pFontDesc->m_SingleFace.m_pFace;
-}
-const FX_LPCSTR g_Base14FontNames[14] = {
- "Courier",
- "Courier-Bold",
- "Courier-BoldOblique",
- "Courier-Oblique",
- "Helvetica",
- "Helvetica-Bold",
- "Helvetica-BoldOblique",
- "Helvetica-Oblique",
- "Times-Roman",
- "Times-Bold",
- "Times-BoldItalic",
- "Times-Italic",
- "Symbol",
- "ZapfDingbats",
-};
-const struct _AltFontName {
- const FX_CHAR* m_pName;
- int m_Index;
-}
-g_AltFontNames[] = {
- {"Arial", 4},
- {"Arial,Bold", 5},
- {"Arial,BoldItalic", 6},
- {"Arial,Italic", 7},
- {"Arial-Bold", 5},
- {"Arial-BoldItalic", 6},
- {"Arial-BoldItalicMT", 6},
- {"Arial-BoldMT", 5},
- {"Arial-Italic", 7},
- {"Arial-ItalicMT", 7},
- {"ArialBold", 5},
- {"ArialBoldItalic", 6},
- {"ArialItalic", 7},
- {"ArialMT", 4},
- {"ArialMT,Bold", 5},
- {"ArialMT,BoldItalic", 6},
- {"ArialMT,Italic", 7},
- {"ArialRoundedMTBold", 5},
- {"Courier", 0},
- {"Courier,Bold", 1},
- {"Courier,BoldItalic", 2},
- {"Courier,Italic", 3},
- {"Courier-Bold", 1},
- {"Courier-BoldOblique", 2},
- {"Courier-Oblique", 3},
- {"CourierBold", 1},
- {"CourierBoldItalic", 2},
- {"CourierItalic", 3},
- {"CourierNew", 0},
- {"CourierNew,Bold", 1},
- {"CourierNew,BoldItalic", 2},
- {"CourierNew,Italic", 3},
- {"CourierNew-Bold", 1},
- {"CourierNew-BoldItalic", 2},
- {"CourierNew-Italic", 3},
- {"CourierNewBold", 1},
- {"CourierNewBoldItalic", 2},
- {"CourierNewItalic", 3},
- {"CourierNewPS-BoldItalicMT", 2},
- {"CourierNewPS-BoldMT", 1},
- {"CourierNewPS-ItalicMT", 3},
- {"CourierNewPSMT", 0},
- {"CourierStd", 0},
- {"CourierStd-Bold", 1},
- {"CourierStd-BoldOblique", 2},
- {"CourierStd-Oblique", 3},
- {"Helvetica", 4},
- {"Helvetica,Bold", 5},
- {"Helvetica,BoldItalic", 6},
- {"Helvetica,Italic", 7},
- {"Helvetica-Bold", 5},
- {"Helvetica-BoldItalic", 6},
- {"Helvetica-BoldOblique", 6},
- {"Helvetica-Italic", 7},
- {"Helvetica-Oblique", 7},
- {"HelveticaBold", 5},
- {"HelveticaBoldItalic", 6},
- {"HelveticaItalic", 7},
- {"Symbol", 12},
- {"SymbolMT", 12},
- {"Times-Bold", 9},
- {"Times-BoldItalic", 10},
- {"Times-Italic", 11},
- {"Times-Roman", 8},
- {"TimesBold", 9},
- {"TimesBoldItalic", 10},
- {"TimesItalic", 11},
- {"TimesNewRoman", 8},
- {"TimesNewRoman,Bold", 9},
- {"TimesNewRoman,BoldItalic", 10},
- {"TimesNewRoman,Italic", 11},
- {"TimesNewRoman-Bold", 9},
- {"TimesNewRoman-BoldItalic", 10},
- {"TimesNewRoman-Italic", 11},
- {"TimesNewRomanBold", 9},
- {"TimesNewRomanBoldItalic", 10},
- {"TimesNewRomanItalic", 11},
- {"TimesNewRomanPS", 8},
- {"TimesNewRomanPS-Bold", 9},
- {"TimesNewRomanPS-BoldItalic", 10},
- {"TimesNewRomanPS-BoldItalicMT", 10},
- {"TimesNewRomanPS-BoldMT", 9},
- {"TimesNewRomanPS-Italic", 11},
- {"TimesNewRomanPS-ItalicMT", 11},
- {"TimesNewRomanPSMT", 8},
- {"TimesNewRomanPSMT,Bold", 9},
- {"TimesNewRomanPSMT,BoldItalic", 10},
- {"TimesNewRomanPSMT,Italic", 11},
- {"ZapfDingbats", 13},
-};
-extern "C" {
- static int compareString(const void* key, const void* element)
- {
- return FXSYS_stricmp((FX_LPCSTR)key, ((_AltFontName*)element)->m_pName);
- }
-}
-int _PDF_GetStandardFontName(CFX_ByteString& name)
-{
- _AltFontName* found = (_AltFontName*)FXSYS_bsearch((FX_LPCSTR)name, g_AltFontNames,
- sizeof g_AltFontNames / sizeof (_AltFontName), sizeof (_AltFontName), compareString);
- if (found == NULL) {
- return -1;
- }
- name = g_Base14FontNames[found->m_Index];
- return found->m_Index;
-}
-int GetTTCIndex(FX_LPCBYTE pFontData, FX_DWORD ttc_size, FX_DWORD font_offset)
-{
- int face_index = 0;
- FX_LPCBYTE p = pFontData + 8;
- FX_DWORD nfont = GET_TT_LONG(p);
- FX_DWORD index;
- for (index = 0; index < nfont; index ++) {
- p = pFontData + 12 + index * 4;
- if (GET_TT_LONG(p) == font_offset) {
- break;
- }
- }
- if(index >= nfont) {
- face_index = 0;
- } else {
- face_index = index;
- }
- return face_index;
-}
-FXFT_Face CFX_FontMgr::GetCachedTTCFace(int ttc_size, FX_DWORD checksum,
- int font_offset, FX_LPBYTE& pFontData)
-{
- CFX_ByteString key;
- key.Format("%d:%d", ttc_size, checksum);
- CTTFontDesc* pFontDesc = NULL;
- m_FaceMap.Lookup(key, (void*&)pFontDesc);
- if (pFontDesc == NULL) {
- return NULL;
- }
- pFontData = pFontDesc->m_pFontData;
- pFontDesc->m_RefCount ++;
- int face_index = GetTTCIndex(pFontDesc->m_pFontData, ttc_size, font_offset);
- if (pFontDesc->m_TTCFace.m_pFaces[face_index] == NULL) {
- pFontDesc->m_TTCFace.m_pFaces[face_index] = GetFixedFace(pFontDesc->m_pFontData, ttc_size, face_index);
- }
- return pFontDesc->m_TTCFace.m_pFaces[face_index];
-}
-FXFT_Face CFX_FontMgr::AddCachedTTCFace(int ttc_size, FX_DWORD checksum,
- FX_LPBYTE pData, FX_DWORD size, int font_offset)
-{
- CFX_ByteString key;
- key.Format("%d:%d", ttc_size, checksum);
- CTTFontDesc* pFontDesc = FX_NEW CTTFontDesc;
- if (!pFontDesc) {
- return NULL;
- }
- pFontDesc->m_Type = 2;
- pFontDesc->m_pFontData = pData;
- for (int i = 0; i < 16; i ++) {
- pFontDesc->m_TTCFace.m_pFaces[i] = NULL;
- }
- pFontDesc->m_RefCount ++;
- key.Format("%d:%d", ttc_size, checksum);
- m_FaceMap.SetAt(key, pFontDesc);
- int face_index = GetTTCIndex(pFontDesc->m_pFontData, ttc_size, font_offset);
- pFontDesc->m_TTCFace.m_pFaces[face_index] = GetFixedFace(pFontDesc->m_pFontData, ttc_size, face_index);
- return pFontDesc->m_TTCFace.m_pFaces[face_index];
-}
-FXFT_Face CFX_FontMgr::GetFixedFace(FX_LPCBYTE pData, FX_DWORD size, int face_index)
-{
- FXFT_Library library;
- if (m_FTLibrary == NULL) {
- FXFT_Init_FreeType(&m_FTLibrary);
- }
- library = m_FTLibrary;
- FXFT_Face face = NULL;
- int ret = FXFT_New_Memory_Face(library, pData, size, face_index, &face);
- if (ret) {
- return NULL;
- }
- ret = FXFT_Set_Pixel_Sizes(face, 64, 64);
- if (ret) {
- return NULL;
- }
- return face;
-}
-FXFT_Face CFX_FontMgr::GetFileFace(FX_LPCSTR filename, int face_index)
-{
- FXFT_Library library;
- if (m_FTLibrary == NULL) {
- FXFT_Init_FreeType(&m_FTLibrary);
- }
- library = m_FTLibrary;
- FXFT_Face face = NULL;
- int ret = FXFT_New_Face(library, filename, face_index, &face);
- if (ret) {
- return NULL;
- }
- ret = FXFT_Set_Pixel_Sizes(face, 64, 64);
- if (ret) {
- return NULL;
- }
- return face;
-}
-void CFX_FontMgr::ReleaseFace(FXFT_Face face)
-{
- if (face == NULL) {
- return;
- }
- FX_POSITION pos = m_FaceMap.GetStartPosition();
- while(pos) {
- CFX_ByteString Key;
- CTTFontDesc* ttface;
- m_FaceMap.GetNextAssoc(pos, Key, (void*&)ttface);
- if (ttface->ReleaseFace(face)) {
- m_FaceMap.RemoveKey(Key);
- }
- }
-}
-extern "C" {
- extern const unsigned char g_FoxitFixedItalicFontData [18746];
- extern const unsigned char g_FoxitFixedFontData [17597];
- extern const unsigned char g_FoxitSansItalicFontData [16339];
- extern const unsigned char g_FoxitSansFontData [15025];
- extern const unsigned char g_FoxitSerifItalicFontData [21227];
- extern const unsigned char g_FoxitSerifFontData [19469];
- extern const unsigned char g_FoxitFixedBoldItalicFontData [19151];
- extern const unsigned char g_FoxitFixedBoldFontData [18055];
- extern const unsigned char g_FoxitSansBoldItalicFontData [16418];
- extern const unsigned char g_FoxitSansBoldFontData [16344];
- extern const unsigned char g_FoxitSerifBoldItalicFontData [20733];
- extern const unsigned char g_FoxitSerifBoldFontData [19395];
- extern const unsigned char g_FoxitSymbolFontData[16729];
- extern const unsigned char g_FoxitDingbatsFontData[29513];
- extern const unsigned char g_FoxitSerifMMFontData[113417];
- extern const unsigned char g_FoxitSansMMFontData[66919];
-};
-const FoxitFonts g_FoxitFonts[14] = {
- {g_FoxitFixedFontData, 17597},
- {g_FoxitFixedBoldFontData, 18055},
- {g_FoxitFixedBoldItalicFontData, 19151},
- {g_FoxitFixedItalicFontData, 18746},
- {g_FoxitSansFontData, 15025},
- {g_FoxitSansBoldFontData, 16344},
- {g_FoxitSansBoldItalicFontData, 16418},
- {g_FoxitSansItalicFontData, 16339},
- {g_FoxitSerifFontData, 19469},
- {g_FoxitSerifBoldFontData, 19395},
- {g_FoxitSerifBoldItalicFontData, 20733},
- {g_FoxitSerifItalicFontData, 21227},
- {g_FoxitSymbolFontData, 16729},
- {g_FoxitDingbatsFontData, 29513},
-};
-void _FPDFAPI_GetInternalFontData(int id, FX_LPCBYTE& data, FX_DWORD& size)
-{
- CFX_GEModule::Get()->GetFontMgr()->GetStandardFont(data, size, id);
-}
-FX_BOOL CFX_FontMgr::GetStandardFont(FX_LPCBYTE& pFontData, FX_DWORD& size, int index)
-{
- if (index > 15 || index < 0) {
- return FALSE;
- }
- {
- if (index >= 14) {
- if (index == 14) {
- pFontData = g_FoxitSerifMMFontData;
- size = 113417;
- } else {
- pFontData = g_FoxitSansMMFontData;
- size = 66919;
- }
- } else {
- pFontData = g_FoxitFonts[index].m_pFontData;
- size = g_FoxitFonts[index].m_dwSize;
- }
- }
- return TRUE;
-}
-CFX_FontMapper::CFX_FontMapper()
-{
- FXSYS_memset32(m_FoxitFaces, 0, sizeof m_FoxitFaces);
- m_MMFaces[0] = m_MMFaces[1] = NULL;
- m_pFontInfo = NULL;
- m_bListLoaded = FALSE;
- m_pFontEnumerator = NULL;
-}
-CFX_FontMapper::~CFX_FontMapper()
-{
- for (int i = 0; i < 14; i ++)
- if (m_FoxitFaces[i]) {
- FXFT_Done_Face(m_FoxitFaces[i]);
- }
- if (m_MMFaces[0]) {
- FXFT_Done_Face(m_MMFaces[0]);
- }
- if (m_MMFaces[1]) {
- FXFT_Done_Face(m_MMFaces[1]);
- }
- if (m_pFontInfo) {
- m_pFontInfo->Release();
- }
-}
-void CFX_FontMapper::SetSystemFontInfo(IFX_SystemFontInfo* pFontInfo)
-{
- if (pFontInfo == NULL) {
- return;
- }
- if (m_pFontInfo) {
- m_pFontInfo->Release();
- }
- m_pFontInfo = pFontInfo;
-}
-static CFX_ByteString _TT_NormalizeName(FX_LPCSTR family)
-{
- CFX_ByteString norm(family, -1);
- norm.Remove(' ');
- norm.Remove('-');
- norm.Remove(',');
- int pos = norm.Find('+');
- if (pos > 0) {
- norm = norm.Left(pos);
- }
- norm.MakeLower();
- return norm;
-}
-CFX_ByteString _FPDF_GetNameFromTT(FX_LPCBYTE name_table, FX_DWORD name_id)
-{
- FX_LPCBYTE ptr = name_table + 2;
- int name_count = GET_TT_SHORT(ptr);
- int string_offset = GET_TT_SHORT(ptr + 2);
- FX_LPCBYTE string_ptr = name_table + string_offset;
- ptr += 4;
- for (int i = 0; i < name_count; i ++) {
- if (GET_TT_SHORT(ptr + 6) == name_id && GET_TT_SHORT(ptr) == 1 && GET_TT_SHORT(ptr + 2) == 0) {
- return CFX_ByteStringC(string_ptr + GET_TT_SHORT(ptr + 10), GET_TT_SHORT(ptr + 8));
- }
- ptr += 12;
- }
- return CFX_ByteString();
-}
-static CFX_ByteString _FPDF_ReadStringFromFile(FXSYS_FILE* pFile, FX_DWORD size)
-{
- CFX_ByteString buffer;
- if (!FXSYS_fread(buffer.GetBuffer(size), size, 1, pFile)) {
- return CFX_ByteString();
- }
- buffer.ReleaseBuffer(size);
- return buffer;
-}
-static CFX_ByteString _FPDF_ReadStringFromStreamFile(IFX_FileStream* pFile, FX_DWORD size)
-{
- CFX_ByteString buffer;
- if (!pFile->ReadBlock(buffer.GetBuffer(size), size)) {
- return CFX_ByteString();
- }
- buffer.ReleaseBuffer(size);
- return buffer;
-}
-CFX_ByteString _FPDF_LoadTableFromTT(FXSYS_FILE* pFile, FX_LPCBYTE pTables, FX_DWORD nTables, FX_DWORD tag)
-{
- for (FX_DWORD i = 0; i < nTables; i ++) {
- FX_LPCBYTE p = pTables + i * 16;
- if (GET_TT_LONG(p) == tag) {
- FX_DWORD offset = GET_TT_LONG(p + 8);
- FX_DWORD size = GET_TT_LONG(p + 12);
- FXSYS_fseek(pFile, offset, FXSYS_SEEK_SET);
- return _FPDF_ReadStringFromFile(pFile, size);
- }
- }
- return CFX_ByteString();
-}
-CFX_ByteString _FPDF_LoadTableFromTTStreamFile(IFX_FileStream* pFile, FX_LPCBYTE pTables, FX_DWORD nTables, FX_DWORD tag)
-{
- for (FX_DWORD i = 0; i < nTables; i ++) {
- FX_LPCBYTE p = pTables + i * 16;
- if (GET_TT_LONG(p) == tag) {
- FX_DWORD offset = GET_TT_LONG(p + 8);
- FX_DWORD size = GET_TT_LONG(p + 12);
- CFX_ByteString buffer;
- if (!pFile->ReadBlock(buffer.GetBuffer(size), offset, size)) {
- return CFX_ByteString();
- }
- buffer.ReleaseBuffer(size);
- return buffer;
- }
- }
- return CFX_ByteString();
-}
-CFX_ByteString CFX_FontMapper::GetPSNameFromTT(void* hFont)
-{
- if (m_pFontInfo == NULL) {
- CFX_ByteString();
- }
- CFX_ByteString result;
- FX_DWORD size = m_pFontInfo->GetFontData(hFont, 0x6e616d65, NULL, 0);
- if (size) {
- FX_LPBYTE buffer = FX_Alloc(FX_BYTE, size);
- if (!buffer) {
- return result;
- }
- m_pFontInfo->GetFontData(hFont, 0x6e616d65, buffer, size);
- result = _FPDF_GetNameFromTT(buffer, 6);
- FX_Free(buffer);
- }
- return result;
-}
-void CFX_FontMapper::AddInstalledFont(const CFX_ByteString& name, int charset)
-{
- if (m_pFontInfo == NULL) {
- return;
- }
- if (m_CharsetArray.Find((FX_DWORD)charset) == -1) {
- m_CharsetArray.Add((FX_DWORD)charset);
- m_FaceArray.Add(name);
- }
- if (name == m_LastFamily) {
- return;
- }
- FX_LPCBYTE ptr = name;
- FX_BOOL bLocalized = FALSE;
- for (int i = 0; i < name.GetLength(); i ++)
- if (ptr[i] > 0x80) {
- bLocalized = TRUE;
- break;
- }
- if (bLocalized) {
- void* hFont = m_pFontInfo->GetFont(name);
- if (hFont == NULL) {
- FX_BOOL bExact;
- hFont = m_pFontInfo->MapFont(0, 0, FXFONT_DEFAULT_CHARSET, 0, name, bExact);
- if (hFont == NULL) {
- return;
- }
- }
- CFX_ByteString new_name = GetPSNameFromTT(hFont);
- if (!new_name.IsEmpty()) {
- new_name.Insert(0, ' ');
- m_InstalledTTFonts.Add(new_name);
- }
- m_pFontInfo->DeleteFont(hFont);
- }
- m_InstalledTTFonts.Add(name);
- m_LastFamily = name;
-}
-void CFX_FontMapper::LoadInstalledFonts()
-{
- if (m_pFontInfo == NULL) {
- return;
- }
- if (m_bListLoaded) {
- return;
- }
- if (m_bListLoaded) {
- return;
- }
- m_pFontInfo->EnumFontList(this);
- m_bListLoaded = TRUE;
-}
-CFX_ByteString CFX_FontMapper::MatchInstalledFonts(const CFX_ByteString& norm_name)
-{
- LoadInstalledFonts();
- int i;
- for (i = m_InstalledTTFonts.GetSize() - 1; i >= 0; i --) {
- CFX_ByteString norm1 = _TT_NormalizeName(m_InstalledTTFonts[i]);
- if (norm1 == norm_name) {
- break;
- }
- }
- if (i < 0) {
- return CFX_ByteString();
- }
- CFX_ByteString match = m_InstalledTTFonts[i];
- if (match[0] == ' ') {
- match = m_InstalledTTFonts[i + 1];
- }
- return match;
-}
-typedef struct _CHARSET_MAP_ {
- FX_BYTE charset;
- FX_WORD codepage;
-} CHARSET_MAP;
-static const CHARSET_MAP g_Codepage2CharsetTable[] = {
- { 1 , 0 },
- { 2 , 42 },
- { 254, 437 },
- { 255, 850 },
- { 222, 874 },
- { 128, 932 },
- { 134, 936 },
- { 129, 949 },
- { 136, 950 },
- { 238, 1250 },
- { 204, 1251 },
- { 0, 1252 },
- { 161, 1253 },
- { 162, 1254 },
- { 177, 1255 },
- { 178, 1256 },
- { 186, 1257 },
- { 163, 1258 },
- { 130, 1361 },
- { 77, 10000 },
- { 78, 10001 },
- { 79, 10003 },
- { 80, 10008 },
- { 81, 10002 },
- { 83, 10005 },
- { 84, 10004 },
- { 85, 10006 },
- { 86, 10081 },
- { 87, 10021 },
- { 88, 10029 },
- { 89, 10007 },
-};
-FX_BYTE _GetCharsetFromCodePage(FX_WORD codepage)
-{
- FX_INT32 iEnd = sizeof(g_Codepage2CharsetTable) / sizeof(CHARSET_MAP) - 1;
- FXSYS_assert(iEnd >= 0);
- FX_INT32 iStart = 0, iMid;
- do {
- iMid = (iStart + iEnd) / 2;
- const CHARSET_MAP & cp = g_Codepage2CharsetTable[iMid];
- if (codepage == cp.codepage) {
- return cp.charset;
- } else if (codepage < cp.codepage) {
- iEnd = iMid - 1;
- } else {
- iStart = iMid + 1;
- }
- } while (iStart <= iEnd);
- return 1;
-}
-FX_DWORD _GetCodePageRangeFromCharset(int charset)
-{
- if (charset == FXFONT_EASTEUROPE_CHARSET) {
- return 1 << 1;
- }
- if (charset == FXFONT_GREEK_CHARSET) {
- return 1 << 3;
- }
- if (charset == FXFONT_TURKISH_CHARSET) {
- return 1 << 4;
- }
- if (charset == FXFONT_HEBREW_CHARSET) {
- return 1 << 5;
- }
- if (charset == FXFONT_ARABIC_CHARSET) {
- return 1 << 6;
- }
- if (charset == FXFONT_BALTIC_CHARSET) {
- return 1 << 7;
- }
- if (charset == FXFONT_THAI_CHARSET) {
- return 1 << 16;
- }
- if (charset == FXFONT_SHIFTJIS_CHARSET) {
- return 1 << 17;
- }
- if (charset == FXFONT_GB2312_CHARSET) {
- return 1 << 18;
- }
- if (charset == FXFONT_CHINESEBIG5_CHARSET) {
- return 1 << 20;
- }
- if (charset == FXFONT_HANGEUL_CHARSET) {
- return 1 << 19;
- }
- if (charset == FXFONT_SYMBOL_CHARSET) {
- return 1 << 31;
- }
- return 1 << 21;
-}
-static int CP2CharSet(int cp)
-{
- if(cp == 932) {
- return FXFONT_SHIFTJIS_CHARSET;
- } else if(cp == 936) {
- return FXFONT_GB2312_CHARSET;
- } else if(cp == 949) {
- return FXFONT_HANGEUL_CHARSET;
- } else if(cp == 950) {
- return FXFONT_CHINESEBIG5_CHARSET;
- }
- return FXFONT_DEFAULT_CHARSET;
-}
-FXFT_Face CFX_FontMapper::UseInternalSubst(CFX_SubstFont* pSubstFont, int iBaseFont, int italic_angle, int weight, int picthfamily)
-{
- if (iBaseFont < 12) {
- if (m_FoxitFaces[iBaseFont]) {
- return m_FoxitFaces[iBaseFont];
- }
- FX_LPCBYTE pFontData = NULL;
- FX_DWORD size = 0;
- if (m_pFontMgr->GetStandardFont(pFontData, size, iBaseFont)) {
- m_FoxitFaces[iBaseFont] = m_pFontMgr->GetFixedFace(pFontData, size, 0);
- return m_FoxitFaces[iBaseFont];
- }
- }
- pSubstFont->m_SubstFlags |= FXFONT_SUBST_MM;
- pSubstFont->m_ItalicAngle = italic_angle;
- if (weight) {
- pSubstFont->m_Weight = weight;
- }
- if (picthfamily & FXFONT_FF_ROMAN) {
- pSubstFont->m_Weight = pSubstFont->m_Weight * 4 / 5;
- pSubstFont->m_Family = "Chrome Serif";
- if (m_MMFaces[1]) {
- return m_MMFaces[1];
- }
- FX_LPCBYTE pFontData = NULL;
- FX_DWORD size;
- m_pFontMgr->GetStandardFont(pFontData, size, 14);
- m_MMFaces[1] = m_pFontMgr->GetFixedFace(pFontData, size, 0);
- return m_MMFaces[1];
- }
- pSubstFont->m_Family = "Chrome Sans";
- if (m_MMFaces[0]) {
- return m_MMFaces[0];
- }
- FX_LPCBYTE pFontData = NULL;
- FX_DWORD size = 0;
- m_pFontMgr->GetStandardFont(pFontData, size, 15);
- m_MMFaces[0] = m_pFontMgr->GetFixedFace(pFontData, size, 0);
- return m_MMFaces[0];
-}
-const struct _AltFontFamily {
- FX_LPCSTR m_pFontName;
- FX_LPCSTR m_pFontFamily;
-}
-g_AltFontFamilies[] = {
- {"AGaramondPro", "Adobe Garamond Pro"},
- {"BankGothicBT-Medium", "BankGothic Md BT"},
- {"ForteMT", "Forte"},
-};
-extern "C" {
- static int compareFontFamilyString(const void* key, const void* element)
- {
- CFX_ByteString str_key((FX_LPCSTR)key);
- if (str_key.Find(((_AltFontFamily*)element)->m_pFontName) != -1) {
- return 0;
- }
- return FXSYS_stricmp((FX_LPCSTR)key, ((_AltFontFamily*)element)->m_pFontName);
- }
-}
-#define FX_FONT_STYLE_None 0x00
-#define FX_FONT_STYLE_Bold 0x01
-#define FX_FONT_STYLE_Italic 0x02
-#define FX_FONT_STYLE_BoldBold 0x04
-static CFX_ByteString _GetFontFamily(CFX_ByteString fontName, int nStyle)
-{
- if (fontName.Find("Script") >= 0) {
- if ((nStyle & FX_FONT_STYLE_Bold) == FX_FONT_STYLE_Bold) {
- fontName = "ScriptMTBold";
- } else if (fontName.Find("Palace") >= 0) {
- fontName = "PalaceScriptMT";
- } else if (fontName.Find("French") >= 0) {
- fontName = "FrenchScriptMT";
- } else if (fontName.Find("FreeStyle") >= 0) {
- fontName = "FreeStyleScript";
- }
- return fontName;
- }
- _AltFontFamily* found = (_AltFontFamily*)FXSYS_bsearch((FX_LPCSTR)fontName, g_AltFontFamilies,
- sizeof g_AltFontFamilies / sizeof (_AltFontFamily), sizeof (_AltFontFamily), compareFontFamilyString);
- if (found == NULL) {
- return fontName;
- }
- return found->m_pFontFamily;
-};
-typedef struct _FX_FontStyle {
- FX_LPCSTR style;
- FX_INT32 len;
-} FX_FontStyle;
-const FX_FontStyle g_FontStyles[] = {
- "Bold", 4,
- "Italic", 6,
- "BoldItalic", 10,
- "Reg", 3,
- "Regular", 7,
-};
-CFX_ByteString ParseStyle(FX_LPCSTR pStyle, int iLen, int iIndex)
-{
- CFX_ByteTextBuf buf;
- if (!iLen || iLen <= iIndex) {
- return buf.GetByteString();
- }
- while (iIndex < iLen) {
- if (pStyle[iIndex] == ',') {
- break;
- }
- buf.AppendChar(pStyle[iIndex]);
- ++iIndex;
- }
- return buf.GetByteString();
-}
-FX_INT32 GetStyleType(const CFX_ByteString &bsStyle, FX_BOOL bRevert)
-{
- FX_INT32 iLen = bsStyle.GetLength();
- if (!iLen) {
- return -1;
- }
- int iSize = sizeof(g_FontStyles) / sizeof(FX_FontStyle);
- const FX_FontStyle *pStyle = NULL;
- for (int i = iSize - 1; i >= 0; --i) {
- pStyle = g_FontStyles + i;
- if (!pStyle || pStyle->len > iLen) {
- continue;
- }
- if (!bRevert) {
- if (bsStyle.Left(pStyle->len).Compare(pStyle->style) == 0) {
- return i;
- }
- } else {
- if (bsStyle.Right(pStyle->len).Compare(pStyle->style) == 0) {
- return i;
- }
- }
- }
- return -1;
-}
-FX_BOOL CheckSupportThirdPartFont(CFX_ByteString name, int &PitchFamily)
-{
- if (name == FX_BSTRC("MyriadPro")) {
- PitchFamily &= ~FXFONT_FF_ROMAN;
- return TRUE;
- }
- return FALSE;
-}
-FXFT_Face CFX_FontMapper::FindSubstFont(const CFX_ByteString& name, FX_BOOL bTrueType, FX_DWORD flags,
- int weight, int italic_angle, int WindowCP, CFX_SubstFont* pSubstFont)
-{
- if (!(flags & FXFONT_USEEXTERNATTR)) {
- weight = FXFONT_FW_NORMAL;
- italic_angle = 0;
- }
- CFX_ByteString SubstName = name;
- SubstName.Remove(0x20);
- if (bTrueType) {
- if (name[0] == '@') {
- SubstName = name.Mid(1);
- }
- }
- _PDF_GetStandardFontName(SubstName);
- if (SubstName == FX_BSTRC("Symbol") && !bTrueType) {
- pSubstFont->m_Family = "Chrome Symbol";
- pSubstFont->m_Charset = FXFONT_SYMBOL_CHARSET;
- pSubstFont->m_SubstFlags |= FXFONT_SUBST_STANDARD;
- if (m_FoxitFaces[12]) {
- return m_FoxitFaces[12];
- }
- FX_LPCBYTE pFontData = NULL;
- FX_DWORD size = 0;
- m_pFontMgr->GetStandardFont(pFontData, size, 12);
- m_FoxitFaces[12] = m_pFontMgr->GetFixedFace(pFontData, size, 0);
- return m_FoxitFaces[12];
- }
- if (SubstName == FX_BSTRC("ZapfDingbats")) {
- pSubstFont->m_Family = "Chrome Dingbats";
- pSubstFont->m_Charset = FXFONT_SYMBOL_CHARSET;
- pSubstFont->m_SubstFlags |= FXFONT_SUBST_STANDARD;
- if (m_FoxitFaces[13]) {
- return m_FoxitFaces[13];
- }
- FX_LPCBYTE pFontData = NULL;
- FX_DWORD size = 0;
- m_pFontMgr->GetStandardFont(pFontData, size, 13);
- m_FoxitFaces[13] = m_pFontMgr->GetFixedFace(pFontData, size, 0);
- return m_FoxitFaces[13];
- }
- int iBaseFont = 0;
- CFX_ByteString family, style;
- FX_BOOL bHasComma = FALSE;
- FX_BOOL bHasHypen = FALSE;
- int find = SubstName.Find(FX_BSTRC(","), 0);
- if (find >= 0) {
- family = SubstName.Left(find);
- _PDF_GetStandardFontName(family);
- style = SubstName.Mid(find + 1);
- bHasComma = TRUE;
- } else {
- family = SubstName;
- }
- for (; iBaseFont < 12; iBaseFont ++)
- if (family == CFX_ByteStringC(g_Base14FontNames[iBaseFont])) {
- break;
- }
- int PitchFamily = 0;
- FX_BOOL bItalic = FALSE;
- FX_DWORD nStyle = 0;
- FX_BOOL bStyleAvail = FALSE;
- FX_BOOL bFamilyStyleIsWhole = FALSE;
- FX_BOOL bNextF = FALSE;
- if (iBaseFont < 12) {
- family = g_Base14FontNames[iBaseFont];
- if ((iBaseFont % 4) == 1 || (iBaseFont % 4) == 2) {
- nStyle |= FX_FONT_STYLE_Bold;
- }
- if ((iBaseFont % 4) / 2) {
- nStyle |= FX_FONT_STYLE_Italic;
- }
- if (iBaseFont < 4) {
- PitchFamily |= FXFONT_FF_FIXEDPITCH;
- }
- if (iBaseFont >= 8) {
- PitchFamily |= FXFONT_FF_ROMAN;
- }
- } else {
- if (!bHasComma) {
- find = family.ReverseFind('-');
- if (find >= 0) {
- style = family.Mid(find + 1);
- family = family.Left(find);
- bHasHypen = TRUE;
- }
- }
- if (!bHasHypen) {
- int nLen = family.GetLength();
- FX_INT32 nRet = GetStyleType(family, TRUE);
- if (nRet > -1) {
- family = family.Left(nLen - g_FontStyles[nRet].len);
- if (nRet == 0) {
- nStyle |= FX_FONT_STYLE_Bold;
- }
- if (nRet == 1) {
- nStyle |= FX_FONT_STYLE_Italic;
- }
- if (nRet == 2) {
- nStyle |= (FX_FONT_STYLE_Bold | FX_FONT_STYLE_Italic);
- }
- }
- }
- if (flags & FXFONT_SERIF) {
- PitchFamily |= FXFONT_FF_ROMAN;
- }
- if (flags & FXFONT_SCRIPT) {
- PitchFamily |= FXFONT_FF_SCRIPT;
- }
- if (flags & FXFONT_FIXED_PITCH) {
- PitchFamily |= FXFONT_FF_FIXEDPITCH;
- }
- }
- if (!style.IsEmpty()) {
- int nLen = style.GetLength();
- FX_LPCSTR pStyle = style;
- int i = 0;
- FX_BOOL bFirstItem = TRUE;
- CFX_ByteString buf;
- while (i < nLen) {
- buf = ParseStyle(pStyle, nLen, i);
- FX_INT32 nRet = GetStyleType(buf, FALSE);
- if ((i && !bStyleAvail) || (!i && nRet < 0)) {
- family = SubstName;
- iBaseFont = 12;
- break;
- } else if (nRet >= 0) {
- bStyleAvail = TRUE;
- }
- if (nRet == 0) {
- if (nStyle & FX_FONT_STYLE_Bold) {
- nStyle |= FX_FONT_STYLE_BoldBold;
- } else {
- nStyle |= FX_FONT_STYLE_Bold;
- }
- bFirstItem = FALSE;
- }
- if (nRet == 1) {
- if (bFirstItem) {
- nStyle |= FX_FONT_STYLE_Italic;
- } else {
- family = SubstName;
- iBaseFont = 12;
- }
- break;
- }
- if (nRet == 2) {
- nStyle |= FX_FONT_STYLE_Italic;
- if (nStyle & FX_FONT_STYLE_Bold) {
- nStyle |= FX_FONT_STYLE_BoldBold;
- } else {
- nStyle |= FX_FONT_STYLE_Bold;
- }
- bFirstItem = FALSE;
- }
- i += buf.GetLength() + 1;
- }
- }
- weight = weight ? weight : FXFONT_FW_NORMAL;
- int old_weight = weight;
- if (nStyle) {
- weight = nStyle & FX_FONT_STYLE_BoldBold ? 900 : (nStyle & FX_FONT_STYLE_Bold ? FXFONT_FW_BOLD : FXFONT_FW_NORMAL);
- }
- if (nStyle & FX_FONT_STYLE_Italic) {
- bItalic = TRUE;
- }
- FX_BOOL bCJK = FALSE;
- FX_BOOL bExact = FALSE;
- int Charset = FXFONT_ANSI_CHARSET;
- if (WindowCP) {
- Charset = _GetCharsetFromCodePage(WindowCP);
- } else if (iBaseFont == 12 && (flags & FXFONT_SYMBOLIC)) {
- Charset = FXFONT_SYMBOL_CHARSET;
- }
- if (Charset == FXFONT_SHIFTJIS_CHARSET || Charset == FXFONT_GB2312_CHARSET ||
- Charset == FXFONT_HANGEUL_CHARSET || Charset == FXFONT_CHINESEBIG5_CHARSET) {
- bCJK = TRUE;
- }
- if (m_pFontInfo == NULL) {
- pSubstFont->m_SubstFlags |= FXFONT_SUBST_STANDARD;
- return UseInternalSubst(pSubstFont, iBaseFont, italic_angle, old_weight, PitchFamily);
- }
- family = _GetFontFamily(family, nStyle);
- CFX_ByteString match = MatchInstalledFonts(_TT_NormalizeName(family));
- if (match.IsEmpty() && family != SubstName && (!bHasComma && (!bHasHypen || (bHasHypen && !bStyleAvail)))) {
- match = MatchInstalledFonts(_TT_NormalizeName(SubstName));
- }
- if (match.IsEmpty() && iBaseFont >= 12) {
- if (!bCJK) {
- if (!CheckSupportThirdPartFont(family, PitchFamily)) {
- if (italic_angle != 0) {
- bItalic = TRUE;
- } else {
- bItalic = FALSE;
- }
- weight = old_weight;
- }
- } else {
- pSubstFont->m_bSubstOfCJK = TRUE;
- if (nStyle) {
- pSubstFont->m_WeightCJK = weight;
- } else {
- pSubstFont->m_WeightCJK = FXFONT_FW_NORMAL;
- }
- if (nStyle & FX_FONT_STYLE_Italic) {
- pSubstFont->m_bItlicCJK = TRUE;
- }
- }
- } else {
- italic_angle = 0;
- weight = nStyle & FX_FONT_STYLE_BoldBold ? 900 : (nStyle & FX_FONT_STYLE_Bold ? FXFONT_FW_BOLD : FXFONT_FW_NORMAL);
- }
- if (!match.IsEmpty() || iBaseFont < 12) {
- pSubstFont->m_SubstFlags |= FXFONT_SUBST_EXACT;
- if (!match.IsEmpty()) {
- family = match;
- }
- if (iBaseFont < 12) {
- if (nStyle && !(iBaseFont % 4)) {
- if ((nStyle & 0x3) == 1) {
- iBaseFont += 1;
- }
- if ((nStyle & 0x3) == 2) {
- iBaseFont += 3;
- }
- if ((nStyle & 0x3) == 3) {
- iBaseFont += 2;
- }
- }
- if (m_pFontMgr->m_ExternalFonts[iBaseFont].m_pFontData) {
- if (m_FoxitFaces[iBaseFont]) {
- return m_FoxitFaces[iBaseFont];
- }
- m_FoxitFaces[iBaseFont] = m_pFontMgr->GetFixedFace(m_pFontMgr->m_ExternalFonts[iBaseFont].m_pFontData,
- m_pFontMgr->m_ExternalFonts[iBaseFont].m_dwSize, 0);
- if (m_FoxitFaces[iBaseFont]) {
- return m_FoxitFaces[iBaseFont];
- }
- } else {
- family = g_Base14FontNames[iBaseFont];
- }
- pSubstFont->m_SubstFlags |= FXFONT_SUBST_STANDARD;
- }
- } else {
- if (flags & FXFONT_ITALIC) {
- bItalic = TRUE;
- }
- }
- bExact = !match.IsEmpty();
- void* hFont = m_pFontInfo->MapFont(weight, bItalic, Charset, PitchFamily, family, bExact);
- if (bExact) {
- pSubstFont->m_SubstFlags |= FXFONT_SUBST_EXACT;
- }
- if (hFont == NULL) {
- if (bCJK) {
- if (italic_angle != 0) {
- bItalic = TRUE;
- } else {
- bItalic = FALSE;
- }
- weight = old_weight;
- }
- if (!match.IsEmpty()) {
- hFont = m_pFontInfo->GetFont(match);
- if (hFont == NULL) {
- return UseInternalSubst(pSubstFont, iBaseFont, italic_angle, old_weight, PitchFamily);
- }
- } else {
- if (Charset == FXFONT_SYMBOL_CHARSET) {
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ || _FXM_PLATFORM_ == _FXM_PLATFORM_ANDROID_
- if (SubstName == FX_BSTRC("Symbol")) {
- pSubstFont->m_Family = "Chrome Symbol";
- pSubstFont->m_SubstFlags |= FXFONT_SUBST_STANDARD;
- pSubstFont->m_Charset = FXFONT_SYMBOL_CHARSET;
- if (m_FoxitFaces[12]) {
- return m_FoxitFaces[12];
- }
- FX_LPCBYTE pFontData = NULL;
- FX_DWORD size = 0;
- m_pFontMgr->GetStandardFont(pFontData, size, 12);
- m_FoxitFaces[12] = m_pFontMgr->GetFixedFace(pFontData, size, 0);
- return m_FoxitFaces[12];
- } else {
- pSubstFont->m_SubstFlags |= FXFONT_SUBST_NONSYMBOL;
- return FindSubstFont(family, bTrueType, flags & ~FXFONT_SYMBOLIC, weight, italic_angle, 0, pSubstFont);
- }
-#else
- pSubstFont->m_SubstFlags |= FXFONT_SUBST_NONSYMBOL;
- return FindSubstFont(family, bTrueType, flags & ~FXFONT_SYMBOLIC, weight, italic_angle, 0, pSubstFont);
-#endif
- }
- if (Charset == FXFONT_ANSI_CHARSET) {
- pSubstFont->m_SubstFlags |= FXFONT_SUBST_STANDARD;
- return UseInternalSubst(pSubstFont, iBaseFont, italic_angle, old_weight, PitchFamily);
- }
- int index = m_CharsetArray.Find(Charset);
- if (index < 0) {
- return UseInternalSubst(pSubstFont, iBaseFont, italic_angle, old_weight, PitchFamily);
- } else {
- hFont = m_pFontInfo->GetFont(m_FaceArray[index]);
- }
- }
- }
- pSubstFont->m_ExtHandle = m_pFontInfo->RetainFont(hFont);
- if (hFont == NULL) {
- return NULL;
- }
- m_pFontInfo->GetFaceName(hFont, SubstName);
- if (Charset == FXFONT_DEFAULT_CHARSET) {
- m_pFontInfo->GetFontCharset(hFont, Charset);
- }
- FX_DWORD ttc_size = m_pFontInfo->GetFontData(hFont, 0x74746366, NULL, 0);
- FX_DWORD font_size = m_pFontInfo->GetFontData(hFont, 0, NULL, 0);
- if(font_size == 0 && ttc_size == 0) {
- m_pFontInfo->DeleteFont(hFont);
- return NULL;
- }
- FXFT_Face face = NULL;
- if (ttc_size) {
- FX_BYTE temp[1024];
- m_pFontInfo->GetFontData(hFont, 0x74746366, temp, 1024);
- FX_DWORD checksum = 0;
- for (int i = 0; i < 256; i ++) {
- checksum += ((FX_DWORD*)temp)[i];
- }
- FX_LPBYTE pFontData;
- face = m_pFontMgr->GetCachedTTCFace(ttc_size, checksum, ttc_size - font_size, pFontData);
- if (face == NULL) {
- pFontData = FX_Alloc(FX_BYTE, ttc_size);
- if (pFontData) {
- m_pFontInfo->GetFontData(hFont, 0x74746366, pFontData, ttc_size);
- face = m_pFontMgr->AddCachedTTCFace(ttc_size, checksum, pFontData, ttc_size,
- ttc_size - font_size);
- }
- }
- } else {
- FX_LPBYTE pFontData;
- face = m_pFontMgr->GetCachedFace(SubstName, weight, bItalic, pFontData);
- if (face == NULL) {
- pFontData = FX_Alloc(FX_BYTE, font_size);
- if (!pFontData) {
- m_pFontInfo->DeleteFont(hFont);
- return NULL;
- }
- m_pFontInfo->GetFontData(hFont, 0, pFontData, font_size);
- face = m_pFontMgr->AddCachedFace(SubstName, weight, bItalic, pFontData, font_size, m_pFontInfo->GetFaceIndex(hFont));
- }
- }
- if (face == NULL) {
- m_pFontInfo->DeleteFont(hFont);
- return NULL;
- }
- pSubstFont->m_Family = SubstName;
- pSubstFont->m_Charset = Charset;
- FX_BOOL bNeedUpdateWeight = FALSE;
- if (FXFT_Is_Face_Bold(face)) {
- if (weight == FXFONT_FW_BOLD) {
- bNeedUpdateWeight = FALSE;
- } else {
- bNeedUpdateWeight = TRUE;
- }
- } else {
- if (weight == FXFONT_FW_NORMAL) {
- bNeedUpdateWeight = FALSE;
- } else {
- bNeedUpdateWeight = TRUE;
- }
- }
- if (bNeedUpdateWeight) {
- pSubstFont->m_Weight = weight;
- }
- if (bItalic && !FXFT_Is_Face_Italic(face)) {
- if (italic_angle == 0) {
- italic_angle = -12;
- } else if (FXSYS_abs(italic_angle) < 5) {
- italic_angle = 0;
- }
- pSubstFont->m_ItalicAngle = italic_angle;
- }
- m_pFontInfo->DeleteFont(hFont);
- return face;
-}
-extern "C" {
- unsigned long _FTStreamRead(FXFT_Stream stream, unsigned long offset,
- unsigned char* buffer, unsigned long count);
- void _FTStreamClose(FXFT_Stream stream);
-};
-CFontFileFaceInfo::CFontFileFaceInfo()
-{
- m_pFile = NULL;
- m_Face = NULL;
- m_Charsets = 0;
- m_FileSize = 0;
- m_FontOffset = 0;
- m_Weight = 0;
- m_bItalic = FALSE;
- m_PitchFamily = 0;
-}
-CFontFileFaceInfo::~CFontFileFaceInfo()
-{
- if (m_Face) {
- FXFT_Done_Face(m_Face);
- }
- m_Face = NULL;
-}
-extern FX_BOOL _LoadFile(FXFT_Library library, FXFT_Face* Face, IFX_FileRead* pFile, FXFT_Stream* stream);
-#if defined(_FPDFAPI_MINI_) || _FX_OS_ == _FX_ANDROID_
-IFX_SystemFontInfo* IFX_SystemFontInfo::CreateDefault()
-{
- return NULL;
-}
-#endif
-#if !defined(_FPDFAPI_MINI_)
-CFX_FolderFontInfo::CFX_FolderFontInfo()
-{
-}
-CFX_FolderFontInfo::~CFX_FolderFontInfo()
-{
- FX_POSITION pos = m_FontList.GetStartPosition();
- while (pos) {
- CFX_ByteString key;
- FX_LPVOID value;
- m_FontList.GetNextAssoc(pos, key, value);
- delete (CFontFaceInfo*)value;
- }
-}
-void CFX_FolderFontInfo::AddPath(FX_BSTR path)
-{
- m_PathList.Add(path);
-}
-void CFX_FolderFontInfo::Release()
-{
- delete this;
-}
-FX_BOOL CFX_FolderFontInfo::EnumFontList(CFX_FontMapper* pMapper)
-{
- m_pMapper = pMapper;
- for (int i = 0; i < m_PathList.GetSize(); i ++) {
- ScanPath(m_PathList[i]);
- }
- return TRUE;
-}
-void CFX_FolderFontInfo::ScanPath(CFX_ByteString& path)
-{
- void* handle = FX_OpenFolder(path);
- if (handle == NULL) {
- return;
- }
- CFX_ByteString filename;
- FX_BOOL bFolder;
- while (FX_GetNextFile(handle, filename, bFolder)) {
- if (bFolder) {
- if (filename == "." || filename == "..") {
- continue;
- }
- } else {
- CFX_ByteString ext = filename.Right(4);
- ext.MakeUpper();
- if (ext != ".TTF" && ext != ".OTF" && ext != ".TTC") {
- continue;
- }
- }
- CFX_ByteString fullpath = path;
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
- fullpath += "\\";
-#else
- fullpath += "/";
-#endif
- fullpath += filename;
- if (bFolder) {
- ScanPath(fullpath);
- } else {
- ScanFile(fullpath);
- }
- }
- FX_CloseFolder(handle);
-}
-void CFX_FolderFontInfo::ScanFile(CFX_ByteString& path)
-{
- FXSYS_FILE* pFile = FXSYS_fopen(path, "rb");
- if (pFile == NULL) {
- return;
- }
- FXSYS_fseek(pFile, 0, FXSYS_SEEK_END);
- FX_DWORD filesize = FXSYS_ftell(pFile);
- FX_BYTE buffer[16];
- FXSYS_fseek(pFile, 0, FXSYS_SEEK_SET);
- size_t readCnt = FXSYS_fread(buffer, 12, 1, pFile);
- if (GET_TT_LONG(buffer) == 0x74746366) {
- FX_DWORD nFaces = GET_TT_LONG(buffer + 8);
- FX_LPBYTE offsets = FX_Alloc(FX_BYTE, nFaces * 4);
- if (!offsets) {
- FXSYS_fclose(pFile);
- return;
- }
- readCnt = FXSYS_fread(offsets, nFaces * 4, 1, pFile);
- for (FX_DWORD i = 0; i < nFaces; i ++) {
- FX_LPBYTE p = offsets + i * 4;
- ReportFace(path, pFile, filesize, GET_TT_LONG(p));
- }
- FX_Free(offsets);
- } else {
- ReportFace(path, pFile, filesize, 0);
- }
- FXSYS_fclose(pFile);
-}
-void CFX_FolderFontInfo::ReportFace(CFX_ByteString& path, FXSYS_FILE* pFile, FX_DWORD filesize, FX_DWORD offset)
-{
- FXSYS_fseek(pFile, offset, FXSYS_SEEK_SET);
- char buffer[16];
- if (!FXSYS_fread(buffer, 12, 1, pFile)) {
- return;
- }
- FX_DWORD nTables = GET_TT_SHORT(buffer + 4);
- CFX_ByteString tables = _FPDF_ReadStringFromFile(pFile, nTables * 16);
- CFX_ByteString names = _FPDF_LoadTableFromTT(pFile, tables, nTables, 0x6e616d65);
- CFX_ByteString facename = _FPDF_GetNameFromTT(names, 1);
- CFX_ByteString style = _FPDF_GetNameFromTT(names, 2);
- if (style != "Regular") {
- facename += " " + style;
- }
- FX_LPVOID p;
- if (m_FontList.Lookup(facename, p)) {
- return;
- }
- CFontFaceInfo* pInfo = FX_NEW CFontFaceInfo;
- if (!pInfo) {
- return;
- }
- pInfo->m_FilePath = path;
- pInfo->m_FaceName = facename;
- pInfo->m_FontTables = tables;
- pInfo->m_FontOffset = offset;
- pInfo->m_FileSize = filesize;
- pInfo->m_Charsets = 0;
- CFX_ByteString os2 = _FPDF_LoadTableFromTT(pFile, tables, nTables, 0x4f532f32);
- if (os2.GetLength() >= 86) {
- FX_LPCBYTE p = (FX_LPCBYTE)os2 + 78;
- FX_DWORD codepages = GET_TT_LONG(p);
- if (codepages & (1 << 17)) {
- m_pMapper->AddInstalledFont(facename, FXFONT_SHIFTJIS_CHARSET);
- pInfo->m_Charsets |= CHARSET_FLAG_SHIFTJIS;
- }
- if (codepages & (1 << 18)) {
- m_pMapper->AddInstalledFont(facename, FXFONT_GB2312_CHARSET);
- pInfo->m_Charsets |= CHARSET_FLAG_GB;
- }
- if (codepages & (1 << 20)) {
- m_pMapper->AddInstalledFont(facename, FXFONT_CHINESEBIG5_CHARSET);
- pInfo->m_Charsets |= CHARSET_FLAG_BIG5;
- }
- if ((codepages & (1 << 19)) || (codepages & (1 << 21))) {
- m_pMapper->AddInstalledFont(facename, FXFONT_HANGEUL_CHARSET);
- pInfo->m_Charsets |= CHARSET_FLAG_KOREAN;
- }
- if (codepages & (1 << 31)) {
- m_pMapper->AddInstalledFont(facename, FXFONT_SYMBOL_CHARSET);
- pInfo->m_Charsets |= CHARSET_FLAG_SYMBOL;
- }
- }
- m_pMapper->AddInstalledFont(facename, FXFONT_ANSI_CHARSET);
- pInfo->m_Charsets |= CHARSET_FLAG_ANSI;
- pInfo->m_Styles = 0;
- if (style.Find(FX_BSTRC("Bold")) > -1) {
- pInfo->m_Styles |= FXFONT_BOLD;
- }
- if (style.Find(FX_BSTRC("Italic")) > -1 || style.Find(FX_BSTRC("Oblique")) > -1) {
- pInfo->m_Styles |= FXFONT_ITALIC;
- }
- if (facename.Find(FX_BSTRC("Serif")) > -1) {
- pInfo->m_Styles |= FXFONT_SERIF;
- }
- m_FontList.SetAt(facename, pInfo);
-}
-void* CFX_FolderFontInfo::MapFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR family, FX_BOOL& bExact)
-{
- return NULL;
-}
-void* CFX_FolderFontInfo::GetFont(FX_LPCSTR face)
-{
- FX_LPVOID p;
- if (!m_FontList.Lookup(face, p)) {
- return NULL;
- }
- return p;
-}
-FX_DWORD CFX_FolderFontInfo::GetFontData(void* hFont, FX_DWORD table, FX_LPBYTE buffer, FX_DWORD size)
-{
- if (hFont == NULL) {
- return 0;
- }
- CFontFaceInfo* pFont = (CFontFaceInfo*)hFont;
- FXSYS_FILE* pFile = NULL;
- if (size > 0) {
- pFile = FXSYS_fopen(pFont->m_FilePath, "rb");
- if (pFile == NULL) {
- return 0;
- }
- }
- FX_DWORD datasize = 0;
- FX_DWORD offset;
- if (table == 0) {
- datasize = pFont->m_FontOffset ? 0 : pFont->m_FileSize;
- offset = 0;
- } else if (table == 0x74746366) {
- datasize = pFont->m_FontOffset ? pFont->m_FileSize : 0;
- offset = 0;
- } else {
- FX_DWORD nTables = pFont->m_FontTables.GetLength() / 16;
- for (FX_DWORD i = 0; i < nTables; i ++) {
- FX_LPCBYTE p = (FX_LPCBYTE)pFont->m_FontTables + i * 16;
- if (GET_TT_LONG(p) == table) {
- offset = GET_TT_LONG(p + 8);
- datasize = GET_TT_LONG(p + 12);
- }
- }
- }
- if (datasize && size >= datasize && pFile) {
- FXSYS_fseek(pFile, offset, FXSYS_SEEK_SET);
- size_t readCnt = FXSYS_fread(buffer, datasize, 1, pFile);
- }
- if (pFile) {
- FXSYS_fclose(pFile);
- }
- return datasize;
-}
-void CFX_FolderFontInfo::DeleteFont(void* hFont)
-{
-}
-FX_BOOL CFX_FolderFontInfo::GetFaceName(void* hFont, CFX_ByteString& name)
-{
- if (hFont == NULL) {
- return FALSE;
- }
- CFontFaceInfo* pFont = (CFontFaceInfo*)hFont;
- name = pFont->m_FaceName;
- return TRUE;
-}
-FX_BOOL CFX_FolderFontInfo::GetFontCharset(void* hFont, int& charset)
-{
- return FALSE;
-}
-#endif
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxge/fx_ge.h"
+#include "../../../include/fxge/fx_freetype.h"
+#include "text_int.h"
+#define GET_TT_SHORT(w) (FX_WORD)(((w)[0] << 8) | (w)[1])
+#define GET_TT_LONG(w) (FX_DWORD)(((w)[0] << 24) | ((w)[1] << 16) | ((w)[2] << 8) | (w)[3])
+CFX_SubstFont::CFX_SubstFont()
+{
+ m_ExtHandle = NULL;
+ m_Charset = 0;
+ m_SubstFlags = 0;
+ m_Weight = 0;
+ m_ItalicAngle = 0;
+ m_bSubstOfCJK = FALSE;
+ m_WeightCJK = 0;
+ m_bItlicCJK = FALSE;
+}
+CTTFontDesc::~CTTFontDesc()
+{
+ if (m_Type == 1) {
+ if (m_SingleFace.m_pFace) {
+ FXFT_Done_Face(m_SingleFace.m_pFace);
+ }
+ } else if (m_Type == 2) {
+ for (int i = 0; i < 16; i ++)
+ if (m_TTCFace.m_pFaces[i]) {
+ FXFT_Done_Face(m_TTCFace.m_pFaces[i]);
+ }
+ }
+ if (m_pFontData) {
+ FX_Free(m_pFontData);
+ }
+}
+FX_BOOL CTTFontDesc::ReleaseFace(FXFT_Face face)
+{
+ if (m_Type == 1) {
+ if (m_SingleFace.m_pFace != face) {
+ return FALSE;
+ }
+ } else if (m_Type == 2) {
+ int i;
+ for (i = 0; i < 16; i ++)
+ if (m_TTCFace.m_pFaces[i] == face) {
+ break;
+ }
+ if (i == 16) {
+ return FALSE;
+ }
+ }
+ m_RefCount --;
+ if (m_RefCount) {
+ return FALSE;
+ }
+ delete this;
+ return TRUE;
+}
+CFX_FontMgr::CFX_FontMgr()
+{
+ m_pBuiltinMapper = FX_NEW CFX_FontMapper;
+ if (!m_pBuiltinMapper) {
+ return;
+ }
+ m_pBuiltinMapper->m_pFontMgr = this;
+ m_pExtMapper = NULL;
+ m_FTLibrary = NULL;
+ FXSYS_memset32(m_ExternalFonts, 0, sizeof m_ExternalFonts);
+}
+CFX_FontMgr::~CFX_FontMgr()
+{
+ if (m_pBuiltinMapper) {
+ delete m_pBuiltinMapper;
+ }
+ FreeCache();
+ if (m_FTLibrary) {
+ FXFT_Done_FreeType(m_FTLibrary);
+ }
+}
+void CFX_FontMgr::InitFTLibrary()
+{
+ if (m_FTLibrary == NULL) {
+ FXFT_Init_FreeType(&m_FTLibrary);
+ }
+}
+void CFX_FontMgr::FreeCache()
+{
+ FX_POSITION pos = m_FaceMap.GetStartPosition();
+ while(pos) {
+ CFX_ByteString Key;
+ CTTFontDesc* face;
+ m_FaceMap.GetNextAssoc(pos, Key, (void*&)face);
+ delete face;
+ }
+ m_FaceMap.RemoveAll();
+}
+void CFX_FontMgr::SetSystemFontInfo(IFX_SystemFontInfo* pFontInfo)
+{
+ m_pBuiltinMapper->SetSystemFontInfo(pFontInfo);
+}
+FXFT_Face CFX_FontMgr::FindSubstFont(const CFX_ByteString& face_name, FX_BOOL bTrueType,
+ FX_DWORD flags, int weight, int italic_angle, int CharsetCP, CFX_SubstFont* pSubstFont)
+{
+ if (m_FTLibrary == NULL) {
+ FXFT_Init_FreeType(&m_FTLibrary);
+ }
+ if (m_pExtMapper) {
+ FXFT_Face face = m_pExtMapper->FindSubstFont(face_name, bTrueType, flags, weight, italic_angle,
+ CharsetCP, pSubstFont);
+ if (face) {
+ return face;
+ }
+ }
+ return m_pBuiltinMapper->FindSubstFont(face_name, bTrueType, flags, weight, italic_angle,
+ CharsetCP, pSubstFont);
+}
+FXFT_Face CFX_FontMgr::GetCachedFace(const CFX_ByteString& face_name,
+ int weight, FX_BOOL bItalic, FX_LPBYTE& pFontData)
+{
+ CFX_ByteString key(face_name);
+ key += ',';
+ key += CFX_ByteString::FormatInteger(weight);
+ key += bItalic ? 'I' : 'N';
+ CTTFontDesc* pFontDesc = NULL;
+ m_FaceMap.Lookup(key, (void*&)pFontDesc);
+ if(pFontDesc) {
+ pFontData = pFontDesc->m_pFontData;
+ pFontDesc->m_RefCount ++;
+ return pFontDesc->m_SingleFace.m_pFace;
+ }
+ return NULL;
+}
+FXFT_Face CFX_FontMgr::AddCachedFace(const CFX_ByteString& face_name,
+ int weight, FX_BOOL bItalic, FX_LPBYTE pData, FX_DWORD size, int face_index)
+{
+ CTTFontDesc* pFontDesc = FX_NEW CTTFontDesc;
+ if (!pFontDesc) {
+ return NULL;
+ }
+ pFontDesc->m_Type = 1;
+ pFontDesc->m_SingleFace.m_pFace = NULL;
+ pFontDesc->m_SingleFace.m_bBold = weight;
+ pFontDesc->m_SingleFace.m_bItalic = bItalic;
+ pFontDesc->m_pFontData = pData;
+ pFontDesc->m_RefCount = 1;
+ FXFT_Library library;
+ if (m_FTLibrary == NULL) {
+ FXFT_Init_FreeType(&m_FTLibrary);
+ }
+ library = m_FTLibrary;
+ int ret = FXFT_New_Memory_Face(library, pData, size, face_index, &pFontDesc->m_SingleFace.m_pFace);
+ if (ret) {
+ delete pFontDesc;
+ return NULL;
+ }
+ ret = FXFT_Set_Pixel_Sizes(pFontDesc->m_SingleFace.m_pFace, 64, 64);
+ if (ret) {
+ delete pFontDesc;
+ return NULL;
+ }
+ CFX_ByteString key(face_name);
+ key += ',';
+ key += CFX_ByteString::FormatInteger(weight);
+ key += bItalic ? 'I' : 'N';
+ m_FaceMap.SetAt(key, pFontDesc);
+ return pFontDesc->m_SingleFace.m_pFace;
+}
+const FX_LPCSTR g_Base14FontNames[14] = {
+ "Courier",
+ "Courier-Bold",
+ "Courier-BoldOblique",
+ "Courier-Oblique",
+ "Helvetica",
+ "Helvetica-Bold",
+ "Helvetica-BoldOblique",
+ "Helvetica-Oblique",
+ "Times-Roman",
+ "Times-Bold",
+ "Times-BoldItalic",
+ "Times-Italic",
+ "Symbol",
+ "ZapfDingbats",
+};
+const struct _AltFontName {
+ const FX_CHAR* m_pName;
+ int m_Index;
+}
+g_AltFontNames[] = {
+ {"Arial", 4},
+ {"Arial,Bold", 5},
+ {"Arial,BoldItalic", 6},
+ {"Arial,Italic", 7},
+ {"Arial-Bold", 5},
+ {"Arial-BoldItalic", 6},
+ {"Arial-BoldItalicMT", 6},
+ {"Arial-BoldMT", 5},
+ {"Arial-Italic", 7},
+ {"Arial-ItalicMT", 7},
+ {"ArialBold", 5},
+ {"ArialBoldItalic", 6},
+ {"ArialItalic", 7},
+ {"ArialMT", 4},
+ {"ArialMT,Bold", 5},
+ {"ArialMT,BoldItalic", 6},
+ {"ArialMT,Italic", 7},
+ {"ArialRoundedMTBold", 5},
+ {"Courier", 0},
+ {"Courier,Bold", 1},
+ {"Courier,BoldItalic", 2},
+ {"Courier,Italic", 3},
+ {"Courier-Bold", 1},
+ {"Courier-BoldOblique", 2},
+ {"Courier-Oblique", 3},
+ {"CourierBold", 1},
+ {"CourierBoldItalic", 2},
+ {"CourierItalic", 3},
+ {"CourierNew", 0},
+ {"CourierNew,Bold", 1},
+ {"CourierNew,BoldItalic", 2},
+ {"CourierNew,Italic", 3},
+ {"CourierNew-Bold", 1},
+ {"CourierNew-BoldItalic", 2},
+ {"CourierNew-Italic", 3},
+ {"CourierNewBold", 1},
+ {"CourierNewBoldItalic", 2},
+ {"CourierNewItalic", 3},
+ {"CourierNewPS-BoldItalicMT", 2},
+ {"CourierNewPS-BoldMT", 1},
+ {"CourierNewPS-ItalicMT", 3},
+ {"CourierNewPSMT", 0},
+ {"CourierStd", 0},
+ {"CourierStd-Bold", 1},
+ {"CourierStd-BoldOblique", 2},
+ {"CourierStd-Oblique", 3},
+ {"Helvetica", 4},
+ {"Helvetica,Bold", 5},
+ {"Helvetica,BoldItalic", 6},
+ {"Helvetica,Italic", 7},
+ {"Helvetica-Bold", 5},
+ {"Helvetica-BoldItalic", 6},
+ {"Helvetica-BoldOblique", 6},
+ {"Helvetica-Italic", 7},
+ {"Helvetica-Oblique", 7},
+ {"HelveticaBold", 5},
+ {"HelveticaBoldItalic", 6},
+ {"HelveticaItalic", 7},
+ {"Symbol", 12},
+ {"SymbolMT", 12},
+ {"Times-Bold", 9},
+ {"Times-BoldItalic", 10},
+ {"Times-Italic", 11},
+ {"Times-Roman", 8},
+ {"TimesBold", 9},
+ {"TimesBoldItalic", 10},
+ {"TimesItalic", 11},
+ {"TimesNewRoman", 8},
+ {"TimesNewRoman,Bold", 9},
+ {"TimesNewRoman,BoldItalic", 10},
+ {"TimesNewRoman,Italic", 11},
+ {"TimesNewRoman-Bold", 9},
+ {"TimesNewRoman-BoldItalic", 10},
+ {"TimesNewRoman-Italic", 11},
+ {"TimesNewRomanBold", 9},
+ {"TimesNewRomanBoldItalic", 10},
+ {"TimesNewRomanItalic", 11},
+ {"TimesNewRomanPS", 8},
+ {"TimesNewRomanPS-Bold", 9},
+ {"TimesNewRomanPS-BoldItalic", 10},
+ {"TimesNewRomanPS-BoldItalicMT", 10},
+ {"TimesNewRomanPS-BoldMT", 9},
+ {"TimesNewRomanPS-Italic", 11},
+ {"TimesNewRomanPS-ItalicMT", 11},
+ {"TimesNewRomanPSMT", 8},
+ {"TimesNewRomanPSMT,Bold", 9},
+ {"TimesNewRomanPSMT,BoldItalic", 10},
+ {"TimesNewRomanPSMT,Italic", 11},
+ {"ZapfDingbats", 13},
+};
+extern "C" {
+ static int compareString(const void* key, const void* element)
+ {
+ return FXSYS_stricmp((FX_LPCSTR)key, ((_AltFontName*)element)->m_pName);
+ }
+}
+int _PDF_GetStandardFontName(CFX_ByteString& name)
+{
+ _AltFontName* found = (_AltFontName*)FXSYS_bsearch((FX_LPCSTR)name, g_AltFontNames,
+ sizeof g_AltFontNames / sizeof (_AltFontName), sizeof (_AltFontName), compareString);
+ if (found == NULL) {
+ return -1;
+ }
+ name = g_Base14FontNames[found->m_Index];
+ return found->m_Index;
+}
+int GetTTCIndex(FX_LPCBYTE pFontData, FX_DWORD ttc_size, FX_DWORD font_offset)
+{
+ int face_index = 0;
+ FX_LPCBYTE p = pFontData + 8;
+ FX_DWORD nfont = GET_TT_LONG(p);
+ FX_DWORD index;
+ for (index = 0; index < nfont; index ++) {
+ p = pFontData + 12 + index * 4;
+ if (GET_TT_LONG(p) == font_offset) {
+ break;
+ }
+ }
+ if(index >= nfont) {
+ face_index = 0;
+ } else {
+ face_index = index;
+ }
+ return face_index;
+}
+FXFT_Face CFX_FontMgr::GetCachedTTCFace(int ttc_size, FX_DWORD checksum,
+ int font_offset, FX_LPBYTE& pFontData)
+{
+ CFX_ByteString key;
+ key.Format("%d:%d", ttc_size, checksum);
+ CTTFontDesc* pFontDesc = NULL;
+ m_FaceMap.Lookup(key, (void*&)pFontDesc);
+ if (pFontDesc == NULL) {
+ return NULL;
+ }
+ pFontData = pFontDesc->m_pFontData;
+ pFontDesc->m_RefCount ++;
+ int face_index = GetTTCIndex(pFontDesc->m_pFontData, ttc_size, font_offset);
+ if (pFontDesc->m_TTCFace.m_pFaces[face_index] == NULL) {
+ pFontDesc->m_TTCFace.m_pFaces[face_index] = GetFixedFace(pFontDesc->m_pFontData, ttc_size, face_index);
+ }
+ return pFontDesc->m_TTCFace.m_pFaces[face_index];
+}
+FXFT_Face CFX_FontMgr::AddCachedTTCFace(int ttc_size, FX_DWORD checksum,
+ FX_LPBYTE pData, FX_DWORD size, int font_offset)
+{
+ CFX_ByteString key;
+ key.Format("%d:%d", ttc_size, checksum);
+ CTTFontDesc* pFontDesc = FX_NEW CTTFontDesc;
+ if (!pFontDesc) {
+ return NULL;
+ }
+ pFontDesc->m_Type = 2;
+ pFontDesc->m_pFontData = pData;
+ for (int i = 0; i < 16; i ++) {
+ pFontDesc->m_TTCFace.m_pFaces[i] = NULL;
+ }
+ pFontDesc->m_RefCount ++;
+ key.Format("%d:%d", ttc_size, checksum);
+ m_FaceMap.SetAt(key, pFontDesc);
+ int face_index = GetTTCIndex(pFontDesc->m_pFontData, ttc_size, font_offset);
+ pFontDesc->m_TTCFace.m_pFaces[face_index] = GetFixedFace(pFontDesc->m_pFontData, ttc_size, face_index);
+ return pFontDesc->m_TTCFace.m_pFaces[face_index];
+}
+FXFT_Face CFX_FontMgr::GetFixedFace(FX_LPCBYTE pData, FX_DWORD size, int face_index)
+{
+ FXFT_Library library;
+ if (m_FTLibrary == NULL) {
+ FXFT_Init_FreeType(&m_FTLibrary);
+ }
+ library = m_FTLibrary;
+ FXFT_Face face = NULL;
+ int ret = FXFT_New_Memory_Face(library, pData, size, face_index, &face);
+ if (ret) {
+ return NULL;
+ }
+ ret = FXFT_Set_Pixel_Sizes(face, 64, 64);
+ if (ret) {
+ return NULL;
+ }
+ return face;
+}
+FXFT_Face CFX_FontMgr::GetFileFace(FX_LPCSTR filename, int face_index)
+{
+ FXFT_Library library;
+ if (m_FTLibrary == NULL) {
+ FXFT_Init_FreeType(&m_FTLibrary);
+ }
+ library = m_FTLibrary;
+ FXFT_Face face = NULL;
+ int ret = FXFT_New_Face(library, filename, face_index, &face);
+ if (ret) {
+ return NULL;
+ }
+ ret = FXFT_Set_Pixel_Sizes(face, 64, 64);
+ if (ret) {
+ return NULL;
+ }
+ return face;
+}
+void CFX_FontMgr::ReleaseFace(FXFT_Face face)
+{
+ if (face == NULL) {
+ return;
+ }
+ FX_POSITION pos = m_FaceMap.GetStartPosition();
+ while(pos) {
+ CFX_ByteString Key;
+ CTTFontDesc* ttface;
+ m_FaceMap.GetNextAssoc(pos, Key, (void*&)ttface);
+ if (ttface->ReleaseFace(face)) {
+ m_FaceMap.RemoveKey(Key);
+ }
+ }
+}
+extern "C" {
+ extern const unsigned char g_FoxitFixedItalicFontData [18746];
+ extern const unsigned char g_FoxitFixedFontData [17597];
+ extern const unsigned char g_FoxitSansItalicFontData [16339];
+ extern const unsigned char g_FoxitSansFontData [15025];
+ extern const unsigned char g_FoxitSerifItalicFontData [21227];
+ extern const unsigned char g_FoxitSerifFontData [19469];
+ extern const unsigned char g_FoxitFixedBoldItalicFontData [19151];
+ extern const unsigned char g_FoxitFixedBoldFontData [18055];
+ extern const unsigned char g_FoxitSansBoldItalicFontData [16418];
+ extern const unsigned char g_FoxitSansBoldFontData [16344];
+ extern const unsigned char g_FoxitSerifBoldItalicFontData [20733];
+ extern const unsigned char g_FoxitSerifBoldFontData [19395];
+ extern const unsigned char g_FoxitSymbolFontData[16729];
+ extern const unsigned char g_FoxitDingbatsFontData[29513];
+ extern const unsigned char g_FoxitSerifMMFontData[113417];
+ extern const unsigned char g_FoxitSansMMFontData[66919];
+};
+const FoxitFonts g_FoxitFonts[14] = {
+ {g_FoxitFixedFontData, 17597},
+ {g_FoxitFixedBoldFontData, 18055},
+ {g_FoxitFixedBoldItalicFontData, 19151},
+ {g_FoxitFixedItalicFontData, 18746},
+ {g_FoxitSansFontData, 15025},
+ {g_FoxitSansBoldFontData, 16344},
+ {g_FoxitSansBoldItalicFontData, 16418},
+ {g_FoxitSansItalicFontData, 16339},
+ {g_FoxitSerifFontData, 19469},
+ {g_FoxitSerifBoldFontData, 19395},
+ {g_FoxitSerifBoldItalicFontData, 20733},
+ {g_FoxitSerifItalicFontData, 21227},
+ {g_FoxitSymbolFontData, 16729},
+ {g_FoxitDingbatsFontData, 29513},
+};
+void _FPDFAPI_GetInternalFontData(int id, FX_LPCBYTE& data, FX_DWORD& size)
+{
+ CFX_GEModule::Get()->GetFontMgr()->GetStandardFont(data, size, id);
+}
+FX_BOOL CFX_FontMgr::GetStandardFont(FX_LPCBYTE& pFontData, FX_DWORD& size, int index)
+{
+ if (index > 15 || index < 0) {
+ return FALSE;
+ }
+ {
+ if (index >= 14) {
+ if (index == 14) {
+ pFontData = g_FoxitSerifMMFontData;
+ size = 113417;
+ } else {
+ pFontData = g_FoxitSansMMFontData;
+ size = 66919;
+ }
+ } else {
+ pFontData = g_FoxitFonts[index].m_pFontData;
+ size = g_FoxitFonts[index].m_dwSize;
+ }
+ }
+ return TRUE;
+}
+CFX_FontMapper::CFX_FontMapper()
+{
+ FXSYS_memset32(m_FoxitFaces, 0, sizeof m_FoxitFaces);
+ m_MMFaces[0] = m_MMFaces[1] = NULL;
+ m_pFontInfo = NULL;
+ m_bListLoaded = FALSE;
+ m_pFontEnumerator = NULL;
+}
+CFX_FontMapper::~CFX_FontMapper()
+{
+ for (int i = 0; i < 14; i ++)
+ if (m_FoxitFaces[i]) {
+ FXFT_Done_Face(m_FoxitFaces[i]);
+ }
+ if (m_MMFaces[0]) {
+ FXFT_Done_Face(m_MMFaces[0]);
+ }
+ if (m_MMFaces[1]) {
+ FXFT_Done_Face(m_MMFaces[1]);
+ }
+ if (m_pFontInfo) {
+ m_pFontInfo->Release();
+ }
+}
+void CFX_FontMapper::SetSystemFontInfo(IFX_SystemFontInfo* pFontInfo)
+{
+ if (pFontInfo == NULL) {
+ return;
+ }
+ if (m_pFontInfo) {
+ m_pFontInfo->Release();
+ }
+ m_pFontInfo = pFontInfo;
+}
+static CFX_ByteString _TT_NormalizeName(FX_LPCSTR family)
+{
+ CFX_ByteString norm(family, -1);
+ norm.Remove(' ');
+ norm.Remove('-');
+ norm.Remove(',');
+ int pos = norm.Find('+');
+ if (pos > 0) {
+ norm = norm.Left(pos);
+ }
+ norm.MakeLower();
+ return norm;
+}
+CFX_ByteString _FPDF_GetNameFromTT(FX_LPCBYTE name_table, FX_DWORD name_id)
+{
+ FX_LPCBYTE ptr = name_table + 2;
+ int name_count = GET_TT_SHORT(ptr);
+ int string_offset = GET_TT_SHORT(ptr + 2);
+ FX_LPCBYTE string_ptr = name_table + string_offset;
+ ptr += 4;
+ for (int i = 0; i < name_count; i ++) {
+ if (GET_TT_SHORT(ptr + 6) == name_id && GET_TT_SHORT(ptr) == 1 && GET_TT_SHORT(ptr + 2) == 0) {
+ return CFX_ByteStringC(string_ptr + GET_TT_SHORT(ptr + 10), GET_TT_SHORT(ptr + 8));
+ }
+ ptr += 12;
+ }
+ return CFX_ByteString();
+}
+static CFX_ByteString _FPDF_ReadStringFromFile(FXSYS_FILE* pFile, FX_DWORD size)
+{
+ CFX_ByteString buffer;
+ if (!FXSYS_fread(buffer.GetBuffer(size), size, 1, pFile)) {
+ return CFX_ByteString();
+ }
+ buffer.ReleaseBuffer(size);
+ return buffer;
+}
+static CFX_ByteString _FPDF_ReadStringFromStreamFile(IFX_FileStream* pFile, FX_DWORD size)
+{
+ CFX_ByteString buffer;
+ if (!pFile->ReadBlock(buffer.GetBuffer(size), size)) {
+ return CFX_ByteString();
+ }
+ buffer.ReleaseBuffer(size);
+ return buffer;
+}
+CFX_ByteString _FPDF_LoadTableFromTT(FXSYS_FILE* pFile, FX_LPCBYTE pTables, FX_DWORD nTables, FX_DWORD tag)
+{
+ for (FX_DWORD i = 0; i < nTables; i ++) {
+ FX_LPCBYTE p = pTables + i * 16;
+ if (GET_TT_LONG(p) == tag) {
+ FX_DWORD offset = GET_TT_LONG(p + 8);
+ FX_DWORD size = GET_TT_LONG(p + 12);
+ FXSYS_fseek(pFile, offset, FXSYS_SEEK_SET);
+ return _FPDF_ReadStringFromFile(pFile, size);
+ }
+ }
+ return CFX_ByteString();
+}
+CFX_ByteString _FPDF_LoadTableFromTTStreamFile(IFX_FileStream* pFile, FX_LPCBYTE pTables, FX_DWORD nTables, FX_DWORD tag)
+{
+ for (FX_DWORD i = 0; i < nTables; i ++) {
+ FX_LPCBYTE p = pTables + i * 16;
+ if (GET_TT_LONG(p) == tag) {
+ FX_DWORD offset = GET_TT_LONG(p + 8);
+ FX_DWORD size = GET_TT_LONG(p + 12);
+ CFX_ByteString buffer;
+ if (!pFile->ReadBlock(buffer.GetBuffer(size), offset, size)) {
+ return CFX_ByteString();
+ }
+ buffer.ReleaseBuffer(size);
+ return buffer;
+ }
+ }
+ return CFX_ByteString();
+}
+CFX_ByteString CFX_FontMapper::GetPSNameFromTT(void* hFont)
+{
+ if (m_pFontInfo == NULL) {
+ CFX_ByteString();
+ }
+ CFX_ByteString result;
+ FX_DWORD size = m_pFontInfo->GetFontData(hFont, 0x6e616d65, NULL, 0);
+ if (size) {
+ FX_LPBYTE buffer = FX_Alloc(FX_BYTE, size);
+ if (!buffer) {
+ return result;
+ }
+ m_pFontInfo->GetFontData(hFont, 0x6e616d65, buffer, size);
+ result = _FPDF_GetNameFromTT(buffer, 6);
+ FX_Free(buffer);
+ }
+ return result;
+}
+void CFX_FontMapper::AddInstalledFont(const CFX_ByteString& name, int charset)
+{
+ if (m_pFontInfo == NULL) {
+ return;
+ }
+ if (m_CharsetArray.Find((FX_DWORD)charset) == -1) {
+ m_CharsetArray.Add((FX_DWORD)charset);
+ m_FaceArray.Add(name);
+ }
+ if (name == m_LastFamily) {
+ return;
+ }
+ FX_LPCBYTE ptr = name;
+ FX_BOOL bLocalized = FALSE;
+ for (int i = 0; i < name.GetLength(); i ++)
+ if (ptr[i] > 0x80) {
+ bLocalized = TRUE;
+ break;
+ }
+ if (bLocalized) {
+ void* hFont = m_pFontInfo->GetFont(name);
+ if (hFont == NULL) {
+ FX_BOOL bExact;
+ hFont = m_pFontInfo->MapFont(0, 0, FXFONT_DEFAULT_CHARSET, 0, name, bExact);
+ if (hFont == NULL) {
+ return;
+ }
+ }
+ CFX_ByteString new_name = GetPSNameFromTT(hFont);
+ if (!new_name.IsEmpty()) {
+ new_name.Insert(0, ' ');
+ m_InstalledTTFonts.Add(new_name);
+ }
+ m_pFontInfo->DeleteFont(hFont);
+ }
+ m_InstalledTTFonts.Add(name);
+ m_LastFamily = name;
+}
+void CFX_FontMapper::LoadInstalledFonts()
+{
+ if (m_pFontInfo == NULL) {
+ return;
+ }
+ if (m_bListLoaded) {
+ return;
+ }
+ if (m_bListLoaded) {
+ return;
+ }
+ m_pFontInfo->EnumFontList(this);
+ m_bListLoaded = TRUE;
+}
+CFX_ByteString CFX_FontMapper::MatchInstalledFonts(const CFX_ByteString& norm_name)
+{
+ LoadInstalledFonts();
+ int i;
+ for (i = m_InstalledTTFonts.GetSize() - 1; i >= 0; i --) {
+ CFX_ByteString norm1 = _TT_NormalizeName(m_InstalledTTFonts[i]);
+ if (norm1 == norm_name) {
+ break;
+ }
+ }
+ if (i < 0) {
+ return CFX_ByteString();
+ }
+ CFX_ByteString match = m_InstalledTTFonts[i];
+ if (match[0] == ' ') {
+ match = m_InstalledTTFonts[i + 1];
+ }
+ return match;
+}
+typedef struct _CHARSET_MAP_ {
+ FX_BYTE charset;
+ FX_WORD codepage;
+} CHARSET_MAP;
+static const CHARSET_MAP g_Codepage2CharsetTable[] = {
+ { 1 , 0 },
+ { 2 , 42 },
+ { 254, 437 },
+ { 255, 850 },
+ { 222, 874 },
+ { 128, 932 },
+ { 134, 936 },
+ { 129, 949 },
+ { 136, 950 },
+ { 238, 1250 },
+ { 204, 1251 },
+ { 0, 1252 },
+ { 161, 1253 },
+ { 162, 1254 },
+ { 177, 1255 },
+ { 178, 1256 },
+ { 186, 1257 },
+ { 163, 1258 },
+ { 130, 1361 },
+ { 77, 10000 },
+ { 78, 10001 },
+ { 79, 10003 },
+ { 80, 10008 },
+ { 81, 10002 },
+ { 83, 10005 },
+ { 84, 10004 },
+ { 85, 10006 },
+ { 86, 10081 },
+ { 87, 10021 },
+ { 88, 10029 },
+ { 89, 10007 },
+};
+FX_BYTE _GetCharsetFromCodePage(FX_WORD codepage)
+{
+ FX_INT32 iEnd = sizeof(g_Codepage2CharsetTable) / sizeof(CHARSET_MAP) - 1;
+ FXSYS_assert(iEnd >= 0);
+ FX_INT32 iStart = 0, iMid;
+ do {
+ iMid = (iStart + iEnd) / 2;
+ const CHARSET_MAP & cp = g_Codepage2CharsetTable[iMid];
+ if (codepage == cp.codepage) {
+ return cp.charset;
+ } else if (codepage < cp.codepage) {
+ iEnd = iMid - 1;
+ } else {
+ iStart = iMid + 1;
+ }
+ } while (iStart <= iEnd);
+ return 1;
+}
+FX_DWORD _GetCodePageRangeFromCharset(int charset)
+{
+ if (charset == FXFONT_EASTEUROPE_CHARSET) {
+ return 1 << 1;
+ }
+ if (charset == FXFONT_GREEK_CHARSET) {
+ return 1 << 3;
+ }
+ if (charset == FXFONT_TURKISH_CHARSET) {
+ return 1 << 4;
+ }
+ if (charset == FXFONT_HEBREW_CHARSET) {
+ return 1 << 5;
+ }
+ if (charset == FXFONT_ARABIC_CHARSET) {
+ return 1 << 6;
+ }
+ if (charset == FXFONT_BALTIC_CHARSET) {
+ return 1 << 7;
+ }
+ if (charset == FXFONT_THAI_CHARSET) {
+ return 1 << 16;
+ }
+ if (charset == FXFONT_SHIFTJIS_CHARSET) {
+ return 1 << 17;
+ }
+ if (charset == FXFONT_GB2312_CHARSET) {
+ return 1 << 18;
+ }
+ if (charset == FXFONT_CHINESEBIG5_CHARSET) {
+ return 1 << 20;
+ }
+ if (charset == FXFONT_HANGEUL_CHARSET) {
+ return 1 << 19;
+ }
+ if (charset == FXFONT_SYMBOL_CHARSET) {
+ return 1 << 31;
+ }
+ return 1 << 21;
+}
+static int CP2CharSet(int cp)
+{
+ if(cp == 932) {
+ return FXFONT_SHIFTJIS_CHARSET;
+ } else if(cp == 936) {
+ return FXFONT_GB2312_CHARSET;
+ } else if(cp == 949) {
+ return FXFONT_HANGEUL_CHARSET;
+ } else if(cp == 950) {
+ return FXFONT_CHINESEBIG5_CHARSET;
+ }
+ return FXFONT_DEFAULT_CHARSET;
+}
+FXFT_Face CFX_FontMapper::UseInternalSubst(CFX_SubstFont* pSubstFont, int iBaseFont, int italic_angle, int weight, int picthfamily)
+{
+ if (iBaseFont < 12) {
+ if (m_FoxitFaces[iBaseFont]) {
+ return m_FoxitFaces[iBaseFont];
+ }
+ FX_LPCBYTE pFontData = NULL;
+ FX_DWORD size = 0;
+ if (m_pFontMgr->GetStandardFont(pFontData, size, iBaseFont)) {
+ m_FoxitFaces[iBaseFont] = m_pFontMgr->GetFixedFace(pFontData, size, 0);
+ return m_FoxitFaces[iBaseFont];
+ }
+ }
+ pSubstFont->m_SubstFlags |= FXFONT_SUBST_MM;
+ pSubstFont->m_ItalicAngle = italic_angle;
+ if (weight) {
+ pSubstFont->m_Weight = weight;
+ }
+ if (picthfamily & FXFONT_FF_ROMAN) {
+ pSubstFont->m_Weight = pSubstFont->m_Weight * 4 / 5;
+ pSubstFont->m_Family = "Chrome Serif";
+ if (m_MMFaces[1]) {
+ return m_MMFaces[1];
+ }
+ FX_LPCBYTE pFontData = NULL;
+ FX_DWORD size;
+ m_pFontMgr->GetStandardFont(pFontData, size, 14);
+ m_MMFaces[1] = m_pFontMgr->GetFixedFace(pFontData, size, 0);
+ return m_MMFaces[1];
+ }
+ pSubstFont->m_Family = "Chrome Sans";
+ if (m_MMFaces[0]) {
+ return m_MMFaces[0];
+ }
+ FX_LPCBYTE pFontData = NULL;
+ FX_DWORD size = 0;
+ m_pFontMgr->GetStandardFont(pFontData, size, 15);
+ m_MMFaces[0] = m_pFontMgr->GetFixedFace(pFontData, size, 0);
+ return m_MMFaces[0];
+}
+const struct _AltFontFamily {
+ FX_LPCSTR m_pFontName;
+ FX_LPCSTR m_pFontFamily;
+}
+g_AltFontFamilies[] = {
+ {"AGaramondPro", "Adobe Garamond Pro"},
+ {"BankGothicBT-Medium", "BankGothic Md BT"},
+ {"ForteMT", "Forte"},
+};
+extern "C" {
+ static int compareFontFamilyString(const void* key, const void* element)
+ {
+ CFX_ByteString str_key((FX_LPCSTR)key);
+ if (str_key.Find(((_AltFontFamily*)element)->m_pFontName) != -1) {
+ return 0;
+ }
+ return FXSYS_stricmp((FX_LPCSTR)key, ((_AltFontFamily*)element)->m_pFontName);
+ }
+}
+#define FX_FONT_STYLE_None 0x00
+#define FX_FONT_STYLE_Bold 0x01
+#define FX_FONT_STYLE_Italic 0x02
+#define FX_FONT_STYLE_BoldBold 0x04
+static CFX_ByteString _GetFontFamily(CFX_ByteString fontName, int nStyle)
+{
+ if (fontName.Find("Script") >= 0) {
+ if ((nStyle & FX_FONT_STYLE_Bold) == FX_FONT_STYLE_Bold) {
+ fontName = "ScriptMTBold";
+ } else if (fontName.Find("Palace") >= 0) {
+ fontName = "PalaceScriptMT";
+ } else if (fontName.Find("French") >= 0) {
+ fontName = "FrenchScriptMT";
+ } else if (fontName.Find("FreeStyle") >= 0) {
+ fontName = "FreeStyleScript";
+ }
+ return fontName;
+ }
+ _AltFontFamily* found = (_AltFontFamily*)FXSYS_bsearch((FX_LPCSTR)fontName, g_AltFontFamilies,
+ sizeof g_AltFontFamilies / sizeof (_AltFontFamily), sizeof (_AltFontFamily), compareFontFamilyString);
+ if (found == NULL) {
+ return fontName;
+ }
+ return found->m_pFontFamily;
+};
+typedef struct _FX_FontStyle {
+ FX_LPCSTR style;
+ FX_INT32 len;
+} FX_FontStyle;
+const FX_FontStyle g_FontStyles[] = {
+ "Bold", 4,
+ "Italic", 6,
+ "BoldItalic", 10,
+ "Reg", 3,
+ "Regular", 7,
+};
+CFX_ByteString ParseStyle(FX_LPCSTR pStyle, int iLen, int iIndex)
+{
+ CFX_ByteTextBuf buf;
+ if (!iLen || iLen <= iIndex) {
+ return buf.GetByteString();
+ }
+ while (iIndex < iLen) {
+ if (pStyle[iIndex] == ',') {
+ break;
+ }
+ buf.AppendChar(pStyle[iIndex]);
+ ++iIndex;
+ }
+ return buf.GetByteString();
+}
+FX_INT32 GetStyleType(const CFX_ByteString &bsStyle, FX_BOOL bRevert)
+{
+ FX_INT32 iLen = bsStyle.GetLength();
+ if (!iLen) {
+ return -1;
+ }
+ int iSize = sizeof(g_FontStyles) / sizeof(FX_FontStyle);
+ const FX_FontStyle *pStyle = NULL;
+ for (int i = iSize - 1; i >= 0; --i) {
+ pStyle = g_FontStyles + i;
+ if (!pStyle || pStyle->len > iLen) {
+ continue;
+ }
+ if (!bRevert) {
+ if (bsStyle.Left(pStyle->len).Compare(pStyle->style) == 0) {
+ return i;
+ }
+ } else {
+ if (bsStyle.Right(pStyle->len).Compare(pStyle->style) == 0) {
+ return i;
+ }
+ }
+ }
+ return -1;
+}
+FX_BOOL CheckSupportThirdPartFont(CFX_ByteString name, int &PitchFamily)
+{
+ if (name == FX_BSTRC("MyriadPro")) {
+ PitchFamily &= ~FXFONT_FF_ROMAN;
+ return TRUE;
+ }
+ return FALSE;
+}
+FXFT_Face CFX_FontMapper::FindSubstFont(const CFX_ByteString& name, FX_BOOL bTrueType, FX_DWORD flags,
+ int weight, int italic_angle, int WindowCP, CFX_SubstFont* pSubstFont)
+{
+ if (!(flags & FXFONT_USEEXTERNATTR)) {
+ weight = FXFONT_FW_NORMAL;
+ italic_angle = 0;
+ }
+ CFX_ByteString SubstName = name;
+ SubstName.Remove(0x20);
+ if (bTrueType) {
+ if (name[0] == '@') {
+ SubstName = name.Mid(1);
+ }
+ }
+ _PDF_GetStandardFontName(SubstName);
+ if (SubstName == FX_BSTRC("Symbol") && !bTrueType) {
+ pSubstFont->m_Family = "Chrome Symbol";
+ pSubstFont->m_Charset = FXFONT_SYMBOL_CHARSET;
+ pSubstFont->m_SubstFlags |= FXFONT_SUBST_STANDARD;
+ if (m_FoxitFaces[12]) {
+ return m_FoxitFaces[12];
+ }
+ FX_LPCBYTE pFontData = NULL;
+ FX_DWORD size = 0;
+ m_pFontMgr->GetStandardFont(pFontData, size, 12);
+ m_FoxitFaces[12] = m_pFontMgr->GetFixedFace(pFontData, size, 0);
+ return m_FoxitFaces[12];
+ }
+ if (SubstName == FX_BSTRC("ZapfDingbats")) {
+ pSubstFont->m_Family = "Chrome Dingbats";
+ pSubstFont->m_Charset = FXFONT_SYMBOL_CHARSET;
+ pSubstFont->m_SubstFlags |= FXFONT_SUBST_STANDARD;
+ if (m_FoxitFaces[13]) {
+ return m_FoxitFaces[13];
+ }
+ FX_LPCBYTE pFontData = NULL;
+ FX_DWORD size = 0;
+ m_pFontMgr->GetStandardFont(pFontData, size, 13);
+ m_FoxitFaces[13] = m_pFontMgr->GetFixedFace(pFontData, size, 0);
+ return m_FoxitFaces[13];
+ }
+ int iBaseFont = 0;
+ CFX_ByteString family, style;
+ FX_BOOL bHasComma = FALSE;
+ FX_BOOL bHasHypen = FALSE;
+ int find = SubstName.Find(FX_BSTRC(","), 0);
+ if (find >= 0) {
+ family = SubstName.Left(find);
+ _PDF_GetStandardFontName(family);
+ style = SubstName.Mid(find + 1);
+ bHasComma = TRUE;
+ } else {
+ family = SubstName;
+ }
+ for (; iBaseFont < 12; iBaseFont ++)
+ if (family == CFX_ByteStringC(g_Base14FontNames[iBaseFont])) {
+ break;
+ }
+ int PitchFamily = 0;
+ FX_BOOL bItalic = FALSE;
+ FX_DWORD nStyle = 0;
+ FX_BOOL bStyleAvail = FALSE;
+ FX_BOOL bFamilyStyleIsWhole = FALSE;
+ FX_BOOL bNextF = FALSE;
+ if (iBaseFont < 12) {
+ family = g_Base14FontNames[iBaseFont];
+ if ((iBaseFont % 4) == 1 || (iBaseFont % 4) == 2) {
+ nStyle |= FX_FONT_STYLE_Bold;
+ }
+ if ((iBaseFont % 4) / 2) {
+ nStyle |= FX_FONT_STYLE_Italic;
+ }
+ if (iBaseFont < 4) {
+ PitchFamily |= FXFONT_FF_FIXEDPITCH;
+ }
+ if (iBaseFont >= 8) {
+ PitchFamily |= FXFONT_FF_ROMAN;
+ }
+ } else {
+ if (!bHasComma) {
+ find = family.ReverseFind('-');
+ if (find >= 0) {
+ style = family.Mid(find + 1);
+ family = family.Left(find);
+ bHasHypen = TRUE;
+ }
+ }
+ if (!bHasHypen) {
+ int nLen = family.GetLength();
+ FX_INT32 nRet = GetStyleType(family, TRUE);
+ if (nRet > -1) {
+ family = family.Left(nLen - g_FontStyles[nRet].len);
+ if (nRet == 0) {
+ nStyle |= FX_FONT_STYLE_Bold;
+ }
+ if (nRet == 1) {
+ nStyle |= FX_FONT_STYLE_Italic;
+ }
+ if (nRet == 2) {
+ nStyle |= (FX_FONT_STYLE_Bold | FX_FONT_STYLE_Italic);
+ }
+ }
+ }
+ if (flags & FXFONT_SERIF) {
+ PitchFamily |= FXFONT_FF_ROMAN;
+ }
+ if (flags & FXFONT_SCRIPT) {
+ PitchFamily |= FXFONT_FF_SCRIPT;
+ }
+ if (flags & FXFONT_FIXED_PITCH) {
+ PitchFamily |= FXFONT_FF_FIXEDPITCH;
+ }
+ }
+ if (!style.IsEmpty()) {
+ int nLen = style.GetLength();
+ FX_LPCSTR pStyle = style;
+ int i = 0;
+ FX_BOOL bFirstItem = TRUE;
+ CFX_ByteString buf;
+ while (i < nLen) {
+ buf = ParseStyle(pStyle, nLen, i);
+ FX_INT32 nRet = GetStyleType(buf, FALSE);
+ if ((i && !bStyleAvail) || (!i && nRet < 0)) {
+ family = SubstName;
+ iBaseFont = 12;
+ break;
+ } else if (nRet >= 0) {
+ bStyleAvail = TRUE;
+ }
+ if (nRet == 0) {
+ if (nStyle & FX_FONT_STYLE_Bold) {
+ nStyle |= FX_FONT_STYLE_BoldBold;
+ } else {
+ nStyle |= FX_FONT_STYLE_Bold;
+ }
+ bFirstItem = FALSE;
+ }
+ if (nRet == 1) {
+ if (bFirstItem) {
+ nStyle |= FX_FONT_STYLE_Italic;
+ } else {
+ family = SubstName;
+ iBaseFont = 12;
+ }
+ break;
+ }
+ if (nRet == 2) {
+ nStyle |= FX_FONT_STYLE_Italic;
+ if (nStyle & FX_FONT_STYLE_Bold) {
+ nStyle |= FX_FONT_STYLE_BoldBold;
+ } else {
+ nStyle |= FX_FONT_STYLE_Bold;
+ }
+ bFirstItem = FALSE;
+ }
+ i += buf.GetLength() + 1;
+ }
+ }
+ weight = weight ? weight : FXFONT_FW_NORMAL;
+ int old_weight = weight;
+ if (nStyle) {
+ weight = nStyle & FX_FONT_STYLE_BoldBold ? 900 : (nStyle & FX_FONT_STYLE_Bold ? FXFONT_FW_BOLD : FXFONT_FW_NORMAL);
+ }
+ if (nStyle & FX_FONT_STYLE_Italic) {
+ bItalic = TRUE;
+ }
+ FX_BOOL bCJK = FALSE;
+ FX_BOOL bExact = FALSE;
+ int Charset = FXFONT_ANSI_CHARSET;
+ if (WindowCP) {
+ Charset = _GetCharsetFromCodePage(WindowCP);
+ } else if (iBaseFont == 12 && (flags & FXFONT_SYMBOLIC)) {
+ Charset = FXFONT_SYMBOL_CHARSET;
+ }
+ if (Charset == FXFONT_SHIFTJIS_CHARSET || Charset == FXFONT_GB2312_CHARSET ||
+ Charset == FXFONT_HANGEUL_CHARSET || Charset == FXFONT_CHINESEBIG5_CHARSET) {
+ bCJK = TRUE;
+ }
+ if (m_pFontInfo == NULL) {
+ pSubstFont->m_SubstFlags |= FXFONT_SUBST_STANDARD;
+ return UseInternalSubst(pSubstFont, iBaseFont, italic_angle, old_weight, PitchFamily);
+ }
+ family = _GetFontFamily(family, nStyle);
+ CFX_ByteString match = MatchInstalledFonts(_TT_NormalizeName(family));
+ if (match.IsEmpty() && family != SubstName && (!bHasComma && (!bHasHypen || (bHasHypen && !bStyleAvail)))) {
+ match = MatchInstalledFonts(_TT_NormalizeName(SubstName));
+ }
+ if (match.IsEmpty() && iBaseFont >= 12) {
+ if (!bCJK) {
+ if (!CheckSupportThirdPartFont(family, PitchFamily)) {
+ if (italic_angle != 0) {
+ bItalic = TRUE;
+ } else {
+ bItalic = FALSE;
+ }
+ weight = old_weight;
+ }
+ } else {
+ pSubstFont->m_bSubstOfCJK = TRUE;
+ if (nStyle) {
+ pSubstFont->m_WeightCJK = weight;
+ } else {
+ pSubstFont->m_WeightCJK = FXFONT_FW_NORMAL;
+ }
+ if (nStyle & FX_FONT_STYLE_Italic) {
+ pSubstFont->m_bItlicCJK = TRUE;
+ }
+ }
+ } else {
+ italic_angle = 0;
+ weight = nStyle & FX_FONT_STYLE_BoldBold ? 900 : (nStyle & FX_FONT_STYLE_Bold ? FXFONT_FW_BOLD : FXFONT_FW_NORMAL);
+ }
+ if (!match.IsEmpty() || iBaseFont < 12) {
+ pSubstFont->m_SubstFlags |= FXFONT_SUBST_EXACT;
+ if (!match.IsEmpty()) {
+ family = match;
+ }
+ if (iBaseFont < 12) {
+ if (nStyle && !(iBaseFont % 4)) {
+ if ((nStyle & 0x3) == 1) {
+ iBaseFont += 1;
+ }
+ if ((nStyle & 0x3) == 2) {
+ iBaseFont += 3;
+ }
+ if ((nStyle & 0x3) == 3) {
+ iBaseFont += 2;
+ }
+ }
+ if (m_pFontMgr->m_ExternalFonts[iBaseFont].m_pFontData) {
+ if (m_FoxitFaces[iBaseFont]) {
+ return m_FoxitFaces[iBaseFont];
+ }
+ m_FoxitFaces[iBaseFont] = m_pFontMgr->GetFixedFace(m_pFontMgr->m_ExternalFonts[iBaseFont].m_pFontData,
+ m_pFontMgr->m_ExternalFonts[iBaseFont].m_dwSize, 0);
+ if (m_FoxitFaces[iBaseFont]) {
+ return m_FoxitFaces[iBaseFont];
+ }
+ } else {
+ family = g_Base14FontNames[iBaseFont];
+ }
+ pSubstFont->m_SubstFlags |= FXFONT_SUBST_STANDARD;
+ }
+ } else {
+ if (flags & FXFONT_ITALIC) {
+ bItalic = TRUE;
+ }
+ }
+ bExact = !match.IsEmpty();
+ void* hFont = m_pFontInfo->MapFont(weight, bItalic, Charset, PitchFamily, family, bExact);
+ if (bExact) {
+ pSubstFont->m_SubstFlags |= FXFONT_SUBST_EXACT;
+ }
+ if (hFont == NULL) {
+ if (bCJK) {
+ if (italic_angle != 0) {
+ bItalic = TRUE;
+ } else {
+ bItalic = FALSE;
+ }
+ weight = old_weight;
+ }
+ if (!match.IsEmpty()) {
+ hFont = m_pFontInfo->GetFont(match);
+ if (hFont == NULL) {
+ return UseInternalSubst(pSubstFont, iBaseFont, italic_angle, old_weight, PitchFamily);
+ }
+ } else {
+ if (Charset == FXFONT_SYMBOL_CHARSET) {
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ || _FXM_PLATFORM_ == _FXM_PLATFORM_ANDROID_
+ if (SubstName == FX_BSTRC("Symbol")) {
+ pSubstFont->m_Family = "Chrome Symbol";
+ pSubstFont->m_SubstFlags |= FXFONT_SUBST_STANDARD;
+ pSubstFont->m_Charset = FXFONT_SYMBOL_CHARSET;
+ if (m_FoxitFaces[12]) {
+ return m_FoxitFaces[12];
+ }
+ FX_LPCBYTE pFontData = NULL;
+ FX_DWORD size = 0;
+ m_pFontMgr->GetStandardFont(pFontData, size, 12);
+ m_FoxitFaces[12] = m_pFontMgr->GetFixedFace(pFontData, size, 0);
+ return m_FoxitFaces[12];
+ } else {
+ pSubstFont->m_SubstFlags |= FXFONT_SUBST_NONSYMBOL;
+ return FindSubstFont(family, bTrueType, flags & ~FXFONT_SYMBOLIC, weight, italic_angle, 0, pSubstFont);
+ }
+#else
+ pSubstFont->m_SubstFlags |= FXFONT_SUBST_NONSYMBOL;
+ return FindSubstFont(family, bTrueType, flags & ~FXFONT_SYMBOLIC, weight, italic_angle, 0, pSubstFont);
+#endif
+ }
+ if (Charset == FXFONT_ANSI_CHARSET) {
+ pSubstFont->m_SubstFlags |= FXFONT_SUBST_STANDARD;
+ return UseInternalSubst(pSubstFont, iBaseFont, italic_angle, old_weight, PitchFamily);
+ }
+ int index = m_CharsetArray.Find(Charset);
+ if (index < 0) {
+ return UseInternalSubst(pSubstFont, iBaseFont, italic_angle, old_weight, PitchFamily);
+ } else {
+ hFont = m_pFontInfo->GetFont(m_FaceArray[index]);
+ }
+ }
+ }
+ pSubstFont->m_ExtHandle = m_pFontInfo->RetainFont(hFont);
+ if (hFont == NULL) {
+ return NULL;
+ }
+ m_pFontInfo->GetFaceName(hFont, SubstName);
+ if (Charset == FXFONT_DEFAULT_CHARSET) {
+ m_pFontInfo->GetFontCharset(hFont, Charset);
+ }
+ FX_DWORD ttc_size = m_pFontInfo->GetFontData(hFont, 0x74746366, NULL, 0);
+ FX_DWORD font_size = m_pFontInfo->GetFontData(hFont, 0, NULL, 0);
+ if(font_size == 0 && ttc_size == 0) {
+ m_pFontInfo->DeleteFont(hFont);
+ return NULL;
+ }
+ FXFT_Face face = NULL;
+ if (ttc_size) {
+ FX_BYTE temp[1024];
+ m_pFontInfo->GetFontData(hFont, 0x74746366, temp, 1024);
+ FX_DWORD checksum = 0;
+ for (int i = 0; i < 256; i ++) {
+ checksum += ((FX_DWORD*)temp)[i];
+ }
+ FX_LPBYTE pFontData;
+ face = m_pFontMgr->GetCachedTTCFace(ttc_size, checksum, ttc_size - font_size, pFontData);
+ if (face == NULL) {
+ pFontData = FX_Alloc(FX_BYTE, ttc_size);
+ if (pFontData) {
+ m_pFontInfo->GetFontData(hFont, 0x74746366, pFontData, ttc_size);
+ face = m_pFontMgr->AddCachedTTCFace(ttc_size, checksum, pFontData, ttc_size,
+ ttc_size - font_size);
+ }
+ }
+ } else {
+ FX_LPBYTE pFontData;
+ face = m_pFontMgr->GetCachedFace(SubstName, weight, bItalic, pFontData);
+ if (face == NULL) {
+ pFontData = FX_Alloc(FX_BYTE, font_size);
+ if (!pFontData) {
+ m_pFontInfo->DeleteFont(hFont);
+ return NULL;
+ }
+ m_pFontInfo->GetFontData(hFont, 0, pFontData, font_size);
+ face = m_pFontMgr->AddCachedFace(SubstName, weight, bItalic, pFontData, font_size, m_pFontInfo->GetFaceIndex(hFont));
+ }
+ }
+ if (face == NULL) {
+ m_pFontInfo->DeleteFont(hFont);
+ return NULL;
+ }
+ pSubstFont->m_Family = SubstName;
+ pSubstFont->m_Charset = Charset;
+ FX_BOOL bNeedUpdateWeight = FALSE;
+ if (FXFT_Is_Face_Bold(face)) {
+ if (weight == FXFONT_FW_BOLD) {
+ bNeedUpdateWeight = FALSE;
+ } else {
+ bNeedUpdateWeight = TRUE;
+ }
+ } else {
+ if (weight == FXFONT_FW_NORMAL) {
+ bNeedUpdateWeight = FALSE;
+ } else {
+ bNeedUpdateWeight = TRUE;
+ }
+ }
+ if (bNeedUpdateWeight) {
+ pSubstFont->m_Weight = weight;
+ }
+ if (bItalic && !FXFT_Is_Face_Italic(face)) {
+ if (italic_angle == 0) {
+ italic_angle = -12;
+ } else if (FXSYS_abs(italic_angle) < 5) {
+ italic_angle = 0;
+ }
+ pSubstFont->m_ItalicAngle = italic_angle;
+ }
+ m_pFontInfo->DeleteFont(hFont);
+ return face;
+}
+extern "C" {
+ unsigned long _FTStreamRead(FXFT_Stream stream, unsigned long offset,
+ unsigned char* buffer, unsigned long count);
+ void _FTStreamClose(FXFT_Stream stream);
+};
+CFontFileFaceInfo::CFontFileFaceInfo()
+{
+ m_pFile = NULL;
+ m_Face = NULL;
+ m_Charsets = 0;
+ m_FileSize = 0;
+ m_FontOffset = 0;
+ m_Weight = 0;
+ m_bItalic = FALSE;
+ m_PitchFamily = 0;
+}
+CFontFileFaceInfo::~CFontFileFaceInfo()
+{
+ if (m_Face) {
+ FXFT_Done_Face(m_Face);
+ }
+ m_Face = NULL;
+}
+extern FX_BOOL _LoadFile(FXFT_Library library, FXFT_Face* Face, IFX_FileRead* pFile, FXFT_Stream* stream);
+#if defined(_FPDFAPI_MINI_) || _FX_OS_ == _FX_ANDROID_
+IFX_SystemFontInfo* IFX_SystemFontInfo::CreateDefault()
+{
+ return NULL;
+}
+#endif
+#if !defined(_FPDFAPI_MINI_)
+CFX_FolderFontInfo::CFX_FolderFontInfo()
+{
+}
+CFX_FolderFontInfo::~CFX_FolderFontInfo()
+{
+ FX_POSITION pos = m_FontList.GetStartPosition();
+ while (pos) {
+ CFX_ByteString key;
+ FX_LPVOID value;
+ m_FontList.GetNextAssoc(pos, key, value);
+ delete (CFontFaceInfo*)value;
+ }
+}
+void CFX_FolderFontInfo::AddPath(FX_BSTR path)
+{
+ m_PathList.Add(path);
+}
+void CFX_FolderFontInfo::Release()
+{
+ delete this;
+}
+FX_BOOL CFX_FolderFontInfo::EnumFontList(CFX_FontMapper* pMapper)
+{
+ m_pMapper = pMapper;
+ for (int i = 0; i < m_PathList.GetSize(); i ++) {
+ ScanPath(m_PathList[i]);
+ }
+ return TRUE;
+}
+void CFX_FolderFontInfo::ScanPath(CFX_ByteString& path)
+{
+ void* handle = FX_OpenFolder(path);
+ if (handle == NULL) {
+ return;
+ }
+ CFX_ByteString filename;
+ FX_BOOL bFolder;
+ while (FX_GetNextFile(handle, filename, bFolder)) {
+ if (bFolder) {
+ if (filename == "." || filename == "..") {
+ continue;
+ }
+ } else {
+ CFX_ByteString ext = filename.Right(4);
+ ext.MakeUpper();
+ if (ext != ".TTF" && ext != ".OTF" && ext != ".TTC") {
+ continue;
+ }
+ }
+ CFX_ByteString fullpath = path;
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+ fullpath += "\\";
+#else
+ fullpath += "/";
+#endif
+ fullpath += filename;
+ if (bFolder) {
+ ScanPath(fullpath);
+ } else {
+ ScanFile(fullpath);
+ }
+ }
+ FX_CloseFolder(handle);
+}
+void CFX_FolderFontInfo::ScanFile(CFX_ByteString& path)
+{
+ FXSYS_FILE* pFile = FXSYS_fopen(path, "rb");
+ if (pFile == NULL) {
+ return;
+ }
+ FXSYS_fseek(pFile, 0, FXSYS_SEEK_END);
+ FX_DWORD filesize = FXSYS_ftell(pFile);
+ FX_BYTE buffer[16];
+ FXSYS_fseek(pFile, 0, FXSYS_SEEK_SET);
+ size_t readCnt = FXSYS_fread(buffer, 12, 1, pFile);
+ if (GET_TT_LONG(buffer) == 0x74746366) {
+ FX_DWORD nFaces = GET_TT_LONG(buffer + 8);
+ FX_LPBYTE offsets = FX_Alloc(FX_BYTE, nFaces * 4);
+ if (!offsets) {
+ FXSYS_fclose(pFile);
+ return;
+ }
+ readCnt = FXSYS_fread(offsets, nFaces * 4, 1, pFile);
+ for (FX_DWORD i = 0; i < nFaces; i ++) {
+ FX_LPBYTE p = offsets + i * 4;
+ ReportFace(path, pFile, filesize, GET_TT_LONG(p));
+ }
+ FX_Free(offsets);
+ } else {
+ ReportFace(path, pFile, filesize, 0);
+ }
+ FXSYS_fclose(pFile);
+}
+void CFX_FolderFontInfo::ReportFace(CFX_ByteString& path, FXSYS_FILE* pFile, FX_DWORD filesize, FX_DWORD offset)
+{
+ FXSYS_fseek(pFile, offset, FXSYS_SEEK_SET);
+ char buffer[16];
+ if (!FXSYS_fread(buffer, 12, 1, pFile)) {
+ return;
+ }
+ FX_DWORD nTables = GET_TT_SHORT(buffer + 4);
+ CFX_ByteString tables = _FPDF_ReadStringFromFile(pFile, nTables * 16);
+ CFX_ByteString names = _FPDF_LoadTableFromTT(pFile, tables, nTables, 0x6e616d65);
+ CFX_ByteString facename = _FPDF_GetNameFromTT(names, 1);
+ CFX_ByteString style = _FPDF_GetNameFromTT(names, 2);
+ if (style != "Regular") {
+ facename += " " + style;
+ }
+ FX_LPVOID p;
+ if (m_FontList.Lookup(facename, p)) {
+ return;
+ }
+ CFontFaceInfo* pInfo = FX_NEW CFontFaceInfo;
+ if (!pInfo) {
+ return;
+ }
+ pInfo->m_FilePath = path;
+ pInfo->m_FaceName = facename;
+ pInfo->m_FontTables = tables;
+ pInfo->m_FontOffset = offset;
+ pInfo->m_FileSize = filesize;
+ pInfo->m_Charsets = 0;
+ CFX_ByteString os2 = _FPDF_LoadTableFromTT(pFile, tables, nTables, 0x4f532f32);
+ if (os2.GetLength() >= 86) {
+ FX_LPCBYTE p = (FX_LPCBYTE)os2 + 78;
+ FX_DWORD codepages = GET_TT_LONG(p);
+ if (codepages & (1 << 17)) {
+ m_pMapper->AddInstalledFont(facename, FXFONT_SHIFTJIS_CHARSET);
+ pInfo->m_Charsets |= CHARSET_FLAG_SHIFTJIS;
+ }
+ if (codepages & (1 << 18)) {
+ m_pMapper->AddInstalledFont(facename, FXFONT_GB2312_CHARSET);
+ pInfo->m_Charsets |= CHARSET_FLAG_GB;
+ }
+ if (codepages & (1 << 20)) {
+ m_pMapper->AddInstalledFont(facename, FXFONT_CHINESEBIG5_CHARSET);
+ pInfo->m_Charsets |= CHARSET_FLAG_BIG5;
+ }
+ if ((codepages & (1 << 19)) || (codepages & (1 << 21))) {
+ m_pMapper->AddInstalledFont(facename, FXFONT_HANGEUL_CHARSET);
+ pInfo->m_Charsets |= CHARSET_FLAG_KOREAN;
+ }
+ if (codepages & (1 << 31)) {
+ m_pMapper->AddInstalledFont(facename, FXFONT_SYMBOL_CHARSET);
+ pInfo->m_Charsets |= CHARSET_FLAG_SYMBOL;
+ }
+ }
+ m_pMapper->AddInstalledFont(facename, FXFONT_ANSI_CHARSET);
+ pInfo->m_Charsets |= CHARSET_FLAG_ANSI;
+ pInfo->m_Styles = 0;
+ if (style.Find(FX_BSTRC("Bold")) > -1) {
+ pInfo->m_Styles |= FXFONT_BOLD;
+ }
+ if (style.Find(FX_BSTRC("Italic")) > -1 || style.Find(FX_BSTRC("Oblique")) > -1) {
+ pInfo->m_Styles |= FXFONT_ITALIC;
+ }
+ if (facename.Find(FX_BSTRC("Serif")) > -1) {
+ pInfo->m_Styles |= FXFONT_SERIF;
+ }
+ m_FontList.SetAt(facename, pInfo);
+}
+void* CFX_FolderFontInfo::MapFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR family, FX_BOOL& bExact)
+{
+ return NULL;
+}
+void* CFX_FolderFontInfo::GetFont(FX_LPCSTR face)
+{
+ FX_LPVOID p;
+ if (!m_FontList.Lookup(face, p)) {
+ return NULL;
+ }
+ return p;
+}
+FX_DWORD CFX_FolderFontInfo::GetFontData(void* hFont, FX_DWORD table, FX_LPBYTE buffer, FX_DWORD size)
+{
+ if (hFont == NULL) {
+ return 0;
+ }
+ CFontFaceInfo* pFont = (CFontFaceInfo*)hFont;
+ FXSYS_FILE* pFile = NULL;
+ if (size > 0) {
+ pFile = FXSYS_fopen(pFont->m_FilePath, "rb");
+ if (pFile == NULL) {
+ return 0;
+ }
+ }
+ FX_DWORD datasize = 0;
+ FX_DWORD offset;
+ if (table == 0) {
+ datasize = pFont->m_FontOffset ? 0 : pFont->m_FileSize;
+ offset = 0;
+ } else if (table == 0x74746366) {
+ datasize = pFont->m_FontOffset ? pFont->m_FileSize : 0;
+ offset = 0;
+ } else {
+ FX_DWORD nTables = pFont->m_FontTables.GetLength() / 16;
+ for (FX_DWORD i = 0; i < nTables; i ++) {
+ FX_LPCBYTE p = (FX_LPCBYTE)pFont->m_FontTables + i * 16;
+ if (GET_TT_LONG(p) == table) {
+ offset = GET_TT_LONG(p + 8);
+ datasize = GET_TT_LONG(p + 12);
+ }
+ }
+ }
+ if (datasize && size >= datasize && pFile) {
+ FXSYS_fseek(pFile, offset, FXSYS_SEEK_SET);
+ size_t readCnt = FXSYS_fread(buffer, datasize, 1, pFile);
+ }
+ if (pFile) {
+ FXSYS_fclose(pFile);
+ }
+ return datasize;
+}
+void CFX_FolderFontInfo::DeleteFont(void* hFont)
+{
+}
+FX_BOOL CFX_FolderFontInfo::GetFaceName(void* hFont, CFX_ByteString& name)
+{
+ if (hFont == NULL) {
+ return FALSE;
+ }
+ CFontFaceInfo* pFont = (CFontFaceInfo*)hFont;
+ name = pFont->m_FaceName;
+ return TRUE;
+}
+FX_BOOL CFX_FolderFontInfo::GetFontCharset(void* hFont, int& charset)
+{
+ return FALSE;
+}
+#endif
diff --git a/core/src/fxge/ge/fx_ge_linux.cpp b/core/src/fxge/ge/fx_ge_linux.cpp
index 33cfcfe722..735ecac0c8 100644
--- a/core/src/fxge/ge/fx_ge_linux.cpp
+++ b/core/src/fxge/ge/fx_ge_linux.cpp
@@ -1,259 +1,259 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../../include/fxge/fx_ge.h"
-#include "../agg/include/fx_agg_driver.h"
-#include "text_int.h"
-#if !defined(_FPDFAPI_MINI_) && _FXM_PLATFORM_ == _FXM_PLATFORM_LINUX_
-#if (_FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ && (!defined(_FPDFAPI_MINI_)))
-void CFX_AggDeviceDriver::InitPlatform()
-{
-}
-void CFX_AggDeviceDriver::DestroyPlatform()
-{
-}
-void CFX_FaceCache::InitPlatform()
-{
-}
-FX_BOOL CFX_AggDeviceDriver::DrawDeviceText(int nChars, const FXTEXT_CHARPOS* pCharPos, CFX_Font* pFont,
- CFX_FontCache* pCache, const CFX_AffineMatrix* pObject2Device,
- FX_FLOAT font_size, FX_DWORD argb)
-{
- return FALSE;
-}
-CFX_GlyphBitmap* CFX_FaceCache::RenderGlyph_Nativetext(CFX_Font* pFont, FX_DWORD glyph_index, const CFX_AffineMatrix* pMatrix,
- int dest_width, int anti_alias)
-{
- return NULL;
-}
-void CFX_Font::ReleasePlatformResource()
-{
-}
-#endif
-static const struct {
- FX_LPCSTR m_pName;
- FX_LPCSTR m_pSubstName;
-}
-Base14Substs[] = {
- {"Courier", "Courier New"},
- {"Courier-Bold", "Courier New Bold"},
- {"Courier-BoldOblique", "Courier New Bold Italic"},
- {"Courier-Oblique", "Courier New Italic"},
- {"Helvetica", "Arial"},
- {"Helvetica-Bold", "Arial Bold"},
- {"Helvetica-BoldOblique", "Arial Bold Italic"},
- {"Helvetica-Oblique", "Arial Italic"},
- {"Times-Roman", "Times New Roman"},
- {"Times-Bold", "Times New Roman Bold"},
- {"Times-BoldItalic", "Times New Roman Bold Italic"},
- {"Times-Italic", "Times New Roman Italic"},
-};
-class CFX_LinuxFontInfo : public CFX_FolderFontInfo
-{
-public:
- virtual void* MapFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR family, FX_BOOL& bExact);
- FX_BOOL ParseFontCfg();
- void* FindFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR family, FX_BOOL bMatchName);
-};
-#define LINUX_GPNAMESIZE 6
-static const struct {
- FX_LPCSTR NameArr[LINUX_GPNAMESIZE];
-}
-LinuxGpFontList[] = {
- {{"TakaoPGothic", "VL PGothic", "IPAPGothic", "VL Gothic", "Kochi Gothic", "VL Gothic regular"}},
- {{"TakaoGothic", "VL Gothic", "IPAGothic", "Kochi Gothic", NULL, "VL Gothic regular"}},
- {{"TakaoPMincho", "IPAPMincho", "VL Gothic", "Kochi Mincho", NULL, "VL Gothic regular"}},
- {{"TakaoMincho", "IPAMincho", "VL Gothic", "Kochi Mincho", NULL, "VL Gothic regular"}},
-};
-static const FX_LPCSTR g_LinuxGbFontList[] = {
- "AR PL UMing CN Light",
- "WenQuanYi Micro Hei",
- "AR PL UKai CN",
-};
-static const FX_LPCSTR g_LinuxB5FontList[] = {
- "AR PL UMing TW Light",
- "WenQuanYi Micro Hei",
- "AR PL UKai TW",
-};
-static const FX_LPCSTR g_LinuxHGFontList[] = {
- "UnDotum",
-};
-static FX_INT32 GetJapanesePreference(FX_LPCSTR facearr, int weight, int picth_family)
-{
- CFX_ByteString face = facearr;
- if (face.Find("Gothic") >= 0 || face.Find("\x83\x53\x83\x56\x83\x62\x83\x4e") >= 0) {
- if (face.Find("PGothic") >= 0 || face.Find("\x82\x6f\x83\x53\x83\x56\x83\x62\x83\x4e") >= 0) {
- return 0;
- } else {
- return 1;
- }
- } else if (face.Find("Mincho") >= 0 || face.Find("\x96\xbe\x92\xa9") >= 0) {
- if (face.Find("PMincho") >= 0 || face.Find("\x82\x6f\x96\xbe\x92\xa9") >= 0) {
- return 2;
- } else {
- return 3;
- }
- }
- if (!(picth_family & FXFONT_FF_ROMAN) && weight > 400) {
- return 0;
- }
- return 2;
-}
-void* CFX_LinuxFontInfo::MapFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR cstr_face, FX_BOOL& bExact)
-{
- CFX_ByteString face = cstr_face;
- int iBaseFont;
- for (iBaseFont = 0; iBaseFont < 12; iBaseFont ++)
- if (face == CFX_ByteStringC(Base14Substs[iBaseFont].m_pName)) {
- face = Base14Substs[iBaseFont].m_pSubstName;
- bExact = TRUE;
- break;
- }
- if (iBaseFont < 12) {
- return GetFont(face);
- }
- FX_LPVOID p = NULL;
- FX_BOOL bCJK = TRUE;
- switch (charset) {
- case FXFONT_SHIFTJIS_CHARSET: {
- FX_INT32 index = GetJapanesePreference(cstr_face, weight, pitch_family);
- if (index < 0) {
- break;
- }
- for (FX_INT32 i = 0; i < LINUX_GPNAMESIZE; i++)
- if (m_FontList.Lookup(LinuxGpFontList[index].NameArr[i], p)) {
- return p;
- }
- }
- break;
- case FXFONT_GB2312_CHARSET: {
- static FX_INT32 s_gbCount = sizeof(g_LinuxGbFontList) / sizeof(FX_LPCSTR);
- for (FX_INT32 i = 0; i < s_gbCount; i++)
- if (m_FontList.Lookup(g_LinuxGbFontList[i], p)) {
- return p;
- }
- }
- break;
- case FXFONT_CHINESEBIG5_CHARSET: {
- static FX_INT32 s_b5Count = sizeof(g_LinuxB5FontList) / sizeof(FX_LPCSTR);
- for (FX_INT32 i = 0; i < s_b5Count; i++)
- if (m_FontList.Lookup(g_LinuxB5FontList[i], p)) {
- return p;
- }
- }
- break;
- case FXFONT_HANGEUL_CHARSET: {
- static FX_INT32 s_hgCount = sizeof(g_LinuxHGFontList) / sizeof(FX_LPCSTR);
- for (FX_INT32 i = 0; i < s_hgCount; i++)
- if (m_FontList.Lookup(g_LinuxHGFontList[i], p)) {
- return p;
- }
- }
- break;
- default:
- bCJK = FALSE;
- break;
- }
- if (charset == FXFONT_ANSI_CHARSET && (pitch_family & FXFONT_FF_FIXEDPITCH)) {
- return GetFont("Courier New");
- }
- return FindFont(weight, bItalic, charset, pitch_family, cstr_face, !bCJK);
-}
-static FX_DWORD _LinuxGetCharset(int charset)
-{
- switch(charset) {
- case FXFONT_SHIFTJIS_CHARSET:
- return CHARSET_FLAG_SHIFTJIS;
- case FXFONT_GB2312_CHARSET:
- return CHARSET_FLAG_GB;
- case FXFONT_CHINESEBIG5_CHARSET:
- return CHARSET_FLAG_BIG5;
- case FXFONT_HANGEUL_CHARSET:
- return CHARSET_FLAG_KOREAN;
- case FXFONT_SYMBOL_CHARSET:
- return CHARSET_FLAG_SYMBOL;
- case FXFONT_ANSI_CHARSET:
- return CHARSET_FLAG_ANSI;
- default:
- break;
- }
- return 0;
-}
-static FX_INT32 _LinuxGetSimilarValue(int weight, FX_BOOL bItalic, int pitch_family, FX_DWORD style)
-{
- FX_INT32 iSimilarValue = 0;
- if ((style & FXFONT_BOLD) == (weight > 400)) {
- iSimilarValue += 16;
- }
- if ((style & FXFONT_ITALIC) == bItalic) {
- iSimilarValue += 16;
- }
- if ((style & FXFONT_SERIF) == (pitch_family & FXFONT_FF_ROMAN)) {
- iSimilarValue += 16;
- }
- if ((style & FXFONT_SCRIPT) == (pitch_family & FXFONT_FF_SCRIPT)) {
- iSimilarValue += 8;
- }
- if ((style & FXFONT_FIXED_PITCH) == (pitch_family & FXFONT_FF_FIXEDPITCH)) {
- iSimilarValue += 8;
- }
- return iSimilarValue;
-}
-void* CFX_LinuxFontInfo::FindFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR family, FX_BOOL bMatchName)
-{
- CFontFaceInfo* pFind = NULL;
- FX_DWORD charset_flag = _LinuxGetCharset(charset);
- FX_INT32 iBestSimilar = 0;
- FX_POSITION pos = m_FontList.GetStartPosition();
- while (pos) {
- CFX_ByteString bsName;
- CFontFaceInfo* pFont = NULL;
- m_FontList.GetNextAssoc(pos, bsName, (FX_LPVOID&)pFont);
- if (!(pFont->m_Charsets & charset_flag) && charset != FXFONT_DEFAULT_CHARSET) {
- continue;
- }
- FX_INT32 iSimilarValue = 0;
- FX_INT32 index = bsName.Find(family);
- if (bMatchName && index < 0) {
- continue;
- }
- if (!bMatchName && index > 0) {
- iSimilarValue += 64;
- }
- iSimilarValue = _LinuxGetSimilarValue(weight, bItalic, pitch_family, pFont->m_Styles);
- if (iSimilarValue > iBestSimilar) {
- iBestSimilar = iSimilarValue;
- pFind = pFont;
- }
- }
- return pFind;
-}
-IFX_SystemFontInfo* IFX_SystemFontInfo::CreateDefault()
-{
- CFX_LinuxFontInfo* pInfo = FX_NEW CFX_LinuxFontInfo;
- if (!pInfo) {
- return NULL;
- }
- if (!pInfo->ParseFontCfg()) {
- pInfo->AddPath("/usr/share/fonts");
- pInfo->AddPath("/usr/share/X11/fonts/Type1");
- pInfo->AddPath("/usr/share/X11/fonts/TTF");
- pInfo->AddPath("/usr/local/share/fonts");
- }
- return pInfo;
-}
-FX_BOOL CFX_LinuxFontInfo::ParseFontCfg()
-{
- return FALSE;
-}
-void CFX_GEModule::InitPlatform()
-{
- m_pFontMgr->SetSystemFontInfo(IFX_SystemFontInfo::CreateDefault());
-}
-void CFX_GEModule::DestroyPlatform()
-{
-}
-#endif
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxge/fx_ge.h"
+#include "../agg/include/fx_agg_driver.h"
+#include "text_int.h"
+#if !defined(_FPDFAPI_MINI_) && _FXM_PLATFORM_ == _FXM_PLATFORM_LINUX_
+#if (_FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ && (!defined(_FPDFAPI_MINI_)))
+void CFX_AggDeviceDriver::InitPlatform()
+{
+}
+void CFX_AggDeviceDriver::DestroyPlatform()
+{
+}
+void CFX_FaceCache::InitPlatform()
+{
+}
+FX_BOOL CFX_AggDeviceDriver::DrawDeviceText(int nChars, const FXTEXT_CHARPOS* pCharPos, CFX_Font* pFont,
+ CFX_FontCache* pCache, const CFX_AffineMatrix* pObject2Device,
+ FX_FLOAT font_size, FX_DWORD argb)
+{
+ return FALSE;
+}
+CFX_GlyphBitmap* CFX_FaceCache::RenderGlyph_Nativetext(CFX_Font* pFont, FX_DWORD glyph_index, const CFX_AffineMatrix* pMatrix,
+ int dest_width, int anti_alias)
+{
+ return NULL;
+}
+void CFX_Font::ReleasePlatformResource()
+{
+}
+#endif
+static const struct {
+ FX_LPCSTR m_pName;
+ FX_LPCSTR m_pSubstName;
+}
+Base14Substs[] = {
+ {"Courier", "Courier New"},
+ {"Courier-Bold", "Courier New Bold"},
+ {"Courier-BoldOblique", "Courier New Bold Italic"},
+ {"Courier-Oblique", "Courier New Italic"},
+ {"Helvetica", "Arial"},
+ {"Helvetica-Bold", "Arial Bold"},
+ {"Helvetica-BoldOblique", "Arial Bold Italic"},
+ {"Helvetica-Oblique", "Arial Italic"},
+ {"Times-Roman", "Times New Roman"},
+ {"Times-Bold", "Times New Roman Bold"},
+ {"Times-BoldItalic", "Times New Roman Bold Italic"},
+ {"Times-Italic", "Times New Roman Italic"},
+};
+class CFX_LinuxFontInfo : public CFX_FolderFontInfo
+{
+public:
+ virtual void* MapFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR family, FX_BOOL& bExact);
+ FX_BOOL ParseFontCfg();
+ void* FindFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR family, FX_BOOL bMatchName);
+};
+#define LINUX_GPNAMESIZE 6
+static const struct {
+ FX_LPCSTR NameArr[LINUX_GPNAMESIZE];
+}
+LinuxGpFontList[] = {
+ {{"TakaoPGothic", "VL PGothic", "IPAPGothic", "VL Gothic", "Kochi Gothic", "VL Gothic regular"}},
+ {{"TakaoGothic", "VL Gothic", "IPAGothic", "Kochi Gothic", NULL, "VL Gothic regular"}},
+ {{"TakaoPMincho", "IPAPMincho", "VL Gothic", "Kochi Mincho", NULL, "VL Gothic regular"}},
+ {{"TakaoMincho", "IPAMincho", "VL Gothic", "Kochi Mincho", NULL, "VL Gothic regular"}},
+};
+static const FX_LPCSTR g_LinuxGbFontList[] = {
+ "AR PL UMing CN Light",
+ "WenQuanYi Micro Hei",
+ "AR PL UKai CN",
+};
+static const FX_LPCSTR g_LinuxB5FontList[] = {
+ "AR PL UMing TW Light",
+ "WenQuanYi Micro Hei",
+ "AR PL UKai TW",
+};
+static const FX_LPCSTR g_LinuxHGFontList[] = {
+ "UnDotum",
+};
+static FX_INT32 GetJapanesePreference(FX_LPCSTR facearr, int weight, int picth_family)
+{
+ CFX_ByteString face = facearr;
+ if (face.Find("Gothic") >= 0 || face.Find("\x83\x53\x83\x56\x83\x62\x83\x4e") >= 0) {
+ if (face.Find("PGothic") >= 0 || face.Find("\x82\x6f\x83\x53\x83\x56\x83\x62\x83\x4e") >= 0) {
+ return 0;
+ } else {
+ return 1;
+ }
+ } else if (face.Find("Mincho") >= 0 || face.Find("\x96\xbe\x92\xa9") >= 0) {
+ if (face.Find("PMincho") >= 0 || face.Find("\x82\x6f\x96\xbe\x92\xa9") >= 0) {
+ return 2;
+ } else {
+ return 3;
+ }
+ }
+ if (!(picth_family & FXFONT_FF_ROMAN) && weight > 400) {
+ return 0;
+ }
+ return 2;
+}
+void* CFX_LinuxFontInfo::MapFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR cstr_face, FX_BOOL& bExact)
+{
+ CFX_ByteString face = cstr_face;
+ int iBaseFont;
+ for (iBaseFont = 0; iBaseFont < 12; iBaseFont ++)
+ if (face == CFX_ByteStringC(Base14Substs[iBaseFont].m_pName)) {
+ face = Base14Substs[iBaseFont].m_pSubstName;
+ bExact = TRUE;
+ break;
+ }
+ if (iBaseFont < 12) {
+ return GetFont(face);
+ }
+ FX_LPVOID p = NULL;
+ FX_BOOL bCJK = TRUE;
+ switch (charset) {
+ case FXFONT_SHIFTJIS_CHARSET: {
+ FX_INT32 index = GetJapanesePreference(cstr_face, weight, pitch_family);
+ if (index < 0) {
+ break;
+ }
+ for (FX_INT32 i = 0; i < LINUX_GPNAMESIZE; i++)
+ if (m_FontList.Lookup(LinuxGpFontList[index].NameArr[i], p)) {
+ return p;
+ }
+ }
+ break;
+ case FXFONT_GB2312_CHARSET: {
+ static FX_INT32 s_gbCount = sizeof(g_LinuxGbFontList) / sizeof(FX_LPCSTR);
+ for (FX_INT32 i = 0; i < s_gbCount; i++)
+ if (m_FontList.Lookup(g_LinuxGbFontList[i], p)) {
+ return p;
+ }
+ }
+ break;
+ case FXFONT_CHINESEBIG5_CHARSET: {
+ static FX_INT32 s_b5Count = sizeof(g_LinuxB5FontList) / sizeof(FX_LPCSTR);
+ for (FX_INT32 i = 0; i < s_b5Count; i++)
+ if (m_FontList.Lookup(g_LinuxB5FontList[i], p)) {
+ return p;
+ }
+ }
+ break;
+ case FXFONT_HANGEUL_CHARSET: {
+ static FX_INT32 s_hgCount = sizeof(g_LinuxHGFontList) / sizeof(FX_LPCSTR);
+ for (FX_INT32 i = 0; i < s_hgCount; i++)
+ if (m_FontList.Lookup(g_LinuxHGFontList[i], p)) {
+ return p;
+ }
+ }
+ break;
+ default:
+ bCJK = FALSE;
+ break;
+ }
+ if (charset == FXFONT_ANSI_CHARSET && (pitch_family & FXFONT_FF_FIXEDPITCH)) {
+ return GetFont("Courier New");
+ }
+ return FindFont(weight, bItalic, charset, pitch_family, cstr_face, !bCJK);
+}
+static FX_DWORD _LinuxGetCharset(int charset)
+{
+ switch(charset) {
+ case FXFONT_SHIFTJIS_CHARSET:
+ return CHARSET_FLAG_SHIFTJIS;
+ case FXFONT_GB2312_CHARSET:
+ return CHARSET_FLAG_GB;
+ case FXFONT_CHINESEBIG5_CHARSET:
+ return CHARSET_FLAG_BIG5;
+ case FXFONT_HANGEUL_CHARSET:
+ return CHARSET_FLAG_KOREAN;
+ case FXFONT_SYMBOL_CHARSET:
+ return CHARSET_FLAG_SYMBOL;
+ case FXFONT_ANSI_CHARSET:
+ return CHARSET_FLAG_ANSI;
+ default:
+ break;
+ }
+ return 0;
+}
+static FX_INT32 _LinuxGetSimilarValue(int weight, FX_BOOL bItalic, int pitch_family, FX_DWORD style)
+{
+ FX_INT32 iSimilarValue = 0;
+ if ((style & FXFONT_BOLD) == (weight > 400)) {
+ iSimilarValue += 16;
+ }
+ if ((style & FXFONT_ITALIC) == bItalic) {
+ iSimilarValue += 16;
+ }
+ if ((style & FXFONT_SERIF) == (pitch_family & FXFONT_FF_ROMAN)) {
+ iSimilarValue += 16;
+ }
+ if ((style & FXFONT_SCRIPT) == (pitch_family & FXFONT_FF_SCRIPT)) {
+ iSimilarValue += 8;
+ }
+ if ((style & FXFONT_FIXED_PITCH) == (pitch_family & FXFONT_FF_FIXEDPITCH)) {
+ iSimilarValue += 8;
+ }
+ return iSimilarValue;
+}
+void* CFX_LinuxFontInfo::FindFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR family, FX_BOOL bMatchName)
+{
+ CFontFaceInfo* pFind = NULL;
+ FX_DWORD charset_flag = _LinuxGetCharset(charset);
+ FX_INT32 iBestSimilar = 0;
+ FX_POSITION pos = m_FontList.GetStartPosition();
+ while (pos) {
+ CFX_ByteString bsName;
+ CFontFaceInfo* pFont = NULL;
+ m_FontList.GetNextAssoc(pos, bsName, (FX_LPVOID&)pFont);
+ if (!(pFont->m_Charsets & charset_flag) && charset != FXFONT_DEFAULT_CHARSET) {
+ continue;
+ }
+ FX_INT32 iSimilarValue = 0;
+ FX_INT32 index = bsName.Find(family);
+ if (bMatchName && index < 0) {
+ continue;
+ }
+ if (!bMatchName && index > 0) {
+ iSimilarValue += 64;
+ }
+ iSimilarValue = _LinuxGetSimilarValue(weight, bItalic, pitch_family, pFont->m_Styles);
+ if (iSimilarValue > iBestSimilar) {
+ iBestSimilar = iSimilarValue;
+ pFind = pFont;
+ }
+ }
+ return pFind;
+}
+IFX_SystemFontInfo* IFX_SystemFontInfo::CreateDefault()
+{
+ CFX_LinuxFontInfo* pInfo = FX_NEW CFX_LinuxFontInfo;
+ if (!pInfo) {
+ return NULL;
+ }
+ if (!pInfo->ParseFontCfg()) {
+ pInfo->AddPath("/usr/share/fonts");
+ pInfo->AddPath("/usr/share/X11/fonts/Type1");
+ pInfo->AddPath("/usr/share/X11/fonts/TTF");
+ pInfo->AddPath("/usr/local/share/fonts");
+ }
+ return pInfo;
+}
+FX_BOOL CFX_LinuxFontInfo::ParseFontCfg()
+{
+ return FALSE;
+}
+void CFX_GEModule::InitPlatform()
+{
+ m_pFontMgr->SetSystemFontInfo(IFX_SystemFontInfo::CreateDefault());
+}
+void CFX_GEModule::DestroyPlatform()
+{
+}
+#endif
diff --git a/core/src/fxge/ge/fx_ge_path.cpp b/core/src/fxge/ge/fx_ge_path.cpp
index fc6ee52f1f..cd3ff0efbe 100644
--- a/core/src/fxge/ge/fx_ge_path.cpp
+++ b/core/src/fxge/ge/fx_ge_path.cpp
@@ -1,654 +1,654 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../../include/fxcrt/fx_basic.h"
-#include "../../../include/fxge/fx_ge.h"
-CFX_ClipRgn::CFX_ClipRgn(int width, int height)
-{
- m_Type = RectI;
- m_Box.left = m_Box.top = 0;
- m_Box.right = width;
- m_Box.bottom = height;
-}
-CFX_ClipRgn::CFX_ClipRgn(const FX_RECT& rect)
-{
- m_Type = RectI;
- m_Box = rect;
-}
-CFX_ClipRgn::CFX_ClipRgn(const CFX_ClipRgn& src)
-{
- m_Type = src.m_Type;
- m_Box = src.m_Box;
- m_Mask = src.m_Mask;
-}
-CFX_ClipRgn::~CFX_ClipRgn()
-{
-}
-void CFX_ClipRgn::Reset(const FX_RECT& rect)
-{
- m_Type = RectI;
- m_Box = rect;
- m_Mask.SetNull();
-}
-void CFX_ClipRgn::IntersectRect(const FX_RECT& rect)
-{
- if (m_Type == RectI) {
- m_Box.Intersect(rect);
- return;
- }
- if (m_Type == MaskF) {
- IntersectMaskRect(rect, m_Box, m_Mask);
- return;
- }
-}
-void CFX_ClipRgn::IntersectMaskRect(FX_RECT rect, FX_RECT mask_rect, CFX_DIBitmapRef Mask)
-{
- const CFX_DIBitmap* mask_dib = Mask;
- m_Type = MaskF;
- m_Box = rect;
- m_Box.Intersect(mask_rect);
- if (m_Box.IsEmpty()) {
- m_Type = RectI;
- return;
- } else if (m_Box == mask_rect) {
- m_Mask = Mask;
- return;
- }
- CFX_DIBitmap* new_dib = m_Mask.New();
- if (!new_dib) {
- return;
- }
- new_dib->Create(m_Box.Width(), m_Box.Height(), FXDIB_8bppMask);
- for (int row = m_Box.top; row < m_Box.bottom; row ++) {
- FX_LPBYTE dest_scan = new_dib->GetBuffer() + new_dib->GetPitch() * (row - m_Box.top);
- FX_LPBYTE src_scan = mask_dib->GetBuffer() + mask_dib->GetPitch() * (row - mask_rect.top);
- for (int col = m_Box.left; col < m_Box.right; col ++) {
- dest_scan[col - m_Box.left] = src_scan[col - mask_rect.left];
- }
- }
-}
-void CFX_ClipRgn::IntersectMaskF(int left, int top, CFX_DIBitmapRef Mask)
-{
- const CFX_DIBitmap* mask_dib = Mask;
- ASSERT(mask_dib->GetFormat() == FXDIB_8bppMask);
- FX_RECT mask_box(left, top, left + mask_dib->GetWidth(), top + mask_dib->GetHeight());
- if (m_Type == RectI) {
- IntersectMaskRect(m_Box, mask_box, Mask);
- return;
- }
- if (m_Type == MaskF) {
- FX_RECT new_box = m_Box;
- new_box.Intersect(mask_box);
- if (new_box.IsEmpty()) {
- m_Type = RectI;
- m_Mask.SetNull();
- m_Box = new_box;
- return;
- }
- CFX_DIBitmapRef new_mask;
- CFX_DIBitmap* new_dib = new_mask.New();
- if (!new_dib) {
- return;
- }
- new_dib->Create(new_box.Width(), new_box.Height(), FXDIB_8bppMask);
- const CFX_DIBitmap* old_dib = m_Mask;
- for (int row = new_box.top; row < new_box.bottom; row ++) {
- FX_LPBYTE old_scan = old_dib->GetBuffer() + (row - m_Box.top) * old_dib->GetPitch();
- FX_LPBYTE mask_scan = mask_dib->GetBuffer() + (row - top) * mask_dib->GetPitch();
- FX_LPBYTE new_scan = new_dib->GetBuffer() + (row - new_box.top) * new_dib->GetPitch();
- for (int col = new_box.left; col < new_box.right; col ++) {
- new_scan[col - new_box.left] = old_scan[col - m_Box.left] * mask_scan[col - left] / 255;
- }
- }
- m_Box = new_box;
- m_Mask = new_mask;
- return;
- }
- ASSERT(FALSE);
-}
-CFX_PathData::CFX_PathData()
-{
- m_PointCount = m_AllocCount = 0;
- m_pPoints = NULL;
-}
-CFX_PathData::~CFX_PathData()
-{
- if (m_pPoints) {
- FX_Free(m_pPoints);
- }
-}
-FX_BOOL CFX_PathData::SetPointCount(int nPoints)
-{
- m_PointCount = nPoints;
- if (m_AllocCount < nPoints) {
- if (m_pPoints) {
- FX_Free(m_pPoints);
- m_pPoints = NULL;
- }
- m_pPoints = FX_Alloc(FX_PATHPOINT, nPoints);
- if (!m_pPoints) {
- return FALSE;
- }
- m_AllocCount = nPoints;
- }
- return TRUE;
-}
-FX_BOOL CFX_PathData::AllocPointCount(int nPoints)
-{
- if (m_AllocCount < nPoints) {
- FX_PATHPOINT* pNewBuf = FX_Alloc(FX_PATHPOINT, nPoints);
- if (!pNewBuf) {
- return FALSE;
- }
- if (m_PointCount) {
- FXSYS_memcpy32(pNewBuf, m_pPoints, m_PointCount * sizeof(FX_PATHPOINT));
- }
- if (m_pPoints) {
- FX_Free(m_pPoints);
- }
- m_pPoints = pNewBuf;
- m_AllocCount = nPoints;
- }
- return TRUE;
-}
-CFX_PathData::CFX_PathData(const CFX_PathData& src)
-{
- m_pPoints = NULL;
- m_PointCount = m_AllocCount = src.m_PointCount;
- m_pPoints = FX_Alloc(FX_PATHPOINT, src.m_PointCount);
- if (!m_pPoints) {
- return;
- }
- FXSYS_memcpy32(m_pPoints, src.m_pPoints, sizeof(FX_PATHPOINT) * m_PointCount);
-}
-void CFX_PathData::TrimPoints(int nPoints)
-{
- if (m_PointCount <= nPoints) {
- return;
- }
- SetPointCount(nPoints);
-}
-FX_BOOL CFX_PathData::AddPointCount(int addPoints)
-{
- int new_count = m_PointCount + addPoints;
- if (!AllocPointCount(new_count)) {
- return FALSE;
- }
- m_PointCount = new_count;
- return TRUE;
-}
-FX_BOOL CFX_PathData::Append(const CFX_PathData* pSrc, const CFX_AffineMatrix* pMatrix)
-{
- int old_count = m_PointCount;
- if (!AddPointCount(pSrc->m_PointCount)) {
- return FALSE;
- }
- FXSYS_memcpy32(m_pPoints + old_count, pSrc->m_pPoints, pSrc->m_PointCount * sizeof(FX_PATHPOINT));
- if (pMatrix == NULL) {
- return TRUE;
- }
- for (int i = 0; i < pSrc->m_PointCount; i ++) {
- pMatrix->Transform(m_pPoints[old_count + i].m_PointX, m_pPoints[old_count + i].m_PointY);
- }
- return TRUE;
-}
-void CFX_PathData::SetPoint(int index, FX_FLOAT x, FX_FLOAT y, int flag)
-{
- ASSERT(index < m_PointCount);
- m_pPoints[index].m_PointX = x;
- m_pPoints[index].m_PointY = y;
- m_pPoints[index].m_Flag = flag;
-}
-FX_BOOL CFX_PathData::AppendRect(FX_FLOAT left, FX_FLOAT bottom, FX_FLOAT right, FX_FLOAT top)
-{
- int old_count = m_PointCount;
- if (!AddPointCount(5)) {
- return FALSE;
- }
- FX_PATHPOINT* pPoints = m_pPoints + old_count;
- pPoints[0].m_PointX = pPoints[1].m_PointX = pPoints[4].m_PointX = left;
- pPoints[2].m_PointX = pPoints[3].m_PointX = right;
- pPoints[0].m_PointY = pPoints[3].m_PointY = pPoints[4].m_PointY = bottom;
- pPoints[1].m_PointY = pPoints[2].m_PointY = top;
- pPoints[0].m_Flag = FXPT_MOVETO;
- pPoints[1].m_Flag = pPoints[2].m_Flag = pPoints[3].m_Flag = FXPT_LINETO;
- pPoints[4].m_Flag = FXPT_LINETO | FXPT_CLOSEFIGURE;
- return TRUE;
-}
-CFX_FloatRect CFX_PathData::GetBoundingBox() const
-{
- CFX_FloatRect rect;
- if (m_PointCount) {
- rect.InitRect(m_pPoints[0].m_PointX, m_pPoints[0].m_PointY);
- for (int i = 1; i < m_PointCount; i ++) {
- rect.UpdateRect(m_pPoints[i].m_PointX, m_pPoints[i].m_PointY);
- }
- }
- return rect;
-}
-static void _UpdateLineEndPoints(CFX_FloatRect& rect, FX_FLOAT start_x, FX_FLOAT start_y, FX_FLOAT end_x, FX_FLOAT end_y,
- FX_FLOAT hw)
-{
- if (start_x == end_x) {
- if (start_y == end_y) {
- rect.UpdateRect(end_x + hw, end_y + hw);
- rect.UpdateRect(end_x - hw, end_y - hw);
- return;
- }
- FX_FLOAT point_y;
- if (end_y < start_y) {
- point_y = end_y - hw;
- } else {
- point_y = end_y + hw;
- }
- rect.UpdateRect(end_x + hw, point_y);
- rect.UpdateRect(end_x - hw, point_y);
- return;
- } else if (start_y == end_y) {
- FX_FLOAT point_x;
- if (end_x < start_x) {
- point_x = end_x - hw;
- } else {
- point_x = end_x + hw;
- }
- rect.UpdateRect(point_x, end_y + hw);
- rect.UpdateRect(point_x, end_y - hw);
- return;
- }
- FX_FLOAT dx = end_x - start_x;
- FX_FLOAT dy = end_y - start_y;
- FX_FLOAT ll = FXSYS_sqrt2(dx, dy);
- FX_FLOAT mx = end_x + hw * dx / ll;
- FX_FLOAT my = end_y + hw * dy / ll;
- FX_FLOAT dx1 = hw * dy / ll;
- FX_FLOAT dy1 = hw * dx / ll;
- rect.UpdateRect(mx - dx1, my + dy1);
- rect.UpdateRect(mx + dx1, my - dy1);
-}
-static void _UpdateLineJoinPoints(CFX_FloatRect& rect, FX_FLOAT start_x, FX_FLOAT start_y,
- FX_FLOAT middle_x, FX_FLOAT middle_y, FX_FLOAT end_x, FX_FLOAT end_y,
- FX_FLOAT half_width, FX_FLOAT miter_limit)
-{
- FX_FLOAT start_k = 0, start_c = 0, end_k = 0, end_c = 0, start_len = 0, start_dc = 0, end_len = 0, end_dc = 0;
- FX_BOOL bStartVert = FXSYS_fabs(start_x - middle_x) < 1.0f / 20;
- FX_BOOL bEndVert = FXSYS_fabs(middle_x - end_x) < 1.0f / 20;
- if (bStartVert && bEndVert) {
- int start_dir = middle_y > start_y ? 1 : -1;
- FX_FLOAT point_y = middle_y + half_width * start_dir;
- rect.UpdateRect(middle_x + half_width, point_y);
- rect.UpdateRect(middle_x - half_width, point_y);
- return;
- }
- if (!bStartVert) {
- start_k = FXSYS_Div(middle_y - start_y, middle_x - start_x);
- start_c = middle_y - FXSYS_Mul(start_k, middle_x);
- start_len = FXSYS_sqrt2(start_x - middle_x, start_y - middle_y);
- start_dc = (FX_FLOAT)FXSYS_fabs(FXSYS_MulDiv(half_width, start_len, start_x - middle_x));
- }
- if (!bEndVert) {
- end_k = FXSYS_Div(end_y - middle_y, end_x - middle_x);
- end_c = middle_y - FXSYS_Mul(end_k, middle_x);
- end_len = FXSYS_sqrt2(end_x - middle_x, end_y - middle_y);
- end_dc = (FX_FLOAT)FXSYS_fabs(FXSYS_MulDiv(half_width, end_len, end_x - middle_x));
- }
- if (bStartVert) {
- FX_FLOAT outside_x = start_x;
- if (end_x < start_x) {
- outside_x += half_width;
- } else {
- outside_x -= half_width;
- }
- FX_FLOAT outside_y;
- if (start_y < FXSYS_Mul(end_k, start_x) + end_c) {
- outside_y = FXSYS_Mul(end_k, outside_x) + end_c + end_dc;
- } else {
- outside_y = FXSYS_Mul(end_k, outside_x) + end_c - end_dc;
- }
- rect.UpdateRect(outside_x, outside_y);
- return;
- }
- if (bEndVert) {
- FX_FLOAT outside_x = end_x;
- if (start_x < end_x) {
- outside_x += half_width;
- } else {
- outside_x -= half_width;
- }
- FX_FLOAT outside_y;
- if (end_y < FXSYS_Mul(start_k, end_x) + start_c) {
- outside_y = FXSYS_Mul(start_k, outside_x) + start_c + start_dc;
- } else {
- outside_y = FXSYS_Mul(start_k, outside_x) + start_c - start_dc;
- }
- rect.UpdateRect(outside_x, outside_y);
- return;
- }
- if (FXSYS_fabs(start_k - end_k) < 1.0f / 20) {
- int start_dir = middle_x > start_x ? 1 : -1;
- int end_dir = end_x > middle_x ? 1 : -1;
- if (start_dir == end_dir) {
- _UpdateLineEndPoints(rect, middle_x, middle_y, end_x, end_y, half_width);
- } else {
- _UpdateLineEndPoints(rect, start_x, start_y, middle_x, middle_y, half_width);
- }
- return;
- }
- FX_FLOAT start_outside_c = start_c;
- if (end_y < FXSYS_Mul(start_k, end_x) + start_c) {
- start_outside_c += start_dc;
- } else {
- start_outside_c -= start_dc;
- }
- FX_FLOAT end_outside_c = end_c;
- if (start_y < FXSYS_Mul(end_k, start_x) + end_c) {
- end_outside_c += end_dc;
- } else {
- end_outside_c -= end_dc;
- }
- FX_FLOAT join_x = FXSYS_Div(end_outside_c - start_outside_c, start_k - end_k);
- FX_FLOAT join_y = FXSYS_Mul(start_k, join_x) + start_outside_c;
- rect.UpdateRect(join_x, join_y);
-}
-CFX_FloatRect CFX_PathData::GetBoundingBox(FX_FLOAT line_width, FX_FLOAT miter_limit) const
-{
- CFX_FloatRect rect(100000 * 1.0f, 100000 * 1.0f, -100000 * 1.0f, -100000 * 1.0f);
- int iPoint = 0;
- FX_FLOAT half_width = line_width;
- int iStartPoint, iEndPoint, iMiddlePoint;
- FX_BOOL bJoin;
- while (iPoint < m_PointCount) {
- if (m_pPoints[iPoint].m_Flag == FXPT_MOVETO) {
- iStartPoint = iPoint + 1;
- iEndPoint = iPoint;
- bJoin = FALSE;
- } else {
- if (m_pPoints[iPoint].m_Flag == FXPT_BEZIERTO) {
- rect.UpdateRect(m_pPoints[iPoint].m_PointX, m_pPoints[iPoint].m_PointY);
- rect.UpdateRect(m_pPoints[iPoint + 1].m_PointX, m_pPoints[iPoint + 1].m_PointY);
- iPoint += 2;
- }
- if (iPoint == m_PointCount - 1 || m_pPoints[iPoint + 1].m_Flag == FXPT_MOVETO) {
- iStartPoint = iPoint - 1;
- iEndPoint = iPoint;
- bJoin = FALSE;
- } else {
- iStartPoint = iPoint - 1;
- iMiddlePoint = iPoint;
- iEndPoint = iPoint + 1;
- bJoin = TRUE;
- }
- }
- FX_FLOAT start_x = m_pPoints[iStartPoint].m_PointX;
- FX_FLOAT start_y = m_pPoints[iStartPoint].m_PointY;
- FX_FLOAT end_x = m_pPoints[iEndPoint].m_PointX;
- FX_FLOAT end_y = m_pPoints[iEndPoint].m_PointY;
- if (bJoin) {
- FX_FLOAT middle_x = m_pPoints[iMiddlePoint].m_PointX;
- FX_FLOAT middle_y = m_pPoints[iMiddlePoint].m_PointY;
- _UpdateLineJoinPoints(rect, start_x, start_y, middle_x, middle_y, end_x, end_y, half_width, miter_limit);
- } else {
- _UpdateLineEndPoints(rect, start_x, start_y, end_x, end_y, half_width);
- }
- iPoint ++;
- }
- return rect;
-}
-void CFX_PathData::Transform(const CFX_AffineMatrix* pMatrix)
-{
- if (pMatrix == NULL) {
- return;
- }
- for (int i = 0; i < m_PointCount; i ++) {
- pMatrix->Transform(m_pPoints[i].m_PointX, m_pPoints[i].m_PointY);
- }
-}
-const int g_Distant[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
-FX_BOOL CFX_PathData::GetZeroAreaPath(CFX_PathData& NewPath, CFX_AffineMatrix* pMatrix, FX_BOOL&bThin, FX_BOOL bAdjust) const
-{
- if (m_PointCount < 3) {
- return FALSE;
- }
- if (m_PointCount == 3 && (m_pPoints[0].m_Flag & FXPT_TYPE) == FXPT_MOVETO &&
- (m_pPoints[1].m_Flag & FXPT_TYPE) == FXPT_LINETO && (m_pPoints[2].m_Flag & FXPT_TYPE) == FXPT_LINETO
- && m_pPoints[0].m_PointX == m_pPoints[2].m_PointX && m_pPoints[0].m_PointY == m_pPoints[2].m_PointY) {
- NewPath.AddPointCount(2);
- if (bAdjust) {
- if (pMatrix) {
- FX_FLOAT x = m_pPoints[0].m_PointX, y = m_pPoints[0].m_PointY;
- pMatrix->TransformPoint(x, y);
- x = (int)x + 0.5f;
- y = (int)y + 0.5f;
- NewPath.SetPoint(0, x, y, FXPT_MOVETO);
- x = m_pPoints[1].m_PointX, y = m_pPoints[1].m_PointY;
- pMatrix->TransformPoint(x, y);
- x = (int)x + 0.5f;
- y = (int)y + 0.5f;
- NewPath.SetPoint(1, x, y, FXPT_LINETO);
- pMatrix->SetIdentity();
- } else {
- FX_FLOAT x = (int)m_pPoints[0].m_PointX + 0.5f, y = (int)m_pPoints[0].m_PointY + 0.5f;
- NewPath.SetPoint(0, x, y, FXPT_MOVETO);
- x = (int)m_pPoints[1].m_PointX + 0.5f, y = (int)m_pPoints[1].m_PointY + 0.5f;
- NewPath.SetPoint(1, x, y, FXPT_LINETO);
- }
- } else {
- NewPath.SetPoint(0, m_pPoints[0].m_PointX, m_pPoints[0].m_PointY, FXPT_MOVETO);
- NewPath.SetPoint(1, m_pPoints[1].m_PointX, m_pPoints[1].m_PointY, FXPT_LINETO);
- }
- if (m_pPoints[0].m_PointX != m_pPoints[1].m_PointX && m_pPoints[0].m_PointY != m_pPoints[1].m_PointY) {
- bThin = TRUE;
- }
- return TRUE;
- }
- if (((m_PointCount > 3) && (m_PointCount % 2))) {
- int mid = m_PointCount / 2;
- FX_BOOL bZeroArea = FALSE;
- CFX_PathData t_path;
- for (int i = 0; i < mid; i++) {
- if (!(m_pPoints[mid - i - 1].m_PointX == m_pPoints[mid + i + 1].m_PointX
- && m_pPoints[mid - i - 1].m_PointY == m_pPoints[mid + i + 1].m_PointY &&
- ((m_pPoints[mid - i - 1].m_Flag & FXPT_TYPE) != FXPT_BEZIERTO && (m_pPoints[mid + i + 1].m_Flag & FXPT_TYPE) != FXPT_BEZIERTO))) {
- bZeroArea = TRUE;
- break;
- }
- int new_count = t_path.GetPointCount();
- t_path.AddPointCount(2);
- t_path.SetPoint(new_count, m_pPoints[mid - i].m_PointX, m_pPoints[mid - i].m_PointY, FXPT_MOVETO);
- t_path.SetPoint(new_count + 1, m_pPoints[mid - i - 1].m_PointX, m_pPoints[mid - i - 1].m_PointY, FXPT_LINETO);
- }
- if (!bZeroArea) {
- NewPath.Append(&t_path, NULL);
- bThin = TRUE;
- return TRUE;
- }
- }
- int stratPoint = 0;
- int next = 0, i;
- for (i = 0; i < m_PointCount; i++) {
- int point_type = m_pPoints[i].m_Flag & FXPT_TYPE;
- if (point_type == FXPT_MOVETO) {
- stratPoint = i;
- } else if (point_type == FXPT_LINETO) {
- next = (i + 1 - stratPoint) % (m_PointCount - stratPoint) + stratPoint;
- if ((m_pPoints[next].m_Flag & FXPT_TYPE) != FXPT_BEZIERTO && (m_pPoints[next].m_Flag & FXPT_TYPE) != FXPT_MOVETO) {
- if((m_pPoints[i - 1].m_PointX == m_pPoints[i].m_PointX && m_pPoints[i].m_PointX == m_pPoints[next].m_PointX)
- && ((m_pPoints[i].m_PointY - m_pPoints[i - 1].m_PointY) * (m_pPoints[i].m_PointY - m_pPoints[next].m_PointY) > 0)) {
- int pre = i;
- if (FXSYS_fabs(m_pPoints[i].m_PointY - m_pPoints[i - 1].m_PointY)
- < FXSYS_fabs(m_pPoints[i].m_PointY - m_pPoints[next].m_PointY)) {
- pre --;
- next--;
- }
- int new_count = NewPath.GetPointCount();
- NewPath.AddPointCount(2);
- NewPath.SetPoint(new_count, m_pPoints[pre].m_PointX, m_pPoints[pre].m_PointY, FXPT_MOVETO);
- NewPath.SetPoint(new_count + 1, m_pPoints[next].m_PointX, m_pPoints[next].m_PointY, FXPT_LINETO);
- } else if((m_pPoints[i - 1].m_PointY == m_pPoints[i].m_PointY && m_pPoints[i].m_PointY == m_pPoints[next].m_PointY)
- && ((m_pPoints[i].m_PointX - m_pPoints[i - 1].m_PointX) * (m_pPoints[i].m_PointX - m_pPoints[next].m_PointX) > 0)) {
- int pre = i;
- if (FXSYS_fabs(m_pPoints[i].m_PointX - m_pPoints[i - 1].m_PointX)
- < FXSYS_fabs(m_pPoints[i].m_PointX - m_pPoints[next].m_PointX)) {
- pre --;
- next--;
- }
- int new_count = NewPath.GetPointCount();
- NewPath.AddPointCount(2);
- NewPath.SetPoint(new_count, m_pPoints[pre].m_PointX, m_pPoints[pre].m_PointY, FXPT_MOVETO);
- NewPath.SetPoint(new_count + 1, m_pPoints[next].m_PointX, m_pPoints[next].m_PointY, FXPT_LINETO);
- } else if ((m_pPoints[i - 1].m_Flag & FXPT_TYPE) == FXPT_MOVETO && (m_pPoints[next].m_Flag & FXPT_TYPE) == FXPT_LINETO &&
- m_pPoints[i - 1].m_PointX == m_pPoints[next].m_PointX && m_pPoints[i - 1].m_PointY == m_pPoints[next].m_PointY
- && m_pPoints[next].m_Flag & FXPT_CLOSEFIGURE) {
- int new_count = NewPath.GetPointCount();
- NewPath.AddPointCount(2);
- NewPath.SetPoint(new_count, m_pPoints[i - 1].m_PointX, m_pPoints[i - 1].m_PointY, FXPT_MOVETO);
- NewPath.SetPoint(new_count + 1, m_pPoints[i].m_PointX, m_pPoints[i].m_PointY, FXPT_LINETO);
- bThin = TRUE;
- }
- }
- } else if (point_type == FXPT_BEZIERTO) {
- i += 2;
- continue;
- }
- }
- if (m_PointCount > 3 && NewPath.GetPointCount()) {
- bThin = TRUE;
- }
- if (NewPath.GetPointCount() == 0) {
- return FALSE;
- }
- return TRUE;
-}
-FX_BOOL CFX_PathData::IsRect() const
-{
- if (m_PointCount != 5 && m_PointCount != 4) {
- return FALSE;
- }
- if ((m_PointCount == 5 && (m_pPoints[0].m_PointX != m_pPoints[4].m_PointX ||
- m_pPoints[0].m_PointY != m_pPoints[4].m_PointY)) ||
- (m_pPoints[0].m_PointX == m_pPoints[2].m_PointX && m_pPoints[0].m_PointY == m_pPoints[2].m_PointY) ||
- (m_pPoints[1].m_PointX == m_pPoints[3].m_PointX && m_pPoints[1].m_PointY == m_pPoints[3].m_PointY)) {
- return FALSE;
- }
- if (m_pPoints[0].m_PointX != m_pPoints[3].m_PointX && m_pPoints[0].m_PointY != m_pPoints[3].m_PointY) {
- return FALSE;
- }
- for (int i = 1; i < 4; i ++) {
- if ((m_pPoints[i].m_Flag & FXPT_TYPE) != FXPT_LINETO) {
- return FALSE;
- }
- if (m_pPoints[i].m_PointX != m_pPoints[i - 1].m_PointX && m_pPoints[i].m_PointY != m_pPoints[i - 1].m_PointY) {
- return FALSE;
- }
- }
- return m_PointCount == 5 || (m_pPoints[3].m_Flag & FXPT_CLOSEFIGURE);
-}
-FX_BOOL CFX_PathData::IsRect(const CFX_AffineMatrix* pMatrix, CFX_FloatRect* pRect) const
-{
- if (pMatrix == NULL) {
- if (!IsRect()) {
- return FALSE;
- }
- if (pRect) {
- pRect->left = m_pPoints[0].m_PointX;
- pRect->right = m_pPoints[2].m_PointX;
- pRect->bottom = m_pPoints[0].m_PointY;
- pRect->top = m_pPoints[2].m_PointY;
- pRect->Normalize();
- }
- return TRUE;
- }
- if (m_PointCount != 5 && m_PointCount != 4) {
- return FALSE;
- }
- if ((m_PointCount == 5 && (m_pPoints[0].m_PointX != m_pPoints[4].m_PointX || m_pPoints[0].m_PointY != m_pPoints[4].m_PointY)) ||
- (m_pPoints[1].m_PointX == m_pPoints[3].m_PointX && m_pPoints[1].m_PointY == m_pPoints[3].m_PointY)) {
- return FALSE;
- }
- if (m_PointCount == 4 && m_pPoints[0].m_PointX != m_pPoints[3].m_PointX && m_pPoints[0].m_PointY != m_pPoints[3].m_PointY) {
- return FALSE;
- }
- FX_FLOAT x[5], y[5];
- for (int i = 0; i < m_PointCount; i ++) {
- pMatrix->Transform(m_pPoints[i].m_PointX, m_pPoints[i].m_PointY, x[i], y[i]);
- if (i) {
- if ((m_pPoints[i].m_Flag & FXPT_TYPE) != FXPT_LINETO) {
- return FALSE;
- }
- if (x[i] != x[i - 1] && y[i] != y[i - 1]) {
- return FALSE;
- }
- }
- }
- if (pRect) {
- pRect->left = x[0];
- pRect->right = x[2];
- pRect->bottom = y[0];
- pRect->top = y[2];
- pRect->Normalize();
- }
- return TRUE;
-}
-FX_BOOL CFX_PathData::Copy(const CFX_PathData &src)
-{
- if (!SetPointCount(src.m_PointCount)) {
- return FALSE;
- }
- FXSYS_memcpy32(m_pPoints, src.m_pPoints, sizeof(FX_PATHPOINT) * m_PointCount);
- return TRUE;
-}
-CFX_GraphStateData::CFX_GraphStateData()
-{
- m_LineCap = LineCapButt;
- m_DashCount = 0;
- m_DashArray = NULL;
- m_DashPhase = 0;
- m_LineJoin = LineJoinMiter;
- m_MiterLimit = 10 * 1.0f;
- m_LineWidth = 1.0f;
-}
-CFX_GraphStateData::CFX_GraphStateData(const CFX_GraphStateData& src)
-{
- m_DashArray = NULL;
- Copy(src);
-}
-void CFX_GraphStateData::Copy(const CFX_GraphStateData& src)
-{
- m_LineCap = src.m_LineCap;
- m_DashCount = src.m_DashCount;
- if (m_DashArray) {
- FX_Free(m_DashArray);
- }
- m_DashArray = NULL;
- m_DashPhase = src.m_DashPhase;
- m_LineJoin = src.m_LineJoin;
- m_MiterLimit = src.m_MiterLimit;
- m_LineWidth = src.m_LineWidth;
- if (m_DashCount) {
- m_DashArray = FX_Alloc(FX_FLOAT, m_DashCount);
- if (!m_DashArray) {
- return;
- }
- FXSYS_memcpy32(m_DashArray, src.m_DashArray, m_DashCount * sizeof(FX_FLOAT));
- }
-}
-CFX_GraphStateData::~CFX_GraphStateData()
-{
- if (m_DashArray) {
- FX_Free(m_DashArray);
- }
-}
-void CFX_GraphStateData::SetDashCount(int count)
-{
- if (m_DashArray) {
- FX_Free(m_DashArray);
- }
- m_DashArray = NULL;
- m_DashCount = count;
- if (count == 0) {
- return;
- }
- m_DashArray = FX_Alloc(FX_FLOAT, count);
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxcrt/fx_basic.h"
+#include "../../../include/fxge/fx_ge.h"
+CFX_ClipRgn::CFX_ClipRgn(int width, int height)
+{
+ m_Type = RectI;
+ m_Box.left = m_Box.top = 0;
+ m_Box.right = width;
+ m_Box.bottom = height;
+}
+CFX_ClipRgn::CFX_ClipRgn(const FX_RECT& rect)
+{
+ m_Type = RectI;
+ m_Box = rect;
+}
+CFX_ClipRgn::CFX_ClipRgn(const CFX_ClipRgn& src)
+{
+ m_Type = src.m_Type;
+ m_Box = src.m_Box;
+ m_Mask = src.m_Mask;
+}
+CFX_ClipRgn::~CFX_ClipRgn()
+{
+}
+void CFX_ClipRgn::Reset(const FX_RECT& rect)
+{
+ m_Type = RectI;
+ m_Box = rect;
+ m_Mask.SetNull();
+}
+void CFX_ClipRgn::IntersectRect(const FX_RECT& rect)
+{
+ if (m_Type == RectI) {
+ m_Box.Intersect(rect);
+ return;
+ }
+ if (m_Type == MaskF) {
+ IntersectMaskRect(rect, m_Box, m_Mask);
+ return;
+ }
+}
+void CFX_ClipRgn::IntersectMaskRect(FX_RECT rect, FX_RECT mask_rect, CFX_DIBitmapRef Mask)
+{
+ const CFX_DIBitmap* mask_dib = Mask;
+ m_Type = MaskF;
+ m_Box = rect;
+ m_Box.Intersect(mask_rect);
+ if (m_Box.IsEmpty()) {
+ m_Type = RectI;
+ return;
+ } else if (m_Box == mask_rect) {
+ m_Mask = Mask;
+ return;
+ }
+ CFX_DIBitmap* new_dib = m_Mask.New();
+ if (!new_dib) {
+ return;
+ }
+ new_dib->Create(m_Box.Width(), m_Box.Height(), FXDIB_8bppMask);
+ for (int row = m_Box.top; row < m_Box.bottom; row ++) {
+ FX_LPBYTE dest_scan = new_dib->GetBuffer() + new_dib->GetPitch() * (row - m_Box.top);
+ FX_LPBYTE src_scan = mask_dib->GetBuffer() + mask_dib->GetPitch() * (row - mask_rect.top);
+ for (int col = m_Box.left; col < m_Box.right; col ++) {
+ dest_scan[col - m_Box.left] = src_scan[col - mask_rect.left];
+ }
+ }
+}
+void CFX_ClipRgn::IntersectMaskF(int left, int top, CFX_DIBitmapRef Mask)
+{
+ const CFX_DIBitmap* mask_dib = Mask;
+ ASSERT(mask_dib->GetFormat() == FXDIB_8bppMask);
+ FX_RECT mask_box(left, top, left + mask_dib->GetWidth(), top + mask_dib->GetHeight());
+ if (m_Type == RectI) {
+ IntersectMaskRect(m_Box, mask_box, Mask);
+ return;
+ }
+ if (m_Type == MaskF) {
+ FX_RECT new_box = m_Box;
+ new_box.Intersect(mask_box);
+ if (new_box.IsEmpty()) {
+ m_Type = RectI;
+ m_Mask.SetNull();
+ m_Box = new_box;
+ return;
+ }
+ CFX_DIBitmapRef new_mask;
+ CFX_DIBitmap* new_dib = new_mask.New();
+ if (!new_dib) {
+ return;
+ }
+ new_dib->Create(new_box.Width(), new_box.Height(), FXDIB_8bppMask);
+ const CFX_DIBitmap* old_dib = m_Mask;
+ for (int row = new_box.top; row < new_box.bottom; row ++) {
+ FX_LPBYTE old_scan = old_dib->GetBuffer() + (row - m_Box.top) * old_dib->GetPitch();
+ FX_LPBYTE mask_scan = mask_dib->GetBuffer() + (row - top) * mask_dib->GetPitch();
+ FX_LPBYTE new_scan = new_dib->GetBuffer() + (row - new_box.top) * new_dib->GetPitch();
+ for (int col = new_box.left; col < new_box.right; col ++) {
+ new_scan[col - new_box.left] = old_scan[col - m_Box.left] * mask_scan[col - left] / 255;
+ }
+ }
+ m_Box = new_box;
+ m_Mask = new_mask;
+ return;
+ }
+ ASSERT(FALSE);
+}
+CFX_PathData::CFX_PathData()
+{
+ m_PointCount = m_AllocCount = 0;
+ m_pPoints = NULL;
+}
+CFX_PathData::~CFX_PathData()
+{
+ if (m_pPoints) {
+ FX_Free(m_pPoints);
+ }
+}
+FX_BOOL CFX_PathData::SetPointCount(int nPoints)
+{
+ m_PointCount = nPoints;
+ if (m_AllocCount < nPoints) {
+ if (m_pPoints) {
+ FX_Free(m_pPoints);
+ m_pPoints = NULL;
+ }
+ m_pPoints = FX_Alloc(FX_PATHPOINT, nPoints);
+ if (!m_pPoints) {
+ return FALSE;
+ }
+ m_AllocCount = nPoints;
+ }
+ return TRUE;
+}
+FX_BOOL CFX_PathData::AllocPointCount(int nPoints)
+{
+ if (m_AllocCount < nPoints) {
+ FX_PATHPOINT* pNewBuf = FX_Alloc(FX_PATHPOINT, nPoints);
+ if (!pNewBuf) {
+ return FALSE;
+ }
+ if (m_PointCount) {
+ FXSYS_memcpy32(pNewBuf, m_pPoints, m_PointCount * sizeof(FX_PATHPOINT));
+ }
+ if (m_pPoints) {
+ FX_Free(m_pPoints);
+ }
+ m_pPoints = pNewBuf;
+ m_AllocCount = nPoints;
+ }
+ return TRUE;
+}
+CFX_PathData::CFX_PathData(const CFX_PathData& src)
+{
+ m_pPoints = NULL;
+ m_PointCount = m_AllocCount = src.m_PointCount;
+ m_pPoints = FX_Alloc(FX_PATHPOINT, src.m_PointCount);
+ if (!m_pPoints) {
+ return;
+ }
+ FXSYS_memcpy32(m_pPoints, src.m_pPoints, sizeof(FX_PATHPOINT) * m_PointCount);
+}
+void CFX_PathData::TrimPoints(int nPoints)
+{
+ if (m_PointCount <= nPoints) {
+ return;
+ }
+ SetPointCount(nPoints);
+}
+FX_BOOL CFX_PathData::AddPointCount(int addPoints)
+{
+ int new_count = m_PointCount + addPoints;
+ if (!AllocPointCount(new_count)) {
+ return FALSE;
+ }
+ m_PointCount = new_count;
+ return TRUE;
+}
+FX_BOOL CFX_PathData::Append(const CFX_PathData* pSrc, const CFX_AffineMatrix* pMatrix)
+{
+ int old_count = m_PointCount;
+ if (!AddPointCount(pSrc->m_PointCount)) {
+ return FALSE;
+ }
+ FXSYS_memcpy32(m_pPoints + old_count, pSrc->m_pPoints, pSrc->m_PointCount * sizeof(FX_PATHPOINT));
+ if (pMatrix == NULL) {
+ return TRUE;
+ }
+ for (int i = 0; i < pSrc->m_PointCount; i ++) {
+ pMatrix->Transform(m_pPoints[old_count + i].m_PointX, m_pPoints[old_count + i].m_PointY);
+ }
+ return TRUE;
+}
+void CFX_PathData::SetPoint(int index, FX_FLOAT x, FX_FLOAT y, int flag)
+{
+ ASSERT(index < m_PointCount);
+ m_pPoints[index].m_PointX = x;
+ m_pPoints[index].m_PointY = y;
+ m_pPoints[index].m_Flag = flag;
+}
+FX_BOOL CFX_PathData::AppendRect(FX_FLOAT left, FX_FLOAT bottom, FX_FLOAT right, FX_FLOAT top)
+{
+ int old_count = m_PointCount;
+ if (!AddPointCount(5)) {
+ return FALSE;
+ }
+ FX_PATHPOINT* pPoints = m_pPoints + old_count;
+ pPoints[0].m_PointX = pPoints[1].m_PointX = pPoints[4].m_PointX = left;
+ pPoints[2].m_PointX = pPoints[3].m_PointX = right;
+ pPoints[0].m_PointY = pPoints[3].m_PointY = pPoints[4].m_PointY = bottom;
+ pPoints[1].m_PointY = pPoints[2].m_PointY = top;
+ pPoints[0].m_Flag = FXPT_MOVETO;
+ pPoints[1].m_Flag = pPoints[2].m_Flag = pPoints[3].m_Flag = FXPT_LINETO;
+ pPoints[4].m_Flag = FXPT_LINETO | FXPT_CLOSEFIGURE;
+ return TRUE;
+}
+CFX_FloatRect CFX_PathData::GetBoundingBox() const
+{
+ CFX_FloatRect rect;
+ if (m_PointCount) {
+ rect.InitRect(m_pPoints[0].m_PointX, m_pPoints[0].m_PointY);
+ for (int i = 1; i < m_PointCount; i ++) {
+ rect.UpdateRect(m_pPoints[i].m_PointX, m_pPoints[i].m_PointY);
+ }
+ }
+ return rect;
+}
+static void _UpdateLineEndPoints(CFX_FloatRect& rect, FX_FLOAT start_x, FX_FLOAT start_y, FX_FLOAT end_x, FX_FLOAT end_y,
+ FX_FLOAT hw)
+{
+ if (start_x == end_x) {
+ if (start_y == end_y) {
+ rect.UpdateRect(end_x + hw, end_y + hw);
+ rect.UpdateRect(end_x - hw, end_y - hw);
+ return;
+ }
+ FX_FLOAT point_y;
+ if (end_y < start_y) {
+ point_y = end_y - hw;
+ } else {
+ point_y = end_y + hw;
+ }
+ rect.UpdateRect(end_x + hw, point_y);
+ rect.UpdateRect(end_x - hw, point_y);
+ return;
+ } else if (start_y == end_y) {
+ FX_FLOAT point_x;
+ if (end_x < start_x) {
+ point_x = end_x - hw;
+ } else {
+ point_x = end_x + hw;
+ }
+ rect.UpdateRect(point_x, end_y + hw);
+ rect.UpdateRect(point_x, end_y - hw);
+ return;
+ }
+ FX_FLOAT dx = end_x - start_x;
+ FX_FLOAT dy = end_y - start_y;
+ FX_FLOAT ll = FXSYS_sqrt2(dx, dy);
+ FX_FLOAT mx = end_x + hw * dx / ll;
+ FX_FLOAT my = end_y + hw * dy / ll;
+ FX_FLOAT dx1 = hw * dy / ll;
+ FX_FLOAT dy1 = hw * dx / ll;
+ rect.UpdateRect(mx - dx1, my + dy1);
+ rect.UpdateRect(mx + dx1, my - dy1);
+}
+static void _UpdateLineJoinPoints(CFX_FloatRect& rect, FX_FLOAT start_x, FX_FLOAT start_y,
+ FX_FLOAT middle_x, FX_FLOAT middle_y, FX_FLOAT end_x, FX_FLOAT end_y,
+ FX_FLOAT half_width, FX_FLOAT miter_limit)
+{
+ FX_FLOAT start_k = 0, start_c = 0, end_k = 0, end_c = 0, start_len = 0, start_dc = 0, end_len = 0, end_dc = 0;
+ FX_BOOL bStartVert = FXSYS_fabs(start_x - middle_x) < 1.0f / 20;
+ FX_BOOL bEndVert = FXSYS_fabs(middle_x - end_x) < 1.0f / 20;
+ if (bStartVert && bEndVert) {
+ int start_dir = middle_y > start_y ? 1 : -1;
+ FX_FLOAT point_y = middle_y + half_width * start_dir;
+ rect.UpdateRect(middle_x + half_width, point_y);
+ rect.UpdateRect(middle_x - half_width, point_y);
+ return;
+ }
+ if (!bStartVert) {
+ start_k = FXSYS_Div(middle_y - start_y, middle_x - start_x);
+ start_c = middle_y - FXSYS_Mul(start_k, middle_x);
+ start_len = FXSYS_sqrt2(start_x - middle_x, start_y - middle_y);
+ start_dc = (FX_FLOAT)FXSYS_fabs(FXSYS_MulDiv(half_width, start_len, start_x - middle_x));
+ }
+ if (!bEndVert) {
+ end_k = FXSYS_Div(end_y - middle_y, end_x - middle_x);
+ end_c = middle_y - FXSYS_Mul(end_k, middle_x);
+ end_len = FXSYS_sqrt2(end_x - middle_x, end_y - middle_y);
+ end_dc = (FX_FLOAT)FXSYS_fabs(FXSYS_MulDiv(half_width, end_len, end_x - middle_x));
+ }
+ if (bStartVert) {
+ FX_FLOAT outside_x = start_x;
+ if (end_x < start_x) {
+ outside_x += half_width;
+ } else {
+ outside_x -= half_width;
+ }
+ FX_FLOAT outside_y;
+ if (start_y < FXSYS_Mul(end_k, start_x) + end_c) {
+ outside_y = FXSYS_Mul(end_k, outside_x) + end_c + end_dc;
+ } else {
+ outside_y = FXSYS_Mul(end_k, outside_x) + end_c - end_dc;
+ }
+ rect.UpdateRect(outside_x, outside_y);
+ return;
+ }
+ if (bEndVert) {
+ FX_FLOAT outside_x = end_x;
+ if (start_x < end_x) {
+ outside_x += half_width;
+ } else {
+ outside_x -= half_width;
+ }
+ FX_FLOAT outside_y;
+ if (end_y < FXSYS_Mul(start_k, end_x) + start_c) {
+ outside_y = FXSYS_Mul(start_k, outside_x) + start_c + start_dc;
+ } else {
+ outside_y = FXSYS_Mul(start_k, outside_x) + start_c - start_dc;
+ }
+ rect.UpdateRect(outside_x, outside_y);
+ return;
+ }
+ if (FXSYS_fabs(start_k - end_k) < 1.0f / 20) {
+ int start_dir = middle_x > start_x ? 1 : -1;
+ int end_dir = end_x > middle_x ? 1 : -1;
+ if (start_dir == end_dir) {
+ _UpdateLineEndPoints(rect, middle_x, middle_y, end_x, end_y, half_width);
+ } else {
+ _UpdateLineEndPoints(rect, start_x, start_y, middle_x, middle_y, half_width);
+ }
+ return;
+ }
+ FX_FLOAT start_outside_c = start_c;
+ if (end_y < FXSYS_Mul(start_k, end_x) + start_c) {
+ start_outside_c += start_dc;
+ } else {
+ start_outside_c -= start_dc;
+ }
+ FX_FLOAT end_outside_c = end_c;
+ if (start_y < FXSYS_Mul(end_k, start_x) + end_c) {
+ end_outside_c += end_dc;
+ } else {
+ end_outside_c -= end_dc;
+ }
+ FX_FLOAT join_x = FXSYS_Div(end_outside_c - start_outside_c, start_k - end_k);
+ FX_FLOAT join_y = FXSYS_Mul(start_k, join_x) + start_outside_c;
+ rect.UpdateRect(join_x, join_y);
+}
+CFX_FloatRect CFX_PathData::GetBoundingBox(FX_FLOAT line_width, FX_FLOAT miter_limit) const
+{
+ CFX_FloatRect rect(100000 * 1.0f, 100000 * 1.0f, -100000 * 1.0f, -100000 * 1.0f);
+ int iPoint = 0;
+ FX_FLOAT half_width = line_width;
+ int iStartPoint, iEndPoint, iMiddlePoint;
+ FX_BOOL bJoin;
+ while (iPoint < m_PointCount) {
+ if (m_pPoints[iPoint].m_Flag == FXPT_MOVETO) {
+ iStartPoint = iPoint + 1;
+ iEndPoint = iPoint;
+ bJoin = FALSE;
+ } else {
+ if (m_pPoints[iPoint].m_Flag == FXPT_BEZIERTO) {
+ rect.UpdateRect(m_pPoints[iPoint].m_PointX, m_pPoints[iPoint].m_PointY);
+ rect.UpdateRect(m_pPoints[iPoint + 1].m_PointX, m_pPoints[iPoint + 1].m_PointY);
+ iPoint += 2;
+ }
+ if (iPoint == m_PointCount - 1 || m_pPoints[iPoint + 1].m_Flag == FXPT_MOVETO) {
+ iStartPoint = iPoint - 1;
+ iEndPoint = iPoint;
+ bJoin = FALSE;
+ } else {
+ iStartPoint = iPoint - 1;
+ iMiddlePoint = iPoint;
+ iEndPoint = iPoint + 1;
+ bJoin = TRUE;
+ }
+ }
+ FX_FLOAT start_x = m_pPoints[iStartPoint].m_PointX;
+ FX_FLOAT start_y = m_pPoints[iStartPoint].m_PointY;
+ FX_FLOAT end_x = m_pPoints[iEndPoint].m_PointX;
+ FX_FLOAT end_y = m_pPoints[iEndPoint].m_PointY;
+ if (bJoin) {
+ FX_FLOAT middle_x = m_pPoints[iMiddlePoint].m_PointX;
+ FX_FLOAT middle_y = m_pPoints[iMiddlePoint].m_PointY;
+ _UpdateLineJoinPoints(rect, start_x, start_y, middle_x, middle_y, end_x, end_y, half_width, miter_limit);
+ } else {
+ _UpdateLineEndPoints(rect, start_x, start_y, end_x, end_y, half_width);
+ }
+ iPoint ++;
+ }
+ return rect;
+}
+void CFX_PathData::Transform(const CFX_AffineMatrix* pMatrix)
+{
+ if (pMatrix == NULL) {
+ return;
+ }
+ for (int i = 0; i < m_PointCount; i ++) {
+ pMatrix->Transform(m_pPoints[i].m_PointX, m_pPoints[i].m_PointY);
+ }
+}
+const int g_Distant[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
+FX_BOOL CFX_PathData::GetZeroAreaPath(CFX_PathData& NewPath, CFX_AffineMatrix* pMatrix, FX_BOOL&bThin, FX_BOOL bAdjust) const
+{
+ if (m_PointCount < 3) {
+ return FALSE;
+ }
+ if (m_PointCount == 3 && (m_pPoints[0].m_Flag & FXPT_TYPE) == FXPT_MOVETO &&
+ (m_pPoints[1].m_Flag & FXPT_TYPE) == FXPT_LINETO && (m_pPoints[2].m_Flag & FXPT_TYPE) == FXPT_LINETO
+ && m_pPoints[0].m_PointX == m_pPoints[2].m_PointX && m_pPoints[0].m_PointY == m_pPoints[2].m_PointY) {
+ NewPath.AddPointCount(2);
+ if (bAdjust) {
+ if (pMatrix) {
+ FX_FLOAT x = m_pPoints[0].m_PointX, y = m_pPoints[0].m_PointY;
+ pMatrix->TransformPoint(x, y);
+ x = (int)x + 0.5f;
+ y = (int)y + 0.5f;
+ NewPath.SetPoint(0, x, y, FXPT_MOVETO);
+ x = m_pPoints[1].m_PointX, y = m_pPoints[1].m_PointY;
+ pMatrix->TransformPoint(x, y);
+ x = (int)x + 0.5f;
+ y = (int)y + 0.5f;
+ NewPath.SetPoint(1, x, y, FXPT_LINETO);
+ pMatrix->SetIdentity();
+ } else {
+ FX_FLOAT x = (int)m_pPoints[0].m_PointX + 0.5f, y = (int)m_pPoints[0].m_PointY + 0.5f;
+ NewPath.SetPoint(0, x, y, FXPT_MOVETO);
+ x = (int)m_pPoints[1].m_PointX + 0.5f, y = (int)m_pPoints[1].m_PointY + 0.5f;
+ NewPath.SetPoint(1, x, y, FXPT_LINETO);
+ }
+ } else {
+ NewPath.SetPoint(0, m_pPoints[0].m_PointX, m_pPoints[0].m_PointY, FXPT_MOVETO);
+ NewPath.SetPoint(1, m_pPoints[1].m_PointX, m_pPoints[1].m_PointY, FXPT_LINETO);
+ }
+ if (m_pPoints[0].m_PointX != m_pPoints[1].m_PointX && m_pPoints[0].m_PointY != m_pPoints[1].m_PointY) {
+ bThin = TRUE;
+ }
+ return TRUE;
+ }
+ if (((m_PointCount > 3) && (m_PointCount % 2))) {
+ int mid = m_PointCount / 2;
+ FX_BOOL bZeroArea = FALSE;
+ CFX_PathData t_path;
+ for (int i = 0; i < mid; i++) {
+ if (!(m_pPoints[mid - i - 1].m_PointX == m_pPoints[mid + i + 1].m_PointX
+ && m_pPoints[mid - i - 1].m_PointY == m_pPoints[mid + i + 1].m_PointY &&
+ ((m_pPoints[mid - i - 1].m_Flag & FXPT_TYPE) != FXPT_BEZIERTO && (m_pPoints[mid + i + 1].m_Flag & FXPT_TYPE) != FXPT_BEZIERTO))) {
+ bZeroArea = TRUE;
+ break;
+ }
+ int new_count = t_path.GetPointCount();
+ t_path.AddPointCount(2);
+ t_path.SetPoint(new_count, m_pPoints[mid - i].m_PointX, m_pPoints[mid - i].m_PointY, FXPT_MOVETO);
+ t_path.SetPoint(new_count + 1, m_pPoints[mid - i - 1].m_PointX, m_pPoints[mid - i - 1].m_PointY, FXPT_LINETO);
+ }
+ if (!bZeroArea) {
+ NewPath.Append(&t_path, NULL);
+ bThin = TRUE;
+ return TRUE;
+ }
+ }
+ int stratPoint = 0;
+ int next = 0, i;
+ for (i = 0; i < m_PointCount; i++) {
+ int point_type = m_pPoints[i].m_Flag & FXPT_TYPE;
+ if (point_type == FXPT_MOVETO) {
+ stratPoint = i;
+ } else if (point_type == FXPT_LINETO) {
+ next = (i + 1 - stratPoint) % (m_PointCount - stratPoint) + stratPoint;
+ if ((m_pPoints[next].m_Flag & FXPT_TYPE) != FXPT_BEZIERTO && (m_pPoints[next].m_Flag & FXPT_TYPE) != FXPT_MOVETO) {
+ if((m_pPoints[i - 1].m_PointX == m_pPoints[i].m_PointX && m_pPoints[i].m_PointX == m_pPoints[next].m_PointX)
+ && ((m_pPoints[i].m_PointY - m_pPoints[i - 1].m_PointY) * (m_pPoints[i].m_PointY - m_pPoints[next].m_PointY) > 0)) {
+ int pre = i;
+ if (FXSYS_fabs(m_pPoints[i].m_PointY - m_pPoints[i - 1].m_PointY)
+ < FXSYS_fabs(m_pPoints[i].m_PointY - m_pPoints[next].m_PointY)) {
+ pre --;
+ next--;
+ }
+ int new_count = NewPath.GetPointCount();
+ NewPath.AddPointCount(2);
+ NewPath.SetPoint(new_count, m_pPoints[pre].m_PointX, m_pPoints[pre].m_PointY, FXPT_MOVETO);
+ NewPath.SetPoint(new_count + 1, m_pPoints[next].m_PointX, m_pPoints[next].m_PointY, FXPT_LINETO);
+ } else if((m_pPoints[i - 1].m_PointY == m_pPoints[i].m_PointY && m_pPoints[i].m_PointY == m_pPoints[next].m_PointY)
+ && ((m_pPoints[i].m_PointX - m_pPoints[i - 1].m_PointX) * (m_pPoints[i].m_PointX - m_pPoints[next].m_PointX) > 0)) {
+ int pre = i;
+ if (FXSYS_fabs(m_pPoints[i].m_PointX - m_pPoints[i - 1].m_PointX)
+ < FXSYS_fabs(m_pPoints[i].m_PointX - m_pPoints[next].m_PointX)) {
+ pre --;
+ next--;
+ }
+ int new_count = NewPath.GetPointCount();
+ NewPath.AddPointCount(2);
+ NewPath.SetPoint(new_count, m_pPoints[pre].m_PointX, m_pPoints[pre].m_PointY, FXPT_MOVETO);
+ NewPath.SetPoint(new_count + 1, m_pPoints[next].m_PointX, m_pPoints[next].m_PointY, FXPT_LINETO);
+ } else if ((m_pPoints[i - 1].m_Flag & FXPT_TYPE) == FXPT_MOVETO && (m_pPoints[next].m_Flag & FXPT_TYPE) == FXPT_LINETO &&
+ m_pPoints[i - 1].m_PointX == m_pPoints[next].m_PointX && m_pPoints[i - 1].m_PointY == m_pPoints[next].m_PointY
+ && m_pPoints[next].m_Flag & FXPT_CLOSEFIGURE) {
+ int new_count = NewPath.GetPointCount();
+ NewPath.AddPointCount(2);
+ NewPath.SetPoint(new_count, m_pPoints[i - 1].m_PointX, m_pPoints[i - 1].m_PointY, FXPT_MOVETO);
+ NewPath.SetPoint(new_count + 1, m_pPoints[i].m_PointX, m_pPoints[i].m_PointY, FXPT_LINETO);
+ bThin = TRUE;
+ }
+ }
+ } else if (point_type == FXPT_BEZIERTO) {
+ i += 2;
+ continue;
+ }
+ }
+ if (m_PointCount > 3 && NewPath.GetPointCount()) {
+ bThin = TRUE;
+ }
+ if (NewPath.GetPointCount() == 0) {
+ return FALSE;
+ }
+ return TRUE;
+}
+FX_BOOL CFX_PathData::IsRect() const
+{
+ if (m_PointCount != 5 && m_PointCount != 4) {
+ return FALSE;
+ }
+ if ((m_PointCount == 5 && (m_pPoints[0].m_PointX != m_pPoints[4].m_PointX ||
+ m_pPoints[0].m_PointY != m_pPoints[4].m_PointY)) ||
+ (m_pPoints[0].m_PointX == m_pPoints[2].m_PointX && m_pPoints[0].m_PointY == m_pPoints[2].m_PointY) ||
+ (m_pPoints[1].m_PointX == m_pPoints[3].m_PointX && m_pPoints[1].m_PointY == m_pPoints[3].m_PointY)) {
+ return FALSE;
+ }
+ if (m_pPoints[0].m_PointX != m_pPoints[3].m_PointX && m_pPoints[0].m_PointY != m_pPoints[3].m_PointY) {
+ return FALSE;
+ }
+ for (int i = 1; i < 4; i ++) {
+ if ((m_pPoints[i].m_Flag & FXPT_TYPE) != FXPT_LINETO) {
+ return FALSE;
+ }
+ if (m_pPoints[i].m_PointX != m_pPoints[i - 1].m_PointX && m_pPoints[i].m_PointY != m_pPoints[i - 1].m_PointY) {
+ return FALSE;
+ }
+ }
+ return m_PointCount == 5 || (m_pPoints[3].m_Flag & FXPT_CLOSEFIGURE);
+}
+FX_BOOL CFX_PathData::IsRect(const CFX_AffineMatrix* pMatrix, CFX_FloatRect* pRect) const
+{
+ if (pMatrix == NULL) {
+ if (!IsRect()) {
+ return FALSE;
+ }
+ if (pRect) {
+ pRect->left = m_pPoints[0].m_PointX;
+ pRect->right = m_pPoints[2].m_PointX;
+ pRect->bottom = m_pPoints[0].m_PointY;
+ pRect->top = m_pPoints[2].m_PointY;
+ pRect->Normalize();
+ }
+ return TRUE;
+ }
+ if (m_PointCount != 5 && m_PointCount != 4) {
+ return FALSE;
+ }
+ if ((m_PointCount == 5 && (m_pPoints[0].m_PointX != m_pPoints[4].m_PointX || m_pPoints[0].m_PointY != m_pPoints[4].m_PointY)) ||
+ (m_pPoints[1].m_PointX == m_pPoints[3].m_PointX && m_pPoints[1].m_PointY == m_pPoints[3].m_PointY)) {
+ return FALSE;
+ }
+ if (m_PointCount == 4 && m_pPoints[0].m_PointX != m_pPoints[3].m_PointX && m_pPoints[0].m_PointY != m_pPoints[3].m_PointY) {
+ return FALSE;
+ }
+ FX_FLOAT x[5], y[5];
+ for (int i = 0; i < m_PointCount; i ++) {
+ pMatrix->Transform(m_pPoints[i].m_PointX, m_pPoints[i].m_PointY, x[i], y[i]);
+ if (i) {
+ if ((m_pPoints[i].m_Flag & FXPT_TYPE) != FXPT_LINETO) {
+ return FALSE;
+ }
+ if (x[i] != x[i - 1] && y[i] != y[i - 1]) {
+ return FALSE;
+ }
+ }
+ }
+ if (pRect) {
+ pRect->left = x[0];
+ pRect->right = x[2];
+ pRect->bottom = y[0];
+ pRect->top = y[2];
+ pRect->Normalize();
+ }
+ return TRUE;
+}
+FX_BOOL CFX_PathData::Copy(const CFX_PathData &src)
+{
+ if (!SetPointCount(src.m_PointCount)) {
+ return FALSE;
+ }
+ FXSYS_memcpy32(m_pPoints, src.m_pPoints, sizeof(FX_PATHPOINT) * m_PointCount);
+ return TRUE;
+}
+CFX_GraphStateData::CFX_GraphStateData()
+{
+ m_LineCap = LineCapButt;
+ m_DashCount = 0;
+ m_DashArray = NULL;
+ m_DashPhase = 0;
+ m_LineJoin = LineJoinMiter;
+ m_MiterLimit = 10 * 1.0f;
+ m_LineWidth = 1.0f;
+}
+CFX_GraphStateData::CFX_GraphStateData(const CFX_GraphStateData& src)
+{
+ m_DashArray = NULL;
+ Copy(src);
+}
+void CFX_GraphStateData::Copy(const CFX_GraphStateData& src)
+{
+ m_LineCap = src.m_LineCap;
+ m_DashCount = src.m_DashCount;
+ if (m_DashArray) {
+ FX_Free(m_DashArray);
+ }
+ m_DashArray = NULL;
+ m_DashPhase = src.m_DashPhase;
+ m_LineJoin = src.m_LineJoin;
+ m_MiterLimit = src.m_MiterLimit;
+ m_LineWidth = src.m_LineWidth;
+ if (m_DashCount) {
+ m_DashArray = FX_Alloc(FX_FLOAT, m_DashCount);
+ if (!m_DashArray) {
+ return;
+ }
+ FXSYS_memcpy32(m_DashArray, src.m_DashArray, m_DashCount * sizeof(FX_FLOAT));
+ }
+}
+CFX_GraphStateData::~CFX_GraphStateData()
+{
+ if (m_DashArray) {
+ FX_Free(m_DashArray);
+ }
+}
+void CFX_GraphStateData::SetDashCount(int count)
+{
+ if (m_DashArray) {
+ FX_Free(m_DashArray);
+ }
+ m_DashArray = NULL;
+ m_DashCount = count;
+ if (count == 0) {
+ return;
+ }
+ m_DashArray = FX_Alloc(FX_FLOAT, count);
+}
diff --git a/core/src/fxge/ge/fx_ge_ps.cpp b/core/src/fxge/ge/fx_ge_ps.cpp
index a39ab2dee0..d664b706b0 100644
--- a/core/src/fxge/ge/fx_ge_ps.cpp
+++ b/core/src/fxge/ge/fx_ge_ps.cpp
@@ -1,657 +1,657 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../../include/fxge/fx_ge.h"
-#include "../../../include/fxcodec/fx_codec.h"
-#include "text_int.h"
-struct PSGlyph {
- CFX_Font* m_pFont;
- FX_DWORD m_GlyphIndex;
- FX_BOOL m_bGlyphAdjust;
- FX_FLOAT m_AdjustMatrix[4];
-};
-class CPSFont : public CFX_Object
-{
-public:
- PSGlyph m_Glyphs[256];
- int m_nGlyphs;
-};
-CFX_PSRenderer::CFX_PSRenderer()
-{
- m_pOutput = NULL;
- m_bColorSet = m_bGraphStateSet = FALSE;
- m_bInited = FALSE;
-}
-CFX_PSRenderer::~CFX_PSRenderer()
-{
- for (int i = 0; i < (int)m_PSFontList.GetSize(); i ++) {
- CPSFont* pFont = m_PSFontList[i];
- delete pFont;
- }
-}
-#define OUTPUT_PS(str) m_pOutput->OutputPS(str, sizeof str-1)
-void CFX_PSRenderer::Init(IFX_PSOutput* pOutput, int pslevel, int width, int height, FX_BOOL bCmykOutput)
-{
- m_PSLevel = pslevel;
- m_pOutput = pOutput;
- m_ClipBox.left = m_ClipBox.top = 0;
- m_ClipBox.right = width;
- m_ClipBox.bottom = height;
- m_bCmykOutput = bCmykOutput;
-}
-FX_BOOL CFX_PSRenderer::StartRendering()
-{
- if (m_bInited) {
- return TRUE;
- }
- static const char init_str[] = "\nsave\n/im/initmatrix load def\n"
- "/n/newpath load def/m/moveto load def/l/lineto load def/c/curveto load def/h/closepath load def\n"
- "/f/fill load def/F/eofill load def/s/stroke load def/W/clip load def/W*/eoclip load def\n"
- "/rg/setrgbcolor load def/k/setcmykcolor load def\n"
- "/J/setlinecap load def/j/setlinejoin load def/w/setlinewidth load def/M/setmiterlimit load def/d/setdash load def\n"
- "/q/gsave load def/Q/grestore load def/iM/imagemask load def\n"
- "/Tj/show load def/Ff/findfont load def/Fs/scalefont load def/Sf/setfont load def\n"
- "/cm/concat load def/Cm/currentmatrix load def/mx/matrix load def/sm/setmatrix load def\n"
- ;
- OUTPUT_PS(init_str);
- m_bInited = TRUE;
- return TRUE;
-}
-void CFX_PSRenderer::EndRendering()
-{
- if (m_bInited) {
- OUTPUT_PS("\nrestore\n");
- }
- m_bInited = FALSE;
-}
-void CFX_PSRenderer::SaveState()
-{
- StartRendering();
- OUTPUT_PS("q\n");
- m_ClipBoxStack.Add(m_ClipBox);
-}
-void CFX_PSRenderer::RestoreState(FX_BOOL bKeepSaved)
-{
- StartRendering();
- if (bKeepSaved) {
- OUTPUT_PS("Q\nq\n");
- } else {
- OUTPUT_PS("Q\n");
- }
- m_bColorSet = m_bGraphStateSet = FALSE;
- m_ClipBox = m_ClipBoxStack.GetAt(m_ClipBoxStack.GetSize() - 1);
- if (!bKeepSaved) {
- m_ClipBoxStack.RemoveAt(m_ClipBoxStack.GetSize() - 1);
- }
-}
-void CFX_PSRenderer::OutputPath(const CFX_PathData* pPathData, const CFX_AffineMatrix* pObject2Device)
-{
- int nPoints = pPathData->GetPointCount();
- CFX_ByteTextBuf buf;
- buf.EstimateSize(nPoints * 10);
- for (int i = 0; i < nPoints; i ++) {
- FX_BYTE flag = pPathData->GetFlag(i);
- FX_FLOAT x = pPathData->GetPointX(i);
- FX_FLOAT y = pPathData->GetPointY(i);
- if (pObject2Device) {
- pObject2Device->Transform(x, y);
- }
- buf << x << FX_BSTRC(" ") << y;
- switch (flag & FXPT_TYPE) {
- case FXPT_MOVETO:
- buf << FX_BSTRC(" m ");
- break;
- case FXPT_LINETO:
- if (flag & FXPT_CLOSEFIGURE) {
- buf << FX_BSTRC(" l h ");
- } else {
- buf << FX_BSTRC(" l ");
- }
- break;
- case FXPT_BEZIERTO: {
- FX_FLOAT x1 = pPathData->GetPointX(i + 1);
- FX_FLOAT x2 = pPathData->GetPointX(i + 2);
- FX_FLOAT y1 = pPathData->GetPointY(i + 1);
- FX_FLOAT y2 = pPathData->GetPointY(i + 2);
- if (pObject2Device) {
- pObject2Device->Transform(x1, y1);
- pObject2Device->Transform(x2, y2);
- }
- buf << FX_BSTRC(" ") << x1 << FX_BSTRC(" ") << y1 << FX_BSTRC(" ") << x2 << FX_BSTRC(" ") << y2;
- if (flag & FXPT_CLOSEFIGURE) {
- buf << FX_BSTRC(" c h\n");
- } else {
- buf << FX_BSTRC(" c\n");
- }
- i += 2;
- break;
- }
- }
- }
- m_pOutput->OutputPS((FX_LPCSTR)buf.GetBuffer(), buf.GetSize());
-}
-void CFX_PSRenderer::SetClip_PathFill(const CFX_PathData* pPathData,
- const CFX_AffineMatrix* pObject2Device,
- int fill_mode
- )
-{
- StartRendering();
- OutputPath(pPathData, pObject2Device);
- CFX_FloatRect rect = pPathData->GetBoundingBox();
- if (pObject2Device) {
- rect.Transform(pObject2Device);
- }
- m_ClipBox.Intersect(rect.GetOutterRect());
- if ((fill_mode & 3) == FXFILL_WINDING) {
- OUTPUT_PS("W n\n");
- } else {
- OUTPUT_PS("W* n\n");
- }
-}
-void CFX_PSRenderer::SetClip_PathStroke(const CFX_PathData* pPathData,
- const CFX_AffineMatrix* pObject2Device,
- const CFX_GraphStateData* pGraphState
- )
-{
- StartRendering();
- SetGraphState(pGraphState);
- if (pObject2Device) {
- CFX_ByteTextBuf buf;
- buf << FX_BSTRC("mx Cm [") << pObject2Device->a << FX_BSTRC(" ") << pObject2Device->b << FX_BSTRC(" ") <<
- pObject2Device->c << FX_BSTRC(" ") << pObject2Device->d << FX_BSTRC(" ") << pObject2Device->e <<
- FX_BSTRC(" ") << pObject2Device->f << FX_BSTRC("]cm ");
- m_pOutput->OutputPS((FX_LPCSTR)buf.GetBuffer(), buf.GetSize());
- }
- OutputPath(pPathData, NULL);
- CFX_FloatRect rect = pPathData->GetBoundingBox(pGraphState->m_LineWidth, pGraphState->m_MiterLimit);
- rect.Transform(pObject2Device);
- m_ClipBox.Intersect(rect.GetOutterRect());
- if (pObject2Device) {
- OUTPUT_PS("strokepath W n sm\n");
- } else {
- OUTPUT_PS("strokepath W n\n");
- }
-}
-FX_BOOL CFX_PSRenderer::DrawPath(const CFX_PathData* pPathData,
- const CFX_AffineMatrix* pObject2Device,
- const CFX_GraphStateData* pGraphState,
- FX_DWORD fill_color,
- FX_DWORD stroke_color,
- int fill_mode,
- int alpha_flag,
- void* pIccTransform
- )
-{
- StartRendering();
- int fill_alpha = FXGETFLAG_COLORTYPE(alpha_flag) ? FXGETFLAG_ALPHA_FILL(alpha_flag) : FXARGB_A(fill_color);
- int stroke_alpha = FXGETFLAG_COLORTYPE(alpha_flag) ? FXGETFLAG_ALPHA_STROKE(alpha_flag) : FXARGB_A(stroke_color);
- if (fill_alpha && fill_alpha < 255) {
- return FALSE;
- }
- if (stroke_alpha && stroke_alpha < 255) {
- return FALSE;
- }
- if (fill_alpha == 0 && stroke_alpha == 0) {
- return FALSE;
- }
- if (stroke_alpha) {
- SetGraphState(pGraphState);
- if (pObject2Device) {
- CFX_ByteTextBuf buf;
- buf << FX_BSTRC("mx Cm [") << pObject2Device->a << FX_BSTRC(" ") << pObject2Device->b << FX_BSTRC(" ") <<
- pObject2Device->c << FX_BSTRC(" ") << pObject2Device->d << FX_BSTRC(" ") << pObject2Device->e <<
- FX_BSTRC(" ") << pObject2Device->f << FX_BSTRC("]cm ");
- m_pOutput->OutputPS((FX_LPCSTR)buf.GetBuffer(), buf.GetSize());
- }
- }
- OutputPath(pPathData, stroke_alpha ? NULL : pObject2Device);
- if (fill_mode && fill_alpha) {
- SetColor(fill_color, alpha_flag, pIccTransform);
- if ((fill_mode & 3) == FXFILL_WINDING) {
- if (stroke_alpha) {
- OUTPUT_PS("q f Q ");
- } else {
- OUTPUT_PS("f");
- }
- } else if ((fill_mode & 3) == FXFILL_ALTERNATE) {
- if (stroke_alpha) {
- OUTPUT_PS("q F Q ");
- } else {
- OUTPUT_PS("F");
- }
- }
- }
- if (stroke_alpha) {
- SetColor(stroke_color, alpha_flag, pIccTransform);
- if (pObject2Device) {
- OUTPUT_PS("s sm");
- } else {
- OUTPUT_PS("s");
- }
- }
- OUTPUT_PS("\n");
- return TRUE;
-}
-void CFX_PSRenderer::SetGraphState(const CFX_GraphStateData* pGraphState)
-{
- CFX_ByteTextBuf buf;
- if (!m_bGraphStateSet || m_CurGraphState.m_LineCap != pGraphState->m_LineCap) {
- buf << pGraphState->m_LineCap << FX_BSTRC(" J\n");
- }
- if (!m_bGraphStateSet || m_CurGraphState.m_DashCount != pGraphState->m_DashCount ||
- FXSYS_memcmp32(m_CurGraphState.m_DashArray, pGraphState->m_DashArray, sizeof(FX_FLOAT)*m_CurGraphState.m_DashCount)) {
- buf << FX_BSTRC("[");
- for (int i = 0; i < pGraphState->m_DashCount; i ++) {
- buf << pGraphState->m_DashArray[i] << FX_BSTRC(" ");
- }
- buf << FX_BSTRC("]") << pGraphState->m_DashPhase << FX_BSTRC(" d\n");
- }
- if (!m_bGraphStateSet || m_CurGraphState.m_LineJoin != pGraphState->m_LineJoin) {
- buf << pGraphState->m_LineJoin << FX_BSTRC(" j\n");
- }
- if (!m_bGraphStateSet || m_CurGraphState.m_LineWidth != pGraphState->m_LineWidth) {
- buf << pGraphState->m_LineWidth << FX_BSTRC(" w\n");
- }
- if (!m_bGraphStateSet || m_CurGraphState.m_MiterLimit != pGraphState->m_MiterLimit) {
- buf << pGraphState->m_MiterLimit << FX_BSTRC(" M\n");
- }
- m_CurGraphState.Copy(*pGraphState);
- m_bGraphStateSet = TRUE;
- if (buf.GetSize()) {
- m_pOutput->OutputPS((FX_LPCSTR)buf.GetBuffer(), buf.GetSize());
- }
-}
-static void FaxCompressData(FX_LPBYTE src_buf, int width, int height, FX_LPBYTE& dest_buf, FX_DWORD& dest_size)
-{
- CCodec_ModuleMgr* pEncoders = CFX_GEModule::Get()->GetCodecModule();
- if (width * height > 128 && pEncoders && pEncoders->GetFaxModule()->Encode(src_buf, width, height, (width + 7) / 8, dest_buf, dest_size)) {
- FX_Free(src_buf);
- } else {
- dest_buf = src_buf;
- dest_size = (width + 7) / 8 * height;
- }
-}
-static void PSCompressData(int PSLevel, FX_LPBYTE src_buf, FX_DWORD src_size,
- FX_LPBYTE& output_buf, FX_DWORD& output_size, FX_LPCSTR& filter)
-{
- output_buf = src_buf;
- output_size = src_size;
- filter = "";
- if (src_size < 1024) {
- return;
- }
- CCodec_ModuleMgr* pEncoders = CFX_GEModule::Get()->GetCodecModule();
- FX_LPBYTE dest_buf = NULL;
- FX_DWORD dest_size = src_size;
- if (PSLevel >= 3) {
- if (pEncoders && pEncoders->GetFlateModule()->Encode(src_buf, src_size, dest_buf, dest_size)) {
- filter = "/FlateDecode filter ";
- }
- } else {
- if (pEncoders && pEncoders->GetBasicModule()->RunLengthEncode(src_buf, src_size, dest_buf, dest_size)) {
- filter = "/RunLengthDecode filter ";
- }
- }
- if (dest_size < src_size) {
- output_buf = dest_buf;
- output_size = dest_size;
- } else {
- filter = NULL;
- if (dest_buf) {
- FX_Free(dest_buf);
- }
- }
-}
-FX_BOOL CFX_PSRenderer::SetDIBits(const CFX_DIBSource* pSource, FX_DWORD color, int left, int top,
- int alpha_flag, void* pIccTransform)
-{
- StartRendering();
- CFX_AffineMatrix matrix((FX_FLOAT)(pSource->GetWidth()), 0.0f, 0.0f, -(FX_FLOAT)(pSource->GetHeight()),
- (FX_FLOAT)(left), (FX_FLOAT)(top + pSource->GetHeight()));
- return DrawDIBits(pSource, color, &matrix, 0, alpha_flag, pIccTransform);
-}
-FX_BOOL CFX_PSRenderer::StretchDIBits(const CFX_DIBSource* pSource, FX_DWORD color, int dest_left, int dest_top,
- int dest_width, int dest_height, FX_DWORD flags,
- int alpha_flag, void* pIccTransform)
-{
- StartRendering();
- CFX_AffineMatrix matrix((FX_FLOAT)(dest_width), 0.0f, 0.0f, (FX_FLOAT)(-dest_height),
- (FX_FLOAT)(dest_left), (FX_FLOAT)(dest_top + dest_height));
- return DrawDIBits(pSource, color, &matrix, flags, alpha_flag, pIccTransform);
-}
-FX_BOOL CFX_PSRenderer::DrawDIBits(const CFX_DIBSource* pSource, FX_DWORD color,
- const CFX_AffineMatrix* pMatrix, FX_DWORD flags,
- int alpha_flag, void* pIccTransform)
-{
- StartRendering();
- if ((pMatrix->a == 0 && pMatrix->b == 0) || (pMatrix->c == 0 && pMatrix->d == 0)) {
- return TRUE;
- }
- if (pSource->HasAlpha()) {
- return FALSE;
- }
- int alpha = FXGETFLAG_COLORTYPE(alpha_flag) ? FXGETFLAG_ALPHA_FILL(color) : FXARGB_A(color);
- if (pSource->IsAlphaMask() && (alpha < 255 || pSource->GetBPP() != 1)) {
- return FALSE;
- }
- OUTPUT_PS("q\n");
- CFX_ByteTextBuf buf;
- buf << FX_BSTRC("[") << pMatrix->a << FX_BSTRC(" ") << pMatrix->b << FX_BSTRC(" ") <<
- pMatrix->c << FX_BSTRC(" ") << pMatrix->d << FX_BSTRC(" ") << pMatrix->e <<
- FX_BSTRC(" ") << pMatrix->f << FX_BSTRC("]cm ");
- int width = pSource->GetWidth();
- int height = pSource->GetHeight();
- buf << width << FX_BSTRC(" ") << height;
- if (pSource->GetBPP() == 1 && pSource->GetPalette() == NULL) {
- int pitch = (width + 7) / 8;
- FX_DWORD src_size = height * pitch;
- FX_LPBYTE src_buf = FX_Alloc(FX_BYTE, src_size);
- if (!src_buf) {
- return FALSE;
- }
- for (int row = 0; row < height; row ++) {
- FX_LPCBYTE src_scan = pSource->GetScanline(row);
- FXSYS_memcpy32(src_buf + row * pitch, src_scan, pitch);
- }
- FX_LPBYTE output_buf;
- FX_DWORD output_size;
- FaxCompressData(src_buf, width, height, output_buf, output_size);
- if (pSource->IsAlphaMask()) {
- SetColor(color, alpha_flag, pIccTransform);
- m_bColorSet = FALSE;
- buf << FX_BSTRC(" true[");
- } else {
- buf << FX_BSTRC(" 1[");
- }
- buf << width << FX_BSTRC(" 0 0 -") << height << FX_BSTRC(" 0 ") << height <<
- FX_BSTRC("]currentfile/ASCII85Decode filter ");
- if (output_buf != src_buf)
- buf << FX_BSTRC("<</K -1/EndOfBlock false/Columns ") << width << FX_BSTRC("/Rows ") << height <<
- FX_BSTRC(">>/CCITTFaxDecode filter ");
- if (pSource->IsAlphaMask()) {
- buf << FX_BSTRC("iM\n");
- } else {
- buf << FX_BSTRC("false 1 colorimage\n");
- }
- m_pOutput->OutputPS((FX_LPCSTR)buf.GetBuffer(), buf.GetSize());
- WritePSBinary(output_buf, output_size);
- FX_Free(output_buf);
- } else {
- CFX_DIBSource* pConverted = (CFX_DIBSource*)pSource;
- if (pIccTransform) {
- FXDIB_Format format = m_bCmykOutput ? FXDIB_Cmyk : FXDIB_Rgb;
- pConverted = pSource->CloneConvert(format, NULL, pIccTransform);
- } else {
- switch (pSource->GetFormat()) {
- case FXDIB_1bppRgb:
- case FXDIB_Rgb32:
- pConverted = pSource->CloneConvert(FXDIB_Rgb);
- break;
- case FXDIB_8bppRgb:
- if (pSource->GetPalette() != NULL) {
- pConverted = pSource->CloneConvert(FXDIB_Rgb);
- }
- break;
- case FXDIB_1bppCmyk:
- pConverted = pSource->CloneConvert(FXDIB_Cmyk);
- break;
- case FXDIB_8bppCmyk:
- if (pSource->GetPalette() != NULL) {
- pConverted = pSource->CloneConvert(FXDIB_Cmyk);
- }
- break;
- default:
- break;
- }
- }
- if (pConverted == NULL) {
- OUTPUT_PS("\nQ\n");
- return FALSE;
- }
- int Bpp = pConverted->GetBPP() / 8;
- FX_LPBYTE output_buf = NULL;
- FX_STRSIZE output_size = 0;
- FX_LPCSTR filter = NULL;
- if (flags & FXRENDER_IMAGE_LOSSY) {
- CCodec_ModuleMgr* pEncoders = CFX_GEModule::Get()->GetCodecModule();
- if (pEncoders && pEncoders->GetJpegModule()->Encode(pConverted, output_buf, output_size)) {
- filter = "/DCTDecode filter ";
- }
- }
- if (filter == NULL) {
- int src_pitch = width * Bpp;
- output_size = height * src_pitch;
- output_buf = FX_Alloc(FX_BYTE, output_size);
- if (!output_buf) {
- if (pConverted != pSource) {
- delete pConverted;
- pConverted = NULL;
- }
- return FALSE;
- }
- for (int row = 0; row < height; row ++) {
- FX_LPCBYTE src_scan = pConverted->GetScanline(row);
- FX_LPBYTE dest_scan = output_buf + row * src_pitch;
- if (Bpp == 3) {
- for (int col = 0; col < width; col ++) {
- *dest_scan++ = src_scan[2];
- *dest_scan++ = src_scan[1];
- *dest_scan++ = *src_scan;
- src_scan += 3;
- }
- } else {
- FXSYS_memcpy32(dest_scan, src_scan, src_pitch);
- }
- }
- FX_LPBYTE compressed_buf;
- FX_DWORD compressed_size;
- PSCompressData(m_PSLevel, output_buf, output_size, compressed_buf, compressed_size, filter);
- if (output_buf != compressed_buf) {
- FX_Free(output_buf);
- }
- output_buf = compressed_buf;
- output_size = compressed_size;
- }
- if (pConverted != pSource) {
- delete pConverted;
- pConverted = NULL;
- }
- buf << FX_BSTRC(" 8[");
- buf << width << FX_BSTRC(" 0 0 -") << height << FX_BSTRC(" 0 ") << height << FX_BSTRC("]");
- buf << FX_BSTRC("currentfile/ASCII85Decode filter ");
- if (filter) {
- buf << filter;
- }
- buf << FX_BSTRC("false ") << Bpp;
- buf << FX_BSTRC(" colorimage\n");
- m_pOutput->OutputPS((FX_LPCSTR)buf.GetBuffer(), buf.GetSize());
- WritePSBinary(output_buf, output_size);
- FX_Free(output_buf);
- }
- OUTPUT_PS("\nQ\n");
- return TRUE;
-}
-void CFX_PSRenderer::SetColor(FX_DWORD color, int alpha_flag, void* pIccTransform)
-{
- if (!CFX_GEModule::Get()->GetCodecModule() || !CFX_GEModule::Get()->GetCodecModule()->GetIccModule()) {
- pIccTransform = NULL;
- }
- FX_BOOL bCMYK = FALSE;
- if (pIccTransform) {
- ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
- color = FXGETFLAG_COLORTYPE(alpha_flag) ? FXCMYK_TODIB(color) : FXARGB_TODIB(color);
- FX_LPBYTE pColor = (FX_LPBYTE)&color;
- pIccModule->TranslateScanline(pIccTransform, pColor, pColor, 1);
- color = m_bCmykOutput ? FXCMYK_TODIB(color) : FXARGB_TODIB(color);
- bCMYK = m_bCmykOutput;
- } else {
- bCMYK = FXGETFLAG_COLORTYPE(alpha_flag);
- }
- if (bCMYK != m_bCmykOutput || !m_bColorSet || m_LastColor != color) {
- CFX_ByteTextBuf buf;
- if (bCMYK) {
- buf << FXSYS_GetCValue(color) / 255.0 << FX_BSTRC(" ") << FXSYS_GetMValue(color) / 255.0 << FX_BSTRC(" ")
- << FXSYS_GetYValue(color) / 255.0 << FX_BSTRC(" ") << FXSYS_GetKValue(color) / 255.0 << FX_BSTRC(" k\n");
- } else {
- buf << FXARGB_R(color) / 255.0 << FX_BSTRC(" ") << FXARGB_G(color) / 255.0 << FX_BSTRC(" ")
- << FXARGB_B(color) / 255.0 << FX_BSTRC(" rg\n");
- }
- if (bCMYK == m_bCmykOutput) {
- m_bColorSet = TRUE;
- m_LastColor = color;
- }
- m_pOutput->OutputPS((FX_LPCSTR)buf.GetBuffer(), buf.GetSize());
- }
-}
-void CFX_PSRenderer::FindPSFontGlyph(CFX_FaceCache* pFaceCache, CFX_Font* pFont, const FXTEXT_CHARPOS& charpos,
- int& ps_fontnum, int &ps_glyphindex)
-{
- for (int i = 0; i < (int)m_PSFontList.GetSize(); i ++) {
- CPSFont* pPSFont = m_PSFontList[i];
- for (int j = 0; j < pPSFont->m_nGlyphs; j ++)
- if (pPSFont->m_Glyphs[j].m_pFont == pFont && pPSFont->m_Glyphs[j].m_GlyphIndex == charpos.m_GlyphIndex) {
- if ((!pPSFont->m_Glyphs[j].m_bGlyphAdjust && !charpos.m_bGlyphAdjust) ||
- (pPSFont->m_Glyphs[j].m_bGlyphAdjust && charpos.m_bGlyphAdjust &&
- (FXSYS_fabs(pPSFont->m_Glyphs[j].m_AdjustMatrix[0] - charpos.m_AdjustMatrix[0]) < 0.01 &&
- FXSYS_fabs(pPSFont->m_Glyphs[j].m_AdjustMatrix[1] - charpos.m_AdjustMatrix[1]) < 0.01 &&
- FXSYS_fabs(pPSFont->m_Glyphs[j].m_AdjustMatrix[2] - charpos.m_AdjustMatrix[2]) < 0.01 &&
- FXSYS_fabs(pPSFont->m_Glyphs[j].m_AdjustMatrix[3] - charpos.m_AdjustMatrix[3]) < 0.01))) {
- ps_fontnum = i;
- ps_glyphindex = j;
- return;
- }
- }
- }
- if (m_PSFontList.GetSize() == 0 || m_PSFontList[m_PSFontList.GetSize() - 1]->m_nGlyphs == 256) {
- CPSFont* pPSFont = FX_NEW CPSFont;
- if (!pPSFont) {
- return;
- }
- pPSFont->m_nGlyphs = 0;
- m_PSFontList.Add(pPSFont);
- CFX_ByteTextBuf buf;
- buf << FX_BSTRC("8 dict begin/FontType 3 def/FontMatrix[1 0 0 1 0 0]def\n"
- "/FontBBox[0 0 0 0]def/Encoding 256 array def 0 1 255{Encoding exch/.notdef put}for\n"
- "/CharProcs 1 dict def CharProcs begin/.notdef {} def end\n"
- "/BuildGlyph{1 0 -10 -10 10 10 setcachedevice exch/CharProcs get exch 2 copy known not{pop/.notdef}if get exec}bind def\n"
- "/BuildChar{1 index/Encoding get exch get 1 index/BuildGlyph get exec}bind def\n"
- "currentdict end\n");
- buf << FX_BSTRC("/X") << m_PSFontList.GetSize() - 1 << FX_BSTRC(" exch definefont pop\n");
- m_pOutput->OutputPS((FX_LPCSTR)buf.GetBuffer(), buf.GetSize());
- buf.Clear();
- }
- ps_fontnum = m_PSFontList.GetSize() - 1;
- CPSFont* pPSFont = m_PSFontList[ps_fontnum];
- ps_glyphindex = pPSFont->m_nGlyphs;
- pPSFont->m_Glyphs[ps_glyphindex].m_GlyphIndex = charpos.m_GlyphIndex;
- pPSFont->m_Glyphs[ps_glyphindex].m_pFont = pFont;
- pPSFont->m_Glyphs[ps_glyphindex].m_bGlyphAdjust = charpos.m_bGlyphAdjust;
- if (charpos.m_bGlyphAdjust) {
- pPSFont->m_Glyphs[ps_glyphindex].m_AdjustMatrix[0] = charpos.m_AdjustMatrix[0];
- pPSFont->m_Glyphs[ps_glyphindex].m_AdjustMatrix[1] = charpos.m_AdjustMatrix[1];
- pPSFont->m_Glyphs[ps_glyphindex].m_AdjustMatrix[2] = charpos.m_AdjustMatrix[2];
- pPSFont->m_Glyphs[ps_glyphindex].m_AdjustMatrix[3] = charpos.m_AdjustMatrix[3];
- }
- pPSFont->m_nGlyphs ++;
- CFX_AffineMatrix matrix;
- if (charpos.m_bGlyphAdjust)
- matrix.Set(charpos.m_AdjustMatrix[0], charpos.m_AdjustMatrix[1],
- charpos.m_AdjustMatrix[2], charpos.m_AdjustMatrix[3], 0, 0);
- matrix.Concat(1.0f, 0, 0, 1.0f, 0, 0);
- const CFX_PathData* pPathData = pFaceCache->LoadGlyphPath(pFont, charpos.m_GlyphIndex, charpos.m_FontCharWidth);
- if (pPathData == NULL) {
- return;
- }
- CFX_PathData TransformedPath(*pPathData);
- if (charpos.m_bGlyphAdjust) {
- TransformedPath.Transform(&matrix);
- }
- CFX_ByteTextBuf buf;
- buf << FX_BSTRC("/X") << ps_fontnum << FX_BSTRC(" Ff/CharProcs get begin/")
- << ps_glyphindex << FX_BSTRC("{");
- buf << FX_BSTRC("n ");
- for (int p = 0; p < TransformedPath.GetPointCount(); p ++) {
- FX_FLOAT x = TransformedPath.GetPointX(p), y = TransformedPath.GetPointY(p);
- switch (TransformedPath.GetFlag(p) & FXPT_TYPE) {
- case FXPT_MOVETO: {
- buf << x << FX_BSTRC(" ") << y << FX_BSTRC(" m\n");
- break;
- }
- case FXPT_LINETO: {
- buf << x << FX_BSTRC(" ") << y << FX_BSTRC(" l\n");
- break;
- }
- case FXPT_BEZIERTO: {
- buf << x << FX_BSTRC(" ") << y << FX_BSTRC(" ")
- << TransformedPath.GetPointX(p + 1) << FX_BSTRC(" ")
- << TransformedPath.GetPointY(p + 1) << FX_BSTRC(" ")
- << TransformedPath.GetPointX(p + 2) << FX_BSTRC(" ")
- << TransformedPath.GetPointY(p + 2) << FX_BSTRC(" c\n");
- p += 2;
- break;
- }
- }
- }
- buf << FX_BSTRC("f");
- buf << FX_BSTRC("}bind def end\n");
- buf << FX_BSTRC("/X") << ps_fontnum << FX_BSTRC(" Ff/Encoding get ") << ps_glyphindex
- << FX_BSTRC("/") << ps_glyphindex << FX_BSTRC(" put\n");
- m_pOutput->OutputPS((FX_LPCSTR)buf.GetBuffer(), buf.GetSize());
-}
-FX_BOOL CFX_PSRenderer::DrawText(int nChars, const FXTEXT_CHARPOS* pCharPos, CFX_Font* pFont,
- CFX_FontCache* pCache, const CFX_AffineMatrix* pObject2Device,
- FX_FLOAT font_size, FX_DWORD color,
- int alpha_flag, void* pIccTransform)
-{
- StartRendering();
- int alpha = FXGETFLAG_COLORTYPE(alpha_flag) ? FXGETFLAG_ALPHA_FILL(alpha_flag) : FXARGB_A(color);
- if (alpha < 255) {
- return FALSE;
- }
- if ((pObject2Device->a == 0 && pObject2Device->b == 0) || (pObject2Device->c == 0 && pObject2Device->d == 0)) {
- return TRUE;
- }
- SetColor(color, alpha_flag, pIccTransform);
- CFX_ByteTextBuf buf;
- buf << FX_BSTRC("q[") << pObject2Device->a << FX_BSTRC(" ") << pObject2Device->b << FX_BSTRC(" ")
- << pObject2Device->c << FX_BSTRC(" ") << pObject2Device->d;
- buf << FX_BSTRC(" ") << pObject2Device->e << FX_BSTRC(" ") << pObject2Device->f << "]cm\n";
- if (pCache == NULL) {
- pCache = CFX_GEModule::Get()->GetFontCache();
- }
- CFX_FaceCache* pFaceCache = pCache->GetCachedFace(pFont);
- FX_FONTCACHE_DEFINE(pCache, pFont);
- int last_fontnum = -1;
- for (int i = 0; i < nChars; i ++) {
- int ps_fontnum, ps_glyphindex;
- FindPSFontGlyph(pFaceCache, pFont, pCharPos[i], ps_fontnum, ps_glyphindex);
- if (last_fontnum != ps_fontnum) {
- buf << FX_BSTRC("/X") << ps_fontnum << FX_BSTRC(" Ff ") << font_size
- << FX_BSTRC(" Fs Sf ");
- last_fontnum = ps_fontnum;
- }
- buf << pCharPos[i].m_OriginX << FX_BSTRC(" ")
- << pCharPos[i].m_OriginY << FX_BSTRC(" m");
- CFX_ByteString hex;
- hex.Format("<%02X>", ps_glyphindex);
- buf << hex << FX_BSTRC("Tj\n");
- }
- buf << FX_BSTRC("Q\n");
- m_pOutput->OutputPS((FX_LPCSTR)buf.GetBuffer(), buf.GetSize());
- return TRUE;
-}
-void CFX_PSRenderer::WritePSBinary(FX_LPCBYTE data, int len)
-{
- FX_LPBYTE dest_buf;
- FX_DWORD dest_size;
- CCodec_ModuleMgr* pEncoders = CFX_GEModule::Get()->GetCodecModule();
- if (pEncoders && pEncoders->GetBasicModule()->A85Encode(data, len, dest_buf, dest_size)) {
- m_pOutput->OutputPS((FX_LPCSTR)dest_buf, dest_size);
- FX_Free(dest_buf);
- } else {
- m_pOutput->OutputPS((FX_LPCSTR)data, len);
- }
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxge/fx_ge.h"
+#include "../../../include/fxcodec/fx_codec.h"
+#include "text_int.h"
+struct PSGlyph {
+ CFX_Font* m_pFont;
+ FX_DWORD m_GlyphIndex;
+ FX_BOOL m_bGlyphAdjust;
+ FX_FLOAT m_AdjustMatrix[4];
+};
+class CPSFont : public CFX_Object
+{
+public:
+ PSGlyph m_Glyphs[256];
+ int m_nGlyphs;
+};
+CFX_PSRenderer::CFX_PSRenderer()
+{
+ m_pOutput = NULL;
+ m_bColorSet = m_bGraphStateSet = FALSE;
+ m_bInited = FALSE;
+}
+CFX_PSRenderer::~CFX_PSRenderer()
+{
+ for (int i = 0; i < (int)m_PSFontList.GetSize(); i ++) {
+ CPSFont* pFont = m_PSFontList[i];
+ delete pFont;
+ }
+}
+#define OUTPUT_PS(str) m_pOutput->OutputPS(str, sizeof str-1)
+void CFX_PSRenderer::Init(IFX_PSOutput* pOutput, int pslevel, int width, int height, FX_BOOL bCmykOutput)
+{
+ m_PSLevel = pslevel;
+ m_pOutput = pOutput;
+ m_ClipBox.left = m_ClipBox.top = 0;
+ m_ClipBox.right = width;
+ m_ClipBox.bottom = height;
+ m_bCmykOutput = bCmykOutput;
+}
+FX_BOOL CFX_PSRenderer::StartRendering()
+{
+ if (m_bInited) {
+ return TRUE;
+ }
+ static const char init_str[] = "\nsave\n/im/initmatrix load def\n"
+ "/n/newpath load def/m/moveto load def/l/lineto load def/c/curveto load def/h/closepath load def\n"
+ "/f/fill load def/F/eofill load def/s/stroke load def/W/clip load def/W*/eoclip load def\n"
+ "/rg/setrgbcolor load def/k/setcmykcolor load def\n"
+ "/J/setlinecap load def/j/setlinejoin load def/w/setlinewidth load def/M/setmiterlimit load def/d/setdash load def\n"
+ "/q/gsave load def/Q/grestore load def/iM/imagemask load def\n"
+ "/Tj/show load def/Ff/findfont load def/Fs/scalefont load def/Sf/setfont load def\n"
+ "/cm/concat load def/Cm/currentmatrix load def/mx/matrix load def/sm/setmatrix load def\n"
+ ;
+ OUTPUT_PS(init_str);
+ m_bInited = TRUE;
+ return TRUE;
+}
+void CFX_PSRenderer::EndRendering()
+{
+ if (m_bInited) {
+ OUTPUT_PS("\nrestore\n");
+ }
+ m_bInited = FALSE;
+}
+void CFX_PSRenderer::SaveState()
+{
+ StartRendering();
+ OUTPUT_PS("q\n");
+ m_ClipBoxStack.Add(m_ClipBox);
+}
+void CFX_PSRenderer::RestoreState(FX_BOOL bKeepSaved)
+{
+ StartRendering();
+ if (bKeepSaved) {
+ OUTPUT_PS("Q\nq\n");
+ } else {
+ OUTPUT_PS("Q\n");
+ }
+ m_bColorSet = m_bGraphStateSet = FALSE;
+ m_ClipBox = m_ClipBoxStack.GetAt(m_ClipBoxStack.GetSize() - 1);
+ if (!bKeepSaved) {
+ m_ClipBoxStack.RemoveAt(m_ClipBoxStack.GetSize() - 1);
+ }
+}
+void CFX_PSRenderer::OutputPath(const CFX_PathData* pPathData, const CFX_AffineMatrix* pObject2Device)
+{
+ int nPoints = pPathData->GetPointCount();
+ CFX_ByteTextBuf buf;
+ buf.EstimateSize(nPoints * 10);
+ for (int i = 0; i < nPoints; i ++) {
+ FX_BYTE flag = pPathData->GetFlag(i);
+ FX_FLOAT x = pPathData->GetPointX(i);
+ FX_FLOAT y = pPathData->GetPointY(i);
+ if (pObject2Device) {
+ pObject2Device->Transform(x, y);
+ }
+ buf << x << FX_BSTRC(" ") << y;
+ switch (flag & FXPT_TYPE) {
+ case FXPT_MOVETO:
+ buf << FX_BSTRC(" m ");
+ break;
+ case FXPT_LINETO:
+ if (flag & FXPT_CLOSEFIGURE) {
+ buf << FX_BSTRC(" l h ");
+ } else {
+ buf << FX_BSTRC(" l ");
+ }
+ break;
+ case FXPT_BEZIERTO: {
+ FX_FLOAT x1 = pPathData->GetPointX(i + 1);
+ FX_FLOAT x2 = pPathData->GetPointX(i + 2);
+ FX_FLOAT y1 = pPathData->GetPointY(i + 1);
+ FX_FLOAT y2 = pPathData->GetPointY(i + 2);
+ if (pObject2Device) {
+ pObject2Device->Transform(x1, y1);
+ pObject2Device->Transform(x2, y2);
+ }
+ buf << FX_BSTRC(" ") << x1 << FX_BSTRC(" ") << y1 << FX_BSTRC(" ") << x2 << FX_BSTRC(" ") << y2;
+ if (flag & FXPT_CLOSEFIGURE) {
+ buf << FX_BSTRC(" c h\n");
+ } else {
+ buf << FX_BSTRC(" c\n");
+ }
+ i += 2;
+ break;
+ }
+ }
+ }
+ m_pOutput->OutputPS((FX_LPCSTR)buf.GetBuffer(), buf.GetSize());
+}
+void CFX_PSRenderer::SetClip_PathFill(const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pObject2Device,
+ int fill_mode
+ )
+{
+ StartRendering();
+ OutputPath(pPathData, pObject2Device);
+ CFX_FloatRect rect = pPathData->GetBoundingBox();
+ if (pObject2Device) {
+ rect.Transform(pObject2Device);
+ }
+ m_ClipBox.Intersect(rect.GetOutterRect());
+ if ((fill_mode & 3) == FXFILL_WINDING) {
+ OUTPUT_PS("W n\n");
+ } else {
+ OUTPUT_PS("W* n\n");
+ }
+}
+void CFX_PSRenderer::SetClip_PathStroke(const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pObject2Device,
+ const CFX_GraphStateData* pGraphState
+ )
+{
+ StartRendering();
+ SetGraphState(pGraphState);
+ if (pObject2Device) {
+ CFX_ByteTextBuf buf;
+ buf << FX_BSTRC("mx Cm [") << pObject2Device->a << FX_BSTRC(" ") << pObject2Device->b << FX_BSTRC(" ") <<
+ pObject2Device->c << FX_BSTRC(" ") << pObject2Device->d << FX_BSTRC(" ") << pObject2Device->e <<
+ FX_BSTRC(" ") << pObject2Device->f << FX_BSTRC("]cm ");
+ m_pOutput->OutputPS((FX_LPCSTR)buf.GetBuffer(), buf.GetSize());
+ }
+ OutputPath(pPathData, NULL);
+ CFX_FloatRect rect = pPathData->GetBoundingBox(pGraphState->m_LineWidth, pGraphState->m_MiterLimit);
+ rect.Transform(pObject2Device);
+ m_ClipBox.Intersect(rect.GetOutterRect());
+ if (pObject2Device) {
+ OUTPUT_PS("strokepath W n sm\n");
+ } else {
+ OUTPUT_PS("strokepath W n\n");
+ }
+}
+FX_BOOL CFX_PSRenderer::DrawPath(const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pObject2Device,
+ const CFX_GraphStateData* pGraphState,
+ FX_DWORD fill_color,
+ FX_DWORD stroke_color,
+ int fill_mode,
+ int alpha_flag,
+ void* pIccTransform
+ )
+{
+ StartRendering();
+ int fill_alpha = FXGETFLAG_COLORTYPE(alpha_flag) ? FXGETFLAG_ALPHA_FILL(alpha_flag) : FXARGB_A(fill_color);
+ int stroke_alpha = FXGETFLAG_COLORTYPE(alpha_flag) ? FXGETFLAG_ALPHA_STROKE(alpha_flag) : FXARGB_A(stroke_color);
+ if (fill_alpha && fill_alpha < 255) {
+ return FALSE;
+ }
+ if (stroke_alpha && stroke_alpha < 255) {
+ return FALSE;
+ }
+ if (fill_alpha == 0 && stroke_alpha == 0) {
+ return FALSE;
+ }
+ if (stroke_alpha) {
+ SetGraphState(pGraphState);
+ if (pObject2Device) {
+ CFX_ByteTextBuf buf;
+ buf << FX_BSTRC("mx Cm [") << pObject2Device->a << FX_BSTRC(" ") << pObject2Device->b << FX_BSTRC(" ") <<
+ pObject2Device->c << FX_BSTRC(" ") << pObject2Device->d << FX_BSTRC(" ") << pObject2Device->e <<
+ FX_BSTRC(" ") << pObject2Device->f << FX_BSTRC("]cm ");
+ m_pOutput->OutputPS((FX_LPCSTR)buf.GetBuffer(), buf.GetSize());
+ }
+ }
+ OutputPath(pPathData, stroke_alpha ? NULL : pObject2Device);
+ if (fill_mode && fill_alpha) {
+ SetColor(fill_color, alpha_flag, pIccTransform);
+ if ((fill_mode & 3) == FXFILL_WINDING) {
+ if (stroke_alpha) {
+ OUTPUT_PS("q f Q ");
+ } else {
+ OUTPUT_PS("f");
+ }
+ } else if ((fill_mode & 3) == FXFILL_ALTERNATE) {
+ if (stroke_alpha) {
+ OUTPUT_PS("q F Q ");
+ } else {
+ OUTPUT_PS("F");
+ }
+ }
+ }
+ if (stroke_alpha) {
+ SetColor(stroke_color, alpha_flag, pIccTransform);
+ if (pObject2Device) {
+ OUTPUT_PS("s sm");
+ } else {
+ OUTPUT_PS("s");
+ }
+ }
+ OUTPUT_PS("\n");
+ return TRUE;
+}
+void CFX_PSRenderer::SetGraphState(const CFX_GraphStateData* pGraphState)
+{
+ CFX_ByteTextBuf buf;
+ if (!m_bGraphStateSet || m_CurGraphState.m_LineCap != pGraphState->m_LineCap) {
+ buf << pGraphState->m_LineCap << FX_BSTRC(" J\n");
+ }
+ if (!m_bGraphStateSet || m_CurGraphState.m_DashCount != pGraphState->m_DashCount ||
+ FXSYS_memcmp32(m_CurGraphState.m_DashArray, pGraphState->m_DashArray, sizeof(FX_FLOAT)*m_CurGraphState.m_DashCount)) {
+ buf << FX_BSTRC("[");
+ for (int i = 0; i < pGraphState->m_DashCount; i ++) {
+ buf << pGraphState->m_DashArray[i] << FX_BSTRC(" ");
+ }
+ buf << FX_BSTRC("]") << pGraphState->m_DashPhase << FX_BSTRC(" d\n");
+ }
+ if (!m_bGraphStateSet || m_CurGraphState.m_LineJoin != pGraphState->m_LineJoin) {
+ buf << pGraphState->m_LineJoin << FX_BSTRC(" j\n");
+ }
+ if (!m_bGraphStateSet || m_CurGraphState.m_LineWidth != pGraphState->m_LineWidth) {
+ buf << pGraphState->m_LineWidth << FX_BSTRC(" w\n");
+ }
+ if (!m_bGraphStateSet || m_CurGraphState.m_MiterLimit != pGraphState->m_MiterLimit) {
+ buf << pGraphState->m_MiterLimit << FX_BSTRC(" M\n");
+ }
+ m_CurGraphState.Copy(*pGraphState);
+ m_bGraphStateSet = TRUE;
+ if (buf.GetSize()) {
+ m_pOutput->OutputPS((FX_LPCSTR)buf.GetBuffer(), buf.GetSize());
+ }
+}
+static void FaxCompressData(FX_LPBYTE src_buf, int width, int height, FX_LPBYTE& dest_buf, FX_DWORD& dest_size)
+{
+ CCodec_ModuleMgr* pEncoders = CFX_GEModule::Get()->GetCodecModule();
+ if (width * height > 128 && pEncoders && pEncoders->GetFaxModule()->Encode(src_buf, width, height, (width + 7) / 8, dest_buf, dest_size)) {
+ FX_Free(src_buf);
+ } else {
+ dest_buf = src_buf;
+ dest_size = (width + 7) / 8 * height;
+ }
+}
+static void PSCompressData(int PSLevel, FX_LPBYTE src_buf, FX_DWORD src_size,
+ FX_LPBYTE& output_buf, FX_DWORD& output_size, FX_LPCSTR& filter)
+{
+ output_buf = src_buf;
+ output_size = src_size;
+ filter = "";
+ if (src_size < 1024) {
+ return;
+ }
+ CCodec_ModuleMgr* pEncoders = CFX_GEModule::Get()->GetCodecModule();
+ FX_LPBYTE dest_buf = NULL;
+ FX_DWORD dest_size = src_size;
+ if (PSLevel >= 3) {
+ if (pEncoders && pEncoders->GetFlateModule()->Encode(src_buf, src_size, dest_buf, dest_size)) {
+ filter = "/FlateDecode filter ";
+ }
+ } else {
+ if (pEncoders && pEncoders->GetBasicModule()->RunLengthEncode(src_buf, src_size, dest_buf, dest_size)) {
+ filter = "/RunLengthDecode filter ";
+ }
+ }
+ if (dest_size < src_size) {
+ output_buf = dest_buf;
+ output_size = dest_size;
+ } else {
+ filter = NULL;
+ if (dest_buf) {
+ FX_Free(dest_buf);
+ }
+ }
+}
+FX_BOOL CFX_PSRenderer::SetDIBits(const CFX_DIBSource* pSource, FX_DWORD color, int left, int top,
+ int alpha_flag, void* pIccTransform)
+{
+ StartRendering();
+ CFX_AffineMatrix matrix((FX_FLOAT)(pSource->GetWidth()), 0.0f, 0.0f, -(FX_FLOAT)(pSource->GetHeight()),
+ (FX_FLOAT)(left), (FX_FLOAT)(top + pSource->GetHeight()));
+ return DrawDIBits(pSource, color, &matrix, 0, alpha_flag, pIccTransform);
+}
+FX_BOOL CFX_PSRenderer::StretchDIBits(const CFX_DIBSource* pSource, FX_DWORD color, int dest_left, int dest_top,
+ int dest_width, int dest_height, FX_DWORD flags,
+ int alpha_flag, void* pIccTransform)
+{
+ StartRendering();
+ CFX_AffineMatrix matrix((FX_FLOAT)(dest_width), 0.0f, 0.0f, (FX_FLOAT)(-dest_height),
+ (FX_FLOAT)(dest_left), (FX_FLOAT)(dest_top + dest_height));
+ return DrawDIBits(pSource, color, &matrix, flags, alpha_flag, pIccTransform);
+}
+FX_BOOL CFX_PSRenderer::DrawDIBits(const CFX_DIBSource* pSource, FX_DWORD color,
+ const CFX_AffineMatrix* pMatrix, FX_DWORD flags,
+ int alpha_flag, void* pIccTransform)
+{
+ StartRendering();
+ if ((pMatrix->a == 0 && pMatrix->b == 0) || (pMatrix->c == 0 && pMatrix->d == 0)) {
+ return TRUE;
+ }
+ if (pSource->HasAlpha()) {
+ return FALSE;
+ }
+ int alpha = FXGETFLAG_COLORTYPE(alpha_flag) ? FXGETFLAG_ALPHA_FILL(color) : FXARGB_A(color);
+ if (pSource->IsAlphaMask() && (alpha < 255 || pSource->GetBPP() != 1)) {
+ return FALSE;
+ }
+ OUTPUT_PS("q\n");
+ CFX_ByteTextBuf buf;
+ buf << FX_BSTRC("[") << pMatrix->a << FX_BSTRC(" ") << pMatrix->b << FX_BSTRC(" ") <<
+ pMatrix->c << FX_BSTRC(" ") << pMatrix->d << FX_BSTRC(" ") << pMatrix->e <<
+ FX_BSTRC(" ") << pMatrix->f << FX_BSTRC("]cm ");
+ int width = pSource->GetWidth();
+ int height = pSource->GetHeight();
+ buf << width << FX_BSTRC(" ") << height;
+ if (pSource->GetBPP() == 1 && pSource->GetPalette() == NULL) {
+ int pitch = (width + 7) / 8;
+ FX_DWORD src_size = height * pitch;
+ FX_LPBYTE src_buf = FX_Alloc(FX_BYTE, src_size);
+ if (!src_buf) {
+ return FALSE;
+ }
+ for (int row = 0; row < height; row ++) {
+ FX_LPCBYTE src_scan = pSource->GetScanline(row);
+ FXSYS_memcpy32(src_buf + row * pitch, src_scan, pitch);
+ }
+ FX_LPBYTE output_buf;
+ FX_DWORD output_size;
+ FaxCompressData(src_buf, width, height, output_buf, output_size);
+ if (pSource->IsAlphaMask()) {
+ SetColor(color, alpha_flag, pIccTransform);
+ m_bColorSet = FALSE;
+ buf << FX_BSTRC(" true[");
+ } else {
+ buf << FX_BSTRC(" 1[");
+ }
+ buf << width << FX_BSTRC(" 0 0 -") << height << FX_BSTRC(" 0 ") << height <<
+ FX_BSTRC("]currentfile/ASCII85Decode filter ");
+ if (output_buf != src_buf)
+ buf << FX_BSTRC("<</K -1/EndOfBlock false/Columns ") << width << FX_BSTRC("/Rows ") << height <<
+ FX_BSTRC(">>/CCITTFaxDecode filter ");
+ if (pSource->IsAlphaMask()) {
+ buf << FX_BSTRC("iM\n");
+ } else {
+ buf << FX_BSTRC("false 1 colorimage\n");
+ }
+ m_pOutput->OutputPS((FX_LPCSTR)buf.GetBuffer(), buf.GetSize());
+ WritePSBinary(output_buf, output_size);
+ FX_Free(output_buf);
+ } else {
+ CFX_DIBSource* pConverted = (CFX_DIBSource*)pSource;
+ if (pIccTransform) {
+ FXDIB_Format format = m_bCmykOutput ? FXDIB_Cmyk : FXDIB_Rgb;
+ pConverted = pSource->CloneConvert(format, NULL, pIccTransform);
+ } else {
+ switch (pSource->GetFormat()) {
+ case FXDIB_1bppRgb:
+ case FXDIB_Rgb32:
+ pConverted = pSource->CloneConvert(FXDIB_Rgb);
+ break;
+ case FXDIB_8bppRgb:
+ if (pSource->GetPalette() != NULL) {
+ pConverted = pSource->CloneConvert(FXDIB_Rgb);
+ }
+ break;
+ case FXDIB_1bppCmyk:
+ pConverted = pSource->CloneConvert(FXDIB_Cmyk);
+ break;
+ case FXDIB_8bppCmyk:
+ if (pSource->GetPalette() != NULL) {
+ pConverted = pSource->CloneConvert(FXDIB_Cmyk);
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ if (pConverted == NULL) {
+ OUTPUT_PS("\nQ\n");
+ return FALSE;
+ }
+ int Bpp = pConverted->GetBPP() / 8;
+ FX_LPBYTE output_buf = NULL;
+ FX_STRSIZE output_size = 0;
+ FX_LPCSTR filter = NULL;
+ if (flags & FXRENDER_IMAGE_LOSSY) {
+ CCodec_ModuleMgr* pEncoders = CFX_GEModule::Get()->GetCodecModule();
+ if (pEncoders && pEncoders->GetJpegModule()->Encode(pConverted, output_buf, output_size)) {
+ filter = "/DCTDecode filter ";
+ }
+ }
+ if (filter == NULL) {
+ int src_pitch = width * Bpp;
+ output_size = height * src_pitch;
+ output_buf = FX_Alloc(FX_BYTE, output_size);
+ if (!output_buf) {
+ if (pConverted != pSource) {
+ delete pConverted;
+ pConverted = NULL;
+ }
+ return FALSE;
+ }
+ for (int row = 0; row < height; row ++) {
+ FX_LPCBYTE src_scan = pConverted->GetScanline(row);
+ FX_LPBYTE dest_scan = output_buf + row * src_pitch;
+ if (Bpp == 3) {
+ for (int col = 0; col < width; col ++) {
+ *dest_scan++ = src_scan[2];
+ *dest_scan++ = src_scan[1];
+ *dest_scan++ = *src_scan;
+ src_scan += 3;
+ }
+ } else {
+ FXSYS_memcpy32(dest_scan, src_scan, src_pitch);
+ }
+ }
+ FX_LPBYTE compressed_buf;
+ FX_DWORD compressed_size;
+ PSCompressData(m_PSLevel, output_buf, output_size, compressed_buf, compressed_size, filter);
+ if (output_buf != compressed_buf) {
+ FX_Free(output_buf);
+ }
+ output_buf = compressed_buf;
+ output_size = compressed_size;
+ }
+ if (pConverted != pSource) {
+ delete pConverted;
+ pConverted = NULL;
+ }
+ buf << FX_BSTRC(" 8[");
+ buf << width << FX_BSTRC(" 0 0 -") << height << FX_BSTRC(" 0 ") << height << FX_BSTRC("]");
+ buf << FX_BSTRC("currentfile/ASCII85Decode filter ");
+ if (filter) {
+ buf << filter;
+ }
+ buf << FX_BSTRC("false ") << Bpp;
+ buf << FX_BSTRC(" colorimage\n");
+ m_pOutput->OutputPS((FX_LPCSTR)buf.GetBuffer(), buf.GetSize());
+ WritePSBinary(output_buf, output_size);
+ FX_Free(output_buf);
+ }
+ OUTPUT_PS("\nQ\n");
+ return TRUE;
+}
+void CFX_PSRenderer::SetColor(FX_DWORD color, int alpha_flag, void* pIccTransform)
+{
+ if (!CFX_GEModule::Get()->GetCodecModule() || !CFX_GEModule::Get()->GetCodecModule()->GetIccModule()) {
+ pIccTransform = NULL;
+ }
+ FX_BOOL bCMYK = FALSE;
+ if (pIccTransform) {
+ ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ color = FXGETFLAG_COLORTYPE(alpha_flag) ? FXCMYK_TODIB(color) : FXARGB_TODIB(color);
+ FX_LPBYTE pColor = (FX_LPBYTE)&color;
+ pIccModule->TranslateScanline(pIccTransform, pColor, pColor, 1);
+ color = m_bCmykOutput ? FXCMYK_TODIB(color) : FXARGB_TODIB(color);
+ bCMYK = m_bCmykOutput;
+ } else {
+ bCMYK = FXGETFLAG_COLORTYPE(alpha_flag);
+ }
+ if (bCMYK != m_bCmykOutput || !m_bColorSet || m_LastColor != color) {
+ CFX_ByteTextBuf buf;
+ if (bCMYK) {
+ buf << FXSYS_GetCValue(color) / 255.0 << FX_BSTRC(" ") << FXSYS_GetMValue(color) / 255.0 << FX_BSTRC(" ")
+ << FXSYS_GetYValue(color) / 255.0 << FX_BSTRC(" ") << FXSYS_GetKValue(color) / 255.0 << FX_BSTRC(" k\n");
+ } else {
+ buf << FXARGB_R(color) / 255.0 << FX_BSTRC(" ") << FXARGB_G(color) / 255.0 << FX_BSTRC(" ")
+ << FXARGB_B(color) / 255.0 << FX_BSTRC(" rg\n");
+ }
+ if (bCMYK == m_bCmykOutput) {
+ m_bColorSet = TRUE;
+ m_LastColor = color;
+ }
+ m_pOutput->OutputPS((FX_LPCSTR)buf.GetBuffer(), buf.GetSize());
+ }
+}
+void CFX_PSRenderer::FindPSFontGlyph(CFX_FaceCache* pFaceCache, CFX_Font* pFont, const FXTEXT_CHARPOS& charpos,
+ int& ps_fontnum, int &ps_glyphindex)
+{
+ for (int i = 0; i < (int)m_PSFontList.GetSize(); i ++) {
+ CPSFont* pPSFont = m_PSFontList[i];
+ for (int j = 0; j < pPSFont->m_nGlyphs; j ++)
+ if (pPSFont->m_Glyphs[j].m_pFont == pFont && pPSFont->m_Glyphs[j].m_GlyphIndex == charpos.m_GlyphIndex) {
+ if ((!pPSFont->m_Glyphs[j].m_bGlyphAdjust && !charpos.m_bGlyphAdjust) ||
+ (pPSFont->m_Glyphs[j].m_bGlyphAdjust && charpos.m_bGlyphAdjust &&
+ (FXSYS_fabs(pPSFont->m_Glyphs[j].m_AdjustMatrix[0] - charpos.m_AdjustMatrix[0]) < 0.01 &&
+ FXSYS_fabs(pPSFont->m_Glyphs[j].m_AdjustMatrix[1] - charpos.m_AdjustMatrix[1]) < 0.01 &&
+ FXSYS_fabs(pPSFont->m_Glyphs[j].m_AdjustMatrix[2] - charpos.m_AdjustMatrix[2]) < 0.01 &&
+ FXSYS_fabs(pPSFont->m_Glyphs[j].m_AdjustMatrix[3] - charpos.m_AdjustMatrix[3]) < 0.01))) {
+ ps_fontnum = i;
+ ps_glyphindex = j;
+ return;
+ }
+ }
+ }
+ if (m_PSFontList.GetSize() == 0 || m_PSFontList[m_PSFontList.GetSize() - 1]->m_nGlyphs == 256) {
+ CPSFont* pPSFont = FX_NEW CPSFont;
+ if (!pPSFont) {
+ return;
+ }
+ pPSFont->m_nGlyphs = 0;
+ m_PSFontList.Add(pPSFont);
+ CFX_ByteTextBuf buf;
+ buf << FX_BSTRC("8 dict begin/FontType 3 def/FontMatrix[1 0 0 1 0 0]def\n"
+ "/FontBBox[0 0 0 0]def/Encoding 256 array def 0 1 255{Encoding exch/.notdef put}for\n"
+ "/CharProcs 1 dict def CharProcs begin/.notdef {} def end\n"
+ "/BuildGlyph{1 0 -10 -10 10 10 setcachedevice exch/CharProcs get exch 2 copy known not{pop/.notdef}if get exec}bind def\n"
+ "/BuildChar{1 index/Encoding get exch get 1 index/BuildGlyph get exec}bind def\n"
+ "currentdict end\n");
+ buf << FX_BSTRC("/X") << m_PSFontList.GetSize() - 1 << FX_BSTRC(" exch definefont pop\n");
+ m_pOutput->OutputPS((FX_LPCSTR)buf.GetBuffer(), buf.GetSize());
+ buf.Clear();
+ }
+ ps_fontnum = m_PSFontList.GetSize() - 1;
+ CPSFont* pPSFont = m_PSFontList[ps_fontnum];
+ ps_glyphindex = pPSFont->m_nGlyphs;
+ pPSFont->m_Glyphs[ps_glyphindex].m_GlyphIndex = charpos.m_GlyphIndex;
+ pPSFont->m_Glyphs[ps_glyphindex].m_pFont = pFont;
+ pPSFont->m_Glyphs[ps_glyphindex].m_bGlyphAdjust = charpos.m_bGlyphAdjust;
+ if (charpos.m_bGlyphAdjust) {
+ pPSFont->m_Glyphs[ps_glyphindex].m_AdjustMatrix[0] = charpos.m_AdjustMatrix[0];
+ pPSFont->m_Glyphs[ps_glyphindex].m_AdjustMatrix[1] = charpos.m_AdjustMatrix[1];
+ pPSFont->m_Glyphs[ps_glyphindex].m_AdjustMatrix[2] = charpos.m_AdjustMatrix[2];
+ pPSFont->m_Glyphs[ps_glyphindex].m_AdjustMatrix[3] = charpos.m_AdjustMatrix[3];
+ }
+ pPSFont->m_nGlyphs ++;
+ CFX_AffineMatrix matrix;
+ if (charpos.m_bGlyphAdjust)
+ matrix.Set(charpos.m_AdjustMatrix[0], charpos.m_AdjustMatrix[1],
+ charpos.m_AdjustMatrix[2], charpos.m_AdjustMatrix[3], 0, 0);
+ matrix.Concat(1.0f, 0, 0, 1.0f, 0, 0);
+ const CFX_PathData* pPathData = pFaceCache->LoadGlyphPath(pFont, charpos.m_GlyphIndex, charpos.m_FontCharWidth);
+ if (pPathData == NULL) {
+ return;
+ }
+ CFX_PathData TransformedPath(*pPathData);
+ if (charpos.m_bGlyphAdjust) {
+ TransformedPath.Transform(&matrix);
+ }
+ CFX_ByteTextBuf buf;
+ buf << FX_BSTRC("/X") << ps_fontnum << FX_BSTRC(" Ff/CharProcs get begin/")
+ << ps_glyphindex << FX_BSTRC("{");
+ buf << FX_BSTRC("n ");
+ for (int p = 0; p < TransformedPath.GetPointCount(); p ++) {
+ FX_FLOAT x = TransformedPath.GetPointX(p), y = TransformedPath.GetPointY(p);
+ switch (TransformedPath.GetFlag(p) & FXPT_TYPE) {
+ case FXPT_MOVETO: {
+ buf << x << FX_BSTRC(" ") << y << FX_BSTRC(" m\n");
+ break;
+ }
+ case FXPT_LINETO: {
+ buf << x << FX_BSTRC(" ") << y << FX_BSTRC(" l\n");
+ break;
+ }
+ case FXPT_BEZIERTO: {
+ buf << x << FX_BSTRC(" ") << y << FX_BSTRC(" ")
+ << TransformedPath.GetPointX(p + 1) << FX_BSTRC(" ")
+ << TransformedPath.GetPointY(p + 1) << FX_BSTRC(" ")
+ << TransformedPath.GetPointX(p + 2) << FX_BSTRC(" ")
+ << TransformedPath.GetPointY(p + 2) << FX_BSTRC(" c\n");
+ p += 2;
+ break;
+ }
+ }
+ }
+ buf << FX_BSTRC("f");
+ buf << FX_BSTRC("}bind def end\n");
+ buf << FX_BSTRC("/X") << ps_fontnum << FX_BSTRC(" Ff/Encoding get ") << ps_glyphindex
+ << FX_BSTRC("/") << ps_glyphindex << FX_BSTRC(" put\n");
+ m_pOutput->OutputPS((FX_LPCSTR)buf.GetBuffer(), buf.GetSize());
+}
+FX_BOOL CFX_PSRenderer::DrawText(int nChars, const FXTEXT_CHARPOS* pCharPos, CFX_Font* pFont,
+ CFX_FontCache* pCache, const CFX_AffineMatrix* pObject2Device,
+ FX_FLOAT font_size, FX_DWORD color,
+ int alpha_flag, void* pIccTransform)
+{
+ StartRendering();
+ int alpha = FXGETFLAG_COLORTYPE(alpha_flag) ? FXGETFLAG_ALPHA_FILL(alpha_flag) : FXARGB_A(color);
+ if (alpha < 255) {
+ return FALSE;
+ }
+ if ((pObject2Device->a == 0 && pObject2Device->b == 0) || (pObject2Device->c == 0 && pObject2Device->d == 0)) {
+ return TRUE;
+ }
+ SetColor(color, alpha_flag, pIccTransform);
+ CFX_ByteTextBuf buf;
+ buf << FX_BSTRC("q[") << pObject2Device->a << FX_BSTRC(" ") << pObject2Device->b << FX_BSTRC(" ")
+ << pObject2Device->c << FX_BSTRC(" ") << pObject2Device->d;
+ buf << FX_BSTRC(" ") << pObject2Device->e << FX_BSTRC(" ") << pObject2Device->f << "]cm\n";
+ if (pCache == NULL) {
+ pCache = CFX_GEModule::Get()->GetFontCache();
+ }
+ CFX_FaceCache* pFaceCache = pCache->GetCachedFace(pFont);
+ FX_FONTCACHE_DEFINE(pCache, pFont);
+ int last_fontnum = -1;
+ for (int i = 0; i < nChars; i ++) {
+ int ps_fontnum, ps_glyphindex;
+ FindPSFontGlyph(pFaceCache, pFont, pCharPos[i], ps_fontnum, ps_glyphindex);
+ if (last_fontnum != ps_fontnum) {
+ buf << FX_BSTRC("/X") << ps_fontnum << FX_BSTRC(" Ff ") << font_size
+ << FX_BSTRC(" Fs Sf ");
+ last_fontnum = ps_fontnum;
+ }
+ buf << pCharPos[i].m_OriginX << FX_BSTRC(" ")
+ << pCharPos[i].m_OriginY << FX_BSTRC(" m");
+ CFX_ByteString hex;
+ hex.Format("<%02X>", ps_glyphindex);
+ buf << hex << FX_BSTRC("Tj\n");
+ }
+ buf << FX_BSTRC("Q\n");
+ m_pOutput->OutputPS((FX_LPCSTR)buf.GetBuffer(), buf.GetSize());
+ return TRUE;
+}
+void CFX_PSRenderer::WritePSBinary(FX_LPCBYTE data, int len)
+{
+ FX_LPBYTE dest_buf;
+ FX_DWORD dest_size;
+ CCodec_ModuleMgr* pEncoders = CFX_GEModule::Get()->GetCodecModule();
+ if (pEncoders && pEncoders->GetBasicModule()->A85Encode(data, len, dest_buf, dest_size)) {
+ m_pOutput->OutputPS((FX_LPCSTR)dest_buf, dest_size);
+ FX_Free(dest_buf);
+ } else {
+ m_pOutput->OutputPS((FX_LPCSTR)data, len);
+ }
+}
diff --git a/core/src/fxge/ge/fx_ge_text.cpp b/core/src/fxge/ge/fx_ge_text.cpp
index 92f631e615..40acc5fe34 100644
--- a/core/src/fxge/ge/fx_ge_text.cpp
+++ b/core/src/fxge/ge/fx_ge_text.cpp
@@ -1,1774 +1,1774 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../../include/fxge/fx_ge.h"
-#include "../../../include/fxge/fx_freetype.h"
-#include "../../../include/fxcodec/fx_codec.h"
-#include "text_int.h"
-#undef FX_GAMMA
-#undef FX_GAMMA_INVERSE
-#define FX_GAMMA(value) (value)
-#define FX_GAMMA_INVERSE(value) (value)
-FX_RECT FXGE_GetGlyphsBBox(FXTEXT_GLYPHPOS* pGlyphAndPos, int nChars, int anti_alias, FX_FLOAT retinaScaleX, FX_FLOAT retinaScaleY)
-{
- FX_RECT rect(0, 0, 0, 0);
- FX_BOOL bStarted = FALSE;
- for (int iChar = 0; iChar < nChars; iChar ++) {
- FXTEXT_GLYPHPOS& glyph = pGlyphAndPos[iChar];
- const CFX_GlyphBitmap* pGlyph = glyph.m_pGlyph;
- if (pGlyph == NULL) {
- continue;
- }
- int char_left = glyph.m_OriginX + pGlyph->m_Left;
- int char_width = (int)(pGlyph->m_Bitmap.GetWidth() / retinaScaleX);
- if (anti_alias == FXFT_RENDER_MODE_LCD) {
- char_width /= 3;
- }
- int char_right = char_left + char_width;
- int char_top = glyph.m_OriginY - pGlyph->m_Top;
- int char_bottom = char_top + (int)(pGlyph->m_Bitmap.GetHeight() / retinaScaleY);
- if (!bStarted) {
- rect.left = char_left;
- rect.right = char_right;
- rect.top = char_top;
- rect.bottom = char_bottom;
- bStarted = TRUE;
- } else {
- if (rect.left > char_left) {
- rect.left = char_left;
- }
- if (rect.right < char_right) {
- rect.right = char_right;
- }
- if (rect.top > char_top) {
- rect.top = char_top;
- }
- if (rect.bottom < char_bottom) {
- rect.bottom = char_bottom;
- }
- }
- }
- return rect;
-}
-static void _AdjustGlyphSpace(FXTEXT_GLYPHPOS* pGlyphAndPos, int nChars)
-{
- ASSERT(nChars > 1);
- FX_BOOL bVertical = FALSE;
- if (pGlyphAndPos[nChars - 1].m_OriginX == pGlyphAndPos[0].m_OriginX) {
- bVertical = TRUE;
- } else if (pGlyphAndPos[nChars - 1].m_OriginY != pGlyphAndPos[0].m_OriginY) {
- return;
- }
- int i = nChars - 1;
- int* next_origin = bVertical ? &pGlyphAndPos[i].m_OriginY : &pGlyphAndPos[i].m_OriginX;
- FX_FLOAT next_origin_f = bVertical ? pGlyphAndPos[i].m_fOriginY : pGlyphAndPos[i].m_fOriginX;
- for (i --; i > 0; i --) {
- int* this_origin = bVertical ? &pGlyphAndPos[i].m_OriginY : &pGlyphAndPos[i].m_OriginX;
- FX_FLOAT this_origin_f = bVertical ? pGlyphAndPos[i].m_fOriginY : pGlyphAndPos[i].m_fOriginX;
- int space = (*next_origin) - (*this_origin);
- FX_FLOAT space_f = next_origin_f - this_origin_f;
- FX_FLOAT error = (FX_FLOAT)(FXSYS_fabs(space_f) - FXSYS_fabs((FX_FLOAT)(space)));
- if (error > 0.5f) {
- *this_origin += space > 0 ? -1 : 1;
- }
- next_origin = this_origin;
- next_origin_f = this_origin_f;
- }
-}
-static const FX_BYTE g_GdipGamma_bgw[9] = {0, 0, 63, 120, 0, 168, 210, 239, 255};
-static const FX_BYTE g_GdipGamma_fgw[9] = {0, 0, 16, 45, 0, 87, 135, 192, 255};
-static const FX_BYTE g_GdipGammaAdjust_47[48] = {
- 0, 30, 33, 34, 35, 36, 37, 38, 38, 39, 39, 40, 40, 40, 41, 41, 41, 42, 42, 42, 42, 43,
- 43, 43, 43, 43, 44, 44, 44, 44, 44, 44, 45, 45, 45, 45, 45, 45, 45, 46,
- 46, 46, 46, 46, 46, 46, 46, 47
-};
-static const FX_BYTE g_GdipGammaAdjust_75[76] = {
- 0, 46, 50, 52, 54, 55, 56, 57, 58, 59, 60, 60, 61, 61, 62, 62, 63, 63, 64, 64, 64, 65,
- 65, 65, 66, 66, 66, 67, 67, 67, 67, 68, 68, 68, 68, 68, 69, 69, 69, 69, 69, 70, 70, 70,
- 70, 70, 71, 71, 71, 71, 71, 71, 72, 72, 72, 72, 72, 72, 72, 73, 73, 73, 73, 73, 73, 73,
- 73, 74, 74, 74, 74, 74, 74, 74, 74, 75
-};
-static const FX_BYTE g_GdipGammaAdjust_81[82] = {
- 0, 49, 53, 56, 58, 59, 60, 61, 62, 63, 64, 65, 65, 66, 66, 67, 67, 68, 68, 69, 69, 69, 70, 70, 70,
- 71, 71, 71, 72, 72, 72, 72, 73, 73, 73, 73, 74, 74, 74, 74, 74, 75, 75, 75, 75, 75, 76, 76, 76, 76,
- 76, 76, 77, 77, 77, 77, 77, 77, 78, 78, 78, 78, 78, 78, 78, 79, 79, 79, 79, 79, 79, 79, 79, 80,
- 80, 80, 80, 80, 80, 80, 80, 81
-};
-static void _Adjust_alpha(int background, int foreground, int& src_alpha, int text_flags, int a)
-{
-}
-static const FX_BYTE g_TextGammaAdjust[256] = {
- 0, 2, 3, 4, 6, 7, 8, 10, 11, 12, 13, 15, 16, 17, 18, 19,
- 21, 22, 23, 24, 25, 26, 27, 29, 30, 31, 32, 33, 34, 35, 36, 38,
- 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 51, 52, 53, 54, 55,
- 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 71, 72,
- 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
- 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104,
- 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120,
- 121, 122, 123, 124, 125, 126, 127, 128, 129, 129, 130, 131, 132, 133, 134, 135,
- 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151,
- 152, 153, 154, 155, 156, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166,
- 167, 168, 169, 170, 171, 172, 173, 174, 174, 175, 176, 177, 178, 179, 180, 181,
- 182, 183, 184, 185, 186, 187, 188, 189, 190, 190, 191, 192, 193, 194, 195, 196,
- 197, 198, 199, 200, 201, 202, 203, 204, 204, 205, 206, 207, 208, 209, 210, 211,
- 212, 213, 214, 215, 216, 217, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226,
- 227, 228, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 239, 240,
- 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 250, 251, 252, 253, 254, 255,
-};
-#define ADJUST_ALPHA(background, foreground, src_alpha, text_flags, a) \
- src_alpha = g_TextGammaAdjust[(FX_BYTE)src_alpha];
-void _Color2Argb(FX_ARGB& argb, FX_DWORD color, int alpha_flag, void* pIccTransform)
-{
- if (pIccTransform == NULL && !FXGETFLAG_COLORTYPE(alpha_flag)) {
- argb = color;
- return;
- }
- if (!CFX_GEModule::Get()->GetCodecModule() || !CFX_GEModule::Get()->GetCodecModule()->GetIccModule()) {
- pIccTransform = NULL;
- }
- FX_BYTE bgra[4];
- if (pIccTransform) {
- ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
- color = FXGETFLAG_COLORTYPE(alpha_flag) ? FXCMYK_TODIB(color) : FXARGB_TODIB(color);
- pIccModule->TranslateScanline(pIccTransform, bgra, (FX_LPCBYTE)&color, 1);
- bgra[3] = FXGETFLAG_COLORTYPE(alpha_flag) ?
- (alpha_flag >> 24) ? FXGETFLAG_ALPHA_FILL(alpha_flag) : FXGETFLAG_ALPHA_STROKE(alpha_flag) :
- FXARGB_A(color);
- argb = FXARGB_MAKE(bgra[3], bgra[2], bgra[1], bgra[0]);
- return;
- }
- AdobeCMYK_to_sRGB1(FXSYS_GetCValue(color), FXSYS_GetMValue(color),
- FXSYS_GetYValue(color), FXSYS_GetKValue(color),
- bgra[2], bgra[1], bgra[0]);
- bgra[3] = (alpha_flag >> 24) ? FXGETFLAG_ALPHA_FILL(alpha_flag) : FXGETFLAG_ALPHA_STROKE(alpha_flag);
- argb = FXARGB_MAKE(bgra[3], bgra[2], bgra[1], bgra[0]);
-}
-FX_BOOL CFX_RenderDevice::DrawNormalText(int nChars, const FXTEXT_CHARPOS* pCharPos,
- CFX_Font* pFont, CFX_FontCache* pCache,
- FX_FLOAT font_size, const CFX_AffineMatrix* pText2Device,
- FX_DWORD fill_color, FX_DWORD text_flags,
- int alpha_flag, void* pIccTransform)
-{
- int nativetext_flags = text_flags;
- if (m_DeviceClass != FXDC_DISPLAY) {
- if (!(text_flags & FXTEXT_PRINTGRAPHICTEXT)) {
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
- if (!(text_flags & FXFONT_CIDFONT) && pFont->GetPsName().Find(CFX_WideString::FromLocal("+ZJHL")) == -1)
-#ifdef FOXIT_CHROME_BUILD
- if (pFont->GetPsName() != CFX_WideString::FromLocal("CNAAJI+cmex10"))
-#endif
-#endif
- if (m_pDeviceDriver->DrawDeviceText(nChars, pCharPos, pFont, pCache, pText2Device, font_size, fill_color, alpha_flag, pIccTransform)) {
- return TRUE;
- }
- }
- int alpha = FXGETFLAG_COLORTYPE(alpha_flag) ? FXGETFLAG_ALPHA_FILL(alpha_flag) : FXARGB_A(fill_color);
- if (alpha < 255) {
- return FALSE;
- }
- } else if (!(text_flags & FXTEXT_NO_NATIVETEXT)) {
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
- if (!(text_flags & FXFONT_CIDFONT))
-#ifdef FOXIT_CHROME_BUILD
- if (pFont->GetPsName() != CFX_WideString::FromLocal("CNAAJI+cmex10"))
-#endif
-#endif
- if (m_pDeviceDriver->DrawDeviceText(nChars, pCharPos, pFont, pCache, pText2Device, font_size, fill_color, alpha_flag, pIccTransform)) {
- return TRUE;
- }
- }
- CFX_AffineMatrix char2device, deviceCtm, text2Device;
- if (pText2Device) {
- char2device = *pText2Device;
- text2Device = *pText2Device;
- }
- char2device.Scale(font_size, -font_size);
- if (FXSYS_fabs(char2device.a) + FXSYS_fabs(char2device.b) > 50 * 1.0f ||
- ((m_DeviceClass == FXDC_PRINTER && !m_pDeviceDriver->IsPSPrintDriver())
- && !(text_flags & FXTEXT_PRINTIMAGETEXT))) {
- if (pFont->GetFace() != NULL || (pFont->GetSubstFont()->m_SubstFlags & FXFONT_SUBST_GLYPHPATH)) {
- int nPathFlags = (text_flags & FXTEXT_NOSMOOTH) == 0 ? 0 : FXFILL_NOPATHSMOOTH;
- return DrawTextPath(nChars, pCharPos, pFont, pCache, font_size, pText2Device, NULL, NULL, fill_color, 0, NULL, nPathFlags, alpha_flag, pIccTransform);
- }
- }
- int anti_alias = FXFT_RENDER_MODE_MONO;
- FX_BOOL bNormal = FALSE;
- if ((text_flags & FXTEXT_NOSMOOTH) == 0) {
- if (m_DeviceClass == FXDC_DISPLAY && m_bpp > 1) {
- FX_BOOL bClearType;
- if (pFont->GetFace() == NULL && !(pFont->GetSubstFont()->m_SubstFlags & FXFONT_SUBST_CLEARTYPE)) {
- bClearType = FALSE;
- } else {
- bClearType = text_flags & FXTEXT_CLEARTYPE;
- }
- if ((m_RenderCaps & (FXRC_ALPHA_OUTPUT | FXRC_CMYK_OUTPUT))) {
- anti_alias = FXFT_RENDER_MODE_LCD;
- bNormal = TRUE;
- } else if (m_bpp < 16) {
- anti_alias = FXFT_RENDER_MODE_NORMAL;
- } else {
- if (bClearType == FALSE) {
- anti_alias = FXFT_RENDER_MODE_LCD;
- bNormal = TRUE;
- } else {
- anti_alias = FXFT_RENDER_MODE_LCD;
- }
- }
- }
- }
- if (pCache == NULL) {
- pCache = CFX_GEModule::Get()->GetFontCache();
- }
- CFX_FaceCache* pFaceCache = pCache->GetCachedFace(pFont);
- FX_FONTCACHE_DEFINE(pCache, pFont);
- FXTEXT_GLYPHPOS* pGlyphAndPos = FX_Alloc(FXTEXT_GLYPHPOS, nChars);
- if (!pGlyphAndPos) {
- return FALSE;
- }
- int iChar;
- deviceCtm = char2device;
- CFX_AffineMatrix matrixCTM = GetCTM();
- FX_FLOAT scale_x = FXSYS_fabs(matrixCTM.a);
- FX_FLOAT scale_y = FXSYS_fabs(matrixCTM.d);
- deviceCtm.Concat(scale_x, 0, 0, scale_y, 0, 0);
- text2Device.Concat(scale_x, 0, 0, scale_y, 0, 0);
- for (iChar = 0; iChar < nChars; iChar ++) {
- FXTEXT_GLYPHPOS& glyph = pGlyphAndPos[iChar];
- const FXTEXT_CHARPOS& charpos = pCharPos[iChar];
- glyph.m_fOriginX = charpos.m_OriginX;
- glyph.m_fOriginY = charpos.m_OriginY;
- text2Device.Transform(glyph.m_fOriginX, glyph.m_fOriginY);
- if (anti_alias < FXFT_RENDER_MODE_LCD) {
- glyph.m_OriginX = FXSYS_round(glyph.m_fOriginX);
- } else {
- glyph.m_OriginX = (int)FXSYS_floor(glyph.m_fOriginX);
- }
- glyph.m_OriginY = FXSYS_round(glyph.m_fOriginY);
- if (charpos.m_bGlyphAdjust) {
- CFX_AffineMatrix new_matrix(charpos.m_AdjustMatrix[0], charpos.m_AdjustMatrix[1],
- charpos.m_AdjustMatrix[2], charpos.m_AdjustMatrix[3], 0, 0);
- new_matrix.Concat(deviceCtm);
- glyph.m_pGlyph = pFaceCache->LoadGlyphBitmap(pFont, charpos.m_GlyphIndex, charpos.m_bFontStyle, &new_matrix,
- charpos.m_FontCharWidth, anti_alias, nativetext_flags);
- } else
- glyph.m_pGlyph = pFaceCache->LoadGlyphBitmap(pFont, charpos.m_GlyphIndex, charpos.m_bFontStyle, &deviceCtm,
- charpos.m_FontCharWidth, anti_alias, nativetext_flags);
- }
- if (anti_alias < FXFT_RENDER_MODE_LCD && nChars > 1) {
- _AdjustGlyphSpace(pGlyphAndPos, nChars);
- }
- FX_RECT bmp_rect1 = FXGE_GetGlyphsBBox(pGlyphAndPos, nChars, anti_alias);
- if (scale_x > 1 && scale_y > 1) {
- bmp_rect1.left--;
- bmp_rect1.top --;
- bmp_rect1.right ++;
- bmp_rect1.bottom ++;
- }
- FX_RECT bmp_rect(FXSYS_round((FX_FLOAT)(bmp_rect1.left) / scale_x), FXSYS_round((FX_FLOAT)(bmp_rect1.top) / scale_y),
- FXSYS_round((FX_FLOAT)bmp_rect1.right / scale_x), FXSYS_round((FX_FLOAT)bmp_rect1.bottom / scale_y));
- bmp_rect.Intersect(m_ClipBox);
- if (bmp_rect.IsEmpty()) {
- FX_Free(pGlyphAndPos);
- return TRUE;
- }
- int pixel_width = FXSYS_round(bmp_rect.Width() * scale_x);
- int pixel_height = FXSYS_round(bmp_rect.Height() * scale_y);
- int pixel_left = FXSYS_round(bmp_rect.left * scale_x);
- int pixel_top = FXSYS_round(bmp_rect.top * scale_y);
- if (anti_alias == FXFT_RENDER_MODE_MONO) {
- CFX_DIBitmap bitmap;
- if (!bitmap.Create(pixel_width, pixel_height, FXDIB_1bppMask)) {
- FX_Free(pGlyphAndPos);
- return FALSE;
- }
- bitmap.Clear(0);
- for (iChar = 0; iChar < nChars; iChar ++) {
- FXTEXT_GLYPHPOS& glyph = pGlyphAndPos[iChar];
- if (glyph.m_pGlyph == NULL) {
- continue;
- }
- const CFX_DIBitmap* pGlyph = &glyph.m_pGlyph->m_Bitmap;
- bitmap.TransferBitmap(glyph.m_OriginX + glyph.m_pGlyph->m_Left - pixel_left,
- glyph.m_OriginY - glyph.m_pGlyph->m_Top - pixel_top,
- pGlyph->GetWidth(), pGlyph->GetHeight(), pGlyph, 0, 0);
- }
- FX_Free(pGlyphAndPos);
- return SetBitMask(&bitmap, bmp_rect.left, bmp_rect.top, fill_color);
- }
- CFX_DIBitmap bitmap;
- if (m_bpp == 8) {
- if (!bitmap.Create(pixel_width, pixel_height, FXDIB_8bppMask)) {
- FX_Free(pGlyphAndPos);
- return FALSE;
- }
- } else {
- if (!CreateCompatibleBitmap(&bitmap, pixel_width, pixel_height)) {
- FX_Free(pGlyphAndPos);
- return FALSE;
- }
- }
- if (!bitmap.HasAlpha() && !bitmap.IsAlphaMask()) {
- bitmap.Clear(0xFFFFFFFF);
- if (!GetDIBits(&bitmap, bmp_rect.left, bmp_rect.top)) {
- FX_Free(pGlyphAndPos);
- return FALSE;
- }
- } else {
- bitmap.Clear(0);
- if (bitmap.m_pAlphaMask) {
- bitmap.m_pAlphaMask->Clear(0);
- }
- }
- int dest_width = pixel_width;
- FX_LPBYTE dest_buf = bitmap.GetBuffer();
- int dest_pitch = bitmap.GetPitch();
- int Bpp = bitmap.GetBPP() / 8;
- int a, r, g, b;
- if (anti_alias == FXFT_RENDER_MODE_LCD) {
- _Color2Argb(fill_color, fill_color, alpha_flag | (1 << 24), pIccTransform);
- ArgbDecode(fill_color, a, r, g, b);
- r = FX_GAMMA(r);
- g = FX_GAMMA(g);
- b = FX_GAMMA(b);
- }
- for (iChar = 0; iChar < nChars; iChar ++) {
- FXTEXT_GLYPHPOS& glyph = pGlyphAndPos[iChar];
- if (glyph.m_pGlyph == NULL) {
- continue;
- }
- const CFX_DIBitmap* pGlyph = &glyph.m_pGlyph->m_Bitmap;
- int left = glyph.m_OriginX + glyph.m_pGlyph->m_Left - pixel_left;
- int top = glyph.m_OriginY - glyph.m_pGlyph->m_Top - pixel_top;
- int ncols = pGlyph->GetWidth();
- int nrows = pGlyph->GetHeight();
- if (anti_alias == FXFT_RENDER_MODE_NORMAL) {
- if (!bitmap.CompositeMask(left, top, ncols, nrows, pGlyph, fill_color,
- 0, 0, FXDIB_BLEND_NORMAL, NULL, FALSE, alpha_flag, pIccTransform)) {
- FX_Free(pGlyphAndPos);
- return FALSE;
- }
- continue;
- }
- FX_BOOL bBGRStripe = text_flags & FXTEXT_BGR_STRIPE;
- ncols /= 3;
- int x_subpixel = (int)(glyph.m_fOriginX * 3) % 3;
- FX_LPBYTE src_buf = pGlyph->GetBuffer();
- int src_pitch = pGlyph->GetPitch();
- int start_col = left;
- if (start_col < 0) {
- start_col = 0;
- }
- int end_col = left + ncols;
- if (end_col > dest_width) {
- end_col = dest_width;
- }
- if (start_col >= end_col) {
- continue;
- }
- if (bitmap.GetFormat() == FXDIB_Argb) {
- for (int row = 0; row < nrows; row ++) {
- int dest_row = row + top;
- if (dest_row < 0 || dest_row >= bitmap.GetHeight()) {
- continue;
- }
- FX_LPBYTE src_scan = src_buf + row * src_pitch + (start_col - left) * 3;
- FX_LPBYTE dest_scan = dest_buf + dest_row * dest_pitch + (start_col << 2);
- if (bBGRStripe) {
- if (x_subpixel == 0) {
- for (int col = start_col; col < end_col; col ++) {
- int src_alpha = src_scan[2];
- src_alpha = src_alpha * a / 255;
- dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
- src_alpha = src_scan[1];
- src_alpha = src_alpha * a / 255;
- dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
- src_alpha = src_scan[0];
- src_alpha = src_alpha * a / 255;
- dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
- dest_scan[3] = 255;
- dest_scan += 4;
- src_scan += 3;
- }
- } else if (x_subpixel == 1) {
- int src_alpha = src_scan[1];
- ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
- src_alpha = src_alpha * a / 255;
- dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
- src_alpha = src_scan[0];
- ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
- src_alpha = src_alpha * a / 255;
- dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
- if (start_col > left) {
- src_alpha = src_scan[-1];
- ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
- src_alpha = src_alpha * a / 255;
- dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
- }
- dest_scan[3] = 255;
- dest_scan += 4;
- src_scan += 3;
- for (int col = start_col + 1; col < end_col - 1; col ++) {
- int src_alpha = src_scan[1];
- ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
- src_alpha = src_alpha * a / 255;
- dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
- src_alpha = src_scan[0];
- ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
- src_alpha = src_alpha * a / 255;
- dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
- src_alpha = src_scan[-1];
- ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
- src_alpha = src_alpha * a / 255;
- dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
- dest_scan[3] = 255;
- dest_scan += 4;
- src_scan += 3;
- }
- } else {
- int src_alpha = src_scan[0];
- ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
- src_alpha = src_alpha * a / 255;
- dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
- if (start_col > left) {
- src_alpha = src_scan[-1];
- ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
- src_alpha = src_alpha * a / 255;
- dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
- src_alpha = src_scan[-2];
- ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
- src_alpha = src_alpha * a / 255;
- dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
- }
- dest_scan[3] = 255;
- dest_scan += 4;
- src_scan += 3;
- for (int col = start_col + 1; col < end_col - 1; col ++) {
- int src_alpha = src_scan[0];
- ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
- src_alpha = src_alpha * a / 255;
- dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
- src_alpha = src_scan[-1];
- ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
- src_alpha = src_alpha * a / 255;
- dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
- src_alpha = src_scan[-2];
- ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
- src_alpha = src_alpha * a / 255;
- dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
- dest_scan[3] = 255;
- dest_scan += 4;
- src_scan += 3;
- }
- }
- } else {
- if (x_subpixel == 0) {
- for (int col = start_col; col < end_col; col ++) {
- if (bNormal) {
- int src_alpha1 = (src_scan[0] + src_scan[1] + src_scan[2]) / 3;
- ADJUST_ALPHA(dest_scan[2], r, src_alpha1, nativetext_flags, a);
- src_alpha1 = src_alpha1 * a / 255;
- FX_BYTE back_alpha = dest_scan[3];
- if (back_alpha == 0) {
- FXARGB_SETDIB(dest_scan, FXARGB_MAKE(src_alpha1, r, g, b));
- dest_scan += 4;
- src_scan += 3;
- continue;
- }
- if (src_alpha1 == 0) {
- dest_scan += 4;
- src_scan += 3;
- continue;
- }
- FX_BYTE dest_alpha = back_alpha + src_alpha1 - back_alpha * src_alpha1 / 255;
- dest_scan[3] = dest_alpha;
- int alpha_ratio = src_alpha1 * 255 / dest_alpha;
- dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, alpha_ratio));
- dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, alpha_ratio));
- dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, alpha_ratio));
- dest_scan += 4;
- src_scan += 3;
- continue;
- }
- int src_alpha = src_scan[0];
- ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
- src_alpha = src_alpha * a / 255;
- dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
- src_alpha = src_scan[1];
- ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
- src_alpha = src_alpha * a / 255;
- dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
- src_alpha = src_scan[2];
- ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
- src_alpha = src_alpha * a / 255;
- dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
- dest_scan[3] = 255;
- dest_scan += 4;
- src_scan += 3;
- }
- } else if (x_subpixel == 1) {
- if (bNormal) {
- int src_alpha1 = start_col > left ? ((src_scan[-1] + src_scan[0] + src_scan[1]) / 3) : ((src_scan[0] + src_scan[1]) / 3);
- ADJUST_ALPHA(dest_scan[2], r, src_alpha1, nativetext_flags, a);
- src_alpha1 = src_alpha1 * a / 255;
- if (src_alpha1 == 0) {
- dest_scan += 4;
- src_scan += 3;
- } else {
- FX_BYTE back_alpha = dest_scan[3];
- if (back_alpha == 0) {
- FXARGB_SETDIB(dest_scan, FXARGB_MAKE(src_alpha1, r, g, b));
- } else {
- FX_BYTE dest_alpha = back_alpha + src_alpha1 - back_alpha * src_alpha1 / 255;
- dest_scan[3] = dest_alpha;
- int alpha_ratio = src_alpha1 * 255 / dest_alpha;
- dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, alpha_ratio));
- dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, alpha_ratio));
- dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, alpha_ratio));
- }
- dest_scan += 4;
- src_scan += 3;
- }
- } else {
- if (start_col > left) {
- int src_alpha = src_scan[-1];
- ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
- src_alpha = src_alpha * a / 255;
- dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
- }
- int src_alpha = src_scan[0];
- ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
- src_alpha = src_alpha * a / 255;
- dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
- src_alpha = src_scan[1];
- ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
- src_alpha = src_alpha * a / 255;
- dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
- dest_scan[3] = 255;
- dest_scan += 4;
- src_scan += 3;
- }
- for (int col = start_col + 1; col < end_col; col ++) {
- if (bNormal) {
- int src_alpha1 = (src_scan[-1] + src_scan[0] + src_scan[1]) / 3;
- ADJUST_ALPHA(dest_scan[2], r, src_alpha1, nativetext_flags, a);
- src_alpha1 = src_alpha1 * a / 255;
- FX_BYTE back_alpha = dest_scan[3];
- if (back_alpha == 0) {
- FXARGB_SETDIB(dest_scan, FXARGB_MAKE(src_alpha1, r, g, b));
- dest_scan += 4;
- src_scan += 3;
- continue;
- }
- if (src_alpha1 == 0) {
- dest_scan += 4;
- src_scan += 3;
- continue;
- }
- FX_BYTE dest_alpha = back_alpha + src_alpha1 - back_alpha * src_alpha1 / 255;
- dest_scan[3] = dest_alpha;
- int alpha_ratio = src_alpha1 * 255 / dest_alpha;
- dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, alpha_ratio));
- dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, alpha_ratio));
- dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, alpha_ratio));
- dest_scan += 4;
- src_scan += 3;
- continue;
- }
- int src_alpha = src_scan[-1];
- ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
- src_alpha = src_alpha * a / 255;
- dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
- src_alpha = src_scan[0];
- ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
- src_alpha = src_alpha * a / 255;
- dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
- src_alpha = src_scan[1];
- ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
- src_alpha = src_alpha * a / 255;
- dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
- dest_scan[3] = 255;
- dest_scan += 4;
- src_scan += 3;
- }
- } else {
- if (bNormal) {
- int src_alpha1 = start_col > left ? ((src_scan[-2] + src_scan[-1] + src_scan[0]) / 3) : ((src_scan[0]) / 3);
- ADJUST_ALPHA(dest_scan[2], r, src_alpha1, nativetext_flags, a);
- src_alpha1 = src_alpha1 * a / 255;
- if (src_alpha1 == 0) {
- dest_scan += 4;
- src_scan += 3;
- } else {
- FX_BYTE back_alpha = dest_scan[3];
- if (back_alpha == 0) {
- FXARGB_SETDIB(dest_scan, FXARGB_MAKE(src_alpha1, r, g, b));
- } else {
- FX_BYTE dest_alpha = back_alpha + src_alpha1 - back_alpha * src_alpha1 / 255;
- dest_scan[3] = dest_alpha;
- int alpha_ratio = src_alpha1 * 255 / dest_alpha;
- dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, alpha_ratio));
- dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, alpha_ratio));
- dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, alpha_ratio));
- }
- dest_scan += 4;
- src_scan += 3;
- }
- } else {
- if (start_col > left) {
- int src_alpha = src_scan[-2];
- ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
- src_alpha = src_alpha * a / 255;
- dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
- src_alpha = src_scan[-1];
- ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
- src_alpha = src_alpha * a / 255;
- dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
- }
- int src_alpha = src_scan[0];
- ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
- src_alpha = src_alpha * a / 255;
- dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
- dest_scan[3] = 255;
- dest_scan += 4;
- src_scan += 3;
- }
- for (int col = start_col + 1; col < end_col; col ++) {
- if (bNormal) {
- int src_alpha1 = (src_scan[-2] + src_scan[-1] + src_scan[0]) / 3;
- ADJUST_ALPHA(dest_scan[2], r, src_alpha1, nativetext_flags, a);
- src_alpha1 = src_alpha1 * a / 255;
- FX_BYTE back_alpha = dest_scan[3];
- if (back_alpha == 0) {
- FXARGB_SETDIB(dest_scan, FXARGB_MAKE(src_alpha1, r, g, b));
- dest_scan += 4;
- src_scan += 3;
- continue;
- }
- if (src_alpha1 == 0) {
- dest_scan += 4;
- src_scan += 3;
- continue;
- }
- FX_BYTE dest_alpha = back_alpha + src_alpha1 - back_alpha * src_alpha1 / 255;
- dest_scan[3] = dest_alpha;
- int alpha_ratio = src_alpha1 * 255 / dest_alpha;
- dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, alpha_ratio));
- dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, alpha_ratio));
- dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, alpha_ratio));
- dest_scan += 4;
- src_scan += 3;
- continue;
- }
- int src_alpha = src_scan[-2];
- ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
- src_alpha = src_alpha * a / 255;
- dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
- src_alpha = src_scan[-1];
- ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
- src_alpha = src_alpha * a / 255;
- dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
- src_alpha = src_scan[0];
- ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
- src_alpha = src_alpha * a / 255;
- dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
- dest_scan[3] = 255;
- dest_scan += 4;
- src_scan += 3;
- }
- }
- }
- }
- } else {
- for (int row = 0; row < nrows; row ++) {
- int dest_row = row + top;
- if (dest_row < 0 || dest_row >= bitmap.GetHeight()) {
- continue;
- }
- FX_LPBYTE src_scan = src_buf + row * src_pitch + (start_col - left) * 3;
- FX_LPBYTE dest_scan = dest_buf + dest_row * dest_pitch + start_col * Bpp;
- if (bBGRStripe) {
- if (x_subpixel == 0) {
- for (int col = start_col; col < end_col; col ++) {
- int src_alpha = src_scan[2];
- ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
- src_alpha = src_alpha * a / 255;
- dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
- src_alpha = src_scan[1];
- ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
- src_alpha = src_alpha * a / 255;
- dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
- src_alpha = src_scan[0];
- ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
- src_alpha = src_alpha * a / 255;
- dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
- dest_scan += Bpp;
- src_scan += 3;
- }
- } else if (x_subpixel == 1) {
- int src_alpha = src_scan[1];
- ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
- src_alpha = src_alpha * a / 255;
- dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
- src_alpha = src_scan[0];
- ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
- src_alpha = src_alpha * a / 255;
- dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
- if (start_col > left) {
- src_alpha = src_scan[-1];
- ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
- src_alpha = src_alpha * a / 255;
- dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
- }
- dest_scan += Bpp;
- src_scan += 3;
- for (int col = start_col + 1; col < end_col - 1; col ++) {
- int src_alpha = src_scan[1];
- ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
- src_alpha = src_alpha * a / 255;
- dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
- src_alpha = src_scan[0];
- ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
- src_alpha = src_alpha * a / 255;
- dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
- src_alpha = src_scan[-1];
- ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
- src_alpha = src_alpha * a / 255;
- dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
- dest_scan += Bpp;
- src_scan += 3;
- }
- } else {
- int src_alpha = src_scan[0];
- ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
- src_alpha = src_alpha * a / 255;
- dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
- if (start_col > left) {
- src_alpha = src_scan[-1];
- ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
- src_alpha = src_alpha * a / 255;
- dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
- src_alpha = src_scan[-2];
- ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
- src_alpha = src_alpha * a / 255;
- dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
- }
- dest_scan += Bpp;
- src_scan += 3;
- for (int col = start_col + 1; col < end_col - 1; col ++) {
- int src_alpha = src_scan[0];
- ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
- src_alpha = src_alpha * a / 255;
- dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
- src_alpha = src_scan[-1];
- ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
- src_alpha = src_alpha * a / 255;
- dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
- src_alpha = src_scan[-2];
- ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
- src_alpha = src_alpha * a / 255;
- dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
- dest_scan += Bpp;
- src_scan += 3;
- }
- }
- } else {
- if (x_subpixel == 0) {
- for (int col = start_col; col < end_col; col ++) {
- if (bNormal) {
- int src_alpha1 = (src_scan[0] + src_scan[1] + src_scan[2]) / 3;
- ADJUST_ALPHA(dest_scan[2], r, src_alpha1, nativetext_flags, a);
- src_alpha1 = src_alpha1 * a / 255;
- if (src_alpha1 == 0) {
- dest_scan += Bpp;
- src_scan += 3;
- continue;
- }
- dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha1));
- dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha1));
- dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha1));
- dest_scan += Bpp;
- src_scan += 3;
- continue;
- }
- int src_alpha = src_scan[0];
- ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
- src_alpha = src_alpha * a / 255;
- dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
- src_alpha = src_scan[1];
- ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
- src_alpha = src_alpha * a / 255;
- dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
- src_alpha = src_scan[2];
- ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
- src_alpha = src_alpha * a / 255;
- dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
- dest_scan += Bpp;
- src_scan += 3;
- }
- } else if (x_subpixel == 1) {
- if (bNormal) {
- int src_alpha1 = start_col > left ? (src_scan[0] + src_scan[1] + src_scan[-1]) / 3 : (src_scan[0] + src_scan[1]) / 3;
- ADJUST_ALPHA(dest_scan[2], r, src_alpha1, nativetext_flags, a);
- src_alpha1 = src_alpha1 * a / 255;
- dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha1));
- dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha1));
- dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha1));
- dest_scan += Bpp;
- src_scan += 3;
- } else {
- if (start_col > left) {
- int src_alpha = src_scan[-1];
- ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
- src_alpha = src_alpha * a / 255;
- dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
- }
- int src_alpha = src_scan[0];
- ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
- src_alpha = src_alpha * a / 255;
- dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
- src_alpha = src_scan[1];
- ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
- src_alpha = src_alpha * a / 255;
- dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
- dest_scan += Bpp;
- src_scan += 3;
- }
- for (int col = start_col + 1; col < end_col; col ++) {
- if (bNormal) {
- int src_alpha1 = (src_scan[0] + src_scan[1] + src_scan[-1]) / 3;
- ADJUST_ALPHA(dest_scan[2], r, src_alpha1, nativetext_flags, a);
- src_alpha1 = src_alpha1 * a / 255;
- if (src_alpha1 == 0) {
- dest_scan += Bpp;
- src_scan += 3;
- continue;
- }
- dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha1));
- dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha1));
- dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha1));
- dest_scan += Bpp;
- src_scan += 3;
- continue;
- }
- int src_alpha = src_scan[-1];
- ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
- src_alpha = src_alpha * a / 255;
- dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
- src_alpha = src_scan[0];
- ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
- src_alpha = src_alpha * a / 255;
- dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
- src_alpha = src_scan[1];
- ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
- src_alpha = src_alpha * a / 255;
- dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
- dest_scan += Bpp;
- src_scan += 3;
- }
- } else {
- if (bNormal) {
- int src_alpha1 = start_col > left ? (src_scan[0] + src_scan[-2] + src_scan[-1]) / 3 : src_scan[0] / 3;
- ADJUST_ALPHA(dest_scan[2], r, src_alpha1, nativetext_flags, a);
- src_alpha1 = src_alpha1 * a / 255;
- dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha1));
- dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha1));
- dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha1));
- dest_scan += Bpp;
- src_scan += 3;
- } else {
- if (start_col > left) {
- int src_alpha = src_scan[-2];
- ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
- src_alpha = src_alpha * a / 255;
- dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
- src_alpha = src_scan[-1];
- ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
- src_alpha = src_alpha * a / 255;
- dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
- }
- int src_alpha = src_scan[0];
- ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
- src_alpha = src_alpha * a / 255;
- dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
- dest_scan += Bpp;
- src_scan += 3;
- }
- for (int col = start_col + 1; col < end_col; col ++) {
- if (bNormal) {
- int src_alpha1 = ((int)(src_scan[0]) + (int)(src_scan[-2]) + (int)(src_scan[-1])) / 3;
- ADJUST_ALPHA(dest_scan[2], r, src_alpha1, nativetext_flags, a);
- src_alpha1 = src_alpha1 * a / 255;
- if (src_alpha1 == 0) {
- dest_scan += Bpp;
- src_scan += 3;
- continue;
- }
- dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha1));
- dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha1));
- dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha1));
- dest_scan += Bpp;
- src_scan += 3;
- continue;
- }
- int src_alpha = src_scan[-2];
- ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
- src_alpha = src_alpha * a / 255;
- dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
- src_alpha = src_scan[-1];
- ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
- src_alpha = src_alpha * a / 255;
- dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
- src_alpha = src_scan[0];
- ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
- src_alpha = src_alpha * a / 255;
- dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
- dest_scan += Bpp;
- src_scan += 3;
- }
- }
- }
- }
- }
- }
- if (bitmap.IsAlphaMask()) {
- SetBitMask(&bitmap, bmp_rect.left, bmp_rect.top, fill_color, alpha_flag, pIccTransform);
- } else {
- SetDIBits(&bitmap, bmp_rect.left, bmp_rect.top);
- }
- FX_Free(pGlyphAndPos);
- return TRUE;
-}
-FX_BOOL CFX_RenderDevice::DrawTextPath(int nChars, const FXTEXT_CHARPOS* pCharPos,
- CFX_Font* pFont, CFX_FontCache* pCache,
- FX_FLOAT font_size, const CFX_AffineMatrix* pText2User,
- const CFX_AffineMatrix* pUser2Device, const CFX_GraphStateData* pGraphState,
- FX_DWORD fill_color, FX_ARGB stroke_color, CFX_PathData* pClippingPath, int nFlag,
- int alpha_flag, void* pIccTransform, int blend_type)
-{
- if (pCache == NULL) {
- pCache = CFX_GEModule::Get()->GetFontCache();
- }
- CFX_FaceCache* pFaceCache = pCache->GetCachedFace(pFont);
- FX_FONTCACHE_DEFINE(pCache, pFont);
- for (int iChar = 0; iChar < nChars; iChar ++) {
- const FXTEXT_CHARPOS& charpos = pCharPos[iChar];
- CFX_AffineMatrix matrix;
- if (charpos.m_bGlyphAdjust)
- matrix.Set(charpos.m_AdjustMatrix[0], charpos.m_AdjustMatrix[1],
- charpos.m_AdjustMatrix[2], charpos.m_AdjustMatrix[3], 0, 0);
- matrix.Concat(font_size, 0, 0, font_size, charpos.m_OriginX, charpos.m_OriginY);
- const CFX_PathData* pPath = pFaceCache->LoadGlyphPath(pFont, charpos.m_GlyphIndex, charpos.m_FontCharWidth);
- if (pPath == NULL) {
- continue;
- }
- matrix.Concat(*pText2User);
- CFX_PathData TransformedPath(*pPath);
- TransformedPath.Transform(&matrix);
- FX_BOOL bHasAlpha = FXGETFLAG_COLORTYPE(alpha_flag) ?
- (FXGETFLAG_ALPHA_FILL(alpha_flag) || FXGETFLAG_ALPHA_STROKE(alpha_flag)) :
- (fill_color || stroke_color);
- if (bHasAlpha) {
- int fill_mode = nFlag;
- if (FXGETFLAG_COLORTYPE(alpha_flag)) {
- if (FXGETFLAG_ALPHA_FILL(alpha_flag)) {
- fill_mode |= FXFILL_WINDING;
- }
- } else {
- if (fill_color) {
- fill_mode |= FXFILL_WINDING;
- }
- }
- fill_mode |= FX_FILL_TEXT_MODE;
- if (!DrawPath(&TransformedPath, pUser2Device, pGraphState, fill_color, stroke_color, fill_mode, alpha_flag, pIccTransform, blend_type)) {
- return FALSE;
- }
- }
- if (pClippingPath) {
- pClippingPath->Append(&TransformedPath, pUser2Device);
- }
- }
- return TRUE;
-}
-CFX_FontCache::~CFX_FontCache()
-{
- FreeCache(TRUE);
-}
-CFX_FaceCache* CFX_FontCache::GetCachedFace(CFX_Font* pFont)
-{
- FX_BOOL bExternal = pFont->GetFace() == NULL;
- void* face = bExternal ? pFont->GetSubstFont()->m_ExtHandle : pFont->GetFace();
- CFX_FTCacheMap& map = bExternal ? m_ExtFaceMap : m_FTFaceMap;
- CFX_CountedFaceCache* counted_face_cache = NULL;
- if (map.Lookup((FXFT_Face)face, counted_face_cache)) {
- counted_face_cache->m_nCount++;
- return counted_face_cache->m_Obj;
- }
- CFX_FaceCache* face_cache = NULL;
- face_cache = FX_NEW CFX_FaceCache(bExternal ? NULL : (FXFT_Face)face);
- if (face_cache == NULL) {
- return NULL;
- }
- counted_face_cache = FX_NEW CFX_CountedFaceCache;
- if (!counted_face_cache) {
- if (face_cache) {
- delete face_cache;
- face_cache = NULL;
- }
- return NULL;
- }
- counted_face_cache->m_nCount = 2;
- counted_face_cache->m_Obj = face_cache;
- map.SetAt((FXFT_Face)face, counted_face_cache);
- return face_cache;
-}
-void CFX_FontCache::ReleaseCachedFace(CFX_Font* pFont)
-{
- FX_BOOL bExternal = pFont->GetFace() == NULL;
- void* face = bExternal ? pFont->GetSubstFont()->m_ExtHandle : pFont->GetFace();
- CFX_FTCacheMap& map = bExternal ? m_ExtFaceMap : m_FTFaceMap;
- CFX_CountedFaceCache* counted_face_cache = NULL;
- if (!map.Lookup((FXFT_Face)face, counted_face_cache)) {
- return;
- }
- if (counted_face_cache->m_nCount > 1) {
- counted_face_cache->m_nCount--;
- }
-}
-void CFX_FontCache::FreeCache(FX_BOOL bRelease)
-{
- {
- FX_POSITION pos;
- pos = m_FTFaceMap.GetStartPosition();
- while (pos) {
- FXFT_Face face;
- CFX_CountedFaceCache* cache;
- m_FTFaceMap.GetNextAssoc(pos, face, cache);
- if (bRelease || cache->m_nCount < 2) {
- delete cache->m_Obj;
- delete cache;
- m_FTFaceMap.RemoveKey(face);
- }
- }
- pos = m_ExtFaceMap.GetStartPosition();
- while (pos) {
- FXFT_Face face;
- CFX_CountedFaceCache* cache;
- m_ExtFaceMap.GetNextAssoc(pos, face, cache);
- if (bRelease || cache->m_nCount < 2) {
- delete cache->m_Obj;
- delete cache;
- m_ExtFaceMap.RemoveKey(face);
- }
- }
- }
-}
-CFX_FaceCache::CFX_FaceCache(FXFT_Face face)
-{
- m_Face = face;
- m_pBitmap = NULL;
-}
-CFX_FaceCache::~CFX_FaceCache()
-{
- FX_POSITION pos = m_SizeMap.GetStartPosition();
- CFX_ByteString Key;
- CFX_SizeGlyphCache* pSizeCache = NULL;
- while(pos) {
- m_SizeMap.GetNextAssoc( pos, Key, (void*&)pSizeCache);
- delete pSizeCache;
- }
- m_SizeMap.RemoveAll();
- pos = m_PathMap.GetStartPosition();
- FX_LPVOID key1;
- CFX_PathData* pPath;
- while (pos) {
- m_PathMap.GetNextAssoc(pos, key1, (FX_LPVOID&)pPath);
- delete pPath;
- }
- if (m_pBitmap) {
- delete m_pBitmap;
- }
- m_PathMap.RemoveAll();
-}
-#if ((_FXM_PLATFORM_ != _FXM_PLATFORM_APPLE_)|| defined(_FPDFAPI_MINI_))
-void CFX_FaceCache::InitPlatform()
-{
-}
-#endif
-CFX_GlyphBitmap* CFX_FaceCache::LookUpGlyphBitmap(CFX_Font* pFont, const CFX_AffineMatrix* pMatrix,
- CFX_ByteStringC& FaceGlyphsKey, FX_DWORD glyph_index, FX_BOOL bFontStyle,
- int dest_width, int anti_alias)
-{
- CFX_SizeGlyphCache* pSizeCache = NULL;
- if (!m_SizeMap.Lookup(FaceGlyphsKey, (void*&)pSizeCache)) {
- pSizeCache = FX_NEW CFX_SizeGlyphCache;
- if (pSizeCache == NULL) {
- return NULL;
- }
- m_SizeMap.SetAt(FaceGlyphsKey, pSizeCache);
- }
- CFX_GlyphBitmap* pGlyphBitmap = NULL;
- if (pSizeCache->m_GlyphMap.Lookup((FX_LPVOID)(FX_UINTPTR)glyph_index, (void*&)pGlyphBitmap)) {
- return pGlyphBitmap;
- }
- pGlyphBitmap = RenderGlyph(pFont, glyph_index, bFontStyle, pMatrix, dest_width, anti_alias);
- if (pGlyphBitmap == NULL) {
- return NULL;
- }
- pSizeCache->m_GlyphMap.SetAt((FX_LPVOID)(FX_UINTPTR)glyph_index, pGlyphBitmap);
- return pGlyphBitmap;
-}
-const CFX_GlyphBitmap* CFX_FaceCache::LoadGlyphBitmap(CFX_Font* pFont, FX_DWORD glyph_index, FX_BOOL bFontStyle, const CFX_AffineMatrix* pMatrix,
- int dest_width, int anti_alias, int& text_flags)
-{
- if (glyph_index == (FX_DWORD) - 1) {
- return NULL;
- }
- _CFX_UniqueKeyGen keygen;
-#if ((_FXM_PLATFORM_ != _FXM_PLATFORM_APPLE_)|| defined(_FPDFAPI_MINI_))
- if (pFont->GetSubstFont())
- keygen.Generate(9, (int)(pMatrix->a * 10000), (int)(pMatrix->b * 10000),
- (int)(pMatrix->c * 10000), (int)(pMatrix->d * 10000), dest_width, anti_alias,
- pFont->GetSubstFont()->m_Weight, pFont->GetSubstFont()->m_ItalicAngle, pFont->IsVertical());
- else
- keygen.Generate(6, (int)(pMatrix->a * 10000), (int)(pMatrix->b * 10000),
- (int)(pMatrix->c * 10000), (int)(pMatrix->d * 10000), dest_width, anti_alias);
-#else
- if (text_flags & FXTEXT_NO_NATIVETEXT) {
- if (pFont->GetSubstFont())
- keygen.Generate(9, (int)(pMatrix->a * 10000), (int)(pMatrix->b * 10000),
- (int)(pMatrix->c * 10000), (int)(pMatrix->d * 10000), dest_width, anti_alias,
- pFont->GetSubstFont()->m_Weight, pFont->GetSubstFont()->m_ItalicAngle, pFont->IsVertical());
- else
- keygen.Generate(6, (int)(pMatrix->a * 10000), (int)(pMatrix->b * 10000),
- (int)(pMatrix->c * 10000), (int)(pMatrix->d * 10000), dest_width, anti_alias);
- } else {
- if (pFont->GetSubstFont())
- keygen.Generate(10, (int)(pMatrix->a * 10000), (int)(pMatrix->b * 10000),
- (int)(pMatrix->c * 10000), (int)(pMatrix->d * 10000), dest_width, anti_alias,
- pFont->GetSubstFont()->m_Weight, pFont->GetSubstFont()->m_ItalicAngle, pFont->IsVertical(), 3);
- else
- keygen.Generate(7, (int)(pMatrix->a * 10000), (int)(pMatrix->b * 10000),
- (int)(pMatrix->c * 10000), (int)(pMatrix->d * 10000), dest_width, anti_alias, 3);
- }
-#endif
- CFX_ByteStringC FaceGlyphsKey(keygen.m_Key, keygen.m_KeyLen);
-#if ((_FXM_PLATFORM_ != _FXM_PLATFORM_APPLE_)|| defined(_FPDFAPI_MINI_))
- return LookUpGlyphBitmap(pFont, pMatrix, FaceGlyphsKey, glyph_index, bFontStyle, dest_width, anti_alias);
-#else
- if (text_flags & FXTEXT_NO_NATIVETEXT) {
- return LookUpGlyphBitmap(pFont, pMatrix, FaceGlyphsKey, glyph_index, bFontStyle, dest_width, anti_alias);
- } else {
- CFX_GlyphBitmap* pGlyphBitmap;
- CFX_SizeGlyphCache* pSizeCache = NULL;
- if (m_SizeMap.Lookup(FaceGlyphsKey, (void*&)pSizeCache)) {
- if (pSizeCache->m_GlyphMap.Lookup((FX_LPVOID)(FX_UINTPTR)glyph_index, (void*&)pGlyphBitmap)) {
- return pGlyphBitmap;
- }
- pGlyphBitmap = RenderGlyph_Nativetext(pFont, glyph_index, pMatrix, dest_width, anti_alias);
- if (pGlyphBitmap) {
- pSizeCache->m_GlyphMap.SetAt((FX_LPVOID)(FX_UINTPTR)glyph_index, pGlyphBitmap);
- return pGlyphBitmap;
- }
- } else {
- pGlyphBitmap = RenderGlyph_Nativetext(pFont, glyph_index, pMatrix, dest_width, anti_alias);
- if (pGlyphBitmap) {
- pSizeCache = FX_NEW CFX_SizeGlyphCache;
- if (pSizeCache == NULL) {
- return NULL;
- }
- m_SizeMap.SetAt(FaceGlyphsKey, pSizeCache);
- pSizeCache->m_GlyphMap.SetAt((FX_LPVOID)(FX_UINTPTR)glyph_index, pGlyphBitmap);
- return pGlyphBitmap;
- }
- }
- if (pFont->GetSubstFont())
- keygen.Generate(9, (int)(pMatrix->a * 10000), (int)(pMatrix->b * 10000),
- (int)(pMatrix->c * 10000), (int)(pMatrix->d * 10000), dest_width, anti_alias,
- pFont->GetSubstFont()->m_Weight, pFont->GetSubstFont()->m_ItalicAngle, pFont->IsVertical());
- else
- keygen.Generate(6, (int)(pMatrix->a * 10000), (int)(pMatrix->b * 10000),
- (int)(pMatrix->c * 10000), (int)(pMatrix->d * 10000), dest_width, anti_alias);
- CFX_ByteStringC FaceGlyphsKey(keygen.m_Key, keygen.m_KeyLen);
- text_flags |= FXTEXT_NO_NATIVETEXT;
- return LookUpGlyphBitmap(pFont, pMatrix, FaceGlyphsKey, glyph_index, bFontStyle, dest_width, anti_alias);
- }
-#endif
-}
-CFX_SizeGlyphCache::~CFX_SizeGlyphCache()
-{
- FX_POSITION pos = m_GlyphMap.GetStartPosition();
- FX_LPVOID Key;
- CFX_GlyphBitmap* pGlyphBitmap = NULL;
- while(pos) {
- m_GlyphMap.GetNextAssoc(pos, Key, (void*&)pGlyphBitmap);
- delete pGlyphBitmap;
- }
- m_GlyphMap.RemoveAll();
-}
-#if defined(_FPDFAPI_MINI_)
-#define CONTRAST_RAMP_STEP 16
-#else
-#define CONTRAST_RAMP_STEP 1
-#endif
-static const FX_BYTE g_adjust_contrast11[256] = {
- 0, 0, 2, 3, 4, 5, 6, 8, 9, 10, 11, 13, 14, 15, 17, 18, 19, 21, 22, 24, 25, 26, 28, 29, 31,
- 32, 33, 35, 36, 38, 39, 40, 42, 43, 45, 46, 48, 49, 51, 52, 54, 55, 56, 58, 59, 61, 62, 64, 65,
- 67, 68, 70, 71, 72, 74, 75, 77, 78, 80, 81, 83, 84, 86, 87, 89, 90, 91, 93, 94, 96, 97, 99, 100,
- 101, 103, 104, 106, 107, 109, 110, 111, 113, 114, 116, 117, 118, 120, 121, 123, 124, 125, 127,
- 128, 130, 131, 132, 134, 135, 136, 138, 139, 140, 142, 143, 144, 146, 147, 148, 149, 151, 152,
- 153, 155, 156, 157, 158, 160, 161, 162, 163, 165, 166, 167, 168, 169, 171, 172, 173, 174, 175,
- 177, 178, 179, 180, 181, 182, 183, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196,
- 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215,
- 215, 216, 217, 218, 219, 220, 221, 221, 222, 223, 224, 224, 225, 226, 227, 227, 228, 229, 230,
- 230, 231, 232, 232, 233, 234, 234, 235, 236, 236, 237, 237, 238, 239, 239, 240, 240, 241, 241,
- 242, 242, 243, 243, 244, 244, 245, 245, 246, 246, 246, 247, 247, 248, 248, 248, 249, 249, 249,
- 250, 250, 250, 251, 251, 251, 251, 252, 252, 252, 252, 253, 253, 253, 253, 253, 253, 254, 254,
- 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 255,
-};
-static const FX_BYTE g_adjust_contrast15[256] = {
- 0, 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 5, 5, 6, 7, 7, 8, 9, 10, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21,
- 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 34, 35, 36, 37, 38, 40, 41, 42, 43, 45, 46, 47, 48, 50, 51,
- 52, 54, 55, 56, 58, 59, 60, 62, 63, 64, 66, 67, 68, 70, 71, 73, 74, 75, 77, 78, 80, 81, 82, 84, 85, 87,
- 88, 90, 91, 93, 94, 95, 97, 98, 100, 101, 103, 104, 106, 107, 109, 110, 111, 113, 114, 116, 117, 119,
- 120, 122, 123, 125, 126, 128, 129, 130, 132, 133, 135, 136, 138, 139, 141, 142, 143, 145, 146, 148,
- 149, 150, 152, 153, 155, 156, 157, 159, 160, 161, 163, 164, 166, 167, 168, 170, 171, 172, 174, 175,
- 176, 177, 179, 180, 181, 183, 184, 185, 186, 188, 189, 190, 191, 192, 194, 195, 196, 197, 198, 199,
- 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220,
- 221, 222, 223, 224, 225, 226, 227, 227, 228, 229, 230, 231, 232, 232, 233, 234, 235, 235, 236, 237,
- 237, 238, 239, 239, 240, 241, 241, 242, 242, 243, 244, 244, 245, 245, 246, 246, 247, 247, 248, 248,
- 248, 249, 249, 250, 250, 250, 251, 251, 251, 252, 252, 252, 252, 253, 253, 253, 253, 253, 254, 254,
- 254, 254, 254, 254, 254, 254, 254, 254, 254, 255,
-};
-static void _CalcContrastRamp(FX_LPBYTE ramp, int level)
-{
- int contrast_min = 0, contrast_max = 255 - level, i;
- for (i = 0; i < contrast_min; i ++) {
- ramp[i] = 0;
- }
- for (i = contrast_min; i < contrast_max; i ++) {
- ramp[i] = 255 * (i - contrast_min) / (contrast_max - contrast_min);
- }
- for (i = contrast_max; i < 256; i ++) {
- ramp[i] = 255;
- }
-}
-void CFX_Font::AdjustMMParams(int glyph_index, int dest_width, int weight)
-{
- FXFT_MM_Var pMasters = NULL;
- FXFT_Get_MM_Var(m_Face, &pMasters);
- if (pMasters == NULL) {
- return;
- }
- long coords[2];
- if (weight == 0) {
- coords[0] = FXFT_Get_MM_Axis_Def(FXFT_Get_MM_Axis(pMasters, 0)) / 65536;
- } else {
- coords[0] = weight;
- }
- if (dest_width == 0) {
- coords[1] = FXFT_Get_MM_Axis_Def(FXFT_Get_MM_Axis(pMasters, 1)) / 65536;
- } else {
- int min_param = FXFT_Get_MM_Axis_Min(FXFT_Get_MM_Axis(pMasters, 1)) / 65536;
- int max_param = FXFT_Get_MM_Axis_Max(FXFT_Get_MM_Axis(pMasters, 1)) / 65536;
- coords[1] = min_param;
- int error = FXFT_Set_MM_Design_Coordinates(m_Face, 2, coords);
- error = FXFT_Load_Glyph(m_Face, glyph_index, FXFT_LOAD_NO_SCALE | FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH);
- int min_width = FXFT_Get_Glyph_HoriAdvance(m_Face) * 1000 / FXFT_Get_Face_UnitsPerEM(m_Face);
- coords[1] = max_param;
- error = FXFT_Set_MM_Design_Coordinates(m_Face, 2, coords);
- error = FXFT_Load_Glyph(m_Face, glyph_index, FXFT_LOAD_NO_SCALE | FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH);
- int max_width = FXFT_Get_Glyph_HoriAdvance(m_Face) * 1000 / FXFT_Get_Face_UnitsPerEM(m_Face);
- if (max_width == min_width) {
- return;
- }
- int param = min_param + (max_param - min_param) * (dest_width - min_width) / (max_width - min_width);
- coords[1] = param;
- }
- FXFT_Free(m_Face, pMasters);
- FXFT_Set_MM_Design_Coordinates(m_Face, 2, coords);
-}
-extern const char g_AngleSkew[30] = {
- 0, 2, 3, 5, 7, 9, 11, 12, 14, 16,
- 18, 19, 21, 23, 25, 27, 29, 31, 32, 34,
- 36, 38, 40, 42, 45, 47, 49, 51, 53, 55,
-};
-static const FX_BYTE g_WeightPow[100] = {
- 0, 3, 6, 7, 8, 9, 11, 12, 14, 15, 16, 17, 18, 19, 20,
- 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 35, 36, 36,
- 37, 37, 37, 38, 38, 38, 39, 39, 39, 40, 40, 40, 41, 41, 41, 42, 42, 42,
- 42, 43, 43, 43, 44, 44, 44, 44, 45, 45, 45, 45, 46, 46, 46, 46, 47, 47,
- 47, 47, 48, 48, 48, 48, 48, 49, 49, 49, 49, 50, 50, 50, 50, 50, 51, 51,
- 51, 51, 51, 52, 52, 52, 52, 52, 53, 53, 53, 53, 53,
-};
-extern const FX_BYTE g_WeightPow_11[100] = {
- 0, 4, 7, 8, 9, 10, 12, 13, 15, 17, 18, 19, 20, 21, 22,
- 23, 24, 25, 26, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 39, 39, 40, 40,
- 41, 41, 41, 42, 42, 42, 43, 43, 43, 44, 44, 44, 45, 45, 45, 46, 46, 46,
- 46, 43, 47, 47, 48, 48, 48, 48, 45, 50, 50, 50, 46, 51, 51, 51, 52, 52,
- 52, 52, 53, 53, 53, 53, 53, 54, 54, 54, 54, 55, 55, 55, 55, 55, 56, 56,
- 56, 56, 56, 57, 57, 57, 57, 57, 58, 58, 58, 58, 58,
-};
-extern const FX_BYTE g_WeightPow_SHIFTJIS[100] = {
- 0, 0, 1, 2, 3, 4, 5, 7, 8, 10, 11, 13, 14, 16, 17, 19, 21, 22, 24, 26, 28,
- 30, 32, 33, 35, 37, 39, 41, 43, 45, 48, 48, 48, 48, 49, 49, 49, 50, 50, 50, 50,
- 51, 51, 51, 51, 52, 52, 52, 52, 52, 53, 53, 53, 53, 53, 54, 54, 54, 54, 54, 55, 55,
- 55, 55, 55, 56, 56, 56, 56, 56 , 56, 57, 57, 57 , 57 , 57, 57, 57, 58, 58, 58, 58, 58,
- 58, 58, 59, 59, 59, 59, 59, 59, 59, 60, 60, 60, 60, 60, 60, 60, 60,
-};
-static void _GammaAdjust(FX_LPBYTE pData, int nWid, int nHei, int src_pitch, FX_LPCBYTE gammaTable)
-{
- int count = nHei * src_pitch;
- for(int i = 0; i < count; i++) {
- pData[i] = gammaTable[pData[i]];
- }
-}
-static void _ContrastAdjust(FX_LPBYTE pDataIn, FX_LPBYTE pDataOut, int nWid, int nHei, int nSrcRowBytes, int nDstRowBytes)
-{
- int col, row, temp;
- int max = 0, min = 255;
- FX_FLOAT rate;
- for (row = 0; row < nHei; row ++) {
- FX_LPBYTE pRow = pDataIn + row * nSrcRowBytes;
- for (col = 0; col < nWid; col++) {
- temp = *pRow ++;
- if (temp > max) {
- max = temp;
- }
- if (temp < min) {
- min = temp;
- }
- }
- }
- temp = max - min;
- if (0 == temp || 255 == temp) {
- int rowbytes = FXSYS_abs(nSrcRowBytes) > nDstRowBytes ? nDstRowBytes : FXSYS_abs(nSrcRowBytes);
- for (row = 0; row < nHei; row ++) {
- FXSYS_memcpy32(pDataOut + row * nDstRowBytes, pDataIn + row * nSrcRowBytes, rowbytes);
- }
- return;
- }
- rate = 255.f / temp;
- for (row = 0; row < nHei; row ++) {
- FX_LPBYTE pSrcRow = pDataIn + row * nSrcRowBytes;
- FX_LPBYTE pDstRow = pDataOut + row * nDstRowBytes;
- for (col = 0; col < nWid; col ++) {
- temp = (int)((*(pSrcRow++) - min) * rate + 0.5);
- if (temp > 255) {
- temp = 255;
- } else if (temp < 0) {
- temp = 0;
- }
- *pDstRow ++ = (FX_BYTE)temp;
- }
- }
-}
-CFX_GlyphBitmap* CFX_FaceCache::RenderGlyph(CFX_Font* pFont, FX_DWORD glyph_index, FX_BOOL bFontStyle,
- const CFX_AffineMatrix* pMatrix, int dest_width, int anti_alias)
-{
- if (m_Face == NULL) {
- return NULL;
- }
- FXFT_Matrix ft_matrix;
- ft_matrix.xx = (signed long)(pMatrix->GetA() / 64 * 65536);
- ft_matrix.xy = (signed long)(pMatrix->GetC() / 64 * 65536);
- ft_matrix.yx = (signed long)(pMatrix->GetB() / 64 * 65536);
- ft_matrix.yy = (signed long)(pMatrix->GetD() / 64 * 65536);
- FX_BOOL bUseCJKSubFont = FALSE;
- const CFX_SubstFont* pSubstFont = pFont->GetSubstFont();
- if (pSubstFont) {
- bUseCJKSubFont = pSubstFont->m_bSubstOfCJK && bFontStyle;
- int skew = 0;
- if (bUseCJKSubFont) {
- skew = pSubstFont->m_bItlicCJK ? -15 : 0;
- } else {
- skew = pSubstFont->m_ItalicAngle;
- }
- if (skew) {
- skew = skew <= -30 ? -58 : -g_AngleSkew[-skew];
- if (pFont->IsVertical()) {
- ft_matrix.yx += ft_matrix.yy * skew / 100;
- } else {
- ft_matrix.xy += -ft_matrix.xx * skew / 100;
- }
- }
- if (pSubstFont->m_SubstFlags & FXFONT_SUBST_MM) {
- pFont->AdjustMMParams(glyph_index, dest_width, pFont->GetSubstFont()->m_Weight);
- }
- }
- int transflag = FXFT_Get_Face_Internal_Flag(m_Face);
- FXFT_Set_Transform(m_Face, &ft_matrix, 0);
- int load_flags = (m_Face->face_flags & FT_FACE_FLAG_SFNT) ? FXFT_LOAD_NO_BITMAP : (FXFT_LOAD_NO_BITMAP | FT_LOAD_NO_HINTING);
- int error = FXFT_Load_Glyph(m_Face, glyph_index, load_flags);
- if (error) {
- FXFT_Set_Face_Internal_Flag(m_Face, transflag);
- return NULL;
- }
- int weight = 0;
- if (bUseCJKSubFont) {
- weight = pSubstFont->m_WeightCJK;
- } else {
- weight = pSubstFont ? pSubstFont->m_Weight : 0;
- }
- if (pSubstFont && !(pSubstFont->m_SubstFlags & FXFONT_SUBST_MM) && weight > 400) {
- int index = (weight - 400) / 10;
- if (index >= 100) {
- FXFT_Set_Face_Internal_Flag(m_Face, transflag);
- return NULL;
- }
- int level = 0;
- if (pSubstFont->m_Charset == FXFONT_SHIFTJIS_CHARSET) {
- level = g_WeightPow_SHIFTJIS[index] * 2 * (FXSYS_abs((int)(ft_matrix.xx)) + FXSYS_abs((int)(ft_matrix.xy))) / 36655;
- } else {
- level = g_WeightPow_11[index] * (FXSYS_abs((int)(ft_matrix.xx)) + FXSYS_abs((int)(ft_matrix.xy))) / 36655;
- }
- FXFT_Outline_Embolden(FXFT_Get_Glyph_Outline(m_Face), level);
- }
- FXFT_Library_SetLcdFilter(CFX_GEModule::Get()->GetFontMgr()->m_FTLibrary, FT_LCD_FILTER_DEFAULT);
- error = FXFT_Render_Glyph(m_Face, anti_alias);
- if (error) {
- FXFT_Set_Face_Internal_Flag(m_Face, transflag);
- return NULL;
- }
- int bmwidth = FXFT_Get_Bitmap_Width(FXFT_Get_Glyph_Bitmap(m_Face));
- int bmheight = FXFT_Get_Bitmap_Rows(FXFT_Get_Glyph_Bitmap(m_Face));
- if (bmwidth > 2048 || bmheight > 2048) {
- FXFT_Set_Face_Internal_Flag(m_Face, transflag);
- return NULL;
- }
- int dib_width = bmwidth;
- CFX_GlyphBitmap* pGlyphBitmap = FX_NEW CFX_GlyphBitmap;
- if (!pGlyphBitmap) {
- return NULL;
- }
- pGlyphBitmap->m_Bitmap.Create(dib_width, bmheight,
- anti_alias == FXFT_RENDER_MODE_MONO ? FXDIB_1bppMask : FXDIB_8bppMask);
- pGlyphBitmap->m_Left = FXFT_Get_Glyph_BitmapLeft(m_Face);
- pGlyphBitmap->m_Top = FXFT_Get_Glyph_BitmapTop(m_Face);
- int dest_pitch = pGlyphBitmap->m_Bitmap.GetPitch();
- int src_pitch = FXFT_Get_Bitmap_Pitch(FXFT_Get_Glyph_Bitmap(m_Face));
- FX_BYTE* pDestBuf = pGlyphBitmap->m_Bitmap.GetBuffer();
- FX_BYTE* pSrcBuf = (FX_BYTE*)FXFT_Get_Bitmap_Buffer(FXFT_Get_Glyph_Bitmap(m_Face));
- if (anti_alias != FXFT_RENDER_MODE_MONO && FXFT_Get_Bitmap_PixelMode(FXFT_Get_Glyph_Bitmap(m_Face)) == FXFT_PIXEL_MODE_MONO) {
- int bytes = anti_alias == FXFT_RENDER_MODE_LCD ? 3 : 1;
- for(int i = 0; i < bmheight; i++)
- for(int n = 0; n < bmwidth; n++) {
- FX_BYTE data = (pSrcBuf[i * src_pitch + n / 8] & (0x80 >> (n % 8))) ? 255 : 0;
- for (int b = 0; b < bytes; b ++) {
- pDestBuf[i * dest_pitch + n * bytes + b] = data;
- }
- }
- } else {
- FXSYS_memset32(pDestBuf, 0, dest_pitch * bmheight);
- if (anti_alias == FXFT_RENDER_MODE_MONO && FXFT_Get_Bitmap_PixelMode(FXFT_Get_Glyph_Bitmap(m_Face)) == FXFT_PIXEL_MODE_MONO) {
- int rowbytes = FXSYS_abs(src_pitch) > dest_pitch ? dest_pitch : FXSYS_abs(src_pitch);
- for (int row = 0; row < bmheight; row ++) {
- FXSYS_memcpy32(pDestBuf + row * dest_pitch, pSrcBuf + row * src_pitch, rowbytes);
- }
- } else {
- _ContrastAdjust(pSrcBuf, pDestBuf, bmwidth, bmheight, src_pitch, dest_pitch);
- _GammaAdjust(pDestBuf, bmwidth, bmheight, dest_pitch, CFX_GEModule::Get()->GetTextGammaTable());
- }
- }
- FXFT_Set_Face_Internal_Flag(m_Face, transflag);
- return pGlyphBitmap;
-}
-FX_BOOL _OutputGlyph(void* dib, int x, int y, CFX_Font* pFont,
- int glyph_index, FX_ARGB argb)
-{
- CFX_DIBitmap* pDib = (CFX_DIBitmap*)dib;
- FXFT_Face face = pFont->GetFace();
- int error = FXFT_Load_Glyph(face, glyph_index, FXFT_LOAD_NO_BITMAP);
- if (error) {
- return FALSE;
- }
- error = FXFT_Render_Glyph(face, FXFT_RENDER_MODE_NORMAL);
- if (error) {
- return FALSE;
- }
- int bmwidth = FXFT_Get_Bitmap_Width(FXFT_Get_Glyph_Bitmap(face));
- int bmheight = FXFT_Get_Bitmap_Rows(FXFT_Get_Glyph_Bitmap(face));
- int left = FXFT_Get_Glyph_BitmapLeft(face);
- int top = FXFT_Get_Glyph_BitmapTop(face);
- FX_LPCBYTE src_buf = (FX_LPCBYTE)FXFT_Get_Bitmap_Buffer(FXFT_Get_Glyph_Bitmap(face));
- int src_pitch = FXFT_Get_Bitmap_Pitch(FXFT_Get_Glyph_Bitmap(face));
- CFX_DIBitmap mask;
- mask.Create(bmwidth, bmheight, FXDIB_8bppMask);
- FX_LPBYTE dest_buf = mask.GetBuffer();
- int dest_pitch = mask.GetPitch();
- for (int row = 0; row < bmheight; row ++) {
- FX_LPCBYTE src_scan = src_buf + row * src_pitch;
- FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
- FXSYS_memcpy32(dest_scan, src_scan, dest_pitch);
- }
- pDib->CompositeMask(x + left, y - top, bmwidth, bmheight, &mask, argb, 0, 0);
- return TRUE;
-}
-FX_BOOL OutputText(void* dib, int x, int y, CFX_Font* pFont, double font_size,
- CFX_AffineMatrix* pText_matrix, unsigned short const* text, unsigned long argb)
-{
- if (!pFont) {
- return FALSE;
- }
- FXFT_Face face = pFont->GetFace();
- FXFT_Select_Charmap(pFont->m_Face, FXFT_ENCODING_UNICODE);
- int transflag = FXFT_Get_Face_Internal_Flag(pFont->m_Face);
- if (pText_matrix) {
- FXFT_Matrix ft_matrix;
- ft_matrix.xx = (signed long)(pText_matrix->a / 64 * 65536);
- ft_matrix.xy = (signed long)(pText_matrix->c / 64 * 65536);
- ft_matrix.yx = (signed long)(pText_matrix->b / 64 * 65536);
- ft_matrix.yy = (signed long)(pText_matrix->d / 64 * 65536);
- FXFT_Set_Transform(face, &ft_matrix, 0);
- }
- FX_FLOAT x_pos = 0;
- for (; *text != 0; text ++) {
- FX_WCHAR unicode = *text;
- int glyph_index = FXFT_Get_Char_Index(pFont->m_Face, unicode);
- if (glyph_index <= 0) {
- continue;
- }
- int err = FXFT_Load_Glyph(pFont->m_Face, glyph_index, FXFT_LOAD_NO_SCALE | FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH);
- if (err) {
- continue;
- }
- int w = FXFT_Get_Glyph_HoriAdvance(pFont->m_Face);
- int em = FXFT_Get_Face_UnitsPerEM(pFont->m_Face);
- FX_FLOAT x1, y1;
- pText_matrix->Transform(x_pos, 0, x1, y1);
- _OutputGlyph(dib, (int)x1 + x, (int) - y1 + y, pFont,
- glyph_index, argb);
- x_pos += (FX_FLOAT)w / em;
- }
- FXFT_Set_Face_Internal_Flag(pFont->m_Face, transflag);
- return TRUE;
-}
-FX_BOOL OutputGlyph(void* dib, int x, int y, CFX_Font* pFont, double font_size,
- CFX_AffineMatrix* pMatrix, unsigned long glyph_index, unsigned long argb)
-{
- FXFT_Matrix ft_matrix;
- if (pMatrix) {
- ft_matrix.xx = (signed long)(pMatrix->a * font_size / 64 * 65536);
- ft_matrix.xy = (signed long)(pMatrix->c * font_size / 64 * 65536);
- ft_matrix.yx = (signed long)(pMatrix->b * font_size / 64 * 65536);
- ft_matrix.yy = (signed long)(pMatrix->d * font_size / 64 * 65536);
- } else {
- ft_matrix.xx = (signed long)(font_size / 64 * 65536);
- ft_matrix.xy = ft_matrix.yx = 0;
- ft_matrix.yy = (signed long)(font_size / 64 * 65536);
- }
- int transflag = FXFT_Get_Face_Internal_Flag(pFont->m_Face);
- FXFT_Set_Transform(pFont->m_Face, &ft_matrix, 0);
- FX_BOOL ret = _OutputGlyph(dib, x, y, pFont,
- glyph_index, argb);
- FXFT_Set_Face_Internal_Flag(pFont->m_Face, transflag);
- return ret;
-}
-const CFX_PathData* CFX_FaceCache::LoadGlyphPath(CFX_Font* pFont, FX_DWORD glyph_index, int dest_width)
-{
- if (m_Face == NULL || glyph_index == (FX_DWORD) - 1) {
- return NULL;
- }
- CFX_PathData* pGlyphPath = NULL;
- FX_LPVOID key;
- if (pFont->GetSubstFont())
- key = (FX_LPVOID)(FX_UINTPTR)(glyph_index + ((pFont->GetSubstFont()->m_Weight / 16) << 15) +
- ((pFont->GetSubstFont()->m_ItalicAngle / 2) << 21) + ((dest_width / 16) << 25) +
- (pFont->IsVertical() << 31));
- else {
- key = (FX_LPVOID)(FX_UINTPTR)glyph_index;
- }
- if (m_PathMap.Lookup(key, (FX_LPVOID&)pGlyphPath)) {
- return pGlyphPath;
- }
- pGlyphPath = pFont->LoadGlyphPath(glyph_index, dest_width);
- m_PathMap.SetAt(key, pGlyphPath);
- return pGlyphPath;
-}
-typedef struct {
- FX_BOOL m_bCount;
- int m_PointCount;
- FX_PATHPOINT* m_pPoints;
- int m_CurX;
- int m_CurY;
- FX_FLOAT m_CoordUnit;
-} OUTLINE_PARAMS;
-void _Outline_CheckEmptyContour(OUTLINE_PARAMS* param)
-{
- if (param->m_PointCount >= 2 && param->m_pPoints[param->m_PointCount - 2].m_Flag == FXPT_MOVETO &&
- param->m_pPoints[param->m_PointCount - 2].m_PointX == param->m_pPoints[param->m_PointCount - 1].m_PointX &&
- param->m_pPoints[param->m_PointCount - 2].m_PointY == param->m_pPoints[param->m_PointCount - 1].m_PointY) {
- param->m_PointCount -= 2;
- }
- if (param->m_PointCount >= 4 && param->m_pPoints[param->m_PointCount - 4].m_Flag == FXPT_MOVETO &&
- param->m_pPoints[param->m_PointCount - 3].m_Flag == FXPT_BEZIERTO &&
- param->m_pPoints[param->m_PointCount - 3].m_PointX == param->m_pPoints[param->m_PointCount - 4].m_PointX &&
- param->m_pPoints[param->m_PointCount - 3].m_PointY == param->m_pPoints[param->m_PointCount - 4].m_PointY &&
- param->m_pPoints[param->m_PointCount - 2].m_PointX == param->m_pPoints[param->m_PointCount - 4].m_PointX &&
- param->m_pPoints[param->m_PointCount - 2].m_PointY == param->m_pPoints[param->m_PointCount - 4].m_PointY &&
- param->m_pPoints[param->m_PointCount - 1].m_PointX == param->m_pPoints[param->m_PointCount - 4].m_PointX &&
- param->m_pPoints[param->m_PointCount - 1].m_PointY == param->m_pPoints[param->m_PointCount - 4].m_PointY) {
- param->m_PointCount -= 4;
- }
-}
-extern "C" {
- static int _Outline_MoveTo(const FXFT_Vector* to, void* user)
- {
- OUTLINE_PARAMS* param = (OUTLINE_PARAMS*)user;
- if (!param->m_bCount) {
- _Outline_CheckEmptyContour(param);
- param->m_pPoints[param->m_PointCount].m_PointX = to->x / param->m_CoordUnit;
- param->m_pPoints[param->m_PointCount].m_PointY = to->y / param->m_CoordUnit;
- param->m_pPoints[param->m_PointCount].m_Flag = FXPT_MOVETO;
- param->m_CurX = to->x;
- param->m_CurY = to->y;
- if (param->m_PointCount) {
- param->m_pPoints[param->m_PointCount - 1].m_Flag |= FXPT_CLOSEFIGURE;
- }
- }
- param->m_PointCount ++;
- return 0;
- }
-};
-extern "C" {
- static int _Outline_LineTo(const FXFT_Vector* to, void* user)
- {
- OUTLINE_PARAMS* param = (OUTLINE_PARAMS*)user;
- if (!param->m_bCount) {
- param->m_pPoints[param->m_PointCount].m_PointX = to->x / param->m_CoordUnit;
- param->m_pPoints[param->m_PointCount].m_PointY = to->y / param->m_CoordUnit;
- param->m_pPoints[param->m_PointCount].m_Flag = FXPT_LINETO;
- param->m_CurX = to->x;
- param->m_CurY = to->y;
- }
- param->m_PointCount ++;
- return 0;
- }
-};
-extern "C" {
- static int _Outline_ConicTo(const FXFT_Vector* control, const FXFT_Vector* to, void* user)
- {
- OUTLINE_PARAMS* param = (OUTLINE_PARAMS*)user;
- if (!param->m_bCount) {
- param->m_pPoints[param->m_PointCount].m_PointX = (param->m_CurX + (control->x - param->m_CurX) * 2 / 3) / param->m_CoordUnit;
- param->m_pPoints[param->m_PointCount].m_PointY = (param->m_CurY + (control->y - param->m_CurY) * 2 / 3) / param->m_CoordUnit;
- param->m_pPoints[param->m_PointCount].m_Flag = FXPT_BEZIERTO;
- param->m_pPoints[param->m_PointCount + 1].m_PointX = (control->x + (to->x - control->x) / 3) / param->m_CoordUnit;
- param->m_pPoints[param->m_PointCount + 1].m_PointY = (control->y + (to->y - control->y) / 3) / param->m_CoordUnit;
- param->m_pPoints[param->m_PointCount + 1].m_Flag = FXPT_BEZIERTO;
- param->m_pPoints[param->m_PointCount + 2].m_PointX = to->x / param->m_CoordUnit;
- param->m_pPoints[param->m_PointCount + 2].m_PointY = to->y / param->m_CoordUnit;
- param->m_pPoints[param->m_PointCount + 2].m_Flag = FXPT_BEZIERTO;
- param->m_CurX = to->x;
- param->m_CurY = to->y;
- }
- param->m_PointCount += 3;
- return 0;
- }
-};
-extern "C" {
- static int _Outline_CubicTo(const FXFT_Vector* control1, const FXFT_Vector* control2, const FXFT_Vector* to, void* user)
- {
- OUTLINE_PARAMS* param = (OUTLINE_PARAMS*)user;
- if (!param->m_bCount) {
- param->m_pPoints[param->m_PointCount].m_PointX = control1->x / param->m_CoordUnit;
- param->m_pPoints[param->m_PointCount].m_PointY = control1->y / param->m_CoordUnit;
- param->m_pPoints[param->m_PointCount].m_Flag = FXPT_BEZIERTO;
- param->m_pPoints[param->m_PointCount + 1].m_PointX = control2->x / param->m_CoordUnit;
- param->m_pPoints[param->m_PointCount + 1].m_PointY = control2->y / param->m_CoordUnit;
- param->m_pPoints[param->m_PointCount + 1].m_Flag = FXPT_BEZIERTO;
- param->m_pPoints[param->m_PointCount + 2].m_PointX = to->x / param->m_CoordUnit;
- param->m_pPoints[param->m_PointCount + 2].m_PointY = to->y / param->m_CoordUnit;
- param->m_pPoints[param->m_PointCount + 2].m_Flag = FXPT_BEZIERTO;
- param->m_CurX = to->x;
- param->m_CurY = to->y;
- }
- param->m_PointCount += 3;
- return 0;
- }
-};
-CFX_PathData* CFX_Font::LoadGlyphPath(FX_DWORD glyph_index, int dest_width)
-{
- if (m_Face == NULL) {
- return NULL;
- }
- FXFT_Set_Pixel_Sizes(m_Face, 0, 64);
- FXFT_Matrix ft_matrix = {65536, 0, 0, 65536};
- if (m_pSubstFont) {
- if (m_pSubstFont->m_ItalicAngle) {
- int skew = m_pSubstFont->m_ItalicAngle;
- skew = skew <= -30 ? -58 : -g_AngleSkew[-skew];
- if (m_bVertical) {
- ft_matrix.yx += ft_matrix.yy * skew / 100;
- } else {
- ft_matrix.xy += -ft_matrix.xx * skew / 100;
- }
- }
- if (m_pSubstFont->m_SubstFlags & FXFONT_SUBST_MM) {
- AdjustMMParams(glyph_index, dest_width, m_pSubstFont->m_Weight);
- }
- }
- int transflag = FXFT_Get_Face_Internal_Flag(m_Face);
- FXFT_Set_Transform(m_Face, &ft_matrix, 0);
- int load_flags = (m_Face->face_flags & FT_FACE_FLAG_SFNT) ? FXFT_LOAD_NO_BITMAP : FXFT_LOAD_NO_BITMAP | FT_LOAD_NO_HINTING;
- int error = FXFT_Load_Glyph(m_Face, glyph_index, load_flags);
- if (error) {
- FXFT_Set_Face_Internal_Flag(m_Face, transflag);
- return NULL;
- }
- if (m_pSubstFont && !(m_pSubstFont->m_SubstFlags & FXFONT_SUBST_MM) && m_pSubstFont->m_Weight > 400) {
- int level = 0;
- if (m_pSubstFont->m_Charset == FXFONT_SHIFTJIS_CHARSET) {
- level = g_WeightPow_SHIFTJIS[(m_pSubstFont->m_Weight - 400) / 10] * 2 * 65536 / 36655;
- } else {
- level = g_WeightPow[(m_pSubstFont->m_Weight - 400) / 10] * 2;
- }
- FXFT_Outline_Embolden(FXFT_Get_Glyph_Outline(m_Face), level);
- }
- FXFT_Outline_Funcs funcs;
- funcs.move_to = _Outline_MoveTo;
- funcs.line_to = _Outline_LineTo;
- funcs.conic_to = _Outline_ConicTo;
- funcs.cubic_to = _Outline_CubicTo;
- funcs.shift = 0;
- funcs.delta = 0;
- OUTLINE_PARAMS params;
- params.m_bCount = TRUE;
- params.m_PointCount = 0;
- FXFT_Outline_Decompose(FXFT_Get_Glyph_Outline(m_Face), &funcs, &params);
- if (params.m_PointCount == 0) {
- FXFT_Set_Face_Internal_Flag(m_Face, transflag);
- return NULL;
- }
- CFX_PathData* pPath = FX_NEW CFX_PathData;
- if (!pPath) {
- return NULL;
- }
- pPath->SetPointCount(params.m_PointCount);
- params.m_bCount = FALSE;
- params.m_PointCount = 0;
- params.m_pPoints = pPath->GetPoints();
- params.m_CurX = params.m_CurY = 0;
- params.m_CoordUnit = 64 * 64.0;
- FXFT_Outline_Decompose(FXFT_Get_Glyph_Outline(m_Face), &funcs, &params);
- _Outline_CheckEmptyContour(&params);
- pPath->TrimPoints(params.m_PointCount);
- if (params.m_PointCount) {
- pPath->GetPoints()[params.m_PointCount - 1].m_Flag |= FXPT_CLOSEFIGURE;
- }
- FXFT_Set_Face_Internal_Flag(m_Face, transflag);
- return pPath;
-}
-void _CFX_UniqueKeyGen::Generate(int count, ...)
-{
- va_list argList;
- va_start(argList, count);
- for (int i = 0; i < count; i ++) {
- int p = va_arg(argList, int);
- ((FX_DWORD*)m_Key)[i] = p;
- }
- va_end(argList);
- m_KeyLen = count * sizeof(FX_DWORD);
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxge/fx_ge.h"
+#include "../../../include/fxge/fx_freetype.h"
+#include "../../../include/fxcodec/fx_codec.h"
+#include "text_int.h"
+#undef FX_GAMMA
+#undef FX_GAMMA_INVERSE
+#define FX_GAMMA(value) (value)
+#define FX_GAMMA_INVERSE(value) (value)
+FX_RECT FXGE_GetGlyphsBBox(FXTEXT_GLYPHPOS* pGlyphAndPos, int nChars, int anti_alias, FX_FLOAT retinaScaleX, FX_FLOAT retinaScaleY)
+{
+ FX_RECT rect(0, 0, 0, 0);
+ FX_BOOL bStarted = FALSE;
+ for (int iChar = 0; iChar < nChars; iChar ++) {
+ FXTEXT_GLYPHPOS& glyph = pGlyphAndPos[iChar];
+ const CFX_GlyphBitmap* pGlyph = glyph.m_pGlyph;
+ if (pGlyph == NULL) {
+ continue;
+ }
+ int char_left = glyph.m_OriginX + pGlyph->m_Left;
+ int char_width = (int)(pGlyph->m_Bitmap.GetWidth() / retinaScaleX);
+ if (anti_alias == FXFT_RENDER_MODE_LCD) {
+ char_width /= 3;
+ }
+ int char_right = char_left + char_width;
+ int char_top = glyph.m_OriginY - pGlyph->m_Top;
+ int char_bottom = char_top + (int)(pGlyph->m_Bitmap.GetHeight() / retinaScaleY);
+ if (!bStarted) {
+ rect.left = char_left;
+ rect.right = char_right;
+ rect.top = char_top;
+ rect.bottom = char_bottom;
+ bStarted = TRUE;
+ } else {
+ if (rect.left > char_left) {
+ rect.left = char_left;
+ }
+ if (rect.right < char_right) {
+ rect.right = char_right;
+ }
+ if (rect.top > char_top) {
+ rect.top = char_top;
+ }
+ if (rect.bottom < char_bottom) {
+ rect.bottom = char_bottom;
+ }
+ }
+ }
+ return rect;
+}
+static void _AdjustGlyphSpace(FXTEXT_GLYPHPOS* pGlyphAndPos, int nChars)
+{
+ ASSERT(nChars > 1);
+ FX_BOOL bVertical = FALSE;
+ if (pGlyphAndPos[nChars - 1].m_OriginX == pGlyphAndPos[0].m_OriginX) {
+ bVertical = TRUE;
+ } else if (pGlyphAndPos[nChars - 1].m_OriginY != pGlyphAndPos[0].m_OriginY) {
+ return;
+ }
+ int i = nChars - 1;
+ int* next_origin = bVertical ? &pGlyphAndPos[i].m_OriginY : &pGlyphAndPos[i].m_OriginX;
+ FX_FLOAT next_origin_f = bVertical ? pGlyphAndPos[i].m_fOriginY : pGlyphAndPos[i].m_fOriginX;
+ for (i --; i > 0; i --) {
+ int* this_origin = bVertical ? &pGlyphAndPos[i].m_OriginY : &pGlyphAndPos[i].m_OriginX;
+ FX_FLOAT this_origin_f = bVertical ? pGlyphAndPos[i].m_fOriginY : pGlyphAndPos[i].m_fOriginX;
+ int space = (*next_origin) - (*this_origin);
+ FX_FLOAT space_f = next_origin_f - this_origin_f;
+ FX_FLOAT error = (FX_FLOAT)(FXSYS_fabs(space_f) - FXSYS_fabs((FX_FLOAT)(space)));
+ if (error > 0.5f) {
+ *this_origin += space > 0 ? -1 : 1;
+ }
+ next_origin = this_origin;
+ next_origin_f = this_origin_f;
+ }
+}
+static const FX_BYTE g_GdipGamma_bgw[9] = {0, 0, 63, 120, 0, 168, 210, 239, 255};
+static const FX_BYTE g_GdipGamma_fgw[9] = {0, 0, 16, 45, 0, 87, 135, 192, 255};
+static const FX_BYTE g_GdipGammaAdjust_47[48] = {
+ 0, 30, 33, 34, 35, 36, 37, 38, 38, 39, 39, 40, 40, 40, 41, 41, 41, 42, 42, 42, 42, 43,
+ 43, 43, 43, 43, 44, 44, 44, 44, 44, 44, 45, 45, 45, 45, 45, 45, 45, 46,
+ 46, 46, 46, 46, 46, 46, 46, 47
+};
+static const FX_BYTE g_GdipGammaAdjust_75[76] = {
+ 0, 46, 50, 52, 54, 55, 56, 57, 58, 59, 60, 60, 61, 61, 62, 62, 63, 63, 64, 64, 64, 65,
+ 65, 65, 66, 66, 66, 67, 67, 67, 67, 68, 68, 68, 68, 68, 69, 69, 69, 69, 69, 70, 70, 70,
+ 70, 70, 71, 71, 71, 71, 71, 71, 72, 72, 72, 72, 72, 72, 72, 73, 73, 73, 73, 73, 73, 73,
+ 73, 74, 74, 74, 74, 74, 74, 74, 74, 75
+};
+static const FX_BYTE g_GdipGammaAdjust_81[82] = {
+ 0, 49, 53, 56, 58, 59, 60, 61, 62, 63, 64, 65, 65, 66, 66, 67, 67, 68, 68, 69, 69, 69, 70, 70, 70,
+ 71, 71, 71, 72, 72, 72, 72, 73, 73, 73, 73, 74, 74, 74, 74, 74, 75, 75, 75, 75, 75, 76, 76, 76, 76,
+ 76, 76, 77, 77, 77, 77, 77, 77, 78, 78, 78, 78, 78, 78, 78, 79, 79, 79, 79, 79, 79, 79, 79, 80,
+ 80, 80, 80, 80, 80, 80, 80, 81
+};
+static void _Adjust_alpha(int background, int foreground, int& src_alpha, int text_flags, int a)
+{
+}
+static const FX_BYTE g_TextGammaAdjust[256] = {
+ 0, 2, 3, 4, 6, 7, 8, 10, 11, 12, 13, 15, 16, 17, 18, 19,
+ 21, 22, 23, 24, 25, 26, 27, 29, 30, 31, 32, 33, 34, 35, 36, 38,
+ 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 51, 52, 53, 54, 55,
+ 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 71, 72,
+ 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
+ 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104,
+ 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120,
+ 121, 122, 123, 124, 125, 126, 127, 128, 129, 129, 130, 131, 132, 133, 134, 135,
+ 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151,
+ 152, 153, 154, 155, 156, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166,
+ 167, 168, 169, 170, 171, 172, 173, 174, 174, 175, 176, 177, 178, 179, 180, 181,
+ 182, 183, 184, 185, 186, 187, 188, 189, 190, 190, 191, 192, 193, 194, 195, 196,
+ 197, 198, 199, 200, 201, 202, 203, 204, 204, 205, 206, 207, 208, 209, 210, 211,
+ 212, 213, 214, 215, 216, 217, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226,
+ 227, 228, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 239, 240,
+ 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 250, 251, 252, 253, 254, 255,
+};
+#define ADJUST_ALPHA(background, foreground, src_alpha, text_flags, a) \
+ src_alpha = g_TextGammaAdjust[(FX_BYTE)src_alpha];
+void _Color2Argb(FX_ARGB& argb, FX_DWORD color, int alpha_flag, void* pIccTransform)
+{
+ if (pIccTransform == NULL && !FXGETFLAG_COLORTYPE(alpha_flag)) {
+ argb = color;
+ return;
+ }
+ if (!CFX_GEModule::Get()->GetCodecModule() || !CFX_GEModule::Get()->GetCodecModule()->GetIccModule()) {
+ pIccTransform = NULL;
+ }
+ FX_BYTE bgra[4];
+ if (pIccTransform) {
+ ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ color = FXGETFLAG_COLORTYPE(alpha_flag) ? FXCMYK_TODIB(color) : FXARGB_TODIB(color);
+ pIccModule->TranslateScanline(pIccTransform, bgra, (FX_LPCBYTE)&color, 1);
+ bgra[3] = FXGETFLAG_COLORTYPE(alpha_flag) ?
+ (alpha_flag >> 24) ? FXGETFLAG_ALPHA_FILL(alpha_flag) : FXGETFLAG_ALPHA_STROKE(alpha_flag) :
+ FXARGB_A(color);
+ argb = FXARGB_MAKE(bgra[3], bgra[2], bgra[1], bgra[0]);
+ return;
+ }
+ AdobeCMYK_to_sRGB1(FXSYS_GetCValue(color), FXSYS_GetMValue(color),
+ FXSYS_GetYValue(color), FXSYS_GetKValue(color),
+ bgra[2], bgra[1], bgra[0]);
+ bgra[3] = (alpha_flag >> 24) ? FXGETFLAG_ALPHA_FILL(alpha_flag) : FXGETFLAG_ALPHA_STROKE(alpha_flag);
+ argb = FXARGB_MAKE(bgra[3], bgra[2], bgra[1], bgra[0]);
+}
+FX_BOOL CFX_RenderDevice::DrawNormalText(int nChars, const FXTEXT_CHARPOS* pCharPos,
+ CFX_Font* pFont, CFX_FontCache* pCache,
+ FX_FLOAT font_size, const CFX_AffineMatrix* pText2Device,
+ FX_DWORD fill_color, FX_DWORD text_flags,
+ int alpha_flag, void* pIccTransform)
+{
+ int nativetext_flags = text_flags;
+ if (m_DeviceClass != FXDC_DISPLAY) {
+ if (!(text_flags & FXTEXT_PRINTGRAPHICTEXT)) {
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+ if (!(text_flags & FXFONT_CIDFONT) && pFont->GetPsName().Find(CFX_WideString::FromLocal("+ZJHL")) == -1)
+#ifdef FOXIT_CHROME_BUILD
+ if (pFont->GetPsName() != CFX_WideString::FromLocal("CNAAJI+cmex10"))
+#endif
+#endif
+ if (m_pDeviceDriver->DrawDeviceText(nChars, pCharPos, pFont, pCache, pText2Device, font_size, fill_color, alpha_flag, pIccTransform)) {
+ return TRUE;
+ }
+ }
+ int alpha = FXGETFLAG_COLORTYPE(alpha_flag) ? FXGETFLAG_ALPHA_FILL(alpha_flag) : FXARGB_A(fill_color);
+ if (alpha < 255) {
+ return FALSE;
+ }
+ } else if (!(text_flags & FXTEXT_NO_NATIVETEXT)) {
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+ if (!(text_flags & FXFONT_CIDFONT))
+#ifdef FOXIT_CHROME_BUILD
+ if (pFont->GetPsName() != CFX_WideString::FromLocal("CNAAJI+cmex10"))
+#endif
+#endif
+ if (m_pDeviceDriver->DrawDeviceText(nChars, pCharPos, pFont, pCache, pText2Device, font_size, fill_color, alpha_flag, pIccTransform)) {
+ return TRUE;
+ }
+ }
+ CFX_AffineMatrix char2device, deviceCtm, text2Device;
+ if (pText2Device) {
+ char2device = *pText2Device;
+ text2Device = *pText2Device;
+ }
+ char2device.Scale(font_size, -font_size);
+ if (FXSYS_fabs(char2device.a) + FXSYS_fabs(char2device.b) > 50 * 1.0f ||
+ ((m_DeviceClass == FXDC_PRINTER && !m_pDeviceDriver->IsPSPrintDriver())
+ && !(text_flags & FXTEXT_PRINTIMAGETEXT))) {
+ if (pFont->GetFace() != NULL || (pFont->GetSubstFont()->m_SubstFlags & FXFONT_SUBST_GLYPHPATH)) {
+ int nPathFlags = (text_flags & FXTEXT_NOSMOOTH) == 0 ? 0 : FXFILL_NOPATHSMOOTH;
+ return DrawTextPath(nChars, pCharPos, pFont, pCache, font_size, pText2Device, NULL, NULL, fill_color, 0, NULL, nPathFlags, alpha_flag, pIccTransform);
+ }
+ }
+ int anti_alias = FXFT_RENDER_MODE_MONO;
+ FX_BOOL bNormal = FALSE;
+ if ((text_flags & FXTEXT_NOSMOOTH) == 0) {
+ if (m_DeviceClass == FXDC_DISPLAY && m_bpp > 1) {
+ FX_BOOL bClearType;
+ if (pFont->GetFace() == NULL && !(pFont->GetSubstFont()->m_SubstFlags & FXFONT_SUBST_CLEARTYPE)) {
+ bClearType = FALSE;
+ } else {
+ bClearType = text_flags & FXTEXT_CLEARTYPE;
+ }
+ if ((m_RenderCaps & (FXRC_ALPHA_OUTPUT | FXRC_CMYK_OUTPUT))) {
+ anti_alias = FXFT_RENDER_MODE_LCD;
+ bNormal = TRUE;
+ } else if (m_bpp < 16) {
+ anti_alias = FXFT_RENDER_MODE_NORMAL;
+ } else {
+ if (bClearType == FALSE) {
+ anti_alias = FXFT_RENDER_MODE_LCD;
+ bNormal = TRUE;
+ } else {
+ anti_alias = FXFT_RENDER_MODE_LCD;
+ }
+ }
+ }
+ }
+ if (pCache == NULL) {
+ pCache = CFX_GEModule::Get()->GetFontCache();
+ }
+ CFX_FaceCache* pFaceCache = pCache->GetCachedFace(pFont);
+ FX_FONTCACHE_DEFINE(pCache, pFont);
+ FXTEXT_GLYPHPOS* pGlyphAndPos = FX_Alloc(FXTEXT_GLYPHPOS, nChars);
+ if (!pGlyphAndPos) {
+ return FALSE;
+ }
+ int iChar;
+ deviceCtm = char2device;
+ CFX_AffineMatrix matrixCTM = GetCTM();
+ FX_FLOAT scale_x = FXSYS_fabs(matrixCTM.a);
+ FX_FLOAT scale_y = FXSYS_fabs(matrixCTM.d);
+ deviceCtm.Concat(scale_x, 0, 0, scale_y, 0, 0);
+ text2Device.Concat(scale_x, 0, 0, scale_y, 0, 0);
+ for (iChar = 0; iChar < nChars; iChar ++) {
+ FXTEXT_GLYPHPOS& glyph = pGlyphAndPos[iChar];
+ const FXTEXT_CHARPOS& charpos = pCharPos[iChar];
+ glyph.m_fOriginX = charpos.m_OriginX;
+ glyph.m_fOriginY = charpos.m_OriginY;
+ text2Device.Transform(glyph.m_fOriginX, glyph.m_fOriginY);
+ if (anti_alias < FXFT_RENDER_MODE_LCD) {
+ glyph.m_OriginX = FXSYS_round(glyph.m_fOriginX);
+ } else {
+ glyph.m_OriginX = (int)FXSYS_floor(glyph.m_fOriginX);
+ }
+ glyph.m_OriginY = FXSYS_round(glyph.m_fOriginY);
+ if (charpos.m_bGlyphAdjust) {
+ CFX_AffineMatrix new_matrix(charpos.m_AdjustMatrix[0], charpos.m_AdjustMatrix[1],
+ charpos.m_AdjustMatrix[2], charpos.m_AdjustMatrix[3], 0, 0);
+ new_matrix.Concat(deviceCtm);
+ glyph.m_pGlyph = pFaceCache->LoadGlyphBitmap(pFont, charpos.m_GlyphIndex, charpos.m_bFontStyle, &new_matrix,
+ charpos.m_FontCharWidth, anti_alias, nativetext_flags);
+ } else
+ glyph.m_pGlyph = pFaceCache->LoadGlyphBitmap(pFont, charpos.m_GlyphIndex, charpos.m_bFontStyle, &deviceCtm,
+ charpos.m_FontCharWidth, anti_alias, nativetext_flags);
+ }
+ if (anti_alias < FXFT_RENDER_MODE_LCD && nChars > 1) {
+ _AdjustGlyphSpace(pGlyphAndPos, nChars);
+ }
+ FX_RECT bmp_rect1 = FXGE_GetGlyphsBBox(pGlyphAndPos, nChars, anti_alias);
+ if (scale_x > 1 && scale_y > 1) {
+ bmp_rect1.left--;
+ bmp_rect1.top --;
+ bmp_rect1.right ++;
+ bmp_rect1.bottom ++;
+ }
+ FX_RECT bmp_rect(FXSYS_round((FX_FLOAT)(bmp_rect1.left) / scale_x), FXSYS_round((FX_FLOAT)(bmp_rect1.top) / scale_y),
+ FXSYS_round((FX_FLOAT)bmp_rect1.right / scale_x), FXSYS_round((FX_FLOAT)bmp_rect1.bottom / scale_y));
+ bmp_rect.Intersect(m_ClipBox);
+ if (bmp_rect.IsEmpty()) {
+ FX_Free(pGlyphAndPos);
+ return TRUE;
+ }
+ int pixel_width = FXSYS_round(bmp_rect.Width() * scale_x);
+ int pixel_height = FXSYS_round(bmp_rect.Height() * scale_y);
+ int pixel_left = FXSYS_round(bmp_rect.left * scale_x);
+ int pixel_top = FXSYS_round(bmp_rect.top * scale_y);
+ if (anti_alias == FXFT_RENDER_MODE_MONO) {
+ CFX_DIBitmap bitmap;
+ if (!bitmap.Create(pixel_width, pixel_height, FXDIB_1bppMask)) {
+ FX_Free(pGlyphAndPos);
+ return FALSE;
+ }
+ bitmap.Clear(0);
+ for (iChar = 0; iChar < nChars; iChar ++) {
+ FXTEXT_GLYPHPOS& glyph = pGlyphAndPos[iChar];
+ if (glyph.m_pGlyph == NULL) {
+ continue;
+ }
+ const CFX_DIBitmap* pGlyph = &glyph.m_pGlyph->m_Bitmap;
+ bitmap.TransferBitmap(glyph.m_OriginX + glyph.m_pGlyph->m_Left - pixel_left,
+ glyph.m_OriginY - glyph.m_pGlyph->m_Top - pixel_top,
+ pGlyph->GetWidth(), pGlyph->GetHeight(), pGlyph, 0, 0);
+ }
+ FX_Free(pGlyphAndPos);
+ return SetBitMask(&bitmap, bmp_rect.left, bmp_rect.top, fill_color);
+ }
+ CFX_DIBitmap bitmap;
+ if (m_bpp == 8) {
+ if (!bitmap.Create(pixel_width, pixel_height, FXDIB_8bppMask)) {
+ FX_Free(pGlyphAndPos);
+ return FALSE;
+ }
+ } else {
+ if (!CreateCompatibleBitmap(&bitmap, pixel_width, pixel_height)) {
+ FX_Free(pGlyphAndPos);
+ return FALSE;
+ }
+ }
+ if (!bitmap.HasAlpha() && !bitmap.IsAlphaMask()) {
+ bitmap.Clear(0xFFFFFFFF);
+ if (!GetDIBits(&bitmap, bmp_rect.left, bmp_rect.top)) {
+ FX_Free(pGlyphAndPos);
+ return FALSE;
+ }
+ } else {
+ bitmap.Clear(0);
+ if (bitmap.m_pAlphaMask) {
+ bitmap.m_pAlphaMask->Clear(0);
+ }
+ }
+ int dest_width = pixel_width;
+ FX_LPBYTE dest_buf = bitmap.GetBuffer();
+ int dest_pitch = bitmap.GetPitch();
+ int Bpp = bitmap.GetBPP() / 8;
+ int a, r, g, b;
+ if (anti_alias == FXFT_RENDER_MODE_LCD) {
+ _Color2Argb(fill_color, fill_color, alpha_flag | (1 << 24), pIccTransform);
+ ArgbDecode(fill_color, a, r, g, b);
+ r = FX_GAMMA(r);
+ g = FX_GAMMA(g);
+ b = FX_GAMMA(b);
+ }
+ for (iChar = 0; iChar < nChars; iChar ++) {
+ FXTEXT_GLYPHPOS& glyph = pGlyphAndPos[iChar];
+ if (glyph.m_pGlyph == NULL) {
+ continue;
+ }
+ const CFX_DIBitmap* pGlyph = &glyph.m_pGlyph->m_Bitmap;
+ int left = glyph.m_OriginX + glyph.m_pGlyph->m_Left - pixel_left;
+ int top = glyph.m_OriginY - glyph.m_pGlyph->m_Top - pixel_top;
+ int ncols = pGlyph->GetWidth();
+ int nrows = pGlyph->GetHeight();
+ if (anti_alias == FXFT_RENDER_MODE_NORMAL) {
+ if (!bitmap.CompositeMask(left, top, ncols, nrows, pGlyph, fill_color,
+ 0, 0, FXDIB_BLEND_NORMAL, NULL, FALSE, alpha_flag, pIccTransform)) {
+ FX_Free(pGlyphAndPos);
+ return FALSE;
+ }
+ continue;
+ }
+ FX_BOOL bBGRStripe = text_flags & FXTEXT_BGR_STRIPE;
+ ncols /= 3;
+ int x_subpixel = (int)(glyph.m_fOriginX * 3) % 3;
+ FX_LPBYTE src_buf = pGlyph->GetBuffer();
+ int src_pitch = pGlyph->GetPitch();
+ int start_col = left;
+ if (start_col < 0) {
+ start_col = 0;
+ }
+ int end_col = left + ncols;
+ if (end_col > dest_width) {
+ end_col = dest_width;
+ }
+ if (start_col >= end_col) {
+ continue;
+ }
+ if (bitmap.GetFormat() == FXDIB_Argb) {
+ for (int row = 0; row < nrows; row ++) {
+ int dest_row = row + top;
+ if (dest_row < 0 || dest_row >= bitmap.GetHeight()) {
+ continue;
+ }
+ FX_LPBYTE src_scan = src_buf + row * src_pitch + (start_col - left) * 3;
+ FX_LPBYTE dest_scan = dest_buf + dest_row * dest_pitch + (start_col << 2);
+ if (bBGRStripe) {
+ if (x_subpixel == 0) {
+ for (int col = start_col; col < end_col; col ++) {
+ int src_alpha = src_scan[2];
+ src_alpha = src_alpha * a / 255;
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
+ src_alpha = src_scan[1];
+ src_alpha = src_alpha * a / 255;
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
+ src_alpha = src_scan[0];
+ src_alpha = src_alpha * a / 255;
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
+ dest_scan[3] = 255;
+ dest_scan += 4;
+ src_scan += 3;
+ }
+ } else if (x_subpixel == 1) {
+ int src_alpha = src_scan[1];
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
+ src_alpha = src_scan[0];
+ ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
+ if (start_col > left) {
+ src_alpha = src_scan[-1];
+ ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
+ }
+ dest_scan[3] = 255;
+ dest_scan += 4;
+ src_scan += 3;
+ for (int col = start_col + 1; col < end_col - 1; col ++) {
+ int src_alpha = src_scan[1];
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
+ src_alpha = src_scan[0];
+ ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
+ src_alpha = src_scan[-1];
+ ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
+ dest_scan[3] = 255;
+ dest_scan += 4;
+ src_scan += 3;
+ }
+ } else {
+ int src_alpha = src_scan[0];
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
+ if (start_col > left) {
+ src_alpha = src_scan[-1];
+ ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
+ src_alpha = src_scan[-2];
+ ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
+ }
+ dest_scan[3] = 255;
+ dest_scan += 4;
+ src_scan += 3;
+ for (int col = start_col + 1; col < end_col - 1; col ++) {
+ int src_alpha = src_scan[0];
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
+ src_alpha = src_scan[-1];
+ ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
+ src_alpha = src_scan[-2];
+ ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
+ dest_scan[3] = 255;
+ dest_scan += 4;
+ src_scan += 3;
+ }
+ }
+ } else {
+ if (x_subpixel == 0) {
+ for (int col = start_col; col < end_col; col ++) {
+ if (bNormal) {
+ int src_alpha1 = (src_scan[0] + src_scan[1] + src_scan[2]) / 3;
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha1, nativetext_flags, a);
+ src_alpha1 = src_alpha1 * a / 255;
+ FX_BYTE back_alpha = dest_scan[3];
+ if (back_alpha == 0) {
+ FXARGB_SETDIB(dest_scan, FXARGB_MAKE(src_alpha1, r, g, b));
+ dest_scan += 4;
+ src_scan += 3;
+ continue;
+ }
+ if (src_alpha1 == 0) {
+ dest_scan += 4;
+ src_scan += 3;
+ continue;
+ }
+ FX_BYTE dest_alpha = back_alpha + src_alpha1 - back_alpha * src_alpha1 / 255;
+ dest_scan[3] = dest_alpha;
+ int alpha_ratio = src_alpha1 * 255 / dest_alpha;
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, alpha_ratio));
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, alpha_ratio));
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, alpha_ratio));
+ dest_scan += 4;
+ src_scan += 3;
+ continue;
+ }
+ int src_alpha = src_scan[0];
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
+ src_alpha = src_scan[1];
+ ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
+ src_alpha = src_scan[2];
+ ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
+ dest_scan[3] = 255;
+ dest_scan += 4;
+ src_scan += 3;
+ }
+ } else if (x_subpixel == 1) {
+ if (bNormal) {
+ int src_alpha1 = start_col > left ? ((src_scan[-1] + src_scan[0] + src_scan[1]) / 3) : ((src_scan[0] + src_scan[1]) / 3);
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha1, nativetext_flags, a);
+ src_alpha1 = src_alpha1 * a / 255;
+ if (src_alpha1 == 0) {
+ dest_scan += 4;
+ src_scan += 3;
+ } else {
+ FX_BYTE back_alpha = dest_scan[3];
+ if (back_alpha == 0) {
+ FXARGB_SETDIB(dest_scan, FXARGB_MAKE(src_alpha1, r, g, b));
+ } else {
+ FX_BYTE dest_alpha = back_alpha + src_alpha1 - back_alpha * src_alpha1 / 255;
+ dest_scan[3] = dest_alpha;
+ int alpha_ratio = src_alpha1 * 255 / dest_alpha;
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, alpha_ratio));
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, alpha_ratio));
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, alpha_ratio));
+ }
+ dest_scan += 4;
+ src_scan += 3;
+ }
+ } else {
+ if (start_col > left) {
+ int src_alpha = src_scan[-1];
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
+ }
+ int src_alpha = src_scan[0];
+ ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
+ src_alpha = src_scan[1];
+ ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
+ dest_scan[3] = 255;
+ dest_scan += 4;
+ src_scan += 3;
+ }
+ for (int col = start_col + 1; col < end_col; col ++) {
+ if (bNormal) {
+ int src_alpha1 = (src_scan[-1] + src_scan[0] + src_scan[1]) / 3;
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha1, nativetext_flags, a);
+ src_alpha1 = src_alpha1 * a / 255;
+ FX_BYTE back_alpha = dest_scan[3];
+ if (back_alpha == 0) {
+ FXARGB_SETDIB(dest_scan, FXARGB_MAKE(src_alpha1, r, g, b));
+ dest_scan += 4;
+ src_scan += 3;
+ continue;
+ }
+ if (src_alpha1 == 0) {
+ dest_scan += 4;
+ src_scan += 3;
+ continue;
+ }
+ FX_BYTE dest_alpha = back_alpha + src_alpha1 - back_alpha * src_alpha1 / 255;
+ dest_scan[3] = dest_alpha;
+ int alpha_ratio = src_alpha1 * 255 / dest_alpha;
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, alpha_ratio));
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, alpha_ratio));
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, alpha_ratio));
+ dest_scan += 4;
+ src_scan += 3;
+ continue;
+ }
+ int src_alpha = src_scan[-1];
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
+ src_alpha = src_scan[0];
+ ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
+ src_alpha = src_scan[1];
+ ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
+ dest_scan[3] = 255;
+ dest_scan += 4;
+ src_scan += 3;
+ }
+ } else {
+ if (bNormal) {
+ int src_alpha1 = start_col > left ? ((src_scan[-2] + src_scan[-1] + src_scan[0]) / 3) : ((src_scan[0]) / 3);
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha1, nativetext_flags, a);
+ src_alpha1 = src_alpha1 * a / 255;
+ if (src_alpha1 == 0) {
+ dest_scan += 4;
+ src_scan += 3;
+ } else {
+ FX_BYTE back_alpha = dest_scan[3];
+ if (back_alpha == 0) {
+ FXARGB_SETDIB(dest_scan, FXARGB_MAKE(src_alpha1, r, g, b));
+ } else {
+ FX_BYTE dest_alpha = back_alpha + src_alpha1 - back_alpha * src_alpha1 / 255;
+ dest_scan[3] = dest_alpha;
+ int alpha_ratio = src_alpha1 * 255 / dest_alpha;
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, alpha_ratio));
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, alpha_ratio));
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, alpha_ratio));
+ }
+ dest_scan += 4;
+ src_scan += 3;
+ }
+ } else {
+ if (start_col > left) {
+ int src_alpha = src_scan[-2];
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
+ src_alpha = src_scan[-1];
+ ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
+ }
+ int src_alpha = src_scan[0];
+ ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
+ dest_scan[3] = 255;
+ dest_scan += 4;
+ src_scan += 3;
+ }
+ for (int col = start_col + 1; col < end_col; col ++) {
+ if (bNormal) {
+ int src_alpha1 = (src_scan[-2] + src_scan[-1] + src_scan[0]) / 3;
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha1, nativetext_flags, a);
+ src_alpha1 = src_alpha1 * a / 255;
+ FX_BYTE back_alpha = dest_scan[3];
+ if (back_alpha == 0) {
+ FXARGB_SETDIB(dest_scan, FXARGB_MAKE(src_alpha1, r, g, b));
+ dest_scan += 4;
+ src_scan += 3;
+ continue;
+ }
+ if (src_alpha1 == 0) {
+ dest_scan += 4;
+ src_scan += 3;
+ continue;
+ }
+ FX_BYTE dest_alpha = back_alpha + src_alpha1 - back_alpha * src_alpha1 / 255;
+ dest_scan[3] = dest_alpha;
+ int alpha_ratio = src_alpha1 * 255 / dest_alpha;
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, alpha_ratio));
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, alpha_ratio));
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, alpha_ratio));
+ dest_scan += 4;
+ src_scan += 3;
+ continue;
+ }
+ int src_alpha = src_scan[-2];
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
+ src_alpha = src_scan[-1];
+ ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
+ src_alpha = src_scan[0];
+ ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
+ dest_scan[3] = 255;
+ dest_scan += 4;
+ src_scan += 3;
+ }
+ }
+ }
+ }
+ } else {
+ for (int row = 0; row < nrows; row ++) {
+ int dest_row = row + top;
+ if (dest_row < 0 || dest_row >= bitmap.GetHeight()) {
+ continue;
+ }
+ FX_LPBYTE src_scan = src_buf + row * src_pitch + (start_col - left) * 3;
+ FX_LPBYTE dest_scan = dest_buf + dest_row * dest_pitch + start_col * Bpp;
+ if (bBGRStripe) {
+ if (x_subpixel == 0) {
+ for (int col = start_col; col < end_col; col ++) {
+ int src_alpha = src_scan[2];
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
+ src_alpha = src_scan[1];
+ ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
+ src_alpha = src_scan[0];
+ ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
+ dest_scan += Bpp;
+ src_scan += 3;
+ }
+ } else if (x_subpixel == 1) {
+ int src_alpha = src_scan[1];
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
+ src_alpha = src_scan[0];
+ ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
+ if (start_col > left) {
+ src_alpha = src_scan[-1];
+ ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
+ }
+ dest_scan += Bpp;
+ src_scan += 3;
+ for (int col = start_col + 1; col < end_col - 1; col ++) {
+ int src_alpha = src_scan[1];
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
+ src_alpha = src_scan[0];
+ ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
+ src_alpha = src_scan[-1];
+ ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
+ dest_scan += Bpp;
+ src_scan += 3;
+ }
+ } else {
+ int src_alpha = src_scan[0];
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
+ if (start_col > left) {
+ src_alpha = src_scan[-1];
+ ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
+ src_alpha = src_scan[-2];
+ ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
+ }
+ dest_scan += Bpp;
+ src_scan += 3;
+ for (int col = start_col + 1; col < end_col - 1; col ++) {
+ int src_alpha = src_scan[0];
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
+ src_alpha = src_scan[-1];
+ ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
+ src_alpha = src_scan[-2];
+ ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
+ dest_scan += Bpp;
+ src_scan += 3;
+ }
+ }
+ } else {
+ if (x_subpixel == 0) {
+ for (int col = start_col; col < end_col; col ++) {
+ if (bNormal) {
+ int src_alpha1 = (src_scan[0] + src_scan[1] + src_scan[2]) / 3;
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha1, nativetext_flags, a);
+ src_alpha1 = src_alpha1 * a / 255;
+ if (src_alpha1 == 0) {
+ dest_scan += Bpp;
+ src_scan += 3;
+ continue;
+ }
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha1));
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha1));
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha1));
+ dest_scan += Bpp;
+ src_scan += 3;
+ continue;
+ }
+ int src_alpha = src_scan[0];
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
+ src_alpha = src_scan[1];
+ ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
+ src_alpha = src_scan[2];
+ ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
+ dest_scan += Bpp;
+ src_scan += 3;
+ }
+ } else if (x_subpixel == 1) {
+ if (bNormal) {
+ int src_alpha1 = start_col > left ? (src_scan[0] + src_scan[1] + src_scan[-1]) / 3 : (src_scan[0] + src_scan[1]) / 3;
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha1, nativetext_flags, a);
+ src_alpha1 = src_alpha1 * a / 255;
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha1));
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha1));
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha1));
+ dest_scan += Bpp;
+ src_scan += 3;
+ } else {
+ if (start_col > left) {
+ int src_alpha = src_scan[-1];
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
+ }
+ int src_alpha = src_scan[0];
+ ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
+ src_alpha = src_scan[1];
+ ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
+ dest_scan += Bpp;
+ src_scan += 3;
+ }
+ for (int col = start_col + 1; col < end_col; col ++) {
+ if (bNormal) {
+ int src_alpha1 = (src_scan[0] + src_scan[1] + src_scan[-1]) / 3;
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha1, nativetext_flags, a);
+ src_alpha1 = src_alpha1 * a / 255;
+ if (src_alpha1 == 0) {
+ dest_scan += Bpp;
+ src_scan += 3;
+ continue;
+ }
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha1));
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha1));
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha1));
+ dest_scan += Bpp;
+ src_scan += 3;
+ continue;
+ }
+ int src_alpha = src_scan[-1];
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
+ src_alpha = src_scan[0];
+ ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
+ src_alpha = src_scan[1];
+ ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
+ dest_scan += Bpp;
+ src_scan += 3;
+ }
+ } else {
+ if (bNormal) {
+ int src_alpha1 = start_col > left ? (src_scan[0] + src_scan[-2] + src_scan[-1]) / 3 : src_scan[0] / 3;
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha1, nativetext_flags, a);
+ src_alpha1 = src_alpha1 * a / 255;
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha1));
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha1));
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha1));
+ dest_scan += Bpp;
+ src_scan += 3;
+ } else {
+ if (start_col > left) {
+ int src_alpha = src_scan[-2];
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
+ src_alpha = src_scan[-1];
+ ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
+ }
+ int src_alpha = src_scan[0];
+ ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
+ dest_scan += Bpp;
+ src_scan += 3;
+ }
+ for (int col = start_col + 1; col < end_col; col ++) {
+ if (bNormal) {
+ int src_alpha1 = ((int)(src_scan[0]) + (int)(src_scan[-2]) + (int)(src_scan[-1])) / 3;
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha1, nativetext_flags, a);
+ src_alpha1 = src_alpha1 * a / 255;
+ if (src_alpha1 == 0) {
+ dest_scan += Bpp;
+ src_scan += 3;
+ continue;
+ }
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha1));
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha1));
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha1));
+ dest_scan += Bpp;
+ src_scan += 3;
+ continue;
+ }
+ int src_alpha = src_scan[-2];
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
+ src_alpha = src_scan[-1];
+ ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
+ src_alpha = src_scan[0];
+ ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
+ dest_scan += Bpp;
+ src_scan += 3;
+ }
+ }
+ }
+ }
+ }
+ }
+ if (bitmap.IsAlphaMask()) {
+ SetBitMask(&bitmap, bmp_rect.left, bmp_rect.top, fill_color, alpha_flag, pIccTransform);
+ } else {
+ SetDIBits(&bitmap, bmp_rect.left, bmp_rect.top);
+ }
+ FX_Free(pGlyphAndPos);
+ return TRUE;
+}
+FX_BOOL CFX_RenderDevice::DrawTextPath(int nChars, const FXTEXT_CHARPOS* pCharPos,
+ CFX_Font* pFont, CFX_FontCache* pCache,
+ FX_FLOAT font_size, const CFX_AffineMatrix* pText2User,
+ const CFX_AffineMatrix* pUser2Device, const CFX_GraphStateData* pGraphState,
+ FX_DWORD fill_color, FX_ARGB stroke_color, CFX_PathData* pClippingPath, int nFlag,
+ int alpha_flag, void* pIccTransform, int blend_type)
+{
+ if (pCache == NULL) {
+ pCache = CFX_GEModule::Get()->GetFontCache();
+ }
+ CFX_FaceCache* pFaceCache = pCache->GetCachedFace(pFont);
+ FX_FONTCACHE_DEFINE(pCache, pFont);
+ for (int iChar = 0; iChar < nChars; iChar ++) {
+ const FXTEXT_CHARPOS& charpos = pCharPos[iChar];
+ CFX_AffineMatrix matrix;
+ if (charpos.m_bGlyphAdjust)
+ matrix.Set(charpos.m_AdjustMatrix[0], charpos.m_AdjustMatrix[1],
+ charpos.m_AdjustMatrix[2], charpos.m_AdjustMatrix[3], 0, 0);
+ matrix.Concat(font_size, 0, 0, font_size, charpos.m_OriginX, charpos.m_OriginY);
+ const CFX_PathData* pPath = pFaceCache->LoadGlyphPath(pFont, charpos.m_GlyphIndex, charpos.m_FontCharWidth);
+ if (pPath == NULL) {
+ continue;
+ }
+ matrix.Concat(*pText2User);
+ CFX_PathData TransformedPath(*pPath);
+ TransformedPath.Transform(&matrix);
+ FX_BOOL bHasAlpha = FXGETFLAG_COLORTYPE(alpha_flag) ?
+ (FXGETFLAG_ALPHA_FILL(alpha_flag) || FXGETFLAG_ALPHA_STROKE(alpha_flag)) :
+ (fill_color || stroke_color);
+ if (bHasAlpha) {
+ int fill_mode = nFlag;
+ if (FXGETFLAG_COLORTYPE(alpha_flag)) {
+ if (FXGETFLAG_ALPHA_FILL(alpha_flag)) {
+ fill_mode |= FXFILL_WINDING;
+ }
+ } else {
+ if (fill_color) {
+ fill_mode |= FXFILL_WINDING;
+ }
+ }
+ fill_mode |= FX_FILL_TEXT_MODE;
+ if (!DrawPath(&TransformedPath, pUser2Device, pGraphState, fill_color, stroke_color, fill_mode, alpha_flag, pIccTransform, blend_type)) {
+ return FALSE;
+ }
+ }
+ if (pClippingPath) {
+ pClippingPath->Append(&TransformedPath, pUser2Device);
+ }
+ }
+ return TRUE;
+}
+CFX_FontCache::~CFX_FontCache()
+{
+ FreeCache(TRUE);
+}
+CFX_FaceCache* CFX_FontCache::GetCachedFace(CFX_Font* pFont)
+{
+ FX_BOOL bExternal = pFont->GetFace() == NULL;
+ void* face = bExternal ? pFont->GetSubstFont()->m_ExtHandle : pFont->GetFace();
+ CFX_FTCacheMap& map = bExternal ? m_ExtFaceMap : m_FTFaceMap;
+ CFX_CountedFaceCache* counted_face_cache = NULL;
+ if (map.Lookup((FXFT_Face)face, counted_face_cache)) {
+ counted_face_cache->m_nCount++;
+ return counted_face_cache->m_Obj;
+ }
+ CFX_FaceCache* face_cache = NULL;
+ face_cache = FX_NEW CFX_FaceCache(bExternal ? NULL : (FXFT_Face)face);
+ if (face_cache == NULL) {
+ return NULL;
+ }
+ counted_face_cache = FX_NEW CFX_CountedFaceCache;
+ if (!counted_face_cache) {
+ if (face_cache) {
+ delete face_cache;
+ face_cache = NULL;
+ }
+ return NULL;
+ }
+ counted_face_cache->m_nCount = 2;
+ counted_face_cache->m_Obj = face_cache;
+ map.SetAt((FXFT_Face)face, counted_face_cache);
+ return face_cache;
+}
+void CFX_FontCache::ReleaseCachedFace(CFX_Font* pFont)
+{
+ FX_BOOL bExternal = pFont->GetFace() == NULL;
+ void* face = bExternal ? pFont->GetSubstFont()->m_ExtHandle : pFont->GetFace();
+ CFX_FTCacheMap& map = bExternal ? m_ExtFaceMap : m_FTFaceMap;
+ CFX_CountedFaceCache* counted_face_cache = NULL;
+ if (!map.Lookup((FXFT_Face)face, counted_face_cache)) {
+ return;
+ }
+ if (counted_face_cache->m_nCount > 1) {
+ counted_face_cache->m_nCount--;
+ }
+}
+void CFX_FontCache::FreeCache(FX_BOOL bRelease)
+{
+ {
+ FX_POSITION pos;
+ pos = m_FTFaceMap.GetStartPosition();
+ while (pos) {
+ FXFT_Face face;
+ CFX_CountedFaceCache* cache;
+ m_FTFaceMap.GetNextAssoc(pos, face, cache);
+ if (bRelease || cache->m_nCount < 2) {
+ delete cache->m_Obj;
+ delete cache;
+ m_FTFaceMap.RemoveKey(face);
+ }
+ }
+ pos = m_ExtFaceMap.GetStartPosition();
+ while (pos) {
+ FXFT_Face face;
+ CFX_CountedFaceCache* cache;
+ m_ExtFaceMap.GetNextAssoc(pos, face, cache);
+ if (bRelease || cache->m_nCount < 2) {
+ delete cache->m_Obj;
+ delete cache;
+ m_ExtFaceMap.RemoveKey(face);
+ }
+ }
+ }
+}
+CFX_FaceCache::CFX_FaceCache(FXFT_Face face)
+{
+ m_Face = face;
+ m_pBitmap = NULL;
+}
+CFX_FaceCache::~CFX_FaceCache()
+{
+ FX_POSITION pos = m_SizeMap.GetStartPosition();
+ CFX_ByteString Key;
+ CFX_SizeGlyphCache* pSizeCache = NULL;
+ while(pos) {
+ m_SizeMap.GetNextAssoc( pos, Key, (void*&)pSizeCache);
+ delete pSizeCache;
+ }
+ m_SizeMap.RemoveAll();
+ pos = m_PathMap.GetStartPosition();
+ FX_LPVOID key1;
+ CFX_PathData* pPath;
+ while (pos) {
+ m_PathMap.GetNextAssoc(pos, key1, (FX_LPVOID&)pPath);
+ delete pPath;
+ }
+ if (m_pBitmap) {
+ delete m_pBitmap;
+ }
+ m_PathMap.RemoveAll();
+}
+#if ((_FXM_PLATFORM_ != _FXM_PLATFORM_APPLE_)|| defined(_FPDFAPI_MINI_))
+void CFX_FaceCache::InitPlatform()
+{
+}
+#endif
+CFX_GlyphBitmap* CFX_FaceCache::LookUpGlyphBitmap(CFX_Font* pFont, const CFX_AffineMatrix* pMatrix,
+ CFX_ByteStringC& FaceGlyphsKey, FX_DWORD glyph_index, FX_BOOL bFontStyle,
+ int dest_width, int anti_alias)
+{
+ CFX_SizeGlyphCache* pSizeCache = NULL;
+ if (!m_SizeMap.Lookup(FaceGlyphsKey, (void*&)pSizeCache)) {
+ pSizeCache = FX_NEW CFX_SizeGlyphCache;
+ if (pSizeCache == NULL) {
+ return NULL;
+ }
+ m_SizeMap.SetAt(FaceGlyphsKey, pSizeCache);
+ }
+ CFX_GlyphBitmap* pGlyphBitmap = NULL;
+ if (pSizeCache->m_GlyphMap.Lookup((FX_LPVOID)(FX_UINTPTR)glyph_index, (void*&)pGlyphBitmap)) {
+ return pGlyphBitmap;
+ }
+ pGlyphBitmap = RenderGlyph(pFont, glyph_index, bFontStyle, pMatrix, dest_width, anti_alias);
+ if (pGlyphBitmap == NULL) {
+ return NULL;
+ }
+ pSizeCache->m_GlyphMap.SetAt((FX_LPVOID)(FX_UINTPTR)glyph_index, pGlyphBitmap);
+ return pGlyphBitmap;
+}
+const CFX_GlyphBitmap* CFX_FaceCache::LoadGlyphBitmap(CFX_Font* pFont, FX_DWORD glyph_index, FX_BOOL bFontStyle, const CFX_AffineMatrix* pMatrix,
+ int dest_width, int anti_alias, int& text_flags)
+{
+ if (glyph_index == (FX_DWORD) - 1) {
+ return NULL;
+ }
+ _CFX_UniqueKeyGen keygen;
+#if ((_FXM_PLATFORM_ != _FXM_PLATFORM_APPLE_)|| defined(_FPDFAPI_MINI_))
+ if (pFont->GetSubstFont())
+ keygen.Generate(9, (int)(pMatrix->a * 10000), (int)(pMatrix->b * 10000),
+ (int)(pMatrix->c * 10000), (int)(pMatrix->d * 10000), dest_width, anti_alias,
+ pFont->GetSubstFont()->m_Weight, pFont->GetSubstFont()->m_ItalicAngle, pFont->IsVertical());
+ else
+ keygen.Generate(6, (int)(pMatrix->a * 10000), (int)(pMatrix->b * 10000),
+ (int)(pMatrix->c * 10000), (int)(pMatrix->d * 10000), dest_width, anti_alias);
+#else
+ if (text_flags & FXTEXT_NO_NATIVETEXT) {
+ if (pFont->GetSubstFont())
+ keygen.Generate(9, (int)(pMatrix->a * 10000), (int)(pMatrix->b * 10000),
+ (int)(pMatrix->c * 10000), (int)(pMatrix->d * 10000), dest_width, anti_alias,
+ pFont->GetSubstFont()->m_Weight, pFont->GetSubstFont()->m_ItalicAngle, pFont->IsVertical());
+ else
+ keygen.Generate(6, (int)(pMatrix->a * 10000), (int)(pMatrix->b * 10000),
+ (int)(pMatrix->c * 10000), (int)(pMatrix->d * 10000), dest_width, anti_alias);
+ } else {
+ if (pFont->GetSubstFont())
+ keygen.Generate(10, (int)(pMatrix->a * 10000), (int)(pMatrix->b * 10000),
+ (int)(pMatrix->c * 10000), (int)(pMatrix->d * 10000), dest_width, anti_alias,
+ pFont->GetSubstFont()->m_Weight, pFont->GetSubstFont()->m_ItalicAngle, pFont->IsVertical(), 3);
+ else
+ keygen.Generate(7, (int)(pMatrix->a * 10000), (int)(pMatrix->b * 10000),
+ (int)(pMatrix->c * 10000), (int)(pMatrix->d * 10000), dest_width, anti_alias, 3);
+ }
+#endif
+ CFX_ByteStringC FaceGlyphsKey(keygen.m_Key, keygen.m_KeyLen);
+#if ((_FXM_PLATFORM_ != _FXM_PLATFORM_APPLE_)|| defined(_FPDFAPI_MINI_))
+ return LookUpGlyphBitmap(pFont, pMatrix, FaceGlyphsKey, glyph_index, bFontStyle, dest_width, anti_alias);
+#else
+ if (text_flags & FXTEXT_NO_NATIVETEXT) {
+ return LookUpGlyphBitmap(pFont, pMatrix, FaceGlyphsKey, glyph_index, bFontStyle, dest_width, anti_alias);
+ } else {
+ CFX_GlyphBitmap* pGlyphBitmap;
+ CFX_SizeGlyphCache* pSizeCache = NULL;
+ if (m_SizeMap.Lookup(FaceGlyphsKey, (void*&)pSizeCache)) {
+ if (pSizeCache->m_GlyphMap.Lookup((FX_LPVOID)(FX_UINTPTR)glyph_index, (void*&)pGlyphBitmap)) {
+ return pGlyphBitmap;
+ }
+ pGlyphBitmap = RenderGlyph_Nativetext(pFont, glyph_index, pMatrix, dest_width, anti_alias);
+ if (pGlyphBitmap) {
+ pSizeCache->m_GlyphMap.SetAt((FX_LPVOID)(FX_UINTPTR)glyph_index, pGlyphBitmap);
+ return pGlyphBitmap;
+ }
+ } else {
+ pGlyphBitmap = RenderGlyph_Nativetext(pFont, glyph_index, pMatrix, dest_width, anti_alias);
+ if (pGlyphBitmap) {
+ pSizeCache = FX_NEW CFX_SizeGlyphCache;
+ if (pSizeCache == NULL) {
+ return NULL;
+ }
+ m_SizeMap.SetAt(FaceGlyphsKey, pSizeCache);
+ pSizeCache->m_GlyphMap.SetAt((FX_LPVOID)(FX_UINTPTR)glyph_index, pGlyphBitmap);
+ return pGlyphBitmap;
+ }
+ }
+ if (pFont->GetSubstFont())
+ keygen.Generate(9, (int)(pMatrix->a * 10000), (int)(pMatrix->b * 10000),
+ (int)(pMatrix->c * 10000), (int)(pMatrix->d * 10000), dest_width, anti_alias,
+ pFont->GetSubstFont()->m_Weight, pFont->GetSubstFont()->m_ItalicAngle, pFont->IsVertical());
+ else
+ keygen.Generate(6, (int)(pMatrix->a * 10000), (int)(pMatrix->b * 10000),
+ (int)(pMatrix->c * 10000), (int)(pMatrix->d * 10000), dest_width, anti_alias);
+ CFX_ByteStringC FaceGlyphsKey(keygen.m_Key, keygen.m_KeyLen);
+ text_flags |= FXTEXT_NO_NATIVETEXT;
+ return LookUpGlyphBitmap(pFont, pMatrix, FaceGlyphsKey, glyph_index, bFontStyle, dest_width, anti_alias);
+ }
+#endif
+}
+CFX_SizeGlyphCache::~CFX_SizeGlyphCache()
+{
+ FX_POSITION pos = m_GlyphMap.GetStartPosition();
+ FX_LPVOID Key;
+ CFX_GlyphBitmap* pGlyphBitmap = NULL;
+ while(pos) {
+ m_GlyphMap.GetNextAssoc(pos, Key, (void*&)pGlyphBitmap);
+ delete pGlyphBitmap;
+ }
+ m_GlyphMap.RemoveAll();
+}
+#if defined(_FPDFAPI_MINI_)
+#define CONTRAST_RAMP_STEP 16
+#else
+#define CONTRAST_RAMP_STEP 1
+#endif
+static const FX_BYTE g_adjust_contrast11[256] = {
+ 0, 0, 2, 3, 4, 5, 6, 8, 9, 10, 11, 13, 14, 15, 17, 18, 19, 21, 22, 24, 25, 26, 28, 29, 31,
+ 32, 33, 35, 36, 38, 39, 40, 42, 43, 45, 46, 48, 49, 51, 52, 54, 55, 56, 58, 59, 61, 62, 64, 65,
+ 67, 68, 70, 71, 72, 74, 75, 77, 78, 80, 81, 83, 84, 86, 87, 89, 90, 91, 93, 94, 96, 97, 99, 100,
+ 101, 103, 104, 106, 107, 109, 110, 111, 113, 114, 116, 117, 118, 120, 121, 123, 124, 125, 127,
+ 128, 130, 131, 132, 134, 135, 136, 138, 139, 140, 142, 143, 144, 146, 147, 148, 149, 151, 152,
+ 153, 155, 156, 157, 158, 160, 161, 162, 163, 165, 166, 167, 168, 169, 171, 172, 173, 174, 175,
+ 177, 178, 179, 180, 181, 182, 183, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196,
+ 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215,
+ 215, 216, 217, 218, 219, 220, 221, 221, 222, 223, 224, 224, 225, 226, 227, 227, 228, 229, 230,
+ 230, 231, 232, 232, 233, 234, 234, 235, 236, 236, 237, 237, 238, 239, 239, 240, 240, 241, 241,
+ 242, 242, 243, 243, 244, 244, 245, 245, 246, 246, 246, 247, 247, 248, 248, 248, 249, 249, 249,
+ 250, 250, 250, 251, 251, 251, 251, 252, 252, 252, 252, 253, 253, 253, 253, 253, 253, 254, 254,
+ 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 255,
+};
+static const FX_BYTE g_adjust_contrast15[256] = {
+ 0, 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 5, 5, 6, 7, 7, 8, 9, 10, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21,
+ 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 34, 35, 36, 37, 38, 40, 41, 42, 43, 45, 46, 47, 48, 50, 51,
+ 52, 54, 55, 56, 58, 59, 60, 62, 63, 64, 66, 67, 68, 70, 71, 73, 74, 75, 77, 78, 80, 81, 82, 84, 85, 87,
+ 88, 90, 91, 93, 94, 95, 97, 98, 100, 101, 103, 104, 106, 107, 109, 110, 111, 113, 114, 116, 117, 119,
+ 120, 122, 123, 125, 126, 128, 129, 130, 132, 133, 135, 136, 138, 139, 141, 142, 143, 145, 146, 148,
+ 149, 150, 152, 153, 155, 156, 157, 159, 160, 161, 163, 164, 166, 167, 168, 170, 171, 172, 174, 175,
+ 176, 177, 179, 180, 181, 183, 184, 185, 186, 188, 189, 190, 191, 192, 194, 195, 196, 197, 198, 199,
+ 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220,
+ 221, 222, 223, 224, 225, 226, 227, 227, 228, 229, 230, 231, 232, 232, 233, 234, 235, 235, 236, 237,
+ 237, 238, 239, 239, 240, 241, 241, 242, 242, 243, 244, 244, 245, 245, 246, 246, 247, 247, 248, 248,
+ 248, 249, 249, 250, 250, 250, 251, 251, 251, 252, 252, 252, 252, 253, 253, 253, 253, 253, 254, 254,
+ 254, 254, 254, 254, 254, 254, 254, 254, 254, 255,
+};
+static void _CalcContrastRamp(FX_LPBYTE ramp, int level)
+{
+ int contrast_min = 0, contrast_max = 255 - level, i;
+ for (i = 0; i < contrast_min; i ++) {
+ ramp[i] = 0;
+ }
+ for (i = contrast_min; i < contrast_max; i ++) {
+ ramp[i] = 255 * (i - contrast_min) / (contrast_max - contrast_min);
+ }
+ for (i = contrast_max; i < 256; i ++) {
+ ramp[i] = 255;
+ }
+}
+void CFX_Font::AdjustMMParams(int glyph_index, int dest_width, int weight)
+{
+ FXFT_MM_Var pMasters = NULL;
+ FXFT_Get_MM_Var(m_Face, &pMasters);
+ if (pMasters == NULL) {
+ return;
+ }
+ long coords[2];
+ if (weight == 0) {
+ coords[0] = FXFT_Get_MM_Axis_Def(FXFT_Get_MM_Axis(pMasters, 0)) / 65536;
+ } else {
+ coords[0] = weight;
+ }
+ if (dest_width == 0) {
+ coords[1] = FXFT_Get_MM_Axis_Def(FXFT_Get_MM_Axis(pMasters, 1)) / 65536;
+ } else {
+ int min_param = FXFT_Get_MM_Axis_Min(FXFT_Get_MM_Axis(pMasters, 1)) / 65536;
+ int max_param = FXFT_Get_MM_Axis_Max(FXFT_Get_MM_Axis(pMasters, 1)) / 65536;
+ coords[1] = min_param;
+ int error = FXFT_Set_MM_Design_Coordinates(m_Face, 2, coords);
+ error = FXFT_Load_Glyph(m_Face, glyph_index, FXFT_LOAD_NO_SCALE | FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH);
+ int min_width = FXFT_Get_Glyph_HoriAdvance(m_Face) * 1000 / FXFT_Get_Face_UnitsPerEM(m_Face);
+ coords[1] = max_param;
+ error = FXFT_Set_MM_Design_Coordinates(m_Face, 2, coords);
+ error = FXFT_Load_Glyph(m_Face, glyph_index, FXFT_LOAD_NO_SCALE | FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH);
+ int max_width = FXFT_Get_Glyph_HoriAdvance(m_Face) * 1000 / FXFT_Get_Face_UnitsPerEM(m_Face);
+ if (max_width == min_width) {
+ return;
+ }
+ int param = min_param + (max_param - min_param) * (dest_width - min_width) / (max_width - min_width);
+ coords[1] = param;
+ }
+ FXFT_Free(m_Face, pMasters);
+ FXFT_Set_MM_Design_Coordinates(m_Face, 2, coords);
+}
+extern const char g_AngleSkew[30] = {
+ 0, 2, 3, 5, 7, 9, 11, 12, 14, 16,
+ 18, 19, 21, 23, 25, 27, 29, 31, 32, 34,
+ 36, 38, 40, 42, 45, 47, 49, 51, 53, 55,
+};
+static const FX_BYTE g_WeightPow[100] = {
+ 0, 3, 6, 7, 8, 9, 11, 12, 14, 15, 16, 17, 18, 19, 20,
+ 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 35, 36, 36,
+ 37, 37, 37, 38, 38, 38, 39, 39, 39, 40, 40, 40, 41, 41, 41, 42, 42, 42,
+ 42, 43, 43, 43, 44, 44, 44, 44, 45, 45, 45, 45, 46, 46, 46, 46, 47, 47,
+ 47, 47, 48, 48, 48, 48, 48, 49, 49, 49, 49, 50, 50, 50, 50, 50, 51, 51,
+ 51, 51, 51, 52, 52, 52, 52, 52, 53, 53, 53, 53, 53,
+};
+extern const FX_BYTE g_WeightPow_11[100] = {
+ 0, 4, 7, 8, 9, 10, 12, 13, 15, 17, 18, 19, 20, 21, 22,
+ 23, 24, 25, 26, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 39, 39, 40, 40,
+ 41, 41, 41, 42, 42, 42, 43, 43, 43, 44, 44, 44, 45, 45, 45, 46, 46, 46,
+ 46, 43, 47, 47, 48, 48, 48, 48, 45, 50, 50, 50, 46, 51, 51, 51, 52, 52,
+ 52, 52, 53, 53, 53, 53, 53, 54, 54, 54, 54, 55, 55, 55, 55, 55, 56, 56,
+ 56, 56, 56, 57, 57, 57, 57, 57, 58, 58, 58, 58, 58,
+};
+extern const FX_BYTE g_WeightPow_SHIFTJIS[100] = {
+ 0, 0, 1, 2, 3, 4, 5, 7, 8, 10, 11, 13, 14, 16, 17, 19, 21, 22, 24, 26, 28,
+ 30, 32, 33, 35, 37, 39, 41, 43, 45, 48, 48, 48, 48, 49, 49, 49, 50, 50, 50, 50,
+ 51, 51, 51, 51, 52, 52, 52, 52, 52, 53, 53, 53, 53, 53, 54, 54, 54, 54, 54, 55, 55,
+ 55, 55, 55, 56, 56, 56, 56, 56 , 56, 57, 57, 57 , 57 , 57, 57, 57, 58, 58, 58, 58, 58,
+ 58, 58, 59, 59, 59, 59, 59, 59, 59, 60, 60, 60, 60, 60, 60, 60, 60,
+};
+static void _GammaAdjust(FX_LPBYTE pData, int nWid, int nHei, int src_pitch, FX_LPCBYTE gammaTable)
+{
+ int count = nHei * src_pitch;
+ for(int i = 0; i < count; i++) {
+ pData[i] = gammaTable[pData[i]];
+ }
+}
+static void _ContrastAdjust(FX_LPBYTE pDataIn, FX_LPBYTE pDataOut, int nWid, int nHei, int nSrcRowBytes, int nDstRowBytes)
+{
+ int col, row, temp;
+ int max = 0, min = 255;
+ FX_FLOAT rate;
+ for (row = 0; row < nHei; row ++) {
+ FX_LPBYTE pRow = pDataIn + row * nSrcRowBytes;
+ for (col = 0; col < nWid; col++) {
+ temp = *pRow ++;
+ if (temp > max) {
+ max = temp;
+ }
+ if (temp < min) {
+ min = temp;
+ }
+ }
+ }
+ temp = max - min;
+ if (0 == temp || 255 == temp) {
+ int rowbytes = FXSYS_abs(nSrcRowBytes) > nDstRowBytes ? nDstRowBytes : FXSYS_abs(nSrcRowBytes);
+ for (row = 0; row < nHei; row ++) {
+ FXSYS_memcpy32(pDataOut + row * nDstRowBytes, pDataIn + row * nSrcRowBytes, rowbytes);
+ }
+ return;
+ }
+ rate = 255.f / temp;
+ for (row = 0; row < nHei; row ++) {
+ FX_LPBYTE pSrcRow = pDataIn + row * nSrcRowBytes;
+ FX_LPBYTE pDstRow = pDataOut + row * nDstRowBytes;
+ for (col = 0; col < nWid; col ++) {
+ temp = (int)((*(pSrcRow++) - min) * rate + 0.5);
+ if (temp > 255) {
+ temp = 255;
+ } else if (temp < 0) {
+ temp = 0;
+ }
+ *pDstRow ++ = (FX_BYTE)temp;
+ }
+ }
+}
+CFX_GlyphBitmap* CFX_FaceCache::RenderGlyph(CFX_Font* pFont, FX_DWORD glyph_index, FX_BOOL bFontStyle,
+ const CFX_AffineMatrix* pMatrix, int dest_width, int anti_alias)
+{
+ if (m_Face == NULL) {
+ return NULL;
+ }
+ FXFT_Matrix ft_matrix;
+ ft_matrix.xx = (signed long)(pMatrix->GetA() / 64 * 65536);
+ ft_matrix.xy = (signed long)(pMatrix->GetC() / 64 * 65536);
+ ft_matrix.yx = (signed long)(pMatrix->GetB() / 64 * 65536);
+ ft_matrix.yy = (signed long)(pMatrix->GetD() / 64 * 65536);
+ FX_BOOL bUseCJKSubFont = FALSE;
+ const CFX_SubstFont* pSubstFont = pFont->GetSubstFont();
+ if (pSubstFont) {
+ bUseCJKSubFont = pSubstFont->m_bSubstOfCJK && bFontStyle;
+ int skew = 0;
+ if (bUseCJKSubFont) {
+ skew = pSubstFont->m_bItlicCJK ? -15 : 0;
+ } else {
+ skew = pSubstFont->m_ItalicAngle;
+ }
+ if (skew) {
+ skew = skew <= -30 ? -58 : -g_AngleSkew[-skew];
+ if (pFont->IsVertical()) {
+ ft_matrix.yx += ft_matrix.yy * skew / 100;
+ } else {
+ ft_matrix.xy += -ft_matrix.xx * skew / 100;
+ }
+ }
+ if (pSubstFont->m_SubstFlags & FXFONT_SUBST_MM) {
+ pFont->AdjustMMParams(glyph_index, dest_width, pFont->GetSubstFont()->m_Weight);
+ }
+ }
+ int transflag = FXFT_Get_Face_Internal_Flag(m_Face);
+ FXFT_Set_Transform(m_Face, &ft_matrix, 0);
+ int load_flags = (m_Face->face_flags & FT_FACE_FLAG_SFNT) ? FXFT_LOAD_NO_BITMAP : (FXFT_LOAD_NO_BITMAP | FT_LOAD_NO_HINTING);
+ int error = FXFT_Load_Glyph(m_Face, glyph_index, load_flags);
+ if (error) {
+ FXFT_Set_Face_Internal_Flag(m_Face, transflag);
+ return NULL;
+ }
+ int weight = 0;
+ if (bUseCJKSubFont) {
+ weight = pSubstFont->m_WeightCJK;
+ } else {
+ weight = pSubstFont ? pSubstFont->m_Weight : 0;
+ }
+ if (pSubstFont && !(pSubstFont->m_SubstFlags & FXFONT_SUBST_MM) && weight > 400) {
+ int index = (weight - 400) / 10;
+ if (index >= 100) {
+ FXFT_Set_Face_Internal_Flag(m_Face, transflag);
+ return NULL;
+ }
+ int level = 0;
+ if (pSubstFont->m_Charset == FXFONT_SHIFTJIS_CHARSET) {
+ level = g_WeightPow_SHIFTJIS[index] * 2 * (FXSYS_abs((int)(ft_matrix.xx)) + FXSYS_abs((int)(ft_matrix.xy))) / 36655;
+ } else {
+ level = g_WeightPow_11[index] * (FXSYS_abs((int)(ft_matrix.xx)) + FXSYS_abs((int)(ft_matrix.xy))) / 36655;
+ }
+ FXFT_Outline_Embolden(FXFT_Get_Glyph_Outline(m_Face), level);
+ }
+ FXFT_Library_SetLcdFilter(CFX_GEModule::Get()->GetFontMgr()->m_FTLibrary, FT_LCD_FILTER_DEFAULT);
+ error = FXFT_Render_Glyph(m_Face, anti_alias);
+ if (error) {
+ FXFT_Set_Face_Internal_Flag(m_Face, transflag);
+ return NULL;
+ }
+ int bmwidth = FXFT_Get_Bitmap_Width(FXFT_Get_Glyph_Bitmap(m_Face));
+ int bmheight = FXFT_Get_Bitmap_Rows(FXFT_Get_Glyph_Bitmap(m_Face));
+ if (bmwidth > 2048 || bmheight > 2048) {
+ FXFT_Set_Face_Internal_Flag(m_Face, transflag);
+ return NULL;
+ }
+ int dib_width = bmwidth;
+ CFX_GlyphBitmap* pGlyphBitmap = FX_NEW CFX_GlyphBitmap;
+ if (!pGlyphBitmap) {
+ return NULL;
+ }
+ pGlyphBitmap->m_Bitmap.Create(dib_width, bmheight,
+ anti_alias == FXFT_RENDER_MODE_MONO ? FXDIB_1bppMask : FXDIB_8bppMask);
+ pGlyphBitmap->m_Left = FXFT_Get_Glyph_BitmapLeft(m_Face);
+ pGlyphBitmap->m_Top = FXFT_Get_Glyph_BitmapTop(m_Face);
+ int dest_pitch = pGlyphBitmap->m_Bitmap.GetPitch();
+ int src_pitch = FXFT_Get_Bitmap_Pitch(FXFT_Get_Glyph_Bitmap(m_Face));
+ FX_BYTE* pDestBuf = pGlyphBitmap->m_Bitmap.GetBuffer();
+ FX_BYTE* pSrcBuf = (FX_BYTE*)FXFT_Get_Bitmap_Buffer(FXFT_Get_Glyph_Bitmap(m_Face));
+ if (anti_alias != FXFT_RENDER_MODE_MONO && FXFT_Get_Bitmap_PixelMode(FXFT_Get_Glyph_Bitmap(m_Face)) == FXFT_PIXEL_MODE_MONO) {
+ int bytes = anti_alias == FXFT_RENDER_MODE_LCD ? 3 : 1;
+ for(int i = 0; i < bmheight; i++)
+ for(int n = 0; n < bmwidth; n++) {
+ FX_BYTE data = (pSrcBuf[i * src_pitch + n / 8] & (0x80 >> (n % 8))) ? 255 : 0;
+ for (int b = 0; b < bytes; b ++) {
+ pDestBuf[i * dest_pitch + n * bytes + b] = data;
+ }
+ }
+ } else {
+ FXSYS_memset32(pDestBuf, 0, dest_pitch * bmheight);
+ if (anti_alias == FXFT_RENDER_MODE_MONO && FXFT_Get_Bitmap_PixelMode(FXFT_Get_Glyph_Bitmap(m_Face)) == FXFT_PIXEL_MODE_MONO) {
+ int rowbytes = FXSYS_abs(src_pitch) > dest_pitch ? dest_pitch : FXSYS_abs(src_pitch);
+ for (int row = 0; row < bmheight; row ++) {
+ FXSYS_memcpy32(pDestBuf + row * dest_pitch, pSrcBuf + row * src_pitch, rowbytes);
+ }
+ } else {
+ _ContrastAdjust(pSrcBuf, pDestBuf, bmwidth, bmheight, src_pitch, dest_pitch);
+ _GammaAdjust(pDestBuf, bmwidth, bmheight, dest_pitch, CFX_GEModule::Get()->GetTextGammaTable());
+ }
+ }
+ FXFT_Set_Face_Internal_Flag(m_Face, transflag);
+ return pGlyphBitmap;
+}
+FX_BOOL _OutputGlyph(void* dib, int x, int y, CFX_Font* pFont,
+ int glyph_index, FX_ARGB argb)
+{
+ CFX_DIBitmap* pDib = (CFX_DIBitmap*)dib;
+ FXFT_Face face = pFont->GetFace();
+ int error = FXFT_Load_Glyph(face, glyph_index, FXFT_LOAD_NO_BITMAP);
+ if (error) {
+ return FALSE;
+ }
+ error = FXFT_Render_Glyph(face, FXFT_RENDER_MODE_NORMAL);
+ if (error) {
+ return FALSE;
+ }
+ int bmwidth = FXFT_Get_Bitmap_Width(FXFT_Get_Glyph_Bitmap(face));
+ int bmheight = FXFT_Get_Bitmap_Rows(FXFT_Get_Glyph_Bitmap(face));
+ int left = FXFT_Get_Glyph_BitmapLeft(face);
+ int top = FXFT_Get_Glyph_BitmapTop(face);
+ FX_LPCBYTE src_buf = (FX_LPCBYTE)FXFT_Get_Bitmap_Buffer(FXFT_Get_Glyph_Bitmap(face));
+ int src_pitch = FXFT_Get_Bitmap_Pitch(FXFT_Get_Glyph_Bitmap(face));
+ CFX_DIBitmap mask;
+ mask.Create(bmwidth, bmheight, FXDIB_8bppMask);
+ FX_LPBYTE dest_buf = mask.GetBuffer();
+ int dest_pitch = mask.GetPitch();
+ for (int row = 0; row < bmheight; row ++) {
+ FX_LPCBYTE src_scan = src_buf + row * src_pitch;
+ FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
+ FXSYS_memcpy32(dest_scan, src_scan, dest_pitch);
+ }
+ pDib->CompositeMask(x + left, y - top, bmwidth, bmheight, &mask, argb, 0, 0);
+ return TRUE;
+}
+FX_BOOL OutputText(void* dib, int x, int y, CFX_Font* pFont, double font_size,
+ CFX_AffineMatrix* pText_matrix, unsigned short const* text, unsigned long argb)
+{
+ if (!pFont) {
+ return FALSE;
+ }
+ FXFT_Face face = pFont->GetFace();
+ FXFT_Select_Charmap(pFont->m_Face, FXFT_ENCODING_UNICODE);
+ int transflag = FXFT_Get_Face_Internal_Flag(pFont->m_Face);
+ if (pText_matrix) {
+ FXFT_Matrix ft_matrix;
+ ft_matrix.xx = (signed long)(pText_matrix->a / 64 * 65536);
+ ft_matrix.xy = (signed long)(pText_matrix->c / 64 * 65536);
+ ft_matrix.yx = (signed long)(pText_matrix->b / 64 * 65536);
+ ft_matrix.yy = (signed long)(pText_matrix->d / 64 * 65536);
+ FXFT_Set_Transform(face, &ft_matrix, 0);
+ }
+ FX_FLOAT x_pos = 0;
+ for (; *text != 0; text ++) {
+ FX_WCHAR unicode = *text;
+ int glyph_index = FXFT_Get_Char_Index(pFont->m_Face, unicode);
+ if (glyph_index <= 0) {
+ continue;
+ }
+ int err = FXFT_Load_Glyph(pFont->m_Face, glyph_index, FXFT_LOAD_NO_SCALE | FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH);
+ if (err) {
+ continue;
+ }
+ int w = FXFT_Get_Glyph_HoriAdvance(pFont->m_Face);
+ int em = FXFT_Get_Face_UnitsPerEM(pFont->m_Face);
+ FX_FLOAT x1, y1;
+ pText_matrix->Transform(x_pos, 0, x1, y1);
+ _OutputGlyph(dib, (int)x1 + x, (int) - y1 + y, pFont,
+ glyph_index, argb);
+ x_pos += (FX_FLOAT)w / em;
+ }
+ FXFT_Set_Face_Internal_Flag(pFont->m_Face, transflag);
+ return TRUE;
+}
+FX_BOOL OutputGlyph(void* dib, int x, int y, CFX_Font* pFont, double font_size,
+ CFX_AffineMatrix* pMatrix, unsigned long glyph_index, unsigned long argb)
+{
+ FXFT_Matrix ft_matrix;
+ if (pMatrix) {
+ ft_matrix.xx = (signed long)(pMatrix->a * font_size / 64 * 65536);
+ ft_matrix.xy = (signed long)(pMatrix->c * font_size / 64 * 65536);
+ ft_matrix.yx = (signed long)(pMatrix->b * font_size / 64 * 65536);
+ ft_matrix.yy = (signed long)(pMatrix->d * font_size / 64 * 65536);
+ } else {
+ ft_matrix.xx = (signed long)(font_size / 64 * 65536);
+ ft_matrix.xy = ft_matrix.yx = 0;
+ ft_matrix.yy = (signed long)(font_size / 64 * 65536);
+ }
+ int transflag = FXFT_Get_Face_Internal_Flag(pFont->m_Face);
+ FXFT_Set_Transform(pFont->m_Face, &ft_matrix, 0);
+ FX_BOOL ret = _OutputGlyph(dib, x, y, pFont,
+ glyph_index, argb);
+ FXFT_Set_Face_Internal_Flag(pFont->m_Face, transflag);
+ return ret;
+}
+const CFX_PathData* CFX_FaceCache::LoadGlyphPath(CFX_Font* pFont, FX_DWORD glyph_index, int dest_width)
+{
+ if (m_Face == NULL || glyph_index == (FX_DWORD) - 1) {
+ return NULL;
+ }
+ CFX_PathData* pGlyphPath = NULL;
+ FX_LPVOID key;
+ if (pFont->GetSubstFont())
+ key = (FX_LPVOID)(FX_UINTPTR)(glyph_index + ((pFont->GetSubstFont()->m_Weight / 16) << 15) +
+ ((pFont->GetSubstFont()->m_ItalicAngle / 2) << 21) + ((dest_width / 16) << 25) +
+ (pFont->IsVertical() << 31));
+ else {
+ key = (FX_LPVOID)(FX_UINTPTR)glyph_index;
+ }
+ if (m_PathMap.Lookup(key, (FX_LPVOID&)pGlyphPath)) {
+ return pGlyphPath;
+ }
+ pGlyphPath = pFont->LoadGlyphPath(glyph_index, dest_width);
+ m_PathMap.SetAt(key, pGlyphPath);
+ return pGlyphPath;
+}
+typedef struct {
+ FX_BOOL m_bCount;
+ int m_PointCount;
+ FX_PATHPOINT* m_pPoints;
+ int m_CurX;
+ int m_CurY;
+ FX_FLOAT m_CoordUnit;
+} OUTLINE_PARAMS;
+void _Outline_CheckEmptyContour(OUTLINE_PARAMS* param)
+{
+ if (param->m_PointCount >= 2 && param->m_pPoints[param->m_PointCount - 2].m_Flag == FXPT_MOVETO &&
+ param->m_pPoints[param->m_PointCount - 2].m_PointX == param->m_pPoints[param->m_PointCount - 1].m_PointX &&
+ param->m_pPoints[param->m_PointCount - 2].m_PointY == param->m_pPoints[param->m_PointCount - 1].m_PointY) {
+ param->m_PointCount -= 2;
+ }
+ if (param->m_PointCount >= 4 && param->m_pPoints[param->m_PointCount - 4].m_Flag == FXPT_MOVETO &&
+ param->m_pPoints[param->m_PointCount - 3].m_Flag == FXPT_BEZIERTO &&
+ param->m_pPoints[param->m_PointCount - 3].m_PointX == param->m_pPoints[param->m_PointCount - 4].m_PointX &&
+ param->m_pPoints[param->m_PointCount - 3].m_PointY == param->m_pPoints[param->m_PointCount - 4].m_PointY &&
+ param->m_pPoints[param->m_PointCount - 2].m_PointX == param->m_pPoints[param->m_PointCount - 4].m_PointX &&
+ param->m_pPoints[param->m_PointCount - 2].m_PointY == param->m_pPoints[param->m_PointCount - 4].m_PointY &&
+ param->m_pPoints[param->m_PointCount - 1].m_PointX == param->m_pPoints[param->m_PointCount - 4].m_PointX &&
+ param->m_pPoints[param->m_PointCount - 1].m_PointY == param->m_pPoints[param->m_PointCount - 4].m_PointY) {
+ param->m_PointCount -= 4;
+ }
+}
+extern "C" {
+ static int _Outline_MoveTo(const FXFT_Vector* to, void* user)
+ {
+ OUTLINE_PARAMS* param = (OUTLINE_PARAMS*)user;
+ if (!param->m_bCount) {
+ _Outline_CheckEmptyContour(param);
+ param->m_pPoints[param->m_PointCount].m_PointX = to->x / param->m_CoordUnit;
+ param->m_pPoints[param->m_PointCount].m_PointY = to->y / param->m_CoordUnit;
+ param->m_pPoints[param->m_PointCount].m_Flag = FXPT_MOVETO;
+ param->m_CurX = to->x;
+ param->m_CurY = to->y;
+ if (param->m_PointCount) {
+ param->m_pPoints[param->m_PointCount - 1].m_Flag |= FXPT_CLOSEFIGURE;
+ }
+ }
+ param->m_PointCount ++;
+ return 0;
+ }
+};
+extern "C" {
+ static int _Outline_LineTo(const FXFT_Vector* to, void* user)
+ {
+ OUTLINE_PARAMS* param = (OUTLINE_PARAMS*)user;
+ if (!param->m_bCount) {
+ param->m_pPoints[param->m_PointCount].m_PointX = to->x / param->m_CoordUnit;
+ param->m_pPoints[param->m_PointCount].m_PointY = to->y / param->m_CoordUnit;
+ param->m_pPoints[param->m_PointCount].m_Flag = FXPT_LINETO;
+ param->m_CurX = to->x;
+ param->m_CurY = to->y;
+ }
+ param->m_PointCount ++;
+ return 0;
+ }
+};
+extern "C" {
+ static int _Outline_ConicTo(const FXFT_Vector* control, const FXFT_Vector* to, void* user)
+ {
+ OUTLINE_PARAMS* param = (OUTLINE_PARAMS*)user;
+ if (!param->m_bCount) {
+ param->m_pPoints[param->m_PointCount].m_PointX = (param->m_CurX + (control->x - param->m_CurX) * 2 / 3) / param->m_CoordUnit;
+ param->m_pPoints[param->m_PointCount].m_PointY = (param->m_CurY + (control->y - param->m_CurY) * 2 / 3) / param->m_CoordUnit;
+ param->m_pPoints[param->m_PointCount].m_Flag = FXPT_BEZIERTO;
+ param->m_pPoints[param->m_PointCount + 1].m_PointX = (control->x + (to->x - control->x) / 3) / param->m_CoordUnit;
+ param->m_pPoints[param->m_PointCount + 1].m_PointY = (control->y + (to->y - control->y) / 3) / param->m_CoordUnit;
+ param->m_pPoints[param->m_PointCount + 1].m_Flag = FXPT_BEZIERTO;
+ param->m_pPoints[param->m_PointCount + 2].m_PointX = to->x / param->m_CoordUnit;
+ param->m_pPoints[param->m_PointCount + 2].m_PointY = to->y / param->m_CoordUnit;
+ param->m_pPoints[param->m_PointCount + 2].m_Flag = FXPT_BEZIERTO;
+ param->m_CurX = to->x;
+ param->m_CurY = to->y;
+ }
+ param->m_PointCount += 3;
+ return 0;
+ }
+};
+extern "C" {
+ static int _Outline_CubicTo(const FXFT_Vector* control1, const FXFT_Vector* control2, const FXFT_Vector* to, void* user)
+ {
+ OUTLINE_PARAMS* param = (OUTLINE_PARAMS*)user;
+ if (!param->m_bCount) {
+ param->m_pPoints[param->m_PointCount].m_PointX = control1->x / param->m_CoordUnit;
+ param->m_pPoints[param->m_PointCount].m_PointY = control1->y / param->m_CoordUnit;
+ param->m_pPoints[param->m_PointCount].m_Flag = FXPT_BEZIERTO;
+ param->m_pPoints[param->m_PointCount + 1].m_PointX = control2->x / param->m_CoordUnit;
+ param->m_pPoints[param->m_PointCount + 1].m_PointY = control2->y / param->m_CoordUnit;
+ param->m_pPoints[param->m_PointCount + 1].m_Flag = FXPT_BEZIERTO;
+ param->m_pPoints[param->m_PointCount + 2].m_PointX = to->x / param->m_CoordUnit;
+ param->m_pPoints[param->m_PointCount + 2].m_PointY = to->y / param->m_CoordUnit;
+ param->m_pPoints[param->m_PointCount + 2].m_Flag = FXPT_BEZIERTO;
+ param->m_CurX = to->x;
+ param->m_CurY = to->y;
+ }
+ param->m_PointCount += 3;
+ return 0;
+ }
+};
+CFX_PathData* CFX_Font::LoadGlyphPath(FX_DWORD glyph_index, int dest_width)
+{
+ if (m_Face == NULL) {
+ return NULL;
+ }
+ FXFT_Set_Pixel_Sizes(m_Face, 0, 64);
+ FXFT_Matrix ft_matrix = {65536, 0, 0, 65536};
+ if (m_pSubstFont) {
+ if (m_pSubstFont->m_ItalicAngle) {
+ int skew = m_pSubstFont->m_ItalicAngle;
+ skew = skew <= -30 ? -58 : -g_AngleSkew[-skew];
+ if (m_bVertical) {
+ ft_matrix.yx += ft_matrix.yy * skew / 100;
+ } else {
+ ft_matrix.xy += -ft_matrix.xx * skew / 100;
+ }
+ }
+ if (m_pSubstFont->m_SubstFlags & FXFONT_SUBST_MM) {
+ AdjustMMParams(glyph_index, dest_width, m_pSubstFont->m_Weight);
+ }
+ }
+ int transflag = FXFT_Get_Face_Internal_Flag(m_Face);
+ FXFT_Set_Transform(m_Face, &ft_matrix, 0);
+ int load_flags = (m_Face->face_flags & FT_FACE_FLAG_SFNT) ? FXFT_LOAD_NO_BITMAP : FXFT_LOAD_NO_BITMAP | FT_LOAD_NO_HINTING;
+ int error = FXFT_Load_Glyph(m_Face, glyph_index, load_flags);
+ if (error) {
+ FXFT_Set_Face_Internal_Flag(m_Face, transflag);
+ return NULL;
+ }
+ if (m_pSubstFont && !(m_pSubstFont->m_SubstFlags & FXFONT_SUBST_MM) && m_pSubstFont->m_Weight > 400) {
+ int level = 0;
+ if (m_pSubstFont->m_Charset == FXFONT_SHIFTJIS_CHARSET) {
+ level = g_WeightPow_SHIFTJIS[(m_pSubstFont->m_Weight - 400) / 10] * 2 * 65536 / 36655;
+ } else {
+ level = g_WeightPow[(m_pSubstFont->m_Weight - 400) / 10] * 2;
+ }
+ FXFT_Outline_Embolden(FXFT_Get_Glyph_Outline(m_Face), level);
+ }
+ FXFT_Outline_Funcs funcs;
+ funcs.move_to = _Outline_MoveTo;
+ funcs.line_to = _Outline_LineTo;
+ funcs.conic_to = _Outline_ConicTo;
+ funcs.cubic_to = _Outline_CubicTo;
+ funcs.shift = 0;
+ funcs.delta = 0;
+ OUTLINE_PARAMS params;
+ params.m_bCount = TRUE;
+ params.m_PointCount = 0;
+ FXFT_Outline_Decompose(FXFT_Get_Glyph_Outline(m_Face), &funcs, &params);
+ if (params.m_PointCount == 0) {
+ FXFT_Set_Face_Internal_Flag(m_Face, transflag);
+ return NULL;
+ }
+ CFX_PathData* pPath = FX_NEW CFX_PathData;
+ if (!pPath) {
+ return NULL;
+ }
+ pPath->SetPointCount(params.m_PointCount);
+ params.m_bCount = FALSE;
+ params.m_PointCount = 0;
+ params.m_pPoints = pPath->GetPoints();
+ params.m_CurX = params.m_CurY = 0;
+ params.m_CoordUnit = 64 * 64.0;
+ FXFT_Outline_Decompose(FXFT_Get_Glyph_Outline(m_Face), &funcs, &params);
+ _Outline_CheckEmptyContour(&params);
+ pPath->TrimPoints(params.m_PointCount);
+ if (params.m_PointCount) {
+ pPath->GetPoints()[params.m_PointCount - 1].m_Flag |= FXPT_CLOSEFIGURE;
+ }
+ FXFT_Set_Face_Internal_Flag(m_Face, transflag);
+ return pPath;
+}
+void _CFX_UniqueKeyGen::Generate(int count, ...)
+{
+ va_list argList;
+ va_start(argList, count);
+ for (int i = 0; i < count; i ++) {
+ int p = va_arg(argList, int);
+ ((FX_DWORD*)m_Key)[i] = p;
+ }
+ va_end(argList);
+ m_KeyLen = count * sizeof(FX_DWORD);
+}
diff --git a/core/src/fxge/ge/text_int.h b/core/src/fxge/ge/text_int.h
index 7608f8a2ed..a3c9417bfc 100644
--- a/core/src/fxge/ge/text_int.h
+++ b/core/src/fxge/ge/text_int.h
@@ -1,100 +1,100 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-struct _CFX_UniqueKeyGen {
- void Generate(int count, ...);
- FX_CHAR m_Key[128];
- int m_KeyLen;
-};
-class CFX_SizeGlyphCache : public CFX_Object
-{
-public:
- CFX_SizeGlyphCache()
- {
- m_GlyphMap.InitHashTable(253);
- }
- ~CFX_SizeGlyphCache();
- CFX_MapPtrToPtr m_GlyphMap;
-};
-class CTTFontDesc : public CFX_Object
-{
-public:
- CTTFontDesc()
- {
- m_Type = 0;
- m_pFontData = NULL;
- m_RefCount = 0;
- }
- ~CTTFontDesc();
- FX_BOOL ReleaseFace(FXFT_Face face);
- int m_Type;
- union {
- struct {
- FX_BOOL m_bItalic;
- FX_BOOL m_bBold;
- FXFT_Face m_pFace;
- } m_SingleFace;
- struct {
- FXFT_Face m_pFaces[16];
- } m_TTCFace;
- };
- FX_BYTE* m_pFontData;
- int m_RefCount;
-};
-class CFX_UnicodeEncoding : public IFX_FontEncoding
-{
-public:
- CFX_UnicodeEncoding(CFX_Font* pFont);
- virtual FX_DWORD GlyphFromCharCodeEx(FX_DWORD charcode, int encoding = ENCODING_UNICODE);
-private:
- CFX_Font* m_pFont;
- virtual FX_DWORD GlyphFromCharCode(FX_DWORD charcode);
- virtual CFX_WideString UnicodeFromCharCode(FX_DWORD charcode) const
- {
- return CFX_WideString((FX_WCHAR)charcode);
- }
- virtual FX_DWORD CharCodeFromUnicode(FX_WCHAR Unicode) const
- {
- return Unicode;
- }
- virtual FX_BOOL IsUnicodeCompatible() const
- {
- return TRUE;
- }
-};
-#define CHARSET_FLAG_ANSI 1
-#define CHARSET_FLAG_SYMBOL 2
-#define CHARSET_FLAG_SHIFTJIS 4
-#define CHARSET_FLAG_BIG5 8
-#define CHARSET_FLAG_GB 16
-#define CHARSET_FLAG_KOREAN 32
-class CFontFaceInfo : public CFX_Object
-{
-public:
- CFX_ByteString m_FilePath;
- CFX_ByteString m_FaceName;
- FX_DWORD m_Styles;
- FX_DWORD m_Charsets;
- FX_DWORD m_FontOffset;
- FX_DWORD m_FileSize;
- CFX_ByteString m_FontTables;
-};
-class CFontFileFaceInfo : public CFX_Object
-{
-public:
- CFontFileFaceInfo();
- ~CFontFileFaceInfo();
- IFX_FileStream* m_pFile;
- FXFT_Face m_Face;
- CFX_ByteString m_FaceName;
- FX_DWORD m_Charsets;
- FX_DWORD m_FileSize;
- FX_DWORD m_FontOffset;
- int m_Weight;
- FX_BOOL m_bItalic;
- int m_PitchFamily;
- CFX_ByteString m_FontTables;
-};
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+struct _CFX_UniqueKeyGen {
+ void Generate(int count, ...);
+ FX_CHAR m_Key[128];
+ int m_KeyLen;
+};
+class CFX_SizeGlyphCache : public CFX_Object
+{
+public:
+ CFX_SizeGlyphCache()
+ {
+ m_GlyphMap.InitHashTable(253);
+ }
+ ~CFX_SizeGlyphCache();
+ CFX_MapPtrToPtr m_GlyphMap;
+};
+class CTTFontDesc : public CFX_Object
+{
+public:
+ CTTFontDesc()
+ {
+ m_Type = 0;
+ m_pFontData = NULL;
+ m_RefCount = 0;
+ }
+ ~CTTFontDesc();
+ FX_BOOL ReleaseFace(FXFT_Face face);
+ int m_Type;
+ union {
+ struct {
+ FX_BOOL m_bItalic;
+ FX_BOOL m_bBold;
+ FXFT_Face m_pFace;
+ } m_SingleFace;
+ struct {
+ FXFT_Face m_pFaces[16];
+ } m_TTCFace;
+ };
+ FX_BYTE* m_pFontData;
+ int m_RefCount;
+};
+class CFX_UnicodeEncoding : public IFX_FontEncoding
+{
+public:
+ CFX_UnicodeEncoding(CFX_Font* pFont);
+ virtual FX_DWORD GlyphFromCharCodeEx(FX_DWORD charcode, int encoding = ENCODING_UNICODE);
+private:
+ CFX_Font* m_pFont;
+ virtual FX_DWORD GlyphFromCharCode(FX_DWORD charcode);
+ virtual CFX_WideString UnicodeFromCharCode(FX_DWORD charcode) const
+ {
+ return CFX_WideString((FX_WCHAR)charcode);
+ }
+ virtual FX_DWORD CharCodeFromUnicode(FX_WCHAR Unicode) const
+ {
+ return Unicode;
+ }
+ virtual FX_BOOL IsUnicodeCompatible() const
+ {
+ return TRUE;
+ }
+};
+#define CHARSET_FLAG_ANSI 1
+#define CHARSET_FLAG_SYMBOL 2
+#define CHARSET_FLAG_SHIFTJIS 4
+#define CHARSET_FLAG_BIG5 8
+#define CHARSET_FLAG_GB 16
+#define CHARSET_FLAG_KOREAN 32
+class CFontFaceInfo : public CFX_Object
+{
+public:
+ CFX_ByteString m_FilePath;
+ CFX_ByteString m_FaceName;
+ FX_DWORD m_Styles;
+ FX_DWORD m_Charsets;
+ FX_DWORD m_FontOffset;
+ FX_DWORD m_FileSize;
+ CFX_ByteString m_FontTables;
+};
+class CFontFileFaceInfo : public CFX_Object
+{
+public:
+ CFontFileFaceInfo();
+ ~CFontFileFaceInfo();
+ IFX_FileStream* m_pFile;
+ FXFT_Face m_Face;
+ CFX_ByteString m_FaceName;
+ FX_DWORD m_Charsets;
+ FX_DWORD m_FileSize;
+ FX_DWORD m_FontOffset;
+ int m_Weight;
+ FX_BOOL m_bItalic;
+ int m_PitchFamily;
+ CFX_ByteString m_FontTables;
+};
diff --git a/core/src/fxge/win32/dwrite_int.h b/core/src/fxge/win32/dwrite_int.h
index 1f0770d0bf..2eecc7c76b 100644
--- a/core/src/fxge/win32/dwrite_int.h
+++ b/core/src/fxge/win32/dwrite_int.h
@@ -1,59 +1,59 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef _FX_DIRECT_WRITE_
-#define _FX_DIRECT_WRITE_
-#ifndef DECLSPEC_UUID
-#if (_MSC_VER >= 1100) && defined (__cplusplus)
-#define DECLSPEC_UUID(x) __declspec(uuid(x))
-#else
-#define DECLSPEC_UUID(x)
-#endif
-#endif
-#ifndef DECLSPEC_NOVTABLE
-#if (_MSC_VER >= 1100) && defined(__cplusplus)
-#define DECLSPEC_NOVTABLE __declspec(novtable)
-#else
-#define DECLSPEC_NOVTABLE
-#endif
-#endif
-#if(WINVER < 0x0500)
-#ifndef _MAC
-DECLARE_HANDLE(HMONITOR);
-#endif
-#endif
-class CDWriteExt
-{
-public:
- CDWriteExt();
- ~CDWriteExt();
-
- void Load();
- void Unload();
-
- FX_BOOL IsAvailable()
- {
- return m_pDWriteFactory != NULL;
- }
-
- void* DwCreateFontFaceFromStream(FX_LPBYTE pData, FX_DWORD size, int simulation_style);
- FX_BOOL DwCreateRenderingTarget(CFX_DIBitmap* pSrc, void** renderTarget);
- void DwDeleteRenderingTarget(void* renderTarget);
- FX_BOOL DwRendingString(void* renderTarget, CFX_ClipRgn* pClipRgn, FX_RECT& stringRect, CFX_AffineMatrix* pMatrix,
- void *font, FX_FLOAT font_size, FX_ARGB text_color,
- int glyph_count, unsigned short* glyph_indices,
- FX_FLOAT baselineOriginX, FX_FLOAT baselineOriginY,
- void* glyph_offsets,
- FX_FLOAT* glyph_advances);
- void DwDeleteFont(void* pFont);
-
-protected:
- void* m_hModule;
- void* m_pDWriteFactory;
- void* m_pDwFontContext;
- void* m_pDwTextRenderer;
-};
-#endif
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FX_DIRECT_WRITE_
+#define _FX_DIRECT_WRITE_
+#ifndef DECLSPEC_UUID
+#if (_MSC_VER >= 1100) && defined (__cplusplus)
+#define DECLSPEC_UUID(x) __declspec(uuid(x))
+#else
+#define DECLSPEC_UUID(x)
+#endif
+#endif
+#ifndef DECLSPEC_NOVTABLE
+#if (_MSC_VER >= 1100) && defined(__cplusplus)
+#define DECLSPEC_NOVTABLE __declspec(novtable)
+#else
+#define DECLSPEC_NOVTABLE
+#endif
+#endif
+#if(WINVER < 0x0500)
+#ifndef _MAC
+DECLARE_HANDLE(HMONITOR);
+#endif
+#endif
+class CDWriteExt
+{
+public:
+ CDWriteExt();
+ ~CDWriteExt();
+
+ void Load();
+ void Unload();
+
+ FX_BOOL IsAvailable()
+ {
+ return m_pDWriteFactory != NULL;
+ }
+
+ void* DwCreateFontFaceFromStream(FX_LPBYTE pData, FX_DWORD size, int simulation_style);
+ FX_BOOL DwCreateRenderingTarget(CFX_DIBitmap* pSrc, void** renderTarget);
+ void DwDeleteRenderingTarget(void* renderTarget);
+ FX_BOOL DwRendingString(void* renderTarget, CFX_ClipRgn* pClipRgn, FX_RECT& stringRect, CFX_AffineMatrix* pMatrix,
+ void *font, FX_FLOAT font_size, FX_ARGB text_color,
+ int glyph_count, unsigned short* glyph_indices,
+ FX_FLOAT baselineOriginX, FX_FLOAT baselineOriginY,
+ void* glyph_offsets,
+ FX_FLOAT* glyph_advances);
+ void DwDeleteFont(void* pFont);
+
+protected:
+ void* m_hModule;
+ void* m_pDWriteFactory;
+ void* m_pDwFontContext;
+ void* m_pDwTextRenderer;
+};
+#endif
diff --git a/core/src/fxge/win32/fx_win32_device.cpp b/core/src/fxge/win32/fx_win32_device.cpp
index e3f5ae0609..592886249b 100644
--- a/core/src/fxge/win32/fx_win32_device.cpp
+++ b/core/src/fxge/win32/fx_win32_device.cpp
@@ -1,1200 +1,1200 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../../include/fxge/fx_ge.h"
-#if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_
-#include "../../../include/fxge/fx_ge_win32.h"
-#include <crtdbg.h>
-#include "../agg/include/fxfx_agg_clip_liang_barsky.h"
-#include "dwrite_int.h"
-#include "win32_int.h"
-#include "../ge/text_int.h"
-#include "../dib/dib_int.h"
-#include "../agg/include/fx_agg_driver.h"
-#include "../../../include/fxge/fx_freetype.h"
-#include "../../../include/fxcodec/fx_codec.h"
-class CWin32FontInfo : public IFX_SystemFontInfo
-{
-public:
- CWin32FontInfo();
- ~CWin32FontInfo();
- virtual void Release();
- virtual FX_BOOL EnumFontList(CFX_FontMapper* pMapper);
- virtual void* MapFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR face, FX_BOOL& bExact);
- virtual void* GetFont(FX_LPCSTR face)
- {
- return NULL;
- }
- virtual FX_DWORD GetFontData(void* hFont, FX_DWORD table, FX_LPBYTE buffer, FX_DWORD size);
- virtual void DeleteFont(void* hFont);
- virtual FX_BOOL GetFaceName(void* hFont, CFX_ByteString& name);
- virtual FX_BOOL GetFontCharset(void* hFont, int& charset);
- FX_BOOL IsOpenTypeFromDiv(const LOGFONTA *plf);
- FX_BOOL IsSupportFontFormDiv(const LOGFONTA* plf);
- void AddInstalledFont(const LOGFONTA *plf, FX_DWORD FontType);
- void GetGBPreference(CFX_ByteString& face, int weight, int picth_family);
- void GetJapanesePreference(CFX_ByteString& face, int weight, int picth_family);
- CFX_ByteString FindFont(const CFX_ByteString& name);
- HDC m_hDC;
- CFX_FontMapper* m_pMapper;
- CFX_ByteString m_LastFamily;
- CFX_ByteString m_KaiTi, m_FangSong;
-};
-CWin32FontInfo::CWin32FontInfo()
-{
- m_hDC = CreateCompatibleDC(NULL);
-}
-CWin32FontInfo::~CWin32FontInfo()
-{
- m_pMapper = NULL;
-}
-void CWin32FontInfo::Release()
-{
- DeleteDC(m_hDC);
- delete this;
-}
-#define TT_MAKE_TAG(x1, x2, x3, x4) (((FX_DWORD)x1<<24)|((FX_DWORD)x2<<16)|((FX_DWORD)x3<<8)|(FX_DWORD)x4)
-FX_BOOL CWin32FontInfo::IsOpenTypeFromDiv(const LOGFONTA *plf)
-{
- HFONT hFont = CreateFontIndirectA(plf);
- FX_BOOL ret = FALSE;
- FX_DWORD font_size = GetFontData(hFont, 0, NULL, 0);
- if (font_size != GDI_ERROR && font_size >= sizeof(FX_DWORD)) {
- FX_DWORD lVersion = 0;
- GetFontData(hFont, 0, (FX_BYTE*)(&lVersion), sizeof(FX_DWORD));
- lVersion = (((FX_DWORD)(FX_BYTE)(lVersion)) << 24) | ((FX_DWORD)((FX_BYTE)(lVersion >> 8))) << 16 |
- ((FX_DWORD)((FX_BYTE)(lVersion >> 16))) << 8 | ((FX_BYTE)(lVersion >> 24));
- if (lVersion == TT_MAKE_TAG('O', 'T', 'T', 'O') ||
- lVersion == 0x00010000 ||
- lVersion == TT_MAKE_TAG('t', 't', 'c', 'f') ||
- lVersion == TT_MAKE_TAG('t', 'r', 'u', 'e') ||
- lVersion == 0x00020000) {
- ret = TRUE;
- }
- }
- DeleteFont(hFont);
- return ret;
-}
-FX_BOOL CWin32FontInfo::IsSupportFontFormDiv(const LOGFONTA* plf)
-{
- HFONT hFont = CreateFontIndirectA(plf);
- FX_BOOL ret = FALSE;
- FX_DWORD font_size = GetFontData(hFont, 0, NULL, 0);
- if (font_size != GDI_ERROR && font_size >= sizeof(FX_DWORD)) {
- FX_DWORD lVersion = 0;
- GetFontData(hFont, 0, (FX_BYTE*)(&lVersion), sizeof(FX_DWORD));
- lVersion = (((FX_DWORD)(FX_BYTE)(lVersion)) << 24) | ((FX_DWORD)((FX_BYTE)(lVersion >> 8))) << 16 |
- ((FX_DWORD)((FX_BYTE)(lVersion >> 16))) << 8 | ((FX_BYTE)(lVersion >> 24));
- if (lVersion == TT_MAKE_TAG('O', 'T', 'T', 'O') ||
- lVersion == 0x00010000 ||
- lVersion == TT_MAKE_TAG('t', 't', 'c', 'f') ||
- lVersion == TT_MAKE_TAG('t', 'r', 'u', 'e') ||
- lVersion == 0x00020000) {
- ret = TRUE;
- } else if ((lVersion & 0xFFFF0000) == TT_MAKE_TAG(0x80, 0x01, 0x00, 0x00) ||
- (lVersion & 0xFFFF0000) == TT_MAKE_TAG('%', '!', 0, 0)) {
- ret = TRUE;
- }
- }
- DeleteFont(hFont);
- return ret;
-}
-void CWin32FontInfo::AddInstalledFont(const LOGFONTA *plf, FX_DWORD FontType)
-{
- CFX_ByteString name(plf->lfFaceName, -1);
- if (name[0] == '@') {
- return;
- }
- if (name == m_LastFamily) {
- m_pMapper->AddInstalledFont(name, plf->lfCharSet);
- return;
- }
- if (!(FontType & TRUETYPE_FONTTYPE) && !(FontType & DEVICE_FONTTYPE)) {
- return;
- }
- if (!(FontType & TRUETYPE_FONTTYPE)) {
- if (!IsSupportFontFormDiv(plf)) {
- return;
- }
- }
- m_pMapper->AddInstalledFont(name, plf->lfCharSet);
- m_LastFamily = name;
-}
-static int CALLBACK FontEnumProc(
- const LOGFONTA *plf,
- const TEXTMETRICA *lpntme,
- FX_DWORD FontType,
- LPARAM lParam
-)
-{
- CWin32FontInfo* pFontInfo = (CWin32FontInfo*)lParam;
- if (pFontInfo->m_pMapper->GetFontEnumerator()) {
- pFontInfo->m_pMapper->GetFontEnumerator()->HitFont();
- }
- pFontInfo->AddInstalledFont(plf, FontType);
- return 1;
-}
-FX_BOOL CWin32FontInfo::EnumFontList(CFX_FontMapper* pMapper)
-{
- m_pMapper = pMapper;
- LOGFONTA lf;
- FXSYS_memset32(&lf, 0, sizeof(LOGFONTA));
- lf.lfCharSet = DEFAULT_CHARSET;
- lf.lfFaceName[0] = 0;
- lf.lfPitchAndFamily = 0;
- EnumFontFamiliesExA(m_hDC, &lf, (FONTENUMPROCA)FontEnumProc, (FX_UINTPTR)this, 0);
- if (pMapper->GetFontEnumerator()) {
- pMapper->GetFontEnumerator()->Finish();
- }
- return TRUE;
-}
-static const struct {
- FX_LPCSTR m_pFaceName;
- FX_LPCSTR m_pVariantName;
-}
-VariantNames[] = {
- {"DFKai-SB", "\x19\x6A\x77\x69\xD4\x9A"},
-};
-static const struct {
- FX_LPCSTR m_pName;
- FX_LPCSTR m_pWinName;
- FX_BOOL m_bBold;
- FX_BOOL m_bItalic;
-}
-Base14Substs[] = {
- {"Courier", "Courier New", FALSE, FALSE},
- {"Courier-Bold", "Courier New", TRUE, FALSE},
- {"Courier-BoldOblique", "Courier New", TRUE, TRUE},
- {"Courier-Oblique", "Courier New", FALSE, TRUE},
- {"Helvetica", "Arial", FALSE, FALSE},
- {"Helvetica-Bold", "Arial", TRUE, FALSE},
- {"Helvetica-BoldOblique", "Arial", TRUE, TRUE},
- {"Helvetica-Oblique", "Arial", FALSE, TRUE},
- {"Times-Roman", "Times New Roman", FALSE, FALSE},
- {"Times-Bold", "Times New Roman", TRUE, FALSE},
- {"Times-BoldItalic", "Times New Roman", TRUE, TRUE},
- {"Times-Italic", "Times New Roman", FALSE, TRUE},
-};
-CFX_ByteString CWin32FontInfo::FindFont(const CFX_ByteString& name)
-{
- if (m_pMapper == NULL) {
- return name;
- }
- int nFonts = m_pMapper->m_InstalledTTFonts.GetSize();
- for (int i = 0; i < nFonts; i ++) {
- CFX_ByteString thisname = m_pMapper->m_InstalledTTFonts[i];
- if (thisname[0] == ' ') {
- if (thisname.Mid(1, name.GetLength()) == name) {
- return m_pMapper->m_InstalledTTFonts[i + 1];
- }
- } else if (thisname.Left(name.GetLength()) == name) {
- return m_pMapper->m_InstalledTTFonts[i];
- }
- }
- return CFX_ByteString();
-}
-struct _FontNameMap {
- FX_LPCSTR m_pSubFontName;
- FX_LPCSTR m_pSrcFontName;
-};
-const _FontNameMap g_JpFontNameMap[] = {
- {"MS Mincho", "Heiseimin-W3"},
- {"MS Gothic", "Jun101-Light"},
-};
-const _FontNameMap g_GbFontNameMap[1];
-extern "C" {
- static int compareString(const void* key, const void* element)
- {
- return FXSYS_stricmp((FX_LPCSTR)key, ((_FontNameMap*)element)->m_pSrcFontName);
- }
-}
-FX_BOOL _GetSubFontName(CFX_ByteString& name, int lang)
-{
- int size = sizeof g_JpFontNameMap;
- void* pFontnameMap = (void*)g_JpFontNameMap;
- if (lang == 1) {
- size = sizeof g_GbFontNameMap;
- pFontnameMap = (void*)g_GbFontNameMap;
- } else if (lang == 2) {
- size = 0;
- }
- _FontNameMap* found = (_FontNameMap*)FXSYS_bsearch((FX_LPCSTR)name, pFontnameMap,
- size / sizeof (_FontNameMap), sizeof (_FontNameMap), compareString);
- if (found == NULL) {
- return FALSE;
- }
- name = found->m_pSubFontName;
- return TRUE;
-}
-void CWin32FontInfo::GetGBPreference(CFX_ByteString& face, int weight, int picth_family)
-{
- if (face.Find("KaiTi") >= 0 || face.Find("\xbf\xac") >= 0) {
- if (m_KaiTi.IsEmpty()) {
- m_KaiTi = FindFont("KaiTi");
- if (m_KaiTi.IsEmpty()) {
- m_KaiTi = "SimSun";
- }
- }
- face = m_KaiTi;
- } else if (face.Find("FangSong") >= 0 || face.Find("\xb7\xc2\xcb\xce") >= 0) {
- if (m_FangSong.IsEmpty()) {
- m_FangSong = FindFont("FangSong");
- if (m_FangSong.IsEmpty()) {
- m_FangSong = "SimSun";
- }
- }
- face = m_FangSong;
- } else if (face.Find("SimSun") >= 0 || face.Find("\xcb\xce") >= 0) {
- face = "SimSun";
- } else if (face.Find("SimHei") >= 0 || face.Find("\xba\xda") >= 0) {
- face = "SimHei";
- } else if (!(picth_family & FF_ROMAN) && weight > 550) {
- face = "SimHei";
- } else {
- face = "SimSun";
- }
-}
-void CWin32FontInfo::GetJapanesePreference(CFX_ByteString& face, int weight, int picth_family)
-{
- if (face.Find("Gothic") >= 0 || face.Find("\x83\x53\x83\x56\x83\x62\x83\x4e") >= 0) {
- if (face.Find("PGothic") >= 0 || face.Find("\x82\x6f\x83\x53\x83\x56\x83\x62\x83\x4e") >= 0) {
- face = "MS PGothic";
- } else if (face.Find("UI Gothic") >= 0) {
- face = "MS UI Gothic";
- } else {
- if (face.Find("HGSGothicM") >= 0 || face.Find("HGMaruGothicMPRO") >= 0) {
- face = "MS PGothic";
- } else {
- face = "MS Gothic";
- }
- }
- return;
- } else if (face.Find("Mincho") >= 0 || face.Find("\x96\xbe\x92\xa9") >= 0) {
- if (face.Find("PMincho") >= 0 || face.Find("\x82\x6f\x96\xbe\x92\xa9") >= 0) {
- face = "MS PMincho";
- } else {
- face = "MS Mincho";
- }
- return;
- }
- if (_GetSubFontName(face, 0)) {
- return;
- }
- if (!(picth_family & FF_ROMAN) && weight > 400) {
- face = "MS PGothic";
- } else {
- face = "MS PMincho";
- }
-}
-void* CWin32FontInfo::MapFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR cstr_face, FX_BOOL& bExact)
-{
- CFX_ByteString face = cstr_face;
- int iBaseFont;
- for (iBaseFont = 0; iBaseFont < 12; iBaseFont ++)
- if (face == CFX_ByteStringC(Base14Substs[iBaseFont].m_pName)) {
- face = Base14Substs[iBaseFont].m_pWinName;
- weight = Base14Substs[iBaseFont].m_bBold ? FW_BOLD : FW_NORMAL;
- bItalic = Base14Substs[iBaseFont].m_bItalic;
- bExact = TRUE;
- break;
- }
- if (charset == ANSI_CHARSET || charset == SYMBOL_CHARSET) {
- charset = DEFAULT_CHARSET;
- }
- int subst_pitch_family = pitch_family;
- switch (charset) {
- case SHIFTJIS_CHARSET:
- subst_pitch_family = FF_ROMAN;
- break;
- case CHINESEBIG5_CHARSET:
- case HANGUL_CHARSET:
- case GB2312_CHARSET:
- subst_pitch_family = 0;
- break;
- }
- HFONT hFont = ::CreateFontA(-10, 0, 0, 0, weight, bItalic, 0, 0, charset, OUT_TT_ONLY_PRECIS,
- 0, 0, subst_pitch_family, face);
- char facebuf[100];
- HFONT hOldFont = (HFONT)::SelectObject(m_hDC, hFont);
- int ret = ::GetTextFaceA(m_hDC, 100, facebuf);
- ::SelectObject(m_hDC, hOldFont);
- if (face.EqualNoCase(facebuf)) {
- return hFont;
- }
- int iCount = sizeof(VariantNames) / sizeof(VariantNames[0]);
- for (int i = 0; i < iCount; ++i) {
- if (face == VariantNames[i].m_pFaceName) {
- CFX_WideString wsFace = CFX_WideString::FromLocal(facebuf);
- CFX_WideString wsName = CFX_WideString::FromUTF16LE((const unsigned short*)VariantNames[i].m_pVariantName);
- if (wsFace == wsName) {
- return hFont;
- }
- }
- }
- ::DeleteObject(hFont);
- if (charset == DEFAULT_CHARSET) {
- return NULL;
- }
- switch (charset) {
- case SHIFTJIS_CHARSET:
- GetJapanesePreference(face, weight, pitch_family);
- break;
- case GB2312_CHARSET:
- GetGBPreference(face, weight, pitch_family);
- break;
- case HANGUL_CHARSET:
- face = "Gulim";
- break;
- case CHINESEBIG5_CHARSET:
- if (face.Find("MSung") >= 0) {
- face = "MingLiU";
- } else {
- face = "PMingLiU";
- }
- break;
- }
- hFont = ::CreateFontA(-10, 0, 0, 0, weight, bItalic, 0, 0, charset, OUT_TT_ONLY_PRECIS,
- 0, 0, subst_pitch_family, face);
- return hFont;
-}
-void CWin32FontInfo::DeleteFont(void* hFont)
-{
- ::DeleteObject(hFont);
-}
-FX_DWORD CWin32FontInfo::GetFontData(void* hFont, FX_DWORD table, FX_LPBYTE buffer, FX_DWORD size)
-{
- HFONT hOldFont = (HFONT)::SelectObject(m_hDC, (HFONT)hFont);
- table = FXDWORD_FROM_MSBFIRST(table);
- size = ::GetFontData(m_hDC, table, 0, buffer, size);
- ::SelectObject(m_hDC, hOldFont);
- if (size == GDI_ERROR) {
- return 0;
- }
- return size;
-}
-FX_BOOL CWin32FontInfo::GetFaceName(void* hFont, CFX_ByteString& name)
-{
- char facebuf[100];
- HFONT hOldFont = (HFONT)::SelectObject(m_hDC, (HFONT)hFont);
- int ret = ::GetTextFaceA(m_hDC, 100, facebuf);
- ::SelectObject(m_hDC, hOldFont);
- if (ret == 0) {
- return FALSE;
- }
- name = facebuf;
- return TRUE;
-}
-FX_BOOL CWin32FontInfo::GetFontCharset(void* hFont, int& charset)
-{
- TEXTMETRIC tm;
- HFONT hOldFont = (HFONT)::SelectObject(m_hDC, (HFONT)hFont);
- ::GetTextMetrics(m_hDC, &tm);
- ::SelectObject(m_hDC, hOldFont);
- charset = tm.tmCharSet;
- return TRUE;
-}
-#ifndef _FPDFAPI_MINI_
-IFX_SystemFontInfo* IFX_SystemFontInfo::CreateDefault()
-{
- return FX_NEW CWin32FontInfo;
-}
-#endif
-void CFX_GEModule::InitPlatform()
-{
- CWin32Platform* pPlatformData = FX_NEW CWin32Platform;
- if (!pPlatformData) {
- return;
- }
- OSVERSIONINFO ver;
- ver.dwOSVersionInfoSize = sizeof(ver);
- GetVersionEx(&ver);
- pPlatformData->m_bHalfTone = ver.dwMajorVersion >= 5;
- pPlatformData->m_GdiplusExt.Load();
- m_pPlatformData = pPlatformData;
- m_pFontMgr->SetSystemFontInfo(IFX_SystemFontInfo::CreateDefault());
-}
-void CFX_GEModule::DestroyPlatform()
-{
- if (m_pPlatformData) {
- delete (CWin32Platform*)m_pPlatformData;
- }
- m_pPlatformData = NULL;
-}
-CGdiDeviceDriver::CGdiDeviceDriver(HDC hDC, int device_class)
-{
- m_hDC = hDC;
- m_DeviceClass = device_class;
- CWin32Platform* pPlatform = (CWin32Platform*)CFX_GEModule::Get()->GetPlatformData();
- SetStretchBltMode(hDC, pPlatform->m_bHalfTone ? HALFTONE : COLORONCOLOR);
- if (GetObjectType(m_hDC) == OBJ_MEMDC) {
- HBITMAP hBitmap = CreateBitmap(1, 1, 1, 1, NULL);
- hBitmap = (HBITMAP)SelectObject(m_hDC, hBitmap);
- BITMAP bitmap;
- GetObject(hBitmap, sizeof bitmap, &bitmap);
- m_nBitsPerPixel = bitmap.bmBitsPixel;
- m_Width = bitmap.bmWidth;
- m_Height = abs(bitmap.bmHeight);
- hBitmap = (HBITMAP)SelectObject(m_hDC, hBitmap);
- DeleteObject(hBitmap);
- } else {
- m_nBitsPerPixel = ::GetDeviceCaps(m_hDC, BITSPIXEL);
- m_Width = ::GetDeviceCaps(m_hDC, HORZRES);
- m_Height = ::GetDeviceCaps(m_hDC, VERTRES);
- }
- if (m_DeviceClass != FXDC_DISPLAY) {
- m_RenderCaps = FXRC_BIT_MASK;
- } else {
- m_RenderCaps = FXRC_GET_BITS | FXRC_BIT_MASK;
- }
-}
-int CGdiDeviceDriver::GetDeviceCaps(int caps_id)
-{
- switch (caps_id) {
- case FXDC_DEVICE_CLASS:
- return m_DeviceClass;
- case FXDC_PIXEL_WIDTH:
- return m_Width;
- case FXDC_PIXEL_HEIGHT:
- return m_Height;
- case FXDC_BITS_PIXEL:
- return m_nBitsPerPixel;
- case FXDC_RENDER_CAPS:
- return m_RenderCaps;
- }
- return 0;
-}
-FX_LPVOID CGdiDeviceDriver::GetClipRgn()
-{
- HRGN hClipRgn = CreateRectRgn(0, 0, 1, 1);
- if (::GetClipRgn(m_hDC, hClipRgn) == 0) {
- DeleteObject(hClipRgn);
- hClipRgn = NULL;
- }
- return (FX_LPVOID)hClipRgn;
-}
-FX_BOOL CGdiDeviceDriver::GDI_SetDIBits(const CFX_DIBitmap* pBitmap1, const FX_RECT* pSrcRect, int left, int top, void* pIccTransform)
-{
- if (m_DeviceClass == FXDC_PRINTER) {
- CFX_DIBitmap* pBitmap = pBitmap1->FlipImage(FALSE, TRUE);
- if (pBitmap == NULL) {
- return FALSE;
- }
- if ((pBitmap->IsCmykImage() || pIccTransform) &&
- !pBitmap->ConvertFormat(FXDIB_Rgb, pIccTransform)) {
- return FALSE;
- }
- int width = pSrcRect->Width(), height = pSrcRect->Height();
- int pitch = pBitmap->GetPitch();
- LPBYTE pBuffer = pBitmap->GetBuffer();
- CFX_ByteString info = CFX_WindowsDIB::GetBitmapInfo(pBitmap);
- ((BITMAPINFOHEADER*)(FX_LPCSTR)info)->biHeight *= -1;
- FX_RECT dst_rect(0, 0, width, height);
- dst_rect.Intersect(0, 0, pBitmap->GetWidth(), pBitmap->GetHeight());
- int dst_width = dst_rect.Width();
- int dst_height = dst_rect.Height();
- ::StretchDIBits(m_hDC, left, top, dst_width, dst_height,
- 0, 0, dst_width, dst_height, pBuffer, (BITMAPINFO*)(FX_LPCSTR)info, DIB_RGB_COLORS, SRCCOPY);
- delete pBitmap;
- } else {
- CFX_DIBitmap* pBitmap = (CFX_DIBitmap*)pBitmap1;
- if ((pBitmap->IsCmykImage() || pIccTransform) &&
- (pBitmap = pBitmap->CloneConvert(FXDIB_Rgb, NULL, pIccTransform)) == NULL) {
- return FALSE;
- }
- int width = pSrcRect->Width(), height = pSrcRect->Height();
- int pitch = pBitmap->GetPitch();
- LPBYTE pBuffer = pBitmap->GetBuffer();
- CFX_ByteString info = CFX_WindowsDIB::GetBitmapInfo(pBitmap);
- ::SetDIBitsToDevice(m_hDC, left, top, width, height, pSrcRect->left, pBitmap->GetHeight() - pSrcRect->bottom,
- 0, pBitmap->GetHeight(), pBuffer, (BITMAPINFO*)(FX_LPCSTR)info, DIB_RGB_COLORS);
- if (pBitmap != pBitmap1) {
- delete pBitmap;
- }
- }
- return TRUE;
-}
-FX_BOOL CGdiDeviceDriver::GDI_StretchDIBits(const CFX_DIBitmap* pBitmap1, int dest_left, int dest_top,
- int dest_width, int dest_height, FX_DWORD flags, void* pIccTransform)
-{
- CFX_DIBitmap* pBitmap = (CFX_DIBitmap*)pBitmap1;
- if (pBitmap == NULL) {
- return FALSE;
- }
- if ((pBitmap->IsCmykImage() || pIccTransform) &&
- !pBitmap->ConvertFormat(FXDIB_Rgb, pIccTransform)) {
- return FALSE;
- }
- CFX_ByteString info = CFX_WindowsDIB::GetBitmapInfo(pBitmap);
- if (abs(dest_width) * abs(dest_height) < pBitmap1->GetWidth() * pBitmap1->GetHeight() * 4 ||
- (flags & FXDIB_INTERPOL) || (flags & FXDIB_BICUBIC_INTERPOL)) {
- SetStretchBltMode(m_hDC, HALFTONE);
- } else {
- SetStretchBltMode(m_hDC, COLORONCOLOR);
- }
- CFX_DIBitmap* pToStrechBitmap = pBitmap;
- bool del = false;
- if (m_DeviceClass == FXDC_PRINTER && (pBitmap->GetWidth() * pBitmap->GetHeight() > abs(dest_width) * abs(dest_height))) {
- pToStrechBitmap = pBitmap->StretchTo(dest_width, dest_height);
- del = true;
- }
- CFX_ByteString toStrechBitmapInfo = CFX_WindowsDIB::GetBitmapInfo(pToStrechBitmap);
- ::StretchDIBits(m_hDC, dest_left, dest_top, dest_width, dest_height,
- 0, 0, pToStrechBitmap->GetWidth(), pToStrechBitmap->GetHeight(), pToStrechBitmap->GetBuffer(),
- (BITMAPINFO*)(FX_LPCSTR)toStrechBitmapInfo, DIB_RGB_COLORS, SRCCOPY);
- if (del) {
- delete pToStrechBitmap;
- }
- return TRUE;
-}
-FX_BOOL CGdiDeviceDriver::GDI_StretchBitMask(const CFX_DIBitmap* pBitmap1, int dest_left, int dest_top,
- int dest_width, int dest_height, FX_DWORD bitmap_color, FX_DWORD flags,
- int alpha_flag, void* pIccTransform)
-{
- CFX_DIBitmap* pBitmap = (CFX_DIBitmap*)pBitmap1;
- if (pBitmap == NULL) {
- return FALSE;
- }
- _Color2Argb(bitmap_color, bitmap_color, alpha_flag | (1 << 24), pIccTransform);
- int width = pBitmap->GetWidth(), height = pBitmap->GetHeight();
- struct {
- BITMAPINFOHEADER bmiHeader;
- FX_DWORD bmiColors[2];
- } bmi;
- FXSYS_memset32(&bmi.bmiHeader, 0, sizeof (BITMAPINFOHEADER));
- bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
- bmi.bmiHeader.biBitCount = 1;
- bmi.bmiHeader.biCompression = BI_RGB;
- bmi.bmiHeader.biHeight = -height;
- bmi.bmiHeader.biPlanes = 1;
- bmi.bmiHeader.biWidth = width;
- if (m_nBitsPerPixel != 1) {
- SetStretchBltMode(m_hDC, HALFTONE);
- }
- bmi.bmiColors[0] = 0xffffff;
- bmi.bmiColors[1] = 0;
- ::StretchDIBits(m_hDC, dest_left, dest_top, dest_width, dest_height,
- 0, 0, width, height, pBitmap->GetBuffer(), (BITMAPINFO*)&bmi, DIB_RGB_COLORS, SRCAND);
- return TRUE;
-}
-BOOL CGdiDeviceDriver::GetClipBox(FX_RECT* pRect)
-{
- return ::GetClipBox(m_hDC, (RECT*)pRect);
-}
-FX_BOOL CGdiDeviceDriver::SetClipRgn(FX_LPVOID hRgn)
-{
- ::SelectClipRgn(m_hDC, (HRGN)hRgn);
- return TRUE;
-}
-static HPEN _CreatePen(const CFX_GraphStateData* pGraphState, const CFX_AffineMatrix* pMatrix, FX_DWORD argb)
-{
- FX_FLOAT width;
- FX_FLOAT scale = 1.f;
- if (pMatrix)
- scale = FXSYS_fabs(pMatrix->a) > FXSYS_fabs(pMatrix->b) ?
- FXSYS_fabs(pMatrix->a) : FXSYS_fabs(pMatrix->b);
- if (pGraphState) {
- width = scale * pGraphState->m_LineWidth;
- } else {
- width = 1.0f;
- }
- FX_DWORD PenStyle = PS_GEOMETRIC;
- if (width < 1) {
- width = 1;
- }
- if(pGraphState->m_DashCount) {
- PenStyle |= PS_USERSTYLE;
- } else {
- PenStyle |= PS_SOLID;
- }
- switch(pGraphState->m_LineCap) {
- case 0:
- PenStyle |= PS_ENDCAP_FLAT;
- break;
- case 1:
- PenStyle |= PS_ENDCAP_ROUND;
- break;
- case 2:
- PenStyle |= PS_ENDCAP_SQUARE;
- break;
- }
- switch(pGraphState->m_LineJoin) {
- case 0:
- PenStyle |= PS_JOIN_MITER;
- break;
- case 1:
- PenStyle |= PS_JOIN_ROUND;
- break;
- case 2:
- PenStyle |= PS_JOIN_BEVEL;
- break;
- }
- int a;
- FX_COLORREF rgb;
- ArgbDecode(argb, a, rgb);
- LOGBRUSH lb;
- lb.lbColor = rgb;
- lb.lbStyle = BS_SOLID;
- lb.lbHatch = 0;
- FX_DWORD* pDash = NULL;
- if (pGraphState->m_DashCount) {
- pDash = FX_Alloc(FX_DWORD, pGraphState->m_DashCount);
- if (!pDash) {
- return NULL;
- }
- for (int i = 0; i < pGraphState->m_DashCount; i ++) {
- pDash[i] = FXSYS_round(pMatrix ? pMatrix->TransformDistance(pGraphState->m_DashArray[i]) : pGraphState->m_DashArray[i]);
- if (pDash[i] < 1) {
- pDash[i] = 1;
- }
- }
- }
- HPEN hPen = ExtCreatePen(PenStyle, (DWORD)FXSYS_ceil(width), &lb, pGraphState->m_DashCount, (const DWORD*)pDash);
- if (pDash) {
- FX_Free(pDash);
- }
- return hPen;
-}
-static HBRUSH _CreateBrush(FX_DWORD argb)
-{
- int a;
- FX_COLORREF rgb;
- ArgbDecode(argb, a, rgb);
- return CreateSolidBrush(rgb);
-}
-static void _SetPathToDC(HDC hDC, const CFX_PathData* pPathData, const CFX_AffineMatrix* pMatrix)
-{
- BeginPath(hDC);
- int nPoints = pPathData->GetPointCount();
- FX_PATHPOINT* pPoints = pPathData->GetPoints();
- for(int i = 0; i < nPoints; i++) {
- FX_FLOAT posx = pPoints[i].m_PointX, posy = pPoints[i].m_PointY;
- if (pMatrix) {
- pMatrix->Transform(posx, posy);
- }
- int screen_x = FXSYS_round(posx), screen_y = FXSYS_round(posy);
- int point_type = pPoints[i].m_Flag & FXPT_TYPE;
- if(point_type == PT_MOVETO) {
- MoveToEx(hDC, screen_x, screen_y, NULL);
- } else if(point_type == PT_LINETO) {
- if (pPoints[i].m_PointY == pPoints[i - 1].m_PointY && pPoints[i].m_PointX == pPoints[i - 1].m_PointX) {
- screen_x ++;
- }
- LineTo(hDC, screen_x, screen_y);
- } else if(point_type == PT_BEZIERTO) {
- POINT lppt[3];
- lppt[0].x = screen_x;
- lppt[0].y = screen_y;
- posx = pPoints[i + 1].m_PointX;
- posy = pPoints[i + 1].m_PointY;
- if (pMatrix) {
- pMatrix->Transform(posx, posy);
- }
- lppt[1].x = FXSYS_round(posx);
- lppt[1].y = FXSYS_round(posy);
- posx = pPoints[i + 2].m_PointX;
- posy = pPoints[i + 2].m_PointY;
- if (pMatrix) {
- pMatrix->Transform(posx, posy);
- }
- lppt[2].x = FXSYS_round(posx);
- lppt[2].y = FXSYS_round(posy);
- PolyBezierTo(hDC, lppt, 3);
- i += 2;
- }
- if (pPoints[i].m_Flag & PT_CLOSEFIGURE) {
- CloseFigure(hDC);
- }
- }
- EndPath(hDC);
-}
-void CGdiDeviceDriver::DrawLine(FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2)
-{
- int flag1 = (x1 < 0) | ((x1 > m_Width) << 1) | ((y1 < 0) << 2) | ((y1 > m_Height) << 3);
- int flag2 = (x2 < 0) | ((x2 > m_Width) << 1) | ((y2 < 0) << 2) | ((y2 > m_Height) << 3);
- if (flag1 & flag2) {
- return;
- }
- if (flag1 || flag2) {
- agg::rect_base<FX_FLOAT> rect(0.0f, 0.0f, (FX_FLOAT)(m_Width), (FX_FLOAT)(m_Height));
- FX_FLOAT x[2], y[2];
- int np = agg::clip_liang_barsky<FX_FLOAT>(x1, y1, x2, y2, rect, x, y);
- if (np == 0) {
- return;
- }
- if (np == 1) {
- x2 = x[0];
- y2 = y[0];
- } else {
- x1 = x[0];
- y1 = y[0];
- x2 = x[np - 1];
- y2 = y[np - 1];
- }
- }
- MoveToEx(m_hDC, FXSYS_round(x1), FXSYS_round(y1), NULL);
- LineTo(m_hDC, FXSYS_round(x2), FXSYS_round(y2));
-}
-static FX_BOOL _MatrixNoScaled(const CFX_AffineMatrix* pMatrix)
-{
- return pMatrix->GetA() == 1.0f && pMatrix->GetB() == 0 && pMatrix->GetC() == 0 && pMatrix->GetD() == 1.0f;
-}
-FX_BOOL CGdiDeviceDriver::DrawPath(const CFX_PathData* pPathData,
- const CFX_AffineMatrix* pMatrix,
- const CFX_GraphStateData* pGraphState,
- FX_DWORD fill_color,
- FX_DWORD stroke_color,
- int fill_mode,
- int alpha_flag,
- void* pIccTransform,
- int blend_type
- )
-{
- if (blend_type != FXDIB_BLEND_NORMAL) {
- return FALSE;
- }
- _Color2Argb(fill_color, fill_color, alpha_flag | (1 << 24), pIccTransform);
- _Color2Argb(stroke_color, stroke_color, alpha_flag, pIccTransform);
- CWin32Platform* pPlatform = (CWin32Platform*)CFX_GEModule::Get()->GetPlatformData();
- if ((pGraphState == NULL || stroke_color == 0) && !pPlatform->m_GdiplusExt.IsAvailable()) {
- CFX_FloatRect bbox_f = pPathData->GetBoundingBox();
- if (pMatrix) {
- bbox_f.Transform(pMatrix);
- }
- FX_RECT bbox = bbox_f.GetInnerRect();
- if (bbox.Width() <= 0) {
- return DrawCosmeticLine((FX_FLOAT)(bbox.left), (FX_FLOAT)(bbox.top), (FX_FLOAT)(bbox.left), (FX_FLOAT)(bbox.bottom + 1), fill_color,
- alpha_flag, pIccTransform, FXDIB_BLEND_NORMAL);
- } else if (bbox.Height() <= 0) {
- return DrawCosmeticLine((FX_FLOAT)(bbox.left), (FX_FLOAT)(bbox.top), (FX_FLOAT)(bbox.right + 1), (FX_FLOAT)(bbox.top), fill_color,
- alpha_flag, pIccTransform, FXDIB_BLEND_NORMAL);
- }
- }
- int fill_alpha = FXARGB_A(fill_color);
- int stroke_alpha = FXARGB_A(stroke_color);
- FX_BOOL bDrawAlpha = (fill_alpha > 0 && fill_alpha < 255) || (stroke_alpha > 0 && stroke_alpha < 255 && pGraphState);
- if (!pPlatform->m_GdiplusExt.IsAvailable() && bDrawAlpha) {
- return FALSE;
- }
- if (pPlatform->m_GdiplusExt.IsAvailable()) {
- if (bDrawAlpha || ((m_DeviceClass != FXDC_PRINTER && !(fill_mode & FXFILL_FULLCOVER)) || pGraphState && pGraphState->m_DashCount)) {
- if ( !((NULL == pMatrix || _MatrixNoScaled(pMatrix)) &&
- pGraphState && pGraphState->m_LineWidth == 1.f &&
- (pPathData->GetPointCount() == 5 || pPathData->GetPointCount() == 4) &&
- pPathData->IsRect()) ) {
- if (pPlatform->m_GdiplusExt.DrawPath(m_hDC, pPathData, pMatrix, pGraphState, fill_color, stroke_color, fill_mode)) {
- return TRUE;
- }
- }
- }
- }
- int old_fill_mode = fill_mode;
- fill_mode &= 3;
- HPEN hPen = NULL;
- HBRUSH hBrush = NULL;
- if (pGraphState && stroke_alpha) {
- SetMiterLimit(m_hDC, pGraphState->m_MiterLimit, NULL);
- hPen = _CreatePen(pGraphState, pMatrix, stroke_color);
- hPen = (HPEN)SelectObject(m_hDC, hPen);
- }
- if (fill_mode && fill_alpha) {
- SetPolyFillMode(m_hDC, fill_mode);
- hBrush = _CreateBrush(fill_color);
- hBrush = (HBRUSH)SelectObject(m_hDC, hBrush);
- }
- if (pPathData->GetPointCount() == 2 && pGraphState && pGraphState->m_DashCount) {
- FX_FLOAT x1 = pPathData->GetPointX(0), y1 = pPathData->GetPointY(0);
- if (pMatrix) {
- pMatrix->Transform(x1, y1);
- }
- FX_FLOAT x2 = pPathData->GetPointX(1), y2 = pPathData->GetPointY(1);
- if (pMatrix) {
- pMatrix->Transform(x2, y2);
- }
- DrawLine(x1, y1, x2, y2);
- } else {
- _SetPathToDC(m_hDC, pPathData, pMatrix);
- if (pGraphState && stroke_alpha) {
- if (fill_mode && fill_alpha) {
- if (old_fill_mode & FX_FILL_TEXT_MODE) {
- StrokeAndFillPath(m_hDC);
- } else {
- FillPath(m_hDC);
- _SetPathToDC(m_hDC, pPathData, pMatrix);
- StrokePath(m_hDC);
- }
- } else {
- StrokePath(m_hDC);
- }
- } else if (fill_mode && fill_alpha) {
- FillPath(m_hDC);
- }
- }
- if (hPen) {
- hPen = (HPEN)SelectObject(m_hDC, hPen);
- DeleteObject(hPen);
- }
- if (hBrush) {
- hBrush = (HBRUSH)SelectObject(m_hDC, hBrush);
- DeleteObject(hBrush);
- }
- return TRUE;
-}
-FX_BOOL CGdiDeviceDriver::FillRect(const FX_RECT* pRect, FX_DWORD fill_color, int alpha_flag, void* pIccTransform, int blend_type)
-{
- if (blend_type != FXDIB_BLEND_NORMAL) {
- return FALSE;
- }
- _Color2Argb(fill_color, fill_color, alpha_flag | (1 << 24), pIccTransform);
- int alpha;
- FX_COLORREF rgb;
- ArgbDecode(fill_color, alpha, rgb);
- if (alpha == 0) {
- return TRUE;
- }
- if (alpha < 255) {
- return FALSE;
- }
- HBRUSH hBrush = CreateSolidBrush(rgb);
- ::FillRect(m_hDC, (RECT*)pRect, hBrush);
- DeleteObject(hBrush);
- return TRUE;
-}
-FX_BOOL CGdiDeviceDriver::SetClip_PathFill(const CFX_PathData* pPathData,
- const CFX_AffineMatrix* pMatrix,
- int fill_mode
- )
-{
- if (pPathData->GetPointCount() == 5) {
- CFX_FloatRect rectf;
- if (pPathData->IsRect(pMatrix, &rectf)) {
- FX_RECT rect = rectf.GetOutterRect();
- IntersectClipRect(m_hDC, rect.left, rect.top, rect.right, rect.bottom);
- return TRUE;
- }
- }
- _SetPathToDC(m_hDC, pPathData, pMatrix);
- SetPolyFillMode(m_hDC, fill_mode & 3);
- SelectClipPath(m_hDC, RGN_AND);
- return TRUE;
-}
-FX_BOOL CGdiDeviceDriver::SetClip_PathStroke(const CFX_PathData* pPathData,
- const CFX_AffineMatrix* pMatrix,
- const CFX_GraphStateData* pGraphState
- )
-{
- HPEN hPen = _CreatePen(pGraphState, pMatrix, 0xff000000);
- hPen = (HPEN)SelectObject(m_hDC, hPen);
- _SetPathToDC(m_hDC, pPathData, pMatrix);
- WidenPath(m_hDC);
- SetPolyFillMode(m_hDC, WINDING);
- FX_BOOL ret = SelectClipPath(m_hDC, RGN_AND);
- hPen = (HPEN)SelectObject(m_hDC, hPen);
- DeleteObject(hPen);
- return ret;
-}
-FX_BOOL CGdiDeviceDriver::DrawCosmeticLine(FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2, FX_DWORD color,
- int alpha_flag, void* pIccTransform, int blend_type)
-{
- if (blend_type != FXDIB_BLEND_NORMAL) {
- return FALSE;
- }
- _Color2Argb(color, color, alpha_flag | (1 << 24), pIccTransform);
- int a;
- FX_COLORREF rgb;
- ArgbDecode(color, a, rgb);
- if (a == 0) {
- return TRUE;
- }
- HPEN hPen = CreatePen(PS_SOLID, 1, rgb);
- hPen = (HPEN)SelectObject(m_hDC, hPen);
- MoveToEx(m_hDC, FXSYS_round(x1), FXSYS_round(y1), NULL);
- LineTo(m_hDC, FXSYS_round(x2), FXSYS_round(y2));
- hPen = (HPEN)SelectObject(m_hDC, hPen);
- DeleteObject(hPen);
- return TRUE;
-}
-FX_BOOL CGdiDeviceDriver::DeleteDeviceRgn(FX_LPVOID pRgn)
-{
- DeleteObject((HGDIOBJ)pRgn);
- return TRUE;
-}
-CGdiDisplayDriver::CGdiDisplayDriver(HDC hDC) : CGdiDeviceDriver(hDC, FXDC_DISPLAY)
-{
- CWin32Platform* pPlatform = (CWin32Platform*)CFX_GEModule::Get()->GetPlatformData();
- if (pPlatform->m_GdiplusExt.IsAvailable()) {
- m_RenderCaps |= FXRC_ALPHA_PATH | FXRC_ALPHA_IMAGE;
- }
-}
-FX_BOOL CGdiDisplayDriver::GetDIBits(CFX_DIBitmap* pBitmap, int left, int top, void* pIccTransform, FX_BOOL bDEdge)
-{
- FX_BOOL ret = FALSE;
- int width = pBitmap->GetWidth();
- int height = pBitmap->GetHeight();
- HBITMAP hbmp = CreateCompatibleBitmap(m_hDC, width, height);
- HDC hDCMemory = CreateCompatibleDC(m_hDC);
- HBITMAP holdbmp = (HBITMAP)SelectObject(hDCMemory, hbmp);
- BitBlt(hDCMemory, 0, 0, width, height, m_hDC, left, top, SRCCOPY);
- SelectObject(hDCMemory, holdbmp);
- BITMAPINFO bmi;
- FXSYS_memset32(&bmi, 0, sizeof bmi);
- bmi.bmiHeader.biSize = sizeof bmi.bmiHeader;
- bmi.bmiHeader.biBitCount = pBitmap->GetBPP();
- bmi.bmiHeader.biHeight = -height;
- bmi.bmiHeader.biPlanes = 1;
- bmi.bmiHeader.biWidth = width;
- if (!CFX_GEModule::Get()->GetCodecModule() || !CFX_GEModule::Get()->GetCodecModule()->GetIccModule()) {
- pIccTransform = NULL;
- }
- if (pBitmap->GetBPP() > 8 && !pBitmap->IsCmykImage() && pIccTransform == NULL) {
- ret = ::GetDIBits(hDCMemory, hbmp, 0, height, pBitmap->GetBuffer(), &bmi, DIB_RGB_COLORS) == height;
- } else {
- CFX_DIBitmap bitmap;
- if (bitmap.Create(width, height, FXDIB_Rgb)) {
- bmi.bmiHeader.biBitCount = 24;
- ::GetDIBits(hDCMemory, hbmp, 0, height, bitmap.GetBuffer(), &bmi, DIB_RGB_COLORS);
- ret = pBitmap->TransferBitmap(0, 0, width, height, &bitmap, 0, 0, pIccTransform);
- } else {
- ret = FALSE;
- }
- }
-#ifndef _FPDFAPI_MINI_
- if (pBitmap->HasAlpha() && ret) {
- pBitmap->LoadChannel(FXDIB_Alpha, 0xff);
- }
-#endif
- DeleteObject(hbmp);
- DeleteObject(hDCMemory);
- return ret;
-}
-FX_BOOL CGdiDisplayDriver::SetDIBits(const CFX_DIBSource* pSource, FX_DWORD color, const FX_RECT* pSrcRect, int left, int top, int blend_type,
- int alpha_flag, void* pIccTransform)
-{
- ASSERT(blend_type == FXDIB_BLEND_NORMAL);
- if (pSource->IsAlphaMask()) {
- int width = pSource->GetWidth(), height = pSource->GetHeight();
- int alpha = FXGETFLAG_COLORTYPE(alpha_flag) ? FXGETFLAG_ALPHA_FILL(alpha_flag) : FXARGB_A(color);
- FX_BOOL bGDI = pSource->GetBPP() == 1 && alpha == 255;
- if (!bGDI) {
- CFX_DIBitmap background;
- if (!background.Create(width, height, FXDIB_Rgb32) ||
- !GetDIBits(&background, left, top, NULL) ||
- !background.CompositeMask(0, 0, width, height, pSource, color, 0, 0, FXDIB_BLEND_NORMAL, NULL, FALSE, alpha_flag, pIccTransform)) {
- return FALSE;
- }
- FX_RECT src_rect(0, 0, width, height);
- return SetDIBits(&background, 0, &src_rect, left, top, FXDIB_BLEND_NORMAL, 0, NULL);
- }
- FX_RECT clip_rect(left, top, left + pSrcRect->Width(), top + pSrcRect->Height());
- return StretchDIBits(pSource, color, left - pSrcRect->left, top - pSrcRect->top, width, height,
- &clip_rect, 0, alpha_flag, pIccTransform, FXDIB_BLEND_NORMAL);
- } else {
- int width = pSrcRect->Width(), height = pSrcRect->Height();
- if (pSource->HasAlpha()) {
- CFX_DIBitmap bitmap;
- if (!bitmap.Create(width, height, FXDIB_Rgb) ||
- !GetDIBits(&bitmap, left, top, NULL) ||
- !bitmap.CompositeBitmap(0, 0, width, height, pSource, pSrcRect->left, pSrcRect->top, FXDIB_BLEND_NORMAL, NULL, FALSE, pIccTransform)) {
- return FALSE;
- }
- FX_RECT src_rect(0, 0, width, height);
- return SetDIBits(&bitmap, 0, &src_rect, left, top, FXDIB_BLEND_NORMAL, 0, NULL);
- }
- CFX_DIBExtractor temp(pSource);
- CFX_DIBitmap* pBitmap = temp;
- if (pBitmap) {
- return GDI_SetDIBits(pBitmap, pSrcRect, left, top, pIccTransform);
- }
- }
- return FALSE;
-}
-FX_BOOL CGdiDisplayDriver::UseFoxitStretchEngine(const CFX_DIBSource* pSource, FX_DWORD color, int dest_left, int dest_top,
- int dest_width, int dest_height, const FX_RECT* pClipRect, int render_flags,
- int alpha_flag, void* pIccTransform, int blend_type)
-{
- FX_RECT bitmap_clip = *pClipRect;
- if (dest_width < 0) {
- dest_left += dest_width;
- }
- if (dest_height < 0) {
- dest_top += dest_height;
- }
- bitmap_clip.Offset(-dest_left, -dest_top);
- CFX_DIBitmap* pStretched = pSource->StretchTo(dest_width, dest_height, render_flags, &bitmap_clip);
- if (pStretched == NULL) {
- return TRUE;
- }
- FX_RECT src_rect(0, 0, pStretched->GetWidth(), pStretched->GetHeight());
- FX_BOOL ret = SetDIBits(pStretched, color, &src_rect, pClipRect->left, pClipRect->top, FXDIB_BLEND_NORMAL, alpha_flag, pIccTransform);
- delete pStretched;
- return ret;
-}
-FX_BOOL CGdiDisplayDriver::StretchDIBits(const CFX_DIBSource* pSource, FX_DWORD color, int dest_left, int dest_top,
- int dest_width, int dest_height, const FX_RECT* pClipRect, FX_DWORD flags,
- int alpha_flag, void* pIccTransform, int blend_type)
-{
- ASSERT(pSource != NULL && pClipRect != NULL);
- if (flags || dest_width > 10000 || dest_width < -10000 || dest_height > 10000 || dest_height < -10000)
- return UseFoxitStretchEngine(pSource, color, dest_left, dest_top, dest_width, dest_height,
- pClipRect, flags, alpha_flag, pIccTransform, blend_type);
- if (pSource->IsAlphaMask()) {
- FX_RECT image_rect;
- image_rect.left = dest_width > 0 ? dest_left : dest_left + dest_width;
- image_rect.right = dest_width > 0 ? dest_left + dest_width : dest_left;
- image_rect.top = dest_height > 0 ? dest_top : dest_top + dest_height;
- image_rect.bottom = dest_height > 0 ? dest_top + dest_height : dest_top;
- FX_RECT clip_rect = image_rect;
- clip_rect.Intersect(*pClipRect);
- clip_rect.Offset(-image_rect.left, -image_rect.top);
- int clip_width = clip_rect.Width(), clip_height = clip_rect.Height();
- CFX_DIBitmap* pStretched = pSource->StretchTo(dest_width, dest_height, flags, &clip_rect);
- if (pStretched == NULL) {
- return TRUE;
- }
- CFX_DIBitmap background;
- if (!background.Create(clip_width, clip_height, FXDIB_Rgb32) ||
- !GetDIBits(&background, image_rect.left + clip_rect.left, image_rect.top + clip_rect.top, NULL) ||
- !background.CompositeMask(0, 0, clip_width, clip_height, pStretched, color, 0, 0, FXDIB_BLEND_NORMAL, NULL, FALSE, alpha_flag, pIccTransform)) {
- delete pStretched;
- return FALSE;
- }
- FX_RECT src_rect(0, 0, clip_width, clip_height);
- FX_BOOL ret = SetDIBits(&background, 0, &src_rect, image_rect.left + clip_rect.left, image_rect.top + clip_rect.top, FXDIB_BLEND_NORMAL, 0, NULL);
- delete pStretched;
- return ret;
- } else {
- if (pSource->HasAlpha()) {
- CWin32Platform* pPlatform = (CWin32Platform*)CFX_GEModule::Get()->GetPlatformData();
- if (pPlatform->m_GdiplusExt.IsAvailable() && pIccTransform == NULL && !pSource->IsCmykImage()) {
- CFX_DIBExtractor temp(pSource);
- CFX_DIBitmap* pBitmap = temp;
- if (pBitmap == NULL) {
- return FALSE;
- }
- return pPlatform->m_GdiplusExt.StretchDIBits(m_hDC, pBitmap, dest_left, dest_top, dest_width, dest_height, pClipRect, flags);
- }
- return UseFoxitStretchEngine(pSource, color, dest_left, dest_top, dest_width, dest_height,
- pClipRect, flags, alpha_flag, pIccTransform, blend_type);
- }
- CFX_DIBExtractor temp(pSource);
- CFX_DIBitmap* pBitmap = temp;
- if (pBitmap) {
- return GDI_StretchDIBits(pBitmap, dest_left, dest_top, dest_width, dest_height, flags, pIccTransform);
- }
- }
- return FALSE;
-}
-#define GET_PS_FEATURESETTING 4121
-#define FEATURESETTING_PSLEVEL 2
-int GetPSLevel(HDC hDC)
-{
- int device_type = ::GetDeviceCaps(hDC, TECHNOLOGY);
- if (device_type != DT_RASPRINTER) {
- return 0;
- }
- FX_DWORD esc = GET_PS_FEATURESETTING;
- if (ExtEscape(hDC, QUERYESCSUPPORT, sizeof esc, (char*)&esc, 0, NULL)) {
- int param = FEATURESETTING_PSLEVEL;
- if (ExtEscape(hDC, GET_PS_FEATURESETTING, sizeof(int), (char*)&param, sizeof(int), (char*)&param) > 0) {
- return param;
- }
- }
- esc = POSTSCRIPT_IDENTIFY;
- if (ExtEscape(hDC, QUERYESCSUPPORT, sizeof esc, (char*)&esc, 0, NULL) == 0) {
- esc = POSTSCRIPT_DATA;
- if (ExtEscape(hDC, QUERYESCSUPPORT, sizeof esc, (char*)&esc, 0, NULL)) {
- return 2;
- }
- return 0;
- }
- esc = PSIDENT_GDICENTRIC;
- if (ExtEscape(hDC, POSTSCRIPT_IDENTIFY, sizeof(FX_DWORD), (char*)&esc, 0, NULL) <= 0) {
- return 2;
- }
- esc = GET_PS_FEATURESETTING;
- if (ExtEscape(hDC, QUERYESCSUPPORT, sizeof esc, (char*)&esc, 0, NULL)) {
- int param = FEATURESETTING_PSLEVEL;
- if (ExtEscape(hDC, GET_PS_FEATURESETTING, sizeof(int), (char*)&param, sizeof(int), (char*)&param) > 0) {
- return param;
- }
- }
- return 2;
-}
-int CFX_WindowsDevice::m_psLevel = 2;
-CFX_WindowsDevice::CFX_WindowsDevice(HDC hDC, FX_BOOL bCmykOutput, FX_BOOL bForcePSOutput, int psLevel)
-{
- m_bForcePSOutput = bForcePSOutput;
- m_psLevel = psLevel;
- if (bForcePSOutput) {
- IFX_RenderDeviceDriver* pDriver = FX_NEW CPSPrinterDriver;
- if (!pDriver) {
- return;
- }
- ((CPSPrinterDriver*)pDriver)->Init(hDC, psLevel, bCmykOutput);
- SetDeviceDriver(pDriver);
- return;
- }
- SetDeviceDriver(CreateDriver(hDC, bCmykOutput));
-}
-HDC CFX_WindowsDevice::GetDC() const
-{
- IFX_RenderDeviceDriver *pRDD = GetDeviceDriver();
- if (!pRDD) {
- return NULL;
- }
- return (HDC)pRDD->GetPlatformSurface();
-}
-IFX_RenderDeviceDriver* CFX_WindowsDevice::CreateDriver(HDC hDC, FX_BOOL bCmykOutput)
-{
- int device_type = ::GetDeviceCaps(hDC, TECHNOLOGY);
- int obj_type = ::GetObjectType(hDC);
- int device_class;
- if (device_type == DT_RASPRINTER || device_type == DT_PLOTTER || obj_type == OBJ_ENHMETADC) {
- device_class = FXDC_PRINTER;
- } else {
- device_class = FXDC_DISPLAY;
- }
- return FX_NEW CGdiDisplayDriver(hDC);
-}
-CFX_WinBitmapDevice::CFX_WinBitmapDevice(int width, int height, FXDIB_Format format)
-{
- BITMAPINFOHEADER bmih;
- FXSYS_memset32(&bmih, 0, sizeof (BITMAPINFOHEADER));
- bmih.biSize = sizeof(BITMAPINFOHEADER);
- bmih.biBitCount = format & 0xff;
- bmih.biHeight = -height;
- bmih.biPlanes = 1;
- bmih.biWidth = width;
- FX_LPBYTE pBuffer;
- m_hBitmap = CreateDIBSection(NULL, (BITMAPINFO*)&bmih, DIB_RGB_COLORS, (FX_LPVOID*)&pBuffer, NULL, 0);
- if (m_hBitmap == NULL) {
- return;
- }
- CFX_DIBitmap* pBitmap = FX_NEW CFX_DIBitmap;
- if (!pBitmap) {
- return;
- }
- pBitmap->Create(width, height, format, pBuffer);
- SetBitmap(pBitmap);
- m_hDC = ::CreateCompatibleDC(NULL);
- m_hOldBitmap = (HBITMAP)SelectObject(m_hDC, m_hBitmap);
- IFX_RenderDeviceDriver* pDriver = FX_NEW CGdiDisplayDriver(m_hDC);
- if (!pDriver) {
- return;
- }
- SetDeviceDriver(pDriver);
-}
-CFX_WinBitmapDevice::~CFX_WinBitmapDevice()
-{
- if (m_hDC) {
- SelectObject(m_hDC, m_hOldBitmap);
- DeleteDC(m_hDC);
- }
- if (m_hBitmap) {
- DeleteObject(m_hBitmap);
- }
- delete GetBitmap();
-}
-#endif
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxge/fx_ge.h"
+#if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_
+#include "../../../include/fxge/fx_ge_win32.h"
+#include <crtdbg.h>
+#include "../agg/include/fxfx_agg_clip_liang_barsky.h"
+#include "dwrite_int.h"
+#include "win32_int.h"
+#include "../ge/text_int.h"
+#include "../dib/dib_int.h"
+#include "../agg/include/fx_agg_driver.h"
+#include "../../../include/fxge/fx_freetype.h"
+#include "../../../include/fxcodec/fx_codec.h"
+class CWin32FontInfo : public IFX_SystemFontInfo
+{
+public:
+ CWin32FontInfo();
+ ~CWin32FontInfo();
+ virtual void Release();
+ virtual FX_BOOL EnumFontList(CFX_FontMapper* pMapper);
+ virtual void* MapFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR face, FX_BOOL& bExact);
+ virtual void* GetFont(FX_LPCSTR face)
+ {
+ return NULL;
+ }
+ virtual FX_DWORD GetFontData(void* hFont, FX_DWORD table, FX_LPBYTE buffer, FX_DWORD size);
+ virtual void DeleteFont(void* hFont);
+ virtual FX_BOOL GetFaceName(void* hFont, CFX_ByteString& name);
+ virtual FX_BOOL GetFontCharset(void* hFont, int& charset);
+ FX_BOOL IsOpenTypeFromDiv(const LOGFONTA *plf);
+ FX_BOOL IsSupportFontFormDiv(const LOGFONTA* plf);
+ void AddInstalledFont(const LOGFONTA *plf, FX_DWORD FontType);
+ void GetGBPreference(CFX_ByteString& face, int weight, int picth_family);
+ void GetJapanesePreference(CFX_ByteString& face, int weight, int picth_family);
+ CFX_ByteString FindFont(const CFX_ByteString& name);
+ HDC m_hDC;
+ CFX_FontMapper* m_pMapper;
+ CFX_ByteString m_LastFamily;
+ CFX_ByteString m_KaiTi, m_FangSong;
+};
+CWin32FontInfo::CWin32FontInfo()
+{
+ m_hDC = CreateCompatibleDC(NULL);
+}
+CWin32FontInfo::~CWin32FontInfo()
+{
+ m_pMapper = NULL;
+}
+void CWin32FontInfo::Release()
+{
+ DeleteDC(m_hDC);
+ delete this;
+}
+#define TT_MAKE_TAG(x1, x2, x3, x4) (((FX_DWORD)x1<<24)|((FX_DWORD)x2<<16)|((FX_DWORD)x3<<8)|(FX_DWORD)x4)
+FX_BOOL CWin32FontInfo::IsOpenTypeFromDiv(const LOGFONTA *plf)
+{
+ HFONT hFont = CreateFontIndirectA(plf);
+ FX_BOOL ret = FALSE;
+ FX_DWORD font_size = GetFontData(hFont, 0, NULL, 0);
+ if (font_size != GDI_ERROR && font_size >= sizeof(FX_DWORD)) {
+ FX_DWORD lVersion = 0;
+ GetFontData(hFont, 0, (FX_BYTE*)(&lVersion), sizeof(FX_DWORD));
+ lVersion = (((FX_DWORD)(FX_BYTE)(lVersion)) << 24) | ((FX_DWORD)((FX_BYTE)(lVersion >> 8))) << 16 |
+ ((FX_DWORD)((FX_BYTE)(lVersion >> 16))) << 8 | ((FX_BYTE)(lVersion >> 24));
+ if (lVersion == TT_MAKE_TAG('O', 'T', 'T', 'O') ||
+ lVersion == 0x00010000 ||
+ lVersion == TT_MAKE_TAG('t', 't', 'c', 'f') ||
+ lVersion == TT_MAKE_TAG('t', 'r', 'u', 'e') ||
+ lVersion == 0x00020000) {
+ ret = TRUE;
+ }
+ }
+ DeleteFont(hFont);
+ return ret;
+}
+FX_BOOL CWin32FontInfo::IsSupportFontFormDiv(const LOGFONTA* plf)
+{
+ HFONT hFont = CreateFontIndirectA(plf);
+ FX_BOOL ret = FALSE;
+ FX_DWORD font_size = GetFontData(hFont, 0, NULL, 0);
+ if (font_size != GDI_ERROR && font_size >= sizeof(FX_DWORD)) {
+ FX_DWORD lVersion = 0;
+ GetFontData(hFont, 0, (FX_BYTE*)(&lVersion), sizeof(FX_DWORD));
+ lVersion = (((FX_DWORD)(FX_BYTE)(lVersion)) << 24) | ((FX_DWORD)((FX_BYTE)(lVersion >> 8))) << 16 |
+ ((FX_DWORD)((FX_BYTE)(lVersion >> 16))) << 8 | ((FX_BYTE)(lVersion >> 24));
+ if (lVersion == TT_MAKE_TAG('O', 'T', 'T', 'O') ||
+ lVersion == 0x00010000 ||
+ lVersion == TT_MAKE_TAG('t', 't', 'c', 'f') ||
+ lVersion == TT_MAKE_TAG('t', 'r', 'u', 'e') ||
+ lVersion == 0x00020000) {
+ ret = TRUE;
+ } else if ((lVersion & 0xFFFF0000) == TT_MAKE_TAG(0x80, 0x01, 0x00, 0x00) ||
+ (lVersion & 0xFFFF0000) == TT_MAKE_TAG('%', '!', 0, 0)) {
+ ret = TRUE;
+ }
+ }
+ DeleteFont(hFont);
+ return ret;
+}
+void CWin32FontInfo::AddInstalledFont(const LOGFONTA *plf, FX_DWORD FontType)
+{
+ CFX_ByteString name(plf->lfFaceName, -1);
+ if (name[0] == '@') {
+ return;
+ }
+ if (name == m_LastFamily) {
+ m_pMapper->AddInstalledFont(name, plf->lfCharSet);
+ return;
+ }
+ if (!(FontType & TRUETYPE_FONTTYPE) && !(FontType & DEVICE_FONTTYPE)) {
+ return;
+ }
+ if (!(FontType & TRUETYPE_FONTTYPE)) {
+ if (!IsSupportFontFormDiv(plf)) {
+ return;
+ }
+ }
+ m_pMapper->AddInstalledFont(name, plf->lfCharSet);
+ m_LastFamily = name;
+}
+static int CALLBACK FontEnumProc(
+ const LOGFONTA *plf,
+ const TEXTMETRICA *lpntme,
+ FX_DWORD FontType,
+ LPARAM lParam
+)
+{
+ CWin32FontInfo* pFontInfo = (CWin32FontInfo*)lParam;
+ if (pFontInfo->m_pMapper->GetFontEnumerator()) {
+ pFontInfo->m_pMapper->GetFontEnumerator()->HitFont();
+ }
+ pFontInfo->AddInstalledFont(plf, FontType);
+ return 1;
+}
+FX_BOOL CWin32FontInfo::EnumFontList(CFX_FontMapper* pMapper)
+{
+ m_pMapper = pMapper;
+ LOGFONTA lf;
+ FXSYS_memset32(&lf, 0, sizeof(LOGFONTA));
+ lf.lfCharSet = DEFAULT_CHARSET;
+ lf.lfFaceName[0] = 0;
+ lf.lfPitchAndFamily = 0;
+ EnumFontFamiliesExA(m_hDC, &lf, (FONTENUMPROCA)FontEnumProc, (FX_UINTPTR)this, 0);
+ if (pMapper->GetFontEnumerator()) {
+ pMapper->GetFontEnumerator()->Finish();
+ }
+ return TRUE;
+}
+static const struct {
+ FX_LPCSTR m_pFaceName;
+ FX_LPCSTR m_pVariantName;
+}
+VariantNames[] = {
+ {"DFKai-SB", "\x19\x6A\x77\x69\xD4\x9A"},
+};
+static const struct {
+ FX_LPCSTR m_pName;
+ FX_LPCSTR m_pWinName;
+ FX_BOOL m_bBold;
+ FX_BOOL m_bItalic;
+}
+Base14Substs[] = {
+ {"Courier", "Courier New", FALSE, FALSE},
+ {"Courier-Bold", "Courier New", TRUE, FALSE},
+ {"Courier-BoldOblique", "Courier New", TRUE, TRUE},
+ {"Courier-Oblique", "Courier New", FALSE, TRUE},
+ {"Helvetica", "Arial", FALSE, FALSE},
+ {"Helvetica-Bold", "Arial", TRUE, FALSE},
+ {"Helvetica-BoldOblique", "Arial", TRUE, TRUE},
+ {"Helvetica-Oblique", "Arial", FALSE, TRUE},
+ {"Times-Roman", "Times New Roman", FALSE, FALSE},
+ {"Times-Bold", "Times New Roman", TRUE, FALSE},
+ {"Times-BoldItalic", "Times New Roman", TRUE, TRUE},
+ {"Times-Italic", "Times New Roman", FALSE, TRUE},
+};
+CFX_ByteString CWin32FontInfo::FindFont(const CFX_ByteString& name)
+{
+ if (m_pMapper == NULL) {
+ return name;
+ }
+ int nFonts = m_pMapper->m_InstalledTTFonts.GetSize();
+ for (int i = 0; i < nFonts; i ++) {
+ CFX_ByteString thisname = m_pMapper->m_InstalledTTFonts[i];
+ if (thisname[0] == ' ') {
+ if (thisname.Mid(1, name.GetLength()) == name) {
+ return m_pMapper->m_InstalledTTFonts[i + 1];
+ }
+ } else if (thisname.Left(name.GetLength()) == name) {
+ return m_pMapper->m_InstalledTTFonts[i];
+ }
+ }
+ return CFX_ByteString();
+}
+struct _FontNameMap {
+ FX_LPCSTR m_pSubFontName;
+ FX_LPCSTR m_pSrcFontName;
+};
+const _FontNameMap g_JpFontNameMap[] = {
+ {"MS Mincho", "Heiseimin-W3"},
+ {"MS Gothic", "Jun101-Light"},
+};
+const _FontNameMap g_GbFontNameMap[1];
+extern "C" {
+ static int compareString(const void* key, const void* element)
+ {
+ return FXSYS_stricmp((FX_LPCSTR)key, ((_FontNameMap*)element)->m_pSrcFontName);
+ }
+}
+FX_BOOL _GetSubFontName(CFX_ByteString& name, int lang)
+{
+ int size = sizeof g_JpFontNameMap;
+ void* pFontnameMap = (void*)g_JpFontNameMap;
+ if (lang == 1) {
+ size = sizeof g_GbFontNameMap;
+ pFontnameMap = (void*)g_GbFontNameMap;
+ } else if (lang == 2) {
+ size = 0;
+ }
+ _FontNameMap* found = (_FontNameMap*)FXSYS_bsearch((FX_LPCSTR)name, pFontnameMap,
+ size / sizeof (_FontNameMap), sizeof (_FontNameMap), compareString);
+ if (found == NULL) {
+ return FALSE;
+ }
+ name = found->m_pSubFontName;
+ return TRUE;
+}
+void CWin32FontInfo::GetGBPreference(CFX_ByteString& face, int weight, int picth_family)
+{
+ if (face.Find("KaiTi") >= 0 || face.Find("\xbf\xac") >= 0) {
+ if (m_KaiTi.IsEmpty()) {
+ m_KaiTi = FindFont("KaiTi");
+ if (m_KaiTi.IsEmpty()) {
+ m_KaiTi = "SimSun";
+ }
+ }
+ face = m_KaiTi;
+ } else if (face.Find("FangSong") >= 0 || face.Find("\xb7\xc2\xcb\xce") >= 0) {
+ if (m_FangSong.IsEmpty()) {
+ m_FangSong = FindFont("FangSong");
+ if (m_FangSong.IsEmpty()) {
+ m_FangSong = "SimSun";
+ }
+ }
+ face = m_FangSong;
+ } else if (face.Find("SimSun") >= 0 || face.Find("\xcb\xce") >= 0) {
+ face = "SimSun";
+ } else if (face.Find("SimHei") >= 0 || face.Find("\xba\xda") >= 0) {
+ face = "SimHei";
+ } else if (!(picth_family & FF_ROMAN) && weight > 550) {
+ face = "SimHei";
+ } else {
+ face = "SimSun";
+ }
+}
+void CWin32FontInfo::GetJapanesePreference(CFX_ByteString& face, int weight, int picth_family)
+{
+ if (face.Find("Gothic") >= 0 || face.Find("\x83\x53\x83\x56\x83\x62\x83\x4e") >= 0) {
+ if (face.Find("PGothic") >= 0 || face.Find("\x82\x6f\x83\x53\x83\x56\x83\x62\x83\x4e") >= 0) {
+ face = "MS PGothic";
+ } else if (face.Find("UI Gothic") >= 0) {
+ face = "MS UI Gothic";
+ } else {
+ if (face.Find("HGSGothicM") >= 0 || face.Find("HGMaruGothicMPRO") >= 0) {
+ face = "MS PGothic";
+ } else {
+ face = "MS Gothic";
+ }
+ }
+ return;
+ } else if (face.Find("Mincho") >= 0 || face.Find("\x96\xbe\x92\xa9") >= 0) {
+ if (face.Find("PMincho") >= 0 || face.Find("\x82\x6f\x96\xbe\x92\xa9") >= 0) {
+ face = "MS PMincho";
+ } else {
+ face = "MS Mincho";
+ }
+ return;
+ }
+ if (_GetSubFontName(face, 0)) {
+ return;
+ }
+ if (!(picth_family & FF_ROMAN) && weight > 400) {
+ face = "MS PGothic";
+ } else {
+ face = "MS PMincho";
+ }
+}
+void* CWin32FontInfo::MapFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR cstr_face, FX_BOOL& bExact)
+{
+ CFX_ByteString face = cstr_face;
+ int iBaseFont;
+ for (iBaseFont = 0; iBaseFont < 12; iBaseFont ++)
+ if (face == CFX_ByteStringC(Base14Substs[iBaseFont].m_pName)) {
+ face = Base14Substs[iBaseFont].m_pWinName;
+ weight = Base14Substs[iBaseFont].m_bBold ? FW_BOLD : FW_NORMAL;
+ bItalic = Base14Substs[iBaseFont].m_bItalic;
+ bExact = TRUE;
+ break;
+ }
+ if (charset == ANSI_CHARSET || charset == SYMBOL_CHARSET) {
+ charset = DEFAULT_CHARSET;
+ }
+ int subst_pitch_family = pitch_family;
+ switch (charset) {
+ case SHIFTJIS_CHARSET:
+ subst_pitch_family = FF_ROMAN;
+ break;
+ case CHINESEBIG5_CHARSET:
+ case HANGUL_CHARSET:
+ case GB2312_CHARSET:
+ subst_pitch_family = 0;
+ break;
+ }
+ HFONT hFont = ::CreateFontA(-10, 0, 0, 0, weight, bItalic, 0, 0, charset, OUT_TT_ONLY_PRECIS,
+ 0, 0, subst_pitch_family, face);
+ char facebuf[100];
+ HFONT hOldFont = (HFONT)::SelectObject(m_hDC, hFont);
+ int ret = ::GetTextFaceA(m_hDC, 100, facebuf);
+ ::SelectObject(m_hDC, hOldFont);
+ if (face.EqualNoCase(facebuf)) {
+ return hFont;
+ }
+ int iCount = sizeof(VariantNames) / sizeof(VariantNames[0]);
+ for (int i = 0; i < iCount; ++i) {
+ if (face == VariantNames[i].m_pFaceName) {
+ CFX_WideString wsFace = CFX_WideString::FromLocal(facebuf);
+ CFX_WideString wsName = CFX_WideString::FromUTF16LE((const unsigned short*)VariantNames[i].m_pVariantName);
+ if (wsFace == wsName) {
+ return hFont;
+ }
+ }
+ }
+ ::DeleteObject(hFont);
+ if (charset == DEFAULT_CHARSET) {
+ return NULL;
+ }
+ switch (charset) {
+ case SHIFTJIS_CHARSET:
+ GetJapanesePreference(face, weight, pitch_family);
+ break;
+ case GB2312_CHARSET:
+ GetGBPreference(face, weight, pitch_family);
+ break;
+ case HANGUL_CHARSET:
+ face = "Gulim";
+ break;
+ case CHINESEBIG5_CHARSET:
+ if (face.Find("MSung") >= 0) {
+ face = "MingLiU";
+ } else {
+ face = "PMingLiU";
+ }
+ break;
+ }
+ hFont = ::CreateFontA(-10, 0, 0, 0, weight, bItalic, 0, 0, charset, OUT_TT_ONLY_PRECIS,
+ 0, 0, subst_pitch_family, face);
+ return hFont;
+}
+void CWin32FontInfo::DeleteFont(void* hFont)
+{
+ ::DeleteObject(hFont);
+}
+FX_DWORD CWin32FontInfo::GetFontData(void* hFont, FX_DWORD table, FX_LPBYTE buffer, FX_DWORD size)
+{
+ HFONT hOldFont = (HFONT)::SelectObject(m_hDC, (HFONT)hFont);
+ table = FXDWORD_FROM_MSBFIRST(table);
+ size = ::GetFontData(m_hDC, table, 0, buffer, size);
+ ::SelectObject(m_hDC, hOldFont);
+ if (size == GDI_ERROR) {
+ return 0;
+ }
+ return size;
+}
+FX_BOOL CWin32FontInfo::GetFaceName(void* hFont, CFX_ByteString& name)
+{
+ char facebuf[100];
+ HFONT hOldFont = (HFONT)::SelectObject(m_hDC, (HFONT)hFont);
+ int ret = ::GetTextFaceA(m_hDC, 100, facebuf);
+ ::SelectObject(m_hDC, hOldFont);
+ if (ret == 0) {
+ return FALSE;
+ }
+ name = facebuf;
+ return TRUE;
+}
+FX_BOOL CWin32FontInfo::GetFontCharset(void* hFont, int& charset)
+{
+ TEXTMETRIC tm;
+ HFONT hOldFont = (HFONT)::SelectObject(m_hDC, (HFONT)hFont);
+ ::GetTextMetrics(m_hDC, &tm);
+ ::SelectObject(m_hDC, hOldFont);
+ charset = tm.tmCharSet;
+ return TRUE;
+}
+#ifndef _FPDFAPI_MINI_
+IFX_SystemFontInfo* IFX_SystemFontInfo::CreateDefault()
+{
+ return FX_NEW CWin32FontInfo;
+}
+#endif
+void CFX_GEModule::InitPlatform()
+{
+ CWin32Platform* pPlatformData = FX_NEW CWin32Platform;
+ if (!pPlatformData) {
+ return;
+ }
+ OSVERSIONINFO ver;
+ ver.dwOSVersionInfoSize = sizeof(ver);
+ GetVersionEx(&ver);
+ pPlatformData->m_bHalfTone = ver.dwMajorVersion >= 5;
+ pPlatformData->m_GdiplusExt.Load();
+ m_pPlatformData = pPlatformData;
+ m_pFontMgr->SetSystemFontInfo(IFX_SystemFontInfo::CreateDefault());
+}
+void CFX_GEModule::DestroyPlatform()
+{
+ if (m_pPlatformData) {
+ delete (CWin32Platform*)m_pPlatformData;
+ }
+ m_pPlatformData = NULL;
+}
+CGdiDeviceDriver::CGdiDeviceDriver(HDC hDC, int device_class)
+{
+ m_hDC = hDC;
+ m_DeviceClass = device_class;
+ CWin32Platform* pPlatform = (CWin32Platform*)CFX_GEModule::Get()->GetPlatformData();
+ SetStretchBltMode(hDC, pPlatform->m_bHalfTone ? HALFTONE : COLORONCOLOR);
+ if (GetObjectType(m_hDC) == OBJ_MEMDC) {
+ HBITMAP hBitmap = CreateBitmap(1, 1, 1, 1, NULL);
+ hBitmap = (HBITMAP)SelectObject(m_hDC, hBitmap);
+ BITMAP bitmap;
+ GetObject(hBitmap, sizeof bitmap, &bitmap);
+ m_nBitsPerPixel = bitmap.bmBitsPixel;
+ m_Width = bitmap.bmWidth;
+ m_Height = abs(bitmap.bmHeight);
+ hBitmap = (HBITMAP)SelectObject(m_hDC, hBitmap);
+ DeleteObject(hBitmap);
+ } else {
+ m_nBitsPerPixel = ::GetDeviceCaps(m_hDC, BITSPIXEL);
+ m_Width = ::GetDeviceCaps(m_hDC, HORZRES);
+ m_Height = ::GetDeviceCaps(m_hDC, VERTRES);
+ }
+ if (m_DeviceClass != FXDC_DISPLAY) {
+ m_RenderCaps = FXRC_BIT_MASK;
+ } else {
+ m_RenderCaps = FXRC_GET_BITS | FXRC_BIT_MASK;
+ }
+}
+int CGdiDeviceDriver::GetDeviceCaps(int caps_id)
+{
+ switch (caps_id) {
+ case FXDC_DEVICE_CLASS:
+ return m_DeviceClass;
+ case FXDC_PIXEL_WIDTH:
+ return m_Width;
+ case FXDC_PIXEL_HEIGHT:
+ return m_Height;
+ case FXDC_BITS_PIXEL:
+ return m_nBitsPerPixel;
+ case FXDC_RENDER_CAPS:
+ return m_RenderCaps;
+ }
+ return 0;
+}
+FX_LPVOID CGdiDeviceDriver::GetClipRgn()
+{
+ HRGN hClipRgn = CreateRectRgn(0, 0, 1, 1);
+ if (::GetClipRgn(m_hDC, hClipRgn) == 0) {
+ DeleteObject(hClipRgn);
+ hClipRgn = NULL;
+ }
+ return (FX_LPVOID)hClipRgn;
+}
+FX_BOOL CGdiDeviceDriver::GDI_SetDIBits(const CFX_DIBitmap* pBitmap1, const FX_RECT* pSrcRect, int left, int top, void* pIccTransform)
+{
+ if (m_DeviceClass == FXDC_PRINTER) {
+ CFX_DIBitmap* pBitmap = pBitmap1->FlipImage(FALSE, TRUE);
+ if (pBitmap == NULL) {
+ return FALSE;
+ }
+ if ((pBitmap->IsCmykImage() || pIccTransform) &&
+ !pBitmap->ConvertFormat(FXDIB_Rgb, pIccTransform)) {
+ return FALSE;
+ }
+ int width = pSrcRect->Width(), height = pSrcRect->Height();
+ int pitch = pBitmap->GetPitch();
+ LPBYTE pBuffer = pBitmap->GetBuffer();
+ CFX_ByteString info = CFX_WindowsDIB::GetBitmapInfo(pBitmap);
+ ((BITMAPINFOHEADER*)(FX_LPCSTR)info)->biHeight *= -1;
+ FX_RECT dst_rect(0, 0, width, height);
+ dst_rect.Intersect(0, 0, pBitmap->GetWidth(), pBitmap->GetHeight());
+ int dst_width = dst_rect.Width();
+ int dst_height = dst_rect.Height();
+ ::StretchDIBits(m_hDC, left, top, dst_width, dst_height,
+ 0, 0, dst_width, dst_height, pBuffer, (BITMAPINFO*)(FX_LPCSTR)info, DIB_RGB_COLORS, SRCCOPY);
+ delete pBitmap;
+ } else {
+ CFX_DIBitmap* pBitmap = (CFX_DIBitmap*)pBitmap1;
+ if ((pBitmap->IsCmykImage() || pIccTransform) &&
+ (pBitmap = pBitmap->CloneConvert(FXDIB_Rgb, NULL, pIccTransform)) == NULL) {
+ return FALSE;
+ }
+ int width = pSrcRect->Width(), height = pSrcRect->Height();
+ int pitch = pBitmap->GetPitch();
+ LPBYTE pBuffer = pBitmap->GetBuffer();
+ CFX_ByteString info = CFX_WindowsDIB::GetBitmapInfo(pBitmap);
+ ::SetDIBitsToDevice(m_hDC, left, top, width, height, pSrcRect->left, pBitmap->GetHeight() - pSrcRect->bottom,
+ 0, pBitmap->GetHeight(), pBuffer, (BITMAPINFO*)(FX_LPCSTR)info, DIB_RGB_COLORS);
+ if (pBitmap != pBitmap1) {
+ delete pBitmap;
+ }
+ }
+ return TRUE;
+}
+FX_BOOL CGdiDeviceDriver::GDI_StretchDIBits(const CFX_DIBitmap* pBitmap1, int dest_left, int dest_top,
+ int dest_width, int dest_height, FX_DWORD flags, void* pIccTransform)
+{
+ CFX_DIBitmap* pBitmap = (CFX_DIBitmap*)pBitmap1;
+ if (pBitmap == NULL) {
+ return FALSE;
+ }
+ if ((pBitmap->IsCmykImage() || pIccTransform) &&
+ !pBitmap->ConvertFormat(FXDIB_Rgb, pIccTransform)) {
+ return FALSE;
+ }
+ CFX_ByteString info = CFX_WindowsDIB::GetBitmapInfo(pBitmap);
+ if (abs(dest_width) * abs(dest_height) < pBitmap1->GetWidth() * pBitmap1->GetHeight() * 4 ||
+ (flags & FXDIB_INTERPOL) || (flags & FXDIB_BICUBIC_INTERPOL)) {
+ SetStretchBltMode(m_hDC, HALFTONE);
+ } else {
+ SetStretchBltMode(m_hDC, COLORONCOLOR);
+ }
+ CFX_DIBitmap* pToStrechBitmap = pBitmap;
+ bool del = false;
+ if (m_DeviceClass == FXDC_PRINTER && (pBitmap->GetWidth() * pBitmap->GetHeight() > abs(dest_width) * abs(dest_height))) {
+ pToStrechBitmap = pBitmap->StretchTo(dest_width, dest_height);
+ del = true;
+ }
+ CFX_ByteString toStrechBitmapInfo = CFX_WindowsDIB::GetBitmapInfo(pToStrechBitmap);
+ ::StretchDIBits(m_hDC, dest_left, dest_top, dest_width, dest_height,
+ 0, 0, pToStrechBitmap->GetWidth(), pToStrechBitmap->GetHeight(), pToStrechBitmap->GetBuffer(),
+ (BITMAPINFO*)(FX_LPCSTR)toStrechBitmapInfo, DIB_RGB_COLORS, SRCCOPY);
+ if (del) {
+ delete pToStrechBitmap;
+ }
+ return TRUE;
+}
+FX_BOOL CGdiDeviceDriver::GDI_StretchBitMask(const CFX_DIBitmap* pBitmap1, int dest_left, int dest_top,
+ int dest_width, int dest_height, FX_DWORD bitmap_color, FX_DWORD flags,
+ int alpha_flag, void* pIccTransform)
+{
+ CFX_DIBitmap* pBitmap = (CFX_DIBitmap*)pBitmap1;
+ if (pBitmap == NULL) {
+ return FALSE;
+ }
+ _Color2Argb(bitmap_color, bitmap_color, alpha_flag | (1 << 24), pIccTransform);
+ int width = pBitmap->GetWidth(), height = pBitmap->GetHeight();
+ struct {
+ BITMAPINFOHEADER bmiHeader;
+ FX_DWORD bmiColors[2];
+ } bmi;
+ FXSYS_memset32(&bmi.bmiHeader, 0, sizeof (BITMAPINFOHEADER));
+ bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
+ bmi.bmiHeader.biBitCount = 1;
+ bmi.bmiHeader.biCompression = BI_RGB;
+ bmi.bmiHeader.biHeight = -height;
+ bmi.bmiHeader.biPlanes = 1;
+ bmi.bmiHeader.biWidth = width;
+ if (m_nBitsPerPixel != 1) {
+ SetStretchBltMode(m_hDC, HALFTONE);
+ }
+ bmi.bmiColors[0] = 0xffffff;
+ bmi.bmiColors[1] = 0;
+ ::StretchDIBits(m_hDC, dest_left, dest_top, dest_width, dest_height,
+ 0, 0, width, height, pBitmap->GetBuffer(), (BITMAPINFO*)&bmi, DIB_RGB_COLORS, SRCAND);
+ return TRUE;
+}
+BOOL CGdiDeviceDriver::GetClipBox(FX_RECT* pRect)
+{
+ return ::GetClipBox(m_hDC, (RECT*)pRect);
+}
+FX_BOOL CGdiDeviceDriver::SetClipRgn(FX_LPVOID hRgn)
+{
+ ::SelectClipRgn(m_hDC, (HRGN)hRgn);
+ return TRUE;
+}
+static HPEN _CreatePen(const CFX_GraphStateData* pGraphState, const CFX_AffineMatrix* pMatrix, FX_DWORD argb)
+{
+ FX_FLOAT width;
+ FX_FLOAT scale = 1.f;
+ if (pMatrix)
+ scale = FXSYS_fabs(pMatrix->a) > FXSYS_fabs(pMatrix->b) ?
+ FXSYS_fabs(pMatrix->a) : FXSYS_fabs(pMatrix->b);
+ if (pGraphState) {
+ width = scale * pGraphState->m_LineWidth;
+ } else {
+ width = 1.0f;
+ }
+ FX_DWORD PenStyle = PS_GEOMETRIC;
+ if (width < 1) {
+ width = 1;
+ }
+ if(pGraphState->m_DashCount) {
+ PenStyle |= PS_USERSTYLE;
+ } else {
+ PenStyle |= PS_SOLID;
+ }
+ switch(pGraphState->m_LineCap) {
+ case 0:
+ PenStyle |= PS_ENDCAP_FLAT;
+ break;
+ case 1:
+ PenStyle |= PS_ENDCAP_ROUND;
+ break;
+ case 2:
+ PenStyle |= PS_ENDCAP_SQUARE;
+ break;
+ }
+ switch(pGraphState->m_LineJoin) {
+ case 0:
+ PenStyle |= PS_JOIN_MITER;
+ break;
+ case 1:
+ PenStyle |= PS_JOIN_ROUND;
+ break;
+ case 2:
+ PenStyle |= PS_JOIN_BEVEL;
+ break;
+ }
+ int a;
+ FX_COLORREF rgb;
+ ArgbDecode(argb, a, rgb);
+ LOGBRUSH lb;
+ lb.lbColor = rgb;
+ lb.lbStyle = BS_SOLID;
+ lb.lbHatch = 0;
+ FX_DWORD* pDash = NULL;
+ if (pGraphState->m_DashCount) {
+ pDash = FX_Alloc(FX_DWORD, pGraphState->m_DashCount);
+ if (!pDash) {
+ return NULL;
+ }
+ for (int i = 0; i < pGraphState->m_DashCount; i ++) {
+ pDash[i] = FXSYS_round(pMatrix ? pMatrix->TransformDistance(pGraphState->m_DashArray[i]) : pGraphState->m_DashArray[i]);
+ if (pDash[i] < 1) {
+ pDash[i] = 1;
+ }
+ }
+ }
+ HPEN hPen = ExtCreatePen(PenStyle, (DWORD)FXSYS_ceil(width), &lb, pGraphState->m_DashCount, (const DWORD*)pDash);
+ if (pDash) {
+ FX_Free(pDash);
+ }
+ return hPen;
+}
+static HBRUSH _CreateBrush(FX_DWORD argb)
+{
+ int a;
+ FX_COLORREF rgb;
+ ArgbDecode(argb, a, rgb);
+ return CreateSolidBrush(rgb);
+}
+static void _SetPathToDC(HDC hDC, const CFX_PathData* pPathData, const CFX_AffineMatrix* pMatrix)
+{
+ BeginPath(hDC);
+ int nPoints = pPathData->GetPointCount();
+ FX_PATHPOINT* pPoints = pPathData->GetPoints();
+ for(int i = 0; i < nPoints; i++) {
+ FX_FLOAT posx = pPoints[i].m_PointX, posy = pPoints[i].m_PointY;
+ if (pMatrix) {
+ pMatrix->Transform(posx, posy);
+ }
+ int screen_x = FXSYS_round(posx), screen_y = FXSYS_round(posy);
+ int point_type = pPoints[i].m_Flag & FXPT_TYPE;
+ if(point_type == PT_MOVETO) {
+ MoveToEx(hDC, screen_x, screen_y, NULL);
+ } else if(point_type == PT_LINETO) {
+ if (pPoints[i].m_PointY == pPoints[i - 1].m_PointY && pPoints[i].m_PointX == pPoints[i - 1].m_PointX) {
+ screen_x ++;
+ }
+ LineTo(hDC, screen_x, screen_y);
+ } else if(point_type == PT_BEZIERTO) {
+ POINT lppt[3];
+ lppt[0].x = screen_x;
+ lppt[0].y = screen_y;
+ posx = pPoints[i + 1].m_PointX;
+ posy = pPoints[i + 1].m_PointY;
+ if (pMatrix) {
+ pMatrix->Transform(posx, posy);
+ }
+ lppt[1].x = FXSYS_round(posx);
+ lppt[1].y = FXSYS_round(posy);
+ posx = pPoints[i + 2].m_PointX;
+ posy = pPoints[i + 2].m_PointY;
+ if (pMatrix) {
+ pMatrix->Transform(posx, posy);
+ }
+ lppt[2].x = FXSYS_round(posx);
+ lppt[2].y = FXSYS_round(posy);
+ PolyBezierTo(hDC, lppt, 3);
+ i += 2;
+ }
+ if (pPoints[i].m_Flag & PT_CLOSEFIGURE) {
+ CloseFigure(hDC);
+ }
+ }
+ EndPath(hDC);
+}
+void CGdiDeviceDriver::DrawLine(FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2)
+{
+ int flag1 = (x1 < 0) | ((x1 > m_Width) << 1) | ((y1 < 0) << 2) | ((y1 > m_Height) << 3);
+ int flag2 = (x2 < 0) | ((x2 > m_Width) << 1) | ((y2 < 0) << 2) | ((y2 > m_Height) << 3);
+ if (flag1 & flag2) {
+ return;
+ }
+ if (flag1 || flag2) {
+ agg::rect_base<FX_FLOAT> rect(0.0f, 0.0f, (FX_FLOAT)(m_Width), (FX_FLOAT)(m_Height));
+ FX_FLOAT x[2], y[2];
+ int np = agg::clip_liang_barsky<FX_FLOAT>(x1, y1, x2, y2, rect, x, y);
+ if (np == 0) {
+ return;
+ }
+ if (np == 1) {
+ x2 = x[0];
+ y2 = y[0];
+ } else {
+ x1 = x[0];
+ y1 = y[0];
+ x2 = x[np - 1];
+ y2 = y[np - 1];
+ }
+ }
+ MoveToEx(m_hDC, FXSYS_round(x1), FXSYS_round(y1), NULL);
+ LineTo(m_hDC, FXSYS_round(x2), FXSYS_round(y2));
+}
+static FX_BOOL _MatrixNoScaled(const CFX_AffineMatrix* pMatrix)
+{
+ return pMatrix->GetA() == 1.0f && pMatrix->GetB() == 0 && pMatrix->GetC() == 0 && pMatrix->GetD() == 1.0f;
+}
+FX_BOOL CGdiDeviceDriver::DrawPath(const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pMatrix,
+ const CFX_GraphStateData* pGraphState,
+ FX_DWORD fill_color,
+ FX_DWORD stroke_color,
+ int fill_mode,
+ int alpha_flag,
+ void* pIccTransform,
+ int blend_type
+ )
+{
+ if (blend_type != FXDIB_BLEND_NORMAL) {
+ return FALSE;
+ }
+ _Color2Argb(fill_color, fill_color, alpha_flag | (1 << 24), pIccTransform);
+ _Color2Argb(stroke_color, stroke_color, alpha_flag, pIccTransform);
+ CWin32Platform* pPlatform = (CWin32Platform*)CFX_GEModule::Get()->GetPlatformData();
+ if ((pGraphState == NULL || stroke_color == 0) && !pPlatform->m_GdiplusExt.IsAvailable()) {
+ CFX_FloatRect bbox_f = pPathData->GetBoundingBox();
+ if (pMatrix) {
+ bbox_f.Transform(pMatrix);
+ }
+ FX_RECT bbox = bbox_f.GetInnerRect();
+ if (bbox.Width() <= 0) {
+ return DrawCosmeticLine((FX_FLOAT)(bbox.left), (FX_FLOAT)(bbox.top), (FX_FLOAT)(bbox.left), (FX_FLOAT)(bbox.bottom + 1), fill_color,
+ alpha_flag, pIccTransform, FXDIB_BLEND_NORMAL);
+ } else if (bbox.Height() <= 0) {
+ return DrawCosmeticLine((FX_FLOAT)(bbox.left), (FX_FLOAT)(bbox.top), (FX_FLOAT)(bbox.right + 1), (FX_FLOAT)(bbox.top), fill_color,
+ alpha_flag, pIccTransform, FXDIB_BLEND_NORMAL);
+ }
+ }
+ int fill_alpha = FXARGB_A(fill_color);
+ int stroke_alpha = FXARGB_A(stroke_color);
+ FX_BOOL bDrawAlpha = (fill_alpha > 0 && fill_alpha < 255) || (stroke_alpha > 0 && stroke_alpha < 255 && pGraphState);
+ if (!pPlatform->m_GdiplusExt.IsAvailable() && bDrawAlpha) {
+ return FALSE;
+ }
+ if (pPlatform->m_GdiplusExt.IsAvailable()) {
+ if (bDrawAlpha || ((m_DeviceClass != FXDC_PRINTER && !(fill_mode & FXFILL_FULLCOVER)) || pGraphState && pGraphState->m_DashCount)) {
+ if ( !((NULL == pMatrix || _MatrixNoScaled(pMatrix)) &&
+ pGraphState && pGraphState->m_LineWidth == 1.f &&
+ (pPathData->GetPointCount() == 5 || pPathData->GetPointCount() == 4) &&
+ pPathData->IsRect()) ) {
+ if (pPlatform->m_GdiplusExt.DrawPath(m_hDC, pPathData, pMatrix, pGraphState, fill_color, stroke_color, fill_mode)) {
+ return TRUE;
+ }
+ }
+ }
+ }
+ int old_fill_mode = fill_mode;
+ fill_mode &= 3;
+ HPEN hPen = NULL;
+ HBRUSH hBrush = NULL;
+ if (pGraphState && stroke_alpha) {
+ SetMiterLimit(m_hDC, pGraphState->m_MiterLimit, NULL);
+ hPen = _CreatePen(pGraphState, pMatrix, stroke_color);
+ hPen = (HPEN)SelectObject(m_hDC, hPen);
+ }
+ if (fill_mode && fill_alpha) {
+ SetPolyFillMode(m_hDC, fill_mode);
+ hBrush = _CreateBrush(fill_color);
+ hBrush = (HBRUSH)SelectObject(m_hDC, hBrush);
+ }
+ if (pPathData->GetPointCount() == 2 && pGraphState && pGraphState->m_DashCount) {
+ FX_FLOAT x1 = pPathData->GetPointX(0), y1 = pPathData->GetPointY(0);
+ if (pMatrix) {
+ pMatrix->Transform(x1, y1);
+ }
+ FX_FLOAT x2 = pPathData->GetPointX(1), y2 = pPathData->GetPointY(1);
+ if (pMatrix) {
+ pMatrix->Transform(x2, y2);
+ }
+ DrawLine(x1, y1, x2, y2);
+ } else {
+ _SetPathToDC(m_hDC, pPathData, pMatrix);
+ if (pGraphState && stroke_alpha) {
+ if (fill_mode && fill_alpha) {
+ if (old_fill_mode & FX_FILL_TEXT_MODE) {
+ StrokeAndFillPath(m_hDC);
+ } else {
+ FillPath(m_hDC);
+ _SetPathToDC(m_hDC, pPathData, pMatrix);
+ StrokePath(m_hDC);
+ }
+ } else {
+ StrokePath(m_hDC);
+ }
+ } else if (fill_mode && fill_alpha) {
+ FillPath(m_hDC);
+ }
+ }
+ if (hPen) {
+ hPen = (HPEN)SelectObject(m_hDC, hPen);
+ DeleteObject(hPen);
+ }
+ if (hBrush) {
+ hBrush = (HBRUSH)SelectObject(m_hDC, hBrush);
+ DeleteObject(hBrush);
+ }
+ return TRUE;
+}
+FX_BOOL CGdiDeviceDriver::FillRect(const FX_RECT* pRect, FX_DWORD fill_color, int alpha_flag, void* pIccTransform, int blend_type)
+{
+ if (blend_type != FXDIB_BLEND_NORMAL) {
+ return FALSE;
+ }
+ _Color2Argb(fill_color, fill_color, alpha_flag | (1 << 24), pIccTransform);
+ int alpha;
+ FX_COLORREF rgb;
+ ArgbDecode(fill_color, alpha, rgb);
+ if (alpha == 0) {
+ return TRUE;
+ }
+ if (alpha < 255) {
+ return FALSE;
+ }
+ HBRUSH hBrush = CreateSolidBrush(rgb);
+ ::FillRect(m_hDC, (RECT*)pRect, hBrush);
+ DeleteObject(hBrush);
+ return TRUE;
+}
+FX_BOOL CGdiDeviceDriver::SetClip_PathFill(const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pMatrix,
+ int fill_mode
+ )
+{
+ if (pPathData->GetPointCount() == 5) {
+ CFX_FloatRect rectf;
+ if (pPathData->IsRect(pMatrix, &rectf)) {
+ FX_RECT rect = rectf.GetOutterRect();
+ IntersectClipRect(m_hDC, rect.left, rect.top, rect.right, rect.bottom);
+ return TRUE;
+ }
+ }
+ _SetPathToDC(m_hDC, pPathData, pMatrix);
+ SetPolyFillMode(m_hDC, fill_mode & 3);
+ SelectClipPath(m_hDC, RGN_AND);
+ return TRUE;
+}
+FX_BOOL CGdiDeviceDriver::SetClip_PathStroke(const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pMatrix,
+ const CFX_GraphStateData* pGraphState
+ )
+{
+ HPEN hPen = _CreatePen(pGraphState, pMatrix, 0xff000000);
+ hPen = (HPEN)SelectObject(m_hDC, hPen);
+ _SetPathToDC(m_hDC, pPathData, pMatrix);
+ WidenPath(m_hDC);
+ SetPolyFillMode(m_hDC, WINDING);
+ FX_BOOL ret = SelectClipPath(m_hDC, RGN_AND);
+ hPen = (HPEN)SelectObject(m_hDC, hPen);
+ DeleteObject(hPen);
+ return ret;
+}
+FX_BOOL CGdiDeviceDriver::DrawCosmeticLine(FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2, FX_DWORD color,
+ int alpha_flag, void* pIccTransform, int blend_type)
+{
+ if (blend_type != FXDIB_BLEND_NORMAL) {
+ return FALSE;
+ }
+ _Color2Argb(color, color, alpha_flag | (1 << 24), pIccTransform);
+ int a;
+ FX_COLORREF rgb;
+ ArgbDecode(color, a, rgb);
+ if (a == 0) {
+ return TRUE;
+ }
+ HPEN hPen = CreatePen(PS_SOLID, 1, rgb);
+ hPen = (HPEN)SelectObject(m_hDC, hPen);
+ MoveToEx(m_hDC, FXSYS_round(x1), FXSYS_round(y1), NULL);
+ LineTo(m_hDC, FXSYS_round(x2), FXSYS_round(y2));
+ hPen = (HPEN)SelectObject(m_hDC, hPen);
+ DeleteObject(hPen);
+ return TRUE;
+}
+FX_BOOL CGdiDeviceDriver::DeleteDeviceRgn(FX_LPVOID pRgn)
+{
+ DeleteObject((HGDIOBJ)pRgn);
+ return TRUE;
+}
+CGdiDisplayDriver::CGdiDisplayDriver(HDC hDC) : CGdiDeviceDriver(hDC, FXDC_DISPLAY)
+{
+ CWin32Platform* pPlatform = (CWin32Platform*)CFX_GEModule::Get()->GetPlatformData();
+ if (pPlatform->m_GdiplusExt.IsAvailable()) {
+ m_RenderCaps |= FXRC_ALPHA_PATH | FXRC_ALPHA_IMAGE;
+ }
+}
+FX_BOOL CGdiDisplayDriver::GetDIBits(CFX_DIBitmap* pBitmap, int left, int top, void* pIccTransform, FX_BOOL bDEdge)
+{
+ FX_BOOL ret = FALSE;
+ int width = pBitmap->GetWidth();
+ int height = pBitmap->GetHeight();
+ HBITMAP hbmp = CreateCompatibleBitmap(m_hDC, width, height);
+ HDC hDCMemory = CreateCompatibleDC(m_hDC);
+ HBITMAP holdbmp = (HBITMAP)SelectObject(hDCMemory, hbmp);
+ BitBlt(hDCMemory, 0, 0, width, height, m_hDC, left, top, SRCCOPY);
+ SelectObject(hDCMemory, holdbmp);
+ BITMAPINFO bmi;
+ FXSYS_memset32(&bmi, 0, sizeof bmi);
+ bmi.bmiHeader.biSize = sizeof bmi.bmiHeader;
+ bmi.bmiHeader.biBitCount = pBitmap->GetBPP();
+ bmi.bmiHeader.biHeight = -height;
+ bmi.bmiHeader.biPlanes = 1;
+ bmi.bmiHeader.biWidth = width;
+ if (!CFX_GEModule::Get()->GetCodecModule() || !CFX_GEModule::Get()->GetCodecModule()->GetIccModule()) {
+ pIccTransform = NULL;
+ }
+ if (pBitmap->GetBPP() > 8 && !pBitmap->IsCmykImage() && pIccTransform == NULL) {
+ ret = ::GetDIBits(hDCMemory, hbmp, 0, height, pBitmap->GetBuffer(), &bmi, DIB_RGB_COLORS) == height;
+ } else {
+ CFX_DIBitmap bitmap;
+ if (bitmap.Create(width, height, FXDIB_Rgb)) {
+ bmi.bmiHeader.biBitCount = 24;
+ ::GetDIBits(hDCMemory, hbmp, 0, height, bitmap.GetBuffer(), &bmi, DIB_RGB_COLORS);
+ ret = pBitmap->TransferBitmap(0, 0, width, height, &bitmap, 0, 0, pIccTransform);
+ } else {
+ ret = FALSE;
+ }
+ }
+#ifndef _FPDFAPI_MINI_
+ if (pBitmap->HasAlpha() && ret) {
+ pBitmap->LoadChannel(FXDIB_Alpha, 0xff);
+ }
+#endif
+ DeleteObject(hbmp);
+ DeleteObject(hDCMemory);
+ return ret;
+}
+FX_BOOL CGdiDisplayDriver::SetDIBits(const CFX_DIBSource* pSource, FX_DWORD color, const FX_RECT* pSrcRect, int left, int top, int blend_type,
+ int alpha_flag, void* pIccTransform)
+{
+ ASSERT(blend_type == FXDIB_BLEND_NORMAL);
+ if (pSource->IsAlphaMask()) {
+ int width = pSource->GetWidth(), height = pSource->GetHeight();
+ int alpha = FXGETFLAG_COLORTYPE(alpha_flag) ? FXGETFLAG_ALPHA_FILL(alpha_flag) : FXARGB_A(color);
+ FX_BOOL bGDI = pSource->GetBPP() == 1 && alpha == 255;
+ if (!bGDI) {
+ CFX_DIBitmap background;
+ if (!background.Create(width, height, FXDIB_Rgb32) ||
+ !GetDIBits(&background, left, top, NULL) ||
+ !background.CompositeMask(0, 0, width, height, pSource, color, 0, 0, FXDIB_BLEND_NORMAL, NULL, FALSE, alpha_flag, pIccTransform)) {
+ return FALSE;
+ }
+ FX_RECT src_rect(0, 0, width, height);
+ return SetDIBits(&background, 0, &src_rect, left, top, FXDIB_BLEND_NORMAL, 0, NULL);
+ }
+ FX_RECT clip_rect(left, top, left + pSrcRect->Width(), top + pSrcRect->Height());
+ return StretchDIBits(pSource, color, left - pSrcRect->left, top - pSrcRect->top, width, height,
+ &clip_rect, 0, alpha_flag, pIccTransform, FXDIB_BLEND_NORMAL);
+ } else {
+ int width = pSrcRect->Width(), height = pSrcRect->Height();
+ if (pSource->HasAlpha()) {
+ CFX_DIBitmap bitmap;
+ if (!bitmap.Create(width, height, FXDIB_Rgb) ||
+ !GetDIBits(&bitmap, left, top, NULL) ||
+ !bitmap.CompositeBitmap(0, 0, width, height, pSource, pSrcRect->left, pSrcRect->top, FXDIB_BLEND_NORMAL, NULL, FALSE, pIccTransform)) {
+ return FALSE;
+ }
+ FX_RECT src_rect(0, 0, width, height);
+ return SetDIBits(&bitmap, 0, &src_rect, left, top, FXDIB_BLEND_NORMAL, 0, NULL);
+ }
+ CFX_DIBExtractor temp(pSource);
+ CFX_DIBitmap* pBitmap = temp;
+ if (pBitmap) {
+ return GDI_SetDIBits(pBitmap, pSrcRect, left, top, pIccTransform);
+ }
+ }
+ return FALSE;
+}
+FX_BOOL CGdiDisplayDriver::UseFoxitStretchEngine(const CFX_DIBSource* pSource, FX_DWORD color, int dest_left, int dest_top,
+ int dest_width, int dest_height, const FX_RECT* pClipRect, int render_flags,
+ int alpha_flag, void* pIccTransform, int blend_type)
+{
+ FX_RECT bitmap_clip = *pClipRect;
+ if (dest_width < 0) {
+ dest_left += dest_width;
+ }
+ if (dest_height < 0) {
+ dest_top += dest_height;
+ }
+ bitmap_clip.Offset(-dest_left, -dest_top);
+ CFX_DIBitmap* pStretched = pSource->StretchTo(dest_width, dest_height, render_flags, &bitmap_clip);
+ if (pStretched == NULL) {
+ return TRUE;
+ }
+ FX_RECT src_rect(0, 0, pStretched->GetWidth(), pStretched->GetHeight());
+ FX_BOOL ret = SetDIBits(pStretched, color, &src_rect, pClipRect->left, pClipRect->top, FXDIB_BLEND_NORMAL, alpha_flag, pIccTransform);
+ delete pStretched;
+ return ret;
+}
+FX_BOOL CGdiDisplayDriver::StretchDIBits(const CFX_DIBSource* pSource, FX_DWORD color, int dest_left, int dest_top,
+ int dest_width, int dest_height, const FX_RECT* pClipRect, FX_DWORD flags,
+ int alpha_flag, void* pIccTransform, int blend_type)
+{
+ ASSERT(pSource != NULL && pClipRect != NULL);
+ if (flags || dest_width > 10000 || dest_width < -10000 || dest_height > 10000 || dest_height < -10000)
+ return UseFoxitStretchEngine(pSource, color, dest_left, dest_top, dest_width, dest_height,
+ pClipRect, flags, alpha_flag, pIccTransform, blend_type);
+ if (pSource->IsAlphaMask()) {
+ FX_RECT image_rect;
+ image_rect.left = dest_width > 0 ? dest_left : dest_left + dest_width;
+ image_rect.right = dest_width > 0 ? dest_left + dest_width : dest_left;
+ image_rect.top = dest_height > 0 ? dest_top : dest_top + dest_height;
+ image_rect.bottom = dest_height > 0 ? dest_top + dest_height : dest_top;
+ FX_RECT clip_rect = image_rect;
+ clip_rect.Intersect(*pClipRect);
+ clip_rect.Offset(-image_rect.left, -image_rect.top);
+ int clip_width = clip_rect.Width(), clip_height = clip_rect.Height();
+ CFX_DIBitmap* pStretched = pSource->StretchTo(dest_width, dest_height, flags, &clip_rect);
+ if (pStretched == NULL) {
+ return TRUE;
+ }
+ CFX_DIBitmap background;
+ if (!background.Create(clip_width, clip_height, FXDIB_Rgb32) ||
+ !GetDIBits(&background, image_rect.left + clip_rect.left, image_rect.top + clip_rect.top, NULL) ||
+ !background.CompositeMask(0, 0, clip_width, clip_height, pStretched, color, 0, 0, FXDIB_BLEND_NORMAL, NULL, FALSE, alpha_flag, pIccTransform)) {
+ delete pStretched;
+ return FALSE;
+ }
+ FX_RECT src_rect(0, 0, clip_width, clip_height);
+ FX_BOOL ret = SetDIBits(&background, 0, &src_rect, image_rect.left + clip_rect.left, image_rect.top + clip_rect.top, FXDIB_BLEND_NORMAL, 0, NULL);
+ delete pStretched;
+ return ret;
+ } else {
+ if (pSource->HasAlpha()) {
+ CWin32Platform* pPlatform = (CWin32Platform*)CFX_GEModule::Get()->GetPlatformData();
+ if (pPlatform->m_GdiplusExt.IsAvailable() && pIccTransform == NULL && !pSource->IsCmykImage()) {
+ CFX_DIBExtractor temp(pSource);
+ CFX_DIBitmap* pBitmap = temp;
+ if (pBitmap == NULL) {
+ return FALSE;
+ }
+ return pPlatform->m_GdiplusExt.StretchDIBits(m_hDC, pBitmap, dest_left, dest_top, dest_width, dest_height, pClipRect, flags);
+ }
+ return UseFoxitStretchEngine(pSource, color, dest_left, dest_top, dest_width, dest_height,
+ pClipRect, flags, alpha_flag, pIccTransform, blend_type);
+ }
+ CFX_DIBExtractor temp(pSource);
+ CFX_DIBitmap* pBitmap = temp;
+ if (pBitmap) {
+ return GDI_StretchDIBits(pBitmap, dest_left, dest_top, dest_width, dest_height, flags, pIccTransform);
+ }
+ }
+ return FALSE;
+}
+#define GET_PS_FEATURESETTING 4121
+#define FEATURESETTING_PSLEVEL 2
+int GetPSLevel(HDC hDC)
+{
+ int device_type = ::GetDeviceCaps(hDC, TECHNOLOGY);
+ if (device_type != DT_RASPRINTER) {
+ return 0;
+ }
+ FX_DWORD esc = GET_PS_FEATURESETTING;
+ if (ExtEscape(hDC, QUERYESCSUPPORT, sizeof esc, (char*)&esc, 0, NULL)) {
+ int param = FEATURESETTING_PSLEVEL;
+ if (ExtEscape(hDC, GET_PS_FEATURESETTING, sizeof(int), (char*)&param, sizeof(int), (char*)&param) > 0) {
+ return param;
+ }
+ }
+ esc = POSTSCRIPT_IDENTIFY;
+ if (ExtEscape(hDC, QUERYESCSUPPORT, sizeof esc, (char*)&esc, 0, NULL) == 0) {
+ esc = POSTSCRIPT_DATA;
+ if (ExtEscape(hDC, QUERYESCSUPPORT, sizeof esc, (char*)&esc, 0, NULL)) {
+ return 2;
+ }
+ return 0;
+ }
+ esc = PSIDENT_GDICENTRIC;
+ if (ExtEscape(hDC, POSTSCRIPT_IDENTIFY, sizeof(FX_DWORD), (char*)&esc, 0, NULL) <= 0) {
+ return 2;
+ }
+ esc = GET_PS_FEATURESETTING;
+ if (ExtEscape(hDC, QUERYESCSUPPORT, sizeof esc, (char*)&esc, 0, NULL)) {
+ int param = FEATURESETTING_PSLEVEL;
+ if (ExtEscape(hDC, GET_PS_FEATURESETTING, sizeof(int), (char*)&param, sizeof(int), (char*)&param) > 0) {
+ return param;
+ }
+ }
+ return 2;
+}
+int CFX_WindowsDevice::m_psLevel = 2;
+CFX_WindowsDevice::CFX_WindowsDevice(HDC hDC, FX_BOOL bCmykOutput, FX_BOOL bForcePSOutput, int psLevel)
+{
+ m_bForcePSOutput = bForcePSOutput;
+ m_psLevel = psLevel;
+ if (bForcePSOutput) {
+ IFX_RenderDeviceDriver* pDriver = FX_NEW CPSPrinterDriver;
+ if (!pDriver) {
+ return;
+ }
+ ((CPSPrinterDriver*)pDriver)->Init(hDC, psLevel, bCmykOutput);
+ SetDeviceDriver(pDriver);
+ return;
+ }
+ SetDeviceDriver(CreateDriver(hDC, bCmykOutput));
+}
+HDC CFX_WindowsDevice::GetDC() const
+{
+ IFX_RenderDeviceDriver *pRDD = GetDeviceDriver();
+ if (!pRDD) {
+ return NULL;
+ }
+ return (HDC)pRDD->GetPlatformSurface();
+}
+IFX_RenderDeviceDriver* CFX_WindowsDevice::CreateDriver(HDC hDC, FX_BOOL bCmykOutput)
+{
+ int device_type = ::GetDeviceCaps(hDC, TECHNOLOGY);
+ int obj_type = ::GetObjectType(hDC);
+ int device_class;
+ if (device_type == DT_RASPRINTER || device_type == DT_PLOTTER || obj_type == OBJ_ENHMETADC) {
+ device_class = FXDC_PRINTER;
+ } else {
+ device_class = FXDC_DISPLAY;
+ }
+ return FX_NEW CGdiDisplayDriver(hDC);
+}
+CFX_WinBitmapDevice::CFX_WinBitmapDevice(int width, int height, FXDIB_Format format)
+{
+ BITMAPINFOHEADER bmih;
+ FXSYS_memset32(&bmih, 0, sizeof (BITMAPINFOHEADER));
+ bmih.biSize = sizeof(BITMAPINFOHEADER);
+ bmih.biBitCount = format & 0xff;
+ bmih.biHeight = -height;
+ bmih.biPlanes = 1;
+ bmih.biWidth = width;
+ FX_LPBYTE pBuffer;
+ m_hBitmap = CreateDIBSection(NULL, (BITMAPINFO*)&bmih, DIB_RGB_COLORS, (FX_LPVOID*)&pBuffer, NULL, 0);
+ if (m_hBitmap == NULL) {
+ return;
+ }
+ CFX_DIBitmap* pBitmap = FX_NEW CFX_DIBitmap;
+ if (!pBitmap) {
+ return;
+ }
+ pBitmap->Create(width, height, format, pBuffer);
+ SetBitmap(pBitmap);
+ m_hDC = ::CreateCompatibleDC(NULL);
+ m_hOldBitmap = (HBITMAP)SelectObject(m_hDC, m_hBitmap);
+ IFX_RenderDeviceDriver* pDriver = FX_NEW CGdiDisplayDriver(m_hDC);
+ if (!pDriver) {
+ return;
+ }
+ SetDeviceDriver(pDriver);
+}
+CFX_WinBitmapDevice::~CFX_WinBitmapDevice()
+{
+ if (m_hDC) {
+ SelectObject(m_hDC, m_hOldBitmap);
+ DeleteDC(m_hDC);
+ }
+ if (m_hBitmap) {
+ DeleteObject(m_hBitmap);
+ }
+ delete GetBitmap();
+}
+#endif
diff --git a/core/src/fxge/win32/fx_win32_dib.cpp b/core/src/fxge/win32/fx_win32_dib.cpp
index a9cf78eac3..0093d5e41b 100644
--- a/core/src/fxge/win32/fx_win32_dib.cpp
+++ b/core/src/fxge/win32/fx_win32_dib.cpp
@@ -1,310 +1,310 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../../include/fxge/fx_ge.h"
-#if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_
-#include <windows.h>
-#include "../../../include/fxge/fx_ge_win32.h"
-#include "win32_int.h"
-CFX_ByteString CFX_WindowsDIB::GetBitmapInfo(const CFX_DIBitmap* pBitmap)
-{
- CFX_ByteString result;
- int len = sizeof (BITMAPINFOHEADER);
- if (pBitmap->GetBPP() == 1 || pBitmap->GetBPP() == 8) {
- len += sizeof (DWORD) * (int)(1 << pBitmap->GetBPP());
- }
- BITMAPINFOHEADER* pbmih = (BITMAPINFOHEADER*)result.GetBuffer(len);
- FXSYS_memset32(pbmih, 0, sizeof (BITMAPINFOHEADER));
- pbmih->biSize = sizeof(BITMAPINFOHEADER);
- pbmih->biBitCount = pBitmap->GetBPP();
- pbmih->biCompression = BI_RGB;
- pbmih->biHeight = -(int)pBitmap->GetHeight();
- pbmih->biPlanes = 1;
- pbmih->biWidth = pBitmap->GetWidth();
- if (pBitmap->GetBPP() == 8) {
- FX_DWORD* pPalette = (FX_DWORD*)(pbmih + 1);
- if (pBitmap->GetPalette() == NULL) {
- for (int i = 0; i < 256; i ++) {
- pPalette[i] = i * 0x010101;
- }
- } else {
- for (int i = 0; i < 256; i ++) {
- pPalette[i] = pBitmap->GetPalette()[i];
- }
- }
- }
- if (pBitmap->GetBPP() == 1) {
- FX_DWORD* pPalette = (FX_DWORD*)(pbmih + 1);
- if (pBitmap->GetPalette() == NULL) {
- pPalette[0] = 0;
- pPalette[1] = 0xffffff;
- } else {
- pPalette[0] = pBitmap->GetPalette()[0];
- pPalette[1] = pBitmap->GetPalette()[1];
- }
- }
- result.ReleaseBuffer(len);
- return result;
-}
-CFX_DIBitmap* _FX_WindowsDIB_LoadFromBuf(BITMAPINFO* pbmi, LPVOID pData, FX_BOOL bAlpha)
-{
- int width = pbmi->bmiHeader.biWidth;
- int height = pbmi->bmiHeader.biHeight;
- BOOL bBottomUp = TRUE;
- if (height < 0) {
- height = -height;
- bBottomUp = FALSE;
- }
- int pitch = (width * pbmi->bmiHeader.biBitCount + 31) / 32 * 4;
- CFX_DIBitmap* pBitmap = FX_NEW CFX_DIBitmap;
- if (!pBitmap) {
- return NULL;
- }
- FXDIB_Format format = bAlpha ? (FXDIB_Format)(pbmi->bmiHeader.biBitCount + 0x200) : (FXDIB_Format)pbmi->bmiHeader.biBitCount;
- FX_BOOL ret = pBitmap->Create(width, height, format);
- if (!ret) {
- delete pBitmap;
- return NULL;
- }
- FXSYS_memcpy32(pBitmap->GetBuffer(), pData, pitch * height);
- if (bBottomUp) {
- FX_LPBYTE temp_buf = FX_Alloc(FX_BYTE, pitch);
- if (!temp_buf) {
- if (pBitmap) {
- delete pBitmap;
- }
- return NULL;
- }
- int top = 0, bottom = height - 1;
- while (top < bottom) {
- FXSYS_memcpy32(temp_buf, pBitmap->GetBuffer() + top * pitch, pitch);
- FXSYS_memcpy32(pBitmap->GetBuffer() + top * pitch, pBitmap->GetBuffer() + bottom * pitch, pitch);
- FXSYS_memcpy32(pBitmap->GetBuffer() + bottom * pitch, temp_buf, pitch);
- top ++;
- bottom --;
- }
- FX_Free(temp_buf);
- temp_buf = NULL;
- }
- if (pbmi->bmiHeader.biBitCount == 1) {
- for (int i = 0; i < 2; i ++) {
- pBitmap->SetPaletteEntry(i, ((FX_DWORD*)pbmi->bmiColors)[i] | 0xff000000);
- }
- } else if (pbmi->bmiHeader.biBitCount == 8) {
- for (int i = 0; i < 256; i ++) {
- pBitmap->SetPaletteEntry(i, ((FX_DWORD*)pbmi->bmiColors)[i] | 0xff000000);
- }
- }
- return pBitmap;
-}
-CFX_DIBitmap* CFX_WindowsDIB::LoadFromBuf(BITMAPINFO* pbmi, LPVOID pData)
-{
- return _FX_WindowsDIB_LoadFromBuf(pbmi, pData, FALSE);
-}
-HBITMAP CFX_WindowsDIB::GetDDBitmap(const CFX_DIBitmap* pBitmap, HDC hDC)
-{
- CFX_ByteString info = GetBitmapInfo(pBitmap);
- HBITMAP hBitmap = NULL;
- hBitmap = CreateDIBitmap(hDC, (BITMAPINFOHEADER*)(FX_LPCSTR)info, CBM_INIT,
- pBitmap->GetBuffer(), (BITMAPINFO*)(FX_LPCSTR)info, DIB_RGB_COLORS);
- return hBitmap;
-}
-void GetBitmapSize(HBITMAP hBitmap, int& w, int& h)
-{
- BITMAP bmp;
- GetObject(hBitmap, sizeof bmp, &bmp);
- w = bmp.bmWidth;
- h = bmp.bmHeight;
-}
-CFX_DIBitmap* CFX_WindowsDIB::LoadFromFile(FX_LPCWSTR filename)
-{
- CWin32Platform* pPlatform = (CWin32Platform*)CFX_GEModule::Get()->GetPlatformData();
- if (pPlatform->m_GdiplusExt.IsAvailable()) {
- WINDIB_Open_Args_ args;
- args.flags = WINDIB_OPEN_PATHNAME;
- args.path_name = filename;
- return pPlatform->m_GdiplusExt.LoadDIBitmap(args);
- }
- HBITMAP hBitmap = (HBITMAP)LoadImageW(NULL, (wchar_t*)filename, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
- if (hBitmap == NULL) {
- return NULL;
- }
- HDC hDC = CreateCompatibleDC(NULL);
- int width, height;
- GetBitmapSize(hBitmap, width, height);
- CFX_DIBitmap* pDIBitmap = FX_NEW CFX_DIBitmap;
- if (!pDIBitmap) {
- DeleteDC(hDC);
- return NULL;
- }
- if (!pDIBitmap->Create(width, height, FXDIB_Rgb)) {
- delete pDIBitmap;
- DeleteDC(hDC);
- return NULL;
- }
- CFX_ByteString info = GetBitmapInfo(pDIBitmap);
- int ret = GetDIBits(hDC, hBitmap, 0, height, pDIBitmap->GetBuffer(), (BITMAPINFO*)(FX_LPCSTR)info, DIB_RGB_COLORS);
- if (!ret) {
- if (pDIBitmap) {
- delete pDIBitmap;
- }
- pDIBitmap = NULL;
- }
- DeleteDC(hDC);
- return pDIBitmap;
-}
-CFX_DIBitmap* CFX_WindowsDIB::LoadDIBitmap(WINDIB_Open_Args_ args)
-{
- CWin32Platform* pPlatform = (CWin32Platform*)CFX_GEModule::Get()->GetPlatformData();
- if (pPlatform->m_GdiplusExt.IsAvailable()) {
- return pPlatform->m_GdiplusExt.LoadDIBitmap(args);
- } else if (args.flags == WINDIB_OPEN_MEMORY) {
- return NULL;
- }
- HBITMAP hBitmap = (HBITMAP)LoadImageW(NULL, (wchar_t*)args.path_name, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
- if (hBitmap == NULL) {
- return NULL;
- }
- HDC hDC = CreateCompatibleDC(NULL);
- int width, height;
- GetBitmapSize(hBitmap, width, height);
- CFX_DIBitmap* pDIBitmap = FX_NEW CFX_DIBitmap;
- if (!pDIBitmap) {
- DeleteDC(hDC);
- return NULL;
- }
- if (!pDIBitmap->Create(width, height, FXDIB_Rgb)) {
- delete pDIBitmap;
- DeleteDC(hDC);
- return NULL;
- }
- CFX_ByteString info = GetBitmapInfo(pDIBitmap);
- int ret = GetDIBits(hDC, hBitmap, 0, height, pDIBitmap->GetBuffer(), (BITMAPINFO*)(FX_LPCSTR)info, DIB_RGB_COLORS);
- if (!ret) {
- if (pDIBitmap) {
- delete pDIBitmap;
- }
- pDIBitmap = NULL;
- }
- DeleteDC(hDC);
- return pDIBitmap;
-}
-CFX_DIBitmap* CFX_WindowsDIB::LoadFromDDB(HDC hDC, HBITMAP hBitmap, FX_DWORD* pPalette, FX_DWORD palsize)
-{
- FX_BOOL bCreatedDC = hDC == NULL;
- if (hDC == NULL) {
- hDC = CreateCompatibleDC(NULL);
- }
- BITMAPINFOHEADER bmih;
- FXSYS_memset32(&bmih, 0, sizeof bmih);
- bmih.biSize = sizeof bmih;
- GetDIBits(hDC, hBitmap, 0, 0, NULL, (BITMAPINFO*)&bmih, DIB_RGB_COLORS);
- int width = bmih.biWidth;
- int height = abs(bmih.biHeight);
- bmih.biHeight = -height;
- bmih.biCompression = BI_RGB;
- CFX_DIBitmap* pDIBitmap = FX_NEW CFX_DIBitmap;
- if (!pDIBitmap) {
- return NULL;
- }
- int ret = 0;
- if (bmih.biBitCount == 1 || bmih.biBitCount == 8) {
- int size = sizeof (BITMAPINFOHEADER) + 8;
- if (bmih.biBitCount == 8) {
- size += sizeof (FX_DWORD) * 254;
- }
- BITMAPINFO* pbmih = (BITMAPINFO*)FX_Alloc(FX_BYTE, size);
- if (!pbmih) {
- delete pDIBitmap;
- if (bCreatedDC) {
- DeleteDC(hDC);
- }
- return NULL;
- }
- FXSYS_memset32(pbmih, 0, sizeof (BITMAPINFOHEADER));
- pbmih->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
- pbmih->bmiHeader.biBitCount = bmih.biBitCount;
- pbmih->bmiHeader.biCompression = BI_RGB;
- pbmih->bmiHeader.biHeight = -height;
- pbmih->bmiHeader.biPlanes = 1;
- pbmih->bmiHeader.biWidth = bmih.biWidth;
- if (!pDIBitmap->Create(bmih.biWidth, height, bmih.biBitCount == 1 ? FXDIB_1bppRgb : FXDIB_8bppRgb)) {
- delete pDIBitmap;
- FX_Free(pbmih);
- if (bCreatedDC) {
- DeleteDC(hDC);
- }
- return NULL;
- }
- ret = GetDIBits(hDC, hBitmap, 0, height, pDIBitmap->GetBuffer(), (BITMAPINFO*)pbmih, DIB_RGB_COLORS);
- FX_Free(pbmih);
- pbmih = NULL;
- pDIBitmap->CopyPalette(pPalette, palsize);
- } else {
- if (bmih.biBitCount <= 24) {
- bmih.biBitCount = 24;
- } else {
- bmih.biBitCount = 32;
- }
- if (!pDIBitmap->Create(bmih.biWidth, height, bmih.biBitCount == 24 ? FXDIB_Rgb : FXDIB_Rgb32)) {
- delete pDIBitmap;
- if (bCreatedDC) {
- DeleteDC(hDC);
- }
- return NULL;
- }
- ret = GetDIBits(hDC, hBitmap, 0, height, pDIBitmap->GetBuffer(), (BITMAPINFO*)&bmih, DIB_RGB_COLORS);
- if (ret != 0 && bmih.biBitCount == 32) {
- int pitch = pDIBitmap->GetPitch();
- for (int row = 0; row < height; row ++) {
- FX_BYTE* dest_scan = (FX_BYTE*)(pDIBitmap->GetBuffer() + row * pitch);
- for (int col = 0; col < width; col++) {
- dest_scan[3] = 255;
- dest_scan += 4;
- }
- }
- }
- }
- if (ret == 0) {
- if (pDIBitmap) {
- delete pDIBitmap;
- }
- pDIBitmap = NULL;
- }
- if (bCreatedDC) {
- DeleteDC(hDC);
- }
- return pDIBitmap;
-}
-CFX_WindowsDIB::CFX_WindowsDIB(HDC hDC, int width, int height)
-{
- Create(width, height, FXDIB_Rgb, (FX_LPBYTE)1);
- BITMAPINFOHEADER bmih;
- FXSYS_memset32(&bmih, 0, sizeof bmih);
- bmih.biSize = sizeof bmih;
- bmih.biBitCount = 24;
- bmih.biHeight = -height;
- bmih.biPlanes = 1;
- bmih.biWidth = width;
- m_hBitmap = CreateDIBSection(hDC, (BITMAPINFO*)&bmih, DIB_RGB_COLORS, (LPVOID*)&m_pBuffer, NULL, 0);
- m_hMemDC = CreateCompatibleDC(hDC);
- m_hOldBitmap = (HBITMAP)SelectObject(m_hMemDC, m_hBitmap);
-}
-CFX_WindowsDIB::~CFX_WindowsDIB()
-{
- SelectObject(m_hMemDC, m_hOldBitmap);
- DeleteDC(m_hMemDC);
- DeleteObject(m_hBitmap);
-}
-void CFX_WindowsDIB::LoadFromDevice(HDC hDC, int left, int top)
-{
- ::BitBlt(m_hMemDC, 0, 0, m_Width, m_Height, hDC, left, top, SRCCOPY);
-}
-void CFX_WindowsDIB::SetToDevice(HDC hDC, int left, int top)
-{
- ::BitBlt(hDC, left, top, m_Width, m_Height, m_hMemDC, 0, 0, SRCCOPY);
-}
-#endif
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxge/fx_ge.h"
+#if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_
+#include <windows.h>
+#include "../../../include/fxge/fx_ge_win32.h"
+#include "win32_int.h"
+CFX_ByteString CFX_WindowsDIB::GetBitmapInfo(const CFX_DIBitmap* pBitmap)
+{
+ CFX_ByteString result;
+ int len = sizeof (BITMAPINFOHEADER);
+ if (pBitmap->GetBPP() == 1 || pBitmap->GetBPP() == 8) {
+ len += sizeof (DWORD) * (int)(1 << pBitmap->GetBPP());
+ }
+ BITMAPINFOHEADER* pbmih = (BITMAPINFOHEADER*)result.GetBuffer(len);
+ FXSYS_memset32(pbmih, 0, sizeof (BITMAPINFOHEADER));
+ pbmih->biSize = sizeof(BITMAPINFOHEADER);
+ pbmih->biBitCount = pBitmap->GetBPP();
+ pbmih->biCompression = BI_RGB;
+ pbmih->biHeight = -(int)pBitmap->GetHeight();
+ pbmih->biPlanes = 1;
+ pbmih->biWidth = pBitmap->GetWidth();
+ if (pBitmap->GetBPP() == 8) {
+ FX_DWORD* pPalette = (FX_DWORD*)(pbmih + 1);
+ if (pBitmap->GetPalette() == NULL) {
+ for (int i = 0; i < 256; i ++) {
+ pPalette[i] = i * 0x010101;
+ }
+ } else {
+ for (int i = 0; i < 256; i ++) {
+ pPalette[i] = pBitmap->GetPalette()[i];
+ }
+ }
+ }
+ if (pBitmap->GetBPP() == 1) {
+ FX_DWORD* pPalette = (FX_DWORD*)(pbmih + 1);
+ if (pBitmap->GetPalette() == NULL) {
+ pPalette[0] = 0;
+ pPalette[1] = 0xffffff;
+ } else {
+ pPalette[0] = pBitmap->GetPalette()[0];
+ pPalette[1] = pBitmap->GetPalette()[1];
+ }
+ }
+ result.ReleaseBuffer(len);
+ return result;
+}
+CFX_DIBitmap* _FX_WindowsDIB_LoadFromBuf(BITMAPINFO* pbmi, LPVOID pData, FX_BOOL bAlpha)
+{
+ int width = pbmi->bmiHeader.biWidth;
+ int height = pbmi->bmiHeader.biHeight;
+ BOOL bBottomUp = TRUE;
+ if (height < 0) {
+ height = -height;
+ bBottomUp = FALSE;
+ }
+ int pitch = (width * pbmi->bmiHeader.biBitCount + 31) / 32 * 4;
+ CFX_DIBitmap* pBitmap = FX_NEW CFX_DIBitmap;
+ if (!pBitmap) {
+ return NULL;
+ }
+ FXDIB_Format format = bAlpha ? (FXDIB_Format)(pbmi->bmiHeader.biBitCount + 0x200) : (FXDIB_Format)pbmi->bmiHeader.biBitCount;
+ FX_BOOL ret = pBitmap->Create(width, height, format);
+ if (!ret) {
+ delete pBitmap;
+ return NULL;
+ }
+ FXSYS_memcpy32(pBitmap->GetBuffer(), pData, pitch * height);
+ if (bBottomUp) {
+ FX_LPBYTE temp_buf = FX_Alloc(FX_BYTE, pitch);
+ if (!temp_buf) {
+ if (pBitmap) {
+ delete pBitmap;
+ }
+ return NULL;
+ }
+ int top = 0, bottom = height - 1;
+ while (top < bottom) {
+ FXSYS_memcpy32(temp_buf, pBitmap->GetBuffer() + top * pitch, pitch);
+ FXSYS_memcpy32(pBitmap->GetBuffer() + top * pitch, pBitmap->GetBuffer() + bottom * pitch, pitch);
+ FXSYS_memcpy32(pBitmap->GetBuffer() + bottom * pitch, temp_buf, pitch);
+ top ++;
+ bottom --;
+ }
+ FX_Free(temp_buf);
+ temp_buf = NULL;
+ }
+ if (pbmi->bmiHeader.biBitCount == 1) {
+ for (int i = 0; i < 2; i ++) {
+ pBitmap->SetPaletteEntry(i, ((FX_DWORD*)pbmi->bmiColors)[i] | 0xff000000);
+ }
+ } else if (pbmi->bmiHeader.biBitCount == 8) {
+ for (int i = 0; i < 256; i ++) {
+ pBitmap->SetPaletteEntry(i, ((FX_DWORD*)pbmi->bmiColors)[i] | 0xff000000);
+ }
+ }
+ return pBitmap;
+}
+CFX_DIBitmap* CFX_WindowsDIB::LoadFromBuf(BITMAPINFO* pbmi, LPVOID pData)
+{
+ return _FX_WindowsDIB_LoadFromBuf(pbmi, pData, FALSE);
+}
+HBITMAP CFX_WindowsDIB::GetDDBitmap(const CFX_DIBitmap* pBitmap, HDC hDC)
+{
+ CFX_ByteString info = GetBitmapInfo(pBitmap);
+ HBITMAP hBitmap = NULL;
+ hBitmap = CreateDIBitmap(hDC, (BITMAPINFOHEADER*)(FX_LPCSTR)info, CBM_INIT,
+ pBitmap->GetBuffer(), (BITMAPINFO*)(FX_LPCSTR)info, DIB_RGB_COLORS);
+ return hBitmap;
+}
+void GetBitmapSize(HBITMAP hBitmap, int& w, int& h)
+{
+ BITMAP bmp;
+ GetObject(hBitmap, sizeof bmp, &bmp);
+ w = bmp.bmWidth;
+ h = bmp.bmHeight;
+}
+CFX_DIBitmap* CFX_WindowsDIB::LoadFromFile(FX_LPCWSTR filename)
+{
+ CWin32Platform* pPlatform = (CWin32Platform*)CFX_GEModule::Get()->GetPlatformData();
+ if (pPlatform->m_GdiplusExt.IsAvailable()) {
+ WINDIB_Open_Args_ args;
+ args.flags = WINDIB_OPEN_PATHNAME;
+ args.path_name = filename;
+ return pPlatform->m_GdiplusExt.LoadDIBitmap(args);
+ }
+ HBITMAP hBitmap = (HBITMAP)LoadImageW(NULL, (wchar_t*)filename, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
+ if (hBitmap == NULL) {
+ return NULL;
+ }
+ HDC hDC = CreateCompatibleDC(NULL);
+ int width, height;
+ GetBitmapSize(hBitmap, width, height);
+ CFX_DIBitmap* pDIBitmap = FX_NEW CFX_DIBitmap;
+ if (!pDIBitmap) {
+ DeleteDC(hDC);
+ return NULL;
+ }
+ if (!pDIBitmap->Create(width, height, FXDIB_Rgb)) {
+ delete pDIBitmap;
+ DeleteDC(hDC);
+ return NULL;
+ }
+ CFX_ByteString info = GetBitmapInfo(pDIBitmap);
+ int ret = GetDIBits(hDC, hBitmap, 0, height, pDIBitmap->GetBuffer(), (BITMAPINFO*)(FX_LPCSTR)info, DIB_RGB_COLORS);
+ if (!ret) {
+ if (pDIBitmap) {
+ delete pDIBitmap;
+ }
+ pDIBitmap = NULL;
+ }
+ DeleteDC(hDC);
+ return pDIBitmap;
+}
+CFX_DIBitmap* CFX_WindowsDIB::LoadDIBitmap(WINDIB_Open_Args_ args)
+{
+ CWin32Platform* pPlatform = (CWin32Platform*)CFX_GEModule::Get()->GetPlatformData();
+ if (pPlatform->m_GdiplusExt.IsAvailable()) {
+ return pPlatform->m_GdiplusExt.LoadDIBitmap(args);
+ } else if (args.flags == WINDIB_OPEN_MEMORY) {
+ return NULL;
+ }
+ HBITMAP hBitmap = (HBITMAP)LoadImageW(NULL, (wchar_t*)args.path_name, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
+ if (hBitmap == NULL) {
+ return NULL;
+ }
+ HDC hDC = CreateCompatibleDC(NULL);
+ int width, height;
+ GetBitmapSize(hBitmap, width, height);
+ CFX_DIBitmap* pDIBitmap = FX_NEW CFX_DIBitmap;
+ if (!pDIBitmap) {
+ DeleteDC(hDC);
+ return NULL;
+ }
+ if (!pDIBitmap->Create(width, height, FXDIB_Rgb)) {
+ delete pDIBitmap;
+ DeleteDC(hDC);
+ return NULL;
+ }
+ CFX_ByteString info = GetBitmapInfo(pDIBitmap);
+ int ret = GetDIBits(hDC, hBitmap, 0, height, pDIBitmap->GetBuffer(), (BITMAPINFO*)(FX_LPCSTR)info, DIB_RGB_COLORS);
+ if (!ret) {
+ if (pDIBitmap) {
+ delete pDIBitmap;
+ }
+ pDIBitmap = NULL;
+ }
+ DeleteDC(hDC);
+ return pDIBitmap;
+}
+CFX_DIBitmap* CFX_WindowsDIB::LoadFromDDB(HDC hDC, HBITMAP hBitmap, FX_DWORD* pPalette, FX_DWORD palsize)
+{
+ FX_BOOL bCreatedDC = hDC == NULL;
+ if (hDC == NULL) {
+ hDC = CreateCompatibleDC(NULL);
+ }
+ BITMAPINFOHEADER bmih;
+ FXSYS_memset32(&bmih, 0, sizeof bmih);
+ bmih.biSize = sizeof bmih;
+ GetDIBits(hDC, hBitmap, 0, 0, NULL, (BITMAPINFO*)&bmih, DIB_RGB_COLORS);
+ int width = bmih.biWidth;
+ int height = abs(bmih.biHeight);
+ bmih.biHeight = -height;
+ bmih.biCompression = BI_RGB;
+ CFX_DIBitmap* pDIBitmap = FX_NEW CFX_DIBitmap;
+ if (!pDIBitmap) {
+ return NULL;
+ }
+ int ret = 0;
+ if (bmih.biBitCount == 1 || bmih.biBitCount == 8) {
+ int size = sizeof (BITMAPINFOHEADER) + 8;
+ if (bmih.biBitCount == 8) {
+ size += sizeof (FX_DWORD) * 254;
+ }
+ BITMAPINFO* pbmih = (BITMAPINFO*)FX_Alloc(FX_BYTE, size);
+ if (!pbmih) {
+ delete pDIBitmap;
+ if (bCreatedDC) {
+ DeleteDC(hDC);
+ }
+ return NULL;
+ }
+ FXSYS_memset32(pbmih, 0, sizeof (BITMAPINFOHEADER));
+ pbmih->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
+ pbmih->bmiHeader.biBitCount = bmih.biBitCount;
+ pbmih->bmiHeader.biCompression = BI_RGB;
+ pbmih->bmiHeader.biHeight = -height;
+ pbmih->bmiHeader.biPlanes = 1;
+ pbmih->bmiHeader.biWidth = bmih.biWidth;
+ if (!pDIBitmap->Create(bmih.biWidth, height, bmih.biBitCount == 1 ? FXDIB_1bppRgb : FXDIB_8bppRgb)) {
+ delete pDIBitmap;
+ FX_Free(pbmih);
+ if (bCreatedDC) {
+ DeleteDC(hDC);
+ }
+ return NULL;
+ }
+ ret = GetDIBits(hDC, hBitmap, 0, height, pDIBitmap->GetBuffer(), (BITMAPINFO*)pbmih, DIB_RGB_COLORS);
+ FX_Free(pbmih);
+ pbmih = NULL;
+ pDIBitmap->CopyPalette(pPalette, palsize);
+ } else {
+ if (bmih.biBitCount <= 24) {
+ bmih.biBitCount = 24;
+ } else {
+ bmih.biBitCount = 32;
+ }
+ if (!pDIBitmap->Create(bmih.biWidth, height, bmih.biBitCount == 24 ? FXDIB_Rgb : FXDIB_Rgb32)) {
+ delete pDIBitmap;
+ if (bCreatedDC) {
+ DeleteDC(hDC);
+ }
+ return NULL;
+ }
+ ret = GetDIBits(hDC, hBitmap, 0, height, pDIBitmap->GetBuffer(), (BITMAPINFO*)&bmih, DIB_RGB_COLORS);
+ if (ret != 0 && bmih.biBitCount == 32) {
+ int pitch = pDIBitmap->GetPitch();
+ for (int row = 0; row < height; row ++) {
+ FX_BYTE* dest_scan = (FX_BYTE*)(pDIBitmap->GetBuffer() + row * pitch);
+ for (int col = 0; col < width; col++) {
+ dest_scan[3] = 255;
+ dest_scan += 4;
+ }
+ }
+ }
+ }
+ if (ret == 0) {
+ if (pDIBitmap) {
+ delete pDIBitmap;
+ }
+ pDIBitmap = NULL;
+ }
+ if (bCreatedDC) {
+ DeleteDC(hDC);
+ }
+ return pDIBitmap;
+}
+CFX_WindowsDIB::CFX_WindowsDIB(HDC hDC, int width, int height)
+{
+ Create(width, height, FXDIB_Rgb, (FX_LPBYTE)1);
+ BITMAPINFOHEADER bmih;
+ FXSYS_memset32(&bmih, 0, sizeof bmih);
+ bmih.biSize = sizeof bmih;
+ bmih.biBitCount = 24;
+ bmih.biHeight = -height;
+ bmih.biPlanes = 1;
+ bmih.biWidth = width;
+ m_hBitmap = CreateDIBSection(hDC, (BITMAPINFO*)&bmih, DIB_RGB_COLORS, (LPVOID*)&m_pBuffer, NULL, 0);
+ m_hMemDC = CreateCompatibleDC(hDC);
+ m_hOldBitmap = (HBITMAP)SelectObject(m_hMemDC, m_hBitmap);
+}
+CFX_WindowsDIB::~CFX_WindowsDIB()
+{
+ SelectObject(m_hMemDC, m_hOldBitmap);
+ DeleteDC(m_hMemDC);
+ DeleteObject(m_hBitmap);
+}
+void CFX_WindowsDIB::LoadFromDevice(HDC hDC, int left, int top)
+{
+ ::BitBlt(m_hMemDC, 0, 0, m_Width, m_Height, hDC, left, top, SRCCOPY);
+}
+void CFX_WindowsDIB::SetToDevice(HDC hDC, int left, int top)
+{
+ ::BitBlt(hDC, left, top, m_Width, m_Height, m_hMemDC, 0, 0, SRCCOPY);
+}
+#endif
diff --git a/core/src/fxge/win32/fx_win32_dwrite.cpp b/core/src/fxge/win32/fx_win32_dwrite.cpp
index d4c962036e..2c275a88c8 100644
--- a/core/src/fxge/win32/fx_win32_dwrite.cpp
+++ b/core/src/fxge/win32/fx_win32_dwrite.cpp
@@ -1,480 +1,480 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../../include/fxge/fx_ge.h"
-#if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_
-#include "../../../include/fxge/fx_ge_win32.h"
-#include "dwrite_int.h"
-#include "../Microsoft SDK/include/DWrite.h"
-typedef HRESULT (__stdcall *FuncType_DWriteCreateFactory)(__in DWRITE_FACTORY_TYPE, __in REFIID, __out IUnknown **);
-template <typename InterfaceType>
-inline void SafeRelease(InterfaceType** currentObject)
-{
- if (*currentObject != NULL) {
- (*currentObject)->Release();
- *currentObject = NULL;
- }
-}
-template <typename InterfaceType>
-inline InterfaceType* SafeAcquire(InterfaceType* newObject)
-{
- if (newObject != NULL) {
- newObject->AddRef();
- }
- return newObject;
-}
-class CDwFontFileStream : public IDWriteFontFileStream, public CFX_Object
-{
-public:
- explicit CDwFontFileStream(void const* fontFileReferenceKey, UINT32 fontFileReferenceKeySize);
- virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void** ppvObject);
- virtual ULONG STDMETHODCALLTYPE AddRef();
- virtual ULONG STDMETHODCALLTYPE Release();
- virtual HRESULT STDMETHODCALLTYPE ReadFileFragment(void const** fragmentStart, UINT64 fileOffset, UINT64 fragmentSize, OUT void** fragmentContext);
- virtual void STDMETHODCALLTYPE ReleaseFileFragment(void* fragmentContext);
- virtual HRESULT STDMETHODCALLTYPE GetFileSize(OUT UINT64* fileSize);
- virtual HRESULT STDMETHODCALLTYPE GetLastWriteTime(OUT UINT64* lastWriteTime);
- bool IsInitialized()
- {
- return resourcePtr_ != NULL;
- }
-private:
- ULONG refCount_;
- void const* resourcePtr_;
- DWORD resourceSize_;
-};
-class CDwFontFileLoader : public IDWriteFontFileLoader, public CFX_Object
-{
-public:
- virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void** ppvObject);
- virtual ULONG STDMETHODCALLTYPE AddRef();
- virtual ULONG STDMETHODCALLTYPE Release();
- virtual HRESULT STDMETHODCALLTYPE CreateStreamFromKey(void const* fontFileReferenceKey, UINT32 fontFileReferenceKeySize, OUT IDWriteFontFileStream** fontFileStream);
-
- static IDWriteFontFileLoader* GetLoader()
- {
- if (instance_ == NULL) {
- instance_ = FX_NEW CDwFontFileLoader();
- return instance_;
- }
- return instance_;
- }
- static bool IsLoaderInitialized()
- {
- return instance_ != NULL;
- }
-private:
- CDwFontFileLoader();
- ULONG refCount_;
- static IDWriteFontFileLoader* instance_;
-};
-class CDwFontContext : public CFX_Object
-{
-public:
- CDwFontContext(IDWriteFactory* dwriteFactory);
- ~CDwFontContext();
- HRESULT Initialize();
-private:
- CDwFontContext(CDwFontContext const&);
- void operator=(CDwFontContext const&);
- HRESULT hr_;
- IDWriteFactory* dwriteFactory_;
-};
-class CDwGdiTextRenderer : public CFX_Object
-{
-public:
- CDwGdiTextRenderer(
- CFX_DIBitmap* pBitmap,
- IDWriteBitmapRenderTarget* bitmapRenderTarget,
- IDWriteRenderingParams* renderingParams
- );
- CDwGdiTextRenderer::~CDwGdiTextRenderer();
- HRESULT STDMETHODCALLTYPE DrawGlyphRun(
- const FX_RECT& text_bbox,
- __in_opt CFX_ClipRgn* pClipRgn,
- __in_opt DWRITE_MATRIX const* pMatrix,
- FLOAT baselineOriginX,
- FLOAT baselineOriginY,
- DWRITE_MEASURING_MODE measuringMode,
- __in DWRITE_GLYPH_RUN const* glyphRun,
- const COLORREF& textColor
- );
-private:
- CFX_DIBitmap* pBitmap_;
- IDWriteBitmapRenderTarget* pRenderTarget_;
- IDWriteRenderingParams* pRenderingParams_;
-};
-CDWriteExt::CDWriteExt()
-{
- m_hModule = NULL;
- m_pDWriteFactory = NULL;
- m_pDwFontContext = NULL;
- m_pDwTextRenderer = NULL;
-}
-void CDWriteExt::Load()
-{
-}
-void CDWriteExt::Unload()
-{
- if (m_pDwFontContext) {
- delete (CDwFontContext*)m_pDwFontContext;
- m_pDwFontContext = NULL;
- }
- SafeRelease((IDWriteFactory**)&m_pDWriteFactory);
-}
-CDWriteExt::~CDWriteExt()
-{
- Unload();
-}
-LPVOID CDWriteExt::DwCreateFontFaceFromStream(FX_LPBYTE pData, FX_DWORD size, int simulation_style)
-{
- IDWriteFactory* pDwFactory = (IDWriteFactory*)m_pDWriteFactory;
- IDWriteFontFile* pDwFontFile = NULL;
- IDWriteFontFace* pDwFontFace = NULL;
- BOOL isSupportedFontType = FALSE;
- DWRITE_FONT_FILE_TYPE fontFileType;
- DWRITE_FONT_FACE_TYPE fontFaceType;
- UINT32 numberOfFaces;
- DWRITE_FONT_SIMULATIONS fontStyle = (DWRITE_FONT_SIMULATIONS)(simulation_style & 3);
- HRESULT hr = S_OK;
- hr = pDwFactory->CreateCustomFontFileReference(
- (void const*)pData,
- (UINT32)size,
- CDwFontFileLoader::GetLoader(),
- &pDwFontFile
- );
- if (FAILED(hr)) {
- goto failed;
- }
- hr = pDwFontFile->Analyze(
- &isSupportedFontType,
- &fontFileType,
- &fontFaceType,
- &numberOfFaces
- );
- if (FAILED(hr) || !isSupportedFontType || fontFaceType == DWRITE_FONT_FACE_TYPE_UNKNOWN) {
- goto failed;
- }
- hr = pDwFactory->CreateFontFace(
- fontFaceType,
- 1,
- &pDwFontFile,
- 0,
- fontStyle,
- &pDwFontFace
- );
- if (FAILED(hr)) {
- goto failed;
- }
- SafeRelease(&pDwFontFile);
- return pDwFontFace;
-failed:
- SafeRelease(&pDwFontFile);
- return NULL;
-}
-FX_BOOL CDWriteExt::DwCreateRenderingTarget(CFX_DIBitmap* pBitmap, void** renderTarget)
-{
- if (pBitmap->GetFormat() > FXDIB_Argb) {
- return FALSE;
- }
- IDWriteFactory* pDwFactory = (IDWriteFactory*)m_pDWriteFactory;
- IDWriteGdiInterop* pGdiInterop = NULL;
- IDWriteBitmapRenderTarget* pBitmapRenderTarget = NULL;
- IDWriteRenderingParams* pRenderingParams = NULL;
- HRESULT hr = S_OK;
- hr = pDwFactory->GetGdiInterop(&pGdiInterop);
- if (FAILED(hr)) {
- goto failed;
- }
- hr = pGdiInterop->CreateBitmapRenderTarget(NULL, pBitmap->GetWidth(), pBitmap->GetHeight(),
- &pBitmapRenderTarget);
- if (FAILED(hr)) {
- goto failed;
- }
- hr = pDwFactory->CreateCustomRenderingParams(
- 1.0f,
- 0.0f,
- 1.0f,
- DWRITE_PIXEL_GEOMETRY_RGB,
- DWRITE_RENDERING_MODE_DEFAULT,
- &pRenderingParams
- );
- if (FAILED(hr)) {
- goto failed;
- }
- hr = pBitmapRenderTarget->SetPixelsPerDip(1.0f);
- if (FAILED(hr)) {
- goto failed;
- }
- *(CDwGdiTextRenderer**)renderTarget = FX_NEW CDwGdiTextRenderer(pBitmap, pBitmapRenderTarget, pRenderingParams);
- if (*(CDwGdiTextRenderer**)renderTarget == NULL) {
- goto failed;
- }
- SafeRelease(&pGdiInterop);
- SafeRelease(&pBitmapRenderTarget);
- SafeRelease(&pRenderingParams);
- return TRUE;
-failed:
- SafeRelease(&pGdiInterop);
- SafeRelease(&pBitmapRenderTarget);
- SafeRelease(&pRenderingParams);
- return FALSE;
-}
-FX_BOOL CDWriteExt::DwRendingString(void* renderTarget, CFX_ClipRgn* pClipRgn, FX_RECT& stringRect, CFX_AffineMatrix* pMatrix,
- void *font, FX_FLOAT font_size, FX_ARGB text_color,
- int glyph_count, unsigned short* glyph_indices,
- FX_FLOAT baselineOriginX, FX_FLOAT baselineOriginY,
- void* glyph_offsets,
- FX_FLOAT* glyph_advances)
-{
- if (renderTarget == NULL) {
- return TRUE;
- }
- CDwGdiTextRenderer* pTextRenderer = (CDwGdiTextRenderer*)renderTarget;
- DWRITE_MATRIX transform;
- DWRITE_GLYPH_RUN glyphRun;
- HRESULT hr = S_OK;
- if (pMatrix) {
- transform.m11 = pMatrix->a;
- transform.m12 = pMatrix->b;
- transform.m21 = pMatrix->c;
- transform.m22 = pMatrix->d;
- transform.dx = pMatrix->e;
- transform.dy = pMatrix->f;
- }
- glyphRun.fontFace = (IDWriteFontFace*)font;
- glyphRun.fontEmSize = font_size;
- glyphRun.glyphCount = glyph_count;
- glyphRun.glyphIndices = glyph_indices;
- glyphRun.glyphAdvances = glyph_advances;
- glyphRun.glyphOffsets = (DWRITE_GLYPH_OFFSET*)glyph_offsets;
- glyphRun.isSideways = FALSE;
- glyphRun.bidiLevel = 0;
- hr = pTextRenderer->DrawGlyphRun(
- stringRect,
- pClipRgn,
- pMatrix ? &transform : NULL,
- baselineOriginX, baselineOriginY,
- DWRITE_MEASURING_MODE_NATURAL,
- &glyphRun,
- RGB(FXARGB_R(text_color), FXARGB_G(text_color), FXARGB_B(text_color))
- );
- return SUCCEEDED(hr) ? TRUE : FALSE;
-}
-void CDWriteExt::DwDeleteRenderingTarget(void* renderTarget)
-{
- if (renderTarget) {
- delete (CDwGdiTextRenderer*)renderTarget;
- }
-}
-void CDWriteExt::DwDeleteFont(void* pFont)
-{
- if (pFont) {
- SafeRelease((IDWriteFontFace**)&pFont);
- }
-}
-CDwFontFileStream::CDwFontFileStream(void const* fontFileReferenceKey, UINT32 fontFileReferenceKeySize)
-{
- refCount_ = 0;
- resourcePtr_ = fontFileReferenceKey;
- resourceSize_ = fontFileReferenceKeySize;
-}
-HRESULT STDMETHODCALLTYPE CDwFontFileStream::QueryInterface(REFIID iid, void** ppvObject)
-{
- if (iid == IID_IUnknown || iid == __uuidof(IDWriteFontFileStream)) {
- *ppvObject = this;
- AddRef();
- return S_OK;
- } else {
- *ppvObject = NULL;
- return E_NOINTERFACE;
- }
-}
-ULONG STDMETHODCALLTYPE CDwFontFileStream::AddRef()
-{
- return InterlockedIncrement((long*)(&refCount_));
-}
-ULONG STDMETHODCALLTYPE CDwFontFileStream::Release()
-{
- ULONG newCount = InterlockedDecrement((long*)(&refCount_));
- if (newCount == 0) {
- delete this;
- }
- return newCount;
-}
-HRESULT STDMETHODCALLTYPE CDwFontFileStream::ReadFileFragment(
- void const** fragmentStart,
- UINT64 fileOffset,
- UINT64 fragmentSize,
- OUT void** fragmentContext
-)
-{
- if (fileOffset <= resourceSize_ &&
- fragmentSize <= resourceSize_ - fileOffset) {
- *fragmentStart = static_cast<FX_BYTE const*>(resourcePtr_) + static_cast<size_t>(fileOffset);
- *fragmentContext = NULL;
- return S_OK;
- } else {
- *fragmentStart = NULL;
- *fragmentContext = NULL;
- return E_FAIL;
- }
-}
-void STDMETHODCALLTYPE CDwFontFileStream::ReleaseFileFragment(void* fragmentContext)
-{
-}
-HRESULT STDMETHODCALLTYPE CDwFontFileStream::GetFileSize(OUT UINT64* fileSize)
-{
- *fileSize = resourceSize_;
- return S_OK;
-}
-HRESULT STDMETHODCALLTYPE CDwFontFileStream::GetLastWriteTime(OUT UINT64* lastWriteTime)
-{
- *lastWriteTime = 0;
- return E_NOTIMPL;
-}
-IDWriteFontFileLoader* CDwFontFileLoader::instance_ = NULL;
-CDwFontFileLoader::CDwFontFileLoader() :
- refCount_(0)
-{
-}
-HRESULT STDMETHODCALLTYPE CDwFontFileLoader::QueryInterface(REFIID iid, void** ppvObject)
-{
- if (iid == IID_IUnknown || iid == __uuidof(IDWriteFontFileLoader)) {
- *ppvObject = this;
- AddRef();
- return S_OK;
- } else {
- *ppvObject = NULL;
- return E_NOINTERFACE;
- }
-}
-ULONG STDMETHODCALLTYPE CDwFontFileLoader::AddRef()
-{
- return InterlockedIncrement((long*)(&refCount_));
-}
-ULONG STDMETHODCALLTYPE CDwFontFileLoader::Release()
-{
- ULONG newCount = InterlockedDecrement((long*)(&refCount_));
- if (newCount == 0) {
- instance_ = NULL;
- delete this;
- }
- return newCount;
-}
-HRESULT STDMETHODCALLTYPE CDwFontFileLoader::CreateStreamFromKey(
- void const* fontFileReferenceKey,
- UINT32 fontFileReferenceKeySize,
- OUT IDWriteFontFileStream** fontFileStream
-)
-{
- *fontFileStream = NULL;
- CDwFontFileStream* stream = FX_NEW CDwFontFileStream(fontFileReferenceKey, fontFileReferenceKeySize);
- if (stream == NULL) {
- return E_OUTOFMEMORY;
- }
- if (!stream->IsInitialized()) {
- delete stream;
- return E_FAIL;
- }
- *fontFileStream = SafeAcquire(stream);
- return S_OK;
-}
-CDwFontContext::CDwFontContext(IDWriteFactory* dwriteFactory) :
- hr_(S_FALSE),
- dwriteFactory_(SafeAcquire(dwriteFactory))
-{
-}
-CDwFontContext::~CDwFontContext()
-{
- if(dwriteFactory_ && hr_ == S_OK) {
- dwriteFactory_->UnregisterFontFileLoader(CDwFontFileLoader::GetLoader());
- }
- SafeRelease(&dwriteFactory_);
-}
-HRESULT CDwFontContext::Initialize()
-{
- if (hr_ == S_FALSE) {
- return hr_ = dwriteFactory_->RegisterFontFileLoader(CDwFontFileLoader::GetLoader());
- }
- return hr_;
-}
-CDwGdiTextRenderer::CDwGdiTextRenderer(CFX_DIBitmap* pBitmap, IDWriteBitmapRenderTarget* bitmapRenderTarget, IDWriteRenderingParams* renderingParams):
- pBitmap_(pBitmap),
- pRenderTarget_(SafeAcquire(bitmapRenderTarget)),
- pRenderingParams_(SafeAcquire(renderingParams))
-{
-}
-CDwGdiTextRenderer::~CDwGdiTextRenderer()
-{
- SafeRelease(&pRenderTarget_);
- SafeRelease(&pRenderingParams_);
-}
-STDMETHODIMP CDwGdiTextRenderer::DrawGlyphRun(
- const FX_RECT& text_bbox,
- __in_opt CFX_ClipRgn* pClipRgn,
- __in_opt DWRITE_MATRIX const* pMatrix,
- FLOAT baselineOriginX,
- FLOAT baselineOriginY,
- DWRITE_MEASURING_MODE measuringMode,
- __in DWRITE_GLYPH_RUN const* glyphRun,
- const COLORREF& textColor
-)
-{
- HRESULT hr = S_OK;
- if (pMatrix) {
- hr = pRenderTarget_->SetCurrentTransform(pMatrix);
- if (FAILED(hr)) {
- return hr;
- }
- }
- HDC hDC = pRenderTarget_->GetMemoryDC();
- HBITMAP hBitmap = (HBITMAP)::GetCurrentObject(hDC, OBJ_BITMAP);
- BITMAP bitmap;
- GetObject(hBitmap, sizeof bitmap, &bitmap);
- CFX_DIBitmap dib;
- dib.Create(
- bitmap.bmWidth,
- bitmap.bmHeight,
- bitmap.bmBitsPixel == 24 ? FXDIB_Rgb : FXDIB_Rgb32,
- (FX_LPBYTE)bitmap.bmBits
- );
- dib.CompositeBitmap(
- text_bbox.left,
- text_bbox.top,
- text_bbox.Width(),
- text_bbox.Height(),
- pBitmap_,
- text_bbox.left,
- text_bbox.top,
- FXDIB_BLEND_NORMAL,
- NULL
- );
- hr = pRenderTarget_->DrawGlyphRun(
- baselineOriginX,
- baselineOriginY,
- measuringMode,
- glyphRun,
- pRenderingParams_,
- textColor
- );
- if (FAILED(hr)) {
- return hr;
- }
- pBitmap_->CompositeBitmap(
- text_bbox.left,
- text_bbox.top,
- text_bbox.Width(),
- text_bbox.Height(),
- &dib,
- text_bbox.left,
- text_bbox.top,
- FXDIB_BLEND_NORMAL,
- pClipRgn
- );
- return hr;
-}
-#endif
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxge/fx_ge.h"
+#if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_
+#include "../../../include/fxge/fx_ge_win32.h"
+#include "dwrite_int.h"
+#include "../Microsoft SDK/include/DWrite.h"
+typedef HRESULT (__stdcall *FuncType_DWriteCreateFactory)(__in DWRITE_FACTORY_TYPE, __in REFIID, __out IUnknown **);
+template <typename InterfaceType>
+inline void SafeRelease(InterfaceType** currentObject)
+{
+ if (*currentObject != NULL) {
+ (*currentObject)->Release();
+ *currentObject = NULL;
+ }
+}
+template <typename InterfaceType>
+inline InterfaceType* SafeAcquire(InterfaceType* newObject)
+{
+ if (newObject != NULL) {
+ newObject->AddRef();
+ }
+ return newObject;
+}
+class CDwFontFileStream : public IDWriteFontFileStream, public CFX_Object
+{
+public:
+ explicit CDwFontFileStream(void const* fontFileReferenceKey, UINT32 fontFileReferenceKeySize);
+ virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void** ppvObject);
+ virtual ULONG STDMETHODCALLTYPE AddRef();
+ virtual ULONG STDMETHODCALLTYPE Release();
+ virtual HRESULT STDMETHODCALLTYPE ReadFileFragment(void const** fragmentStart, UINT64 fileOffset, UINT64 fragmentSize, OUT void** fragmentContext);
+ virtual void STDMETHODCALLTYPE ReleaseFileFragment(void* fragmentContext);
+ virtual HRESULT STDMETHODCALLTYPE GetFileSize(OUT UINT64* fileSize);
+ virtual HRESULT STDMETHODCALLTYPE GetLastWriteTime(OUT UINT64* lastWriteTime);
+ bool IsInitialized()
+ {
+ return resourcePtr_ != NULL;
+ }
+private:
+ ULONG refCount_;
+ void const* resourcePtr_;
+ DWORD resourceSize_;
+};
+class CDwFontFileLoader : public IDWriteFontFileLoader, public CFX_Object
+{
+public:
+ virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void** ppvObject);
+ virtual ULONG STDMETHODCALLTYPE AddRef();
+ virtual ULONG STDMETHODCALLTYPE Release();
+ virtual HRESULT STDMETHODCALLTYPE CreateStreamFromKey(void const* fontFileReferenceKey, UINT32 fontFileReferenceKeySize, OUT IDWriteFontFileStream** fontFileStream);
+
+ static IDWriteFontFileLoader* GetLoader()
+ {
+ if (instance_ == NULL) {
+ instance_ = FX_NEW CDwFontFileLoader();
+ return instance_;
+ }
+ return instance_;
+ }
+ static bool IsLoaderInitialized()
+ {
+ return instance_ != NULL;
+ }
+private:
+ CDwFontFileLoader();
+ ULONG refCount_;
+ static IDWriteFontFileLoader* instance_;
+};
+class CDwFontContext : public CFX_Object
+{
+public:
+ CDwFontContext(IDWriteFactory* dwriteFactory);
+ ~CDwFontContext();
+ HRESULT Initialize();
+private:
+ CDwFontContext(CDwFontContext const&);
+ void operator=(CDwFontContext const&);
+ HRESULT hr_;
+ IDWriteFactory* dwriteFactory_;
+};
+class CDwGdiTextRenderer : public CFX_Object
+{
+public:
+ CDwGdiTextRenderer(
+ CFX_DIBitmap* pBitmap,
+ IDWriteBitmapRenderTarget* bitmapRenderTarget,
+ IDWriteRenderingParams* renderingParams
+ );
+ CDwGdiTextRenderer::~CDwGdiTextRenderer();
+ HRESULT STDMETHODCALLTYPE DrawGlyphRun(
+ const FX_RECT& text_bbox,
+ __in_opt CFX_ClipRgn* pClipRgn,
+ __in_opt DWRITE_MATRIX const* pMatrix,
+ FLOAT baselineOriginX,
+ FLOAT baselineOriginY,
+ DWRITE_MEASURING_MODE measuringMode,
+ __in DWRITE_GLYPH_RUN const* glyphRun,
+ const COLORREF& textColor
+ );
+private:
+ CFX_DIBitmap* pBitmap_;
+ IDWriteBitmapRenderTarget* pRenderTarget_;
+ IDWriteRenderingParams* pRenderingParams_;
+};
+CDWriteExt::CDWriteExt()
+{
+ m_hModule = NULL;
+ m_pDWriteFactory = NULL;
+ m_pDwFontContext = NULL;
+ m_pDwTextRenderer = NULL;
+}
+void CDWriteExt::Load()
+{
+}
+void CDWriteExt::Unload()
+{
+ if (m_pDwFontContext) {
+ delete (CDwFontContext*)m_pDwFontContext;
+ m_pDwFontContext = NULL;
+ }
+ SafeRelease((IDWriteFactory**)&m_pDWriteFactory);
+}
+CDWriteExt::~CDWriteExt()
+{
+ Unload();
+}
+LPVOID CDWriteExt::DwCreateFontFaceFromStream(FX_LPBYTE pData, FX_DWORD size, int simulation_style)
+{
+ IDWriteFactory* pDwFactory = (IDWriteFactory*)m_pDWriteFactory;
+ IDWriteFontFile* pDwFontFile = NULL;
+ IDWriteFontFace* pDwFontFace = NULL;
+ BOOL isSupportedFontType = FALSE;
+ DWRITE_FONT_FILE_TYPE fontFileType;
+ DWRITE_FONT_FACE_TYPE fontFaceType;
+ UINT32 numberOfFaces;
+ DWRITE_FONT_SIMULATIONS fontStyle = (DWRITE_FONT_SIMULATIONS)(simulation_style & 3);
+ HRESULT hr = S_OK;
+ hr = pDwFactory->CreateCustomFontFileReference(
+ (void const*)pData,
+ (UINT32)size,
+ CDwFontFileLoader::GetLoader(),
+ &pDwFontFile
+ );
+ if (FAILED(hr)) {
+ goto failed;
+ }
+ hr = pDwFontFile->Analyze(
+ &isSupportedFontType,
+ &fontFileType,
+ &fontFaceType,
+ &numberOfFaces
+ );
+ if (FAILED(hr) || !isSupportedFontType || fontFaceType == DWRITE_FONT_FACE_TYPE_UNKNOWN) {
+ goto failed;
+ }
+ hr = pDwFactory->CreateFontFace(
+ fontFaceType,
+ 1,
+ &pDwFontFile,
+ 0,
+ fontStyle,
+ &pDwFontFace
+ );
+ if (FAILED(hr)) {
+ goto failed;
+ }
+ SafeRelease(&pDwFontFile);
+ return pDwFontFace;
+failed:
+ SafeRelease(&pDwFontFile);
+ return NULL;
+}
+FX_BOOL CDWriteExt::DwCreateRenderingTarget(CFX_DIBitmap* pBitmap, void** renderTarget)
+{
+ if (pBitmap->GetFormat() > FXDIB_Argb) {
+ return FALSE;
+ }
+ IDWriteFactory* pDwFactory = (IDWriteFactory*)m_pDWriteFactory;
+ IDWriteGdiInterop* pGdiInterop = NULL;
+ IDWriteBitmapRenderTarget* pBitmapRenderTarget = NULL;
+ IDWriteRenderingParams* pRenderingParams = NULL;
+ HRESULT hr = S_OK;
+ hr = pDwFactory->GetGdiInterop(&pGdiInterop);
+ if (FAILED(hr)) {
+ goto failed;
+ }
+ hr = pGdiInterop->CreateBitmapRenderTarget(NULL, pBitmap->GetWidth(), pBitmap->GetHeight(),
+ &pBitmapRenderTarget);
+ if (FAILED(hr)) {
+ goto failed;
+ }
+ hr = pDwFactory->CreateCustomRenderingParams(
+ 1.0f,
+ 0.0f,
+ 1.0f,
+ DWRITE_PIXEL_GEOMETRY_RGB,
+ DWRITE_RENDERING_MODE_DEFAULT,
+ &pRenderingParams
+ );
+ if (FAILED(hr)) {
+ goto failed;
+ }
+ hr = pBitmapRenderTarget->SetPixelsPerDip(1.0f);
+ if (FAILED(hr)) {
+ goto failed;
+ }
+ *(CDwGdiTextRenderer**)renderTarget = FX_NEW CDwGdiTextRenderer(pBitmap, pBitmapRenderTarget, pRenderingParams);
+ if (*(CDwGdiTextRenderer**)renderTarget == NULL) {
+ goto failed;
+ }
+ SafeRelease(&pGdiInterop);
+ SafeRelease(&pBitmapRenderTarget);
+ SafeRelease(&pRenderingParams);
+ return TRUE;
+failed:
+ SafeRelease(&pGdiInterop);
+ SafeRelease(&pBitmapRenderTarget);
+ SafeRelease(&pRenderingParams);
+ return FALSE;
+}
+FX_BOOL CDWriteExt::DwRendingString(void* renderTarget, CFX_ClipRgn* pClipRgn, FX_RECT& stringRect, CFX_AffineMatrix* pMatrix,
+ void *font, FX_FLOAT font_size, FX_ARGB text_color,
+ int glyph_count, unsigned short* glyph_indices,
+ FX_FLOAT baselineOriginX, FX_FLOAT baselineOriginY,
+ void* glyph_offsets,
+ FX_FLOAT* glyph_advances)
+{
+ if (renderTarget == NULL) {
+ return TRUE;
+ }
+ CDwGdiTextRenderer* pTextRenderer = (CDwGdiTextRenderer*)renderTarget;
+ DWRITE_MATRIX transform;
+ DWRITE_GLYPH_RUN glyphRun;
+ HRESULT hr = S_OK;
+ if (pMatrix) {
+ transform.m11 = pMatrix->a;
+ transform.m12 = pMatrix->b;
+ transform.m21 = pMatrix->c;
+ transform.m22 = pMatrix->d;
+ transform.dx = pMatrix->e;
+ transform.dy = pMatrix->f;
+ }
+ glyphRun.fontFace = (IDWriteFontFace*)font;
+ glyphRun.fontEmSize = font_size;
+ glyphRun.glyphCount = glyph_count;
+ glyphRun.glyphIndices = glyph_indices;
+ glyphRun.glyphAdvances = glyph_advances;
+ glyphRun.glyphOffsets = (DWRITE_GLYPH_OFFSET*)glyph_offsets;
+ glyphRun.isSideways = FALSE;
+ glyphRun.bidiLevel = 0;
+ hr = pTextRenderer->DrawGlyphRun(
+ stringRect,
+ pClipRgn,
+ pMatrix ? &transform : NULL,
+ baselineOriginX, baselineOriginY,
+ DWRITE_MEASURING_MODE_NATURAL,
+ &glyphRun,
+ RGB(FXARGB_R(text_color), FXARGB_G(text_color), FXARGB_B(text_color))
+ );
+ return SUCCEEDED(hr) ? TRUE : FALSE;
+}
+void CDWriteExt::DwDeleteRenderingTarget(void* renderTarget)
+{
+ if (renderTarget) {
+ delete (CDwGdiTextRenderer*)renderTarget;
+ }
+}
+void CDWriteExt::DwDeleteFont(void* pFont)
+{
+ if (pFont) {
+ SafeRelease((IDWriteFontFace**)&pFont);
+ }
+}
+CDwFontFileStream::CDwFontFileStream(void const* fontFileReferenceKey, UINT32 fontFileReferenceKeySize)
+{
+ refCount_ = 0;
+ resourcePtr_ = fontFileReferenceKey;
+ resourceSize_ = fontFileReferenceKeySize;
+}
+HRESULT STDMETHODCALLTYPE CDwFontFileStream::QueryInterface(REFIID iid, void** ppvObject)
+{
+ if (iid == IID_IUnknown || iid == __uuidof(IDWriteFontFileStream)) {
+ *ppvObject = this;
+ AddRef();
+ return S_OK;
+ } else {
+ *ppvObject = NULL;
+ return E_NOINTERFACE;
+ }
+}
+ULONG STDMETHODCALLTYPE CDwFontFileStream::AddRef()
+{
+ return InterlockedIncrement((long*)(&refCount_));
+}
+ULONG STDMETHODCALLTYPE CDwFontFileStream::Release()
+{
+ ULONG newCount = InterlockedDecrement((long*)(&refCount_));
+ if (newCount == 0) {
+ delete this;
+ }
+ return newCount;
+}
+HRESULT STDMETHODCALLTYPE CDwFontFileStream::ReadFileFragment(
+ void const** fragmentStart,
+ UINT64 fileOffset,
+ UINT64 fragmentSize,
+ OUT void** fragmentContext
+)
+{
+ if (fileOffset <= resourceSize_ &&
+ fragmentSize <= resourceSize_ - fileOffset) {
+ *fragmentStart = static_cast<FX_BYTE const*>(resourcePtr_) + static_cast<size_t>(fileOffset);
+ *fragmentContext = NULL;
+ return S_OK;
+ } else {
+ *fragmentStart = NULL;
+ *fragmentContext = NULL;
+ return E_FAIL;
+ }
+}
+void STDMETHODCALLTYPE CDwFontFileStream::ReleaseFileFragment(void* fragmentContext)
+{
+}
+HRESULT STDMETHODCALLTYPE CDwFontFileStream::GetFileSize(OUT UINT64* fileSize)
+{
+ *fileSize = resourceSize_;
+ return S_OK;
+}
+HRESULT STDMETHODCALLTYPE CDwFontFileStream::GetLastWriteTime(OUT UINT64* lastWriteTime)
+{
+ *lastWriteTime = 0;
+ return E_NOTIMPL;
+}
+IDWriteFontFileLoader* CDwFontFileLoader::instance_ = NULL;
+CDwFontFileLoader::CDwFontFileLoader() :
+ refCount_(0)
+{
+}
+HRESULT STDMETHODCALLTYPE CDwFontFileLoader::QueryInterface(REFIID iid, void** ppvObject)
+{
+ if (iid == IID_IUnknown || iid == __uuidof(IDWriteFontFileLoader)) {
+ *ppvObject = this;
+ AddRef();
+ return S_OK;
+ } else {
+ *ppvObject = NULL;
+ return E_NOINTERFACE;
+ }
+}
+ULONG STDMETHODCALLTYPE CDwFontFileLoader::AddRef()
+{
+ return InterlockedIncrement((long*)(&refCount_));
+}
+ULONG STDMETHODCALLTYPE CDwFontFileLoader::Release()
+{
+ ULONG newCount = InterlockedDecrement((long*)(&refCount_));
+ if (newCount == 0) {
+ instance_ = NULL;
+ delete this;
+ }
+ return newCount;
+}
+HRESULT STDMETHODCALLTYPE CDwFontFileLoader::CreateStreamFromKey(
+ void const* fontFileReferenceKey,
+ UINT32 fontFileReferenceKeySize,
+ OUT IDWriteFontFileStream** fontFileStream
+)
+{
+ *fontFileStream = NULL;
+ CDwFontFileStream* stream = FX_NEW CDwFontFileStream(fontFileReferenceKey, fontFileReferenceKeySize);
+ if (stream == NULL) {
+ return E_OUTOFMEMORY;
+ }
+ if (!stream->IsInitialized()) {
+ delete stream;
+ return E_FAIL;
+ }
+ *fontFileStream = SafeAcquire(stream);
+ return S_OK;
+}
+CDwFontContext::CDwFontContext(IDWriteFactory* dwriteFactory) :
+ hr_(S_FALSE),
+ dwriteFactory_(SafeAcquire(dwriteFactory))
+{
+}
+CDwFontContext::~CDwFontContext()
+{
+ if(dwriteFactory_ && hr_ == S_OK) {
+ dwriteFactory_->UnregisterFontFileLoader(CDwFontFileLoader::GetLoader());
+ }
+ SafeRelease(&dwriteFactory_);
+}
+HRESULT CDwFontContext::Initialize()
+{
+ if (hr_ == S_FALSE) {
+ return hr_ = dwriteFactory_->RegisterFontFileLoader(CDwFontFileLoader::GetLoader());
+ }
+ return hr_;
+}
+CDwGdiTextRenderer::CDwGdiTextRenderer(CFX_DIBitmap* pBitmap, IDWriteBitmapRenderTarget* bitmapRenderTarget, IDWriteRenderingParams* renderingParams):
+ pBitmap_(pBitmap),
+ pRenderTarget_(SafeAcquire(bitmapRenderTarget)),
+ pRenderingParams_(SafeAcquire(renderingParams))
+{
+}
+CDwGdiTextRenderer::~CDwGdiTextRenderer()
+{
+ SafeRelease(&pRenderTarget_);
+ SafeRelease(&pRenderingParams_);
+}
+STDMETHODIMP CDwGdiTextRenderer::DrawGlyphRun(
+ const FX_RECT& text_bbox,
+ __in_opt CFX_ClipRgn* pClipRgn,
+ __in_opt DWRITE_MATRIX const* pMatrix,
+ FLOAT baselineOriginX,
+ FLOAT baselineOriginY,
+ DWRITE_MEASURING_MODE measuringMode,
+ __in DWRITE_GLYPH_RUN const* glyphRun,
+ const COLORREF& textColor
+)
+{
+ HRESULT hr = S_OK;
+ if (pMatrix) {
+ hr = pRenderTarget_->SetCurrentTransform(pMatrix);
+ if (FAILED(hr)) {
+ return hr;
+ }
+ }
+ HDC hDC = pRenderTarget_->GetMemoryDC();
+ HBITMAP hBitmap = (HBITMAP)::GetCurrentObject(hDC, OBJ_BITMAP);
+ BITMAP bitmap;
+ GetObject(hBitmap, sizeof bitmap, &bitmap);
+ CFX_DIBitmap dib;
+ dib.Create(
+ bitmap.bmWidth,
+ bitmap.bmHeight,
+ bitmap.bmBitsPixel == 24 ? FXDIB_Rgb : FXDIB_Rgb32,
+ (FX_LPBYTE)bitmap.bmBits
+ );
+ dib.CompositeBitmap(
+ text_bbox.left,
+ text_bbox.top,
+ text_bbox.Width(),
+ text_bbox.Height(),
+ pBitmap_,
+ text_bbox.left,
+ text_bbox.top,
+ FXDIB_BLEND_NORMAL,
+ NULL
+ );
+ hr = pRenderTarget_->DrawGlyphRun(
+ baselineOriginX,
+ baselineOriginY,
+ measuringMode,
+ glyphRun,
+ pRenderingParams_,
+ textColor
+ );
+ if (FAILED(hr)) {
+ return hr;
+ }
+ pBitmap_->CompositeBitmap(
+ text_bbox.left,
+ text_bbox.top,
+ text_bbox.Width(),
+ text_bbox.Height(),
+ &dib,
+ text_bbox.left,
+ text_bbox.top,
+ FXDIB_BLEND_NORMAL,
+ pClipRgn
+ );
+ return hr;
+}
+#endif
diff --git a/core/src/fxge/win32/fx_win32_gdipext.cpp b/core/src/fxge/win32/fx_win32_gdipext.cpp
index 7f9240629c..d3aeecc515 100644
--- a/core/src/fxge/win32/fx_win32_gdipext.cpp
+++ b/core/src/fxge/win32/fx_win32_gdipext.cpp
@@ -1,1286 +1,1286 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../../include/fxge/fx_ge.h"
-#if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_
-#include <windows.h>
-#include "../../../include/fxge/fx_ge_win32.h"
-#include "win32_int.h"
-#include "../Microsoft SDK/include/GdiPlus.h"
-using namespace Gdiplus;
-using namespace Gdiplus::DllExports;
-#define GdiFillType2Gdip(fill_type) (fill_type == ALTERNATE ? FillModeAlternate : FillModeWinding)
-static CombineMode GdiCombineMode2Gdip(int mode)
-{
- switch (mode) {
- case RGN_AND:
- return CombineModeIntersect;
- }
- return CombineModeIntersect;
-}
-enum {
- FuncId_GdipCreatePath2,
- FuncId_GdipSetPenDashStyle,
- FuncId_GdipSetPenDashArray,
- FuncId_GdipSetPenDashCap197819,
- FuncId_GdipSetPenLineJoin,
- FuncId_GdipSetPenWidth,
- FuncId_GdipCreateFromHDC,
- FuncId_GdipSetPageUnit,
- FuncId_GdipSetSmoothingMode,
- FuncId_GdipCreateSolidFill,
- FuncId_GdipFillPath,
- FuncId_GdipDeleteBrush,
- FuncId_GdipCreatePen1,
- FuncId_GdipSetPenMiterLimit,
- FuncId_GdipDrawPath,
- FuncId_GdipDeletePen,
- FuncId_GdipDeletePath,
- FuncId_GdipDeleteGraphics,
- FuncId_GdipCreateBitmapFromFileICM,
- FuncId_GdipCreateBitmapFromStreamICM,
- FuncId_GdipGetImageHeight,
- FuncId_GdipGetImageWidth,
- FuncId_GdipGetImagePixelFormat,
- FuncId_GdipBitmapLockBits,
- FuncId_GdipGetImagePaletteSize,
- FuncId_GdipGetImagePalette,
- FuncId_GdipBitmapUnlockBits,
- FuncId_GdipDisposeImage,
- FuncId_GdipFillRectangle,
- FuncId_GdipCreateBitmapFromScan0,
- FuncId_GdipSetImagePalette,
- FuncId_GdipSetInterpolationMode,
- FuncId_GdipDrawImagePointsI,
- FuncId_GdipCreateBitmapFromGdiDib,
- FuncId_GdiplusStartup,
- FuncId_GdipDrawLineI,
- FuncId_GdipResetClip,
- FuncId_GdipCreatePath,
- FuncId_GdipAddPathPath,
- FuncId_GdipSetPathFillMode,
- FuncId_GdipSetClipPath,
- FuncId_GdipGetClip,
- FuncId_GdipCreateRegion,
- FuncId_GdipGetClipBoundsI,
- FuncId_GdipSetClipRegion,
- FuncId_GdipWidenPath,
- FuncId_GdipAddPathLine,
- FuncId_GdipAddPathRectangle,
- FuncId_GdipDeleteRegion,
- FuncId_GdipGetDC,
- FuncId_GdipReleaseDC,
- FuncId_GdipSetPenLineCap197819,
- FuncId_GdipSetPenDashOffset,
- FuncId_GdipResetPath,
- FuncId_GdipCreateRegionPath,
- FuncId_GdipCreateFont,
- FuncId_GdipGetFontSize,
- FuncId_GdipCreateFontFamilyFromName,
- FuncId_GdipSetTextRenderingHint,
- FuncId_GdipDrawDriverString,
- FuncId_GdipCreateMatrix2,
- FuncId_GdipDeleteMatrix,
- FuncId_GdipSetWorldTransform,
- FuncId_GdipResetWorldTransform,
- FuncId_GdipDeleteFontFamily,
- FuncId_GdipDeleteFont,
- FuncId_GdipNewPrivateFontCollection,
- FuncId_GdipDeletePrivateFontCollection,
- FuncId_GdipPrivateAddMemoryFont,
- FuncId_GdipGetFontCollectionFamilyList,
- FuncId_GdipGetFontCollectionFamilyCount,
- FuncId_GdipSetTextContrast,
- FuncId_GdipSetPixelOffsetMode,
- FuncId_GdipGetImageGraphicsContext,
- FuncId_GdipDrawImageI,
- FuncId_GdipDrawImageRectI,
- FuncId_GdipDrawString,
- FuncId_GdipSetPenTransform,
-};
-static LPCSTR g_GdipFuncNames[] = {
- "GdipCreatePath2",
- "GdipSetPenDashStyle",
- "GdipSetPenDashArray",
- "GdipSetPenDashCap197819",
- "GdipSetPenLineJoin",
- "GdipSetPenWidth",
- "GdipCreateFromHDC",
- "GdipSetPageUnit",
- "GdipSetSmoothingMode",
- "GdipCreateSolidFill",
- "GdipFillPath",
- "GdipDeleteBrush",
- "GdipCreatePen1",
- "GdipSetPenMiterLimit",
- "GdipDrawPath",
- "GdipDeletePen",
- "GdipDeletePath",
- "GdipDeleteGraphics",
- "GdipCreateBitmapFromFileICM",
- "GdipCreateBitmapFromStreamICM",
- "GdipGetImageHeight",
- "GdipGetImageWidth",
- "GdipGetImagePixelFormat",
- "GdipBitmapLockBits",
- "GdipGetImagePaletteSize",
- "GdipGetImagePalette",
- "GdipBitmapUnlockBits",
- "GdipDisposeImage",
- "GdipFillRectangle",
- "GdipCreateBitmapFromScan0",
- "GdipSetImagePalette",
- "GdipSetInterpolationMode",
- "GdipDrawImagePointsI",
- "GdipCreateBitmapFromGdiDib",
- "GdiplusStartup",
- "GdipDrawLineI",
- "GdipResetClip",
- "GdipCreatePath",
- "GdipAddPathPath",
- "GdipSetPathFillMode",
- "GdipSetClipPath",
- "GdipGetClip",
- "GdipCreateRegion",
- "GdipGetClipBoundsI",
- "GdipSetClipRegion",
- "GdipWidenPath",
- "GdipAddPathLine",
- "GdipAddPathRectangle",
- "GdipDeleteRegion",
- "GdipGetDC",
- "GdipReleaseDC",
- "GdipSetPenLineCap197819",
- "GdipSetPenDashOffset",
- "GdipResetPath",
- "GdipCreateRegionPath",
- "GdipCreateFont",
- "GdipGetFontSize",
- "GdipCreateFontFamilyFromName",
- "GdipSetTextRenderingHint",
- "GdipDrawDriverString",
- "GdipCreateMatrix2",
- "GdipDeleteMatrix",
- "GdipSetWorldTransform",
- "GdipResetWorldTransform",
- "GdipDeleteFontFamily",
- "GdipDeleteFont",
- "GdipNewPrivateFontCollection",
- "GdipDeletePrivateFontCollection",
- "GdipPrivateAddMemoryFont",
- "GdipGetFontCollectionFamilyList",
- "GdipGetFontCollectionFamilyCount",
- "GdipSetTextContrast",
- "GdipSetPixelOffsetMode",
- "GdipGetImageGraphicsContext",
- "GdipDrawImageI",
- "GdipDrawImageRectI",
- "GdipDrawString",
- "GdipSetPenTransform",
-};
-typedef GpStatus (WINGDIPAPI *FuncType_GdipCreatePath2)(GDIPCONST GpPointF*, GDIPCONST BYTE*, INT, GpFillMode, GpPath **path);
-typedef GpStatus (WINGDIPAPI *FuncType_GdipSetPenDashStyle)(GpPen *pen, GpDashStyle dashstyle);
-typedef GpStatus (WINGDIPAPI *FuncType_GdipSetPenDashArray)(GpPen *pen, GDIPCONST REAL *dash, INT count);
-typedef GpStatus (WINGDIPAPI *FuncType_GdipSetPenDashCap197819)(GpPen *pen, GpDashCap dashCap);
-typedef GpStatus (WINGDIPAPI *FuncType_GdipSetPenLineJoin)(GpPen *pen, GpLineJoin lineJoin);
-typedef GpStatus (WINGDIPAPI *FuncType_GdipSetPenWidth)(GpPen *pen, REAL width);
-typedef GpStatus (WINGDIPAPI *FuncType_GdipCreateFromHDC)(HDC hdc, GpGraphics **graphics);
-typedef GpStatus (WINGDIPAPI *FuncType_GdipSetPageUnit)(GpGraphics *graphics, GpUnit unit);
-typedef GpStatus (WINGDIPAPI *FuncType_GdipSetSmoothingMode)(GpGraphics *graphics, SmoothingMode smoothingMode);
-typedef GpStatus (WINGDIPAPI *FuncType_GdipCreateSolidFill)(ARGB color, GpSolidFill **brush);
-typedef GpStatus (WINGDIPAPI *FuncType_GdipFillPath)(GpGraphics *graphics, GpBrush *brush, GpPath *path);
-typedef GpStatus (WINGDIPAPI *FuncType_GdipDeleteBrush)(GpBrush *brush);
-typedef GpStatus (WINGDIPAPI *FuncType_GdipCreatePen1)(ARGB color, REAL width, GpUnit unit, GpPen **pen);
-typedef GpStatus (WINGDIPAPI *FuncType_GdipSetPenMiterLimit)(GpPen *pen, REAL miterLimit);
-typedef GpStatus (WINGDIPAPI *FuncType_GdipDrawPath)(GpGraphics *graphics, GpPen *pen, GpPath *path);
-typedef GpStatus (WINGDIPAPI *FuncType_GdipDeletePen)(GpPen *pen);
-typedef GpStatus (WINGDIPAPI *FuncType_GdipDeletePath)(GpPath* path);
-typedef GpStatus (WINGDIPAPI *FuncType_GdipDeleteGraphics)(GpGraphics *graphics);
-typedef GpStatus (WINGDIPAPI *FuncType_GdipCreateBitmapFromFileICM)(GDIPCONST WCHAR* filename, GpBitmap **bitmap);
-typedef GpStatus (WINGDIPAPI *FuncType_GdipCreateBitmapFromStreamICM)(IStream* stream, GpBitmap **bitmap);
-typedef GpStatus (WINGDIPAPI *FuncType_GdipGetImageWidth)(GpImage *image, UINT *width);
-typedef GpStatus (WINGDIPAPI *FuncType_GdipGetImageHeight)(GpImage *image, UINT *height);
-typedef GpStatus (WINGDIPAPI *FuncType_GdipGetImagePixelFormat)(GpImage *image, PixelFormat *format);
-typedef GpStatus (WINGDIPAPI *FuncType_GdipBitmapLockBits)(GpBitmap* bitmap, GDIPCONST GpRect* rect, UINT flags, PixelFormat format, BitmapData* lockedBitmapData);
-typedef GpStatus (WINGDIPAPI *FuncType_GdipGetImagePalette)(GpImage *image, ColorPalette *palette, INT size);
-typedef GpStatus (WINGDIPAPI *FuncType_GdipGetImagePaletteSize)(GpImage *image, INT *size);
-typedef GpStatus (WINGDIPAPI *FuncType_GdipBitmapUnlockBits)(GpBitmap* bitmap, BitmapData* lockedBitmapData);
-typedef GpStatus (WINGDIPAPI *FuncType_GdipDisposeImage)(GpImage *image);
-typedef GpStatus (WINGDIPAPI *FuncType_GdipFillRectangle)(GpGraphics *graphics, GpBrush *brush, REAL x, REAL y, REAL width, REAL height);
-typedef GpStatus (WINGDIPAPI *FuncType_GdipCreateBitmapFromScan0)(INT width, INT height, INT stride, PixelFormat format, BYTE* scan0, GpBitmap** bitmap);
-typedef GpStatus (WINGDIPAPI *FuncType_GdipSetImagePalette)(GpImage *image, GDIPCONST ColorPalette *palette);
-typedef GpStatus (WINGDIPAPI *FuncType_GdipSetInterpolationMode)(GpGraphics *graphics, InterpolationMode interpolationMode);
-typedef GpStatus (WINGDIPAPI *FuncType_GdipDrawImagePointsI)(GpGraphics *graphics, GpImage *image, GDIPCONST GpPoint *dstpoints, INT count);
-typedef GpStatus (WINGDIPAPI *FuncType_GdipCreateBitmapFromGdiDib)(GDIPCONST BITMAPINFO* gdiBitmapInfo, VOID* gdiBitmapData, GpBitmap** bitmap);
-typedef Status (WINAPI *FuncType_GdiplusStartup)(OUT FX_UINTPTR *token, const GdiplusStartupInput *input, OUT GdiplusStartupOutput *output);
-typedef GpStatus (WINGDIPAPI *FuncType_GdipDrawLineI)(GpGraphics *graphics, GpPen *pen, int x1, int y1, int x2, int y2);
-typedef GpStatus (WINGDIPAPI *FuncType_GdipResetClip)(GpGraphics *graphics);
-typedef GpStatus (WINGDIPAPI *FuncType_GdipCreatePath)(GpFillMode brushMode, GpPath **path);
-typedef GpStatus (WINGDIPAPI *FuncType_GdipAddPathPath)(GpPath *path, GDIPCONST GpPath* addingPath, BOOL connect);
-typedef GpStatus (WINGDIPAPI *FuncType_GdipSetPathFillMode)(GpPath *path, GpFillMode fillmode);
-typedef GpStatus (WINGDIPAPI *FuncType_GdipSetClipPath)(GpGraphics *graphics, GpPath *path, CombineMode combineMode);
-typedef GpStatus (WINGDIPAPI *FuncType_GdipGetClip)(GpGraphics *graphics, GpRegion *region);
-typedef GpStatus (WINGDIPAPI *FuncType_GdipCreateRegion)(GpRegion **region);
-typedef GpStatus (WINGDIPAPI *FuncType_GdipGetClipBoundsI)(GpGraphics *graphics, GpRect *rect);
-typedef GpStatus (WINGDIPAPI *FuncType_GdipSetClipRegion)(GpGraphics *graphics, GpRegion *region, CombineMode combineMode);
-typedef GpStatus (WINGDIPAPI *FuncType_GdipWidenPath)(GpPath *nativePath, GpPen *pen, GpMatrix *matrix, REAL flatness);
-typedef GpStatus (WINGDIPAPI *FuncType_GdipAddPathLine)(GpPath *path, REAL x1, REAL y1, REAL x2, REAL y2);
-typedef GpStatus (WINGDIPAPI *FuncType_GdipAddPathRectangle)(GpPath *path, REAL x, REAL y, REAL width, REAL height);
-typedef GpStatus (WINGDIPAPI *FuncType_GdipDeleteRegion)(GpRegion *region);
-typedef GpStatus (WINGDIPAPI *FuncType_GdipGetDC)(GpGraphics* graphics, HDC * hdc);
-typedef GpStatus (WINGDIPAPI *FuncType_GdipReleaseDC)(GpGraphics* graphics, HDC hdc);
-typedef GpStatus (WINGDIPAPI *FuncType_GdipSetPenLineCap197819)(GpPen *pen, GpLineCap startCap, GpLineCap endCap, GpDashCap dashCap);
-typedef GpStatus (WINGDIPAPI *FuncType_GdipSetPenDashOffset)(GpPen *pen, REAL offset);
-typedef GpStatus (WINGDIPAPI *FuncType_GdipResetPath)(GpPath *path);
-typedef GpStatus (WINGDIPAPI *FuncType_GdipCreateRegionPath)(GpPath *path, GpRegion **region);
-typedef GpStatus (WINGDIPAPI *FuncType_GdipCreateFont)(GDIPCONST GpFontFamily *fontFamily, REAL emSize, INT style, Unit unit, GpFont **font);
-typedef GpStatus (WINGDIPAPI *FuncType_GdipGetFontSize)(GpFont *font, REAL *size);
-typedef GpStatus (WINGDIPAPI *FuncType_GdipCreateFontFamilyFromName)(GDIPCONST WCHAR *name, GpFontCollection *fontCollection, GpFontFamily **FontFamily);
-typedef GpStatus (WINGDIPAPI *FuncType_GdipSetTextRenderingHint)(GpGraphics *graphics, TextRenderingHint mode);
-typedef GpStatus (WINGDIPAPI *FuncType_GdipDrawDriverString)(GpGraphics *graphics, GDIPCONST UINT16 *text, INT length, GDIPCONST GpFont *font, GDIPCONST GpBrush *brush, GDIPCONST PointF *positions, INT flags, GDIPCONST GpMatrix *matrix);
-typedef GpStatus (WINGDIPAPI *FuncType_GdipCreateMatrix2)(REAL m11, REAL m12, REAL m21, REAL m22, REAL dx, REAL dy, GpMatrix **matrix);
-typedef GpStatus (WINGDIPAPI *FuncType_GdipDeleteMatrix)(GpMatrix *matrix);
-typedef GpStatus (WINGDIPAPI *FuncType_GdipSetWorldTransform)(GpGraphics *graphics, GpMatrix *matrix);
-typedef GpStatus (WINGDIPAPI *FuncType_GdipResetWorldTransform)(GpGraphics *graphics);
-typedef GpStatus (WINGDIPAPI *FuncType_GdipDeleteFontFamily)(GpFontFamily *FontFamily);
-typedef GpStatus (WINGDIPAPI *FuncType_GdipDeleteFont)(GpFont* font);
-typedef GpStatus (WINGDIPAPI *FuncType_GdipNewPrivateFontCollection)(GpFontCollection** fontCollection);
-typedef GpStatus (WINGDIPAPI *FuncType_GdipDeletePrivateFontCollection)(GpFontCollection** fontCollection);
-typedef GpStatus (WINGDIPAPI *FuncType_GdipPrivateAddMemoryFont)(GpFontCollection* fontCollection, GDIPCONST void* memory, INT length);
-typedef GpStatus (WINGDIPAPI *FuncType_GdipGetFontCollectionFamilyList)(GpFontCollection* fontCollection, INT numSought, GpFontFamily* gpfamilies[], INT* numFound);
-typedef GpStatus (WINGDIPAPI *FuncType_GdipGetFontCollectionFamilyCount)(GpFontCollection* fontCollection, INT* numFound);
-typedef GpStatus (WINGDIPAPI *FuncType_GdipSetTextContrast)(GpGraphics *graphics, UINT contrast);
-typedef GpStatus (WINGDIPAPI *FuncType_GdipSetPixelOffsetMode)(GpGraphics* graphics, PixelOffsetMode pixelOffsetMode);
-typedef GpStatus (WINGDIPAPI *FuncType_GdipGetImageGraphicsContext)(GpImage *image, GpGraphics **graphics);
-typedef GpStatus (WINGDIPAPI *FuncType_GdipDrawImageI)(GpGraphics *graphics, GpImage *image, INT x, INT y);
-typedef GpStatus (WINGDIPAPI *FuncType_GdipDrawImageRectI)(GpGraphics *graphics, GpImage *image, INT x, INT y, INT width, INT height);
-typedef GpStatus (WINGDIPAPI *FuncType_GdipDrawString)(GpGraphics *graphics, GDIPCONST WCHAR *string, INT length, GDIPCONST GpFont *font, GDIPCONST RectF *layoutRect, GDIPCONST GpStringFormat *stringFormat, GDIPCONST GpBrush *brush);
-typedef GpStatus (WINGDIPAPI *FuncType_GdipSetPenTransform)(GpPen *pen, GpMatrix *matrix);
-#define CallFunc(funcname) ((FuncType_##funcname)GdiplusExt.m_Functions[FuncId_##funcname])
-typedef HANDLE (__stdcall *FuncType_GdiAddFontMemResourceEx)(PVOID pbFont, DWORD cbFont, PVOID pdv, DWORD *pcFonts);
-typedef BOOL (__stdcall *FuncType_GdiRemoveFontMemResourceEx)(HANDLE handle);
-void* CGdiplusExt::GdiAddFontMemResourceEx(void *pFontdata, FX_DWORD size, void* pdv, FX_DWORD* num_face)
-{
- if (m_pGdiAddFontMemResourceEx) {
- return ((FuncType_GdiAddFontMemResourceEx)m_pGdiAddFontMemResourceEx)((PVOID)pFontdata, (DWORD)size, (PVOID)pdv, (DWORD*)num_face);
- }
- return NULL;
-}
-FX_BOOL CGdiplusExt::GdiRemoveFontMemResourceEx(void* handle)
-{
- if (m_pGdiRemoveFontMemResourseEx) {
- return ((FuncType_GdiRemoveFontMemResourceEx)m_pGdiRemoveFontMemResourseEx)((HANDLE)handle);
- }
- return FALSE;
-}
-static GpBrush* _GdipCreateBrush(DWORD argb)
-{
- CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
- GpSolidFill* solidBrush = NULL;
- CallFunc(GdipCreateSolidFill)((ARGB)argb, &solidBrush);
- return solidBrush;
-}
-static CFX_DIBitmap* _StretchMonoToGray(int dest_width, int dest_height,
- const CFX_DIBitmap* pSource, FX_RECT* pClipRect)
-{
- FX_BOOL bFlipX = dest_width < 0;
- if (bFlipX) {
- dest_width = -dest_width;
- }
- FX_BOOL bFlipY = dest_height < 0;
- if (bFlipY) {
- dest_height = -dest_height;
- }
- int result_width = pClipRect->Width();
- int result_height = pClipRect->Height();
- int result_pitch = (result_width + 3) / 4 * 4;
- CFX_DIBitmap* pStretched = FX_NEW CFX_DIBitmap;
- if (!pStretched) {
- return NULL;
- }
- if (!pStretched->Create(result_width, result_height, FXDIB_8bppRgb)) {
- delete pStretched;
- return NULL;
- }
- LPBYTE dest_buf = pStretched->GetBuffer();
- int src_width = pSource->GetWidth();
- int src_height = pSource->GetHeight();
- int src_count = src_width * src_height;
- int dest_count = dest_width * dest_height;
- int ratio = 255 * dest_count / src_count;
- int y_unit = src_height / dest_height;
- int x_unit = src_width / dest_width;
- int area_unit = y_unit * x_unit;
- LPBYTE src_buf = pSource->GetBuffer();
- int src_pitch = pSource->GetPitch();
- for (int dest_y = 0; dest_y < result_height; dest_y ++) {
- LPBYTE dest_scan = dest_buf + dest_y * result_pitch;
- int src_y_start = bFlipY ? (dest_height - 1 - dest_y - pClipRect->top) : (dest_y + pClipRect->top);
- src_y_start = src_y_start * src_height / dest_height;
- LPBYTE src_scan = src_buf + src_y_start * src_pitch;
- for (int dest_x = 0; dest_x < result_width; dest_x ++) {
- int sum = 0;
- int src_x_start = bFlipX ? (dest_width - 1 - dest_x - pClipRect->left) : (dest_x + pClipRect->left);
- src_x_start = src_x_start * src_width / dest_width;
- int src_x_end = src_x_start + x_unit;
- LPBYTE src_line = src_scan;
- for (int src_y = 0; src_y < y_unit; src_y ++) {
- for (int src_x = src_x_start; src_x < src_x_end; src_x ++) {
- if (!(src_line[src_x / 8] & (1 << (7 - src_x % 8)))) {
- sum += 255;
- }
- }
- src_line += src_pitch;
- }
- dest_scan[dest_x] = 255 - sum / area_unit;
- }
- }
- return pStretched;
-}
-static void OutputImageMask(GpGraphics* pGraphics, BOOL bMonoDevice, const CFX_DIBitmap* pBitmap, int dest_left, int dest_top,
- int dest_width, int dest_height, FX_ARGB argb, const FX_RECT* pClipRect)
-{
- ASSERT(pBitmap->GetBPP() == 1);
- CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
- int src_width = pBitmap->GetWidth(), src_height = pBitmap->GetHeight();
- int src_pitch = pBitmap->GetPitch();
- FX_LPBYTE scan0 = pBitmap->GetBuffer();
- if (src_width == 1 && src_height == 1) {
- if ((scan0[0] & 0x80) == 0) {
- return;
- }
- GpSolidFill* solidBrush;
- CallFunc(GdipCreateSolidFill)((ARGB)argb, &solidBrush);
- if (dest_width < 0) {
- dest_width = -dest_width;
- dest_left -= dest_width;
- }
- if (dest_height < 0) {
- dest_height = -dest_height;
- dest_top -= dest_height;
- }
- CallFunc(GdipFillRectangle)(pGraphics, solidBrush, (float)dest_left, (float)dest_top,
- (float)dest_width, (float)dest_height);
- CallFunc(GdipDeleteBrush)(solidBrush);
- return;
- }
- if (!bMonoDevice && abs(dest_width) < src_width && abs(dest_height) < src_height) {
- FX_RECT image_rect(dest_left, dest_top, dest_left + dest_width, dest_top + dest_height);
- image_rect.Normalize();
- FX_RECT image_clip = image_rect;
- image_clip.Intersect(*pClipRect);
- if (image_clip.IsEmpty()) {
- return;
- }
- image_clip.Offset(-image_rect.left, -image_rect.top);
- CFX_DIBitmap* pStretched = NULL;
- if (src_width * src_height > 10000) {
- pStretched = _StretchMonoToGray(dest_width, dest_height, pBitmap, &image_clip);
- } else {
- pStretched = pBitmap->StretchTo(dest_width, dest_height, FALSE, &image_clip);
- }
- GpBitmap* bitmap;
- CallFunc(GdipCreateBitmapFromScan0)(image_clip.Width(), image_clip.Height(),
- (image_clip.Width() + 3) / 4 * 4, PixelFormat8bppIndexed, pStretched->GetBuffer(), &bitmap);
- int a, r, g, b;
- ArgbDecode(argb, a, r, g, b);
- UINT pal[258];
- pal[0] = 0;
- pal[1] = 256;
- for (int i = 0; i < 256; i ++) {
- pal[i + 2] = ArgbEncode(i * a / 255, r, g, b);
- }
- CallFunc(GdipSetImagePalette)(bitmap, (ColorPalette*)pal);
- CallFunc(GdipDrawImageI)(pGraphics, bitmap, image_rect.left + image_clip.left,
- image_rect.top + image_clip.top);
- CallFunc(GdipDisposeImage)(bitmap);
- delete pStretched;
- return;
- }
- GpBitmap* bitmap;
- CallFunc(GdipCreateBitmapFromScan0)(src_width, src_height, src_pitch, PixelFormat1bppIndexed, scan0, &bitmap);
- UINT palette[4] = { PaletteFlagsHasAlpha, 2, 0, argb };
- CallFunc(GdipSetImagePalette)(bitmap, (ColorPalette*)palette);
- Point destinationPoints[] = {
- Point(dest_left, dest_top),
- Point(dest_left + dest_width, dest_top),
- Point(dest_left, dest_top + dest_height)
- };
- CallFunc(GdipDrawImagePointsI)(pGraphics, bitmap, destinationPoints, 3);
- CallFunc(GdipDisposeImage)(bitmap);
-}
-static void OutputImage(GpGraphics* pGraphics, const CFX_DIBitmap* pBitmap, const FX_RECT* pSrcRect,
- int dest_left, int dest_top, int dest_width, int dest_height)
-{
- int src_width = pSrcRect->Width(), src_height = pSrcRect->Height();
- CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
- if (pBitmap->GetBPP() == 1 && (pSrcRect->left % 8)) {
- FX_RECT new_rect(0, 0, src_width, src_height);
- CFX_DIBitmap* pCloned = pBitmap->Clone(pSrcRect);
- if (!pCloned) {
- return;
- }
- OutputImage(pGraphics, pCloned, &new_rect, dest_left, dest_top, dest_width, dest_height);
- delete pCloned;
- return;
- }
- int src_pitch = pBitmap->GetPitch();
- FX_LPBYTE scan0 = pBitmap->GetBuffer() + pSrcRect->top * src_pitch + pBitmap->GetBPP() * pSrcRect->left / 8;
- GpBitmap* bitmap = NULL;
- switch (pBitmap->GetFormat()) {
- case FXDIB_Argb:
- CallFunc(GdipCreateBitmapFromScan0)(src_width, src_height, src_pitch,
- PixelFormat32bppARGB, scan0, &bitmap);
- break;
- case FXDIB_Rgb32:
- CallFunc(GdipCreateBitmapFromScan0)(src_width, src_height, src_pitch,
- PixelFormat32bppRGB, scan0, &bitmap);
- break;
- case FXDIB_Rgb:
- CallFunc(GdipCreateBitmapFromScan0)(src_width, src_height, src_pitch,
- PixelFormat24bppRGB, scan0, &bitmap);
- break;
- case FXDIB_8bppRgb: {
- CallFunc(GdipCreateBitmapFromScan0)(src_width, src_height, src_pitch,
- PixelFormat8bppIndexed, scan0, &bitmap);
- UINT pal[258];
- pal[0] = 0;
- pal[1] = 256;
- for (int i = 0; i < 256; i ++) {
- pal[i + 2] = pBitmap->GetPaletteEntry(i);
- }
- CallFunc(GdipSetImagePalette)(bitmap, (ColorPalette*)pal);
- break;
- }
- case FXDIB_1bppRgb: {
- CallFunc(GdipCreateBitmapFromScan0)(src_width, src_height, src_pitch,
- PixelFormat1bppIndexed, scan0, &bitmap);
- break;
- }
- }
- if (dest_height < 0) {
- dest_height --;
- }
- if (dest_width < 0) {
- dest_width --;
- }
- Point destinationPoints[] = {
- Point(dest_left, dest_top),
- Point(dest_left + dest_width, dest_top),
- Point(dest_left, dest_top + dest_height)
- };
- CallFunc(GdipDrawImagePointsI)(pGraphics, bitmap, destinationPoints, 3);
- CallFunc(GdipDisposeImage)(bitmap);
-}
-CGdiplusExt::CGdiplusExt()
-{
- m_hModule = NULL;
- m_GdiModule = NULL;
- for (int i = 0; i < sizeof g_GdipFuncNames / sizeof(LPCSTR); i ++) {
- m_Functions[i] = NULL;
- }
- m_pGdiAddFontMemResourceEx = NULL;
- m_pGdiRemoveFontMemResourseEx = NULL;
-}
-void CGdiplusExt::Load()
-{
- CFX_ByteString strPlusPath = "";
- FX_CHAR buf[MAX_PATH];
- GetSystemDirectoryA(buf, MAX_PATH);
- strPlusPath += buf;
- strPlusPath += "\\";
- strPlusPath += "GDIPLUS.DLL";
- m_hModule = LoadLibraryA(strPlusPath);
- if (m_hModule == NULL) {
- return;
- }
- for (int i = 0; i < sizeof g_GdipFuncNames / sizeof(LPCSTR); i ++) {
- m_Functions[i] = GetProcAddress(m_hModule, g_GdipFuncNames[i]);
- if (m_Functions[i] == NULL) {
- m_hModule = NULL;
- return;
- }
- }
- FX_UINTPTR gdiplusToken;
- GdiplusStartupInput gdiplusStartupInput;
- ((FuncType_GdiplusStartup)m_Functions[FuncId_GdiplusStartup])(&gdiplusToken, &gdiplusStartupInput, NULL);
- m_GdiModule = LoadLibraryA("GDI32.DLL");
- if (m_GdiModule == NULL) {
- return;
- }
- m_pGdiAddFontMemResourceEx = GetProcAddress(m_GdiModule, "AddFontMemResourceEx");
- m_pGdiRemoveFontMemResourseEx = GetProcAddress(m_GdiModule, "RemoveFontMemResourceEx");
-}
-CGdiplusExt::~CGdiplusExt()
-{
-}
-LPVOID CGdiplusExt::LoadMemFont(LPBYTE pData, FX_DWORD size)
-{
- GpFontCollection* pCollection = NULL;
- CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
- CallFunc(GdipNewPrivateFontCollection)(&pCollection);
- GpStatus status = CallFunc(GdipPrivateAddMemoryFont)(pCollection, pData, size);
- if (status == Ok) {
- return pCollection;
- }
- CallFunc(GdipDeletePrivateFontCollection)(&pCollection);
- return NULL;
-}
-void CGdiplusExt::DeleteMemFont(LPVOID pCollection)
-{
- CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
- CallFunc(GdipDeletePrivateFontCollection)((GpFontCollection**)&pCollection);
-}
-FX_BOOL CGdiplusExt::GdipCreateBitmap(CFX_DIBitmap* pBitmap, void**bitmap)
-{
- CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
- PixelFormat format;
- switch (pBitmap->GetFormat()) {
- case FXDIB_Rgb:
- format = PixelFormat24bppRGB;
- break;
- case FXDIB_Rgb32:
- format = PixelFormat32bppRGB;
- break;
- case FXDIB_Argb:
- format = PixelFormat32bppARGB;
- break;
- default:
- return FALSE;
- }
- GpStatus status = CallFunc(GdipCreateBitmapFromScan0)(pBitmap->GetWidth(), pBitmap->GetHeight(),
- pBitmap->GetPitch(), format, pBitmap->GetBuffer(), (GpBitmap**)bitmap);
- if (status == Ok) {
- return TRUE;
- }
- return FALSE;
-}
-FX_BOOL CGdiplusExt::GdipCreateFromImage(void* bitmap, void** graphics)
-{
- CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
- GpStatus status = CallFunc(GdipGetImageGraphicsContext)((GpBitmap*)bitmap, (GpGraphics**)graphics);
- if (status == Ok) {
- return TRUE;
- }
- return FALSE;
-}
-FX_BOOL CGdiplusExt::GdipCreateFontFamilyFromName(FX_LPCWSTR name, void* pFontCollection, void**pFamily)
-{
- CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
- GpStatus status = CallFunc(GdipCreateFontFamilyFromName)((GDIPCONST WCHAR *)name, (GpFontCollection*)pFontCollection, (GpFontFamily**)pFamily);
- if (status == Ok) {
- return TRUE;
- }
- return FALSE;
-}
-FX_BOOL CGdiplusExt::GdipCreateFontFromFamily(void* pFamily, FX_FLOAT font_size, int fontstyle, int flag, void** pFont)
-{
- CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
- GpStatus status = CallFunc(GdipCreateFont)((GpFontFamily*)pFamily, font_size, fontstyle, Unit(flag), (GpFont**)pFont);
- if (status == Ok) {
- return TRUE;
- }
- return FALSE;
-}
-void CGdiplusExt::GdipGetFontSize(void *pFont, FX_FLOAT *size)
-{
- REAL get_size;
- CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
- GpStatus status = CallFunc(GdipGetFontSize)((GpFont *)pFont, (REAL*)&get_size);
- if (status == Ok) {
- *size = (FX_FLOAT)get_size;
- } else {
- *size = 0;
- }
-}
-void CGdiplusExt::GdipSetTextRenderingHint(void* graphics, int mode)
-{
- CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
- CallFunc(GdipSetTextRenderingHint)((GpGraphics*)graphics, (TextRenderingHint)mode);
-}
-void CGdiplusExt::GdipSetPageUnit(void* graphics, FX_DWORD unit)
-{
- CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
- CallFunc(GdipSetPageUnit)((GpGraphics*)graphics, (GpUnit)unit);
-}
-FX_BOOL CGdiplusExt::GdipDrawDriverString(void *graphics, unsigned short *text, int length,
- void *font, void* brush, void *positions, int flags, const void *matrix)
-{
- CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
- GpStatus status = CallFunc(GdipDrawDriverString)((GpGraphics*)graphics, (GDIPCONST UINT16 *)text, (INT)length, (GDIPCONST GpFont *)font, (GDIPCONST GpBrush*)brush,
- (GDIPCONST PointF *)positions, (INT)flags, (GDIPCONST GpMatrix *)matrix);
- if (status == Ok) {
- return TRUE;
- }
- return FALSE;
-}
-void CGdiplusExt::GdipCreateBrush(FX_DWORD fill_argb, void** pBrush)
-{
- CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
- CallFunc(GdipCreateSolidFill)((ARGB)fill_argb, (GpSolidFill**)pBrush);
-}
-void CGdiplusExt::GdipDeleteBrush(void* pBrush)
-{
- CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
- CallFunc(GdipDeleteBrush)((GpSolidFill*)pBrush);
-}
-void* CGdiplusExt::GdipCreateFontFromCollection(void* pFontCollection, FX_FLOAT font_size, int fontstyle)
-{
- CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
- int numFamilies = 0;
- GpStatus status = CallFunc(GdipGetFontCollectionFamilyCount)((GpFontCollection*)pFontCollection, &numFamilies);
- if (status != Ok) {
- return NULL;
- }
- GpFontFamily* family_list[1];
- status = CallFunc(GdipGetFontCollectionFamilyList)((GpFontCollection*)pFontCollection, 1, family_list, &numFamilies);
- if (status != Ok) {
- return NULL;
- }
- GpFont* pFont = NULL;
- status = CallFunc(GdipCreateFont)(family_list[0], font_size, fontstyle, UnitPixel, &pFont);
- if (status != Ok) {
- return NULL;
- }
- return pFont;
-}
-void CGdiplusExt::GdipCreateMatrix(FX_FLOAT a, FX_FLOAT b, FX_FLOAT c, FX_FLOAT d, FX_FLOAT e, FX_FLOAT f, void** matrix)
-{
- CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
- CallFunc(GdipCreateMatrix2)(a, b, c, d, e, f, (GpMatrix**)matrix);
-}
-void CGdiplusExt::GdipDeleteMatrix(void* matrix)
-{
- CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
- CallFunc(GdipDeleteMatrix)((GpMatrix*)matrix);
-}
-void CGdiplusExt::GdipDeleteFontFamily(void* pFamily)
-{
- CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
- CallFunc(GdipDeleteFontFamily)((GpFontFamily*)pFamily);
-}
-void CGdiplusExt::GdipDeleteFont(void* pFont)
-{
- CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
- CallFunc(GdipDeleteFont)((GpFont*)pFont);
-}
-void CGdiplusExt::GdipSetWorldTransform(void* graphics, void* pMatrix)
-{
- CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
- CallFunc(GdipSetWorldTransform)((GpGraphics*)graphics, (GpMatrix*)pMatrix);
-}
-void CGdiplusExt::GdipDisposeImage(void* bitmap)
-{
- CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
- CallFunc(GdipDisposeImage)((GpBitmap*)bitmap);
-}
-void CGdiplusExt::GdipDeleteGraphics(void* graphics)
-{
- CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
- CallFunc(GdipDeleteGraphics)((GpGraphics*)graphics);
-}
-FX_BOOL CGdiplusExt::StretchBitMask(HDC hDC, BOOL bMonoDevice, const CFX_DIBitmap* pBitmap, int dest_left, int dest_top,
- int dest_width, int dest_height, FX_DWORD argb, const FX_RECT* pClipRect, int flags)
-{
- ASSERT(pBitmap->GetBPP() == 1);
- CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
- GpGraphics* pGraphics = NULL;
- CallFunc(GdipCreateFromHDC)(hDC, &pGraphics);
- CallFunc(GdipSetPageUnit)(pGraphics, UnitPixel);
- if (flags & FXDIB_NOSMOOTH) {
- CallFunc(GdipSetInterpolationMode)(pGraphics, InterpolationModeNearestNeighbor);
- } else {
- CallFunc(GdipSetInterpolationMode)(pGraphics, InterpolationModeHighQuality);
- }
- OutputImageMask(pGraphics, bMonoDevice, pBitmap, dest_left, dest_top, dest_width, dest_height, argb, pClipRect);
- CallFunc(GdipDeleteGraphics)(pGraphics);
- return TRUE;
-}
-FX_BOOL CGdiplusExt::StretchDIBits(HDC hDC, const CFX_DIBitmap* pBitmap, int dest_left, int dest_top,
- int dest_width, int dest_height, const FX_RECT* pClipRect, int flags)
-{
- GpGraphics* pGraphics;
- CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
- CallFunc(GdipCreateFromHDC)(hDC, &pGraphics);
- CallFunc(GdipSetPageUnit)(pGraphics, UnitPixel);
- if (flags & FXDIB_NOSMOOTH) {
- CallFunc(GdipSetInterpolationMode)(pGraphics, InterpolationModeNearestNeighbor);
- } else if (pBitmap->GetWidth() > abs(dest_width) / 2 || pBitmap->GetHeight() > abs(dest_height) / 2) {
- CallFunc(GdipSetInterpolationMode)(pGraphics, InterpolationModeHighQuality);
- } else {
- CallFunc(GdipSetInterpolationMode)(pGraphics, InterpolationModeBilinear);
- }
- FX_RECT src_rect(0, 0, pBitmap->GetWidth(), pBitmap->GetHeight());
- OutputImage(pGraphics, pBitmap, &src_rect, dest_left, dest_top, dest_width, dest_height);
- CallFunc(GdipDeleteGraphics)(pGraphics);
- CallFunc(GdipDeleteGraphics)(pGraphics);
- return TRUE;
-}
-static GpPen* _GdipCreatePen(const CFX_GraphStateData* pGraphState, const CFX_AffineMatrix* pMatrix, DWORD argb, FX_BOOL bTextMode = FALSE)
-{
- CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
- FX_FLOAT width = pGraphState ? pGraphState->m_LineWidth : 1.0f;
- if (!bTextMode) {
- FX_FLOAT unit = pMatrix == NULL ? 1.0f : FXSYS_Div(1.0f, (pMatrix->GetXUnit() + pMatrix->GetYUnit()) / 2);
- if (width < unit) {
- width = unit;
- }
- }
- GpPen* pPen = NULL;
- CallFunc(GdipCreatePen1)((ARGB)argb, width, UnitWorld, &pPen);
- LineCap lineCap;
- DashCap dashCap = DashCapFlat;
- FX_BOOL bDashExtend = FALSE;
- switch(pGraphState->m_LineCap) {
- case CFX_GraphStateData::LineCapButt:
- lineCap = LineCapFlat;
- break;
- case CFX_GraphStateData::LineCapRound:
- lineCap = LineCapRound;
- dashCap = DashCapRound;
- bDashExtend = TRUE;
- break;
- case CFX_GraphStateData::LineCapSquare:
- lineCap = LineCapSquare;
- bDashExtend = TRUE;
- break;
- }
- CallFunc(GdipSetPenLineCap197819)(pPen, lineCap, lineCap, dashCap);
- LineJoin lineJoin;
- switch(pGraphState->m_LineJoin) {
- case CFX_GraphStateData::LineJoinMiter:
- lineJoin = LineJoinMiterClipped;
- break;
- case CFX_GraphStateData::LineJoinRound:
- lineJoin = LineJoinRound;
- break;
- case CFX_GraphStateData::LineJoinBevel:
- lineJoin = LineJoinBevel;
- break;
- }
- CallFunc(GdipSetPenLineJoin)(pPen, lineJoin);
- if(pGraphState->m_DashCount) {
- FX_FLOAT* pDashArray = FX_Alloc(FX_FLOAT, pGraphState->m_DashCount + pGraphState->m_DashCount % 2);
- if (!pDashArray) {
- return NULL;
- }
- int nCount = 0;
- FX_FLOAT on_leftover = 0, off_leftover = 0;
- for (int i = 0; i < pGraphState->m_DashCount; i += 2) {
- FX_FLOAT on_phase = pGraphState->m_DashArray[i];
- FX_FLOAT off_phase;
- if (i == pGraphState->m_DashCount - 1) {
- off_phase = on_phase;
- } else {
- off_phase = pGraphState->m_DashArray[i + 1];
- }
- on_phase /= width;
- off_phase /= width;
- if (on_phase + off_phase <= 0.00002f) {
- on_phase = 1.0f / 10;
- off_phase = 1.0f / 10;
- }
- if (bDashExtend) {
- if (off_phase < 1) {
- off_phase = 0;
- } else {
- off_phase -= 1;
- }
- on_phase += 1;
- }
- if (on_phase == 0 || off_phase == 0) {
- if (nCount == 0) {
- on_leftover += on_phase;
- off_leftover += off_phase;
- } else {
- pDashArray[nCount - 2] += on_phase;
- pDashArray[nCount - 1] += off_phase;
- }
- } else {
- pDashArray[nCount++] = on_phase + on_leftover;
- on_leftover = 0;
- pDashArray[nCount++] = off_phase + off_leftover;
- off_leftover = 0;
- }
- }
- CallFunc(GdipSetPenDashArray)(pPen, pDashArray, nCount);
- FX_FLOAT phase = pGraphState->m_DashPhase;
- if (bDashExtend)
- if (phase < 0.5f) {
- phase = 0;
- } else {
- phase -= 0.5f;
- }
- CallFunc(GdipSetPenDashOffset)(pPen, phase);
- FX_Free(pDashArray);
- pDashArray = NULL;
- }
- CallFunc(GdipSetPenMiterLimit)(pPen, pGraphState->m_MiterLimit);
- return pPen;
-}
-static BOOL IsSmallTriangle(PointF* points, const CFX_AffineMatrix* pMatrix, int& v1, int& v2)
-{
- int pairs[] = {1, 2, 0, 2, 0, 1};
- for (int i = 0; i < 3; i ++) {
- int pair1 = pairs[i * 2];
- int pair2 = pairs[i * 2 + 1];
- FX_FLOAT x1 = points[pair1].X, x2 = points[pair2].X;
- FX_FLOAT y1 = points[pair1].Y, y2 = points[pair2].Y;
- if (pMatrix) {
- pMatrix->Transform(x1, y1);
- pMatrix->Transform(x2, y2);
- }
- FX_FLOAT dx = x1 - x2;
- FX_FLOAT dy = y1 - y2;
- FX_FLOAT distance_square = FXSYS_Mul(dx, dx) + FXSYS_Mul(dy, dy);
- if (distance_square < (1.0f * 2 + 1.0f / 4)) {
- v1 = i;
- v2 = pair1;
- return TRUE;
- }
- }
- return FALSE;
-}
-BOOL CGdiplusExt::DrawPath(HDC hDC, const CFX_PathData* pPathData,
- const CFX_AffineMatrix* pObject2Device,
- const CFX_GraphStateData* pGraphState,
- FX_DWORD fill_argb,
- FX_DWORD stroke_argb,
- int fill_mode
- )
-{
- int nPoints = pPathData->GetPointCount();
- if (nPoints == 0) {
- return TRUE;
- }
- FX_PATHPOINT* pPoints = pPathData->GetPoints();
- GpGraphics* pGraphics = NULL;
- CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
- CallFunc(GdipCreateFromHDC)(hDC, &pGraphics);
- CallFunc(GdipSetPageUnit)(pGraphics, UnitPixel);
- CallFunc(GdipSetPixelOffsetMode)(pGraphics, PixelOffsetModeHalf);
- GpMatrix* pMatrix = NULL;
- if (pObject2Device) {
- CallFunc(GdipCreateMatrix2)(pObject2Device->a, pObject2Device->b, pObject2Device->c, pObject2Device->d, pObject2Device->e, pObject2Device->f, &pMatrix);
- CallFunc(GdipSetWorldTransform)(pGraphics, pMatrix);
- }
- PointF *points = FX_Alloc(PointF, nPoints);
- if (!points) {
- return FALSE;
- }
- BYTE * types = FX_Alloc(BYTE, nPoints);
- if (!types) {
- FX_Free(points);
- return FALSE;
- }
- int nSubPathes = 0;
- FX_BOOL bSubClose = FALSE;
- int pos_subclose = 0;
- FX_BOOL bSmooth = FALSE;
- int startpoint = 0;
- for(int i = 0; i < nPoints; i++) {
- points[i].X = pPoints[i].m_PointX;
- points[i].Y = pPoints[i].m_PointY;
- FX_FLOAT x, y;
- if (pObject2Device) {
- pObject2Device->Transform(pPoints[i].m_PointX, pPoints[i].m_PointY, x, y);
- } else {
- x = pPoints[i].m_PointX;
- y = pPoints[i].m_PointY;
- }
- if (x > 50000 * 1.0f) {
- points[i].X = 50000 * 1.0f;
- }
- if (x < -50000 * 1.0f) {
- points[i].X = -50000 * 1.0f;
- }
- if (y > 50000 * 1.0f) {
- points[i].Y = 50000 * 1.0f;
- }
- if (y < -50000 * 1.0f) {
- points[i].Y = -50000 * 1.0f;
- }
- int point_type = pPoints[i].m_Flag & FXPT_TYPE;
- if(point_type == FXPT_MOVETO) {
- types[i] = PathPointTypeStart;
- nSubPathes ++;
- bSubClose = FALSE;
- startpoint = i;
- } else if (point_type == FXPT_LINETO) {
- types[i] = PathPointTypeLine;
- if (pPoints[i - 1].m_Flag == FXPT_MOVETO && (i == nPoints - 1 || pPoints[i + 1].m_Flag == FXPT_MOVETO) &&
- points[i].Y == points[i - 1].Y && points[i].X == points[i - 1].X) {
- points[i].X += 0.01f;
- continue;
- }
- if (!bSmooth && points[i].X != points[i - 1].X && points[i].Y != points[i - 1].Y) {
- bSmooth = TRUE;
- }
- } else if (point_type == FXPT_BEZIERTO) {
- types[i] = PathPointTypeBezier;
- bSmooth = TRUE;
- }
- if (pPoints[i].m_Flag & FXPT_CLOSEFIGURE) {
- if (bSubClose) {
- types[pos_subclose] &= ~PathPointTypeCloseSubpath;
- } else {
- bSubClose = TRUE;
- }
- pos_subclose = i;
- types[i] |= PathPointTypeCloseSubpath;
- if (!bSmooth && points[i].X != points[startpoint].X && points[i].Y != points[startpoint].Y) {
- bSmooth = TRUE;
- }
- }
- }
- if (fill_mode & FXFILL_NOPATHSMOOTH) {
- bSmooth = FALSE;
- CallFunc(GdipSetSmoothingMode)(pGraphics, SmoothingModeNone);
- } else if (!(fill_mode & FXFILL_FULLCOVER)) {
- if (!bSmooth && (fill_mode & 3)) {
- bSmooth = TRUE;
- }
- if (bSmooth || pGraphState && pGraphState->m_LineWidth > 2) {
- CallFunc(GdipSetSmoothingMode)(pGraphics, SmoothingModeAntiAlias);
- }
- }
- int new_fill_mode = fill_mode & 3;
- if (nPoints == 4 && pGraphState == NULL) {
- int v1, v2;
- if (IsSmallTriangle(points, pObject2Device, v1, v2)) {
- GpPen* pPen = NULL;
- CallFunc(GdipCreatePen1)(fill_argb, 1.0f, UnitPixel, &pPen);
- CallFunc(GdipDrawLineI)(pGraphics, pPen, FXSYS_round(points[v1].X), FXSYS_round(points[v1].Y),
- FXSYS_round(points[v2].X), FXSYS_round(points[v2].Y));
- CallFunc(GdipDeletePen)(pPen);
- return TRUE;
- }
- }
- GpPath* pGpPath = NULL;
- CallFunc(GdipCreatePath2)(points, types, nPoints, GdiFillType2Gdip(new_fill_mode), &pGpPath);
- if (!pGpPath) {
- if (pMatrix) {
- CallFunc(GdipDeleteMatrix)(pMatrix);
- }
- FX_Free(points);
- FX_Free(types);
- CallFunc(GdipDeleteGraphics)(pGraphics);
- return FALSE;
- }
- if (new_fill_mode) {
- GpBrush* pBrush = _GdipCreateBrush(fill_argb);
- CallFunc(GdipSetPathFillMode)(pGpPath, GdiFillType2Gdip(new_fill_mode));
- CallFunc(GdipFillPath)(pGraphics, pBrush, pGpPath);
- CallFunc(GdipDeleteBrush)(pBrush);
- }
- if (pGraphState && stroke_argb) {
- GpPen* pPen = _GdipCreatePen(pGraphState, pObject2Device, stroke_argb, fill_mode & FX_STROKE_TEXT_MODE);
- if (nSubPathes == 1) {
- CallFunc(GdipDrawPath)(pGraphics, pPen, pGpPath);
- } else {
- int iStart = 0;
- for (int i = 0; i < nPoints; i ++) {
- if (i == nPoints - 1 || types[i + 1] == PathPointTypeStart) {
- GpPath* pSubPath;
- CallFunc(GdipCreatePath2)(points + iStart, types + iStart, i - iStart + 1, GdiFillType2Gdip(new_fill_mode), &pSubPath);
- iStart = i + 1;
- CallFunc(GdipDrawPath)(pGraphics, pPen, pSubPath);
- CallFunc(GdipDeletePath)(pSubPath);
- }
- }
- }
- CallFunc(GdipDeletePen)(pPen);
- }
- if (pMatrix) {
- CallFunc(GdipDeleteMatrix)(pMatrix);
- }
- FX_Free(points);
- FX_Free(types);
- CallFunc(GdipDeletePath)(pGpPath);
- CallFunc(GdipDeleteGraphics)(pGraphics);
- return TRUE;
-}
-class GpStream : public IStream, public CFX_Object
-{
- LONG m_RefCount;
- int m_ReadPos;
- CFX_ByteTextBuf m_InterStream;
-public:
- GpStream()
- {
- m_RefCount = 1;
- m_ReadPos = 0;
- }
- virtual HRESULT STDMETHODCALLTYPE
- QueryInterface(REFIID iid, void ** ppvObject)
- {
- if (iid == __uuidof(IUnknown) || iid == __uuidof(IStream) ||
- iid == __uuidof(ISequentialStream)) {
- *ppvObject = static_cast<IStream*>(this);
- AddRef();
- return S_OK;
- } else {
- return E_NOINTERFACE;
- }
- }
- virtual ULONG STDMETHODCALLTYPE AddRef(void)
- {
- return (ULONG)InterlockedIncrement(&m_RefCount);
- }
- virtual ULONG STDMETHODCALLTYPE Release(void)
- {
- ULONG res = (ULONG) InterlockedDecrement(&m_RefCount);
- if (res == 0) {
- delete this;
- }
- return res;
- }
-public:
- virtual HRESULT STDMETHODCALLTYPE Read(void* Output, ULONG cb, ULONG* pcbRead)
- {
- size_t bytes_left;
- size_t bytes_out;
- if (pcbRead != NULL) {
- *pcbRead = 0;
- }
- if (m_ReadPos == m_InterStream.GetLength()) {
- return HRESULT_FROM_WIN32(ERROR_END_OF_MEDIA);
- }
- bytes_left = m_InterStream.GetLength() - m_ReadPos;
- bytes_out = FX_MIN(cb, bytes_left);
- FXSYS_memcpy32(Output, m_InterStream.GetBuffer() + m_ReadPos, bytes_out);
- m_ReadPos += (FX_INT32)bytes_out;
- if (pcbRead != NULL) {
- *pcbRead = (ULONG)bytes_out;
- }
- return S_OK;
- }
- virtual HRESULT STDMETHODCALLTYPE Write(void const* Input, ULONG cb, ULONG* pcbWritten)
- {
- if (cb <= 0) {
- if (pcbWritten != NULL) {
- *pcbWritten = 0;
- }
- return S_OK;
- }
- m_InterStream.InsertBlock(m_InterStream.GetLength(), Input, cb);
- if (pcbWritten != NULL) {
- *pcbWritten = cb;
- }
- return S_OK;
- }
-public:
- virtual HRESULT STDMETHODCALLTYPE SetSize(ULARGE_INTEGER)
- {
- return E_NOTIMPL;
- }
- virtual HRESULT STDMETHODCALLTYPE CopyTo(IStream*, ULARGE_INTEGER, ULARGE_INTEGER*, ULARGE_INTEGER*)
- {
- return E_NOTIMPL;
- }
- virtual HRESULT STDMETHODCALLTYPE Commit(DWORD)
- {
- return E_NOTIMPL;
- }
- virtual HRESULT STDMETHODCALLTYPE Revert(void)
- {
- return E_NOTIMPL;
- }
- virtual HRESULT STDMETHODCALLTYPE LockRegion(ULARGE_INTEGER, ULARGE_INTEGER, DWORD)
- {
- return E_NOTIMPL;
- }
- virtual HRESULT STDMETHODCALLTYPE UnlockRegion(ULARGE_INTEGER, ULARGE_INTEGER, DWORD)
- {
- return E_NOTIMPL;
- }
- virtual HRESULT STDMETHODCALLTYPE Clone(IStream **)
- {
- return E_NOTIMPL;
- }
- virtual HRESULT STDMETHODCALLTYPE Seek(LARGE_INTEGER liDistanceToMove, DWORD dwOrigin, ULARGE_INTEGER* lpNewFilePointer)
- {
- long start = 0;
- long new_read_position;
- switch(dwOrigin) {
- case STREAM_SEEK_SET:
- start = 0;
- break;
- case STREAM_SEEK_CUR:
- start = m_ReadPos;
- break;
- case STREAM_SEEK_END:
- start = m_InterStream.GetLength();
- break;
- default:
- return STG_E_INVALIDFUNCTION;
- break;
- }
- new_read_position = start + (long)liDistanceToMove.QuadPart;
- if (new_read_position < 0 || new_read_position > m_InterStream.GetLength()) {
- return STG_E_SEEKERROR;
- }
- m_ReadPos = new_read_position;
- if (lpNewFilePointer != NULL) {
- lpNewFilePointer->QuadPart = m_ReadPos;
- }
- return S_OK;
- }
- virtual HRESULT STDMETHODCALLTYPE Stat(STATSTG* pStatstg, DWORD grfStatFlag)
- {
- if (pStatstg == NULL) {
- return STG_E_INVALIDFUNCTION;
- }
- ZeroMemory(pStatstg, sizeof(STATSTG));
- pStatstg->cbSize.QuadPart = m_InterStream.GetLength();
- return S_OK;
- }
-};
-typedef struct {
- BITMAPINFO* pbmi;
- int Stride;
- LPBYTE pScan0;
- GpBitmap* pBitmap;
- BitmapData* pBitmapData;
- GpStream* pStream;
-} PREVIEW3_DIBITMAP;
-static PREVIEW3_DIBITMAP* LoadDIBitmap(WINDIB_Open_Args_ args)
-{
- GpBitmap* pBitmap;
- GpStream* pStream = NULL;
- CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
- Status status = Ok;
- if (args.flags == WINDIB_OPEN_PATHNAME) {
- status = CallFunc(GdipCreateBitmapFromFileICM)((wchar_t*)args.path_name, &pBitmap);
- } else {
- if (args.memory_size == 0 || !args.memory_base) {
- return NULL;
- }
- pStream = FX_NEW GpStream;
- if (!pStream) {
- return NULL;
- }
- pStream->Write(args.memory_base, (ULONG)args.memory_size, NULL);
- status = CallFunc(GdipCreateBitmapFromStreamICM)(pStream, &pBitmap);
- }
- if (status != Ok) {
- if (pStream) {
- pStream->Release();
- }
- return NULL;
- }
- UINT height, width;
- CallFunc(GdipGetImageHeight)(pBitmap, &height);
- CallFunc(GdipGetImageWidth)(pBitmap, &width);
- PixelFormat pixel_format;
- CallFunc(GdipGetImagePixelFormat)(pBitmap, &pixel_format);
- int info_size = sizeof(BITMAPINFOHEADER);
- int bpp = 24;
- int dest_pixel_format = PixelFormat24bppRGB;
- if (pixel_format == PixelFormat1bppIndexed) {
- info_size += 8;
- bpp = 1;
- dest_pixel_format = PixelFormat1bppIndexed;
- } else if (pixel_format == PixelFormat8bppIndexed) {
- info_size += 1024;
- bpp = 8;
- dest_pixel_format = PixelFormat8bppIndexed;
- } else if (pixel_format == PixelFormat32bppARGB) {
- bpp = 32;
- dest_pixel_format = PixelFormat32bppARGB;
- }
- LPBYTE buf = FX_Alloc(BYTE, info_size);
- if (!buf) {
- if (pStream) {
- pStream->Release();
- }
- return NULL;
- }
- BITMAPINFOHEADER* pbmih = (BITMAPINFOHEADER*)buf;
- FXSYS_memset32(buf, 0, info_size);
- pbmih->biBitCount = bpp;
- pbmih->biCompression = BI_RGB;
- pbmih->biHeight = -(int)height;
- pbmih->biPlanes = 1;
- pbmih->biWidth = width;
- Rect rect(0, 0, width, height);
- BitmapData* pBitmapData = FX_Alloc(BitmapData, 1);
- if (!pBitmapData) {
- if (pStream) {
- pStream->Release();
- }
- return NULL;
- }
- CallFunc(GdipBitmapLockBits)(pBitmap, &rect, ImageLockModeRead,
- dest_pixel_format, pBitmapData);
- if (pixel_format == PixelFormat1bppIndexed || pixel_format == PixelFormat8bppIndexed) {
- DWORD* ppal = (DWORD*)(buf + sizeof(BITMAPINFOHEADER));
- struct {
- UINT flags;
- UINT Count;
- DWORD Entries[256];
- } pal;
- int size = 0;
- CallFunc(GdipGetImagePaletteSize)(pBitmap, &size);
- CallFunc(GdipGetImagePalette)(pBitmap, (ColorPalette*)&pal, size);
- int entries = pixel_format == PixelFormat1bppIndexed ? 2 : 256;
- for (int i = 0; i < entries; i ++) {
- ppal[i] = pal.Entries[i] & 0x00ffffff;
- }
- }
- PREVIEW3_DIBITMAP* pInfo = FX_Alloc(PREVIEW3_DIBITMAP, 1);
- if (!pInfo) {
- if (pStream) {
- pStream->Release();
- }
- return NULL;
- }
- pInfo->pbmi = (BITMAPINFO*)buf;
- pInfo->pScan0 = (LPBYTE)pBitmapData->Scan0;
- pInfo->Stride = pBitmapData->Stride;
- pInfo->pBitmap = pBitmap;
- pInfo->pBitmapData = pBitmapData;
- pInfo->pStream = pStream;
- return pInfo;
-}
-static void FreeDIBitmap(PREVIEW3_DIBITMAP* pInfo)
-{
- CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
- CallFunc(GdipBitmapUnlockBits)(pInfo->pBitmap, pInfo->pBitmapData);
- CallFunc(GdipDisposeImage)(pInfo->pBitmap);
- FX_Free(pInfo->pBitmapData);
- FX_Free((LPBYTE)pInfo->pbmi);
- if (pInfo->pStream) {
- pInfo->pStream->Release();
- }
- FX_Free(pInfo);
-}
-CFX_DIBitmap* _FX_WindowsDIB_LoadFromBuf(BITMAPINFO* pbmi, LPVOID pData, FX_BOOL bAlpha);
-CFX_DIBitmap* CGdiplusExt::LoadDIBitmap(WINDIB_Open_Args_ args)
-{
- PREVIEW3_DIBITMAP* pInfo = ::LoadDIBitmap(args);
- if (pInfo == NULL) {
- return NULL;
- }
- int height = abs(pInfo->pbmi->bmiHeader.biHeight);
- int width = pInfo->pbmi->bmiHeader.biWidth;
- int dest_pitch = (width * pInfo->pbmi->bmiHeader.biBitCount + 31) / 32 * 4;
- LPBYTE pData = FX_Alloc(BYTE, dest_pitch * height);
- if (pData == NULL) {
- FreeDIBitmap(pInfo);
- return NULL;
- }
- if (dest_pitch == pInfo->Stride) {
- FXSYS_memcpy32(pData, pInfo->pScan0, dest_pitch * height);
- } else for (int i = 0; i < height; i ++) {
- FXSYS_memcpy32(pData + dest_pitch * i, pInfo->pScan0 + pInfo->Stride * i, dest_pitch);
- }
- CFX_DIBitmap* pDIBitmap = _FX_WindowsDIB_LoadFromBuf(pInfo->pbmi, pData, pInfo->pbmi->bmiHeader.biBitCount == 32);
- FX_Free(pData);
- FreeDIBitmap(pInfo);
- return pDIBitmap;
-}
-#endif
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxge/fx_ge.h"
+#if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_
+#include <windows.h>
+#include "../../../include/fxge/fx_ge_win32.h"
+#include "win32_int.h"
+#include "../Microsoft SDK/include/GdiPlus.h"
+using namespace Gdiplus;
+using namespace Gdiplus::DllExports;
+#define GdiFillType2Gdip(fill_type) (fill_type == ALTERNATE ? FillModeAlternate : FillModeWinding)
+static CombineMode GdiCombineMode2Gdip(int mode)
+{
+ switch (mode) {
+ case RGN_AND:
+ return CombineModeIntersect;
+ }
+ return CombineModeIntersect;
+}
+enum {
+ FuncId_GdipCreatePath2,
+ FuncId_GdipSetPenDashStyle,
+ FuncId_GdipSetPenDashArray,
+ FuncId_GdipSetPenDashCap197819,
+ FuncId_GdipSetPenLineJoin,
+ FuncId_GdipSetPenWidth,
+ FuncId_GdipCreateFromHDC,
+ FuncId_GdipSetPageUnit,
+ FuncId_GdipSetSmoothingMode,
+ FuncId_GdipCreateSolidFill,
+ FuncId_GdipFillPath,
+ FuncId_GdipDeleteBrush,
+ FuncId_GdipCreatePen1,
+ FuncId_GdipSetPenMiterLimit,
+ FuncId_GdipDrawPath,
+ FuncId_GdipDeletePen,
+ FuncId_GdipDeletePath,
+ FuncId_GdipDeleteGraphics,
+ FuncId_GdipCreateBitmapFromFileICM,
+ FuncId_GdipCreateBitmapFromStreamICM,
+ FuncId_GdipGetImageHeight,
+ FuncId_GdipGetImageWidth,
+ FuncId_GdipGetImagePixelFormat,
+ FuncId_GdipBitmapLockBits,
+ FuncId_GdipGetImagePaletteSize,
+ FuncId_GdipGetImagePalette,
+ FuncId_GdipBitmapUnlockBits,
+ FuncId_GdipDisposeImage,
+ FuncId_GdipFillRectangle,
+ FuncId_GdipCreateBitmapFromScan0,
+ FuncId_GdipSetImagePalette,
+ FuncId_GdipSetInterpolationMode,
+ FuncId_GdipDrawImagePointsI,
+ FuncId_GdipCreateBitmapFromGdiDib,
+ FuncId_GdiplusStartup,
+ FuncId_GdipDrawLineI,
+ FuncId_GdipResetClip,
+ FuncId_GdipCreatePath,
+ FuncId_GdipAddPathPath,
+ FuncId_GdipSetPathFillMode,
+ FuncId_GdipSetClipPath,
+ FuncId_GdipGetClip,
+ FuncId_GdipCreateRegion,
+ FuncId_GdipGetClipBoundsI,
+ FuncId_GdipSetClipRegion,
+ FuncId_GdipWidenPath,
+ FuncId_GdipAddPathLine,
+ FuncId_GdipAddPathRectangle,
+ FuncId_GdipDeleteRegion,
+ FuncId_GdipGetDC,
+ FuncId_GdipReleaseDC,
+ FuncId_GdipSetPenLineCap197819,
+ FuncId_GdipSetPenDashOffset,
+ FuncId_GdipResetPath,
+ FuncId_GdipCreateRegionPath,
+ FuncId_GdipCreateFont,
+ FuncId_GdipGetFontSize,
+ FuncId_GdipCreateFontFamilyFromName,
+ FuncId_GdipSetTextRenderingHint,
+ FuncId_GdipDrawDriverString,
+ FuncId_GdipCreateMatrix2,
+ FuncId_GdipDeleteMatrix,
+ FuncId_GdipSetWorldTransform,
+ FuncId_GdipResetWorldTransform,
+ FuncId_GdipDeleteFontFamily,
+ FuncId_GdipDeleteFont,
+ FuncId_GdipNewPrivateFontCollection,
+ FuncId_GdipDeletePrivateFontCollection,
+ FuncId_GdipPrivateAddMemoryFont,
+ FuncId_GdipGetFontCollectionFamilyList,
+ FuncId_GdipGetFontCollectionFamilyCount,
+ FuncId_GdipSetTextContrast,
+ FuncId_GdipSetPixelOffsetMode,
+ FuncId_GdipGetImageGraphicsContext,
+ FuncId_GdipDrawImageI,
+ FuncId_GdipDrawImageRectI,
+ FuncId_GdipDrawString,
+ FuncId_GdipSetPenTransform,
+};
+static LPCSTR g_GdipFuncNames[] = {
+ "GdipCreatePath2",
+ "GdipSetPenDashStyle",
+ "GdipSetPenDashArray",
+ "GdipSetPenDashCap197819",
+ "GdipSetPenLineJoin",
+ "GdipSetPenWidth",
+ "GdipCreateFromHDC",
+ "GdipSetPageUnit",
+ "GdipSetSmoothingMode",
+ "GdipCreateSolidFill",
+ "GdipFillPath",
+ "GdipDeleteBrush",
+ "GdipCreatePen1",
+ "GdipSetPenMiterLimit",
+ "GdipDrawPath",
+ "GdipDeletePen",
+ "GdipDeletePath",
+ "GdipDeleteGraphics",
+ "GdipCreateBitmapFromFileICM",
+ "GdipCreateBitmapFromStreamICM",
+ "GdipGetImageHeight",
+ "GdipGetImageWidth",
+ "GdipGetImagePixelFormat",
+ "GdipBitmapLockBits",
+ "GdipGetImagePaletteSize",
+ "GdipGetImagePalette",
+ "GdipBitmapUnlockBits",
+ "GdipDisposeImage",
+ "GdipFillRectangle",
+ "GdipCreateBitmapFromScan0",
+ "GdipSetImagePalette",
+ "GdipSetInterpolationMode",
+ "GdipDrawImagePointsI",
+ "GdipCreateBitmapFromGdiDib",
+ "GdiplusStartup",
+ "GdipDrawLineI",
+ "GdipResetClip",
+ "GdipCreatePath",
+ "GdipAddPathPath",
+ "GdipSetPathFillMode",
+ "GdipSetClipPath",
+ "GdipGetClip",
+ "GdipCreateRegion",
+ "GdipGetClipBoundsI",
+ "GdipSetClipRegion",
+ "GdipWidenPath",
+ "GdipAddPathLine",
+ "GdipAddPathRectangle",
+ "GdipDeleteRegion",
+ "GdipGetDC",
+ "GdipReleaseDC",
+ "GdipSetPenLineCap197819",
+ "GdipSetPenDashOffset",
+ "GdipResetPath",
+ "GdipCreateRegionPath",
+ "GdipCreateFont",
+ "GdipGetFontSize",
+ "GdipCreateFontFamilyFromName",
+ "GdipSetTextRenderingHint",
+ "GdipDrawDriverString",
+ "GdipCreateMatrix2",
+ "GdipDeleteMatrix",
+ "GdipSetWorldTransform",
+ "GdipResetWorldTransform",
+ "GdipDeleteFontFamily",
+ "GdipDeleteFont",
+ "GdipNewPrivateFontCollection",
+ "GdipDeletePrivateFontCollection",
+ "GdipPrivateAddMemoryFont",
+ "GdipGetFontCollectionFamilyList",
+ "GdipGetFontCollectionFamilyCount",
+ "GdipSetTextContrast",
+ "GdipSetPixelOffsetMode",
+ "GdipGetImageGraphicsContext",
+ "GdipDrawImageI",
+ "GdipDrawImageRectI",
+ "GdipDrawString",
+ "GdipSetPenTransform",
+};
+typedef GpStatus (WINGDIPAPI *FuncType_GdipCreatePath2)(GDIPCONST GpPointF*, GDIPCONST BYTE*, INT, GpFillMode, GpPath **path);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipSetPenDashStyle)(GpPen *pen, GpDashStyle dashstyle);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipSetPenDashArray)(GpPen *pen, GDIPCONST REAL *dash, INT count);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipSetPenDashCap197819)(GpPen *pen, GpDashCap dashCap);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipSetPenLineJoin)(GpPen *pen, GpLineJoin lineJoin);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipSetPenWidth)(GpPen *pen, REAL width);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipCreateFromHDC)(HDC hdc, GpGraphics **graphics);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipSetPageUnit)(GpGraphics *graphics, GpUnit unit);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipSetSmoothingMode)(GpGraphics *graphics, SmoothingMode smoothingMode);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipCreateSolidFill)(ARGB color, GpSolidFill **brush);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipFillPath)(GpGraphics *graphics, GpBrush *brush, GpPath *path);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipDeleteBrush)(GpBrush *brush);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipCreatePen1)(ARGB color, REAL width, GpUnit unit, GpPen **pen);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipSetPenMiterLimit)(GpPen *pen, REAL miterLimit);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipDrawPath)(GpGraphics *graphics, GpPen *pen, GpPath *path);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipDeletePen)(GpPen *pen);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipDeletePath)(GpPath* path);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipDeleteGraphics)(GpGraphics *graphics);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipCreateBitmapFromFileICM)(GDIPCONST WCHAR* filename, GpBitmap **bitmap);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipCreateBitmapFromStreamICM)(IStream* stream, GpBitmap **bitmap);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipGetImageWidth)(GpImage *image, UINT *width);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipGetImageHeight)(GpImage *image, UINT *height);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipGetImagePixelFormat)(GpImage *image, PixelFormat *format);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipBitmapLockBits)(GpBitmap* bitmap, GDIPCONST GpRect* rect, UINT flags, PixelFormat format, BitmapData* lockedBitmapData);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipGetImagePalette)(GpImage *image, ColorPalette *palette, INT size);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipGetImagePaletteSize)(GpImage *image, INT *size);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipBitmapUnlockBits)(GpBitmap* bitmap, BitmapData* lockedBitmapData);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipDisposeImage)(GpImage *image);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipFillRectangle)(GpGraphics *graphics, GpBrush *brush, REAL x, REAL y, REAL width, REAL height);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipCreateBitmapFromScan0)(INT width, INT height, INT stride, PixelFormat format, BYTE* scan0, GpBitmap** bitmap);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipSetImagePalette)(GpImage *image, GDIPCONST ColorPalette *palette);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipSetInterpolationMode)(GpGraphics *graphics, InterpolationMode interpolationMode);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipDrawImagePointsI)(GpGraphics *graphics, GpImage *image, GDIPCONST GpPoint *dstpoints, INT count);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipCreateBitmapFromGdiDib)(GDIPCONST BITMAPINFO* gdiBitmapInfo, VOID* gdiBitmapData, GpBitmap** bitmap);
+typedef Status (WINAPI *FuncType_GdiplusStartup)(OUT FX_UINTPTR *token, const GdiplusStartupInput *input, OUT GdiplusStartupOutput *output);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipDrawLineI)(GpGraphics *graphics, GpPen *pen, int x1, int y1, int x2, int y2);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipResetClip)(GpGraphics *graphics);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipCreatePath)(GpFillMode brushMode, GpPath **path);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipAddPathPath)(GpPath *path, GDIPCONST GpPath* addingPath, BOOL connect);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipSetPathFillMode)(GpPath *path, GpFillMode fillmode);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipSetClipPath)(GpGraphics *graphics, GpPath *path, CombineMode combineMode);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipGetClip)(GpGraphics *graphics, GpRegion *region);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipCreateRegion)(GpRegion **region);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipGetClipBoundsI)(GpGraphics *graphics, GpRect *rect);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipSetClipRegion)(GpGraphics *graphics, GpRegion *region, CombineMode combineMode);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipWidenPath)(GpPath *nativePath, GpPen *pen, GpMatrix *matrix, REAL flatness);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipAddPathLine)(GpPath *path, REAL x1, REAL y1, REAL x2, REAL y2);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipAddPathRectangle)(GpPath *path, REAL x, REAL y, REAL width, REAL height);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipDeleteRegion)(GpRegion *region);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipGetDC)(GpGraphics* graphics, HDC * hdc);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipReleaseDC)(GpGraphics* graphics, HDC hdc);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipSetPenLineCap197819)(GpPen *pen, GpLineCap startCap, GpLineCap endCap, GpDashCap dashCap);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipSetPenDashOffset)(GpPen *pen, REAL offset);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipResetPath)(GpPath *path);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipCreateRegionPath)(GpPath *path, GpRegion **region);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipCreateFont)(GDIPCONST GpFontFamily *fontFamily, REAL emSize, INT style, Unit unit, GpFont **font);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipGetFontSize)(GpFont *font, REAL *size);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipCreateFontFamilyFromName)(GDIPCONST WCHAR *name, GpFontCollection *fontCollection, GpFontFamily **FontFamily);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipSetTextRenderingHint)(GpGraphics *graphics, TextRenderingHint mode);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipDrawDriverString)(GpGraphics *graphics, GDIPCONST UINT16 *text, INT length, GDIPCONST GpFont *font, GDIPCONST GpBrush *brush, GDIPCONST PointF *positions, INT flags, GDIPCONST GpMatrix *matrix);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipCreateMatrix2)(REAL m11, REAL m12, REAL m21, REAL m22, REAL dx, REAL dy, GpMatrix **matrix);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipDeleteMatrix)(GpMatrix *matrix);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipSetWorldTransform)(GpGraphics *graphics, GpMatrix *matrix);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipResetWorldTransform)(GpGraphics *graphics);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipDeleteFontFamily)(GpFontFamily *FontFamily);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipDeleteFont)(GpFont* font);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipNewPrivateFontCollection)(GpFontCollection** fontCollection);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipDeletePrivateFontCollection)(GpFontCollection** fontCollection);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipPrivateAddMemoryFont)(GpFontCollection* fontCollection, GDIPCONST void* memory, INT length);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipGetFontCollectionFamilyList)(GpFontCollection* fontCollection, INT numSought, GpFontFamily* gpfamilies[], INT* numFound);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipGetFontCollectionFamilyCount)(GpFontCollection* fontCollection, INT* numFound);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipSetTextContrast)(GpGraphics *graphics, UINT contrast);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipSetPixelOffsetMode)(GpGraphics* graphics, PixelOffsetMode pixelOffsetMode);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipGetImageGraphicsContext)(GpImage *image, GpGraphics **graphics);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipDrawImageI)(GpGraphics *graphics, GpImage *image, INT x, INT y);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipDrawImageRectI)(GpGraphics *graphics, GpImage *image, INT x, INT y, INT width, INT height);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipDrawString)(GpGraphics *graphics, GDIPCONST WCHAR *string, INT length, GDIPCONST GpFont *font, GDIPCONST RectF *layoutRect, GDIPCONST GpStringFormat *stringFormat, GDIPCONST GpBrush *brush);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipSetPenTransform)(GpPen *pen, GpMatrix *matrix);
+#define CallFunc(funcname) ((FuncType_##funcname)GdiplusExt.m_Functions[FuncId_##funcname])
+typedef HANDLE (__stdcall *FuncType_GdiAddFontMemResourceEx)(PVOID pbFont, DWORD cbFont, PVOID pdv, DWORD *pcFonts);
+typedef BOOL (__stdcall *FuncType_GdiRemoveFontMemResourceEx)(HANDLE handle);
+void* CGdiplusExt::GdiAddFontMemResourceEx(void *pFontdata, FX_DWORD size, void* pdv, FX_DWORD* num_face)
+{
+ if (m_pGdiAddFontMemResourceEx) {
+ return ((FuncType_GdiAddFontMemResourceEx)m_pGdiAddFontMemResourceEx)((PVOID)pFontdata, (DWORD)size, (PVOID)pdv, (DWORD*)num_face);
+ }
+ return NULL;
+}
+FX_BOOL CGdiplusExt::GdiRemoveFontMemResourceEx(void* handle)
+{
+ if (m_pGdiRemoveFontMemResourseEx) {
+ return ((FuncType_GdiRemoveFontMemResourceEx)m_pGdiRemoveFontMemResourseEx)((HANDLE)handle);
+ }
+ return FALSE;
+}
+static GpBrush* _GdipCreateBrush(DWORD argb)
+{
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ GpSolidFill* solidBrush = NULL;
+ CallFunc(GdipCreateSolidFill)((ARGB)argb, &solidBrush);
+ return solidBrush;
+}
+static CFX_DIBitmap* _StretchMonoToGray(int dest_width, int dest_height,
+ const CFX_DIBitmap* pSource, FX_RECT* pClipRect)
+{
+ FX_BOOL bFlipX = dest_width < 0;
+ if (bFlipX) {
+ dest_width = -dest_width;
+ }
+ FX_BOOL bFlipY = dest_height < 0;
+ if (bFlipY) {
+ dest_height = -dest_height;
+ }
+ int result_width = pClipRect->Width();
+ int result_height = pClipRect->Height();
+ int result_pitch = (result_width + 3) / 4 * 4;
+ CFX_DIBitmap* pStretched = FX_NEW CFX_DIBitmap;
+ if (!pStretched) {
+ return NULL;
+ }
+ if (!pStretched->Create(result_width, result_height, FXDIB_8bppRgb)) {
+ delete pStretched;
+ return NULL;
+ }
+ LPBYTE dest_buf = pStretched->GetBuffer();
+ int src_width = pSource->GetWidth();
+ int src_height = pSource->GetHeight();
+ int src_count = src_width * src_height;
+ int dest_count = dest_width * dest_height;
+ int ratio = 255 * dest_count / src_count;
+ int y_unit = src_height / dest_height;
+ int x_unit = src_width / dest_width;
+ int area_unit = y_unit * x_unit;
+ LPBYTE src_buf = pSource->GetBuffer();
+ int src_pitch = pSource->GetPitch();
+ for (int dest_y = 0; dest_y < result_height; dest_y ++) {
+ LPBYTE dest_scan = dest_buf + dest_y * result_pitch;
+ int src_y_start = bFlipY ? (dest_height - 1 - dest_y - pClipRect->top) : (dest_y + pClipRect->top);
+ src_y_start = src_y_start * src_height / dest_height;
+ LPBYTE src_scan = src_buf + src_y_start * src_pitch;
+ for (int dest_x = 0; dest_x < result_width; dest_x ++) {
+ int sum = 0;
+ int src_x_start = bFlipX ? (dest_width - 1 - dest_x - pClipRect->left) : (dest_x + pClipRect->left);
+ src_x_start = src_x_start * src_width / dest_width;
+ int src_x_end = src_x_start + x_unit;
+ LPBYTE src_line = src_scan;
+ for (int src_y = 0; src_y < y_unit; src_y ++) {
+ for (int src_x = src_x_start; src_x < src_x_end; src_x ++) {
+ if (!(src_line[src_x / 8] & (1 << (7 - src_x % 8)))) {
+ sum += 255;
+ }
+ }
+ src_line += src_pitch;
+ }
+ dest_scan[dest_x] = 255 - sum / area_unit;
+ }
+ }
+ return pStretched;
+}
+static void OutputImageMask(GpGraphics* pGraphics, BOOL bMonoDevice, const CFX_DIBitmap* pBitmap, int dest_left, int dest_top,
+ int dest_width, int dest_height, FX_ARGB argb, const FX_RECT* pClipRect)
+{
+ ASSERT(pBitmap->GetBPP() == 1);
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ int src_width = pBitmap->GetWidth(), src_height = pBitmap->GetHeight();
+ int src_pitch = pBitmap->GetPitch();
+ FX_LPBYTE scan0 = pBitmap->GetBuffer();
+ if (src_width == 1 && src_height == 1) {
+ if ((scan0[0] & 0x80) == 0) {
+ return;
+ }
+ GpSolidFill* solidBrush;
+ CallFunc(GdipCreateSolidFill)((ARGB)argb, &solidBrush);
+ if (dest_width < 0) {
+ dest_width = -dest_width;
+ dest_left -= dest_width;
+ }
+ if (dest_height < 0) {
+ dest_height = -dest_height;
+ dest_top -= dest_height;
+ }
+ CallFunc(GdipFillRectangle)(pGraphics, solidBrush, (float)dest_left, (float)dest_top,
+ (float)dest_width, (float)dest_height);
+ CallFunc(GdipDeleteBrush)(solidBrush);
+ return;
+ }
+ if (!bMonoDevice && abs(dest_width) < src_width && abs(dest_height) < src_height) {
+ FX_RECT image_rect(dest_left, dest_top, dest_left + dest_width, dest_top + dest_height);
+ image_rect.Normalize();
+ FX_RECT image_clip = image_rect;
+ image_clip.Intersect(*pClipRect);
+ if (image_clip.IsEmpty()) {
+ return;
+ }
+ image_clip.Offset(-image_rect.left, -image_rect.top);
+ CFX_DIBitmap* pStretched = NULL;
+ if (src_width * src_height > 10000) {
+ pStretched = _StretchMonoToGray(dest_width, dest_height, pBitmap, &image_clip);
+ } else {
+ pStretched = pBitmap->StretchTo(dest_width, dest_height, FALSE, &image_clip);
+ }
+ GpBitmap* bitmap;
+ CallFunc(GdipCreateBitmapFromScan0)(image_clip.Width(), image_clip.Height(),
+ (image_clip.Width() + 3) / 4 * 4, PixelFormat8bppIndexed, pStretched->GetBuffer(), &bitmap);
+ int a, r, g, b;
+ ArgbDecode(argb, a, r, g, b);
+ UINT pal[258];
+ pal[0] = 0;
+ pal[1] = 256;
+ for (int i = 0; i < 256; i ++) {
+ pal[i + 2] = ArgbEncode(i * a / 255, r, g, b);
+ }
+ CallFunc(GdipSetImagePalette)(bitmap, (ColorPalette*)pal);
+ CallFunc(GdipDrawImageI)(pGraphics, bitmap, image_rect.left + image_clip.left,
+ image_rect.top + image_clip.top);
+ CallFunc(GdipDisposeImage)(bitmap);
+ delete pStretched;
+ return;
+ }
+ GpBitmap* bitmap;
+ CallFunc(GdipCreateBitmapFromScan0)(src_width, src_height, src_pitch, PixelFormat1bppIndexed, scan0, &bitmap);
+ UINT palette[4] = { PaletteFlagsHasAlpha, 2, 0, argb };
+ CallFunc(GdipSetImagePalette)(bitmap, (ColorPalette*)palette);
+ Point destinationPoints[] = {
+ Point(dest_left, dest_top),
+ Point(dest_left + dest_width, dest_top),
+ Point(dest_left, dest_top + dest_height)
+ };
+ CallFunc(GdipDrawImagePointsI)(pGraphics, bitmap, destinationPoints, 3);
+ CallFunc(GdipDisposeImage)(bitmap);
+}
+static void OutputImage(GpGraphics* pGraphics, const CFX_DIBitmap* pBitmap, const FX_RECT* pSrcRect,
+ int dest_left, int dest_top, int dest_width, int dest_height)
+{
+ int src_width = pSrcRect->Width(), src_height = pSrcRect->Height();
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ if (pBitmap->GetBPP() == 1 && (pSrcRect->left % 8)) {
+ FX_RECT new_rect(0, 0, src_width, src_height);
+ CFX_DIBitmap* pCloned = pBitmap->Clone(pSrcRect);
+ if (!pCloned) {
+ return;
+ }
+ OutputImage(pGraphics, pCloned, &new_rect, dest_left, dest_top, dest_width, dest_height);
+ delete pCloned;
+ return;
+ }
+ int src_pitch = pBitmap->GetPitch();
+ FX_LPBYTE scan0 = pBitmap->GetBuffer() + pSrcRect->top * src_pitch + pBitmap->GetBPP() * pSrcRect->left / 8;
+ GpBitmap* bitmap = NULL;
+ switch (pBitmap->GetFormat()) {
+ case FXDIB_Argb:
+ CallFunc(GdipCreateBitmapFromScan0)(src_width, src_height, src_pitch,
+ PixelFormat32bppARGB, scan0, &bitmap);
+ break;
+ case FXDIB_Rgb32:
+ CallFunc(GdipCreateBitmapFromScan0)(src_width, src_height, src_pitch,
+ PixelFormat32bppRGB, scan0, &bitmap);
+ break;
+ case FXDIB_Rgb:
+ CallFunc(GdipCreateBitmapFromScan0)(src_width, src_height, src_pitch,
+ PixelFormat24bppRGB, scan0, &bitmap);
+ break;
+ case FXDIB_8bppRgb: {
+ CallFunc(GdipCreateBitmapFromScan0)(src_width, src_height, src_pitch,
+ PixelFormat8bppIndexed, scan0, &bitmap);
+ UINT pal[258];
+ pal[0] = 0;
+ pal[1] = 256;
+ for (int i = 0; i < 256; i ++) {
+ pal[i + 2] = pBitmap->GetPaletteEntry(i);
+ }
+ CallFunc(GdipSetImagePalette)(bitmap, (ColorPalette*)pal);
+ break;
+ }
+ case FXDIB_1bppRgb: {
+ CallFunc(GdipCreateBitmapFromScan0)(src_width, src_height, src_pitch,
+ PixelFormat1bppIndexed, scan0, &bitmap);
+ break;
+ }
+ }
+ if (dest_height < 0) {
+ dest_height --;
+ }
+ if (dest_width < 0) {
+ dest_width --;
+ }
+ Point destinationPoints[] = {
+ Point(dest_left, dest_top),
+ Point(dest_left + dest_width, dest_top),
+ Point(dest_left, dest_top + dest_height)
+ };
+ CallFunc(GdipDrawImagePointsI)(pGraphics, bitmap, destinationPoints, 3);
+ CallFunc(GdipDisposeImage)(bitmap);
+}
+CGdiplusExt::CGdiplusExt()
+{
+ m_hModule = NULL;
+ m_GdiModule = NULL;
+ for (int i = 0; i < sizeof g_GdipFuncNames / sizeof(LPCSTR); i ++) {
+ m_Functions[i] = NULL;
+ }
+ m_pGdiAddFontMemResourceEx = NULL;
+ m_pGdiRemoveFontMemResourseEx = NULL;
+}
+void CGdiplusExt::Load()
+{
+ CFX_ByteString strPlusPath = "";
+ FX_CHAR buf[MAX_PATH];
+ GetSystemDirectoryA(buf, MAX_PATH);
+ strPlusPath += buf;
+ strPlusPath += "\\";
+ strPlusPath += "GDIPLUS.DLL";
+ m_hModule = LoadLibraryA(strPlusPath);
+ if (m_hModule == NULL) {
+ return;
+ }
+ for (int i = 0; i < sizeof g_GdipFuncNames / sizeof(LPCSTR); i ++) {
+ m_Functions[i] = GetProcAddress(m_hModule, g_GdipFuncNames[i]);
+ if (m_Functions[i] == NULL) {
+ m_hModule = NULL;
+ return;
+ }
+ }
+ FX_UINTPTR gdiplusToken;
+ GdiplusStartupInput gdiplusStartupInput;
+ ((FuncType_GdiplusStartup)m_Functions[FuncId_GdiplusStartup])(&gdiplusToken, &gdiplusStartupInput, NULL);
+ m_GdiModule = LoadLibraryA("GDI32.DLL");
+ if (m_GdiModule == NULL) {
+ return;
+ }
+ m_pGdiAddFontMemResourceEx = GetProcAddress(m_GdiModule, "AddFontMemResourceEx");
+ m_pGdiRemoveFontMemResourseEx = GetProcAddress(m_GdiModule, "RemoveFontMemResourceEx");
+}
+CGdiplusExt::~CGdiplusExt()
+{
+}
+LPVOID CGdiplusExt::LoadMemFont(LPBYTE pData, FX_DWORD size)
+{
+ GpFontCollection* pCollection = NULL;
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ CallFunc(GdipNewPrivateFontCollection)(&pCollection);
+ GpStatus status = CallFunc(GdipPrivateAddMemoryFont)(pCollection, pData, size);
+ if (status == Ok) {
+ return pCollection;
+ }
+ CallFunc(GdipDeletePrivateFontCollection)(&pCollection);
+ return NULL;
+}
+void CGdiplusExt::DeleteMemFont(LPVOID pCollection)
+{
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ CallFunc(GdipDeletePrivateFontCollection)((GpFontCollection**)&pCollection);
+}
+FX_BOOL CGdiplusExt::GdipCreateBitmap(CFX_DIBitmap* pBitmap, void**bitmap)
+{
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ PixelFormat format;
+ switch (pBitmap->GetFormat()) {
+ case FXDIB_Rgb:
+ format = PixelFormat24bppRGB;
+ break;
+ case FXDIB_Rgb32:
+ format = PixelFormat32bppRGB;
+ break;
+ case FXDIB_Argb:
+ format = PixelFormat32bppARGB;
+ break;
+ default:
+ return FALSE;
+ }
+ GpStatus status = CallFunc(GdipCreateBitmapFromScan0)(pBitmap->GetWidth(), pBitmap->GetHeight(),
+ pBitmap->GetPitch(), format, pBitmap->GetBuffer(), (GpBitmap**)bitmap);
+ if (status == Ok) {
+ return TRUE;
+ }
+ return FALSE;
+}
+FX_BOOL CGdiplusExt::GdipCreateFromImage(void* bitmap, void** graphics)
+{
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ GpStatus status = CallFunc(GdipGetImageGraphicsContext)((GpBitmap*)bitmap, (GpGraphics**)graphics);
+ if (status == Ok) {
+ return TRUE;
+ }
+ return FALSE;
+}
+FX_BOOL CGdiplusExt::GdipCreateFontFamilyFromName(FX_LPCWSTR name, void* pFontCollection, void**pFamily)
+{
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ GpStatus status = CallFunc(GdipCreateFontFamilyFromName)((GDIPCONST WCHAR *)name, (GpFontCollection*)pFontCollection, (GpFontFamily**)pFamily);
+ if (status == Ok) {
+ return TRUE;
+ }
+ return FALSE;
+}
+FX_BOOL CGdiplusExt::GdipCreateFontFromFamily(void* pFamily, FX_FLOAT font_size, int fontstyle, int flag, void** pFont)
+{
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ GpStatus status = CallFunc(GdipCreateFont)((GpFontFamily*)pFamily, font_size, fontstyle, Unit(flag), (GpFont**)pFont);
+ if (status == Ok) {
+ return TRUE;
+ }
+ return FALSE;
+}
+void CGdiplusExt::GdipGetFontSize(void *pFont, FX_FLOAT *size)
+{
+ REAL get_size;
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ GpStatus status = CallFunc(GdipGetFontSize)((GpFont *)pFont, (REAL*)&get_size);
+ if (status == Ok) {
+ *size = (FX_FLOAT)get_size;
+ } else {
+ *size = 0;
+ }
+}
+void CGdiplusExt::GdipSetTextRenderingHint(void* graphics, int mode)
+{
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ CallFunc(GdipSetTextRenderingHint)((GpGraphics*)graphics, (TextRenderingHint)mode);
+}
+void CGdiplusExt::GdipSetPageUnit(void* graphics, FX_DWORD unit)
+{
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ CallFunc(GdipSetPageUnit)((GpGraphics*)graphics, (GpUnit)unit);
+}
+FX_BOOL CGdiplusExt::GdipDrawDriverString(void *graphics, unsigned short *text, int length,
+ void *font, void* brush, void *positions, int flags, const void *matrix)
+{
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ GpStatus status = CallFunc(GdipDrawDriverString)((GpGraphics*)graphics, (GDIPCONST UINT16 *)text, (INT)length, (GDIPCONST GpFont *)font, (GDIPCONST GpBrush*)brush,
+ (GDIPCONST PointF *)positions, (INT)flags, (GDIPCONST GpMatrix *)matrix);
+ if (status == Ok) {
+ return TRUE;
+ }
+ return FALSE;
+}
+void CGdiplusExt::GdipCreateBrush(FX_DWORD fill_argb, void** pBrush)
+{
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ CallFunc(GdipCreateSolidFill)((ARGB)fill_argb, (GpSolidFill**)pBrush);
+}
+void CGdiplusExt::GdipDeleteBrush(void* pBrush)
+{
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ CallFunc(GdipDeleteBrush)((GpSolidFill*)pBrush);
+}
+void* CGdiplusExt::GdipCreateFontFromCollection(void* pFontCollection, FX_FLOAT font_size, int fontstyle)
+{
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ int numFamilies = 0;
+ GpStatus status = CallFunc(GdipGetFontCollectionFamilyCount)((GpFontCollection*)pFontCollection, &numFamilies);
+ if (status != Ok) {
+ return NULL;
+ }
+ GpFontFamily* family_list[1];
+ status = CallFunc(GdipGetFontCollectionFamilyList)((GpFontCollection*)pFontCollection, 1, family_list, &numFamilies);
+ if (status != Ok) {
+ return NULL;
+ }
+ GpFont* pFont = NULL;
+ status = CallFunc(GdipCreateFont)(family_list[0], font_size, fontstyle, UnitPixel, &pFont);
+ if (status != Ok) {
+ return NULL;
+ }
+ return pFont;
+}
+void CGdiplusExt::GdipCreateMatrix(FX_FLOAT a, FX_FLOAT b, FX_FLOAT c, FX_FLOAT d, FX_FLOAT e, FX_FLOAT f, void** matrix)
+{
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ CallFunc(GdipCreateMatrix2)(a, b, c, d, e, f, (GpMatrix**)matrix);
+}
+void CGdiplusExt::GdipDeleteMatrix(void* matrix)
+{
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ CallFunc(GdipDeleteMatrix)((GpMatrix*)matrix);
+}
+void CGdiplusExt::GdipDeleteFontFamily(void* pFamily)
+{
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ CallFunc(GdipDeleteFontFamily)((GpFontFamily*)pFamily);
+}
+void CGdiplusExt::GdipDeleteFont(void* pFont)
+{
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ CallFunc(GdipDeleteFont)((GpFont*)pFont);
+}
+void CGdiplusExt::GdipSetWorldTransform(void* graphics, void* pMatrix)
+{
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ CallFunc(GdipSetWorldTransform)((GpGraphics*)graphics, (GpMatrix*)pMatrix);
+}
+void CGdiplusExt::GdipDisposeImage(void* bitmap)
+{
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ CallFunc(GdipDisposeImage)((GpBitmap*)bitmap);
+}
+void CGdiplusExt::GdipDeleteGraphics(void* graphics)
+{
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ CallFunc(GdipDeleteGraphics)((GpGraphics*)graphics);
+}
+FX_BOOL CGdiplusExt::StretchBitMask(HDC hDC, BOOL bMonoDevice, const CFX_DIBitmap* pBitmap, int dest_left, int dest_top,
+ int dest_width, int dest_height, FX_DWORD argb, const FX_RECT* pClipRect, int flags)
+{
+ ASSERT(pBitmap->GetBPP() == 1);
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ GpGraphics* pGraphics = NULL;
+ CallFunc(GdipCreateFromHDC)(hDC, &pGraphics);
+ CallFunc(GdipSetPageUnit)(pGraphics, UnitPixel);
+ if (flags & FXDIB_NOSMOOTH) {
+ CallFunc(GdipSetInterpolationMode)(pGraphics, InterpolationModeNearestNeighbor);
+ } else {
+ CallFunc(GdipSetInterpolationMode)(pGraphics, InterpolationModeHighQuality);
+ }
+ OutputImageMask(pGraphics, bMonoDevice, pBitmap, dest_left, dest_top, dest_width, dest_height, argb, pClipRect);
+ CallFunc(GdipDeleteGraphics)(pGraphics);
+ return TRUE;
+}
+FX_BOOL CGdiplusExt::StretchDIBits(HDC hDC, const CFX_DIBitmap* pBitmap, int dest_left, int dest_top,
+ int dest_width, int dest_height, const FX_RECT* pClipRect, int flags)
+{
+ GpGraphics* pGraphics;
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ CallFunc(GdipCreateFromHDC)(hDC, &pGraphics);
+ CallFunc(GdipSetPageUnit)(pGraphics, UnitPixel);
+ if (flags & FXDIB_NOSMOOTH) {
+ CallFunc(GdipSetInterpolationMode)(pGraphics, InterpolationModeNearestNeighbor);
+ } else if (pBitmap->GetWidth() > abs(dest_width) / 2 || pBitmap->GetHeight() > abs(dest_height) / 2) {
+ CallFunc(GdipSetInterpolationMode)(pGraphics, InterpolationModeHighQuality);
+ } else {
+ CallFunc(GdipSetInterpolationMode)(pGraphics, InterpolationModeBilinear);
+ }
+ FX_RECT src_rect(0, 0, pBitmap->GetWidth(), pBitmap->GetHeight());
+ OutputImage(pGraphics, pBitmap, &src_rect, dest_left, dest_top, dest_width, dest_height);
+ CallFunc(GdipDeleteGraphics)(pGraphics);
+ CallFunc(GdipDeleteGraphics)(pGraphics);
+ return TRUE;
+}
+static GpPen* _GdipCreatePen(const CFX_GraphStateData* pGraphState, const CFX_AffineMatrix* pMatrix, DWORD argb, FX_BOOL bTextMode = FALSE)
+{
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ FX_FLOAT width = pGraphState ? pGraphState->m_LineWidth : 1.0f;
+ if (!bTextMode) {
+ FX_FLOAT unit = pMatrix == NULL ? 1.0f : FXSYS_Div(1.0f, (pMatrix->GetXUnit() + pMatrix->GetYUnit()) / 2);
+ if (width < unit) {
+ width = unit;
+ }
+ }
+ GpPen* pPen = NULL;
+ CallFunc(GdipCreatePen1)((ARGB)argb, width, UnitWorld, &pPen);
+ LineCap lineCap;
+ DashCap dashCap = DashCapFlat;
+ FX_BOOL bDashExtend = FALSE;
+ switch(pGraphState->m_LineCap) {
+ case CFX_GraphStateData::LineCapButt:
+ lineCap = LineCapFlat;
+ break;
+ case CFX_GraphStateData::LineCapRound:
+ lineCap = LineCapRound;
+ dashCap = DashCapRound;
+ bDashExtend = TRUE;
+ break;
+ case CFX_GraphStateData::LineCapSquare:
+ lineCap = LineCapSquare;
+ bDashExtend = TRUE;
+ break;
+ }
+ CallFunc(GdipSetPenLineCap197819)(pPen, lineCap, lineCap, dashCap);
+ LineJoin lineJoin;
+ switch(pGraphState->m_LineJoin) {
+ case CFX_GraphStateData::LineJoinMiter:
+ lineJoin = LineJoinMiterClipped;
+ break;
+ case CFX_GraphStateData::LineJoinRound:
+ lineJoin = LineJoinRound;
+ break;
+ case CFX_GraphStateData::LineJoinBevel:
+ lineJoin = LineJoinBevel;
+ break;
+ }
+ CallFunc(GdipSetPenLineJoin)(pPen, lineJoin);
+ if(pGraphState->m_DashCount) {
+ FX_FLOAT* pDashArray = FX_Alloc(FX_FLOAT, pGraphState->m_DashCount + pGraphState->m_DashCount % 2);
+ if (!pDashArray) {
+ return NULL;
+ }
+ int nCount = 0;
+ FX_FLOAT on_leftover = 0, off_leftover = 0;
+ for (int i = 0; i < pGraphState->m_DashCount; i += 2) {
+ FX_FLOAT on_phase = pGraphState->m_DashArray[i];
+ FX_FLOAT off_phase;
+ if (i == pGraphState->m_DashCount - 1) {
+ off_phase = on_phase;
+ } else {
+ off_phase = pGraphState->m_DashArray[i + 1];
+ }
+ on_phase /= width;
+ off_phase /= width;
+ if (on_phase + off_phase <= 0.00002f) {
+ on_phase = 1.0f / 10;
+ off_phase = 1.0f / 10;
+ }
+ if (bDashExtend) {
+ if (off_phase < 1) {
+ off_phase = 0;
+ } else {
+ off_phase -= 1;
+ }
+ on_phase += 1;
+ }
+ if (on_phase == 0 || off_phase == 0) {
+ if (nCount == 0) {
+ on_leftover += on_phase;
+ off_leftover += off_phase;
+ } else {
+ pDashArray[nCount - 2] += on_phase;
+ pDashArray[nCount - 1] += off_phase;
+ }
+ } else {
+ pDashArray[nCount++] = on_phase + on_leftover;
+ on_leftover = 0;
+ pDashArray[nCount++] = off_phase + off_leftover;
+ off_leftover = 0;
+ }
+ }
+ CallFunc(GdipSetPenDashArray)(pPen, pDashArray, nCount);
+ FX_FLOAT phase = pGraphState->m_DashPhase;
+ if (bDashExtend)
+ if (phase < 0.5f) {
+ phase = 0;
+ } else {
+ phase -= 0.5f;
+ }
+ CallFunc(GdipSetPenDashOffset)(pPen, phase);
+ FX_Free(pDashArray);
+ pDashArray = NULL;
+ }
+ CallFunc(GdipSetPenMiterLimit)(pPen, pGraphState->m_MiterLimit);
+ return pPen;
+}
+static BOOL IsSmallTriangle(PointF* points, const CFX_AffineMatrix* pMatrix, int& v1, int& v2)
+{
+ int pairs[] = {1, 2, 0, 2, 0, 1};
+ for (int i = 0; i < 3; i ++) {
+ int pair1 = pairs[i * 2];
+ int pair2 = pairs[i * 2 + 1];
+ FX_FLOAT x1 = points[pair1].X, x2 = points[pair2].X;
+ FX_FLOAT y1 = points[pair1].Y, y2 = points[pair2].Y;
+ if (pMatrix) {
+ pMatrix->Transform(x1, y1);
+ pMatrix->Transform(x2, y2);
+ }
+ FX_FLOAT dx = x1 - x2;
+ FX_FLOAT dy = y1 - y2;
+ FX_FLOAT distance_square = FXSYS_Mul(dx, dx) + FXSYS_Mul(dy, dy);
+ if (distance_square < (1.0f * 2 + 1.0f / 4)) {
+ v1 = i;
+ v2 = pair1;
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+BOOL CGdiplusExt::DrawPath(HDC hDC, const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pObject2Device,
+ const CFX_GraphStateData* pGraphState,
+ FX_DWORD fill_argb,
+ FX_DWORD stroke_argb,
+ int fill_mode
+ )
+{
+ int nPoints = pPathData->GetPointCount();
+ if (nPoints == 0) {
+ return TRUE;
+ }
+ FX_PATHPOINT* pPoints = pPathData->GetPoints();
+ GpGraphics* pGraphics = NULL;
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ CallFunc(GdipCreateFromHDC)(hDC, &pGraphics);
+ CallFunc(GdipSetPageUnit)(pGraphics, UnitPixel);
+ CallFunc(GdipSetPixelOffsetMode)(pGraphics, PixelOffsetModeHalf);
+ GpMatrix* pMatrix = NULL;
+ if (pObject2Device) {
+ CallFunc(GdipCreateMatrix2)(pObject2Device->a, pObject2Device->b, pObject2Device->c, pObject2Device->d, pObject2Device->e, pObject2Device->f, &pMatrix);
+ CallFunc(GdipSetWorldTransform)(pGraphics, pMatrix);
+ }
+ PointF *points = FX_Alloc(PointF, nPoints);
+ if (!points) {
+ return FALSE;
+ }
+ BYTE * types = FX_Alloc(BYTE, nPoints);
+ if (!types) {
+ FX_Free(points);
+ return FALSE;
+ }
+ int nSubPathes = 0;
+ FX_BOOL bSubClose = FALSE;
+ int pos_subclose = 0;
+ FX_BOOL bSmooth = FALSE;
+ int startpoint = 0;
+ for(int i = 0; i < nPoints; i++) {
+ points[i].X = pPoints[i].m_PointX;
+ points[i].Y = pPoints[i].m_PointY;
+ FX_FLOAT x, y;
+ if (pObject2Device) {
+ pObject2Device->Transform(pPoints[i].m_PointX, pPoints[i].m_PointY, x, y);
+ } else {
+ x = pPoints[i].m_PointX;
+ y = pPoints[i].m_PointY;
+ }
+ if (x > 50000 * 1.0f) {
+ points[i].X = 50000 * 1.0f;
+ }
+ if (x < -50000 * 1.0f) {
+ points[i].X = -50000 * 1.0f;
+ }
+ if (y > 50000 * 1.0f) {
+ points[i].Y = 50000 * 1.0f;
+ }
+ if (y < -50000 * 1.0f) {
+ points[i].Y = -50000 * 1.0f;
+ }
+ int point_type = pPoints[i].m_Flag & FXPT_TYPE;
+ if(point_type == FXPT_MOVETO) {
+ types[i] = PathPointTypeStart;
+ nSubPathes ++;
+ bSubClose = FALSE;
+ startpoint = i;
+ } else if (point_type == FXPT_LINETO) {
+ types[i] = PathPointTypeLine;
+ if (pPoints[i - 1].m_Flag == FXPT_MOVETO && (i == nPoints - 1 || pPoints[i + 1].m_Flag == FXPT_MOVETO) &&
+ points[i].Y == points[i - 1].Y && points[i].X == points[i - 1].X) {
+ points[i].X += 0.01f;
+ continue;
+ }
+ if (!bSmooth && points[i].X != points[i - 1].X && points[i].Y != points[i - 1].Y) {
+ bSmooth = TRUE;
+ }
+ } else if (point_type == FXPT_BEZIERTO) {
+ types[i] = PathPointTypeBezier;
+ bSmooth = TRUE;
+ }
+ if (pPoints[i].m_Flag & FXPT_CLOSEFIGURE) {
+ if (bSubClose) {
+ types[pos_subclose] &= ~PathPointTypeCloseSubpath;
+ } else {
+ bSubClose = TRUE;
+ }
+ pos_subclose = i;
+ types[i] |= PathPointTypeCloseSubpath;
+ if (!bSmooth && points[i].X != points[startpoint].X && points[i].Y != points[startpoint].Y) {
+ bSmooth = TRUE;
+ }
+ }
+ }
+ if (fill_mode & FXFILL_NOPATHSMOOTH) {
+ bSmooth = FALSE;
+ CallFunc(GdipSetSmoothingMode)(pGraphics, SmoothingModeNone);
+ } else if (!(fill_mode & FXFILL_FULLCOVER)) {
+ if (!bSmooth && (fill_mode & 3)) {
+ bSmooth = TRUE;
+ }
+ if (bSmooth || pGraphState && pGraphState->m_LineWidth > 2) {
+ CallFunc(GdipSetSmoothingMode)(pGraphics, SmoothingModeAntiAlias);
+ }
+ }
+ int new_fill_mode = fill_mode & 3;
+ if (nPoints == 4 && pGraphState == NULL) {
+ int v1, v2;
+ if (IsSmallTriangle(points, pObject2Device, v1, v2)) {
+ GpPen* pPen = NULL;
+ CallFunc(GdipCreatePen1)(fill_argb, 1.0f, UnitPixel, &pPen);
+ CallFunc(GdipDrawLineI)(pGraphics, pPen, FXSYS_round(points[v1].X), FXSYS_round(points[v1].Y),
+ FXSYS_round(points[v2].X), FXSYS_round(points[v2].Y));
+ CallFunc(GdipDeletePen)(pPen);
+ return TRUE;
+ }
+ }
+ GpPath* pGpPath = NULL;
+ CallFunc(GdipCreatePath2)(points, types, nPoints, GdiFillType2Gdip(new_fill_mode), &pGpPath);
+ if (!pGpPath) {
+ if (pMatrix) {
+ CallFunc(GdipDeleteMatrix)(pMatrix);
+ }
+ FX_Free(points);
+ FX_Free(types);
+ CallFunc(GdipDeleteGraphics)(pGraphics);
+ return FALSE;
+ }
+ if (new_fill_mode) {
+ GpBrush* pBrush = _GdipCreateBrush(fill_argb);
+ CallFunc(GdipSetPathFillMode)(pGpPath, GdiFillType2Gdip(new_fill_mode));
+ CallFunc(GdipFillPath)(pGraphics, pBrush, pGpPath);
+ CallFunc(GdipDeleteBrush)(pBrush);
+ }
+ if (pGraphState && stroke_argb) {
+ GpPen* pPen = _GdipCreatePen(pGraphState, pObject2Device, stroke_argb, fill_mode & FX_STROKE_TEXT_MODE);
+ if (nSubPathes == 1) {
+ CallFunc(GdipDrawPath)(pGraphics, pPen, pGpPath);
+ } else {
+ int iStart = 0;
+ for (int i = 0; i < nPoints; i ++) {
+ if (i == nPoints - 1 || types[i + 1] == PathPointTypeStart) {
+ GpPath* pSubPath;
+ CallFunc(GdipCreatePath2)(points + iStart, types + iStart, i - iStart + 1, GdiFillType2Gdip(new_fill_mode), &pSubPath);
+ iStart = i + 1;
+ CallFunc(GdipDrawPath)(pGraphics, pPen, pSubPath);
+ CallFunc(GdipDeletePath)(pSubPath);
+ }
+ }
+ }
+ CallFunc(GdipDeletePen)(pPen);
+ }
+ if (pMatrix) {
+ CallFunc(GdipDeleteMatrix)(pMatrix);
+ }
+ FX_Free(points);
+ FX_Free(types);
+ CallFunc(GdipDeletePath)(pGpPath);
+ CallFunc(GdipDeleteGraphics)(pGraphics);
+ return TRUE;
+}
+class GpStream : public IStream, public CFX_Object
+{
+ LONG m_RefCount;
+ int m_ReadPos;
+ CFX_ByteTextBuf m_InterStream;
+public:
+ GpStream()
+ {
+ m_RefCount = 1;
+ m_ReadPos = 0;
+ }
+ virtual HRESULT STDMETHODCALLTYPE
+ QueryInterface(REFIID iid, void ** ppvObject)
+ {
+ if (iid == __uuidof(IUnknown) || iid == __uuidof(IStream) ||
+ iid == __uuidof(ISequentialStream)) {
+ *ppvObject = static_cast<IStream*>(this);
+ AddRef();
+ return S_OK;
+ } else {
+ return E_NOINTERFACE;
+ }
+ }
+ virtual ULONG STDMETHODCALLTYPE AddRef(void)
+ {
+ return (ULONG)InterlockedIncrement(&m_RefCount);
+ }
+ virtual ULONG STDMETHODCALLTYPE Release(void)
+ {
+ ULONG res = (ULONG) InterlockedDecrement(&m_RefCount);
+ if (res == 0) {
+ delete this;
+ }
+ return res;
+ }
+public:
+ virtual HRESULT STDMETHODCALLTYPE Read(void* Output, ULONG cb, ULONG* pcbRead)
+ {
+ size_t bytes_left;
+ size_t bytes_out;
+ if (pcbRead != NULL) {
+ *pcbRead = 0;
+ }
+ if (m_ReadPos == m_InterStream.GetLength()) {
+ return HRESULT_FROM_WIN32(ERROR_END_OF_MEDIA);
+ }
+ bytes_left = m_InterStream.GetLength() - m_ReadPos;
+ bytes_out = FX_MIN(cb, bytes_left);
+ FXSYS_memcpy32(Output, m_InterStream.GetBuffer() + m_ReadPos, bytes_out);
+ m_ReadPos += (FX_INT32)bytes_out;
+ if (pcbRead != NULL) {
+ *pcbRead = (ULONG)bytes_out;
+ }
+ return S_OK;
+ }
+ virtual HRESULT STDMETHODCALLTYPE Write(void const* Input, ULONG cb, ULONG* pcbWritten)
+ {
+ if (cb <= 0) {
+ if (pcbWritten != NULL) {
+ *pcbWritten = 0;
+ }
+ return S_OK;
+ }
+ m_InterStream.InsertBlock(m_InterStream.GetLength(), Input, cb);
+ if (pcbWritten != NULL) {
+ *pcbWritten = cb;
+ }
+ return S_OK;
+ }
+public:
+ virtual HRESULT STDMETHODCALLTYPE SetSize(ULARGE_INTEGER)
+ {
+ return E_NOTIMPL;
+ }
+ virtual HRESULT STDMETHODCALLTYPE CopyTo(IStream*, ULARGE_INTEGER, ULARGE_INTEGER*, ULARGE_INTEGER*)
+ {
+ return E_NOTIMPL;
+ }
+ virtual HRESULT STDMETHODCALLTYPE Commit(DWORD)
+ {
+ return E_NOTIMPL;
+ }
+ virtual HRESULT STDMETHODCALLTYPE Revert(void)
+ {
+ return E_NOTIMPL;
+ }
+ virtual HRESULT STDMETHODCALLTYPE LockRegion(ULARGE_INTEGER, ULARGE_INTEGER, DWORD)
+ {
+ return E_NOTIMPL;
+ }
+ virtual HRESULT STDMETHODCALLTYPE UnlockRegion(ULARGE_INTEGER, ULARGE_INTEGER, DWORD)
+ {
+ return E_NOTIMPL;
+ }
+ virtual HRESULT STDMETHODCALLTYPE Clone(IStream **)
+ {
+ return E_NOTIMPL;
+ }
+ virtual HRESULT STDMETHODCALLTYPE Seek(LARGE_INTEGER liDistanceToMove, DWORD dwOrigin, ULARGE_INTEGER* lpNewFilePointer)
+ {
+ long start = 0;
+ long new_read_position;
+ switch(dwOrigin) {
+ case STREAM_SEEK_SET:
+ start = 0;
+ break;
+ case STREAM_SEEK_CUR:
+ start = m_ReadPos;
+ break;
+ case STREAM_SEEK_END:
+ start = m_InterStream.GetLength();
+ break;
+ default:
+ return STG_E_INVALIDFUNCTION;
+ break;
+ }
+ new_read_position = start + (long)liDistanceToMove.QuadPart;
+ if (new_read_position < 0 || new_read_position > m_InterStream.GetLength()) {
+ return STG_E_SEEKERROR;
+ }
+ m_ReadPos = new_read_position;
+ if (lpNewFilePointer != NULL) {
+ lpNewFilePointer->QuadPart = m_ReadPos;
+ }
+ return S_OK;
+ }
+ virtual HRESULT STDMETHODCALLTYPE Stat(STATSTG* pStatstg, DWORD grfStatFlag)
+ {
+ if (pStatstg == NULL) {
+ return STG_E_INVALIDFUNCTION;
+ }
+ ZeroMemory(pStatstg, sizeof(STATSTG));
+ pStatstg->cbSize.QuadPart = m_InterStream.GetLength();
+ return S_OK;
+ }
+};
+typedef struct {
+ BITMAPINFO* pbmi;
+ int Stride;
+ LPBYTE pScan0;
+ GpBitmap* pBitmap;
+ BitmapData* pBitmapData;
+ GpStream* pStream;
+} PREVIEW3_DIBITMAP;
+static PREVIEW3_DIBITMAP* LoadDIBitmap(WINDIB_Open_Args_ args)
+{
+ GpBitmap* pBitmap;
+ GpStream* pStream = NULL;
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ Status status = Ok;
+ if (args.flags == WINDIB_OPEN_PATHNAME) {
+ status = CallFunc(GdipCreateBitmapFromFileICM)((wchar_t*)args.path_name, &pBitmap);
+ } else {
+ if (args.memory_size == 0 || !args.memory_base) {
+ return NULL;
+ }
+ pStream = FX_NEW GpStream;
+ if (!pStream) {
+ return NULL;
+ }
+ pStream->Write(args.memory_base, (ULONG)args.memory_size, NULL);
+ status = CallFunc(GdipCreateBitmapFromStreamICM)(pStream, &pBitmap);
+ }
+ if (status != Ok) {
+ if (pStream) {
+ pStream->Release();
+ }
+ return NULL;
+ }
+ UINT height, width;
+ CallFunc(GdipGetImageHeight)(pBitmap, &height);
+ CallFunc(GdipGetImageWidth)(pBitmap, &width);
+ PixelFormat pixel_format;
+ CallFunc(GdipGetImagePixelFormat)(pBitmap, &pixel_format);
+ int info_size = sizeof(BITMAPINFOHEADER);
+ int bpp = 24;
+ int dest_pixel_format = PixelFormat24bppRGB;
+ if (pixel_format == PixelFormat1bppIndexed) {
+ info_size += 8;
+ bpp = 1;
+ dest_pixel_format = PixelFormat1bppIndexed;
+ } else if (pixel_format == PixelFormat8bppIndexed) {
+ info_size += 1024;
+ bpp = 8;
+ dest_pixel_format = PixelFormat8bppIndexed;
+ } else if (pixel_format == PixelFormat32bppARGB) {
+ bpp = 32;
+ dest_pixel_format = PixelFormat32bppARGB;
+ }
+ LPBYTE buf = FX_Alloc(BYTE, info_size);
+ if (!buf) {
+ if (pStream) {
+ pStream->Release();
+ }
+ return NULL;
+ }
+ BITMAPINFOHEADER* pbmih = (BITMAPINFOHEADER*)buf;
+ FXSYS_memset32(buf, 0, info_size);
+ pbmih->biBitCount = bpp;
+ pbmih->biCompression = BI_RGB;
+ pbmih->biHeight = -(int)height;
+ pbmih->biPlanes = 1;
+ pbmih->biWidth = width;
+ Rect rect(0, 0, width, height);
+ BitmapData* pBitmapData = FX_Alloc(BitmapData, 1);
+ if (!pBitmapData) {
+ if (pStream) {
+ pStream->Release();
+ }
+ return NULL;
+ }
+ CallFunc(GdipBitmapLockBits)(pBitmap, &rect, ImageLockModeRead,
+ dest_pixel_format, pBitmapData);
+ if (pixel_format == PixelFormat1bppIndexed || pixel_format == PixelFormat8bppIndexed) {
+ DWORD* ppal = (DWORD*)(buf + sizeof(BITMAPINFOHEADER));
+ struct {
+ UINT flags;
+ UINT Count;
+ DWORD Entries[256];
+ } pal;
+ int size = 0;
+ CallFunc(GdipGetImagePaletteSize)(pBitmap, &size);
+ CallFunc(GdipGetImagePalette)(pBitmap, (ColorPalette*)&pal, size);
+ int entries = pixel_format == PixelFormat1bppIndexed ? 2 : 256;
+ for (int i = 0; i < entries; i ++) {
+ ppal[i] = pal.Entries[i] & 0x00ffffff;
+ }
+ }
+ PREVIEW3_DIBITMAP* pInfo = FX_Alloc(PREVIEW3_DIBITMAP, 1);
+ if (!pInfo) {
+ if (pStream) {
+ pStream->Release();
+ }
+ return NULL;
+ }
+ pInfo->pbmi = (BITMAPINFO*)buf;
+ pInfo->pScan0 = (LPBYTE)pBitmapData->Scan0;
+ pInfo->Stride = pBitmapData->Stride;
+ pInfo->pBitmap = pBitmap;
+ pInfo->pBitmapData = pBitmapData;
+ pInfo->pStream = pStream;
+ return pInfo;
+}
+static void FreeDIBitmap(PREVIEW3_DIBITMAP* pInfo)
+{
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ CallFunc(GdipBitmapUnlockBits)(pInfo->pBitmap, pInfo->pBitmapData);
+ CallFunc(GdipDisposeImage)(pInfo->pBitmap);
+ FX_Free(pInfo->pBitmapData);
+ FX_Free((LPBYTE)pInfo->pbmi);
+ if (pInfo->pStream) {
+ pInfo->pStream->Release();
+ }
+ FX_Free(pInfo);
+}
+CFX_DIBitmap* _FX_WindowsDIB_LoadFromBuf(BITMAPINFO* pbmi, LPVOID pData, FX_BOOL bAlpha);
+CFX_DIBitmap* CGdiplusExt::LoadDIBitmap(WINDIB_Open_Args_ args)
+{
+ PREVIEW3_DIBITMAP* pInfo = ::LoadDIBitmap(args);
+ if (pInfo == NULL) {
+ return NULL;
+ }
+ int height = abs(pInfo->pbmi->bmiHeader.biHeight);
+ int width = pInfo->pbmi->bmiHeader.biWidth;
+ int dest_pitch = (width * pInfo->pbmi->bmiHeader.biBitCount + 31) / 32 * 4;
+ LPBYTE pData = FX_Alloc(BYTE, dest_pitch * height);
+ if (pData == NULL) {
+ FreeDIBitmap(pInfo);
+ return NULL;
+ }
+ if (dest_pitch == pInfo->Stride) {
+ FXSYS_memcpy32(pData, pInfo->pScan0, dest_pitch * height);
+ } else for (int i = 0; i < height; i ++) {
+ FXSYS_memcpy32(pData + dest_pitch * i, pInfo->pScan0 + pInfo->Stride * i, dest_pitch);
+ }
+ CFX_DIBitmap* pDIBitmap = _FX_WindowsDIB_LoadFromBuf(pInfo->pbmi, pData, pInfo->pbmi->bmiHeader.biBitCount == 32);
+ FX_Free(pData);
+ FreeDIBitmap(pInfo);
+ return pDIBitmap;
+}
+#endif
diff --git a/core/src/fxge/win32/fx_win32_print.cpp b/core/src/fxge/win32/fx_win32_print.cpp
index c08c8e7bb6..9e7a0aae95 100644
--- a/core/src/fxge/win32/fx_win32_print.cpp
+++ b/core/src/fxge/win32/fx_win32_print.cpp
@@ -1,426 +1,426 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../../include/fxge/fx_ge.h"
-#if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_
-#include <windows.h>
-#include "../../../include/fxge/fx_ge_win32.h"
-#include "win32_int.h"
-#include "../../../include/fxge/fx_freetype.h"
-#include "../ge/text_int.h"
-#include "../dib/dib_int.h"
-#define SIZETHRESHOLD 1000
-#define OUTPUTPSLEN 4096
-CGdiPrinterDriver::CGdiPrinterDriver(HDC hDC) : CGdiDeviceDriver(hDC, FXDC_PRINTER)
-{
- m_HorzSize = ::GetDeviceCaps(m_hDC, HORZSIZE);
- m_VertSize = ::GetDeviceCaps(m_hDC, VERTSIZE);
- m_bSupportROP = TRUE;
-}
-int CGdiPrinterDriver::GetDeviceCaps(int caps_id)
-{
- if (caps_id == FXDC_HORZ_SIZE) {
- return m_HorzSize;
- }
- if (caps_id == FXDC_VERT_SIZE) {
- return m_VertSize;
- }
- return CGdiDeviceDriver::GetDeviceCaps(caps_id);
-}
-FX_BOOL CGdiPrinterDriver::SetDIBits(const CFX_DIBSource* pSource, FX_DWORD color, const FX_RECT* pSrcRect, int left, int top, int blend_type,
- int alpha_flag, void* pIccTransform)
-{
- if (pSource->IsAlphaMask()) {
- FX_RECT clip_rect(left, top, left + pSrcRect->Width(), top + pSrcRect->Height());
- return StretchDIBits(pSource, color, left - pSrcRect->left, top - pSrcRect->top, pSource->GetWidth(), pSource->GetHeight(),
- &clip_rect, 0, alpha_flag, pIccTransform, FXDIB_BLEND_NORMAL);
- }
- ASSERT(pSource != NULL && !pSource->IsAlphaMask() && pSrcRect != NULL);
- ASSERT(blend_type == FXDIB_BLEND_NORMAL);
- if (pSource->HasAlpha()) {
- return FALSE;
- }
- CFX_DIBExtractor temp(pSource);
- CFX_DIBitmap* pBitmap = temp;
- if (pBitmap == NULL) {
- return FALSE;
- }
- return GDI_SetDIBits(pBitmap, pSrcRect, left, top, pIccTransform);
-}
-FX_BOOL CGdiPrinterDriver::StretchDIBits(const CFX_DIBSource* pSource, FX_DWORD color, int dest_left, int dest_top,
- int dest_width, int dest_height, const FX_RECT* pClipRect, FX_DWORD flags,
- int alpha_flag, void* pIccTransform, int blend_type)
-{
- if (pSource->IsAlphaMask()) {
- int alpha = FXGETFLAG_COLORTYPE(alpha_flag) ? FXGETFLAG_ALPHA_FILL(alpha_flag) : FXARGB_A(color);
- if (pSource->GetBPP() != 1 || alpha != 255 || !m_bSupportROP) {
- return FALSE;
- }
- if (dest_width < 0 || dest_height < 0) {
- CFX_DIBitmap* pFlipped = pSource->FlipImage(dest_width < 0, dest_height < 0);
- if (pFlipped == NULL) {
- return FALSE;
- }
- if (dest_width < 0) {
- dest_left += dest_width;
- }
- if (dest_height < 0) {
- dest_top += dest_height;
- }
- FX_BOOL ret = GDI_StretchBitMask(pFlipped, dest_left, dest_top, abs(dest_width), abs(dest_height), color, flags, alpha_flag, pIccTransform);
- delete pFlipped;
- return ret;
- }
- CFX_DIBExtractor temp(pSource);
- CFX_DIBitmap* pBitmap = temp;
- if (pBitmap == NULL) {
- return FALSE;
- }
- return GDI_StretchBitMask(pBitmap, dest_left, dest_top, dest_width, dest_height, color, flags, alpha_flag, pIccTransform);
- } else {
- ASSERT(pSource != NULL);
- if (pSource->HasAlpha()) {
- return FALSE;
- }
- if (dest_width < 0 || dest_height < 0) {
- CFX_DIBitmap* pFlipped = pSource->FlipImage(dest_width < 0, dest_height < 0);
- if (pFlipped == NULL) {
- return FALSE;
- }
- if (dest_width < 0) {
- dest_left += dest_width;
- }
- if (dest_height < 0) {
- dest_top += dest_height;
- }
- FX_BOOL ret = GDI_StretchDIBits(pFlipped, dest_left, dest_top, abs(dest_width), abs(dest_height), flags, pIccTransform);
- delete pFlipped;
- return ret;
- }
- CFX_DIBExtractor temp(pSource);
- CFX_DIBitmap* pBitmap = temp;
- if (pBitmap == NULL) {
- return FALSE;
- }
- return GDI_StretchDIBits(pBitmap, dest_left, dest_top, dest_width, dest_height, flags, pIccTransform);
- }
-}
-static CFX_DIBitmap* Transform1bppBitmap(const CFX_DIBSource* pSrc, const CFX_AffineMatrix* pDestMatrix)
-{
- ASSERT(pSrc->GetFormat() == FXDIB_1bppRgb || pSrc->GetFormat() == FXDIB_1bppMask || pSrc->GetFormat() == FXDIB_1bppCmyk);
- CFX_FloatRect unit_rect = pDestMatrix->GetUnitRect();
- FX_RECT full_rect = unit_rect.GetOutterRect();
- int full_left = full_rect.left;
- int full_top = full_rect.top;
- CFX_DIBExtractor src_bitmap(pSrc);
- CFX_DIBitmap* pSrcBitmap = src_bitmap;
- if (pSrcBitmap == NULL) {
- return NULL;
- }
- int src_width = pSrcBitmap->GetWidth(), src_height = pSrcBitmap->GetHeight();
- FX_LPBYTE src_buf = pSrcBitmap->GetBuffer();
- FX_DWORD src_pitch = pSrcBitmap->GetPitch();
- FX_FLOAT dest_area = pDestMatrix->GetUnitArea();
- FX_FLOAT area_scale = FXSYS_Div((FX_FLOAT)(src_width * src_height), dest_area);
- FX_FLOAT size_scale = FXSYS_sqrt(area_scale);
- CFX_AffineMatrix adjusted_matrix(*pDestMatrix);
- adjusted_matrix.Scale(size_scale, size_scale);
- CFX_FloatRect result_rect_f = adjusted_matrix.GetUnitRect();
- FX_RECT result_rect = result_rect_f.GetOutterRect();
- CFX_AffineMatrix src2result;
- src2result.e = adjusted_matrix.c + adjusted_matrix.e;
- src2result.f = adjusted_matrix.d + adjusted_matrix.f;
- src2result.a = adjusted_matrix.a / pSrcBitmap->GetWidth();
- src2result.b = adjusted_matrix.b / pSrcBitmap->GetWidth();
- src2result.c = -adjusted_matrix.c / pSrcBitmap->GetHeight();
- src2result.d = -adjusted_matrix.d / pSrcBitmap->GetHeight();
- src2result.TranslateI(-result_rect.left, -result_rect.top);
- CFX_AffineMatrix result2src;
- result2src.SetReverse(src2result);
- CPDF_FixedMatrix result2src_fix(result2src, 8);
- int result_width = result_rect.Width();
- int result_height = result_rect.Height();
- CFX_DIBitmap* pTempBitmap = FX_NEW CFX_DIBitmap;
- if (!pTempBitmap) {
- if (pSrcBitmap != src_bitmap) {
- delete pSrcBitmap;
- }
- return NULL;
- }
- if (!pTempBitmap->Create(result_width, result_height, pSrc->GetFormat())) {
- delete pTempBitmap;
- if (pSrcBitmap != src_bitmap) {
- delete pSrcBitmap;
- }
- return NULL;
- }
- pTempBitmap->CopyPalette(pSrc->GetPalette());
- FX_LPBYTE dest_buf = pTempBitmap->GetBuffer();
- int dest_pitch = pTempBitmap->GetPitch();
- FXSYS_memset8(dest_buf, pSrc->IsAlphaMask() ? 0 : 0xff, dest_pitch * result_height);
- if (pSrcBitmap->IsAlphaMask()) {
- for (int dest_y = 0; dest_y < result_height; dest_y ++) {
- FX_LPBYTE dest_scan = dest_buf + dest_y * dest_pitch;
- for (int dest_x = 0; dest_x < result_width; dest_x ++) {
- int src_x, src_y;
- result2src_fix.Transform(dest_x, dest_y, src_x, src_y);
- if (src_x < 0 || src_x >= src_width || src_y < 0 || src_y >= src_height) {
- continue;
- }
- if (!((src_buf + src_pitch * src_y)[src_x / 8] & (1 << (7 - src_x % 8)))) {
- continue;
- }
- dest_scan[dest_x / 8] |= 1 << (7 - dest_x % 8);
- }
- }
- } else {
- for (int dest_y = 0; dest_y < result_height; dest_y ++) {
- FX_LPBYTE dest_scan = dest_buf + dest_y * dest_pitch;
- for (int dest_x = 0; dest_x < result_width; dest_x ++) {
- int src_x, src_y;
- result2src_fix.Transform(dest_x, dest_y, src_x, src_y);
- if (src_x < 0 || src_x >= src_width || src_y < 0 || src_y >= src_height) {
- continue;
- }
- if ((src_buf + src_pitch * src_y)[src_x / 8] & (1 << (7 - src_x % 8))) {
- continue;
- }
- dest_scan[dest_x / 8] &= ~(1 << (7 - dest_x % 8));
- }
- }
- }
- if (pSrcBitmap != src_bitmap) {
- delete pSrcBitmap;
- }
- return pTempBitmap;
-}
-FX_BOOL CGdiPrinterDriver::StartDIBits(const CFX_DIBSource* pSource, int bitmap_alpha, FX_DWORD color,
- const CFX_AffineMatrix* pMatrix, FX_DWORD render_flags, FX_LPVOID& handle,
- int alpha_flag, void* pIccTransform, int blend_type)
-{
- if (bitmap_alpha < 255 || pSource->HasAlpha() || (pSource->IsAlphaMask() && (pSource->GetBPP() != 1 || !m_bSupportROP))) {
- return FALSE;
- }
- CFX_FloatRect unit_rect = pMatrix->GetUnitRect();
- FX_RECT full_rect = unit_rect.GetOutterRect();
- if (FXSYS_fabs(pMatrix->b) < 0.5f && pMatrix->a != 0 && FXSYS_fabs(pMatrix->c) < 0.5f && pMatrix->d != 0) {
- FX_BOOL bFlipX = pMatrix->a < 0;
- FX_BOOL bFlipY = pMatrix->d > 0;
- return StretchDIBits(pSource, color, bFlipX ? full_rect.right : full_rect.left, bFlipY ? full_rect.bottom : full_rect.top,
- bFlipX ? -full_rect.Width() : full_rect.Width(), bFlipY ? -full_rect.Height() : full_rect.Height(), NULL, 0,
- alpha_flag, pIccTransform, blend_type);
- }
- if (FXSYS_fabs(pMatrix->a) < 0.5f && FXSYS_fabs(pMatrix->d) < 0.5f) {
- CFX_DIBitmap* pTransformed = pSource->SwapXY(pMatrix->c > 0, pMatrix->b < 0);
- if (pTransformed == NULL) {
- return FALSE;
- }
- FX_BOOL ret = StretchDIBits(pTransformed, color, full_rect.left, full_rect.top, full_rect.Width(), full_rect.Height(), NULL, 0,
- alpha_flag, pIccTransform, blend_type);
- delete pTransformed;
- return ret;
- }
- if (pSource->GetBPP() == 1) {
- CFX_DIBitmap* pTransformed = Transform1bppBitmap(pSource, pMatrix);
- if (pIccTransform == NULL) {
- return FALSE;
- }
- SaveState();
- CFX_PathData path;
- path.AppendRect(0, 0, 1.0f, 1.0f);
- SetClip_PathFill(&path, pMatrix, WINDING);
- FX_BOOL ret = StretchDIBits(pTransformed, color, full_rect.left, full_rect.top, full_rect.Width(), full_rect.Height(), NULL, 0,
- alpha_flag, pIccTransform, blend_type);
- RestoreState();
- delete pTransformed;
- handle = NULL;
- return ret;
- }
- return FALSE;
-}
-CPSOutput::CPSOutput(HDC hDC)
-{
- m_hDC = hDC;
- m_pBuf = NULL;
-}
-CPSOutput::~CPSOutput()
-{
- if (m_pBuf) {
- FX_Free(m_pBuf);
- }
-}
-void CPSOutput::Init()
-{
- m_pBuf = FX_Alloc(FX_CHAR, 1026);
-}
-void CPSOutput::OutputPS(FX_LPCSTR string, int len)
-{
- if (len < 0) {
- len = (int)FXSYS_strlen(string);
- }
- int sent_len = 0;
- while (len > 0) {
- int send_len = len > 1024 ? 1024 : len;
- *(FX_WORD*)m_pBuf = send_len;
- FXSYS_memcpy(m_pBuf + 2, string + sent_len, send_len);
- int ret = ExtEscape(m_hDC, PASSTHROUGH, send_len + 2, m_pBuf, 0, NULL);
- sent_len += send_len;
- len -= send_len;
- }
-}
-CPSPrinterDriver::CPSPrinterDriver()
-{
- m_pPSOutput = NULL;
- m_bCmykOutput = FALSE;
-}
-CPSPrinterDriver::~CPSPrinterDriver()
-{
- EndRendering();
- if (m_pPSOutput) {
- delete m_pPSOutput;
- }
-}
-FX_BOOL CPSPrinterDriver::Init(HDC hDC, int pslevel, FX_BOOL bCmykOutput)
-{
- m_hDC = hDC;
- m_HorzSize = ::GetDeviceCaps(m_hDC, HORZSIZE);
- m_VertSize = ::GetDeviceCaps(m_hDC, VERTSIZE);
- m_Width = ::GetDeviceCaps(m_hDC, HORZRES);
- m_Height = ::GetDeviceCaps(m_hDC, VERTRES);
- m_nBitsPerPixel = ::GetDeviceCaps(m_hDC, BITSPIXEL);
- m_pPSOutput = FX_NEW CPSOutput(hDC);
- if (!m_pPSOutput) {
- return FALSE;
- }
- ((CPSOutput*)m_pPSOutput)->Init();
- m_PSRenderer.Init(m_pPSOutput, pslevel, m_Width, m_Height, bCmykOutput);
- m_bCmykOutput = bCmykOutput;
- HRGN hRgn = ::CreateRectRgn(0, 0, 1, 1);
- int ret = ::GetClipRgn(hDC, hRgn);
- if (ret == 1) {
- ret = ::GetRegionData(hRgn, 0, NULL);
- if (ret) {
- RGNDATA* pData = (RGNDATA*)FX_Alloc(FX_BYTE, ret);
- if (!pData) {
- return FALSE;
- }
- ret = ::GetRegionData(hRgn, ret, pData);
- if (ret) {
- CFX_PathData path;
- path.AllocPointCount(pData->rdh.nCount * 5);
- for (FX_DWORD i = 0; i < pData->rdh.nCount; i ++) {
- RECT* pRect = (RECT*)(pData->Buffer + pData->rdh.nRgnSize * i);
- path.AppendRect((FX_FLOAT)pRect->left, (FX_FLOAT)pRect->bottom, (FX_FLOAT)pRect->right, (FX_FLOAT)pRect->top);
- }
- m_PSRenderer.SetClip_PathFill(&path, NULL, FXFILL_WINDING);
- }
- FX_Free(pData);
- }
- }
- ::DeleteObject(hRgn);
- return TRUE;
-}
-int CPSPrinterDriver::GetDeviceCaps(int caps_id)
-{
- switch (caps_id) {
- case FXDC_DEVICE_CLASS:
- return FXDC_PRINTER;
- case FXDC_PIXEL_WIDTH:
- return m_Width;
- case FXDC_PIXEL_HEIGHT:
- return m_Height;
- case FXDC_BITS_PIXEL:
- return m_nBitsPerPixel;
- case FXDC_RENDER_CAPS:
- return m_bCmykOutput ? FXRC_BIT_MASK | FXRC_CMYK_OUTPUT : FXRC_BIT_MASK;
- case FXDC_HORZ_SIZE:
- return m_HorzSize;
- case FXDC_VERT_SIZE:
- return m_VertSize;
- }
- return 0;
-}
-FX_BOOL CPSPrinterDriver::StartRendering()
-{
- return m_PSRenderer.StartRendering();
-}
-void CPSPrinterDriver::EndRendering()
-{
- m_PSRenderer.EndRendering();
-}
-void CPSPrinterDriver::SaveState()
-{
- m_PSRenderer.SaveState();
-}
-void CPSPrinterDriver::RestoreState(FX_BOOL bKeepSaved)
-{
- m_PSRenderer.RestoreState(bKeepSaved);
-}
-FX_BOOL CPSPrinterDriver::SetClip_PathFill(const CFX_PathData* pPathData, const CFX_AffineMatrix* pObject2Device,
- int fill_mode)
-{
- m_PSRenderer.SetClip_PathFill(pPathData, pObject2Device, fill_mode);
- return TRUE;
-}
-FX_BOOL CPSPrinterDriver::SetClip_PathStroke(const CFX_PathData* pPathData,
- const CFX_AffineMatrix* pObject2Device,
- const CFX_GraphStateData* pGraphState)
-{
- m_PSRenderer.SetClip_PathStroke(pPathData, pObject2Device, pGraphState);
- return TRUE;
-}
-FX_BOOL CPSPrinterDriver::DrawPath(const CFX_PathData* pPathData,
- const CFX_AffineMatrix* pObject2Device,
- const CFX_GraphStateData* pGraphState, FX_ARGB fill_color, FX_ARGB stroke_color,
- int fill_mode, int alpha_flag, void* pIccTransform, int blend_type)
-{
- if (blend_type != FXDIB_BLEND_NORMAL) {
- return FALSE;
- }
- return m_PSRenderer.DrawPath(pPathData, pObject2Device, pGraphState, fill_color, stroke_color, fill_mode & 3, alpha_flag, pIccTransform);
-}
-FX_BOOL CPSPrinterDriver::GetClipBox(FX_RECT* pRect)
-{
- *pRect = m_PSRenderer.GetClipBox();
- return TRUE;
-}
-FX_BOOL CPSPrinterDriver::SetDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, const FX_RECT* pSrcRect, int left, int top, int blend_type,
- int alpha_flag, void* pIccTransform)
-{
- if (blend_type != FXDIB_BLEND_NORMAL) {
- return FALSE;
- }
- return m_PSRenderer.SetDIBits(pBitmap, color, left, top, alpha_flag, pIccTransform);
-}
-FX_BOOL CPSPrinterDriver::StretchDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, int dest_left, int dest_top,
- int dest_width, int dest_height, const FX_RECT* pClipRect, FX_DWORD flags,
- int alpha_flag, void* pIccTransform, int blend_type)
-{
- if (blend_type != FXDIB_BLEND_NORMAL) {
- return FALSE;
- }
- return m_PSRenderer.StretchDIBits(pBitmap, color, dest_left, dest_top, dest_width, dest_height, flags, alpha_flag, pIccTransform);
-}
-FX_BOOL CPSPrinterDriver::StartDIBits(const CFX_DIBSource* pBitmap, int bitmap_alpha, FX_DWORD color,
- const CFX_AffineMatrix* pMatrix, FX_DWORD render_flags, FX_LPVOID& handle,
- int alpha_flag, void* pIccTransform, int blend_type)
-{
- if (blend_type != FXDIB_BLEND_NORMAL) {
- return FALSE;
- }
- if (bitmap_alpha < 255) {
- return FALSE;
- }
- handle = NULL;
- return m_PSRenderer.DrawDIBits(pBitmap, color, pMatrix, render_flags, alpha_flag, pIccTransform);
-}
-FX_BOOL CPSPrinterDriver::DrawDeviceText(int nChars, const FXTEXT_CHARPOS* pCharPos, CFX_Font* pFont,
- CFX_FontCache* pCache, const CFX_AffineMatrix* pObject2Device, FX_FLOAT font_size, FX_DWORD color,
- int alpha_flag, void* pIccTransform)
-{
- return m_PSRenderer.DrawText(nChars, pCharPos, pFont, pCache, pObject2Device, font_size, color, alpha_flag, pIccTransform);
-}
-#endif
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxge/fx_ge.h"
+#if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_
+#include <windows.h>
+#include "../../../include/fxge/fx_ge_win32.h"
+#include "win32_int.h"
+#include "../../../include/fxge/fx_freetype.h"
+#include "../ge/text_int.h"
+#include "../dib/dib_int.h"
+#define SIZETHRESHOLD 1000
+#define OUTPUTPSLEN 4096
+CGdiPrinterDriver::CGdiPrinterDriver(HDC hDC) : CGdiDeviceDriver(hDC, FXDC_PRINTER)
+{
+ m_HorzSize = ::GetDeviceCaps(m_hDC, HORZSIZE);
+ m_VertSize = ::GetDeviceCaps(m_hDC, VERTSIZE);
+ m_bSupportROP = TRUE;
+}
+int CGdiPrinterDriver::GetDeviceCaps(int caps_id)
+{
+ if (caps_id == FXDC_HORZ_SIZE) {
+ return m_HorzSize;
+ }
+ if (caps_id == FXDC_VERT_SIZE) {
+ return m_VertSize;
+ }
+ return CGdiDeviceDriver::GetDeviceCaps(caps_id);
+}
+FX_BOOL CGdiPrinterDriver::SetDIBits(const CFX_DIBSource* pSource, FX_DWORD color, const FX_RECT* pSrcRect, int left, int top, int blend_type,
+ int alpha_flag, void* pIccTransform)
+{
+ if (pSource->IsAlphaMask()) {
+ FX_RECT clip_rect(left, top, left + pSrcRect->Width(), top + pSrcRect->Height());
+ return StretchDIBits(pSource, color, left - pSrcRect->left, top - pSrcRect->top, pSource->GetWidth(), pSource->GetHeight(),
+ &clip_rect, 0, alpha_flag, pIccTransform, FXDIB_BLEND_NORMAL);
+ }
+ ASSERT(pSource != NULL && !pSource->IsAlphaMask() && pSrcRect != NULL);
+ ASSERT(blend_type == FXDIB_BLEND_NORMAL);
+ if (pSource->HasAlpha()) {
+ return FALSE;
+ }
+ CFX_DIBExtractor temp(pSource);
+ CFX_DIBitmap* pBitmap = temp;
+ if (pBitmap == NULL) {
+ return FALSE;
+ }
+ return GDI_SetDIBits(pBitmap, pSrcRect, left, top, pIccTransform);
+}
+FX_BOOL CGdiPrinterDriver::StretchDIBits(const CFX_DIBSource* pSource, FX_DWORD color, int dest_left, int dest_top,
+ int dest_width, int dest_height, const FX_RECT* pClipRect, FX_DWORD flags,
+ int alpha_flag, void* pIccTransform, int blend_type)
+{
+ if (pSource->IsAlphaMask()) {
+ int alpha = FXGETFLAG_COLORTYPE(alpha_flag) ? FXGETFLAG_ALPHA_FILL(alpha_flag) : FXARGB_A(color);
+ if (pSource->GetBPP() != 1 || alpha != 255 || !m_bSupportROP) {
+ return FALSE;
+ }
+ if (dest_width < 0 || dest_height < 0) {
+ CFX_DIBitmap* pFlipped = pSource->FlipImage(dest_width < 0, dest_height < 0);
+ if (pFlipped == NULL) {
+ return FALSE;
+ }
+ if (dest_width < 0) {
+ dest_left += dest_width;
+ }
+ if (dest_height < 0) {
+ dest_top += dest_height;
+ }
+ FX_BOOL ret = GDI_StretchBitMask(pFlipped, dest_left, dest_top, abs(dest_width), abs(dest_height), color, flags, alpha_flag, pIccTransform);
+ delete pFlipped;
+ return ret;
+ }
+ CFX_DIBExtractor temp(pSource);
+ CFX_DIBitmap* pBitmap = temp;
+ if (pBitmap == NULL) {
+ return FALSE;
+ }
+ return GDI_StretchBitMask(pBitmap, dest_left, dest_top, dest_width, dest_height, color, flags, alpha_flag, pIccTransform);
+ } else {
+ ASSERT(pSource != NULL);
+ if (pSource->HasAlpha()) {
+ return FALSE;
+ }
+ if (dest_width < 0 || dest_height < 0) {
+ CFX_DIBitmap* pFlipped = pSource->FlipImage(dest_width < 0, dest_height < 0);
+ if (pFlipped == NULL) {
+ return FALSE;
+ }
+ if (dest_width < 0) {
+ dest_left += dest_width;
+ }
+ if (dest_height < 0) {
+ dest_top += dest_height;
+ }
+ FX_BOOL ret = GDI_StretchDIBits(pFlipped, dest_left, dest_top, abs(dest_width), abs(dest_height), flags, pIccTransform);
+ delete pFlipped;
+ return ret;
+ }
+ CFX_DIBExtractor temp(pSource);
+ CFX_DIBitmap* pBitmap = temp;
+ if (pBitmap == NULL) {
+ return FALSE;
+ }
+ return GDI_StretchDIBits(pBitmap, dest_left, dest_top, dest_width, dest_height, flags, pIccTransform);
+ }
+}
+static CFX_DIBitmap* Transform1bppBitmap(const CFX_DIBSource* pSrc, const CFX_AffineMatrix* pDestMatrix)
+{
+ ASSERT(pSrc->GetFormat() == FXDIB_1bppRgb || pSrc->GetFormat() == FXDIB_1bppMask || pSrc->GetFormat() == FXDIB_1bppCmyk);
+ CFX_FloatRect unit_rect = pDestMatrix->GetUnitRect();
+ FX_RECT full_rect = unit_rect.GetOutterRect();
+ int full_left = full_rect.left;
+ int full_top = full_rect.top;
+ CFX_DIBExtractor src_bitmap(pSrc);
+ CFX_DIBitmap* pSrcBitmap = src_bitmap;
+ if (pSrcBitmap == NULL) {
+ return NULL;
+ }
+ int src_width = pSrcBitmap->GetWidth(), src_height = pSrcBitmap->GetHeight();
+ FX_LPBYTE src_buf = pSrcBitmap->GetBuffer();
+ FX_DWORD src_pitch = pSrcBitmap->GetPitch();
+ FX_FLOAT dest_area = pDestMatrix->GetUnitArea();
+ FX_FLOAT area_scale = FXSYS_Div((FX_FLOAT)(src_width * src_height), dest_area);
+ FX_FLOAT size_scale = FXSYS_sqrt(area_scale);
+ CFX_AffineMatrix adjusted_matrix(*pDestMatrix);
+ adjusted_matrix.Scale(size_scale, size_scale);
+ CFX_FloatRect result_rect_f = adjusted_matrix.GetUnitRect();
+ FX_RECT result_rect = result_rect_f.GetOutterRect();
+ CFX_AffineMatrix src2result;
+ src2result.e = adjusted_matrix.c + adjusted_matrix.e;
+ src2result.f = adjusted_matrix.d + adjusted_matrix.f;
+ src2result.a = adjusted_matrix.a / pSrcBitmap->GetWidth();
+ src2result.b = adjusted_matrix.b / pSrcBitmap->GetWidth();
+ src2result.c = -adjusted_matrix.c / pSrcBitmap->GetHeight();
+ src2result.d = -adjusted_matrix.d / pSrcBitmap->GetHeight();
+ src2result.TranslateI(-result_rect.left, -result_rect.top);
+ CFX_AffineMatrix result2src;
+ result2src.SetReverse(src2result);
+ CPDF_FixedMatrix result2src_fix(result2src, 8);
+ int result_width = result_rect.Width();
+ int result_height = result_rect.Height();
+ CFX_DIBitmap* pTempBitmap = FX_NEW CFX_DIBitmap;
+ if (!pTempBitmap) {
+ if (pSrcBitmap != src_bitmap) {
+ delete pSrcBitmap;
+ }
+ return NULL;
+ }
+ if (!pTempBitmap->Create(result_width, result_height, pSrc->GetFormat())) {
+ delete pTempBitmap;
+ if (pSrcBitmap != src_bitmap) {
+ delete pSrcBitmap;
+ }
+ return NULL;
+ }
+ pTempBitmap->CopyPalette(pSrc->GetPalette());
+ FX_LPBYTE dest_buf = pTempBitmap->GetBuffer();
+ int dest_pitch = pTempBitmap->GetPitch();
+ FXSYS_memset8(dest_buf, pSrc->IsAlphaMask() ? 0 : 0xff, dest_pitch * result_height);
+ if (pSrcBitmap->IsAlphaMask()) {
+ for (int dest_y = 0; dest_y < result_height; dest_y ++) {
+ FX_LPBYTE dest_scan = dest_buf + dest_y * dest_pitch;
+ for (int dest_x = 0; dest_x < result_width; dest_x ++) {
+ int src_x, src_y;
+ result2src_fix.Transform(dest_x, dest_y, src_x, src_y);
+ if (src_x < 0 || src_x >= src_width || src_y < 0 || src_y >= src_height) {
+ continue;
+ }
+ if (!((src_buf + src_pitch * src_y)[src_x / 8] & (1 << (7 - src_x % 8)))) {
+ continue;
+ }
+ dest_scan[dest_x / 8] |= 1 << (7 - dest_x % 8);
+ }
+ }
+ } else {
+ for (int dest_y = 0; dest_y < result_height; dest_y ++) {
+ FX_LPBYTE dest_scan = dest_buf + dest_y * dest_pitch;
+ for (int dest_x = 0; dest_x < result_width; dest_x ++) {
+ int src_x, src_y;
+ result2src_fix.Transform(dest_x, dest_y, src_x, src_y);
+ if (src_x < 0 || src_x >= src_width || src_y < 0 || src_y >= src_height) {
+ continue;
+ }
+ if ((src_buf + src_pitch * src_y)[src_x / 8] & (1 << (7 - src_x % 8))) {
+ continue;
+ }
+ dest_scan[dest_x / 8] &= ~(1 << (7 - dest_x % 8));
+ }
+ }
+ }
+ if (pSrcBitmap != src_bitmap) {
+ delete pSrcBitmap;
+ }
+ return pTempBitmap;
+}
+FX_BOOL CGdiPrinterDriver::StartDIBits(const CFX_DIBSource* pSource, int bitmap_alpha, FX_DWORD color,
+ const CFX_AffineMatrix* pMatrix, FX_DWORD render_flags, FX_LPVOID& handle,
+ int alpha_flag, void* pIccTransform, int blend_type)
+{
+ if (bitmap_alpha < 255 || pSource->HasAlpha() || (pSource->IsAlphaMask() && (pSource->GetBPP() != 1 || !m_bSupportROP))) {
+ return FALSE;
+ }
+ CFX_FloatRect unit_rect = pMatrix->GetUnitRect();
+ FX_RECT full_rect = unit_rect.GetOutterRect();
+ if (FXSYS_fabs(pMatrix->b) < 0.5f && pMatrix->a != 0 && FXSYS_fabs(pMatrix->c) < 0.5f && pMatrix->d != 0) {
+ FX_BOOL bFlipX = pMatrix->a < 0;
+ FX_BOOL bFlipY = pMatrix->d > 0;
+ return StretchDIBits(pSource, color, bFlipX ? full_rect.right : full_rect.left, bFlipY ? full_rect.bottom : full_rect.top,
+ bFlipX ? -full_rect.Width() : full_rect.Width(), bFlipY ? -full_rect.Height() : full_rect.Height(), NULL, 0,
+ alpha_flag, pIccTransform, blend_type);
+ }
+ if (FXSYS_fabs(pMatrix->a) < 0.5f && FXSYS_fabs(pMatrix->d) < 0.5f) {
+ CFX_DIBitmap* pTransformed = pSource->SwapXY(pMatrix->c > 0, pMatrix->b < 0);
+ if (pTransformed == NULL) {
+ return FALSE;
+ }
+ FX_BOOL ret = StretchDIBits(pTransformed, color, full_rect.left, full_rect.top, full_rect.Width(), full_rect.Height(), NULL, 0,
+ alpha_flag, pIccTransform, blend_type);
+ delete pTransformed;
+ return ret;
+ }
+ if (pSource->GetBPP() == 1) {
+ CFX_DIBitmap* pTransformed = Transform1bppBitmap(pSource, pMatrix);
+ if (pIccTransform == NULL) {
+ return FALSE;
+ }
+ SaveState();
+ CFX_PathData path;
+ path.AppendRect(0, 0, 1.0f, 1.0f);
+ SetClip_PathFill(&path, pMatrix, WINDING);
+ FX_BOOL ret = StretchDIBits(pTransformed, color, full_rect.left, full_rect.top, full_rect.Width(), full_rect.Height(), NULL, 0,
+ alpha_flag, pIccTransform, blend_type);
+ RestoreState();
+ delete pTransformed;
+ handle = NULL;
+ return ret;
+ }
+ return FALSE;
+}
+CPSOutput::CPSOutput(HDC hDC)
+{
+ m_hDC = hDC;
+ m_pBuf = NULL;
+}
+CPSOutput::~CPSOutput()
+{
+ if (m_pBuf) {
+ FX_Free(m_pBuf);
+ }
+}
+void CPSOutput::Init()
+{
+ m_pBuf = FX_Alloc(FX_CHAR, 1026);
+}
+void CPSOutput::OutputPS(FX_LPCSTR string, int len)
+{
+ if (len < 0) {
+ len = (int)FXSYS_strlen(string);
+ }
+ int sent_len = 0;
+ while (len > 0) {
+ int send_len = len > 1024 ? 1024 : len;
+ *(FX_WORD*)m_pBuf = send_len;
+ FXSYS_memcpy(m_pBuf + 2, string + sent_len, send_len);
+ int ret = ExtEscape(m_hDC, PASSTHROUGH, send_len + 2, m_pBuf, 0, NULL);
+ sent_len += send_len;
+ len -= send_len;
+ }
+}
+CPSPrinterDriver::CPSPrinterDriver()
+{
+ m_pPSOutput = NULL;
+ m_bCmykOutput = FALSE;
+}
+CPSPrinterDriver::~CPSPrinterDriver()
+{
+ EndRendering();
+ if (m_pPSOutput) {
+ delete m_pPSOutput;
+ }
+}
+FX_BOOL CPSPrinterDriver::Init(HDC hDC, int pslevel, FX_BOOL bCmykOutput)
+{
+ m_hDC = hDC;
+ m_HorzSize = ::GetDeviceCaps(m_hDC, HORZSIZE);
+ m_VertSize = ::GetDeviceCaps(m_hDC, VERTSIZE);
+ m_Width = ::GetDeviceCaps(m_hDC, HORZRES);
+ m_Height = ::GetDeviceCaps(m_hDC, VERTRES);
+ m_nBitsPerPixel = ::GetDeviceCaps(m_hDC, BITSPIXEL);
+ m_pPSOutput = FX_NEW CPSOutput(hDC);
+ if (!m_pPSOutput) {
+ return FALSE;
+ }
+ ((CPSOutput*)m_pPSOutput)->Init();
+ m_PSRenderer.Init(m_pPSOutput, pslevel, m_Width, m_Height, bCmykOutput);
+ m_bCmykOutput = bCmykOutput;
+ HRGN hRgn = ::CreateRectRgn(0, 0, 1, 1);
+ int ret = ::GetClipRgn(hDC, hRgn);
+ if (ret == 1) {
+ ret = ::GetRegionData(hRgn, 0, NULL);
+ if (ret) {
+ RGNDATA* pData = (RGNDATA*)FX_Alloc(FX_BYTE, ret);
+ if (!pData) {
+ return FALSE;
+ }
+ ret = ::GetRegionData(hRgn, ret, pData);
+ if (ret) {
+ CFX_PathData path;
+ path.AllocPointCount(pData->rdh.nCount * 5);
+ for (FX_DWORD i = 0; i < pData->rdh.nCount; i ++) {
+ RECT* pRect = (RECT*)(pData->Buffer + pData->rdh.nRgnSize * i);
+ path.AppendRect((FX_FLOAT)pRect->left, (FX_FLOAT)pRect->bottom, (FX_FLOAT)pRect->right, (FX_FLOAT)pRect->top);
+ }
+ m_PSRenderer.SetClip_PathFill(&path, NULL, FXFILL_WINDING);
+ }
+ FX_Free(pData);
+ }
+ }
+ ::DeleteObject(hRgn);
+ return TRUE;
+}
+int CPSPrinterDriver::GetDeviceCaps(int caps_id)
+{
+ switch (caps_id) {
+ case FXDC_DEVICE_CLASS:
+ return FXDC_PRINTER;
+ case FXDC_PIXEL_WIDTH:
+ return m_Width;
+ case FXDC_PIXEL_HEIGHT:
+ return m_Height;
+ case FXDC_BITS_PIXEL:
+ return m_nBitsPerPixel;
+ case FXDC_RENDER_CAPS:
+ return m_bCmykOutput ? FXRC_BIT_MASK | FXRC_CMYK_OUTPUT : FXRC_BIT_MASK;
+ case FXDC_HORZ_SIZE:
+ return m_HorzSize;
+ case FXDC_VERT_SIZE:
+ return m_VertSize;
+ }
+ return 0;
+}
+FX_BOOL CPSPrinterDriver::StartRendering()
+{
+ return m_PSRenderer.StartRendering();
+}
+void CPSPrinterDriver::EndRendering()
+{
+ m_PSRenderer.EndRendering();
+}
+void CPSPrinterDriver::SaveState()
+{
+ m_PSRenderer.SaveState();
+}
+void CPSPrinterDriver::RestoreState(FX_BOOL bKeepSaved)
+{
+ m_PSRenderer.RestoreState(bKeepSaved);
+}
+FX_BOOL CPSPrinterDriver::SetClip_PathFill(const CFX_PathData* pPathData, const CFX_AffineMatrix* pObject2Device,
+ int fill_mode)
+{
+ m_PSRenderer.SetClip_PathFill(pPathData, pObject2Device, fill_mode);
+ return TRUE;
+}
+FX_BOOL CPSPrinterDriver::SetClip_PathStroke(const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pObject2Device,
+ const CFX_GraphStateData* pGraphState)
+{
+ m_PSRenderer.SetClip_PathStroke(pPathData, pObject2Device, pGraphState);
+ return TRUE;
+}
+FX_BOOL CPSPrinterDriver::DrawPath(const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pObject2Device,
+ const CFX_GraphStateData* pGraphState, FX_ARGB fill_color, FX_ARGB stroke_color,
+ int fill_mode, int alpha_flag, void* pIccTransform, int blend_type)
+{
+ if (blend_type != FXDIB_BLEND_NORMAL) {
+ return FALSE;
+ }
+ return m_PSRenderer.DrawPath(pPathData, pObject2Device, pGraphState, fill_color, stroke_color, fill_mode & 3, alpha_flag, pIccTransform);
+}
+FX_BOOL CPSPrinterDriver::GetClipBox(FX_RECT* pRect)
+{
+ *pRect = m_PSRenderer.GetClipBox();
+ return TRUE;
+}
+FX_BOOL CPSPrinterDriver::SetDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, const FX_RECT* pSrcRect, int left, int top, int blend_type,
+ int alpha_flag, void* pIccTransform)
+{
+ if (blend_type != FXDIB_BLEND_NORMAL) {
+ return FALSE;
+ }
+ return m_PSRenderer.SetDIBits(pBitmap, color, left, top, alpha_flag, pIccTransform);
+}
+FX_BOOL CPSPrinterDriver::StretchDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, int dest_left, int dest_top,
+ int dest_width, int dest_height, const FX_RECT* pClipRect, FX_DWORD flags,
+ int alpha_flag, void* pIccTransform, int blend_type)
+{
+ if (blend_type != FXDIB_BLEND_NORMAL) {
+ return FALSE;
+ }
+ return m_PSRenderer.StretchDIBits(pBitmap, color, dest_left, dest_top, dest_width, dest_height, flags, alpha_flag, pIccTransform);
+}
+FX_BOOL CPSPrinterDriver::StartDIBits(const CFX_DIBSource* pBitmap, int bitmap_alpha, FX_DWORD color,
+ const CFX_AffineMatrix* pMatrix, FX_DWORD render_flags, FX_LPVOID& handle,
+ int alpha_flag, void* pIccTransform, int blend_type)
+{
+ if (blend_type != FXDIB_BLEND_NORMAL) {
+ return FALSE;
+ }
+ if (bitmap_alpha < 255) {
+ return FALSE;
+ }
+ handle = NULL;
+ return m_PSRenderer.DrawDIBits(pBitmap, color, pMatrix, render_flags, alpha_flag, pIccTransform);
+}
+FX_BOOL CPSPrinterDriver::DrawDeviceText(int nChars, const FXTEXT_CHARPOS* pCharPos, CFX_Font* pFont,
+ CFX_FontCache* pCache, const CFX_AffineMatrix* pObject2Device, FX_FLOAT font_size, FX_DWORD color,
+ int alpha_flag, void* pIccTransform)
+{
+ return m_PSRenderer.DrawText(nChars, pCharPos, pFont, pCache, pObject2Device, font_size, color, alpha_flag, pIccTransform);
+}
+#endif
diff --git a/core/src/fxge/win32/win32_int.h b/core/src/fxge/win32/win32_int.h
index 3f940eda1e..83595cbf8d 100644
--- a/core/src/fxge/win32/win32_int.h
+++ b/core/src/fxge/win32/win32_int.h
@@ -1,238 +1,238 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-struct WINDIB_Open_Args_;
-class CGdiplusExt
-{
-public:
- CGdiplusExt();
- ~CGdiplusExt();
- void Load();
- FX_BOOL IsAvailable()
- {
- return m_hModule != NULL;
- }
- FX_BOOL StretchBitMask(HDC hDC, BOOL bMonoDevice, const CFX_DIBitmap* pBitmap, int dest_left, int dest_top,
- int dest_width, int dest_height, FX_DWORD argb, const FX_RECT* pClipRect, int flags);
- FX_BOOL StretchDIBits(HDC hDC, const CFX_DIBitmap* pBitmap, int dest_left, int dest_top,
- int dest_width, int dest_height, const FX_RECT* pClipRect, int flags);
- FX_BOOL DrawPath(HDC hDC, const CFX_PathData* pPathData,
- const CFX_AffineMatrix* pObject2Device,
- const CFX_GraphStateData* pGraphState,
- FX_DWORD fill_argb,
- FX_DWORD stroke_argb,
- int fill_mode
- );
-
- void* LoadMemFont(FX_BYTE* pData, FX_DWORD size);
- void DeleteMemFont(void* pFontCollection);
- FX_BOOL GdipCreateFromImage(void* bitmap, void** graphics);
- void GdipDeleteGraphics(void* graphics);
- void GdipSetTextRenderingHint(void* graphics, int mode);
- void GdipSetPageUnit(void* graphics, FX_DWORD unit);
- void GdipSetWorldTransform(void* graphics, void* pMatrix);
- FX_BOOL GdipDrawDriverString(void *graphics, unsigned short *text, int length, void *font, void* brush, void *positions, int flags, const void *matrix);
- void GdipCreateBrush(FX_DWORD fill_argb, void** pBrush);
- void GdipDeleteBrush(void* pBrush);
- void GdipCreateMatrix(FX_FLOAT a, FX_FLOAT b, FX_FLOAT c, FX_FLOAT d, FX_FLOAT e, FX_FLOAT f, void** matrix);
- void GdipDeleteMatrix(void* matrix);
- FX_BOOL GdipCreateFontFamilyFromName(FX_LPCWSTR name, void* pFontCollection, void**pFamily);
- void GdipDeleteFontFamily(void* pFamily);
- FX_BOOL GdipCreateFontFromFamily(void* pFamily, FX_FLOAT font_size, int fontstyle, int flag, void** pFont);
- void* GdipCreateFontFromCollection(void* pFontCollection, FX_FLOAT font_size, int fontstyle);
- void GdipDeleteFont(void* pFont);
- FX_BOOL GdipCreateBitmap(CFX_DIBitmap* pBitmap, void**bitmap);
- void GdipDisposeImage(void* bitmap);
- void GdipGetFontSize(void *pFont, FX_FLOAT *size);
- void* GdiAddFontMemResourceEx(void *pFontdata, FX_DWORD size, void* pdv, FX_DWORD* num_face);
- FX_BOOL GdiRemoveFontMemResourceEx(void* handle);
- void* m_Functions[100];
- void* m_pGdiAddFontMemResourceEx;
- void* m_pGdiRemoveFontMemResourseEx;
- CFX_DIBitmap* LoadDIBitmap(WINDIB_Open_Args_ args);
-protected:
- HMODULE m_hModule;
- HMODULE m_GdiModule;
-};
-#include "dwrite_int.h"
-class CWin32Platform : public CFX_Object
-{
-public:
- FX_BOOL m_bHalfTone;
- CGdiplusExt m_GdiplusExt;
- CDWriteExt m_DWriteExt;
-};
-class CGdiDeviceDriver : public IFX_RenderDeviceDriver
-{
-protected:
- virtual int GetDeviceCaps(int caps_id);
- virtual void SaveState()
- {
- SaveDC(m_hDC);
- }
- virtual void RestoreState(FX_BOOL bKeepSaved = FALSE)
- {
- RestoreDC(m_hDC, -1);
- if (bKeepSaved) {
- SaveDC(m_hDC);
- }
- }
- virtual FX_BOOL SetClip_PathFill(const CFX_PathData* pPathData,
- const CFX_AffineMatrix* pObject2Device,
- int fill_mode
- );
- virtual FX_BOOL SetClip_PathStroke(const CFX_PathData* pPathData,
- const CFX_AffineMatrix* pObject2Device,
- const CFX_GraphStateData* pGraphState
- );
- virtual FX_BOOL DrawPath(const CFX_PathData* pPathData,
- const CFX_AffineMatrix* pObject2Device,
- const CFX_GraphStateData* pGraphState,
- FX_DWORD fill_color,
- FX_DWORD stroke_color,
- int fill_mode,
- int alpha_flag,
- void* pIccTransform,
- int blend_type
- );
- virtual FX_BOOL FillRect(const FX_RECT* pRect,
- FX_DWORD fill_color,
- int alpha_flag, void* pIccTransform, int blend_type);
- virtual FX_BOOL DrawCosmeticLine(FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2, FX_DWORD color,
- int alpha_flag, void* pIccTransform, int blend_type);
- virtual FX_LPVOID GetClipRgn() ;
- virtual FX_BOOL SetClipRgn(FX_LPVOID pRgn) ;
- virtual FX_BOOL GetClipBox(FX_RECT* pRect);
- virtual FX_BOOL DeleteDeviceRgn(FX_LPVOID pRgn);
- virtual void DrawLine(FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2);
- virtual void* GetPlatformSurface()
- {
- return (void*)m_hDC;
- }
- FX_BOOL GDI_SetDIBits(const CFX_DIBitmap* pBitmap, const FX_RECT* pSrcRect, int left, int top,
- void* pIccTransform);
- FX_BOOL GDI_StretchDIBits(const CFX_DIBitmap* pBitmap, int dest_left, int dest_top,
- int dest_width, int dest_height, FX_DWORD flags,
- void* pIccTransform);
- FX_BOOL GDI_StretchBitMask(const CFX_DIBitmap* pBitmap, int dest_left, int dest_top,
- int dest_width, int dest_height, FX_DWORD bitmap_color, FX_DWORD flags,
- int alpha_flag, void* pIccTransform);
- HDC m_hDC;
- int m_Width, m_Height, m_nBitsPerPixel;
- int m_DeviceClass, m_RenderCaps;
- CGdiDeviceDriver(HDC hDC, int device_class);
- ~CGdiDeviceDriver() {}
-};
-class CGdiDisplayDriver : public CGdiDeviceDriver
-{
-public:
- CGdiDisplayDriver(HDC hDC);
-protected:
- virtual FX_BOOL GetDIBits(CFX_DIBitmap* pBitmap, int left, int top, void* pIccTransform = NULL, FX_BOOL bDEdge = FALSE);
- virtual FX_BOOL SetDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, const FX_RECT* pSrcRect, int left, int top, int blend_type,
- int alpha_flag, void* pIccTransform);
- virtual FX_BOOL StretchDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, int dest_left, int dest_top,
- int dest_width, int dest_height, const FX_RECT* pClipRect, FX_DWORD flags,
- int alpha_flag, void* pIccTransform, int blend_type);
- virtual FX_BOOL StartDIBits(const CFX_DIBSource* pBitmap, int bitmap_alpha, FX_DWORD color,
- const CFX_AffineMatrix* pMatrix, FX_DWORD render_flags, FX_LPVOID& handle,
- int alpha_flag, void* pIccTransform, int blend_type)
- {
- return FALSE;
- }
- FX_BOOL UseFoxitStretchEngine(const CFX_DIBSource* pSource, FX_DWORD color, int dest_left, int dest_top,
- int dest_width, int dest_height, const FX_RECT* pClipRect, int render_flags,
- int alpha_flag = 0, void* pIccTransform = NULL, int blend_type = FXDIB_BLEND_NORMAL);
-};
-class CGdiPrinterDriver : public CGdiDeviceDriver
-{
-public:
- CGdiPrinterDriver(HDC hDC);
-protected:
- virtual int GetDeviceCaps(int caps_id);
- virtual FX_BOOL SetDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, const FX_RECT* pSrcRect, int left, int top, int blend_type,
- int alpha_flag, void* pIccTransform);
- virtual FX_BOOL StretchDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, int dest_left, int dest_top,
- int dest_width, int dest_height, const FX_RECT* pClipRect, FX_DWORD flags,
- int alpha_flag, void* pIccTransform, int blend_type);
- virtual FX_BOOL StartDIBits(const CFX_DIBSource* pBitmap, int bitmap_alpha, FX_DWORD color,
- const CFX_AffineMatrix* pMatrix, FX_DWORD render_flags, FX_LPVOID& handle,
- int alpha_flag, void* pIccTransform, int blend_type);
- int m_HorzSize, m_VertSize;
- FX_BOOL m_bSupportROP;
-};
-class CPSOutput : public IFX_PSOutput, public CFX_Object
-{
-public:
- CPSOutput(HDC hDC);
- virtual ~CPSOutput();
- virtual void Release()
- {
- delete this;
- }
- void Init();
- virtual void OutputPS(FX_LPCSTR string, int len);
- HDC m_hDC;
- FX_LPSTR m_pBuf;
-};
-class CPSPrinterDriver : public IFX_RenderDeviceDriver
-{
-public:
- CPSPrinterDriver();
- FX_BOOL Init(HDC hDC, int ps_level, FX_BOOL bCmykOutput);
- ~CPSPrinterDriver();
-protected:
- virtual FX_BOOL IsPSPrintDriver()
- {
- return TRUE;
- }
- virtual int GetDeviceCaps(int caps_id);
- virtual FX_BOOL StartRendering();
- virtual void EndRendering();
- virtual void SaveState();
- virtual void RestoreState(FX_BOOL bKeepSaved = FALSE);
- virtual FX_BOOL SetClip_PathFill(const CFX_PathData* pPathData,
- const CFX_AffineMatrix* pObject2Device,
- int fill_mode
- );
- virtual FX_BOOL SetClip_PathStroke(const CFX_PathData* pPathData,
- const CFX_AffineMatrix* pObject2Device,
- const CFX_GraphStateData* pGraphState
- );
- virtual FX_BOOL DrawPath(const CFX_PathData* pPathData,
- const CFX_AffineMatrix* pObject2Device,
- const CFX_GraphStateData* pGraphState,
- FX_DWORD fill_color,
- FX_DWORD stroke_color,
- int fill_mode,
- int alpha_flag,
- void* pIccTransform,
- int blend_type
- );
- virtual FX_BOOL GetClipBox(FX_RECT* pRect);
- virtual FX_BOOL SetDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, const FX_RECT* pSrcRect, int left, int top, int blend_type,
- int alpha_flag, void* pIccTransform);
- virtual FX_BOOL StretchDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, int dest_left, int dest_top,
- int dest_width, int dest_height, const FX_RECT* pClipRect, FX_DWORD flags,
- int alpha_flag, void* pIccTransform, int blend_type);
- virtual FX_BOOL StartDIBits(const CFX_DIBSource* pBitmap, int bitmap_alpha, FX_DWORD color,
- const CFX_AffineMatrix* pMatrix, FX_DWORD render_flags, FX_LPVOID& handle,
- int alpha_flag, void* pIccTransform, int blend_type);
- virtual FX_BOOL DrawDeviceText(int nChars, const FXTEXT_CHARPOS* pCharPos, CFX_Font* pFont,
- CFX_FontCache* pCache, const CFX_AffineMatrix* pObject2Device, FX_FLOAT font_size, FX_DWORD color,
- int alpha_flag, void* pIccTransform);
- virtual void* GetPlatformSurface()
- {
- return (void*)m_hDC;
- }
- HDC m_hDC;
- FX_BOOL m_bCmykOutput;
- int m_Width, m_Height, m_nBitsPerPixel;
- int m_HorzSize, m_VertSize;
- CPSOutput* m_pPSOutput;
- CFX_PSRenderer m_PSRenderer;
-};
-void _Color2Argb(FX_ARGB& argb, FX_DWORD color, int alpha_flag, void* pIccTransform);
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+struct WINDIB_Open_Args_;
+class CGdiplusExt
+{
+public:
+ CGdiplusExt();
+ ~CGdiplusExt();
+ void Load();
+ FX_BOOL IsAvailable()
+ {
+ return m_hModule != NULL;
+ }
+ FX_BOOL StretchBitMask(HDC hDC, BOOL bMonoDevice, const CFX_DIBitmap* pBitmap, int dest_left, int dest_top,
+ int dest_width, int dest_height, FX_DWORD argb, const FX_RECT* pClipRect, int flags);
+ FX_BOOL StretchDIBits(HDC hDC, const CFX_DIBitmap* pBitmap, int dest_left, int dest_top,
+ int dest_width, int dest_height, const FX_RECT* pClipRect, int flags);
+ FX_BOOL DrawPath(HDC hDC, const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pObject2Device,
+ const CFX_GraphStateData* pGraphState,
+ FX_DWORD fill_argb,
+ FX_DWORD stroke_argb,
+ int fill_mode
+ );
+
+ void* LoadMemFont(FX_BYTE* pData, FX_DWORD size);
+ void DeleteMemFont(void* pFontCollection);
+ FX_BOOL GdipCreateFromImage(void* bitmap, void** graphics);
+ void GdipDeleteGraphics(void* graphics);
+ void GdipSetTextRenderingHint(void* graphics, int mode);
+ void GdipSetPageUnit(void* graphics, FX_DWORD unit);
+ void GdipSetWorldTransform(void* graphics, void* pMatrix);
+ FX_BOOL GdipDrawDriverString(void *graphics, unsigned short *text, int length, void *font, void* brush, void *positions, int flags, const void *matrix);
+ void GdipCreateBrush(FX_DWORD fill_argb, void** pBrush);
+ void GdipDeleteBrush(void* pBrush);
+ void GdipCreateMatrix(FX_FLOAT a, FX_FLOAT b, FX_FLOAT c, FX_FLOAT d, FX_FLOAT e, FX_FLOAT f, void** matrix);
+ void GdipDeleteMatrix(void* matrix);
+ FX_BOOL GdipCreateFontFamilyFromName(FX_LPCWSTR name, void* pFontCollection, void**pFamily);
+ void GdipDeleteFontFamily(void* pFamily);
+ FX_BOOL GdipCreateFontFromFamily(void* pFamily, FX_FLOAT font_size, int fontstyle, int flag, void** pFont);
+ void* GdipCreateFontFromCollection(void* pFontCollection, FX_FLOAT font_size, int fontstyle);
+ void GdipDeleteFont(void* pFont);
+ FX_BOOL GdipCreateBitmap(CFX_DIBitmap* pBitmap, void**bitmap);
+ void GdipDisposeImage(void* bitmap);
+ void GdipGetFontSize(void *pFont, FX_FLOAT *size);
+ void* GdiAddFontMemResourceEx(void *pFontdata, FX_DWORD size, void* pdv, FX_DWORD* num_face);
+ FX_BOOL GdiRemoveFontMemResourceEx(void* handle);
+ void* m_Functions[100];
+ void* m_pGdiAddFontMemResourceEx;
+ void* m_pGdiRemoveFontMemResourseEx;
+ CFX_DIBitmap* LoadDIBitmap(WINDIB_Open_Args_ args);
+protected:
+ HMODULE m_hModule;
+ HMODULE m_GdiModule;
+};
+#include "dwrite_int.h"
+class CWin32Platform : public CFX_Object
+{
+public:
+ FX_BOOL m_bHalfTone;
+ CGdiplusExt m_GdiplusExt;
+ CDWriteExt m_DWriteExt;
+};
+class CGdiDeviceDriver : public IFX_RenderDeviceDriver
+{
+protected:
+ virtual int GetDeviceCaps(int caps_id);
+ virtual void SaveState()
+ {
+ SaveDC(m_hDC);
+ }
+ virtual void RestoreState(FX_BOOL bKeepSaved = FALSE)
+ {
+ RestoreDC(m_hDC, -1);
+ if (bKeepSaved) {
+ SaveDC(m_hDC);
+ }
+ }
+ virtual FX_BOOL SetClip_PathFill(const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pObject2Device,
+ int fill_mode
+ );
+ virtual FX_BOOL SetClip_PathStroke(const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pObject2Device,
+ const CFX_GraphStateData* pGraphState
+ );
+ virtual FX_BOOL DrawPath(const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pObject2Device,
+ const CFX_GraphStateData* pGraphState,
+ FX_DWORD fill_color,
+ FX_DWORD stroke_color,
+ int fill_mode,
+ int alpha_flag,
+ void* pIccTransform,
+ int blend_type
+ );
+ virtual FX_BOOL FillRect(const FX_RECT* pRect,
+ FX_DWORD fill_color,
+ int alpha_flag, void* pIccTransform, int blend_type);
+ virtual FX_BOOL DrawCosmeticLine(FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2, FX_DWORD color,
+ int alpha_flag, void* pIccTransform, int blend_type);
+ virtual FX_LPVOID GetClipRgn() ;
+ virtual FX_BOOL SetClipRgn(FX_LPVOID pRgn) ;
+ virtual FX_BOOL GetClipBox(FX_RECT* pRect);
+ virtual FX_BOOL DeleteDeviceRgn(FX_LPVOID pRgn);
+ virtual void DrawLine(FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2);
+ virtual void* GetPlatformSurface()
+ {
+ return (void*)m_hDC;
+ }
+ FX_BOOL GDI_SetDIBits(const CFX_DIBitmap* pBitmap, const FX_RECT* pSrcRect, int left, int top,
+ void* pIccTransform);
+ FX_BOOL GDI_StretchDIBits(const CFX_DIBitmap* pBitmap, int dest_left, int dest_top,
+ int dest_width, int dest_height, FX_DWORD flags,
+ void* pIccTransform);
+ FX_BOOL GDI_StretchBitMask(const CFX_DIBitmap* pBitmap, int dest_left, int dest_top,
+ int dest_width, int dest_height, FX_DWORD bitmap_color, FX_DWORD flags,
+ int alpha_flag, void* pIccTransform);
+ HDC m_hDC;
+ int m_Width, m_Height, m_nBitsPerPixel;
+ int m_DeviceClass, m_RenderCaps;
+ CGdiDeviceDriver(HDC hDC, int device_class);
+ ~CGdiDeviceDriver() {}
+};
+class CGdiDisplayDriver : public CGdiDeviceDriver
+{
+public:
+ CGdiDisplayDriver(HDC hDC);
+protected:
+ virtual FX_BOOL GetDIBits(CFX_DIBitmap* pBitmap, int left, int top, void* pIccTransform = NULL, FX_BOOL bDEdge = FALSE);
+ virtual FX_BOOL SetDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, const FX_RECT* pSrcRect, int left, int top, int blend_type,
+ int alpha_flag, void* pIccTransform);
+ virtual FX_BOOL StretchDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, int dest_left, int dest_top,
+ int dest_width, int dest_height, const FX_RECT* pClipRect, FX_DWORD flags,
+ int alpha_flag, void* pIccTransform, int blend_type);
+ virtual FX_BOOL StartDIBits(const CFX_DIBSource* pBitmap, int bitmap_alpha, FX_DWORD color,
+ const CFX_AffineMatrix* pMatrix, FX_DWORD render_flags, FX_LPVOID& handle,
+ int alpha_flag, void* pIccTransform, int blend_type)
+ {
+ return FALSE;
+ }
+ FX_BOOL UseFoxitStretchEngine(const CFX_DIBSource* pSource, FX_DWORD color, int dest_left, int dest_top,
+ int dest_width, int dest_height, const FX_RECT* pClipRect, int render_flags,
+ int alpha_flag = 0, void* pIccTransform = NULL, int blend_type = FXDIB_BLEND_NORMAL);
+};
+class CGdiPrinterDriver : public CGdiDeviceDriver
+{
+public:
+ CGdiPrinterDriver(HDC hDC);
+protected:
+ virtual int GetDeviceCaps(int caps_id);
+ virtual FX_BOOL SetDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, const FX_RECT* pSrcRect, int left, int top, int blend_type,
+ int alpha_flag, void* pIccTransform);
+ virtual FX_BOOL StretchDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, int dest_left, int dest_top,
+ int dest_width, int dest_height, const FX_RECT* pClipRect, FX_DWORD flags,
+ int alpha_flag, void* pIccTransform, int blend_type);
+ virtual FX_BOOL StartDIBits(const CFX_DIBSource* pBitmap, int bitmap_alpha, FX_DWORD color,
+ const CFX_AffineMatrix* pMatrix, FX_DWORD render_flags, FX_LPVOID& handle,
+ int alpha_flag, void* pIccTransform, int blend_type);
+ int m_HorzSize, m_VertSize;
+ FX_BOOL m_bSupportROP;
+};
+class CPSOutput : public IFX_PSOutput, public CFX_Object
+{
+public:
+ CPSOutput(HDC hDC);
+ virtual ~CPSOutput();
+ virtual void Release()
+ {
+ delete this;
+ }
+ void Init();
+ virtual void OutputPS(FX_LPCSTR string, int len);
+ HDC m_hDC;
+ FX_LPSTR m_pBuf;
+};
+class CPSPrinterDriver : public IFX_RenderDeviceDriver
+{
+public:
+ CPSPrinterDriver();
+ FX_BOOL Init(HDC hDC, int ps_level, FX_BOOL bCmykOutput);
+ ~CPSPrinterDriver();
+protected:
+ virtual FX_BOOL IsPSPrintDriver()
+ {
+ return TRUE;
+ }
+ virtual int GetDeviceCaps(int caps_id);
+ virtual FX_BOOL StartRendering();
+ virtual void EndRendering();
+ virtual void SaveState();
+ virtual void RestoreState(FX_BOOL bKeepSaved = FALSE);
+ virtual FX_BOOL SetClip_PathFill(const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pObject2Device,
+ int fill_mode
+ );
+ virtual FX_BOOL SetClip_PathStroke(const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pObject2Device,
+ const CFX_GraphStateData* pGraphState
+ );
+ virtual FX_BOOL DrawPath(const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pObject2Device,
+ const CFX_GraphStateData* pGraphState,
+ FX_DWORD fill_color,
+ FX_DWORD stroke_color,
+ int fill_mode,
+ int alpha_flag,
+ void* pIccTransform,
+ int blend_type
+ );
+ virtual FX_BOOL GetClipBox(FX_RECT* pRect);
+ virtual FX_BOOL SetDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, const FX_RECT* pSrcRect, int left, int top, int blend_type,
+ int alpha_flag, void* pIccTransform);
+ virtual FX_BOOL StretchDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, int dest_left, int dest_top,
+ int dest_width, int dest_height, const FX_RECT* pClipRect, FX_DWORD flags,
+ int alpha_flag, void* pIccTransform, int blend_type);
+ virtual FX_BOOL StartDIBits(const CFX_DIBSource* pBitmap, int bitmap_alpha, FX_DWORD color,
+ const CFX_AffineMatrix* pMatrix, FX_DWORD render_flags, FX_LPVOID& handle,
+ int alpha_flag, void* pIccTransform, int blend_type);
+ virtual FX_BOOL DrawDeviceText(int nChars, const FXTEXT_CHARPOS* pCharPos, CFX_Font* pFont,
+ CFX_FontCache* pCache, const CFX_AffineMatrix* pObject2Device, FX_FLOAT font_size, FX_DWORD color,
+ int alpha_flag, void* pIccTransform);
+ virtual void* GetPlatformSurface()
+ {
+ return (void*)m_hDC;
+ }
+ HDC m_hDC;
+ FX_BOOL m_bCmykOutput;
+ int m_Width, m_Height, m_nBitsPerPixel;
+ int m_HorzSize, m_VertSize;
+ CPSOutput* m_pPSOutput;
+ CFX_PSRenderer m_PSRenderer;
+};
+void _Color2Argb(FX_ARGB& argb, FX_DWORD color, int alpha_flag, void* pIccTransform);